pax_global_header00006660000000000000000000000064152567723060014527gustar00rootroot0000000000000052 comment=6c0f308973ffa53c351dc97ecd47a173915d0714 mhcflurry-2.3.6/000077500000000000000000000000001525677230600135525ustar00rootroot00000000000000mhcflurry-2.3.6/.dockerignore000066400000000000000000000005321525677230600162260ustar00rootroot00000000000000.git .agents .codex .aws .ssh .docker .env .env.* .venv venv __pycache__ **/__pycache__ *.pyc *.egg-info .pytest_cache .ruff_cache build dist docs/_build output tmp jobs out results experiments brev_runs notebooks/2023-retraining *.zip *.swp 2026-*-where-codex-left-off.txt mhc_ligand_full* training/class1_allele_specific/data/mhc_ligand_full.* mhcflurry-2.3.6/.github/000077500000000000000000000000001525677230600151125ustar00rootroot00000000000000mhcflurry-2.3.6/.github/workflows/000077500000000000000000000000001525677230600171475ustar00rootroot00000000000000mhcflurry-2.3.6/.github/workflows/build.yml000066400000000000000000000012701525677230600207710ustar00rootroot00000000000000name: build on: workflow_dispatch: {} workflow_call: {} jobs: build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v7 - name: Set up Python uses: actions/setup-python@v7 with: python-version: 3.11 cache: pip cache-dependency-path: setup.py - name: Install dependencies run: | python -m pip install --upgrade pip pip install build - name: Build package run: | python -m build -sw ls -lh dist/ - name: Upload artifact uses: actions/upload-artifact@v7 with: name: dist path: dist/ mhcflurry-2.3.6/.github/workflows/ci.yml000066400000000000000000000060441525677230600202710ustar00rootroot00000000000000name: CI on: push: branches: ["master"] pull_request: branches: ["master", "release-2.3.0-final-weights"] jobs: build: runs-on: ubuntu-latest env: # Regression fixtures intentionally use the historical public weights. MHCFLURRY_DOWNLOADS_CURRENT_RELEASE: "2.2.0" MHCFLURRY_DATA_DIR: ${{ github.workspace }}/.mhcflurry-data defaults: run: shell: bash -el {0} strategy: fail-fast: false matrix: python-version: ["3.10", "3.11", "3.12"] steps: - name: Checkout code uses: actions/checkout@v7 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v7 with: python-version: ${{ matrix.python-version }} cache: pip cache-dependency-path: | requirements.txt docs/requirements.txt setup.py - name: Install system dependencies run: | sudo apt-get update sudo apt-get install -y pandoc - name: Cache Conda packages uses: actions/cache@v6 env: CACHE_NUMBER: 0 with: path: ~/conda_pkgs_dir key: conda-${{ runner.os }}-${{ matrix.python-version }}-${{ env.CACHE_NUMBER }}-${{ hashFiles('test-environment.yml') }} restore-keys: | conda-${{ runner.os }}-${{ matrix.python-version }}-${{ env.CACHE_NUMBER }}- - name: Build Conda environment uses: conda-incubator/setup-miniconda@v4 with: activate-environment: test-environment environment-file: test-environment.yml python-version: ${{ matrix.python-version }} auto-activate: false use-only-tar-bz2: true - name: Lint shell scripts run: | # Catch syntax regressions in the training-pipeline shell # wrappers cheaply. ``bash -n`` parses without executing. set -e mapfile -t shell_scripts < <(find scripts -type f -name "*.sh") for script in "${shell_scripts[@]}"; do echo "bash -n $script" bash -n "$script" done - name: Install python dependencies run: | pip install --upgrade pip pip install pytest pytest-cov ruff==0.16.0 pip install -r requirements.txt pip install -r docs/requirements.txt pip install . - name: Lint Python run: ./lint.sh - name: Cache MHCflurry downloads uses: actions/cache@v6 with: path: .mhcflurry-data key: mhcflurry-data-${{ runner.os }}-${{ hashFiles('mhcflurry/downloads.yml') }} restore-keys: | mhcflurry-data-${{ runner.os }}- - name: Download data and models run: | mhcflurry-downloads fetch data_curated data_mass_spec_annotated models_class1 models_class1_presentation models_class1_processing models_class1_pan allele_sequences - name: Test with pytest run: | python -m pytest --tb=long --cov=mhcflurry/ --cov-report=term-missing ./test mhcflurry-2.3.6/.github/workflows/docker.yml000066400000000000000000000100451525677230600211410ustar00rootroot00000000000000name: Docker on: pull_request: release: types: [published] workflow_dispatch: inputs: tag: description: Published stable release tag to build required: true type: string permissions: contents: read concurrency: group: docker-${{ github.event.release.tag_name || inputs.tag || github.ref }} cancel-in-progress: false jobs: build: if: github.event_name != 'release' || !github.event.release.prerelease strategy: fail-fast: false matrix: include: - runner: ubuntu-24.04 arch: amd64 - runner: ubuntu-24.04-arm arch: arm64 runs-on: ${{ matrix.runner }} outputs: version: ${{ steps.version.outputs.version }} steps: - uses: actions/checkout@v6 with: ref: ${{ github.event.release.tag_name || inputs.tag || github.ref }} - name: Check release identity id: version env: RELEASE_TAG: ${{ github.event.release.tag_name || inputs.tag }} GH_TOKEN: ${{ github.token }} run: | VERSION=$(python -c 'exec(open("mhcflurry/version.py").read()); print(__version__)') if [ -n "$RELEASE_TAG" ]; then python -c 'import re,sys; assert re.fullmatch(r"[0-9]+\.[0-9]+\.[0-9]+", sys.argv[1])' "$VERSION" test "$VERSION" = "$RELEASE_TAG" gh release view "$RELEASE_TAG" --json isDraft,isPrerelease --jq 'select(.isDraft == false and .isPrerelease == false)' | python -c 'import json,sys; assert json.load(sys.stdin)' fi echo "version=$VERSION" >> "$GITHUB_OUTPUT" echo "revision=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" - uses: docker/setup-buildx-action@v4 - name: Build image uses: docker/build-push-action@v7 with: context: . load: true tags: mhcflurry-test:local cache-from: type=gha,scope=docker-${{ matrix.arch }} cache-to: type=gha,mode=max,scope=docker-${{ matrix.arch }} labels: | org.opencontainers.image.version=${{ steps.version.outputs.version }} org.opencontainers.image.revision=${{ steps.version.outputs.revision }} - name: Test CLI and bundled weights offline env: VERSION: ${{ steps.version.outputs.version }} run: | docker run --rm --network none mhcflurry-test:local mhcflurry --version docker run --rm --network none mhcflurry-test:local mhcflurry downloads info docker run --rm --network none mhcflurry-test:local python /opt/mhcflurry/docker/smoke.py "$VERSION" - name: Log in to Docker Hub if: github.event_name != 'pull_request' uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Publish tested architecture if: github.event_name != 'pull_request' env: VERSION: ${{ steps.version.outputs.version }} ARCH: ${{ matrix.arch }} run: | IMAGE="openvax/mhcflurry:$VERSION-$ARCH" docker tag mhcflurry-test:local "$IMAGE" docker push "$IMAGE" publish: if: github.event_name != 'pull_request' needs: build runs-on: ubuntu-24.04 steps: - uses: docker/setup-buildx-action@v4 - uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Publish multi-platform tags env: VERSION: ${{ needs.build.outputs.version }} GH_TOKEN: ${{ github.token }} GH_REPO: ${{ github.repository }} run: | IMAGE="openvax/mhcflurry:$VERSION" docker buildx imagetools create -t "$IMAGE" "$IMAGE-amd64" "$IMAGE-arm64" LATEST=$(gh api "repos/$GH_REPO/releases/latest" --jq .tag_name) if [ "$VERSION" = "$LATEST" ]; then docker buildx imagetools create -t openvax/mhcflurry:latest "$IMAGE" fi docker buildx imagetools inspect "$IMAGE" mhcflurry-2.3.6/.github/workflows/docs.yml000066400000000000000000000057061525677230600206320ustar00rootroot00000000000000name: Documentation on: push: branches: ["master"] pull_request: branches: ["master", "release-2.3.0-final-weights"] workflow_dispatch: concurrency: group: documentation-pages-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true jobs: build: runs-on: ubuntu-latest permissions: contents: read env: # PRs must build before their new model assets are public. Published docs # use the package's current release; historical fixtures exercise PR examples. MHCFLURRY_DOWNLOADS_CURRENT_RELEASE: ${{ github.event_name == 'pull_request' && '2.2.0' || '' }} MHCFLURRY_DATA_DIR: ${{ github.workspace }}/.mhcflurry-data steps: - name: Checkout code uses: actions/checkout@v7 - name: Set up Python uses: actions/setup-python@v7 with: python-version: "3.11" cache: pip cache-dependency-path: | docs/requirements.txt setup.py - name: Install system dependencies run: | sudo apt-get update sudo apt-get install -y pandoc - name: Install package and documentation dependencies run: | python -m pip install --upgrade pip python -m pip install -e . python -m pip install -r docs/requirements.txt - name: Cache presentation models uses: actions/cache@v6 with: path: .mhcflurry-data key: mhcflurry-docs-data-${{ runner.os }}-${{ hashFiles('mhcflurry/downloads.yml') }} restore-keys: | mhcflurry-docs-data-${{ runner.os }}- - name: Download presentation models run: mhcflurry downloads fetch models_class1_presentation - name: Build documentation run: | make -C docs generate make -C docs html SPHINXOPTS=-W make -C docs doctest SPHINXOPTS=-W - name: Save rendered documentation uses: actions/upload-artifact@v7 with: name: documentation-html path: docs/_build/html publish: if: github.event_name != 'pull_request' && github.ref == 'refs/heads/master' needs: build runs-on: ubuntu-latest permissions: contents: write steps: - name: Checkout archived documentation uses: actions/checkout@v7 with: ref: gh-pages path: archived-docs sparse-checkout: previous-versions - name: Download rendered documentation uses: actions/download-artifact@v8 with: name: documentation-html path: documentation-html - name: Preserve archived documentation run: cp -R archived-docs/previous-versions documentation-html/ - name: Publish GitHub Pages branch uses: peaceiris/actions-gh-pages@84c30a85c19949d7eee79c4ff27748b70285e453 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: documentation-html force_orphan: true mhcflurry-2.3.6/.github/workflows/release.yml000066400000000000000000000011771525677230600213200ustar00rootroot00000000000000# Based on https://docs.pypi.org/trusted-publishers/using-a-publisher/ name: release on: release: types: [published] jobs: build: uses: ./.github/workflows/build.yml pypi-publish: name: upload release to PyPI needs: build runs-on: ubuntu-latest environment: release permissions: id-token: write # IMPORTANT: mandatory for trusted publishing steps: - name: Download build artifacts uses: actions/download-artifact@v8 with: name: dist path: dist - name: Publish package distributions to PyPI uses: pypa/gh-action-pypi-publish@release/v1 mhcflurry-2.3.6/.github/workflows/release_testpypi.yml000066400000000000000000000013231525677230600232520ustar00rootroot00000000000000# Based on https://docs.pypi.org/trusted-publishers/using-a-publisher/ name: release_testpypi on: workflow_dispatch: {} jobs: build: uses: ./.github/workflows/build.yml publish-to-testpypi: name: upload release to TestPyPI needs: build runs-on: ubuntu-latest environment: release_testpypi permissions: id-token: write # IMPORTANT: mandatory for trusted publishing steps: - name: Download build artifacts uses: actions/download-artifact@v8 with: name: dist path: dist - name: Publish distribution to TestPyPI uses: pypa/gh-action-pypi-publish@release/v1 with: repository-url: https://test.pypi.org/legacy/ mhcflurry-2.3.6/.gitignore000066400000000000000000000020421525677230600155400ustar00rootroot00000000000000# Swap files *.swp # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] # C extensions *.so # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # IDE .idea/ # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *,cover # Translations *.mo *.pot # Django stuff: *.log # Sphinx documentation docs/_build/ docs/_static docs/_templates # PyBuilder target/ # Data files *.zip # Dask distributed clutter .dask-web-ui.json # ipython checkpoints .ipynb_checkpoints # OS X extra files .DS_Store .venv/ # Runner outputs artifacts/ jobs/ out/ brev_runs/ results/ sweep_results/ experiments/* !experiments/README.md # Claude Code local state .claude/ mhcflurry-2.3.6/.ruff.toml000066400000000000000000000005571525677230600154760ustar00rootroot00000000000000target-version = "py310" [lint] # Keep the release gate focused on correctness. Formatting and modernization # rules are intentionally not enabled: applying them to this legacy scientific # codebase would produce a large, prediction-risking mechanical rewrite. select = [ "E4", "E7", "E9", "F", "B006", "B023", "PLW1508", "RUF100", ] mhcflurry-2.3.6/AGENTS.md000066400000000000000000000102061525677230600150540ustar00rootroot00000000000000# AGENTS.md — mhcflurry Guide for coding agents working in this repo. Read this before touching code. --- ## Golden Rules 1. **Never commit to `master` or `main`.** Always `git checkout -b ` before editing. Land via PR. 2. **Every PR bumps the version.** Even doc-only PRs — at minimum a patch bump in the package's `__init__.py` / `_version.py`. 3. **For an authorized release, "done" means merged AND released.** Follow the package release procedure in `CONTRIBUTING.md` and the model release procedure in `scripts/release/README.md`. Publishing a GitHub release triggers PyPI; pushing a tag alone does not. A review or release-preparation request does not authorize publication. 4. **File problems as issues, don't silently work around them.** If you hit a bug here or in a sibling openvax/pirl-unc repo, open a GitHub issue on the correct repo and link it from the PR. 5. **After a PR ships, look for the next block of work.** Read open issues across the relevant openvax repos, group by dependency + urgency. Prefer *foundational* changes that unblock multiple downstream improvements; otherwise chain the smallest independent improvements. --- ## Repo Shape (read before scripting) Unlike its siblings, mhcflurry does **not** have `test.sh`, `deploy.sh`, or `format.sh`. It has: - `develop.sh` — **source** this (`source develop.sh`) to create/activate `.venv` and editable-install. Do not `./develop.sh` (its venv activation won't persist). - `lint.sh` — `ruff check mhcflurry/ test/` (note: tests live in `test/`, singular). - `setup.py` — packaging. - No `pyproject.toml`. If you want to add `test.sh` / `deploy.sh` / `format.sh` to match the other openvax repos, that's a welcome foundational PR — discuss with Alex first. ## Before Completing Any Task Before telling the user a change is "complete": 1. **`./lint.sh`** — must pass (ruff check) 2. **Run tests**: `python -m pytest test/` (no `test.sh` wrapper). On macOS this matters: the generated `pytest` console script can hide PyTorch MPS accelerators. For the slow ML suite you may need downloaded models — see `docker/` or `test-environment.yml`. 3. For a PR: **CI must be green on GitHub**, then merge, then release (see Golden Rule 3). ## Code Style - Python 3.10+ - Lint: ruff (concise output) - Docstrings: numpy style - Bugfixes include a regression test where feasible - mhcflurry is a trained ML model system — be extremely cautious about changes that could alter predictions without a clear reason. Prediction-affecting changes need empirical validation, not just green tests. --- ## Workflow Orchestration ### 1. Upfront Planning - For any non-trivial task (3+ steps or architectural): write a short spec first. If something goes sideways, STOP and re-plan — don't keep pushing. ### 2. Verification Before Done - Never claim complete without proof: tests green, CI green, release tagged. - For model or training changes: include before/after metrics on a held-out set. ### 3. Autonomous Bug Fixing - Given a bug report: just fix it. Point at logs/errors/failing tests and resolve them without hand-holding. ### 4. Demand Elegance (Balanced) - For non-trivial changes pause and ask "is there a more elegant way?" — skip for trivial fixes. - Treat workarounds as bugs, not new abstractions. Rip out legacy paths decisively rather than accumulating special cases. ### 5. Issue Triage After Each Ship - Close superseded/outdated issues as you notice them. - New problems mid-task → file as issues (on the right repo, even if it's not this one), don't bury. --- ## Core Principles - **Simplicity first.** Minimal diffs, minimal abstractions. - **No laziness.** Find root causes; no temporary fixes, no empty-category fudges. - **Minimal blast radius.** Touch only what the task requires. ## Scientific Domain Knowledge - If a change touches immunology/genomics semantics, check primary sources (papers, UniProt, GenBank) before edits. - If the code expresses a scientific model at odds with your understanding, flag it — don't silently "fix" it into something wrong. - Use `mhcgnomes` for MHC allele parsing. Never `startswith("HLA-")` or other string hacks — alleles aren't always human. mhcflurry-2.3.6/CONTRIBUTING.md000066400000000000000000000124521525677230600160070ustar00rootroot00000000000000# Contributing to MHCflurry We would love your help in making MHCflurry a useful resource for the community. No contribution is too small, and we especially appreciate usability improvements like better documentation, tutorials, tests, or code cleanup. ## Project scope We hope MHCflurry will grow to include **reference implementations for state-of-the-art approaches for T cell epitope prediction**. This includes pan-allele MHC I and II prediction and closely related tasks such as prediction of antigen processing and immunogenicity. It does not include tasks such as B cell (antibody) epitope prediction, prediction of TCR/pMHC interactions, or downstream tasks such as cancer vaccine design. All committed code to MHCflurry should be suitable for regular research use by practitioners. This likely means that new models will require a benchmark evaluation with a publication or preprint before they can be accepted. If you are contemplating a large contribution, such as the addition of a new predictive model, it probably makes sense to reach out on the GitHub issue tracker (or email us at hello@openvax.org) to discuss and coordinate the work. ## Making a contribution All contributions can be made as pull requests on GitHub. One of the core developers will review your contribution. As needed the core contributors will also make releases and submit to PyPI. A few other guidelines: * Generated resources must include their generation commands, input/source hashes, configuration, random seed and dependency versions. Historical generators live in `downloads-generation/`; the maintained training and release workflows are documented in [scripts/training/README.md](scripts/training/README.md) and [scripts/release/README.md](scripts/release/README.md). Record provenance sufficient to rerun the workflow; exact numerical reproduction across hardware or library versions is not guaranteed. * MHCflurry supports Python 3.10+ on Linux and macOS. We can't guarantee support for Windows. If you are having trouble running MHCflurry on Windows we would appreciate contributions that help us address this. * All functions should be documented using [numpy-style docstrings](https://numpydoc.readthedocs.io/en/latest/format.html) and associated with unit tests. * Bugfixes should be accompanied by a test that illustrates the bug when feasible. * Contributions are licensed under Apache 2.0 * Please adhere to our [code of conduct](https://github.com/openvax/mhcflurry/blob/master/code-of-conduct.md). Working on your first Pull Request? One resource that may be helpful is [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github). ## Development checks Run the same checks as CI before opening a pull request: ```shell ./lint.sh python -m pytest test/ ``` CI uses Ruff 0.16.0 and the checked-in `.ruff.toml`. The selected rules focus on syntax, undefined names, mutable defaults, unsafe loop closures, environment default types, and stale suppressions. Formatting and broad modernization are kept out of the release gate so they can be reviewed separately from scientific or prediction-affecting changes. ## Publish a package release 1. Update `mhcflurry/version.py` and the matching `RELEASE_NOTES_.md`. Verify the version against PyPI, including development builds. Model training versions are provenance and must not be rewritten to match a tag. 2. Run lint, the complete tests, documentation HTML/doctests and a wheel/source distribution build. Merge the reviewed PR after GitHub CI passes. 3. Create the release tag on that tested commit and publish a GitHub release with the corresponding release notes. `.github/workflows/release.yml` builds and uploads to PyPI when the release is **published**; pushing a tag alone does not publish a package. 4. Verify the PyPI version and install the wheel in a clean environment. 5. Verify the Docker workflow publishes `openvax/mhcflurry:` for `linux/amd64` and `linux/arm64`, then updates `latest` when this is the most recent stable GitHub release. The workflow requires repository secrets `DOCKERHUB_USERNAME` and `DOCKERHUB_TOKEN` with push access. Each image must pass the offline prediction check in `docker/smoke.py` before publication. If publication fails, fix the cause and rerun the Docker workflow with the already-published stable release tag; do not create a new code version. 6. Submit the version and source-distribution checksum to the [Bioconda recipe](https://github.com/bioconda/bioconda-recipes/tree/master/recipes/mhcflurry). Keep dependencies and console entry points aligned with `setup.py`. Every dependency must be available as a Conda package; add missing dependencies to conda-forge or Bioconda before the MHCflurry recipe can build. Bioconda is maintained upstream and does not publish when our GitHub release does. Verify the package in the channel after upstream CI and review complete. Model assets are separate. Follow `scripts/release/README.md` to validate, package, checksum and upload them, then update `mhcflurry/downloads.yml` with the actual URLs. Validate the downloaded archives and prediction outputs before changing the default model release. Publication requires maintainer or user authorization; a review request alone does not authorize a release. mhcflurry-2.3.6/Dockerfile000066400000000000000000000021001525677230600155350ustar00rootroot00000000000000FROM python:3.11-slim LABEL org.opencontainers.image.source="https://github.com/openvax/mhcflurry" LABEL org.opencontainers.image.description="MHCflurry prediction CLI and notebooks with pretrained presentation weights" ENV MHCFLURRY_DATA_DIR=/opt/mhcflurry-data \ PYTHONUNBUFFERED=1 \ PIP_NO_CACHE_DIR=1 # The public notebook/prediction image uses CPU PyTorch on Intel and ARM. # CUDA training has its own image in docker/Dockerfile.train. RUN pip install --index-url https://download.pytorch.org/whl/cpu 'torch>=2.0.0' COPY requirements.txt /tmp/mhcflurry-requirements.txt RUN pip install -r /tmp/mhcflurry-requirements.txt jupyter seaborn COPY . /opt/mhcflurry RUN pip install /opt/mhcflurry && \ mhcflurry downloads fetch models_class1_presentation && \ pip check && \ useradd --create-home --uid 1000 mhcflurry && \ mkdir /work && cp /opt/mhcflurry/notebooks/*.ipynb /work/ && \ chown -R mhcflurry:mhcflurry /work /opt/mhcflurry-data USER mhcflurry WORKDIR /work EXPOSE 9999 CMD ["jupyter", "notebook", "--port=9999", "--no-browser", "--ip=0.0.0.0"] mhcflurry-2.3.6/LICENSE000066400000000000000000000261361525677230600145670ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. mhcflurry-2.3.6/README.md000066400000000000000000000115311525677230600150320ustar00rootroot00000000000000[![Build Status](https://github.com/openvax/mhcflurry/actions/workflows/ci.yml/badge.svg)](https://github.com/openvax/mhcflurry/actions/workflows/ci.yml) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/openvax/mhcflurry/blob/master/notebooks/mhcflurry-colab.ipynb) # MHCflurry MHCflurry predicts which peptides are likely to be displayed by MHC class I molecules. It provides pretrained models for three related tasks: - **Binding affinity:** how strongly a peptide binds an MHC allele. - **Antigen processing:** whether cellular processing favors the peptide. - **Presentation:** a combined score using binding and processing predictions. You can use the released models from the command line or Python, scan proteins for candidate epitopes, or train models on your own data. ## Quick start Install MHCflurry 2.3 and download the pretrained presentation models: ```shell pip install --upgrade "mhcflurry>=2.3,<2.4" mhcflurry downloads fetch models_class1_presentation ``` The presentation bundle includes affinity and processing components. Browse current and historical weights with `mhcflurry downloads info`; select a weight release for prediction with `--model-release`. Predict a few peptides: ```shell mhcflurry predict \ --alleles HLA-A0201 HLA-A0301 \ --peptides SIINFEKL SIINFEKD SIINFEKQ \ --out predictions.csv ``` Or scan a protein sequence for candidate ligands: ```shell mhcflurry predict-scan \ --sequences MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFRSSVLHS \ --alleles 'HLA-A*02:01' \ --out scan.csv ``` To try MHCflurry without installing anything, open the [Colab notebook](https://colab.research.google.com/github/openvax/mhcflurry/blob/master/notebooks/mhcflurry-colab.ipynb). The historical `mhcflurry-*` command names remain supported for existing scripts. See the [2.3.0 release notes](RELEASE_NOTES_2.3.0.md) for details. ## Documentation - [Introduction and installation](https://openvax.github.io/mhcflurry/intro.html) - [Command-line tutorial](https://openvax.github.io/mhcflurry/commandline_tutorial.html) - [Python tutorial](https://openvax.github.io/mhcflurry/python_tutorial.html) - [Training models](https://openvax.github.io/mhcflurry/training.html) - [Command reference](https://openvax.github.io/mhcflurry/commandline_tools.html) - [API reference](https://openvax.github.io/mhcflurry/api.html) Please [file an issue](https://github.com/openvax/mhcflurry/issues) if you have questions or encounter problems. ## Citing MHCflurry If you use MHCflurry in your research, please cite: > T. O'Donnell, A. Rubinsteyn, U. Laserson. "MHCflurry 2.0: Improved > pan-allele prediction of MHC I-presented peptides by incorporating antigen > processing," *Cell Systems*, 2020. > > T. O'Donnell, A. Rubinsteyn, M. Bonsack, A. B. Riemer, U. Laserson, and > J. Hammerbacher, "MHCflurry: Open-Source Class I MHC Binding Affinity > Prediction," *Cell Systems*, 2018. > ## Development Contributions are welcome. Start with [CONTRIBUTING.md](CONTRIBUTING.md); the [testing guide](https://openvax.github.io/mhcflurry/testing.html) describes the fast local checks and full suite. ## Docker Docker images built from version 2.3.6 onward include the full presentation weights, the command-line tools and Jupyter notebooks. They run predictions on the CPU and support Intel/AMD and ARM Linux. Check the published image's version with: ```shell docker pull openvax/mhcflurry:latest docker run --rm openvax/mhcflurry:latest mhcflurry --version ``` Stable releases publish a matching version tag and update `latest` after both architecture builds pass an offline prediction check. Publication status is visible in the [Docker workflow](https://github.com/openvax/mhcflurry/actions/workflows/docker.yml); an incomplete publication can leave `latest` on the previous version. Run predictions against files in the current directory: ```shell docker run --rm -v "$PWD:/work" openvax/mhcflurry:latest \ mhcflurry predict input.csv --out predictions.csv ``` To start Jupyter, run the image without a command: ```shell docker run --rm -p 127.0.0.1:9999:9999 -v "$PWD:/work" openvax/mhcflurry:latest ``` Open the localhost URL printed in the logs, including its access token. Without the volume mount, the image starts in a directory containing the example notebooks. Mounted directories must be writable by the container's user (UID 1000). To build from a checkout, use `docker build -t mhcflurry:local .`. For CUDA training, a separate image can be built with `docker build -f docker/Dockerfile.train -t mhcflurry:train .`. ## More resources - [Predicted binding motifs](https://openvax.github.io/mhcflurry-motifs/) - [Manual download instructions](https://openvax.github.io/mhcflurry/commandline_tutorial.html#downloading-models) mhcflurry-2.3.6/RELEASE_NOTES_2.3.0.md000066400000000000000000000064031525677230600166470ustar00rootroot00000000000000# MHCflurry 2.3.0 MHCflurry 2.3.0 provides updated presentation models, reproducible training and model comparison workflows, and shared percentile calibration across the PyTorch predictors. Python 3.10 or newer is required. ## Install and upgrade ```shell pip install --upgrade "mhcflurry==2.3.0" mhcflurry downloads fetch models_class1_presentation ``` Pinning the version also handles installations that used a higher-numbered development build. Existing 2.2.x model directories remain loadable. Software and model downloads have separate provenance; a software upgrade alone does not replace a user-specified model directory. ## Models and evaluation The new full presentation model uses the 2023 training-data snapshot and the recorded `final-2.3.0-candidate-v2` recipe. Its with-flank processing component is an equal mixture of short-flank and cleavage-boundary networks. The separate long-flank processing ensemble is not the presentation component. Evaluate complete presentation predictions separately from affinity and processing diagnostics. Full-model improvements do not imply improvements in every component. Comparisons must use identical positive/negative rows and shared overlap exclusions; external-predictor training overlap may remain unknown. The release assets include the model comparison and provenance. See the [full presentation evaluation](docs/release_model_evaluation.md) for metrics, paired intervals and component tradeoffs. ## Prediction and calibration - Prediction progress is written to stderr so redirected stdout contains valid CSV. - The `mhcflurry` command groups prediction, download, training and evaluation commands. Existing standalone `mhcflurry-*` entry points remain supported. - CPU, CUDA and Apple Silicon execution use PyTorch. Automatic worker and prediction-batch planning respects caller overrides and device capacity. - Affinity, processing and presentation share percentile-calibration methods. New compact mappings use independent background data; existing histogram calibrations retain their original semantics when loaded. - Model manifests, allele pseudosequences, saved calibration and prediction weights travel together. Calibration changes do not alter raw predictions. ## Training and reproducibility - Streaming pretraining validation now reverses concentration inequalities when converting to the decreasing regression-target scale. This fixes future validation/retry decisions; it does not modify the selected released weights. - Release workflows record source, data, configuration and artifact checksums; validate holdout exclusions; and preserve resumable training stages. - Processing preparation uses matched negatives with unique assignments, bounded pool expansion and deterministic replay. - Affinity and processing training can retain checkpoint alternatives for development. Inference downloads contain the selected model, while the training archive preserves alternative states and selection evidence. - Evaluation supports saved predictions, paired uncertainty estimates and external NetMHCpan/MixMHCpred scores on explicitly shared rows. See the [training recipe](docs/release_training_recipe.md), [evaluation guide](docs/evaluation.md), and [release workflow](scripts/release/README.md) for the supported commands. mhcflurry-2.3.6/RELEASE_NOTES_2.3.1.md000066400000000000000000000010301525677230600166370ustar00rootroot00000000000000# MHCflurry 2.3.1 Prediction help is easier to scan: short usage lines, concise examples, input-first option groups, bounded text width and whitespace between options. The top-level and prediction help screens use subtle colors in terminals; redirected help stays plain text, and `NO_COLOR=1` disables color. The command reference now explains how to inspect downloaded models and compare weight bundles on the same input rows. Command names, flags and prediction behavior are unchanged. This package uses the released 2.3.0 weights. mhcflurry-2.3.6/RELEASE_NOTES_2.3.2.md000066400000000000000000000026131525677230600166500ustar00rootroot00000000000000# MHCflurry 2.3.2 Browse model and data releases and select historical weights directly from the CLI. Help, version, and download-discovery commands no longer import the numerical model stack before displaying their output. - Add `mhcflurry downloads releases`, `downloads list`, and detailed `downloads info DOWNLOAD`, with descriptions, shared archive mappings, installed/source status, and JSON output. - Support `--release` consistently for catalogue inspection and downloading. Add `--model-release` to `predict` and `predict-scan`, mutually exclusive with `--models`. Show resolved paths before optional environment overrides. - Document MHC allele inputs and N/C flanks first, followed by no-flank comparisons. Embed stable-comparison figures, include NetMHCpan 4.0/4.1/4.2 BA and EL, and move detailed paired-bootstrap tables into a separate report. - Make the comparison PDF the primary download and improve navigation to model selection and compact percentile calibration. The default weights remain **2.3.0**. This release does not change trained weights, numerical prediction methods, or evaluation rows and scores. [View all comparison figures (PDF)](https://github.com/openvax/mhcflurry/releases/download/2.3.0/mhcflurry-2.3.0-model-comparison-v3.pdf). [Tables and source data (.tar.gz)](https://github.com/openvax/mhcflurry/releases/download/2.3.0/model-comparison.20260928-v3.tar.gz). mhcflurry-2.3.6/RELEASE_NOTES_2.3.3.md000066400000000000000000000007341525677230600166530ustar00rootroot00000000000000# MHCflurry 2.3.3 Installation guidance now consistently refers to **MHCflurry 2.3** and uses `mhcflurry>=2.3,<2.4` to install stable patch releases. This fixes contradictory version labels in the README and Colab setup and keeps future patch updates from making the installation instructions stale. Exact weight-release and evaluation identifiers remain unchanged. The default weights are **2.3.0**; this documentation correction does not change prediction code or models. mhcflurry-2.3.6/RELEASE_NOTES_2.3.4.md000066400000000000000000000011441525677230600166500ustar00rootroot00000000000000# MHCflurry 2.3.4 Download discovery uses compact tables again. Affinity, processing and presentation appear first, with latest weights, other available versions and installed catalogue directories. Historical models and supporting data follow. Headings and status columns use restrained terminal color, respecting `NO_COLOR`, `TERM=dumb` and redirected output. Detailed descriptions remain in `downloads info NAME`; `downloads --verbose info` shows all model paths and environment overrides. Machine-readable JSON is unchanged. The default weights remain **2.3.0**. Prediction code and models are unchanged. mhcflurry-2.3.6/RELEASE_NOTES_2.3.5.md000066400000000000000000000007511525677230600166540ustar00rootroot00000000000000# MHCflurry 2.3.5 Comparison figures identify the released predictor consistently as **MHCflurry 2.3.0**, without an isolated training-year suffix. Training-year labels remain in the separate 2020/2023 prerelease component comparison. Evaluation rows, scores, intervals and model weights are unchanged. [View the comparison figures (PDF)](https://github.com/openvax/mhcflurry/releases/download/2.3.0/mhcflurry-2.3.0-model-comparison-v4.pdf). The default model weights remain **2.3.0**. mhcflurry-2.3.6/RELEASE_NOTES_2.3.6.md000066400000000000000000000021221525677230600166470ustar00rootroot00000000000000# MHCflurry 2.3.6 This release clarifies model selection and aligns documentation, examples and API docstrings with current behavior. Model weights and prediction calculations are unchanged; the default weights remain 2.3.0. - Put the recommended presentation bundle first in `mhcflurry downloads info`. It includes both affinity and processing components. - Correct scan thresholds, model-path precedence, parallelism defaults, calibration options, return shapes and reproducibility descriptions. - Refresh the tutorials and notebooks with N/C flanks and a comparison using the same peptides without flanks. Remove obsolete training instructions and development-specific prose while retaining historical provenance. - Add Docker builds for Intel/AMD and ARM Linux, with bundled presentation weights and offline prediction checks. Successful stable-release builds publish matching Docker Hub tags and update `latest`. The CPU image runs as a non-root user; Jupyter uses its default access-token authentication. - Document Docker publication checks and the separate Bioconda update process. mhcflurry-2.3.6/code-of-conduct.md000066400000000000000000000064501525677230600170520ustar00rootroot00000000000000# Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the project or its community in public spaces. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at hello@openvax.org. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see https://www.contributor-covenant.org/faq mhcflurry-2.3.6/develop.sh000077500000000000000000000013041525677230600155450ustar00rootroot00000000000000#!/bin/bash # Development environment setup script # Source this script to activate the venv: source develop.sh SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" VENV_DIR="$SCRIPT_DIR/.venv" # Check if already in the venv if [[ "$VIRTUAL_ENV" == "$VENV_DIR" ]]; then echo "Virtual environment already active." else if [[ -d "$VENV_DIR" ]]; then source "$VENV_DIR/bin/activate" echo "Activated virtual environment: $VENV_DIR" else echo "Virtual environment not found. Creating and installing..." python -m venv "$VENV_DIR" source "$VENV_DIR/bin/activate" pip install -e . echo "Activated virtual environment: $VENV_DIR" fi fi mhcflurry-2.3.6/docker/000077500000000000000000000000001525677230600150215ustar00rootroot00000000000000mhcflurry-2.3.6/docker/.dockerignore000066400000000000000000000001471525677230600174770ustar00rootroot00000000000000.git .venv .pytest_cache __pycache__ *.egg-info build dist docs/_build downloads-generation/*/.ignored mhcflurry-2.3.6/docker/Dockerfile.train000066400000000000000000000012111525677230600201220ustar00rootroot00000000000000FROM pytorch/pytorch:2.4.0-cuda12.1-cudnn9-runtime LABEL org.opencontainers.image.title="mhcflurry-train" LABEL org.opencontainers.image.source="https://github.com/openvax/mhcflurry" ENV PYTHONUNBUFFERED=1 \ PIP_NO_CACHE_DIR=1 \ MHCFLURRY_OUT=/out RUN apt-get update -y \ && apt-get install -y --no-install-recommends \ build-essential git wget ca-certificates bzip2 rsync \ && apt-get clean && rm -rf /var/lib/apt/lists/* WORKDIR /workspace COPY requirements.txt /tmp/requirements.txt RUN pip install --upgrade pip \ && pip install -r /tmp/requirements.txt COPY . /workspace RUN pip install -e /workspace RUN mkdir -p /out mhcflurry-2.3.6/docker/smoke.py000066400000000000000000000025671525677230600165230ustar00rootroot00000000000000"""Verify a built distribution image with network access disabled.""" import sys from pathlib import Path from tempfile import TemporaryDirectory import numpy from mhcflurry import Class1AffinityPredictor, Class1PresentationPredictor from mhcflurry import __version__ from mhcflurry.downloads import get_downloads_dir assert __version__ == sys.argv[1], (__version__, sys.argv[1]) # The default user must be able to refresh current weights and add older releases. cache = Path(get_downloads_dir()) for directory in (cache, cache.parent): with TemporaryDirectory(prefix=".smoke-", dir=directory) as scratch: Path(scratch, "writable").write_text("ok") predictor = Class1PresentationPredictor.load() peptides = ["TPVCPNGPG", "RLLEGMEMI"] alleles = ["HLA-A*02:01"] for flanks in ({"n_flanks": ["MSSSS", "MVENK"], "c_flanks": ["NCQV", "FGQVI"]}, {}): result = predictor.predict(peptides, alleles, **flanks) assert len(result) == len(peptides) assert numpy.isfinite(result[["affinity", "processing_score", "presentation_score"]]).all().all() assert result.presentation_score.between(0, 1).all() print(result.to_csv(index=False)) numpy.testing.assert_allclose( Class1AffinityPredictor.load().predict(peptides, allele=alleles[0]), predictor.affinity_predictor.predict(peptides, allele=alleles[0]), rtol=1e-6, ) print("Offline image smoke passed:", __version__) mhcflurry-2.3.6/docs/000077500000000000000000000000001525677230600145025ustar00rootroot00000000000000mhcflurry-2.3.6/docs/Makefile000066400000000000000000000170771525677230600161560ustar00rootroot00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -v -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " applehelp to make an Apple Help Book" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " epub3 to make an epub3" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" @echo " coverage to run coverage check of the documentation (if enabled)" @echo " dummy to check syntax errors of document sources" # Added by Tim .PHONY: generate generate: sphinx-apidoc -M -f -o _build/ ../mhcflurry ../mhcflurry/local_parallelism.py .PHONY: clean clean: rm -rf "$(BUILDDIR)" .PHONY: html html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." .PHONY: dirhtml dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." .PHONY: singlehtml singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." .PHONY: pickle pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." .PHONY: json json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." .PHONY: htmlhelp htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." .PHONY: qthelp qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/MHCflurry.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/MHCflurry.qhc" .PHONY: applehelp applehelp: $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp @echo @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." @echo "N.B. You won't be able to view it unless you put it in" \ "~/Library/Documentation/Help or install it in your application" \ "bundle." .PHONY: devhelp devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/MHCflurry" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/MHCflurry" @echo "# devhelp" .PHONY: epub epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." .PHONY: epub3 epub3: $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 @echo @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." .PHONY: latex latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." .PHONY: latexpdf latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." .PHONY: latexpdfja latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." .PHONY: text text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." .PHONY: man man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." .PHONY: texinfo texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." .PHONY: info info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." .PHONY: gettext gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." .PHONY: changes changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." .PHONY: linkcheck linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." .PHONY: doctest doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." .PHONY: coverage coverage: $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage @echo "Testing of coverage in the sources finished, look at the " \ "results in $(BUILDDIR)/coverage/python.txt." .PHONY: xml xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." .PHONY: pseudoxml pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." .PHONY: dummy dummy: $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy @echo @echo "Build finished. Dummy builder generates no files." mhcflurry-2.3.6/docs/README.md000066400000000000000000000025341525677230600157650ustar00rootroot00000000000000--- orphan: true --- # MHCflurry documentation To generate Sphinx documentation, from this directory run: ```shell pip install -r requirements.txt # first build only make generate html ``` Documentation is written to `_build/html`. These files should not be checked into the source branch. Pull requests build and test the docs; merges to `master` publish them to the `gh-pages` branch. To test example code: ```shell make doctest ``` See `_build/doctest` for detailed output. For a strict build, use `make generate html doctest SPHINXOPTS="-W --keep-going"`. The API page includes generated reStructuredText inside an `eval-rst` block; the three subpackage wrapper pages do the same using native RST includes. Do not change the API include to a plain Markdown include: the build can then silently omit the actual class and method documentation. The `api_coverage` extension fails builds that are missing representative public API entries. The legacy `local_parallelism` re-export module is excluded from generation; its canonical API is documented under `mhcflurry.parallelism`. The shared percentile guide also has executable Python examples and CLI templates checked by `test/test_percentile_documentation.py`. Keep its equations, defaults, and compatibility guidance aligned with the predictor docstrings and command help when changing calibration behavior. mhcflurry-2.3.6/docs/_static/000077500000000000000000000000001525677230600161305ustar00rootroot00000000000000mhcflurry-2.3.6/docs/_static/release-2.3.0/000077500000000000000000000000001525677230600202065ustar00rootroot00000000000000mhcflurry-2.3.6/docs/_static/release-2.3.0/affinity_ligand_ranking.svg000066400000000000000000002473511525677230600256030ustar00rootroot00000000000000 2026-09-28T16:11:58.812651 image/svg+xml Matplotlib v3.11.2, https://matplotlib.org/ mhcflurry-2.3.6/docs/_static/release-2.3.0/paired_prerelease_components.svg000066400000000000000000003570261525677230600266640ustar00rootroot00000000000000 2026-09-28T13:39:38.552635 image/svg+xml Matplotlib v3.11.2, https://matplotlib.org/ mhcflurry-2.3.6/docs/_static/release-2.3.0/paired_presentation_with_flanks.svg000066400000000000000000003271421525677230600273700ustar00rootroot00000000000000 2026-09-28T13:39:37.031259 image/svg+xml Matplotlib v3.11.2, https://matplotlib.org/ mhcflurry-2.3.6/docs/_static/release-2.3.0/paired_presentation_without_flanks.svg000066400000000000000000003204101525677230600301070ustar00rootroot00000000000000 2026-09-28T13:39:37.528076 image/svg+xml Matplotlib v3.11.2, https://matplotlib.org/ mhcflurry-2.3.6/docs/_static/release-2.3.0/prerelease_components.svg000066400000000000000000003567701525677230600253450ustar00rootroot00000000000000 2026-09-28T13:39:38.306357 image/svg+xml Matplotlib v3.11.2, https://matplotlib.org/ mhcflurry-2.3.6/docs/_static/release-2.3.0/presentation_with_flanks.svg000066400000000000000000003307001525677230600260360ustar00rootroot00000000000000 2026-09-28T16:11:57.929770 image/svg+xml Matplotlib v3.11.2, https://matplotlib.org/ mhcflurry-2.3.6/docs/_static/release-2.3.0/presentation_without_flanks.svg000066400000000000000000003203401525677230600265650ustar00rootroot00000000000000 2026-09-28T16:11:58.426191 image/svg+xml Matplotlib v3.11.2, https://matplotlib.org/ mhcflurry-2.3.6/docs/_static/release-2.3.0/processing_with_flanks.svg000066400000000000000000002453441525677230600255100ustar00rootroot00000000000000 2026-09-28T16:11:58.967772 image/svg+xml Matplotlib v3.11.2, https://matplotlib.org/ mhcflurry-2.3.6/docs/_static/release-2.3.0/processing_without_flanks.svg000066400000000000000000002357041525677230600262370ustar00rootroot00000000000000 2026-09-28T16:11:59.158326 image/svg+xml Matplotlib v3.11.2, https://matplotlib.org/ mhcflurry-2.3.6/docs/affinity_dual_checkpoint_workflow.md000066400000000000000000000024331525677230600240050ustar00rootroot00000000000000# Affinity checkpoint comparison Pass `--save-all-checkpoints` to `mhcflurry class1-train-pan-allele-models` to retain both terminal and minimum-validation-loss weights from each training trajectory. `restore_best_weights` still selects the primary prediction state. Checkpoint NPZ files are stored under `checkpoints/terminal/` and `checkpoints/best/`, with relative paths in the training manifest. Materialize an alternative state as a separate predictor: ```shell mhcflurry train materialize-affinity-checkpoint \ --models-dir models.unselected.combined \ --policy best \ --out-models-dir models.unselected.best ``` The command records source hashes and selection provenance and removes stale calibration and optimization metadata. A missing requested checkpoint is an error. Repeat ensemble selection and calibration before treating the new predictor as a replacement for the original; compare both on identical rows. Training save/load, multiprocessing and continuation preserve checkpoint sidecars. Release inference exports omit them and load only the selected primary state. Keep the original training directory to revisit checkpoint selection. The 2.3.0 affinity weights use terminal checkpoints; retaining best-loss states does not imply that they improved the released ensemble. mhcflurry-2.3.6/docs/api.md000066400000000000000000000011531525677230600155750ustar00rootroot00000000000000(api-documentation)= # API Documentation This is the complete generated API reference. Start with the {doc}`python_tutorial` for the common prediction workflow, then use this page to look up individual classes and methods. For calibration-specific examples and compatibility, see {doc}`shared_percent_rank_transforms`. The compatibility module `mhcflurry.local_parallelism` re-exports the canonical {mod}`mhcflurry.parallelism` API. Its identical members are documented under that package rather than indexed twice through the old import path. ```{eval-rst} .. include:: _build/mhcflurry.rst :start-line: 2 ``` mhcflurry-2.3.6/docs/api_coverage.py000066400000000000000000000022751525677230600175060ustar00rootroot00000000000000"""Fail documentation builds that silently omit the public Python API.""" REQUIRED_API_OBJECTS = ( "mhcflurry.Class1AffinityPredictor", "mhcflurry.Class1AffinityPredictor.calibrate_percentile_ranks", "mhcflurry.Class1ProcessingPredictor", "mhcflurry.Class1ProcessingPredictor.percentile_ranks", "mhcflurry.Class1PresentationPredictor", "mhcflurry.Class1PresentationPredictor.percentile_ranks", "mhcflurry.HistogramPercentRankTransform", "mhcflurry.CompactPercentRankTransform", "mhcflurry.CompactPercentRankTransform.transform", ) def check_public_api(app, exception): """Require actual Python-domain entries, not just module headings.""" if exception is not None: return documented = {entry[0] for entry in app.env.get_domain("py").get_objects()} missing = sorted(set(REQUIRED_API_OBJECTS) - documented) if missing: raise RuntimeError( "Public API documentation is missing: %s. Check that generated " "RST is parsed as reStructuredText, not Markdown." % ", ".join(missing)) def setup(app): app.connect("build-finished", check_public_api) return {"parallel_read_safe": True, "parallel_write_safe": True} mhcflurry-2.3.6/docs/auto_sizing_audit.md000066400000000000000000000063701525677230600205530ustar00rootroot00000000000000# Resource planning guarantees The planner combines conservative capacity estimates with real-workload probes. Use {doc}`configuration` for user controls and {doc}`orchestrator` for process ownership and implementation boundaries. ## Planner invariants 1. The sum of automatic worker entitlements never exceeds launch-time free device memory after one shared reserve, including when unrelated processes already occupy the GPU. 2. A worker's elastic allocation is bounded by both its remaining entitlement and current global headroom; worker startup order cannot increase it. 3. A measurement can only tighten an automatic plan. Explicit user concurrency remains authoritative and receives diagnostics instead of mutation. 4. A training probe exercises every phase that can own the peak: real resident inputs, the configured minibatch and optimizer, and validation. 5. Process-level measurement includes CUDA context and non-PyTorch allocations; allocator counters alone are insufficient for multi-process packing. A before-context driver baseline covers containers whose host and container process IDs differ. 6. Resource decisions are visible in the run log, and release workflows turn any training-affecting shrink into a hard provenance failure. 7. Automatic CUDA processing batches are calibrated after the real model and encoded inputs are resident. The measured peak may only shrink the analytic batch, and the selected value cannot exceed the successfully exercised probe shape. If a probe OOMs, calibration halves the probe until one succeeds; if allocator telemetry is unavailable, it uses the successful probe instead of restoring an unverified analytic value. Explicit batches are unchanged, and elastic halving remains the final allocator-specific safety net. ## Hardware validation matrix The autosizer tests machine *characteristics*, not accelerator names. A label such as ``4xH100`` makes a test case readable, but the planner receives only GPU count and free memory per GPU, available host RAM, available CPU units, and the workload envelope. This keeps a new card or cloud shape from requiring a model-name lookup table. Each matrix row validates two plans: 1. The provisional launch plan packs the analytic worker estimate into the shared-reserve GPU budget, then clamps total jobs by host RAM, CPU count, and available work items. DataLoader children are resolved from the resulting CPU/RAM share and host capacity is checked again. 2. The measured plan replaces optimistic worker estimates with the maximum full-residency probe peaks plus safety margins. It may only tighten an automatic plan. Explicit concurrency is never mutated. The test matrix includes CPU-only, single- and multiple-GPU hosts and CPU/RAM constrained variants. These are tests of capacity arithmetic, not runtime benchmarks of every accelerator. Real planning uses detected free capacity, not a hardware-name lookup table. ## Limits Host worker, DataLoader and random-negative pool estimates include conservative throughput heuristics. They do not establish identical runtime peaks on all hardware. Explicit user concurrency remains authoritative; release workflows reject unexpected training minibatch reductions because those can alter the trained model. mhcflurry-2.3.6/docs/commandline_tools.md000066400000000000000000000117671525677230600205460ustar00rootroot00000000000000# Command-line reference This page gives generated help for the main commands and workflow namespaces. Use a workflow's subcommand help for its complete options. If you are new to MHCflurry or are choosing a workflow, start with the {ref}`tutorial ` and return here to look up specific arguments. MHCflurry provides a unified `mhcflurry` command while retaining the historical `mhcflurry-*` names. Both forms use the same implementation. See {doc}`configuration` for the naming convention, {doc}`evaluation` for the evaluation workflow, and the generated argument reference below for every option. Prediction help uses a compact usage line, spaced options and terminal colors. Redirected help stays plain text; set `NO_COLOR=1` to disable colors in a terminal. Browse and select weight releases with `mhcflurry downloads releases`, `mhcflurry downloads list`, and `mhcflurry predict --model-release RELEASE`. See {doc}`model_downloads` for bundle descriptions, local paths, and a worked comparison with historical weights. Use {doc}`shared_percent_rank_transforms` for compact percentile calibration. ## Prediction and data ```{eval-rst} .. _ref-mhcflurry-predict: .. autoprogram:: mhcflurry.cli.predict_command:parser :prog: mhcflurry predict .. _ref-mhcflurry-predict-scan: .. autoprogram:: mhcflurry.cli.predict_scan_command:parser :prog: mhcflurry predict-scan .. _ref-mhcflurry-downloads: .. autoprogram:: mhcflurry.cli.downloads_command:parser :prog: mhcflurry downloads ``` ## Calibration See {doc}`shared_percent_rank_transforms` for examples and background requirements. Calibration writes into `--models-dir`; use a copy to preserve an existing calibration. ```{eval-rst} .. _ref-mhcflurry-calibrate-percentile-ranks: .. autoprogram:: mhcflurry.cli.calibrate_percentile_ranks_command:parser :prog: mhcflurry calibrate-percentile-ranks ``` ## Class I training and selection ```{eval-rst} .. _ref-mhcflurry-train: ``` ### `mhcflurry train` `mhcflurry train` groups release-training workflows. It is a namespace command; run `mhcflurry train --help` or the concrete subcommand help for the complete argument list. ```{command-output} mhcflurry train --help :nostderr: ``` The release workflow delegates to the maintained release script: ```console $ mhcflurry train pan-allele-release --help ``` ```{eval-rst} .. _ref-mhcflurry-class1-train-allele-specific-models: .. autoprogram:: mhcflurry.cli.train_allele_specific_models_command:parser :prog: mhcflurry class1-train-allele-specific-models .. _ref-mhcflurry-class1-select-allele-specific-models: .. autoprogram:: mhcflurry.cli.select_allele_specific_models_command:parser :prog: mhcflurry class1-select-allele-specific-models .. _ref-mhcflurry-class1-train-pan-allele-models: .. autoprogram:: mhcflurry.cli.train_pan_allele_models_command:parser :prog: mhcflurry class1-train-pan-allele-models .. _ref-mhcflurry-class1-select-pan-allele-models: .. autoprogram:: mhcflurry.cli.select_pan_allele_models_command:parser :prog: mhcflurry class1-select-pan-allele-models .. _ref-mhcflurry-class1-train-processing-models: .. autoprogram:: mhcflurry.cli.train_processing_models_command:parser :prog: mhcflurry class1-train-processing-models .. _ref-mhcflurry-class1-select-processing-models: .. autoprogram:: mhcflurry.cli.select_processing_models_command:parser :prog: mhcflurry class1-select-processing-models .. _ref-mhcflurry-class1-train-presentation-models: .. autoprogram:: mhcflurry.cli.train_presentation_models_command:parser :prog: mhcflurry class1-train-presentation-models ``` ## Evaluation and figures ```{eval-rst} .. _ref-mhcflurry-eval: ``` ### `mhcflurry eval` `mhcflurry eval` groups model comparison, diagnostic plotting, reusable score generation, and paper-style figure rendering. It is a namespace command; run the concrete subcommand help for the complete argument list. ```{command-output} mhcflurry eval --help :nostderr: ``` ```{eval-rst} .. _ref-mhcflurry-eval-artifacts: ``` ### Evaluation and Plotting Artifacts The commands deliberately separate reusable metrics from rendering. See {doc}`evaluation` for the output map, saved-prediction schema, paper-figure workflow, and external-predictor integration. ```{eval-rst} .. _ref-mhcflurry-compare-models: .. autoprogram:: mhcflurry.cli.compare_models:parser :prog: mhcflurry compare-models .. _ref-mhcflurry-plot-model-comparison: .. autoprogram:: mhcflurry.cli.plot_model_comparison:parser :prog: mhcflurry plot-model-comparison .. _ref-mhcflurry-paper-figures: .. autoprogram:: mhcflurry.cli.paper_figures:parser :prog: mhcflurry paper-figures ``` Prefer the namespaced `mhcflurry eval ...` form in new automation. Compatibility shortcuts remain available for existing scripts. ## Pseudosequence registry helper ```{note} `mhcflurry pseudosequences` is a shell-helper CLI for the pseudosequence CSV registry. It has its own subcommands (`filename`, `path`, `list`, `legacy`); run `mhcflurry pseudosequences --help` for the full argument forms. ``` mhcflurry-2.3.6/docs/commandline_tutorial.md000066400000000000000000000150241525677230600212370ustar00rootroot00000000000000(commandline_tutorial)= # Command-line tutorial This tutorial follows the common workflow: download the released models, score peptides, then scan proteins for candidate ligands. Most users can stop there; training, evaluation, configuration, and exhaustive flag descriptions are linked later. (downloading)= (downloading-models)= ## Download models Most users need only the presentation bundle. It includes the binding-affinity and antigen-processing components: ```shell $ mhcflurry downloads fetch models_class1_presentation ``` Downloads are stored outside the Python package in a platform-specific data directory. Use `info` to list available bundles and `path` to locate one: ```{command-output} mhcflurry downloads path models_class1_presentation :nostderr: ``` See {doc}`model_downloads` to browse releases and select historical weights with `--model-release`. ## Predict peptides `mhcflurry predict` scores peptides with their MHC alleles and N/C source-protein flanks. The example CSV contains windows from `example.fasta`: ```{literalinclude} /example-peptides.csv :language: text ``` Flanks are used by default when both columns are provided: ```{command-output} mhcflurry predict example-peptides.csv --out /tmp/predictions.csv :nostderr: ``` ```{command-output} cat /tmp/predictions.csv ``` To compare the same rows without flanks: ```shell mhcflurry predict example-peptides.csv --no-flanking --out predictions-no-flanks.csv ``` When context is unavailable, omit the flank columns or supply peptide arguments: ```shell mhcflurry predict --alleles HLA-A0201 HLA-A0301 --peptides SIINFEKL SIINFEKD --out predictions.csv ``` | Output | Interpretation | |---|---| | `mhcflurry_affinity` | Predicted nM affinity; lower is stronger. | | `mhcflurry_affinity_percentile` | Allele-specific rank from 0–100; lower is stronger. | | `mhcflurry_processing_score` | Allele-independent processing score; higher is stronger. | | `mhcflurry_presentation_score` | Combined binding and processing score; higher is stronger. | Affinity thresholds of 500 nM or 2nd percentile are common screening choices. Presentation scores are useful for ranking candidates, but there is no universal presentation-score threshold. Allele names are parsed as sequence-resolved MHC class I alleles. Invalid, ambiguous, class-II, pseudogene, null, or unsupported names produce a specific error. Add `--no-throw` when processing mixed-quality tables to keep those rows with `NaN` predictions instead. (allele-input-semantics)= ### MHC alleles and samples MHCflurry treats each allele argument or CSV cell as one query. Delimiters inside a query (`;`, `,`, or whitespace) combine alleles into one MHC allele set; separate command-line arguments remain separate queries. | Input | Meaning | |---|---| | `--alleles A0201 A0301 --peptides P1 P2` | Four independent allele–peptide rows. | | `--alleles 'A0201;A0301' --peptides P1 P2` | Two MHC allele set–peptide rows; `best_allele` identifies the stronger allele. | | CSV rows `P1,A0201` and `P1,A0301` | Two independent rows. | | CSV row `P1,A0201;A0301` | One MHC allele set row with the strongest allele reported. | `mhcflurry predict-scan` uses the same rule: each `--alleles` argument names one sample. A quoted comma-separated panel is scored as one group and reports the best allele across that group; separate arguments keep per-allele or per-sample results. A large population panel is therefore not the same thing as one person's MHC allele set. For CSV prediction, optional `n_flank` and `c_flank` columns provide source protein context for cleavage prediction. See the {ref}`command reference ` for the complete input schema. ## Scanning protein sequences for predicted MHC I ligands Use `mhcflurry predict-scan` to score peptide windows in a protein sequence. The default lengths are 8–11 amino acids; set `--peptide-lengths` to change them. By default, the output keeps rows with affinity percentile at most 2. Use `--results-all` to return every scored window, or `--threshold-*` to choose a different filter. Scanning supplies N/C source-protein flanks automatically; use `--no-flanking` for predictions without that context. We'll generate predictions across `example.fasta`, a FASTA file with two short sequences: ```{literalinclude} /example.fasta ``` This invocation keeps peptides with predicted affinity at most 100 nM: ```shell $ mhcflurry predict-scan example.fasta \ --alleles 'HLA-A*02:01' \ --threshold-affinity 100 ``` See the {ref}`command reference ` for FASTA/CSV input, presentation-score filtering, peptide lengths, and output options. ## Training models Training is an advanced workflow; most users should use the released models. If you have custom measurements, choose the smallest workflow that matches the data: - allele-specific affinity models for one or a few well-covered alleles; - pan-allele affinity models for measurements spanning many alleles; or - `mhcflurry train pan-allele-release` for a complete retrain, selection, calibration, and evaluation run. The {doc}`training` guide covers input schemas, hyperparameters, output bundles, and release-style training without interrupting this prediction tutorial. ## Evaluating trained models After fitting a model, compare it with a released predictor before using it as a default. A local comparison and diagnostic PDF take two commands: ```shell $ mhcflurry eval compare-models \ --a results/new_run/ \ --b public \ --out results/new_run/eval_comparison/ $ mhcflurry eval plot-comparison \ --input results/new_run/eval_comparison/ \ --summary-pdf results/new_run/eval_comparison/plots/model_comparison_figures.pdf ``` The {doc}`evaluation` guide explains the output layers, saved-prediction schema, paper-style figures, and remote release behavior. ## Using older allele-specific models MHCflurry still distributes the allele-specific predictors described in the 2018 paper. Download them and pass their model directory explicitly: ```shell $ mhcflurry downloads fetch models_class1 $ mhcflurry predict \ --alleles HLA-A0201 HLA-A0301 \ --peptides SIINFEKL SIINFEKD SIINFEKQ \ --models "$(mhcflurry downloads path models_class1)/models" \ --out /tmp/predictions.csv ``` Use the current pan-allele presentation bundle unless you specifically need these historical models. ## Configuration and command reference See {doc}`configuration` for prediction batches, hardware autosizing, reproducibility, and unified command aliases. The complete generated argument reference is in {doc}`commandline_tools`. mhcflurry-2.3.6/docs/conf.py000066400000000000000000000042551525677230600160070ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import sys import os import re import logging logging.getLogger("matplotlib").setLevel(logging.WARNING) sys.path.insert(0, os.path.abspath('.')) extensions = [ 'api_coverage', 'sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.coverage', 'sphinx.ext.ifconfig', 'sphinx.ext.viewcode', 'sphinx.ext.githubpages', 'myst_parser', 'numpydoc', 'sphinxcontrib.programoutput', 'sphinxcontrib.autoprogram', ] myst_enable_extensions = [ "colon_fence", "deflist", ] doctest_global_setup = ''' import logging logging.getLogger('matplotlib').disabled = True import numpy import pandas import mhcflurry pandas.set_option('display.max_columns', 20) pandas.set_option('display.expand_frame_repr', False) ''' doctest_test_doctest_blocks = '' templates_path = ['_templates'] source_suffix = { '.rst': 'restructuredtext', '.md': 'markdown', } master_doc = 'index' project = 'MHCflurry' copyright = '2017–2026, MHCflurry contributors' author = 'MHCflurry contributors' with open('../mhcflurry/version.py', 'r') as f: version = re.search( r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', f.read(), re.MULTILINE).group(1) release = version autodoc_member_order = 'bysource' autoclass_content = 'both' suppress_warnings = ['image.nonlocal_uri'] language = 'en' exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] default_role = 'py:obj' pygments_style = 'sphinx' todo_include_todos = False numpydoc_show_class_members = False html_theme = 'sphinx_rtd_theme' html_last_updated_fmt = "" html_domain_indices = False html_use_index = False mhcflurry-2.3.6/docs/configuration.md000066400000000000000000000136621525677230600177030ustar00rootroot00000000000000# Configuration and performance MHCflurry chooses safe defaults for ordinary prediction and training commands. Most users should start without environment-variable overrides or fixed worker counts, then pin a value only when reproducing a benchmark or diagnosing a specific machine. ## Automatic hardware planning Prediction, training, calibration, selection, and evaluation commands share a workload-aware planner. Depending on the command, it considers available GPU memory, model and data size, the configured training batch, host RAM, CPU count, and remaining work items. Container memory limits are detected through cgroups, so a job does not size itself from RAM that belongs to the physical host but is unavailable inside the container. On spawn-based platforms, the planner also measures the loaded worker context before starting the pool; this prevents a compressed input file from hiding the much larger in-memory copy created in each worker. If the remaining safe RAM cannot hold even one additional spawn copy, an automatic plan runs serially in the already-loaded parent process. The common automatic options are: | Option | Automatic behavior | |---|---| | `--gpus` | With the `auto` or `gpu` backend, discovers every visible CUDA device unless a count is supplied. | | `--num-jobs auto` | Chooses the total worker count from CUDA and host capacity; runs serially on CPU/MPS. | | `--max-workers-per-gpu auto` | Packs complete estimated worker working sets into each GPU. | | `--dataloader-num-workers auto` | Sizes pretraining DataLoader children from CPU and host memory. | | `--torch-compile auto` | Reads `MHCFLURRY_TORCH_COMPILE`; compilation is off when unset. Enabling it affects CUDA only. | Automatic GPU packing has no default fixed worker cap. Explicit CLI values and explicit per-workload memory estimates remain authoritative; the planner logs the facts and limits used for each decision. Affinity and processing trainers validate an automatic GPU plan with a bounded single-worker resource probe before starting the production pool. The probe uses the real resident fold and validation path and measures whole-process CUDA usage; it is a resource-safety step even when `torch.compile` is disabled. Runtime auto batches use a fixed per-worker share of launch-time free device capacity, so their size does not depend on which co-resident worker initialized first. Automatic CUDA processing batches are additionally capped by a successful real-model forward probe; the planner does not extrapolate across unobserved convolution workspace shapes. If a workload still runs out of memory, first keep the batch and worker settings on `auto`. If you need to intervene, reduce `--max-workers-per-gpu` or use a smaller explicit batch. Pinning values can improve repeatability on a known machine, but it also bypasses some automatic safeguards. See {doc}`orchestrator` for implementation details and expert environment overrides. ## Environment overrides These variables are intended for custom model locations, debugging, and controlled benchmarks. Ordinary prediction and training do not require them. `MHCFLURRY_DEFAULT_CLASS1_MODELS` : Path to the default **affinity** predictor. Without this override, `Class1AffinityPredictor.load()` uses the active release's standalone affinity bundle when installed, then falls back to the affinity component of its presentation bundle. Explicit model paths take precedence. `MHCFLURRY_DEFAULT_CLASS1_PRESENTATION_MODELS_DIR` : Path to the default presentation predictor, including its affinity and processing components. Otherwise, uses the active release's presentation bundle. `MHCFLURRY_DEFAULT_CLASS1_PROCESSING_MODELS_DIR` : Path to the default standalone processing predictor. Otherwise, uses the active release's standalone processing bundle. See {doc}`model_downloads` for release selection and download-directory overrides. `MHCFLURRY_OPTIMIZATION_LEVEL` : Controls pan-allele ensemble merging. The default, `1`, enables the faster merged-network path. Set it to `0` when debugging or comparing the unmerged implementation. `MHCFLURRY_DEFAULT_PREDICT_BATCH_SIZE` : Overrides the default prediction batch size. The normal value is `auto`, which sizes batches from available device memory and can retry with a smaller batch after an allocator out-of-memory error. A fixed integer disables that resizing behavior and should be used only when you know the workload fits. ## Reproducible training Training and calibration commands accept `--random-seed`. The command-line default is `42`, covering data splits and shuffles, initial weights, random negatives, allele sampling, and calibration peptides. Ensemble members derive distinct sub-seeds from that master seed. Compact percentile knot selection has a separate, fixed seed of **403** for its grouped 80/20 background split. `--random-seed` controls background peptide and MHC allele set generation, not that selection seed. The selected knot budget, reference hash, and available validation diagnostics are saved with the curve; see {doc}`shared_percent_rank_transforms`. The direct Python training APIs use `seed=None` by default, preserving their historical stochastic behavior unless the caller opts in. A fixed seed does not guarantee identical weights across devices, dependency versions or numerical settings. Preserve those settings and the effective training batch alongside the seed. See the [PyTorch reproducibility guide](https://docs.pytorch.org/docs/stable/notes/randomness.html) for backend-specific determinism controls. ## Unified and historical command names MHCflurry 2.3 groups commands under one `mhcflurry` entry point. For example: ```text mhcflurry-predict = mhcflurry predict mhcflurry-downloads fetch = mhcflurry downloads fetch mhcflurry-class1-train-pan-allele-models = mhcflurry class1-train-pan-allele-models ``` Both forms invoke the same implementation. New automation can use the unified form; existing scripts do not need to change. mhcflurry-2.3.6/docs/development.md000066400000000000000000000040351525677230600173500ustar00rootroot00000000000000# Development This page is for contributors working from a source checkout. Prediction users can use the installation steps in {doc}`intro` instead. ## Set up a checkout Source `develop.sh` to create and activate the editable virtual environment: ```shell source develop.sh ``` The script must be sourced so its environment activation persists in the current shell. Run `./lint.sh` for lint and use {doc}`testing` to choose a focused or full pytest command. Contribution and pull-request expectations are in [CONTRIBUTING.md](https://github.com/openvax/mhcflurry/blob/master/CONTRIBUTING.md). ## Private APIs and fallback cleanup MHCflurry should keep internal helpers movable. Tests and sibling modules should not pin underscore-prefixed functions unless the helper is truly private to the same module. 1. Promote shared helpers before cross-module use. If a helper is imported by another module or tested directly, give it a public name in its owner module and document the contract in one sentence. 2. Test owner modules, not compatibility facades. Tests for moved helpers should import the helper module directly. Compatibility shim tests should cover public behavior only: old imports still expose the documented entry point and produce the same result. 3. Make fallback paths observable. Fallbacks for missing optional tools or hardware probes may return a safe default. Fallbacks caused by import errors, bad local refactors, or invalid user configuration should fail loudly instead of being caught by broad `except Exception` blocks. 4. Keep compatibility shims thin. Old module paths may re-export public entry points and delegate unknown attributes, but they should not replace `sys.modules` or assert identity with the new implementation module. 5. Track remaining private test hooks. The remaining direct private imports in tests should be triaged into: public helper, same-module implementation detail tested through behavior, or compatibility shim slated for removal after the 2.3 release line stabilizes. mhcflurry-2.3.6/docs/doctest.sh000077500000000000000000000002341525677230600165050ustar00rootroot00000000000000#!/bin/bash sphinx-build -b doctest -d _build/doctrees . _build/doctest RETVAL=$? echo doctest returned $RETVAL cat _build/doctest/output.txt exit $RETVAL mhcflurry-2.3.6/docs/evaluation.md000066400000000000000000000260421525677230600171770ustar00rootroot00000000000000(evaluation)= # Evaluating trained models Use the evaluation commands after training a model to compare it with a public release or another run. The normal workflow separates reusable metrics from plot rendering, so you can change figures without rerunning predictions. ## Quick evaluation Compare a candidate run with the installed public models: ```shell mhcflurry eval compare-models \ --a results/new_run \ --b public \ --out results/new_run/eval_comparison ``` Render the diagnostic plots and combined PDF: ```shell mhcflurry eval plot-comparison \ --input results/new_run/eval_comparison \ --summary-pdf results/new_run/eval_comparison/plots/model_comparison_figures.pdf ``` Use `public:` instead of `public` when the baseline version must be fixed. Components are compared only when both sides contain the corresponding model artifacts; explicitly requested processing modes must exist on both sides. ## Outputs For processing pools that cannot supply ten distinct negatives per hit, expand and freeze a single cohort before comparing models: ```shell mhcflurry eval prepare-processing-cohort \ --data-dir DATA_EVALUATION \ --release-holdout-dir results/new_run/release_holdout \ --affinity-predictor PUBLIC_MODELS_CLASS1_PAN/models.combined \ --proteome-reference-csv HUMAN_PROTEOME.csv.bz2 \ --out results/processing_cohort mhcflurry eval compare-models \ --a results/new_run --b public:2.2.0 \ --include processing --data-dir DATA_EVALUATION \ --release-holdout-dir results/new_run/release_holdout \ --processing-matched-cohort results/processing_cohort \ --out results/new_run/processing_comparison ``` The preparation command retains every held-out hit and the original cached public affinities, samples additional candidates only for unresolved lengths, and scores them with the frozen reference. It first checks that this reference reproduces 256 spread-out cached predictions per sample within 0.0001 log10 units. Input, model and output checksums, the checked rows, seeds, scored rounds and unique assignments are saved. `--resume` reuses verified rounds; insufficient capacity remains an error. This processing-only expansion does not alter the presentation benchmark. The remote launcher accepts the resulting directory through `PROCESSING_EVALUATION_COHORT`. For external comparisons, pass `--coverage common` to `mhcflurry eval presentation-external-predictors`. Every table, paired interval and figure then uses identical rows across all requested models. The coverage table retains original missing-score counts and common exclusions; provenance records original and scored hit/row counts. Every sample must remain represented with both classes. The default `available` mode preserves per-model coverage and pairwise intersections for diagnostic use. All requested NetMHCpan versions, both BA and EL, receive paired comparisons. | Stage | Command | Main outputs | |---|---|---| | Metrics | `eval compare-models` | Component CSV/JSON files, `release_summary.csv`, and `release_summary.md` | | Diagnostics | `eval plot-comparison` | ROC, precision-recall, scatter, and delta plots plus an optional combined PDF | | Paper figures | `eval paper-figures render` | SVG/PDF/PNG panels, `paper_figures.pdf`, `manifest.csv`, and `missing_inputs.md` | The metrics directory is the reusable contract between evaluation and plotting. Keep it when iterating on figure style or assembling a review packet. Report raw-score and percentile metrics separately, recording the calibration method and background. Preserve public baselines unchanged; see {doc}`shared_percent_rank_transforms` for controlled recalibration comparisons. Affinity comparison summaries include a `benchmark_identity` hash calculated after holdout selection, allele intersection, peptide-length filtering, and training-overlap exclusion. A saved prediction column can be reused without rerunning a baseline only when that identity matches exactly: ```shell mhcflurry eval compare-models \ --a results/candidate/models.combined \ --b public \ --b-affinity-predictions results/public-comparison/affinity/predictions.csv.bz2 \ --b-affinity-prediction-column b_pred \ --out results/candidate/comparison-vs-public ``` For affinity-factorial finalists, `mhcflurry eval affinity-candidate-figures` combines the direct, row-identical candidate/public prediction tables into one monoallelic score table and figure suite. Its paginated AUROC, AUPRC, and PPV grids show every requested candidate against every available baseline, and its overview ranks all predictors by macro allele-level metrics. Canonical NetMHCpan BA/EL and MixMHCpred columns are retained when present. Use `--external-predictions` to add a benchmark-aligned table containing NetMHCpan BA/EL or MixMHCpred scores. The table can be built from official per-sample `data_evaluation` groups with `mhcflurry eval merge-external-predictions`; both commands validate stable row identity and record input hashes and coverage in figure provenance. Keep paper figures in their own directory (the default is `/plots/paper_figures`). The combined diagnostic `--summary-pdf` may be a top-level file under `/plots` or live outside the plot tree, but it cannot be placed inside the paper-figure, affinity, processing, presentation, or diagnostic-paper subdirectories. Commands reject overlapping output paths before clearing or rendering anything. ## Count-matched processing ensembles To compare a four-network candidate with an eight-network public ensemble, evaluate all four-of-eight public subsets rather than choosing a subset using release-holdout performance: ```shell mhcflurry eval processing-ensemble-subsets \ --input results/matched/matched_predictions.csv.bz2 \ --models-dir /path/to/public/models.selected.short_flanks \ --subset-size 4 --reference-score public_5aa \ --comparison-score new_legacy_cnn --comparison-score new_boundary_5x5 \ --out results/public_four_network_subsets ``` This source-checkout command requires strict length/affinity-matched risk sets, caches each network's predictions, verifies reconstruction against the named full-ensemble score, and preserves all subset scores and memberships. It reports median, range and quartiles across the complete subset set. This spread measures ensemble composition sensitivity; it is not a confidence interval or a validation-based model selection procedure. Matching network count does not match the historical training or architecture-search budget. Use a fresh output directory. `--member-cache-dir` can reuse an earlier run's predictions after checking input, model and execution identities. Cross-device score tolerances must be explicitly justified and recorded; do not increase `--verification-atol` to hide changed weights or a misaligned prediction table. ## Paper-style figures For an already-trained local model, compose comparison, diagnostics, and any available paper panels with one command: ```shell mhcflurry eval paper-figures run \ --a results/new_run \ --b public \ --out results/new_run/eval_comparison ``` Paper panels can also use cached benchmark predictions or score tables. A saved prediction table has one row per evaluated peptide–MHC example and contains: - `hit`; - `sample_id` for multiallelic data, or `allele`/`hla` for monoallelic data; - optional peptide and flank metadata; and - canonical predictor score columns, or custom score columns declared in `predictor_info.csv`. Derive reusable AUC and PPV score tables with: ```shell mhcflurry eval paper-figures score-predictions \ --kind multiallelic \ --input benchmark.multiallelic.csv.bz2 \ --out accuracy_scores.multiallelic.csv ``` Score direction must be explicit. Common MHCflurry, NetMHCpan, and MixMHCpred column names have built-in orientation. Describe custom columns in `predictor_info.csv` using `predictor` and `higher_is_better`; those rows also select the custom columns. `--predictor-columns` can restrict scoring to an explicit subset, but custom names still need their direction in `predictor_info.csv`. Other numeric columns are treated as metadata rather than guessed to be predictor scores. Optional licensed predictors run outside the MHCflurry core package. The `paper-figures external-predictors` adapter can invoke a locally installed runner such as `mhctools` and join its output into the canonical benchmark table. Missing optional inputs are listed in `missing_inputs.md`; they are not silently replaced with synthetic panels. ## External predictor comparison `mhcflurry eval presentation-external-predictors` compares saved compare-models scores with the NetMHCpan 4.0 BA, NetMHCpan 4.0 EL and MixMHCpred columns distributed in `data_evaluation`. It runs no predictor: ```shell mhcflurry eval presentation-external-predictors \ --comparison-dir results/new_run/eval_comparison \ --data-dir "$(mhcflurry-downloads path data_evaluation)" \ --cohort multiallelic --coverage common \ --a-label "MHCflurry 2.3.0" --b-label "MHCflurry 2.2" \ --out results/new_run/external_comparison ``` Rows join by benchmark source file and row identity, with MHC allele sets canonicalized as compare-models saves them; any unmatched row fails the command. `data_evaluation` ships NetMHCpan 4.0 BA/EL and MixMHCpred columns. Pass `--external-dir` once per directory of locally generated scores, such as NetMHCpan 4.1/4.2, whose files may be plain CSV. External training overlap is not certified: a tool version or release date alone does not prove that these evaluation samples were excluded from its training. `multiallelic` uses the saved presentation scores with and without flanks; `monoallelic` uses saved affinity predictions (pass `--skip-joined-table` for that large cohort). Metrics use the compare-models definitions. With `--coverage common`, all requested predictors use the same rows. In the default diagnostic `available` mode, each predictor uses its covered rows and each pair uses their intersection. `coverage.csv` records unscored rows and exclusions. Paired intervals resample whole samples (10000 draws, seed 42 by default) and are exploratory. Two reference baselines are included by default: seeded random scores, and a logistic regression on the one-hot first and last four residues with no MHC or flank input, fitted leave-one-sample-out so no sample's labels reach its own scores. Pass `--baselines none` to skip them. Outputs include per-sample, macro and pooled metrics, paired differences, a joined score table, `external_comparison.pdf` with PNG pages, `summary.md` and a provenance manifest. ## Release and remote runs `mhcflurry train pan-allele-release` runs comparison and diagnostic plotting on the training machine before copying results home. Paper inputs that depend on locally licensed tools can remain on the control machine and be rendered after the remote artifacts arrive. Release maintainers should use the [release workflow guide](https://github.com/openvax/mhcflurry/tree/master/scripts/release) for lifecycle, synchronization, and deployment options. The complete argument reference is in {doc}`commandline_tools` and `mhcflurry eval --help`. mhcflurry-2.3.6/docs/exact_public_data_experiment.md000066400000000000000000000100201525677230600227100ustar00rootroot00000000000000# Replaying historical processing data ## Controlled comparison Does the frozen eight-network processing ensemble (four large-ReLU legacy 5-aa networks plus four large-ReLU 5x5 boundary networks), paired with the **actual public affinity weights**, improve presentation without changing training examples? This is the primary contrast, chosen before this replay. Legacy-only and boundary-only ensembles are diagnostic contrasts, not a new architecture search. Public/public with a refitted combiner separates combiner implementation effects from changes to processing. The 2.1.5 download manifest points at the same June 2020 model archives as the historical public `2.2.0` download label. Do not use the October 2023 curated data bundle as a proxy for the data inside those weights. - Processing: use the archived 399,392-row `train_data.csv.bz2` byte-for-byte, including its original four fold assignments. No regenerated decoys. - Presentation: use the original 75,378-row training table, unchanged. - Affinity and no-flank processing: use actual public ensembles, unchanged. - Two processing architectures, four folds each, seed 42; batch 512, Glorot/Keras Adam and all remaining settings from the frozen boundary panel. The panel's terminal-weight policy is unchanged in both architectures; epoch losses and best/stop information remain saved. - Original folds are model-selection holdouts. The fit's internal stopping split is seeded, but cannot be claimed identical to the historical random stopping split, which was not archived as row assignments. Earlier affinity screens used 811,134 rows versus 713,069 in public weights. Earlier processing screens used 399,392 rows but a different row multiset. Those results are not exact-data architecture controls. Raw affinity row differences also include representation changes; they are not a count of biologically new measurements. ## Interpretation This workflow isolates processing architecture and combiner changes while keeping public affinity weights and original processing/presentation training tables fixed. It is distinct from the final 2.3.0 model, which uses the 2023 training snapshot. Affinity performance in this replay is unchanged by construction; it does not validate new affinity training. Compare full presentation AP, PPV@N and AUROC on the same held-out rows and use paired patient intervals. Original model-selection folds and an archived training table do not prove disjointness from every comparator. Audit all inventoried training data separately and retain external-overlap caveats. ## Reproduction and artifacts `mhcflurry train exact-public-processing --help` exposes the maintained driver. It fails closed on public input hash mismatch and evaluation sample overlap, preserves original folds with `--reuse-folds`, resumes incomplete training, and saves per-condition validation predictions and loss plots. Presentation component scores are cached with predictor/input hashes and row identity; the same combiner is fitted from those scores for all conditions. Outputs include commands/events, input copies and hashes, trained manifests with complete epoch histories, OOF predictions, fitted combiner coefficients, component-score caches, held-out row predictions, sample/length metrics, and comparison PDFs. Snapshot the output with `mhcflurry train snapshot-experiment` and append the final comparison PDFs with `mhcflurry eval collate-figures`. Results and gates belong in the experiment directory, not solely in chat. The runplz entry point is `scripts/training/launch_exact_public_processing_modal.py`. Set `EXACT_PUBLIC_RUN_ID`, `EXACT_PUBLIC_SOURCE_COMMIT`, and `EXACT_PUBLIC_SOURCE_SHA256`; upload the corresponding clean source archive to `mhcflurry-230-final-weights:/inputs//source.tar.gz`; then run `runplz modal scripts/training/launch_exact_public_processing_modal.py` from its clean extraction. The launcher records exact source identity, package versions and GPU telemetry. Collect only the experiment subtree; create the destination parent before `modal volume get` of a directory. mhcflurry-2.3.6/docs/example-peptides.csv000066400000000000000000000001751525677230600204700ustar00rootroot00000000000000allele,peptide,n_flank,c_flank HLA-A*02:01;HLA-A*03:01,TPVCPNGPG,MSSSS,NCQV HLA-A*02:01;HLA-A*03:01,RLLEGMEMI,MVENK,FGQVI mhcflurry-2.3.6/docs/example.fasta000066400000000000000000000000761525677230600171600ustar00rootroot00000000000000>protein1 MSSSSTPVCPNGPGNCQV >protein2 MVENKRLLEGMEMIFGQVIPGA mhcflurry-2.3.6/docs/final_230_candidate_experiment.md000066400000000000000000000056431525677230600227450ustar00rootroot00000000000000# Reproduce the 2.3.0 model training Use a clean source checkout, explicit input snapshots and the recorded recipe. The `final-2.3.0-candidate-v2` identifier names the frozen settings used for 2.3.0; see {doc}`release_training_recipe` for the component definitions. The published weights retain their original training commit `ac253f8c859dc687f7fbce9f4840fb55d5acf2c5` in their provenance. The commands below run the recipe with the stable 2.3.0 code. That code corrects streaming pretraining validation of inequality bounds, so a new fit need not reproduce the original training trajectory. The released selected weights are unchanged by that correction. ## Launch on Modal The maintained launcher uses runplz and a persistent Modal volume. Substitute a new run directory and workflow identifier for each independent experiment: ```shell MHCFLURRY_RELEASE_RECIPE=final-2.3.0-candidate-v2 \ MHCFLURRY_RELEASE_DATA_VINTAGE=current \ RUNPLZ_OUTPUT_VOLUME=mhcflurry-model-training \ MHCFLURRY_RELEASE_OUT=/out/runs/mhcflurry-2.3.0 \ RUNPLZ_TIMEOUT_SECONDS=86400 \ MHCFLURRY_RELEASE_VERSION=2.3.0 \ MHCFLURRY_RELEASE_GIT_COMMIT="$(git rev-parse HEAD)" \ MHCFLURRY_RELEASE_WORKFLOW_ID=mhcflurry-2.3.0 \ RELEASE_RANDOM_SEED=42 \ RUN_RELEASE_EVAL=1 RUN_RELEASE_PLOTS=1 \ runplz modal scripts/training/launch_pan_allele_training_remote.py --detach ``` For detached launches, use `MHCFLURRY_RELEASE_OUT`; runplz owns `RUNPLZ_OUT`. The receipt's `mhcflurry_release_out.txt` records the durable volume path. One Modal invocation is limited to 24 hours. Resume only after verifying that the previous worker has exited, using the same source, configuration and run path. A failed evaluation is not a reason to retrain completed fits. Processing preparation verifies cached input and score hashes before reusing completed samples. Training resumes from saved manifests. Do not modify hyperparameters, input tables or seeds within an existing run directory. ## Collect and verify Create the local destination parent before `modal volume get`; the CLI recreates the remote directory basename beneath it. Check the downloaded manifests and checksums rather than treating a successful copy command as proof of completeness. Keep the source commit, architecture decision JSON, data hashes, training and selection records, fitted presentation coefficients, calibration, and final row-level evaluation scores together. The training software version remains part of model provenance even when the weights are distributed in a later or differently numbered download release. A completed run can be archived with: ```shell mhcflurry train snapshot-experiment \ --source-dir /path/to/collected-run \ --name mhcflurry-2.3.0 \ --source-commit TRAINING_COMMIT ``` Use {doc}`evaluation` for independent comparisons. Keep the test rows fixed across predictors, audit overlap against all compared MHCflurry training sources, and record missing external-model training provenance explicitly. mhcflurry-2.3.6/docs/index.md000066400000000000000000000043221525677230600161340ustar00rootroot00000000000000# MHCflurry documentation MHCflurry predicts MHC class I binding affinity, antigen processing, and peptide presentation. Start with the introduction for installation and a first prediction, then choose either the command-line or Python tutorial. The reference pages are intentionally exhaustive and are best used to look up a specific option after you know which workflow you need. ## Start here - {doc}`intro` explains the three prediction types and gets you to a first result. - {doc}`commandline_tutorial` covers peptide prediction and protein scanning. - {doc}`python_tutorial` shows the same predictors through the Python API. ## Common next steps - {doc}`training` explains custom model fitting and release-style retraining. - {doc}`evaluation` compares trained models and builds diagnostic or publication-style figures. - {doc}`model_downloads` covers available weights, older releases, and model selection. - {doc}`release_model_evaluation` compares the released weights on identical rows. - {doc}`shared_percent_rank_transforms` explains compact percentile calibration. - {doc}`configuration` explains automatic hardware planning, expert overrides, and reproducibility. - {doc}`commandline_tools` and {doc}`api` are the complete references. Contributors and release maintainers can start with {doc}`maintainers`. ```{toctree} :maxdepth: 2 :caption: Getting started :hidden: intro commandline_tutorial python_tutorial ``` ```{toctree} :maxdepth: 2 :caption: User guides :hidden: training evaluation model_downloads release_model_evaluation release_model_evaluation_details ``` ```{toctree} :maxdepth: 2 :caption: Reference :hidden: commandline_tools configuration api shared_percent_rank_transforms ``` ```{toctree} :maxdepth: 2 :caption: Contributors and maintainers :hidden: testing development orchestrator auto_sizing_audit release_training_recipe release_neural_hyperparameter_audit affinity_dual_checkpoint_workflow processing_cleavage_boundary_experiment processing_kernel_sweep processing_hyperparameter_campaign processing_preparation_acceleration probabilistic_processing_matching presentation_percentile_calibration final_230_candidate_experiment exact_public_data_experiment saved_candidate_evaluation maintainers ``` mhcflurry-2.3.6/docs/intro.md000066400000000000000000000106221525677230600161600ustar00rootroot00000000000000# Introduction and installation MHCflurry predicts which peptides are likely to be displayed by MHC class I molecules. Its pretrained models answer three related questions: - **Binding affinity:** can this peptide bind a particular MHC allele? - **Antigen processing:** is cellular processing likely to produce this peptide? - **Presentation:** is the peptide likely to reach the cell surface, considering both binding and processing? For most epitope-prioritization work, start with the **presentation** predictor. Use binding affinity when you specifically need peptide–MHC binding estimates, or processing alone when you do not have an allele or MHC allele set. The default pan-allele models support most sequenced human MHC I alleles and several other species. GPUs and Apple Silicon (MPS) are optional and are detected automatically. ## Install MHCflurry Install the latest stable MHCflurry 2.3 patch release with: ```shell pip install --upgrade "mhcflurry>=2.3,<2.4" ``` Download the pretrained presentation models: ```shell mhcflurry downloads fetch models_class1_presentation ``` This bundle includes the binding-affinity and antigen-processing components needed for presentation prediction. ## Make a first prediction Provide each peptide, its MHC alleles, and its N- and C-terminal source-protein flanks in a CSV. This small example uses windows from the sequences in [example.fasta](example.fasta): ```text allele,peptide,n_flank,c_flank HLA-A*02:01;HLA-A*03:01,TPVCPNGPG,MSSSS,NCQV HLA-A*02:01;HLA-A*03:01,RLLEGMEMI,MVENK,FGQVI ``` Save it as `peptides.csv`, then run: ```shell mhcflurry predict peptides.csv --out predictions.csv ``` Flanks are used by default when both columns are present. To compare the same rows without that context: ```shell mhcflurry predict peptides.csv --no-flanking --out predictions-no-flanks.csv ``` If the source context is unavailable, omit the flank columns; MHCflurry uses its no-flank predictor. See {doc}`commandline_tutorial` for direct peptide arguments and protein scanning. ## Understand the results The output contains one row per peptide and allele or MHC allele set query. These are the main prediction columns: | Column | Interpretation | |---|---| | `mhcflurry_presentation_score` | Combined binding and processing score from 0–1; higher is stronger. | | `mhcflurry_affinity` | Predicted binding affinity in nM; lower is stronger. | | `mhcflurry_affinity_percentile` | Allele-specific rank from 0–100; lower is stronger. | | `mhcflurry_processing_score` | Processing score from 0–1; higher is stronger. | Separate allele arguments request separate predictions. A delimited allele list represents one MHC allele set and reports its strongest-binding allele. See {ref}`allele-input-semantics` for examples. Historical `mhcflurry-*` command names remain supported for existing scripts. ## Where to go next - {doc}`model_downloads` lists available weight releases and shows how to select older weights. - {doc}`release_model_evaluation` compares the released models with figures and a PDF. - {doc}`commandline_tutorial`: predict peptides and scan proteins. - {doc}`python_tutorial`: use predictors from Python. - {doc}`training`: fit and select custom models. - {doc}`evaluation`: compare trained models and generate evaluation figures. - {doc}`commandline_tools`: complete generated command reference. - {doc}`configuration`: runtime defaults, hardware autosizing, and reproducibility. ## Using conda The [Bioconda package](https://anaconda.org/bioconda/mhcflurry) has a separate release process. Check which versions are available before installing: ```shell conda search --override-channels -c conda-forge -c bioconda mhcflurry ``` For a code version not yet packaged by Bioconda, create a conda environment and install from PyPI: ```shell conda create -q -n mhcflurry-env python=3.10 conda activate mhcflurry-env pip install --upgrade "mhcflurry>=2.3,<2.4" mhcflurry downloads fetch models_class1_presentation ``` MHCflurry supports Python 3.10+ on Linux and macOS. Windows may work but is not currently part of the supported test matrix. ## Getting help and citing MHCflurry For questions and bug reports, use the [GitHub issue tracker](https://github.com/openvax/mhcflurry/issues). If you use MHCflurry in research, cite the MHCflurry 2.0 presentation-model paper and the original binding-affinity paper listed in the [project README](https://github.com/openvax/mhcflurry#citing-mhcflurry). mhcflurry-2.3.6/docs/maintainers.md000066400000000000000000000026121525677230600173370ustar00rootroot00000000000000# Maintainer workflows This section collects repository and release material that ordinary prediction users do not need. ## Contributing and verification - Read the [contribution guide](https://github.com/openvax/mhcflurry/blob/master/CONTRIBUTING.md) before opening a pull request. - Use {doc}`testing` for the fast local loop and full verification commands. - Use {doc}`development` for internal API and compatibility-shim conventions. - Use {doc}`orchestrator` when changing worker processes, hardware planning, or training data residency. ## Training and model releases Maintained operational documentation lives next to the scripts it describes: - [Training pipeline](https://github.com/openvax/mhcflurry/tree/master/scripts/training) - [Release, synchronization, and deployment](https://github.com/openvax/mhcflurry/tree/master/scripts/release) - [Generated model and data bundles](https://github.com/openvax/mhcflurry/tree/master/downloads-generation) - {doc}`release_training_recipe` records the data and component settings used for the published 2.3.0 weights. - {doc}`release_neural_hyperparameter_audit` explains framework equations and compatibility choices. The public release entry point is: ```shell mhcflurry train pan-allele-release --help ``` It coordinates training, evaluation, plots, remote artifact synchronization, and optional deployment. Deployment is never enabled by default. mhcflurry-2.3.6/docs/mhcflurry.affinity.rst000066400000000000000000000000531525677230600210550ustar00rootroot00000000000000.. include:: _build/mhcflurry.affinity.rst mhcflurry-2.3.6/docs/mhcflurry.cli.rst000066400000000000000000000000461525677230600200150ustar00rootroot00000000000000.. include:: _build/mhcflurry.cli.rst mhcflurry-2.3.6/docs/mhcflurry.parallelism.rst000066400000000000000000000000561525677230600215540ustar00rootroot00000000000000.. include:: _build/mhcflurry.parallelism.rst mhcflurry-2.3.6/docs/model_downloads.md000066400000000000000000000162661525677230600202110ustar00rootroot00000000000000# Downloading and selecting model weights Code and weights have separate versions. A code patch can keep the same default weights: the current package uses the **2.3.0 weight release**. New weight releases identify changed model artifacts; they need not accompany every code release. Historical catalogue names remain available for reproducibility. ## Browse what is available ```shell mhcflurry downloads releases models_class1_presentation mhcflurry downloads list --kind models mhcflurry downloads info models_class1_presentation ``` `releases` lists valid catalogue identifiers. With a bundle name, it shows only releases containing that bundle and groups entries with the same archive URLs. For example, catalogues `2.2.0` and `2.0.0` point to the same presentation archive. `list` groups prediction models, legacy models, experiments, and supporting data. The first table shows the latest weights, distinct older archive versions and installed catalogue directories, with the recommended presentation bundle first, followed by standalone affinity and processing bundles. Aliases sharing the same archive are grouped in the availability columns; `releases DOWNLOAD` lists every valid identifier. Historical resources appear below the main predictors. Terminal output uses restrained color; redirected output and `NO_COLOR=1` remain plain. Use `--kind data` for data only, or `--release 2.2.0` to inspect an older catalogue. `info DOWNLOAD` adds descriptions, archive locations, and fetch/use commands. All three commands support `--json` and read the installed package's catalogue offline. Update the package to obtain a newer catalogue. | Bundle | Contents and use | |---|---| | `models_class1_presentation` | Full presentation predictor, including affinity, processing, and their combiner. The normal prediction bundle. | | `models_class1_pan` | Selected pan-allele affinity ensemble, for standalone affinity prediction. | | `models_class1_processing` | Standalone processing ensembles with and without N/C flanks. | | `models_class1` | Legacy allele-specific affinity models. The name does not mean the current general-purpose class I bundle. | | `*_unselected` | Candidate networks before ensemble selection. | | `*_variants`, `*_refined`, `*_experiments1` | Historical experimental configurations. | | `*_with_mass_spec`, `*_no_mass_spec`, `*_minimal` | Historical training variants or smaller subsets. | | `data_*`, `allele_sequences`, `analysis_predictor_info`, `random_peptide_predictions`, `cross_validation_class1` | Supporting data and analyses. | The presentation bundle contains its own affinity and processing components. The standalone bundles can be absent while full presentation prediction is ready to use. ## Compare new and historical weights The public **2.1.5, 2.2.0, and 2.2.1 packages used the same 2020 model archives**, registered under catalogue `2.2.0`. There is no separate `2.1.5` or `2.2.1` weight catalogue. The `2.3.0` models use the 2023 curated affinity snapshot and an updated processing training recipe; this does not mean every component gained new 2023 observations. See {doc}`release_training_recipe`. Fetch both presentation bundles once: ```shell mhcflurry downloads fetch models_class1_presentation --release 2.3.0 mhcflurry downloads fetch models_class1_presentation --release 2.2.0 ``` Use a CSV with `peptide`, `allele`, `n_flank`, and `c_flank` columns. An `allele` cell can contain a semicolon-separated MHC allele set. Run both models on the same rows; available N/C flanks are used by default: ```shell mhcflurry predict eval.csv --model-release 2.3.0 --out new.csv mhcflurry predict eval.csv --model-release 2.2.0 --out old.csv ``` For the corresponding comparison without flanks: ```shell mhcflurry predict eval.csv --model-release 2.3.0 --no-flanking --out new-no-flanks.csv mhcflurry predict eval.csv --model-release 2.2.0 --no-flanking --out old-no-flanks.csv ``` `predict-scan` also accepts `--model-release`. The selector uses a presentation bundle, including when `predict --affinity-only` requests only its affinity component. It selects installed weights; it does not download them automatically. `--models DIR` instead selects an arbitrary local predictor and cannot be combined with `--model-release`. These commands compare weights using the installed code. Reproducing a historical software version also requires that version in its own environment. See {doc}`release_model_evaluation` for the completed comparison across public software versions, NetMHCpan BA/EL outputs, and MixMHCpred on identical rows. ## Local storage and overrides ```shell mhcflurry downloads info mhcflurry downloads path models_class1_presentation --release 2.3.0 mhcflurry downloads url models_class1_presentation --release 2.3.0 ``` `info` starts with model availability, followed by historical resources and resolved configuration. Use `mhcflurry downloads --verbose info` for all default predictor paths and environment variables. The variables are **optional overrides**: `unset` means the default is in use, not that the local path is missing. On macOS the default root is `~/Library/Application Support/mhcflurry/4/`; each weight release has its own subdirectory. The `4` is the cache-layout version, not a model version. The presentation predictor is inside `models_class1_presentation/models`. `MHCFLURRY_DATA_DIR` changes the parent of the release directories. `MHCFLURRY_DOWNLOADS_CURRENT_RELEASE` changes the active catalogue. `MHCFLURRY_DOWNLOADS_DIR` selects an unversioned custom download directory. The `MHCFLURRY_DEFAULT_CLASS1_*` variables shown by `info` override individual predictor defaults. Explicit `--model-release` selects from the requested catalogue instead of those individual model-path overrides. With an unversioned custom directory, `--model-release` requires recorded source URLs matching the requested bundle; otherwise it asks you to use a versioned cache or select the local model explicitly with `--models`. A release selector must not silently load another release's weights. “Installed� means a directory exists. “Source matches� means its `DOWNLOAD_INFO.csv` URLs match the catalogue; it does not verify every file's integrity. Public model checksums are attached to the corresponding GitHub release. The `--release` option is supported consistently by `fetch`, `list`, `info`, `path`, and `url`. ## Why archive tags differ A catalogue collects many resources. Unchanged older resources keep their original URLs, so a current catalogue can include storage tags such as `pre-2.0` alongside `2.3.0`. Those tags describe where an archive was uploaded; they do not require prerelease code. Several catalogues can reference the same archive, and a single catalogue can include model and data archives from different dates. Inspect `releases DOWNLOAD` or `info DOWNLOAD` to see this mapping explicitly. ## Percentile calibration Released predictors already include calibration. For custom models, {doc}`shared_percent_rank_transforms` documents compact calibration, which uses a small validated knot representation instead of dense histogram tables. Calibration changes percentile mappings, not raw model scores or weights. Use a separate model copy and an appropriate background reference; do not fit calibration to evaluation labels. mhcflurry-2.3.6/docs/orchestrator.md000066400000000000000000000516141525677230600175520ustar00rootroot00000000000000--- orphan: true --- # Orchestrator architecture > Internals doc — for contributors. End users running > `mhcflurry class1-train-pan-allele-models` don't need to read this. ## The one-line summary The orchestrator owns the **run-wide resources** (parallel workers, env tuning); workers consume those and own their per-fit device state. Workers never build shared state and never set env knobs that affect other workers. If you find yourself adding orchestrator-shaped logic inside `fit()`, `train_model()`, or any worker function, stop and think whether it belongs in the orchestrator instead. ## Locus of control ``` orchestrator process training worker process ───────────────────── ─────────────────────── parse args (forked / spawned) load training data receive WORKER_CONTEXT once build WORKER_CONTEXT ─� │ hoist env knobs │ TORCHINDUCTOR_COMPILE_THREADS │ start worker pool ─┘ fit() builds device-resident AffinityDeviceTrainingData (peptide/allele/y/weights and random-negative slice live on the active torch device) collect results ◀────────────────── return predictor ``` The orchestrator does the **expensive, single-threaded preparation** ONCE. Workers do the **parallel, per-task** work N times. ## Tensor residency: device-resident affinity fit Affinity `fit()` is **device-resident**. One container, `mhcflurry.class1_affinity_training_data.AffinityDeviceTrainingData`, holds the row space `[random negatives | real training rows]` as torch tensors on the active device for the lifetime of one `fit()` call. The inner loop forms batches via `index_select` against the combined buffer — no per-batch host-to-device copies, no DataLoader workers feeding the affinity loop. Random-negative peptides are refilled in-place once per epoch into the top slice of the combined buffer, so the real-data block is never recopied. The pretrain-streaming path (`fit_streaming_batches`) is a separate code path that *does* use a PyTorch DataLoader with optional prefetch workers. That's controlled by `dataloader_num_workers`; 0 means in-process. It feeds the pretrain generator only and does not affect the affinity row layout above. ## Random negatives Random negatives are worker-local. `RandomNegativesPool` amortizes generation over `random_negative_pool_epochs`, but it does not try to share encoded pools between model fits. This preserves the historical behavior where independently trained workers sample independent negative peptides. The pool samples amino-acid indices directly on the worker's active torch device and writes fixed-length int8 rows. The model's embedding layer expands those indices to BLOSUM62 / PMBEC / physchem features during the forward pass. Peptides are always index encoded; deprecated dense-vector configuration values are accepted with a warning and do not restore the removed host-vector path. ## Parallelism backends Two backends, one CLI surface: - **Local** (`mhcflurry.parallelism`): `multiprocessing.Pool` of non-daemon workers. Workers can spawn DataLoader children for the pretrain streaming path. `resolve_local_parallelism_args` is the single pre-fork normalization point: it resolves `--max-workers-per-gpu=auto` and `--dataloader-num-workers=auto` without touching CUDA, caps local `--num-jobs` to GPU capacity when auto was requested, and hoists torch.compile's thread cap before the Pool starts. Fork workers inherit `WORKER_CONTEXT` through copy-on-write; spawn workers receive it once in their initializer, never once per queued task. Before a spawn pool starts, the planner deep-sizes that loaded context and rechecks current host RAM, so worker copies are capped even when the source CSV was compressed or torch compilation is disabled. Explicit numeric `--max-workers-per-gpu` keeps the historical CPU-overflow behavior. - **Cluster** (`cluster_parallelism.py`): one job per work-item submitted via `bsub` / `sbatch` / `sh`. Workers serialize WORKER_CONTEXT to NFS and deserialize on the worker side. Worker-side code (`train_model()`, etc.) is identical between backends. Only the orchestrator branches on `args.cluster_parallelism`. ## Coverage matrix The 2.3.0 modernization concentrates on the pan-allele affinity training + percentile calibration paths. Other components inherit shared backend selection and worker orchestration, but their data paths remain intentionally smaller. | | pretrain | finetune | select | calibrate | |---|---|---|---|---| | **affinity (pan-allele)** | streaming DataLoader + compact torch-index peptide batches | device-resident tensors + worker-local RN pool | filter ✓; pool/cache n/a (no fit) | filter ✓; pool/cache n/a | | **affinity (allele-specific)** | n/a | device-resident tensors + worker-local RN pool | filter ✓ | shares calibrate command | | **processing** | n/a | local+cluster worker pool | local+cluster worker pool | explicit background contexts; serial command | | **presentation** | n/a | parallel auto-sized feature generation + deterministic fit | n/a | filter ✓ (shares calibrate command) | All three percentile calibration paths use the shared compact/histogram implementations. Processing is allele-independent but still supports its own score-to-percentile calibration; it currently requires explicit background contexts and `--num-jobs 0`. See {doc}`shared_percent_rank_transforms`. ## Auto-tuned parallelism knobs Three knobs auto-derive from the box's hardware so the orchestrator keeps working when the recipe lands on a different tier. Shared hardware policy lives in `mhcflurry.parallelism`, `mhcflurry.workload_planning` and the memory-sizing helpers. The production recipes pass `auto` for each; pin a literal int only when intentionally re-benchmarking. The design boundaries and remaining follow-up work are recorded in {doc}`auto_sizing_audit`. ### `--max-workers-per-gpu auto` → `auto_max_workers_per_gpu` Picks per-GPU worker concurrency from the number of complete estimated worker working sets that fit in detected free VRAM after one shared reserve (10%, at least 1 GiB). There is no default worker hard cap. The working set is derived from model artifacts/parameters, gradients and optimizer state for training, resident encoded data, and the configured training minibatch where those facts are available; otherwise the workload profile supplies a conservative fallback. Free VRAM is read from `nvidia-smi` (no torch import — the parent process must not initialize CUDA before forking). The final job count is also bounded by available host RAM and vCPUs. In containers, host-memory sizing honors the current cgroup limit and usage rather than the physical host's `/proc/meminfo`. Spawn pools then refine the host cap from the loaded per-worker context and current available RAM; fork pools retain copy-on-write sharing and skip that copy multiplier. If no additional spawn copy fits safely, automatic local execution falls back to serial work in the parent instead of forcing one child. Before affinity or processing training starts, a one-worker resource probe runs one bounded epoch for each resource-distinct architecture with production-shaped data residency, minibatching, and validation. It records PyTorch allocator peaks, whole-process CUDA memory (including the CUDA context), and process peak RSS. A measured peak can tighten an automatic plan before the production pool starts, but can never change explicit CLI values. When torch compilation is enabled the same pass also primes its on-disk cache. Runtime validation, calibration, and inference do not divide live free VRAM by the worker count. That value already reflects whichever peer workers happened to initialize first and made batch sizing depend on startup order. Instead, every worker receives a fixed share of launch-time free device capacity after one shared reserve, subtracts its own resident process working set, and caps the remainder by live global headroom. The launch snapshot accounts for unrelated processes that already occupy a card. This keeps launch packing and runtime batches within the same resource envelope. Release training sets ``MHCFLURRY_FAIL_ON_TRAINING_BATCH_SHRINK=1``. The public API continues to warn and shrink an oversized affinity-training batch, but a release run fails because changing the effective minibatch changes the optimization problem and therefore the resulting weights. For the generic 4 GiB fallback, 80 GiB free fits 18 workers and 40 GiB fits 9; workload-specific estimates, host RAM, vCPUs, and the number of work items can reduce those capacities. Automatic CPU/MPS execution runs serially in the parent process; an explicit positive `--num-jobs` requests a local process pool. ### `--dataloader-num-workers auto` → `auto_dataloader_num_workers` Picks the per-fit-worker DataLoader prefetch child count from box capacity. This applies to the pretrain streaming path (`fit_streaming_batches`); the affinity `fit()` path is device-resident and ignores it. Inputs: detected CPU count, available RAM in GB, the post-cap fit-worker count (`--num-jobs` resolved by `resolve_local_parallelism_args`), and a hard cap (default 4 — env-overridable via `MHCFLURRY_AUTO_DATALOADER_HARD_CAP`). Heuristic: 1. `cpu_per_fit = vcpus // num_fit_workers` 2. `cpu_cap = cpu_per_fit // 2` — each DL child needs ~2 effective cores (1 for the main loop, 1 for queue/collate/copy). 3. RAM cap (when `ram_gb` is provided): assume ~2 GB baseline per fit-worker plus ~0.5 GB per DL child; `ram_cap = max(0, (ram_gb / num_fit_workers - 2.0) / 0.5)`. 4. Result: `min(hard_cap, cpu_cap, ram_cap)` clamped to ≥1, except when any input cap is 0 (oversubscribed mains, RAM exhaustion, or user override `MHCFLURRY_AUTO_DATALOADER_HARD_CAP=0`) in which case the result is 0 — i.e. in-process batching, no children. 5. Serial / no-fit-worker case: returns 0. Cross-checked configurations (see `test_auto_dataloader_num_workers_hardware_tiers`): | Box | vCPU | RAM | fit | resolved | |---|---|---|---|---| | 8×A100-80GB Verda | 176 | 400 G | 16 | **4** | | 8×A100-40GB | 176 | 400 G | 8 | 4 | | 8×L40S sweep box | 96 | 200 G | 16 | 3 | | Single A100-80G Lambda | 30 | 200 G | 2 | 4 | | Single A100-80G tight | 16 | 64 G | 2 | 4 | | Single T4 / RTX | 8 | 16 G | 1 | 4 | | Tight cluster node | 32 | 64 G | 16 | 1 | | Very tight (8v / 8fit) | 8 | 16 G | 8 | **0** | | RAM-starved (32G / 16fit) | 176 | 32 G | 16 | **0** | | Serial / CPU | — | — | 0 | **0** | **The heuristic is hardware-only by design** — `train_row_count` and `random_negative_rate` do not enter the formula. Per-batch CPU work is bounded by `minibatch_size`, not total dataset rows. ### `--num-jobs` (auto-derives from MWPG × GPUs) `--num-jobs` defaults to `auto`, which resolves to `gpus × max_workers_per_gpu` via `mhcflurry.parallelism.auto_num_jobs(num_gpus, max_workers_per_gpu)` once `auto_max_workers_per_gpu` has resolved. Pass an integer to pin it. ### Cross-model coverage | Model | `--max-workers-per-gpu auto` | `--dataloader-num-workers auto` | Notes | |---|---|---|---| | Pan-allele affinity | ✓ | ✓ (pretrain only) | Default in release recipe; affinity `fit()` is device-resident | | Allele-specific affinity | ✓ | n/a | Its in-memory `fit()` path does not use DataLoader children | | Processing | ✓ | n/a | Parallel model fits; the processing network has no DataLoader pretraining path. | | Presentation | ✓ | n/a | Parallel feature generation followed by deterministic fitting. | ### Env overrides | Env var | Default | Effect | |---|---|---| | `MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB` | 4.0 generic fallback | Expert per-worker VRAM override; workload-specific estimates normally replace the fallback. | | `MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_HARD_CAP` | unset | Optional expert ceiling for workers per GPU. | | `MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB` | (auto-detect) | Pin free VRAM (CSV per GPU); for tests / hidden-`nvidia-smi` launchers | | `MHCFLURRY_AUTO_DATALOADER_HARD_CAP` | 4 | DL child cap for `auto_dataloader_num_workers` | ## Env knobs vs CLI flags A persistent question: when does a setting belong on `argparse` vs the environment? **Rule of thumb:** - **CLI flag** when the orchestrator owns it and propagates it. (Examples: `--max-workers-per-gpu`, `--random-negative-pool-epochs`, `--num-jobs`.) - **Env var with optional CLI relay** when the consumer is inside `fit()` or another worker-private code path, and the orchestrator only centralizes policy. (Examples: `MHCFLURRY_TORCH_COMPILE`, `MHCFLURRY_TORCH_COMPILE_LOSS`, `TORCHINDUCTOR_COMPILE_THREADS`.) The orchestrator may **hoist** env vars: read its own args, compute a sensible default, and put a concrete value in `os.environ` so workers inherit it. `resolve_local_parallelism_args` calls `hoist_torchinductor_compile_threads` for local runs — it sizes the inductor compile pool against the resolved `--num-jobs` so N workers don't each spawn `cpu_count()` compile threads. If `TORCHINDUCTOR_COMPILE_THREADS=auto`, the orchestrator replaces it with a numeric value before any worker sees it. ## Torch Compile Warmup `torch.compile` is worker-local: the Python wrapper, graph guards, and CUDA module handles cannot be shared across processes. What can be shared on one machine is the Inductor/Triton on-disk cache. For local training, a one-worker resource probe runs a bounded epoch for each distinct resource configuration before production workers start. When compilation is enabled, it also primes that cache. Probe model weights are discarded; they do not count as completed training work. Cluster workers are different: they may land on different nodes, so mhcflurry does not try to share Inductor cache across a cluster. Each cluster worker process auto-sizes `TORCHINDUCTOR_COMPILE_THREADS` locally when the env is unset or `auto`. If a scheduler packs multiple mhcflurry work items onto one node, set `MHCFLURRY_CLUSTER_WORKERS_PER_NODE` so each process uses a fair share of cores. Compiled losses are enabled by default when `MHCFLURRY_TORCH_COMPILE=1` and can be disabled with `MHCFLURRY_TORCH_COMPILE_LOSS=0` or `--torch-compile-loss 0`. CUDA workers run a one-op autograd warmup before compiling losses to avoid the PyTorch 2.4 / Triton `invalid device context` failure in the first compiled backward kernel. ## What is NOT the orchestrator's job - Compiling models (`torch.compile`). Compilation is per-network and happens inside `fit()`. The orchestrator only sizes the compile worker pool via env. - Calling `predict()` on individual alleles. The orchestrator builds work items; workers iterate. - Validating data shape consistency between work items beyond what the worker-side fit/data constructors already check. ## Recipes ### Adding a new pre-fork resource 1. Add a `_initialize_(args, all_work_items)` helper near the existing ones in `train_pan_allele_models_command.py`. 2. Stash the result in `WORKER_CONTEXT[""]`. 3. Document the lookup key. Workers retrieve via `constant_data[""]` (forked workers inherit; spawned workers receive one initializer payload per process; cluster workers receive the serialized context through the shared filesystem). 4. Add a `getattr(args, "", None)` gate so the helper is opt-in on the CLI side. ### Adding a new env knob 1. Decide: orchestrator-set or worker-private? 2. If orchestrator-set: add a `_hoist_(args)` helper that reads args + system info and `os.environ.setdefault(...)`s the value. Document the rule the orchestrator applies. 3. If worker-private: just read it from `os.environ` inside `fit()` or wherever it's consumed. Document it in `RELEASE_NOTES_.md`. ### Adding a new worker-side filter 1. Drop into `mhcflurry/common.py` (e.g., `filter_canonicalizable_alleles`). 2. Apply at every iteration site that could trip on the bad input. The 2.3.0 application sites are calibrate (affinity + presentation paths) and select (pan-allele + allele-specific paths). ## Fit-time data flow Affinity training has two configuration knobs that are deliberately configured separately. Do not collapse these into one. ### 1. Peptide amino-acid vector lookup Controlled by the model hyperparameter `peptide_amino_acid_encoding_torch`. When enabled (the default), peptide strings are encoded as `(N, L)` integer amino-acid indices. The model owns a frozen torch buffer for the configured vector encoding (`BLOSUM62`, `PMBEC`, `simons1999_contact`, or combinations), moves that buffer with `.to(device)`, and widens indices to `(N, L, V)` inside `forward()` using `torch.nn.functional.embedding`. This path is device agnostic: CUDA, MPS, and CPU all execute the same torch embedding operation on the active device. It is model semantics, not DataLoader behavior. `peptide_amino_acid_encoding_torch=False` is a deprecated compatibility value: it logs a warning and still uses index encoding. The former dense-vector peptide path has been removed. The saved fixed-vector encoding determines the embedding table; loading old weights preserves that representation. ### 2. Pretrain DataLoader process parallelism Controlled by the model hyperparameter `dataloader_num_workers`. This applies to the pretrain streaming path (`fit_streaming_batches`) only. It is pure process-count policy for the pretrain data pipeline: | value | meaning | |---|---| | `0` | build batches in the training worker process | | `>0` | spawn that many DataLoader child processes per training worker | The release CLI resolves this process count separately from model encoding. On a local 8-GPU run with `NUM_JOBS=16`, `dataloader_num_workers=1` means up to 16 extra fit-local DataLoader children while pretrain epochs are active; `2` means up to 32. The thread-budget helper accounts for this when sizing `OMP_NUM_THREADS`, `MKL_NUM_THREADS`, and `OPENBLAS_NUM_THREADS`. Caller-provided values remain authoritative and are not replaced by the planner's uniform runtime limit. For serial (`num_jobs=0`) execution, an auto-owned budget is applied directly to the current native and PyTorch pools because there is no worker initializer. The affinity `fit()` path does not use a DataLoader and therefore ignores this hyperparameter. ### Component consistency The `Class1NeuralNetwork` affinity component model owns both hyperparameters above, so allele-specific affinity models, pan-allele affinity models, and affinity ensembles resolve the same internal rules after config load. Missing keys in old component configs are filled from defaults (`peptide_amino_acid_encoding_torch=True`, `dataloader_num_workers=0`). Processing models do not use the affinity `fit()` row layout and therefore have no `AffinityDeviceTrainingData`. ## rsync hygiene (laptop ↔ remote training box) `runplz` stages the working tree on the box for every launch, and the run's `out/` directory returns to the laptop on completion. Two asymmetries to know about: - **Up direction:** runplz 3.24.31 uses Git-aware staging, HUP-safe detached bootstraps, shared backend retries, and retryable idempotent SSH preparation. Tracked files and intentional untracked inputs are staged, while ignored directories such as `brev_runs/`, `results/`, `.venv/`, and `out/` are excluded without a workstation-specific relocation or symlink workaround. The release wrapper requires exactly 3.24.31 and rejects a dirty editable runplz checkout or a source/distribution version mismatch. - **Down direction:** the post-run rsync has NO excludes — everything under `out/` returns. Keep large throwaway run artifacts outside `out/` unless they are meant to ship back. ## Pointers to code - Random-negative planning and pooling: `mhcflurry/random_negative_peptides.py` - Affinity device-resident row space: `mhcflurry/class1_affinity_training_data.py` (`AffinityDeviceTrainingData`) - Pseudogene/null filter: `mhcflurry/common.py` (`filter_canonicalizable_alleles`) - Worker pool sizing: `mhcflurry/parallelism` (`auto_max_workers_per_gpu`, `resolve_max_workers_per_gpu`) - Compile-thread hoist: `mhcflurry.parallelism.hoist_torchinductor_compile_threads` - Cluster fork point: `mhcflurry/cluster_parallelism.cluster_results` ## Known asymmetries (deliberate) These show up to readers as "why is this only done in pan-allele?" The answer in each case is "the other components don't yet need it and adding it would be feature work, not a fix": - **`torch.compile`** is off by default everywhere; opt-in via `MHCFLURRY_TORCH_COMPILE=1` or `--torch-compile 1`. When enabled, the shared local-parallelism layer owns compile-thread sizing and local one-worker cache warmup for affinity and processing trainers. Presentation fitting is a separate model family and does not enter this central torch-training path. mhcflurry-2.3.6/docs/presentation_percentile_calibration.md000066400000000000000000000150141525677230600243210ustar00rootroot00000000000000# Presentation percentile calibration New calibration now uses the shared `CompactPercentRankTransform`, also used for affinity and processing. See [shared APIs and compatibility](shared_percent_rank_transforms.md). The automatic budget starts at 64 and permits 128 only after a meaningful label-free background-validation improvement. Historical calibrations still load as `HistogramPercentRankTransform`, without conversion or refitting. ## Experimental compact-curve comparison `mhcflurry eval presentation-percentiles` compares histogram mappings with continuous curves, without loading or retraining networks. The original experiment included 64/128/256 knots; the current production policy permits only 64/128. Specify those two budgets explicitly for a new comparison: ```shell mhcflurry eval presentation-percentiles fit \ --reference-dir /path/to/cached-reference --out /path/to/new-comparison \ --knots 64 128 mhcflurry eval presentation-percentiles evaluate \ --calibration-dir /path/to/new-comparison \ --predictions /path/to/predictions_with_flanks.csv.bz2 --mode with-flanks mhcflurry eval presentation-percentiles evaluate \ --calibration-dir /path/to/new-comparison \ --predictions /path/to/predictions_without_flanks.csv.bz2 --mode without-flanks mhcflurry eval presentation-percentiles plot \ --calibration-dir /path/to/new-comparison ``` The reference directory contains `reference_peptides.csv.bz2` and one aligned `reference_scores_*.npy` vector per allele. Prediction tables contain `sample_id`, `hla`, `hit`, and `a_`/`b_` presentation score/percentile columns; side `a` is the candidate and side `b` is the contextual public baseline. This experimental command splits the reference 60/20/20 by unique peptide, keeping all allele queries for a peptide together. Knot count is selected using background validation accuracy, not presentation labels. Its separate test split checks calibration. This is distinct from the production helper's 80/20 selection/refit policy and minimum-count safeguards; see {doc}`shared_percent_rank_transforms` for that rule. The experiment command's historical default still includes 256, so use `--knots 64 128` as shown above. Full-reference refits are then compared on the frozen presentation rows. Outputs retain the splits, counts at percentile cutoffs, versioned curves, micro/per-sample metrics, tie-neutral PPV, ranking audits, transformation timings, and joinable prediction arrays, plus a report and PNG/SVG figures. The experimental curves interpolate in logit-score/logit-survival coordinates, using weighted midranks at distinct reference scores. End slopes estimated from up to 32 distinct reference scores provide explicitly modeled extrapolation. Extreme extrapolated percentiles are not empirically established probabilities. Existing raw-score ties and floating-point saturation cannot be recovered by this mapping. The original experiment was isolated; its generic compact implementation is now used by new predictor calibration and versioned loading. ## Historical tail-adaptive histogram method With no explicit `bins`, `method="histogram"` calibration retains up to 10,000 uniform-quantile bins and adds up to 10,000 bins in the top 1% of calibration scores. The base grid is bounded by the finite reference count. Additional quantiles are spaced logarithmically in upper-tail probability, down to `1 / N` for `N` finite calibration scores. Their count is also capped by the number of calibration observations in that tail. Duplicate score edges are removed. Uniform quantiles can place thousands of informative high-scoring evaluation peptides in one percentile bin even though their raw scores are distinct. Preserving the original broad grid also retains the resolution needed when the presentation combiner's score range is compressed near zero. This remains available for reproducing the earlier binning experiment. Neither method changes network predictions or any existing saved calibration merely by loading it. No calibration rule is fitted to evaluation labels. ## Calibrating a predictor The existing `mhcflurry-calibrate-percentile-ranks` command uses the new default automatically for `--predictor-kind class1_presentation` (compact by default; `--percentile-method histogram` reproduces the earlier tail-bin method). Re-run the original calibration recipe on a separate copy of the predictor, retaining the same calibration reference policy, random seed, and source provenance. For full candidates, that recipe is in `scripts/training/pan_allele_release_full.sh` and the saved `GENERATE.sh`. The calibration command writes into `--models-dir`; do not point it at the public baseline or the only preserved copy of the old candidate. An old `percent_ranks.csv` does not contain the raw calibration scores inside each bin. Merely subdividing that table would invent within-bin CDF detail. Regenerate calibration predictions when those scores were not retained, then repeat both with-flanks and without-flanks held-out comparisons. More bins cannot resolve missing calibration-tail support, true raw-score ties, or clipping beyond the calibration maximum. ## Historical histogram experiment verification The earlier histogram regression experiment used an independent million-score reference and 4,000 evaluation scores in a rare upper-tail interval. Its AUPRC was 0.93023 for raw scores, 0.50025 with the old uniform-quantile grid, and 0.92849 with the tail-adaptive grid. These are historical synthetic results, not a recalibrated release-candidate performance claim. The current default calibration regression tests exercise compact interpolation instead. Tests also cover preservation of all base-grid edges, bounded extra-bin count, small reference sets, repeated/nonfinite values, monotonicity and endpoint behavior, compressed scores, explicit bin overrides, and saved-table loading. The archived real-candidate comparison found that 64 compact knots recovered the raw presentation ranking on the frozen with-flanks cohort: macro AUPRC 0.337292 and macro PPV@N 0.387948 (using tie-neutral PPV), with the same ranking metrics at 128 and 256 knots. This used the experiment's independent cached background, not a fresh calibration on the complete release-policy reference. The artifact directory is `experiments/20260909T023206Z-compact-presentation-percentiles-comparison-9778c6256b7e`. Neither compact nor histogram calibration can turn those raw rankings into both metrics above 0.4. PPV@N's row-order tie-breaking is a [separate evaluation issue](https://github.com/openvax/mhcflurry/issues/405); it is not changed by this fix. mhcflurry-2.3.6/docs/probabilistic_processing_matching.md000066400000000000000000000050031525677230600237560ustar00rootroot00000000000000# Processing negative matching The maintained processing-data workflow uses seeded random matching without replacement (`sample-length-affinity-random-without-replacement-v2`). A negative peptide can be selected only once within a sample, including when the same sequence maps to multiple proteins. It may be used in another sample with a different MHC. ## Matching contract Hits and negatives share a sample and peptide length. The absolute difference in predicted log10 affinity must not exceed the configured caliper (at most 0.25). Eligible negatives from the same source protein are preferred. Matching draws uniformly from the currently available eligible preferred pool, then from the remaining sample/length pool, with a seeded random assignment order. Augmenting paths repair competing assignments so an early draw cannot make a feasible pool appear insufficient. This is randomized sequential matching; it does not sample uniformly from all possible complete matchings. If no complete assignment exists, preparation saves the failure and expands the scored pool. It never reuses negatives, widens the caliper, or drops hits to finish. Saved metadata identifies the affinity reference, policy, seed, caliper and ratio. Resume validates these inputs and rejects assignments from another policy. See {doc}`processing_preparation_acceleration` for artifacts and execution. ## Interpretation and evaluation The original [MHCflurry processing model](https://doi.org/10.1016/j.cels.2020.06.010) used strong-binder filtering. Affinity matching instead controls predicted binding more locally. Neither procedure guarantees removal of every binding-associated signal, nor turns presentation labels into direct measurements of processing. Training defaults to one matched negative per hit. Processing-specific evaluation can use the same matcher at another ratio. The public release presentation benchmark has its own frozen negative cohort; this matcher does not redefine it. Every comparator in a comparison must receive identical saved rows and labels. AP values from different negative policies or ratios are not directly comparable. ## Validation Regression tests cover uniqueness within samples, reuse across samples, seeded reproducibility, caliper boundaries, matching feasibility against independent small-graph solutions, metadata validation and adaptive expansion. These checks establish the sampler's contract, not improved trained-model accuracy. Changes to the training policy require separate held-out component and full-model evaluation. mhcflurry-2.3.6/docs/processing_cleavage_boundary_experiment.md000066400000000000000000000045701525677230600252000ustar00rootroot00000000000000# Cleavage-boundary processing models ## Boundary inputs Does sequence context spanning the two peptide boundaries add antigen-processing signal after controlling for peptide--MHC binding affinity, and can an explicit boundary-aligned architecture recover that signal more reliably than the legacy full-sequence convolution? The boundary inputs intentionally contain residues on both sides of each cut, using standard protease cleavage-site orientation. The supported window variants are: - Compact N: `n_flank[-5:] + peptide[:2]` (`P5...P1 | P1'P2'`) - Compact C: `peptide[-2:] + c_flank[:5]` (`P2P1 | P1'...P5'`) - Extended N: `n_flank[-5:] + peptide[:5]` (`P5...P1 | P1'...P5'`) - Extended C: `peptide[-5:] + c_flank[:5]` (`P5...P1 | P1'...P5'`) The phrase "flank branch" must not be used for this transform because the within-peptide residues are part of the cleavage context. Unavailable external context is encoded with the existing `X` unknown token. This covers source-protein termini and prediction calls without supplied flanks. During training only, independently replace the complete five-residue external N or C segment with `X` with a configurable probability. Within-peptide residues are preserved. This context dropout is distinct from hidden unit/channel dropout and must be recorded separately. ## Architecture and evaluation The opt-in boundary architecture retains a full-peptide base path and adds two separate boundary-aligned residual paths. Each residual path receives its crossed-boundary window. Its contribution to the final logit is initialized to zero, so initial predictions come from the base path. See {doc}`release_training_recipe` for the 5x5 boundary family selected for 2.3.0. For processing-specific comparisons, use the same sample/length/affinity-matched risk sets for all predictors and retain the frozen public affinity reference. `mhcflurry eval processing-flank-ablation` can compare real, masked and shuffled contexts with unchanged weights. These diagnostics differ from end-to-end presentation ranking and do not establish that independently selected flank/no-flank ensembles constitute a controlled ablation. Preserve input and model hashes, row identities, matching assignments, seeds and per-patient predictions. Report AP, PPV@N and AUROC with paired patient intervals, and evaluate the complete presentation model separately before promoting a processing change. mhcflurry-2.3.6/docs/processing_hyperparameter_campaign.md000066400000000000000000000330611525677230600241520ustar00rootroot00000000000000# Processing hyperparameter campaign The maintained sweep compares processing-specific recipes; it does not assume that affinity's winning optimizer transfers. All new fits use a frozen affinity/length-matched table and preserve fold and reference identities. Development results and the repeatedly inspected release benchmark are distinct. ## Maintained commands Use `mhcflurry train processing-hyperparameter-sweep --design kernel-width` for the six-width, two-family, four-fold comparison (48 networks). The existing `processing-kernel-sweep` command remains an alias for the width workflow. Use `mhcflurry train processing-hyperparameter-sweep --design training-recipe` for the optimizer/initialization/batch factorial (64 networks): - Keras-compatible Adam versus native PyTorch RMSprop. - Glorot, orthogonal only, pre-LSUV and post-LSUV. - Minibatches 512/1024, two architecture families and two paired folds. The recipe screen holds width 11, ReLU, 512 filters, dropout 0.5, learning rate 0.001 and L1/L2 zero fixed. The width screen retains its original L1=1e-6. Thus its width-11 control is not silently reused as a zero-L1 recipe fit. The families are an external-flank CNN and a whole-peptide CNN plus 5x5 boundary branches, not a fixed mixture of networks. Required arguments include `--out`, `--train-data`, `--public-root`, `--release-holdout-dir` and `--source-commit`. Use `--evaluation none` for development screening. `--prepare-only` writes the exact design without training. `--folds-from` inherits the first two folds for the recipe screen; pass the same frozen table as `--train-data` to preserve all numerical metadata exactly. ## Checkpoints and initialization `save_all_checkpoints=True` retains independent best-loss and terminal processing weights, plus best-AP when ranking monitoring is enabled. `restore_best_weights=True` chooses the best state for `checkpoint_metric` (`val_loss` by default; opt-in `val_macro_ap`). Checkpoints use NPZ sidecars; they do not enter manifest JSON as weight arrays. Loading a referenced missing checkpoint fails. Refitting without retention clears old references. Older predictors still load without checkpoint sidecars, and missing historical terminal states are not synthesized. `monitor_validation_ranking=True` records equal-sample AP and PPV@N after every epoch. It requires explicit sample-disjoint training/stopping-validation masks and sample IDs. Each validation sample must contain both labels. AP uses grouped score ties; PPV breaks ties by original input-row order. Exact AP ties retain the earliest epoch. Inner-best AP is saved as `best_ap`, separately from `best` (loss) and `terminal`. `checkpoint_metric=val_macro_ap` enables this monitoring and chooses that state when restoration is enabled. Patience remains based on validation loss, so retained-state comparisons share one training trajectory. Historical defaults and predictions remain unchanged. Fit metadata explicitly records the restored policy, best loss/ranking epochs, and inner sample identity. ## Focused width / optimizer / checkpoint confirmation Use `mhcflurry train processing-hyperparameter-sweep --design ranking-confirmation` with `--folds-from FROZEN_TABLE --train-data FROZEN_TABLE --evaluation none`. This creates 24 fits: legacy 5-aa CNN, widths 11/13/15, Adam/Keras versus RMSprop/PyTorch and four paired folds. Glorot, batch 512, ReLU, 512 filters, dropout 0.5, no normalization, fixed BLOSUM62 and zero L1/L2 are held constant. All three checkpoint states have joinable outer-fold predictions and separate per-sample and pooled-per-fold metric tables. Primary inference uses inner-best AP; outer evaluation cannot select epochs. The source generator exposes `processing_candidate_hyperparameters` for this explicit shortlist; it is not a global default change or a final release recipe. Set `PROCESSING_RANKING_CONFIRMATION=1` in the runplz Modal launcher, together with the frozen table, absolute deadline and timeout at most four hours. This mode skips both the width and full recipe factorials. It is incompatible with `PROCESSING_RECIPE_AFTER_WIDTHS=1`. Training tables and independent checkpoint files survive completed conditions; the budget is never extended by retries. New experiments require compact selection and a separate full-presentation evaluation before release, regardless of development improvements. Analyze collected condition-level checkpoint tables with `mhcflurry eval processing-confirmation-analysis --experiment RUN_DIR --out NEW_DIR`. The command checks identical fold/sample/count identities across every state and condition, writes paired sample-bootstrap intervals and figures, and only exports `candidate_hyperparameters.yaml` after all six conditions are complete and the declared development gate passes. The gate compares inner-best-AP candidates against Adam/width-11 best-loss control: positive AP and PPV changes, 95% paired AP lower bound above zero, PPV lower bound above -0.002, and every fold's pooled AUROC/AP/PPV changes at least -0.002. These are exploratory intervals, not corrected for repeated screening or study dependence. A recipe export is not a model release or a substitute for presentation validation. `initialization_method` has explicit `none`, `orthogonal`, `lsuv_pre` and `lsuv_post` values. `none` preserves the configured kernel initialization. Non-default methods apply to fresh fits; continued fitting does not reinitialize a trained network. Calibration uses at most `initialization_batch_size` training rows (default 512), never stopping-validation rows. Their fit-input row indices are saved. Eligible layers are boundary hidden layers, the main convolution, and hidden pointwise convolutional heads, in forward order. Scalar heads and output/gating weights are protected. Pre/post refer to before/after the configured activation, before normalization or dropout. Variance excludes positions beyond actual configured input extent; missing-context X rows within that extent remain. Dropout is disabled during initialization. Non-convergence fails explicitly and restores the pre-initialization parameters. Diagnostics include each layer's variance and iteration count. See the [LSUV paper](https://arxiv.org/abs/1511.06422). ## Recorded development result The complete panel (`processing-ranking-confirmation-20260909`; runplz run `a8889cc8dfbb4f4390d4ceb153ad81e1`; source `9778c625`; 24 fits in 65 minutes on one A100-40GB) promoted `legacy_5aa__rmsprop_pytorch__k13` with inner-best-AP weights. `confirmed_processing_candidate_hyperparameters()` in `scripts/training/generate_processing_recipe.py` names that recipe together with the run, source and decision hashes; it equals the exported `candidate_hyperparameters.yaml`. Macro metrics average four paired folds within each of 37 held-out samples. Differences are against Adam/Keras width 11 best-loss weights (macro AUROC 0.7717, AUPRC 0.7555, PPV@N 0.7001), using 10000 paired sample-bootstrap draws with seed 42. | Inner-best-AP condition | AUROC | AUPRC | PPV@N | AUPRC difference | PPV@N difference | Gate | |---|---:|---:|---:|---:|---:|---| | Adam/Keras, width 11 | 0.7810 | 0.7641 | 0.7128 | +0.0086 [0.0043, 0.0126] | +0.0127 [0.0085, 0.0169] | pass | | Adam/Keras, width 13 | 0.7857 | 0.7671 | 0.7162 | +0.0116 [0.0048, 0.0182] | +0.0162 [0.0105, 0.0219] | pass | | Adam/Keras, width 15 | 0.7838 | 0.7666 | 0.7153 | +0.0111 [0.0043, 0.0176] | +0.0153 [0.0085, 0.0216] | pass | | RMSprop/PyTorch, width 11 | 0.7798 | 0.7629 | 0.7090 | +0.0074 [0.0021, 0.0128] | +0.0089 [0.0035, 0.0144] | fail: pooled fold AUROC -0.0039, AUPRC -0.0074 | | RMSprop/PyTorch, width 13 | 0.7870 | 0.7701 | 0.7155 | +0.0146 [0.0085, 0.0207] | +0.0154 [0.0101, 0.0206] | pass, promoted | | RMSprop/PyTorch, width 15 | 0.7869 | 0.7688 | 0.7146 | +0.0133 [0.0076, 0.0191] | +0.0145 [0.0088, 0.0203] | pass | The retained-state choice is the largest single effect. In all six conditions inner-best-AP and terminal weights outscore best-loss weights on AUPRC and PPV@N; best-loss epochs ranged from 4 to 34 and inner-best-AP epochs from 14 to 44. Within the control, switching states alone gains +0.0086 AUPRC. Terminal weights scored similarly but were never eligible, by design. Widths 13 and 15 lead width 11 with either optimizer, but the promoted recipe's AUPRC margin over the other passing conditions (0.001 to 0.006) lies inside every paired interval; it is the recorded point-estimate tie-break, not a resolved difference. These are single-fit, four-fold development scores on one training trajectory per fold, without multiple-screening or study-cluster correction. They do not change public downloads, default hyperparameters or predictions, and they say nothing about ensembles or presentation. Compact selection on a common held-out panel and the separate presentation gate remain required before any release use; family and width diversity is preserved for that step. ## Recovery and outputs `--resume-from PRIOR_WIDTH_RUN` copies complete conditions and frozen folds to a separate run after checking input/design identity. Incomplete conditions stay in the old run and are reinitialized in the new one. Every copied file is hashed. Existing recovery artifacts must match those hashes on resume. A lossless CSV parser preserves saved reference scores; strict fold checks are not relaxed. Every new condition saves epoch losses, optimizer steps, epoch timing, stop reason, initialization diagnostics, best/terminal weights, and context-joinable per-member predictions on each model's held-out fold. Root summaries give each sample equal weight after averaging repeated folds within sample. These one-decoy validation AP values are not comparable to ten-decoy processing or full-presentation AP levels. Four/eight-member selection still requires a common held-out panel unseen by every member; this screen does not perform it. The runplz Modal launcher accepts `PROCESSING_KERNEL_TRAIN_DATA` and `PROCESSING_KERNEL_PRIOR_SWEEP` to reuse completed preparation and fits. `PROCESSING_KERNEL_EVALUATION=none` is the default. `PROCESSING_RECIPE_AFTER_WIDTHS=1` queues the factorial behind width completion on the same single GPU. It requires an absolute `MHCFLURRY_EXPERIMENT_DEADLINE_EPOCH`; command descendants are terminated at that deadline, without marking the stage complete. Set an absolute deadline within the allocated compute budget, leaving margin for teardown. The launcher caps each function timeout at 15.5 hours; retries must respect the same deadline. The launcher writes width figures first, then a combined `campaign-all-figures.pdf` after the recipe screen. Raw inputs and prediction caches remain independently collectible even if a later stage fails. A generated PDF is not a substitute for inspected figures, paired uncertainty, four-fold confirmation, compact selection and an end-to-end presentation gate. ## Analyze an incomplete or completed recipe screen Run the maintained read-only analysis against a collected snapshot from one run: ```bash mhcflurry eval processing-recipe-analysis \ --experiment collected/recipe_sweep/experiment.json \ --metrics collected/recipe_sweep/validation_per_sample.csv \ --out experiments/recipe-analysis-snapshot ``` The output directory must be new or empty. The command preserves unreported conditions as pending and rejects incomplete folds, mismatched sample cohorts or counts, nonfinite metrics, and uncontrolled hyperparameter differences. It averages folds within each sample, then bootstraps samples jointly for each one-factor contrast. It does not average across unmatched factorial cells to claim an overall optimizer or initialization effect. Optimizer comparisons include their implementation (for example, Adam/Keras versus RMSprop/PyTorch). Outputs include a PDF and page PNGs, condition means, design completion status, paired contrasts, per-sample differences, and a provenance manifest with input and analysis-source hashes. Gray plot cells mean pending, not poor performance. Pareto flags describe AUPRC/PPV point estimates only; they are not significance tests, ensemble selections, or release acceptance. Intervals are exploratory, conditional on trained fits, and uncorrected for screening or study clustering. The shared `mhcflurry train plot-loss-curves` command recognizes processing CNN architecture identities and convolutional L1/L2 regularization. Its curves and `final_loss`/`final_val_loss` columns describe final training epochs, even when inference restores an earlier checkpoint. Separate best-epoch, best-validation- loss, and checkpoint-policy columns record that distinction. Historical fits without explicit restoration metadata report an unknown checkpoint policy. ## Cached within-fold ensemble diagnostics `mhcflurry eval processing-fold-ensembles --ensembles ensembles.json --out NEW_DIR` accepts a JSON object mapping ensemble names to ordered checkpoint prediction cache paths (relative to that JSON). It verifies each cache checksum/sidecar, training-table fingerprint, sample/row/context/label identity, and one distinct member per condition per fold. Every mean uses only the models from the row's held-out fold. Best and terminal are reported separately by default; use `--checkpoint-policy best` to request only the primary policy. Outputs preserve averaged predictions, fold-to-member identities, per-sample and pooled-per-fold metrics, sample means, provenance and source. Pass the sample means to `mhcflurry eval paired-sample-metrics` for paired plots. This is a no-training, no-inference development diagnostic of multiple fold-specific ensembles. It does not measure one fixed ensemble spanning different folds, select members, or establish release acceptance. A final fixed ensemble still requires a common panel unseen by every one of its members. mhcflurry-2.3.6/docs/processing_kernel_sweep.md000066400000000000000000000120251525677230600217430ustar00rootroot00000000000000# Processing kernel-width experiment ## Workflow Train six widths (5, 7, 9, 11, 13, 15) in each of two unmixed families: the legacy 5-aa-flank CNN and a peptide-only CNN with separate 5-outside/ 5-inside N/C boundary branches. Four paired sample folds per condition give 48 networks. Keep 512 filters, ReLU, dropout 0.5, Glorot initialization, Keras-compatible Adam, batch 512, patience 20 and seed 42 fixed. Restore the best validation weights. This is not the final broad-grid ensemble selection. Use one frozen, length/affinity-matched training table, excluding release holdout samples. Do not reuse the earlier random-negative training table. Retain candidate-pool scores, matching assignments, data/model/source hashes, fold membership, all epoch losses, and per-fold validation predictions. Known flanks are adjacent to the actual peptide, including short peptides; there is no gap to a maximum-length peptide slot. Missing flank residues and convolution context beyond the supplied five residues are encoded as X. For the boundary family, external residues enter only the boundary branches; the central CNN sees X outside the peptide. Missing context is not evidence of a true protein terminus. No fabricated BOS/EOS token is introduced. The outer-padding choice is an opt-in serialized hyperparameter; old configs retain zero padding and unchanged predictions. Validation covers every requested width, short/long peptides, full/partial/missing flanks, convolution alignment, and save/load compatibility before training. Rank widths within each family using paired sample-held-out predictions (macro AUPRC and PPV@N, with AUROC/micro safeguards). Preserve all conditions; do not label the release holdout an unbiased final test after using it to choose an architecture. Report actual public weights as a reference, not a matched-data control: these new fits also change negative policy and checkpoint restoration relative to historical runs. Plot metrics against width, per-sample deltas and epoch traces; keep prediction rows joinable to external predictors. Run on one Modal A100 through runplz, using persistent volumes and a bounded timeout. Keep an exact source archive and durable commands/logs. This experiment does not publish weights. ## Maintained command ```bash mhcflurry train processing-kernel-sweep \ --out experiments/processing-kernels \ --train-data matched/train_data.csv \ --public-root /path/to/downloads/2.2.0 \ --release-holdout-dir /path/to/release_holdout \ --source-commit COMMIT --gpus 1 --num-jobs 1 ``` The Modal launcher additionally generates the fresh matched table from the cached hit annotations and frozen public affinity predictor. It preserves scored candidate pools even if matching fails; failure never selects legacy random negatives. Set `PROCESSING_KERNEL_RUN_ID`, `PROCESSING_KERNEL_SOURCE_COMMIT`, and `PROCESSING_KERNEL_SOURCE_SHA256`, upload the exact source tarball to `/inputs/RUN_ID/source.tar.gz` in the `mhcflurry-230-final-weights` volume, then launch from that tarball's extraction: ```bash runplz modal scripts/training/launch_processing_kernel_sweep_modal.py \ --detach --outputs-dir /path/to/local/experiment runplz status --outputs-dir /path/to/local/experiment runplz collect --outputs-dir /path/to/local/experiment ``` The receipt identifies the run-specific remote output path; no whole-volume download is needed. Inside it, `processing.shared` retains matching inputs and outputs; `kernel_sweep` holds models, epoch-loss figures, member predictions, sample/fold metrics, and width plots. Training validation uses one matched negative per hit; release evaluation uses ten. Do not compare their AUPRC levels directly. The four folds can overlap in held-out samples: summaries average folds within sample before averaging samples, not independent-fold significance. Padding issue: [#404](https://github.com/openvax/mhcflurry/issues/404). The zero-padding behavior follows the [PyTorch Conv1d API](https://docs.pytorch.org/docs/2.14/generated/torch.nn.Conv1d.html). ## Resume preparation Use `mhcflurry train processing-data --resume` for the same output or `--resume-matching-dir PRIOR/train_data.csv.matching` for a new output. Resume verifies input/reference hashes, seed and matching policy. Completed samples are reconstructed from saved outputs; only unresolved peptide-length pools expand. Matching keeps the original affinity caliper and never silently drops hits. Exhausting the bounded expansion raises an error. Each round records score hashes, deterministic seeds, unresolved hits and sampling/scoring/write timings. Older pools without per-round hashes are marked on import; their source hashes and observed-row identities are still checked. For the Modal launcher, `PROCESSING_KERNEL_RESUME_MATCHING_DIR` names a read-only prior directory under `/out`; the resumed experiment writes a new run directory. `mhcflurry train benchmark-processing-sampler --out benchmark.json` measures the numeric-position and reservoir samplers on a synthetic CPU workload. A sampling microbenchmark does not establish an end-to-end preparation speedup. mhcflurry-2.3.6/docs/processing_preparation_acceleration.md000066400000000000000000000056701525677230600243250ustar00rootroot00000000000000# Processing data preparation `mhcflurry train processing-data` prepares affinity-matched negative peptides with bounded CPU/scoring overlap and resumable, checksummed artifacts. The matching contract is described in {doc}`probabilistic_processing_matching`. ## Execution and saved artifacts Each sample is a resumable workflow. CPU stages sample candidate windows and save scored rounds while a single scoring owner per process runs the affinity predictor. The default pipeline depth is three; use `--preparation-pipeline-depth 1` for serial stages. Sample seeds derive from the master seed and sample identity, so scheduling does not change candidate draws. `ProcessingProteome` encodes proteins once per worker. `ProteinWindows` keeps sampled positions and peptide identities numeric; `NumericCandidatePool` deduplicates scoring inputs before peptide/flank strings are materialized for saved tables. `NumericSequences.aligned_tensor()` and `Class1AffinityPredictor.predict_numeric(..., allele=...)` gather and align inputs on CPU, MPS or CUDA. This strict, single-allele API uses the existing networks and log-affinity ensemble aggregation. Sampling remains on the CPU. Each scored round is saved before matching or expansion. An insufficient pool triggers additional draws for unresolved peptide lengths, within the configured round limit. Completion is recorded only after matched outputs and their hashes are saved. Errors retain committed rounds; they do not publish a completed sample. Use `--resume` for the same output or `--resume-matching-dir PRIOR.matching` when creating a new output. Resume checks input/reference hashes, matching policy, seed, observed rows and saved scores. It never silently reuses old assignments from a different matching policy. The explicit `legacy-top-binders` recipe uses the historical serial preparation path. ## Benchmarking ```bash mhcflurry train benchmark-processing-preparation \ --out benchmark.json --repeats 5 \ --scored-pool sample.round-00.csv.bz2 \ --scored-pool sample.round-01.csv.bz2 ``` Supply all rounds needed for a feasible matching pool. Add `--affinity-predictor /path/to/models.combined` to compare actual numeric/string predictions and timings. Outputs record input and source hashes, runtime versions, all timing repetitions and parity checks. Sampling inputs are synthetic; supplied scored pools can be real. Inference timings exclude loading and initial staging. `--baseline-matching-source /path/to/processing_matching.py` compares two implementations of the **same matching policy** and requires exact assignment and diagnostic equality. A nearest-neighbor matcher that reuses negatives is not an appropriate parity baseline for the current without-replacement policy. Component timings do not establish an end-to-end preparation speedup or a gain in trained-model accuracy. The tests separately cover pipeline backpressure and errors, resume integrity, matching invariants, and numeric/string prediction parity. mhcflurry-2.3.6/docs/python_tutorial.md000066400000000000000000000157471525677230600203060ustar00rootroot00000000000000# Python library tutorial Use the Python API to add MHCflurry predictions to notebooks and analysis pipelines. This page covers the common presentation and affinity calls; the {ref}`API-documentation` contains the complete interfaces. For most applications, use {class}`~mhcflurry.Class1PresentationPredictor`: it returns binding, processing, and combined presentation predictions from one interface. Use the lower-level affinity or processing predictors only when you need those components by themselves. ## Loading a predictor {class}`~mhcflurry.Class1PresentationPredictor` provides binding, processing, and combined presentation predictions. Calling `load()` without a path uses the downloaded release model (see {ref}`downloading`); pass a model directory to load a custom predictor. ```{doctest} >>> from mhcflurry import Class1PresentationPredictor >>> predictor = Class1PresentationPredictor.load() >>> "HLA-A*02:01" in predictor.supported_alleles True ``` ## Predicting for individual peptides To generate predictions for individual peptides, we can use the {meth}`~mhcflurry.Class1PresentationPredictor.predict` method of the {class}`~mhcflurry.Class1PresentationPredictor`, loaded above. Scores depend on the loaded model release. This method returns a {class}`pandas.DataFrame` with binding affinity, processing, and presentation predictions: ```{doctest} >>> predictions = predictor.predict( ... peptides=["TPVCPNGPG", "RLLEGMEMI"], ... n_flanks=["MSSSS", "MVENK"], ... c_flanks=["NCQV", "FGQVI"], ... alleles=["HLA-A0201", "HLA-A0301"], ... verbose=0) >>> predictions.peptide.tolist() ['TPVCPNGPG', 'RLLEGMEMI'] >>> bool(predictions.presentation_score.between(0, 1).all()) True ``` The peptides and flanks above come from `example.fasta`. Omit both `n_flanks` and `c_flanks` to compare the same peptides without source context. Here, the allele list is one MHC class I allele set, and the strongest binder across that MHC allele set is reported for each peptide. | Python input | Meaning | |---|---| | `alleles=["A0201", "A0301"]` | One MHC allele set; one result per peptide. | | `alleles={"sample1": [...], "sample2": [...]}` | Multiple named MHC allele sets; one result per sample and peptide. | | `Class1AffinityPredictor.predict_to_dataframe(allele="A0201", ...)` | Score every peptide against one allele. | | `Class1AffinityPredictor.predict_to_dataframe(alleles=[...], ...)` | Pair each peptide with the allele at the same position. | ```{note} MHCflurry normalizes allele names using the [mhcgnomes](https://github.com/pirl-unc/mhcgnomes) package. Names like `HLA-A0201` or `A*02:01` will be normalized to `HLA-A*02:01`, so most naming conventions can be used with methods such as {meth}`~mhcflurry.Class1PresentationPredictor.predict`. ``` Invalid, ambiguous, class-II, pseudogene, null, and unsupported allele names raise a descriptive `ValueError` by default. For streaming or mixed-quality data, pass `throw=False`; affected prediction rows are retained with `NaN` scores (or ignored when another valid allele in the MHC allele set supplies the sample's best affinity) while valid inputs are still evaluated. The command-line equivalent is `mhcflurry predict --no-throw`. If you have multiple sample MHC allele sets, you can pass a dict, where the keys are arbitrary sample names: ```{doctest} >>> predictions = predictor.predict( ... peptides=["KSEYMTSWFY", "NLVPMVATV"], ... alleles={ ... "sample1": ["A0201", "A0301", "B0702", "B4402", "C0201", "C0702"], ... "sample2": ["A0101", "A0206", "B5701", "C0202"], ... }, ... verbose=0) >>> list(zip(predictions.sample_name, predictions.peptide)) [('sample1', 'KSEYMTSWFY'), ('sample1', 'NLVPMVATV'), ('sample2', 'KSEYMTSWFY'), ('sample2', 'NLVPMVATV')] ``` Here the strongest binder for each sample / peptide pair is returned. ## Scanning protein sequences The {meth}`~mhcflurry.Class1PresentationPredictor.predict_sequences` method supports scanning protein sequences for MHC ligands. Here's an example to identify all 8–11mer peptides with a predicted binding affinity at most 500 nM to any allele across two sample MHC allele sets and two short peptide sequences. ```{doctest} >>> scan = predictor.predict_sequences( ... sequences={ ... 'protein1': "MDSKGSSQKGSRLLLLLVVSNLL", ... 'protein2': "SSLPTPEDKEQAQQTHH", ... }, ... alleles={ ... "sample1": ["A0201", "A0301", "B0702"], ... "sample2": ["A0101", "C0202"], ... }, ... result="filtered", ... comparison_quantity="affinity", ... filter_value=500, ... verbose=0) >>> bool(len(scan) > 0 and scan.affinity.le(500).all()) True >>> {"sequence_name", "peptide", "best_allele"}.issubset(scan.columns) True ``` When using `predict_sequences`, the flanking sequences for each peptide are automatically included in the processing and presentation predictions. See the documentation for {class}`~mhcflurry.Class1PresentationPredictor` for other useful methods. ## Lower level interfaces The {class}`~mhcflurry.Class1PresentationPredictor` delegates to a {class}`~mhcflurry.Class1AffinityPredictor` instance for binding affinity predictions. If all you need are binding affinities, you can use this instance directly. Here's an example: ```{doctest} >>> affinity_predictor = predictor.affinity_predictor >>> affinities = affinity_predictor.predict_to_dataframe( ... allele="HLA-A0201", peptides=["SIINFEKL", "SIINFEQL"]) >>> affinities[["peptide", "allele"]].to_dict("records") [{'peptide': 'SIINFEKL', 'allele': 'HLA-A*02:01'}, {'peptide': 'SIINFEQL', 'allele': 'HLA-A*02:01'}] >>> bool(((affinities.prediction_low < affinities.prediction) & ... (affinities.prediction < affinities.prediction_high)).all()) True ``` Alternatively, `Class1AffinityPredictor.load()` selects the active release's standalone affinity bundle when installed, falling back to the affinity component of its presentation bundle. Accessing `predictor.affinity_predictor` as above guarantees that both calls use the same loaded affinity ensemble. The `prediction_low` and `prediction_high` fields give the 5-95 percentile predictions across the models in the ensemble. This detailed information is not available through the higher-level {class}`~mhcflurry.Class1PresentationPredictor` interface. Under the hood, `Class1AffinityPredictor` itself delegates to an ensemble of {class}`~mhcflurry.Class1NeuralNetwork` instances, which implement the neural network models used for prediction. To fit your own affinity prediction models, call {meth}`~mhcflurry.Class1NeuralNetwork.fit`. You can similarly use {class}`~mhcflurry.Class1ProcessingPredictor` directly for antigen processing prediction, and there is a low-level {class}`~mhcflurry.Class1ProcessingNeuralNetwork` with a {meth}`~mhcflurry.Class1ProcessingNeuralNetwork.fit` method. See the API documentation of these classes for details. When interpreting percentile outputs, lower means stronger and loading a model preserves its saved calibration. For custom calibration or standalone processing percentiles, see {doc}`shared_percent_rank_transforms`. mhcflurry-2.3.6/docs/release_model_evaluation.md000066400000000000000000000137371525677230600220660ustar00rootroot00000000000000# Evaluation of the 2.3.0 weights MHCflurry 2.3.0 is evaluated on 16,400 positives and 164,731 negatives from ten patients (181,131 rows). Every model receives the same rows and labels; no predictor chooses its own negatives. Values are equal-patient means. The main comparison uses peptide, MHC alleles and N/C flanking sequences for MHCflurry. A second comparison omits the flanks. NetMHCpan and MixMHCpred receive peptide and MHC inputs in both comparisons; their scores are unchanged. All rows are evaluated against presentation labels. NetMHCpan BA outputs are binding-affinity ranking baselines, not full presentation predictors. [Download the comparison figures (PDF)](https://github.com/openvax/mhcflurry/releases/download/2.3.0/mhcflurry-2.3.0-model-comparison-v4.pdf). ## Full presentation: peptide, MHC and N/C flanks MHCflurry uses both N- and C-terminal source-protein context, as it does by default when those inputs are supplied. External tools receive no flanks. ```{figure} _static/release-2.3.0/presentation_with_flanks.svg :alt: AP, PPV at N and AUROC with patient-bootstrap intervals for MHCflurry 2.3.0, public 2.1.5/2.2.0/2.2.1, NetMHCpan 4.0/4.1/4.2 BA and EL, and MixMHCpred 3.0. Presentation-label ranking on identical evaluation rows. External tools receive no flanks. ``` | Model / output | AP | PPV@N | AUROC | |---|---:|---:|---:| | MHCflurry 2.3.0 | 0.7986 | 0.7450 | 0.9524 | | MHCflurry 2.1.5 | 0.7766 | 0.7297 | 0.9439 | | MHCflurry 2.2.0 | 0.7766 | 0.7297 | 0.9439 | | MHCflurry 2.2.1 | 0.7766 | 0.7297 | 0.9439 | | NetMHCpan 4.0 BA | 0.6396 | 0.6178 | 0.9157 | | NetMHCpan 4.0 EL | 0.6935 | 0.6473 | 0.9243 | | NetMHCpan 4.1 BA | 0.6710 | 0.6507 | 0.9256 | | NetMHCpan 4.1 EL | 0.7671 | 0.7240 | 0.9417 | | NetMHCpan 4.2 BA | 0.6637 | 0.6456 | 0.9260 | | NetMHCpan 4.2 EL | 0.7832 | 0.7307 | 0.9455 | | MixMHCpred 3.0 | 0.7765 | 0.7281 | 0.9310 | The paired 95% patient-bootstrap intervals favor 2.3.0 over public 2.2.1 for all three metrics. AP intervals also favor 2.3.0 over NetMHCpan 4.2 EL and MixMHCpred 3.0, while their PPV@N intervals include zero. The external predictors receive less input context. ## No-flank comparison: peptide and MHC MHCflurry is evaluated without flank inputs. The evaluation rows, labels and external-tool scores are identical to the main comparison. ```{figure} _static/release-2.3.0/presentation_without_flanks.svg :alt: AP, PPV at N and AUROC with patient-bootstrap intervals for MHCflurry 2.3.0, public 2.1.5/2.2.0/2.2.1, NetMHCpan 4.0/4.1/4.2 BA and EL, and MixMHCpred 3.0. Presentation-label ranking on identical evaluation rows. External tools receive no flanks. ``` | Model / output | AP | PPV@N | AUROC | |---|---:|---:|---:| | MHCflurry 2.3.0 | 0.7893 | 0.7373 | 0.9501 | | MHCflurry 2.1.5 | 0.7713 | 0.7258 | 0.9409 | | MHCflurry 2.2.0 | 0.7713 | 0.7258 | 0.9409 | | MHCflurry 2.2.1 | 0.7713 | 0.7258 | 0.9409 | | NetMHCpan 4.0 BA | 0.6396 | 0.6178 | 0.9157 | | NetMHCpan 4.0 EL | 0.6935 | 0.6473 | 0.9243 | | NetMHCpan 4.1 BA | 0.6710 | 0.6507 | 0.9256 | | NetMHCpan 4.1 EL | 0.7671 | 0.7240 | 0.9417 | | NetMHCpan 4.2 BA | 0.6637 | 0.6456 | 0.9260 | | NetMHCpan 4.2 EL | 0.7832 | 0.7307 | 0.9455 | | MixMHCpred 3.0 | 0.7765 | 0.7281 | 0.9310 | AP and AUROC intervals favor 2.3.0 over public 2.2.1; the PPV@N interval includes zero. AP and PPV@N differences versus NetMHCpan 4.2 EL and MixMHCpred 3.0 also have intervals including zero. These results do not establish universal superiority. See {doc}`release_model_evaluation_details` for the detailed paired-bootstrap tables and component figures. Intervals use 10,000 paired patient resamples and are not adjusted for multiple comparisons. ## Cohort and overlap A separate benchmark builder sampled source-protein/length-matched negative windows, with seed 20260928 and an initial ten negatives per positive. Sampling did not use scores from either the old or new predictor. The final overlap audit removed an additional 380 rows (101 positives and 279 negatives) from every comparator without resampling. The revised cohort SHA256 is `9f0fbc92fd44ac58438102ae7496687b67f109685d8f1fecfc820a7262bf46cc`; the previous cohort SHA256 was `81d18501616358b3c4b0f87d6e405ed50ea67dfefa31d6f8097d39818d658b41`. The cohort is disjoint from the inventoried MHCflurry training peptide sources. Unavailable or incomplete training records, especially for external predictors, prevent claiming disjointness from every model ever trained. Ten patients limit precision and generalizability; the release changed both recipes and data, so its gains cannot be attributed solely to newer data. PPV@N uses the retained positive count in each patient, with expected precision across score ties. ## Components and artifacts Affinity-only ligand-ranking AP increased from 0.6971 to 0.7224 versus public 2.2.1. Processing-only AP decreased: 0.4144 versus 0.5399 with flanks and 0.4243 versus 0.5794 without flanks. These are component rankings on the presentation cohort, not independent quantitative affinity or isolated processing endpoints. The full presentation improvements therefore do not imply that every component improved. Task AP values are never averaged. The with-flanks predictor contains four short-flank and four cleavage-boundary networks. The separately trained long-flank ensemble is a diagnostic and is not used in that full predictor. The saved presentation-percentile mapping preserves the raw-score AP, PPV@N and AUROC on the complete revised cohort. [Download tables and source data (.tar.gz)](https://github.com/openvax/mhcflurry/releases/download/2.3.0/model-comparison.20260928-v4.tar.gz). The stable-model tables above and the PDF include public 2.1.5/2.2.0/2.2.1, NetMHCpan 4.0/4.1/4.2 BA and EL, and MixMHCpred 3.0. The archive includes full-precision aggregate tables, rendering code, and a separately labeled prerelease component comparison. It does not include MixMHCpred 2.0.2, whose incomplete coverage required a different subset. Model archive checksums accompany the [2.3.0 release](https://github.com/openvax/mhcflurry/releases/tag/2.3.0). mhcflurry-2.3.6/docs/release_model_evaluation_details.md000066400000000000000000000306441525677230600235670ustar00rootroot00000000000000# Detailed comparison of the 2.3.0 weights MHCflurry 2.3.0 is evaluated on 16,400 positives and 164,731 negatives from ten patients (181,131 rows). Every model receives the same rows and labels; no predictor chooses its own negatives. Values are equal-patient means. The main comparison uses peptide, MHC alleles and N/C flanking sequences for MHCflurry. A second comparison omits the flanks. NetMHCpan and MixMHCpred receive peptide and MHC inputs in both comparisons; their scores are unchanged. All rows are evaluated against presentation labels. NetMHCpan BA outputs are binding-affinity ranking baselines, not full presentation predictors. [Download the comparison figures (PDF)](https://github.com/openvax/mhcflurry/releases/download/2.3.0/mhcflurry-2.3.0-model-comparison-v4.pdf). See {doc}`release_model_evaluation` for the overview. ## Full presentation: peptide, MHC and N/C flanks MHCflurry uses both N- and C-terminal source-protein context, as it does by default when those inputs are supplied. External tools receive no flanks. | Model / output | AP | PPV@N | AUROC | |---|---:|---:|---:| | MHCflurry 2.3.0 | 0.7986 | 0.7450 | 0.9524 | | MHCflurry 2.1.5 | 0.7766 | 0.7297 | 0.9439 | | MHCflurry 2.2.0 | 0.7766 | 0.7297 | 0.9439 | | MHCflurry 2.2.1 | 0.7766 | 0.7297 | 0.9439 | | NetMHCpan 4.0 BA | 0.6396 | 0.6178 | 0.9157 | | NetMHCpan 4.0 EL | 0.6935 | 0.6473 | 0.9243 | | NetMHCpan 4.1 BA | 0.6710 | 0.6507 | 0.9256 | | NetMHCpan 4.1 EL | 0.7671 | 0.7240 | 0.9417 | | NetMHCpan 4.2 BA | 0.6637 | 0.6456 | 0.9260 | | NetMHCpan 4.2 EL | 0.7832 | 0.7307 | 0.9455 | | MixMHCpred 3.0 | 0.7765 | 0.7281 | 0.9310 | ```{figure} _static/release-2.3.0/presentation_with_flanks.svg :alt: AP, PPV at N and AUROC with patient-bootstrap intervals for all stable comparators on identical evaluation rows. Full-model and comparator scores on the same 181,131 rows. External tools use peptide and MHC inputs without flanks. ``` Paired differences are **MHCflurry 2.3.0 minus the comparator**, with 95% patient-bootstrap intervals (10,000 paired resamples, seed 42). Positive values favor 2.3.0; intervals are not adjusted for multiple comparisons. ```{figure} _static/release-2.3.0/paired_presentation_with_flanks.svg :alt: Paired differences in AP, PPV at N and AUROC between MHCflurry 2.3.0 and each stable comparator. Paired patient-bootstrap intervals for MHCflurry 2.3.0 minus each comparator. ``` | Comparator | ΔAP [95% CI] | ΔPPV@N [95% CI] | ΔAUROC [95% CI] | |---|---:|---:|---:| | MHCflurry 2.1.5 | +0.02205 [0.00921, 0.03424] | +0.01528 [0.00354, 0.02586] | +0.00846 [0.00640, 0.01046] | | MHCflurry 2.2.0 | +0.02205 [0.00921, 0.03425] | +0.01528 [0.00354, 0.02586] | +0.00846 [0.00640, 0.01046] | | MHCflurry 2.2.1 | +0.02205 [0.00921, 0.03425] | +0.01528 [0.00354, 0.02586] | +0.00846 [0.00640, 0.01046] | | NetMHCpan 4.0 BA | +0.15906 [0.15044, 0.16797] | +0.12720 [0.11462, 0.14069] | +0.03664 [0.03149, 0.04148] | | NetMHCpan 4.0 EL | +0.10516 [0.08064, 0.12934] | +0.09763 [0.07798, 0.11608] | +0.02809 [0.02122, 0.03471] | | NetMHCpan 4.1 BA | +0.12765 [0.11511, 0.13930] | +0.09424 [0.08331, 0.10479] | +0.02681 [0.02227, 0.03115] | | NetMHCpan 4.1 EL | +0.03157 [0.01382, 0.04765] | +0.02097 [0.00490, 0.03512] | +0.01071 [0.00654, 0.01453] | | NetMHCpan 4.2 BA | +0.13491 [0.12200, 0.15079] | +0.09934 [0.08576, 0.11166] | +0.02640 [0.02278, 0.02993] | | NetMHCpan 4.2 EL | +0.01545 [0.00013, 0.02877] | +0.01424 [-0.00280, 0.02874] | +0.00687 [0.00327, 0.00996] | | MixMHCpred 3.0 | +0.02214 [0.00357, 0.04045] | +0.01684 [-0.00153, 0.03557] | +0.02134 [0.01747, 0.02541] | All three paired intervals favor 2.3.0 over public 2.2.1. AP intervals also favor 2.3.0 over NetMHCpan 4.2 EL and MixMHCpred 3.0, while their PPV@N intervals include zero. The external predictors receive less input context. ## No-flank comparison: peptide and MHC MHCflurry is evaluated without flank inputs. The evaluation rows, labels and external-tool scores are identical to the main comparison. | Model / output | AP | PPV@N | AUROC | |---|---:|---:|---:| | MHCflurry 2.3.0 | 0.7893 | 0.7373 | 0.9501 | | MHCflurry 2.1.5 | 0.7713 | 0.7258 | 0.9409 | | MHCflurry 2.2.0 | 0.7713 | 0.7258 | 0.9409 | | MHCflurry 2.2.1 | 0.7713 | 0.7258 | 0.9409 | | NetMHCpan 4.0 BA | 0.6396 | 0.6178 | 0.9157 | | NetMHCpan 4.0 EL | 0.6935 | 0.6473 | 0.9243 | | NetMHCpan 4.1 BA | 0.6710 | 0.6507 | 0.9256 | | NetMHCpan 4.1 EL | 0.7671 | 0.7240 | 0.9417 | | NetMHCpan 4.2 BA | 0.6637 | 0.6456 | 0.9260 | | NetMHCpan 4.2 EL | 0.7832 | 0.7307 | 0.9455 | | MixMHCpred 3.0 | 0.7765 | 0.7281 | 0.9310 | ```{figure} _static/release-2.3.0/presentation_without_flanks.svg :alt: AP, PPV at N and AUROC with patient-bootstrap intervals for all stable comparators on identical evaluation rows. Full-model and comparator scores on the same 181,131 rows. External tools use peptide and MHC inputs without flanks. ``` Paired differences are **MHCflurry 2.3.0 minus the comparator**, with 95% patient-bootstrap intervals (10,000 paired resamples, seed 42). Positive values favor 2.3.0; intervals are not adjusted for multiple comparisons. ```{figure} _static/release-2.3.0/paired_presentation_without_flanks.svg :alt: Paired differences in AP, PPV at N and AUROC between MHCflurry 2.3.0 and each stable comparator. Paired patient-bootstrap intervals for MHCflurry 2.3.0 minus each comparator. ``` | Comparator | ΔAP [95% CI] | ΔPPV@N [95% CI] | ΔAUROC [95% CI] | |---|---:|---:|---:| | MHCflurry 2.1.5 | +0.01797 [0.00489, 0.03004] | +0.01148 [-0.00246, 0.02440] | +0.00921 [0.00758, 0.01085] | | MHCflurry 2.2.0 | +0.01797 [0.00488, 0.03004] | +0.01148 [-0.00246, 0.02440] | +0.00921 [0.00758, 0.01085] | | MHCflurry 2.2.1 | +0.01797 [0.00488, 0.03004] | +0.01148 [-0.00246, 0.02440] | +0.00921 [0.00758, 0.01085] | | NetMHCpan 4.0 BA | +0.14971 [0.13926, 0.16070] | +0.11954 [0.10419, 0.13420] | +0.03438 [0.02938, 0.03923] | | NetMHCpan 4.0 EL | +0.09581 [0.07093, 0.12102] | +0.08997 [0.07151, 0.10836] | +0.02583 [0.01926, 0.03234] | | NetMHCpan 4.1 BA | +0.11830 [0.10539, 0.13098] | +0.08658 [0.07381, 0.09791] | +0.02455 [0.02031, 0.02864] | | NetMHCpan 4.1 EL | +0.02222 [0.00433, 0.03875] | +0.01331 [-0.00126, 0.02592] | +0.00845 [0.00449, 0.01214] | | NetMHCpan 4.2 BA | +0.12556 [0.11102, 0.14262] | +0.09168 [0.07491, 0.10584] | +0.02414 [0.02059, 0.02759] | | NetMHCpan 4.2 EL | +0.00610 [-0.00927, 0.01994] | +0.00658 [-0.00917, 0.01983] | +0.00461 [0.00111, 0.00762] | | MixMHCpred 3.0 | +0.01279 [-0.00645, 0.03160] | +0.00918 [-0.00949, 0.02805] | +0.01909 [0.01539, 0.02287] | AP and AUROC intervals favor 2.3.0 over public 2.2.1; the PPV@N interval includes zero. AP and PPV@N differences versus NetMHCpan 4.2 EL and MixMHCpred 3.0 also have intervals including zero. These results do not establish universal superiority. ## Cohort and overlap A separate benchmark builder sampled source-protein/length-matched negative windows, with seed 20260928 and an initial ten negatives per positive. Sampling did not use scores from either the old or new predictor. The final overlap audit removed an additional 380 rows (101 positives and 279 negatives) from every comparator without resampling. The revised cohort SHA256 is `9f0fbc92fd44ac58438102ae7496687b67f109685d8f1fecfc820a7262bf46cc`; the previous cohort SHA256 was `81d18501616358b3c4b0f87d6e405ed50ea67dfefa31d6f8097d39818d658b41`. The cohort is disjoint from the inventoried MHCflurry training peptide sources. Unavailable or incomplete training records, especially for external predictors, prevent claiming disjointness from every model ever trained. Ten patients limit precision and generalizability; the release changed both recipes and data, so its gains cannot be attributed solely to newer data. PPV@N uses the retained positive count in each patient, with expected precision across score ties. ## Components and artifacts Affinity-only ligand-ranking AP increased from 0.6971 to 0.7224 versus public 2.2.1. Processing-only AP decreased: 0.4144 versus 0.5399 with flanks and 0.4243 versus 0.5794 without flanks. These are component rankings on the presentation cohort, not independent quantitative affinity or isolated processing endpoints. The full presentation improvements therefore do not imply that every component improved. Task AP values are never averaged. The with-flanks predictor contains four short-flank and four cleavage-boundary networks. The separately trained long-flank ensemble is a diagnostic and is not used in that full predictor. The saved presentation-percentile mapping preserves the raw-score AP, PPV@N and AUROC on the complete revised cohort. [Download the aggregate comparison tables and figures](https://github.com/openvax/mhcflurry/releases/download/2.3.0/model-comparison.20260928-v4.tar.gz). The stable-model tables above and the PDF include public 2.1.5/2.2.0/2.2.1, NetMHCpan 4.0/4.1/4.2 BA and EL, and MixMHCpred 3.0. The archive includes full-precision aggregate tables, rendering code, and a separately labeled prerelease component comparison. It does not include MixMHCpred 2.0.2, whose incomplete coverage required a different subset. Model archive checksums accompany the [2.3.0 release](https://github.com/openvax/mhcflurry/releases/tag/2.3.0). ```{figure} _static/release-2.3.0/affinity_ligand_ranking.svg :alt: Component AP, PPV at N and AUROC across stable MHCflurry models on the same presentation labels. Affinity-based ligand ranking on the presentation cohort; this does not measure quantitative IC50 accuracy. ``` ```{figure} _static/release-2.3.0/processing_with_flanks.svg :alt: Component AP, PPV at N and AUROC across stable MHCflurry models on the same presentation labels. Processing-only ranking with N/C flanks. The 2.3.0 component is the short-flank/boundary hybrid used by the full predictor. ``` ```{figure} _static/release-2.3.0/processing_without_flanks.svg :alt: Component AP, PPV at N and AUROC across stable MHCflurry models on the same presentation labels. Processing-only ranking without flanks. Component metrics are not averaged with full presentation metrics. ``` ## Prerelease comparison: 2020 versus 2023 training data The labels **2.3.0-pre — 2020 training data** and **2.3.0-pre — 2023 training data** describe two prerelease runs of the same recipe family. The year refers to the curated affinity-data snapshot. These are experimental configurations, not additional downloadable weight releases. The 2023 prerelease run saved affinity and with-flanks processing components, but no full presentation model. Only the available component rankings are compared here, on the same 181,131 rows as every figure above. They must not be read as full-model presentation scores or combined into an average task AP. The processing architectures also differ: the 2020 score uses four short-flank and four boundary networks, whereas the 2023 score uses eight networks with 15-residue flanks. This is **not a controlled data-only ablation**. The released 2.3.0 full predictor above uses the completed short-flank/boundary hybrid. ```{figure} _static/release-2.3.0/prerelease_components.svg :alt: Affinity-based and processing-based ligand ranking for the 2020 and 2023 prerelease training-data arms on identical rows. Available prerelease components; the 2023 arm has no full presentation model. Processing architectures differ. ``` | Component | Training data | AP | PPV@N | AUROC | |---|---|---:|---:|---:| | Affinity ligand ranking | 2020 | 0.7113 | 0.6799 | 0.9295 | | Affinity ligand ranking | 2023 | 0.7202 | 0.6899 | 0.9353 | | Processing with flanks | 2020 | 0.3446 | 0.3739 | 0.8198 | | Processing with flanks | 2023 | 0.3211 | 0.3608 | 0.8145 | ```{figure} _static/release-2.3.0/paired_prerelease_components.svg :alt: Paired patient-bootstrap differences in AP, PPV at N and AUROC for the 2023 minus 2020 prerelease component scores. 2023 minus 2020 component rankings, with 95% paired patient-bootstrap intervals. Positive values favor the 2023 arm. ``` | Component | ΔAP [95% CI] | ΔPPV@N [95% CI] | ΔAUROC [95% CI] | |---|---:|---:|---:| | Affinity ligand ranking | +0.00897 [-0.00170, 0.01910] | +0.00999 [0.00187, 0.01698] | +0.00581 [0.00303, 0.00897] | | Processing with flanks | -0.02355 [-0.03138, -0.01533] | -0.01310 [-0.02009, -0.00537] | -0.00525 [-0.00828, -0.00207] | The affinity AP interval includes zero; its PPV@N and AUROC intervals favor the 2023 arm. The processing intervals favor the scored 2020 hybrid, with the architecture caveat above. All intervals are conditional on the saved weights and unadjusted for multiple comparisons. The training-overlap and cohort limitations stated above apply unchanged. mhcflurry-2.3.6/docs/release_neural_hyperparameter_audit.md000066400000000000000000000112671525677230600243170ustar00rootroot00000000000000# Neural training semantics MHCflurry 2.3.0 uses PyTorch while retaining support for historical model weights. Matching a hyperparameter name does not always match the training equation across frameworks. This reference describes those distinctions; {doc}`release_training_recipe` is the authoritative recipe for the released weights. See {doc}`release_model_evaluation` for the completed comparison of the released ensembles on identical evaluation rows. ## Framework-semantic discrepancies found | Discrepancy | Release relevance | Resolution / justification | |---|---|---| | Processing layers silently used PyTorch Kaiming/fan-in initialization and nonzero random biases | Direct: every processing candidate | Made explicit and equation-tested. Initialization is explicit in every generated recipe; see the final recipe for each processing family. | | Affinity LSUV observed raw Linear output instead of the activated Dense output | Direct: every affinity candidate uses LSUV | Both targets are explicit. Historical parity uses post-activation; the 2.3.0 affinity recipe selects pre-activation. | | Native PyTorch RMSprop places epsilon outside the square root; Keras places it inside | Direct: every affinity optimizer step | Fixed with a public, tested Keras equation and an explicit implementation switch. PyTorch documents this framework difference. | | Native PyTorch and Keras Adam place epsilon differently relative to bias correction | Direct: every processing optimizer step | Both equations are public and tested, and the selected implementation is serialized. The final no-flank and boundary families use Keras-compatible Adam; the short-flank family uses native RMSprop. | | Both PyTorch trainers rounded validation rows as `floor(N * split)` instead of using Keras' split boundary `floor(N * (1 - split))` | Direct but usually one row per network | Fixed centrally and regression-tested. This is deterministic parity, not an optimization question. | | PyTorch BatchNorm updates running variance with an unbiased estimate; Keras uses population variance | Inactive in the release affinity grid; processing has no BN | Fixed in `KerasBatchNorm1d` and tested against the Keras equation, so non-release configurations are not left divergent. | | Generic PyTorch Xavier fan calculation was wrong for the transposed 3-D `LocallyConnected1D` storage | Inactive: release affinity grid has no local layers | Fixed using Keras' `(output_length, flattened_input, filters)` fans. | | Native SGD fallback used LR 0.001 and unknown optimizer names silently became Adam | Inactive: release uses RMSprop/Adam | Fixed: Keras SGD default LR is 0.01 and unknown names now fail. | | Keras Glorot/He *normal* initializers use variance-corrected truncated normals; PyTorch's normal initializers are untruncated | Inactive: release uses Glorot uniform | Follow-up only if those non-release initializer values are to remain supported for new training. Loaded historical weights are unaffected. | | TensorFlow and PyTorch dropout RNGs, shuffles, reduction order, and GPU kernels differ | Direct stochastic trajectory, but not a hyperparameter drift | Irreducible framework difference. Compare distributions and held-out metrics, not byte-identical weights. | | Fixed master/per-fit seeds replace entropy-derived seeds | Direct identities/trajectory | Intentional reproducibility improvement. It does not change the sampled distributions. | | Device-side encoding, compact cartesian batches, validation batching, lazy proteome sampling, and prediction chunking | Execution only | Algebra/prediction parity is covered by tests. Release training fails if autosizing would shrink a configured minibatch. | | `torch.compile` and reduced float32 matmul precision | Could alter trajectory | Off for release; eager + `highest` precision is pinned. | Native RMSprop adds epsilon outside the square root; Keras-compatible RMSprop adds it inside. Adam implementations also differ in epsilon placement relative to bias correction. These are explicit optimizer choices, not transparent performance switches. See the [PyTorch RMSprop documentation](https://docs.pytorch.org/docs/stable/generated/torch.optim.RMSprop.html), [Keras RMSprop documentation](https://keras.io/api/optimizers/rmsprop/), and [Adam paper](https://arxiv.org/abs/1412.6980). The public class defaults, compatibility generators, and frozen release recipe serve different purposes. The compatibility affinity generator defaults to minibatch 128; the 2.3.0 release recipe explicitly selects 1024 with native RMSprop and pre-activation LSUV. Always retain the generated hyperparameter YAML with a training run. Framework RNGs and reduction order preclude byte-identical retraining; validate prediction quality on a common held-out cohort. mhcflurry-2.3.6/docs/release_training_recipe.md000066400000000000000000000112221525677230600216640ustar00rootroot00000000000000# Release training recipe The 2.3.0 weights use the `final-2.3.0-candidate-v2` recipe identifier and the `current` data vintage: the curated 2023 affinity snapshot plus the configured mass-spectrometry sources. The identifier is fixed for reproducibility; its name does not describe the software's release status. The machine-readable settings are in `scripts/training/final_230_candidate_v2_recipe.json`. ## Components | Component | Release configuration | |---|---| | Affinity | 35 architectures × 4 folds; minibatch 1024; native PyTorch RMSprop; Glorot initialization; pre-activation LSUV; dropout 0.5; patience 20; terminal weights for selection. | | Processing without flanks | 128 architectures × 4 folds; minibatch 512; Glorot initialization and Keras-equation Adam; selected ensemble. | | Short-flank processing | One kernel-13 architecture × 4 folds; five residues on each side; native RMSprop; Glorot initialization; best inner-validation AP checkpoints. | | Boundary processing | One large-ReLU architecture × 4 folds; five flank residues and five peptide residues at each cleavage boundary; Glorot initialization, Keras-equation Adam and terminal checkpoints. | | Presentation with flanks | Equal mixture of the four short-flank and four boundary networks, combined with affinity by the fitted logistic model. | | Presentation without flanks | Selected no-flank processing ensemble, combined with affinity by its separately fitted logistic model. | | Long-flank processing | Separate 15-residue-flank diagnostic grid; it is not the processing ensemble embedded in the presentation predictor. | Training checkpoints and model-selection records remain in the training run. An inference download needs the selected weights, model manifests, allele sequences, fitted presentation coefficients and calibration. Training data and provenance are retained for overlap audits; unused alternative checkpoints are not part of the inference model. ## Data and evaluation Affinity uses measured affinities and the configured mass-spec reassignment. Its synthetic negatives are random amino-acid peptides. Processing training uses protein-derived negatives matched within sample, length and affinity constraints. Presentation training uses protein-derived negatives in its own training table. These training samplers do not define a comparison's test set. A model comparison must freeze one positive/negative row set, score every comparator on it, and exclude training overlap identically for every model. Sample/source disjointness and peptide disjointness are separate checks; missing lineage cannot be treated as proof of separation. The maintained release holdout manifests are an input exclusion mechanism, not a guarantee that an arbitrary public comparator has never seen the same data. Report end-to-end presentation, affinity-only ranking and processing-only ranking separately. Never average their AP values. For multi-patient results, report per-patient metrics and paired patient-bootstrap intervals. See {doc}`evaluation` for score orientation, common-row joins and output formats. ## Calibration and compatibility Raw affinity is in nM, lower is stronger. Processing and presentation scores range from zero to one, higher is stronger. Percentile ranks range from zero to 100, lower is stronger; they are background ranks, not calibrated biological probabilities. New calibrations use the shared compact method: 64 knots, increasing to 128 only when independent, label-free background validation justifies it. Affinity uses log(IC50); processing and presentation use logit(score). Existing public histogram calibrations load without refitting or conversion. See {doc}`shared_percent_rank_transforms` for the exact rules and compatibility. The release workflow calibrates affinity and presentation. Standalone processing calibration is a separate command with an explicit background and flank policy. Evaluating raw scores does not validate a percentile API: check both saved score representations before publishing weights. ## Reproduce a run Use the maintained release entry point and explicit recipe/data settings; see the [release workflow](https://github.com/openvax/mhcflurry/tree/master/scripts/release) and {doc}`final_230_candidate_experiment` for launch and collection commands. Freeze the source commit, seed, data hashes and complete settings before training. Preserve the resulting `release_provenance.json`, holdout manifests, training tables, selection records and comparison outputs. Worker counts and prediction chunks may be autosized. Training minibatches are scientific settings and must not be silently reduced to fit a device. The release path uses eager execution and highest float32 matmul precision. mhcflurry-2.3.6/docs/requirements.txt000066400000000000000000000002121525677230600177610ustar00rootroot00000000000000sphinx sphinxcontrib-programoutput sphinxcontrib-autoprogram sphinx-rtd-theme myst-parser numpydoc pypandoc pydot tabulate logomaker tqdm mhcflurry-2.3.6/docs/saved_candidate_evaluation.md000066400000000000000000000047171525677230600223620ustar00rootroot00000000000000# Evaluate saved model runs `mhcflurry eval saved-candidate` evaluates a completed training run without retraining. Write its results to a new directory and preserve the source models, training provenance, evaluator commit, and frozen holdout identities. ```shell mhcflurry eval saved-candidate \ --candidate /persist/runs/COMPLETED_FULL_RUN \ --exact-processing-run /persist/runs/COMPLETED_EIGHT_NETWORK_RUN \ --public-root /persist/downloads/2.2.0 \ --release-holdout-dir /persist/inputs/release_holdout \ --source-commit EVALUATOR_COMMIT \ --out /persist/runs/NEW_EVALUATION_RUN ``` `--exact-processing-run` supplies an optional historical-data processing replay; omit it when evaluating only the full run. The replay is a separate condition, not an exact-data retrain of the entire model. The copied `candidate/presentation/models` bundle supplies the actual affinity and processing components for the end-to-end comparison. Report the with-flanks hybrid separately from an independently trained long-flank diagnostic ensemble. No model is published by this evaluation command. ## Comparable cohorts All models within a comparison must receive the same retained positive and negative rows. Exclude the union of known training overlaps from every model, preserve row identifiers, and record revised counts and cohort hashes. A model must not choose its own evaluation negatives. Preserve the overlap caveat for external predictors whose complete training records are unavailable. Processing-specific evaluation uses sample/length/affinity-matched risk sets. End-to-end presentation uses its separately frozen presentation cohort. Do not average their AP values or compare absolute AP across different prevalences. See {doc}`evaluation` for matching, score orientation, saved tables, and figures. Report AP, PPV@N and AUROC per patient, their equal-patient means, and paired patient-bootstrap intervals for differences. Full-model gains do not establish that each component improved. Repeated selection on a held-out cohort also limits the interpretation of its intervals. ## Remote execution `scripts/training/launch_saved_candidate_evaluation_modal.py` runs the same command on Modal through runplz. It contains no training stage and keeps outputs on the configured persistent volume. Collect the completed output, inspect its status and provenance, then use `mhcflurry train snapshot-experiment` to preserve a hashed snapshot. A disconnected client is not evidence of job completion. mhcflurry-2.3.6/docs/shared_percent_rank_transforms.md000066400000000000000000000331561525677230600233130ustar00rootroot00000000000000# Percentile calibration for all predictors Affinity, processing, and presentation share two implementations: {class}`~mhcflurry.HistogramPercentRankTransform` preserves the historical histogram lookup; {class}`~mhcflurry.CompactPercentRankTransform` uses a continuous, compact approximation to the reference distribution. New predictor calibration defaults to compact, starting with **64 knots** and allowing **128 only when background validation justifies it**. Loading an existing predictor preserves its saved calibration, including public models. Calibration changes neither neural-network weights nor raw prediction scores. ## What a percentile means Predictor `percentile_ranks(...)` methods return values from 0 to 100, with **lower always meaning stronger**. A percentile estimates how frequently the chosen background produces an equally strong or stronger score. It is not a probability that a peptide binds, is processed, or is presented. | Predictor | Raw score and direction | Compact input coordinate | Low-level transform call | |---|---|---|---| | Affinity | IC50 in nM; lower is stronger | `log(IC50)` | `transform(ic50)` | | Processing | Score in [0, 1]; higher is stronger | `logit(score)` | `transform(scores, survival=True)` | | Presentation | Score in [0, 1]; higher is stronger | `logit(score)` | `transform(scores, survival=True)` | Affinity calibration is per allele, with existing sequence-equivalent allele lookup retained. Processing and presentation each store one score distribution per predictor. A processing percentile is not an affinity percentile, and a presentation percentile is not an average of its component percentiles. ## Functional form: what the knots store For each distinct background score `v`, the compact fit computes the midrank survival probability, assigning half the tied reference mass to either side: ```{math} S(v) = \frac{\#\{v_j > v\} + \tfrac12\#\{v_j = v\}}{N}. ``` Each knot stores a pair `(x_i, y_i)`: the transformed raw score and `logit(S(v_i))`. Logarithms are natural logarithms; `logit(p) = log(p / (1-p))`. Between adjacent knots the ordinate is **linear**: ```{math} y(x) = y_i + \frac{x-x_i}{x_{i+1}-x_i}(y_{i+1}-y_i), \qquad x_i \leq x \leq x_{i+1}. ``` With `sigmoid(z) = 1 / (1 + exp(-z))`, the two directions are: ```{math} P_{\mathrm{processing/presentation}}(v) = 100\,\operatorname{sigmoid}(y(x(v))), \qquad P_{\mathrm{affinity}}(v) = 100\,\operatorname{sigmoid}(-y(x(v))). ``` The implementation evaluates each direction directly; it does not obtain a tiny upper-tail percentile by subtracting an already rounded CDF from 100. This is a continuous, piecewise-linear curve in transformed coordinates, not a histogram, a cubic spline, or a new neural network. Its slope can change at a knot, so it is not generally differentiable there. The fit keeps both endpoints and repeatedly adds the reference point with the largest absolute interpolation error in `y`. Equal errors choose the earliest source index. It stops at the budget, or earlier if there are too few distinct coordinates or all remaining errors are at most `1e-12`. Thus 64 is a knot **budget**, not a requirement to store 64 redundant points. Storage is two coordinates per knot, two extrapolation slopes, and reference/selection metadata. Outside the reference range, a line anchored at the corresponding endpoint continues the curve. Its slope is fitted using up to 32 distinct reference coordinates nearest that endpoint, rather than just the last knot interval. Those extrapolated percentiles are model-based estimates: continuity does not establish the accuracy of frequencies in a sparsely observed tail. ## Choosing 64 versus 128 There are two distinct APIs: - Low-level `CompactPercentRankTransform(...).fit(scores, num_knots=64)` fits the specified budget directly, without automatic selection. - Predictor `calibrate_percentile_ranks(..., max_knots=128)` and the shared `fit_percent_rank_transform` helper start with 64 and may select 128. **The default value 128 is a ceiling, not a starting size.** The automatic rule uses background scores only, never evaluation labels: 1. With at least 1,000 groups, hold out one fifth of the groups using a fixed selection seed of **403**. Peptide identities define groups in the affinity APIs and calibration commands. Processing/presentation score-only APIs use rows unless the caller supplies `groups`; pass identities when rows repeat. 2. Compare 64- and 128-knot fits on the remaining groups. Evaluate percentile cutoffs **0.03, 0.1, 0.3, 1, 3, and 10 percent**, retaining only cutoffs with at least ten expected validation observations. At least two cutoffs and two distinct fitting scores are required; otherwise retain 64. 3. For a cutoff `q`, let `c_q` count validation percentiles at or below `q` and `M` be the validation row count. The smoothed observed percentage is `100 * (c_q + 0.5) / (M + 1)`. For each budget, `E` is the root-mean-square of `log10(observed_percentage / q)` over the eligible cutoffs. 4. Select 128 only if `E64 > E128 + max(0.01, 0.1 * min(E64, E128))`. Fit the selected budget on the complete background. Setting `max_knots=64` disables escalation. Fewer than 1,000 groups also retain 64. This is a predeclared practical tolerance, not a statistical significance test or a guarantee of accuracy at every percentile. The compact transform's `selection` dictionary records the selected budget, actual knot count, reason, seed, reference count/hash, and—when comparison is possible—validation counts, split-mask hash, cutoffs, errors, and tolerance. The fixed selection seed is separate from the CLI `--random-seed` (default 42), which governs generation of calibration peptides and MHC allele sets. ## Python examples These small synthetic arrays illustrate the API, not a suitable release calibration background. Both classes use instance `fit`, return `self`, and support `to_dict`/`from_dict` serialization. ```{doctest} >>> import json >>> import numpy as np >>> from mhcflurry import HistogramPercentRankTransform, CompactPercentRankTransform >>> from mhcflurry.percent_rank_transform import PercentRankTransform >>> PercentRankTransform is HistogramPercentRankTransform True >>> background_ic50 = np.array([1., 10., 100., 1000.]) >>> affinity_curve = CompactPercentRankTransform(score_transform="log").fit(background_ic50) >>> np.round(affinity_curve.transform(background_ic50), 2).tolist() [12.5, 37.5, 62.5, 87.5] >>> probability_curve = CompactPercentRankTransform(score_transform="logit").fit([.1, .1, .2, .9]) >>> np.round(probability_curve.transform([.1, .2, .9], survival=True), 2).tolist() [75.0, 37.5, 12.5] >>> restored = CompactPercentRankTransform.from_dict(json.loads(json.dumps(probability_curve.to_dict()))) >>> np.array_equal(restored.transform([.2, .8]), probability_curve.transform([.2, .8])) True >>> histogram = HistogramPercentRankTransform().fit(background_ic50, bins=[1., 10., 100., 1000.]) >>> np.array_equal(histogram.transform([5., 50.], survival=True), 100 - histogram.transform([5., 50.])) True ``` For predictor calibration, affinity takes background **peptides** and performs inference; processing and presentation take already computed background **scores**. Their `percentile_ranks` methods all take raw scores: ```python # Assume independently prepared backgrounds and loaded predictor instances. affinity_predictor.calibrate_percentile_ranks( peptides=background_peptides, alleles=calibration_alleles, method="compact", max_knots=128) affinity_percentiles = affinity_predictor.percentile_ranks(query_ic50, allele=allele) processing_predictor.calibrate_percentile_ranks( background_processing_scores, groups=background_peptides, method="compact", max_knots=128) processing_percentiles = processing_predictor.percentile_ranks(query_processing_scores) presentation_predictor.calibrate_percentile_ranks( background_presentation_scores, groups=background_peptide_per_score, method="compact", max_knots=128) presentation_percentiles = presentation_predictor.percentile_ranks(query_presentation_scores) ``` Processing's raw `predict`/`predict_to_dataframe` outputs are unchanged; call `percentile_ranks` explicitly. An uncalibrated processing predictor raises by default; `throw=False` warns and returns NaNs. Do not assume historical public processing models include a calibration merely because the API now exists. Use `method="histogram"` to explicitly request histogram calibration. Supplying `bins` also selects it when `method` is omitted; `method="compact"` plus `bins` is rejected. Exact historical reproduction requires the original reference and bin edges, not just the histogram class name. In particular, the current presentation histogram default uses the later tail-adaptive bin policy, not necessarily the grid in an older public artifact. `CompactPresentationPercentiles` is only an adapter for the original experiment: it retains its historical classmethod fit and upper-tail default. New code should use the generic class and specify `survival=True` where appropriate. ## Calibration commands and reference policy The command writes **in place**. Point it at a separately preserved candidate copy, not a public baseline or the only copy of an earlier calibration. These are command templates; retain the original release's reference policy, sample count, amino-acid distribution, seed, and MHC allele set sampling for a controlled recalibration. Omitted affinity/presentation reference-generation options use CLI defaults, which need not match a release's recipe. ```shell mhcflurry calibrate-percentile-ranks \ --models-dir candidate-affinity-copy \ --predictor-kind class1_affinity \ --percentile-method compact --max-percentile-knots 128 \ --random-seed 42 --num-jobs 0 mhcflurry calibrate-percentile-ranks \ --models-dir candidate-processing-copy \ --predictor-kind class1_processing \ --processing-reference-data independent_background.csv \ --percentile-method compact --max-percentile-knots 128 \ --num-jobs 0 mhcflurry calibrate-percentile-ranks \ --models-dir candidate-presentation-copy \ --predictor-kind class1_presentation \ --percentile-method compact --max-percentile-knots 128 \ --random-seed 42 --num-jobs 0 ``` Processing requires an explicit independent background CSV with `peptide` and, for flanked ensembles, `n_flank` and `c_flank`. Empty flank cells mean missing context. Use the same ensemble and context policy as at prediction time; the command does not fabricate flanks or generate a processing reference from `--num-peptides-per-length`. It currently supports `--num-jobs 0` only and retains inputs and raw scores in `percent_rank_reference.npz`. Affinity/presentation commands generate background predictions from their configured reference policy; unlike the processing command, they do **not** automatically retain a raw reference-score archive. Preserve those predictions separately when needed for calibration plots/reanalysis. Retain model hashes, reference inputs, the command, transform files, and held-out prediction tables with joinable sample/peptide/allele identifiers for all comparisons. Affinity `--only-missing` fills gaps, including sequence-equivalent lookup; it does not convert existing histogram calibrations to compact. For an intentional conversion of all requested alleles, omit that flag on a copy. ## Saved formats and compatibility - Historical `percent_ranks.csv` loads through the histogram implementation, without refitting. `PercentRankTransform` remains an import/pickle alias. - `percent_ranks.json` stores versioned compact or mixed collections, including different knots per allele. All-histogram collections use CSV when their edges match; different histogram grids also require JSON. - Saving replaces the target calibration file and removes its alternate format only after successful replacement. Saving an empty collection removes saved calibration. Loading prefers JSON if both files are present; it does not fall back to CSV if the JSON is invalid. - Older software cannot interpret compact JSON calibration. Do not expect percentile-dependent prediction to work there merely because the network weight files remain readable. Preserve original artifacts for old clients. Changing ensemble members or weights requires new calibration. Keep raw-score performance comparisons separate from percentile-mapping comparisons. ## Numerical limits and interpretation Compact fitting requires a finite, nonconstant reference. Log coordinates require positive scores; logit coordinates require scores in [0, 1]. Exact zero and one use the nearest interior float64 values for taking logits. Transform calls propagate NaNs but reject infinities and out-of-domain scores. The histogram implementation retains its historical input/boundary behavior. Compact interpolation is monotone within one distribution, avoiding the deliberate step ties introduced by histograms. It cannot recover ties already present in raw scores or remove floating-point rounding. Extreme percentiles can still underflow to zero or approach 100 without distinguishable digits; `log_percentiles(scores, survival=...)` retains tiny-tail information before exponentiation, but does not validate extrapolated frequencies. Monotonic mapping preserves ordering within a shared calibration distribution, subject to those numerical limits. Combining allele-specific calibrations can change ordering **across** alleles. Better percentile resolution is not an improvement in the neural network's raw ranking ability, and calibration is not a substitute for held-out affinity/processing/presentation evaluation. See {doc}`presentation_percentile_calibration` for the archived presentation comparison and its distinct 60/20/20 experimental validation design. mhcflurry-2.3.6/docs/testing.md000066400000000000000000000075031525677230600165060ustar00rootroot00000000000000# Testing Use focused tests while iterating and the full suite before merge or release. The default pytest command runs unit, training, command-level, and downloaded model checks; it is not a fast unit-only loop. ## Quick local feedback From a checkout, first source the development environment: ```shell $ source develop.sh ``` Run lint plus focused unit tests while iterating: ```shell $ ./lint.sh $ python -m pytest -q test/test_amino_acid.py test/test_random_negative_peptides.py ``` To run the broad fast tier, skip the tests marked as slow integration, cached-bundle, or benchmark checks: ```shell $ python -m pytest -q test -m "not slow and not downloads" ``` When working on training internals, add the directly affected files rather than jumping immediately to the full suite. Useful examples: ```shell $ python -m pytest -q test/test_class1_affinity_training_data.py $ python -m pytest -q test/test_pytorch_regressions.py $ python -m pytest -q test/test_train_pan_allele_models_command.py::test_pretrain_network_input_iterator_compact_torch_indices ``` ## Full verification CI pins download catalogue `2.2.0` for historical model/data regression fixtures. Prepare the same fixtures before running the full suite locally: ```shell export MHCFLURRY_DOWNLOADS_CURRENT_RELEASE=2.2.0 mhcflurry downloads fetch data_curated data_mass_spec_annotated models_class1 \ models_class1_presentation models_class1_processing models_class1_pan allele_sequences ``` Use a dedicated test shell, or unset the variable afterward to return ordinary prediction to the default weights. The 2.3.0 prediction documentation is also checked separately against the current presentation bundle. Before calling a release-branch change complete, run: ```shell $ ./lint.sh $ python -m pytest test/ ``` If the run is unexpectedly slow, ask pytest for the slowest tests: ```shell $ python -m pytest -q test --durations=25 --durations-min=0.5 ``` On macOS, prefer `python -m pytest` over the generated `pytest` console script so PyTorch can see MPS accelerators. Tests default to CPU; accelerator-specific cases opt in explicitly. Set `MHCFLURRY_TEST_ACCELERATORS=mps` (or `gpu` for CUDA) to require that coverage instead of skipping it when the device is unavailable. ## What the full suite covers The full suite includes: * pure unit tests for encoding, losses, random-negative planning, and argument resolution; * small neural-network training tests that verify numerical behavior; * command-level subprocess tests that train, select, and calibrate tiny predictors end-to-end; and * public-model smoke tests that require cached MHCflurry download bundles. The slowest tests are usually small integration tests that do real model work: * `test/test_train_pan_allele_models_command.py` runs serial, parallel, and cluster-shaped pan-allele train/select command flows. * `test/test_train_processing_models_command.py` trains and selects processing models. * `test/test_class1_neural_network.py` contains full training behavior checks such as inequality handling, early stopping, and learned motif recovery. * public-model tests load cached MHCflurry download bundles and run prediction smoke checks. Mark new tests according to their cost. Keep small deterministic logic in unit tests, and reserve end-to-end command or training checks for behavior that cannot be covered at a narrower level. ## Markers `slow` : Tests that are too expensive for the fast local loop. These are usually small training jobs or benchmark-style checks. `integration` : End-to-end command or training tests that exercise multiple modules through the public CLI/API. `downloads` : Tests that require locally cached MHCflurry download bundles. These tests should not fetch from the network; missing bundles should fail or skip with an instruction to run `mhcflurry downloads fetch` outside pytest. mhcflurry-2.3.6/docs/training.md000066400000000000000000000161421525677230600166430ustar00rootroot00000000000000# Training models Most users should start with the released models. Train a model when you have new measurements, need a controlled experiment, or are preparing a release. Always evaluate a trained ensemble on held-out data before using it for scientific conclusions. ## Choose a workflow | Data and goal | Command | |---|---| | One or a few well-covered alleles | `mhcflurry class1-train-allele-specific-models` | | Measurements spanning many alleles | `mhcflurry class1-train-pan-allele-models` | | Full retrain, selection, calibration, and evaluation | `mhcflurry train pan-allele-release` | The low-level commands fit candidate models. Production ensembles also require model selection and percentile calibration; use the release workflow when you need the complete pipeline. ## Small allele-specific example The training command accepts a YAML list of architectures. This single, four-member architecture is suitable for learning the workflow; it is not a replacement for the released ensemble search: Fetch the curated example data: ```shell mhcflurry downloads fetch data_curated ``` ```yaml - activation: tanh dropout_probability: 0.0 early_stopping: true layer_sizes: [8] locally_connected_layers: [] loss: custom:mse_with_inequalities max_epochs: 500 minibatch_size: 16384 n_models: 4 output_activation: sigmoid patience: 20 peptide_amino_acid_encoding: BLOSUM62 random_negative_affinity_max: 50000.0 random_negative_affinity_min: 20000.0 random_negative_constant: 25 random_negative_rate: 0.0 validation_split: 0.1 ``` Save it as `hyperparameters.yaml`, then run: ```shell mhcflurry class1-train-allele-specific-models \ --data "$(mhcflurry downloads path data_curated)/curated_training_data.csv.bz2" \ --hyperparameters hyperparameters.yaml \ --allele 'HLA-A*02:01' \ --min-measurements-per-allele 75 \ --out-models-dir models ``` The output directory is a complete predictor. Keep its manifest, metadata, and weights together; pass the directory to prediction commands with `--models`. ## Prepare training data Affinity training tables use one row per measurement. Allele-specific training requires `allele`, `peptide`, `measurement_value`, and `measurement_type`. Use `measurement_type` to identify quantitative or qualitative measurements. The optional `measurement_inequality` column records `=`, `<`, or `>`; if the column is omitted, all measurements are treated as equalities. Alleles must be sequence-resolved MHC class I names. Allele-specific training does not require a pseudosequence table unless the hyperparameters enable cross-allele pretraining with `pretrain_min_points`. The curated data used in the example and for released models is the `data_curated` download bundle. Use `mhcflurry downloads path data_curated` to locate it. ## Pan-allele and release training The release workflow and the `mhcflurry train` data-preparation/sweep wrappers require a source checkout containing `scripts/`. Run them from the checkout root or use an editable install of that checkout. The low-level `mhcflurry class1-train-*` commands are included in the installed Python package. ### Processing-specific data policy New processing training and model selection require affinity/length-matched hit/decoy risk sets. Generate them with the maintained command: ```shell mhcflurry train processing-data \ --hits hits_with_tpm.csv.bz2 \ --affinity-predictor PUBLIC_AFFINITY/models.combined \ --proteome-reference-csv uniprot_proteins.csv.bz2 \ --exclude-samples-file RELEASE_HOLDOUT/processing_samples.csv \ --negative-policy matched --decoys-per-hit 1 \ --max-affinity-distance 0.25 --ppv-multiplier 100 \ --random-seed 42 --out processing_train.csv mhcflurry train validate-processing-data --data processing_train.csv ``` The frozen reference is independent of the newly trained affinity candidate. Each negative has the same sample and peptide length as its hit and differs by at most 0.25 log10 predicted-affinity units. Same-protein matches are preferred. If the scored candidate pool is insufficient, generation fails; increase the pool multiplier in a fresh experiment instead of dropping hits or using unmatched fallback peptides. Preserve `processing_train.csv.matching/` alongside the final table: it contains reference/input fingerprints, the scored candidate pools, matching diagnostics, and any failure records. The table itself retains risk-set/source identities and matching metadata. Training and selection default to `--processing-data-policy matched`, including resume validation. Inner early stopping keeps whole samples together so reused decoys do not leak across its split. For historical exact-data replay only, pass `--processing-data-policy legacy`; reproducing the old generator also requires `--negative-policy legacy-top-binders`. The `exact-public-processing` workflow sets the legacy policy explicitly. Do not call a matched-data retrain an exact-public-data comparison. Processing evaluation defaults to the same matching algorithm with ten decoys per hit. It saves both the full benchmark prediction table for external joins and the matched risk-set predictions used for metrics. Training uses one decoy per hit by default to remain balanced; these two prevalences do not give directly comparable AUPRC values. Historical random-decoy evaluation requires `--processing-negative-policy random-diagnostic`, and its plotting requires `--allow-legacy-processing-plots`. Affinity regression and end-to-end presentation retain their separate objectives/cohorts; matched processing results are not plotted on their absolute-performance axes. ### Release workflow Pan-allele training additionally needs an allele pseudosequence table and a model-selection step. Each training allele must resolve to a key in that table; rows for alleles without a matching pseudosequence are excluded. Start with the command help and the maintained training recipes rather than copying individual flags from an old run: ```shell mhcflurry class1-train-pan-allele-models --help mhcflurry train pan-allele-release --help ``` The release workflow can run locally or on a configured remote backend. It records source and workflow provenance, resumes completed phases, compares the candidate with public models, and copies review artifacts back to the control machine. Deployment is opt-in. Leave worker counts, GPU packing, DataLoader workers, and prediction batches on `auto` initially. See {doc}`configuration` before pinning resource values and the [maintained training scripts](https://github.com/openvax/mhcflurry/tree/master/scripts/training) for the current release recipe. ## Evaluate before use Run `mhcflurry eval compare-models` against a public baseline and inspect the summary metrics and plots. Prediction-affecting changes need held-out evidence, not only a successful unit-test run. See {doc}`evaluation` for the evaluation workflow. Refit calibration after changing an ensemble's members or weights. The release workflow handles affinity and presentation; standalone processing calibration is explicit. See {doc}`shared_percent_rank_transforms` for reference requirements and preserving previous calibrations for comparisons. mhcflurry-2.3.6/downloads-generation/000077500000000000000000000000001525677230600176755ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/README.md000066400000000000000000000021721525677230600211560ustar00rootroot00000000000000# Downloads generation This directory retains generators for historical datasets and model bundles. Their recipes describe the corresponding archives, not necessarily the current release. Current training and weight packaging are documented in [scripts/training/README.md](../scripts/training/README.md) and [scripts/release/README.md](../scripts/release/README.md). Prediction users do not need these generators. Use `mhcflurry downloads fetch` to install published models and datasets. ## Class I Pseudosequence Files The canonical pseudosequence filename registry is `mhcflurry/pseudosequences.py`. Use it from Python or shell scripts instead of hardcoding pseudosequence artifact names: ```bash mhcflurry pseudosequences list mhcflurry pseudosequences filename --length 39 mhcflurry pseudosequences path \ --directory "$(mhcflurry downloads path allele_sequences)" \ --length 39 \ --fallback-legacy ``` Do not substitute the standalone `allele_sequences` download for the pseudosequence CSV inside a trained model directory. The saved weights depend on the representation width and position definition used during training. mhcflurry-2.3.6/downloads-generation/allele_sequences/000077500000000000000000000000001525677230600232065ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/allele_sequences/GENERATE.sh000077500000000000000000000101261525677230600247370ustar00rootroot00000000000000#!/bin/bash # # Create MHCflurry pseudosequences by performing a global alignment across all # MHC amino acid sequences we can get our hands on. # # Requires: clustalo, wget # set -e set -x DOWNLOAD_NAME=allele_sequences SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") export PYTHONUNBUFFERED=1 pseudosequence_lookup() { python -c 'from mhcflurry.pseudosequences import main; main()' "$@" } mkdir -p "$SCRATCH_DIR" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" # Send stdout and stderr to a logfile included with the archive. exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) # Log some environment info date pip freeze git status which clustalo clustalo --version cd $SCRATCH_DIR/$DOWNLOAD_NAME cp $SCRIPT_DIR/make_allele_sequences.py . cp $SCRIPT_DIR/select_alleles_to_disambiguate.py . cp $SCRIPT_DIR/filter_sequences.py . NETMHCPAN_PSEUDOSEQUENCES="$(pseudosequence_lookup filename --length 34)" MHCFLURRY_PSEUDOSEQUENCES="$(pseudosequence_lookup filename --length 39)" LEGACY_ALLELE_SEQUENCES="$(pseudosequence_lookup legacy allele_sequences)" LEGACY_CLASS1_PSEUDOSEQUENCES="$(pseudosequence_lookup legacy class1_pseudosequences)" LEGACY_NO_DIFFERENTIATION="$(pseudosequence_lookup legacy no_differentiation)" cp "$SCRIPT_DIR/$NETMHCPAN_PSEUDOSEQUENCES" . # Compatibility alias used by older generation scripts and model artifacts. cp "$SCRIPT_DIR/$NETMHCPAN_PSEUDOSEQUENCES" "$LEGACY_CLASS1_PSEUDOSEQUENCES" cp $SCRIPT_ABSOLUTE_PATH . # Generate pseudosequences. # Training data is used to decide which additional positions to include in the # pseudosequences to differentiate alleles that have identical traditional # pseudosequences but have associated training data TRAINING_DATA="$(mhcflurry-downloads path data_curated)/curated_training_data.csv.bz2" python select_alleles_to_disambiguate.py \ "$TRAINING_DATA" \ --min-count 1000 \ --out training_data.alleles.txt # Human wget -q ftp://ftp.ebi.ac.uk/pub/databases/ipd/imgt/hla/fasta/A_prot.fasta wget -q ftp://ftp.ebi.ac.uk/pub/databases/ipd/imgt/hla/fasta/B_prot.fasta wget -q ftp://ftp.ebi.ac.uk/pub/databases/ipd/imgt/hla/fasta/C_prot.fasta wget -q ftp://ftp.ebi.ac.uk/pub/databases/ipd/imgt/hla/fasta/E_prot.fasta wget -q ftp://ftp.ebi.ac.uk/pub/databases/ipd/imgt/hla/fasta/F_prot.fasta wget -q ftp://ftp.ebi.ac.uk/pub/databases/ipd/imgt/hla/fasta/G_prot.fasta # Mouse wget -q https://www.uniprot.org/uniprot/P01899.fasta # H-2 Db wget -q https://www.uniprot.org/uniprot/P01900.fasta # H-2 Dd wget -q https://www.uniprot.org/uniprot/P14427.fasta # H-2 Dp wget -q https://www.uniprot.org/uniprot/P14426.fasta # H-2 Dk wget -q https://www.uniprot.org/uniprot/Q31145.fasta # H-2 Dq wget -q https://www.uniprot.org/uniprot/P01901.fasta # H-2 Kb wget -q https://www.uniprot.org/uniprot/P01902.fasta # H-2 Kd wget -q https://www.uniprot.org/uniprot/P04223.fasta # H-2 Kk wget -q https://www.uniprot.org/uniprot/P14428.fasta # H-2 Kq wget -q https://www.uniprot.org/uniprot/P01897.fasta # H-2 Ld wget -q https://www.uniprot.org/uniprot/Q31151.fasta # H-2 Lq # Various wget -q ftp://ftp.ebi.ac.uk/pub/databases/ipd/mhc/MHC_prot.fasta python filter_sequences.py *.fasta --out class1.fasta time clustalo -i class1.fasta -o class1.aligned.fasta time python make_allele_sequences.py \ class1.aligned.fasta \ --recapitulate-sequences "$NETMHCPAN_PSEUDOSEQUENCES" \ --differentiate-alleles training_data.alleles.txt \ --out-csv "$MHCFLURRY_PSEUDOSEQUENCES" cp "$MHCFLURRY_PSEUDOSEQUENCES" "$LEGACY_ALLELE_SEQUENCES" time python make_allele_sequences.py \ class1.aligned.fasta \ --recapitulate-sequences "$NETMHCPAN_PSEUDOSEQUENCES" \ --out-csv "$LEGACY_NO_DIFFERENTIATION" # Cleanup gzip -f class1.fasta gzip -f class1.aligned.fasta rm *.fasta cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.$(date +%Y%m%d).tar.bz2" tar -cjf "$RESULT" * echo "Created archive: $RESULT" mhcflurry-2.3.6/downloads-generation/allele_sequences/filter_sequences.py000066400000000000000000000066321525677230600271270ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Filter and combine class I sequence fastas. """ from __future__ import print_function import sys import argparse import Bio.SeqIO # pylint: disable=import-error from mhcflurry.common import normalize_allele_name parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "fastas", nargs="+", help="Unaligned fastas") parser.add_argument( "--out", required=True, help="Fasta output") def run(): args = parser.parse_args(sys.argv[1:]) print(args) total = 0 order = [] name_to_record = {} for fasta in args.fastas: reader = Bio.SeqIO.parse(fasta, "fasta") for record in reader: total += 1 if len(record.seq) < 50: print("-- Skipping '%s', sequence too short" % ( record.description,)) continue parts = record.description.split() candidate_strings = [ record.description, parts[1], " ".join(parts[1:]) ] if record.description.startswith("sp|"): # From a description like: # sp|P01897|HA1L_MOUSE H-2 class I histocompatibility antigen, L-D alpha chain OS=Mus musculus OX=10090 GN=H2-L PE=1 SV=2 # make a string to parse like: # H-2-L-D candidate_strings.insert(0, parts[1] + "-" + parts[6]) name = None for candidate_string in candidate_strings: name = normalize_allele_name( candidate_string, raise_on_error=False) if name is not None: break if name is None: print("Skipping '%s'" % (record.description,)) continue if '*' not in name: raise ValueError("Normalization gave name without a '*' for '%s': %s" % ( record.description, name)) print("Parsed '%s' as %s" % (record.description, name)) record.description = name + " " + record.description if name in name_to_record: old_record = name_to_record[name] old_sequence = old_record.seq if len(old_sequence) < len(record.seq): print("-- Replacing old record (%d aa) with new (%d aa)" % ( len(old_record.seq), len(record.seq))) name_to_record[name] = record else: print("-- Skipping, already seen") else: order.append(name) name_to_record[name] = record records = [name_to_record[name] for name in order] with open(args.out, "w") as fd: Bio.SeqIO.write(records, fd, "fasta") print("Wrote %d / %d sequences: %s" % (len(records), total, args.out)) if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/allele_sequences/make_allele_sequences.py000066400000000000000000000223001525677230600300630ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Generate allele sequences for pan-class I models. Additional dependency: biopython """ from __future__ import print_function import sys import argparse import numpy import pandas import Bio.SeqIO # pylint: disable=import-error from mhcflurry.common import normalize_allele_name parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "aligned_fasta", help="Aligned sequences") parser.add_argument( "--recapitulate-sequences", required=True, help="CSV giving sequences to recapitulate") parser.add_argument( "--differentiate-alleles", help="File listing alleles to differentiate using additional positions") parser.add_argument( "--out-csv", help="Result file") def normalize_allele_name_optional(s): return normalize_allele_name(s, raise_on_error=False) def run(): args = parser.parse_args(sys.argv[1:]) print(args) allele_to_sequence = {} reader = Bio.SeqIO.parse(args.aligned_fasta, "fasta") for record in reader: name = record.description.split()[1] print(record.name, record.description) allele_to_sequence[name] = str(record.seq) print("Read %d aligned sequences" % len(allele_to_sequence)) allele_sequences = pandas.Series(allele_to_sequence).to_frame() allele_sequences.columns = ['aligned'] allele_sequences['aligned'] = allele_sequences['aligned'].str.replace( "-", "X") allele_sequences['normalized_allele'] = allele_sequences.index.map( normalize_allele_name_optional) allele_sequences = allele_sequences.dropna().set_index("normalized_allele", drop=True) selected_positions = [] recapitulate_df = pandas.read_csv(args.recapitulate_sequences) recapitulate_df["normalized_allele"] = recapitulate_df.allele.map(normalize_allele_name_optional) recapitulate_df = ( recapitulate_df .dropna() .drop_duplicates("normalized_allele") .set_index("normalized_allele", drop=True)) allele_sequences["recapitulate_target"] = recapitulate_df.iloc[:,-1] print("Sequences in recapitulate CSV that are not in aligned fasta:") print(recapitulate_df.index[ ~recapitulate_df.index.isin(allele_sequences.index) ].tolist()) allele_sequences_with_target = allele_sequences.loc[ ~allele_sequences.recapitulate_target.isnull() ] position_identities = [] target_length = int( allele_sequences_with_target.recapitulate_target.str.len().max()) for i in range(target_length): series_i = allele_sequences_with_target.recapitulate_target.str.get(i) row = [] full_length_sequence_length = int( allele_sequences_with_target.aligned.str.len().max()) for k in range(full_length_sequence_length): series_k = allele_sequences_with_target.aligned.str.get(k) row.append((series_i == series_k).mean()) position_identities.append(row) position_identities = pandas.DataFrame(numpy.array(position_identities)) selected_positions = position_identities.idxmax(1).tolist() fractions = position_identities.max(1) print("Selected positions: ", *selected_positions) print("Lowest concordance fraction: %0.5f" % fractions.min()) assert fractions.min() > 0.99 allele_sequences["recapitulated"] = allele_sequences.aligned.map( lambda s: "".join(s[p] for p in selected_positions)) allele_sequences_with_target = allele_sequences.loc[ ~allele_sequences.recapitulate_target.isnull() ] agreement = ( allele_sequences_with_target.recapitulated == allele_sequences_with_target.recapitulate_target).mean() print("Overall agreement: %0.5f" % agreement) assert agreement > 0.9 # Add additional positions additional_positions = [] if args.differentiate_alleles: differentiate_alleles = pandas.read_csv( args.differentiate_alleles).iloc[:,0].values print( "Read %d alleles to differentiate:" % len(differentiate_alleles), differentiate_alleles) to_differentiate = allele_sequences.loc[ allele_sequences.index.isin(differentiate_alleles) ].copy() print(to_differentiate.shape) additional_positions = [] # Greedy search, looking ahead 3 positions at a time. possible_additional_positions = set() for (_, sub_df) in to_differentiate.groupby("recapitulated"): if sub_df.aligned.nunique() > 1: differing = pandas.DataFrame( dict([(pos, chars) for (pos, chars) in enumerate(zip(*sub_df.aligned.values)) if any(c != chars[0] for c in chars) and "X" not in chars])).T possible_additional_positions.update(differing.index.values) def disambiguation_score(sequences): counts = pandas.Series(sequences, copy=False).value_counts() score = -1 * (counts[counts > 1] - 1).sum() return score possible_additional_positions = sorted(possible_additional_positions) current_sequences = to_differentiate.recapitulated while current_sequences.value_counts().max() > 1: to_differentiate["equivalence_class_size"] = ( current_sequences.map(current_sequences.value_counts()) ) print("Ambiguous alleles", " ".join( to_differentiate.loc[ to_differentiate.equivalence_class_size > 1 ].index)) position1s = [] position2s = [] position3s = [] negative_position1_distances = [] possible_additional_positions_scores = [] position1_scores = [] for position1 in possible_additional_positions: new_sequence1 = ( current_sequences + to_differentiate.aligned.str.get(position1)) negative_position1_distance = -1 * min( abs(position1 - selected) for selected in selected_positions) position1_score = disambiguation_score(new_sequence1) for (i, position2) in enumerate(possible_additional_positions): new_sequence2 = ( new_sequence1 + to_differentiate.aligned.str.get(position2)) for position3 in possible_additional_positions: new_sequence3 = ( new_sequence2 + to_differentiate.aligned.str.get(position3)) score = disambiguation_score(new_sequence3) position1s.append(position1) position2s.append(position2) position3s.append(position3) possible_additional_positions_scores.append(score) negative_position1_distances.append( negative_position1_distance) position1_scores.append(position1_score) scores_df = pandas.DataFrame({ "position1": position1s, "position2": position2s, "position3": position3s, "negative_position1_distance": negative_position1_distances, "tuple_score": possible_additional_positions_scores, "position1_score": position1_scores, }).sort_values( ["tuple_score", "position1_score", "negative_position1_distance"], ascending=False) print(scores_df) selected_additional_position = scores_df.iloc[0].position1 print("Selected additional position", selected_additional_position) additional_positions.append(selected_additional_position) current_sequences = ( current_sequences + to_differentiate.aligned.str.get( selected_additional_position)) possible_additional_positions.remove(selected_additional_position) additional_positions = sorted(set(additional_positions)) print( "Selected %d additional positions: " % len(additional_positions), additional_positions) extended_selected_positions = sorted( set(selected_positions).union(set(additional_positions))) print( "Extended selected positions (%d)" % len(extended_selected_positions), *extended_selected_positions) allele_sequences["sequence"] = allele_sequences.aligned.map( lambda s: "".join(s[p] for p in extended_selected_positions)) allele_sequences[["sequence"]].to_csv(args.out_csv, index=True) print("Wrote: %s" % args.out_csv) if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/allele_sequences/pseudosequences.netmhcpan.34aa.csv000066400000000000000000022334131525677230600316510ustar00rootroot00000000000000allele,pseudosequence BoLA-100901,YYSMYREISENVYGSNLYLLYRDYTWEYLNYRWY BoLA-100902,YYSEYREISENVYESNLYLLYRDYTWEYLNYRWY BoLA-101901,YHTKYREISENVYGSNLYYDYDYYTWAVFNYRGY BoLA-102001,YHTKYREISENVYGSNLYFLYMDYTWAVFNYRGY BoLA-102101,YYTKYREISENVYGSNLYFQFRYYTWADFNYEGY BoLA-102301,YYSEYREISENVYESNLYIAYSDYTWEYLNYRWY BoLA-102801,YYTKYREISEKLYENTLYLQFRYYTWADFNYEWY BoLA-102901,YYTRYREISENLYKNTAYITFMYYTWANENYRGY BoLA-103101,YYTKYDEISENLYKNTLYIAFRDYTWAYLNYTWY BoLA-103102,YYTKYDEISENLYKDTLYIAFRDYTWAYLNYTWY BoLA-104201,YHTKYDEISENLYKDTLYIAYRDYTWEYLNYRGY BoLA-104901,YYAEYREISDTSFVGTLYIEYEYYTWAYLNYEGY BoLA-106101,YYTIYREISENVYESNLYFRYDFYTWADFNYRWY BoLA-106701,YYAMYEMDAEDRSLCTLYFQFTFYTWAAFNYTWY BoLA-107401,YYTKYREISENLYKNTAYLRFSFYTWAAENYRGY BoLA-1:00901,YYSMYREISENVYGSNLYLLYRDYTWEYLNYRWY BoLA-1:00902,YYSEYREISENVYESNLYLLYRDYTWEYLNYRWY BoLA-1:01901,YHTKYREISENVYGSNLYYDYDYYTWAVFNYRGY BoLA-1:02001,YHTKYREISENVYGSNLYFLYMDYTWAVFNYRGY BoLA-1:02101,YYTKYREISENVYGSNLYFQFRYYTWADFNYEGY BoLA-1:02301,YYSEYREISENVYESNLYIAYSDYTWEYLNYRWY BoLA-1:02801,YYTKYREISEKLYENTLYLQFRYYTWADFNYEWY BoLA-1:02901,YYTRYREISENLYKNTAYITFMYYTWANENYRGY BoLA-1:03101,YYTKYDEISENLYKNTLYIAFRDYTWAYLNYTWY BoLA-1:03102,YYTKYDEISENLYKDTLYIAFRDYTWAYLNYTWY BoLA-1:04201,YHTKYDEISENLYKDTLYIAYRDYTWEYLNYRGY BoLA-1:04901,YYAEYREISDTSFVGTLYIEYEYYTWAYLNYEGY BoLA-1:06101,YYTIYREISENVYESNLYFRYDFYTWADFNYRWY BoLA-1:06701,YYAMYEMDAEDRSLCTLYFQFTFYTWAAFNYTWY BoLA-1:07401,YYTKYREISENLYKNTAYLRFSFYTWAAENYRGY BoLA-200501,YYAEYRNIYDTIFVDTLYIAYWFYTWAAWNYEWY BoLA-200601,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEWY BoLA-200602,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEWH BoLA-200801,YLIMYRENSETTFANTAYVEYMDYTWADWNYRWY BoLA-200802,YLIMYRENSETTFANTAYVEYMDYTWADWNYRGY BoLA-201201,YYATYRENFDTTFVDTLYIAYRDYTWAEHNYTWY BoLA-201601,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEGY BoLA-201602,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEWY BoLA-201801,YYADYRNIYDTIFANTAYFEYMFYTWAEQNYRGY BoLA-201802,YYADYRNIYDTIFANTAYFEYMFYTWAEQNYRGY BoLA-202201,YHSEYEQIVDTSFVGTLYLLYEDYTRAALNYTGY BoLA-202501,YSAEYRNIYDTTFVYALYLWSWFYTWAAENYRGY BoLA-202601,YYAEYREISETTFVDTLYIEYEYYTWAYLNYRGY BoLA-202602,YYAEYREISETTFVDTLYIEYEYYTWAYLNYRGY BoLA-202603,YYAEYREISETTFVDTLYIEYEYYTWAYLNYRGY BoLA-203001,YYSEYRNIYDTNFVSNLYLWSWFYTWANENYEWY BoLA-203202,YYATYRENLGATFVDTLYIEYRDYTWAYLNYTWY BoLA-204301,YSEMYRERAGNTFVNTLYIWYRDYTWAVFNYLGY BoLA-204401,YYAMYEEKADTTFVDTLYIAYRDYTWAVFNYLGY BoLA-204402,YYAMYEEKADTTFVDTLYIWYRDYTWAVFNYLGY BoLA-204501,YYATYRENLDTTFVDTLYIEYRDYTWAEFNYLGY BoLA-204601,YSEMYRERAGNTFVNTLYIWYRDYTWAEQNYTWY BoLA-204701,YSEMYQERAGNTFVDTLYLWYMDYTWAEQNYTWY BoLA-204801,YYSEYEQIVDTSFVGTLYLLYMDYTRAAQNYRGY BoLA-205401,YYIMYQENSGATFANTLYFWYWFYTWANENYRGY BoLA-205501,YYAEYREISETTFVDSLYIAYRDYTWAYLNYRGY BoLA-205601,YYATYQENFDATFANTLYFLSTYYTWEAHNYRGY BoLA-205701,YYIMYREISETTFVDTLYIEYDFYTWEYLNYRGY BoLA-206001,YSAEYRNIYDTTFVYTLYLWSWFYTWANGNYEGY BoLA-206201,YYATYQEIQENTFANTLYIEYRDYTWAYFNYRWY BoLA-206901,YYSEYEQIVDTSFVNTLYLWYRDYTWEAENYRWY BoLA-207001,YYATYRENLDATFVNTLYLWYRDYTWAERNYRWY BoLA-207101,YYATYRENLGATFVDTLYIAYSDYTWAEFNYRGY BoLA-2:00501,YYAEYRNIYDTIFVDTLYIAYWFYTWAAWNYEWY BoLA-2:00601,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEWY BoLA-2:00602,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEWH BoLA-2:00801,YLIMYRENSETTFANTAYVEYMDYTWADWNYRWY BoLA-2:00802,YLIMYRENSETTFANTAYVEYMDYTWADWNYRGY BoLA-2:01201,YYATYRENFDTTFVDTLYIAYRDYTWAEHNYTWY BoLA-2:01601,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEGY BoLA-2:01602,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEWY BoLA-2:01801,YYADYRNIYDTIFANTAYFEYMFYTWAEQNYRGY BoLA-2:01802,YYADYRNIYDTIFANTAYFEYMFYTWAEQNYRGY BoLA-2:02201,YHSEYEQIVDTSFVGTLYLLYEDYTRAALNYTGY BoLA-2:02501,YSAEYRNIYDTTFVYALYLWSWFYTWAAENYRGY BoLA-2:02601,YYAEYREISETTFVDTLYIEYEYYTWAYLNYRGY BoLA-2:02602,YYAEYREISETTFVDTLYIEYEYYTWAYLNYRGY BoLA-2:02603,YYAEYREISETTFVDTLYIEYEYYTWAYLNYRGY BoLA-2:03001,YYSEYRNIYDTNFVSNLYLWSWFYTWANENYEWY BoLA-2:03202,YYATYRENLGATFVDTLYIEYRDYTWAYLNYTWY BoLA-2:04301,YSEMYRERAGNTFVNTLYIWYRDYTWAVFNYLGY BoLA-2:04401,YYAMYEEKADTTFVDTLYIAYRDYTWAVFNYLGY BoLA-2:04402,YYAMYEEKADTTFVDTLYIWYRDYTWAVFNYLGY BoLA-2:04501,YYATYRENLDTTFVDTLYIEYRDYTWAEFNYLGY BoLA-2:04601,YSEMYRERAGNTFVNTLYIWYRDYTWAEQNYTWY BoLA-2:04701,YSEMYQERAGNTFVDTLYLWYMDYTWAEQNYTWY BoLA-2:04801,YYSEYEQIVDTSFVGTLYLLYMDYTRAAQNYRGY BoLA-2:05401,YYIMYQENSGATFANTLYFWYWFYTWANENYRGY BoLA-2:05501,YYAEYREISETTFVDSLYIAYRDYTWAYLNYRGY BoLA-2:05601,YYATYQENFDATFANTLYFLSTYYTWEAHNYRGY BoLA-2:05701,YYIMYREISETTFVDTLYIEYDFYTWEYLNYRGY BoLA-2:06001,YSAEYRNIYDTTFVYTLYLWSWFYTWANGNYEGY BoLA-2:06201,YYATYQEIQENTFANTLYIEYRDYTWAYFNYRWY BoLA-2:06901,YYSEYEQIVDTSFVNTLYLWYRDYTWEAENYRWY BoLA-2:07001,YYATYRENLDATFVNTLYLWYRDYTWAERNYRWY BoLA-2:07101,YYATYRENLGATFVDTLYIAYSDYTWAEFNYRGY BoLA-300101,YSEMYRERAGNFFVSNLYLWSMFYSMAEQNYRWY BoLA-300102,YSSMYRERAGNFFVSNLYLWSMFYSMAEQNYRWY BoLA-300103,YSIMYRERAGNFFVSNLYLWSMFYSMAEQNYRWY BoLA-300201,YLEMYQEKAGNFFVSNLYLLSMFYSMAEQNYRWY BoLA-300401,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY BoLA-300402,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY BoLA-300403,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY BoLA-301001,YYSEYRNIYDTTFVDTLYLEYEYYSVAEFNYRGY BoLA-301101,YSEMYQEKAGTTFANIAYFWYMYYTWAEQNYTWY BoLA-301701,YSEMYRERAGNIFVSNLYFWYEYYTWAAQNYRWY BoLA-301702,YSEMYRERAGNIFVSNLYFWYMYYTWAAQNYRWY BoLA-301703,YSEMYRERAGNIFVSNLYFWYMYYTWAEQNYRWY BoLA-302701,YSEMYRNNAGNSFVGTLYLWSMYYTWEYQNYEWH BoLA-302702,YSEMYRNNAGNSFVGTLYLWSMYYTWEYQNYEWH BoLA-303501,YYNMYQENAGNTFVGTLYLWSEFYTWAAHNYTWY BoLA-303601,YYAMYRNNADATFVNTLYFLYEYYTVADHNYRWY BoLA-303701,YSEMYRNNAGNSFVGTLYLLYMDYSRAVQNYRWY BoLA-303801,YNEMYRNNAGNDSVGTLYLWYMYYSMAVQNYTWY BoLA-305001,YSEMYRNNAGNTFGSNLYFLYTYYTWAEWNYTWH BoLA-305002,YSEMYRNNAGNTFGSNLYFWYMYYTWAEQNYTWH BoLA-305101,YSEMYRERAGNTFVNTLYIWYRDYTWAAENYTWY BoLA-305201,YYSMYRENSDTGFVDTLYLLYTYYSVAVQNYRWY BoLA-305301,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY BoLA-305801,YSEMYRERAGNTFVGTLYLWYMDYSRAVQNYRWY BoLA-305901,YSEMYRNNAGNSFVGTLYLWSMFYTWEYQNYRWH BoLA-306501,YSEMYQEKAGTSSVGTLYLAYMFYSMAVQNYEWY BoLA-306601,YYEMYQEKADTTFVDTLYLLYTYYSMAEFNYTWY BoLA-306602,YYEMYQEKADTTFVDTLYLLYTFYSMAEFNYTWY BoLA-306801,YSIVYQNNAGTTFANTLYLLYMYYTWAAHNYEWY BoLA-307301,YYIIYQEISDTSFVSNLYLWYTYYSMAVQNYEWY BoLA-3:00101,YSEMYRERAGNFFVSNLYLWSMFYSMAEQNYRWY BoLA-3:00102,YSSMYRERAGNFFVSNLYLWSMFYSMAEQNYRWY BoLA-3:00103,YSIMYRERAGNFFVSNLYLWSMFYSMAEQNYRWY BoLA-3:00201,YLEMYQEKAGNFFVSNLYLLSMFYSMAEQNYRWY BoLA-3:00401,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY BoLA-3:00402,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY BoLA-3:00403,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY BoLA-3:01001,YYSEYRNIYDTTFVDTLYLEYEYYSVAEFNYRGY BoLA-3:01101,YSEMYQEKAGTTFANIAYFWYMYYTWAEQNYTWY BoLA-3:01701,YSEMYRERAGNIFVSNLYFWYEYYTWAAQNYRWY BoLA-3:01702,YSEMYRERAGNIFVSNLYFWYMYYTWAAQNYRWY BoLA-3:01703,YSEMYRERAGNIFVSNLYFWYMYYTWAEQNYRWY BoLA-3:02701,YSEMYRNNAGNSFVGTLYLWSMYYTWEYQNYEWH BoLA-3:02702,YSEMYRNNAGNSFVGTLYLWSMYYTWEYQNYEWH BoLA-3:03501,YYNMYQENAGNTFVGTLYLWSEFYTWAAHNYTWY BoLA-3:03601,YYAMYRNNADATFVNTLYFLYEYYTVADHNYRWY BoLA-3:03701,YSEMYRNNAGNSFVGTLYLLYMDYSRAVQNYRWY BoLA-3:03801,YNEMYRNNAGNDSVGTLYLWYMYYSMAVQNYTWY BoLA-3:05001,YSEMYRNNAGNTFGSNLYFLYTYYTWAEWNYTWH BoLA-3:05002,YSEMYRNNAGNTFGSNLYFWYMYYTWAEQNYTWH BoLA-3:05101,YSEMYRERAGNTFVNTLYIWYRDYTWAAENYTWY BoLA-3:05201,YYSMYRENSDTGFVDTLYLLYTYYSVAVQNYRWY BoLA-3:05301,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY BoLA-3:05801,YSEMYRERAGNTFVGTLYLWYMDYSRAVQNYRWY BoLA-3:05901,YSEMYRNNAGNSFVGTLYLWSMFYTWEYQNYRWH BoLA-3:06501,YSEMYQEKAGTSSVGTLYLAYMFYSMAVQNYEWY BoLA-3:06601,YYEMYQEKADTTFVDTLYLLYTYYSMAEFNYTWY BoLA-3:06602,YYEMYQEKADTTFVDTLYLLYTFYSMAEFNYTWY BoLA-3:06801,YSIVYQNNAGTTFANTLYLLYMYYTWAAHNYEWY BoLA-3:07301,YYIIYQEISDTSFVSNLYLWYTYYSMAVQNYEWY BoLA-402401,YSIAYEQIVDTTFANTAYIAYSDYTWEYLNYTWY BoLA-402402,YSIAYEEIVDTTFANTAYLPYSDYTWTYLNYTWY BoLA-406301,YYSTYRENFETTFVNTLYILYTFYSRAALNYRGY BoLA-4:02401,YSIAYEQIVDTTFANTAYIAYSDYTWEYLNYTWY BoLA-4:02402,YSIAYEEIVDTTFANTAYLPYSDYTWTYLNYTWY BoLA-4:06301,YYSTYRENFETTFVNTLYILYTFYSRAALNYRGY BoLA-500301,YLIVYEERADHFFRGALYFEYEFYSWASYNYEWY BoLA-503901,YYIVYQEKADTFFLGTLYLWCWFYTWANENYEWY BoLA-506401,YYIVYQEKADHTFANTLYLWHWFYTWANENYEWY BoLA-507201,YYIVYQEKADHFFLGTLYLWYWFYSWAVQNYTWY BoLA-5:00301,YLIVYEERADHFFRGALYFEYEFYSWASYNYEWY BoLA-5:03901,YYIVYQEKADTFFLGTLYLWCWFYTWANENYEWY BoLA-5:06401,YYIVYQEKADHTFANTLYLWHWFYTWANENYEWY BoLA-5:07201,YYIVYQEKADHFFLGTLYLWYWFYSWAVQNYTWY BoLA-601301,YHTTYREISENWYEANLYLEYEYYSMAAFNYTWY BoLA-601302,YHTTYREISENWYEANLYLLYEYYSMAAFNYTWY BoLA-601401,YHTKYREISENWYEANLYYRYTFYTWAEFNYRGY BoLA-601402,YHTKYREISENKYEAILYYRYTFYTWAEFNYRWY BoLA-601501,YYTKYREISENWYEANLYLLYTFYSMADQNYRGY BoLA-601502,YYTKYREISENWYEANLYLQFTFYSMADQNYRGY BoLA-603401,YHTKYREISENVYGSNLYLLYTFYSMADRNYRGY BoLA-604001,YSEMYEERAGIVFVNTLYLWCWFYSMAAGKYTWY BoLA-604101,YHTKYREISENWYEATLYLEYEYYSMAAFNYRSY BoLA-6:01301,YHTTYREISENWYEANLYLEYEYYSMAAFNYTWY BoLA-6:01302,YHTTYREISENWYEANLYLLYEYYSMAAFNYTWY BoLA-6:01401,YHTKYREISENWYEANLYYRYTFYTWAEFNYRGY BoLA-6:01402,YHTKYREISENKYEAILYYRYTFYTWAEFNYRWY BoLA-6:01501,YYTKYREISENWYEANLYLLYTFYSMADQNYRGY BoLA-6:01502,YYTKYREISENWYEANLYLQFTFYSMADQNYRGY BoLA-6:03401,YHTKYREISENVYGSNLYLLYTFYSMADRNYRGY BoLA-6:04001,YSEMYEERAGIVFVNTLYLWCWFYSMAAGKYTWY BoLA-6:04101,YHTKYREISENWYEATLYLEYEYYSMAAFNYRSY BoLA-AW10,YSEMYRERAGNFFVSNLYLWSMFYSMAEQNYRWY BoLA-D18.4,YYSEYREISENVYESNLYIAYSDYTWEYLNYRWY BoLA-HD6,YHTTYREISENWYEANLYLEYEYYSMAAFNYTWY BoLA-JSP.1,YLEMYQEKAGNFFVSNLYLLSMFYSMAEQNYRWY BoLA-N:00101,YSEMYRERAGNFFVSNLYLWSMFYSMAEQNYRWY BoLA-N:00102,YSSMYRERAGNFFVSNLYLWSMFYSMAEQNYRWY BoLA-N:00103,YSIMYRERAGNFFVSNLYLWSMFYSMAEQNYRWY BoLA-N:00201,YLEMYQEKAGNFFVSNLYLLSMFYSMAEQNYRWY BoLA-N:00301,YLIVYEERADHFFRGALYFEYEFYSWASYNYEWY BoLA-N:00401,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY BoLA-N:00402,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY BoLA-N:00501,YYAEYRNIYDTIFVDTLYIAYWFYTWAAWNYEWY BoLA-N:00601,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEWY BoLA-N:00602,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEWH BoLA-N:00801,YLIMYRENSETTFANTAYVEYMDYTWADWNYRWY BoLA-N:00802,YLIMYRENSETTFANTAYVEYMDYTWADWNYRGY BoLA-N:00901,YYSMYREISENVYGSNLYLLYRDYTWEYLNYRWY BoLA-N:00902,YYSEYREISENVYESNLYLLYRDYTWEYLNYRWY BoLA-N:01001,YYSEYRNIYDTTFVDTLYLEYEYYSVAEFNYRGY BoLA-N:01101,YSEMYQEKAGTTFANIAYFWYMYYTWAEQNYTWY BoLA-N:01201,YYATYRENFDTTFVDTLYIAYRDYTWAEHNYTWY BoLA-N:01301,YHTTYREISENWYEANLYLEYEYYSMAAFNYTWY BoLA-N:01302,YHTTYREISENWYEANLYLLYEYYSMAAFNYTWY BoLA-N:01401,YHTKYREISENWYEANLYYRYTFYTWAEFNYRGY BoLA-N:01402,YHTKYREISENKYEAILYYRYTFYTWAEFNYRWY BoLA-N:01501,YYTKYREISENWYEANLYLLYTFYSMADQNYRGY BoLA-N:01502,YYTKYREISENWYEANLYLQFTFYSMADQNYRGY BoLA-N:01601,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEGY BoLA-N:01602,YSAEYRNIYDTTFVYTLYLWSMFYTWANENYEWY BoLA-N:01701,YSEMYRERAGNIFVSNLYFWYEYYTWAAQNYRWY BoLA-N:01702,YSEMYRERAGNIFVSNLYFWYMYYTWAAQNYRWY BoLA-N:01801,YYADYRNIYDTIFANTAYFEYMFYTWAEQNYRGY BoLA-N:01802,YYADYRNIYDTIFANTAYFEYMFYTWAEQNYRGY BoLA-N:01901,YHTKYREISENVYGSNLYYDYDYYTWAVFNYRGY BoLA-N:02001,YHTKYREISENVYGSNLYFLYMDYTWAVFNYRGY BoLA-N:02101,YYTKYREISENVYGSNLYFQFRYYTWADFNYEGY BoLA-N:02201,YHSEYEQIVDTSFVGTLYLLYEDYTRAALNYTGY BoLA-N:02301,YYSEYREISENVYESNLYIAYSDYTWEYLNYRWY BoLA-N:02401,YSIAYEQIVDTTFANTAYIAYSDYTWEYLNYTWY BoLA-N:02402,YSIAYEEIVDTTFANTAYLPYSDYTWTYLNYTWY BoLA-N:02501,YSAEYRNIYDTTFVYALYLWSWFYTWAAENYRGY BoLA-N:02601,YYAEYREISETTFVDTLYIEYEYYTWAYLNYRGY BoLA-N:02602,YYAEYREISETTFVDTLYIEYEYYTWAYLNYRGY BoLA-N:02701,YSEMYRNNAGNSFVGTLYLWSMYYTWEYQNYEWH BoLA-N:02702,YSEMYRNNAGNSFVGTLYLWSMYYTWEYQNYEWH BoLA-N:02801,YYTKYREISEKLYENTLYLQFRYYTWADFNYEWY BoLA-N:02901,YYTRYREISENLYKNTAYITFMYYTWANENYRGY BoLA-N:03001,YYSEYRNIYDTNFVSNLYLWSWFYTWANENYEWY BoLA-N:03101,YYTKYDEISENLYKNTLYIAFRDYTWAYLNYTWY BoLA-N:03401,YHTKYREISENVYGSNLYLLYTFYSMADRNYRGY BoLA-N:03501,YYNMYQENAGNTFVGTLYLWSEFYTWAAHNYTWY BoLA-N:03601,YYAMYRNNADATFVNTLYFLYEYYTVADHNYRWY BoLA-N:03701,YSEMYRNNAGNSFVGTLYLLYMDYSRAVQNYRWY BoLA-N:03801,YNEMYRNNAGNDSVGTLYLWYMYYSMAVQNYTWY BoLA-N:03901,YYIVYQEKADTFFLGTLYLWCWFYTWANENYEWY BoLA-N:04001,YSEMYEERAGIVFVNTLYLWCWFYSMAAGKYTWY BoLA-N:04101,YHTKYREISENWYEATLYLEYEYYSMAAFNYRSY BoLA-N:04201,YHTKYDEISENLYKDTLYIAYRDYTWEYLNYRGY BoLA-N:04301,YSEMYRERAGNTFVNTLYIWYRDYTWAVFNYLGY BoLA-N:04401,YYAMYEEKADTTFVDTLYIAYRDYTWAVFNYLGY BoLA-N:04501,YYATYRENLDTTFVDTLYIEYRDYTWAEFNYLGY BoLA-N:04601,YSEMYRERAGNTFVNTLYIWYRDYTWAEQNYTWY BoLA-N:04701,YSEMYQERAGNTFVDTLYLWYMDYTWAEQNYTWY BoLA-N:04801,YYSEYEQIVDTSFVGTLYLLYMDYTRAAQNYRGY BoLA-N:04901,YYAEYREISDTSFVGTLYIEYEYYTWAYLNYEGY BoLA-N:05001,YSEMYRNNAGNTFGSNLYFLYTYYTWAEWNYTWH BoLA-N:05101,YSEMYRERAGNTFVNTLYIWYRDYTWAAENYTWY BoLA-N:05201,YYSMYRENSDTGFVDTLYLLYTYYSVAVQNYRWY BoLA-N:05301,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY BoLA-N:05401,YYIMYQENSGATFANTLYFWYWFYTWANENYRGY BoLA-N:05501,YYAEYREISETTFVDSLYIAYRDYTWAYLNYRGY BoLA-N:05601,YYATYQENFDATFANTLYFLSTYYTWEAHNYRGY BoLA-T2C,YYIIYRNISDTSFVSNLYLLYTYYSMAVQNYEWH BoLA-T2a,YYATYRENFDTTFVDTLYIAYRDYTWAEHNYTWY BoLA-T2b,YHTKYREISENWYEATLYLEYEYYSMAAFNYRSY BoLA-T2c,YYIIYRNISDTSFVSNLYLLYTYYSMAVQNYEWH BoLA-T5,YYSEYREISENVYESNLYLLYRDYTWEYLNYRWY BoLA-T7,YLAMYRNNANTTFVNNLYVEHMYYSMAEQNYTWY BoLA-amani.1,YYATYRENLDATFVNTAYIAYMDYTWEYQNYEWY BoLA-gb1.7,YSEMYRNNAGNSFVNTLYLWSMYYTWAYQNYEWY Chi-B0401,YRTYYGQIGLNINENIRRVWFRSYTWEEWNYTWY Chi-B1201,YRDYYGQIGGNIDENILRVWYYMYTWGYLQYTWY Chi-B1501,YSDAYSETSRTIDDGTLRVLYSDYTWGYLQYTWY DLA-8803401,YYAMYGEKVETLYVDTLYITYSDYTRADLNYTWY DLA-8850101,YYAMYPQTIETTFVDTLYRTYRDYTWAVWNYTWY DLA-8850801,YYATYGEKVETVYVDTLYITYRDYTWAVWNYTWY Eqca-100101,YKSMYEETAGHTFGNIAYFWSSFYTWAEHNYRWY Eqca-1600101,YYTMYRESVGHTFVNTLYLLYFYYTWAAFNYRSY Eqca-16:00101,YYTMYRESVGHTFVNTLYLLYFYYTWAAFNYRSY Eqca-1:00101,YKSMYEETAGHTFGNIAYFWSSFYTWAEHNYRWY Gogo-B0101,YDTMYRETSAQTDENIAYIRFSSYTWAELAYTWY H-2-Db,YESYYREKAGQWFVSNLYLQSLFYTWSAYAYEWY H-2-Dd,YVEYYRERAGNSFVDTAYLWAWFYTWAADAYEWY H-2-Dq,YESYYRIIADNWFVSTAYIRYEFYTWGAYAYEWY H-2-Kb,YVEYYREKAGNSFVDTLYIVSQYYTWAELAYTWY H-2-Kd,YVAFYEQRASDWFVSTAYFRFQFYTWADYAYEWY H-2-Kk,YHSYYRNIAGNIFVNTAYFRYEYYTWADDAYTWY H-2-Kq,YHSYYRNIADNSSVDTLYIRYEVYTWAARAYAWH H-2-Ld,YESYYRIIAGQWFVNTLYLWYEFYTWAAYAYEWY H-2-Lq,YESYYRIIAGQWFVNTLYIRYEYYTWAAYAYEWY H-2-Qa1,YHIMYREKADMNFVNTLYLWYCEYSSVEQAYPWY H-2-Qa2,YHSMYREIAGHSFGSTAYLWYLFYTWAIDAYTSY H2-Db,YESYYREKAGQWFVSNLYLQSLFYTWSAYAYEWY H2-Dd,YVEYYRERAGNSFVDTAYLWAWFYTWAADAYEWY H2-Dq,YESYYRIIADNWFVSTAYIRYEFYTWGAYAYEWY H2-Kb,YVEYYREKAGNSFVDTLYIVSQYYTWAELAYTWY H2-Kd,YVAFYEQRASDWFVSTAYFRFQFYTWADYAYEWY H2-Kk,YHSYYRNIAGNIFVNTAYFRYEYYTWADDAYTWY H2-Kq,YHSYYRNIADNSSVDTLYIRYEVYTWAARAYAWH H2-Ld,YESYYRIIAGQWFVNTLYLWYEFYTWAAYAYEWY H2-Lq,YESYYRIIAGQWFVNTLYIRYEYYTWAAYAYEWY H2-Qa1,YHIMYREKADMNFVNTLYLWYCEYSSVEQAYPWY H2-Qa2,YHSMYREIAGHSFGSTAYLWYLFYTWAIDAYTSY HLA-A0101,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A0102,YSAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A0103,YFAMYQENMAHTDANTLYIMYRDYTWVARVYRGY HLA-A0104,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A0106,YFAMYQENMAHTDANTLYIIYRDYTWVALAYRGY HLA-A0107,YFAMYQENVAHTDENTLYIIYRDYTWVARVYRGY HLA-A0108,YFAMYQENMAHTDANTLYIIYRDYTWVARVYWGY HLA-A0109,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A0110,YFAMYQENMAHTDANTLYIIYRDYTWARRVYRGY HLA-A0111,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A0112,YFAMYQENMAHTDANTLYIIYRDYTWAVQAYTGY HLA-A0113,YFAMYQENMAQTDVDTLYIIYRDYTWVARVYRGY HLA-A0114,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTGY HLA-A0115,YFAMYQENMAHTDANTLYIIYRDYTWVARVYGGT HLA-A0117,YFAMYQENMAQTDANTLYIIYRDYTWVARVYRGY HLA-A0118,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A0119,YFAMYQENMAHTDANTLYIIYRDYTWAVQAYTGY HLA-A0120,YSAMYQENMAHTDANTLYVRYRDYTWVARVYRGY HLA-A0121,YFAMYQENMAHTDANTLYIIYRDYTWAVRVYRGY HLA-A0122,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A0123,YFAMYQENVAHTDANTLYIIYRDYTWVARVYRGY HLA-A0124,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A0125,YFAMYQENMAHTDANTLYIIYRDYTWVAQVYRGY HLA-A0126,YFAMYQENMAHTDANTLYIIYRDYTWAARVYRGY HLA-A01:01,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:02,YSAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:03,YFAMYQENMAHTDANTLYIMYRDYTWVARVYRGY HLA-A01:04,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:06,YFAMYQENMAHTDANTLYIIYRDYTWVALAYRGY HLA-A01:07,YFAMYQENVAHTDENTLYIIYRDYTWVARVYRGY HLA-A01:08,YFAMYQENMAHTDANTLYIIYRDYTWVARVYWGY HLA-A01:09,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:10,YFAMYQENMAHTDANTLYIIYRDYTWARRVYRGY HLA-A01:100,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:101,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:102,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:103,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:104,YFAMYQENMAHTHANTLYIIYRDYTWVARVYRGY HLA-A01:105,YFAMYQENIAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:106,YFAMYQENMAHTDANTLYIIYRDYSWVARVYRGY HLA-A01:107,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:108,YFAMYQENMAHTNANTLYIIYRDYTWVARVYRGY HLA-A01:109,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:110,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:111,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:112,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:113,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:114,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:115,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:116,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:117,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:118,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:119,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:12,YFAMYQENMAHTDANTLYIIYRDYTWAVQAYTGY HLA-A01:120,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:121,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:122,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:124,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:125,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:126,YFAMYQENMAHTDANTLYIIYRDYTWVVRVYRGY HLA-A01:127,YFAMYQENMAHTDANTLYIIYRDYTWVAQAYRGY HLA-A01:128,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:129,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:13,YFAMYQENMAQTDVDTLYIIYRDYTWVARVYRGY HLA-A01:130,YFAMYQENMAHTDANTLYVRCRDYTWVARVYRGY HLA-A01:131,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:132,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:133,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:134,YFAMYQENMAHTHVNTLYIIYRDYTWVARVYRGY HLA-A01:135,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:136,YFAMYQENMAHTDANTLYIIYRDYTWAAQAYRGY HLA-A01:137,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:138,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:139,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:14,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTGY HLA-A01:140,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:141,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:142,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:143,YTAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:144,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:145,YFAMYQENMAHTDANTLYIIYQDYTWVARVYRGY HLA-A01:146,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:148,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:149,YFAMYQENMAHTDANTLYIIYRDYTWVARVYGGY HLA-A01:150,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:151,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:152,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:153,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:154,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:155,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:156,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:157,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:158,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:159,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:161,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:163,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:164,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:165,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:166,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:167,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:168,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:169,YFAMCQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:17,YFAMYQENMAQTDANTLYIIYRDYTWVARVYRGY HLA-A01:170,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:171,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:172,YFAMYQENMAHTDANTQYIIYRDYTWVARVYRGY HLA-A01:173,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:174,YFAMYQENMAHTDANTLYIIYRDHTWVARVYRGY HLA-A01:175,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:176,YFAMYQENVAQTDVDTLYIIYRDYTWVARVYRGY HLA-A01:177,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:180,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:181,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:182,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:183,YFAMYQENMAHTDANILYIIYRDYTWVARVYRGY HLA-A01:184,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:185,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:187,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:188,YSAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:189,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:19,YFAMYQENMAHTDANTLYIIYRDYTWAVQAYTGY HLA-A01:190,YSAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:191,YFAMYQEKVAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:192,YFAMYQENMAHTDANTLYIMYRDYTWAARVYRGY HLA-A01:193,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:194,YFAMYQENMAQTDVDTLYIIYRDYTWVARVYRGY HLA-A01:195,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:196,YFAMYQENMAHTDANTLYIIYRDYTWVERVYRGY HLA-A01:197,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:198,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:199,YFSMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:20,YSAMYQENMAHTDANTLYVRYRDYTWVARVYRGY HLA-A01:200,YFAMYQENMAHTDANTLYIIYRDYTWAVLAYTWY HLA-A01:201,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:202,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:203,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:204,YFAMYQENMTHTDANTLYIIYRDYTWVARVYRGY HLA-A01:205,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:206,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:207,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:209,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:21,YFAMYQENMAHTDANTLYIIYRDYTWAVRVYRGY HLA-A01:210,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:211,YFAMYQENMAHSDANTLYIIYRDYTWVARVYRGY HLA-A01:212,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:213,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:214,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:215,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:216,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:217,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:218,YFAMYQENMAHTDANTLYIIYRGYTWVARVYRGY HLA-A01:219,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:220,HFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:221,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:222,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:223,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:224,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:225,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:226,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:227,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:229,YFAMYQENMAHTHVDTLYIIYRDYTWVARVYRGY HLA-A01:23,YFAMYQENVAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:230,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:231,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:232,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:233,YFAMYQENMAHTDANTLYIIYRDYTWVARIYRGY HLA-A01:234,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:235,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:236,YFAMYQENMAHTDANTLYIIYHYYTWVARVYRGY HLA-A01:237,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:238,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:239,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:24,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:241,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:242,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:243,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:244,YFAMYQENMAHTDANTLYIIYRDYTWAVLAYTWY HLA-A01:245,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:246,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:249,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:25,YFAMYQENMAHTDANTLYIIYRDYTWVAQVYRGY HLA-A01:251,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:252,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:253,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:254,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:255,YFAMYQENMAHTDANTLYITYRDYTWVARVYRGY HLA-A01:256,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:257,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:259,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:26,YFAMYQENMAHTDANTLYIIYRDYTWAARVYRGY HLA-A01:260,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:261,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:262,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:263,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:264,YFAMYQENMAHTDANTLYIIYRDYTWFARVYRGY HLA-A01:265,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:266,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:267,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:268,YFAMYQENMAHTDANTLYIIYRDQTWVARVYRGY HLA-A01:270,YFAMYQENMAHTGANTLYIIYRDYTWVARVYRGY HLA-A01:271,YFAMYQENMAHTDANTLYIIYWDYTWVARVYRGY HLA-A01:272,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:273,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:274,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:275,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:276,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:277,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:278,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:279,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:28,YFAMYQENMAHTDVDTLYIIYRDYTWVARVYRGY HLA-A01:280,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:281,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:282,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:283,YFTMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:284,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRRY HLA-A01:286,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:288,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:289,YFAMYQENMAHTDENIAYIIYRDYTWVARVYRGY HLA-A01:29,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:291,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:292,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:294,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:295,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:296,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:297,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:30,YFAMYQENMAHTDANTLYIIYHYYTWVARVYRGY HLA-A01:32,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:33,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:35,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:36,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:37,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:38,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:39,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:40,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:41,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:42,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:43,YYAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:44,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:45,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:46,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:47,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:48,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:49,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:50,YFAMYQENMAHTDANTLYIIYREYTWVARVYRGY HLA-A01:51,YFAMYRNNVAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:54,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:55,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:58,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:59,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:60,YFAMYPENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:61,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:62,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:63,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:64,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:65,YFAMYQENMAHTDANTLYIIYRDYTWVARVCRGY HLA-A01:66,YFAMYQENMAHTDANTLYVRYRDYTWVARVYRGY HLA-A01:67,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:68,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:69,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:70,YFAMYQENMAHTDANTLYIIYRDYTCVARVYRGY HLA-A01:71,YFAMYQDNMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:72,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRWY HLA-A01:73,YFAMYQENMAHTDANTLYLRYRDYTWVARVYRGY HLA-A01:74,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:75,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:76,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:77,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:78,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:79,YFAMYQENMAHTDANTLYIIYPDYTWVARVYRGY HLA-A01:80,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:81,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:82,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:83,YFAMYGEKVAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:84,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:85,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:86,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:88,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:89,YFAMYQENMAHTDANTLYLIYRDYTWVARVYRGY HLA-A01:90,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:91,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:92,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:93,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:94,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:95,YFAMYQENMAHTDENIAYIIYRDYTWVARVYRGY HLA-A01:96,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:97,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A01:98,YFAMYQENMAHTDANTLYIIYRDYTWVARAYRGY HLA-A01:99,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A0201,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0202,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A0203,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A0204,YFAMYGEKVAHTHVDTLYVMYHYYTWAVLAYTWY HLA-A0205,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A0206,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0207,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A0208,YYAMYGENVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A0209,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0210,YYAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A0211,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A0212,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY HLA-A0213,YFAMYGEKVAHTHVDTLYVRYHYYTWAEQAYTWY HLA-A0214,YYAMYGEKVAHTHVDTLYLRYHYYTWAVLAYTWY HLA-A0215,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A0216,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYEWY HLA-A0217,YFAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A0218,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A0219,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY HLA-A0220,YFAMYGENVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0221,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0222,YFAMYGEKVAHTHVDTLYVRYHYYTWAVWAYTWY HLA-A0224,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0225,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0226,YFAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A0227,YFAMYGEKVAHTHVDTLYVRYHYYTWAAQAYTWY HLA-A0228,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0229,YFAMYGEQVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0230,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0231,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0233,YFAMYGEKVAHTHVDTLYVRSHYYTWAVLAYTWY HLA-A0234,YFAMYGEKVAQTHVDTLYVRYHYYTWAVLAYTWY HLA-A0235,YFAMYGEKVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A0236,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTGY HLA-A0237,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY HLA-A0238,YFAMYGEKVAHTHVDTLYVRYHYYTWAEQAYRWY HLA-A0239,YFAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A0240,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0241,YYAMYGEKVAHTHVDTLYVRYQYYTWAVLAYTWY HLA-A0242,YFSMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0243,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0244,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY HLA-A0245,YFAMYQEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0246,YFAMYEEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0247,YFAMYGEKVAHSHVDTLYLRYHYYTWAVWAYTWY HLA-A0248,YFAMYEEKVAHTDVDTLYVRYHYYTWAVLAYTWY HLA-A0249,YFAMYGEKVAHTHVDTLYVRYHYYTWAVRAYTWY HLA-A0250,YFAMYGEKVAHTHVDTLYIRYHYYTWAVWAYTWY HLA-A0251,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0252,YFAMYGEKVAHTHVDTLYVRYEHYTWAVLAYTWY HLA-A0254,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY HLA-A0255,YFAMYRNNVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0256,YFAMYQENVAQTHVDTLYVRYHYYTWAVLAYTWY HLA-A0257,YYAMYGEKVAHTHVDTLYLMYHYYTWAVLAYTWY HLA-A0258,YFAMYGEKVAHTHVDTLYLRYHYYTWAVLAYTWY HLA-A0259,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0260,YFAMYGEKVAHTHVDTLYVRYHFYTWAVLAYTWY HLA-A0261,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0262,YFAMYGENVAQTHVDTLYVRYHYYTWAVLAYTWY HLA-A0263,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A0264,YFAMYGEKVAHTHVDTLYVRYHSYTWAVLAYTWY HLA-A0265,YFAMYGEKVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A0266,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0267,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0268,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0269,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A0270,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0271,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0272,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0273,YFAMYGEKVAHTHVDTLYIRYHYYTWAVLAYTWY HLA-A0274,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0275,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0276,YSAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0277,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0278,YYAMYQENVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A0279,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0280,YFAMYGEKVAHTHVDTLYVRYQDYTWAVLAYTWY HLA-A0281,YFAMYGEKVAHTDESIAYVRYHYYTWAVLAYTWY HLA-A0283,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0284,YYAMYGEKVAHTHVDTLYFRYHYYTWAVLAYTWY HLA-A0285,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0286,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0287,YFAMYGEKVAHTDENIAYVRYHYYTWAVLAYTWY HLA-A0289,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0290,YFAMYGEKVAHTDVDTLYVRYHYYTWAVLAYTWY HLA-A0291,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0292,YFAMYEEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0293,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0295,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0296,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0297,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A0299,YYAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A02:01,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:02,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:03,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:04,YFAMYGEKVAHTHVDTLYVMYHYYTWAVLAYTWY HLA-A02:05,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:06,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:07,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:08,YYAMYGENVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:09,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:10,YYAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A02:101,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYRWY HLA-A02:102,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:103,YFAMYQENVAQTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:104,YFAMYGEKVAHTHVDTLYVRYHYYTWAVWAYTWY HLA-A02:105,YFAMYGEKVAHTHVDTLYVRYEYYTWAVLAYTWY HLA-A02:106,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:107,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:108,YYAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A02:109,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:11,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:110,YFAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A02:111,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:112,YFAMYGEKVAHTDENIAYVRCHYYTWAVLAYTWY HLA-A02:114,YFAMYGEKVAHTHVDTLYVRYRDYTWAVLAYTWY HLA-A02:115,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:116,YFAMYGEKVAHTHLDTLYVRYHYYTWAVLAYTWY HLA-A02:117,YFAMYGEKVAHTHVDTLYVRYQDYTWAEWAYTWY HLA-A02:118,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:119,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:12,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY HLA-A02:120,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:121,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:122,YYAMYGEKVAHTHVDTLYIRYHYYTWAVWAYTWY HLA-A02:123,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:124,YFAMYGEKVAHTDESIAYVRYHYYTWAVLAYTWY HLA-A02:126,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:127,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYKWY HLA-A02:128,YFAMYGENVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:129,YYAMYEEKVAHTDENIAYVRYHYYTWAVLAYTWY HLA-A02:13,YFAMYGEKVAHTHVDTLYVRYHYYTWAEQAYTWY HLA-A02:130,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:131,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYEWY HLA-A02:132,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:133,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:134,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:135,YFAMYGEKVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A02:136,YFAMYGEKVAHTDENIAYVRYHYYTWAVWAYTWY HLA-A02:137,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:138,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:139,YFAMYGEKVTHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:14,YYAMYGEKVAHTHVDTLYLRYHYYTWAVLAYTWY HLA-A02:140,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:141,YFVMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:142,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY HLA-A02:143,YYAMYREKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:144,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:145,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:146,YFAMYGEKVAHTDANTLYVRYHYYTWAVLAYTWY HLA-A02:147,YFAMYGEKVAHTHVDTLYVRYDYYTWAVLAYTWY HLA-A02:148,YFAMYGEKVAHTHVDTLYVRFHYYTWAEWAYTWY HLA-A02:149,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:150,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:151,YFAMYGEKVAHTHVDTLYVRYDYYTWAVLAYTWY HLA-A02:152,YFAMYGEKVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A02:153,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:154,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYRWY HLA-A02:155,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:156,YFAMYGEKVAHTHVDTLYIIYHYYTWAVLAYTWY HLA-A02:157,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:158,YFAMYGEKVAHAHVDTLYVRYHYYTWAVLAYTWY HLA-A02:159,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:16,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYEWY HLA-A02:160,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:161,YFAVYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:162,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:163,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:164,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:165,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:166,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:167,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYKWY HLA-A02:168,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:169,YYAMYQENVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:17,YFAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A02:170,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:171,YFAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A02:172,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:173,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:174,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:175,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:176,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:177,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:178,YYAMYGEKVAHTHVDTLYVRYHSYTWAVLAYTWY HLA-A02:179,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:18,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:180,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:181,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:182,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:183,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:184,YFAMYGEKVAHTHEDTLYVRYHYYTWAVLAYTWY HLA-A02:185,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:186,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:187,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:188,YFAMYGEKVAHTHVDTLYVRYDSYTWAVLAYTWY HLA-A02:189,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:19,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY HLA-A02:190,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:191,YFAMYGEKVAHTHVDTLYVRCHYYTWAVWAYTWY HLA-A02:192,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:193,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:194,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:195,YFAMYQENVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:196,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:197,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:198,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:199,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:20,YFAMYGENVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:200,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:201,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:202,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:203,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:204,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:205,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:206,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:207,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:208,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:209,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:21,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:210,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:211,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:212,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:213,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:214,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:215,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:216,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:217,YFAMYREKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:218,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:219,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:22,YFAMYGEKVAHTHVDTLYVRYHYYTWAVWAYTWY HLA-A02:220,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:221,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:224,YFAMYGEKVAHTHVDTLYVGYHYYTWAVLAYTWY HLA-A02:228,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:229,YYAMYGEKVAHTHVDTLYLRYRYYTWAVWAYTWY HLA-A02:230,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:231,YFAMYGEKVAHTHVDTLYVRNHYYTWAVLAYTWY HLA-A02:232,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:233,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTRY HLA-A02:234,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:235,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:236,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:237,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:238,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:239,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:24,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:240,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:241,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:242,YFAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A02:243,YTAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:244,YYAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A02:245,YFAMYGEKVAHTHVDTLYIRYHYYTWAVLAYTWY HLA-A02:246,YFAMYGEKVAHTHVDTLYVRYRDYTWAVLAYTWY HLA-A02:247,YFAMYGEKVAHTDENTLYVRYHYYTWAVLAYTWY HLA-A02:248,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:249,YFAMYVEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:25,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:251,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:252,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:253,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:254,YFAMYGEKVAHTHVDTLYVRYNFYTWAVLAYTWY HLA-A02:255,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTGY HLA-A02:256,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:257,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:258,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:259,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:26,YFAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A02:260,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:261,YFAMYGEKVAHTHMDTLYVRCHYYTWAVLAYTWY HLA-A02:262,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLVYTWY HLA-A02:263,YFAMYGEKVAHTHVDTLYVRYHYYTWSVLAYTWY HLA-A02:264,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:265,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:266,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:267,YFAMYGEKVAHTHVDTLYVRYHYYTWAAWAYTWY HLA-A02:268,YFAMYGEKVAHTHVDTLYVMFHYYTWAVLAYTWY HLA-A02:269,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:27,YFAMYGEKVAHTHVDTLYVRYHYYTWAAQAYTWY HLA-A02:270,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:271,YYAMYGEKVAHTHVDTLYLRYHYYTWAVQAYTWY HLA-A02:272,YFAMYGEKLAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:273,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:274,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:275,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:276,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:277,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:278,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:279,YFAMYGEKVAHTHVDTLYVRYRDYTWAVLAYTWY HLA-A02:28,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:280,YFAMYGEKVAHTHVDTLYVRYHYYTWAEQAYTWY HLA-A02:281,YFAMYGEKVAHTHVDILYVRYHYYTWAEWAYTWY HLA-A02:282,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:283,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:285,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:286,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:287,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:288,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:289,YFAMYGEKVAHTHVDTLYVRYQYYTWAVLAYTWY HLA-A02:29,YFAMYGEQVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:290,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:291,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:292,YFAMYGEKVSHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:294,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:295,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:296,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:297,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:298,YFAMYGEKVAHIDVDTLYVRYHDYTWAVLAYTWY HLA-A02:299,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:30,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:300,YYAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A02:302,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:303,YFAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A02:304,YFAMYGEKVAHTHVDTLYVRYQDYTWAVLAYTWY HLA-A02:306,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:307,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:308,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:309,YFAMYGEKVAHTHVDTLYVRYQDYTWAVLAYTWY HLA-A02:31,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:310,YYSMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:311,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:312,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:313,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:315,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:316,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:317,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:318,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:319,YSAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:320,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:322,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:323,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:324,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:325,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:326,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:327,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:328,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:329,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:33,YFAMYGEKVAHTHVDTLYVRSHYYTWAVLAYTWY HLA-A02:330,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:331,YYAMYGEKVAHTDVDTLYVRYHYYTWAVLAYTWY HLA-A02:332,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWH HLA-A02:333,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:334,YFAMYGEKVAHTHVDTLYIMYHYYTWAVLAYTWY HLA-A02:335,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:336,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:337,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:338,YFAMYGEKVAHTHVDTLYIIYHYYTWAVLAYTWY HLA-A02:339,YFAMYGEKVAHTHVDTLYVRYDLYTWAVLAYTWY HLA-A02:34,YFAMYGEKVAQTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:340,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:341,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:342,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:343,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:344,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:345,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:346,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:347,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:348,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:349,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:35,YFAMYGEKVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A02:351,YFAMYGEKVARTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:352,CFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:353,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:354,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYAWY HLA-A02:355,YYAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:357,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:358,YYAMYEEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:359,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:36,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTGY HLA-A02:360,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:361,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:362,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:363,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:364,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:365,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:367,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:368,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:369,YFAMYEEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:37,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY HLA-A02:370,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:371,YFAMYGEKVAHTHVDTLYVRYHYYIWAVLAYTWY HLA-A02:372,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:374,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:375,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:376,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYLWY HLA-A02:377,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:378,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:379,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:38,YFAMYGEKVAHTHVDTLYVRYHYYTWAEQAYRWY HLA-A02:380,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:381,YFAMYGEKVAHTHVDSLYVRYHYYTWAVLAYTWY HLA-A02:382,YYAMYGEKVAHTHVDTLYVRYHYYTWAVWAYTWY HLA-A02:383,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:384,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:385,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYMWY HLA-A02:386,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:387,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:388,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:389,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:39,YFAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A02:390,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:391,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:392,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:393,YFAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A02:394,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:396,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:397,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:398,YYAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A02:399,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:40,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:400,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:401,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:402,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:403,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLTYTWY HLA-A02:404,YYAMYGEKVAHTHVDTLYVRYHHYTWAVLAYTWY HLA-A02:405,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:406,YFAMYGEKVAHTHVDTLYVRYHDYTWAVLAYTWY HLA-A02:407,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:408,YFAMYGEKVAHTHVDTLYVRCHYYTWAALAYTWY HLA-A02:409,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:41,YYAMYGEKVAHTHVDTLYVRYQYYTWAVLAYTWY HLA-A02:410,YFAMYAEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:411,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:412,YFAMYGEKVAHTHVDTLYVRYHSYTWAEWAYTWY HLA-A02:413,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:414,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:415,YYAMYGENVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:416,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:417,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY HLA-A02:418,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:419,YYAMYREKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:42,YFSMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:420,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:421,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:422,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:423,YFAMYGEKVAHTHVDTLYVRYHHYTWAVLAYTWY HLA-A02:424,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:425,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:426,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:427,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:428,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:429,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:430,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:431,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:432,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTSY HLA-A02:433,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:434,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:435,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:436,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:437,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYEWY HLA-A02:438,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:44,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY HLA-A02:441,HFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:442,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:443,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:444,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:445,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:446,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:447,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYRWY HLA-A02:448,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:449,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:45,YFAMYQEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:450,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:451,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:452,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:453,YYAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A02:454,YYAMYGEKVAHTHVDTLYVRYQDYTWAVLAYTWY HLA-A02:455,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:456,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:457,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:458,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:459,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:46,YFAMYEEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:460,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:461,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:462,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:463,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:464,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:465,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:466,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:467,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:469,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:47,YFAMYGEKVAHSHVDTLYLRYHYYTWAVWAYTWY HLA-A02:470,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:471,YYAMYGEKVVHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:472,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:473,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:474,YYAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:475,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:477,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:478,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:479,YFAMYGEKVAHSHVDTLYVRYHYYTWAVLAYTWY HLA-A02:48,YFAMYEEKVAHTDVDTLYVRYHYYTWAVLAYTWY HLA-A02:480,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:481,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:482,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:483,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:484,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:485,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:486,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:487,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYEWY HLA-A02:488,YFAMYGEKVAHTHVDTLYVRYHYCTWAVLAYTWY HLA-A02:489,YYAMYGEKVAHTHVDTLYLRYHYYTWAEWAYTWY HLA-A02:49,YFAMYGEKVAHTHVDTLYVRYHYYTWAVRAYTWY HLA-A02:491,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:492,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:493,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:494,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:495,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:496,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:497,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:498,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:499,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:50,YFAMYGEKVAHTHVDTLYIRYHYYTWAVWAYTWY HLA-A02:502,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:503,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:504,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:505,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:507,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:508,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:509,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:51,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:510,YFAMYGEKVAHTHVDTLYVRYHLYTWAVLAYTWY HLA-A02:511,YFAMYGEKVAHTHVDTLYVSYHYYTWAVLAYTWY HLA-A02:512,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:513,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:515,YFAMYGEKVAHTHMDTLYVRYHYYTWAVLAYTWY HLA-A02:517,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:518,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:519,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:52,YFAMYGEKVAHTHVDTLYVRYEHYTWAVLAYTWY HLA-A02:520,YFAMYGEKVAHTHVDTLYVRYYYYTWAVLAYTWY HLA-A02:521,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:522,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:523,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:524,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:526,YFAMYGEKVAHTHVDTLYVKYHYYTWAVLAYTWY HLA-A02:527,YYAMYGEKVAHTHVDTLYLRYRDYTWAVWAYTWY HLA-A02:528,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:529,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYMWY HLA-A02:530,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:531,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:532,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:533,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:534,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:535,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:536,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:537,YFAMYGEKVAHTHVDTLYVRYHYYTWDVLAYTWY HLA-A02:538,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:539,YFAMYGEKVAHTHVDTLYVRYHYYTLAVLAYTWY HLA-A02:54,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY HLA-A02:541,YFAMYGEKVAHTHVDTLYVRCHYYTWAELAYTWY HLA-A02:542,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:543,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYRWY HLA-A02:544,YFAMYGEKVAHTHVDTLYVRCHYYTWAEWAYTWY HLA-A02:545,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:546,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:547,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLVYTWY HLA-A02:548,YFAMYGEKVAHTHVDTLYVRHHYYTWAVLAYTWY HLA-A02:549,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:55,YFAMYRNNVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:550,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:551,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:552,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:553,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:554,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:555,YFAMYGEKVAHTHVDTLYVRYNYYTWAVLAYTWY HLA-A02:556,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:557,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:558,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:559,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:56,YFAMYQENVAQTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:560,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYEWY HLA-A02:561,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:562,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:563,YFAMYGEKVAHTHVDTLYVRYHYYAWAVLAYTWY HLA-A02:564,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:565,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:566,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:567,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:568,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:569,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:57,YYAMYGEKVAHTHVDTLYLMYHYYTWAVLAYTWY HLA-A02:570,YFTMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:571,YFAMYEEKVAHTDENIAYVRYHYYTWAVLAYTWY HLA-A02:572,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:573,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:574,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:575,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:576,YFAMYGEKVAHTHVDTLYVRYHYYTWVVLAYTWY HLA-A02:577,YYAMYGEKVAHTHGDTLYLRYHYYTWAVWAYTWY HLA-A02:578,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:579,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:58,YFAMYGEKVAHTHVDTLYLRYHYYTWAVLAYTWY HLA-A02:580,YFAMYGEKVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A02:581,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYEWY HLA-A02:582,YFAMYGEKVAHTHVDTLYVRYRDYTWAVWAYTWY HLA-A02:583,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:584,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:585,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:586,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:587,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:588,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:589,YFAMYGEKVAHIDVDTLYVRYHYYTWAELAYTWY HLA-A02:59,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:590,YFAMYGEKVAHTHVDTLYVRYHYYTWAALAYTWY HLA-A02:591,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:592,YYAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A02:593,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:594,YFAMYGEKVAHTHVDTLYVRYNFYTWAVLAYTWY HLA-A02:595,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:596,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:597,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:598,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:599,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:60,YFAMYGEKVAHTHVDTLYVRYHFYTWAVLAYTWY HLA-A02:600,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:601,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:602,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:603,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:604,YFAMYGEKVAHTHVDTLYVRIHYYTWAVLAYTWY HLA-A02:606,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:607,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:609,YFAMYGENMAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:61,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:610,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:611,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:612,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:613,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:614,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:615,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:616,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:617,YFAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A02:619,YFAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A02:62,YFAMYGENVAQTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:620,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:621,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:623,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:624,YFAMYGEKVAHTHVDTLCVRYHYYTWAVLAYTWY HLA-A02:625,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:626,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:627,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:628,YFAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A02:629,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:63,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:630,YYAMYGEKVAHTHVDTLYVRFHYYTWAVQAYTWY HLA-A02:631,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:632,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:633,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:634,YFAMYGENVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:635,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:636,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:637,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:638,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:639,YFAMYGEKVAHTHVDILYVRYHYYTWAVLAYTWY HLA-A02:64,YFAMYGEKVAHTHVDTLYVRYHSYTWAVLAYTWY HLA-A02:640,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:641,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:642,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:644,YFAMYRNNVAHTDANTLYVRYHYYTWAVLAYTWY HLA-A02:645,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:646,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:647,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:648,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:649,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:65,YFAMYGEKVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A02:650,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:651,YFAMYGEKVAHTHVDTLYVRYHYYTWAVWAYTWY HLA-A02:652,YFAMYGEKVAHTHVDTLNVRCHYYTWAVLAYTWY HLA-A02:653,YFAMYGEKVAHTHVDTLHVRYHYYTWAVLAYTWY HLA-A02:654,YFAMYGEKVAHTHVDTLYVRYHYYTCAVLAYTWY HLA-A02:655,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:656,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:657,YFAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A02:658,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:659,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:66,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:660,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:661,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:662,YFAMYGEKVAHTHVDTLYVRYRDYTWAAQAYTWY HLA-A02:663,YFAMYGEKVAYTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:664,YFAMYGEKVAHTHVDTLYVMYHYYTWAVLAYTWY HLA-A02:665,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:666,YSAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:667,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:668,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:669,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:67,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:670,YYAMYGEKVAHTHVDTLHLRYHYYTWAVWAYTWY HLA-A02:671,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:673,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:674,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:676,YYAMYGEKVAHTHVDTLYLRYHSYTWAVWAYTWY HLA-A02:677,YFAMYGEKVDHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:678,YFAMYGEKVAHTHVDTLYVRCHSYTWAVLAYTWY HLA-A02:679,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:68,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:680,YFAMYGEKVAHTHVDTLYLMFHYYTWAVWAYTWY HLA-A02:681,YFAMYGEKVAHTHVDTLYVRYRYYTWAVLAYTWY HLA-A02:682,YFAMYGEKVAHTHVDTLYVRYHYYTWVARAYTWY HLA-A02:683,YFAMYGEKVAHTHVDTLYVRYHYYTWAVRAYTWY HLA-A02:684,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:685,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:686,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:687,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:688,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:689,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:69,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:690,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:692,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:693,YFAMYGEKVAHTHVDTLYVRYHYYTWAVFAYEWY HLA-A02:694,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:695,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:697,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:698,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:699,YFAMYGEKVAHTHVDTLYVRYHYYTWAGLAYTWY HLA-A02:70,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:700,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQVYTWY HLA-A02:701,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:702,YFAMYGEKVALTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:703,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:704,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:705,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:706,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:707,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:708,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLANTWY HLA-A02:709,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:71,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:711,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:712,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:713,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:714,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:716,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:717,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:718,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:719,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:72,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:720,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:721,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:722,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:723,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY HLA-A02:724,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:725,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:726,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:727,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:728,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:729,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:73,YFAMYGEKVAHTHVDTLYIRYHYYTWAVLAYTWY HLA-A02:730,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:731,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:732,YFAMYGEKVAHTHVYTLYVRYHYYTWAVLAYTWY HLA-A02:733,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:734,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:735,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:736,YFAMYGEKVAHTHVDTLYVWYHYYTWAVLAYTWY HLA-A02:737,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:738,YFAMYGEKVVHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:739,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:74,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:740,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:741,YFAMYRNKVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A02:742,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:743,YFAMYGEKVAHTHVDTLYVRYNYYTWAVLAYTWY HLA-A02:744,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:745,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:746,YFAMYWEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:747,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:749,YFAMYGEKVAHTDANTLYVRYHYYTWAVLAYTWY HLA-A02:75,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:750,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:751,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:752,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:753,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:754,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:755,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:756,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:757,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:758,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:759,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:76,YSAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:761,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:762,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:763,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:764,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:765,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:766,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:767,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:768,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:769,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:77,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:770,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:771,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:772,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:774,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:776,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:777,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:778,YYAMYGEKVAHNHVDTLYLRYHYYTWAVWAYTWY HLA-A02:779,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:78,YYAMYQENVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A02:780,YFAMYGEQVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:781,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:782,YFAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A02:783,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:784,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:785,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:786,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:787,YFAMYGEKVVHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:79,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:790,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:794,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:795,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:798,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:799,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:80,YFAMYGEKVAHTHVDTLYVRYQDYTWAVLAYTWY HLA-A02:800,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:801,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:802,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:804,YFAMYGEKVAHTHVDTLYLMFHYYTWAVQAYTGY HLA-A02:808,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:809,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A02:81,YFAMYGEKVAHTDESIAYVRYHYYTWAVLAYTWY HLA-A02:810,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:811,YFAMYGEKVAHTHVDTLYVRYHYYTWAVFAYTWY HLA-A02:812,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:813,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:814,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:815,YFAMYRNNVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:816,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:817,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A02:818,YYAMYGEKVAHTHVDTLYLRYHYYTWAVLAYTWY HLA-A02:819,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:820,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:821,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A02:822,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A02:823,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:824,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:825,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:84,YYAMYGEKVAHTHVDTLYFRYHYYTWAVLAYTWY HLA-A02:85,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:86,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:87,YFAMYGEKVAHTDENIAYVRYHYYTWAVLAYTWY HLA-A02:89,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:90,YFAMYGEKVAHTDVDTLYVRYHYYTWAVLAYTWY HLA-A02:91,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:92,YFAMYEEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:93,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:95,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:96,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:97,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A02:99,YYAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A0301,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0302,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A0303,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0304,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0305,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0306,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0307,YFAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY HLA-A0308,YFAMYQENVAHTDVDTLYIIYRDYTWAELAYTWY HLA-A0309,YFAMYQENVAQTHVDTLYIIYRDYTWAELAYTWY HLA-A0310,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A0312,YYAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0313,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0314,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0315,YFAMYQENVAQTDVDTLYIIFRDYTWAELAYTWY HLA-A0316,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0317,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0318,YFAMYQENVAQTDVDTLYIIYRDYTWVARVYRGY HLA-A0319,YFAMYQENVAQTDVDTLYIIFHYYTWAELAYTWY HLA-A0320,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0321,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0322,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0323,YFAMYGEKVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0324,YFAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0325,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0326,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0327,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0328,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A0329,YFAMYQENVVQTDVDTLYIIYRDYTWAELAYTWY HLA-A0330,YFAMYEEKVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:01,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:02,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:04,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:05,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:06,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:07,YFAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY HLA-A03:08,YFAMYQENVAHTDVDTLYIIYRDYTWAELAYTWY HLA-A03:09,YFAMYQENVAQTHVDTLYIIYRDYTWAELAYTWY HLA-A03:10,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:100,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:101,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:102,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:103,YFAMYQENVAQTDVDTLYIIYQDYTWAELAYTWY HLA-A03:104,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWH HLA-A03:105,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYRWY HLA-A03:106,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:107,YFAMYQENMAHTDANTLYIIYRDYTWAELAYTWY HLA-A03:108,YFAMYQENVAHTHVDTLYIIYRDYTWAELAYTWY HLA-A03:109,YFAMYQENVAQTDVHTLYIIYRDYTWAELAYTWY HLA-A03:110,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:111,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:112,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:113,YFAMYQEKVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:114,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:115,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:116,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:117,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:118,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:119,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:12,YYAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:120,YFAMYQENVAQTDVDTLYIIYRDCTWAELAYTWY HLA-A03:121,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:122,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTGY HLA-A03:123,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:124,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:125,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:126,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:127,YFAMYQENVAQTDVDTLYIIYRDYTWAALAYTWY HLA-A03:128,YFAMYQENVAQTDLDTLYIIYRDYTWAELAYTWY HLA-A03:13,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:130,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:131,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:132,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:133,YFAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY HLA-A03:134,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:135,YFAMYQENVAQTDVDTLYIIYRDYTWAERVYRGY HLA-A03:136,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:137,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:138,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:139,YFAMYQENVAQTDVDTLYIIYRDYTWAKLAYTWY HLA-A03:14,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:140,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:141,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:142,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:143,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:144,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:145,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:146,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:147,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:148,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:149,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:15,YFAMYQENVAQTDVDTLYIIFRDYTWAELAYTWY HLA-A03:150,YFAMYQENVAQTDVDTLYIIYRDYTWAELVYTWY HLA-A03:151,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:152,YFAMYEEKVAHTDENIAYIIYRDYTWAELAYTWY HLA-A03:153,YFAMYQENVAQTDVDTLYIIYRDYTWAERVYTWY HLA-A03:154,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:155,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:156,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:157,YFAMYQEKVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:158,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:159,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:16,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:160,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:163,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:164,YFAMYQENMAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:165,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:166,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:167,YFAMYQENVAQTDVDTLYIIYRDYTWAEQAYTGY HLA-A03:169,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:17,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:170,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:171,YFAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY HLA-A03:172,YFAMYQEKVAHTHVDTLYIIYRDYTWAELAYTWY HLA-A03:173,YFAMYQENVAQTDEDTLYIIYRDYTWAELAYTWY HLA-A03:174,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:175,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:176,YFAMYQEKVAHTDVDTLYIIYRDYTWAELAYTWY HLA-A03:177,YFAMYQENVAQTDVDTLYIRYRDYTWAELAYTWY HLA-A03:179,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:18,YFAMYQENVAQTDVDTLYIIYRDYTWVARVYRGY HLA-A03:180,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:181,YFAMYQENVAQTDVDSLYIIYRDYTWAELAYTWY HLA-A03:182,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:183,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:184,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:185,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:186,YFAMYQENVAQTDVDTLYIIYEHYTWAELAYTWY HLA-A03:187,YFAMYQENVAQTDVDTLYIIYRDYTWVARVYTWY HLA-A03:188,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:189,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:19,YFAMYQENVAQTDVDTLYIIFHYYTWAELAYTWY HLA-A03:190,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:191,YFAMYQENVAQTDVDTLYIIYGDYTWAELAYTWY HLA-A03:193,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:195,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:196,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:198,YFAMYGEKVAHTHVDTLYIIYRDYTWAVQAYTWY HLA-A03:199,YFAMYQENVAQSDVDTLYIIYRDYTWAELAYTWY HLA-A03:20,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:201,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:202,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:203,YFAMYQENVAQSDVDTLYIIYRDYTWAELAYTWY HLA-A03:204,YFAMYQENVAQTDVDTLYMVYRDYTWAELAYTWY HLA-A03:205,YTAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:206,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:207,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:208,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYEWY HLA-A03:209,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:210,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:211,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:212,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:213,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:214,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:215,YFAMYQENVAQTDVDTLYIMYRDYTWAELAYTWY HLA-A03:216,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:217,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:218,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:219,YFAMYQENVAQTDENIAYIIYRDYTWAELAYTWY HLA-A03:22,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:220,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:221,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:222,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:223,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:224,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:225,YFAMYQENVAQTDVDTLYIIYRDYTWAERAYTWY HLA-A03:226,YFAMYQENVAQTDVDTLYIIYPDYTWAELAYTWY HLA-A03:227,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:228,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:229,YFAMYQENVAQTDVDTLYIIYRDYTWAEQAYTWY HLA-A03:23,YFAMYGEKVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:230,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:231,YFAMYQENVAQTDVDTLYIIYRDYTWARLAYTWY HLA-A03:232,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:233,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:235,YFAMYQENVAQTDVDTLYNIYRDYTWAELAYTWY HLA-A03:236,YFAMYQENVAQTDVDTLYIIYGDYTWAVQAYTWY HLA-A03:237,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:238,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:239,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:24,YFAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:240,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:241,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:242,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:243,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:244,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:245,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:246,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:247,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:248,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:249,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:25,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:250,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:251,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:252,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:253,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:254,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:255,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:256,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:257,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:258,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:259,YFAMYQENVAQTYVDTLYIIYRDYTWAELAYTWY HLA-A03:26,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:260,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:261,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:263,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:264,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:265,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:267,YFAMYQENVAQTDVNTLYIIYRDYTWAELAYTWY HLA-A03:268,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:27,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:270,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:271,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:272,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:273,YFAMYEEKVAHTDENTLYIIYRDYTWAELAYTWY HLA-A03:274,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:276,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:277,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:278,YFAMYLQNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:28,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:280,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:281,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:282,YFAMYQENVAQTDVDTLYIIYQDYTWAELAYTWY HLA-A03:285,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:287,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:288,YFAMYQENVAQTDVDTLYMIYRDYTWAELAYTWY HLA-A03:289,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:29,YFAMYQENVVQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:290,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:291,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:292,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:293,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:294,YFAMYQENVAQTDVDTLYIIYRDYIWAELAYTWY HLA-A03:295,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:296,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:298,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:299,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:30,YFAMYEEKVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:300,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:301,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:302,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:303,YFAMYEENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:304,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:305,YFAMYQENVAQTDVDILYIIYRDYTWAELAYTWY HLA-A03:306,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:307,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:308,YFAMYQENVAQTDVDTLYIIYRDYTWAELAHTWY HLA-A03:309,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:31,YFAMYQENVAQTDVDTLYIIYRYYTWAVQAYTWY HLA-A03:310,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:311,YFAMYQENVAQTDVDTLYIIHRDYTWAELAYTWY HLA-A03:312,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:313,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:314,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:315,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:316,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:317,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:318,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:319,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:32,YFAMYQENVAHIDVDTLYIIYRDYTWAVQAYTWY HLA-A03:320,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:321,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:322,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:324,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:325,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:326,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYKWY HLA-A03:327,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:328,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:33,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:331,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:332,YFAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY HLA-A03:333,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:34,YFAMYQENVAPTDVDTLYIIYRDYTWAELAYTWY HLA-A03:35,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:37,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:38,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:39,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:40,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:41,YFAMYQENVAHTDANTLYIIYRDYTWAELAYTWY HLA-A03:42,YFAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY HLA-A03:43,YFAMYQENVAQTDVDTLYIIYEHYTWAELAYTWY HLA-A03:44,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:45,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:46,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:47,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:48,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:49,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:50,YFAMYQENVAQTDVDTLYIIYRDYTWAEWAYTWY HLA-A03:51,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:52,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:53,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:54,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:55,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:56,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:57,YFAMYQENVAQTDANTLYIIYRDYTWAELAYTWY HLA-A03:58,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:59,CFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:60,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:61,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:62,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:63,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:64,YFAMYQENVAQTDVDTLYIIYRDYTWADLAYTWY HLA-A03:65,YFAMYQENVAQTDVDTLYIIYRDYTWAEQAYTWY HLA-A03:66,YFAMYQENVAQTDVDTLYIIYRDYTWAERAYTWY HLA-A03:67,YFATYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:70,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:71,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:72,YSAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:73,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:74,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:75,YFAMYQENVAQTDVDTLYLMYRDYTWAELAYTWY HLA-A03:76,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:77,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:78,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:79,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:80,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:81,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:82,YFAMYQENVAQTDVDTLYIIYEHYTWAVQAYTWY HLA-A03:83,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:84,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:85,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:86,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:87,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:88,YYAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:89,YFAMYGEKVAHTHVDTLYIIYRDYTWAELAYTWY HLA-A03:90,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A03:92,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:93,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:94,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:95,YFAMYQENVAQTDVDTLYVRYRDYTWAELAYTWY HLA-A03:96,YFDMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A03:97,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTGY HLA-A03:98,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYMWY HLA-A03:99,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A1101,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A1102,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A1103,YYAMYQENVAQTDVDTLYIIYRDYTWAEQAYRWY HLA-A1104,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYTWY HLA-A1105,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A1106,YYAMYQENVAQTHVDTLYIIYRDYTWAAQAYRWY HLA-A1107,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A1108,YYAMYQENVAQTDVDTLYIIYRDYTWAERAYRWY HLA-A1109,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A1110,YYAMYRNNVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A1111,YYAMYLQNVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A1112,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A1113,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A1114,YYAMYQENVAQTDVDTLYIIYRDYTWARQAYRWY HLA-A1115,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A1116,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A1117,YYAMYQENMAHTDANTLYIIYRDYTWAAQAYRWY HLA-A1118,YYAMYQENVAHTHVDTLYIIYRDYTWAAQAYRWY HLA-A1119,YYAMYQENVAHTDVDTLYIIYRDYTWAAQAYRWY HLA-A1120,YYAMYQENVAQTDVDTLYIIYRDYTWAEQAYRWY HLA-A1121,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A1122,YYAMYQENVAQTDVDTLYIIYPDYTWAAQAYRWY HLA-A1123,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A1124,YYAMYQENVAQTDVDTLYIIYRDYTWAALAYRWY HLA-A1125,YYAMYQENVAQTDVDTLYIIYRDYTWAELAYRWY HLA-A1126,YYAMYQENVAQTDVDTLYIMYRDYTWAAQAYRWY HLA-A1127,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYTGY HLA-A1128,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A1129,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A1130,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A1131,YYAMYQENVAQTDVDTLYIIYRDYTWAVLAYRWY HLA-A1132,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:01,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:02,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:03,YYAMYQENVAQTDVDTLYIIYRDYTWAEQAYRWY HLA-A11:04,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYTWY HLA-A11:05,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:06,YYAMYQENVAQTHVDTLYIIYRDYTWAAQAYRWY HLA-A11:07,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:08,YYAMYQENVAQTDVDTLYIIYRDYTWAERAYRWY HLA-A11:09,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:10,YYAMYRNNVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:100,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:101,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:102,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:103,YYAMYRENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:104,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:105,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:106,YYAMYQEKVVHTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:107,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:108,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:11,YYAMYLQNVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:110,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:111,YYAMYQENVAQTDEDTLYIIYRDYTWAAQAYRWY HLA-A11:112,YYAMYQENVAQTDVDTLYIIYRDYTWAAQVYRWY HLA-A11:113,YYAMYQENVAQTDVDTLYIIYEHYTWAAQAYRWY HLA-A11:114,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:116,YYAMYQENVAQTDVDTLYIIYQDYTWAAQAYRWY HLA-A11:117,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:118,YYAMYQENVAQTDVDTLYIMYRDYTWAAQAYRWY HLA-A11:119,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:12,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:120,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:121,YYAMYGEKVAHTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:122,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:123,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:124,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:125,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:126,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:128,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:129,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:13,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:130,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYTWY HLA-A11:131,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:132,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:133,YYSMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:134,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:135,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:136,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:138,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:139,YYAMYQENVAQTDVDTLYLMFRDYTWAAQAYRWY HLA-A11:14,YYAMYQENVAQTDVDTLYIIYRDYTWARQAYRWY HLA-A11:140,YYAMYQENVAQTDVDTLYIIYQDYTWAAQAYRWY HLA-A11:141,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:142,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:143,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:144,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:145,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:146,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:147,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:148,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:149,YYAMYQENVAQTDVDTLSIIYRDYTWAAQAYRWY HLA-A11:15,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:150,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:151,YYAMYQENVAQTDVDTLYIISRDYTWAAQAYRWY HLA-A11:152,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:153,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:154,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:155,YYAMYQENVAQTDVDTLYIIYRDYTWVAQAYRWY HLA-A11:156,YYAMYQDNVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:157,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRRY HLA-A11:158,YYAMYQENVAQTDVDTLYIIYRDYTWAVLAYRWY HLA-A11:159,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:16,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:160,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:161,YYAMYQENVAQADVDTLYIIYRDYTWAAQAYRWY HLA-A11:162,YYAMYQENVAQTDVDTLYIIYEHYTWAAQAYRWY HLA-A11:163,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:164,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:165,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:166,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:167,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:168,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:169,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:17,YYAMYQENMAHTDANTLYIIYRDYTWAAQAYRWY HLA-A11:171,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:172,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:173,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:174,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:175,YYAMYQENVAQTDVDTLYIIYRDYTWAEQAYRWY HLA-A11:176,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:177,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:178,YYAMYQENVAHTDENIAYIIYRDYTWAAQAYRWY HLA-A11:179,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:18,YYAMYQENVAHTHVDTLYIIYRDYTWAAQAYRWY HLA-A11:181,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:183,YYAMYQENVAQTDVDTLYIIYRDYTWAVWAYRWY HLA-A11:184,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:185,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:186,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:187,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:188,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:189,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:19,YYAMYQENVAHTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:190,YYAMYQENVAQTDENIAYIIYRDYTWAAQAYRWY HLA-A11:191,YYAMYQENVAQTDVDTLYIIYRDYTWAEWAYRWY HLA-A11:192,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:193,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:194,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:195,YYAMYQENVAQTDVDTLYIIYRDYTWGAQAYRWY HLA-A11:196,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:197,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:198,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:199,YFAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:20,YYAMYQENVAQTDVDTLYIIYRDYTWAEQAYRWY HLA-A11:200,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:201,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:202,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:203,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:204,YYAMYQENVAQTDVDTLYIIYRDYTWAAEAYRWY HLA-A11:205,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:206,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:207,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:209,YYAMYQENVAQTDVDTLYIIYRDYTWAVQAYTGY HLA-A11:211,YYAMYQENVAQTDVDTLYIIYRDYTWAARVYRWY HLA-A11:212,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:213,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:214,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:216,YYAMYQENVAQTDVDTLYIIYWDYTWAAQAYRWY HLA-A11:217,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:218,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:219,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:22,YYAMYQENVAQTDVDTLYIIYPDYTWAAQAYRWY HLA-A11:220,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWD HLA-A11:221,YHAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:222,YFAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:223,YYAMYQENVAQTDANTLYIIYRDYTWAAQAYRWY HLA-A11:224,YYAMYQEKVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:225,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:226,YYAMYQENVAQTDVDTLYIIYRDYTWVARVYRWY HLA-A11:227,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:228,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:229,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:23,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:230,YCAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:231,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:232,YYAMYQENVAQTDVDTLYIIYRDCTWAAQAYRWY HLA-A11:233,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:234,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:236,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:237,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:239,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:24,YYAMYQENVAQTDVDTLYIIYRDYTWAALAYRWY HLA-A11:240,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:241,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:242,YYAMYQENVAQTDVDTLYITYRDYTWAAQAYRWY HLA-A11:243,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:244,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:245,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:246,YYAMYQENVAQTDVDALYIIYRDYTWAAQAYRWY HLA-A11:247,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:248,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:249,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:25,YYAMYQENVAQTDVDTLYIIYRDYTWAELAYRWY HLA-A11:250,YYAMYQENVAHIDVDTLYIIYRDYTWAAQAYRWY HLA-A11:252,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:253,YYAMYQENVAQTDVATLYIIYRDYTWAAQAYRWY HLA-A11:254,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:255,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:257,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:258,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:259,YYAMYQENVAQTDVDSLYIIYRDYTWAAQAYRWY HLA-A11:26,YYAMYQENVAQTDVDTLYIMYRDYTWAAQAYRWY HLA-A11:260,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:261,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:262,YYAEYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:263,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:264,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYGWY HLA-A11:265,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:266,YYAIYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:267,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:268,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:269,YYAMYQENVAQTDVDTLYIIYRDYTWAAWAYRWY HLA-A11:27,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYTGY HLA-A11:270,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:271,YYAMYQENVAQTDANTLYIIYRDYTWVARVYRGY HLA-A11:273,YYAMYQENVAQTDVDTLYIIYRSYTWAAQAYRWY HLA-A11:274,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:275,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:276,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:277,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:278,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:279,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:280,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:281,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:282,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:283,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:284,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:285,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:286,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:288,YYAMYQENVAQTDVDTLYVRYRDYTWAAQAYRWY HLA-A11:289,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:29,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:290,YYAMYQENVAQTDVDTLYIIYRDYTWARRVYRWY HLA-A11:291,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:292,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:293,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:294,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:295,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:296,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:297,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:298,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:299,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:30,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:300,YYAMYQENVAQTDVDTLYIIYRDYTWTAQAYRWY HLA-A11:301,YYAMYQENVTQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:302,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:303,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:304,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:305,YYAMYQENVAQNDVDTLYIIYRDYTWAAQAYRWY HLA-A11:306,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:307,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:308,YYAMYQENVAHTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:309,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:31,YYAMYQENVAQTDVDTLYIIYRDYTWAVLAYRWY HLA-A11:311,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:312,YYAMYQENVAHTHVDTLYIIYRDYTWAAQAYRWY HLA-A11:32,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:33,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:34,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:35,YYAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY HLA-A11:36,YYAMYQENVAQTDVDTLYIICRDYTWAAQAYRWY HLA-A11:37,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:38,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRGY HLA-A11:39,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRGY HLA-A11:40,YYAMYQENVAHTDANTLYIIYRDYTWAAQAYRWY HLA-A11:41,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:42,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:43,YTAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:44,YYAMYQENVAQTDVDTLYIIYRDYTWAARAYRWY HLA-A11:45,YYAMYQENVAQTDADTLYIIYRDYTWAAQAYRWY HLA-A11:46,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:47,YHAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:48,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:49,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:51,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:53,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:54,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:55,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:56,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:57,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:58,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:59,YYAMYQENVAQTDVDTLYIIYGDYTWAAQAYRWY HLA-A11:60,YYAMYQENVAQTDVDTLYIIYRDYTWAVQAYRWY HLA-A11:61,YYAMYQENAAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:62,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:63,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:64,YYAMYQENVAQTDVDTLHIIYRDYTWAAQAYRWY HLA-A11:65,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:66,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:67,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:68,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:70,YYAMYGENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:71,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:72,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:73,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:74,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:75,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:76,YYAMYQENVAQTDVDTLYIIYRDYTRAAQAYRWY HLA-A11:77,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:79,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:80,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:81,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:82,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:83,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:84,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:85,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:86,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:87,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:88,YSAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:89,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:90,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYEWY HLA-A11:91,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:92,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:93,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:94,YYAMYQENVAQTDVDTLYIIYRDYTWAARVYRGY HLA-A11:95,YYAMHQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:96,YYAMYQENVSQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:97,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A11:98,YYAMYQENVAHIDVDTLYIIYRDYTWAAQAYRWY HLA-A2301,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A2302,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTGY HLA-A2303,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A2304,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTWY HLA-A2305,CSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A2306,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A2307,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A2309,YSAMYQENMAHTDENIAYLMFHYYTWAVLAYTGY HLA-A2310,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYRGY HLA-A2312,YSAMYEEKVAHTHENIAYLMFHYYTWAVLAYTGY HLA-A2313,YSAMYEEKVAQTDENIAYLMFHYYTWAVLAYTGY HLA-A2314,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A2315,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A2316,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:01,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:02,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTGY HLA-A23:03,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:04,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTWY HLA-A23:05,CSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:06,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:09,YSAMYQENMAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:10,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYRGY HLA-A23:12,YSAMYEEKVAHTHENIAYLMFHYYTWAVLAYTGY HLA-A23:13,YSAMYEEKVAQTDENIAYLMFHYYTWAVLAYTGY HLA-A23:14,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:15,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:16,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:17,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:18,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:20,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:21,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:22,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:23,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:24,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:25,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:26,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:27,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:28,YSAMYQEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:29,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:30,YSAMYEEKVAHTDENIAYLMFHCYTWAVLAYTGY HLA-A23:31,YSAMYEEKVAHTDENIAYLMFDDYTWAVLAYTGY HLA-A23:32,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:33,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:34,YSAMYEEKVAHTDENIAYLMFHYYTWAVVAYTGY HLA-A23:35,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:36,YSAMYEEKVAHTDESIAYLMFHYYTWAVLAYTGY HLA-A23:37,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:39,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:40,YSAMYEEKVAHTDANIAYLMFHYYTWAVLAYTGY HLA-A23:41,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:42,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:43,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTRY HLA-A23:44,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:45,YSAMYEEKVAHTDENIAYLMFQDYTWAVLAYTGY HLA-A23:46,YSAMYEEKVAHTDENIAYLMFEHYTWAVLAYTGY HLA-A23:47,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:48,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:49,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:50,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:51,YSAMYEENVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:52,YSAMYEEKVAHTDENIAYLMFDYYTWAVLAYTGY HLA-A23:53,YSAMYEEKVAHTDENIAYLMFRDYTWAVLAYTGY HLA-A23:54,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:55,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:56,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:57,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:58,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:59,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:60,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:61,YSAMYKEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:62,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:63,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:64,YFAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:65,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:66,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTGY HLA-A23:67,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:68,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:70,YSAMYEEKVAHTDENIAYLMFRDYTWAVLAYTGY HLA-A23:71,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:72,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:73,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:74,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:75,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:76,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:77,YSAMCEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:78,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:79,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:80,YSAMYGEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:81,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:82,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:83,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTWY HLA-A23:85,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:86,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:87,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:88,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A23:89,YSAMYEEKVAHTDENIAYLMFHYCTWAVLAYTGY HLA-A23:90,YSAMYEEKVAHTDENIAHLMFHYYTWAVLAYTGY HLA-A23:92,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A2402,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2403,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A2404,YSAMYEEKVAHTDANTLYLMFHYYTWAVQAYTGY HLA-A2405,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2406,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTGY HLA-A2407,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A2408,YSAMYGEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2409,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2410,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYRWY HLA-A2411,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2413,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A2414,YSAMYEEKVAHTDENIAYVRYHYYTWAVQAYTGY HLA-A2415,YSAMYEEKVAHTDENIAYLMYHYYTWAVQAYTGY HLA-A2417,YSAMYEEKVAHTDENIAYLMFRDYTWAVQAYTGY HLA-A2418,YSAMYEEKVAHTDENIAYLMFHYYTWAELAYTWY HLA-A2419,YSAMYEEKVAQTDVDTLYLMFHYYTWAVQAYTGY HLA-A2420,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2421,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2422,YSAMYEEKVAHTDENIAYLMFHYYTWAVWVYTWY HLA-A2423,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A2424,YSAMYRNNVAQTDENIAYLMFHYYTWAVLAYTGY HLA-A2425,CSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2426,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2427,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2428,YSAMYEEKVAHTHVDTLYLMFHYYTWAVQAYTGY HLA-A2429,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2430,YSAMYEEKVAHTHENIAYLMFHYYTWAVQAYTGY HLA-A2431,YSAMYEQKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2432,YSAMYEEKVAHTDESIAYLMFHYYTWAVQAYTGY HLA-A2433,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A2434,YSAMYEEKVAHIDENIAYLMFHYYTWAVQAYTGY HLA-A2435,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2437,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2438,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2439,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2440,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2441,YSAMYEEKVAHTDENIAYLMFRDYTWAVQAYTGY HLA-A2442,YSAMYGEKVAHTHENIAYLMFHYYTWAVQAYTGY HLA-A2443,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2444,YSAMYEEKVAHTDVDTLYLMFHYYTWAVQAYTGY HLA-A2446,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYRGY HLA-A2447,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2449,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2450,YYAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2451,YSAMYEEKVAHTDENIAYLIYHYYTWAVQAYTGY HLA-A2452,YSAMYEEKVAHTDENIAYLRFHYYTWAVQAYTGY HLA-A2453,YSAMYEEKVAHTDENIAYLMYHYYTWAVQAYTGY HLA-A2454,YSAMYEEKVAHTDENIAYLMFHYYTWAVQPYTGY HLA-A2455,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYEGY HLA-A2456,YSAMYEEKVAHTDENIAYLMFHYYTWAEQAYTGY HLA-A2457,YSAMYEEKVAHTDENIAYIMYHYYTWAVQAYTGY HLA-A2458,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2459,YSAMYEEKVAHTDENIAYLMFHYYTWAAQAYTGY HLA-A2461,YSAMYEEKVAHTDEKIAYLMFHYYTWAVQAYTGY HLA-A2462,YSAMYEEKVAHTDENIAYLMFQDYTWAVQAYTGY HLA-A2463,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2464,YSAMYEEKVAHTDENIAYLWIHYYTWAVQAYTGY HLA-A2465,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A2466,YSAMYEEKVAHTDENIAYLMFEHYTWAVQAYTGY HLA-A2467,YSAMYRNNVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2468,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2469,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2470,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2471,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2472,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2473,YSAMYEEKVAHTDENIAYLMFDYYTWAVQAYTGY HLA-A2474,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2475,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2476,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2477,YSAMYQEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2478,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2479,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:02,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:03,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A24:04,YSAMYEEKVAHTDANTLYLMFHYYTWAVQAYTGY HLA-A24:05,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:06,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTGY HLA-A24:07,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A24:08,YSAMYGEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:10,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYRWY HLA-A24:100,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:101,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:102,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:103,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:104,YFAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:105,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:106,YSAMYEEKVAHTDENIAYLMFDDYTWAVQAYTGY HLA-A24:107,YSAMYEEKVAHTDENIAYLMFHYYTWAVHAYTGY HLA-A24:108,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A24:109,YSAMYEEKVAHTDANTLYLMFHYYTWAVQAYTGY HLA-A24:110,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:111,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:112,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A24:113,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:114,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:115,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:116,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:117,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:118,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:119,YSAMYEEKVAHADENIAYLMFHYYTWAVQAYTGY HLA-A24:120,YSAMYEEKVAHTDENIAYIMFHYYTWAVQAYTGY HLA-A24:121,YSAMYEEKVAHTDENIAYLMFHSYTWAVQAYTGY HLA-A24:122,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:123,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:124,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:125,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A24:126,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:127,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:128,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:129,YSAMYQENMAHTDANTLYLMFHYYTWAVQAYTGY HLA-A24:13,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A24:130,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:131,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A24:133,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:134,YSAMYEEKVAHTDENIAYLMFHYYPWAVQAYTGY HLA-A24:135,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:136,YSAMYEEKVAHTDENIAYLMFHYYTWVVQAYTGY HLA-A24:137,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:138,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTWY HLA-A24:139,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:14,YSAMYEEKVAHTDENIAYVRYHYYTWAVQAYTGY HLA-A24:140,YSTMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:141,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:142,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:143,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYLGY HLA-A24:144,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:145,YSAMYEENVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:146,YSAMYEEKVAHTDENIAYLMFNYYTWAVQAYTGY HLA-A24:147,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:148,YSAMYEEKVAHTDENIAYLMFHYHTWAVQAYTGY HLA-A24:149,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:15,YSAMYEEKVAHTDENIAYLMYHYYTWAVQAYTGY HLA-A24:150,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:151,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:152,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:153,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:154,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:156,YSAMYEENVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:157,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:159,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:160,YSAMYEEKVAHTDENIAYLMFHYYTWAVQVYTGY HLA-A24:161,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:162,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:164,YSAMYEEKVAHTDENPLYLMFHYYTWAVQAYTGY HLA-A24:165,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:166,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:167,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTWY HLA-A24:168,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:169,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:17,YSAMYEEKVAHTDENIAYLMFRDYTWAVQAYTGY HLA-A24:170,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYMGY HLA-A24:171,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:172,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:173,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:174,YSAMYEEKVAHTDENIAYLMFDSYTWAVQAYTGY HLA-A24:175,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:176,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:177,YSAMYEEKVAHTDENIAYLMFHYYTWAEQAYTGY HLA-A24:178,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:179,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:18,YSAMYEEKVAHTDENIAYLMFHYYTWAELAYTWY HLA-A24:180,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:181,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:182,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:184,YSAMYEEKVAHTDENIACLMFHYYTWAVQAYTGY HLA-A24:186,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:187,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:188,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A24:189,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:19,YSAMYEEKVAQTDVDTLYLMFHYYTWAVQAYTGY HLA-A24:190,YSAMYEEKVAHTDENIAYLMFHYYTWAAQAYTGY HLA-A24:191,YSAMYQENVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:192,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:193,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:194,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:195,YSAMYEEKVAHTDENIAYLMFHYYTSAVQAYTGY HLA-A24:196,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:197,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:198,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:199,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:20,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:200,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:201,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:202,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGN HLA-A24:203,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:204,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A24:205,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:206,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:207,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTWY HLA-A24:208,YSAMYEEKVAHTDENIAYLMFRDYTWAVQAYTGY HLA-A24:209,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:21,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:210,YSAMYEEKVAHTDENIAYLMFHYYTWAAQAYRWY HLA-A24:212,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:213,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:214,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:215,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:216,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:217,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:218,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:219,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTRY HLA-A24:22,YSAMYEEKVAHTDENIAYLMFHYYTWAVWVYTWY HLA-A24:220,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGH HLA-A24:221,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:223,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:224,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:225,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:226,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:227,YSAMYEEKVAHTDENIAYLMFHYYTWAVPAYTGY HLA-A24:228,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A24:229,YSAMYEEKVAHTDENIAYLMFHYYTWVAQAYTGY HLA-A24:23,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A24:230,YSAMYEEKVAHTDENIAYLMFHYYTWAMQAYTGY HLA-A24:231,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:233,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:234,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:235,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:236,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:237,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:238,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:239,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:24,YSAMYRNNVAQTDENIAYLMFHYYTWAVLAYTGY HLA-A24:241,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:242,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:243,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:244,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:245,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:246,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:247,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:248,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:249,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:25,CSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:250,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:251,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:253,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:254,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:255,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:256,YSAMYEEKVAHTDENIAYLMFHFYTWAVQAYTGY HLA-A24:257,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:258,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:259,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:26,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:260,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:261,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:262,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:263,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:264,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:265,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:266,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:267,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:268,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:269,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:27,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:270,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:271,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:272,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:273,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:274,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:275,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:276,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:277,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:279,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:28,YSAMYEEKVAHTHVDTLYLMFHYYTWAVQAYTGY HLA-A24:280,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:281,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:282,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:283,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:284,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:285,YSAMYEEKVAHTDENIAYLMFHYYTWAARAYTGY HLA-A24:286,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:287,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:288,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A24:289,YSAMYEEKVAHTDENIAYLMFHYYTWAERAYTWY HLA-A24:29,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:290,YSAMYRNNVAQTDVDTLYLMFHYYTWAVQAYTGY HLA-A24:291,YSAMYEEKVAHTDENIAYLRYHYYTWAVQAYTGY HLA-A24:292,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:293,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:295,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:296,YSAMYEEKVAHTDENIAYLMYRDYTWAVQAYTGY HLA-A24:297,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:298,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:299,YSAMYEEKVAHTDENIAYLMFHYYTWAVRVYTWY HLA-A24:30,YSAMYEEKVAHTHENIAYLMFHYYTWAVQAYTGY HLA-A24:300,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYRWY HLA-A24:301,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:302,YSAMYEEKVAHTDANIAYLMFHYYTWAVQAYTGY HLA-A24:304,YSAMYEEKVAHTDENIAYLKFHYYTWAVQAYTGY HLA-A24:305,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:306,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:307,YSAMYEEKVAHTVENIAYLMFHYYTWAVQAYTGY HLA-A24:308,CSAMYEEKVAHTDENIAYLMFEHYTWAVQAYTGY HLA-A24:309,YSAMYREKVAHTHENIAYLMFHYYTWAVQAYTGY HLA-A24:31,YSAMYEQKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:310,YSAMYGEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:311,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:313,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:314,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:315,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYEWY HLA-A24:316,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:317,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:318,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:319,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:32,YSAMYEEKVAHTDESIAYLMFHYYTWAVQAYTGY HLA-A24:320,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:321,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:322,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:324,YSAMYEEKVAHTDENIAYVRYHYYTWAVQAYTGY HLA-A24:325,YSAMYEEKVAHTDENIAYLMFDYYTWAVQAYTGY HLA-A24:326,YSAMYKEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:327,YSAMYEEKVAHTDENIAYLMFHYYTWAVQTYTGY HLA-A24:328,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:329,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:33,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A24:330,YSAMYEEKVAHTDENIAYLMFHDYTWAVQAYTGY HLA-A24:331,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:332,YSSMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:333,YSAMYEEKVAHTDENIAYLMFEYYTWAVQAYTGY HLA-A24:334,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:335,YSAMYEEKVAHTDENIAYLMFHHYTWAVQAYTGY HLA-A24:336,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:337,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:338,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:339,YSAMYEEKVAQTDENIAYLMFHYYTWAVWAYTWY HLA-A24:34,YSAMYEEKVAHIDENIAYLMFHYYTWAVQAYTGY HLA-A24:340,YFAMYEEKVAHTDENIAYLMFHYYTWAVQAYRWY HLA-A24:341,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:342,YSAMYGEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:343,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:344,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:345,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:346,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:347,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A24:348,YSAMYEEKVAYTDENIAYLMFHYYTWAVQAYTGY HLA-A24:349,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:35,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:350,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:351,YSAMYEEKVAHTDEDIAYLMFHYYTWAVQAYTGY HLA-A24:352,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:353,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:354,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:355,YSAMYEEKVAHTDENIAYLMFHYYTWAELAYTGY HLA-A24:356,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:358,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:360,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:361,YSAMYEERVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:362,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:363,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:364,YSAMCEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:365,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:366,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:367,YSAMYEEKVAHTDENIAYLMFHYYTWVEQAYTGY HLA-A24:368,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:369,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:37,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:371,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:372,YSAMYEEKVAHTDGNIAYLMFHYYTWAVQAYTGY HLA-A24:373,YSAMYEEKVAHTDENTLYLMFHYYTWAVQAYTGY HLA-A24:374,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYEWY HLA-A24:375,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:376,YSAMYEEKVAHTDENIAYLMFHYYTWAVKAYTGY HLA-A24:377,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:378,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:379,YSAMYEEKVAHTHVDIAYLMFHYYTWAVQAYTGY HLA-A24:38,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:380,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:381,YSAMYEEKVAHTDENIAYLMFHYYTWAEWAYTGY HLA-A24:382,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:383,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:384,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:385,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:386,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:387,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTWY HLA-A24:39,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:390,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:391,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:392,YSAMYRNNVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A24:393,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:394,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:395,YSAMYEEKVAHTDENIAYLMFHYYTWAAQAYTGY HLA-A24:397,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:398,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:399,YSAMYEEKVAHTDENELYLMFHYYTWAVQAYTGY HLA-A24:400,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:401,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:402,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:403,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:404,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:405,YSAMYEEKVAHTDENNAYLMFHYYTWAVQAYTGY HLA-A24:406,YSAMYEEKVAQTDVDTLYLMFHYYTWAVQAYTGY HLA-A24:407,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:409,YSAMYGEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:41,YSAMYEEKVAHTDENIAYLMFRDYTWAVQAYTGY HLA-A24:410,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:411,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:412,YSAMYEEKVAHTDENIAYLVFHYYTWAVQAYTGY HLA-A24:413,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:414,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:415,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:416,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:417,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:418,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:419,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:42,YSAMYGEKVAHTHENIAYLMFHYYTWAVQAYTGY HLA-A24:420,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:421,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:422,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:423,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:424,YSAMYEEKVAHTDVDTLYLMFHYYTWAVQAYTGY HLA-A24:43,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:431,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:432,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:44,YSAMYEEKVAHTDVDTLYLMFHYYTWAVQAYTGY HLA-A24:46,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYRGY HLA-A24:47,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:49,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:50,YYAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:51,YSAMYEEKVAHTDENIAYLIYHYYTWAVQAYTGY HLA-A24:52,YSAMYEEKVAHTDENIAYLRFHYYTWAVQAYTGY HLA-A24:53,YSAMYEEKVAHTDENIAYLMYHYYTWAVQAYTGY HLA-A24:54,YSAMYEEKVAHTDENIAYLMFHYYTWAVQPYTGY HLA-A24:55,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYEGY HLA-A24:56,YSAMYEEKVAHTDENIAYLMFHYYTWAEQAYTGY HLA-A24:57,YSAMYEEKVAHTDENIAYIMYHYYTWAVQAYTGY HLA-A24:58,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:59,YSAMYEEKVAHTDENIAYLMFHYYTWAAQAYTGY HLA-A24:61,YSAMYEEKVAHTDEKIAYLMFHYYTWAVQAYTGY HLA-A24:62,YSAMYEEKVAHTDENIAYLMFQDYTWAVQAYTGY HLA-A24:63,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:64,YSAMYEEKVAHTDENIAYLWIHYYTWAVQAYTGY HLA-A24:66,YSAMYEEKVAHTDENIAYLMFEHYTWAVQAYTGY HLA-A24:67,YSAMYRNNVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:68,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:69,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:70,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:71,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:72,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:73,YSAMYEEKVAHTDENIAYLMFDYYTWAVQAYTGY HLA-A24:74,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:75,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:76,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:77,YSAMYQEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:78,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:79,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:80,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:81,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:82,YTAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:85,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:87,YSAMYEEKVAHTDENIAYLMFHYYTWAVRAYTGY HLA-A24:88,YFAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:89,YSAMYGEKVAHTHVDTLYLMFHYYTWAVQAYTGY HLA-A24:91,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:92,YSAMYEEKVAHTDENIAYIIYHYYTWAVQAYTGY HLA-A24:93,YSAMYEEKVAHTDENIAYVMFHYYTWAVQAYTGY HLA-A24:94,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTWY HLA-A24:95,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:96,YSAMYEEKVAHTDENIAYLMFNFYTWAVQAYTGY HLA-A24:97,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:98,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A24:99,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A2501,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A2502,YYAMYRNNVAQTDESIAYIRYQDYTWAEWAYRWY HLA-A2503,YFAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A2504,YYAMYRNNVAHTDESIAYIRYQDYTWAEQAYRWY HLA-A2505,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A2506,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYTWY HLA-A25:01,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:02,YYAMYRNNVAQTDESIAYIRYQDYTWAEWAYRWY HLA-A25:03,YFAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:04,YYAMYRNNVAHTDESIAYIRYQDYTWAEQAYRWY HLA-A25:05,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:06,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYTWY HLA-A25:07,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:08,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:09,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:10,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:11,YYAMYRNNVAHTHESIAYIRYQDYTWAEWAYRWY HLA-A25:13,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:14,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:15,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:16,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:17,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:18,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYGWY HLA-A25:19,YYAMYRNNVAHTDESIAYIRYQDYTWAELAYRWY HLA-A25:20,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:21,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:22,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:23,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:24,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:25,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:26,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:27,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:28,YYAMYRNNVAHTDESIAYIRYQDYTWAVWAYRWY HLA-A25:29,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:30,YFAMYRNNVAHTDESIAYIRYQDYTWAVLAYRWY HLA-A25:31,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:32,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:33,YYAMYRNNVAHTNESIAYIRYQDYTWAEWAYRWY HLA-A25:34,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:35,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:36,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYTGY HLA-A25:37,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:38,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:39,YYAMYQNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:40,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:41,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:43,YYAMYRNNVAHTDESIAYIIYRDYTWAEWAYRWY HLA-A25:44,YYAMYRNNVAHTDESIAYIRYQDYTWAVQAYRWY HLA-A25:45,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:46,YYAMYGEKVAHTDESMAYIRYQDYTWAEWAYRWY HLA-A25:47,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:48,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:50,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYLWY HLA-A25:51,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:52,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYQWY HLA-A25:53,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:54,YCAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A25:55,YYAMYRNNVAHADESIAYIRYQDYTWAEWAYRWY HLA-A25:56,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRSY HLA-A25:57,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A2601,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A2602,YYAMYRNNVAHTDANTLYIRYQNYTWAEWAYRWY HLA-A2603,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A2604,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYLWY HLA-A2605,YYAMYRNNVAHTDENTLYIRYQDYTWAEWAYRWY HLA-A2606,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A2607,YYAMYGEKVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A2608,YYAMYRNNVAHTDANTLYIRYQDYTWAEQAYRWY HLA-A2609,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYTWY HLA-A2610,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A2611,YYAMYRNNVAHTDANTLYIRYQDYTWPMSEPASD HLA-A2612,YYAMYRNNVAHTDANTLYIRYQDYTWAVWAYRWY HLA-A2613,YYAMYRNNVAQTDANTLYIRYQDYTWAEWAYRWY HLA-A2614,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A2615,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A2616,YSAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A2617,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A2618,YYAMYRNNVAHTDANTLYIRYQDYTWAVWAYRWY HLA-A2619,YYAMYQENVAQTDANTLYIRYQDYTWAEWAYRWY HLA-A2620,YFAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A2621,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A2622,YYAMYRNNVAHTDANTLYVRYQDYTWAEWAYRWY HLA-A2623,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A2624,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A2626,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A2627,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A2628,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A2629,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRGY HLA-A2630,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A2631,YYAMYPNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A2632,YYAMYRNNVAHTDANTLYMVYQDYTWAEWAYRWY HLA-A2633,YYAMYRNNVAQIHANTLYIRYQDYTWAEWAYRWY HLA-A2634,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYWWY HLA-A2635,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:01,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:02,YYAMYRNNVAHTDANTLYIRYQNYTWAEWAYRWY HLA-A26:03,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A26:04,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYLWY HLA-A26:05,YYAMYRNNVAHTDENTLYIRYQDYTWAEWAYRWY HLA-A26:06,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A26:07,YYAMYGEKVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:08,YYAMYRNNVAHTDANTLYIRYQDYTWAEQAYRWY HLA-A26:09,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYTWY HLA-A26:10,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:100,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:101,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:102,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:103,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYGWY HLA-A26:104,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:105,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:106,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:108,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:109,YYAMYRNNVAHTDANTLCIRYQDYTWAEWAYRWY HLA-A26:110,YYAMYRNNVAHTDPNTLYIRYQDYTWAEWAYRWY HLA-A26:111,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A26:112,YYAMYRNNVAHTDANTLYIRYQDYTWAVLAYRWY HLA-A26:113,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:114,YYAMYWNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:115,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:116,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:117,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:118,YYAMYRNNVAHTDANTLYIRYQNYTWAEWAYRWY HLA-A26:119,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:12,YYAMYRNNVAHTDANTLYIRYQDYTWAVWAYRWY HLA-A26:120,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:121,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:122,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:123,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:124,YYAMYRNNVAHTDANTLYIRYQDYTWAEQAYRWY HLA-A26:125,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:126,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:128,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:129,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:13,YYAMYRNNVAQTDANTLYIRYQDYTWAEWAYRWY HLA-A26:130,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:131,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:132,YYAMYRNNVAHTDANTLYIRYQNYTWAEWAYRWY HLA-A26:133,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:134,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:135,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:136,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:137,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:138,YYAMYRNNVAHTDANTLYIRYQNYTWAEWAYRWY HLA-A26:139,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:14,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:140,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:141,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:142,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:143,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:144,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:146,YYAMYRNNVAHTHANTLYIRYQDYTWAEQAYRWY HLA-A26:147,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRSY HLA-A26:148,YYAMYRNHVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:149,YYAMYRNNVAHTDANTLYIRYQDYTWAEWVYRWY HLA-A26:15,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:150,YYAIYRNNVAHTDANTLYIRYQDYTWAEQAYRWY HLA-A26:151,YYAMYRNIVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:152,YYAMYRNNVAHTDANTLYIRYQDYTWAAWAYRWY HLA-A26:153,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:154,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:155,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:156,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:157,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:158,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:159,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:16,YSAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:160,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:162,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:163,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:164,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:165,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:167,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:168,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:169,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:17,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:170,YYAMYQNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:171,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:172,YYAMYRNNVAHTDANTLYIRYQDYTWAVWAYRWY HLA-A26:173,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:174,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:175,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:176,YYAMYRNNVAHTDANTLYIMYQDYTWAEWAYRWY HLA-A26:177,YTAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A26:178,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:18,YYAMYRNNVAHTDANTLYIRYQDYTWAVWAYRWY HLA-A26:19,YYAMYQENVAQTDANTLYIRYQDYTWAEWAYRWY HLA-A26:20,YFAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:21,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A26:22,YYAMYRNNVAHTDANTLYVRYQDYTWAEWAYRWY HLA-A26:23,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:24,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:26,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:27,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:28,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:29,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRGY HLA-A26:30,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A26:31,YYAMYPNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:32,YYAMYRNNVAHTDANTLYMVYQDYTWAEWAYRWY HLA-A26:33,YYAMYRNNVAQIHANTLYIRYQDYTWAEWAYRWY HLA-A26:34,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYWWY HLA-A26:35,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:36,YYAMYRNNVAHTHANTLYIRYQDYTWAEWAYRWY HLA-A26:37,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:38,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:39,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:40,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:41,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:42,YYAIYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:43,YYAMYRNNVAHTDANTLYIRYQDYTWAELAYRWY HLA-A26:45,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:46,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:47,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:48,YYAMYRNKVAHTDANTLYIRYQDYTWAEQAYRWY HLA-A26:49,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRGY HLA-A26:50,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:51,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:52,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:53,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:54,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:55,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:56,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:57,YYAMYRNNVAHTDANILYIRYQDYTWAEWAYRWY HLA-A26:58,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:59,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:61,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:62,YYAMYRNNMAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:63,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:64,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:65,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:66,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:67,YYAMYRNNVAHTDANTLYIRYQDYTWAEQAYRWY HLA-A26:68,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:69,YYAMYRNKVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:70,YYAMYRNNVAHTDANTLYIMYQDYTWAEWAYRWY HLA-A26:72,YYAMYQENMAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:73,YYAMYRNNVAHTDANTLYIRYQDYTWAEQAYRWY HLA-A26:74,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:75,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:76,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:77,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:78,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYLWY HLA-A26:79,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:80,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:81,YYALYRNNVAHTDANTLYIRYQDYTWAEQAYRWY HLA-A26:82,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:83,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:84,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:85,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:86,YYAMYRNNVAHTDANTLYIRYQDYTWAVQAYRWY HLA-A26:87,YYAMYRNNVAHTDANTLYLRYQDYTWAEWAYRWY HLA-A26:88,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:89,YHAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:90,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:91,YYAMYRNNVAHTDANTLYIRYQDYTWAVQAYTWY HLA-A26:92,YYAMYGEKVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A26:93,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:94,CYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:95,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:96,YYTMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:97,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:98,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A26:99,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A2901,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A2902,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A2903,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTGY HLA-A2904,YTAMYLQHVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A2905,YTAMYLQNVAQTDANTLYIMYRDYTWAEQAYTWY HLA-A2906,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A2907,YTAMYLQNVAQTDANTLYLMFRDYTWAVLAYTWY HLA-A2909,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A2910,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A2911,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A2912,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A2913,YTAMYLQNVAQTDESIAYIMYRDYTWAVLAYTWY HLA-A2914,YTAMYQENVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A2915,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A2916,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:01,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:02,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:03,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTGY HLA-A29:04,YTAMYLQHVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:05,YTAMYLQNVAQTDANTLYIMYRDYTWAEQAYTWY HLA-A29:06,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:07,YTAMYLQNVAQTDANTLYLMFRDYTWAVLAYTWY HLA-A29:09,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:10,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:100,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:101,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:102,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:103,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:104,YTAMYLQNVAQTDANTLYIMYRDYTWAAQAYTWY HLA-A29:105,YTAMYRNNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:106,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:107,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:108,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:109,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:11,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:110,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:111,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:113,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:114,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:115,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:116,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:117,CTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:118,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:119,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:12,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:120,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:121,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:122,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:123,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:124,YTAMYLQNVAQTDANTLYIMYRDYTWTVLAYTWY HLA-A29:125,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:127,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:128,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:13,YTAMYLQNVAQTDESIAYIMYRDYTWAVLAYTWY HLA-A29:14,YTAMYQENVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:15,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:16,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:17,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:18,YTAMYQENVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:19,YTAMYLQNVAHTHVDTLYIMYRDYTWAVLAYTWY HLA-A29:20,YTAMYLQNVAHTDANTLYIMYRDYTWAVLAYTWY HLA-A29:21,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:22,YTAMYLQNVAQTDANTLYVRYRDYTWAVLAYTWY HLA-A29:23,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:24,YTAMYLQNVAQTDANTLYIMYRDYTWAVLGYTWY HLA-A29:25,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:26,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:27,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:28,YTAMYLQNVAQTDANTLYIMYRDYTWAVWAYTWY HLA-A29:29,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:30,YTAMYLQNVARTDANTLYIMYRDYTWAVLAYTWY HLA-A29:31,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:32,YTAMYLQNVAQTDANTLYIMYQDYTWAVLAYTWY HLA-A29:33,YTAMYLQNVAQTDANTLYIMYRDYTWAVQAYTGY HLA-A29:34,YTAMYLQNVAHTDANTLYIMYRDYTWAVLAYTWY HLA-A29:35,YTAMYLQNVAQTDANTLYIMYRDYTWAMLAYTWY HLA-A29:36,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:37,YSAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:38,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:39,YTAMYLQNVAQIDVDTLYIMYRDYTWAVLAYTWY HLA-A29:40,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:41,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:42,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:43,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:44,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:45,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:46,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:47,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:48,YTAMYGEKVAHTHVDTLYIMYRDYTWAVLAYTWY HLA-A29:49,YTAMYLQNVAQTDANTLYIMFRDYTWAVLAYTWY HLA-A29:50,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:51,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:52,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:53,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:54,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:55,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:56,YSAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:57,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:58,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:59,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:60,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:61,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:62,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:63,YTAMNLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:64,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:65,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:66,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:67,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYRWY HLA-A29:68,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:69,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:70,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYAWY HLA-A29:71,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:72,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:73,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:74,YTAMYLQNVAHTHANTLYIMYRDYTWAVLAYTWY HLA-A29:75,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:76,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:77,YTAMYLQNVAQTDANTLYIMYRDYTWAVQAYTWY HLA-A29:79,YTAMYLQNVAQTDANTLYIMYRDYTWAVRAYTWY HLA-A29:80,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:81,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:82,YTAMYLQNVAQTDANTLYIMYGDYTWAVLAYTWY HLA-A29:83,YTAMYLQNVAQTDANTLYIMYRDYTWAELAYTWY HLA-A29:84,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:85,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:86,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:87,YTAMYLQNVAQTDANTLYIMYRDYTWAVQAYTWY HLA-A29:88,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:89,YTAMYLQNVAQTDANTLYIRYRDYTWAVLAYTWY HLA-A29:90,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:91,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:92,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:93,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:94,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:95,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:96,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:97,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A29:98,YTAMYLQNVAHTDENTLYIMYRDYTWAVLAYTWY HLA-A29:99,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A3001,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A3002,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A3003,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A3004,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY HLA-A3006,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY HLA-A3007,YSAMYEEKVAHTDENTLYIIYEHYTWARLAYTWY HLA-A3008,YYAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A3009,YSAMYQENVAHTDENTLYIIYEHYTWAVLAYTWY HLA-A3010,YSAMYQENVAHTDENTLYIIHEHYTWARLAYTWY HLA-A3011,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A3012,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A3013,YSAMYQENVAHTHVDTLYIIYEHYTWARLAYTWY HLA-A3014,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A3015,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A3016,YSAMYQENVAQTHVDTLYIIYEHYTWAWLAYTWY HLA-A3017,YSAMYQENVAQTDVDTLYIIYEHYTWAVWAYTWY HLA-A3018,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A3019,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A3020,YSAMYQENVAQTEVDTLYIIYEHYTWAWLAYTWY HLA-A3021,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A3022,YSAMYGEKVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:01,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:02,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:03,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:04,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY HLA-A30:06,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY HLA-A30:07,YSAMYEEKVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:08,YYAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:09,YSAMYQENVAHTDENTLYIIYEHYTWAVLAYTWY HLA-A30:10,YSAMYQENVAHTDENTLYIIHEHYTWARLAYTWY HLA-A30:100,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:102,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:103,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY HLA-A30:104,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:105,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY HLA-A30:106,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:107,YSAMYQENVAHTDENTLYIIYEHYIWARLAYTWY HLA-A30:108,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:109,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:11,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:110,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:111,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:112,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:113,YSAMYQENVAQTDVDTLYLIYEHYTWAWLAYTWY HLA-A30:114,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:115,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:116,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:117,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYRWY HLA-A30:118,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:119,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:12,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:120,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:122,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTSY HLA-A30:124,YSSMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:125,YSAMYQENVAQTDVDTLYIIYEHYTWARLAYTWY HLA-A30:126,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:127,YSAMYQENVAHTHENTLYIIYEHYTWARLAYTWY HLA-A30:128,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:129,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:13,YSAMYQENVAHTHVDTLYIIYEHYTWARLAYTWY HLA-A30:131,YSAMYQENVAQTDVDTLYIVYEHYTWAWLAYTWY HLA-A30:133,NSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:134,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:135,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:136,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:137,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:138,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:139,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY HLA-A30:140,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:141,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:142,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:143,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:144,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:14L,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:15,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:16,YSAMYQENVAQTHVDTLYIIYEHYTWAWLAYTWY HLA-A30:17,YSAMYQENVAQTDVDTLYIIYEHYTWAVWAYTWY HLA-A30:18,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:19,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:20,YSAMYQENVAQTEVDTLYIIYEHYTWAWLAYTWY HLA-A30:22,YSAMYGEKVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:23,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:24,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:25,YSAMYQENVAQTDENTLYIIYEHYTWARLAYTWY HLA-A30:26,YSAMYQENVAQTDVDTLYIIYRDYTWAWLAYTWY HLA-A30:28,YSAMYQENVAHTDENTLYIVYEHYTWARLAYTWY HLA-A30:29,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTSY HLA-A30:30,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:31,YSAMYQENVARTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:32,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:33,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:34,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:35,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:36,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:37,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:38,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:39,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:40,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:41,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:42,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:43,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYMWY HLA-A30:44,YSAMYQENVAHTHVDTLYIIYEHYTWAWLAYTWY HLA-A30:45,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:46,YSAMYQENVAHTHVDTLYIIYEHYTWAVWAYTWY HLA-A30:47,YSAMYQENVAHTDENTLYVIYEHYTWARLAYTWY HLA-A30:48,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:49,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:50,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:51,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:52,YSAMYQENVAQTDVDTLYLRYEHYTWAWLAYTWY HLA-A30:53,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:54,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:55,YFAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:56,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:57,YSAMYQENVAHTDANTLYIIYEHYTWARLAYTWY HLA-A30:58,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:60,YSAMYQENAAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:61,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:62,YSAMYQENVAQTDVDNLYIIYEHYTWAWLAYTWY HLA-A30:63,YSAMYQENVAQTDVDTLYIIYEHYTWAWLTYTWY HLA-A30:64,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:65,YSAMYQENVAQTDLDTLYIIYEHYTWAWLAYTWY HLA-A30:66,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:67,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:68,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:69,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:71,YSAMYQENVAQADVDTLYIIYEHYTWAWLAYTWY HLA-A30:72,YSAMYQENVAQTDVDTLYTIYEHYTWAWLAYTWY HLA-A30:74,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:75,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTGY HLA-A30:77,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY HLA-A30:79,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:80,YSAMYQENVAHTDENTLYLIYEHYTWARLAYTWY HLA-A30:81,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:82,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:83,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:84,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:85,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A30:86,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:87,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:88,YSAMYQENVAQTDENTLYIIHEHYTWARLAYTWY HLA-A30:89,YSAMYQENVAQTDVDTLYIIYEHYTWAELAYTWY HLA-A30:90,YSAMYQENVAHTDANTLYIIYEHYTWAVWAYTWY HLA-A30:91,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:92,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:93,YSAMYQENVAQTDVDTLYIIYQHYTWAWLAYTWY HLA-A30:94,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:95,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:96,YSSMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:97,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:98,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A30:99,YSAMYQENVAHTDENTLYIIYEHYTWAVQAYTWY HLA-A3101,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A3102,YTAMYQEKVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A3103,YTAMYQENVAHIDVDTLYIIYRDYTWAVLAYTWY HLA-A3104,YTAMYQENVAHIDVDTLYIIYRDYTWAVLAYTWY HLA-A3105,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTGY HLA-A3106,YTAMYQENVAHIDVDTLYIMYRDYTWAVLAYTWY HLA-A3107,YTAMYQEKVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A3108,YTAMYEEKVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A3109,YTAMYQENVGHIDVDTLYIMYQDYTWAVLAYTWY HLA-A3110,YTAMYQENVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A3111,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A3112,YTAMYQENVAHIDVDTLYIKYQDYTWAVLAYTWY HLA-A3113,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A3114,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A3115,YTAMYQENVARIDVDTLYIMYQDYTWAVLAYTWY HLA-A3116,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A3117,YTAMYQENVAHINVDTLYIMYQDYTWAVLAYTWY HLA-A3118,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTRY HLA-A31:01,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:02,YTAMYQEKVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:03,YTAMYQENVAHIDVDTLYIIYRDYTWAVLAYTWY HLA-A31:04,YTAMYQENVAHIDVDTLYIIYRDYTWAVLAYTWY HLA-A31:05,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTGY HLA-A31:06,YTAMYQENVAHIDVDTLYIMYRDYTWAVLAYTWY HLA-A31:07,YTAMYQEKVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A31:08,YTAMYEEKVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A31:09,YTAMYQENVGHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:10,YTAMYQENVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A31:100,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:101,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:102,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:103,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:104,YTAMYRENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:105,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:106,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:107,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:108,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:109,YTAMYGEKVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:11,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:110,YTAMYQENVAHIDVDTLYIMYQDYTWAELAYTWY HLA-A31:111,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:112,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:113,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:114,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:115,YTAMYQENVAQTDVDTLYIMYQDYTWAVLAYTWY HLA-A31:116,YTAMYQENVAHIDVDTLYIMYQDCTWAVLAYTWY HLA-A31:117,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:118,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:119,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:12,YTAMYQENVAHIDVDTLYIKYQDYTWAVLAYTWY HLA-A31:120,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:121,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:122,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:123,YTAMYQENVAHIDVDTLYIRYQDYTWAVLAYTWY HLA-A31:124,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:125,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:127,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:128,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:129,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTCY HLA-A31:13,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:130,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:132,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:133,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:134,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:135,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:136,YTAMYQENVAHIDVDTLYIMYQDYTWAVQAYTWY HLA-A31:137,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:138,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:139,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:140,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:142,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:143,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:144,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:145,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:146,YTAMYQENVAHIDVDTLYLMYQDYTWAVLAYTWY HLA-A31:147,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:148,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:15,YTAMYQENVARIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:16,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:17,YTAMYQENVAHINVDTLYIMYQDYTWAVLAYTWY HLA-A31:18,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTRY HLA-A31:19,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:20,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:21,YFAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:22,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:23,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:24,YTAMYQENVAHIDVDTLYIMYQDYTWAAQAYRWY HLA-A31:25,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYRWY HLA-A31:26,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:27,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:28,YTAMYQENVTHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:29,YTAMYQENVAHIDVDTLYLMFQDYTWAVLAYTWY HLA-A31:30,YTAMYQENVAHIDVDTLYIMYQDYTWAVWAYTWY HLA-A31:31,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:32,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:33,YTAMYQENVAHIDGDTLYIMYQDYTWAVLAYTWY HLA-A31:34,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:35,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:36,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:37,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:38,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:39,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:40,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:41,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:42,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:43,YTAMYQENVAHIDVDTLYIMYQDYTWAALAYTWY HLA-A31:44,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:45,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:46,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:47,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:48,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:49,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:50,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:51,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:52,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:53,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:54,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:55,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:56,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:57,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:58,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:59,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:61,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTSY HLA-A31:62,YTAMYQENVAHIDVDTLYIMYQDYTWVALAYTWY HLA-A31:63,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:64,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:65,YTAMYQENVAHIDVDTLHIMYQDYTWAVLAYTWY HLA-A31:66,YTAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A31:67,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:68,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:69,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:70,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:71,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:72,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:73,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:74,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:75,YTAMYKENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:76,YTAMYQENVAHIDVDTLYIMYQDYTWTVLAYTWY HLA-A31:77,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:78,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:79,YTAMYQENVAHTDANTLYIMYQDYTWAVLAYTWY HLA-A31:80,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:81,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:82,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:83,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:84,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:85,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:86,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:87,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:88,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A31:89,YTAMYQENVAQTDVDTLYIMYQDYTWAVLAYTWY HLA-A31:90,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:91,YTAMYQEKVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:92,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:93,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:94,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:95,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:96,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:97,YTAMYQENVAHIDVDTLYIMYQDYTWAERAYTWY HLA-A31:98,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A31:99,YTAMYQENVAHIDVDTLYVRYQDYTWAVLAYTWY HLA-A3201,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A3202,YFAMYQENVAHTDESIAYIMYQDYTWAVQAYTWY HLA-A3203,YFAMYQENVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A3204,YFAMYQENVAHTDESIAYIIYRDYTWAELAYTWY HLA-A3205,YFAMYQEKVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A3206,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A3207,YSAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A3208,YFAMYQENVAHTHESIAYIMYQDYTWAVLAYTWY HLA-A3209,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTRY HLA-A3210,YFAMYQENVAHTDESIAYIMYQDYTWAEWAYTWY HLA-A3211,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYEWY HLA-A3212,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A3213,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTGY HLA-A3214,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A3215,YFAMYRNNVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:01,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:02,YFAMYQENVAHTDESIAYIMYQDYTWAVQAYTWY HLA-A32:03,YFAMYQENVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A32:04,YFAMYQENVAHTDESIAYIIYRDYTWAELAYTWY HLA-A32:05,YFAMYQEKVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:06,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:07,YSAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:08,YFAMYQENVAHTHESIAYIMYQDYTWAVLAYTWY HLA-A32:09,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTRY HLA-A32:10,YFAMYQENVAHTDESIAYIMYQDYTWAEWAYTWY HLA-A32:100,YFAMYQENVVHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:102,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:103,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:104,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:105,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:106,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:107,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:108,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:109,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:110,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:111,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:113,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:114,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:115,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:116,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:118,YFAMYQENVAHTDESIAYIMYQDYTWAVWAYTWY HLA-A32:119,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:12,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:120,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:121,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:13,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTGY HLA-A32:14,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:15,YFAMYRNNVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:16,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:17,YFAMYQENVAQTDESIAYIMYQDYTWAVLAYTWY HLA-A32:18,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:20,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:21,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:22,YFAMYQENVAHTDESIAYIMYQDYTWAVQAYTWY HLA-A32:23,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:24,YFAMYQENMAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:25,YFAMYHENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:26,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYRWY HLA-A32:28,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:29,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:30,YFAMYQENVAHTDESIAYIMYRDYTWAVLAYTWY HLA-A32:31,YFAMYQEKVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:32,YFAMYQENVAHTDESIAYIMYRDYTWAVLAYTWY HLA-A32:33,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:34,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:35,YFALYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:36,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:37,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:38,YFAMYQENVAHTDERIAYIMYQDYTWAVLAYTWY HLA-A32:39,YFAMYRENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:40,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:41,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:42,YTAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:43,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:44,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:46,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:47,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:49,YFAMYQENVAYTDESIAYIMYQDYTWAVLAYTWY HLA-A32:50,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:51,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:52,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:53,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:54,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:55,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:57,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:58,YFARYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:59,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:60,YFAMYQENVAHTDESIACIMYQDYTWAVLAYTWY HLA-A32:61,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:62,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:63,YFAMYQENVAHTDESIAYIMYQDYTWAELAYTWY HLA-A32:64,YYAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:65,YFAMYQENVAHTDESIAYIIYQDYTWAVLAYTWY HLA-A32:66,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:67,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:68,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:69,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:70,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:71,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:72,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:73,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:74,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:75,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:76,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:77,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:78,YFAMYQENVAHTDEIIAYIMYQDYTWAVLAYTWY HLA-A32:79,YFAMYEEKVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:80,YFAMYQENVAHTDESALYIMYQDYTWAVLAYTWY HLA-A32:81,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTSY HLA-A32:82,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:83,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:84,YFAMYQENVAHIDESIAYIMYQDYTWAVLAYTWY HLA-A32:85,YFAIYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:86,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:87,YFAMYQENVAHTDESIAYIMYQDYTWALLAYTWY HLA-A32:88,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:89,YFAMYQENVAHTDESIAYLNYQDYTWAVLAYTWY HLA-A32:90,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:91,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:93,YFAMYGENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:94,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:95,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:96,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:97,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:98,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A32:99,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A3301,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A3303,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A3304,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A3305,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A3306,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A3307,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A3308,YTAMYGEKVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A3309,YTAMYGENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A3310,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTGY HLA-A3311,YTAMYRNNVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A3312,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A3313,YTAMYRNNVAHTDANTLYIMYQDYTWAVLAYTWY HLA-A33:01,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:03,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:04,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:05,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:06,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:07,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:08,YTAMYGEKVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:09,YTAMYGENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:10,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTGY HLA-A33:100,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:101,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:102,YTAMYRNNVAHIDVDTLYIMYQDYTWAVQAYTWY HLA-A33:103,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:104,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:105,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:106,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWN HLA-A33:107,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:108,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:109,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:11,YTAMYRNNVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A33:110,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:111,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:112,YTAMYRNNVAHIDVDTLYIMYQDYTWARLAYTWY HLA-A33:113,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:114,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:115,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:116,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:117,YTAMYRNNVAHIGVDTLYIMYQDYTWAVLAYTWY HLA-A33:118,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:119,YSAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:12,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:120,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYMWY HLA-A33:121,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:122,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:124,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:125,YTAMYRNNVAQTDVDTLYIMYQDYTWAVLAYTWH HLA-A33:126,YTAMYRNNVAHIDVDTLYIMHQDYTWAVLAYTWY HLA-A33:127,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:128,YTAMYRNNVAYIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:13,YTAMYRNNVAHTDANTLYIMYQDYTWAVLAYTWY HLA-A33:130,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:131,YTAMYRNNVAQTDVDTLYIMYQDYTWAVLAYTWY HLA-A33:132,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTRY HLA-A33:133,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:134,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:135,YTAMYRSNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:136,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:137,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:138,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:139,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:14,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:141,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:142,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:144,YTAMYRNNVAHIDVDTLYIIYQDYTWAVLAYTWY HLA-A33:145,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:146,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:147,YTAMYRNNVAHTDVNTLYIMYQDYTWAVLAYTWY HLA-A33:148,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:149,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:15,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:150,YTAMYRNNVAHIDVDTLYIMYQDYTWAVQAYTWY HLA-A33:151,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:152,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:153,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:155,YTAMYRNNVAHIDVDTLYIMYQDYTWAVWAYTWY HLA-A33:158,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:159,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:16,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:160,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:161,YTAMYRNNVAHIDMDTLYIMYQDYTWAVLAYTWY HLA-A33:162,YTAMYRNNVAHIDVDTLYIKYQDYTWAVLAYTWY HLA-A33:163,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:164,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:165,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:166,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:167,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLPYTWH HLA-A33:168,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:169,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:17,YTAMYRNNVAHIDADTLYIMYQDYTWAVLAYTWY HLA-A33:170,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:18,YTAMYRNNVAHIDVDTLYIMYRDYTWAVLAYTWY HLA-A33:19,YTAMYRNNVAHIDVDTLYLMFHYYTWAVQAYTGY HLA-A33:20,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:21,YTAMYEENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:22,YTAMYRNNVAHIDVDTLYVRYQDYTWAVLAYTWY HLA-A33:23,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:24,YTAMYRNNVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A33:25,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:26,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:27,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:28,YTAMYRNNVAHIDVDTLYIMYQDYTWAELAYTWY HLA-A33:29,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:30,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:31,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:32,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:33,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:34,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:35,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:36,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:37,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:39,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:40,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:41,YTAMYRNNVAHIDVDTPYIMYQDYTWAVLAYTWY HLA-A33:42,YTAMYRNNVSHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:43,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:44,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:45,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:46,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:47,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:48,YTAMYRNNVAHTDANTLYIMYQDYTWAVLAYTWY HLA-A33:49,YTAMYRNNVAHIDVDTLYIIYQDYTWAVLAYTWH HLA-A33:50,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:51,YYAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:52,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:53,YTAMYEEKVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:54,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:55,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:56,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:57,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:58,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:59,YTAMYRNNVAHIDVDTLYIMYQDYTWAAQAYTWY HLA-A33:60,YTSMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:61,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYRWY HLA-A33:62,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:63,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:64,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:65,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:66,YTAMYQNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:67,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:68,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:69,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:70,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:71,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:72,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:75,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:76,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:77,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:78,YTDMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:79,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:81,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:82,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:83,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:84,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:85,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:86,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:87,YTAMYRNNVAHFDVDTLYIMYQDYTWAVLAYTWY HLA-A33:88,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:89,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:90,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:91,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:92,YAAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A33:93,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:94,YTAMYRNNVAHIDVDTLYIMYQDYTWAVWAYTWY HLA-A33:95,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:97,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A33:98,YTAMYRNNVAHIDVDTLYIMYQDYTRAVLAYTWY HLA-A33:99,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A3401,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY HLA-A3402,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A3403,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A3404,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A3405,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY HLA-A3406,YYAMYRNNVAQTDVDTLYIRYQDYTWAVLAYTWY HLA-A3407,YYAMYRNNVSQTDVDTLYIIYRDYTWAELAYTWY HLA-A3408,YFAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A34:01,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY HLA-A34:02,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A34:03,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A34:04,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A34:05,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY HLA-A34:06,YYAMYRNNVAQTDVDTLYIRYQDYTWAVLAYTWY HLA-A34:07,YYAMYRNNVSQTDVDTLYIIYRDYTWAELAYTWY HLA-A34:08,YFAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A34:09,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A34:11,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYAWY HLA-A34:12,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY HLA-A34:13,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A34:14,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY HLA-A34:15,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A34:16,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY HLA-A34:17,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY HLA-A34:18,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY HLA-A34:19,YYAMYQENVAQTDVDTLYIRYQDYTWAEWAYTWY HLA-A34:20,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A34:21,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A3601,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTWY HLA-A3602,YFAMYQENMAHTDANTLYIIYRDYTWVARAYTWY HLA-A3603,YFAMYQENMAHTDANTLYLMYRDYTWVARVYTWY HLA-A3604,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRWY HLA-A36:01,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTWY HLA-A36:02,YFAMYQENMAHTDANTLYIIYRDYTWVARAYTWY HLA-A36:03,YFAMYQENMAHTDANTLYLMYRDYTWVARVYTWY HLA-A36:04,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRWY HLA-A36:05,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTWY HLA-A36:06,YFAMYQENMAHTDANTLYIIYRDCTWVARVYTWY HLA-A36:07,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTWY HLA-A36:08,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTWY HLA-A4301,YYAMYLQNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A43:01,YYAMYLQNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A6601,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A6602,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYEWY HLA-A6603,YYAMYRNNVAHTDVDTLYIRYQDYTWAEWAYEWY HLA-A6604,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWH HLA-A6605,YYAMYRNNVAHTDVDTLYIRYQDYTWAEWAYRWY HLA-A6606,YYAMYRNNVAQTDVDTLYIRYQDYTWAVLAYRWY HLA-A66:01,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A66:02,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYEWY HLA-A66:03,YYAMYRNNVAHTDVDTLYIRYQDYTWAEWAYEWY HLA-A66:04,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWH HLA-A66:05,YYAMYRNNVAHTDVDTLYIRYQDYTWAEWAYRWY HLA-A66:06,YYAMYRNNVAQTDVDTLYIRYQDYTWAVLAYRWY HLA-A66:07,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A66:08,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A66:09,YYAMYRNNVAQTDVDTLYVRYQDYTWAEWAYRWY HLA-A66:10,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRGY HLA-A66:11,YYAMYRNNVAQTDADTLYIRYQDYTWAEWAYRWY HLA-A66:12,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A66:13,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A66:14,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A66:15,YYAMYRNNVAHIDVDTLYIRYQDYTWAEWAYRWY HLA-A66:16,YYAMYRNNVAQTDVDTLYIRYQDYTWVEWAYEWY HLA-A66:17,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A66:18,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A66:19,YYAMYRNNVAQTDVDTLYIRYQDYTWAERAYRWY HLA-A66:20,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A66:21,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYEWY HLA-A66:22,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A66:23,YYAMYQENVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A66:24,YYAMYRNNVAQTDVDTLHIRYQDYTWAEWAYRWY HLA-A66:25,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYEWY HLA-A66:29,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A66:30,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A66:31,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A66:32,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A6801,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6802,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A6803,YYAMYRNNVAHTDVDTLYIMYRDYTWAVWAYTWY HLA-A6804,YYAMYRNNVAHIDVDTLYIMYRDYTWAVWAYTWY HLA-A6805,YYAMYRNNVAHTHVDTLYIMYRDYTWAVWAYTWY HLA-A6806,YYAMYRNNVAQTDVDTLYIMYEHYTWAVWAYTWY HLA-A6807,YYAMYRNNVAQTDVDTLYIMYRHYTWAVWAYTWY HLA-A6808,YYAMYRNNVAQTDVDTLYIMYRDYTWAVLAYTWY HLA-A6809,YYAMYRNNVAQTDVDTLYIMYRDYTWAVQAYTWY HLA-A6810,YYAMYEENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6812,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6813,YYAMYRENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6814,YYAMYEENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6815,YYAMYRNNVAHTHVDTLYIRYHYYTWAVWAYTWY HLA-A6816,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6817,YYAMYRNNVAQTDVDTLYIMYRVYTWAVWAYTWY HLA-A6819,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6820,YYAMYRNNVAHTHVDTLYIMYRDYTWAVWAYTWY HLA-A6821,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6822,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6823,YYAMYRNNVAQTDVDTLYIRYRDYTWAVWAYTWY HLA-A6824,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6825,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6826,YYAMYRNNVAQTDVDTLYIMYRDYTWAVQAYTGY HLA-A6827,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A6828,YYAMYRNNVAQTDVDTLYIRYHYYTWAVRAYTWY HLA-A6829,YTAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6830,YYAMYGENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6831,YYAMYRNNVAHTDVDTLYIRYHYYTWAVWAYTWY HLA-A6832,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6833,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6834,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYMWY HLA-A6835,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6836,YYAMYRNNVAQTDENIAYIMYRDYTWAVWAYTWY HLA-A6837,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6838,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6839,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6840,YYAMYRNNVGQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:01,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:02,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:03,YYAMYRNNVAHTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:04,YYAMYRNNVAHIDVDTLYIMYRDYTWAVWAYTWY HLA-A68:05,YYAMYRNNVAHTHVDTLYIMYRDYTWAVWAYTWY HLA-A68:06,YYAMYRNNVAQTDVDTLYIMYEHYTWAVWAYTWY HLA-A68:07,YYAMYRNNVAQTDVDTLYIMYRHYTWAVWAYTWY HLA-A68:08,YYAMYRNNVAQTDVDTLYIMYRDYTWAVLAYTWY HLA-A68:09,YYAMYRNNVAQTDVDTLYIMYRDYTWAVQAYTWY HLA-A68:10,YYAMYEENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:100,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:101,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:102,YYTMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:103,YYAMYRNNVAQTDVDTLYIIYRDYTWAVWAYTWY HLA-A68:104,YYAMYRNNVAQTDVDTLYIMYHYYTWAVWAYTWY HLA-A68:105,YYAMYRNNVAQTDVDTLYVRYRDYTWAVWAYTWY HLA-A68:106,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:107,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:108,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWTYTWY HLA-A68:109,YYAMYRNNVAHTDENTLYIMYRDYTWAVWAYTWY HLA-A68:110,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:111,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:112,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:113,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWVYTWY HLA-A68:114,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:115,YYAMYRNNVAQTDVDTLYIMYRDYTWAVRVYTGY HLA-A68:116,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:117,YSAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:118,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:119,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:12,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:121,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:122,YYAIYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:123,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:124,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:125,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:126,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:127,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:128,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:129,YYAMYRNNVAQTDVDTLYIMYRDYTWAVQAYTWY HLA-A68:13,YYAMYRENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:130,YYAMYLQNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:131,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTGY HLA-A68:132,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:133,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:134,YYAMYRNNVAQTDVDTLYIMYRDYTWAVQAYRWY HLA-A68:135,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:136,YYAMYRNNVAQTDENTLYIMYRDYTWAVWAYTWY HLA-A68:137,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:138,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:139,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:14,YYAMYEENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:140,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:141,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:143,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:144,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:145,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:146,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:147,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:149,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:15,YYAMYRNNVAHTHVDTLYIRYHYYTWAVWAYTWY HLA-A68:150,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:151,YYAMYRNNVAQTDVDTLYITYRDYTWAVWAYTWY HLA-A68:152,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:153,YYAMYRNNVAQTDVATLYIRYHYYTWAVWAYTWY HLA-A68:154,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:155,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:156,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:157,YYAMYRNNVAQTDVDTLYIMYRDYTWAVLAYEWY HLA-A68:158,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:16,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:160,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:161,YYAMYRNNVAQTDVDTLYIMYPDYTWAVWAYTWY HLA-A68:162,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:163,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:164,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:165,YYAMYRNNVAQTDVDTLHIMYRDYTWAVWAYTWY HLA-A68:166,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:167,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:168,YYAMYRNNVAQTDVDTLYIMYRDYTWAVLAYTWY HLA-A68:169,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:17,YYAMYRNNVAQTDVDTLYIMYRVYTWAVWAYTWY HLA-A68:170,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:172,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:173,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:174,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:175,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:176,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:177,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:178,YYAMYQENVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:179,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:180,YYAMYRNNVAHTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:183,YYAMYRNNVAQTDVDTLYIMYRDYTWAEWAYTWY HLA-A68:184,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:185,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:186,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:187,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:188,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:189,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:19,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:190,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:191,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:192,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:193,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:194,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:195,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:196,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:197,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:198,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:20,YYAMYRNNVAHTHVDTLYIMYRDYTWAVWAYTWY HLA-A68:200,YYAMYRNNVAQTDVDTLYIMYRDYAWAVWAYTWY HLA-A68:201,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:202,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:204,YYAMYRNNVAQTDVDTLYIMYRDYTWAEQAYTWY HLA-A68:21,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:22,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:23,YYAMYRNNVAQTDVDTLYIRYRDYTWAVWAYTWY HLA-A68:24,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:25,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:26,YYAMYRNNVAQTDVDTLYIMYRDYTWAVQAYTGY HLA-A68:27,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:28,YYAMYRNNVAQTDVDTLYIRYHYYTWAVRAYTWY HLA-A68:29,YTAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:30,YYAMYGENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:31,YYAMYRNNVAHTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:32,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:33,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:34,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYMWY HLA-A68:35,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:36,YYAMYRNNVAQTDENIAYIMYRDYTWAVWAYTWY HLA-A68:37,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:38,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:39,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:40,YYAMYRNNVGQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:41,YYAMYRNNVAQTDVDTLYIMYRDYTWVVWAYTWY HLA-A68:42,YYAMYRNNVAQTDVDTLYIMYRDYTWAEWAYTWY HLA-A68:43,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:44,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:45,YSAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:46,YYAMYRNNVAQTDVNTLYIMYRDYTWAVWAYTWY HLA-A68:47,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:48,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:50,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:51,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:52,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:53,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:54,YYAMYRNNVAQTDVDTLYIRYHYYTWAEWAYTWY HLA-A68:55,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:56,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:57,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:58,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:60,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:61,YYAMYRNNVAQTDVDTLYIRYHYYTWAEWAYRWY HLA-A68:62,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:63,YYAMYRNNVAQTDVDTLYIMYRDYTWAELAYTWY HLA-A68:64,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:65,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTGY HLA-A68:66,YYAMYQENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:67,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:68,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:69,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:70,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:71,YFAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:72,YYAMYRNNVTQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:73,YYAMYRNNVAQTDVDTLYIMYRDYTWAVRAYTWY HLA-A68:74,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:75,YYAMYGNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:76,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:77,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:78,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:79,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:80,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:81,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:82,YYAMYRNNVAQTDVDTLYIRCHYYTWAVWAYTWY HLA-A68:83,YYAMYRNNVAQTDVDTLYVMYRDYTWAVWAYTWY HLA-A68:84,YYAMYRNNVAQTDANTLYIMYRDYTWAVWAYTWY HLA-A68:85,YYAMYRNNVVQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:86,YYAMYRNNVAQTDVDILYIRYHYYTWAVWAYTWY HLA-A68:87,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:88,YYAMYRNNVAQTDVDTLYIMYRYYTWAVWAYTWY HLA-A68:89,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:90,YYAMYRNNVAHTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:91,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:92,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:93,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:95,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:96,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:97,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A68:98,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A68:99,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A6901,YYAMYRNNVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A69:01,YYAMYRNNVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A69:02,YYAMYRNNVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A69:03,YYAMYRNNVAQTDVDTLYVRYHYYTWAVQAYTWY HLA-A69:04,YYAMYRNNVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A69:05,YYAMYRNNVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A7401,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A7402,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A7403,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A7404,YFAMYGEKVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A7405,YFAMYQENVAHADVDTLYIMYQDYTWAVLAYTWY HLA-A7406,YFAMYQENVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A7407,YFAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A7408,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A7409,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A7410,YFAMYQENVAHTDANTLYIMYQDYTWAVLAYTWY HLA-A7411,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:01,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:02,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:03,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:04,YFAMYGEKVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:05,YFAMYQENVAHADVDTLYIMYQDYTWAVLAYTWY HLA-A74:06,YFAMYQENVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A74:07,YFAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A74:08,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:09,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:10,YFAMYQENVAHTDANTLYIMYQDYTWAVLAYTWY HLA-A74:11,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:13,YFAMYQENVAQTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:15,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:16,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:17,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:18,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:19,YYAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:20,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:21,YFAMYGEKVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A74:22,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:23,YFAMYQENVAHTDVDTLYIIYQDYTWAVLAYTWY HLA-A74:24,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:25,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:26,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:27,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:28,YFAMYQENVAHTDVDTLYIMYQDYTWAELAYTWY HLA-A74:29,YFAMYQENVAHTDVDTLYIMYQDYTWAVWAYTWY HLA-A74:30,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:31,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A74:33,YFAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A74:34,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A8001,YFAMYEENVAHTNANTLYIIYRDYTWARLAYEGY HLA-A80:01,YFAMYEENVAHTNANTLYIIYRDYTWARLAYEGY HLA-A80:02,YFAMYEENVAHTDVDTLYIIYRDYTWARLAYEGY HLA-A80:03,YFAMYEENVAHTNANTLYIIYRDYTWARLAYTGY HLA-A80:04,YFAMYEENVAHTNENTLYIIYRDYTWARLAYEGY HLA-A9201,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYRWY HLA-A9202,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A9203,YFAMYQENVAQTHVDTLYVRCHYYTWAVLAYTWY HLA-A9204,YFAMYGEKVAHTHVDTLYVRYHYYTWAVWAYTWY HLA-A9205,YFAMYGEKVAHTHVDTLYVRYEYYTWAVLAYTWY HLA-A9206,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A9207,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A9208,YYAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A9209,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A9210,YFAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A9211,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A9212,YFAMYGEKVAHTDENIAYVRCHYYTWAVLAYTWY HLA-A9214,YFAMYGEKVAHTHVDTLYVRYRDYTWAVLAYTWY HLA-A9215,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A9216,YFAMYGEKVAHTHLDTLYVRYHYYTWAVLAYTWY HLA-A9217,YFAMYGEKVAHTHVDTLYVRYQDYTWAEWAYTWY HLA-A9218,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A9219,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A9220,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A9221,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A9222,YYAMYGEKVAHTHVDTLYIRYHYYTWAVWAYTWY HLA-A9223,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A9224,YFAMYGEKVAHTDESIAYVRYHYYTWAVLAYTWY HLA-A9226,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-B0702,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B0703,YYSEYRNIYTNTDESNLYLSYDYYTWAERAYEWY HLA-B0704,YYSEYRNIYAQTDESNLYLSYDYYTWAEDAYEWY HLA-B0705,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B0706,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B0707,YYSEYRNIYAQTDESNLYLRYDYYTWAERAYEWY HLA-B0708,YYSEYRNIFTNTDESNLYLSYDYYTWAERAYEWY HLA-B0709,YYSEYRNIYAQTDESNLYLSYDSYTWAERAYEWY HLA-B0710,YYSEYRNICAQTDESNLYLSYDYYTWAERAYEWY HLA-B0711,YYSEYRNIYAQTDENNLYLSYDSYTWAERAYEWY HLA-B0712,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY HLA-B0713,YYSGYREKYRQADVSNLYLSYDYYTWAERAYEWY HLA-B0714,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY HLA-B0715,YYSEYRNIYAQADVSNLYLSYDYYTWAERAYEWY HLA-B0716,YYSEYRNIYTNTYESNLYLSYDYYTWAERAYEWY HLA-B0717,YYSEYRNIYAQTDESNLYLSYDSYTWAERAYEWY HLA-B0718,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY HLA-B0719,YYSEYRNIYAQTDESNLYLSYDYYTWAEDAYTWY HLA-B0720,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLSY HLA-B0721,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B0722,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B0723,YYSEYRNIYAQTDESNLHLSYDYYTWAERAYEWY HLA-B0724,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLWY HLA-B0725,YYSEYRNIYAQTDESNLYLSYDYYTWAVDAYEWY HLA-B0726,YYSEYRNIYAQTDESNLYLSYDYYTWAELAYEWY HLA-B0727,YYSEYRNISTNTYEDTLYLSYDYYTWAERAYEWY HLA-B0728,YYSEYRNIYAQTDESNLYLSYDDYTWAERAYEWY HLA-B0729,YDSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B0730,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B0731,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYTWY HLA-B0732,YYSEYRNIFTNTDESNLYLSYNYYTWAERAYEWY HLA-B0733,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B0734,YYSEYRNIYAQTDESNLYLSYNYYTWAELAYTWY HLA-B0735,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B0736,YYSEYRNIYAQTDENIAYLSYDYYTWAERAYEWY HLA-B0737,YYSEYRNIYANTYESNLYLSYDYYTWAERAYEWY HLA-B0738,YYSEYRNIFTNTYENIAYLSYDYYTWAERAYEWY HLA-B0739,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B0740,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B0741,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B0742,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B0743,YYSEYRNIYAQTDESNLYLSYDYYTWAELAYTWY HLA-B0744,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B0745,YYSEYRNIYAQTDESNLYLSYDYYTWAERTYEWY HLA-B0746,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B0747,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B0748,YYSEYRNIYAQTDESNLYLSYDYYTWAVLAYEWY HLA-B0749,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B0750,YYSEYRNISTNTYESNLYLSYDYYTWAERAYEWY HLA-B0751,YYSEYRNIYAQTDESNLYLSYDYYTWAARAYEWY HLA-B0752,YYSEYRNIYAQTDESNLYLSYDYYTWAERVYEWY HLA-B0753,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B0754,YYSEYREIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B0755,YYSEYRNIYAQTDESNLYLSYDYYTWAEWAYEWY HLA-B0756,YYAEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B0757,YYSEYRNIYAQTDENNLYLSYDYYTWAERAYEWY HLA-B0758,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:02,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:03,YYSEYRNIYTNTDESNLYLSYDYYTWAERAYEWY HLA-B07:04,YYSEYRNIYAQTDESNLYLSYDYYTWAEDAYEWY HLA-B07:05,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:06,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:07,YYSEYRNIYAQTDESNLYLRYDYYTWAERAYEWY HLA-B07:08,YYSEYRNIFTNTDESNLYLSYDYYTWAERAYEWY HLA-B07:09,YYSEYRNIYAQTDESNLYLSYDSYTWAERAYEWY HLA-B07:10,YYSEYRNICAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:100,YYSEYRNIYAQTDESNLYLSYDYYTWAEWAYLWY HLA-B07:101,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:102,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:103,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:104,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:105,YYSEYRNIYAQTVESNLYLSYNYYTWAERAYEWY HLA-B07:106,YYSEYRNIYAQTDESNLYLSYDYYTRAERAYEWY HLA-B07:107,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:108,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:109,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:11,YYSEYRNIYAQTDENNLYLSYDSYTWAERAYEWY HLA-B07:110,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:112,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:113,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:114,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:115,YYSEYRNIYAQTDESNLYLSYNFYTWAERAYEWY HLA-B07:116,YYSEYRNIYVQTDESNLYLSYDYYTWAERAYEWY HLA-B07:117,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:118,YYSEYRNIYAQTDESNLYLSYDDYTWAERAYEWY HLA-B07:119,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:12,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY HLA-B07:120,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:121,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYERY HLA-B07:122,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:123,YYSEYREIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:124,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:125,YYSEYRNIYTQTDESNLYLSYDYYTWAERAYEWY HLA-B07:126,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:127,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:128,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:129,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:13,YYSGYREKYRQADVSNLYLSYDYYTWAERAYEWY HLA-B07:130,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:131,YYSEYRNIYAQTDESNLYLSYDYYTWAELAYLWY HLA-B07:132,YYSEYRNLYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:133,YYSKYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:134,YYSTYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:136,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:137,YYSEYRNIYAQTDESNLYIRYNYYTWAERAYEWY HLA-B07:138,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:139,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:14,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY HLA-B07:140,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYESY HLA-B07:141,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:142,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:143,YHSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:144,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWS HLA-B07:145,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:146,YYSEYRNIYAQTDESNLYLSYDYYTWAEDAYEWY HLA-B07:147,YYSEYRNIYAQTDESNLYLSYDYYTLAELAYEWY HLA-B07:148,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:149,YYSEYRNIYAQTDENTAYLSYDYYTWAERAYEWY HLA-B07:15,YYSEYRNIYAQADVSNLYLSYDYYTWAERAYEWY HLA-B07:150,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:151,YYSEYRNIYAQTDESNLYLSYDYYTLAERAYEWY HLA-B07:152,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:153,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYESY HLA-B07:154,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:155,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:156,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:157,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:158,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:159,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:16,YYSEYRNIYTNTYESNLYLSYDYYTWAERAYEWY HLA-B07:160,YYSEYRNIYAQADESNLYLSYDYYTWAERAYEWY HLA-B07:162,YYSEYRNIYAQTDESNLYIRYDSYTWAERAYEWY HLA-B07:163,YYSEYRNIYAQTDESNLYIRSDYYTWAERAYEWY HLA-B07:164,YYSEYRNIYAQTDESNLYLSYDYYTWARLAYEWY HLA-B07:165,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:166,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:168,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:169,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:17,YYSEYRNIYAQTDESNLYLSYDSYTWAERAYEWY HLA-B07:170,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:171,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:172,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:173,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:174,YYSEYRNIYAQTDESNLYLSYDYYSWAERAYEWY HLA-B07:175,YYSEYRNIYAQTDESNLYLSYDYCTWAERAYEWY HLA-B07:176,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:177,YYTEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:178,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:179,YYSEYRNIYAQTDESDLYLSYDYYTWAERAYEWY HLA-B07:18,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY HLA-B07:180,YYSEYRNICTNTYENIAYLSYDYYTWAERAYEWY HLA-B07:183,YYSEYRNISAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:184,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:185,YYSEYRNIYAQTDDSNLYLSYDYYTWAERAYEWY HLA-B07:186,YDSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:187,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:188,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:189,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:19,YYSEYRNIYAQTDESNLYLSYDYYTWAEDAYTWY HLA-B07:190,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:191,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:192,YYSEYRNIYAQTDESSLYLSYDYYTWAERAYEWY HLA-B07:193,YYSEYRNIYAQTDESNLYLRSDYYTWAERAYEWY HLA-B07:194,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:195,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:196,YYSEYRNIYAQTDESNLYLNYDYYTWAERAYEWY HLA-B07:197,YYSEYRNIYAQTDESNLYLNYHDYTWAERAYEWY HLA-B07:198,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:199,YYSEYRNIYAQTDESNLYISYDYYTWAERAYEWY HLA-B07:20,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLSY HLA-B07:200,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:202,YYSEYRNIYAQTDESNLYLSYDYYSLAVRAYEWY HLA-B07:203,YYSEYRNIYAQIDESNLYLSYDYYTWAERAYEWY HLA-B07:204,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:205,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:206,YYAEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:207,YYSEYRNIFTNTYESNLYLSYNYYTWAERAYEWY HLA-B07:208,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:209,YYSEYRNIYAQTDESNLYLSYNYYTWAVLAYEWY HLA-B07:21,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:210,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:211,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:212,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:213,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:214,YYSEYRNIYAQTDESNLYLRYNFYTWAERAYEWY HLA-B07:215,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:216,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:217,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:218,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWH HLA-B07:219,YYSEYGENMASTYENIAYLSYDYYTWAERAYEWY HLA-B07:22,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:220,YYSEYRNIYAQTDESNLYLSYDYYTWAARAYLWH HLA-B07:221,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:222,YYSEYRNIYAQTDESNLYLSYNYYSWAERAYEWY HLA-B07:223,YYSEYRNIYAQTDESNLYLSYDYYTWAVLAYLWY HLA-B07:224,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:225,YYSEYRNIYAQTDESNLYMVYEHYTWAERAYEWY HLA-B07:226,YYSEYRNIYAQTDESNLYLSYDYYTWAALAYEWY HLA-B07:227,YYSEYRNIYAQTDESNLYIVYDYYTWAERAYEWY HLA-B07:228,YYSEYRNIFTNTYESNLYLSYDYYTWAERAYEWY HLA-B07:229,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:23,YYSEYRNIYAQTDESNLHLSYDYYTWAERAYEWY HLA-B07:230,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:232,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:233,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:234,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:235,YYSEYRNIYAQTDESNLYIRYDSYTWAVLAYLWY HLA-B07:236,YYSEYRNIYAQTDEDTLYLSYDYYTWAERAYEWY HLA-B07:237,YYSEYRNIYAQTDESNLYLSYDSYTWAERAYEWY HLA-B07:238,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:239,YYSEYRNIYAQTDESNLYLWYDYYTWAERAYEWY HLA-B07:24,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLWY HLA-B07:240,YYSEYRNIYAQTDEDNLYLSYDYYTWAERAYEWY HLA-B07:241,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:242,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:243,YYSEYQNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:244,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:245,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:246,YYSEYRNIYAQTDESNLYLSYDFYTWAERAYEWY HLA-B07:247,YYSGYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:248,YYSEYRNIYAQTDESNLYIRSDYYTWAERAYEWY HLA-B07:249,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:25,YYSEYRNIYAQTDESNLYLSYDYYTWAVDAYEWY HLA-B07:250,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:252,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:253,YYSEYRNIYAQTDVNNLYLSYDYYTWAERAYEWY HLA-B07:254,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:255,YYSEYRNIYAQTDESNLYLRYDSYTWAERAYEWY HLA-B07:256,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:257,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:258,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:259,YYSEYRNIYRQTDESNLYLSYDYYTWAERAYEWY HLA-B07:26,YYSEYRNIYAQTDESNLYLSYDYYTWAELAYEWY HLA-B07:260,YYSEYRNIYAQTDESNLYLSYEHYTWAERAYEWY HLA-B07:261,YYSEYRNIYAQTDESNLYLSYDYYTWAVRAYEWY HLA-B07:262,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:263,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:264,YYSEHRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:265,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:266,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:267,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:268,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:269,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYQWY HLA-B07:27,YYSEYRNISTNTYEDTLYLSYDYYTWAERAYEWY HLA-B07:270,YYSGYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:271,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:273,YYSEYRNIYAQTDESTLYLSYDYYTWAERAYEWY HLA-B07:274,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:275,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:276,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:277,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:278,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:279,YYSEYRNIYAQTDESNLYLSYDYYSLAERAYEWY HLA-B07:28,YYSEYRNIYAQTDESNLYLSYDDYTWAERAYEWY HLA-B07:280,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:281,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:282,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:283,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:284,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:286,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:287,YYSEYRNIYAQTDESNLYLSYNSYTWAERAYEWY HLA-B07:288,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:289,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:29,YDSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:290,YYSEYRIIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:291,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:292,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:293,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:294,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:295,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:296,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:297,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:298,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:299,YYSEYRNIYAQTDQSNLYLSYDYYTWAERAYEWY HLA-B07:30,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:300,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:301,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:302,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:303,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:304,YYSEYRNIYAQTDVSNLYLSYNYYTWAERAYEWY HLA-B07:305,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:306,YYSEYRNICTNTYESNLYLSYDYYTWAERAYEWY HLA-B07:307,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:308,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:309,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:31,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYTWY HLA-B07:310,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:311,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:312,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:313,CYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:314,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:317,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:319,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:32,YYSEYRNIFTNTDESNLYLSYNYYTWAERAYEWY HLA-B07:320,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:321,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:322,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:323,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:324,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:326,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:327,YYSEYRNIYAQTDESNLYLSYNFYTWAERAYEWY HLA-B07:328,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:329,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:33,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:331,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:332,YYSEYRNIYAQTDESNLYLSYNYYTWAARAYEWY HLA-B07:333,YYSQYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:334,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:335,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:336,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:337,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:338,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:339,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:34,YYSEYRNIYAQTDESNLYLSYNYYTWAELAYTWY HLA-B07:340,YYSEYRNIYAQTDENNLYLSYNYYTWAERAYEWY HLA-B07:341,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:342,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:344,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:345,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:346,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:347,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:348,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:349,YYSEYRNIYAQTDESNLYLSYNYYTWAEDAYEWY HLA-B07:35,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:350,YYSEYRNIYAQTDESNLYISYDYYTWAERAYEWY HLA-B07:352,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:353,YYSEYRNIYAQTDESNLYLSYNYYAWAERAYEWY HLA-B07:354,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:355,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:356,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:357,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:358,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYLWY HLA-B07:36,YYSEYRNIYAQTDENIAYLSYDYYTWAERAYEWY HLA-B07:37,YYSEYRNIYANTYESNLYLSYDYYTWAERAYEWY HLA-B07:38,YYSEYRNIFTNTYENIAYLSYDYYTWAERAYEWY HLA-B07:39,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:40,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:41,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:42,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:43,YYSEYRNIYAQTDESNLYLSYDYYTWAELAYTWY HLA-B07:44,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:45,YYSEYRNIYAQTDESNLYLSYDYYTWAERTYEWY HLA-B07:46,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:47,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:48,YYSEYRNIYAQTDESNLYLSYDYYTWAVLAYEWY HLA-B07:50,YYSEYRNISTNTYESNLYLSYDYYTWAERAYEWY HLA-B07:51,YYSEYRNIYAQTDESNLYLSYDYYTWAARAYEWY HLA-B07:52,YYSEYRNIYAQTDESNLYLSYDYYTWAERVYEWY HLA-B07:53,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:54,YYSEYREIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:55,YYSEYRNIYAQTDESNLYLSYDYYTWAEWAYEWY HLA-B07:56,YYAEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:57,YYSEYRNIYAQTDENNLYLSYDYYTWAERAYEWY HLA-B07:58,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:59,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:60,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLWY HLA-B07:61,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:62,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:63,YYSDYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:64,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEGY HLA-B07:65,YYATYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:66,YYSEYRNIYAQTDESNLYLSYDYYTWAEQAYEWY HLA-B07:68,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:69,YYSEYRNICTNTDESNLYLSYNYYTWAERAYEWY HLA-B07:70,YCSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:71,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:72,YYAEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:73,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:74,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:75,YYSEYRNIYAQTYENNLYLSYDYYTWAERAYEWY HLA-B07:76,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:77,YYSEYRNIYAQTDESNLYLRSDYYTWAERAYEWY HLA-B07:78,YYSEYRNIYAQTDESNLYWTYNLYTWAERAYEWY HLA-B07:79,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:80,YYSEYRNIYAQTDESNLYLSYNYYTWAELAYEWY HLA-B07:81,YYSEYRNIYAQTDESIAYLSYDYYTWAERAYEWY HLA-B07:82,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:83,YYSEYRNIFAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:84,YYSEYRNIYAQTDESNLYWTYDYYTWAERAYEWY HLA-B07:85,YYSEYRNICTNTDESNLYLSYDYYTWAERAYEWY HLA-B07:86,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:87,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:88,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:89,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:90,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:91,YYSEYRNIYAQTYESNLYLSYDYYTWAERAYEWY HLA-B07:92,YYSEYRNIYAQTDVSNLYLSYDYYTWAERAYEWY HLA-B07:93,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:94,YYSEYWNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:95,YYSEYRNIYAQTDESNLYFSYDYYTWAERAYEWY HLA-B07:96,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B07:97,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B07:98,YYSEYRNIYAQTDESNLYLSYDYYTCAERAYEWY HLA-B07:99,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B0801,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B0802,YDSEYRNIFTNTDENTAYLSYNYYTWAVDAYTWY HLA-B0803,YDSEYRNIFTNTYENIAYLSYNYYTWAVDAYTWY HLA-B0804,YDSEYRNISTNTDESNLYLSYNYYTWAVDAYTWY HLA-B0805,YDSEYRNTFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B0806,YDSEYRNIFTNTDENNLYLSYNYYTWAERAYTWY HLA-B0807,YDSEYRNIFTNTDESNLYLSYDYYTWAVDAYTWY HLA-B0808,YDSEYRNIFTNTDESNLYLSYNYYPGPWTPTRGT HLA-B0809,YDSEYRNIFTNTDESNLYWTYNYYTWAVDAYTWY HLA-B0810,YDSEYRDIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B0811,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYAWY HLA-B0812,YDSEYRNIFTNTDESNLYLRYNYYTWAVDAYTWY HLA-B0813,YDSEYRNIFTNTDESNLYLSYNYYTWAVLAYTWY HLA-B0814,YDSEYRNIFTNTDESNLYLSYHDYTWAVDAYTWY HLA-B0815,YDSEYRNIFTNTDVSNLYLSYNYYTWAVDAYTWY HLA-B0816,YDSEYRNIFTNADESNLYLRYNYYTWAVDAYTWY HLA-B0817,YDSEYREISTNTDENNLYLSYNYYTWAVDAYTWY HLA-B0818,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B0819,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B0820,YDSEYRNIFTNTDESNLYLSYNYYTWAERAYTWY HLA-B0821,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYLWY HLA-B0822,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B0823,YDSEYRNIFTNTYESNLYLSYNYYTWAVDAYTWY HLA-B0824,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B0825,YDSEYRNIFTNTDESNLYLSYNYYTWAVLAYLWY HLA-B0826,YYAEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B0827,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B0828,YDSEYRNIFTNTDESNLYLSYDSYTWAVDAYTWY HLA-B0829,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B0831,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B0832,YDSTYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B0833,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:01,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:02,YDSEYRNIFTNTDENTAYLSYNYYTWAVDAYTWY HLA-B08:03,YDSEYRNIFTNTYENIAYLSYNYYTWAVDAYTWY HLA-B08:04,YDSEYRNISTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:05,YDSEYRNTFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:07,YDSEYRNIFTNTDESNLYLSYDYYTWAVDAYTWY HLA-B08:09,YDSEYRNIFTNTDESNLYWTYNYYTWAVDAYTWY HLA-B08:10,YDSEYRDIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:100,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:101,YDSEYREIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:102,YDTEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:103,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:104,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:105,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:106,YDSEYWNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:107,YDSEYRNIFTNTDESNLYLRYDSYTWAVDAYTWY HLA-B08:108,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:109,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:11,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYAWY HLA-B08:110,YDSEYRNISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B08:111,YDSEYRNIFTNTDESNLYLSYDYYTWAVDAYTWY HLA-B08:112,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:113,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:114,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:115,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:116,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:117,YDSEYRNIFTNTDESTAYLSYNYYTWAVDAYTWY HLA-B08:118,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWH HLA-B08:119,YDSEYGNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:12,YDSEYRNIFTNTDESNLYLRYNYYTWAVDAYTWY HLA-B08:120,YDSEYRNIFTNTDESNLYLSYNYYTLAVDAYTWY HLA-B08:121,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:122,YDTEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:123,YDSEYRNIYAQADESNLYLSYNYYTWAVDAYTWY HLA-B08:124,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:125,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYMWY HLA-B08:126,YDSEYRNIFTNTDEDTLYLSYNYYTWAVDAYTWY HLA-B08:127,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:128,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:129,YDSEYRNIFTNTDESNLYIRYNYYTWAVDAYTWY HLA-B08:13,YDSEYRNIFTNTDESNLYLSYNYYTWAVLAYTWY HLA-B08:130,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:131,YDSEYRNIFTNTDEDTLYLSYNYYTWAVDAYTWY HLA-B08:132,YDSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B08:133,YDSTYRNIFTNTYESNLYLSYNYYTWAVDAYTWY HLA-B08:134,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:135,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:136,YDSEYRNIFTNTDESTLYLSYNYYTWAVDAYTWY HLA-B08:137,YDSEHRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:138,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:139,YDSEYRNIFTNTYEDTLYLSYNYYTWAVDAYTWY HLA-B08:14,YDSEYRNIFTNTDESNLYLSYHDYTWAVDAYTWY HLA-B08:140,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:141,YDSEYRNNFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:142,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:143,YDSEYRNIFTNTDESNLYLSYNYYTWAALAYTWY HLA-B08:144,YDSEYPNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:145,YDSEYRNIFTNADESNLYLSYNYYTWAVDAYTWY HLA-B08:146,YDSEYRNIYTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:147,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:149,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:15,YDSEYRNIFTNTDVSNLYLSYNYYTWAVDAYTWY HLA-B08:150,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:151,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:152,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:153,YDSEYRNIFTNTDESNPYLSYNYYTWAVDAYTWY HLA-B08:154,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:155,YDSKYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:156,YDSEYRNIFTNTDESNLYLSYDYYTWAERAYEWY HLA-B08:157,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:158,YDSEYRNIFTNTEESNLYLSYNYYTWAVDAYTWY HLA-B08:159,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:16,YDSEYRNIFTNADESNLYLRYNYYTWAVDAYTWY HLA-B08:160,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:161,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:162,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:163,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:164,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:165,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYEWY HLA-B08:166,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:167,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:168,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:169,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:17,YDSEYREISTNTDENNLYLSYNYYTWAVDAYTWY HLA-B08:170,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:171,YDSEYRNIFTNTDESNLYLSYNYYTWAVLAYEWY HLA-B08:172,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:173,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:174,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:175,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYLWY HLA-B08:176,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:177,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:178,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:179,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:18,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:180,YDATYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:181,YDSEYRNIFTNTDESNLYIVYNYYTWAVDAYTWY HLA-B08:182,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:183,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:184,YDSEYRNIFTNTDESNLYLNYNYYTWAVDAYTWY HLA-B08:185,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:186,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYKWY HLA-B08:187,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:188,YDSGYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:189,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:190,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:191,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:192,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:193,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:194,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:195,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:196,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:197,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:198,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:199,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:20,YDSEYRNIFTNTDESNLYLSYNYYTWAERAYTWY HLA-B08:200,YDSEYRNIFTNTDESNLYLSYNFYTWAVDAYTWY HLA-B08:201,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:202,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:203,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:204,YDSEYRNIFTNTDESNLYVSYNYYTWAVDAYTWY HLA-B08:205,YDSEYRNIFTNTDESNLYLSYNYYTLAVLAYEWY HLA-B08:206,YDSEYRNIFTNTDESNLYLSHNYYTWAVDAYTWY HLA-B08:207,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:208,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:209,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:21,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYLWY HLA-B08:210,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:211,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:212,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:213,YDSEYRNIFTNTDESNLYLSYNYYSWAVDAYTWY HLA-B08:216,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:217,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:218,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:219,YDSEYRNIFTITDESNLYLSYNYYTWAVDAYTWY HLA-B08:22,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:221,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:222,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:223,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:224,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:23,YDSEYRNIFTNTYESNLYLSYNYYTWAVDAYTWY HLA-B08:24,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:25,YDSEYRNIFTNTDESNLYLSYNYYTWAVLAYLWY HLA-B08:26,YYAEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:27,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:28,YDSEYRNIFTNTDESNLYLSYDSYTWAVDAYTWY HLA-B08:29,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:31,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:32,YDSTYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:33,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:34,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:35,YDSEYRNIFTNTDESNLYLSYNSYTWAVDAYTWY HLA-B08:36,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:37,YDSEYRNIFTNTDESNLYLSYDSYTWAVDAYTWY HLA-B08:38,YDSEYREIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:39,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:40,YDSEYRNIFTNTDESNLYLSYNYYTWAVRAYEWY HLA-B08:41,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:42,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:43,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:44,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:45,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:46,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:47,YDSEYRNIFTNTDENNLYLSYNYYTWAVDAYTWY HLA-B08:48,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:49,YDSEYRNIFTNTDESNLYIRSNFYTWAVDAYTWY HLA-B08:50,YYSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:51,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:52,YDSEYRNIFTNTDESIAYLSYNYYTWAVDAYTWY HLA-B08:53,YDSEYRNIFTNTDESNLYLSYNYYTWAEDAYTWY HLA-B08:54,YDSEYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B08:55,YDSEYRNIFTNTDESNLYLSYNYYTWAVLTYTWY HLA-B08:56,YDAEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:57,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:58,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:59,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:60,YDSEYRNIFTNTDESNLYISYNYYTWAVDAYTWY HLA-B08:61,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:62,YHSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:63,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:64,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:65,YDSEYRNICTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:66,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:68,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:69,YDSEYRNIFTNTDESNLYLSYNFYTWAVDAYTWY HLA-B08:70,YDSEYRNIFTNTDESNLYLSYNYYTWAVWAYTWY HLA-B08:71,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:73,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:74,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:75,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:76,YDSEYRNIFTNTDESNLYISYNYYTWAVDAYTWY HLA-B08:77,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:78,YDSEYRNIFTNTDENIAYLSYNYYTWAVDAYTWY HLA-B08:79,YDSEYRNIFTNTDESNLYLSYNYYTWAERAYEWY HLA-B08:80,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:81,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:83,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:84,YDSEYRNIFTNTDESNLYWTYNYYTRAVDAYTWY HLA-B08:85,YDSEYRNIFSNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:87,YDSEYRNIFTNTDESNLYLSYDDYTWAVDAYTWY HLA-B08:88,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:89,YDSEYRNIFTNTDESNLYLRYDSYTWAVDAYTWY HLA-B08:90,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:91,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:92,YDSEYRNIFTNTDESNLCLSYNYYTWAVDAYTWY HLA-B08:93,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:94,YYSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:95,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:96,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:97,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:98,YDSEYQNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B08:99,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B1301,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B1302,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B1303,YYTMYREISTNTYENTAYWTYNLYTWAVLAYLWY HLA-B1304,YYTMYREISTNTYENTAYWTYDSYTWAVLAYLWY HLA-B1306,YYTMYREISTNTYENTAYIRYNLYTWAVLAYTWY HLA-B1308,YYTMYREISTNTYENTAYWTYNLYTWAVLACEWY HLA-B1309,YYTMYREISTNTYESNLYWTYNLYTWAVLAYEWY HLA-B1310,YYTMYREISTNTYENTAYLRYDSYTWAVLAYEWY HLA-B1311,YYTMYREISTNTYENTAYLRYNLYTWAVLAYEWY HLA-B1312,YYTMYREISTNTYENTAYIRYNLYTWAVLAYGWY HLA-B1313,YYTMYREISTNTYENTAYIRYNYYTWAVLAYEWY HLA-B1314,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B1315,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWH HLA-B1316,YYTMYREISTNTYENTAYWTYNLYTWAELAYEWY HLA-B1317,YYAMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B1318,YYTMYREISTNTYENTAYWTYNLYTWAVRAYEWY HLA-B1319,YYTMYREVSTNTYENTAYWTYNLYTWAVLAYEWY HLA-B1320,YYTMYREISTNTYENTAYIRYNLYTWAELAYEWY HLA-B13:01,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:02,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:03,YYTMYREISTNTYENTAYWTYNLYTWAVLAYLWY HLA-B13:04,YYTMYREISTNTYENTAYWTYDSYTWAVLAYLWY HLA-B13:06,YYTMYREISTNTYENTAYIRYNLYTWAVLAYTWY HLA-B13:08,YYTMYREISTNTYENTAYWTYNLYTWAVLACEWY HLA-B13:09,YYTMYREISTNTYESNLYWTYNLYTWAVLAYEWY HLA-B13:10,YYTMYREISTNTYENTAYLRYDSYTWAVLAYEWY HLA-B13:100,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:101,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:102,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:104,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:105,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:106,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:107,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:108,YYTMYREISTNTYENTAYLSYNYYTWAVLAYEWY HLA-B13:109,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:11,YYTMYREISTNTYENTAYLRYNLYTWAVLAYEWY HLA-B13:110,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:111,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:112,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:113,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:114,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:115,YYTMYREISSNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:117,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:118,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:119,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:12,YYTMYREISTNTYENTAYIRYNLYTWAVLAYGWY HLA-B13:120,YYTMYREISTNTYENTAYWTYNLYTWAVLAYLWY HLA-B13:121,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:122,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:124,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:125,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:126,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:127,YYTMYREISTNTYENTAYWTYDSYTWAVLAYEWY HLA-B13:128,YYTMYREISTNTYENTAYWTYNLYTWAERAYEWY HLA-B13:129,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:13,YYTMYREISTNTYENTAYIRYNYYTWAVLAYEWY HLA-B13:130,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:14,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:15,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWH HLA-B13:16,YYTMYREISTNTYENTAYWTYNLYTWAELAYEWY HLA-B13:17,YYAMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:18,YYTMYREISTNTYENTAYWTYNLYTWAVRAYEWY HLA-B13:19,YYTMYREVSTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:20,YYTMYREISTNTYENTAYIRYNLYTWAELAYEWY HLA-B13:21,YYTMYREISTNTYENTAYIRYNYYTWAVLAYEWY HLA-B13:22,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:23,YHTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:25,YYTMYREISTNTYESTAYIRYNLYTWAVLAYEWY HLA-B13:26,YYTMYREISTNTYENTAYIRYDSYTWAVLAYEWY HLA-B13:27,YYTMYREISTNTYENTAYWTFNLYTWAVLAYEWY HLA-B13:28,YYTMYREISTNTYENTACIRYNLYTWAVLAYEWY HLA-B13:29,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:30,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:31,YYTMYREISTNTYENTAYWTYNLYTWAEWAYEWY HLA-B13:32,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:33,YYAMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:34,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:35,YYTMYREISTNTYENTAYWTYDYYTWAVLAYEWY HLA-B13:36,YYTMYRNISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:37,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:38,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:39,YYTMYREISTNTYENNLYIRYNLYTWAVLAYEWY HLA-B13:40,YYTMYREISTNTYENTAYWTYNLYTWTVLAYEWY HLA-B13:41,YYTMYREISTNTYENTAYWTYNLYTWAVWAYEWY HLA-B13:42,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:43,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:44,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:45,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:46,YYTMYREISTNTYENTAYWTYNFYTWAVDAYTWY HLA-B13:47,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:48,YYTMYREISTNTYENTAYWTYNLYTWAELAYLWY HLA-B13:50,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:51,YYTMYREISTNTYENTAYIRYNFYTWAVLAYEWY HLA-B13:52,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:53,YYTMYREISTNTYENTAYWTYNLYTWAVLAYTWY HLA-B13:54,YYTMYREISANTYENTAYWTYNLYTWAVLAYEWY HLA-B13:55,YHTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:57,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:58,YYTTYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:59,YYTMYREISTNTYENTAYWTYNYYTWAVLAYEWY HLA-B13:60,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:61,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:62,YYTMYREISTNTYENTAYWTYNYYTWAELAYLWH HLA-B13:64,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:65,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:66,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:67,YYTMYREISTNTYENNLYWTYNLYTWAVLAYEWY HLA-B13:68,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:69,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:70,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:71,YYTMYREISTNTYENTAYLSYNYYTWAVLAYEWY HLA-B13:72,YYTMYREISTNTYENTAYWTYDSYTWAVLAYEWY HLA-B13:73,YYTMYREISTNTYENTAYIRYNLYTWAVRAYEWY HLA-B13:74,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:75,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:77,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:78,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:79,YYTMYREISTNTYENTAYIRSNFYTWAVLAYEWY HLA-B13:80,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:81,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:82,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:83,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:84,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:85,YYTMYREISTDTYENTAYWTYNLYTWAVLAYEWY HLA-B13:86,YYTMYREISTNTYENTAYIRYNYYTWAVLAYLWY HLA-B13:87,YYTMDREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:88,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:89,YYTMYREISTNTYENTAYWTYNLYTWAVLTYEWY HLA-B13:90,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:91,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:92,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:93,YDTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:94,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:95,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B13:96,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:97,YYTEYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:98,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B13:99,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B1401,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B1402,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B1403,YYSEYRNICTNTDESNLYLWYNFYTWAERAYTWH HLA-B1404,HYSEYRNNCTNTDESNLYLWYNFYTWAELAYTWH HLA-B1405,YYSEYRNICTNTDESNLYLSYNFYTWAELAYTWH HLA-B1406,YYSEYRNICTNTDESNLYLRYNFYTWAELAYTWH HLA-B14:01,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:02,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:03,YYSEYRNICTNTDESNLYLWYNFYTWAERAYTWH HLA-B14:04,HYSEYRNNCTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:05,YYSEYRNICTNTDESNLYLSYNFYTWAELAYTWH HLA-B14:06,YYSEYRNICTNTDESNLYLRYNFYTWAELAYTWH HLA-B14:08,YYSEYRNICTNTDESNLYLRYNFYTWAELAYTWH HLA-B14:09,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:10,YYSEYRNICTNTDESNLYIRYNFYTWAELAYTWH HLA-B14:11,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:12,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:13,YYSEYRNICTNTDESNLYLSYNYYTWAELAYTWH HLA-B14:14,YYSEYRNICTNTYESNLYLWYNFYTWAELAYTWH HLA-B14:15,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:16,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:17,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:18,YYSEYRNICTNTYESNLYLWYNFYTWAELAYTWH HLA-B14:19,YYSEYRNICTNTDESNLYLWYNFYTWAELAYLWH HLA-B14:20,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:21,YYSEYRNIYAQTDESNLYLWYNFYTWAELAYTWH HLA-B14:22,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:23,YYSEYRNICTNTDESNLYLWYDYYTWAELAYTWH HLA-B14:24,YYSEYGNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:25,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:26,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:27,YYSEYRNICTNTDESNLYLWYNFYTWAELAYLWH HLA-B14:28,YDSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:29,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:30,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:31,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:32,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:33,YYSEYRNICTNTDESNLYLWYDYYTWAELAYTWH HLA-B14:34,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:35,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:36,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:37,YYSEYRNICTNTDESNLYWRYNLYTWAELAYTWH HLA-B14:38,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:39,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:40,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:42,YYSEYRNIFTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:43,YYSEYRNICTNTDESNLYLWYNFYTWAVLAYTWH HLA-B14:44,YYSEYRNICTNTDESNLYLWYNFYTWAELAYAWH HLA-B14:45,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:46,YYSEYRNICTNTDESNLYLWYNFYTWAELAYEWY HLA-B14:47,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:48,YYTEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:49,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:50,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:51,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:52,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:53,YYSEYRNICTNTDESNLYLSYNYYTWAELAYTWH HLA-B14:54,YYAEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:55,YYSEYRNICTNTDESNLYLRYNFYTWAELAYTWH HLA-B14:56,YYSEYRNICTNTDESNLYLRYDSYTWAVLAYTWH HLA-B14:57,YYSEYRNICAKTDESNLYLWYNFYTWAELAYTWH HLA-B14:58,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:59,YYSEYRNICTNTDESNLYLWYNFYTWAVLAYTWH HLA-B14:60,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:61,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:62,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWY HLA-B14:63,YYSEYRNICTNTDVSNLYLWYNFYTWAELAYTWH HLA-B14:64,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:65,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:66,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:67,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B14:68,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B1501,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1502,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B1503,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B1504,YYAMYREISTNTYESNLYWTYDSYTWAEWAYLWY HLA-B1505,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B1506,YYAMYREISTNTYESNLYLRFDSYTWAELAYLWY HLA-B1507,YYAMYREISTNTYESNLYLSYDSYTWAEWAYLWY HLA-B1508,YYAMYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1509,YYSEYRNICTNTYESNLYLRYNYYTWAELAYLWY HLA-B1510,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWY HLA-B1511,YYAMYRNIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1512,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLGY HLA-B1513,YYAMYRNISTNTYENIAYIRYDSYTWAELAYLWY HLA-B1514,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLSY HLA-B1515,YYAMYRNISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1516,YYAMYRENMASTYENIAYWRYDSYTWAELAYLWY HLA-B1517,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B1518,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B1519,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLGY HLA-B1520,YYAMYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B1521,YYAMYRNICTNTYESNLYIRYDSYTWAELAYLWY HLA-B1523,YYSEYRNICTNTYENIAYLRYDSYTWAELAYLWY HLA-B1524,YYAMYREISTNTYENIAYLRYDSYTWAEWAYLWY HLA-B1525,YYAMYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B1527,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY HLA-B1528,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1529,YYSEYRNIFTNTYESNLYLRYDSYTWAELAYLWY HLA-B1530,YYAMYREISTNTYESNLYLRYNYYTWAEWAYLWY HLA-B1531,YYAMYRNISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B1532,YYAMYREISTNTYESNLYLRSDSYTWAEWAYLWY HLA-B1533,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1534,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1535,YYAMYREISTNTYESNLYLTYDSYTWAEWAYLWY HLA-B1536,YYAMYREISTNTYENTAYIRYDSYTWAELAYLWY HLA-B1537,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWH HLA-B1538,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWH HLA-B1539,YYAMYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B1540,YYAMYREISTNTYESNLYLRYDSYTWAELAYEWY HLA-B1542,YYAMYREISTNTYESNLYWTYNLYTWAELAYTWY HLA-B1543,YYAMYREISTNTYEDTLYLRYDSYTWAEWAYLWY HLA-B1544,YYAMYRNICTNTYESNLYIRYDSYTWAELAYTWY HLA-B1545,YYAMYREISTNTYESNLYLSYDYYTWAEWAYLWY HLA-B1546,YYAKYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1547,YYSEYREISTNTYESNLYLRYDSYTWAERAYEWY HLA-B1548,YYAMYREISTNTYESNLYLRYNYYTWAVLTYLWY HLA-B1549,YYSEYREISTNTYESNLYLRYDSYTWAERAYEWY HLA-B1550,YYAMYREISTNTYESNLYLRYDSYTWAEWAYTWY HLA-B1551,YYSEYRNICTNTYESNLYLRYDSYTWAVDAYLWY HLA-B1552,YYSEYRNICTNTYESNLYLRYDSYTWAVLAYEWY HLA-B1553,YYTKYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1554,YYSEYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1555,YYAMYRNISTNTYESNLYLSYDSYTWAVLAYLWY HLA-B1556,YYAMYREIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1557,YYAMYREISTNTYVNNLYLRYDSYTWAEWAYLWY HLA-B1558,YYAMYREISTNTYESNLYLRYNFYTWAEWAYLWY HLA-B1560,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1561,YYSEYREISTNTDESNLYLRYDSYTWAELAYLWY HLA-B1562,YYSEYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B1563,YYAMYREISTNTYESNLYLRYDYYTWAEWAYLWY HLA-B1564,YYSEYRNISTNTYESNLYLRYDSYTWAELAYLWY HLA-B1565,YYAMYREISTNTYESNLYLRYDSYTWAERAYLWY HLA-B1566,YYAMYREICTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1567,YYAMYRENMASTYENIAYWRYDSYTWAELAYLWY HLA-B1568,YYSEYREISTNTYESNLYLSYDSYTWAEWAYLWY HLA-B1569,YYSEYREISTNTYESNLYLRYDSYTWAELTYTWY HLA-B1570,YYAMYREISTNTDESNLYLRYDSYTWAEWAYLWY HLA-B1571,YHAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1572,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B1573,YYAMYREISTNTYESNLYLRYNLYTWAEWAYLWY HLA-B1574,YYSEYREISINTYESNLYLRYDSYTWAELAYLWY HLA-B1575,YYAMYREISTNTYESNLYLRYDSYTWAQWAYLWY HLA-B1576,YYAMYRNIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B1577,YYAMYREISTNTYESNLYIRYDDYTWAEWAYLWY HLA-B1578,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1580,YYSEYRNICTNTYESNLYIRYDSYTWAELAYLWY HLA-B1581,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1582,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1583,YYAMYREISTNTYESNLYWTYNYYTWAVDAYTWY HLA-B1584,YYAMYREISTNTYESNLYLRFDSYTWAVRAYLWY HLA-B1585,YYAMYREISTNTYESNLYIRYDSYTWAEWAYLWY HLA-B1586,YYAMYREISTNTYESNLYLRYNLYTWAVLAYTWY HLA-B1587,YYAMYREISTNTYESIAYLRYDSYTWAEWAYLWY HLA-B1588,YYAMYRNISTNTYESNLYIRYDSYTWATLAYLWY HLA-B1589,YYAMYRNISTNTYENTAYIRYDSYTWAELAYLWY HLA-B1590,YYSEYRNICTNTYESNLYLRYDYYTWAELVYLWY HLA-B1591,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLSY HLA-B1592,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1593,YYSEYRNICTNTYESNLYLRYDSYTWAELAYTWY HLA-B1595,YYAMYQENMASTYENIAYWRYDSYTWAELAYLWY HLA-B1596,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1597,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B1598,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B1599,YYSEYRNICTNTYESNLYLRYDYYTWAERAYLWY HLA-B15:01,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:02,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:03,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:04,YYAMYREISTNTYESNLYWTYDSYTWAEWAYLWY HLA-B15:05,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B15:06,YYAMYREISTNTYESNLYLRFDSYTWAELAYLWY HLA-B15:07,YYAMYREISTNTYESNLYLSYDSYTWAEWAYLWY HLA-B15:08,YYAMYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:09,YYSEYRNICTNTYESNLYLRYNYYTWAELAYLWY HLA-B15:10,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWY HLA-B15:101,YYAMYREIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B15:102,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:103,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:104,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:105,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:106,YYAKYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:107,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B15:108,YYSEYRNICTNTYESNLYLRYDSYTWAELTYLWY HLA-B15:109,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY HLA-B15:11,YYAMYRNIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:110,YYAMYREISTNTYESNLYLRCDSYTWAEWAYLWY HLA-B15:112,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:113,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:114,YYSEYRNICTNTYESNLYLRYDSYTWAVLAYEWY HLA-B15:115,YYSEYRNICTNTYESTAYLRYDSYTWAELAYLWY HLA-B15:116,YYAMYREISTNTYESNLYLRYDSYSLAEWAYLWY HLA-B15:117,YYAMYREISTNTYESNLYLRYDSYTWAEWAYEWY HLA-B15:118,YYAMYREISTNTYESNLYLMYDSYTWAEWAYLWY HLA-B15:119,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:12,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLGY HLA-B15:120,YYAMYRDISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:121,YYAMYRNISTNTYESNLYIRYDSYTWAELAYTWY HLA-B15:122,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:123,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B15:124,YYSEYRNICTNTYESNLYLRYDSYSLAVLAYEWY HLA-B15:125,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:126,YYAMYREISTNTYESNLYLSYDSCTWAEWAYLWY HLA-B15:127,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:128,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:129,YYAMYREISTNTYESNLYLNYDSYTWAEWAYLWY HLA-B15:13,YYAMYRNISTNTYENIAYIRYDSYTWAELAYLWY HLA-B15:131,YYSEYREISTNTYESNLYLRYDSYTWAELAYLSY HLA-B15:132,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:133,YYSEYRNICTNTYESNLYLRYDFYTWAELAYLWY HLA-B15:134,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:135,YYAMYREISTNTYENNLYLRYDSYTWAEWAYLWY HLA-B15:136,YYAMYREISTNTYESNLYLRYDSYTWAVLTYLWY HLA-B15:137,YYAMYREISTNTYESNLYWTYNFYTWAEWAYLWY HLA-B15:138,YYAMYREISTNTYESNLYLRYDSYTWAELAYEWY HLA-B15:139,YYAMYRNISANTYESNLYIRYDSYTWAELAYLWY HLA-B15:14,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLSY HLA-B15:140,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:141,YYAMYREISTNTYESNLYLTYDSYTWAEWAYLWY HLA-B15:142,YDAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:143,YYAKYRNIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:144,YYAMYRNISTNTYESNLYIRYDSYTWAEWAYLWY HLA-B15:145,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:146,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:147,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:148,YYAMYRNIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:15,YYAMYRNISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:150,YYAMYREISTNTYESNLYLRYNYYTWAEWAYLWY HLA-B15:151,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B15:152,YYAMYREIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:153,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:154,YYAMYREISTNTYESNLYIRYDSYTWAEWAYLWY HLA-B15:155,YYAMYREISTNTYESNLYWTYDSYTWAVLAYLWY HLA-B15:156,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:157,YYAMYREISTNTYENIAYLRYDSYTWAEWAYLWY HLA-B15:158,YYSEYREISTNTYESNLFLRYDSYTWAELAYLWY HLA-B15:159,YYAMYREISTNTYESNLHLRYDSYTWAEWAYLWY HLA-B15:16,YYAMYRENMASTYENIAYWRYDSYTWAELAYLWY HLA-B15:160,YYAMHREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:161,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLSY HLA-B15:162,YYAMYRENMASTYENIAYLRYHDYTWAALAYLWY HLA-B15:163,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:164,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:165,YYAMYREISTNTYESNLYIRYDSYTWAEWAYLWY HLA-B15:166,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:167,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:168,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B15:169,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:17,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B15:170,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:171,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:172,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:173,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:174,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:175,YHAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:176,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:177,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B15:178,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:179,YYAMYREISTNTYESNLYLRYDSYTWAVDAYLWY HLA-B15:18,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:180,YDSEYRNIFTNTDESNLYLRYDSYTWAEWAYLWY HLA-B15:183,YYTMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:184,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:185,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWH HLA-B15:186,YYSEYRNICTNTYESNLYLRYDSYTWAVLTYTWY HLA-B15:187,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:188,YYAMYREISTNTYESNLYLRYNYYTWAVLAYTWY HLA-B15:189,YYAMYRNICTNTDESNLYLRYDSYTWAEWAYLWY HLA-B15:19,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLGY HLA-B15:191,YYAMYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:192,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:193,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:194,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:195,YYAMYREISTNTYESNLYLRFDSYTWAELAYLWY HLA-B15:196,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B15:197,YYSEYRNICTNTYESNLYLSYDSYTWAELAYLWY HLA-B15:198,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:199,YYAMYREISTNTYESNLYLRYDSYTWAEDAYTWY HLA-B15:20,YYAMYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B15:200,YYSEYRNICTNTYESNLYLRYDSYTWATLAYLWY HLA-B15:201,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:202,YYATYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:203,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:204,YHAMYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:205,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:206,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:207,YYAMYREISTNTYESNLYLSYDSYTWAEWAYLWY HLA-B15:208,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B15:21,YYAMYRNICTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:210,YHSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:211,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:212,YHTKYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:213,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:214,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:215,YYAMYRNIYTNTYESNLYLSYDSYTWAEWAYLWY HLA-B15:216,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B15:217,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:219,YYAMYREISTNTYESNLYLRYGSYTWAELAYLWY HLA-B15:220,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:221,YYSEYRNICTNTYESNLYLRYDSYTWAERAYLWY HLA-B15:222,YYAMYRENMASTYENIAYWRYDSYTWAVLAYLWY HLA-B15:223,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:224,YYAMYREISTNTYESNLYLRYNLYTWAVLAYTWY HLA-B15:225,YHAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:227,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:228,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:229,YYSEYRNICTNTYESNLYLRYNFYTWAELAYLWY HLA-B15:23,YYSEYRNICTNTYENIAYLRYDSYTWAELAYLWY HLA-B15:230,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B15:231,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:232,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:233,YYAMYREISTNTYESNLYLRYDDYTWAEWAYLWY HLA-B15:234,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:235,YYSEYREISTNTYESNLYLRYDSYTWAVLTYLWY HLA-B15:236,YYAMYREIFTNTDESNLYLRYDSYTWAEWAYLWY HLA-B15:237,YYAMYREISTNTYESNLYLRYDSYTWAVRAYLWY HLA-B15:238,YYSEYRNICTNTYESNLYLRYDSYTWAELAYEWY HLA-B15:239,YYATYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:24,YYAMYREISTNTYENIAYLRYDSYTWAEWAYLWY HLA-B15:240,YYAMYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:241,YYAMYREISTNTYESNLYLRYDSYTWAEWAYEWY HLA-B15:242,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:243,YYSEYREICTNTYESNLYLRYNYYTWAELAYLWY HLA-B15:244,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:247,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:248,YYAMYREISTNTYESNLYLRYDYYTWAEWAYLWY HLA-B15:249,YYAMYREISTNTYESNLYLRYDSYTWAEWTYLWY HLA-B15:25,YYAMYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:250,YYAMYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:251,YYSMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:252,YYSEYRNICTNTYESNLYLRYNYYTWAELAYTWY HLA-B15:253,YYSEYREISTNTYESNLYLRYDFYTWAELAYLWY HLA-B15:254,YYAMYRENMASTYENIAYWRYDSYTWAELAYLWY HLA-B15:255,YYSEYREIYAQTDESNLYLRYDSYTWAELAYLWY HLA-B15:256,YYAMYREISTNTYENTAYLRYDSYTWAEWAYLWY HLA-B15:257,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:259,YYAEYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:260,YYAMYREISTNTYESNLHLRYDSYTWAEWAYLWY HLA-B15:261,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:263,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:264,YYAMYREISTNTYESNLYLGYDSYTWAEWAYLWY HLA-B15:265,YYAMYRNISTNTYESNLYIRYDSYTWAELTYTWY HLA-B15:266,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:267,YYAMYREISTNTNESNLYLRYDSYTWAEWAYLWY HLA-B15:268,YYAMYRENMASTYENIAYLRYDSYTWAELAYLWY HLA-B15:269,YYAMYREISTNTYESNLYLRYDDYTWAEWAYLWY HLA-B15:27,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY HLA-B15:270,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLGY HLA-B15:271,YYAMYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:273,YYAMYRENMASTYENIAYLRYHDYTWAELAHLWY HLA-B15:274,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:275,YYSEYRNICTNTYESNLYLRYDSYTWAVLAYLWY HLA-B15:276,YYAMYREISTNTYESNLYLRYDSYTRAEWAYLWY HLA-B15:277,YYAMYREISTNTYESKLYLRYDSYTWAEWAYLWY HLA-B15:278,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:279,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:28,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:280,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:281,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:282,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:283,YYAMYRNISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B15:284,YYAMYRNIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:285,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:286,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:287,YYAMYREISTNTYESNLYLRYDYYTWAEWAYLWY HLA-B15:288,YYAMYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:289,YYAMYREISTNTYVSNLYIRYDSYTWAELAYLWY HLA-B15:29,YYSEYRNIFTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:290,YYSEYRNICTNTYESNLYLTYDSYTWAELAYLWY HLA-B15:291,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:292,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:293,YYSEYRNICTNTYESNLYWRYDSYTWAELAYLWY HLA-B15:295,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:296,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:297,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:298,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLGC HLA-B15:299,YYAMYREISTNTYESNLYLRSDSYTWAEWAYLWY HLA-B15:30,YYAMYREISTNTYESNLYLRYNYYTWAEWAYLWY HLA-B15:300,YYAMYREISTNTYESNLYLRYDSYTWAECAYLWY HLA-B15:301,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:303,YYAMYRNIYTNTYESNLYWTYNLYTWAEWAYLWY HLA-B15:305,YYAMYRNIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:306,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:307,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:308,YYATYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:309,YYAMYREISTNTYESNLYLRYDSNTWAEWAYLWY HLA-B15:31,YYAMYRNISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B15:310,YYAMYREISTNTYESNLYWTYDSYTWAELAYLWY HLA-B15:311,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:312,YYSEYRNICTNTYESNLYLRYDYYTWAQLAYLWY HLA-B15:313,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWY HLA-B15:314,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:315,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:316,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:317,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:318,YYAMYREISTNTYVSNLYLRYDSYTWAEWAYLWY HLA-B15:319,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:32,YYAMYREISTNTYESNLYLRSDSYTWAEWAYLWY HLA-B15:320,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:322,YYAMYREISTNTYESNLYLRYDSYTWAEGAYLWY HLA-B15:323,YYSEYRNICTNTYESNLYLRYDYYTWAELAYTWH HLA-B15:324,YYAMYREISTNTYESNLYLSYNYYTWAEWAYLWY HLA-B15:325,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:326,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:327,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY HLA-B15:328,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:329,YYSEYRNICTNTYESNLYLSYNYYTWAELAYLWY HLA-B15:33,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:330,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:331,YYAMYREISTNTYESNLYLSYDSYTWAEWAYLWY HLA-B15:332,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B15:333,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:334,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:335,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWH HLA-B15:336,YYTMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:337,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:338,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWY HLA-B15:339,YYAMYREISTNTYENTAYLRYHDYTWAELAYLWY HLA-B15:34,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:340,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:341,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:342,YYAMYREISTNTYESNLYLNYHDYTWAEWAYLWY HLA-B15:343,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:344,YHAMYREISTNTYESNLYLRFDSYTWAEWAYLWY HLA-B15:345,YYTMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:346,YYAMYREISTNTYESNLYLRYDSYIWAEWAYLWY HLA-B15:347,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:348,YYAMYREISTNTYESNLYLRYDSYTWAVLAYTWY HLA-B15:349,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:35,YYAMYREISTNTYESNLYLTYDSYTWAEWAYLWY HLA-B15:350,YYAMYRNIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:351,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:352,YYAMYREISTNTYESNLYLRYDSYSWAEWAYLWY HLA-B15:353,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:354,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:355,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:356,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B15:357,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:358,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:359,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:36,YYAMYREISTNTYENTAYIRYDSYTWAELAYLWY HLA-B15:360,YYAMYREISTNTYESNLYLSYDSYTWAELAYLWY HLA-B15:361,YYAMYRENMASTYENIAYLRYNYYTWAELAYLWY HLA-B15:362,YYAMYRENMASTYENIAYWRYDSYTWAELDYLWY HLA-B15:363,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:364,YYAMYREISTNTYESNLYLRYDSYTWAELAYLWH HLA-B15:365,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:366,YYAMYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:367,YYAMYRNIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:368,YYAMYREISTNTYESNLYLRYDSYTWAEWAYTWH HLA-B15:369,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:37,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWH HLA-B15:370,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:371,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:372,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:373,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:374,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:376,YYSTYREICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:378,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:379,YYSEYREISTNTYESNLYLRYDSYTWAERAYLWY HLA-B15:38,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWH HLA-B15:381,YHAMYREISTNTYESNLYLTYDSYTWAEWAYLWY HLA-B15:382,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:383,YYAMYREISTNTYESNLYLSYDSYTWAVLAYLWY HLA-B15:384,YYAMYRNISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:385,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:386,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:387,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:388,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:389,YYSEYREISTNTYESNLYLRYDSYTWAELAYEWY HLA-B15:39,YYAMYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:390,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:391,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:392,YYAMYRGISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:393,YYAMYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B15:394,YYAMYRNICTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:395,YYAMYREISTNTYESNLYLNYDSYTWAELAYLWY HLA-B15:396,YYAMYRENMASTYENIAYLRYHDYTWAVLAYLWY HLA-B15:397,YYSEYREISTNTDVSNLYLRYDSYTWAELAYLWY HLA-B15:398,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY HLA-B15:399,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:40,YYAMYREISTNTYESNLYLRYDSYTWAELAYEWY HLA-B15:401,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:402,YYAMYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:403,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B15:404,YYAMYRNICTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:405,YYAMYREISTNTYESNLYLSYDSYTWAEWAYLWY HLA-B15:406,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:407,YYAMYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B15:408,YYAMYRENMASTYENIAYWRYDSYTWAELAYLWY HLA-B15:409,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:410,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:411,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B15:412,YYAMYREISTNTYESNLYLRYDSYSWAEWAYLWY HLA-B15:413,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:414,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:415,YYAMYREISTNTYESNLYLRYDSYTWAVWAYLWY HLA-B15:416,YYAMYREISTNTYESNLYLRYESYTWAEWAYLWY HLA-B15:417,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:418,YYAMYRNISTNTYENIAYIRYDSYTWAELAYLWY HLA-B15:419,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:42,YYAMYREISTNTYESNLYWTYNLYTWAELAYTWY HLA-B15:420,YYAMYRNICTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:421,YYAMYREISTNTYESNLYLSYDSYTWAVLAYEWY HLA-B15:422,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:423,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B15:424,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B15:425,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:426,YHSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:427,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWY HLA-B15:428,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:429,YDSMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:43,YYAMYREISTNTYEDTLYLRYDSYTWAEWAYLWY HLA-B15:430,YYAMYREISTNTYESKLYLRYDSYTWAEWAYLWY HLA-B15:431,YYAMYREISTNTYESNLYLSYDSYTWAEWAYLWY HLA-B15:432,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:433,YYSEYRNICTNTYESNLDLRYDSYTWAELAYLWY HLA-B15:434,YYSGYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:435,YYSEYRNICTNTYESNLYLRYNYYTWAELAYLWH HLA-B15:436,YYSGYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:437,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:438,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:439,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWY HLA-B15:44,YYAMYRNICTNTYESNLYIRYDSYTWAELAYTWY HLA-B15:440,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:441,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:442,YYAMYREISTNTYENIAYLRYDSYTWAEWAYLWY HLA-B15:443,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:444,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:445,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWY HLA-B15:446,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B15:447,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:448,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:449,YYAMYREISTNTYESNLYLRYDSYTWAVLTYTWY HLA-B15:45,YYAMYREISTNTYESNLYLSYDYYTWAEWAYLWY HLA-B15:450,YYAMYREISTNTYESNLYLSYDSYTWAEWAYLWY HLA-B15:451,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:452,YYAMYRELSTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:453,YYAMYREISTNTYESNLYLRYNSYTWAEWAYLWY HLA-B15:455,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWY HLA-B15:456,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:457,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:458,CYAMYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:459,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:46,YYAKYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:460,YYAMYRNISTNTYESNLYIRYNFYTWAELAYLWY HLA-B15:461,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:462,YYAMYGENMASTYENIAYLRYHDYTWAELAYLWY HLA-B15:464,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:465,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:466,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:467,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:468,YYAMYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:469,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:47,YYSEYREISTNTYESNLYLRYDSYTWAERAYEWY HLA-B15:470,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:471,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:472,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:473,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:474,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:475,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:476,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:477,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:478,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:479,YYAMYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:48,YYAMYREISTNTYESNLYLRYNYYTWAVLTYLWY HLA-B15:480,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:481,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:482,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:484,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:485,YYAMYREISTNTYESNLYWTYNLYTWAVLAYTWY HLA-B15:486,YYAMYRNIYTNTYESNLYLRYNLYTWAEWAYLWY HLA-B15:488,YYAMYREISTNTYESNLYLRYNFYTWAEWAYLWY HLA-B15:489,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:49,YYSEYREISTNTYESNLYLRYDSYTWAERAYEWY HLA-B15:490,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:491,YYAMYRNISTNTYESNLHIRYDSYTWAELAYLWY HLA-B15:492,YYAMYPEISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:493,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:494,YYAMYREISTNTYESNLYLRYDSYTWAELTYTWY HLA-B15:495,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:497,YYAMYREISTNTYESNLYLRYDSYTWAELAYTWY HLA-B15:498,YYSEYRNICTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:50,YYAMYREISTNTYESNLYLRYDSYTWAEWAYTWY HLA-B15:51,YYSEYRNICTNTYESNLYLRYDSYTWAVDAYLWY HLA-B15:52,YYSEYRNICTNTYESNLYLRYDSYTWAVLAYEWY HLA-B15:53,YYTKYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:54,YYSEYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:55,YYAMYRNISTNTYESNLYLSYDSYTWAVLAYLWY HLA-B15:56,YYAMYREIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:57,YYAMYREISTNTYVNNLYLRYDSYTWAEWAYLWY HLA-B15:58,YYAMYREISTNTYESNLYLRYNFYTWAEWAYLWY HLA-B15:60,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:61,YYSEYREISTNTDESNLYLRYDSYTWAELAYLWY HLA-B15:62,YYSEYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:63,YYAMYREISTNTYESNLYLRYDYYTWAEWAYLWY HLA-B15:64,YYSEYRNISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:65,YYAMYREISTNTYESNLYLRYDSYTWAERAYLWY HLA-B15:66,YYAMYREICTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:67,YYAMYRENMASTYENIAYWRYDSYTWAELAYLWY HLA-B15:68,YYSEYREISTNTYESNLYLSYDSYTWAEWAYLWY HLA-B15:69,YYSEYREISTNTYESNLYLRYDSYTWAELTYTWY HLA-B15:70,YYAMYREISTNTDESNLYLRYDSYTWAEWAYLWY HLA-B15:71,YHAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:72,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:73,YYAMYREISTNTYESNLYLRYNLYTWAEWAYLWY HLA-B15:74,YYSEYREISINTYESNLYLRYDSYTWAELAYLWY HLA-B15:75,YYAMYREISTNTYESNLYLRYDSYTWAQWAYLWY HLA-B15:76,YYAMYRNIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B15:77,YYAMYREISTNTYESNLYIRYDDYTWAEWAYLWY HLA-B15:78,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:80,YYSEYRNICTNTYESNLYIRYDSYTWAELAYLWY HLA-B15:81,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:82,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:83,YYAMYREISTNTYESNLYWTYNYYTWAVDAYTWY HLA-B15:84,YYAMYREISTNTYESNLYLRFDSYTWAVRAYLWY HLA-B15:85,YYAMYREISTNTYESNLYIRYDSYTWAEWAYLWY HLA-B15:86,YYAMYREISTNTYESNLYLRYNLYTWAVLAYTWY HLA-B15:87,YYAMYREISTNTYESIAYLRYDSYTWAEWAYLWY HLA-B15:88,YYAMYRNISTNTYESNLYIRYDSYTWATLAYLWY HLA-B15:89,YYAMYRNISTNTYENTAYIRYDSYTWAELAYLWY HLA-B15:90,YYSEYRNICTNTYESNLYLRYDYYTWAELVYLWY HLA-B15:91,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLSY HLA-B15:92,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:93,YYSEYRNICTNTYESNLYLRYDSYTWAELAYTWY HLA-B15:95,YYAMYQENMASTYENIAYWRYDSYTWAELAYLWY HLA-B15:96,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:97,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B15:98,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B15:99,YYSEYRNICTNTYESNLYLRYDYYTWAERAYLWY HLA-B1801,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B1802,YHSTYRNISTNTYESNLYLNYDSYTWAVLAYTWH HLA-B1803,YHSTYRNISTNTDESNLYLRYDSYTWAVLAYTWH HLA-B1804,YYATYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B1805,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B1806,YHSTYRNISTNTYVSNLYLRYDSYTWAVLAYTWH HLA-B1807,YHSTYRNIFTNTYESNLYLRYDSYTWAVLAYTWH HLA-B1808,YHSTYRNISTNTYESNLYLRCDSYTWAVLAYTWH HLA-B1809,YHSTYRNISTNTYENTAYLRYDSYTWAVLAYTWH HLA-B1810,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYEWY HLA-B1811,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWY HLA-B1812,YHSTYREISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B1813,YHSTYRNISTNTYESNLYLRYDSYTWAVRAYTWH HLA-B1814,YHSTYRNISTNTYESNLYLSYDSYTWAVLAYTWH HLA-B1815,YHSTYRNISTNTYESNLYLRYDSYTWAELAYTWH HLA-B1818,YHSTYRNISTNTYESNLYLRSDSYTWAVLAYTWH HLA-B1819,YHSTYRNISTNTYESNLYLRYDSYTWAEWAYTWH HLA-B1820,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B1821,YHSTYRNISTNTYESNLYLRYDSYTWAERAYEWY HLA-B1822,YHSTYRNISTNTYESNLYISYDSYTWAVLAYTWH HLA-B1823,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B1824,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B1825,YYSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B1826,YHSTYRNISTNTYESNLYLRYNYYTWAVLAYTWH HLA-B18:01,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:02,YHSTYRNISTNTYESNLYLNYDSYTWAVLAYTWH HLA-B18:03,YHSTYRNISTNTDESNLYLRYDSYTWAVLAYTWH HLA-B18:04,YYATYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:05,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:06,YHSTYRNISTNTYVSNLYLRYDSYTWAVLAYTWH HLA-B18:07,YHSTYRNIFTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:08,YHSTYRNISTNTYESNLYLRCDSYTWAVLAYTWH HLA-B18:09,YHSTYRNISTNTYENTAYLRYDSYTWAVLAYTWH HLA-B18:10,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYEWY HLA-B18:100,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:101,YHSTYRNISTNTYESNLYLRYDSYTWAELAYLWY HLA-B18:102,YHTTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:103,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:104,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:105,YHSTYRNISTNTYESNLYIRYDSYTWAVLAYTWH HLA-B18:106,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:107,YYTKYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:108,YHSTYRNISTNTYEDNLYLRYDSYTWAVLAYTWH HLA-B18:109,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:11,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWY HLA-B18:110,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWY HLA-B18:111,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:112,YHLTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:113,YHSTYRNISTNTYESNLYLRYDSYTWAVDAYTWH HLA-B18:114,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:115,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:116,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:117,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:118,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:119,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:12,YHSTYREISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:120,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:121,YHSTYRNISTNTYESNLYLRYDSYTWAVLDYTWH HLA-B18:122,YHSTYRNISTNTYESNLYLRYNFYTWAVLAYTWH HLA-B18:123,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:124,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:125,YYAEYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:126,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:127,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:128,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:129,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:13,YHSTYRNISTNTYESNLYLRYDSYTWAVRAYTWH HLA-B18:130,YHSTYRNISTNIYESNLYLRYDSYTWAVLAYTWH HLA-B18:131,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:132,YHSTYRNISTNTDEDNLYLRYDSYTWAVLAYTWH HLA-B18:133,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:134,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:135,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:136,YHSTYRNIFTNTYENIAYLRYDSYTWAVLAYTWH HLA-B18:137,YHSTYRNNSTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:139,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:14,YHSTYRNISTNTYESNLYLSYDSYTWAVLAYTWH HLA-B18:140,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:141,YHSTYRNISTNTYESNLYLRHDSYTWAVLAYTWH HLA-B18:142,YHSTYRNISTNTDVNNLYLRYDSYTWAVLAYTWH HLA-B18:143,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:144,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:145,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:146,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:147,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:148,YHSTYRNISTNTYESNLYLRYDFYTWAVLAYTWH HLA-B18:149,YHSTYRNISTNTYESNLYIRYDSYTWAVLAYTWH HLA-B18:15,YHSTYRNISTNTYESNLYLRYDSYTWAELAYTWH HLA-B18:150,YHSTYRNISTNTYESNLYIRFDSYTWAVLAYTWH HLA-B18:151,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:152,YHSTYRNISTNTDESNLYLRYDSYTWAELAYTWH HLA-B18:153,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:155,YHSTYRNISTSTYESNLYLRYDSYTWAVLAYTWH HLA-B18:156,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:157,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:158,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:159,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:160,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:161,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:18,YHSTYRNISTNTYESNLYLRSDSYTWAVLAYTWH HLA-B18:19,YHSTYRNISTNTYESNLYLRYDSYTWAEWAYTWH HLA-B18:20,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:21,YHSTYRNISTNTYESNLYLRYDSYTWAERAYEWY HLA-B18:22,YHSTYRNISTNTYESNLYISYDSYTWAVLAYTWH HLA-B18:24,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:25,YYSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:26,YHSTYRNISTNTYESNLYLRYNYYTWAVLAYTWH HLA-B18:27,YHSTYRNISTNTYESNLYLMFDSYTWAVLAYTWH HLA-B18:28,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:29,YHATYRNIFTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:30,YHSTYRNISTNTYESNLYLRYDSYTWAERAYTWH HLA-B18:31,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:32,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:33,YHSTYRNICTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:34,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:35,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYEWY HLA-B18:36,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYLWH HLA-B18:37,YHSEYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:38,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:39,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:40,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:41,YHSTYRNISTNTYESNLYLRYESYTWAVLAYTWH HLA-B18:42,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:43,YYSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:44,YHSTYRNISTNTYESNLYLWYDSYTWAVLAYTWH HLA-B18:45,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:46,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:47,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:48,YHSKYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:49,YHSTYRNISTNTYENNLYLRYDSYTWAVLAYTWH HLA-B18:50,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYEWH HLA-B18:51,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:52,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:53,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:54,YHSTYRNISTNTYEDTLYLRYDSYTWAVLAYTWH HLA-B18:55,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:56,YHSTYRNISTNTYESNLYLRYDSYTWAVDAYLSY HLA-B18:57,YHSTYRNISTNTYESNLYLRYDSYTWAELAYLWH HLA-B18:58,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B18:59,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:60,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:61,YHSTYRNISTNTYESNLYLRYNYYTWAVLAYTWH HLA-B18:62,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:63,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:64,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:65,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:66,YHSMYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:67,YHSTYRNISTNTYESIAYLRYDSYTWAVLAYTWH HLA-B18:68,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:69,YHSTYRNISTNTYESNLYIRYDSYTWAVLAYTWH HLA-B18:70,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:71,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:72,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:73,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:75,YHSTYRNISTNTYESNLYLRYDSYAWAVLAYTWH HLA-B18:76,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:77,YHSTYPNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:78,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:79,YHSTYRNIFTNTYENNLYLRYDSYTWAVLAYTWH HLA-B18:80,YHTTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:81,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:82,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:83,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:84,YHSTYRNISTNTYESNLCLRYDSYTWAVLAYTWH HLA-B18:85,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:86,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYMWH HLA-B18:87,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:88,YHSTYRNISTNTYESNLYLRYDSYTLAVLAYTWH HLA-B18:89,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:90,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:91,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:92,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:93,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:95,YHSTYRNISTNTYESNLHLRYDSYTWAVLAYTWH HLA-B18:96,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:97,YHSTYRNISTNTYESNLYLRYNSYTWAVLAYTWH HLA-B18:98,YHATYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B18:99,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B2701,YHTEYREICAKTYENTAYLNYHDYTWAVLAYEWY HLA-B2702,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B2703,YHTEHREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B2704,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B2705,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B2706,YHTEYREICAKTDESTLYLNYDYYTWAELAYEWY HLA-B2707,YHTEYREICAKTDEDTLYLSYNYYTWAVLAYEWY HLA-B2708,YHTEYREICAKTDESNLYLNYHDYTWAVLAYEWY HLA-B2709,YHTEYREICAKTDEDTLYLNYHHYTWAVLAYEWY HLA-B2710,YHTEYREICAKTDEDTLYLNYHDYTWAELAYEWY HLA-B2711,YHTEYREICAKTDESTLYLSYNYYTWAVLAYEWY HLA-B2712,YHTEYREICTNTDESNLYLNYHDYTWAVLAYEWY HLA-B2713,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B2714,YHTEYREICAKTDEDTLYWTYHDYTWAVLAYEWY HLA-B2715,YHTEYREICAKTDESTLYLNYHDYTWAELAYTWY HLA-B2716,YHTEYREICTNTDEDTLYLNYHDYTWAVLAYEWY HLA-B2717,YHTEFREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B2718,YHTEYREISTNTYESNLYLNYHDYTWAELAYEWY HLA-B2719,YHTEYREICAKTDEDTLYIRYHDYTWAVLAYEWY HLA-B2720,YHTEYREICAKTDESTLYLNYNYYTWAELAYEWY HLA-B2721,YHTEYREICAKTDESTLYLRYDYYTWAELAYEWY HLA-B2723,YHTEYRNIFTNTYESTLYLNYHDYTWAVLAYEWY HLA-B2724,YHTEYREICAKTDESTLYLSYNYYSWAELAYEWY HLA-B2725,YHTEYREICAKTDESTLYLNYHDYTWAEWAYLWY HLA-B2726,YHTEYREICAQTDESNLYLNYHDYTWAVLAYEWY HLA-B2727,YHTEYREICAKTDEDTLYLNYNYYTWAVLAYEWY HLA-B2728,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYTWH HLA-B2729,YHTEYREISTNTYEDTLYLNYHDYTWAVLAYEWY HLA-B2730,YHTEYREICAKTDENIAYIRYHDYTWAVLAYEWY HLA-B2731,YHTEYREICAQTDESTLYLNYHDYTWAVLAYEWY HLA-B2732,YHTEYREICAKTDEDTLYLSYHDYTWAVLAYEWY HLA-B2733,YHTEYREICAKTDESNLYLSYNYYTWAVLAYEWY HLA-B2734,YHTEYREICAKTDEDTLYLSYDYYTWAVLAYEWY HLA-B2735,YHTEYREICAKTDEDTLYLNYNFYTWAVLAYEWY HLA-B2736,YHTEYREICAKTDESTLYLNYHDYSLAVLAYEWY HLA-B2737,YYTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B2738,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYLWY HLA-B27:01,YHTEYREICAKTYENTAYLNYHDYTWAVLAYEWY HLA-B27:02,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B27:03,YHTEHREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:04,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B27:05,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:06,YHTEYREICAKTDESTLYLNYDYYTWAELAYEWY HLA-B27:07,YHTEYREICAKTDEDTLYLSYNYYTWAVLAYEWY HLA-B27:08,YHTEYREICAKTDESNLYLNYHDYTWAVLAYEWY HLA-B27:09,YHTEYREICAKTDEDTLYLNYHHYTWAVLAYEWY HLA-B27:10,YHTEYREICAKTDEDTLYLNYHDYTWAELAYEWY HLA-B27:100,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B27:101,YHTEYREICAQTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:102,YHTEYREICAKTDENIAYLNYNYYTWAVLAYEWY HLA-B27:103,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B27:104,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:105,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B27:106,YHTEYREICAKTDESTLYLNYDYYTWAELAYEWY HLA-B27:107,YHTEYREICAKTDESTLYLNYDSYTWAELAYEWY HLA-B27:108,YHTEYREICAKTDESTLYLNYHDYTWAERAYEWY HLA-B27:109,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B27:11,YHTEYREICAKTDESTLYLSYNYYTWAVLAYEWY HLA-B27:110,YHTEYREICAKTDENTLYLNYHDYTWAVLAYEWY HLA-B27:111,YHTEHREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:112,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B27:113,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B27:114,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B27:115,YHTEYREICAKTDESTLYLNYHDYTWAEWAYEWY HLA-B27:116,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:117,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:118,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:119,YHTEYREICTNTYENIAYLNYHDYTWAVLAYEWY HLA-B27:12,YHTEYREICTNTDESNLYLNYHDYTWAVLAYEWY HLA-B27:120,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B27:121,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:122,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:123,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:124,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:125,YHTEYREICAKTDESTLYLRYNYYSLAVLAYEWY HLA-B27:126,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B27:127,YHTEYREICAKTDEDTLYIRYDDYTWAVDAYLSY HLA-B27:128,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:129,YHTEYREICANTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:13,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:130,YHTEYREICAKTDEDTLYWTYNYYTWAVLAYEWY HLA-B27:131,YHTEYREICAKTYESTLYLNYHDYTWAVLAYEWY HLA-B27:132,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:133,YHTEYREICAKTDEDTLYLNYHDYTWAGLAYEWY HLA-B27:134,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B27:135,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:136,YHTEYREICAKTDEDTLYLNYDYYTWAVLAYEWY HLA-B27:137,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:138,YHTEYREICAKTDESTLYLSYDYYTWAELAYEWY HLA-B27:139,YHTEHREICAKTDEDTLYLNYHDYTWAVLAYLWY HLA-B27:14,YHTEYREICAKTDEDTLYWTYHDYTWAVLAYEWY HLA-B27:140,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:141,YHTEYREICAKTDEDTLYLNSHDYTWAVLAYEWY HLA-B27:142,YHTEYREICAKTDENTAYLNYHDYTWAVLAYEWY HLA-B27:143,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:144,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:145,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:146,NHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:147,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B27:148,YHTEYPEICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:149,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B27:15,YHTEYREICAKTDESTLYLNYHDYTWAELAYTWY HLA-B27:150,YHTEYREICAKTDEDTLYINYHDYTWAVLAYEWY HLA-B27:151,YHTEHREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:152,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:153,YHTEYREICTNTDESNLYWTYNYYTWAELAYLWH HLA-B27:154,YHTEYREICAKTDESTLYLNYDYYTWAVLAYEWY HLA-B27:155,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:156,YHTEYREICAKTDEDTLCLNYHDYTWAVLAYEWY HLA-B27:157,YHTEYRNIYAQTDENIAYLNYHDYTWAVLAYEWY HLA-B27:158,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:159,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:16,YHTEYREICTNTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:160,YHTEYREICAKTDEDTLYLNYHDYTWAVLTYEWY HLA-B27:161,YHTEYREICAKTDEDTLYLNYHDYTWAVWAYEWY HLA-B27:162,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:163,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B27:164,YHTEYREICAKTDEDTLYLSYNYYTWAVLAYEWY HLA-B27:165,YHTEYREICAKTDESNLYLNYHDYTWAELAYEWY HLA-B27:166,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:167,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:168,YHTEYREICAKTDESTLYLNYNYYTWAELAYEWY HLA-B27:169,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:17,YHTEFREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:170,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:171,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B27:172,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B27:173,YHTEYREICAKTDESTLYLNYHDYSWAELAYEWY HLA-B27:174,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:175,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:177,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:178,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:179,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:18,YHTEYREISTNTYESNLYLNYHDYTWAELAYEWY HLA-B27:180,YHTEYREICAKTDEDTLYLSYNYYTWAVLAYEWY HLA-B27:181,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B27:182,YHTEHREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:183,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B27:184,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:185,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:186,YHTEYREICAKTDEDTLYLNYQDYTWAVLAYEWY HLA-B27:187,YHTEYREICAKTDEDTLYLSYNYYTWAVLAYEWY HLA-B27:188,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B27:19,YHTEYREICAKTDEDTLYIRYHDYTWAVLAYEWY HLA-B27:20,YHTEYREICAKTDESTLYLNYNYYTWAELAYEWY HLA-B27:21,YHTEYREICAKTDESTLYLRYDYYTWAELAYEWY HLA-B27:23,YHTEYRNIFTNTYESTLYLNYHDYTWAVLAYEWY HLA-B27:24,YHTEYREICAKTDESTLYLSYNYYSWAELAYEWY HLA-B27:25,YHTEYREICAKTDESTLYLNYHDYTWAEWAYLWY HLA-B27:26,YHTEYREICAQTDESNLYLNYHDYTWAVLAYEWY HLA-B27:27,YHTEYREICAKTDEDTLYLNYNYYTWAVLAYEWY HLA-B27:28,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYTWH HLA-B27:29,YHTEYREISTNTYEDTLYLNYHDYTWAVLAYEWY HLA-B27:30,YHTEYREICAKTDENIAYIRYHDYTWAVLAYEWY HLA-B27:31,YHTEYREICAQTDESTLYLNYHDYTWAVLAYEWY HLA-B27:32,YHTEYREICAKTDEDTLYLSYHDYTWAVLAYEWY HLA-B27:33,YHTEYREICAKTDESNLYLSYNYYTWAVLAYEWY HLA-B27:34,YHTEYREICAKTDEDTLYLSYDYYTWAVLAYEWY HLA-B27:35,YHTEYREICAKTDEDTLYLNYNFYTWAVLAYEWY HLA-B27:36,YHTEYREICAKTDESTLYLNYHDYSLAVLAYEWY HLA-B27:37,YYTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:38,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYLWY HLA-B27:39,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:40,YHTEYREICAKTDESNLYLNYHDYTWAELAYEWY HLA-B27:41,YHTEYREICAKTDEDTLYLNYDSYTWAVLAYEWY HLA-B27:42,YHTEYREICAKTDEDNLYLNYHDYTWAVLAYEWY HLA-B27:43,YHTEYREICAKTDEDTLYLSYNYYTWAVLAYEWY HLA-B27:44,YHTEYREICAKTYESNLYLNYHDYTWAVLAYEWY HLA-B27:45,YHTEYREICAKTDEDTLYLNYHDYTWAVRAYEWY HLA-B27:46,YHTEYREICAKTDEDTLYLNYHYYTWAVLAYEWY HLA-B27:47,YHTEYREICAKTDEDTLYLNYHDYTWAVDAYLSY HLA-B27:48,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:49,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:50,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYESY HLA-B27:51,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:52,YHTTYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:53,YHTEYREICAKTDEDIAYLNYHDYTWAVLAYEWY HLA-B27:54,YHTEYREICAKTDEDTLYLNYHDYTWAELAYEWY HLA-B27:55,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:56,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:57,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B27:58,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:60,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:61,YHTEYREICAKTDESTLYLNYHDYTWAVLAYEWY HLA-B27:62,YHTEYREICAKTDENIAYLNYHDYTWAVLAYTWH HLA-B27:63,YHTEYREICAKTDESTLYLNYHDYTWAELAYLWY HLA-B27:67,YHTMYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:68,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B27:69,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B27:70,YHTEYREICAKTDEDTLYLRYHDYTWAVLAYEWY HLA-B27:71,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYTWY HLA-B27:72,YHTEYREICAKTDEDTLYLNNHDYTWAVLAYEWY HLA-B27:73,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:74,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:75,YHSEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B27:76,YHTEYREICAKTDEDTLYLNYNYYTWAVLAYLWY HLA-B27:77,YHTEYREICANTDENIAYLNYHDYTWAVLAYEWY HLA-B27:78,YHTEYREICAKTDEDTLYLNYHSYTWAVLAYEWY HLA-B27:79,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B27:80,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:81,YHTEYREICAKTDEDTLYWTYHDYTWAVLAYEWY HLA-B27:82,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:83,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B27:84,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:85,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:86,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B27:87,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:88,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:89,YHTEYREICAKTDENNLYLNYHDYTWAVLAYEWY HLA-B27:90,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:91,YHTEYREICAKTDESTLYLNYDYYTWAELAYEWY HLA-B27:92,YHTEYRNICTNTYEDTLYLNYHDYTWAELAYEWY HLA-B27:93,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:95,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B27:96,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:97,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:98,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B27:99,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B3501,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3502,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B3503,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B3504,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B3505,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B3506,YYATYRNIFTNTYESNLYIRYNFYTWAVLAYLWY HLA-B3507,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3508,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B3509,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B3510,YYATYREIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3511,YYATYRNIFTNTYESNLYIRYDSYTWAELAYLWY HLA-B3512,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B3513,YYATYREIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B3514,YYATYRNIFTNTYESNLYIRYDSYTWAEWAYLWY HLA-B3515,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYEWY HLA-B3516,YYATYREIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B3517,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B3518,YYATYRNIFTNTYESNLYIRYNYYTWAVRAYLWY HLA-B3519,YYAKYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3520,YYATYRNISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3521,YYATYRNIFTNTYESNLYIRYDSYTWAELAYLWH HLA-B3522,YYATYRNIFTNTYESNLYLSYNYYTWAVLAYLWY HLA-B3523,YYATYRNIFTNTYESNLYIRFDSYTWAVLAYLWY HLA-B3524,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWH HLA-B3525,YYSEYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3526,YYAEYRNICTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3527,YYATYRNIFTNTYENNLYIRYDSYTWAVLAYLWY HLA-B3528,YYATYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3529,YYATYRNIFTNTDESNLYIRYDSYTWAVLAYLWY HLA-B3530,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B3531,YYATYRNIFTNTYESNLYLSYNYYTWAVLAYEWY HLA-B3532,YYATYRNIFTNTYESNLYLRYDSYTWAVLAYLWY HLA-B3533,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYEWY HLA-B3534,YYATYRNIFTNTYESNLYIRYDYYTWAVLAYLWY HLA-B3535,YYATYRNIFTNTYESNLYIRYDSYTWAVLTYTWY HLA-B3536,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B3537,YYATYRNIFTNTYESNLYWTYDSYTWAVLAYLWY HLA-B3538,YYATYRNIFTNTYESNLYIRYDFYTWAVDAYLWY HLA-B3539,YYATYRNIFTNTYESNLYIRYDYYTWAVLAYLWY HLA-B3540,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3541,YYATYRNIFTNTYESNLYIRYDSCTWAVLAYLWY HLA-B3542,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3543,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B3544,YYATYRNIFTNTYESNLYLRYNYYTWAEWAYLWY HLA-B3545,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLSY HLA-B3546,YYAMYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3547,YYAKYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3548,YYATYRNIFTNTYESNLYIRSDSYTWAVLAYLWY HLA-B3549,YYAEYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3550,YHATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3551,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B3552,YYATYRNIFTNTYECNLYIRYDSYTWAVLAYLWY HLA-B3554,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3555,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B3556,YYATYRNIFTNTYENNLYIRYDFYTWAVLAYLWY HLA-B3557,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3558,YYATYRNIFTNTYESNLYLSYDSYTWAELAYLWY HLA-B3559,YYATYRNIFTNTYESNLYIRYNFYTWAVLAYLWY HLA-B3560,YYATYRNIFTNTYESNLYWTYNLYTWAVLAYTWY HLA-B3561,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B3562,YYATYRNIFTNTYESNLYIRYDSYTWAVWAYLWY HLA-B3563,YHTKYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3564,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B3565,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B3566,YYATYRNIFTNTYESNLYLSYDSYTWAVRAYEWY HLA-B3567,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B3568,YYATYRNIFTNTYESNLYLRYDSYTWAVLAYLWY HLA-B3569,YYATYREIFTNTDESNLYIRYDSYTWAVLAYLWY HLA-B3570,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B3571,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLSY HLA-B3572,YYATYRNISTNTYESNLYLSYDSYTWAVLAYLWY HLA-B3573,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B3574,YYATYRNIFTNTYVSNLYIRYDFYTWAVLAYLWY HLA-B3575,YYATYRNIFTNTYESNLYLRYDFYTWAVLAYLWY HLA-B3576,YYATYRNIYAQTDESNLYIRYDSYTWAVLAYLWY HLA-B3577,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:01,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:02,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:03,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:04,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:05,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B35:06,YYATYRNIFTNTYESNLYIRYNFYTWAVLAYLWY HLA-B35:07,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:08,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:09,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:10,YYATYREIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:100,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:101,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:102,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B35:103,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:104,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:105,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:106,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:107,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:108,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:109,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWH HLA-B35:11,YYATYRNIFTNTYESNLYIRYDSYTWAELAYLWY HLA-B35:110,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:111,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:112,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:113,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B35:114,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B35:115,YYATYRNIFTNTYESNLYIRYDSYTWAVDAYLWY HLA-B35:116,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:117,YYATYRNIFTNTYESNLYLSYDSYTWAEWAYLWY HLA-B35:118,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B35:119,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:12,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:120,YYATYRNIFTNTYESNLYIRHDSYTWAVLAYLWY HLA-B35:121,YYATYRNIFTNTYESNLYIRYHSYTWAVLAYLWY HLA-B35:122,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:123,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:124,YYSTYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:125,YYSTYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B35:126,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:127,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:128,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:13,YYATYREIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:131,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:132,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:133,YYATYRNIFTNTYESNLYIRYVSYTWAVLAYLWY HLA-B35:135,YYATYRNICTNTYESNLYLRYDSYTWAEWAYLWY HLA-B35:136,YYATYRNIFTNTDESNLYIRYDFYTWAVLAYLWY HLA-B35:137,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:138,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:139,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:14,YYATYRNIFTNTYESNLYIRYDSYTWAEWAYLWY HLA-B35:140,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:141,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:142,YYSTYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:143,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:144,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:146,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:147,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:148,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:149,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:15,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYEWY HLA-B35:150,YYTTYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:151,YYATYRNIFTNTYESNLYLRYDFYTWAVLAYLWY HLA-B35:152,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:153,YYATYRNIFTNTCESNLYIRYDFYTWAVLAYLWY HLA-B35:154,YYAKYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:155,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:156,YYATYRNIFTNTYESNLYIRYDFYTWAVRAYLWY HLA-B35:157,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYTWH HLA-B35:158,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:159,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:16,YYATYREIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B35:160,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:161,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:162,YHSTYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:163,YYATYRNIFTNTYESNLYIRYDFYTWAVWAYLWY HLA-B35:164,YYATYRNIFTNTYESNLYISYNSYTWAVRAYLWY HLA-B35:166,YYATYRNIFTNTYESNLYIRYDSYTWAVVAYLWY HLA-B35:167,YYATYRNIFTNTYESNLYIRYDFYTWAELAYLWY HLA-B35:168,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:169,YYATYRNIFTNTYESNLYIRYDFYTWAVDAYLSY HLA-B35:17,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B35:170,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:171,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:172,YYATYRNIFTNTYESNLYIRYNYYTWAVRAYLWY HLA-B35:174,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:175,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:176,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:177,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:178,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:179,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:18,YYATYRNIFTNTYESNLYIRYNYYTWAVRAYLWY HLA-B35:180,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:181,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:182,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:183,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:184,YYTTYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:185,YYATYRNIFTNTYENNLYLRYDSYTWAEWAYLWY HLA-B35:186,YYATYREKYRQTDVSNLYIRYDSYTWAVLAYLWY HLA-B35:187,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:188,YYATYRNIFTNTYESNLYIRYDSYTWAELAYTWH HLA-B35:189,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:19,YYAKYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:190,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYTWH HLA-B35:191,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:192,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:193,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:194,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:195,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:196,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:197,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:198,YYAEYRNIFTNTDESNLYIRYDFYTWAVLAYLWY HLA-B35:199,YYATYRNIFTNTYESNLYLSYDYYTWAVLAYLWY HLA-B35:20,YYATYRNISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:200,YYATYRNIFTDTYESNLYIRYDSYTWAVLAYLWY HLA-B35:201,YYTTYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:202,YYATYQNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:203,YYATYRNIFTNTYEDNLYIRYDSYTWAVLAYLWY HLA-B35:204,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:205,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:206,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:207,YYAMYREIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:208,YYATYRNIFTNTYESNLYIVYDSYTWAVLAYLWY HLA-B35:209,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:21,YYATYRNIFTNTYESNLYIRYDSYTWAELAYLWH HLA-B35:210,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:211,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:212,YYATYRNIVTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:213,YYATYRNIFTNTYESNLYIRYDFYTWAEWAYTWY HLA-B35:214,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:215,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:217,YHTKYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:218,YDATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:219,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:22,YYATYRNIFTNTYESNLYLSYNYYTWAVLAYLWY HLA-B35:220,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:221,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:222,YYATYRNIFTNTYESKLYIRYDSYTWAVLAYLWY HLA-B35:223,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:224,YYATYRNIFTNSYESNLYIRYDSYTWAVLAYLWY HLA-B35:225,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:226,YYATYGEISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:227,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:228,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:229,YYATYRNIFTQTDESNLYIRYDSYTWAVRAYLWY HLA-B35:23,YYATYRNIFTNTYESNLYIRFDSYTWAVLAYLWY HLA-B35:230,YYATYRNIFTNTYESNLYIRYNYYSLAVLAYEWY HLA-B35:231,YHATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:232,YYATYRNIFTNTYESNLYLSYDSYTWAERAYLWY HLA-B35:233,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWH HLA-B35:234,YYATYRNIFTNTYESNLYLRYHDYTWAVLAYLWY HLA-B35:235,YYATYRNIFTNTYESNLYWTYDFYTWAVLAYLWY HLA-B35:236,YYATYRNIFTNTYESNLYIRYDFYTWAVLTYLWY HLA-B35:237,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:238,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:239,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:24,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWH HLA-B35:240,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:241,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:242,YYATYRNIFTNTYESNLYISYDFYTWAVLAYLWY HLA-B35:243,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:244,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:245,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:246,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:247,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:248,YYATYRNIFTNTYESNQYIRYDSYTWAVLAYLWY HLA-B35:249,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:25,YYSEYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:250,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:251,YYATYRNIFTNTYESNLYLRYNYYTWAVLAYLWY HLA-B35:252,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:253,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:254,YYAEYRNIFTNTDESNLYIRYDSYTWAVLAYLWY HLA-B35:255,YYATYRNIFTNTYESNLYIRYDSCTWAVLAYLWY HLA-B35:256,YDATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:257,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:258,YYATYRNIFTNTYESNLYIRFNYYTWAVLAYLWY HLA-B35:259,YYATYRNIFTNTYESNLYIRYDSYTWAVLTYLWY HLA-B35:26,YYAEYRNICTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:260,YYATYRNIFTNTYESNLYIRYDSYTWAVDAYLWY HLA-B35:261,YYATYRNIFTNTYESNLYIRYNFYTWAVLAYLWY HLA-B35:262,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYTWY HLA-B35:263,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:264,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:265,YYATYRNIFTNTYESNLYWTYDSYTWAEWAYLWY HLA-B35:266,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:267,YYSTYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:268,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:269,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:27,YYATYRNIFTNTYENNLYIRYDSYTWAVLAYLWY HLA-B35:270,YYATYREIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:271,YYAMYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:272,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:273,YYATYRNIFTNTYESNLYWTYNYYTWAVLAYLWY HLA-B35:274,YYAKYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:275,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:276,YYATYRNIFTNTYESNLYWTYNFYTWAVLTYTWY HLA-B35:277,YYATYRNIFTNTYESNLYIRYDSYTWAELAYTWY HLA-B35:278,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:279,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:28,YYATYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:280,YHATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:281,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:282,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:283,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:284,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:285,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:286,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:287,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWH HLA-B35:288,YYATYRNIFTNTYESNLYMRYDSYTWAVLAYLWY HLA-B35:289,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:29,YYATYRNIFTNTDESNLYIRYDSYTWAVLAYLWY HLA-B35:290,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:291,YYATYRNIFTNTYESNLYIRYDLYTWAVLAYLWY HLA-B35:292,YYATYRNIFTNTYESNLYLRYNYYTWAVLAYLWY HLA-B35:293,YYATYRNIFTNTYESNMFIRYDSYTWAVLAYLWY HLA-B35:294,YYATYRNICTNTDESNLYIRYDSYTWAVLAYLWY HLA-B35:295,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:296,YYATYRNISTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:297,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:298,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:299,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:30,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B35:300,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:301,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:302,YYATYRNIFTNTYESNLHIRYDSYTWAVLAYLWY HLA-B35:303,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:304,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:305,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:306,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:307,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:308,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:309,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLSY HLA-B35:31,YYATYRNIFTNTYESNLYLSYNYYTWAVLAYEWY HLA-B35:310,YYATYRNIFTNTYEGNLYIRYDSYTWAVLAYLWY HLA-B35:311,YYAMYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:312,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:313,YYATYRNIFTNTYKSNLYIRYDSYTWAVLAYLWY HLA-B35:314,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:315,YYATYRNIFTNTYESNLNIRYDSYTWAVLAYLWY HLA-B35:316,YYATYRNIFTNTDESNLYIRYNYYTWAVLAYLWY HLA-B35:317,YHTKYREISTNTYESNLYIVYDSYTWAVLAYLWY HLA-B35:318,YYATYREIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B35:319,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:32,YYATYRNIFTNTYESNLYLRYDSYTWAVLAYLWY HLA-B35:320,YYSTYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:321,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:322,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:323,YHATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:324,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:325,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:326,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:327,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:328,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:329,YYATYRNIFTNTYESTLYIRYDFYTWAVLAYLWY HLA-B35:33,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYEWY HLA-B35:330,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:331,YYATYRNIFTNTYESNLYIRYDSYSWAVLAYLWY HLA-B35:332,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:334,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:335,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:336,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:337,YYATYRNIFTNTYESNLYIRYDSYTWAERAYLWY HLA-B35:338,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:339,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:34,YYATYRNIFTNTYESNLYIRYDYYTWAVLAYLWY HLA-B35:340,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:341,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYEWY HLA-B35:342,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:343,YYATYRNIFTNTYESNLYIRYDSYTWAEWAYTWY HLA-B35:344,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:345,YYATYRNIFTNTYESNLYIRYDPYTWAVLAYLWY HLA-B35:346,YYATYRNIFTNTYESNLYISYDSYTWAVRAYLWY HLA-B35:347,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:348,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:349,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:35,YYATYRNIFTNTYESNLYIRYDSYTWAVLTYTWY HLA-B35:350,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYTWY HLA-B35:351,YYATYRNIFTNTYQSNLYIRYDSYTWAVLAYLWY HLA-B35:352,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:353,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:354,YYATYRNIFTNTYESNLYIRYDFYTWAVLSYLWY HLA-B35:355,YYATYRNIFTNTYEDNLYIRYDFYTWAVLAYLWY HLA-B35:356,YYATYRNIFTNTYVSNLYIRYDSYTWAVRAYLWY HLA-B35:357,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:358,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:359,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:36,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:360,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:361,YYAEYREISTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:362,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:363,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:364,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:365,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:366,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:367,YYATYRNIFTNTYESNLYLRYNYYTWAVLAYLWY HLA-B35:368,YYATYRNIFAQTYESNLYLSYDSYTWAVLAYLWY HLA-B35:369,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:37,YYATYRNIFTNTYESNLYWTYDSYTWAVLAYLWY HLA-B35:370,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:371,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:372,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:373,YYATYPNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:374,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:375,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:376,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:377,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:378,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:379,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:38,YYATYRNIFTNTYESNLYIRYDFYTWAVDAYLWY HLA-B35:380,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:382,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:383,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:384,YYATYRNIFTNTYESNLYIRYNYYTWAELAYLWY HLA-B35:385,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:386,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:387,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:388,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:389,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B35:39,YYATYRNIFTNTYESNLYIRYDYYTWAVLAYLWY HLA-B35:391,YYATYRNIFTNTYESNLHIRYNYYTWAVLAYLWY HLA-B35:392,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:393,HYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:394,YYATYRNIFTNTYESNLYIRYNFYTWAVLAYLWY HLA-B35:395,YYATYRNIFTNTYESNLYIRFDFYTWAVLAYLWY HLA-B35:396,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:397,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:398,YYATYRNIFTNTYESNLYIRYDFHTWAVLAYLWY HLA-B35:399,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:400,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:401,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:402,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:403,YYATYRNIFTNTCESNLYIRYNYYTWAVLAYLWY HLA-B35:404,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:405,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:406,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:407,YYATYRNIFTNTYESNLYIRYDYYTWAVLAYLWY HLA-B35:408,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:409,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:41,YYATYRNIFTNTYESNLYIRYDSCTWAVLAYLWY HLA-B35:410,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:411,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:412,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:413,YYATYRNIFTNTYESNLYIRYNFYTWAEWAYLWY HLA-B35:42,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:43,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B35:44,YYATYRNIFTNTYESNLYLRYNYYTWAEWAYLWY HLA-B35:45,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLSY HLA-B35:46,YYAMYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:47,YYAKYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:48,YYATYRNIFTNTYESNLYIRSDSYTWAVLAYLWY HLA-B35:49,YYAEYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:50,YHATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:51,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B35:52,YYATYRNIFTNTYECNLYIRYDSYTWAVLAYLWY HLA-B35:54,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:55,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:56,YYATYRNIFTNTYENNLYIRYDFYTWAVLAYLWY HLA-B35:57,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:58,YYATYRNIFTNTYESNLYLSYDSYTWAELAYLWY HLA-B35:59,YYATYRNIFTNTYESNLYIRYNFYTWAVLAYLWY HLA-B35:60,YYATYRNIFTNTYESNLYWTYNLYTWAVLAYTWY HLA-B35:61,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:62,YYATYRNIFTNTYESNLYIRYDSYTWAVWAYLWY HLA-B35:63,YHTKYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:64,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:66,YYATYRNIFTNTYESNLYLSYDSYTWAVRAYEWY HLA-B35:67,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B35:68,YYATYRNIFTNTYESNLYLRYDSYTWAVLAYLWY HLA-B35:69,YYATYREIFTNTDESNLYIRYDSYTWAVLAYLWY HLA-B35:70,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:71,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLSY HLA-B35:72,YYATYRNISTNTYESNLYLSYDSYTWAVLAYLWY HLA-B35:74,YYATYRNIFTNTYVSNLYIRYDFYTWAVLAYLWY HLA-B35:75,YYATYRNIFTNTYESNLYLRYDFYTWAVLAYLWY HLA-B35:76,YYATYRNIYAQTDESNLYIRYDSYTWAVLAYLWY HLA-B35:77,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:78,YYATYRNIFANTYESNLYIRYDSYTWAVLAYLWY HLA-B35:79,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B35:80,YYATYREIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B35:81,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWH HLA-B35:82,YYATYRNICTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:83,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:84,YHTTYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:85,YYATYRNICTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:86,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYEWY HLA-B35:87,YYATYRNIFTNTYESNLYLSYNYYTWAVDAYTWY HLA-B35:88,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYEWY HLA-B35:89,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B35:90,YYTTYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:91,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:92,YYATYRNIFTNAYESNLYIRYDSYTWAVLAYLWY HLA-B35:93,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYTWY HLA-B35:94,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B35:95,YYATYRNISTNTYESNLYIRYNYYTWAVLAYLWY HLA-B35:96,YYATYRNIFTNTYESNLYIRYDFYTWAELAYTWH HLA-B35:97,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B35:98,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B35:99,YYATYRNIFTNTYESNLYLRYDSYTWAERAYLWY HLA-B3701,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B3702,YHSTYREISTNTYEDTLYLNYHDYTWAVLAYEWY HLA-B3704,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWH HLA-B3705,YHSTYREISTNTYEDNLYIRSNFYTWAVDAYTWY HLA-B3706,YHSKYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B3707,YHSTYREISTNTYEDTLYLSYDYYTWAERAYEWY HLA-B3708,YHSTYRNISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B3709,YHSTYREISTNTYEDTLYLSYDYYTWAVDAYTWY HLA-B3710,YHSTYREISTNTYENTAYIRSNFYTWAVDAYTWY HLA-B3711,YHSTYREISTNTYESNLYIRSNFYTWAVDAYTWY HLA-B3712,YHSTYREISTNTYEDTLYIRYNYYTWAVDAYTWY HLA-B3713,YHSTYREISTNTYEDTLYIRSNFYTWAEDAYTWY HLA-B37:01,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:02,YHSTYREISTNTYEDTLYLNYHDYTWAVLAYEWY HLA-B37:04,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWH HLA-B37:05,YHSTYREISTNTYEDNLYIRSNFYTWAVDAYTWY HLA-B37:06,YHSKYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:07,YHSTYREISTNTYEDTLYLSYDYYTWAERAYEWY HLA-B37:08,YHSTYRNISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:09,YHSTYREISTNTYEDTLYLSYDYYTWAVDAYTWY HLA-B37:10,YHSTYREISTNTYENTAYIRSNFYTWAVDAYTWY HLA-B37:11,YHSTYREISTNTYESNLYIRSNFYTWAVDAYTWY HLA-B37:12,YHSTYREISTNTYEDTLYIRYNYYTWAVDAYTWY HLA-B37:13,YHSTYREISTNTYEDTLYIRSNFYTWAEDAYTWY HLA-B37:14,YHSTYREISTNTYESNLYIRSNFYTWAVDAYTWY HLA-B37:15,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:17,YHSTYREISTNTYEDTLYIRSNFYTWTVDAYTWY HLA-B37:18,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:19,YHSTYREISTNTYEDTLYIRYNFYTWAVDAYTWY HLA-B37:20,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:21,YHSTYREIFTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:22,YHATYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:23,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:24,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:25,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:26,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:27,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:28,YHSEYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:29,YHSTYREISTNTYESTLYIRSNFYTWAVDAYTWY HLA-B37:31,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:32,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:34,YHSTYREISTNTYENIAYIRSNFYTWAVDAYTWY HLA-B37:35,YHSTYREISTNTYEDTLYIRSDSYTWAVDAYTWY HLA-B37:36,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:37,YHSTYREISTNTDESNLYIRSNFYTWAVDAYTWY HLA-B37:38,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:39,YHSTYREISTNTYEDTLYIRSNFYTWAVRAYLWY HLA-B37:40,YHSTYREISTNTYEDTLYIRSNFYTWAVLTYTWY HLA-B37:41,YHLTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:43,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:44,YHSTYREISTNTYEDTLYLRYNFYTWAVDAYTWY HLA-B37:45,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:46,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:47,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:48,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYLWY HLA-B37:49,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:50,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:51,YHSTYREISTNTYEDTLYLRSNFYTWAVDAYTWY HLA-B37:52,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:53,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:54,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:55,YYSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:56,YHSTYREISTNTYEDTLYIRYDSYTWAVDAYTWY HLA-B37:57,YHSTYREICTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:58,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:59,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:60,YHSTYREICAKTDEDTLYIRSNFYTWAVDAYTWY HLA-B37:61,YHSMYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:62,YDSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:63,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:64,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:65,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:66,YHSTYREISTNTYEDTLYIRSNFYTWAVWAYTWY HLA-B37:67,YHSTYRNIFTNTYESNLYIRSNFYTWAVDAYTWY HLA-B37:68,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:69,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:70,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:71,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:72,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:73,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:74,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:75,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:76,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:77,YHSTYREISTNTYEDTLYIRSDFYTWAVDAYTWY HLA-B37:78,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B37:80,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B3801,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B3802,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B3803,YYSEYREISTNTDESTAYLRYNFYTWAVLTYTWY HLA-B3804,YYSEYREICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B3805,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B3806,YYSTYRNIFTNTYENIAYLRYNFYTWAVLTYTWY HLA-B3807,YYSTYRNIFTNTYENIAYLRYNFYTWAVLTYTWY HLA-B3808,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYMWY HLA-B3809,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B3810,YYSEYRNICTNTYENIAYLRYNFYTWAELAYTWY HLA-B3811,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B3812,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B3813,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B3814,YYSEYRNICTNTDENIAYLRYNFYTWAVLTYTWY HLA-B3815,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B3816,YYTEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:01,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:02,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B38:03,YYSEYREISTNTDESTAYLRYNFYTWAVLTYTWY HLA-B38:04,YYSEYREICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B38:05,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:06,YYSTYRNIFTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:07,YYSTYRNIFTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:08,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYMWY HLA-B38:09,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:10,YYSEYRNICTNTYENIAYLRYNFYTWAELAYTWY HLA-B38:11,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:12,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:13,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:14,YYSEYRNICTNTDENIAYLRYNFYTWAVLTYTWY HLA-B38:15,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B38:16,YYTEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:17,YYSEYRNICTNTYEDTLYLRYNFYTWAVLTYTWY HLA-B38:18,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B38:19,YYSEYRNICTNTYENIAYLSYNFYTWAVLTYTWY HLA-B38:20,YYSEYRNICTNTYENIAYIRYNFYTWAVLTYTWY HLA-B38:21,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:22,YYSEYRNICTNTYENIAYLNYNFYTWAVLTYKWY HLA-B38:23,YYSEYRNICTNTYENTAYFRYNFYTWAVLTYTWY HLA-B38:24,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:25,YYSEYREICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:26,YYSEYRNIYAQTDENIAYLRYNFYTWAVLTYTWY HLA-B38:27,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:28,YYAEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:29,YYSEYRNICTNTYENTAYLRYDFYTWAVLTYTWY HLA-B38:30,YYSEYRNICTNTYENIAYLRYNFYTWAVDAYLWY HLA-B38:31,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:32,YYSEYRNICTNTYENIAYLRYNFYTWAELTYTWY HLA-B38:33,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:35,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B38:36,YYSEYRNICTNTYENIAYLRYNFYTWAVLAYTWY HLA-B38:37,YYSEYRNICTNTYENIAYLRYNFYTWAVLTHTWY HLA-B38:38,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:39,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:40,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:41,YYSEYRNICTNTDESIAYLRYNFYTWAVLTYTWY HLA-B38:42,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:43,YYSEYRNICTNTYENTAYLRYNFYTLAVLTYTWY HLA-B38:44,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B38:45,YYSEYRNICTNTYENTAYLRYNFYTWAVLIYTWY HLA-B38:46,YYTEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B38:47,YYSEYRNICTNTYESTAYLRYNFYTWAVLTYTWY HLA-B38:48,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B38:49,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B38:50,YYSEYRNICTNTYENTAYLRYNFYTWAVLAYTWY HLA-B38:51,YYSEYWNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:52,YYSEYRNICTNTYENIAYLRYDSYTWAVLAYTWY HLA-B38:53,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:54,YYSEYRNICTDTYENIAYLRYNFYTWAVLTYTWY HLA-B38:56,YYSEYRKICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:57,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:58,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:59,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:60,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:61,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:62,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B38:63,YYSEYRNICTNTYENIAYLRYNFYSLAVLAYEWY HLA-B38:64,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B38:65,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYLWY HLA-B38:66,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:67,YYSEYRNICTNTYESIAYLRYNFYTWAVLTYTWY HLA-B38:69,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:70,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:71,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:72,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B38:73,YYSEYRNICTNTYENIAYLRYNYYTWAVLTYTWY HLA-B38:74,YYSEYRNIFTNTYENTAYLRYNFYTWAVLTYTWY HLA-B38:75,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B38:76,YYSEYRNICTNTYENTACLRYNFYTWAVLTYTWY HLA-B38:77,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:78,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:79,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B38:81,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B38:82,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B3901,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B3902,YYSEYREISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B3903,YYSEYRNICTNTDESNLYLSYNFYTWAVLTYTWY HLA-B3904,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B3905,YYSEYRNICTNTYESNLYLRYNFYTWAVLTYTWY HLA-B3906,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY HLA-B3908,YYSEYREISTNTYESNLYLRYNFYTWAVRTYTWY HLA-B3909,YYSEYRNICTNTDESNLYLRSNFYTWAVLTYTWY HLA-B3910,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY HLA-B3912,YDSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B3913,YYSEYREISTNTYESNLYLRYNFYTWAVLTYTWY HLA-B3914,YYSEYRNICTNTDESNLYLSYNYYTWAVLTYTWY HLA-B3915,YYSEYRNICTNTDESNLYLRYDFYTWAVLTYTWY HLA-B3916,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY HLA-B3917,YYSEYRNIYTNTDESNLYLRYNLYTWAVLTYTWY HLA-B3918,YYSEYRNICTNTDESNLYLRYNFYTWAEWTYTWY HLA-B3919,YYSTYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B3920,YYSEYRNIYTNTYENNLYLRYNFYTWAVLTYTWY HLA-B3922,YYSEYREICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B3923,YYSEYREISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B3924,YYSEYRNICTNTDESNLYLSYNFYTWAVLTYTWY HLA-B3926,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B3927,YYSEYRNICTNTDVSNLYLRYNFYTWAVLTYTWY HLA-B3928,YYSEYRNICTNTDESNLYLTYNFYTWAVLTYTWY HLA-B3929,YYSEYRNICTNTDESNLYLSYDYYTWAVLTYTWY HLA-B3930,YYSEYRNICTNTDESNLYLRYNFYTWAVLAYTWY HLA-B3931,YHSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B3932,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYLWH HLA-B3933,YYSEYRNICTNTDESNLYWTYNFYTWAVRAYLWY HLA-B3934,YYSEYRNICTNTDESNLYWTYNFYTWAVLAYTWY HLA-B3935,YYSEYRNICTNTDESNLYLRYNFYTWAELTYTWY HLA-B3936,YYSEYRNICTNTDESNLYLRYNFYTWAEWAYTWY HLA-B3937,YYSEYRNICTNTYESNLYLSYNFYTWAVLTYTWY HLA-B3938,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B3939,YYSEYRNISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B3941,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B3942,YYSEYRNICTNTDESNLYIRYNFYTWAVLTYTWY HLA-B39:01,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:02,YYSEYREISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:03,YYSEYRNICTNTDESNLYLSYNFYTWAVLTYTWY HLA-B39:04,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:05,YYSEYRNICTNTYESNLYLRYNFYTWAVLTYTWY HLA-B39:06,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY HLA-B39:07,YYSEYRNICTNTYESNLYLRYDSYTWAVLTYTWY HLA-B39:08,YYSEYREISTNTYESNLYLRYNFYTWAVRTYTWY HLA-B39:09,YYSEYRNICTNTDESNLYLRSNFYTWAVLTYTWY HLA-B39:10,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:100,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:101,YHSEYREISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:102,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYMWY HLA-B39:103,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:104,YYSEYRNICTNTDESILYLRYNFYTWAVLTYTWY HLA-B39:105,YYSEYREISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:106,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:107,YYSEYRNICTNTDESNLYLRYNFYTWAELAYTWY HLA-B39:108,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:109,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY HLA-B39:11,YYSEYRNICTNTYESNLYLRYNFYTWAVRTYTWY HLA-B39:110,YYSEYREISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:111,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:112,YYSEYRNICTNTDESNLYLRSNFYTWAVLAYTWY HLA-B39:113,YYSEYRNICTNTYESNLYLRYNFYTWAVLTYTWY HLA-B39:114,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:115,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:117,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:118,YYSEYRNICTNTYESNLYLRYNFYTWAVLTYTWY HLA-B39:119,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:12,YDSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:120,YYSEYRNICTNTDESNLYLSYNFYTWAVLTYTWY HLA-B39:121,YYSGYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:122,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:123,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:124,YYSEYRNICTNTDENNLYLRYNFYTWAVLTYTWY HLA-B39:125,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:126,YYSEYRNIYTNTDESNLYLRYNYYTWAVLTYTWY HLA-B39:127,YYSEYRNICTNTDESNLYWTSNFYTWAVLTYTWY HLA-B39:128,YHSEYRNICTNTDESNLYLRYNFYTWAVLAYTWY HLA-B39:129,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY HLA-B39:13,YYSEYREISTNTYESNLYLRYNFYTWAVLTYTWY HLA-B39:130,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:131,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:132,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY HLA-B39:134,YYSEYRNICTNTDESNLYLRYNSYTWAVLTYTWY HLA-B39:135,YYAEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:136,YYSEYRNICTNTDESNLYLRYNFYTLAALAYTWY HLA-B39:137,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:138,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:14,YYSEYRNICTNTDESNLYLSYNYYTWAVLTYTWY HLA-B39:140,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY HLA-B39:141,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY HLA-B39:143,YYSEYRNIYTNTDVSNLYLRYNFYTWAVLTYTWY HLA-B39:15,YYSEYRNICTNTDESNLYLRYDFYTWAVLTYTWY HLA-B39:16,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:17,YYSEYRNIYTNTDESNLYLRYNLYTWAVLTYTWY HLA-B39:18,YYSEYRNICTNTDESNLYLRYNFYTWAEWTYTWY HLA-B39:19,YYSTYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:20,YYSEYRNIYTNTYENNLYLRYNFYTWAVLTYTWY HLA-B39:22,YYSEYREICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:23,YYSEYREISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:24,YYSEYRNICTNTDESNLYLSYNFYTWAVLTYTWY HLA-B39:26,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:27,YYSEYRNICTNTDVSNLYLRYNFYTWAVLTYTWY HLA-B39:28,YYSEYRNICTNTDESNLYLTYNFYTWAVLTYTWY HLA-B39:29,YYSEYRNICTNTDESNLYLSYDYYTWAVLTYTWY HLA-B39:30,YYSEYRNICTNTDESNLYLRYNFYTWAVLAYTWY HLA-B39:31,YHSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:32,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYLWH HLA-B39:33,YYSEYRNICTNTDESNLYWTYNFYTWAVRAYLWY HLA-B39:34,YYSEYRNICTNTDESNLYWTYNFYTWAVLAYTWY HLA-B39:35,YYSEYRNICTNTDESNLYLRYNFYTWAELTYTWY HLA-B39:36,YYSEYRNICTNTDESNLYLRYNFYTWAEWAYTWY HLA-B39:37,YYSEYRNICTNTYESNLYLSYNFYTWAVLTYTWY HLA-B39:39,YYSEYRNISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:41,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:42,YYSEYRNICTNTDESNLYIRYNFYTWAVLTYTWY HLA-B39:43,YYSEYRNICTNTDESNLYLRYDSYTWAVLAYTWH HLA-B39:44,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:45,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:46,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:47,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYEWY HLA-B39:48,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWH HLA-B39:49,YYSEYREISTNTYESNLYLRYDFYTWAVLTYTWY HLA-B39:50,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYEWY HLA-B39:51,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:52,YYSEYRNICTDTDESNLYLRYNFYTWAVLTYTWY HLA-B39:53,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:54,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:55,YYSEYRNICTNTYESNLYLRYDFYTWAVLTYTWY HLA-B39:56,YYSEYRNICTNTYESNLYLRYNFYTWAVLTYTWY HLA-B39:57,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY HLA-B39:58,YYSEYRNIFTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:59,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:60,YYSEYRNICTNTDESNLYLRYNFYTWAALTYTWY HLA-B39:61,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:62,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY HLA-B39:63,YYAEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:64,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY HLA-B39:65,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:66,YYSEYPNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:67,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:68,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:69,YYSKYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:70,YYSEYRNICTNTDESNLYLRYNYYTWAVLTYTWY HLA-B39:71,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:72,YCSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:73,YYSEYRNICTNTDESNLYFRYNFYTWAVLTYTWY HLA-B39:74,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYLWY HLA-B39:75,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:76,YYSEYRNICTNTDESNLYLSYNFYTWAVLTYTWY HLA-B39:77,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:78,YYSEYRDICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:79,YYSEYRNICTNTDESNLYLWYNFYTWAVLTYTWY HLA-B39:80,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:81,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:82,YYSEYRNICTNTDESNLYLRYNFYTWAALAYTWY HLA-B39:83,YYSEYRNIFTNTDESNLYWTYNFYTWAVLTYTWY HLA-B39:84,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:85,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:86,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:88,YYSEYRNISTNTDESNLYLRSNFYTWAVLTYTWY HLA-B39:89,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:90,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY HLA-B39:91,YYSEYRNICTNTDESNLYLRYDSYTWAVLTYTWY HLA-B39:92,YYSEYGNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:93,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:94,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:96,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:98,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B39:99,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY HLA-B4001,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4002,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B4003,YHTKYREISTNTYESNLYLSYDSYTWAVLAYEWY HLA-B4004,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B4005,YHTKYREISTNTYESNLYLSYNYYTWAELAYLWY HLA-B4006,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B4007,YHTKYREIFTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4008,YHTKYRNIFTNTYESNLYLSYNYYTWAVLAYEWY HLA-B4009,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY HLA-B4010,YYAKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4011,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY HLA-B4012,YYSEYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4013,YHTKYREIFTNTYENIAYLSYNYYTWAVLAYEWY HLA-B4014,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY HLA-B4015,YHTKYREISTNTYESNLYLSYNYYTWAERAYEWY HLA-B4016,YHTKYREISTNTYESNLYLSYNYYTWAERAYEWY HLA-B4018,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY HLA-B4019,YHTKYREISTNTYENIAYLSYNYYTWAVLAYEWY HLA-B4020,YHTKYREISTNTYESNLYLRYDSYTWAVLAYEWY HLA-B4021,YYAMYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4023,YHTKYREISTNTYESNLYLRYNYYSWAERAYEWY HLA-B4024,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY HLA-B4025,YHTKYRNISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4026,YHTKYREISTNTYESNLYLRYNYYTWAELAYLWY HLA-B4027,YHTKYREISTNTYESNLYLSYNNYTWAVLAYEWY HLA-B4028,YHTKYREISTNTYESNLYIRYNYYTWAELAYLWH HLA-B4029,YHTKYPEISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B4030,YHTKYREISTNTYESNLYIVYNYYSLAVLAYEWY HLA-B4031,YHTKYREISTNTYESNLYLSYDYYSLAVLAYEWY HLA-B4032,YHTKYREISTNTYESNLYLSYDYYTWAERAYEWY HLA-B4033,YHTKYREISTNTYESNLYLRYDYYSLAVLAYEWY HLA-B4034,YHTKYREISTNTYESNLYIVYNYYSLAVLAYEWY HLA-B4035,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B4036,YHTKYREISTNTYESNLYLRYNFYSLAVLAYEWY HLA-B4037,YHTKYREISTNTYENNLYLSYNYYTWAVLAYEWY HLA-B4038,YHTKYREISTNTYESNLYLRYNSYSLAVLAYEWY HLA-B4039,YHTKYREISTNTYESNLYLSYNYYTWAVLAYTWY HLA-B4040,YYTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B4042,YHTKYREISTNTYESNLYLRYDYYSLAVLAYEWY HLA-B4043,YHTKYREISTNTDESNLYLRYNYYSLAVLAYEWY HLA-B4044,YHTKYREISTNTYESNLYWTYDYYTWAVLAYEWY HLA-B4045,YHTKYREISTNTYESNLYLSYNYYSWAVLAYEWY HLA-B4046,YHTEYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4047,YHTKYREISTNTYENTAYLRYNYYSLAVLAYEWY HLA-B4048,YHTKYREISTNTYESNLYLRYNLYSLAVLAYEWY HLA-B4049,YYTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4050,YHTKYREISTNTDESNLYLSYNYYTWAVLAYEWY HLA-B4051,YHTKYREISTNTYESNLYLRYNYYSWAELAYTWH HLA-B4052,YHTKYREISTNTYESNLYLRYDSYSLAVLAYEWY HLA-B4053,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B4054,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4055,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4056,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B4057,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B4058,YYAKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B4059,YHTKYREISTNTYESNLYIRYDSYSLAVLAYEWY HLA-B4060,YHTKYREISTNTYESNLYLRSDSYSLAVLAYEWY HLA-B4061,YHTKYREIYTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4062,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4063,YHTKYREISTNTYESNLYLRYNYYSLAVLAYLWY HLA-B4064,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B4065,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4066,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4067,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4068,YHTKYRNIFTNTYESNLYIRYNYYTWAVLAYEWY HLA-B4069,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4070,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B4071,YHTKYREISTNTYESNLYLSYNLYTWAVLAYLWY HLA-B4072,YHTKYREISTNTYESNLYLRYNYYTLAVLAYEWY HLA-B4073,YHTKYREISTNTYVSNLYLRYNYYSLAVLAYEWY HLA-B4074,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4075,YHTKYREICTNTYESNLYWTYNYYTWAVLAYEWY HLA-B4076,YHTKYREISTNTYESKLYLRYNYYSLAVLAYEWY HLA-B4077,YHTKYREISTNTYESNLYLRYNFYTLAVLAYEWY HLA-B40:01,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:02,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:03,YHTKYREISTNTYESNLYLSYDSYTWAVLAYEWY HLA-B40:04,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B40:05,YHTKYREISTNTYESNLYLSYNYYTWAELAYLWY HLA-B40:06,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:07,YHTKYREIFTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:08,YHTKYRNIFTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:09,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY HLA-B40:10,YYAKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:100,YHTKYREISTNTYESNLYLRFNYYSLAVLAYEWY HLA-B40:101,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:102,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:103,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:104,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:105,YHTKYREISTNTYESNLYLSYNSYTWAVLAYEWY HLA-B40:106,YHTKYRNIFTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:107,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:108,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:109,YHTKYREISTNTYESIAYWTYNYYTWAVLAYEWY HLA-B40:11,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY HLA-B40:110,YYTKYREISTNTYENTAYWTYNYYTWAVLAYEWY HLA-B40:111,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:112,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:113,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWH HLA-B40:114,YHTKYREISTNTYESNLYLRYNYYSWAVLAYEWY HLA-B40:115,YHTKYWEISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:116,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:117,YHTKYREISTNTYENIAYLRYNYYSLAVLAYEWY HLA-B40:119,YHTKYREISTNTYDSNLYLSYNYYTWAVLAYEWY HLA-B40:12,YYSEYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:120,YHTKYREISTNTYESNLYIRYDYYTWAVLAYEWY HLA-B40:121,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY HLA-B40:122,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:123,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:124,YHTKYREISTNTYESNLYLRYHDYSLAVLAYEWY HLA-B40:125,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:126,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:127,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:128,YHTKYREISTNTYESNLYLRYNYYSLAVRAYEWY HLA-B40:129,YYTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B40:13,YHTKYREIFTNTYENIAYLSYNYYTWAVLAYEWY HLA-B40:130,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:131,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:132,YHTKYREISTNTYESNLYLRYNYYSLAVLAYESY HLA-B40:134,YHTKYREISTNIYESNLYLRYNYYSLAVLAYEWY HLA-B40:135,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:136,YHTKYREISTNTYESNLYLRYNYYTWAVDAYEWY HLA-B40:137,YYAMYREISTNTYESNLYIRYNYYSLAVLAYEWY HLA-B40:138,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:139,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:14,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY HLA-B40:140,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:141,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:143,YHTKYREISTNTYESNLYLSFNYYTWAVLAYEWY HLA-B40:145,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:146,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:147,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:148,YHTKYREISTNTYESNLYWTYNYYTWAELAYEWY HLA-B40:149,YHSKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:15,YHTKYREISTNTYESNLYLSYNYYTWAERAYEWY HLA-B40:150,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:151,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:152,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:153,YHTKYREISTNTYESNLYLRYNYYSLTVLAYEWY HLA-B40:154,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:155,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:156,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:157,YHTKYREISTNTYENTAYLSYNYYTWAVLAYEWY HLA-B40:158,YHTKYREISTNTYESNLYLRYNSYTWAELAYEWY HLA-B40:159,YHTKYREISTNTYESNLYWTYDSYTWAVLAYEWY HLA-B40:16,YHTKYREISTNTYESNLYLSYNYYTWAERAYEWY HLA-B40:160,YHTKYREISTNTYESNLYIRYNYYSLAVLAYEWY HLA-B40:161,YHTKYREISTNTYESNLYWTYNYYTWAERAYEWY HLA-B40:162,YHTKYREIFTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:163,YHTKYREISTNTYESNLYLRYNYYSLAVLAYTWH HLA-B40:164,YYTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:165,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:166,YHTKYRNIYAQTDESNLYLRYNYYSLAVLAYEWY HLA-B40:167,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:168,YHTKYREISTNTYESNLSLRYNYYSLAVLAYEWY HLA-B40:169,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:170,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:171,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:172,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:173,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:174,YHTKYREISTNTYESNLYLSYNYYTWAELAYLWH HLA-B40:175,YHTKYREISTNTYESNLCLRYNYYSLAVLAYEWY HLA-B40:176,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:177,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:178,YHTKYREISTNTYESNLYLRYNYYSLAVLAYESY HLA-B40:179,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:18,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY HLA-B40:180,YHTKYREISTNTYESNLYLSYHDYTWAVLAYEWY HLA-B40:181,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:182,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:183,YHTKYREISTNTYESNLYLRYNYYSLAELAYEWY HLA-B40:184,YHTKYREISTNTYESNLYLRYNFYTWAVLTYTWY HLA-B40:185,YHTTYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:186,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:187,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:188,YHTKYREISTNTYEDTLYLRYNYYSLAVLAYEWY HLA-B40:189,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:19,YHTKYREISTNTYENIAYLSYNYYTWAVLAYEWY HLA-B40:190,YHTKYREISTNTYESNLHWTYNYYTWAVLAYEWY HLA-B40:191,CHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:192,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:193,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:194,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:195,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:196,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:197,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:198,YHTKYREISTNTYESNLYLRYNYYSLAERAYEWY HLA-B40:199,YHTKYREISTNTYESNLYLRYNYYSLAVLAYTWY HLA-B40:20,YHTKYREISTNTYESNLYLRYDSYTWAVLAYEWY HLA-B40:200,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:201,YHTKYREISTNTYESTAYLSYNYYTWAVLAYEWY HLA-B40:202,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:203,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:204,YHTKYREVSTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:205,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:206,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:207,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:208,YHTRYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:209,YHTTYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:21,YYAMYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:210,YYTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:211,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:212,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:213,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:214,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:215,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:217,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:218,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:219,YYTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:220,YHTKYREIFTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:221,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:222,YHTKYREISTNTYESNLYLRYNSYSLAVLAYEWY HLA-B40:223,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:224,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:225,YHTKYREISTNTYESNLYLNYNYYTWAVLAYEWY HLA-B40:226,YHTKYREISTKTYESNLYLSYNYYTWAVLAYEWY HLA-B40:227,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:228,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:229,YYTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:23,YHTKYREISTNTYESNLYLRYNYYSWAERAYEWY HLA-B40:230,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:231,YHTKYREISTNTYESNLYLRYNYYSWAVDAYEWY HLA-B40:232,YHTKYRNIFTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:233,YHTKYREISTNTYESNLYFRYNYYSLAVLAYEWY HLA-B40:234,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:235,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:236,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:237,YHTKYREISTNTYESNLYLRYNYYTLAVLAYEWY HLA-B40:238,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:239,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:24,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY HLA-B40:240,YHTKYREISTNTYESNLYLRYNDYSLAVLAYEWY HLA-B40:241,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:242,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:243,YHTKYREISTNTYESNLYLWCNYYTWAVLAYEWY HLA-B40:244,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:245,YHTKYREISTNTYESNLYLRSNYYSLAVLAYEWY HLA-B40:246,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:247,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:248,YHAKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:249,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:25,YHTKYRNISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:250,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:251,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:252,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:253,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:254,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:255,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:257,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:258,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:259,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:26,YHTKYREISTNTYESNLYLRYNYYTWAELAYLWY HLA-B40:260,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:261,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:262,YHTKYREISTNTYESNLYLRYNYYSLALLAYEWY HLA-B40:264,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:266,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:267,YHTKYREISTNTYESNLYLSYDSYTWAVLAYEWY HLA-B40:268,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:269,YHTKYREISTNTYESNLYWTYNYYTWAVLAYECY HLA-B40:27,YHTKYREISTNTYESNLYLSYNNYTWAVLAYEWY HLA-B40:270,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:271,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:272,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:273,YHIKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:274,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:275,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:276,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:277,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:278,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:279,YHTKYREISTNTYESNLYLRYNYYSLAVDAYEWY HLA-B40:28,YHTKYREISTNTYESNLYIRYNYYTWAELAYLWH HLA-B40:280,YHTKYREISTNTYESNLYLRYNFYSLAVLAYEWY HLA-B40:281,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:282,YHAKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:283,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:284,YHTKYREISTNTYESNLYLSYDSYTWAVLAYEWY HLA-B40:285,YHTKYREISTNTYESNLYLRYNYYSVAVLAYEWY HLA-B40:287,YHTKYREISTNTYESNLYLSYNYYTLAVLAYEWY HLA-B40:288,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:289,YHTKYREISTNTYESNLHLSYNYYTWAVLAYEWY HLA-B40:29,YHTKYPEISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:290,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:292,YHTKYREISTNTYESIAYLSYNYYTWAVLAYEWY HLA-B40:293,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:294,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:295,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:296,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:297,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:298,YHTKYREISTNTYESNLYWTYNYYSLAVLAYEWY HLA-B40:299,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:30,YHTKYREISTNTYESNLYIVYNYYSLAVLAYEWY HLA-B40:300,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:301,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:302,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:303,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:304,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:305,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:306,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:307,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:308,YHTTYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:309,YHTKYREISTNTYESNLYLSYNYYTWAELAYEWY HLA-B40:31,YHTKYREISTNTYESNLYLSYDYYSLAVLAYEWY HLA-B40:310,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:311,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:312,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:313,YHTKYRNISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:314,YHTKYREISTNTYESNLYLSYNFYTWAVLAYEWY HLA-B40:315,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:316,YHTKYREISTNTYESNLYLTYNYYSLAVLAYEWY HLA-B40:317,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:318,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:319,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:32,YHTKYREISTNTYESNLYLSYDYYTWAERAYEWY HLA-B40:320,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:321,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:322,YHTKYREICTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:323,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:324,YHTKYREISTNTYESNLYLRYNYYSLAVWAYLWY HLA-B40:325,YYAKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:326,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:327,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:328,YDTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:329,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:33,YHTKYREISTNTYESNLYLRYDYYSLAVLAYEWY HLA-B40:330,YHTKYREISTNTYESNLYWTYNFYTWAVLAYEWY HLA-B40:331,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:332,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:333,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:334,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:335,YHTKYREISTNTYESHLYLSYNYYTWAVLAYEWY HLA-B40:336,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:339,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:34,YHTKYREISTNTYESNLYIVYNYYSLAVLAYEWY HLA-B40:340,YHTKYREISTNTYENIAYWTYNYYTWAVLAYEWY HLA-B40:341,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:342,YYTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:343,YHTKYREISTNTYESNLYIRYNYYTWAVLAYLWY HLA-B40:344,YHTKYREISTNTYERNLYLRYNYYSLAVLAYEWY HLA-B40:346,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:347,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:348,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:349,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:35,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:350,YHTTYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:351,YHAKYREISTNTYESNLYLRYNYYTWAVLAYEWY HLA-B40:352,YHTKYREISTNTYESNLYLRYDSYSLAVLAYEWY HLA-B40:353,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:354,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:355,YHTKYREISTNTYESNLYLRYNYYSWAELAYEWY HLA-B40:356,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:357,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:358,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:359,YHTKYREISTNTYESNLYLSYNYYTWVVLAYEWY HLA-B40:36,YHTKYREISTNTYESNLYLRYNFYSLAVLAYEWY HLA-B40:360,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:362,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:363,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:364,YHAKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:365,YYATYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:366,YHTKYREISTNTYESNLYWRYNYYTWAVLAYEWY HLA-B40:367,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:368,YHTKYREISTNTYESNLYLRYNFYSLAVLAYEWY HLA-B40:369,YHTKYREIPTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:37,YHTKYREISTNTYENNLYLSYNYYTWAVLAYEWY HLA-B40:370,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:371,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:373,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:374,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:375,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:376,YHTKYREISTNTYESNLYWTYNYYTWAALAYEWY HLA-B40:377,YHTKYREISTNTYESNLYLRYNLYSLAVLAYEWY HLA-B40:378,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:379,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:38,YHTKYREISTNTYESNLYLRYNSYSLAVLAYEWY HLA-B40:380,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:381,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:382,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:383,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:384,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:385,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:386,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:387,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:388,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:389,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:39,YHTKYREISTNTYESNLYLSYNYYTWAVLAYTWY HLA-B40:390,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:391,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:392,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:393,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:394,YHTKYREISTNTYESIAYLRYNYYSLAVLAYEWY HLA-B40:395,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:396,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:397,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:398,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:40,YYTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:400,YHTKYREISTNTYESNQYLRYNYYSLAVLAYEWY HLA-B40:401,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:402,YHTKYREISTNTYESNLYLRYNYYSLAVLAYECY HLA-B40:403,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:404,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:406,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:407,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:408,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:409,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:410,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:411,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:412,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:413,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:414,YHTKYREISTNTYESNLYLSYDDYTWAVLAYEWY HLA-B40:42,YHTKYREISTNTYESNLYLRYDYYSLAVLAYEWY HLA-B40:43,YHTKYREISTNTDESNLYLRYNYYSLAVLAYEWY HLA-B40:44,YHTKYREISTNTYESNLYWTYDYYTWAVLAYEWY HLA-B40:45,YHTKYREISTNTYESNLYLSYNYYSWAVLAYEWY HLA-B40:46,YHTEYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:47,YHTKYREISTNTYENTAYLRYNYYSLAVLAYEWY HLA-B40:48,YHTKYREISTNTYESNLYLRYNLYSLAVLAYEWY HLA-B40:49,YYTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:50,YHTKYREISTNTDESNLYLSYNYYTWAVLAYEWY HLA-B40:51,YHTKYREISTNTYESNLYLRYNYYSWAELAYTWH HLA-B40:52,YHTKYREISTNTYESNLYLRYDSYSLAVLAYEWY HLA-B40:53,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:54,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:55,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:56,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:57,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:58,YYAKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:59,YHTKYREISTNTYESNLYIRYDSYSLAVLAYEWY HLA-B40:60,YHTKYREISTNTYESNLYLRSDSYSLAVLAYEWY HLA-B40:61,YHTKYREIYTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:62,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:63,YHTKYREISTNTYESNLYLRYNYYSLAVLAYLWY HLA-B40:64,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B40:65,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:66,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:67,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:68,YHTKYRNIFTNTYESNLYIRYNYYTWAVLAYEWY HLA-B40:69,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:70,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:71,YHTKYREISTNTYESNLYLSYNLYTWAVLAYLWY HLA-B40:72,YHTKYREISTNTYESNLYLRYNYYTLAVLAYEWY HLA-B40:73,YHTKYREISTNTYVSNLYLRYNYYSLAVLAYEWY HLA-B40:74,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:75,YHTKYREICTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:76,YHTKYREISTNTYESKLYLRYNYYSLAVLAYEWY HLA-B40:77,YHTKYREISTNTYESNLYLRYNFYTLAVLAYEWY HLA-B40:78,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:79,YHTKYREISTNTYESNLHLRYNYYSLAVLAYEWY HLA-B40:80,YHTKYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B40:81,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:82,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:83,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:84,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:85,YHTKYREISTNTYESNLYLSYNYYIWAVLAYEWY HLA-B40:86,YHTKYREISTNTYESNLYWTYNFYTWAVLAYEWY HLA-B40:87,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:88,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B40:89,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:90,YHTKYREISTNTYESNLYLSYNYYTWAVLAHEWY HLA-B40:91,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:92,YHTKYREISTNTYESNLYLRYNYYSLAVLAYLWY HLA-B40:93,YHTEYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B40:94,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:95,YHTKYREISTNTYESNLYWTYNYYTWAELAYEWY HLA-B40:96,YHTKYREISTNTYENTAYWTYNYYTWAVLAYEWY HLA-B40:97,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B40:98,YHTKYREISTNTYESNLYLSYDYYTWAERAYEWY HLA-B40:99,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B4101,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B4102,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B4103,YHTKYREISTNTYESNLYLRYNYYTWAVDAYTWY HLA-B4104,YHTKYREISTNTYESNLYLSYDYYTWAVDAYTWY HLA-B4105,YHTKYREISTNTYESKLYWRYNYYTWAVDAYTWY HLA-B4106,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B4107,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B4108,YHTKYREISTNTYESNLYLRYNYYTWAVDAYTWY HLA-B41:01,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:02,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B41:03,YHTKYREISTNTYESNLYLRYNYYTWAVDAYTWY HLA-B41:04,YHTKYREISTNTYESNLYLSYDYYTWAVDAYTWY HLA-B41:05,YHTKYREISTNTYESKLYWRYNYYTWAVDAYTWY HLA-B41:06,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:07,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:08,YHTKYREISTNTYESNLYLRYNYYTWAVDAYTWY HLA-B41:09,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:10,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B41:11,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B41:12,YHAKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:13,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B41:14,YHTKYREISTNTYESNLHWRYNYYTWAVDAYTWY HLA-B41:15,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B41:16,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:17,YHTKYREISTNTYESNLYWRYNYYTWAVDAYLWY HLA-B41:18,YHTKYREISTNTYESNLYLSYDFYTWAVDAYTWY HLA-B41:19,YHTKYREISTNTYESNLYLSYNYYTWAVDAYEWY HLA-B41:20,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:21,YHTKYREISTNTYESNLYWRYDYYTWAVDAYTWY HLA-B41:22,YHSKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:23,YHTKYREISNNTYESNLYLSYNYYTWAVDAYTWY HLA-B41:24,YHTKYREISTNTYESNLYLSYNSYTWAVDAYTWY HLA-B41:25,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:26,YHTKYREISTNTYESNQYWRYNYYTWAVDAYTWY HLA-B41:27,YHTKYREISTNTDESNLYLSYNYYTWAVDAYTWY HLA-B41:28,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:29,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:30,YHTKYREISTNTYESNLYWRYNSYTWAVDAYTWY HLA-B41:31,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B41:32,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:33,YYTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:34,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:35,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:36,YHAKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B41:37,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:38,YHTKYREISTNTYESNLYLSYNYYTLAVDAYTWY HLA-B41:39,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B41:40,YHTKYREISTNTYESNLYLSYNYYTWAMDAYTWY HLA-B41:41,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B41:42,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B41:43,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B41:44,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:46,YHTKYREIFTNTYENIAYLSYNYYTWAVDAYTWY HLA-B41:47,YYTKYREISTNTDESNLYLSYNYYTWAVDAYTWY HLA-B41:48,YHTKYREISTNTYESNLYIRYNYYTWAVDAYTWY HLA-B41:49,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B41:50,YHTKYREISTNTYESNLYWRYNFYTWAVDAYTWY HLA-B41:51,YHTKYREISTNTYESNLYLSYDSYTWAVDAYTWY HLA-B41:52,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B41:53,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:54,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B41:55,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B41:56,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B4201,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B4202,YHSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B4204,YYSEYRNIYAQTDESNLYWTYNYYTWAVDAYTWY HLA-B4205,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B4206,YYSEYRNIYAQTDESNLYLSYNFYTWAVDAYTWY HLA-B4207,YYSEYRNIYTNTDESNLYLSYNYYTWAVDAYTWY HLA-B4208,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B4209,YHSEYRNIYAQTDESNLYLSYDSYTWAVDAYTWY HLA-B42:01,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B42:02,YHSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B42:04,YYSEYRNIYAQTDESNLYWTYNYYTWAVDAYTWY HLA-B42:05,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B42:06,YYSEYRNIYAQTDESNLYLSYNFYTWAVDAYTWY HLA-B42:07,YYSEYRNIYTNTDESNLYLSYNYYTWAVDAYTWY HLA-B42:08,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B42:09,YHSEYRNIYAQTDESNLYLSYDSYTWAVDAYTWY HLA-B42:10,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B42:11,YYSEYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B42:12,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B42:13,YYSEYRNIYAQTDESNLYIRYNYYTWAVDAYTWY HLA-B42:14,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B42:15,YYSEYRNIYAQTDENNLYLSYNYYTWAVDAYTWY HLA-B42:16,YYSEYRNIYAQTDESNLYLSYDYYTWAVDAYTWY HLA-B42:17,YHSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B42:18,YHSEYRNIYAQADESNLYLSYNYYTWAVDAYTWY HLA-B42:19,YYSEYRNIYAQTDESNLYLSYNYYTWAELAYTWY HLA-B42:20,YYSEYRNIYAQTDESNLYLSYNFYTWAVDAYTWY HLA-B42:21,YYAEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B42:22,YYSEYRNIYAQTDESKLYLSYNYYTWAVDAYTWY HLA-B42:23,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B42:24,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B42:25,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B4402,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B4403,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B4404,YYTKYREISTNTYENTAYIRYDDYTWAVRAYTSY HLA-B4405,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B4406,YYATYRNIFTNTYENIAYIRYDDYTWAVDAYLSY HLA-B4407,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B4408,YYTMYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B4409,YYTKYREISTNTYESNLYIRYDDYTWAVDAYLSY HLA-B4410,YYTKYREISTNTYENTAYIRFNLYTWAVLAYLSY HLA-B4411,YYTKYREISTNTYENTPYIRYDDYTWAVDAYLSY HLA-B4412,YYTKYRNISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B4413,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B4414,YYTKYREISTNTYENTAYIRYNDYTWAVDAYLSY HLA-B4415,YHTKYREISTNTYESTAYWRYNLYTWAVDAYLSY HLA-B4416,YYTKYREISTNTYENTAYIRYDDYTWAVDAYEWY HLA-B4417,YYTKYREISTNTYENTAYIRYDSYTWAVDAYLSY HLA-B4418,YHTKYREISTNTYENIAYWRYNLYTWAVDAYLSY HLA-B4420,YYTKYREISTNTYENTAYWTYDDYTWAVDAYLSY HLA-B4421,YYTKYREISTNTYENTAYIRYDDYTWAVDAYESY HLA-B4422,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B4424,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B4425,YYTKYREISTNTYENIAYIRYDYYTWAVDAYLSY HLA-B4426,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B4427,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B4428,YYTKYREISTNTYENTAYIRYDDYTWAVRAYLSY HLA-B4429,YYTKYREISTNTYENTAYIRYDDYTWAVLTYLSY HLA-B4430,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B4431,YYTKYREISTNTYENTAYLRYNYYSLAVLAYESY HLA-B4432,YYTKYPEISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B4433,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B4434,YYAKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B4435,YYTKYREISTNTYENTAYIRYDDYTWAVEAYLSY HLA-B4436,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B4437,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLWY HLA-B4438,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B4439,YYPKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B4440,YYTEYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B4441,YYTKYREISTNTYENTAYLRYDDYTWAVDAYLSY HLA-B4442,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLWY HLA-B4443,YYTKYREISTNTYENTAYIRYDSYTWAVLAYLSY HLA-B4444,YYTEYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B4445,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B4446,YYTKYREISTNTYESNLYIRYDDYTWAVLAYLSY HLA-B4447,YYTKYREISTNTYENTAYWTYDDYTWAVLAYLSY HLA-B4448,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B4449,YDTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B4450,YYTKYREISTNTYENIAYIRYDDYTWAVLAYLSY HLA-B4451,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B4453,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B4454,YYTKYREISTNTYENTAYLSYDDYTWAVLAYLSY HLA-B44:02,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:03,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:04,YYTKYREISTNTYENTAYIRYDDYTWAVRAYTSY HLA-B44:05,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B44:06,YYATYRNIFTNTYENIAYIRYDDYTWAVDAYLSY HLA-B44:07,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:08,YYTMYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:09,YYTKYREISTNTYESNLYIRYDDYTWAVDAYLSY HLA-B44:10,YYTKYREISTNTYENTAYIRFNLYTWAVLAYLSY HLA-B44:100,YYTKYREISTNTYENTAYWRYDDYTWAVDAYLSY HLA-B44:101,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:102,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:103,YHTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:104,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:105,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:106,YYTKYREISTNTYENTAYLSYDDYTWAVDAYLSY HLA-B44:107,YYTKYREISTNTYENTAYIRYDYYTWAVLAYLSY HLA-B44:109,YYTKYREISTNTYESTAYIRYDDYTWAVLAYLSY HLA-B44:11,YYTKYREISTNTYENTPYIRYDDYTWAVDAYLSY HLA-B44:110,YYTKYREISTNTYENTAYISYDDYTWAVLAYLSY HLA-B44:111,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:112,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:113,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:114,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:115,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:116,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:117,YYTKYREISTNTYENTAYIRYDFYTWAVDAYLSY HLA-B44:118,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:119,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:12,YYTKYRNISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:120,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:121,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:122,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:123,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B44:124,YYTKYREISTNTYENTAYIRYDDYTWAVLAYESY HLA-B44:125,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:126,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:127,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:128,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:129,YYTKYREISTNTYESNLYIRYDDYTWAVLAYLSY HLA-B44:13,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:130,YYSEYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:131,YHTKYREISTNTYESNLYIRYDDYTWAVDAYLSY HLA-B44:132,YYTKYREISTNTYENTAYIRYDDYTWAVDAYTWY HLA-B44:133,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:134,YYTTYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B44:135,YYTKYREISTNTYENTAYLSYDDYTWAVLAYLSY HLA-B44:136,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B44:137,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:139,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B44:14,YYTKYREISTNTYENTAYIRYNDYTWAVDAYLSY HLA-B44:140,YYTKYREISTNTYENTAYIRYNLYTWAVDAYLSY HLA-B44:141,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:142,YYTKYREISTNTYENTAYIRYDDYTWAVDACLSY HLA-B44:143,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:144,YYTKYREISTNTYENTAYIRYDSYTWAVLAYLSY HLA-B44:145,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:146,YYTKYREISTNTYENTAYIRYDDYTWAEWAYLSY HLA-B44:147,YYTKYREISTNTYENTAYIRYDDYTWAVLAHLSY HLA-B44:148,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:15,YHTKYREISTNTYESTAYWRYNLYTWAVDAYLSY HLA-B44:150,YYTKYREISTNTYENTAYIRYDDYTWAERAYEWY HLA-B44:151,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:152,YYTKYREISTNTYENTTYIRYDDYTWAVDAYLSY HLA-B44:153,YYTKYREISTNTYENTAYIVYDDYTWAVLAYLSY HLA-B44:154,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:155,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:156,YDSEYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:157,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:158,YYTKYREISTNTYENTAYLSYDYYTWAVDAYLSY HLA-B44:159,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:16,YYTKYREISTNTYENTAYIRYDDYTWAVDAYEWY HLA-B44:161,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:162,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:163,YYTKYREISTNTYENTAYIRYDDYTWAVLAYTSY HLA-B44:164,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:165,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:166,YYTKYREISTNTYENTAYLSYNYYTWAVDAYTWY HLA-B44:167,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:168,YYAKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:169,YYTKYREISTNTYENTAYIRYDDYSWAVDAYLSY HLA-B44:17,YYTKYREISTNTYENTAYIRYDSYTWAVDAYLSY HLA-B44:170,YYTKYREISTNTYENAAYIRYDDYTWAVDAYLSY HLA-B44:172,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:173,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:174,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:175,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:176,YYTKYREISTNTYESTAYIRYDDYTWAVDAYLSY HLA-B44:177,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:178,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:179,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:18,YHTKYREISTNTYENIAYWRYNLYTWAVDAYLSY HLA-B44:180,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:181,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:182,YYTKYREISTNTYENTAYIRYDDYSWAVLAYLSY HLA-B44:183,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:184,YYTKYREISTNTYENTAYLSYNYYTWAVLAYLSY HLA-B44:185,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:186,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:187,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:188,YHTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:189,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:190,YYTKYREISTNTYENTAYIRYDDYTWAVDAYTWH HLA-B44:191,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:192,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:193,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:194,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:196,YYTKYREISTNTYENTGYIRYDDYTWAVDAYLSY HLA-B44:197,YYTKYREISTNTYENTAYWRYDDYTWAVLAYLSY HLA-B44:199,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:20,YYTKYREISTNTYENTAYWTYDDYTWAVDAYLSY HLA-B44:200,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:201,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:202,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:203,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSH HLA-B44:204,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:205,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:206,YYTKYREISTNTDENTAYIRYDDYTWAVDAYLSY HLA-B44:207,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:208,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:209,YYTKYREISTNTYENTAYIRSDDYTWAVLAYLSY HLA-B44:21,YYTKYREISTNTYENTAYIRYDDYTWAVDAYESY HLA-B44:210,YYTEYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:211,YYTKYREISTNTYENTAYISYDDYTWAVDAYLSY HLA-B44:212,YHTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:213,YYTKYREISTNTYENTAYLSYNYYTWAVDAYLSY HLA-B44:214,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:215,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:216,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:218,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:219,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:22,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:220,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:221,YYSKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:222,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:223,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:224,YYSKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:225,YYAKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:226,YYTKYREISTNTYENTAYIRYDLYTWAVDAYLSY HLA-B44:227,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:228,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:229,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:230,YYTKYREISTNTYENTAYLRYDSYTWAVDAYLSY HLA-B44:231,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:232,YYTKYRNIFTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:233,YYTKYREISTNTYENTAYIRYDDYNWAVLAYLSY HLA-B44:234,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLLY HLA-B44:235,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:236,YYTKYREISTNTYENTAYLRYDYYTWAVDAYLSY HLA-B44:238,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:239,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:24,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:240,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:241,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:242,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:243,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:244,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:245,YYAKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:247,YYTKYREISTNTYENTAYIRYDDYTLAALAYLSY HLA-B44:248,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:249,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:25,YYTKYREISTNTYENIAYIRYDYYTWAVDAYLSY HLA-B44:250,YYTKYREISTNTYENTAYIRYDYYTWAVLAYLSY HLA-B44:251,YYTKYREISTNTYENTAYIRYDFYTWAVLAYLSY HLA-B44:252,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:253,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:254,YYTKYREISTNTYENNLYIRYDDYTWAVDAYLSY HLA-B44:255,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:256,YYTKYREISTNTYENTAYIRYDSYTWAVLAYLSY HLA-B44:257,YYTKYREISTNTYEDTLYIRYDDYTWAVDAYLSY HLA-B44:258,YYSKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:259,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:26,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:260,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:261,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:262,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:263,YYTKYRNICTNTYENTAYIRYDYYTWAVDAYLSY HLA-B44:264,YYTKYREISTNTYENTAYMRYDYYTWAVDAYLSY HLA-B44:265,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:266,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:268,YYTKYREISTNTYENTAYIRYDDYTWAVLAYTWY HLA-B44:269,YYAKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:27,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:270,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:271,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:272,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:273,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:274,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:275,YYTKYREISTNTYENTAYIRYDDYTWAVWAYLWH HLA-B44:276,YYTKYREISTNTYENTAYIRYDSYTWAVLAYLWY HLA-B44:277,YYTKYREISTNTDESNLYIRYDDYTWAVLAYLSY HLA-B44:278,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:279,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:28,YYTKYREISTNTYENTAYIRYDDYTWAVRAYLSY HLA-B44:280,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:281,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:282,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:283,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:284,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:285,YYTKYREISTNTYENTAYIRYDDYTWAVLTYLSY HLA-B44:286,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:287,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:288,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B44:289,YYTKYREISTNTYENTAYIRYDDYTWVVDAYLSY HLA-B44:29,YYTKYREISTNTYENTAYIRYDDYTWAVLTYLSY HLA-B44:290,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLWH HLA-B44:291,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:292,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:293,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:294,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:295,YYTKYREISTNTYENTAYIRYDDYTWAALAYLSY HLA-B44:296,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:297,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:298,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:299,YYTKYREISTNTYENTAYIRYDDYTWAVWAYLSY HLA-B44:30,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:300,YYTKYREISTNTYKNTAYIRYDDYTWAVLAYLSY HLA-B44:301,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:302,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:304,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:305,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:307,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:308,YYTKYREISTNTYENTAYIRYDSYTWAVDAYLSY HLA-B44:31,YYTKYREISTNTYENTAYLRYNYYSLAVLAYESY HLA-B44:311,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:312,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:313,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:315,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:316,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:317,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:318,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSC HLA-B44:319,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:32,YYTKYPEISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:320,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:321,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:322,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:323,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:324,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:325,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:326,YYTKYPEISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:327,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:329,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:33,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:330,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B44:331,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:332,YYTKYRELSTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:34,YYAKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:35,YYTKYREISTNTYENTAYIRYDDYTWAVEAYLSY HLA-B44:36,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:37,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLWY HLA-B44:38,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:39,YYPKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:40,YYTEYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:41,YYTKYREISTNTYENTAYLRYDDYTWAVDAYLSY HLA-B44:42,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLWY HLA-B44:43,YYTKYREISTNTYENTAYIRYDSYTWAVLAYLSY HLA-B44:44,YYTEYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:45,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:46,YYTKYREISTNTYESNLYIRYDDYTWAVLAYLSY HLA-B44:47,YYTKYREISTNTYENTAYWTYDDYTWAVLAYLSY HLA-B44:48,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:49,YDTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:50,YYTKYREISTNTYENIAYIRYDDYTWAVLAYLSY HLA-B44:51,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:53,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:54,YYTKYREISTNTYENTAYLSYDDYTWAVLAYLSY HLA-B44:55,YHTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:57,YYTMYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:59,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:60,YYTMYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:62,YYTKYREISTNTYENTAYIRYNYYTWAVDAYLSY HLA-B44:63,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:64,YYTKYREISTNTYENTAYIRYDDYTWAVLAYEWY HLA-B44:65,YYTKYREISTNTYENTAYLRYDDYTWAVLAYLSY HLA-B44:66,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:67,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:68,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:69,YYTKYWEISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:70,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B44:71,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:72,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:73,YYTKYREISTNTYENTAYIRYDDYTWAVDGYLSY HLA-B44:74,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:75,YYTKYREISTNTYENNLYIRYDYYTWAVDAYLSY HLA-B44:76,YYTKYREISTNTYENTAYIRYDDYTWAERAYLSY HLA-B44:77,YYTKYREISTNTYENTAYIRYNYYTWAVLAYLSY HLA-B44:78,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B44:79,YYTKYREISTNTYENTAYIRYDDYTWAELAYLSY HLA-B44:80,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:81,YYTNYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:82,YYTKYREISTNTYENTAYIRYNYYTWAVLAYLSY HLA-B44:83,YYATYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:84,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:85,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:86,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:87,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:88,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:89,YYTKYREISTNTYENTAYIRYDDYTWAVDTYLSY HLA-B44:90,YYTKYREIYAQTDESNLYIRYDDYTWAVDAYLSY HLA-B44:91,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLWY HLA-B44:92,YYTKYREISTNTYENTAYIRYDDYTWAMLAYLSY HLA-B44:93,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B44:94,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:95,YYTKYREISTNTYENIAYIRYDDYTWAVDAYLSY HLA-B44:96,YYTKYREISTNTYENTAYIGYDDYTWAVLAYLSY HLA-B44:97,YYTKYREICAKTDENTAYIRYDDYTWAVDAYLSY HLA-B44:98,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B44:99,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B4501,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B4502,YHTKYREISTNTYESNLYWRYNFYTWAVDAYLSY HLA-B4503,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B4504,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLWY HLA-B4505,YHTKYREISTNTYESNLYWRYNLYTWAVDVYLSY HLA-B4506,YHTKYREIYAQTDESNLYWRYNLYTWAVDAYLSY HLA-B4507,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B45:01,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B45:02,YHTKYREISTNTYESNLYWRYNFYTWAVDAYLSY HLA-B45:03,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B45:04,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLWY HLA-B45:05,YHTKYREISTNTYESNLYWRYNLYTWAVDVYLSY HLA-B45:06,YHTKYREIYAQTDESNLYWRYNLYTWAVDAYLSY HLA-B45:07,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B45:08,YHTKYREISTNTYESNLYWRYNLYTWAVDAYTWY HLA-B45:09,YHTKYREISTNTYESNLYWRYDSYTWAVDAYLSY HLA-B45:10,YHTKYREISTNTYESNLYWRYNLYTWAVDAYEWY HLA-B45:11,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B45:12,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B45:13,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B45:14,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B45:15,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B45:16,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B45:17,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B45:18,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B45:19,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B45:20,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B45:21,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B45:22,YHTTYRNISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B45:23,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B45:24,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B4601,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B4602,YYAMYREKYRQTGVSNLYLRYDSYTWAEWAYLWY HLA-B4603,YYAMYREKYRQTDVSNLYLRYDSYTWAERAYTWY HLA-B4604,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B4605,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B4606,YYAMYREKYRQTDVSNLYLRYDSYSLAVLAYEWY HLA-B4608,YYAMYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-B4609,YYAMYREKYRQTDVSNLYLRYDSYTWAVWAYLWY HLA-B4610,YYTMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B4611,YYAMYREKYRQTDVSNLYWTYNLYTWAVLAYLWY HLA-B46:01,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:02,YYAMYREKYRQTGVSNLYLRYDSYTWAEWAYLWY HLA-B46:03,YYAMYREKYRQTDVSNLYLRYDSYTWAERAYTWY HLA-B46:04,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:05,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:06,YYAMYREKYRQTDVSNLYLRYDSYSLAVLAYEWY HLA-B46:08,YYAMYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-B46:09,YYAMYREKYRQTDVSNLYLRYDSYTWAVWAYLWY HLA-B46:10,YYTMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:11,YYAMYREKYRQTDVSNLYWTYNLYTWAVLAYLWY HLA-B46:12,YYAMYREKYRQTDVSNLYLSYDSYTWAEWAYLWY HLA-B46:13,YYAMYREKYRQTDVSNLYLRYDSYTWAVLAYLWY HLA-B46:14,YHAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:16,YYAMYREKFRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:17,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLSY HLA-B46:18,YYAMYREKYRQTDVSNLYWTYNLYTWAVLAYTWY HLA-B46:19,YYAMYREKYRQTDVSNLYLRYDSYTWAVLTYLWY HLA-B46:20,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:21,YYAMYREKYRQTDVSNLYLRYDSYTWAVLAYTWY HLA-B46:22,YYAMYREKYRRTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:23,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:24,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:25,YYAMYREKYRQTDVSNLYLRYDSYTWAVLAYEWY HLA-B46:26,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:27,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:28,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:29,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYTWY HLA-B46:30,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYEWY HLA-B46:31,YYAMYREKHRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:32,YYAMYREKYRQTDVSNLYWTYDSYTWAEWAYLWY HLA-B46:33,YYAMYREKYRQTDVSNLYIRYDSYTWAVLAYLWY HLA-B46:34,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:35,YYAMYREKYRQTHVSNLYLRYDSYTWAEWAYLWY HLA-B46:36,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:37,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:38,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:39,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:40,YYATYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:42,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:43,YYAMYREKYRQTDVSNLYLRYDSYSLAVLAYLWY HLA-B46:44,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:45,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:46,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:47,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:48,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:49,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:50,YYAMYREKYRQTYVSNLYLRYDSYTWAEWAYLWY HLA-B46:52,YYAMYREKYRQTDVSNLHLRYDSYTWAEWAYLWY HLA-B46:53,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:54,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:56,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:57,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:58,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:59,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:60,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:61,YYAMYREKYRQTDVSNLYLRYNFYTWAEWAYLWY HLA-B46:62,YYAMYREKYRQTDVSNLYLRYDSYTWAERAYLWY HLA-B46:63,YYAMYREKYRQTDVSNLYLRYDSCTWAEWAYLWY HLA-B46:64,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:65,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:66,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:67,YYAMYREKYRQTDVSNLYIRYDSYTWAEWAYLWY HLA-B46:68,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:69,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:70,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:71,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:72,YYAMYREKYRQTDESNLYLRYDSYTWAEWAYLWY HLA-B46:73,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B46:74,YYAMYREKYRQTDVSNLYLRYNYYTWAEWAYLWY HLA-B46:75,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B4701,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYEWY HLA-B4702,YYTKYREISTNTYESNLYLRFHDYTWAVLAYEWY HLA-B4703,YYTKYREISTNTYESNLYLRFHDYTWAVLAYEWY HLA-B4704,YYTKYREISTNTYENTAYLNYHDYTWAVLAYEWY HLA-B4705,YYTKYREISTNTYEDTLYLNYHDYTWAVLAYEWY HLA-B47:01,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYEWY HLA-B47:02,YYTKYREISTNTYESNLYLRFHDYTWAVLAYEWY HLA-B47:03,YYTKYREISTNTYESNLYLRFHDYTWAVLAYEWY HLA-B47:04,YYTKYREISTNTYENTAYLNYHDYTWAVLAYEWY HLA-B47:05,YYTKYREISTNTYEDTLYLNYHDYTWAVLAYEWY HLA-B47:06,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYEWY HLA-B47:07,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYEWY HLA-B47:08,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYTWY HLA-B47:09,YYTKYREISTNTYEDTLYLRFHDYTWAALAYEWY HLA-B47:10,YYTKYREISTNTYEDTLYLRFHDYTWAELAYEWY HLA-B4801,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B4802,YYSEYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B4803,YYSEYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B4804,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B4805,YYSEYREISTNTYESNLYLSYNYYTWAERAYEWY HLA-B4806,YYSEYRNIFTNTYESNLYLSYNYYSLAVLAYEWY HLA-B4807,YYSEYREISTNTYESNLYLSYNFYSLAVLAYEWY HLA-B4808,YYSEYREISTNTYESNLYLSYDYYTWAERAYEWY HLA-B4809,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B4810,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B4811,YYSEYREISTNTYESNLYLSYNYYSLAVLAYELY HLA-B4812,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B4813,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B4814,YYSEYREISTNTYESNLYLSYNSYTLAVLAYEWY HLA-B4815,YYSEYREISTNTYESNLYLSYNYYSLAELAYEWY HLA-B4816,YYSEYRVISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B4817,YYSEYREISTNTYESNLYIRYNFYSLAVLAYEWY HLA-B4818,YYSEYREISTNTYESIAYLSYNYYSLAVLAYEWY HLA-B48:01,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:02,YYSEYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B48:03,YYSEYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B48:04,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:05,YYSEYREISTNTYESNLYLSYNYYTWAERAYEWY HLA-B48:06,YYSEYRNIFTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:07,YYSEYREISTNTYESNLYLSYNFYSLAVLAYEWY HLA-B48:08,YYSEYREISTNTYESNLYLSYDYYTWAERAYEWY HLA-B48:09,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:10,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B48:11,YYSEYREISTNTYESNLYLSYNYYSLAVLAYELY HLA-B48:12,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B48:13,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B48:14,YYSEYREISTNTYESNLYLSYNSYTLAVLAYEWY HLA-B48:15,YYSEYREISTNTYESNLYLSYNYYSLAELAYEWY HLA-B48:16,YYSEYRVISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:17,YYSEYREISTNTYESNLYIRYNFYSLAVLAYEWY HLA-B48:18,YYSEYREISTNTYESIAYLSYNYYSLAVLAYEWY HLA-B48:19,YYSEYREISTNTYESNLYLSYNYYSLAVWAYEWY HLA-B48:20,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:21,YYSEYREISTNTYESNLYLNYNYYSLAVLAYEWY HLA-B48:22,YHSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:23,YYSEYREISTNTYESNLYLRYDSYSLAVLAYEWY HLA-B48:24,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:25,YYSEYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B48:26,YYSEYREISTNTYESNLYLNYHDYSLAVLAYEWY HLA-B48:27,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:28,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:29,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:30,YHSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:31,YYSEYREIFTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:32,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:33,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:34,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:35,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:36,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:37,YYSEYREISTNTYESNLYLSYNYYSLAVLAYTWY HLA-B48:38,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:39,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:40,YYSEYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B48:41,YYSKYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:42,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:43,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:44,YYSEYREISTNTYESNLYLSYNYYSWAVLAYEWY HLA-B48:45,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:46,YYSEYREISTNTYESNLYLSYDYYSLAVLAYEWY HLA-B48:47,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B48:48,YYSEYREISTNTDESNLYLSYNYYSLAVLAYEWY HLA-B4901,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B4902,YHTKYREISTNTYENTAYWRYNLYTWAELAYLWY HLA-B4903,YHATYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B4904,YHTKYREISTNTYENIAYWRYDSYTWAELAYLWY HLA-B4905,YHTKYREISTNTYENIAYWRYDSYTWAELAYLWY HLA-B49:01,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:02,YHTKYREISTNTYENTAYWRYNLYTWAELAYLWY HLA-B49:03,YHATYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:04,YHTKYREISTNTYENIAYWRYDSYTWAELAYLWY HLA-B49:05,YHTKYREISTNTYENIAYWRYDSYTWAELAYLWY HLA-B49:06,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:07,YHTKYREISTNTYENIAYWRYNLYTWAELAYEWY HLA-B49:08,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:09,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWH HLA-B49:10,YYTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:11,YHTKYREISTNTYENIAYWRYNLYTWAVLAYLWY HLA-B49:12,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:13,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:14,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:16,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:17,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:18,YHTKYREISTNTYENIAYWRYNYYTWAELAYLWY HLA-B49:20,YHTKYREISTNTYENIAYWRYNLYTWAELAYLSY HLA-B49:21,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:22,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:23,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:24,YYTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:25,YDSKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:26,YHTEYRNICTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:27,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:28,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:29,YHTKYREISTNTYENIAYWRYNLYTLAELAYLWY HLA-B49:30,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:31,YYTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:32,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:33,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:34,YHTKYREVSTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:35,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:36,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:37,YHTKYREISTNTYENIAYWRYNLYTWAELDYLWY HLA-B49:38,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:39,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:40,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:41,YHTKYREISTNTYENIAYWRYNLYTWAERAYLWY HLA-B49:42,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:43,YHTKYREISTNTYENIAYWMYNLYTWAELAYLWY HLA-B49:44,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:45,YHTKYREISTNTYENIAYWRYNLYTWAALAYLWY HLA-B49:46,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:47,YHTKYREISTNTYENIAYLRYNLYTWAELAYLWY HLA-B49:48,YHAKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:49,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:50,YHTKYREISTNTYENIAYWRYNFYTWAELAYLWY HLA-B49:51,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:52,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:53,YHTKYREIPTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:54,YHTKYREISTNTYENIAYWTYNLYTWAELAYLWY HLA-B49:55,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:56,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:57,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:58,YHNKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B49:59,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B5001,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B5002,YHTKYREISTNTYESNLYWRYNLYTWAELAYLSY HLA-B5004,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:01,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:02,YHTKYREISTNTYESNLYWRYNLYTWAELAYLSY HLA-B50:04,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:05,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:06,YHTRYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:07,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:08,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:09,YHTKYREISTNTYESNLYWRYNFYTWAELAYLWY HLA-B50:10,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:11,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:12,YHTKYREISTNTYESNLYGRYNLYTWAELAYLWY HLA-B50:13,YYTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:14,YHTKYREISTNTYESNLYWRYNYYTWAELAYLWY HLA-B50:15,YHTKYRNISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:16,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:17,YHTKYREISTNTYESNLYIRYNLYTWAELAYLWY HLA-B50:18,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:19,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:20,YHTKYREISTNTYESNLYWRFHDYTWAELAYLWY HLA-B50:31,YHTKYREISTNTYESNLYWRYNLYTWAELAYEWY HLA-B50:32,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:33,YHTKYREISTNTYESNLYWRYDSYTWAELAYLWY HLA-B50:34,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:35,YHTKYREISTNTYESNLYWRYNLYTWAELAYLRY HLA-B50:36,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:37,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:38,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:39,YHTKYREISTNTYESNLYWRYDLYTWAELAYLWY HLA-B50:40,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:41,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:42,YHTKYREISTNTYESNLYWRYNLHTWAELAYLWY HLA-B50:43,YYTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:44,YHTKYREISTNTYESNLYWRYNLYTRAELAYLWY HLA-B50:45,YHTKYREISTNTYESNLYWRYNLYTWAELAYTWY HLA-B50:46,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:47,YHTKYREISTNTYESNLYWRYNLYTWAEWAYLWY HLA-B50:48,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:49,YHTKYREISTNTYESNLYWRYNLYTWAVLTYTWY HLA-B50:50,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:51,YHTKYREISTNTYESNLYLWYNLYTWAELAYLWY HLA-B50:52,YHTKYREISTNTDESNLYWRYNLYTWAELAYLWY HLA-B50:53,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:54,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:55,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:56,YHTKYREISTNTYESNLYWRYNLYTWAELAYLSY HLA-B50:57,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:58,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWH HLA-B50:59,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:60,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B50:61,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B5101,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B5102,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWY HLA-B5103,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLGH HLA-B5104,YYATYRNIFTNTYENIAYIRYNYYTWAELAYLWH HLA-B5105,YYATYRNIFTNTYENIAYWTYNYYTWAVRAYLWY HLA-B5106,YYATYRNIFTNTYENIAYLRYNYYTWAELAYLWH HLA-B5107,YYATYRNISTNTYENIAYWTYNYYTWAELAYLWH HLA-B5108,YYATYRNIFTNTYENIAYWTYNYYTWAVDAYLWH HLA-B5109,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWH HLA-B5111,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B5112,YYATYRNIFTNTYENIADWTYNYYTWAELAYLWH HLA-B5113,YYATYRNIFTNTYENIAYWTYNFYTWAELAYLWH HLA-B5114,YYATYRNIFTNTYENIAYWTYKYYTWAELAYLWH HLA-B5115,YYATYRNIFTNTYENIAYWTYNLYTWAVLAYLWY HLA-B5116,YYATYRNIFTNTYENIAYWTYNYYTWAELAYEWH HLA-B5117,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B5118,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B5119,YYATYRNIFTNTYENIAYWTYNYYTWAVLTYLWH HLA-B5120,YYATYRNIFTNTDENIAYWTYNYYTWAVDAYLWH HLA-B5121,YYATYRNIFTNTYENIAYWTYNYYTWAELAYTWH HLA-B5122,YYATYRNICTNTYENIAYWTYNYYTWAELAYLWH HLA-B5123,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLSY HLA-B5124,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B5126,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B5128,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B5129,YYATYRNIFTNTYENIAYWTYNYYTWAERAYLWH HLA-B5130,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B5131,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYEWH HLA-B5132,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B5133,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B5134,YYATYRNIFTNTYENIAYWTYNYYTWAELAYEWY HLA-B5135,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B5136,YYATYRNIFTNTYENIAYWTYNYYTWAEDAYTWY HLA-B5137,YYATYRNIFTNTYENIAYWTYDSYTWAELAYLWH HLA-B5138,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B5139,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B5140,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWY HLA-B5142,YYATYRNIFTNTYENIAYIRYDDYTWAVLAYLSY HLA-B5143,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B5145,YYATYRNIFTNTYENIAYLRYDSYTWAELAYLWH HLA-B5146,YYATYRNIFTNTYENIAYITYNYYTWAELAYLWH HLA-B5147,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWH HLA-B5148,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B5149,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:01,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:02,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWY HLA-B51:03,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLGH HLA-B51:04,YYATYRNIFTNTYENIAYIRYNYYTWAELAYLWH HLA-B51:05,YYATYRNIFTNTYENIAYWTYNYYTWAVRAYLWY HLA-B51:06,YYATYRNIFTNTYENIAYLRYNYYTWAELAYLWH HLA-B51:07,YYATYRNISTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:08,YYATYRNIFTNTYENIAYWTYNYYTWAVDAYLWH HLA-B51:09,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWH HLA-B51:10,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYEWY HLA-B51:100,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:101,YYATYRNIFTNTYENIAYWTYNYYTWAELTYTWH HLA-B51:102,YYATFRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:103,YHTTYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:104,YYAMYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:105,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:106,YYATYRNIFTNTYENIAYWTYNLYTWAELAYLWH HLA-B51:107,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:108,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLSY HLA-B51:109,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:111,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:112,YYAKYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:113,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:114,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:115,YYATYRNIFTNTYENIAYWTYNYYTWAALAYLWH HLA-B51:116,YHSTYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:117,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:119,YYTTYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:12,YYATYRNIFTNTYENALYWTYNYYTWAELAYLWH HLA-B51:12,YYATYRNIFTNTYENIADWTYNYYTWAELAYLWH HLA-B51:120,YYATYRNIFTNTYENIAYWTYNYYTWAKLAYLWH HLA-B51:121,YYATYRNIFTKTYENIAYWTYNYYTWAELAYLWH HLA-B51:122,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWH HLA-B51:123,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:124,YYATYRNIFTNTYENIAYWTCNYYTWAELAYLWH HLA-B51:125,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:126,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:127,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:128,YYATYRNIFSNTYENIAYWTYNYYTWAELAYLWH HLA-B51:129,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:13,YYATYRNIFTNTYENIAYWTYNFYTWAELAYLWH HLA-B51:130,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:131,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:132,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:133,YYATYRNIFTNTYENIAYWTYNYHTWAELAYLWH HLA-B51:134,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:135,YYATYRNIFTNTYENIAYLRYDYYTWAELAYLWH HLA-B51:136,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:137,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:138,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:139,YYATYRNIFTNTYENIAYIRYNYYTWAVLAYLWH HLA-B51:14,YYATYRNIFTNTYENIAYWTYKYYTWAELAYLWH HLA-B51:140,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:141,YYATYRNIFTNTYENIAYWTYNYYTWAVDAYLWH HLA-B51:142,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:143,YYATYRNIFTNTYENIAYWTYNYYTWAELAYTWY HLA-B51:144,YYATYRNIFTNTYENIAYWTYNYYTWAELAYVWY HLA-B51:145,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:146,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWY HLA-B51:147,YYAMYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:148,YYATYRNIFTNTYENIAYLSYNYYTWAVLAYLWY HLA-B51:15,YYATYRNIFTNTYENIAYWTYNLYTWAVLAYLWY HLA-B51:150,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:151,YHATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:152,YYATYRNIFTNTYENIAYWKYNYYTWAELAYLWH HLA-B51:153,YYATYRNIFTNTYENIAYWTYNYYTWAVDAYTWH HLA-B51:154,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:155,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:156,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:157,YYATYRNIFTNTYENIAYWTYNLYTWAVLAYTWY HLA-B51:158,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:159,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:16,YYATYRNIFTNTYENIAYWTYNYYTWAELAYEWH HLA-B51:160,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:161,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:162,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:163,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:164,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:165,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:166,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:167,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:168,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:169,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:17,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:170,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:171,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:172,YYATYRNIFTNTYENIAYWTYNFYTWAELAYLWH HLA-B51:174,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:175,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:176,YDSTYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:177,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:179,YYSTYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:18,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:180,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWY HLA-B51:181,YYATYRNIFTNTYENIAYWTYNYYTLAALAYLWH HLA-B51:182,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:183,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:185,YYATYRNIFTNTYESIAYWTYNYYTWAELAYLWH HLA-B51:186,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:187,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:188,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:189,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:19,YYATYRNIFTNTYENIAYWTYNYYTWAVLTYLWH HLA-B51:190,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:191,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:192,YYATYRNIFTNTYENIAYWTYNDYTWAELAYLWH HLA-B51:193,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:194,YYATYRNIFTNTYENIAYLRYNYYTWAVLAYLWH HLA-B51:195,YYATYRNIFTNTYENIAYWTYNYYIWAELAYLWH HLA-B51:196,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:197,YYATYRNIFTNTYENIAYWTYDYYTWAERAYTWY HLA-B51:198,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:199,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWY HLA-B51:20,YYATYRNIFTNTDENIAYWTYNYYTWAVDAYLWH HLA-B51:200,YYATYRNIFTNTYENIAYWTSNYYTWAELAYLWH HLA-B51:201,YYATYRNIFTNTDVNIAYWTYNYYTWAELAYLWH HLA-B51:202,YYATYRNIFTNTYENIACWTYNYYTWAELAYLWH HLA-B51:203,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:204,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:205,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:206,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:207,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:208,YYATYRNIFTNTDENIAYWTYNYYTWAELAYLWH HLA-B51:209,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:21,YYATYRNIFTNTYENIAYWTYNYYTWAELAYTWH HLA-B51:210,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:211,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:212,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:213,YYATYRNIFTNTYENIAYLTYNYYTWAELAYLWH HLA-B51:214,YYATYRNISTNTYENIAYWTYNDYTWAELAYLWH HLA-B51:215,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:216,YYATYRNIFTNTYENIAYWTYDSYTWAELAYLWH HLA-B51:217,YYATYRNIFTNTYENIAYWTYNYYTWAVRAYLWH HLA-B51:218,YYSTYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:219,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:22,YYATYRNICTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:220,YYATYRNIFTNTYENIAYLRYDSYTWAEWAYLWY HLA-B51:221,YYATYRNIFTNTYENIAYWTYNYCTWAELAYLWH HLA-B51:222,YYATYRNISTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:223,YYATYRNIFTNTYENIAYWTYNLYTWAELAYLWH HLA-B51:224,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:225,YYATYRNIFTNTYENIAYWTYNLYTWAELAYLWH HLA-B51:226,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:227,YYATYRNIFTNTYENIAYIRYDYYTWAELAYLWH HLA-B51:228,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:229,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:23,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLSY HLA-B51:230,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:231,YYATYRDIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:232,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:233,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:234,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:236,YYATYRNILTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:237,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:238,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:239,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:24,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:240,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:241,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:242,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:243,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:244,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:246,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:247,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:248,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:249,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:250,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:251,YYATYRNISTNTYENIAYWTYNSYTWAELAYLWH HLA-B51:252,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:253,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:254,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:255,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:257,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:258,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:259,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWH HLA-B51:26,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:260,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:261,YYATYRNIFTNTYENIAYWTYDDYTWAELAYLGH HLA-B51:262,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:263,YYATYRNIFTNTYENIAYWTYNYYTWAVDAYLWH HLA-B51:265,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:266,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:267,YYAEYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:28,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:29,YYATYRNIFTNTYENIAYWTYNYYTWAERAYLWH HLA-B51:30,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:31,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYEWH HLA-B51:32,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:33,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:34,YYATYRNIFTNTYENIAYWTYNYYTWAELAYEWY HLA-B51:35,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:36,YYATYRNIFTNTYENIAYWTYNYYTWAEDAYTWY HLA-B51:37,YYATYRNIFTNTYENIAYWTYDSYTWAELAYLWH HLA-B51:38,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:39,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:40,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWY HLA-B51:42,YYATYRNIFTNTYENIAYIRYDDYTWAVLAYLSY HLA-B51:43,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:45,YYATYRNIFTNTYENIAYLRYDSYTWAELAYLWH HLA-B51:46,YYATYRNIFTNTYENIAYITYNYYTWAELAYLWH HLA-B51:48,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:49,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:50,YYATYRNIFTNTYENGLYWTYNYYTWAELAYLWH HLA-B51:51,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:52,YYATYRNIFTNTHENIAYWTYNYYTWAELAYLWH HLA-B51:53,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:54,YYATYRNIFTNTYENTAYWTYNYYTWAVRAYLWY HLA-B51:55,YYATYRNIFTNTYENIAYWTYNYYTWAEQAYLWH HLA-B51:56,YYATYRNIFTNTYENIAYIRYNYYTWAELAYLWH HLA-B51:57,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:58,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:59,YYATYRNIFTNTYENIAYLRYNYYTWAELAYLWY HLA-B51:60,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:61,YYATYRNIFTNTYENIAYWTYNYYTWAEWAYLWH HLA-B51:62,YYATYRNIFTNTYENIAYLRYNLYTWAELAYLWH HLA-B51:63,YYATYRNIFTNTYENIAYWTYNSYTWAELAYLWH HLA-B51:64,YYATYRNIFTNTYENIAYLSYNYYTWAELAYLWH HLA-B51:65,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:66,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:67,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:68,YDATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:69,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:70,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:71,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:72,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:73,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWH HLA-B51:74,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:75,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:76,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:77,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:78,YYATYRNIFTNTYENTAYWTYNYYTWAELAYLWH HLA-B51:79,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:80,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:81,YYATYRNIFTNTYENIAYLSYNYYTWAVLAYEWY HLA-B51:82,YYATYRNIFTNTYENIAYWTYNYYTWAERAYEWH HLA-B51:83,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:84,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:85,YYATYRNIFTNTYENIAYWTYHDYTWAELAYLWH HLA-B51:86,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:87,YYATYRNIFTNTYENIAYWTYNYYTWADLAYLWH HLA-B51:88,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:89,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:90,YYATYRNIFTNTYENIAYWTYDYYTWAELAYLWH HLA-B51:91,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:92,YYATYRNIFTNTYENIAYWTYDFYTWAELAYLWH HLA-B51:93,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYEWY HLA-B51:94,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:95,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:96,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B51:97,YYATYRNIFTNTYENIAYWTYNSYTWAVDAYLWH HLA-B51:99,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B5201,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B5202,YYAMYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B5203,YYATYREISTNTYENIAYWTYNYYTWAVLAYLWY HLA-B5204,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B5205,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B5206,YYATYREIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B5207,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B5208,YYATYREISTNTYENIAYWTYNYYTWAELAYEWH HLA-B5209,YYATYREISTNTYESIAYWTYNYYTWAELAYLWH HLA-B5210,YYATYREISTNTYENIAYWTYNYYTWAVLAYLWH HLA-B5211,YYATYREISTNTYENIAYWTYNYYTWAELAYLWY HLA-B52:01,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:02,YYAMYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:03,YYATYREISTNTYENIAYWTYNYYTWAVLAYLWY HLA-B52:04,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:05,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:06,YYATYREIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:07,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:08,YYATYREISTNTYENIAYWTYNYYTWAELAYEWH HLA-B52:09,YYATYREISTNTYESIAYWTYNYYTWAELAYLWH HLA-B52:10,YYATYREISTNTYENIAYWTYNYYTWAVLAYLWH HLA-B52:11,YYATYREISTNTYENIAYWTYNYYTWAELAYLWY HLA-B52:12,YYATYREISTNTYENIAYWTYDYYTWAELAYLWH HLA-B52:13,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:14,YYATYREISTNTYENIAYWTYNFYTWAELAYLWH HLA-B52:15,YYATYREISTNTYENIAYWTYNYYTWAELAYLSH HLA-B52:16,YYSEYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:17,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:18,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:19,YYATYREISTNTYENIAYWTYNYYTWAVDAYLWH HLA-B52:20,YYATYREISTNTYENTAYWTYNYYTWAELAYLWH HLA-B52:21,YYATYREISTNTYENIAYWTYNYYTWAEWAYLWH HLA-B52:22,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:23,YYATYREISTDTYENIAYWTYNYYTWAELAYLWH HLA-B52:24,YYATYREISTNTYENIAYWTYNYYTWAERAYLWH HLA-B52:25,YYATYREISTNTYENIAYWTYNLYTWAELAYLWH HLA-B52:26,YYATYREISTNTYENIAYWTYDDYTWAELAYLWH HLA-B52:27,YYSTYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:28,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:29,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:30,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:31,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:32,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:33,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:34,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:35,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:36,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:37,YYATYREISTNTYENIAYWTYNYYTWAELAYTWH HLA-B52:38,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:39,YYATYREISTNTYENIAYWTYNSYTWAELAYLWH HLA-B52:40,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:41,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:42,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:43,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:44,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:45,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:46,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:47,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:48,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:50,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:51,YHATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:52,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:53,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:54,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:55,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:56,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:57,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:58,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:59,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:60,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:61,YYATYREISTNTYENIAYWTYNYYTWAEVAYLWH HLA-B52:62,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:63,YYATYREISTNTYENIAYWTYDYYTWAELAYLWH HLA-B52:64,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:65,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:66,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:67,YYATYREISTNTYENIAYWTYNYYTWAELAYEWY HLA-B52:68,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:69,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:70,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:71,YYATYREISTNTYENIAYWTYNYYTWAVLTYTWH HLA-B52:72,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:73,YYATYRQISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:74,YYATYREISTNTYENIAYWTYNYYTLAVLAYLWH HLA-B52:75,YYATYREISTNTYENIAYWTYDFYTWAELAYLWH HLA-B52:76,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:77,YDSTYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:78,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:79,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:80,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:81,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:82,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:83,YYTTYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B52:84,YYATYREISTNTYENIAYWTYNYYTWAELTYTWH HLA-B5301,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B5302,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWH HLA-B5303,YYATYRNIFTNTYEDTLYIRYDSYTWAVLAYLWY HLA-B5304,YYATYRNIFTNTYENIAYIRYDFYTWAVLAYLWY HLA-B5305,YYATYRNIFTNTYESIAYIRYDSYTWAVLAYLWY HLA-B5306,YYATYRNIFTNTYENIAYIRYDSYTWAELAYLWH HLA-B5307,YYATYRNIFTNTYENIAYIRSNFYTWAVLAYLWY HLA-B5308,YYATYRNIFTNTYENIAYIRYDSYTWAELAYLWY HLA-B5309,YYATYRNISTNTYENTAYIRYDSYTWAVLAYLWY HLA-B5310,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B5311,YYATYRNIFTNTYENTAYIRYDSYTWAVRAYLWY HLA-B5312,YYATYRNIFTNTYESTAYIRYDSYTWAVLAYLWY HLA-B5313,YYATYRNIFTNTYENTAYIRYDSYTWAVLAYLWY HLA-B53:01,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:02,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWH HLA-B53:03,YYATYRNIFTNTYEDTLYIRYDSYTWAVLAYLWY HLA-B53:04,YYATYRNIFTNTYENIAYIRYDFYTWAVLAYLWY HLA-B53:05,YYATYRNIFTNTYESIAYIRYDSYTWAVLAYLWY HLA-B53:06,YYATYRNIFTNTYENIAYIRYDSYTWAELAYLWH HLA-B53:07,YYATYRNIFTNTYENIAYIRSNFYTWAVLAYLWY HLA-B53:08,YYATYRNIFTNTYENIAYIRYDSYTWAELAYLWY HLA-B53:09,YYATYRNISTNTYENTAYIRYDSYTWAVLAYLWY HLA-B53:10,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:11,YYATYRNIFTNTYENTAYIRYDSYTWAVRAYLWY HLA-B53:12,YYATYRNIFTNTYESTAYIRYDSYTWAVLAYLWY HLA-B53:13,YYATYRNIFTNTYENTAYIRYDSYTWAVLAYLWY HLA-B53:14,YYATYRNIFTNTYENIAYLSYDSYTWAVLAYLWY HLA-B53:15,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:16,YYATYRNIFTNTYESIAYIRYDSYTWAVRAYLWY HLA-B53:17,YYATYREISTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:18,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:19,YYATYRNIFTNTYENIAYIRYNYYTWAVLAYLWY HLA-B53:20,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:21,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:22,YYATYRNIFTNTYENIAYIRYDSYTWAVDAYLSY HLA-B53:23,YYATYRNIFTNTDENIAYIRYDSYTWAVLAYLWY HLA-B53:24,YYATYRNIFTNTYENIAYIRYDSYTWAVRAYLWY HLA-B53:25,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:26,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:27,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:28,YYATYREISTNTYENIAYIRYDSYTWAELAYLWH HLA-B53:29,YYATYRNIFTNTYENIAYIGYDSYTWAVLAYLWY HLA-B53:30,YYAKYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:31,YYATYRNIFTNTYENTAYIRYDFYTWAVLAYLWY HLA-B53:32,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:33,YYATYRNIFTNTYESIAYIRYDFYTWAVLAYLWY HLA-B53:34,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:35,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:36,YYATYRNIFTNTYENTAYIRYNYYTWAVLAYLWY HLA-B53:37,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:38,YYATYREISTNTYENTAYIRYDSYTWAVLAYLWY HLA-B53:39,YYAKYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:40,YYATYRNISTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:41,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:42,YYATYRNIFTNTYENIAYIRYDYYTWAVLAYLWY HLA-B53:43,YYSTYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:44,YYATYRNIFTNTYENIAYLRYDSYTWAVLAYLWY HLA-B53:45,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:46,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:47,YYATYRNIFTNTYENIAYLRYDSYTWAVLAYLWY HLA-B53:49,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:50,YYATYRNIFTNTYENIAYIRYNSYTWAVLAYLWY HLA-B53:51,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:52,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B53:53,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B5401,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B5402,YHAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B5403,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B5404,YYAGYRNIYAQTDESNLYWTYNYYTWAVLAYTWY HLA-B5405,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B5406,YYAGYRNIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B5407,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B5409,YYAGYRNIYAQTDESNLYLRYDSYTWAVLAYTWY HLA-B5410,YYAGYRNIYAQTDESNLYWTYNLYTWAVRAYTWY HLA-B5411,YYAGYRNIYAQTDESNLYWTYNYYSWAVLAYTWY HLA-B5412,YYAGYRNIYAQTDENIAYWTYNLYTWAVLAYTWY HLA-B5413,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B54:01,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B54:02,YHAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B54:03,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B54:04,YYAGYRNIYAQTDESNLYWTYNYYTWAVLAYTWY HLA-B54:06,YYAGYRNIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B54:07,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B54:09,YYAGYRNIYAQTDESNLYLRYDSYTWAVLAYTWY HLA-B54:10,YYAGYRNIYAQTDESNLYWTYNLYTWAVRAYTWY HLA-B54:11,YYAGYRNIYAQTDESNLYWTYNYYSWAVLAYTWY HLA-B54:12,YYAGYRNIYAQTDENIAYWTYNLYTWAVLAYTWY HLA-B54:13,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B54:14,YYAGYRNIYAQTDESNLYWTYDSYTWAVLAYTWY HLA-B54:15,YYAGYRNIYAQTDESNLYWTYDYYTWAVLAYTWY HLA-B54:16,YYAGYRNIYAQTDESNLYWTYDLYTWAVLAYTWY HLA-B54:17,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B54:18,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B54:19,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B54:20,YYAGYRNIYAQTDESNLYWTYNLYTWAERAYTWY HLA-B54:21,YYSGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B54:22,YYAGYRNIYAQTDESNLYWTYNLYSWAVLAYTWY HLA-B54:23,YYAGYRNIYAQTEESNLYWTYNLYTWAVLAYTWY HLA-B54:24,YYAGYRNIFAQTDESNLYWTYNLYTWAVLAYTWY HLA-B54:25,YYAGYRNIYAETDESNLYWTYNLYTWAVLAYTWY HLA-B54:26,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYEWY HLA-B54:27,YYAGYRNIYAQTDESNLYWTYNLYAWAVLAYTWY HLA-B54:28,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B54:29,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B54:30,YYAGYRNIYANTYESNLYWTYNLYTWAVLAYTWY HLA-B54:31,YYAGYRNIYAQTDESNLYWTYNLCTWAVLAYTWY HLA-B54:32,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B54:33,YYAGYRNIYAQTDESNLYWTYNLYTWAEWAYLWY HLA-B54:34,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B54:35,YYAGYREIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B54:36,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B54:37,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B54:38,YYAGYRNIYAQTDESNLYLWCNLYTWAVLAYTWY HLA-B5501,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B5502,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B5503,YYAEYRNIYAQTDVSNLYWTYNLYTWAELAYTWY HLA-B5504,YYAEYRNIYAQTDESNLYLSYNYYTWAVLAYTWY HLA-B5505,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B5507,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B5508,YYAEYRNIYAQTDESNLYLRYNYYTWAVLAYLWY HLA-B5509,YYAEYRNIYAQTDESNLYWTYNLYTWAERAYEWY HLA-B5510,YYSEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B5511,YYAEYRNIYAQTDESNLYWMYNLYTWAELAYTWY HLA-B5512,YYAEYRNIYAQTDENNLYWTYNLYTWAVLAYTWY HLA-B5513,YYAEYRNIYAQTDESNLYWTYNFYTWAVLAYTWY HLA-B5514,YYAEYRNIYAQTDESNLYIVYDSYTWAELAYTWY HLA-B5515,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B5516,YHAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B5517,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYTWY HLA-B5518,YYAEYREISTNTYESNLYWTYNLYTWAVLAYTWY HLA-B5519,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B5520,YYAEYRNIYAQTDESNLYWTYNYYTWAVDAYTWY HLA-B5521,YYAEYRNIYAQTDESNLYWTYNLYTWAEWAYTWY HLA-B5522,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYEWY HLA-B5523,YYAEYRNIYAQTDESNLYWTYDSYTWAVLAYTWY HLA-B5524,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYEWY HLA-B5525,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B5526,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B5527,YYAEYRNIYAQTDESNLYWTYDYYTWAVLAYTWY HLA-B55:01,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:02,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:03,YYAEYRNIYAQTDVSNLYWTYNLYTWAELAYTWY HLA-B55:04,YYAEYRNIYAQTDESNLYLSYNYYTWAVLAYTWY HLA-B55:05,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:07,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:08,YYAEYRNIYAQTDESNLYLRYNYYTWAVLAYLWY HLA-B55:09,YYAEYRNIYAQTDESNLYWTYNLYTWAERAYEWY HLA-B55:10,YYSEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:11,YYAEYRNIYAQTDESNLYWMYNLYTWAELAYTWY HLA-B55:12,YYAEYRNIYAQTDENNLYWTYNLYTWAVLAYTWY HLA-B55:13,YYAEYRNIYAQTDESNLYWTYNFYTWAVLAYTWY HLA-B55:14,YYAEYRNIYAQTDESNLYIVYDSYTWAELAYTWY HLA-B55:15,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:16,YHAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:17,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYTWY HLA-B55:18,YYAEYREISTNTYESNLYWTYNLYTWAVLAYTWY HLA-B55:19,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:20,YYAEYRNIYAQTDESNLYWTYNYYTWAVDAYTWY HLA-B55:21,YYAEYRNIYAQTDESNLYWTYNLYTWAEWAYTWY HLA-B55:22,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYEWY HLA-B55:23,YYAEYRNIYAQTDESNLYWTYDSYTWAVLAYTWY HLA-B55:24,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYEWY HLA-B55:25,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:26,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:27,YYAEYRNIYAQTDESNLYWTYDYYTWAVLAYTWY HLA-B55:28,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYTWY HLA-B55:29,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:30,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:31,YYAEYRNIYAQTYESNLYWTYNLYTWAELAYTWY HLA-B55:32,YYAEYRNIYAQTDESNLYWTYNSYTWAVLAYTWY HLA-B55:33,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:34,YYAEYREISAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:35,YYAMYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:36,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:37,YYAEYRNIYAQTDESNLYWTYNLYTWAVRAYTWY HLA-B55:38,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:39,YYAEYRNIYAQTDESNLYWTYNLHTWAVLAYTWY HLA-B55:40,YYAEYREIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:41,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:42,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:43,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:44,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:45,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:46,YYAEYRNIYAQTDESNLYWTYDLYTWAVLAYTWY HLA-B55:47,YYAEYRNISAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:48,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:49,YYAEYRNIYAQTDVSNLYLSYNYYTWAVLAYTWY HLA-B55:50,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:51,YYAEYRNIYAQTDESNLYLSYNYYTWAVLAYLWY HLA-B55:52,YYAEYRNIYAQTDESNLYWTYNLYTWAERAYTWY HLA-B55:53,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:54,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:56,YYAEYRNIYAQTDESNLYWTYNLYTWAEDAYTWY HLA-B55:57,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:58,YYAEYRNIYAQTDESNLYWTYNFYTWAELAYTWY HLA-B55:59,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:60,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:61,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:62,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:63,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:64,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:65,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:66,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:67,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:68,YYAEYRNIYAQTDESNLYWTYDSYTWAELAYTWY HLA-B55:69,YYAEYRNIYAQTDVSNLYWTYNLYTWAVLAYTWY HLA-B55:70,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:71,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:72,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:73,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:74,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:75,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:76,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:77,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:78,YYAEYRNIYANTDESNLYWTYNLYTWAELAYTWY HLA-B55:79,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:80,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:81,YYAEYRNIYAQTDESNLYWTYNYYTWAVLAYTWY HLA-B55:82,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:84,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:85,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:86,YYAEYRNIYAQTDESNLYLSYNYYTRAVLAYTWY HLA-B55:87,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:88,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B55:90,YYAEYRNIYAQTDEDTLYWTYNLYTWAELAYTWY HLA-B55:91,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:92,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:93,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:94,YYAEYRNIYAQTDESNLYWTYNLCTWAELAYTWY HLA-B55:95,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B55:96,YYAEYRNIYAQTDESNLYWTYNLYTWVVLAYTWY HLA-B5601,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B5602,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYLWY HLA-B5603,YYAEYRNIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B5604,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYLWY HLA-B5605,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYLWH HLA-B5606,YYATYRNIYAQTDESNLYWTYNYYTWAELAYLWH HLA-B5607,YYAEYRNIYAQTDENTAYWTYNLYTWAVLAYLWY HLA-B5608,YYAEYREKYGQTDESNLYWTYNLYTWAVLAYLWY HLA-B5609,YYAEYRNIYAQTDESNLYIRYDSYTWAVLAYLWY HLA-B5610,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYTWY HLA-B5611,YYAEYRNIYAQTDESNLYIRYDFYTWAVLAYLWY HLA-B5612,YYAEYRNIYAQTDESNLYIRYNYYTWAVLAYTWY HLA-B5613,YYAEYRNIYAQTDESNLYWTYNLYTWAVDAYLWY HLA-B5614,YYAEYREKYRQTDESNLYWTYNLYTWAVLAYLWY HLA-B5615,YYAEYRNIYAQTDESNLYWTYNYYTWAVLAYLWY HLA-B5616,YYSEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B5617,YYAEYRNIYANTDESNLYWTYNLYTWAVLAYLWY HLA-B5618,YYAEYRNIYAQTDESNLYLRYDSYTWAVLAYTWY HLA-B5620,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:01,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:02,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYLWY HLA-B56:03,YYAEYRNIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B56:04,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYLWY HLA-B56:05,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYLWH HLA-B56:06,YYATYRNIYAQTDESNLYWTYNYYTWAELAYLWH HLA-B56:07,YYAEYRNIYAQTDENTAYWTYNLYTWAVLAYLWY HLA-B56:08,YYAEYREKYGQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:09,YYAEYRNIYAQTDESNLYIRYDSYTWAVLAYLWY HLA-B56:10,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYTWY HLA-B56:11,YYAEYRNIYAQTDESNLYIRYDFYTWAVLAYLWY HLA-B56:12,YYAEYRNIYAQTDESNLYIRYNYYTWAVLAYTWY HLA-B56:13,YYAEYRNIYAQTDESNLYWTYNLYTWAVDAYLWY HLA-B56:14,YYAEYREKYRQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:15,YYAEYRNIYAQTDESNLYWTYNYYTWAVLAYLWY HLA-B56:16,YYSEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:17,YYAEYRNIYANTDESNLYWTYNLYTWAVLAYLWY HLA-B56:18,YYAEYRNIYAQTDESNLYLRYDSYTWAVLAYTWY HLA-B56:20,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:21,YYAEYRNIYAQTDENIAYWTYNYYTWAELAYLWH HLA-B56:22,YYAEYRNIYAQTDESNLYWTYNFYTWAVLAYLWY HLA-B56:23,YYAEYRNIYANTYESNLYWTYNLYTWAVLAYTWY HLA-B56:24,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:25,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYLWY HLA-B56:26,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:27,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:29,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:30,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:31,YYAEYRNIYAQTDESNLYLRYDSYTWAVLAYTWH HLA-B56:32,YYAEYRNIYAQTDESNLYLRYDSYTWAELAYTWY HLA-B56:33,YYAEYRNICTNTDESNLYWTYNLYTWAVLAYLWY HLA-B56:34,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWH HLA-B56:35,YHAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:36,YYTEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:37,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYLWY HLA-B56:39,YYAMYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:40,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:41,YYAEYRNIYAQTDENNLYWTYNLYTWAVLAYLWY HLA-B56:42,YYAEYRNIYTNTYESNLYWTYNLYTWAVLAYLWY HLA-B56:43,YYAEYRNIYAQTDESNLYWTYNLYTWAVWAYLWY HLA-B56:44,YYAEYRNISTNTYESNLYWTYNLYTWAVLAYLWY HLA-B56:45,YYATYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:46,YYAEYRNIYAQTDESTLYWTYNLYTWAVLAYLWY HLA-B56:47,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:48,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:49,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:50,YYAEYRNIYAQTDESNLYWTYDSYTWAVLAYLWY HLA-B56:51,YYAEYRNIYAQTDESNLYLRYNLYTWAVRAYLWY HLA-B56:52,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:53,YYAEYRNIYVQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:54,YYAEYRNIYTNTYESNLYWTYNLYTWAVLAYTWY HLA-B56:55,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:56,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYLWY HLA-B56:57,YYAEYQNIYAQTDESNLYLRYNLYTWAVLAYLWY HLA-B56:58,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:59,YYAEYRNIYAQTDESNLYWTYNLYTWAALAYLWY HLA-B56:60,YYAEYRNIYAQTDESNLYIRYNLYTWAVLAYEWY HLA-B56:61,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:62,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B56:63,YYAEYRNIYAQTDESNLYLRYNLYTWAVRAYLWY HLA-B56:64,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B5701,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B5702,YYAMYGENMASTYENIAYIVYNYYTWAVRAYLWY HLA-B5703,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY HLA-B5704,YYAMYGENMASTYENIAYIVYDDYTWAVRAYLWY HLA-B5705,YYAMYGENMASTYENIAYIRYNYYTWAVRAYLWY HLA-B5706,YYAMYGENMASTYENIAYIVYDSYIWAVLAYLWY HLA-B5707,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLSY HLA-B5708,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B5709,YYAMYGENMASTYENIAYIVYNYYTWAEDAYLWY HLA-B5710,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B5711,YYAMYGENMASTYENIAYLWYDSYTWAVLAYLWY HLA-B5712,YYAMYGENMASTYESNLYIVYNYYTWAVRAYLWY HLA-B5713,YYAMYGENMASTYENIAYIVYDSYTWAERAYEWY HLA-B57:01,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:02,YYAMYGENMASTYENIAYIVYNYYTWAVRAYLWY HLA-B57:03,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY HLA-B57:04,YYAMYGENMASTYENIAYIVYDDYTWAVRAYLWY HLA-B57:05,YYAMYGENMASTYENIAYIRYNYYTWAVRAYLWY HLA-B57:06,YYAMYGENMASTYENIAYIVYDSYIWAVLAYLWY HLA-B57:07,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLSY HLA-B57:08,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:09,YYAMYGENMASTYENIAYIVYNYYTWAEDAYLWY HLA-B57:10,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:100,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:101,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY HLA-B57:102,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:103,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:104,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:105,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:106,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:107,YYAMYGENMASTYENIAYIVYNSYTWAVLAYLWY HLA-B57:108,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:109,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:11,YYAMYGENMASTYENIAYLWYDSYTWAVLAYLWY HLA-B57:110,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:111,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:112,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:113,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:114,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:12,YYAMYGENMASTYESNLYIVYNYYTWAVRAYLWY HLA-B57:13,YYAMYGENMASTYENIAYIVYDSYTWAERAYEWY HLA-B57:14,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWH HLA-B57:15,YYAMYGENVASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:16,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:17,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY HLA-B57:18,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:19,YYAMYGENMASTYENIAYIVYDSYTWAVRAYLWY HLA-B57:20,YYAMYGKNMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:21,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:22,YYAMYGENMASTYENIAYIVYDSYTWAELAYLWY HLA-B57:23,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:24,YYAMYGENMASTYENIAYIVYDSYTWAVDAYLWY HLA-B57:25,YYAMYGENMASTYENIAYIVYDSYTWAVLAYEWY HLA-B57:26,YYAMYGENMASTYENIAYIVYDSYTWAVLAYTWY HLA-B57:27,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:29,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:30,YYAMYGENMASTYENIAYIVYDSYTWAARAYLWY HLA-B57:31,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:32,YYAMYGENMASTYENIAYIVYHDYTWAVLAYLWY HLA-B57:33,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:34,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:35,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:36,YYAMYGEHMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:37,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:38,YYAMYGENMASTYETIAYIVYDSYTWAVLAYLWY HLA-B57:39,YHAMYGENMASTYENIAYIVYNYYTWAVLAYLWY HLA-B57:40,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:41,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:42,YYAMYGENMASTYENIAYIVYNYYTWAVRAYLWY HLA-B57:43,YYAMYGENMASTYENIAYIVYDSYTWAVLAYPWY HLA-B57:44,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:45,YYAKYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:46,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY HLA-B57:47,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:48,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:49,YDAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:50,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:51,YHTKYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:52,YYAMYGENMASTYENIAYIVYDSYTWAVLASLWY HLA-B57:53,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:54,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:55,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:56,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:57,YYAMYGENMASTYENIAYIVYNYYTWAELAYLWY HLA-B57:58,YYSMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:59,YYAMYGENMASTYENIAYIVYDSYSLAVLAYLWY HLA-B57:60,YYAMYGENMASTYESIAYIVYDSYTWAVLAYLWY HLA-B57:61,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:62,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:63,YYAMYGENMASTYENIAYIVYNYYTWAERAYLWY HLA-B57:64,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:65,YYAMYGENMASTYENIAYIVYDSYTWVVLAYLWY HLA-B57:66,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY HLA-B57:67,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:68,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:69,YYTKYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:70,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLCY HLA-B57:71,YYTMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:72,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:73,YHAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:74,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:75,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:76,YYAMYGENMASTYENIAYIVYDFYTWAVLAYLWY HLA-B57:77,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:78,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:80,YYSMYGENMASTYENIAYIVYNYYTWAVLAYLWY HLA-B57:81,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:82,YYAMYGENMASTYENIAYLRYNYYTWAVLAYLWY HLA-B57:83,YYAMYGENMASTYENIAYLRYDSYTWAVLAYLWY HLA-B57:84,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY HLA-B57:85,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:86,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:87,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:88,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:89,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:90,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:91,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:92,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:93,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLSY HLA-B57:94,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY HLA-B57:95,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:96,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY HLA-B57:97,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B57:99,YYAMYGENMASTYENIAYTVYDSYTWAVLAYLWY HLA-B5801,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B5802,YYATYGENMASTYENIAYLWYDSYTWAVLAYLWY HLA-B5804,YYATYEENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B5805,YYATYGENMASTYENIAYIRYDSYTLAALAYTWY HLA-B5806,YYATYGENMASTYENIAYLWYDSYTWAELAYLWY HLA-B5807,YYATYGENMASTYENIAYLWYDSYTWAVLAYLSY HLA-B5808,YYATYGENMASTYENIAYWTYNYYTWAELAYLWH HLA-B5809,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWH HLA-B5811,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B5812,YYSTYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B5813,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B5814,YYATYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B5815,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:01,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:02,YYATYGENMASTYENIAYLWYDSYTWAVLAYLWY HLA-B58:04,YYATYEENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:05,YYATYGENMASTYENIAYIRYDSYTLAALAYTWY HLA-B58:06,YYATYGENMASTYENIAYLWYDSYTWAELAYLWY HLA-B58:07,YYATYGENMASTYENIAYLWYDSYTWAVLAYLSY HLA-B58:08,YYATYGENMASTYENIAYWTYNYYTWAELAYLWH HLA-B58:09,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWH HLA-B58:100,YYATYRENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:11,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:12,YYSTYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:13,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:14,YYATYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B58:15,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:16,YYATYGENMASTYENIAYLRYDSYTWAVLAYLWY HLA-B58:18,YYATYGENMASTYENIAYLSYDSYTWAVLAYLWY HLA-B58:19,YYATYGENMASTYENIAYIRYDSYTWAELAYLWY HLA-B58:20,YYATYGENMASTYENIAYLRYNFYTWAVLTYTWY HLA-B58:21,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:22,YYATYGENMASTYENIAYIRYDSYTWAVRAYLWY HLA-B58:23,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:24,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:25,YYATYGENMASTYENIAYLWYDSYTWAVLAYLWY HLA-B58:26,YYATYGENMASTYENIAYLRYDSYTWAVLAYLWY HLA-B58:27,YYATYGENMASTYENIAYLSYNYYTWAVLAYEWY HLA-B58:28,YYATYGENMASTYENIAYIRYNYYTWAVLAYLWY HLA-B58:29,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:30,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:32,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:33,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:34,YYATYGENMASTYENIAYIRYDFYTWAVLAYLWY HLA-B58:35,YYATYGENMASTYENIAYIRYDSYTWAVLAYTWY HLA-B58:36,YYAMYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:37,YYATYGENMASTYENIAYIRYDSYTWAVLAYEWY HLA-B58:38,YYATYGENMASTYENIAYLWYDSYTWGVLAYLWY HLA-B58:40,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:41,YHATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:42,YYATYGENMASTYENIAFIRYDSYTWAVLAYLWY HLA-B58:43,YYATYGENMASTYENIAYLWYDSYTWAVLAYLWY HLA-B58:44,YYAEYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:45,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:46,YYATYGENMASTYENIAYLWYDSYTWAELAYLWY HLA-B58:47,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:48,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:49,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:50,YYATYGESMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:51,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:52,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:53,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:54,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:55,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:56,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:57,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:58,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:59,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:60,YYATYGENMASTYENIAYLWYDSYTWAVLAYLWY HLA-B58:61,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:62,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:63,YYATFGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:64,YYATYGENMASTYESNLYIRYDSYTWAVLAYLWY HLA-B58:65,YYATYGENMASTYENIAYIRYNYYTWAVLAYLWY HLA-B58:66,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:67,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:68,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:69,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:70,YYATYGENMASTYENIACIRYDSYTWAVLAYLWY HLA-B58:71,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:73,YYATYGENMASTYENIAYIRYNLYTWAVLAYLWY HLA-B58:74,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:75,YYATYGENMASTYEKIAYIRYDSYTWAVLAYLWY HLA-B58:76,YYATYGENMASTYENIAYIRYDSYTWAVLAYTWH HLA-B58:77,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:78,YYATYGENMASTYENIAYIRYDSYTWAEWAYLWY HLA-B58:79,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:80,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:81,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:82,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:83,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:84,YYATYGENMASTYENIAYIRYDSYTWAVLTYTWY HLA-B58:85,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:86,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:87,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:88,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:89,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:90,YYATCGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:91,YYATYGENMASTYENIAYIRYDSYTWAELAYLWY HLA-B58:92,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:95,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:96,YYATYGENMASTYDNIAYIRYDSYTWAVLAYLWY HLA-B58:97,YYATYGENLASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:98,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B58:99,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B5901,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYTWY HLA-B5902,YYAEYRNIFTNTYENIAYWTYNYYTWAVLAYTWY HLA-B59:01,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYTWY HLA-B59:02,YYAEYRNIFTNTYENIAYWTYNYYTWAVLAYTWY HLA-B59:03,YYAEYRNIFTNTYENIAYWTYNFYTWAVLAYTWY HLA-B59:04,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYLWY HLA-B59:05,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYTWY HLA-B59:06,YYAGYRNIFTNTYENIAYWTYNLYTWAVLAYTWY HLA-B59:07,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYTWY HLA-B59:08,YYAEYRNICTNTYENTAYWTYNLYTWAVLAYTWY HLA-B59:09,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYEWY HLA-B6701,YYSEYRNIYAQTDESNLYLRYNFYTWAVLTYTWY HLA-B6702,YYSGYREKYRQADVSNLYLRYNFYTWAVLTYTWY HLA-B67:01,YYSEYRNIYAQTDESNLYLRYNFYTWAVLTYTWY HLA-B67:02,YYSGYREKYRQADVSNLYLRYNFYTWAVLTYTWY HLA-B67:03,YYSEYRNIYAQTDESNLYLRYNFYTWAVLTYTWY HLA-B67:04,YYSEYWNIYAQTDESNLYLRYNFYTWAVLTYTWY HLA-B67:05,YYSEYRNIYAQTDESNLYLRYNFYTWAVLTYTWY HLA-B67:06,YYSEYRNIYAQTDESNLYLRYNFYTWAVLTYTWH HLA-B67:07,YYSEYRNIYAQTDESNLYLRYNFYTWAVLTYTWY HLA-B7301,YHTEYRNICAKTDVGNLYWTYNFYTWAVLAYEWH HLA-B73:01,YHTEYRNICAKTDVGNLYWTYNFYTWAVLAYEWH HLA-B73:02,YHTEYRNICAKTDVGNLYWTYNFYTWAVLAYEWH HLA-B7801,YYATYRNIFTNTDESNLYWTYNYYTWAELAYLWH HLA-B7802,YYATYRNIFTNTYESNLYWTYNYYTWAELAYLWH HLA-B7803,YYATYRNICTNTDESNLYWTYNYYTWAELAYLWH HLA-B7804,YYATYRNIFTNTYESNLYWTYNYYTWAVLAYLWY HLA-B7805,YYATYREISTNTYESNLYWTYNYYTWAELAYLWH HLA-B78:01,YYATYRNIFTNTDESNLYWTYNYYTWAELAYLWH HLA-B78:02,YYATYRNIFTNTYESNLYWTYNYYTWAELAYLWH HLA-B78:03,YYATYRNICTNTDESNLYWTYNYYTWAELAYLWH HLA-B78:04,YYATYRNIFTNTYESNLYWTYNYYTWAVLAYLWY HLA-B78:05,YYATYREISTNTYESNLYWTYNYYTWAELAYLWH HLA-B78:06,YYATYREISTNTYENNLYWTYNYYTWAELAYLWH HLA-B78:07,YYATYRNIFTNTDESNLYWTYNYYTWAELAYTWH HLA-B78:08,YYATYRNIFTNTDESNLYWTYNYYTWAVLAYEWH HLA-B78:09,YYATYRNIFTNTYENNLYWTYNYYTWAELAYLWH HLA-B78:10,YYATYRNIFTNTYENNLYWTYNYYTWAVLAYLWH HLA-B8101,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY HLA-B8102,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY HLA-B81:01,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY HLA-B81:02,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY HLA-B81:03,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY HLA-B81:05,YYSEYRNIFAQTDESNLYLSYNYYSLAVLAYEWY HLA-B81:06,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY HLA-B81:07,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY HLA-B81:08,YYSEYRNIYAQTYESNLYLSYNYYSLAVLAYEWY HLA-B8201,YYSEYRNIYAQTDESNLYLRFNLYTWAVDAYLSY HLA-B8202,YYSEYRNIYAQTDESNLYLRFNLYTWAVDAYLSY HLA-B82:01,YYSEYRNIYAQTDESNLYLRFNLYTWAVDAYLSY HLA-B82:02,YYSEYRNIYAQTDESNLYLRFNLYTWAVDAYLSY HLA-B82:03,YYSEYRNIYAQTDESNLYLRYNLYTWAVDAYLSY HLA-B8301,YYSEYRNIYAQTDESNLYIRYDDYTWAVDAYLSY HLA-B83:01,YYSEYRNIYAQTDESNLYIRYDDYTWAVDAYLSY HLA-B9501,YYAMYREIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B9502,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B9503,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B9504,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B9505,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B9506,YYAKYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B9507,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B9508,YYSEYRNICTNTYESNLYLRYDSYTWAELTYLWY HLA-B9509,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY HLA-B9510,YYAMYREISTNTYESNLYLRCDSYTWAEWAYLWY HLA-B9512,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B9513,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B9514,YYSEYRNICTNTYESNLYLRYDSYTWAVLAYEWY HLA-B9515,YYSEYRNICTNTYESTAYLRYDSYTWAELAYLWY HLA-B9516,YYAMYREISTNTYESNLYLRYDSYSLAEWAYLWY HLA-B9517,YYAMYREISTNTYESNLYLRYDSYTWAEWAYEWY HLA-B9518,YYAMYREISTNTYESNLYLMYDSYTWAEWAYLWY HLA-B9519,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B9520,YYAMYRDISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B9521,YYAMYRNISTNTYESNLYIRYDSYTWAELAYTWY HLA-B9522,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B9523,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B9524,YYSEYRNICTNTYESNLYLRYDSYSLAVLAYEWY HLA-B9525,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B9526,YYAMYREISTNTYESNLYLSYDSCTWAEWAYLWY HLA-B9527,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B9528,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B9529,YYAMYREISTNTYESNLYLNYDSYTWAEWAYLWY HLA-B9530,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY HLA-B9532,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-C0102,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C0103,YFSGYREKYRQTDVSNLYLWCNFYTWAERAYTWY HLA-C0104,YFSGYREKYRQTDVSNLYLWCDSYTWAEWAYTWY HLA-C0105,YFSGYREKYRQTDVSNLYLRSDYYTWAERAYTWY HLA-C0106,YFSGYREKYRQTDVSNLYLWCDYYTWAVRAYTWY HLA-C0107,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C0108,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C0109,YFSGYREKYRQTDVSNLYLWCDYYTWAEWAYTWY HLA-C0110,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYEWY HLA-C0111,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C0112,YFSGYREKYRQTDVSNLYLWYDYYTWAERAYTWY HLA-C0113,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:02,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:03,YFSGYREKYRQTDVSNLYLWCNFYTWAERAYTWY HLA-C01:04,YFSGYREKYRQTDVSNLYLWCDSYTWAEWAYTWY HLA-C01:05,YFSGYREKYRQTDVSNLYLRSDYYTWAERAYTWY HLA-C01:06,YFSGYREKYRQTDVSNLYLWCDYYTWAVRAYTWY HLA-C01:07,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:08,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:09,YFSGYREKYRQTDVSNLYLWCDYYTWAEWAYTWY HLA-C01:10,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYEWY HLA-C01:100,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:101,YFSGYREKYRQTDVSNLYLWYDYYTWAERAYTWY HLA-C01:102,YFSGYREKYRQTDVSNLYLWYDSYTWAERAYTWY HLA-C01:103,YFSGYREKYRQTDVSNLYLWCDHYTWAERAYTWY HLA-C01:104,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:105,YFSGYREKYRQTDVSNLYLWCDYYTGAERAYTWY HLA-C01:106,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:107,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYLWY HLA-C01:108,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:11,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:110,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:112,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:113,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:114,YFSGYREKYRQTDVSNLYLWFDYYTWAERAYTWY HLA-C01:115,YFSGYREKYRQTDVSNLYLWCDDYTWAERAYTWY HLA-C01:116,YFSGYREKYRQTDVSNLYLWCNYYTWAERAYTWY HLA-C01:118,YFSGYRENYRQTDVNNLYLWCDYYTWAERAYTWY HLA-C01:119,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:12,YFSGYREKYRQTDVSNLYLWYDYYTWAERAYTWY HLA-C01:120,YFSGYREKYRQTDVSNLYLRCDYYTWAERAYTWY HLA-C01:122,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:123,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:124,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:125,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:126,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:127,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:128,YFSGYRENYRQADVSNLYLWCDYYTWAERAYTWY HLA-C01:129,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:13,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:130,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:131,YFSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C01:132,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:133,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:134,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:135,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:136,YFSGYREKYRQTDVSNLYLWCDLYTWAERAYTWY HLA-C01:138,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:139,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:14,YFSGYREKYRQTDVNKLYLWCDYYTWAERAYTWY HLA-C01:140,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYAWY HLA-C01:141,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:142,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:144,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:146,YFSGYREKYRQTDVSNLYLWCDFYTWAERAYTWY HLA-C01:147,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:148,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:149,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:15,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:150,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:151,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:152,YFSGYREKYRQADVSNLYLWCDSYTWAERAYTWY HLA-C01:153,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:154,YFSGYREKYRQTDVSKLYLWCDYYTWAERAYTWY HLA-C01:155,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:156,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:157,YFSGYREKYRQADESNLYLWCDYYTWAERAYTWY HLA-C01:158,YFSGYREKYRQTDVSNLYFWCDYYTWAERAYTWY HLA-C01:159,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:16,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:160,YFSGYREKYRQTDVSNLYLWCDYYTWAALAYTWY HLA-C01:161,YFSGCREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:162,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:163,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:164,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:165,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:166,YFSGYWEKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:167,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:168,YYAGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:169,YYSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:17,YFSGYREKYRQADVSNLYLWCDYYTWAERAYTWY HLA-C01:170,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:172,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:173,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:174,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:175,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:176,YFSGYREKYRQTDVSNLYIWCDYYTWAERAYTWY HLA-C01:18,YFSGYREKYHQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:19,YFSGYREKYRQTDVCNLYLWCDYYTWAERAYTWY HLA-C01:20,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:21,YFSGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C01:22,YFSGYREKYRQTDVSNLYLWCDYYTWAELAYTWY HLA-C01:23,YFSGYREKYRQADVSNLYLWCDYYTWAERAYTWY HLA-C01:24,YFSGYREKYRQTDVSNLYLWCNFYTWAERAYTWY HLA-C01:25,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:26,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:27,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:28,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:29,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTCY HLA-C01:30,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWH HLA-C01:31,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYMWY HLA-C01:32,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:33,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:34,YFSGYREKYRQTDVSNLYLWYNFYTWAERAYTWY HLA-C01:35,YFSGYREKYRQTDVSNLYLWCDYYTWAELAYLWY HLA-C01:36,YFSGYREKYRQTDVSNLYLRFDYYTWAERAYTWY HLA-C01:38,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:39,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:40,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:41,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:42,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:43,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:44,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:45,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:46,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:47,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:48,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:49,YFSGYREKYRQTDVSNLYIRYDYYTWAERAYTWY HLA-C01:50,YFSGYREKYRQTDVSNLYIRYDYYTWAERAYTWY HLA-C01:51,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:52,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:53,YFSGYREKYRQTDVSNLYLWCDYCTWAERAYTWY HLA-C01:54,YFSGYREKYRQTDVSNLYLWCDSYTWAERAYTWY HLA-C01:55,YFSGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C01:57,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:58,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:59,YFSGYREKYRQTDVNNLYLWCDYYTWAERAYTWY HLA-C01:60,YFSGYREKYRQTDVSNLYLWCDYYTLAERAYTWY HLA-C01:61,YFSGYREKYRQTDVRNLYLWCDYYTWAERAYTWY HLA-C01:62,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:63,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:64,YFAGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:65,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:66,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:67,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:68,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:70,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:71,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:72,YFSGYREKYRRTDVSNLYLWCDYYTWAERAYTWY HLA-C01:73,YFSMYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:74,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:75,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:76,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:77,YFSGYREKYRQTDVSNLYLWSDYYTWAERAYTWY HLA-C01:78,YFSGYREKYRQTDVSNLYLWCNFYTWAERAYTWY HLA-C01:79,YFSGYREKYRQTDVSNLYLRYDYYTWAERAYTWY HLA-C01:80,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:81,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:82,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:83,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:84,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:85,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:87,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:88,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:90,YFSGYREKYRQTDVSNLYLWCNLYTWAERAYTWY HLA-C01:91,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:92,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:93,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:94,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:95,YFSGYREKYRQTDESNLYLWCDYYTWAERAYTWY HLA-C01:96,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C01:97,YFSGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C01:99,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C0202,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C0203,YYAGYREKYRQTDVNKLYLRYDSYTWAVLAYEWY HLA-C0204,CYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C0205,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYEWY HLA-C0206,YYAGYREKYRQTDVNKLYLRYDLYTWAEWAYEWY HLA-C0207,YYAGYREKYRQTDVNKLYLRYHDYTWAEWAYEWY HLA-C0208,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C0209,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C0210,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C0211,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C0212,YYAGYREKYRQADVSKLYLRYDSYTWAEWAYEWY HLA-C0213,YYAGYREKYRQTDVNKLYLRYDSYTWAAWAYEWY HLA-C0214,YDAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:02,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:03,YYAGYREKYRQTDVNKLYLRYDSYTWAVLAYEWY HLA-C02:04,CYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:05,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYEWY HLA-C02:06,YYAGYREKYRQTDVNKLYLRYDLYTWAEWAYEWY HLA-C02:07,YYAGYREKYRQTDVNKLYLRYHDYTWAEWAYEWY HLA-C02:08,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:09,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:10,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:100,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:101,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:102,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:103,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:104,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:106,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:107,YDSGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:108,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:109,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:11,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:110,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:111,YYAGYREKYRQTDVNKLYLRYDFYTWAEWAYEWY HLA-C02:112,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:113,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:114,YYAGYREKYRQTDVNKLCLRYDSYTWAEWAYEWY HLA-C02:115,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYEWY HLA-C02:116,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:117,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:118,YYAGYREKYRQTDVNKLYLRYNSYTWAEWAYEWY HLA-C02:119,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:12,YYAGYREKYRQADVSKLYLRYDSYTWAEWAYEWY HLA-C02:120,YYAGYWEKYRQTDVNKLHLRYDSYTWAEWAYEWY HLA-C02:122,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:123,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:124,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:125,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:126,YYAGYREKYRQTDVSKLYLRYDSYTWAEWAYEWY HLA-C02:127,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:128,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:129,YYAGYREKYRQTDVTKLYLRYDSYTWAEWAYEWY HLA-C02:13,YYAGYREKYRQTDVNKLYLRYDSYTWAAWAYEWY HLA-C02:130,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:131,YYAGYREKYRQTDESNLYLRYDSYTWAEWAYEWY HLA-C02:132,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:133,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:134,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:136,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:137,YYAGYREKYRQTDVNKLYLRYDSYTWAELAYEWY HLA-C02:138,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:139,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:14,YDAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:140,YYAGYREKYRQTDVNKLYLKYDSYTWAEWAYEWY HLA-C02:141,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWC HLA-C02:142,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWH HLA-C02:143,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:144,YYAGYPEKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:145,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:146,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:147,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:148,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:149,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:15,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:151,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:152,YYSGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:153,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:154,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:155,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:156,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:157,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:158,YYAGYREKYRQTDVNKLYLRYHDYTWAEWAYEWY HLA-C02:159,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:16,YYAGYREKYRQTDVNKLYLRYDSYTWAELAYEWY HLA-C02:160,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:161,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:162,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:163,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:164,YDAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:166,YYAGYREKYHQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:17,YYAGYREKYRQTDVNKLYLWFDSYTWAEWAYEWY HLA-C02:18,YYAGYREKYRQTDVNKLYLRYDSYTWAALAYEWY HLA-C02:19,YYAGYREKYRQTDVNKLYLRYDYYTWAEWAYEWY HLA-C02:20,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:21,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:22,YYAGYREKYRQTDVNKLYLRYNFYTWAEWAYEWY HLA-C02:23,YYAGYREKYRQTDVNKLYLRYDYYTWAEWAYEWY HLA-C02:24,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:26,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:27,YYAGYREKYRQTDVSNLYLRYDSYTWAEWAYEWY HLA-C02:28,YYAGYREKYRQTDVNKLYLRYDSYTWAVWAYEWY HLA-C02:29,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:30,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:31,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:32,YYAGYREKYRQTDVNKLYLRYDSYTWAERAYEWY HLA-C02:33,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:34,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:35,YYAGYREKYRQTDVNKLHLRYDSYTWAEWAYEWY HLA-C02:36,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:37,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:39,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:40,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:42,YYSGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:43,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYTWY HLA-C02:44,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:45,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:46,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:47,YYAGYREKYRQTDVNKLYLRYDLYTWAEWAYEWY HLA-C02:48,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:49,YYAGYREKYRQADVNKLYLRYDSYTWAEWAYEWY HLA-C02:50,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:51,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:53,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:54,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:55,YYAGYREKYRQADVNKLYLRYDSYTWAEWAYEWY HLA-C02:56,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:57,YYAGYREKYRQTDVNKLYFRYDSYTWAEWAYEWY HLA-C02:58,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYLWY HLA-C02:59,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:60,YYAGYREKYRQTDVNKLYLSYDSYTWAEWAYEWY HLA-C02:61,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:62,YYAGYREKYRQTDVNKLYIRYDSYTWAEWAYEWY HLA-C02:63,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:64,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:65,YYAGYREKYRQTDVNNLYLRYDSYTWAEWAYEWY HLA-C02:66,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:68,YYAGYREKYRQTDVNKLYLRYNSYTWAEWAYEWY HLA-C02:69,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:70,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:71,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:72,YYAGYREKYRQTDVNKLYLRYDSYTWAEWVYEWY HLA-C02:73,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:74,YYAGYREKYRQTDVNKLYVRYDSYTWAEWAYEWY HLA-C02:75,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:76,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:77,YYAGYREKYRQTDVNKLYLRSDSYTWAEWAYEWY HLA-C02:78,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:79,YYAGYGEKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:80,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:81,YYAGYREKYRQTDVNKLYRRYDSYTWAEWAYEWY HLA-C02:82,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYESY HLA-C02:83,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:84,YYAGYREKYRRTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:85,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:86,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:87,YYAGYREKYRQTDVSNLYLRYDSYTWAEWAYEWY HLA-C02:88,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:89,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:90,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:91,YYAGYREKYRQTDVNKLYLRYGSYTWAEWAYEWY HLA-C02:93,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:94,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:95,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:96,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:97,YYAGYREKYRQTDVNKLYLRYDDYTWAEWAYEWY HLA-C02:98,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C02:99,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C0301,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C0302,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C0303,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C0304,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C0305,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYLWY HLA-C0306,YYAGYREKYRQTDVSNLYIRYVYYTWAELAYLWY HLA-C0307,YYAGYREKYRQTDVNKLYIRYDYYTWAELAYLWY HLA-C0308,YYAGYRENYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C0309,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C0310,YYAGYREKYRQTDVSKLYIRYDYYTWAELAYLWY HLA-C0311,YYSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C0312,YYAGYREKYRQTDVSNLYIRYDLYTWAELAYLWY HLA-C0313,YYAGYREKYRQTDVSNLYLRYDYYTWAELAYLWY HLA-C0314,YYAGYREKYRQTDVSNLYIRYDSYTLAALAYTWY HLA-C0315,YYAGYREKYRQADVNKLYLRYDSYTWAELAYLWY HLA-C0316,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYTWY HLA-C0317,YYAGYREKYRQTDVSNLYLWYDYYTWAELAYLWY HLA-C0318,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C0319,YYAGYREKYRQTDVSNLYIRYDLYTWAELAYLWY HLA-C0321,YYAGYREKYRQTDVSNLYIRYDYYTWAEWAYTWY HLA-C0322,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C0323,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C0324,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C0325,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYLWY HLA-C03:01,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:02,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:03,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:04,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:05,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYLWY HLA-C03:06,YYAGYREKYRQTDVSNLYIRYVYYTWAELAYLWY HLA-C03:07,YYAGYREKYRQTDVNKLYIRYDYYTWAELAYLWY HLA-C03:08,YYAGYRENYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:09,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:10,YYAGYREKYRQTDVSKLYIRYDYYTWAELAYLWY HLA-C03:100,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:101,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:102,YYAGYREKYRQTDVSNLYIRYDLYTWAELAYLWY HLA-C03:103,YYAGYREKYRQTDVSNLYIRSDYYTWAELAYLWY HLA-C03:104,YYAGYPEKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:105,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:106,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:107,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:108,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:109,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:11,YYSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:110,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:111,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:112,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:113,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYTWY HLA-C03:114,YYAGYREKYRQTDVSNLYIRYGYYTWAELAYLWY HLA-C03:115,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:116,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:117,YYAGYREKYRQTDVSNLYIRYDYYTWAERAYTWY HLA-C03:118,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:119,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY HLA-C03:12,YYAGYREKYRQTDVSNLYIRYDLYTWAELAYLWY HLA-C03:120,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:122,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:123,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:124,YYAGYWEKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:125,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:126,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:127,YYAGYREKYRQTDESNLYIRYDYYTWAELAYLWY HLA-C03:128,YYAGYREKYRQTDVSNLYIRCDYYTWAELAYLWY HLA-C03:129,YYAGYREKYRQTDVSNLYIRYDYYSWAELAYLWY HLA-C03:13,YYAGYREKYRQTDVSNLYLRYDYYTWAELAYLWY HLA-C03:130,YYAGYREKYRQADVNNLYIRYDYYTWAELAYLWY HLA-C03:131,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:132,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:133,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:134,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:135,YYAGYREKYRQTDVSNLYLRYDYYTWAELAYLWY HLA-C03:136,YYAGYREKYRQADVSNLYIRYDYYTWAELAYLWY HLA-C03:137,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:138,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:139,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:14,YYAGYREKYRQTDVSNLYIRYDSYTLAALAYTWY HLA-C03:140,YYAGYREKYRQTDVNNLYIRYDYYTWAELAYLWY HLA-C03:141,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:142,YYAGYREKYRQTDVSNLYIRYDYYTWAEWAYEWY HLA-C03:143,YYAGYREKYRQTDVSNLYISYDYYTWAELAYLWY HLA-C03:144,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:145,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:146,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:147,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:148,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:149,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:15,YYAGYREKYRQADVNKLYLRYDSYTWAELAYLWY HLA-C03:150,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:151,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:152,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:153,YYAGYREKYRQTDVSNLYIRHDYYTWAELAYLWY HLA-C03:154,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:155,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:156,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:157,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:158,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:159,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:16,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYTWY HLA-C03:160,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:161,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYTWH HLA-C03:162,YYAGYREKYRQTDVSNLYIRYDYYTLAALAYLWY HLA-C03:163,YYAGYREKYRQADVNKLYIRYDYYTWAELAYLWY HLA-C03:164,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:165,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:166,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:167,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYLWY HLA-C03:168,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:17,YYAGYREKYRQTDVSNLYLWYDYYTWAELAYLWY HLA-C03:170,YCAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:171,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:172,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:173,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:174,YYAGYQEKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:175,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY HLA-C03:176,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:177,YYAGYREKYRQTDVSNLYLRYDYYTWAELAYLWY HLA-C03:178,YYAGYREKYRQTDVSNLYLRSDYYTWAELAYLWY HLA-C03:179,YYAGYREKYRQTYESNLYIRYDYYTWAELAYLWY HLA-C03:18,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:180,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:181,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:182,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:183,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:184,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:185,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:186,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:187,YYAGYREKYRQTDVSNLYIRYDYYTWAVLAYLWY HLA-C03:188,YYAGYREKYLQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:19,YYAGYREKYRQTDVSNLYIRYDLYTWAELAYLWY HLA-C03:190,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:191,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:192,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:193,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:194,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:195,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:196,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:197,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:198,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:199,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:200,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:202,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:203,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:204,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:205,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:206,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:207,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:209,YYAGYREKYRQTDVSNLYIWCDYYTWAELAYLWY HLA-C03:21,YYAGYREKYRQTDVSNLYIRYDYYTWAEWAYTWY HLA-C03:210,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:211,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:212,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:213,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:214,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:215,YYAGYREKYRQTDVSNLYIRYDYYTWAELTYLWY HLA-C03:216,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:217,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:218,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:219,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:220,YYAGYREKYRQTDVSNLYIRYDYYTLAELAYLWY HLA-C03:221,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:222,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:223,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:225,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:226,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:227,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:228,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:23,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:230,YYAGYREKYRQTDVSNLYIRYDYYTWATLAYLWY HLA-C03:231,YSAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:232,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:233,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:234,YYAGYREKYRQTDVSNLYIRYDYYSWATLAYLWY HLA-C03:235,YYAGYREKYRQTDVSNLYIRYDYYTWTELAYLWY HLA-C03:236,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:237,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:238,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:239,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:24,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:240,YYAGYREKYRQTDVSNLYIRCDSYTWAELAYLWY HLA-C03:241,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:242,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:243,YYAGYREKYRQTDVNNLYIRYDYYTWAELAYLWY HLA-C03:245,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:246,YYAGYRENYRQADVSNLYIRYDYYTWAELAYLWY HLA-C03:247,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:248,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:249,YYAGYREKYRQTDVSNLYLWYDYYTWAELAYLWY HLA-C03:25,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYLWY HLA-C03:250,YYAGYREKYRQTDVSNLYIRYNFYTWAELAYLWY HLA-C03:251,YYAGYREKYRQTDVSNLYIRYDYYTWAERAYTWY HLA-C03:252,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:253,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:254,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:255,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:256,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:257,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:258,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:259,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:26,YYAGYREKYRQTDVSNLYIRYDFYTWAELAYLWY HLA-C03:260,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:261,YYAGYREKYRQTDVSNLYIRYDYYTLAALAYEWY HLA-C03:262,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:263,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:264,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:266,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:267,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYLWY HLA-C03:268,YYAGYREKYRQTDVNKLYIRYDYYTWAELAYLWY HLA-C03:269,YYAGYREKYRQTDVSNLYIRYDYYTCAELAYLWY HLA-C03:27,YYAGYREKYRQADVSNLYLSYDYYTWAELAYLWY HLA-C03:270,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:271,YYAGYREKYRQTDVSNLYLWFDSYTWAELAYLWY HLA-C03:272,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYEWY HLA-C03:273,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:274,YYAGYREKYRQADESNLYIRYDYYTWAELAYLWY HLA-C03:275,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:276,YYAGYREKYRQTDVSNLYIRFDYYTWAELAYLWY HLA-C03:278,YHAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:279,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY HLA-C03:28,YYAGYREKYRQTDVSNLYIRYDYYTWAERAYLWY HLA-C03:280,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:281,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:282,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:283,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:284,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:285,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:286,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:287,YYAGYREKYRQTDVSNLYIRYDYYTWAEWAYLWY HLA-C03:288,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:289,YYAGYREKNRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:29,YYAGYRENYRQTDVSKLYIRYDYYTWAELAYLWY HLA-C03:290,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:291,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:292,YYAGYREKYRQTDVSNLYLRYDYYTWAELAYLWY HLA-C03:293,YYAGYREKYRQTDVSNLYIRYDYYTWAERAYTWY HLA-C03:294,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:295,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:296,YYAGYREKYRQTDVSNLYLSYDYYTWAVLAYLWY HLA-C03:297,YYAGYREKYRQADVNKLYIRYDYYTWAELAYLWY HLA-C03:298,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:299,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:30,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:300,YYAGYREKYRQTDVSNLYLRSDSYTWAELAYLWY HLA-C03:301,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:302,YYAGYREKYRQTDVSNLYLWCDYYTWAELAYLWY HLA-C03:303,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:304,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:305,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:306,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:307,YYAGYREKYRQTDVSNLYIRYDLYTWAELAYLWY HLA-C03:308,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:309,YYAGYREKYRQTDVSNLYIRYDYYTWAALAYLWY HLA-C03:31,YYAGYRENYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:310,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:311,YYAGYREKYRQTDGSNLYIRYDYYTWAELAYLWY HLA-C03:312,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:313,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:314,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:315,YYAGYREKYRQTDVSNLYLRYDSYTWAELDYLWY HLA-C03:317,YYAGYREKYRQTDVSNLYIRYNYYTWAELAYLWY HLA-C03:319,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:32,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:320,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:321,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:322,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:324,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:325,YYAGYREKYRQTDVSNLYIRYDYYTWAALAYLWY HLA-C03:326,YYAGYREKYRQTDVSNLYLRYDYYTWAELAYLWY HLA-C03:327,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:328,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:329,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:33,YYAGYREKYRQTDVSNLCLRYDSYTWAELAYLWY HLA-C03:330,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:331,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:332,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:333,YYAGYREKYRRTDVSNLYIRYDYYTWAELAYLWY HLA-C03:334,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:335,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYLWY HLA-C03:336,YYAGYREKYRQTDVSNLYIRYEYYTWAELAYLWY HLA-C03:337,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:338,YYAGYREKYRQTDVSNLYLRFDSYTWAELAYLWY HLA-C03:339,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:34,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYEWY HLA-C03:340,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:341,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:342,YYAEYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:343,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:344,YDSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:345,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:346,YYAGYREKYRQTDVSNLYISYDYYTWAELAYLWY HLA-C03:347,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:348,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:349,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:35,YYAGYREKYRQTDVSNLYLRYDYYTWAELAYLWY HLA-C03:350,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:351,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:352,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:353,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:354,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:355,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:356,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:357,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:358,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:359,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:36,YYAGYREKYRQTDVSNLYLRYDSYTWAVLAYLWY HLA-C03:360,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:361,YYAGYREKYRQTDVSNLYIRYDSYTLAALAYTWY HLA-C03:362,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:364,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:365,YYAGYQEKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:367,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:368,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:369,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:37,YYSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:370,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:371,YYAGYREKYRQTEVSNLYLRYDSYTWAELAYLWY HLA-C03:372,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:373,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:374,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:375,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:376,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:378,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:379,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:38,YYAGYREKYRQADVSNLYIRYDYYTWAELAYLWY HLA-C03:381,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:382,YYAGYREKYRQTDVSNLYIRYNYYTWAELAYLWY HLA-C03:383,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:384,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYEWH HLA-C03:385,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:386,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYEWY HLA-C03:387,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:388,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:389,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:39,YDSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:390,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:393,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:394,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:395,YYAGYREKYRQTDVSNLHIRYDYYTWAELAYLWY HLA-C03:397,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:398,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:399,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:40,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY HLA-C03:400,YYAGYREKYRETDVSNLYIRYDYYTWAELAYLWY HLA-C03:401,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:402,YYAGYREKYRQTDVSNLYLRCDSYTWAELAYLWY HLA-C03:403,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:404,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:405,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:406,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:407,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYLWY HLA-C03:408,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:409,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:41,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:410,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:411,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:412,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:413,YYAGYREKYRQTDVSNLYIRYDYYTWAEWAYLWY HLA-C03:414,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:415,YYAGYREKYRQTDVSNLHIRYDYYTWAELAYLWY HLA-C03:416,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:417,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:418,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:419,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:42,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY HLA-C03:420,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:422,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:423,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:425,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:426,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:427,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:428,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:429,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:43,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY HLA-C03:430,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:431,YYAGYREKYRQADVSNLYLRYDSYTWAELAYLWY HLA-C03:433,YYAGYREKYRQTDVSNLYIRYDDYTWAELAYLWY HLA-C03:434,YYAGYREKYRQTDVSNLYIRYDYYTLAELAYLWY HLA-C03:435,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:436,YYVGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:437,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:438,YYAGYREKYRQTDVSNLCIRYDYYTWAELAYLWY HLA-C03:439,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:44,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:440,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:441,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:443,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:45,YYAGYREKYRQTDVNKLYIRYDYYTWAELAYLWY HLA-C03:450,YYAGYREKYRQTDVSKLYIRYDYYTWAELAYLWY HLA-C03:451,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:452,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:453,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:454,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:455,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:456,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:457,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:458,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:459,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:46,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:460,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:47,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:48,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:49,YYAGYREKYRQTDVSNLYIRYDYYTWAERAYLWY HLA-C03:50,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:51,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWH HLA-C03:52,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:53,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:54,YYAGYREKYRQTDVSNLYIRYDYYTWAELPYLWY HLA-C03:55,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYTWY HLA-C03:56,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:57,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:58,YYAGYREKYRQTDVSNLYLWCNFYTWAERAYTWY HLA-C03:59,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:60,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:61,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:62,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:63,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:64,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:65,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:66,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:67,YDAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:68,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:69,YYAGYREKYRQADVSNLYIRYDYYTWAELAYLWY HLA-C03:70,YYAGYREKYRQTDESNLYIRYDYYTWAELAYLWY HLA-C03:71,YYAGYREKYRQTDVSNLYLWYDSYTWAELAYLWY HLA-C03:72,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:73,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:74,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:75,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:76,HYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:77,YYAGYREKYRQTDVSNLYIRYDYYTWAVLAYLWY HLA-C03:78,YYAGYREKYRQTDVSNLYIRYDYYTWAEMAYLWY HLA-C03:79,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:80,YYAGYREKYRQTDVSNLYIRYDYYTWAEWAYTWY HLA-C03:81,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:82,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:83,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:84,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:85,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:86,YYAGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C03:87,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:88,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:89,YYAGYREKYRQTDVSNLYLRFDSYTWAELAYLWY HLA-C03:90,YYAGYREKYRQTDVSNLYIRSDYYTWAELAYLWY HLA-C03:91,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:92,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYTWY HLA-C03:93,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:94,YYAGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C03:95,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C03:96,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C03:97,YYAGYREKYRQTDVSNLYFRYDYYTWAELAYLWY HLA-C03:98,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYPWY HLA-C03:99,YYSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C0401,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C0403,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C0404,YSAGYREKYRQADVNKLYLRFNFYTWAELAYTWY HLA-C0405,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C0406,YYAGYREKYRQADVNKLYLRFNFYTWAELAYTWY HLA-C0407,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C0408,YSAGYREKYRQADVNKLYLRFNFYTWAERAYLWY HLA-C0409,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C0410,YSAGYREKYRQTDVNKLYLRFNFYTWAERAYTWY HLA-C0411,YSAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C0412,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C0413,YSAGYREKYRQADVNKLYLRFNFYTWAALAYTWY HLA-C0414,YSAGYREKYRQADVNKLYLRFNFYTWAEQAYTWY HLA-C0415,YSAGYREKYRQADVNKLYLRYNFYTWAERAYTWY HLA-C0416,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C0417,YSAGYREKYRQADVNKLYLRYNFYTWAERAYTWY HLA-C0418,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:01,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:03,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:04,YSAGYREKYRQADVNKLYLRFNFYTWAELAYTWY HLA-C04:05,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:06,YYAGYREKYRQADVNKLYLRFNFYTWAELAYTWY HLA-C04:07,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:08,YSAGYREKYRQADVNKLYLRFNFYTWAERAYLWY HLA-C04:10,YSAGYREKYRQTDVNKLYLRFNFYTWAERAYTWY HLA-C04:100,YSAGYREKYRQADVNKLYIRYDFYTWAERAYTWY HLA-C04:101,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:102,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:103,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:104,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:106,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:107,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:108,YSAGYREKYRQADVNKLYLRFDFYTWAERAYTWY HLA-C04:109,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:11,YSAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C04:110,YSAGYREKYRQADVNKLYIRFNFYTWAERAYTWY HLA-C04:111,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:112,YSAGYRENYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:113,YSAGYREKYRQADVNKLYLRFNFYTWAVRAYTWY HLA-C04:114,YSAGYREKYRQADVNNLYLRFNFYTWAERAYTWY HLA-C04:116,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:117,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:118,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:119,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:12,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:120,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:121,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:122,YSAGYREKYRQADVNKLYLRFNFYTWAVLAYTWY HLA-C04:124,YSAGYRQKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:125,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:126,YSAGYREKYRQADVNKLYLRFNFYIWAERAYTWY HLA-C04:127,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:128,YSAGCREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:129,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:13,YSAGYREKYRQADVNKLYLRFNFYTWAALAYTWY HLA-C04:130,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:131,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:132,YSAGYREKYLQADVNKLYLRFNFYTWAERAYTWY HLA-C04:133,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:134,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:135,YSAGYREKYRQADVNKLYLRFNYYTWAERAYTWY HLA-C04:136,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:137,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:138,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:139,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:14,YSAGYREKYRQADVNKLYLRFNFYTWAEQAYTWY HLA-C04:140,YSSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:141,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:142,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:143,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:144,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:145,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:146,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:147,YYAGYREKYRQADVNKLYLRFNFYTWAERAYLWY HLA-C04:148,YSAGYREKYRHADVNKLYLRFNFYTWAERAYTWY HLA-C04:149,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:15,YSAGYREKYRQADVNKLYLRYNFYTWAERAYTWY HLA-C04:150,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:151,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:152,YSAGYREKYRQADVNKLYLRFNFYNWAERAYTWY HLA-C04:153,YSAGYREKYRQTDVNKLYLRFNFYTWAERAYTWY HLA-C04:154,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:155,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:156,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:157,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:158,YSAGYREKYRQADVNKLYLRFNFYTCAERAYTWY HLA-C04:159,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:16,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:160,YYAGYREKYRQADVNKLYLRFNFYTLAALAYTWY HLA-C04:161,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:162,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:163,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:164,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:165,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:166,YSSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:167,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:168,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTCY HLA-C04:169,YSAGYRENYRQTDVNKLYLRFNFYTWAERAYTWY HLA-C04:17,YSAGYREKYRQADVNKLYLRYNFYTWAERAYTWY HLA-C04:171,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:172,YSAGYREKYRQADVSNLYLRFNFYTWAERAYTWY HLA-C04:174,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:175,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:176,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:177,YSAGYREKYRQADVNKLYLRFNFYTWAERAYKWY HLA-C04:178,YSAGYREKYRQADVNKLYIRYDLYTWAELAYTWY HLA-C04:179,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:18,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:180,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:181,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:182,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:183,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:184,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:185,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:186,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:187,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:188,YSAGYREKYRQADVNKLYLRFNFYTWAERTYTWY HLA-C04:189,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:19,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:190,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:192,YSAGYREKYRQDDVNKLYLRFNFYTWAERAYTWY HLA-C04:193,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:194,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:195,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:196,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:197,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:198,CSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:199,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:20,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:200,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:201,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:202,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:204,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:206,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:207,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:208,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:209,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:210,YSAGYREKYRQTDVNKLYLRFNFYTWAERAYTWY HLA-C04:211,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:212,YSAGYREKYRQADVNKLYLRFNFYTWAVLAYLWY HLA-C04:213,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:214,YSAGYREKYRQTDVSKLYLRFNFYTWAERAYTWY HLA-C04:216,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:218,YSAGYREKYRQADVNKLYLRFNLYTWAERAYTWY HLA-C04:219,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:220,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:221,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:222,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:223,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:224,YSAGYREKYRQADVNKLYIRYNFYTWAERAYTWY HLA-C04:226,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:227,YSAGYREKYRQADGNKLYLRFNFYTWAERAYTWY HLA-C04:228,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:229,YSAGYREKYRQADVNKLYLRFKFYTWAERAYTWY HLA-C04:23,YSAGYREKYRQADVNKLYLRFDFYTWAERAYTWY HLA-C04:230,YSAGYREKYRQADVNKLYLWYNFYTWAERAYTWY HLA-C04:231,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:232,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:235,YSAGYREKYRQADVNKLYLRFNFYTWSERAYTWY HLA-C04:237,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:238,YSAGYREKYRQADVNKLHLRFNFYTWAERAYTWY HLA-C04:239,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:24,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:240,YSAGYREKYRQADVNKLYLRSNFYTWAERAYTWY HLA-C04:241,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:242,YSAGYREKYRQADVNKLYFRYNFYTWAERAYTWY HLA-C04:243,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:244,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:245,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:246,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:247,YSAGYREKYRQADVNKLYLRFNFYTRAERAYTWY HLA-C04:248,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:249,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:25,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:250,YSAGYREKYRQADVNKQYLRFNFYTWAERAYTWY HLA-C04:251,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:252,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTRY HLA-C04:254,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:256,YYSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:257,YSAGYREKYRQADVNKLYLRFNFYTWAERACTWY HLA-C04:258,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:259,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:26,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:260,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:261,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:262,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:263,YSAGYREKYRQADVNKLYLWFNFYTWAERAYTWY HLA-C04:264,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:265,YSAGYREKYRQADVNKLYLRFNFYTWAVLAYEWY HLA-C04:266,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:267,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:268,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:269,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:27,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:270,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:271,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:272,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:273,YSAGYQEKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:274,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:275,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:276,YSAGYREKYRQADVNKLYLSFNFYTWAERAYTWY HLA-C04:277,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:278,YSAGYREKYRQANVNKLYLRFNFYTWAERAYTWY HLA-C04:28,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:280,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:281,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:282,YSAGYREKYRQADVNKLYLRFNFYTWAERVYTWY HLA-C04:283,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:284,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:285,YSAGYREKYCQADVNKLYLRFNFYTWAERAYTWY HLA-C04:286,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:287,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:288,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:289,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:29,YSAGYREKYRQADVSNLYLRFNFYTWAERAYTWY HLA-C04:290,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:291,YSAGYREKYRQADVNKLYLRFNFYTWATLAYTWY HLA-C04:292,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:293,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:294,YYAGYREKYRQADVNKLYLRYNFYTWAELAYTWY HLA-C04:295,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:296,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:297,YSAGYREKYRQADVNKLYLRFNFYTWADRAYTWY HLA-C04:298,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:299,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:30,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:301,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:302,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:303,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:304,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:306,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:307,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:308,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:31,YSAGYREKYRQADVNKLYLRFNFYTWVERAYTWY HLA-C04:310,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:311,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:312,YSAGYREKYRQADVNKLYLRFNIYTWAERAYTWY HLA-C04:313,YSAGYREKYRQADVNKLYLRFNSYTWAERAYTWY HLA-C04:314,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:315,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:316,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:317,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:318,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:319,YSAGYREKYRQADVNKLSLRFNFYTWAERAYTWY HLA-C04:32,YSAGYREKYRQADVNKLYLRFNFYTWAERAYEWY HLA-C04:320,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:321,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:322,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:323,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:324,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:325,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:326,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:327,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:328,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:329,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:33,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:330,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:331,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:332,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:333,YSAGYREKYHQADVNKLYLRFNFYTWAERAYTWY HLA-C04:334,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:335,YYAGYREKYRQADVNKLYLRFDFYTWAERAYTWY HLA-C04:336,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:337,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:338,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:339,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:34,YSAGYREKYRQADVNKLYLRFNFYTWAVLAYLWY HLA-C04:340,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:341,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:342,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:343,YSAGFREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:344,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:345,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTSY HLA-C04:346,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:347,YSAGYREKYRQTDVNKLYLRFNFYTWAERAYTWY HLA-C04:348,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:35,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:351,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:352,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:353,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:354,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:355,HSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:356,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:357,YYAGYREKYRQADVNKLYLRFNFYTWAELAYTWY HLA-C04:358,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:359,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:36,YSAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C04:37,YSAGYREKYRQADVNKLYLWCNFYTWAERAYTWY HLA-C04:38,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:39,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:40,YSAGYREKYRQADVNKLYFRFNFYTWAERAYTWY HLA-C04:41,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:42,YDAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:43,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:44,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:45,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:46,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:47,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:48,YSAGYREKYRQADVNKLYLRFNFYTWAERPYTWY HLA-C04:49,YSAGYWEKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:50,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:51,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:52,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:53,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:54,YSAGYREKYRQADVNKLYLRFDSYTWAERAYTWY HLA-C04:55,YSAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C04:56,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:57,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:58,YSAGYREKYRQADVNKLYLRFNFYTLAALAYTWY HLA-C04:60,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:61,YSAGYREKYRQADVNKLYLRFNFYTWAARAYTWY HLA-C04:62,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:63,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:64,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:65,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:66,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:67,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:68,YSAGYREKYRQADVNKLYLRFNFYTWAAQAYTWY HLA-C04:69,YSAGYGEKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:70,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:71,YFAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:72,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:73,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:74,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:75,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:76,YSAGNREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:77,YSAGYREKYRQADVNKLYLRFNFYTWAERAYEWY HLA-C04:78,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:79,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:80,YYAGYREKYRQADVNKLYIRYNFYTWAERAYTWY HLA-C04:81,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:82,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:83,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:84,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:85,YSAGYREKYRQADVNKLYLRFNFYTWAERAYMWY HLA-C04:86,YSAGYREKYSQADVNKLYLRFNFYTWAERAYTWY HLA-C04:87,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:89,YSAGYREKYRQADVNKLYLRFNYYTWAERAYTWY HLA-C04:90,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:91,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:92,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:94,YSAGYREKYRQADVNKLYLRFNFYTWAEWAYTWY HLA-C04:96,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:97,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:98,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C04:99,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C0501,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C0502,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYMWY HLA-C0503,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C0504,YYAGYREKYRQTDVNKLYLRYDSYTWAERAYTWY HLA-C0505,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C0506,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C0508,YYAGYREKYRQTDVNKLYLRYNFYTWAEWAYTWY HLA-C0509,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C0510,YYAGYREKYRQTDVNKLYIRYNFYTWAERAYTWY HLA-C0511,YYAGYREKYRQTDVNKLYLRYNFYTWAELAYTWY HLA-C0512,YYAGYREKYRQTDVNKLYLRYNFYTWAVRAYTWY HLA-C0513,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:01,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:03,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:04,YYAGYREKYRQTDVNKLYLRYDSYTWAERAYTWY HLA-C05:05,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:06,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:08,YYAGYREKYRQTDVNKLYLRYNFYTWAEWAYTWY HLA-C05:09,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:10,YYAGYREKYRQTDVNKLYIRYNFYTWAERAYTWY HLA-C05:100,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:101,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:102,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTSY HLA-C05:103,YYAGYREKYRQTDVNKLYLRYDSYTWAERAYTWY HLA-C05:104,YYAGYREKYRQTDVNKLYFRYNFYTWAERAYTWY HLA-C05:105,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYEWY HLA-C05:106,YYAGYREKYRQTDVNKLYLRYNFYTWAEWAYTWY HLA-C05:107,YYAGYREKYRQTDVNKLYLWCDYYTWAERAYTWY HLA-C05:108,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:109,YYAGYREKYRQTDMNKLYLRYNFYTWAERAYTWY HLA-C05:11,YYAGYREKYRQTDVNKLYLRYNFYTWAELAYTWY HLA-C05:110,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:111,YYAGYREKYRQTDVNKLYLRSNFYTWAERAYTWY HLA-C05:112,YYAGYREKYRQTDVNKLYLRYNFYTWAEQAYTWY HLA-C05:114,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:115,YYAGYREKYRQTDVNKLYLRYNFYTWAALAYTWY HLA-C05:116,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:117,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:118,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:119,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:12,YYAGYREKYRQTDVNKLYLRYNFYTWAVRAYTWY HLA-C05:120,YYAGYREKYRRTDVNKLYLRYNFYTWAERAYTWY HLA-C05:121,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:122,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:123,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:124,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:125,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:126,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:127,YYGGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:129,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:13,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:130,YYAGYREKYRQTDVNKLYLRYNFYTWAERAFTWY HLA-C05:131,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:132,YYAGYREKYRQTDVNKLYLRYDLYTWAERAYTWY HLA-C05:133,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:134,YYAGYREKYRQTDVNKLYLRYNFYTLAALAYTWY HLA-C05:135,YYAGYREKYRQTDVNKLYLRYDSYTWAERAYTWY HLA-C05:136,YYAGYREKYRQTDVNKLYLRYNFYSWAERAYTWY HLA-C05:137,YYAGYREKYRQSDVNKLYLRYNFYTWAERAYTWY HLA-C05:138,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:139,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:14,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:140,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:141,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:142,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:143,YYAGYREKYRQTDVNKLYLRYNFYTLAARAYTWY HLA-C05:144,YYAGYRGKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:145,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:146,YYAGYREKYRQTDVNKLYLRYNFYTWAEDAYTWY HLA-C05:147,YYAGYREKYRQTDVNKLYLRYDYYTWAERAYTWY HLA-C05:148,YYAGYREKYRQTDVNKLYIRYDYYTWAERAYTWY HLA-C05:149,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:15,YYAGYWEKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:150,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:151,YYAGYREKYRQTDVNKLYLRYNFYTLAVLAYLWY HLA-C05:152,YYAGYREKYRQTDVNKLYWRYNFYTWAERAYTWY HLA-C05:155,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:156,YSAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:157,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:158,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:159,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:16,YYAGYREKYRQTDVNKLYLWYNFYTWAERAYTWY HLA-C05:160,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:161,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:162,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:163,YYAGYREKYRQTDVNKLYLRYNFYTWAADAYTWY HLA-C05:164,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:165,YYAGYRKKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:166,YYAGYREKYRQTDVNKLYLRYNLYTWAERAYTWY HLA-C05:167,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:168,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:17,YYAGYREKYRQTDVNKLYLRYNFYTWAALAYTWY HLA-C05:170,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:171,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:172,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:173,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:174,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:176,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:177,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:178,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:179,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:18,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:181,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:182,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:183,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:184,YYAGYREKYRQTDVNKLYLRYNFYTWAELAYLSY HLA-C05:185,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:186,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:187,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:188,YYAGYREKYRQTDVNKLYLRYNSYTWAERAYTWY HLA-C05:189,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:19,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:190,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:191,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:192,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:193,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:194,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:195,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:196,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:197,YYSGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:198,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:199,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:20,YYAGYREKYRQTDVNNLYLRYNFYTWAERAYTWY HLA-C05:200,YFAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:201,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:203,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:21,YYAGYREKYRQTDVNKLHLRYNFYTWAERAYTWY HLA-C05:22,YYAGYREKYRQTDVNKLYLRYDFYTWAERAYTWY HLA-C05:23,YYAGYREKYRQTDVNKLYLRYNFYTLAERAYTWY HLA-C05:24,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:25,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:26,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:27,YYAGYREKYRQTDVNKLYLRYNFYTWAELAYLWY HLA-C05:28,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:29,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:30,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:31,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:32,YYAGYREKYRQTDVNRLYLRYNFYTWAERAYTWY HLA-C05:33,YYAGCREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:34,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:35,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:36,YYAGYRENYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:37,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:38,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:39,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYLWY HLA-C05:40,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:41,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:42,YYAGYREKYRQADVNKLYLRYNFYTWAERAYTWY HLA-C05:43,YDAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:44,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:45,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:46,YYAGYREKYRQADVNKLYLRYNFYTWAERAYTWY HLA-C05:47,YYAGYREKYRQTDVNKLYLRYNYYTWAERAYTWY HLA-C05:49,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:50,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:52,YYAGYREKYRQTDVNKLYLRYNFYTWAEWAYTWY HLA-C05:53,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:54,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:55,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:56,YYAGYQEKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:57,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:58,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:59,YYAGYREKYRQTDVNKLYLRCNFYTWAERAYTWY HLA-C05:60,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:61,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:62,YYAGYREKYRQTDVNKLYLRYNFYTLAADAYTWY HLA-C05:63,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:64,YYAGYREKYRQTDVNKLYLRFNFYTWAERAYTWY HLA-C05:65,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:66,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:67,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:68,YYAGYREKYRQTDVNKLYLRYNFYTWAALAYTWY HLA-C05:69,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:70,YYAGYREKYRQTDVNKLYLRYNFYTWAELTYTWY HLA-C05:71,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:72,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:73,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:74,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:75,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:76,YYAGYREKYRQTDVNKLYLRYNFYTWAARAYTWY HLA-C05:77,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:78,YSAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:79,YYAGYREKYRQTDVNKLYLRYNFYTWATLAYTWY HLA-C05:80,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:81,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:82,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:83,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:84,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:85,YYAGYREKYRQTDVNKLYLWCNFYTWAERAYTWY HLA-C05:86,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:87,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:88,YYAGYREKYRQTDVNKLYLRYNFYTWAQRAYTWY HLA-C05:89,YYAGYREKYRQTDVNKLYLRYNFYTWAEWAYTWY HLA-C05:90,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:93,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:94,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:95,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:96,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:97,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C05:98,YYSGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C0602,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C0603,YYSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C0604,YDSGYREKYRQADVNKLYLWYDSYTWAELAYTWY HLA-C0605,YDSGYREKYRQTDVNKLYLWYDSYTWAERAYTWY HLA-C0606,YDSGYREKYRQADVNKLYLWYDSYTWAERAYTWY HLA-C0607,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C0608,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYEWY HLA-C0609,YDSGYREKYRQADVNKLYLWYNFYTWAEWAYTWY HLA-C0610,YDPGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C0611,YDSGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C0612,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C0613,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:02,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:03,YYSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:04,YDSGYREKYRQADVNKLYLWYDSYTWAELAYTWY HLA-C06:05,YDSGYREKYRQTDVNKLYLWYDSYTWAERAYTWY HLA-C06:06,YDSGYREKYRQADVNKLYLWYDSYTWAERAYTWY HLA-C06:07,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:08,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYEWY HLA-C06:09,YDSGYREKYRQADVNKLYLWYNFYTWAEWAYTWY HLA-C06:10,YDPGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:100,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:101,YDSGYREKYRQADVNKLYLRFDSYTWAEWAYTWY HLA-C06:102,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:103,YDSGYREKYRQADVNKLYLWYEYYTWAEWAYTWY HLA-C06:104,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:105,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:106,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:107,YDSGYREKYRQADVNKLYLWYDYYTWAEWAYTWY HLA-C06:108,YDSGYREKYRQADVNKLYLWYDSYTWPEWAYTWY HLA-C06:109,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:11,YDSGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C06:110,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:111,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:112,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:113,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:114,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:115,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:117,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:118,YDSGYREKYRQADVNKLYLWYDSYTLAALAYTWY HLA-C06:119,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:12,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:120,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:121,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:122,YDSGYREKYRQADVSKLYLWYDSYTWAEWAYTWY HLA-C06:123,YDSGYREKYRQADVNKLYFWYDSYTWAEWAYTWY HLA-C06:124,YDSGYREKYRQTDVSKLYLWYDSYTWAEWAYTWY HLA-C06:125,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:126,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:127,YDSGYREKYRQADVNKLYLRYDSYTWAEWAYTWY HLA-C06:129,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:13,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:130,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:131,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:132,YYAGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:133,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:135,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:136,YDSGYREKYRQADVNKLYLRSDSYTWAEWAYTWY HLA-C06:137,YDSGYREKYRQADVNKLYLWYDSYTWVEWAYTWY HLA-C06:138,YDSGYREKYRQTDVNKLYLWYDSYTWAEWAYTWY HLA-C06:139,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:14,YDSGYREKYRQADVNKLYIWYDSYTWAEWAYTWY HLA-C06:140,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:141,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:142,YDSGYREKYRQADVNKLYLWFDSYTWAEWAYTWY HLA-C06:143,YDSGYREKYRQADVNKLYIRYDSYTWAEWAYTWY HLA-C06:144,YDSGYREKYRQADVNKLYLRYNFYTWAEWAYTWY HLA-C06:145,YDSGYREKYRQADVNKLYLWHDSYTWAEWAYTWY HLA-C06:146,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:147,YDSGYRNIFTNTYESNLYLWYDSYTWAEWAYTWY HLA-C06:148,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:149,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:15,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:150,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:151,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:153,YDSGYREKYRQADVNKLYLWYDSYTWAVLAYTWY HLA-C06:154,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:155,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:156,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:157,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:158,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:159,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:160,YDSGYREKYRQADVNQLYLWYDSYTWAEWAYTWY HLA-C06:161,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYAWY HLA-C06:162,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:163,YDSGYREKYRQADVNKLCLWYDSYTWAEWAYTWY HLA-C06:164,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:165,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTSY HLA-C06:166,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:167,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:168,YDSGYREKYRQADVNKLYLWYDLYTWAEWAYTWY HLA-C06:169,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:17,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:170,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:172,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:173,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:174,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:176,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:177,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:178,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:179,YDSGYREKYRQADVNKLYLWCDYYTWAEWAYTWY HLA-C06:18,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:180,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:181,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:182,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:183,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:184,YDSGYREKYRQADVNRLYLWYDSYTWAEWAYTWY HLA-C06:185,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:186,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:187,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:188,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:189,YDSGYREKYRQADVNKLYLWYDSCTWAEWAYTWY HLA-C06:19,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:190,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:191,YDSGYREKYRQADVNKLYLWYDSHTWAEWAYTWY HLA-C06:192,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:193,YDSGYREKYREADVNKLYLWYDSYTWAEWAYTWY HLA-C06:194,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:195,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:196,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:197,YDSGYREKYRQADVNKLYLWYDSYTWAELAYLWY HLA-C06:198,YDSGYREKYRQTDVNKLYLWYDSYTWAEWAYTWY HLA-C06:199,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:20,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:201,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:202,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:203,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:204,YDSGYREKYRQADVNKLYLWCDYYTWAERAYTWY HLA-C06:205,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:206,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:207,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWH HLA-C06:209,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:21,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:210,YDSGYREKYRQADVNNLYLWYDSYTWAEWAYTWY HLA-C06:212,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:213,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:214,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:216,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:217,YDSGYREKYRQTDVSNLYLWYDSYTWAEWAYTWY HLA-C06:218,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:219,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:22,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:221,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:222,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:223,YDSGYREKYRQADVNKLHLWYDSYTWAEWAYTWY HLA-C06:224,YDSGYREKYRQADVNKLYLWYDLYTWAEWAYTWY HLA-C06:225,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:226,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:227,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:228,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:229,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:23,YDSGYREKYRQADVNKLYLWCDSYTWAEWAYTWY HLA-C06:230,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:231,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:232,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:233,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:234,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:235,YDSGYREKYRQVDVNKLYLWYDSYTWAEWAYTWY HLA-C06:236,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:237,YDSGYREKYRQADVNKLYLWYDSYTWAEWASTWY HLA-C06:238,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:239,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:24,YDSGYREKYRQADVNKLYLWYDSYTWAEWAHTWY HLA-C06:240,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:241,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:242,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:243,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:244,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:245,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:246,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:247,YDSGYREKYRQAHVNKLYLWYDSYTWAEWAYTWY HLA-C06:248,YDSGYREKYRQTDVSNLYLWYDSYTWAEWAYTWY HLA-C06:249,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:25,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:250,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:251,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:26,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:27,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:28,YDAGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:29,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:30,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:31,YDSGYREKYRQADVNKLYLWYDSYTWAAWAYTWY HLA-C06:32,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:33,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:34,YDSGYREKYRQADVNKLYLWYDFYTWAEWAYTWY HLA-C06:35,YDSGYREKYRQADVNKLYIRSDSYTWAEWAYTWY HLA-C06:36,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:37,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:38,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:39,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:40,YDSGYREKYRQADVNKLYLWYDSYTWAEWTYTWY HLA-C06:41,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:42,YDSGYREKYRQADVNKLYLWYDSYTRAEWAYTWY HLA-C06:43,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:44,YDSGYRENYRQTDVNKLYLWYDSYTWAEWAYTWY HLA-C06:45,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:47,YDSGYREKYRQADVNKLYLWSDSYTWAEWAYTWY HLA-C06:48,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:50,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:51,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:52,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:53,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:54,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:55,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:56,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:57,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:58,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:59,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:60,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:61,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:62,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:63,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:64,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:65,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:66,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:67,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:68,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:69,YDSGYREKYRQADENKLYLWYDSYTWAEWAYTWY HLA-C06:70,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:71,YDSGYPEKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:72,YDSGYREKYRQADVNKLYIVYDSYTWAEWAYTWY HLA-C06:73,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:75,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:76,YYAGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:77,YHSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:78,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:80,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:81,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:82,YDSGYREKYRQADVNNLYLWYDSYTWAEWAYTWY HLA-C06:83,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:84,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:85,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:86,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:87,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:88,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:89,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:90,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:91,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:92,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:93,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:94,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:95,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:96,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYLWY HLA-C06:97,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:98,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C06:99,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C0701,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C0702,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C0703,YDSGYREKYRQADVSNLYLRSDSYTWAALAYLWY HLA-C0704,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C0705,YDSGYREKYRQADVSNLYLNYDSYTLAALAYTWY HLA-C0706,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C0707,YDSGYRENYRQADVNKLYLRYDSYTLAALAYTWY HLA-C0708,YDSGYREKYRQADVSNLYLRFDSYTLAALAYTWY HLA-C0709,YDSGYRENYRQADVNKLYLRYDSYTLAALAYTWY HLA-C0710,YDSGYREKYRQADVSNLYIRSDSYTLAALAYTWY HLA-C0711,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C0712,YDSGYREKYRQADVSNLYFRYDFYTWAADAYTWY HLA-C0713,YDSGYREKYRQADVSNLYLRSDFYTLAALAYTWY HLA-C0714,YDSGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C0715,YDSGYREKYRQADVSNLYLRSDSYTLAALAYEWY HLA-C0716,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C0717,YDSGYREKYRQADVSNLYLRSDSYTWAALAYTWY HLA-C0718,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C0719,YDSGYRENYRQADVSNLYLRSDSYTLAALAYTWY HLA-C0720,YDAGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C0721,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C0722,YDSGYRENYRQADVSNLYLRYDSYTLAAWAYTWY HLA-C0723,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C0724,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C0725,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C0726,YYSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C0727,YDSGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C0728,YDSGYRENYRQADVSNLYLRYNFYTLAALAYTWY HLA-C0729,YDSGYREKYRQADVSNLYLRSDYYTLAALAYTWY HLA-C0730,YDSGYRENYRQADVSNLYLRYDSYTLAGLAYTWY HLA-C0731,YDSGYREKYRQADVSNLYLWYDSYTLAALAYTWY HLA-C0732,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTAP HLA-C0734,YDSGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C0735,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C0736,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C0737,YDSGYREKYRQADVSNLYLRSDSYTLAARAYTWY HLA-C0738,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:01,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:02,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:03,YDSGYREKYRQADVSNLYLRSDSYTWAALAYLWY HLA-C07:04,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:05,YDSGYREKYRQADVSNLYLNYDSYTLAALAYTWY HLA-C07:06,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:07,YDSGYRENYRQADVNKLYLRYDSYTLAALAYTWY HLA-C07:08,YDSGYREKYRQADVSNLYLRFDSYTLAALAYTWY HLA-C07:09,YDSGYRENYRQADVNKLYLRYDSYTLAALAYTWY HLA-C07:10,YDSGYREKYRQADVSNLYIRSDSYTLAALAYTWY HLA-C07:100,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:101,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:102,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:103,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:105,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:106,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:107,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:108,YDSGYRENYRQADVSNLYLRFDSYTLAALAYTWY HLA-C07:109,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:11,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:110,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:111,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:112,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:113,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:114,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:115,YDSGYRENYRQADVSDLYLRYDSYTLAALAYTWY HLA-C07:116,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:117,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:118,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:119,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:12,YDSGYREKYRQADVSNLYFRYDFYTWAADAYTWY HLA-C07:120,YDSGYRENYRQADVSNLYLRYDSYTLAALAYPWY HLA-C07:122,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:123,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:124,YDSGYRENYRQADESNLYLRYDSYTLAALAYTWY HLA-C07:125,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:126,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:127,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:128,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:129,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:13,YDSGYREKYRQADVSNLYLRSDFYTLAALAYTWY HLA-C07:130,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:131,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:132,DDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:133,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:134,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:135,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:136,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:137,YDSGYREKYRQADVSNLYLRSDSYTLAALTYTWY HLA-C07:138,YDSGYREKYRQADVSNLYLRSDSYTLAAWAYTWY HLA-C07:139,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:14,YDSGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:140,YDSGYRENYRQADVSNLYLRYDSYTWAVDAYTWY HLA-C07:141,YDSGYRENYRQADVSNLYLRYDSYTWAALAYTWY HLA-C07:142,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:143,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:144,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:145,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:146,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:147,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:148,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:149,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:15,YDSGYREKYRQADVSNLYLRSDSYTLAALAYEWY HLA-C07:151,YDSGYRENYRQADVSNLYLRYDSYTLAADAYTWY HLA-C07:153,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:154,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:155,YDSGYREKYRQADESNLYLRSDSYTLAALAYTWY HLA-C07:156,YDSGYRENYRQAHVSNLYLRYDSYTLAALAYTWY HLA-C07:157,YDSGYREKYRQADVSNLYLKSDSYTLAALAYTWY HLA-C07:158,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:159,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:16,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:160,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:161,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:162,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:163,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:165,YDSGYRENYRQADVSNLYLRYDSYTLAELAYTWY HLA-C07:166,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:167,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:168,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:169,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:17,YDSGYREKYRQADVSNLYLRSDSYTWAALAYTWY HLA-C07:170,YDSGYRENYRQADVSNLYLRYDSYTYAALAYTWY HLA-C07:171,YDSGYREKYRQADVSNLYLRSDSYTYAALAYTWY HLA-C07:172,YDAGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:173,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:174,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:175,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:176,YDSGYRENYRQADVSNLYLRYDSYTLAARAYTWY HLA-C07:177,YDSGYREKYRQTDVSNLYLWCDYYTLAALAYTWY HLA-C07:178,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:179,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:18,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:180,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:181,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:182,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:183,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:184,YDSGYREKYRQADVSNLYIRYDYYTLAALAYTWY HLA-C07:185,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:186,YDSGYREKYRQADVSNLYLRSDSYTLAALAYLWY HLA-C07:187,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:188,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:189,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:19,YDSGYRENYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:190,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:192,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:193,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:194,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:195,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:196,YDSGYRENYRQADVSNLYIRYDSYTLAALAYTWY HLA-C07:197,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:199,YDSGYREKYRQADVSNLYLRYDFYTLAADAYTWY HLA-C07:20,YDAGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:200,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:201,YDSGYRENYRQADVSNLCLRYDSYTLAALAYTWY HLA-C07:202,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:203,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:204,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:205,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:206,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:207,YDSGYRENYRQADVSNLYLRYDSYTLAALAYEWY HLA-C07:208,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:209,YDSAYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:21,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:210,YDSGYRENYRQTDVNNLYLRYDSYTLAALAYTWY HLA-C07:211,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:212,YDSGYRENYRQADVSNLYLRYDSYTLAALAYLWY HLA-C07:213,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:214,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:215,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:216,YDSGYREKYRQADVSNLYLRSDSYTLAAQAYTWY HLA-C07:217,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:218,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:219,YDSGYRENYRQADVSNLYLRYESYTLAALAYTWY HLA-C07:22,YDSGYRENYRQADVSNLYLRYDSYTLAAWAYTWY HLA-C07:220,YDSGYREKYRQADVSNLYLRSDSYTLAALAYKWY HLA-C07:221,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:222,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:223,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:224,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:225,YDSGYRENYCQADVSNLYLRYDSYTLAALAYTWY HLA-C07:226,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:228,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:229,YDSGYQEKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:23,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:230,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:231,YDSGYRENYRQADVSNLYLRYDDYTLAALAYTWY HLA-C07:232,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:233,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:234,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:236,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:237,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:238,YDSGYREKYRQTDVNNLYLRSDSYTLAALAYTWY HLA-C07:239,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:24,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:240,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:241,YDSGYREKYRQADVSNLYLRSDSYTLAELAYTWY HLA-C07:242,YDSGYREKYRQADVSNLYLRSDSYTWAELAYLWY HLA-C07:243,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:244,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:245,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:246,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:247,YDSGYRENYRQADVNNLYLRYDSYTLAALAYTWY HLA-C07:248,YDSGYRENYRQADVSNLYLRYDYYTLAALAYTWY HLA-C07:249,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:25,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:250,YDSGYRENYRQADVSNLYLRCDSYTLAALAYTWY HLA-C07:251,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:252,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:253,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:254,YDSGYRENYRQADVSNLHLRYDSYTLAALAYTWY HLA-C07:255,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:256,YDSGYRENYRQADVSNLYLRYDSCTLAALAYTWY HLA-C07:257,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:258,YDSGYREKYRQADVSNLYLRADSYTLAALAYTWY HLA-C07:259,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:26,YYSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:260,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:261,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:262,YDSGYWEKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:263,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:265,YDSGYREKYRQADVSNLYLRSDSYTLAELAYLWY HLA-C07:266,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:267,CDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:268,YDSGYRENYRQADVSNLNLRYDSYTLAALAYTWY HLA-C07:269,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:27,YDSGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:270,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:271,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:272,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:273,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:274,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:275,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:276,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:277,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:278,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:279,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:28,YDSGYRENYRQADVSNLYLRYNFYTLAALAYTWY HLA-C07:280,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:281,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:282,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:283,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:284,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:285,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:286,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:287,YDSGYREKYRQADVSNLYLRSDSYILAALAYTWY HLA-C07:288,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:289,YDSGYREKYRQADVSNLYLRSDLYTLAALAYTWY HLA-C07:29,YDSGYREKYRQADVSNLYLRSDYYTLAALAYTWY HLA-C07:290,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:291,YDSGYREKYCQADVSNLYLRSDSYTLAALAYTWY HLA-C07:292,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:293,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:294,YDSGYREKYRQADVSNLYLSYDSYTLAALAYTWY HLA-C07:296,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:297,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:298,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:299,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:30,YDSGYRENYRQADVSNLYLRYDSYTLAGLAYTWY HLA-C07:300,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:301,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:302,YDSGYREKYRQADVSNLYFRSDSYTLAADAYTWY HLA-C07:303,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:304,YDSGYRENYRQADVSNLYLRYDSYTWAELAYTWY HLA-C07:305,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:306,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:307,YDSGYREKYRQADVSNLYLRSDSYTWAERAYTWY HLA-C07:308,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:309,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:31,YDSGYREKYRQADVSNLYLWYDSYTLAALAYTWY HLA-C07:310,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:311,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:312,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:313,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:314,YYSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:315,YDSGYREKYRQADVNKLYLRYDSYTLAALAYTWY HLA-C07:316,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:317,YYSGYRENYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:318,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:319,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:320,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:321,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:322,CDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:323,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:324,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:325,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:326,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:327,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:328,YDSGYREKYRQTDVNKLYFRYDFYTLAADAYTWY HLA-C07:330,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:331,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:332,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:333,YDSGYREKYRQADVSNLYLRSDSYTLAALAYRWY HLA-C07:334,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:335,YDSGYREKYAQTDVSNLYLRSDSYTLAALAYTWY HLA-C07:336,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:337,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:338,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:339,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:340,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:341,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:342,YDSGYREKYRQADVSNLYLRSDSYTLAVLAYTWY HLA-C07:343,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:344,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:345,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:346,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:348,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:349,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:35,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:351,YYSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:352,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:353,YDSGYRENYRQADVSNLYLKYDSYTLAALAYTWY HLA-C07:354,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:355,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:356,YDSEYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:357,YDSGYREKYRQADVTNLYFRYDFYTLAADAYTWY HLA-C07:358,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:359,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:36,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:360,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:361,YDSGYREKYRQADVSHLYFRYDFYTLAADAYTWY HLA-C07:362,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:363,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:364,YDSGYREKYRQADVSNLYLWCDFYTLAADAYTWY HLA-C07:365,YDSGYREKYRQADVSNLYFRYDFYTLAADAYRWY HLA-C07:366,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:367,YDSGYREKYRQADVSNLYIRSDSYTLAALAYTWY HLA-C07:368,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:369,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:37,YDSGYREKYRQADVSNLYLRSDSYTLAARAYTWY HLA-C07:370,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:371,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:372,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:373,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:374,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:375,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:376,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:377,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:378,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:379,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:38,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:380,YDSGYRENHRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:381,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:382,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:383,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:384,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:385,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:386,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:387,YDSGYQENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:388,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:389,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:39,YDSGYREKYRQTDVSNLYLRSDSYTLAALAYTWY HLA-C07:390,YDAGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:391,YDSGYREKHRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:392,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:394,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:395,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:396,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:397,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:398,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:399,YDSGYREKYRQADVSNLYLRSDSYPLAALAYTWY HLA-C07:40,YDSGYRENYRQTDVSNLYLRYDSYTLAALAYTWY HLA-C07:400,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:401,YDSVYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:402,YSSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:403,YDSGYREKYRQADVNNLYFRYDFYTLAADAYTWY HLA-C07:404,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:405,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:406,YDSGYREKYRQADVNKLYFRYDFYTLAADAYTWY HLA-C07:407,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:408,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:409,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:41,YDSGYREKYRQADVSNLYLRYNFYTWAERAYTWY HLA-C07:410,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:411,YDSGYRENYHQADVSNLYLRYDSYTLAALAYTWY HLA-C07:412,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:413,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:414,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:415,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:416,YDSGYREKYRQADLSNLYLRSDSYTLAALAYTWY HLA-C07:417,YDSGYLENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:418,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:419,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:42,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:420,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:421,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:422,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:423,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:424,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:425,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:426,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:427,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:428,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:429,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:43,YDSGYREKYRQADVSNLYIRYDSYTLAALAYTWY HLA-C07:430,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:431,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:432,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:433,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:434,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:435,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:436,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:438,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:439,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:44,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:440,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:441,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:442,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:443,YDSGYRENYRQADVSNLYLRYDSYTLAALASTWY HLA-C07:444,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:445,YDSGYRENYSQADVSNLYLRYDSYTLAALAYTWY HLA-C07:446,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:447,YDSGYREKYRQADVSNLYFRYDFYTWAEWAYTWY HLA-C07:448,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:449,YNSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:45,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:450,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:453,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:454,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:455,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:456,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:457,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:458,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:459,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:46,YDSEYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:460,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:461,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:462,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:463,YDSGYRENYRQADVSNLYWRYDSYTLAALAYTWY HLA-C07:464,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:465,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:466,YDSGYREKYRQADVSNLYFRYDFYTLAADAYKWY HLA-C07:467,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:468,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:469,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWF HLA-C07:47,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:470,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:471,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:472,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:473,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:474,YDSGYREKYRQADVSNLYLRSDSYTLTALAYTWY HLA-C07:475,YDSGYWENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:477,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:478,YDSGYREKYRQADVSNQYLRSDSYTLAALAYTWY HLA-C07:479,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:48,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:480,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:481,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:482,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:485,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:486,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:487,YDSGYREKYRQADVSNLYFRYDFYTLAVDAYTWY HLA-C07:488,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:489,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:49,YDSGYREKYRQADVNNLYLRSDSYTLAALAYTWY HLA-C07:490,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:492,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:493,YDSGYRENYRQGDVSNLYLRYDSYTLAALAYTWY HLA-C07:495,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:496,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:497,YDSGYREKYRQADVSNLYLRSDSCTLAALAYTWY HLA-C07:498,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:499,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:50,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:500,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:501,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:502,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:503,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:504,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:505,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:506,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:508,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:509,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:51,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:510,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:511,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:512,YDSGYRENYRQADVSNLYLRYDSYTWAERAYTWY HLA-C07:514,YDSGYRENYRQADVSNLYLWYDSYTLAALAYTWY HLA-C07:515,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:516,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWH HLA-C07:517,FDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:518,YDSGYREKDRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:519,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:52,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:520,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:521,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWH HLA-C07:522,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:523,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:524,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:525,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:526,YDSGYRENYRQADVSNLYLSYDSYTLAALAYTWY HLA-C07:527,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:528,YDSGYRENYRRADVSNLYLRYDSYTLAALAYTWY HLA-C07:529,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:53,YDSGYRENYRQADVSNLYLRYDSYTLAAQAYTWY HLA-C07:530,YDSGYREKYRQADVSNLYLSSDSYTLAALAYTWY HLA-C07:531,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:532,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:533,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:534,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:535,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:536,YDSGYRENYRQADVSNLYLRYNLYTLAALAYTWY HLA-C07:537,YDSGYRENYRQADVSNLYLRYDSYTLAALAYRWY HLA-C07:538,YDSGYREKYRQADVSNLYLNYDSYTLAALAYTWY HLA-C07:539,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:54,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:540,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:541,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:542,YDSGYREKYRQADVSNLYLRSDSYTLSALAYTWY HLA-C07:543,YDSGYREKYRQADVSNLYLRSDSYTLAALAYMWY HLA-C07:544,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:545,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:546,YDSEYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:547,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:548,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:549,YDSGYRENYRQADVSNLYLRYVSYTLAALAYTWY HLA-C07:550,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:552,YDSGYREKYRQADVSNLYFRYDFYTLAALAYTWY HLA-C07:553,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:554,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:555,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:556,YDSGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:557,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:558,YDSGYREKYRQADVSNLYLRCDSYTLAALAYTWY HLA-C07:559,YDSGYRENYRQADVSKLYLRYDSYTLAALAYTWY HLA-C07:56,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:560,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:561,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:562,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:563,YDSGYREKYRQTDVSNLYFRYDFYTLAADAYTWY HLA-C07:564,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:565,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:566,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:567,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:568,YDSGYRENYRQADVSNLYIRFDSYTLAALAYTWY HLA-C07:569,YDSGYREKYRQADVSNLYFRYDFYTLVADAYTWY HLA-C07:57,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:570,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:571,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:572,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:573,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:574,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:575,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:576,YDSGYREKYRQADVSNVYLRSDSYTLAALAYTWY HLA-C07:577,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:578,YYAGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:579,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:58,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:580,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:581,YDSGYPENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:583,YYAGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:584,YDSGNREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:585,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:586,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:587,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:588,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:589,YDSGYRENYRQADVSNLYFRYDSYTLAALAYTWY HLA-C07:59,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:590,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:591,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:592,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:594,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:595,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:596,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:597,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:598,YDSGYREKYRQADVNKLYLRSDSYTLAALAYTWY HLA-C07:599,YDSGYREKYRQADVSNLYLRSDSYTWAVLAYTWY HLA-C07:60,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:601,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:602,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:604,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:605,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:606,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:607,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:608,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:609,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:610,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:611,YDSGYREKYRQADVSNLYFRSDSYTLAALAYTWY HLA-C07:612,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:613,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:614,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:615,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:616,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:617,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:618,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:619,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:62,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:620,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:621,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:622,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:623,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:624,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:625,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:626,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:627,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:628,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:629,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:63,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:630,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWC HLA-C07:631,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:634,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:635,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:636,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:637,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:638,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:639,YDSGYRENYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:64,YSAGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:640,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:641,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:642,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:643,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:644,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:645,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:646,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:647,YDSGYRENYRQADVSNLYLRYDSYNLAALAYTWY HLA-C07:648,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:649,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:65,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:650,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:651,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:652,YDSGYRENYRQADVSNLYLRYDSYTLAAPAYTWY HLA-C07:653,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:654,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:655,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:656,YDSGYREKYRQADVSKLYFRYDFYTLAADAYTWY HLA-C07:657,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:658,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:659,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:66,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:660,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:661,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:662,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:664,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:665,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:666,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:667,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:668,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:669,YDSGYRENYRQADMSNLYLRYDSYTLAALAYTWY HLA-C07:67,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:670,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:671,YDSGYRENYRQADVSNLYLRYDSYTWAELAYLWY HLA-C07:673,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:674,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:676,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:677,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:678,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:679,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:68,YDSGYREKYRQADVSNLYLRSDSYTLAADAYTWY HLA-C07:680,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:681,YDSGYREKYRQADVSNLYLSYDSYTLAALAYTWY HLA-C07:682,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:683,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:684,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:685,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:687,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:688,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:689,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:69,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:691,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:692,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:693,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:694,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:695,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:696,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:698,YDSVYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C07:699,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:70,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:700,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:701,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:703,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:704,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:705,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:706,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:707,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:708,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:709,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:71,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:710,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:711,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:712,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:713,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:714,YHSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:715,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:716,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:717,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:718,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:719,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:72,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:720,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:721,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:722,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:723,YYAGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:724,YHSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:73,YDAGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:74,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:75,YDSGYREKYRQADVSNLHLRSDSYTLAALAYTWY HLA-C07:76,YDSGYREKYRQADVNKLYLRSDSYTLAALAYTWY HLA-C07:77,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:78,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:79,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:80,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:81,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:82,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:83,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:84,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:85,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:86,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:87,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:88,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:89,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:90,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:91,YDSGYRENYRQADVSNLYLRYDSYTLTALAYTWY HLA-C07:92,YYAGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:93,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:94,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:95,YDSGYRENYRQADVSNLYLRYDSYTLAVLAYTWY HLA-C07:96,YYAGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C07:97,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C07:99,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C0801,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C0802,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C0803,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C0804,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY HLA-C0805,YYAGYREKYRQADVSNLYLRYNFYTWAERAYTWY HLA-C0806,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYAWY HLA-C0807,YYAGYREKYRQTDVSNLYLRYNFYTLAERAYTWY HLA-C0808,YYAGYREKYRQTDVSNLYLSYNFYTWATLAYTWY HLA-C0809,YYAGYREKYRQTDVSNLYLRYDSYTWATLAYTWY HLA-C0810,YYAGYREKYRQTDVNKLYLRYNFYTWATLAYTWY HLA-C0811,YYAGYREKYRQTDVSNLYLRYDSYTWATLAYTWY HLA-C0812,YYAGYREKYRQTDVSNLYLWYNFYTWAERAYTWY HLA-C0813,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY HLA-C0814,YYSGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:01,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:02,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:03,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:04,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY HLA-C08:05,YYAGYREKYRQADVSNLYLRYNFYTWAERAYTWY HLA-C08:06,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYAWY HLA-C08:07,YYAGYREKYRQTDVSNLYLRYNFYTLAERAYTWY HLA-C08:08,YYAGYREKYRQTDVSNLYLSYNFYTWATLAYTWY HLA-C08:09,YYAGYREKYRQTDVSNLYLRYDSYTWATLAYTWY HLA-C08:10,YYAGYREKYRQTDVNKLYLRYNFYTWATLAYTWY HLA-C08:100,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYKWY HLA-C08:101,YYAGYREKYRQTDVSNLYLRFNFYTWATLAYTWY HLA-C08:102,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:103,YYSGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:104,YYAGYREKYRQTDVSNLYLRYNFYTLAELAYTWY HLA-C08:105,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:106,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:107,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:108,YYAGYREKYRQTDVSNLYLRYDFYTWAERAYTWY HLA-C08:109,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:11,YYAGYREKYRQTDVSNLYLRYDSYTWATLAYTWY HLA-C08:110,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:111,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:112,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:113,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYTWY HLA-C08:114,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWH HLA-C08:115,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYLWY HLA-C08:116,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:117,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:118,YYAGYREKYRQTDVSNLYLRYNFYTWATRAYTWY HLA-C08:119,CYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:12,YYAGYREKYRQTDVSNLYLWYNFYTWAERAYTWY HLA-C08:120,YYAGYREKYRQTDVSNLHLRYNFYTWAERAYTWY HLA-C08:122,YYAGYPEKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:123,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:124,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:125,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:126,YYAGYREKYRQTDVSNLYIWYNFYTWAERAYTWY HLA-C08:128,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:13,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY HLA-C08:131,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:132,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:133,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:134,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:135,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:136,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:137,YYAGYREKYRQADVSNLYLRYNFYTWATLAYTWY HLA-C08:138,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYLWY HLA-C08:139,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY HLA-C08:14,YYSGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:140,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:142,YYAGYREKYRQTDVSNLYLRYNFYTWAEDAYTWY HLA-C08:143,YYAGYREKYRQTDVSNLYLRFNFYTWATLAYTWY HLA-C08:144,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:145,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:146,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:147,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:148,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:149,YYAGYREKYRQTDVSNLYLRYNFYTWAARAYTWY HLA-C08:15,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:150,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:151,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:152,YYAGYREKYRQTDVSNLYLRYDSYTWAERAYTWY HLA-C08:153,YYAGYWEKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:154,YYAGYREKYRQTDVSNLYLRCNFYTWATLAYTWY HLA-C08:155,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:156,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:157,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:158,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:159,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:16,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:160,YYAGYREKYRQTDVSNLYLRYNFYTWAEWAYTWY HLA-C08:162,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:163,YSAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:164,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:165,YYAGYREKYRQTDVSNLYLRYNFYTWAVLAYTWY HLA-C08:166,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:167,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:168,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY HLA-C08:169,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:17,YYAGYREKYCQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:170,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:171,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:172,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:174,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:175,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:176,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:177,YYAGYREKYRQTDVSNLYLRYNFYTWAMLAYTWY HLA-C08:178,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:18,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:19,YYAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C08:20,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:21,YYAGYREKYRQADVSNLYLRYNFYTWATLAYTWY HLA-C08:22,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:23,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:24,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:25,YYAGYREKYRQADVSNLYLRYNFYTWAERAYTWY HLA-C08:27,YYAGYREKYRQTDVSNLYLRYNFYTWAEWAYTWY HLA-C08:28,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:29,YYAGYREKYRQTDVSNLYLRYNFYTWAEWAYTWY HLA-C08:30,YYAGYREKYRQTDVSNLYLRYNFYTWPERAYTWY HLA-C08:31,YYAGYREKYRQTDVSNLYLRYNFYTWAEWAYEWY HLA-C08:32,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:33,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:34,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:35,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:37,YDAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:38,YYAGYREKYRQTDVSNLYLRSNFYTWATLAYTWY HLA-C08:39,YYAGYREKYRQTDVSNLYLRYNFYTWAVLAYTWY HLA-C08:40,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:41,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYLWY HLA-C08:42,YYAGYREKYRQTDVSNLYLRYKFYTWATLAYTWY HLA-C08:43,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWC HLA-C08:44,YYAGYREKYRQTDVSNLYIRYNFYTWATLAYTWY HLA-C08:45,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:46,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:47,YYAGYREKYRQTDVSNLYLRYNFYTLAARAYTWY HLA-C08:48,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:49,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:50,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:51,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWH HLA-C08:53,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:54,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY HLA-C08:56,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:57,YYAGYREKYRQTDVSNLYLRYNFYTWAALAYTWY HLA-C08:58,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:59,YYAGYREKYRQTDVSNLYLRYNSYTWATLAYTWY HLA-C08:60,YYAGYREKYRQTDVSNLYLKYNFYTWATLAYTWY HLA-C08:61,YYAGYREKYRQTDVSNLYIRYNFYTWATLAYTWY HLA-C08:62,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:63,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:65,YYAGYREKYRQTDVSNLYLRYNFYTWASLAYTWY HLA-C08:66,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY HLA-C08:67,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:68,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:69,YYAGYQEKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:71,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:72,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:73,YYAGYREKYRQTDESNLYLRYNFYTWAERAYTWY HLA-C08:74,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:75,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:76,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:77,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:78,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:79,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:80,YYSGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:81,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:82,YYAGYREKYRQTDVSNLYIRYNFYTWATLAYTWY HLA-C08:83,YYAGYREKYRQTDVSNLYLRYDFYTWATLAYTWY HLA-C08:84,YYAGYREKYRQTDVSNLYLRYNFYTSATLAYTWY HLA-C08:85,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:86,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:87,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:90,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:91,YYAGYRQKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:92,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:93,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTSY HLA-C08:94,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C08:95,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:96,YYARYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:97,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C08:98,YYAGYREKYRQTDVSNLYLRYNFYTWATLGYTWY HLA-C08:99,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C1202,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C1203,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C1204,YYAGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C1205,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYTWY HLA-C1206,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C1207,YYAGYREKYRQADVGNLYLWYDSYTWAEWAYTWY HLA-C1208,YYAGYRENYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C1209,YYAGYREKYRQTDVNKLYLWYDSYTWAERAYTWY HLA-C1210,YYAGYREKYRQADVSNLYLRFDSYTWAEWAYTWY HLA-C1211,YYAGYREKYRQADVSNLYLWSDSYTWAEWAYTWY HLA-C1212,YYAGYREKYRQADESNLYLWYDSYTWAEWAYTWY HLA-C1213,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C1214,YYAGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C1215,YYAGYREKYRQADVSNLYLWYDLYTWAEWAYTWY HLA-C1216,YDSGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C1217,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:02,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:03,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:04,YYAGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C12:05,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYTWY HLA-C12:06,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:07,YYAGYREKYRQADVGNLYLWYDSYTWAEWAYTWY HLA-C12:08,YYAGYRENYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:09,YYAGYREKYRQTDVNKLYLWYDSYTWAERAYTWY HLA-C12:10,YYAGYREKYRQADVSNLYLRFDSYTWAEWAYTWY HLA-C12:100,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:101,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:102,YYAGYREKYRQADVSNLYLWYDSYAWAEWAYTWY HLA-C12:103,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:106,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYLWY HLA-C12:107,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:108,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:109,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:11,YYAGYREKYRQADVSNLYLWSDSYTWAEWAYTWY HLA-C12:110,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:111,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:112,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:113,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:114,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:115,CYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:116,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:117,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:118,YYAGYREKYRQADVSNLYLRSDSYTWAEWAYTWY HLA-C12:119,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYEWY HLA-C12:12,YYAGYREKYRQADESNLYLWYDSYTWAEWAYTWY HLA-C12:120,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:121,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:122,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYLWY HLA-C12:123,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:124,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:125,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:126,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:127,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:128,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:129,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:13,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:130,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:131,YYAGYQEKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:132,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:133,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:134,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:135,YYAGYREKYRQADVSKLYLWYDSYTWAEWAYTWY HLA-C12:136,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:137,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:138,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:139,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:14,YYAGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C12:140,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:141,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:142,FYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:143,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:144,YYAGYREKYRQADVSNLYLWYNFYTWAEWAYTWY HLA-C12:145,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:146,YYAGYREKYRQADVNKLYLRYDSYTWAEWAYTWY HLA-C12:147,YDSGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:149,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:15,YYAGYREKYRQADVSNLYLWYDLYTWAEWAYTWY HLA-C12:150,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:151,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:152,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:153,YYAGYREKYRQADVSNLYLWYDSYTWAEWVYTWY HLA-C12:154,YYAGYREKYRQADVSKLYLWYDSYTWAEWAYTWY HLA-C12:156,YYAGYREKYRQADVSNLYLWFDSYTWAEWAYTWY HLA-C12:157,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:158,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYMWY HLA-C12:159,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:16,YDSGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:160,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:161,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:162,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:163,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:164,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:165,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:166,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:167,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:168,YYAGYREKYRQADVSNLYLTYDSYTWAEWAYTWY HLA-C12:169,YYAGYREKYRQADVSNLYLRYDSYTWATLAYTWY HLA-C12:17,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:170,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:171,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:172,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:173,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:174,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:175,YYAGYREKYRQADVSNLYLWYDSYTWAVLAYTWY HLA-C12:176,YYAGYREKYRQADVSNLYLWYDSYTLAAWAYTWY HLA-C12:177,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:178,YYAGYREKYRQADVSNLYLWCDSYTWAEWAYTWY HLA-C12:179,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:18,YYAGYREKYRQADVSNLYLRYDSYTWAELAYTWY HLA-C12:180,YYAGYREKYRQADVSNLYLWYDSYTWAVWAYTWY HLA-C12:181,YYAGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C12:182,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:183,YYAGYREKYRQADVSNLYWTYDSYTWAEWAYTWY HLA-C12:184,YYAEYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:185,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:186,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:187,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:188,YYAGYRENYRQTDVNNLYLRYDSYTWAEWAYTWY HLA-C12:189,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:19,YYAGYREKYRQADVSNLYLWYDSYTWAECAYTWY HLA-C12:190,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:191,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:192,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:193,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:194,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:195,YDAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:196,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:197,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:198,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYEWY HLA-C12:199,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:20,YYAGYREKYRQADVSNLYLWYDSYTWAELAYTWY HLA-C12:200,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:201,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:202,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:203,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:204,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:205,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:206,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:207,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:208,YYAGYREKYRQADVSNLYLRYDLYTWAEWAYTWY HLA-C12:209,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:21,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYTWY HLA-C12:210,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:211,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:212,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:213,YYAGYREKYRQADVSNLYLWYDSYIWAEWAYTWY HLA-C12:214,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:215,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:216,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:217,YDAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:218,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:22,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:220,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:221,YYAGYREKYRQADVSNLYLRHDSYTWAEWAYTWY HLA-C12:222,YYAGYREKYRQADVSNLYLRYDYYTWAEWAYTWY HLA-C12:223,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:224,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:225,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:226,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:227,YYSGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:228,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:229,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:23,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:230,YYAGYREKYRQADVSNLCLWYDSYTWAEWAYTWY HLA-C12:231,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:233,YYAGYREKYRQADVSNLYLRFNFYTWAERAYTWY HLA-C12:234,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:235,YYAGYREKYRQADVSNLYLWYDYYTWAEWAYTWY HLA-C12:237,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:238,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:239,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:24,YYAGYREKYRQADVSNLYLWYDSYTWAERAYTWY HLA-C12:240,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:241,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:242,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:243,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:244,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:245,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:246,YYAGYREKYRQADLSNLYLWYDSYTWAEWAYTWY HLA-C12:247,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:248,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:249,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:25,YYAGYPEKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:250,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:251,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:252,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:253,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:254,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:255,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:256,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:257,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:258,YYAGYREKYRQADVSNLYLGYDSYTWAEWAYTWY HLA-C12:259,YYAGYREKYRQADVSNLYLWYDSDTWAEWAYTWY HLA-C12:26,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:260,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:261,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:262,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:263,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:264,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:265,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:266,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:267,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:27,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:28,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:29,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:30,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:31,YYAGYREKYRQADVSNLYLWYNFYTWAEWAYTWY HLA-C12:32,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:33,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYTWY HLA-C12:34,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:35,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:36,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:37,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:38,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:40,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:41,YYAGYREKYRQADVNKLYLRYDSYTWAEWAYTWY HLA-C12:43,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:44,YYAGYREKYRQADVSNLYIRYDSYTWAEWAYTWY HLA-C12:45,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:47,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:48,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:49,YYAGYREKYRQTDVSNLYLRYDSYTWAEWAYTWY HLA-C12:50,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:51,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:52,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:53,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:54,YYAGYREKYRQADVNNLYLWYDSYTWAEWAYTWY HLA-C12:55,YSAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:56,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:57,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:58,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:59,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:60,YYAGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C12:61,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:62,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:63,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:64,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:65,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:66,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:67,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:68,YYAGYLEKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:69,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:70,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:71,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:72,YYAGYREKYRQADVSKLYLRYDSYTWAEWAYTWY HLA-C12:73,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:74,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:75,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:76,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:77,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:78,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:79,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:81,YYAGYRENYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:82,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:83,YYAGYREKYRQADVSNLYLRYDSYTWAELAYLWY HLA-C12:85,YYAGYREKYRQADVSNLYLRYDSYTWAERAYTWY HLA-C12:86,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:87,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWH HLA-C12:88,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:89,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:90,YYAGYREKYGQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:91,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:92,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:93,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:94,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:95,YYAGYWEKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:96,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C12:97,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C12:98,YYAGYREKYRQTDVSNLYLWYDSYTWAEWAYTWY HLA-C12:99,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C1402,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C1403,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C1404,YSAGYREKYRQADVNNLYLWFDSYTWAERAYTWY HLA-C1405,YSAGYREKYRQTDVSNLYLWYDSYTWAERAYTWY HLA-C1406,YSAGYREKYRQTDVSNLYLWFDSYTWAELAYTWY HLA-C1407,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:02,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:03,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:04,YSAGYREKYRQADVNNLYLWFDSYTWAERAYTWY HLA-C14:05,YSAGYREKYRQTDVSNLYLWYDSYTWAERAYTWY HLA-C14:06,YSAGYREKYRQTDVSNLYLWFDSYTWAELAYTWY HLA-C14:08,YSAGYREKYRQTDVSNLYPWFDSYTWAERAYTWY HLA-C14:09,YSAGYREKYRQTDVSNLYLRYDSYTWAERAYTWY HLA-C14:10,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:100,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:101,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:102,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:103,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:104,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:11,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:12,YSAGYREKYRQTDVNKLYLWFDSYTWAERAYTWY HLA-C14:13,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:14,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:15,YSAGYREKYRQTDVSNLYLWFDSYTWAALAYTWY HLA-C14:16,YSAGYREKYRQTDVSNLYLWFDSYTWAEWAYTWY HLA-C14:17,YSAGYREKYRQTDVSNLYLWFDSYTLAARAYTWY HLA-C14:18,YSSGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:19,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:20,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYLWY HLA-C14:22,YSARYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:23,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:24,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:25,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYEWY HLA-C14:26,YSAGYREKYRQTDVSNLYLWFDFYTWAERAYTWY HLA-C14:27,YSARYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:28,YSAGYREKYRQTDVSNLYLRFDSYTWAERAYTWY HLA-C14:29,YSAGYREKYRQTDVSNLYLWFDSYTRAERAYTWY HLA-C14:30,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:31,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:32,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:33,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:34,CSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:36,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:37,YSAGYRKKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:38,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYMWY HLA-C14:39,YSAGYQEKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:40,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:41,CSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:42,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:43,YSAGYREKYRQTDVSNLYLWFDSYPWAERAYTWY HLA-C14:44,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:45,YSAGYREKYRQTDVSNLYLWCDSYTWAERAYTWY HLA-C14:46,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:48,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:49,YSAGYREKYRQADVNKLYLWFDSYTWAERAYTWY HLA-C14:50,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:51,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:52,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:53,YSAGYREKYRQTDVSNLYLWFDSYTWAVLAYTWY HLA-C14:54,YSAGYREKYRQTDVSNLYIRYDYYTWAERAYTWY HLA-C14:55,YSAGYREKYRQTDVSNLYLWFDYYTWAERAYTWY HLA-C14:56,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:57,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:58,YFAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:59,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:60,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:61,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTSY HLA-C14:62,YSAGYREKYGQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:63,YSAGYREKYRQTDVSNLYLWFDSYTWAERTYTWY HLA-C14:64,YSAGYREKYRQADVNNLYLWFDSYTWAERAYTWY HLA-C14:65,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:66,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:67,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:68,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:69,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:70,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:71,YSAGYREKYRQTDVSNLYLWFDSYTWAVRAYTWY HLA-C14:72,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:73,YSAGYRENYRQADVSNLYLWFDSYTWAERAYTWY HLA-C14:74,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:75,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:76,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWH HLA-C14:77,YSAGYREKYRQADVNNLYLWFDSYTWAELAYTWY HLA-C14:78,YTAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:79,YSAGYREKYRQTDVSNLYLWFDDYTWAERAYTWY HLA-C14:80,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:81,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:82,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:83,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:84,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:85,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:86,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:87,YSAGYREKYRQTDVSNLYLWFDSYTWATLAYTWY HLA-C14:88,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:89,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:90,YSAGYREKYRQTDVSNLYLWFDSYTWAEQAYTWY HLA-C14:91,YSAGYREKYRQTDVSNLYLWFDSYTWAERAHTWY HLA-C14:92,YSAGYREKYRQTDVSNLYWTYNYYTWAERAYTWY HLA-C14:94,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:95,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:96,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C14:98,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C1502,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C1503,YYAGYRENYRQADVNKLYIRYDLYTWAELAYTWY HLA-C1504,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C1505,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C1506,YYAGYRENYRQTDVNKLYIRYDYYTWAELAYTWY HLA-C1507,YYAGYRENYRQTDVSNLYIRYDLYTWAELAYTWY HLA-C1508,YYAGYRENYRQTDVNKLYIRYDLYTWAERAYTWY HLA-C1509,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C1510,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C1511,YYAGYREKYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C1512,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C1513,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C1514,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C1515,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYLWY HLA-C1516,YYAGYREKYRQADVNKLYIRYDLYTWAELAYTWY HLA-C1517,YYAGYREKYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:02,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:03,YYAGYRENYRQADVNKLYIRYDLYTWAELAYTWY HLA-C15:04,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C15:05,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:06,YYAGYRENYRQTDVNKLYIRYDYYTWAELAYTWY HLA-C15:07,YYAGYRENYRQTDVSNLYIRYDLYTWAELAYTWY HLA-C15:08,YYAGYRENYRQTDVNKLYIRYDLYTWAERAYTWY HLA-C15:09,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C15:10,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:100,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:101,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:102,YYAGYRENYRQTDVNKLYLWCDYYTWAERAYTWY HLA-C15:103,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:104,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:106,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:107,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C15:108,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:109,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:11,YYAGYREKYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:110,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:111,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYEWY HLA-C15:112,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:113,YYSGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:114,YYARYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:116,YYAGYRENYRQTDVSKLYIRYDFYTWAELAYTWY HLA-C15:117,YYAGYRENYRQTDVNKLYIRYDFYTWAVLAYTWY HLA-C15:118,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:119,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:12,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:120,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:121,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:123,YYAGYRENYRQTDVNKLYISYDLYTWAELAYTWY HLA-C15:124,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:125,YYAGYRENYRQTDVNKLYLWYDFYTWAELAYTWY HLA-C15:126,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C15:127,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:128,YYAGYRENYRQTDVNKLYIRYNLYTWAELAYTWY HLA-C15:129,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:13,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:130,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWH HLA-C15:131,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:132,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:133,YYAGYRENYRQTDVNKLYIWYDLYTWAELAYTWY HLA-C15:134,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:135,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:136,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:137,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:138,YDAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:139,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:140,YYAGYRENYRQTDVNKLYISYDFYTWAELAYTWY HLA-C15:141,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:142,YYAGYRENYRQTDVNKLYIRYELYTWAELAYTWY HLA-C15:143,YYAGYRENYRQTDVNKLYIRYDSYTWAERAYTWY HLA-C15:144,YYAGYRENYRQTDVSNLYIRYDLYTWAELAYTWY HLA-C15:146,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:147,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:148,YYAGYRENYRQTDVNKLYIRYDFYTWAERAYTWY HLA-C15:149,YYAGYRENYRQTDVNKLYFRYDLYTWAELAYTWY HLA-C15:15,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYLWY HLA-C15:150,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:151,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:152,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:153,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:154,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:155,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:157,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:158,YDAGYRENYRQTDVNKLYIRYDYYTWAELAYTWY HLA-C15:159,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYMWY HLA-C15:16,YYAGYREKYRQADVNKLYIRYDLYTWAELAYTWY HLA-C15:161,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:162,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:163,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:165,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:166,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:167,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:168,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:169,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:17,YYAGYREKYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:170,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:171,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:172,YYAGYRENYRQTDVNKLYIRSDLYTWAELAYTWY HLA-C15:173,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:174,YYAGYRENYRQTDVNKLYIRHDLYTWAELAYTWY HLA-C15:175,YYAGYWENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:176,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:178,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:179,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:18,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:180,YYAGYRENYRQTDVNKLYIRYDYYTWADLAYTWY HLA-C15:181,YYAGYRENYRQTDVNNLYIRYDFYTWAELAYTWY HLA-C15:182,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:183,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:19,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C15:20,YYAGYREKYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C15:21,YYAGYRENYRQTDVSKLYIRYDLYTWAELAYTWY HLA-C15:22,YYAGYRENYRQTDVNKLYLRYDFYTWAELAYTWY HLA-C15:23,YDAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:24,YYAGYRENYRQTDVNKLYIRYNYYTWAELAYTWY HLA-C15:25,YYAGYREKYRQADVSNLYIRYNFYTWAEDAYTSY HLA-C15:26,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:27,YYAGYRNKYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C15:28,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:29,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:30,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C15:31,YYAGYRENYRQTDVNKLYIRYDLYTWAALAYTWY HLA-C15:33,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:34,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:35,YYAGYRENYRQTDVNKLHIRYDLYTWAELAYTWY HLA-C15:36,YSAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:37,YYAGYRENYRQTDVNKLYLWCDLYTWAELAYTWY HLA-C15:38,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:39,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWH HLA-C15:40,YYAGYRENYRQTDVNKLYIRYDYYTWAELAYTWY HLA-C15:41,YYAGYRENYRQTDVNKLYNRYDLYTWAELAYTWY HLA-C15:42,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYEWY HLA-C15:43,YYAGYREKYRQTDVSNLYIRYDLYTWAELAYTWY HLA-C15:44,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:45,YYAGYRENYRQTDENKLYIRYDLYTWAELAYTWY HLA-C15:46,YYAGYRENYRQTDVNKLYIRSDFYTWAELAYTWY HLA-C15:47,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:48,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:49,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:50,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:51,YYAGYRENYRQTDVNKLYIRYDLYTWAELTYTWY HLA-C15:52,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:53,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:54,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:55,YYAGYRENYRQTDVNKLYLWYDYYTWAELAYTWY HLA-C15:56,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:57,YYAGYRENYRQTDVNKLYIRYDLYTWAVLAYTWY HLA-C15:58,YYAGYRENYRQTDVNKLYLWYDLYTWAELAYTWY HLA-C15:59,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:60,YYAGYRENYRQTDVNQLYIRYDLYTWAELAYTWY HLA-C15:61,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C15:62,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:63,YDSGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:64,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:65,YYAGYRENYRQTDVNKLYLRYDSYTLAALAYTWY HLA-C15:66,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C15:67,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:68,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:69,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:70,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:71,YYAGYRENYRQTDVNILYIRYDLYTWAELAYTWY HLA-C15:72,YYAGYRENYRQTDVNKLYLRYDLYTWAELAYTWY HLA-C15:73,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:74,YYAGYRENYRQTDVNKLYIRYDLYTWAEWAYTWY HLA-C15:75,YYAGYRENYRQTDVNKLYIRYDLYTWAAQAYTWY HLA-C15:76,YYAGYRENYRQTDVNKLYIRYNFYTWAELAYTWY HLA-C15:77,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYLWY HLA-C15:78,YYAGYRENYRQTDVNKLYIRFDLYTWAELAYTWY HLA-C15:79,YYAGYRENYRQTDVNKLYIRYDLYIWAELAYTWY HLA-C15:80,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:81,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:82,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:83,YYAGYRENYRQTNVNKLYIRYDLYTWAELAYTWY HLA-C15:85,YYAGYRENYRQTDVNNLYIRYDLYTWAELAYTWY HLA-C15:86,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:87,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:88,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:89,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:90,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C15:91,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:93,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:94,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:97,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:98,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C15:99,YYAEYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C1601,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C1602,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C1604,YYAGYREKYRQTDVSNLYLWYDSYTWAAWAYTWY HLA-C1606,YYAGYREKYRQTDVSNLYLRSDSYTWAAQAYTWY HLA-C1607,YYAGYREKYRQTDVSNLYLRYDSYTWAAQAYTWY HLA-C1608,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:01,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:02,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:04,YYAGYREKYRQTDVSNLYLWYDSYTWAAWAYTWY HLA-C16:06,YYAGYREKYRQTDVSNLYLRSDSYTWAAQAYTWY HLA-C16:07,YYAGYREKYRQTDVSNLYLRYDSYTWAAQAYTWY HLA-C16:08,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:09,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:10,YYAGYREKYRQTDVSNLYLWYDDYTWAAQAYTWY HLA-C16:100,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:101,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:102,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:103,YYAGYREKYRQTDVNKLYLWYDSYTWAAQVYTWY HLA-C16:104,YYAGYREKYRQTDVNKLYLWFDSYTWAAQAYTWY HLA-C16:105,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:106,YYAGYREKYRQTDVRNLYLWYDSYTWAAQAYTWY HLA-C16:107,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:108,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:109,YYAGYREKYRQTDVSNLYLWYDSYTWAAWAYTWY HLA-C16:11,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:110,YYAGYREKYRQTDVSNLYLWYDSYTWAELAYTWY HLA-C16:111,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:112,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:113,YYAGYREKYRQTDVSNLYLWYDSYTWAEQAYTWY HLA-C16:114,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:115,YYAGYREKYRQTDVNKLYLWSDSYTWAAQAYTWY HLA-C16:116,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:117,YYAGYREKYRQTDVSNLYLRFDSYTWAAQAYTWY HLA-C16:118,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:119,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:12,YYAGYGEKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:120,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:121,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:122,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:124,YYAGYREKYRQTDVSNLYLWHDSYTWAAWAYTWY HLA-C16:125,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:126,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:127,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:128,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:129,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:13,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:130,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:131,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:133,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:134,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:135,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:136,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:137,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:138,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:139,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:14,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:140,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:141,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:142,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:143,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:144,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:145,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:146,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:15,YYAGYREKYRQADVSNLYLWYDSYTWAAQAYTWY HLA-C16:17,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:18,YYAGYREKYRQTDVSNLYLWCDSYTWAAQAYTWY HLA-C16:19,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:20,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:21,YDAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:22,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:23,YYAGYREKYRQTDVSNLYLWFDSYTWAAQAYTWY HLA-C16:24,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:25,YYAGYREKYRQADVNKLYLWYDSYTWAAQAYTWY HLA-C16:26,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:27,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:28,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:29,YYAGYREKYRQTDVSNLYLWYDSYTWAAWAYEWY HLA-C16:31,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:32,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:33,YYAGYREKYRQTDVSNLYLWYDSYTWAAWAYAWY HLA-C16:34,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:35,YYAGYREKYRQTDVSNLYLWYDSYTWAALAYTWY HLA-C16:36,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:37,YYAGYREKYRQTDVSKLYLWYDSYTWAAQAYTWY HLA-C16:38,YYARYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:39,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:40,YYAGYREKYRQTDVSNLYLWYDSYTWAELAYTWY HLA-C16:41,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWC HLA-C16:42,YYAGYQEKYRQTDVSNLYLWYDSYTWAAWAYTWY HLA-C16:43,YYAGYREKYRQTDVSNLYLWYDSYTWAVQAYTWY HLA-C16:44,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:45,YYAGYREKYRQTDVSNLYLWYNFYTWAAQAYTWY HLA-C16:46,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:47,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:48,YYAGYREKYRQTDVNKLYLWYDSYTWAALAYTWY HLA-C16:49,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:50,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYEWY HLA-C16:51,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:52,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:53,YYAGYREKYRQTDVSNLYLWYDSYTWAERAYTWY HLA-C16:54,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:55,YYAGYREKYRQTDVSNLYLWYDSYTWAAWAYTWY HLA-C16:56,YYAGYQEKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:57,YYAGYREKYRQTDVNNLYLWYDSYTWAAQAYTWY HLA-C16:58,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:59,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:60,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:61,YYAGYREKYRQTDVSNLYLWYDSYTWAAWAYTWY HLA-C16:62,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:63,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:64,YYAGYRENYRQADVSNLYLWYDSYTWAAQAYTWY HLA-C16:65,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:66,YYAGYREKYRQTDVSNLYLWYDSYTWAAWAYTWY HLA-C16:67,YYAGYREKYRQTDVSNLYLWYRDYTWAAQAYTWY HLA-C16:68,YYAGYREKYRQTDVSNLYLWYDSYTWAARAYTWY HLA-C16:69,YYAGYREKYRQTGVNKLYLWYDSYTWAAQAYTWY HLA-C16:70,YYAGYRENYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:71,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:72,YYAGYREKYRQTDVSNLYLWYDSYTWAPQAYTWY HLA-C16:73,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:74,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:75,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:76,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:78,YYAGYREKYRQTDVSNLYLWYDSYTWAAWAYTWY HLA-C16:79,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:80,YDSGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:81,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:82,YYAGYREKYRQTDVSNLYLWYDSYTWAAWAYTWY HLA-C16:83,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:84,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:85,YYTKYREISTNTYENTAYLWYDSYTWAAQAYTWY HLA-C16:86,YHAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:87,YYAGYRENYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:88,YYAGYREKYRQTDVNKLYLWYDSYTWAARAYTWY HLA-C16:90,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C16:91,YYAGYREKYRQTDVNKLYLWYDSYTWAAWAYTWY HLA-C16:92,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:93,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAHTWY HLA-C16:94,YYAGYREKYRQTDVSNMYLWYDSYTWAAQAYTWY HLA-C16:95,YYAGYREKCRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:96,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:97,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:98,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C16:99,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C1701,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C1702,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C1703,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C1704,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:01,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:02,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:03,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:04,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:05,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:06,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:07,YYAGYREKYRQADVNKLYIRYNFYSLAELAYLWY HLA-C17:08,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:09,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:10,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:11,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:12,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:13,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:14,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:15,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:16,YYAGYREKYRQADVNKLYLRYNFYSLAELAYEWY HLA-C17:17,YYAGYREKYRQADVNKLYIRYNFYSLAERAYTWY HLA-C17:18,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:19,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:20,YDAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:21,YYAGYREKYRQADVNKLYLWYNFYSLAELAYEWY HLA-C17:22,YYAGYREKYRQADVSNLYIRYNFYSLAELAYEWY HLA-C17:23,YYAGYREKYRQADVNKLYIRYNFYSLAELAYTWY HLA-C17:24,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:25,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:26,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:28,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:29,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:30,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:31,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:32,YYAGYREKYRQADVNKLYIRYNFYSWAELAYEWY HLA-C17:33,YYAGYREKYRQADVNKLYIRYNFYSLAELAYTWY HLA-C17:34,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:35,YYAGYREKYRQADVNKLYIRYNFYTWAELAYEWY HLA-C17:36,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:37,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:38,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:39,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C17:40,YYAGYREKYRQTDVNKLYIRYNFYSLAELAYEWY HLA-C17:41,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C1801,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C1802,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C18:01,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C18:02,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C18:03,YDSGYREKYRQADVNKLYLRFNFYTWAEWAYEWY HLA-C18:04,YDAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C18:05,YDSGYRENYRQADVNKLYLRFNFYTWAERAYTWY HLA-C18:06,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C18:08,YDSGYREKYRQADVNKLYLRFNFYTWAERAYLWY HLA-C18:09,YYSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C18:10,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C18:11,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C18:12,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-E0101,YHSMYRESADTIFVNTLYLWHEFYSSAEQAYTWY HLA-E0103,YHSMYRESADTIFVNTLYLWHEFYSSAEQAYTWY HLA-E01:01,YHSMYRESADTIFVNTLYLWHEFYSSAEQAYTWY HLA-E01:03,YHSMYRESADTIFVNTLYLWHEFYSSAEQAYTWY HLA-G0101,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY HLA-G0102,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY HLA-G0103,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY HLA-G0104,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY HLA-G0106,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY HLA-G0107,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY HLA-G0108,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY HLA-G0109,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAHTWY HLA-G01:01,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY HLA-G01:02,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY HLA-G01:03,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY HLA-G01:04,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY HLA-G01:06,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY HLA-G01:07,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY HLA-G01:08,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAYTWY HLA-G01:09,YSAMYEENTAHTDMNTLYLWIEYYSCAVRAHTWY Mamu-A01,YYAMYRENMTENAVNTLYLRVEYYTWAVMAYQWY Mamu-A02,YYAMYRENMAENAVNNLYIRYHSYTWAEHTYEWY Mamu-A03,YYSEYRNIYAENAVANLYFRVEYYTWAEIAYEWY Mamu-A04,YYAMYREIMTENAVANLYYVYEFYTWAVHTYEWY Mamu-A0505,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWY Mamu-A0506,YYSEYREICADTLENTLYITYDSYTWAVWAYEWH Mamu-A0507,YYSEYQNICADTLENTLYLTYDSYTWAAWAYQSY Mamu-A0509,YYSEYQNICADTLENTLYLTYDSYTWAVWAYQSY Mamu-A0510,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH Mamu-A0511,YYSEYQNICADTLENTLYITYDSYTWAVWAYESH Mamu-A06,YYSEYQNICADTYESNLYLRYEYYTWAEIAYEWY Mamu-A0602,YYSEYRNIYANTYESNLYLRYEYYTWAEIAYEWY Mamu-A07,YYSEYRNICANTYESNLYIRYEFYTWAAMAYEWH Mamu-A07,YYSEYRNICANTYESNLYIRYEFYTWAAMAYEWH Mamu-A0703,YYSEYRNICANTYESNLYIRYDSYTWAAMAYEWH Mamu-A1001:01,YYSMYREKMTETYGNTLYITYEYYTWAVWAYEWY Mamu-A1002:01,YYAMYRENMAENAVNNLYIRYHSYTWAEHTYEWY Mamu-A1011:01,YHTKYREISANTYENTAYFTYDYYTWAVHTYEWY Mamu-A11,YHTKYREISANTYENTAYFTYDYYTWAVHTYEWY Mamu-A11,YHTKYREISANTYENTAYFTYDYYTWAVHTYEWY Mamu-A1305,YYAMYRENMTANAVANLYFRVEYYTWAVMAYEWY Mamu-A1306,YYAMYRENMTANAVANLYFRYEYYTWAVMAYEWY Mamu-A1602,YYAMYRNYIAENAVNTLYIRYEFYTWAVLAYEWH Mamu-A19,YSSEYRNICAETYESNLYFNYEFYTWAAHTYRSY Mamu-A1:00101,YYAMYRENMTENAVNTLYLRVEYYTWAVMAYQWY Mamu-A1:00102,YYAMYRENMTENAVNTLYVRVEYYTWAVMAYQWY Mamu-A1:00103,YYAMYRENMTENAVNTLYLRVEYYTWAVMAYEWY Mamu-A1:00104,YYAMYRENMTENAVNTLYLRVEYYTWAVMAYEWY Mamu-A1:00105,YYAMYRENMAENAVNNLYLRVESYTWAVMAYKSY Mamu-A1:00201,YYAMYRENMAENAVNNLYIRYHSYTWAEHTYEWY Mamu-A1:00301,YYSEYRNIYAENAVANLYFRVEYYTWAEIAYEWY Mamu-A1:00302,YYSEYRNIYAENAVNNLYFRYEYYTWAEMAYEWY Mamu-A1:00303,YSSEYRNICAANAVANLYYRYDFYTWAAMAYLWY Mamu-A1:00304,YYSEYRNICAENAVANLYFRVEYYTWAEIAYEWY Mamu-A1:00305,YYSEYRNIYAENAVANLYYRYYSYTWAVIAYEWY Mamu-A1:00306,YYSEYRNIYAENAVANLYFRVEYYTWAVMAYRSY Mamu-A1:00307,YYSEYRNIYAENAVANLYFRYEYYTWAVMAYRSY Mamu-A1:00308,YYSEYRNIYAENAVANLYYRYYDYTWAWIAYEWY Mamu-A1:00310,YYAEYRNIYAENAVANLYYRYYDYTWAWIAYEWY Mamu-A1:00401,YYAMYREIMTENAVANLYYVYEFYTWAVHTYEWY Mamu-A1:00402,YYAMYREIMTENAVANLYYVYEFYTWAAHTYEWY Mamu-A1:00403,YYAMYRENMTERAVATLYYVYEFYTWAVWAYQWY Mamu-A1:00601,YYSEYQNICADTYESNLYLRYEYYTWAEIAYEWY Mamu-A1:00602,YYSEYRNIYANTYESNLYLRYEYYTWAEIAYEWY Mamu-A1:00701,YYSEYRNICANTYESNLYIRYEFYTWAAMAYEWH Mamu-A1:00702,YYSEYRNICADTYESNLYIRYEFYTWAAMAYEWH Mamu-A1:00703,YYSEYRNICANTYESNLYIRYDSYTWAAMAYEWH Mamu-A1:00704,YYSEYRNIAADTYENTLYIRYEYYTWAAMAYEWH Mamu-A1:00705,YYSEYRNICADTYENTLYIRYESYTWAAMAYEWH Mamu-A1:00801,YYSEYRNIYAANYEGNLYYTYDSYTWAEFTYEWY Mamu-A1:01001,YYSMYREKMTETYGNTLYITYEYYTWAVWAYEWY Mamu-A1:01002,YYSMYREKMTEIYGNNLYITYEFYTWAAWAYEWY Mamu-A1:01101,YHTKYREISANTYENTAYFTYDYYTWAVHTYEWY Mamu-A1:01102,YYTKYREISANTYENTAYFKYEFYTWAAMAYQSY Mamu-A1:01103,YHTKYREISANTYENTAYFTYDYYTWAVHAYEWY Mamu-A1:01104,YHTKYREISANTYENTAYFTYDYYTWAVHTYEWY Mamu-A1:01201,YYAMYRENMTATYESNLYFRYSYYTWAEFTYRWY Mamu-A1:01601,YYAMYRNYIAENAVNTLYIRYEFYTWAVLAYEWH Mamu-A1:01801,YYAMYEEISANTYESNLYFRFSHYTWAWIAYEWY Mamu-A1:01802,YYSEYEEISANTYESNLYFRYSHYTWAWFAYEWY Mamu-A1:01803,YYATYEEISANTYESNLYFRYSYYTWAAYIYQWY Mamu-A1:01804,YYATYEQIAANTYESNLYFRYSYYTWAAYIYQWY Mamu-A1:01805,YYAMYEEISANTYESNLYFRFSHYTWAWIAYEWY Mamu-A1:01806,YYATYEEISANTYESNLYFRYSYYTWAAYIYQWY Mamu-A1:01807,YYSEYEEISANTYESNLYFRYSHYTWAWFAYEWY Mamu-A1:01808,YYSMYEEISANTYESNLYFRYSHYTWAWIAYEWY Mamu-A1:01901,YSSEYRNICAETYESNLYFNYEFYTWAAHTYRSY Mamu-A1:01902,YSSEYRNICAETYESNLYFNYSYYTWAAHTYEWY Mamu-A1:01903,YSSEYQNICADTLESNLYVKYSYYTWAVWAYEWY Mamu-A1:01904,YSSEYRNICAENAVANLYFNYEFYTWAAHTYEWY Mamu-A1:01905,YSSEYRNICAETYESNLYFNYDYYTWAAHTYEWY Mamu-A1:01906,YSSEYRNICAENAVANLYFNYEFYTWAAHTYEWY Mamu-A1:01907,YSSEYRNICAETYESNLYFNYSYYTWAAHTYEWY Mamu-A1:02201,YYSEYRNIYAETYESNLYLRYDSYTWAARAYEWY Mamu-A1:02202,YYSEYRNIYAETYESNLYLRYDSYTWAARAYEWY Mamu-A1:02203,YYSEYRNIYANTYESNLYLTYDSYTWAARAYEWY Mamu-A1:02301,YYSMYREIMAENAVANLYFRYNFYTWAERAYRWY Mamu-A1:02302,YYSMYREIMAENAVANLYFRYNFYTWAERAYRWY Mamu-A1:02501,YYAMYRENMTETYGNTLYIKYEYYTWAVHTYRWY Mamu-A1:02502,YYAMYRENMTENAVDNLYIKYEYYTWAVHTYRWY Mamu-A1:02601,YYAMYSQIMADSYESNLYIRLHHYTWAAWAYEWY Mamu-A1:02602,YYAMYSQIMADSYESNLYIRLHHYTWAAWAYPWY Mamu-A1:02603,YYAMYSQIMADSYESNLYLKYHHYTWAAWAYPWY Mamu-A1:02801,YYAMYRENMTATYENTLYFRYEYYTWAVDAYEWY Mamu-A1:02802,YYAMYRENMTATYENTAYVKYEYYTWAAMAYEWY Mamu-A1:02803,YYAMYRENMTATYENTAYFRYEYYTWAVDAYEWY Mamu-A1:02804,YYAMYREIMTATYENTAYVKYEYYTWAAMAYEWY Mamu-A1:02805,YYAMYREIMTATYENTAYFKYEFYTWAADVYRSY Mamu-A1:02806,YYAMYRNIMTATYENTAYFRVEYYTWAAMAYEWY Mamu-A1:03201,YHTKYEEISANTYESNLYYRYSYYTWAVFTYRWY Mamu-A1:03202,YHTKYEEISANTYESNLYYRYSYYTWAVFTYRWY Mamu-A1:03203,YHTKYEEISANTYESNLYFRFSYYTWAEFTYRWY Mamu-A1:03301,YYAMYSQIMADTYESNLYIWYHHYTWAVWAYRWY Mamu-A1:04001,YYAMYRSIMAENAVANLYITYDSYTWAVDVYKWH Mamu-A1:04002,YYAMYRSIMAGNAVANLYITYDSYTWAVDVYKWH Mamu-A1:04003,YYAMYRSIMAENAVANLYITYDSYTWAVDVYKWH Mamu-A1:04101,YYAMYSQIMTATYESNLYVTYESYTWAWMAYEWY Mamu-A1:04102,YYAMYSQNMTATYESNLYVTYVYYTWAVMAYEWY Mamu-A1:04201,YYAMYRNIMAENAVANLYYMYEFYTWEWDTYEWY Mamu-A1:04301,YYAMYRNIMTANAVANLYFRYSYYTWAVFTYRSY Mamu-A1:04501,YYAMYSQIMADTYVNTLYVRYEFYTWAADVYEWY Mamu-A1:04801,YYAMYRNIMAEDAADTLYLKYYYYTWEWDTYLSY Mamu-A1:04901,YYAMYRSYMTAMAVDNLYLTYFDYTWAVLAYTWH Mamu-A1:04902,YYAMYRSYMTAMAVDNLYLTYFDYTWAVLAYTWH Mamu-A1:04903,YYAMYRSYMTAMAVDNLYLTYFDYTWAVLAYTWH Mamu-A1:04904,YYAMYRSYMTAMAVDNLYLTYFDYTWAVLAYTWH Mamu-A1:05001,YYAEYREISANTYESNLYITYEFYTWAEQAYRSY Mamu-A1:05101,YYAEYRNIYAENYEGILYIKYEFYTWAAHTYEWY Mamu-A1:05201,YYAEYQNSYADNYEGTLYLTYDFYTWAELTYRSY Mamu-A1:05301,YYSEYQNIYAENYEGNLYLTYESYTWAEWTYRSY Mamu-A1:05302,YYSEYQNIYAENYEGNLYLTYESYTWAEWTYRSY Mamu-A1:05401,YYSEYQNICAATYEGILYYRYSYYTWAVFTYLSY Mamu-A1:05402,YYSEYQNIYAATYEGILYYRYSYYTWAVFTYLSY Mamu-A1:05501,YHTKYREISANTYESILYYRYEFYTWAVIAYEWY Mamu-A1:05601,YHTKYREISTNTYEGILYFRFSYYTWAEFTYRWY Mamu-A1:05602,YHTKYREISTNTYEGILYYRYSYYTWAVFTYLWY Mamu-A1:05603,YHTKYREISTNTYENTAYFRFSYYTWAEFTYRWY Mamu-A1:05701,YYAMYSQIMADTYESNLYVRYHHYTWAVDVYRSY Mamu-A1:05702,YYAMYSQIMADTYENTAYVRYHHYTWAVDVYRSY Mamu-A1:05901,YYAMYRENMTATYVNTLYIWHNHYTWAVFAYEWH Mamu-A1:06001,YYAMYRSYMTANAVNNLYIRVDHYTWAVMAYTWH Mamu-A1:06101,YYAMYRENMTANAVNNLYIRYESYTWAWMVYEWY Mamu-A1:06301,YYAEYQNIYAENYEGILYLTYEFYTWAEQAYRSY Mamu-A1:06501,YYAMYQEKADTNYVNTAYIKYDSYTWAWMAYEWY Mamu-A1:06601,YHTKYEEISANNYENTLYIKYDDYTWAVHAYESY Mamu-A1:07301,YYAMYEEIMADTYENTAYFTYDSYTWAVDVYEWY Mamu-A1:07401,YYALYRNICAENYENTLYIKYEFYTWAVQTYTWH Mamu-A1:07402,YYALYRNICAETYENTAYIKYEFYTWAVHTYTWH Mamu-A1:07403,YYALYRNICAETYENTAYIKYEFYTWAVHTYTWH Mamu-A1:08101,YYAEYREKMTATYVNNLYVTYEYYTWAVDTYEWY Mamu-A1:08501,YYAEYRNIYAENYESNLYVTYEYYTWAVDTYEWY Mamu-A1:09101,YYSEYREISAETLENTLYIKYDSYTWAAMAYEWY Mamu-A1:09201,YYAMYRNICADTYESNLYIRYHHYTWAVWAYRSY Mamu-A1:10501,YYSEYRNIYAANYEGNLYFRYEYYTWAAMAYTWY Mamu-A1:10502,YYSEYRNICAANYEGNLYFRYEYYTWAAMAYTWY Mamu-A1:10503,YYSEYRNICAANYEGNLYFRYEFYTWAAMAYTWY Mamu-A1:10504,YHSEYRNICAANYEGNLYFRYEYYTWAAMAYTWY Mamu-A1:10601,YYSMYREIMAENAVANLYLTYDFYTWAELTYRSY Mamu-A1:10701,YYSMYEEISANTYGNTLYITYEFYTWAVDVYRSY Mamu-A1:10801,YYAMYRENMTATYENTLYIWYDSYTWAWIAYEWY Mamu-A1:10901,YYSEYREISAETYEGILYYTYDYYTWAVMAYRWY Mamu-A1:11001,YTAMYREKMTETSGNTLYIRVEFYTWAVMAYTWY Mamu-A1:11101,YYSMYREKMTETSGNTLYIRVEFYTWAVMAYTWY Mamu-A1:11201,YYSMYRNIMTANAVANLYIRYSHYTWAWFAYEWY Mamu-A1:11301,YYSMYREICADTLENTLYITYDSYTWAVDVYRSY Mamu-A20101,YYSEYEQRVGHTFVSNLYIRYESYTWAVHTYESY Mamu-A20102,YYSEYEQRVGHTFVSNLYIRYESYTWAVHTYESY Mamu-A21,YYSEYRNIYAENAVANLYFRVEYYTWAVMAYRSY Mamu-A2201,YYSEYRNIYAETYESNLYLRYDSYTWAARAYEWY Mamu-A23,YYSMYREIMAENAVANLYFRYNFYTWAERAYRWY Mamu-A24,YYSEYRNISADTLADTLYITYYYYTWAEFAYEWY Mamu-A25,YYAMYRENMTETYGNTLYIKYEYYTWAVHTYRWY Mamu-A26,YYAMYSQIMADSYESNLYIRLHHYTWAAWAYEWY Mamu-A2601,YYAMYSQIMADSYESNLYIRLHHYTWAAWAYEWY Mamu-A28,YYAMYRENMTATYENTLYFRYEYYTWAVDAYEWY Mamu-A2:0101,YYSEYEQRVGHTFVSNLYIRYESYTWAVHTYESY Mamu-A2:0102,YYSEYEQRVGHTFVSNLYIRYESYTWAVHTYESY Mamu-A2:0103,YYSEYEQRVGHTFVSNLYIRYESYTWAVHTYEWY Mamu-A2:0501,YYSEYQNICADTLENTLYITYDSYTWAVWAYESH Mamu-A2:05020,YYSEYQNICADTLENTLYLTYDSYTWAVWAYQSY Mamu-A2:05030,YYSEYQNICADTLENTLYLTYDSYTWAVWAYQSY Mamu-A2:05040,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH Mamu-A2:0505,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWY Mamu-A2:0506,YYSEYREICADTLENTLYITYDSYTWAVWAYEWH Mamu-A2:0507,YYSEYQNICADTLENTLYLTYDSYTWAAWAYQSY Mamu-A2:0509,YYSEYQNICADTLENTLYLTYDSYTWAVWAYQSY Mamu-A2:0510,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH Mamu-A2:0511,YYSEYQNICADTLENTLYITYDSYTWAVWAYESH Mamu-A2:0512,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH Mamu-A2:0513,YYSEYREICADTLENTLYITYDSYTWAVWAYEWH Mamu-A2:0514,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH Mamu-A2:05150,YYSEYREICADTLENTLYITYDSYTWAVWAYEWH Mamu-A2:05160,YYSEYQNICADTLENTLYLTYDSYTWAVHTYQSY Mamu-A2:0517,YYSEYQNICADTLENTLYLTYDSYTWAVHAYQSY Mamu-A2:0518,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH Mamu-A2:0519,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH Mamu-A2:0520,YYSEYQNICADTLENTLYLTYDSYTWAVWAYESY Mamu-A2:0521,YYSEYQNICADTLENTLYLTYDSYTWAVWAYESY Mamu-A2:0522,YYSEYQNICADTLENTLYLTYDSYTWAVWAYESY Mamu-A2:0523,YYSEYREICADTLENTLYITYDSYTWAVRAYEWH Mamu-A2:0524,YYSEYQNICADTLENTLYITYDSYTWAVWTYEWH Mamu-A2:0525,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH Mamu-A2:0526,YYSEYQNIAANTFENTAYITYDSYTWAAHTYEWY Mamu-A2:0527,YYSEYQNICADTLENTLYLTYDSYTWAVWVYQSY Mamu-A2:0528,YYSEYQNICADTLENTLYITYDSYTWAVWAYESH Mamu-A2:0529,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH Mamu-A2:0531,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH Mamu-A2:05320,YYSEYQNICADTLENTLYITYDSYTWAVWAYESH Mamu-A2:0533,YYSEYQNICADTLENTLYLTYDSYTWAAHTYQSY Mamu-A2:0534,YYSEYQNICADTLENTLYITYDSYTWAAHTYEWH Mamu-A2:0535,YYSEYQNICADTLENTLYITYDSYTWAVMAYEWH Mamu-A2:0536,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH Mamu-A2:0537,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH Mamu-A2:0538,YYSEYQNICADTLENTLYLTYDSYTWAVWAYESY Mamu-A2:0539,YYSEYQNICADTLENTLYLTYDSYTWAVHAYQSY Mamu-A2:0540,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH Mamu-A2:0541,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWY Mamu-A2:0542,YYSEYREICADTLENTLYITYDSYTWAVWAYEWH Mamu-A2:0543,YYSEYQNICADTLENTLYITYDSYTWAVWAYEWH Mamu-A2:0544,YYSEYREICADTLEDTLYITYDSYTWAVWAYESY Mamu-A2:0545,YYAEYQNICADTLENTLYITYDSYTWAVWAYESH Mamu-A2:0546,YYSEYREICADTLENTLYITYDSYTWAVWAYESY Mamu-A2:0547,YYSEYREICADTLENTLYITYEFYTWAVDVYRSY Mamu-A2:2401,YYSEYRNISADTLADTLYITYYYYTWAEFAYEWY Mamu-A2:2402,YYSEYREISAETYEDTLYITYYDYTWAEFAYEWH Mamu-A2:2403,YYSEYRNISADTYENTLYITYYYYTWAEFAYEWY Mamu-A3:1301,YYAMYRENMTANAVANLYFRYEFYTWAVMAYEWY Mamu-A3:1302,YYAMYRENMTANAVANLYFRVEYYTWAVMAYRSY Mamu-A3:1303,YYAMYRENMTENAVANLYFRVEYYTWAVMAYEWY Mamu-A3:1304,YYAMYRENMTANAVANLYFRVEYYTWAVMAYRSY Mamu-A3:1305,YYAMYRENMTANAVANLYFRVEYYTWAVMAYEWY Mamu-A3:1306,YYAMYRENMTANAVANLYFRYEYYTWAVMAYEWY Mamu-A3:1307,YYAMYRENMTANAVANLYFRVEFYTWAVMTYRSY Mamu-A3:1308,YYAMYRENMTANAVANLYFRVEYYTWAVMAYEWY Mamu-A3:1309,YYAMYRENMTANAVANLYVKYEYYTWAVMAYEWY Mamu-A3:1310,YYAMYRENMTANAVANLYFRVEYYTWAVMAYEWY Mamu-A3:1311,YYAMYRENMTENAVANLYFRVEYYTWAVMAYEWY Mamu-A3:1312,YYAMYRENMTANAVANLYFRVEYYTWAVMAYEWY Mamu-A3:1313,YYSMYRENMTANAVANLYFRVEFYTWAVMAYRSY Mamu-A4:0101,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRWY Mamu-A4:01020,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRWY Mamu-A4:0103,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRWY Mamu-A4:0202,YYTMYRENMTANAVANLYIRVEYYTWAVMAYTWH Mamu-A4:0203,YYTMYRENMTANAVANLYFRVEFYTWAVMAYTWH Mamu-A4:0205,YYTMYRENMTANAVANLYFRVEYYTWAVMAYTWH Mamu-A4:0301,YYAMYRENMTANAVANLYFTYEYYTWAAMAYTWH Mamu-A4:0302,YYAMYRENMTANAVANLYFRVEYYTWAAMAYTWH Mamu-A4:1402,YYAMYRENMTENAVANLYFRVEFYTWAVDVYRWY Mamu-A4:14030,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRWY Mamu-A4:1404,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRSY Mamu-A4:1405,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRWY Mamu-A4:1406,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRWY Mamu-A4:1407,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRWY Mamu-A4:1408,YYAMYLENMTANAVANLYFRVEFYTWAVDVYRWY Mamu-A4:1409,YYAMYRENMTANAVANLYFRVEFYTWAVDVYRWY Mamu-A5:30010,YYAMYEEIMAEDAVDTLYFVYGFYTWSRHAYEWY Mamu-A5:3002,YYAMYEEIMAEDAVDTLYFVYEFYTWSRHTYEWY Mamu-A5:3003,YYAMYEEIMAEDAVDTLYFVYGFYTWSRHAYEWY Mamu-A5:3004,YYAMYEEIMAEDAVDTLYFVYGFYTWSRHAYEWY Mamu-A5:3005,YYAMYEEIMAEDAVDTLYFVYGYYTWSRHAYEWY Mamu-A5:3006,YYAMYEEIMAEDAVDTLYFVYGFYTWSRHAYEWY Mamu-A6:0101,YHAMYREKMTEMAVANLYIVYSYYTLAAHAYLSY Mamu-A6:0102,YHAMYREKMTEMAVANLYIVYSYYTLAAHAYLSY Mamu-A6:0103,YHAMYREKMTEMAVANLYIVYSYYTLAAHAYLSY Mamu-A6:0104,YHAMYREKMTEMAVANLYIVYSYYTLAAMAYLSY Mamu-A6:0105,YHAMYREKMTEMAVANLYIVYSYYTLAAMAYLSY Mamu-A70103,YYAMYREIMTATYGNTAYFKYEFYTWAAHTYEWY Mamu-A7:0101,YYAMYRENMTATYGNTAYFTYEFYTWAAWAYEWY Mamu-A7:0102,YYAMYRENMTATYENTAYFTYEFYTWAAWAYEWY Mamu-A7:0103,YYAMYREIMTATYGNTAYFKYEFYTWAAHTYEWY Mamu-A7:0201,YTSEYRNICAATYENTLYLKYEFYTWAAHTYEWY Mamu-AG:01,YYAMYRENMTPTYVNTLYIKYEFYTWAAHTYEWY Mamu-AG:02011,YYAMYRENMTATYENTLYIKYEFYTWAAHTYEWY Mamu-AG:02012,YYAMYRENMTATYENTLYIKYEFYTWAAHTYEWY Mamu-AG:0202,YYAMYRENMTATYENTLYIKYEFYTWAAHTYEWY Mamu-AG:03011,YYAMYRENMTATYANTLYFKYEFYTWAAHTYEWY Mamu-AG:0302,YYAMYRENMTATYANTLYFKYEFYTWAAHTYEWY Mamu-B001:01,YHSMYREKAGNTDENIAYLMHYRYTWAVRAYRWY Mamu-B003:01,YSSEYEENAGHTDADNLYLTYHYYTWAEVAYTWY Mamu-B004:01,YSEMYEERAGNTFVGNLYYWYDFYTWAEQAYTWY Mamu-B008:01,YSSEYEERAGHTDADTLYLTYHYYTWAEVAYTWY Mamu-B01,YHSMYREKAGNTDENIAYLMHYRYTWAVRAYRWY Mamu-B01,YHSMYREKAGNTDENIAYLMHYRYTWAVRAYRWY Mamu-B017:04,YYSEYEARAEATHENTAYIKYHSYTWNYFAYEWY Mamu-B02,YSEMYRNNSVTTFVGNLYLWYHFYTWAEMAYTWH Mamu-B03,YSSEYEENAGHTDADNLYLTYHYYTWAEVAYTWY Mamu-B03,YSSEYEENAGHTDADNLYLTYHYYTWAEVAYTWY Mamu-B03901,YTELYEERAETTFVSTAYIWYDYYTWAEMAYRWY Mamu-B04,YSEMYEERAGNTFVGNLYYWYDFYTWAEQAYTWY Mamu-B04,YSEMYEERAGNTFVGNLYYWYDFYTWAEQAYTWY Mamu-B05,YYAMYEQRVGHTFVSNLYLRSDYYTWAVLAYEWY Mamu-B065:02,YSEMYEQRAGHTEGNTAYLWYDLYTWAEWAYEWY Mamu-B07,YSEMYEARAGNTHGNTAYLWYEFYTWAALAYKWY Mamu-B08,YSSEYEERAGHTDADTLYLTYHYYTWAEVAYTWY Mamu-B08,YSSEYEERAGHTDADTLYLTYHYYTWAEVAYTWY Mamu-B1001,YTEMYEQNSANTHVDTAYLTYHYYTWAERAYRWY Mamu-B12,YSEMYEQNAANTDVSNLYVIYHFYTWDYFAYRWY Mamu-B17,YYSEYEARAEATHENTAYIKYHSYTWNYFAYEWY Mamu-B17,YYSEYEARAEATHENTAYIKYHSYTWNYFAYEWY Mamu-B19,YTEMYRNRAGNTEGNTLYVRYHSYTWAEMAYEWH Mamu-B20,YSEMYRNRAGHTHGNTLYVISHHYTWAEWAYGWY Mamu-B21,YHSMYRNISAHTHGNTLYITYNHYTWDYFADASY Mamu-B22,YTEMYRNRAANTDGNTAYIWYHFYTWAEQAYEWH Mamu-B24,YSSMYRERAGNTFVSNLYLWYDSYTWAVQAYTWH Mamu-B27,YHSEYEQNAAHSHVSNLYLKYDYYTWAALAYTWY Mamu-B28,YGYMYDVRAARTDVDTLYIIYRDYTWAVMAYEWY Mamu-B3002,YSSEYEQNTAHNHVCTVYLRFNYYTWTYFAYTSH Mamu-B36,YYAMYQENMTATDADTLYITYEFYTWAEWAYEWY Mamu-B37,YYAMYEQRVARTDVDTLYIIYRDYTWAVRAYTWY Mamu-B38,YHEMYRNRAANTDGNTAYIWYYDYTWAALAYTWY Mamu-B39,YTELYEERAETTFVSTAYIWYDYYTWAEMAYRWY Mamu-B3901,YTELYEERAETTFVSTAYIWYDYYTWAEMAYRWY Mamu-B40,YTEMYEQNSGHTHVNTAYIRYDFYTWAVMAYRWY Mamu-B41,YSEMYEQIAGHTEGNTAYIWYHLYTWAEWAYEWY Mamu-B43,YSEMYRNRAGNTEGSTLYFRYDSYTWAERAYTWH Mamu-B44,YHAEYEQNAAHTHVSNLYLKYDYYTWAALAYTWY Mamu-B45,YHSEYEEIAANTHGNTLYIKYDYYTWAAQAYEWY Mamu-B46,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH Mamu-B47,YHSEYREKAAQTDVDTLYIWSRDYTWDYLAYTWY Mamu-B48,YSAMYEEIADATFVGILYYWYHFYTWVEFAYRWY Mamu-B48,YSAMYEEIADATFVGILYYWYHFYTWVEFAYRWY Mamu-B49,YGVMYEEKADNTHVSNLYFRYYFYTWAVLAHPWY Mamu-B5002,YSAMYRENAANTDVNTLYLMHHQYTWDYFAYEWY Mamu-B52,YSEMYEERAGNTFVNTAYIGYHHYTWAVLAYRWY Mamu-B53,YGAMYEQLAARTDVGTLYYWLHSYTWDYFAYEWY Mamu-B55,YSAMYEEKADISFVSNLYYWVHYYTWVGFAYRSY Mamu-B57,YHAEYEQIAGNTHVDTLYLTYHSYTWAAQAYRWY Mamu-B5802,YSEMYRNNAGHTFGNTAYLWYHFYTWAEQAYEWY Mamu-B6002,YSSMYEQLADFSFVGNLYLWYHFYTWAEVAHTWH Mamu-B61,YSAMYRESAANTDVNTLYLMHHQYTWDYFAYEWY Mamu-B63,YSAMYEQLADISFVGNLYLWYHFYTWAEMAYTWH Mamu-B64,YGYVYEQIAARTDADTLYIWFHSYTWDYQAYEWY Mamu-B65,YSEMYEERAGHTEGNTAYLWYDLYTWAEWAYEWY Mamu-B66,YSYMYEEKAARTDVDTLYIIYRDYTWAVWAYTWY Mamu-B6601,YSYMYEEKAARTDVDTLYIIYRDYTWAVWAYTWY Mamu-B67,YSEMYEEIAANTDGNTLYVISHHYTWAERAYGWY Mamu-B69,YTSMYEERAGHTDGGILYYRSHRYTWAVKAYEWY Mamu-B70,YGYVYEQLAARTDADTLYIWFHSYTWDYMAYEWY Mamu-B71,YSSMYRNKAAHTDVDTLYIMYRDYTWAVRAYLSY Mamu-B8301,YSEMYEQNSARTDVDTLYITYRDYTWAAQAYRSY Mamu-B8701,YSAMYEEKAGHTDENTLYLRSYRYTWAARAYRWY Mamu-B:00101,YHSMYREKAGNTDENIAYLMHYRYTWAVRAYRWY Mamu-B:00102,YHSMYREKAGNTDENIAYLMHYRYTWAVRAYRWY Mamu-B:00201,YSEMYRNNSVTTFVGNLYLWYHFYTWAEMAYTWH Mamu-B:00202,YSEMYRNNSVTTFVGNLYLWYHFYTWAEMAYTWH Mamu-B:00301,YSSEYEENAGHTDADNLYLTYHYYTWAEVAYTWY Mamu-B:00302,YSSEYEENAGHTDADNLYLTYHYYTWAEVAYTWY Mamu-B:00401,YSEMYEERAGNTFVGNLYYWYDFYTWAEQAYTWY Mamu-B:00501,YYAMYEQRVGHTFVSNLYLRSDYYTWAVLAYEWY Mamu-B:00502,YYAMYEQRVGHTFVSNLYLRSDYYTWAVLAYEWY Mamu-B:00601,YHAMYEEIAGHTEGNTLYVWHYFYTWAERAYQWY Mamu-B:00602,YHAMYEEIAGHTEGNTLYVWHHLYTWAERAYQWY Mamu-B:00701,YSEMYEARAGNTHGNTAYLWYEFYTWAALAYKWY Mamu-B:00702,YSEMYEARAGNTHGNTAYLWYEFYTWAALAYKWY Mamu-B:00703,YSEMYEARAGNTHGNTAYLWYEFYTWAALAYKWY Mamu-B:00704,YSEMYEARAANTHGNTAYLWYEFYTWAALAYKWY Mamu-B:00801,YSSEYEERAGHTDADTLYLTYHYYTWAEVAYTWY Mamu-B:01001,YTEMYEQNSANTHVDTAYLTYHYYTWAERAYRWY Mamu-B:01101,YHAEYEQIAGNAHGNNLYVTYEFYTWAADAYPWY Mamu-B:01201,YSEMYEQNAANTDVSNLYVIYHFYTWDYFAYRWY Mamu-B:01301,YGSEYEQIAANTDVDTLYIWYRDYTWDYFAYTWY Mamu-B:01401,YYAMYEQRVGHTFVSNLYFRSDYYTWASLAYEWY Mamu-B:01501,YTEMYEQNSGHTEENTLYIWYDSYTWAVLAYRWY Mamu-B:01502,YTEMYEQNSGHTEENTLYIWYDSYTWAVLAYRWY Mamu-B:01601,YTAMYEERAAHTDGGILYYKSYRYTWAALAYEWY Mamu-B:01701,YYSEYEARAEATHENTAYIKYHSYTWNYFAYEWY Mamu-B:01702,YYSEYEARAEATHENTAYIKYHSYTWNYFAYEWY Mamu-B:01703,YYAEYEQRAEATHENTAYIKYHSYTWNYFAYEWY Mamu-B:01704,YYSEYEARAEATHENTAYIKYHSYTWNYFAYEWY Mamu-B:01801,YHEMYRNNAAHTDVDTLYIWYRDYTWDYFAYTWY Mamu-B:01901,YTEMYRNRAGNTEGNTLYVRYHSYTWAEMAYEWH Mamu-B:01902,YTEMYRNSAGNTEGNTLYVRYHSYTWAEMAYEWH Mamu-B:01903,YTEMYRNRAGNTEGNTLYVRYHSYTWAEMAYEWY Mamu-B:02001,YSEMYRNRAGHTHGNTLYVISHHYTWAEWAYGWY Mamu-B:02101,YHSMYRNISAHTHGNTLYITYNHYTWDYFADASY Mamu-B:02102,YHSMYRNISAHTHGNTLYITYNHYTWDYFADASY Mamu-B:02103,YHSMYRNISAHTHGNTLYITYNHYTWDYFADASY Mamu-B:02201,YTEMYRNRAANTDGNTAYIWYHFYTWAEQAYEWH Mamu-B:02301,YTEMYRNNSGHTHADTLYLKYHYYTWAERAYTWY Mamu-B:02401,YSSMYRERAGNTFVSNLYLWYDSYTWAVQAYTWH Mamu-B:02501,YYSEYEQRVETADMCTVYFRFYSYTWAYFAYESY Mamu-B:02601,YHAEYEQIAGNTHVDTLYLTYHSYTWAAQAYRWY Mamu-B:02602,YHAEYEQIAGNTHVDTLYLTYHSYTWAAQAYRWY Mamu-B:02701,YHSEYEQNAAHSHVSNLYLKYDYYTWAALAYTWY Mamu-B:02702,YHSEYEQNAAHTHVSNLYLKYDYYTWAALAYTWY Mamu-B:02703,YHSEYEQNAAHSHVSNLYLKYDYYTWAALAYTWY Mamu-B:02801,YGYMYDVRAARTDVDTLYIIYRDYTWAVMAYEWY Mamu-B:02802,YGYMYDVIAAQTDVDTLYIIYRDYTWAVMAYEWY Mamu-B:02803,YGYMYDVIAAQTDVDTLYIIYRDYTWAVMAYEWY Mamu-B:02901,YSEMYEERAANTDVDTLYIWYHSYTWDYFAYTWY Mamu-B:02902,YSEMYEERAANTDVDTLYIWYHSYTWDYFAYTSH Mamu-B:03001,YSSEYEQNTAHNHVCTVYLRFNYYTWTYFAYTSH Mamu-B:03002,YSSEYEQNTAHNHVCTVYLRFNYYTWTYFAYTSH Mamu-B:03003,YSSEYEQNTAHNHVCTVYLRFNYYTWTYFAYTSH Mamu-B:03004,YSSEYEQNTAHNHVCTVYLRFNYYTWTYFAYTSH Mamu-B:03005,YSSEYEQNTAHNHVCTVYLRFNYYTWTYFAYTSH Mamu-B:03101,YSSMYEQIADLTFVDTAYFWFHFYTWAEWADTWY Mamu-B:03102,YSSMYEQIADLTFVDTAYFWFHFHTWAEWAHTWY Mamu-B:03103,YSSVYEQIADLTFVDTAYFWFHFHTWAEWAHTWY Mamu-B:03201,YSEMYEERAGTTFVCTAYIWYNHYTWAEFAYKSY Mamu-B:03301,YSEMYRNRAGNTFGNTAYIWYHFYTWAEQAYEWY Mamu-B:03401,YSEMYEQIAANTEGNTAYLRYHLYTWAEWAYRWY Mamu-B:03501,YHVMYEEKADNTHVSNLYLRYYFYTWAVLAHPWY Mamu-B:03601,YYAMYQENMTATDADTLYITYEFYTWAEWAYEWY Mamu-B:03602,YYAMYQENMTATDADTLYITYEFYTWAEWAYEWY Mamu-B:03701,YYAMYEQRVARTDVDTLYIIYRDYTWAVRAYTWY Mamu-B:03801,YHEMYRNRAANTDGNTAYIWYYDYTWAALAYTWY Mamu-B:03802,YSEMYRNRAANTHGNTAYIKYYDYTWAALAYTWY Mamu-B:03901,YTELYEERAETTFVSTAYIWYDYYTWAEMAYRWY Mamu-B:04001,YTEMYEQNSGHTHVNTAYIRYDFYTWAVMAYRWY Mamu-B:04002,YTEMYEQNSGHTHVNTAYIRYDFYTWAVLAYRWY Mamu-B:04101,YSEMYEQIAGHTEGNTAYIWYHLYTWAEWAYEWY Mamu-B:04201,YYAMYEQIADTTFVSNLYLEYDFYTWAVLAYEWY Mamu-B:04301,YSEMYRNRAGNTEGSTLYFRYDSYTWAERAYTWH Mamu-B:04401,YHAEYEQNAAHTHVSNLYLKYDYYTWAALAYTWY Mamu-B:04402,YHAEYEQNAAHTHVSNLYIKYDYYTWAALAYTWY Mamu-B:04403,YHAEYEQNAAHTHVSNLYLKYDYYTWAALAYTWY Mamu-B:04404,YHSEYEQNAAHTHVSNLYLKYDYYTWAALAYTWY Mamu-B:04405,YHAEYEQNAAHTHVSNLYLKYDYYTWAALAYTWY Mamu-B:04501,YHSEYEEIAANTHGNTLYIKYDYYTWAAQAYEWY Mamu-B:04502,YHSEYEHIAANTHGNTLYIKYDYYTWAAQAYEWY Mamu-B:04503,YHSEYEQIAANTHGNTLYIKYDYYTWAAQAYEWY Mamu-B:04504,YHSEYEQIAANTHGNTLYIKYDYYTWAAQAYEWY Mamu-B:04601,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH Mamu-B:04602,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH Mamu-B:04603,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH Mamu-B:04604,YSSMYEQLADVTFVGNLYLWSHFYTWAEWAHTWH Mamu-B:04605,YSAMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH Mamu-B:04607,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH Mamu-B:04608,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH Mamu-B:04609,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH Mamu-B:04610,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH Mamu-B:04611,YSSMYEQLAEAIFVGNLYLWYHFYTWAEWAHTWH Mamu-B:04612,YSSMYEQIAEATFVSNLYLWYHFYTWAEWAHTWH Mamu-B:04613,YSSMYEQLADVTFVGNLYLWSHFYTWAEWAHTWH Mamu-B:04614,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH Mamu-B:04615,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH Mamu-B:04616,YSSMYEQLADVTFVGNLYLWSHFYTWAEWAHTWH Mamu-B:04617,YSSMYEQLAEATFVGNLYLWYHFYTWAEWAHTWH Mamu-B:04701,YHSEYREKAAQTDVDTLYIWSRDYTWDYLAYTWY Mamu-B:04702,YHSMYRNKAAHTDVDTLYIWSRDYTWDYLAYTWY Mamu-B:04703,YHSMYRNKAAQTDVDTLYIWSRDYTWDYLAYTWY Mamu-B:04704,YHSMYRNKAAHTDVDTLYIWSRDYTWDYLAYTWY Mamu-B:04705,YHSEYREKAAQTDVDTLYIWSRDYTWAERAYTWY Mamu-B:04801,YSAMYEEIADATFVGILYYWYHFYTWVEFAYRWY Mamu-B:04802,YSSMYEQIADATFVGILYYWVHFYTWVEFAYRWY Mamu-B:04901,YGVMYEEKADNTHVSNLYFRYYFYTWAVLAHPWY Mamu-B:05002,YSAMYRENAANTDVNTLYLMHHQYTWDYFAYEWY Mamu-B:05101,YGYTYEERAARTDADILYLWAHSYTWTYFAYPWY Mamu-B:05102,YGYTYEERAARTDADTLYLWAHSYTWTYFAYPWY Mamu-B:05103,YGYTYEERAARTDADILYLWAHSYTWTYFAYPWY Mamu-B:05104,YGYTYEERAARTDADTLYLWAHSYTWTYFAYPWY Mamu-B:05105,YGSTYEERAARTDADTLYVWAHSYTWTYFAYPWY Mamu-B:05201,YSEMYEERAGNTFVNTAYIGYHHYTWAVLAYRWY Mamu-B:05301,YGAMYEQLAARTDVGTLYYWLHSYTWDYFAYEWY Mamu-B:05302,YGAMYEQLAARTDVGTLYYWLHSYTWDYFAYEWY Mamu-B:05401,YSSMYEQLADISFVGNLYLWYHFYTWAEMAHTWH Mamu-B:05501,YSAMYEEKADISFVSNLYYWVHYYTWVGFAYRSY Mamu-B:05601,YSAMYEQRVEATFGNTAYFWFEYYTWAEMAYEWY Mamu-B:05602,YSAMYEQRVEATFGNTAYFWFDSYTWAELAYEWY Mamu-B:05701,YHAEYEQIAGNTHVDTLYLTYHSYTWAAQAYRWY Mamu-B:05702,YHAEYEQIAGNTHVDTLYLTYHSYTWAAQAYRWY Mamu-B:05802,YSEMYRNNAGHTFGNTAYLWYHFYTWAEQAYEWY Mamu-B:05901,YGAMYEQIAANTDVDTLYIWYHDYTWDYFAYTWY Mamu-B:06001,YSSMYEQLADFSFVGNLYLWYHFYTWAEVAHTWH Mamu-B:06002,YSSMYEQLADFSFVGNLYLWYHFYTWAEVAHTWH Mamu-B:06003,YSSMYEQLADISFVGNLYIWYHFYTWAEMAHTWH Mamu-B:06101,YSAMYRESAANTDVNTLYLMHHQYTWDYFAYEWY Mamu-B:06102,YSAMYRENAANTDVNTLYLMHHQYTWDYFAYEWY Mamu-B:06103,YSAMYRENAANTDVNTLYLMHHQYTWDYFAYEWY Mamu-B:06301,YSAMYEQLADISFVGNLYLWYHFYTWAEMAYTWH Mamu-B:06302,YSAMYEQLADISFVGNLYLWYHFYTWAEMAYTWH Mamu-B:06401,YGYVYEQIAARTDADTLYIWFHSYTWDYQAYEWY Mamu-B:06402,YGYVYEQIAARADADTLYIWFHSYTWDYQAYEWY Mamu-B:06501,YSEMYEERAGHTEGNTAYLWYDLYTWAEWAYEWY Mamu-B:06502,YSEMYEQRAGHTEGNTAYLWYDLYTWAEWAYEWY Mamu-B:06503,YSEMYEQRAGHTEGNTAYLWYDLYTWAEWAYEWY Mamu-B:06601,YSYMYEEKAARTDVDTLYIIYRDYTWAVWAYTWY Mamu-B:06701,YSEMYEEIAANTDGNTLYVISHHYTWAERAYGWY Mamu-B:06702,YSEMYEEIAANTDGNTLYVISHHYTWAERAYGWY Mamu-B:06801,YSEMYRNRAGHTHGNTLYVISHHYTWAEWAYGWY Mamu-B:06802,YSEMYRNRAGHTHGNTLYVISHHYTWAEWAYGWY Mamu-B:06803,YSEMYRNRAGHTHGNTLYVISHHYTWAEWAYGWY Mamu-B:06804,YSEMYRNSAGHTHGNTLYVISHHYTWAEWAYGWY Mamu-B:06805,YSEMYRNRAGHTHGNTLYVICHHYTWAEWAYGWY Mamu-B:06901,YTSMYEERAGHTDGGILYYRSHRYTWAVKAYEWY Mamu-B:06902,YTAMYEQRAGHTDGGNLYYRSYRYTWAVKAYEWY Mamu-B:06903,YTAMYEARVGHTDGGILYYKSHRYTWAVKAYEWH Mamu-B:06904,YTSMYEARAGHTDGGNLYYRSHRYTWAVWAYEWH Mamu-B:07001,YGYVYEQLAARTDADTLYIWFHSYTWDYMAYEWY Mamu-B:07002,YGYVYEQIAARTDADTLYIWFHSYTWDYMAYEWY Mamu-B:07101,YSSMYRNKAAHTDVDTLYIMYRDYTWAVRAYLSY Mamu-B:07201,YIAMYEEKVETTFVSNLYYWYHFYTWAVMAYQCY Mamu-B:07202,YIAMYEEKVETTFVSNLYYWYHFYTWAVMAYQCY Mamu-B:07301,YSEMYEETAANTEVNTAYIRYRDYTWDYMVYRWY Mamu-B:07401,YGYAYEQLAARTDVDTLYIWSRDYTWAEWAYEWH Mamu-B:07402,YGYAYEQLAARTDVDTLYIWSRDYTWAEWAYEWH Mamu-B:07501,YSSMYEEKADVSFVGTLYYWVHYYTWAEFAYPWY Mamu-B:07502,YSSMYEEKADVSFVGTLYYWVHYYTWVEFAYPWY Mamu-B:07601,YHSMYEQIAANTDVDTLYITYRDYTWAEWAYEWY Mamu-B:07602,YHSMYEQIAGNTHVDTLYITYRDYTWAEWAYEWY Mamu-B:07701,YHSEYEQIAGNTDADTLYLWYRDYTWAEWAYEWH Mamu-B:07702,YHSEYEQIADTTDANTLYLWYRDYTWAEWAYEWH Mamu-B:07801,YSAMYRENAANTDVNTLYLMHHQYTWDYFAYEWY Mamu-B:07901,YSSMYEQLANIFFVGNLYLWYHFYTWAEMAHTWY Mamu-B:07902,YSSMYEQLANIFFVGTLYLWYHFYTWAEMAHTWY Mamu-B:07903,YSSMYEQLADISFVGNLYLWYHFYTWAEMAHTWY Mamu-B:08001,YHYMYEEIAANTDADTLYYWSRDYTWAYFAYEWY Mamu-B:08101,YHEMYRNRAGNTEGNTLYIWYDSYTWAEMAYEWH Mamu-B:08102,YHEMYRNRAGNTEGNTLYIWYDSYTWAEMAYEWH Mamu-B:08201,YHSMYEQIAEATEGNTLYLWYDSYTWAAQAYEWY Mamu-B:08202,YHSMYEQIAEATFGNTLYLWYDSYTWAAQAYEWY Mamu-B:08301,YSEMYEQNSARTDVDTLYITYRDYTWAAQAYRSY Mamu-B:08401,YYAMYEQNAAHSHVSNLYLKYDYYTWAALAYTWY Mamu-B:08501,YGAMYEQIAANTFVGTLYLRYESYTWDYLAYTWY Mamu-B:08502,YGAMYEQIAETTFVGTLYLRYESYTWDYLAYTWY Mamu-B:08601,YFAMYEQRAAHTDESNLYIWYRDYTWAEWAYEWY Mamu-B:08602,YFAMYEQRAAHTDESNLYIWYRDYTWAEWAYEWY Mamu-B:08603,YFAMYEQRAAHTDESNLYIWYRDYTWAEWAYEWY Mamu-B:08701,YSAMYEEKAGHTDENTLYLRSYRYTWAARAYRWY Mamu-B:08801,YYAMYEEKVETTFVSILYYWYHSYTWAVMAYQCY Mamu-B:08901,YHSEYEQIAGNTDENTLYIWYDSYTWAAQAYEWY Mamu-B:09001,YHYMYEERAANTDVDTLYIWSRDYTWTYFAYTWY Mamu-B:09101,YGYMYEEKAARTDVNTLYIIYDYYTWAERAYTWY Mamu-B:09102,YGYMYEEKAARTDVNTLYIIYRDYTWAERAYTWY Mamu-B:09201,YGAAYEQIAANTDVGTLYIWFHSYTWDYFAYEWY Mamu-B:09301,YHSMYRNTAGNTDGSNLYLTYEYYTWAEWAYTWY Mamu-B:09401,YHEMYEANAARTDVDTLYIWARDYTWDYLAYTWY Mamu-B:09501,YSSMYEAIAARTDVDTLYITYRDYTWDYFAYRWY Mamu-B:09601,YSSMYEQLADISFVGNLYLWYHFYTWAEMAYTWH Mamu-B:09701,YSAMYEQLADNSFVSNLYLWSHFYTWAEMAYTWH Mamu-B:09801,YSVMYEQRVDATFVSNLYLTSYQYTWAVWAYECY Mamu-B:09901,YSTMYEQLADISFVSNLYITYRDYTWDYFADRWY Mamu-B:10001,YSEMYRNNAGNTFGNTVYLWYHLYTWAEQAYEWH Mamu-B:10101,YSYMYEEKAGHTDVDTLYIIYRDYTWAVDAYPWY Patr-A0101,YFAMYQESAAHTDVDTLYIIYRDYTWAAQAYTWY Patr-A01:01,YFAMYQESAAHTDVDTLYIIYRDYTWAAQAYTWY Patr-A0201,YFAMYEESAAHTDVDTLYIIYRDYTWAARAYTWY Patr-A02:01,YFAMYEESAAHTDVDTLYIIYRDYTWAARAYTWY Patr-A0301,YYAMYQENMASTDVDTLYIIYRDYTWAALAYRWY Patr-A0302,YYAMYQENMASTDVDTLYIIYRDYTWAALAYRGY Patr-A03:01,YYAMYQENMASTDVDTLYIIYRDYTWAALAYRWY Patr-A03:02,YYAMYQENMASTDVDTLYIIYRDYTWAALAYRGY Patr-A0401,YSAMYEESVASTDVDTLYILFRDYTWAALAYTWY Patr-A0402,YSAMYEESVASTDVDTLYILFRDYTWAAWAYTGY Patr-A0404,YSAMYEESVAQTDVDTLYILFRDYTWAAWAYTGY Patr-A04:01,YSAMYEESVASTDVDTLYILFRDYTWAALAYTWY Patr-A04:02,YSAMYEESVASTDVDTLYILFRDYTWAAWAYTGY Patr-A04:04,YSAMYEESVAQTDVDTLYILFRDYTWAAWAYTGY Patr-A0501,YSAMYEESVAFTDVDTLYILFRDYTWAAWAYTGY Patr-A05:01,YSAMYEESVAFTDVDTLYILFRDYTWAAWAYTGY Patr-A0601,YSAMYQESVASTDANTLYIIYRDYTWAAWAYTGY Patr-A0602,YSAMYQESVAFTDANTLYIIYRDYTWAAWAYTGY Patr-A06:01,YSAMYQESVASTDANTLYIIYRDYTWAAWAYTGY Patr-A06:02,YSAMYQESVAFTDANTLYIIYRDYTWAAWAYTGY Patr-A0701,YSAMYRESVAGIYANTLYILFELYTWVAQAYRSY Patr-A07:01,YSAMYRESVAGIYANTLYILFELYTWVAQAYRSY Patr-A0801,YSAMYQESVAGIYANTLYIIFELYTWAARAYTWY Patr-A0802,YSAMYQESVAGIYANTLYILFELYTWAARAYTWY Patr-A0803,YSAMYQESVAGIYANTLYIIFELYTWAARAYTWY Patr-A08:01,YSAMYQESVAGIYANTLYIIFELYTWAARAYTWY Patr-A08:02,YSAMYQESVAGIYANTLYILFELYTWAARAYTWY Patr-A08:03,YSAMYQESVAGIYANTLYIIFELYTWAARAYTWY Patr-A0901,YSAMYEESVASTDVDTLYIIYRYYTWAALAYTWY Patr-A0902,YSAMYEESVASTDVDTLYIIYRDYTWAALAYTWY Patr-A09:01,YSAMYEESVASTDVDTLYIIYRYYTWAALAYTWY Patr-A09:02,YSAMYEESVASTDVDTLYIIYRDYTWAALAYTWY Patr-A1001,YSAMYQENMAFIYANTLYILFEHYTWAAWAYRGY Patr-A10:01,YSAMYQENMAFIYANTLYILFEHYTWAAWAYRGY Patr-A1101,YYAMYQENMASTDANTLYIIYRDYTWAARAYTGY Patr-A11:01,YYAMYQENMASTDANTLYIIYRDYTWAARAYTGY Patr-A1201,YSAMYEESVASTDANTLYILFEHYTWAALAYTWY Patr-A12:01,YSAMYEESVASTDANTLYILFEHYTWAALAYTWY Patr-A1301,YSAMYEESVAFTDANTLYILFRYYTWAAQAYTWY Patr-A13:01,YSAMYEESVAFTDANTLYILFRYYTWAAQAYTWY Patr-A1401,YSAMYEESVAFTDANTLYILFEHYTCAALAYTWY Patr-A14:01,YSAMYEESVAFTDANTLYILFEHYTCAALAYTWY Patr-A1501,YSAMYEESVAFTDANTLYILFEHYTWAAQAYTWY Patr-A1502,YSAMYEESVAFTDANTLYILFEHYTWAADAYTWY Patr-A15:01,YSAMYEESVAFTDANTLYILFEHYTWAAQAYTWY Patr-A15:02,YSAMYEESVAFTDANTLYILFEHYTWAADAYTWY Patr-A1601,YYAMYEESAAHTDVDTLYILYRDYTWAVLAYLGY Patr-A16:01,YYAMYEESAAHTDVDTLYILYRDYTWAVLAYLGY Patr-A1701,YYAMYEESTASTNVDTLYIIYRDYTWAVDAYTWY Patr-A1702,YYAMYEESAASTNVDTLYIIYRDYTWAVDAYTWY Patr-A1703,YYAMYQENMASTDVDTLYIIYRDYTWAVDAYTWY Patr-A17:01,YYAMYEESTASTNVDTLYIIYRDYTWAVDAYTWY Patr-A17:02,YYAMYEESAASTNVDTLYIIYRDYTWAVDAYTWY Patr-A17:03,YYAMYQENMASTDVDTLYIIYRDYTWAVDAYTWY Patr-A1801,YSAMYEESVAFTDVDTLYILFELYTWAEWAYRWY Patr-A18:01,YSAMYEESVAFTDVDTLYILFELYTWAEWAYRWY Patr-A2301,YSAMYRESVASTDANTLYILFRDYTWVAQAYRSY Patr-A23:01,YSAMYRESVASTDANTLYILFRDYTWVAQAYRSY Patr-A2401,YSAMYRESVAGTDANTLYIIYRDYTWAAWAYTGY Patr-A24:01,YSAMYRESVAGTDANTLYIIYRDYTWAAWAYTGY Patr-B0101,YYTMYRENMASTDENIAYWTYGYYTWAERAYTWY Patr-B0102,YYTMYRENMASTDENIAYWTYGYYTWAERAYTWY Patr-B01:01,YYTMYRENMASTDENIAYWTYGYYTWAERAYTWY Patr-B01:02,YYTMYRENMASTDENIAYWTYGYYTWAERAYTWY Patr-B0201,YYSEYREISTNTYESNLYIRYEYYTWAWLAYTWY Patr-B0203,YYSEYREISTNTYESNLYIRYEYYTWAWLAYTWY Patr-B02:01,YYSEYREISTNTYESNLYIRYEYYTWAWLAYTWY Patr-B02:03,YYSEYREISTNTYESNLYIRYEYYTWAWLAYTWY Patr-B0301,YDTMYRENVASTDENIAYWTFYYYTWAALAYTWY Patr-B0302,YDTMYRENVASTDENIAYWTFYYYTWAALAYTWY Patr-B03:01,YDTMYRENVASTDENIAYWTFYYYTWAALAYTWY Patr-B03:02,YDTMYRENVASTDENIAYWTFYYYTWAALAYTWY Patr-B0401,YYTKYREISTNTYVGNLYWTFRYYTWAVLAYTWY Patr-B0402,YYTKYREISTNTYVGNLYWTFRYYTWAVLAYTWY Patr-B04:01,YYTKYREISTNTYVGNLYWTFRYYTWAVLAYTWY Patr-B04:02,YYTKYREISTNTYVGNLYWTFRYYTWAVLAYTWY Patr-B0501,YYSEYREISTNTYESNLYIRYEYYTWAWLAYTWY Patr-B0502,YYSEYREISTNTYESNLYIRYEYYTWARLAYTWY Patr-B05:01,YYSEYREISTNTYESNLYIRYEYYTWAWLAYTWY Patr-B05:02,YYSEYREISTNTYESNLYIRYEYYTWARLAYTWY Patr-B0601,YYSMYRENVASTDGSNLYWTYDYYTWAVWAYLWY Patr-B06:01,YYSMYRENVASTDGSNLYWTYDYYTWAVWAYLWY Patr-B0701,YLTMYRENVASTYENIAYLTYRFYTWAVHAYLWY Patr-B0702,YLTMYRENVAFTYENIAYITFRYYTWAVHAYLWY Patr-B07:01,YLTMYRENVASTYENIAYLTYRFYTWAVHAYLWY Patr-B07:02,YLTMYRENVAFTYENIAYITFRYYTWAVHAYLWY Patr-B0801,YYAMYREISTNTYVGNLYWTYRFYTWAWLAYTWY Patr-B0802,YYAMYREISTNTYVGNLYWTYRFYTWAWLAYTWY Patr-B08:01,YYAMYREISTNTYVGNLYWTYRFYTWAWLAYTWY Patr-B08:02,YYAMYREISTNTYVGNLYWTYRFYTWAWLAYTWY Patr-B0901,YYTMYRENMASTDENIAYIRYYYYTWAARAYTWY Patr-B09:01,YYTMYRENMASTDENIAYIRYYYYTWAARAYTWY Patr-B1001,YYTMYRENMASTDENIAYWTYGYYTWAERAYTWY Patr-B10:01,YYTMYRENMASTDENIAYWTYGYYTWAERAYTWY Patr-B1101,YYSEYRNIYAQTDVGNLYWTYDYYTWAERAYLWY Patr-B1102,YYSEYRNIYAQTDVGNLYWTYDYYTWAVWAYLWY Patr-B11:01,YYSEYRNIYAQTDVGNLYWTYDYYTWAERAYLWY Patr-B11:02,YYSEYRNIYAQTDVGNLYWTYDYYTWAVWAYLWY Patr-B1202,YYSEYRNICAQTDGSNLYLRYYDYTWAVHAYLWY Patr-B12:02,YYSEYRNICAQTDGSNLYLRYYDYTWAVHAYLWY Patr-B1301,YYSEYRNIYAQTDVSNLYLSYEYYTWAVRAYTWY Patr-B13:01,YYSEYRNIYAQTDVSNLYLSYEYYTWAVRAYTWY Patr-B1401,YYAMYRNGITQTDENTLYLSYDYYTWAVLAYTWY Patr-B14:01,YYAMYRNGITQTDENTLYLSYDYYTWAVLAYTWY Patr-B1601,YYTKYREISTNTDVSNLYWTFRYYTWAVLAYTWY Patr-B1602,YYTKYREISTNTDESNLYWTFRYYTWAVLAYTWY Patr-B16:01,YYTKYREISTNTDVSNLYWTFRYYTWAVLAYTWY Patr-B16:02,YYTKYREISTNTDESNLYWTFRYYTWAVLAYTWY Patr-B1701,YYSVYREIFTNTDVSNLYLTYYYYSFAALAYTWY Patr-B1702,YYSVYREIFTNTDGSNLYLTYYYYSFAALAYTWY Patr-B1703,YFTVYRQISTNTDGSNLYLTYYYYSFAALAYTWY Patr-B17:01,YYSVYREIFTNTDVSNLYLTYYYYSFAALAYTWY Patr-B17:02,YYSVYREIFTNTDGSNLYLTYYYYSFAALAYTWY Patr-B17:03,YFTVYRQISTNTDGSNLYLTYYYYSFAALAYTWY Patr-B1801,YFTMYRENVASTDENIAYIRYYSYTWAERAYTWY Patr-B18:01,YFTMYRENVASTDENIAYIRYYSYTWAERAYTWY Patr-B1901,YYSEYRNIYAQTDENIAYLTYYDYTWAELAYTWY Patr-B19:01,YYSEYRNIYAQTDENIAYLTYYDYTWAELAYTWY Patr-B2001,YYTMYRENVASTDENIAYWTYGFYTWAVLAYTWY Patr-B20:01,YYTMYRENVASTDENIAYWTYGFYTWAVLAYTWY Patr-B2101,YYTMYRQISTNTYESNLYITYRFYTWAWLAYLWY Patr-B21:01,YYTMYRQISTNTYESNLYITYRFYTWAWLAYLWY Patr-B2201,YYTKYREISTNTYESNLYLTFDYYTWAALAYEWY Patr-B2202,YYTKYREISTNTYENIAYLTFDYYTWAALAYEWY Patr-B22:01,YYTKYREISTNTYESNLYLTFDYYTWAALAYEWY Patr-B22:02,YYTKYREISTNTYENIAYLTFDYYTWAALAYEWY Patr-B2301,YYSEYREISTNTYENIAYLTYRFYTWAWWAYTWY Patr-B2302,YYSEYREISTNTYENIAYLTYRFYTWAWLAYLWY Patr-B2303,YYSEYREISTNTYENTLYLTYRYYTWAWLAYLWY Patr-B23:01,YYSEYREISTNTYENIAYLTYRFYTWAWWAYTWY Patr-B23:02,YYSEYREISTNTYENIAYLTYRFYTWAWLAYLWY Patr-B23:03,YYSEYREISTNTYENTLYLTYRYYTWAWLAYLWY Patr-B2401,YYTKYREISTNTDENTLYWTFRFYTWAVRAYTWY Patr-B2402,YYTKYREISTNTDENTLYWTFRYYTWAVRAYTWY Patr-B24:01,YYTKYREISTNTDENTLYWTFRFYTWAVRAYTWY Patr-B24:02,YYTKYREISTNTDENTLYWTFRYYTWAVRAYTWY Patr-B2501,YLAMYRENMAFTYENIAYLTYRFYTWAERAYLWY Patr-B25:01,YLAMYRENMAFTYENIAYLTYRFYTWAERAYLWY Patr-B2601,YYTMYRENVAFTDENTLYLTYEFYTWAEHAYLGY Patr-B26:01,YYTMYRENVAFTDENTLYLTYEFYTWAEHAYLGY Patr-B2701,YYTMYRENVASTDGSNLYLTYYYYTWAVWAYLWY Patr-B27:01,YYTMYRENVASTDGSNLYLTYYYYTWAVWAYLWY Patr-B2801,YYTEYRNIFAQTDVGNLYWTYYHYTWAARAYTWY Patr-B28:01,YYTEYRNIFAQTDVGNLYWTYYHYTWAARAYTWY Patr-B2901,YYAMYGNGVTQTDESNLYWTYGYYTWAVLAYTWY Patr-B29:01,YYAMYGNGVTQTDESNLYWTYGYYTWAVLAYTWY Patr-B3001,YYTKYREISTNTYENIAYIRYDYYTWAWHAYEWY Patr-B30:01,YYTKYREISTNTYENIAYIRYDYYTWAWHAYEWY Patr-B3501,YYAMYRNIYAQTDESNLYIRYEYYTWAWLAYTWY Patr-B35:01,YYAMYRNIYAQTDESNLYIRYEYYTWAWLAYTWY Patr-B3601,YYAMYRNGVAQTDENIAYIRYEYYTWAWLAYTWY Patr-B36:01,YYAMYRNGVAQTDENIAYIRYEYYTWAWLAYTWY Patr-B3701,YYAMYRNGVAQTDENIAYIRYYYYTWAARAYTWY Patr-B37:01,YYAMYRNGVAQTDENIAYIRYYYYTWAARAYTWY Patr-C0201,YDSGYREKYRQADVSNLYLWYGSYTWAELAYKSY Patr-C0202,YDSGYREKYRQADVSNLYLWYGSYTWAELAYKWY Patr-C0203,YDSGYREKYRQADVNKLYLRSGYYTWAELAYKWY Patr-C0204,YDSGYREKYRQADVSNLYLRSGSYTWAELAYKWY Patr-C0205,YDSGYREKYRQADVSNLYLRSGSYTWAELAYKWY Patr-C0206,YDSGYREKYRQADVSNLYLWYGSYTWAELAYKWY Patr-C02:01,YDSGYREKYRQADVSNLYLWYGSYTWAELAYKSY Patr-C02:02,YDSGYREKYRQADVSNLYLWYGSYTWAELAYKWY Patr-C02:03,YDSGYREKYRQADVNKLYLRSGYYTWAELAYKWY Patr-C02:04,YDSGYREKYRQADVSNLYLRSGSYTWAELAYKWY Patr-C02:05,YDSGYREKYRQADVSNLYLRSGSYTWAELAYKWY Patr-C02:06,YDSGYREKYRQADVSNLYLWYGSYTWAELAYKWY Patr-C0301,YYAGYREKYRQADVNKLYLSYGYYTWAERAYLWY Patr-C0302,YYAGYREKYRQADVNKLYLSYELYTWAERAYLWY Patr-C0303,YYAGYREKYRQADVNKLYLSYELYTWAERAYLWY Patr-C0304,YYAGYREKYRQADVSNLYLKYEFYTWAERAYLWY Patr-C03:01,YYAGYREKYRQADVNKLYLSYGYYTWAERAYLWY Patr-C03:02,YYAGYREKYRQADVNKLYLSYELYTWAERAYLWY Patr-C03:03,YYAGYREKYRQADVNKLYLSYELYTWAERAYLWY Patr-C03:04,YYAGYREKYRQADVSNLYLKYEFYTWAERAYLWY Patr-C0401,YYAGYREKYRQADVNKLYLKYEFYTWAALAYLWY Patr-C04:01,YYAGYREKYRQADVNKLYLKYEFYTWAALAYLWY Patr-C0501,YYAGYREKYRQADVSNLYLWYDYYTLAALAYTWY Patr-C0502,YYAGYREKYRQADVSNLYLSYDYYTLAALAYTWY Patr-C05:01,YYAGYREKYRQADVSNLYLWYDYYTLAALAYTWY Patr-C05:02,YYAGYREKYRQADVSNLYLSYDYYTLAALAYTWY Patr-C0601,YYAGYREKYRQADVSNLYLSYDYYTLAALAYLWY Patr-C06:01,YYAGYREKYRQADVSNLYLSYDYYTLAALAYLWY Patr-C0701,YYAGYREKYRQADVSNLYLSYDYYTWAAHAYLWY Patr-C07:01,YYAGYREKYRQADVSNLYLSYDYYTWAAHAYLWY Patr-C0801,YYAGYREKYRQADVSNLYLSYDYYTLAALAYLWY Patr-C08:01,YYAGYREKYRQADVSNLYLSYDYYTLAALAYLWY Patr-C0901,YYAGYREKYRQADVNKLYLKYEFYTLAAWAYLWY Patr-C0902,YYAGYRENYRQADVNKLYLKYEFYTLAAWAYLWY Patr-C0903,YYAGYRENYRQADVNKLYLKYEFYTLAAWAYLWY Patr-C0904,YYAGYREIYRQADVNKLYLKYEFYTLAAWAYLWY Patr-C0905,YYAGYRQIYRQADVNKLYLKYEFYTLAALAYTWY Patr-C09:01,YYAGYREKYRQADVNKLYLKYEFYTLAAWAYLWY Patr-C09:02,YYAGYRENYRQADVNKLYLKYEFYTLAAWAYLWY Patr-C09:03,YYAGYRENYRQADVNKLYLKYEFYTLAAWAYLWY Patr-C09:04,YYAGYREIYRQADVNKLYLKYEFYTLAAWAYLWY Patr-C09:05,YYAGYRQIYRQADVNKLYLKYEFYTLAALAYTWY Patr-C1001,YDSGYRQIYRQADVNKLYIRFSSYTWAALAYTWH Patr-C10:01,YDSGYRQIYRQADVNKLYIRFSSYTWAALAYTWH Patr-C1101,YYAGYREKYRQADVSNLYLSYDYYTLAARAYLWY Patr-C11:01,YYAGYREKYRQADVSNLYLSYDYYTLAARAYLWY Patr-C1201,YYAGYREKYRQADVNKLYLSYDYYTLAALAYLWY Patr-C12:01,YYAGYREKYRQADVNKLYLSYDYYTLAALAYLWY Patr-C1301,YDSGYQEKYRQADVNKLYLRSEFYTWAALAYLWY Patr-C1302,YDSGYQEKYRQADVNKLYLRSEFYTWAALAYLWY Patr-C13:01,YDSGYQEKYRQADVNKLYLRSEFYTWAALAYLWY Patr-C13:02,YDSGYQEKYRQADVNKLYLRSEFYTWAALAYLWY Patr-C1501,YYAGYREKYRQADVSNLYLWYDYYTLAALAYLWY Patr-C15:01,YYAGYREKYRQADVSNLYLWYDYYTLAALAYLWY Patr-C1601,YYAGYREKYRQADVSNLYLWYDYYTWAERAYLWY Patr-C16:01,YYAGYREKYRQADVSNLYLWYDYYTWAERAYLWY SLA-1-CHANGDA,YSAMYRNNVGSINVNTLCLWYDFYPWAAWSYTSY SLA-1-HB01,YYAMYREIQDTTYGNTLYLSYSDYTWAVESYLSY SLA-1-HB02,YYAMYREIQDTTYGTTLYLSYSDYTWAVESYLSY SLA-1-HB03,YYAMYREIQDTTYGTTLYLSYSDYTWAVESYLSY SLA-1-HB04,YYAMYREIQDTTYGNTLYLSYSDYTWAVESYLSY SLA-1-LWH,YYEMYRERVEETFVNTAYLRYRDYSWAEMSYLGY SLA-1-TPK,HYIMYREISETTYVSNLYYNYSYYSWAAWSYRWY SLA-1-YC,YSAMYEEKVDNTYVNTLYLSFRDYTWAAMSYLSY SLA-1-YDL01,YYAMYRENVETTYVGTLYLSYRDYTWAERSYLSY SLA-1-YTH,YSAMYEEKVDTTYVNTLYLSSHYYSWAVRSYLSY SLA-10101,YYAMYREKQDTTYVGNLYYSYRYYTWAVRSYLSY SLA-10201,YYAMYEEKVDNTLVGTLYLSFRDYSWAEMSYRGY SLA-10202,YYAMYEEKVDNTLVGTLYLSFRDYSWAEMSYRGY SLA-10401,YYAMYRENVETTYVGTLYLSYRDYTWAERSYLSY SLA-104:01,YYAMYRENVETTYVGTLYLSYRDYTWAERSYLSY SLA-10501,YSAMYREKQDTTFVNTAYLSYSDYTWAVMSYLSY SLA-10601,YYAMYEEKVDNTYVGTLYLSYRDYSRAAESYLSY SLA-10701,YYAEYRNIYETTYVNTLYIIYRDYTWAVLSYRGY SLA-10702,YYAEYRNIYETTYVNTLYIIYRDYTWAVLSYRGY SLA-107:01,YYAEYRNIYETTYVNTLYIIYRDYTWAVLSYRGY SLA-107:02,YYAEYRNIYETTYVNTLYIIYRDYTWAVLSYRGY SLA-10801,YYIMYREISETTYVGTLYLRYRDYSWAEMSYLGY SLA-11101,YSEMYRERVGNTFGSNLYLWYSFYSWAARSYTWY SLA-11201,YYEMYEEKVETINVDTLYLSFRDYTWAEWSYLSY SLA-11301,YYAMYEEKVDNTYVGTLYLSFRDYTWAVRSYLSY SLA-1:0101,YYAMYREKQDTTYVGNLYYSYRYYTWAVRSYLSY SLA-1:0201,YYAMYEEKVDNTLVGTLYLSFRDYSWAEMSYRGY SLA-1:0202,YYAMYEEKVDNTLVGTLYLSFRDYSWAEMSYRGY SLA-1:0401,YYAMYRENVETTYVGTLYLSYRDYTWAERSYLSY SLA-1:0501,YSAMYREKQDTTFVNTAYLSYSDYTWAVMSYLSY SLA-1:0601,YYAMYEEKVDNTYVGTLYLSYRDYSRAAESYLSY SLA-1:0701,YYAEYRNIYETTYVNTLYIIYRDYTWAVLSYRGY SLA-1:0702,YYAEYRNIYETTYVNTLYIIYRDYTWAVLSYRGY SLA-1:0801,YYIMYREISETTYVGTLYLRYRDYSWAEMSYLGY SLA-1:1101,YSEMYRERVGNTFGSNLYLWYSFYSWAARSYTWY SLA-1:1201,YYEMYEEKVETINVDTLYLSFRDYTWAEWSYLSY SLA-1:1301,YYAMYEEKVDNTYVGTLYLSFRDYTWAVRSYLSY SLA-1:es11,YSAMYRNNVGSINVNTLYLWYDFYSWAAWSYTSY SLA-2-YDL02,YYAMYRENVETTYVGTLYLSYRDYTWAERSYLSY SLA-20101,YSAMYRENVGSTDVNTLYISYSDYTWAVMSYLGY SLA-20102,YSAMYRENVGSTDVNTLYISYRDYTWAVESYTWY SLA-20201,YYTEYREISETTYVNTLYLRYSFYSFAVESYLGY SLA-20202,YYTEYREISETTYVNTLYLRYSFYSFAVESYLGY SLA-20301,YYAMYREIQDTTYVDTLYLSYRFYSWAAESYRWY SLA-20302,YYAMYREIQDTTYVDTLYLRYHDYSWAVLSYRSY SLA-20401,YDEMYRNNAGNIYGNTAYIIYSDYTWAERSYTWY SLA-20401,YDEMYRNNAGNIYGNTAYIIYSDYTWAERSYTWY SLA-20402,YDEMYRNNAGNIYGNTAYLIYSDYTWAVWSYTWY SLA-204:01,YDEMYRNNAGNIYGNTAYIIYSDYTWAERSYTWY SLA-20501,YYAMYEENAGSTFVNTAYFWYSYYTWAVRSYLWY SLA-20502,YYAMYRNNARSTFVNTAYFSYRYYTWAVESYLSY SLA-205:02,YYAMYRNNARSTFVNTAYFSYRYYTWAVESYLSY SLA-20601,YHTKYREISDYRYVGTLYYRYDFYTWAAESYTWY SLA-20701,YSAMYRENVGSTDVSNLYLVYRFYSFAVESYLGY SLA-21001,YYIMYREISDNINVNTLYLRYDDYSRAEMSYRWY SLA-21002,YYIMYREISETNYVDTLYLRYRDYTWAVESYRWY SLA-21201,YYAMYRENVGSTDVNTLYFWYSFYSWAVWSYLSY SLA-2:0101,YSAMYRENVGSTDVNTLYISYSDYTWAVMSYLGY SLA-2:0102,YSAMYRENVGSTDVNTLYISYRDYTWAVESYTWY SLA-2:0201,YYTEYREISETTYVNTLYLRYSFYSFAVESYLGY SLA-2:0202,YYTEYREISETTYVNTLYLRYSFYSFAVESYLGY SLA-2:0301,YYAMYREIQDTTYVDTLYLSYRFYSWAAESYRWY SLA-2:0302,YYAMYREIQDTTYVDTLYLRYHDYSWAVLSYRSY SLA-2:0401,YDEMYRNNAGNIYGNTAYIIYSDYTWAERSYTWY SLA-2:0402,YDEMYRNNAGNIYGNTAYLIYSDYTWAVWSYTWY SLA-2:0501,YYAMYEENAGSTFVNTAYFWYSYYTWAVRSYLWY SLA-2:0502,YYAMYRNNARSTFVNTAYFSYRYYTWAVESYLSY SLA-2:0601,YHTKYREISDYRYVGTLYYRYDFYTWAAESYTWY SLA-2:0701,YSAMYRENVGSTDVSNLYLVYRFYSFAVESYLGY SLA-2:1001,YYIMYREISDNINVNTLYLRYDDYSRAEMSYRWY SLA-2:1002,YYIMYREISETNYVDTLYLRYRDYTWAVESYRWY SLA-2:1101,YYAEYRNIYETIYGNTAYFSYSFYTWAARSYLSY SLA-2:1201,YYAMYRENVGSTDVNTLYFWYSFYSWAVWSYLSY SLA-2:CDY.AA,YYAMYREIQDNTFVNTAYFSYSYYTWAEWSYLGY SLA-2:HB01,YYIMYREISETNYVDTLYIRYRDYTWVEESYRWY SLA-2:LWH.AA,YYTMYREKVETTYVGTLYISFHDYTWAAWSYLGY SLA-2:TPK.AA,YYTEYRNIYETIYVGNLYFSYSDYTRAAWSYTGY SLA-2:YC.AA,YYAMYEEKVGSTFVNTAYFWYSYYSWAVESYLSY SLA-2:YDL.AA,YYAMYRENVETTYVGTLYLSYRDYTWAERSYLSY SLA-2:YDY.AA,YDSMYEENAGSTFVNNLYLSYSDYTWAEMSYAWY SLA-2:YTH.AA,YSSEYEEKAGSTFVGNLCLSYHDYSRAVWSYLSC SLA-2:es22,YYAMYREIQDNTFVNTAYFSYSYYTWAEWSYLGY SLA-3-CDY,YDSMYEENAGSTFVNNLYLSYSDYTWAEMSYAWY SLA-3-HB01,YDEMYREISDNTYVNNLYLSYSFYTRAAMSYAGY SLA-3-LWH,YYAMYREIQDTTYGNTLYLSYSDYTWAVESYLSY SLA-3-TPK,YDEMYREIGDNTYVNNLYLSYSFYTRAAMSYAGY SLA-3-YC,YDEMYEENAGSTFVNTLYLSYSDYTKAAMSYAWY SLA-3-YDL,YDEMYREIGDNTYVNNLYLSYSFYTRAAMSYAGY SLA-3-YDY01,YDSMYEENAGSTFVNNLYLSYSDYTWAEMSYAWY SLA-3-YDY02,YDSMYEENAGSTFVNNLYLSYSDYTWAEMSYAWY SLA-3-YTH,YDSMYEENAGSTFVNNLYLSYSDYTRAAMSYAWY SLA-30101,YDSMYEENAGSTFVNNLYFSYSFYTRAAMSYAWY SLA-30301,YDSMYEENAGSTFVNNLYLSYHDYAWAVWSYAWY SLA-30302,YDSMYRENSDNRYVNNLYIRYHDYSWAAWSYAGY SLA-30303,YDSMYEENAGSTFVNNLYLSYHDYAWAVWSYAWY SLA-30304,YDSMYEENAGSTFVNNLYLSYHDYAWAAWSYAWY SLA-30401,YDEMYKENAGSTFVNNLYLSYSDYTRAAMSYAWY SLA-30401,YDEMYKENAGSTFVNNLYLSYSDYTRAAMSYAWY SLA-30402,YDEMYEENAGSTFVNKLYLSYSDYTRDAMSYAWY SLA-304:01,YDEMYKENAGSTFVNNLYLSYSDYTRAAMSYAWY SLA-30501,YDEMYREISDNTYVNNLYLSYSFYTRAAMSYAGY SLA-30502,YDEMYREISDNTYVNNLYLSYSFYTRAAMSYAGY SLA-30503,YDEMYREISDNTYVNNLYLSYSFYTRAAMSYAGY SLA-30601,YDSMYEENAGSTFVNNLYLSYSDYTWAEMSYAWY SLA-30602,YDSMYEENAGSTFVNNLYYWYSDYTRAAMSYAWY SLA-3:0101,YDSMYEENAGSTFVNNLYFSYSFYTRAAMSYAWY SLA-3:0301,YDSMYEENAGSTFVNNLYLSYHDYAWAVWSYAWY SLA-3:0302,YDSMYRENSDNRYVNNLYIRYHDYSWAAWSYAGY SLA-3:0303,YDSMYEENAGSTFVNNLYLSYHDYAWAVWSYAWY SLA-3:0304,YDSMYEENAGSTFVNNLYLSYHDYAWAAWSYAWY SLA-3:0401,YDEMYKENAGSTFVNNLYLSYSDYTRAAMSYAWY SLA-3:0402,YDEMYEENAGSTFVNKLYLSYSDYTRDAMSYAWY SLA-3:0501,YDEMYREISDNTYVNNLYLSYSFYTRAAMSYAGY SLA-3:0502,YDEMYREISDNTYVNNLYLSYSFYTRAAMSYAGY SLA-3:0503,YDEMYREISDNTYVNNLYLSYSFYTRAAMSYAGY SLA-3:0601,YDSMYEENAGSTFVNNLYLSYSDYTWAEMSYAWY SLA-3:0602,YDSMYEENAGSTFVNNLYYWYSDYTRAAMSYAWY SLA-3:0701,YDSMYEENAGSTFVNNLYLSYSDYTRAAMSYAWY SLA-6:0101,YHSVYRQIAEHASSNVINFWSEFYIWEVYAYEWY SLA-6:0102,YHSVYRQIAEHASSNVINFWSEFYIWEVYAYEWY SLA-6:0103,YHSVYRQIAEHASSNVINFWSEFYIWEVYAYEWY SLA-6:0104,YHSVYRQIAEHASSNVINFWSEFYIWEVYAYEWY SLA-6:0105,YHSVYRQIAEHASSNVINFWSEFYIWEVYAYEWYmhcflurry-2.3.6/downloads-generation/allele_sequences/select_alleles_to_disambiguate.py000066400000000000000000000026501525677230600317630ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Select alleles to disambiguate """ from __future__ import print_function import sys import argparse import pandas parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "train_data", help="Path to training data CSV. Must have column: allele") parser.add_argument( "--min-count", type=int, metavar="N", help="Keep only alleles with at least N measurements") parser.add_argument( "--out", help="Result file.") def run(): args = parser.parse_args(sys.argv[1:]) print(args) df = pandas.read_csv(args.train_data) if args.min_count: allele_counts = df.allele.value_counts() df = df.loc[ df.allele.map(allele_counts) > args.min_count ] df.drop_duplicates("allele").allele.to_csv( args.out, header=False, index=False) print("Wrote: ", args.out) if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/analysis_predictor_info/000077500000000000000000000000001525677230600246065ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/analysis_predictor_info/GENERATE.sh000077500000000000000000000120051525677230600263350ustar00rootroot00000000000000#!/bin/bash # # # Usage: GENERATE.sh # # cluster mode uses an HPC cluster (Mount Sinai chimera cluster, which uses lsf job # scheduler). This would need to be modified for other sites. # set -e set -x DOWNLOAD_NAME=analysis_predictor_info SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") if [ "$1" != "cluster" ] then GPUS=$(nvidia-smi -L 2> /dev/null | wc -l) || GPUS=0 echo "Detected GPUS: $GPUS" PROCESSORS=$(getconf _NPROCESSORS_ONLN) echo "Detected processors: $PROCESSORS" if [ "$GPUS" -eq "0" ]; then NUM_JOBS=${NUM_JOBS-1} else NUM_JOBS=${NUM_JOBS-$GPUS} fi echo "Num jobs: $NUM_JOBS" PARALLELISM_ARGS+=" --num-jobs $NUM_JOBS --max-tasks-per-worker 1 --gpus $GPUS --max-workers-per-gpu 1" else PARALLELISM_ARGS+=" --cluster-parallelism --cluster-max-retries 3 --cluster-submit-command bsub --cluster-results-workdir $HOME/mhcflurry-scratch --cluster-script-prefix-path $SCRIPT_DIR/cluster_submit_script_header.mssm_hpc.lsf" fi mkdir -p "$SCRATCH_DIR" if [ "$2" != "continue-incomplete" ] then echo "Fresh run" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" else echo "Continuing incomplete run" fi # Send stdout and stderr to a logfile included with the archive. LOG="$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.$(date +%s).txt" exec > >(tee -ia "$LOG") exec 2> >(tee -ia "$LOG" >&2) # Log some environment info echo "Invocation: $0 $@" date pip freeze git status cd $SCRATCH_DIR/$DOWNLOAD_NAME export OMP_NUM_THREADS=1 export PYTHONUNBUFFERED=1 ####### GENERATION OF BINDING MOTIFS AND OTHER ARTIFACTS ####### if [ "$2" == "continue-incomplete" ] && [ -f "motifs/artifacts.csv" ] then echo "Reusing existing artifacts" else echo "Using affinity predictor:" cat "$(mhcflurry-downloads path models_class1_pan)/models.combined/info.txt" mkdir motifs cp "$(mhcflurry-downloads path models_class1_pan)/models.combined/info.txt" motifs/ cp $SCRIPT_DIR/generate_artifacts.py . time python generate_artifacts.py \ --affinity-predictor "$(mhcflurry-downloads path models_class1_pan)/models.combined" \ --out "$(pwd)/motifs" \ $PARALLELISM_ARGS fi ####### EVALUATION ON MODEL SELECTION DATA ####### if [ "$2" == "continue-incomplete" ] && [ -f "model_selection_with_decoys.csv.bz2" ] then echo "Reusing existing model_selection_with_decoys data" else echo "Using affinity predictor:" cat "$(mhcflurry-downloads path models_class1_pan)/models.combined/info.txt" cp $SCRIPT_DIR/generate_model_selection_with_decoys.py . time python generate_model_selection_with_decoys.py \ "$(mhcflurry-downloads path models_class1_pan)/models.combined/model_selection_data.csv.bz2" \ --out "$(pwd)/model_selection_with_decoys.csv" bzip2 -f model_selection_with_decoys.csv fi if [ "$2" == "continue-incomplete" ] && [ -f "model_selection_with_decoys.predictions.selected.csv.bz2" ] then echo "Reusing existing model_selection_with_decoys.predictions.selected.data" else echo "Using affinity predictor:" cat "$(mhcflurry-downloads path models_class1_pan)/models.combined/info.txt" cp $SCRIPT_DIR/predict_on_model_selection_data.py . time python predict_on_model_selection_data.py \ "$(mhcflurry-downloads path models_class1_pan)/models.combined" \ --data "$(pwd)/model_selection_with_decoys.csv.bz2" \ --out "$(pwd)/model_selection_with_decoys.predictions.selected.csv" \ $PARALLELISM_ARGS bzip2 -f model_selection_with_decoys.predictions.selected.csv fi if [ "$2" == "continue-incomplete" ] && [ -f "model_selection_with_decoys.predictions.unselected.csv.bz2" ] then echo "Reusing existing model_selection_with_decoys.predictions.unselected data" else echo "Using affinity predictor:" cat "$(mhcflurry-downloads path models_class1_pan_unselected)/models.unselected.combined/info.txt" cp $SCRIPT_DIR/predict_on_model_selection_data.py . time python predict_on_model_selection_data.py \ "$(mhcflurry-downloads path models_class1_pan_unselected)/models.unselected.combined" \ --data "$(pwd)/model_selection_with_decoys.csv.bz2" \ --out "$(pwd)/model_selection_with_decoys.predictions.unselected.csv" \ $PARALLELISM_ARGS bzip2 -f model_selection_with_decoys.predictions.unselected.csv fi cp $SCRIPT_ABSOLUTE_PATH . bzip2 -f "$LOG" for i in $(ls LOG-worker.*.txt) ; do bzip2 -f $i ; done RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.$(date +%Y%m%d).tar.bz2" tar -cjf "$RESULT" * echo "Created archive: $RESULT" # Split into <2GB chunks for GitHub PARTS="${RESULT}.part." # Check for pre-existing part files and rename them. for i in $(ls "${PARTS}"* ) do DEST="${i}.OLD.$(date +%s)" echo "WARNING: already exists: $i . Moving to $DEST" mv $i $DEST done split -b 2000M "$RESULT" "$PARTS" echo "Split into parts:" ls -lh "${PARTS}"* cluster_submit_script_header.mssm_hpc.lsf000066400000000000000000000024611525677230600350100ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/analysis_predictor_info#!/bin/bash #BSUB -J MHCf-{work_item_num} # Job name #BSUB -P acc_nkcancer # allocation account or Unix group #BSUB -q gpu # queue #BSUB -R rusage[ngpus_excl_p=1] # 1 exclusive GPU #BSUB -R span[hosts=1] # one node #BSUB -n 1 # number of compute cores #BSUB -W 10:00 # walltime in HH:MM #BSUB -R rusage[mem=20000] # mb memory requested #BSUB -o {work_dir}/%J.stdout # output log (%J : JobID) #BSUB -eo {work_dir}/STDERR # error log #BSUB -L /bin/bash # Initialize the execution environment # set -e set -x echo "Subsequent stderr output redirected to stdout" >&2 exec 2>&1 export TMPDIR=/local/JOBS/mhcflurry-{work_item_num} export PATH=$HOME/.conda/envs/py36b/bin/:$PATH export PYTHONUNBUFFERED=1 export KMP_SETTINGS=1 free -m module add cuda/10.0.130 module list export CUDNN_HOME=/hpc/users/odonnt02/oss/cudnn/cuda export LD_LIBRARY_PATH=$CUDNN_HOME/lib64:$LD_LIBRARY_PATH export CMAKE_LIBRARY_PATH=$CUDNN_HOME/lib64:$CMAKE_LIBRARY_PATH export INCLUDE_PATH=$CUDNN_HOME/include:$INCLUDE_PATH export C_INCLUDE_PATH=$CUDNN_HOME/include:$C_INCLUDE_PATH export CPLUS_INCLUDE_PATH=$CUDNN_HOME/include:$CPLUS_INCLUDE_PATH export CMAKE_INCLUDE_PATH=$CUDNN_HOME/include:$CMAKE_INCLUDE_PATH python -c 'import tensorflow as tf ; print("GPU AVAILABLE" if tf.test.is_gpu_available() else "GPU NOT AVAILABLE")' env cd {work_dir} mhcflurry-2.3.6/downloads-generation/analysis_predictor_info/generate_artifacts.py000066400000000000000000000320101525677230600310060ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Generate images for MHC binding motifs. Note: a shared filesystem is assumed even when running on an HPC cluster. The --out directory should be on an NFS filesystem and available to the workers. """ import sys import argparse import os import numpy import time import collections from functools import partial import pandas import tqdm tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 from mhcflurry.common import configure_logging from mhcflurry.downloads import get_path from mhcflurry.local_parallelism import ( add_local_parallelism_args, worker_pool_with_gpu_assignments_from_args, call_wrapped_kwargs) from mhcflurry.cluster_parallelism import ( add_cluster_parallelism_args, cluster_results_from_args) # To avoid pickling large matrices to send to child processes when running in # parallel, we use this global variable as a place to store data. Data that is # stored here before creating the thread pool will be inherited to the child # processes upon fork() call, allowing us to share large data with the workers # via shared memory. GLOBAL_DATA = {} WORKER_CONTEXT = GLOBAL_DATA parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "--affinity-predictor", metavar="DIR", help="Pan-allele class I affinity predictor") parser.add_argument( "--frequency-matrices", metavar="CSV", help="Frequency matrices") parser.add_argument( "--length-distributions", metavar="CSV", help="Length distributions") parser.add_argument( "--train-data", metavar="CSV", help="Training data") parser.add_argument( "--alleles", nargs="+", help="Alleles to process. If not specified all alleles are used") parser.add_argument( "--max-alleles", type=int, help="Max number of allelels to process. For debugging.") parser.add_argument( "--chunk-size", type=int, default=100, help="Number of alleles per job") parser.add_argument( "--logo-lengths", type=int, nargs="+", default=[8, 9, 10, 11], help="Peptide lengths for motif logos") parser.add_argument( "--length-distribution-lengths", nargs="+", default=[8, 9, 10, 11, 12, 13, 14, 15], type=int, help="Peptide lengths for length distribution plots", ) parser.add_argument( "--logo-cutoff", default=0.01, type=float, help="Fraction of top to use for motifs", ) parser.add_argument( "--length-cutoff", default=0.01, type=float, help="Fraction of top to use for length distribution", ) parser.add_argument( "--out", metavar="DIR", required=True, help="Directory to write results to") add_local_parallelism_args(parser) add_cluster_parallelism_args(parser) def run(): from mhcflurry.amino_acid import COMMON_AMINO_ACIDS args = parser.parse_args(sys.argv[1:]) configure_logging() serial_run = not args.cluster_parallelism and args.num_jobs == 0 if not args.affinity_predictor: args.affinity_predictor = get_path( "models_class1_pan", "models.combined") print("Using downloaded affinity predictor: ", args.affinity_predictor) if not args.frequency_matrices: args.frequency_matrices = os.path.join( args.affinity_predictor, "frequency_matrices.csv.bz2") if not args.length_distributions: args.length_distributions = os.path.join(args.affinity_predictor, "length_distributions.csv.bz2") if not args.train_data: args.train_data = os.path.join(args.affinity_predictor, "train_data.csv.bz2") frequency_matrices_df = pandas.read_csv(args.frequency_matrices) length_distributions = pandas.read_csv(args.length_distributions) train_data = pandas.read_csv(args.train_data) alleles = args.alleles if alleles: print("Using specified alleles, ", *alleles) else: alleles = frequency_matrices_df.allele.unique() if args.max_alleles: alleles = alleles[:args.max_alleles] print("Using %d alleles" % len(alleles), alleles) amino_acids = sorted(COMMON_AMINO_ACIDS) distribution = frequency_matrices_df.loc[ (frequency_matrices_df.cutoff_fraction == 1.0), amino_acids ].mean(0) normalized_frequency_matrices = frequency_matrices_df.copy() normalized_frequency_matrices.loc[:, amino_acids] = ( normalized_frequency_matrices[amino_acids] / distribution) GLOBAL_DATA["args"] = args GLOBAL_DATA["normalized_frequency_matrices"] = normalized_frequency_matrices GLOBAL_DATA["length_distributions"] = length_distributions GLOBAL_DATA["train_data"] = train_data artifacts_out = os.path.join(args.out, "artifacts") if not os.path.exists(args.out): os.mkdir(args.out) if not os.path.exists(artifacts_out): os.mkdir(artifacts_out) tasks = [ { "task_num": i, "allele": allele, "out_dir": artifacts_out, } for (i, allele) in enumerate(alleles) ] jobs = [] for task in tasks: if not jobs or len(jobs[-1]['tasks']) >= args.chunk_size: jobs.append({'tasks': []}) jobs[-1]['tasks'].append(task) print("Generated %d tasks, packed into %d jobs" % (len(tasks), len(jobs))) worker_pool = None start = time.time() if serial_run: # Serial run print("Running in serial.") results = ( do_job(**job) for job in jobs) elif args.cluster_parallelism: # Run using separate processes HPC cluster. print("Running on cluster.") results = cluster_results_from_args( args, work_function=do_job, work_items=jobs, constant_data=GLOBAL_DATA, input_serialization_method="dill", result_serialization_method="pickle", clear_constant_data=False) else: worker_pool = worker_pool_with_gpu_assignments_from_args( args, worker_context_module=__name__, worker_context_data=GLOBAL_DATA, ) print("Worker pool", worker_pool) assert worker_pool is not None results = worker_pool.imap_unordered( partial(call_wrapped_kwargs, do_job), jobs, chunksize=1) print("Reading results") task_results = {} try: for job_result in tqdm.tqdm(results, total=len(jobs)): for task_result in job_result: task_results[task_result['task_num']] = task_result if worker_pool: worker_pool.close() worker_pool.join() worker_pool = None finally: if worker_pool: worker_pool.terminate() worker_pool.join() print("Received all results in %0.2f sec" % (time.time() - start)) artifacts_df = pandas.DataFrame(task_results).T.set_index("task_num") length_distributions_out = os.path.join(args.out, "length_distributions.csv") length_distributions.to_csv(length_distributions_out, index=False) print("Wrote: ", length_distributions_out) artifacts_summary_out = os.path.join(args.out, "artifacts.csv") artifacts_df.to_csv(artifacts_summary_out) print("Wrote: ", artifacts_summary_out) def do_job(tasks, constant_data=GLOBAL_DATA): # Nested functions are so that the do_job function can be pickled for # running on an HPC cluster. GLOBAL_DATA = constant_data def do_task(task_num, allele, out_dir, constant_data=GLOBAL_DATA): args = constant_data['args'] normalized_frequency_matrices = constant_data[ 'normalized_frequency_matrices' ] length_distributions = constant_data[ 'length_distributions' ] train_data = constant_data[ 'train_data' ] logo_filename = write_logo( normalized_frequency_matrices, allele=allele, lengths=args.logo_lengths, cutoff=args.logo_cutoff, models_label="standard", out_dir=out_dir, ) length_distribution_filename = write_length_distribution( length_distributions, allele=allele, lengths=args.length_distribution_lengths, cutoff=args.length_cutoff, models_label="standard", out_dir=out_dir) (train_data_filename, num_train_points) = write_train_data( train_data, allele=allele, models_label="standard", out_dir=out_dir) return { 'task_num': task_num, 'allele': allele, 'logo_filename': logo_filename, 'length_distribution_filename': length_distribution_filename, 'train_data_filename': train_data_filename, 'num_train_points': num_train_points, } def write_logo( normalized_frequency_matrices, allele, lengths, cutoff, models_label, out_dir): import seaborn from matplotlib import pyplot import logomaker import os from mhcflurry.amino_acid import COMMON_AMINO_ACIDS amino_acids = sorted(COMMON_AMINO_ACIDS) fig = pyplot.figure(figsize=(8,10)) for (i, length) in enumerate(lengths): ax = pyplot.subplot(len(lengths), 1, i + 1) matrix = normalized_frequency_matrices.loc[ (normalized_frequency_matrices.allele == allele) & (normalized_frequency_matrices.length == length) & (normalized_frequency_matrices.cutoff_fraction == cutoff) ].set_index("position")[amino_acids] if matrix.shape[0] == 0: return None matrix = (matrix.T / matrix.sum(1)).T # row normalize ss_logo = logomaker.Logo( matrix, color_scheme="NajafabadiEtAl2017", font_name="Arial", width=.8, vpad=.05, fade_probabilities=True, stack_order='small_on_top', ax=ax, ) pyplot.title( "%s %d-mer" % (allele, length), y=0.85) pyplot.xticks(matrix.index.values) seaborn.despine() pyplot.tight_layout() name = "%s.motifs.%s.png" % ( allele.replace("*", "-").replace(":", "-"), models_label) filename = os.path.abspath(os.path.join(out_dir, name)) pyplot.savefig(filename) print("Wrote: ", filename) fig.clear() pyplot.close(fig) return name def write_length_distribution( length_distributions_df, allele, lengths, cutoff, models_label, out_dir): from matplotlib import pyplot import seaborn import os length_distribution = length_distributions_df.loc[ (length_distributions_df.allele == allele) & (length_distributions_df.cutoff_fraction == cutoff) ] if length_distribution.shape[0] == 0: return None length_distribution = length_distribution.set_index( "length").reindex(lengths).fillna(0.0).reset_index() length_distribution.plot( x="length", y="fraction", kind="bar", figsize=(5, 3)) fig = pyplot.gcf() pyplot.title("%s" % allele, fontsize=10) pyplot.xlabel("Peptide length", fontsize=10) pyplot.xticks(rotation=0) pyplot.ylim(ymin=0, ymax=1.0) pyplot.ylabel("Fraction of top %0.1f%%" % (cutoff * 100.0), fontsize=10) pyplot.gca().get_legend().remove() pyplot.tight_layout() seaborn.despine() name = "%s.lengths.%s.png" % ( allele.replace("*", "-").replace(":", "-"), models_label) filename = os.path.abspath(os.path.join(out_dir, name)) pyplot.savefig(filename) print("Wrote: ", filename) fig.clear() pyplot.close(fig) return name def write_train_data(train_data, allele, models_label, out_dir): import os sub_train = train_data.loc[ train_data.allele == allele ] name = None if sub_train.shape[0] > 0: name = "%s.train_data.%s.csv" % ( allele.replace("*", "-").replace(":", "-"), models_label) filename = os.path.abspath(os.path.join(out_dir, name)) sub_train.to_csv(filename, index=False) print("Wrote: ", filename) return (name, len(sub_train)) return [do_task(constant_data=constant_data, **task) for task in tasks] if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/analysis_predictor_info/generate_model_selection_with_decoys.py000066400000000000000000000063111525677230600346010ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ From affinity predictor model selection data, add decoys so that AUCs can be calculated per-allele. """ import sys import argparse import os import numpy import math import collections import pandas import tqdm import mhcflurry from mhcflurry.downloads import get_path parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "data", metavar="CSV", help="Model selection data") parser.add_argument( "--protein-data", metavar="CSV", default=get_path("data_references", "uniprot_proteins.csv.bz2", test_exists=False), help="Proteome data. Default: %(default)s.") parser.add_argument( "--out", metavar="CSV", required=True, help="File to write") def run(): args = parser.parse_args(sys.argv[1:]) data_df = pandas.read_csv(args.data) print("Read", args.data, len(data_df)) print(data_df) fold_cols = [col for col in data_df.columns if col.startswith("fold_")] print("Fold cols", fold_cols) assert len(fold_cols) > 1 eval_df = data_df.loc[ data_df[fold_cols].sum(1) < len(fold_cols) ].copy() eval_df["binder"] = (eval_df.measurement_inequality != '>') & ( eval_df.measurement_value <= 500) print("Reduced to data held-out at least once: ", len(eval_df)) print("Binder rate per allele:") print(eval_df.groupby("allele").binder.mean()) decoy_universe = pandas.read_csv(args.protein_data, usecols=["seq"]) decoy_universe = pandas.Series(decoy_universe.seq.unique()) decoy_universe = decoy_universe.loc[ decoy_universe.str.match("^[%s]+$" % "".join( mhcflurry.amino_acid.COMMON_AMINO_ACIDS)) & ( decoy_universe.str.len() >= 50) ] print("Read decoy universe from", args.protein_data) print(decoy_universe) def make_decoys(num, length): return decoy_universe.sample(num, replace=True).map( lambda s: s[numpy.random.randint(0, len(s) - length):][:length]).values lengths = [8,9,10,11] pieces = [] real_df = eval_df.loc[ eval_df.peptide.str.len().isin(lengths)].copy() real_df["synthetic"] = False pieces.append(real_df) for length in lengths: decoys_df = real_df.loc[real_df.binder].copy() decoys_df.binder = False decoys_df.measurement_value = numpy.nan decoys_df.synthetic = True decoys_df["peptide"] = make_decoys(len(decoys_df), length) pieces.append(decoys_df) result_df = pandas.concat(pieces, ignore_index=True) print("Final binder rate per allele:") print(result_df.groupby("allele").binder.mean()) result_df.to_csv(args.out, index=False) print("Wrote: ", args.out) if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/analysis_predictor_info/predict_on_model_selection_data.py000066400000000000000000000144711525677230600335330ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Evaluate affinity predictor on its held-out model selection data, using only the individual models that were not trained on each particular data point. """ import sys import argparse import os import numpy import time import collections from functools import partial import pandas import tqdm tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 from mhcflurry.common import configure_logging from mhcflurry.local_parallelism import ( add_local_parallelism_args, worker_pool_with_gpu_assignments_from_args, call_wrapped_kwargs) from mhcflurry.cluster_parallelism import ( add_cluster_parallelism_args, cluster_results_from_args) # To avoid pickling large matrices to send to child processes when running in # parallel, we use this global variable as a place to store data. Data that is # stored here before creating the thread pool will be inherited to the child # processes upon fork() call, allowing us to share large data with the workers # via shared memory. GLOBAL_DATA = {} WORKER_CONTEXT = GLOBAL_DATA parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "predictor", metavar="DIR", help="Class 1 affinity predictor to use") parser.add_argument( "--data", metavar="CSV", help="Model selection data. If not specified will guess based on affinity " "predictor path") parser.add_argument( "--out", metavar="CSV", required=True, help="File to write with predictions") add_local_parallelism_args(parser) add_cluster_parallelism_args(parser) def do_predict(predictor, key, sub_df, constant_data=None): import tqdm tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 prediction = predictor.predict(sub_df.peptide, sub_df.allele, throw=False) return { "key": key, "index": sub_df.index, "prediction": prediction, } def run(): import mhcflurry args = parser.parse_args(sys.argv[1:]) configure_logging() serial_run = not args.cluster_parallelism and args.num_jobs == 0 if not args.data: args.data = os.path.join(args.predictor, 'model_selection_data.csv.bz2') print("Defaulting data to: ", args.data) data_df = pandas.read_csv(args.data) print("Read %d rows:" % len(data_df)) print(data_df) fold_cols = [col for col in data_df.columns if col.startswith("fold_")] print("Fold cols", fold_cols) assert len(fold_cols) > 1 eval_df = data_df.loc[ data_df[fold_cols].sum(1) < len(fold_cols) ].copy() print("Reduced to data held-out at least once: ", len(eval_df)) predictor = mhcflurry.Class1AffinityPredictor.load( args.predictor, optimization_level=0) print("Loaded predictor", predictor) fold_to_ensemble = collections.defaultdict(list) for n in predictor.neural_networks: fold = n.fit_info[-1]['training_info']['fold_num'] fold_to_ensemble[fold].append(n) print("Constructed fold_to_ensemble", fold_to_ensemble) eval_df["ensemble_key"] = ( (~eval_df[fold_cols]).astype(str) + "_" ).sum(1).str.strip("_") print("Established ensemble keys:") print(eval_df.ensemble_key.value_counts()) def predictor_for_ensemble_key(key_string): indicators = [s == "True" for s in key_string.split("_")] ensemble = [] for fold, indicator in enumerate(indicators): if indicator: ensemble.extend(fold_to_ensemble[fold]) pred = mhcflurry.Class1AffinityPredictor( class1_pan_allele_models=ensemble, allele_to_sequence=predictor.allele_to_sequence) return pred tasks = [] for (key, sub_df) in eval_df.groupby("ensemble_key"): print(key) pred = predictor_for_ensemble_key(key) assert len(pred.neural_networks) > 0 eval_df.loc[ sub_df.index, "ensemble_size" ] = len(pred.neural_networks) tasks.append({ "key": key, "predictor": pred, "sub_df": sub_df[["peptide", "allele"]].copy() }) worker_pool = None start = time.time() if serial_run: # Serial run print("Running in serial.") results = ( do_predict(**task) for task in tasks) elif args.cluster_parallelism: # Run using separate processes HPC cluster. print("Running on cluster.") results = cluster_results_from_args( args, work_function=do_predict, work_items=tasks, constant_data=GLOBAL_DATA, input_serialization_method="dill", result_serialization_method="pickle", clear_constant_data=False) else: worker_pool = worker_pool_with_gpu_assignments_from_args( args, worker_context_module=__name__, worker_context_data=GLOBAL_DATA, ) print("Worker pool", worker_pool) assert worker_pool is not None results = worker_pool.imap_unordered( partial(call_wrapped_kwargs, do_predict), tasks, chunksize=1) print("Reading results") try: for worker_result in tqdm.tqdm(results, total=len(tasks)): print("Received worker result:", worker_result['key']) print(worker_result) eval_df.loc[ worker_result['index'], "prediction" ] = worker_result["prediction"] if worker_pool: worker_pool.close() worker_pool.join() worker_pool = None finally: if worker_pool: worker_pool.terminate() worker_pool.join() print("Received all results in %0.2f sec" % (time.time() - start)) eval_df.to_csv(args.out, index=False) print("Wrote: ", args.out) if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/analysis_predictor_info/requirements.txt000066400000000000000000000000211525677230600300630ustar00rootroot00000000000000logomaker seabornmhcflurry-2.3.6/downloads-generation/data_curated/000077500000000000000000000000001525677230600223155ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/data_curated/GENERATE.sh000077500000000000000000000052211525677230600240460ustar00rootroot00000000000000#!/bin/bash # # Create "curated" training data, which combines an IEDB download with additional # published data, removes unusable entries, normalizes allele name, and performs # other filtering and standardization. # set -e set -x DOWNLOAD_NAME=data_curated SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") export PYTHONUNBUFFERED=1 mkdir -p "$SCRATCH_DIR" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" # Send stdout and stderr to a logfile included with the archive. exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) # Log some environment info date pip freeze git status cd $SCRATCH_DIR/$DOWNLOAD_NAME cp $SCRIPT_DIR/curate.py . cp $SCRIPT_DIR/curate_ms_by_pmid.py . MS_DIR="$(mhcflurry-downloads path data_published)/ms" cp -r "$MS_DIR" . EXPRESSION_DIR="$(mhcflurry-downloads path data_published)/expression" cp -r "$EXPRESSION_DIR" . CURATE_BY_PMID_ARGS="" for pmid in $(ls ms) do CURATE_BY_PMID_ARGS+=$(echo --ms-item $pmid ms/$pmid/* ' ') done for item in $(ls expression) do CURATE_BY_PMID_ARGS+=$(echo --expression-item $item expression/$item/* ' ') done time python curate_ms_by_pmid.py $CURATE_BY_PMID_ARGS \ --ms-out ms.by_pmid.csv \ --expression-out rna_expression.csv \ --expression-metadata-out rna_expression.metadata.csv bzip2 ms.by_pmid.csv bzip2 rna_expression.csv rm -rf ms time python curate.py \ --data-iedb \ "$(mhcflurry-downloads path data_iedb)/mhc_ligand_full.csv.bz2" \ --data-kim2014 \ "$(mhcflurry-downloads path data_published)/bdata.20130222.mhci.public.1.txt" \ --data-systemhc-atlas \ "$(mhcflurry-downloads path data_systemhcatlas)/data.csv.bz2" \ --data-additional-ms "$(pwd)/ms.by_pmid.csv.bz2" \ --out-csv curated_training_data.csv \ --out-affinity-csv curated_training_data.affinity.csv \ --out-mass-spec-csv curated_training_data.mass_spec.csv time python curate.py \ --data-iedb \ "$(mhcflurry-downloads path data_iedb)/mhc_ligand_full.csv.bz2" \ --data-kim2014 \ "$(mhcflurry-downloads path data_published)/bdata.20130222.mhci.public.1.txt" \ --data-systemhc-atlas \ "$(mhcflurry-downloads path data_systemhcatlas)/data.csv.bz2" \ --out-csv curated_training_data.no_additional_ms.csv for i in $(ls *.csv) do bzip2 $i done cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.$(date +%Y%m%d).tar.bz2" tar -cjf "$RESULT" * echo "Created archive: $RESULT" mhcflurry-2.3.6/downloads-generation/data_curated/README.md000066400000000000000000000011261525677230600235740ustar00rootroot00000000000000# Combined training data This historical generator combines affinity and mass-spectrometry training data. The installed snapshot is identified by `mhcflurry downloads info data_curated`; its contents depend on the selected catalogue release. Sources include an [IEDB](http://www.iedb.org/home_v3.php) export as well as the data from [Kim 2014](http://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-15-241), as well as a number of other sources. To generate this download run: ``` pip install -r requirements.txt # for the first time you generate this download ./GENERATE.sh ``` mhcflurry-2.3.6/downloads-generation/data_curated/curate.py000077500000000000000000000303451525677230600241620ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Filter and combine various peptide/MHC datasets to derive a composite training set, optionally including eluted peptides identified by mass-spec. """ import sys import os import argparse import pandas import numpy from mhcflurry.common import normalize_allele_name def normalize_allele_name_or_return_unknown(s): if s is numpy.nan: return "UNKNOWN" return normalize_allele_name( s, raise_on_error=False, default_value="UNKNOWN") parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "--data-kim2014", action="append", default=[], help="Path to Kim 2014-style affinity data") parser.add_argument( "--data-iedb", action="append", default=[], help="Path to IEDB-style affinity data (e.g. mhc_ligand_full.csv)") parser.add_argument( "--data-additional-ms", action="append", default=[], help="Path to additional monoallelic mass spec hits") parser.add_argument( "--data-systemhc-atlas", action="append", default=[], help="Path to systemhc-atlas-style mass-spec data") parser.add_argument( "--out-csv", required=True, help="Combined result file") parser.add_argument( "--out-affinity-csv", required=False, help="Result file") parser.add_argument( "--out-mass-spec-csv", required=False, help="Result file") # Note: the value assigned to "Positive" entries in the dict below is the # default that will be used for mass spec hits when training the predictor. # However, as of version 2.0.0 we are reassigning MS entries in the training # script for the pan-allele predictor (see # downloads-generation/models_class1_pan/GENERATE.sh where # reassign_mass_spec_training_data.py is called). So you should look there to # see what the current setting for this value is. QUALITATIVE_TO_AFFINITY_AND_INEQUALITY = { "Negative": (5000.0, ">"), "Positive": (100.0, "<"), # used for mass-spec hits but see note above "Positive-High": (100.0, "<"), "Positive-Intermediate": (1000.0, "<"), "Positive-Low": (5000.0, "<"), } QUALITATIVE_TO_AFFINITY = dict( (key, value[0]) for (key, value) in QUALITATIVE_TO_AFFINITY_AND_INEQUALITY.items()) QUALITATIVE_TO_INEQUALITY = dict( (key, value[1]) for (key, value) in QUALITATIVE_TO_AFFINITY_AND_INEQUALITY.items()) EXCLUDE_IEDB_ALLELES = [ "HLA class I", "HLA class II", ] def load_data_kim2014(filename): df = pandas.read_table(filename) print("Loaded kim2014 data: %s" % str(df.shape)) df["measurement_source"] = "kim2014" df["measurement_kind"] = "affinity" df["measurement_value"] = df.meas df["measurement_type"] = (df.inequality == "=").map({ True: "quantitative", False: "qualitative", }) df["measurement_inequality"] = df.inequality df["original_allele"] = df.mhc df["peptide"] = df.sequence df["allele"] = df.mhc.map(normalize_allele_name_or_return_unknown) print("Dropping un-parseable alleles: %s" % ", ".join( df.loc[df.allele == "UNKNOWN"]["mhc"].unique())) df = df.loc[df.allele != "UNKNOWN"] print("Loaded kim2014 data: %s" % str(df.shape)) return df def load_data_systemhc_atlas(filename, min_probability=0.99): df = pandas.read_csv(filename) print("Loaded systemhc atlas data: %s" % str(df.shape)) df["measurement_kind"] = "mass_spec" df["measurement_source"] = "systemhc-atlas" df["measurement_value"] = QUALITATIVE_TO_AFFINITY["Positive"] df["measurement_inequality"] = "<" df["measurement_type"] = "qualitative" df["original_allele"] = df.top_allele df["peptide"] = df.search_hit df["allele"] = df.top_allele.map(normalize_allele_name_or_return_unknown) print("Dropping un-parseable alleles: %s" % ", ".join( str(x) for x in df.loc[df.allele == "UNKNOWN"]["top_allele"].unique())) df = df.loc[df.allele != "UNKNOWN"] print("Systemhc atlas data now: %s" % str(df.shape)) print("Dropping data points with probability < %f" % min_probability) df = df.loc[df.prob >= min_probability] print("Systemhc atlas data now: %s" % str(df.shape)) print("Removing duplicates") df = df.drop_duplicates(["allele", "peptide"]) print("Systemhc atlas data now: %s" % str(df.shape)) return df def load_data_iedb(iedb_csv, include_qualitative=True): iedb_df = pandas.read_csv(iedb_csv, skiprows=1, low_memory=False) print("Loaded iedb data: %s" % str(iedb_df.shape)) print("Selecting only class I") iedb_df = iedb_df.loc[ # Old naming: # iedb_df["MHC allele class"].str.strip().str.upper() == "I" # New names IEDB has adopted: iedb_df["Class"].str.strip().str.upper() == "I" ] print("New shape: %s" % str(iedb_df.shape)) iedb_df["Allele Name"] = iedb_df["Name.6"] print("Dropping known unusable alleles") iedb_df = iedb_df.loc[ ~iedb_df["Allele Name"].isin(EXCLUDE_IEDB_ALLELES) ] iedb_df = iedb_df.loc[ (~iedb_df["Allele Name"].str.contains("mutant")) & (~iedb_df["Allele Name"].str.contains("CD1")) ] # Drop insufficiently specific allele names like "HLA-A03": insuffient_mask = ( (~iedb_df["Allele Name"].str.upper().str.startswith("H2-")) & (~iedb_df["Allele Name"].str.upper().str.startswith("H-2-")) & (~iedb_df["Allele Name"].str.upper().str.startswith("MAMU")) & (iedb_df["Allele Name"].str.findall("[0-9]").str.len() < 4) ) print("Dropping %d records with insufficiently-specific allele names:" % insuffient_mask.sum()) print(iedb_df.loc[insuffient_mask]["Allele Name"].value_counts()) iedb_df = iedb_df.loc[~insuffient_mask] iedb_df["allele"] = iedb_df["Allele Name"].map( normalize_allele_name_or_return_unknown) print("Dropping un-parseable alleles: %s" % ", ".join( iedb_df.loc[iedb_df.allele == "UNKNOWN"]["Allele Name"].unique())) iedb_df = iedb_df.loc[iedb_df.allele != "UNKNOWN"] print("IEDB measurements per allele:\n%s" % iedb_df.allele.value_counts()) quantitative = iedb_df.loc[iedb_df["Units"] == "nM"].copy() quantitative["measurement_kind"] = "affinity" quantitative["measurement_type"] = "quantitative" quantitative["measurement_inequality"] = quantitative[ "Measurement Inequality" ].fillna("=").map(lambda s: {">=": ">", "<=": "<"}.get(s, s)) print("Quantitative measurements: %d" % len(quantitative)) qualitative = iedb_df.loc[iedb_df["Units"].isnull()].copy() qualitative["measurement_type"] = "qualitative" qualitative["measurement_kind"] = qualitative[ "Method" ].str.contains("mass spec").map({ True: "mass_spec", False: "affinity", }) print("Qualitative measurements: %d" % len(qualitative)) qualitative["Quantitative measurement"] = ( qualitative["Qualitative Measurement"].map(QUALITATIVE_TO_AFFINITY)) qualitative["measurement_inequality"] = ( qualitative["Qualitative Measurement"].map(QUALITATIVE_TO_INEQUALITY)) print("Qualitative measurements (possibly after dropping MS): %d" % ( len(qualitative))) iedb_df = pandas.concat( ( ([quantitative]) + ([qualitative] if include_qualitative else [])), ignore_index=True) print("IEDB measurements per allele:\n%s" % iedb_df.allele.value_counts()) print("Subselecting to valid peptides. Starting with: %d" % len(iedb_df)) iedb_df["Description"] = iedb_df.Name.str.strip() iedb_df = iedb_df.loc[ iedb_df.Description.str.match("^[ACDEFGHIKLMNPQRSTVWY]+$") ] print("Now: %d" % len(iedb_df)) print("Annotating last author and category") iedb_df["last_author"] = iedb_df.Authors.map( lambda x: ( x.split(";")[-1] .split(",")[-1] .split(" ")[-1] .strip() .replace("*", ""))).values iedb_df["category"] = ( iedb_df["last_author"] + " - " + iedb_df["Method"]).values train_data = pandas.DataFrame() train_data["peptide"] = iedb_df.Description.values train_data["measurement_value"] = iedb_df[ "Quantitative measurement" ].values train_data["measurement_source"] = iedb_df.category.values train_data["measurement_inequality"] = iedb_df.measurement_inequality.values train_data["allele"] = iedb_df["allele"].values train_data["original_allele"] = iedb_df["Allele Name"].values train_data["measurement_type"] = iedb_df["measurement_type"].values train_data["measurement_kind"] = iedb_df["measurement_kind"].values train_data = train_data.drop_duplicates().reset_index(drop=True) return train_data def load_data_additional_ms(filename): df = pandas.read_csv(filename) print("Loaded additional MS", filename, df.shape) print(df) print("Entries:", len(df)) print("Subselecting to monoallelic") df = df.loc[ df.format == "MONOALLELIC" ].copy() print("Now", len(df)) df["allele"] = df["hla"].map(normalize_allele_name_or_return_unknown) assert not (df.allele == "UNKNOWN").any(), ( list(df.loc[df.allele == "UNKNOWN"].hla.unique())) df["measurement_value"] = QUALITATIVE_TO_AFFINITY["Positive"] df["measurement_inequality"] = "<" df["measurement_type"] = "qualitative" df["measurement_kind"] = "mass_spec" df["measurement_source"] = "MS:pmid:" + df["original_pmid"].map(str) df["original_allele"] = "" return df def run(): args = parser.parse_args(sys.argv[1:]) dfs = [] for filename in args.data_iedb: df = load_data_iedb(filename) dfs.append(df) for filename in args.data_kim2014: df = load_data_kim2014(filename) df["allele_peptide"] = df.allele + "_" + df.peptide # Give precedence to IEDB data. if dfs: iedb_df = dfs[0] iedb_df["allele_peptide"] = iedb_df.allele + "_" + iedb_df.peptide print("Dropping kim2014 data present in IEDB.") df = df.loc[ ~df.allele_peptide.isin(iedb_df.allele_peptide) ] print("Kim2014 data now: %s" % str(df.shape)) dfs.append(df) for filename in args.data_systemhc_atlas: df = load_data_systemhc_atlas(filename) dfs.append(df) for filename in args.data_additional_ms: df = load_data_additional_ms(filename) dfs.append(df) df = pandas.concat(dfs, ignore_index=True) print("Combined df: %s" % (str(df.shape))) print("Removing combined duplicates") df = df.drop_duplicates( ["allele", "peptide", "measurement_value", "measurement_kind"]) print("New combined df: %s" % (str(df.shape))) df = df[[ "allele", "peptide", "measurement_value", "measurement_inequality", "measurement_type", "measurement_kind", "measurement_source", "original_allele", ]].sort_values(["allele", "peptide"]).dropna() print("Final combined df: %s" % (str(df.shape))) print("Measurement sources:") print(df.measurement_source.value_counts()) print("Measurement kind:") print(df.measurement_kind.value_counts()) print("Measurement source / kind:") print( df.groupby( ["measurement_source", "measurement_kind"] ).peptide.count().sort_values()) def write(write_df, filename): filename = os.path.abspath(filename) write_df.to_csv(filename, index=False) print("Wrote [%d lines]: %s" % (len(write_df), filename)) write(df, args.out_csv) if args.out_affinity_csv: write( df.loc[df.measurement_kind == "affinity"], args.out_affinity_csv) if args.out_mass_spec_csv: write( df.loc[df.measurement_kind == "mass_spec"], args.out_mass_spec_csv) if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/data_curated/curate_ms_by_pmid.py000077500000000000000000001346511525677230600263710ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Filter and combine various peptide/MHC datasets to derive a composite training set, optionally including eluted peptides identified by mass-spec. """ import sys import argparse import os import json import collections from six.moves import StringIO import pandas from mhcflurry.common import normalize_allele_name def normalize_allele_name_or_return_unknown(s): return normalize_allele_name( s, raise_on_error=False, default_value="UNKNOWN") parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "--ms-item", nargs="+", action="append", metavar="PMID FILE, ... FILE", default=[], help="Mass spec item to curate: PMID and list of files") parser.add_argument( "--expression-item", nargs="+", action="append", metavar="LABEL FILE, ... FILE", default=[], help="Expression data to curate: dataset label and list of files") parser.add_argument( "--ms-out", metavar="OUT.csv", help="Out file path (MS data)") parser.add_argument( "--expression-out", metavar="OUT.csv", help="Out file path (RNA-seq expression)") parser.add_argument( "--expression-metadata-out", metavar="OUT.csv", help="Out file path for expression metadata, i.e. which samples used") parser.add_argument( "--debug", action="store_true", default=False, help="Leave user in pdb if PMID is unsupported") PMID_HANDLERS = {} EXPRESSION_HANDLERS = {} def load(filenames, **kwargs): result = {} for filename in filenames: if filename.endswith(".csv"): result[filename] = pandas.read_csv(filename, **kwargs) elif filename.endswith(".xlsx") or filename.endswith(".xls"): result[filename] = pandas.read_excel(filename, **kwargs) else: result[filename] = filename return result def debug(*filenames): loaded = load(filenames) import ipdb ipdb.set_trace() def handle_pmid_27600516(filename): """Gloger, ..., Neri Cancer Immunol Immunother 2016 [PMID 27600516]""" df = pandas.read_csv(filename) sample_to_peptides = {} current_sample = None for peptide in df.peptide: if peptide.startswith("#"): current_sample = peptide[1:] sample_to_peptides[current_sample] = [] else: assert current_sample is not None sample_to_peptides[current_sample].append(peptide.strip().upper()) rows = [] for (sample, peptides) in sample_to_peptides.items(): for peptide in sorted(set(peptides)): rows.append([sample, peptide]) result_df = pandas.DataFrame(rows, columns=["sample_id", "peptide"]) result_df["sample_type"] = "melanoma_cell_line" result_df["cell_line"] = result_df.sample_id result_df["mhc_class"] = "I" result_df["pulldown_antibody"] = "W6/32" result_df["format"] = "multiallelic" result_df["hla"] = result_df.sample_id.map({ "FM-82": "HLA-A*02:01 HLA-A*01:01 HLA-B*08:01 HLA-B*15:01 HLA-C*03:04 HLA-C*07:01", "FM-93/2": "HLA-A*02:01 HLA-A*26:01 HLA-B*40:01 HLA-B*44:02 HLA-C*03:04 HLA-C*05:01", "Mel-624": "HLA-A*02:01 HLA-A*03:01 HLA-B*07:02 HLA-B*14:01 HLA-C*07:02 HLA-C*08:02", "MeWo": "HLA-A*02:01 HLA-A*26:01 HLA-B*14:02 HLA-B*38:01 HLA-C*08:02 HLA-C*12:03", "SK-Mel-5": "HLA-A*02:01 HLA-A*11:01 HLA-B*40:01 HLA-C*03:03", }) return result_df def handle_pmid_23481700(filename): """Hassan, ..., van Veelen Mol Cell Proteomics 2015 [PMID 23481700]""" df = pandas.read_excel(filename, skiprows=10) assert df["Peptide sequence"].iloc[0] == "TPSLVKSTSQL" assert df["Peptide sequence"].iloc[-1] == "LPHSVNSKL" hla = { "JY": "HLA-A*02:01 HLA-B*07:02 HLA-C*07:02", "HHC": "HLA-A*02:01 HLA-B*07:02 HLA-B*44:02 HLA-C*05:01 HLA-C*07:02", } results = [] for sample_id in ["JY", "HHC"]: hits_df = df.loc[ df["Int %s" % sample_id].map( lambda x: {"n.q.": 0, "n.q": 0}.get(x, x)).astype(float) > 0 ] result_df = pandas.DataFrame({ "peptide": hits_df["Peptide sequence"].dropna().values, }) result_df["sample_id"] = sample_id result_df["cell_line"] = "B-LCL-" + sample_id result_df["hla"] = hla[sample_id] result_df["sample_type"] = "B-LCL" result_df["mhc_class"] = "I" result_df["format"] = "multiallelic" result_df["pulldown_antibody"] = "W6/32" results.append(result_df) result_df = pandas.concat(results, ignore_index=True) # Rename samples to avoid a collision with the JY sample in PMID 25576301. result_df.sample_id = result_df.sample_id.map({ "JY": "JY.2015", "HHC": "HHC.2015", }) return result_df def handle_pmid_24616531(filename): """Mommen, ..., Heck PNAS 2014 [PMID 24616531]""" df = pandas.read_excel(filename, sheet_name="EThcD") peptides = df.Sequence.values assert peptides[0] == "APFLRIAF" assert peptides[-1] == "WRQAGLSYIRYSQI" result_df = pandas.DataFrame({ "peptide": peptides, }) result_df["sample_id"] = "24616531" result_df["sample_type"] = "B-LCL" result_df["cell_line"] = "GR" result_df["pulldown_antibody"] = "W6/32" # Note: this publication lists hla as "HLA-A*01,-03, B*07,-27, and -C*02,-07" # we are guessing the exact 4 digit alleles based on this. result_df["hla"] = "HLA-A*01:01 HLA-A*03:01 HLA-B*07:02 HLA-B*27:05 HLA-C*02:02 HLA-C*07:01" result_df["mhc_class"] = "I" result_df["format"] = "multiallelic" return result_df def handle_pmid_25576301(filename): """Bassani-Sternberg, ..., Mann Mol Cell Proteomics 2015 [PMID 25576301]""" df = pandas.read_excel(filename, sheet_name="Peptides") peptides = df.Sequence.values assert peptides[0] == "AAAAAAAQSVY" assert peptides[-1] == "YYYNGKAVY" column_to_sample = {} for s in [c for c in df if c.startswith("Intensity ")]: assert s[-2] == "-" column_to_sample[s] = s.replace("Intensity ", "")[:-2].strip() intensity_columns = list(column_to_sample) rows = [] for _, row in df.iterrows(): x1 = row[intensity_columns] x2 = x1[x1 > 0].index.map(column_to_sample).value_counts() x3 = x2[x2 >= 2] # require at least two replicates for each peptide for sample in x3.index: rows.append((row.Sequence, sample)) result_df = pandas.DataFrame(rows, columns=["peptide", "sample_id"]) result_df["pulldown_antibody"] = "W6/32" result_df["mhc_class"] = "I" result_df["format"] = "multiallelic" allele_map = { 'Fib': "HLA-A*03:01 HLA-A*23:01 HLA-B*08:01 HLA-B*15:18 HLA-C*07:02 HLA-C*07:04", 'HCC1937': "HLA-A*23:01 HLA-A*24:02 HLA-B*07:02 HLA-B*40:01 HLA-C*03:04 HLA-C*07:02", 'SupB15WT': None, # four digit alleles unknown, will drop sample 'SupB15RT': None, 'HCT116': "HLA-A*01:01 HLA-A*02:01 HLA-B*45:01 HLA-B*18:01 HLA-C*05:01 HLA-C*07:01", # Homozygous at HLA-A: 'HCC1143': "HLA-A*31:01 HLA-A*31:01 HLA-B*35:08 HLA-B*37:01 HLA-C*04:01 HLA-C*06:02", # Homozygous everywhere: 'JY': "HLA-A*02:01 HLA-A*02:01 HLA-B*07:02 HLA-B*07:02 HLA-C*07:02 HLA-C*07:02", } sample_type = { 'Fib': "fibroblast", 'HCC1937': "basal like breast cancer", 'SupB15WT': None, 'SupB15RT': None, 'HCT116': "colon carcinoma", 'HCC1143': "basal like breast cancer", 'JY': "B-cell", } cell_line = { 'Fib': None, 'HCC1937': "HCC1937", 'SupB15WT': None, 'SupB15RT': None, 'HCT116': "HCT116", 'HCC1143': "HCC1143", 'JY': "JY", } result_df["hla"] = result_df.sample_id.map(allele_map) print("Entries before dropping samples with unknown alleles", len(result_df)) result_df = result_df.loc[~result_df.hla.isnull()] print("Entries after dropping samples with unknown alleles", len(result_df)) result_df["sample_type"] = result_df.sample_id.map(sample_type) result_df["cell_line"] = result_df.sample_id.map(cell_line) print(result_df.head(3)) return result_df def handle_pmid_26992070(*filenames): """Ritz, ..., Fugmann Proteomics 2016 [PMID 26992070]""" # Although this publication seems to suggest that HEK293 are C*07:02 # (figure 3B), in a subsequent publication [PMID 28834231] this group # gives the HEK293 HLA type as HLA�A*03:01, HLA�B*07:02, and HLA�C*07:01. # We are therefore using the HLA�C*07:01 (i.e. the latter) typing results # here. allele_text = """ Cell line HLA-A 1 HLA-A 2 HLA-B 1 HLA-B 2 HLA-C 1 HLA-C 2 HEK293 03:01 03:01 07:02 07:02 07:01 07:01 HL-60 01:01 01:01 57:01 57:01 06:02 06:02 RPMI8226 30:01 68:02 15:03 15:10 02:10 03:04 MAVER-1 24:02 26:01 38:01 44:02 05:01 12:03 THP-1 02:01 24:02 15:11 35:01 03:03 03:03 """ allele_info = pandas.read_csv( StringIO(allele_text), sep="\t", index_col=0) allele_info.index = allele_info.index.str.strip() for gene in ["A", "B", "C"]: for num in ["1", "2"]: allele_info[ "HLA-%s %s" % (gene, num) ] = "HLA-" + gene + "*" + allele_info["HLA-%s %s" % (gene, num)] cell_line_to_allele = allele_info.apply(" ".join, axis=1) sheets = {} for f in filenames: if f.endswith(".xlsx"): d = pandas.read_excel(f, sheet_name=None, skiprows=1) sheets.update(d) dfs = [] for cell_line in cell_line_to_allele.index: # Using data from DeepQuanTR, which appears to be a consensus between # two other methods used. sheet = sheets[cell_line + "_DeepQuanTR"] replicated = sheet.loc[ sheet[[c for c in sheet if "Sample" in c]].fillna(0).sum(1) > 1 ] df = pandas.DataFrame({ 'peptide': replicated.Sequence.values }) df["sample_id"] = cell_line df["hla"] = cell_line_to_allele.get(cell_line) dfs.append(df) result_df = pandas.concat(dfs, ignore_index=True) result_df["pulldown_antibody"] = "W6/32" result_df["cell_line"] = result_df["sample_id"] result_df["sample_type"] = result_df.sample_id.map({ "HEK293": "hek", "HL-60": "neutrophil", "RPMI8226": "b-cell", "MAVER-1": "b-LCL", "THP-1": "monocyte", }) result_df["mhc_class"] = "I" result_df["format"] = "multiallelic" return result_df def handle_pmid_27412690(filename): """Shraibman, ..., Admon Mol Cell Proteomics 2016 [PMID 27412690]""" hla_types = { "U-87": "HLA-A*02:01 HLA-B*44:02 HLA-C*05:01", "T98G": "HLA-A*02:01 HLA-B*39:06 HLA-C*07:02", "LNT-229": "HLA-A*03:01 HLA-B*35:01 HLA-C*04:01", } sample_id_to_cell_line = { "U-87": "U-87", "T98G": "T98G", "LNT-229": "LNT-229", "U-87+DAC": "U-87", "T98G+DAC": "T98G", "LNT-229+DAC": "LNT-229", } df = pandas.read_excel(filename) assert df.Sequence.iloc[0] == "AAAAAAGSGTPR" intensity_col_to_sample_id = {} for col in df: if col.startswith("Intensity "): sample_id = col.split()[1] assert sample_id in sample_id_to_cell_line, (col, sample_id) intensity_col_to_sample_id[col] = sample_id dfs = [] for (sample_id, cell_line) in sample_id_to_cell_line.items(): intensity_cols = [ c for (c, v) in intensity_col_to_sample_id.items() if v == sample_id ] hits_df = df.loc[ (df[intensity_cols] > 0).sum(1) > 1 ] result_df = pandas.DataFrame({ "peptide": hits_df.Sequence.values, }) result_df["sample_id"] = sample_id result_df["cell_line"] = cell_line result_df["hla"] = hla_types[cell_line] dfs.append(result_df) result_df = pandas.concat(dfs, ignore_index=True) result_df["sample_type"] = "glioblastoma" result_df["pulldown_antibody"] = "W6/32" result_df["mhc_class"] = "I" result_df["format"] = "multiallelic" return result_df def handle_pmid_28832583(*filenames): """Bassani-Sternberg, ..., Gfeller PLOS Comp. Bio. 2017 [PMID 28832583]""" # This work also reanalyzes data from # Pearson, ..., Perreault J Clin Invest 2016 [PMID 27841757] (filename_dataset1, filename_dataset2) = sorted(filenames) dataset1 = pandas.read_csv(filename_dataset1, sep="\t") dataset2 = pandas.read_csv(filename_dataset2, sep="\t") df = pandas.concat([dataset1, dataset2], ignore_index=True, sort=False) info_text = """ cell_line origin original_pmid allele1 allele2 allele3 allele4 allele5 allele6 CD165 B-cell 28832583 HLA-A*02:05 HLA-A*24:02 HLA-B*15:01 HLA-B*50:01 HLA-C*03:03 HLA-C*06:02 CM467 B-cell 28832583 HLA-A*01:01 HLA-A*24:02 HLA-B*13:02 HLA-B*39:06 HLA-C*06:02 HLA-C*12:03 GD149 B-cell 28832583 HLA-A*01:01 HLA-A*24:02 HLA-B*38:01 HLA-B*44:03 HLA-C*06:02 HLA-C*12:03 MD155 B-cell 28832583 HLA-A*02:01 HLA-A*24:02 HLA-B*15:01 HLA-B*18:01 HLA-C*03:03 HLA-C*07:01 PD42 B-cell 28832583 HLA-A*02:06 HLA-A*24:02 HLA-B*07:02 HLA-B*55:01 HLA-C*01:02 HLA-C*07:02 RA957 B-cell 28832583 HLA-A*02:20 HLA-A*68:01 HLA-B*35:03 HLA-B*39:01 HLA-C*04:01 HLA-C*07:02 TIL1 TIL 28832583 HLA-A*02:01 HLA-A*02:01 HLA-B*18:01 HLA-B*38:01 HLA-C*05:01 TIL3 TIL 28832583 HLA-A*01:01 HLA-A*23:01 HLA-B*07:02 HLA-B*15:01 HLA-C*12:03 HLA-C*14:02 Apher1 Leukapheresis 28832583 HLA-A*03:01 HLA-A*29:02 HLA-B*44:02 HLA-B*44:03 HLA-C*12:03 HLA-C*16:01 Apher6 Leukapheresis 28832583 HLA-A*02:01 HLA-A*03:01 HLA-B*07:02 HLA-C*07:02 pat_AC2 B-LCL 27841757 HLA-A*03:01 HLA-A*32:01 HLA-B*27:05 HLA-B*45:01 pat_C B-LCL 27841757 HLA-A*02:01 HLA-A*03:01 HLA-B*07:02 HLA-C*07:02 pat_CELG B-LCL 27841757 HLA-A*02:01 HLA-A*24:02 HLA-B*15:01 HLA-B*73:01 HLA-C*03:03 HLA-C*15:05 pat_CP2 B-LCL 27841757 HLA-A*11:01 HLA-B*14:02 HLA-B*44:02 pat_FL B-LCL 27841757 HLA-A*03:01 HLA-A*11:01 HLA-B*44:03 HLA-B*50:01 pat_J B-LCL 27841757 HLA-A*02:01 HLA-A*03:01 HLA-B*07:02 HLA-C*07:02 pat_JPB3 B-LCL 27841757 HLA-A*02:01 HLA-A*11:01 HLA-B*27:05 HLA-B*56:01 pat_JT2 B-LCL 27841757 HLA-A*11:01 HLA-B*18:03 HLA-B*35:01 pat_M B-LCL 27841757 HLA-A*03:01 HLA-A*29:02 HLA-B*08:01 HLA-B*44:03 HLA-C*07:01 HLA-C*16:01 pat_MA B-LCL 27841757 HLA-A*02:01 HLA-A*29:02 HLA-B*44:03 HLA-B*57:01 HLA-C*07:01 HLA-C*16:01 pat_ML B-LCL 27841757 HLA-A*02:01 HLA-A*11:01 HLA-B*40:01 HLA-B*44:03 pat_NS2 B-LCL 27841757 HLA-A*02:01 HLA-B*13:02 HLA-B*41:01 pat_NT B-LCL 27841757 HLA-A*01:01 HLA-A*32:01 HLA-B*08:01 pat_PF1 B-LCL 27841757 HLA-A*01:01 HLA-A*02:01 HLA-B*07:02 HLA-B*44:03 HLA-C*07:02 HLA-C*16:01 pat_R B-LCL 27841757 HLA-A*03:01 HLA-A*29:02 HLA-B*08:01 HLA-B*44:03 HLA-C*07:01 HLA-C*16:01 pat_RT B-LCL 27841757 HLA-A*01:01 HLA-A*02:01 HLA-B*18:01 HLA-B*39:24 HLA-C*05:01 HLA-C*07:01 pat_SR B-LCL 27841757 HLA-A*02:01 HLA-A*23:01 HLA-B*18:01 HLA-B*44:03 pat_ST B-LCL 27841757 HLA-A*03:01 HLA-A*24:02 HLA-B*07:02 HLA-B*27:05 """ info_df = pandas.read_csv(StringIO(info_text), sep="\t", index_col=0) info_df.index = info_df.index.str.strip() info_df["hla"] = info_df[ [c for c in info_df if c.startswith("allele")] ].fillna("").apply(" ".join, axis=1) results = [] for col in df.columns: if col.startswith("Intensity "): sample_id = col.replace("Intensity ", "") assert sample_id in info_df.index, sample_id peptides = df.loc[df[col].fillna(0) > 0].Sequence.unique() result_df = pandas.DataFrame({"peptide": peptides}) result_df["sample_id"] = sample_id result_df["hla"] = info_df.loc[sample_id].hla result_df["sample_type"] = info_df.loc[sample_id].origin result_df["original_pmid"] = str( info_df.loc[sample_id].original_pmid) results.append(result_df) result_df = pandas.concat(results, ignore_index=True) samples = result_df.sample_id.unique() for sample_id in info_df.index: assert sample_id in samples, (sample_id, samples) result_df["mhc_class"] = "I" result_df["format"] = "multiallelic" result_df["cell_line"] = "" result_df["pulldown_antibody"] = "W6/32" return result_df PMID_31495665_SAMPLE_TYPES = { "HLA-DR_Lung": "lung", "HLA-DR_PBMC_HDSC": "pbmc", "HLA-DR_PBMC_RG1095": "pbmc", "HLA-DR_PBMC_RG1104": "pbmc", "HLA-DR_PBMC_RG1248": "pbmc", "HLA-DR_Spleen": "spleen", "MAPTAC_A*02:01": "mix:a375,expi293,hek293,hela", "MAPTAC_A*11:01": "mix:expi293,hela", "MAPTAC_A*32:01": "mix:a375,expi293,hela", "MAPTAC_B*07:02": "mix:a375,expi293,hela", "MAPTAC_B*45:01": "expi293", "MAPTAC_B*52:01": "mix:a375,expi293", "MAPTAC_C*03:03": "expi293", "MAPTAC_C*06:02": "mix:a375,expi293", "MAPTAC_DPB1*06:01/DPA1*01:03_dm+": "expi293", "MAPTAC_DPB1*06:01/DPA1*01:03_dm-": "expi293", "MAPTAC_DQB1*06:04/DQA1*01:02_dm+": "expi293", "MAPTAC_DQB1*06:04/DQA1*01:02_dm-": "expi293", "MAPTAC_DRB1*01:01": "mix:a375,b721,expi293,kg1,k562", "MAPTAC_DRB1*03:01": "expi293", "MAPTAC_DRB1*04:01": "expi293", "MAPTAC_DRB1*07:01": "mix:expi293,hek293", "MAPTAC_DRB1*11:01": "mix:expi293,k562,kg1", "MAPTAC_DRB1*12:01_dm+": "expi293", "MAPTAC_DRB1*12:01_dm-": "expi293", "MAPTAC_DRB1*15:01": "expi293", "MAPTAC_DRB3*01:01_dm+": "expi293", "MAPTAC_DRB3*01:01_dm-": "expi293", } CELL_LINE_MIXTURES = sorted( set( x for x in PMID_31495665_SAMPLE_TYPES.values() if x.startswith("mix:"))) def handle_pmid_31495665(filename): """Abelin, ..., Rooney Immunity 2019 [PMID 31495665]""" hla_type = { "HLA-DR_A375": None, "HLA-DR_Lung": "DRB1*01:01 DRB1*03:01 DRB3*01:01", "HLA-DR_PBMC_HDSC": "DRB1*03:01 DRB1*11:01 DRB3*01:01 DRB3*02:02", "HLA-DR_PBMC_RG1095": "HLA-DRA1*01:01-DRB1*03:01 HLA-DRA1*01:01-DRB1*11:01 HLA-DRA1*01:01-DRB3*01:01 HLA-DRA1*01:01-DRB3*02:02", "HLA-DR_PBMC_RG1104": "DRB1*01:01 DRB1*11:01 DRB3*02:02", "HLA-DR_PBMC_RG1248": "DRB1*03:01 DRB1*03:01 DRB3*01:01 DRB3*01:01", "HLA-DR_SILAC_Donor1_10minLysate": None, "HLA-DR_SILAC_Donor1_5hrLysate": None, "HLA-DR_SILAC_Donor1_DConly": None, "HLA-DR_SILAC_Donor1_UVovernight": None, "HLA-DR_SILAC_Donor2_DC_UV_16hr": None, "HLA-DR_SILAC_Donor2_DC_UV_24hr": None, "HLA-DR_Spleen": "DRB1*04:01 DRB4*01:03 DRB1*15:03 DRB5*01:01", "MAPTAC_A*02:01": "HLA-A*02:01", "MAPTAC_A*11:01": "HLA-A*11:01", "MAPTAC_A*32:01": "HLA-A*32:01", "MAPTAC_B*07:02": "HLA-B*07:02", "MAPTAC_B*45:01": "HLA-B*45:01", "MAPTAC_B*52:01": "HLA-B*52:01", "MAPTAC_C*03:03": "HLA-C*03:03", "MAPTAC_C*06:02": "HLA-C*06:02", "MAPTAC_DPB1*06:01/DPA1*01:03_dm+": "HLA-DPB1*06:01-DPA1*01:03", "MAPTAC_DPB1*06:01/DPA1*01:03_dm-": "HLA-DPB1*06:01-DPA1*01:03", "MAPTAC_DQB1*06:04/DQA1*01:02_dm+": "HLA-DQB1*06:04-DQA1*01:02", "MAPTAC_DQB1*06:04/DQA1*01:02_dm-": "HLA-DQB1*06:04-DQA1*01:02", "MAPTAC_DRB1*01:01": "HLA-DRA1*01:01-DRB1*01:01", "MAPTAC_DRB1*03:01": "HLA-DRA1*01:01-DRB1*03:01", "MAPTAC_DRB1*04:01": "HLA-DRA1*01:01-DRB1*04:01", "MAPTAC_DRB1*07:01": "HLA-DRA1*01:01-DRB1*07:01", "MAPTAC_DRB1*11:01": "HLA-DRA1*01:01-DRB1*11:01", "MAPTAC_DRB1*12:01_dm+": "HLA-DRA1*01:01-DRB1*12:01", "MAPTAC_DRB1*12:01_dm-": "HLA-DRA1*01:01-DRB1*12:01", "MAPTAC_DRB1*15:01": "HLA-DRA1*01:01-DRB1*15:01", "MAPTAC_DRB3*01:01_dm+": "HLA-DRA1*01:01-DRB3*01:01", "MAPTAC_DRB3*01:01_dm-": "HLA-DRA1*01:01-DRB3*01:01", } pulldown_antibody = { "HLA-DR_Lung": "L243 (HLA-DR)", "HLA-DR_PBMC_HDSC": "tal1b5 (HLA-DR)", "HLA-DR_PBMC_RG1095": "tal1b5 (HLA-DR)", "HLA-DR_PBMC_RG1104": "tal1b5 (HLA-DR)", "HLA-DR_PBMC_RG1248": "tal1b5 (HLA-DR)", "HLA-DR_Spleen": "L243 (HLA-DR)", "MAPTAC_A*02:01": "MAPTAC", "MAPTAC_A*11:01": "MAPTAC", "MAPTAC_A*32:01": "MAPTAC", "MAPTAC_B*07:02": "MAPTAC", "MAPTAC_B*45:01": "MAPTAC", "MAPTAC_B*52:01": "MAPTAC", "MAPTAC_C*03:03": "MAPTAC", "MAPTAC_C*06:02": "MAPTAC", "MAPTAC_DPB1*06:01/DPA1*01:03_dm+": "MAPTAC", "MAPTAC_DPB1*06:01/DPA1*01:03_dm-": "MAPTAC", "MAPTAC_DQB1*06:04/DQA1*01:02_dm+": "MAPTAC", "MAPTAC_DQB1*06:04/DQA1*01:02_dm-": "MAPTAC", "MAPTAC_DRB1*01:01": "MAPTAC", "MAPTAC_DRB1*03:01": "MAPTAC", "MAPTAC_DRB1*04:01": "MAPTAC", "MAPTAC_DRB1*07:01": "MAPTAC", "MAPTAC_DRB1*11:01": "MAPTAC", "MAPTAC_DRB1*12:01_dm+": "MAPTAC", "MAPTAC_DRB1*12:01_dm-": "MAPTAC", "MAPTAC_DRB1*15:01": "MAPTAC", "MAPTAC_DRB3*01:01_dm+": "MAPTAC", "MAPTAC_DRB3*01:01_dm-": "MAPTAC", } format = { "HLA-DR_Lung": "DR-specific", "HLA-DR_PBMC_HDSC": "DR-specific", "HLA-DR_PBMC_RG1095": "DR-specific", "HLA-DR_PBMC_RG1104": "DR-specific", "HLA-DR_PBMC_RG1248": "DR-specific", "HLA-DR_Spleen": "DR-specific", "MAPTAC_A*02:01": "monoallelic", "MAPTAC_A*11:01": "monoallelic", "MAPTAC_A*32:01": "monoallelic", "MAPTAC_B*07:02": "monoallelic", "MAPTAC_B*45:01": "monoallelic", "MAPTAC_B*52:01": "monoallelic", "MAPTAC_C*03:03": "monoallelic", "MAPTAC_C*06:02": "monoallelic", "MAPTAC_DPB1*06:01/DPA1*01:03_dm+": "monoallelic", "MAPTAC_DPB1*06:01/DPA1*01:03_dm-": "monoallelic", "MAPTAC_DQB1*06:04/DQA1*01:02_dm+": "monoallelic", "MAPTAC_DQB1*06:04/DQA1*01:02_dm-": "monoallelic", "MAPTAC_DRB1*01:01": "monoallelic", "MAPTAC_DRB1*03:01": "monoallelic", "MAPTAC_DRB1*04:01": "monoallelic", "MAPTAC_DRB1*07:01": "monoallelic", "MAPTAC_DRB1*11:01": "monoallelic", "MAPTAC_DRB1*12:01_dm+": "monoallelic", "MAPTAC_DRB1*12:01_dm-": "monoallelic", "MAPTAC_DRB1*15:01": "monoallelic", "MAPTAC_DRB3*01:01_dm+": "monoallelic", "MAPTAC_DRB3*01:01_dm-": "monoallelic", } mhc_class = { "HLA-DR_Lung": "II", "HLA-DR_PBMC_HDSC": "II", "HLA-DR_PBMC_RG1095": "II", "HLA-DR_PBMC_RG1104": "II", "HLA-DR_PBMC_RG1248": "II", "HLA-DR_Spleen": "II", "MAPTAC_A*02:01": "I", "MAPTAC_A*11:01": "I", "MAPTAC_A*32:01": "I", "MAPTAC_B*07:02": "I", "MAPTAC_B*45:01": "I", "MAPTAC_B*52:01": "I", "MAPTAC_C*03:03": "I", "MAPTAC_C*06:02": "I", "MAPTAC_DPB1*06:01/DPA1*01:03_dm+": "II", "MAPTAC_DPB1*06:01/DPA1*01:03_dm-": "II", "MAPTAC_DQB1*06:04/DQA1*01:02_dm+": "II", "MAPTAC_DQB1*06:04/DQA1*01:02_dm-": "II", "MAPTAC_DRB1*01:01": "II", "MAPTAC_DRB1*03:01": "II", "MAPTAC_DRB1*04:01": "II", "MAPTAC_DRB1*07:01": "II", "MAPTAC_DRB1*11:01": "II", "MAPTAC_DRB1*12:01_dm+": "II", "MAPTAC_DRB1*12:01_dm-": "II", "MAPTAC_DRB1*15:01": "II", "MAPTAC_DRB3*01:01_dm+": "II", "MAPTAC_DRB3*01:01_dm-": "II", } cell_line = { "HLA-DR_Lung": "", "HLA-DR_PBMC_HDSC": "", "HLA-DR_PBMC_RG1095": "", "HLA-DR_PBMC_RG1104": "", "HLA-DR_PBMC_RG1248": "", "HLA-DR_Spleen": "", "MAPTAC_A*02:01": "", "MAPTAC_A*11:01": "", "MAPTAC_A*32:01": "", "MAPTAC_B*07:02": "", "MAPTAC_B*45:01": "expi293", "MAPTAC_B*52:01": "", "MAPTAC_C*03:03": "expi293", "MAPTAC_C*06:02": "", "MAPTAC_DPB1*06:01/DPA1*01:03_dm+": "expi293", "MAPTAC_DPB1*06:01/DPA1*01:03_dm-": "expi293", "MAPTAC_DQB1*06:04/DQA1*01:02_dm+": "expi293", # don't actually see this in DataS1A! "MAPTAC_DQB1*06:04/DQA1*01:02_dm-": "expi293", "MAPTAC_DRB1*01:01": "", "MAPTAC_DRB1*03:01": "expi293", "MAPTAC_DRB1*04:01": "expi293", "MAPTAC_DRB1*07:01": "", "MAPTAC_DRB1*11:01": "", "MAPTAC_DRB1*12:01_dm+": "expi293", "MAPTAC_DRB1*12:01_dm-": "expi293", "MAPTAC_DRB1*15:01": "expi293", "MAPTAC_DRB3*01:01_dm+": "expi293", "MAPTAC_DRB3*01:01_dm-": "expi293", } df = pandas.read_excel(filename, sheet_name="DataS1B") results = [] for sample_id in df.columns: if hla_type[sample_id] is None: print("Intentionally skipping", sample_id) continue result_df = pandas.DataFrame({ "peptide": df[sample_id].dropna().values, }) result_df["sample_id"] = sample_id result_df["hla"] = hla_type[sample_id] result_df["pulldown_antibody"] = pulldown_antibody[sample_id] result_df["format"] = format[sample_id] result_df["mhc_class"] = mhc_class[sample_id] result_df["sample_type"] = PMID_31495665_SAMPLE_TYPES[sample_id] result_df["cell_line"] = cell_line[sample_id] results.append(result_df) result_df = pandas.concat(results, ignore_index=True) # Remove class II for now result_df = result_df.loc[result_df.mhc_class == "I"] return result_df def handle_pmid_27869121(filename): """Bassani-Sternberg, ..., Krackhardt Nature Comm. 2016 [PMID 27869121]""" # Although this dataset has class II data also, we are only extracting # class I for now. df = pandas.read_excel(filename, skiprows=1) # Taking these from: # Supplementary Table 2: Information of patients selected for neoepitope # identification # For the Mel5 sample, only two-digit alleles are shown (A*01, A*25, # B*08, B*18) so we are skipping that sample for now. hla_df = pandas.DataFrame([ ("Mel-8", "HLA-A*01:01 HLA-A*03:01 HLA-B*07:02 HLA-B*08:01 HLA-C*07:01 HLA-C*07:02"), ("Mel-12", "HLA-A*01:01 HLA-B*08:01 HLA-C*07:01"), ("Mel-15", "HLA-A*03:01 HLA-A*68:01 HLA-B*27:05 HLA-B*35:03 HLA-C*02:02 HLA-C*04:01"), ("Mel-16", "HLA-A*01:01 HLA-A*24:02 HLA-B*07:02 HLA-B*08:01 HLA-C*07:01 HLA-C*07:02"), ], columns=["sample_id", "hla"]).set_index("sample_id") # We assert below that none of the class I hit peptides were found in any # of the class II pull downs. class_ii_cols = [ c for c in df.columns if c.endswith("HLA-II (arbitrary units)") ] class_ii_hits = set(df.loc[ (df[class_ii_cols].fillna(0.0).sum(1) > 0) ].Sequence.unique()) results = [] for (sample_id, hla) in hla_df.hla.items(): intensity_col = "Intensity %s_HLA-I (arbitrary units)" % sample_id sub_df = df.loc[ (df[intensity_col].fillna(0.0) > 0) ] filtered_sub_df = sub_df.loc[ (~sub_df.Sequence.isin(class_ii_hits)) ] peptides = filtered_sub_df.Sequence.unique() assert not any(p in class_ii_hits for p in peptides) result_df = pandas.DataFrame({ "peptide": peptides, }) result_df["sample_id"] = sample_id result_df["hla"] = hla_df.loc[sample_id, "hla"] result_df["pulldown_antibody"] = "W6/32" result_df["format"] = "multiallelic" result_df["mhc_class"] = "I" result_df["sample_type"] = "melanoma_met" result_df["cell_line"] = None results.append(result_df) result_df = pandas.concat(results, ignore_index=True) return result_df def handle_pmid_31154438(*filenames): """Shraibman, ..., Admon Mol Cell Proteomics 2019 [PMID 31154438]""" # Note: this publication also includes analyses of the secreted HLA # peptidedome (sHLA) but we are using only the data from membrane-bound # HLA. (xls, txt) = sorted(filenames, key=lambda s: not s.endswith(".xlsx")) info = pandas.read_excel(xls, skiprows=1) df = pandas.read_csv(txt, sep="\t", skiprows=1) hla_df = info.loc[ ~info["mHLA tissue sample"].isnull() ].set_index("mHLA tissue sample")[["HLA typing"]] def fix_hla(string): result = [] alleles = string.split(";") for a in alleles: a = a.strip() if "/" in a: (a1, a2) = a.split("/") a2 = a1[:2] + a2 lst = [a1, a2] else: lst = [a] for a in lst: normalized = normalize_allele_name_or_return_unknown(a) result.append(normalized) return " ".join(result) hla_df["hla"] = hla_df["HLA typing"].map(fix_hla) results = [] for (sample_id, hla) in hla_df.hla.items(): intensity_col = "Intensity %s" % sample_id sub_df = df.loc[ (df[intensity_col].fillna(0.0) > 0) ] peptides = sub_df.Sequence.unique() result_df = pandas.DataFrame({ "peptide": peptides, }) result_df["sample_id"] = sample_id result_df["hla"] = hla_df.loc[sample_id, "hla"] result_df["pulldown_antibody"] = "W6/32" result_df["format"] = "multiallelic" result_df["mhc_class"] = "I" result_df["sample_type"] = "glioblastoma_tissue" result_df["cell_line"] = None results.append(result_df) result_df = pandas.concat(results, ignore_index=True) return result_df def handle_pmid_31844290(*filenames): """Sarkizova, ..., Keskin Nature Biotechnology 2019 [PMID 31844290]""" (mono_filename, multi_filename) = sorted(filenames) # Monoallelic mono = pandas.read_excel(mono_filename, sheet_name=None) dfs = [] for (key, value) in mono.items(): if key == 'Sheet1': continue allele_before_normalization = key if not allele_before_normalization.startswith("HLA-"): allele_before_normalization = "HLA-" + allele_before_normalization allele = normalize_allele_name(allele_before_normalization) assert allele != "UNKNOWN" df = pandas.DataFrame({"peptide": value.sequence.values}) df["sample_id"] = "keskin_%s" % key df["hla"] = allele df["pulldown_antibody"] = "W6/32" df["format"] = "monoallelic" df["mhc_class"] = "I" df["sample_type"] = "B-CELL" df["cell_line"] = "b721" dfs.append(df) # Multiallelic multi = pandas.read_excel(multi_filename, sheet_name=None) metadata = multi['Tissue Sample Characteristics'] allele_table = metadata.drop_duplicates( "Clinical ID").set_index("Clinical ID").loc[ :, [c for c in metadata if c.startswith("HLA-")] ] allele_table = allele_table.loc[~allele_table.index.isnull()] allele_table = allele_table.loc[allele_table["HLA-A"] != 'n.d.'] allele_table = allele_table.applymap( lambda s: s[1:] if s.startswith("-") else s) allele_table = allele_table.applymap( lambda s: "B5101" if s == "B51" else s) allele_table = allele_table.applymap(normalize_allele_name_or_return_unknown) sample_info = metadata.drop_duplicates( "Clinical ID").set_index("Clinical ID")[['Cancer type', 'IP Ab']] sample_info = sample_info.loc[~sample_info.index.isnull()].fillna( method='ffill') sample_info = sample_info.loc[sample_info.index.isin(allele_table.index)] sample_info = sample_info.loc[allele_table.index] sample_info["hla"] = [ " ".join(row).replace("HLA-A*31:0102", "HLA-A*31:01") # fix a typo for _, row in allele_table.iterrows() ] sample_info["sample_type"] = sample_info['Cancer type'].map({ 'CLL': "B-CELL", 'GBM': "GLIOBLASTOMA_TISSUE", 'Melanoma': "MELANOMA", "Ovarian": "OVARY", 'ccRCC': "KIDNEY", }) assert not sample_info["sample_type"].isnull().any() assert not sample_info["hla"].str.contains("UNKNOWN").any() for (key, value) in multi.items(): if key == 'Tissue Sample Characteristics': continue for (directory, sub_df) in value.groupby("directory"): if 'Pat7' in directory or 'Pat9' in directory: print("Skipping due to no HLA typing", directory) continue try: (sample_id,) = sample_info.loc[ sample_info.index.map( lambda idx: ( idx in directory or idx.replace("-", "_").replace("MEL_", "") in directory or idx.replace(" ", "_") in directory )) ].index except ValueError as e: print(directory, e) import ipdb ; ipdb.set_trace() info = sample_info.loc[sample_id] df = pandas.DataFrame({"peptide": sub_df.sequence.values}) df["sample_id"] = "keskin_%s" % sample_id.replace(" ", "_") df["hla"] = info['hla'] df["pulldown_antibody"] = info['IP Ab'] df["format"] = "multiallelic" df["mhc_class"] = "I" df["sample_type"] = info['sample_type'] df["cell_line"] = None dfs.append(df) result_df = pandas.concat(dfs, ignore_index=True) result_df["peptide"] = result_df.peptide.str.upper() return result_df EXPRESSION_GROUPS_ROWS = [] def make_expression_groups(dataset_identifier, df, groups): result_df = pandas.DataFrame(index=df.index) for (label, columns) in groups.items(): for col in columns: if col not in df.columns: raise ValueError( "Missing: %s. Available: %s" % (col, df.columns.tolist())) result_df[label] = df[columns].mean(1) EXPRESSION_GROUPS_ROWS.append((dataset_identifier, label, columns)) return result_df def handle_expression_GSE113126(*filenames): """ Barry, ..., Krummel Nature Medicine 2018 [PMID 29942093] This is the melanoma met RNA-seq dataset. """ df = pandas.read_csv(filenames[0], sep="\t", index_col=0) df = df[[]] # no columns for filename in filenames: df[os.path.basename(filename)] = pandas.read_csv( filename, sep="\t", index_col=0)["TPM"] assert len(df.columns) == len(filenames) groups = { "sample_type:MELANOMA_MET": df.columns.tolist(), } return [make_expression_groups("GSE113126", df, groups)] def handle_expression_expression_atlas_22460905(filename): df = pandas.read_csv(filename, sep="\t", skiprows=4, index_col=0) del df["Gene Name"] df.columns = df.columns.str.lower() df = df.fillna(0.0) def matches(*strings): return [c for c in df.columns if all(s in c for s in strings)] groups = { "sample_type:B-LCL": ( matches("b-cell", "lymphoblast") + matches("b acute lymphoblastic")), "sample_type:B-CELL": matches("b-cell"), "sample_type:B721-LIKE": matches("b-cell"), "sample_type:MELANOMA_CELL_LINE": matches("melanoma"), "sample_type:MELANOMA": matches("melanoma"), "sample_type:A375-LIKE": matches("melanoma"), "sample_type:KG1-LIKE": matches("myeloid leukemia"), # Using a fibrosarcoma cell line for our fibroblast sample. "sample_type:FIBROBLAST": ['fibrosarcoma, ht-1080'], # For GBM tissue we are just using a mixture of cell lines. "sample_type:GLIOBLASTOMA_TISSUE": matches("glioblastoma"), "cell_line:THP-1": ["childhood acute monocytic leukemia, thp-1"], "cell_line:HL-60": ["adult acute myeloid leukemia, hl-60"], "cell_line:U-87": ['glioblastoma, u-87 mg'], "cell_line:LNT-229": ['glioblastoma, ln-229'], "cell_line:T98G": ['glioblastoma, t98g'], "cell_line:SK-MEL-5": ['cutaneous melanoma, sk-mel-5'], 'cell_line:MEWO': ['melanoma, mewo'], "cell_line:HCC1937": ['breast ductal adenocarcinoma, hcc1937'], "cell_line:HCT116": ['colon carcinoma, hct 116'], "cell_line:HCC1143": ['breast ductal adenocarcinoma, hcc1143'], } return [make_expression_groups("expression_atlas_22460905", df, groups)] def handle_expression_human_protein_atlas(*filenames): (cell_line_filename,) = [f for f in filenames if "celline" in f] (blood_filename,) = [f for f in filenames if "blood" in f] (gtex_filename,) = [f for f in filenames if "gtex" in f] cell_line_df = pandas.read_csv(cell_line_filename, sep="\t") blood_df = pandas.read_csv(blood_filename, sep="\t", index_col=0) gtex_df = pandas.read_csv(gtex_filename, sep="\t") cell_line_df = cell_line_df.pivot( index="Gene", columns="Cell line", values="TPM") gtex_df = gtex_df.pivot( index="Gene", columns="Tissue", values="TPM") return [ make_expression_groups( "human_protein_atlas:%s" % os.path.basename(blood_filename), blood_df, groups={ "sample_type:PBMC": [ c for c in blood_df.columns if "total PBMC" in c ], # for samples labeled leukapheresis we also use PBMC "sample_type:LEUKAPHERESIS": [ c for c in blood_df.columns if "total PBMC" in c ], # for samples labeled TIL we are also using PBMC "sample_type:TIL": [ c for c in blood_df.columns if "total PBMC" in c ], }), make_expression_groups( "human_protein_atlas:%s" % os.path.basename(cell_line_filename), cell_line_df, groups={ "cell_line:HELA": ['HeLa'], "cell_line:K562": ["K-562"], "cell_line:HEK293": ['HEK 293'], "cell_line:RPMI8226": ['RPMI-8226'], "cell_line:EXPI293": ['HEK 293'], # EXPI293 derived from HEK293 }), make_expression_groups( "human_protein_atlas:%s" % os.path.basename(gtex_filename), gtex_df, groups={ "sample_type:LUNG": ["lung"], "sample_type:SPLEEN": ["spleen"], "sample_type:OVARY": ["ovary"], "sample_type:KIDNEY": ["kidney"], }), ] def make_expression_mixtures(expression_df): global CELL_LINE_MIXTURES groups = {} for mix in CELL_LINE_MIXTURES: components = [] for item in mix.replace("mix:", "").upper().split(","): if "cell_line:%s" % item in expression_df.columns: components.append("cell_line:%s" % item) else: print("No cell line, falling back on similar: ", item) components.append("sample_type:%s-LIKE" % item) groups["sample_type:" + mix.upper()] = components missing = set() for some in groups.values(): for item in some: if item not in expression_df.columns: missing.add(item) if missing: raise ValueError( "Missing [%d]: %s. Available: %s" % ( len(missing), missing, expression_df.columns.tolist())) return make_expression_groups("mixtures", expression_df, groups) # Add all functions with names like handle_pmid_XXXX to PMID_HANDLERS dict. for (key, value) in list(locals().items()): if key.startswith("handle_pmid_"): PMID_HANDLERS[key.replace("handle_pmid_", "")] = value elif key.startswith("handle_expression_"): EXPRESSION_HANDLERS[key.replace("handle_expression_", "")] = value def run(): args = parser.parse_args(sys.argv[1:]) expression_dfs = [] for (i, item_tpl) in enumerate(args.expression_item): (label, filenames) = (item_tpl[0], item_tpl[1:]) label = label.replace("-", "_") print( "Processing expression item %d of %d" % (i + 1, len(args.expression_item)), label, *[os.path.abspath(f) for f in filenames]) expression_dfs_for_item = [] handler = None if label in EXPRESSION_HANDLERS: handler = EXPRESSION_HANDLERS[label] expression_dfs_for_item = handler(*filenames) elif args.debug: debug(*filenames) else: raise NotImplementedError(label) if expression_dfs_for_item: print( "Processed expression data", label, "result dataframes", len(expression_dfs_for_item)) print(*[e.columns for e in expression_dfs_for_item]) expression_dfs.extend(expression_dfs_for_item) expression_df = expression_dfs[0] for other in expression_dfs[1:]: expression_df = pandas.merge( expression_df, other, how='outer', left_index=True, right_index=True) print("Genes in each expression dataframe: ", *[len(e) for e in expression_dfs]) print("Genes in merged expression dataframe", len(expression_df)) if CELL_LINE_MIXTURES: print("Generating cell line mixtures.") expression_mixture_df = make_expression_mixtures(expression_df) expression_df = pandas.merge( expression_df, expression_mixture_df, how='outer', left_index=True, right_index=True) ms_dfs = [] for (i, item_tpl) in enumerate(args.ms_item): (pmid, filenames) = (item_tpl[0], item_tpl[1:]) print( "Processing MS item %d of %d" % (i + 1, len(args.ms_item)), pmid, *[os.path.abspath(f) for f in filenames]) ms_df = None handler = None if pmid in PMID_HANDLERS: handler = PMID_HANDLERS[pmid] ms_df = handler(*filenames) elif args.debug: debug(*filenames) else: raise NotImplementedError(pmid) if ms_df is not None: ms_df["pmid"] = pmid if "original_pmid" not in ms_df.columns: ms_df["original_pmid"] = pmid if "expression_dataset" not in ms_df.columns: ms_df["expression_dataset"] = "" ms_df = ms_df.applymap(str).applymap(str.upper) ms_df["sample_id"] = ms_df.sample_id.str.replace(" ", "") print("*** PMID %s: %d peptides ***" % (pmid, len(ms_df))) if handler is not None: print(handler.__doc__) print("Counts by sample id:") print(ms_df.groupby("sample_id").peptide.nunique()) print("") print("Counts by sample type:") print(ms_df.groupby("sample_type").peptide.nunique()) print("****************************") for value in ms_df.expression_dataset.unique(): if value and value not in expression_df.columns: raise ValueError("No such expression dataset", value) ms_dfs.append(ms_df) ms_df = pandas.concat(ms_dfs, ignore_index=True, sort=False) ms_df["cell_line"] = ms_df["cell_line"].fillna("") ms_df["hla"] = ms_df["hla"].str.strip().str.replace(r'\s+', ' ') sample_table = ms_df[ ["sample_id", "pmid", "expression_dataset", "cell_line", "sample_type"] ].drop_duplicates().set_index("sample_id") sample_id_to_expression_dataset = sample_table.expression_dataset.to_dict() for (sample_id, value) in sorted(sample_id_to_expression_dataset.items()): if value: print("Expression dataset for sample", sample_id, "already assigned") continue cell_line_col = "cell_line:" + sample_table.loc[sample_id, "cell_line"] sample_type_col = "sample_type:" + ( sample_table.loc[sample_id, "sample_type"]) expression_dataset = None for col in [cell_line_col, sample_type_col]: if col in expression_df.columns: expression_dataset = col break if not expression_dataset: print("*" * 20) print("No expression dataset for sample ", sample_id) print("Sample info:") print(sample_table.loc[sample_id]) print("*" * 20) sample_id_to_expression_dataset[sample_id] = expression_dataset print( "Sample", sample_id, "assigned exp. dataset", expression_dataset) print("Expression dataset usage:") print(pandas.Series(sample_id_to_expression_dataset).value_counts()) missing = [ key for (key, value) in sample_id_to_expression_dataset.items() if value is None ] if missing: print("Missing expression data for samples", *missing) print( "Missing cell lines: ", *sample_table.loc[missing, "cell_line"].dropna().drop_duplicates().tolist()) print("Missing sample types: ", *sample_table.loc[ missing, "sample_type"].dropna().drop_duplicates().tolist()) if args.debug: import ipdb; ipdb.set_trace() else: raise ValueError("Missing expression data for samples: ", missing) ms_df["expression_dataset"] = ms_df.sample_id.map( sample_id_to_expression_dataset) cols = [ "pmid", "sample_id", "peptide", "format", "mhc_class", "hla", "expression_dataset", ] cols += [c for c in sorted(ms_df.columns) if c not in cols] ms_df = ms_df[cols] null_df = ms_df.loc[ms_df.isnull().any(1)] if len(null_df) > 0: print("Nulls:") print(null_df) else: print("No nulls.") # Each sample should be coming from only one experiment. assert ms_df.groupby("sample_id").pmid.nunique().max() == 1, ( ms_df.groupby("sample_id").pmid.nunique().sort_values()) expression_df.to_csv(args.expression_out, index=True) print("Wrote: %s" % os.path.abspath(args.expression_out)) ms_df.to_csv(args.ms_out, index=False) print("Wrote: %s" % os.path.abspath(args.ms_out)) if args.expression_metadata_out is not None: expression_metadata_df = pandas.DataFrame( EXPRESSION_GROUPS_ROWS, columns=["expression_dataset", "label", "samples"]) expression_metadata_df["samples"] = expression_metadata_df[ "samples" ].map(json.dumps) expression_metadata_df.to_csv(args.expression_metadata_out, index=False) print("Wrote: %s" % os.path.abspath(args.expression_metadata_out)) if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/data_curated/requirements.txt000066400000000000000000000000141525677230600255740ustar00rootroot00000000000000xlrd>=1.1.0 mhcflurry-2.3.6/downloads-generation/data_evaluation/000077500000000000000000000000001525677230600230355ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/data_evaluation/GENERATE.sh000077500000000000000000000354321525677230600245750ustar00rootroot00000000000000#!/bin/bash # # # Usage: GENERATE.sh # # cluster mode uses an HPC cluster (Mount Sinai chimera cluster, which uses lsf job # scheduler). This would need to be modified for other sites. # set -e set -x DOWNLOAD_NAME=data_evaluation SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") mkdir -p "$SCRATCH_DIR" if [ "$2" != "continue-incomplete" ] then echo "Fresh run" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" else echo "Continuing incomplete run" fi # Send stdout and stderr to a logfile included with the archive. LOG="$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.$(date +%s).txt" exec > >(tee -ia "$LOG") exec 2> >(tee -ia "$LOG" >&2) # Log some environment info echo "Invocation: $0 $@" date pip freeze git status mhcflurry-downloads info cd $SCRATCH_DIR/$DOWNLOAD_NAME export OMP_NUM_THREADS=1 export PYTHONUNBUFFERED=1 export MHCFLURRY_DEFAULT_PREDICT_BATCH_SIZE=16384 ## GENERATE BENCHMARK: MONOALLELIC #for kind in train_excluded all for kind in train_excluded do EXCLUDE_TRAIN_DATA="" if [ "$kind" == "train_excluded" ] then EXCLUDE_TRAIN_DATA="$(mhcflurry-downloads path models_class1_pan_variants)/models.no_additional_ms/train_data.csv.bz2" fi if [ "$2" == "continue-incomplete" ] && [ -f "benchmark.monoallelic.$kind.csv.bz2" ] then echo "Reusing existing monoallelic benchmark: benchmark.monoallelic.$kind.csv.bz2" else cp $SCRIPT_DIR/make_benchmark.py . time python make_benchmark.py \ --hits "$(mhcflurry-downloads path models_class1_processing)/hits_with_tpm.csv.bz2" \ --proteome-reference-csv "$(mhcflurry-downloads path data_references)/uniprot_proteins.csv.bz2" \ --decoys-per-hit 110 \ --exclude-train-data "$EXCLUDE_TRAIN_DATA" \ --only-format MONOALLELIC \ --out "$(pwd)/benchmark.monoallelic.$kind.csv" bzip2 -f benchmark.monoallelic.$kind.csv fi done ### GENERATE BENCHMARK: MULTIALLELIC #for kind in train_excluded all for kind in train_excluded do EXCLUDE_TRAIN_DATA="" if [ "$kind" == "train_excluded" ] then EXCLUDE_TRAIN_DATA="$(mhcflurry-downloads path models_class1_pan)/models.combined/train_data.csv.bz2" fi if [ "$2" == "continue-incomplete" ] && [ -f "benchmark.multiallelic.$kind.csv.bz2" ] then echo "Reusing existing multiallelic benchmark" else cp $SCRIPT_DIR/make_benchmark.py . time python make_benchmark.py \ --hits "$(mhcflurry-downloads path models_class1_processing)/hits_with_tpm.csv.bz2" \ --proteome-reference-csv "$(mhcflurry-downloads path data_references)/uniprot_proteins.csv.bz2" \ --decoys-per-hit 110 \ --exclude-train-data "$EXCLUDE_TRAIN_DATA" \ --only-format MULTIALLELIC \ --out "$(pwd)/benchmark.multiallelic.$kind.csv" bzip2 -f benchmark.multiallelic.$kind.csv fi done for kind in train_excluded do ### SPLIT BENCHMARK: MONOALLELIC if [ "$2" == "continue-incomplete" ] && [ -f "MONOALLELIC_SAMPLES" ] then echo "Reusing existing monoallelic $kind benchmark pieces" else cp $SCRIPT_DIR/split_by_sample.py . time python split_by_sample.py \ "$(pwd)/benchmark.monoallelic.$kind.csv.bz2" \ --out "$(pwd)/benchmark.monoallelic.$kind.%s.csv" \ --out-samples MONOALLELIC_SAMPLES for sample in $(cat MONOALLELIC_SAMPLES) do bzip2 -f "$(pwd)/benchmark.monoallelic.$kind.$sample.csv" done fi ### SPLIT BENCHMARK: MULTIALLELIC if [ "$2" == "continue-incomplete" ] && [ -f "MULTIALLELIC_SAMPLES" ] then echo "Reusing existing multiallelic $kind benchmark pieces" else cp $SCRIPT_DIR/split_by_sample.py . time python split_by_sample.py \ "$(pwd)/benchmark.multiallelic.$kind.csv.bz2" \ --out "$(pwd)/benchmark.multiallelic.$kind.%s.csv" \ --out-samples MULTIALLELIC_SAMPLES for sample in $(cat MULTIALLELIC_SAMPLES) do bzip2 -f "$(pwd)/benchmark.multiallelic.$kind.$sample.csv" done fi done rm -rf commands mkdir commands rm -f CHECK_FILES #for kind in train_excluded all for kind in train_excluded do MONOALLELIC_AFFINITY_PREDICTOR="$(mhcflurry-downloads path models_class1_pan_variants)/models.no_additional_ms" echo "MONOALLELIC: Using affinity predictor: MONOALLELIC_AFFINITY_PREDICTOR" cat "$MONOALLELIC_AFFINITY_PREDICTOR/info.txt" GROUP=group.monoallelic.no_additional_ms.$kind.csv echo "filename" > $GROUP for sample in $(cat MONOALLELIC_SAMPLES) do ## AFFINITY PREDICTOR VARIANT: MONOALLELIC if [ "$2" == "continue-incomplete" ] && [ -f "benchmark.monoallelic.no_additional_ms.$kind.$sample.csv.bz2" ] then echo "Reusing existing monoallelic benchmark predictions $sample" else echo time mhcflurry-predict \ "$(pwd)/benchmark.monoallelic.$kind.$sample.csv.bz2" \ --allele-column hla \ --prediction-column-prefix no_additional_ms_ \ --models \""$MONOALLELIC_AFFINITY_PREDICTOR"\" \ --affinity-only \ --no-affinity-percentile \ --out "$(pwd)/benchmark.monoallelic.no_additional_ms.$kind.$sample.csv" \ --no-throw >> commands/monoallelic.$kind.$sample.sh echo bzip2 -f "$(pwd)/benchmark.monoallelic.no_additional_ms.$kind.$sample.csv" >> commands/monoallelic.$kind.$sample.sh fi echo ls -lh "benchmark.monoallelic.no_additional_ms.$kind.$sample.csv.bz2" >> CHECK_FILES echo "benchmark.monoallelic.no_additional_ms.$kind.$sample.csv.bz2" >> $GROUP done MULTIALLELIC_AFFINITY_PREDICTOR="$(mhcflurry-downloads path models_class1_pan)/models.combined" echo "MULTIALLELIC: Using affinity predictor: MULTIALLELIC_AFFINITY_PREDICTOR" cat "$MULTIALLELIC_AFFINITY_PREDICTOR/info.txt" GROUP=group.multiallelic.production.$kind.csv echo "filename" > $GROUP for sample in $(cat MULTIALLELIC_SAMPLES) do ### AFFINITY PREDICTORS: MULTIALLELIC if [ "$2" == "continue-incomplete" ] && [ -f "benchmark.multiallelic.production.$kind.$sample.csv.bz2" ] then echo "Reusing existing multiallelic predictions $sample" else echo time mhcflurry-predict \ "$(pwd)/benchmark.multiallelic.$kind.$sample.csv.bz2" \ --allele-column hla \ --prediction-column-prefix mhcflurry_production_ \ --models \""$MULTIALLELIC_AFFINITY_PREDICTOR"\" \ --affinity-only \ --no-affinity-percentile \ --out "$(pwd)/benchmark.multiallelic.production.$kind.$sample.csv" >> commands/multiallelic.production.$kind.$sample.sh echo bzip2 -f "$(pwd)/benchmark.multiallelic.production.$kind.$sample.csv" >> commands/multiallelic.production.$kind.$sample.sh fi echo ls -lh "benchmark.multiallelic.production.$kind.$sample.csv.bz2" >> CHECK_FILES echo "benchmark.multiallelic.production.$kind.$sample.csv.bz2" >> $GROUP done #for sample in $(cat MULTIALLELIC_SAMPLES) #do #for variant in no_additional_ms compact_peptide affinity_only no_pretrain single_hidden_no_pretrain 500nm #for variant in 50nm # TODO: IF this gets enabled, add the $GROUP stuff. #do # if [ "$2" == "continue-incomplete" ] && [ -f "benchmark.multiallelic.${variant}.$kind.$sample.csv.bz2" ] # then # echo "Reusing existing multiallelic predictions: ${variant} $sample" # else # echo time mhcflurry-predict \ # "$(pwd)/benchmark.multiallelic.$kind.$sample.csv.bz2" \ # --allele-column hla \ # --prediction-column-prefix "${variant}_" \ # --models \""$(mhcflurry-downloads path models_class1_pan_variants)/models.$variant"\" \ # --affinity-only \ # --no-affinity-percentile \ # --out "$(pwd)/benchmark.multiallelic.${variant}.$kind.$sample.csv" >> commands/multiallelic.${variant}.$kind.$sample.sh # echo bzip2 -f "$(pwd)/benchmark.multiallelic.${variant}.$kind.$sample.csv" >> commands/multiallelic.${variant}.$kind.$sample.sh # fi # echo ls -lh "benchmark.multiallelic.${variant}.$kind.$sample.csv.bz2" >> CHECK_FILES #done #done PRESENTATION_PREDICTOR="$(mhcflurry-downloads path models_class1_presentation)/models" echo "Using presentation predictor: $PRESENTATION_PREDICTOR" cat "$PRESENTATION_PREDICTOR/info.txt" GROUP=group.multiallelic.presentation_with_flanks.$kind.csv echo "filename" > $GROUP for sample in $(cat MULTIALLELIC_SAMPLES) do ### PRESENTATION: WITH FLANKS if [ "$2" == "continue-incomplete" ] && [ -f "benchmark.multiallelic.presentation_with_flanks.$kind.$sample.csv.bz2" ] then echo "Reusing existing multiallelic presentation with flanks $sample" else echo time mhcflurry-predict \ "$(pwd)/benchmark.multiallelic.$kind.$sample.csv.bz2" \ --allele-column hla \ --prediction-column-prefix presentation_with_flanks_ \ --models \""$PRESENTATION_PREDICTOR"\" \ --no-affinity-percentile \ --out "$(pwd)/benchmark.multiallelic.presentation_with_flanks.$kind.$sample.csv" >> commands/multiallelic.presentation_with_flanks.$kind.$sample.sh echo bzip2 -f "$(pwd)/benchmark.multiallelic.presentation_with_flanks.$kind.$sample.csv" >> commands/multiallelic.presentation_with_flanks.$kind.$sample.sh fi echo ls -lh "benchmark.multiallelic.presentation_with_flanks.$kind.$sample.csv.bz2" >> CHECK_FILES echo "benchmark.multiallelic.presentation_with_flanks.$kind.$sample.csv.bz2" >> $GROUP done GROUP=group.multiallelic.presentation_without_flanks.$kind.csv echo "filename" > $GROUP for sample in $(cat MULTIALLELIC_SAMPLES) do ### PRESENTATION: NO FLANKS if [ "$2" == "continue-incomplete" ] && [ -f "benchmark.multiallelic.presentation_without_flanks.$kind.$sample.csv.bz2" ] then echo "Reusing existing multiallelic presentation without flanks $sample" else echo time mhcflurry-predict \ "$(pwd)/benchmark.multiallelic.$kind.$sample.csv.bz2" \ --allele-column hla \ --prediction-column-prefix presentation_without_flanks_ \ --models \""$PRESENTATION_PREDICTOR"\" \ --no-affinity-percentile \ --no-flanking \ --out "$(pwd)/benchmark.multiallelic.presentation_without_flanks.$kind.$sample.csv" >> commands/multiallelic.presentation_without_flanks.$kind.$sample.sh echo bzip2 -f "$(pwd)/benchmark.multiallelic.presentation_without_flanks.$kind.$sample.csv" >> commands/multiallelic.presentation_without_flanks.$kind.$sample.sh fi echo ls -lh "benchmark.multiallelic.presentation_without_flanks.$kind.$sample.csv.bz2" >> CHECK_FILES echo "benchmark.multiallelic.presentation_without_flanks.$kind.$sample.csv.bz2" >> $GROUP done ### PRECOMPUTED #### for variant in netmhcpan4.ba netmhcpan4.el mixmhcpred do GROUP=group.monoallelic.${variant}.$kind.csv echo "filename" > $GROUP for sample in $(cat MONOALLELIC_SAMPLES) do if [ "$2" == "continue-incomplete" ] && [ -f "benchmark.monoallelic.${variant}.$kind.$sample.csv.bz2" ] then echo "Reusing existing monoallelic ${variant} $sample" else cp $SCRIPT_DIR/join_with_precomputed.py . echo time python join_with_precomputed.py \ \""$(pwd)/benchmark.monoallelic.$kind.$sample.csv.bz2"\" \ ${variant} \ --out "$(pwd)/benchmark.monoallelic.${variant}.$kind.$sample.csv" >> commands/monoallelic.${variant}.$kind.$sample.sh echo bzip2 -f "$(pwd)/benchmark.monoallelic.${variant}.$kind.$sample.csv" >> commands/monoallelic.${variant}.$kind.$sample.sh fi echo ls -lh "benchmark.monoallelic.${variant}.$kind.$sample.csv.bz2" >> CHECK_FILES echo "benchmark.monoallelic.${variant}.$kind.$sample.csv.bz2" >> $GROUP done GROUP=group.multiallelic.${variant}.$kind.csv echo "filename" > $GROUP for sample in $(cat MULTIALLELIC_SAMPLES) do if [ "$2" == "continue-incomplete" ] && [ -f "benchmark.multiallelic.${variant}.$kind.$sample.csv.bz2" ] then echo "Reusing existing multiallelic ${variant} $sample" else cp $SCRIPT_DIR/join_with_precomputed.py . echo time python join_with_precomputed.py \ \""$(pwd)/benchmark.multiallelic.$kind.$sample.csv.bz2"\" \ ${variant} \ --out "$(pwd)/benchmark.multiallelic.${variant}.$kind.$sample.csv" >> commands/multiallelic.${variant}.$kind.$sample.sh echo bzip2 -f "$(pwd)/benchmark.multiallelic.${variant}.$kind.$sample.csv" >> commands/multiallelic.${variant}.$kind.$sample.sh fi echo ls -lh "benchmark.multiallelic.${variant}.$kind.$sample.csv.bz2" >> CHECK_FILES echo "benchmark.multiallelic.${variant}.$kind.$sample.csv.bz2" >> $GROUP done done done ls -lh commands if [ "$1" != "cluster" ] then echo "Running locally" for i in $(ls commands/*.sh) do echo "# *******" echo "# Command $i" cat $i bash $i done else echo "Running on cluster" for i in $(ls commands/*.sh) do echo "# *******" echo "# Command $i" cat $SCRIPT_DIR/cluster_submit_script_header.mssm_hpc.lsf > ${i}.lsf echo cd "$(pwd)" >> ${i}.lsf cat $i >> ${i}.lsf cat ${i}.lsf bsub -K < "${i}.lsf" & sleep 1 done wait fi bash CHECK_FILES cp $SCRIPT_ABSOLUTE_PATH . bzip2 -f "$LOG" for i in $(ls LOG-worker.*.txt) ; do bzip2 -f $i ; done RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.$(date +%Y%m%d).tar.bz2" tar -cjf "$RESULT" * echo "Created archive: $RESULT" # Split into <2GB chunks for GitHub PARTS="${RESULT}.part." # Check for pre-existing part files and rename them. for i in $(ls "${PARTS}"* ) do DEST="${i}.OLD.$(date +%s)" echo "WARNING: already exists: $i . Moving to $DEST" mv $i $DEST done split -b 2000m "$RESULT" "$PARTS" echo "Split into parts:" ls -lh "${PARTS}"* mhcflurry-2.3.6/downloads-generation/data_evaluation/cluster_submit_script_header.mssm_hpc.lsf000066400000000000000000000012461525677230600333160ustar00rootroot00000000000000#!/bin/bash #BSUB -J MHCf # Job name #BSUB -P acc_nkcancer # allocation account or Unix group #BSUB -q premium # queue #BSUB -R span[hosts=1] # one node #BSUB -n 1 # number of compute cores #BSUB -W 40:00 # walltime in HH:MM #BSUB -R rusage[mem=45000] # mb memory requested #BSUB -o %J.stdout # output log (%J : JobID) #BSUB -eo %J.stderr # error log #BSUB -L /bin/bash # Initialize the execution environment # set -e set -x echo "Subsequent stderr output redirected to stdout" >&2 exec 2>&1 export TMPDIR=/local/JOBS/mhcflurry-{work_item_num} export PATH=$HOME/mhcflurry-conda-environment/bin/:$PATH export PYTHONUNBUFFERED=1 export KMP_SETTINGS=1 free -m module list env mhcflurry-2.3.6/downloads-generation/data_evaluation/join_with_precomputed.py000066400000000000000000000117611525677230600300160ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Join benchmark with precomputed predictions. """ import sys import argparse import os import numpy import collections import pandas import tqdm import mhcflurry from mhcflurry.downloads import get_path parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "benchmark") parser.add_argument( "predictors", nargs="+", choices=("netmhcpan4.ba", "netmhcpan4.el", "mixmhcpred")) parser.add_argument( "--out", metavar="CSV", required=True, help="File to write") def load_results(dirname, result_df=None, columns=None): peptides = pandas.read_csv(os.path.join(dirname, "peptides.csv")).peptide manifest_df = pandas.read_csv(os.path.join(dirname, "alleles.csv")) print("Loading results. Existing data has", len(peptides), "peptides and", len(manifest_df), "columns") if columns is None: columns = manifest_df.col.values if result_df is None: result_df = pandas.DataFrame( index=peptides, columns=columns, dtype="float32") result_df[:] = numpy.nan peptides_to_assign = peptides mask = None else: mask = (peptides.isin(result_df.index)).values peptides_to_assign = peptides[mask] manifest_df = manifest_df.loc[manifest_df.col.isin(result_df.columns)] print("Will load", len(peptides), "peptides and", len(manifest_df), "cols") for _, row in tqdm.tqdm(manifest_df.iterrows(), total=len(manifest_df)): with open(os.path.join(dirname, row.path), "rb") as fd: value = numpy.load(fd)['arr_0'].astype(numpy.float32) if mask is not None: value = value[mask] result_df.loc[peptides_to_assign, row.col] = value return result_df def run(): args = parser.parse_args(sys.argv[1:]) df = pandas.read_csv(args.benchmark) peptides = df.peptide.unique() alleles = set() for some in df.hla.unique(): alleles.update(some.split()) precomputed_dfs = {} if 'netmhcpan4.ba' in args.predictors: precomputed_dfs['netmhcpan4.ba'] = load_results( get_path("data_predictions", "predictions/all.netmhcpan4.ba"), result_df=pandas.DataFrame( dtype=numpy.float32, index=peptides, columns=["%s affinity" % a for a in alleles])).rename( columns=lambda s: s.replace("affinity", "").strip()) precomputed_dfs['netmhcpan4.ba'] *= -1 # flip since it's affinities if 'netmhcpan4.el' in args.predictors: precomputed_dfs['netmhcpan4.el'] = load_results( get_path("data_predictions", "predictions/all.netmhcpan4.el"), result_df=pandas.DataFrame( dtype=numpy.float32, index=peptides, columns=["%s score" % a for a in alleles])).rename( columns=lambda s: s.replace("score", "").strip()) if 'mixmhcpred' in args.predictors: precomputed_dfs['mixmhcpred'] = load_results( get_path("data_predictions", "predictions/all.mixmhcpred"), result_df=pandas.DataFrame( dtype=numpy.float32, index=peptides, columns=["%s score" % a for a in alleles])).rename( columns=lambda s: s.replace("score", "").strip()) skip_experiments = set() for hla_text, sub_df in tqdm.tqdm(df.groupby("hla"), total=df.hla.nunique()): hla = hla_text.split() for (name, precomputed_df) in precomputed_dfs.items(): df.loc[sub_df.index, name] = numpy.nan prediction_df = pandas.DataFrame(index=sub_df.peptide, dtype=float) for allele in hla: if allele not in precomputed_df.columns or precomputed_df[allele].isnull().all(): print(sub_df.sample_id.unique(), hla) skip_experiments.update(sub_df.sample_id.unique()) prediction_df[allele] = precomputed_df.loc[ prediction_df.index, allele ] df.loc[sub_df.index, name] = prediction_df.max(1, skipna=False).values df.loc[sub_df.index, name + "_best_allele"] = prediction_df.idxmax( 1, skipna=False).values if 'netmhcpan4.ba' in args.predictors: # unflip the values df['netmhcpan4.ba'] *= -1 print("Skip experiments", skip_experiments) print("results") print(df) df.to_csv(args.out, index=False) print("Wrote", args.out) if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/data_evaluation/make_benchmark.py000066400000000000000000000230651525677230600263440ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Build historical evaluation tables with observed peptides and sampled decoys. """ import sys import argparse import os import numpy import collections import pandas import tqdm import mhcflurry from mhcflurry.common import ( fraction_arg, normalize_class1_genotype, positive_float_arg, ) from mhcflurry.proteome_decoys import ( infer_flanking_length, load_reference_sequences, peptides_by_length_from_frame, sample_peptide_frame_for_accessions, ) parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "--hits", metavar="CSV", required=True, help="Multiallelic mass spec") proteome_source_group = parser.add_mutually_exclusive_group(required=True) proteome_source_group.add_argument( "--proteome-peptides", metavar="CSV", help="Proteome peptides") proteome_source_group.add_argument( "--proteome-reference-csv", metavar="CSV", help=( "Protein reference CSV with accession and seq columns. If specified, " "decoy peptide candidates are generated per sample instead of reading " "a materialized proteome peptide CSV.")) parser.add_argument( "--decoys-per-hit", type=positive_float_arg, metavar="N", default=99, help="Decoys per hit") parser.add_argument( "--exclude-pmid", nargs="+", default=[], help="Exclude given PMID") parser.add_argument( "--only-pmid", nargs="*", default=[], help="Include only the given PMID") parser.add_argument( "--exclude-train-data", nargs="+", default=[], help="Remove hits and decoys included in the given training data") parser.add_argument( "--only-format", choices=("MONOALLELIC", "MULTIALLELIC"), help="Include only data of the given format") parser.add_argument( "--sample-fraction", type=fraction_arg, help="Subsample data by specified fraction (e.g. 0.1)") parser.add_argument( "--out", metavar="CSV", required=True, help="File to write") def run(): args = parser.parse_args(sys.argv[1:]) hit_df = pandas.read_csv(args.hits) hit_df["pmid"] = hit_df["pmid"].astype(str) original_samples_pmids = hit_df.pmid.unique() numpy.testing.assert_equal(hit_df.hit_id.nunique(), len(hit_df)) hit_df = hit_df.loc[ (hit_df.mhc_class == "I") & (hit_df.peptide.str.len() <= 11) & (hit_df.peptide.str.len() >= 8) & (~hit_df.protein_ensembl.isnull()) & (hit_df.peptide.str.match("^[%s]+$" % "".join( mhcflurry.amino_acid.COMMON_AMINO_ACIDS))) ] hit_df['alleles'] = hit_df.hla.map(normalize_class1_genotype) hit_df["hla"] = hit_df["alleles"].map(" ".join) print("Loaded hits from %d samples" % hit_df.sample_id.nunique()) if args.only_format: hit_df = hit_df.loc[hit_df.format == args.only_format].copy() print("Subselected to %d %s samples" % ( hit_df.sample_id.nunique(), args.only_format)) if args.only_pmid or args.exclude_pmid: assert not (args.only_pmid and args.exclude_pmid) pmids = list(args.only_pmid) + list(args.exclude_pmid) missing = [pmid for pmid in pmids if pmid not in original_samples_pmids] assert not missing, (missing, original_samples_pmids) mask = hit_df.pmid.isin(pmids) if args.exclude_pmid: mask = ~mask new_hit_df = hit_df.loc[mask] print( "Selecting by pmids", pmids, "reduced dataset from", len(hit_df), "to", len(new_hit_df)) hit_df = new_hit_df.copy() print("Subselected by pmid to %d samples" % hit_df.sample_id.nunique()) allele_to_excluded_peptides = collections.defaultdict(set) for train_dataset in args.exclude_train_data: if not train_dataset: continue print("Excluding hits from", train_dataset) train_df = pandas.read_csv(train_dataset) for (allele, peptides) in train_df.groupby("allele").peptide.unique().items(): allele_to_excluded_peptides[allele].update(peptides) train_counts = train_df.groupby( ["allele", "peptide"]).measurement_value.count().to_dict() hit_no_train = hit_df.loc[ [ not any([ train_counts.get((allele, row.peptide)) for allele in row.alleles ]) for _, row in tqdm.tqdm(hit_df.iterrows(), total=len(hit_df))] ] print( "Excluding hits from", train_dataset, "reduced dataset from", len(hit_df), "to", len(hit_no_train)) hit_df = hit_no_train sample_table = hit_df.drop_duplicates("sample_id").set_index("sample_id") grouped = hit_df.groupby("sample_id").nunique() for col in sample_table.columns: if (grouped[col] > 1).any(): del sample_table[col] if args.proteome_peptides: print("Loading proteome peptides") all_peptides_df = pandas.read_csv(args.proteome_peptides) print("Loaded: ", all_peptides_df.shape) all_peptides_df = all_peptides_df.loc[ all_peptides_df.protein_accession.isin( hit_df.protein_accession.unique()) & all_peptides_df.peptide.str.match("^[%s]+$" % "".join( mhcflurry.amino_acid.COMMON_AMINO_ACIDS)) ].copy() all_peptides_by_length = peptides_by_length_from_frame(all_peptides_df) print( "Subselected proteome peptides by accession: ", all_peptides_df.shape) proteome_sequences = None flanking_length = None else: print("Loading protein reference sequences") proteome_sequences = load_reference_sequences( args.proteome_reference_csv, hit_df.protein_accession.unique()) print("Loaded %d protein sequences" % len(proteome_sequences)) all_peptides_by_length = None flanking_length = infer_flanking_length(hit_df) print("Will generate proteome peptides per sample with flank length", flanking_length) print("Selecting decoys.") lengths = [8, 9, 10, 11] result_df = [] for sample_id, sub_df in tqdm.tqdm( hit_df.groupby("sample_id"), total=hit_df.sample_id.nunique()): result_df.append( sub_df[[ "protein_accession", "peptide", "sample_id", "n_flank", "c_flank", ]].copy()) result_df[-1]["hit"] = 1 excluded_peptides = set() for allele in sample_table.loc[sample_id].alleles: excluded_peptides.update(allele_to_excluded_peptides[allele]) print( sample_id, "will exclude", len(excluded_peptides), "peptides from decoy universe") for length in lengths: sample_peptides = sub_df.peptide.unique() sample_accessions = sub_df.protein_accession.unique() exclude_peptides = set(sample_peptides) exclude_peptides.update(excluded_peptides) num_decoys = int(len(sub_df) * args.decoys_per_hit / len(lengths)) if all_peptides_by_length is None: selected_decoys = sample_peptide_frame_for_accessions( sample_accessions, proteome_sequences, lengths=[length], flanking_length=flanking_length, exclude_peptides=exclude_peptides, n=num_decoys, ) else: universe = all_peptides_by_length[length] possible_universe = universe.loc[ (~universe.peptide.isin(sample_peptides)) & (~universe.peptide.isin(excluded_peptides)) & (universe.protein_accession.isin(sample_accessions)) ] selected_decoys = possible_universe.sample(n=num_decoys) result_df.append(selected_decoys[ ["protein_accession", "peptide", "n_flank", "c_flank"] ].copy()) result_df[-1]["hit"] = 0 result_df[-1]["sample_id"] = sample_id result_df = pandas.concat(result_df, ignore_index=True, sort=False) result_df["hla"] = result_df.sample_id.map(sample_table.hla) print(result_df) print("Counts:") print(result_df.groupby(["sample_id", "hit"]).peptide.nunique()) print("Hit counts:") print( result_df.loc[ result_df.hit == 1 ].groupby("sample_id").hit.count().sort_values()) print("Hit rates:") print(result_df.groupby("sample_id").hit.mean().sort_values()) if args.sample_fraction: print("Subsampling to ", args.sample_fraction) result_df = result_df.sample(frac=args.sample_fraction) print("Subsampled:") print(result_df) print("Hit rates:") print(result_df.groupby("sample_id").hit.mean().sort_values()) result_df.to_csv(args.out, index=False) print("Wrote: ", args.out) if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/data_evaluation/split_by_sample.py000066400000000000000000000032221525677230600265740ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Split a big csv by a particular column (sample id) """ import sys import argparse import re import pandas parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "data", metavar="CSV") parser.add_argument( "--out", help="Out pattern (%s will be replaced by sample)", metavar="CSV") parser.add_argument( "--out-samples", help="Out sample list", metavar="CSV") parser.add_argument( "--split-column", help="Column to split by", default="sample_id") def run(): args = parser.parse_args(sys.argv[1:]) df = pandas.read_csv(args.data) print("Read data with shape", df.shape) names = [] for (i, (sample, sub_df)) in enumerate(df.groupby(args.split_column)): name = re.sub(r'[^\w\d-]', '', sample) + (".%d" % i) dest = args.out % name sub_df.to_csv(dest, index=False) print("Wrote [%d rows]" % len(sub_df), dest) names.append(name) if args.out_samples: pandas.Series(names).to_csv(args.out_samples, index=False, header=False) print("Wrote", args.out_samples) if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/data_iedb/000077500000000000000000000000001525677230600215715ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/data_iedb/GENERATE.sh000077500000000000000000000021371525677230600233250ustar00rootroot00000000000000#!/bin/bash # # Download latest MHC I ligand data from IEDB. # set -e set -x DOWNLOAD_NAME=data_iedb SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" mkdir -p "$SCRATCH_DIR" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" # Send stdout and stderr to a logfile included with the archive. exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) # Log some environment info date cd $SCRATCH_DIR/$DOWNLOAD_NAME wget -q https://iedb.org/downloader.php?file_name=doc/mhc_ligand_full_single_file.zip -O mhc_ligand_full.zip wget -q http://www.iedb.org/downloader.php?file_name=doc/tcell_full_v3.zip -O tcell_full_v3.zip unzip mhc_ligand_full.zip rm mhc_ligand_full.zip bzip2 mhc_ligand_full.csv unzip tcell_full_v3.zip rm tcell_full_v3.zip bzip2 tcell_full_v3.csv cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.$(date +%Y%m%d).tar.bz2" tar -cjf "$RESULT" * echo "Created archive: $RESULT" mhcflurry-2.3.6/downloads-generation/data_iedb/README.md000066400000000000000000000002551525677230600230520ustar00rootroot00000000000000# IEDB Data This download is a snapshot of the IEDB MHC ligand data, available at: http://www.iedb.org/doc/mhc_ligand_full.zip To generate it, run: ``` ./GENERATE.sh ```mhcflurry-2.3.6/downloads-generation/data_mass_spec_annotated/000077500000000000000000000000001525677230600247005ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/data_mass_spec_annotated/GENERATE.sh000077500000000000000000000022271525677230600264340ustar00rootroot00000000000000#!/bin/bash # # set -e set -x DOWNLOAD_NAME=data_mass_spec_annotated SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") export PYTHONUNBUFFERED=1 mkdir -p "$SCRATCH_DIR" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" # Send stdout and stderr to a logfile included with the archive. exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) # Log some environment info date pip freeze git status cd $SCRATCH_DIR/$DOWNLOAD_NAME cp $SCRIPT_DIR/annotate.py . PEPTIDES=$(mhcflurry-downloads path data_curated)/ms.by_pmid.csv.bz2 REFERENCES_DIR=$(mhcflurry-downloads path data_references) python annotate.py \ "$PEPTIDES" \ "${REFERENCES_DIR}/uniprot_proteins.csv.bz2" \ "${REFERENCES_DIR}/uniprot_proteins.fm" \ --out annotated_ms.csv bzip2 annotated_ms.csv cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.$(date +%Y%m%d).tar.bz2" tar -cjf "$RESULT" * echo "Created archive: $RESULT" mhcflurry-2.3.6/downloads-generation/data_mass_spec_annotated/annotate.py000077500000000000000000000046371525677230600271000ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ """ import sys import argparse import os import pandas from mhcflurry.peptide_reference import annotate_peptide_references parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "peptides", metavar="FILE.csv", help="CSV of mass spec hits") parser.add_argument( "reference_csv", metavar="FILE.csv", help="CSV of protein sequences") parser.add_argument( "reference_index", metavar="FILE.fm", nargs="?", help="Legacy shellinford index over protein sequences. Retained for " "compatibility with existing GENERATE.sh calls; ignored.") parser.add_argument( "--out", metavar="OUT.csv", help="Out file path") parser.add_argument( "--flanking-length", metavar="N", type=int, default=15, help="Length of flanking sequence to include") parser.add_argument( "--debug-max-rows", metavar="N", type=int, default=None, help="Max rows to process. Useful for debugging. If specified an ipdb " "debugging session is also opened at the end of the script") def run(argv=None): if argv is None: argv = sys.argv[1:] args = parser.parse_args(argv) df = pandas.read_csv(args.peptides) df["hit_id"] = "hit." + df.index.map('{0:07d}'.format) df = df.set_index("hit_id") print("Read peptides", df.shape, *df.columns.tolist()) reference_df = pandas.read_csv(args.reference_csv, index_col=0) print("Read proteins", reference_df.shape, *reference_df.columns.tolist()) merged_df = annotate_peptide_references( df, reference_df, flanking_length=args.flanking_length, debug_max_rows=args.debug_max_rows) merged_df.to_csv(args.out, index=False) print("Wrote: %s" % os.path.abspath(args.out)) if args.debug_max_rows: # Leave user in a debugger import ipdb ipdb.set_trace() if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/data_mass_spec_annotated/requirements.txt000066400000000000000000000000171525677230600301620ustar00rootroot00000000000000ahocorasick-rs mhcflurry-2.3.6/downloads-generation/data_predictions/000077500000000000000000000000001525677230600232115ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/data_predictions/GENERATE.WITH_HPC_CLUSTER.sh000077500000000000000000000000531525677230600274050ustar00rootroot00000000000000bash GENERATE.sh cluster reuse-predictions mhcflurry-2.3.6/downloads-generation/data_predictions/GENERATE.sh000077500000000000000000000147051525677230600247510ustar00rootroot00000000000000#!/bin/bash # # This download includes predictions for NetMHCpan 4.0 and MixMHCpred over a # large number of peptides encompassing almost the full proteome. # # Usage: # GENERATE.sh # # The first choice listed above for each argument is the default. # # Meanings for these arguments: # # FIRST ARGUMENT: where to run # local - run locally using NUM_JOBS cores. # cluster - run on cluster. # # SECOND ARGUMENT: whether to reuse predictions from existing downloaded data # reuse-all - reuse predictions and peptide / allele lists from existing # downloaded data_predictions. # reuse-none - fully self-contained run; do not reuse anything. # reuse-predictions - reuse predictions but not peptide or allele lists. Any # new peptides not already included will be run. # reuse-predictions-except-mhcflurry # - Reuse predictions except for mhcflurry [1]. # # [1] In an earlier version, this download also included predictions for MHCflurry. This is # no longer the case. set -e set -x DOWNLOAD_NAME=data_predictions SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") export PYTHONUNBUFFERED=1 mkdir -p "$SCRATCH_DIR" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" # Send stdout and stderr to a logfile included with the archive. exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) # Log some environment info date pip freeze git status cd $SCRATCH_DIR/$DOWNLOAD_NAME cp $SCRIPT_DIR/write_proteome_peptides.py . cp $SCRIPT_DIR/write_allele_list.py . cp $SCRIPT_DIR/run_predictors.py . if [ "$1" != "cluster" ] then GPUS=$(nvidia-smi -L 2> /dev/null | wc -l) || GPUS=0 echo "Detected GPUS: $GPUS" PROCESSORS=$(getconf _NPROCESSORS_ONLN) echo "Detected processors: $PROCESSORS" if [ "$GPUS" -eq "0" ]; then NUM_JOBS=${NUM_JOBS-1} else NUM_JOBS=${NUM_JOBS-$GPUS} fi echo "Num jobs: $NUM_JOBS" EXTRA_ARGS+=" --num-jobs $NUM_JOBS --max-tasks-per-worker 1 --gpus $GPUS --max-workers-per-gpu 1" else EXTRA_ARGS+=" --cluster-parallelism --cluster-max-retries 3 --cluster-submit-command bsub --cluster-results-workdir $HOME/mhcflurry-scratch" fi PEPTIDES=$(mhcflurry-downloads path data_mass_spec_annotated)/annotated_ms.csv.bz2 REFERENCES_DIR=$(mhcflurry-downloads path data_references) if [ "${2:-reuse-none}" != "reuse-none" ] then EXISTING_DATA="$(mhcflurry-downloads path $DOWNLOAD_NAME)" echo "Will reuse data from $EXISTING_DATA" else EXISTING_DATA="" echo "Will NOT reuse any data" fi mkdir predictions # Write out alleles if [ "$2" == "reuse-all" ] then echo "Reusing allele list" cp "$EXISTING_DATA/alleles.txt" . else echo "Generating allele list" python write_allele_list.py "$PEPTIDES" --out alleles.txt fi # Write out and process peptides. for subset in all do if [ "$2" == "reuse-all" ] then echo "Reusing peptide list" cp "$EXISTING_DATA/proteome_peptides.$subset.csv.bz2" . else echo "Generating peptide list" SUBSET_ARG="" if [ "$subset" == "chr1" ] then SUBSET_ARG="--chromosome 1" fi python write_proteome_peptides.py \ "$PEPTIDES" \ "${REFERENCES_DIR}/uniprot_proteins.csv.bz2" \ --out proteome_peptides.$subset.csv $SUBSET_ARG bzip2 proteome_peptides.$subset.csv fi # Run mixmhcpred OUT_DIR=predictions/${subset}.mixmhcpred REUSE="" if [ "${2:-reuse-none}" != "reuse-none" ] then REUSE="$EXISTING_DATA"/$OUT_DIR fi python run_predictors.py \ "$(pwd)/proteome_peptides.$subset.csv.bz2" \ --result-dtype "float16" \ --predictor mixmhcpred \ --chunk-size 10000 \ --allele $(cat alleles.txt) \ --out "$OUT_DIR" \ --worker-log-dir "$SCRATCH_DIR/$DOWNLOAD_NAME" \ --cluster-script-prefix-path $SCRIPT_DIR/cluster_submit_script_header.mssm_hpc.nogpu.lsf \ --reuse-predictions "$REUSE" $EXTRA_ARGS # Run netmhcpan4 for kind in el ba do OUT_DIR=predictions/${subset}.netmhcpan4.$kind REUSE="" if [ "${2:-reuse-none}" != "reuse-none" ] then REUSE="$EXISTING_DATA"/$OUT_DIR fi python run_predictors.py \ "$(pwd)/proteome_peptides.$subset.csv.bz2" \ --result-dtype "float16" \ --predictor netmhcpan4-$kind \ --chunk-size 1000 \ --allele $(cat alleles.txt) \ --out "$OUT_DIR" \ --worker-log-dir "$SCRATCH_DIR/$DOWNLOAD_NAME" \ --cluster-script-prefix-path $SCRIPT_DIR/cluster_submit_script_header.mssm_hpc.nogpu.lsf \ --reuse-predictions "$REUSE" $EXTRA_ARGS done # Run MHCflurry #for kind in combined #do # OUT_DIR=predictions/${subset}.mhcflurry.${kind} # REUSE="" # if [ "${2:-reuse-none}" != "reuse-none" ] && [ "${2:-reuse-none}" != "reuse-predictions-except-mhcflurry" ] # then # REUSE="$EXISTING_DATA"/$OUT_DIR # fi # # python run_predictors.py \ # "$(pwd)/proteome_peptides.$subset.csv.bz2" \ # --result-dtype "float16" \ # --predictor mhcflurry \ # --chunk-size 500000 \ # --mhcflurry-batch-size 65536 \ # --mhcflurry-models-dir "$(mhcflurry-downloads path models_class1_pan)/models.$kind" \ # --allele $(cat alleles.txt) \ # --out "$OUT_DIR" \ # --worker-log-dir "$SCRATCH_DIR/$DOWNLOAD_NAME" \ # --cluster-script-prefix-path $SCRIPT_DIR/cluster_submit_script_header.mssm_hpc.gpu.lsf \ # --reuse-predictions "$REUSE" $EXTRA_ARGS #done done cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.$(date +%Y%m%d).tar.bz2" tar -cjf "$RESULT" * echo "Created archive: $RESULT" # Split into <2GB chunks for GitHub PARTS="${RESULT}.part." # Check for pre-existing part files and rename them. for i in $(ls "${PARTS}"* ) do DEST="${i}.OLD.$(date +%s)" echo "WARNING: already exists: $i . Moving to $DEST" mv $i $DEST done split -b 2000m "$RESULT" "$PARTS" echo "Split into parts:" ls -lh "${PARTS}"* mhcflurry-2.3.6/downloads-generation/data_predictions/cluster_submit_script_header.mssm_hpc.gpu.lsf000066400000000000000000000020771525677230600342670ustar00rootroot00000000000000#!/bin/bash #BSUB -J MHCf-{work_item_num} # Job name #BSUB -P acc_nkcancer # allocation account or Unix group #BSUB -q gpu # queue #BSUB -R rusage[ngpus_excl_p=1] # 1 exclusive GPU #BSUB -R span[hosts=1] # one node #BSUB -n 1 # number of compute cores #BSUB -W 46:00 # walltime in HH:MM #BSUB -R rusage[mem=30000] # mb memory requested #BSUB -o {work_dir}/%J.stdout # output log (%J : JobID) #BSUB -eo {work_dir}/STDERR # error log #BSUB -L /bin/bash # Initialize the execution environment # set -e set -x echo "Subsequent stderr output redirected to stdout" >&2 exec 2>&1 export TMPDIR=/local/JOBS/mhcflurry-{work_item_num} export PATH=$HOME/.conda/envs/py36b/bin/:$PATH export PYTHONUNBUFFERED=1 export KMP_SETTINGS=1 export NETMHC_BUNDLE_HOME=$HOME/sinai/git/netmhc-bundle export NETMHC_BUNDLE_TMPDIR=/local/JOBS/netmhctmp-{work_item_num} export PATH=$NETMHC_BUNDLE_HOME/bin:$PATH free -m module add cuda/10.0.130 cudnn/7.1.1 module list # python -c 'import tensorflow as tf ; print("GPU AVAILABLE" if tf.test.is_gpu_available() else "GPU NOT AVAILABLE")' env cd {work_dir} cluster_submit_script_header.mssm_hpc.nogpu.lsf000066400000000000000000000020411525677230600345340ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/data_predictions#!/bin/bash #BSUB -J MHCf-{work_item_num} # Job name #BSUB -P acc_nkcancer # allocation account or Unix group #BSUB -q express # queue #BSUB -R span[hosts=1] # one node #BSUB -n 1 # number of compute cores #BSUB -W 11:00 # walltime in HH:MM #BSUB -R rusage[mem=10000] # mb memory requested #BSUB -o {work_dir}/%J.stdout # output log (%J : JobID) #BSUB -eo {work_dir}/STDERR # error log #BSUB -L /bin/bash # Initialize the execution environment # set -e set -x echo "Subsequent stderr output redirected to stdout" >&2 exec 2>&1 export TMPDIR=/local/JOBS/mhcflurry-{work_item_num} export PATH=$HOME/.conda/envs/py36b/bin/:$PATH export PYTHONUNBUFFERED=1 export KMP_SETTINGS=1 export NETMHC_BUNDLE_HOME=$HOME/sinai/git/netmhc-bundle export NETMHC_BUNDLE_TMPDIR=/local/JOBS/netmhctmp-{work_item_num} export PATH=$NETMHC_BUNDLE_HOME/bin:$PATH cd {work_dir} mkdir -p "$NETMHC_BUNDLE_TMPDIR" mkdir -p "$TMPDIR" chmod 777 "$NETMHC_BUNDLE_TMPDIR" chmod 777 "$TMPDIR" ls "$NETMHC_BUNDLE_TMPDIR" ls "$TMPDIR" netMHCpan-4.0 -listMHC MixMHCpred -h free -m env mhcflurry-2.3.6/downloads-generation/data_predictions/requirements.txt000066400000000000000000000000111525677230600264650ustar00rootroot00000000000000mhctools mhcflurry-2.3.6/downloads-generation/data_predictions/run_predictors.py000066400000000000000000000435031525677230600266320ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ """ import argparse import os import signal import sys import time import traceback import math import collections from functools import partial import numpy import pandas from mhcflurry.common import normalize_allele_name import tqdm # progress bar tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 from mhcflurry.common import configure_logging from mhcflurry.local_parallelism import ( add_local_parallelism_args, worker_pool_with_gpu_assignments_from_args, call_wrapped_kwargs) from mhcflurry.cluster_parallelism import ( add_cluster_parallelism_args, cluster_results_from_args) # To avoid pickling large matrices to send to child processes when running in # parallel, we use this global variable as a place to store data. Data that is # stored here before creating the thread pool will be inherited to the child # processes upon fork() call, allowing us to share large data with the workers # via shared memory. GLOBAL_DATA = {} WORKER_CONTEXT = GLOBAL_DATA parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "input_peptides", metavar="CSV", help="CSV file with 'peptide' column") parser.add_argument( "--predictor", required=True, choices=("mhcflurry", "netmhcpan4-ba", "netmhcpan4-el", "mixmhcpred")) parser.add_argument( "--mhcflurry-models-dir", metavar="DIR", help="Directory to read MHCflurry models") parser.add_argument( "--mhcflurry-batch-size", type=int, default=4096, help="Batch size for MHCflurry predictions. Default: %(default)s") parser.add_argument( "--allele", default=None, required=True, nargs="+", help="Alleles to predict") parser.add_argument( "--chunk-size", type=int, default=100000, help="Num peptides per job. Default: %(default)s") parser.add_argument( "--out", metavar="DIR", help="Write results to DIR") parser.add_argument( "--max-peptides", type=int, help="Max peptides to process. For debugging.", default=None) parser.add_argument( "--reuse-predictions", metavar="DIR", nargs="*", help="Take predictions from indicated DIR instead of re-running them") parser.add_argument( "--result-dtype", default="float32", help="Numpy dtype of result. Default: %(default)s.") add_local_parallelism_args(parser) add_cluster_parallelism_args(parser) PREDICTOR_TO_COLS = { "mhcflurry": ["affinity"], "netmhcpan4-ba": ["affinity", "percentile_rank"], "netmhcpan4-el": ["score"], "mixmhcpred": ["score"], } def load_results(dirname, result_df=None, dtype="float32"): peptides = pandas.read_csv( os.path.join(dirname, "peptides.csv")).peptide manifest_df = pandas.read_csv(os.path.join(dirname, "alleles.csv")) print( "Loading results. Existing data has", len(peptides), "peptides and", len(manifest_df), "columns") # Make adjustments for old style data. Can be removed later. if "kind" not in manifest_df.columns: manifest_df["kind"] = "affinity" if "col" not in manifest_df.columns: manifest_df["col"] = manifest_df.allele + " " + manifest_df.kind if result_df is None: result_df = pandas.DataFrame( index=peptides, columns=manifest_df.col.values, dtype=dtype) result_df[:] = numpy.nan peptides_to_assign = peptides mask = None else: manifest_df = manifest_df.loc[manifest_df.col.isin(result_df.columns)] mask = (peptides.isin(result_df.index)).values peptides_to_assign = peptides[mask] print("Will load", len(peptides), "peptides and", len(manifest_df), "cols") for _, row in tqdm.tqdm(manifest_df.iterrows(), total=len(manifest_df)): with open(os.path.join(dirname, row.path), "rb") as fd: value = numpy.load(fd)['arr_0'] if mask is not None: value = value[mask] result_df.loc[peptides_to_assign, row.col] = value return result_df def run(argv=sys.argv[1:]): global GLOBAL_DATA # On sigusr1 print stack trace print("To show stack trace, run:\nkill -s USR1 %d" % os.getpid()) signal.signal(signal.SIGUSR1, lambda sig, frame: traceback.print_stack()) args = parser.parse_args(argv) configure_logging() serial_run = not args.cluster_parallelism and args.num_jobs == 0 alleles = [ normalize_allele_name(a, raise_on_error=False) for a in args.allele ] n_bad_alleles = sum([a is None for a in alleles]) if n_bad_alleles > 0: print("Dropping %d bad alleles" % n_bad_alleles) alleles = numpy.array(sorted({a for a in alleles if a})) peptides = pandas.read_csv( args.input_peptides, nrows=args.max_peptides).peptide.drop_duplicates() print("Filtering to valid peptides. Starting at: ", len(peptides)) peptides = peptides[peptides.str.match("^[ACDEFGHIKLMNPQRSTVWY]+$")] print("Filtered to: ", len(peptides)) peptides = peptides.unique() num_peptides = len(peptides) print("Predictions for %d alleles x %d peptides." % ( len(alleles), num_peptides)) if not os.path.exists(args.out): print("Creating", args.out) os.mkdir(args.out) GLOBAL_DATA["predictor"] = args.predictor GLOBAL_DATA["args"] = args GLOBAL_DATA["cols"] = PREDICTOR_TO_COLS[args.predictor] # Write peptide and allele lists to out dir. out_peptides = os.path.abspath(os.path.join(args.out, "peptides.csv")) pandas.DataFrame({"peptide": peptides}).to_csv(out_peptides, index=False) print("Wrote: ", out_peptides) manifest_df = [] for allele in alleles: for col in PREDICTOR_TO_COLS[args.predictor]: manifest_df.append((allele, col)) manifest_df = pandas.DataFrame( manifest_df, columns=["allele", "kind"]) manifest_df["col"] = ( manifest_df.allele + " " + manifest_df.kind) manifest_df["path"] = manifest_df.col.map( lambda s: s.replace("*", "").replace(" ", ".")) + ".npz" out_manifest = os.path.abspath(os.path.join(args.out, "alleles.csv")) manifest_df.to_csv(out_manifest, index=False) col_to_filename = manifest_df.set_index("col").path.map( lambda s: os.path.abspath(os.path.join(args.out, s))) print("Wrote: ", out_manifest) result_df = pandas.DataFrame( index=peptides, columns=manifest_df.col.values, dtype=args.result_dtype) result_df[:] = numpy.nan if args.reuse_predictions: # Allocating this here to hit any memory errors as early as possible. is_null_matrix = numpy.ones( shape=(result_df.shape[0], len(alleles)), dtype="int8") for dirname in args.reuse_predictions: if not dirname: continue # ignore empty strings if os.path.exists(dirname): print("Loading predictions", dirname) result_df = load_results( dirname, result_df, dtype=args.result_dtype) else: print("WARNING: skipping because does not exist", dirname) # We rerun any alleles that have nulls for any kind of values # (e.g. affinity, percentile rank, elution score). for (i, allele) in enumerate(alleles): sub_df = manifest_df.loc[manifest_df.allele == allele] is_null_matrix[:, i] = result_df[sub_df.col.values].isnull().any(1) print("Fraction null", is_null_matrix.mean()) print("Grouping peptides by alleles") allele_indices_to_peptides = collections.defaultdict(list) for (i, peptide) in tqdm.tqdm(enumerate(peptides), total=len(peptides)): (allele_indices,) = numpy.where(is_null_matrix[i]) if len(allele_indices) > 0: allele_indices_to_peptides[tuple(allele_indices)].append(peptide) del is_null_matrix work_items = [] print("Assigning peptides to work items.") for (indices, block_peptides) in allele_indices_to_peptides.items(): num_chunks = int(math.ceil(len(block_peptides) / args.chunk_size)) peptide_chunks = numpy.array_split(peptides, num_chunks) for chunk_peptides in peptide_chunks: work_items.append({ 'alleles': alleles[list(indices)], 'peptides': chunk_peptides, }) else: # Same number of chunks for all alleles num_chunks = int(math.ceil(len(peptides) / args.chunk_size)) print("Splitting peptides into %d chunks" % num_chunks) peptide_chunks = numpy.array_split(peptides, num_chunks) work_items = [] for (_, chunk_peptides) in enumerate(peptide_chunks): work_item = { 'alleles': alleles, 'peptides': chunk_peptides, } work_items.append(work_item) print("Work items: ", len(work_items)) for (i, work_item) in enumerate(work_items): work_item["work_item_num"] = i # Combine work items to form tasks. tasks = [] peptides_in_last_task = None # We sort work_items to put small items first so they get combined. for work_item in sorted(work_items, key=lambda d: len(d['peptides'])): if peptides_in_last_task is not None and ( len(work_item['peptides']) + peptides_in_last_task < args.chunk_size): # Add to last task. tasks[-1]['work_item_dicts'].append(work_item) peptides_in_last_task += len(work_item['peptides']) else: # New task tasks.append({'work_item_dicts': [work_item]}) peptides_in_last_task = len(work_item['peptides']) print("Collected %d work items into %d tasks" % ( len(work_items), len(tasks))) if args.predictor == "mhcflurry": do_predictions_function = do_predictions_mhcflurry else: do_predictions_function = do_predictions_mhctools worker_pool = None start = time.time() if serial_run: # Serial run print("Running in serial.") results = ( do_predictions_function(**task) for task in tasks) elif args.cluster_parallelism: # Run using separate processes HPC cluster. print("Running on cluster.") results = cluster_results_from_args( args, work_function=do_predictions_function, work_items=tasks, constant_data=GLOBAL_DATA, input_serialization_method="dill", result_serialization_method="pickle", clear_constant_data=True) else: worker_pool = worker_pool_with_gpu_assignments_from_args( args, worker_context_module=__name__, worker_context_data=GLOBAL_DATA, ) print("Worker pool", worker_pool) assert worker_pool is not None results = worker_pool.imap_unordered( partial(call_wrapped_kwargs, do_predictions_function), tasks, chunksize=1) allele_to_chunk_index_to_predictions = {} for allele in alleles: allele_to_chunk_index_to_predictions[allele] = {} def write_col(col): out_path = os.path.join( args.out, col_to_filename[col]) numpy.savez(out_path, result_df[col].values) print( "Wrote [%f%% null]:" % ( result_df[col].isnull().mean() * 100.0), out_path) print("Writing all columns.") last_write_time_per_column = {} for col in result_df.columns: write_col(col) last_write_time_per_column[col] = time.time() print("Done writing all columns. Reading results.") try: for worker_results in tqdm.tqdm(results, total=len(work_items)): for (work_item_num, col_to_predictions) in worker_results: for (col, predictions) in col_to_predictions.items(): result_df.loc[ work_items[work_item_num]['peptides'], col ] = predictions if time.time() - last_write_time_per_column[col] > 180: write_col(col) last_write_time_per_column[col] = time.time() if worker_pool: worker_pool.close() worker_pool.join() worker_pool = None finally: if worker_pool: worker_pool.terminate() worker_pool.join() print("Done processing. Final write for each column.") for col in result_df.columns: write_col(col) prediction_time = time.time() - start print("Done generating predictions in %0.2f min." % ( prediction_time / 60.0)) def do_predictions_mhctools(work_item_dicts, constant_data=None): """ Each tuple of work items consists of: (work_item_num, peptides, alleles) """ # This may run on the cluster in a way that misses all top level imports, # so we have to re-import everything here. import time import numpy import pandas import numpy.testing import mhctools if constant_data is None: constant_data = GLOBAL_DATA cols = constant_data['cols'] predictor_name = constant_data['args'].predictor results = [] for (i, d) in enumerate(work_item_dicts): work_item_num = d['work_item_num'] peptides = d['peptides'] alleles = d['alleles'] print("Processing work item", i + 1, "of", len(work_item_dicts)) result = {} results.append((work_item_num, result)) if predictor_name == "netmhcpan4-ba": predictor = mhctools.NetMHCpan4( alleles=alleles, program_name="netMHCpan-4.0", mode="binding_affinity") elif predictor_name == "netmhcpan4-el": predictor = mhctools.NetMHCpan4( alleles=alleles, program_name="netMHCpan-4.0", mode="elution_score") elif predictor_name == "mixmhcpred": # Empirically determine supported alleles. mixmhcpred_usable_alleles = [] unusable_alleles = [] for allele in alleles: predictor = mhctools.MixMHCpred(alleles=[allele]) # We use inf not nan to indicate unsupported alleles since # we use nan to indicate incomplete results that still need # to execute. empty_results = pandas.Series(index=peptides, dtype=numpy.float16) empty_results[:] = float('-inf') try: predictor.predict_peptides_dataframe(["PEPTIDESS"]) mixmhcpred_usable_alleles.append(allele) except ValueError: unusable_alleles.append(allele) for col in cols: result["%s %s" % (allele, col)] = empty_results.values print("MixMHCpred usable alleles: ", *mixmhcpred_usable_alleles) print("MixMHCpred unusable alleles: ", *unusable_alleles) predictor = mhctools.MixMHCpred(alleles=mixmhcpred_usable_alleles) assert mixmhcpred_usable_alleles, mixmhcpred_usable_alleles else: raise ValueError("Unsupported", predictor_name) start = time.time() df = predictor.predict_peptides_dataframe(peptides) print("Predicted for %d peptides x %d alleles in %0.2f sec." % ( len(peptides), len(alleles), (time.time() - start))) for (allele, sub_df) in df.groupby("allele"): for col in cols: result["%s %s" % (allele, col)] = ( sub_df[col].values.astype( constant_data['args'].result_dtype)) return results def do_predictions_mhcflurry(work_item_dicts, constant_data=None): """ Each dict of work items should have keys: work_item_num, peptides, alleles """ # This may run on the cluster in a way that misses all top level imports, # so we have to re-import everything here. import time from mhcflurry.encodable_sequences import EncodableSequences from mhcflurry import Class1AffinityPredictor if constant_data is None: constant_data = GLOBAL_DATA args = constant_data['args'] assert args.predictor == "mhcflurry" assert constant_data['cols'] == ["affinity"] predictor = Class1AffinityPredictor.load(args.mhcflurry_models_dir) results = [] for (i, d) in enumerate(work_item_dicts): work_item_num = d['work_item_num'] peptides = d['peptides'] alleles = d['alleles'] print("Processing work item", i + 1, "of", len(work_item_dicts)) result = {} results.append((work_item_num, result)) start = time.time() peptides = EncodableSequences.create(peptides) for (i, allele) in enumerate(alleles): print("Processing allele %d / %d: %0.2f sec elapsed" % ( i + 1, len(alleles), time.time() - start)) for col in ["affinity"]: result["%s %s" % (allele, col)] = predictor.predict( peptides=peptides, allele=allele, throw=False, model_kwargs={ 'batch_size': args.mhcflurry_batch_size, }).astype(constant_data['args'].result_dtype) print("Done predicting in", time.time() - start, "sec") return results if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/data_predictions/write_allele_list.py000066400000000000000000000027031525677230600272700ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ """ import sys import argparse import os import pandas import tqdm # progress bar tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "input", metavar="FILE.csv", help="CSV of annotated mass spec hits") parser.add_argument( "--out", metavar="OUT.txt", help="Out file path") def run(): args = parser.parse_args(sys.argv[1:]) df = pandas.read_csv(args.input) print("Read peptides", df.shape, *df.columns.tolist()) df = df.loc[df.mhc_class == "I"] hla_sets = df.hla.unique() all_hla = set() for hla_set in hla_sets: all_hla.update(hla_set.split()) all_hla = pandas.Series(sorted(all_hla)) all_hla.to_csv(args.out, index=False, header=False) print("Wrote [%d alleles]: %s" % (len(all_hla), os.path.abspath(args.out))) if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/data_predictions/write_proteome_peptides.py000066400000000000000000000103321525677230600305230ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ """ import sys import argparse import csv import os import pandas import tqdm # progress bar tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "input", metavar="FILE.csv", help="CSV of annotated mass spec hits") parser.add_argument( "reference_csv", metavar="FILE.csv", help="CSV of protein sequences") parser.add_argument( "--out", metavar="OUT.csv", help="Out file path") parser.add_argument( "--chromosome", metavar="CHR", nargs="+", help="Use only proteins from the specified chromosome(s)") parser.add_argument( "--debug-max-rows", metavar="N", type=int, default=None, help="Max rows to process. Useful for debugging. If specified an ipdb " "debugging session is also opened at the end of the script") parser.add_argument( "--lengths", metavar="N", type=int, nargs="+", default=[8,9,10,11], help="Peptide lengths") def run(): args = parser.parse_args(sys.argv[1:]) df_original = pandas.read_csv(args.input) df = df_original print("Read peptides", df.shape, *df.columns.tolist()) reference_df = pandas.read_csv(args.reference_csv, index_col=0) reference_df = reference_df.set_index("accession") print("Read proteins", reference_df.shape, *reference_df.columns.tolist()) print("Subselecting to MHC I hits. Before: ", len(df)) df = df.loc[df.mhc_class == "I"] print("After: ", len(df)) print("Subselecting to gene-associated hits. Before: ", len(df)) df = df.loc[~df.protein_ensembl_primary.isnull()] print("After: ", len(df)) if args.chromosome: print("Subselecting to chromosome(s): ", *args.chromosome) print("Before: ", len(df)) df = df.loc[df.protein_primary_ensembl_contig.isin(args.chromosome)] print("After: ", len(df)) (flanking_length,) = list( set(df.n_flank.str.len().unique()).union( set(df.n_flank.str.len().unique()))) print("Flanking length", flanking_length) proteins = df.protein_accession.unique() if args.debug_max_rows: proteins = proteins[:args.debug_max_rows] print("Writing decoys for %d proteins" % len(proteins)) reference_df = reference_df.loc[proteins] lengths = sorted(args.lengths) total = len(reference_df) with open(args.out, "w", newline="") as out_fd: writer = csv.writer(out_fd) writer.writerow([ "protein_accession", "peptide", "n_flank", "c_flank", "start_position", ]) for (accession, info) in tqdm.tqdm(reference_df.iterrows(), total=total): seq = info.seq for start in range(0, len(seq) - min(args.lengths)): for length in lengths: end_pos = start + length if end_pos > len(seq): break n_flank = seq[ max(start - flanking_length, 0) : start ].rjust(flanking_length, 'X') c_flank = seq[ end_pos : (end_pos + flanking_length) ].ljust(flanking_length, 'X') peptide = seq[start : start + length] writer.writerow(( accession, peptide, n_flank, c_flank, start )) print("Wrote: %s" % os.path.abspath(args.out)) if args.debug_max_rows: # Leave user in a debugger import ipdb ipdb.set_trace() if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/data_published/000077500000000000000000000000001525677230600226455ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/data_published/GENERATE.sh000077500000000000000000000145041525677230600244020ustar00rootroot00000000000000#!/bin/bash # # Download published non-IEDB MHC I ligand data. Most data has made its way into # IEDB but not all. Here we gather up the rest. # # set -e set -x DOWNLOAD_NAME=data_published SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") mkdir -p "$SCRATCH_DIR" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" # Send stdout and stderr to a logfile included with the archive. exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) date cd $SCRATCH_DIR/$DOWNLOAD_NAME ############################################ # BINDING AFFINITIES: class I ############################################ # # Kim et al 2014 [PMID 25017736] wget -q https://github.com/openvax/mhcflurry/releases/download/pre-1.1/bdata.2009.mhci.public.1.txt wget -q https://github.com/openvax/mhcflurry/releases/download/pre-1.1/bdata.20130222.mhci.public.1.txt wget -q https://github.com/openvax/mhcflurry/releases/download/pre-1.1/bdata.2013.mhci.public.blind.1.txt mkdir ms ############################################ # MS: Class I ############################################ # Bassani-Sternberg, ..., Gfeller PLOS Comp. Bio. 2017 [PMID 28832583] # The first dataset is from this work. The second dataset is originally from: # Pearson, ..., Perreault JCI 2016 [PMID 27841757] # but was reanalyzed in this work, and we download the reanalyzed version here. PMID=28832583 mkdir -p ms/$PMID wget -q https://doi.org/10.1371/journal.pcbi.1005725.s002 -P ms/$PMID # data generated in this work wget -q https://doi.org/10.1371/journal.pcbi.1005725.s003 -P ms/$PMID # data reanalyzed in this work cd ms/$PMID unzip *.s002 unzip *.s003 mkdir saved mv Dataset*/Dataset*.txt saved rm -rf Dataset* *.s002 *.s003 _* mv saved/* . rmdir saved cd ../.. # Bassani-Sternberg, ..., Mann Mol Cell Proteomics 2015 [PMID 25576301] PMID=25576301 mkdir -p ms/$PMID wget -q https://www.mcponline.org/highwire/filestream/35026/field_highwire_adjunct_files/7/mcp.M114.042812-4.xlsx -P ms/$PMID # Mommen, ..., Heck PNAS 2014 [PMID 24616531] PMID=24616531 mkdir -p ms/$PMID wget -q https://www.pnas.org/highwire/filestream/615485/field_highwire_adjunct_files/1/sd01.xlsx -P ms/$PMID # Gloger, ..., Neri Cancer Immunol Immunother 2016 [PMID 27600516] # Data extracted from supplemental PDF table. PMID=27600516 mkdir -p ms/$PMID wget -q https://github.com/openvax/mhcflurry/releases/download/pan-dev1/27600516.peptides.csv -P ms/$PMID # Ritz, ..., Fugmann Proteomics 2016 [PMID 26992070] # Supplemental zip downloaded from publication PMID=26992070 mkdir -p ms/$PMID wget -q https://github.com/openvax/mhcflurry/releases/download/pan-dev1/pmic12297-sup-0001-supinfo.zip -P ms/$PMID cd ms/$PMID unzip pmic12297-sup-0001-supinfo.zip cd ../.. # Shraibman, ..., Admon Mol Cell Proteomics 2016 [PMID 27412690] PMID=27412690 mkdir -p ms/$PMID wget -q https://www.mcponline.org/lookup/suppl/doi:10.1074/mcp.M116.060350/-/DC1/mcp.M116.060350-2.xlsx -P ms/$PMID # Pearson, ..., Perreault J Clin Invest 2016 [PMID 27841757] # Note: we do not use the original data from this publicaton, we use 28832583's reanalysis of it. # # Hassan, ..., van Veelen Mol Cell Proteomics 2015 [PMID 23481700] PMID=23481700 mkdir -p ms/$PMID wget -q https://www.mcponline.org/highwire/filestream/34681/field_highwire_adjunct_files/1/mcp.M112.024810-2.xls -P ms/$PMID # Shraibman, ..., Admon Mol Cell Proteomics 2019 [PMID 31154438] PMID=31154438 mkdir -p ms/$PMID wget -q https://www.mcponline.org/highwire/filestream/51948/field_highwire_adjunct_files/3/zjw006195963st2.txt -P ms/$PMID wget -q https://www.mcponline.org/highwire/filestream/51948/field_highwire_adjunct_files/1/zjw006195963st1.xlsx -P ms/$PMID # Bassani-Sternberg, ..., Krackhardt Nature Comm. 2016 [PMID 27869121] PMID=27869121 mkdir -p ms/$PMID wget -q "https://static-content.springer.com/esm/art%3A10.1038%2Fncomms13404/MediaObjects/41467_2016_BFncomms13404_MOESM1318_ESM.xlsx" -P ms/$PMID # Sarkizova, ..., Keskin Nature Biotechnology 2019 [PMID 31844290] PMID=31844290 mkdir -p ms/$PMID # Monoallelic: wget -q "https://static-content.springer.com/esm/art%3A10.1038%2Fs41587-019-0322-9/MediaObjects/41587_2019_322_MOESM3_ESM.xlsx" -P ms/$PMID # Multiallelic: wget -q "https://static-content.springer.com/esm/art%3A10.1038%2Fs41587-019-0322-9/MediaObjects/41587_2019_322_MOESM4_ESM.xlsx" -P ms/$PMID ############################################ # MS: Class II ############################################ # Abelin, ..., Rooney Immunity 2019 [PMID 31495665] PMID=31495665 mkdir -p ms/$PMID wget -q https://ars.els-cdn.com/content/image/1-s2.0-S1074761319303632-mmc2.xlsx -P ms/$PMID ############################################ # RNA-seq expression data (TPMs) ############################################ # CCLE as processed by expression atlas DATASET=expression-atlas-22460905 mkdir -p expression/$DATASET wget -q https://www.ebi.ac.uk/gxa/experiments-content/E-MTAB-2770/resources/ExperimentDownloadSupplier.RnaSeqBaseline/tpms.tsv -P expression/$DATASET # Human protein atlas DATASET=human-protein-atlas mkdir -p expression/$DATASET cd expression/$DATASET wget -q https://www.proteinatlas.org/download/rna_celline.tsv.zip wget -q https://www.proteinatlas.org/download/rna_blood_cell_sample_tpm_m.tsv.zip wget -q https://www.proteinatlas.org/download/rna_tissue_gtex.tsv.zip for i in $(ls *.zip) do unzip $i rm $i done cd ../.. # Melanoma. Original publication # Barry, ..., Krummel Nature Medicine 2018 [PMID 29942093]. DATASET=GSE113126 mkdir -p expression/$DATASET cd expression/$DATASET wget -q "https://www.ncbi.nlm.nih.gov/geo/download/?acc=GSE113126&format=file" -O GSE113126_RAW.tar tar -xvf GSE113126_RAW.tar rm GSE113126_RAW.tar cd ../.. ############################################ # T cell epitopes: class I ############################################ # # Koşaloğlu-Yalçın, ..., Peters. Oncoimmunology 2018 [PMID 30377561] # PMID=30377561 mkdir -p epitopes/$PMID wget -q https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6204999/bin/koni-07-11-1492508-s001.zip -P epitopes/$PMID cd epitopes/$PMID unzip *.zip rm -f *.jpg cd ../.. cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.$(date +%Y%m%d).tar.bz2" tar -cjf "$RESULT" * echo "Created archive: $RESULT" mhcflurry-2.3.6/downloads-generation/data_published/README.md000066400000000000000000000014141525677230600241240ustar00rootroot00000000000000# Published datasets These datasets are derived from publications and do not change. To generate this download run: ``` ./GENERATE.sh ``` This download contains the BD2009, BD2013, and BLIND datasets from [Dataset size and composition impact the reliability of performance benchmarks for peptide-MHC binding predictions](http://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-15-241). Historical MHCflurry recipes used BD2013 with additional IEDB data for training and BD2009/BLIND for validation. Those names alone do not establish independence from a current model: audit overlap against every compared model before using any of these datasets as a held-out benchmark. The other published data sets correspond to the publications indicated in GENERATE.sh. mhcflurry-2.3.6/downloads-generation/data_references/000077500000000000000000000000001525677230600230075ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/data_references/GENERATE.sh000077500000000000000000000041621525677230600245430ustar00rootroot00000000000000#!/bin/bash # # # set -e set -x DOWNLOAD_NAME=data_references SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") mkdir -p "$SCRATCH_DIR" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" # Send stdout and stderr to a logfile included with the archive. exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) date cd $SCRATCH_DIR/$DOWNLOAD_NAME cp $SCRIPT_DIR/process.py . ############################################ # UNIPROT ############################################ # wget -q ftp://ftp.uniprot.org/pub/databases/uniprot/current_release/knowledgebase/reference_proteomes/Eukaryota/UP000005640_9606.fasta.gz wget -q ftp://ftp.uniprot.org/pub/databases/uniprot/current_release/knowledgebase/reference_proteomes/Eukaryota/UP000005640_9606.gene2acc.gz wget -q ftp://ftp.uniprot.org/pub/databases/uniprot/current_release/knowledgebase/reference_proteomes/Eukaryota/UP000005640_9606.idmapping.gz wget -q ftp://ftp.uniprot.org/pub/databases/uniprot/current_release/knowledgebase/reference_proteomes/Eukaryota/UP000005640_9606_DNA.fasta.gz wget -q ftp://ftp.uniprot.org/pub/databases/uniprot/current_release/knowledgebase/reference_proteomes/Eukaryota/UP000005640_9606_DNA.miss.gz wget -q ftp://ftp.uniprot.org/pub/databases/uniprot/current_release/knowledgebase/reference_proteomes/Eukaryota/UP000005640_9606_additional.fasta.gz wget -q ftp://ftp.ensembl.org/pub/release-98/gtf/homo_sapiens/Homo_sapiens.GRCh38.98.gtf.gz python process.py \ UP000005640_9606.fasta.gz UP000005640_9606_additional.fasta.gz \ --id-mapping UP000005640_9606.idmapping.gz \ --ensembl-gtf Homo_sapiens.GRCh38.98.gtf.gz \ --out-csv uniprot_proteins.csv \ --out-index uniprot_proteins.fm ls -lh uniprot_proteins.csv uniprot_proteins.fm bzip2 uniprot_proteins.csv cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.$(date +%Y%m%d).tar.bz2" tar -cjf "$RESULT" * echo "Created archive: $RESULT" mhcflurry-2.3.6/downloads-generation/data_references/README.md000066400000000000000000000004611525677230600242670ustar00rootroot00000000000000# Reference data (historical generator) This directory contains the recipe for historical reference-protein archives. Prediction users can install the published bundle with `mhcflurry downloads fetch data_references`. Inspect its source URLs and snapshot with `mhcflurry downloads info data_references`. mhcflurry-2.3.6/downloads-generation/data_references/process.py000077500000000000000000000072451525677230600250520ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ """ import sys import argparse import os import gzip import pandas import gtfparse import shellinford from Bio import SeqIO parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "input_paths", nargs="+", help="Fasta files to process") parser.add_argument( "--out-csv", required=True, metavar="FILE.csv", help="CSV output") parser.add_argument( "--out-index", required=True, metavar="FILE.fm", help="Index output") parser.add_argument( "--id-mapping", required=True, metavar="FILE.idmapping.gz", help="Uniprot mapping file") parser.add_argument( "--ensembl-gtf", required=True, metavar="FILE.gtf.gz", help="Ensembl GTF file") def run(): args = parser.parse_args(sys.argv[1:]) fm = shellinford.FMIndex() df = [] for f in args.input_paths: print("Processing", f) with gzip.open(f, "rt") as fd: records = SeqIO.parse(fd, format='fasta') for (i, record) in enumerate(records): seq = str(record.seq).upper() df.append((record.name, record.description, seq)) fm.push_back("$" + seq + "$") # include sentinels df = pandas.DataFrame(df, columns=["name", "description", "seq"]) print("Done reading fastas") print(df) pieces = df.name.str.split("|") df["db"] = pieces.str.get(0) df["accession"] = pieces.str.get(1) df["entry"] = pieces.str.get(2) print("Annotating using mapping", args.id_mapping) mapping_df = pandas.read_csv( args.id_mapping, sep="\t", header=None) mapping_df.columns = ['accession', 'key', 'value'] for item in ["Ensembl", "Ensembl_TRS", "Gene_Name"]: accession_to_values = mapping_df.loc[ mapping_df.key == item ].groupby("accession").value.unique().map(" ".join) df[item.lower()] = df.accession.map(accession_to_values) print("Annotating using gtf", args.ensembl_gtf) gtf_df = gtfparse.read_gtf(args.ensembl_gtf) matching_ensembl_genes = set(gtf_df.gene_id.unique()) ensembl_primary = [] for ensembls in df.ensembl.fillna("").str.split(): result = "" for item in ensembls: if item in matching_ensembl_genes: result = item break ensembl_primary.append(result) df["ensembl_primary"] = ensembl_primary print("Fraction of records with matching ensembl genes", ( df.ensembl_primary != "").mean()) gene_records = gtf_df.loc[gtf_df.feature == "gene"].set_index("gene_id") df["primary_ensembl_contig"] = df.ensembl_primary.map(gene_records.seqname) df["primary_ensembl_start"] = df.ensembl_primary.map(gene_records.start) df["primary_ensembl_end"] = df.ensembl_primary.map(gene_records.end) df["primary_ensembl_strand"] = df.ensembl_primary.map(gene_records.strand) print("Done annotating") print(df) df.to_csv(args.out_csv, index=True) print("Wrote: ", os.path.abspath((args.out_csv))) print("Building index") fm.build() fm.write(args.out_index) print("Wrote: ", os.path.abspath((args.out_index))) if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/data_references/requirements.txt000066400000000000000000000000401525677230600262650ustar00rootroot00000000000000shellinford biopython gtfparse mhcflurry-2.3.6/downloads-generation/data_systemhcatlas/000077500000000000000000000000001525677230600235525ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/data_systemhcatlas/GENERATE.sh000077500000000000000000000022531525677230600253050ustar00rootroot00000000000000#!/bin/bash # # Download some published MHC I ligands identified by mass-spec # # set -e set -x DOWNLOAD_NAME=data_systemhcatlas SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" mkdir -p "$SCRATCH_DIR" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" # Send stdout and stderr to a logfile included with the archive. exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) # Log some environment info date pip freeze # git rev-parse HEAD git status cd $SCRATCH_DIR/$DOWNLOAD_NAME wget -q https://systemhcatlas.org/Builds_for_download/180409_master_final.tgz mkdir extracted tar -xvzf *.tgz -C extracted wc -l extracted/*/*.csv # Write header line cat extracted/*/*.csv | head -n 1 > data.csv # Write concatenated data grep -v SysteMHC_ID extracted/*/*.csv >> data.csv # Cleanup rm -rf extracted *.tgz ls -lh data.csv wc -l data.csv bzip2 data.csv cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt tar -cjf "../${DOWNLOAD_NAME}.tar.bz2" * echo "Created archive: $SCRATCH_DIR/$DOWNLOAD_NAME.tar.bz2" mhcflurry-2.3.6/downloads-generation/data_systemhcatlas/README.md000066400000000000000000000004361525677230600250340ustar00rootroot00000000000000# SysteMHC database dump This is a database export of the [SysteMHC Atlas](https://systemhcatlas.org/) downloaded from [here](https://systemhcatlas.org/Builds_for_download/). It is distributed under the ODC Open Database License. To generate this download run: ``` ./GENERATE.sh ``` mhcflurry-2.3.6/downloads-generation/models_class1/000077500000000000000000000000001525677230600224265ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1/GENERATE.sh000077500000000000000000000042441525677230600241630ustar00rootroot00000000000000#!/bin/bash # # Model select standard MHCflurry Class I models. # set -e set -x DOWNLOAD_NAME=models_class1 SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") mkdir -p "$SCRATCH_DIR" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" # Send stdout and stderr to a logfile included with the archive. exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) # Log some environment info date pip freeze git status cd $SCRATCH_DIR/$DOWNLOAD_NAME cp $SCRIPT_DIR/write_validation_data.py . mkdir models GPUS=$(nvidia-smi -L 2> /dev/null | wc -l) || GPUS=0 echo "Detected GPUS: $GPUS" PROCESSORS=$(getconf _NPROCESSORS_ONLN) echo "Detected processors: $PROCESSORS" python ./write_validation_data.py \ --include "$(mhcflurry-downloads path data_curated)/curated_training_data.with_mass_spec.csv.bz2" \ --exclude "$(mhcflurry-downloads path models_class1_unselected)/models/train_data.csv.bz2" \ --only-alleles-present-in-exclude \ --out-data test.csv \ --out-summary test.summary.csv wc -l test.csv time mhcflurry-class1-select-allele-specific-models \ --data test.csv \ --models-dir "$(mhcflurry-downloads path models_class1_unselected)/models" \ --out-models-dir models \ --scoring combined:mass-spec,mse,consensus \ --consensus-num-peptides-per-length 10000 \ --combined-min-models 8 \ --combined-max-models 16 \ --unselected-accuracy-scorer combined:mass-spec,mse \ --unselected-accuracy-percentile-threshold 95 \ --mass-spec-min-measurements 500 \ --num-jobs $(expr $PROCESSORS \* 2) --gpus $GPUS --max-workers-per-gpu 2 --max-tasks-per-worker 1 time mhcflurry-calibrate-percentile-ranks \ --models-dir models \ --num-peptides-per-length 100000 \ --num-jobs $(expr $PROCESSORS \* 2) --gpus $GPUS --max-workers-per-gpu 2 --max-tasks-per-worker 50 cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt tar -cjf "../${DOWNLOAD_NAME}.tar.bz2" * echo "Created archive: $SCRATCH_DIR/$DOWNLOAD_NAME.tar.bz2" mhcflurry-2.3.6/downloads-generation/models_class1/README.md000066400000000000000000000002401525677230600237010ustar00rootroot00000000000000# Class I allele-specific models (ensemble) This download contains trained MHC Class I MHCflurry models. To generate this download run: ``` ./GENERATE.sh ```mhcflurry-2.3.6/downloads-generation/models_class1/write_validation_data.py000066400000000000000000000072611525677230600273430ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Write and summarize model validation data, which is obtained by taking a full dataset and removing the data used for training. """ import argparse import sys from os.path import abspath import pandas import numpy from sklearn.model_selection import StratifiedKFold parser = argparse.ArgumentParser(usage = __doc__) parser.add_argument( "--include", metavar="INPUT.csv", nargs="+", help="Input CSV to include") parser.add_argument( "--exclude", metavar="INPUT.csv", nargs="+", help="Input CSV to exclude") parser.add_argument( "--out-data", metavar="RESULT.csv", help="Output dadta CSV") parser.add_argument( "--out-summary", metavar="RESULT.csv", help="Output summary CSV") parser.add_argument( "--mass-spec-regex", metavar="REGEX", default="mass[- ]spec", help="Regular expression for mass-spec data. Runs on measurement_source col." "Default: %(default)s.") parser.add_argument( "--only-alleles-present-in-exclude", action="store_true", default=False, help="Filter to only alleles that are present in files given by --exclude. " "Useful for filtering to only alleles supported by a predictor, where the " "training data for the predictor is given by --exclude.") def run(argv): args = parser.parse_args(argv) dfs = [] for input in args.include: df = pandas.read_csv(input) dfs.append(df) df = pandas.concat(dfs, ignore_index=True) print("Loaded data with shape: %s" % str(df.shape)) del dfs df = df.ix[ (df.peptide.str.len() >= 8) & (df.peptide.str.len() <= 15) ] print("Subselected to 8-15mers: %s" % (str(df.shape))) if args.exclude: exclude_dfs = [] for exclude in args.exclude: exclude_df = pandas.read_csv(exclude) exclude_dfs.append(exclude_df) exclude_df = pandas.concat(exclude_dfs, ignore_index=True) del exclude_dfs df["_key"] = df.allele + "__" + df.peptide exclude_df["_key"] = exclude_df.allele + "__" + exclude_df.peptide df["_excluded"] = df._key.isin(exclude_df._key.unique()) print("Excluding measurements per allele (counts): ") print(df.groupby("allele")._excluded.sum()) print("Excluding measurements per allele (fractions): ") print(df.groupby("allele")._excluded.mean()) df = df.loc[~df._excluded] del df["_excluded"] del df["_key"] if args.only_alleles_present_in_exclude: df = df.loc[df.allele.isin(exclude_df.allele.unique())] df["mass_spec"] = df.measurement_source.str.contains(args.mass_spec_regex) df.loc[df.mass_spec , "measurement_inequality"] = "mass_spec" if args.out_summary: summary_df = df.groupby( ["allele", "measurement_inequality"] )["measurement_value"].count().unstack().fillna(0).astype(int) summary_df["total"] = summary_df.sum(1) summary_df.to_csv(args.out_summary) print("Wrote: %s" % args.out_summary) if args.out_data: df.to_csv(args.out_data, index=False) print("Wrote: %s" % args.out_data) if __name__ == '__main__': run(sys.argv[1:]) mhcflurry-2.3.6/downloads-generation/models_class1_kim_benchmark/000077500000000000000000000000001525677230600253005ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_kim_benchmark/GENERATE.sh000077500000000000000000000056451525677230600270430ustar00rootroot00000000000000#!/bin/bash # set -x DOWNLOAD_NAME=models_class1_kim_benchmark SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") export PYTHONUNBUFFERED=1 pseudosequence_lookup() { python -c 'from mhcflurry.pseudosequences import main; main()' "$@" } mkdir -p "$SCRATCH_DIR" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" # Send stdout and stderr to a logfile included with the archive. exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) # Log some environment info date pip freeze git status cd $SCRATCH_DIR/$DOWNLOAD_NAME cp $SCRIPT_DIR/curate.py . cp $SCRIPT_DIR/write_validation_data.py . time python curate.py \ --data-kim2014 \ "$(mhcflurry-downloads path data_published)/bdata.2009.mhci.public.1.txt" \ --out-csv train.csv bzip2 train.csv mkdir models PSEUDOSEQUENCES="$(pseudosequence_lookup filename --length 34)" LEGACY_CLASS1_PSEUDOSEQUENCES="$(pseudosequence_lookup legacy class1_pseudosequences)" cp "$SCRIPT_DIR/$PSEUDOSEQUENCES" . # Compatibility alias for older generated artifacts and external scripts. cp "$SCRIPT_DIR/$PSEUDOSEQUENCES" "$LEGACY_CLASS1_PSEUDOSEQUENCES" python $SCRIPT_DIR/generate_hyperparameters.py > hyperparameters.yaml GPUS=$(nvidia-smi -L 2> /dev/null | wc -l) || GPUS=0 echo "Detected GPUS: $GPUS" PROCESSORS=$(getconf _NPROCESSORS_ONLN) echo "Detected processors: $PROCESSORS" time mhcflurry-class1-train-allele-specific-models \ --data "train.csv.bz2" \ --allele-sequences "$PSEUDOSEQUENCES" \ --hyperparameters hyperparameters.yaml \ --out-models-dir models \ --held-out-fraction-reciprocal 10 \ --min-measurements-per-allele 20 \ --num-jobs $(expr $PROCESSORS \* 2) --gpus $GPUS --max-workers-per-gpu 2 --max-tasks-per-worker 50 time python ./write_validation_data.py \ --include "train.csv.bz2" \ --exclude "models/train_data.csv.bz2" \ --only-alleles-present-in-exclude \ --out-data test.csv \ --out-summary test.summary.csv wc -l test.csv mkdir selected-models time mhcflurry-class1-select-allele-specific-models \ --data test.csv \ --models-dir models \ --out-models-dir selected-models \ --scoring combined:mse,consensus \ --consensus-num-peptides-per-length 10000 \ --combined-min-models 8 \ --combined-max-models 16 \ --num-jobs $(expr $PROCESSORS \* 2) --gpus $GPUS --max-workers-per-gpu 2 --max-tasks-per-worker 5 time mhcflurry-calibrate-percentile-ranks \ --models-dir selected-models \ --num-peptides-per-length 100000 \ --num-jobs $(expr $PROCESSORS \* 2) --gpus $GPUS --max-workers-per-gpu 2 --max-tasks-per-worker 50 cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt tar -cjf "../${DOWNLOAD_NAME}.tar.bz2" * echo "Created archive: $SCRATCH_DIR/$DOWNLOAD_NAME.tar.bz2" mhcflurry-2.3.6/downloads-generation/models_class1_kim_benchmark/README.md000066400000000000000000000011361525677230600265600ustar00rootroot00000000000000# Kim benchmark This download trains MHCflurry predictors using the BD2009 dataset from [Dataset size and composition impact the reliability of performance benchmarks for peptide-MHC binding predictions](http://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-15-241). The trained predictor can be evaluated on the BLIND test set from this publication. We include this download as a resource for others wishing to benchmark new binding predictors. It's also a working example of a complete MHCflurry training and model selection run on a simple dataset. See [GENERATE.sh](./GENERATE.sh). mhcflurry-2.3.6/downloads-generation/models_class1_kim_benchmark/curate.py000077500000000000000000000236421525677230600271470ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Filter and combine various peptide/MHC datasets to derive a composite training set, optionally including eluted peptides identified by mass-spec. """ import sys import argparse import pandas from mhcflurry.common import normalize_allele_name def normalize_allele_name_or_return_unknown(s): result = normalize_allele_name( s, raise_on_error=False, default_value="UNKNOWN") parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "--data-kim2014", action="append", default=[], help="Path to Kim 2014-style affinity data") parser.add_argument( "--data-iedb", action="append", default=[], help="Path to IEDB-style affinity data (e.g. mhc_ligand_full.csv)") parser.add_argument( "--data-systemhc-atlas", action="append", default=[], help="Path to systemhc-atlas-style mass-spec data") parser.add_argument( "--data-abelin-mass-spec", action="append", default=[], help="Path to Abelin Immunity 2017 mass-spec hits") parser.add_argument( "--include-iedb-mass-spec", action="store_true", default=False, help="Include mass-spec observations in IEDB") parser.add_argument( "--out-csv", required=True, help="Result file") QUALITATIVE_TO_AFFINITY_AND_INEQUALITY = { "Negative": (5000.0, ">"), "Positive": (500.0, "<"), # used for mass-spec hits "Positive-High": (100.0, "<"), "Positive-Intermediate": (1000.0, "<"), "Positive-Low": (5000.0, "<"), } QUALITATIVE_TO_AFFINITY = dict( (key, value[0]) for (key, value) in QUALITATIVE_TO_AFFINITY_AND_INEQUALITY.items()) QUALITATIVE_TO_INEQUALITY = dict( (key, value[1]) for (key, value) in QUALITATIVE_TO_AFFINITY_AND_INEQUALITY.items()) EXCLUDE_IEDB_ALLELES = [ "HLA class I", "HLA class II", ] def load_data_kim2014(filename): df = pandas.read_table(filename) print("Loaded kim2014 data: %s" % str(df.shape)) df["measurement_source"] = "kim2014" df["measurement_value"] = df.meas df["measurement_type"] = (df.inequality == "=").map({ True: "quantitative", False: "qualitative", }) df["measurement_inequality"] = df.inequality df["original_allele"] = df.mhc df["peptide"] = df.sequence df["allele"] = df.mhc.map(normalize_allele_name_or_return_unknown) print("Dropping un-parseable alleles: %s" % ", ".join( df.ix[df.allele == "UNKNOWN"]["mhc"].unique())) df = df.ix[df.allele != "UNKNOWN"] print("Loaded kim2014 data: %s" % str(df.shape)) return df def load_data_systemhc_atlas(filename, min_probability=0.99): df = pandas.read_csv(filename) print("Loaded systemhc atlas data: %s" % str(df.shape)) df["measurement_source"] = "systemhc-atlas" df["measurement_value"] = QUALITATIVE_TO_AFFINITY["Positive"] df["measurement_inequality"] = "<" df["measurement_type"] = "qualitative" df["original_allele"] = df.top_allele df["peptide"] = df.search_hit df["allele"] = df.top_allele.map(normalize_allele_name_or_return_unknown) print("Dropping un-parseable alleles: %s" % ", ".join( str(x) for x in df.ix[df.allele == "UNKNOWN"]["top_allele"].unique())) df = df.loc[df.allele != "UNKNOWN"] print("Systemhc atlas data now: %s" % str(df.shape)) print("Dropping data points with probability < %f" % min_probability) df = df.loc[df.prob >= min_probability] print("Systemhc atlas data now: %s" % str(df.shape)) print("Removing duplicates") df = df.drop_duplicates(["allele", "peptide"]) print("Systemhc atlas data now: %s" % str(df.shape)) return df def load_data_abelin_mass_spec(filename): df = pandas.read_csv(filename) print("Loaded Abelin mass-spec data: %s" % str(df.shape)) df["measurement_source"] = "abelin-mass-spec" df["measurement_value"] = QUALITATIVE_TO_AFFINITY["Positive"] df["measurement_inequality"] = "<" df["measurement_type"] = "qualitative" df["original_allele"] = df.allele df["allele"] = df.original_allele.map(normalize_allele_name_or_return_unknown) print("Dropping un-parseable alleles: %s" % ", ".join( str(x) for x in df.ix[df.allele == "UNKNOWN"]["allele"].unique())) df = df.loc[df.allele != "UNKNOWN"] print("Abelin mass-spec data now: %s" % str(df.shape)) print("Removing duplicates") df = df.drop_duplicates(["allele", "peptide"]) print("Abelin mass-spec data now: %s" % str(df.shape)) return df def load_data_iedb(iedb_csv, include_qualitative=True, include_mass_spec=False): iedb_df = pandas.read_csv(iedb_csv, skiprows=1, low_memory=False) print("Loaded iedb data: %s" % str(iedb_df.shape)) print("Selecting only class I") iedb_df = iedb_df.ix[ iedb_df["MHC allele class"].str.strip().str.upper() == "I" ] print("New shape: %s" % str(iedb_df.shape)) print("Dropping known unusuable alleles") iedb_df = iedb_df.ix[ ~iedb_df["Allele Name"].isin(EXCLUDE_IEDB_ALLELES) ] iedb_df = iedb_df.ix[ (~iedb_df["Allele Name"].str.contains("mutant")) & (~iedb_df["Allele Name"].str.contains("CD1")) ] iedb_df["allele"] = iedb_df["Allele Name"].map(normalize_allele_name_or_return_unknown) print("Dropping un-parseable alleles: %s" % ", ".join( iedb_df.ix[iedb_df.allele == "UNKNOWN"]["Allele Name"].unique())) iedb_df = iedb_df.ix[iedb_df.allele != "UNKNOWN"] print("IEDB measurements per allele:\n%s" % iedb_df.allele.value_counts()) quantitative = iedb_df.ix[iedb_df["Units"] == "nM"].copy() quantitative["measurement_type"] = "quantitative" quantitative["measurement_inequality"] = "=" print("Quantitative measurements: %d" % len(quantitative)) qualitative = iedb_df.ix[iedb_df["Units"] != "nM"].copy() qualitative["measurement_type"] = "qualitative" print("Qualitative measurements: %d" % len(qualitative)) if not include_mass_spec: qualitative = qualitative.ix[ (~qualitative["Method/Technique"].str.contains("mass spec")) ].copy() qualitative["Quantitative measurement"] = ( qualitative["Qualitative Measure"].map(QUALITATIVE_TO_AFFINITY)) qualitative["measurement_inequality"] = ( qualitative["Qualitative Measure"].map(QUALITATIVE_TO_INEQUALITY)) print("Qualitative measurements (possibly after dropping MS): %d" % ( len(qualitative))) iedb_df = pandas.concat( ( ([quantitative]) + ([qualitative] if include_qualitative else [])), ignore_index=True) print("IEDB measurements per allele:\n%s" % iedb_df.allele.value_counts()) print("Subselecting to valid peptides. Starting with: %d" % len(iedb_df)) iedb_df["Description"] = iedb_df.Description.str.strip() iedb_df = iedb_df.ix[ iedb_df.Description.str.match("^[ACDEFGHIKLMNPQRSTVWY]+$") ] print("Now: %d" % len(iedb_df)) print("Annotating last author and category") iedb_df["last_author"] = iedb_df.Authors.map( lambda x: ( x.split(";")[-1] .split(",")[-1] .split(" ")[-1] .strip() .replace("*", ""))).values iedb_df["category"] = ( iedb_df["last_author"] + " - " + iedb_df["Method/Technique"]).values train_data = pandas.DataFrame() train_data["peptide"] = iedb_df.Description.values train_data["measurement_value"] = iedb_df[ "Quantitative measurement" ].values train_data["measurement_source"] = iedb_df.category.values train_data["measurement_inequality"] = iedb_df.measurement_inequality.values train_data["allele"] = iedb_df["allele"].values train_data["original_allele"] = iedb_df["Allele Name"].values train_data["measurement_type"] = iedb_df["measurement_type"].values train_data = train_data.drop_duplicates().reset_index(drop=True) return train_data def run(): args = parser.parse_args(sys.argv[1:]) dfs = [] for filename in args.data_iedb: df = load_data_iedb(filename, include_mass_spec=args.include_iedb_mass_spec) dfs.append(df) for filename in args.data_kim2014: df = load_data_kim2014(filename) df["allele_peptide"] = df.allele + "_" + df.peptide # Give precedence to IEDB data. if dfs: iedb_df = dfs[0] iedb_df["allele_peptide"] = iedb_df.allele + "_" + iedb_df.peptide print("Dropping kim2014 data present in IEDB.") df = df.ix[ ~df.allele_peptide.isin(iedb_df.allele_peptide) ] print("Kim2014 data now: %s" % str(df.shape)) dfs.append(df) for filename in args.data_systemhc_atlas: df = load_data_systemhc_atlas(filename) dfs.append(df) for filename in args.data_abelin_mass_spec: df = load_data_abelin_mass_spec(filename) dfs.append(df) df = pandas.concat(dfs, ignore_index=True) print("Combined df: %s" % (str(df.shape))) print("Removing combined duplicates") df = df.drop_duplicates(["allele", "peptide", "measurement_value"]) print("New combined df: %s" % (str(df.shape))) df = df[[ "allele", "peptide", "measurement_value", "measurement_inequality", "measurement_type", "measurement_source", "original_allele", ]].sort_values(["allele", "peptide"]).dropna() print("Final combined df: %s" % (str(df.shape))) df.to_csv(args.out_csv, index=False) print("Wrote: %s" % args.out_csv) if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/models_class1_kim_benchmark/generate_hyperparameters.py000066400000000000000000000070431525677230600327430ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Generate grid of hyperparameters """ from sys import stdout from copy import deepcopy from yaml import dump base_hyperparameters = { ########################################## # ENSEMBLE SIZE ########################################## "n_models": 4, ########################################## # OPTIMIZATION ########################################## "max_epochs": 500, "patience": 20, "early_stopping": True, "validation_split": 0.1, "minibatch_size": None, "loss": "custom:mse_with_inequalities", ########################################## # RANDOM NEGATIVE PEPTIDES ########################################## "random_negative_rate": 0.0, "random_negative_constant": 25, "random_negative_affinity_min": 20000.0, "random_negative_affinity_max": 50000.0, ########################################## # PEPTIDE REPRESENTATION ########################################## # One of "one-hot", "embedding", or "BLOSUM62". "peptide_amino_acid_encoding": "BLOSUM62", "use_embedding": False, # maintained for backward compatability "embedding_output_dim": 8, # only used if using embedding "kmer_size": 15, ########################################## # NEURAL NETWORK ARCHITECTURE ########################################## "locally_connected_layers": [ { "filters": 8, "activation": "tanh", "kernel_size": 3 } ], "activation": "tanh", "output_activation": "sigmoid", "layer_sizes": [16], "dense_layer_l1_regularization": None, "batch_normalization": False, "dropout_probability": 0.0, ########################################## # TRAINING Data ########################################## "train_data": {"subset": "all", "pretrain_min_points": 1000}, } grid = [] for train_subset in ["all", "quantitative"]: for minibatch_size in [128]: for dense_layer_size in [8, 16, 32, 64]: for l1 in [0.0, 0.001]: for num_lc in [0, 1, 2]: for lc_kernel_size in [3, 5]: new = deepcopy(base_hyperparameters) new["minibatch_size"] = minibatch_size new["train_data"]["subset"] = train_subset new["layer_sizes"] = [dense_layer_size] new["dense_layer_l1_regularization"] = l1 (lc_layer,) = new["locally_connected_layers"] lc_layer['kernel_size'] = lc_kernel_size if num_lc == 0: new["locally_connected_layers"] = [] elif num_lc == 1: new["locally_connected_layers"] = [lc_layer] elif num_lc == 2: new["locally_connected_layers"] = [lc_layer, deepcopy(lc_layer)] if not grid or new not in grid: grid.append(new) dump(grid, stdout) mhcflurry-2.3.6/downloads-generation/models_class1_kim_benchmark/pseudosequences.netmhcpan.34aa.csv000066400000000000000000004144141525677230600337430ustar00rootroot00000000000000allele,pseudosequence HLA-A*01:01,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:02,YSAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:03,YFAMYQENMAHTDANTLYIMYRDYTWVARVYRGY HLA-A*01:06,YFAMYQENMAHTDANTLYIIYRDYTWVALAYRGY HLA-A*01:07,YFAMYQENVAHTDENTLYIIYRDYTWVARVYRGY HLA-A*01:08,YFAMYQENMAHTDANTLYIIYRDYTWVARVYWGY HLA-A*01:09,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:10,YFAMYQENMAHTDANTLYIIYRDYTWARRVYRGY HLA-A*01:12,YFAMYQENMAHTDANTLYIIYRDYTWAVQAYTGY HLA-A*01:13,YFAMYQENMAQTDVDTLYIIYRDYTWVARVYRGY HLA-A*01:14,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTGY HLA-A*01:17,YFAMYQENMAQTDANTLYIIYRDYTWVARVYRGY HLA-A*01:19,YFAMYQENMAHTDANTLYIIYRDYTWAVQAYTGY HLA-A*01:20,YSAMYQENMAHTDANTLYVRYRDYTWVARVYRGY HLA-A*01:21,YFAMYQENMAHTDANTLYIIYRDYTWAVRVYRGY HLA-A*01:23,YFAMYQENVAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:24,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:25,YFAMYQENMAHTDANTLYIIYRDYTWVAQVYRGY HLA-A*01:26,YFAMYQENMAHTDANTLYIIYRDYTWAARVYRGY HLA-A*01:28,YFAMYQENMAHTDVDTLYIIYRDYTWVARVYRGY HLA-A*01:29,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:30,YFAMYQENMAHTDANTLYIIYHYYTWVARVYRGY HLA-A*01:32,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:33,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:35,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:36,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:37,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:38,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:39,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:40,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:41,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:42,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:43,YYAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:44,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:45,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:46,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:47,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:48,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:49,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:50,YFAMYQENMAHTDANTLYIIYREYTWVARVYRGY HLA-A*01:51,YFAMYRNNVAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:54,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:55,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:58,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:59,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:60,YFAMYPENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:61,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:62,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:63,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:64,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:65,YFAMYQENMAHTDANTLYIIYRDYTWVARVCRGY HLA-A*01:66,YFAMYQENMAHTDANTLYVRYRDYTWVARVYRGY HLA-A*02:01,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:02,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:03,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A*02:04,YFAMYGEKVAHTHVDTLYVMYHYYTWAVLAYTWY HLA-A*02:05,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:06,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:07,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:08,YYAMYGENVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:09,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:10,YYAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A*02:11,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:12,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY HLA-A*02:13,YFAMYGEKVAHTHVDTLYVRYHYYTWAEQAYTWY HLA-A*02:14,YYAMYGEKVAHTHVDTLYLRYHYYTWAVLAYTWY HLA-A*02:16,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYEWY HLA-A*02:17,YFAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A*02:18,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:19,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY HLA-A*02:20,YFAMYGENVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:21,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:22,YFAMYGEKVAHTHVDTLYVRYHYYTWAVWAYTWY HLA-A*02:24,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:25,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:26,YFAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A*02:27,YFAMYGEKVAHTHVDTLYVRYHYYTWAAQAYTWY HLA-A*02:28,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:29,YFAMYGEQVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:30,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:31,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:33,YFAMYGEKVAHTHVDTLYVRSHYYTWAVLAYTWY HLA-A*02:34,YFAMYGEKVAQTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:35,YFAMYGEKVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:36,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTGY HLA-A*02:37,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY HLA-A*02:38,YFAMYGEKVAHTHVDTLYVRYHYYTWAEQAYRWY HLA-A*02:39,YFAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A*02:40,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:41,YYAMYGEKVAHTHVDTLYVRYQYYTWAVLAYTWY HLA-A*02:42,YFSMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:44,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY HLA-A*02:45,YFAMYQEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:46,YFAMYEEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:47,YFAMYGEKVAHSHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:48,YFAMYEEKVAHTDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:49,YFAMYGEKVAHTHVDTLYVRYHYYTWAVRAYTWY HLA-A*02:50,YFAMYGEKVAHTHVDTLYIRYHYYTWAVWAYTWY HLA-A*02:51,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:52,YFAMYGEKVAHTHVDTLYVRYEHYTWAVLAYTWY HLA-A*02:54,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY HLA-A*02:55,YFAMYRNNVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:56,YFAMYQENVAQTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:57,YYAMYGEKVAHTHVDTLYLMYHYYTWAVLAYTWY HLA-A*02:58,YFAMYGEKVAHTHVDTLYLRYHYYTWAVLAYTWY HLA-A*02:59,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:60,YFAMYGEKVAHTHVDTLYVRYHFYTWAVLAYTWY HLA-A*02:61,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:62,YFAMYGENVAQTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:63,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:64,YFAMYGEKVAHTHVDTLYVRYHSYTWAVLAYTWY HLA-A*02:65,YFAMYGEKVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A*02:66,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:67,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:68,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:69,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:70,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:71,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:72,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:73,YFAMYGEKVAHTHVDTLYIRYHYYTWAVLAYTWY HLA-A*02:74,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:75,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:76,YSAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:77,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:78,YYAMYQENVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:79,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:80,YFAMYGEKVAHTHVDTLYVRYQDYTWAVLAYTWY HLA-A*02:81,YFAMYGEKVAHTDESIAYVRYHYYTWAVLAYTWY HLA-A*02:84,YYAMYGEKVAHTHVDTLYFRYHYYTWAVLAYTWY HLA-A*02:85,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:86,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:87,YFAMYGEKVAHTDENIAYVRYHYYTWAVLAYTWY HLA-A*02:89,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:90,YFAMYGEKVAHTDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:91,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:92,YFAMYEEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:93,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:95,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:96,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:97,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:99,YYAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A*02:101,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYRWY HLA-A*02:102,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:103,YFAMYQENVAQTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:104,YFAMYGEKVAHTHVDTLYVRYHYYTWAVWAYTWY HLA-A*02:105,YFAMYGEKVAHTHVDTLYVRYEYYTWAVLAYTWY HLA-A*02:106,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:107,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:108,YYAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A*02:109,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:110,YFAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A*02:111,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:112,YFAMYGEKVAHTDENIAYVRCHYYTWAVLAYTWY HLA-A*02:114,YFAMYGEKVAHTHVDTLYVRYRDYTWAVLAYTWY HLA-A*02:115,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:116,YFAMYGEKVAHTHLDTLYVRYHYYTWAVLAYTWY HLA-A*02:117,YFAMYGEKVAHTHVDTLYVRYQDYTWAEWAYTWY HLA-A*02:118,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:119,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:120,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:121,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:122,YYAMYGEKVAHTHVDTLYIRYHYYTWAVWAYTWY HLA-A*02:123,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:124,YFAMYGEKVAHTDESIAYVRYHYYTWAVLAYTWY HLA-A*02:126,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:127,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYKWY HLA-A*02:128,YFAMYGENVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:129,YYAMYEEKVAHTDENIAYVRYHYYTWAVLAYTWY HLA-A*02:130,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:131,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYEWY HLA-A*02:132,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:133,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:134,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:135,YFAMYGEKVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A*02:136,YFAMYGEKVAHTDENIAYVRYHYYTWAVWAYTWY HLA-A*02:137,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:138,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:139,YFAMYGEKVTHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:140,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:141,YFVMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:142,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY HLA-A*02:143,YYAMYREKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:144,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:145,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:146,YFAMYGEKVAHTDANTLYVRYHYYTWAVLAYTWY HLA-A*02:147,YFAMYGEKVAHTHVDTLYVRYDYYTWAVLAYTWY HLA-A*02:148,YFAMYGEKVAHTHVDTLYVRFHYYTWAEWAYTWY HLA-A*02:149,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:150,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:151,YFAMYGEKVAHTHVDTLYVRYDYYTWAVLAYTWY HLA-A*02:152,YFAMYGEKVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A*02:153,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:154,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYRWY HLA-A*02:155,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:156,YFAMYGEKVAHTHVDTLYIIYHYYTWAVLAYTWY HLA-A*02:157,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:158,YFAMYGEKVAHAHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:159,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:160,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:161,YFAVYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:162,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:163,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:164,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:165,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:166,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:167,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYKWY HLA-A*02:168,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:169,YYAMYQENVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:170,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:171,YFAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A*02:172,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:173,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:174,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:175,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:176,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:177,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:178,YYAMYGEKVAHTHVDTLYVRYHSYTWAVLAYTWY HLA-A*02:179,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:180,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:181,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:182,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:183,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:184,YFAMYGEKVAHTHEDTLYVRYHYYTWAVLAYTWY HLA-A*02:185,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:186,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:187,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:188,YFAMYGEKVAHTHVDTLYVRYDSYTWAVLAYTWY HLA-A*02:189,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:190,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:191,YFAMYGEKVAHTHVDTLYVRCHYYTWAVWAYTWY HLA-A*02:192,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:193,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:194,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:195,YFAMYQENVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:196,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:197,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:198,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:199,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:200,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:201,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:202,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:203,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:204,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:205,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:206,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:207,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:208,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:209,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:210,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:211,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:212,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:213,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:214,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:215,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:216,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:217,YFAMYREKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:218,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:219,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:220,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:221,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:224,YFAMYGEKVAHTHVDTLYVGYHYYTWAVLAYTWY HLA-A*02:228,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:229,YYAMYGEKVAHTHVDTLYLRYRYYTWAVWAYTWY HLA-A*02:230,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A*02:231,YFAMYGEKVAHTHVDTLYVRNHYYTWAVLAYTWY HLA-A*02:232,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:233,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTRY HLA-A*02:234,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:235,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:236,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:237,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:238,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:239,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:240,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:241,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:242,YFAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A*02:243,YTAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:244,YYAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A*02:245,YFAMYGEKVAHTHVDTLYIRYHYYTWAVLAYTWY HLA-A*02:246,YFAMYGEKVAHTHVDTLYVRYRDYTWAVLAYTWY HLA-A*02:247,YFAMYGEKVAHTDENTLYVRYHYYTWAVLAYTWY HLA-A*02:248,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:249,YFAMYVEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:251,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:252,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:253,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A*02:254,YFAMYGEKVAHTHVDTLYVRYNFYTWAVLAYTWY HLA-A*02:255,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTGY HLA-A*02:256,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:257,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:258,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A*02:259,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:260,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:261,YFAMYGEKVAHTHMDTLYVRCHYYTWAVLAYTWY HLA-A*02:262,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLVYTWY HLA-A*02:263,YFAMYGEKVAHTHVDTLYVRYHYYTWSVLAYTWY HLA-A*02:264,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A*02:265,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:266,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*03:01,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:02,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A*03:04,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:05,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:06,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:07,YFAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY HLA-A*03:08,YFAMYQENVAHTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:09,YFAMYQENVAQTHVDTLYIIYRDYTWAELAYTWY HLA-A*03:10,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A*03:12,YYAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:13,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:14,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:15,YFAMYQENVAQTDVDTLYIIFRDYTWAELAYTWY HLA-A*03:16,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:17,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:18,YFAMYQENVAQTDVDTLYIIYRDYTWVARVYRGY HLA-A*03:19,YFAMYQENVAQTDVDTLYIIFHYYTWAELAYTWY HLA-A*03:20,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:22,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:23,YFAMYGEKVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:24,YFAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:25,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:26,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:27,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:28,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:29,YFAMYQENVVQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:30,YFAMYEEKVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:31,YFAMYQENVAQTDVDTLYIIYRYYTWAVQAYTWY HLA-A*03:32,YFAMYQENVAHIDVDTLYIIYRDYTWAVQAYTWY HLA-A*03:33,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:34,YFAMYQENVAPTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:35,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:37,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:38,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:39,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:40,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:41,YFAMYQENVAHTDANTLYIIYRDYTWAELAYTWY HLA-A*03:42,YFAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY HLA-A*03:43,YFAMYQENVAQTDVDTLYIIYEHYTWAELAYTWY HLA-A*03:44,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:45,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:46,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:47,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:48,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:49,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:50,YFAMYQENVAQTDVDTLYIIYRDYTWAEWAYTWY HLA-A*03:51,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:52,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:53,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:54,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:55,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:56,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:57,YFAMYQENVAQTDANTLYIIYRDYTWAELAYTWY HLA-A*03:58,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:59,CFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:60,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:61,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:62,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:63,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:64,YFAMYQENVAQTDVDTLYIIYRDYTWADLAYTWY HLA-A*03:65,YFAMYQENVAQTDVDTLYIIYRDYTWAEQAYTWY HLA-A*03:66,YFAMYQENVAQTDVDTLYIIYRDYTWAERAYTWY HLA-A*03:67,YFATYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:70,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:71,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:72,YSAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:73,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A*03:74,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:75,YFAMYQENVAQTDVDTLYLMYRDYTWAELAYTWY HLA-A*03:76,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A*03:77,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:78,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:79,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:80,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:81,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:82,YFAMYQENVAQTDVDTLYIIYEHYTWAVQAYTWY HLA-A*11:01,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:02,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:03,YYAMYQENVAQTDVDTLYIIYRDYTWAEQAYRWY HLA-A*11:04,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYTWY HLA-A*11:05,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:06,YYAMYQENVAQTHVDTLYIIYRDYTWAAQAYRWY HLA-A*11:07,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:08,YYAMYQENVAQTDVDTLYIIYRDYTWAERAYRWY HLA-A*11:09,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:10,YYAMYRNNVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:11,YYAMYLQNVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:12,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:13,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:14,YYAMYQENVAQTDVDTLYIIYRDYTWARQAYRWY HLA-A*11:15,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:16,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:17,YYAMYQENMAHTDANTLYIIYRDYTWAAQAYRWY HLA-A*11:18,YYAMYQENVAHTHVDTLYIIYRDYTWAAQAYRWY HLA-A*11:19,YYAMYQENVAHTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:20,YYAMYQENVAQTDVDTLYIIYRDYTWAEQAYRWY HLA-A*11:22,YYAMYQENVAQTDVDTLYIIYPDYTWAAQAYRWY HLA-A*11:23,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:24,YYAMYQENVAQTDVDTLYIIYRDYTWAALAYRWY HLA-A*11:25,YYAMYQENVAQTDVDTLYIIYRDYTWAELAYRWY HLA-A*11:26,YYAMYQENVAQTDVDTLYIMYRDYTWAAQAYRWY HLA-A*11:27,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYTGY HLA-A*11:29,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:30,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:31,YYAMYQENVAQTDVDTLYIIYRDYTWAVLAYRWY HLA-A*11:32,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:33,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:34,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:35,YYAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY HLA-A*11:36,YYAMYQENVAQTDVDTLYIICRDYTWAAQAYRWY HLA-A*11:37,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:38,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRGY HLA-A*11:39,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRGY HLA-A*11:40,YYAMYQENVAHTDANTLYIIYRDYTWAAQAYRWY HLA-A*11:41,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:42,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:43,YTAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:44,YYAMYQENVAQTDVDTLYIIYRDYTWAARAYRWY HLA-A*11:45,YYAMYQENVAQTDADTLYIIYRDYTWAAQAYRWY HLA-A*11:46,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:47,YHAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:48,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:49,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:51,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:53,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:54,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:55,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:56,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:57,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:58,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:59,YYAMYQENVAQTDVDTLYIIYGDYTWAAQAYRWY HLA-A*11:60,YYAMYQENVAQTDVDTLYIIYRDYTWAVQAYRWY HLA-A*11:61,YYAMYQENAAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:62,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:63,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:64,YYAMYQENVAQTDVDTLHIIYRDYTWAAQAYRWY HLA-A*23:01,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:02,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTGY HLA-A*23:03,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:04,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTWY HLA-A*23:05,CSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:06,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:09,YSAMYQENMAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:10,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYRGY HLA-A*23:12,YSAMYEEKVAHTHENIAYLMFHYYTWAVLAYTGY HLA-A*23:13,YSAMYEEKVAQTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:14,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:15,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:16,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:17,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:18,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:20,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:21,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:22,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:23,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:24,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:25,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:26,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*24:02,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:03,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A*24:04,YSAMYEEKVAHTDANTLYLMFHYYTWAVQAYTGY HLA-A*24:05,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:06,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTGY HLA-A*24:07,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:08,YSAMYGEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:10,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYRWY HLA-A*24:13,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*24:14,YSAMYEEKVAHTDENIAYVRYHYYTWAVQAYTGY HLA-A*24:15,YSAMYEEKVAHTDENIAYLMYHYYTWAVQAYTGY HLA-A*24:17,YSAMYEEKVAHTDENIAYLMFRDYTWAVQAYTGY HLA-A*24:18,YSAMYEEKVAHTDENIAYLMFHYYTWAELAYTWY HLA-A*24:19,YSAMYEEKVAQTDVDTLYLMFHYYTWAVQAYTGY HLA-A*24:20,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:21,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:22,YSAMYEEKVAHTDENIAYLMFHYYTWAVWVYTWY HLA-A*24:23,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A*24:24,YSAMYRNNVAQTDENIAYLMFHYYTWAVLAYTGY HLA-A*24:25,CSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:26,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:27,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:28,YSAMYEEKVAHTHVDTLYLMFHYYTWAVQAYTGY HLA-A*24:29,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:30,YSAMYEEKVAHTHENIAYLMFHYYTWAVQAYTGY HLA-A*24:31,YSAMYEQKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:32,YSAMYEEKVAHTDESIAYLMFHYYTWAVQAYTGY HLA-A*24:33,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A*24:34,YSAMYEEKVAHIDENIAYLMFHYYTWAVQAYTGY HLA-A*24:35,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:37,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:38,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:39,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:41,YSAMYEEKVAHTDENIAYLMFRDYTWAVQAYTGY HLA-A*24:42,YSAMYGEKVAHTHENIAYLMFHYYTWAVQAYTGY HLA-A*24:43,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:44,YSAMYEEKVAHTDVDTLYLMFHYYTWAVQAYTGY HLA-A*24:46,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYRGY HLA-A*24:47,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:49,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:50,YYAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:51,YSAMYEEKVAHTDENIAYLIYHYYTWAVQAYTGY HLA-A*24:52,YSAMYEEKVAHTDENIAYLRFHYYTWAVQAYTGY HLA-A*24:53,YSAMYEEKVAHTDENIAYLMYHYYTWAVQAYTGY HLA-A*24:54,YSAMYEEKVAHTDENIAYLMFHYYTWAVQPYTGY HLA-A*24:55,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYEGY HLA-A*24:56,YSAMYEEKVAHTDENIAYLMFHYYTWAEQAYTGY HLA-A*24:57,YSAMYEEKVAHTDENIAYIMYHYYTWAVQAYTGY HLA-A*24:58,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:59,YSAMYEEKVAHTDENIAYLMFHYYTWAAQAYTGY HLA-A*24:61,YSAMYEEKVAHTDEKIAYLMFHYYTWAVQAYTGY HLA-A*24:62,YSAMYEEKVAHTDENIAYLMFQDYTWAVQAYTGY HLA-A*24:63,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:64,YSAMYEEKVAHTDENIAYLWIHYYTWAVQAYTGY HLA-A*24:66,YSAMYEEKVAHTDENIAYLMFEHYTWAVQAYTGY HLA-A*24:67,YSAMYRNNVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:68,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:69,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:70,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:71,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:72,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:73,YSAMYEEKVAHTDENIAYLMFDYYTWAVQAYTGY HLA-A*24:74,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:75,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:76,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:77,YSAMYQEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:78,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:79,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:80,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:81,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:82,YTAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:85,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:87,YSAMYEEKVAHTDENIAYLMFHYYTWAVRAYTGY HLA-A*24:88,YFAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:89,YSAMYGEKVAHTHVDTLYLMFHYYTWAVQAYTGY HLA-A*24:91,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:92,YSAMYEEKVAHTDENIAYIIYHYYTWAVQAYTGY HLA-A*24:93,YSAMYEEKVAHTDENIAYVMFHYYTWAVQAYTGY HLA-A*24:94,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTWY HLA-A*24:95,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:96,YSAMYEEKVAHTDENIAYLMFNFYTWAVQAYTGY HLA-A*24:97,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:98,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:99,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:100,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:101,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:102,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:103,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:104,YFAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:105,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:106,YSAMYEEKVAHTDENIAYLMFDDYTWAVQAYTGY HLA-A*24:107,YSAMYEEKVAHTDENIAYLMFHYYTWAVHAYTGY HLA-A*24:108,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:109,YSAMYEEKVAHTDANTLYLMFHYYTWAVQAYTGY HLA-A*24:110,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:111,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:112,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:113,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:114,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:115,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:116,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:117,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:118,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:119,YSAMYEEKVAHADENIAYLMFHYYTWAVQAYTGY HLA-A*24:120,YSAMYEEKVAHTDENIAYIMFHYYTWAVQAYTGY HLA-A*24:121,YSAMYEEKVAHTDENIAYLMFHSYTWAVQAYTGY HLA-A*24:122,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:123,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:124,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:125,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A*24:126,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:127,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:128,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:129,YSAMYQENMAHTDANTLYLMFHYYTWAVQAYTGY HLA-A*24:130,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:131,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:133,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:134,YSAMYEEKVAHTDENIAYLMFHYYPWAVQAYTGY HLA-A*24:135,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:136,YSAMYEEKVAHTDENIAYLMFHYYTWVVQAYTGY HLA-A*24:137,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:138,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTWY HLA-A*24:139,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:140,YSTMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:141,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:142,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:143,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYLGY HLA-A*24:144,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*25:01,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:02,YYAMYRNNVAQTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:03,YFAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:04,YYAMYRNNVAHTDESIAYIRYQDYTWAEQAYRWY HLA-A*25:05,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:06,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYTWY HLA-A*25:07,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:08,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:09,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:10,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:11,YYAMYRNNVAHTHESIAYIRYQDYTWAEWAYRWY HLA-A*25:13,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*26:01,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:02,YYAMYRNNVAHTDANTLYIRYQNYTWAEWAYRWY HLA-A*26:03,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A*26:04,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYLWY HLA-A*26:05,YYAMYRNNVAHTDENTLYIRYQDYTWAEWAYRWY HLA-A*26:06,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A*26:07,YYAMYGEKVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:08,YYAMYRNNVAHTDANTLYIRYQDYTWAEQAYRWY HLA-A*26:09,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYTWY HLA-A*26:10,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:12,YYAMYRNNVAHTDANTLYIRYQDYTWAVWAYRWY HLA-A*26:13,YYAMYRNNVAQTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:14,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:15,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:16,YSAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:17,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:18,YYAMYRNNVAHTDANTLYIRYQDYTWAVWAYRWY HLA-A*26:19,YYAMYQENVAQTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:20,YFAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:21,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A*26:22,YYAMYRNNVAHTDANTLYVRYQDYTWAEWAYRWY HLA-A*26:23,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:24,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:26,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:27,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:28,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:29,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRGY HLA-A*26:30,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A*26:31,YYAMYPNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:32,YYAMYRNNVAHTDANTLYMVYQDYTWAEWAYRWY HLA-A*26:33,YYAMYRNNVAQIHANTLYIRYQDYTWAEWAYRWY HLA-A*26:34,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYWWY HLA-A*26:35,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:36,YYAMYRNNVAHTHANTLYIRYQDYTWAEWAYRWY HLA-A*26:37,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:38,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:39,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:40,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:41,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:42,YYAIYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:43,YYAMYRNNVAHTDANTLYIRYQDYTWAELAYRWY HLA-A*26:45,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:46,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:47,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:48,YYAMYRNKVAHTDANTLYIRYQDYTWAEQAYRWY HLA-A*26:49,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRGY HLA-A*26:50,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*29:01,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:02,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:03,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTGY HLA-A*29:04,YTAMYLQHVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:05,YTAMYLQNVAQTDANTLYIMYRDYTWAEQAYTWY HLA-A*29:06,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:07,YTAMYLQNVAQTDANTLYLMFRDYTWAVLAYTWY HLA-A*29:09,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:10,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:11,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:12,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:13,YTAMYLQNVAQTDESIAYIMYRDYTWAVLAYTWY HLA-A*29:14,YTAMYQENVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:15,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:16,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:17,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:18,YTAMYQENVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:19,YTAMYLQNVAHTHVDTLYIMYRDYTWAVLAYTWY HLA-A*29:20,YTAMYLQNVAHTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:21,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:22,YTAMYLQNVAQTDANTLYVRYRDYTWAVLAYTWY HLA-A*30:01,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:02,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:03,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:04,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY HLA-A*30:06,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY HLA-A*30:07,YSAMYEEKVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:08,YYAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:09,YSAMYQENVAHTDENTLYIIYEHYTWAVLAYTWY HLA-A*30:10,YSAMYQENVAHTDENTLYIIHEHYTWARLAYTWY HLA-A*30:11,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:12,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:13,YSAMYQENVAHTHVDTLYIIYEHYTWARLAYTWY HLA-A*30:15,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:16,YSAMYQENVAQTHVDTLYIIYEHYTWAWLAYTWY HLA-A*30:17,YSAMYQENVAQTDVDTLYIIYEHYTWAVWAYTWY HLA-A*30:18,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:19,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:20,YSAMYQENVAQTEVDTLYIIYEHYTWAWLAYTWY HLA-A*30:22,YSAMYGEKVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:23,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:24,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:25,YSAMYQENVAQTDENTLYIIYEHYTWARLAYTWY HLA-A*30:26,YSAMYQENVAQTDVDTLYIIYRDYTWAWLAYTWY HLA-A*30:28,YSAMYQENVAHTDENTLYIVYEHYTWARLAYTWY HLA-A*30:29,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTSY HLA-A*30:30,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:31,YSAMYQENVARTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:32,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:33,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:34,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:35,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:36,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:37,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:38,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:39,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:40,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:41,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*31:01,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:02,YTAMYQEKVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:03,YTAMYQENVAHIDVDTLYIIYRDYTWAVLAYTWY HLA-A*31:04,YTAMYQENVAHIDVDTLYIIYRDYTWAVLAYTWY HLA-A*31:05,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTGY HLA-A*31:06,YTAMYQENVAHIDVDTLYIMYRDYTWAVLAYTWY HLA-A*31:07,YTAMYQEKVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A*31:08,YTAMYEEKVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A*31:09,YTAMYQENVGHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:10,YTAMYQENVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A*31:11,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:12,YTAMYQENVAHIDVDTLYIKYQDYTWAVLAYTWY HLA-A*31:13,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:15,YTAMYQENVARIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:16,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:17,YTAMYQENVAHINVDTLYIMYQDYTWAVLAYTWY HLA-A*31:18,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTRY HLA-A*31:19,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:20,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:21,YFAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:22,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:23,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:24,YTAMYQENVAHIDVDTLYIMYQDYTWAAQAYRWY HLA-A*31:25,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYRWY HLA-A*31:26,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:27,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:28,YTAMYQENVTHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:29,YTAMYQENVAHIDVDTLYLMFQDYTWAVLAYTWY HLA-A*31:30,YTAMYQENVAHIDVDTLYIMYQDYTWAVWAYTWY HLA-A*31:31,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:32,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:33,YTAMYQENVAHIDGDTLYIMYQDYTWAVLAYTWY HLA-A*31:34,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:35,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:36,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:37,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*32:01,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:02,YFAMYQENVAHTDESIAYIMYQDYTWAVQAYTWY HLA-A*32:03,YFAMYQENVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A*32:04,YFAMYQENVAHTDESIAYIIYRDYTWAELAYTWY HLA-A*32:05,YFAMYQEKVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:06,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:07,YSAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:08,YFAMYQENVAHTHESIAYIMYQDYTWAVLAYTWY HLA-A*32:09,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTRY HLA-A*32:10,YFAMYQENVAHTDESIAYIMYQDYTWAEWAYTWY HLA-A*32:12,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:13,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTGY HLA-A*32:14,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:15,YFAMYRNNVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:16,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:17,YFAMYQENVAQTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:18,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:20,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:21,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:22,YFAMYQENVAHTDESIAYIMYQDYTWAVQAYTWY HLA-A*32:23,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:24,YFAMYQENMAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:25,YFAMYHENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*33:01,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:03,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:04,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:05,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:06,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:07,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:08,YTAMYGEKVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:09,YTAMYGENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:10,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTGY HLA-A*33:11,YTAMYRNNVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:12,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:13,YTAMYRNNVAHTDANTLYIMYQDYTWAVLAYTWY HLA-A*33:14,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:15,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:16,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:17,YTAMYRNNVAHIDADTLYIMYQDYTWAVLAYTWY HLA-A*33:18,YTAMYRNNVAHIDVDTLYIMYRDYTWAVLAYTWY HLA-A*33:19,YTAMYRNNVAHIDVDTLYLMFHYYTWAVQAYTGY HLA-A*33:20,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:21,YTAMYEENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:22,YTAMYRNNVAHIDVDTLYVRYQDYTWAVLAYTWY HLA-A*33:23,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:24,YTAMYRNNVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A*33:25,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:26,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:27,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:28,YTAMYRNNVAHIDVDTLYIMYQDYTWAELAYTWY HLA-A*33:29,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:30,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:31,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*34:01,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY HLA-A*34:02,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*34:03,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*34:04,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*34:05,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY HLA-A*34:06,YYAMYRNNVAQTDVDTLYIRYQDYTWAVLAYTWY HLA-A*34:07,YYAMYRNNVSQTDVDTLYIIYRDYTWAELAYTWY HLA-A*34:08,YFAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*36:01,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTWY HLA-A*36:02,YFAMYQENMAHTDANTLYIIYRDYTWVARAYTWY HLA-A*36:03,YFAMYQENMAHTDANTLYLMYRDYTWVARVYTWY HLA-A*36:04,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRWY HLA-A*36:05,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTWY HLA-A*43:01,YYAMYLQNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*66:01,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:02,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYEWY HLA-A*66:03,YYAMYRNNVAHTDVDTLYIRYQDYTWAEWAYEWY HLA-A*66:04,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWH HLA-A*66:05,YYAMYRNNVAHTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:06,YYAMYRNNVAQTDVDTLYIRYQDYTWAVLAYRWY HLA-A*66:07,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:08,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:09,YYAMYRNNVAQTDVDTLYVRYQDYTWAEWAYRWY HLA-A*66:10,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRGY HLA-A*66:11,YYAMYRNNVAQTDADTLYIRYQDYTWAEWAYRWY HLA-A*66:12,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:13,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:14,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:15,YYAMYRNNVAHIDVDTLYIRYQDYTWAEWAYRWY HLA-A*68:01,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:02,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:03,YYAMYRNNVAHTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:04,YYAMYRNNVAHIDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:05,YYAMYRNNVAHTHVDTLYIMYRDYTWAVWAYTWY HLA-A*68:06,YYAMYRNNVAQTDVDTLYIMYEHYTWAVWAYTWY HLA-A*68:07,YYAMYRNNVAQTDVDTLYIMYRHYTWAVWAYTWY HLA-A*68:08,YYAMYRNNVAQTDVDTLYIMYRDYTWAVLAYTWY HLA-A*68:09,YYAMYRNNVAQTDVDTLYIMYRDYTWAVQAYTWY HLA-A*68:10,YYAMYEENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:12,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:13,YYAMYRENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:14,YYAMYEENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:15,YYAMYRNNVAHTHVDTLYIRYHYYTWAVWAYTWY HLA-A*68:16,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:17,YYAMYRNNVAQTDVDTLYIMYRVYTWAVWAYTWY HLA-A*68:19,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:20,YYAMYRNNVAHTHVDTLYIMYRDYTWAVWAYTWY HLA-A*68:21,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:22,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:23,YYAMYRNNVAQTDVDTLYIRYRDYTWAVWAYTWY HLA-A*68:24,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:25,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:26,YYAMYRNNVAQTDVDTLYIMYRDYTWAVQAYTGY HLA-A*68:27,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:28,YYAMYRNNVAQTDVDTLYIRYHYYTWAVRAYTWY HLA-A*68:29,YTAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:30,YYAMYGENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:31,YYAMYRNNVAHTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:32,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:33,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:34,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYMWY HLA-A*68:35,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:36,YYAMYRNNVAQTDENIAYIMYRDYTWAVWAYTWY HLA-A*68:37,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:38,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:39,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:40,YYAMYRNNVGQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:41,YYAMYRNNVAQTDVDTLYIMYRDYTWVVWAYTWY HLA-A*68:42,YYAMYRNNVAQTDVDTLYIMYRDYTWAEWAYTWY HLA-A*68:43,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:44,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:45,YSAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:46,YYAMYRNNVAQTDVNTLYIMYRDYTWAVWAYTWY HLA-A*68:47,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:48,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:50,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:51,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:52,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:53,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:54,YYAMYRNNVAQTDVDTLYIRYHYYTWAEWAYTWY HLA-A*69:01,YYAMYRNNVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A*74:01,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:02,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:03,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:04,YFAMYGEKVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:05,YFAMYQENVAHADVDTLYIMYQDYTWAVLAYTWY HLA-A*74:06,YFAMYQENVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A*74:07,YFAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:08,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:09,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:10,YFAMYQENVAHTDANTLYIMYQDYTWAVLAYTWY HLA-A*74:11,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:13,YFAMYQENVAQTDVDTLYIMYQDYTWAVLAYTWY HLA-A*80:01,YFAMYEENVAHTNANTLYIIYRDYTWARLAYEGY HLA-A*80:02,YFAMYEENVAHTDVDTLYIIYRDYTWARLAYEGY HLA-B*07:02,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:03,YYSEYRNIYTNTDESNLYLSYDYYTWAERAYEWY HLA-B*07:04,YYSEYRNIYAQTDESNLYLSYDYYTWAEDAYEWY HLA-B*07:05,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:06,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:07,YYSEYRNIYAQTDESNLYLRYDYYTWAERAYEWY HLA-B*07:08,YYSEYRNIFTNTDESNLYLSYDYYTWAERAYEWY HLA-B*07:09,YYSEYRNIYAQTDESNLYLSYDSYTWAERAYEWY HLA-B*07:10,YYSEYRNICAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:11,YYSEYRNIYAQTDENNLYLSYDSYTWAERAYEWY HLA-B*07:12,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY HLA-B*07:13,YYSGYREKYRQADVSNLYLSYDYYTWAERAYEWY HLA-B*07:14,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY HLA-B*07:15,YYSEYRNIYAQADVSNLYLSYDYYTWAERAYEWY HLA-B*07:16,YYSEYRNIYTNTYESNLYLSYDYYTWAERAYEWY HLA-B*07:17,YYSEYRNIYAQTDESNLYLSYDSYTWAERAYEWY HLA-B*07:18,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY HLA-B*07:19,YYSEYRNIYAQTDESNLYLSYDYYTWAEDAYTWY HLA-B*07:20,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLSY HLA-B*07:21,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:22,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:23,YYSEYRNIYAQTDESNLHLSYDYYTWAERAYEWY HLA-B*07:24,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLWY HLA-B*07:25,YYSEYRNIYAQTDESNLYLSYDYYTWAVDAYEWY HLA-B*07:26,YYSEYRNIYAQTDESNLYLSYDYYTWAELAYEWY HLA-B*07:27,YYSEYRNISTNTYEDTLYLSYDYYTWAERAYEWY HLA-B*07:28,YYSEYRNIYAQTDESNLYLSYDDYTWAERAYEWY HLA-B*07:29,YDSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:30,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:31,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYTWY HLA-B*07:32,YYSEYRNIFTNTDESNLYLSYNYYTWAERAYEWY HLA-B*07:33,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:34,YYSEYRNIYAQTDESNLYLSYNYYTWAELAYTWY HLA-B*07:35,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:36,YYSEYRNIYAQTDENIAYLSYDYYTWAERAYEWY HLA-B*07:37,YYSEYRNIYANTYESNLYLSYDYYTWAERAYEWY HLA-B*07:38,YYSEYRNIFTNTYENIAYLSYDYYTWAERAYEWY HLA-B*07:39,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:40,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:41,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:42,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:43,YYSEYRNIYAQTDESNLYLSYDYYTWAELAYTWY HLA-B*07:44,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:45,YYSEYRNIYAQTDESNLYLSYDYYTWAERTYEWY HLA-B*07:46,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:47,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:48,YYSEYRNIYAQTDESNLYLSYDYYTWAVLAYEWY HLA-B*07:50,YYSEYRNISTNTYESNLYLSYDYYTWAERAYEWY HLA-B*07:51,YYSEYRNIYAQTDESNLYLSYDYYTWAARAYEWY HLA-B*07:52,YYSEYRNIYAQTDESNLYLSYDYYTWAERVYEWY HLA-B*07:53,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:54,YYSEYREIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:55,YYSEYRNIYAQTDESNLYLSYDYYTWAEWAYEWY HLA-B*07:56,YYAEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:57,YYSEYRNIYAQTDENNLYLSYDYYTWAERAYEWY HLA-B*07:58,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:59,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:60,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLWY HLA-B*07:61,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:62,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:63,YYSDYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:64,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEGY HLA-B*07:65,YYATYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:66,YYSEYRNIYAQTDESNLYLSYDYYTWAEQAYEWY HLA-B*07:68,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:69,YYSEYRNICTNTDESNLYLSYNYYTWAERAYEWY HLA-B*07:70,YCSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:71,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:72,YYAEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:73,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:74,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:75,YYSEYRNIYAQTYENNLYLSYDYYTWAERAYEWY HLA-B*07:76,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:77,YYSEYRNIYAQTDESNLYLRSDYYTWAERAYEWY HLA-B*07:78,YYSEYRNIYAQTDESNLYWTYNLYTWAERAYEWY HLA-B*07:79,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:80,YYSEYRNIYAQTDESNLYLSYNYYTWAELAYEWY HLA-B*07:81,YYSEYRNIYAQTDESIAYLSYDYYTWAERAYEWY HLA-B*07:82,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:83,YYSEYRNIFAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:84,YYSEYRNIYAQTDESNLYWTYDYYTWAERAYEWY HLA-B*07:85,YYSEYRNICTNTDESNLYLSYDYYTWAERAYEWY HLA-B*07:86,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:87,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:88,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:89,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:90,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:91,YYSEYRNIYAQTYESNLYLSYDYYTWAERAYEWY HLA-B*07:92,YYSEYRNIYAQTDVSNLYLSYDYYTWAERAYEWY HLA-B*07:93,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:94,YYSEYWNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:95,YYSEYRNIYAQTDESNLYFSYDYYTWAERAYEWY HLA-B*07:96,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:97,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:98,YYSEYRNIYAQTDESNLYLSYDYYTCAERAYEWY HLA-B*07:99,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:100,YYSEYRNIYAQTDESNLYLSYDYYTWAEWAYLWY HLA-B*07:101,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:102,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:103,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:104,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:105,YYSEYRNIYAQTVESNLYLSYNYYTWAERAYEWY HLA-B*07:106,YYSEYRNIYAQTDESNLYLSYDYYTRAERAYEWY HLA-B*07:107,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:108,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:109,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:110,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:112,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:113,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:114,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:115,YYSEYRNIYAQTDESNLYLSYNFYTWAERAYEWY HLA-B*08:01,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:02,YDSEYRNIFTNTDENTAYLSYNYYTWAVDAYTWY HLA-B*08:03,YDSEYRNIFTNTYENIAYLSYNYYTWAVDAYTWY HLA-B*08:04,YDSEYRNISTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:05,YDSEYRNTFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:07,YDSEYRNIFTNTDESNLYLSYDYYTWAVDAYTWY HLA-B*08:09,YDSEYRNIFTNTDESNLYWTYNYYTWAVDAYTWY HLA-B*08:10,YDSEYRDIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:11,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYAWY HLA-B*08:12,YDSEYRNIFTNTDESNLYLRYNYYTWAVDAYTWY HLA-B*08:13,YDSEYRNIFTNTDESNLYLSYNYYTWAVLAYTWY HLA-B*08:14,YDSEYRNIFTNTDESNLYLSYHDYTWAVDAYTWY HLA-B*08:15,YDSEYRNIFTNTDVSNLYLSYNYYTWAVDAYTWY HLA-B*08:16,YDSEYRNIFTNADESNLYLRYNYYTWAVDAYTWY HLA-B*08:17,YDSEYREISTNTDENNLYLSYNYYTWAVDAYTWY HLA-B*08:18,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:20,YDSEYRNIFTNTDESNLYLSYNYYTWAERAYTWY HLA-B*08:21,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYLWY HLA-B*08:22,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:23,YDSEYRNIFTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*08:24,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:25,YDSEYRNIFTNTDESNLYLSYNYYTWAVLAYLWY HLA-B*08:26,YYAEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:27,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:28,YDSEYRNIFTNTDESNLYLSYDSYTWAVDAYTWY HLA-B*08:29,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:31,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:32,YDSTYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:33,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:34,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:35,YDSEYRNIFTNTDESNLYLSYNSYTWAVDAYTWY HLA-B*08:36,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:37,YDSEYRNIFTNTDESNLYLSYDSYTWAVDAYTWY HLA-B*08:38,YDSEYREIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:39,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:40,YDSEYRNIFTNTDESNLYLSYNYYTWAVRAYEWY HLA-B*08:41,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:42,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:43,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:44,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:45,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:46,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:47,YDSEYRNIFTNTDENNLYLSYNYYTWAVDAYTWY HLA-B*08:48,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:49,YDSEYRNIFTNTDESNLYIRSNFYTWAVDAYTWY HLA-B*08:50,YYSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:51,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:52,YDSEYRNIFTNTDESIAYLSYNYYTWAVDAYTWY HLA-B*08:53,YDSEYRNIFTNTDESNLYLSYNYYTWAEDAYTWY HLA-B*08:54,YDSEYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*08:55,YDSEYRNIFTNTDESNLYLSYNYYTWAVLTYTWY HLA-B*08:56,YDAEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:57,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:58,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:59,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:60,YDSEYRNIFTNTDESNLYISYNYYTWAVDAYTWY HLA-B*08:61,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:62,YHSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*13:01,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:02,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:03,YYTMYREISTNTYENTAYWTYNLYTWAVLAYLWY HLA-B*13:04,YYTMYREISTNTYENTAYWTYDSYTWAVLAYLWY HLA-B*13:06,YYTMYREISTNTYENTAYIRYNLYTWAVLAYTWY HLA-B*13:09,YYTMYREISTNTYESNLYWTYNLYTWAVLAYEWY HLA-B*13:10,YYTMYREISTNTYENTAYLRYDSYTWAVLAYEWY HLA-B*13:11,YYTMYREISTNTYENTAYLRYNLYTWAVLAYEWY HLA-B*13:12,YYTMYREISTNTYENTAYIRYNLYTWAVLAYGWY HLA-B*13:13,YYTMYREISTNTYENTAYIRYNYYTWAVLAYEWY HLA-B*13:14,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:15,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWH HLA-B*13:16,YYTMYREISTNTYENTAYWTYNLYTWAELAYEWY HLA-B*13:17,YYAMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:18,YYTMYREISTNTYENTAYWTYNLYTWAVRAYEWY HLA-B*13:19,YYTMYREVSTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:20,YYTMYREISTNTYENTAYIRYNLYTWAELAYEWY HLA-B*13:21,YYTMYREISTNTYENTAYIRYNYYTWAVLAYEWY HLA-B*13:22,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:23,YHTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:25,YYTMYREISTNTYESTAYIRYNLYTWAVLAYEWY HLA-B*13:26,YYTMYREISTNTYENTAYIRYDSYTWAVLAYEWY HLA-B*13:27,YYTMYREISTNTYENTAYWTFNLYTWAVLAYEWY HLA-B*13:28,YYTMYREISTNTYENTACIRYNLYTWAVLAYEWY HLA-B*13:29,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:30,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:31,YYTMYREISTNTYENTAYWTYNLYTWAEWAYEWY HLA-B*13:32,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:33,YYAMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:34,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:35,YYTMYREISTNTYENTAYWTYDYYTWAVLAYEWY HLA-B*13:36,YYTMYRNISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:37,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:38,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:39,YYTMYREISTNTYENNLYIRYNLYTWAVLAYEWY HLA-B*14:01,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:02,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:03,YYSEYRNICTNTDESNLYLWYNFYTWAERAYTWH HLA-B*14:04,HYSEYRNNCTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:05,YYSEYRNICTNTDESNLYLSYNFYTWAELAYTWH HLA-B*14:06,YYSEYRNICTNTDESNLYLRYNFYTWAELAYTWH HLA-B*14:08,YYSEYRNICTNTDESNLYLRYNFYTWAELAYTWH HLA-B*14:09,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:10,YYSEYRNICTNTDESNLYIRYNFYTWAELAYTWH HLA-B*14:11,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:12,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:13,YYSEYRNICTNTDESNLYLSYNYYTWAELAYTWH HLA-B*14:14,YYSEYRNICTNTYESNLYLWYNFYTWAELAYTWH HLA-B*14:15,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:16,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:17,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:18,YYSEYRNICTNTYESNLYLWYNFYTWAELAYTWH HLA-B*15:01,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:02,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:03,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:04,YYAMYREISTNTYESNLYWTYDSYTWAEWAYLWY HLA-B*15:05,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*15:06,YYAMYREISTNTYESNLYLRFDSYTWAELAYLWY HLA-B*15:07,YYAMYREISTNTYESNLYLSYDSYTWAEWAYLWY HLA-B*15:08,YYAMYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:09,YYSEYRNICTNTYESNLYLRYNYYTWAELAYLWY HLA-B*15:10,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWY HLA-B*15:11,YYAMYRNIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:12,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLGY HLA-B*15:13,YYAMYRNISTNTYENIAYIRYDSYTWAELAYLWY HLA-B*15:14,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLSY HLA-B*15:15,YYAMYRNISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:16,YYAMYRENMASTYENIAYWRYDSYTWAELAYLWY HLA-B*15:17,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B*15:18,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:19,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLGY HLA-B*15:20,YYAMYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*15:21,YYAMYRNICTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:23,YYSEYRNICTNTYENIAYLRYDSYTWAELAYLWY HLA-B*15:24,YYAMYREISTNTYENIAYLRYDSYTWAEWAYLWY HLA-B*15:25,YYAMYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:27,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY HLA-B*15:28,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:29,YYSEYRNIFTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:30,YYAMYREISTNTYESNLYLRYNYYTWAEWAYLWY HLA-B*15:31,YYAMYRNISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*15:32,YYAMYREISTNTYESNLYLRSDSYTWAEWAYLWY HLA-B*15:33,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:34,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:35,YYAMYREISTNTYESNLYLTYDSYTWAEWAYLWY HLA-B*15:36,YYAMYREISTNTYENTAYIRYDSYTWAELAYLWY HLA-B*15:37,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWH HLA-B*15:38,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWH HLA-B*15:39,YYAMYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:40,YYAMYREISTNTYESNLYLRYDSYTWAELAYEWY HLA-B*15:42,YYAMYREISTNTYESNLYWTYNLYTWAELAYTWY HLA-B*15:43,YYAMYREISTNTYEDTLYLRYDSYTWAEWAYLWY HLA-B*15:44,YYAMYRNICTNTYESNLYIRYDSYTWAELAYTWY HLA-B*15:45,YYAMYREISTNTYESNLYLSYDYYTWAEWAYLWY HLA-B*15:46,YYAKYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:47,YYSEYREISTNTYESNLYLRYDSYTWAERAYEWY HLA-B*15:48,YYAMYREISTNTYESNLYLRYNYYTWAVLTYLWY HLA-B*15:49,YYSEYREISTNTYESNLYLRYDSYTWAERAYEWY HLA-B*15:50,YYAMYREISTNTYESNLYLRYDSYTWAEWAYTWY HLA-B*15:51,YYSEYRNICTNTYESNLYLRYDSYTWAVDAYLWY HLA-B*15:52,YYSEYRNICTNTYESNLYLRYDSYTWAVLAYEWY HLA-B*15:53,YYTKYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:54,YYSEYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:55,YYAMYRNISTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*15:56,YYAMYREIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:57,YYAMYREISTNTYVNNLYLRYDSYTWAEWAYLWY HLA-B*15:58,YYAMYREISTNTYESNLYLRYNFYTWAEWAYLWY HLA-B*15:60,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:61,YYSEYREISTNTDESNLYLRYDSYTWAELAYLWY HLA-B*15:62,YYSEYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:63,YYAMYREISTNTYESNLYLRYDYYTWAEWAYLWY HLA-B*15:64,YYSEYRNISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:65,YYAMYREISTNTYESNLYLRYDSYTWAERAYLWY HLA-B*15:66,YYAMYREICTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:67,YYAMYRENMASTYENIAYWRYDSYTWAELAYLWY HLA-B*15:68,YYSEYREISTNTYESNLYLSYDSYTWAEWAYLWY HLA-B*15:69,YYSEYREISTNTYESNLYLRYDSYTWAELTYTWY HLA-B*15:70,YYAMYREISTNTDESNLYLRYDSYTWAEWAYLWY HLA-B*15:71,YHAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:72,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:73,YYAMYREISTNTYESNLYLRYNLYTWAEWAYLWY HLA-B*15:74,YYSEYREISINTYESNLYLRYDSYTWAELAYLWY HLA-B*15:75,YYAMYREISTNTYESNLYLRYDSYTWAQWAYLWY HLA-B*15:76,YYAMYRNIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B*15:77,YYAMYREISTNTYESNLYIRYDDYTWAEWAYLWY HLA-B*15:78,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:80,YYSEYRNICTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:81,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:82,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:83,YYAMYREISTNTYESNLYWTYNYYTWAVDAYTWY HLA-B*15:84,YYAMYREISTNTYESNLYLRFDSYTWAVRAYLWY HLA-B*15:85,YYAMYREISTNTYESNLYIRYDSYTWAEWAYLWY HLA-B*15:86,YYAMYREISTNTYESNLYLRYNLYTWAVLAYTWY HLA-B*15:87,YYAMYREISTNTYESIAYLRYDSYTWAEWAYLWY HLA-B*15:88,YYAMYRNISTNTYESNLYIRYDSYTWATLAYLWY HLA-B*15:89,YYAMYRNISTNTYENTAYIRYDSYTWAELAYLWY HLA-B*15:90,YYSEYRNICTNTYESNLYLRYDYYTWAELVYLWY HLA-B*15:91,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLSY HLA-B*15:92,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:93,YYSEYRNICTNTYESNLYLRYDSYTWAELAYTWY HLA-B*15:95,YYAMYQENMASTYENIAYWRYDSYTWAELAYLWY HLA-B*15:96,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:97,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:98,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:99,YYSEYRNICTNTYESNLYLRYDYYTWAERAYLWY HLA-B*15:101,YYAMYREIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B*15:102,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:103,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:104,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:105,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:106,YYAKYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:107,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*15:108,YYSEYRNICTNTYESNLYLRYDSYTWAELTYLWY HLA-B*15:109,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY HLA-B*15:110,YYAMYREISTNTYESNLYLRCDSYTWAEWAYLWY HLA-B*15:112,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:113,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:114,YYSEYRNICTNTYESNLYLRYDSYTWAVLAYEWY HLA-B*15:115,YYSEYRNICTNTYESTAYLRYDSYTWAELAYLWY HLA-B*15:116,YYAMYREISTNTYESNLYLRYDSYSLAEWAYLWY HLA-B*15:117,YYAMYREISTNTYESNLYLRYDSYTWAEWAYEWY HLA-B*15:118,YYAMYREISTNTYESNLYLMYDSYTWAEWAYLWY HLA-B*15:119,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:120,YYAMYRDISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:121,YYAMYRNISTNTYESNLYIRYDSYTWAELAYTWY HLA-B*15:122,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:123,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*15:124,YYSEYRNICTNTYESNLYLRYDSYSLAVLAYEWY HLA-B*15:125,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:126,YYAMYREISTNTYESNLYLSYDSCTWAEWAYLWY HLA-B*15:127,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:128,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:129,YYAMYREISTNTYESNLYLNYDSYTWAEWAYLWY HLA-B*15:131,YYSEYREISTNTYESNLYLRYDSYTWAELAYLSY HLA-B*15:132,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:133,YYSEYRNICTNTYESNLYLRYDFYTWAELAYLWY HLA-B*15:134,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:135,YYAMYREISTNTYENNLYLRYDSYTWAEWAYLWY HLA-B*15:136,YYAMYREISTNTYESNLYLRYDSYTWAVLTYLWY HLA-B*15:137,YYAMYREISTNTYESNLYWTYNFYTWAEWAYLWY HLA-B*15:138,YYAMYREISTNTYESNLYLRYDSYTWAELAYEWY HLA-B*15:139,YYAMYRNISANTYESNLYIRYDSYTWAELAYLWY HLA-B*15:140,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:141,YYAMYREISTNTYESNLYLTYDSYTWAEWAYLWY HLA-B*15:142,YDAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:143,YYAKYRNIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:144,YYAMYRNISTNTYESNLYIRYDSYTWAEWAYLWY HLA-B*15:145,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:146,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:147,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:148,YYAMYRNIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:150,YYAMYREISTNTYESNLYLRYNYYTWAEWAYLWY HLA-B*15:151,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*15:152,YYAMYREIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:153,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:154,YYAMYREISTNTYESNLYIRYDSYTWAEWAYLWY HLA-B*15:155,YYAMYREISTNTYESNLYWTYDSYTWAVLAYLWY HLA-B*15:156,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:157,YYAMYREISTNTYENIAYLRYDSYTWAEWAYLWY HLA-B*15:158,YYSEYREISTNTYESNLFLRYDSYTWAELAYLWY HLA-B*15:159,YYAMYREISTNTYESNLHLRYDSYTWAEWAYLWY HLA-B*15:160,YYAMHREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:161,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLSY HLA-B*15:162,YYAMYRENMASTYENIAYLRYHDYTWAALAYLWY HLA-B*15:163,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:164,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:165,YYAMYREISTNTYESNLYIRYDSYTWAEWAYLWY HLA-B*15:166,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:167,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:168,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B*15:169,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:170,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:171,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:172,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:173,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:174,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:175,YHAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:176,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:177,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B*15:178,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:179,YYAMYREISTNTYESNLYLRYDSYTWAVDAYLWY HLA-B*15:180,YDSEYRNIFTNTDESNLYLRYDSYTWAEWAYLWY HLA-B*15:183,YYTMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:184,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:185,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWH HLA-B*15:186,YYSEYRNICTNTYESNLYLRYDSYTWAVLTYTWY HLA-B*15:187,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:188,YYAMYREISTNTYESNLYLRYNYYTWAVLAYTWY HLA-B*15:189,YYAMYRNICTNTDESNLYLRYDSYTWAEWAYLWY HLA-B*15:191,YYAMYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:192,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:193,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:194,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:195,YYAMYREISTNTYESNLYLRFDSYTWAELAYLWY HLA-B*15:196,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B*15:197,YYSEYRNICTNTYESNLYLSYDSYTWAELAYLWY HLA-B*15:198,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:199,YYAMYREISTNTYESNLYLRYDSYTWAEDAYTWY HLA-B*15:200,YYSEYRNICTNTYESNLYLRYDSYTWATLAYLWY HLA-B*15:201,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:202,YYATYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*18:01,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:02,YHSTYRNISTNTYESNLYLNYDSYTWAVLAYTWH HLA-B*18:03,YHSTYRNISTNTDESNLYLRYDSYTWAVLAYTWH HLA-B*18:04,YYATYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:05,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:06,YHSTYRNISTNTYVSNLYLRYDSYTWAVLAYTWH HLA-B*18:07,YHSTYRNIFTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:08,YHSTYRNISTNTYESNLYLRCDSYTWAVLAYTWH HLA-B*18:09,YHSTYRNISTNTYENTAYLRYDSYTWAVLAYTWH HLA-B*18:10,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYEWY HLA-B*18:11,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWY HLA-B*18:12,YHSTYREISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:13,YHSTYRNISTNTYESNLYLRYDSYTWAVRAYTWH HLA-B*18:14,YHSTYRNISTNTYESNLYLSYDSYTWAVLAYTWH HLA-B*18:15,YHSTYRNISTNTYESNLYLRYDSYTWAELAYTWH HLA-B*18:18,YHSTYRNISTNTYESNLYLRSDSYTWAVLAYTWH HLA-B*18:19,YHSTYRNISTNTYESNLYLRYDSYTWAEWAYTWH HLA-B*18:20,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:21,YHSTYRNISTNTYESNLYLRYDSYTWAERAYEWY HLA-B*18:22,YHSTYRNISTNTYESNLYISYDSYTWAVLAYTWH HLA-B*18:24,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:25,YYSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:26,YHSTYRNISTNTYESNLYLRYNYYTWAVLAYTWH HLA-B*18:27,YHSTYRNISTNTYESNLYLMFDSYTWAVLAYTWH HLA-B*18:28,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:29,YHATYRNIFTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:30,YHSTYRNISTNTYESNLYLRYDSYTWAERAYTWH HLA-B*18:31,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:32,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:33,YHSTYRNICTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:34,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:35,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYEWY HLA-B*18:36,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYLWH HLA-B*18:37,YHSEYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:38,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:39,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:40,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:41,YHSTYRNISTNTYESNLYLRYESYTWAVLAYTWH HLA-B*18:42,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:43,YYSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:44,YHSTYRNISTNTYESNLYLWYDSYTWAVLAYTWH HLA-B*18:45,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:46,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:47,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:48,YHSKYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:49,YHSTYRNISTNTYENNLYLRYDSYTWAVLAYTWH HLA-B*18:50,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYEWH HLA-B*27:01,YHTEYREICAKTYENTAYLNYHDYTWAVLAYEWY HLA-B*27:02,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B*27:03,YHTEHREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:04,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B*27:05,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:06,YHTEYREICAKTDESTLYLNYDYYTWAELAYEWY HLA-B*27:07,YHTEYREICAKTDEDTLYLSYNYYTWAVLAYEWY HLA-B*27:08,YHTEYREICAKTDESNLYLNYHDYTWAVLAYEWY HLA-B*27:09,YHTEYREICAKTDEDTLYLNYHHYTWAVLAYEWY HLA-B*27:10,YHTEYREICAKTDEDTLYLNYHDYTWAELAYEWY HLA-B*27:11,YHTEYREICAKTDESTLYLSYNYYTWAVLAYEWY HLA-B*27:12,YHTEYREICTNTDESNLYLNYHDYTWAVLAYEWY HLA-B*27:13,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:14,YHTEYREICAKTDEDTLYWTYHDYTWAVLAYEWY HLA-B*27:15,YHTEYREICAKTDESTLYLNYHDYTWAELAYTWY HLA-B*27:16,YHTEYREICTNTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:17,YHTEFREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:18,YHTEYREISTNTYESNLYLNYHDYTWAELAYEWY HLA-B*27:19,YHTEYREICAKTDEDTLYIRYHDYTWAVLAYEWY HLA-B*27:20,YHTEYREICAKTDESTLYLNYNYYTWAELAYEWY HLA-B*27:21,YHTEYREICAKTDESTLYLRYDYYTWAELAYEWY HLA-B*27:23,YHTEYRNIFTNTYESTLYLNYHDYTWAVLAYEWY HLA-B*27:24,YHTEYREICAKTDESTLYLSYNYYSWAELAYEWY HLA-B*27:25,YHTEYREICAKTDESTLYLNYHDYTWAEWAYLWY HLA-B*27:26,YHTEYREICAQTDESNLYLNYHDYTWAVLAYEWY HLA-B*27:27,YHTEYREICAKTDEDTLYLNYNYYTWAVLAYEWY HLA-B*27:28,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYTWH HLA-B*27:29,YHTEYREISTNTYEDTLYLNYHDYTWAVLAYEWY HLA-B*27:30,YHTEYREICAKTDENIAYIRYHDYTWAVLAYEWY HLA-B*27:31,YHTEYREICAQTDESTLYLNYHDYTWAVLAYEWY HLA-B*27:32,YHTEYREICAKTDEDTLYLSYHDYTWAVLAYEWY HLA-B*27:33,YHTEYREICAKTDESNLYLSYNYYTWAVLAYEWY HLA-B*27:34,YHTEYREICAKTDEDTLYLSYDYYTWAVLAYEWY HLA-B*27:35,YHTEYREICAKTDEDTLYLNYNFYTWAVLAYEWY HLA-B*27:36,YHTEYREICAKTDESTLYLNYHDYSLAVLAYEWY HLA-B*27:37,YYTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:38,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYLWY HLA-B*27:39,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:40,YHTEYREICAKTDESNLYLNYHDYTWAELAYEWY HLA-B*27:41,YHTEYREICAKTDEDTLYLNYDSYTWAVLAYEWY HLA-B*27:42,YHTEYREICAKTDEDNLYLNYHDYTWAVLAYEWY HLA-B*27:43,YHTEYREICAKTDEDTLYLSYNYYTWAVLAYEWY HLA-B*27:44,YHTEYREICAKTYESNLYLNYHDYTWAVLAYEWY HLA-B*27:45,YHTEYREICAKTDEDTLYLNYHDYTWAVRAYEWY HLA-B*27:46,YHTEYREICAKTDEDTLYLNYHYYTWAVLAYEWY HLA-B*27:47,YHTEYREICAKTDEDTLYLNYHDYTWAVDAYLSY HLA-B*27:48,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:49,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:50,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYESY HLA-B*27:51,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:52,YHTTYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:53,YHTEYREICAKTDEDIAYLNYHDYTWAVLAYEWY HLA-B*27:54,YHTEYREICAKTDEDTLYLNYHDYTWAELAYEWY HLA-B*27:55,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:56,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:57,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B*27:58,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:60,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:61,YHTEYREICAKTDESTLYLNYHDYTWAVLAYEWY HLA-B*27:62,YHTEYREICAKTDENIAYLNYHDYTWAVLAYTWH HLA-B*27:63,YHTEYREICAKTDESTLYLNYHDYTWAELAYLWY HLA-B*27:67,YHTMYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:68,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B*27:69,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B*35:01,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:02,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:03,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:04,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:05,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:06,YYATYRNIFTNTYESNLYIRYNFYTWAVLAYLWY HLA-B*35:07,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:08,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:09,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:10,YYATYREIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:11,YYATYRNIFTNTYESNLYIRYDSYTWAELAYLWY HLA-B*35:12,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:13,YYATYREIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:14,YYATYRNIFTNTYESNLYIRYDSYTWAEWAYLWY HLA-B*35:15,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYEWY HLA-B*35:16,YYATYREIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B*35:17,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B*35:18,YYATYRNIFTNTYESNLYIRYNYYTWAVRAYLWY HLA-B*35:19,YYAKYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:20,YYATYRNISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:21,YYATYRNIFTNTYESNLYIRYDSYTWAELAYLWH HLA-B*35:22,YYATYRNIFTNTYESNLYLSYNYYTWAVLAYLWY HLA-B*35:23,YYATYRNIFTNTYESNLYIRFDSYTWAVLAYLWY HLA-B*35:24,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWH HLA-B*35:25,YYSEYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:26,YYAEYRNICTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:27,YYATYRNIFTNTYENNLYIRYDSYTWAVLAYLWY HLA-B*35:28,YYATYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:29,YYATYRNIFTNTDESNLYIRYDSYTWAVLAYLWY HLA-B*35:30,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B*35:31,YYATYRNIFTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*35:32,YYATYRNIFTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*35:33,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYEWY HLA-B*35:34,YYATYRNIFTNTYESNLYIRYDYYTWAVLAYLWY HLA-B*35:35,YYATYRNIFTNTYESNLYIRYDSYTWAVLTYTWY HLA-B*35:36,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:37,YYATYRNIFTNTYESNLYWTYDSYTWAVLAYLWY HLA-B*35:38,YYATYRNIFTNTYESNLYIRYDFYTWAVDAYLWY HLA-B*35:39,YYATYRNIFTNTYESNLYIRYDYYTWAVLAYLWY HLA-B*35:41,YYATYRNIFTNTYESNLYIRYDSCTWAVLAYLWY HLA-B*35:42,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:43,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:44,YYATYRNIFTNTYESNLYLRYNYYTWAEWAYLWY HLA-B*35:45,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLSY HLA-B*35:46,YYAMYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:47,YYAKYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:48,YYATYRNIFTNTYESNLYIRSDSYTWAVLAYLWY HLA-B*35:49,YYAEYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:50,YHATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:51,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:52,YYATYRNIFTNTYECNLYIRYDSYTWAVLAYLWY HLA-B*35:54,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:55,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:56,YYATYRNIFTNTYENNLYIRYDFYTWAVLAYLWY HLA-B*35:57,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:58,YYATYRNIFTNTYESNLYLSYDSYTWAELAYLWY HLA-B*35:59,YYATYRNIFTNTYESNLYIRYNFYTWAVLAYLWY HLA-B*35:60,YYATYRNIFTNTYESNLYWTYNLYTWAVLAYTWY HLA-B*35:61,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:62,YYATYRNIFTNTYESNLYIRYDSYTWAVWAYLWY HLA-B*35:63,YHTKYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:64,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:66,YYATYRNIFTNTYESNLYLSYDSYTWAVRAYEWY HLA-B*35:67,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:68,YYATYRNIFTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*35:69,YYATYREIFTNTDESNLYIRYDSYTWAVLAYLWY HLA-B*35:70,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:71,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLSY HLA-B*35:72,YYATYRNISTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:74,YYATYRNIFTNTYVSNLYIRYDFYTWAVLAYLWY HLA-B*35:75,YYATYRNIFTNTYESNLYLRYDFYTWAVLAYLWY HLA-B*35:76,YYATYRNIYAQTDESNLYIRYDSYTWAVLAYLWY HLA-B*35:77,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:78,YYATYRNIFANTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:79,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:80,YYATYREIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:81,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWH HLA-B*35:82,YYATYRNICTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:83,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:84,YHTTYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:85,YYATYRNICTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:86,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYEWY HLA-B*35:87,YYATYRNIFTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*35:88,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*35:89,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:90,YYTTYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:91,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:92,YYATYRNIFTNAYESNLYIRYDSYTWAVLAYLWY HLA-B*35:93,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYTWY HLA-B*35:94,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:95,YYATYRNISTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:96,YYATYRNIFTNTYESNLYIRYDFYTWAELAYTWH HLA-B*35:97,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:98,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:99,YYATYRNIFTNTYESNLYLRYDSYTWAERAYLWY HLA-B*35:100,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:101,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:102,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:103,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:104,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:105,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:106,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:107,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:108,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:109,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWH HLA-B*35:110,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:111,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:112,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:113,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B*35:114,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:115,YYATYRNIFTNTYESNLYIRYDSYTWAVDAYLWY HLA-B*35:116,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:117,YYATYRNIFTNTYESNLYLSYDSYTWAEWAYLWY HLA-B*35:118,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:119,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:120,YYATYRNIFTNTYESNLYIRHDSYTWAVLAYLWY HLA-B*35:121,YYATYRNIFTNTYESNLYIRYHSYTWAVLAYLWY HLA-B*35:122,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:123,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:124,YYSTYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:125,YYSTYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B*35:126,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:127,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:128,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:131,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:132,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:133,YYATYRNIFTNTYESNLYIRYVSYTWAVLAYLWY HLA-B*35:135,YYATYRNICTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:136,YYATYRNIFTNTDESNLYIRYDFYTWAVLAYLWY HLA-B*35:137,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:138,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:139,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:140,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:141,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:142,YYSTYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:143,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:144,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*37:01,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:02,YHSTYREISTNTYEDTLYLNYHDYTWAVLAYEWY HLA-B*37:04,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWH HLA-B*37:05,YHSTYREISTNTYEDNLYIRSNFYTWAVDAYTWY HLA-B*37:06,YHSKYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:07,YHSTYREISTNTYEDTLYLSYDYYTWAERAYEWY HLA-B*37:08,YHSTYRNISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:09,YHSTYREISTNTYEDTLYLSYDYYTWAVDAYTWY HLA-B*37:10,YHSTYREISTNTYENTAYIRSNFYTWAVDAYTWY HLA-B*37:11,YHSTYREISTNTYESNLYIRSNFYTWAVDAYTWY HLA-B*37:12,YHSTYREISTNTYEDTLYIRYNYYTWAVDAYTWY HLA-B*37:13,YHSTYREISTNTYEDTLYIRSNFYTWAEDAYTWY HLA-B*37:14,YHSTYREISTNTYESNLYIRSNFYTWAVDAYTWY HLA-B*37:15,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:17,YHSTYREISTNTYEDTLYIRSNFYTWTVDAYTWY HLA-B*37:18,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:19,YHSTYREISTNTYEDTLYIRYNFYTWAVDAYTWY HLA-B*37:20,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:21,YHSTYREIFTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:22,YHATYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:23,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*38:01,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:02,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B*38:03,YYSEYREISTNTDESTAYLRYNFYTWAVLTYTWY HLA-B*38:04,YYSEYREICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B*38:05,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:06,YYSTYRNIFTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:07,YYSTYRNIFTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:08,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYMWY HLA-B*38:09,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:10,YYSEYRNICTNTYENIAYLRYNFYTWAELAYTWY HLA-B*38:11,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:12,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:13,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:14,YYSEYRNICTNTDENIAYLRYNFYTWAVLTYTWY HLA-B*38:15,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B*38:16,YYTEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:17,YYSEYRNICTNTYEDTLYLRYNFYTWAVLTYTWY HLA-B*38:18,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B*38:19,YYSEYRNICTNTYENIAYLSYNFYTWAVLTYTWY HLA-B*38:20,YYSEYRNICTNTYENIAYIRYNFYTWAVLTYTWY HLA-B*38:21,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:22,YYSEYRNICTNTYENIAYLNYNFYTWAVLTYKWY HLA-B*38:23,YYSEYRNICTNTYENTAYFRYNFYTWAVLTYTWY HLA-B*39:01,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:02,YYSEYREISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:03,YYSEYRNICTNTDESNLYLSYNFYTWAVLTYTWY HLA-B*39:04,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:05,YYSEYRNICTNTYESNLYLRYNFYTWAVLTYTWY HLA-B*39:06,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY HLA-B*39:07,YYSEYRNICTNTYESNLYLRYDSYTWAVLTYTWY HLA-B*39:08,YYSEYREISTNTYESNLYLRYNFYTWAVRTYTWY HLA-B*39:09,YYSEYRNICTNTDESNLYLRSNFYTWAVLTYTWY HLA-B*39:10,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:11,YYSEYRNICTNTYESNLYLRYNFYTWAVRTYTWY HLA-B*39:12,YDSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:13,YYSEYREISTNTYESNLYLRYNFYTWAVLTYTWY HLA-B*39:14,YYSEYRNICTNTDESNLYLSYNYYTWAVLTYTWY HLA-B*39:15,YYSEYRNICTNTDESNLYLRYDFYTWAVLTYTWY HLA-B*39:16,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:17,YYSEYRNIYTNTDESNLYLRYNLYTWAVLTYTWY HLA-B*39:18,YYSEYRNICTNTDESNLYLRYNFYTWAEWTYTWY HLA-B*39:19,YYSTYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:20,YYSEYRNIYTNTYENNLYLRYNFYTWAVLTYTWY HLA-B*39:22,YYSEYREICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:23,YYSEYREISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:24,YYSEYRNICTNTDESNLYLSYNFYTWAVLTYTWY HLA-B*39:26,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:27,YYSEYRNICTNTDVSNLYLRYNFYTWAVLTYTWY HLA-B*39:28,YYSEYRNICTNTDESNLYLTYNFYTWAVLTYTWY HLA-B*39:29,YYSEYRNICTNTDESNLYLSYDYYTWAVLTYTWY HLA-B*39:30,YYSEYRNICTNTDESNLYLRYNFYTWAVLAYTWY HLA-B*39:31,YHSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:32,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYLWH HLA-B*39:33,YYSEYRNICTNTDESNLYWTYNFYTWAVRAYLWY HLA-B*39:34,YYSEYRNICTNTDESNLYWTYNFYTWAVLAYTWY HLA-B*39:35,YYSEYRNICTNTDESNLYLRYNFYTWAELTYTWY HLA-B*39:36,YYSEYRNICTNTDESNLYLRYNFYTWAEWAYTWY HLA-B*39:37,YYSEYRNICTNTYESNLYLSYNFYTWAVLTYTWY HLA-B*39:39,YYSEYRNISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:41,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:42,YYSEYRNICTNTDESNLYIRYNFYTWAVLTYTWY HLA-B*39:43,YYSEYRNICTNTDESNLYLRYDSYTWAVLAYTWH HLA-B*39:44,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:45,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:46,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:47,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYEWY HLA-B*39:48,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWH HLA-B*39:49,YYSEYREISTNTYESNLYLRYDFYTWAVLTYTWY HLA-B*39:50,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYEWY HLA-B*39:51,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:52,YYSEYRNICTDTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:53,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:54,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:55,YYSEYRNICTNTYESNLYLRYDFYTWAVLTYTWY HLA-B*39:56,YYSEYRNICTNTYESNLYLRYNFYTWAVLTYTWY HLA-B*39:57,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY HLA-B*39:58,YYSEYRNIFTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:59,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:60,YYSEYRNICTNTDESNLYLRYNFYTWAALTYTWY HLA-B*40:01,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:02,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:03,YHTKYREISTNTYESNLYLSYDSYTWAVLAYEWY HLA-B*40:04,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*40:05,YHTKYREISTNTYESNLYLSYNYYTWAELAYLWY HLA-B*40:06,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:07,YHTKYREIFTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:08,YHTKYRNIFTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:09,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY HLA-B*40:10,YYAKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:11,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY HLA-B*40:12,YYSEYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:13,YHTKYREIFTNTYENIAYLSYNYYTWAVLAYEWY HLA-B*40:14,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY HLA-B*40:15,YHTKYREISTNTYESNLYLSYNYYTWAERAYEWY HLA-B*40:16,YHTKYREISTNTYESNLYLSYNYYTWAERAYEWY HLA-B*40:18,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY HLA-B*40:19,YHTKYREISTNTYENIAYLSYNYYTWAVLAYEWY HLA-B*40:20,YHTKYREISTNTYESNLYLRYDSYTWAVLAYEWY HLA-B*40:21,YYAMYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:23,YHTKYREISTNTYESNLYLRYNYYSWAERAYEWY HLA-B*40:24,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY HLA-B*40:25,YHTKYRNISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:26,YHTKYREISTNTYESNLYLRYNYYTWAELAYLWY HLA-B*40:27,YHTKYREISTNTYESNLYLSYNNYTWAVLAYEWY HLA-B*40:28,YHTKYREISTNTYESNLYIRYNYYTWAELAYLWH HLA-B*40:29,YHTKYPEISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:30,YHTKYREISTNTYESNLYIVYNYYSLAVLAYEWY HLA-B*40:31,YHTKYREISTNTYESNLYLSYDYYSLAVLAYEWY HLA-B*40:32,YHTKYREISTNTYESNLYLSYDYYTWAERAYEWY HLA-B*40:33,YHTKYREISTNTYESNLYLRYDYYSLAVLAYEWY HLA-B*40:34,YHTKYREISTNTYESNLYIVYNYYSLAVLAYEWY HLA-B*40:35,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:36,YHTKYREISTNTYESNLYLRYNFYSLAVLAYEWY HLA-B*40:37,YHTKYREISTNTYENNLYLSYNYYTWAVLAYEWY HLA-B*40:38,YHTKYREISTNTYESNLYLRYNSYSLAVLAYEWY HLA-B*40:39,YHTKYREISTNTYESNLYLSYNYYTWAVLAYTWY HLA-B*40:40,YYTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:42,YHTKYREISTNTYESNLYLRYDYYSLAVLAYEWY HLA-B*40:43,YHTKYREISTNTDESNLYLRYNYYSLAVLAYEWY HLA-B*40:44,YHTKYREISTNTYESNLYWTYDYYTWAVLAYEWY HLA-B*40:45,YHTKYREISTNTYESNLYLSYNYYSWAVLAYEWY HLA-B*40:46,YHTEYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:47,YHTKYREISTNTYENTAYLRYNYYSLAVLAYEWY HLA-B*40:48,YHTKYREISTNTYESNLYLRYNLYSLAVLAYEWY HLA-B*40:49,YYTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:50,YHTKYREISTNTDESNLYLSYNYYTWAVLAYEWY HLA-B*40:51,YHTKYREISTNTYESNLYLRYNYYSWAELAYTWH HLA-B*40:52,YHTKYREISTNTYESNLYLRYDSYSLAVLAYEWY HLA-B*40:53,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:54,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:55,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:56,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:57,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:58,YYAKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:59,YHTKYREISTNTYESNLYIRYDSYSLAVLAYEWY HLA-B*40:60,YHTKYREISTNTYESNLYLRSDSYSLAVLAYEWY HLA-B*40:61,YHTKYREIYTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:62,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:63,YHTKYREISTNTYESNLYLRYNYYSLAVLAYLWY HLA-B*40:64,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*40:65,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:66,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:67,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:68,YHTKYRNIFTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*40:69,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:70,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:71,YHTKYREISTNTYESNLYLSYNLYTWAVLAYLWY HLA-B*40:72,YHTKYREISTNTYESNLYLRYNYYTLAVLAYEWY HLA-B*40:73,YHTKYREISTNTYVSNLYLRYNYYSLAVLAYEWY HLA-B*40:74,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:75,YHTKYREICTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:76,YHTKYREISTNTYESKLYLRYNYYSLAVLAYEWY HLA-B*40:77,YHTKYREISTNTYESNLYLRYNFYTLAVLAYEWY HLA-B*40:78,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:79,YHTKYREISTNTYESNLHLRYNYYSLAVLAYEWY HLA-B*40:80,YHTKYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*40:81,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:82,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:83,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:84,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:85,YHTKYREISTNTYESNLYLSYNYYIWAVLAYEWY HLA-B*40:86,YHTKYREISTNTYESNLYWTYNFYTWAVLAYEWY HLA-B*40:87,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:88,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:89,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:90,YHTKYREISTNTYESNLYLSYNYYTWAVLAHEWY HLA-B*40:91,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:92,YHTKYREISTNTYESNLYLRYNYYSLAVLAYLWY HLA-B*40:93,YHTEYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:94,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:95,YHTKYREISTNTYESNLYWTYNYYTWAELAYEWY HLA-B*40:96,YHTKYREISTNTYENTAYWTYNYYTWAVLAYEWY HLA-B*40:97,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:98,YHTKYREISTNTYESNLYLSYDYYTWAERAYEWY HLA-B*40:99,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*40:100,YHTKYREISTNTYESNLYLRFNYYSLAVLAYEWY HLA-B*40:101,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:102,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:103,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:104,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:105,YHTKYREISTNTYESNLYLSYNSYTWAVLAYEWY HLA-B*40:106,YHTKYRNIFTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:107,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:108,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:109,YHTKYREISTNTYESIAYWTYNYYTWAVLAYEWY HLA-B*40:110,YYTKYREISTNTYENTAYWTYNYYTWAVLAYEWY HLA-B*40:111,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:112,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:113,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWH HLA-B*40:114,YHTKYREISTNTYESNLYLRYNYYSWAVLAYEWY HLA-B*40:115,YHTKYWEISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:116,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:117,YHTKYREISTNTYENIAYLRYNYYSLAVLAYEWY HLA-B*40:119,YHTKYREISTNTYDSNLYLSYNYYTWAVLAYEWY HLA-B*40:120,YHTKYREISTNTYESNLYIRYDYYTWAVLAYEWY HLA-B*40:121,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY HLA-B*40:122,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:123,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:124,YHTKYREISTNTYESNLYLRYHDYSLAVLAYEWY HLA-B*40:125,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:126,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:127,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:128,YHTKYREISTNTYESNLYLRYNYYSLAVRAYEWY HLA-B*40:129,YYTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*40:130,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:131,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:132,YHTKYREISTNTYESNLYLRYNYYSLAVLAYESY HLA-B*40:134,YHTKYREISTNIYESNLYLRYNYYSLAVLAYEWY HLA-B*40:135,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:136,YHTKYREISTNTYESNLYLRYNYYTWAVDAYEWY HLA-B*40:137,YYAMYREISTNTYESNLYIRYNYYSLAVLAYEWY HLA-B*40:138,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:139,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:140,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:141,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:143,YHTKYREISTNTYESNLYLSFNYYTWAVLAYEWY HLA-B*40:145,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:146,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:147,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*41:01,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B*41:02,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*41:03,YHTKYREISTNTYESNLYLRYNYYTWAVDAYTWY HLA-B*41:04,YHTKYREISTNTYESNLYLSYDYYTWAVDAYTWY HLA-B*41:05,YHTKYREISTNTYESKLYWRYNYYTWAVDAYTWY HLA-B*41:06,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B*41:07,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B*41:08,YHTKYREISTNTYESNLYLRYNYYTWAVDAYTWY HLA-B*41:09,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B*41:10,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*41:11,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*41:12,YHAKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B*42:01,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:02,YHSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:04,YYSEYRNIYAQTDESNLYWTYNYYTWAVDAYTWY HLA-B*42:05,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:06,YYSEYRNIYAQTDESNLYLSYNFYTWAVDAYTWY HLA-B*42:07,YYSEYRNIYTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:08,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:09,YHSEYRNIYAQTDESNLYLSYDSYTWAVDAYTWY HLA-B*42:10,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:11,YYSEYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*42:12,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:13,YYSEYRNIYAQTDESNLYIRYNYYTWAVDAYTWY HLA-B*42:14,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*44:02,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:03,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:04,YYTKYREISTNTYENTAYIRYDDYTWAVRAYTSY HLA-B*44:05,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B*44:06,YYATYRNIFTNTYENIAYIRYDDYTWAVDAYLSY HLA-B*44:07,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:08,YYTMYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:09,YYTKYREISTNTYESNLYIRYDDYTWAVDAYLSY HLA-B*44:10,YYTKYREISTNTYENTAYIRFNLYTWAVLAYLSY HLA-B*44:11,YYTKYREISTNTYENTPYIRYDDYTWAVDAYLSY HLA-B*44:12,YYTKYRNISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:13,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:14,YYTKYREISTNTYENTAYIRYNDYTWAVDAYLSY HLA-B*44:15,YHTKYREISTNTYESTAYWRYNLYTWAVDAYLSY HLA-B*44:16,YYTKYREISTNTYENTAYIRYDDYTWAVDAYEWY HLA-B*44:17,YYTKYREISTNTYENTAYIRYDSYTWAVDAYLSY HLA-B*44:18,YHTKYREISTNTYENIAYWRYNLYTWAVDAYLSY HLA-B*44:20,YYTKYREISTNTYENTAYWTYDDYTWAVDAYLSY HLA-B*44:21,YYTKYREISTNTYENTAYIRYDDYTWAVDAYESY HLA-B*44:22,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:24,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:25,YYTKYREISTNTYENIAYIRYDYYTWAVDAYLSY HLA-B*44:26,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:27,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:28,YYTKYREISTNTYENTAYIRYDDYTWAVRAYLSY HLA-B*44:29,YYTKYREISTNTYENTAYIRYDDYTWAVLTYLSY HLA-B*44:30,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:31,YYTKYREISTNTYENTAYLRYNYYSLAVLAYESY HLA-B*44:32,YYTKYPEISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:33,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:34,YYAKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:35,YYTKYREISTNTYENTAYIRYDDYTWAVEAYLSY HLA-B*44:36,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:37,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLWY HLA-B*44:38,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:39,YYPKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:40,YYTEYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:41,YYTKYREISTNTYENTAYLRYDDYTWAVDAYLSY HLA-B*44:42,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLWY HLA-B*44:43,YYTKYREISTNTYENTAYIRYDSYTWAVLAYLSY HLA-B*44:44,YYTEYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:45,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:46,YYTKYREISTNTYESNLYIRYDDYTWAVLAYLSY HLA-B*44:47,YYTKYREISTNTYENTAYWTYDDYTWAVLAYLSY HLA-B*44:48,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:49,YDTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:50,YYTKYREISTNTYENIAYIRYDDYTWAVLAYLSY HLA-B*44:51,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:53,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:54,YYTKYREISTNTYENTAYLSYDDYTWAVLAYLSY HLA-B*44:55,YHTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:57,YYTMYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:59,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:60,YYTMYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:62,YYTKYREISTNTYENTAYIRYNYYTWAVDAYLSY HLA-B*44:63,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:64,YYTKYREISTNTYENTAYIRYDDYTWAVLAYEWY HLA-B*44:65,YYTKYREISTNTYENTAYLRYDDYTWAVLAYLSY HLA-B*44:66,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:67,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:68,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:69,YYTKYWEISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:70,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B*44:71,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:72,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:73,YYTKYREISTNTYENTAYIRYDDYTWAVDGYLSY HLA-B*44:74,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:75,YYTKYREISTNTYENNLYIRYDYYTWAVDAYLSY HLA-B*44:76,YYTKYREISTNTYENTAYIRYDDYTWAERAYLSY HLA-B*44:77,YYTKYREISTNTYENTAYIRYNYYTWAVLAYLSY HLA-B*44:78,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B*44:79,YYTKYREISTNTYENTAYIRYDDYTWAELAYLSY HLA-B*44:80,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:81,YYTNYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:82,YYTKYREISTNTYENTAYIRYNYYTWAVLAYLSY HLA-B*44:83,YYATYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:84,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:85,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:86,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:87,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:88,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:89,YYTKYREISTNTYENTAYIRYDDYTWAVDTYLSY HLA-B*44:90,YYTKYREIYAQTDESNLYIRYDDYTWAVDAYLSY HLA-B*44:91,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLWY HLA-B*44:92,YYTKYREISTNTYENTAYIRYDDYTWAMLAYLSY HLA-B*44:93,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:94,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:95,YYTKYREISTNTYENIAYIRYDDYTWAVDAYLSY HLA-B*44:96,YYTKYREISTNTYENTAYIGYDDYTWAVLAYLSY HLA-B*44:97,YYTKYREICAKTDENTAYIRYDDYTWAVDAYLSY HLA-B*44:98,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:99,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:100,YYTKYREISTNTYENTAYWRYDDYTWAVDAYLSY HLA-B*44:101,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:102,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:103,YHTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:104,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:105,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:106,YYTKYREISTNTYENTAYLSYDDYTWAVDAYLSY HLA-B*44:107,YYTKYREISTNTYENTAYIRYDYYTWAVLAYLSY HLA-B*44:109,YYTKYREISTNTYESTAYIRYDDYTWAVLAYLSY HLA-B*44:110,YYTKYREISTNTYENTAYISYDDYTWAVLAYLSY HLA-B*45:01,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B*45:02,YHTKYREISTNTYESNLYWRYNFYTWAVDAYLSY HLA-B*45:03,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B*45:04,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLWY HLA-B*45:05,YHTKYREISTNTYESNLYWRYNLYTWAVDVYLSY HLA-B*45:06,YHTKYREIYAQTDESNLYWRYNLYTWAVDAYLSY HLA-B*45:07,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B*45:08,YHTKYREISTNTYESNLYWRYNLYTWAVDAYTWY HLA-B*45:09,YHTKYREISTNTYESNLYWRYDSYTWAVDAYLSY HLA-B*45:10,YHTKYREISTNTYESNLYWRYNLYTWAVDAYEWY HLA-B*45:11,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B*45:12,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B*46:01,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:02,YYAMYREKYRQTGVSNLYLRYDSYTWAEWAYLWY HLA-B*46:03,YYAMYREKYRQTDVSNLYLRYDSYTWAERAYTWY HLA-B*46:04,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:05,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:06,YYAMYREKYRQTDVSNLYLRYDSYSLAVLAYEWY HLA-B*46:08,YYAMYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-B*46:09,YYAMYREKYRQTDVSNLYLRYDSYTWAVWAYLWY HLA-B*46:10,YYTMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:11,YYAMYREKYRQTDVSNLYWTYNLYTWAVLAYLWY HLA-B*46:12,YYAMYREKYRQTDVSNLYLSYDSYTWAEWAYLWY HLA-B*46:13,YYAMYREKYRQTDVSNLYLRYDSYTWAVLAYLWY HLA-B*46:14,YHAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:16,YYAMYREKFRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:17,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLSY HLA-B*46:18,YYAMYREKYRQTDVSNLYWTYNLYTWAVLAYTWY HLA-B*46:19,YYAMYREKYRQTDVSNLYLRYDSYTWAVLTYLWY HLA-B*46:20,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:21,YYAMYREKYRQTDVSNLYLRYDSYTWAVLAYTWY HLA-B*46:22,YYAMYREKYRRTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:23,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:24,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*47:01,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYEWY HLA-B*47:02,YYTKYREISTNTYESNLYLRFHDYTWAVLAYEWY HLA-B*47:03,YYTKYREISTNTYESNLYLRFHDYTWAVLAYEWY HLA-B*47:04,YYTKYREISTNTYENTAYLNYHDYTWAVLAYEWY HLA-B*47:05,YYTKYREISTNTYEDTLYLNYHDYTWAVLAYEWY HLA-B*47:06,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYEWY HLA-B*47:07,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYEWY HLA-B*48:01,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:02,YYSEYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*48:03,YYSEYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*48:04,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:05,YYSEYREISTNTYESNLYLSYNYYTWAERAYEWY HLA-B*48:06,YYSEYRNIFTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:07,YYSEYREISTNTYESNLYLSYNFYSLAVLAYEWY HLA-B*48:08,YYSEYREISTNTYESNLYLSYDYYTWAERAYEWY HLA-B*48:09,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:10,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*48:11,YYSEYREISTNTYESNLYLSYNYYSLAVLAYELY HLA-B*48:12,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*48:13,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*48:14,YYSEYREISTNTYESNLYLSYNSYTLAVLAYEWY HLA-B*48:15,YYSEYREISTNTYESNLYLSYNYYSLAELAYEWY HLA-B*48:16,YYSEYRVISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:17,YYSEYREISTNTYESNLYIRYNFYSLAVLAYEWY HLA-B*48:18,YYSEYREISTNTYESIAYLSYNYYSLAVLAYEWY HLA-B*48:19,YYSEYREISTNTYESNLYLSYNYYSLAVWAYEWY HLA-B*48:20,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:21,YYSEYREISTNTYESNLYLNYNYYSLAVLAYEWY HLA-B*48:22,YHSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:23,YYSEYREISTNTYESNLYLRYDSYSLAVLAYEWY HLA-B*49:01,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B*49:02,YHTKYREISTNTYENTAYWRYNLYTWAELAYLWY HLA-B*49:03,YHATYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B*49:04,YHTKYREISTNTYENIAYWRYDSYTWAELAYLWY HLA-B*49:05,YHTKYREISTNTYENIAYWRYDSYTWAELAYLWY HLA-B*49:06,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B*49:07,YHTKYREISTNTYENIAYWRYNLYTWAELAYEWY HLA-B*49:08,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B*49:09,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWH HLA-B*49:10,YYTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B*50:01,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:02,YHTKYREISTNTYESNLYWRYNLYTWAELAYLSY HLA-B*50:04,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:05,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:06,YHTRYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:07,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:08,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:09,YHTKYREISTNTYESNLYWRYNFYTWAELAYLWY HLA-B*51:01,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:02,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWY HLA-B*51:03,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLGH HLA-B*51:04,YYATYRNIFTNTYENIAYIRYNYYTWAELAYLWH HLA-B*51:05,YYATYRNIFTNTYENIAYWTYNYYTWAVRAYLWY HLA-B*51:06,YYATYRNIFTNTYENIAYLRYNYYTWAELAYLWH HLA-B*51:07,YYATYRNISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:08,YYATYRNIFTNTYENIAYWTYNYYTWAVDAYLWH HLA-B*51:09,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWH HLA-B*51:12,YYATYRNIFTNTYENIADWTYNYYTWAELAYLWH HLA-B*51:13,YYATYRNIFTNTYENIAYWTYNFYTWAELAYLWH HLA-B*51:14,YYATYRNIFTNTYENIAYWTYKYYTWAELAYLWH HLA-B*51:15,YYATYRNIFTNTYENIAYWTYNLYTWAVLAYLWY HLA-B*51:16,YYATYRNIFTNTYENIAYWTYNYYTWAELAYEWH HLA-B*51:17,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:18,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:19,YYATYRNIFTNTYENIAYWTYNYYTWAVLTYLWH HLA-B*51:20,YYATYRNIFTNTDENIAYWTYNYYTWAVDAYLWH HLA-B*51:21,YYATYRNIFTNTYENIAYWTYNYYTWAELAYTWH HLA-B*51:22,YYATYRNICTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:23,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLSY HLA-B*51:24,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:26,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:28,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:29,YYATYRNIFTNTYENIAYWTYNYYTWAERAYLWH HLA-B*51:30,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:31,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYEWH HLA-B*51:32,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:33,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:34,YYATYRNIFTNTYENIAYWTYNYYTWAELAYEWY HLA-B*51:35,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:36,YYATYRNIFTNTYENIAYWTYNYYTWAEDAYTWY HLA-B*51:37,YYATYRNIFTNTYENIAYWTYDSYTWAELAYLWH HLA-B*51:38,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:39,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:40,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWY HLA-B*51:42,YYATYRNIFTNTYENIAYIRYDDYTWAVLAYLSY HLA-B*51:43,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:45,YYATYRNIFTNTYENIAYLRYDSYTWAELAYLWH HLA-B*51:46,YYATYRNIFTNTYENIAYITYNYYTWAELAYLWH HLA-B*51:48,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:49,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:50,YYATYRNIFTNTYENGLYWTYNYYTWAELAYLWH HLA-B*51:51,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:52,YYATYRNIFTNTHENIAYWTYNYYTWAELAYLWH HLA-B*51:53,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:54,YYATYRNIFTNTYENTAYWTYNYYTWAVRAYLWY HLA-B*51:55,YYATYRNIFTNTYENIAYWTYNYYTWAEQAYLWH HLA-B*51:56,YYATYRNIFTNTYENIAYIRYNYYTWAELAYLWH HLA-B*51:57,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:58,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:59,YYATYRNIFTNTYENIAYLRYNYYTWAELAYLWY HLA-B*51:60,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:61,YYATYRNIFTNTYENIAYWTYNYYTWAEWAYLWH HLA-B*51:62,YYATYRNIFTNTYENIAYLRYNLYTWAELAYLWH HLA-B*51:63,YYATYRNIFTNTYENIAYWTYNSYTWAELAYLWH HLA-B*51:64,YYATYRNIFTNTYENIAYLSYNYYTWAELAYLWH HLA-B*51:65,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:66,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:67,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:68,YDATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:69,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:70,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:71,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:72,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:73,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWH HLA-B*51:74,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:75,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:76,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:77,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:78,YYATYRNIFTNTYENTAYWTYNYYTWAELAYLWH HLA-B*51:79,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:80,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:81,YYATYRNIFTNTYENIAYLSYNYYTWAVLAYEWY HLA-B*51:82,YYATYRNIFTNTYENIAYWTYNYYTWAERAYEWH HLA-B*51:83,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:84,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:85,YYATYRNIFTNTYENIAYWTYHDYTWAELAYLWH HLA-B*51:86,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:87,YYATYRNIFTNTYENIAYWTYNYYTWADLAYLWH HLA-B*51:88,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:89,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:90,YYATYRNIFTNTYENIAYWTYDYYTWAELAYLWH HLA-B*51:91,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:92,YYATYRNIFTNTYENIAYWTYDFYTWAELAYLWH HLA-B*51:93,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYEWY HLA-B*51:94,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:95,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:96,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:01,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:02,YYAMYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:03,YYATYREISTNTYENIAYWTYNYYTWAVLAYLWY HLA-B*52:04,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:05,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:06,YYATYREIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:07,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:08,YYATYREISTNTYENIAYWTYNYYTWAELAYEWH HLA-B*52:09,YYATYREISTNTYESIAYWTYNYYTWAELAYLWH HLA-B*52:10,YYATYREISTNTYENIAYWTYNYYTWAVLAYLWH HLA-B*52:11,YYATYREISTNTYENIAYWTYNYYTWAELAYLWY HLA-B*52:12,YYATYREISTNTYENIAYWTYDYYTWAELAYLWH HLA-B*52:13,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:14,YYATYREISTNTYENIAYWTYNFYTWAELAYLWH HLA-B*52:15,YYATYREISTNTYENIAYWTYNYYTWAELAYLSH HLA-B*52:16,YYSEYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:17,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:18,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:19,YYATYREISTNTYENIAYWTYNYYTWAVDAYLWH HLA-B*52:20,YYATYREISTNTYENTAYWTYNYYTWAELAYLWH HLA-B*52:21,YYATYREISTNTYENIAYWTYNYYTWAEWAYLWH HLA-B*53:01,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:02,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWH HLA-B*53:03,YYATYRNIFTNTYEDTLYIRYDSYTWAVLAYLWY HLA-B*53:04,YYATYRNIFTNTYENIAYIRYDFYTWAVLAYLWY HLA-B*53:05,YYATYRNIFTNTYESIAYIRYDSYTWAVLAYLWY HLA-B*53:06,YYATYRNIFTNTYENIAYIRYDSYTWAELAYLWH HLA-B*53:07,YYATYRNIFTNTYENIAYIRSNFYTWAVLAYLWY HLA-B*53:08,YYATYRNIFTNTYENIAYIRYDSYTWAELAYLWY HLA-B*53:09,YYATYRNISTNTYENTAYIRYDSYTWAVLAYLWY HLA-B*53:10,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:11,YYATYRNIFTNTYENTAYIRYDSYTWAVRAYLWY HLA-B*53:12,YYATYRNIFTNTYESTAYIRYDSYTWAVLAYLWY HLA-B*53:13,YYATYRNIFTNTYENTAYIRYDSYTWAVLAYLWY HLA-B*53:14,YYATYRNIFTNTYENIAYLSYDSYTWAVLAYLWY HLA-B*53:15,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:16,YYATYRNIFTNTYESIAYIRYDSYTWAVRAYLWY HLA-B*53:17,YYATYREISTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:18,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:19,YYATYRNIFTNTYENIAYIRYNYYTWAVLAYLWY HLA-B*53:20,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:21,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:22,YYATYRNIFTNTYENIAYIRYDSYTWAVDAYLSY HLA-B*53:23,YYATYRNIFTNTDENIAYIRYDSYTWAVLAYLWY HLA-B*54:01,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:02,YHAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:03,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*54:04,YYAGYRNIYAQTDESNLYWTYNYYTWAVLAYTWY HLA-B*54:06,YYAGYRNIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B*54:07,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:09,YYAGYRNIYAQTDESNLYLRYDSYTWAVLAYTWY HLA-B*54:10,YYAGYRNIYAQTDESNLYWTYNLYTWAVRAYTWY HLA-B*54:11,YYAGYRNIYAQTDESNLYWTYNYYSWAVLAYTWY HLA-B*54:12,YYAGYRNIYAQTDENIAYWTYNLYTWAVLAYTWY HLA-B*54:13,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:14,YYAGYRNIYAQTDESNLYWTYDSYTWAVLAYTWY HLA-B*54:15,YYAGYRNIYAQTDESNLYWTYDYYTWAVLAYTWY HLA-B*54:16,YYAGYRNIYAQTDESNLYWTYDLYTWAVLAYTWY HLA-B*54:17,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:18,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:19,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:20,YYAGYRNIYAQTDESNLYWTYNLYTWAERAYTWY HLA-B*54:21,YYSGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:22,YYAGYRNIYAQTDESNLYWTYNLYSWAVLAYTWY HLA-B*54:23,YYAGYRNIYAQTEESNLYWTYNLYTWAVLAYTWY HLA-B*55:01,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:02,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:03,YYAEYRNIYAQTDVSNLYWTYNLYTWAELAYTWY HLA-B*55:04,YYAEYRNIYAQTDESNLYLSYNYYTWAVLAYTWY HLA-B*55:05,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:07,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:08,YYAEYRNIYAQTDESNLYLRYNYYTWAVLAYLWY HLA-B*55:09,YYAEYRNIYAQTDESNLYWTYNLYTWAERAYEWY HLA-B*55:10,YYSEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:11,YYAEYRNIYAQTDESNLYWMYNLYTWAELAYTWY HLA-B*55:12,YYAEYRNIYAQTDENNLYWTYNLYTWAVLAYTWY HLA-B*55:13,YYAEYRNIYAQTDESNLYWTYNFYTWAVLAYTWY HLA-B*55:14,YYAEYRNIYAQTDESNLYIVYDSYTWAELAYTWY HLA-B*55:15,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:16,YHAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:17,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYTWY HLA-B*55:18,YYAEYREISTNTYESNLYWTYNLYTWAVLAYTWY HLA-B*55:19,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:20,YYAEYRNIYAQTDESNLYWTYNYYTWAVDAYTWY HLA-B*55:21,YYAEYRNIYAQTDESNLYWTYNLYTWAEWAYTWY HLA-B*55:22,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYEWY HLA-B*55:23,YYAEYRNIYAQTDESNLYWTYDSYTWAVLAYTWY HLA-B*55:24,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYEWY HLA-B*55:25,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:26,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:27,YYAEYRNIYAQTDESNLYWTYDYYTWAVLAYTWY HLA-B*55:28,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYTWY HLA-B*55:29,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:30,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:31,YYAEYRNIYAQTYESNLYWTYNLYTWAELAYTWY HLA-B*55:32,YYAEYRNIYAQTDESNLYWTYNSYTWAVLAYTWY HLA-B*55:33,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:34,YYAEYREISAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:35,YYAMYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:36,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:37,YYAEYRNIYAQTDESNLYWTYNLYTWAVRAYTWY HLA-B*55:38,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:39,YYAEYRNIYAQTDESNLYWTYNLHTWAVLAYTWY HLA-B*55:40,YYAEYREIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:41,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:42,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:43,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*56:01,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:02,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYLWY HLA-B*56:03,YYAEYRNIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B*56:04,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYLWY HLA-B*56:05,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYLWH HLA-B*56:06,YYATYRNIYAQTDESNLYWTYNYYTWAELAYLWH HLA-B*56:07,YYAEYRNIYAQTDENTAYWTYNLYTWAVLAYLWY HLA-B*56:08,YYAEYREKYGQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:09,YYAEYRNIYAQTDESNLYIRYDSYTWAVLAYLWY HLA-B*56:10,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYTWY HLA-B*56:11,YYAEYRNIYAQTDESNLYIRYDFYTWAVLAYLWY HLA-B*56:12,YYAEYRNIYAQTDESNLYIRYNYYTWAVLAYTWY HLA-B*56:13,YYAEYRNIYAQTDESNLYWTYNLYTWAVDAYLWY HLA-B*56:14,YYAEYREKYRQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:15,YYAEYRNIYAQTDESNLYWTYNYYTWAVLAYLWY HLA-B*56:16,YYSEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:17,YYAEYRNIYANTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:18,YYAEYRNIYAQTDESNLYLRYDSYTWAVLAYTWY HLA-B*56:20,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:21,YYAEYRNIYAQTDENIAYWTYNYYTWAELAYLWH HLA-B*56:22,YYAEYRNIYAQTDESNLYWTYNFYTWAVLAYLWY HLA-B*56:23,YYAEYRNIYANTYESNLYWTYNLYTWAVLAYTWY HLA-B*56:24,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:25,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYLWY HLA-B*56:26,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:27,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:29,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*57:01,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:02,YYAMYGENMASTYENIAYIVYNYYTWAVRAYLWY HLA-B*57:03,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY HLA-B*57:04,YYAMYGENMASTYENIAYIVYDDYTWAVRAYLWY HLA-B*57:05,YYAMYGENMASTYENIAYIRYNYYTWAVRAYLWY HLA-B*57:06,YYAMYGENMASTYENIAYIVYDSYIWAVLAYLWY HLA-B*57:07,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLSY HLA-B*57:08,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:09,YYAMYGENMASTYENIAYIVYNYYTWAEDAYLWY HLA-B*57:10,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:11,YYAMYGENMASTYENIAYLWYDSYTWAVLAYLWY HLA-B*57:12,YYAMYGENMASTYESNLYIVYNYYTWAVRAYLWY HLA-B*57:13,YYAMYGENMASTYENIAYIVYDSYTWAERAYEWY HLA-B*57:14,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWH HLA-B*57:15,YYAMYGENVASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:16,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:17,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY HLA-B*57:18,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:19,YYAMYGENMASTYENIAYIVYDSYTWAVRAYLWY HLA-B*57:20,YYAMYGKNMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:21,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:22,YYAMYGENMASTYENIAYIVYDSYTWAELAYLWY HLA-B*57:23,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:24,YYAMYGENMASTYENIAYIVYDSYTWAVDAYLWY HLA-B*57:25,YYAMYGENMASTYENIAYIVYDSYTWAVLAYEWY HLA-B*57:26,YYAMYGENMASTYENIAYIVYDSYTWAVLAYTWY HLA-B*57:27,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:29,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:30,YYAMYGENMASTYENIAYIVYDSYTWAARAYLWY HLA-B*57:31,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:32,YYAMYGENMASTYENIAYIVYHDYTWAVLAYLWY HLA-B*58:01,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:02,YYATYGENMASTYENIAYLWYDSYTWAVLAYLWY HLA-B*58:04,YYATYEENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:05,YYATYGENMASTYENIAYIRYDSYTLAALAYTWY HLA-B*58:06,YYATYGENMASTYENIAYLWYDSYTWAELAYLWY HLA-B*58:07,YYATYGENMASTYENIAYLWYDSYTWAVLAYLSY HLA-B*58:08,YYATYGENMASTYENIAYWTYNYYTWAELAYLWH HLA-B*58:09,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWH HLA-B*58:11,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:12,YYSTYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:13,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:14,YYATYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*58:15,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:16,YYATYGENMASTYENIAYLRYDSYTWAVLAYLWY HLA-B*58:18,YYATYGENMASTYENIAYLSYDSYTWAVLAYLWY HLA-B*58:19,YYATYGENMASTYENIAYIRYDSYTWAELAYLWY HLA-B*58:20,YYATYGENMASTYENIAYLRYNFYTWAVLTYTWY HLA-B*58:21,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:22,YYATYGENMASTYENIAYIRYDSYTWAVRAYLWY HLA-B*58:23,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:24,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:25,YYATYGENMASTYENIAYLWYDSYTWAVLAYLWY HLA-B*58:26,YYATYGENMASTYENIAYLRYDSYTWAVLAYLWY HLA-B*58:27,YYATYGENMASTYENIAYLSYNYYTWAVLAYEWY HLA-B*58:28,YYATYGENMASTYENIAYIRYNYYTWAVLAYLWY HLA-B*58:29,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:30,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*59:01,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYTWY HLA-B*59:02,YYAEYRNIFTNTYENIAYWTYNYYTWAVLAYTWY HLA-B*59:03,YYAEYRNIFTNTYENIAYWTYNFYTWAVLAYTWY HLA-B*59:04,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYLWY HLA-B*59:05,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYTWY HLA-B*67:01,YYSEYRNIYAQTDESNLYLRYNFYTWAVLTYTWY HLA-B*67:02,YYSGYREKYRQADVSNLYLRYNFYTWAVLTYTWY HLA-B*73:01,YHTEYRNICAKTDVGNLYWTYNFYTWAVLAYEWH HLA-B*73:02,YHTEYRNICAKTDVGNLYWTYNFYTWAVLAYEWH HLA-B*78:01,YYATYRNIFTNTDESNLYWTYNYYTWAELAYLWH HLA-B*78:02,YYATYRNIFTNTYESNLYWTYNYYTWAELAYLWH HLA-B*78:03,YYATYRNICTNTDESNLYWTYNYYTWAELAYLWH HLA-B*78:04,YYATYRNIFTNTYESNLYWTYNYYTWAVLAYLWY HLA-B*78:05,YYATYREISTNTYESNLYWTYNYYTWAELAYLWH HLA-B*78:06,YYATYREISTNTYENNLYWTYNYYTWAELAYLWH HLA-B*78:07,YYATYRNIFTNTDESNLYWTYNYYTWAELAYTWH HLA-B*81:01,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY HLA-B*81:02,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY HLA-B*81:03,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY HLA-B*81:05,YYSEYRNIFAQTDESNLYLSYNYYSLAVLAYEWY HLA-B*82:01,YYSEYRNIYAQTDESNLYLRFNLYTWAVDAYLSY HLA-B*82:02,YYSEYRNIYAQTDESNLYLRFNLYTWAVDAYLSY HLA-B*82:03,YYSEYRNIYAQTDESNLYLRYNLYTWAVDAYLSY HLA-B*83:01,YYSEYRNIYAQTDESNLYIRYDDYTWAVDAYLSY HLA-C*01:02,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:03,YFSGYREKYRQTDVSNLYLWCNFYTWAERAYTWY HLA-C*01:04,YFSGYREKYRQTDVSNLYLWCDSYTWAEWAYTWY HLA-C*01:05,YFSGYREKYRQTDVSNLYLRSDYYTWAERAYTWY HLA-C*01:06,YFSGYREKYRQTDVSNLYLWCDYYTWAVRAYTWY HLA-C*01:07,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:08,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:09,YFSGYREKYRQTDVSNLYLWCDYYTWAEWAYTWY HLA-C*01:10,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYEWY HLA-C*01:11,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:12,YFSGYREKYRQTDVSNLYLWYDYYTWAERAYTWY HLA-C*01:13,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:14,YFSGYREKYRQTDVNKLYLWCDYYTWAERAYTWY HLA-C*01:15,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:16,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:17,YFSGYREKYRQADVSNLYLWCDYYTWAERAYTWY HLA-C*01:18,YFSGYREKYHQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:19,YFSGYREKYRQTDVCNLYLWCDYYTWAERAYTWY HLA-C*01:20,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:21,YFSGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*01:22,YFSGYREKYRQTDVSNLYLWCDYYTWAELAYTWY HLA-C*01:23,YFSGYREKYRQADVSNLYLWCDYYTWAERAYTWY HLA-C*01:24,YFSGYREKYRQTDVSNLYLWCNFYTWAERAYTWY HLA-C*01:25,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:26,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:27,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:28,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:29,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTCY HLA-C*01:30,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWH HLA-C*01:31,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYMWY HLA-C*01:32,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:33,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:34,YFSGYREKYRQTDVSNLYLWYNFYTWAERAYTWY HLA-C*01:35,YFSGYREKYRQTDVSNLYLWCDYYTWAELAYLWY HLA-C*01:36,YFSGYREKYRQTDVSNLYLRFDYYTWAERAYTWY HLA-C*01:38,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:39,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:40,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*02:02,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:03,YYAGYREKYRQTDVNKLYLRYDSYTWAVLAYEWY HLA-C*02:04,CYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:05,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYEWY HLA-C*02:06,YYAGYREKYRQTDVNKLYLRYDLYTWAEWAYEWY HLA-C*02:07,YYAGYREKYRQTDVNKLYLRYHDYTWAEWAYEWY HLA-C*02:08,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:09,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:10,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:11,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:12,YYAGYREKYRQADVSKLYLRYDSYTWAEWAYEWY HLA-C*02:13,YYAGYREKYRQTDVNKLYLRYDSYTWAAWAYEWY HLA-C*02:14,YDAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:15,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:16,YYAGYREKYRQTDVNKLYLRYDSYTWAELAYEWY HLA-C*02:17,YYAGYREKYRQTDVNKLYLWFDSYTWAEWAYEWY HLA-C*02:18,YYAGYREKYRQTDVNKLYLRYDSYTWAALAYEWY HLA-C*02:19,YYAGYREKYRQTDVNKLYLRYDYYTWAEWAYEWY HLA-C*02:20,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:21,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:22,YYAGYREKYRQTDVNKLYLRYNFYTWAEWAYEWY HLA-C*02:23,YYAGYREKYRQTDVNKLYLRYDYYTWAEWAYEWY HLA-C*02:24,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:26,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:27,YYAGYREKYRQTDVSNLYLRYDSYTWAEWAYEWY HLA-C*02:28,YYAGYREKYRQTDVNKLYLRYDSYTWAVWAYEWY HLA-C*02:29,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:30,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:31,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:32,YYAGYREKYRQTDVNKLYLRYDSYTWAERAYEWY HLA-C*02:33,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:34,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:35,YYAGYREKYRQTDVNKLHLRYDSYTWAEWAYEWY HLA-C*02:36,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:37,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:39,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:40,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*03:01,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C*03:02,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C*03:03,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:04,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:05,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYLWY HLA-C*03:06,YYAGYREKYRQTDVSNLYIRYVYYTWAELAYLWY HLA-C*03:07,YYAGYREKYRQTDVNKLYIRYDYYTWAELAYLWY HLA-C*03:08,YYAGYRENYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:09,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:10,YYAGYREKYRQTDVSKLYIRYDYYTWAELAYLWY HLA-C*03:11,YYSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:12,YYAGYREKYRQTDVSNLYIRYDLYTWAELAYLWY HLA-C*03:13,YYAGYREKYRQTDVSNLYLRYDYYTWAELAYLWY HLA-C*03:14,YYAGYREKYRQTDVSNLYIRYDSYTLAALAYTWY HLA-C*03:15,YYAGYREKYRQADVNKLYLRYDSYTWAELAYLWY HLA-C*03:16,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYTWY HLA-C*03:17,YYAGYREKYRQTDVSNLYLWYDYYTWAELAYLWY HLA-C*03:18,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:19,YYAGYREKYRQTDVSNLYIRYDLYTWAELAYLWY HLA-C*03:21,YYAGYREKYRQTDVSNLYIRYDYYTWAEWAYTWY HLA-C*03:23,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:24,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:25,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYLWY HLA-C*03:26,YYAGYREKYRQTDVSNLYIRYDFYTWAELAYLWY HLA-C*03:27,YYAGYREKYRQADVSNLYLSYDYYTWAELAYLWY HLA-C*03:28,YYAGYREKYRQTDVSNLYIRYDYYTWAERAYLWY HLA-C*03:29,YYAGYRENYRQTDVSKLYIRYDYYTWAELAYLWY HLA-C*03:30,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:31,YYAGYRENYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:32,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:33,YYAGYREKYRQTDVSNLCLRYDSYTWAELAYLWY HLA-C*03:34,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYEWY HLA-C*03:35,YYAGYREKYRQTDVSNLYLRYDYYTWAELAYLWY HLA-C*03:36,YYAGYREKYRQTDVSNLYLRYDSYTWAVLAYLWY HLA-C*03:37,YYSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:38,YYAGYREKYRQADVSNLYIRYDYYTWAELAYLWY HLA-C*03:39,YDSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:40,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY HLA-C*03:41,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:42,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY HLA-C*03:43,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY HLA-C*03:44,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:45,YYAGYREKYRQTDVNKLYIRYDYYTWAELAYLWY HLA-C*03:46,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:47,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:48,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:49,YYAGYREKYRQTDVSNLYIRYDYYTWAERAYLWY HLA-C*03:50,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:51,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWH HLA-C*03:52,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:53,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:54,YYAGYREKYRQTDVSNLYIRYDYYTWAELPYLWY HLA-C*03:55,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYTWY HLA-C*03:56,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:57,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:58,YYAGYREKYRQTDVSNLYLWCNFYTWAERAYTWY HLA-C*03:59,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:60,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C*03:61,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:62,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:63,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:64,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:65,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:66,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:67,YDAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:68,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:69,YYAGYREKYRQADVSNLYIRYDYYTWAELAYLWY HLA-C*03:70,YYAGYREKYRQTDESNLYIRYDYYTWAELAYLWY HLA-C*03:71,YYAGYREKYRQTDVSNLYLWYDSYTWAELAYLWY HLA-C*03:72,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:73,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:74,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:75,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:76,HYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:77,YYAGYREKYRQTDVSNLYIRYDYYTWAVLAYLWY HLA-C*03:78,YYAGYREKYRQTDVSNLYIRYDYYTWAEMAYLWY HLA-C*03:79,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:80,YYAGYREKYRQTDVSNLYIRYDYYTWAEWAYTWY HLA-C*03:81,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:82,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:83,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:84,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C*03:85,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:86,YYAGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*03:87,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:88,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:89,YYAGYREKYRQTDVSNLYLRFDSYTWAELAYLWY HLA-C*03:90,YYAGYREKYRQTDVSNLYIRSDYYTWAELAYLWY HLA-C*03:91,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:92,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYTWY HLA-C*03:93,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:94,YYAGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*04:01,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:03,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:04,YSAGYREKYRQADVNKLYLRFNFYTWAELAYTWY HLA-C*04:05,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:06,YYAGYREKYRQADVNKLYLRFNFYTWAELAYTWY HLA-C*04:07,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:08,YSAGYREKYRQADVNKLYLRFNFYTWAERAYLWY HLA-C*04:10,YSAGYREKYRQTDVNKLYLRFNFYTWAERAYTWY HLA-C*04:11,YSAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C*04:12,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:13,YSAGYREKYRQADVNKLYLRFNFYTWAALAYTWY HLA-C*04:14,YSAGYREKYRQADVNKLYLRFNFYTWAEQAYTWY HLA-C*04:15,YSAGYREKYRQADVNKLYLRYNFYTWAERAYTWY HLA-C*04:16,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:17,YSAGYREKYRQADVNKLYLRYNFYTWAERAYTWY HLA-C*04:18,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:19,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:20,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:23,YSAGYREKYRQADVNKLYLRFDFYTWAERAYTWY HLA-C*04:24,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:25,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:26,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:27,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:28,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:29,YSAGYREKYRQADVSNLYLRFNFYTWAERAYTWY HLA-C*04:30,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:31,YSAGYREKYRQADVNKLYLRFNFYTWVERAYTWY HLA-C*04:32,YSAGYREKYRQADVNKLYLRFNFYTWAERAYEWY HLA-C*04:33,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:34,YSAGYREKYRQADVNKLYLRFNFYTWAVLAYLWY HLA-C*04:35,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:36,YSAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C*04:37,YSAGYREKYRQADVNKLYLWCNFYTWAERAYTWY HLA-C*04:38,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:39,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:40,YSAGYREKYRQADVNKLYFRFNFYTWAERAYTWY HLA-C*04:41,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:42,YDAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:43,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:44,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:45,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:46,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:47,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:48,YSAGYREKYRQADVNKLYLRFNFYTWAERPYTWY HLA-C*04:49,YSAGYWEKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:50,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:51,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:52,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:53,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:54,YSAGYREKYRQADVNKLYLRFDSYTWAERAYTWY HLA-C*04:55,YSAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C*04:56,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:57,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:58,YSAGYREKYRQADVNKLYLRFNFYTLAALAYTWY HLA-C*04:60,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:61,YSAGYREKYRQADVNKLYLRFNFYTWAARAYTWY HLA-C*04:62,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:63,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:64,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:65,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:66,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:67,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:68,YSAGYREKYRQADVNKLYLRFNFYTWAAQAYTWY HLA-C*04:69,YSAGYGEKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:70,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*05:01,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:03,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:04,YYAGYREKYRQTDVNKLYLRYDSYTWAERAYTWY HLA-C*05:05,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:06,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:08,YYAGYREKYRQTDVNKLYLRYNFYTWAEWAYTWY HLA-C*05:09,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:10,YYAGYREKYRQTDVNKLYIRYNFYTWAERAYTWY HLA-C*05:11,YYAGYREKYRQTDVNKLYLRYNFYTWAELAYTWY HLA-C*05:12,YYAGYREKYRQTDVNKLYLRYNFYTWAVRAYTWY HLA-C*05:13,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:14,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:15,YYAGYWEKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:16,YYAGYREKYRQTDVNKLYLWYNFYTWAERAYTWY HLA-C*05:17,YYAGYREKYRQTDVNKLYLRYNFYTWAALAYTWY HLA-C*05:18,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:19,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:20,YYAGYREKYRQTDVNNLYLRYNFYTWAERAYTWY HLA-C*05:21,YYAGYREKYRQTDVNKLHLRYNFYTWAERAYTWY HLA-C*05:22,YYAGYREKYRQTDVNKLYLRYDFYTWAERAYTWY HLA-C*05:23,YYAGYREKYRQTDVNKLYLRYNFYTLAERAYTWY HLA-C*05:24,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:25,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:26,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:27,YYAGYREKYRQTDVNKLYLRYNFYTWAELAYLWY HLA-C*05:28,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:29,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:30,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:31,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:32,YYAGYREKYRQTDVNRLYLRYNFYTWAERAYTWY HLA-C*05:33,YYAGCREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:34,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:35,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:36,YYAGYRENYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:37,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:38,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:39,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYLWY HLA-C*05:40,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:41,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:42,YYAGYREKYRQADVNKLYLRYNFYTWAERAYTWY HLA-C*05:43,YDAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:44,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:45,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*06:02,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:03,YYSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:04,YDSGYREKYRQADVNKLYLWYDSYTWAELAYTWY HLA-C*06:05,YDSGYREKYRQTDVNKLYLWYDSYTWAERAYTWY HLA-C*06:06,YDSGYREKYRQADVNKLYLWYDSYTWAERAYTWY HLA-C*06:07,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:08,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYEWY HLA-C*06:09,YDSGYREKYRQADVNKLYLWYNFYTWAEWAYTWY HLA-C*06:10,YDPGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:11,YDSGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*06:12,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:13,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:14,YDSGYREKYRQADVNKLYIWYDSYTWAEWAYTWY HLA-C*06:15,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:17,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:18,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:19,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:20,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:21,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:22,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:23,YDSGYREKYRQADVNKLYLWCDSYTWAEWAYTWY HLA-C*06:24,YDSGYREKYRQADVNKLYLWYDSYTWAEWAHTWY HLA-C*06:25,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:26,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:27,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:28,YDAGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:29,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:30,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:31,YDSGYREKYRQADVNKLYLWYDSYTWAAWAYTWY HLA-C*06:32,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:33,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:34,YDSGYREKYRQADVNKLYLWYDFYTWAEWAYTWY HLA-C*06:35,YDSGYREKYRQADVNKLYIRSDSYTWAEWAYTWY HLA-C*06:36,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:37,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:38,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:39,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:40,YDSGYREKYRQADVNKLYLWYDSYTWAEWTYTWY HLA-C*06:41,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:42,YDSGYREKYRQADVNKLYLWYDSYTRAEWAYTWY HLA-C*06:43,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:44,YDSGYRENYRQTDVNKLYLWYDSYTWAEWAYTWY HLA-C*06:45,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*07:01,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:02,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:03,YDSGYREKYRQADVSNLYLRSDSYTWAALAYLWY HLA-C*07:04,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:05,YDSGYREKYRQADVSNLYLNYDSYTLAALAYTWY HLA-C*07:06,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:07,YDSGYRENYRQADVNKLYLRYDSYTLAALAYTWY HLA-C*07:08,YDSGYREKYRQADVSNLYLRFDSYTLAALAYTWY HLA-C*07:09,YDSGYRENYRQADVNKLYLRYDSYTLAALAYTWY HLA-C*07:10,YDSGYREKYRQADVSNLYIRSDSYTLAALAYTWY HLA-C*07:11,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:12,YDSGYREKYRQADVSNLYFRYDFYTWAADAYTWY HLA-C*07:13,YDSGYREKYRQADVSNLYLRSDFYTLAALAYTWY HLA-C*07:14,YDSGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:15,YDSGYREKYRQADVSNLYLRSDSYTLAALAYEWY HLA-C*07:16,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:17,YDSGYREKYRQADVSNLYLRSDSYTWAALAYTWY HLA-C*07:18,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:19,YDSGYRENYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:20,YDAGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:21,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:22,YDSGYRENYRQADVSNLYLRYDSYTLAAWAYTWY HLA-C*07:23,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:24,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:25,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:26,YYSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:27,YDSGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:28,YDSGYRENYRQADVSNLYLRYNFYTLAALAYTWY HLA-C*07:29,YDSGYREKYRQADVSNLYLRSDYYTLAALAYTWY HLA-C*07:30,YDSGYRENYRQADVSNLYLRYDSYTLAGLAYTWY HLA-C*07:31,YDSGYREKYRQADVSNLYLWYDSYTLAALAYTWY HLA-C*07:35,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:36,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:37,YDSGYREKYRQADVSNLYLRSDSYTLAARAYTWY HLA-C*07:38,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:39,YDSGYREKYRQTDVSNLYLRSDSYTLAALAYTWY HLA-C*07:40,YDSGYRENYRQTDVSNLYLRYDSYTLAALAYTWY HLA-C*07:41,YDSGYREKYRQADVSNLYLRYNFYTWAERAYTWY HLA-C*07:42,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:43,YDSGYREKYRQADVSNLYIRYDSYTLAALAYTWY HLA-C*07:44,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:45,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:46,YDSEYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:47,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:48,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:49,YDSGYREKYRQADVNNLYLRSDSYTLAALAYTWY HLA-C*07:50,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:51,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:52,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:53,YDSGYRENYRQADVSNLYLRYDSYTLAAQAYTWY HLA-C*07:54,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:56,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:57,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:58,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:59,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:60,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:62,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:63,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:64,YSAGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:65,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:66,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:67,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:68,YDSGYREKYRQADVSNLYLRSDSYTLAADAYTWY HLA-C*07:69,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:70,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:71,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:72,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:73,YDAGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:74,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:75,YDSGYREKYRQADVSNLHLRSDSYTLAALAYTWY HLA-C*07:76,YDSGYREKYRQADVNKLYLRSDSYTLAALAYTWY HLA-C*07:77,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:78,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:79,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:80,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:81,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:82,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:83,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:84,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:85,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:86,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:87,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:88,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:89,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:90,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:91,YDSGYRENYRQADVSNLYLRYDSYTLTALAYTWY HLA-C*07:92,YYAGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:93,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:94,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:95,YDSGYRENYRQADVSNLYLRYDSYTLAVLAYTWY HLA-C*07:96,YYAGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:97,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:99,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:100,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:101,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:102,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:103,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:105,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:106,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:107,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:108,YDSGYRENYRQADVSNLYLRFDSYTLAALAYTWY HLA-C*07:109,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:110,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:111,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:112,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:113,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:114,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:115,YDSGYRENYRQADVSDLYLRYDSYTLAALAYTWY HLA-C*07:116,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:117,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:118,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:119,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:120,YDSGYRENYRQADVSNLYLRYDSYTLAALAYPWY HLA-C*07:122,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:123,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:124,YDSGYRENYRQADESNLYLRYDSYTLAALAYTWY HLA-C*07:125,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:126,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:127,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:128,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:129,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:130,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:131,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:132,DDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:133,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:134,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:135,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:136,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:137,YDSGYREKYRQADVSNLYLRSDSYTLAALTYTWY HLA-C*07:138,YDSGYREKYRQADVSNLYLRSDSYTLAAWAYTWY HLA-C*07:139,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:140,YDSGYRENYRQADVSNLYLRYDSYTWAVDAYTWY HLA-C*07:141,YDSGYRENYRQADVSNLYLRYDSYTWAALAYTWY HLA-C*07:142,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:143,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:144,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:145,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:146,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:147,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:148,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:149,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*08:01,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:02,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:03,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:04,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY HLA-C*08:05,YYAGYREKYRQADVSNLYLRYNFYTWAERAYTWY HLA-C*08:06,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYAWY HLA-C*08:07,YYAGYREKYRQTDVSNLYLRYNFYTLAERAYTWY HLA-C*08:08,YYAGYREKYRQTDVSNLYLSYNFYTWATLAYTWY HLA-C*08:09,YYAGYREKYRQTDVSNLYLRYDSYTWATLAYTWY HLA-C*08:10,YYAGYREKYRQTDVNKLYLRYNFYTWATLAYTWY HLA-C*08:11,YYAGYREKYRQTDVSNLYLRYDSYTWATLAYTWY HLA-C*08:12,YYAGYREKYRQTDVSNLYLWYNFYTWAERAYTWY HLA-C*08:13,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY HLA-C*08:14,YYSGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:15,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:16,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:17,YYAGYREKYCQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:18,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:19,YYAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C*08:20,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:21,YYAGYREKYRQADVSNLYLRYNFYTWATLAYTWY HLA-C*08:22,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:23,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:24,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:25,YYAGYREKYRQADVSNLYLRYNFYTWAERAYTWY HLA-C*08:27,YYAGYREKYRQTDVSNLYLRYNFYTWAEWAYTWY HLA-C*08:28,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:29,YYAGYREKYRQTDVSNLYLRYNFYTWAEWAYTWY HLA-C*08:30,YYAGYREKYRQTDVSNLYLRYNFYTWPERAYTWY HLA-C*08:31,YYAGYREKYRQTDVSNLYLRYNFYTWAEWAYEWY HLA-C*08:32,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:33,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:34,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:35,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*12:02,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:03,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:04,YYAGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*12:05,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYTWY HLA-C*12:06,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:07,YYAGYREKYRQADVGNLYLWYDSYTWAEWAYTWY HLA-C*12:08,YYAGYRENYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:09,YYAGYREKYRQTDVNKLYLWYDSYTWAERAYTWY HLA-C*12:10,YYAGYREKYRQADVSNLYLRFDSYTWAEWAYTWY HLA-C*12:11,YYAGYREKYRQADVSNLYLWSDSYTWAEWAYTWY HLA-C*12:12,YYAGYREKYRQADESNLYLWYDSYTWAEWAYTWY HLA-C*12:13,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:14,YYAGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*12:15,YYAGYREKYRQADVSNLYLWYDLYTWAEWAYTWY HLA-C*12:16,YDSGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:17,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:18,YYAGYREKYRQADVSNLYLRYDSYTWAELAYTWY HLA-C*12:19,YYAGYREKYRQADVSNLYLWYDSYTWAECAYTWY HLA-C*12:20,YYAGYREKYRQADVSNLYLWYDSYTWAELAYTWY HLA-C*12:21,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYTWY HLA-C*12:22,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:23,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:24,YYAGYREKYRQADVSNLYLWYDSYTWAERAYTWY HLA-C*12:25,YYAGYPEKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:26,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:27,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:28,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:29,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:30,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:31,YYAGYREKYRQADVSNLYLWYNFYTWAEWAYTWY HLA-C*12:32,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:33,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYTWY HLA-C*12:34,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:35,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:36,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:37,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:38,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:40,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:41,YYAGYREKYRQADVNKLYLRYDSYTWAEWAYTWY HLA-C*12:43,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:44,YYAGYREKYRQADVSNLYIRYDSYTWAEWAYTWY HLA-C*14:02,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:03,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:04,YSAGYREKYRQADVNNLYLWFDSYTWAERAYTWY HLA-C*14:05,YSAGYREKYRQTDVSNLYLWYDSYTWAERAYTWY HLA-C*14:06,YSAGYREKYRQTDVSNLYLWFDSYTWAELAYTWY HLA-C*14:08,YSAGYREKYRQTDVSNLYPWFDSYTWAERAYTWY HLA-C*14:09,YSAGYREKYRQTDVSNLYLRYDSYTWAERAYTWY HLA-C*14:10,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:11,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:12,YSAGYREKYRQTDVNKLYLWFDSYTWAERAYTWY HLA-C*14:13,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:14,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:15,YSAGYREKYRQTDVSNLYLWFDSYTWAALAYTWY HLA-C*14:16,YSAGYREKYRQTDVSNLYLWFDSYTWAEWAYTWY HLA-C*14:17,YSAGYREKYRQTDVSNLYLWFDSYTLAARAYTWY HLA-C*14:18,YSSGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:19,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:20,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYLWY HLA-C*15:02,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:03,YYAGYRENYRQADVNKLYIRYDLYTWAELAYTWY HLA-C*15:04,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:05,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C*15:06,YYAGYRENYRQTDVNKLYIRYDYYTWAELAYTWY HLA-C*15:07,YYAGYRENYRQTDVSNLYIRYDLYTWAELAYTWY HLA-C*15:08,YYAGYRENYRQTDVNKLYIRYDLYTWAERAYTWY HLA-C*15:09,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:10,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:11,YYAGYREKYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:12,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:13,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:15,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYLWY HLA-C*15:16,YYAGYREKYRQADVNKLYIRYDLYTWAELAYTWY HLA-C*15:17,YYAGYREKYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:18,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:19,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:20,YYAGYREKYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:21,YYAGYRENYRQTDVSKLYIRYDLYTWAELAYTWY HLA-C*15:22,YYAGYRENYRQTDVNKLYLRYDFYTWAELAYTWY HLA-C*15:23,YDAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C*15:24,YYAGYRENYRQTDVNKLYIRYNYYTWAELAYTWY HLA-C*15:25,YYAGYREKYRQADVSNLYIRYNFYTWAEDAYTSY HLA-C*15:26,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:27,YYAGYRNKYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:28,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:29,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C*15:30,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:31,YYAGYRENYRQTDVNKLYIRYDLYTWAALAYTWY HLA-C*15:33,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:34,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:35,YYAGYRENYRQTDVNKLHIRYDLYTWAELAYTWY HLA-C*16:01,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:02,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C*16:04,YYAGYREKYRQTDVSNLYLWYDSYTWAAWAYTWY HLA-C*16:06,YYAGYREKYRQTDVSNLYLRSDSYTWAAQAYTWY HLA-C*16:07,YYAGYREKYRQTDVSNLYLRYDSYTWAAQAYTWY HLA-C*16:08,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:09,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C*16:10,YYAGYREKYRQTDVSNLYLWYDDYTWAAQAYTWY HLA-C*16:11,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:12,YYAGYGEKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C*16:13,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:14,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:15,YYAGYREKYRQADVSNLYLWYDSYTWAAQAYTWY HLA-C*16:17,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:18,YYAGYREKYRQTDVSNLYLWCDSYTWAAQAYTWY HLA-C*16:19,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C*16:20,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:21,YDAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:22,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:23,YYAGYREKYRQTDVSNLYLWFDSYTWAAQAYTWY HLA-C*16:24,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:25,YYAGYREKYRQADVNKLYLWYDSYTWAAQAYTWY HLA-C*16:26,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*17:01,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:02,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:03,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:04,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:05,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:06,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:07,YYAGYREKYRQADVNKLYIRYNFYSLAELAYLWY HLA-C*18:01,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*18:02,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*18:03,YDSGYREKYRQADVNKLYLRFNFYTWAEWAYEWY mhcflurry-2.3.6/downloads-generation/models_class1_kim_benchmark/write_validation_data.py000066400000000000000000000072611525677230600322150ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Write and summarize model validation data, which is obtained by taking a full dataset and removing the data used for training. """ import argparse import sys from os.path import abspath import pandas import numpy from sklearn.model_selection import StratifiedKFold parser = argparse.ArgumentParser(usage = __doc__) parser.add_argument( "--include", metavar="INPUT.csv", nargs="+", help="Input CSV to include") parser.add_argument( "--exclude", metavar="INPUT.csv", nargs="+", help="Input CSV to exclude") parser.add_argument( "--out-data", metavar="RESULT.csv", help="Output dadta CSV") parser.add_argument( "--out-summary", metavar="RESULT.csv", help="Output summary CSV") parser.add_argument( "--mass-spec-regex", metavar="REGEX", default="mass[- ]spec", help="Regular expression for mass-spec data. Runs on measurement_source col." "Default: %(default)s.") parser.add_argument( "--only-alleles-present-in-exclude", action="store_true", default=False, help="Filter to only alleles that are present in files given by --exclude. " "Useful for filtering to only alleles supported by a predictor, where the " "training data for the predictor is given by --exclude.") def run(argv): args = parser.parse_args(argv) dfs = [] for input in args.include: df = pandas.read_csv(input) dfs.append(df) df = pandas.concat(dfs, ignore_index=True) print("Loaded data with shape: %s" % str(df.shape)) del dfs df = df.ix[ (df.peptide.str.len() >= 8) & (df.peptide.str.len() <= 15) ] print("Subselected to 8-15mers: %s" % (str(df.shape))) if args.exclude: exclude_dfs = [] for exclude in args.exclude: exclude_df = pandas.read_csv(exclude) exclude_dfs.append(exclude_df) exclude_df = pandas.concat(exclude_dfs, ignore_index=True) del exclude_dfs df["_key"] = df.allele + "__" + df.peptide exclude_df["_key"] = exclude_df.allele + "__" + exclude_df.peptide df["_excluded"] = df._key.isin(exclude_df._key.unique()) print("Excluding measurements per allele (counts): ") print(df.groupby("allele")._excluded.sum()) print("Excluding measurements per allele (fractions): ") print(df.groupby("allele")._excluded.mean()) df = df.loc[~df._excluded] del df["_excluded"] del df["_key"] if args.only_alleles_present_in_exclude: df = df.loc[df.allele.isin(exclude_df.allele.unique())] df["mass_spec"] = df.measurement_source.str.contains(args.mass_spec_regex) df.loc[df.mass_spec , "measurement_inequality"] = "mass_spec" if args.out_summary: summary_df = df.groupby( ["allele", "measurement_inequality"] )["measurement_value"].count().unstack().fillna(0).astype(int) summary_df["total"] = summary_df.sum(1) summary_df.to_csv(args.out_summary) print("Wrote: %s" % args.out_summary) if args.out_data: df.to_csv(args.out_data, index=False) print("Wrote: %s" % args.out_data) if __name__ == '__main__': run(sys.argv[1:]) mhcflurry-2.3.6/downloads-generation/models_class1_minimal/000077500000000000000000000000001525677230600241345ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_minimal/GENERATE.sh000077500000000000000000000043761525677230600256770ustar00rootroot00000000000000#!/bin/bash # # Model select standard MHCflurry Class I models, limiting to 1 model per allele. # set -e set -x DOWNLOAD_NAME=models_class1_minimal SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") mkdir -p "$SCRATCH_DIR" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" # Send stdout and stderr to a logfile included with the archive. exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) # Log some environment info date pip freeze git status cd $SCRATCH_DIR/$DOWNLOAD_NAME cp $SCRIPT_DIR/write_validation_data.py . mkdir models GPUS=$(nvidia-smi -L 2> /dev/null | wc -l) || GPUS=0 echo "Detected GPUS: $GPUS" PROCESSORS=$(getconf _NPROCESSORS_ONLN) echo "Detected processors: $PROCESSORS" python ./write_validation_data.py \ --include "$(mhcflurry-downloads path data_curated)/curated_training_data.with_mass_spec.csv.bz2" \ --exclude "$(mhcflurry-downloads path models_class1_unselected)/models/train_data.csv.bz2" \ --only-alleles-present-in-exclude \ --out-data test.csv \ --out-summary test.summary.csv wc -l test.csv time mhcflurry-class1-select-allele-specific-models \ --data test.csv \ --models-dir "$(mhcflurry-downloads path models_class1_unselected)/models" \ --out-models-dir models \ --scoring combined:mass-spec,mse,consensus \ --consensus-num-peptides-per-length 10000 \ --combined-min-models 1 \ --combined-max-models 1 \ --unselected-accuracy-scorer combined:mass-spec,mse \ --unselected-accuracy-percentile-threshold 95 \ --mass-spec-min-measurements 500 \ --num-jobs $(expr $PROCESSORS \* 2) --gpus $GPUS --max-workers-per-gpu 2 --max-tasks-per-worker 1 time mhcflurry-calibrate-percentile-ranks \ --models-dir models \ --num-peptides-per-length 100000 \ --num-jobs $(expr $PROCESSORS \* 2) --gpus $GPUS --max-workers-per-gpu 2 --max-tasks-per-worker 50 # To save space in the final download rm test.csv cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt tar -cjf "../${DOWNLOAD_NAME}.tar.bz2" * echo "Created archive: $SCRATCH_DIR/$DOWNLOAD_NAME.tar.bz2" mhcflurry-2.3.6/downloads-generation/models_class1_minimal/README.md000066400000000000000000000007621525677230600254200ustar00rootroot00000000000000# Legacy minimal allele-specific affinity models This historical bundle contains one affinity network per supported allele. It is small and useful for compatibility tests; use `models_class1_presentation` for current prediction work. To use it explicitly without changing the default weights: ```bash mhcflurry downloads fetch models_class1_minimal mhcflurry predict INPUT.csv --affinity-only \ --models "$(mhcflurry downloads path models_class1_minimal)/models" \ --out predictions.csv ``` mhcflurry-2.3.6/downloads-generation/models_class1_minimal/write_validation_data.py000077700000000000000000000000001525677230600407112../models_class1/write_validation_data.pyustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_pan/000077500000000000000000000000001525677230600232645ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_pan/GENERATE.WITH_HPC_CLUSTER.sh000077500000000000000000000000311525677230600274540ustar00rootroot00000000000000bash GENERATE.sh cluster mhcflurry-2.3.6/downloads-generation/models_class1_pan/GENERATE.sh000077500000000000000000000127251525677230600250240ustar00rootroot00000000000000#!/bin/bash # # Train pan-allele MHCflurry Class I models. Supports re-starting a failed run. # # Usage: GENERATE.sh # # cluster mode uses an HPC cluster (Mount Sinai chimera cluster, which uses lsf job # scheduler). This would need to be modified for other sites. # set -e set -x DOWNLOAD_NAME=models_class1_pan SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") pseudosequence_lookup() { python -c 'from mhcflurry.pseudosequences import main; main()' "$@" } if [ "$1" != "cluster" ] then GPUS=$(nvidia-smi -L 2> /dev/null | wc -l) || GPUS=0 echo "Detected GPUS: $GPUS" PROCESSORS=$(getconf _NPROCESSORS_ONLN) echo "Detected processors: $PROCESSORS" if [ "$GPUS" -eq "0" ]; then NUM_JOBS=${NUM_JOBS-1} else NUM_JOBS=${NUM_JOBS-$GPUS} fi echo "Num jobs: $NUM_JOBS" PARALLELISM_ARGS+=" --num-jobs $NUM_JOBS --max-tasks-per-worker 1 --gpus $GPUS --max-workers-per-gpu 1" else PARALLELISM_ARGS+=" --cluster-parallelism --cluster-max-retries 1 --cluster-submit-command bsub --cluster-results-workdir $HOME/mhcflurry-scratch --cluster-script-prefix-path $SCRIPT_DIR/cluster_submit_script_header.mssm_hpc.lsf" fi mkdir -p "$SCRATCH_DIR" if [ "$2" != "continue-incomplete" ] then echo "Fresh run" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" else echo "Continuing incomplete run" fi # Send stdout and stderr to a logfile included with the archive. LOG="$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.$(date +%s).txt" exec > >(tee -ia "$LOG") exec 2> >(tee -ia "$LOG" >&2) # Log some environment info echo "Invocation: $0 $@" date pip freeze git status cd $SCRATCH_DIR/$DOWNLOAD_NAME export OMP_NUM_THREADS=1 export PYTHONUNBUFFERED=1 cp $SCRIPT_DIR/additional_alleles.txt . if [ "$2" != "continue-incomplete" ] then cp $SCRIPT_DIR/generate_hyperparameters.py . python generate_hyperparameters.py > hyperparameters.yaml fi cp $SCRIPT_DIR/reassign_mass_spec_training_data.py . python reassign_mass_spec_training_data.py \ "$(mhcflurry-downloads path data_curated)/curated_training_data.csv.bz2" \ --set-measurement-value 100 \ --out-csv "$(pwd)/train_data.csv" bzip2 -f "$(pwd)/train_data.csv" TRAINING_DATA="$(pwd)/train_data.csv.bz2" for kind in combined do CONTINUE_INCOMPLETE_ARGS="" if [ "$2" == "continue-incomplete" ] && [ -d "models.unselected.${kind}" ] then echo "Will continue existing run: $kind" CONTINUE_INCOMPLETE_ARGS="--continue-incomplete" fi ALLELE_SEQUENCES_DIR="$(mhcflurry-downloads path allele_sequences)" ALLELE_SEQUENCES="$(pseudosequence_lookup path \ --directory "$ALLELE_SEQUENCES_DIR" \ --length 39 \ --fallback-legacy)" HYPERPARAMETERS="hyperparameters.yaml" mhcflurry-class1-train-pan-allele-models \ --data "$TRAINING_DATA" \ --allele-sequences "$ALLELE_SEQUENCES" \ --pretrain-data "$(mhcflurry-downloads path random_peptide_predictions)/predictions.csv.bz2" \ --held-out-measurements-per-allele-fraction-and-max 0.25 100 \ --num-folds 4 \ --hyperparameters "$HYPERPARAMETERS" \ --out-models-dir $(pwd)/models.unselected.${kind} \ --worker-log-dir "$SCRATCH_DIR/$DOWNLOAD_NAME" \ $PARALLELISM_ARGS $CONTINUE_INCOMPLETE_ARGS done echo "Done training. Beginning model selection." for kind in combined do MODELS_DIR="models.unselected.${kind}" # Older method calibrated only particular alleles. We are now calibrating # all alleles, so this is commented out. #ALLELE_LIST=$(bzcat "$MODELS_DIR/train_data.csv.bz2" | cut -f 1 -d , | grep -v allele | uniq | sort | uniq) #ALLELE_LIST+=$(echo " " $(cat additional_alleles.txt | grep -v '#') ) mhcflurry-class1-select-pan-allele-models \ --data "$MODELS_DIR/train_data.csv.bz2" \ --models-dir "$MODELS_DIR" \ --out-models-dir models.${kind} \ --min-models-per-fold 2 \ --max-models-per-fold 8 \ $PARALLELISM_ARGS cp "$MODELS_DIR/train_data.csv.bz2" "models.${kind}/train_data.csv.bz2" # We are now calibrating all alleles. # Previously had argument: --allele $ALLELE_LIST time mhcflurry-calibrate-percentile-ranks \ --models-dir models.${kind} \ --match-amino-acid-distribution-data "$MODELS_DIR/train_data.csv.bz2" \ --motif-summary \ --num-peptides-per-length 100000 \ --alleles-per-work-chunk 10 \ --verbosity 1 \ $PARALLELISM_ARGS done cp $SCRIPT_ABSOLUTE_PATH . bzip2 -f "$LOG" for i in $(ls LOG-worker.*.txt) ; do bzip2 -f $i ; done RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.$(date +%Y%m%d).tar.bz2" tar -cjf "$RESULT" * echo "Created archive: $RESULT" # Split into <2GB chunks for GitHub PARTS="${RESULT}.part." # Check for pre-existing part files and rename them. for i in $(ls "${PARTS}"* ) do DEST="${i}.OLD.$(date +%s)" echo "WARNING: already exists: $i . Moving to $DEST" mv $i $DEST done split -b 2000M "$RESULT" "$PARTS" echo "Split into parts:" ls -lh "${PARTS}"* # Write out just the selected models # Move unselected into a hidden dir so it is excluded in the glob (*). mkdir .ignored mv models.unselected.* .ignored/ RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.selected.$(date +%Y%m%d).tar.bz2" tar -cjf "$RESULT" * mv .ignored/* . && rmdir .ignored echo "Created archive: $RESULT" mhcflurry-2.3.6/downloads-generation/models_class1_pan/README.md000066400000000000000000000010051525677230600245370ustar00rootroot00000000000000# Class I pan-allele affinity models (historical generator) This recipe produces candidate and selected affinity ensembles. The public `models_class1_pan` download contains selected models; `models_class1_pan_unselected` is a separate historical candidate bundle. Neither is the full presentation bundle. The maintained training workflow is documented in [scripts/training/README.md](../../scripts/training/README.md). The `GENERATE.sh` here records the historical recipe and does not describe the current weights. mhcflurry-2.3.6/downloads-generation/models_class1_pan/additional_alleles.txt000066400000000000000000000001711525677230600276350ustar00rootroot00000000000000# Additional alleles besides those in the training data to include in percentile rank calibration HLA-C*02:10 HLA-A*02:20mhcflurry-2.3.6/downloads-generation/models_class1_pan/cluster_submit_script_header.mssm_hpc.lsf000066400000000000000000000021061525677230600335410ustar00rootroot00000000000000#!/bin/bash #BSUB -J MHCf-{work_item_num} # Job name #BSUB -P acc_nkcancer # allocation account or Unix group #BSUB -q gpu # queue #BSUB -gpu "num=1:mode=exclusive_process:mps=no:j_exclusive=yes" #BSUB -R span[hosts=1] # one node #BSUB -n 1 # number of compute cores #BSUB -W 46:00 # walltime in HH:MM #BSUB -R rusage[mem=30000] # mb memory requested #BSUB -o {work_dir}/%J.stdout # output log (%J : JobID) #BSUB -eo {work_dir}/STDERR # error log #BSUB -L /bin/bash # Initialize the execution environment # set -e set -x echo "Subsequent stderr output redirected to stdout" >&2 exec 2>&1 export TMPDIR=/local/JOBS/mhcflurry-{work_item_num} export PATH=$HOME/mhcflurry-conda-environment/bin/:$PATH export PYTHONUNBUFFERED=1 export KMP_SETTINGS=1 #export TF_GPU_ALLOCATOR=cuda_malloc_async free -m module add cuda/11.8.0 cudnn/8.9.5-11 module list nvidia-smi export XLA_FLAGS=--xla_gpu_cuda_data_dir=$CUDA_PATH #export XLA_FLAGS='--xla_compile=False' python -c 'import tensorflow as tf ; print("GPU AVAILABLE" if tf.test.is_gpu_available() else "GPU NOT AVAILABLE")' env cd {work_dir} mhcflurry-2.3.6/downloads-generation/models_class1_pan/generate_hyperparameters.py000066400000000000000000000077601525677230600307350ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Generate grid of hyperparameters """ from sys import stdout from copy import deepcopy from yaml import dump base_hyperparameters = { 'activation': 'tanh', 'allele_dense_layer_sizes': [], 'batch_normalization': False, 'dense_layer_l1_regularization': 0.0, 'dense_layer_l2_regularization': 0.0, 'dropout_probability': 0.5, 'early_stopping': True, 'init': 'glorot_uniform', 'layer_sizes': [1024, 512], 'learning_rate': 0.001, 'locally_connected_layers': [], 'topology': 'feedfoward', 'loss': 'custom:mse_with_inequalities', 'max_epochs': 5000, # Held-out validation supports this increase over the published 128. 'minibatch_size': 1024, 'optimizer': 'rmsprop', 'optimizer_implementation': 'keras', 'output_activation': 'sigmoid', "patience": 20, "min_delta": 0.0, 'peptide_encoding': { 'vector_encoding_name': 'BLOSUM62', 'alignment_method': 'left_pad_centered_right_pad', 'max_length': 15, }, 'peptide_allele_merge_activation': '', 'peptide_allele_merge_method': 'concatenate', 'peptide_amino_acid_encoding': 'BLOSUM62', 'peptide_dense_layer_sizes': [], 'random_negative_affinity_max': 50000.0, 'random_negative_affinity_min': 30000.0, 'random_negative_constant': 1, 'random_negative_distribution_smoothing': 0.0, 'random_negative_match_distribution': True, 'random_negative_rate': 1.0, 'random_negative_method': 'by_allele_equalize_nonbinders', 'random_negative_binder_threshold': 500.0, # Random-negative pool: ``pool_epochs=1`` keeps a single epoch of # encoded negatives in heap at a time. Setting >1 amortizes the # encoding cost across that many epochs but materializes the full # ``pool_epochs × per_epoch_count`` peptide buffer per worker — # on the 8xA100 release_exact run, ``100`` ballooned to ~199 GB/worker # (tooling overhead + intermediate Series) and OOM'd a 944 GB box. # Hold at 1 until a streaming-rebuild fix lands that doesn't # materialize the full N-epoch buffer at once. The pool primitive is # exercised at this default in unit tests. 'random_negative_pool_epochs': 1, 'train_data': { 'pretrain': True, 'pretrain_peptides_per_epoch': 64, 'pretrain_steps_per_epoch': 256, 'pretrain_patience': 2, 'pretrain_min_delta': 0.0001, 'pretrain_max_val_loss': 0.10, 'pretrain_max_epochs': 50, 'pretrain_min_epochs': 5, }, 'validation_split': 0.1, 'data_dependent_initialization_method': "lsuv", 'data_dependent_initialization_target': "post_activation", } grid = [] for layer_sizes in [[512, 256], [512, 512], [1024, 512], [1024, 1024]]: l1_base = 0.0000001 for l1 in [l1_base, l1_base / 10, l1_base / 100, l1_base / 1000, 0.0]: new = deepcopy(base_hyperparameters) new["topology"] = 'feedforward' new["layer_sizes"] = layer_sizes new["dense_layer_l1_regularization"] = l1 if not grid or new not in grid: grid.append(new) for layer_sizes in [[256, 512], [256, 256, 512], [256, 512, 512]]: l1_base = 0.0000001 for l1 in [l1_base, l1_base / 10, l1_base / 100, l1_base / 1000, 0.0]: new = deepcopy(base_hyperparameters) new["topology"] = 'with-skip-connections' new["layer_sizes"] = layer_sizes new["dense_layer_l1_regularization"] = l1 if not grid or new not in grid: grid.append(new) dump(grid, stdout) mhcflurry-2.3.6/downloads-generation/models_class1_pan/reassign_mass_spec_training_data.py000066400000000000000000000036631525677230600324020ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Reassign affinity values for mass spec data """ import sys import os import argparse import pandas parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument("data", metavar="CSV", help="Training data") parser.add_argument("--ms-only", action="store_true", default=False) parser.add_argument("--drop-negative-ms", action="store_true", default=False) parser.add_argument("--set-measurement-value", type=float) parser.add_argument("--out-csv") pandas.set_option('display.max_columns', 500) def go(args): df = pandas.read_csv(args.data) print(df) if args.drop_negative_ms: bad = df.loc[ (df.measurement_kind == "mass_spec") & (df.measurement_inequality != "<") ] print("Dropping ", len(bad)) df = df.loc[~df.index.isin(bad.index)].copy() if args.ms_only: print("Filtering to MS only") df = df.loc[df.measurement_kind == "mass_spec"].copy() if args.set_measurement_value is not None: indexer = df.measurement_kind == "mass_spec" df.loc[ indexer, "measurement_value" ] = args.set_measurement_value print("Reassigned:") print(df.loc[indexer]) if args.out_csv: out_csv = os.path.abspath(args.out_csv) df.to_csv(out_csv, index=False) print("Wrote", out_csv) if __name__ == "__main__": go(parser.parse_args(sys.argv[1:])) mhcflurry-2.3.6/downloads-generation/models_class1_pan_variants/000077500000000000000000000000001525677230600251735ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_pan_variants/GENERATE.WITH_HPC_CLUSTER.sh000077500000000000000000000000311525677230600313630ustar00rootroot00000000000000bash GENERATE.sh cluster mhcflurry-2.3.6/downloads-generation/models_class1_pan_variants/GENERATE.sh000077500000000000000000000231571525677230600267340ustar00rootroot00000000000000#!/bin/bash # # Uses an HPC cluster (Mount Sinai chimera cluster, which uses lsf job # scheduler). This would need to be modified for other sites. # # Usage: GENERATE.sh # set -e set -x DOWNLOAD_NAME=models_class1_pan_variants SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") pseudosequence_lookup() { python -c 'from mhcflurry.pseudosequences import main; main()' "$@" } if [ "$1" != "cluster" ] then GPUS=$(nvidia-smi -L 2> /dev/null | wc -l) || GPUS=0 echo "Detected GPUS: $GPUS" PROCESSORS=$(getconf _NPROCESSORS_ONLN) echo "Detected processors: $PROCESSORS" if [ "$GPUS" -eq "0" ]; then NUM_JOBS=${NUM_JOBS-1} else NUM_JOBS=${NUM_JOBS-$GPUS} fi echo "Num jobs: $NUM_JOBS" PARALLELISM_ARGS+=" --num-jobs $NUM_JOBS --max-tasks-per-worker 1 --gpus $GPUS --max-workers-per-gpu 1" else PARALLELISM_ARGS+=" --cluster-parallelism --cluster-max-retries 3 --cluster-submit-command bsub --cluster-results-workdir $HOME/mhcflurry-scratch --cluster-script-prefix-path $SCRIPT_DIR/cluster_submit_script_header.mssm_hpc.gpu.lsf" fi mkdir -p "$SCRATCH_DIR" if [ "$2" != "continue-incomplete" ] then echo "Fresh run" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" else echo "Continuing incomplete run" fi # Send stdout and stderr to a logfile included with the archive. LOG="$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.$(date +%s).txt" exec > >(tee -ia "$LOG") exec 2> >(tee -ia "$LOG" >&2) # Log some environment info echo "Invocation: $0 $@" date pip freeze git status cd $SCRATCH_DIR/$DOWNLOAD_NAME export OMP_NUM_THREADS=1 export PYTHONUNBUFFERED=1 if [ "$2" != "continue-incomplete" ] then cp $SCRIPT_DIR/generate_hyperparameters.production.py . cp $SCRIPT_DIR/generate_hyperparameters.py . cp $SCRIPT_DIR/reassign_mass_spec_training_data.py . cp $SCRIPT_DIR/exclude_data_from_training.py . python generate_hyperparameters.production.py > hyperparameters.production.yaml python generate_hyperparameters.py hyperparameters.production.yaml no_pretrain > hyperparameters.no_pretrain.yaml python generate_hyperparameters.py hyperparameters.no_pretrain.yaml single_hidden > hyperparameters.single_hidden_no_pretrain.yaml python generate_hyperparameters.py hyperparameters.production.yaml compact_peptide > hyperparameters.compact_peptide.yaml fi #VARIANTS=( no_additional_ms_ms_only_0nm ms_only_0nm no_additional_ms_0nm 0nm 500nm no_additional_ms no_pretrain compact_peptide 34mer_sequence single_hidden_no_pretrain affinity_only ) VARIANTS=( no_additional_ms ) for kind in "${VARIANTS[@]}" do CONTINUE_INCOMPLETE_ARGS="" if [ "$2" == "continue-incomplete" ] && [ -d "models.unselected.${kind}" ] then echo "Will continue existing run: $kind" CONTINUE_INCOMPLETE_ARGS="--continue-incomplete" fi ALLELE_SEQUENCES_DIR="$(mhcflurry-downloads path allele_sequences)" ALLELE_SEQUENCES="$(pseudosequence_lookup path \ --directory "$ALLELE_SEQUENCES_DIR" \ --length 39 \ --fallback-legacy)" HYPERPARAMETERS=hyperparameters.$kind.yaml if [ "$kind" == "34mer_sequence" ] then LEGACY_NO_DIFFERENTIATION="$(pseudosequence_lookup legacy no_differentiation)" ALLELE_SEQUENCES="$ALLELE_SEQUENCES_DIR/$LEGACY_NO_DIFFERENTIATION" HYPERPARAMETERS=hyperparameters.production.yaml fi TRAINING_DATA="$(mhcflurry-downloads path data_curated)/curated_training_data.csv.bz2" if [ "$kind" == "no_additional_ms" ] then TRAINING_DATA="train_data.$kind.csv" python reassign_mass_spec_training_data.py \ "$(mhcflurry-downloads path data_curated)/curated_training_data.no_additional_ms.csv.bz2" \ --set-measurement-value 100 \ --out-csv "$TRAINING_DATA" HYPERPARAMETERS=hyperparameters.production.yaml fi if [ "$kind" == "no_additional_ms_ms_only_0nm" ] then TRAINING_DATA="train_data.$kind.csv" python reassign_mass_spec_training_data.py \ "$(mhcflurry-downloads path data_curated)/curated_training_data.no_additional_ms.csv.bz2" \ --set-measurement-value 0 \ --drop-negative-ms \ --ms-only \ --out-csv "$TRAINING_DATA" HYPERPARAMETERS=hyperparameters.production.yaml fi if [ "$kind" == "no_additional_ms_0nm" ] then TRAINING_DATA="train_data.$kind.csv" python reassign_mass_spec_training_data.py \ "$(mhcflurry-downloads path data_curated)/curated_training_data.no_additional_ms.csv.bz2" \ --set-measurement-value 0 \ --out-csv "$TRAINING_DATA" HYPERPARAMETERS=hyperparameters.production.yaml fi if [ "$kind" == "0nm" ] then TRAINING_DATA="train_data.$kind.csv" python reassign_mass_spec_training_data.py \ "$(mhcflurry-downloads path data_curated)/curated_training_data.csv.bz2" \ --set-measurement-value 0 \ --out-csv "$TRAINING_DATA" HYPERPARAMETERS=hyperparameters.production.yaml fi if [ "$kind" == "500nm" ] then TRAINING_DATA="train_data.$kind.csv" python reassign_mass_spec_training_data.py \ "$(mhcflurry-downloads path data_curated)/curated_training_data.csv.bz2" \ --set-measurement-value 500 \ --out-csv "$TRAINING_DATA" HYPERPARAMETERS=hyperparameters.production.yaml fi if [ "$kind" == "50nm" ] then TRAINING_DATA="train_data.$kind.csv" python reassign_mass_spec_training_data.py \ "$(mhcflurry-downloads path data_curated)/curated_training_data.csv.bz2" \ --set-measurement-value 50 \ --out-csv "$TRAINING_DATA" HYPERPARAMETERS=hyperparameters.production.yaml fi if [ "$kind" == "ms_only_0nm" ] then TRAINING_DATA="train_data.$kind.csv" python reassign_mass_spec_training_data.py \ "$(mhcflurry-downloads path data_curated)/curated_training_data.mass_spec.csv.bz2" \ --set-measurement-value 0 \ --drop-negative-ms \ --out-csv "$TRAINING_DATA" HYPERPARAMETERS=hyperparameters.production.yaml fi if [ "$kind" == "affinity_only" ] then TRAINING_DATA="$(mhcflurry-downloads path data_curated)/curated_training_data.affinity.csv.bz2" HYPERPARAMETERS=hyperparameters.production.yaml fi if [ "$kind" == "exclude_epitopes" ] then TRAINING_DATA="train_data.$kind.csv" python exclude_data_from_training.py \ "$(mhcflurry-downloads path data_curated)/curated_training_data.csv.bz2" \ --remove-filename "$(mhcflurry-downloads path data_published)/epitopes/30377561/2018ONCOIMM0037R-file002.xlsx" \ --remove-kind 30377561 \ --out "$TRAINING_DATA" \ --out-removed "removed_train_data.$kind.csv" HYPERPARAMETERS=hyperparameters.production.yaml fi if [ "$kind" == "exclude_epitopes_50nm" ] then TRAINING_DATA="train_data.$kind.csv" python exclude_data_from_training.py \ "$(mhcflurry-downloads path data_curated)/curated_training_data.csv.bz2" \ --remove-filename "$(mhcflurry-downloads path data_published)/epitopes/30377561/2018ONCOIMM0037R-file002.xlsx" \ --remove-kind 30377561 \ --out "$TRAINING_DATA" \ --out-removed "removed_train_data.$kind.csv" python reassign_mass_spec_training_data.py \ "$TRAINING_DATA" \ --set-measurement-value 50 \ --out-csv "$TRAINING_DATA" HYPERPARAMETERS=hyperparameters.production.yaml fi mhcflurry-class1-train-pan-allele-models \ --data "$TRAINING_DATA" \ --allele-sequences "$ALLELE_SEQUENCES" \ --pretrain-data "$(mhcflurry-downloads path random_peptide_predictions)/predictions.csv.bz2" \ --held-out-measurements-per-allele-fraction-and-max 0.25 100 \ --num-folds 4 \ --hyperparameters "$HYPERPARAMETERS" \ --out-models-dir $(pwd)/models.unselected.${kind} \ --worker-log-dir "$SCRATCH_DIR/$DOWNLOAD_NAME" \ $PARALLELISM_ARGS $CONTINUE_INCOMPLETE_ARGS done echo "Done training. Beginning model selection." for kind in "${VARIANTS[@]}" do MODELS_DIR="models.unselected.${kind}" mhcflurry-class1-select-pan-allele-models \ --data "$MODELS_DIR/train_data.csv.bz2" \ --models-dir "$MODELS_DIR" \ --out-models-dir models.${kind} \ --min-models-per-fold 2 \ --max-models-per-fold 8 \ $PARALLELISM_ARGS cp "$MODELS_DIR/train_data.csv.bz2" "models.${kind}/train_data.csv.bz2" done cp $SCRIPT_ABSOLUTE_PATH . bzip2 -f "$LOG" for i in $(ls LOG-worker.*.txt) ; do bzip2 -f $i ; done RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.$(date +%Y%m%d).tar.bz2" tar -cjf "$RESULT" * echo "Created archive: $RESULT" # Split into <2GB chunks for GitHub PARTS="${RESULT}.part." # Check for pre-existing part files and rename them. for i in $(ls "${PARTS}"* ) do DEST="${i}.OLD.$(date +%s)" echo "WARNING: already exists: $i . Moving to $DEST" mv $i $DEST done split -b 2000M "$RESULT" "$PARTS" echo "Split into parts:" ls -lh "${PARTS}"* # Write out just the selected models # Move unselected into a hidden dir so it is excluded in the glob (*). mkdir .ignored mv models.unselected.* .ignored/ RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.selected.$(date +%Y%m%d).tar.bz2" tar -cjf "$RESULT" * mv .ignored/* . && rmdir .ignored echo "Created archive: $RESULT" cluster_submit_script_header.mssm_hpc.gpu.lsf000066400000000000000000000020771525677230600361720ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_pan_variants#!/bin/bash #BSUB -J MHCf-{work_item_num} # Job name #BSUB -P acc_nkcancer # allocation account or Unix group #BSUB -q gpu # queue #BSUB -R rusage[ngpus_excl_p=1] # 1 exclusive GPU #BSUB -R span[hosts=1] # one node #BSUB -n 1 # number of compute cores #BSUB -W 46:00 # walltime in HH:MM #BSUB -R rusage[mem=30000] # mb memory requested #BSUB -o {work_dir}/%J.stdout # output log (%J : JobID) #BSUB -eo {work_dir}/STDERR # error log #BSUB -L /bin/bash # Initialize the execution environment # set -e set -x echo "Subsequent stderr output redirected to stdout" >&2 exec 2>&1 export TMPDIR=/local/JOBS/mhcflurry-{work_item_num} export PATH=$HOME/.conda/envs/py36b/bin/:$PATH export PYTHONUNBUFFERED=1 export KMP_SETTINGS=1 export NETMHC_BUNDLE_HOME=$HOME/sinai/git/netmhc-bundle export NETMHC_BUNDLE_TMPDIR=/local/JOBS/netmhctmp-{work_item_num} export PATH=$NETMHC_BUNDLE_HOME/bin:$PATH free -m module add cuda/10.1.105 cudnn/7.6.5 module list # python -c 'import tensorflow as tf ; print("GPU AVAILABLE" if tf.test.is_gpu_available() else "GPU NOT AVAILABLE")' env cd {work_dir} mhcflurry-2.3.6/downloads-generation/models_class1_pan_variants/exclude_data_from_training.py000066400000000000000000000102401525677230600331020ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Extract allele/peptide pairs to exclude from training data. """ import sys import os import argparse import pandas from mhcflurry.common import normalize_allele_name def normalize_allele_name_or_return_unknown(s): return normalize_allele_name( s, raise_on_error=False, default_value="UNKNOWN") parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument("data", metavar="CSV", help="Training data") parser.add_argument( "--remove-filename", action="append", default=[], metavar="NAME", help="Data to drop", required=True) parser.add_argument( "--remove-kind", action="append", default=[], metavar="KIND", help="Format of data to drop. For published data, use the PMID.", choices=[ "30377561" # Koşaloğlu-Yalçın, ..., Peters. Oncoimmunology 2018 [PMID 30377561] ], required=True) parser.add_argument("--out", metavar="CSV", help="Result data path") parser.add_argument( "--out-removed", metavar="CSV", help="Write removed data to given path") pandas.set_option('display.max_columns', 500) LOADERS = {} def load_30377561(filename): # Koşaloğlu-Yalçın, ..., Peters. Oncoimmunology 2018 [PMID 30377561] dfs = pandas.read_excel(filename, sheet_name=None) df1 = dfs['Supp Table 5 positive & random'] result_df = [] result_df.append(df1.rename( columns={ "mt.pep": "peptide", "hla": "allele", })[["allele", "peptide"]]) result_df.append(df1.rename( columns={ "wt.pep": "peptide", "hla": "allele", })[["allele", "peptide"]]) df2 = dfs["Supp Table 4 viral epitopes"] result_df.append( df2.rename( columns={ "Epitope": "peptide", "Restriction": "allele", })[["allele", "peptide"]]) result_df = pandas.concat(result_df, ignore_index=True) return result_df LOADERS["30377561"] = load_30377561 def go(args): df = pandas.read_csv(args.data) print("Read training data of length %d: " % len(df)) print(df) df["allele_peptide"] = df.allele + "~" + df.peptide if len(args.remove_kind) != len(args.remove_filename): parser.error( "Number of arguments mismatch: --remove-kind [%d] != " "--remove-filename [%d]" % ( len(args.remove_kind), len(args.remove_filename))) removed = [] for (i, (kind, path)) in enumerate( zip(args.remove_kind, args.remove_filename)): print( "Processing file %d / %d: %s %s" % ( i + 1, len(args.remove_kind), kind, path)) to_remove = LOADERS[kind](path) print("Remove data contains %d entries" % len(to_remove)) to_remove["normalized_allele"] = to_remove.allele.map( normalize_allele_name_or_return_unknown) remove_allele_peptides = set( to_remove.normalized_allele + "~" + to_remove.peptide) remove_mask = df.allele_peptide.isin(remove_allele_peptides) print("Will remove %d entries." % remove_mask.sum()) removed.append(df.loc[remove_mask].copy()) df = df.loc[~remove_mask].copy() print("New training data size: %d" % len(df)) print("Done processing.") removed_df = pandas.concat(removed) print("Removed %d entries in total:" % len(removed_df)) print(removed_df) if args.out_removed: removed_df.to_csv(args.out_removed, index=False) print("Wrote: ", args.out_removed) if args.out: df.to_csv(args.out, index=False) print("Wrote: ", args.out) if __name__ == "__main__": go(parser.parse_args(sys.argv[1:])) generate_hyperparameters.production.py000077700000000000000000000000001525677230600461742../models_class1_pan/generate_hyperparameters.pyustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_pan_variantsmhcflurry-2.3.6/downloads-generation/models_class1_pan_variants/generate_hyperparameters.py000066400000000000000000000042321525677230600326330ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Generate grid of hyperparameters """ from sys import stdout, argv from copy import deepcopy from yaml import dump, load import argparse parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "production_hyperparameters", metavar="data.json", help="Production (i.e. standard) hyperparameters grid.") parser.add_argument( "kind", choices=('single_hidden', 'no_pretrain', 'compact_peptide'), help="Hyperameters variant to output") args = parser.parse_args(argv[1:]) with open(args.production_hyperparameters) as fd: production_hyperparameters_list = load(fd) def transform_to_single_hidden(hyperparameters): result = [] for size in [64, 128, 256, 1024]: new_hyperparameters = deepcopy(hyperparameters) new_hyperparameters['layer_sizes'] = [size] result.append(new_hyperparameters) return result def transform_to_no_pretrain(hyperparameters): result = deepcopy(hyperparameters) result['train_data']['pretrain'] = False return [result] def transform_to_compact_peptide(hyperparameters): result = deepcopy(hyperparameters) result['peptide_encoding']['alignment_method'] = 'left_pad_right_pad' return [result] TRANSFORMS={ "single_hidden": transform_to_single_hidden, "no_pretrain": transform_to_no_pretrain, "compact_peptide": transform_to_compact_peptide, } transform = TRANSFORMS[args.kind] result_list = [] for item in production_hyperparameters_list: results = transform(item) for result_item in results: if result_item not in result_list: result_list.append(result_item) dump(result_list, stdout) mhcflurry-2.3.6/downloads-generation/models_class1_pan_variants/reassign_mass_spec_training_data.py000077700000000000000000000000001525677230600472042../models_class1_pan/reassign_mass_spec_training_data.pyustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_presentation/000077500000000000000000000000001525677230600252215ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_presentation/GENERATE.sh000077500000000000000000000103401525677230600267500ustar00rootroot00000000000000#!/bin/bash # # # Usage: GENERATE.sh # # cluster mode uses an HPC cluster (Mount Sinai chimera cluster, which uses lsf job # scheduler). This would need to be modified for other sites. # set -e set -x DOWNLOAD_NAME=models_class1_presentation SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") mkdir -p "$SCRATCH_DIR" if [ "$2" != "continue-incomplete" ] then echo "Fresh run" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" else echo "Continuing incomplete run" fi # Send stdout and stderr to a logfile included with the archive. LOG="$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.$(date +%s).txt" exec > >(tee -ia "$LOG") exec 2> >(tee -ia "$LOG" >&2) # Log some environment info echo "Invocation: $0 $@" date pip freeze git status mhcflurry-downloads info cd $SCRATCH_DIR/$DOWNLOAD_NAME export OMP_NUM_THREADS=1 export PYTHONUNBUFFERED=1 if [ "$2" == "continue-incomplete" ] && [ -f "train_data.csv.bz2" ] then echo "Reusing existing training data" else cp $SCRIPT_DIR/make_train_data.py . time python make_train_data.py \ --hits "$(mhcflurry-downloads path models_class1_processing)/hits_with_tpm.csv.bz2" \ --proteome-reference-csv "$(mhcflurry-downloads path data_references)/uniprot_proteins.csv.bz2" \ --decoys-per-hit 2 \ --exclude-pmid 31844290 31495665 31154438 \ --only-format MULTIALLELIC \ --sample-fraction 0.1 \ --out "$(pwd)/train_data.csv" bzip2 -f train_data.csv fi rm -rf commands mkdir commands if [ "$2" == "continue-incomplete" ] && [ -f "models/weights.csv" ] then echo "Reusing existing trained predictor" else echo time mhcflurry-class1-train-presentation-models \ --data "$(pwd)/train_data.csv.bz2" \ --affinity-predictor \""$(mhcflurry-downloads path models_class1_pan)/models.combined"\" \ --processing-predictor-with-flanks \""$(mhcflurry-downloads path models_class1_processing)/models.selected.short_flanks"\" \ --processing-predictor-without-flanks \""$(mhcflurry-downloads path models_class1_processing)/models.selected.no_flank"\" \ --out-models-dir "$(pwd)/models" >> commands/train.sh fi if [ "$2" == "continue-incomplete" ] && [ -f "models/percent_ranks.csv" ] then echo "Reusing existing percentile ranks" else echo time mhcflurry-calibrate-percentile-ranks \ --models-dir "$(pwd)/models" \ --match-amino-acid-distribution-data \""$(mhcflurry-downloads path models_class1_pan)/models.combined/train_data.csv.bz2"\" \ --alleles-file \""$(mhcflurry-downloads path models_class1_pan)/models.combined/train_data.csv.bz2"\" \ --predictor-kind class1_presentation \ --num-peptides-per-length 10000 \ --alleles-per-genotype 1 \ --num-genotypes 50 \ --verbosity 1 >> commands/train.sh fi ls -lh commands if [ "$1" != "cluster" ] then echo "Running locally" for i in $(ls commands/*.sh) do echo "# *******" echo "# Command $i" cat $i bash $i done else echo "Running on cluster" for i in $(ls commands/*.sh) do echo "# *******" echo "# Command $i" cat $SCRIPT_DIR/cluster_submit_script_header.mssm_hpc.lsf > ${i}.lsf echo cd "$(pwd)" >> ${i}.lsf cat $i >> ${i}.lsf cat ${i}.lsf bsub -K < "${i}.lsf" & done wait fi for i in $(ls commands/*.sh) do mv "$i" "${i}.FINISHED" done cp "$(mhcflurry-downloads path models_class1_pan)/models.combined/train_data.csv.bz2" models/affinity_predictor_train_data.csv.bz2 cp "$(mhcflurry-downloads path models_class1_processing)/models.selected.with_flanks/train_data.csv.bz2" models/processing_predictor_train_data.csv.bz2 cp "$(mhcflurry-downloads path models_class1_processing)/models.selected.no_flank/train_data.csv.bz2" models/processing_predictor_no_flank_train_data.csv.bz2 cp $SCRIPT_ABSOLUTE_PATH . bzip2 -f "$LOG" for i in $(ls LOG-worker.*.txt) ; do bzip2 -f $i ; done RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.$(date +%Y%m%d).tar.bz2" tar -cjf "$RESULT" * echo "Created archive: $RESULT" cluster_submit_script_header.mssm_hpc.lsf000066400000000000000000000012461525677230600354230ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_presentation#!/bin/bash #BSUB -J MHCf # Job name #BSUB -P acc_nkcancer # allocation account or Unix group #BSUB -q premium # queue #BSUB -R span[hosts=1] # one node #BSUB -n 1 # number of compute cores #BSUB -W 40:00 # walltime in HH:MM #BSUB -R rusage[mem=45000] # mb memory requested #BSUB -o %J.stdout # output log (%J : JobID) #BSUB -eo %J.stderr # error log #BSUB -L /bin/bash # Initialize the execution environment # set -e set -x echo "Subsequent stderr output redirected to stdout" >&2 exec 2>&1 export TMPDIR=/local/JOBS/mhcflurry-{work_item_num} export PATH=$HOME/mhcflurry-conda-environment/bin/:$PATH export PYTHONUNBUFFERED=1 export KMP_SETTINGS=1 free -m module list env mhcflurry-2.3.6/downloads-generation/models_class1_presentation/make_train_data.py000066400000000000000000000230301525677230600306740ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Make training data by selecting decoys, etc. """ import sys import argparse import os import numpy import collections import pandas import tqdm import mhcflurry from mhcflurry.common import ( fraction_arg, normalize_class1_genotype, positive_float_arg, ) from mhcflurry.proteome_decoys import ( infer_flanking_length, load_reference_sequences, peptides_by_length_from_frame, sample_peptide_frame_for_accessions, ) parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "--hits", metavar="CSV", required=True, help="Multiallelic mass spec") proteome_source_group = parser.add_mutually_exclusive_group(required=True) proteome_source_group.add_argument( "--proteome-peptides", metavar="CSV", help="Proteome peptides") proteome_source_group.add_argument( "--proteome-reference-csv", metavar="CSV", help=( "Protein reference CSV with accession and seq columns. If specified, " "decoy peptide candidates are generated per sample instead of reading " "a materialized proteome peptide CSV.")) parser.add_argument( "--decoys-per-hit", type=positive_float_arg, metavar="N", default=99, help="Decoys per hit") parser.add_argument( "--exclude-pmid", nargs="+", default=[], help="Exclude given PMID") parser.add_argument( "--only-pmid", nargs="*", default=[], help="Include only the given PMID") parser.add_argument( "--exclude-train-data", nargs="+", default=[], help="Remove hits and decoys included in the given training data") parser.add_argument( "--only-format", choices=("MONOALLELIC", "MULTIALLELIC"), help="Include only data of the given format") parser.add_argument( "--sample-fraction", type=fraction_arg, help="Subsample data by specified fraction (e.g. 0.1)") parser.add_argument( "--out", metavar="CSV", required=True, help="File to write") def run(): args = parser.parse_args(sys.argv[1:]) hit_df = pandas.read_csv(args.hits) hit_df["pmid"] = hit_df["pmid"].astype(str) original_samples_pmids = hit_df.pmid.unique() numpy.testing.assert_equal(hit_df.hit_id.nunique(), len(hit_df)) hit_df = hit_df.loc[ (hit_df.mhc_class == "I") & (hit_df.peptide.str.len() <= 11) & (hit_df.peptide.str.len() >= 8) & (~hit_df.protein_ensembl.isnull()) & (hit_df.peptide.str.match("^[%s]+$" % "".join( mhcflurry.amino_acid.COMMON_AMINO_ACIDS))) ] hit_df['alleles'] = hit_df.hla.map(normalize_class1_genotype) hit_df["hla"] = hit_df["alleles"].map(" ".join) print("Loaded hits from %d samples" % hit_df.sample_id.nunique()) if args.only_format: hit_df = hit_df.loc[hit_df.format == args.only_format].copy() print("Subselected to %d %s samples" % ( hit_df.sample_id.nunique(), args.only_format)) if args.only_pmid or args.exclude_pmid: assert not (args.only_pmid and args.exclude_pmid) pmids = list(args.only_pmid) + list(args.exclude_pmid) missing = [pmid for pmid in pmids if pmid not in original_samples_pmids] assert not missing, (missing, original_samples_pmids) mask = hit_df.pmid.isin(pmids) if args.exclude_pmid: mask = ~mask new_hit_df = hit_df.loc[mask] print( "Selecting by pmids", pmids, "reduced dataset from", len(hit_df), "to", len(new_hit_df)) hit_df = new_hit_df.copy() print("Subselected by pmid to %d samples" % hit_df.sample_id.nunique()) allele_to_excluded_peptides = collections.defaultdict(set) for train_dataset in args.exclude_train_data: if not train_dataset: continue print("Excluding hits from", train_dataset) train_df = pandas.read_csv(train_dataset) for (allele, peptides) in train_df.groupby("allele").peptide.unique().iteritems(): allele_to_excluded_peptides[allele].update(peptides) train_counts = train_df.groupby( ["allele", "peptide"]).measurement_value.count().to_dict() hit_no_train = hit_df.loc[ [ not any([ train_counts.get((allele, row.peptide)) for allele in row.alleles ]) for _, row in tqdm.tqdm(hit_df.iterrows(), total=len(hit_df))] ] print( "Excluding hits from", train_dataset, "reduced dataset from", len(hit_df), "to", len(hit_no_train)) hit_df = hit_no_train sample_table = hit_df.drop_duplicates("sample_id").set_index("sample_id") grouped = hit_df.groupby("sample_id").nunique() for col in sample_table.columns: if (grouped[col] > 1).any(): del sample_table[col] if args.proteome_peptides: print("Loading proteome peptides") all_peptides_df = pandas.read_csv(args.proteome_peptides) print("Loaded: ", all_peptides_df.shape) all_peptides_df = all_peptides_df.loc[ all_peptides_df.protein_accession.isin( hit_df.protein_accession.unique()) & all_peptides_df.peptide.str.match("^[%s]+$" % "".join( mhcflurry.amino_acid.COMMON_AMINO_ACIDS)) ].copy() all_peptides_by_length = peptides_by_length_from_frame(all_peptides_df) print( "Subselected proteome peptides by accession: ", all_peptides_df.shape) proteome_sequences = None flanking_length = None else: print("Loading protein reference sequences") proteome_sequences = load_reference_sequences( args.proteome_reference_csv, hit_df.protein_accession.unique()) print("Loaded %d protein sequences" % len(proteome_sequences)) all_peptides_by_length = None flanking_length = infer_flanking_length(hit_df) print("Will generate proteome peptides per sample with flank length", flanking_length) print("Selecting decoys.") lengths = [8, 9, 10, 11] result_df = [] for sample_id, sub_df in tqdm.tqdm( hit_df.groupby("sample_id"), total=hit_df.sample_id.nunique()): result_df.append( sub_df[[ "protein_accession", "peptide", "sample_id", "n_flank", "c_flank", ]].copy()) result_df[-1]["hit"] = 1 excluded_peptides = set() for allele in sample_table.loc[sample_id].alleles: excluded_peptides.update(allele_to_excluded_peptides[allele]) print( sample_id, "will exclude", len(excluded_peptides), "peptides from decoy universe") for length in lengths: sample_peptides = sub_df.peptide.unique() sample_accessions = sub_df.protein_accession.unique() exclude_peptides = set(sample_peptides) exclude_peptides.update(excluded_peptides) num_decoys = int(len(sub_df) * args.decoys_per_hit / len(lengths)) if all_peptides_by_length is None: selected_decoys = sample_peptide_frame_for_accessions( sample_accessions, proteome_sequences, lengths=[length], flanking_length=flanking_length, exclude_peptides=exclude_peptides, n=num_decoys, ) else: universe = all_peptides_by_length[length] possible_universe = universe.loc[ (~universe.peptide.isin(sample_peptides)) & (~universe.peptide.isin(excluded_peptides)) & (universe.protein_accession.isin(sample_accessions)) ] selected_decoys = possible_universe.sample(n=num_decoys) result_df.append(selected_decoys[ ["protein_accession", "peptide", "n_flank", "c_flank"] ].copy()) result_df[-1]["hit"] = 0 result_df[-1]["sample_id"] = sample_id result_df = pandas.concat(result_df, ignore_index=True, sort=False) result_df["hla"] = result_df.sample_id.map(sample_table.hla) print(result_df) print("Counts:") print(result_df.groupby(["sample_id", "hit"]).peptide.nunique()) print("Hit counts:") print( result_df.loc[ result_df.hit == 1 ].groupby("sample_id").hit.count().sort_values()) print("Hit rates:") print(result_df.groupby("sample_id").hit.mean().sort_values()) if args.sample_fraction: print("Subsampling to ", args.sample_fraction) result_df = result_df.sample(frac=args.sample_fraction) print("Subsampled:") print(result_df) print("Hit rates:") print(result_df.groupby("sample_id").hit.mean().sort_values()) result_df.to_csv(args.out, index=False) print("Wrote: ", args.out) if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/models_class1_processing/000077500000000000000000000000001525677230600246625ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_processing/GENERATE.WITH_HPC_CLUSTER.sh000077500000000000000000000000311525677230600310520ustar00rootroot00000000000000bash GENERATE.sh cluster mhcflurry-2.3.6/downloads-generation/models_class1_processing/GENERATE.sh000077500000000000000000000137311525677230600264200ustar00rootroot00000000000000#!/bin/bash # # # Usage: GENERATE.sh # # cluster mode uses an HPC cluster (Mount Sinai chimera cluster, which uses lsf job # scheduler). This would need to be modified for other sites. # set -e set -x DOWNLOAD_NAME=models_class1_processing SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") if [ "$1" != "cluster" ] then GPUS=$(nvidia-smi -L 2> /dev/null | wc -l) || GPUS=0 echo "Detected GPUS: $GPUS" PROCESSORS=$(getconf _NPROCESSORS_ONLN) echo "Detected processors: $PROCESSORS" if [ "$GPUS" -eq "0" ]; then NUM_JOBS=${NUM_JOBS-1} else NUM_JOBS=${NUM_JOBS-$GPUS} fi echo "Num jobs: $NUM_JOBS" PARALLELISM_ARGS+=" --num-jobs $NUM_JOBS --max-tasks-per-worker 1 --gpus $GPUS --max-workers-per-gpu 1" else PARALLELISM_ARGS+=" --cluster-parallelism --cluster-max-retries 3 --cluster-submit-command bsub --cluster-results-workdir $HOME/mhcflurry-scratch --cluster-script-prefix-path $SCRIPT_DIR/cluster_submit_script_header.mssm_hpc.lsf" fi mkdir -p "$SCRATCH_DIR" if [ "$2" != "continue-incomplete" ] then echo "Fresh run" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" else echo "Continuing incomplete run" fi # Send stdout and stderr to a logfile included with the archive. LOG="$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.$(date +%s).txt" exec > >(tee -ia "$LOG") exec 2> >(tee -ia "$LOG" >&2) # Log some environment info echo "Invocation: $0 $@" date pip freeze git status cd $SCRATCH_DIR/$DOWNLOAD_NAME export OMP_NUM_THREADS=1 export PYTHONUNBUFFERED=1 VARIANTS=( with_flanks no_flank short_flanks ) #VARIANTS=( with_flanks no_flank ) cp $SCRIPT_DIR/generate_hyperparameters.variants.py . cp $SCRIPT_DIR/generate_hyperparameters.base.py . python generate_hyperparameters.base.py > hyperparameters.base.yaml for kind in "${VARIANTS[@]}" do python generate_hyperparameters.variants.py hyperparameters.base.yaml $kind > hyperparameters.$kind.yaml done if [ "$2" == "continue-incomplete" ] && [ -f "hits_with_tpm.csv.bz2" ] then echo "Reusing existing expression-annotated hits data" else cp $SCRIPT_DIR/annotate_hits_with_expression.py . time python annotate_hits_with_expression.py \ --hits "$(mhcflurry-downloads path data_mass_spec_annotated)/annotated_ms.csv.bz2" \ --expression "$(mhcflurry-downloads path data_curated)/rna_expression.csv.bz2" \ --out "$(pwd)/hits_with_tpm.csv" bzip2 -f hits_with_tpm.csv fi if [ "$2" == "continue-incomplete" ] && [ -f "proteome_peptides.csv.bz2" ] then echo "Reusing existing proteome peptide list" else cp $SCRIPT_DIR/write_proteome_peptides.py . time python write_proteome_peptides.py \ "$(mhcflurry-downloads path data_mass_spec_annotated)/annotated_ms.csv.bz2" \ "$(mhcflurry-downloads path data_references)/uniprot_proteins.csv.bz2" \ --out "$(pwd)/proteome_peptides.csv" bzip2 -f proteome_peptides.csv fi if [ "$2" == "continue-incomplete" ] && [ -f "train_data.csv.bz2" ] then echo "Reusing existing training data" else cp $SCRIPT_DIR/make_train_data.py . echo "Using affinity predictor:" cat "$(mhcflurry-downloads path models_class1_pan)/models.combined/info.txt" time python "$(pwd)/make_train_data.py" \ --hits "$(pwd)/hits_with_tpm.csv.bz2" \ --affinity-predictor "$(mhcflurry-downloads path models_class1_pan)/models.combined" \ --proteome-peptides "$(pwd)/proteome_peptides.csv.bz2" \ --ppv-multiplier 100 \ --hit-multiplier-to-take 2 \ --out "$(pwd)/train_data.csv" \ $PARALLELISM_ARGS bzip2 -f "$(pwd)/train_data.csv" fi TRAIN_DATA="$(pwd)/train_data.csv.bz2" for kind in "${VARIANTS[@]}" do CONTINUE_INCOMPLETE_ARGS="" if [ "$2" == "continue-incomplete" ] && [ -d "models.unselected.$kind" ] then echo "Will continue existing run: $kind" CONTINUE_INCOMPLETE_ARGS="--continue-incomplete" fi mhcflurry-class1-train-processing-models \ --data "$TRAIN_DATA" \ --held-out-samples 10 \ --num-folds 4 \ --hyperparameters "$(pwd)/hyperparameters.$kind.yaml" \ --out-models-dir "$(pwd)/models.unselected.$kind" \ --worker-log-dir "$SCRATCH_DIR/$DOWNLOAD_NAME" \ $PARALLELISM_ARGS $CONTINUE_INCOMPLETE_ARGS done echo "Done training. Beginning model selection." for kind in "${VARIANTS[@]}" do if [ "$2" == "continue-incomplete" ] && [ -f "models.selected.$kind/train_data.csv.bz2" ] then echo "Reusing existing selected models for $kind" else MODELS_DIR="$(pwd)/models.unselected.$kind" mhcflurry-class1-select-processing-models \ --data "$MODELS_DIR/train_data.csv.bz2" \ --models-dir "$MODELS_DIR" \ --out-models-dir "$(pwd)/models.selected.$kind" \ --min-models-per-fold 1 \ --max-models-per-fold 2 \ $PARALLELISM_ARGS cp "$MODELS_DIR/train_data.csv.bz2" "models.selected.$kind/train_data.csv.bz2" fi done cp $SCRIPT_ABSOLUTE_PATH . bzip2 -f "$LOG" for i in $(ls LOG-worker.*.txt) ; do bzip2 -f $i ; done RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.$(date +%Y%m%d).tar.bz2" tar -cjf "$RESULT" * echo "Created archive: $RESULT" # Split into <2GB chunks for GitHub PARTS="${RESULT}.part." # Check for pre-existing part files and rename them. for i in $(ls "${PARTS}"* ) do DEST="${i}.OLD.$(date +%s)" echo "WARNING: already exists: $i . Moving to $DEST" mv $i $DEST done split -b 2000M "$RESULT" "$PARTS" echo "Split into parts:" ls -lh "${PARTS}"* # Write out just the selected models # Move unselected into a hidden dir so it is excluded in the glob (*). mkdir .ignored mv models.unselected.* .ignored/ RESULT="$SCRATCH_DIR/${DOWNLOAD_NAME}.selected.$(date +%Y%m%d).tar.bz2" tar -cjf "$RESULT" * mv .ignored/* . && rmdir .ignored echo "Created archive: $RESULT" mhcflurry-2.3.6/downloads-generation/models_class1_processing/annotate_hits_with_expression.py000066400000000000000000000047761525677230600334240ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Annotate hits with expression (tpm), and roll up to just the highest-expressed gene for each peptide. """ import sys import argparse import os import pandas import tqdm parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "--hits", metavar="CSV", required=True, help="Multiallelic mass spec") parser.add_argument( "--expression", metavar="CSV", required=True, help="Expression data") parser.add_argument( "--out", metavar="CSV", required=True, help="File to write") def annotate_tpm(hit_df, expression_df): """Return per-hit TPM sums for each row's expression dataset.""" tpm = pandas.Series(0.0, index=hit_df.index) for expression_dataset, sub_df in hit_df.groupby( "expression_dataset", sort=False): expression_by_gene = expression_df[expression_dataset] genes = sub_df.protein_ensembl.str.split().explode() gene_tpm = genes.map(expression_by_gene).fillna(0.0) tpm.loc[sub_df.index] = gene_tpm.groupby(level=0).sum() return tpm def run(): args = parser.parse_args(sys.argv[1:]) args.out = os.path.abspath(args.out) hit_df = pandas.read_csv(args.hits) hit_df = hit_df.loc[ (~hit_df.protein_ensembl.isnull()) ] print("Loaded hits from %d samples" % hit_df.sample_id.nunique()) expression_df = pandas.read_csv(args.expression, index_col=0).fillna(0) # Add a column to hit_df giving expression value for that sample and that gene print("Annotating expression.") hit_df["tpm"] = annotate_tpm(hit_df, expression_df) # Discard hits except those that have max expression for each hit_id print("Selecting max-expression transcripts for each hit.") max_gene_hit_df = hit_df.loc[ hit_df.tpm == hit_df.hit_id.map(hit_df.groupby("hit_id").tpm.max()) ].sample(frac=1.0).drop_duplicates("hit_id") max_gene_hit_df.to_csv(args.out, index=False) print("Wrote", args.out) if __name__ == '__main__': run() cluster_submit_script_header.mssm_hpc.lsf000066400000000000000000000021061525677230600350600ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_processing#!/bin/bash #BSUB -J MHCf-{work_item_num} # Job name #BSUB -P acc_nkcancer # allocation account or Unix group #BSUB -q gpu # queue #BSUB -gpu "num=1:mode=exclusive_process:mps=no:j_exclusive=yes" #BSUB -R span[hosts=1] # one node #BSUB -n 1 # number of compute cores #BSUB -W 46:00 # walltime in HH:MM #BSUB -R rusage[mem=30000] # mb memory requested #BSUB -o {work_dir}/%J.stdout # output log (%J : JobID) #BSUB -eo {work_dir}/STDERR # error log #BSUB -L /bin/bash # Initialize the execution environment # set -e set -x echo "Subsequent stderr output redirected to stdout" >&2 exec 2>&1 export TMPDIR=/local/JOBS/mhcflurry-{work_item_num} export PATH=$HOME/mhcflurry-conda-environment/bin/:$PATH export PYTHONUNBUFFERED=1 export KMP_SETTINGS=1 #export TF_GPU_ALLOCATOR=cuda_malloc_async free -m module add cuda/11.8.0 cudnn/8.9.5-11 module list nvidia-smi export XLA_FLAGS=--xla_gpu_cuda_data_dir=$CUDA_PATH #export XLA_FLAGS='--xla_compile=False' python -c 'import tensorflow as tf ; print("GPU AVAILABLE" if tf.test.is_gpu_available() else "GPU NOT AVAILABLE")' env cd {work_dir} mhcflurry-2.3.6/downloads-generation/models_class1_processing/generate_hyperparameters.base.py000066400000000000000000000050471525677230600332400ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Generate grid of hyperparameters """ from __future__ import print_function from sys import stdout, stderr from copy import deepcopy from yaml import dump base_hyperparameters = dict( convolutional_filters=64, convolutional_kernel_size=8, convolutional_kernel_l1_l2=(0.00, 0.0), flanking_averages=True, n_flank_length=15, c_flank_length=15, post_convolutional_dense_layer_sizes=[], minibatch_size=512, dropout_rate=0.5, convolutional_activation="relu", patience=20, learning_rate=0.001) base_hyperparameters["optimizer_implementation"] = "keras" base_hyperparameters["init"] = "glorot_uniform" grid = [] def hyperparrameters_grid(): for learning_rate in [0.001]: for convolutional_activation in ["tanh", "relu"]: for convolutional_filters in [256, 512]: for flanking_averages in [True]: for convolutional_kernel_size in [11, 13, 15, 17]: for l1 in [0.0, 1e-6]: for s in [[8], [16]]: for d in [0.3, 0.5]: new = deepcopy(base_hyperparameters) new["learning_rate"] = learning_rate new["convolutional_activation"] = convolutional_activation new["convolutional_filters"] = convolutional_filters new["flanking_averages"] = flanking_averages new["convolutional_kernel_size"] = convolutional_kernel_size new["convolutional_kernel_l1_l2"] = (l1, 0.0) new["post_convolutional_dense_layer_sizes"] = s new["dropout_rate"] = d yield new for new in hyperparrameters_grid(): if new not in grid: grid.append(new) print("Hyperparameters grid size: %d" % len(grid), file=stderr) dump(grid, stdout) mhcflurry-2.3.6/downloads-generation/models_class1_processing/generate_hyperparameters.variants.py000066400000000000000000000035461525677230600341570ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Generate grid of hyperparameters """ from sys import stdout, argv from copy import deepcopy from yaml import dump, unsafe_load import argparse parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "production_hyperparameters", metavar="data.json", help="Production (i.e. standard) hyperparameters grid.") parser.add_argument( "kind", choices=('with_flanks', 'no_n_flank', 'no_c_flank', 'no_flank', 'short_flanks'), help="Hyperameters variant to output") args = parser.parse_args(argv[1:]) with open(args.production_hyperparameters) as fd: production_hyperparameters_list = unsafe_load(fd) def transform(kind, hyperparameters): new_hyperparameters = deepcopy(hyperparameters) if kind == "no_n_flank" or kind == "no_flank": new_hyperparameters["n_flank_length"] = 0 if kind == "no_c_flank" or kind == "no_flank": new_hyperparameters["c_flank_length"] = 0 if kind == "short_flanks": new_hyperparameters["c_flank_length"] = 5 new_hyperparameters["n_flank_length"] = 5 return [new_hyperparameters] result_list = [] for item in production_hyperparameters_list: results = transform(args.kind, item) for result_item in results: if result_item not in result_list: result_list.append(result_item) dump(result_list, stdout) mhcflurry-2.3.6/downloads-generation/models_class1_processing/make_train_data.py000066400000000000000000000410251525677230600303410ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Make training data by selecting decoys, etc. """ import sys import argparse import numpy import time from functools import partial import pandas import tqdm from mhcflurry.processing_matching import ( add_processing_matching_args, initialize_matching_artifacts, prepare_processing_training_sample, validate_matched_training_data) from mhcgnomes import parse from mhcflurry.common import ( add_random_seed_arg, allele_locus_name, configure_logging, configure_random_seed, derive_seed, normalize_allele_name, positive_float_arg, positive_int_arg, ) from mhcflurry.local_parallelism import ( add_local_parallelism_args, resolve_local_parallelism_args, worker_pool_with_gpu_assignments_from_args, call_wrapped_kwargs) from mhcflurry.proteome_decoys import ( infer_flanking_length, load_reference_sequences, peptides_by_length_from_frame, sample_peptide_frame_for_accessions, ) from mhcflurry.cluster_parallelism import ( add_cluster_parallelism_args, cluster_results_from_args) tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 # To avoid pickling large matrices to send to child processes when running in # parallel, we use this global variable as a place to store data. Data that is # stored here before creating the thread pool will be inherited to the child # processes upon fork() call, allowing us to share large data with the workers # via shared memory. GLOBAL_DATA = {} # Generic worker initialization looks for this standard name. Keep the legacy # GLOBAL_DATA alias because worker functions and generated scripts expose it. WORKER_CONTEXT = GLOBAL_DATA parser = argparse.ArgumentParser(usage=__doc__) add_processing_matching_args(parser) parser.add_argument( "--hits", metavar="CSV", required=True, help="Multiallelic mass spec") parser.add_argument( "--affinity-predictor", required=True, metavar="CSV", help="Class 1 affinity predictor to use") proteome_source_group = parser.add_mutually_exclusive_group(required=True) proteome_source_group.add_argument( "--proteome-peptides", metavar="CSV", help="Proteome peptides") proteome_source_group.add_argument( "--proteome-reference-csv", metavar="CSV", help=( "Protein reference CSV with accession and seq columns. If specified, " "decoy peptide candidates are generated inside workers instead of " "reading a materialized proteome peptide CSV.")) parser.add_argument( "--hit-multiplier-to-take", type=positive_float_arg, default=1, help="") parser.add_argument( "--ppv-multiplier", type=positive_int_arg, metavar="N", default=1000, help="Candidate decoys per hit before matching (legacy: top-binder pool multiplier).") parser.add_argument( "--exclude-contig", help="Exclude entries annotated to the given contig") parser.add_argument( "--out", metavar="CSV", required=True, help="File to write") parser.add_argument( "--alleles", nargs="+", help="Include only the specified alleles") add_random_seed_arg(parser) add_local_parallelism_args(parser) add_cluster_parallelism_args(parser) HUMAN_CLASS1_ABC_LOCI = ("HLA-A", "HLA-B", "HLA-C") def canonicalize_processing_allele(raw_name): """Return a sequence-resolved canonical HLA-A/B/C allele or ``None``.""" raw_name = str(raw_name).strip() if allele_locus_name(raw_name) not in HUMAN_CLASS1_ABC_LOCI: return None normalized = normalize_allele_name( raw_name, raise_on_error=False, use_allele_aliases=False, ) parsed = ( parse(normalized, only_class1=True, raise_on_error=False) if normalized is not None else None ) if parsed is None or len(getattr(parsed, "allele_fields", ())) < 2: raise ValueError( "Processing training requires a sequence-resolved HLA-A/B/C " "allele with at least two fields; got %r." % raw_name ) return normalized def predictor_allele_for_processing(affinity_predictor, allele): """Resolve a normalized training allele to a supported predictor key.""" predictor_allele = affinity_predictor.canonicalize_allele_name(allele) if predictor_allele not in affinity_predictor.supported_alleles: raise ValueError( "Affinity predictor does not support normalized processing " "allele %s (resolved to %s)." % (allele, predictor_allele) ) return predictor_allele def do_process_samples(samples, constant_data=None, seed=None): import mhcflurry import pandas import tqdm tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 columns_to_keep = [ "hit_id", "protein_accession", "n_flank", "c_flank", "peptide", "sample_id", "affinity_prediction", "hit", ] if constant_data is None: constant_data = GLOBAL_DATA if seed is not None: numpy.random.seed(int(seed) % (2 ** 32)) args = constant_data['args'] lengths = constant_data['lengths'] all_peptides_by_length = constant_data.get('all_peptides_by_length') proteome_sequences = constant_data.get('proteome_sequences') flanking_length = constant_data.get('flanking_length') sample_table = constant_data['sample_table'] hit_df = constant_data['hit_df'] hit_df = hit_df.loc[ hit_df.sample_id.isin(samples) ] affinity_predictor = mhcflurry.Class1AffinityPredictor.load( args.affinity_predictor) print("Loaded", affinity_predictor) predictor_alleles = { allele: predictor_allele_for_processing(affinity_predictor, allele) for allele in hit_df.allele.unique() } result_df = [] for sample_id, sub_hit_df in tqdm.tqdm( hit_df.groupby("sample_id"), total=hit_df.sample_id.nunique()): sub_hit_df = sub_hit_df.copy() sub_hit_df["hit"] = 1 sample_peptides = sub_hit_df.peptide.unique() sample_accessions = sub_hit_df.protein_accession.unique() decoys_df = [] for length in lengths: num_decoys = int( len(sub_hit_df) * args.ppv_multiplier / len(lengths)) if all_peptides_by_length is None: selected_decoys = sample_peptide_frame_for_accessions( sample_accessions, proteome_sequences, lengths=[length], flanking_length=flanking_length, exclude_peptides=sample_peptides, n=num_decoys, ) else: universe = all_peptides_by_length[length] possible_universe = universe.loc[ (~universe.peptide.isin(sample_peptides)) & (universe.protein_accession.isin(sample_accessions)) ] selected_decoys = possible_universe.sample(n=num_decoys) decoys_df.append( selected_decoys[[ "protein_accession", "peptide", "n_flank", "c_flank" ]].drop_duplicates("peptide")) merged_df = pandas.concat( [sub_hit_df] + decoys_df, ignore_index=True, sort=False) training_allele = sample_table.loc[sample_id].allele predictor_allele = predictor_alleles[training_allele] prediction_col = "%s affinity" % predictor_allele predictions_df = pandas.DataFrame( index=merged_df.peptide.unique(), columns=[prediction_col]) predictions_df[prediction_col] = affinity_predictor.predict( predictions_df.index, allele=predictor_allele) merged_df["affinity_prediction"] = merged_df.peptide.map( predictions_df[prediction_col]) if args.negative_policy == "matched": merged_df["sample_id"] = sample_id selected_df = prepare_processing_training_sample( merged_df[columns_to_keep], args, args.matching_reference) else: merged_df = merged_df.sort_values("affinity_prediction", ascending=True) num_to_take = int(len(sub_hit_df) * args.hit_multiplier_to_take) selected_df = merged_df.head(num_to_take)[ columns_to_keep ].sample(frac=1.0).copy() selected_df["hit"] = selected_df["hit"].fillna(0) selected_df["sample_id"] = sample_id result_df.append(selected_df) print( "Processed sample", sample_id, "with hit and decoys:\n", selected_df.hit.value_counts()) result_df = pandas.concat(result_df, ignore_index=True, sort=False) return result_df def run(): import mhcflurry args = parser.parse_args(sys.argv[1:]) args.matching_reference = initialize_matching_artifacts(args) configure_logging() master_seed = configure_random_seed(args.random_seed, name="make-processing-train-data") resolve_local_parallelism_args( args, cap_auto_num_jobs=not args.cluster_parallelism, ) serial_run = not args.cluster_parallelism and args.num_jobs == 0 hit_df = pandas.read_csv(args.hits) numpy.testing.assert_equal(hit_df.hit_id.nunique(), len(hit_df)) hit_df = hit_df.loc[ (hit_df.mhc_class == "I") & (hit_df.peptide.str.len() <= 11) & (hit_df.peptide.str.len() >= 8) & (~hit_df.protein_ensembl.isnull()) & (hit_df.peptide.str.match("^[%s]+$" % "".join( mhcflurry.amino_acid.COMMON_AMINO_ACIDS))) ] print("Loaded hits from %d samples" % hit_df.sample_id.nunique()) hit_df = hit_df.loc[hit_df.format == "MONOALLELIC"].copy() print("Subselected to %d monoallelic samples" % hit_df.sample_id.nunique()) hit_df["allele"] = hit_df.hla.map(canonicalize_processing_allele) hit_df = hit_df.loc[~hit_df.allele.isnull()].copy() print( "Subselected to %d sequence-resolved HLA-A/B/C samples" % hit_df.sample_id.nunique() ) if args.exclude_contig: new_hit_df = hit_df.loc[ hit_df.protein_primary_ensembl_contig.astype(str) != args.exclude_contig ] print( "Excluding contig", args.exclude_contig, "reduced dataset from", len(hit_df), "to", len(new_hit_df)) hit_df = new_hit_df.copy() if args.alleles: filter_alleles = set() for value in args.alleles: normalized = canonicalize_processing_allele(value) if normalized is None: raise ValueError( "--alleles requires HLA-A/B/C alleles; got %r" % value ) filter_alleles.add(normalized) new_hit_df = hit_df.loc[ hit_df.allele.isin(filter_alleles) ] print( "Selecting alleles", args.alleles, "reduced dataset from", len(hit_df), "to", len(new_hit_df)) hit_df = new_hit_df.copy() if hit_df.empty: raise ValueError( "No sequence-resolved HLA-A/B/C monoallelic hits remain after " "the requested filters." ) sample_table = hit_df.drop_duplicates("sample_id").set_index("sample_id") grouped = hit_df.groupby("sample_id").nunique() for col in sample_table.columns: if (grouped[col] > 1).any(): del sample_table[col] sample_table["total_hits"] = hit_df.groupby("sample_id").peptide.nunique() if args.proteome_peptides: print("Loading proteome peptides") all_peptides_df = pandas.read_csv(args.proteome_peptides) print("Loaded: ", all_peptides_df.shape) all_peptides_df = all_peptides_df.loc[ all_peptides_df.protein_accession.isin( hit_df.protein_accession.unique()) & all_peptides_df.peptide.str.match("^[%s]+$" % "".join( mhcflurry.amino_acid.COMMON_AMINO_ACIDS)) ].copy() all_peptides_by_length = peptides_by_length_from_frame(all_peptides_df) print( "Subselected proteome peptides by accession: ", all_peptides_df.shape) proteome_sequences = None flanking_length = None else: print("Loading protein reference sequences") proteome_sequences = load_reference_sequences( args.proteome_reference_csv, hit_df.protein_accession.unique()) print("Loaded %d protein sequences" % len(proteome_sequences)) all_peptides_by_length = None flanking_length = infer_flanking_length(hit_df) print("Will generate proteome peptides in workers with flank length", flanking_length) print("Selecting decoys.") GLOBAL_DATA['args'] = args GLOBAL_DATA['lengths'] = [8, 9, 10, 11] GLOBAL_DATA['all_peptides_by_length'] = all_peptides_by_length GLOBAL_DATA['proteome_sequences'] = proteome_sequences GLOBAL_DATA['flanking_length'] = flanking_length GLOBAL_DATA['sample_table'] = sample_table GLOBAL_DATA['hit_df'] = hit_df worker_pool = None start = time.time() sample_order = list(hit_df.sample_id.unique()) tasks = [{"samples": [sample], "seed": derive_seed(master_seed, "sample", sample)} for sample in sample_order] if serial_run: # Serial run print("Running in serial.") results = [do_process_samples(**task) for task in tasks] elif args.cluster_parallelism: # Run using separate processes HPC cluster. print("Running on cluster.") results = cluster_results_from_args( args, work_function=do_process_samples, work_items=tasks, constant_data=GLOBAL_DATA, input_serialization_method="dill", result_serialization_method="pickle", clear_constant_data=False) else: worker_pool = worker_pool_with_gpu_assignments_from_args( args, worker_context_module=__name__, worker_context_data=GLOBAL_DATA, ) print("Worker pool", worker_pool) assert worker_pool is not None results = worker_pool.imap_unordered( partial(call_wrapped_kwargs, do_process_samples), tasks, chunksize=1) print("Reading results") result_by_sample = {} try: for worker_result in tqdm.tqdm(results, total=len(tasks)): for sample_id, selected_df in worker_result.groupby("sample_id"): print( "Received result for sample", sample_id, "with hit and decoys:\n", selected_df.hit.value_counts()) if sample_id in result_by_sample: raise RuntimeError("Duplicate processing result for sample %s" % sample_id) result_by_sample[sample_id] = selected_df if worker_pool: worker_pool.close() worker_pool.join() worker_pool = None finally: if worker_pool: worker_pool.terminate() worker_pool.join() print("Received all results in %0.2f sec" % (time.time() - start)) missing = set(sample_order) - set(result_by_sample) if missing: raise RuntimeError("Missing processing results for samples: %s" % sorted(missing)) result_df = pandas.concat([result_by_sample[sample] for sample in sample_order], ignore_index=True, sort=False) result_df["hla"] = result_df.sample_id.map(sample_table.allele) print(result_df) print("Counts:") print(result_df.groupby(["sample_id", "hit"]).peptide.nunique()) print("Hit counts:") print( result_df.loc[ result_df.hit == 1 ].groupby("sample_id").hit.count().sort_values()) print("Hit rates:") print(result_df.groupby("sample_id").hit.mean().sort_values()) validate_matched_training_data( result_df, policy="matched" if args.negative_policy == "matched" else "legacy") result_df.to_csv(args.out, index=False) print("Wrote: ", args.out) if __name__ == '__main__': run() mhcflurry-2.3.6/downloads-generation/models_class1_processing/write_proteome_peptides.py000077700000000000000000000000001525677230600432322../data_predictions/write_proteome_peptides.pyustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_selected_no_mass_spec/000077500000000000000000000000001525677230600270275ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_selected_no_mass_spec/GENERATE.sh000077500000000000000000000040371525677230600305640ustar00rootroot00000000000000#!/bin/bash # # Model select standard MHCflurry Class I models. # set -e set -x DOWNLOAD_NAME=models_class1_selected_no_mass_spec SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") mkdir -p "$SCRATCH_DIR" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" # Send stdout and stderr to a logfile included with the archive. exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) # Log some environment info date pip freeze git status cd $SCRATCH_DIR/$DOWNLOAD_NAME cp $SCRIPT_DIR/write_validation_data.py . mkdir models GPUS=$(nvidia-smi -L 2> /dev/null | wc -l) || GPUS=0 echo "Detected GPUS: $GPUS" PROCESSORS=$(getconf _NPROCESSORS_ONLN) echo "Detected processors: $PROCESSORS" time python ./write_validation_data.py \ --include "$(mhcflurry-downloads path data_curated)/curated_training_data.no_mass_spec.csv.bz2" \ --exclude "$(mhcflurry-downloads path models_class1_unselected)/models/train_data.csv.bz2" \ --only-alleles-present-in-exclude \ --out-data test.csv \ --out-summary test.summary.csv wc -l test.csv time mhcflurry-class1-select-allele-specific-models \ --data test.csv \ --models-dir "$(mhcflurry-downloads path models_class1_unselected)/models" \ --out-models-dir models \ --scoring combined:mse,consensus \ --consensus-num-peptides-per-length 10000 \ --combined-min-models 8 \ --combined-max-models 16 \ --num-jobs $(expr $PROCESSORS \* 2) --gpus $GPUS --max-workers-per-gpu 2 --max-tasks-per-worker 5 time mhcflurry-calibrate-percentile-ranks \ --models-dir models \ --num-peptides-per-length 100000 \ --num-jobs $(expr $PROCESSORS \* 2) --gpus $GPUS --max-workers-per-gpu 2 --max-tasks-per-worker 50 cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt tar -cjf "../${DOWNLOAD_NAME}.tar.bz2" * echo "Created archive: $SCRATCH_DIR/$DOWNLOAD_NAME.tar.bz2" mhcflurry-2.3.6/downloads-generation/models_class1_selected_no_mass_spec/write_validation_data.py000077700000000000000000000000001525677230600436042../models_class1/write_validation_data.pyustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_trained_with_mass_spec/000077500000000000000000000000001525677230600272245ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_trained_with_mass_spec/GENERATE.sh000077500000000000000000000044501525677230600307600ustar00rootroot00000000000000#!/bin/bash # # Model select MHCflurry Class I models that were trained on mass-spec. Model # selection uses both mass-spec and affinity data. # set -e set -x DOWNLOAD_NAME=models_class1_trained_with_mass_spec SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") mkdir -p "$SCRATCH_DIR" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" # Send stdout and stderr to a logfile included with the archive. exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) # Log some environment info date pip freeze git status cd $SCRATCH_DIR/$DOWNLOAD_NAME cp $SCRIPT_DIR/write_validation_data.py . mkdir models GPUS=$(nvidia-smi -L 2> /dev/null | wc -l) || GPUS=0 echo "Detected GPUS: $GPUS" PROCESSORS=$(getconf _NPROCESSORS_ONLN) echo "Detected processors: $PROCESSORS" python ./write_validation_data.py \ --include "$(mhcflurry-downloads path data_curated)/curated_training_data.with_mass_spec.csv.bz2" \ --exclude "$(mhcflurry-downloads path models_class1_unselected_with_mass_spec)/models/train_data.csv.bz2" \ --only-alleles-present-in-exclude \ --out-data test.csv \ --out-summary test.summary.csv wc -l test.csv time mhcflurry-class1-select-allele-specific-models \ --data test.csv \ --models-dir "$(mhcflurry-downloads path models_class1_unselected_with_mass_spec)/models" \ --out-models-dir models \ --scoring combined:mass-spec,mse,consensus \ --consensus-num-peptides-per-length 10000 \ --combined-min-models 8 \ --combined-max-models 16 \ --unselected-accuracy-scorer combined:mass-spec,mse \ --unselected-accuracy-percentile-threshold 95 \ --mass-spec-min-measurements 500 \ --num-jobs $(expr $PROCESSORS \* 2) --gpus $GPUS --max-workers-per-gpu 2 --max-tasks-per-worker 1 time mhcflurry-calibrate-percentile-ranks \ --models-dir models \ --num-peptides-per-length 100000 \ --num-jobs $(expr $PROCESSORS \* 2) --gpus $GPUS --max-workers-per-gpu 2 --max-tasks-per-worker 50 cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt tar -cjf "../${DOWNLOAD_NAME}.tar.bz2" * echo "Created archive: $SCRATCH_DIR/$DOWNLOAD_NAME.tar.bz2" mhcflurry-2.3.6/downloads-generation/models_class1_trained_with_mass_spec/write_validation_data.py000077700000000000000000000000001525677230600440012../models_class1/write_validation_data.pyustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_unselected/000077500000000000000000000000001525677230600246415ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_unselected/GENERATE.sh000077500000000000000000000040621525677230600263740ustar00rootroot00000000000000#!/bin/bash # # Train standard MHCflurry Class I models. # Calls mhcflurry-class1-train-allele-specific-models on curated training data # using the hyperparameters in "hyperparameters.yaml". # set -e set -x DOWNLOAD_NAME=models_class1_unselected SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") pseudosequence_lookup() { python -c 'from mhcflurry.pseudosequences import main; main()' "$@" } mkdir -p "$SCRATCH_DIR" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" # Send stdout and stderr to a logfile included with the archive. exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) # Log some environment info date pip freeze git status cd $SCRATCH_DIR/$DOWNLOAD_NAME mkdir models PSEUDOSEQUENCES="$(pseudosequence_lookup filename --length 34)" LEGACY_CLASS1_PSEUDOSEQUENCES="$(pseudosequence_lookup legacy class1_pseudosequences)" cp "$SCRIPT_DIR/$PSEUDOSEQUENCES" . # Compatibility alias for older generated artifacts and external scripts. cp "$SCRIPT_DIR/$PSEUDOSEQUENCES" "$LEGACY_CLASS1_PSEUDOSEQUENCES" python $SCRIPT_DIR/generate_hyperparameters.py > hyperparameters.yaml GPUS=$(nvidia-smi -L 2> /dev/null | wc -l) || GPUS=0 echo "Detected GPUS: $GPUS" PROCESSORS=$(getconf _NPROCESSORS_ONLN) echo "Detected processors: $PROCESSORS" time mhcflurry-class1-train-allele-specific-models \ --data "$(mhcflurry-downloads path data_curated)/curated_training_data.no_mass_spec.csv.bz2" \ --allele-sequences "$PSEUDOSEQUENCES" \ --hyperparameters hyperparameters.yaml \ --out-models-dir models \ --held-out-fraction-reciprocal 10 \ --min-measurements-per-allele 25 \ --num-jobs $(expr $PROCESSORS \* 2) --gpus $GPUS --max-workers-per-gpu 2 --max-tasks-per-worker 50 cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt tar -cjf "../${DOWNLOAD_NAME}.tar.bz2" * echo "Created archive: $SCRATCH_DIR/$DOWNLOAD_NAME.tar.bz2" mhcflurry-2.3.6/downloads-generation/models_class1_unselected/README.md000066400000000000000000000002401525677230600261140ustar00rootroot00000000000000# Class I allele-specific models (ensemble) This download contains trained MHC Class I MHCflurry models. To generate this download run: ``` ./GENERATE.sh ```mhcflurry-2.3.6/downloads-generation/models_class1_unselected/generate_hyperparameters.py000066400000000000000000000070431525677230600323040ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Generate grid of hyperparameters """ from sys import stdout from copy import deepcopy from yaml import dump base_hyperparameters = { ########################################## # ENSEMBLE SIZE ########################################## "n_models": 4, ########################################## # OPTIMIZATION ########################################## "max_epochs": 500, "patience": 20, "early_stopping": True, "validation_split": 0.1, "minibatch_size": None, "loss": "custom:mse_with_inequalities", ########################################## # RANDOM NEGATIVE PEPTIDES ########################################## "random_negative_rate": 0.0, "random_negative_constant": 25, "random_negative_affinity_min": 20000.0, "random_negative_affinity_max": 50000.0, ########################################## # PEPTIDE REPRESENTATION ########################################## # One of "one-hot", "embedding", or "BLOSUM62". "peptide_amino_acid_encoding": "BLOSUM62", "use_embedding": False, # maintained for backward compatability "embedding_output_dim": 8, # only used if using embedding "kmer_size": 15, ########################################## # NEURAL NETWORK ARCHITECTURE ########################################## "locally_connected_layers": [ { "filters": 8, "activation": "tanh", "kernel_size": 3 } ], "activation": "tanh", "output_activation": "sigmoid", "layer_sizes": [16], "dense_layer_l1_regularization": None, "batch_normalization": False, "dropout_probability": 0.0, ########################################## # TRAINING Data ########################################## "train_data": {"subset": "all", "pretrain_min_points": 1000}, } grid = [] for train_subset in ["all", "quantitative"]: for minibatch_size in [128]: for dense_layer_size in [8, 16, 32, 64]: for l1 in [0.0, 0.001]: for num_lc in [0, 1, 2]: for lc_kernel_size in [3, 5]: new = deepcopy(base_hyperparameters) new["minibatch_size"] = minibatch_size new["train_data"]["subset"] = train_subset new["layer_sizes"] = [dense_layer_size] new["dense_layer_l1_regularization"] = l1 (lc_layer,) = new["locally_connected_layers"] lc_layer['kernel_size'] = lc_kernel_size if num_lc == 0: new["locally_connected_layers"] = [] elif num_lc == 1: new["locally_connected_layers"] = [lc_layer] elif num_lc == 2: new["locally_connected_layers"] = [lc_layer, deepcopy(lc_layer)] if not grid or new not in grid: grid.append(new) dump(grid, stdout) mhcflurry-2.3.6/downloads-generation/models_class1_unselected/pseudosequences.netmhcpan.34aa.csv000066400000000000000000004144141525677230600333040ustar00rootroot00000000000000allele,pseudosequence HLA-A*01:01,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:02,YSAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:03,YFAMYQENMAHTDANTLYIMYRDYTWVARVYRGY HLA-A*01:06,YFAMYQENMAHTDANTLYIIYRDYTWVALAYRGY HLA-A*01:07,YFAMYQENVAHTDENTLYIIYRDYTWVARVYRGY HLA-A*01:08,YFAMYQENMAHTDANTLYIIYRDYTWVARVYWGY HLA-A*01:09,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:10,YFAMYQENMAHTDANTLYIIYRDYTWARRVYRGY HLA-A*01:12,YFAMYQENMAHTDANTLYIIYRDYTWAVQAYTGY HLA-A*01:13,YFAMYQENMAQTDVDTLYIIYRDYTWVARVYRGY HLA-A*01:14,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTGY HLA-A*01:17,YFAMYQENMAQTDANTLYIIYRDYTWVARVYRGY HLA-A*01:19,YFAMYQENMAHTDANTLYIIYRDYTWAVQAYTGY HLA-A*01:20,YSAMYQENMAHTDANTLYVRYRDYTWVARVYRGY HLA-A*01:21,YFAMYQENMAHTDANTLYIIYRDYTWAVRVYRGY HLA-A*01:23,YFAMYQENVAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:24,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:25,YFAMYQENMAHTDANTLYIIYRDYTWVAQVYRGY HLA-A*01:26,YFAMYQENMAHTDANTLYIIYRDYTWAARVYRGY HLA-A*01:28,YFAMYQENMAHTDVDTLYIIYRDYTWVARVYRGY HLA-A*01:29,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:30,YFAMYQENMAHTDANTLYIIYHYYTWVARVYRGY HLA-A*01:32,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:33,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:35,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:36,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:37,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:38,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:39,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:40,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:41,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:42,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:43,YYAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:44,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:45,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:46,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:47,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:48,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:49,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:50,YFAMYQENMAHTDANTLYIIYREYTWVARVYRGY HLA-A*01:51,YFAMYRNNVAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:54,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:55,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:58,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:59,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:60,YFAMYPENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:61,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:62,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:63,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:64,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:65,YFAMYQENMAHTDANTLYIIYRDYTWVARVCRGY HLA-A*01:66,YFAMYQENMAHTDANTLYVRYRDYTWVARVYRGY HLA-A*02:01,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:02,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:03,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A*02:04,YFAMYGEKVAHTHVDTLYVMYHYYTWAVLAYTWY HLA-A*02:05,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:06,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:07,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:08,YYAMYGENVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:09,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:10,YYAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A*02:11,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:12,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY HLA-A*02:13,YFAMYGEKVAHTHVDTLYVRYHYYTWAEQAYTWY HLA-A*02:14,YYAMYGEKVAHTHVDTLYLRYHYYTWAVLAYTWY HLA-A*02:16,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYEWY HLA-A*02:17,YFAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A*02:18,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:19,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY HLA-A*02:20,YFAMYGENVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:21,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:22,YFAMYGEKVAHTHVDTLYVRYHYYTWAVWAYTWY HLA-A*02:24,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:25,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:26,YFAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A*02:27,YFAMYGEKVAHTHVDTLYVRYHYYTWAAQAYTWY HLA-A*02:28,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:29,YFAMYGEQVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:30,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:31,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:33,YFAMYGEKVAHTHVDTLYVRSHYYTWAVLAYTWY HLA-A*02:34,YFAMYGEKVAQTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:35,YFAMYGEKVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:36,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTGY HLA-A*02:37,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY HLA-A*02:38,YFAMYGEKVAHTHVDTLYVRYHYYTWAEQAYRWY HLA-A*02:39,YFAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A*02:40,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:41,YYAMYGEKVAHTHVDTLYVRYQYYTWAVLAYTWY HLA-A*02:42,YFSMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:44,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY HLA-A*02:45,YFAMYQEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:46,YFAMYEEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:47,YFAMYGEKVAHSHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:48,YFAMYEEKVAHTDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:49,YFAMYGEKVAHTHVDTLYVRYHYYTWAVRAYTWY HLA-A*02:50,YFAMYGEKVAHTHVDTLYIRYHYYTWAVWAYTWY HLA-A*02:51,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:52,YFAMYGEKVAHTHVDTLYVRYEHYTWAVLAYTWY HLA-A*02:54,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY HLA-A*02:55,YFAMYRNNVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:56,YFAMYQENVAQTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:57,YYAMYGEKVAHTHVDTLYLMYHYYTWAVLAYTWY HLA-A*02:58,YFAMYGEKVAHTHVDTLYLRYHYYTWAVLAYTWY HLA-A*02:59,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:60,YFAMYGEKVAHTHVDTLYVRYHFYTWAVLAYTWY HLA-A*02:61,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:62,YFAMYGENVAQTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:63,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:64,YFAMYGEKVAHTHVDTLYVRYHSYTWAVLAYTWY HLA-A*02:65,YFAMYGEKVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A*02:66,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:67,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:68,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:69,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:70,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:71,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:72,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:73,YFAMYGEKVAHTHVDTLYIRYHYYTWAVLAYTWY HLA-A*02:74,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:75,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:76,YSAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:77,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:78,YYAMYQENVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:79,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:80,YFAMYGEKVAHTHVDTLYVRYQDYTWAVLAYTWY HLA-A*02:81,YFAMYGEKVAHTDESIAYVRYHYYTWAVLAYTWY HLA-A*02:84,YYAMYGEKVAHTHVDTLYFRYHYYTWAVLAYTWY HLA-A*02:85,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:86,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:87,YFAMYGEKVAHTDENIAYVRYHYYTWAVLAYTWY HLA-A*02:89,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:90,YFAMYGEKVAHTDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:91,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:92,YFAMYEEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:93,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:95,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:96,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:97,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:99,YYAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A*02:101,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYRWY HLA-A*02:102,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:103,YFAMYQENVAQTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:104,YFAMYGEKVAHTHVDTLYVRYHYYTWAVWAYTWY HLA-A*02:105,YFAMYGEKVAHTHVDTLYVRYEYYTWAVLAYTWY HLA-A*02:106,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:107,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:108,YYAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A*02:109,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:110,YFAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A*02:111,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:112,YFAMYGEKVAHTDENIAYVRCHYYTWAVLAYTWY HLA-A*02:114,YFAMYGEKVAHTHVDTLYVRYRDYTWAVLAYTWY HLA-A*02:115,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:116,YFAMYGEKVAHTHLDTLYVRYHYYTWAVLAYTWY HLA-A*02:117,YFAMYGEKVAHTHVDTLYVRYQDYTWAEWAYTWY HLA-A*02:118,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:119,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:120,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:121,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:122,YYAMYGEKVAHTHVDTLYIRYHYYTWAVWAYTWY HLA-A*02:123,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:124,YFAMYGEKVAHTDESIAYVRYHYYTWAVLAYTWY HLA-A*02:126,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:127,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYKWY HLA-A*02:128,YFAMYGENVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:129,YYAMYEEKVAHTDENIAYVRYHYYTWAVLAYTWY HLA-A*02:130,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:131,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYEWY HLA-A*02:132,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:133,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:134,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:135,YFAMYGEKVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A*02:136,YFAMYGEKVAHTDENIAYVRYHYYTWAVWAYTWY HLA-A*02:137,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:138,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:139,YFAMYGEKVTHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:140,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:141,YFVMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:142,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY HLA-A*02:143,YYAMYREKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:144,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:145,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:146,YFAMYGEKVAHTDANTLYVRYHYYTWAVLAYTWY HLA-A*02:147,YFAMYGEKVAHTHVDTLYVRYDYYTWAVLAYTWY HLA-A*02:148,YFAMYGEKVAHTHVDTLYVRFHYYTWAEWAYTWY HLA-A*02:149,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:150,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:151,YFAMYGEKVAHTHVDTLYVRYDYYTWAVLAYTWY HLA-A*02:152,YFAMYGEKVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A*02:153,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:154,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYRWY HLA-A*02:155,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:156,YFAMYGEKVAHTHVDTLYIIYHYYTWAVLAYTWY HLA-A*02:157,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:158,YFAMYGEKVAHAHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:159,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:160,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:161,YFAVYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:162,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:163,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:164,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:165,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:166,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:167,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYKWY HLA-A*02:168,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:169,YYAMYQENVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:170,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:171,YFAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A*02:172,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:173,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:174,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:175,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:176,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:177,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:178,YYAMYGEKVAHTHVDTLYVRYHSYTWAVLAYTWY HLA-A*02:179,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:180,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:181,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:182,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:183,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:184,YFAMYGEKVAHTHEDTLYVRYHYYTWAVLAYTWY HLA-A*02:185,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:186,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:187,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:188,YFAMYGEKVAHTHVDTLYVRYDSYTWAVLAYTWY HLA-A*02:189,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:190,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:191,YFAMYGEKVAHTHVDTLYVRCHYYTWAVWAYTWY HLA-A*02:192,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:193,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:194,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:195,YFAMYQENVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:196,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:197,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:198,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:199,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:200,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:201,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:202,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:203,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:204,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:205,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:206,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:207,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:208,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:209,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:210,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:211,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:212,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:213,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:214,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:215,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:216,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:217,YFAMYREKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:218,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:219,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:220,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:221,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:224,YFAMYGEKVAHTHVDTLYVGYHYYTWAVLAYTWY HLA-A*02:228,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:229,YYAMYGEKVAHTHVDTLYLRYRYYTWAVWAYTWY HLA-A*02:230,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A*02:231,YFAMYGEKVAHTHVDTLYVRNHYYTWAVLAYTWY HLA-A*02:232,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:233,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTRY HLA-A*02:234,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:235,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:236,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:237,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:238,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:239,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:240,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:241,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:242,YFAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A*02:243,YTAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:244,YYAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A*02:245,YFAMYGEKVAHTHVDTLYIRYHYYTWAVLAYTWY HLA-A*02:246,YFAMYGEKVAHTHVDTLYVRYRDYTWAVLAYTWY HLA-A*02:247,YFAMYGEKVAHTDENTLYVRYHYYTWAVLAYTWY HLA-A*02:248,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:249,YFAMYVEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:251,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:252,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:253,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A*02:254,YFAMYGEKVAHTHVDTLYVRYNFYTWAVLAYTWY HLA-A*02:255,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTGY HLA-A*02:256,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:257,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:258,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A*02:259,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:260,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:261,YFAMYGEKVAHTHMDTLYVRCHYYTWAVLAYTWY HLA-A*02:262,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLVYTWY HLA-A*02:263,YFAMYGEKVAHTHVDTLYVRYHYYTWSVLAYTWY HLA-A*02:264,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A*02:265,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:266,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*03:01,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:02,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A*03:04,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:05,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:06,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:07,YFAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY HLA-A*03:08,YFAMYQENVAHTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:09,YFAMYQENVAQTHVDTLYIIYRDYTWAELAYTWY HLA-A*03:10,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A*03:12,YYAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:13,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:14,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:15,YFAMYQENVAQTDVDTLYIIFRDYTWAELAYTWY HLA-A*03:16,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:17,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:18,YFAMYQENVAQTDVDTLYIIYRDYTWVARVYRGY HLA-A*03:19,YFAMYQENVAQTDVDTLYIIFHYYTWAELAYTWY HLA-A*03:20,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:22,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:23,YFAMYGEKVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:24,YFAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:25,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:26,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:27,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:28,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:29,YFAMYQENVVQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:30,YFAMYEEKVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:31,YFAMYQENVAQTDVDTLYIIYRYYTWAVQAYTWY HLA-A*03:32,YFAMYQENVAHIDVDTLYIIYRDYTWAVQAYTWY HLA-A*03:33,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:34,YFAMYQENVAPTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:35,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:37,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:38,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:39,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:40,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:41,YFAMYQENVAHTDANTLYIIYRDYTWAELAYTWY HLA-A*03:42,YFAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY HLA-A*03:43,YFAMYQENVAQTDVDTLYIIYEHYTWAELAYTWY HLA-A*03:44,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:45,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:46,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:47,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:48,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:49,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:50,YFAMYQENVAQTDVDTLYIIYRDYTWAEWAYTWY HLA-A*03:51,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:52,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:53,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:54,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:55,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:56,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:57,YFAMYQENVAQTDANTLYIIYRDYTWAELAYTWY HLA-A*03:58,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:59,CFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:60,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:61,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:62,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:63,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:64,YFAMYQENVAQTDVDTLYIIYRDYTWADLAYTWY HLA-A*03:65,YFAMYQENVAQTDVDTLYIIYRDYTWAEQAYTWY HLA-A*03:66,YFAMYQENVAQTDVDTLYIIYRDYTWAERAYTWY HLA-A*03:67,YFATYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:70,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:71,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:72,YSAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:73,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A*03:74,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:75,YFAMYQENVAQTDVDTLYLMYRDYTWAELAYTWY HLA-A*03:76,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A*03:77,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:78,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:79,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:80,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:81,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:82,YFAMYQENVAQTDVDTLYIIYEHYTWAVQAYTWY HLA-A*11:01,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:02,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:03,YYAMYQENVAQTDVDTLYIIYRDYTWAEQAYRWY HLA-A*11:04,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYTWY HLA-A*11:05,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:06,YYAMYQENVAQTHVDTLYIIYRDYTWAAQAYRWY HLA-A*11:07,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:08,YYAMYQENVAQTDVDTLYIIYRDYTWAERAYRWY HLA-A*11:09,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:10,YYAMYRNNVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:11,YYAMYLQNVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:12,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:13,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:14,YYAMYQENVAQTDVDTLYIIYRDYTWARQAYRWY HLA-A*11:15,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:16,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:17,YYAMYQENMAHTDANTLYIIYRDYTWAAQAYRWY HLA-A*11:18,YYAMYQENVAHTHVDTLYIIYRDYTWAAQAYRWY HLA-A*11:19,YYAMYQENVAHTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:20,YYAMYQENVAQTDVDTLYIIYRDYTWAEQAYRWY HLA-A*11:22,YYAMYQENVAQTDVDTLYIIYPDYTWAAQAYRWY HLA-A*11:23,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:24,YYAMYQENVAQTDVDTLYIIYRDYTWAALAYRWY HLA-A*11:25,YYAMYQENVAQTDVDTLYIIYRDYTWAELAYRWY HLA-A*11:26,YYAMYQENVAQTDVDTLYIMYRDYTWAAQAYRWY HLA-A*11:27,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYTGY HLA-A*11:29,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:30,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:31,YYAMYQENVAQTDVDTLYIIYRDYTWAVLAYRWY HLA-A*11:32,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:33,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:34,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:35,YYAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY HLA-A*11:36,YYAMYQENVAQTDVDTLYIICRDYTWAAQAYRWY HLA-A*11:37,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:38,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRGY HLA-A*11:39,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRGY HLA-A*11:40,YYAMYQENVAHTDANTLYIIYRDYTWAAQAYRWY HLA-A*11:41,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:42,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:43,YTAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:44,YYAMYQENVAQTDVDTLYIIYRDYTWAARAYRWY HLA-A*11:45,YYAMYQENVAQTDADTLYIIYRDYTWAAQAYRWY HLA-A*11:46,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:47,YHAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:48,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:49,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:51,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:53,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:54,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:55,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:56,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:57,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:58,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:59,YYAMYQENVAQTDVDTLYIIYGDYTWAAQAYRWY HLA-A*11:60,YYAMYQENVAQTDVDTLYIIYRDYTWAVQAYRWY HLA-A*11:61,YYAMYQENAAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:62,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:63,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:64,YYAMYQENVAQTDVDTLHIIYRDYTWAAQAYRWY HLA-A*23:01,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:02,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTGY HLA-A*23:03,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:04,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTWY HLA-A*23:05,CSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:06,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:09,YSAMYQENMAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:10,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYRGY HLA-A*23:12,YSAMYEEKVAHTHENIAYLMFHYYTWAVLAYTGY HLA-A*23:13,YSAMYEEKVAQTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:14,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:15,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:16,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:17,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:18,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:20,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:21,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:22,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:23,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:24,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:25,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:26,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*24:02,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:03,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A*24:04,YSAMYEEKVAHTDANTLYLMFHYYTWAVQAYTGY HLA-A*24:05,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:06,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTGY HLA-A*24:07,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:08,YSAMYGEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:10,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYRWY HLA-A*24:13,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*24:14,YSAMYEEKVAHTDENIAYVRYHYYTWAVQAYTGY HLA-A*24:15,YSAMYEEKVAHTDENIAYLMYHYYTWAVQAYTGY HLA-A*24:17,YSAMYEEKVAHTDENIAYLMFRDYTWAVQAYTGY HLA-A*24:18,YSAMYEEKVAHTDENIAYLMFHYYTWAELAYTWY HLA-A*24:19,YSAMYEEKVAQTDVDTLYLMFHYYTWAVQAYTGY HLA-A*24:20,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:21,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:22,YSAMYEEKVAHTDENIAYLMFHYYTWAVWVYTWY HLA-A*24:23,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A*24:24,YSAMYRNNVAQTDENIAYLMFHYYTWAVLAYTGY HLA-A*24:25,CSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:26,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:27,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:28,YSAMYEEKVAHTHVDTLYLMFHYYTWAVQAYTGY HLA-A*24:29,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:30,YSAMYEEKVAHTHENIAYLMFHYYTWAVQAYTGY HLA-A*24:31,YSAMYEQKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:32,YSAMYEEKVAHTDESIAYLMFHYYTWAVQAYTGY HLA-A*24:33,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A*24:34,YSAMYEEKVAHIDENIAYLMFHYYTWAVQAYTGY HLA-A*24:35,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:37,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:38,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:39,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:41,YSAMYEEKVAHTDENIAYLMFRDYTWAVQAYTGY HLA-A*24:42,YSAMYGEKVAHTHENIAYLMFHYYTWAVQAYTGY HLA-A*24:43,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:44,YSAMYEEKVAHTDVDTLYLMFHYYTWAVQAYTGY HLA-A*24:46,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYRGY HLA-A*24:47,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:49,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:50,YYAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:51,YSAMYEEKVAHTDENIAYLIYHYYTWAVQAYTGY HLA-A*24:52,YSAMYEEKVAHTDENIAYLRFHYYTWAVQAYTGY HLA-A*24:53,YSAMYEEKVAHTDENIAYLMYHYYTWAVQAYTGY HLA-A*24:54,YSAMYEEKVAHTDENIAYLMFHYYTWAVQPYTGY HLA-A*24:55,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYEGY HLA-A*24:56,YSAMYEEKVAHTDENIAYLMFHYYTWAEQAYTGY HLA-A*24:57,YSAMYEEKVAHTDENIAYIMYHYYTWAVQAYTGY HLA-A*24:58,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:59,YSAMYEEKVAHTDENIAYLMFHYYTWAAQAYTGY HLA-A*24:61,YSAMYEEKVAHTDEKIAYLMFHYYTWAVQAYTGY HLA-A*24:62,YSAMYEEKVAHTDENIAYLMFQDYTWAVQAYTGY HLA-A*24:63,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:64,YSAMYEEKVAHTDENIAYLWIHYYTWAVQAYTGY HLA-A*24:66,YSAMYEEKVAHTDENIAYLMFEHYTWAVQAYTGY HLA-A*24:67,YSAMYRNNVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:68,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:69,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:70,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:71,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:72,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:73,YSAMYEEKVAHTDENIAYLMFDYYTWAVQAYTGY HLA-A*24:74,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:75,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:76,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:77,YSAMYQEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:78,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:79,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:80,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:81,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:82,YTAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:85,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:87,YSAMYEEKVAHTDENIAYLMFHYYTWAVRAYTGY HLA-A*24:88,YFAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:89,YSAMYGEKVAHTHVDTLYLMFHYYTWAVQAYTGY HLA-A*24:91,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:92,YSAMYEEKVAHTDENIAYIIYHYYTWAVQAYTGY HLA-A*24:93,YSAMYEEKVAHTDENIAYVMFHYYTWAVQAYTGY HLA-A*24:94,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTWY HLA-A*24:95,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:96,YSAMYEEKVAHTDENIAYLMFNFYTWAVQAYTGY HLA-A*24:97,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:98,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:99,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:100,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:101,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:102,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:103,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:104,YFAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:105,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:106,YSAMYEEKVAHTDENIAYLMFDDYTWAVQAYTGY HLA-A*24:107,YSAMYEEKVAHTDENIAYLMFHYYTWAVHAYTGY HLA-A*24:108,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:109,YSAMYEEKVAHTDANTLYLMFHYYTWAVQAYTGY HLA-A*24:110,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:111,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:112,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:113,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:114,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:115,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:116,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:117,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:118,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:119,YSAMYEEKVAHADENIAYLMFHYYTWAVQAYTGY HLA-A*24:120,YSAMYEEKVAHTDENIAYIMFHYYTWAVQAYTGY HLA-A*24:121,YSAMYEEKVAHTDENIAYLMFHSYTWAVQAYTGY HLA-A*24:122,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:123,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:124,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:125,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A*24:126,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:127,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:128,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:129,YSAMYQENMAHTDANTLYLMFHYYTWAVQAYTGY HLA-A*24:130,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:131,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:133,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:134,YSAMYEEKVAHTDENIAYLMFHYYPWAVQAYTGY HLA-A*24:135,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:136,YSAMYEEKVAHTDENIAYLMFHYYTWVVQAYTGY HLA-A*24:137,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:138,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTWY HLA-A*24:139,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:140,YSTMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:141,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:142,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:143,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYLGY HLA-A*24:144,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*25:01,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:02,YYAMYRNNVAQTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:03,YFAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:04,YYAMYRNNVAHTDESIAYIRYQDYTWAEQAYRWY HLA-A*25:05,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:06,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYTWY HLA-A*25:07,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:08,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:09,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:10,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:11,YYAMYRNNVAHTHESIAYIRYQDYTWAEWAYRWY HLA-A*25:13,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*26:01,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:02,YYAMYRNNVAHTDANTLYIRYQNYTWAEWAYRWY HLA-A*26:03,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A*26:04,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYLWY HLA-A*26:05,YYAMYRNNVAHTDENTLYIRYQDYTWAEWAYRWY HLA-A*26:06,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A*26:07,YYAMYGEKVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:08,YYAMYRNNVAHTDANTLYIRYQDYTWAEQAYRWY HLA-A*26:09,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYTWY HLA-A*26:10,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:12,YYAMYRNNVAHTDANTLYIRYQDYTWAVWAYRWY HLA-A*26:13,YYAMYRNNVAQTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:14,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:15,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:16,YSAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:17,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:18,YYAMYRNNVAHTDANTLYIRYQDYTWAVWAYRWY HLA-A*26:19,YYAMYQENVAQTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:20,YFAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:21,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A*26:22,YYAMYRNNVAHTDANTLYVRYQDYTWAEWAYRWY HLA-A*26:23,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:24,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:26,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:27,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:28,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:29,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRGY HLA-A*26:30,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A*26:31,YYAMYPNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:32,YYAMYRNNVAHTDANTLYMVYQDYTWAEWAYRWY HLA-A*26:33,YYAMYRNNVAQIHANTLYIRYQDYTWAEWAYRWY HLA-A*26:34,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYWWY HLA-A*26:35,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:36,YYAMYRNNVAHTHANTLYIRYQDYTWAEWAYRWY HLA-A*26:37,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:38,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:39,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:40,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:41,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:42,YYAIYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:43,YYAMYRNNVAHTDANTLYIRYQDYTWAELAYRWY HLA-A*26:45,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:46,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:47,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:48,YYAMYRNKVAHTDANTLYIRYQDYTWAEQAYRWY HLA-A*26:49,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRGY HLA-A*26:50,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*29:01,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:02,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:03,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTGY HLA-A*29:04,YTAMYLQHVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:05,YTAMYLQNVAQTDANTLYIMYRDYTWAEQAYTWY HLA-A*29:06,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:07,YTAMYLQNVAQTDANTLYLMFRDYTWAVLAYTWY HLA-A*29:09,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:10,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:11,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:12,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:13,YTAMYLQNVAQTDESIAYIMYRDYTWAVLAYTWY HLA-A*29:14,YTAMYQENVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:15,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:16,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:17,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:18,YTAMYQENVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:19,YTAMYLQNVAHTHVDTLYIMYRDYTWAVLAYTWY HLA-A*29:20,YTAMYLQNVAHTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:21,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:22,YTAMYLQNVAQTDANTLYVRYRDYTWAVLAYTWY HLA-A*30:01,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:02,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:03,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:04,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY HLA-A*30:06,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY HLA-A*30:07,YSAMYEEKVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:08,YYAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:09,YSAMYQENVAHTDENTLYIIYEHYTWAVLAYTWY HLA-A*30:10,YSAMYQENVAHTDENTLYIIHEHYTWARLAYTWY HLA-A*30:11,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:12,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:13,YSAMYQENVAHTHVDTLYIIYEHYTWARLAYTWY HLA-A*30:15,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:16,YSAMYQENVAQTHVDTLYIIYEHYTWAWLAYTWY HLA-A*30:17,YSAMYQENVAQTDVDTLYIIYEHYTWAVWAYTWY HLA-A*30:18,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:19,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:20,YSAMYQENVAQTEVDTLYIIYEHYTWAWLAYTWY HLA-A*30:22,YSAMYGEKVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:23,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:24,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:25,YSAMYQENVAQTDENTLYIIYEHYTWARLAYTWY HLA-A*30:26,YSAMYQENVAQTDVDTLYIIYRDYTWAWLAYTWY HLA-A*30:28,YSAMYQENVAHTDENTLYIVYEHYTWARLAYTWY HLA-A*30:29,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTSY HLA-A*30:30,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:31,YSAMYQENVARTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:32,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:33,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:34,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:35,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:36,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:37,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:38,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:39,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:40,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:41,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*31:01,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:02,YTAMYQEKVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:03,YTAMYQENVAHIDVDTLYIIYRDYTWAVLAYTWY HLA-A*31:04,YTAMYQENVAHIDVDTLYIIYRDYTWAVLAYTWY HLA-A*31:05,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTGY HLA-A*31:06,YTAMYQENVAHIDVDTLYIMYRDYTWAVLAYTWY HLA-A*31:07,YTAMYQEKVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A*31:08,YTAMYEEKVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A*31:09,YTAMYQENVGHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:10,YTAMYQENVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A*31:11,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:12,YTAMYQENVAHIDVDTLYIKYQDYTWAVLAYTWY HLA-A*31:13,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:15,YTAMYQENVARIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:16,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:17,YTAMYQENVAHINVDTLYIMYQDYTWAVLAYTWY HLA-A*31:18,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTRY HLA-A*31:19,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:20,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:21,YFAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:22,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:23,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:24,YTAMYQENVAHIDVDTLYIMYQDYTWAAQAYRWY HLA-A*31:25,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYRWY HLA-A*31:26,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:27,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:28,YTAMYQENVTHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:29,YTAMYQENVAHIDVDTLYLMFQDYTWAVLAYTWY HLA-A*31:30,YTAMYQENVAHIDVDTLYIMYQDYTWAVWAYTWY HLA-A*31:31,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:32,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:33,YTAMYQENVAHIDGDTLYIMYQDYTWAVLAYTWY HLA-A*31:34,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:35,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:36,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:37,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*32:01,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:02,YFAMYQENVAHTDESIAYIMYQDYTWAVQAYTWY HLA-A*32:03,YFAMYQENVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A*32:04,YFAMYQENVAHTDESIAYIIYRDYTWAELAYTWY HLA-A*32:05,YFAMYQEKVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:06,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:07,YSAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:08,YFAMYQENVAHTHESIAYIMYQDYTWAVLAYTWY HLA-A*32:09,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTRY HLA-A*32:10,YFAMYQENVAHTDESIAYIMYQDYTWAEWAYTWY HLA-A*32:12,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:13,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTGY HLA-A*32:14,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:15,YFAMYRNNVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:16,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:17,YFAMYQENVAQTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:18,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:20,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:21,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:22,YFAMYQENVAHTDESIAYIMYQDYTWAVQAYTWY HLA-A*32:23,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:24,YFAMYQENMAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:25,YFAMYHENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*33:01,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:03,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:04,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:05,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:06,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:07,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:08,YTAMYGEKVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:09,YTAMYGENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:10,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTGY HLA-A*33:11,YTAMYRNNVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:12,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:13,YTAMYRNNVAHTDANTLYIMYQDYTWAVLAYTWY HLA-A*33:14,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:15,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:16,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:17,YTAMYRNNVAHIDADTLYIMYQDYTWAVLAYTWY HLA-A*33:18,YTAMYRNNVAHIDVDTLYIMYRDYTWAVLAYTWY HLA-A*33:19,YTAMYRNNVAHIDVDTLYLMFHYYTWAVQAYTGY HLA-A*33:20,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:21,YTAMYEENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:22,YTAMYRNNVAHIDVDTLYVRYQDYTWAVLAYTWY HLA-A*33:23,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:24,YTAMYRNNVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A*33:25,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:26,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:27,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:28,YTAMYRNNVAHIDVDTLYIMYQDYTWAELAYTWY HLA-A*33:29,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:30,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:31,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*34:01,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY HLA-A*34:02,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*34:03,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*34:04,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*34:05,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY HLA-A*34:06,YYAMYRNNVAQTDVDTLYIRYQDYTWAVLAYTWY HLA-A*34:07,YYAMYRNNVSQTDVDTLYIIYRDYTWAELAYTWY HLA-A*34:08,YFAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*36:01,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTWY HLA-A*36:02,YFAMYQENMAHTDANTLYIIYRDYTWVARAYTWY HLA-A*36:03,YFAMYQENMAHTDANTLYLMYRDYTWVARVYTWY HLA-A*36:04,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRWY HLA-A*36:05,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTWY HLA-A*43:01,YYAMYLQNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*66:01,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:02,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYEWY HLA-A*66:03,YYAMYRNNVAHTDVDTLYIRYQDYTWAEWAYEWY HLA-A*66:04,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWH HLA-A*66:05,YYAMYRNNVAHTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:06,YYAMYRNNVAQTDVDTLYIRYQDYTWAVLAYRWY HLA-A*66:07,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:08,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:09,YYAMYRNNVAQTDVDTLYVRYQDYTWAEWAYRWY HLA-A*66:10,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRGY HLA-A*66:11,YYAMYRNNVAQTDADTLYIRYQDYTWAEWAYRWY HLA-A*66:12,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:13,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:14,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:15,YYAMYRNNVAHIDVDTLYIRYQDYTWAEWAYRWY HLA-A*68:01,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:02,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:03,YYAMYRNNVAHTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:04,YYAMYRNNVAHIDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:05,YYAMYRNNVAHTHVDTLYIMYRDYTWAVWAYTWY HLA-A*68:06,YYAMYRNNVAQTDVDTLYIMYEHYTWAVWAYTWY HLA-A*68:07,YYAMYRNNVAQTDVDTLYIMYRHYTWAVWAYTWY HLA-A*68:08,YYAMYRNNVAQTDVDTLYIMYRDYTWAVLAYTWY HLA-A*68:09,YYAMYRNNVAQTDVDTLYIMYRDYTWAVQAYTWY HLA-A*68:10,YYAMYEENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:12,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:13,YYAMYRENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:14,YYAMYEENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:15,YYAMYRNNVAHTHVDTLYIRYHYYTWAVWAYTWY HLA-A*68:16,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:17,YYAMYRNNVAQTDVDTLYIMYRVYTWAVWAYTWY HLA-A*68:19,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:20,YYAMYRNNVAHTHVDTLYIMYRDYTWAVWAYTWY HLA-A*68:21,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:22,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:23,YYAMYRNNVAQTDVDTLYIRYRDYTWAVWAYTWY HLA-A*68:24,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:25,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:26,YYAMYRNNVAQTDVDTLYIMYRDYTWAVQAYTGY HLA-A*68:27,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:28,YYAMYRNNVAQTDVDTLYIRYHYYTWAVRAYTWY HLA-A*68:29,YTAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:30,YYAMYGENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:31,YYAMYRNNVAHTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:32,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:33,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:34,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYMWY HLA-A*68:35,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:36,YYAMYRNNVAQTDENIAYIMYRDYTWAVWAYTWY HLA-A*68:37,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:38,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:39,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:40,YYAMYRNNVGQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:41,YYAMYRNNVAQTDVDTLYIMYRDYTWVVWAYTWY HLA-A*68:42,YYAMYRNNVAQTDVDTLYIMYRDYTWAEWAYTWY HLA-A*68:43,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:44,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:45,YSAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:46,YYAMYRNNVAQTDVNTLYIMYRDYTWAVWAYTWY HLA-A*68:47,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:48,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:50,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:51,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:52,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:53,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:54,YYAMYRNNVAQTDVDTLYIRYHYYTWAEWAYTWY HLA-A*69:01,YYAMYRNNVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A*74:01,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:02,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:03,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:04,YFAMYGEKVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:05,YFAMYQENVAHADVDTLYIMYQDYTWAVLAYTWY HLA-A*74:06,YFAMYQENVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A*74:07,YFAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:08,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:09,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:10,YFAMYQENVAHTDANTLYIMYQDYTWAVLAYTWY HLA-A*74:11,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:13,YFAMYQENVAQTDVDTLYIMYQDYTWAVLAYTWY HLA-A*80:01,YFAMYEENVAHTNANTLYIIYRDYTWARLAYEGY HLA-A*80:02,YFAMYEENVAHTDVDTLYIIYRDYTWARLAYEGY HLA-B*07:02,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:03,YYSEYRNIYTNTDESNLYLSYDYYTWAERAYEWY HLA-B*07:04,YYSEYRNIYAQTDESNLYLSYDYYTWAEDAYEWY HLA-B*07:05,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:06,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:07,YYSEYRNIYAQTDESNLYLRYDYYTWAERAYEWY HLA-B*07:08,YYSEYRNIFTNTDESNLYLSYDYYTWAERAYEWY HLA-B*07:09,YYSEYRNIYAQTDESNLYLSYDSYTWAERAYEWY HLA-B*07:10,YYSEYRNICAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:11,YYSEYRNIYAQTDENNLYLSYDSYTWAERAYEWY HLA-B*07:12,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY HLA-B*07:13,YYSGYREKYRQADVSNLYLSYDYYTWAERAYEWY HLA-B*07:14,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY HLA-B*07:15,YYSEYRNIYAQADVSNLYLSYDYYTWAERAYEWY HLA-B*07:16,YYSEYRNIYTNTYESNLYLSYDYYTWAERAYEWY HLA-B*07:17,YYSEYRNIYAQTDESNLYLSYDSYTWAERAYEWY HLA-B*07:18,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY HLA-B*07:19,YYSEYRNIYAQTDESNLYLSYDYYTWAEDAYTWY HLA-B*07:20,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLSY HLA-B*07:21,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:22,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:23,YYSEYRNIYAQTDESNLHLSYDYYTWAERAYEWY HLA-B*07:24,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLWY HLA-B*07:25,YYSEYRNIYAQTDESNLYLSYDYYTWAVDAYEWY HLA-B*07:26,YYSEYRNIYAQTDESNLYLSYDYYTWAELAYEWY HLA-B*07:27,YYSEYRNISTNTYEDTLYLSYDYYTWAERAYEWY HLA-B*07:28,YYSEYRNIYAQTDESNLYLSYDDYTWAERAYEWY HLA-B*07:29,YDSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:30,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:31,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYTWY HLA-B*07:32,YYSEYRNIFTNTDESNLYLSYNYYTWAERAYEWY HLA-B*07:33,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:34,YYSEYRNIYAQTDESNLYLSYNYYTWAELAYTWY HLA-B*07:35,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:36,YYSEYRNIYAQTDENIAYLSYDYYTWAERAYEWY HLA-B*07:37,YYSEYRNIYANTYESNLYLSYDYYTWAERAYEWY HLA-B*07:38,YYSEYRNIFTNTYENIAYLSYDYYTWAERAYEWY HLA-B*07:39,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:40,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:41,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:42,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:43,YYSEYRNIYAQTDESNLYLSYDYYTWAELAYTWY HLA-B*07:44,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:45,YYSEYRNIYAQTDESNLYLSYDYYTWAERTYEWY HLA-B*07:46,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:47,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:48,YYSEYRNIYAQTDESNLYLSYDYYTWAVLAYEWY HLA-B*07:50,YYSEYRNISTNTYESNLYLSYDYYTWAERAYEWY HLA-B*07:51,YYSEYRNIYAQTDESNLYLSYDYYTWAARAYEWY HLA-B*07:52,YYSEYRNIYAQTDESNLYLSYDYYTWAERVYEWY HLA-B*07:53,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:54,YYSEYREIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:55,YYSEYRNIYAQTDESNLYLSYDYYTWAEWAYEWY HLA-B*07:56,YYAEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:57,YYSEYRNIYAQTDENNLYLSYDYYTWAERAYEWY HLA-B*07:58,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:59,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:60,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLWY HLA-B*07:61,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:62,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:63,YYSDYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:64,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEGY HLA-B*07:65,YYATYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:66,YYSEYRNIYAQTDESNLYLSYDYYTWAEQAYEWY HLA-B*07:68,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:69,YYSEYRNICTNTDESNLYLSYNYYTWAERAYEWY HLA-B*07:70,YCSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:71,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:72,YYAEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:73,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:74,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:75,YYSEYRNIYAQTYENNLYLSYDYYTWAERAYEWY HLA-B*07:76,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:77,YYSEYRNIYAQTDESNLYLRSDYYTWAERAYEWY HLA-B*07:78,YYSEYRNIYAQTDESNLYWTYNLYTWAERAYEWY HLA-B*07:79,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:80,YYSEYRNIYAQTDESNLYLSYNYYTWAELAYEWY HLA-B*07:81,YYSEYRNIYAQTDESIAYLSYDYYTWAERAYEWY HLA-B*07:82,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:83,YYSEYRNIFAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:84,YYSEYRNIYAQTDESNLYWTYDYYTWAERAYEWY HLA-B*07:85,YYSEYRNICTNTDESNLYLSYDYYTWAERAYEWY HLA-B*07:86,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:87,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:88,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:89,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:90,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:91,YYSEYRNIYAQTYESNLYLSYDYYTWAERAYEWY HLA-B*07:92,YYSEYRNIYAQTDVSNLYLSYDYYTWAERAYEWY HLA-B*07:93,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:94,YYSEYWNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:95,YYSEYRNIYAQTDESNLYFSYDYYTWAERAYEWY HLA-B*07:96,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:97,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:98,YYSEYRNIYAQTDESNLYLSYDYYTCAERAYEWY HLA-B*07:99,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:100,YYSEYRNIYAQTDESNLYLSYDYYTWAEWAYLWY HLA-B*07:101,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:102,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:103,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:104,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:105,YYSEYRNIYAQTVESNLYLSYNYYTWAERAYEWY HLA-B*07:106,YYSEYRNIYAQTDESNLYLSYDYYTRAERAYEWY HLA-B*07:107,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:108,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:109,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:110,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:112,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:113,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:114,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:115,YYSEYRNIYAQTDESNLYLSYNFYTWAERAYEWY HLA-B*08:01,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:02,YDSEYRNIFTNTDENTAYLSYNYYTWAVDAYTWY HLA-B*08:03,YDSEYRNIFTNTYENIAYLSYNYYTWAVDAYTWY HLA-B*08:04,YDSEYRNISTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:05,YDSEYRNTFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:07,YDSEYRNIFTNTDESNLYLSYDYYTWAVDAYTWY HLA-B*08:09,YDSEYRNIFTNTDESNLYWTYNYYTWAVDAYTWY HLA-B*08:10,YDSEYRDIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:11,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYAWY HLA-B*08:12,YDSEYRNIFTNTDESNLYLRYNYYTWAVDAYTWY HLA-B*08:13,YDSEYRNIFTNTDESNLYLSYNYYTWAVLAYTWY HLA-B*08:14,YDSEYRNIFTNTDESNLYLSYHDYTWAVDAYTWY HLA-B*08:15,YDSEYRNIFTNTDVSNLYLSYNYYTWAVDAYTWY HLA-B*08:16,YDSEYRNIFTNADESNLYLRYNYYTWAVDAYTWY HLA-B*08:17,YDSEYREISTNTDENNLYLSYNYYTWAVDAYTWY HLA-B*08:18,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:20,YDSEYRNIFTNTDESNLYLSYNYYTWAERAYTWY HLA-B*08:21,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYLWY HLA-B*08:22,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:23,YDSEYRNIFTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*08:24,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:25,YDSEYRNIFTNTDESNLYLSYNYYTWAVLAYLWY HLA-B*08:26,YYAEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:27,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:28,YDSEYRNIFTNTDESNLYLSYDSYTWAVDAYTWY HLA-B*08:29,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:31,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:32,YDSTYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:33,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:34,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:35,YDSEYRNIFTNTDESNLYLSYNSYTWAVDAYTWY HLA-B*08:36,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:37,YDSEYRNIFTNTDESNLYLSYDSYTWAVDAYTWY HLA-B*08:38,YDSEYREIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:39,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:40,YDSEYRNIFTNTDESNLYLSYNYYTWAVRAYEWY HLA-B*08:41,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:42,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:43,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:44,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:45,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:46,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:47,YDSEYRNIFTNTDENNLYLSYNYYTWAVDAYTWY HLA-B*08:48,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:49,YDSEYRNIFTNTDESNLYIRSNFYTWAVDAYTWY HLA-B*08:50,YYSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:51,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:52,YDSEYRNIFTNTDESIAYLSYNYYTWAVDAYTWY HLA-B*08:53,YDSEYRNIFTNTDESNLYLSYNYYTWAEDAYTWY HLA-B*08:54,YDSEYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*08:55,YDSEYRNIFTNTDESNLYLSYNYYTWAVLTYTWY HLA-B*08:56,YDAEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:57,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:58,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:59,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:60,YDSEYRNIFTNTDESNLYISYNYYTWAVDAYTWY HLA-B*08:61,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:62,YHSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*13:01,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:02,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:03,YYTMYREISTNTYENTAYWTYNLYTWAVLAYLWY HLA-B*13:04,YYTMYREISTNTYENTAYWTYDSYTWAVLAYLWY HLA-B*13:06,YYTMYREISTNTYENTAYIRYNLYTWAVLAYTWY HLA-B*13:09,YYTMYREISTNTYESNLYWTYNLYTWAVLAYEWY HLA-B*13:10,YYTMYREISTNTYENTAYLRYDSYTWAVLAYEWY HLA-B*13:11,YYTMYREISTNTYENTAYLRYNLYTWAVLAYEWY HLA-B*13:12,YYTMYREISTNTYENTAYIRYNLYTWAVLAYGWY HLA-B*13:13,YYTMYREISTNTYENTAYIRYNYYTWAVLAYEWY HLA-B*13:14,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:15,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWH HLA-B*13:16,YYTMYREISTNTYENTAYWTYNLYTWAELAYEWY HLA-B*13:17,YYAMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:18,YYTMYREISTNTYENTAYWTYNLYTWAVRAYEWY HLA-B*13:19,YYTMYREVSTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:20,YYTMYREISTNTYENTAYIRYNLYTWAELAYEWY HLA-B*13:21,YYTMYREISTNTYENTAYIRYNYYTWAVLAYEWY HLA-B*13:22,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:23,YHTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:25,YYTMYREISTNTYESTAYIRYNLYTWAVLAYEWY HLA-B*13:26,YYTMYREISTNTYENTAYIRYDSYTWAVLAYEWY HLA-B*13:27,YYTMYREISTNTYENTAYWTFNLYTWAVLAYEWY HLA-B*13:28,YYTMYREISTNTYENTACIRYNLYTWAVLAYEWY HLA-B*13:29,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:30,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:31,YYTMYREISTNTYENTAYWTYNLYTWAEWAYEWY HLA-B*13:32,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:33,YYAMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:34,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:35,YYTMYREISTNTYENTAYWTYDYYTWAVLAYEWY HLA-B*13:36,YYTMYRNISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:37,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:38,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:39,YYTMYREISTNTYENNLYIRYNLYTWAVLAYEWY HLA-B*14:01,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:02,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:03,YYSEYRNICTNTDESNLYLWYNFYTWAERAYTWH HLA-B*14:04,HYSEYRNNCTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:05,YYSEYRNICTNTDESNLYLSYNFYTWAELAYTWH HLA-B*14:06,YYSEYRNICTNTDESNLYLRYNFYTWAELAYTWH HLA-B*14:08,YYSEYRNICTNTDESNLYLRYNFYTWAELAYTWH HLA-B*14:09,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:10,YYSEYRNICTNTDESNLYIRYNFYTWAELAYTWH HLA-B*14:11,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:12,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:13,YYSEYRNICTNTDESNLYLSYNYYTWAELAYTWH HLA-B*14:14,YYSEYRNICTNTYESNLYLWYNFYTWAELAYTWH HLA-B*14:15,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:16,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:17,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:18,YYSEYRNICTNTYESNLYLWYNFYTWAELAYTWH HLA-B*15:01,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:02,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:03,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:04,YYAMYREISTNTYESNLYWTYDSYTWAEWAYLWY HLA-B*15:05,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*15:06,YYAMYREISTNTYESNLYLRFDSYTWAELAYLWY HLA-B*15:07,YYAMYREISTNTYESNLYLSYDSYTWAEWAYLWY HLA-B*15:08,YYAMYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:09,YYSEYRNICTNTYESNLYLRYNYYTWAELAYLWY HLA-B*15:10,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWY HLA-B*15:11,YYAMYRNIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:12,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLGY HLA-B*15:13,YYAMYRNISTNTYENIAYIRYDSYTWAELAYLWY HLA-B*15:14,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLSY HLA-B*15:15,YYAMYRNISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:16,YYAMYRENMASTYENIAYWRYDSYTWAELAYLWY HLA-B*15:17,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B*15:18,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:19,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLGY HLA-B*15:20,YYAMYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*15:21,YYAMYRNICTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:23,YYSEYRNICTNTYENIAYLRYDSYTWAELAYLWY HLA-B*15:24,YYAMYREISTNTYENIAYLRYDSYTWAEWAYLWY HLA-B*15:25,YYAMYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:27,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY HLA-B*15:28,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:29,YYSEYRNIFTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:30,YYAMYREISTNTYESNLYLRYNYYTWAEWAYLWY HLA-B*15:31,YYAMYRNISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*15:32,YYAMYREISTNTYESNLYLRSDSYTWAEWAYLWY HLA-B*15:33,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:34,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:35,YYAMYREISTNTYESNLYLTYDSYTWAEWAYLWY HLA-B*15:36,YYAMYREISTNTYENTAYIRYDSYTWAELAYLWY HLA-B*15:37,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWH HLA-B*15:38,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWH HLA-B*15:39,YYAMYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:40,YYAMYREISTNTYESNLYLRYDSYTWAELAYEWY HLA-B*15:42,YYAMYREISTNTYESNLYWTYNLYTWAELAYTWY HLA-B*15:43,YYAMYREISTNTYEDTLYLRYDSYTWAEWAYLWY HLA-B*15:44,YYAMYRNICTNTYESNLYIRYDSYTWAELAYTWY HLA-B*15:45,YYAMYREISTNTYESNLYLSYDYYTWAEWAYLWY HLA-B*15:46,YYAKYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:47,YYSEYREISTNTYESNLYLRYDSYTWAERAYEWY HLA-B*15:48,YYAMYREISTNTYESNLYLRYNYYTWAVLTYLWY HLA-B*15:49,YYSEYREISTNTYESNLYLRYDSYTWAERAYEWY HLA-B*15:50,YYAMYREISTNTYESNLYLRYDSYTWAEWAYTWY HLA-B*15:51,YYSEYRNICTNTYESNLYLRYDSYTWAVDAYLWY HLA-B*15:52,YYSEYRNICTNTYESNLYLRYDSYTWAVLAYEWY HLA-B*15:53,YYTKYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:54,YYSEYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:55,YYAMYRNISTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*15:56,YYAMYREIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:57,YYAMYREISTNTYVNNLYLRYDSYTWAEWAYLWY HLA-B*15:58,YYAMYREISTNTYESNLYLRYNFYTWAEWAYLWY HLA-B*15:60,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:61,YYSEYREISTNTDESNLYLRYDSYTWAELAYLWY HLA-B*15:62,YYSEYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:63,YYAMYREISTNTYESNLYLRYDYYTWAEWAYLWY HLA-B*15:64,YYSEYRNISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:65,YYAMYREISTNTYESNLYLRYDSYTWAERAYLWY HLA-B*15:66,YYAMYREICTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:67,YYAMYRENMASTYENIAYWRYDSYTWAELAYLWY HLA-B*15:68,YYSEYREISTNTYESNLYLSYDSYTWAEWAYLWY HLA-B*15:69,YYSEYREISTNTYESNLYLRYDSYTWAELTYTWY HLA-B*15:70,YYAMYREISTNTDESNLYLRYDSYTWAEWAYLWY HLA-B*15:71,YHAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:72,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:73,YYAMYREISTNTYESNLYLRYNLYTWAEWAYLWY HLA-B*15:74,YYSEYREISINTYESNLYLRYDSYTWAELAYLWY HLA-B*15:75,YYAMYREISTNTYESNLYLRYDSYTWAQWAYLWY HLA-B*15:76,YYAMYRNIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B*15:77,YYAMYREISTNTYESNLYIRYDDYTWAEWAYLWY HLA-B*15:78,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:80,YYSEYRNICTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:81,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:82,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:83,YYAMYREISTNTYESNLYWTYNYYTWAVDAYTWY HLA-B*15:84,YYAMYREISTNTYESNLYLRFDSYTWAVRAYLWY HLA-B*15:85,YYAMYREISTNTYESNLYIRYDSYTWAEWAYLWY HLA-B*15:86,YYAMYREISTNTYESNLYLRYNLYTWAVLAYTWY HLA-B*15:87,YYAMYREISTNTYESIAYLRYDSYTWAEWAYLWY HLA-B*15:88,YYAMYRNISTNTYESNLYIRYDSYTWATLAYLWY HLA-B*15:89,YYAMYRNISTNTYENTAYIRYDSYTWAELAYLWY HLA-B*15:90,YYSEYRNICTNTYESNLYLRYDYYTWAELVYLWY HLA-B*15:91,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLSY HLA-B*15:92,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:93,YYSEYRNICTNTYESNLYLRYDSYTWAELAYTWY HLA-B*15:95,YYAMYQENMASTYENIAYWRYDSYTWAELAYLWY HLA-B*15:96,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:97,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:98,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:99,YYSEYRNICTNTYESNLYLRYDYYTWAERAYLWY HLA-B*15:101,YYAMYREIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B*15:102,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:103,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:104,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:105,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:106,YYAKYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:107,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*15:108,YYSEYRNICTNTYESNLYLRYDSYTWAELTYLWY HLA-B*15:109,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY HLA-B*15:110,YYAMYREISTNTYESNLYLRCDSYTWAEWAYLWY HLA-B*15:112,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:113,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:114,YYSEYRNICTNTYESNLYLRYDSYTWAVLAYEWY HLA-B*15:115,YYSEYRNICTNTYESTAYLRYDSYTWAELAYLWY HLA-B*15:116,YYAMYREISTNTYESNLYLRYDSYSLAEWAYLWY HLA-B*15:117,YYAMYREISTNTYESNLYLRYDSYTWAEWAYEWY HLA-B*15:118,YYAMYREISTNTYESNLYLMYDSYTWAEWAYLWY HLA-B*15:119,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:120,YYAMYRDISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:121,YYAMYRNISTNTYESNLYIRYDSYTWAELAYTWY HLA-B*15:122,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:123,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*15:124,YYSEYRNICTNTYESNLYLRYDSYSLAVLAYEWY HLA-B*15:125,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:126,YYAMYREISTNTYESNLYLSYDSCTWAEWAYLWY HLA-B*15:127,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:128,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:129,YYAMYREISTNTYESNLYLNYDSYTWAEWAYLWY HLA-B*15:131,YYSEYREISTNTYESNLYLRYDSYTWAELAYLSY HLA-B*15:132,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:133,YYSEYRNICTNTYESNLYLRYDFYTWAELAYLWY HLA-B*15:134,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:135,YYAMYREISTNTYENNLYLRYDSYTWAEWAYLWY HLA-B*15:136,YYAMYREISTNTYESNLYLRYDSYTWAVLTYLWY HLA-B*15:137,YYAMYREISTNTYESNLYWTYNFYTWAEWAYLWY HLA-B*15:138,YYAMYREISTNTYESNLYLRYDSYTWAELAYEWY HLA-B*15:139,YYAMYRNISANTYESNLYIRYDSYTWAELAYLWY HLA-B*15:140,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:141,YYAMYREISTNTYESNLYLTYDSYTWAEWAYLWY HLA-B*15:142,YDAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:143,YYAKYRNIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:144,YYAMYRNISTNTYESNLYIRYDSYTWAEWAYLWY HLA-B*15:145,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:146,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:147,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:148,YYAMYRNIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:150,YYAMYREISTNTYESNLYLRYNYYTWAEWAYLWY HLA-B*15:151,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*15:152,YYAMYREIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:153,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:154,YYAMYREISTNTYESNLYIRYDSYTWAEWAYLWY HLA-B*15:155,YYAMYREISTNTYESNLYWTYDSYTWAVLAYLWY HLA-B*15:156,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:157,YYAMYREISTNTYENIAYLRYDSYTWAEWAYLWY HLA-B*15:158,YYSEYREISTNTYESNLFLRYDSYTWAELAYLWY HLA-B*15:159,YYAMYREISTNTYESNLHLRYDSYTWAEWAYLWY HLA-B*15:160,YYAMHREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:161,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLSY HLA-B*15:162,YYAMYRENMASTYENIAYLRYHDYTWAALAYLWY HLA-B*15:163,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:164,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:165,YYAMYREISTNTYESNLYIRYDSYTWAEWAYLWY HLA-B*15:166,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:167,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:168,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B*15:169,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:170,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:171,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:172,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:173,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:174,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:175,YHAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:176,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:177,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B*15:178,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:179,YYAMYREISTNTYESNLYLRYDSYTWAVDAYLWY HLA-B*15:180,YDSEYRNIFTNTDESNLYLRYDSYTWAEWAYLWY HLA-B*15:183,YYTMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:184,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:185,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWH HLA-B*15:186,YYSEYRNICTNTYESNLYLRYDSYTWAVLTYTWY HLA-B*15:187,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:188,YYAMYREISTNTYESNLYLRYNYYTWAVLAYTWY HLA-B*15:189,YYAMYRNICTNTDESNLYLRYDSYTWAEWAYLWY HLA-B*15:191,YYAMYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:192,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:193,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:194,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:195,YYAMYREISTNTYESNLYLRFDSYTWAELAYLWY HLA-B*15:196,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B*15:197,YYSEYRNICTNTYESNLYLSYDSYTWAELAYLWY HLA-B*15:198,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:199,YYAMYREISTNTYESNLYLRYDSYTWAEDAYTWY HLA-B*15:200,YYSEYRNICTNTYESNLYLRYDSYTWATLAYLWY HLA-B*15:201,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:202,YYATYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*18:01,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:02,YHSTYRNISTNTYESNLYLNYDSYTWAVLAYTWH HLA-B*18:03,YHSTYRNISTNTDESNLYLRYDSYTWAVLAYTWH HLA-B*18:04,YYATYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:05,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:06,YHSTYRNISTNTYVSNLYLRYDSYTWAVLAYTWH HLA-B*18:07,YHSTYRNIFTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:08,YHSTYRNISTNTYESNLYLRCDSYTWAVLAYTWH HLA-B*18:09,YHSTYRNISTNTYENTAYLRYDSYTWAVLAYTWH HLA-B*18:10,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYEWY HLA-B*18:11,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWY HLA-B*18:12,YHSTYREISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:13,YHSTYRNISTNTYESNLYLRYDSYTWAVRAYTWH HLA-B*18:14,YHSTYRNISTNTYESNLYLSYDSYTWAVLAYTWH HLA-B*18:15,YHSTYRNISTNTYESNLYLRYDSYTWAELAYTWH HLA-B*18:18,YHSTYRNISTNTYESNLYLRSDSYTWAVLAYTWH HLA-B*18:19,YHSTYRNISTNTYESNLYLRYDSYTWAEWAYTWH HLA-B*18:20,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:21,YHSTYRNISTNTYESNLYLRYDSYTWAERAYEWY HLA-B*18:22,YHSTYRNISTNTYESNLYISYDSYTWAVLAYTWH HLA-B*18:24,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:25,YYSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:26,YHSTYRNISTNTYESNLYLRYNYYTWAVLAYTWH HLA-B*18:27,YHSTYRNISTNTYESNLYLMFDSYTWAVLAYTWH HLA-B*18:28,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:29,YHATYRNIFTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:30,YHSTYRNISTNTYESNLYLRYDSYTWAERAYTWH HLA-B*18:31,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:32,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:33,YHSTYRNICTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:34,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:35,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYEWY HLA-B*18:36,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYLWH HLA-B*18:37,YHSEYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:38,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:39,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:40,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:41,YHSTYRNISTNTYESNLYLRYESYTWAVLAYTWH HLA-B*18:42,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:43,YYSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:44,YHSTYRNISTNTYESNLYLWYDSYTWAVLAYTWH HLA-B*18:45,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:46,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:47,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:48,YHSKYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:49,YHSTYRNISTNTYENNLYLRYDSYTWAVLAYTWH HLA-B*18:50,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYEWH HLA-B*27:01,YHTEYREICAKTYENTAYLNYHDYTWAVLAYEWY HLA-B*27:02,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B*27:03,YHTEHREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:04,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B*27:05,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:06,YHTEYREICAKTDESTLYLNYDYYTWAELAYEWY HLA-B*27:07,YHTEYREICAKTDEDTLYLSYNYYTWAVLAYEWY HLA-B*27:08,YHTEYREICAKTDESNLYLNYHDYTWAVLAYEWY HLA-B*27:09,YHTEYREICAKTDEDTLYLNYHHYTWAVLAYEWY HLA-B*27:10,YHTEYREICAKTDEDTLYLNYHDYTWAELAYEWY HLA-B*27:11,YHTEYREICAKTDESTLYLSYNYYTWAVLAYEWY HLA-B*27:12,YHTEYREICTNTDESNLYLNYHDYTWAVLAYEWY HLA-B*27:13,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:14,YHTEYREICAKTDEDTLYWTYHDYTWAVLAYEWY HLA-B*27:15,YHTEYREICAKTDESTLYLNYHDYTWAELAYTWY HLA-B*27:16,YHTEYREICTNTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:17,YHTEFREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:18,YHTEYREISTNTYESNLYLNYHDYTWAELAYEWY HLA-B*27:19,YHTEYREICAKTDEDTLYIRYHDYTWAVLAYEWY HLA-B*27:20,YHTEYREICAKTDESTLYLNYNYYTWAELAYEWY HLA-B*27:21,YHTEYREICAKTDESTLYLRYDYYTWAELAYEWY HLA-B*27:23,YHTEYRNIFTNTYESTLYLNYHDYTWAVLAYEWY HLA-B*27:24,YHTEYREICAKTDESTLYLSYNYYSWAELAYEWY HLA-B*27:25,YHTEYREICAKTDESTLYLNYHDYTWAEWAYLWY HLA-B*27:26,YHTEYREICAQTDESNLYLNYHDYTWAVLAYEWY HLA-B*27:27,YHTEYREICAKTDEDTLYLNYNYYTWAVLAYEWY HLA-B*27:28,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYTWH HLA-B*27:29,YHTEYREISTNTYEDTLYLNYHDYTWAVLAYEWY HLA-B*27:30,YHTEYREICAKTDENIAYIRYHDYTWAVLAYEWY HLA-B*27:31,YHTEYREICAQTDESTLYLNYHDYTWAVLAYEWY HLA-B*27:32,YHTEYREICAKTDEDTLYLSYHDYTWAVLAYEWY HLA-B*27:33,YHTEYREICAKTDESNLYLSYNYYTWAVLAYEWY HLA-B*27:34,YHTEYREICAKTDEDTLYLSYDYYTWAVLAYEWY HLA-B*27:35,YHTEYREICAKTDEDTLYLNYNFYTWAVLAYEWY HLA-B*27:36,YHTEYREICAKTDESTLYLNYHDYSLAVLAYEWY HLA-B*27:37,YYTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:38,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYLWY HLA-B*27:39,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:40,YHTEYREICAKTDESNLYLNYHDYTWAELAYEWY HLA-B*27:41,YHTEYREICAKTDEDTLYLNYDSYTWAVLAYEWY HLA-B*27:42,YHTEYREICAKTDEDNLYLNYHDYTWAVLAYEWY HLA-B*27:43,YHTEYREICAKTDEDTLYLSYNYYTWAVLAYEWY HLA-B*27:44,YHTEYREICAKTYESNLYLNYHDYTWAVLAYEWY HLA-B*27:45,YHTEYREICAKTDEDTLYLNYHDYTWAVRAYEWY HLA-B*27:46,YHTEYREICAKTDEDTLYLNYHYYTWAVLAYEWY HLA-B*27:47,YHTEYREICAKTDEDTLYLNYHDYTWAVDAYLSY HLA-B*27:48,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:49,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:50,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYESY HLA-B*27:51,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:52,YHTTYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:53,YHTEYREICAKTDEDIAYLNYHDYTWAVLAYEWY HLA-B*27:54,YHTEYREICAKTDEDTLYLNYHDYTWAELAYEWY HLA-B*27:55,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:56,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:57,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B*27:58,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:60,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:61,YHTEYREICAKTDESTLYLNYHDYTWAVLAYEWY HLA-B*27:62,YHTEYREICAKTDENIAYLNYHDYTWAVLAYTWH HLA-B*27:63,YHTEYREICAKTDESTLYLNYHDYTWAELAYLWY HLA-B*27:67,YHTMYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:68,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B*27:69,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B*35:01,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:02,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:03,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:04,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:05,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:06,YYATYRNIFTNTYESNLYIRYNFYTWAVLAYLWY HLA-B*35:07,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:08,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:09,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:10,YYATYREIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:11,YYATYRNIFTNTYESNLYIRYDSYTWAELAYLWY HLA-B*35:12,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:13,YYATYREIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:14,YYATYRNIFTNTYESNLYIRYDSYTWAEWAYLWY HLA-B*35:15,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYEWY HLA-B*35:16,YYATYREIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B*35:17,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B*35:18,YYATYRNIFTNTYESNLYIRYNYYTWAVRAYLWY HLA-B*35:19,YYAKYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:20,YYATYRNISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:21,YYATYRNIFTNTYESNLYIRYDSYTWAELAYLWH HLA-B*35:22,YYATYRNIFTNTYESNLYLSYNYYTWAVLAYLWY HLA-B*35:23,YYATYRNIFTNTYESNLYIRFDSYTWAVLAYLWY HLA-B*35:24,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWH HLA-B*35:25,YYSEYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:26,YYAEYRNICTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:27,YYATYRNIFTNTYENNLYIRYDSYTWAVLAYLWY HLA-B*35:28,YYATYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:29,YYATYRNIFTNTDESNLYIRYDSYTWAVLAYLWY HLA-B*35:30,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B*35:31,YYATYRNIFTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*35:32,YYATYRNIFTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*35:33,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYEWY HLA-B*35:34,YYATYRNIFTNTYESNLYIRYDYYTWAVLAYLWY HLA-B*35:35,YYATYRNIFTNTYESNLYIRYDSYTWAVLTYTWY HLA-B*35:36,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:37,YYATYRNIFTNTYESNLYWTYDSYTWAVLAYLWY HLA-B*35:38,YYATYRNIFTNTYESNLYIRYDFYTWAVDAYLWY HLA-B*35:39,YYATYRNIFTNTYESNLYIRYDYYTWAVLAYLWY HLA-B*35:41,YYATYRNIFTNTYESNLYIRYDSCTWAVLAYLWY HLA-B*35:42,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:43,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:44,YYATYRNIFTNTYESNLYLRYNYYTWAEWAYLWY HLA-B*35:45,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLSY HLA-B*35:46,YYAMYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:47,YYAKYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:48,YYATYRNIFTNTYESNLYIRSDSYTWAVLAYLWY HLA-B*35:49,YYAEYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:50,YHATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:51,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:52,YYATYRNIFTNTYECNLYIRYDSYTWAVLAYLWY HLA-B*35:54,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:55,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:56,YYATYRNIFTNTYENNLYIRYDFYTWAVLAYLWY HLA-B*35:57,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:58,YYATYRNIFTNTYESNLYLSYDSYTWAELAYLWY HLA-B*35:59,YYATYRNIFTNTYESNLYIRYNFYTWAVLAYLWY HLA-B*35:60,YYATYRNIFTNTYESNLYWTYNLYTWAVLAYTWY HLA-B*35:61,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:62,YYATYRNIFTNTYESNLYIRYDSYTWAVWAYLWY HLA-B*35:63,YHTKYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:64,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:66,YYATYRNIFTNTYESNLYLSYDSYTWAVRAYEWY HLA-B*35:67,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:68,YYATYRNIFTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*35:69,YYATYREIFTNTDESNLYIRYDSYTWAVLAYLWY HLA-B*35:70,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:71,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLSY HLA-B*35:72,YYATYRNISTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:74,YYATYRNIFTNTYVSNLYIRYDFYTWAVLAYLWY HLA-B*35:75,YYATYRNIFTNTYESNLYLRYDFYTWAVLAYLWY HLA-B*35:76,YYATYRNIYAQTDESNLYIRYDSYTWAVLAYLWY HLA-B*35:77,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:78,YYATYRNIFANTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:79,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:80,YYATYREIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:81,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWH HLA-B*35:82,YYATYRNICTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:83,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:84,YHTTYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:85,YYATYRNICTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:86,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYEWY HLA-B*35:87,YYATYRNIFTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*35:88,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*35:89,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:90,YYTTYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:91,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:92,YYATYRNIFTNAYESNLYIRYDSYTWAVLAYLWY HLA-B*35:93,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYTWY HLA-B*35:94,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:95,YYATYRNISTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:96,YYATYRNIFTNTYESNLYIRYDFYTWAELAYTWH HLA-B*35:97,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:98,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:99,YYATYRNIFTNTYESNLYLRYDSYTWAERAYLWY HLA-B*35:100,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:101,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:102,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:103,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:104,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:105,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:106,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:107,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:108,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:109,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWH HLA-B*35:110,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:111,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:112,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:113,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B*35:114,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:115,YYATYRNIFTNTYESNLYIRYDSYTWAVDAYLWY HLA-B*35:116,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:117,YYATYRNIFTNTYESNLYLSYDSYTWAEWAYLWY HLA-B*35:118,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:119,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:120,YYATYRNIFTNTYESNLYIRHDSYTWAVLAYLWY HLA-B*35:121,YYATYRNIFTNTYESNLYIRYHSYTWAVLAYLWY HLA-B*35:122,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:123,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:124,YYSTYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:125,YYSTYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B*35:126,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:127,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:128,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:131,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:132,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:133,YYATYRNIFTNTYESNLYIRYVSYTWAVLAYLWY HLA-B*35:135,YYATYRNICTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:136,YYATYRNIFTNTDESNLYIRYDFYTWAVLAYLWY HLA-B*35:137,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:138,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:139,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:140,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:141,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:142,YYSTYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:143,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:144,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*37:01,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:02,YHSTYREISTNTYEDTLYLNYHDYTWAVLAYEWY HLA-B*37:04,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWH HLA-B*37:05,YHSTYREISTNTYEDNLYIRSNFYTWAVDAYTWY HLA-B*37:06,YHSKYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:07,YHSTYREISTNTYEDTLYLSYDYYTWAERAYEWY HLA-B*37:08,YHSTYRNISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:09,YHSTYREISTNTYEDTLYLSYDYYTWAVDAYTWY HLA-B*37:10,YHSTYREISTNTYENTAYIRSNFYTWAVDAYTWY HLA-B*37:11,YHSTYREISTNTYESNLYIRSNFYTWAVDAYTWY HLA-B*37:12,YHSTYREISTNTYEDTLYIRYNYYTWAVDAYTWY HLA-B*37:13,YHSTYREISTNTYEDTLYIRSNFYTWAEDAYTWY HLA-B*37:14,YHSTYREISTNTYESNLYIRSNFYTWAVDAYTWY HLA-B*37:15,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:17,YHSTYREISTNTYEDTLYIRSNFYTWTVDAYTWY HLA-B*37:18,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:19,YHSTYREISTNTYEDTLYIRYNFYTWAVDAYTWY HLA-B*37:20,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:21,YHSTYREIFTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:22,YHATYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:23,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*38:01,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:02,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B*38:03,YYSEYREISTNTDESTAYLRYNFYTWAVLTYTWY HLA-B*38:04,YYSEYREICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B*38:05,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:06,YYSTYRNIFTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:07,YYSTYRNIFTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:08,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYMWY HLA-B*38:09,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:10,YYSEYRNICTNTYENIAYLRYNFYTWAELAYTWY HLA-B*38:11,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:12,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:13,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:14,YYSEYRNICTNTDENIAYLRYNFYTWAVLTYTWY HLA-B*38:15,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B*38:16,YYTEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:17,YYSEYRNICTNTYEDTLYLRYNFYTWAVLTYTWY HLA-B*38:18,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B*38:19,YYSEYRNICTNTYENIAYLSYNFYTWAVLTYTWY HLA-B*38:20,YYSEYRNICTNTYENIAYIRYNFYTWAVLTYTWY HLA-B*38:21,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:22,YYSEYRNICTNTYENIAYLNYNFYTWAVLTYKWY HLA-B*38:23,YYSEYRNICTNTYENTAYFRYNFYTWAVLTYTWY HLA-B*39:01,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:02,YYSEYREISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:03,YYSEYRNICTNTDESNLYLSYNFYTWAVLTYTWY HLA-B*39:04,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:05,YYSEYRNICTNTYESNLYLRYNFYTWAVLTYTWY HLA-B*39:06,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY HLA-B*39:07,YYSEYRNICTNTYESNLYLRYDSYTWAVLTYTWY HLA-B*39:08,YYSEYREISTNTYESNLYLRYNFYTWAVRTYTWY HLA-B*39:09,YYSEYRNICTNTDESNLYLRSNFYTWAVLTYTWY HLA-B*39:10,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:11,YYSEYRNICTNTYESNLYLRYNFYTWAVRTYTWY HLA-B*39:12,YDSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:13,YYSEYREISTNTYESNLYLRYNFYTWAVLTYTWY HLA-B*39:14,YYSEYRNICTNTDESNLYLSYNYYTWAVLTYTWY HLA-B*39:15,YYSEYRNICTNTDESNLYLRYDFYTWAVLTYTWY HLA-B*39:16,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:17,YYSEYRNIYTNTDESNLYLRYNLYTWAVLTYTWY HLA-B*39:18,YYSEYRNICTNTDESNLYLRYNFYTWAEWTYTWY HLA-B*39:19,YYSTYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:20,YYSEYRNIYTNTYENNLYLRYNFYTWAVLTYTWY HLA-B*39:22,YYSEYREICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:23,YYSEYREISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:24,YYSEYRNICTNTDESNLYLSYNFYTWAVLTYTWY HLA-B*39:26,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:27,YYSEYRNICTNTDVSNLYLRYNFYTWAVLTYTWY HLA-B*39:28,YYSEYRNICTNTDESNLYLTYNFYTWAVLTYTWY HLA-B*39:29,YYSEYRNICTNTDESNLYLSYDYYTWAVLTYTWY HLA-B*39:30,YYSEYRNICTNTDESNLYLRYNFYTWAVLAYTWY HLA-B*39:31,YHSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:32,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYLWH HLA-B*39:33,YYSEYRNICTNTDESNLYWTYNFYTWAVRAYLWY HLA-B*39:34,YYSEYRNICTNTDESNLYWTYNFYTWAVLAYTWY HLA-B*39:35,YYSEYRNICTNTDESNLYLRYNFYTWAELTYTWY HLA-B*39:36,YYSEYRNICTNTDESNLYLRYNFYTWAEWAYTWY HLA-B*39:37,YYSEYRNICTNTYESNLYLSYNFYTWAVLTYTWY HLA-B*39:39,YYSEYRNISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:41,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:42,YYSEYRNICTNTDESNLYIRYNFYTWAVLTYTWY HLA-B*39:43,YYSEYRNICTNTDESNLYLRYDSYTWAVLAYTWH HLA-B*39:44,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:45,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:46,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:47,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYEWY HLA-B*39:48,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWH HLA-B*39:49,YYSEYREISTNTYESNLYLRYDFYTWAVLTYTWY HLA-B*39:50,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYEWY HLA-B*39:51,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:52,YYSEYRNICTDTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:53,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:54,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:55,YYSEYRNICTNTYESNLYLRYDFYTWAVLTYTWY HLA-B*39:56,YYSEYRNICTNTYESNLYLRYNFYTWAVLTYTWY HLA-B*39:57,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY HLA-B*39:58,YYSEYRNIFTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:59,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:60,YYSEYRNICTNTDESNLYLRYNFYTWAALTYTWY HLA-B*40:01,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:02,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:03,YHTKYREISTNTYESNLYLSYDSYTWAVLAYEWY HLA-B*40:04,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*40:05,YHTKYREISTNTYESNLYLSYNYYTWAELAYLWY HLA-B*40:06,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:07,YHTKYREIFTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:08,YHTKYRNIFTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:09,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY HLA-B*40:10,YYAKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:11,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY HLA-B*40:12,YYSEYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:13,YHTKYREIFTNTYENIAYLSYNYYTWAVLAYEWY HLA-B*40:14,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY HLA-B*40:15,YHTKYREISTNTYESNLYLSYNYYTWAERAYEWY HLA-B*40:16,YHTKYREISTNTYESNLYLSYNYYTWAERAYEWY HLA-B*40:18,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY HLA-B*40:19,YHTKYREISTNTYENIAYLSYNYYTWAVLAYEWY HLA-B*40:20,YHTKYREISTNTYESNLYLRYDSYTWAVLAYEWY HLA-B*40:21,YYAMYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:23,YHTKYREISTNTYESNLYLRYNYYSWAERAYEWY HLA-B*40:24,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY HLA-B*40:25,YHTKYRNISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:26,YHTKYREISTNTYESNLYLRYNYYTWAELAYLWY HLA-B*40:27,YHTKYREISTNTYESNLYLSYNNYTWAVLAYEWY HLA-B*40:28,YHTKYREISTNTYESNLYIRYNYYTWAELAYLWH HLA-B*40:29,YHTKYPEISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:30,YHTKYREISTNTYESNLYIVYNYYSLAVLAYEWY HLA-B*40:31,YHTKYREISTNTYESNLYLSYDYYSLAVLAYEWY HLA-B*40:32,YHTKYREISTNTYESNLYLSYDYYTWAERAYEWY HLA-B*40:33,YHTKYREISTNTYESNLYLRYDYYSLAVLAYEWY HLA-B*40:34,YHTKYREISTNTYESNLYIVYNYYSLAVLAYEWY HLA-B*40:35,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:36,YHTKYREISTNTYESNLYLRYNFYSLAVLAYEWY HLA-B*40:37,YHTKYREISTNTYENNLYLSYNYYTWAVLAYEWY HLA-B*40:38,YHTKYREISTNTYESNLYLRYNSYSLAVLAYEWY HLA-B*40:39,YHTKYREISTNTYESNLYLSYNYYTWAVLAYTWY HLA-B*40:40,YYTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:42,YHTKYREISTNTYESNLYLRYDYYSLAVLAYEWY HLA-B*40:43,YHTKYREISTNTDESNLYLRYNYYSLAVLAYEWY HLA-B*40:44,YHTKYREISTNTYESNLYWTYDYYTWAVLAYEWY HLA-B*40:45,YHTKYREISTNTYESNLYLSYNYYSWAVLAYEWY HLA-B*40:46,YHTEYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:47,YHTKYREISTNTYENTAYLRYNYYSLAVLAYEWY HLA-B*40:48,YHTKYREISTNTYESNLYLRYNLYSLAVLAYEWY HLA-B*40:49,YYTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:50,YHTKYREISTNTDESNLYLSYNYYTWAVLAYEWY HLA-B*40:51,YHTKYREISTNTYESNLYLRYNYYSWAELAYTWH HLA-B*40:52,YHTKYREISTNTYESNLYLRYDSYSLAVLAYEWY HLA-B*40:53,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:54,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:55,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:56,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:57,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:58,YYAKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:59,YHTKYREISTNTYESNLYIRYDSYSLAVLAYEWY HLA-B*40:60,YHTKYREISTNTYESNLYLRSDSYSLAVLAYEWY HLA-B*40:61,YHTKYREIYTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:62,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:63,YHTKYREISTNTYESNLYLRYNYYSLAVLAYLWY HLA-B*40:64,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*40:65,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:66,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:67,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:68,YHTKYRNIFTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*40:69,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:70,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:71,YHTKYREISTNTYESNLYLSYNLYTWAVLAYLWY HLA-B*40:72,YHTKYREISTNTYESNLYLRYNYYTLAVLAYEWY HLA-B*40:73,YHTKYREISTNTYVSNLYLRYNYYSLAVLAYEWY HLA-B*40:74,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:75,YHTKYREICTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:76,YHTKYREISTNTYESKLYLRYNYYSLAVLAYEWY HLA-B*40:77,YHTKYREISTNTYESNLYLRYNFYTLAVLAYEWY HLA-B*40:78,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:79,YHTKYREISTNTYESNLHLRYNYYSLAVLAYEWY HLA-B*40:80,YHTKYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*40:81,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:82,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:83,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:84,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:85,YHTKYREISTNTYESNLYLSYNYYIWAVLAYEWY HLA-B*40:86,YHTKYREISTNTYESNLYWTYNFYTWAVLAYEWY HLA-B*40:87,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:88,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:89,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:90,YHTKYREISTNTYESNLYLSYNYYTWAVLAHEWY HLA-B*40:91,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:92,YHTKYREISTNTYESNLYLRYNYYSLAVLAYLWY HLA-B*40:93,YHTEYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:94,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:95,YHTKYREISTNTYESNLYWTYNYYTWAELAYEWY HLA-B*40:96,YHTKYREISTNTYENTAYWTYNYYTWAVLAYEWY HLA-B*40:97,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:98,YHTKYREISTNTYESNLYLSYDYYTWAERAYEWY HLA-B*40:99,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*40:100,YHTKYREISTNTYESNLYLRFNYYSLAVLAYEWY HLA-B*40:101,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:102,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:103,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:104,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:105,YHTKYREISTNTYESNLYLSYNSYTWAVLAYEWY HLA-B*40:106,YHTKYRNIFTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:107,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:108,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:109,YHTKYREISTNTYESIAYWTYNYYTWAVLAYEWY HLA-B*40:110,YYTKYREISTNTYENTAYWTYNYYTWAVLAYEWY HLA-B*40:111,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:112,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:113,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWH HLA-B*40:114,YHTKYREISTNTYESNLYLRYNYYSWAVLAYEWY HLA-B*40:115,YHTKYWEISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:116,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:117,YHTKYREISTNTYENIAYLRYNYYSLAVLAYEWY HLA-B*40:119,YHTKYREISTNTYDSNLYLSYNYYTWAVLAYEWY HLA-B*40:120,YHTKYREISTNTYESNLYIRYDYYTWAVLAYEWY HLA-B*40:121,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY HLA-B*40:122,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:123,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:124,YHTKYREISTNTYESNLYLRYHDYSLAVLAYEWY HLA-B*40:125,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:126,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:127,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:128,YHTKYREISTNTYESNLYLRYNYYSLAVRAYEWY HLA-B*40:129,YYTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*40:130,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:131,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:132,YHTKYREISTNTYESNLYLRYNYYSLAVLAYESY HLA-B*40:134,YHTKYREISTNIYESNLYLRYNYYSLAVLAYEWY HLA-B*40:135,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:136,YHTKYREISTNTYESNLYLRYNYYTWAVDAYEWY HLA-B*40:137,YYAMYREISTNTYESNLYIRYNYYSLAVLAYEWY HLA-B*40:138,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:139,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:140,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:141,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:143,YHTKYREISTNTYESNLYLSFNYYTWAVLAYEWY HLA-B*40:145,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:146,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:147,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*41:01,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B*41:02,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*41:03,YHTKYREISTNTYESNLYLRYNYYTWAVDAYTWY HLA-B*41:04,YHTKYREISTNTYESNLYLSYDYYTWAVDAYTWY HLA-B*41:05,YHTKYREISTNTYESKLYWRYNYYTWAVDAYTWY HLA-B*41:06,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B*41:07,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B*41:08,YHTKYREISTNTYESNLYLRYNYYTWAVDAYTWY HLA-B*41:09,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B*41:10,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*41:11,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*41:12,YHAKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B*42:01,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:02,YHSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:04,YYSEYRNIYAQTDESNLYWTYNYYTWAVDAYTWY HLA-B*42:05,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:06,YYSEYRNIYAQTDESNLYLSYNFYTWAVDAYTWY HLA-B*42:07,YYSEYRNIYTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:08,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:09,YHSEYRNIYAQTDESNLYLSYDSYTWAVDAYTWY HLA-B*42:10,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:11,YYSEYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*42:12,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:13,YYSEYRNIYAQTDESNLYIRYNYYTWAVDAYTWY HLA-B*42:14,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*44:02,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:03,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:04,YYTKYREISTNTYENTAYIRYDDYTWAVRAYTSY HLA-B*44:05,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B*44:06,YYATYRNIFTNTYENIAYIRYDDYTWAVDAYLSY HLA-B*44:07,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:08,YYTMYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:09,YYTKYREISTNTYESNLYIRYDDYTWAVDAYLSY HLA-B*44:10,YYTKYREISTNTYENTAYIRFNLYTWAVLAYLSY HLA-B*44:11,YYTKYREISTNTYENTPYIRYDDYTWAVDAYLSY HLA-B*44:12,YYTKYRNISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:13,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:14,YYTKYREISTNTYENTAYIRYNDYTWAVDAYLSY HLA-B*44:15,YHTKYREISTNTYESTAYWRYNLYTWAVDAYLSY HLA-B*44:16,YYTKYREISTNTYENTAYIRYDDYTWAVDAYEWY HLA-B*44:17,YYTKYREISTNTYENTAYIRYDSYTWAVDAYLSY HLA-B*44:18,YHTKYREISTNTYENIAYWRYNLYTWAVDAYLSY HLA-B*44:20,YYTKYREISTNTYENTAYWTYDDYTWAVDAYLSY HLA-B*44:21,YYTKYREISTNTYENTAYIRYDDYTWAVDAYESY HLA-B*44:22,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:24,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:25,YYTKYREISTNTYENIAYIRYDYYTWAVDAYLSY HLA-B*44:26,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:27,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:28,YYTKYREISTNTYENTAYIRYDDYTWAVRAYLSY HLA-B*44:29,YYTKYREISTNTYENTAYIRYDDYTWAVLTYLSY HLA-B*44:30,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:31,YYTKYREISTNTYENTAYLRYNYYSLAVLAYESY HLA-B*44:32,YYTKYPEISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:33,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:34,YYAKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:35,YYTKYREISTNTYENTAYIRYDDYTWAVEAYLSY HLA-B*44:36,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:37,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLWY HLA-B*44:38,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:39,YYPKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:40,YYTEYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:41,YYTKYREISTNTYENTAYLRYDDYTWAVDAYLSY HLA-B*44:42,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLWY HLA-B*44:43,YYTKYREISTNTYENTAYIRYDSYTWAVLAYLSY HLA-B*44:44,YYTEYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:45,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:46,YYTKYREISTNTYESNLYIRYDDYTWAVLAYLSY HLA-B*44:47,YYTKYREISTNTYENTAYWTYDDYTWAVLAYLSY HLA-B*44:48,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:49,YDTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:50,YYTKYREISTNTYENIAYIRYDDYTWAVLAYLSY HLA-B*44:51,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:53,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:54,YYTKYREISTNTYENTAYLSYDDYTWAVLAYLSY HLA-B*44:55,YHTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:57,YYTMYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:59,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:60,YYTMYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:62,YYTKYREISTNTYENTAYIRYNYYTWAVDAYLSY HLA-B*44:63,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:64,YYTKYREISTNTYENTAYIRYDDYTWAVLAYEWY HLA-B*44:65,YYTKYREISTNTYENTAYLRYDDYTWAVLAYLSY HLA-B*44:66,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:67,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:68,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:69,YYTKYWEISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:70,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B*44:71,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:72,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:73,YYTKYREISTNTYENTAYIRYDDYTWAVDGYLSY HLA-B*44:74,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:75,YYTKYREISTNTYENNLYIRYDYYTWAVDAYLSY HLA-B*44:76,YYTKYREISTNTYENTAYIRYDDYTWAERAYLSY HLA-B*44:77,YYTKYREISTNTYENTAYIRYNYYTWAVLAYLSY HLA-B*44:78,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B*44:79,YYTKYREISTNTYENTAYIRYDDYTWAELAYLSY HLA-B*44:80,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:81,YYTNYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:82,YYTKYREISTNTYENTAYIRYNYYTWAVLAYLSY HLA-B*44:83,YYATYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:84,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:85,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:86,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:87,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:88,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:89,YYTKYREISTNTYENTAYIRYDDYTWAVDTYLSY HLA-B*44:90,YYTKYREIYAQTDESNLYIRYDDYTWAVDAYLSY HLA-B*44:91,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLWY HLA-B*44:92,YYTKYREISTNTYENTAYIRYDDYTWAMLAYLSY HLA-B*44:93,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:94,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:95,YYTKYREISTNTYENIAYIRYDDYTWAVDAYLSY HLA-B*44:96,YYTKYREISTNTYENTAYIGYDDYTWAVLAYLSY HLA-B*44:97,YYTKYREICAKTDENTAYIRYDDYTWAVDAYLSY HLA-B*44:98,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:99,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:100,YYTKYREISTNTYENTAYWRYDDYTWAVDAYLSY HLA-B*44:101,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:102,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:103,YHTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:104,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:105,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:106,YYTKYREISTNTYENTAYLSYDDYTWAVDAYLSY HLA-B*44:107,YYTKYREISTNTYENTAYIRYDYYTWAVLAYLSY HLA-B*44:109,YYTKYREISTNTYESTAYIRYDDYTWAVLAYLSY HLA-B*44:110,YYTKYREISTNTYENTAYISYDDYTWAVLAYLSY HLA-B*45:01,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B*45:02,YHTKYREISTNTYESNLYWRYNFYTWAVDAYLSY HLA-B*45:03,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B*45:04,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLWY HLA-B*45:05,YHTKYREISTNTYESNLYWRYNLYTWAVDVYLSY HLA-B*45:06,YHTKYREIYAQTDESNLYWRYNLYTWAVDAYLSY HLA-B*45:07,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B*45:08,YHTKYREISTNTYESNLYWRYNLYTWAVDAYTWY HLA-B*45:09,YHTKYREISTNTYESNLYWRYDSYTWAVDAYLSY HLA-B*45:10,YHTKYREISTNTYESNLYWRYNLYTWAVDAYEWY HLA-B*45:11,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B*45:12,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B*46:01,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:02,YYAMYREKYRQTGVSNLYLRYDSYTWAEWAYLWY HLA-B*46:03,YYAMYREKYRQTDVSNLYLRYDSYTWAERAYTWY HLA-B*46:04,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:05,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:06,YYAMYREKYRQTDVSNLYLRYDSYSLAVLAYEWY HLA-B*46:08,YYAMYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-B*46:09,YYAMYREKYRQTDVSNLYLRYDSYTWAVWAYLWY HLA-B*46:10,YYTMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:11,YYAMYREKYRQTDVSNLYWTYNLYTWAVLAYLWY HLA-B*46:12,YYAMYREKYRQTDVSNLYLSYDSYTWAEWAYLWY HLA-B*46:13,YYAMYREKYRQTDVSNLYLRYDSYTWAVLAYLWY HLA-B*46:14,YHAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:16,YYAMYREKFRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:17,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLSY HLA-B*46:18,YYAMYREKYRQTDVSNLYWTYNLYTWAVLAYTWY HLA-B*46:19,YYAMYREKYRQTDVSNLYLRYDSYTWAVLTYLWY HLA-B*46:20,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:21,YYAMYREKYRQTDVSNLYLRYDSYTWAVLAYTWY HLA-B*46:22,YYAMYREKYRRTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:23,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:24,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*47:01,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYEWY HLA-B*47:02,YYTKYREISTNTYESNLYLRFHDYTWAVLAYEWY HLA-B*47:03,YYTKYREISTNTYESNLYLRFHDYTWAVLAYEWY HLA-B*47:04,YYTKYREISTNTYENTAYLNYHDYTWAVLAYEWY HLA-B*47:05,YYTKYREISTNTYEDTLYLNYHDYTWAVLAYEWY HLA-B*47:06,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYEWY HLA-B*47:07,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYEWY HLA-B*48:01,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:02,YYSEYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*48:03,YYSEYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*48:04,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:05,YYSEYREISTNTYESNLYLSYNYYTWAERAYEWY HLA-B*48:06,YYSEYRNIFTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:07,YYSEYREISTNTYESNLYLSYNFYSLAVLAYEWY HLA-B*48:08,YYSEYREISTNTYESNLYLSYDYYTWAERAYEWY HLA-B*48:09,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:10,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*48:11,YYSEYREISTNTYESNLYLSYNYYSLAVLAYELY HLA-B*48:12,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*48:13,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*48:14,YYSEYREISTNTYESNLYLSYNSYTLAVLAYEWY HLA-B*48:15,YYSEYREISTNTYESNLYLSYNYYSLAELAYEWY HLA-B*48:16,YYSEYRVISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:17,YYSEYREISTNTYESNLYIRYNFYSLAVLAYEWY HLA-B*48:18,YYSEYREISTNTYESIAYLSYNYYSLAVLAYEWY HLA-B*48:19,YYSEYREISTNTYESNLYLSYNYYSLAVWAYEWY HLA-B*48:20,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:21,YYSEYREISTNTYESNLYLNYNYYSLAVLAYEWY HLA-B*48:22,YHSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:23,YYSEYREISTNTYESNLYLRYDSYSLAVLAYEWY HLA-B*49:01,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B*49:02,YHTKYREISTNTYENTAYWRYNLYTWAELAYLWY HLA-B*49:03,YHATYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B*49:04,YHTKYREISTNTYENIAYWRYDSYTWAELAYLWY HLA-B*49:05,YHTKYREISTNTYENIAYWRYDSYTWAELAYLWY HLA-B*49:06,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B*49:07,YHTKYREISTNTYENIAYWRYNLYTWAELAYEWY HLA-B*49:08,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B*49:09,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWH HLA-B*49:10,YYTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B*50:01,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:02,YHTKYREISTNTYESNLYWRYNLYTWAELAYLSY HLA-B*50:04,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:05,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:06,YHTRYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:07,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:08,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:09,YHTKYREISTNTYESNLYWRYNFYTWAELAYLWY HLA-B*51:01,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:02,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWY HLA-B*51:03,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLGH HLA-B*51:04,YYATYRNIFTNTYENIAYIRYNYYTWAELAYLWH HLA-B*51:05,YYATYRNIFTNTYENIAYWTYNYYTWAVRAYLWY HLA-B*51:06,YYATYRNIFTNTYENIAYLRYNYYTWAELAYLWH HLA-B*51:07,YYATYRNISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:08,YYATYRNIFTNTYENIAYWTYNYYTWAVDAYLWH HLA-B*51:09,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWH HLA-B*51:12,YYATYRNIFTNTYENIADWTYNYYTWAELAYLWH HLA-B*51:13,YYATYRNIFTNTYENIAYWTYNFYTWAELAYLWH HLA-B*51:14,YYATYRNIFTNTYENIAYWTYKYYTWAELAYLWH HLA-B*51:15,YYATYRNIFTNTYENIAYWTYNLYTWAVLAYLWY HLA-B*51:16,YYATYRNIFTNTYENIAYWTYNYYTWAELAYEWH HLA-B*51:17,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:18,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:19,YYATYRNIFTNTYENIAYWTYNYYTWAVLTYLWH HLA-B*51:20,YYATYRNIFTNTDENIAYWTYNYYTWAVDAYLWH HLA-B*51:21,YYATYRNIFTNTYENIAYWTYNYYTWAELAYTWH HLA-B*51:22,YYATYRNICTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:23,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLSY HLA-B*51:24,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:26,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:28,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:29,YYATYRNIFTNTYENIAYWTYNYYTWAERAYLWH HLA-B*51:30,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:31,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYEWH HLA-B*51:32,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:33,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:34,YYATYRNIFTNTYENIAYWTYNYYTWAELAYEWY HLA-B*51:35,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:36,YYATYRNIFTNTYENIAYWTYNYYTWAEDAYTWY HLA-B*51:37,YYATYRNIFTNTYENIAYWTYDSYTWAELAYLWH HLA-B*51:38,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:39,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:40,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWY HLA-B*51:42,YYATYRNIFTNTYENIAYIRYDDYTWAVLAYLSY HLA-B*51:43,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:45,YYATYRNIFTNTYENIAYLRYDSYTWAELAYLWH HLA-B*51:46,YYATYRNIFTNTYENIAYITYNYYTWAELAYLWH HLA-B*51:48,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:49,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:50,YYATYRNIFTNTYENGLYWTYNYYTWAELAYLWH HLA-B*51:51,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:52,YYATYRNIFTNTHENIAYWTYNYYTWAELAYLWH HLA-B*51:53,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:54,YYATYRNIFTNTYENTAYWTYNYYTWAVRAYLWY HLA-B*51:55,YYATYRNIFTNTYENIAYWTYNYYTWAEQAYLWH HLA-B*51:56,YYATYRNIFTNTYENIAYIRYNYYTWAELAYLWH HLA-B*51:57,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:58,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:59,YYATYRNIFTNTYENIAYLRYNYYTWAELAYLWY HLA-B*51:60,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:61,YYATYRNIFTNTYENIAYWTYNYYTWAEWAYLWH HLA-B*51:62,YYATYRNIFTNTYENIAYLRYNLYTWAELAYLWH HLA-B*51:63,YYATYRNIFTNTYENIAYWTYNSYTWAELAYLWH HLA-B*51:64,YYATYRNIFTNTYENIAYLSYNYYTWAELAYLWH HLA-B*51:65,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:66,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:67,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:68,YDATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:69,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:70,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:71,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:72,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:73,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWH HLA-B*51:74,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:75,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:76,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:77,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:78,YYATYRNIFTNTYENTAYWTYNYYTWAELAYLWH HLA-B*51:79,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:80,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:81,YYATYRNIFTNTYENIAYLSYNYYTWAVLAYEWY HLA-B*51:82,YYATYRNIFTNTYENIAYWTYNYYTWAERAYEWH HLA-B*51:83,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:84,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:85,YYATYRNIFTNTYENIAYWTYHDYTWAELAYLWH HLA-B*51:86,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:87,YYATYRNIFTNTYENIAYWTYNYYTWADLAYLWH HLA-B*51:88,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:89,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:90,YYATYRNIFTNTYENIAYWTYDYYTWAELAYLWH HLA-B*51:91,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:92,YYATYRNIFTNTYENIAYWTYDFYTWAELAYLWH HLA-B*51:93,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYEWY HLA-B*51:94,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:95,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:96,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:01,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:02,YYAMYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:03,YYATYREISTNTYENIAYWTYNYYTWAVLAYLWY HLA-B*52:04,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:05,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:06,YYATYREIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:07,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:08,YYATYREISTNTYENIAYWTYNYYTWAELAYEWH HLA-B*52:09,YYATYREISTNTYESIAYWTYNYYTWAELAYLWH HLA-B*52:10,YYATYREISTNTYENIAYWTYNYYTWAVLAYLWH HLA-B*52:11,YYATYREISTNTYENIAYWTYNYYTWAELAYLWY HLA-B*52:12,YYATYREISTNTYENIAYWTYDYYTWAELAYLWH HLA-B*52:13,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:14,YYATYREISTNTYENIAYWTYNFYTWAELAYLWH HLA-B*52:15,YYATYREISTNTYENIAYWTYNYYTWAELAYLSH HLA-B*52:16,YYSEYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:17,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:18,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:19,YYATYREISTNTYENIAYWTYNYYTWAVDAYLWH HLA-B*52:20,YYATYREISTNTYENTAYWTYNYYTWAELAYLWH HLA-B*52:21,YYATYREISTNTYENIAYWTYNYYTWAEWAYLWH HLA-B*53:01,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:02,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWH HLA-B*53:03,YYATYRNIFTNTYEDTLYIRYDSYTWAVLAYLWY HLA-B*53:04,YYATYRNIFTNTYENIAYIRYDFYTWAVLAYLWY HLA-B*53:05,YYATYRNIFTNTYESIAYIRYDSYTWAVLAYLWY HLA-B*53:06,YYATYRNIFTNTYENIAYIRYDSYTWAELAYLWH HLA-B*53:07,YYATYRNIFTNTYENIAYIRSNFYTWAVLAYLWY HLA-B*53:08,YYATYRNIFTNTYENIAYIRYDSYTWAELAYLWY HLA-B*53:09,YYATYRNISTNTYENTAYIRYDSYTWAVLAYLWY HLA-B*53:10,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:11,YYATYRNIFTNTYENTAYIRYDSYTWAVRAYLWY HLA-B*53:12,YYATYRNIFTNTYESTAYIRYDSYTWAVLAYLWY HLA-B*53:13,YYATYRNIFTNTYENTAYIRYDSYTWAVLAYLWY HLA-B*53:14,YYATYRNIFTNTYENIAYLSYDSYTWAVLAYLWY HLA-B*53:15,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:16,YYATYRNIFTNTYESIAYIRYDSYTWAVRAYLWY HLA-B*53:17,YYATYREISTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:18,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:19,YYATYRNIFTNTYENIAYIRYNYYTWAVLAYLWY HLA-B*53:20,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:21,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:22,YYATYRNIFTNTYENIAYIRYDSYTWAVDAYLSY HLA-B*53:23,YYATYRNIFTNTDENIAYIRYDSYTWAVLAYLWY HLA-B*54:01,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:02,YHAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:03,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*54:04,YYAGYRNIYAQTDESNLYWTYNYYTWAVLAYTWY HLA-B*54:06,YYAGYRNIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B*54:07,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:09,YYAGYRNIYAQTDESNLYLRYDSYTWAVLAYTWY HLA-B*54:10,YYAGYRNIYAQTDESNLYWTYNLYTWAVRAYTWY HLA-B*54:11,YYAGYRNIYAQTDESNLYWTYNYYSWAVLAYTWY HLA-B*54:12,YYAGYRNIYAQTDENIAYWTYNLYTWAVLAYTWY HLA-B*54:13,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:14,YYAGYRNIYAQTDESNLYWTYDSYTWAVLAYTWY HLA-B*54:15,YYAGYRNIYAQTDESNLYWTYDYYTWAVLAYTWY HLA-B*54:16,YYAGYRNIYAQTDESNLYWTYDLYTWAVLAYTWY HLA-B*54:17,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:18,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:19,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:20,YYAGYRNIYAQTDESNLYWTYNLYTWAERAYTWY HLA-B*54:21,YYSGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:22,YYAGYRNIYAQTDESNLYWTYNLYSWAVLAYTWY HLA-B*54:23,YYAGYRNIYAQTEESNLYWTYNLYTWAVLAYTWY HLA-B*55:01,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:02,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:03,YYAEYRNIYAQTDVSNLYWTYNLYTWAELAYTWY HLA-B*55:04,YYAEYRNIYAQTDESNLYLSYNYYTWAVLAYTWY HLA-B*55:05,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:07,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:08,YYAEYRNIYAQTDESNLYLRYNYYTWAVLAYLWY HLA-B*55:09,YYAEYRNIYAQTDESNLYWTYNLYTWAERAYEWY HLA-B*55:10,YYSEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:11,YYAEYRNIYAQTDESNLYWMYNLYTWAELAYTWY HLA-B*55:12,YYAEYRNIYAQTDENNLYWTYNLYTWAVLAYTWY HLA-B*55:13,YYAEYRNIYAQTDESNLYWTYNFYTWAVLAYTWY HLA-B*55:14,YYAEYRNIYAQTDESNLYIVYDSYTWAELAYTWY HLA-B*55:15,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:16,YHAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:17,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYTWY HLA-B*55:18,YYAEYREISTNTYESNLYWTYNLYTWAVLAYTWY HLA-B*55:19,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:20,YYAEYRNIYAQTDESNLYWTYNYYTWAVDAYTWY HLA-B*55:21,YYAEYRNIYAQTDESNLYWTYNLYTWAEWAYTWY HLA-B*55:22,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYEWY HLA-B*55:23,YYAEYRNIYAQTDESNLYWTYDSYTWAVLAYTWY HLA-B*55:24,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYEWY HLA-B*55:25,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:26,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:27,YYAEYRNIYAQTDESNLYWTYDYYTWAVLAYTWY HLA-B*55:28,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYTWY HLA-B*55:29,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:30,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:31,YYAEYRNIYAQTYESNLYWTYNLYTWAELAYTWY HLA-B*55:32,YYAEYRNIYAQTDESNLYWTYNSYTWAVLAYTWY HLA-B*55:33,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:34,YYAEYREISAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:35,YYAMYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:36,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:37,YYAEYRNIYAQTDESNLYWTYNLYTWAVRAYTWY HLA-B*55:38,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:39,YYAEYRNIYAQTDESNLYWTYNLHTWAVLAYTWY HLA-B*55:40,YYAEYREIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:41,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:42,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:43,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*56:01,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:02,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYLWY HLA-B*56:03,YYAEYRNIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B*56:04,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYLWY HLA-B*56:05,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYLWH HLA-B*56:06,YYATYRNIYAQTDESNLYWTYNYYTWAELAYLWH HLA-B*56:07,YYAEYRNIYAQTDENTAYWTYNLYTWAVLAYLWY HLA-B*56:08,YYAEYREKYGQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:09,YYAEYRNIYAQTDESNLYIRYDSYTWAVLAYLWY HLA-B*56:10,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYTWY HLA-B*56:11,YYAEYRNIYAQTDESNLYIRYDFYTWAVLAYLWY HLA-B*56:12,YYAEYRNIYAQTDESNLYIRYNYYTWAVLAYTWY HLA-B*56:13,YYAEYRNIYAQTDESNLYWTYNLYTWAVDAYLWY HLA-B*56:14,YYAEYREKYRQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:15,YYAEYRNIYAQTDESNLYWTYNYYTWAVLAYLWY HLA-B*56:16,YYSEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:17,YYAEYRNIYANTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:18,YYAEYRNIYAQTDESNLYLRYDSYTWAVLAYTWY HLA-B*56:20,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:21,YYAEYRNIYAQTDENIAYWTYNYYTWAELAYLWH HLA-B*56:22,YYAEYRNIYAQTDESNLYWTYNFYTWAVLAYLWY HLA-B*56:23,YYAEYRNIYANTYESNLYWTYNLYTWAVLAYTWY HLA-B*56:24,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:25,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYLWY HLA-B*56:26,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:27,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:29,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*57:01,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:02,YYAMYGENMASTYENIAYIVYNYYTWAVRAYLWY HLA-B*57:03,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY HLA-B*57:04,YYAMYGENMASTYENIAYIVYDDYTWAVRAYLWY HLA-B*57:05,YYAMYGENMASTYENIAYIRYNYYTWAVRAYLWY HLA-B*57:06,YYAMYGENMASTYENIAYIVYDSYIWAVLAYLWY HLA-B*57:07,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLSY HLA-B*57:08,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:09,YYAMYGENMASTYENIAYIVYNYYTWAEDAYLWY HLA-B*57:10,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:11,YYAMYGENMASTYENIAYLWYDSYTWAVLAYLWY HLA-B*57:12,YYAMYGENMASTYESNLYIVYNYYTWAVRAYLWY HLA-B*57:13,YYAMYGENMASTYENIAYIVYDSYTWAERAYEWY HLA-B*57:14,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWH HLA-B*57:15,YYAMYGENVASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:16,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:17,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY HLA-B*57:18,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:19,YYAMYGENMASTYENIAYIVYDSYTWAVRAYLWY HLA-B*57:20,YYAMYGKNMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:21,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:22,YYAMYGENMASTYENIAYIVYDSYTWAELAYLWY HLA-B*57:23,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:24,YYAMYGENMASTYENIAYIVYDSYTWAVDAYLWY HLA-B*57:25,YYAMYGENMASTYENIAYIVYDSYTWAVLAYEWY HLA-B*57:26,YYAMYGENMASTYENIAYIVYDSYTWAVLAYTWY HLA-B*57:27,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:29,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:30,YYAMYGENMASTYENIAYIVYDSYTWAARAYLWY HLA-B*57:31,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:32,YYAMYGENMASTYENIAYIVYHDYTWAVLAYLWY HLA-B*58:01,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:02,YYATYGENMASTYENIAYLWYDSYTWAVLAYLWY HLA-B*58:04,YYATYEENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:05,YYATYGENMASTYENIAYIRYDSYTLAALAYTWY HLA-B*58:06,YYATYGENMASTYENIAYLWYDSYTWAELAYLWY HLA-B*58:07,YYATYGENMASTYENIAYLWYDSYTWAVLAYLSY HLA-B*58:08,YYATYGENMASTYENIAYWTYNYYTWAELAYLWH HLA-B*58:09,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWH HLA-B*58:11,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:12,YYSTYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:13,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:14,YYATYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*58:15,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:16,YYATYGENMASTYENIAYLRYDSYTWAVLAYLWY HLA-B*58:18,YYATYGENMASTYENIAYLSYDSYTWAVLAYLWY HLA-B*58:19,YYATYGENMASTYENIAYIRYDSYTWAELAYLWY HLA-B*58:20,YYATYGENMASTYENIAYLRYNFYTWAVLTYTWY HLA-B*58:21,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:22,YYATYGENMASTYENIAYIRYDSYTWAVRAYLWY HLA-B*58:23,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:24,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:25,YYATYGENMASTYENIAYLWYDSYTWAVLAYLWY HLA-B*58:26,YYATYGENMASTYENIAYLRYDSYTWAVLAYLWY HLA-B*58:27,YYATYGENMASTYENIAYLSYNYYTWAVLAYEWY HLA-B*58:28,YYATYGENMASTYENIAYIRYNYYTWAVLAYLWY HLA-B*58:29,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:30,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*59:01,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYTWY HLA-B*59:02,YYAEYRNIFTNTYENIAYWTYNYYTWAVLAYTWY HLA-B*59:03,YYAEYRNIFTNTYENIAYWTYNFYTWAVLAYTWY HLA-B*59:04,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYLWY HLA-B*59:05,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYTWY HLA-B*67:01,YYSEYRNIYAQTDESNLYLRYNFYTWAVLTYTWY HLA-B*67:02,YYSGYREKYRQADVSNLYLRYNFYTWAVLTYTWY HLA-B*73:01,YHTEYRNICAKTDVGNLYWTYNFYTWAVLAYEWH HLA-B*73:02,YHTEYRNICAKTDVGNLYWTYNFYTWAVLAYEWH HLA-B*78:01,YYATYRNIFTNTDESNLYWTYNYYTWAELAYLWH HLA-B*78:02,YYATYRNIFTNTYESNLYWTYNYYTWAELAYLWH HLA-B*78:03,YYATYRNICTNTDESNLYWTYNYYTWAELAYLWH HLA-B*78:04,YYATYRNIFTNTYESNLYWTYNYYTWAVLAYLWY HLA-B*78:05,YYATYREISTNTYESNLYWTYNYYTWAELAYLWH HLA-B*78:06,YYATYREISTNTYENNLYWTYNYYTWAELAYLWH HLA-B*78:07,YYATYRNIFTNTDESNLYWTYNYYTWAELAYTWH HLA-B*81:01,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY HLA-B*81:02,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY HLA-B*81:03,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY HLA-B*81:05,YYSEYRNIFAQTDESNLYLSYNYYSLAVLAYEWY HLA-B*82:01,YYSEYRNIYAQTDESNLYLRFNLYTWAVDAYLSY HLA-B*82:02,YYSEYRNIYAQTDESNLYLRFNLYTWAVDAYLSY HLA-B*82:03,YYSEYRNIYAQTDESNLYLRYNLYTWAVDAYLSY HLA-B*83:01,YYSEYRNIYAQTDESNLYIRYDDYTWAVDAYLSY HLA-C*01:02,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:03,YFSGYREKYRQTDVSNLYLWCNFYTWAERAYTWY HLA-C*01:04,YFSGYREKYRQTDVSNLYLWCDSYTWAEWAYTWY HLA-C*01:05,YFSGYREKYRQTDVSNLYLRSDYYTWAERAYTWY HLA-C*01:06,YFSGYREKYRQTDVSNLYLWCDYYTWAVRAYTWY HLA-C*01:07,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:08,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:09,YFSGYREKYRQTDVSNLYLWCDYYTWAEWAYTWY HLA-C*01:10,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYEWY HLA-C*01:11,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:12,YFSGYREKYRQTDVSNLYLWYDYYTWAERAYTWY HLA-C*01:13,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:14,YFSGYREKYRQTDVNKLYLWCDYYTWAERAYTWY HLA-C*01:15,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:16,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:17,YFSGYREKYRQADVSNLYLWCDYYTWAERAYTWY HLA-C*01:18,YFSGYREKYHQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:19,YFSGYREKYRQTDVCNLYLWCDYYTWAERAYTWY HLA-C*01:20,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:21,YFSGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*01:22,YFSGYREKYRQTDVSNLYLWCDYYTWAELAYTWY HLA-C*01:23,YFSGYREKYRQADVSNLYLWCDYYTWAERAYTWY HLA-C*01:24,YFSGYREKYRQTDVSNLYLWCNFYTWAERAYTWY HLA-C*01:25,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:26,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:27,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:28,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:29,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTCY HLA-C*01:30,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWH HLA-C*01:31,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYMWY HLA-C*01:32,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:33,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:34,YFSGYREKYRQTDVSNLYLWYNFYTWAERAYTWY HLA-C*01:35,YFSGYREKYRQTDVSNLYLWCDYYTWAELAYLWY HLA-C*01:36,YFSGYREKYRQTDVSNLYLRFDYYTWAERAYTWY HLA-C*01:38,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:39,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:40,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*02:02,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:03,YYAGYREKYRQTDVNKLYLRYDSYTWAVLAYEWY HLA-C*02:04,CYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:05,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYEWY HLA-C*02:06,YYAGYREKYRQTDVNKLYLRYDLYTWAEWAYEWY HLA-C*02:07,YYAGYREKYRQTDVNKLYLRYHDYTWAEWAYEWY HLA-C*02:08,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:09,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:10,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:11,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:12,YYAGYREKYRQADVSKLYLRYDSYTWAEWAYEWY HLA-C*02:13,YYAGYREKYRQTDVNKLYLRYDSYTWAAWAYEWY HLA-C*02:14,YDAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:15,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:16,YYAGYREKYRQTDVNKLYLRYDSYTWAELAYEWY HLA-C*02:17,YYAGYREKYRQTDVNKLYLWFDSYTWAEWAYEWY HLA-C*02:18,YYAGYREKYRQTDVNKLYLRYDSYTWAALAYEWY HLA-C*02:19,YYAGYREKYRQTDVNKLYLRYDYYTWAEWAYEWY HLA-C*02:20,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:21,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:22,YYAGYREKYRQTDVNKLYLRYNFYTWAEWAYEWY HLA-C*02:23,YYAGYREKYRQTDVNKLYLRYDYYTWAEWAYEWY HLA-C*02:24,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:26,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:27,YYAGYREKYRQTDVSNLYLRYDSYTWAEWAYEWY HLA-C*02:28,YYAGYREKYRQTDVNKLYLRYDSYTWAVWAYEWY HLA-C*02:29,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:30,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:31,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:32,YYAGYREKYRQTDVNKLYLRYDSYTWAERAYEWY HLA-C*02:33,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:34,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:35,YYAGYREKYRQTDVNKLHLRYDSYTWAEWAYEWY HLA-C*02:36,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:37,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:39,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:40,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*03:01,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C*03:02,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C*03:03,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:04,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:05,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYLWY HLA-C*03:06,YYAGYREKYRQTDVSNLYIRYVYYTWAELAYLWY HLA-C*03:07,YYAGYREKYRQTDVNKLYIRYDYYTWAELAYLWY HLA-C*03:08,YYAGYRENYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:09,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:10,YYAGYREKYRQTDVSKLYIRYDYYTWAELAYLWY HLA-C*03:11,YYSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:12,YYAGYREKYRQTDVSNLYIRYDLYTWAELAYLWY HLA-C*03:13,YYAGYREKYRQTDVSNLYLRYDYYTWAELAYLWY HLA-C*03:14,YYAGYREKYRQTDVSNLYIRYDSYTLAALAYTWY HLA-C*03:15,YYAGYREKYRQADVNKLYLRYDSYTWAELAYLWY HLA-C*03:16,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYTWY HLA-C*03:17,YYAGYREKYRQTDVSNLYLWYDYYTWAELAYLWY HLA-C*03:18,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:19,YYAGYREKYRQTDVSNLYIRYDLYTWAELAYLWY HLA-C*03:21,YYAGYREKYRQTDVSNLYIRYDYYTWAEWAYTWY HLA-C*03:23,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:24,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:25,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYLWY HLA-C*03:26,YYAGYREKYRQTDVSNLYIRYDFYTWAELAYLWY HLA-C*03:27,YYAGYREKYRQADVSNLYLSYDYYTWAELAYLWY HLA-C*03:28,YYAGYREKYRQTDVSNLYIRYDYYTWAERAYLWY HLA-C*03:29,YYAGYRENYRQTDVSKLYIRYDYYTWAELAYLWY HLA-C*03:30,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:31,YYAGYRENYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:32,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:33,YYAGYREKYRQTDVSNLCLRYDSYTWAELAYLWY HLA-C*03:34,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYEWY HLA-C*03:35,YYAGYREKYRQTDVSNLYLRYDYYTWAELAYLWY HLA-C*03:36,YYAGYREKYRQTDVSNLYLRYDSYTWAVLAYLWY HLA-C*03:37,YYSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:38,YYAGYREKYRQADVSNLYIRYDYYTWAELAYLWY HLA-C*03:39,YDSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:40,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY HLA-C*03:41,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:42,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY HLA-C*03:43,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY HLA-C*03:44,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:45,YYAGYREKYRQTDVNKLYIRYDYYTWAELAYLWY HLA-C*03:46,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:47,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:48,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:49,YYAGYREKYRQTDVSNLYIRYDYYTWAERAYLWY HLA-C*03:50,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:51,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWH HLA-C*03:52,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:53,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:54,YYAGYREKYRQTDVSNLYIRYDYYTWAELPYLWY HLA-C*03:55,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYTWY HLA-C*03:56,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:57,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:58,YYAGYREKYRQTDVSNLYLWCNFYTWAERAYTWY HLA-C*03:59,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:60,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C*03:61,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:62,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:63,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:64,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:65,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:66,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:67,YDAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:68,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:69,YYAGYREKYRQADVSNLYIRYDYYTWAELAYLWY HLA-C*03:70,YYAGYREKYRQTDESNLYIRYDYYTWAELAYLWY HLA-C*03:71,YYAGYREKYRQTDVSNLYLWYDSYTWAELAYLWY HLA-C*03:72,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:73,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:74,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:75,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:76,HYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:77,YYAGYREKYRQTDVSNLYIRYDYYTWAVLAYLWY HLA-C*03:78,YYAGYREKYRQTDVSNLYIRYDYYTWAEMAYLWY HLA-C*03:79,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:80,YYAGYREKYRQTDVSNLYIRYDYYTWAEWAYTWY HLA-C*03:81,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:82,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:83,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:84,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C*03:85,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:86,YYAGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*03:87,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:88,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:89,YYAGYREKYRQTDVSNLYLRFDSYTWAELAYLWY HLA-C*03:90,YYAGYREKYRQTDVSNLYIRSDYYTWAELAYLWY HLA-C*03:91,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:92,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYTWY HLA-C*03:93,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:94,YYAGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*04:01,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:03,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:04,YSAGYREKYRQADVNKLYLRFNFYTWAELAYTWY HLA-C*04:05,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:06,YYAGYREKYRQADVNKLYLRFNFYTWAELAYTWY HLA-C*04:07,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:08,YSAGYREKYRQADVNKLYLRFNFYTWAERAYLWY HLA-C*04:10,YSAGYREKYRQTDVNKLYLRFNFYTWAERAYTWY HLA-C*04:11,YSAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C*04:12,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:13,YSAGYREKYRQADVNKLYLRFNFYTWAALAYTWY HLA-C*04:14,YSAGYREKYRQADVNKLYLRFNFYTWAEQAYTWY HLA-C*04:15,YSAGYREKYRQADVNKLYLRYNFYTWAERAYTWY HLA-C*04:16,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:17,YSAGYREKYRQADVNKLYLRYNFYTWAERAYTWY HLA-C*04:18,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:19,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:20,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:23,YSAGYREKYRQADVNKLYLRFDFYTWAERAYTWY HLA-C*04:24,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:25,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:26,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:27,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:28,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:29,YSAGYREKYRQADVSNLYLRFNFYTWAERAYTWY HLA-C*04:30,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:31,YSAGYREKYRQADVNKLYLRFNFYTWVERAYTWY HLA-C*04:32,YSAGYREKYRQADVNKLYLRFNFYTWAERAYEWY HLA-C*04:33,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:34,YSAGYREKYRQADVNKLYLRFNFYTWAVLAYLWY HLA-C*04:35,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:36,YSAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C*04:37,YSAGYREKYRQADVNKLYLWCNFYTWAERAYTWY HLA-C*04:38,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:39,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:40,YSAGYREKYRQADVNKLYFRFNFYTWAERAYTWY HLA-C*04:41,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:42,YDAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:43,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:44,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:45,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:46,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:47,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:48,YSAGYREKYRQADVNKLYLRFNFYTWAERPYTWY HLA-C*04:49,YSAGYWEKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:50,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:51,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:52,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:53,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:54,YSAGYREKYRQADVNKLYLRFDSYTWAERAYTWY HLA-C*04:55,YSAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C*04:56,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:57,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:58,YSAGYREKYRQADVNKLYLRFNFYTLAALAYTWY HLA-C*04:60,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:61,YSAGYREKYRQADVNKLYLRFNFYTWAARAYTWY HLA-C*04:62,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:63,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:64,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:65,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:66,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:67,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:68,YSAGYREKYRQADVNKLYLRFNFYTWAAQAYTWY HLA-C*04:69,YSAGYGEKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:70,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*05:01,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:03,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:04,YYAGYREKYRQTDVNKLYLRYDSYTWAERAYTWY HLA-C*05:05,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:06,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:08,YYAGYREKYRQTDVNKLYLRYNFYTWAEWAYTWY HLA-C*05:09,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:10,YYAGYREKYRQTDVNKLYIRYNFYTWAERAYTWY HLA-C*05:11,YYAGYREKYRQTDVNKLYLRYNFYTWAELAYTWY HLA-C*05:12,YYAGYREKYRQTDVNKLYLRYNFYTWAVRAYTWY HLA-C*05:13,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:14,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:15,YYAGYWEKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:16,YYAGYREKYRQTDVNKLYLWYNFYTWAERAYTWY HLA-C*05:17,YYAGYREKYRQTDVNKLYLRYNFYTWAALAYTWY HLA-C*05:18,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:19,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:20,YYAGYREKYRQTDVNNLYLRYNFYTWAERAYTWY HLA-C*05:21,YYAGYREKYRQTDVNKLHLRYNFYTWAERAYTWY HLA-C*05:22,YYAGYREKYRQTDVNKLYLRYDFYTWAERAYTWY HLA-C*05:23,YYAGYREKYRQTDVNKLYLRYNFYTLAERAYTWY HLA-C*05:24,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:25,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:26,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:27,YYAGYREKYRQTDVNKLYLRYNFYTWAELAYLWY HLA-C*05:28,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:29,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:30,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:31,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:32,YYAGYREKYRQTDVNRLYLRYNFYTWAERAYTWY HLA-C*05:33,YYAGCREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:34,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:35,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:36,YYAGYRENYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:37,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:38,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:39,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYLWY HLA-C*05:40,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:41,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:42,YYAGYREKYRQADVNKLYLRYNFYTWAERAYTWY HLA-C*05:43,YDAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:44,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:45,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*06:02,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:03,YYSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:04,YDSGYREKYRQADVNKLYLWYDSYTWAELAYTWY HLA-C*06:05,YDSGYREKYRQTDVNKLYLWYDSYTWAERAYTWY HLA-C*06:06,YDSGYREKYRQADVNKLYLWYDSYTWAERAYTWY HLA-C*06:07,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:08,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYEWY HLA-C*06:09,YDSGYREKYRQADVNKLYLWYNFYTWAEWAYTWY HLA-C*06:10,YDPGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:11,YDSGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*06:12,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:13,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:14,YDSGYREKYRQADVNKLYIWYDSYTWAEWAYTWY HLA-C*06:15,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:17,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:18,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:19,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:20,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:21,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:22,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:23,YDSGYREKYRQADVNKLYLWCDSYTWAEWAYTWY HLA-C*06:24,YDSGYREKYRQADVNKLYLWYDSYTWAEWAHTWY HLA-C*06:25,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:26,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:27,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:28,YDAGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:29,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:30,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:31,YDSGYREKYRQADVNKLYLWYDSYTWAAWAYTWY HLA-C*06:32,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:33,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:34,YDSGYREKYRQADVNKLYLWYDFYTWAEWAYTWY HLA-C*06:35,YDSGYREKYRQADVNKLYIRSDSYTWAEWAYTWY HLA-C*06:36,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:37,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:38,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:39,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:40,YDSGYREKYRQADVNKLYLWYDSYTWAEWTYTWY HLA-C*06:41,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:42,YDSGYREKYRQADVNKLYLWYDSYTRAEWAYTWY HLA-C*06:43,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:44,YDSGYRENYRQTDVNKLYLWYDSYTWAEWAYTWY HLA-C*06:45,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*07:01,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:02,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:03,YDSGYREKYRQADVSNLYLRSDSYTWAALAYLWY HLA-C*07:04,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:05,YDSGYREKYRQADVSNLYLNYDSYTLAALAYTWY HLA-C*07:06,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:07,YDSGYRENYRQADVNKLYLRYDSYTLAALAYTWY HLA-C*07:08,YDSGYREKYRQADVSNLYLRFDSYTLAALAYTWY HLA-C*07:09,YDSGYRENYRQADVNKLYLRYDSYTLAALAYTWY HLA-C*07:10,YDSGYREKYRQADVSNLYIRSDSYTLAALAYTWY HLA-C*07:11,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:12,YDSGYREKYRQADVSNLYFRYDFYTWAADAYTWY HLA-C*07:13,YDSGYREKYRQADVSNLYLRSDFYTLAALAYTWY HLA-C*07:14,YDSGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:15,YDSGYREKYRQADVSNLYLRSDSYTLAALAYEWY HLA-C*07:16,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:17,YDSGYREKYRQADVSNLYLRSDSYTWAALAYTWY HLA-C*07:18,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:19,YDSGYRENYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:20,YDAGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:21,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:22,YDSGYRENYRQADVSNLYLRYDSYTLAAWAYTWY HLA-C*07:23,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:24,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:25,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:26,YYSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:27,YDSGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:28,YDSGYRENYRQADVSNLYLRYNFYTLAALAYTWY HLA-C*07:29,YDSGYREKYRQADVSNLYLRSDYYTLAALAYTWY HLA-C*07:30,YDSGYRENYRQADVSNLYLRYDSYTLAGLAYTWY HLA-C*07:31,YDSGYREKYRQADVSNLYLWYDSYTLAALAYTWY HLA-C*07:35,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:36,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:37,YDSGYREKYRQADVSNLYLRSDSYTLAARAYTWY HLA-C*07:38,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:39,YDSGYREKYRQTDVSNLYLRSDSYTLAALAYTWY HLA-C*07:40,YDSGYRENYRQTDVSNLYLRYDSYTLAALAYTWY HLA-C*07:41,YDSGYREKYRQADVSNLYLRYNFYTWAERAYTWY HLA-C*07:42,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:43,YDSGYREKYRQADVSNLYIRYDSYTLAALAYTWY HLA-C*07:44,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:45,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:46,YDSEYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:47,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:48,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:49,YDSGYREKYRQADVNNLYLRSDSYTLAALAYTWY HLA-C*07:50,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:51,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:52,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:53,YDSGYRENYRQADVSNLYLRYDSYTLAAQAYTWY HLA-C*07:54,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:56,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:57,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:58,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:59,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:60,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:62,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:63,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:64,YSAGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:65,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:66,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:67,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:68,YDSGYREKYRQADVSNLYLRSDSYTLAADAYTWY HLA-C*07:69,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:70,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:71,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:72,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:73,YDAGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:74,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:75,YDSGYREKYRQADVSNLHLRSDSYTLAALAYTWY HLA-C*07:76,YDSGYREKYRQADVNKLYLRSDSYTLAALAYTWY HLA-C*07:77,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:78,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:79,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:80,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:81,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:82,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:83,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:84,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:85,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:86,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:87,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:88,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:89,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:90,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:91,YDSGYRENYRQADVSNLYLRYDSYTLTALAYTWY HLA-C*07:92,YYAGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:93,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:94,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:95,YDSGYRENYRQADVSNLYLRYDSYTLAVLAYTWY HLA-C*07:96,YYAGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:97,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:99,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:100,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:101,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:102,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:103,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:105,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:106,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:107,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:108,YDSGYRENYRQADVSNLYLRFDSYTLAALAYTWY HLA-C*07:109,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:110,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:111,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:112,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:113,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:114,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:115,YDSGYRENYRQADVSDLYLRYDSYTLAALAYTWY HLA-C*07:116,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:117,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:118,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:119,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:120,YDSGYRENYRQADVSNLYLRYDSYTLAALAYPWY HLA-C*07:122,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:123,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:124,YDSGYRENYRQADESNLYLRYDSYTLAALAYTWY HLA-C*07:125,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:126,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:127,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:128,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:129,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:130,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:131,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:132,DDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:133,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:134,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:135,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:136,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:137,YDSGYREKYRQADVSNLYLRSDSYTLAALTYTWY HLA-C*07:138,YDSGYREKYRQADVSNLYLRSDSYTLAAWAYTWY HLA-C*07:139,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:140,YDSGYRENYRQADVSNLYLRYDSYTWAVDAYTWY HLA-C*07:141,YDSGYRENYRQADVSNLYLRYDSYTWAALAYTWY HLA-C*07:142,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:143,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:144,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:145,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:146,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:147,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:148,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:149,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*08:01,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:02,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:03,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:04,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY HLA-C*08:05,YYAGYREKYRQADVSNLYLRYNFYTWAERAYTWY HLA-C*08:06,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYAWY HLA-C*08:07,YYAGYREKYRQTDVSNLYLRYNFYTLAERAYTWY HLA-C*08:08,YYAGYREKYRQTDVSNLYLSYNFYTWATLAYTWY HLA-C*08:09,YYAGYREKYRQTDVSNLYLRYDSYTWATLAYTWY HLA-C*08:10,YYAGYREKYRQTDVNKLYLRYNFYTWATLAYTWY HLA-C*08:11,YYAGYREKYRQTDVSNLYLRYDSYTWATLAYTWY HLA-C*08:12,YYAGYREKYRQTDVSNLYLWYNFYTWAERAYTWY HLA-C*08:13,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY HLA-C*08:14,YYSGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:15,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:16,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:17,YYAGYREKYCQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:18,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:19,YYAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C*08:20,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:21,YYAGYREKYRQADVSNLYLRYNFYTWATLAYTWY HLA-C*08:22,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:23,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:24,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:25,YYAGYREKYRQADVSNLYLRYNFYTWAERAYTWY HLA-C*08:27,YYAGYREKYRQTDVSNLYLRYNFYTWAEWAYTWY HLA-C*08:28,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:29,YYAGYREKYRQTDVSNLYLRYNFYTWAEWAYTWY HLA-C*08:30,YYAGYREKYRQTDVSNLYLRYNFYTWPERAYTWY HLA-C*08:31,YYAGYREKYRQTDVSNLYLRYNFYTWAEWAYEWY HLA-C*08:32,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:33,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:34,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:35,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*12:02,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:03,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:04,YYAGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*12:05,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYTWY HLA-C*12:06,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:07,YYAGYREKYRQADVGNLYLWYDSYTWAEWAYTWY HLA-C*12:08,YYAGYRENYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:09,YYAGYREKYRQTDVNKLYLWYDSYTWAERAYTWY HLA-C*12:10,YYAGYREKYRQADVSNLYLRFDSYTWAEWAYTWY HLA-C*12:11,YYAGYREKYRQADVSNLYLWSDSYTWAEWAYTWY HLA-C*12:12,YYAGYREKYRQADESNLYLWYDSYTWAEWAYTWY HLA-C*12:13,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:14,YYAGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*12:15,YYAGYREKYRQADVSNLYLWYDLYTWAEWAYTWY HLA-C*12:16,YDSGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:17,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:18,YYAGYREKYRQADVSNLYLRYDSYTWAELAYTWY HLA-C*12:19,YYAGYREKYRQADVSNLYLWYDSYTWAECAYTWY HLA-C*12:20,YYAGYREKYRQADVSNLYLWYDSYTWAELAYTWY HLA-C*12:21,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYTWY HLA-C*12:22,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:23,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:24,YYAGYREKYRQADVSNLYLWYDSYTWAERAYTWY HLA-C*12:25,YYAGYPEKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:26,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:27,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:28,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:29,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:30,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:31,YYAGYREKYRQADVSNLYLWYNFYTWAEWAYTWY HLA-C*12:32,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:33,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYTWY HLA-C*12:34,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:35,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:36,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:37,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:38,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:40,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:41,YYAGYREKYRQADVNKLYLRYDSYTWAEWAYTWY HLA-C*12:43,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:44,YYAGYREKYRQADVSNLYIRYDSYTWAEWAYTWY HLA-C*14:02,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:03,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:04,YSAGYREKYRQADVNNLYLWFDSYTWAERAYTWY HLA-C*14:05,YSAGYREKYRQTDVSNLYLWYDSYTWAERAYTWY HLA-C*14:06,YSAGYREKYRQTDVSNLYLWFDSYTWAELAYTWY HLA-C*14:08,YSAGYREKYRQTDVSNLYPWFDSYTWAERAYTWY HLA-C*14:09,YSAGYREKYRQTDVSNLYLRYDSYTWAERAYTWY HLA-C*14:10,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:11,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:12,YSAGYREKYRQTDVNKLYLWFDSYTWAERAYTWY HLA-C*14:13,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:14,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:15,YSAGYREKYRQTDVSNLYLWFDSYTWAALAYTWY HLA-C*14:16,YSAGYREKYRQTDVSNLYLWFDSYTWAEWAYTWY HLA-C*14:17,YSAGYREKYRQTDVSNLYLWFDSYTLAARAYTWY HLA-C*14:18,YSSGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:19,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:20,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYLWY HLA-C*15:02,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:03,YYAGYRENYRQADVNKLYIRYDLYTWAELAYTWY HLA-C*15:04,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:05,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C*15:06,YYAGYRENYRQTDVNKLYIRYDYYTWAELAYTWY HLA-C*15:07,YYAGYRENYRQTDVSNLYIRYDLYTWAELAYTWY HLA-C*15:08,YYAGYRENYRQTDVNKLYIRYDLYTWAERAYTWY HLA-C*15:09,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:10,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:11,YYAGYREKYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:12,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:13,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:15,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYLWY HLA-C*15:16,YYAGYREKYRQADVNKLYIRYDLYTWAELAYTWY HLA-C*15:17,YYAGYREKYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:18,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:19,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:20,YYAGYREKYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:21,YYAGYRENYRQTDVSKLYIRYDLYTWAELAYTWY HLA-C*15:22,YYAGYRENYRQTDVNKLYLRYDFYTWAELAYTWY HLA-C*15:23,YDAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C*15:24,YYAGYRENYRQTDVNKLYIRYNYYTWAELAYTWY HLA-C*15:25,YYAGYREKYRQADVSNLYIRYNFYTWAEDAYTSY HLA-C*15:26,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:27,YYAGYRNKYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:28,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:29,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C*15:30,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:31,YYAGYRENYRQTDVNKLYIRYDLYTWAALAYTWY HLA-C*15:33,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:34,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:35,YYAGYRENYRQTDVNKLHIRYDLYTWAELAYTWY HLA-C*16:01,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:02,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C*16:04,YYAGYREKYRQTDVSNLYLWYDSYTWAAWAYTWY HLA-C*16:06,YYAGYREKYRQTDVSNLYLRSDSYTWAAQAYTWY HLA-C*16:07,YYAGYREKYRQTDVSNLYLRYDSYTWAAQAYTWY HLA-C*16:08,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:09,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C*16:10,YYAGYREKYRQTDVSNLYLWYDDYTWAAQAYTWY HLA-C*16:11,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:12,YYAGYGEKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C*16:13,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:14,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:15,YYAGYREKYRQADVSNLYLWYDSYTWAAQAYTWY HLA-C*16:17,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:18,YYAGYREKYRQTDVSNLYLWCDSYTWAAQAYTWY HLA-C*16:19,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C*16:20,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:21,YDAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:22,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:23,YYAGYREKYRQTDVSNLYLWFDSYTWAAQAYTWY HLA-C*16:24,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:25,YYAGYREKYRQADVNKLYLWYDSYTWAAQAYTWY HLA-C*16:26,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*17:01,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:02,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:03,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:04,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:05,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:06,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:07,YYAGYREKYRQADVNKLYIRYNFYSLAELAYLWY HLA-C*18:01,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*18:02,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*18:03,YDSGYREKYRQADVNKLYLRFNFYTWAEWAYEWY mhcflurry-2.3.6/downloads-generation/models_class1_unselected_with_mass_spec/000077500000000000000000000000001525677230600277315ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_unselected_with_mass_spec/GENERATE.sh000077500000000000000000000041031525677230600314600ustar00rootroot00000000000000#!/bin/bash # # Train standard MHCflurry Class I models. # Calls mhcflurry-class1-train-allele-specific-models on curated training data # using the hyperparameters in "hyperparameters.yaml". # set -e set -x DOWNLOAD_NAME=models_class1_unselected_with_mass_spec SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") pseudosequence_lookup() { python -c 'from mhcflurry.pseudosequences import main; main()' "$@" } mkdir -p "$SCRATCH_DIR" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" # Send stdout and stderr to a logfile included with the archive. exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) # Log some environment info date pip freeze git status cd $SCRATCH_DIR/$DOWNLOAD_NAME mkdir models PSEUDOSEQUENCES="$(pseudosequence_lookup filename --length 34)" LEGACY_CLASS1_PSEUDOSEQUENCES="$(pseudosequence_lookup legacy class1_pseudosequences)" cp "$SCRIPT_DIR/$PSEUDOSEQUENCES" . # Compatibility alias for older generated artifacts and external scripts. cp "$SCRIPT_DIR/$PSEUDOSEQUENCES" "$LEGACY_CLASS1_PSEUDOSEQUENCES" python $SCRIPT_DIR/generate_hyperparameters.py > hyperparameters.yaml GPUS=$(nvidia-smi -L 2> /dev/null | wc -l) || GPUS=0 echo "Detected GPUS: $GPUS" PROCESSORS=$(getconf _NPROCESSORS_ONLN) echo "Detected processors: $PROCESSORS" time mhcflurry-class1-train-allele-specific-models \ --data "$(mhcflurry-downloads path data_curated)/curated_training_data.with_mass_spec.csv.bz2" \ --allele-sequences "$PSEUDOSEQUENCES" \ --hyperparameters hyperparameters.yaml \ --out-models-dir models \ --held-out-fraction-reciprocal 10 \ --min-measurements-per-allele 25 \ --num-jobs $(expr $PROCESSORS \* 2) --gpus $GPUS --max-workers-per-gpu 2 --max-tasks-per-worker 50 cp $SCRIPT_ABSOLUTE_PATH . bzip2 LOG.txt tar -cjf "../${DOWNLOAD_NAME}.tar.bz2" * echo "Created archive: $SCRATCH_DIR/$DOWNLOAD_NAME.tar.bz2" mhcflurry-2.3.6/downloads-generation/models_class1_unselected_with_mass_spec/README.md000066400000000000000000000002401525677230600312040ustar00rootroot00000000000000# Class I allele-specific models (ensemble) This download contains trained MHC Class I MHCflurry models. To generate this download run: ``` ./GENERATE.sh ```generate_hyperparameters.py000066400000000000000000000070431525677230600353150ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_unselected_with_mass_spec# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Generate grid of hyperparameters """ from sys import stdout from copy import deepcopy from yaml import dump base_hyperparameters = { ########################################## # ENSEMBLE SIZE ########################################## "n_models": 4, ########################################## # OPTIMIZATION ########################################## "max_epochs": 500, "patience": 20, "early_stopping": True, "validation_split": 0.1, "minibatch_size": None, "loss": "custom:mse_with_inequalities", ########################################## # RANDOM NEGATIVE PEPTIDES ########################################## "random_negative_rate": 0.1, "random_negative_constant": 25, "random_negative_affinity_min": 20000.0, "random_negative_affinity_max": 50000.0, ########################################## # PEPTIDE REPRESENTATION ########################################## # One of "one-hot", "embedding", or "BLOSUM62". "peptide_amino_acid_encoding": "BLOSUM62", "use_embedding": False, # maintained for backward compatability "embedding_output_dim": 8, # only used if using embedding "kmer_size": 15, ########################################## # NEURAL NETWORK ARCHITECTURE ########################################## "locally_connected_layers": [ { "filters": 8, "activation": "tanh", "kernel_size": 3 } ], "activation": "tanh", "output_activation": "sigmoid", "layer_sizes": [16], "dense_layer_l1_regularization": None, "batch_normalization": False, "dropout_probability": 0.0, ########################################## # TRAINING Data ########################################## "train_data": {"subset": "all", "pretrain_min_points": 1000}, } grid = [] for train_subset in ["all", "quantitative"]: for minibatch_size in [128]: for dense_layer_size in [8, 16, 32, 64]: for l1 in [0.0, 0.001]: for num_lc in [0, 1, 2]: for lc_kernel_size in [3, 5]: new = deepcopy(base_hyperparameters) new["minibatch_size"] = minibatch_size new["train_data"]["subset"] = train_subset new["layer_sizes"] = [dense_layer_size] new["dense_layer_l1_regularization"] = l1 (lc_layer,) = new["locally_connected_layers"] lc_layer['kernel_size'] = lc_kernel_size if num_lc == 0: new["locally_connected_layers"] = [] elif num_lc == 1: new["locally_connected_layers"] = [lc_layer] elif num_lc == 2: new["locally_connected_layers"] = [lc_layer, deepcopy(lc_layer)] if not grid or new not in grid: grid.append(new) dump(grid, stdout) pseudosequences.netmhcpan.34aa.csv000066400000000000000000004144141525677230600363150ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/models_class1_unselected_with_mass_specallele,pseudosequence HLA-A*01:01,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:02,YSAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:03,YFAMYQENMAHTDANTLYIMYRDYTWVARVYRGY HLA-A*01:06,YFAMYQENMAHTDANTLYIIYRDYTWVALAYRGY HLA-A*01:07,YFAMYQENVAHTDENTLYIIYRDYTWVARVYRGY HLA-A*01:08,YFAMYQENMAHTDANTLYIIYRDYTWVARVYWGY HLA-A*01:09,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:10,YFAMYQENMAHTDANTLYIIYRDYTWARRVYRGY HLA-A*01:12,YFAMYQENMAHTDANTLYIIYRDYTWAVQAYTGY HLA-A*01:13,YFAMYQENMAQTDVDTLYIIYRDYTWVARVYRGY HLA-A*01:14,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTGY HLA-A*01:17,YFAMYQENMAQTDANTLYIIYRDYTWVARVYRGY HLA-A*01:19,YFAMYQENMAHTDANTLYIIYRDYTWAVQAYTGY HLA-A*01:20,YSAMYQENMAHTDANTLYVRYRDYTWVARVYRGY HLA-A*01:21,YFAMYQENMAHTDANTLYIIYRDYTWAVRVYRGY HLA-A*01:23,YFAMYQENVAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:24,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:25,YFAMYQENMAHTDANTLYIIYRDYTWVAQVYRGY HLA-A*01:26,YFAMYQENMAHTDANTLYIIYRDYTWAARVYRGY HLA-A*01:28,YFAMYQENMAHTDVDTLYIIYRDYTWVARVYRGY HLA-A*01:29,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:30,YFAMYQENMAHTDANTLYIIYHYYTWVARVYRGY HLA-A*01:32,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:33,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:35,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:36,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:37,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:38,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:39,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:40,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:41,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:42,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:43,YYAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:44,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:45,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:46,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:47,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:48,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:49,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:50,YFAMYQENMAHTDANTLYIIYREYTWVARVYRGY HLA-A*01:51,YFAMYRNNVAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:54,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:55,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:58,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:59,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:60,YFAMYPENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:61,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:62,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:63,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:64,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY HLA-A*01:65,YFAMYQENMAHTDANTLYIIYRDYTWVARVCRGY HLA-A*01:66,YFAMYQENMAHTDANTLYVRYRDYTWVARVYRGY HLA-A*02:01,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:02,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:03,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A*02:04,YFAMYGEKVAHTHVDTLYVMYHYYTWAVLAYTWY HLA-A*02:05,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:06,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:07,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:08,YYAMYGENVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:09,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:10,YYAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A*02:11,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:12,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY HLA-A*02:13,YFAMYGEKVAHTHVDTLYVRYHYYTWAEQAYTWY HLA-A*02:14,YYAMYGEKVAHTHVDTLYLRYHYYTWAVLAYTWY HLA-A*02:16,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYEWY HLA-A*02:17,YFAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A*02:18,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:19,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY HLA-A*02:20,YFAMYGENVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:21,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:22,YFAMYGEKVAHTHVDTLYVRYHYYTWAVWAYTWY HLA-A*02:24,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:25,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:26,YFAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A*02:27,YFAMYGEKVAHTHVDTLYVRYHYYTWAAQAYTWY HLA-A*02:28,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:29,YFAMYGEQVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:30,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:31,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:33,YFAMYGEKVAHTHVDTLYVRSHYYTWAVLAYTWY HLA-A*02:34,YFAMYGEKVAQTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:35,YFAMYGEKVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:36,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTGY HLA-A*02:37,YFAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY HLA-A*02:38,YFAMYGEKVAHTHVDTLYVRYHYYTWAEQAYRWY HLA-A*02:39,YFAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A*02:40,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:41,YYAMYGEKVAHTHVDTLYVRYQYYTWAVLAYTWY HLA-A*02:42,YFSMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:44,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY HLA-A*02:45,YFAMYQEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:46,YFAMYEEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:47,YFAMYGEKVAHSHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:48,YFAMYEEKVAHTDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:49,YFAMYGEKVAHTHVDTLYVRYHYYTWAVRAYTWY HLA-A*02:50,YFAMYGEKVAHTHVDTLYIRYHYYTWAVWAYTWY HLA-A*02:51,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:52,YFAMYGEKVAHTHVDTLYVRYEHYTWAVLAYTWY HLA-A*02:54,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTGY HLA-A*02:55,YFAMYRNNVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:56,YFAMYQENVAQTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:57,YYAMYGEKVAHTHVDTLYLMYHYYTWAVLAYTWY HLA-A*02:58,YFAMYGEKVAHTHVDTLYLRYHYYTWAVLAYTWY HLA-A*02:59,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:60,YFAMYGEKVAHTHVDTLYVRYHFYTWAVLAYTWY HLA-A*02:61,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:62,YFAMYGENVAQTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:63,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:64,YFAMYGEKVAHTHVDTLYVRYHSYTWAVLAYTWY HLA-A*02:65,YFAMYGEKVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A*02:66,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:67,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:68,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:69,YFAMYGEKVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:70,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:71,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:72,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:73,YFAMYGEKVAHTHVDTLYIRYHYYTWAVLAYTWY HLA-A*02:74,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:75,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:76,YSAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:77,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:78,YYAMYQENVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:79,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:80,YFAMYGEKVAHTHVDTLYVRYQDYTWAVLAYTWY HLA-A*02:81,YFAMYGEKVAHTDESIAYVRYHYYTWAVLAYTWY HLA-A*02:84,YYAMYGEKVAHTHVDTLYFRYHYYTWAVLAYTWY HLA-A*02:85,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:86,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:87,YFAMYGEKVAHTDENIAYVRYHYYTWAVLAYTWY HLA-A*02:89,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:90,YFAMYGEKVAHTDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:91,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:92,YFAMYEEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:93,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:95,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:96,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:97,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:99,YYAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A*02:101,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYRWY HLA-A*02:102,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:103,YFAMYQENVAQTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:104,YFAMYGEKVAHTHVDTLYVRYHYYTWAVWAYTWY HLA-A*02:105,YFAMYGEKVAHTHVDTLYVRYEYYTWAVLAYTWY HLA-A*02:106,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:107,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:108,YYAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A*02:109,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:110,YFAMYGEKVAHTHVDTLYLMFHYYTWAVLAYTWY HLA-A*02:111,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:112,YFAMYGEKVAHTDENIAYVRCHYYTWAVLAYTWY HLA-A*02:114,YFAMYGEKVAHTHVDTLYVRYRDYTWAVLAYTWY HLA-A*02:115,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:116,YFAMYGEKVAHTHLDTLYVRYHYYTWAVLAYTWY HLA-A*02:117,YFAMYGEKVAHTHVDTLYVRYQDYTWAEWAYTWY HLA-A*02:118,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:119,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:120,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:121,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:122,YYAMYGEKVAHTHVDTLYIRYHYYTWAVWAYTWY HLA-A*02:123,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:124,YFAMYGEKVAHTDESIAYVRYHYYTWAVLAYTWY HLA-A*02:126,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:127,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYKWY HLA-A*02:128,YFAMYGENVAHIDVDTLYVRYHYYTWAVLAYTWY HLA-A*02:129,YYAMYEEKVAHTDENIAYVRYHYYTWAVLAYTWY HLA-A*02:130,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:131,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYEWY HLA-A*02:132,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:133,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:134,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:135,YFAMYGEKVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A*02:136,YFAMYGEKVAHTDENIAYVRYHYYTWAVWAYTWY HLA-A*02:137,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:138,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:139,YFAMYGEKVTHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:140,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:141,YFVMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:142,YYAMYGEKVAHTHVDTLYVRYHYYTWAVQAYTWY HLA-A*02:143,YYAMYREKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:144,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:145,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:146,YFAMYGEKVAHTDANTLYVRYHYYTWAVLAYTWY HLA-A*02:147,YFAMYGEKVAHTHVDTLYVRYDYYTWAVLAYTWY HLA-A*02:148,YFAMYGEKVAHTHVDTLYVRFHYYTWAEWAYTWY HLA-A*02:149,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:150,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:151,YFAMYGEKVAHTHVDTLYVRYDYYTWAVLAYTWY HLA-A*02:152,YFAMYGEKVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A*02:153,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:154,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYRWY HLA-A*02:155,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:156,YFAMYGEKVAHTHVDTLYIIYHYYTWAVLAYTWY HLA-A*02:157,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:158,YFAMYGEKVAHAHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:159,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:160,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:161,YFAVYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:162,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:163,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:164,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:165,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:166,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:167,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYKWY HLA-A*02:168,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:169,YYAMYQENVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:170,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:171,YFAMYGEKVAHTHVDTLYVRYHYYTWAELAYTWY HLA-A*02:172,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:173,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:174,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:175,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:176,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:177,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:178,YYAMYGEKVAHTHVDTLYVRYHSYTWAVLAYTWY HLA-A*02:179,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:180,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:181,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:182,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:183,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:184,YFAMYGEKVAHTHEDTLYVRYHYYTWAVLAYTWY HLA-A*02:185,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:186,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:187,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:188,YFAMYGEKVAHTHVDTLYVRYDSYTWAVLAYTWY HLA-A*02:189,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:190,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:191,YFAMYGEKVAHTHVDTLYVRCHYYTWAVWAYTWY HLA-A*02:192,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:193,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:194,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:195,YFAMYQENVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:196,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:197,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:198,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:199,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:200,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:201,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:202,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:203,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:204,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:205,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:206,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:207,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:208,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:209,YFAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:210,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:211,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:212,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:213,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:214,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:215,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:216,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:217,YFAMYREKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:218,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:219,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:220,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:221,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:224,YFAMYGEKVAHTHVDTLYVGYHYYTWAVLAYTWY HLA-A*02:228,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:229,YYAMYGEKVAHTHVDTLYLRYRYYTWAVWAYTWY HLA-A*02:230,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A*02:231,YFAMYGEKVAHTHVDTLYVRNHYYTWAVLAYTWY HLA-A*02:232,YYAMYGEKVAHTHVDTLYLRYHYYTWAVWAYTWY HLA-A*02:233,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTRY HLA-A*02:234,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:235,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:236,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:237,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:238,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:239,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:240,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:241,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:242,YFAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A*02:243,YTAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:244,YYAMYGEKVAHTHVDTLYVRFHYYTWAVLAYTWY HLA-A*02:245,YFAMYGEKVAHTHVDTLYIRYHYYTWAVLAYTWY HLA-A*02:246,YFAMYGEKVAHTHVDTLYVRYRDYTWAVLAYTWY HLA-A*02:247,YFAMYGEKVAHTDENTLYVRYHYYTWAVLAYTWY HLA-A*02:248,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:249,YFAMYVEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:251,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:252,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:253,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A*02:254,YFAMYGEKVAHTHVDTLYVRYNFYTWAVLAYTWY HLA-A*02:255,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTGY HLA-A*02:256,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:257,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:258,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A*02:259,YYAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:260,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*02:261,YFAMYGEKVAHTHMDTLYVRCHYYTWAVLAYTWY HLA-A*02:262,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLVYTWY HLA-A*02:263,YFAMYGEKVAHTHVDTLYVRYHYYTWSVLAYTWY HLA-A*02:264,YFAMYGEKVAHTHVDTLYVRYHYYTWAEWAYTWY HLA-A*02:265,YFAMYGEKVAHTHVDTLYVRCHYYTWAVLAYTWY HLA-A*02:266,YFAMYGEKVAHTHVDTLYVRYHYYTWAVLAYTWY HLA-A*03:01,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:02,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A*03:04,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:05,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:06,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:07,YFAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY HLA-A*03:08,YFAMYQENVAHTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:09,YFAMYQENVAQTHVDTLYIIYRDYTWAELAYTWY HLA-A*03:10,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A*03:12,YYAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:13,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:14,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:15,YFAMYQENVAQTDVDTLYIIFRDYTWAELAYTWY HLA-A*03:16,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:17,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:18,YFAMYQENVAQTDVDTLYIIYRDYTWVARVYRGY HLA-A*03:19,YFAMYQENVAQTDVDTLYIIFHYYTWAELAYTWY HLA-A*03:20,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:22,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:23,YFAMYGEKVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:24,YFAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:25,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:26,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:27,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:28,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:29,YFAMYQENVVQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:30,YFAMYEEKVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:31,YFAMYQENVAQTDVDTLYIIYRYYTWAVQAYTWY HLA-A*03:32,YFAMYQENVAHIDVDTLYIIYRDYTWAVQAYTWY HLA-A*03:33,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:34,YFAMYQENVAPTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:35,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:37,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:38,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:39,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:40,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:41,YFAMYQENVAHTDANTLYIIYRDYTWAELAYTWY HLA-A*03:42,YFAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY HLA-A*03:43,YFAMYQENVAQTDVDTLYIIYEHYTWAELAYTWY HLA-A*03:44,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:45,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:46,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:47,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:48,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:49,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:50,YFAMYQENVAQTDVDTLYIIYRDYTWAEWAYTWY HLA-A*03:51,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:52,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:53,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:54,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:55,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:56,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:57,YFAMYQENVAQTDANTLYIIYRDYTWAELAYTWY HLA-A*03:58,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:59,CFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:60,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:61,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:62,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:63,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:64,YFAMYQENVAQTDVDTLYIIYRDYTWADLAYTWY HLA-A*03:65,YFAMYQENVAQTDVDTLYIIYRDYTWAEQAYTWY HLA-A*03:66,YFAMYQENVAQTDVDTLYIIYRDYTWAERAYTWY HLA-A*03:67,YFATYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:70,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:71,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:72,YSAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:73,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A*03:74,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:75,YFAMYQENVAQTDVDTLYLMYRDYTWAELAYTWY HLA-A*03:76,YFAMYQENVAQTDVDTLYIIYRDYTWAVQAYTWY HLA-A*03:77,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:78,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:79,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:80,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:81,YFAMYQENVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*03:82,YFAMYQENVAQTDVDTLYIIYEHYTWAVQAYTWY HLA-A*11:01,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:02,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:03,YYAMYQENVAQTDVDTLYIIYRDYTWAEQAYRWY HLA-A*11:04,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYTWY HLA-A*11:05,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:06,YYAMYQENVAQTHVDTLYIIYRDYTWAAQAYRWY HLA-A*11:07,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:08,YYAMYQENVAQTDVDTLYIIYRDYTWAERAYRWY HLA-A*11:09,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:10,YYAMYRNNVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:11,YYAMYLQNVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:12,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:13,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:14,YYAMYQENVAQTDVDTLYIIYRDYTWARQAYRWY HLA-A*11:15,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:16,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:17,YYAMYQENMAHTDANTLYIIYRDYTWAAQAYRWY HLA-A*11:18,YYAMYQENVAHTHVDTLYIIYRDYTWAAQAYRWY HLA-A*11:19,YYAMYQENVAHTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:20,YYAMYQENVAQTDVDTLYIIYRDYTWAEQAYRWY HLA-A*11:22,YYAMYQENVAQTDVDTLYIIYPDYTWAAQAYRWY HLA-A*11:23,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:24,YYAMYQENVAQTDVDTLYIIYRDYTWAALAYRWY HLA-A*11:25,YYAMYQENVAQTDVDTLYIIYRDYTWAELAYRWY HLA-A*11:26,YYAMYQENVAQTDVDTLYIMYRDYTWAAQAYRWY HLA-A*11:27,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYTGY HLA-A*11:29,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:30,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:31,YYAMYQENVAQTDVDTLYIIYRDYTWAVLAYRWY HLA-A*11:32,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:33,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:34,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:35,YYAMYQENVAQTDVDTLYIIYRDYTWAVLAYTWY HLA-A*11:36,YYAMYQENVAQTDVDTLYIICRDYTWAAQAYRWY HLA-A*11:37,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:38,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRGY HLA-A*11:39,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRGY HLA-A*11:40,YYAMYQENVAHTDANTLYIIYRDYTWAAQAYRWY HLA-A*11:41,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:42,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:43,YTAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:44,YYAMYQENVAQTDVDTLYIIYRDYTWAARAYRWY HLA-A*11:45,YYAMYQENVAQTDADTLYIIYRDYTWAAQAYRWY HLA-A*11:46,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:47,YHAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:48,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:49,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:51,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:53,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:54,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:55,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:56,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:57,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:58,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:59,YYAMYQENVAQTDVDTLYIIYGDYTWAAQAYRWY HLA-A*11:60,YYAMYQENVAQTDVDTLYIIYRDYTWAVQAYRWY HLA-A*11:61,YYAMYQENAAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:62,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:63,YYAMYQENVAQTDVDTLYIIYRDYTWAAQAYRWY HLA-A*11:64,YYAMYQENVAQTDVDTLHIIYRDYTWAAQAYRWY HLA-A*23:01,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:02,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTGY HLA-A*23:03,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:04,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTWY HLA-A*23:05,CSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:06,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:09,YSAMYQENMAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:10,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYRGY HLA-A*23:12,YSAMYEEKVAHTHENIAYLMFHYYTWAVLAYTGY HLA-A*23:13,YSAMYEEKVAQTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:14,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:15,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:16,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:17,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:18,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:20,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:21,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:22,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:23,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:24,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:25,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*23:26,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*24:02,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:03,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A*24:04,YSAMYEEKVAHTDANTLYLMFHYYTWAVQAYTGY HLA-A*24:05,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:06,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTGY HLA-A*24:07,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:08,YSAMYGEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:10,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYRWY HLA-A*24:13,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTGY HLA-A*24:14,YSAMYEEKVAHTDENIAYVRYHYYTWAVQAYTGY HLA-A*24:15,YSAMYEEKVAHTDENIAYLMYHYYTWAVQAYTGY HLA-A*24:17,YSAMYEEKVAHTDENIAYLMFRDYTWAVQAYTGY HLA-A*24:18,YSAMYEEKVAHTDENIAYLMFHYYTWAELAYTWY HLA-A*24:19,YSAMYEEKVAQTDVDTLYLMFHYYTWAVQAYTGY HLA-A*24:20,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:21,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:22,YSAMYEEKVAHTDENIAYLMFHYYTWAVWVYTWY HLA-A*24:23,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A*24:24,YSAMYRNNVAQTDENIAYLMFHYYTWAVLAYTGY HLA-A*24:25,CSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:26,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:27,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:28,YSAMYEEKVAHTHVDTLYLMFHYYTWAVQAYTGY HLA-A*24:29,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:30,YSAMYEEKVAHTHENIAYLMFHYYTWAVQAYTGY HLA-A*24:31,YSAMYEQKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:32,YSAMYEEKVAHTDESIAYLMFHYYTWAVQAYTGY HLA-A*24:33,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A*24:34,YSAMYEEKVAHIDENIAYLMFHYYTWAVQAYTGY HLA-A*24:35,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:37,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:38,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:39,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:41,YSAMYEEKVAHTDENIAYLMFRDYTWAVQAYTGY HLA-A*24:42,YSAMYGEKVAHTHENIAYLMFHYYTWAVQAYTGY HLA-A*24:43,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:44,YSAMYEEKVAHTDVDTLYLMFHYYTWAVQAYTGY HLA-A*24:46,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYRGY HLA-A*24:47,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:49,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:50,YYAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:51,YSAMYEEKVAHTDENIAYLIYHYYTWAVQAYTGY HLA-A*24:52,YSAMYEEKVAHTDENIAYLRFHYYTWAVQAYTGY HLA-A*24:53,YSAMYEEKVAHTDENIAYLMYHYYTWAVQAYTGY HLA-A*24:54,YSAMYEEKVAHTDENIAYLMFHYYTWAVQPYTGY HLA-A*24:55,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYEGY HLA-A*24:56,YSAMYEEKVAHTDENIAYLMFHYYTWAEQAYTGY HLA-A*24:57,YSAMYEEKVAHTDENIAYIMYHYYTWAVQAYTGY HLA-A*24:58,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:59,YSAMYEEKVAHTDENIAYLMFHYYTWAAQAYTGY HLA-A*24:61,YSAMYEEKVAHTDEKIAYLMFHYYTWAVQAYTGY HLA-A*24:62,YSAMYEEKVAHTDENIAYLMFQDYTWAVQAYTGY HLA-A*24:63,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:64,YSAMYEEKVAHTDENIAYLWIHYYTWAVQAYTGY HLA-A*24:66,YSAMYEEKVAHTDENIAYLMFEHYTWAVQAYTGY HLA-A*24:67,YSAMYRNNVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:68,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:69,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:70,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:71,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:72,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:73,YSAMYEEKVAHTDENIAYLMFDYYTWAVQAYTGY HLA-A*24:74,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:75,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:76,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:77,YSAMYQEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:78,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:79,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:80,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:81,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:82,YTAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:85,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:87,YSAMYEEKVAHTDENIAYLMFHYYTWAVRAYTGY HLA-A*24:88,YFAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:89,YSAMYGEKVAHTHVDTLYLMFHYYTWAVQAYTGY HLA-A*24:91,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:92,YSAMYEEKVAHTDENIAYIIYHYYTWAVQAYTGY HLA-A*24:93,YSAMYEEKVAHTDENIAYVMFHYYTWAVQAYTGY HLA-A*24:94,YSAMYEEKVAHTDENIAYLMFHYYTWAVLAYTWY HLA-A*24:95,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:96,YSAMYEEKVAHTDENIAYLMFNFYTWAVQAYTGY HLA-A*24:97,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:98,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:99,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:100,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:101,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:102,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:103,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:104,YFAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:105,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:106,YSAMYEEKVAHTDENIAYLMFDDYTWAVQAYTGY HLA-A*24:107,YSAMYEEKVAHTDENIAYLMFHYYTWAVHAYTGY HLA-A*24:108,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:109,YSAMYEEKVAHTDANTLYLMFHYYTWAVQAYTGY HLA-A*24:110,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:111,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:112,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:113,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:114,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:115,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:116,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:117,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:118,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:119,YSAMYEEKVAHADENIAYLMFHYYTWAVQAYTGY HLA-A*24:120,YSAMYEEKVAHTDENIAYIMFHYYTWAVQAYTGY HLA-A*24:121,YSAMYEEKVAHTDENIAYLMFHSYTWAVQAYTGY HLA-A*24:122,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:123,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:124,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:125,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTWY HLA-A*24:126,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:127,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:128,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:129,YSAMYQENMAHTDANTLYLMFHYYTWAVQAYTGY HLA-A*24:130,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:131,YSAMYEEKVAQTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:133,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:134,YSAMYEEKVAHTDENIAYLMFHYYPWAVQAYTGY HLA-A*24:135,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:136,YSAMYEEKVAHTDENIAYLMFHYYTWVVQAYTGY HLA-A*24:137,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:138,YSAMYEEKVAHTDENIAYLMFHYYTWAVWAYTWY HLA-A*24:139,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:140,YSTMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:141,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:142,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*24:143,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYLGY HLA-A*24:144,YSAMYEEKVAHTDENIAYLMFHYYTWAVQAYTGY HLA-A*25:01,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:02,YYAMYRNNVAQTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:03,YFAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:04,YYAMYRNNVAHTDESIAYIRYQDYTWAEQAYRWY HLA-A*25:05,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:06,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYTWY HLA-A*25:07,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:08,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:09,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:10,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*25:11,YYAMYRNNVAHTHESIAYIRYQDYTWAEWAYRWY HLA-A*25:13,YYAMYRNNVAHTDESIAYIRYQDYTWAEWAYRWY HLA-A*26:01,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:02,YYAMYRNNVAHTDANTLYIRYQNYTWAEWAYRWY HLA-A*26:03,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A*26:04,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYLWY HLA-A*26:05,YYAMYRNNVAHTDENTLYIRYQDYTWAEWAYRWY HLA-A*26:06,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A*26:07,YYAMYGEKVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:08,YYAMYRNNVAHTDANTLYIRYQDYTWAEQAYRWY HLA-A*26:09,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYTWY HLA-A*26:10,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:12,YYAMYRNNVAHTDANTLYIRYQDYTWAVWAYRWY HLA-A*26:13,YYAMYRNNVAQTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:14,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:15,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:16,YSAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:17,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:18,YYAMYRNNVAHTDANTLYIRYQDYTWAVWAYRWY HLA-A*26:19,YYAMYQENVAQTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:20,YFAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:21,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A*26:22,YYAMYRNNVAHTDANTLYVRYQDYTWAEWAYRWY HLA-A*26:23,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:24,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:26,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:27,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:28,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:29,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRGY HLA-A*26:30,YYAMYRNNVAHTHVDTLYIRYQDYTWAEWAYRWY HLA-A*26:31,YYAMYPNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:32,YYAMYRNNVAHTDANTLYMVYQDYTWAEWAYRWY HLA-A*26:33,YYAMYRNNVAQIHANTLYIRYQDYTWAEWAYRWY HLA-A*26:34,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYWWY HLA-A*26:35,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:36,YYAMYRNNVAHTHANTLYIRYQDYTWAEWAYRWY HLA-A*26:37,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:38,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:39,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:40,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:41,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:42,YYAIYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:43,YYAMYRNNVAHTDANTLYIRYQDYTWAELAYRWY HLA-A*26:45,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:46,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:47,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*26:48,YYAMYRNKVAHTDANTLYIRYQDYTWAEQAYRWY HLA-A*26:49,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRGY HLA-A*26:50,YYAMYRNNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*29:01,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:02,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:03,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTGY HLA-A*29:04,YTAMYLQHVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:05,YTAMYLQNVAQTDANTLYIMYRDYTWAEQAYTWY HLA-A*29:06,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:07,YTAMYLQNVAQTDANTLYLMFRDYTWAVLAYTWY HLA-A*29:09,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:10,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:11,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:12,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:13,YTAMYLQNVAQTDESIAYIMYRDYTWAVLAYTWY HLA-A*29:14,YTAMYQENVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:15,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:16,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:17,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:18,YTAMYQENVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:19,YTAMYLQNVAHTHVDTLYIMYRDYTWAVLAYTWY HLA-A*29:20,YTAMYLQNVAHTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:21,YTAMYLQNVAQTDANTLYIMYRDYTWAVLAYTWY HLA-A*29:22,YTAMYLQNVAQTDANTLYVRYRDYTWAVLAYTWY HLA-A*30:01,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:02,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:03,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:04,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY HLA-A*30:06,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTWY HLA-A*30:07,YSAMYEEKVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:08,YYAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:09,YSAMYQENVAHTDENTLYIIYEHYTWAVLAYTWY HLA-A*30:10,YSAMYQENVAHTDENTLYIIHEHYTWARLAYTWY HLA-A*30:11,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:12,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:13,YSAMYQENVAHTHVDTLYIIYEHYTWARLAYTWY HLA-A*30:15,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:16,YSAMYQENVAQTHVDTLYIIYEHYTWAWLAYTWY HLA-A*30:17,YSAMYQENVAQTDVDTLYIIYEHYTWAVWAYTWY HLA-A*30:18,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:19,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:20,YSAMYQENVAQTEVDTLYIIYEHYTWAWLAYTWY HLA-A*30:22,YSAMYGEKVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:23,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:24,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:25,YSAMYQENVAQTDENTLYIIYEHYTWARLAYTWY HLA-A*30:26,YSAMYQENVAQTDVDTLYIIYRDYTWAWLAYTWY HLA-A*30:28,YSAMYQENVAHTDENTLYIVYEHYTWARLAYTWY HLA-A*30:29,YSAMYQENVAHTDENTLYIIYEHYTWAVWAYTSY HLA-A*30:30,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:31,YSAMYQENVARTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:32,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:33,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:34,YSAMYQENVAHTDENTLYIIYEHYTWARLAYTWY HLA-A*30:35,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:36,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:37,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:38,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:39,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:40,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*30:41,YSAMYQENVAQTDVDTLYIIYEHYTWAWLAYTWY HLA-A*31:01,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:02,YTAMYQEKVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:03,YTAMYQENVAHIDVDTLYIIYRDYTWAVLAYTWY HLA-A*31:04,YTAMYQENVAHIDVDTLYIIYRDYTWAVLAYTWY HLA-A*31:05,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTGY HLA-A*31:06,YTAMYQENVAHIDVDTLYIMYRDYTWAVLAYTWY HLA-A*31:07,YTAMYQEKVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A*31:08,YTAMYEEKVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A*31:09,YTAMYQENVGHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:10,YTAMYQENVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A*31:11,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:12,YTAMYQENVAHIDVDTLYIKYQDYTWAVLAYTWY HLA-A*31:13,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:15,YTAMYQENVARIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:16,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:17,YTAMYQENVAHINVDTLYIMYQDYTWAVLAYTWY HLA-A*31:18,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTRY HLA-A*31:19,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:20,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:21,YFAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:22,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:23,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:24,YTAMYQENVAHIDVDTLYIMYQDYTWAAQAYRWY HLA-A*31:25,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYRWY HLA-A*31:26,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:27,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:28,YTAMYQENVTHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:29,YTAMYQENVAHIDVDTLYLMFQDYTWAVLAYTWY HLA-A*31:30,YTAMYQENVAHIDVDTLYIMYQDYTWAVWAYTWY HLA-A*31:31,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:32,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:33,YTAMYQENVAHIDGDTLYIMYQDYTWAVLAYTWY HLA-A*31:34,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:35,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:36,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*31:37,YTAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*32:01,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:02,YFAMYQENVAHTDESIAYIMYQDYTWAVQAYTWY HLA-A*32:03,YFAMYQENVAHTDENIAYIMYQDYTWAVLAYTWY HLA-A*32:04,YFAMYQENVAHTDESIAYIIYRDYTWAELAYTWY HLA-A*32:05,YFAMYQEKVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:06,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:07,YSAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:08,YFAMYQENVAHTHESIAYIMYQDYTWAVLAYTWY HLA-A*32:09,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTRY HLA-A*32:10,YFAMYQENVAHTDESIAYIMYQDYTWAEWAYTWY HLA-A*32:12,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:13,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTGY HLA-A*32:14,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:15,YFAMYRNNVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:16,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:17,YFAMYQENVAQTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:18,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:20,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:21,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:22,YFAMYQENVAHTDESIAYIMYQDYTWAVQAYTWY HLA-A*32:23,YFAMYQENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:24,YFAMYQENMAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*32:25,YFAMYHENVAHTDESIAYIMYQDYTWAVLAYTWY HLA-A*33:01,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:03,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:04,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:05,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:06,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:07,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:08,YTAMYGEKVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:09,YTAMYGENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:10,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTGY HLA-A*33:11,YTAMYRNNVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:12,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:13,YTAMYRNNVAHTDANTLYIMYQDYTWAVLAYTWY HLA-A*33:14,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:15,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:16,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:17,YTAMYRNNVAHIDADTLYIMYQDYTWAVLAYTWY HLA-A*33:18,YTAMYRNNVAHIDVDTLYIMYRDYTWAVLAYTWY HLA-A*33:19,YTAMYRNNVAHIDVDTLYLMFHYYTWAVQAYTGY HLA-A*33:20,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:21,YTAMYEENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:22,YTAMYRNNVAHIDVDTLYVRYQDYTWAVLAYTWY HLA-A*33:23,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:24,YTAMYRNNVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A*33:25,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:26,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:27,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWH HLA-A*33:28,YTAMYRNNVAHIDVDTLYIMYQDYTWAELAYTWY HLA-A*33:29,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:30,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*33:31,YTAMYRNNVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*34:01,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY HLA-A*34:02,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*34:03,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*34:04,YYAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*34:05,YYAMYRNKVAQTDVDTLYIRYQDYTWAEWAYTWY HLA-A*34:06,YYAMYRNNVAQTDVDTLYIRYQDYTWAVLAYTWY HLA-A*34:07,YYAMYRNNVSQTDVDTLYIIYRDYTWAELAYTWY HLA-A*34:08,YFAMYRNNVAQTDVDTLYIIYRDYTWAELAYTWY HLA-A*36:01,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTWY HLA-A*36:02,YFAMYQENMAHTDANTLYIIYRDYTWVARAYTWY HLA-A*36:03,YFAMYQENMAHTDANTLYLMYRDYTWVARVYTWY HLA-A*36:04,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRWY HLA-A*36:05,YFAMYQENMAHTDANTLYIIYRDYTWVARVYTWY HLA-A*43:01,YYAMYLQNVAHTDANTLYIRYQDYTWAEWAYRWY HLA-A*66:01,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:02,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYEWY HLA-A*66:03,YYAMYRNNVAHTDVDTLYIRYQDYTWAEWAYEWY HLA-A*66:04,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWH HLA-A*66:05,YYAMYRNNVAHTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:06,YYAMYRNNVAQTDVDTLYIRYQDYTWAVLAYRWY HLA-A*66:07,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:08,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:09,YYAMYRNNVAQTDVDTLYVRYQDYTWAEWAYRWY HLA-A*66:10,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRGY HLA-A*66:11,YYAMYRNNVAQTDADTLYIRYQDYTWAEWAYRWY HLA-A*66:12,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:13,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:14,YYAMYRNNVAQTDVDTLYIRYQDYTWAEWAYRWY HLA-A*66:15,YYAMYRNNVAHIDVDTLYIRYQDYTWAEWAYRWY HLA-A*68:01,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:02,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:03,YYAMYRNNVAHTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:04,YYAMYRNNVAHIDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:05,YYAMYRNNVAHTHVDTLYIMYRDYTWAVWAYTWY HLA-A*68:06,YYAMYRNNVAQTDVDTLYIMYEHYTWAVWAYTWY HLA-A*68:07,YYAMYRNNVAQTDVDTLYIMYRHYTWAVWAYTWY HLA-A*68:08,YYAMYRNNVAQTDVDTLYIMYRDYTWAVLAYTWY HLA-A*68:09,YYAMYRNNVAQTDVDTLYIMYRDYTWAVQAYTWY HLA-A*68:10,YYAMYEENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:12,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:13,YYAMYRENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:14,YYAMYEENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:15,YYAMYRNNVAHTHVDTLYIRYHYYTWAVWAYTWY HLA-A*68:16,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:17,YYAMYRNNVAQTDVDTLYIMYRVYTWAVWAYTWY HLA-A*68:19,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:20,YYAMYRNNVAHTHVDTLYIMYRDYTWAVWAYTWY HLA-A*68:21,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:22,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:23,YYAMYRNNVAQTDVDTLYIRYRDYTWAVWAYTWY HLA-A*68:24,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:25,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:26,YYAMYRNNVAQTDVDTLYIMYRDYTWAVQAYTGY HLA-A*68:27,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:28,YYAMYRNNVAQTDVDTLYIRYHYYTWAVRAYTWY HLA-A*68:29,YTAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:30,YYAMYGENVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:31,YYAMYRNNVAHTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:32,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:33,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:34,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYMWY HLA-A*68:35,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:36,YYAMYRNNVAQTDENIAYIMYRDYTWAVWAYTWY HLA-A*68:37,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:38,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:39,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:40,YYAMYRNNVGQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:41,YYAMYRNNVAQTDVDTLYIMYRDYTWVVWAYTWY HLA-A*68:42,YYAMYRNNVAQTDVDTLYIMYRDYTWAEWAYTWY HLA-A*68:43,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:44,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:45,YSAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:46,YYAMYRNNVAQTDVNTLYIMYRDYTWAVWAYTWY HLA-A*68:47,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:48,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:50,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:51,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:52,YYAMYRNNVAQTDVDTLYIMYRDYTWAVWAYTWY HLA-A*68:53,YYAMYRNNVAQTDVDTLYIRYHYYTWAVWAYTWY HLA-A*68:54,YYAMYRNNVAQTDVDTLYIRYHYYTWAEWAYTWY HLA-A*69:01,YYAMYRNNVAQTDVDTLYVRYHYYTWAVLAYTWY HLA-A*74:01,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:02,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:03,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:04,YFAMYGEKVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:05,YFAMYQENVAHADVDTLYIMYQDYTWAVLAYTWY HLA-A*74:06,YFAMYQENVAHTHVDTLYIMYQDYTWAVLAYTWY HLA-A*74:07,YFAMYQENVAHIDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:08,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:09,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:10,YFAMYQENVAHTDANTLYIMYQDYTWAVLAYTWY HLA-A*74:11,YFAMYQENVAHTDVDTLYIMYQDYTWAVLAYTWY HLA-A*74:13,YFAMYQENVAQTDVDTLYIMYQDYTWAVLAYTWY HLA-A*80:01,YFAMYEENVAHTNANTLYIIYRDYTWARLAYEGY HLA-A*80:02,YFAMYEENVAHTDVDTLYIIYRDYTWARLAYEGY HLA-B*07:02,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:03,YYSEYRNIYTNTDESNLYLSYDYYTWAERAYEWY HLA-B*07:04,YYSEYRNIYAQTDESNLYLSYDYYTWAEDAYEWY HLA-B*07:05,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:06,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:07,YYSEYRNIYAQTDESNLYLRYDYYTWAERAYEWY HLA-B*07:08,YYSEYRNIFTNTDESNLYLSYDYYTWAERAYEWY HLA-B*07:09,YYSEYRNIYAQTDESNLYLSYDSYTWAERAYEWY HLA-B*07:10,YYSEYRNICAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:11,YYSEYRNIYAQTDENNLYLSYDSYTWAERAYEWY HLA-B*07:12,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY HLA-B*07:13,YYSGYREKYRQADVSNLYLSYDYYTWAERAYEWY HLA-B*07:14,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY HLA-B*07:15,YYSEYRNIYAQADVSNLYLSYDYYTWAERAYEWY HLA-B*07:16,YYSEYRNIYTNTYESNLYLSYDYYTWAERAYEWY HLA-B*07:17,YYSEYRNIYAQTDESNLYLSYDSYTWAERAYEWY HLA-B*07:18,YYSEYRNIYAQTDESNLYIRYDYYTWAERAYEWY HLA-B*07:19,YYSEYRNIYAQTDESNLYLSYDYYTWAEDAYTWY HLA-B*07:20,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLSY HLA-B*07:21,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:22,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:23,YYSEYRNIYAQTDESNLHLSYDYYTWAERAYEWY HLA-B*07:24,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLWY HLA-B*07:25,YYSEYRNIYAQTDESNLYLSYDYYTWAVDAYEWY HLA-B*07:26,YYSEYRNIYAQTDESNLYLSYDYYTWAELAYEWY HLA-B*07:27,YYSEYRNISTNTYEDTLYLSYDYYTWAERAYEWY HLA-B*07:28,YYSEYRNIYAQTDESNLYLSYDDYTWAERAYEWY HLA-B*07:29,YDSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:30,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:31,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYTWY HLA-B*07:32,YYSEYRNIFTNTDESNLYLSYNYYTWAERAYEWY HLA-B*07:33,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:34,YYSEYRNIYAQTDESNLYLSYNYYTWAELAYTWY HLA-B*07:35,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:36,YYSEYRNIYAQTDENIAYLSYDYYTWAERAYEWY HLA-B*07:37,YYSEYRNIYANTYESNLYLSYDYYTWAERAYEWY HLA-B*07:38,YYSEYRNIFTNTYENIAYLSYDYYTWAERAYEWY HLA-B*07:39,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:40,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:41,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:42,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:43,YYSEYRNIYAQTDESNLYLSYDYYTWAELAYTWY HLA-B*07:44,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:45,YYSEYRNIYAQTDESNLYLSYDYYTWAERTYEWY HLA-B*07:46,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:47,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:48,YYSEYRNIYAQTDESNLYLSYDYYTWAVLAYEWY HLA-B*07:50,YYSEYRNISTNTYESNLYLSYDYYTWAERAYEWY HLA-B*07:51,YYSEYRNIYAQTDESNLYLSYDYYTWAARAYEWY HLA-B*07:52,YYSEYRNIYAQTDESNLYLSYDYYTWAERVYEWY HLA-B*07:53,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:54,YYSEYREIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:55,YYSEYRNIYAQTDESNLYLSYDYYTWAEWAYEWY HLA-B*07:56,YYAEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:57,YYSEYRNIYAQTDENNLYLSYDYYTWAERAYEWY HLA-B*07:58,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:59,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:60,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYLWY HLA-B*07:61,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:62,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:63,YYSDYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:64,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEGY HLA-B*07:65,YYATYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:66,YYSEYRNIYAQTDESNLYLSYDYYTWAEQAYEWY HLA-B*07:68,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:69,YYSEYRNICTNTDESNLYLSYNYYTWAERAYEWY HLA-B*07:70,YCSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:71,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:72,YYAEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:73,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:74,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:75,YYSEYRNIYAQTYENNLYLSYDYYTWAERAYEWY HLA-B*07:76,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:77,YYSEYRNIYAQTDESNLYLRSDYYTWAERAYEWY HLA-B*07:78,YYSEYRNIYAQTDESNLYWTYNLYTWAERAYEWY HLA-B*07:79,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:80,YYSEYRNIYAQTDESNLYLSYNYYTWAELAYEWY HLA-B*07:81,YYSEYRNIYAQTDESIAYLSYDYYTWAERAYEWY HLA-B*07:82,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:83,YYSEYRNIFAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:84,YYSEYRNIYAQTDESNLYWTYDYYTWAERAYEWY HLA-B*07:85,YYSEYRNICTNTDESNLYLSYDYYTWAERAYEWY HLA-B*07:86,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:87,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:88,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:89,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:90,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:91,YYSEYRNIYAQTYESNLYLSYDYYTWAERAYEWY HLA-B*07:92,YYSEYRNIYAQTDVSNLYLSYDYYTWAERAYEWY HLA-B*07:93,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:94,YYSEYWNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:95,YYSEYRNIYAQTDESNLYFSYDYYTWAERAYEWY HLA-B*07:96,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:97,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:98,YYSEYRNIYAQTDESNLYLSYDYYTCAERAYEWY HLA-B*07:99,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:100,YYSEYRNIYAQTDESNLYLSYDYYTWAEWAYLWY HLA-B*07:101,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:102,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:103,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:104,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:105,YYSEYRNIYAQTVESNLYLSYNYYTWAERAYEWY HLA-B*07:106,YYSEYRNIYAQTDESNLYLSYDYYTRAERAYEWY HLA-B*07:107,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:108,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:109,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:110,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:112,YYSEYRNIYAQTDESNLYLSYNYYTWAERAYEWY HLA-B*07:113,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:114,YYSEYRNIYAQTDESNLYLSYDYYTWAERAYEWY HLA-B*07:115,YYSEYRNIYAQTDESNLYLSYNFYTWAERAYEWY HLA-B*08:01,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:02,YDSEYRNIFTNTDENTAYLSYNYYTWAVDAYTWY HLA-B*08:03,YDSEYRNIFTNTYENIAYLSYNYYTWAVDAYTWY HLA-B*08:04,YDSEYRNISTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:05,YDSEYRNTFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:07,YDSEYRNIFTNTDESNLYLSYDYYTWAVDAYTWY HLA-B*08:09,YDSEYRNIFTNTDESNLYWTYNYYTWAVDAYTWY HLA-B*08:10,YDSEYRDIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:11,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYAWY HLA-B*08:12,YDSEYRNIFTNTDESNLYLRYNYYTWAVDAYTWY HLA-B*08:13,YDSEYRNIFTNTDESNLYLSYNYYTWAVLAYTWY HLA-B*08:14,YDSEYRNIFTNTDESNLYLSYHDYTWAVDAYTWY HLA-B*08:15,YDSEYRNIFTNTDVSNLYLSYNYYTWAVDAYTWY HLA-B*08:16,YDSEYRNIFTNADESNLYLRYNYYTWAVDAYTWY HLA-B*08:17,YDSEYREISTNTDENNLYLSYNYYTWAVDAYTWY HLA-B*08:18,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:20,YDSEYRNIFTNTDESNLYLSYNYYTWAERAYTWY HLA-B*08:21,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYLWY HLA-B*08:22,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:23,YDSEYRNIFTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*08:24,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:25,YDSEYRNIFTNTDESNLYLSYNYYTWAVLAYLWY HLA-B*08:26,YYAEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:27,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:28,YDSEYRNIFTNTDESNLYLSYDSYTWAVDAYTWY HLA-B*08:29,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:31,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:32,YDSTYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:33,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:34,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:35,YDSEYRNIFTNTDESNLYLSYNSYTWAVDAYTWY HLA-B*08:36,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:37,YDSEYRNIFTNTDESNLYLSYDSYTWAVDAYTWY HLA-B*08:38,YDSEYREIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:39,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:40,YDSEYRNIFTNTDESNLYLSYNYYTWAVRAYEWY HLA-B*08:41,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:42,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:43,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:44,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:45,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:46,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:47,YDSEYRNIFTNTDENNLYLSYNYYTWAVDAYTWY HLA-B*08:48,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:49,YDSEYRNIFTNTDESNLYIRSNFYTWAVDAYTWY HLA-B*08:50,YYSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:51,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:52,YDSEYRNIFTNTDESIAYLSYNYYTWAVDAYTWY HLA-B*08:53,YDSEYRNIFTNTDESNLYLSYNYYTWAEDAYTWY HLA-B*08:54,YDSEYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*08:55,YDSEYRNIFTNTDESNLYLSYNYYTWAVLTYTWY HLA-B*08:56,YDAEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:57,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:58,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:59,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:60,YDSEYRNIFTNTDESNLYISYNYYTWAVDAYTWY HLA-B*08:61,YDSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*08:62,YHSEYRNIFTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*13:01,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:02,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:03,YYTMYREISTNTYENTAYWTYNLYTWAVLAYLWY HLA-B*13:04,YYTMYREISTNTYENTAYWTYDSYTWAVLAYLWY HLA-B*13:06,YYTMYREISTNTYENTAYIRYNLYTWAVLAYTWY HLA-B*13:09,YYTMYREISTNTYESNLYWTYNLYTWAVLAYEWY HLA-B*13:10,YYTMYREISTNTYENTAYLRYDSYTWAVLAYEWY HLA-B*13:11,YYTMYREISTNTYENTAYLRYNLYTWAVLAYEWY HLA-B*13:12,YYTMYREISTNTYENTAYIRYNLYTWAVLAYGWY HLA-B*13:13,YYTMYREISTNTYENTAYIRYNYYTWAVLAYEWY HLA-B*13:14,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:15,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWH HLA-B*13:16,YYTMYREISTNTYENTAYWTYNLYTWAELAYEWY HLA-B*13:17,YYAMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:18,YYTMYREISTNTYENTAYWTYNLYTWAVRAYEWY HLA-B*13:19,YYTMYREVSTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:20,YYTMYREISTNTYENTAYIRYNLYTWAELAYEWY HLA-B*13:21,YYTMYREISTNTYENTAYIRYNYYTWAVLAYEWY HLA-B*13:22,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:23,YHTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:25,YYTMYREISTNTYESTAYIRYNLYTWAVLAYEWY HLA-B*13:26,YYTMYREISTNTYENTAYIRYDSYTWAVLAYEWY HLA-B*13:27,YYTMYREISTNTYENTAYWTFNLYTWAVLAYEWY HLA-B*13:28,YYTMYREISTNTYENTACIRYNLYTWAVLAYEWY HLA-B*13:29,YYTMYREISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:30,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:31,YYTMYREISTNTYENTAYWTYNLYTWAEWAYEWY HLA-B*13:32,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:33,YYAMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:34,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:35,YYTMYREISTNTYENTAYWTYDYYTWAVLAYEWY HLA-B*13:36,YYTMYRNISTNTYENTAYIRYNLYTWAVLAYEWY HLA-B*13:37,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:38,YYTMYREISTNTYENTAYWTYNLYTWAVLAYEWY HLA-B*13:39,YYTMYREISTNTYENNLYIRYNLYTWAVLAYEWY HLA-B*14:01,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:02,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:03,YYSEYRNICTNTDESNLYLWYNFYTWAERAYTWH HLA-B*14:04,HYSEYRNNCTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:05,YYSEYRNICTNTDESNLYLSYNFYTWAELAYTWH HLA-B*14:06,YYSEYRNICTNTDESNLYLRYNFYTWAELAYTWH HLA-B*14:08,YYSEYRNICTNTDESNLYLRYNFYTWAELAYTWH HLA-B*14:09,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:10,YYSEYRNICTNTDESNLYIRYNFYTWAELAYTWH HLA-B*14:11,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:12,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:13,YYSEYRNICTNTDESNLYLSYNYYTWAELAYTWH HLA-B*14:14,YYSEYRNICTNTYESNLYLWYNFYTWAELAYTWH HLA-B*14:15,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:16,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:17,YYSEYRNICTNTDESNLYLWYNFYTWAELAYTWH HLA-B*14:18,YYSEYRNICTNTYESNLYLWYNFYTWAELAYTWH HLA-B*15:01,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:02,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:03,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:04,YYAMYREISTNTYESNLYWTYDSYTWAEWAYLWY HLA-B*15:05,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*15:06,YYAMYREISTNTYESNLYLRFDSYTWAELAYLWY HLA-B*15:07,YYAMYREISTNTYESNLYLSYDSYTWAEWAYLWY HLA-B*15:08,YYAMYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:09,YYSEYRNICTNTYESNLYLRYNYYTWAELAYLWY HLA-B*15:10,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWY HLA-B*15:11,YYAMYRNIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:12,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLGY HLA-B*15:13,YYAMYRNISTNTYENIAYIRYDSYTWAELAYLWY HLA-B*15:14,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLSY HLA-B*15:15,YYAMYRNISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:16,YYAMYRENMASTYENIAYWRYDSYTWAELAYLWY HLA-B*15:17,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B*15:18,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:19,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLGY HLA-B*15:20,YYAMYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*15:21,YYAMYRNICTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:23,YYSEYRNICTNTYENIAYLRYDSYTWAELAYLWY HLA-B*15:24,YYAMYREISTNTYENIAYLRYDSYTWAEWAYLWY HLA-B*15:25,YYAMYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:27,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY HLA-B*15:28,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:29,YYSEYRNIFTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:30,YYAMYREISTNTYESNLYLRYNYYTWAEWAYLWY HLA-B*15:31,YYAMYRNISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*15:32,YYAMYREISTNTYESNLYLRSDSYTWAEWAYLWY HLA-B*15:33,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:34,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:35,YYAMYREISTNTYESNLYLTYDSYTWAEWAYLWY HLA-B*15:36,YYAMYREISTNTYENTAYIRYDSYTWAELAYLWY HLA-B*15:37,YYSEYRNICTNTYESNLYLRYDYYTWAELAYLWH HLA-B*15:38,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWH HLA-B*15:39,YYAMYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:40,YYAMYREISTNTYESNLYLRYDSYTWAELAYEWY HLA-B*15:42,YYAMYREISTNTYESNLYWTYNLYTWAELAYTWY HLA-B*15:43,YYAMYREISTNTYEDTLYLRYDSYTWAEWAYLWY HLA-B*15:44,YYAMYRNICTNTYESNLYIRYDSYTWAELAYTWY HLA-B*15:45,YYAMYREISTNTYESNLYLSYDYYTWAEWAYLWY HLA-B*15:46,YYAKYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:47,YYSEYREISTNTYESNLYLRYDSYTWAERAYEWY HLA-B*15:48,YYAMYREISTNTYESNLYLRYNYYTWAVLTYLWY HLA-B*15:49,YYSEYREISTNTYESNLYLRYDSYTWAERAYEWY HLA-B*15:50,YYAMYREISTNTYESNLYLRYDSYTWAEWAYTWY HLA-B*15:51,YYSEYRNICTNTYESNLYLRYDSYTWAVDAYLWY HLA-B*15:52,YYSEYRNICTNTYESNLYLRYDSYTWAVLAYEWY HLA-B*15:53,YYTKYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:54,YYSEYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:55,YYAMYRNISTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*15:56,YYAMYREIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:57,YYAMYREISTNTYVNNLYLRYDSYTWAEWAYLWY HLA-B*15:58,YYAMYREISTNTYESNLYLRYNFYTWAEWAYLWY HLA-B*15:60,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:61,YYSEYREISTNTDESNLYLRYDSYTWAELAYLWY HLA-B*15:62,YYSEYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:63,YYAMYREISTNTYESNLYLRYDYYTWAEWAYLWY HLA-B*15:64,YYSEYRNISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:65,YYAMYREISTNTYESNLYLRYDSYTWAERAYLWY HLA-B*15:66,YYAMYREICTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:67,YYAMYRENMASTYENIAYWRYDSYTWAELAYLWY HLA-B*15:68,YYSEYREISTNTYESNLYLSYDSYTWAEWAYLWY HLA-B*15:69,YYSEYREISTNTYESNLYLRYDSYTWAELTYTWY HLA-B*15:70,YYAMYREISTNTDESNLYLRYDSYTWAEWAYLWY HLA-B*15:71,YHAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:72,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:73,YYAMYREISTNTYESNLYLRYNLYTWAEWAYLWY HLA-B*15:74,YYSEYREISINTYESNLYLRYDSYTWAELAYLWY HLA-B*15:75,YYAMYREISTNTYESNLYLRYDSYTWAQWAYLWY HLA-B*15:76,YYAMYRNIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B*15:77,YYAMYREISTNTYESNLYIRYDDYTWAEWAYLWY HLA-B*15:78,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:80,YYSEYRNICTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:81,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:82,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:83,YYAMYREISTNTYESNLYWTYNYYTWAVDAYTWY HLA-B*15:84,YYAMYREISTNTYESNLYLRFDSYTWAVRAYLWY HLA-B*15:85,YYAMYREISTNTYESNLYIRYDSYTWAEWAYLWY HLA-B*15:86,YYAMYREISTNTYESNLYLRYNLYTWAVLAYTWY HLA-B*15:87,YYAMYREISTNTYESIAYLRYDSYTWAEWAYLWY HLA-B*15:88,YYAMYRNISTNTYESNLYIRYDSYTWATLAYLWY HLA-B*15:89,YYAMYRNISTNTYENTAYIRYDSYTWAELAYLWY HLA-B*15:90,YYSEYRNICTNTYESNLYLRYDYYTWAELVYLWY HLA-B*15:91,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLSY HLA-B*15:92,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:93,YYSEYRNICTNTYESNLYLRYDSYTWAELAYTWY HLA-B*15:95,YYAMYQENMASTYENIAYWRYDSYTWAELAYLWY HLA-B*15:96,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:97,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:98,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:99,YYSEYRNICTNTYESNLYLRYDYYTWAERAYLWY HLA-B*15:101,YYAMYREIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B*15:102,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:103,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:104,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:105,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:106,YYAKYREISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:107,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*15:108,YYSEYRNICTNTYESNLYLRYDSYTWAELTYLWY HLA-B*15:109,YYAMYREISTNTYESNLYLRFDSYTWAEWAYLWY HLA-B*15:110,YYAMYREISTNTYESNLYLRCDSYTWAEWAYLWY HLA-B*15:112,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:113,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:114,YYSEYRNICTNTYESNLYLRYDSYTWAVLAYEWY HLA-B*15:115,YYSEYRNICTNTYESTAYLRYDSYTWAELAYLWY HLA-B*15:116,YYAMYREISTNTYESNLYLRYDSYSLAEWAYLWY HLA-B*15:117,YYAMYREISTNTYESNLYLRYDSYTWAEWAYEWY HLA-B*15:118,YYAMYREISTNTYESNLYLMYDSYTWAEWAYLWY HLA-B*15:119,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:120,YYAMYRDISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:121,YYAMYRNISTNTYESNLYIRYDSYTWAELAYTWY HLA-B*15:122,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:123,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*15:124,YYSEYRNICTNTYESNLYLRYDSYSLAVLAYEWY HLA-B*15:125,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:126,YYAMYREISTNTYESNLYLSYDSCTWAEWAYLWY HLA-B*15:127,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:128,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:129,YYAMYREISTNTYESNLYLNYDSYTWAEWAYLWY HLA-B*15:131,YYSEYREISTNTYESNLYLRYDSYTWAELAYLSY HLA-B*15:132,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:133,YYSEYRNICTNTYESNLYLRYDFYTWAELAYLWY HLA-B*15:134,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:135,YYAMYREISTNTYENNLYLRYDSYTWAEWAYLWY HLA-B*15:136,YYAMYREISTNTYESNLYLRYDSYTWAVLTYLWY HLA-B*15:137,YYAMYREISTNTYESNLYWTYNFYTWAEWAYLWY HLA-B*15:138,YYAMYREISTNTYESNLYLRYDSYTWAELAYEWY HLA-B*15:139,YYAMYRNISANTYESNLYIRYDSYTWAELAYLWY HLA-B*15:140,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:141,YYAMYREISTNTYESNLYLTYDSYTWAEWAYLWY HLA-B*15:142,YDAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:143,YYAKYRNIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:144,YYAMYRNISTNTYESNLYIRYDSYTWAEWAYLWY HLA-B*15:145,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:146,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:147,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:148,YYAMYRNIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:150,YYAMYREISTNTYESNLYLRYNYYTWAEWAYLWY HLA-B*15:151,YYSEYREISTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*15:152,YYAMYREIYTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:153,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:154,YYAMYREISTNTYESNLYIRYDSYTWAEWAYLWY HLA-B*15:155,YYAMYREISTNTYESNLYWTYDSYTWAVLAYLWY HLA-B*15:156,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:157,YYAMYREISTNTYENIAYLRYDSYTWAEWAYLWY HLA-B*15:158,YYSEYREISTNTYESNLFLRYDSYTWAELAYLWY HLA-B*15:159,YYAMYREISTNTYESNLHLRYDSYTWAEWAYLWY HLA-B*15:160,YYAMHREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:161,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLSY HLA-B*15:162,YYAMYRENMASTYENIAYLRYHDYTWAALAYLWY HLA-B*15:163,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:164,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:165,YYAMYREISTNTYESNLYIRYDSYTWAEWAYLWY HLA-B*15:166,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:167,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:168,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B*15:169,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:170,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:171,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:172,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:173,YYSEYREISTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:174,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:175,YHAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:176,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:177,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B*15:178,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:179,YYAMYREISTNTYESNLYLRYDSYTWAVDAYLWY HLA-B*15:180,YDSEYRNIFTNTDESNLYLRYDSYTWAEWAYLWY HLA-B*15:183,YYTMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:184,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:185,YYAMYREISTNTYESNLYLRYDSYTWAVLAYLWH HLA-B*15:186,YYSEYRNICTNTYESNLYLRYDSYTWAVLTYTWY HLA-B*15:187,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:188,YYAMYREISTNTYESNLYLRYNYYTWAVLAYTWY HLA-B*15:189,YYAMYRNICTNTDESNLYLRYDSYTWAEWAYLWY HLA-B*15:191,YYAMYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:192,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:193,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:194,YYAMYRNISTNTYESNLYIRYDSYTWAELAYLWY HLA-B*15:195,YYAMYREISTNTYESNLYLRFDSYTWAELAYLWY HLA-B*15:196,YYAMYRENMASTYENIAYLRYHDYTWAELAYLWY HLA-B*15:197,YYSEYRNICTNTYESNLYLSYDSYTWAELAYLWY HLA-B*15:198,YYSEYRNICTNTYESNLYLRYDSYTWAELAYLWY HLA-B*15:199,YYAMYREISTNTYESNLYLRYDSYTWAEDAYTWY HLA-B*15:200,YYSEYRNICTNTYESNLYLRYDSYTWATLAYLWY HLA-B*15:201,YYAMYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*15:202,YYATYREISTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*18:01,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:02,YHSTYRNISTNTYESNLYLNYDSYTWAVLAYTWH HLA-B*18:03,YHSTYRNISTNTDESNLYLRYDSYTWAVLAYTWH HLA-B*18:04,YYATYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:05,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:06,YHSTYRNISTNTYVSNLYLRYDSYTWAVLAYTWH HLA-B*18:07,YHSTYRNIFTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:08,YHSTYRNISTNTYESNLYLRCDSYTWAVLAYTWH HLA-B*18:09,YHSTYRNISTNTYENTAYLRYDSYTWAVLAYTWH HLA-B*18:10,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYEWY HLA-B*18:11,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWY HLA-B*18:12,YHSTYREISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:13,YHSTYRNISTNTYESNLYLRYDSYTWAVRAYTWH HLA-B*18:14,YHSTYRNISTNTYESNLYLSYDSYTWAVLAYTWH HLA-B*18:15,YHSTYRNISTNTYESNLYLRYDSYTWAELAYTWH HLA-B*18:18,YHSTYRNISTNTYESNLYLRSDSYTWAVLAYTWH HLA-B*18:19,YHSTYRNISTNTYESNLYLRYDSYTWAEWAYTWH HLA-B*18:20,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:21,YHSTYRNISTNTYESNLYLRYDSYTWAERAYEWY HLA-B*18:22,YHSTYRNISTNTYESNLYISYDSYTWAVLAYTWH HLA-B*18:24,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:25,YYSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:26,YHSTYRNISTNTYESNLYLRYNYYTWAVLAYTWH HLA-B*18:27,YHSTYRNISTNTYESNLYLMFDSYTWAVLAYTWH HLA-B*18:28,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:29,YHATYRNIFTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:30,YHSTYRNISTNTYESNLYLRYDSYTWAERAYTWH HLA-B*18:31,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:32,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:33,YHSTYRNICTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:34,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:35,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYEWY HLA-B*18:36,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYLWH HLA-B*18:37,YHSEYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:38,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:39,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:40,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:41,YHSTYRNISTNTYESNLYLRYESYTWAVLAYTWH HLA-B*18:42,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:43,YYSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:44,YHSTYRNISTNTYESNLYLWYDSYTWAVLAYTWH HLA-B*18:45,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:46,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:47,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:48,YHSKYRNISTNTYESNLYLRYDSYTWAVLAYTWH HLA-B*18:49,YHSTYRNISTNTYENNLYLRYDSYTWAVLAYTWH HLA-B*18:50,YHSTYRNISTNTYESNLYLRYDSYTWAVLAYEWH HLA-B*27:01,YHTEYREICAKTYENTAYLNYHDYTWAVLAYEWY HLA-B*27:02,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B*27:03,YHTEHREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:04,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B*27:05,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:06,YHTEYREICAKTDESTLYLNYDYYTWAELAYEWY HLA-B*27:07,YHTEYREICAKTDEDTLYLSYNYYTWAVLAYEWY HLA-B*27:08,YHTEYREICAKTDESNLYLNYHDYTWAVLAYEWY HLA-B*27:09,YHTEYREICAKTDEDTLYLNYHHYTWAVLAYEWY HLA-B*27:10,YHTEYREICAKTDEDTLYLNYHDYTWAELAYEWY HLA-B*27:11,YHTEYREICAKTDESTLYLSYNYYTWAVLAYEWY HLA-B*27:12,YHTEYREICTNTDESNLYLNYHDYTWAVLAYEWY HLA-B*27:13,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:14,YHTEYREICAKTDEDTLYWTYHDYTWAVLAYEWY HLA-B*27:15,YHTEYREICAKTDESTLYLNYHDYTWAELAYTWY HLA-B*27:16,YHTEYREICTNTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:17,YHTEFREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:18,YHTEYREISTNTYESNLYLNYHDYTWAELAYEWY HLA-B*27:19,YHTEYREICAKTDEDTLYIRYHDYTWAVLAYEWY HLA-B*27:20,YHTEYREICAKTDESTLYLNYNYYTWAELAYEWY HLA-B*27:21,YHTEYREICAKTDESTLYLRYDYYTWAELAYEWY HLA-B*27:23,YHTEYRNIFTNTYESTLYLNYHDYTWAVLAYEWY HLA-B*27:24,YHTEYREICAKTDESTLYLSYNYYSWAELAYEWY HLA-B*27:25,YHTEYREICAKTDESTLYLNYHDYTWAEWAYLWY HLA-B*27:26,YHTEYREICAQTDESNLYLNYHDYTWAVLAYEWY HLA-B*27:27,YHTEYREICAKTDEDTLYLNYNYYTWAVLAYEWY HLA-B*27:28,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYTWH HLA-B*27:29,YHTEYREISTNTYEDTLYLNYHDYTWAVLAYEWY HLA-B*27:30,YHTEYREICAKTDENIAYIRYHDYTWAVLAYEWY HLA-B*27:31,YHTEYREICAQTDESTLYLNYHDYTWAVLAYEWY HLA-B*27:32,YHTEYREICAKTDEDTLYLSYHDYTWAVLAYEWY HLA-B*27:33,YHTEYREICAKTDESNLYLSYNYYTWAVLAYEWY HLA-B*27:34,YHTEYREICAKTDEDTLYLSYDYYTWAVLAYEWY HLA-B*27:35,YHTEYREICAKTDEDTLYLNYNFYTWAVLAYEWY HLA-B*27:36,YHTEYREICAKTDESTLYLNYHDYSLAVLAYEWY HLA-B*27:37,YYTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:38,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYLWY HLA-B*27:39,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:40,YHTEYREICAKTDESNLYLNYHDYTWAELAYEWY HLA-B*27:41,YHTEYREICAKTDEDTLYLNYDSYTWAVLAYEWY HLA-B*27:42,YHTEYREICAKTDEDNLYLNYHDYTWAVLAYEWY HLA-B*27:43,YHTEYREICAKTDEDTLYLSYNYYTWAVLAYEWY HLA-B*27:44,YHTEYREICAKTYESNLYLNYHDYTWAVLAYEWY HLA-B*27:45,YHTEYREICAKTDEDTLYLNYHDYTWAVRAYEWY HLA-B*27:46,YHTEYREICAKTDEDTLYLNYHYYTWAVLAYEWY HLA-B*27:47,YHTEYREICAKTDEDTLYLNYHDYTWAVDAYLSY HLA-B*27:48,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:49,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:50,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYESY HLA-B*27:51,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:52,YHTTYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:53,YHTEYREICAKTDEDIAYLNYHDYTWAVLAYEWY HLA-B*27:54,YHTEYREICAKTDEDTLYLNYHDYTWAELAYEWY HLA-B*27:55,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:56,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:57,YHTEYREICAKTDENIAYLNYHDYTWAVLAYEWY HLA-B*27:58,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:60,YHTEYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:61,YHTEYREICAKTDESTLYLNYHDYTWAVLAYEWY HLA-B*27:62,YHTEYREICAKTDENIAYLNYHDYTWAVLAYTWH HLA-B*27:63,YHTEYREICAKTDESTLYLNYHDYTWAELAYLWY HLA-B*27:67,YHTMYREICAKTDEDTLYLNYHDYTWAVLAYEWY HLA-B*27:68,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B*27:69,YHTEYREICAKTDESTLYLNYHDYTWAELAYEWY HLA-B*35:01,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:02,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:03,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:04,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:05,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:06,YYATYRNIFTNTYESNLYIRYNFYTWAVLAYLWY HLA-B*35:07,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:08,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:09,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:10,YYATYREIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:11,YYATYRNIFTNTYESNLYIRYDSYTWAELAYLWY HLA-B*35:12,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:13,YYATYREIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:14,YYATYRNIFTNTYESNLYIRYDSYTWAEWAYLWY HLA-B*35:15,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYEWY HLA-B*35:16,YYATYREIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B*35:17,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B*35:18,YYATYRNIFTNTYESNLYIRYNYYTWAVRAYLWY HLA-B*35:19,YYAKYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:20,YYATYRNISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:21,YYATYRNIFTNTYESNLYIRYDSYTWAELAYLWH HLA-B*35:22,YYATYRNIFTNTYESNLYLSYNYYTWAVLAYLWY HLA-B*35:23,YYATYRNIFTNTYESNLYIRFDSYTWAVLAYLWY HLA-B*35:24,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWH HLA-B*35:25,YYSEYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:26,YYAEYRNICTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:27,YYATYRNIFTNTYENNLYIRYDSYTWAVLAYLWY HLA-B*35:28,YYATYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:29,YYATYRNIFTNTDESNLYIRYDSYTWAVLAYLWY HLA-B*35:30,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B*35:31,YYATYRNIFTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*35:32,YYATYRNIFTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*35:33,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYEWY HLA-B*35:34,YYATYRNIFTNTYESNLYIRYDYYTWAVLAYLWY HLA-B*35:35,YYATYRNIFTNTYESNLYIRYDSYTWAVLTYTWY HLA-B*35:36,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:37,YYATYRNIFTNTYESNLYWTYDSYTWAVLAYLWY HLA-B*35:38,YYATYRNIFTNTYESNLYIRYDFYTWAVDAYLWY HLA-B*35:39,YYATYRNIFTNTYESNLYIRYDYYTWAVLAYLWY HLA-B*35:41,YYATYRNIFTNTYESNLYIRYDSCTWAVLAYLWY HLA-B*35:42,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:43,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:44,YYATYRNIFTNTYESNLYLRYNYYTWAEWAYLWY HLA-B*35:45,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLSY HLA-B*35:46,YYAMYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:47,YYAKYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:48,YYATYRNIFTNTYESNLYIRSDSYTWAVLAYLWY HLA-B*35:49,YYAEYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:50,YHATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:51,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:52,YYATYRNIFTNTYECNLYIRYDSYTWAVLAYLWY HLA-B*35:54,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:55,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:56,YYATYRNIFTNTYENNLYIRYDFYTWAVLAYLWY HLA-B*35:57,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:58,YYATYRNIFTNTYESNLYLSYDSYTWAELAYLWY HLA-B*35:59,YYATYRNIFTNTYESNLYIRYNFYTWAVLAYLWY HLA-B*35:60,YYATYRNIFTNTYESNLYWTYNLYTWAVLAYTWY HLA-B*35:61,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:62,YYATYRNIFTNTYESNLYIRYDSYTWAVWAYLWY HLA-B*35:63,YHTKYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:64,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:66,YYATYRNIFTNTYESNLYLSYDSYTWAVRAYEWY HLA-B*35:67,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:68,YYATYRNIFTNTYESNLYLRYDSYTWAVLAYLWY HLA-B*35:69,YYATYREIFTNTDESNLYIRYDSYTWAVLAYLWY HLA-B*35:70,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:71,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLSY HLA-B*35:72,YYATYRNISTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:74,YYATYRNIFTNTYVSNLYIRYDFYTWAVLAYLWY HLA-B*35:75,YYATYRNIFTNTYESNLYLRYDFYTWAVLAYLWY HLA-B*35:76,YYATYRNIYAQTDESNLYIRYDSYTWAVLAYLWY HLA-B*35:77,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:78,YYATYRNIFANTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:79,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:80,YYATYREIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:81,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWH HLA-B*35:82,YYATYRNICTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:83,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:84,YHTTYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:85,YYATYRNICTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:86,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYEWY HLA-B*35:87,YYATYRNIFTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*35:88,YYATYRNIFTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*35:89,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:90,YYTTYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:91,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:92,YYATYRNIFTNAYESNLYIRYDSYTWAVLAYLWY HLA-B*35:93,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYTWY HLA-B*35:94,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:95,YYATYRNISTNTYESNLYIRYNYYTWAVLAYLWY HLA-B*35:96,YYATYRNIFTNTYESNLYIRYDFYTWAELAYTWH HLA-B*35:97,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:98,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:99,YYATYRNIFTNTYESNLYLRYDSYTWAERAYLWY HLA-B*35:100,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:101,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:102,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:103,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:104,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:105,YYATYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:106,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:107,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:108,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:109,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWH HLA-B*35:110,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:111,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:112,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:113,YYATYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B*35:114,YYATYRNIFTNTYESNLYLSYDSYTWAVLAYLWY HLA-B*35:115,YYATYRNIFTNTYESNLYIRYDSYTWAVDAYLWY HLA-B*35:116,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:117,YYATYRNIFTNTYESNLYLSYDSYTWAEWAYLWY HLA-B*35:118,YYATYRNIFTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:119,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:120,YYATYRNIFTNTYESNLYIRHDSYTWAVLAYLWY HLA-B*35:121,YYATYRNIFTNTYESNLYIRYHSYTWAVLAYLWY HLA-B*35:122,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:123,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:124,YYSTYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:125,YYSTYRNIFTNTYESNLYISYDSYTWAVLAYLWY HLA-B*35:126,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:127,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:128,YYATYRNIFTNTYESNLYIRYDFYTWAVLAYLWY HLA-B*35:131,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:132,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:133,YYATYRNIFTNTYESNLYIRYVSYTWAVLAYLWY HLA-B*35:135,YYATYRNICTNTYESNLYLRYDSYTWAEWAYLWY HLA-B*35:136,YYATYRNIFTNTDESNLYIRYDFYTWAVLAYLWY HLA-B*35:137,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:138,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:139,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:140,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:141,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:142,YYSTYRNIFTNTYESNLYIRYDSYTWAVRAYLWY HLA-B*35:143,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*35:144,YYATYRNIFTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*37:01,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:02,YHSTYREISTNTYEDTLYLNYHDYTWAVLAYEWY HLA-B*37:04,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWH HLA-B*37:05,YHSTYREISTNTYEDNLYIRSNFYTWAVDAYTWY HLA-B*37:06,YHSKYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:07,YHSTYREISTNTYEDTLYLSYDYYTWAERAYEWY HLA-B*37:08,YHSTYRNISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:09,YHSTYREISTNTYEDTLYLSYDYYTWAVDAYTWY HLA-B*37:10,YHSTYREISTNTYENTAYIRSNFYTWAVDAYTWY HLA-B*37:11,YHSTYREISTNTYESNLYIRSNFYTWAVDAYTWY HLA-B*37:12,YHSTYREISTNTYEDTLYIRYNYYTWAVDAYTWY HLA-B*37:13,YHSTYREISTNTYEDTLYIRSNFYTWAEDAYTWY HLA-B*37:14,YHSTYREISTNTYESNLYIRSNFYTWAVDAYTWY HLA-B*37:15,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:17,YHSTYREISTNTYEDTLYIRSNFYTWTVDAYTWY HLA-B*37:18,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:19,YHSTYREISTNTYEDTLYIRYNFYTWAVDAYTWY HLA-B*37:20,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:21,YHSTYREIFTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:22,YHATYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*37:23,YHSTYREISTNTYEDTLYIRSNFYTWAVDAYTWY HLA-B*38:01,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:02,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B*38:03,YYSEYREISTNTDESTAYLRYNFYTWAVLTYTWY HLA-B*38:04,YYSEYREICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B*38:05,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:06,YYSTYRNIFTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:07,YYSTYRNIFTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:08,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYMWY HLA-B*38:09,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:10,YYSEYRNICTNTYENIAYLRYNFYTWAELAYTWY HLA-B*38:11,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:12,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:13,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:14,YYSEYRNICTNTDENIAYLRYNFYTWAVLTYTWY HLA-B*38:15,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B*38:16,YYTEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:17,YYSEYRNICTNTYEDTLYLRYNFYTWAVLTYTWY HLA-B*38:18,YYSEYRNICTNTYENTAYLRYNFYTWAVLTYTWY HLA-B*38:19,YYSEYRNICTNTYENIAYLSYNFYTWAVLTYTWY HLA-B*38:20,YYSEYRNICTNTYENIAYIRYNFYTWAVLTYTWY HLA-B*38:21,YYSEYRNICTNTYENIAYLRYNFYTWAVLTYTWY HLA-B*38:22,YYSEYRNICTNTYENIAYLNYNFYTWAVLTYKWY HLA-B*38:23,YYSEYRNICTNTYENTAYFRYNFYTWAVLTYTWY HLA-B*39:01,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:02,YYSEYREISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:03,YYSEYRNICTNTDESNLYLSYNFYTWAVLTYTWY HLA-B*39:04,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:05,YYSEYRNICTNTYESNLYLRYNFYTWAVLTYTWY HLA-B*39:06,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY HLA-B*39:07,YYSEYRNICTNTYESNLYLRYDSYTWAVLTYTWY HLA-B*39:08,YYSEYREISTNTYESNLYLRYNFYTWAVRTYTWY HLA-B*39:09,YYSEYRNICTNTDESNLYLRSNFYTWAVLTYTWY HLA-B*39:10,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:11,YYSEYRNICTNTYESNLYLRYNFYTWAVRTYTWY HLA-B*39:12,YDSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:13,YYSEYREISTNTYESNLYLRYNFYTWAVLTYTWY HLA-B*39:14,YYSEYRNICTNTDESNLYLSYNYYTWAVLTYTWY HLA-B*39:15,YYSEYRNICTNTDESNLYLRYDFYTWAVLTYTWY HLA-B*39:16,YYSEYRNIYTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:17,YYSEYRNIYTNTDESNLYLRYNLYTWAVLTYTWY HLA-B*39:18,YYSEYRNICTNTDESNLYLRYNFYTWAEWTYTWY HLA-B*39:19,YYSTYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:20,YYSEYRNIYTNTYENNLYLRYNFYTWAVLTYTWY HLA-B*39:22,YYSEYREICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:23,YYSEYREISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:24,YYSEYRNICTNTDESNLYLSYNFYTWAVLTYTWY HLA-B*39:26,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:27,YYSEYRNICTNTDVSNLYLRYNFYTWAVLTYTWY HLA-B*39:28,YYSEYRNICTNTDESNLYLTYNFYTWAVLTYTWY HLA-B*39:29,YYSEYRNICTNTDESNLYLSYDYYTWAVLTYTWY HLA-B*39:30,YYSEYRNICTNTDESNLYLRYNFYTWAVLAYTWY HLA-B*39:31,YHSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:32,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYLWH HLA-B*39:33,YYSEYRNICTNTDESNLYWTYNFYTWAVRAYLWY HLA-B*39:34,YYSEYRNICTNTDESNLYWTYNFYTWAVLAYTWY HLA-B*39:35,YYSEYRNICTNTDESNLYLRYNFYTWAELTYTWY HLA-B*39:36,YYSEYRNICTNTDESNLYLRYNFYTWAEWAYTWY HLA-B*39:37,YYSEYRNICTNTYESNLYLSYNFYTWAVLTYTWY HLA-B*39:39,YYSEYRNISTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:41,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:42,YYSEYRNICTNTDESNLYIRYNFYTWAVLTYTWY HLA-B*39:43,YYSEYRNICTNTDESNLYLRYDSYTWAVLAYTWH HLA-B*39:44,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:45,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:46,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:47,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYEWY HLA-B*39:48,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWH HLA-B*39:49,YYSEYREISTNTYESNLYLRYDFYTWAVLTYTWY HLA-B*39:50,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYEWY HLA-B*39:51,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:52,YYSEYRNICTDTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:53,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:54,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:55,YYSEYRNICTNTYESNLYLRYDFYTWAVLTYTWY HLA-B*39:56,YYSEYRNICTNTYESNLYLRYNFYTWAVLTYTWY HLA-B*39:57,YYSEYRNICTNTDESNLYWTYNFYTWAVLTYTWY HLA-B*39:58,YYSEYRNIFTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:59,YYSEYRNICTNTDESNLYLRYNFYTWAVLTYTWY HLA-B*39:60,YYSEYRNICTNTDESNLYLRYNFYTWAALTYTWY HLA-B*40:01,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:02,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:03,YHTKYREISTNTYESNLYLSYDSYTWAVLAYEWY HLA-B*40:04,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*40:05,YHTKYREISTNTYESNLYLSYNYYTWAELAYLWY HLA-B*40:06,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:07,YHTKYREIFTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:08,YHTKYRNIFTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:09,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY HLA-B*40:10,YYAKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:11,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY HLA-B*40:12,YYSEYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:13,YHTKYREIFTNTYENIAYLSYNYYTWAVLAYEWY HLA-B*40:14,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY HLA-B*40:15,YHTKYREISTNTYESNLYLSYNYYTWAERAYEWY HLA-B*40:16,YHTKYREISTNTYESNLYLSYNYYTWAERAYEWY HLA-B*40:18,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY HLA-B*40:19,YHTKYREISTNTYENIAYLSYNYYTWAVLAYEWY HLA-B*40:20,YHTKYREISTNTYESNLYLRYDSYTWAVLAYEWY HLA-B*40:21,YYAMYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:23,YHTKYREISTNTYESNLYLRYNYYSWAERAYEWY HLA-B*40:24,YHTKYREISTNTYESNLYLSYDYYTWAVLAYEWY HLA-B*40:25,YHTKYRNISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:26,YHTKYREISTNTYESNLYLRYNYYTWAELAYLWY HLA-B*40:27,YHTKYREISTNTYESNLYLSYNNYTWAVLAYEWY HLA-B*40:28,YHTKYREISTNTYESNLYIRYNYYTWAELAYLWH HLA-B*40:29,YHTKYPEISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:30,YHTKYREISTNTYESNLYIVYNYYSLAVLAYEWY HLA-B*40:31,YHTKYREISTNTYESNLYLSYDYYSLAVLAYEWY HLA-B*40:32,YHTKYREISTNTYESNLYLSYDYYTWAERAYEWY HLA-B*40:33,YHTKYREISTNTYESNLYLRYDYYSLAVLAYEWY HLA-B*40:34,YHTKYREISTNTYESNLYIVYNYYSLAVLAYEWY HLA-B*40:35,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:36,YHTKYREISTNTYESNLYLRYNFYSLAVLAYEWY HLA-B*40:37,YHTKYREISTNTYENNLYLSYNYYTWAVLAYEWY HLA-B*40:38,YHTKYREISTNTYESNLYLRYNSYSLAVLAYEWY HLA-B*40:39,YHTKYREISTNTYESNLYLSYNYYTWAVLAYTWY HLA-B*40:40,YYTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:42,YHTKYREISTNTYESNLYLRYDYYSLAVLAYEWY HLA-B*40:43,YHTKYREISTNTDESNLYLRYNYYSLAVLAYEWY HLA-B*40:44,YHTKYREISTNTYESNLYWTYDYYTWAVLAYEWY HLA-B*40:45,YHTKYREISTNTYESNLYLSYNYYSWAVLAYEWY HLA-B*40:46,YHTEYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:47,YHTKYREISTNTYENTAYLRYNYYSLAVLAYEWY HLA-B*40:48,YHTKYREISTNTYESNLYLRYNLYSLAVLAYEWY HLA-B*40:49,YYTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:50,YHTKYREISTNTDESNLYLSYNYYTWAVLAYEWY HLA-B*40:51,YHTKYREISTNTYESNLYLRYNYYSWAELAYTWH HLA-B*40:52,YHTKYREISTNTYESNLYLRYDSYSLAVLAYEWY HLA-B*40:53,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:54,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:55,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:56,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:57,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:58,YYAKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:59,YHTKYREISTNTYESNLYIRYDSYSLAVLAYEWY HLA-B*40:60,YHTKYREISTNTYESNLYLRSDSYSLAVLAYEWY HLA-B*40:61,YHTKYREIYTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:62,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:63,YHTKYREISTNTYESNLYLRYNYYSLAVLAYLWY HLA-B*40:64,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*40:65,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:66,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:67,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:68,YHTKYRNIFTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*40:69,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:70,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:71,YHTKYREISTNTYESNLYLSYNLYTWAVLAYLWY HLA-B*40:72,YHTKYREISTNTYESNLYLRYNYYTLAVLAYEWY HLA-B*40:73,YHTKYREISTNTYVSNLYLRYNYYSLAVLAYEWY HLA-B*40:74,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:75,YHTKYREICTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:76,YHTKYREISTNTYESKLYLRYNYYSLAVLAYEWY HLA-B*40:77,YHTKYREISTNTYESNLYLRYNFYTLAVLAYEWY HLA-B*40:78,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:79,YHTKYREISTNTYESNLHLRYNYYSLAVLAYEWY HLA-B*40:80,YHTKYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*40:81,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:82,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:83,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:84,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:85,YHTKYREISTNTYESNLYLSYNYYIWAVLAYEWY HLA-B*40:86,YHTKYREISTNTYESNLYWTYNFYTWAVLAYEWY HLA-B*40:87,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:88,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:89,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:90,YHTKYREISTNTYESNLYLSYNYYTWAVLAHEWY HLA-B*40:91,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:92,YHTKYREISTNTYESNLYLRYNYYSLAVLAYLWY HLA-B*40:93,YHTEYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:94,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:95,YHTKYREISTNTYESNLYWTYNYYTWAELAYEWY HLA-B*40:96,YHTKYREISTNTYENTAYWTYNYYTWAVLAYEWY HLA-B*40:97,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:98,YHTKYREISTNTYESNLYLSYDYYTWAERAYEWY HLA-B*40:99,YHTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*40:100,YHTKYREISTNTYESNLYLRFNYYSLAVLAYEWY HLA-B*40:101,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:102,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:103,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:104,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:105,YHTKYREISTNTYESNLYLSYNSYTWAVLAYEWY HLA-B*40:106,YHTKYRNIFTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:107,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:108,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:109,YHTKYREISTNTYESIAYWTYNYYTWAVLAYEWY HLA-B*40:110,YYTKYREISTNTYENTAYWTYNYYTWAVLAYEWY HLA-B*40:111,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:112,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:113,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWH HLA-B*40:114,YHTKYREISTNTYESNLYLRYNYYSWAVLAYEWY HLA-B*40:115,YHTKYWEISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:116,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:117,YHTKYREISTNTYENIAYLRYNYYSLAVLAYEWY HLA-B*40:119,YHTKYREISTNTYDSNLYLSYNYYTWAVLAYEWY HLA-B*40:120,YHTKYREISTNTYESNLYIRYDYYTWAVLAYEWY HLA-B*40:121,YHTKYREISTNTYESNLYLRYNYYTWAVLAYEWY HLA-B*40:122,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:123,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:124,YHTKYREISTNTYESNLYLRYHDYSLAVLAYEWY HLA-B*40:125,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:126,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:127,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:128,YHTKYREISTNTYESNLYLRYNYYSLAVRAYEWY HLA-B*40:129,YYTKYREISTNTYESNLYIRYNYYTWAVLAYEWY HLA-B*40:130,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:131,YHTKYREISTNTYESNLYWTYNYYTWAVLAYEWY HLA-B*40:132,YHTKYREISTNTYESNLYLRYNYYSLAVLAYESY HLA-B*40:134,YHTKYREISTNIYESNLYLRYNYYSLAVLAYEWY HLA-B*40:135,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:136,YHTKYREISTNTYESNLYLRYNYYTWAVDAYEWY HLA-B*40:137,YYAMYREISTNTYESNLYIRYNYYSLAVLAYEWY HLA-B*40:138,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:139,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:140,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:141,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:143,YHTKYREISTNTYESNLYLSFNYYTWAVLAYEWY HLA-B*40:145,YHTKYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*40:146,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*40:147,YHTKYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*41:01,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B*41:02,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*41:03,YHTKYREISTNTYESNLYLRYNYYTWAVDAYTWY HLA-B*41:04,YHTKYREISTNTYESNLYLSYDYYTWAVDAYTWY HLA-B*41:05,YHTKYREISTNTYESKLYWRYNYYTWAVDAYTWY HLA-B*41:06,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B*41:07,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B*41:08,YHTKYREISTNTYESNLYLRYNYYTWAVDAYTWY HLA-B*41:09,YHTKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B*41:10,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*41:11,YHTKYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*41:12,YHAKYREISTNTYESNLYWRYNYYTWAVDAYTWY HLA-B*42:01,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:02,YHSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:04,YYSEYRNIYAQTDESNLYWTYNYYTWAVDAYTWY HLA-B*42:05,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:06,YYSEYRNIYAQTDESNLYLSYNFYTWAVDAYTWY HLA-B*42:07,YYSEYRNIYTNTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:08,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:09,YHSEYRNIYAQTDESNLYLSYDSYTWAVDAYTWY HLA-B*42:10,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:11,YYSEYREISTNTYESNLYLSYNYYTWAVDAYTWY HLA-B*42:12,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*42:13,YYSEYRNIYAQTDESNLYIRYNYYTWAVDAYTWY HLA-B*42:14,YYSEYRNIYAQTDESNLYLSYNYYTWAVDAYTWY HLA-B*44:02,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:03,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:04,YYTKYREISTNTYENTAYIRYDDYTWAVRAYTSY HLA-B*44:05,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B*44:06,YYATYRNIFTNTYENIAYIRYDDYTWAVDAYLSY HLA-B*44:07,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:08,YYTMYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:09,YYTKYREISTNTYESNLYIRYDDYTWAVDAYLSY HLA-B*44:10,YYTKYREISTNTYENTAYIRFNLYTWAVLAYLSY HLA-B*44:11,YYTKYREISTNTYENTPYIRYDDYTWAVDAYLSY HLA-B*44:12,YYTKYRNISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:13,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:14,YYTKYREISTNTYENTAYIRYNDYTWAVDAYLSY HLA-B*44:15,YHTKYREISTNTYESTAYWRYNLYTWAVDAYLSY HLA-B*44:16,YYTKYREISTNTYENTAYIRYDDYTWAVDAYEWY HLA-B*44:17,YYTKYREISTNTYENTAYIRYDSYTWAVDAYLSY HLA-B*44:18,YHTKYREISTNTYENIAYWRYNLYTWAVDAYLSY HLA-B*44:20,YYTKYREISTNTYENTAYWTYDDYTWAVDAYLSY HLA-B*44:21,YYTKYREISTNTYENTAYIRYDDYTWAVDAYESY HLA-B*44:22,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:24,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:25,YYTKYREISTNTYENIAYIRYDYYTWAVDAYLSY HLA-B*44:26,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:27,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:28,YYTKYREISTNTYENTAYIRYDDYTWAVRAYLSY HLA-B*44:29,YYTKYREISTNTYENTAYIRYDDYTWAVLTYLSY HLA-B*44:30,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:31,YYTKYREISTNTYENTAYLRYNYYSLAVLAYESY HLA-B*44:32,YYTKYPEISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:33,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:34,YYAKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:35,YYTKYREISTNTYENTAYIRYDDYTWAVEAYLSY HLA-B*44:36,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:37,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLWY HLA-B*44:38,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:39,YYPKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:40,YYTEYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:41,YYTKYREISTNTYENTAYLRYDDYTWAVDAYLSY HLA-B*44:42,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLWY HLA-B*44:43,YYTKYREISTNTYENTAYIRYDSYTWAVLAYLSY HLA-B*44:44,YYTEYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:45,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:46,YYTKYREISTNTYESNLYIRYDDYTWAVLAYLSY HLA-B*44:47,YYTKYREISTNTYENTAYWTYDDYTWAVLAYLSY HLA-B*44:48,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:49,YDTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:50,YYTKYREISTNTYENIAYIRYDDYTWAVLAYLSY HLA-B*44:51,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:53,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:54,YYTKYREISTNTYENTAYLSYDDYTWAVLAYLSY HLA-B*44:55,YHTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:57,YYTMYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:59,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:60,YYTMYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:62,YYTKYREISTNTYENTAYIRYNYYTWAVDAYLSY HLA-B*44:63,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:64,YYTKYREISTNTYENTAYIRYDDYTWAVLAYEWY HLA-B*44:65,YYTKYREISTNTYENTAYLRYDDYTWAVLAYLSY HLA-B*44:66,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:67,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:68,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:69,YYTKYWEISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:70,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B*44:71,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:72,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:73,YYTKYREISTNTYENTAYIRYDDYTWAVDGYLSY HLA-B*44:74,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:75,YYTKYREISTNTYENNLYIRYDYYTWAVDAYLSY HLA-B*44:76,YYTKYREISTNTYENTAYIRYDDYTWAERAYLSY HLA-B*44:77,YYTKYREISTNTYENTAYIRYNYYTWAVLAYLSY HLA-B*44:78,YYTKYREISTNTYENTAYIRYDYYTWAVDAYLSY HLA-B*44:79,YYTKYREISTNTYENTAYIRYDDYTWAELAYLSY HLA-B*44:80,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:81,YYTNYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:82,YYTKYREISTNTYENTAYIRYNYYTWAVLAYLSY HLA-B*44:83,YYATYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:84,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:85,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:86,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:87,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:88,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:89,YYTKYREISTNTYENTAYIRYDDYTWAVDTYLSY HLA-B*44:90,YYTKYREIYAQTDESNLYIRYDDYTWAVDAYLSY HLA-B*44:91,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLWY HLA-B*44:92,YYTKYREISTNTYENTAYIRYDDYTWAMLAYLSY HLA-B*44:93,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:94,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:95,YYTKYREISTNTYENIAYIRYDDYTWAVDAYLSY HLA-B*44:96,YYTKYREISTNTYENTAYIGYDDYTWAVLAYLSY HLA-B*44:97,YYTKYREICAKTDENTAYIRYDDYTWAVDAYLSY HLA-B*44:98,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:99,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:100,YYTKYREISTNTYENTAYWRYDDYTWAVDAYLSY HLA-B*44:101,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:102,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:103,YHTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:104,YYTKYREISTNTYENTAYIRYDDYTWAVDAYLSY HLA-B*44:105,YYTKYREISTNTYENTAYIRYDDYTWAVLAYLSY HLA-B*44:106,YYTKYREISTNTYENTAYLSYDDYTWAVDAYLSY HLA-B*44:107,YYTKYREISTNTYENTAYIRYDYYTWAVLAYLSY HLA-B*44:109,YYTKYREISTNTYESTAYIRYDDYTWAVLAYLSY HLA-B*44:110,YYTKYREISTNTYENTAYISYDDYTWAVLAYLSY HLA-B*45:01,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B*45:02,YHTKYREISTNTYESNLYWRYNFYTWAVDAYLSY HLA-B*45:03,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B*45:04,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLWY HLA-B*45:05,YHTKYREISTNTYESNLYWRYNLYTWAVDVYLSY HLA-B*45:06,YHTKYREIYAQTDESNLYWRYNLYTWAVDAYLSY HLA-B*45:07,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B*45:08,YHTKYREISTNTYESNLYWRYNLYTWAVDAYTWY HLA-B*45:09,YHTKYREISTNTYESNLYWRYDSYTWAVDAYLSY HLA-B*45:10,YHTKYREISTNTYESNLYWRYNLYTWAVDAYEWY HLA-B*45:11,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B*45:12,YHTKYREISTNTYESNLYWRYNLYTWAVDAYLSY HLA-B*46:01,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:02,YYAMYREKYRQTGVSNLYLRYDSYTWAEWAYLWY HLA-B*46:03,YYAMYREKYRQTDVSNLYLRYDSYTWAERAYTWY HLA-B*46:04,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:05,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:06,YYAMYREKYRQTDVSNLYLRYDSYSLAVLAYEWY HLA-B*46:08,YYAMYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-B*46:09,YYAMYREKYRQTDVSNLYLRYDSYTWAVWAYLWY HLA-B*46:10,YYTMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:11,YYAMYREKYRQTDVSNLYWTYNLYTWAVLAYLWY HLA-B*46:12,YYAMYREKYRQTDVSNLYLSYDSYTWAEWAYLWY HLA-B*46:13,YYAMYREKYRQTDVSNLYLRYDSYTWAVLAYLWY HLA-B*46:14,YHAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:16,YYAMYREKFRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:17,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLSY HLA-B*46:18,YYAMYREKYRQTDVSNLYWTYNLYTWAVLAYTWY HLA-B*46:19,YYAMYREKYRQTDVSNLYLRYDSYTWAVLTYLWY HLA-B*46:20,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:21,YYAMYREKYRQTDVSNLYLRYDSYTWAVLAYTWY HLA-B*46:22,YYAMYREKYRRTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:23,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*46:24,YYAMYREKYRQTDVSNLYLRYDSYTWAEWAYLWY HLA-B*47:01,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYEWY HLA-B*47:02,YYTKYREISTNTYESNLYLRFHDYTWAVLAYEWY HLA-B*47:03,YYTKYREISTNTYESNLYLRFHDYTWAVLAYEWY HLA-B*47:04,YYTKYREISTNTYENTAYLNYHDYTWAVLAYEWY HLA-B*47:05,YYTKYREISTNTYEDTLYLNYHDYTWAVLAYEWY HLA-B*47:06,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYEWY HLA-B*47:07,YYTKYREISTNTYEDTLYLRFHDYTWAVLAYEWY HLA-B*48:01,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:02,YYSEYREISTNTYESNLYIRYDSYTWAVLAYLWY HLA-B*48:03,YYSEYREISTNTYESNLYLRYNYYSLAVLAYEWY HLA-B*48:04,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:05,YYSEYREISTNTYESNLYLSYNYYTWAERAYEWY HLA-B*48:06,YYSEYRNIFTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:07,YYSEYREISTNTYESNLYLSYNFYSLAVLAYEWY HLA-B*48:08,YYSEYREISTNTYESNLYLSYDYYTWAERAYEWY HLA-B*48:09,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:10,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*48:11,YYSEYREISTNTYESNLYLSYNYYSLAVLAYELY HLA-B*48:12,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*48:13,YYSEYREISTNTYESNLYLSYNYYTWAVLAYEWY HLA-B*48:14,YYSEYREISTNTYESNLYLSYNSYTLAVLAYEWY HLA-B*48:15,YYSEYREISTNTYESNLYLSYNYYSLAELAYEWY HLA-B*48:16,YYSEYRVISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:17,YYSEYREISTNTYESNLYIRYNFYSLAVLAYEWY HLA-B*48:18,YYSEYREISTNTYESIAYLSYNYYSLAVLAYEWY HLA-B*48:19,YYSEYREISTNTYESNLYLSYNYYSLAVWAYEWY HLA-B*48:20,YYSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:21,YYSEYREISTNTYESNLYLNYNYYSLAVLAYEWY HLA-B*48:22,YHSEYREISTNTYESNLYLSYNYYSLAVLAYEWY HLA-B*48:23,YYSEYREISTNTYESNLYLRYDSYSLAVLAYEWY HLA-B*49:01,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B*49:02,YHTKYREISTNTYENTAYWRYNLYTWAELAYLWY HLA-B*49:03,YHATYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B*49:04,YHTKYREISTNTYENIAYWRYDSYTWAELAYLWY HLA-B*49:05,YHTKYREISTNTYENIAYWRYDSYTWAELAYLWY HLA-B*49:06,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B*49:07,YHTKYREISTNTYENIAYWRYNLYTWAELAYEWY HLA-B*49:08,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B*49:09,YHTKYREISTNTYENIAYWRYNLYTWAELAYLWH HLA-B*49:10,YYTKYREISTNTYENIAYWRYNLYTWAELAYLWY HLA-B*50:01,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:02,YHTKYREISTNTYESNLYWRYNLYTWAELAYLSY HLA-B*50:04,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:05,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:06,YHTRYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:07,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:08,YHTKYREISTNTYESNLYWRYNLYTWAELAYLWY HLA-B*50:09,YHTKYREISTNTYESNLYWRYNFYTWAELAYLWY HLA-B*51:01,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:02,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWY HLA-B*51:03,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLGH HLA-B*51:04,YYATYRNIFTNTYENIAYIRYNYYTWAELAYLWH HLA-B*51:05,YYATYRNIFTNTYENIAYWTYNYYTWAVRAYLWY HLA-B*51:06,YYATYRNIFTNTYENIAYLRYNYYTWAELAYLWH HLA-B*51:07,YYATYRNISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:08,YYATYRNIFTNTYENIAYWTYNYYTWAVDAYLWH HLA-B*51:09,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWH HLA-B*51:12,YYATYRNIFTNTYENIADWTYNYYTWAELAYLWH HLA-B*51:13,YYATYRNIFTNTYENIAYWTYNFYTWAELAYLWH HLA-B*51:14,YYATYRNIFTNTYENIAYWTYKYYTWAELAYLWH HLA-B*51:15,YYATYRNIFTNTYENIAYWTYNLYTWAVLAYLWY HLA-B*51:16,YYATYRNIFTNTYENIAYWTYNYYTWAELAYEWH HLA-B*51:17,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:18,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:19,YYATYRNIFTNTYENIAYWTYNYYTWAVLTYLWH HLA-B*51:20,YYATYRNIFTNTDENIAYWTYNYYTWAVDAYLWH HLA-B*51:21,YYATYRNIFTNTYENIAYWTYNYYTWAELAYTWH HLA-B*51:22,YYATYRNICTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:23,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLSY HLA-B*51:24,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:26,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:28,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:29,YYATYRNIFTNTYENIAYWTYNYYTWAERAYLWH HLA-B*51:30,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:31,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYEWH HLA-B*51:32,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:33,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:34,YYATYRNIFTNTYENIAYWTYNYYTWAELAYEWY HLA-B*51:35,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:36,YYATYRNIFTNTYENIAYWTYNYYTWAEDAYTWY HLA-B*51:37,YYATYRNIFTNTYENIAYWTYDSYTWAELAYLWH HLA-B*51:38,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:39,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:40,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWY HLA-B*51:42,YYATYRNIFTNTYENIAYIRYDDYTWAVLAYLSY HLA-B*51:43,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:45,YYATYRNIFTNTYENIAYLRYDSYTWAELAYLWH HLA-B*51:46,YYATYRNIFTNTYENIAYITYNYYTWAELAYLWH HLA-B*51:48,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:49,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:50,YYATYRNIFTNTYENGLYWTYNYYTWAELAYLWH HLA-B*51:51,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:52,YYATYRNIFTNTHENIAYWTYNYYTWAELAYLWH HLA-B*51:53,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:54,YYATYRNIFTNTYENTAYWTYNYYTWAVRAYLWY HLA-B*51:55,YYATYRNIFTNTYENIAYWTYNYYTWAEQAYLWH HLA-B*51:56,YYATYRNIFTNTYENIAYIRYNYYTWAELAYLWH HLA-B*51:57,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:58,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:59,YYATYRNIFTNTYENIAYLRYNYYTWAELAYLWY HLA-B*51:60,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:61,YYATYRNIFTNTYENIAYWTYNYYTWAEWAYLWH HLA-B*51:62,YYATYRNIFTNTYENIAYLRYNLYTWAELAYLWH HLA-B*51:63,YYATYRNIFTNTYENIAYWTYNSYTWAELAYLWH HLA-B*51:64,YYATYRNIFTNTYENIAYLSYNYYTWAELAYLWH HLA-B*51:65,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:66,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:67,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:68,YDATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:69,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:70,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:71,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:72,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:73,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYLWH HLA-B*51:74,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:75,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:76,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:77,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:78,YYATYRNIFTNTYENTAYWTYNYYTWAELAYLWH HLA-B*51:79,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:80,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:81,YYATYRNIFTNTYENIAYLSYNYYTWAVLAYEWY HLA-B*51:82,YYATYRNIFTNTYENIAYWTYNYYTWAERAYEWH HLA-B*51:83,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:84,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:85,YYATYRNIFTNTYENIAYWTYHDYTWAELAYLWH HLA-B*51:86,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:87,YYATYRNIFTNTYENIAYWTYNYYTWADLAYLWH HLA-B*51:88,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:89,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:90,YYATYRNIFTNTYENIAYWTYDYYTWAELAYLWH HLA-B*51:91,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:92,YYATYRNIFTNTYENIAYWTYDFYTWAELAYLWH HLA-B*51:93,YYATYRNIFTNTYENIAYWTYNYYTWAVLAYEWY HLA-B*51:94,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:95,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*51:96,YYATYRNIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:01,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:02,YYAMYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:03,YYATYREISTNTYENIAYWTYNYYTWAVLAYLWY HLA-B*52:04,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:05,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:06,YYATYREIFTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:07,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:08,YYATYREISTNTYENIAYWTYNYYTWAELAYEWH HLA-B*52:09,YYATYREISTNTYESIAYWTYNYYTWAELAYLWH HLA-B*52:10,YYATYREISTNTYENIAYWTYNYYTWAVLAYLWH HLA-B*52:11,YYATYREISTNTYENIAYWTYNYYTWAELAYLWY HLA-B*52:12,YYATYREISTNTYENIAYWTYDYYTWAELAYLWH HLA-B*52:13,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:14,YYATYREISTNTYENIAYWTYNFYTWAELAYLWH HLA-B*52:15,YYATYREISTNTYENIAYWTYNYYTWAELAYLSH HLA-B*52:16,YYSEYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:17,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:18,YYATYREISTNTYENIAYWTYNYYTWAELAYLWH HLA-B*52:19,YYATYREISTNTYENIAYWTYNYYTWAVDAYLWH HLA-B*52:20,YYATYREISTNTYENTAYWTYNYYTWAELAYLWH HLA-B*52:21,YYATYREISTNTYENIAYWTYNYYTWAEWAYLWH HLA-B*53:01,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:02,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWH HLA-B*53:03,YYATYRNIFTNTYEDTLYIRYDSYTWAVLAYLWY HLA-B*53:04,YYATYRNIFTNTYENIAYIRYDFYTWAVLAYLWY HLA-B*53:05,YYATYRNIFTNTYESIAYIRYDSYTWAVLAYLWY HLA-B*53:06,YYATYRNIFTNTYENIAYIRYDSYTWAELAYLWH HLA-B*53:07,YYATYRNIFTNTYENIAYIRSNFYTWAVLAYLWY HLA-B*53:08,YYATYRNIFTNTYENIAYIRYDSYTWAELAYLWY HLA-B*53:09,YYATYRNISTNTYENTAYIRYDSYTWAVLAYLWY HLA-B*53:10,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:11,YYATYRNIFTNTYENTAYIRYDSYTWAVRAYLWY HLA-B*53:12,YYATYRNIFTNTYESTAYIRYDSYTWAVLAYLWY HLA-B*53:13,YYATYRNIFTNTYENTAYIRYDSYTWAVLAYLWY HLA-B*53:14,YYATYRNIFTNTYENIAYLSYDSYTWAVLAYLWY HLA-B*53:15,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:16,YYATYRNIFTNTYESIAYIRYDSYTWAVRAYLWY HLA-B*53:17,YYATYREISTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:18,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:19,YYATYRNIFTNTYENIAYIRYNYYTWAVLAYLWY HLA-B*53:20,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:21,YYATYRNIFTNTYENIAYIRYDSYTWAVLAYLWY HLA-B*53:22,YYATYRNIFTNTYENIAYIRYDSYTWAVDAYLSY HLA-B*53:23,YYATYRNIFTNTDENIAYIRYDSYTWAVLAYLWY HLA-B*54:01,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:02,YHAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:03,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*54:04,YYAGYRNIYAQTDESNLYWTYNYYTWAVLAYTWY HLA-B*54:06,YYAGYRNIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B*54:07,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:09,YYAGYRNIYAQTDESNLYLRYDSYTWAVLAYTWY HLA-B*54:10,YYAGYRNIYAQTDESNLYWTYNLYTWAVRAYTWY HLA-B*54:11,YYAGYRNIYAQTDESNLYWTYNYYSWAVLAYTWY HLA-B*54:12,YYAGYRNIYAQTDENIAYWTYNLYTWAVLAYTWY HLA-B*54:13,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:14,YYAGYRNIYAQTDESNLYWTYDSYTWAVLAYTWY HLA-B*54:15,YYAGYRNIYAQTDESNLYWTYDYYTWAVLAYTWY HLA-B*54:16,YYAGYRNIYAQTDESNLYWTYDLYTWAVLAYTWY HLA-B*54:17,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:18,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:19,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:20,YYAGYRNIYAQTDESNLYWTYNLYTWAERAYTWY HLA-B*54:21,YYSGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*54:22,YYAGYRNIYAQTDESNLYWTYNLYSWAVLAYTWY HLA-B*54:23,YYAGYRNIYAQTEESNLYWTYNLYTWAVLAYTWY HLA-B*55:01,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:02,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:03,YYAEYRNIYAQTDVSNLYWTYNLYTWAELAYTWY HLA-B*55:04,YYAEYRNIYAQTDESNLYLSYNYYTWAVLAYTWY HLA-B*55:05,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:07,YYAGYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:08,YYAEYRNIYAQTDESNLYLRYNYYTWAVLAYLWY HLA-B*55:09,YYAEYRNIYAQTDESNLYWTYNLYTWAERAYEWY HLA-B*55:10,YYSEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:11,YYAEYRNIYAQTDESNLYWMYNLYTWAELAYTWY HLA-B*55:12,YYAEYRNIYAQTDENNLYWTYNLYTWAVLAYTWY HLA-B*55:13,YYAEYRNIYAQTDESNLYWTYNFYTWAVLAYTWY HLA-B*55:14,YYAEYRNIYAQTDESNLYIVYDSYTWAELAYTWY HLA-B*55:15,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:16,YHAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:17,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYTWY HLA-B*55:18,YYAEYREISTNTYESNLYWTYNLYTWAVLAYTWY HLA-B*55:19,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:20,YYAEYRNIYAQTDESNLYWTYNYYTWAVDAYTWY HLA-B*55:21,YYAEYRNIYAQTDESNLYWTYNLYTWAEWAYTWY HLA-B*55:22,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYEWY HLA-B*55:23,YYAEYRNIYAQTDESNLYWTYDSYTWAVLAYTWY HLA-B*55:24,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYEWY HLA-B*55:25,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:26,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:27,YYAEYRNIYAQTDESNLYWTYDYYTWAVLAYTWY HLA-B*55:28,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYTWY HLA-B*55:29,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:30,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:31,YYAEYRNIYAQTYESNLYWTYNLYTWAELAYTWY HLA-B*55:32,YYAEYRNIYAQTDESNLYWTYNSYTWAVLAYTWY HLA-B*55:33,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:34,YYAEYREISAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:35,YYAMYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:36,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:37,YYAEYRNIYAQTDESNLYWTYNLYTWAVRAYTWY HLA-B*55:38,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:39,YYAEYRNIYAQTDESNLYWTYNLHTWAVLAYTWY HLA-B*55:40,YYAEYREIYAQTDESNLYWTYNLYTWAELAYTWY HLA-B*55:41,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:42,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*55:43,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYTWY HLA-B*56:01,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:02,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYLWY HLA-B*56:03,YYAEYRNIYAQTDESNLYLRYDSYTWAEWAYLWY HLA-B*56:04,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYLWY HLA-B*56:05,YYAEYRNIYAQTDESNLYWTYNYYTWAELAYLWH HLA-B*56:06,YYATYRNIYAQTDESNLYWTYNYYTWAELAYLWH HLA-B*56:07,YYAEYRNIYAQTDENTAYWTYNLYTWAVLAYLWY HLA-B*56:08,YYAEYREKYGQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:09,YYAEYRNIYAQTDESNLYIRYDSYTWAVLAYLWY HLA-B*56:10,YYAEYRNIYAQTDESNLYLRYNLYTWAVLAYTWY HLA-B*56:11,YYAEYRNIYAQTDESNLYIRYDFYTWAVLAYLWY HLA-B*56:12,YYAEYRNIYAQTDESNLYIRYNYYTWAVLAYTWY HLA-B*56:13,YYAEYRNIYAQTDESNLYWTYNLYTWAVDAYLWY HLA-B*56:14,YYAEYREKYRQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:15,YYAEYRNIYAQTDESNLYWTYNYYTWAVLAYLWY HLA-B*56:16,YYSEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:17,YYAEYRNIYANTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:18,YYAEYRNIYAQTDESNLYLRYDSYTWAVLAYTWY HLA-B*56:20,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:21,YYAEYRNIYAQTDENIAYWTYNYYTWAELAYLWH HLA-B*56:22,YYAEYRNIYAQTDESNLYWTYNFYTWAVLAYLWY HLA-B*56:23,YYAEYRNIYANTYESNLYWTYNLYTWAVLAYTWY HLA-B*56:24,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:25,YYAEYRNIYAQTDESNLYWTYNLYTWAELAYLWY HLA-B*56:26,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:27,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*56:29,YYAEYRNIYAQTDESNLYWTYNLYTWAVLAYLWY HLA-B*57:01,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:02,YYAMYGENMASTYENIAYIVYNYYTWAVRAYLWY HLA-B*57:03,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY HLA-B*57:04,YYAMYGENMASTYENIAYIVYDDYTWAVRAYLWY HLA-B*57:05,YYAMYGENMASTYENIAYIRYNYYTWAVRAYLWY HLA-B*57:06,YYAMYGENMASTYENIAYIVYDSYIWAVLAYLWY HLA-B*57:07,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLSY HLA-B*57:08,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:09,YYAMYGENMASTYENIAYIVYNYYTWAEDAYLWY HLA-B*57:10,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:11,YYAMYGENMASTYENIAYLWYDSYTWAVLAYLWY HLA-B*57:12,YYAMYGENMASTYESNLYIVYNYYTWAVRAYLWY HLA-B*57:13,YYAMYGENMASTYENIAYIVYDSYTWAERAYEWY HLA-B*57:14,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWH HLA-B*57:15,YYAMYGENVASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:16,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:17,YYAMYGENMASTYENIAYIVYNYYTWAVLAYLWY HLA-B*57:18,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:19,YYAMYGENMASTYENIAYIVYDSYTWAVRAYLWY HLA-B*57:20,YYAMYGKNMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:21,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:22,YYAMYGENMASTYENIAYIVYDSYTWAELAYLWY HLA-B*57:23,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:24,YYAMYGENMASTYENIAYIVYDSYTWAVDAYLWY HLA-B*57:25,YYAMYGENMASTYENIAYIVYDSYTWAVLAYEWY HLA-B*57:26,YYAMYGENMASTYENIAYIVYDSYTWAVLAYTWY HLA-B*57:27,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:29,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:30,YYAMYGENMASTYENIAYIVYDSYTWAARAYLWY HLA-B*57:31,YYAMYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*57:32,YYAMYGENMASTYENIAYIVYHDYTWAVLAYLWY HLA-B*58:01,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:02,YYATYGENMASTYENIAYLWYDSYTWAVLAYLWY HLA-B*58:04,YYATYEENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:05,YYATYGENMASTYENIAYIRYDSYTLAALAYTWY HLA-B*58:06,YYATYGENMASTYENIAYLWYDSYTWAELAYLWY HLA-B*58:07,YYATYGENMASTYENIAYLWYDSYTWAVLAYLSY HLA-B*58:08,YYATYGENMASTYENIAYWTYNYYTWAELAYLWH HLA-B*58:09,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWH HLA-B*58:11,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:12,YYSTYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:13,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:14,YYATYGENMASTYENIAYIVYDSYTWAVLAYLWY HLA-B*58:15,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:16,YYATYGENMASTYENIAYLRYDSYTWAVLAYLWY HLA-B*58:18,YYATYGENMASTYENIAYLSYDSYTWAVLAYLWY HLA-B*58:19,YYATYGENMASTYENIAYIRYDSYTWAELAYLWY HLA-B*58:20,YYATYGENMASTYENIAYLRYNFYTWAVLTYTWY HLA-B*58:21,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:22,YYATYGENMASTYENIAYIRYDSYTWAVRAYLWY HLA-B*58:23,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:24,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:25,YYATYGENMASTYENIAYLWYDSYTWAVLAYLWY HLA-B*58:26,YYATYGENMASTYENIAYLRYDSYTWAVLAYLWY HLA-B*58:27,YYATYGENMASTYENIAYLSYNYYTWAVLAYEWY HLA-B*58:28,YYATYGENMASTYENIAYIRYNYYTWAVLAYLWY HLA-B*58:29,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*58:30,YYATYGENMASTYENIAYIRYDSYTWAVLAYLWY HLA-B*59:01,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYTWY HLA-B*59:02,YYAEYRNIFTNTYENIAYWTYNYYTWAVLAYTWY HLA-B*59:03,YYAEYRNIFTNTYENIAYWTYNFYTWAVLAYTWY HLA-B*59:04,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYLWY HLA-B*59:05,YYAEYRNIFTNTYENIAYWTYNLYTWAVLAYTWY HLA-B*67:01,YYSEYRNIYAQTDESNLYLRYNFYTWAVLTYTWY HLA-B*67:02,YYSGYREKYRQADVSNLYLRYNFYTWAVLTYTWY HLA-B*73:01,YHTEYRNICAKTDVGNLYWTYNFYTWAVLAYEWH HLA-B*73:02,YHTEYRNICAKTDVGNLYWTYNFYTWAVLAYEWH HLA-B*78:01,YYATYRNIFTNTDESNLYWTYNYYTWAELAYLWH HLA-B*78:02,YYATYRNIFTNTYESNLYWTYNYYTWAELAYLWH HLA-B*78:03,YYATYRNICTNTDESNLYWTYNYYTWAELAYLWH HLA-B*78:04,YYATYRNIFTNTYESNLYWTYNYYTWAVLAYLWY HLA-B*78:05,YYATYREISTNTYESNLYWTYNYYTWAELAYLWH HLA-B*78:06,YYATYREISTNTYENNLYWTYNYYTWAELAYLWH HLA-B*78:07,YYATYRNIFTNTDESNLYWTYNYYTWAELAYTWH HLA-B*81:01,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY HLA-B*81:02,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY HLA-B*81:03,YYSEYRNIYAQTDESNLYLSYNYYSLAVLAYEWY HLA-B*81:05,YYSEYRNIFAQTDESNLYLSYNYYSLAVLAYEWY HLA-B*82:01,YYSEYRNIYAQTDESNLYLRFNLYTWAVDAYLSY HLA-B*82:02,YYSEYRNIYAQTDESNLYLRFNLYTWAVDAYLSY HLA-B*82:03,YYSEYRNIYAQTDESNLYLRYNLYTWAVDAYLSY HLA-B*83:01,YYSEYRNIYAQTDESNLYIRYDDYTWAVDAYLSY HLA-C*01:02,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:03,YFSGYREKYRQTDVSNLYLWCNFYTWAERAYTWY HLA-C*01:04,YFSGYREKYRQTDVSNLYLWCDSYTWAEWAYTWY HLA-C*01:05,YFSGYREKYRQTDVSNLYLRSDYYTWAERAYTWY HLA-C*01:06,YFSGYREKYRQTDVSNLYLWCDYYTWAVRAYTWY HLA-C*01:07,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:08,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:09,YFSGYREKYRQTDVSNLYLWCDYYTWAEWAYTWY HLA-C*01:10,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYEWY HLA-C*01:11,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:12,YFSGYREKYRQTDVSNLYLWYDYYTWAERAYTWY HLA-C*01:13,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:14,YFSGYREKYRQTDVNKLYLWCDYYTWAERAYTWY HLA-C*01:15,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:16,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:17,YFSGYREKYRQADVSNLYLWCDYYTWAERAYTWY HLA-C*01:18,YFSGYREKYHQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:19,YFSGYREKYRQTDVCNLYLWCDYYTWAERAYTWY HLA-C*01:20,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:21,YFSGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*01:22,YFSGYREKYRQTDVSNLYLWCDYYTWAELAYTWY HLA-C*01:23,YFSGYREKYRQADVSNLYLWCDYYTWAERAYTWY HLA-C*01:24,YFSGYREKYRQTDVSNLYLWCNFYTWAERAYTWY HLA-C*01:25,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:26,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:27,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:28,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:29,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTCY HLA-C*01:30,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWH HLA-C*01:31,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYMWY HLA-C*01:32,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:33,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:34,YFSGYREKYRQTDVSNLYLWYNFYTWAERAYTWY HLA-C*01:35,YFSGYREKYRQTDVSNLYLWCDYYTWAELAYLWY HLA-C*01:36,YFSGYREKYRQTDVSNLYLRFDYYTWAERAYTWY HLA-C*01:38,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:39,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*01:40,YFSGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*02:02,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:03,YYAGYREKYRQTDVNKLYLRYDSYTWAVLAYEWY HLA-C*02:04,CYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:05,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYEWY HLA-C*02:06,YYAGYREKYRQTDVNKLYLRYDLYTWAEWAYEWY HLA-C*02:07,YYAGYREKYRQTDVNKLYLRYHDYTWAEWAYEWY HLA-C*02:08,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:09,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:10,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:11,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:12,YYAGYREKYRQADVSKLYLRYDSYTWAEWAYEWY HLA-C*02:13,YYAGYREKYRQTDVNKLYLRYDSYTWAAWAYEWY HLA-C*02:14,YDAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:15,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:16,YYAGYREKYRQTDVNKLYLRYDSYTWAELAYEWY HLA-C*02:17,YYAGYREKYRQTDVNKLYLWFDSYTWAEWAYEWY HLA-C*02:18,YYAGYREKYRQTDVNKLYLRYDSYTWAALAYEWY HLA-C*02:19,YYAGYREKYRQTDVNKLYLRYDYYTWAEWAYEWY HLA-C*02:20,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:21,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:22,YYAGYREKYRQTDVNKLYLRYNFYTWAEWAYEWY HLA-C*02:23,YYAGYREKYRQTDVNKLYLRYDYYTWAEWAYEWY HLA-C*02:24,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:26,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:27,YYAGYREKYRQTDVSNLYLRYDSYTWAEWAYEWY HLA-C*02:28,YYAGYREKYRQTDVNKLYLRYDSYTWAVWAYEWY HLA-C*02:29,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:30,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:31,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:32,YYAGYREKYRQTDVNKLYLRYDSYTWAERAYEWY HLA-C*02:33,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:34,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:35,YYAGYREKYRQTDVNKLHLRYDSYTWAEWAYEWY HLA-C*02:36,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:37,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:39,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*02:40,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYEWY HLA-C*03:01,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C*03:02,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C*03:03,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:04,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:05,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYLWY HLA-C*03:06,YYAGYREKYRQTDVSNLYIRYVYYTWAELAYLWY HLA-C*03:07,YYAGYREKYRQTDVNKLYIRYDYYTWAELAYLWY HLA-C*03:08,YYAGYRENYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:09,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:10,YYAGYREKYRQTDVSKLYIRYDYYTWAELAYLWY HLA-C*03:11,YYSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:12,YYAGYREKYRQTDVSNLYIRYDLYTWAELAYLWY HLA-C*03:13,YYAGYREKYRQTDVSNLYLRYDYYTWAELAYLWY HLA-C*03:14,YYAGYREKYRQTDVSNLYIRYDSYTLAALAYTWY HLA-C*03:15,YYAGYREKYRQADVNKLYLRYDSYTWAELAYLWY HLA-C*03:16,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYTWY HLA-C*03:17,YYAGYREKYRQTDVSNLYLWYDYYTWAELAYLWY HLA-C*03:18,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:19,YYAGYREKYRQTDVSNLYIRYDLYTWAELAYLWY HLA-C*03:21,YYAGYREKYRQTDVSNLYIRYDYYTWAEWAYTWY HLA-C*03:23,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:24,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:25,YYAGYREKYRQTDVSNLYLSYDYYTWAELAYLWY HLA-C*03:26,YYAGYREKYRQTDVSNLYIRYDFYTWAELAYLWY HLA-C*03:27,YYAGYREKYRQADVSNLYLSYDYYTWAELAYLWY HLA-C*03:28,YYAGYREKYRQTDVSNLYIRYDYYTWAERAYLWY HLA-C*03:29,YYAGYRENYRQTDVSKLYIRYDYYTWAELAYLWY HLA-C*03:30,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:31,YYAGYRENYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:32,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:33,YYAGYREKYRQTDVSNLCLRYDSYTWAELAYLWY HLA-C*03:34,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYEWY HLA-C*03:35,YYAGYREKYRQTDVSNLYLRYDYYTWAELAYLWY HLA-C*03:36,YYAGYREKYRQTDVSNLYLRYDSYTWAVLAYLWY HLA-C*03:37,YYSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:38,YYAGYREKYRQADVSNLYIRYDYYTWAELAYLWY HLA-C*03:39,YDSGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:40,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY HLA-C*03:41,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:42,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY HLA-C*03:43,YYAGYREKYRQTDVSNLYIRYDSYTWAELAYLWY HLA-C*03:44,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:45,YYAGYREKYRQTDVNKLYIRYDYYTWAELAYLWY HLA-C*03:46,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:47,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:48,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:49,YYAGYREKYRQTDVSNLYIRYDYYTWAERAYLWY HLA-C*03:50,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:51,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWH HLA-C*03:52,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:53,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:54,YYAGYREKYRQTDVSNLYIRYDYYTWAELPYLWY HLA-C*03:55,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYTWY HLA-C*03:56,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:57,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:58,YYAGYREKYRQTDVSNLYLWCNFYTWAERAYTWY HLA-C*03:59,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:60,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C*03:61,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:62,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:63,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:64,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:65,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:66,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:67,YDAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:68,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:69,YYAGYREKYRQADVSNLYIRYDYYTWAELAYLWY HLA-C*03:70,YYAGYREKYRQTDESNLYIRYDYYTWAELAYLWY HLA-C*03:71,YYAGYREKYRQTDVSNLYLWYDSYTWAELAYLWY HLA-C*03:72,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:73,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:74,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:75,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:76,HYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:77,YYAGYREKYRQTDVSNLYIRYDYYTWAVLAYLWY HLA-C*03:78,YYAGYREKYRQTDVSNLYIRYDYYTWAEMAYLWY HLA-C*03:79,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:80,YYAGYREKYRQTDVSNLYIRYDYYTWAEWAYTWY HLA-C*03:81,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:82,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:83,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:84,YYAGYREKYRQTDVSNLYLRYDSYTWAELAYLWY HLA-C*03:85,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:86,YYAGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*03:87,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:88,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:89,YYAGYREKYRQTDVSNLYLRFDSYTWAELAYLWY HLA-C*03:90,YYAGYREKYRQTDVSNLYIRSDYYTWAELAYLWY HLA-C*03:91,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:92,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYTWY HLA-C*03:93,YYAGYREKYRQTDVSNLYIRYDYYTWAELAYLWY HLA-C*03:94,YYAGYREKYRQTDVSNLYLWCDYYTWAERAYTWY HLA-C*04:01,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:03,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:04,YSAGYREKYRQADVNKLYLRFNFYTWAELAYTWY HLA-C*04:05,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:06,YYAGYREKYRQADVNKLYLRFNFYTWAELAYTWY HLA-C*04:07,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:08,YSAGYREKYRQADVNKLYLRFNFYTWAERAYLWY HLA-C*04:10,YSAGYREKYRQTDVNKLYLRFNFYTWAERAYTWY HLA-C*04:11,YSAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C*04:12,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:13,YSAGYREKYRQADVNKLYLRFNFYTWAALAYTWY HLA-C*04:14,YSAGYREKYRQADVNKLYLRFNFYTWAEQAYTWY HLA-C*04:15,YSAGYREKYRQADVNKLYLRYNFYTWAERAYTWY HLA-C*04:16,YYAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:17,YSAGYREKYRQADVNKLYLRYNFYTWAERAYTWY HLA-C*04:18,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:19,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:20,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:23,YSAGYREKYRQADVNKLYLRFDFYTWAERAYTWY HLA-C*04:24,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:25,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:26,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:27,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:28,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:29,YSAGYREKYRQADVSNLYLRFNFYTWAERAYTWY HLA-C*04:30,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:31,YSAGYREKYRQADVNKLYLRFNFYTWVERAYTWY HLA-C*04:32,YSAGYREKYRQADVNKLYLRFNFYTWAERAYEWY HLA-C*04:33,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:34,YSAGYREKYRQADVNKLYLRFNFYTWAVLAYLWY HLA-C*04:35,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:36,YSAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C*04:37,YSAGYREKYRQADVNKLYLWCNFYTWAERAYTWY HLA-C*04:38,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:39,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:40,YSAGYREKYRQADVNKLYFRFNFYTWAERAYTWY HLA-C*04:41,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:42,YDAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:43,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:44,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:45,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:46,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:47,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:48,YSAGYREKYRQADVNKLYLRFNFYTWAERPYTWY HLA-C*04:49,YSAGYWEKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:50,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:51,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:52,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:53,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:54,YSAGYREKYRQADVNKLYLRFDSYTWAERAYTWY HLA-C*04:55,YSAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C*04:56,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:57,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:58,YSAGYREKYRQADVNKLYLRFNFYTLAALAYTWY HLA-C*04:60,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:61,YSAGYREKYRQADVNKLYLRFNFYTWAARAYTWY HLA-C*04:62,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:63,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:64,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:65,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:66,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:67,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:68,YSAGYREKYRQADVNKLYLRFNFYTWAAQAYTWY HLA-C*04:69,YSAGYGEKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*04:70,YSAGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*05:01,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:03,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:04,YYAGYREKYRQTDVNKLYLRYDSYTWAERAYTWY HLA-C*05:05,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:06,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:08,YYAGYREKYRQTDVNKLYLRYNFYTWAEWAYTWY HLA-C*05:09,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:10,YYAGYREKYRQTDVNKLYIRYNFYTWAERAYTWY HLA-C*05:11,YYAGYREKYRQTDVNKLYLRYNFYTWAELAYTWY HLA-C*05:12,YYAGYREKYRQTDVNKLYLRYNFYTWAVRAYTWY HLA-C*05:13,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:14,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:15,YYAGYWEKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:16,YYAGYREKYRQTDVNKLYLWYNFYTWAERAYTWY HLA-C*05:17,YYAGYREKYRQTDVNKLYLRYNFYTWAALAYTWY HLA-C*05:18,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:19,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:20,YYAGYREKYRQTDVNNLYLRYNFYTWAERAYTWY HLA-C*05:21,YYAGYREKYRQTDVNKLHLRYNFYTWAERAYTWY HLA-C*05:22,YYAGYREKYRQTDVNKLYLRYDFYTWAERAYTWY HLA-C*05:23,YYAGYREKYRQTDVNKLYLRYNFYTLAERAYTWY HLA-C*05:24,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:25,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:26,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:27,YYAGYREKYRQTDVNKLYLRYNFYTWAELAYLWY HLA-C*05:28,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:29,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:30,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:31,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:32,YYAGYREKYRQTDVNRLYLRYNFYTWAERAYTWY HLA-C*05:33,YYAGCREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:34,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:35,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:36,YYAGYRENYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:37,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:38,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:39,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYLWY HLA-C*05:40,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:41,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:42,YYAGYREKYRQADVNKLYLRYNFYTWAERAYTWY HLA-C*05:43,YDAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:44,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*05:45,YYAGYREKYRQTDVNKLYLRYNFYTWAERAYTWY HLA-C*06:02,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:03,YYSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:04,YDSGYREKYRQADVNKLYLWYDSYTWAELAYTWY HLA-C*06:05,YDSGYREKYRQTDVNKLYLWYDSYTWAERAYTWY HLA-C*06:06,YDSGYREKYRQADVNKLYLWYDSYTWAERAYTWY HLA-C*06:07,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:08,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYEWY HLA-C*06:09,YDSGYREKYRQADVNKLYLWYNFYTWAEWAYTWY HLA-C*06:10,YDPGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:11,YDSGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*06:12,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:13,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:14,YDSGYREKYRQADVNKLYIWYDSYTWAEWAYTWY HLA-C*06:15,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:17,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:18,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:19,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:20,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:21,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:22,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:23,YDSGYREKYRQADVNKLYLWCDSYTWAEWAYTWY HLA-C*06:24,YDSGYREKYRQADVNKLYLWYDSYTWAEWAHTWY HLA-C*06:25,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:26,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:27,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:28,YDAGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:29,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:30,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:31,YDSGYREKYRQADVNKLYLWYDSYTWAAWAYTWY HLA-C*06:32,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:33,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:34,YDSGYREKYRQADVNKLYLWYDFYTWAEWAYTWY HLA-C*06:35,YDSGYREKYRQADVNKLYIRSDSYTWAEWAYTWY HLA-C*06:36,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:37,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:38,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:39,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:40,YDSGYREKYRQADVNKLYLWYDSYTWAEWTYTWY HLA-C*06:41,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:42,YDSGYREKYRQADVNKLYLWYDSYTRAEWAYTWY HLA-C*06:43,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*06:44,YDSGYRENYRQTDVNKLYLWYDSYTWAEWAYTWY HLA-C*06:45,YDSGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*07:01,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:02,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:03,YDSGYREKYRQADVSNLYLRSDSYTWAALAYLWY HLA-C*07:04,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:05,YDSGYREKYRQADVSNLYLNYDSYTLAALAYTWY HLA-C*07:06,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:07,YDSGYRENYRQADVNKLYLRYDSYTLAALAYTWY HLA-C*07:08,YDSGYREKYRQADVSNLYLRFDSYTLAALAYTWY HLA-C*07:09,YDSGYRENYRQADVNKLYLRYDSYTLAALAYTWY HLA-C*07:10,YDSGYREKYRQADVSNLYIRSDSYTLAALAYTWY HLA-C*07:11,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:12,YDSGYREKYRQADVSNLYFRYDFYTWAADAYTWY HLA-C*07:13,YDSGYREKYRQADVSNLYLRSDFYTLAALAYTWY HLA-C*07:14,YDSGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:15,YDSGYREKYRQADVSNLYLRSDSYTLAALAYEWY HLA-C*07:16,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:17,YDSGYREKYRQADVSNLYLRSDSYTWAALAYTWY HLA-C*07:18,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:19,YDSGYRENYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:20,YDAGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:21,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:22,YDSGYRENYRQADVSNLYLRYDSYTLAAWAYTWY HLA-C*07:23,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:24,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:25,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:26,YYSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:27,YDSGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:28,YDSGYRENYRQADVSNLYLRYNFYTLAALAYTWY HLA-C*07:29,YDSGYREKYRQADVSNLYLRSDYYTLAALAYTWY HLA-C*07:30,YDSGYRENYRQADVSNLYLRYDSYTLAGLAYTWY HLA-C*07:31,YDSGYREKYRQADVSNLYLWYDSYTLAALAYTWY HLA-C*07:35,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:36,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:37,YDSGYREKYRQADVSNLYLRSDSYTLAARAYTWY HLA-C*07:38,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:39,YDSGYREKYRQTDVSNLYLRSDSYTLAALAYTWY HLA-C*07:40,YDSGYRENYRQTDVSNLYLRYDSYTLAALAYTWY HLA-C*07:41,YDSGYREKYRQADVSNLYLRYNFYTWAERAYTWY HLA-C*07:42,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:43,YDSGYREKYRQADVSNLYIRYDSYTLAALAYTWY HLA-C*07:44,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:45,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:46,YDSEYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:47,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:48,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:49,YDSGYREKYRQADVNNLYLRSDSYTLAALAYTWY HLA-C*07:50,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:51,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:52,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:53,YDSGYRENYRQADVSNLYLRYDSYTLAAQAYTWY HLA-C*07:54,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:56,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:57,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:58,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:59,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:60,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:62,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:63,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:64,YSAGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:65,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:66,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:67,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:68,YDSGYREKYRQADVSNLYLRSDSYTLAADAYTWY HLA-C*07:69,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:70,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:71,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:72,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:73,YDAGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:74,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:75,YDSGYREKYRQADVSNLHLRSDSYTLAALAYTWY HLA-C*07:76,YDSGYREKYRQADVNKLYLRSDSYTLAALAYTWY HLA-C*07:77,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:78,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:79,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:80,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:81,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:82,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:83,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:84,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:85,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:86,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:87,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:88,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:89,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:90,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:91,YDSGYRENYRQADVSNLYLRYDSYTLTALAYTWY HLA-C*07:92,YYAGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:93,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:94,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:95,YDSGYRENYRQADVSNLYLRYDSYTLAVLAYTWY HLA-C*07:96,YYAGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:97,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:99,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:100,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:101,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:102,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:103,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:105,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:106,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:107,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:108,YDSGYRENYRQADVSNLYLRFDSYTLAALAYTWY HLA-C*07:109,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:110,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:111,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:112,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:113,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:114,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:115,YDSGYRENYRQADVSDLYLRYDSYTLAALAYTWY HLA-C*07:116,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:117,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:118,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:119,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:120,YDSGYRENYRQADVSNLYLRYDSYTLAALAYPWY HLA-C*07:122,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:123,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:124,YDSGYRENYRQADESNLYLRYDSYTLAALAYTWY HLA-C*07:125,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:126,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:127,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:128,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:129,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:130,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:131,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:132,DDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:133,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:134,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:135,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:136,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:137,YDSGYREKYRQADVSNLYLRSDSYTLAALTYTWY HLA-C*07:138,YDSGYREKYRQADVSNLYLRSDSYTLAAWAYTWY HLA-C*07:139,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:140,YDSGYRENYRQADVSNLYLRYDSYTWAVDAYTWY HLA-C*07:141,YDSGYRENYRQADVSNLYLRYDSYTWAALAYTWY HLA-C*07:142,YDSGYREKYRQADVSNLYFRYDFYTLAADAYTWY HLA-C*07:143,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:144,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:145,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:146,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:147,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*07:148,YDSGYRENYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*07:149,YDSGYREKYRQADVSNLYLRSDSYTLAALAYTWY HLA-C*08:01,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:02,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:03,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:04,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY HLA-C*08:05,YYAGYREKYRQADVSNLYLRYNFYTWAERAYTWY HLA-C*08:06,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYAWY HLA-C*08:07,YYAGYREKYRQTDVSNLYLRYNFYTLAERAYTWY HLA-C*08:08,YYAGYREKYRQTDVSNLYLSYNFYTWATLAYTWY HLA-C*08:09,YYAGYREKYRQTDVSNLYLRYDSYTWATLAYTWY HLA-C*08:10,YYAGYREKYRQTDVNKLYLRYNFYTWATLAYTWY HLA-C*08:11,YYAGYREKYRQTDVSNLYLRYDSYTWATLAYTWY HLA-C*08:12,YYAGYREKYRQTDVSNLYLWYNFYTWAERAYTWY HLA-C*08:13,YYAGYREKYRQTDVSNLYLRYNFYTWAELAYTWY HLA-C*08:14,YYSGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:15,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:16,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:17,YYAGYREKYCQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:18,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:19,YYAGYREKYRQTDVSNLYLRFNFYTWAERAYTWY HLA-C*08:20,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:21,YYAGYREKYRQADVSNLYLRYNFYTWATLAYTWY HLA-C*08:22,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:23,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:24,YYAGYREKYRQTDVSNLYLRYNFYTWATLAYTWY HLA-C*08:25,YYAGYREKYRQADVSNLYLRYNFYTWAERAYTWY HLA-C*08:27,YYAGYREKYRQTDVSNLYLRYNFYTWAEWAYTWY HLA-C*08:28,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:29,YYAGYREKYRQTDVSNLYLRYNFYTWAEWAYTWY HLA-C*08:30,YYAGYREKYRQTDVSNLYLRYNFYTWPERAYTWY HLA-C*08:31,YYAGYREKYRQTDVSNLYLRYNFYTWAEWAYEWY HLA-C*08:32,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:33,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:34,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*08:35,YYAGYREKYRQTDVSNLYLRYNFYTWAERAYTWY HLA-C*12:02,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:03,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:04,YYAGYREKYRQADVNKLYLWYDSYTWAEWAYTWY HLA-C*12:05,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYTWY HLA-C*12:06,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:07,YYAGYREKYRQADVGNLYLWYDSYTWAEWAYTWY HLA-C*12:08,YYAGYRENYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:09,YYAGYREKYRQTDVNKLYLWYDSYTWAERAYTWY HLA-C*12:10,YYAGYREKYRQADVSNLYLRFDSYTWAEWAYTWY HLA-C*12:11,YYAGYREKYRQADVSNLYLWSDSYTWAEWAYTWY HLA-C*12:12,YYAGYREKYRQADESNLYLWYDSYTWAEWAYTWY HLA-C*12:13,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:14,YYAGYREKYRQADVSNLYLRYDSYTLAALAYTWY HLA-C*12:15,YYAGYREKYRQADVSNLYLWYDLYTWAEWAYTWY HLA-C*12:16,YDSGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:17,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:18,YYAGYREKYRQADVSNLYLRYDSYTWAELAYTWY HLA-C*12:19,YYAGYREKYRQADVSNLYLWYDSYTWAECAYTWY HLA-C*12:20,YYAGYREKYRQADVSNLYLWYDSYTWAELAYTWY HLA-C*12:21,YYAGYREKYRQTDVNKLYLRYDSYTWAEWAYTWY HLA-C*12:22,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:23,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:24,YYAGYREKYRQADVSNLYLWYDSYTWAERAYTWY HLA-C*12:25,YYAGYPEKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:26,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:27,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:28,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:29,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:30,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:31,YYAGYREKYRQADVSNLYLWYNFYTWAEWAYTWY HLA-C*12:32,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:33,YYAGYREKYRQTDVNKLYLWYDSYTWAEWAYTWY HLA-C*12:34,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:35,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:36,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:37,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:38,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:40,YYAGYREKYRQADVSNLYLRYDSYTWAEWAYTWY HLA-C*12:41,YYAGYREKYRQADVNKLYLRYDSYTWAEWAYTWY HLA-C*12:43,YYAGYREKYRQADVSNLYLWYDSYTWAEWAYTWY HLA-C*12:44,YYAGYREKYRQADVSNLYIRYDSYTWAEWAYTWY HLA-C*14:02,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:03,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:04,YSAGYREKYRQADVNNLYLWFDSYTWAERAYTWY HLA-C*14:05,YSAGYREKYRQTDVSNLYLWYDSYTWAERAYTWY HLA-C*14:06,YSAGYREKYRQTDVSNLYLWFDSYTWAELAYTWY HLA-C*14:08,YSAGYREKYRQTDVSNLYPWFDSYTWAERAYTWY HLA-C*14:09,YSAGYREKYRQTDVSNLYLRYDSYTWAERAYTWY HLA-C*14:10,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:11,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:12,YSAGYREKYRQTDVNKLYLWFDSYTWAERAYTWY HLA-C*14:13,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:14,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:15,YSAGYREKYRQTDVSNLYLWFDSYTWAALAYTWY HLA-C*14:16,YSAGYREKYRQTDVSNLYLWFDSYTWAEWAYTWY HLA-C*14:17,YSAGYREKYRQTDVSNLYLWFDSYTLAARAYTWY HLA-C*14:18,YSSGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:19,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYTWY HLA-C*14:20,YSAGYREKYRQTDVSNLYLWFDSYTWAERAYLWY HLA-C*15:02,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:03,YYAGYRENYRQADVNKLYIRYDLYTWAELAYTWY HLA-C*15:04,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:05,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C*15:06,YYAGYRENYRQTDVNKLYIRYDYYTWAELAYTWY HLA-C*15:07,YYAGYRENYRQTDVSNLYIRYDLYTWAELAYTWY HLA-C*15:08,YYAGYRENYRQTDVNKLYIRYDLYTWAERAYTWY HLA-C*15:09,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:10,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:11,YYAGYREKYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:12,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:13,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:15,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYLWY HLA-C*15:16,YYAGYREKYRQADVNKLYIRYDLYTWAELAYTWY HLA-C*15:17,YYAGYREKYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:18,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:19,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:20,YYAGYREKYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:21,YYAGYRENYRQTDVSKLYIRYDLYTWAELAYTWY HLA-C*15:22,YYAGYRENYRQTDVNKLYLRYDFYTWAELAYTWY HLA-C*15:23,YDAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C*15:24,YYAGYRENYRQTDVNKLYIRYNYYTWAELAYTWY HLA-C*15:25,YYAGYREKYRQADVSNLYIRYNFYTWAEDAYTSY HLA-C*15:26,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:27,YYAGYRNKYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:28,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:29,YYAGYRENYRQTDVNKLYIRYDFYTWAELAYTWY HLA-C*15:30,YYAGYRENYRQTDVNKLYIRYDSYTWAELAYTWY HLA-C*15:31,YYAGYRENYRQTDVNKLYIRYDLYTWAALAYTWY HLA-C*15:33,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:34,YYAGYRENYRQTDVNKLYIRYDLYTWAELAYTWY HLA-C*15:35,YYAGYRENYRQTDVNKLHIRYDLYTWAELAYTWY HLA-C*16:01,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:02,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C*16:04,YYAGYREKYRQTDVSNLYLWYDSYTWAAWAYTWY HLA-C*16:06,YYAGYREKYRQTDVSNLYLRSDSYTWAAQAYTWY HLA-C*16:07,YYAGYREKYRQTDVSNLYLRYDSYTWAAQAYTWY HLA-C*16:08,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:09,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C*16:10,YYAGYREKYRQTDVSNLYLWYDDYTWAAQAYTWY HLA-C*16:11,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:12,YYAGYGEKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C*16:13,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:14,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:15,YYAGYREKYRQADVSNLYLWYDSYTWAAQAYTWY HLA-C*16:17,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:18,YYAGYREKYRQTDVSNLYLWCDSYTWAAQAYTWY HLA-C*16:19,YYAGYREKYRQTDVNKLYLWYDSYTWAAQAYTWY HLA-C*16:20,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:21,YDAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:22,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:23,YYAGYREKYRQTDVSNLYLWFDSYTWAAQAYTWY HLA-C*16:24,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*16:25,YYAGYREKYRQADVNKLYLWYDSYTWAAQAYTWY HLA-C*16:26,YYAGYREKYRQTDVSNLYLWYDSYTWAAQAYTWY HLA-C*17:01,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:02,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:03,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:04,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:05,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:06,YYAGYREKYRQADVNKLYIRYNFYSLAELAYEWY HLA-C*17:07,YYAGYREKYRQADVNKLYIRYNFYSLAELAYLWY HLA-C*18:01,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*18:02,YDSGYREKYRQADVNKLYLRFNFYTWAERAYTWY HLA-C*18:03,YDSGYREKYRQADVNKLYLRFNFYTWAEWAYEWY mhcflurry-2.3.6/downloads-generation/random_peptide_predictions/000077500000000000000000000000001525677230600252725ustar00rootroot00000000000000mhcflurry-2.3.6/downloads-generation/random_peptide_predictions/GENERATE.sh000077500000000000000000000021611525677230600270230ustar00rootroot00000000000000#!/bin/bash # # Generate predictions for random peptides. Used for pre-training some models. # set -e set -x DOWNLOAD_NAME=random_peptide_predictions SCRATCH_DIR=${TMPDIR-/tmp}/mhcflurry-downloads-generation SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR=$(dirname "$SCRIPT_ABSOLUTE_PATH") export PYTHONUNBUFFERED=1 mkdir -p "$SCRATCH_DIR" rm -rf "$SCRATCH_DIR/$DOWNLOAD_NAME" mkdir "$SCRATCH_DIR/$DOWNLOAD_NAME" # Send stdout and stderr to a logfile included with the archive. exec > >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt") exec 2> >(tee -ia "$SCRATCH_DIR/$DOWNLOAD_NAME/LOG.txt" >&2) # Log some environment info date pip freeze git status cd $SCRATCH_DIR/$DOWNLOAD_NAME cp $SCRIPT_DIR/random_predictions.py . cp $SCRIPT_ABSOLUTE_PATH . time python random_predictions.py \ --num-peptides 5000000 \ --models "$(mhcflurry-downloads path models_class1_selected_no_mass_spec)/models" \ --out predictions.csv bzip2 predictions.csv bzip2 LOG.txt tar -cjf "../${DOWNLOAD_NAME}.tar.bz2" * echo "Created archive: $SCRATCH_DIR/$DOWNLOAD_NAME.tar.bz2" mhcflurry-2.3.6/downloads-generation/random_peptide_predictions/random_predictions.py000066400000000000000000000046701525677230600315360ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Generate predictions for random peptides. """ from __future__ import print_function import sys import argparse import time import math import pandas import mhcflurry from mhcflurry.common import random_peptides parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument("--models", required=True) parser.add_argument("--num-peptides", type=int) parser.add_argument("--out", required=True) parser.add_argument("--chunksize", type=int, default=10000) def run(): args = parser.parse_args(sys.argv[1:]) print(args) predictor = mhcflurry.Class1AffinityPredictor.load(args.models) alleles = pandas.Series(predictor.supported_alleles) # Clear the file pandas.DataFrame(columns=alleles).to_csv(args.out, index=True) (min_length, max_length) = predictor.supported_peptide_lengths peptides_per_length = int( math.ceil(args.chunksize / (max_length - min_length))) peptides_written = 0 i = 0 while peptides_written < args.num_peptides: print("Chunk %d / %d" % ( i + 1, math.ceil(args.num_peptides / args.chunksize))) start = time.time() peptides = [] for l in range(8, 16): peptides.extend(random_peptides(peptides_per_length, length=l)) peptides = pandas.Series(peptides).sample( n=min(args.chunksize, args.num_peptides - peptides_written)).values encodable_peptides = mhcflurry.encodable_sequences.EncodableSequences.create( peptides) df = pandas.DataFrame(index=peptides) for allele in alleles: df[allele] = predictor.predict(encodable_peptides, allele=allele) df.to_csv( args.out, index=True, mode='a', header=False, float_format='%.1f') print("Wrote: %s [%0.2f sec]" % (args.out, time.time() - start)) i += 1 peptides_written += len(peptides) print("Done.") if __name__ == '__main__': run() mhcflurry-2.3.6/experiments/000077500000000000000000000000001525677230600161155ustar00rootroot00000000000000mhcflurry-2.3.6/experiments/README.md000066400000000000000000000106141525677230600173760ustar00rootroot00000000000000# Experiment snapshots Generated experiment snapshots live in timestamped directories: ```text experiments/YYYYMMDDTHHMMSSZ-name-sourcecommit/ ``` Create one with: ```bash mhcflurry train snapshot-experiment \ --source-dir results/my-run \ --experiments-dir experiments \ --name my-run \ --source-commit "$(git rev-parse HEAD)" \ --command-file results/my-run/command.sh ``` Each snapshot contains: - `experiment.json`: schema, UTC capture time, training and collector commits, and source archive; - `environment.json`: Python, platform, GPU, and installed package versions; - `source_files.csv`: SHA256, size, role, and copy status for every source artifact; - `external_inputs.csv`: input hashes preserved by runner provenance; - `data/training_history.csv`: one plot-friendly row per model/fit/epoch; - `data/models.csv`, `data/fits.csv`, and `data/model_configs.jsonl`; - `artifacts/`: copied hyperparameters, manifests, metrics, telemetry, and logs; - held-out prediction tables, cached component-score arrays, and generated PDF/PNG/SVG figures; - optional source archive and exact command files. Held-out prediction tables are copied even when they exceed `--max-copy-mb`, so performance figures can be regenerated without rerunning inference. They are always copied rather than hard-linked, so modifying a live run cannot mutate an immutable snapshot or invalidate its recorded hash. Weights and training tables are hashed but are not duplicated by default. Other files larger than `--max-copy-mb` remain inventory-only. Preserve the original run until the snapshot and required model archives have been copied to durable storage. Generated snapshot directories are ignored by Git; this README is tracked. ## Rebuilding plots Learning curves can be regenerated from a copied model manifest: ```bash mhcflurry train plot-loss-curves \ --selected-dir experiments//artifacts//models.unselected.combined \ --out experiments//plots/-losses ``` Each paired comparison can regenerate its ROC/PR, per-allele-delta, per-length, and summary-PDF panels without rerunning predictions: ```bash mhcflurry plot-model-comparison \ --input experiments//artifacts//comparison-vs-baseline \ --summary-pdf experiments//plots/-comparison.pdf ``` Affinity-factorial runs create one direct, overlap-excluded comparison and one review PDF per candidate against the pinned public `models.no_additional_ms` predictor. `benchmark_identity.sha256` in each `affinity/summary.json` proves that the candidate/public comparisons used identical ordered holdout rows. For a shortlist, build one shared prediction/score table and a paper-figure suite containing every finalist plus public 2.2: ```bash mhcflurry eval affinity-candidate-figures \ --factorial-dir experiments//artifacts \ --condition \ --condition \ --external-predictions external_predictions.csv.bz2 \ --out experiments//finalist_figures ``` Canonical external columns already present in the held-out predictions are retained automatically. Official per-sample `data_evaluation` groups can be consolidated reproducibly before rendering: ```bash mhcflurry eval merge-external-predictions \ --group netmhcpan4.ba=group.monoallelic.netmhcpan4.ba.train_excluded.csv \ --group netmhcpan4.el=group.monoallelic.netmhcpan4.el.train_excluded.csv \ --group mixmhcpred=group.monoallelic.mixmhcpred.train_excluded.csv \ --out external_predictions.csv.bz2 ``` The merge validates row identity across tools and writes a hashed provenance sidecar. The figure command requires every candidate row to match exactly one external row and records predictor coverage. Absent predictors remain absent rather than being fabricated; new predictions can first be added with `mhcflurry eval paper-figures external-predictors`. `artifacts/summary.csv` is the stable optimizer × LSUV × minibatch table for factorial heatmaps. `data/training_history.csv` is the corresponding tidy model/fit/epoch table. Publication-style figures and correlation heatmaps can be regenerated with `mhcflurry eval paper-figures` when a run preserved its saved score tables. The cross-experiment release panels, including cleavage-boundary and cached presentation-factorial conclusions, are regenerated with: ```bash mhcflurry eval release-experiment-figures --help ``` mhcflurry-2.3.6/lint.sh000077500000000000000000000003221525677230600150540ustar00rootroot00000000000000#!/bin/bash set -o errexit # Lint using ruff (fast Python linter) # Run from project root directory echo "Running ruff linter..." ruff check mhcflurry/ test/ --output-format=concise echo "Passes ruff check" mhcflurry-2.3.6/mhcflurry/000077500000000000000000000000001525677230600155655ustar00rootroot00000000000000mhcflurry-2.3.6/mhcflurry/__init__.py000066400000000000000000000043461525677230600177050ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Class I MHC ligand prediction package """ import os import sys from importlib import import_module # Must run before importing modules that transitively import numpy/MKL. Some # Linux conda images default MKL to INTEL threading, which aborts after PyTorch # has loaded GNU libgomp. The GNU MKL threading layer is not available on every # supported platform, so only select it on Linux and respect an explicit user # choice everywhere. if sys.platform.startswith("linux"): os.environ.setdefault("MKL_THREADING_LAYER", "GNU") from .version import __version__ _PUBLIC_CLASSES = { "Class1AffinityPredictor": "class1_affinity_predictor", "Class1NeuralNetwork": "class1_neural_network", "Class1ProcessingPredictor": "class1_processing_predictor", "Class1ProcessingNeuralNetwork": "class1_processing_neural_network", "Class1PresentationPredictor": "class1_presentation_predictor", "HistogramPercentRankTransform": "histogram_percent_rank_transform", "CompactPercentRankTransform": "compact_percent_rank_transform", } def __getattr__(name): """Load public classes when requested, keeping CLI discovery lightweight.""" if name not in _PUBLIC_CLASSES: raise AttributeError("module %r has no attribute %r" % (__name__, name)) value = getattr(import_module("." + _PUBLIC_CLASSES[name], __name__), name) globals()[name] = value return value def __dir__(): return sorted(set(globals()) | set(__all__)) __all__ = [ "__version__", "Class1AffinityPredictor", "Class1NeuralNetwork", "Class1ProcessingPredictor", "Class1ProcessingNeuralNetwork", "Class1PresentationPredictor", "HistogramPercentRankTransform", "CompactPercentRankTransform", ] mhcflurry-2.3.6/mhcflurry/affinity/000077500000000000000000000000001525677230600173765ustar00rootroot00000000000000mhcflurry-2.3.6/mhcflurry/affinity/__init__.py000066400000000000000000000011301525677230600215020ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Helper modules for class I affinity prediction.""" mhcflurry-2.3.6/mhcflurry/affinity/calibration_sizing.py000066400000000000000000000600631525677230600236270ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Calibration sizing and cache helpers for class I affinity predictors.""" import collections import hashlib import logging import os import numpy def peptide_sequences_fingerprint(sequences): """Order-and-content-sensitive SHA-256 of a peptide list. Length-prefixes each peptide so e.g. ``["AB", "C"]`` and ``["A", "BC"]`` cannot collide by concatenation. Used as the cache key for the fast calibration peptide-stage cache; collisions there silently reuse the wrong tensors and produce wrong PercentRankTransforms. """ h = hashlib.sha256() for peptide in sequences: b = str(peptide).encode("utf8") h.update(len(b).to_bytes(8, "little")) h.update(b) return h.hexdigest() class CalibrationFastCache(object): """Per-predictor-instance state for ``calibrate_percentile_ranks_fast``. Holds the device-resident peptide-stage tensors and the motif-summary helper state that survive across calibrate tasks within one worker. Centralizing both fields here makes the cache lifecycle visible — it used to live behind dynamic ``setattr`` of private names. """ __slots__ = ( "stage_signature", "cached_stages", "motif_signature", "motif_state", ) def __init__(self): self.stage_signature = None self.cached_stages = None self.motif_signature = None self.motif_state = None def clear(self): self.stage_signature = None self.cached_stages = None self.motif_signature = None self.motif_state = None def peptide_encoding_feature_dim(model): """Return the raw encoded peptide feature width for ``model`` if known.""" enc_shape = getattr(model, "peptide_encoding_shape", None) if enc_shape is None: return None return int(enc_shape[0]) * int(enc_shape[1]) def resolve_peptide_feature_dim(model, peptide_feature_dim, peak_bytes): """Resolve the width of cached peptide features used during calibration. ``peptide_feature_dim`` is the actual width of ``forward_peptide_stage(...)`` when the caller has probed it. Without a probe, fall back to shape-derived estimates and then to the generic peak memory estimate. """ if peptide_feature_dim is not None: return int(peptide_feature_dim) sub_networks = getattr(model, "networks", None) if sub_networks is not None and not hasattr(model, "peptide_encoding_shape"): try: sub_dims = [] for net in sub_networks: sub_dim = peptide_encoding_feature_dim(net) sub_dims.append(1024 if sub_dim is None else sub_dim) return int(sum(sub_dims)) except (AttributeError, TypeError, ValueError, IndexError): pass try: feature_dim = peptide_encoding_feature_dim(model) except (AttributeError, TypeError, ValueError, IndexError): feature_dim = None if feature_dim is not None: return feature_dim return int(peak_bytes // 32) if peak_bytes else 1024 CalibrationSizingEnv = collections.namedtuple( "CalibrationSizingEnv", [ "free_memory_fraction", "reserve_fraction", "reserve_min_bytes", "fixed_safety_multiplier", ], ) def read_calibration_sizing_env(free_memory_fraction, safety_multiplier): """Resolve the ``MHCFLURRY_CALIBRATE_AUTO_*`` overrides for the sizer. ``free_memory_fraction`` and ``safety_multiplier`` are the caller defaults used when the matching env var is unset. Invalid or out-of-range values raise ``ValueError`` (via ``env_float``) rather than being silently ignored. Returns a ``CalibrationSizingEnv``. """ from ..memory_budget import ( DEVICE_MIN_RESERVE_BYTES, MEMORY_RESERVE_FRACTION, ) from ..workload_planning import env_float fraction_name = "MHCFLURRY_CALIBRATE_AUTO_FREE_MEMORY_FRACTION" fraction_raw = os.environ.get(fraction_name) resolved_fraction = ( env_float(fraction_name, fraction_raw, bounds=(0.0, 1.0)) if fraction_raw not in (None, "") else ( float(free_memory_fraction) if free_memory_fraction is not None else None ) ) return CalibrationSizingEnv( free_memory_fraction=resolved_fraction, reserve_fraction=env_float( "MHCFLURRY_CALIBRATE_AUTO_RESERVE_FRACTION", MEMORY_RESERVE_FRACTION, bounds=(0.0, 1.0)), reserve_min_bytes=int( env_float( "MHCFLURRY_CALIBRATE_AUTO_RESERVE_GB", DEVICE_MIN_RESERVE_BYTES / float(1 << 30), bounds=(0.0, None)) * (1 << 30) ), fixed_safety_multiplier=env_float( "MHCFLURRY_CALIBRATE_AUTO_FIXED_SAFETY_MULTIPLIER", safety_multiplier, bounds=(0.0, None), ), ) def cuda_device_memory_bytes(device): """Return best-effort ``(free_bytes, total_bytes)`` for a CUDA device. ``free`` comes from the shared ``free_device_memory_bytes`` probe. ``total`` uses ``torch.cuda.get_device_properties`` when available and otherwise falls back to ``free`` -- tests and nonstandard CUDA wrappers may not expose device properties, and the explicit reserve still keeps the budget bounded. """ import torch from ..pytorch_sizing import free_device_memory_bytes free = free_device_memory_bytes(device) total_memory = free try: props = torch.cuda.get_device_properties(device) total_memory = int(props.total_memory) except ( AssertionError, AttributeError, RuntimeError, TypeError, ValueError): pass return free, total_memory def cuda_calibration_total_rows( model, device, n_peptides, num_workers_per_gpu, env, num_cached_networks, peptide_feature_dim, num_sub_networks, cuda_overhead_bytes): """Size the cartesian forward row budget on a CUDA device. Carves a per-worker VRAM budget out of free memory, subtracts the fixed overhead (the persistent peptide-feature cache plus safety-padded CUDA/runtime scratch and small state), and converts the remaining forward budget into a row count. ``env`` is a ``CalibrationSizingEnv`` from ``read_calibration_sizing_env``; see ``auto_size_calibration_batches`` for the full peak model. Returns the row budget for ``choose_calibration_batch_shape``. """ from ..pytorch_sizing import AUTO_BATCH_MAX_ROWS, AUTO_BATCH_MIN_ROWS free_memory_fraction = env.free_memory_fraction reserve_fraction = env.reserve_fraction reserve_min_bytes = env.reserve_min_bytes fixed_safety_multiplier = env.fixed_safety_multiplier workers = max(int(num_workers_per_gpu), 1) peak_bytes = estimate_calibration_peak_bytes_per_row(model) from ..pytorch_sizing import device_memory_budget memory = device_memory_budget( device, num_workers_per_gpu=workers, free_memory_fraction=free_memory_fraction, reserve_min_bytes=reserve_min_bytes, reserve_fraction=reserve_fraction, ) free = memory.free_bytes total_memory = memory.total_bytes reserve_bytes = memory.reserve_bytes fraction_budget = ( int(total_memory * float(free_memory_fraction) / workers) if free_memory_fraction is not None else memory.worker_entitlement_bytes ) per_worker_budget = memory.available_bytes sub_networks = getattr(model, "networks", None) if num_sub_networks is None: num_sub_networks = ( len(sub_networks) if sub_networks is not None else 1 ) peptide_feature_dim = resolve_peptide_feature_dim( model, peptide_feature_dim, peak_bytes, ) cache_bytes = ( int(num_cached_networks) * int(n_peptides) * int(peptide_feature_dim) * 4 ) # Small-state pad: log-IC50 accumulator, ic50_unique view, # motif-summary state, PercentRankTransform.fit_batch_torch # buffers, allele_idx tensor, etc. Scales with a_size and # n_peptides; a 1 GB constant covers the production ranges # without further accounting. Cheap insurance vs OOM. small_state_bytes = 1 * (1 << 30) # The peptide-stage cache estimate is shape-derived and # persistent, so multiplying it by a fragmentation safety factor # unnecessarily strands several GB on A100-40GB. Keep explicit # global headroom, and safety-pad only CUDA/runtime scratch and # small state whose allocation behavior is less predictable. scratch_state_bytes = int(cuda_overhead_bytes) + small_state_bytes guarded_fixed_overhead = ( cache_bytes + int(scratch_state_bytes * fixed_safety_multiplier) ) forward_budget = per_worker_budget - guarded_fixed_overhead log_fields = { "free_gb": free / 1e9, "workers": workers, "total_gb": total_memory / 1e9, "reserve_gb": reserve_bytes / 1e9, "fraction_budget_gb": fraction_budget / 1e9, "per_worker_budget_gb": per_worker_budget / 1e9, "worker_entitlement_gb": memory.worker_entitlement_bytes / 1e9, "process_gb": memory.process_bytes / 1e9, "peptide_feature_dim": peptide_feature_dim, "num_sub_networks": num_sub_networks, "num_cached_networks": num_cached_networks, "cache_gb": cache_bytes / 1e9, "cuda_overhead_gb": cuda_overhead_bytes / 1e9, "small_state_gb": small_state_bytes / 1e9, "scratch_safety": fixed_safety_multiplier, "guarded_fixed_gb": guarded_fixed_overhead / 1e9, "forward_budget_gb": forward_budget / 1e9, "peak_bytes_per_row": peak_bytes, "peak_kb_per_row": peak_bytes / 1024, } logging.info( "calibrate auto-sizer: free=%(free_gb).2f GB, " "workers=%(workers)d, total=%(total_gb).2f GB, " "reserve=%(reserve_gb).2f GB, " "fraction_budget=%(fraction_budget_gb).2f GB, " "worker_entitlement=%(worker_entitlement_gb).2f GB, " "process=%(process_gb).2f GB, " "remaining_budget=%(per_worker_budget_gb).2f GB, " "peptide_feature_dim=%(peptide_feature_dim)d " "(sub_networks=%(num_sub_networks)d, " "num_cached=%(num_cached_networks)d), " "cache=%(cache_gb).2f GB, " "cuda_overhead=%(cuda_overhead_gb).2f GB, " "small_state=%(small_state_gb).2f GB, " "scratch_safety=%(scratch_safety).2fx, " "guarded_fixed=%(guarded_fixed_gb).2f GB " "-> forward_budget=%(forward_budget_gb).2f GB, " "peak_bytes_per_row=%(peak_bytes_per_row)d " "(≈%(peak_kb_per_row).2f KB)", log_fields, ) if forward_budget < peak_bytes * AUTO_BATCH_MIN_ROWS: logging.warning( "calibrate auto-sizer: fixed overhead " "(cache %.2f GB + scratch/state %.2f GB × safety %.2fx) " "exceeds per-worker budget %.2f GB " "(%.2f GB free, %.2f GB reserved, %d workers). " "Falling back to minimum batch; reduce " "--max-workers-per-gpu or lower the peptide universe " "size.", cache_bytes / 1e9, scratch_state_bytes / 1e9, fixed_safety_multiplier, per_worker_budget / 1e9, free / 1e9, reserve_bytes / 1e9, workers, ) forward_budget = peak_bytes * AUTO_BATCH_MIN_ROWS return max( AUTO_BATCH_MIN_ROWS, min(forward_budget // peak_bytes, AUTO_BATCH_MAX_ROWS), ) def auto_size_calibration_batches( model, device, n_peptides, n_alleles, num_workers_per_gpu=1, free_memory_fraction=None, num_cached_networks=1, peptide_feature_dim=None, num_sub_networks=None, cuda_overhead_bytes=2 * (1 << 30), safety_multiplier=1.3, fixed_peptide_batch=None, fixed_allele_batch=None): """Split the auto-sized batch budget between peptide and allele axes. ``fixed_peptide_batch`` / ``fixed_allele_batch`` pin one axis to a user-supplied value (mixed pin/auto mode). The pinned axis is held constant and only the other axis is sized against the VRAM budget, so the auto axis shrinks to keep ``allele_batch × peptide_batch`` within the per-worker budget instead of being sized as if the pinned axis were also auto (which would underestimate peak VRAM). Models the per-worker VRAM peak as:: peak = cuda_overhead + cache_bytes # peptide-stage cache, # ``num_cached_networks × # n_peptides × peptide_feature_dim × 4`` + cartesian_intermediate # transient forward # ``a_size × p_batch × # peak_bytes_per_row`` + small_state # log-IC50 acc, ic50_unique, # motif state (~1 GB) This includes explicit free-memory headroom plus a safety factor on CUDA/runtime scratch allocations to absorb fragmentation that ``mem_get_info`` can't see. ``peak_bytes_per_row`` is calibrated for the cartesian fast path. For a merged ensemble it uses one sub-network's hidden activation peak plus the small retained per-sub-network outputs, matching ``MergedClass1NeuralNetwork.forward_cartesian_from_peptide_stage`` which runs each sub-network to completion before starting the next. The cartesian-intermediate term scales with ``a_size × p_batch``, which is exactly the rate the budget carves out — preserving the existing ``total_rows = forward_budget // peak_bytes`` math. Returns the chosen ``(peptide_batch, allele_batch)``. """ from ..pytorch_sizing import ( AUTO_BATCH_MIN_ROWS, compute_prediction_batch_size, ) if n_peptides == 0 or n_alleles == 0: return max(n_peptides, 1), max(n_alleles, 1) env = read_calibration_sizing_env(free_memory_fraction, safety_multiplier) if device.type != "cuda": total_rows = compute_prediction_batch_size( device, model=model, num_workers_per_gpu=num_workers_per_gpu, free_memory_fraction=env.free_memory_fraction, ) else: total_rows = cuda_calibration_total_rows( model, device, n_peptides, num_workers_per_gpu=num_workers_per_gpu, env=env, num_cached_networks=num_cached_networks, peptide_feature_dim=peptide_feature_dim, num_sub_networks=num_sub_networks, cuda_overhead_bytes=cuda_overhead_bytes, ) return choose_calibration_batch_shape( total_rows, n_peptides=n_peptides, n_alleles=n_alleles, min_peptide_batch=max(AUTO_BATCH_MIN_ROWS, 2_000), fixed_peptide_batch=fixed_peptide_batch, fixed_allele_batch=fixed_allele_batch, ) def estimate_calibration_peak_bytes_per_row(model): """Estimate cartesian calibration forward peak bytes per row. The generic prediction estimator is deliberately conservative for arbitrary merged forwards. Calibration has a more specific execution shape: ``MergedClass1NeuralNetwork.forward_cartesian_from_peptide_stage`` evaluates sub-networks serially and retains only their final outputs before combining them. Hidden-layer peak memory is therefore the max sub-network peak, not the sum of every sub-network peak. """ from ..pytorch_sizing import estimate_peak_bytes_per_row if model is None: return estimate_peak_bytes_per_row(model) sub_networks = getattr(model, "networks", None) if sub_networks is None or hasattr(model, "peptide_encoding_shape"): return estimate_peak_bytes_per_row(model) try: sub_peaks = [ estimate_peak_bytes_per_row(net) for net in sub_networks ] if not sub_peaks: return estimate_peak_bytes_per_row(model) output_channels = 0 for net in sub_networks: output_layer = getattr(net, "output_layer", None) output_channels += int(getattr(output_layer, "out_features", 1)) # Retained outputs are small compared with hidden activations but # include them, padded for stack/cat/log-IC50 temporary tensors. retained_output_bytes = max(output_channels, 1) * 8 * 4 return int(max(sub_peaks) + retained_output_bytes) except (AttributeError, TypeError, ValueError) as exc: logging.warning( "Could not estimate calibration peak for merged ensemble; " "falling back to generic estimator: %s", exc, ) return estimate_peak_bytes_per_row(model) def choose_calibration_batch_shape( total_rows, n_peptides, n_alleles, min_peptide_batch, max_allele_batch=256, fixed_peptide_batch=None, fixed_allele_batch=None): """Choose ``(peptide_batch, allele_batch)`` under a row budget. Minimize the number of cartesian forward chunks rather than filling one axis greedily. This matters for the production shape (tens of alleles × tens of thousands of peptides), where many equivalent row budgets can differ by 20-40% in Python-level loop count and kernel launches. ``fixed_peptide_batch`` / ``fixed_allele_batch`` pin one axis (mixed pin/auto mode). The pinned axis is held at the user value and the other axis is sized as ``total_rows // pinned`` so the product stays within the budget; the pinned axis is *not* capped by ``max_allele_batch`` (the user asked for it explicitly). """ total_rows = max(int(total_rows), 1) n_peptides = max(int(n_peptides), 1) n_alleles = max(int(n_alleles), 1) min_peptide_batch = max(int(min_peptide_batch), 1) max_allele_batch = max(int(max_allele_batch), 1) # Mixed pin/auto: hold the pinned axis fixed and size the other axis # against the same row budget so peak VRAM isn't underestimated. if fixed_allele_batch is not None and fixed_peptide_batch is None: allele_batch = min(max(int(fixed_allele_batch), 1), n_alleles) peptide_batch = max(total_rows // allele_batch, 1) peptide_batch = min(n_peptides, peptide_batch) return int(peptide_batch), int(allele_batch) if fixed_peptide_batch is not None and fixed_allele_batch is None: peptide_batch = min(max(int(fixed_peptide_batch), 1), n_peptides) allele_batch = max(total_rows // peptide_batch, 1) allele_batch = min(n_alleles, max_allele_batch, allele_batch) return int(peptide_batch), int(allele_batch) max_a = min(n_alleles, max_allele_batch, max(total_rows, 1)) best = None for allele_batch in range(1, max_a + 1): peptide_batch = total_rows // allele_batch if peptide_batch < min_peptide_batch: continue peptide_batch = min(n_peptides, max(min_peptide_batch, peptide_batch)) chunk_count = ( int(numpy.ceil(n_alleles / float(allele_batch))) * int(numpy.ceil(n_peptides / float(peptide_batch))) ) used_rows = allele_batch * peptide_batch candidate = ( chunk_count, -used_rows, -allele_batch, -peptide_batch, peptide_batch, allele_batch, ) if best is None or candidate < best: best = candidate if best is None: allele_batch = min(n_alleles, max_a) peptide_batch = min(n_peptides, max(min_peptide_batch, total_rows)) while allele_batch * peptide_batch > total_rows and allele_batch > 1: allele_batch -= 1 while ( allele_batch * peptide_batch > total_rows and peptide_batch > min_peptide_batch): peptide_batch = max(min_peptide_batch, peptide_batch // 2) return int(peptide_batch), int(allele_batch) return int(best[4]), int(best[5]) def calibration_stage_cache_signature(encoded_peptides, networks, device): """Return the key for a reusable peptide-stage calibration cache. Keyed on the peptide-set fingerprint, the network object identities (``id``), and the device -- NOT on weight *content*. Adding, removing, or replacing ensemble models changes the ``networks`` list (new objects -> new ids) and so invalidates the cache, but mutating an existing network's weights *in place* (e.g. a re-fit) does not. A weight-content fingerprint is deliberately not used here: ``borrow_cached_network`` serves architecturally-identical networks from a single process-wide ``MODELS_CACHE`` module, so the underlying torch parameter storage is shared across ensemble members and is not a reliable per-network weight signal. Callers that mutate weights in place between fast-calibrate calls on the same predictor instance must therefore call ``clear_calibration_fast_cache()`` first (see ``calibrate_percentile_ranks_fast``). """ return ( peptide_sequences_fingerprint(encoded_peptides.sequences), tuple(id(net) for net in networks), str(device), ) def probe_peptide_feature_dim(net_obj, encoded_peptides, device): """Run a 1-row forward through ``forward_peptide_stage`` to record the actual width of the peptide feature tensor. The auto-sizer's cache estimate depends on this and the encoding-shape heuristic under-counts when the model configures ``peptide_dense_layer_sizes`` or LC layers. Returns ``None`` on probe failure so callers can fall back to the heuristic. """ import torch from ..encodable_sequences import EncodableSequences try: seqs = list(encoded_peptides.sequences) if not seqs: return None probe_seqs = EncodableSequences.create([seqs[0]]) probe_input = net_obj.peptides_to_network_input(probe_seqs) probe_is_int = net_obj.uses_peptide_torch_encoding() if ( probe_is_int and probe_input.ndim == 2 and numpy.issubdtype(probe_input.dtype, numpy.integer) ): probe_tensor = torch.from_numpy(probe_input).to(device) else: probe_tensor = torch.from_numpy( numpy.asarray(probe_input, dtype=numpy.float32) ).to(device) model = net_obj.network(borrow=True) model.eval() with torch.no_grad(): peptide_features = model.forward_peptide_stage(probe_tensor) return int(peptide_features.shape[-1]) except (AttributeError, RuntimeError, TypeError, ValueError) as exc: logging.warning( "calibrate auto-sizer: peptide_feature_dim probe failed " "(%s); falling back to encoding-shape heuristic", exc, ) return None def calibration_fast_cache(self): """Return (creating if needed) the per-instance fast-calibrate cache. See ``CalibrationFastCache``. Lazy so that predictors loaded for prediction never pay the allocation cost. """ cache = getattr(self, "_calibration_fast_cache_state", None) if cache is None: cache = CalibrationFastCache() self._calibration_fast_cache_state = cache return cache def clear_calibration_fast_cache(self): """Drop any cached fast-calibrate state on this predictor. Long-lived workers that finish calibrate but stay alive for prediction can reclaim the (potentially many GB) of device- resident peptide-stage tensors via this hook. """ cache = getattr(self, "_calibration_fast_cache_state", None) if cache is not None: cache.clear() del self._calibration_fast_cache_state mhcflurry-2.3.6/mhcflurry/affinity/model_selection.py000066400000000000000000000075421525677230600231250ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Model-selection helpers for class I affinity predictors.""" import numpy import pandas def model_select( predictor, predictor_class, score_function, alleles=None, min_models=1, max_models=10000): """ Perform model selection using a user-specified scoring function. This works only with allele-specific models, not pan-allele models. Model selection is done using a "step up" variable selection procedure, in which models are repeatedly added to an ensemble until the score stops improving. Parameters ---------- predictor : Class1AffinityPredictor Predictor containing the candidate models. predictor_class : type Predictor class used for candidate and selected ensembles. score_function : Class1AffinityPredictor -> float function Scoring function alleles : list of string, optional If not specified, model selection is performed for all alleles. min_models : int, optional Min models to select per allele max_models : int, optional Max models to select per allele Returns ------- Class1AffinityPredictor : predictor containing the selected models """ if alleles is None: alleles = predictor.supported_alleles dfs = [] allele_to_allele_specific_models = {} def model_is_selectable(model): max_epochs = model.hyperparameters.get("max_epochs", 1) return max_epochs is None or int(max_epochs) > 0 for allele in alleles: df = pandas.DataFrame({ 'model': predictor.allele_to_allele_specific_models[allele] }) df["model_num"] = df.index df["allele"] = allele df["selected"] = False df["selectable"] = df.model.map(model_is_selectable) round_num = 1 while ( not df.loc[df.selectable, "selected"].all() and sum(df.selected) < max_models): score_col = "score_%2d" % round_num prev_score_col = "score_%2d" % (round_num - 1) existing_selected = list(df[df.selected].model) df[score_col] = [ numpy.nan if row.selected or not row.selectable else score_function( predictor_class( allele_to_allele_specific_models={ allele: [row.model] + existing_selected } ) ) for (_, row) in df.iterrows() ] if not numpy.isfinite(df[score_col]).any(): break if round_num > min_models and ( df[score_col].max() < df[prev_score_col].max()): break # In case of a tie, pick a model at random. (best_model_index,) = df.loc[ (df[score_col] == df[score_col].max()) ].sample(1).index df.loc[best_model_index, "selected"] = True round_num += 1 dfs.append(df) allele_to_allele_specific_models[allele] = list( df.loc[df.selected].model) df = pandas.concat(dfs, ignore_index=True) new_predictor = predictor_class( allele_to_allele_specific_models, metadata_dataframes={ "model_selection": df, }) return new_predictor mhcflurry-2.3.6/mhcflurry/affinity/persistence.py000066400000000000000000000507151525677230600223040ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Persistence helpers for class I affinity predictors.""" import collections import json import logging import time from functools import partial from getpass import getuser from os import makedirs, mkdir from os.path import abspath, commonpath, dirname, exists, join, realpath, relpath from socket import gethostname import pandas from mhcgnomes import parse, parse_gene_class from ..class1_neural_network import Class1NeuralNetwork from ..common import load_weights, normalize_allele_name, save_weights from ..downloads import get_default_class1_models_dir from ..percentile_calibration import load_percent_rank_transforms, save_percent_rank_transforms from ..pseudosequences import ( LEGACY_ALLELE_SEQUENCES_FILENAME, pseudosequence_filename_candidates, pseudosequence_filename_for_mapping, ) from ..version import __version__ from ..model_provenance import add_release_provenance # The public 2.2.0 model artifact contains this malformed spelling of the # official Caja-PS2*01 processed-pseudogene allele. Keep only this exact # artifact compatibility case until pirl-unc/mhcgnomes#88 supplies the # ontology property and, if appropriate, the historical alias. Do not infer # pseudogene status from a ``PS`` substring. _LEGACY_NON_PREDICTOR_PSEUDOSEQUENCE_KEYS = frozenset({"Caja-PS*02:01"}) _CHECKPOINT_POLICIES = ("terminal", "best") def _checkpoint_manifest_column(policy): """Return the manifest column containing a checkpoint's relative path.""" return "checkpoint_%s_weights" % policy def _parse_mhc_name(raw_name, only_class1): """Parse an MHC name with mhcgnomes, returning None on failure.""" return parse( str(raw_name), only_class1=only_class1, infer_class2_pairing=False, collapse_singleton_haplotypes=True, collapse_singleton_serotypes=True, raise_on_error=False, ) def _is_non_predictor_pseudosequence(name): """Return true for known non-class-I predictor pseudosequence rows.""" parsed_any_class = _parse_mhc_name(name, only_class1=False) if parsed_any_class is None: gene_class = parse_gene_class(str(name), raise_on_error=False) if gene_class is not None: # Use mhcgnomes' lenient, species-aware classification for names # outside its strict allele ontology, including DAA/DAB/DR-family # class-II genes and known non-MHC helper genes. return gene_class.is_class2 or gene_class.non_mhc return str(name) in _LEGACY_NON_PREDICTOR_PSEUDOSEQUENCE_KEYS parsed_class1 = _parse_mhc_name(name, only_class1=True) if parsed_class1 is None: # Known non-class-I MHC names such as class II and TAP entries do not # belong in a class-I predictor. return True gene_name = getattr(parsed_class1, "gene_name", None) return ( gene_name in {"HFE", "MICA", "MICB"} or getattr(parsed_class1, "is_pseudogene", False) or parsed_class1.annotation_null or parsed_class1.annotation_questionable ) def save_predictor(predictor, models_dir, model_names_to_write=None, write_metadata=True): """ Serialize the predictor to a directory on disk. If the directory does not exist it will be created. The serialization format consists of a file called "manifest.csv" with the configurations of each Class1NeuralNetwork, along with per-network files giving the model weights. If there are pan-allele predictors in the ensemble, the pseudosequences are also stored in the directory. There is also a small file "info.txt" with basic metadata: the save time, user and host (not the original training time). Parameters ---------- predictor : Class1AffinityPredictor Predictor to serialize. models_dir : string Path to directory. It will be created if it doesn't exist. model_names_to_write : list of string, optional Only write the weights for the specified models. Useful for incremental updates during training. Passing an explicit empty list writes no model artifacts; this is used by calibration-only updates that replace percentile calibration (CSV or JSON) without touching the manifest, weights, model provenance, allele sequences, or optimization metadata. Explicit ``metadata_dataframes`` are still written when ``write_metadata`` is true. write_metadata : boolean, optional Whether to write optional metadata """ if model_names_to_write is None: # Write all models model_names_to_write = list(predictor.manifest_df.model_name.values) write_model_artifacts = True else: model_names_to_write = list(model_names_to_write) write_model_artifacts = len(model_names_to_write) > 0 if write_model_artifacts: predictor.check_consistency() if not exists(models_dir): mkdir(models_dir) if write_model_artifacts: sub_manifest_df = predictor.manifest_df.loc[ predictor.manifest_df.model_name.isin(model_names_to_write) ].copy() # Network JSON configs may have changed since the models were added, # for example due to changes to the allele representation layer. # So we update the JSON configs here also. updated_network_config_jsons = [] for (_, row) in sub_manifest_df.iterrows(): updated_network_config_jsons.append( json.dumps(row.model.get_config())) weights_path = predictor.weights_path(models_dir, row.model_name) save_weights(row.model.get_weights(), weights_path) logging.info("Wrote: %s", weights_path) # A refit may discard one or both previously retained policies. # Never leave references to sidecars from the previous fit. for policy in ("terminal", "best"): column = _checkpoint_manifest_column(policy) if column in predictor.manifest_df.columns: predictor.manifest_df.at[row.name, column] = None for policy in row.model.available_checkpoint_policies(): checkpoint_path = predictor.checkpoint_weights_path( models_dir, row.model_name, policy) makedirs(dirname(checkpoint_path), exist_ok=True) checkpoint_weights = row.model.get_checkpoint_weights(policy) save_weights(checkpoint_weights, checkpoint_path) column = _checkpoint_manifest_column(policy) if column not in predictor.manifest_df.columns: predictor.manifest_df[column] = None predictor.manifest_df.at[row.name, column] = relpath( checkpoint_path, models_dir) row.model.set_checkpoint_weights_loader( policy, partial(load_weights, abspath(checkpoint_path)), weight_path=abspath(checkpoint_path), ) logging.info("Wrote: %s", checkpoint_path) sub_manifest_df["config_json"] = updated_network_config_jsons predictor.manifest_df.loc[ sub_manifest_df.index, "config_json" ] = updated_network_config_jsons write_manifest_df = predictor.manifest_df[[ c for c in predictor.manifest_df.columns if c != "model" ]] manifest_path = join(models_dir, "manifest.csv") write_manifest_df.to_csv(manifest_path, index=False) logging.info("Wrote: %s", manifest_path) if write_metadata: # Write "info.txt" info_path = join(models_dir, "info.txt") rows = [ ("trained on", time.asctime()), ("package ", "mhcflurry %s" % __version__), ("hostname ", gethostname()), ("user ", getuser()), ] add_release_provenance(rows) pandas.DataFrame(rows).to_csv( info_path, sep="\t", header=False, index=False) # Save pseudosequences. New artifacts get an explicit # pseudosequences..aa.csv filename while still # writing allele_sequences.csv for older MHCflurry releases and # external tooling. if predictor.allele_to_sequence is not None: allele_to_sequence_df = pandas.DataFrame( list(predictor.allele_to_sequence.items()), columns=['allele', 'sequence'] ) legacy_path = join(models_dir, LEGACY_ALLELE_SEQUENCES_FILENAME) allele_to_sequence_df.to_csv(legacy_path, index=False) logging.info("Wrote: %s", legacy_path) pseudosequences_filename = ( pseudosequence_filename_for_mapping( predictor.allele_to_sequence)) if pseudosequences_filename is not None: pseudosequences_path = join( models_dir, pseudosequences_filename) pseudosequences_df = pandas.DataFrame( list(predictor.allele_to_sequence.items()), columns=['allele', 'pseudosequence']) pseudosequences_df.to_csv( pseudosequences_path, index=False) logging.info("Wrote: %s", pseudosequences_path) else: logging.info( "Pseudosequences have mixed or unknown lengths; " "skipping explicit pseudosequences.*.*aa.csv alias.") if write_metadata and predictor.metadata_dataframes: for (name, df) in predictor.metadata_dataframes.items(): metadata_df_path = join(models_dir, "%s.csv.bz2" % name) df.to_csv(metadata_df_path, index=False, compression="bz2") save_percent_rank_transforms(models_dir, predictor.allele_to_percent_rank_transform) if write_model_artifacts and predictor.optimization_info: # If the model being saved was optimized, we need to save that # information since it can affect how predictions are performed # (e.g. stitched-together ensembles output concatenated results, # which then need to be averaged outside the model). optimization_info_path = join(models_dir, "optimization_info.json") with open(optimization_info_path, "w") as fd: json.dump(predictor.optimization_info, fd, indent=4) predictor.models_dir = abspath(models_dir) def load_predictor( predictor_class, models_dir=None, max_models=None, optimization_level=None, optimization_level_default=None): """ Deserialize a predictor from a directory on disk. Parameters ---------- predictor_class : type Predictor class to instantiate. models_dir : string Path to directory. If unspecified the default downloaded models are used. max_models : int, optional Maximum number of `Class1NeuralNetwork` instances to load optimization_level : int or None If >0, model optimization will be attempted. When None, use optimization_level_default supplied by the public loader. optimization_level_default : int or None Fallback supplied by the public loader when no explicit level is set. That loader reads MHCFLURRY_OPTIMIZATION_LEVEL with a default of 1. Returns ------- `Class1AffinityPredictor` instance """ if models_dir is None: try: models_dir = get_default_class1_models_dir() except RuntimeError as e: # Fall back to the affinity predictor included in presentation # predictor if possible. from mhcflurry.class1_presentation_predictor import ( Class1PresentationPredictor) try: presentation_predictor = Class1PresentationPredictor.load() return presentation_predictor.affinity_predictor except RuntimeError: raise e if optimization_level is None: optimization_level = optimization_level_default manifest_path = join(models_dir, "manifest.csv") manifest_df = pandas.read_csv(manifest_path, nrows=max_models) # ----- Load pseudosequences first so we can canonicalize ----- allele_to_sequence = None allele_to_canonical = {} allele_sequences_filename = None candidates = pseudosequence_filename_candidates(models_dir) if candidates: allele_sequences_filename = candidates[0] if allele_sequences_filename is not None: allele_to_sequence = pandas.read_csv( join(models_dir, allele_sequences_filename), index_col=0).iloc[:, 0].to_dict() # Re-normalize allele names. We first try without IMGT allele # aliases to preserve current nomenclature. If the parse fails # or the pseudosequence contains unknown (X) positions, we # retry with aliases — retired allele names like B*44:01 (an # IMGT error reassigned to B*44:02 in 1994) often have # incomplete pseudosequences, and the alias target may have a # complete one. Keys that mhcgnomes cannot parse are omitted: keeping # them would make supported_alleles advertise a value that the public # prediction API cannot canonicalize back to that key. renormalized = {} skipped_non_class1 = [] skipped_unparseable = [] for (name, value) in allele_to_sequence.items(): normalized = normalize_allele_name( name, raise_on_error=False, use_allele_aliases=False) if normalized is None or "X" in value: alias_normalized = normalize_allele_name( name, raise_on_error=False, use_allele_aliases=True) if alias_normalized is not None: normalized = alias_normalized if normalized is None: # Detect class II, TAP, and pseudogene entries. Unknown raw # keys are also unusable because prediction inputs cannot be # canonicalized to them. if _is_non_predictor_pseudosequence(name): skipped_non_class1.append(name) else: skipped_unparseable.append(name) continue if normalized in renormalized and name != normalized: existing = renormalized[normalized] if value.count("X") < existing.count("X"): renormalized[normalized] = value continue renormalized[normalized] = value allele_to_sequence = renormalized if skipped_non_class1: logging.debug( "Skipped %d non-class-I entries from pseudosequence " "file (class II / TAP / pseudogene with incomplete " "pseudosequences): %s", len(skipped_non_class1), ", ".join(sorted(skipped_non_class1)[:10]) + (" ..." if len(skipped_non_class1) > 10 else "")) if skipped_unparseable: logging.warning( "Skipped %d unparseable pseudosequence allele key(s) that " "cannot be resolved by the predictor API: %s", len(skipped_unparseable), ", ".join(sorted(skipped_unparseable)[:10]) + (" ..." if len(skipped_unparseable) > 10 else "")) # Map mhcgnomes-aliased forms back to pseudosequence keys. # e.g. Mamu-A1*007:01 -> Mamu-A*07:01 for canonical_name in allele_to_sequence: aliased = normalize_allele_name( canonical_name, raise_on_error=False, use_allele_aliases=True) if (aliased is not None and aliased != canonical_name and aliased not in allele_to_sequence): allele_to_canonical[aliased] = canonical_name def to_canonical(raw_name): """Normalize a raw allele name to its canonical pseudosequence key.""" n = normalize_allele_name(raw_name, raise_on_error=False) or raw_name return allele_to_canonical.get(n, n) # ----- Load manifest ----- allele_to_allele_specific_models = collections.defaultdict(list) class1_pan_allele_models = [] all_models = [] for (_, row) in manifest_df.iterrows(): weights_filename = predictor_class.weights_path( models_dir, row.model_name) config = json.loads(row.config_json) model = Class1NeuralNetwork.from_config( config, weights_loader=partial(load_weights, abspath(weights_filename)), weight_paths=abspath(weights_filename)) for policy in _CHECKPOINT_POLICIES: column = _checkpoint_manifest_column(policy) if column not in manifest_df.columns or pandas.isna(row.get(column)): continue relative_checkpoint_path = str(row[column]) checkpoint_path = realpath(join( models_dir, relative_checkpoint_path)) models_dir_absolute = realpath(models_dir) if commonpath((checkpoint_path, models_dir_absolute)) != ( models_dir_absolute): raise ValueError( "Checkpoint path escapes predictor directory: %s" % relative_checkpoint_path) if not exists(checkpoint_path): raise IOError( "Missing retained %s checkpoint for %s: %s" % ( policy, row.model_name, checkpoint_path)) model.set_checkpoint_weights_loader( policy, partial(load_weights, checkpoint_path), weight_path=checkpoint_path, ) if row.allele == "pan-class1": class1_pan_allele_models.append(model) else: allele_to_allele_specific_models[ to_canonical(row.allele)].append(model) all_models.append(model) manifest_df["model"] = all_models # ----- Load percent ranks ----- allele_to_percent_rank_transform = {} for allele, transform in load_percent_rank_transforms(models_dir).items(): canonical = to_canonical(allele) if canonical in allele_to_percent_rank_transform and allele != canonical: continue allele_to_percent_rank_transform[canonical] = transform logging.info( "Loaded %d class1 pan allele predictors, %d allele sequences, " "%d percent rank distributions, and %d allele specific models: %s", len(class1_pan_allele_models), len(allele_to_sequence) if allele_to_sequence else 0, len(allele_to_percent_rank_transform), sum(len(v) for v in allele_to_allele_specific_models.values()), ", ".join( "%s (%d)" % (allele, len(v)) for (allele, v) in sorted(allele_to_allele_specific_models.items()))) provenance_string = None try: info_path = join(models_dir, "info.txt") info = pandas.read_csv( info_path, sep="\t", header=None, index_col=0).iloc[ :, 0 ].to_dict() provenance_string = "generated on %s" % info["trained on"] except OSError: pass optimization_info = None try: optimization_info_path = join(models_dir, "optimization_info.json") with open(optimization_info_path) as fd: optimization_info = json.load(fd) except OSError: pass result = predictor_class( allele_to_allele_specific_models=allele_to_allele_specific_models, class1_pan_allele_models=class1_pan_allele_models, allele_to_sequence=allele_to_sequence, manifest_df=manifest_df, allele_to_percent_rank_transform=allele_to_percent_rank_transform, provenance_string=provenance_string, optimization_info=optimization_info, models_dir=abspath(models_dir), ) if allele_to_sequence is not None: result.allele_to_canonical = allele_to_canonical if optimization_level >= 1: optimized = result.optimize() logging.info( "Model optimization %s", "succeeded" if optimized else "not supported for these models") return result mhcflurry-2.3.6/mhcflurry/allele_encoding.py000066400000000000000000000143331525677230600212470ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import pandas from . import amino_acid class AlleleEncoding(object): def __init__(self, alleles=None, allele_to_sequence=None, borrow_from=None): """ A place to cache encodings for a sequence of alleles. We frequently work with alleles by integer indices, for example as inputs to neural networks. This class is used to map allele names to integer indices in a consistent way by keeping track of the universe of alleles under use, i.e. a distinction is made between the universe of supported alleles (what's in `allele_to_sequence`) and the actual set of alleles used for some task (what's in `alleles`). Parameters ---------- alleles : list of string Allele names. If any allele is None instead of string, it will be mapped to the special index value -1. allele_to_sequence : dict of str -> str Allele name to amino acid sequence borrow_from : AlleleEncoding, optional If specified, do not specify allele_to_sequence. The sequences from the provided instance are used. This guarantees that the mappings from allele to index and from allele to sequence are the same between the instances. """ if alleles is not None: alleles = pandas.Series(alleles) self.borrow_from = borrow_from self.allele_to_sequence = allele_to_sequence if self.borrow_from is None: assert allele_to_sequence is not None all_alleles = ( sorted(allele_to_sequence)) self.allele_to_index = dict( (allele, i) for (i, allele) in enumerate([None] + all_alleles)) unpadded = pandas.Series([ allele_to_sequence[a] if a is not None else "" for a in [None] + all_alleles ], index=[None] + all_alleles) self.sequences = unpadded.str.pad( unpadded.str.len().max(), fillchar="X") else: assert allele_to_sequence is None self.allele_to_index = borrow_from.allele_to_index self.sequences = borrow_from.sequences self.allele_to_sequence = borrow_from.allele_to_sequence if alleles is not None: assert all( allele in self.allele_to_index for allele in alleles),\ "Missing alleles: " + " ".join(set( a for a in alleles if a not in self.allele_to_index)) self.indices = alleles.map(self.allele_to_index) assert not self.indices.isnull().any() self.alleles = alleles else: self.indices = None self.alleles = None self.encoding_cache = {} def compact(self): """ Return a new AlleleEncoding in which the universe of supported alleles is only the alleles actually used. Returns ------- AlleleEncoding """ return AlleleEncoding( alleles=self.alleles, allele_to_sequence=dict( (allele, self.allele_to_sequence[allele]) for allele in self.alleles.unique() if allele is not None)) def allele_representations(self, encoding_name): """ Encode the universe of supported allele sequences to a matrix. Parameters ---------- encoding_name : string How to represent amino acids. Valid names include "BLOSUM62", "one-hot", "PMBEC", "contact", "physchem", "atchley", and ``+``-joined composites. Add ``:minmax`` to a component to scale non-X values to [-1, 1]. See `amino_acid.available_vector_encodings()`. Returns ------- numpy.array of shape (num alleles in universe, sequence length, vector size) where vector size is usually 21 (20 amino acids + X character) """ if self.borrow_from is not None: return self.borrow_from.allele_representations(encoding_name) cache_key = ( "allele_representations", encoding_name) if cache_key not in self.encoding_cache: index_encoded_matrix = amino_acid.index_encoding( self.sequences.values, amino_acid.AMINO_ACID_INDEX) vector_encoded = amino_acid.fixed_vectors_encoding( index_encoded_matrix, amino_acid.get_vector_encoding_df(encoding_name)) self.encoding_cache[cache_key] = vector_encoded return self.encoding_cache[cache_key] def fixed_length_vector_encoded_sequences(self, encoding_name): """ Encode allele sequences (not the universe of alleles) to a matrix. Parameters ---------- encoding_name : string How to represent amino acids. Valid names include "BLOSUM62", "one-hot", "PMBEC", "contact", "physchem", "atchley", and ``+``-joined composites. Add ``:minmax`` to a component to scale non-X values to [-1, 1]. See `amino_acid.available_vector_encodings()`. Returns ------- numpy.array with shape: (num alleles, sequence length, vector size) where vector size is usually 21 (20 amino acids + X character) """ cache_key = ( "fixed_length_vector_encoding", encoding_name) if cache_key not in self.encoding_cache: vector_encoded = self.allele_representations(encoding_name) result = vector_encoded[self.indices] self.encoding_cache[cache_key] = result return self.encoding_cache[cache_key] mhcflurry-2.3.6/mhcflurry/amino_acid.py000066400000000000000000000655351525677230600202400ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Functions for encoding fixed length sequences of amino acids into various vector representations, such as one-hot and BLOSUM62. """ import collections import warnings from io import StringIO import numpy import pandas COMMON_AMINO_ACIDS = collections.OrderedDict( [ ("A", "Alanine"), ("C", "Cysteine"), ("D", "Aspartic Acid"), ("E", "Glutamic Acid"), ("F", "Phenylalanine"), ("G", "Glycine"), ("H", "Histidine"), ("I", "Isoleucine"), ("K", "Lysine"), ("L", "Leucine"), ("M", "Methionine"), ("N", "Asparagine"), ("P", "Proline"), ("Q", "Glutamine"), ("R", "Arginine"), ("S", "Serine"), ("T", "Threonine"), ("V", "Valine"), ("W", "Tryptophan"), ("Y", "Tyrosine"), ] ) COMMON_AMINO_ACIDS_WITH_UNKNOWN = COMMON_AMINO_ACIDS.copy() COMMON_AMINO_ACIDS_WITH_UNKNOWN["X"] = "Unknown" AMINO_ACID_INDEX = { letter: i for i, letter in enumerate(COMMON_AMINO_ACIDS_WITH_UNKNOWN) } for letter, index in list(AMINO_ACID_INDEX.items()): AMINO_ACID_INDEX[letter.lower()] = index # Support lower-case as well. AMINO_ACIDS = list(COMMON_AMINO_ACIDS_WITH_UNKNOWN.keys()) # Single canonical letter<->index mapping for the whole codebase. Position # of a letter in ``AMINO_ACIDS`` equals ``AMINO_ACID_INDEX[letter]``; X is # at index 20. Anything that round-trips between peptide strings and # integer index arrays must go through these helpers; that is the # contract device-resident encoding paths rely on for re-materializing # peptides from index tensors. # Canonical index of the X (unknown) amino acid. This is equal to # len(COMMON_AMINO_ACIDS). X_INDEX = AMINO_ACID_INDEX["X"] # Count of the 20 common amino acids (excludes X). NUM_COMMON_AMINO_ACIDS = len(COMMON_AMINO_ACIDS) def peptide_to_indices(peptide, dtype="int8"): """ Convert a peptide string to a 1-D integer index array. Uppercases the input and uses :data:`AMINO_ACID_INDEX` for the letter-to-index map so the result matches what :func:`index_encoding` produces for one row. Parameters ---------- peptide : str dtype : numpy dtype, default ``"int8"`` Index payloads fit comfortably in int8 (alphabet size 21 << 127). Returns ------- numpy.ndarray of shape ``(len(peptide),)`` """ return numpy.asarray( [AMINO_ACID_INDEX[char] for char in peptide.upper()], dtype=dtype, ) def indices_to_peptide(indices): """ Convert a 1-D integer index array (or sequence) back to its peptide string. Inverse of :func:`peptide_to_indices` for canonical alphabet members. Indices at or above the alphabet size raise :class:`IndexError`; negative indices wrap (Python list indexing semantics); no per-element bounds check is added because this is a tight per-position loop on a hot re-materialization path. Parameters ---------- indices : iterable of int Returns ------- str """ return "".join(AMINO_ACIDS[int(i)] for i in indices) BLOSUM62_MATRIX = ( pandas.read_csv( StringIO(""" A R N D C Q E G H I L K M F P S T W Y V X A 4 -1 -2 -2 0 -1 -1 0 -2 -1 -1 -1 -1 -2 -1 1 0 -3 -2 0 0 R -1 5 0 -2 -3 1 0 -2 0 -3 -2 2 -1 -3 -2 -1 -1 -3 -2 -3 0 N -2 0 6 1 -3 0 0 0 1 -3 -3 0 -2 -3 -2 1 0 -4 -2 -3 0 D -2 -2 1 6 -3 0 2 -1 -1 -3 -4 -1 -3 -3 -1 0 -1 -4 -3 -3 0 C 0 -3 -3 -3 9 -3 -4 -3 -3 -1 -1 -3 -1 -2 -3 -1 -1 -2 -2 -1 0 Q -1 1 0 0 -3 5 2 -2 0 -3 -2 1 0 -3 -1 0 -1 -2 -1 -2 0 E -1 0 0 2 -4 2 5 -2 0 -3 -3 1 -2 -3 -1 0 -1 -3 -2 -2 0 G 0 -2 0 -1 -3 -2 -2 6 -2 -4 -4 -2 -3 -3 -2 0 -2 -2 -3 -3 0 H -2 0 1 -1 -3 0 0 -2 8 -3 -3 -1 -2 -1 -2 -1 -2 -2 2 -3 0 I -1 -3 -3 -3 -1 -3 -3 -4 -3 4 2 -3 1 0 -3 -2 -1 -3 -1 3 0 L -1 -2 -3 -4 -1 -2 -3 -4 -3 2 4 -2 2 0 -3 -2 -1 -2 -1 1 0 K -1 2 0 -1 -3 1 1 -2 -1 -3 -2 5 -1 -3 -1 0 -1 -3 -2 -2 0 M -1 -1 -2 -3 -1 0 -2 -3 -2 1 2 -1 5 0 -2 -1 -1 -1 -1 1 0 F -2 -3 -3 -3 -2 -3 -3 -3 -1 0 0 -3 0 6 -4 -2 -2 1 3 -1 0 P -1 -2 -2 -1 -3 -1 -1 -2 -2 -3 -3 -1 -2 -4 7 -1 -1 -4 -3 -2 0 S 1 -1 1 0 -1 0 0 0 -1 -2 -2 0 -1 -2 -1 4 1 -3 -2 -2 0 T 0 -1 0 -1 -1 -1 -1 -2 -2 -1 -1 -1 -1 -2 -1 1 5 -2 -2 0 0 W -3 -3 -4 -4 -2 -2 -3 -2 -2 -3 -2 -3 -1 1 -4 -3 -2 11 2 -3 0 Y -2 -2 -2 -3 -2 -1 -2 -3 2 -1 -1 -2 -1 3 -3 -2 -2 2 7 -1 0 V 0 -3 -3 -3 -1 -2 -2 -3 -3 3 1 -2 1 -1 -2 -2 0 -3 -1 4 0 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 """), sep=r"\s+", ) .loc[AMINO_ACIDS, AMINO_ACIDS] .astype("int8") ) assert (BLOSUM62_MATRIX == BLOSUM62_MATRIX.T).all().all() def _matrix_with_unknown(df, dtype="float32"): """ Extend a 20 x 20 amino-acid matrix with an all-zero X row and column. """ common = list(COMMON_AMINO_ACIDS) if set(df.index) != set(common) or set(df.columns) != set(common): raise ValueError( "Expected matrix over common amino acids %s; got rows=%s cols=%s" % (common, list(df.index), list(df.columns)) ) result = df.loc[common, common].copy() result.loc["X"] = 0.0 result["X"] = 0.0 return result.loc[AMINO_ACIDS, AMINO_ACIDS].astype(dtype) PMBEC_MATRIX = _matrix_with_unknown( pandas.read_csv( StringIO(""" A C D E F G H I K L M N P Q R S T V W Y A 0.322860152036 0.0113750373506 -0.0156239175966 -0.00259952715456 -0.0508792185716 0.0382679273874 -0.0832539299638 -0.00196691041626 -0.0103729638696 -0.042393907322 -0.0651042403697 -0.0853704925231 0.0757409633086 -0.0483151514798 -0.0136431408498 0.038455041596 0.0520376087986 0.081101427454 -0.125564718844 -0.0747500389698 C 0.0113750373506 0.100680270274 0.0102951033136 0.0147570340938 0.0345785831581 0.00933463557214 -0.00750101609651 0.00476007239717 -0.0459237939975 -0.0182998264075 -0.0155971113182 0.0021128481374 -0.00860770840682 -0.0309903425175 -0.0482562439545 -0.0217965163697 -0.0227322740574 -0.0154276574266 0.0412325888637 0.00600631739163 D -0.0156239175966 0.0102951033136 0.157208255034 0.0724279735923 -0.0189545540921 -0.00870389879389 -0.0180188107498 -0.0283467966687 -0.0634240071162 -0.0279979457557 -0.0241192288182 0.0194310374127 0.042784078891 0.000437307476866 -0.0591268568576 -0.0104660502173 0.00656101264316 -0.0193560886308 0.00415097887978 -0.0191575919464 E -0.00259952715456 0.0147570340938 0.0724279735923 0.131775168933 -0.00519060032543 -0.00547805492393 -0.0335600821273 -0.0135417817213 -0.069471604426 0.00353800457557 -0.017166710134 0.00534055417468 0.022589833552 0.0281404974641 -0.0697402405064 -0.0172364513778 -0.0054830504799 -0.00806269508269 -0.00791955104235 -0.0231187170833 F -0.0508792185716 0.0345785831581 -0.0189545540921 -0.00519060032543 0.259179996995 -0.00445131805782 -0.00639743486807 0.0628717025094 -0.049227253611 0.0488666377736 0.0315353570161 -0.0223593028205 -0.0919732521492 -0.0930189756622 -0.0626297946351 -0.0868415233743 -0.0777292391855 -0.015794520965 0.0625957490761 0.0858189617896 G 0.0382679273874 0.00933463557214 -0.00870389879389 -0.00547805492393 -0.00445131805782 0.122499934434 -0.025558278086 -0.0207027221208 -0.0137316756786 -0.0326424665142 -0.0264215095016 -0.00403752148352 0.0094352664965 0.00425299048772 -0.0232280105465 0.0304312733191 0.00861853592388 -0.0127217072682 -0.0246539147339 -0.0205094859119 H -0.0832539299638 -0.00750101609651 -0.0180188107498 -0.0335600821273 -0.00639743486807 -0.025558278086 0.207657765989 -0.0888505073496 0.0761447053198 -0.0351727012494 -0.000760393877348 0.0353903619255 -0.0682087048807 -0.00886454093107 0.109052662874 0.00938179429131 -0.0234122309305 -0.0870188771708 0.0123622841944 0.0365879336865 I -0.00196691041626 0.00476007239717 -0.0283467966687 -0.0135417817213 0.0628717025094 -0.0207027221208 -0.0888505073496 0.27773187827 -0.0381642025534 0.0886112938313 0.0551293441776 -0.0593694184462 -0.039207153398 -0.0626883806129 -0.110160438997 -0.0618078497671 -0.0339233811197 0.091300054417 0.00138488610169 -0.0230596885329 K -0.0103729638696 -0.0459237939975 -0.0634240071162 -0.069471604426 -0.049227253611 -0.0137316756786 0.0761447053198 -0.0381642025534 0.273355694189 -0.0177282663533 -0.00817300753785 -0.0339854863013 -0.0484016323395 -0.0331603641198 0.21516548555 0.00476731287861 -0.0331318604828 -0.0400367780545 -0.0598522551401 -0.00464804635586 L -0.042393907322 -0.0182998264075 -0.0279979457557 0.00353800457557 0.0488666377736 -0.0326424665142 -0.0351727012494 0.0886112938313 -0.0177282663533 0.162738321535 0.0750528874999 -0.0111666419731 -0.051023845781 -0.00134001844501 -0.074934598492 -0.0584956357369 -0.031311528799 0.0449678806271 -0.00754567267671 -0.0137219703366 M -0.0651042403697 -0.0155971113182 -0.0241192288182 -0.017166710134 0.0315353570161 -0.0264215095016 -0.000760393877348 0.0551293441776 -0.00817300753785 0.0750528874999 0.156957428383 0.00753829785887 -0.091647674076 0.00190198496329 -0.0257018542091 -0.0295349216339 -0.0454820084051 -0.0120310888206 0.0210041287765 0.0126203200265 N -0.0853704925231 0.0021128481374 0.0194310374127 0.00534055417468 -0.0223593028205 -0.00403752148352 0.0353903619255 -0.0593694184462 -0.0339854863013 -0.0111666419731 0.00753829785887 0.151487423988 -0.0106077901881 0.0413965183445 -0.0338327997913 0.0170820288313 -0.00295174153884 -0.0436807942705 0.0296409813073 -0.00205806264345 P 0.0757409633086 -0.00860770840682 0.042784078891 0.022589833552 -0.0919732521492 0.0094352664965 -0.0682087048807 -0.039207153398 -0.0484016323395 -0.051023845781 -0.091647674076 -0.0106077901881 0.354629507834 0.0481497903134 -0.0377142358446 -0.00687173098621 0.0199181111388 0.0225294243984 -0.0525069717881 -0.0890062760945 Q -0.0483151514798 -0.0309903425175 0.000437307476866 0.0281404974641 -0.0930189756622 0.00425299048772 -0.00886454093107 -0.0626883806129 -0.0331603641198 -0.00134001844501 0.00190198496329 0.0413965183445 0.0481497903134 0.177175171536 0.00715630304762 0.0357241930907 0.027467611659 -0.032780800211 -0.0118972341632 -0.0487465602402 R -0.0136431408498 -0.0482562439545 -0.0591268568576 -0.0697402405064 -0.0626297946351 -0.0232280105465 0.109052662874 -0.110160438997 0.21516548555 -0.074934598492 -0.0257018542091 -0.0338327997913 -0.0377142358446 0.00715630304762 0.389022190137 0.0204288367942 -0.0408668326839 -0.0934989556047 -0.0557627605155 0.00827128508526 S 0.038455041596 -0.0217965163697 -0.0104660502173 -0.0172364513778 -0.0868415233743 0.0304312733191 0.00938179429131 -0.0618078497671 0.00476731287861 -0.0584956357369 -0.0295349216339 0.0170820288313 -0.00687173098621 0.0357241930907 0.0204288367942 0.161573840097 0.0839261885951 -0.00816241136786 -0.0444334801409 -0.0561239385213 T 0.0520376087986 -0.0227322740574 0.00656101264316 -0.0054830504799 -0.0777292391855 0.00861853592388 -0.0234122309305 -0.0339233811197 -0.0331318604828 -0.031311528799 -0.0454820084051 -0.00295174153884 0.0199181111388 0.027467611659 -0.0408668326839 0.0839261885951 0.142525860495 0.0493244941272 -0.0264928932645 -0.0468623824337 V 0.081101427454 -0.0154276574266 -0.0193560886308 -0.00806269508269 -0.015794520965 -0.0127217072682 -0.0870188771708 0.091300054417 -0.0400367780545 0.0449678806271 -0.0120310888206 -0.0436807942705 0.0225294243984 -0.032780800211 -0.0934989556047 -0.00816241136786 0.0493244941272 0.172778293246 -0.0289445753682 -0.0444846240282 W -0.125564718844 0.0412325888637 0.00415097887978 -0.00791955104235 0.0625957490761 -0.0246539147339 0.0123622841944 0.00138488610169 -0.0598522551401 -0.00754567267671 0.0210041287765 0.0296409813073 -0.0525069717881 -0.0118972341632 -0.0557627605155 -0.0444334801409 -0.0264928932645 -0.0289445753682 0.194048086876 0.0791543436022 Y -0.0747500389698 0.00600631739163 -0.0191575919464 -0.0231187170833 0.0858189617896 -0.0205094859119 0.0365879336865 -0.0230596885329 -0.00464804635586 -0.0137219703366 0.0126203200265 -0.00205806264345 -0.0890062760945 -0.0487465602402 0.00827128508526 -0.0561239385213 -0.0468623824337 -0.0444846240282 0.0791543436022 0.237788221516 """), sep=r"\s+", index_col=0, ) ) assert numpy.allclose(PMBEC_MATRIX, PMBEC_MATRIX.T) def _lower_triangular_matrix(values, amino_acids): """ Parse an AAindex-style lower-triangular symmetric matrix. """ values = [float(value) for value in values.split()] size = len(amino_acids) expected = size * (size + 1) // 2 if len(values) != expected: raise ValueError("Expected %d values, got %d" % (expected, len(values))) matrix = numpy.zeros((size, size), dtype=numpy.float32) offset = 0 for i in range(size): for j in range(i + 1): matrix[i, j] = values[offset] matrix[j, i] = values[offset] offset += 1 return pandas.DataFrame(matrix, index=amino_acids, columns=amino_acids) CONTACT_MATRIX = _matrix_with_unknown( _lower_triangular_matrix( """ -0.06711 0.06154 -0.08474 0.09263 -0.15773 -0.17967 0.08686 -0.30946 -0.15017 -0.17210 0.04917 0.10341 0.02032 0.08274 -0.17110 0.07189 -0.13486 -0.11794 -0.12196 0.02698 -0.09693 0.10110 -0.28982 -0.09284 -0.14442 0.12837 -0.10631 -0.17005 0.02605 -0.05025 -0.02792 -0.01798 -0.06868 -0.02051 0.04571 -0.08089 0.06456 -0.02235 -0.07118 -0.12234 -0.05122 -0.07235 -0.08473 -0.00788 -0.36006 -0.10028 0.19111 0.16954 0.17048 0.00854 0.13563 0.14349 0.02672 0.16715 -0.12746 -0.08988 0.18513 0.12818 0.14879 -0.00733 0.12921 0.14917 0.01380 0.12272 -0.08644 -0.06027 0.06167 -0.03348 -0.17589 -0.28130 0.10403 -0.16154 -0.32208 0.00219 0.05396 0.16985 0.10764 -0.19507 -0.03220 0.07068 0.11448 0.06630 -0.10678 0.01964 0.07144 -0.02177 0.03768 -0.00634 0.01406 0.15021 -0.00959 0.02583 0.15212 0.09736 0.14568 -0.05523 0.06410 0.11831 0.07023 0.03701 -0.08883 -0.11808 0.14062 -0.11397 -0.10140 0.04566 -0.16615 -0.09111 -0.05572 0.01966 -0.08858 -0.10634 -0.04698 -0.05851 0.12930 0.07467 -0.12627 0.09356 0.12370 -0.13648 0.05356 -0.09178 -0.07509 0.00009 -0.00836 -0.05424 0.00702 0.00867 -0.06447 0.04214 0.01289 -0.03768 -0.02411 -0.01294 -0.02111 0.01170 0.04740 -0.04650 -0.02649 0.00758 -0.04399 -0.01817 -0.02133 -0.00796 -0.03512 0.00418 0.01068 -0.01572 -0.00949 0.03108 0.02446 -0.01390 -0.01606 0.08732 0.07735 0.00987 0.02263 -0.02572 -0.06867 -0.04921 0.10405 -0.11836 0.03430 -0.06007 0.14702 -0.06644 -0.11108 0.01048 0.01889 0.01650 -0.07522 0.03904 0.02232 -0.01661 -0.05851 -0.01389 -0.04713 -0.08186 0.04000 -0.03306 0.02135 0.00677 0.06447 -0.00096 -0.02173 -0.05590 0.00139 0.00633 -0.09071 -0.03925 -0.07279 0.17288 0.10802 0.14779 0.00772 0.11813 0.11895 0.02340 0.07075 -0.13605 -0.06701 0.12223 -0.01508 -0.04855 0.11169 0.03754 0.01024 0.01594 0.03319 -0.10756 """, list("ARNDCQEGHILKMFPSTWYV"), ) ) assert numpy.allclose(CONTACT_MATRIX, CONTACT_MATRIX.T) # Five Atchley physicochemical factors from Atchley et al. 2005 # (PNAS 102:6395-6400). Columns are, respectively: polarity / # accessibility / hydrophobicity, secondary-structure propensity, # molecular size, codon composition, and electrostatic charge. X is # represented as zeros, matching the "unknown/no signal" convention # used by the BLOSUM62 X row. ATCHLEY_FACTORS = ( pandas.DataFrame.from_dict( { "A": [-0.591, -1.302, -0.733, 1.570, -0.146], "R": [1.538, -0.055, 1.502, 0.440, 2.897], "N": [0.945, 0.828, 1.299, -0.169, 0.933], "D": [1.050, 0.302, -3.656, -0.259, -3.242], "C": [-1.343, 0.465, -0.862, -1.020, -0.255], "E": [1.357, -1.453, 1.477, 0.113, -0.837], "Q": [0.931, -0.179, -3.005, -0.503, -1.853], "G": [-0.384, 1.652, 1.330, 1.045, 2.064], "H": [0.336, -0.417, -1.673, -1.474, -0.078], "I": [-1.239, -0.547, 2.131, 0.393, 0.816], "L": [-1.019, -0.987, -1.505, 1.266, -0.912], "K": [1.831, -0.561, 0.533, -0.277, 1.648], "M": [-0.663, -1.524, 2.219, -1.005, 1.212], "F": [-1.006, -0.590, 1.891, -0.397, 0.412], "P": [0.189, 2.081, -1.628, 0.421, -1.392], "S": [-0.228, 1.399, -4.760, 0.670, -2.647], "T": [-0.032, 0.326, 2.213, 0.908, 1.313], "W": [-0.595, 0.009, 0.672, -2.128, -0.184], "Y": [0.260, 0.830, 3.097, -0.838, 1.512], "V": [-1.337, -0.279, -0.544, 1.242, -1.262], "X": [0.0, 0.0, 0.0, 0.0, 0.0], }, orient="index", columns=[ "atchley_polarity", "atchley_secondary_structure", "atchley_molecular_size", "atchley_codon_composition", "atchley_electrostatic_charge", ], ) .loc[AMINO_ACIDS] .astype("float32") ) def _standardize_over_common_amino_acids(df): """ Z-score columns over the 20 common amino acids, leaving X as zeros. """ result = df.copy() common = list(COMMON_AMINO_ACIDS) means = result.loc[common].mean(axis=0) stds = result.loc[common].std(axis=0, ddof=0).replace(0.0, 1.0) result.loc[common] = (result.loc[common] - means) / stds result.loc["X"] = 0.0 return result.astype("float32") # Explicit physicochemical descriptors. Continuous scales are z-scored over # the 20 common amino acids so no single unit system dominates the dense layer: # Kyte-Doolittle hydropathy plus Grantham composition, polarity, and volume. # The remaining columns are direct side-chain chemistry indicators. X is the # neutral/no-signal row, matching the convention used by BLOSUM62. _PHYSCHEM_CONTINUOUS_RAW = pandas.DataFrame.from_dict( { "A": [1.8, 0.00, 8.1, 31.0], "R": [-4.5, 0.65, 10.5, 124.0], "N": [-3.5, 1.33, 11.6, 56.0], "D": [-3.5, 1.38, 13.0, 54.0], "C": [2.5, 2.75, 5.5, 55.0], "Q": [-3.5, 0.89, 10.5, 85.0], "E": [-3.5, 0.92, 12.3, 83.0], "G": [-0.4, 0.74, 9.0, 3.0], "H": [-3.2, 0.58, 10.4, 96.0], "I": [4.5, 0.00, 5.2, 111.0], "L": [3.8, 0.00, 4.9, 111.0], "K": [-3.9, 0.33, 11.3, 119.0], "M": [1.9, 0.00, 5.7, 105.0], "F": [2.8, 0.00, 5.2, 132.0], "P": [-1.6, 0.39, 8.0, 32.5], "S": [-0.8, 1.42, 9.2, 32.0], "T": [-0.7, 0.71, 8.6, 61.0], "W": [-0.9, 0.13, 5.4, 170.0], "Y": [-1.3, 0.20, 6.2, 136.0], "V": [4.2, 0.00, 5.9, 84.0], "X": [0.0, 0.0, 0.0, 0.0], }, orient="index", columns=[ "z_kd_hydropathy", "z_grantham_composition", "z_grantham_polarity", "z_grantham_volume", ], ).loc[AMINO_ACIDS] _PHYSCHEM_BINARY = pandas.DataFrame( 0.0, index=AMINO_ACIDS, columns=[ "side_chain_charge", "aromatic", "sulfur", "hydroxyl", "amide", "acidic", "basic", "aliphatic", "glycine", "proline", ], ) _PHYSCHEM_BINARY.loc[["D", "E"], "side_chain_charge"] = -1.0 _PHYSCHEM_BINARY.loc[["K", "R"], "side_chain_charge"] = 1.0 _PHYSCHEM_BINARY.loc["H", "side_chain_charge"] = 0.1 _PHYSCHEM_BINARY.loc[["F", "W", "Y", "H"], "aromatic"] = 1.0 _PHYSCHEM_BINARY.loc[["C", "M"], "sulfur"] = 1.0 _PHYSCHEM_BINARY.loc[["S", "T", "Y"], "hydroxyl"] = 1.0 _PHYSCHEM_BINARY.loc[["N", "Q"], "amide"] = 1.0 _PHYSCHEM_BINARY.loc[["D", "E"], "acidic"] = 1.0 _PHYSCHEM_BINARY.loc[["K", "R", "H"], "basic"] = 1.0 _PHYSCHEM_BINARY.loc[["A", "I", "L", "M", "V"], "aliphatic"] = 1.0 _PHYSCHEM_BINARY.loc["G", "glycine"] = 1.0 _PHYSCHEM_BINARY.loc["P", "proline"] = 1.0 PHYSICOCHEMICAL_PROPERTIES = pandas.concat( [ _standardize_over_common_amino_acids(_PHYSCHEM_CONTINUOUS_RAW), _PHYSCHEM_BINARY, ], axis=1, ).astype("float32") assert numpy.isfinite(PHYSICOCHEMICAL_PROPERTIES.values).all() assert (PHYSICOCHEMICAL_PROPERTIES.loc["X"].values == 0.0).all() ENCODING_DATA_FRAMES = { "BLOSUM62": BLOSUM62_MATRIX, "one-hot": pandas.DataFrame( [ [1 if i == j else 0 for i in range(len(AMINO_ACIDS))] for j in range(len(AMINO_ACIDS)) ], index=AMINO_ACIDS, columns=AMINO_ACIDS, ), "PMBEC": PMBEC_MATRIX, "pmbec": PMBEC_MATRIX, "contact": CONTACT_MATRIX, "simons1999-contact": CONTACT_MATRIX, "SIMK990103": CONTACT_MATRIX, "physchem": PHYSICOCHEMICAL_PROPERTIES, "atchley": ATCHLEY_FACTORS, } _COMPOSITE_ENCODING_DATA_FRAMES = {} _NORMALIZED_ENCODING_DATA_FRAMES = {} def _minmax_scaled_encoding(df): """ Scale non-X encoding values to [-1, 1], preserving X as all zeros. """ result = df.astype("float32").copy() common_rows = list(COMMON_AMINO_ACIDS) value_columns = [column for column in result.columns if column != "X"] values = result.loc[common_rows, value_columns].values min_value = float(values.min()) max_value = float(values.max()) if max_value == min_value: result.loc[common_rows, value_columns] = 0.0 else: result.loc[common_rows, value_columns] = ( 2.0 * (values - min_value) / (max_value - min_value) - 1.0 ) if "X" in result.index: result.loc["X"] = 0.0 if "X" in result.columns: result["X"] = 0.0 return result.astype("float32") def get_vector_encoding_df(name): """ Return the amino-acid vector encoding table for ``name``. ``name`` may be a base encoding such as ``"BLOSUM62"``, ``"PMBEC"``, ``"contact"``, ``"physchem"``, or ``"atchley"``. The aliases ``"simons1999-contact"`` and the AAindex id ``"SIMK990103"`` both refer to ``"contact"``. A component may use the ``":minmax"`` suffix to scale its non-X values to [-1, 1] while keeping X neutral. ``+``-joined composites such as ``"BLOSUM62+physchem"`` concatenate the component columns in order and keep the same amino-acid row order. """ if name in ENCODING_DATA_FRAMES: return ENCODING_DATA_FRAMES[name] if not isinstance(name, str): raise KeyError(name) if "+" in name: if name not in _COMPOSITE_ENCODING_DATA_FRAMES: parts = [part.strip() for part in name.split("+") if part.strip()] if len(parts) < 2: raise KeyError(name) frames = [ get_vector_encoding_df(part).loc[AMINO_ACIDS].add_prefix("%s:" % part) for part in parts ] composite = pandas.concat( frames, axis=1, ) if any(frame.values.dtype.kind == "f" for frame in frames): composite = composite.astype("float32") _COMPOSITE_ENCODING_DATA_FRAMES[name] = composite return _COMPOSITE_ENCODING_DATA_FRAMES[name] if ":" in name: base_name, modifier = name.rsplit(":", 1) if modifier == "minmax" and base_name: if name not in _NORMALIZED_ENCODING_DATA_FRAMES: _NORMALIZED_ENCODING_DATA_FRAMES[name] = _minmax_scaled_encoding( get_vector_encoding_df(base_name) ) return _NORMALIZED_ENCODING_DATA_FRAMES[name] raise KeyError(name) def available_vector_encodings(): """ Return list of registered amino acid vector encodings. ``get_vector_encoding_df`` also accepts ``+``-joined composites of these names and the ``:minmax`` suffix, for example ``"BLOSUM62+PMBEC:minmax"``. Several encodings are registered under more than one name (aliases: e.g. ``"PMBEC"``/``"pmbec"``, ``"contact"``/``"simons1999-contact"``/ ``"SIMK990103"``). Each underlying encoding is listed once -- by its first-registered (canonical) name -- so the advertised list has no duplicates; every alias still resolves via ``get_vector_encoding_df``. Returns ------- list of string """ seen_ids = set() unique_names = [] for name, df in ENCODING_DATA_FRAMES.items(): if id(df) not in seen_ids: seen_ids.add(id(df)) unique_names.append(name) return unique_names def vector_encoding_length(name): """ Return the length of the given vector encoding. Parameters ---------- name : string Returns ------- int """ return get_vector_encoding_df(name).shape[1] def vector_encoding_index_table(name): """ Return a float32 lookup table aligned to canonical amino-acid indices. Rows are ordered so ``table[AMINO_ACID_INDEX[letter]]`` is the vector encoding for ``letter``. Torch embedding layers and numpy materialization paths should both use this helper to keep amino-acid index semantics centralized. """ return ( get_vector_encoding_df(name).loc[AMINO_ACIDS].to_numpy().astype(numpy.float32) ) def index_encoding(sequences, letter_to_index_dict): """ Encode a sequence of same-length strings to a matrix of integers of the same shape. The map from characters to integers is given by `letter_to_index_dict`. Given a sequence of `n` strings all of length `k`, return an `n * k` array where the (`i`, `j`)th element is `letter_to_index_dict[sequence[i][j]]`. Parameters ---------- sequences : list of length n of strings of length k letter_to_index_dict : dict : string -> int Returns ------- numpy.array of integers with shape (`n`, `k`) """ df = pandas.DataFrame(iter(s) for s in sequences) with warnings.catch_warnings(): warnings.filterwarnings( "ignore", category=FutureWarning, message=".*Downcasting.*" ) warnings.filterwarnings( "ignore", category=DeprecationWarning, message=".*no_silent_downcasting.*" ) result = df.replace(letter_to_index_dict).infer_objects() return result.values def fixed_vectors_encoding(index_encoded_sequences, letter_to_vector_df): """ Given a `n` x `k` matrix of integers such as that returned by `index_encoding()` and a dataframe mapping each index to an arbitrary vector, return a `n * k * m` array where the (`i`, `j`)'th element is `letter_to_vector_df.iloc[sequence[i][j]]`. The dataframe index and columns names are ignored here; the indexing is done entirely by integer position in the dataframe. Parameters ---------- index_encoded_sequences : `n` x `k` array of integers letter_to_vector_df : pandas.DataFrame of shape (`alphabet size`, `m`) Returns ------- numpy.array with shape (`n`, `k`, `m`), using the vector table's dtype """ num_sequences, sequence_length = index_encoded_sequences.shape target_shape = (num_sequences, sequence_length, letter_to_vector_df.shape[1]) result = letter_to_vector_df.iloc[ index_encoded_sequences.reshape((-1,)) # reshape() avoids copy ].values.reshape(target_shape) return result mhcflurry-2.3.6/mhcflurry/calibrate_percentile_ranks_command.py000066400000000000000000000014661525677230600252020ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Compatibility wrapper for :mod:`mhcflurry.cli.calibrate_percentile_ranks_command`.""" from .cli import calibrate_percentile_ranks_command as _impl run = _impl.run parser = _impl.parser def __getattr__(name): return getattr(_impl, name) __all__ = ["run", "parser"] mhcflurry-2.3.6/mhcflurry/class1_affinity_predictor.py000066400000000000000000003164671525677230600233120ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import collections import hashlib import json import logging import shlex import time import warnings from os.path import join, abspath, dirname from os import environ import numpy import pandas from .class1_neural_network import ( Class1NeuralNetwork, cartesian_network_output, cartesian_output_log_ic50_sum, ) from .motif_summary import ( prepare_motif_summary_state_gpu, motif_summary_chunk_gpu, ) from .common import ( derive_seed, random_peptides, positional_frequency_matrix, normalize_allele_name, AlleleKeyResolver, ) from .encodable_sequences import EncodableSequences from .histogram_percent_rank_transform import HistogramPercentRankTransform from .percentile_calibration import ( calibration_method, factorize_calibration_groups, fit_percent_rank_transform) from .regression_target import to_ic50 from .version import __version__ from .ensemble_centrality import CENTRALITY_MEASURES from .allele_encoding import AlleleEncoding from .affinity import calibration_sizing, model_selection, persistence # Default function for combining predictions across models in an ensemble. # See ensemble_centrality.py for other options. DEFAULT_CENTRALITY_MEASURE = "mean" # Any value > 0 will result in attempting to optimize models after loading. OPTIMIZATION_LEVEL = int(environ.get("MHCFLURRY_OPTIMIZATION_LEVEL", "1")) class Class1AffinityPredictor(object): """ High-level interface for peptide/MHC I binding affinity prediction. This class manages low-level `Class1NeuralNetwork` instances, each of which wraps a single PyTorch network. The purpose of `Class1AffinityPredictor` is to implement ensembles, handling of multiple alleles, and predictor loading and saving. It also keeps per-allele percentile calibration transforms: compact curves for new calibration, or historical histogram mappings. """ def __init__( self, allele_to_allele_specific_models=None, class1_pan_allele_models=None, allele_to_sequence=None, manifest_df=None, allele_to_percent_rank_transform=None, metadata_dataframes=None, provenance_string=None, optimization_info=None, models_dir=None): """ Parameters ---------- allele_to_allele_specific_models : dict of string -> list of `Class1NeuralNetwork` Ensemble of single-allele models to use for each allele. class1_pan_allele_models : list of `Class1NeuralNetwork` Ensemble of pan-allele models. allele_to_sequence : dict of string -> string MHC allele name to fixed-length pseudosequence. Required only if class1_pan_allele_models is specified. manifest_df : `pandas.DataFrame`, optional Must have columns: model_name, allele, config_json, model. Only required if you want to update an existing serialization of a Class1AffinityPredictor. Otherwise this dataframe will be generated automatically based on the supplied models. allele_to_percent_rank_transform : dict of string -> transform, optional HistogramPercentRankTransform or CompactPercentRankTransform for each allele. Loading preserves the stored calibration method. metadata_dataframes : dict of string -> pandas.DataFrame, optional Optional additional dataframes to write to the models dir when save() is called. Useful for tracking provenance. provenance_string : string, optional Optional info string to use in __str__. optimization_info : dict, optional Dict describing any optimizations already performed on the model. The only currently supported optimization is to merge ensembles together into one PyTorch model. models_dir : string, optional Directory this predictor was loaded from. Used for diagnostics. """ if allele_to_allele_specific_models is None: allele_to_allele_specific_models = {} if class1_pan_allele_models is None: class1_pan_allele_models = [] self.allele_to_sequence = ( dict(allele_to_sequence) if allele_to_sequence is not None else None) # make a copy self._master_allele_encoding = None if class1_pan_allele_models: assert self.allele_to_sequence self.allele_to_allele_specific_models = allele_to_allele_specific_models self.class1_pan_allele_models = class1_pan_allele_models self._manifest_df = manifest_df if not allele_to_percent_rank_transform: allele_to_percent_rank_transform = {} self.allele_to_percent_rank_transform = allele_to_percent_rank_transform self.metadata_dataframes = ( dict(metadata_dataframes) if metadata_dataframes else {}) self._cache = {} self.optimization_info = optimization_info if optimization_info else {} assert isinstance(self.allele_to_allele_specific_models, dict) assert isinstance(self.class1_pan_allele_models, list) self.provenance_string = provenance_string self.models_dir = models_dir self.allele_to_canonical = {} # populated by load() @property def manifest_df(self): """ A pandas.DataFrame describing the models included in this predictor. Based on: - self.class1_pan_allele_models - self.allele_to_allele_specific_models Returns ------- pandas.DataFrame """ if self._manifest_df is None: rows = [] for (i, model) in enumerate(self.class1_pan_allele_models): rows.append(( self.model_name("pan-class1", i), "pan-class1", json.dumps(model.get_config()), model )) for (allele, models) in self.allele_to_allele_specific_models.items(): for (i, model) in enumerate(models): rows.append(( self.model_name(allele, i), allele, json.dumps(model.get_config()), model )) self._manifest_df = pandas.DataFrame( rows, columns=["model_name", "allele", "config_json", "model"]) return self._manifest_df def clear_cache(self): """ Clear values cached based on the neural networks in this predictor. Users should call this after mutating any of the following: - self.class1_pan_allele_models - self.allele_to_allele_specific_models - self.allele_to_sequence Methods that mutate these instance variables will call this method on their own if needed. """ self._cache.clear() self.provenance_string = None self.models_dir = None @property def neural_networks(self): """ List of the neural networks in the ensemble. Returns ------- list of `Class1NeuralNetwork` """ result = [] for models in self.allele_to_allele_specific_models.values(): result.extend(models) result.extend(self.class1_pan_allele_models) return result @classmethod def _allele_to_sequence_for_merge(cls, predictors): """Return a safe pseudosequence mapping for a predictor merge.""" pan_predictors = [ predictor for predictor in predictors if predictor.class1_pan_allele_models ] if not pan_predictors: for predictor in predictors: if predictor.allele_to_sequence is not None: return dict(predictor.allele_to_sequence) return None expected = dict(pan_predictors[0].allele_to_sequence) for (index, predictor) in enumerate(pan_predictors[1:], start=1): observed = dict(predictor.allele_to_sequence) if observed == expected: continue expected_keys = set(expected) observed_keys = set(observed) conflicting = sorted( allele for allele in expected_keys & observed_keys if expected[allele] != observed[allele] ) missing = sorted(expected_keys - observed_keys) extra = sorted(observed_keys - expected_keys) raise ValueError( "Cannot merge pan-allele predictors with incompatible " "allele_to_sequence mappings. Pan predictor %d differs from " "the first: conflicting=%s, missing=%s, extra=%s" % ( index, conflicting[:5], missing[:5], extra[:5], ) ) return expected @classmethod def merge(cls, predictors): """ Merge the ensembles of two or more `Class1AffinityPredictor` instances. Note: the resulting merged predictor will NOT have calibrated percentile ranks. Call `calibrate_percentile_ranks` on it if these are needed. Parameters ---------- predictors : sequence of `Class1AffinityPredictor` Returns ------- `Class1AffinityPredictor` instance """ assert len(predictors) > 0 if len(predictors) == 1: return predictors[0] allele_to_allele_specific_models = collections.defaultdict(list) class1_pan_allele_models = [] allele_to_sequence = cls._allele_to_sequence_for_merge(predictors) for predictor in predictors: for (allele, networks) in ( predictor.allele_to_allele_specific_models.items()): allele_to_allele_specific_models[allele].extend(networks) class1_pan_allele_models.extend( predictor.class1_pan_allele_models) return Class1AffinityPredictor( allele_to_allele_specific_models=allele_to_allele_specific_models, class1_pan_allele_models=class1_pan_allele_models, allele_to_sequence=allele_to_sequence ) def merge_in_place(self, others): """ Add the models present in other predictors into the current predictor. Parameters ---------- others : list of Class1AffinityPredictor Other predictors to merge into the current predictor. Returns ------- list of string : names of newly added models """ others = list(others) allele_to_sequence = self._allele_to_sequence_for_merge( [self] + others) new_model_names = [] original_manifest = self.manifest_df new_manifest_rows = [] for predictor in others: for model in predictor.class1_pan_allele_models: model_name = self.model_name( "pan-class1", len(self.class1_pan_allele_models)) row = pandas.Series(collections.OrderedDict([ ("model_name", model_name), ("allele", "pan-class1"), ("config_json", json.dumps(model.get_config())), ("model", model), ])).to_frame().T new_manifest_rows.append(row) self.class1_pan_allele_models.append(model) new_model_names.append(model_name) for allele in predictor.allele_to_allele_specific_models: if allele not in self.allele_to_allele_specific_models: self.allele_to_allele_specific_models[allele] = [] current_models = self.allele_to_allele_specific_models[allele] for model in predictor.allele_to_allele_specific_models[allele]: model_name = self.model_name(allele, len(current_models)) row = pandas.Series(collections.OrderedDict([ ("model_name", model_name), ("allele", allele), ("config_json", json.dumps(model.get_config())), ("model", model), ])).to_frame().T new_manifest_rows.append(row) current_models.append(model) new_model_names.append(model_name) self.allele_to_sequence = allele_to_sequence self._manifest_df = pandas.concat( [original_manifest] + new_manifest_rows, ignore_index=True) self.clear_cache() self.check_consistency() return new_model_names def canonicalize_allele_name( self, raw_name, raise_on_error=True, default_value=None): """ Normalize an allele name and map it to the canonical pseudosequence key if possible. Tries without IMGT aliases first so that alleles like HLA-C*01:01 (which aliases map to C*01:02) resolve to their own pseudosequence when one exists. By default, raises on names that cannot be normalized. Pass ``raise_on_error=False`` to return ``default_value`` instead. The no-alias-first logic lives in ``AlleleKeyResolver``; training ingestion shares it via ``canonicalize_allele_series``. Parameters ---------- raw_name : str raise_on_error : bool Whether to raise a descriptive ``ValueError`` for invalid, ambiguous, non-class-I, or unsupported-annotation names. default_value : object Value returned for an invalid name when ``raise_on_error`` is false. Returns ------- str """ # Cache one resolver (built from the already-built load-time maps) so # the per-row calls in predict_to_dataframe don't reconstruct it each # time. Lives in ``self._cache`` so ``clear_cache`` drops it whenever # the allele maps change, exactly as ``supported_alleles`` is handled. if "allele_key_resolver" not in self._cache: self._cache["allele_key_resolver"] = AlleleKeyResolver( self.allele_to_sequence, self.allele_to_canonical) result = self._cache["allele_key_resolver"].resolve( raw_name, raise_on_error=raise_on_error) if result is None: return default_value return result def _canonicalize_prediction_alleles(self, raw_alleles, throw): """Canonicalize prediction inputs under the caller's error policy.""" normalized = [] errors = [] seen_errors = set() for raw_name in raw_alleles: try: value = self.canonicalize_allele_name(raw_name) except (TypeError, ValueError) as error: if throw: raise value = None message = str(error) if message not in seen_errors: seen_errors.add(message) errors.append(message) normalized.append(value) if errors: logging.warning( "%d invalid or unsupported allele name(s) will receive NaN " "predictions: %s", len(errors), "; ".join(errors), ) return normalized @property def supported_alleles(self): """ Alleles for which predictions can be made. Returns ------- list of string """ if 'supported_alleles' not in self._cache: result = set(self.allele_to_allele_specific_models) if self.allele_to_sequence: result = result.union(self.allele_to_sequence) self._cache["supported_alleles"] = sorted(result) return self._cache["supported_alleles"] @property def supported_peptide_lengths(self): """ (minimum, maximum) lengths of peptides supported by *all models*, inclusive. Returns ------- (int, int) tuple """ if 'supported_peptide_lengths' not in self._cache: length_ranges = set( network.supported_peptide_lengths for network in self.neural_networks) result = ( max(lower for (lower, upper) in length_ranges), min(upper for (lower, upper) in length_ranges)) self._cache["supported_peptide_lengths"] = result return self._cache["supported_peptide_lengths"] def check_consistency(self): """ Verify that self.manifest_df is consistent with: - self.class1_pan_allele_models - self.allele_to_allele_specific_models Currently only checks for agreement on the total number of models. Throws AssertionError if inconsistent. """ num_models = len(self.class1_pan_allele_models) + sum( len(v) for v in self.allele_to_allele_specific_models.values()) assert len(self.manifest_df) == num_models, ( "Manifest seems out of sync with models: %d vs %d entries: " "\n%s\npan-allele: %s\nallele-specific: %s"% ( len(self.manifest_df), num_models, str(self.manifest_df), str(self.class1_pan_allele_models), str(self.allele_to_allele_specific_models))) def save(self, models_dir, model_names_to_write=None, write_metadata=True): """ Serialize the predictor to a directory on disk. If the directory does not exist it will be created. The serialization format consists of a file called "manifest.csv" with the configurations of each Class1NeuralNetwork, along with per-network files giving the model weights. If there are pan-allele predictors in the ensemble, the pseudosequences are also stored in the directory. There is also a small file "info.txt" with basic metadata: when the models were trained, by whom, on what host. Parameters ---------- models_dir : string Path to directory. It will be created if it doesn't exist. model_names_to_write : list of string, optional Only write the weights for the specified models. Useful for incremental updates during training. Passing an explicit empty list writes no model artifacts; this is used by calibration-only updates that replace percentile calibration (CSV or JSON) without touching the manifest, weights, model provenance, allele sequences, or optimization metadata. Explicit ``metadata_dataframes`` are still written when ``write_metadata`` is true. write_metadata : boolean, optional Whether to write optional metadata """ return persistence.save_predictor( self, models_dir, model_names_to_write=model_names_to_write, write_metadata=write_metadata, ) @staticmethod def load(models_dir=None, max_models=None, optimization_level=None): """ Deserialize a predictor from a directory on disk. Parameters ---------- models_dir : string, optional Path to a standalone affinity predictor. If omitted, use the affinity path override or the active release's standalone bundle; if that default bundle is absent, load the affinity component of the default presentation predictor. Explicit paths take precedence. max_models : int, optional Maximum number of `Class1NeuralNetwork` instances to load optimization_level : int If >0, model optimization will be attempted. Defaults to value of environment variable MHCFLURRY_OPTIMIZATION_LEVEL (1 when unset). Returns ------- `Class1AffinityPredictor` instance """ return persistence.load_predictor( Class1AffinityPredictor, models_dir=models_dir, max_models=max_models, optimization_level=optimization_level, optimization_level_default=OPTIMIZATION_LEVEL, ) def __repr__(self): pieces = ["at 0x%0x" % id(self), "[mhcflurry %s]" % __version__] pan_models = len(self.class1_pan_allele_models) total_models = len(self.neural_networks) if total_models == 0: pieces.append("[empty]") elif pan_models == total_models: pieces.append("[pan]") elif pan_models == 0: pieces.append("[allele-specific]") else: pieces.append("[pan+allele-specific]") if self.provenance_string: pieces.append(self.provenance_string) return "" % " ".join(pieces) def optimize(self, warn=True): """ EXPERIMENTAL: Optimize the predictor for faster predictions. Currently the only optimization implemented is to merge multiple pan- allele predictors at the PyTorch level. The optimization is performed in-place, mutating the instance. Returns ------- bool Whether optimization was performed """ num_class1_pan_allele_models = len(self.class1_pan_allele_models) if num_class1_pan_allele_models > 1: provenance_string = self.provenance_string try: self.class1_pan_allele_models = [ Class1NeuralNetwork.merge( self.class1_pan_allele_models, merge_method="concatenate") ] except NotImplementedError as e: if warn: logging.warning("Optimization failed: %s", str(e)) return False self._manifest_df = None self.clear_cache() self.optimization_info["pan_models_merged"] = True self.optimization_info["num_pan_models_merged"] = ( num_class1_pan_allele_models) self.provenance_string = provenance_string else: return False return True @staticmethod def model_name(allele, num): """ Generate a model name Parameters ---------- allele : string num : int Returns ------- string """ random_string = hashlib.sha1( str(time.time()).encode()).hexdigest()[:16] return "%s-%d-%s" % ( allele.upper().replace("*", "_").replace(":", "_"), num, random_string) @staticmethod def weights_path(models_dir, model_name): """ Generate the path to the weights file for a model Parameters ---------- models_dir : string model_name : string Returns ------- string """ return join(models_dir, "weights_%s.npz" % model_name) @staticmethod def checkpoint_weights_path(models_dir, model_name, policy): """Generate the path to a retained training-checkpoint weight file.""" if policy not in ("terminal", "best"): raise ValueError("Unknown checkpoint policy: %s" % policy) return join( models_dir, "checkpoints", policy, "weights_%s.npz" % model_name, ) @property def master_allele_encoding(self): """ An AlleleEncoding containing the universe of alleles specified by self.allele_to_sequence. Returns ------- AlleleEncoding """ if (self._master_allele_encoding is None or self._master_allele_encoding.allele_to_sequence != self.allele_to_sequence): self._master_allele_encoding = AlleleEncoding( allele_to_sequence=self.allele_to_sequence) return self._master_allele_encoding def fit_allele_specific_predictors( self, n_models, architecture_hyperparameters_list, allele, peptides, affinities, inequalities=None, train_rounds=None, models_dir_for_save=None, verbose=0, progress_preamble="", progress_print_interval=5.0, seed=None): """ Fit one or more allele specific predictors for a single allele using one or more neural network architectures. The new predictors are saved in the Class1AffinityPredictor instance and will be used on subsequent calls to `predict`. Parameters ---------- n_models : int Number of neural networks to fit architecture_hyperparameters_list : list of dict List of hyperparameter sets. allele : string peptides : `EncodableSequences` or list of string affinities : list of float nM affinities inequalities : list of string, each element one of ">", "<", or "=" See `Class1NeuralNetwork.fit` for details. train_rounds : sequence of int Each training point i will be used on training rounds r for which train_rounds[i] > r, r >= 0. models_dir_for_save : string, optional If specified, the Class1AffinityPredictor is (incrementally) written to the given models dir after each neural network is fit. verbose : int Verbosity level for training output progress_preamble : string Optional string of information to include in each progress update progress_print_interval : float How often (in seconds) to print progress. Set to None to disable. seed : int, optional Base seed for this allele's fits. When given, each (model_num, architecture_num) pair gets a distinct sub-seed derived from it, so ensemble members are decorrelated but the whole call is reproducible. When None, each `Class1NeuralNetwork.fit` is left entropy-seeded as before. Returns ------- list of `Class1NeuralNetwork` """ allele = normalize_allele_name(allele) if allele not in self.allele_to_allele_specific_models: self.allele_to_allele_specific_models[allele] = [] encodable_peptides = EncodableSequences.create(peptides) peptides_affinities_inequalities_per_round = [ (encodable_peptides, affinities, inequalities) ] if train_rounds is not None: for round in sorted(set(train_rounds)): round_mask = train_rounds > round if round_mask.any(): sub_encodable_peptides = EncodableSequences.create( encodable_peptides.sequences[round_mask]) peptides_affinities_inequalities_per_round.append(( sub_encodable_peptides, affinities[round_mask], None if inequalities is None else inequalities[round_mask])) n_rounds = len(peptides_affinities_inequalities_per_round) n_architectures = len(architecture_hyperparameters_list) # Adjust progress info to indicate number of models and # architectures. pieces = [] if n_models > 1: pieces.append("Model {model_num:2d} / {n_models:2d}") if n_architectures > 1: pieces.append( "Architecture {architecture_num:2d} / {n_architectures:2d}") if len(peptides_affinities_inequalities_per_round) > 1: pieces.append("Round {round:2d} / {n_rounds:2d}") pieces.append("{n_peptides:4d} peptides") progress_preamble_template = "[ %s ] {user_progress_preamble}" % ( ", ".join(pieces)) models = [] for model_num in range(n_models): for (architecture_num, architecture_hyperparameters) in enumerate( architecture_hyperparameters_list): model = Class1NeuralNetwork(**architecture_hyperparameters) for round_num in range(n_rounds): # Distinct sub-seed per (ensemble member, architecture, # round) so members don't initialize identically and each # round sees a different shuffle / random-negative draw, # while the whole call stays reproducible from the # caller's base seed. fit() re-seeds the global RNG at its # start, so the round_num must be part of the mix — # otherwise every round would replay round 0's randomness. fit_seed = ( None if seed is None else derive_seed( seed, model_num, architecture_num, round_num)) (round_peptides, round_affinities, round_inequalities) = ( peptides_affinities_inequalities_per_round[round_num] ) model.fit( round_peptides, round_affinities, inequalities=round_inequalities, verbose=verbose, seed=fit_seed, progress_preamble=progress_preamble_template.format( n_peptides=len(round_peptides), round=round_num, n_rounds=n_rounds, user_progress_preamble=progress_preamble, model_num=model_num + 1, n_models=n_models, architecture_num=architecture_num + 1, n_architectures=n_architectures), progress_print_interval=progress_print_interval) model_name = self.model_name(allele, model_num) row = pandas.Series(collections.OrderedDict([ ("model_name", model_name), ("allele", allele), ("config_json", json.dumps(model.get_config())), ("model", model), ])).to_frame().T self._manifest_df = pandas.concat( [self.manifest_df, row], ignore_index=True) self.allele_to_allele_specific_models[allele].append(model) if models_dir_for_save: self.save( models_dir_for_save, model_names_to_write=[model_name]) models.append(model) self.clear_cache() return models def fit_class1_pan_allele_models( self, n_models, architecture_hyperparameters, alleles, peptides, affinities, inequalities, models_dir_for_save=None, verbose=1, progress_preamble="", progress_print_interval=5.0, seed=None): """ Fit one or more pan-allele predictors using a single neural network architecture. The new predictors are saved in the Class1AffinityPredictor instance and will be used on subsequent calls to `predict`. Parameters ---------- n_models : int Number of neural networks to fit architecture_hyperparameters : dict alleles : list of string Allele names (not sequences) corresponding to each peptide peptides : `EncodableSequences` or list of string affinities : list of float nM affinities inequalities : list of string, each element one of ">", "<", or "=" See Class1NeuralNetwork.fit for details. models_dir_for_save : string, optional If specified, the Class1AffinityPredictor is (incrementally) written to the given models dir after each neural network is fit. verbose : int Verbosity level for training output progress_preamble : string Optional string of information to include in each progress update progress_print_interval : float How often (in seconds) to print progress. Set to None to disable. seed : int, optional Base seed for these fits. When given, each ensemble member gets a distinct sub-seed derived from it, so members are decorrelated but the whole call is reproducible. When None, each `Class1NeuralNetwork.fit` is left entropy-seeded as before. Returns ------- list of `Class1NeuralNetwork` """ alleles = pandas.Series(alleles).map(normalize_allele_name) allele_encoding = AlleleEncoding( alleles, borrow_from=self.master_allele_encoding) encodable_peptides = EncodableSequences.create(peptides) models = [] for i in range(n_models): logging.info("Training model %d / %d", i + 1, n_models) model = Class1NeuralNetwork(**architecture_hyperparameters) fit_seed = None if seed is None else derive_seed(seed, i) model.fit( encodable_peptides, affinities, inequalities=inequalities, allele_encoding=allele_encoding, verbose=verbose, seed=fit_seed, progress_preamble=progress_preamble, progress_print_interval=progress_print_interval) model_name = self.model_name("pan-class1", i) row = pandas.Series(collections.OrderedDict([ ("model_name", model_name), ("allele", "pan-class1"), ("config_json", json.dumps(model.get_config())), ("model", model), ])).to_frame().T self._manifest_df = pandas.concat( [self.manifest_df, row], ignore_index=True) self.class1_pan_allele_models.append(model) if models_dir_for_save: self.save( models_dir_for_save, model_names_to_write=[model_name]) models.append(model) self.clear_cache() return models def add_pan_allele_model(self, model, models_dir_for_save=None): """ Add a pan-allele model to the ensemble and optionally do an incremental save. Parameters ---------- model : Class1NeuralNetwork models_dir_for_save : string Directory to save resulting ensemble to """ model_name = self.model_name("pan-class1", 1) row = pandas.Series(collections.OrderedDict([ ("model_name", model_name), ("allele", "pan-class1"), ("config_json", json.dumps(model.get_config())), ("model", model), ])).to_frame().T self._manifest_df = pandas.concat( [self.manifest_df, row], ignore_index=True) self.class1_pan_allele_models.append(model) self.clear_cache() self.check_consistency() if models_dir_for_save: self.save( models_dir_for_save, model_names_to_write=[model_name]) def percentile_ranks(self, affinities, allele=None, alleles=None, throw=True): """ Return percentile ranks for the given ic50 affinities and alleles. The 'allele' and 'alleles' argument are as in the `predict` method. Specify one of these. Parameters ---------- affinities : sequence of float nM affinities allele : string alleles : sequence of string throw : boolean If True, a ValueError will be raised in the case of unsupported alleles. If False, a warning will be logged and NaN will be returned for those percentile ranks. Returns ------- numpy.array of float """ if allele is not None: normalized_allele = self._canonicalize_prediction_alleles( [allele], throw=throw)[0] if normalized_allele is None: return numpy.full(len(affinities), numpy.nan, dtype="float64") calibrated_allele = self.percent_rank_calibrated_allele( normalized_allele ) if calibrated_allele is not None: transform = self.allele_to_percent_rank_transform[calibrated_allele] try: return transform.transform(affinities) except ValueError as error: # Compact curves reject non-positive or infinite affinities # where histogram bins clamped them. Honor the documented # throw contract instead of raising from inside a batch. message = ( "Percentile ranks for %s require positive finite nM " "affinities or NaN: %s" % (calibrated_allele, error)) if throw: raise ValueError(message) from error warnings.warn(message) return numpy.full(len(affinities), numpy.nan, dtype="float64") allele_repr = allele + ( "" if allele == normalized_allele else " (normalized to %s)" % normalized_allele) affinity_known = ( self.allele_to_sequence is not None and normalized_allele in self.allele_to_sequence ) hint_lines = [ "Missing percentile-rank calibration for %s." % allele_repr, ] if affinity_known: hint_lines.append( "Affinity predictions are available; percentile ranks are not." ) else: hint_lines.append( "The predictor also lacks an allele sequence for %s; " "affinity prediction is unavailable." % normalized_allele ) calibrate_command = ["mhcflurry-calibrate-percentile-ranks"] models_dir = self.models_dir_for_diagnostics() if models_dir: calibrate_command.extend(["--models-dir", models_dir]) calibrate_command.extend(["--allele", normalized_allele, "..."]) calibrate_command = " ".join( shlex.quote(part) for part in calibrate_command ) if models_dir: command_message = "Calibrate with: `%s`." % calibrate_command else: command_message = ( "Calibrate with: `%s` against this models directory." % calibrate_command ) hint_lines.append( command_message ) msg = " ".join(hint_lines) if throw: raise ValueError(msg) warnings.warn(msg) return numpy.ones(len(affinities)) * numpy.nan # Return NaNs if alleles is None: raise ValueError("Specify allele or alleles") df = pandas.DataFrame({"affinity": affinities}) df["allele"] = alleles df["result"] = numpy.nan for (allele, sub_df) in df.groupby("allele"): df.loc[sub_df.index, "result"] = self.percentile_ranks( sub_df.affinity, allele=allele, throw=throw) return df.result.values def models_dir_for_diagnostics(self): """Return explicit or inferred models dir for user-facing messages.""" if self.models_dir: return self.models_dir source_dirs = set() for model in self.neural_networks: for path in getattr(model, "network_weight_paths", ()): source_dir = dirname(path) if source_dir: source_dirs.add(abspath(source_dir)) if len(source_dirs) == 1: return next(iter(source_dirs)) return None def percent_rank_calibrated_allele(self, allele): """Return the allele key whose percentile-rank transform applies. Percent-rank calibration is allele-specific, but pan predictors can reuse calibration from another allele with the same pseudosequence. This helper centralizes that equivalence check for prediction and CLI status/filtering code. """ normalized_allele = self.canonicalize_allele_name(allele) if normalized_allele in self.allele_to_percent_rank_transform: return normalized_allele if ( self.allele_to_sequence is None or normalized_allele not in self.allele_to_sequence): return None sequence = self.allele_to_sequence[normalized_allele] for other_allele in sorted(self.allele_to_sequence): if ( self.allele_to_sequence[other_allele] == sequence and other_allele in self.allele_to_percent_rank_transform): return other_allele return None def predict( self, peptides, alleles=None, allele=None, throw=True, centrality_measure=DEFAULT_CENTRALITY_MEASURE, model_kwargs=None): """ Predict nM binding affinities. If multiple predictors are available for an allele, the predictions are the geometric means of the individual model (nM) predictions. One of 'allele' or 'alleles' must be specified. If 'allele' is specified all predictions will be for the given allele. If 'alleles' is specified it must be the same length as 'peptides' and give the allele corresponding to each peptide. Parameters ---------- peptides : `EncodableSequences` or list of string alleles : list of string allele : string throw : boolean If True, a ValueError will be raised in the case of unsupported alleles or peptide lengths. If False, a warning will be logged and the predictions for the unsupported alleles or peptides will be NaN. centrality_measure : string or callable Measure of central tendency to use to combine predictions in the ensemble. Options include: mean, median, robust_mean. model_kwargs : dict Additional keyword arguments to pass to Class1NeuralNetwork.predict Returns ------- numpy.array of predictions """ if model_kwargs is None: model_kwargs = {} df = self.predict_to_dataframe( peptides=peptides, alleles=alleles, allele=allele, throw=throw, include_percentile_ranks=False, include_confidence_intervals=False, centrality_measure=centrality_measure, model_kwargs=model_kwargs, ) return df.prediction.values def predict_numeric(self, peptides, allele, centrality_measure=DEFAULT_CENTRALITY_MEASURE, model_kwargs=None): """Score numeric peptides for one allele without materializing strings. Parameters ---------- peptides : NumericSequences Unaligned integer residues and actual lengths, on CPU or device. allele : str One sequence-resolved allele for all rows. Unsupported alleles, lengths and noncanonical residues raise, as with ``predict(throw=True)``. centrality_measure : str or callable The same log-affinity ensemble aggregation used by ``predict``. model_kwargs : dict, optional Network prediction options, including batch size. Returns ------- numpy.ndarray Float64 ensemble affinities in input order (nM). """ from .numeric_sequences import NumericSequences, UNKNOWN_INDEX if not isinstance(peptides, NumericSequences): raise TypeError("predict_numeric requires NumericSequences") canonical = self._canonicalize_prediction_alleles([allele], throw=True)[0] if not len(peptides): return numpy.empty(0, dtype="float64") minimum, maximum = self.supported_peptide_lengths if ((peptides.lengths < minimum) | (peptides.lengths > maximum)).any(): raise ValueError("Numeric peptide lengths outside supported range") import torch active = torch.arange(peptides.indices.shape[1], device=peptides.indices.device)[None, :] < peptides.lengths[:, None] if (active & (peptides.indices == UNKNOWN_INDEX)).any(): raise ValueError("Numeric peptides have nonstandard amino acids") kwargs = model_kwargs or {} predictions = [] if self.class1_pan_allele_models: if canonical not in self.allele_to_sequence: raise ValueError("No sequences for allele: " + str(canonical)) encoding = AlleleEncoding([canonical] * len(peptides), borrow_from=self.master_allele_encoding).compact() for model in self.class1_pan_allele_models: predictions.append(model.predict(peptides, allele_encoding=encoding, output_index=None if self.optimization_info.get("pan_models_merged") else 0, **kwargs)) if self.allele_to_allele_specific_models: models = self.allele_to_allele_specific_models.get(canonical) if not models: raise ValueError("No single-allele models for allele: " + str(canonical)) predictions.extend(model.predict(peptides, **kwargs) for model in models) if not predictions: raise ValueError("No affinity models available") matrix = numpy.concatenate([numpy.asarray(value).reshape(len(peptides), -1) for value in predictions], axis=1) logs = numpy.log(matrix.astype("float64")) centrality = centrality_measure if callable(centrality_measure) else CENTRALITY_MEASURES[centrality_measure] valid = (~numpy.isnan(logs)).any(axis=1) result = numpy.full(len(peptides), numpy.nan, dtype="float64") result[valid] = numpy.exp(centrality(logs[valid])) return result def predict_cartesian_pan_allele( self, peptides, alleles, throw=True, centrality_measure=DEFAULT_CENTRALITY_MEASURE, model_kwargs=None): """ Predict a peptide x allele matrix using the optimized pan-allele path. Returns ``None`` when the predictor is not a single optimized merged pan-allele model. Callers can then fall back to ``predict``. This path keeps peptide encodings unique, computes the peptide stage once per peptide batch, and combines it with allele embeddings on-device. """ if model_kwargs is None: model_kwargs = {} else: model_kwargs = dict(model_kwargs) if ( not self.optimization_info.get("pan_models_merged", False) or len(self.class1_pan_allele_models) != 1 or self.allele_to_allele_specific_models): return None import torch from .pytorch_sizing import ( DEFAULT_PREDICT_BATCH_SIZE, resolve_prediction_batch_size, ) from .pytorch_training import ( configure_matmul_precision, maybe_compile_network, ) peptides = EncodableSequences.create(peptides) if len(peptides) == 0 or len(alleles) == 0: return numpy.empty((len(peptides), len(alleles)), dtype="float64") (min_peptide_length, max_peptide_length) = ( self.supported_peptide_lengths) peptide_df = pandas.DataFrame({"peptide": peptides.sequences}) sequence_length = peptide_df.peptide.str.len() supported_peptide = ( (sequence_length >= min_peptide_length) & (sequence_length <= max_peptide_length) ) if (~supported_peptide).any(): msg = ( "%d peptides have lengths outside of supported range [%d, %d]: " "%s" % ( (~supported_peptide).sum(), min_peptide_length, max_peptide_length, str(peptide_df.loc[~supported_peptide].peptide.unique()))) logging.warning(msg) if throw: raise ValueError(msg) peptide_has_valid_amino_acids = ( (~supported_peptide) | peptide_df.peptide.str.upper().str.match("^[ACDEFGHIKLMNPQRSTVWY]+$") ) supported_peptide = supported_peptide & peptide_has_valid_amino_acids if (~peptide_has_valid_amino_acids).any(): msg = ( "%d peptides have nonstandard amino acids: " "%s" % ( (~peptide_has_valid_amino_acids).sum(), str(peptide_df.loc[ ~peptide_has_valid_amino_acids ].peptide.unique()))) logging.warning(msg) if throw: raise ValueError(msg) normalized_alleles = self._canonicalize_prediction_alleles( alleles, throw=throw) unsupported_alleles = sorted({ allele for allele in normalized_alleles if ( allele is not None and allele not in self.allele_to_sequence ) }) if unsupported_alleles: msg = "No sequences for allele(s): %s." % " ".join( unsupported_alleles) logging.warning(msg) if throw: raise ValueError(msg) supported_allele_indices = numpy.asarray([ i for (i, allele) in enumerate(normalized_alleles) if ( allele is not None and allele in self.allele_to_sequence ) ], dtype="int64") n_peptides = len(peptides) n_alleles = len(normalized_alleles) result = numpy.full((n_peptides, n_alleles), numpy.nan, dtype="float64") if len(supported_allele_indices) == 0: return result supported_alleles = [ normalized_alleles[i] for i in supported_allele_indices] model_obj = self.class1_pan_allele_models[0] master = self.master_allele_encoding allele_encoding = AlleleEncoding( supported_alleles, borrow_from=master, ).compact() ( allele_encoding_input, allele_representations, ) = model_obj.allele_encoding_to_network_input(allele_encoding) model_obj.set_allele_representations(allele_representations) device = model_obj.get_device() configure_matmul_precision(device) network = model_obj.network(borrow=True) network.to(device) network = maybe_compile_network(network, device) network.eval() supported_indices = numpy.flatnonzero(supported_peptide.to_numpy()) if len(supported_indices) == 0: return result peptides_to_predict = EncodableSequences.create( peptides.sequences[supported_indices]) peptide_input = model_obj.peptides_to_network_input(peptides_to_predict) requested_batch_size = model_kwargs.get( "batch_size", DEFAULT_PREDICT_BATCH_SIZE) auto_batch_size = requested_batch_size in (None, "auto") if auto_batch_size: # The network expands each peptide chunk across every allele. The # generic batch resolver returns a safe *network-row* budget, so # convert that cartesian-row budget back to peptides. Treating it # directly as a peptide count overstates the safe allocation by the # number of alleles and starts large-genotype calls with avoidable # OOM retries. cartesian_rows = resolve_prediction_batch_size( requested_batch_size, device, model=network, num_workers_per_gpu=model_kwargs.get("num_workers_per_gpu", 1), total_rows=len(supported_indices) * len(supported_alleles), ) batch_size = max( 1, int(cartesian_rows) // len(supported_alleles), ) else: # An explicit batch size retains the public API's historical # meaning: number of peptides per cartesian forward. batch_size = resolve_prediction_batch_size( requested_batch_size, device, model=network, num_workers_per_gpu=model_kwargs.get("num_workers_per_gpu", 1), total_rows=len(supported_indices), ) batch_size = int(batch_size) allele_encoding_input = numpy.asarray(allele_encoding_input) if not allele_encoding_input.flags.writeable: allele_encoding_input = allele_encoding_input.copy() allele_idx = torch.from_numpy(allele_encoding_input).to(device) peptide_is_indices = model_obj.uses_peptide_torch_encoding() if callable(centrality_measure): centrality_function = centrality_measure else: centrality_function = CENTRALITY_MEASURES[centrality_measure] def peptide_tensor(batch_array): batch_array = numpy.asarray(batch_array) if not batch_array.flags.writeable: batch_array = batch_array.copy() keep_int = ( peptide_is_indices and batch_array.ndim == 2 and numpy.issubdtype(batch_array.dtype, numpy.integer) ) if not keep_int: batch_array = numpy.asarray(batch_array, dtype=numpy.float32) return torch.from_numpy(batch_array).to(device) while True: try: with torch.no_grad(): for start in range( 0, len(peptides_to_predict), batch_size): end = min(start + batch_size, len(peptides_to_predict)) peptide_batch = peptide_tensor(peptide_input[start:end]) peptide_stage = network.forward_peptide_stage( peptide_batch) output = network.forward_cartesian_from_peptide_stage( peptide_stage, allele_idx, ) affinities = to_ic50(output.detach().cpu().numpy()) if affinities.ndim == 3 and affinities.shape[2] > 1: log_values = numpy.log( affinities.reshape((-1, affinities.shape[2])) ) centers = numpy.exp(centrality_function(log_values)) affinities = centers.reshape( len(supported_alleles), end - start) else: affinities = affinities.reshape( len(supported_alleles), end - start) result[numpy.ix_( supported_indices[start:end], supported_allele_indices, )] = affinities.T break except RuntimeError as exc: from .pytorch_sizing import ( is_device_out_of_memory_error, release_device_memory_after_oom, ) if ( not auto_batch_size or batch_size <= 1 or not is_device_out_of_memory_error(exc)): raise previous_batch_size = batch_size batch_size = max(1, batch_size // 2) peptide_batch = None peptide_stage = None output = None affinities = None release_device_memory_after_oom(device) logging.warning( "Auto cartesian batch OOM at %d peptides; retrying at %d.", previous_batch_size, batch_size, ) return result def predict_to_dataframe( self, peptides, alleles=None, allele=None, throw=True, include_individual_model_predictions=False, include_percentile_ranks=True, include_confidence_intervals=True, centrality_measure=DEFAULT_CENTRALITY_MEASURE, model_kwargs=None): """ Predict nM binding affinities with optional ensemble-member detail. The default output includes the 5th and 95th percentiles of member predictions, interpolated in log-affinity space. These describe ensemble spread, not calibrated confidence intervals for true affinity. If multiple predictors are available for an allele, the predictions are the geometric means of the individual model predictions. One of 'allele' or 'alleles' must be specified. If 'allele' is specified all predictions will be for the given allele. If 'alleles' is specified it must be the same length as 'peptides' and give the allele corresponding to each peptide. Parameters ---------- peptides : `EncodableSequences` or list of string alleles : list of string allele : string throw : boolean If True, a ValueError will be raised in the case of unsupported alleles or peptide lengths. If False, a warning will be logged and the predictions for the unsupported alleles or peptides will be NaN. include_individual_model_predictions : boolean If True, the predictions of each individual model are included as columns in the result DataFrame. include_percentile_ranks : boolean, default True If True, a "prediction_percentile" column will be included giving the percentile ranks. If no percentile rank info is available, this will be ignored with a warning. include_confidence_intervals : boolean, default True Include ``prediction_low`` and ``prediction_high``, the 5th and 95th ensemble-member percentiles described above. centrality_measure : string or callable Measure of central tendency to use to combine predictions in the ensemble. Options include: mean, median, robust_mean. model_kwargs : dict Additional keyword arguments to pass to Class1NeuralNetwork.predict Returns ------- `pandas.DataFrame` of predictions """ if model_kwargs is None: model_kwargs = {} if isinstance(peptides, str): raise TypeError("peptides must be a list or array, not a string") if isinstance(alleles, str): raise TypeError("alleles must be a list or array, not a string") if allele is None and alleles is None: raise ValueError("Must specify 'allele' or 'alleles'.") peptides = EncodableSequences.create(peptides) df = pandas.DataFrame({ 'peptide': peptides.sequences }, copy=False) if allele is not None: if alleles is not None: raise ValueError("Specify exactly one of allele or alleles") normalized_allele = self._canonicalize_prediction_alleles( [allele], throw=throw)[0] df["allele"] = ( normalized_allele if pandas.notna(normalized_allele) else allele ) df["normalized_allele"] = normalized_allele else: normalized_alleles = self._canonicalize_prediction_alleles( alleles, throw=throw) df["allele"] = [ normalized if pandas.notna(normalized) else raw for (raw, normalized) in zip(alleles, normalized_alleles) ] df["normalized_allele"] = normalized_alleles unique_alleles = [ value for value in df.normalized_allele.unique() if pandas.notna(value) ] if len(df) == 0: # No predictions. logging.warning("Predicting for 0 peptides.") empty_result = pandas.DataFrame( columns=[ 'peptide', 'allele', 'prediction', 'prediction_low', 'prediction_high' ]) return empty_result (min_peptide_length, max_peptide_length) = ( self.supported_peptide_lengths) if (peptides.min_length < min_peptide_length or peptides.max_length > max_peptide_length): # Only compute this if needed all_peptides_supported = False sequence_length = df.peptide.str.len() df["supported_peptide"] = ( (sequence_length >= min_peptide_length) & (sequence_length <= max_peptide_length)) if (~df.supported_peptide).any(): msg = ( "%d peptides have lengths outside of supported range [%d, %d]: " "%s" % ( (~df.supported_peptide).sum(), min_peptide_length, max_peptide_length, str(df.loc[~df.supported_peptide].peptide.unique()))) logging.warning(msg) if throw: raise ValueError(msg) else: # Handle common case efficiently. df["supported_peptide"] = True all_peptides_supported = True peptide_has_valid_amino_acids = ( (~df.supported_peptide) | df.peptide.str.upper().str.match("^[ACDEFGHIKLMNPQRSTVWY]+$")) df["supported_peptide"] = ( df["supported_peptide"] & peptide_has_valid_amino_acids) if (~peptide_has_valid_amino_acids).any(): all_peptides_supported = False msg = ( "%d peptides have nonstandard amino acids: " "%s" % ( (~peptide_has_valid_amino_acids).sum(), str(df.loc[~peptide_has_valid_amino_acids].peptide.unique()))) logging.warning(msg) if throw: raise ValueError(msg) num_pan_models = ( len(self.class1_pan_allele_models) if not self.optimization_info.get("pan_models_merged", False) else self.optimization_info["num_pan_models_merged"]) max_single_allele_models = max( len(self.allele_to_allele_specific_models.get(allele, [])) for allele in unique_alleles ) if unique_alleles else 0 predictions_array = numpy.zeros( shape=(df.shape[0], num_pan_models + max_single_allele_models), dtype="float64") predictions_array[:] = numpy.nan if self.class1_pan_allele_models: master_allele_encoding = self.master_allele_encoding unsupported_alleles = [ allele for allele in unique_alleles if allele not in self.allele_to_sequence ] if unsupported_alleles: truncate_at = 100 allele_string = " ".join( sorted(self.allele_to_sequence)[:truncate_at]) if len(self.allele_to_sequence) > truncate_at: allele_string += " + %d more alleles" % ( len(self.allele_to_sequence) - truncate_at) msg = ( "No sequences for allele(s): %s.\n" "Supported alleles: %s" % ( " ".join(unsupported_alleles), allele_string)) logging.warning(msg) if throw: raise ValueError(msg) mask = df.supported_peptide & df.normalized_allele.notnull() & ( ~df.normalized_allele.isin(unsupported_alleles)) row_slice = None if mask is None or mask.all(): row_slice = slice(None, None, None) # all rows masked_allele_encoding = AlleleEncoding( df.normalized_allele, borrow_from=master_allele_encoding) masked_peptides = EncodableSequences.create(peptides) elif mask.sum() > 0: row_slice = mask masked_allele_encoding = AlleleEncoding( df.loc[mask].normalized_allele, borrow_from=master_allele_encoding) masked_peptides = EncodableSequences.create( peptides.sequences[mask]) if row_slice is not None: # The following line is a performance optimization that may be # revisited. It causes the neural network to set to include # only the alleles actually being predicted for. This makes # the network much smaller. However, subsequent calls to # predict will need to reset these weights, so there is a # tradeoff. masked_allele_encoding = masked_allele_encoding.compact() if self.optimization_info.get("pan_models_merged"): # Multiple pan-allele models have been merged into one # at the PyTorch level. assert len(self.class1_pan_allele_models) == 1 predictions = self.class1_pan_allele_models[0].predict( masked_peptides, allele_encoding=masked_allele_encoding, output_index=None, **model_kwargs) predictions_array[row_slice, :num_pan_models] = predictions else: for (i, model) in enumerate(self.class1_pan_allele_models): predictions_array[row_slice, i] = model.predict( masked_peptides, allele_encoding=masked_allele_encoding, **model_kwargs) if self.allele_to_allele_specific_models: unsupported_alleles = [ allele for allele in unique_alleles if not self.allele_to_allele_specific_models.get(allele) ] if unsupported_alleles: msg = ( "No single-allele models for allele(s): %s.\n" "Supported alleles are: %s" % ( " ".join(unsupported_alleles), " ".join(sorted(self.allele_to_allele_specific_models)))) logging.warning(msg) if throw: raise ValueError(msg) for allele in unique_alleles: models = self.allele_to_allele_specific_models.get(allele, []) if ( len(unique_alleles) == 1 and all_peptides_supported and df.normalized_allele.notnull().all()): mask = None else: mask = ( (df.normalized_allele == allele) & df.supported_peptide).values row_slice = None if mask is None or mask.all(): peptides_for_allele = peptides row_slice = slice(None, None, None) elif mask.sum() > 0: peptides_for_allele = EncodableSequences.create( df.loc[mask].peptide.values) row_slice = mask if row_slice is not None: for (i, model) in enumerate(models): predictions_array[ row_slice, num_pan_models + i, ] = model.predict(peptides_for_allele, **model_kwargs) if callable(centrality_measure): centrality_function = centrality_measure else: centrality_function = CENTRALITY_MEASURES[centrality_measure] logs = numpy.log(predictions_array) row_has_predictions = (~numpy.isnan(logs)).any(axis=1) log_centers = numpy.full(df.shape[0], numpy.nan, dtype="float64") if row_has_predictions.any(): log_centers[row_has_predictions] = centrality_function( logs[row_has_predictions] ) df["prediction"] = numpy.exp(log_centers) if include_confidence_intervals: prediction_low = numpy.full(df.shape[0], numpy.nan, dtype="float64") prediction_high = numpy.full(df.shape[0], numpy.nan, dtype="float64") if row_has_predictions.any(): prediction_low[row_has_predictions] = numpy.exp( numpy.nanpercentile(logs[row_has_predictions], 5.0, axis=1) ) prediction_high[row_has_predictions] = numpy.exp( numpy.nanpercentile(logs[row_has_predictions], 95.0, axis=1) ) df["prediction_low"] = prediction_low df["prediction_high"] = prediction_high if include_individual_model_predictions: for i in range(num_pan_models): df["model_pan_%d" % i] = predictions_array[:, i] for i in range(max_single_allele_models): df["model_single_%d" % i] = predictions_array[ :, num_pan_models + i ] if include_percentile_ranks: if self.allele_to_percent_rank_transform: df["prediction_percentile"] = self.percentile_ranks( df.prediction, alleles=df.normalized_allele.values, throw=throw) else: warnings.warn("No percentile rank information available.") del df["supported_peptide"] del df["normalized_allele"] return df def calibrate_percentile_ranks( self, peptides=None, num_peptides_per_length=int(1e5), alleles=None, bins=None, motif_summary=False, summary_top_peptide_fractions=None, verbose=False, model_kwargs=None, *, method=None, max_knots=128): """ Compute the cumulative distribution of ic50 values for a set of alleles over a large universe of random peptides, to enable taking quantiles of this distribution later. Parameters ---------- peptides : sequence of string or EncodableSequences, optional Peptides to use num_peptides_per_length : int, optional If peptides argument is not specified, then num_peptides_per_length peptides are randomly sampled from a uniform distribution for each supported length alleles : sequence of string, optional Alleles to perform calibration for. If not specified all supported alleles will be calibrated. bins : object Anything that can be passed to numpy.histogram's "bins" argument can be used here, i.e. either an integer or a sequence giving bin edges in IC50 space. Explicit bins select histogram calibration unless a conflicting method is supplied. With no bins or method, the default is compact; method="histogram" with no bins uses the historical fixed log-spaced IC50 grid. motif_summary : bool If True, the length distribution and per-position amino acid frequencies are also calculated for the top x fraction of tightest- binding peptides, where each value of x is given in the summary_top_peptide_fractions list. summary_top_peptide_fractions : list of float Only used if motif_summary is True verbose : boolean Whether to print status updates to stdout model_kwargs : dict Additional low-level Class1NeuralNetwork.predict() kwargs. method : {"compact", "histogram"}, optional Compact by default; explicit bins select the historical histogram. max_knots : {64, 128}, default 128 Upper bound, not the starting size. Compact starts with 64 and permits 128 only when background validation demonstrates an improvement beyond the tolerance. Returns ------- dict of string -> pandas.DataFrame If motif_summary is True, this will have keys "frequency_matrices" and "length_distributions". Otherwise it will be empty. """ if summary_top_peptide_fractions is None: summary_top_peptide_fractions = [0.001] if model_kwargs is None: model_kwargs = {} method = calibration_method(method, bins) if method == "histogram" and bins is None: bins = to_ic50(numpy.linspace(1, 0, 1000)) if alleles is None: alleles = self.supported_alleles if peptides is None: peptides = [] lengths = range( self.supported_peptide_lengths[0], self.supported_peptide_lengths[1] + 1) for length in lengths: peptides.extend( random_peptides(num_peptides_per_length, length)) encoded_peptides = EncodableSequences.create(peptides) if motif_summary: frequency_matrices = [] length_distributions = [] else: frequency_matrices = None length_distributions = None # One peptide grouping serves every allele's compact fit. group_codes = None if method == "compact": group_codes = factorize_calibration_groups(encoded_peptides.sequences) for allele in alleles: start = time.time() predictions = self.predict( encoded_peptides, allele=allele, model_kwargs=model_kwargs) if verbose: elapsed = time.time() - start print( "Generated %d predictions for allele %s in %0.2f sec: " "%0.2f predictions / sec" % ( len(encoded_peptides.sequences), allele, elapsed, len(encoded_peptides.sequences) / elapsed)) transform = fit_percent_rank_transform( predictions, method=method, bins=bins, score_transform="log", max_knots=max_knots, group_codes=group_codes) self.allele_to_percent_rank_transform[allele] = transform if frequency_matrices is not None: predictions_df = pandas.DataFrame({ 'peptide': encoded_peptides.sequences, 'prediction': predictions }).drop_duplicates('peptide').set_index("peptide") predictions_df["length"] = predictions_df.index.str.len() for (length, sub_df) in predictions_df.groupby("length"): for cutoff_fraction in summary_top_peptide_fractions: selected = sub_df.prediction.nsmallest( max( int(len(sub_df) * cutoff_fraction), 1)).index.values matrix = positional_frequency_matrix(selected).reset_index() original_columns = list(matrix.columns) matrix["allele"] = allele matrix["length"] = length matrix["cutoff_fraction"] = cutoff_fraction matrix["cutoff_count"] = len(selected) matrix = matrix[ ["allele", "length", "cutoff_fraction", "cutoff_count"] + original_columns ] frequency_matrices.append(matrix) # Length distribution for cutoff_fraction in summary_top_peptide_fractions: cutoff_count = max( int(len(predictions_df) * cutoff_fraction), 1) length_distribution = predictions_df.prediction.nsmallest( cutoff_count).index.str.len().value_counts() length_distribution.index.name = "length" length_distribution /= length_distribution.sum() length_distribution = length_distribution.to_frame() length_distribution.columns = ["fraction"] length_distribution = length_distribution.reset_index() length_distribution["allele"] = allele length_distribution["cutoff_fraction"] = cutoff_fraction length_distribution["cutoff_count"] = cutoff_count length_distribution = length_distribution[[ "allele", "cutoff_fraction", "cutoff_count", "length", "fraction" ]].sort_values(["cutoff_fraction", "length"]) length_distributions.append(length_distribution) if frequency_matrices is not None: frequency_matrices = pandas.concat( frequency_matrices, ignore_index=True) if length_distributions is not None: length_distributions = pandas.concat( length_distributions, ignore_index=True) if motif_summary: return { 'frequency_matrices': frequency_matrices, 'length_distributions': length_distributions, } return {} def clear_calibration_fast_cache(self): return calibration_sizing.clear_calibration_fast_cache(self) def calibrate_percentile_ranks_fast( self, peptides, alleles, bins=None, motif_summary=False, summary_top_peptide_fractions=(0.001,), allele_batch_size="auto", peptide_batch_size="auto", num_workers_per_gpu=1, device=None, verbose=False, *, method=None, max_knots=128): """GPU-hoisted calibration for many alleles sharing a peptide set. Drop-in replacement for the bulk of ``calibrate_percentile_ranks`` when calibration is dominated by per-allele Python dispatch (the pan-allele full-universe calibration workload, which sweeps ~20k alleles across the same peptide set). Two structural changes: 1. **Precompute peptide-stage activations once per network.** The network's locally-connected + peptide-dense + early-batchnorm layers are identity across alleles; we forward the calibration peptides through that stage exactly once per network and cache the output tensor on device. 2. **Batch ``allele_batch_size`` alleles per forward.** A single ``forward_from_peptide_stage`` call replaces ``allele_batch_size`` separate ``model.predict`` calls — amortizing all the small kernel-launch + Python-dispatch overhead that was dominating wall-clock time on the pan-allele full-universe calibration. Effective batch size per forward: ``allele_batch_size * peptide_batch_size``. Automatic sizes account for the current device and resident working set. Uses the same geometric-mean ensemble aggregation and percentile method as ``calibrate_percentile_ranks``. The batched floating-point schedule can change raw predictions slightly and, in turn, adaptive knot locations. Saved curves are not guaranteed bit-identical. Neural inference remains batched on-device for both methods; histogram fitting is also batched on-device, whereas compact fitting operates on the final ensemble scores on CPU without repeating neural inference. Caching note: this method memoizes the peptide-stage activations on the predictor instance across calls. That cache is keyed on network identity, not weight content, so do not mutate the predictor's network weights in place between calls on the same instance without first calling ``clear_calibration_fast_cache()``. Only the pan-allele networks contribute to this path. Use ``calibrate_percentile_ranks`` for allele-specific ensembles or ensembles mixing pan-allele and allele-specific networks. Presentation calibration has its own score-based API. Parameters ---------- peptides : sequence of string or EncodableSequences alleles : sequence of string — already-normalized allele names (canonicalization is the caller's responsibility for speed). bins : sequence of bin edges in IC50 space (histogram only; default for that method is 999 log-spaced IC50 bins). Scalar integer ``numpy.histogram`` bin counts are rejected in this fast path because they imply data-dependent edges per allele, while the batched GPU histogram uses one explicit edge vector for the whole allele chunk. motif_summary : bool — populate frequency matrices + length distributions, same format as ``calibrate_percentile_ranks``. summary_top_peptide_fractions : iterable of float — only used when ``motif_summary=True``. allele_batch_size : int or "auto" Alleles per forward pass. The default auto sizes for device capacity. peptide_batch_size : int or "auto" Peptides per device chunk; auto sized by default. num_workers_per_gpu : int, default 1 Co-resident worker count used for automatic memory budgeting. device : str or torch.device, optional Uses MHCflurry's configured device when omitted (auto selects CUDA, then MPS, then CPU). verbose : bool — per-batch timing to stdout. method : {"compact", "histogram"}, optional Compact by default; explicit bins select the historical histogram. max_knots : {64, 128}, default 128 Validation-selected compact upper bound, not a starting size; 64 is retained unless 128 improves beyond the tolerance. Returns ------- dict (same schema as ``calibrate_percentile_ranks``). Also populates ``self.allele_to_percent_rank_transform[allele]`` for every allele in ``alleles``. """ import torch from .encodable_sequences import EncodableSequences from .allele_encoding import AlleleEncoding from .regression_target import to_ic50 if not self.class1_pan_allele_models: raise ValueError( "calibrate_percentile_ranks_fast is pan-allele-only; " "this predictor has no pan-allele models." ) method = calibration_method(method, bins) if bins is None: bins = to_ic50(numpy.linspace(1, 0, 1000)) bin_edges_array = numpy.asarray(bins) if bin_edges_array.ndim == 0: raise ValueError( "calibrate_percentile_ranks_fast requires explicit IC50 bin " "edges. Scalar integer bins use numpy.histogram's " "data-dependent per-allele edges in the legacy path and " "cannot be represented by one batched GPU edge vector. Use " "bins=to_ic50(numpy.linspace(1, 0, n_bins + 1)) for fixed " "log-space IC50 edges." ) if bin_edges_array.ndim != 1 or bin_edges_array.shape[0] < 2: raise ValueError( "calibrate_percentile_ranks_fast requires a one-dimensional " "sequence of at least two IC50 bin edges." ) for name, value in ( ("peptide_batch_size", peptide_batch_size), ("allele_batch_size", allele_batch_size)): if value not in (None, "auto"): try: normalized = int(value) except (TypeError, ValueError): raise ValueError( "%s must be 'auto' or a positive integer, got %r" % ( name, value) ) from None if normalized < 1: raise ValueError("%s must be at least 1" % name) if name == "peptide_batch_size": peptide_batch_size = normalized else: allele_batch_size = normalized if device is None: from .common import get_pytorch_device device = get_pytorch_device() else: device = torch.device(device) encoded_peptides = EncodableSequences.create(peptides) n_peptides = len(encoded_peptides.sequences) if n_peptides == 0: raise ValueError("No peptides supplied for calibration") alleles = list(alleles) if not alleles: raise ValueError("No alleles supplied for calibration") master = self.master_allele_encoding unknown = [a for a in alleles if a not in master.allele_to_index] if unknown: raise KeyError( "calibrate_percentile_ranks_fast: %d allele(s) not in the " "predictor's master encoding (first 5: %s)" % ( len(unknown), unknown[:5], ) ) allele_idx_np = numpy.array( [master.allele_to_index[a] for a in alleles], dtype=numpy.int64, ) # Per-network prep: ensure allele representations are wired up, # move the eager (uncompiled) model to device, cache the # peptide-stage output. networks = self.class1_pan_allele_models # Cross-task cached_stages reuse: when calibrate is sharded into # many tasks, each task is a separate ``calibrate_percentile_ranks_fast`` # call inside the same worker process and re-builds # ``cached_stages`` from scratch even though the peptide universe # and the predictor are identical. Cache the built tensors on # ``calibration_sizing.calibration_fast_cache`` and skip the rebuild whenever # the signature matches. ``forward_peptide_stage`` runs once per # peptide-batch per network, so for the production workload # (~400k peptides × many allele chunks/worker) each saved rebuild # is a couple-second-per-task win that compounds. # # The signature uses a SHA-256 fingerprint of the full peptide # list rather than (count, first, last) — the latter would # silently reuse a stale cache for two distinct peptide sets that # share count/first/last (rare but real, and the failure mode is # incorrect percentile calibration with no error). It intentionally # omits ``peptide_batch_size``: that size only controls how the # cache tensor is filled, not its contents or shape. # # Cache validity also assumes the predictor's network weights are not # mutated in place between calls on the same instance: the key tracks # network *identity*, not weight content (see # ``calibration_sizing.calibration_stage_cache_signature`` for why a # content fingerprint is unreliable here), so a caller that re-fits a # network in place must # call ``clear_calibration_fast_cache()`` to avoid reusing stale # stages. Adding/removing/replacing whole models is already safe (new # network objects -> new ids -> cache miss). cache = calibration_sizing.calibration_fast_cache(self) cache_signature = calibration_sizing.calibration_stage_cache_signature( encoded_peptides, networks, device, ) cache_hit = ( cache.stage_signature == cache_signature and cache.cached_stages is not None ) if allele_batch_size in (None, "auto") or peptide_batch_size in (None, "auto"): # Resolve once, using the first network as the architecture # probe — all ensembles we serve have homogeneous layer # sizing, so one probe is sufficient. probe_net_obj = networks[0] probe_net = probe_net_obj.network(borrow=True) probe_net.to(device) # Probe the actual peptide feature width so the cache estimate # doesn't fall back to the encoding-shape floor. probed_peptide_feature_dim = ( calibration_sizing.probe_peptide_feature_dim( probe_net_obj, encoded_peptides, device, ) ) sub_networks = getattr(probe_net, "networks", None) num_sub_networks_probed = ( len(sub_networks) if sub_networks is not None else 1 ) # Mixed pin/auto: when the user pinned one axis, pass it through so # the auto axis is sized against the *actual* pinned value rather # than an assumed auto one (which would underestimate peak VRAM). pinned_peptide = ( None if peptide_batch_size in (None, "auto") else int(peptide_batch_size)) pinned_allele = ( None if allele_batch_size in (None, "auto") else int(allele_batch_size)) auto_peptide, auto_allele = calibration_sizing.auto_size_calibration_batches( probe_net, device, n_peptides, len(alleles), num_workers_per_gpu=num_workers_per_gpu, # If the peptide-stage cache is already resident in this # worker, current CUDA free memory has already been reduced # by that cache. Counting it again here makes later shards # collapse to tiny fallback batches. num_cached_networks=0 if cache_hit else len(networks), peptide_feature_dim=probed_peptide_feature_dim, num_sub_networks=num_sub_networks_probed, fixed_peptide_batch=pinned_peptide, fixed_allele_batch=pinned_allele, ) if peptide_batch_size in (None, "auto"): peptide_batch_size = auto_peptide if allele_batch_size in (None, "auto"): allele_batch_size = auto_allele if verbose: print( "calibrate_percentile_ranks_fast auto-sized: " f"peptide_batch={peptide_batch_size}, " f"allele_batch={allele_batch_size} " f"(workers_per_gpu={num_workers_per_gpu}, " f"cached_networks={len(networks)}, " f"sub_networks={num_sub_networks_probed}, " f"probed_peptide_feature_dim=" f"{probed_peptide_feature_dim})" ) peptide_batch_size = int(peptide_batch_size) allele_batch_size = int(allele_batch_size) if cache_hit: cached_stages = cache.cached_stages else: # Drop stale cache before building the new one — releases # the previous peptide-stage tensor's VRAM before we # allocate the next, which matters when the per-call # peptide universe size changes (e.g. a smoke test # followed by the production calibrate in the same worker). cache.stage_signature = None cache.cached_stages = None cache.motif_signature = None cache.motif_state = None cached_stages = [] for net_obj in networks: (_, allele_reps) = net_obj.allele_encoding_to_network_input( AlleleEncoding(alleles=[], borrow_from=master), ) net_obj.set_allele_representations(allele_reps) model = net_obj.network(borrow=True) model.to(device) model.eval() peptide_input = net_obj.peptides_to_network_input(encoded_peptides) peptide_is_indices = net_obj.uses_peptide_torch_encoding() # Pre-size the cache tensor by probing one row's peptide # feature width, then write each chunk in-place. The previous # append+torch.cat path transiently held both the per-chunk # parts and the new contiguous tensor, a 2x VRAM peak that # pushed --max-workers-per-gpu auto into OOM territory. with torch.no_grad(): probe_chunk = peptide_input[:1] probe_keep_int = ( peptide_is_indices and probe_chunk.ndim == 2 and numpy.issubdtype(probe_chunk.dtype, numpy.integer) ) if probe_keep_int: probe_tensor = torch.from_numpy(probe_chunk).to(device) else: probe_tensor = torch.from_numpy( numpy.asarray(probe_chunk, dtype=numpy.float32), ).to(device) probe_peptide_features = model.forward_peptide_stage( probe_tensor, ) peptide_feature_dim_cached = int( probe_peptide_features.shape[-1], ) stage_dtype = probe_peptide_features.dtype cached_tensor = torch.empty( n_peptides, peptide_feature_dim_cached, dtype=stage_dtype, device=device, ) with torch.no_grad(): for start in range(0, n_peptides, peptide_batch_size): end = min(start + peptide_batch_size, n_peptides) chunk = peptide_input[start:end] keep_int = ( peptide_is_indices and chunk.ndim == 2 and numpy.issubdtype(chunk.dtype, numpy.integer) ) if keep_int: tensor = torch.from_numpy(chunk).to(device) else: tensor = torch.from_numpy( numpy.asarray(chunk, dtype=numpy.float32), ).to(device) cached_tensor[start:end] = model.forward_peptide_stage( tensor, ) cached_stages.append((net_obj, model, cached_tensor)) cache.cached_stages = cached_stages cache.stage_signature = cache_signature del peptide_input log50000 = float(numpy.log(50000.0)) n_alleles = len(alleles) frequency_matrices = [] if motif_summary else None length_distributions = [] if motif_summary else None # CPU parity tests compare against the legacy per-allele forward. # Preserve that matmul order on CPU; GPU keeps the lower-memory # factored cartesian path used by the production calibration run. exact_cartesian_forward = device.type == "cpu" # Bin edges for the on-device batched histogram fit. Materialize # once outside the per-chunk loop — same edges across alleles. calibration_float_dtype = ( torch.float32 if device.type == "mps" else torch.float64 ) # Only the histogram fit reads these edges; compact mode would upload # a thousand unused values to the device on every call. bins_tensor = None if method != "histogram" else torch.as_tensor( bin_edges_array, dtype=calibration_float_dtype, device=device, ) # Hoist the per-allele dedup + length-bucket + AA-encoding work # out of the chunk loop. The peptide universe is identical across # alleles so this only needs to run once per calibrate call — # and across the many tasks per worker that share the same # peptide universe, we reuse the device-resident state via the # same signature key as ``cached_stages`` above. if motif_summary: motif_signature = (cache_signature, "motif") if cache.motif_signature == motif_signature: motif_state = cache.motif_state else: motif_state = prepare_motif_summary_state_gpu( encoded_peptides, device, ) cache.motif_state = motif_state cache.motif_signature = motif_signature else: motif_state = None # One peptide grouping serves every allele's compact fit in this call. group_codes = (factorize_calibration_groups(encoded_peptides.sequences) if method == "compact" else None) for abatch_start in range(0, n_alleles, allele_batch_size): abatch_end = min(abatch_start + allele_batch_size, n_alleles) a_size = abatch_end - abatch_start batch_alleles = alleles[abatch_start:abatch_end] batch_idx = torch.from_numpy( allele_idx_np[abatch_start:abatch_end], ).to(device) # log-space accumulator across ensemble members: # (a_size, n_peptides). # Same aggregation scheme as the existing ensemble code: # arithmetic mean of per-network log(IC50) = geometric mean # of per-network IC50. Use fp64 where supported so the # aggregation matches the legacy path bit-for-bit; fall # back to fp32 on MPS (which has no fp64) — drift there is # ~1e-6 in log-IC50, well below histogram-bin resolution. accum_dtype = ( torch.float32 if device.type == "mps" else torch.float64 ) log_ic50_sum = torch.zeros( a_size, n_peptides, dtype=accum_dtype, device=device, ) ensemble_member_count = 0 for (_, model, peptide_features) in cached_stages: model_member_count = None with torch.no_grad(): for start in range(0, n_peptides, peptide_batch_size): end = min(start + peptide_batch_size, n_peptides) p_chunk = peptide_features[start:end] # (chunk_n, d) network_output = cartesian_network_output( model, p_chunk, batch_idx, exact_forward=exact_cartesian_forward, ) ( log_ic50_chunk, chunk_member_count, ) = cartesian_output_log_ic50_sum( network_output, model, log50000, accum_dtype, ) if model_member_count is None: model_member_count = chunk_member_count elif model_member_count != chunk_member_count: raise ValueError( "cartesian network output member count changed " "within one calibration batch" ) log_ic50_sum[:, start:end] += log_ic50_chunk if model_member_count is None: raise ValueError("No peptide batches were evaluated") ensemble_member_count += model_member_count if ensemble_member_count < 1: raise ValueError("No ensemble members were evaluated") log_mean = log_ic50_sum / float(ensemble_member_count) ic50_device = torch.exp(log_mean) # (a_size, n_peptides) on device # Histogram mode keeps its batched device-side fit and historical # grid. Compact mode fits small curves from the final ensemble # scores, then persists knots rather than histogram CDF arrays. if method == "histogram": transforms = HistogramPercentRankTransform.fit_batch_torch(ic50_device, bins_tensor) else: # Keep batched inference on-device; fit small saved curves from # the final ensemble scores, without repeating neural inference. transforms = [fit_percent_rank_transform( row, method="compact", score_transform="log", max_knots=max_knots, group_codes=group_codes) for row in ic50_device.cpu().numpy()] for local_i, allele in enumerate(batch_alleles): self.allele_to_percent_rank_transform[allele] = transforms[local_i] if motif_summary: # All motif-summary work now runs on device — topk + # scatter_add for AA frequency matrices, topk + scatter_add # bincount for length distributions. Pandas only assembles # final per-row schema at chunk-end. This replaces the # per-allele DataFrame.drop_duplicates().groupby().nsmallest() # block that dominated calibrate wall time after the # HistogramPercentRankTransform.fit GPU port. chunk_freq, chunk_ld = motif_summary_chunk_gpu( ic50_device, motif_state, summary_top_peptide_fractions, batch_alleles, ) frequency_matrices.extend(chunk_freq) length_distributions.extend(chunk_ld) if verbose: print( "calibrate_percentile_ranks_fast: " f"{abatch_end}/{n_alleles} alleles done" ) if motif_summary: return { "frequency_matrices": pandas.concat( frequency_matrices, ignore_index=True, ), "length_distributions": pandas.concat( length_distributions, ignore_index=True, ), } return {} def model_select( self, score_function, alleles=None, min_models=1, max_models=10000): """ Perform model selection using a user-specified scoring function. This works only with allele-specific models, not pan-allele models. Model selection is done using a "step up" variable selection procedure, in which models are repeatedly added to an ensemble until the score stops improving. Parameters ---------- score_function : Class1AffinityPredictor -> float function Scoring function alleles : list of string, optional If not specified, model selection is performed for all alleles. min_models : int, optional Min models to select per allele max_models : int, optional Max models to select per allele Returns ------- Class1AffinityPredictor : predictor containing the selected models """ return model_selection.model_select( self, Class1AffinityPredictor, score_function, alleles=alleles, min_models=min_models, max_models=max_models, ) mhcflurry-2.3.6/mhcflurry/class1_affinity_training_data.py000066400000000000000000000332551525677230600241120ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Device-resident row space for class-I affinity model training. This module is intentionally affinity-specific. It knows about the layout created by :meth:`Class1NeuralNetwork.fit`: random-negative examples, when enabled, are prepended to the real affinity measurements and refreshed once per epoch. Other model families should use their own training-data container instead of inheriting these random-negative semantics. """ from __future__ import annotations from dataclasses import dataclass from typing import Optional import numpy import torch from . import amino_acid @dataclass class AffinityDeviceTrainingData: """Device tensors for one affinity-model ``fit()`` call. The affinity fit loop indexes one logical row space: ``[random negative rows | real training rows]``. This container owns the torch tensors for that row space. When random negatives are present, ``combined_peptide`` and ``combined_allele`` hold the full row space; ``random_negative_x_*`` and ``x_*`` are views into those combined buffers. Refilling random-negative peptide rows updates the next epoch's batches without reallocating or recopying the real-data block. Peptide tensors may be either: * ``(N, L)`` integer amino-acid indices, consumed by the network's torch embedding path; or * ``(N, L, V)`` fixed vector encodings, widened to float32 on device when loaded from compact integer caches. """ x_peptide: torch.Tensor x_allele: Optional[torch.Tensor] = None y_encoded: Optional[torch.Tensor] = None sample_weights: Optional[torch.Tensor] = None random_negative_x_peptide: Optional[torch.Tensor] = None random_negative_x_allele: Optional[torch.Tensor] = None combined_peptide: Optional[torch.Tensor] = None combined_allele: Optional[torch.Tensor] = None @property def device(self): """The torch device holding this row space.""" return self.x_peptide.device @property def row_count(self): """Total rows in the logical ``[random negatives | real]`` space.""" return int(self.y_encoded.shape[0]) @property def random_negative_count(self): """Number of mutable random-negative rows at the front of the space.""" if self.random_negative_x_peptide is None: return 0 return int(self.random_negative_x_peptide.shape[0]) @classmethod def from_arrays( cls, *, x_peptide, x_allele, y_encoded, sample_weights, random_negative_x_peptide_template, random_negative_x_allele, device, ): """Materialize a device-resident affinity training row space. Parameters mirror the arrays produced by ``Class1NeuralNetwork.fit``. ``random_negative_x_peptide_template`` provides only shape and dtype for the mutable random-negative slice; epoch contents are filled via :meth:`refill_random_negative_peptides`. The returned object is the only data source used by the inner fit loop: callers ask for batches by row index with :meth:`batch_for_indices`. """ def _to_device(value, dtype=None): if value is None: return None if isinstance(value, torch.Tensor): tensor = value else: if isinstance(value, numpy.ndarray) and not value.flags.writeable: value = value.copy() tensor = torch.as_tensor(value) if dtype is not None and tensor.dtype != dtype: tensor = tensor.to(dtype) return tensor.to(device, non_blocking=False) def _peptide_to_device(value): tensor = _to_device(value) if ( tensor is not None and tensor.ndim > 2 and not tensor.dtype.is_floating_point): tensor = tensor.to(torch.float32) return tensor def _peptide_template_shape_dtype(value): if isinstance(value, torch.Tensor): shape = tuple(value.shape) dtype = value.dtype elif isinstance(value, numpy.ndarray): shape = value.shape dtype = torch.from_numpy(numpy.empty((), dtype=value.dtype)).dtype else: tensor = torch.as_tensor(value) shape = tuple(tensor.shape) dtype = tensor.dtype if len(shape) > 2 and not dtype.is_floating_point: dtype = torch.float32 return tuple(shape), dtype x_peptide_dev = _peptide_to_device(x_peptide) x_allele_dev = _to_device(x_allele) if x_peptide_dev is None: raise ValueError( "AffinityDeviceTrainingData.from_arrays: x_peptide is required." ) num_real = int(x_peptide_dev.shape[0]) num_random_negatives = 0 combined_peptide = None rn_peptide_view = None x_peptide_view = x_peptide_dev if random_negative_x_peptide_template is not None: rn_shape, rn_dtype = _peptide_template_shape_dtype( random_negative_x_peptide_template ) num_rn = int(rn_shape[0]) num_random_negatives = num_rn if x_peptide_dev.dtype != rn_dtype: x_peptide_dev = x_peptide_dev.to(rn_dtype) combined_shape = (num_rn + num_real, *rn_shape[1:]) if tuple(x_peptide_dev.shape[1:]) != tuple(rn_shape[1:]): raise ValueError( "AffinityDeviceTrainingData.from_arrays: real and " "random-negative peptide tensors disagree on per-row " "shape: %r vs %r" % ( tuple(x_peptide_dev.shape[1:]), tuple(rn_shape[1:]), ) ) combined_peptide = torch.empty( combined_shape, dtype=rn_dtype, device=device ) rn_peptide_view = combined_peptide[:num_rn] x_peptide_view = combined_peptide[num_rn:] x_peptide_view.copy_(x_peptide_dev) # Fill the random-negative slice with the X/pad index (not 0) to # match encode_random_negatives_on_device, which fills with X_INDEX. rn_peptide_view.fill_(int(amino_acid.X_INDEX)) rn_allele_dev = _to_device(random_negative_x_allele) combined_allele = None rn_allele_view = rn_allele_dev x_allele_view = x_allele_dev if x_allele_dev is not None and int(x_allele_dev.shape[0]) != num_real: raise ValueError( "AffinityDeviceTrainingData.from_arrays: x_allele has %d rows " "but x_peptide has %d rows." % ( int(x_allele_dev.shape[0]), num_real, ) ) if num_random_negatives and (x_allele_dev is None) != (rn_allele_dev is None): raise ValueError( "AffinityDeviceTrainingData.from_arrays: real and " "random-negative allele tensors must either both be present " "or both be absent." ) if rn_allele_dev is not None and x_allele_dev is not None: if int(rn_allele_dev.shape[0]) != num_random_negatives: raise ValueError( "AffinityDeviceTrainingData.from_arrays: " "random_negative_x_allele has %d rows but random-negative " "peptide space has %d rows." % ( int(rn_allele_dev.shape[0]), num_random_negatives, ) ) if rn_allele_dev.dtype != x_allele_dev.dtype: target_dtype = ( torch.float32 if (rn_allele_dev.dtype.is_floating_point or x_allele_dev.dtype.is_floating_point) else x_allele_dev.dtype ) rn_allele_dev = rn_allele_dev.to(target_dtype) x_allele_dev = x_allele_dev.to(target_dtype) num_rn_a = int(rn_allele_dev.shape[0]) num_real_a = int(x_allele_dev.shape[0]) combined_allele = torch.empty( (num_rn_a + num_real_a, *rn_allele_dev.shape[1:]), dtype=rn_allele_dev.dtype, device=device, ) combined_allele[:num_rn_a].copy_(rn_allele_dev) combined_allele[num_rn_a:].copy_(x_allele_dev) rn_allele_view = combined_allele[:num_rn_a] x_allele_view = combined_allele[num_rn_a:] total_rows = num_random_negatives + num_real y_encoded_dev = _to_device(y_encoded, dtype=torch.float32) if y_encoded_dev is None: raise ValueError( "AffinityDeviceTrainingData.from_arrays: y_encoded is required." ) if int(y_encoded_dev.shape[0]) != total_rows: raise ValueError( "AffinityDeviceTrainingData.from_arrays: y_encoded has %d rows " "but peptide row space has %d rows." % ( int(y_encoded_dev.shape[0]), total_rows, ) ) sample_weights_dev = _to_device(sample_weights, dtype=torch.float32) if ( sample_weights_dev is not None and int(sample_weights_dev.shape[0]) != total_rows): raise ValueError( "AffinityDeviceTrainingData.from_arrays: sample_weights has " "%d rows but peptide row space has %d rows." % ( int(sample_weights_dev.shape[0]), total_rows, ) ) return cls( x_peptide=x_peptide_view, x_allele=x_allele_view, y_encoded=y_encoded_dev, sample_weights=sample_weights_dev, random_negative_x_peptide=rn_peptide_view, random_negative_x_allele=rn_allele_view, combined_peptide=combined_peptide, combined_allele=combined_allele, ) def refill_random_negative_peptides(self, encoded_peptides): """Overwrite the mutable random-negative peptide slice in place. Does nothing when the fit has no random negatives. ``encoded_peptides`` may be a numpy array, CPU tensor, or tensor already on the target device; dtype is coerced to the existing random-negative slice. """ if self.random_negative_x_peptide is None: return source = encoded_peptides if not isinstance(source, torch.Tensor): source = torch.as_tensor(source) self.random_negative_x_peptide.copy_( source.to( self.random_negative_x_peptide.device, dtype=self.random_negative_x_peptide.dtype, ) ) def batch_for_indices(self, batch_indices): """Return ``(inputs, y_batch, weights_batch)`` for device indices. Hot-path API used by the inner training and validation loops. ``batch_indices`` must be a torch integer tensor already on ``self.device``; keeping indices on device lets the fit loop form batches with ``index_select`` and no per-batch host-to-device copies. For one-shot use cases that start from a host-side index array, see :meth:`batch_dict_for_indices`. """ combined_peptide = self.combined_peptide if combined_peptide is None: combined_peptide = self.x_peptide inputs = {"peptide": combined_peptide.index_select(0, batch_indices)} if self.combined_allele is not None: inputs["allele"] = self.combined_allele.index_select(0, batch_indices) elif self.x_allele is not None: inputs["allele"] = self.x_allele.index_select(0, batch_indices) y_batch = self.y_encoded.index_select(0, batch_indices) weights_batch = None if self.sample_weights is not None: weights_batch = self.sample_weights.index_select(0, batch_indices) return inputs, y_batch, weights_batch def batch_dict_for_indices(self, indices, device=None): """Return a flat ``{"peptide", "allele", "y", "weight"}`` dict. Convenience wrapper used once per fit, by LSUV/data-dependent weight init. Unlike :meth:`batch_for_indices`, this accepts host-side ``indices`` (numpy array, list, or any tensor) and moves them to the device for you, since the init path is called outside the hot loop and isn't sensitive to the per-call host-to-device copy. """ if device is None: device = self.device if not isinstance(indices, torch.Tensor): indices = torch.as_tensor( numpy.asarray(indices, dtype=numpy.int64), device=device ) elif indices.device != device: indices = indices.to(device) inputs, y_batch, weights_batch = self.batch_for_indices(indices) batch = {"peptide": inputs["peptide"], "y": y_batch} if "allele" in inputs: batch["allele"] = inputs["allele"] if weights_batch is not None: batch["weight"] = weights_batch return batch mhcflurry-2.3.6/mhcflurry/class1_encoding.py000066400000000000000000000134621525677230600212010ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Peptide encoding helpers for class I neural networks.""" import logging from . import amino_acid from .encodable_sequences import EncodableSequences _DEVICE_PEPTIDE_ENCODING_TRUE_VALUES = { "1", "true", "yes", "on", "auto", "cpu", "device", "torch", "gpu", "mps", } _DEVICE_PEPTIDE_ENCODING_FALSE_VALUES = { "0", "false", "no", "off", "numpy", "legacy", } _warned_legacy_peptide_vector_encoding = [] def _warn_legacy_peptide_vector_encoding(value): """Warn once that the legacy dense-vector peptide path is gone.""" if not _warned_legacy_peptide_vector_encoding: _warned_legacy_peptide_vector_encoding.append(True) logging.warning( "peptide_amino_acid_encoding_torch=%r is deprecated and ignored: " "peptides are always index-encoded ((N, L) int8) and embedded on " "device via a frozen table. The legacy dense-vector peptide " "encoding path has been removed.", value) def _peptide_torch_encoding_name(hyperparameters): """Return the fixed amino-acid encoding for the peptide embedding table. Peptides are always index-encoded ((N, L) int8) and embedded via a frozen ``torch.nn.functional.embedding`` table (device-agnostic: CUDA/MPS/CPU). The table comes from ``amino_acid.get_vector_encoding_df`` and is registered as a non-persistent buffer, so it moves with ``.to(device)`` but never trains or bloats the NPZ weight list. The legacy ``peptide_amino_acid_encoding_torch=False`` dense-vector path has been removed; a falsy value is accepted but ignored (with a one-time deprecation warning) so older configs still load. A non-default value names the encoding directly; an unknown name still raises. """ mode = hyperparameters.get("peptide_amino_acid_encoding_torch", True) if isinstance(mode, str): mode_normalized = mode.strip().lower() if mode_normalized in _DEVICE_PEPTIDE_ENCODING_FALSE_VALUES: _warn_legacy_peptide_vector_encoding(mode) else: try: amino_acid.get_vector_encoding_df(mode) return mode except KeyError: pass if mode_normalized not in _DEVICE_PEPTIDE_ENCODING_TRUE_VALUES: raise ValueError( "Unsupported peptide_amino_acid_encoding_torch value %r. " "Expected bool, a true/false string, or one of %s." % (mode, sorted(amino_acid.ENCODING_DATA_FRAMES)) ) elif not mode: _warn_legacy_peptide_vector_encoding(mode) peptide_encoding = hyperparameters.get("peptide_encoding", {}) encoding_name = peptide_encoding.get("vector_encoding_name", "BLOSUM62") try: amino_acid.get_vector_encoding_df(encoding_name) except KeyError: raise ValueError( "Peptide encoding requires a fixed vector encoding with a torch " "lookup table; got %r. Available: %s" % (encoding_name, sorted(amino_acid.ENCODING_DATA_FRAMES)) ) from None return encoding_name def _peptide_uses_torch_encoding(hyperparameters): """Deprecated: peptides are always index-encoded now (always True).""" return True def _peptide_torch_encoding_table(encoding_name): """Return a float32 lookup table indexed by ``AMINO_ACID_INDEX``.""" return amino_acid.vector_encoding_index_table(encoding_name) def _peptide_torch_encoding_shape(index_shape, encoding_name): """Expand an ``(L,)`` categorical peptide shape to ``(L, V)``.""" return ( index_shape[0], amino_acid.vector_encoding_length(encoding_name), ) def _categorical_kwargs_for_peptide_encoding(peptide_encoding): """Extract kwargs shared by vector and categorical peptide encoders.""" return { key: value for key, value in peptide_encoding.items() if key in ( "alignment_method", "left_edge", "right_edge", "max_length", "trim", "allow_unsupported_amino_acids", ) } def peptide_sequences_to_network_input( peptides, peptide_encoding, peptide_amino_acid_encoding_torch=True, device=None): """Encode string or numeric peptides to categorical network inputs. Numeric inputs align directly into a Torch tensor on ``device``; strings retain the established NumPy representation and encoding cache. Peptides are always returned as compact ``(N, L)`` int8 amino-acid indices; the fixed-vector lookup then happens through the network's frozen torch embedding table. (``peptide_amino_acid_encoding_torch`` is accepted for config compatibility but the legacy dense-vector path is gone.) """ if not peptide_amino_acid_encoding_torch: _warn_legacy_peptide_vector_encoding(peptide_amino_acid_encoding_torch) from .numeric_sequences import NumericSequences if isinstance(peptides, NumericSequences): return peptides.aligned_tensor(peptide_encoding, device=device) encoder = EncodableSequences.create(peptides) return ( encoder.variable_length_to_fixed_length_categorical( **_categorical_kwargs_for_peptide_encoding(peptide_encoding) ) .astype("int8", copy=False) ) mhcflurry-2.3.6/mhcflurry/class1_neural_network.py000066400000000000000000006070471525677230600224620ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Class1NeuralNetwork - PyTorch implementation for MHC class I binding prediction. """ import gc import time import collections import json import weakref import itertools import os import logging import numpy import pandas import torch import torch.nn as nn from . import pytorch_sizing from .hyperparameters import HyperparameterDefaults from .encodable_sequences import EncodableSequences, EncodingError from .allele_encoding import AlleleEncoding from .regression_target import to_ic50, from_ic50 from .common import get_pytorch_device from .pytorch_layers import KerasBatchNorm1d, LocallyConnected1D, get_activation from .pytorch_losses import get_pytorch_loss from .keras_optimizers import KerasAdam, KerasRMSprop from .data_dependent_weights_initialization import lsuv_init from .random_negative_peptides import ( RandomNegativePeptides, RandomNegativesPool, supports_device_random_negative_encoding, ) from .class1_affinity_training_data import AffinityDeviceTrainingData from .class1_encoding import ( _peptide_torch_encoding_name, _peptide_torch_encoding_shape, _peptide_torch_encoding_table, _peptide_uses_torch_encoding, peptide_sequences_to_network_input, ) from .class1_training import ( _StreamingBatchIterableDataset, _batched_validation_loss, _carry_forward_validation_loss, _early_stop_reached, _make_streaming_batch_dataloader, _materialize_repeated_peptide_batch, _move_fit_batch_to_device, _should_validate_epoch, _sync_mean_loss, _timing_enabled, _timing_start, _timing_stop, torch_from_numpy, _update_min_validation_loss, _validation_interval_from_hyperparameters, validation_split_counts, ) from .pytorch_training import ( copy_module_state_dict_to_cpu, configure_matmul_precision, effective_validation_batch_size, maybe_compile_loss, maybe_compile_network, uncompiled_network, validation_forward_network, ) DEFAULT_PREDICT_BATCH_SIZE = pytorch_sizing.DEFAULT_PREDICT_BATCH_SIZE CHECKPOINT_POLICIES = ("terminal", "best") check_training_batch_fits = pytorch_sizing.check_training_batch_fits compute_prediction_batch_size = pytorch_sizing.compute_prediction_batch_size env_workers_per_gpu = pytorch_sizing.env_workers_per_gpu resolve_prediction_batch_size = pytorch_sizing.resolve_prediction_batch_size KERAS_BATCH_NORM_EPSILON = 1e-3 # Keras uses moving = moving * 0.99 + batch * 0.01. PyTorch's momentum is the # new-batch coefficient, so the equivalent value is 0.01. KERAS_BATCH_NORM_MOMENTUM = 0.01 def _run_training_batch( *, network, optimizer, loss_obj, regularization_parameters, l1_reg, l2_reg, inputs, y_batch, weights_batch=None, ): """Run one optimizer step and return the detached loss tensor.""" optimizer.zero_grad() predictions = network(inputs) loss = loss_obj(predictions, y_batch, sample_weights=weights_batch) regularization_penalty = Class1NeuralNetwork._regularization_penalty( regularization_parameters, l1=l1_reg, l2=l2_reg, ) if regularization_penalty is not None: loss = loss + regularization_penalty loss.backward() optimizer.step() return loss.detach() def _run_prepared_training_batches( prepared_batches, *, optimizer, loss_obj, regularization_parameters, l1_reg, l2_reg, timing_enabled, device, ): """Run optimizer steps for a prepared batch stream. Batch sources are responsible for efficient data plumbing. The in-memory affinity path yields device-resident tensors selected by GPU indices; the streaming pretrain path yields DataLoader chunks after its H2D copy. This helper owns the learning step so fit() and fit_streaming_batches() share the same optimizer/loss/timing behavior without forcing one data layout onto the other. """ losses = [] train_time = 0.0 train_rows = 0 first_batch_time = None for prepared in prepared_batches: batch_start = _timing_start(device, timing_enabled) loss = _run_training_batch( network=prepared["network"], optimizer=optimizer, loss_obj=loss_obj, regularization_parameters=regularization_parameters, l1_reg=l1_reg, l2_reg=l2_reg, inputs=prepared["inputs"], y_batch=prepared["y_batch"], weights_batch=prepared.get("weights_batch"), ) batch_time = _timing_stop(batch_start, device, timing_enabled) train_time += batch_time if first_batch_time is None: first_batch_time = batch_time train_rows += int(prepared["row_count"]) losses.append(loss) return { "losses": losses, "train_time": train_time, "train_rows": train_rows, "first_batch_time": first_batch_time, } class Class1NeuralNetworkModel(nn.Module): """ PyTorch module for Class1 neural network. """ def __init__( self, peptide_encoding_shape, allele_representations=None, locally_connected_layers=None, peptide_dense_layer_sizes=None, allele_dense_layer_sizes=None, layer_sizes=None, peptide_allele_merge_method="multiply", peptide_allele_merge_activation="", activation="tanh", output_activation="sigmoid", dropout_probability=0.0, batch_normalization=False, dense_layer_l1_regularization=0.001, dense_layer_l2_regularization=0.0, topology="feedforward", num_outputs=1, init="glorot_uniform", peptide_input_is_indices=False, peptide_input_vector_encoding_name=None, normalization="none"): super(Class1NeuralNetworkModel, self).__init__() self.peptide_encoding_shape = peptide_encoding_shape if peptide_input_vector_encoding_name is None and peptide_input_is_indices: peptide_input_vector_encoding_name = "BLOSUM62" self.peptide_input_vector_encoding_name = peptide_input_vector_encoding_name self.peptide_input_is_indices = peptide_input_vector_encoding_name is not None # DEPRECATED (scheduled for removal): ``peptide_input_is_indices`` is now # always True in production — the encoding path emits (N, L) int8 and the # legacy dense-vector peptide path is gone. The ``False`` branch (a 3D # fp32 peptide input, handled in ``forward``/``predict``) is retained # only as defensive handling used by topology/init unit tests; it has no # production caller and should be collapsed to index-only when those # tests migrate. # # Device-side fixed amino-acid encoding: when enabled, peptide input # is (N, L) int indices and ``forward`` widens to (N, L, V) fp32 via # a frozen embedding table. The table is a non-persistent buffer: it # moves with ``.to(device)`` but is fully determined by hyperparameters # and should not be serialized in custom NPZ weight lists. if self.peptide_input_is_indices: self.register_buffer( "peptide_embedding_table", torch.from_numpy( _peptide_torch_encoding_table(peptide_input_vector_encoding_name) ), persistent=False, ) self.has_allele = allele_representations is not None self.peptide_allele_merge_method = peptide_allele_merge_method self.peptide_allele_merge_activation = peptide_allele_merge_activation self.dropout_probability = dropout_probability normalization = str(normalization or "none").lower() if normalization not in {"none", "batch", "layer"}: raise ValueError( "normalization must be one of none, batch, or layer; got %r" % normalization ) if batch_normalization: if normalization not in {"none", "batch"}: raise ValueError( "batch_normalization=True conflicts with normalization=%r" % normalization ) normalization = "batch" self.normalization = normalization self.topology = topology self.num_outputs = num_outputs self.activation_name = activation self.output_activation_name = output_activation if locally_connected_layers is None: locally_connected_layers = [] if peptide_dense_layer_sizes is None: peptide_dense_layer_sizes = [] if allele_dense_layer_sizes is None: allele_dense_layer_sizes = [] if layer_sizes is None: layer_sizes = [32] # Build locally connected layers self.lc_layers = nn.ModuleList() input_length = peptide_encoding_shape[0] in_channels = peptide_encoding_shape[1] for i, lc_params in enumerate(locally_connected_layers): filters = lc_params.get('filters', 8) kernel_size = lc_params.get('kernel_size', 3) lc_activation = lc_params.get('activation', 'tanh') lc_layer = LocallyConnected1D( in_channels=in_channels, out_channels=filters, input_length=input_length, kernel_size=kernel_size, activation=lc_activation ) self.lc_layers.append(lc_layer) in_channels = filters input_length = lc_layer.output_length # Flattened size after locally connected layers self.flatten_size = input_length * in_channels # Peptide dense layers self.peptide_dense_layers = nn.ModuleList() peptide_layer_input = self.flatten_size for i, size in enumerate(peptide_dense_layer_sizes): layer = nn.Linear(peptide_layer_input, size) self.peptide_dense_layers.append(layer) peptide_layer_input = size # Batch normalization after peptide processing (early) self.batch_norm_early = None self.layer_norm_early = None if normalization == "batch": self.batch_norm_early = KerasBatchNorm1d( peptide_layer_input, eps=KERAS_BATCH_NORM_EPSILON, momentum=KERAS_BATCH_NORM_MOMENTUM, ) elif normalization == "layer": self.layer_norm_early = nn.LayerNorm(peptide_layer_input) # Allele embedding and processing self.allele_embedding = None self.allele_dense_layers = nn.ModuleList() allele_output_size = 0 if self.has_allele: num_alleles = allele_representations.shape[0] embedding_dim = numpy.prod(allele_representations.shape[1:]) self.allele_embedding = nn.Embedding( num_embeddings=num_alleles, embedding_dim=embedding_dim ) # Set embedding weights and freeze self.allele_embedding.weight.data = torch.from_numpy( allele_representations.reshape(num_alleles, -1).astype(numpy.float32) ) self.allele_embedding.weight.requires_grad = False allele_layer_input = embedding_dim for i, size in enumerate(allele_dense_layer_sizes): layer = nn.Linear(allele_layer_input, size) self.allele_dense_layers.append(layer) allele_layer_input = size allele_output_size = allele_layer_input # Compute merged size if self.has_allele: if peptide_allele_merge_method == "concatenate": merged_size = peptide_layer_input + allele_output_size elif peptide_allele_merge_method == "multiply": # Both must have the same size for multiply merged_size = peptide_layer_input else: raise ValueError(f"Unknown merge method: {peptide_allele_merge_method}") else: merged_size = peptide_layer_input # Merge activation self.merge_activation = get_activation(peptide_allele_merge_activation) # Main dense layers self.dense_layers = nn.ModuleList() self.batch_norms = nn.ModuleList() self.layer_norms = nn.ModuleList() self.dropouts = nn.ModuleList() # For DenseNet topology, track input sizes for skip connections self.merged_size = merged_size current_size = merged_size prev_sizes = [] # Track previous layer output sizes for skip connections for i, size in enumerate(layer_sizes): # For DenseNet topology (with-skip-connections): # - Layer 0: input = merged_size # - Layer 1: input = merged_size + layer_sizes[0] (skip from input) # - Layer 2+: input = layer_sizes[i-2] + layer_sizes[i-1] (skip from 2 layers back) if topology == "with-skip-connections" and i > 0: if i == 1: # Skip from original merged input current_size = merged_size + prev_sizes[-1] else: # Skip from 2 layers back current_size = prev_sizes[-2] + prev_sizes[-1] layer = nn.Linear(current_size, size) self.dense_layers.append(layer) if normalization == "batch": self.batch_norms.append(KerasBatchNorm1d( size, eps=KERAS_BATCH_NORM_EPSILON, momentum=KERAS_BATCH_NORM_MOMENTUM, )) else: self.batch_norms.append(None) if normalization == "layer": self.layer_norms.append(nn.LayerNorm(size)) else: self.layer_norms.append(None) if dropout_probability > 0: # Dropout probability in MHCflurry hyperparameters is keep-probability. drop_prob = max(0.0, 1.0 - dropout_probability) if drop_prob > 0: self.dropouts.append(nn.Dropout(p=drop_prob)) else: self.dropouts.append(None) else: self.dropouts.append(None) prev_sizes.append(size) current_size = size # Note: For DenseNet topology, output layer receives only the last hidden layer output # (skip connections are only between hidden layers, not to the output layer) # Output layer self.output_layer = nn.Linear(current_size, num_outputs) # Activation functions self.activation = get_activation(activation) self.output_activation = get_activation(output_activation) # Initialize weights self._initialize_weights(init) def activation_output_for_layer(self, layer, output): """Apply the activation belonging to a trainable affine layer. This exposes the same layer-output boundary that Keras reports for a ``Dense`` layer. Data-dependent initialization uses it to measure post-activation variance even though PyTorch represents the linear transform and activation as separate operations. """ hidden_layers = ( list(self.peptide_dense_layers) + list(self.allele_dense_layers) + list(self.dense_layers) ) if any(layer is hidden_layer for hidden_layer in hidden_layers): return self.activation(output) if self.activation is not None else output if layer is self.output_layer: return ( self.output_activation(output) if self.output_activation is not None else output ) return output def _initialize_weights(self, init): """Initialize layer weights.""" for module in self.modules(): if isinstance(module, nn.Linear): if init == "glorot_uniform": nn.init.xavier_uniform_(module.weight) elif init == "glorot_normal": nn.init.xavier_normal_(module.weight) elif init == "he_uniform": nn.init.kaiming_uniform_(module.weight) elif init == "he_normal": nn.init.kaiming_normal_(module.weight) elif init == "orthogonal": nn.init.orthogonal_(module.weight) if module.bias is not None: nn.init.zeros_(module.bias) def _forward_peptide_stage_before_early_batch_norm(self, peptide): if ( self.peptide_input_is_indices and peptide.dim() == 2 ): peptide = torch.nn.functional.embedding( peptide.long(), self.peptide_embedding_table ) x = peptide for lc_layer in self.lc_layers: x = lc_layer(x) x = x.reshape(x.size(0), -1) for layer in self.peptide_dense_layers: x = layer(x) if self.activation is not None: x = self.activation(x) return x def forward_peptide_stage(self, peptide): """Run only the peptide-side of the network. Ends at the point where the allele information enters — just before the merge step. Used by the calibration fast path to compute the peptide-dependent activations once and reuse them across thousands of alleles. Parameters ---------- peptide : torch.Tensor (N, L, V) fp32 fixed-vector encoded, or (N, L) int indices when ``peptide_input_is_indices`` is True. Returns ------- torch.Tensor of shape (N, peptide_representation_dim) — the input the ``forward_from_peptide_stage`` fast path expects. """ x = self._forward_peptide_stage_before_early_batch_norm(peptide) if self.batch_norm_early is not None: x = self.batch_norm_early(x) if self.layer_norm_early is not None: x = self.layer_norm_early(x) return x def _forward_allele_stage(self, allele_idx): allele_idx = allele_idx.long() if allele_idx.dim() > 1: allele_idx = allele_idx.squeeze(-1) allele_embed = self.allele_embedding(allele_idx) for layer in self.allele_dense_layers: allele_embed = layer(allele_embed) if self.activation is not None: allele_embed = self.activation(allele_embed) return allele_embed.reshape(allele_embed.size(0), -1) def forward_from_peptide_stage(self, peptide_stage, allele_idx): """Run the allele-merge + main dense path from cached peptide reps. ``peptide_stage`` must be the output of ``forward_peptide_stage``. ``allele_idx`` has shape matching ``peptide_stage``'s batch dim — typical calibration usage tiles one allele across many peptides or the cross-product of (peptide_chunk, allele_chunk). This path skips all peptide-side ops, which for pan-allele calibration lets a single precomputed activation be reused across tens of thousands of allele forwards. """ if not self.has_allele: raise RuntimeError( "forward_from_peptide_stage called on a has_allele=False " "model — just call forward() directly" ) x = peptide_stage allele_embed = self._forward_allele_stage(allele_idx) if self.peptide_allele_merge_method == "concatenate": x = torch.cat([x, allele_embed], dim=-1) elif self.peptide_allele_merge_method == "multiply": x = x * allele_embed if self.merge_activation is not None: x = self.merge_activation(x) prev_outputs = [] merged_input = x for i, layer in enumerate(self.dense_layers): if self.topology == "with-skip-connections" and i > 0: if i == 1: x = torch.cat([merged_input, prev_outputs[-1]], dim=-1) else: x = torch.cat([prev_outputs[-2], prev_outputs[-1]], dim=-1) x = layer(x) if self.activation is not None: x = self.activation(x) if self.batch_norms[i] is not None: x = self.batch_norms[i](x) if self.layer_norms[i] is not None: x = self.layer_norms[i](x) if self.dropouts[i] is not None: x = self.dropouts[i](x) prev_outputs.append(x) output = self.output_layer(x) if self.output_activation is not None: output = self.output_activation(output) return output def _first_linear_from_cartesian_stages(self, peptide_stage, allele_stage, layer): if self.peptide_allele_merge_method == "concatenate": peptide_width = peptide_stage.shape[-1] peptide_weight = layer.weight[:, :peptide_width] allele_weight = layer.weight[:, peptide_width:] x = ( peptide_stage.matmul(peptide_weight.t()).unsqueeze(1) + allele_stage.matmul(allele_weight.t()).unsqueeze(0) ) elif self.peptide_allele_merge_method == "multiply": x = torch.einsum( "pd,ad,hd->pah", peptide_stage, allele_stage, layer.weight, ) else: raise ValueError( f"Unknown merge method: {self.peptide_allele_merge_method}" ) return x + layer.bias def _forward_compact_cartesian(self, peptide, allele_idx, repeat_count): """Forward a compact peptide × allele batch without raw peptide repeat.""" if not self.has_allele: raise RuntimeError( "compact peptide-repeat batches require a pan-allele model" ) if repeat_count <= 0: raise ValueError("peptide_repeat_count must be positive") allele_idx = allele_idx.long() if allele_idx.dim() > 1: allele_idx = allele_idx.squeeze(-1) peptide_count = peptide.shape[0] allele_count = allele_idx.shape[0] if ( isinstance(peptide_count, int) and isinstance(allele_count, int) and allele_count != peptide_count * repeat_count ): raise ValueError( "compact peptide-repeat batch has %d peptides, repeat_count=%d, " "and %d allele rows" % (peptide_count, repeat_count, allele_count) ) peptide_stage = self._forward_peptide_stage_before_early_batch_norm(peptide) if self.batch_norm_early is not None: # BatchNorm's running variance depends on the batch size. Repeat # before early BN so compact training is numerically equivalent to # the historical fully repeated peptide batch. peptide_stage = peptide_stage.repeat_interleave(repeat_count, dim=0) peptide_stage = self.batch_norm_early(peptide_stage) peptide_stage = peptide_stage.reshape( peptide_count, repeat_count, peptide_stage.shape[-1] )[:, 0, :] if self.layer_norm_early is not None: peptide_stage = self.layer_norm_early(peptide_stage) allele_stage = self._forward_allele_stage(allele_idx[:repeat_count]) can_factorize_first_layer = ( self.merge_activation is None and self.topology != "with-skip-connections" ) if not can_factorize_first_layer: peptide_stage = peptide_stage.repeat_interleave(repeat_count, dim=0) return self.forward_from_peptide_stage(peptide_stage, allele_idx) if self.dense_layers: first_layer = self.dense_layers[0] else: first_layer = self.output_layer x = self._first_linear_from_cartesian_stages( peptide_stage, allele_stage, first_layer, ) x = x.reshape(peptide_count * repeat_count, x.shape[-1]) if self.dense_layers: if self.activation is not None: x = self.activation(x) if self.batch_norms[0] is not None: x = self.batch_norms[0](x) if self.layer_norms[0] is not None: x = self.layer_norms[0](x) if self.dropouts[0] is not None: x = self.dropouts[0](x) # ``enumerate(seq, start=N)`` triggers a torch._dynamo graph # break on PyTorch <=2.4 (``call_enumerate`` rejects the # ``start`` kwarg in builtin.py:775) — every traced forward # then falls back to eager for the layer-stack loop, losing # the compile speedup. Iterate by index instead so the loop # body stays inside the compiled graph. # # When upgrading torch past 2.4 confirm the dynamo bug is # fixed and revert to enumerate(seq, start=1). for offset, layer in enumerate(self.dense_layers[1:]): i = offset + 1 x = layer(x) if self.activation is not None: x = self.activation(x) if self.batch_norms[i] is not None: x = self.batch_norms[i](x) if self.layer_norms[i] is not None: x = self.layer_norms[i](x) if self.dropouts[i] is not None: x = self.dropouts[i](x) output = self.output_layer(x) else: output = x if self.output_activation is not None: output = self.output_activation(output) return output def forward_cartesian_from_peptide_stage(self, peptide_stage, allele_idx): """Forward every peptide-stage row against every allele index. Returns predictions in allele-major order with shape ``(num_alleles, num_peptides, num_outputs)``. When the model's merge + first linear layer can be factored, this avoids materializing the larger ``num_alleles * num_peptides * peptide_stage_dim`` repeated peptide-stage tensor used by ``forward_from_peptide_stage``. Skip-connections (``topology == "with-skip-connections"``) are also factorized: layer 1's input ``cat[merged_input, layer0_out]`` is computed without materializing the (a*p, peptide_width + allele_width) merged_input expansion — instead layer 1's weight is split column-wise into peptide / allele / prev pieces and the contributions are summed in their factored shapes (``(p, h1)`` + ``(a, h1)`` + ``(a, p, h1)``). Layers ≥ 2's input ``cat[prev[-2], prev[-1]]`` is similarly factorized via column-wise weight splits, avoiding the explicit concat. """ if not self.has_allele: raise RuntimeError( "forward_cartesian_from_peptide_stage called on a " "has_allele=False model" ) allele_idx = allele_idx.long() if allele_idx.dim() > 1: allele_idx = allele_idx.squeeze(-1) num_peptides = peptide_stage.shape[0] num_alleles = allele_idx.shape[0] is_skip = self.topology == "with-skip-connections" # ``_first_linear_from_cartesian_stages`` handles both # ``concatenate`` and ``multiply`` merge methods via separate # codepaths, so the standard (non-skip) factorized path is fine # for either. Skip-connections factorization at layer 1 below # only handles the concatenate case (multiply + skip is rare # and would need an einsum at every skip layer); fall back to # the non-factorized path for that combo. can_factorize_first_layer = ( self.merge_activation is None and (not is_skip or self.peptide_allele_merge_method == "concatenate") ) if not can_factorize_first_layer: peptide_width = peptide_stage.shape[-1] expanded = peptide_stage.unsqueeze(0).expand( num_alleles, num_peptides, peptide_width ).reshape(num_alleles * num_peptides, peptide_width) expanded_alleles = allele_idx.unsqueeze(1).expand( num_alleles, num_peptides ).reshape(-1) return self.forward_from_peptide_stage( expanded, expanded_alleles, ).reshape(num_alleles, num_peptides, -1) allele_stage = self._forward_allele_stage(allele_idx) if self.dense_layers: first_layer = self.dense_layers[0] else: first_layer = self.output_layer x = self._first_linear_from_cartesian_stages( peptide_stage, allele_stage, first_layer, ) x = x.transpose(0, 1).reshape(num_alleles * num_peptides, x.shape[-1]) if self.dense_layers: if self.activation is not None: x = self.activation(x) if self.batch_norms[0] is not None: x = self.batch_norms[0](x) if self.layer_norms[0] is not None: x = self.layer_norms[0](x) if self.dropouts[0] is not None: x = self.dropouts[0](x) if is_skip: # Skip-connections factorized path. layer 1's input is # cat[merged_input, prev[0]] = cat[peptide_expanded, # allele_expanded, prev[0]]; rather than materialize # the (a*p, peptide_width + allele_width + h0) tensor, # split the layer's weight column-wise and sum the # three contributions in their natural factored shapes. # Layers ≥ 2 take cat[prev[-2], prev[-1]]; both are # already in flat-cartesian form so we just split the # weight column-wise to skip the concat materialization. peptide_width = peptide_stage.shape[-1] allele_width = allele_stage.shape[-1] prev_outputs = [x] for offset, layer in enumerate(self.dense_layers[1:]): i = offset + 1 if i == 1: W = layer.weight W_p = W[:, :peptide_width] W_a = W[:, peptide_width:peptide_width + allele_width] W_prev = W[:, peptide_width + allele_width:] peptide_part = peptide_stage.matmul(W_p.t()) # (p, h1) allele_part = allele_stage.matmul(W_a.t()) # (a, h1) prev_reshaped = prev_outputs[0].reshape( num_alleles, num_peptides, -1, ) prev_part = prev_reshaped.matmul(W_prev.t()) # (a, p, h1) new_x = ( peptide_part.unsqueeze(0) + allele_part.unsqueeze(1) + prev_part + layer.bias ) new_x = new_x.reshape( num_alleles * num_peptides, -1, ) else: # Layers ≥ 2: cat[prev[-2], prev[-1]] @ W.T + bias # = prev[-2] @ W_left.T + prev[-1] @ W_right.T + bias h_left = prev_outputs[-2].shape[-1] W = layer.weight W_left = W[:, :h_left] W_right = W[:, h_left:] new_x = ( prev_outputs[-2].matmul(W_left.t()) + prev_outputs[-1].matmul(W_right.t()) + layer.bias ) if self.activation is not None: new_x = self.activation(new_x) if self.batch_norms[i] is not None: new_x = self.batch_norms[i](new_x) if self.layer_norms[i] is not None: new_x = self.layer_norms[i](new_x) if self.dropouts[i] is not None: new_x = self.dropouts[i](new_x) prev_outputs.append(new_x) x = prev_outputs[-1] else: # Standard feedforward (no skip): existing tight loop. # ``enumerate(seq, start=N)`` triggers a torch._dynamo # graph break on PyTorch <=2.4 (``call_enumerate`` rejects # the ``start`` kwarg in builtin.py:775) — every traced # forward then falls back to eager for the layer-stack # loop, losing the compile speedup. Iterate by index # instead so the loop body stays inside the compiled # graph. for offset, layer in enumerate(self.dense_layers[1:]): i = offset + 1 x = layer(x) if self.activation is not None: x = self.activation(x) if self.batch_norms[i] is not None: x = self.batch_norms[i](x) if self.layer_norms[i] is not None: x = self.layer_norms[i](x) if self.dropouts[i] is not None: x = self.dropouts[i](x) output = self.output_layer(x) else: output = x if self.output_activation is not None: output = self.output_activation(output) return output.reshape(num_alleles, num_peptides, -1) def forward(self, inputs): """ Forward pass. Parameters ---------- inputs : dict Dictionary with 'peptide' and optionally 'allele' keys Returns ------- torch.Tensor Predictions of shape (batch, num_outputs) """ if self.has_allele != ('allele' in inputs): raise ValueError( "Class1NeuralNetworkModel input mismatch: " f"network has_allele={self.has_allele} but " f"received allele key={('allele' in inputs)}" ) peptide = inputs['peptide'] peptide_repeat_count = inputs.get("peptide_repeat_count") if peptide_repeat_count is not None: if "allele" not in inputs: raise ValueError( "compact peptide-repeat batch requires an allele input" ) return self._forward_compact_cartesian( peptide, inputs["allele"], int(peptide_repeat_count), ) # Device-side fixed amino-acid encoding: (N, L) int indices → # (N, L, V) fp32. Skipped when the input is already the 3D # vector-encoded tensor. ``torch.nn.functional.embedding`` is a # pure gather, so the op cost is comparable to the int8→fp32 # widening cast it replaces while saving V× H2D/cache bytes. if self.peptide_input_is_indices and peptide.dim() == 2: peptide = torch.nn.functional.embedding( peptide.long(), self.peptide_embedding_table ) # Locally connected layers x = peptide for lc_layer in self.lc_layers: x = lc_layer(x) # Flatten x = x.reshape(x.size(0), -1) # Peptide dense layers for layer in self.peptide_dense_layers: x = layer(x) if self.activation is not None: x = self.activation(x) # Early batch normalization if self.batch_norm_early is not None: x = self.batch_norm_early(x) if self.layer_norm_early is not None: x = self.layer_norm_early(x) # Allele processing and merge if self.has_allele: allele_idx = inputs['allele'].long() # Handle case where input might be (batch,) or (batch, 1) if allele_idx.dim() > 1: allele_idx = allele_idx.squeeze(-1) allele_embed = self.allele_embedding(allele_idx) # Allele dense layers for layer in self.allele_dense_layers: allele_embed = layer(allele_embed) if self.activation is not None: allele_embed = self.activation(allele_embed) # Flatten allele embedding allele_embed = allele_embed.reshape(allele_embed.size(0), -1) # Merge if self.peptide_allele_merge_method == "concatenate": x = torch.cat([x, allele_embed], dim=-1) elif self.peptide_allele_merge_method == "multiply": x = x * allele_embed # Merge activation if self.merge_activation is not None: x = self.merge_activation(x) # Main dense layers (with optional skip connections for DenseNet topology) prev_outputs = [] # Track outputs for skip connections merged_input = x # Save for DenseNet skip connections for i, layer in enumerate(self.dense_layers): # For DenseNet topology, concatenate skip connections if self.topology == "with-skip-connections" and i > 0: if i == 1: # Skip from original merged input x = torch.cat([merged_input, prev_outputs[-1]], dim=-1) else: # Skip from 2 layers back x = torch.cat([prev_outputs[-2], prev_outputs[-1]], dim=-1) x = layer(x) if self.activation is not None: x = self.activation(x) if self.batch_norms[i] is not None: x = self.batch_norms[i](x) if self.layer_norms[i] is not None: x = self.layer_norms[i](x) if self.dropouts[i] is not None: x = self.dropouts[i](x) prev_outputs.append(x) # Note: For DenseNet topology, output layer receives only the last hidden layer output # (skip connections are only between hidden layers, not to the output layer) # Output output = self.output_layer(x) if self.output_activation is not None: output = self.output_activation(output) return output def get_weights_list(self): """ Get weights as a list of numpy arrays (for compatibility with NPZ format). Returns ------- list of numpy.ndarray """ weights = [] for name, param in self.named_parameters(): weights.append(param.detach().cpu().numpy()) # Also include persistent buffers (running mean/var for batch norm). # Deterministic fixed-encoding tables are registered as # persistent=False and reconstructed from hyperparameters. for name, buffer in self._named_persistent_buffers(): weights.append(buffer.detach().cpu().numpy()) return weights def _named_persistent_buffers(self): """Yield named buffers that belong in mhcflurry's NPZ weights.""" modules = dict(self.named_modules()) for name, buffer in self.named_buffers(): module = self buffer_name = name if "." in name: module_path, buffer_name = name.rsplit(".", 1) module = modules[module_path] if buffer_name in module._non_persistent_buffers_set: continue yield name, buffer def set_weights_list(self, weights, auto_convert_keras=True): """ Set weights from a list of numpy arrays. Supports automatic detection and conversion of Keras-format weights to PyTorch format for backward compatibility with pre-trained models. Parameters ---------- weights : list of numpy.ndarray auto_convert_keras : bool If True, automatically detect and convert Keras-format weights """ if auto_convert_keras and getattr(self, "_keras_config", None): keras_layers = self._keras_config.get("config", {}).get("layers", []) idx = 0 def assign_dense(layer, w, b): w = w.astype(numpy.float32) b = b.astype(numpy.float32) if w.shape == layer.weight.shape[::-1] or ( w.shape == layer.weight.shape and w.shape[0] == w.shape[1] ): w = w.T if w.shape != layer.weight.shape: raise ValueError( f"Weight shape mismatch for {layer}: got {w.shape}, " f"expected {layer.weight.shape}" ) if b.shape != layer.bias.shape: raise ValueError( f"Bias shape mismatch for {layer}: got {b.shape}, " f"expected {layer.bias.shape}" ) layer.weight.data = torch.from_numpy(w).to( device=layer.weight.device, dtype=layer.weight.dtype, ) layer.bias.data = torch.from_numpy(b).to( device=layer.bias.device, dtype=layer.bias.dtype, ) def assign_locally_connected(layer, w, b): w = w.astype(numpy.float32) b = b.astype(numpy.float32) if len(w.shape) == 5 and w.shape[1] == 1: out_len, _, k, in_ch, out_ch = w.shape w = w.squeeze(1) w = w.reshape(out_len, k * in_ch, out_ch) w = w.transpose(0, 2, 1) elif len(w.shape) == 3 and w.shape[0] == layer.output_length: # Keras (out_len, k*in_ch, out_ch) -> PyTorch (out_len, out_ch, in_ch*k) if w.shape[1] == layer.weight.shape[2] and w.shape[2] == layer.weight.shape[1]: w = w.transpose(0, 2, 1) else: kernel_size = layer.kernel_size out_len = w.shape[0] k_times_in_ch = w.shape[1] out_ch = w.shape[2] in_ch = k_times_in_ch // kernel_size w = w.reshape(out_len, kernel_size, in_ch, out_ch) w = w.transpose(0, 2, 1, 3) w = w.reshape(out_len, in_ch * kernel_size, out_ch) w = w.transpose(0, 2, 1) if w.shape != layer.weight.shape: raise ValueError( f"Weight shape mismatch for {layer}: got {w.shape}, " f"expected {layer.weight.shape}" ) if b.shape != layer.bias.shape: raise ValueError( f"Bias shape mismatch for {layer}: got {b.shape}, " f"expected {layer.bias.shape}" ) layer.weight.data = torch.from_numpy(w).to( device=layer.weight.device, dtype=layer.weight.dtype, ) layer.bias.data = torch.from_numpy(b).to( device=layer.bias.device, dtype=layer.bias.dtype, ) def assign_batch_norm(layer, gamma, beta, mean, var): layer.weight.data = torch.from_numpy( gamma.astype(numpy.float32) ).to(device=layer.weight.device, dtype=layer.weight.dtype) layer.bias.data = torch.from_numpy( beta.astype(numpy.float32) ).to(device=layer.bias.device, dtype=layer.bias.dtype) layer.running_mean.data = torch.from_numpy( mean.astype(numpy.float32) ).to( device=layer.running_mean.device, dtype=layer.running_mean.dtype, ) layer.running_var.data = torch.from_numpy( var.astype(numpy.float32) ).to( device=layer.running_var.device, dtype=layer.running_var.dtype, ) skip_keras_embedding = False keras_metadata = getattr(self, "_keras_metadata", None) if keras_metadata and keras_metadata.get("skip_embedding_weights", False): skip_keras_embedding = True for layer in keras_layers: layer_class = layer.get("class_name", "") layer_name = layer.get("config", {}).get("name", "") if layer_class == "Dense": w = weights[idx] b = weights[idx + 1] idx += 2 if layer_name == "output": assign_dense(self.output_layer, w, b) elif layer_name.startswith("dense_"): dense_idx = int(layer_name.split("_")[1]) assign_dense(self.dense_layers[dense_idx], w, b) elif layer_name.startswith("peptide_dense_"): dense_idx = int(layer_name.split("_")[2]) assign_dense(self.peptide_dense_layers[dense_idx], w, b) elif layer_name.startswith("allele_dense_"): dense_idx = int(layer_name.split("_")[2]) assign_dense(self.allele_dense_layers[dense_idx], w, b) elif layer_class == "LocallyConnected1D": w = weights[idx] b = weights[idx + 1] idx += 2 lc_idx = int(layer_name.split("_")[1]) assign_locally_connected(self.lc_layers[lc_idx], w, b) elif layer_class == "Embedding": w = weights[idx] idx += 1 if skip_keras_embedding: continue if self.allele_embedding is None: continue if w.shape == self.allele_embedding.weight.shape: target = self.allele_embedding.weight self.allele_embedding.weight.data = torch.from_numpy( w.astype(numpy.float32) ).to(device=target.device, dtype=target.dtype) elif layer_class == "BatchNormalization": gamma = weights[idx] beta = weights[idx + 1] mean = weights[idx + 2] var = weights[idx + 3] idx += 4 if layer_name == "batch_norm_early": if self.batch_norm_early is not None: assign_batch_norm(self.batch_norm_early, gamma, beta, mean, var) elif layer_name.startswith("batch_norm_"): bn_idx = int(layer_name.split("_")[2]) if self.batch_norms[bn_idx] is not None: assign_batch_norm(self.batch_norms[bn_idx], gamma, beta, mean, var) else: continue return idx = 0 # Check for keras metadata to know if we need to skip embedding weights keras_metadata = getattr(self, '_keras_metadata', None) skip_keras_embedding = False if keras_metadata and keras_metadata.get('skip_embedding_weights', False): skip_keras_embedding = True named_modules = dict(self.named_modules()) if auto_convert_keras else {} for name, param in self.named_parameters(): # Skip allele_embedding when loading Keras weights with placeholder if skip_keras_embedding and 'allele_embedding' in name: # Also skip the corresponding placeholder weight in the weights list # Placeholder embeddings have shape (0, embed_dim) while idx < len(weights) and len(weights[idx].shape) == 2 and weights[idx].shape[0] == 0: idx += 1 continue w = weights[idx].astype(numpy.float32) extra_keras_skip = 0 module = None if auto_convert_keras and "." in name: module_name = name.rsplit(".", 1)[0] module = named_modules.get(module_name) # Skip allele_embedding if shapes don't match (pan-allele models) # The embedding will be set by set_allele_representations later if 'allele_embedding' in name and w.shape != param.shape: # Advance index past this weight idx += 1 continue # Auto-detect and convert Keras weights if auto_convert_keras: # Dense/Linear layer: Keras (in, out) -> PyTorch (out, in) # Note: Must transpose even when shapes match (square matrices) # Check for weight (not bias) by looking at param name is_linear_weight = ('weight' in name and 'embedding' not in name and len(w.shape) == 2) if is_linear_weight and (w.shape == param.shape[::-1] or (w.shape == param.shape and w.shape[0] == w.shape[1])): w = w.T # LocallyConnected1D weight: Keras (out_len, 1, k, in_ch, out_ch) # -> PyTorch (out_len, out_ch, in_ch * k) elif len(w.shape) == 5 and w.shape[1] == 1: out_len, _, k, in_ch, out_ch = w.shape w = w.squeeze(1) # (out_len, k, in_ch, out_ch) w = w.reshape(out_len, k * in_ch, out_ch) w = w.transpose(0, 2, 1) # (out_len, out_ch, k * in_ch) # LocallyConnected1D weight (3D): Keras (out_len, k*in_ch, out_ch) # -> PyTorch (out_len, out_ch, in_ch*k) # Note: Keras stores kernel_positions as outer loop, channels as inner # PyTorch unfold produces channels as outer loop, kernel_positions as inner elif len(w.shape) == 3 and w.shape[0] == param.shape[0] and \ w.shape[1] == param.shape[2] and w.shape[2] == param.shape[1]: # LocallyConnected1D weight (3D): Keras (out_len, k*in_ch, out_ch) # -> PyTorch (out_len, out_ch, k*in_ch) w = w.transpose(0, 2, 1) # LocallyConnected1D bias: Keras (out_len * out_ch,) -> PyTorch (out_len, out_ch) elif len(w.shape) == 1 and len(param.shape) == 2 and \ w.shape[0] == param.shape[0] * param.shape[1]: w = w.reshape(param.shape) # BatchNorm: Keras provides gamma, beta, moving_mean, moving_var. # PyTorch exposes gamma/beta as params and moving stats as buffers. if module is not None and isinstance(module, torch.nn.BatchNorm1d): if name.endswith("bias") and idx + 2 < len(weights): running_mean = weights[idx + 1].astype(numpy.float32) running_var = weights[idx + 2].astype(numpy.float32) if module.running_mean.shape == running_mean.shape: module.running_mean.data = torch.from_numpy( running_mean ).to( device=module.running_mean.device, dtype=module.running_mean.dtype, ) if module.running_var.shape == running_var.shape: module.running_var.data = torch.from_numpy( running_var ).to( device=module.running_var.device, dtype=module.running_var.dtype, ) extra_keras_skip = 2 if w.shape != param.shape: raise ValueError( f"Weight shape mismatch for {name}: " f"got {weights[idx].shape}, expected {param.shape}" ) param.data = torch.from_numpy(w).to( device=param.device, dtype=param.dtype, ) idx += 1 + extra_keras_skip if not auto_convert_keras: named_modules_dict = dict(self.named_modules()) for name, buffer in self._named_persistent_buffers(): tensor = torch.from_numpy(weights[idx]).to( device=buffer.device, dtype=buffer.dtype, ) # Navigate to the correct submodule for nested buffers if "." in name: module_path, buffer_name = name.rsplit(".", 1) named_modules_dict[module_path]._buffers[buffer_name] = tensor else: self._buffers[name] = tensor idx += 1 def to_json(self): """ Serialize model configuration to JSON string. Returns ------- str JSON representation of model configuration """ import json # Extract layer configurations lc_layers_config = [] for lc_layer in self.lc_layers: lc_layers_config.append({ 'in_channels': lc_layer.in_channels, 'out_channels': lc_layer.out_channels, 'kernel_size': lc_layer.kernel_size, 'input_length': lc_layer.input_length, 'output_length': lc_layer.output_length, 'activation': lc_layer.activation_name, }) peptide_dense_sizes = [ layer.out_features for layer in self.peptide_dense_layers ] allele_dense_sizes = [ layer.out_features for layer in self.allele_dense_layers ] layer_sizes = [ layer.out_features for layer in self.dense_layers ] config = { 'class': 'Class1NeuralNetworkModel', 'peptide_encoding_shape': list(self.peptide_encoding_shape), 'peptide_input_vector_encoding_name': self.peptide_input_vector_encoding_name, 'has_allele': self.has_allele, 'peptide_allele_merge_method': self.peptide_allele_merge_method, 'peptide_allele_merge_activation': self.peptide_allele_merge_activation, 'dropout_probability': self.dropout_probability, 'topology': self.topology, 'num_outputs': self.num_outputs, 'activation': self.activation_name, 'output_activation': self.output_activation_name, 'locally_connected_layers': lc_layers_config, 'peptide_dense_layer_sizes': peptide_dense_sizes, 'allele_dense_layer_sizes': allele_dense_sizes, 'layer_sizes': layer_sizes, 'batch_normalization': self.batch_norm_early is not None, 'normalization': self.normalization, } return json.dumps(config, sort_keys=True) class Class1NeuralNetwork(object): """ Low level class I predictor consisting of a single neural network. Both single allele and pan-allele prediction are supported. Users will generally use Class1AffinityPredictor, which gives a higher-level interface and supports ensembles. """ network_hyperparameter_defaults = HyperparameterDefaults( allele_amino_acid_encoding="BLOSUM62", allele_dense_layer_sizes=[], peptide_encoding={ "vector_encoding_name": "BLOSUM62", "alignment_method": "pad_middle", "left_edge": 4, "right_edge": 4, "max_length": 15, }, peptide_dense_layer_sizes=[], peptide_allele_merge_method="multiply", peptide_allele_merge_activation="", layer_sizes=[32], dense_layer_l1_regularization=0.001, dense_layer_l2_regularization=0.0, activation="tanh", init="glorot_uniform", output_activation="sigmoid", dropout_probability=0.0, batch_normalization=False, normalization="none", locally_connected_layers=[ {"filters": 8, "activation": "tanh", "kernel_size": 3} ], topology="feedforward", num_outputs=1, # Feed the network (N, L) int amino-acid indices and widen to the # configured fixed vector encoding through a frozen torch embedding # table on the active device, instead of shipping the (N, L, V) # vector tensor from numpy. Disable only for legacy byte-level tests. peptide_amino_acid_encoding_torch=True, ) """ Hyperparameters (and their default values) that affect the neural network architecture. """ compile_hyperparameter_defaults = HyperparameterDefaults( loss="custom:mse_with_inequalities", optimizer="rmsprop", optimizer_implementation="keras", learning_rate=None, ) """ Loss and optimizer hyperparameters. """ fit_hyperparameter_defaults = HyperparameterDefaults( max_epochs=500, validation_split=0.1, early_stopping=True, minibatch_size=512, data_dependent_initialization_method=None, data_dependent_initialization_target="post_activation", random_negative_affinity_min=20000.0, random_negative_affinity_max=50000.0, random_negative_output_indices=None, # Number of consecutive epochs backed by one generated pool of # random-negative peptides. 1 (default) samples fresh negatives every # epoch. Values >1 amortize peptide generation/encoding by drawing # distinct per-epoch slices from a larger pool, with a new pool at each # ``epoch // random_negative_pool_epochs`` boundary. Larger values save # more CPU work; smaller values preserve more sampling diversity. random_negative_pool_epochs=1, # Streaming pretraining can use DataLoader workers to prefetch encoded # batches. Standard affinity fit() is device-resident and ignores this # knob. Kept in the schema so old configs that set it don't error. dataloader_num_workers=0, # Random-negative pool backing for fit(). None uses the optimized # device-resident pool; "host" preserves the legacy # planner.get_peptides() path for compatibility/debugging. fit_tensor_residency=None, # Batch size used for the validation forward pass. ``None`` uses a # device-aware heuristic: ``max(4 * minibatch_size, 4096)`` on CUDA # and ``4 * minibatch_size`` elsewhere. Separate from minibatch_size # because eval has no backward / optimizer state so VRAM headroom is # much higher; the larger CUDA default cuts validation-loop overhead # substantially on the small pan-allele networks. validation_batch_size=None, ).extend(RandomNegativePeptides.hyperparameter_defaults) """ Hyperparameters for neural network training. """ early_stopping_hyperparameter_defaults = HyperparameterDefaults( patience=20, min_delta=0.0, # False preserves historical Keras EarlyStopping behavior. Set True # to retain the state from the minimum measured validation loss. restore_best_weights=False, # Run the validation pass every N epochs in fit() / streaming pretrain. # Default 1 preserves pre-existing behavior (validate every epoch). # Setting to >1 trades resolution-of-early-stop-decision for # epoch-level throughput; the fit() loop forces a final validation # pass before reporting min_val_loss / breaking on patience so the # saved model still reflects an up-to-date val_loss measurement. validation_interval=1, ) """ Hyperparameters for early stopping. """ miscelaneous_hyperparameter_defaults = HyperparameterDefaults( train_data={}, ) """ Miscelaneous hyperaparameters. These parameters are not used by this class but may be interpreted by other code. """ hyperparameter_defaults = ( network_hyperparameter_defaults.extend(compile_hyperparameter_defaults) .extend(fit_hyperparameter_defaults) .extend(early_stopping_hyperparameter_defaults) .extend(miscelaneous_hyperparameter_defaults) ) """ Combined set of all supported hyperparameters and their default values. """ # Hyperparameter renames. Map old_name → new_name (string to rename) # or old_name → None (to silently drop). Loading an old config with # any of these keys triggers the mapping in ``__init__`` before # ``HyperparameterDefaults.check_valid_keys`` runs — so old keys # don't cause a ValueError. # # Note: ``min_delta`` used to be in this table mapping to None, # because when it was added (pre-PyTorch) it was flagged "currently # unused". It has since been re-introduced as a live early-stopping # hyperparameter, so dropping it silently would have caused old # configs with explicit non-default ``min_delta`` to lose that # value. Fixed by removing from this table — now it passes through # to the valid-keys check and gets preserved. hyperparameter_renames = { "use_embedding": None, "pseudosequence_use_embedding": None, "monitor": None, "verbose": None, "mode": None, "take_best_epoch": None, "kmer_size": None, "peptide_amino_acid_encoding": None, "embedding_input_dim": None, "embedding_output_dim": None, "embedding_init_method": None, "peptide_amino_acid_encoding_gpu": "peptide_amino_acid_encoding_torch", "left_edge": None, "right_edge": None, # 2.3.0 cleanup: the per-fit DataLoader backing layer is gone. # Old configs may still set this knob; silently drop it. "fit_dataloader_backing": None, } @classmethod def apply_hyperparameter_renames(cls, hyperparameters): """ Handle hyperparameter renames. Parameters ---------- hyperparameters : dict Returns ------- dict : updated hyperparameters """ for from_name, to_name in cls.hyperparameter_renames.items(): if from_name in hyperparameters: value = hyperparameters.pop(from_name) if to_name: if (to_name in hyperparameters and hyperparameters[to_name] != value): raise ValueError( "Conflicting values for renamed hyperparameter " "%s=%r and %s=%r" % (from_name, value, to_name, hyperparameters[to_name]) ) hyperparameters[to_name] = value return hyperparameters def __init__(self, **hyperparameters): self.hyperparameters = self.hyperparameter_defaults.with_defaults( self.apply_hyperparameter_renames(hyperparameters) ) self._network = None self.network_json = None self.network_weights = None self.network_weights_loader = None self.network_weight_paths = () self.checkpoint_weights = {} self.checkpoint_weights_loaders = {} self.checkpoint_weight_paths = {} self.fit_info = [] self.prediction_cache = weakref.WeakKeyDictionary() MODELS_CACHE = {} """ Process-wide model cache, a map from: architecture JSON string to (PyTorch model, existing network weights) """ @classmethod def clear_model_cache(klass): """ Clear the model cache. """ klass.MODELS_CACHE.clear() @classmethod def borrow_cached_network(klass, network_json, network_weights): """ Return a PyTorch model with the specified architecture and weights. As an optimization, when possible this will reuse architectures from a process-wide cache. Parameters ---------- network_json : string of JSON network_weights : list of numpy.array Returns ------- Class1NeuralNetworkModel """ assert network_weights is not None config = json.loads(network_json) # Detect if weights are from Keras or PyTorch format # Keras JSON has 'class_name': 'Model' or 'Functional'; PyTorch has 'hyperparameters' is_keras_format = config.get('class_name') in ('Model', 'Functional') key = ( klass.model_cache_key(network_json), klass._infer_allele_representation_dim_from_weights( network_weights, config.get("hyperparameters", {}), network_config=config, ), ) if key not in klass.MODELS_CACHE: # Cache miss - create new model network = klass._create_model_from_config( config, network_weights=network_weights, ) existing_weights = None else: # Cache hit (network, existing_weights) = klass.MODELS_CACHE[key] if existing_weights is not network_weights: network.set_weights_list(network_weights, auto_convert_keras=is_keras_format) klass.MODELS_CACHE[key] = (network, network_weights) return network @classmethod def _parse_keras_json_config(cls, config): """ Parse a legacy Keras model JSON config to extract hyperparameters. Parameters ---------- config : dict Keras model JSON config with 'class_name', 'config', etc. Returns ------- tuple of (dict, dict) First dict: Hyperparameters dict compatible with Class1NeuralNetwork Second dict: Metadata about Keras model structure (e.g., embedding info) """ layers = config.get('config', {}).get('layers', []) hyperparameters = { 'locally_connected_layers': [], 'layer_sizes': [], 'activation': 'tanh', 'output_activation': 'sigmoid', 'dropout_probability': 0.0, 'batch_normalization': False, 'dense_layer_l1_regularization': 0.001, 'dense_layer_l2_regularization': 0.0, 'peptide_allele_merge_method': 'multiply', # Default } # Metadata about Keras structure keras_metadata = { 'has_embedding': False, 'embedding_input_dim': 0, 'embedding_output_dim': 0, 'skip_embedding_weights': False, } dense_layers = [] peptide_dense_sizes = [] allele_dense_sizes = [] concatenate_count = 0 for layer in layers: layer_class = layer.get('class_name', '') layer_config = layer.get('config', {}) if layer_class == 'LocallyConnected1D': lc_config = { 'filters': layer_config.get('filters', 8), 'kernel_size': layer_config.get('kernel_size', [3])[0] if isinstance( layer_config.get('kernel_size', [3]), list ) else layer_config.get('kernel_size', 3), 'activation': layer_config.get('activation', 'tanh'), } hyperparameters['locally_connected_layers'].append(lc_config) hyperparameters['activation'] = lc_config['activation'] elif layer_class == 'Dense': units = layer_config.get('units', 32) activation = layer_config.get('activation', 'tanh') layer_name = layer_config.get('name', '') if layer_name.startswith('peptide_dense_'): peptide_dense_sizes.append(units) elif layer_name.startswith('allele_dense_'): allele_dense_sizes.append(units) else: dense_layers.append({'units': units, 'activation': activation}) # Extract regularization from first dense layer kernel_reg = layer_config.get('kernel_regularizer') if kernel_reg and isinstance(kernel_reg, dict): reg_config = kernel_reg.get('config', {}) if 'l1' in reg_config: hyperparameters['dense_layer_l1_regularization'] = reg_config['l1'] if 'l2' in reg_config: hyperparameters['dense_layer_l2_regularization'] = reg_config['l2'] elif layer_class == 'Dropout': rate = layer_config.get('rate', 0.0) hyperparameters['dropout_probability'] = 1.0 - rate elif layer_class == 'BatchNormalization': hyperparameters['batch_normalization'] = True elif layer_class == 'LayerNormalization': hyperparameters['normalization'] = 'layer' elif layer_class == 'Embedding': keras_metadata['has_embedding'] = True keras_metadata['embedding_input_dim'] = layer_config.get('input_dim', 0) keras_metadata['embedding_output_dim'] = layer_config.get('output_dim', 0) # If input_dim is 0, it's a placeholder and weights should be skipped if layer_config.get('input_dim', 0) == 0: keras_metadata['skip_embedding_weights'] = True elif layer_class == 'Concatenate': concatenate_count += 1 # Only set merge_method to concatenate if there's just one Concatenate # and it's likely for peptide-allele merging (not DenseNet skip connections) if concatenate_count == 1: hyperparameters['peptide_allele_merge_method'] = 'concatenate' elif layer_class == 'Multiply': hyperparameters['peptide_allele_merge_method'] = 'multiply' # Multiple Concatenate layers indicate DenseNet topology with skip connections # Note: The first Concatenate is typically for peptide-allele merging, # subsequent ones are for DenseNet skip connections if concatenate_count > 1: hyperparameters['topology'] = 'with-skip-connections' # Keep the merge method as detected (concatenate from first Concatenate layer) # The last Dense layer is the output layer if dense_layers: hyperparameters['output_activation'] = dense_layers[-1]['activation'] hyperparameters['num_outputs'] = dense_layers[-1]['units'] # All other Dense layers contribute to layer_sizes hyperparameters['layer_sizes'] = [d['units'] for d in dense_layers[:-1]] if dense_layers[:-1]: hyperparameters['activation'] = dense_layers[0]['activation'] if peptide_dense_sizes: hyperparameters['peptide_dense_layer_sizes'] = peptide_dense_sizes if allele_dense_sizes: hyperparameters['allele_dense_layer_sizes'] = allele_dense_sizes return hyperparameters, keras_metadata @classmethod def _infer_allele_representation_dim_from_weights( cls, network_weights, hyperparameters, network_config=None): """Infer flattened allele representation width from serialized weights. Strategy: 1. Compute the position of the first allele-stage weight from the architecture config. In ``named_parameters()`` order the layout is:: locally_connected → peptide_dense → batch_norm_early? → allele_dense → allele_embedding → dense_layers → output so ``weights[peptide_offset]`` is the first allele_dense weight (when allele_dense layers exist) or the allele_embedding weight (otherwise). Either way its ``shape[1]`` equals the flattened allele representation width. 2. Cross-check using a structural invariant: when allele_dense layers exist, both the allele_dense first-layer weight and the allele_embedding weight have ``shape[1]`` equal to ``allele_rep_width``. That value appears at two distinct positions in the weight list. Peptide-stage Linear weights chain through different shape[1] values, so no peptide weight will produce a duplicate match. 3. Return ``None`` if neither check is conclusive. The caller falls back to ``default_sequence_length`` (39). """ if not network_weights or not hyperparameters.get('allele_amino_acid_encoding'): return None from .amino_acid import get_vector_encoding_df try: encoding_dim = len(get_vector_encoding_df( hyperparameters['allele_amino_acid_encoding']).columns) except KeyError: return None if network_config and network_config.get("merged_networks"): architecture = network_config["merged_networks"][0] elif network_config: architecture = network_config.get("hyperparameters", network_config) else: architecture = hyperparameters def valid_dim(dim): if dim % encoding_dim != 0: return False sequence_length = dim // encoding_dim return 20 <= sequence_length <= 60 def candidate_dim(weight): if isinstance(weight, numpy.ndarray) and len(weight.shape) == 2: dim = weight.shape[1] if valid_dim(dim): return dim return None allele_dense_sizes = architecture.get( 'allele_dense_layer_sizes', hyperparameters.get('allele_dense_layer_sizes', []), ) peptide_offset = 0 peptide_offset += 2 * len(architecture.get( 'locally_connected_layers', hyperparameters.get('locally_connected_layers', []), )) peptide_offset += 2 * len(architecture.get( 'peptide_dense_layer_sizes', hyperparameters.get('peptide_dense_layer_sizes', []), )) if architecture.get( 'batch_normalization', hyperparameters.get('batch_normalization', False)) or ( architecture.get( 'normalization', hyperparameters.get('normalization', 'none'), ) == 'layer'): peptide_offset += 2 n = len(network_weights) # Position-based primary lookup. primary_dim = ( candidate_dim(network_weights[peptide_offset]) if peptide_offset < n else None) # Cross-check: when allele_dense layers exist, the same shape[1] # must appear at the embedding position (peptide_offset + # 2*n_allele_dense_layers). If they disagree, the offset is # wrong and we fall back to a duplicate-shape scan. if primary_dim is not None and allele_dense_sizes: embedding_idx = ( peptide_offset + 2 * len(allele_dense_sizes)) if embedding_idx < n: embedding_dim = candidate_dim(network_weights[embedding_idx]) if embedding_dim == primary_dim: return primary_dim # Disagreement: don't trust either value here, scan below. else: # Can't confirm via embedding slot; trust the primary. return primary_dim elif primary_dim is not None: # No allele_dense — only one matching slot exists. return primary_dim # Fallback: duplicate-shape[1] scan. Only the allele block # (allele_dense weight + allele_embedding weight) produces two # 2D weights with the same shape[1] in this architecture. if allele_dense_sizes: seen = {} for i in range(n): dim = candidate_dim(network_weights[i]) if dim is None: continue if dim in seen: logging.warning( "Allele width inferred via duplicate-shape fallback " "(positions %d and %d -> width %d). Position-based " "lookup failed: the saved layer count may not match " "the architecture used to write these weights.", seen[dim], i, dim, ) return dim seen[dim] = i return None @classmethod def _placeholder_allele_representations( cls, hyperparameters, network_weights=None, network_config=None, default_sequence_length=39): """Create a shape-compatible placeholder for pan-allele models. Public artifacts have used several pseudosequence widths over time (including 2.1.x-era weights). Prefer the width encoded in the saved weights; fall back to the current 39-residue sequence only when no weights are available to guide reconstruction. """ if not hyperparameters.get('allele_amino_acid_encoding'): return None from .amino_acid import get_vector_encoding_df encoding_name = hyperparameters['allele_amino_acid_encoding'] try: encoding_df = get_vector_encoding_df(encoding_name) except KeyError: return None embedding_dim = cls._infer_allele_representation_dim_from_weights( network_weights, hyperparameters, network_config=network_config, ) if embedding_dim is None: embedding_dim = default_sequence_length * len(encoding_df.columns) return numpy.zeros((1, embedding_dim), dtype=numpy.float32) @classmethod def _create_model_from_config( cls, config, instance_hyperparameters=None, network_weights=None): """Create a model from a configuration dictionary. Parameters ---------- config : dict Configuration dictionary (either Keras JSON or hyperparameters dict) instance_hyperparameters : dict, optional Hyperparameters from the Class1NeuralNetwork instance. These take precedence for things like peptide_encoding. network_weights : list of numpy.ndarray, optional Saved weights used to infer the placeholder allele representation. """ keras_metadata = None # Check if this is a merged network config if config.get('merged_networks'): return cls._create_merged_model_from_config( config, instance_hyperparameters, network_weights=network_weights, ) # Check if this is a legacy Keras JSON config if config.get('class_name') in ('Model', 'Functional'): hyperparameters, keras_metadata = cls._parse_keras_json_config(config) else: # Extract hyperparameters from config (new format) hyperparameters = config.get('hyperparameters', config) # Merge with instance hyperparameters if provided # Instance hyperparameters take precedence for things like peptide_encoding if instance_hyperparameters: # Copy to avoid modifying original merged = dict(instance_hyperparameters) # Update with parsed hyperparameters (architecture-specific settings) for key in ['layer_sizes', 'locally_connected_layers', 'dropout_probability', 'batch_normalization', 'normalization', 'activation', 'output_activation', 'peptide_allele_merge_method']: if key in hyperparameters: merged[key] = hyperparameters[key] hyperparameters = merged hyperparameters = cls.hyperparameter_defaults.with_defaults( cls.apply_hyperparameter_renames(dict(hyperparameters)) ) # Create a temporary instance to get encoding shape temp = cls(**hyperparameters) peptide_encoding_shape = temp.peptides_to_network_input([]).shape[1:] peptide_torch_encoding_name = _peptide_torch_encoding_name(hyperparameters) # Device-side fixed encoding: peptides_to_network_input returns # (N, L) int indices, but dense layers are still sized against # the post-embedding (L, V) shape. if peptide_torch_encoding_name and len(peptide_encoding_shape) == 1: peptide_encoding_shape = _peptide_torch_encoding_shape( peptide_encoding_shape, peptide_torch_encoding_name, ) # Get allele representations if present allele_representations = config.get('allele_representations') if allele_representations is not None: allele_representations = numpy.array(allele_representations) # For pan-allele Keras models with placeholder embedding (input_dim=0), # create a placeholder allele representation to ensure correct architecture if (allele_representations is None and keras_metadata is not None and keras_metadata.get('has_embedding', False) and keras_metadata.get('embedding_output_dim', 0) > 0): # Create placeholder with 1 allele and correct embedding dim # This will be replaced by set_allele_representations later embedding_dim = keras_metadata['embedding_output_dim'] allele_representations = numpy.zeros((1, embedding_dim), dtype=numpy.float32) # For PyTorch-format configs without allele_representations but with # allele_amino_acid_encoding (pan-allele models), create placeholder # Check has_allele flag to distinguish pan-allele from allele-specific models has_allele = config.get('has_allele', True) # Default True for backward compat if (allele_representations is None and keras_metadata is None and has_allele and hyperparameters.get('allele_amino_acid_encoding')): allele_representations = cls._placeholder_allele_representations( hyperparameters, network_weights=network_weights, network_config=config, ) model = Class1NeuralNetworkModel( peptide_encoding_shape=peptide_encoding_shape, allele_representations=allele_representations, locally_connected_layers=hyperparameters.get('locally_connected_layers', []), peptide_dense_layer_sizes=hyperparameters.get('peptide_dense_layer_sizes', []), allele_dense_layer_sizes=hyperparameters.get('allele_dense_layer_sizes', []), layer_sizes=hyperparameters.get('layer_sizes', [32]), peptide_allele_merge_method=hyperparameters.get('peptide_allele_merge_method', 'multiply'), peptide_allele_merge_activation=hyperparameters.get('peptide_allele_merge_activation', ''), activation=hyperparameters.get('activation', 'tanh'), output_activation=hyperparameters.get('output_activation', 'sigmoid'), dropout_probability=hyperparameters.get('dropout_probability', 0.0), batch_normalization=hyperparameters.get('batch_normalization', False), normalization=hyperparameters.get('normalization', 'none'), dense_layer_l1_regularization=hyperparameters.get('dense_layer_l1_regularization', 0.001), dense_layer_l2_regularization=hyperparameters.get('dense_layer_l2_regularization', 0.0), topology=hyperparameters.get('topology', 'feedforward'), num_outputs=hyperparameters.get('num_outputs', 1), init=hyperparameters.get('init', 'glorot_uniform'), peptide_input_vector_encoding_name=peptide_torch_encoding_name, ) # Store keras metadata and config for weight loading if keras_metadata is not None: model._keras_metadata = keras_metadata model._keras_config = config return model @classmethod def _create_merged_model_from_config( cls, config, instance_hyperparameters=None, network_weights=None): """Create a merged model from a configuration dictionary. Parameters ---------- config : dict Configuration dictionary with 'merged_networks' key instance_hyperparameters : dict, optional Hyperparameters from the Class1NeuralNetwork instance. network_weights : list of numpy.ndarray, optional Saved weights used to infer the placeholder allele representation. """ merged_configs = config['merged_networks'] merge_method = config.get('merge_method', 'average') # Create a temporary instance to get encoding shape base_hyperparameters = config.get('hyperparameters', {}) if instance_hyperparameters: base_hyperparameters = dict(instance_hyperparameters) base_hyperparameters.update(config.get('hyperparameters', {})) base_hyperparameters = cls.hyperparameter_defaults.with_defaults( cls.apply_hyperparameter_renames(dict(base_hyperparameters)) ) temp = cls(**base_hyperparameters) peptide_encoding_shape = temp.peptides_to_network_input([]).shape[1:] peptide_torch_encoding_name = _peptide_torch_encoding_name( base_hyperparameters ) if peptide_torch_encoding_name and len(peptide_encoding_shape) == 1: peptide_encoding_shape = _peptide_torch_encoding_shape( peptide_encoding_shape, peptide_torch_encoding_name, ) # Create placeholder allele representations for pan-allele models allele_representations = cls._placeholder_allele_representations( base_hyperparameters, network_weights=network_weights, network_config=config, ) # Create sub-networks sub_networks = [] for sub_config in merged_configs: model = Class1NeuralNetworkModel( peptide_encoding_shape=peptide_encoding_shape, allele_representations=allele_representations, locally_connected_layers=sub_config.get('locally_connected_layers', []), peptide_dense_layer_sizes=sub_config.get('peptide_dense_layer_sizes', []), allele_dense_layer_sizes=sub_config.get('allele_dense_layer_sizes', []), layer_sizes=sub_config.get('layer_sizes', [32]), peptide_allele_merge_method=sub_config.get('peptide_allele_merge_method', 'multiply'), peptide_allele_merge_activation=sub_config.get('peptide_allele_merge_activation', ''), activation=sub_config.get('activation', 'tanh'), output_activation=sub_config.get('output_activation', 'sigmoid'), dropout_probability=sub_config.get('dropout_probability', 0.0), batch_normalization=sub_config.get('batch_normalization', False), normalization=sub_config.get('normalization', 'none'), dense_layer_l1_regularization=base_hyperparameters.get('dense_layer_l1_regularization', 0.001), dense_layer_l2_regularization=base_hyperparameters.get('dense_layer_l2_regularization', 0.0), topology=sub_config.get('topology', 'feedforward'), num_outputs=sub_config.get('num_outputs', 1), init=base_hyperparameters.get('init', 'glorot_uniform'), peptide_input_vector_encoding_name=peptide_torch_encoding_name, ) sub_networks.append(model) return MergedClass1NeuralNetwork(sub_networks, merge_method=merge_method) @staticmethod def model_cache_key(network_json): """ Given a JSON description of a neural network, return a cache key. Parameters ---------- network_json : string Returns ------- string """ # Remove regularization settings as they don't affect predictions def drop_properties(d): if isinstance(d, dict): d.pop('dense_layer_l1_regularization', None) d.pop('dense_layer_l2_regularization', None) return d description = json.loads(network_json, object_hook=drop_properties) return json.dumps(description) @staticmethod def keras_network_cache_key(network_json): """ Backward-compatible alias for ``model_cache_key``. """ return Class1NeuralNetwork.model_cache_key(network_json) def network(self, borrow=False): """ Return the PyTorch model associated with this predictor. Parameters ---------- borrow : bool Whether to return a cached model if possible Returns ------- Class1NeuralNetworkModel """ if self._network is None and self.network_json is not None: self.load_weights() if borrow: return self.borrow_cached_network( self.network_json, self.network_weights ) else: config = json.loads(self.network_json) # Detect if weights are from Keras or PyTorch format # Keras JSON has 'class_name': 'Model' or 'Functional'; PyTorch has 'hyperparameters' is_keras_format = config.get('class_name') in ('Model', 'Functional') # Pass this instance's hyperparameters to preserve peptide_encoding etc. self._network = self._create_model_from_config( config, instance_hyperparameters=self.hyperparameters, network_weights=self.network_weights) if self.network_weights is not None: self._network.set_weights_list( self.network_weights, auto_convert_keras=is_keras_format ) self.network_json = None self.network_weights = None return self._network def update_network_description(self): """ Update self.network_json and self.network_weights properties based on this instances's neural network. """ if self._network is not None: config = { 'hyperparameters': dict(self.hyperparameters), } # Check if this is a merged network if isinstance(self._network, MergedClass1NeuralNetwork): # Save sub-network configs for merged networks sub_configs = [] for subnet in self._network.networks: sub_config = {} # Get the architecture info from the network itself sub_config['layer_sizes'] = [ layer.out_features for layer in subnet.dense_layers ] sub_config['locally_connected_layers'] = [ {'filters': layer.out_channels, 'kernel_size': layer.kernel_size} for layer in subnet.lc_layers ] if hasattr(subnet, 'lc_layers') else [] sub_config['peptide_dense_layer_sizes'] = [ layer.out_features for layer in subnet.peptide_dense_layers ] if hasattr(subnet, 'peptide_dense_layers') else [] sub_config['allele_dense_layer_sizes'] = [ layer.out_features for layer in subnet.allele_dense_layers ] if hasattr(subnet, 'allele_dense_layers') else [] # MHCflurry hyperparameters use keep probability, not # PyTorch Dropout.p (drop probability). sub_config['dropout_probability'] = getattr( subnet, 'dropout_probability', 0.0, ) sub_config['batch_normalization'] = ( hasattr(subnet, 'batch_norms') and bool(subnet.batch_norms) and any(bn is not None for bn in subnet.batch_norms) ) sub_config['normalization'] = getattr( subnet, 'normalization', 'none') sub_config['activation'] = subnet.activation_name sub_config['output_activation'] = subnet.output_activation_name sub_config['peptide_allele_merge_method'] = subnet.peptide_allele_merge_method sub_config['peptide_allele_merge_activation'] = subnet.peptide_allele_merge_activation sub_config['topology'] = subnet.topology sub_config['num_outputs'] = subnet.output_layer.out_features sub_configs.append(sub_config) config['merged_networks'] = sub_configs config['merge_method'] = self._network.merge_method else: # Save whether the network has allele features config['has_allele'] = getattr(self._network, 'has_allele', False) # Save allele representations if present in the network if hasattr(self._network, 'allele_embedding') and self._network.allele_embedding is not None: allele_embed = self._network.allele_embedding.weight.detach().cpu().numpy() config['allele_representations'] = allele_embed.tolist() self.network_json = json.dumps(config) self.network_weights = self._network.get_weights_list() def get_config(self): """ serialize to a dict all attributes except model weights Returns ------- dict """ self.update_network_description() result = dict(self.__dict__) result["_network"] = None result["network_weights"] = None result["network_weights_loader"] = None result.pop("network_weight_paths", None) result["checkpoint_weights"] = {} result["checkpoint_weights_loaders"] = {} result.pop("checkpoint_weight_paths", None) result["prediction_cache"] = None return result @classmethod def from_config(cls, config, weights=None, weights_loader=None, weight_paths=None): """ deserialize from a dict returned by get_config(). Supports both: - Native Class1NeuralNetwork configs with 'hyperparameters' key - Legacy Keras model JSON configs with 'class_name', 'config', etc. Parameters ---------- config : dict weights : list of array, optional Network weights to restore weights_loader : callable, optional Function to call (no arguments) to load weights when needed weight_paths : string or list of strings, optional Filename(s) the weights were loaded from. This is diagnostic provenance only and is not serialized by get_config(). Returns ------- Class1NeuralNetwork """ config = dict(config) # Check if this is a legacy Keras JSON config if config.get('class_name') in ('Model', 'Functional'): hyperparameters, keras_metadata = cls._parse_keras_json_config(config) instance = cls(**hyperparameters) # Store metadata for weight loading instance._keras_metadata = keras_metadata # Store the original config as network_json for lazy network creation instance.network_json = json.dumps(config) else: # Standard Class1NeuralNetwork config format instance = cls(**config.pop("hyperparameters")) instance.__dict__.update(config) instance.network_weights = weights instance.network_weights_loader = weights_loader instance.network_weight_paths = ( cls._normalize_network_weight_paths(weight_paths) or cls._network_weight_paths_from_loader(weights_loader) ) # Checkpoint sidecars are attached by the predictor persistence layer. # They deliberately stay out of config_json because weight arrays do # not belong in JSON and older predictor directories have none. instance.checkpoint_weights = {} instance.checkpoint_weights_loaders = {} instance.checkpoint_weight_paths = {} instance.prediction_cache = weakref.WeakKeyDictionary() return instance @staticmethod def _normalize_network_weight_paths(weight_paths): """Return weight path(s) as a tuple of strings.""" if weight_paths is None: return () if isinstance(weight_paths, (str, os.PathLike)): return (os.fspath(weight_paths),) return tuple(os.fspath(path) for path in weight_paths if path) @classmethod def _network_weight_paths_from_loader(cls, weights_loader): """Infer weight path(s) from the standard lazy load_weights partial.""" if weights_loader is None: return () func = getattr(weights_loader, "func", None) args = getattr(weights_loader, "args", ()) if getattr(func, "__name__", None) == "load_weights" and args: return cls._normalize_network_weight_paths(args[0]) return () def load_weights(self): """ Load weights by evaluating self.network_weights_loader, if needed. """ if self.network_weights_loader: self.network_weights = self.network_weights_loader() self.network_weights_loader = None def get_weights(self): """ Get the network weights Returns ------- list of numpy.array giving weights for each layer or None if there is no network """ self.update_network_description() self.load_weights() return self.network_weights def get_weights_list(self): """ Get the network weights as a list of numpy arrays. Returns ------- list of numpy.array giving weights for each layer or None if there is no network """ return self.get_weights() def set_weights_list(self, weights, auto_convert_keras=True): """ Set the network weights from a list of numpy arrays. If a network exists, the weights are set directly on it. Otherwise, the weights are stored and will be applied when the network is created. Parameters ---------- weights : list of numpy.array Weights for each layer auto_convert_keras : bool If True, attempt to auto-detect and convert Keras weight formats to PyTorch format. Default True. """ if self._network is not None: # Network exists, set weights directly self._network.set_weights_list(weights, auto_convert_keras=auto_convert_keras) else: # Store weights for later application self.network_weights = weights @staticmethod def _copy_weights_list(weights): """Return owned numpy arrays, avoiding tensor/numpy view aliasing.""" return [numpy.array(value, copy=True) for value in weights] def available_checkpoint_policies(self): """Return retained checkpoint policies in stable order.""" available = set(getattr(self, "checkpoint_weights", {})) available.update(getattr(self, "checkpoint_weights_loaders", {})) return [policy for policy in CHECKPOINT_POLICIES if policy in available] def get_checkpoint_weights(self, policy): """Return retained weights for ``policy``, loading lazily if needed.""" if policy not in CHECKPOINT_POLICIES: raise ValueError("Unknown checkpoint policy: %s" % policy) checkpoint_weights = getattr(self, "checkpoint_weights", {}) if policy not in checkpoint_weights: loader = getattr( self, "checkpoint_weights_loaders", {}).get(policy) if loader is None: raise KeyError("Checkpoint policy not retained: %s" % policy) checkpoint_weights[policy] = loader() self.checkpoint_weights = checkpoint_weights return checkpoint_weights[policy] def set_checkpoint_weights_loader(self, policy, loader, weight_path=None): """Attach a lazy loader for a retained training checkpoint.""" if policy not in CHECKPOINT_POLICIES: raise ValueError("Unknown checkpoint policy: %s" % policy) if not hasattr(self, "checkpoint_weights"): self.checkpoint_weights = {} if not hasattr(self, "checkpoint_weights_loaders"): self.checkpoint_weights_loaders = {} if not hasattr(self, "checkpoint_weight_paths"): self.checkpoint_weight_paths = {} self.checkpoint_weights.pop(policy, None) self.checkpoint_weights_loaders[policy] = loader if weight_path is not None: self.checkpoint_weight_paths[policy] = os.fspath(weight_path) def _clear_training_checkpoints(self): """Discard checkpoint sidecars made stale by a new fit.""" self.checkpoint_weights = {} self.checkpoint_weights_loaders = {} self.checkpoint_weight_paths = {} def _finalize_training_checkpoints( self, eager_network, best_state_dict, save_all_checkpoints): """Select the primary state and optionally retain both fit states.""" restore_best = bool( self.hyperparameters["restore_best_weights"] and best_state_dict is not None ) terminal_weights = None if save_all_checkpoints: terminal_weights = self._copy_weights_list( eager_network.get_weights_list()) if best_state_dict is not None and (restore_best or save_all_checkpoints): eager_network.load_state_dict(best_state_dict) if save_all_checkpoints: retained = {"terminal": terminal_weights} if best_state_dict is not None: retained["best"] = self._copy_weights_list( eager_network.get_weights_list()) self.checkpoint_weights = retained self.checkpoint_weights_loaders = {} self.checkpoint_weight_paths = {} # Loading the best state above was only for capture when terminal # remains primary. Restore from an owned copy, never a numpy view # of the live module parameters. if not restore_best: eager_network.set_weights_list( terminal_weights, auto_convert_keras=False) return restore_best def __getstate__(self): """ serialize to a dict. Model weights are included. For pickle support. Returns ------- dict """ self.update_network_description() self.load_weights() for policy in self.available_checkpoint_policies(): self.get_checkpoint_weights(policy) result = dict(self.__dict__) result["_network"] = None result["checkpoint_weights_loaders"] = {} result["prediction_cache"] = None return result def __setstate__(self, state): """ Deserialize. For pickle support. """ self.__dict__.update(state) self.prediction_cache = weakref.WeakKeyDictionary() def uses_peptide_torch_encoding(self): """Whether fixed peptide vectors are looked up in torch forward.""" return _peptide_uses_torch_encoding(self.hyperparameters) def peptides_to_network_input(self, peptides, device=None): """ Encode peptides to the fixed-length encoding expected by the neural network (which depends on the architecture). Return (N, L) int8 amino-acid indices; the network looks up fixed vectors on device. NumericSequences inputs return a Torch tensor directly, while string inputs retain the existing NumPy path. Parameters ---------- peptides : EncodableSequences, NumericSequences or list of string device : torch.device or str, optional Device for NumericSequences alignment; string encoding stays on CPU. Returns ------- numpy.ndarray or torch.Tensor """ encoded = peptide_sequences_to_network_input( peptides, peptide_encoding=self.hyperparameters["peptide_encoding"], peptide_amino_acid_encoding_torch=( self.hyperparameters.get("peptide_amino_acid_encoding_torch") ), device=device, ) assert len(encoded) == len(peptides) return encoded @property def supported_peptide_lengths(self): """ (minimum, maximum) lengths of peptides supported, inclusive. Returns ------- (int, int) tuple """ try: self.peptides_to_network_input([""]) except EncodingError as e: return e.supported_peptide_lengths raise RuntimeError("peptides_to_network_input did not raise") def allele_encoding_to_network_input(self, allele_encoding): """ Encode alleles to the fixed-length encoding expected by the neural network (which depends on the architecture). Parameters ---------- allele_encoding : AlleleEncoding Returns ------- (numpy.array, numpy.array) Indices and allele representations. """ if allele_encoding is None: return (None, None) return ( allele_encoding.indices.values, allele_encoding.allele_representations( self.hyperparameters["allele_amino_acid_encoding"] ), ) @staticmethod def data_dependent_weights_initialization( network, x_dict=None, method="lsuv", target="post_activation", verbose=1, ): """ Data dependent weights initialization. Parameters ---------- network : Class1NeuralNetworkModel x_dict : dict of string -> numpy.ndarray Training data method : string Initialization method. Currently only "lsuv" is supported. target : {"post_activation", "pre_activation"} Affine-layer output whose variance LSUV normalizes. verbose : int Status updates printed to stdout if verbose > 0 """ if verbose: print("Performing data-dependent init: ", method) if method == "lsuv": assert x_dict is not None, "Data required for LSUV init" lsuv_init(network, x_dict, verbose=verbose > 0, target=target) else: raise RuntimeError("Unsupported init method: ", method) @staticmethod def _regularized_parameters(network): """ Parameters subject to dense kernel regularization. """ for name, param in network.named_parameters(): if not param.requires_grad or not name.endswith("weight"): continue if any(part in name for part in ( "peptide_dense_layers", "allele_dense_layers", "dense_layers")): yield param @staticmethod def _regularization_penalty(parameters, l1=0.0, l2=0.0): """ Match Keras kernel_regularizer semantics used on dense kernels. """ parameters = tuple(parameters) if not parameters or (not l1 and not l2): return None penalty = torch.zeros((), device=parameters[0].device) for param in parameters: if l1: penalty = penalty + (l1 * param.abs().sum()) if l2: penalty = penalty + (l2 * param.square().sum()) return penalty def get_device(self): """Get the PyTorch device to use.""" return get_pytorch_device() def fit_streaming_batches( self, generator, validation_peptide_encoding, validation_affinities, validation_allele_encoding=None, validation_inequalities=None, validation_output_indices=None, steps_per_epoch=10, epochs=1000, min_epochs=0, patience=10, min_delta=0.0, verbose=1, progress_callback=None, progress_preamble="", progress_print_interval=5.0, generator_factory=None, generator_batches_are_encoded=False, seed=None, save_all_checkpoints=False): """Pretrain from a stream of already batched examples. This is the streaming pretraining path used by pan-allele training. It intentionally has a narrower contract than :meth:`fit`: * training examples arrive as complete batches from ``generator``; * validation data is supplied explicitly rather than split from the training rows; * random negatives, sample weights, and the affinity ``fit()`` row layout are not part of this API. The method still shares the same low-level optimizer step, loss object, regularization, and batched validation helpers as :meth:`fit`. ``generator`` may yield either pre-encoded ``(x_dict, y)`` tuples (the path the shipped pan-allele pretrain pipeline uses) or legacy raw ``(allele_encoding, peptides, affinities)`` tuples. The legacy form is still tested for back-compat but is not exercised by any production pipeline. ``generator_factory`` enables DataLoader worker prefetch: each worker calls it with ``worker_id`` and ``num_workers`` to read a disjoint shard. ``seed`` (int, optional) seeds numpy's and torch's global RNGs up front, so weight initialization and any shuffling in this pretrain pass derive from it; None leaves the worker's entropy seeding in place. Mirrors :meth:`fit`'s ``seed`` so one value can drive both phases of a pan-allele fit. ``save_all_checkpoints`` retains both the terminal and minimum-validation weights. It does not change which state is primary; that remains controlled by the ``restore_best_weights`` hyperparameter. """ self._clear_training_checkpoints() device = self.get_device() configure_matmul_precision(device) # Single-seed control, mirroring fit(): seed up front so weight init # and shuffling in this pass are reproducible. See fit() for detail. if seed is not None: numpy.random.seed(int(seed) % (2 ** 32)) torch.manual_seed(int(seed) & ((1 << 63) - 1)) fit_info = collections.defaultdict(list) timing_enabled = _timing_enabled() fit_info["timing_enabled"] = timing_enabled loss_obj = get_pytorch_loss(self.hyperparameters["loss"]) ( validation_allele_input, allele_representations, ) = self.allele_encoding_to_network_input(validation_allele_encoding) if self.network() is None: self._network = self.make_network( allele_representations=allele_representations, **self.network_hyperparameter_defaults.subselect(self.hyperparameters) ) if verbose > 0: print(self.network()) network = self.network() network.to(device) self.set_allele_representations(allele_representations) # Setup optimizer optimizer = self._create_optimizer(network) if self.hyperparameters["learning_rate"] is not None: for param_group in optimizer.param_groups: param_group['lr'] = self.hyperparameters["learning_rate"] fit_info["learning_rate"] = optimizer.param_groups[0]['lr'] regularization_parameters = tuple(self._regularized_parameters(network)) l1_reg = self.hyperparameters["dense_layer_l1_regularization"] l2_reg = self.hyperparameters["dense_layer_l2_regularization"] # Prepare validation data validation_x_dict = { "peptide": self.peptides_to_network_input(validation_peptide_encoding), } if validation_allele_input is not None: validation_x_dict["allele"] = validation_allele_input encode_y_kwargs = {} if validation_inequalities is not None: # from_ic50 is decreasing: concentration bounds reverse direction. encode_y_kwargs["inequalities"] = ( pandas.Series(validation_inequalities) .map({"=": "=", ">": "<", "<": ">"}) .values ) if validation_output_indices is not None: encode_y_kwargs["output_indices"] = validation_output_indices output = loss_obj.encode_y(from_ic50(validation_affinities), **encode_y_kwargs) # Validation tensors are constant across streaming-pretrain epochs, but # original code re-ran ``torch.from_numpy(...).float().to(device)`` # on every epoch — three H2D copies × many epochs. For large # validation sets that's tens of ms/epoch of pure wasted bandwidth. # Hoist the copy to happen once before the epoch loop. # # 2D int -> index-encoded; keep dtype intact so the embedding lookup # inside forward() sees int indices. Vector-encoded inputs are numeric # feature tensors and should reach the network as fp32. _val_peptide_np = validation_x_dict["peptide"] if ( _val_peptide_np.ndim == 2 and numpy.issubdtype(_val_peptide_np.dtype, numpy.integer) ): val_peptide_device = torch_from_numpy(_val_peptide_np).to(device) else: val_peptide_device = torch_from_numpy( _val_peptide_np).to(device).float() val_allele_device = None if "allele" in validation_x_dict: val_allele_device = torch_from_numpy( validation_x_dict["allele"] ).to(device).float() val_y_device = torch_from_numpy( output.astype(numpy.float32)).to(device) # Streaming-pretrain batches stay as numpy arrays until the parent # training loop moves them to the device. That keeps worker-side # prefetch compatible across platforms and still overlaps CSV / # encoding work with GPU compute when a picklable encoded-batch # generator_factory is supplied (the pretrain path). mutable_generator_state = {"yielded_values": 0} dataloader_num_workers = self.hyperparameters.get( "dataloader_num_workers", 0 ) # The streaming-pretrain DataLoader intentionally transports numpy arrays # unchanged (``batch_size=None`` + ``_identity_collate``). Those arrays # are not pinned, and setting non_blocking=True for pageable # numpy-backed tensors lets CUDA retain source pages until later stream # synchronization. Keep H2D copies synchronous so each pretrain chunk's # CPU buffer can be released/reused immediately. non_blocking_h2d = False fit_info["dataloader_num_workers"] = dataloader_num_workers fit_info["validation_rows"] = len(validation_affinities) # Worker-prefetch requires both (a) a picklable ``generator_factory`` # so each spawned worker can build its own shard, and (b) # ``generator_batches_are_encoded=True`` so the dataset never # holds bound methods of this ``Class1NeuralNetwork``. Either # missing piece forces a single-process path. if dataloader_num_workers > 0 and ( generator_factory is None or not generator_batches_are_encoded ): logging.warning( "fit_streaming_batches requested dataloader_num_workers=%s but " "worker-prefetch needs generator_factory + " "generator_batches_are_encoded=True (got factory=%s, " "encoded=%s); downgrading to 0.", dataloader_num_workers, "present" if generator_factory is not None else "missing", generator_batches_are_encoded, ) dataloader_num_workers = 0 dataset = _StreamingBatchIterableDataset( generator=generator, generator_factory=generator_factory, source_batches_are_encoded=generator_batches_are_encoded, allele_encoding_to_input=self.allele_encoding_to_network_input, peptides_to_network_input=self.peptides_to_network_input, ) start = time.time() fit_info["iterator_setup_time"] = 0.0 fit_info["iterator_restarts"] = 0 def make_iterator(): iterator_setup_start = time.perf_counter() iterator_result = iter( _make_streaming_batch_dataloader( dataset=dataset, num_workers=dataloader_num_workers, ) ) fit_info["iterator_setup_time"] += ( time.perf_counter() - iterator_setup_start ) return iterator_result iterator = make_iterator() # Data dependent init data_dependent_init = self.hyperparameters[ "data_dependent_initialization_method" ] if data_dependent_init and not self.fit_info: first_chunk = next(iterator) init_chunk = _materialize_repeated_peptide_batch(first_chunk) first_inputs = {"peptide": init_chunk["peptide"]} if "allele" in init_chunk: first_inputs["allele"] = init_chunk["allele"] self.data_dependent_weights_initialization( network, first_inputs, method=data_dependent_init, target=self.hyperparameters[ "data_dependent_initialization_target" ], verbose=verbose, ) iterator = itertools.chain([first_chunk], iterator) # Compile AFTER LSUV init — LSUV registers + removes forward hooks # during its activation-norm measurement pass, and every hook-count # change invalidates dynamo's frame guard (``len(L['self'] # .dense_layers[0]._forward_hooks) != 1``). Compiling before LSUV # burns through the 8-entry cache_size_limit in seconds and falls # back to eager. Compiling after gives dynamo a single stable # hook state to specialize on. network = maybe_compile_network(network, device) eager_network = uncompiled_network(network) # Compile the loss alongside the network; see maybe_compile_loss # docstring. MSEWithInequalities eager-dispatches ~10 kernels # per step; fusing them matters more as batch size grows (less # compute to amortize launch overhead against). loss_obj = maybe_compile_loss(loss_obj, device) min_val_loss_iteration = None min_val_loss = None best_state_dict = None last_progress_print = 0 first_batch_time = None # The first batch establishes the compiled fast-path shape. # Non-conforming later batches (most commonly a short final # pretrain chunk) run eagerly to preserve exact semantics without # triggering a second compile. expected_chunk_shape = None validation_interval = _validation_interval_from_hyperparameters( self.hyperparameters) for epoch_index in range(int(epochs)): epoch_num = epoch_index + 1 epoch_start_time = time.time() epoch_wall_start = time.perf_counter() network.train() epoch_fetch_time = 0.0 epoch_h2d_time = 0.0 def prepared_streaming_batches(): nonlocal iterator nonlocal expected_chunk_shape nonlocal epoch_fetch_time nonlocal epoch_h2d_time for _step in range(steps_per_epoch): fetch_start = time.perf_counter() try: batch = next(iterator) except StopIteration: if generator_factory is None: break fit_info["iterator_restarts"] += 1 iterator = make_iterator() try: batch = next(iterator) except StopIteration: break epoch_fetch_time += time.perf_counter() - fetch_start if expected_chunk_shape is None: expected_chunk_shape = batch["peptide"].shape # Measure H2D separately from training compute. When timing # is disabled, _timing_start/stop are cheap wall-clock reads; # when enabled, they synchronize around the copy. h2d_start = _timing_start(device, timing_enabled) inputs, y_tensor, weights_batch = _move_fit_batch_to_device( batch, device, non_blocking=non_blocking_h2d, ) epoch_h2d_time += _timing_stop( h2d_start, device, timing_enabled ) mutable_generator_state["yielded_values"] += len(batch["y"]) yield { "network": ( network if batch["peptide"].shape == expected_chunk_shape else eager_network ), "inputs": inputs, "y_batch": y_tensor, "weights_batch": weights_batch, "row_count": len(batch["y"]), } train_epoch_result = _run_prepared_training_batches( prepared_streaming_batches(), optimizer=optimizer, loss_obj=loss_obj, regularization_parameters=regularization_parameters, l1_reg=l1_reg, l2_reg=l2_reg, timing_enabled=timing_enabled, device=device, ) if first_batch_time is None: first_batch_time = train_epoch_result["first_batch_time"] should_validate_this_epoch = _should_validate_epoch( validation_enabled=True, epoch_index=epoch_index, max_epochs=epochs, validation_interval=validation_interval, early_stopping=True, min_val_loss_epoch=min_val_loss_iteration, patience=patience, min_epochs=min_epochs, # Streaming pretrain stops inclusively (epoch >= threshold) to # match pre-2.3.0 weights — see _early_stop_reached. strict=False, ) validation_time = 0.0 val_batch_size = None val_loss = _carry_forward_validation_loss(fit_info) if should_validate_this_epoch: # Compute validation loss in fixed-size batches — reuse the # device tensors hoisted before the epoch loop (val data is # static). Single-shot forward pass over the entire pretrain # validation set (typically 50K+ rows) was dominating VRAM. # By default validation uses the eager network to avoid a # second torch.compile specialization for grad-disabled eval. network.eval() with torch.inference_mode(): validation_start = _timing_start(device, timing_enabled) if "effective_validation_batch_size" not in fit_info: fit_info["effective_validation_batch_size"] = ( effective_validation_batch_size( device, self.hyperparameters["validation_batch_size"], self.hyperparameters["minibatch_size"], model=eager_network, num_workers_per_gpu=env_workers_per_gpu(), total_rows=len(val_peptide_device), ) ) val_batch_size = fit_info[ "effective_validation_batch_size"] val_loss = _batched_validation_loss( network=validation_forward_network(network, eager_network), eager_network=eager_network, val_peptide=val_peptide_device, val_allele=val_allele_device, val_y=val_y_device, val_weights=None, loss_obj=loss_obj, batch_size=val_batch_size, ) regularization_penalty = self._regularization_penalty( regularization_parameters, l1=l1_reg, l2=l2_reg, ) if regularization_penalty is not None: val_loss = val_loss + regularization_penalty.item() validation_time = _timing_stop( validation_start, device, timing_enabled ) fit_info["val_loss"].append(val_loss) previous_min_val_loss_iteration = min_val_loss_iteration ( min_val_loss, min_val_loss_iteration, ) = _update_min_validation_loss( val_loss=val_loss, epoch_index=epoch_index, min_val_loss=min_val_loss, min_val_loss_epoch=min_val_loss_iteration, min_delta=min_delta, ) if ( ( self.hyperparameters["restore_best_weights"] or save_all_checkpoints ) and min_val_loss_iteration != previous_min_val_loss_iteration ): best_state_dict = copy_module_state_dict_to_cpu( eager_network) else: fit_info["val_loss"].append(val_loss) epoch_time = time.time() - epoch_start_time train_loss, epoch_loss_sync_time = _sync_mean_loss( train_epoch_result["losses"], device=device, timing_enabled=timing_enabled, ) fit_info["loss"].append(train_loss) if timing_enabled: fit_info["epoch_fetch_time"].append(epoch_fetch_time) fit_info["epoch_h2d_time"].append(epoch_h2d_time) fit_info["epoch_train_time"].append( train_epoch_result["train_time"]) fit_info["epoch_loss_sync_time"].append(epoch_loss_sync_time) fit_info["epoch_validation_time"].append(validation_time) fit_info["epoch_num_train_batches"].append( len(train_epoch_result["losses"])) fit_info["epoch_num_train_rows"].append( train_epoch_result["train_rows"]) fit_info["epoch_num_validation_batches"].append( int(numpy.ceil(len(validation_affinities) / val_batch_size)) if val_batch_size else 0 ) fit_info["epoch_total_time"].append( time.perf_counter() - epoch_wall_start ) progress_message = ( "epoch %3d/%3d [%0.2f sec.]: loss=%g val_loss=%g. Min val " "loss %g at epoch %s. Cum. points: %d." % ( epoch_num, epochs, epoch_time, train_loss, val_loss, min_val_loss if min_val_loss is not None else numpy.nan, ( min_val_loss_iteration + 1 if min_val_loss_iteration is not None else None ), mutable_generator_state["yielded_values"], ) ).strip() if progress_print_interval is not None and ( time.time() - last_progress_print > progress_print_interval ): print(progress_preamble, progress_message) last_progress_print = time.time() if progress_callback: progress_callback() if _early_stop_reached( epoch_index=epoch_index, min_val_loss_epoch=min_val_loss_iteration, patience=patience, min_epochs=min_epochs, early_stopping=True, # Inclusive stop (epoch >= threshold) reproduces the pre-2.3.0 # streaming condition `epoch >= min_val_loss_iteration + # patience`; the strict `>` default would train one extra epoch. strict=False, ): if progress_print_interval is not None: print(progress_preamble, "STOPPING", progress_message) break restored_best_weights = self._finalize_training_checkpoints( eager_network, best_state_dict, save_all_checkpoints, ) fit_info["best_epoch"] = ( min_val_loss_iteration + 1 if min_val_loss_iteration is not None else None) fit_info["best_val_loss"] = min_val_loss fit_info["restored_best_weights"] = restored_best_weights fit_info["saved_checkpoint_policies"] = ( self.available_checkpoint_policies() ) fit_info["time"] = time.time() - start fit_info["num_points"] = mutable_generator_state["yielded_values"] if first_batch_time is not None: fit_info["first_batch_time"] = first_batch_time self.fit_info.append(dict(fit_info)) def fit_generator( self, generator, validation_peptide_encoding, validation_affinities, validation_allele_encoding=None, validation_inequalities=None, validation_output_indices=None, steps_per_epoch=10, epochs=1000, min_epochs=0, patience=10, min_delta=0.0, verbose=1, progress_callback=None, progress_preamble="", progress_print_interval=5.0, generator_factory=None, generator_batches_are_encoded=False, save_all_checkpoints=False): """Backward-compatible alias for :meth:`fit_streaming_batches`. The name is historical from the old Keras API. New internal code should call ``fit_streaming_batches`` because this path is specifically the pan-allele pretraining stream, not a general replacement for :meth:`fit`. """ return self.fit_streaming_batches( generator=generator, validation_peptide_encoding=validation_peptide_encoding, validation_affinities=validation_affinities, validation_allele_encoding=validation_allele_encoding, validation_inequalities=validation_inequalities, validation_output_indices=validation_output_indices, steps_per_epoch=steps_per_epoch, epochs=epochs, min_epochs=min_epochs, patience=patience, min_delta=min_delta, verbose=verbose, progress_callback=progress_callback, progress_preamble=progress_preamble, progress_print_interval=progress_print_interval, generator_factory=generator_factory, generator_batches_are_encoded=generator_batches_are_encoded, save_all_checkpoints=save_all_checkpoints, ) def _random_negatives_pool_for_fit( self, *, random_negatives_planner, random_negative_pool_epochs, pool_seed, device, requested_fit_tensor_residency): """Construct a shape-compatible random-negative pool for fit().""" use_device_pool = ( requested_fit_tensor_residency != "host" and self.uses_peptide_torch_encoding() and supports_device_random_negative_encoding( self.hyperparameters["peptide_encoding"] ) ) if use_device_pool: return ( RandomNegativesPool( planner=random_negatives_planner, peptide_encoder=self.peptides_to_network_input, pool_epochs=random_negative_pool_epochs, seed=pool_seed, device=device, peptide_encoding=self.hyperparameters["peptide_encoding"], ), "device", ) return ( RandomNegativesPool( planner=random_negatives_planner, peptide_encoder=self.peptides_to_network_input, pool_epochs=random_negative_pool_epochs, seed=pool_seed, ), "host", ) def _create_optimizer(self, network): """Create the configured optimizer using Keras or PyTorch equations.""" optimizer_name = self.hyperparameters["optimizer"].lower() implementation = self.hyperparameters["optimizer_implementation"].lower() if implementation not in ("keras", "pytorch"): raise ValueError( "optimizer_implementation must be 'keras' or 'pytorch'; got %r" % implementation ) configured_lr = self.hyperparameters["learning_rate"] if optimizer_name == "rmsprop": lr = 0.001 if configured_lr is None else configured_lr if implementation == "keras": return KerasRMSprop( network.parameters(), lr=lr, rho=0.9, epsilon=1e-7, ) return torch.optim.RMSprop( network.parameters(), lr=lr, alpha=0.9, eps=1e-7, weight_decay=0.0, momentum=0.0, centered=False, ) elif optimizer_name == "adam": lr = 0.001 if configured_lr is None else configured_lr if implementation == "keras": return KerasAdam( network.parameters(), lr=lr, beta_1=0.9, beta_2=0.999, epsilon=1e-7, ) return torch.optim.Adam( network.parameters(), lr=lr, betas=(0.9, 0.999), eps=1e-7, weight_decay=0.0, amsgrad=False, ) elif optimizer_name == "sgd": return torch.optim.SGD( network.parameters(), lr=0.01 if configured_lr is None else configured_lr, momentum=0.0, weight_decay=0.0, nesterov=False, ) raise ValueError("Unsupported optimizer: %s" % optimizer_name) def fit( self, peptides, affinities, allele_encoding=None, inequalities=None, output_indices=None, sample_weights=None, shuffle_permutation=None, verbose=1, progress_callback=None, progress_preamble="", progress_print_interval=5.0, seed=None, save_all_checkpoints=False): """ Fit the neural network. Parameters ---------- peptides : EncodableSequences or list of string affinities : list of float nM affinities. Must have the same length as peptides. allele_encoding : AlleleEncoding If not specified, the model will be a single-allele predictor. inequalities : list of string, each element one of ">", "<", or "=". output_indices : list of int For multi-output models only. sample_weights : list of float shuffle_permutation : list of int verbose : int progress_callback : function progress_preamble : string progress_print_interval : float seed : int, optional Master seed for this fit. When given, it seeds numpy's and torch's global RNGs at the start of the call, so every stochastic step downstream flows from this one value: data-dependent weight initialization, the initial example shuffle, the per-epoch training-batch shuffle, and random-negative sampling. When None (the default) the RNGs are left unchanged. The caller or worker initializer is responsible for setting independent RNG states. A seed does not guarantee identical weights across hardware, dependency versions or numerical settings. Automatic minibatch reduction can also change a trajectory; release workflows reject that reduction. Preserve the effective batch, source, dependencies, device and precision settings alongside the seed. See PyTorch's reproducibility notes for backend-specific determinism controls. save_all_checkpoints : bool Retain both terminal and minimum-validation weights from this fit. This does not change the primary state selected by the ``restore_best_weights`` hyperparameter. """ self._clear_training_checkpoints() device = self.get_device() configure_matmul_precision(device) # One seed controls every stochastic step in this fit. Seed numpy's # and torch's global RNGs up front so weight init, the example # shuffle, the per-epoch batch shuffle, and random-negative # sampling all derive from it. Left untouched when seed is None # (entropy-seeded by the worker), keeping training stochastic. if seed is not None: numpy.random.seed(int(seed) % (2 ** 32)) torch.manual_seed(int(seed) & ((1 << 63) - 1)) encodable_peptides = EncodableSequences.create(peptides) peptide_encoding = self.peptides_to_network_input(encodable_peptides) fit_info = collections.defaultdict(list) timing_enabled = _timing_enabled() fit_info["timing_enabled"] = timing_enabled fit_info["dataloader_num_workers"] = self.hyperparameters.get( "dataloader_num_workers", 0 ) random_negatives_planner = RandomNegativePeptides( **RandomNegativePeptides.hyperparameter_defaults.subselect( self.hyperparameters ) ) random_negatives_planner.plan( peptides=encodable_peptides.sequences, affinities=affinities, alleles=allele_encoding.alleles if allele_encoding else None, inequalities=inequalities, ) random_negatives_allele_encoding = None if allele_encoding is not None: random_negatives_allele_encoding = AlleleEncoding( random_negatives_planner.get_alleles(), borrow_from=allele_encoding ) num_random_negatives = random_negatives_planner.get_total_count() # Pre-generate random-negative peptides + encodings once per pool cycle # rather than once per epoch. At pool_epochs=1 the pool regenerates # every epoch, matching the default "fresh negatives each epoch" # semantics. random_negative_pool_epochs = int( self.hyperparameters.get("random_negative_pool_epochs", 1) or 1 ) if random_negative_pool_epochs < 1: random_negative_pool_epochs = 1 # When negatives are pooled across cycles the pool needs an explicit # seed (it pre-generates once and slices), so feed it the master # seed. At pool_epochs == 1 the pool regenerates every epoch from # numpy's global RNG, which the master seed above already pins — so # leave pool_seed None and let the global stream drive it. pool_seed = ( seed if random_negative_pool_epochs > 1 else None ) requested_fit_tensor_residency = self.hyperparameters.get( "fit_tensor_residency" ) # Random negatives stay worker-local. For torch-index peptide # inputs, the pool samples and aligns int8 AA indices directly on # the active torch device. Host-vector models use the same encoder # as their real peptides so the training input shape remains identical. ( random_negatives_pool, random_negative_pool_residency, ) = self._random_negatives_pool_for_fit( random_negatives_planner=random_negatives_planner, random_negative_pool_epochs=random_negative_pool_epochs, pool_seed=pool_seed, device=device, requested_fit_tensor_residency=requested_fit_tensor_residency, ) fit_info["random_negative_pool_residency"] = ( random_negative_pool_residency ) fit_info["random_negative_pool_epochs"] = random_negative_pool_epochs # Allele encoding for random negatives is planned once (the allele # list is a deterministic function of the planner's plan_df). Hoist # it out of the epoch loop; it is a deterministic function of the plan. random_negative_x_allele_base = None if ( num_random_negatives > 0 and random_negatives_allele_encoding is not None ): ( random_negative_x_allele_base, _, ) = self.allele_encoding_to_network_input( random_negatives_allele_encoding ) y_values = from_ic50(numpy.asarray(affinities)) assert numpy.isnan(y_values).sum() == 0, y_values if inequalities is not None: adjusted_inequalities = ( pandas.Series(inequalities) .map({ "=": "=", ">": "<", "<": ">", }) .values ) else: adjusted_inequalities = numpy.tile("=", len(y_values)) if len(adjusted_inequalities) != len(y_values): raise ValueError("Inequalities and y_values must have same length") x_dict_without_random_negatives = { "peptide": peptide_encoding, } allele_representations = None if allele_encoding is not None: ( allele_encoding_input, allele_representations, ) = self.allele_encoding_to_network_input(allele_encoding) x_dict_without_random_negatives["allele"] = allele_encoding_input # Shuffle if shuffle_permutation is None: shuffle_permutation = numpy.random.permutation(len(y_values)) y_values = y_values[shuffle_permutation] adjusted_inequalities = adjusted_inequalities[shuffle_permutation] for key in x_dict_without_random_negatives: x_dict_without_random_negatives[key] = x_dict_without_random_negatives[key][ shuffle_permutation ] if sample_weights is not None: sample_weights = numpy.array(sample_weights, copy=False)[shuffle_permutation] if output_indices is not None: output_indices = numpy.array(output_indices, copy=False)[shuffle_permutation] loss_obj = get_pytorch_loss(self.hyperparameters["loss"]) if not loss_obj.supports_inequalities and ( any(inequality != "=" for inequality in adjusted_inequalities) ): raise ValueError("Loss %s does not support inequalities" % loss_obj) if ( not loss_obj.supports_multiple_outputs and output_indices is not None and (output_indices != 0).any() ): raise ValueError("Loss %s does not support multiple outputs" % loss_obj) if self.hyperparameters["num_outputs"] != 1: if output_indices is None: raise ValueError("Must supply output_indices for multi-output predictor") if self.network() is None: self._network = self.make_network( allele_representations=allele_representations, **self.network_hyperparameter_defaults.subselect(self.hyperparameters) ) if verbose > 0: print(self.network()) network = self.network() network.to(device) if allele_representations is not None: self.set_allele_representations(allele_representations) # Keep an eager handle even when max_epochs == 0. Ordinarily this is # refreshed after optional LSUV initialization and torch.compile in # the epoch loop, but checkpoint finalization also runs for zero-epoch # fits (used by command smoke tests and model initialization flows). eager_network = uncompiled_network(network) # Guard against silent training-time OOMs. When many workers # share one GPU (pan-allele default max_workers_per_gpu=2 on # A100-80GB), the naive minibatch_size from the hyperparameters # YAML may not fit per-worker. Shrink loudly for the duration # of this fit() call only — DO NOT mutate self.hyperparameters, # so the saved model config preserves the user's original # intent. fit_info carries the actual value used at run time. _requested_minibatch = int(self.hyperparameters["minibatch_size"]) _effective_minibatch, _shrunk = check_training_batch_fits( _requested_minibatch, device, network, num_workers_per_gpu=env_workers_per_gpu(1), ) if _shrunk: fit_info["minibatch_size_shrunk_from"] = _requested_minibatch fit_info["minibatch_size_shrunk_to"] = _effective_minibatch if seed is not None: logging.warning( "fit(seed=%s) shrank minibatch_size %d -> %d to fit " "available VRAM. Reproducibility holds only at a fixed " "effective minibatch size, so this run may not reproduce " "bit-for-bit on a GPU with different free memory or a " "different number of workers per card.", seed, _requested_minibatch, _effective_minibatch) fit_info["effective_minibatch_size"] = _effective_minibatch optimizer = self._create_optimizer(network) if self.hyperparameters["learning_rate"] is not None: for param_group in optimizer.param_groups: param_group['lr'] = self.hyperparameters["learning_rate"] fit_info["learning_rate"] = optimizer.param_groups[0]['lr'] # Prepare y values with random negatives if loss_obj.supports_inequalities: random_negative_ic50 = self.hyperparameters["random_negative_affinity_min"] random_negative_target = from_ic50(random_negative_ic50) y_with_negatives = numpy.concatenate([ numpy.tile(random_negative_target, num_random_negatives), y_values, ]) adjusted_inequalities_with_random_negatives = ( ["<"] * num_random_negatives + list(adjusted_inequalities) ) else: y_with_negatives = numpy.concatenate([ from_ic50( numpy.random.uniform( self.hyperparameters["random_negative_affinity_min"], self.hyperparameters["random_negative_affinity_max"], num_random_negatives, ) ), y_values, ]) adjusted_inequalities_with_random_negatives = None if sample_weights is not None: sample_weights_with_negatives = numpy.concatenate([ numpy.ones(num_random_negatives), sample_weights ]) else: sample_weights_with_negatives = None if output_indices is not None: random_negative_output_indices = ( self.hyperparameters["random_negative_output_indices"] if self.hyperparameters["random_negative_output_indices"] else list(range(0, self.hyperparameters["num_outputs"])) ) output_indices_with_negatives = numpy.concatenate([ pandas.Series(random_negative_output_indices, dtype=int) .sample(n=num_random_negatives, replace=True) .values, output_indices, ]) else: output_indices_with_negatives = None # Encode y encode_y_kwargs = {} if adjusted_inequalities_with_random_negatives is not None: encode_y_kwargs["inequalities"] = adjusted_inequalities_with_random_negatives if output_indices_with_negatives is not None: encode_y_kwargs["output_indices"] = output_indices_with_negatives y_encoded = loss_obj.encode_y(y_with_negatives, **encode_y_kwargs) min_val_loss_iteration = None min_val_loss = None best_state_dict = None needs_initialization = ( self.hyperparameters["data_dependent_initialization_method"] is not None and not self.fit_info ) start = time.time() last_progress_print = None first_batch_time = None # Validation split (fixed across epochs; only training data is reshuffled) val_split = self.hyperparameters["validation_split"] n_total = len(y_encoded) n_train, n_val = validation_split_counts(n_total, val_split) indices = numpy.arange(n_total) if n_val > 0: train_indices_base = indices[:n_train] val_indices = indices[n_train:] else: train_indices_base = indices val_indices = None fit_info["train_rows"] = int(n_train) fit_info["validation_rows"] = int(n_val) fit_info["num_random_negatives"] = int(num_random_negatives) regularization_parameters = tuple(self._regularized_parameters(network)) l1_reg = self.hyperparameters["dense_layer_l1_regularization"] l2_reg = self.hyperparameters["dense_layer_l2_regularization"] # The validation set indexes into the concatenated # [random_negs | training] array via val_indices. The training portion # is static across epochs; the random-negative portion changes. # When val_indices points entirely into the training portion (the # common case — with default val_split=0.1 and random_negative_rate=1, # val set is the tail 10% of the ~2x-size concatenated array, all in # training portion), x_peptide[val_indices] and x_allele[val_indices] # are stable across epochs. Materialize them on device once to save # ~60 MB+ H2D per epoch. # # When overlap IS possible (unusual hyperparameter combos), skip the # cache and fall back to per-epoch copy (preserved behavior). # Check EVERY val index, not just the first — val_indices can be # unsorted (scikit-learn's train_test_split sometimes produces # shuffled indices). A leading value ≥ num_random_negatives does # not guarantee all subsequent values are in the training portion; # the weight/peptide slicing below would then index into the # random-negative portion, which mutates per epoch → stale tensors. _val_cache_safe = ( val_indices is not None and len(val_indices) > 0 and bool(numpy.all(val_indices >= num_random_negatives)) ) fit_info["validation_cache_reused"] = _val_cache_safe _val_device_tensors = None if _val_cache_safe: val_training_indices = val_indices - num_random_negatives # 2D int is index-encoded (keep dtype); 3D int is an already # materialized vector-encoded payload (widen to fp32). _val_peptide_np = x_dict_without_random_negatives["peptide"][ val_training_indices ] if ( _val_peptide_np.ndim == 2 and numpy.issubdtype(_val_peptide_np.dtype, numpy.integer) ): _val_peptide_device = torch_from_numpy(_val_peptide_np).to(device) else: _val_peptide_device = torch_from_numpy( _val_peptide_np).float().to(device) _val_y_device = torch_from_numpy( y_encoded[val_indices].astype(numpy.float32) ).to(device) _val_allele_device = None if "allele" in x_dict_without_random_negatives: _val_allele_device = torch_from_numpy( x_dict_without_random_negatives["allele"][val_training_indices] ).float().to(device) _val_weights_device = None if sample_weights_with_negatives is not None: _val_weights_device = torch_from_numpy( sample_weights_with_negatives[val_indices] ).float().to(device) _val_device_tensors = ( _val_peptide_device, _val_y_device, _val_allele_device, _val_weights_device, ) # AffinityDeviceTrainingData owns the device row space for this # fit: [random negatives | real examples]. The training loop only # asks it for indexed batches and refills the random-negative slice # once per epoch. random_neg_template = None if num_random_negatives > 0: _, random_neg_template = random_negatives_pool.get_epoch_inputs(0) affinity_training_data = AffinityDeviceTrainingData.from_arrays( x_peptide=x_dict_without_random_negatives["peptide"], x_allele=x_dict_without_random_negatives.get("allele"), y_encoded=y_encoded, sample_weights=sample_weights_with_negatives, random_negative_x_peptide_template=random_neg_template, random_negative_x_allele=random_negative_x_allele_base, device=device, ) fit_info["fit_tensor_residency"] = "device" logging.info("fit tensor residency: device (device=%s)", device.type) for epoch in range(self.hyperparameters["max_epochs"]): epoch_wall_start = time.perf_counter() # Coarse + fine timing buckets — kept for back-compat with # downstream telemetry consumers; the host-path-specific # buckets (dataset construction, dataloader setup) stay # at zero in the device-only world. input_build_time = 0.0 rn_pool_get_time = 0.0 rn_refill_time = 0.0 dataset_construction_time = 0.0 initialization_time = 0.0 shuffle_dataset_time = 0.0 dataloader_setup_time = 0.0 train_loop_wall_time = 0.0 train_loop_time = 0.0 epoch_h2d_time = 0.0 epoch_loss_sync_time = 0.0 validation_materialize_time = 0.0 validation_compute_time = 0.0 callback_time = 0.0 gc_time = 0.0 # Per-epoch random-negatives slice. With ``pool_epochs=1`` # this regenerates every epoch (legacy behavior); with # ``pool_epochs=N`` the encoding pass runs once per N # epochs and this is an O(1) view. rn_get_start = time.perf_counter() if epoch == 0 and random_neg_template is not None: random_negative_peptides_encoding = random_neg_template random_neg_template = None else: _, random_negative_peptides_encoding = ( random_negatives_pool.get_epoch_inputs(epoch) ) rn_pool_get_time += time.perf_counter() - rn_get_start rn_refill_start = time.perf_counter() affinity_training_data.refill_random_negative_peptides( random_negative_peptides_encoding ) rn_refill_time += time.perf_counter() - rn_refill_start input_build_time = rn_pool_get_time + rn_refill_time if needs_initialization: init_start = _timing_start(device, timing_enabled) init_batch = affinity_training_data.batch_dict_for_indices( indices, device=device ) self.data_dependent_weights_initialization( network, init_batch, method=self.hyperparameters["data_dependent_initialization_method"], target=self.hyperparameters[ "data_dependent_initialization_target" ], verbose=verbose, ) initialization_time += _timing_stop( init_start, device, timing_enabled ) needs_initialization = False # Compile AFTER LSUV hook churn finishes (see fit_streaming_batches # comment above). Idempotent: maybe_compile_network returns # the OptimizedModule unchanged if ``network`` is already # compiled, so it's safe to call every epoch. First epoch's # first batch pays the codegen cost; rest runs compiled. network = maybe_compile_network(network, device) eager_network = uncompiled_network(network) # Same rationale as fit_streaming_batches' loss-compile call. loss_obj = maybe_compile_loss(loss_obj, device) # Train indices live on device — train_indices_base is # contiguous [0, n_train), so a shuffled view is just # torch.randperm(n_train) on device with no host array # or H2D copy. dataset_start = time.perf_counter() train_indices_dev_full = torch.randperm( train_indices_base.shape[0], device=device, ) shuffle_dataset_time += time.perf_counter() - dataset_start # Training network.train() epoch_start = time.time() train_loop_wall_start = time.perf_counter() batch_size = _effective_minibatch n_train_epoch = int(train_indices_dev_full.shape[0]) full_batch_count = (n_train_epoch // batch_size) * batch_size def prepared_device_batches( full_batch_count=full_batch_count, train_indices_dev_full=train_indices_dev_full, batch_size=batch_size, network=network, n_train_epoch=n_train_epoch, eager_network=eager_network): # --- Device-resident inner loop --- # No DataLoader, no per-batch H2D. Indices live on device; # batches are built by index_select into the combined # buffer that holds [RN | real] rows. if full_batch_count > 0: train_indices_dev = train_indices_dev_full[:full_batch_count] num_full_batches = full_batch_count // batch_size for step in range(num_full_batches): batch_indices = train_indices_dev[ step * batch_size : (step + 1) * batch_size ] inputs, y_batch, weights_batch = ( affinity_training_data.batch_for_indices(batch_indices) ) yield { "network": network, "inputs": inputs, "y_batch": y_batch, "weights_batch": weights_batch, "row_count": int(y_batch.shape[0]), } tail_count = n_train_epoch - full_batch_count if tail_count > 0: tail_indices_dev = train_indices_dev_full[full_batch_count:] inputs, y_batch, weights_batch = ( affinity_training_data.batch_for_indices(tail_indices_dev) ) yield { "network": eager_network, "inputs": inputs, "y_batch": y_batch, "weights_batch": weights_batch, "row_count": int(y_batch.shape[0]), } train_epoch_result = _run_prepared_training_batches( prepared_device_batches(), optimizer=optimizer, loss_obj=loss_obj, regularization_parameters=regularization_parameters, l1_reg=l1_reg, l2_reg=l2_reg, timing_enabled=timing_enabled, device=device, ) train_loop_time += train_epoch_result["train_time"] if first_batch_time is None: first_batch_time = train_epoch_result["first_batch_time"] epoch_time = time.time() - epoch_start train_loop_wall_time = time.perf_counter() - train_loop_wall_start train_loss, epoch_loss_sync_time = _sync_mean_loss( train_epoch_result["losses"], device=device, timing_enabled=timing_enabled, ) fit_info["loss"].append(train_loss) # Validation — batched so every GPU invocation is fixed-size # and peak VRAM stays bounded regardless of n_val. By default # validation uses the eager network to avoid a second # torch.compile specialization for grad-disabled eval. # # Three conditions trigger a measurement; otherwise the val # pass is skipped and the previous measurement is carried # forward so fit_info["val_loss"] stays one-per-epoch: # 1. on a ``validation_interval`` cadence (the routine case); # 2. on the final epoch of the loop (so the saved model # always reflects an up-to-date val_loss); # 3. when patience would trigger this epoch (so the saved # val_loss reflects the actual stop state, not a stale # carried-forward value). validation_interval = _validation_interval_from_hyperparameters( self.hyperparameters) val_batch_size = None should_validate_this_epoch = _should_validate_epoch( validation_enabled=val_split > 0, epoch_index=epoch, max_epochs=self.hyperparameters["max_epochs"], validation_interval=validation_interval, early_stopping=self.hyperparameters.get("early_stopping", False), min_val_loss_epoch=min_val_loss_iteration, patience=self.hyperparameters["patience"], ) if val_split > 0 and not should_validate_this_epoch: prev_val_loss = _carry_forward_validation_loss(fit_info) fit_info["val_loss"].append(prev_val_loss) val_loss = prev_val_loss if should_validate_this_epoch: network.eval() with torch.inference_mode(): if _val_device_tensors is not None: # Fast path: reuse tensors materialized once before the # epoch loop. Saves ~60 MB+ H2D copy per epoch. Bit- # identical because val_indices points entirely into # the static training portion of x_peptide/x_allele. ( val_peptide, val_y, val_allele, val_weights, ) = _val_device_tensors else: # Rare case: val_indices overlaps the per-epoch # random-negative slice. Build the batch directly # from the device-resident combined buffer. materialize_start = time.perf_counter() val_indices_dev = torch.as_tensor( val_indices, dtype=torch.long, device=device, ) val_inputs, val_y, val_weights = ( affinity_training_data.batch_for_indices(val_indices_dev) ) val_peptide = val_inputs["peptide"] val_allele = val_inputs.get("allele") validation_materialize_time += ( time.perf_counter() - materialize_start ) if "effective_validation_batch_size" not in fit_info: fit_info["effective_validation_batch_size"] = ( effective_validation_batch_size( device, self.hyperparameters["validation_batch_size"], batch_size, model=eager_network, num_workers_per_gpu=env_workers_per_gpu(), total_rows=len(val_y), ) ) val_batch_size = fit_info[ "effective_validation_batch_size"] validation_start = _timing_start(device, timing_enabled) val_loss = _batched_validation_loss( network=validation_forward_network(network, eager_network), eager_network=eager_network, val_peptide=val_peptide, val_allele=val_allele, val_y=val_y, val_weights=val_weights, loss_obj=loss_obj, batch_size=val_batch_size, ) regularization_penalty = self._regularization_penalty( regularization_parameters, l1=l1_reg, l2=l2_reg, ) if regularization_penalty is not None: val_loss = val_loss + regularization_penalty.item() validation_compute_time += _timing_stop( validation_start, device, timing_enabled ) fit_info["val_loss"].append(val_loss) # Progress printing if progress_print_interval is not None and ( not last_progress_print or (time.time() - last_progress_print > progress_print_interval) ): print( ( progress_preamble + " " + "Epoch %3d / %3d [%0.2f sec]: loss=%g. " "Min val loss (%s) at epoch %s" % ( epoch, self.hyperparameters["max_epochs"], epoch_time, train_loss, str(min_val_loss), min_val_loss_iteration, ) ).strip() ) last_progress_print = time.time() # Early stopping. ``min_val_loss`` / ``min_val_loss_iteration`` # only update on epochs where validation actually ran — on # skipped epochs ``val_loss`` is the carried-forward previous # measurement and would never beat the current min anyway, so # restricting the update is for clarity (the patience counter # is anchored to the epoch the measurement was taken, not a # later epoch that copied the same value). if val_split > 0: if should_validate_this_epoch: previous_min_val_loss_iteration = min_val_loss_iteration min_val_loss, min_val_loss_iteration = ( _update_min_validation_loss( val_loss=val_loss, epoch_index=epoch, min_val_loss=min_val_loss, min_val_loss_epoch=min_val_loss_iteration, min_delta=self.hyperparameters["min_delta"], ) ) if ( ( self.hyperparameters["restore_best_weights"] or save_all_checkpoints ) and min_val_loss_iteration != previous_min_val_loss_iteration ): best_state_dict = copy_module_state_dict_to_cpu( eager_network) if self.hyperparameters["early_stopping"]: if _early_stop_reached( epoch_index=epoch, min_val_loss_epoch=min_val_loss_iteration, patience=self.hyperparameters["patience"], early_stopping=True, ): if progress_print_interval is not None: print( ( progress_preamble + " " + "Stopping at epoch %3d / %3d: loss=%g. " "Min val loss (%g) at epoch %s" % ( epoch, self.hyperparameters["max_epochs"], train_loss, min_val_loss if min_val_loss is not None else numpy.nan, min_val_loss_iteration, ) ).strip() ) break if progress_callback: callback_start = time.perf_counter() progress_callback() callback_time += time.perf_counter() - callback_start gc_start = time.perf_counter() gc.collect() gc_time += time.perf_counter() - gc_start if timing_enabled: # Coarse + fine-grained input-build buckets. The split was # added to find the unaccounted 35 s/epoch gap on the # 2026-04-28 release_full run (epoch_total_time ~45 s, # sum of pre-split components ~10 s). fit_info["epoch_input_build_time"].append(input_build_time) fit_info["epoch_rn_pool_get_time"].append(rn_pool_get_time) fit_info["epoch_random_negative_refill_time"].append( rn_refill_time ) fit_info["epoch_dataset_construction_time"].append( dataset_construction_time ) fit_info["epoch_initialization_time"].append( initialization_time ) fit_info["epoch_shuffle_dataset_time"].append( shuffle_dataset_time ) fit_info["epoch_dataloader_setup_time"].append( dataloader_setup_time ) fit_info["epoch_h2d_time"].append(epoch_h2d_time) fit_info["epoch_train_time"].append(train_loop_time) fit_info["epoch_train_loop_wall_time"].append( train_loop_wall_time ) # The dataloader-iter overhead is the wall time of the # `for batch in loader:` loop minus the per-batch GPU # compute and H2D copies that are timed separately. It # captures DataLoader worker IPC, prefetcher waits, # Python iterator overhead, and any compile-recompile # storms — i.e. exactly the gap that was unaccounted # for in the pre-split breakdown. fit_info["epoch_dataloader_iter_overhead_time"].append( max(0.0, train_loop_wall_time - epoch_h2d_time - train_loop_time) ) fit_info["epoch_loss_sync_time"].append(epoch_loss_sync_time) fit_info["epoch_validation_materialize_time"].append( validation_materialize_time ) fit_info["epoch_validation_time"].append( validation_compute_time ) fit_info["epoch_num_train_batches"].append( len(train_epoch_result["losses"])) fit_info["epoch_num_train_rows"].append( train_epoch_result["train_rows"]) fit_info["epoch_tail_train_rows"].append( n_train_epoch - full_batch_count ) fit_info["epoch_num_validation_batches"].append( int(numpy.ceil(n_val / val_batch_size)) if val_batch_size else 0 ) fit_info["epoch_callback_time"].append(callback_time) fit_info["epoch_gc_time"].append(gc_time) fit_info["epoch_total_time"].append( time.perf_counter() - epoch_wall_start ) restored_best_weights = self._finalize_training_checkpoints( eager_network, best_state_dict, save_all_checkpoints, ) fit_info["best_epoch"] = ( min_val_loss_iteration + 1 if min_val_loss_iteration is not None else None) fit_info["best_val_loss"] = min_val_loss fit_info["restored_best_weights"] = restored_best_weights fit_info["saved_checkpoint_policies"] = ( self.available_checkpoint_policies() ) fit_info["time"] = time.time() - start fit_info["num_points"] = len(peptides) if first_batch_time is not None: fit_info["first_batch_time"] = first_batch_time self.fit_info.append(dict(fit_info)) def predict( self, peptides, allele_encoding=None, batch_size=DEFAULT_PREDICT_BATCH_SIZE, output_index=0, num_workers_per_gpu=None): """ Predict affinities. Parameters ---------- peptides : EncodableSequences or list of string allele_encoding : AlleleEncoding, optional batch_size : int or ``"auto"`` ``"auto"`` (the default) sizes batches to the available GPU memory at call time — see ``compute_prediction_batch_size``. Pass an explicit int to pin the size. output_index : int or None num_workers_per_gpu : int, optional When multiple training/calibration workers are co-resident on the same CUDA device, pass the worker count so the auto- sizer partitions the VRAM budget. Ignored for explicit int batch_size. When not passed, falls back to ``env_workers_per_gpu(1)`` (the ``MHCFLURRY_MAX_WORKERS_PER_GPU`` env var the worker pool sets), mirroring ``fit()``. Returns ------- numpy.array of nM affinity predictions """ auto_batch_size = batch_size in (None, "auto") if num_workers_per_gpu is None: num_workers_per_gpu = env_workers_per_gpu(1) assert self.prediction_cache is not None use_cache = allele_encoding is None and isinstance(peptides, EncodableSequences) if use_cache and peptides in self.prediction_cache: return self.prediction_cache[peptides].copy() device = self.get_device() configure_matmul_precision(device) x_dict = {"peptide": self.peptides_to_network_input(peptides, device=device)} if allele_encoding is not None: ( allele_encoding_input, allele_representations, ) = self.allele_encoding_to_network_input(allele_encoding) x_dict["allele"] = allele_encoding_input self.set_allele_representations(allele_representations) network = self.network() else: network = self.network(borrow=True) network.to(device) network = maybe_compile_network(network, device) network.eval() # Resolve ``"auto"`` once the network is on device so the # heuristic has final visibility into VRAM + architecture. batch_size = resolve_prediction_batch_size( batch_size, device, model=network, num_workers_per_gpu=num_workers_per_gpu, total_rows=len(x_dict["peptide"]), ) # Batch prediction n_samples = len(x_dict["peptide"]) peptide_is_indices = _peptide_uses_torch_encoding(self.hyperparameters) def prediction_tensor(batch_array): if isinstance(batch_array, torch.Tensor): return batch_array.to(device) batch_array = numpy.asarray(batch_array) if not batch_array.flags.writeable: batch_array = batch_array.copy() # Keep integer dtype only on the index-encoded peptide path. # Allele inputs and 3D int8 vector-encoded payloads still widen # to fp32 as before — the flag only governs the peptide tensor. keep_int = ( peptide_is_indices and batch_array.ndim == 2 and numpy.issubdtype(batch_array.dtype, numpy.integer) ) if not keep_int: batch_array = numpy.asarray(batch_array, dtype=numpy.float32) return torch.from_numpy(batch_array).to(device) while True: all_predictions = [] try: with torch.no_grad(): for batch_start in range(0, n_samples, batch_size): batch_end = min(batch_start + batch_size, n_samples) peptide_batch = prediction_tensor( x_dict["peptide"][batch_start:batch_end] ) inputs = {"peptide": peptide_batch} if "allele" in x_dict: allele_batch = prediction_tensor( x_dict["allele"][batch_start:batch_end] ) inputs["allele"] = allele_batch batch_predictions = network(inputs) all_predictions.append(batch_predictions.cpu().numpy()) break except RuntimeError as exc: if ( not auto_batch_size or batch_size <= 1 or not pytorch_sizing.is_device_out_of_memory_error(exc)): raise previous_batch_size = batch_size batch_size = max(1, batch_size // 2) all_predictions = [] peptide_batch = None allele_batch = None inputs = None batch_predictions = None pytorch_sizing.release_device_memory_after_oom(device) logging.warning( "Auto prediction batch OOM at %d rows; retrying at %d.", previous_batch_size, batch_size, ) raw_predictions = numpy.concatenate(all_predictions, axis=0) predictions = numpy.array(raw_predictions, dtype="float64") if output_index is not None: predictions = predictions[:, output_index] result = to_ic50(predictions) if use_cache: self.prediction_cache[peptides] = result return result @classmethod def merge(cls, models, merge_method="average"): """ Merge multiple models at the neural network level. Parameters ---------- models : list of Class1NeuralNetwork merge_method : string, one of "average", "sum", or "concatenate" Returns ------- Class1NeuralNetwork """ if merge_method == "allele-specific": raise NotImplementedError("Allele-specific merge is not implemented") if len(models) == 1: return models[0] assert len(models) > 1 if any(not model.network().has_allele for model in models): raise NotImplementedError("Merging allele-specific models is not implemented") # For now, we create a simple ensemble wrapper # that averages predictions result = Class1NeuralNetwork(**dict(models[0].hyperparameters)) # Remove hyperparameters not shared by all models for model in models: for key, value in model.hyperparameters.items(): if result.hyperparameters.get(key, value) != value: del result.hyperparameters[key] # Create merged network result._network = MergedClass1NeuralNetwork( [model.network() for model in models], merge_method=merge_method ) result.update_network_description() result.network_weight_paths = tuple( path for model in models for path in getattr(model, "network_weight_paths", ()) ) return result def make_network( self, peptide_encoding, allele_amino_acid_encoding, allele_dense_layer_sizes, peptide_dense_layer_sizes, peptide_allele_merge_method, peptide_allele_merge_activation, layer_sizes, dense_layer_l1_regularization, dense_layer_l2_regularization, activation, init, output_activation, dropout_probability, batch_normalization, locally_connected_layers, topology, num_outputs=1, allele_representations=None, peptide_amino_acid_encoding_torch=True, peptide_amino_acid_encoding_gpu=None, normalization="none"): """ Helper function to make a PyTorch network for class 1 affinity prediction. """ if peptide_amino_acid_encoding_gpu is not None: peptide_amino_acid_encoding_torch = peptide_amino_acid_encoding_gpu hyperparameters = dict(self.hyperparameters) hyperparameters["peptide_encoding"] = peptide_encoding hyperparameters["peptide_amino_acid_encoding_torch"] = ( peptide_amino_acid_encoding_torch ) peptide_torch_encoding_name = _peptide_torch_encoding_name(hyperparameters) peptide_encoding_shape = peptide_sequences_to_network_input( [], peptide_encoding=peptide_encoding, peptide_amino_acid_encoding_torch=peptide_amino_acid_encoding_torch, ).shape[1:] # Index-encoded peptides probe as 1D (L,), but dense layers still # size against the post-embedding (L, V) shape. if peptide_torch_encoding_name and len(peptide_encoding_shape) == 1: peptide_encoding_shape = _peptide_torch_encoding_shape( peptide_encoding_shape, peptide_torch_encoding_name, ) return Class1NeuralNetworkModel( peptide_encoding_shape=peptide_encoding_shape, allele_representations=allele_representations, locally_connected_layers=locally_connected_layers, peptide_dense_layer_sizes=peptide_dense_layer_sizes, allele_dense_layer_sizes=allele_dense_layer_sizes, layer_sizes=layer_sizes, peptide_allele_merge_method=peptide_allele_merge_method, peptide_allele_merge_activation=peptide_allele_merge_activation, activation=activation, output_activation=output_activation, dropout_probability=dropout_probability, batch_normalization=batch_normalization, normalization=normalization, dense_layer_l1_regularization=dense_layer_l1_regularization, dense_layer_l2_regularization=dense_layer_l2_regularization, topology=topology, num_outputs=num_outputs, init=init, peptide_input_vector_encoding_name=peptide_torch_encoding_name, ) def clear_allele_representations(self): """ Set allele representations to an empty array. """ original_model = self.network() if original_model is not None and original_model.allele_embedding is not None: existing_shape = original_model.allele_embedding.weight.shape new_weight = numpy.zeros( shape=(1, existing_shape[1]), dtype=numpy.float32 ) target = original_model.allele_embedding.weight original_model.allele_embedding.weight.data = torch.from_numpy( new_weight ).to(device=target.device, dtype=target.dtype) original_model.allele_embedding.weight.requires_grad = False def set_allele_representations(self, allele_representations, force_surgery=False): """ Set the allele representations in use by this model. Parameters ---------- allele_representations : numpy.ndarray of shape (a, l, m) force_surgery : bool """ network = self.network() if network is None: return if allele_representations is None: has_allele_embedding = False if isinstance(network, MergedClass1NeuralNetwork): has_allele_embedding = any( sub_network.allele_embedding is not None for sub_network in network.networks ) else: has_allele_embedding = ( hasattr(network, 'allele_embedding') and network.allele_embedding is not None ) if has_allele_embedding: raise ValueError( "set_allele_representations(None) called on a pan-allele " "network" ) return reshaped = allele_representations.reshape( ( allele_representations.shape[0], numpy.prod(allele_representations.shape[1:]), ) ).astype(numpy.float32) # Handle merged networks (ensembles) if isinstance(network, MergedClass1NeuralNetwork): for sub_network in network.networks: self._update_embedding(sub_network, reshaped, force_surgery) elif hasattr(network, 'allele_embedding') and network.allele_embedding is not None: self._update_embedding(network, reshaped, force_surgery) def _update_embedding(self, network, reshaped, force_surgery): """Update the allele embedding for a single network.""" if network.allele_embedding is None: return target_weight = network.allele_embedding.weight existing_shape = target_weight.shape target_device = target_weight.device target_dtype = target_weight.dtype if existing_shape[0] > reshaped.shape[0] and not force_surgery: # Extend with NaNs reshaped = numpy.append( reshaped, numpy.ones([existing_shape[0] - reshaped.shape[0], reshaped.shape[1]]) * numpy.nan, axis=0, ) if existing_shape != reshaped.shape: # Need to resize embedding new_embedding = nn.Embedding( num_embeddings=reshaped.shape[0], embedding_dim=reshaped.shape[1] ).to(device=target_device) new_embedding.weight.data = torch.from_numpy(reshaped).to( device=target_device, dtype=target_dtype, ) new_embedding.weight.requires_grad = False network.allele_embedding = new_embedding else: network.allele_embedding.weight.data = torch.from_numpy( reshaped ).to(device=target_device, dtype=target_dtype) network.allele_embedding.weight.requires_grad = False class MergedClass1NeuralNetwork(nn.Module): """ A merged ensemble of Class1NeuralNetworkModel instances. """ def __init__(self, networks, merge_method="average"): super(MergedClass1NeuralNetwork, self).__init__() self.networks = nn.ModuleList(networks) self.merge_method = merge_method # Per-sub-network peptide_stage feature dims, populated lazily on # the first call to ``forward_peptide_stage``. Used by # ``forward_from_peptide_stage`` / ``forward_cartesian_from_peptide_stage`` # to split a concatenated peptide-stage tensor back into per-network # slices. Lazy because the dim depends on each sub-network's # peptide_dense_layer configuration; computing it without running # an actual peptide forward is fragile. self._sub_stage_dims = None def _combine_subnet_outputs(self, outputs): """Apply ``self.merge_method`` to a list of per-subnet output tensors.""" if self.merge_method == "average": return torch.stack(outputs, dim=-1).mean(dim=-1) if self.merge_method == "sum": return torch.stack(outputs, dim=-1).sum(dim=-1) if self.merge_method == "concatenate": return torch.cat(outputs, dim=-1) raise ValueError(f"Unknown merge method: {self.merge_method}") def _split_peptide_stage(self, peptide_stage): """Split a concatenated peptide-stage tensor into per-subnet chunks. ``forward_peptide_stage`` concatenates per-subnet stages along the feature axis; this is the inverse operation, used inside the ``forward_*_from_peptide_stage`` helpers below. """ if self._sub_stage_dims is None: raise RuntimeError( "forward_peptide_stage must be called before " "forward_from_peptide_stage / forward_cartesian_from_peptide_stage " "on MergedClass1NeuralNetwork (the per-subnet feature dims " "are recorded lazily on the first peptide forward)." ) chunks = [] offset = 0 for d in self._sub_stage_dims: chunks.append(peptide_stage[..., offset:offset + d]) offset += d return chunks def forward(self, inputs): outputs = [network(inputs) for network in self.networks] return self._combine_subnet_outputs(outputs) def forward_peptide_stage(self, peptide): """Run each sub-network's peptide-side stage and concatenate. Returned tensor has shape ``(batch, sum_i(peptide_dim_i))``; ``forward_from_peptide_stage`` and ``forward_cartesian_from_peptide_stage`` split it back along the feature axis using the recorded per-subnet dims and merge the per-subnet outputs via ``self.merge_method``. """ stages = [net.forward_peptide_stage(peptide) for net in self.networks] if self._sub_stage_dims is None: self._sub_stage_dims = tuple(int(s.shape[-1]) for s in stages) return torch.cat(stages, dim=-1) def forward_from_peptide_stage(self, peptide_stage, allele_idx): chunks = self._split_peptide_stage(peptide_stage) outputs = [ net.forward_from_peptide_stage(chunk, allele_idx) for net, chunk in zip(self.networks, chunks) ] return self._combine_subnet_outputs(outputs) def forward_cartesian_from_peptide_stage(self, peptide_stage, allele_idx): chunks = self._split_peptide_stage(peptide_stage) outputs = [ net.forward_cartesian_from_peptide_stage(chunk, allele_idx) for net, chunk in zip(self.networks, chunks) ] return self._combine_subnet_outputs(outputs) def get_weights_list(self): """Get all weights as a flat list.""" weights = [] for network in self.networks: weights.extend(network.get_weights_list()) return weights def set_weights_list(self, weights, auto_convert_keras=False): """Set weights from a flat list.""" idx = 0 for network in self.networks: n_weights = ( len(list(network.parameters())) + len(list(network._named_persistent_buffers())) ) network.set_weights_list(weights[idx:idx + n_weights], auto_convert_keras=auto_convert_keras) idx += n_weights def cartesian_network_output( model, peptide_stage, allele_idx, exact_forward=False): """Run a pan-allele network over the (allele × peptide) cartesian product. ``model`` is any network exposing ``forward_cartesian_from_peptide_stage`` and ``forward_from_peptide_stage`` (a :class:`Class1NeuralNetworkModel` or a :class:`MergedClass1NeuralNetwork`). The fast path delegates to the network's factored ``forward_cartesian_from_peptide_stage``; ``exact_forward`` instead materializes the full ``(num_alleles * num_peptides)`` batch and runs the plain ``forward_from_peptide_stage`` — the unfactored reference used to check the compact path's numerics. Returns a ``(num_alleles, num_peptides, num_outputs)`` tensor. """ if not exact_forward: return model.forward_cartesian_from_peptide_stage( peptide_stage, allele_idx, ) peptide_width = peptide_stage.shape[-1] num_peptides = peptide_stage.shape[0] num_alleles = allele_idx.shape[0] expanded_stage = peptide_stage.unsqueeze(0).expand( num_alleles, num_peptides, peptide_width, ).reshape(num_alleles * num_peptides, peptide_width) expanded_alleles = allele_idx.unsqueeze(1).expand( num_alleles, num_peptides, ).reshape(-1) return model.forward_from_peptide_stage( expanded_stage, expanded_alleles, ).reshape(num_alleles, num_peptides, -1) def cartesian_output_log_ic50_sum( network_output, model, log50000, accum_dtype): """Convert cartesian network outputs to summed log(IC50). Normal models may expose multiple output channels; prediction defaults to channel 0, so fast calibration must do the same. Optimized pan-model ensembles are different: ``MergedClass1NeuralNetwork`` with ``merge_method='concatenate'`` returns one channel per merged submodel. Those channels are ensemble members and must all contribute to the geometric mean. Returns ------- (torch.Tensor, int) ``(a_size, chunk_n)`` summed log(IC50) contribution and the number of ensemble members represented by the sum. """ if network_output.ndim == 2: network_output = network_output.unsqueeze(-1) if network_output.ndim != 3 or int(network_output.shape[-1]) < 1: raise ValueError( "cartesian network output must have shape " "(alleles, peptides, outputs); got %s" % ( tuple(network_output.shape), ) ) is_merged_concatenate = ( getattr(model, "merge_method", None) == "concatenate" and getattr(model, "networks", None) is not None ) if is_merged_concatenate: selected = network_output else: selected = network_output[..., :1] log_ic50 = (1.0 - selected).to(accum_dtype) * log50000 return log_ic50.sum(dim=-1), int(selected.shape[-1]) mhcflurry-2.3.6/mhcflurry/class1_presentation_predictor.py000066400000000000000000001705311525677230600242020ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from os.path import join, exists from os import mkdir from socket import gethostname from getpass import getuser import os import time import collections import logging import sys import warnings import numpy import pandas import sklearn import sklearn.linear_model import tqdm from .version import __version__ from .model_provenance import add_release_provenance from .class1_affinity_predictor import Class1AffinityPredictor from .class1_processing_predictor import Class1ProcessingPredictor from .pytorch_sizing import ( DEFAULT_PREDICT_BATCH_SIZE, env_workers_per_gpu, ) from .encodable_sequences import EncodableSequences from .regression_target import from_ic50 from .downloads import get_default_class1_presentation_models_dir from .percentile_calibration import ( calibration_method, fit_percent_rank_transform, load_percent_rank_transforms, save_percent_rank_transforms) MAX_ALLELES_PER_SAMPLE = 6 PREDICT_BATCH_SIZE = DEFAULT_PREDICT_BATCH_SIZE PREDICT_CHUNK_SIZE = 100000 # currently used only for cleavage prediction # Target rows for one cartesian (peptides × alleles) predict() call inside # the presentation predictor. The predictor chunks the allele axis so that # each call materializes at most this many rows before the model sees them # — bounding peak memory regardless of how many alleles a caller supplies. # 1M peptide×allele rows is ~4 MB per int8 column, comfortable on A100. _PRESENTATION_PREDICT_TARGET_ROWS = int( os.environ.get("MHCFLURRY_PRESENTATION_PREDICT_TARGET_ROWS", "1000000") ) _PRESENTATION_LOGISTIC_REGRESSION_KWARGS = { # Keep newly trained presentation combiners on the published 2.1.x/2.2.x # recipe. Shipped models load their saved coefficients and are unaffected. "solver": "lbfgs", } # Presentation scores are probabilities, but their useful dynamic range depends # on the class balance used to fit the logistic combiner. Release training with # many decoys can place most scores far below 0.001. Uniform bins over [0, 1] # collapse that entire region to one percentile and destroy rank-based metrics. # Uniform quantiles preserve resolution throughout that compressed range, but # still merge informative high scores into large ties. Supplement them with # log-spaced upper-tail probabilities: ranking metrics are particularly # sensitive to resolution among the strongest predictions. PRESENTATION_PERCENT_RANK_NUM_BINS = 10000 PRESENTATION_PERCENT_RANK_TAIL_FRACTION = 0.01 def presentation_percent_rank_bins( scores, num_bins=PRESENTATION_PERCENT_RANK_NUM_BINS): """Return quantile bins with extra resolution in the upper score tail. Parameters ---------- scores : sequence of float Calibration presentation scores. num_bins : int Base uniform-quantile bin budget. At most this many additional bins refine the top 1% with logarithmically spaced tail probabilities, down to one observation's probability mass. Small calibration sets and repeated scores can result in fewer bins. Returns ------- numpy.ndarray Strictly increasing histogram edges spanning the finite scores. """ scores = numpy.asarray(scores, dtype=float) scores = scores[numpy.isfinite(scores)] if scores.size == 0: raise ValueError("Cannot calibrate presentation percentiles without scores") if num_bins < 1: raise ValueError("num_bins must be at least 1") num_bins = int(num_bins) quantiles = numpy.linspace(0.0, 1.0, min(num_bins, scores.size) + 1) if scores.size > num_bins: tail_bins = min( num_bins, int(scores.size * PRESENTATION_PERCENT_RANK_TAIL_FRACTION)) if tail_bins > 1: tail_probabilities = numpy.geomspace( PRESENTATION_PERCENT_RANK_TAIL_FRACTION, 1.0 / scores.size, tail_bins, ) quantiles = numpy.unique(numpy.concatenate([ quantiles, 1.0 - tail_probabilities])) edges = numpy.quantile(scores, quantiles) edges = numpy.unique(edges) if edges.size < 2: raise ValueError( "Cannot calibrate presentation percentiles from a constant score " "distribution" ) return edges class Class1PresentationPredictor(object): """ A logistic regression model over predicted binding affinity (BA) and antigen processing (AP) score. Instances of this class delegate to Class1AffinityPredictor and Class1ProcessingPredictor instances to generate BA and AP predictions. These predictions are combined using a logistic regression model to give a "presentation score" prediction. Most users will call the `load` static method to get an instance of this class, then call the `predict` method to generate predictions. """ model_inputs = ["affinity_score", "processing_score"] def __init__( self, affinity_predictor=None, processing_predictor_with_flanks=None, processing_predictor_without_flanks=None, weights_dataframe=None, metadata_dataframes=None, percent_rank_transform=None, provenance_string=None): self.affinity_predictor = affinity_predictor self.processing_predictor_with_flanks = processing_predictor_with_flanks self.processing_predictor_without_flanks = processing_predictor_without_flanks self.weights_dataframe = weights_dataframe self.metadata_dataframes = ( dict(metadata_dataframes) if metadata_dataframes else {}) self._models_cache = {} self.percent_rank_transform = percent_rank_transform self.provenance_string = provenance_string @property def supported_alleles(self): """ List of alleles supported by the underlying Class1AffinityPredictor """ return self.affinity_predictor.supported_alleles @property def supported_peptide_lengths(self): """ (min, max) of supported peptide lengths, inclusive. """ return self.affinity_predictor.supported_peptide_lengths @property def supports_affinity_prediction(self): """Is there an affinity predictor associated with this instance?""" return self.affinity_predictor is not None @property def supports_processing_prediction(self): """Is there a processing predictor associated with this instance?""" return ( self.processing_predictor_with_flanks is not None or self.processing_predictor_without_flanks is not None) @property def supports_presentation_prediction(self): """Can this instance predict presentation?""" return ( self.supports_affinity_prediction and self.supports_processing_prediction and self.weights_dataframe is not None) def predict_sequences_columns( self, alleles, use_flanks=True, include_affinity_percentile=True): """ Column names that ``predict_sequences(..., result="all")`` will emit. Used so the empty-input fast-path in ``mhcflurry-predict-scan`` can seed a DataFrame with the same schema the populated path produces. Mirrors the column set assembled in ``predict()`` plus the ``sequence_name`` / ``pos`` columns inserted in ``predict_sequences``. """ cols = ["sequence_name", "pos", "peptide"] has_alleles = bool(alleles) emits_processing = self.supports_processing_prediction if emits_processing and use_flanks: cols += ["n_flank", "c_flank"] cols.append("sample_name") if has_alleles: cols += ["affinity", "best_allele"] if include_affinity_percentile: cols.append("affinity_percentile") if emits_processing: cols.append("processing_score") if (has_alleles and emits_processing and self.supports_presentation_prediction): cols += ["presentation_score", "presentation_percentile"] return cols def predict_columns( self, affinity_only=False, use_flanking=True, include_affinity_percentile=False): """ Column names that ``predict()`` / ``predict_affinity()`` emit when called with non-empty inputs. Used by ``mhcflurry-predict`` to give empty inputs the same output schema as populated ones. Mirrors the columns assembled by ``predict_affinity`` and the additional columns layered on by ``predict``. """ cols = ["peptide", "peptide_num", "sample_name"] cols += ["affinity", "best_allele"] if include_affinity_percentile: cols.append("affinity_percentile") if affinity_only: return cols emits_processing = self.supports_processing_prediction if emits_processing: if use_flanking: cols += ["n_flank", "c_flank"] cols.append("processing_score") if self.supports_presentation_prediction: cols += ["presentation_score", "presentation_percentile"] return cols def predict_affinity( self, peptides, alleles, sample_names=None, include_affinity_percentile=True, verbose=1, throw=True, model_kwargs=None): """ Predict binding affinities across samples, each with an MHC allele set. Two modes are supported: each peptide can be evaluated for binding to any of the alleles in any sample (this is what happens when sample_names is None), or the i'th peptide can be evaluated for binding the alleles of the sample given by the i'th entry in sample_names. For example, if we don't specify sample_names, then predictions are taken for all combinations of samples and peptides, for a result size of num peptides * num samples: >>> predictor = Class1PresentationPredictor.load() >>> predictions = predictor.predict_affinity( ... peptides=["SIINFEKL", "PEPTIDE"], ... alleles={ ... "sample1": ["A0201", "A0301", "B0702"], ... "sample2": ["A0101", "C0202"], ... }, ... verbose=0) >>> list(zip(predictions.sample_name, predictions.peptide)) [('sample1', 'SIINFEKL'), ('sample1', 'PEPTIDE'), ('sample2', 'SIINFEKL'), ('sample2', 'PEPTIDE')] >>> bool((predictions.affinity > 0).all()) True In contrast, here we specify sample_names, so peptide is evaluated for binding the alleles in the corresponding sample, for a result size equal to the number of peptides: >>> predictions = predictor.predict_affinity( ... peptides=["SIINFEKL", "PEPTIDE"], ... alleles={ ... "sample1": ["A0201", "A0301", "B0702"], ... "sample2": ["A0101", "C0202"], ... }, ... sample_names=["sample2", "sample1"], ... verbose=0) >>> list(zip(predictions.sample_name, predictions.peptide)) [('sample2', 'SIINFEKL'), ('sample1', 'PEPTIDE')] >>> bool((predictions.affinity > 0).all()) True Parameters ---------- peptides : list of string Peptide sequences alleles : dict of string -> list of string Keys are sample names, values are the MHC alleles for that sample sample_names : list of string [same length as peptides] Sample names corresponding to each peptide. If None, then predictions are generated for all sample MHC allele sets across all peptides. include_affinity_percentile : bool Whether to include affinity percentile ranks verbose : int Set to 0 for quiet. throw : bool Whether to throw exception (vs. just log a warning) on invalid peptides, etc. model_kwargs : dict, optional Keyword arguments forwarded to ``Class1AffinityPredictor.predict``. Returns ------- pandas.DataFrame : predictions """ if model_kwargs is None: model_kwargs = {} else: model_kwargs = dict(model_kwargs) affinity_model_kwargs = { "batch_size": PREDICT_BATCH_SIZE, "num_workers_per_gpu": env_workers_per_gpu(1), } affinity_model_kwargs.update(model_kwargs) predict_cartesian = getattr( self.affinity_predictor, "predict_cartesian_pan_allele", None, ) df = pandas.DataFrame({ "peptide": numpy.asarray(peptides), }) df["peptide_num"] = df.index if sample_names is None: peptides = EncodableSequences.create(peptides) all_alleles = sorted( {a for lst in alleles.values() for a in lst}, key=lambda value: str(value), ) if verbose > 0: print("Predicting affinities.", file=sys.stderr) # Per-allele × per-peptide chunked predict. Track each # sample's best allele as chunks return, so peak host memory # stays bounded by one cartesian chunk instead of materializing # the full ``(n_peps, n_unique_alleles)`` matrix. n_peps = len(peptides) n_all = len(all_alleles) allele_chunk = max(1, _PRESENTATION_PREDICT_TARGET_ROWS // max(n_peps, 1)) best_value_by_sample = {} best_allele_by_sample = {} best_rank_by_sample = {} allele_to_sample_ranks = collections.defaultdict(list) for sample_name, sample_alleles in alleles.items(): best_value_by_sample[sample_name] = numpy.full( n_peps, numpy.inf, dtype=numpy.float64, ) best_allele_by_sample[sample_name] = numpy.full( n_peps, None, dtype=object, ) best_rank_by_sample[sample_name] = numpy.full( n_peps, numpy.iinfo(numpy.int64).max, dtype=numpy.int64, ) seen_sample_alleles = set() for rank, allele in enumerate(sample_alleles): if allele in seen_sample_alleles: continue seen_sample_alleles.add(allele) allele_to_sample_ranks[allele].append((sample_name, rank)) if n_peps > 0: chunk_iter = range(0, n_all, allele_chunk) if verbose > 0 and n_all > allele_chunk: chunk_iter = tqdm.tqdm( chunk_iter, total=(n_all + allele_chunk - 1) // allele_chunk, ) for chunk_start in chunk_iter: chunk_end = min(chunk_start + allele_chunk, n_all) chunk_alleles = all_alleles[chunk_start:chunk_end] chunk_n = chunk_end - chunk_start chunk_matrix = ( predict_cartesian( peptides=peptides, alleles=chunk_alleles, model_kwargs=affinity_model_kwargs, throw=throw, ) if predict_cartesian is not None else None ) if chunk_matrix is None: peptides_repeated = EncodableSequences.create( numpy.tile(peptides.sequences, chunk_n) ) alleles_repeated = numpy.repeat( numpy.asarray(chunk_alleles), n_peps, ) flat_predictions = numpy.asarray( self.affinity_predictor.predict( peptides=peptides_repeated, alleles=alleles_repeated, model_kwargs=affinity_model_kwargs, throw=throw, ), dtype=numpy.float64, ) chunk_matrix = flat_predictions.reshape(chunk_n, n_peps).T for j, allele in enumerate(chunk_alleles): sample_ranks = allele_to_sample_ranks.get(allele, ()) if not sample_ranks: continue col = chunk_matrix[:, j] valid = ~numpy.isnan(col) if not valid.any(): continue for sample_name, rank in sample_ranks: best_value = best_value_by_sample[sample_name] best_rank = best_rank_by_sample[sample_name] better = valid & ( (col < best_value) | ((col == best_value) & (rank < best_rank)) ) if better.any(): best_value[better] = col[better] best_allele_by_sample[sample_name][better] = allele best_rank[better] = rank dfs = [] for sample_name in alleles: new_df = df.copy() new_df["sample_name"] = sample_name affinity = numpy.where( numpy.isfinite(best_value_by_sample[sample_name]), best_value_by_sample[sample_name], numpy.nan, ) new_df["affinity"] = affinity new_df["best_allele"] = best_allele_by_sample[sample_name] dfs.append(new_df) result_df = pandas.concat(dfs, ignore_index=True) else: df["sample_name"] = numpy.asarray(sample_names) iterator = df.groupby("sample_name") if verbose > 0: print("Predicting affinities.", file=sys.stderr) iterator = tqdm.tqdm( iterator, total=df.sample_name.nunique()) for (sample, sub_df) in iterator: sample_peptides = EncodableSequences.create(sub_df.peptide.values) sample_alleles = list(alleles[sample]) n_peps = len(sample_peptides) n_all = len(sample_alleles) # Per-sample best-affinity / best-allele tracking with # chunked cartesian predicts. Strict ``<`` on update so # the earliest allele in ``sample_alleles`` wins ties # (matches the legacy ``pandas.idxmin`` behavior, which # returns the first column at exact ties). best_value = numpy.full(n_peps, numpy.inf, dtype=numpy.float64) best_allele_arr = numpy.full(n_peps, None, dtype=object) allele_chunk = max( 1, _PRESENTATION_PREDICT_TARGET_ROWS // max(n_peps, 1), ) for chunk_start in range(0, n_all, allele_chunk): chunk_end = min(chunk_start + allele_chunk, n_all) chunk_alleles = sample_alleles[chunk_start:chunk_end] chunk_n = chunk_end - chunk_start chunk_matrix = ( predict_cartesian( peptides=sample_peptides, alleles=chunk_alleles, model_kwargs=affinity_model_kwargs, throw=throw, ) if predict_cartesian is not None else None ) if chunk_matrix is None: peptides_repeated = EncodableSequences.create( numpy.tile(sample_peptides.sequences, chunk_n) ) alleles_repeated = numpy.repeat( numpy.asarray(chunk_alleles), n_peps, ) flat_predictions = numpy.asarray( self.affinity_predictor.predict( peptides=peptides_repeated, alleles=alleles_repeated, model_kwargs=affinity_model_kwargs, throw=throw, ), dtype=numpy.float64, ) chunk_matrix = flat_predictions.reshape(chunk_n, n_peps).T for j, allele in enumerate(chunk_alleles): col = chunk_matrix[:, j] valid = ~numpy.isnan(col) better = valid & (col < best_value) if better.any(): best_value[better] = col[better] best_allele_arr[better] = allele affinity_out = numpy.where( numpy.isfinite(best_value), best_value, numpy.nan, ) df.loc[sub_df.index, "affinity"] = affinity_out df.loc[sub_df.index, "best_allele"] = best_allele_arr result_df = df if include_affinity_percentile: result_df["affinity_percentile"] = ( self.affinity_predictor.percentile_ranks( result_df.affinity.values, alleles=result_df.best_allele.values, throw=False)) return result_df def predict_processing( self, peptides, n_flanks=None, c_flanks=None, throw=True, verbose=1, batch_size=PREDICT_BATCH_SIZE): """ Predict antigen processing scores for individual peptides, optionally including flanking sequences for better cleavage prediction. Parameters ---------- peptides : list of string n_flanks : list of string [same length as peptides] c_flanks : list of string [same length as peptides] throw : boolean Whether to raise exception on unsupported peptides verbose : int batch_size : int or "auto" Returns ------- numpy.array : Antigen processing scores for each peptide """ if (n_flanks is None) != (c_flanks is None): raise ValueError("Specify both or neither of n_flanks, c_flanks") if n_flanks is None: if self.processing_predictor_without_flanks is None: raise ValueError("No processing predictor without flanks") predictor = self.processing_predictor_without_flanks n_flanks = [""] * len(peptides) c_flanks = n_flanks else: if self.processing_predictor_with_flanks is None: raise ValueError("No processing predictor with flanks") predictor = self.processing_predictor_with_flanks if len(peptides) == 0: return numpy.array([], dtype=float) num_chunks = int(numpy.ceil(float(len(peptides)) / PREDICT_CHUNK_SIZE)) peptide_chunks = numpy.array_split(peptides, num_chunks) n_flank_chunks = numpy.array_split(n_flanks, num_chunks) c_flank_chunks = numpy.array_split(c_flanks, num_chunks) iterator = zip(peptide_chunks, n_flank_chunks, c_flank_chunks) if verbose > 0: print("Predicting processing.", file=sys.stderr) iterator = tqdm.tqdm(iterator, total=len(peptide_chunks)) result_chunks = [] for (peptide_chunk, n_flank_chunk, c_flank_chunk) in iterator: result_chunk = predictor.predict( peptides=peptide_chunk, n_flanks=n_flank_chunk, c_flanks=c_flank_chunk, throw=throw, batch_size=batch_size) result_chunks.append(result_chunk) return numpy.concatenate(result_chunks) def fit( self, targets, peptides, sample_names, alleles, n_flanks=None, c_flanks=None, verbose=1): """ Fit the presentation score logistic regression model. Parameters ---------- targets : list of int/float 1 indicates hit, 0 indicates decoy peptides : list of string [same length as targets] sample_names : list of string [same length as targets] alleles : dict of string -> list of string Keys are sample names, values are the alleles for that sample n_flanks : list of string [same length as targets] c_flanks : list of string [same length as targets] verbose : int """ df = self.predict_affinity( peptides=peptides, alleles=alleles, sample_names=sample_names, include_affinity_percentile=False, verbose=verbose) if (n_flanks is None) != (c_flanks is None): raise ValueError("Specify both or neither of n_flanks, c_flanks") with_flanks_list = [] if self.processing_predictor_without_flanks is not None: with_flanks_list.append(False) if n_flanks is not None and self.processing_predictor_with_flanks is not None: with_flanks_list.append(True) if not with_flanks_list: raise RuntimeError("Can't fit any models") processing_scores_by_model = {} for with_flanks in with_flanks_list: model_name = 'with_flanks' if with_flanks else "without_flanks" if verbose > 0: print("Predicting processing for variant", model_name, file=sys.stderr) processing_scores_by_model[model_name] = self.predict_processing( peptides=df.peptide.values, n_flanks=n_flanks if with_flanks else None, c_flanks=c_flanks if with_flanks else None, verbose=verbose) self.fit_from_scores( targets=targets, affinities=df.affinity.values, processing_scores_by_model=processing_scores_by_model, verbose=verbose) def fit_from_scores( self, targets, affinities, processing_scores_by_model, verbose=1): """ Fit presentation logistic-regression weights from precomputed scores. Parameters ---------- targets : list of int/float 1 indicates hit, 0 indicates decoy. affinities : list of float Best binding affinity predictions aligned to ``targets``. processing_scores_by_model : dict Mapping from model name (``"with_flanks"`` or ``"without_flanks"``) to processing predictions aligned to ``targets``. verbose : int """ if not processing_scores_by_model: raise RuntimeError("Can't fit any models") df = pandas.DataFrame({ "affinity_score": from_ic50(affinities), "target": numpy.asarray(targets), }) if self.weights_dataframe is None: self.weights_dataframe = pandas.DataFrame() for (model_name, processing_scores) in processing_scores_by_model.items(): if verbose > 0: print("Training variant", model_name) df["processing_score"] = numpy.asarray(processing_scores) model = self.get_model() if verbose > 0: print("Fitting LR model.") print( "LR input rows=%d columns=%s target_mean=%.6f " "affinity_score_range=(%.6f, %.6f) " "processing_score_range=(%.6f, %.6f)" % ( len(df), list(df.columns), float(df.target.mean()), float(df.affinity_score.min()), float(df.affinity_score.max()), float(df.processing_score.min()), float(df.processing_score.max()), ) ) with warnings.catch_warnings(): # scikit-learn <=1.5 passes deprecated ``disp`` / ``iprint`` # options to SciPy's L-BFGS-B implementation even when its # own verbose setting is zero. Preserve the published lbfgs # recipe while suppressing only that upstream compatibility # warning; fitting inputs and results are unchanged. warnings.filterwarnings( "ignore", message=( r"scipy\.optimize: The `disp` and `iprint` options of " r"the L-BFGS-B solver are deprecated.*" ), category=DeprecationWarning, ) model.fit( X=df[self.model_inputs].values, y=df.target.astype(float)) (intercept,) = model.intercept_.flatten() self.weights_dataframe.loc[model_name, "intercept"] = intercept for (name, value) in zip(self.model_inputs, numpy.squeeze(model.coef_)): self.weights_dataframe.loc[model_name, name] = value self._models_cache[model_name] = model def get_model(self, name=None): """ Load or instantiate a new logistic regression model. Private helper method. Parameters ---------- name : string If None (the default), an un-fit LR model is returned. Otherwise the weights are loaded for the specified model. Returns ------- sklearn.linear_model.LogisticRegression """ if name is None or name not in self._models_cache: model = sklearn.linear_model.LogisticRegression( **_PRESENTATION_LOGISTIC_REGRESSION_KWARGS) if name is not None: row = self.weights_dataframe.loc[name] model.intercept_ = row.intercept model.coef_ = numpy.expand_dims( row[self.model_inputs].values, axis=0) model.classes_ = numpy.array([0, 1]) else: model = self._models_cache[name] return model def predict( self, peptides, alleles, sample_names=None, n_flanks=None, c_flanks=None, include_affinity_percentile=False, verbose=1, throw=True, affinity_model_kwargs=None, processing_batch_size=PREDICT_BATCH_SIZE): """ Predict presentation scores across a set of peptides. Presentation scores combine predictions for MHC I binding affinity and antigen processing. This method returns a pandas.DataFrame giving presentation scores plus the binding affinity and processing predictions and other intermediate results. Example: >>> predictor = Class1PresentationPredictor.load() >>> predictions = predictor.predict( ... peptides=["SIINFEKL", "PEPTIDE"], ... n_flanks=["NNN", "SNS"], ... c_flanks=["CCC", "CNC"], ... alleles={ ... "sample1": ["A0201", "A0301", "B0702"], ... "sample2": ["A0101", "C0202"], ... }, ... verbose=0) >>> list(zip(predictions.sample_name, predictions.peptide)) [('sample1', 'SIINFEKL'), ('sample1', 'PEPTIDE'), ('sample2', 'SIINFEKL'), ('sample2', 'PEPTIDE')] >>> bool(predictions.presentation_score.between(0, 1).all()) True You can also specify sample_names, in which case peptide is evaluated for binding the alleles in the corresponding sample only. See `predict_affinity` for examples. Parameters ---------- peptides : list of string Peptide sequences alleles : list of string or dict of string -> list of string If you are predicting for a single sample, pass a list of strings indicating the sample MHC allele set (at most six alleles in this list form). If you are predicting across multiple samples, pass a dict where the keys are (arbitrary) sample names and the values are the alleles to predict for that sample. Set to an empty list or dict to perform processing prediction only. sample_names : list of string [same length as peptides] If you are passing a dict for 'alleles', you can use this argument to specify which peptides go with which samples. If it is None, then predictions will be performed for each peptide across all samples. n_flanks : list of string [same length as peptides] Upstream sequences before the peptide. Sequences of any length can be given and a suffix of the size supported by the model will be used. c_flanks : list of string [same length as peptides] Downstream sequences after the peptide. Sequences of any length can be given and a prefix of the size supported by the model will be used. include_affinity_percentile : bool Whether to include affinity percentile ranks verbose : int Set to 0 for quiet. throw : bool Whether to throw exception (vs. just log a warning) on invalid peptides, etc. affinity_model_kwargs : dict, optional Keyword arguments forwarded to ``Class1AffinityPredictor.predict``. processing_batch_size : int or "auto" Batch size for antigen processing neural network prediction. Returns ------- pandas.DataFrame Presentation scores and intermediate results. """ if isinstance(peptides, str): raise TypeError("peptides must be a list not a string") if isinstance(alleles, str): raise TypeError("alleles must be a list or dict") if not isinstance(alleles, dict): # Make alleles into a dict. if sample_names is not None: raise ValueError( "alleles must be a dict when sample_names is specified") alleles = numpy.asarray(alleles) if len(alleles) > MAX_ALLELES_PER_SAMPLE: raise ValueError( "When alleles is a list, it must have at most %d elements. " "These alleles are taken to be an MHC allele set for an " "individual, and the strongest prediction across alleles " "will be taken for each peptide. Note that this differs " "from Class1AffinityPredictor.predict(), where alleles " "is expected to be the same length as peptides." % MAX_ALLELES_PER_SAMPLE) alleles = { "sample1": alleles, } if (n_flanks is None) != (c_flanks is None): raise ValueError("Specify both or neither of n_flanks, c_flanks") if self.supports_processing_prediction: processing_scores = self.predict_processing( peptides=peptides, n_flanks=n_flanks, c_flanks=c_flanks, throw=throw, verbose=verbose, batch_size=processing_batch_size) else: processing_scores = None if alleles: df = self.predict_affinity( peptides=peptides, alleles=alleles, sample_names=sample_names, # might be None include_affinity_percentile=include_affinity_percentile, verbose=verbose, throw=throw, model_kwargs=affinity_model_kwargs) df["affinity_score"] = from_ic50(df.affinity) else: # Processing prediction only. df = pandas.DataFrame({ "peptide_num": numpy.arange(len(peptides)), "peptide": peptides, }) df["sample_name"] = "sample1" if processing_scores is not None: df["processing_score"] = df.peptide_num.map( pandas.Series(processing_scores)) if n_flanks is not None: flank_df = pandas.DataFrame({ "n_flank": df.peptide_num.map(pandas.Series(n_flanks)), "c_flank": df.peptide_num.map(pandas.Series(c_flanks)), }) leading_columns = [df.columns[0]] df = pandas.concat( [df[leading_columns], flank_df, df.drop(columns=leading_columns)], axis=1, ) predict_presentation = ( "affinity_score" in df.columns and "processing_score" in df.columns and self.supports_presentation_prediction) if predict_presentation: if len(df) > 0: model_name = 'with_flanks' if n_flanks is not None else \ "without_flanks" model = self.get_model(model_name) input_matrix = df[self.model_inputs] null_mask = None if not throw: # Invalid peptides will be null. null_mask = input_matrix.isnull().any(axis=1) input_matrix = input_matrix.fillna(0.0) df["presentation_score"] = model.predict_proba( input_matrix.values)[:,1] if null_mask is not None: df.loc[null_mask, "presentation_score"] = numpy.nan df["presentation_percentile"] = self.percentile_ranks( df["presentation_score"], throw=False) else: df["presentation_score"] = [] df["presentation_percentile"] = [] del df["affinity_score"] return df def resolve_comparison_quantity(self, alleles, comparison_quantity=None): """ Resolve the column used to rank scan predictions. This is the single source of truth for the ``comparison_quantity`` defaulting and validation used by :meth:`predict_sequences`. It is also called by the predict-scan CLI's parallel path so that chunked execution ranks on exactly the same column the serial path would pick (which depends on the predictor's *capabilities*, not on which columns happen to be present in a given result). Parameters ---------- alleles The ``alleles`` argument as passed to :meth:`predict_sequences` (string, list, or dict). Only its length / emptiness is used here. comparison_quantity : string or None If None, a default is chosen: ``presentation_score`` when alleles are given and presentation is supported, else ``affinity`` when alleles are given, else ``processing_score``. Returns ------- string The resolved (and validated) comparison quantity. """ if comparison_quantity is None: if len(alleles) > 0: if self.supports_presentation_prediction: comparison_quantity = "presentation_score" else: comparison_quantity = "affinity" else: comparison_quantity = "processing_score" if comparison_quantity == "presentation_score": if not self.supports_presentation_prediction: raise ValueError( "Presentation prediction not supported by this predictor") elif comparison_quantity == "processing_score": if not self.supports_processing_prediction: raise ValueError( "Processing prediction not supported by this predictor") elif comparison_quantity in ("affinity", "affinity_percentile"): if not self.supports_affinity_prediction: raise ValueError( "Affinity prediction not supported by this predictor") else: raise ValueError( "Unknown comparison quantity: %s" % comparison_quantity) return comparison_quantity @staticmethod def sort_predictions(result_df, comparison_quantity): """ Globally sort scan predictions by ``comparison_quantity``. Score columns (those ending in ``"score"``) sort descending (stronger binders first); ``affinity`` / ``affinity_percentile`` sort ascending (lower is stronger). ``peptide`` is the secondary key. Rows tied on both keys retain their input order. The scan CLI preserves serial input order when combining parallel chunks before this sort. Returns a new DataFrame; the index is not reset. """ comparison_is_score = comparison_quantity.endswith("score") return result_df.sort_values( [comparison_quantity, "peptide"], ascending=[not comparison_is_score, True], kind="stable") def predict_sequences( self, sequences, alleles, result="best", comparison_quantity=None, filter_value=None, peptide_lengths=(8, 9, 10, 11), use_flanks=True, include_affinity_percentile=True, verbose=1, throw=True, affinity_model_kwargs=None, processing_batch_size=PREDICT_BATCH_SIZE): """ Predict presentation across protein sequences. Example: >>> predictor = Class1PresentationPredictor.load() >>> predictions = predictor.predict_sequences( ... sequences={ ... 'protein1': "MDSKGSSQKGSRLLLLLVVSNLL", ... 'protein2': "SSLPTPEDKEQAQQTHH", ... }, ... alleles={ ... "sample1": ["A0201", "A0301", "B0702"], ... "sample2": ["A0101", "C0202"], ... }, ... result="filtered", ... comparison_quantity="affinity", ... filter_value=500, ... verbose=0) >>> bool((predictions.affinity <= 500).all()) True >>> {"sequence_name", "pos", "peptide", "affinity"}.issubset(predictions.columns) True Parameters ---------- sequences : str, list of string, or string -> string dict Protein sequences. If a dict is given, the keys are arbitrary ( e.g. protein names), and the values are the amino acid sequences. alleles : list of string, list of list of string, or dict of string -> list of string MHC I alleles. Can be: (1) a string (a single allele), (2) a list of strings (a single MHC allele set), (3) a list of list of strings (multiple MHC allele sets, where the number of sets must equal the number of sequences), or (4) a dict giving multiple MHC allele sets, which will each be run over the sequences. result : string, default "best" Specify 'best' to return the strongest peptide for each sequence and sample, 'all' to return predictions for all peptides, or 'filtered' to return predictions where the comparison_quantity is stronger or equal to filter_value (<= for affinity/percentile, >= for scores). comparison_quantity : string, optional One of "presentation_score", "processing_score", "affinity", or "affinity_percentile". Prediction to use to rank (if result is "best") or filter (if result is "filtered") results. With MHC alleles, defaults to presentation when supported, else affinity; without MHC alleles, defaults to processing. filter_value : float Threshold value to use, only relevant when result is "filtered". Affinity and affinity-percentile values at or below the threshold are retained; presentation and processing scores at or above it are retained. Required when result is "filtered". peptide_lengths : sequence of int, default (8, 9, 10, 11) Peptide lengths to scan. use_flanks : bool, default True Whether to include flanking sequences when running the AP predictor (for better cleavage prediction). include_affinity_percentile : bool Whether to include affinity percentile ranks in output. verbose : int Set to 0 for quiet mode. throw : boolean Whether to throw exceptions (vs. log warnings) on invalid inputs. affinity_model_kwargs : dict, optional Keyword arguments forwarded to ``Class1AffinityPredictor.predict``. processing_batch_size : int or "auto" Batch size for antigen processing neural network prediction. Returns ------- pandas.DataFrame Includes sequence_name, zero-based pos, peptide and sample_name. Available predictor components determine affinity, best_allele, processing_score and presentation_score columns. Flank columns and percentile columns depend on inputs, options and calibration. """ if len(alleles) == 0: alleles = {} if len(alleles) > 0 and not self.supports_affinity_prediction: raise ValueError( "Affinity prediction not supported by this predictor") comparison_quantity = self.resolve_comparison_quantity( alleles, comparison_quantity) processing_predictor = self.processing_predictor_with_flanks if not use_flanks or processing_predictor is None: processing_predictor = self.processing_predictor_without_flanks if processing_predictor is not None: supported_sequence_lengths = processing_predictor.sequence_lengths n_flank_length = supported_sequence_lengths["n_flank"] c_flank_length = supported_sequence_lengths["c_flank"] else: n_flank_length = 0 c_flank_length = 0 sequence_names = [] n_flanks = [] if use_flanks else None c_flanks = [] if use_flanks else None peptides = [] if isinstance(sequences, str): sequences = [sequences] if not isinstance(sequences, dict): sequences = collections.OrderedDict( ("sequence_%04d" % (i + 1), sequence) for (i, sequence) in enumerate(sequences)) cross_product = True if isinstance(alleles, str): # Case (1) - alleles is a string alleles = [alleles] if isinstance(alleles, dict): if any([isinstance(v, str) for v in alleles.values()]): raise ValueError( "The values in the alleles dict must be lists, not strings") else: if all(isinstance(a, str) for a in alleles): # Case (2) - a simple list of alleles alleles = { 'sample1': alleles } else: # Case (3) - a list of lists alleles = collections.OrderedDict( ("genotype_%04d" % (i + 1), genotype) for (i, genotype) in enumerate(alleles)) cross_product = False if len(alleles) != len(sequences): raise ValueError( "When passing a list of lists for the alleles argument " "the length of the list (%d) must match the length of " "the sequences being predicted (%d)" % ( len(alleles), len(sequences))) if not isinstance(alleles, dict): raise ValueError("Invalid type for alleles: ", type(alleles)) sample_names = None if cross_product else [] genotype_names = list(alleles) position_in_sequence = [] for (i, (name, sequence)) in enumerate(sequences.items()): genotype_name = None if cross_product else genotype_names[i] if not isinstance(sequence, str): raise ValueError("Expected string, not %s (%s)" % ( sequence, type(sequence))) for peptide_start in range(len(sequence) - min(peptide_lengths) + 1): n_flank_start = max(0, peptide_start - n_flank_length) for peptide_length in peptide_lengths: peptide = sequence[ peptide_start: peptide_start + peptide_length ] if len(peptide) != peptide_length: continue c_flank_end = ( peptide_start + peptide_length + c_flank_length) sequence_names.append(name) position_in_sequence.append(peptide_start) if not cross_product: sample_names.append(genotype_name) peptides.append(peptide) if use_flanks: n_flanks.append( sequence[n_flank_start : peptide_start]) c_flanks.append( sequence[peptide_start + peptide_length : c_flank_end]) result_df = self.predict( peptides=peptides, alleles=alleles, n_flanks=n_flanks, c_flanks=c_flanks, sample_names=sample_names, include_affinity_percentile=include_affinity_percentile, verbose=verbose, throw=throw, affinity_model_kwargs=affinity_model_kwargs, processing_batch_size=processing_batch_size) sequence_metadata = pandas.DataFrame({ "sequence_name": result_df.peptide_num.map( pandas.Series(sequence_names) ), "pos": result_df.peptide_num.map( pandas.Series(position_in_sequence) ), }) result_df = pandas.concat( [sequence_metadata, result_df.drop(columns=["peptide_num"])], axis=1, ) comparison_is_score = comparison_quantity.endswith("score") result_df = self.sort_predictions(result_df, comparison_quantity) if result == "best": result_df = result_df.drop_duplicates( ["sequence_name", "sample_name"], keep="first" ).sort_values("sequence_name") elif result == "filtered": if comparison_is_score: result_df = result_df.loc[ result_df[comparison_quantity] >= filter_value ] else: result_df = result_df.loc[ result_df[comparison_quantity] <= filter_value ] elif result == "all": pass else: raise ValueError( "Unknown result: %s. Valid choices are: best, filtered, all" % result) result_df = result_df.reset_index(drop=True) result_df = result_df.copy() return result_df def save( self, models_dir, write_affinity_predictor=True, write_processing_predictor=True, write_weights=True, write_percent_ranks=True, write_info=True, write_metadata=True): """ Save the predictor to a directory on disk. If the directory does not exist it will be created. The wrapped Class1AffinityPredictor and Class1ProcessingPredictor instances are included in the saved data. Parameters ---------- models_dir : string Path to directory. It will be created if it doesn't exist. write_affinity_predictor : bool, default True Save the embedded affinity ensemble. write_processing_predictor : bool, default True Save the available embedded processing ensembles. write_weights : bool, default True Save fitted logistic-regression coefficients; requires a fitted model. write_percent_ranks : bool, default True Replace the presentation calibration with its current state. write_info : bool, default True Write save-time package, host and release-provenance metadata. write_metadata : bool, default True Write dataframes in metadata_dataframes. """ if write_weights and self.weights_dataframe is None: raise RuntimeError("Can't save before fitting") if not exists(models_dir): mkdir(models_dir) # Save underlying predictors if write_affinity_predictor: self.affinity_predictor.save(join(models_dir, "affinity_predictor")) if write_processing_predictor: if self.processing_predictor_with_flanks is not None: self.processing_predictor_with_flanks.save( join(models_dir, "processing_predictor_with_flanks")) if self.processing_predictor_without_flanks is not None: self.processing_predictor_without_flanks.save( join(models_dir, "processing_predictor_without_flanks")) if write_weights: # Save model coefficients. self.weights_dataframe.to_csv(join(models_dir, "weights.csv")) if write_percent_ranks: save_percent_rank_transforms(models_dir, { "presentation_score": self.percent_rank_transform } if self.percent_rank_transform is not None else {}) if write_info: # Write "info.txt" info_path = join(models_dir, "info.txt") rows = [ ("trained on", time.asctime()), ("package ", "mhcflurry %s" % __version__), ("hostname ", gethostname()), ("user ", getuser()), ] add_release_provenance(rows) pandas.DataFrame(rows).to_csv( info_path, sep="\t", header=False, index=False) if write_metadata: if self.metadata_dataframes: for (name, df) in self.metadata_dataframes.items(): metadata_df_path = join(models_dir, "%s.csv.bz2" % name) df.to_csv(metadata_df_path, index=False, compression="bz2") @classmethod def load(cls, models_dir=None, max_models=None): """ Deserialize a predictor from a directory on disk. This will also load the wrapped Class1AffinityPredictor and Class1ProcessingPredictor instances. Parameters ---------- models_dir : string Path to directory. If unspecified the default downloaded models are used. max_models : int, optional Maximum number of affinity and processing (counted separately) models to load Returns ------- `Class1PresentationPredictor` instance """ if models_dir is None: models_dir = get_default_class1_presentation_models_dir() affinity_predictor = Class1AffinityPredictor.load( join(models_dir, "affinity_predictor"), max_models=max_models) processing_predictor_with_flanks = None if exists(join(models_dir, "processing_predictor_with_flanks")): processing_predictor_with_flanks = Class1ProcessingPredictor.load( join(models_dir, "processing_predictor_with_flanks"), max_models=max_models) else: logging.warning( "Presentation predictor is missing processing predictor: %s", join(models_dir, "processing_predictor_with_flanks")) processing_predictor_without_flanks = None if exists(join(models_dir, "processing_predictor_without_flanks")): processing_predictor_without_flanks = Class1ProcessingPredictor.load( join(models_dir, "processing_predictor_without_flanks"), max_models=max_models) else: logging.warning( "Presentation predictor is missing processing predictor: %s", join(models_dir, "processing_predictor_without_flanks")) weights_dataframe = pandas.read_csv( join(models_dir, "weights.csv"), index_col=0) # Load percent ranks if available percent_rank_transform = load_percent_rank_transforms(models_dir).get("presentation_score") provenance_string = None try: info_path = join(models_dir, "info.txt") info = pandas.read_csv( info_path, sep="\t", header=None, index_col=0).iloc[ :, 0 ].to_dict() provenance_string = "generated on %s" % info["trained on"] except OSError: pass result = cls( affinity_predictor=affinity_predictor, processing_predictor_with_flanks=processing_predictor_with_flanks, processing_predictor_without_flanks=processing_predictor_without_flanks, weights_dataframe=weights_dataframe, percent_rank_transform=percent_rank_transform, provenance_string=provenance_string) return result def __repr__(self): pieces = ["at 0x%0x" % id(self), "[mhcflurry %s]" % __version__] if self.provenance_string: pieces.append(self.provenance_string) return "" % " ".join(pieces) def percentile_ranks(self, presentation_scores, throw=True): """ Return percentile ranks for the given presentation scores. Parameters ---------- presentation_scores : sequence of float Raw presentation scores, not peptide sequences. throw : bool, default True Raise when calibration is absent. False warns and returns NaNs. Returns ------- numpy.array of float Upper-tail percentiles from 0 to 100; lower means stronger. """ if self.percent_rank_transform is None: msg = "No presentation predictor percentile rank information" if throw: raise ValueError(msg) warnings.warn(msg) return numpy.ones(len(presentation_scores)) * numpy.nan return self.percent_rank_transform.transform(presentation_scores, survival=True) def calibrate_percentile_ranks(self, scores, bins=None, *, method=None, max_knots=128, groups=None): """ Compute the cumulative distribution of scores, to enable taking quantiles of this distribution later. Parameters ---------- scores : sequence of float Presentation prediction scores bins : object Anything that can be passed to numpy.histogram's "bins" argument can be used here, i.e. either an integer or a sequence giving bin edges. Explicit bins select the historical histogram method. method : {"compact", "histogram"}, optional Defaults to compact unless bins are specified. Loading a saved predictor never recalibrates it. max_knots : {64, 128}, default 128 Upper bound, not a starting size. Compact starts with 64; 128 requires a background-validation improvement beyond the tolerance. Ignored for histogram calibration. groups : sequence, optional Background peptide identities to keep together during validation. """ method = calibration_method(method, bins) if method == "histogram" and bins is None: bins = presentation_percent_rank_bins(scores) self.percent_rank_transform = fit_percent_rank_transform( scores, method=method, bins=bins, score_transform="logit", survival=True, max_knots=max_knots, groups=groups) mhcflurry-2.3.6/mhcflurry/class1_processing_neural_network.py000066400000000000000000002227451525677230600247140ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Antigen processing neural network implementation - PyTorch version """ import time import collections import json import logging import math import numpy import torch import torch.nn as nn from . import amino_acid from .hyperparameters import HyperparameterDefaults from .class1_training import torch_from_numpy, validation_split_counts from .keras_optimizers import KerasAdam, KerasRMSprop from .pytorch_sizing import DEFAULT_PREDICT_BATCH_SIZE, env_workers_per_gpu from .pytorch_layers import KerasBatchNorm1d, get_activation from .flanking_encoding import FlankingEncoding from .common import get_pytorch_device from .pytorch_training import ( copy_module_state_dict_to_cpu, configure_matmul_precision, effective_validation_batch_size, maybe_compile_loss, maybe_compile_network, uncompiled_network, validation_forward_network, ) class Class1ProcessingModel(nn.Module): """ PyTorch module for antigen processing prediction. """ def __init__( self, sequence_dims, n_flank_length, c_flank_length, peptide_max_length, flanking_averages, convolutional_filters, convolutional_kernel_size, convolutional_activation, convolutional_kernel_l1_l2, dropout_rate, post_convolutional_dense_layer_sizes, sequence_input_is_indices=False, sequence_input_vector_encoding_name=None, init="glorot_uniform", normalization="none", cleavage_boundary_flank_length=0, cleavage_boundary_peptide_length=0, cleavage_boundary_hidden_size=32, cleavage_boundary_context_dropout=0.0, convolutional_padding_mode="zeros"): super(Class1ProcessingModel, self).__init__() self.n_flank_length = n_flank_length self.c_flank_length = c_flank_length self.peptide_max_length = peptide_max_length self.base_n_flank_length = n_flank_length self.flanking_averages = flanking_averages self.sequence_input_is_indices = bool(sequence_input_is_indices) self.cleavage_boundary_flank_length = int( cleavage_boundary_flank_length) self.cleavage_boundary_peptide_length = int( cleavage_boundary_peptide_length) self.cleavage_boundary_hidden_size = int( cleavage_boundary_hidden_size) self.cleavage_boundary_context_dropout = float( cleavage_boundary_context_dropout) boundary_values = ( self.cleavage_boundary_flank_length, self.cleavage_boundary_peptide_length, ) if any(value < 0 for value in boundary_values): raise ValueError("Cleavage-boundary lengths must be nonnegative") if bool(boundary_values[0]) != bool(boundary_values[1]): raise ValueError( "Cleavage-boundary flank and peptide lengths must both be " "zero or both be positive") self.cleavage_boundary_enabled = bool(boundary_values[0]) if self.cleavage_boundary_enabled: if self.cleavage_boundary_flank_length > min( n_flank_length, c_flank_length): raise ValueError( "Cleavage-boundary external context exceeds configured " "flank lengths") if self.cleavage_boundary_peptide_length > peptide_max_length: raise ValueError( "Cleavage-boundary peptide context exceeds peptide maximum") if self.cleavage_boundary_hidden_size < 1: raise ValueError( "cleavage_boundary_hidden_size must be positive") if flanking_averages: raise ValueError( "Cleavage-boundary models require flanking_averages=False " "so the base path is peptide-only") self.base_n_flank_length = 0 if not 0 <= self.cleavage_boundary_context_dropout <= 1: raise ValueError( "cleavage_boundary_context_dropout must be between 0 and 1") if sequence_input_vector_encoding_name is None: sequence_input_vector_encoding_name = "BLOSUM62" self.sequence_input_vector_encoding_name = ( sequence_input_vector_encoding_name) # Input channels from sequence encoding if self.sequence_input_is_indices: in_channels = amino_acid.vector_encoding_length( sequence_input_vector_encoding_name ) self.register_buffer( "sequence_embedding_table", torch.from_numpy(amino_acid.vector_encoding_index_table( sequence_input_vector_encoding_name )), persistent=False, ) else: in_channels = sequence_dims[1] self.n_boundary_hidden = None self.c_boundary_hidden = None self.n_boundary_output = None self.c_boundary_output = None if self.cleavage_boundary_enabled: window_length = ( self.cleavage_boundary_flank_length + self.cleavage_boundary_peptide_length) boundary_input_size = in_channels * window_length self.n_boundary_hidden = nn.Linear( boundary_input_size, self.cleavage_boundary_hidden_size) self.c_boundary_hidden = nn.Linear( boundary_input_size, self.cleavage_boundary_hidden_size) self.n_boundary_output = nn.Linear( self.cleavage_boundary_hidden_size, 1) self.c_boundary_output = nn.Linear( self.cleavage_boundary_hidden_size, 1) # Main convolutional layer if convolutional_padding_mode not in {"zeros", "unknown"}: raise ValueError("convolutional_padding_mode must be zeros or unknown") self.convolutional_padding_mode = convolutional_padding_mode self.convolutional_context_padding = ( (convolutional_kernel_size - 1) // 2, convolutional_kernel_size // 2, ) self.conv1 = nn.Conv1d( in_channels=in_channels, out_channels=convolutional_filters, kernel_size=convolutional_kernel_size, padding='same' if convolutional_padding_mode == "zeros" else 0, ) # Activation function self.conv_activation = get_activation(convolutional_activation) if self.conv_activation is None: self.conv_activation = lambda value: value normalization = str(normalization or "none").lower() if normalization not in {"none", "batch", "layer"}: raise ValueError( "normalization must be one of none, batch, or layer; got %r" % normalization ) self.normalization = normalization if normalization == "batch": self.normalization_layer = KerasBatchNorm1d( convolutional_filters, eps=1e-3, momentum=0.01, ) elif normalization == "layer": self.normalization_layer = nn.LayerNorm(convolutional_filters) else: self.normalization_layer = None # Dropout self.dropout_rate = dropout_rate if dropout_rate > 0: self.dropout = nn.Dropout1d(p=dropout_rate) else: self.dropout = None # Post-convolutional dense layers for each flank # These are implemented as 1D convolutions with kernel_size=1 layer_sizes = list(post_convolutional_dense_layer_sizes) + [1] self.n_flank_post_convs = nn.ModuleList() self.c_flank_post_convs = nn.ModuleList() current_channels = convolutional_filters for i, size in enumerate(layer_sizes): self.n_flank_post_convs.append(nn.Conv1d( in_channels=current_channels, out_channels=size, kernel_size=1 )) self.c_flank_post_convs.append(nn.Conv1d( in_channels=current_channels, out_channels=size, kernel_size=1 )) current_channels = size # Dense layers for flanking averages (if enabled) self.n_flank_avg_dense = None self.c_flank_avg_dense = None if flanking_averages: if n_flank_length > 0: self.n_flank_avg_dense = nn.Linear(convolutional_filters, 1) if c_flank_length > 0: self.c_flank_avg_dense = nn.Linear(convolutional_filters, 1) # Final output layer # Number of inputs: 2 from n_flank (cleaved + max_pool) + 2 from c_flank # Plus optional flanking averages num_final_inputs = 4 if flanking_averages and n_flank_length > 0: num_final_inputs += 1 if flanking_averages and c_flank_length > 0: num_final_inputs += 1 if self.cleavage_boundary_enabled: num_final_inputs += 2 self.output_layer = nn.Linear(num_final_inputs, 1) # Keras Conv1D and Dense default to GlorotUniform with zero biases. # Keep the rejected port's former Kaiming behavior selectable for # controlled ablations, but never implicit. for module in self.modules(): if not isinstance(module, (nn.Conv1d, nn.Linear)): continue if init == "glorot_uniform": nn.init.xavier_uniform_(module.weight) if module.bias is not None: nn.init.zeros_(module.bias) elif init == "kaiming_uniform_fan_in": nn.init.kaiming_uniform_(module.weight, a=math.sqrt(5)) if module.bias is not None: fan_in, _ = nn.init._calculate_fan_in_and_fan_out( module.weight) bound = 1 / math.sqrt(fan_in) if fan_in > 0 else 0 nn.init.uniform_(module.bias, -bound, bound) else: raise ValueError("Unsupported processing initializer: %s" % init) # Initialize output weights to ones (like Keras initializers.Ones()) nn.init.ones_(self.output_layer.weight) nn.init.zeros_(self.output_layer.bias) if self.cleavage_boundary_enabled: # Start at the peptide-only model. The boundary paths acquire # influence only when supported by the training objective. with torch.no_grad(): self.output_layer.weight[:, -2:] = 0 def forward(self, inputs): """ Forward pass. Parameters ---------- inputs : dict Dictionary with 'sequence' and 'peptide_length' keys Returns ------- torch.Tensor Predictions of shape (batch,) """ sequence = inputs['sequence'] # (batch, seq_len, channels) peptide_length = inputs['peptide_length'] # (batch, 1) if self.sequence_input_is_indices and sequence.dim() == 2: sequence = torch.nn.functional.embedding( sequence.long(), self.sequence_embedding_table ) boundary_outputs = [] if self.cleavage_boundary_enabled: n_window, c_window = self._extract_boundary_windows( sequence, peptide_length) n_window, c_window = self._apply_context_dropout( n_window, c_window) boundary_outputs = [ self._boundary_output( n_window, self.n_boundary_hidden, self.n_boundary_output), self._boundary_output( c_window, self.c_boundary_hidden, self.c_boundary_output), ] sequence = self._peptide_only_sequence(sequence, peptide_length) sequence = self._pad_convolution_context(sequence) # Transpose for Conv1d: (batch, channels, seq_len) x = sequence.permute(0, 2, 1) # Apply main convolution x = self.conv1(x) x = self.conv_activation(x) if self.normalization_layer is not None: if self.normalization == "layer": x = self.normalization_layer(x.transpose(1, 2)).transpose(1, 2) else: x = self.normalization_layer(x) if self.dropout is not None: # Spatial dropout: same dropout mask for all positions # Equivalent to Keras Dropout with noise_shape=(None, 1, channels) x = self.dropout(x) # Transpose back: (batch, seq_len, channels) convolutional_result = x.permute(0, 2, 1) outputs_for_final = [] # Process n_flank n_flank_outputs = self._process_n_flank( convolutional_result, peptide_length ) outputs_for_final.extend(n_flank_outputs) # Process c_flank c_flank_outputs = self._process_c_flank( convolutional_result, peptide_length ) outputs_for_final.extend(c_flank_outputs) outputs_for_final.extend(boundary_outputs) # Concatenate all outputs combined = torch.cat(outputs_for_final, dim=-1) # Final output output = torch.sigmoid(self.output_layer(combined)) return output.squeeze(-1) def _pad_convolution_context(self, sequence): """Pad unavailable context with X without shifting output coordinates. Zero padding remains the default for compatibility with saved models. Known flanks must already be placed next to the actual peptide by the encoder; this method only extends the encoded sequence at its ends. """ if self.convolutional_padding_mode == "zeros": return sequence left, right = self.convolutional_context_padding unknown = self._unknown_embedding(sequence).view(1, 1, -1) return torch.cat([ unknown.expand(sequence.size(0), left, -1), sequence, unknown.expand(sequence.size(0), right, -1), ], dim=1) def _unknown_embedding(self, sequence): """Return the configured vector representation of the X token.""" if self.sequence_input_is_indices: return self.sequence_embedding_table[amino_acid.X_INDEX].to( dtype=sequence.dtype, device=sequence.device) table = amino_acid.vector_encoding_index_table( self.sequence_input_vector_encoding_name) return torch.as_tensor( table[amino_acid.X_INDEX], dtype=sequence.dtype, device=sequence.device, ) def _extract_boundary_windows(self, sequence, peptide_length): """Extract N and C windows spanning their respective cut sites.""" external = self.cleavage_boundary_flank_length internal = self.cleavage_boundary_peptide_length n_window = sequence[ :, self.n_flank_length - external:self.n_flank_length + internal, ] peptide_length = peptide_length.view(-1).long() unknown = self._unknown_embedding(sequence).view(1, 1, -1) n_offsets = torch.arange( -external, internal, device=sequence.device).view(1, -1) n_window = torch.where( (n_offsets < peptide_length.view(-1, 1)).unsqueeze(-1), n_window, unknown) offsets = torch.arange( -internal, external, device=sequence.device).view(1, -1) positions = ( self.n_flank_length + peptide_length.view(-1, 1) + offsets) positions = positions.unsqueeze(-1).expand(-1, -1, sequence.size(2)) c_window = sequence.gather(1, positions.clamp(0, sequence.size(1) - 1)) c_window = torch.where( (offsets >= -peptide_length.view(-1, 1)).unsqueeze(-1), c_window, unknown) return n_window, c_window def _apply_context_dropout(self, n_window, c_window): """Replace complete external N/C segments with X during training.""" probability = self.cleavage_boundary_context_dropout if not self.training or probability <= 0: return n_window, c_window batch_size = n_window.size(0) external = self.cleavage_boundary_flank_length internal = self.cleavage_boundary_peptide_length unknown = self._unknown_embedding(n_window).view(1, 1, -1) n_dropped = torch.rand( batch_size, 1, 1, device=n_window.device) < probability c_dropped = torch.rand( batch_size, 1, 1, device=c_window.device) < probability n_window = n_window.clone() c_window = c_window.clone() n_window[:, :external] = torch.where( n_dropped, unknown, n_window[:, :external]) c_window[:, internal:] = torch.where( c_dropped, unknown, c_window[:, internal:]) return n_window, c_window def _peptide_only_sequence(self, sequence, peptide_length): """Return the exact sequence representation used by no-flank models.""" positions = torch.arange( sequence.size(1), device=sequence.device).view(1, -1) starts = self.n_flank_length ends = starts + peptide_length.view(-1, 1) peptide_mask = (positions >= starts) & (positions < ends) unknown = self._unknown_embedding(sequence).view(1, 1, -1) masked = torch.where(peptide_mask.unsqueeze(-1), sequence, unknown) return masked[:, starts:starts + self.peptide_max_length] def _boundary_output(self, window, hidden_layer, output_layer): """Apply one cleavage-site-specific residual branch.""" hidden = self.conv_activation(hidden_layer(window.flatten(start_dim=1))) return torch.tanh(output_layer(hidden)) def _process_n_flank(self, conv_result, peptide_length): """Process n_flank feature extraction.""" outputs = [] # Apply post-convolutional layers # Transpose for Conv1d x = conv_result.permute(0, 2, 1) for i, conv_layer in enumerate(self.n_flank_post_convs): x = conv_layer(x) if i < len(self.n_flank_post_convs) - 1: x = self.conv_activation(x) else: x = torch.tanh(x) # Final layer always tanh # Transpose back single_output_result = x.permute(0, 2, 1) # (batch, seq_len, 1) # Extract at cleavage position (n_flank_length) cleaved = single_output_result[ :, self.base_n_flank_length, :] # (batch, 1) outputs.append(cleaved) # Max pool over peptide (excluding first position) max_pool = self._max_pool_over_peptide_n( single_output_result, peptide_length ) outputs.append(max_pool) # Optional flanking average if self.n_flank_avg_dense is not None and self.n_flank_length > 0: avg = self._extract_n_flank_avg(conv_result) dense_out = torch.tanh(self.n_flank_avg_dense(avg)) # (batch, 1) outputs.append(dense_out) return outputs def _process_c_flank(self, conv_result, peptide_length): """Process c_flank feature extraction.""" outputs = [] # Apply post-convolutional layers x = conv_result.permute(0, 2, 1) for i, conv_layer in enumerate(self.c_flank_post_convs): x = conv_layer(x) if i < len(self.c_flank_post_convs) - 1: x = self.conv_activation(x) else: x = torch.tanh(x) single_output_result = x.permute(0, 2, 1) # (batch, seq_len, 1) # Extract at cleavage position (dynamic based on peptide_length) cleaved = self._extract_c_cleavage(single_output_result, peptide_length) outputs.append(cleaved) # Max pool over peptide (excluding last position) max_pool = self._max_pool_over_peptide_c( single_output_result, peptide_length ) outputs.append(max_pool) # Optional flanking average if self.c_flank_avg_dense is not None and self.c_flank_length > 0: # Average over c_flank region (dynamic based on peptide_length) avg = self._extract_c_flank_avg(conv_result, peptide_length) dense_out = torch.tanh(self.c_flank_avg_dense(avg)) outputs.append(dense_out) return outputs def _max_pool_over_peptide_n(self, x, peptide_length): """ Max pool over peptide region excluding first position. For n_flank cleavage site. """ batch_size, seq_len, features = x.shape peptide_length = peptide_length.view(-1) # Create position indices positions = torch.arange(seq_len, device=x.device).unsqueeze(0) # Mask: 1 for positions from n_flank_length+1 to n_flank_length+peptide_length starts = self.base_n_flank_length + 1 ends = (self.base_n_flank_length + peptide_length).unsqueeze(1) mask = (positions >= starts) & (positions < ends) # (batch, seq_len) # Apply mask (assuming x >= -1 from tanh) x_shifted = x + 1 mask_expanded = mask.unsqueeze(-1).float() masked_x = x_shifted * mask_expanded max_value = masked_x.max(dim=1)[0] - 1 # (batch, features) # Flip sign return -1 * max_value def _max_pool_over_peptide_c(self, x, peptide_length): """ Max pool over peptide region excluding last position. For c_flank cleavage site. """ batch_size, seq_len, features = x.shape peptide_length = peptide_length.view(-1) positions = torch.arange(seq_len, device=x.device).unsqueeze(0) # Mask: 1 for positions from n_flank_length to n_flank_length+peptide_length-1 starts = self.base_n_flank_length ends = (self.base_n_flank_length + peptide_length - 1).unsqueeze(1) mask = (positions >= starts) & (positions < ends) x_shifted = x + 1 mask_expanded = mask.unsqueeze(-1).float() masked_x = x_shifted * mask_expanded max_value = masked_x.max(dim=1)[0] - 1 return -1 * max_value def _extract_c_cleavage(self, x, peptide_length): """Extract at c-terminal cleavage position.""" peptide_length = peptide_length.view(-1) indices = self.base_n_flank_length + peptide_length - 1 batch_size = x.size(0) indices = indices.long().view(batch_size, 1, 1).expand(-1, -1, x.size(2)) result = x.gather(1, indices).squeeze(1) # (batch, features) return result def _extract_c_flank_avg(self, conv_result, peptide_length): """ Average over c-flank region using TF-compatible masking semantics. In TF/Keras this is implemented as: reduce_mean((x + 1) * mask, axis=1) - 1 which averages across the full sequence axis (not only masked positions). """ batch_size, seq_len, features = conv_result.shape peptide_length = peptide_length.view(-1) positions = torch.arange(seq_len, device=conv_result.device).unsqueeze(0) # Mask: 1 for c_flank positions starts = (self.n_flank_length + peptide_length).unsqueeze(1) ends = starts + self.c_flank_length mask = (positions >= starts) & (positions < ends) x_shifted = conv_result + 1 mask_expanded = mask.unsqueeze(-1).float() avg_value = (x_shifted * mask_expanded).mean(dim=1) - 1 return avg_value def _extract_n_flank_avg(self, conv_result): """ Average over n-flank region using TF-compatible masking semantics. In TF/Keras this is implemented as: reduce_mean((x + 1) * mask, axis=1) - 1 where mask selects n-flank positions. """ _, seq_len, _ = conv_result.shape positions = torch.arange(seq_len, device=conv_result.device).unsqueeze(0) mask = (positions >= 0) & (positions < self.n_flank_length) mask_expanded = mask.unsqueeze(-1).float() x_shifted = conv_result + 1 avg_value = (x_shifted * mask_expanded).mean(dim=1) - 1 return avg_value def get_weights_list(self, state_dict=None): """Copy weights in NPZ order, optionally from a retained module state.""" weights = [] for name, value in list(self.named_parameters()) + list(self._named_persistent_buffers()): if state_dict is not None: value = state_dict[name] weights.append(value.detach().cpu().numpy().copy()) return weights def _named_persistent_buffers(self): """Yield named buffers that belong in mhcflurry's NPZ weights.""" modules = dict(self.named_modules()) for name, buffer in self.named_buffers(): module = self buffer_name = name if "." in name: module_path, buffer_name = name.rsplit(".", 1) module = modules[module_path] if buffer_name in module._non_persistent_buffers_set: continue yield name, buffer def set_weights_list(self, weights, auto_convert_keras=True): """ Set weights from a list of numpy arrays. Supports automatic detection and conversion of Keras-format weights. Parameters ---------- weights : list of numpy.ndarray auto_convert_keras : bool If True, automatically detect and convert Keras-format weights """ # Keras stores weights in layer definition order which interleaves # n_flank and c_flank post-conv layers: # conv1, n_post_0, c_post_0, n_post_1, c_post_1, n_avg, c_avg, output # PyTorch ModuleList stores: # conv1, n_post_0, n_post_1, c_post_0, c_post_1, n_avg, c_avg, output # We need to reorder Keras weights to match PyTorch parameter order if auto_convert_keras: weights = self._reorder_keras_weights(list(weights)) idx = 0 for name, param in self.named_parameters(): w = weights[idx].astype(numpy.float32) # Auto-detect and convert Keras weights if shapes don't match if auto_convert_keras and w.shape != param.shape: # Dense/Linear: Keras (in, out) -> PyTorch (out, in) if len(w.shape) == 2 and w.shape == param.shape[::-1]: w = w.T # Conv1D: Keras (k, in_ch, out_ch) -> PyTorch (out_ch, in_ch, k) elif len(w.shape) == 3 and w.shape == (param.shape[2], param.shape[1], param.shape[0]): w = w.transpose(2, 1, 0) if w.shape != param.shape: raise ValueError( f"Weight shape mismatch for {name}: " f"got {weights[idx].shape}, expected {param.shape}" ) param.data = torch.from_numpy(w).to( device=param.device, dtype=param.dtype, ) idx += 1 named_modules_dict = dict(self.named_modules()) for name, buffer in self._named_persistent_buffers(): tensor = torch.from_numpy(weights[idx]).to( device=buffer.device, dtype=buffer.dtype, ) if "." in name: module_path, buffer_name = name.rsplit(".", 1) named_modules_dict[module_path]._buffers[buffer_name] = tensor else: self._buffers[name] = tensor idx += 1 def _reorder_keras_weights(self, weights): """ Reorder Keras weights to match PyTorch parameter order. Keras interleaves n_flank and c_flank post-conv layers: conv1, n_post_0, c_post_0, n_post_1, c_post_1, ..., n_avg, c_avg, output PyTorch has: conv1, n_post_0, n_post_1, ..., c_post_0, c_post_1, ..., n_avg, c_avg, output Returns ------- list of numpy.ndarray """ # Count how many post-conv layers there are (each has weight + bias) n_post_conv_layers = len(self.n_flank_post_convs) if n_post_conv_layers == 0: return weights # Find indices in Keras weight list # Structure: conv1_w, conv1_b, [n_post_i_w, n_post_i_b, c_post_i_w, c_post_i_b]..., # n_avg_w, n_avg_b, c_avg_w, c_avg_b, out_w, out_b reordered = [] # Conv1 weights (indices 0, 1) reordered.append(weights[0]) reordered.append(weights[1]) # Keras has interleaved: n_post_0, c_post_0, n_post_1, c_post_1, ... # We need: n_post_0, n_post_1, ..., c_post_0, c_post_1, ... post_conv_start = 2 post_conv_end = post_conv_start + n_post_conv_layers * 4 # 4 = n_w, n_b, c_w, c_b per layer # Extract n_flank and c_flank post-conv weights separately n_flank_weights = [] c_flank_weights = [] for i in range(n_post_conv_layers): keras_idx = post_conv_start + i * 4 n_flank_weights.append(weights[keras_idx]) # n_post_i_w n_flank_weights.append(weights[keras_idx + 1]) # n_post_i_b c_flank_weights.append(weights[keras_idx + 2]) # c_post_i_w c_flank_weights.append(weights[keras_idx + 3]) # c_post_i_b # Add in PyTorch order: all n_flank first, then all c_flank reordered.extend(n_flank_weights) reordered.extend(c_flank_weights) # Remaining weights (avg dense and output) stay in same order reordered.extend(weights[post_conv_end:]) return reordered _warned_legacy_sequence_vector_encoding = set() def _warn_legacy_sequence_vector_encoding(value): """Warn once per distinct deprecated value that the dense-vector path is gone. Dedup is keyed on ``value`` rather than a single process-wide flag so that a second, *different* legacy config still surfaces a warning (the previous once-per-process behavior silently swallowed every config after the first). """ try: key = value if key in _warned_legacy_sequence_vector_encoding: return _warned_legacy_sequence_vector_encoding.add(key) except TypeError: # Unhashable value: fall back to warning every time rather than crash. pass logging.warning( "amino_acid_encoding_torch=%r is deprecated and ignored: " "processing-model sequences are always index-encoded and embedded " "on device. The legacy dense-vector path has been removed.", value) class Class1ProcessingNeuralNetwork(object): """ A neural network for antigen processing prediction """ network_hyperparameter_defaults = HyperparameterDefaults( amino_acid_encoding="BLOSUM62", amino_acid_encoding_torch=True, peptide_max_length=15, n_flank_length=10, c_flank_length=10, flanking_averages=False, convolutional_filters=16, convolutional_kernel_size=8, convolutional_padding_mode="zeros", convolutional_activation="tanh", convolutional_kernel_l1_l2=[0.0001, 0.0001], dropout_rate=0.5, post_convolutional_dense_layer_sizes=[], init="glorot_uniform", normalization="none", cleavage_boundary_flank_length=0, cleavage_boundary_peptide_length=0, cleavage_boundary_hidden_size=32, cleavage_boundary_context_dropout=0.0, ) """ Hyperparameters (and their default values) that affect the neural network architecture. """ fit_hyperparameter_defaults = HyperparameterDefaults( max_epochs=500, validation_split=0.1, early_stopping=True, minibatch_size=512, validation_batch_size=None, initialization_method="none", initialization_batch_size=512, ) """ Hyperparameters for neural network training. """ early_stopping_hyperparameter_defaults = HyperparameterDefaults( patience=30, min_delta=0.0, restore_best_weights=False, save_all_checkpoints=False, monitor_validation_ranking=False, checkpoint_metric="val_loss", ) """ Hyperparameters for early stopping. """ compile_hyperparameter_defaults = HyperparameterDefaults( optimizer="adam", optimizer_implementation="keras", learning_rate=None, ) """ Loss and optimizer hyperparameters. """ auxiliary_input_hyperparameter_defaults = HyperparameterDefaults() """ Allele feature hyperparameters. """ hyperparameter_defaults = ( network_hyperparameter_defaults.extend(fit_hyperparameter_defaults) .extend(early_stopping_hyperparameter_defaults) .extend(compile_hyperparameter_defaults) .extend(auxiliary_input_hyperparameter_defaults) ) def __init__(self, **hyperparameters): self.hyperparameters = self.hyperparameter_defaults.with_defaults( hyperparameters ) # The legacy dense-vector sequence encoding path is gone: sequences are # always index-encoded and embedded on device. A falsy # ``amino_acid_encoding_torch`` is accepted but ignored (with a one-time # deprecation warning) so existing configs still load; the value is left # untouched in ``self.hyperparameters``. if not self.hyperparameters.get("amino_acid_encoding_torch"): _warn_legacy_sequence_vector_encoding( self.hyperparameters.get("amino_acid_encoding_torch")) self._network = None self.network_json = None self.network_weights = None self.fit_info = [] self.checkpoint_weights = {} @property def sequence_lengths(self): """ Supported maximum sequence lengths Returns ------- dict of string -> int Keys are "peptide", "n_flank", "c_flank". Values give the maximum supported sequence length. """ return { "peptide": self.hyperparameters["peptide_max_length"], "n_flank": self.hyperparameters["n_flank_length"], "c_flank": self.hyperparameters["c_flank_length"], } def get_device(self): """Get the PyTorch device to use.""" return get_pytorch_device() def network(self): """ Return the PyTorch model associated with this network. """ if self._network is None and self.network_json is not None: # Re-create the network using hyperparameters self._network = self.make_network( **self.network_hyperparameter_defaults.subselect(self.hyperparameters) ) if self.network_weights is not None: # Detect if weights are from Keras or PyTorch format # Keras JSON has 'class_name': 'Model', PyTorch has 'hyperparameters' try: config = json.loads(self.network_json) is_keras_format = config.get('class_name') in ('Model', 'Functional') except (json.JSONDecodeError, TypeError): is_keras_format = False self._network.set_weights_list( self.network_weights, auto_convert_keras=is_keras_format ) return self._network @staticmethod def _regularized_parameters(network): """ Parameters subject to convolution kernel regularization. """ for name, param in network.named_parameters(): if not param.requires_grad or not name.endswith("weight"): continue if ( name == "conv1.weight" or name.startswith("n_boundary_") or name.startswith("c_boundary_") or "n_flank_post_convs" in name or "c_flank_post_convs" in name): yield param @staticmethod def _regularization_penalty(parameters, l1=0.0, l2=0.0): """ Match Keras kernel_regularizer semantics used on convolution kernels. """ parameters = tuple(parameters) if not parameters or (not l1 and not l2): return None penalty = torch.zeros((), device=parameters[0].device) for param in parameters: if l1: penalty = penalty + (l1 * param.abs().sum()) if l2: penalty = penalty + (l2 * param.square().sum()) return penalty def update_network_description(self): """ Update self.network_json and self.network_weights properties based on this instances's neural network. """ if self._network is not None: # Store hyperparameters as JSON (not the actual model structure) self.network_json = json.dumps({'hyperparameters': dict(self.hyperparameters)}) self.network_weights = self._network.get_weights_list() def fit( self, sequences, targets, sample_weights=None, shuffle_permutation=None, verbose=1, progress_callback=None, progress_preamble="", progress_print_interval=5.0, seed=None, validation_mask=None, sample_ids=None, ): """ Fit the neural network. Parameters ---------- sequences : FlankingEncoding Peptides and upstream/downstream flanking sequences targets : list of float 1 indicates hit, 0 indicates decoy sample_weights : list of float If not specified all samples have equal weight. validation_mask : array of bool, optional Explicit per-row validation membership, overriding validation_split. Used by matched processing training to keep complete samples together. sample_ids : array of str, optional Required for monitor_validation_ranking or checkpoint_metric= 'val_macro_ap'. Samples must not cross the explicit training and stopping-validation mask. AP selects the earliest best-ranking epoch; early-stopping patience remains based on validation loss. shuffle_permutation : list of int Permutation of row indices, with the same length as targets. If None, then a random permutation will be generated. verbose : int Verbosity level progress_callback : function No-argument function to call after each epoch. progress_preamble : string Optional string of information to include in each progress update progress_print_interval : float How often (in seconds) to print progress update. Set to None to disable. seed : int, optional Master seed for this fit. When given, it seeds numpy's and torch's global RNGs at the start of the call, so every stochastic step downstream flows from this one value: weight initialization, the initial example shuffle, and the per-epoch training-batch shuffle. When None (the default) the RNGs are left unchanged. The caller or worker initializer is responsible for setting independent RNG states. Mirrors :meth:`mhcflurry.class1_neural_network.Class1NeuralNetwork.fit`'s ``seed`` so one value can drive both trainers. """ device = self.get_device() configure_matmul_precision(device) checkpoint_metric = self.hyperparameters["checkpoint_metric"] if checkpoint_metric not in ("val_loss", "val_macro_ap"): raise ValueError("checkpoint_metric must be val_loss or val_macro_ap") ranking_enabled = (self.hyperparameters["monitor_validation_ranking"] or checkpoint_metric == "val_macro_ap") if ranking_enabled: from .processing_ranking import SampleRankingMonitor # Check before shuffling: split identity and row order are explicit. samples = numpy.asarray(sample_ids, dtype=object) mask = numpy.asarray(validation_mask) if (samples.shape != (len(targets),) or mask.dtype != bool or mask.shape != samples.shape or not mask.any() or mask.all()): raise ValueError("Ranking monitoring requires sample_ids and a nonempty explicit validation_mask") if not all(isinstance(value, str) and value for value in samples): raise ValueError("Ranking monitoring requires nonempty string sample IDs") if set(samples[mask]) & set(samples[~mask]): raise ValueError("Ranking validation samples overlap training samples") # One seed controls every stochastic step in this fit. Seed numpy's # and torch's global RNGs up front so weight init, the example # shuffle, and the per-epoch batch shuffle all derive from it. Left # untouched when seed is None (entropy-seeded by the worker), keeping # training stochastic. if seed is not None: numpy.random.seed(int(seed) % (2 ** 32)) torch.manual_seed(int(seed) & ((1 << 63) - 1)) x_dict = self.network_input(sequences) # Shuffle if shuffle_permutation is None: shuffle_permutation = numpy.random.permutation(len(targets)) if validation_mask is not None: validation_mask = numpy.asarray(validation_mask) if validation_mask.dtype != bool or validation_mask.shape != (len(targets),): raise ValueError("validation_mask must be one boolean per training row") if validation_mask.all(): raise ValueError("validation_mask leaves no training rows") validation_mask = validation_mask[shuffle_permutation] targets = numpy.array(targets)[shuffle_permutation] assert numpy.isnan(targets).sum() == 0, targets if sample_weights is not None: sample_weights = numpy.array(sample_weights)[shuffle_permutation] for key in list(x_dict): x_dict[key] = x_dict[key][shuffle_permutation] fit_info = collections.defaultdict(list) # A refit must never expose states from an earlier training trajectory. self.checkpoint_weights = {} # Initialization may overwrite only a network created by this call, # never weights built, restored or trained before it. created_network = self._network is None if created_network: self._network = self.make_network( **self.network_hyperparameter_defaults.subselect(self.hyperparameters) ) if verbose > -1: print(self._network) network = self.network() network.to(device) reg_l1, reg_l2 = self.hyperparameters.get( "convolutional_kernel_l1_l2", [0.0, 0.0], ) regularization_parameters = tuple(self._regularized_parameters(network)) # torch.compile + TF32 are gated by env vars (off by default). Wiring # them in keeps processing at parity with affinity fit / # fit_streaming_batches() # paths so production opt-ins (MHCFLURRY_TORCH_COMPILE=1) light up # both trainers. network = maybe_compile_network(network, device) eager_network = uncompiled_network(network) # Setup optimizer optimizer = self._create_optimizer(network) # Loss function (binary cross-entropy). Route through the same # compile gate as affinity losses so processing, affinity pretrain, # and affinity finetune use one torch performance policy. Presentation # training is a separate model family and does not enter this path. loss_fn = maybe_compile_loss(nn.BCELoss(reduction='none'), device) # Validation split val_split = self.hyperparameters["validation_split"] n_total = len(targets) if validation_mask is None: n_train, n_val = validation_split_counts(n_total, val_split) train_rows = numpy.arange(n_train) val_rows = numpy.arange(n_train, n_total) fit_info["validation_policy"] = "random-row" else: train_rows = numpy.flatnonzero(~validation_mask) val_rows = numpy.flatnonzero(validation_mask) n_train, n_val = len(train_rows), len(val_rows) fit_info["validation_policy"] = "explicit-mask" fit_info["training_rows"] = n_train fit_info["validation_rows"] = n_val ranking_monitor = None if ranking_enabled: # Undo the fit shuffle within validation for stable PPV tie breaks. ranking_order = numpy.argsort(numpy.asarray(shuffle_permutation)[val_rows], kind="stable") ranking_samples = samples[numpy.asarray(shuffle_permutation)[val_rows]][ranking_order] ranking_monitor = SampleRankingMonitor(targets[val_rows][ranking_order], ranking_samples) fit_info["ranking_validation_samples"] = ranking_monitor.sample_ids fit_info["ranking_validation_input_rows"] = numpy.asarray(shuffle_permutation)[val_rows][ranking_order].tolist() fit_info["ranking_tie_policy"] = "earliest epoch for equal AP; stable original input row for PPV" # Hoist all per-batch H2D copies to a single up-front device # transfer. The processing dataset is small (peptide flanks for # ~10–100k MS hits) so the whole thing fits on GPU comfortably; # slicing by `batch_idx` on-device removes the per-step # numpy.from_numpy + astype + .to(device) trio that this loop # used to do every minibatch. # Route through torch_from_numpy (copies non-writeable arrays) for # parity with the affinity path; encode_indices returns fresh arrays # today, but this guards against a future read-only cache entry. seq_dev = torch_from_numpy(x_dict["sequence"]).to(device) length_dev = torch_from_numpy(x_dict["peptide_length"]).to(device) targets_dev = torch_from_numpy(targets.astype(numpy.float32)).to(device) weights_dev = ( torch_from_numpy(sample_weights.astype(numpy.float32)).to(device) if sample_weights is not None else None ) train_indices_dev = torch.as_tensor(train_rows, device=device, dtype=torch.long) val_indices_dev = torch.as_tensor(val_rows, device=device, dtype=torch.long) from .processing_initialization import initialize_processing_network initialization_method = self.hyperparameters["initialization_method"] if initialization_method == "none": report = initialize_processing_network(eager_network, {}, "none") fit_info["initialization"] = dict(report, applied=False) elif self.fit_info or not created_network: fit_info["initialization"] = { "method": initialization_method, "applied": False, "reason": "existing_fit" if self.fit_info else "existing_network"} else: calibration_size = min(n_train, int(self.hyperparameters["initialization_batch_size"])) if calibration_size < 1: raise ValueError("initialization_batch_size must be positive") calibration_rows = train_indices_dev[:calibration_size] calibration_inputs = { "sequence": seq_dev.index_select(0, calibration_rows), "peptide_length": length_dev.index_select(0, calibration_rows)} report = initialize_processing_network( eager_network, calibration_inputs, initialization_method) report["applied"] = initialization_method != "none" if report["applied"]: report["calibration_fit_input_rows"] = numpy.asarray(shuffle_permutation)[ train_rows[:calibration_size]].tolist() fit_info["initialization"] = report last_progress_print = None min_val_loss_iteration = None min_val_loss = None best_state_dict = None best_ap_state_dict = None best_ap = None best_ap_epoch = None optimizer_steps = 0 stop_reason = "max_epochs" start = time.time() for epoch in range(self.hyperparameters["max_epochs"]): epoch_start = time.time() network.train() # Shuffle training indices each epoch on-device shuffled_train = train_indices_dev[ torch.randperm(n_train, device=device) ] batch_size = self.hyperparameters["minibatch_size"] train_loss_sum = torch.zeros((), device=device) train_loss_count = 0 for batch_start in range(0, n_train, batch_size): batch_idx = shuffled_train[batch_start:batch_start + batch_size] seq_batch = seq_dev.index_select(0, batch_idx) length_batch = length_dev.index_select(0, batch_idx) target_batch = targets_dev.index_select(0, batch_idx) inputs = {"sequence": seq_batch, "peptide_length": length_batch} optimizer.zero_grad() predictions = network(inputs) loss = loss_fn(predictions, target_batch) if weights_dev is not None: loss = loss * weights_dev.index_select(0, batch_idx) loss = loss.mean() regularization_penalty = self._regularization_penalty( regularization_parameters, l1=reg_l1, l2=reg_l2, ) if regularization_penalty is not None: loss = loss + regularization_penalty loss.backward() optimizer.step() optimizer_steps += 1 train_loss_sum = train_loss_sum + loss.detach() train_loss_count += 1 epoch_time = time.time() - epoch_start train_loss = ( (train_loss_sum / train_loss_count).item() if train_loss_count else float("nan")) fit_info["loss"].append(train_loss) # Validation. Keep this batched: release-scale processing folds can # hold tens of thousands of validation rows, and a single Conv1d # forward over the whole fold can consume most of an A100-40GB. if n_val > 0: validation_network = validation_forward_network( network, eager_network) validation_network.eval() if "effective_validation_batch_size" not in fit_info: fit_info["effective_validation_batch_size"] = ( effective_validation_batch_size( device, self.hyperparameters["validation_batch_size"], batch_size, model=eager_network, num_workers_per_gpu=env_workers_per_gpu(), total_rows=n_val, ) ) val_batch_size = fit_info["effective_validation_batch_size"] with torch.inference_mode(): val_loss_sum = torch.zeros((), device=device) val_loss_count = 0 ranking_predictions = [] for batch_start in range(0, n_val, val_batch_size): batch_idx = val_indices_dev[ batch_start:batch_start + val_batch_size ] val_seq = seq_dev.index_select(0, batch_idx) val_length = length_dev.index_select(0, batch_idx) val_targets = targets_dev.index_select(0, batch_idx) val_inputs = { "sequence": val_seq, "peptide_length": val_length, } val_predictions = validation_network(val_inputs) if ranking_monitor is not None: ranking_predictions.append(val_predictions.detach()) val_loss = loss_fn(val_predictions, val_targets) if weights_dev is not None: val_loss = val_loss * weights_dev.index_select( 0, batch_idx, ) val_loss_sum = val_loss_sum + val_loss.sum() val_loss_count += int(val_loss.numel()) val_loss = ( val_loss_sum / val_loss_count if val_loss_count else torch.tensor(float("nan"), device=device) ) regularization_penalty = self._regularization_penalty( regularization_parameters, l1=reg_l1, l2=reg_l2, ) if regularization_penalty is not None: val_loss = val_loss + regularization_penalty val_loss = val_loss.item() fit_info["val_loss"].append(val_loss) if ranking_monitor is not None: ranking = ranking_monitor(torch.cat(ranking_predictions).cpu().numpy()[ranking_order]) for key, value in ranking.items(): fit_info[key].append(value) if best_ap is None or ranking["val_macro_ap"] > best_ap: best_ap, best_ap_epoch = ranking["val_macro_ap"], epoch if (self.hyperparameters["save_all_checkpoints"] or (self.hyperparameters["restore_best_weights"] and checkpoint_metric == "val_macro_ap")): best_ap_state_dict = copy_module_state_dict_to_cpu(eager_network) # Progress printing if progress_print_interval is not None and ( not last_progress_print or (time.time() - last_progress_print > progress_print_interval) ): print( ( progress_preamble + " " + "Epoch %3d / %3d [%0.2f sec]: loss=%g. " "Min val loss (%s) at epoch %s" % ( epoch, self.hyperparameters["max_epochs"], epoch_time, fit_info["loss"][-1], str(min_val_loss), min_val_loss_iteration, ) ).strip() ) last_progress_print = time.time() if n_val > 0: if min_val_loss is None or ( val_loss < min_val_loss - self.hyperparameters["min_delta"] ): min_val_loss = val_loss min_val_loss_iteration = epoch if (self.hyperparameters["restore_best_weights"] or self.hyperparameters["save_all_checkpoints"]): best_state_dict = copy_module_state_dict_to_cpu( eager_network) if self.hyperparameters["early_stopping"]: threshold = ( min_val_loss_iteration + self.hyperparameters["patience"] ) if epoch > threshold: if progress_print_interval is not None: print( ( progress_preamble + " " + "Stopping at epoch %3d / %3d: loss=%g. " "Min val loss (%g) at epoch %s" % ( epoch, self.hyperparameters["max_epochs"], fit_info["loss"][-1], ( min_val_loss if min_val_loss is not None else numpy.nan ), min_val_loss_iteration, ) ).strip() ) stop_reason = "early_stopping" fit_info["optimizer_steps"].append(optimizer_steps) fit_info["epoch_seconds"].append(time.time() - epoch_start) break fit_info["optimizer_steps"].append(optimizer_steps) fit_info["epoch_seconds"].append(time.time() - epoch_start) if progress_callback: progress_callback() if self.hyperparameters["save_all_checkpoints"]: self.checkpoint_weights["terminal"] = eager_network.get_weights_list() if best_state_dict is not None: self.checkpoint_weights["best"] = eager_network.get_weights_list(best_state_dict) if best_ap_state_dict is not None: self.checkpoint_weights["best_ap"] = eager_network.get_weights_list(best_ap_state_dict) restored_state = best_ap_state_dict if checkpoint_metric == "val_macro_ap" else best_state_dict restored_best_weights = bool( self.hyperparameters["restore_best_weights"] and restored_state is not None ) if restored_best_weights: eager_network.load_state_dict(restored_state) fit_info["best_epoch"] = ( min_val_loss_iteration + 1 if min_val_loss_iteration is not None else None) fit_info["best_val_loss"] = min_val_loss fit_info["restored_best_weights"] = restored_best_weights fit_info["restored_checkpoint_policy"] = ( ("best_ap" if checkpoint_metric == "val_macro_ap" else "best") if restored_best_weights else "terminal") if ranking_enabled: fit_info["best_macro_ap"] = best_ap fit_info["best_ranking_epoch"] = best_ap_epoch + 1 if best_ap_epoch is not None else None fit_info["checkpoint_metric"] = checkpoint_metric fit_info["stopping_metric"] = "val_loss" fit_info["stop_reason"] = stop_reason fit_info["stop_epoch"] = len(fit_info["loss"]) fit_info["retained_checkpoints"] = sorted(self.checkpoint_weights) fit_info["time"] = time.time() - start fit_info["num_points"] = len(sequences.dataframe) self.fit_info.append(dict(fit_info)) if verbose > -1: print("Output weights", self.network().output_layer.weight.data.cpu().numpy()) def _create_optimizer(self, network): """Create the configured optimizer using Keras or PyTorch equations.""" optimizer_name = self.hyperparameters["optimizer"].lower() implementation = self.hyperparameters["optimizer_implementation"].lower() if implementation not in ("keras", "pytorch"): raise ValueError( "optimizer_implementation must be 'keras' or 'pytorch'; got %r" % implementation ) configured_lr = self.hyperparameters["learning_rate"] if optimizer_name == "adam": lr = 0.001 if configured_lr is None else configured_lr if implementation == "keras": return KerasAdam( network.parameters(), lr=lr, beta_1=0.9, beta_2=0.999, epsilon=1e-7, ) return torch.optim.Adam( network.parameters(), lr=lr, betas=(0.9, 0.999), eps=1e-7, weight_decay=0.0, amsgrad=False, ) elif optimizer_name == "rmsprop": lr = 0.001 if configured_lr is None else configured_lr if implementation == "keras": return KerasRMSprop( network.parameters(), lr=lr, rho=0.9, epsilon=1e-7, ) return torch.optim.RMSprop( network.parameters(), lr=lr, alpha=0.9, eps=1e-7, weight_decay=0.0, momentum=0.0, centered=False, ) elif optimizer_name == "sgd": return torch.optim.SGD( network.parameters(), lr=0.01 if configured_lr is None else configured_lr, momentum=0.0, weight_decay=0.0, nesterov=False, ) raise ValueError("Unsupported optimizer: %s" % optimizer_name) def predict( self, peptides, n_flanks=None, c_flanks=None, batch_size=DEFAULT_PREDICT_BATCH_SIZE, ): """ Predict antigen processing. Parameters ---------- peptides : list of string Peptide sequences n_flanks : list of string Upstream sequence before each peptide c_flanks : list of string Downstream sequence after each peptide batch_size : int or "auto" Prediction batch size, automatically sized by default. Returns ------- numpy.array Processing scores. Range is 0-1, higher indicates more favorable processing. """ if n_flanks is None: n_flanks = [""] * len(peptides) if c_flanks is None: c_flanks = [""] * len(peptides) sequences = FlankingEncoding( peptides=peptides, n_flanks=n_flanks, c_flanks=c_flanks ) return self.predict_encoded(sequences=sequences, batch_size=batch_size) def predict_encoded( self, sequences, throw=True, batch_size=DEFAULT_PREDICT_BATCH_SIZE ): """ Predict antigen processing. Parameters ---------- sequences : FlankingEncoding Peptides and flanking sequences throw : boolean Whether to throw exception on unsupported peptides batch_size : int or ``"auto"`` Prediction batch size. ``"auto"`` (the default) auto-sizes per the current device — see ``mhcflurry.pytorch_sizing.compute_prediction_batch_size``. Returns ------- numpy.array """ predictions = self.predict_encoded_tensor( sequences=sequences, throw=throw, batch_size=batch_size) return predictions.detach().cpu().numpy().astype("float64", copy=False) def predict_encoded_tensor( self, sequences, throw=True, batch_size=DEFAULT_PREDICT_BATCH_SIZE, device=None, ): """ Predict antigen processing and return a torch tensor. This tensor-native path keeps encoded inputs resident on the target device when ``FlankingEncoding`` can provide a compatible tensor cache. ``predict_encoded`` delegates here and converts the final result to numpy for the public API. """ from .pytorch_sizing import ( calibrate_prediction_batch_size, env_workers_per_gpu, is_device_out_of_memory_error, release_device_memory_after_oom, resolve_prediction_batch_size, synchronize_device, ) auto_batch_size = batch_size in (None, "auto") if device is None: device = self.get_device() else: device = torch.device(device) configure_matmul_precision(device) # Automatic accelerator inference streams encoded inputs one batch at # a time. Previously the complete worker chunk was copied before the # elastic retry loop, so a transfer peak could not be recovered by # shrinking the batch. Explicit batches retain the cached resident # tensor path for callers that intentionally choose it. stream_inputs = ( auto_batch_size and device.type in ("cuda", "mps") ) input_device = torch.device("cpu") if stream_inputs else device x_dict = self.network_input_tensors( sequences=sequences, device=input_device, throw=throw) network = self.network() network.to(device) network = maybe_compile_network(network, device) network.eval() n_samples = len(x_dict["sequence"]) workers_per_gpu = env_workers_per_gpu(1) batch_size = resolve_prediction_batch_size( batch_size, device, model=network, num_workers_per_gpu=workers_per_gpu, total_rows=n_samples, ) if n_samples == 0: return torch.empty((0,), dtype=torch.float32, device=device) if auto_batch_size: batch_size = calibrate_prediction_batch_size( batch_size, device, network, { "sequence": x_dict["sequence"], "peptide_length": x_dict["peptide_length"], }, num_workers_per_gpu=workers_per_gpu, total_rows=n_samples, transfer_inputs_to_device=stream_inputs, ) predictions = torch.empty( (n_samples,), dtype=torch.float32, device=device) while True: try: with torch.no_grad(): for batch_start in range(0, n_samples, batch_size): batch_end = min(batch_start + batch_size, n_samples) seq_batch = x_dict["sequence"][batch_start:batch_end] length_batch = x_dict[ "peptide_length"][batch_start:batch_end] if stream_inputs: seq_batch = seq_batch.to(device) length_batch = length_batch.to(device) inputs = { "sequence": seq_batch, "peptide_length": length_batch, } batch_predictions = network(inputs) predictions[batch_start:batch_end] = batch_predictions # Surface asynchronous CUDA/MPS errors while they are # still inside the elastic retry boundary. Otherwise the # next ensemble member's input transfer can receive a # misleading deferred OOM. synchronize_device(device) break except RuntimeError as exc: if ( not auto_batch_size or batch_size <= 1 or not is_device_out_of_memory_error(exc)): raise previous_batch_size = batch_size batch_size = max(1, batch_size // 2) seq_batch = None length_batch = None inputs = None batch_predictions = None release_device_memory_after_oom(device) logging.warning( "Auto processing batch OOM at %d rows; retrying at %d.", previous_batch_size, batch_size, ) unsupported_mask = x_dict.get("unsupported_mask") if unsupported_mask is not None: predictions = predictions.masked_fill( unsupported_mask.to(device=device, dtype=torch.bool), float("nan"), ) return predictions def network_input_tensors(self, sequences, device, throw=True): """ Encode peptides to the target-device tensors expected by the network. """ device = torch.device(device) encoded = sequences.categorical_encode_tensors( self.hyperparameters["peptide_max_length"], n_flank_length=self.hyperparameters["n_flank_length"], c_flank_length=self.hyperparameters["c_flank_length"], device=device, allow_unsupported_amino_acids=True, throw=throw, ) return { "sequence": encoded.array, "peptide_length": encoded.peptide_lengths, "unsupported_mask": encoded.unsupported_mask, } def network_input(self, sequences, throw=True): """ Encode peptides to the fixed-length encoding expected by the neural network (which depends on the architecture). Parameters ---------- sequences : FlankingEncoding Peptides and flanking sequences throw : boolean Whether to throw exception on unsupported peptides Returns ------- dict """ encoded = sequences.categorical_encode( self.hyperparameters["peptide_max_length"], n_flank_length=self.hyperparameters["n_flank_length"], c_flank_length=self.hyperparameters["c_flank_length"], allow_unsupported_amino_acids=True, throw=throw, ) result = { "sequence": encoded.array, "peptide_length": encoded.peptide_lengths, } if encoded.unsupported_mask is not None: result["unsupported_mask"] = encoded.unsupported_mask return result def make_network( self, amino_acid_encoding, amino_acid_encoding_torch, peptide_max_length, n_flank_length, c_flank_length, flanking_averages, convolutional_filters, convolutional_kernel_size, convolutional_padding_mode, convolutional_activation, convolutional_kernel_l1_l2, dropout_rate, post_convolutional_dense_layer_sizes, init, normalization, cleavage_boundary_flank_length, cleavage_boundary_peptide_length, cleavage_boundary_hidden_size, cleavage_boundary_context_dropout, ): """ Helper function to make a PyTorch network given hyperparameters. """ empty_x_dict = self.network_input(FlankingEncoding([], [], [])) sequence_dims = empty_x_dict["sequence"].shape[1:] numpy.testing.assert_equal( sequence_dims[0], peptide_max_length + n_flank_length + c_flank_length ) return Class1ProcessingModel( sequence_dims=sequence_dims, n_flank_length=n_flank_length, c_flank_length=c_flank_length, peptide_max_length=peptide_max_length, flanking_averages=flanking_averages, convolutional_filters=convolutional_filters, convolutional_kernel_size=convolutional_kernel_size, convolutional_padding_mode=convolutional_padding_mode, convolutional_activation=convolutional_activation, convolutional_kernel_l1_l2=convolutional_kernel_l1_l2, dropout_rate=dropout_rate, post_convolutional_dense_layer_sizes=post_convolutional_dense_layer_sizes, # Sequences are always index-encoded now; the amino_acid_encoding_torch # arg is retained for signature/config compatibility but ignored. sequence_input_is_indices=True, sequence_input_vector_encoding_name=amino_acid_encoding, init=init, normalization=normalization, cleavage_boundary_flank_length=cleavage_boundary_flank_length, cleavage_boundary_peptide_length=cleavage_boundary_peptide_length, cleavage_boundary_hidden_size=cleavage_boundary_hidden_size, cleavage_boundary_context_dropout=( cleavage_boundary_context_dropout), ) def __getstate__(self): """ serialize to a dict. Model weights are included. For pickle support. Returns ------- dict """ self.update_network_description() result = dict(self.__dict__) result["_network"] = None return result def __setstate__(self, state): """ Deserialize. For pickle support. """ self.__dict__.update(state) def get_weights(self): """ Get the network weights Returns ------- list of numpy.array giving weights for each layer or None if there is no network """ self.update_network_description() return self.network_weights def get_config(self): """ serialize to a dict all attributes except model weights Returns ------- dict """ self.update_network_description() result = dict(self.__dict__) del result["_network"] result["network_weights"] = None # Checkpoints are sidecars, never JSON arrays in every manifest row. result["checkpoint_weights"] = {} return result @classmethod def from_config(cls, config, weights=None): """ deserialize from a dict returned by get_config(). Parameters ---------- config : dict weights : list of array, optional Network weights to restore Returns ------- Class1ProcessingNeuralNetwork """ config = dict(config) instance = cls(**config.pop("hyperparameters")) instance.__dict__.update(config) instance.network_weights = weights assert instance._network is None return instance mhcflurry-2.3.6/mhcflurry/class1_processing_predictor.py000066400000000000000000000524251525677230600236440ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from os.path import join, exists, abspath, basename from os import mkdir, remove from socket import gethostname from getpass import getuser import time import json import hashlib import logging import collections import warnings import numpy import pandas from .version import __version__ from .model_provenance import add_release_provenance from .pytorch_sizing import DEFAULT_PREDICT_BATCH_SIZE from .flanking_encoding import FlankingEncoding from .downloads import get_default_class1_processing_models_dir from .class1_processing_neural_network import Class1ProcessingNeuralNetwork from .common import save_weights, load_weights, NumpyJSONEncoder from .percentile_calibration import ( calibration_method, fit_percent_rank_transform, load_percent_rank_transforms, save_percent_rank_transforms) def _remove_owned_checkpoint(models_dir, filename): """Delete a retained-checkpoint sidecar written by this predictor. Parameters ---------- models_dir : string Directory whose contents the predictor owns. filename : string or None Manifest reference being cleared. Anything that is not a bare filename inside ``models_dir`` is left alone, as are already-absent files. """ if not isinstance(filename, str) or not filename: return if basename(filename) != filename: return path = join(models_dir, filename) if exists(path): remove(path) class Class1ProcessingPredictor(object): """ User-facing interface to antigen processing prediction. Delegates to an ensemble of Class1ProcessingNeuralNetwork instances. """ def __init__( self, models, manifest_df=None, metadata_dataframes=None, provenance_string=None, percent_rank_transform=None): """ Instantiate a new Class1ProcessingPredictor Users will generally call load() to restore a saved predictor rather than using this constructor. Parameters ---------- models : list of Class1ProcessingNeuralNetwork Neural networks in the ensemble. manifest_df : pandas.DataFrame Manifest dataframe. If not specified a new one will be created when needed. metadata_dataframes : dict of string -> pandas.DataFrame Arbitrary metadata associated with this predictor provenance_string : string, optional Optional info string to use in __str__. percent_rank_transform : transform, optional HistogramPercentRankTransform or CompactPercentRankTransform fitted to this ensemble's background score distribution. Historical processing predictors may have no calibration. """ self.models = models self._manifest_df = manifest_df self.metadata_dataframes = ( dict(metadata_dataframes) if metadata_dataframes else {}) self.provenance_string = provenance_string self.percent_rank_transform = percent_rank_transform def calibrate_percentile_ranks(self, scores, bins=None, *, method=None, max_knots=128, groups=None): """Calibrate from explicit background processing scores. Parameters ---------- scores : sequence of float Independent background scores from the same ensemble and flank policy used at prediction time. Evaluation labels are not used. bins : int or sequence, optional Explicit bins select historical histogram calibration. method : {"compact", "histogram"}, optional Compact unless explicit bins select histogram. Compact plus bins is rejected. Histogram with no bins uses score quantiles. max_knots : {64, 128}, default 128 Upper bound, not a starting size; retain 64 unless 128 improves background validation beyond the tolerance. Ignored for histogram. groups : sequence, optional Reference peptide identities, kept together during validation. """ method = calibration_method(method, bins) if method == "histogram" and bins is None: bins = numpy.unique(numpy.quantile(scores, numpy.linspace(0, 1, 10001))) self.percent_rank_transform = fit_percent_rank_transform( scores, method=method, bins=bins, score_transform="logit", survival=True, max_knots=max_knots, groups=groups) def percentile_ranks(self, processing_scores, throw=True): """Return lower-is-stronger percentiles without changing raw scores. Parameters ---------- processing_scores : sequence of float Raw processing scores, not peptide sequences. throw : bool, default True Raise when calibration is absent. False warns and returns NaNs. Returns ------- numpy.ndarray Upper-tail percentiles from 0 to 100. This separate method does not add a percentile column to raw prediction dataframes. """ if self.percent_rank_transform is None: message = "No processing predictor percentile rank information" if throw: raise ValueError(message) warnings.warn(message) return numpy.full(len(processing_scores), numpy.nan) return self.percent_rank_transform.transform(processing_scores, survival=True) @property def sequence_lengths(self): """ Supported maximum sequence lengths. Passing a peptide greater than the maximum supported length results in an error. Passing an N- or C-flank sequence greater than the maximum supported length results in some part of it being ignored. Returns ------- dict of string -> int Keys are "peptide", "n_flank", "c_flank". Values give the maximum supported sequence length. """ df = pandas.DataFrame([model.sequence_lengths for model in self.models]) return { "peptide": df.peptide.min(), # min: anything greater is error "n_flank": df.n_flank.max(), # max: anything greater is ignored "c_flank": df.c_flank.max(), } def add_models(self, models): """ Add models to the ensemble (in-place). Parameters ---------- models : list of Class1ProcessingNeuralNetwork Returns ------- list of string Names of the new models. """ new_model_names = [] original_manifest = self.manifest_df new_manifest_rows = [] for model in models: model_name = self.model_name(len(self.models)) row = pandas.Series(collections.OrderedDict([ ("model_name", model_name), ("config_json", json.dumps( model.get_config(), cls=NumpyJSONEncoder)), ("model", model), ])).to_frame().T new_manifest_rows.append(row) self.models.append(model) new_model_names.append(model_name) self._manifest_df = pandas.concat( [original_manifest] + new_manifest_rows, ignore_index=True) self.check_consistency() return new_model_names @property def manifest_df(self): """ A pandas.DataFrame describing the models included in this predictor. Returns ------- pandas.DataFrame """ if self._manifest_df is None: rows = [] for (i, model) in enumerate(self.models): model_config = model.get_config() rows.append(( self.model_name(i), json.dumps(model_config, cls=NumpyJSONEncoder), model )) self._manifest_df = pandas.DataFrame( rows, columns=["model_name", "config_json", "model"]) return self._manifest_df @staticmethod def model_name(num): """ Generate a model name Returns ------- string """ random_string = hashlib.sha1( str(time.time()).encode()).hexdigest()[:16] return "CLEAVAGE-CLASSI-%d-%s" % ( num, random_string) @staticmethod def weights_path(models_dir, model_name): """ Generate the path to the weights file for a model Parameters ---------- models_dir : string model_name : string Returns ------- string """ return join(models_dir, "weights_%s.npz" % model_name) def predict( self, peptides, n_flanks=None, c_flanks=None, throw=True, batch_size=DEFAULT_PREDICT_BATCH_SIZE): """ Predict antigen processing. Parameters ---------- peptides : list of string Peptide sequences n_flanks : list of string Upstream sequence before each peptide c_flanks : list of string Downstream sequence after each peptide throw : boolean If True, a ValueError will be raised in the case of unsupported peptides. If False, a warning will be logged and the predictions for those peptides will be NaN. batch_size : int or "auto" Prediction batch size, automatically sized by default. Returns ------- numpy.array Processing scores. Range is 0-1, higher indicates more favorable processing. """ return self.predict_to_dataframe( peptides=peptides, n_flanks=n_flanks, c_flanks=c_flanks, throw=throw, batch_size=batch_size).score.values def predict_to_dataframe( self, peptides, n_flanks=None, c_flanks=None, throw=True, batch_size=DEFAULT_PREDICT_BATCH_SIZE): """ Predict antigen processing. See `predict` method for parameter descriptions. Returns ------- pandas.DataFrame Processing predictions are in the "score" column. Also includes peptides and flanking sequences. """ if isinstance(peptides, str): raise TypeError("peptides must be a list or array, not a string") if n_flanks is None: n_flanks = [""] * len(peptides) if c_flanks is None: c_flanks = [""] * len(peptides) sequences = FlankingEncoding( peptides=peptides, n_flanks=n_flanks, c_flanks=c_flanks) return self.predict_to_dataframe_encoded( sequences=sequences, throw=throw, batch_size=batch_size) def predict_to_dataframe_encoded( self, sequences, throw=True, batch_size=DEFAULT_PREDICT_BATCH_SIZE): """ Predict antigen processing. See `predict` method for more information. Parameters ---------- sequences : FlankingEncoding batch_size : int or "auto" throw : boolean Returns ------- pandas.DataFrame """ if len(sequences.dataframe) == 0: return pandas.DataFrame({ "peptide": pandas.Series(dtype=object), "n_flank": pandas.Series(dtype=object), "c_flank": pandas.Series(dtype=object), "score": pandas.Series(dtype=float), }) score = self.predict_encoded_tensor( sequences=sequences, throw=throw, batch_size=batch_size) score_array = score.detach().cpu().numpy().astype("float64", copy=False) result_df = pandas.DataFrame({ "peptide": sequences.dataframe.peptide, "n_flank": sequences.dataframe.n_flank, "c_flank": sequences.dataframe.c_flank, "score": score_array, }) return result_df def predict_encoded_tensor( self, sequences, throw=True, batch_size=DEFAULT_PREDICT_BATCH_SIZE): """ Predict antigen processing and return a torch tensor. Ensemble members consume the tensor cache on ``sequences`` when available, so encoded inputs only need to move to each target device once per encoding/device combination. """ if not self.models: import torch return torch.full((len(sequences.dataframe),), numpy.nan) score = None for network in self.models: predictions = network.predict_encoded_tensor( sequences, throw=throw, batch_size=batch_size) if score is None: score = predictions else: score = score + predictions.to(score.device) return score / float(len(self.models)) def check_consistency(self): """ Verify that self.manifest_df is consistent with instance variables. Currently only checks for agreement on the total number of models. Throws AssertionError if inconsistent. """ assert len(self.manifest_df) == len(self.models), ( "Manifest seems out of sync with models: %d vs %d entries: \n%s"% ( len(self.manifest_df), len(self.models), str(self.manifest_df))) def save(self, models_dir, model_names_to_write=None, write_metadata=True, write_percent_ranks=True): """ Serialize the predictor to a directory on disk. If the directory does not exist it will be created. The serialization format consists of a file called "manifest.csv" with the configurations of each Class1ProcessingNeuralNetwork, along with per-network files giving the model weights. Parameters ---------- models_dir : string Path to directory. It will be created if it doesn't exist. model_names_to_write : list of string, optional Only write the weights for the specified models. Useful for incremental updates during training. Passing an explicit empty list writes no model artifacts; this is used by calibration-only updates that replace percentile calibration without touching the manifest, weights, or retained checkpoints. write_metadata : boolean, optional Whether to write optional metadata write_percent_ranks : boolean, optional Whether to write the percentile calibration """ self.check_consistency() if model_names_to_write is None: # Write all models model_names_to_write = self.manifest_df.model_name.values write_model_artifacts = True else: model_names_to_write = list(model_names_to_write) write_model_artifacts = len(model_names_to_write) > 0 if not exists(models_dir): mkdir(models_dir) sub_manifest_df = self.manifest_df.loc[ self.manifest_df.model_name.isin(model_names_to_write) ].copy() # Network JSON configs may have changed since the models were added, # so we update the JSON configs here also. updated_network_config_jsons = [] for (_, row) in sub_manifest_df.iterrows(): updated_network_config_jsons.append( json.dumps(row.model.get_config(), cls=NumpyJSONEncoder)) weights_path = self.weights_path(models_dir, row.model_name) save_weights(row.model.get_weights(), weights_path) logging.info("Wrote: %s", weights_path) for policy in ("terminal", "best", "best_ap"): column = "checkpoint_%s_weights" % policy previous = None if column in self.manifest_df.columns: previous = self.manifest_df.at[row.name, column] self.manifest_df.at[row.name, column] = None weights = getattr(row.model, "checkpoint_weights", {}).get(policy) filename = None if weights is not None: filename = "weights_%s.%s.npz" % (row.model_name, policy) save_weights(weights, join(models_dir, filename)) if column not in self.manifest_df.columns: self.manifest_df[column] = None self.manifest_df.at[row.name, column] = filename # A dropped policy must not leave its sidecar on disk, where # it would reach release tarballs and directory fingerprints. if previous != filename: _remove_owned_checkpoint(models_dir, previous) sub_manifest_df["config_json"] = updated_network_config_jsons self.manifest_df.loc[ sub_manifest_df.index, "config_json" ] = updated_network_config_jsons if write_model_artifacts: write_manifest_df = self.manifest_df[[ c for c in self.manifest_df.columns if c != "model" ]] manifest_path = join(models_dir, "manifest.csv") write_manifest_df.to_csv(manifest_path, index=False) logging.info("Wrote: %s", manifest_path) if write_percent_ranks: save_percent_rank_transforms(models_dir, { "processing_score": self.percent_rank_transform } if self.percent_rank_transform is not None else {}) if write_metadata: # Write "info.txt" info_path = join(models_dir, "info.txt") rows = [ ("trained on", time.asctime()), ("package ", "mhcflurry %s" % __version__), ("hostname ", gethostname()), ("user ", getuser()), ] add_release_provenance(rows) pandas.DataFrame(rows).to_csv( info_path, sep="\t", header=False, index=False) if self.metadata_dataframes: for (name, df) in self.metadata_dataframes.items(): metadata_df_path = join(models_dir, "%s.csv.bz2" % name) df.to_csv(metadata_df_path, index=False, compression="bz2") @classmethod def load(cls, models_dir=None, max_models=None): """ Deserialize a predictor from a directory on disk. Parameters ---------- models_dir : string Path to directory. If unspecified the default downloaded models are used. max_models : int, optional Maximum number of models to load Returns ------- `Class1ProcessingPredictor` instance """ if models_dir is None: models_dir = get_default_class1_processing_models_dir() manifest_path = join(models_dir, "manifest.csv") manifest_df = pandas.read_csv(manifest_path, nrows=max_models) models = [] for (_, row) in manifest_df.iterrows(): weights_filename = cls.weights_path(models_dir, row.model_name) config = json.loads(row.config_json) model = Class1ProcessingNeuralNetwork.from_config( config, weights=load_weights(abspath(weights_filename))) for policy in ("terminal", "best", "best_ap"): filename = row.get("checkpoint_%s_weights" % policy) if pandas.isna(filename) or not filename: continue if not isinstance(filename, str) or basename(filename) != filename: raise ValueError("Invalid retained processing checkpoint path") path = join(models_dir, filename) if not exists(path): raise ValueError("Missing retained %s processing checkpoint: %s" % (policy, path)) model.checkpoint_weights[policy] = load_weights(abspath(path)) models.append(model) manifest_df["model"] = models logging.info("Loaded %d class1 processing models", len(models)) provenance_string = None try: info_path = join(models_dir, "info.txt") info = pandas.read_csv( info_path, sep="\t", header=None, index_col=0).iloc[ :, 0 ].to_dict() provenance_string = "generated on %s" % info["trained on"] except OSError: pass result = cls( models=models, manifest_df=manifest_df, provenance_string=provenance_string, percent_rank_transform=load_percent_rank_transforms(models_dir).get("processing_score")) return result def __repr__(self): pieces = ["at 0x%0x" % id(self), "[mhcflurry %s]" % __version__] if self.provenance_string: pieces.append(self.provenance_string) return "" % " ".join(pieces) mhcflurry-2.3.6/mhcflurry/class1_training.py000066400000000000000000000525021525677230600212240ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Training and validation helpers for class I neural networks.""" import multiprocessing import os import time import numpy import torch from .regression_target import from_ic50 def validation_split_counts(total_rows, validation_split): """Return train/validation row counts using Keras split semantics. Keras assigns the last rows to validation and computes the boundary as ``floor(total_rows * (1 - validation_split))``. Computing validation rows first is not equivalent for row counts that are not exact multiples of the split denominator. """ total_rows = int(total_rows) validation_split = float(validation_split) if total_rows < 0: raise ValueError("total_rows must be non-negative") if not 0.0 <= validation_split < 1.0: raise ValueError("validation_split must be in [0, 1)") if validation_split == 0.0: return total_rows, 0 train_rows = int(numpy.floor(total_rows * (1.0 - validation_split))) validation_rows = total_rows - train_rows if train_rows == 0 or validation_rows == 0: raise ValueError( "validation_split=%s leaves %d training rows and %d validation " "rows from %d total rows" % (validation_split, train_rows, validation_rows, total_rows) ) return train_rows, validation_rows def _identity_collate(sample): """Return a pre-batched sample unchanged.""" return sample def _materialize_repeated_peptide_batch(batch): """Return ``batch`` with compact repeated-peptide input expanded. Pretrain batches can carry each unique peptide encoding once plus a ``peptide_repeat_count`` telling the training forward path to form the peptide × allele batch on device. LSUV/data-dependent initialization still expects ordinary row-aligned numpy arrays, so materialize that rare one-batch path here. """ repeat_count = batch.get("peptide_repeat_count") if repeat_count is None: return batch result = dict(batch) result["peptide"] = numpy.repeat( result["peptide"], int(repeat_count), axis=0, ) del result["peptide_repeat_count"] return result class _StreamingBatchIterableDataset(torch.utils.data.IterableDataset): """IterableDataset backing ``fit_streaming_batches``. Supports two input formats: - Legacy raw tuples: ``(alleles, peptides, affinities)`` - Pre-encoded tuples: ``(x_dict, y)`` The pre-encoded path is what allows worker-side prefetch in pretraining: the dataset can be pickled into spawned workers without serializing the full ``Class1NeuralNetwork`` instance. Picklability contract --------------------- When ``num_workers>0``, PyTorch's DataLoader pickles the dataset via ``ForkingPickler`` to ship it to each spawned worker. Two classes of attributes would break that: - Live generator objects (from ``generator=iter(...)``). Generators are intrinsically unpicklable. - Bound methods of ``Class1NeuralNetwork`` (``peptides_to_network_input``, ``allele_encoding_to_network_input``). Pickling a bound method pickles ``self``, i.e. the entire network. We sidestep both by dropping those references whenever they're redundant: the factory path never reads ``self.generator`` (always fresh-instantiates per worker), and the pre-encoded path never reads the ``*_to_input`` callbacks. The live-generator / raw-tuple path is single-process by construction — the downgrade lives in ``fit_streaming_batches`` — so zeroing these out doesn't remove any functionality. """ def __init__( self, *, generator, generator_factory=None, source_batches_are_encoded=False, allele_encoding_to_input=None, peptides_to_network_input=None, ): # Factory takes precedence: every call to ``_iter_source`` will # invoke the factory and ignore ``self.generator``, so don't # retain the live (unpicklable) generator object. self.generator = None if generator_factory is not None else generator self.generator_factory = generator_factory self.source_batches_are_encoded = source_batches_are_encoded # Pre-encoded batches never consume these callbacks. Drop them # to keep ``ForkingPickler`` from dragging the whole # ``Class1NeuralNetwork`` instance into every spawned worker. if source_batches_are_encoded: self.allele_encoding_to_input = None self.peptides_to_network_input = None else: self.allele_encoding_to_input = allele_encoding_to_input self.peptides_to_network_input = peptides_to_network_input def _iter_source(self): worker_info = torch.utils.data.get_worker_info() if self.generator_factory is not None: worker_id = worker_info.id if worker_info is not None else 0 num_workers = ( worker_info.num_workers if worker_info is not None else 1 ) return self.generator_factory( worker_id=worker_id, num_workers=num_workers, ) if worker_info is not None: raise ValueError( "fit_streaming_batches with DataLoader workers requires a " "picklable generator_factory." ) return self.generator def _normalize_item(self, item): if self.source_batches_are_encoded: x_dict, y = item else: if self.peptides_to_network_input is None: raise ValueError( "peptides_to_network_input is required for raw " "fit_streaming_batches batches." ) alleles, peptides, affinities = item allele_input = None if self.allele_encoding_to_input is not None: allele_input, _ = self.allele_encoding_to_input(alleles) x_dict = { "peptide": self.peptides_to_network_input(peptides), } if allele_input is not None: x_dict["allele"] = allele_input y = from_ic50(affinities) result = dict(x_dict) if not isinstance(y, numpy.ndarray): y = numpy.asarray(y) if y.dtype != numpy.float32: y = y.astype(numpy.float32) result["y"] = y return result def __iter__(self): for item in self._iter_source(): yield self._normalize_item(item) def _batch_value_to_device(value, device, *, non_blocking, cast_float): """Move a batch value (numpy array or tensor) to ``device``. When ``cast_float=True`` and the source is float64, cast to float32 on the CPU *before* transfer. MPS refuses to host float64 tensors, and transferring fp64 just to narrow it on-device wastes bandwidth anyway. int8 / float32 inputs skip the CPU-side cast so the pattern of shipping compact int encodings and widening on the torch device stays intact. When ``cast_float=False`` the value is shipped through in its source dtype — used by the device-side fixed peptide encoding path where peptide tensors are (N, L) int indices that get widened to (N, L, V) fp32 via embedding lookup inside the network's forward pass. """ if isinstance(value, numpy.ndarray): value = torch_from_numpy(value) if cast_float and value.dtype == torch.float64: value = value.float() value = value.to(device, non_blocking=non_blocking) if cast_float: value = value.float() return value def torch_from_numpy(value): if not value.flags.writeable: value = value.copy() return torch.from_numpy(value) def _timing_enabled(): """Return True when fine-grained training timing is enabled.""" return os.environ.get("MHCFLURRY_ENABLE_TIMING", "0") == "1" def _timing_synchronize(device): """Synchronize asynchronous device work for accurate wall timing.""" if device.type == "cuda": torch.cuda.synchronize(device) elif device.type == "mps" and hasattr(torch, "mps"): torch.mps.synchronize() def _timing_start(device, enabled): if enabled: _timing_synchronize(device) return time.perf_counter() def _timing_stop(start, device, enabled): if enabled: _timing_synchronize(device) return time.perf_counter() - start def _move_fit_batch_to_device(batch, device, *, non_blocking): """Move a training batch dict to ``device``. When ``batch["peptide"]`` is a 2D integer array the torch-side fixed peptide encoding path is active — keep it as int so the network's embedding lookup can consume it. A 3D integer array is a compact vector-encoded cache payload; still widen that to fp32 on device. Float arrays flow through as before. """ peptide_source = batch["peptide"] peptide_repeat_count = batch.get("peptide_repeat_count") if isinstance(peptide_source, numpy.ndarray): _peptide_is_indices = ( peptide_source.ndim == 2 and numpy.issubdtype(peptide_source.dtype, numpy.integer) ) else: _peptide_is_indices = ( hasattr(peptide_source, "dim") and peptide_source.dim() == 2 and peptide_source.dtype in ( torch.int8, torch.int16, torch.int32, torch.int64, torch.uint8 ) ) peptide_batch = _batch_value_to_device( peptide_source, device, non_blocking=non_blocking, cast_float=not _peptide_is_indices, ) y_batch = _batch_value_to_device( batch["y"], device, non_blocking=non_blocking, cast_float=False, ) inputs = {"peptide": peptide_batch} if peptide_repeat_count is not None: inputs["peptide_repeat_count"] = int(peptide_repeat_count) if "allele" in batch: inputs["allele"] = _batch_value_to_device( batch["allele"], device, non_blocking=non_blocking, cast_float=True, ) weights_batch = None if "weight" in batch: weights_batch = _batch_value_to_device( batch["weight"], device, non_blocking=non_blocking, cast_float=True, ) return (inputs, y_batch, weights_batch) def _sync_mean_loss(losses, *, device, timing_enabled): """Return mean detached loss with one device sync plus sync timing.""" loss_sync_start = _timing_start(device, timing_enabled) train_loss = ( torch.stack(losses).mean().item() if losses else float("nan") ) loss_sync_time = _timing_stop(loss_sync_start, device, timing_enabled) return train_loss, loss_sync_time def _validation_interval_from_hyperparameters(hyperparameters): """Return normalized validation interval for both training paths.""" return max(1, int(hyperparameters.get("validation_interval", 1) or 1)) def _early_stop_reached( *, epoch_index, min_val_loss_epoch, patience, min_epochs=0, early_stopping=True, strict=True, ): """Shared early-stopping decision using zero-based epoch indices. With ``strict=True`` (the affinity ``fit()`` path) training stops the first epoch *strictly after* ``max(min_val_loss_epoch + patience, min_epochs - 1)`` — i.e. ``patience`` no-improvement epochs followed by one more before stopping. This matches the pre-2.3.0 ``fit()`` condition ``epoch > min_val_loss_iteration + patience``. With ``strict=False`` (the streaming pretrain path) training stops *at* that threshold, reproducing the pre-2.3.0 streaming condition ``epoch >= min_val_loss_iteration + patience`` (which used one-based epochs). Keeping the streaming path inclusive means pretrained base weights reproduce historical runs rather than training one extra epoch. """ if not early_stopping or min_val_loss_epoch is None: return False threshold = max( int(min_val_loss_epoch) + int(patience), int(min_epochs) - 1, ) if strict: return int(epoch_index) > threshold return int(epoch_index) >= threshold def _should_validate_epoch( *, validation_enabled, epoch_index, max_epochs, validation_interval, early_stopping, min_val_loss_epoch, patience, min_epochs=0, strict=True, ): """Shared validation cadence for fit() and fit_streaming_batches(). ``strict`` is forwarded to :func:`_early_stop_reached` so the "validate on the epoch we're about to stop" rule uses the same inclusive/exclusive threshold as the caller's break condition. """ if not validation_enabled: return False is_last_epoch = int(epoch_index) == int(max_epochs) - 1 patience_would_trigger = _early_stop_reached( epoch_index=epoch_index, min_val_loss_epoch=min_val_loss_epoch, patience=patience, min_epochs=min_epochs, early_stopping=early_stopping, strict=strict, ) return ( int(epoch_index) % int(validation_interval) == 0 or is_last_epoch or patience_would_trigger ) def _carry_forward_validation_loss(fit_info): """Keep val_loss aligned with epochs when validation is skipped.""" return fit_info["val_loss"][-1] if fit_info["val_loss"] else float("nan") def _update_min_validation_loss( *, val_loss, epoch_index, min_val_loss, min_val_loss_epoch, min_delta, ): """Update min validation state after a measured validation epoch.""" if min_val_loss is None or val_loss < min_val_loss - min_delta: return val_loss, epoch_index return min_val_loss, min_val_loss_epoch def _effective_num_workers(num_workers): """Downgrade ``num_workers`` to 0 when running inside a daemon process. Safety net for DataLoader's ``num_workers>0`` path, which requires spawning child processes — forbidden from daemon parents. mhcflurry's training orchestrator switched to ``NonDaemonPool`` (see ``mhcflurry.parallelism``) so in production Pool workers are now non-daemonic and this downgrade does NOT fire. It remains as defense-in-depth for: - External callers that wrap ``Class1NeuralNetwork.fit`` in a daemonic process of their own (e.g. ``ProcessPoolExecutor`` is non-daemon by default but ``multiprocessing.Pool`` without the NonDaemonPool subclass is daemonic). - Test suites that explicitly construct daemon subprocesses (our own ``test_dataloader_num_workers_downgrades_in_daemon_context`` exercises this path). Emits a ``DeprecationWarning`` — it's worth knowing if this fires, since it means the caller is running in a daemon context and DataLoader prefetch is silently disabled. Use ``warnings.filterwarnings`` to silence if intentional. """ if num_workers > 0 and multiprocessing.current_process().daemon: import warnings warnings.warn( f"dataloader_num_workers={num_workers} requested from a daemon " f"process; downgrading to 0 because daemon processes cannot " f"spawn children. If this is mhcflurry's Pool worker, switch " f"to NonDaemonPool (mhcflurry/parallelism); if it's " f"your own caller, use a non-daemonic executor or accept the " f"downgrade (set dataloader_num_workers=0 explicitly to silence).", DeprecationWarning, stacklevel=3, ) return 0 return num_workers def _make_streaming_batch_dataloader( dataset, num_workers, ): """Construct a DataLoader for ``fit_streaming_batches``. The dataset already yields complete batches, so automatic batching is disabled (``batch_size=None``) and we keep the payload as numpy arrays via ``_identity_collate``. That avoids worker-side tensor materialization and keeps the worker path picklable for spawned subprocesses. """ effective_workers = _effective_num_workers(num_workers) kwargs = dict( dataset=dataset, batch_size=None, num_workers=effective_workers, collate_fn=_identity_collate, ) if effective_workers > 0: kwargs["multiprocessing_context"] = "spawn" kwargs["prefetch_factor"] = 2 return torch.utils.data.DataLoader(**kwargs) def _batched_validation_loss( *, network, eager_network, val_peptide, val_allele, val_y, val_weights, loss_obj, batch_size, ): """Compute validation loss with a fixed-size fast path and eager tail path. Every ``network(inputs)`` call inside this helper sees the same shape (``batch_size``), so GPU validation stays memory-bounded and optional compiled-validation paths can specialize once and reuse. That matters for H100 and A100 training where single-shot forward passes over the full validation set (up to ~185K rows for pan-allele training) were eating 15+ GB of VRAM per worker. Semantics: iterate ``val_peptide`` in ``batch_size``-row chunks and return the exact mean validation loss across all rows. Full-size batches run through ``network`` (typically compiled); any short tail batch runs through ``eager_network`` to avoid recompiling on an odd shape. Losses with additive numerator/denominator terms accumulate those terms across batches, preserving the exact global reduction for inequality and weighted losses. Cross-example losses still fall back to single-shot computation because samples genuinely couple within the loss. Returns a Python float (already detached from autograd). """ n_val = val_peptide.shape[0] if n_val == 0: return float("nan") # A compiled loss keeps its additive reduction helper on the original # module; use it directly for validation aggregation. reduction_loss = getattr(loss_obj, "_orig_mod", loss_obj) reduction_terms = getattr( reduction_loss, "loss_numerator_and_denominator", None) needs_single_shot = ( not getattr(reduction_loss, "supports_independent_samples", True) or (val_weights is not None and reduction_terms is None) ) if needs_single_shot: # Cross-example and unknown weighted reductions are not decomposable. inputs = {"peptide": val_peptide} if val_allele is not None: inputs["allele"] = val_allele preds = eager_network(inputs) batch_loss = loss_obj(preds, val_y, sample_weights=val_weights) return batch_loss.item() n_full = (n_val // batch_size) * batch_size numerator_accum = None denominator_accum = None loss_accum = 0.0 weight_accum = 0.0 for start in range(0, n_full, batch_size): end = start + batch_size inputs = {"peptide": val_peptide[start:end]} if val_allele is not None: inputs["allele"] = val_allele[start:end] preds = network(inputs) weights_slice = ( val_weights[start:end] if val_weights is not None else None ) if reduction_terms is not None: numerator, denominator = reduction_terms( preds, val_y[start:end], sample_weights=weights_slice) numerator_accum = ( numerator if numerator_accum is None else numerator_accum + numerator ) denominator_accum = ( denominator if denominator_accum is None else denominator_accum + denominator ) else: batch_loss = loss_obj( preds, val_y[start:end], sample_weights=weights_slice ) loss_accum += batch_loss.item() * batch_size weight_accum += batch_size if n_full < n_val: inputs = {"peptide": val_peptide[n_full:n_val]} if val_allele is not None: inputs["allele"] = val_allele[n_full:n_val] tail_predictions = eager_network(inputs) tail_size = n_val - n_full weights_slice = ( val_weights[n_full:n_val] if val_weights is not None else None ) if reduction_terms is not None: numerator, denominator = reduction_terms( tail_predictions, val_y[n_full:n_val], sample_weights=weights_slice, ) numerator_accum = ( numerator if numerator_accum is None else numerator_accum + numerator ) denominator_accum = ( denominator if denominator_accum is None else denominator_accum + denominator ) else: tail_loss = loss_obj( tail_predictions, val_y[n_full:n_val], sample_weights=weights_slice, ) loss_accum += tail_loss.item() * tail_size weight_accum += tail_size if numerator_accum is not None: return ( numerator_accum / torch.clamp(denominator_accum, min=1.0) ).item() return loss_accum / weight_accum mhcflurry-2.3.6/mhcflurry/cli/000077500000000000000000000000001525677230600163345ustar00rootroot00000000000000mhcflurry-2.3.6/mhcflurry/cli/__init__.py000066400000000000000000000015161525677230600204500ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """mhcflurry command-line modules. The ``mhcflurry`` console script dispatches to one of the registered subcommands, and the historical ``mhcflurry-*`` console scripts point at the same implementations in this package. Top-level ``*_command.py`` modules remain as import shims for compatibility. """ mhcflurry-2.3.6/mhcflurry/cli/affinity_candidate_figures.py000066400000000000000000000454551525677230600242540ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 """Build common-cohort affinity figure inputs for shortlisted candidates.""" from __future__ import annotations import argparse import json from pathlib import Path import numpy import pandas from mhcflurry.experiment_archive import sha256_file BASELINE_PUBLIC_COMPARISON = "baseline-vs-public-no-additional-ms" PUBLIC_COMPARISON = "comparison-vs-public-no-additional-ms" IDENTITY_COLUMNS = ("source_file", "hla", "peptide", "hit") BENCHMARK_METADATA_COLUMNS = ( "source_file", "protein_accession", "sample_id", "hla", "peptide", "peptide_len", "n_flank", "c_flank", "hit", "allele", ) EXTERNAL_JOIN_COLUMNS = ( "protein_accession", "sample_id", "hla", "peptide", "n_flank", "c_flank", "hit", ) def make_parser(prog="mhcflurry eval affinity-candidate-figures"): """Build the shortlisted-candidate figure parser.""" parser = argparse.ArgumentParser(prog=prog, description=__doc__) parser.add_argument("--factorial-dir", required=True) parser.add_argument("--out", required=True) parser.add_argument( "--condition", action="append", required=True, help="Candidate condition to include; repeat for each finalist.", ) parser.add_argument( "--public-predictor-name", default="mhcflurry_public_2_2", help="Column/legend name for the pinned public predictor.", ) parser.add_argument( "--external-predictions", action="append", default=[], metavar="CSV[.bz2]", help=( "Benchmark-aligned table containing NetMHCpan/MixMHCpred " "columns. Repeat to merge multiple tables. Every candidate row " "must match exactly one external row." ), ) parser.add_argument( "--formats", default="svg,pdf,png", help="Paper-figure output formats. Default: %(default)s.", ) parser.add_argument( "--skip-render", action="store_true", help="Build reusable prediction/score tables without rendering figures.", ) return parser def _comparison_dir(factorial_dir, condition, baseline): if condition == baseline: return factorial_dir / BASELINE_PUBLIC_COMPARISON return factorial_dir / condition / PUBLIC_COMPARISON def _load_comparison(factorial_dir, condition, baseline): comparison = _comparison_dir(factorial_dir, condition, baseline) summary_path = comparison / "affinity" / "summary.json" predictions_path = comparison / "affinity" / "predictions.csv.bz2" if not summary_path.is_file(): raise ValueError( "Missing direct public summary for %s: %s" % ( condition, summary_path)) if not predictions_path.is_file(): raise ValueError( "Missing held-out predictions for %s: %s" % ( condition, predictions_path)) summary = json.loads(summary_path.read_text()) identity = summary.get("benchmark_identity") if not identity or not identity.get("sha256"): raise ValueError( "Comparison lacks benchmark_identity: %s" % summary_path) return comparison, summary_path, predictions_path, identity def _predictor_info_row( name, description, primary=False, color=None, short=None): return { "predictor": name, "description": description, "primary": bool(primary), "color": color, "short": short or name, "detail": description, "higher_is_better": True, } def _condition_short_label(condition): """Return a compact, unambiguous label for an affinity factorial arm.""" replacements = { "rmsprop_keras": "Keras", "rmsprop_pytorch": "PyTorch", "lsuv_post_activation": "post-LSUV", "lsuv_pre_activation": "pre-LSUV", "lsuv_none": "no LSUV", "init_glorot_uniform": "Glorot", "init_he_uniform": "He", } labels = [] for component in condition.split("__"): if component.startswith("mb_"): labels.append("mb%s" % component.removeprefix("mb_")) else: labels.append(replacements.get(component, component)) return " | ".join(labels) def _merge_external_predictions(combined, paths, canonical_columns): """Join canonical external scores with strict row-coverage validation.""" records = [] for path_value in paths: path = Path(path_value).expanduser().resolve() if not path.is_file(): raise ValueError("Missing external prediction table: %s" % path) external = pandas.read_csv(path) missing_keys = [ column for column in EXTERNAL_JOIN_COLUMNS if column not in combined or column not in external ] if missing_keys: raise ValueError( "External prediction join lacks stable key column(s) in %s: " "%s" % (path, ", ".join(missing_keys))) score_columns = [ column for column in external.columns if column in canonical_columns ] if not score_columns: raise ValueError( "External prediction table has no supported predictor " "columns: %s" % path) duplicate_columns = [ column for column in score_columns if column in combined ] if duplicate_columns: raise ValueError( "External predictor column already exists before joining %s: " "%s" % (path, ", ".join(duplicate_columns))) join_columns = list(EXTERNAL_JOIN_COLUMNS) candidate_duplicate_mask = combined.duplicated( join_columns, keep=False) external_duplicate_mask = external.duplicated( join_columns, keep=False) external_duplicate_rows = external.loc[ external_duplicate_mask, join_columns + score_columns] if not external_duplicate_rows.empty: score_counts = external_duplicate_rows.groupby( join_columns, dropna=False, sort=False, )[score_columns].nunique(dropna=False) inconsistent = score_counts.gt(1).any(axis=1) if inconsistent.any(): raise ValueError( "External prediction rows repeat a join identity with " "different scores in %s (%d inconsistent key(s))" % ( path, int(inconsistent.sum()))) external_unique = external.drop_duplicates(join_columns, keep="first") original_rows = len(combined) combined["_candidate_row_order"] = numpy.arange(original_rows) combined = combined.merge( external_unique[join_columns + score_columns], on=join_columns, how="left", sort=False, validate="many_to_one", indicator="_external_merge", ) unmatched = int((combined["_external_merge"] != "both").sum()) if unmatched: raise ValueError( "External prediction table failed to cover %d of %d candidate " "rows: %s" % (unmatched, original_rows, path)) combined = combined.sort_values("_candidate_row_order") combined = combined.drop( columns=["_candidate_row_order", "_external_merge"]) combined.index = pandas.RangeIndex(len(combined)) if len(combined) != original_rows: raise ValueError( "External prediction join changed candidate row count: %s" % path) companion = Path("%s.provenance.json" % path) records.append({ "path": str(path), "sha256": sha256_file(path), "source_rows": len(external), "unique_join_rows": len(external_unique), "duplicate_source_rows": int(external_duplicate_mask.sum()), "duplicate_source_keys": int( external.loc[external_duplicate_mask, join_columns] .drop_duplicates() .shape[0]), "matched_candidate_rows": original_rows, "duplicate_candidate_rows": int(candidate_duplicate_mask.sum()), "duplicate_candidate_keys": int( combined.loc[candidate_duplicate_mask, join_columns] .drop_duplicates() .shape[0]), "join_columns": join_columns, "predictor_columns": score_columns, "finite_prediction_rows": { column: int(numpy.isfinite( pandas.to_numeric(combined[column], errors="coerce") ).sum()) for column in score_columns }, "companion_provenance": ( { "path": str(companion), "sha256": sha256_file(companion), } if companion.is_file() else None ), }) return combined, records def build_candidate_figure_inputs( factorial_dir, out_dir, conditions, public_predictor_name, external_predictions=()): """Write and return common-cohort predictions and score metadata.""" from . import paper_figures factorial_dir = Path(factorial_dir).resolve() out_dir = Path(out_dir).resolve() manifest_path = factorial_dir / "manifest.json" if not manifest_path.is_file(): raise ValueError("Missing factorial manifest: %s" % manifest_path) manifest = json.loads(manifest_path.read_text()) baseline = manifest["baseline_condition"] known = {record["condition"] for record in manifest["records"]} conditions = list(dict.fromkeys(conditions)) unknown = sorted(set(conditions) - known) if unknown: raise ValueError("Unknown factorial condition(s): %s" % ", ".join(unknown)) if not conditions: raise ValueError("At least one --condition is required") if public_predictor_name in conditions: raise ValueError( "--public-predictor-name collides with a condition: %s" % public_predictor_name) records = [] expected_identity = None combined = None public_scores = None public_prediction_max_abs_diff = 0.0 predictor_info_rows = [] candidate_columns = [] canonical_external_columns = { name for name in paper_figures.DEFAULT_PREDICTOR_HIGHER_IS_BETTER if name.startswith("netmhcpan") or name == "mixmhcpred" } for index, condition in enumerate(conditions): comparison, summary_path, predictions_path, identity = _load_comparison( factorial_dir, condition, baseline) if expected_identity is None: expected_identity = identity elif identity != expected_identity: raise ValueError( "Candidate comparisons use different held-out rows: %s has " "%s; expected %s" % ( condition, identity["sha256"], expected_identity["sha256"])) predictions = pandas.read_csv(predictions_path) missing = [column for column in (*IDENTITY_COLUMNS, "a_score", "b_score") if column not in predictions] if missing: raise ValueError( "Prediction table for %s lacks: %s" % ( condition, ", ".join(missing))) if combined is None: metadata_columns = [ column for column in BENCHMARK_METADATA_COLUMNS if column in predictions ] external_columns = [ column for column in predictions.columns if column in canonical_external_columns ] combined = predictions[metadata_columns + external_columns].copy() if public_predictor_name in combined.columns: raise ValueError( "--public-predictor-name collides with benchmark metadata " "or an external predictor column: %s" % public_predictor_name) public_scores = predictions["b_score"].to_numpy(copy=True) combined[public_predictor_name] = public_scores predictor_info_rows.append(_predictor_info_row( public_predictor_name, "Pinned public 2.2 models.no_additional_ms affinity ensemble", color="#4c78a8", short="Public 2.2", )) else: if len(predictions) != len(combined): raise ValueError( "Prediction row count changed for %s: %d versus %d" % ( condition, len(predictions), len(combined))) candidate_identity = predictions.loc[:, IDENTITY_COLUMNS] combined_identity = combined.loc[:, IDENTITY_COLUMNS] if not candidate_identity.reset_index(drop=True).equals( combined_identity.reset_index(drop=True)): raise ValueError( "Prediction row identity or order changed for %s" % condition) comparison_public_scores = predictions["b_score"].to_numpy() finite_difference = numpy.abs( comparison_public_scores - public_scores) max_abs_diff = float(numpy.nanmax(finite_difference)) public_prediction_max_abs_diff = max( public_prediction_max_abs_diff, max_abs_diff) if not numpy.allclose( comparison_public_scores, public_scores, rtol=0.0, atol=1e-7, equal_nan=True): raise ValueError( "Pinned public predictions changed across comparisons: %s" % condition) candidate_column = condition if candidate_column in combined.columns: raise ValueError( "Condition name collides with benchmark metadata or an " "external predictor column: %s" % candidate_column) combined[candidate_column] = predictions["a_score"].to_numpy() candidate_columns.append(candidate_column) predictor_info_rows.append(_predictor_info_row( candidate_column, "MHCflurry affinity-factorial candidate %s" % condition, primary=index == 0, short=_condition_short_label(condition), )) records.append({ "condition": condition, "comparison_dir": str(comparison), "summary_path": str(summary_path), "summary_sha256": sha256_file(summary_path), "predictions_path": str(predictions_path), "predictions_sha256": sha256_file(predictions_path), "benchmark_identity_sha256": identity["sha256"], }) combined, external_prediction_sources = _merge_external_predictions( combined, external_predictions, canonical_external_columns, ) external_columns = [ column for column in combined.columns if column in canonical_external_columns ] external_short_labels = { "netmhcpan4.ba": "NetMHCpan 4.0 BA", "netmhcpan4.el": "NetMHCpan 4.0 EL", "mixmhcpred": "MixMHCpred", } for column in external_columns: predictor_info_rows.append({ **_predictor_info_row( column, "External benchmark predictor %s" % column, short=external_short_labels.get(column, column)), "higher_is_better": paper_figures.DEFAULT_PREDICTOR_HIGHER_IS_BETTER[ column], }) out_dir.mkdir(parents=True, exist_ok=True) predictions_out = out_dir / "benchmark.monoallelic.csv.bz2" predictor_info_out = out_dir / "predictor_info.csv" scores_out = out_dir / "accuracy_scores.monoallelic.csv" combined.to_csv(predictions_out, index=False) predictor_info = pandas.DataFrame(predictor_info_rows).drop_duplicates( "predictor", keep="first") predictor_info.to_csv(predictor_info_out, index=False) indexed_info = predictor_info.set_index("predictor", drop=False) predictor_columns = ( candidate_columns + [public_predictor_name] + external_columns) scores = paper_figures.score_saved_prediction_table( predictions_out, kind="monoallelic", predictor_info=indexed_info, predictor_columns=predictor_columns, external_baselines=tuple( (name, name.replace(".", "_")) for name in [public_predictor_name] + external_columns ), ) scores.to_csv(scores_out, index=False) provenance = { "schema_version": 1, "factorial_dir": str(factorial_dir), "factorial_manifest": str(manifest_path), "factorial_manifest_sha256": sha256_file(manifest_path), "benchmark_identity": expected_identity, "conditions": conditions, "public_predictor_name": public_predictor_name, "public_prediction_max_abs_diff": public_prediction_max_abs_diff, "external_predictors_included": external_columns, "external_prediction_sources": external_prediction_sources, "source_comparisons": records, "outputs": { "predictions": str(predictions_out), "predictor_info": str(predictor_info_out), "scores": str(scores_out), }, } (out_dir / "provenance.json").write_text( json.dumps(provenance, indent=2, sort_keys=True) + "\n") return provenance def run(args): """Build common inputs and optionally render the paper-figure suite.""" from . import paper_figures provenance = build_candidate_figure_inputs( args.factorial_dir, args.out, args.condition, args.public_predictor_name, args.external_predictions, ) if not args.skip_render: external = [args.public_predictor_name] external.extend(provenance["external_predictors_included"]) preferred = list(args.condition) + external paper_args = paper_figures.make_parser().parse_args([ "--scores-dir", str(Path(args.out).resolve()), "--monoallelic-predictions", provenance["outputs"]["predictions"], "--out", str(Path(args.out).resolve() / "paper_figures"), "--formats", args.formats, "--candidate-predictor", args.condition[0], "--monoallelic-panel-predictors", ",".join(args.condition), "--external-baselines", ",".join(external), "--preferred-predictors", ",".join(preferred), ]) status = paper_figures.run(paper_args) if status: return status print(Path(args.out).resolve()) return 0 def run_argv(argv=None, prog="mhcflurry eval affinity-candidate-figures"): """Parse arguments and generate shortlisted-candidate figures.""" return run(make_parser(prog).parse_args(argv)) if __name__ == "__main__": raise SystemExit(run_argv()) mhcflurry-2.3.6/mhcflurry/cli/calibrate_percentile_ranks_command.py000066400000000000000000001136421525677230600257510ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Calibrate percentile ranks for models. Runs in-place. """ import argparse import os import sys import time import collections from functools import partial import pandas import numpy import tqdm # progress bar from ..class1_affinity_predictor import Class1AffinityPredictor from ..class1_presentation_predictor import Class1PresentationPredictor from ..class1_processing_predictor import Class1ProcessingPredictor from ..common import ( add_random_seed_arg, allele_locus_name, amino_acid_distribution, configure_logging, configure_pytorch, configure_random_seed, filter_canonicalizable_alleles, fraction_arg, install_sigusr1_stack_trace_handler, positive_int_arg, random_peptides, write_generate_sh, ) from ..encodable_sequences import EncodableSequences from ..parallelism import ( add_local_parallelism_args, chunk_ranges_for_local_parallelism, num_workers_per_gpu_from_args, refine_local_parallelism_from_worker_context, worker_pool_with_gpu_assignments_from_args, call_wrapped_kwargs) from ..workload_planning import ( WORKLOAD_AFFINITY_CALIBRATION, WORKLOAD_PRESENTATION_CALIBRATION, model_artifact_size_bytes, path_size_bytes, ) from ..device_footprint import ( estimate_affinity_calibration_device_worker_gb, ) from ..cluster_parallelism import ( add_cluster_parallelism_args, cluster_results_from_args) tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 # To avoid pickling large matrices to send to child processes when running in # parallel, we use this global variable as a place to store data. Data that is # stored here before creating the thread pool will be inherited to the child # processes upon fork() call, allowing local workers to read the same # copy-on-write pages instead of receiving a pickled copy. WORKER_CONTEXT = {} parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "--predictor-kind", choices=("class1_affinity", "class1_processing", "class1_presentation"), default="class1_affinity", help="Type of predictor to calibrate") parser.add_argument( "--percentile-method", choices=("compact", "histogram"), default="compact", help="Method for new calibration (default: %(default)s). Loading alone " "never changes saved ranks. Histogram reproduction also requires the " "original reference and bin policy.") parser.add_argument( "--max-percentile-knots", type=int, choices=(64, 128), default=128, help="Compact starts at 64; allow 128 only when background validation " "justifies it. This is a ceiling (default: %(default)s), not a fixed size. " "Ignored for histogram calibration.") parser.add_argument( "--processing-reference-data", help="Required for processing: independent background CSV with peptide and, " "for a flanked model, n_flank and c_flank columns. No evaluation labels are used. " "Scores and input sequences are saved in percent_rank_reference.npz. " "Requires --num-jobs 0; reference-generation options do not apply.") parser.add_argument( "--models-dir", metavar="DIR", required=True, help="Directory to read and write models") parser.add_argument( "--allele", "--alleles", dest="allele", default=None, nargs="+", help="Alleles to calibrate percentile ranks for. If not specified all " "alleles are used") parser.add_argument( "--match-amino-acid-distribution-data", help="Sample random peptides from the amino acid distribution of the " "peptides listed in the supplied CSV file, which must have a 'peptide' " "column. If not specified a uniform distribution is used.") parser.add_argument( "--alleles-file", default=None, help="Use alleles in supplied CSV file, which must have an 'allele' column.") parser.add_argument( "--list-percent-rank-status", default=False, action="store_true", help="For class1 affinity predictors, print a CSV indicating which requested " "alleles already have percentile-rank calibration and exit without " "generating calibration peptides.") parser.add_argument( "--only-missing", dest="only_missing_percent_ranks", default=False, action="store_true", help="For class1 affinity predictors, calibrate only requested alleles that " "do not already have direct or sequence-equivalent percentile-rank " "calibration.") parser.add_argument( "--num-peptides-per-length", type=positive_int_arg, metavar="N", default=int(1e5), help="For affinity/presentation, number of generated peptides per length " "to use to calibrate percent ranks. Processing uses --processing-reference-data. " "Default: %(default)s.") parser.add_argument( "--num-genotypes", type=positive_int_arg, metavar="N", default=25, help="Used when calibrating a presentation predictor. Number of MHC allele sets" "to sample") parser.add_argument( "--alleles-per-genotype", type=positive_int_arg, metavar="N", default=6, help="Used when calibrating a presentation predictor. Number of alleles " "per MHC allele set. Use 1 to calibrate for single alleles. Default: %(default)s") parser.add_argument( "--motif-summary", default=False, action="store_true", help="Calculate motifs and length preferences for each allele") parser.add_argument( "--summary-top-peptide-fraction", default=[0.0001, 0.001, 0.01, 0.1, 1.0], nargs="+", type=fraction_arg, metavar="X", help="The top X fraction of predictions (i.e. tightest binders) to use to " "generate motifs and length preferences. Default: %(default)s") parser.add_argument( "--length-range", default=(8, 15), type=positive_int_arg, nargs=2, help="Min and max peptide length to calibrate, inclusive. " "Default: %(default)s") def _batch_size_arg(value): """Accept either an int or the literal string 'auto' for --prediction-batch-size. ``auto`` (the default) delegates sizing to ``mhcflurry.pytorch_sizing.compute_prediction_batch_size``, which picks a per-GPU-memory batch, reserving the VRAM partition across co-resident workers. """ if isinstance(value, str) and value.strip().lower() in ("auto", ""): return "auto" return positive_int_arg(value) parser.add_argument( "--prediction-batch-size", type=_batch_size_arg, default="auto", help="Batch size for predictions. Pass an int to pin, or 'auto' " "(default) to size per GPU free memory / workers-per-GPU — see " "mhcflurry.pytorch_sizing.compute_prediction_batch_size.") parser.add_argument( "--alleles-per-work-chunk", type=positive_int_arg, metavar="N", default=1, help="Number of alleles per work chunk. Default: %(default)s.") parser.add_argument( "--verbosity", type=int, help="Verbosity. Default: %(default)s", default=0) parser.add_argument( "--gpu-batched", default=False, action="store_true", help="[class1 affinity predictors only] Use the GPU-hoisted " "calibration fast path: precompute peptide-side activations " "per network and batch " "--gpu-allele-batch-size alleles into a single forward through " "the merge + main dense path. Uses the same ensemble aggregation " "and percentile method as the ordinary path; floating-point batching " "can change predictions and selected knots slightly, so saved curves " "are not guaranteed bit-identical. Applies to affinity in serial, " "local-pool, and cluster modes; ignored for processing/presentation.") parser.add_argument( "--gpu-allele-batch-size", type=_batch_size_arg, default="auto", help="Alleles per GPU forward when --gpu-batched. Pass an int to " "pin; 'auto' (default) partitions the VRAM budget with " "--max-workers-per-gpu. Larger values trade off more VRAM for " "fewer kernel launches.") parser.add_argument( "--gpu-peptide-batch-size", type=_batch_size_arg, default="auto", help="Peptide chunk size on device when --gpu-batched. Pass an int " "to pin; 'auto' (default) picks the peptide axis of the " "auto-sized budget. Reducing keeps peak VRAM down on smaller " "GPUs but adds kernel-launch overhead.") # Calibrate deliberately uses the broader training-flavored parallelism set # (add_local_parallelism_args) rather than the prediction subset # (add_prediction_parallelism_args used by predict / predict-scan): it needs # the training-only knobs (e.g. --max-tasks-per-worker, --worker-log-dir, # cluster parallelism). The shared flags (--num-jobs/--gpus/--max-workers-per- # gpu) are identical across all three, so do not "simplify" this to the # prediction helper. add_local_parallelism_args(parser) add_cluster_parallelism_args(parser) add_random_seed_arg(parser) def run(argv=sys.argv[1:]): args = parser.parse_args(argv) if args.length_range[0] > args.length_range[1]: parser.error( "--length-range minimum must not exceed maximum: %s" % (args.length_range,) ) if not args.list_percent_rank_status: install_sigusr1_stack_trace_handler() args.models_dir = os.path.abspath(args.models_dir) configure_logging(verbose=args.verbosity > 1) if args.list_percent_rank_status: if args.predictor_kind != "class1_affinity": raise ValueError( "--list-percent-rank-status is only supported for " "class1_affinity predictors") return run_class1_affinity_percent_rank_status(args) # Seed all randomness up front (random peptide universe + genotype # sampling below both run in this process). Inference in workers is # deterministic, so global seeding here makes calibration reproducible. configure_random_seed(args.random_seed, name="calibrate-percentile-ranks") if args.predictor_kind == "class1_processing": if args.only_missing_percent_ranks or args.motif_summary: parser.error("Processing calibration does not support --only-missing or --motif-summary") if not args.processing_reference_data: parser.error("Processing calibration requires --processing-reference-data") if args.num_jobs != 0 or args.cluster_parallelism: parser.error("Processing reference calibration currently requires --num-jobs 0") configure_pytorch(backend=getattr(args, "backend", "auto") or "auto") return run_class1_processing_predictor(args) if args.processing_reference_data: parser.error("--processing-reference-data requires --predictor-kind class1_processing") # Resolve --max-workers-per-gpu='auto' to an int now, before any # downstream consumer reads it (model_kwargs below + pool creation). # The shared helper also caps auto-sized local Pools to GPU capacity and # hoists torch.compile worker-thread defaults before forking. # # Workload profiles keep calibration from inheriting training's worker # footprint. Presentation calibration in particular keeps the full # presentation predictor stack resident while generating a large # peptide-by-genotype score universe. from ..parallelism import resolve_local_parallelism_args num_lengths = args.length_range[1] - args.length_range[0] + 1 prediction_rows = int(args.num_peptides_per_length) * max(num_lengths, 1) if args.predictor_kind == "class1_presentation": prediction_rows *= max(int(args.num_genotypes), 1) # Measurement-driven per-worker VRAM for affinity calibration: size the # cached peptide-stage tensor from the actual model + peptide universe # rather than the static profile default. (The presentation fast path's # footprint is different, so it keeps the profile default.) None falls back # to the profile default inside the planner. calibration_per_worker_gb = ( estimate_affinity_calibration_device_worker_gb( args.models_dir, prediction_rows) if args.predictor_kind == "class1_affinity" else None ) resolve_local_parallelism_args( args, cap_auto_num_jobs=not getattr(args, "cluster_parallelism", False), per_worker_gb=calibration_per_worker_gb, workload_name=( WORKLOAD_PRESENTATION_CALIBRATION if args.predictor_kind == "class1_presentation" else WORKLOAD_AFFINITY_CALIBRATION ), workload_hints={ "data_bytes": sum( value or 0 for value in ( path_size_bytes(args.match_amino_acid_distribution_data), path_size_bytes(args.alleles_file), ) ) or None, "model_bytes": model_artifact_size_bytes(args.models_dir), "num_work_items": ( args.num_genotypes if args.predictor_kind == "class1_presentation" else None ), "prediction_rows": prediction_rows, }, ) # If we're going to run in-process (serial — no worker pool), the # forward kernels in this process must respect the requested # backend. Worker pools take care of this in worker_init via # configure_pytorch, but the parent never gets that path. if ( getattr(args, "num_jobs", 0) == 0 and not getattr(args, "cluster_parallelism", False)): configure_pytorch(backend=getattr(args, "backend", "auto") or "auto") if ( args.only_missing_percent_ranks and args.predictor_kind != "class1_affinity"): raise ValueError( "--only-missing is only supported for class1_affinity predictors") aa_distribution = None if args.match_amino_acid_distribution_data: distribution_peptides = pandas.read_csv( args.match_amino_acid_distribution_data).peptide.unique() distribution_peptides = [ x for x in distribution_peptides if 'X' not in x and 'B' not in x and 'U' not in x ] aa_distribution = amino_acid_distribution(distribution_peptides) print("Using amino acid distribution:") print(aa_distribution) start = time.time() peptides = [] lengths = range(args.length_range[0], args.length_range[1] + 1) for length in lengths: peptides.extend( random_peptides( args.num_peptides_per_length, length, distribution=aa_distribution)) print("Done generating peptides in %0.2f sec." % (time.time() - start)) if args.predictor_kind == "class1_affinity": return run_class1_affinity_predictor(args, peptides) elif args.predictor_kind == "class1_presentation": return run_class1_presentation_predictor(args, peptides) else: raise ValueError("Unsupported kind %s" % args.predictor_kind) def _calibration_allele_canonicalizer(predictor): """Return the allele-name canonicalizer for a calibration predictor.""" canonicalize_allele_name = getattr( predictor, "canonicalize_allele_name", None) if canonicalize_allele_name is not None: return canonicalize_allele_name affinity_predictor = getattr(predictor, "affinity_predictor", None) canonicalize_allele_name = getattr( affinity_predictor, "canonicalize_allele_name", None) if canonicalize_allele_name is not None: return canonicalize_allele_name raise AttributeError( "%s does not provide canonicalize_allele_name or an affinity_predictor " "with canonicalize_allele_name" % (type(predictor).__name__,)) def requested_calibration_alleles(args, predictor): """Return predictor-canonical alleles selected by CLI arguments. User-supplied names (``--allele`` / ``--alleles-file``) are mapped through the affinity predictor's ``canonicalize_allele_name`` so a canonicalizable- but-non-canonical entry resolves to the predictor's own pseudosequence key (which is built no-alias-first) instead of being rejected as "unsupported" by the key lookup below. Presentation predictors delegate this through their embedded affinity predictor. ``predictor.supported_alleles`` are already keys, so the default path only needs the pseudogene/null filter. """ if args.allele: # Pass raw names so canonicalize_allele_name's no-alias-first lookup # isn't defeated by an upfront alias remap; it still raises on names # that cannot be normalized, so bad --allele values fail loudly. canonicalize_allele_name = _calibration_allele_canonicalizer(predictor) return [canonicalize_allele_name(a) for a in args.allele] if args.alleles_file: requested = pandas.read_csv(args.alleles_file).allele.unique() # Drop pseudogene/null/questionable entries first (predictor-agnostic), # then map survivors to the predictor's own key form. canonicalizable = filter_canonicalizable_alleles( requested, log_label="alleles-file alleles") canonicalize_allele_name = _calibration_allele_canonicalizer(predictor) return [canonicalize_allele_name(a) for a in canonicalizable] return filter_canonicalizable_alleles(predictor.supported_alleles) def missing_percent_rank_alleles(predictor, alleles): """Return alleles lacking direct or sequence-equivalent calibration.""" return [ allele for allele in alleles if predictor.percent_rank_calibrated_allele(allele) is None ] def percent_rank_status_df(predictor, alleles): """Return per-allele percentile-rank calibration status.""" rows = [] supported_alleles = set(predictor.supported_alleles) for allele in alleles: normalized = predictor.canonicalize_allele_name(allele) source_allele = predictor.percent_rank_calibrated_allele(normalized) rows.append({ "allele": allele, "normalized_allele": normalized, "supported": normalized in supported_alleles, "has_affinity_percent_rank": source_allele is not None, "affinity_percent_rank_source_allele": source_allele or "", }) return pandas.DataFrame(rows) def run_class1_affinity_percent_rank_status(args): """Print percent-rank status for requested affinity alleles and exit.""" predictor = Class1AffinityPredictor.load(args.models_dir, optimization_level=0) alleles = requested_calibration_alleles(args, predictor) percent_rank_status_df(predictor, alleles).to_csv(sys.stdout, index=False) def run_class1_processing_predictor(args): """Calibrate processing against explicit background contexts, not invented flanks.""" predictor = Class1ProcessingPredictor.load(args.models_dir) frame = pandas.read_csv(args.processing_reference_data, keep_default_na=False) required = ["peptide"] if predictor.sequence_lengths["n_flank"] or predictor.sequence_lengths["c_flank"]: required.extend(["n_flank", "c_flank"]) if not set(required).issubset(frame): raise ValueError("Processing reference requires columns: %s" % ", ".join(required)) scores = predictor.predict( frame.peptide.values, n_flanks=frame.n_flank.values if "n_flank" in frame else None, c_flanks=frame.c_flank.values if "c_flank" in frame else None, batch_size=args.prediction_batch_size) predictor.calibrate_percentile_ranks( scores, method=args.percentile_method, max_knots=args.max_percentile_knots, groups=frame.peptide.values) predictor.save(args.models_dir, model_names_to_write=[], write_metadata=False) numpy.savez_compressed( os.path.join(args.models_dir, "percent_rank_reference.npz"), scores=scores, **{column: frame[column].to_numpy(dtype=str) for column in ("peptide", "n_flank", "c_flank") if column in frame}) write_generate_sh(args.models_dir) def run_class1_presentation_predictor(args, peptides): predictor = Class1PresentationPredictor.load(args.models_dir) alleles = requested_calibration_alleles(args, predictor) print("Num alleles", len(alleles)) genotypes = {} if args.alleles_per_genotype == 6: gene_to_alleles = collections.defaultdict(list) for a in alleles: locus = allele_locus_name(a) for gene, expected_locus in [ ("A", "HLA-A"), ("B", "HLA-B"), ("C", "HLA-C")]: if locus == expected_locus: gene_to_alleles[gene].append(a) for _ in range(args.num_genotypes): genotype = [] for gene in ["A", "A", "B", "B", "C", "C"]: genotype.append(numpy.random.choice(gene_to_alleles[gene])) genotypes[",".join(genotype)] = genotype elif args.alleles_per_genotype == 1: for _ in range(args.num_genotypes): genotype = [numpy.random.choice(alleles)] genotypes[",".join(genotype)] = genotype else: raise ValueError("Alleles per MHC allele set must be 6 or 1") print("Sampled MHC allele sets: ", list(genotypes)) print("Num peptides: ", len(peptides)) WORKER_CONTEXT["presentation_models_dir"] = args.models_dir WORKER_CONTEXT["presentation_peptides"] = peptides affinity_model_kwargs = {"batch_size": args.prediction_batch_size} if hasattr(args, "max_workers_per_gpu"): affinity_model_kwargs["num_workers_per_gpu"] = ( num_workers_per_gpu_from_args(args) ) WORKER_CONTEXT["presentation_predict_kwargs"] = { "affinity_model_kwargs": affinity_model_kwargs, "processing_batch_size": args.prediction_batch_size, } WORKER_CONTEXT.pop("_presentation_predictor", None) WORKER_CONTEXT.pop("_presentation_predictor_models_dir", None) if not args.cluster_parallelism: refine_local_parallelism_from_worker_context( args, WORKER_CONTEXT, start_method="spawn") serial_run = not args.cluster_parallelism and args.num_jobs == 0 if serial_run: WORKER_CONTEXT["_presentation_predictor"] = predictor genotype_items = list(genotypes.items()) work_items = [] for (chunk_num, start, end) in chunk_ranges_for_local_parallelism( len(genotype_items), args.num_jobs): work_items.append({ "chunk_num": chunk_num, "genotypes": dict(genotype_items[start:end]), }) start = time.time() print("Generating predictions") worker_pool = None if serial_run: print("Running in serial.") results = ( do_class1_presentation_percent_rank_scores(**item) for item in work_items) elif args.cluster_parallelism: print("Running on cluster.") results = cluster_results_from_args( args, work_function=do_class1_presentation_percent_rank_scores, work_items=work_items, constant_data=WORKER_CONTEXT, result_serialization_method="pickle", clear_constant_data=True) else: worker_pool = worker_pool_with_gpu_assignments_from_args( args, # Workers pin to GPUs via CUDA_VISIBLE_DEVICES. Force spawn so # they don't inherit any PyTorch / CUDA state from the parent, # matching predict / predict-scan. start_method="spawn", worker_context_module=__name__, worker_context_data=WORKER_CONTEXT, ) print("Worker pool", worker_pool) assert worker_pool is not None results = None try: if worker_pool is not None: results = worker_pool.imap_unordered( partial(call_wrapped_kwargs, do_class1_presentation_percent_rank_scores), work_items, chunksize=1) score_chunks = [ scores for scores in tqdm.tqdm(results, total=len(work_items)) ] if worker_pool: worker_pool.close() worker_pool.join() worker_pool = None finally: # On any failure mid-iteration, tear the pool down rather than # leaking non-daemon workers. if worker_pool is not None: worker_pool.terminate() worker_pool.join() print("Finished in %0.2f sec." % (time.time() - start)) scores = ( numpy.concatenate(score_chunks, axis=0) if score_chunks else numpy.array([], dtype=float) ) print("Generated %d presentation scores." % len(scores)) print("Calibrating ranks") predictor.calibrate_percentile_ranks( scores, method=getattr(args, "percentile_method", "compact"), max_knots=getattr(args, "max_percentile_knots", 128), groups=numpy.tile(numpy.asarray(peptides), len(scores) // len(peptides))) print("Done. Saving.") predictor.save( args.models_dir, write_affinity_predictor=False, write_processing_predictor=False, write_weights=False, write_percent_ranks=True, write_info=False, write_metadata=False) write_generate_sh(args.models_dir) print("Wrote predictor to: %s" % args.models_dir) def _presentation_predictor_for_calibration(constant_data): cache_key = constant_data["presentation_models_dir"] predictor = WORKER_CONTEXT.get("_presentation_predictor") if ( predictor is None or WORKER_CONTEXT.get("_presentation_predictor_models_dir") != cache_key): predictor = Class1PresentationPredictor.load(cache_key) WORKER_CONTEXT["_presentation_predictor"] = predictor WORKER_CONTEXT["_presentation_predictor_models_dir"] = cache_key return predictor def do_class1_presentation_percent_rank_scores( genotypes, chunk_num=None, constant_data=WORKER_CONTEXT): del chunk_num predictor = _presentation_predictor_for_calibration(constant_data) predictions_df = predictor.predict( peptides=constant_data["presentation_peptides"], alleles=genotypes, **constant_data["presentation_predict_kwargs"]) return predictions_df.presentation_score.values def run_class1_affinity_predictor(args, peptides): # Load with optimization_level=0 so we can optimize per-worker later. predictor = Class1AffinityPredictor.load( args.models_dir, optimization_level=0, ) alleles = requested_calibration_alleles(args, predictor) if args.only_missing_percent_ranks: before_missing_filter = len(alleles) alleles = missing_percent_rank_alleles(predictor, alleles) print( "Missing-percent-rank filter reduced num alleles from", before_missing_filter, "to", len(alleles)) if not alleles: print("No requested alleles are missing percentile-rank calibration.") return allele_set = set(alleles) if predictor.allele_to_sequence: unknown_alleles = [ allele for allele in allele_set if allele not in predictor.allele_to_sequence ] if unknown_alleles: raise ValueError( "Cannot calibrate unsupported allele(s): %s" % ( " ".join(sorted(unknown_alleles)))) # Remove alleles that have the same sequence. new_allele_set = set() sequence_to_allele = collections.defaultdict(set) for allele in list(allele_set): sequence_to_allele[predictor.allele_to_sequence[allele]].add(allele) for equivalent_alleles in sequence_to_allele.values(): equivalent_alleles = sorted(equivalent_alleles) keep = equivalent_alleles.pop(0) new_allele_set.add(keep) print( "Sequence comparison reduced num alleles from", len(allele_set), "to", len(new_allele_set)) allele_set = new_allele_set alleles = sorted(allele_set) print("Percent rank calibration for %d alleles. " % (len(alleles))) print("Encoding %d peptides." % len(peptides)) start = time.time() encoded_peptides = EncodableSequences.create(peptides) del peptides # Now we encode the peptides for each neural network, so the encoding # becomes cached. for network in predictor.neural_networks: network.peptides_to_network_input(encoded_peptides) assert encoded_peptides.encoding_cache # must have cached the encoding print("Finished encoding peptides in %0.2f sec." % (time.time() - start)) # Store peptides in WORKER_CONTEXT so forked local workers inherit the same # copy-on-write pages instead of receiving a pickled copy. WORKER_CONTEXT["calibration_peptides"] = encoded_peptides WORKER_CONTEXT["predictor"] = predictor model_kwargs = { 'batch_size': args.prediction_batch_size, } # Thread workers-per-GPU into the auto-size budget. The VRAM # partition across co-resident workers matters only when the # underlying predict path resolves ``"auto"`` — but it's cheap to # always pass it through. if hasattr(args, 'max_workers_per_gpu'): model_kwargs['num_workers_per_gpu'] = num_workers_per_gpu_from_args(args) num_workers_per_gpu = num_workers_per_gpu_from_args(args) WORKER_CONTEXT["args"] = { 'method': getattr(args, 'percentile_method', 'compact'), 'max_knots': getattr(args, 'max_percentile_knots', 128), 'motif_summary': args.motif_summary, 'summary_top_peptide_fractions': args.summary_top_peptide_fraction, 'verbose': args.verbosity > 0, 'model_kwargs': model_kwargs, 'gpu_batched': getattr(args, 'gpu_batched', False), 'gpu_allele_batch_size': getattr(args, 'gpu_allele_batch_size', 'auto'), 'gpu_peptide_batch_size': getattr(args, 'gpu_peptide_batch_size', 'auto'), 'num_workers_per_gpu': num_workers_per_gpu, } del encoded_peptides if not args.cluster_parallelism: refine_local_parallelism_from_worker_context( args, WORKER_CONTEXT, start_method="spawn") serial_run = not args.cluster_parallelism and args.num_jobs == 0 worker_pool = None start = time.time() work_items = [] for allele in alleles: if not work_items or len( work_items[-1]['alleles']) >= args.alleles_per_work_chunk: work_items.append({"alleles": []}) work_items[-1]['alleles'].append(allele) if serial_run: # Serial run print("Running in serial.") results = ( do_class1_affinity_calibrate_percentile_ranks(**item) for item in work_items) elif args.cluster_parallelism: # Run using separate processes HPC cluster. print("Running on cluster.") results = cluster_results_from_args( args, work_function=do_class1_affinity_calibrate_percentile_ranks, work_items=work_items, constant_data=WORKER_CONTEXT, result_serialization_method="pickle", clear_constant_data=True) else: worker_pool = worker_pool_with_gpu_assignments_from_args( args, # Same CUDA-fork-safety rationale as the presentation path above. start_method="spawn", worker_context_module=__name__, worker_context_data=WORKER_CONTEXT, ) print("Worker pool", worker_pool) assert worker_pool is not None results = None try: if worker_pool is not None: results = worker_pool.imap_unordered( partial(call_wrapped_kwargs, do_class1_affinity_calibrate_percentile_ranks), work_items, chunksize=1) summary_results_lists = collections.defaultdict(list) for work_item in tqdm.tqdm(results, total=len(work_items)): for (transforms, summary_results) in work_item: predictor.allele_to_percent_rank_transform.update(transforms) if summary_results is not None: for (item, value) in summary_results.items(): summary_results_lists[item].append(value) print("Done calibrating %d alleles." % len(alleles)) if summary_results_lists: for (name, lst) in summary_results_lists.items(): df = pandas.concat(lst, ignore_index=True) predictor.metadata_dataframes[name] = df print("Including summary result: %s" % name) print(df) predictor.save(args.models_dir, model_names_to_write=[]) write_generate_sh(args.models_dir) percent_rank_calibration_time = time.time() - start if worker_pool: worker_pool.close() worker_pool.join() worker_pool = None finally: # On any failure mid-iteration, tear the pool down rather than # leaking non-daemon workers. if worker_pool is not None: worker_pool.terminate() worker_pool.join() print("Percent rank calibration time: %0.2f min." % ( percent_rank_calibration_time / 60.0)) print("Predictor written to: %s" % args.models_dir) def do_class1_affinity_calibrate_percentile_ranks( alleles, constant_data=WORKER_CONTEXT): if 'predictor' not in constant_data: raise ValueError("No predictor provided: " + str(constant_data)) args = dict(constant_data["args"]) gpu_batched = args.pop('gpu_batched', False) gpu_allele_batch_size = args.pop('gpu_allele_batch_size', "auto") gpu_peptide_batch_size = args.pop('gpu_peptide_batch_size', "auto") num_workers_per_gpu = args.pop('num_workers_per_gpu', 1) if gpu_batched: # Single fast-path call over the whole chunk — see # Class1AffinityPredictor.calibrate_percentile_ranks_fast. The # worker's chunk size (--alleles-per-work-chunk) gates the # outer partition; within a chunk the allele sweep runs as # fewer larger GPU forwards. num_workers_per_gpu narrows the # VRAM partition the fast path claims so co-resident workers # don't race each other into OOM. return [ class1_affinity_calibrate_percentile_ranks_fast( alleles=alleles, predictor=constant_data['predictor'], peptides=constant_data['calibration_peptides'], motif_summary=args['motif_summary'], summary_top_peptide_fractions=args['summary_top_peptide_fractions'], verbose=args['verbose'], gpu_allele_batch_size=gpu_allele_batch_size, gpu_peptide_batch_size=gpu_peptide_batch_size, num_workers_per_gpu=num_workers_per_gpu, method=args.get('method'), max_knots=args.get('max_knots', 128), ) ] result_list = [] for (i, allele) in enumerate(alleles): print("Processing allele", i + 1, "of", len(alleles)) result_item = class1_affinity_calibrate_percentile_ranks( allele, constant_data['predictor'], peptides=constant_data['calibration_peptides'], **args) result_list.append(result_item) return result_list def class1_affinity_calibrate_percentile_ranks_fast( alleles, predictor, peptides, motif_summary=False, summary_top_peptide_fractions=(0.001,), verbose=False, gpu_allele_batch_size="auto", gpu_peptide_batch_size="auto", num_workers_per_gpu=1, method=None, max_knots=128): """Worker-side fast-path wrapper for the GPU-batched calibration path. Returns the same ``(transforms_dict, summary_results)`` tuple the per-allele wrapper produces so the surrounding result-aggregation code doesn't need to know which path ran. """ predictor.optimize() start = time.time() summary_results = predictor.calibrate_percentile_ranks_fast( peptides=peptides, alleles=alleles, motif_summary=motif_summary, summary_top_peptide_fractions=tuple(summary_top_peptide_fractions), allele_batch_size=gpu_allele_batch_size, peptide_batch_size=gpu_peptide_batch_size, num_workers_per_gpu=num_workers_per_gpu, verbose=verbose, method=method, max_knots=max_knots, ) if verbose: print( "Done calibrating %d alleles in %0.2f sec via fast path" % ( len(alleles), time.time() - start, ) ) transforms = { allele: predictor.allele_to_percent_rank_transform[allele] for allele in alleles } # Motif summary comes back pre-concatenated when fast path is used; # mirror the legacy per-allele wrapper's return shape. return (transforms, summary_results if motif_summary else None) def class1_affinity_calibrate_percentile_ranks( allele, predictor, peptides=None, motif_summary=False, summary_top_peptide_fractions=None, verbose=False, model_kwargs=None, method=None, max_knots=128): if summary_top_peptide_fractions is None: summary_top_peptide_fractions = [0.001] if model_kwargs is None: model_kwargs = {} if verbose: print("Calibrating", allele) predictor.optimize() # since we loaded with optimization_level=0 start = time.time() summary_results = predictor.calibrate_percentile_ranks( peptides=peptides, alleles=[allele], motif_summary=motif_summary, summary_top_peptide_fractions=summary_top_peptide_fractions, verbose=verbose, model_kwargs=model_kwargs, method=method, max_knots=max_knots) if verbose: print("Done calibrating", allele, "in", time.time() - start, "sec") transforms = { allele: predictor.allele_to_percent_rank_transform[allele], } return (transforms, summary_results) if __name__ == '__main__': run() mhcflurry-2.3.6/mhcflurry/cli/compare_models.py000066400000000000000000003065331525677230600217110ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Compare model ensembles on the data_evaluation benchmarks. Combines the three legacy ``scripts/training/compare_*.py`` tools into one command. ``--a`` and ``--b`` may each be a training-run directory, the literal ``public`` (resolves to the currently-installed public release), or ``public:`` (pin a non-default release). ``--b`` defaults to ``public``. Runs whichever components are available on both sides: * ``training_stats`` — per-task wall-time, epoch-count, final-loss deltas from each side's ``manifest.csv``. Skipped when either side is public (no manifest). * ``affinity`` — per-allele ROC-AUC / PR-AUC / PPV@N on the monoallelic hit/decoy benchmark. * ``processing`` — per-sample + per-length metrics on the multiallelic hit/decoy benchmark for the requested processing flank variants. * ``presentation`` — per-sample + per-length micro/macro metrics on the multiallelic hit/decoy benchmark, with-flanks and without-flanks. Writes detailed CSV/JSON artifacts plus release-summary CSV/Markdown tables. ``mhcflurry plot-model-comparison`` consumes the CSVs to render plots. """ from __future__ import annotations import argparse import ast import glob import hashlib import json import os import shutil import time import warnings from functools import partial from typing import Optional import numpy import pandas from sklearn.metrics import average_precision_score, roc_auc_score from ..common import ( normalize_class1_genotype, normalize_allele_name, normalize_sequence_resolved_allele_name, positive_int_arg, ) from .model_comparison_constants import ( METRIC_NAMES, PRESENTATION_MODES, PRESENTATION_SCORE_KINDS, PROCESSING_MODES, ) from ..parallelism import ( add_prediction_parallelism_args, call_wrapped_kwargs, chunk_ranges_for_local_parallelism, worker_pool_with_gpu_assignments_from_args, ) from ..pytorch_sizing import default_prediction_batch_is_auto from ..pseudosequences import LEGACY_ALLELE_SEQUENCES_FILENAME from ..release_holdout import canonical_allele_mapping, load_excluded_samples from ..workload_planning import ( WORKLOAD_AFFINITY_INFERENCE, WORKLOAD_PROCESSING_INFERENCE, WORKLOAD_PRESENTATION_INFERENCE, model_artifact_size_bytes, ) METRIC_SCORE_KINDS = PRESENTATION_SCORE_KINDS + ("processing_score",) _COMPONENT_NAMES = ("training_stats", "affinity", "processing", "presentation") _T0 = time.time() def _stamp(msg): print("[+%7.1fs] %s" % (time.time() - _T0, msg), flush=True) def _num_jobs_override_arg(value): if str(value).strip().lower() == "auto": return "auto" try: parsed = int(value) except ValueError: raise argparse.ArgumentTypeError( "expected 'auto' or an integer >= 0, got %r" % value ) if parsed < 0: raise argparse.ArgumentTypeError( "expected 'auto' or an integer >= 0, got %r" % value ) return parsed def _max_workers_per_gpu_override_arg(value): if str(value).strip().lower() == "auto": return "auto" try: parsed = int(value) except ValueError: raise argparse.ArgumentTypeError( "expected 'auto' or an integer >= 1, got %r" % value ) if parsed < 1: raise argparse.ArgumentTypeError( "expected 'auto' or an integer >= 1, got %r" % value ) return parsed def _parallelism_args_for_component(args, component): component_args = argparse.Namespace(**vars(args)) component_args._local_parallelism_args_resolved = False if hasattr(component_args, "workload_plan"): del component_args.workload_plan if component != "presentation": return component_args overrides = { "num_jobs": args.presentation_num_jobs, "max_workers_per_gpu": args.presentation_max_workers_per_gpu, "max_tasks_per_worker": args.presentation_max_tasks_per_worker, "torch_compile": args.presentation_torch_compile, } overrides = { name: value for (name, value) in overrides.items() if value is not None } for name, value in overrides.items(): setattr(component_args, name, value) return component_args # --------------------------------------------------------------------------- # argparse + dispatch # --------------------------------------------------------------------------- def make_parser(): """Return a standalone parser for documentation tooling (autoprogram).""" parser = argparse.ArgumentParser(prog="mhcflurry compare-models") register_subparser(parser) return parser def run_argv(argv): """Entry point for the lazy ``mhcflurry compare-models`` dispatcher.""" return run(make_parser().parse_args(argv)) def register_subparser(parser): parser.description = __doc__ parser.formatter_class = argparse.RawDescriptionHelpFormatter parser.add_argument( "--a", required=True, dest="a", help=( "Side A: a training-run directory, 'public', or " "'public:'." ), ) parser.add_argument( "--b", default="public", dest="b", help=( "Side B: same forms as --a. Defaults to 'public' (the most " "recently installed mhcflurry release)." ), ) parser.add_argument("--a-label", default=None, help="Display label for side A (default: derived).") parser.add_argument("--b-label", default=None, help="Display label for side B (default: derived).") for letter in ("a", "b"): for role in ("affinity", "processing", "presentation", "training"): parser.add_argument( "--%s-%s-dir" % (letter, role), default=None, dest="%s_%s_dir" % (letter, role), help=( "Override the auto-probed %s path for side %s." % (role, letter.upper()) ), ) parser.add_argument( "--%s-affinity-predictions" % letter, help=( "Reuse a saved, row-identical affinity prediction table for " "side %s instead of rerunning that predictor. The table's " "cohort identity is verified before scores are accepted." % letter.upper() ), ) parser.add_argument( "--%s-affinity-prediction-column" % letter, default="%s_pred" % letter, help=( "Prediction column in --%s-affinity-predictions. " "Default: %%(default)s" % letter ), ) parser.add_argument( "--out", required=True, help="Output directory. Subdirs per component are created here.", ) parser.add_argument( "--include", default="auto", help=( "Comma-separated subset of {training_stats, affinity, processing, " "presentation}; default 'auto' runs whichever components are " "available on both sides." ), ) parser.add_argument( "--data-dir", default=None, help=( "data_evaluation directory. Defaults to the currently-installed " "data_evaluation download." ), ) parser.add_argument( "--release-holdout-dir", help=( "Release holdout manifest directory. When specified, affinity, " "processing, and presentation benchmarks are restricted to their " "frozen evaluation sample manifests." ), ) parser.add_argument( "--limit-files", type=positive_int_arg, default=None, help="Smoke-test: only read first N benchmark files.", ) parser.add_argument( "--affinity-source", choices=["mixmhcpred", "netmhcpan4", "no_additional_ms", "both"], default="mixmhcpred", help=( "Which monoallelic benchmark source to use for affinity eval. " "The no_additional_ms source is train-excluded for the matching " "models_class1_pan_variants/models.no_additional_ms predictor." ), ) parser.add_argument( "--affinity-training-overlap-policy", choices=["exclude", "audit"], default="exclude", help=( "For frozen release affinity evaluation, either exclude the union " "of both predictors' recorded training pMHCs or audit/report that " "overlap without changing the score set." ), ) parser.add_argument( "--skip-affinity-predictions", action="store_true", help=( "Do not persist the row-level affinity/predictions.csv.bz2 " "artifact. Aggregate metrics, overlap audits, and per-allele/" "per-length tables are unchanged." ), ) parser.add_argument( "--processing-modes", default=",".join(PROCESSING_MODES), help=( "Comma-separated subset of {with_flanks, no_flank, short_flanks} " "for the processing component." ), ) parser.add_argument( "--processing-negative-policy", choices=("matched", "random-diagnostic"), default="matched", help="Processing headline cohort. Unmatched random decoys are diagnostic only.") parser.add_argument( "--processing-matched-cohort", help="Frozen expanded 10:1 cohort directory from eval prepare-processing-cohort.") parser.add_argument( "--presentation-modes", default=",".join(PRESENTATION_MODES), help=( "Comma-separated subset of {with_flanks, without_flanks} for " "the presentation component." ), ) parser.add_argument( "--presentation-score-kinds", default=",".join(PRESENTATION_SCORE_KINDS), help=("Comma-separated subset of {presentation_score, presentation_percentile}. " "Default evaluates and requires both. Use presentation_score explicitly " "for an uncalibrated research combiner; this does not validate release percentiles."), ) add_prediction_parallelism_args(parser) parser.add_argument( "--presentation-num-jobs", type=_num_jobs_override_arg, default=None, help=( "Override --num-jobs for presentation inference. This is useful " "because presentation prediction has a larger per-worker GPU " "footprint than affinity or processing." ), ) parser.add_argument( "--presentation-max-workers-per-gpu", type=_max_workers_per_gpu_override_arg, default=None, help="Override --max-workers-per-gpu for presentation inference.", ) parser.add_argument( "--presentation-max-tasks-per-worker", type=positive_int_arg, default=None, help="Override --max-tasks-per-worker for presentation inference.", ) parser.add_argument( "--presentation-torch-compile", choices=("auto", "0", "1"), default=None, help="Override --torch-compile for presentation inference.", ) return parser def run(args): _validate_comparison_output_location(args) side_a = _resolve_side("a", args.a, args.a_label, args) side_b = _resolve_side("b", args.b, args.b_label, args) components = _resolve_components(args.include, side_a, side_b) _validate_component_configuration(args, components, side_a, side_b) # Resolve and validate every requested input before invalidating a previous # comparison in this output directory. This keeps a typo or an incomplete # candidate artifact from destroying the last usable review packet. _reset_comparison_outputs(args.out) os.makedirs(args.out, exist_ok=True) with open(os.path.join(args.out, "side_a.json"), "w") as fd: json.dump(_side_to_json(side_a), fd, indent=2, sort_keys=True) with open(os.path.join(args.out, "side_b.json"), "w") as fd: json.dump(_side_to_json(side_b), fd, indent=2, sort_keys=True) _stamp("running components: %s" % (", ".join(components) or "(none)")) headline = {"side_a": side_a["label"], "side_b": side_b["label"]} if "training_stats" in components: headline["training_stats"] = _run_training_stats(side_a, side_b, args.out) if "affinity" in components: headline["affinity"] = _run_affinity(side_a, side_b, args) if "processing" in components: headline["processing"] = _run_processing(side_a, side_b, args) if "presentation" in components: headline["presentation"] = _run_presentation(side_a, side_b, args) _write_release_summary_tables(headline, side_a, side_b, args.out, components) _write_summary_markdown(headline, side_a, side_b, args.out, components) return 0 def _validate_comparison_output_location(args): """Refuse output paths that contain model or benchmark inputs.""" out = os.path.realpath(args.out) inputs = [("--data-dir", args.data_dir)] if args.data_dir else [] for letter in ("a", "b"): spec = getattr(args, letter) if isinstance(spec, str) and not ( spec == "public" or spec.startswith("public:")): inputs.append(("--%s" % letter, spec)) for role in ("affinity", "processing", "presentation", "training"): value = getattr(args, "%s_%s_dir" % (letter, role)) if value: inputs.append(("--%s-%s-dir" % (letter, role), value)) predictions = getattr( args, "%s_affinity_predictions" % letter, None) if predictions: inputs.append(( "--%s-affinity-predictions" % letter, predictions)) for option, value in inputs: path = os.path.realpath(value) try: output_contains_input = os.path.commonpath([out, path]) == out except ValueError: output_contains_input = False if output_contains_input: raise ValueError( "Comparison output directory cannot contain an input path: " "%s contains %s=%s" % (args.out, option, value)) def _reset_comparison_outputs(out_dir): """Remove outputs owned by compare-models before starting a new run. A comparison directory is commonly reused for release retries. Leaving a component directory or plot packet from the previous invocation can make a narrower or failed retry look successful, so all derived outputs are invalidated together before new side metadata is written. """ for name in ( "training_stats", "affinity", "processing", "presentation", "plots", "worker_logs"): path = os.path.join(out_dir, name) if os.path.isdir(path): shutil.rmtree(path) elif os.path.exists(path): os.unlink(path) for name in ( "side_a.json", "side_b.json", "release_summary.csv", "release_summary.md", "summary.md", "summary.pdf"): path = os.path.join(out_dir, name) try: os.unlink(path) except FileNotFoundError: pass # --------------------------------------------------------------------------- # Side resolution # --------------------------------------------------------------------------- def _resolve_side(letter, spec, label, args): """Resolve a CLI ``--a`` / ``--b`` spec to per-role paths. ``spec`` may be a filesystem path, ``"public"``, or ``"public:"``. Per-role CLI overrides (``--a-affinity-dir`` etc) take precedence over the auto-probe. """ overrides = { "affinity": getattr(args, "%s_affinity_dir" % letter), "processing": getattr(args, "%s_processing_dir" % letter), "presentation": getattr(args, "%s_presentation_dir" % letter), "training": getattr(args, "%s_training_dir" % letter), } # Match the public sentinel exactly so user-named directories like # ``public_models/`` or ``publication_data/`` still resolve as run dirs. is_public = isinstance(spec, str) and ( spec == "public" or spec.startswith("public:") ) release_pin = None if is_public and ":" in spec: _, release_pin = spec.split(":", 1) paths = {} for role in ("affinity", "processing", "presentation", "training"): if overrides[role]: paths[role] = overrides[role] elif is_public: paths[role] = _public_path_for_role(role, release_pin) else: paths[role] = _probe_run_dir(spec, role) if label is None: if is_public: label = "public" if release_pin is None else "public:%s" % release_pin else: label = os.path.basename(os.path.normpath(spec)) or spec return {"letter": letter, "spec": spec, "label": label, "paths": paths} def _public_path_for_role(role, release_pin): """Resolve a public-install models dir for ``role`` if available.""" from .. import downloads role_to_download = { "affinity": ("models_class1_pan", "models.combined"), "processing": ( "models_class1_processing", ""), "presentation": ("models_class1_presentation", "models"), "training": (None, None), } download_name, sub = role_to_download.get(role, (None, None)) if download_name is None: return None release_env = "MHCFLURRY_DOWNLOADS_CURRENT_RELEASE" missing = object() previous_release = os.environ.get(release_env, missing) try: if release_pin is not None: os.environ[release_env] = release_pin try: downloads.configure() except KeyError: # Unknown release name — no path resolvable for any role. return None return downloads.get_path(download_name, sub) except (RuntimeError, OSError, TypeError): # No downloads installed (TypeError when downloads dir is None) or # the specific archive isn't present (RuntimeError from get_path). return None finally: if release_pin is not None: if previous_release is missing: os.environ.pop(release_env, None) else: os.environ[release_env] = previous_release downloads.configure() def _probe_run_dir(spec, role): """Probe a run directory for the canonical ``role`` subdirectory.""" if not os.path.isdir(spec): return None candidates = [] if role == "affinity": candidates = [ os.path.join(spec, "affinity", "models.combined"), os.path.join(spec, "models.combined"), spec, ] return _first_match(candidates, _looks_like_affinity_dir) if role == "presentation": candidates = [ os.path.join(spec, "presentation", "models"), os.path.join(spec, "presentation", "models.combined"), os.path.join(spec, "presentation"), spec, ] return _first_match(candidates, _looks_like_presentation_dir) if role == "processing": candidates = [ os.path.join(spec, "processing"), spec, ] return _first_match(candidates, _looks_like_processing_dir) if role == "training": candidates = [ os.path.join(spec, "affinity", "models.unselected.combined"), os.path.join(spec, "models.unselected.combined"), spec, ] return _first_match( candidates, lambda p: os.path.isfile(os.path.join(p, "manifest.csv")), ) return None def _first_match(paths, predicate): for path in paths: if path and predicate(path): return path return None def _looks_like_affinity_dir(path): if not os.path.isdir(path): return False if os.path.isfile(os.path.join(path, LEGACY_ALLELE_SEQUENCES_FILENAME)): return True return any( f.startswith("manifest") for f in os.listdir(path) ) def _looks_like_presentation_dir(path): return os.path.isdir(path) and os.path.isfile( os.path.join(path, "weights.csv") ) def _looks_like_processing_dir(path): if not os.path.isdir(path): return False basename = os.path.basename(os.path.normpath(path)) if basename.startswith("models.selected."): return True return any( os.path.isdir(os.path.join(path, "models.selected.%s" % mode)) for mode in PROCESSING_MODES ) def _side_to_json(side): result = { "letter": side["letter"], "spec": side["spec"], "label": side["label"], "paths": side["paths"], "model_package_versions": _model_package_versions(side["paths"]), } provenance_path = os.path.join( side["spec"], "release_provenance.json") if os.path.isdir( side["spec"]) else None if provenance_path and os.path.isfile(provenance_path): with open(provenance_path) as fd: result["release_provenance"] = json.load(fd) return result def _model_package_versions(paths): """Return package versions recorded by each resolved model artifact.""" info_paths = {} for role in ("affinity", "presentation"): root = paths.get(role) if root: info_paths[role] = [os.path.join(root, "info.txt")] processing = paths.get("processing") if processing: if os.path.basename(os.path.normpath(processing)).startswith( "models.selected."): info_paths["processing"] = [os.path.join(processing, "info.txt")] else: info_paths["processing"] = sorted(glob.glob(os.path.join( processing, "models.selected.*", "info.txt"))) result = {} for role, candidates in info_paths.items(): versions = [] for path in candidates: if not os.path.isfile(path): continue with open(path) as fd: for line in fd: fields = line.split() if fields[:2] == ["package", "mhcflurry"] and len(fields) > 2: versions.append(fields[2]) break if versions: result[role] = sorted(set(versions)) return result def _resolve_components(include_arg, side_a, side_b): available = [] if side_a["paths"]["training"] and side_b["paths"]["training"]: available.append("training_stats") if side_a["paths"]["affinity"] and side_b["paths"]["affinity"]: available.append("affinity") if side_a["paths"]["processing"] and side_b["paths"]["processing"]: available.append("processing") if side_a["paths"]["presentation"] and side_b["paths"]["presentation"]: available.append("presentation") if include_arg == "auto": if not available: raise SystemExit( "No comparable model components are available on both sides." ) return available pieces = [p.strip() for p in include_arg.split(",")] if any(not piece for piece in pieces): raise SystemExit("--include contains an empty component") requested = pieces if not requested: raise SystemExit("--include must name at least one component or be 'auto'") bad = [p for p in requested if p not in _COMPONENT_NAMES] if bad: raise SystemExit("Unknown --include components: %s" % ", ".join(bad)) duplicates = sorted({p for p in requested if requested.count(p) > 1}) if duplicates: raise SystemExit("Duplicate --include components: %s" % ( ", ".join(duplicates))) missing = [p for p in requested if p not in available] if missing: raise SystemExit( "Requested comparison component(s) are unavailable on both sides: " "%s. Every explicit --include component must exist on both the " "candidate and baseline." % ", ".join(missing) ) return requested def _requested_modes(value, allowed, option): """Parse and validate a comma-separated comparison-mode option.""" requested = [mode.strip() for mode in value.split(",")] if not requested or any(not mode for mode in requested): raise SystemExit("%s contains an empty mode" % option) bad = [mode for mode in requested if mode not in allowed] if bad: raise SystemExit("Unknown %s modes: %s" % ( option.removeprefix("--"), ", ".join(bad))) duplicates = sorted({ mode for mode in requested if requested.count(mode) > 1 }) if duplicates: raise SystemExit("Duplicate %s modes: %s" % ( option.removeprefix("--"), ", ".join(duplicates))) return requested def _processing_model_dirs(side_a, side_b, requested_modes): """Resolve requested processing variants or fail with both missing sides.""" model_dirs = {} missing = [] for mode in requested_modes: a_model_dir = _processing_model_dir( side_a["paths"]["processing"], mode) b_model_dir = _processing_model_dir( side_b["paths"]["processing"], mode) missing_sides = [] if not a_model_dir: missing_sides.append("A (%s)" % side_a["label"]) if not b_model_dir: missing_sides.append("B (%s)" % side_b["label"]) if missing_sides: missing.append("%s: side %s" % (mode, " and ".join(missing_sides))) else: model_dirs[mode] = (a_model_dir, b_model_dir) if missing: raise SystemExit( "Requested processing mode model(s) are unavailable: %s. " "Every --processing-modes entry must exist on both sides." % "; ".join(missing) ) return model_dirs def _validate_component_configuration(args, components, side_a, side_b): """Validate component-specific options before output cleanup begins.""" if "affinity" in components: for letter in ("a", "b"): path = getattr( args, "%s_affinity_predictions" % letter, None) if path and not os.path.isfile(path): raise ValueError( "--%s-affinity-predictions is not a file: %s" % (letter, path)) if "processing" in components: modes = _requested_modes( args.processing_modes, PROCESSING_MODES, "--processing-modes") _processing_model_dirs(side_a, side_b, modes) if "presentation" in components: _requested_modes( args.presentation_modes, PRESENTATION_MODES, "--presentation-modes") # --------------------------------------------------------------------------- # Metric helpers (shared) # --------------------------------------------------------------------------- def _ppv_at_n(y_true, y_score, n): # Stable sort so tied scores break deterministically (by original index), # making PPV@N reproducible run-to-run. Applied symmetrically to sides A # and B, so it does not bias the comparison. order = numpy.argsort(-y_score, kind="stable") top = order[:n] return float(y_true[top].sum()) / float(n) if n > 0 else numpy.nan def _metrics(y_true, y_score): y_true = numpy.asarray(y_true) y_score = numpy.asarray(y_score) mask = numpy.isfinite(y_score) y_true = y_true[mask] y_score = y_score[mask] n_pos = int(y_true.sum()) n_neg = int(len(y_true) - n_pos) if n_pos == 0 or n_neg == 0: return dict( n=int(len(y_true)), n_pos=n_pos, roc_auc=numpy.nan, pr_auc=numpy.nan, ppv_at_n=numpy.nan, ) return dict( n=int(len(y_true)), n_pos=n_pos, roc_auc=float(roc_auc_score(y_true, y_score)), pr_auc=float(average_precision_score(y_true, y_score)), ppv_at_n=_ppv_at_n(y_true, y_score, n_pos), ) def _require_binary_comparison_rows(df, context, require_both_classes=True): """Require at least one positive and one negative evaluation row.""" if "hit" not in df: raise ValueError("%s is missing the hit column" % context) hits = pandas.to_numeric(df["hit"], errors="coerce") valid_binary = numpy.isfinite(hits.values) & hits.isin([0, 1]).values if not valid_binary.all(): raise ValueError( "%s contains %d non-binary or missing hit value(s); expected " "only 0 and 1" % (context, int((~valid_binary).sum())) ) n_rows = int(len(hits)) n_pos = int((hits == 1).sum()) n_neg = int((hits == 0).sum()) if require_both_classes and (n_rows == 0 or n_pos == 0 or n_neg == 0): raise ValueError( "%s has no valid binary comparison set after shared-row " "filtering (rows=%d, positives=%d, negatives=%d)" % ( context, n_rows, n_pos, n_neg ) ) def _require_complete_benchmark_rows(df, columns, context): """Reject missing/blank required inputs instead of silently dropping rows.""" missing_columns = sorted(set(columns) - set(df.columns)) if missing_columns: raise ValueError( "%s missing required column(s): %s" % ( context, ", ".join(missing_columns)) ) failures = [] for column in columns: values = df[column] invalid = values.isnull() # pandas 3 defaults text columns to ``StringDtype`` rather than # ``object``. Normalize every scalar column to its nullable string view # so blank detection is independent of the pandas dtype policy. invalid |= values.astype("string").str.strip().eq("").fillna(False) if invalid.any(): failures.append("%s=%d" % (column, int(invalid.sum()))) if failures: raise ValueError( "%s contains missing or blank required values (%s). Benchmark " "rows must not be silently discarded." % ( context, ", ".join(failures)) ) def _add_diffs(df, metric_names, a_prefix="a", b_prefix="b"): """Add ``_diff = a - b`` columns in-place and return df.""" for metric in metric_names: a_col = "%s_%s" % (a_prefix, metric) b_col = "%s_%s" % (b_prefix, metric) if a_col in df.columns and b_col in df.columns: df["%s_diff" % metric] = df[a_col] - df[b_col] return df def _metric_table_columns(id_columns, metric_names=METRIC_NAMES): columns = list(id_columns) + ["n", "n_pos"] for metric in metric_names: columns.extend(["a_%s" % metric, "b_%s" % metric, "%s_diff" % metric]) return columns def _metric_table(rows, id_columns, metric_names=METRIC_NAMES): df = pandas.DataFrame(rows, columns=_metric_table_columns( id_columns, metric_names)) return _add_diffs(df, metric_names) def _per_length_columns(metric_names=METRIC_NAMES): columns = ["length", "n", "n_pos", "n_alleles_reported"] for metric in metric_names: columns.extend([ "a_micro_%s" % metric, "b_micro_%s" % metric, "a_macro_%s" % metric, "b_macro_%s" % metric, "micro_%s_diff" % metric, "macro_%s_diff" % metric, ]) return columns def _presentation_per_length_columns(metric_names=METRIC_NAMES): columns = ["length", "n", "n_pos", "n_samples_reported"] for metric in metric_names: columns.extend([ "a_micro_%s" % metric, "b_micro_%s" % metric, "micro_%s_diff" % metric, "a_macro_%s" % metric, "b_macro_%s" % metric, "macro_%s_diff" % metric, ]) return columns # --------------------------------------------------------------------------- # Component: training_stats # --------------------------------------------------------------------------- def _run_training_stats(side_a, side_b, out_dir): component_dir = os.path.join(out_dir, "training_stats") os.makedirs(component_dir, exist_ok=True) a_summary = _load_training_summary(side_a["paths"]["training"]) b_summary = _load_training_summary(side_b["paths"]["training"]) a_summary["side"] = side_a["label"] b_summary["side"] = side_b["label"] per_task = pandas.concat([a_summary, b_summary], ignore_index=True) per_task.to_csv(os.path.join(component_dir, "per_task.csv"), index=False) # ``agg`` is built in (side_a, side_b) order, so positional .iloc lookups # are robust even when the two labels happen to collide. agg = pandas.DataFrame([ _aggregate_training_summary(side_a["label"], a_summary), _aggregate_training_summary(side_b["label"], b_summary), ]) agg.to_csv(os.path.join(component_dir, "summary.csv"), index=False) _stamp("wrote training_stats per_task.csv + summary.csv") return { "side_a_finetune_total_wall_min": float( agg.iloc[0]["finetune_total_wall_min"]), "side_b_finetune_total_wall_min": float( agg.iloc[1]["finetune_total_wall_min"]), "side_a_n_models": int(agg.iloc[0]["n_models"]), "side_b_n_models": int(agg.iloc[1]["n_models"]), } def _parse_config_json(raw): try: return json.loads(raw) except (json.JSONDecodeError, TypeError): return ast.literal_eval(raw) def _load_training_summary(training_dir): rows = [] manifest_path = os.path.join(training_dir, "manifest.csv") df = pandas.read_csv(manifest_path) required = {"model_name", "config_json"} missing = required - set(df.columns) if missing: raise ValueError( "manifest %s missing required columns: %s" % (manifest_path, sorted(missing)) ) for r in df.itertuples(): cfg = _parse_config_json(r.config_json) layer_sizes = tuple(cfg["hyperparameters"].get("layer_sizes") or ()) for fit_info in cfg.get("fit_info") or []: ti = fit_info.get("training_info", {}) loss = fit_info.get("loss") or [] val = fit_info.get("val_loss") or [] rows.append({ "model_name": r.model_name, "phase": ti.get("phase", "?"), "layer_sizes": str(layer_sizes), "fold": ti.get("fold_num"), "n_epochs": len(loss), "wall_time_sec": fit_info.get("time"), "final_loss": loss[-1] if loss else float("nan"), "final_val_loss": val[-1] if val else float("nan"), "min_val_loss": min(val) if val else float("nan"), }) return pandas.DataFrame(rows) def _aggregate_training_summary(label, summary): finetune = summary[summary.phase == "finetune"] pretrain = summary[summary.phase == "pretrain"] return { "side": label, "n_models": int(summary.model_name.nunique()), "finetune_total_wall_min": ( finetune.wall_time_sec.sum() / 60 if len(finetune) else float("nan") ), "finetune_median_wall_min": ( finetune.wall_time_sec.median() / 60 if len(finetune) else float("nan") ), "finetune_max_wall_min": ( finetune.wall_time_sec.max() / 60 if len(finetune) else float("nan") ), "finetune_median_epochs": ( finetune.n_epochs.median() if len(finetune) else float("nan") ), "finetune_max_epochs": ( finetune.n_epochs.max() if len(finetune) else float("nan") ), "finetune_min_val_loss_p25": ( finetune.min_val_loss.quantile(0.25) if len(finetune) else float("nan") ), "finetune_min_val_loss_median": ( finetune.min_val_loss.median() if len(finetune) else float("nan") ), "pretrain_median_wall_sec": ( pretrain.wall_time_sec.median() if len(pretrain) else float("nan") ), } # --------------------------------------------------------------------------- # Component: affinity # --------------------------------------------------------------------------- def _predict_affinity_chunk(predictor_dir, peptides, alleles, chunk_num): """Worker entry: load affinity predictor, score one chunk.""" from .. import Class1AffinityPredictor predictor = Class1AffinityPredictor.load(predictor_dir) return chunk_num, numpy.asarray(predictor.predict( peptides=peptides, alleles=alleles, throw=False)) def _parallel_affinity_predict( args, predictor_dir, peptides, alleles, model_bytes=None): if len(peptides) == 0: return numpy.asarray([], dtype=float) worker_pool = worker_pool_with_gpu_assignments_from_args( args, workload_name=WORKLOAD_AFFINITY_INFERENCE, workload_hints={ "elastic_batch": default_prediction_batch_is_auto(), "model_bytes": ( model_bytes or model_artifact_size_bytes(predictor_dir)), "prediction_rows": len(peptides), }, start_method="spawn", ) _stamp( " prediction plan: jobs=%d, gpus=%d, workers/gpu=%d, backend=%s" % ( int(args.num_jobs), int(args.gpus or 0), int(args.max_workers_per_gpu), args.backend, ) ) if worker_pool is None: _, predictions = _predict_affinity_chunk( predictor_dir, peptides, alleles, chunk_num=0) return predictions work_items = [] for (chunk_num, start, end) in chunk_ranges_for_local_parallelism( len(peptides), args.num_jobs): work_items.append({ "chunk_num": chunk_num, "predictor_dir": predictor_dir, "peptides": peptides[start:end], "alleles": alleles[start:end], }) try: results = worker_pool.imap_unordered( partial(call_wrapped_kwargs, _predict_affinity_chunk), work_items, chunksize=1, ) chunks = [result for result in results] worker_pool.close() worker_pool.join() worker_pool = None finally: # On failure mid-iteration, terminate() rather than close()/join() # (which can hang on a wedged worker) and leave non-daemon workers # behind. Mirrors the predict / predict-scan teardown. if worker_pool is not None: worker_pool.terminate() worker_pool.join() # chunk_num is unique per work item, so sorted() never compares ndarrays. return numpy.concatenate([values for (_, values) in sorted(chunks)]) def _read_supported_alleles(predictor_dir): path = os.path.join(predictor_dir, LEGACY_ALLELE_SEQUENCES_FILENAME) if not os.path.exists(path): raise ValueError( "Affinity predictor is missing its allele sequence registry: %s" % path ) df = pandas.read_csv(path) if df.empty: raise ValueError("Affinity allele sequence registry is empty: %s" % path) col = "normalized_allele" if "normalized_allele" in df.columns else df.columns[0] sequence_col = next( (name for name in df.columns if name != col), None) result = set() skipped = [] for _, row in df.iterrows(): raw = row[col] sequence = str(row[sequence_col]) if sequence_col else "" normalized = normalize_allele_name( raw, raise_on_error=False, use_allele_aliases=False) if normalized is None or "X" in sequence: alias_normalized = normalize_allele_name( raw, raise_on_error=False, use_allele_aliases=True) if alias_normalized is not None: normalized = alias_normalized if normalized is None: skipped.append(str(raw)) continue result.add(normalized) if skipped: _stamp( "WARNING: ignored %d pseudosequence registry key(s) that the " "predictor API cannot canonicalize: %s%s" % ( len(skipped), ", ".join(skipped[:3]), " ..." if len(skipped) > 3 else "", ) ) if not result: raise ValueError( "Affinity allele sequence registry has no canonicalizable " "class-I alleles: %s" % path ) return result def _read_holdout_benchmark_files(files, samples, context): """Validate all input rows, retaining only heldout rows in bounded chunks. File and row order are unchanged. A chunk need not contain both classes; the assembled comparison is checked again by its component evaluator. """ frames = [] empty = None loaded = retained = 0 for index, path in enumerate(files): with pandas.read_csv(path, chunksize=100000) as reader: for frame in reader: _require_complete_benchmark_rows( frame, ("peptide", "sample_id", "hla", "hit"), context) _require_binary_comparison_rows(frame, context, require_both_classes=False) loaded += len(frame) frame["source_file"] = os.path.basename(path) selected = frame.loc[frame.sample_id.astype(str).isin(samples)].copy() retained += len(selected) if len(selected): frames.append(selected) elif empty is None: empty = selected _stamp(" scanned %d/%d files: %d rows, retained %d holdout rows" % ( index + 1, len(files), loaded, retained)) if frames: return pandas.concat(frames, ignore_index=True) return empty if empty is not None else pandas.DataFrame() def _load_affinity_benchmark(data_dir, source, limit_files, samples=None): if source == "both": patterns = ["mixmhcpred", "netmhcpan4"] else: patterns = [source] files = [] for pat in patterns: files.extend(sorted(glob.glob(os.path.join( data_dir, "benchmark.monoallelic.%s.train_excluded.*.csv.bz2" % pat, )))) if limit_files: files = files[:limit_files] _stamp("affinity benchmark: %d files" % len(files)) if not files: raise SystemExit("No affinity benchmark files in %s" % data_dir) if samples is not None: return _read_holdout_benchmark_files(files, samples, "Affinity benchmark") dfs = [] for i, f in enumerate(files): df = pandas.read_csv(f) df["source_file"] = os.path.basename(f) dfs.append(df) if (i + 1) % 50 == 0: _stamp(" loaded %d/%d" % (i + 1, len(files))) return pandas.concat(dfs, ignore_index=True) def _affinity_training_data_path(predictor_dir): """Return recorded training rows for an affinity predictor, if present.""" for filename in ("train_data.csv.bz2", "train_data.csv"): path = os.path.join(predictor_dir, filename) if os.path.isfile(path): return path return None def _exclude_affinity_training_overlap( test, side_a, side_b, policy="exclude"): """Audit, and optionally drop, side A/B training pMHC overlap.""" if policy not in ("exclude", "audit"): raise ValueError("Unknown affinity training-overlap policy: %s" % policy) benchmark_index = pandas.MultiIndex.from_frame(test[["hla", "peptide"]]) union_mask = numpy.zeros(len(test), dtype=bool) report = { "policy": policy, "policy_description": ( "drop union of side A and side B affinity training pMHCs" if policy == "exclude" else "audit side A and side B affinity training pMHCs only" ), "rows_before": int(len(test)), "hits_before": int(test.hit.sum()), "sides": {}, } for side in (side_a, side_b): predictor_dir = side["paths"]["affinity"] training_path = _affinity_training_data_path(predictor_dir) if training_path is None: raise ValueError( "Release affinity comparison cannot audit training overlap " "for %s: missing train_data.csv[.bz2] in %s" % ( side["label"], predictor_dir) ) training = pandas.read_csv( training_path, usecols=["allele", "peptide"]) allele_map = canonical_allele_mapping(training.allele) training["allele"] = training.allele.astype(str).map(allele_map) training = training.loc[training.allele.notna()] training_index = pandas.MultiIndex.from_frame( training[["allele", "peptide"]]).unique() overlap_mask = benchmark_index.isin(training_index) union_mask |= overlap_mask report["sides"][side["letter"]] = { "label": side["label"], "predictor_dir": predictor_dir, "training_data": training_path, "training_rows": int(len(training)), "training_unique_pmhcs": int(len(training_index)), "overlap_rows": int(overlap_mask.sum()), "overlap_hits": int(test.hit.loc[overlap_mask].sum()), "overlap_unique_pmhcs": int( benchmark_index[overlap_mask].nunique()), } retained_mask = ~union_mask if policy == "exclude" else numpy.ones( len(test), dtype=bool) report.update({ "exclusion_applied": policy == "exclude", "union_overlap_rows": int(union_mask.sum()), "union_overlap_hits": int(test.hit.loc[union_mask].sum()), "union_overlap_unique_pmhcs": int( benchmark_index[union_mask].nunique()), "rows_after": int(retained_mask.sum()), "hits_after": int(test.hit.loc[retained_mask].sum()), }) _stamp( " release training-overlap %s: %d rows / %d hits overlap; " "%d rows / %d hits scored" % ( policy, report["union_overlap_rows"], report["union_overlap_hits"], report["rows_after"], report["hits_after"], ) ) return test.loc[retained_mask].copy(), report def _filter_release_holdout_samples(frame, args, component): """Restrict a benchmark to its frozen release-evaluation samples.""" if not args.release_holdout_dir: return frame filenames = { "affinity": "affinity_samples.csv", "processing": "processing_samples.csv", "presentation": "presentation_samples.csv", } path = os.path.join(args.release_holdout_dir, filenames[component]) samples = load_excluded_samples(path) sample_ids = frame.sample_id.astype(str) result = frame.loc[sample_ids.isin(samples)].copy() if result.empty: raise ValueError( "Release holdout selected no %s benchmark rows using %s" % ( component, path)) _stamp( " release holdout %s: %d rows, %d samples" % ( component, len(result), result.sample_id.nunique())) if getattr(args, "limit_files", None): selected_files = result.source_file.drop_duplicates().iloc[ :args.limit_files ] result = result.loc[result.source_file.isin(selected_files)].copy() _stamp( " release holdout %s file limit: %d files, %d rows" % ( component, len(selected_files), len(result), ) ) return result def _load_presentation_benchmark_for_component(data_dir, args, component): """Load, holdout-filter, then file-limit a presentation benchmark.""" initial_file_limit = None if args.release_holdout_dir else args.limit_files row_filter = None options = {} if args.release_holdout_dir: row_filter = partial( _filter_release_holdout_samples, args=args, component=component, ) options["samples"] = load_excluded_samples(os.path.join( args.release_holdout_dir, component + "_samples.csv")) return _load_presentation_benchmark( data_dir, initial_file_limit, row_filter=row_filter, **options, ) def _sha256_file(path, chunk_size=1024 * 1024): digest = hashlib.sha256() with open(path, "rb") as fd: for chunk in iter(lambda: fd.read(chunk_size), b""): digest.update(chunk) return digest.hexdigest() def _load_reused_affinity_predictions( path, prediction_column, expected_identity, label): """Load saved predictions after proving their cohort is identical.""" path = os.path.abspath(path) if not os.path.isfile(path): raise ValueError( "Saved affinity predictions for %s do not exist: %s" % (label, path)) required = ["source_file", "hla", "peptide", "hit", prediction_column] try: saved = pandas.read_csv(path, usecols=required) except ValueError as error: raise ValueError( "Saved affinity predictions for %s lack a required column: %s" % (label, error)) from error identity = _affinity_benchmark_identity(saved) if identity != expected_identity: raise ValueError( "Saved affinity predictions for %s use different benchmark rows: " "%s versus %s" % (label, identity, expected_identity)) values = pandas.to_numeric( saved[prediction_column], errors="coerce").to_numpy() return values, { "mode": "reused", "path": path, "prediction_column": prediction_column, "sha256": _sha256_file(path), "benchmark_identity": identity, } def _run_affinity(side_a, side_b, args): component_dir = os.path.join(args.out, "affinity") os.makedirs(component_dir, exist_ok=True) affinity_args = _parallelism_args_for_component(args, "affinity") data_dir = args.data_dir or _default_data_evaluation_dir() initial_file_limit = None if args.release_holdout_dir else args.limit_files load_options = {} if args.release_holdout_dir: load_options["samples"] = load_excluded_samples(os.path.join( args.release_holdout_dir, "affinity_samples.csv")) test = _load_affinity_benchmark( data_dir, args.affinity_source, initial_file_limit, **load_options) test = _filter_release_holdout_samples(test, args, "affinity") _require_complete_benchmark_rows( test, ("peptide", "hla", "hit"), "Affinity benchmark") try: test["hla"] = test["hla"].map( normalize_sequence_resolved_allele_name) except ValueError as error: raise ValueError( "Affinity benchmark contains an invalid class-I allele: %s" % error ) from error a_alleles = _read_supported_alleles(side_a["paths"]["affinity"]) b_alleles = _read_supported_alleles(side_b["paths"]["affinity"]) both = a_alleles & b_alleles if not both: raise ValueError( "Affinity predictors have no shared sequence-resolved alleles; " "a fair comparison cannot be computed." ) before = len(test) test = test[test.hla.isin(both)].copy() if len(test) < before: _stamp( " dropped %d rows outside the %d-allele intersect" % (before - len(test), len(both)) ) test["peptide_len"] = test["peptide"].str.len() test = test[(test.peptide_len >= 8) & (test.peptide_len <= 15)].copy() test["hit"] = pandas.to_numeric(test["hit"], errors="coerce") _require_binary_comparison_rows(test, "Affinity benchmark") training_overlap = None if args.release_holdout_dir: test, training_overlap = _exclude_affinity_training_overlap( test, side_a, side_b, policy=args.affinity_training_overlap_policy, ) _require_binary_comparison_rows( test, "Train-excluded release affinity benchmark") with open( os.path.join(component_dir, "training_overlap.json"), "w") as fd: json.dump(training_overlap, fd, indent=2, sort_keys=True) benchmark_identity = _affinity_benchmark_identity(test) _stamp(" evaluable rows: %d" % len(test)) comparison_model_bytes = max( model_artifact_size_bytes(side_a["paths"]["affinity"]) or 0, model_artifact_size_bytes(side_b["paths"]["affinity"]) or 0, ) or None prediction_sources = {} for letter, side in (("a", side_a), ("b", side_b)): saved_path = getattr( args, "%s_affinity_predictions" % letter, None) if saved_path: _stamp("reusing side %s affinity predictions..." % letter.upper()) predictions, source = _load_reused_affinity_predictions( saved_path, getattr( args, "%s_affinity_prediction_column" % letter, "%s_pred" % letter, ), benchmark_identity, side["label"], ) else: _stamp("predicting side %s affinity..." % letter.upper()) predictions = _parallel_affinity_predict( affinity_args, side["paths"]["affinity"], test.peptide.values, test.hla.values, model_bytes=comparison_model_bytes, ) source = { "mode": "computed", "predictor_dir": side["paths"]["affinity"], "benchmark_identity": benchmark_identity, } test["%s_pred" % letter] = predictions prediction_sources[letter] = source _require_valid_affinity_predictions( test, labels=(side_a["label"], side_b["label"]), ) _require_binary_comparison_rows( test, "Affinity comparison for %s versus %s" % ( side_a["label"], side_b["label"] )) test["a_score"] = -numpy.log10(numpy.clip(test.a_pred, 1e-3, 1e8)) test["b_score"] = -numpy.log10(numpy.clip(test.b_pred, 1e-3, 1e8)) if args.skip_affinity_predictions: _stamp( " skipped predictions.csv.bz2 (%d rows; " "--skip-affinity-predictions)" % len(test) ) else: test.to_csv( os.path.join(component_dir, "predictions.csv.bz2"), index=False) _stamp(" wrote predictions.csv.bz2 (%d rows)" % len(test)) per_allele = _affinity_per_allele(test) per_allele.to_csv( os.path.join(component_dir, "per_allele.csv"), index=False) _stamp(" wrote per_allele.csv (%d alleles)" % len(per_allele)) per_length, per_length_per_allele = _affinity_per_length(test) per_length.to_csv( os.path.join(component_dir, "per_length.csv"), index=False) if not per_length_per_allele.empty: per_length_per_allele.to_csv( os.path.join(component_dir, "per_length_per_allele.csv"), index=False, ) summary = _affinity_summary(test, per_allele, per_length) summary["benchmark_identity"] = benchmark_identity summary["prediction_sources"] = prediction_sources if training_overlap is not None: summary["training_overlap"] = training_overlap with open(os.path.join(component_dir, "summary.json"), "w") as fd: json.dump(summary, fd, indent=2, sort_keys=True) _stamp(" wrote summary.json") return summary def _affinity_benchmark_identity(test): """Return a stable within-version identity for scored affinity rows. This is intentionally calculated after allele intersection, peptide-length filtering, frozen-holdout selection, and training-overlap exclusion. It lets a factorial evaluator prove that every candidate/public comparison used the same rows instead of inferring comparability from row counts. """ columns = [ column for column in ("source_file", "hla", "peptide", "hit") if column in test ] if columns != ["source_file", "hla", "peptide", "hit"]: raise ValueError( "Affinity benchmark identity requires columns: " "source_file, hla, peptide, hit") row_hashes = pandas.util.hash_pandas_object( test[columns], index=False, categorize=True, ).to_numpy(dtype=" 0).sum()) for metric in METRIC_NAMES } | { "b_better_%s" % metric: int((per_allele["%s_diff" % metric] < 0).sum()) for metric in METRIC_NAMES }, "per_length": per_length.to_dict(orient="records"), } # --------------------------------------------------------------------------- # Component: processing # --------------------------------------------------------------------------- def _processing_model_dir(processing_root, mode): """Return the model directory for one processing flank ``mode``.""" if not processing_root: return None candidates = [ os.path.join(processing_root, "models.selected.%s" % mode), processing_root, ] expected_basename = "models.selected.%s" % mode for path in candidates: if ( os.path.isdir(path) and os.path.basename(os.path.normpath(path)) == expected_basename): return path return None def _predict_processing_chunk(predictor_dir, rows, mode, chunk_num): """Worker entry: load processing predictor, score one chunk.""" from .. import Class1ProcessingPredictor predictor = Class1ProcessingPredictor.load(predictor_dir) df = pandas.DataFrame(rows) kwargs = { "peptides": df.peptide.values, "batch_size": "auto", "throw": False, } if mode in ("with_flanks", "short_flanks"): kwargs["n_flanks"] = df.n_flank.values kwargs["c_flanks"] = df.c_flank.values elif mode != "no_flank": raise ValueError("Unexpected processing mode: %s" % mode) predictions = numpy.asarray(predictor.predict(**kwargs)) if len(predictions) != len(df): raise ValueError( "Predictor returned %d rows for %d inputs" % ( len(predictions), len(df)) ) return chunk_num, predictions def _parallel_processing_predict( args, predictor_dir, df, mode, label, model_bytes=None): if len(df) == 0: return numpy.asarray([], dtype=float) worker_pool = worker_pool_with_gpu_assignments_from_args( args, workload_name=WORKLOAD_PROCESSING_INFERENCE, workload_hints={ "elastic_batch": True, "model_bytes": ( model_bytes or model_artifact_size_bytes(predictor_dir)), "prediction_rows": len(df), }, start_method="spawn", ) _stamp("predicting %s processing (%s, %d rows)" % (label, mode, len(df))) if worker_pool is None: _, predictions = _predict_processing_chunk( predictor_dir, df.to_dict("list"), mode, chunk_num=0) return predictions work_items = [] for (chunk_num, start, end) in chunk_ranges_for_local_parallelism( len(df), args.num_jobs): work_items.append({ "chunk_num": chunk_num, "predictor_dir": predictor_dir, "rows": df.iloc[start:end].to_dict("list"), "mode": mode, }) try: results = worker_pool.imap_unordered( partial(call_wrapped_kwargs, _predict_processing_chunk), work_items, chunksize=1, ) chunks = [result for result in results] worker_pool.close() worker_pool.join() worker_pool = None finally: if worker_pool is not None: worker_pool.terminate() worker_pool.join() return numpy.concatenate([ values for (_, values) in sorted(chunks, key=lambda t: t[0]) ]) def _run_processing(side_a, side_b, args): requested_modes = _requested_modes( args.processing_modes, PROCESSING_MODES, "--processing-modes") model_dirs = _processing_model_dirs(side_a, side_b, requested_modes) component_dir = os.path.join(args.out, "processing") os.makedirs(component_dir, exist_ok=True) # Invalidate a prior completion marker before attempting a rerun. A failed # prediction must not leave old tables labelled as this matched evaluation. cohort_path = os.path.join(component_dir, "cohort.json") policy = getattr(args, "processing_negative_policy", "matched") with open(cohort_path, "w") as fd: json.dump({"policy": "incomplete", "requested_policy": policy, "processing_release_eligible": False}, fd, indent=2) processing_args = _parallelism_args_for_component(args, "processing") data_dir = args.data_dir or _default_data_evaluation_dir() benchmark = _load_presentation_benchmark_for_component( data_dir, args, "processing") assignments = None cohort_info = {"policy": policy, "processing_release_eligible": policy == "matched"} prepared_cohort = getattr(args, "processing_matched_cohort", None) if prepared_cohort: if policy != "matched": raise ValueError("A prepared processing cohort requires the matched policy") from ..processing_evaluation import load_processing_cohort benchmark, metadata = load_processing_cohort(prepared_cohort, benchmark) assignments = benchmark.copy() assignments["source_row"] = numpy.arange(len(benchmark)) cohort_info.update(prepared_cohort=metadata, affinity_reference=metadata["affinity_reference"]) assignments.to_csv(os.path.join(component_dir, "matching_assignments.csv.bz2"), index=False) elif policy == "matched": from .processing_affinity_control import _attach_affinity from ..processing_matching import make_affinity_controlled_risk_sets benchmark, affinity_sources = _attach_affinity(benchmark, data_dir) assignments, diagnostics = make_affinity_controlled_risk_sets(benchmark) cohort_info.update(diagnostics=diagnostics, affinity_sources=affinity_sources, affinity_reference="frozen cached production affinity") assignments.to_csv(os.path.join(component_dir, "matching_assignments.csv.bz2"), index=False) summaries = {} summary_rows = [] for mode in requested_modes: a_model_dir, b_model_dir = model_dirs[mode] _stamp("=== processing mode: %s ===" % mode) scored = benchmark[[ "peptide", "sample_id", "hla", "hit", "peptide_len", "n_flank", "c_flank", ]].copy() comparison_model_bytes = max( model_artifact_size_bytes(a_model_dir) or 0, model_artifact_size_bytes(b_model_dir) or 0, ) or None scored["a_processing_score"] = _parallel_processing_predict( processing_args, a_model_dir, benchmark, mode, label="A", model_bytes=comparison_model_bytes) scored["b_processing_score"] = _parallel_processing_predict( processing_args, b_model_dir, benchmark, mode, label="B", model_bytes=comparison_model_bytes) _require_finite_processing_scores( scored, mode=mode, labels=(side_a["label"], side_b["label"]), ) # The complete unique-row cohort remains available for external joins; # primary metrics and plots consume only the fixed matched risk sets. scored.insert(0, "source_row", numpy.arange(len(scored))) scored.to_csv(os.path.join(component_dir, "heldout_predictions_%s.csv.bz2" % mode), index=False) if assignments is not None: values = scored[["a_processing_score", "b_processing_score"]].iloc[ assignments.source_row].reset_index(drop=True) scored = assignments.copy() scored[values.columns] = values scored["processing_negative_policy"] = policy pred_path = os.path.join( component_dir, "predictions_%s.csv.bz2" % mode) scored.to_csv(pred_path, index=False) _stamp(" wrote %s" % pred_path) shared_scored = _shared_score_rows(scored, "processing_score") per_sample = _presentation_per_sample(shared_scored, "processing_score") per_sample.to_csv( os.path.join( component_dir, "per_sample_%s_processing_score.csv" % mode, ), index=False, ) per_length, per_length_per_sample = _presentation_per_length( shared_scored, "processing_score") per_length.to_csv( os.path.join( component_dir, "per_length_%s_processing_score.csv" % mode, ), index=False, ) if not per_length_per_sample.empty: per_length_per_sample.to_csv( os.path.join( component_dir, "per_length_per_sample_%s_processing_score.csv" % mode, ), index=False, ) summary = _presentation_mode_summary( shared_scored, per_sample, per_length, mode, "processing_score") summary["processing_negative_policy"] = policy summaries[mode] = {"processing_score": summary} summary_rows.append(_presentation_summary_row(summary)) with open(os.path.join(component_dir, "summary.json"), "w") as fd: json.dump(summaries, fd, indent=2, sort_keys=True) summary_table = pandas.DataFrame( summary_rows, columns=_component_summary_table_columns()) summary_table["processing_negative_policy"] = policy summary_table.to_csv( os.path.join(component_dir, "summary_table.csv"), index=False) with open(cohort_path, "w") as fd: json.dump(cohort_info, fd, indent=2, sort_keys=True) _stamp(" wrote processing summary.json + summary_table.csv") return { "negative_policy": policy, "modes": [row["mode"] for row in summary_rows], "summaries": summaries, } # --------------------------------------------------------------------------- # Component: presentation # --------------------------------------------------------------------------- def _predict_presentation_chunk(predictor_dir, rows, mode, chunk_num): """Worker entry: load presentation predictor, score one chunk.""" from .. import Class1PresentationPredictor predictor = Class1PresentationPredictor.load(predictor_dir) df = pandas.DataFrame(rows) sample_to_alleles = ( df.drop_duplicates("sample_id") .set_index("sample_id") .hla.str.split() .to_dict() ) kwargs = dict( peptides=df.peptide.values, sample_names=df.sample_id.values, alleles=sample_to_alleles, verbose=0, throw=False, ) if mode == "with_flanks": kwargs["n_flanks"] = df.n_flank.values kwargs["c_flanks"] = df.c_flank.values elif mode != "without_flanks": raise ValueError("Unexpected presentation mode: %s" % mode) pred = predictor.predict(**kwargs) if len(pred) != len(df): raise ValueError( "Predictor returned %d rows for %d inputs" % (len(pred), len(df)) ) out_cols = [ "presentation_score", "presentation_percentile", "affinity", "processing_score", ] out = pandas.DataFrame(index=df.index) for col in out_cols: out[col] = pred[col].values if col in pred else numpy.nan return chunk_num, out def _parallel_presentation_predict( args, predictor_dir, df, mode, label, model_bytes=None): if len(df) == 0: return pandas.DataFrame() worker_pool = worker_pool_with_gpu_assignments_from_args( args, workload_name=WORKLOAD_PRESENTATION_INFERENCE, workload_hints={ "elastic_batch": default_prediction_batch_is_auto(), "model_bytes": ( model_bytes or model_artifact_size_bytes(predictor_dir)), "prediction_rows": len(df), }, start_method="spawn", ) _stamp("predicting %s presentation (%s, %d rows)" % (label, mode, len(df))) if worker_pool is None: _, frame = _predict_presentation_chunk( predictor_dir, df.to_dict("list"), mode, chunk_num=0) return frame.reset_index(drop=True) work_items = [] for (chunk_num, start, end) in chunk_ranges_for_local_parallelism( len(df), args.num_jobs): work_items.append({ "chunk_num": chunk_num, "predictor_dir": predictor_dir, "rows": df.iloc[start:end].to_dict("list"), "mode": mode, }) try: results = worker_pool.imap_unordered( partial(call_wrapped_kwargs, _predict_presentation_chunk), work_items, chunksize=1, ) chunks = [result for result in results] worker_pool.close() worker_pool.join() worker_pool = None finally: # On failure mid-iteration, terminate() rather than close()/join() # (which can hang on a wedged worker) and leave non-daemon workers # behind. Mirrors the predict / predict-scan teardown. if worker_pool is not None: worker_pool.terminate() worker_pool.join() return pandas.concat( [frame for (_, frame) in sorted(chunks, key=lambda t: t[0])], ignore_index=True, ) def _load_presentation_benchmark(data_dir, limit_files, row_filter=None, samples=None): files = sorted(glob.glob(os.path.join( data_dir, "benchmark.multiallelic.train_excluded.*.csv.bz2", ))) if limit_files: files = files[:limit_files] if not files: raise SystemExit( "No presentation benchmark files in %s " "(benchmark.multiallelic.train_excluded.*.csv.bz2)" % data_dir) _stamp("presentation benchmark: %d files" % len(files)) if samples is not None: result = _read_holdout_benchmark_files(files, samples, "Presentation benchmark") else: dfs = [] for i, path in enumerate(files): df = pandas.read_csv(path) df["source_file"] = os.path.basename(path) dfs.append(df) if (i + 1) % 25 == 0: _stamp(" loaded %d/%d" % (i + 1, len(files))) result = pandas.concat(dfs, ignore_index=True) required = {"peptide", "sample_id", "hla", "hit"} missing = sorted(required - set(result.columns)) if missing: raise ValueError("Presentation benchmark missing columns: %s" % missing) _require_complete_benchmark_rows( result, ("peptide", "sample_id", "hla", "hit"), "Presentation benchmark", ) result = result.copy() result["hit"] = pandas.to_numeric(result["hit"], errors="coerce") _require_binary_comparison_rows(result, "Presentation benchmark") if row_filter is not None: # Genotype normalization dominates runtime for the full benchmark. # Release evaluation only needs its frozen samples, so select those # rows after whole-input integrity checks but before parsing genotypes. result = row_filter(result) # A release benchmark has millions of peptide rows but only a handful of # distinct sample genotypes. Parse each distinct genotype once, then map # the canonical value back without changing row order or validation. normalized_genotypes = { value: _normalize_benchmark_genotype(value) for value in pandas.unique(result["hla"]) } result["hla"] = result["hla"].map(normalized_genotypes) genotype_counts = result.groupby("sample_id", dropna=False).hla.nunique() inconsistent_samples = genotype_counts[genotype_counts > 1] if not inconsistent_samples.empty: examples = ", ".join( "%s (%d genotypes)" % (sample_id, count) for sample_id, count in inconsistent_samples.head(3).items() ) raise ValueError( "Presentation benchmark maps %d sample_id value(s) to multiple " "HLA genotypes; examples: %s" % ( len(inconsistent_samples), examples) ) result["hit"] = result["hit"].astype(int) result["peptide_len"] = result.peptide.str.len() result = result[ (result.peptide_len >= 8) & (result.peptide_len <= 15) ].reset_index(drop=True) _require_binary_comparison_rows( result, "Presentation benchmark after peptide-length filtering") for col in ("n_flank", "c_flank"): if col not in result: result[col] = "" result[col] = result[col].fillna("") _stamp( " benchmark rows after filtering: %d (samples=%d, hits=%d)" % ( len(result), result.sample_id.nunique(), int(result.hit.sum()), ) ) return result def _normalize_benchmark_genotype(value): """Canonicalize a whitespace-delimited class-I MHC allele set deterministically.""" try: normalized = sorted(normalize_class1_genotype(value)) except ValueError as exc: raise ValueError( "Invalid presentation benchmark HLA genotype %r: %s" % ( value, exc) ) from exc return " ".join(normalized) def _score_values(df, prefix, score_kind): """Higher = better for the score we feed sklearn. ``presentation_score`` and ``processing_score`` are already higher-better; ``presentation_percentile`` is lower-better so we negate it. """ if score_kind == "presentation_score": return df["%s_presentation_score" % prefix].values if score_kind == "presentation_percentile": return -df["%s_presentation_percentile" % prefix].values if score_kind == "processing_score": return df["%s_processing_score" % prefix].values raise ValueError("Unknown score kind: %s" % score_kind) def _score_pair_columns(score_kind): if score_kind not in METRIC_SCORE_KINDS: raise ValueError("Unknown score kind: %s" % score_kind) return ("a_%s" % score_kind, "b_%s" % score_kind) def _shared_score_rows(scored, score_kind): """Return rows where both sides have a score for ``score_kind``. A/B release metrics are only meaningful when both sides are scored on the same examples. Predictors run with ``throw=False`` can emit non-finite values for unsupported peptides, so filter on both side-specific score columns before computing support counts or metric differences. """ columns = list(_score_pair_columns(score_kind)) finite = numpy.ones(len(scored), dtype=bool) for column in columns: finite &= numpy.isfinite(pandas.to_numeric( scored[column], errors="coerce").values) return scored.loc[finite].copy() def _require_finite_processing_scores(scored, mode, labels): """Fail a release comparison when either model misses benchmark rows.""" failures = [] for side, label in zip(("a", "b"), labels): column = "%s_processing_score" % side values = pandas.to_numeric(scored[column], errors="coerce").values bad = ~numpy.isfinite(values) if not bad.any(): continue examples = scored.loc[bad, "peptide"].astype(str).head(3).tolist() failures.append( "%s (%s): %d non-finite score(s), examples: %s" % ( side.upper(), label, int(bad.sum()), ", ".join(examples) ) ) if failures: raise ValueError( "Processing comparison mode %s requires every benchmark peptide " "to be scored by both models. %s. Check peptide validity and each " "model's supported peptide-length range." % ( mode, "; ".join(failures) ) ) def _require_valid_affinity_predictions(scored, labels): """Fail when either affinity model omits or corrupts a benchmark row.""" failures = [] for side, label in zip(("a", "b"), labels): column = "%s_pred" % side values = pandas.to_numeric(scored[column], errors="coerce").values bad = ~numpy.isfinite(values) | (values <= 0) if not bad.any(): continue examples = [ "%s:%s" % (row.hla, row.peptide) for row in scored.loc[bad, ["hla", "peptide"]].head(3).itertuples() ] failures.append( "%s (%s): %d invalid IC50 prediction(s), examples: %s" % ( side.upper(), label, int(bad.sum()), ", ".join(examples) ) ) if failures: raise ValueError( "Affinity comparison requires a finite, positive IC50 prediction " "for every benchmark row on both sides. %s. Check allele support, " "peptide validity, and model output integrity." % "; ".join(failures) ) def _require_finite_presentation_scores(scored, mode, labels, score_kinds=PRESENTATION_SCORE_KINDS): """Fail when either presentation model omits a release benchmark row.""" failures = [] for side, label in zip(("a", "b"), labels): for score_kind in score_kinds: column = "%s_%s" % (side, score_kind) values = pandas.to_numeric(scored[column], errors="coerce").values bad = ~numpy.isfinite(values) if not bad.any(): continue examples = scored.loc[bad, "peptide"].astype(str).head(3).tolist() failures.append( "%s (%s) %s: %d non-finite score(s), examples: %s" % ( side.upper(), label, score_kind, int(bad.sum()), ", ".join(examples), ) ) if failures: raise ValueError( "Presentation comparison mode %s requires every benchmark row to " "have finite requested scores (%s) on both sides. %s. " "Check allele support, peptide validity, and percentile " "calibration." % (mode, ", ".join(score_kinds), "; ".join(failures)) ) def _presentation_per_sample(scored, score_kind): # NOTE: unlike _affinity_per_allele (which skips groups with <30 rows or # zero hits before entering the macro), this per-sample macro applies no # min-N / class-balance floor -- every (sample_id, hla) group is included, # and only fully-degenerate groups (all-hit or all-decoy) drop out via the # NaN that the downstream nanmean skips. This asymmetry is intentional (the # two macros were never defined to share a threshold), but it does mean the # presentation macro can be pulled around by small, noisy samples. rows = [] for (sample_id, hla), group in scored.groupby( ["sample_id", "hla"], dropna=False): m_a = _metrics(group.hit.values, _score_values(group, "a", score_kind)) m_b = _metrics(group.hit.values, _score_values(group, "b", score_kind)) row = { "sample_id": sample_id, "hla": hla, "n": m_a["n"], "n_pos": m_a["n_pos"], } for metric in METRIC_NAMES: row["a_%s" % metric] = m_a[metric] row["b_%s" % metric] = m_b[metric] rows.append(row) return _metric_table(rows, ["sample_id", "hla"]).sort_values( "n", ascending=False) def _presentation_per_length(scored, score_kind): rows = [] per_length_per_sample = [] for length, group in scored.groupby("peptide_len"): m_a = _metrics(group.hit.values, _score_values(group, "a", score_kind)) m_b = _metrics(group.hit.values, _score_values(group, "b", score_kind)) sub_sample = _presentation_per_sample(group, score_kind) sub_sample["length"] = int(length) per_length_per_sample.append(sub_sample) row = { "length": int(length), "n": m_a["n"], "n_pos": m_a["n_pos"], "n_samples_reported": int(len(sub_sample)), } for metric in METRIC_NAMES: row["a_micro_%s" % metric] = m_a[metric] row["b_micro_%s" % metric] = m_b[metric] row["micro_%s_diff" % metric] = m_a[metric] - m_b[metric] with warnings.catch_warnings(): # All-NaN slices emit a RuntimeWarning; nan is the intended # result here (matches the silent pandas .mean() macro above). warnings.simplefilter("ignore", category=RuntimeWarning) macro_a = float(numpy.nanmean(sub_sample["a_%s" % metric])) macro_b = float(numpy.nanmean(sub_sample["b_%s" % metric])) row["a_macro_%s" % metric] = macro_a row["b_macro_%s" % metric] = macro_b row["macro_%s_diff" % metric] = macro_a - macro_b rows.append(row) per_length = pandas.DataFrame( rows, columns=_presentation_per_length_columns(), ).sort_values("length") if per_length_per_sample: per_length_per_sample = pandas.concat( per_length_per_sample, ignore_index=True) else: per_length_per_sample = pandas.DataFrame( columns=_metric_table_columns(["sample_id", "hla", "length"])) return per_length, per_length_per_sample def _presentation_mode_summary(scored, per_sample, per_length, mode, score_kind): m_a = _metrics(scored.hit.values, _score_values(scored, "a", score_kind)) m_b = _metrics(scored.hit.values, _score_values(scored, "b", score_kind)) return { "mode": mode, "score_kind": score_kind, "n_rows": int(m_a["n"]), "n_hits": int(m_a["n_pos"]), "n_samples_reported": int(len(per_sample)), "micro_pooled": {"a": m_a, "b": m_b}, "macro_mean_over_samples": { metric: { "a": float(numpy.nanmean(per_sample["a_%s" % metric])), "b": float(numpy.nanmean(per_sample["b_%s" % metric])), } for metric in METRIC_NAMES }, "sample_count": { "a_better_%s" % m: int((per_sample["%s_diff" % m] > 0).sum()) for m in METRIC_NAMES } | { "b_better_%s" % m: int((per_sample["%s_diff" % m] < 0).sum()) for m in METRIC_NAMES }, "per_length": per_length.to_dict(orient="records"), } def _presentation_summary_row(summary): row = { "mode": summary["mode"], "score_kind": summary["score_kind"], "n_rows": summary["n_rows"], "n_hits": summary["n_hits"], "n_samples_reported": summary["n_samples_reported"], } for metric in METRIC_NAMES: row["a_micro_%s" % metric] = summary["micro_pooled"]["a"][metric] row["b_micro_%s" % metric] = summary["micro_pooled"]["b"][metric] row["micro_%s_diff" % metric] = ( row["a_micro_%s" % metric] - row["b_micro_%s" % metric] ) row["a_macro_%s" % metric] = ( summary["macro_mean_over_samples"][metric]["a"] ) row["b_macro_%s" % metric] = ( summary["macro_mean_over_samples"][metric]["b"] ) row["macro_%s_diff" % metric] = ( row["a_macro_%s" % metric] - row["b_macro_%s" % metric] ) return row def _component_summary_table_columns(): columns = ["mode", "score_kind", "n_rows", "n_hits", "n_samples_reported"] for metric in METRIC_NAMES: columns.extend([ "a_micro_%s" % metric, "b_micro_%s" % metric, "micro_%s_diff" % metric, "a_macro_%s" % metric, "b_macro_%s" % metric, "macro_%s_diff" % metric, ]) return columns def _run_presentation(side_a, side_b, args): component_dir = os.path.join(args.out, "presentation") os.makedirs(component_dir, exist_ok=True) data_dir = args.data_dir or _default_data_evaluation_dir() requested_modes = _requested_modes( args.presentation_modes, PRESENTATION_MODES, "--presentation-modes") requested_score_kinds = _requested_modes( args.presentation_score_kinds, PRESENTATION_SCORE_KINDS, "--presentation-score-kinds") benchmark = _load_presentation_benchmark_for_component( data_dir, args, "presentation") summaries = {} summary_rows = [] presentation_args = _parallelism_args_for_component(args, "presentation") comparison_model_bytes = max( model_artifact_size_bytes(side_a["paths"]["presentation"]) or 0, model_artifact_size_bytes(side_b["paths"]["presentation"]) or 0, ) or None for mode in requested_modes: _stamp("=== presentation mode: %s ===" % mode) scored = benchmark.copy() a_pred = _parallel_presentation_predict( presentation_args, side_a["paths"]["presentation"], benchmark, mode, label="A", model_bytes=comparison_model_bytes, ) b_pred = _parallel_presentation_predict( presentation_args, side_b["paths"]["presentation"], benchmark, mode, label="B", model_bytes=comparison_model_bytes, ) for prefix, pred in (("a", a_pred), ("b", b_pred)): for col in [ "presentation_score", "presentation_percentile", "affinity", "processing_score", ]: scored["%s_%s" % (prefix, col)] = pred[col].values _require_finite_presentation_scores( scored, mode=mode, labels=(side_a["label"], side_b["label"]), score_kinds=requested_score_kinds, ) pred_path = os.path.join( component_dir, "predictions_%s.csv.bz2" % mode) scored.to_csv(pred_path, index=False) _stamp(" wrote %s" % pred_path) summaries[mode] = {} for score_kind in requested_score_kinds: shared_scored = _shared_score_rows(scored, score_kind) _require_binary_comparison_rows( shared_scored, "Presentation comparison mode %s score %s" % ( mode, score_kind), ) per_sample = _presentation_per_sample(shared_scored, score_kind) per_sample.to_csv( os.path.join( component_dir, "per_sample_%s_%s.csv" % (mode, score_kind), ), index=False, ) per_length, per_length_per_sample = _presentation_per_length( shared_scored, score_kind) per_length.to_csv( os.path.join( component_dir, "per_length_%s_%s.csv" % (mode, score_kind), ), index=False, ) if not per_length_per_sample.empty: per_length_per_sample.to_csv( os.path.join( component_dir, "per_length_per_sample_%s_%s.csv" % (mode, score_kind), ), index=False, ) summary = _presentation_mode_summary( shared_scored, per_sample, per_length, mode, score_kind) summaries[mode][score_kind] = summary summary_rows.append(_presentation_summary_row(summary)) with open(os.path.join(component_dir, "summary.json"), "w") as fd: json.dump(summaries, fd, indent=2, sort_keys=True) summary_table = pandas.DataFrame( summary_rows, columns=_component_summary_table_columns()) summary_table.to_csv( os.path.join(component_dir, "summary_table.csv"), index=False) _stamp(" wrote summary.json + summary_table.csv") return { "modes": requested_modes, "score_kinds": requested_score_kinds, "summaries": summaries, } # --------------------------------------------------------------------------- # Release-gate summary tables # --------------------------------------------------------------------------- _METRIC_DISPLAY_NAMES = { "roc_auc": "AUROC", "pr_auc": "AUPRC", "ppv_at_n": "PPV@N", } def _pct_change(a_value, b_value): if b_value is None or numpy.isnan(b_value) or b_value == 0: return numpy.nan return 100.0 * (a_value - b_value) / b_value def _append_release_metric_row(rows, component, group_key, group_value, metric, average, a_value, b_value): rows.append({ "component": component, group_key: group_value, "metric": _METRIC_DISPLAY_NAMES[metric], "average": average, "side_a": a_value, "side_b": b_value, "diff": a_value - b_value, "pct_change": _pct_change(a_value, b_value), }) def _release_summary_rows(headline, components): rows = [] if "affinity" in components and "affinity" in headline: summary = headline["affinity"] for metric in METRIC_NAMES: macro = summary["macro_mean_over_alleles"][metric] _append_release_metric_row( rows, "affinity", "eval", "affinity", metric, "Macro", macro["a"], macro["b"]) for metric in METRIC_NAMES: micro_a = summary["micro_pooled"]["a"][metric] micro_b = summary["micro_pooled"]["b"][metric] _append_release_metric_row( rows, "affinity", "eval", "affinity", metric, "Micro", micro_a, micro_b) for component, score_kind in ( ("processing", "processing_score"), ("presentation", "presentation_score")): if component not in components or component not in headline: continue for mode in headline[component]["modes"]: summary = headline[component]["summaries"].get(mode, {}).get(score_kind) if summary is None: continue for metric in METRIC_NAMES: macro = summary["macro_mean_over_samples"][metric] _append_release_metric_row( rows, component, "flank_mode", mode, metric, "Macro", macro["a"], macro["b"]) for metric in METRIC_NAMES: micro_a = summary["micro_pooled"]["a"][metric] micro_b = summary["micro_pooled"]["b"][metric] _append_release_metric_row( rows, component, "flank_mode", mode, metric, "Micro", micro_a, micro_b) return rows def _format_metric(value, signed=False, pct=False): if value is None or numpy.isnan(value): return "nan" if pct: return "%+.2f%%" % value if signed: return "%+.4f" % value return "%.4f" % value def _label_heading(label): return str(label).replace("_", " ").title() def _write_release_summary_tables(headline, side_a, side_b, out_dir, components): rows = _release_summary_rows(headline, components) if not rows: return csv_path = os.path.join(out_dir, "release_summary.csv") pandas.DataFrame(rows).to_csv(csv_path, index=False) side_a_heading = _label_heading(side_a["label"]) side_b_heading = _label_heading(side_b["label"]) lines = ["# release summary", ""] for component, title, group_key, group_label in ( ("affinity", "Affinity", "eval", "Eval"), ("presentation", "Presentation", "flank_mode", "Flank mode"), ("processing", "Processing", "flank_mode", "Flank mode")): component_rows = [row for row in rows if row["component"] == component] if not component_rows: continue lines.extend([ "## %s" % title, "", "| %s | Metric | Average | %s | %s | Diff | %% change |" % (group_label, side_a_heading, side_b_heading), "|---|---|---:|---:|---:|---:|---:|", ]) for row in component_rows: lines.append( "| %s | %s | %s | %s | %s | %s | %s |" % ( row.get(group_key, ""), row["metric"], row["average"], _format_metric(row["side_a"]), _format_metric(row["side_b"]), _format_metric(row["diff"], signed=True), _format_metric(row["pct_change"], pct=True), ) ) lines.append("") with open(os.path.join(out_dir, "release_summary.md"), "w") as fd: fd.write("\n".join(lines)) _stamp("wrote release_summary.csv + release_summary.md") # --------------------------------------------------------------------------- # Summary markdown # --------------------------------------------------------------------------- def _write_summary_markdown(headline, side_a, side_b, out_dir, components): lines = [] lines.append("# compare-models summary\n") lines.append("- side A: `%s` (%s)" % (side_a["label"], side_a["spec"])) lines.append("- side B: `%s` (%s)" % (side_b["label"], side_b["spec"])) lines.append("") if "training_stats" in components: ts = headline["training_stats"] lines.append("## training_stats") lines.append( "- %s: %d models, %.1f min total finetune wall-time" % ( side_a["label"], ts["side_a_n_models"], ts["side_a_finetune_total_wall_min"], ) ) lines.append( "- %s: %d models, %.1f min total finetune wall-time" % ( side_b["label"], ts["side_b_n_models"], ts["side_b_finetune_total_wall_min"], ) ) lines.append("- Details: `training_stats/per_task.csv`, `training_stats/summary.csv`") lines.append("") if "affinity" in components: s = headline["affinity"] lines.append("## affinity") for metric in METRIC_NAMES: macro = s["macro_mean_over_alleles"][metric] lines.append( "- macro %s: A=%.4f, B=%.4f, diff=%+.4f" % ( metric, macro["a"], macro["b"], macro["a"] - macro["b"], ) ) lines.append( "- alleles reported: %d (A-better roc_auc: %d, B-better: %d)" % ( s["n_alleles_reported"], s["allele_count"]["a_better_roc_auc"], s["allele_count"]["b_better_roc_auc"], ) ) overlap = s.get("training_overlap") if overlap: lines.append( "- training-overlap policy `%s`: %d rows / %d hits overlap; " "%d rows / %d hits scored" % ( overlap["policy"], overlap["union_overlap_rows"], overlap["union_overlap_hits"], overlap["rows_after"], overlap["hits_after"], ) ) lines.append("- Details: `affinity/per_allele.csv`, `affinity/summary.json`") lines.append("") if "processing" in components: s = headline["processing"] lines.append("## processing") lines.append("- Negative cohort: `%s` (unmatched cohorts are diagnostic only)." % s.get("negative_policy", "legacy-unmatched")) for mode in s["modes"]: msum = s["summaries"][mode]["processing_score"] pooled_a = msum["micro_pooled"]["a"]["roc_auc"] pooled_b = msum["micro_pooled"]["b"]["roc_auc"] lines.append( "- %s / processing_score: micro ROC-AUC A=%.4f, " "B=%.4f, diff=%+.4f (%d samples reported)" % ( mode, pooled_a, pooled_b, pooled_a - pooled_b, msum["n_samples_reported"], ) ) lines.append("- Details: `processing/summary_table.csv`, `processing/summary.json`") lines.append("") if "presentation" in components: s = headline["presentation"] lines.append("## presentation") for mode in s["modes"]: for score_kind, msum in s["summaries"][mode].items(): pooled_a = msum["micro_pooled"]["a"]["roc_auc"] pooled_b = msum["micro_pooled"]["b"]["roc_auc"] lines.append( "- %s / %s: micro ROC-AUC A=%.4f, B=%.4f, diff=%+.4f " "(%d samples reported)" % ( mode, score_kind, pooled_a, pooled_b, pooled_a - pooled_b, msum["n_samples_reported"], ) ) lines.append("- Details: `presentation/summary_table.csv`, `presentation/summary.json`") lines.append("") with open(os.path.join(out_dir, "summary.md"), "w") as fd: fd.write("\n".join(lines)) _stamp("wrote summary.md") def _default_data_evaluation_dir() -> Optional[str]: from .. import downloads try: return downloads.get_path("data_evaluation") except RuntimeError: return None # Module-level parser for sphinx autoprogram; behaves like the legacy # ``mhcflurry-*`` command modules. parser = make_parser() mhcflurry-2.3.6/mhcflurry/cli/downloads_command.py000066400000000000000000000620731525677230600224060ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Download MHCflurry released datasets and trained models. Examples Fetch the default downloads: $ mhcflurry-downloads fetch Fetch a specific download: $ mhcflurry-downloads fetch models_class1_pan Get the path to a download: $ mhcflurry-downloads path models_class1_pan Get the URL of a download: $ mhcflurry-downloads url models_class1_pan Summarize available and fetched downloads: $ mhcflurry-downloads info """ import sys import json import logging import os from shlex import quote import errno import tarfile import textwrap from itertools import zip_longest from shutil import copyfileobj from shutil import get_terminal_size from tempfile import NamedTemporaryFile from tqdm import tqdm import posixpath import csv try: from urllib.request import urlretrieve from urllib.parse import urlsplit except ImportError: from urllib import urlretrieve from urlparse import urlsplit from ..downloads import ( get_current_release, get_downloads_metadata, get_bundle_description, get_bundle_versions, get_download_urls, resolve_release, get_release_downloads, get_downloads_dir, get_default_class1_models_dir, get_default_class1_presentation_models_dir, get_default_class1_processing_models_dir, get_path, ENVIRONMENT_VARIABLES) from ..version import __version__ from .help import HelpArgumentParser, color_enabled tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 parser = HelpArgumentParser( description="""Browse, download and locate released weights and supporting data. Start here: mhcflurry downloads releases models_class1_presentation mhcflurry downloads list --kind models mhcflurry downloads info models_class1_presentation mhcflurry downloads fetch models_class1_presentation --release 2.2.0 mhcflurry predict INPUT.csv --model-release 2.2.0 Download releases are catalogue versions, separate from the installed code. Browsing uses the catalogue shipped with this package; no network is required. """) parser.add_argument( "--quiet", action="store_true", default=False, help="Output less") parser.add_argument( "--verbose", "-v", action="store_true", default=False, help="Output more") subparsers = parser.add_subparsers(dest="subparser_name") parser_fetch = subparsers.add_parser('fetch') parser_fetch.add_argument( 'download_name', metavar="DOWNLOAD", nargs="*", help="Items to download") parser_fetch.add_argument( "--keep", action="store_true", default=False, help="Don't delete archives after they are extracted") parser_fetch.add_argument( "--release", default=get_current_release(), help="Release to download. Default: %(default)s") parser_fetch.add_argument( "--already-downloaded-dir", metavar="DIR", help="Don't download files, get them from DIR") parser_info = subparsers.add_parser('info') parser_info.add_argument('download_name', nargs='?', metavar='DOWNLOAD') parser_info.add_argument('--json', action='store_true', help='Print machine-readable JSON') parser_list = subparsers.add_parser('list', help='Browse models and supporting data') parser_list.add_argument('--kind', choices=('all', 'models', 'data'), default='all') parser_list.add_argument('--json', action='store_true', help='Print machine-readable JSON') parser_releases = subparsers.add_parser('releases', help='List valid catalogue releases') parser_releases.add_argument('download_name', nargs='?', metavar='DOWNLOAD') parser_releases.add_argument('--json', action='store_true', help='Print machine-readable JSON') parser_path = subparsers.add_parser('path') parser_path.add_argument( "download_name", nargs="?", default='') parser_url = subparsers.add_parser('url') parser_url.add_argument( "download_name") for subparser in (parser_info, parser_list, parser_path, parser_url): subparser.add_argument('--release', metavar='RELEASE', help='Catalogue release (default: configured release)') def run(argv=sys.argv[1:]): args = parser.parse_args(argv) logging.basicConfig(level=(logging.DEBUG if args.verbose else logging.WARNING if args.quiet else logging.INFO)) command_functions = { "fetch": fetch_subcommand, "info": info_subcommand, "list": list_subcommand, "releases": releases_subcommand, "path": path_subcommand, "url": url_subcommand, None: lambda args: parser.print_help(), } try: command_functions[args.subparser_name](args) except (ValueError, RuntimeError) as error: parser.error(str(error)) def mkdir_p(path): """ Make directories as needed, similar to mkdir -p in a shell. From: http://stackoverflow.com/questions/600268/mkdir-p-functionality-in-python """ try: os.makedirs(path) except OSError as exc: # Python >2.5 if exc.errno == errno.EEXIST and os.path.isdir(path): pass else: raise def yes_no(boolean): return "YES" if boolean else "NO" def suspicious_tar_member(member): """Return whether a tar member should not be extracted.""" name = member.name.strip() if not name or posixpath.isabs(name): return True if ".." in name.split("/"): return True # Keep a normalized guard for unusual path spellings that still resolve # above the extraction directory. normalized = posixpath.normpath(name) if normalized == ".." or normalized.startswith("../"): return True return member.issym() or member.islnk() # For progress bar on download. See https://pypi.python.org/pypi/tqdm class TqdmUpTo(tqdm): """Provides `update_to(n)` which uses `tqdm.update(delta_n)`.""" def update_to(self, b=1, bsize=1, tsize=None): """ b : int, optional Number of blocks transferred so far [default: 1]. bsize : int, optional Size of each block (in tqdm units) [default: 1]. tsize : int, optional Total size (in tqdm units). If [default: None] remains unchanged. """ if tsize is not None: self.total = tsize self.update(b * bsize - self.n) # will also set self.n = b * bsize def fetch_subcommand(args): def qprint(msg): if not args.quiet: print(msg) if not args.release: raise RuntimeError( "No release defined. This can happen when you are specifying " "a custom models directory. Specify --release to indicate " "the release to download.") downloads = get_release_downloads(args.release) invalid_download_names = set( item for item in args.download_name if item not in downloads) if invalid_download_names: raise ValueError("Unknown download(s): %s. Valid downloads are: %s" % ( ', '.join(invalid_download_names), ', '.join(downloads))) items_to_fetch = set() for (name, info) in downloads.items(): default = not args.download_name and info['metadata']['default'] if name in args.download_name and info['downloaded']: print(( "*" * 40 + "\nThe requested download '%s' has already been downloaded. " "To re-download this data, first run: \n\t%s\nin a shell " "and then re-run this command.\n" + "*" * 40) % (name, 'rm -rf ' + quote( get_path(name, release=args.release)))) if not info['downloaded'] and (name in args.download_name or default): items_to_fetch.add(name) mkdir_p(get_downloads_dir(args.release)) qprint("Fetching %d/%d downloads from release %s" % ( len(items_to_fetch), len(downloads), args.release)) format_string = "%-40s %-20s %-20s %-20s " qprint(format_string % ( "DOWNLOAD NAME", "ALREADY DOWNLOADED?", "WILL DOWNLOAD NOW?", "URL")) for (item, info) in downloads.items(): urls = ( [info['metadata']["url"]] if "url" in info['metadata'] else info['metadata']["part_urls"]) url_description = urls[0] if len(urls) > 1: url_description += " + %d more parts" % (len(urls) - 1) qprint(format_string % ( item, yes_no(info['downloaded']), yes_no(item in items_to_fetch), url_description)) # TODO: may want to extract into somewhere temporary and then rename to # avoid making an incomplete extract if the process is killed. for item in items_to_fetch: metadata = downloads[item]['metadata'] urls = ( [metadata["url"]] if "url" in metadata else metadata["part_urls"]) temp = NamedTemporaryFile(delete=False, suffix=".tar.bz2") try: for (url_num, url) in enumerate(urls): delete_downloaded = True if args.already_downloaded_dir: filename = posixpath.basename(urlsplit(url).path) downloaded_path = os.path.join( args.already_downloaded_dir, filename) delete_downloaded = False else: qprint("Downloading [part %d/%d]: %s" % ( url_num + 1, len(urls), url)) (downloaded_path, _) = urlretrieve( url, temp.name if len(urls) == 1 else None, reporthook=TqdmUpTo( unit='B', unit_scale=True, miniters=1, disable=args.quiet).update_to) qprint("Downloaded to: %s" % quote(downloaded_path)) if downloaded_path != temp.name: qprint("Copying to: %s" % temp.name) with open(downloaded_path, "rb") as fd: copyfileobj(fd, temp, length=64*1024*1024) if delete_downloaded: os.remove(downloaded_path) temp.close() tar = tarfile.open(temp.name, 'r:bz2') members = tar.getmembers() names = [member.name for member in members] logging.debug("Extracting: %s" % names) bad_names = [ member.name for member in members if suspicious_tar_member(member) ] if bad_names: raise RuntimeError( "Archive has suspicious names: %s" % bad_names) result_dir = get_path(item, test_exists=False, release=args.release) os.mkdir(result_dir) for member in tqdm(members, desc='Extracting', disable=args.quiet): tar.extractall(path=result_dir, members=[member]) tar.close() # Save URLs that were used for this download. with open(os.path.join(result_dir, "DOWNLOAD_INFO.csv"), "w", newline="") as fd: writer = csv.writer(fd) writer.writerow(["url"]) writer.writerows([url] for url in urls) qprint("Extracted %d files to: %s" % ( len(names), quote(result_dir))) finally: if not args.keep: os.remove(temp.name) def _download_records(release, kind="all"): records = [] for name, info in get_release_downloads(release).items(): description = get_bundle_description(name) if kind != "all" and description["kind"] != kind: continue status = ( "not installed" if not info["downloaded"] else "installed; source unknown" if info["up_to_date"] is None else "installed; source matches" if info["up_to_date"] else "installed; source differs") records.append(dict( name=name, release=release, **description, status=status, downloaded=info["downloaded"], source_matches=info["up_to_date"], path=os.path.abspath(get_path(name, test_exists=False, release=release)), urls=get_download_urls(info["metadata"]), default=info["metadata"].get("default", False))) return records def _find_download(release, name): records = _download_records(release) for record in records: if record["name"] == name: return record raise ValueError( "Download %r is not in release %s. Run 'mhcflurry downloads list " "--release %s' or 'mhcflurry downloads releases %s'." % (name, release, release, name)) def _style(text, code): if not code or not color_enabled(sys.stdout): return text return "\033[%sm%s\033[0m" % (code, text) def _heading(text): print("\n" + _style(text, "1;36")) def _status_color(text): if text in ("—", "NO"): return "2" if text in ("unknown", "differs") or "?" in text or "!" in text: return "33" return "32" def _print_table(headers, rows, colors=None, wrap_columns=()): """Align plain cell widths before adding optional terminal color.""" if not rows: return widths = [max(len(row[i]) for row in [headers, *rows]) for i in range(len(headers))] available = max(60, min(120, get_terminal_size().columns)) for column in wrap_columns: excess = sum(widths) + 2 * (len(widths) - 1) - available if excess > 0: widths[column] = max(len(headers[column]), 16, widths[column] - excess) print(_style(" ".join(value.ljust(width) for value, width in zip(headers, widths)).rstrip(), "1;36")) for row in rows: cells = [textwrap.wrap(value, width, break_long_words=False, break_on_hyphens=False) or [""] for value, width in zip(row, widths)] for line in zip_longest(*cells, fillvalue=""): output = [] for i, (value, width) in enumerate(zip(line, widths)): color = (colors or {}).get(i) code = color(row[i]) if callable(color) else color cell = value if i == len(widths) - 1 else value.ljust(width) output.append(_style(cell, code)) print(" ".join(output).rstrip()) def _model_versions(name, releases): """Describe distinct archive sources and installed catalogue directories.""" versions = get_bundle_versions(name) installed = [] custom = get_current_release() is None custom_status = None for version in versions: for release in version['releases']: if release not in releases: releases[release] = get_release_downloads(release) info = releases[release][name] if not info['downloaded']: continue marker = ("" if info['up_to_date'] is True else "?" if info['up_to_date'] is None else "!") if custom: custom_status = marker if not marker: return (versions[0]['releases'][0], ', '.join(v['releases'][0] for v in versions[1:]) or '—', 'custom: ' + release) else: installed.append(release + marker) if custom and custom_status is not None: installed = ['custom' + custom_status] return (versions[0]['releases'][0], ', '.join(v['releases'][0] for v in versions[1:]) or '—', ', '.join(installed) or '—') def _print_downloads(records): primary = [record for record in records if record['group'] == 'Prediction models'] primary.sort(key=lambda record: record['name'] != 'models_class1_presentation') historical = [record for record in records if record['group'] != 'Prediction models'] if primary: _heading('Prediction models — latest weights and available versions') if primary[0]['name'] == 'models_class1_presentation': print('Recommended: models_class1_presentation (includes affinity and processing).') print() releases = {} rows = [(record['name'] + (' (affinity)' if record['name'] == 'models_class1_pan' else ''), *_model_versions(record['name'], releases)) for record in primary] _print_table(('MODEL', 'LATEST', 'OTHER VERSIONS', 'INSTALLED'), rows, colors={1: '36', 3: _status_color}, wrap_columns=(2, 3)) print("Shared archive aliases are grouped under one version; 'releases NAME' lists all.") if any('?' in row[3] or '!' in row[3] for row in rows): print('Installed: ? unknown source; ! recorded source differs from that catalogue.') for group, kind in (('Historical models', 'models'), ('Supporting data', 'data')): items = [record for record in historical if record['kind'] == kind] if not items: continue _heading(group) rows = [] for record in items: source = ('—' if not record['downloaded'] else 'unknown' if record['source_matches'] is None else 'matches' if record['source_matches'] else 'differs') rows.append((record['name'], yes_no(record['downloaded']), source)) _print_table(('DOWNLOAD', 'LOCAL', 'SOURCE'), rows, colors={1: _status_color, 2: _status_color}) print("\nLocal status checks directories and recorded source URLs, not file integrity.") print("Details: mhcflurry downloads info NAME | Versions: mhcflurry downloads releases NAME") def list_subcommand(args): """Show a readable catalogue or machine-readable bundle records.""" release = resolve_release(args.release) records = _download_records(release, args.kind) if args.json: print(json.dumps(dict(release=release, downloads=records), indent=2)) return print("Download release %s (code %s)" % (release, __version__)) _print_downloads(records) print("\nCatalogue directory: " + os.path.abspath(get_downloads_dir(release))) def releases_subcommand(args): """List catalogue IDs and group identical sources for an optional bundle.""" metadata = get_downloads_metadata() name = args.download_name versions = get_bundle_versions(name) if name else [] records = [] for release, info in metadata['releases'].items(): names = [item['name'] for item in info['downloads']] if name and name not in names: continue records.append(dict( release=release, default=release == metadata['current-release'], configured=release == get_current_release(), compatible=info['compatibility-version'] == metadata['current-compatibility-version'], models=[item for item in names if get_bundle_description(item)['kind'] == 'models'])) result = dict(code_version=__version__, default_release=metadata['current-release'], releases=records, download=name, versions=versions) if args.json: print(json.dumps(result, indent=2)) return print("Download releases (separate from code %s)" % __version__) rows = [] for record in records: types = [label for bundle, label in ( ('models_class1_presentation', 'presentation'), ('models_class1_pan', 'pan-affinity'), ('models_class1_processing', 'processing'), ('models_class1', 'legacy affinity')) if bundle in record['models']] if not types: types = ['legacy affinity'] if record['default']: types.append('default') if record['configured']: types.append('configured') rows.append(( record['release'], 'compatible' if record['compatible'] else 'incompatible', ', '.join(types))) _print_table(('RELEASE', 'FORMAT', 'PREDICTORS / NOTES'), rows, colors={0: '36'}, wrap_columns=(2,)) print("\nFormat compatibility is catalogue metadata, not a test of every archive.") if name: _heading("%s: archive sources (shared URLs grouped)" % name) for version in versions: print(" " + ', '.join(version['releases'])) for url in version['urls']: print(" " + url) else: print("Filter by bundle: mhcflurry downloads releases models_class1_presentation") print("Code 2.1.5, 2.2.0 and 2.2.1 used the 2020 weights in catalogue 2.2.0.") print("Archive storage tags such as pre-2.0 are historical locations, not code requirements.") def info_subcommand(args): """Show resolved configuration or a bundle's purpose, sources and usage.""" release = resolve_release(args.release) if args.download_name: record = _find_download(release, args.download_name) record['versions'] = get_bundle_versions(record['name']) fetch = "mhcflurry downloads fetch %s --release %s" % (record['name'], release) record['fetch_command'] = fetch if record['name'] == 'models_class1_presentation': record['predict_command'] = 'mhcflurry predict INPUT.csv --model-release ' + release if args.json: print(json.dumps(record, indent=2)) return print(_style(record['name'] + " — " + release, '1;36')) print(record['description']) print("Status: " + record['status']) print("Directory: " + record['path']) print("\nFetch: " + fetch) print("Locate: mhcflurry downloads path %s --release %s" % (record['name'], release)) if 'predict_command' in record: print("Predict: " + record['predict_command']) elif record['name'] == 'models_class1_pan': print("Predict: mhcflurry predict INPUT.csv --affinity-only --models " + quote(os.path.join(record['path'], 'models.combined'))) _heading("Versions / archive sources (shared URLs grouped)") for version in record['versions']: print(" " + ', '.join(version['releases'])) for url in version['urls']: print(" " + url) print("\nSource match compares recorded URLs, not file integrity.") return defaults = dict( presentation=get_default_class1_presentation_models_dir(test_exists=False), affinity=get_default_class1_models_dir(test_exists=False), processing=get_default_class1_processing_models_dir(test_exists=False)) config = dict( code_version=__version__, default_release=get_downloads_metadata()['current-release'], configured_release=get_current_release(), catalogue_release=release, downloads_dir=os.path.abspath(get_downloads_dir(release)), default_model_paths={key: dict(path=os.path.abspath(value), exists=os.path.exists(value)) for key, value in defaults.items()}, environment_overrides={key: os.environ.get(key) or None for key in ENVIRONMENT_VARIABLES}, downloads=_download_records(release)) if args.json: print(json.dumps(config, indent=2)) return print("Download catalogue %s (code %s)" % (release, __version__)) _print_downloads(config['downloads']) _heading("Resolved configuration") print(" Code version: " + __version__) print(" Default weights: " + config['default_release']) print(" Active catalogue: " + (get_current_release() or 'custom unversioned directory')) print(" Browsing catalogue: " + release) print(" Downloads directory: " + config['downloads_dir']) if args.verbose: _heading("Default prediction paths (before --models / --model-release)") for kind, item in config['default_model_paths'].items(): print(" %s: %s [%s]" % (kind, item['path'], 'exists' if item['exists'] else 'not installed')) overrides = {key: value for key, value in config['environment_overrides'].items() if value or args.verbose} if overrides: _heading("Environment variables (optional overrides)") for key, value in overrides.items(): print(" %s: %s" % (key, quote(value) if value else 'unset; using defaults')) else: print(" Environment overrides: none") if not args.verbose: print("\nFull paths and overrides: mhcflurry downloads --verbose info") def path_subcommand(args): """Print a bundle directory or the download root for the selected release.""" release = resolve_release(args.release) if args.download_name: _find_download(release, args.download_name) print(get_path(args.download_name, release=release)) else: print(get_downloads_dir(release)) def url_subcommand(args): """Print every archive URL for a bundle in the selected release.""" release = resolve_release(args.release) print("\n".join(_find_download(release, args.download_name)['urls'])) mhcflurry-2.3.6/mhcflurry/cli/eval_command.py000066400000000000000000001032471525677230600213420ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Evaluation command namespace. ``mhcflurry eval`` is the semantic home for model comparison, benchmark score generation, and paper-style figures. Historical top-level commands remain available as compatibility entry points: * ``mhcflurry eval compare-models`` delegates to ``mhcflurry compare-models``. * ``mhcflurry eval plot-comparison`` delegates to ``mhcflurry plot-model-comparison``. * ``mhcflurry eval paper-figures render`` delegates to ``mhcflurry paper-figures``. * ``mhcflurry eval paper-figures score-predictions`` derives reusable AUC/PPV score tables from saved benchmark prediction tables. * ``mhcflurry eval paper-figures external-predictors`` optionally shells out to external-predictor runners such as ``mhctools`` to add columns to a canonical saved benchmark prediction table. * ``mhcflurry eval paper-figures run`` runs compare-models, paper-figures, and plot-model-comparison as one local evaluation/figure pipeline. * ``mhcflurry eval affinity-candidate-figures`` builds a common held-out prediction table and paper-figure suite for shortlisted affinity candidates. * ``mhcflurry eval merge-external-predictions`` consolidates aligned per-sample external-predictor benchmark groups for those figures. Future benchmark-prediction and external-predictor registration commands should be added under this namespace rather than as new top-level commands. """ from __future__ import annotations import argparse import os import re import shlex import subprocess import sys import tempfile from pathlib import Path import pandas from ..common import positive_int_arg from ..common import normalize_sequence_resolved_allele_name EVALUATION_SCRIPTS = { "prepare-processing-cohort": Path("scripts/training/prepare_processing_evaluation.py"), "processing-confirmation-analysis": Path("scripts/training/analyze_processing_confirmation.py"), "processing-fold-ensembles": Path("scripts/training/evaluate_processing_fold_ensembles.py"), "processing-recipe-analysis": Path("scripts/training/analyze_processing_recipe.py"), "presentation-percentiles": Path("scripts/training/compare_presentation_percentiles.py"), "presentation-external-predictors": Path("scripts/training/compare_presentation_external_predictors.py"), "processing-ensemble-subsets": Path("scripts/training/evaluate_processing_subsets.py"), "processing-flank-ablation": Path("scripts/training/processing_flank_ablation.py"), "saved-candidate": Path("scripts/training/evaluate_saved_candidate.py"), "collate-figures": Path("scripts/training/collate_experiment_figures.py"), "paired-sample-metrics": Path("scripts/training/paired_sample_metrics.py"), "processing-ensemble": Path( "scripts/training/summarize_processing_ensemble.py"), "presentation-affinity-ensemble": Path( "scripts/training/summarize_presentation_affinity_ensemble.py"), "release-experiment-figures": Path( "scripts/training/render_release_experiment_paper_figures.py"), } def make_parser(prog="mhcflurry eval"): """Return the lightweight namespace parser used by docs/help tooling.""" parser = argparse.ArgumentParser( prog=prog, description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter, ) sub = parser.add_subparsers(dest="eval_subcommand", required=True) sub.add_parser( "compare-models", help="Compare two model ensembles on data_evaluation.", add_help=False, ) sub.add_parser( "plot-comparison", help="Render plots from a compare-models output directory.", add_help=False, ) sub.add_parser( "plot-model-comparison", help="Compatibility alias for plot-comparison.", add_help=False, ) sub.add_parser( "affinity-candidate-figures", help="Compare shortlisted affinity candidates on one saved cohort.", add_help=False, ) sub.add_parser( "merge-external-predictions", help="Consolidate precomputed external benchmark predictions.", add_help=False, ) sub.add_parser( "processing-affinity-control", help="Evaluate processing on affinity-controlled risk sets.", add_help=False, ) for name, help_text in ( ("prepare-processing-cohort", "Expand and freeze unique 10:1 processing evaluation negatives."), ("processing-confirmation-analysis", "Compare paired ranking checkpoints and export a gated processing candidate recipe."), ("processing-fold-ensembles", "Score specified ensembles within shared held-out folds using cached predictions."), ("processing-recipe-analysis", "Map paired processing recipe effects from saved development metrics."), ("presentation-percentiles", "Compare compact percentile curves using cached scores."), ("presentation-external-predictors", "Compare saved MHCflurry scores with NetMHCpan and MixMHCpred."), ("processing-flank-ablation", "Test real, masked and shuffled flanks with fixed weights."), ("saved-candidate", "Evaluate saved full ensembles without retraining."), ("collate-figures", "Combine annotated experiment figures into a PDF."), ("paired-sample-metrics", "Estimate paired sample uncertainty from saved metric tables."), ("processing-ensemble", "Score a fixed ensemble from saved processing predictions."), ("processing-ensemble-subsets", "Evaluate all fixed-size subsets without held-out selection."), ("presentation-affinity-ensemble", "Evaluate public/new affinity mixtures from saved predictions."), ("release-experiment-figures", "Render figures from archived release experiments.")): sub.add_parser(name, help=help_text, add_help=False) paper = sub.add_parser( "paper-figures", help="Render or run paper-style evaluation figures.", add_help=False, ) paper_sub = paper.add_subparsers(dest="paper_figures_subcommand") paper_sub.add_parser( "render", help="Render paper-style figures from saved inputs.", add_help=False, ) paper_sub.add_parser( "run", help="Compare models, render paper figures, and write plot PDFs.", add_help=False, ) paper_sub.add_parser( "score-predictions", help="Derive reusable score tables from saved predictions.", add_help=False, ) paper_sub.add_parser( "external-predictors", help="Add optional external-predictor columns.", add_help=False, ) return parser parser = make_parser() def run_argv(argv, prog="mhcflurry eval"): """Dispatch ``mhcflurry eval`` subcommands.""" argv = list(argv) if not argv or argv[0] in ("-h", "--help"): print(format_help(prog)) return 0 subcommand = argv[0] rest = argv[1:] if subcommand == "compare-models": from . import compare_models return _run_existing_command( compare_models, rest, "%s compare-models" % prog) if subcommand in ("plot-comparison", "plot-model-comparison"): from . import plot_model_comparison return _run_existing_command( plot_model_comparison, rest, "%s %s" % (prog, subcommand)) if subcommand == "affinity-candidate-figures": from . import affinity_candidate_figures return affinity_candidate_figures.run_argv( rest, prog="%s affinity-candidate-figures" % prog) if subcommand == "merge-external-predictions": from . import merge_external_predictions return merge_external_predictions.run_argv( rest, prog="%s merge-external-predictions" % prog) if subcommand == "processing-affinity-control": from . import processing_affinity_control return processing_affinity_control.run_argv( rest, prog="%s processing-affinity-control" % prog) if subcommand in EVALUATION_SCRIPTS: return _run_evaluation_script(subcommand, rest) if subcommand == "paper-figures": return _run_paper_figures(rest, "%s paper-figures" % prog) make_parser(prog).parse_args(argv) return 2 def format_help(prog="mhcflurry eval"): """Return a compact help screen for the eval namespace.""" lines = [ "usage: %s [args]" % prog, "", "Evaluation and paper-figure workflows.", "", "Subcommands:", " compare-models Compare two model ensembles.", " saved-candidate Finish saved candidate evaluation without training.", " plot-comparison Render diagnostic plots from compare output.", " affinity-candidate-figures", " Plot finalists and public on one saved cohort.", " merge-external-predictions", " Consolidate precomputed external predictions.", " processing-flank-ablation Test fixed weights with perturbed external flanks.", " processing-affinity-control", " Score affinity-controlled processing risk sets.", " prepare-processing-cohort", " Expand and freeze a shared matched evaluation set.", " processing-ensemble Score an ensemble from saved predictions.", " presentation-percentiles Compare compact calibration curves and ranking metrics.", " presentation-external-predictors", " Compare saved scores with NetMHCpan and MixMHCpred.", " processing-ensemble-subsets Evaluate every fixed-size ensemble subset.", " paired-sample-metrics Bootstrap matched per-sample metric differences.", " processing-recipe-analysis Map paired processing hyperparameter effects.", " processing-fold-ensembles Compare cached ensembles within shared held-out folds.", " collate-figures Combine annotated experiment figures into a PDF.", " presentation-affinity-ensemble", " Evaluate saved public/new affinity mixtures.", " release-experiment-figures", " Render archived release experiment figures.", " paper-figures render Render paper figures from saved inputs.", " paper-figures score-predictions", " Derive score tables from saved predictions.", " paper-figures external-predictors", " Add optional external predictor columns.", " paper-figures run Compare, render paper figures, and write PDFs.", "", "Compatibility:", " mhcflurry compare-models, mhcflurry plot-model-comparison, and", " mhcflurry paper-figures remain supported.", "", "Options:", " -h, --help show this help message and exit", ] return "\n".join(lines) def _run_existing_command(module, argv, prog): command_parser = module.make_parser() command_parser.prog = prog return module.run(command_parser.parse_args(argv)) def _run_evaluation_script(subcommand, argv): relative = EVALUATION_SCRIPTS[subcommand] repo_root = Path(__file__).resolve().parents[2] for candidate in (repo_root / relative, Path.cwd() / relative): if candidate.exists(): env = os.environ.copy() env["MHCFLURRY_CLI_PROG"] = "mhcflurry eval %s" % subcommand return subprocess.call( [sys.executable, str(candidate), *argv], env=env) raise SystemExit( "Could not find %s. This command must be run from a source checkout " "or editable install." % relative) def _run_paper_figures(argv, prog): if not argv or argv[0] in ("-h", "--help"): print(_format_paper_figures_help(prog)) return 0 subcommand = argv[0] if subcommand == "render": from . import paper_figures return _run_existing_command( paper_figures, argv[1:], "%s render" % prog) if subcommand == "score-predictions": return _run_score_predictions( _make_score_predictions_parser( "%s score-predictions" % prog).parse_args(argv[1:])) if subcommand == "external-predictors": return _run_external_predictors( _make_external_predictors_parser( "%s external-predictors" % prog).parse_args(argv[1:])) if subcommand == "run": return _run_paper_figures_pipeline( _make_paper_figures_run_parser("%s run" % prog).parse_args( argv[1:])) if subcommand.startswith("-"): # Compatibility shortcut: ``mhcflurry eval paper-figures --out ...`` # behaves like the explicit ``render`` form. from . import paper_figures return _run_existing_command(paper_figures, argv, prog) _make_paper_figures_parser(prog).parse_args(argv) return 2 def _make_paper_figures_parser(prog): paper_parser = argparse.ArgumentParser(prog=prog) sub = paper_parser.add_subparsers(dest="paper_figures_subcommand", required=True) sub.add_parser("render", add_help=False) sub.add_parser("score-predictions", add_help=False) sub.add_parser("external-predictors", add_help=False) sub.add_parser("run", add_help=False) return paper_parser def _format_paper_figures_help(prog): return "\n".join([ "usage: %s [args]" % prog, "", "Paper-style evaluation figure workflows.", "", "Subcommands:", " render Render figures from saved comparison/scores/prediction inputs.", " score-predictions", " Derive reusable score tables from saved predictions.", " external-predictors", " Add external predictor columns through an optional runner.", " run Run compare-models, render paper figures, and write PDFs.", "", "Use '%s render --help', '%s score-predictions --help', " "'%s external-predictors --help', or '%s run --help' for arguments." % ( prog, prog, prog, prog), ]) def _make_score_predictions_parser(prog): parser = argparse.ArgumentParser( prog=prog, description=( "Derive reusable notebook-style AUC/PPV score tables from a saved " "benchmark prediction table. The output can be passed back to " "paper-figures through --scores-dir." ), ) parser.add_argument( "--kind", required=True, choices=("multiallelic", "monoallelic"), help="Benchmark kind. Sets the default grouping column.", ) parser.add_argument( "--input", required=True, help="Saved benchmark prediction table (CSV or CSV.BZ2).", ) parser.add_argument( "--out", required=True, help=( "Output CSV path, typically accuracy_scores.multiallelic.csv or " "accuracy_scores.monoallelic.csv." ), ) parser.add_argument( "--index-column", help=( "Optional grouping column override. Defaults to sample_id for " "multiallelic and auto-detect for monoallelic." ), ) parser.add_argument( "--external-baselines", default=None, help=( "Comma-separated external predictor comparators used for percent " "change columns. Default matches paper-figures render." ), ) parser.add_argument( "--predictor-info", help=( "Optional predictor_info.csv with predictor and higher_is_better " "columns for custom score columns." ), ) parser.add_argument( "--predictor-columns", help=( "Optional comma-separated predictor score columns. Without this " "option, canonical score names and predictors declared in " "predictor_info.csv are selected. Custom names still require a " "predictor_info.csv higher_is_better value." ), ) return parser def _run_score_predictions(args): from . import paper_figures if args.external_baselines: external_baselines = paper_figures._parse_external_baselines( args.external_baselines) else: external_baselines = paper_figures.EXTERNAL_BASELINES index_column = args.index_column if index_column is None and args.kind == "multiallelic": index_column = "sample_id" predictor_info = None if args.predictor_info: import pandas predictor_info = pandas.read_csv(args.predictor_info) if "predictor" in predictor_info.columns: predictor_info = predictor_info.set_index("predictor", drop=False) scores = paper_figures.score_saved_prediction_table( args.input, index_column=index_column, kind=args.kind, predictor_info=predictor_info, predictor_columns=( paper_figures._parse_predictor_list(args.predictor_columns) if args.predictor_columns else None ), external_baselines=external_baselines, ) out = os.path.abspath(args.out) os.makedirs(os.path.dirname(out), exist_ok=True) scores.to_csv(out, index=False) print("Wrote: %s" % out) return 0 def _make_external_predictors_parser(prog): parser = argparse.ArgumentParser( prog=prog, description=( "Add external predictor columns to a canonical benchmark " "prediction table by shelling out to optional local predictor " "runners. The initial runner is mhctools, which keeps NetMHCpan/" "MixMHCpred execution outside MHCflurry's package dependencies " "while still providing a maintained one-command adapter for " "release figure inputs." ), ) parser.add_argument( "--input", required=True, help="Canonical benchmark prediction table (CSV or CSV.BZ2).", ) parser.add_argument( "--out", required=True, help="Output benchmark prediction table with added predictor columns.", ) parser.add_argument( "--predictor", action="append", required=True, metavar="RUNNER_PREDICTOR:OUTPUT_COLUMN:FIELD", help=( "External predictor spec. FIELD is one of score, affinity, or " "percentile_rank. Example: " "netmhcpan42-ba:netmhcpan4.2.ba:affinity. May be repeated." ), ) parser.add_argument( "--runner", choices=("mhctools",), default="mhctools", help=( "External predictor runner. Only %(default)s is currently " "implemented." ), ) parser.add_argument( "--mhctools-command", default="mhctools", help=( "mhctools executable or command prefix. Defaults to %(default)s. " "This command is executed as a subprocess and is not imported." ), ) parser.add_argument( "--peptide-column", default="peptide", help="Input peptide column. Default: %(default)s.", ) parser.add_argument( "--alleles-column", help=( "Input allele/genotype column. Defaults to hla if present, else " "allele." ), ) parser.add_argument( "--keep-raw-dir", help="Optional directory for raw per-genotype mhctools CSV outputs.", ) return parser def _parse_external_predictor_spec(spec): parts = spec.split(":") if len(parts) != 3: raise ValueError( "--predictor must be RUNNER_PREDICTOR:OUTPUT_COLUMN:FIELD, got %r" % spec) predictor_name, output_column, field = [part.strip() for part in parts] if not predictor_name or not output_column: raise ValueError("Empty predictor name or output column in %r" % spec) if field not in ("score", "affinity", "percentile_rank"): raise ValueError( "FIELD must be score, affinity, or percentile_rank in %r" % spec) return predictor_name, output_column, field def _split_benchmark_alleles(value): alleles = [ item for item in re.split(r"[,\s]+", str(value).strip()) if item ] if not alleles: raise ValueError( "Benchmark genotype %r contains no class-I alleles." % value ) normalized = [] for allele in alleles: try: canonical = normalize_sequence_resolved_allele_name(allele) except ValueError as error: # Never pass an unparsed user token through to an external # predictor. It may interpret the spelling differently or fail # after a long grouped run; surface the offending genotype now. raise ValueError( "Invalid, ambiguous, or unsupported class-I allele in " "benchmark genotype %r: %r (%s)" % (value, allele, error) ) from error normalized.append(canonical) return normalized def _best_external_predictor_rows(raw_df, value_field): required = {"peptide", "allele", value_field} missing = required.difference(raw_df.columns) if missing: raise ValueError( "mhctools output missing required columns for %s: %s" % ( value_field, ", ".join(sorted(missing)))) df = raw_df[["peptide", "allele", value_field]].copy() df[value_field] = pandas.to_numeric(df[value_field], errors="coerce") df = df.dropna(subset=[value_field]) ascending = value_field in ("affinity", "percentile_rank") df = df.sort_values( ["peptide", value_field], ascending=[True, ascending], kind="mergesort") return df.drop_duplicates("peptide", keep="first") def _run_mhctools_for_group( mhctools_command, predictor_name, alleles, peptides, out_csv): with tempfile.NamedTemporaryFile("w", suffix=".peptides", delete=False) as fd: peptide_file = fd.name for peptide in peptides: fd.write("%s\n" % peptide) try: command = shlex.split(mhctools_command) + [ "--mhc-predictor", predictor_name, "--mhc-alleles", ",".join(alleles), "--input-peptides-file", peptide_file, "--output-csv", out_csv, ] subprocess.run(command, check=True) finally: try: os.unlink(peptide_file) except FileNotFoundError: pass def _run_external_predictors(args): if args.runner != "mhctools": raise ValueError("Unsupported external predictor runner: %s" % args.runner) predictor_specs = [ _parse_external_predictor_spec(spec) for spec in args.predictor ] benchmark = pandas.read_csv(args.input) allele_column = args.alleles_column if allele_column is None: allele_column = "hla" if "hla" in benchmark.columns else "allele" for column in [args.peptide_column, allele_column]: if column not in benchmark.columns: raise ValueError("Input table lacks required column: %s" % column) output_columns = [spec[1] for spec in predictor_specs] generated_columns = output_columns + [ "%s_best_allele" % column for column in output_columns ] duplicates = sorted({ column for column in generated_columns if generated_columns.count(column) > 1 }) if duplicates: raise ValueError("Colliding external predictor output column(s): %s" % ( ", ".join(duplicates))) collisions = sorted(set(benchmark.columns).intersection(generated_columns)) if collisions: raise ValueError( "External predictor output column(s) would overwrite existing " "benchmark data: %s" % ", ".join(collisions) ) raw_dir = args.keep_raw_dir if raw_dir: os.makedirs(raw_dir, exist_ok=True) output = benchmark.copy() grouped = [] for allele_value, group in output.groupby( allele_column, sort=False, dropna=False): # Validate every group up front, including missing/blank values that # pandas groupby would otherwise omit. Reuse the canonical values so # no raw benchmark token can reach the external predictor. grouped.append((group, _split_benchmark_alleles(allele_value))) with tempfile.TemporaryDirectory() as tmp_dir: for predictor_num, ( predictor_name, output_column, value_field, ) in enumerate(predictor_specs): best_values = pandas.Series(index=output.index, dtype=float) best_alleles = pandas.Series(index=output.index, dtype=object) for group_num, (group, alleles) in enumerate(grouped): peptides = sorted(group[args.peptide_column].dropna().unique()) if not peptides: continue raw_csv = os.path.join( raw_dir or tmp_dir, "predictor.%04d.group.%04d.csv" % ( predictor_num, group_num)) print( "Running %s external predictor %s for %d peptides and %d alleles" % (args.runner, predictor_name, len(peptides), len(alleles))) _run_mhctools_for_group( args.mhctools_command, predictor_name, alleles, peptides, raw_csv) raw = pandas.read_csv(raw_csv) best = _best_external_predictor_rows(raw, value_field).set_index( "peptide") peptide_series = group[args.peptide_column] best_values.loc[group.index] = peptide_series.map( best[value_field]) best_alleles.loc[group.index] = peptide_series.map( best["allele"]) output[output_column] = best_values output["%s_best_allele" % output_column] = best_alleles out = os.path.abspath(args.out) os.makedirs(os.path.dirname(out), exist_ok=True) output.to_csv(out, index=False) print("Wrote: %s" % out) return 0 def _make_paper_figures_run_parser(prog): parser = argparse.ArgumentParser( prog=prog, description=( "Run the local evaluation-to-figures workflow for a trained model. " "This composes compare-models, paper-figures, and " "plot-model-comparison; remote orchestration remains in the release " "wrapper." ), ) parser.add_argument( "--a", required=True, help="Candidate model run directory, 'public', or 'public:'.", ) parser.add_argument( "--b", default="public", help="Baseline model run directory or public release. Default: %(default)s.", ) parser.add_argument("--a-label", help="Display label for side A.") parser.add_argument("--b-label", help="Display label for side B.") parser.add_argument( "--out", required=True, help="Evaluation output directory. compare-models writes here.", ) parser.add_argument( "--data-dir", help="data_evaluation directory. Defaults to installed data_evaluation.", ) parser.add_argument( "--release-holdout-dir", help="Frozen release-evaluation sample manifests for compare-models.", ) parser.add_argument( "--include", default="auto", help="compare-models component subset. Default: %(default)s.", ) parser.add_argument( "--limit-files", type=positive_int_arg, help="Smoke-test: only read first N benchmark files.", ) parser.add_argument( "--scores-dir", help="Saved figure-input directory passed to paper-figures.", ) parser.add_argument( "--multiallelic-predictions", help="Saved multiallelic prediction table passed to paper-figures.", ) parser.add_argument( "--monoallelic-predictions", help="Saved monoallelic prediction table passed to paper-figures.", ) parser.add_argument( "--paper-figures-out", help=( "Dedicated paper-figure output directory. Default: " "/plots/paper_figures. Cannot be /plots or a " "diagnostic component directory." ), ) parser.add_argument( "--formats", default="svg,pdf,png", help="Paper-figure formats. Default: %(default)s.", ) parser.add_argument( "--summary-pdf", help=( "Combined diagnostic PDF. Default: " "/plots/model_comparison_figures.pdf. Must not be inside " "the paper-figure or diagnostic component directories." ), ) parser.add_argument( "--candidate-predictor", help="Candidate predictor name passed to paper-figures.", ) parser.add_argument( "--external-baselines", help="External baseline predictor list passed to paper-figures.", ) parser.add_argument( "--preferred-predictors", help="Preferred predictor list passed to paper-figures.", ) parser.add_argument( "--presentation-panel-predictors", help="Presentation panel candidate predictor list passed to paper-figures.", ) parser.add_argument( "--presentation-panel-baselines", help="Presentation panel baseline predictor list passed to paper-figures.", ) parser.add_argument( "--skip-comparison-plots", action="store_true", default=False, help="Skip plot-model-comparison after paper figures are rendered.", ) return parser def _run_paper_figures_pipeline(args): from . import compare_models from . import paper_figures from . import plot_model_comparison paper_out = args.paper_figures_out or os.path.join( args.out, "plots", "paper_figures") summary_pdf = args.summary_pdf or os.path.join( args.out, "plots", "model_comparison_figures.pdf") _validate_pipeline_paper_inputs(args) if not args.skip_comparison_plots: plot_model_comparison._validate_plot_output_paths( os.path.join(args.out, "plots"), paper_out, summary_pdf) os.makedirs(args.out, exist_ok=True) compare_argv = [ "--a", args.a, "--b", args.b, "--out", args.out, "--include", args.include, ] for source, flag in [ (args.a_label, "--a-label"), (args.b_label, "--b-label"), (args.data_dir, "--data-dir"), (args.release_holdout_dir, "--release-holdout-dir"), (args.limit_files, "--limit-files")]: if source is not None: compare_argv.extend([flag, str(source)]) compare_status = compare_models.run( compare_models.make_parser().parse_args(compare_argv)) if compare_status: return compare_status paper_argv = [ "--comparison-dir", args.out, "--out", paper_out, "--formats", args.formats, ] for source, flag in [ (args.scores_dir, "--scores-dir"), (args.multiallelic_predictions, "--multiallelic-predictions"), (args.monoallelic_predictions, "--monoallelic-predictions"), (args.candidate_predictor, "--candidate-predictor"), (args.external_baselines, "--external-baselines"), (args.preferred_predictors, "--preferred-predictors"), (args.presentation_panel_predictors, "--presentation-panel-predictors"), (args.presentation_panel_baselines, "--presentation-panel-baselines")]: if source: paper_argv.extend([flag, source]) paper_status = paper_figures.run( paper_figures.make_parser().parse_args(paper_argv)) if paper_status: return paper_status if args.skip_comparison_plots: return 0 plot_argv = [ "--input", args.out, "--summary-pdf", summary_pdf, "--paper-figures-out", paper_out, "--include-paper-figures-in-summary-pdf", ] return plot_model_comparison.run( plot_model_comparison.make_parser().parse_args(plot_argv)) def _validate_pipeline_paper_inputs(args): """Reject paper inputs that compare-models would clear before rendering.""" out = os.path.realpath(args.out) cleanup_dirs = [ os.path.join(out, name) for name in ( "training_stats", "affinity", "processing", "presentation", "plots", "worker_logs", ) ] inputs = { "--scores-dir": args.scores_dir, "--multiallelic-predictions": args.multiallelic_predictions, "--monoallelic-predictions": args.monoallelic_predictions, } conflicts = [] for option, value in inputs.items(): if not value: continue path = os.path.realpath(value) for directory in cleanup_dirs: try: within = os.path.commonpath([path, directory]) == directory except ValueError: within = False if within: conflicts.append("%s=%s" % (option, value)) break if conflicts: raise SystemExit( "Paper-figure input path(s) would be deleted when compare-models " "clears stale outputs under %s: %s. Move these inputs outside the " "comparison output directory." % (args.out, ", ".join(conflicts)) ) if __name__ == "__main__": sys.exit(run_argv(sys.argv[1:]) or 0) mhcflurry-2.3.6/mhcflurry/cli/experiment_snapshot.py000066400000000000000000000046041525677230600230110ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """CLI for timestamped, plot-reconstructable experiment snapshots.""" import argparse from mhcflurry.experiment_archive import ( DEFAULT_MAX_COPY_BYTES, snapshot_experiment, ) def make_parser(prog="mhcflurry train snapshot-experiment"): """Build the experiment-snapshot argument parser.""" parser = argparse.ArgumentParser(prog=prog, description=__doc__) parser.add_argument("--source-dir", required=True) parser.add_argument("--experiments-dir", default="experiments") parser.add_argument("--name", required=True) parser.add_argument("--source-commit") parser.add_argument("--collector-commit") parser.add_argument("--source-archive") parser.add_argument("--command-file", action="append", default=[]) parser.add_argument("--input-file", action="append", default=[]) parser.add_argument( "--max-copy-mb", type=float, default=DEFAULT_MAX_COPY_BYTES / (1024 * 1024), help=( "Maximum size of each copied artifact. Larger artifacts remain " "in the SHA256 inventory. Default: %(default)s" ), ) return parser def run_argv(argv=None, prog="mhcflurry train snapshot-experiment"): """Parse arguments, write a snapshot, and print its path.""" args = make_parser(prog).parse_args(argv) if args.max_copy_mb < 0: raise ValueError("--max-copy-mb must be nonnegative") destination = snapshot_experiment( args.source_dir, args.experiments_dir, args.name, source_commit=args.source_commit, collector_commit=args.collector_commit, source_archive=args.source_archive, command_files=args.command_file, input_files=args.input_file, max_copy_bytes=int(args.max_copy_mb * 1024 * 1024), ) print(destination) return 0 if __name__ == "__main__": raise SystemExit(run_argv()) mhcflurry-2.3.6/mhcflurry/cli/figure_style.py000066400000000000000000000102241525677230600214060ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Shared styling helpers for model-comparison and paper figures.""" from __future__ import annotations import ast SIDE_A_COLOR = (0.596, 0.557, 0.835) SIDE_B_COLOR = (0.545, 0.545, 0.545) POSITIVE_DELTA_COLOR = (0.353, 0.612, 0.518) NEGATIVE_DELTA_COLOR = (0.886, 0.290, 0.200) GRID_COLOR = "0.88" DIAGONAL_COLOR = "0.55" PREDICTOR_LABELS = { "netmhcpan4.ba": "NetMHCpan 4.0 BA", "netmhcpan4.el": "NetMHCpan 4.0 EL", "netmhcpan4.2.ba": "NetMHCpan 4.2 BA", "netmhcpan4.2.el": "NetMHCpan 4.2 EL", "mixmhcpred": "MixMHCpred", "mhcflurry_production": "MHCflurry BA", } PREDICTOR_COLORS = { "netmhcpan4.ba": (0.886, 0.290, 0.200), "netmhcpan4.el": (1.000, 0.710, 0.722), "netmhcpan4.2.ba": (0.650, 0.120, 0.130), "netmhcpan4.2.el": (0.980, 0.520, 0.540), "mixmhcpred": (0.204, 0.541, 0.741), "mhcflurry_production": SIDE_A_COLOR, } FALLBACK_PALETTE = ( (0.345, 0.467, 0.741), (0.459, 0.439, 0.702), (0.639, 0.400, 0.667), (0.871, 0.443, 0.498), (0.922, 0.612, 0.357), (0.580, 0.690, 0.392), POSITIVE_DELTA_COLOR, (0.306, 0.573, 0.702), SIDE_B_COLOR, (0.737, 0.506, 0.741), ) def apply_paper_style(): """Apply the shared publication-style matplotlib defaults.""" import matplotlib.pyplot as plt try: import seaborn seaborn.set_context("paper") seaborn.set_style("white") except ImportError: pass try: plt.style.use("seaborn-v0_8-white") except OSError: try: plt.style.use("seaborn-white") except OSError: pass plt.rcParams.update({ "font.family": "sans-serif", "font.size": 9, "axes.labelsize": 9, "axes.titlesize": 9, "legend.fontsize": 8, "xtick.labelsize": 8, "ytick.labelsize": 8, "figure.dpi": 150, "savefig.dpi": 300, "axes.spines.top": False, "axes.spines.right": False, "axes.edgecolor": "0.15", "axes.linewidth": 0.8, "grid.color": GRID_COLOR, "grid.linewidth": 0.6, "legend.frameon": False, "text.usetex": False, }) def despine(ax): """Hide nonessential axes decoration for paper-style panels.""" ax.spines["top"].set_visible(False) ax.spines["right"].set_visible(False) ax.grid(False) def short_label(predictor_info, predictor): """Return a concise display label for a predictor identifier.""" if predictor in predictor_info.index: row = predictor_info.loc[predictor] for column in ("short", "description"): value = row.get(column) if isinstance(value, str) and value and value != "-": return value if predictor in PREDICTOR_LABELS: return PREDICTOR_LABELS[predictor] return str(predictor).replace("_", " ") def predictor_color(predictor_info, predictor): """Return a stable paper palette color for a predictor identifier.""" if predictor in predictor_info.index: value = predictor_info.loc[predictor].get("color") if isinstance(value, str) and value and value.lower() != "nan": try: parsed = ast.literal_eval(value) if isinstance(parsed, (list, tuple)) and len(parsed) in (3, 4): return tuple(float(item) for item in parsed) except (SyntaxError, ValueError, TypeError): pass if predictor in PREDICTOR_COLORS: return PREDICTOR_COLORS[predictor] index = sum( (position + 1) * ord(char) for position, char in enumerate(str(predictor)) ) % len(FALLBACK_PALETTE) return FALLBACK_PALETTE[index] mhcflurry-2.3.6/mhcflurry/cli/generate_training_hyperparameters.py000066400000000000000000000573651525677230600257060ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Generate release-training hyperparameter grids.""" import argparse import sys from copy import deepcopy import yaml from ..common import positive_int_arg AFFINITY_DEFAULT_MINIBATCH_SIZE = 128 PROCESSING_DEFAULT_MINIBATCH_SIZE = 512 DEFAULT_OPTIMIZER_IMPLEMENTATION = "keras" OPTIMIZER_IMPLEMENTATION_CHOICES = ("keras", "pytorch") LSUV_TARGET_CHOICES = ("post_activation", "pre_activation") AFFINITY_INIT_CHOICES = ( "glorot_uniform", "glorot_normal", "he_uniform", "he_normal", "orthogonal", ) PROCESSING_INIT_CHOICES = ("glorot_uniform", "kaiming_uniform_fan_in") PROCESSING_BATCH_SWEEP_SIZES = (128, 256, 512, 1024) # Compatibility name used by the historical affinity generator wrapper. DEFAULT_MINIBATCH_SIZE = AFFINITY_DEFAULT_MINIBATCH_SIZE PROCESSING_VARIANT_CHOICES = ( "with_flanks", "no_n_flank", "no_c_flank", "no_flank", "short_flanks", ) AFFINITY_BASE_HYPERPARAMETERS = { "activation": "tanh", "allele_dense_layer_sizes": [], "batch_normalization": False, "dense_layer_l1_regularization": 0.0, "dense_layer_l2_regularization": 0.0, "dropout_probability": 0.5, "early_stopping": True, "init": "glorot_uniform", "layer_sizes": [1024, 512], "learning_rate": 0.001, "locally_connected_layers": [], "topology": "feedfoward", "loss": "custom:mse_with_inequalities", # Preserve the published 2.1.x/2.2.x scientific recipe. Early stopping # normally terminates well before this safety ceiling. "max_epochs": 5000, "minibatch_size": AFFINITY_DEFAULT_MINIBATCH_SIZE, "optimizer": "rmsprop", "optimizer_implementation": DEFAULT_OPTIMIZER_IMPLEMENTATION, "output_activation": "sigmoid", "patience": 20, "min_delta": 0.0, "validation_interval": 1, "peptide_encoding": { "vector_encoding_name": "BLOSUM62", "alignment_method": "left_pad_centered_right_pad", "max_length": 15, }, "peptide_amino_acid_encoding_torch": True, "peptide_allele_merge_activation": "", "peptide_allele_merge_method": "concatenate", "peptide_amino_acid_encoding": "BLOSUM62", "peptide_dense_layer_sizes": [], "random_negative_affinity_max": 50000.0, "random_negative_affinity_min": 30000.0, "random_negative_constant": 1, "random_negative_distribution_smoothing": 0.0, "random_negative_match_distribution": True, "random_negative_rate": 1.0, "random_negative_method": "by_allele_equalize_nonbinders", "random_negative_binder_threshold": 500.0, # Keep random-negative pooling memory bounded. Larger values can # amortize generation cost, but prior full runs ballooned memory # far beyond the nominal encoded peptide tensor size. "random_negative_pool_epochs": 1, "train_data": { "pretrain": True, "pretrain_peptides_per_epoch": 64, "pretrain_steps_per_epoch": 256, "pretrain_patience": 2, "pretrain_min_delta": 0.0001, "pretrain_max_val_loss": 0.10, "pretrain_max_epochs": 50, "pretrain_min_epochs": 5, }, "validation_split": 0.1, "data_dependent_initialization_method": "lsuv", "data_dependent_initialization_target": "post_activation", } PROCESSING_BASE_HYPERPARAMETERS = { "convolutional_filters": 64, "convolutional_kernel_size": 8, "convolutional_kernel_l1_l2": [0.00, 0.0], "flanking_averages": True, "n_flank_length": 15, "c_flank_length": 15, "post_convolutional_dense_layer_sizes": [], "minibatch_size": PROCESSING_DEFAULT_MINIBATCH_SIZE, "dropout_rate": 0.5, "convolutional_activation": "relu", "patience": 20, "learning_rate": 0.001, "optimizer_implementation": DEFAULT_OPTIMIZER_IMPLEMENTATION, "init": "glorot_uniform", } def unique_hyperparameters(items): """Return ``items`` with duplicate dicts removed, preserving order.""" result = [] for item in items: if item not in result: result.append(item) return result def build_affinity_grid( minibatch_size=AFFINITY_DEFAULT_MINIBATCH_SIZE, optimizer_implementation=DEFAULT_OPTIMIZER_IMPLEMENTATION, data_dependent_initialization_target="post_activation", init="glorot_uniform", ): """Return the 35-architecture Class I pan-allele affinity grid.""" if init not in AFFINITY_INIT_CHOICES: raise ValueError( "Unknown affinity initializer %r; expected one of: %s" % ( init, ", ".join(AFFINITY_INIT_CHOICES), ) ) grid = [] base = deepcopy(AFFINITY_BASE_HYPERPARAMETERS) base["minibatch_size"] = minibatch_size base["optimizer_implementation"] = optimizer_implementation base["init"] = init base["data_dependent_initialization_target"] = ( data_dependent_initialization_target ) for layer_sizes in [[512, 256], [512, 512], [1024, 512], [1024, 1024]]: l1_base = 0.0000001 for l1 in [l1_base, l1_base / 10, l1_base / 100, l1_base / 1000, 0.0]: new = deepcopy(base) new["topology"] = "feedforward" new["layer_sizes"] = layer_sizes new["dense_layer_l1_regularization"] = l1 if not grid or new not in grid: grid.append(new) for layer_sizes in [[256, 512], [256, 256, 512], [256, 512, 512]]: l1_base = 0.0000001 for l1 in [l1_base, l1_base / 10, l1_base / 100, l1_base / 1000, 0.0]: new = deepcopy(base) new["topology"] = "with-skip-connections" new["layer_sizes"] = layer_sizes new["dense_layer_l1_regularization"] = l1 if not grid or new not in grid: grid.append(new) return grid def processing_base_grid_iter( minibatch_size=PROCESSING_DEFAULT_MINIBATCH_SIZE, optimizer_implementation=DEFAULT_OPTIMIZER_IMPLEMENTATION, init="glorot_uniform", ): """Yield the base processing architecture grid before flank variants.""" base = deepcopy(PROCESSING_BASE_HYPERPARAMETERS) base["minibatch_size"] = minibatch_size base["optimizer_implementation"] = optimizer_implementation base["init"] = init for learning_rate in [0.001]: for convolutional_activation in ["tanh", "relu"]: for convolutional_filters in [256, 512]: for flanking_averages in [True]: for convolutional_kernel_size in [11, 13, 15, 17]: for l1 in [0.0, 1e-6]: for dense_sizes in [[8], [16]]: for dropout_rate in [0.3, 0.5]: new = deepcopy(base) new["learning_rate"] = learning_rate new["convolutional_activation"] = ( convolutional_activation) new["convolutional_filters"] = ( convolutional_filters) new["flanking_averages"] = flanking_averages new["convolutional_kernel_size"] = ( convolutional_kernel_size) new["convolutional_kernel_l1_l2"] = [ l1, 0.0] new[ "post_convolutional_dense_layer_sizes" ] = dense_sizes new["dropout_rate"] = dropout_rate yield new def build_processing_base_grid( minibatch_size=PROCESSING_DEFAULT_MINIBATCH_SIZE, optimizer_implementation=DEFAULT_OPTIMIZER_IMPLEMENTATION, init="glorot_uniform", ): """Return the processing architecture grid before flank variants.""" return unique_hyperparameters( processing_base_grid_iter( minibatch_size=minibatch_size, optimizer_implementation=optimizer_implementation, init=init, )) def transform_processing_hyperparameters( kind, hyperparameters, optimizer_implementation=None, init=None): """Return one processing flank variant for a hyperparameter dict. ``optimizer_implementation`` and ``init`` are optional explicit overrides. When omitted, the values already serialized in ``hyperparameters`` are retained. """ if kind not in PROCESSING_VARIANT_CHOICES: raise ValueError( "Unknown processing variant %r; expected one of: %s" % ( kind, ", ".join(PROCESSING_VARIANT_CHOICES), ) ) new_hyperparameters = deepcopy(hyperparameters) if kind in ("no_n_flank", "no_flank"): new_hyperparameters["n_flank_length"] = 0 if kind in ("no_c_flank", "no_flank"): new_hyperparameters["c_flank_length"] = 0 if kind == "short_flanks": new_hyperparameters["c_flank_length"] = 5 new_hyperparameters["n_flank_length"] = 5 if optimizer_implementation is not None: if optimizer_implementation not in OPTIMIZER_IMPLEMENTATION_CHOICES: raise ValueError( "Unknown optimizer implementation %r; expected one of: %s" % ( optimizer_implementation, ", ".join(OPTIMIZER_IMPLEMENTATION_CHOICES), ) ) new_hyperparameters["optimizer_implementation"] = ( optimizer_implementation) if init is not None: if init not in PROCESSING_INIT_CHOICES: raise ValueError( "Unknown processing initializer %r; expected one of: %s" % ( init, ", ".join(PROCESSING_INIT_CHOICES), ) ) new_hyperparameters["init"] = init return new_hyperparameters def build_processing_variant_grid( production_hyperparameters, kind, optimizer_implementation=None, init=None): """Return a flank-mode variant of a processing hyperparameter grid.""" return unique_hyperparameters( transform_processing_hyperparameters( kind, item, optimizer_implementation=optimizer_implementation, init=init, ) for item in production_hyperparameters ) def build_affinity_ablation_panels(): """Return the paired, representative affinity audit panels.""" architecture_keys = ( ("feedforward", (512, 512), 1e-8), ("with-skip-connections", (256, 512, 512), 1e-8), ) conditions = { "published_parity": dict( minibatch_size=128, optimizer_implementation="keras", data_dependent_initialization_target="post_activation", ), "proposed_release": dict( minibatch_size=1024, optimizer_implementation="keras", data_dependent_initialization_target="post_activation", ), "pre_activation_lsuv": dict( minibatch_size=1024, optimizer_implementation="keras", data_dependent_initialization_target="pre_activation", ), "no_lsuv": dict( minibatch_size=1024, optimizer_implementation="keras", data_dependent_initialization_target="post_activation", ), "pytorch_rmsprop": dict( minibatch_size=1024, optimizer_implementation="pytorch", data_dependent_initialization_target="post_activation", ), "pytorch_rmsprop_batch128": dict( minibatch_size=128, optimizer_implementation="pytorch", data_dependent_initialization_target="post_activation", ), } result = {} for condition, options in conditions.items(): grid = build_affinity_grid(**options) selected = [ item for item in grid if ( item["topology"], tuple(item["layer_sizes"]), item["dense_layer_l1_regularization"], ) in architecture_keys ] if len(selected) != len(architecture_keys): raise RuntimeError( "Affinity ablation architecture selection returned %d rows" % len(selected) ) if condition == "no_lsuv": for item in selected: item["data_dependent_initialization_method"] = None result[condition] = selected return result def build_processing_ablation_panels(): """Return the paired, representative processing audit panels.""" architecture_keys = ( ("tanh", 256, 11, (0.0, 0.0), (8,), 0.3), ("relu", 512, 17, (1e-6, 0.0), (16,), 0.5), ) conditions = { "glorot_keras_adam": ("glorot_uniform", "keras"), "kaiming_keras_adam": ("kaiming_uniform_fan_in", "keras"), "glorot_pytorch_adam": ("glorot_uniform", "pytorch"), "kaiming_pytorch_adam": ("kaiming_uniform_fan_in", "pytorch"), } result = {} for condition, (init, optimizer_implementation) in conditions.items(): grid = build_processing_base_grid( init=init, optimizer_implementation=optimizer_implementation, ) selected = [ item for item in grid if ( item["convolutional_activation"], item["convolutional_filters"], item["convolutional_kernel_size"], tuple(item["convolutional_kernel_l1_l2"]), tuple(item["post_convolutional_dense_layer_sizes"]), item["dropout_rate"], ) in architecture_keys ] if len(selected) != len(architecture_keys): raise RuntimeError( "Processing ablation architecture selection returned %d rows" % len(selected) ) result[condition] = selected return result def build_processing_batch_sweep_panels( minibatch_sizes=PROCESSING_BATCH_SWEEP_SIZES): """Return focused 5-aa and no-flank processing batch-sweep panels. This is a screening grid, not the production architecture grid. It keeps the two representative architectures used by the initializer/optimizer audit and prunes recipe combinations that were dominated on the primary held-out metrics. The same candidate recipes are emitted at every batch size so minibatch size is the only between-panel change. """ minibatch_sizes = tuple(minibatch_sizes) if not minibatch_sizes: raise ValueError("minibatch_sizes must not be empty") if any( isinstance(value, bool) or not isinstance(value, int) or value <= 0 for value in minibatch_sizes): raise ValueError("minibatch_sizes must contain positive integers") if len(set(minibatch_sizes)) != len(minibatch_sizes): raise ValueError("minibatch_sizes must not contain duplicates") architecture_keys = { "small": ("tanh", 256, 11, (0.0, 0.0), (8,), 0.3), "large": ("relu", 512, 17, (1e-6, 0.0), (16,), 0.5), } # Primary 5-aa candidates: alternatives hurt the small/tanh model. For # large/ReLU, Kaiming+Keras was dominated by the two retained alternatives. # Secondary no-flank candidates: Kaiming+Keras improved all three primary # small/tanh metrics; every alternative hurt large/ReLU. candidate_recipes = { "short_flanks": ( ("small", "glorot_uniform", "keras"), ("large", "glorot_uniform", "keras"), ("large", "glorot_uniform", "pytorch"), ("large", "kaiming_uniform_fan_in", "pytorch"), ), "no_flank": ( ("small", "glorot_uniform", "keras"), ("small", "kaiming_uniform_fan_in", "keras"), ("large", "glorot_uniform", "keras"), ), } result = {} for minibatch_size in minibatch_sizes: recipe_grids = {} for recipes in candidate_recipes.values(): for _, init, optimizer_implementation in recipes: recipe_key = (init, optimizer_implementation) if recipe_key not in recipe_grids: recipe_grids[recipe_key] = build_processing_base_grid( minibatch_size=minibatch_size, init=init, optimizer_implementation=optimizer_implementation, ) for variant, recipes in candidate_recipes.items(): selected = [] for architecture, init, optimizer_implementation in recipes: architecture_key = architecture_keys[architecture] matches = [ item for item in recipe_grids[ (init, optimizer_implementation)] if ( item["convolutional_activation"], item["convolutional_filters"], item["convolutional_kernel_size"], tuple(item["convolutional_kernel_l1_l2"]), tuple(item["post_convolutional_dense_layer_sizes"]), item["dropout_rate"], ) == architecture_key ] if len(matches) != 1: raise RuntimeError( "Processing batch-sweep architecture selection " "returned %d rows for %s/%s/%s" % ( len(matches), variant, architecture, recipe_key)) selected.append(transform_processing_hyperparameters( variant, matches[0])) result["batch%d.%s" % (minibatch_size, variant)] = ( unique_hyperparameters(selected)) return result def read_hyperparameters_yaml(path): """Read a YAML hyperparameter list from ``path``.""" with open(path) as fd: hyperparameters = yaml.safe_load(fd) if hyperparameters is None: return [] if not isinstance(hyperparameters, list): raise ValueError( "Expected YAML list in %s; got %s" % ( path, type(hyperparameters).__name__)) return hyperparameters def dump_hyperparameters(hyperparameters, stream=None): """Write hyperparameter dictionaries as safe YAML.""" yaml.safe_dump(hyperparameters, stream or sys.stdout) def add_minibatch_argument(parser, default=DEFAULT_MINIBATCH_SIZE): """Add the common training-minibatch-size argument to ``parser``.""" parser.add_argument( "--minibatch-size", type=positive_int_arg, default=default, help=( "Training minibatch size to write into every architecture. " "Default: %(default)s" ), ) def add_optimizer_implementation_argument(parser): """Add the optimizer-equation implementation argument.""" parser.add_argument( "--optimizer-implementation", choices=OPTIMIZER_IMPLEMENTATION_CHOICES, default=DEFAULT_OPTIMIZER_IMPLEMENTATION, help=( "Optimizer update equations to write into every architecture. " "Default: %(default)s (published 2.1.x parity)" ), ) def make_parser(prog=None): """Build the argparse parser for the unified generator command.""" parser = argparse.ArgumentParser(description=__doc__, prog=prog) subparsers = parser.add_subparsers(dest="recipe", required=True) affinity = subparsers.add_parser( "affinity", help="Generate the Class I pan-allele affinity grid.") add_minibatch_argument(affinity, AFFINITY_DEFAULT_MINIBATCH_SIZE) add_optimizer_implementation_argument(affinity) affinity.add_argument( "--data-dependent-initialization-target", choices=LSUV_TARGET_CHOICES, default="post_activation", help="LSUV activation boundary. Default: %(default)s (2.1.x parity)", ) affinity.add_argument( "--init", choices=AFFINITY_INIT_CHOICES, default="glorot_uniform", help="Affinity-layer initializer. Default: %(default)s (2.1.x parity)", ) processing_base = subparsers.add_parser( "processing-base", help="Generate the base Class I processing grid.") add_minibatch_argument(processing_base, PROCESSING_DEFAULT_MINIBATCH_SIZE) add_optimizer_implementation_argument(processing_base) processing_base.add_argument( "--init", choices=PROCESSING_INIT_CHOICES, default="glorot_uniform", help="Processing-layer initializer. Default: %(default)s (2.1.x parity)", ) processing_variant = subparsers.add_parser( "processing-variant", help="Generate a flank-mode processing grid from a base grid.") processing_variant.add_argument( "production_hyperparameters", metavar="YAML", help="Base processing hyperparameter grid YAML.") processing_variant.add_argument( "kind", choices=PROCESSING_VARIANT_CHOICES, help="Processing flank variant to output.") processing_variant.add_argument( "--optimizer-implementation", choices=OPTIMIZER_IMPLEMENTATION_CHOICES, default=None, help=( "Override the optimizer equations in every architecture. " "If omitted, retain the value from the base YAML." ), ) processing_variant.add_argument( "--init", choices=PROCESSING_INIT_CHOICES, default=None, help=( "Override the initializer in every architecture. If omitted, " "retain the value from the base YAML." ), ) return parser def run_argv(argv=None, prog=None): """Run the unified generator command.""" args = make_parser(prog=prog).parse_args(argv) if args.recipe == "affinity": grid = build_affinity_grid( minibatch_size=args.minibatch_size, optimizer_implementation=args.optimizer_implementation, data_dependent_initialization_target=( args.data_dependent_initialization_target ), init=args.init, ) elif args.recipe == "processing-base": grid = build_processing_base_grid( minibatch_size=args.minibatch_size, optimizer_implementation=args.optimizer_implementation, init=args.init, ) elif args.recipe == "processing-variant": grid = build_processing_variant_grid( read_hyperparameters_yaml(args.production_hyperparameters), args.kind, optimizer_implementation=args.optimizer_implementation, init=args.init, ) else: raise ValueError("Unsupported recipe: %s" % args.recipe) print("Hyperparameters grid size: %d" % len(grid), file=sys.stderr) dump_hyperparameters(grid) def run_affinity_argv(argv=None, prog=None): """Compatibility entry point for the old affinity generator script.""" if argv is None: argv = sys.argv[1:] return run_argv(["affinity"] + list(argv), prog=prog) def run_processing_base_argv(argv=None, prog=None): """Compatibility entry point for the old processing-base script.""" if argv is None: argv = sys.argv[1:] return run_argv(["processing-base"] + list(argv), prog=prog) def run_processing_variant_argv(argv=None, prog=None): """Compatibility entry point for the old processing-variant script.""" if argv is None: argv = sys.argv[1:] return run_argv(["processing-variant"] + list(argv), prog=prog) if __name__ == "__main__": run_argv() mhcflurry-2.3.6/mhcflurry/cli/help.py000066400000000000000000000054471525677230600176500ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Readable argparse help with optional terminal styling.""" import argparse import os import re import shutil import sys _OPTION = re.compile(r"(?= (3, 14): # Apply the same styling on all supported Python versions. kwargs["color"] = False super().__init__(*args, **kwargs) def print_help(self, file=None): stream = sys.stdout if file is None else file self._print_message(style_help(self.format_help(), stream), stream) mhcflurry-2.3.6/mhcflurry/cli/main.py000066400000000000000000000310551525677230600176360ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Top-level ``mhcflurry`` CLI dispatcher. Every subcommand is registered as ``(module path, entry attr, one-line help)`` and lazy-imported on dispatch, so ``mhcflurry --help`` and ``mhcflurry --help`` only pull in the modules they actually need. This keeps the torch-import cost off the top-level help path. Two flavors of subcommand: * **New under the parent**: ``train``, ``eval``, ``compare-models``, ``plot-model-comparison``, ``paper-figures``. Each module exposes ``run_argv(argv)`` which does its own argparse. * **Historical mhcflurry-* commands**: ``predict``, ``predict-scan``, ``downloads``, ``calibrate-percentile-ranks``, the ``class1-train-*`` / ``class1-select-*`` family, ``pseudosequences``. Each is wrapped by invoking the command module's existing ``run(argv)`` (or ``main(argv)`` for ``pseudosequences``) on the post-subcommand argv. All ``mhcflurry-*`` console_scripts in ``setup.py`` remain installed as compat shims pointing at the same underlying entry functions. """ from __future__ import annotations import argparse import inspect import importlib import sys from ..version import __version__ from .help import style_help # Every subcommand is ``(module_path, entry_attr, one-line help)``. The # entry function must accept a single ``argv`` argument; it owns its own # arg parsing. _SUBCOMMANDS = { "train": ( "mhcflurry.cli.train_command", "run_argv", "Release-training workflows."), "eval": ( "mhcflurry.cli.eval_command", "run_argv", "Evaluation, model comparison, and paper-figure workflows."), "compare-models": ( "mhcflurry.cli.compare_models", "run_argv", "Compare two model ensembles on data_evaluation."), "plot-model-comparison": ( "mhcflurry.cli.plot_model_comparison", "run_argv", "Render plots from a compare-models output directory."), "paper-figures": ( "mhcflurry.cli.paper_figures", "run_argv", "Render paper-style figures from retraining artifacts."), "predict": ( "mhcflurry.cli.predict_command", "run", "Predict affinity, processing and presentation for peptides and MHC alleles."), "predict-scan": ( "mhcflurry.cli.predict_scan_command", "run", "Scan protein sequences for predicted MHC I ligands."), "downloads": ( "mhcflurry.cli.downloads_command", "run", "Fetch, inspect, resolve data + model downloads."), "calibrate-percentile-ranks": ( "mhcflurry.cli.calibrate_percentile_ranks_command", "run", "Calibrate percentile ranks on an existing predictor."), "class1-train-allele-specific-models": ( "mhcflurry.cli.train_allele_specific_models_command", "run", "Train Class I allele-specific affinity models."), "class1-select-allele-specific-models": ( "mhcflurry.cli.select_allele_specific_models_command", "run", "Select Class I allele-specific models from a candidate pool."), "class1-train-pan-allele-models": ( "mhcflurry.cli.train_pan_allele_models_command", "run", "Train Class I pan-allele affinity models."), "class1-select-pan-allele-models": ( "mhcflurry.cli.select_pan_allele_models_command", "run", "Select Class I pan-allele models from a candidate pool."), "class1-train-processing-models": ( "mhcflurry.cli.train_processing_models_command", "run", "Train Class I antigen-processing models."), "class1-select-processing-models": ( "mhcflurry.cli.select_processing_models_command", "run", "Select Class I processing models from a candidate pool."), "class1-train-presentation-models": ( "mhcflurry.cli.train_presentation_models_command", "run", "Train the Class I presentation predictor (affinity + processing)."), "class1-generate-training-hyperparameters": ( "mhcflurry.cli.generate_training_hyperparameters", "run_argv", "Generate release-training hyperparameter grids."), "class1-reassign-mass-spec-training-data": ( "mhcflurry.cli.reassign_mass_spec_training_data", "run_argv", "Reassign mass-spec rows in Class I affinity training data."), "pseudosequences": ( "mhcflurry.pseudosequences", "main", "Pseudosequence CSV registry helper (filename / path / list)."), } # Display grouping for the friendly help screen. Each subcommand listed # here must appear in ``_SUBCOMMANDS``; the closing assertion catches # drift between the two. _HELP_GROUPS = ( ("Prediction", ( "predict", "predict-scan", )), ("Data management", ( "downloads", )), ("Calibration", ( "calibrate-percentile-ranks", )), ("Class I training", ( "class1-train-allele-specific-models", "class1-train-pan-allele-models", "class1-train-processing-models", "class1-train-presentation-models", )), ("Class I selection", ( "class1-select-allele-specific-models", "class1-select-pan-allele-models", "class1-select-processing-models", )), ("Release training", ( "train", )), ("Evaluation and figures", ( "eval", "compare-models", "plot-model-comparison", "paper-figures", )), ("Helpers", ( "class1-generate-training-hyperparameters", "class1-reassign-mass-spec-training-data", "pseudosequences", )), ) def _check_help_groups(): """Fail-fast at import time if _HELP_GROUPS drifts from _SUBCOMMANDS. Missing or unknown command names prevent importing this dispatcher. Historical console scripts import their command modules directly and do not run this check. Duplicate grouping is checked by CLI tests. """ grouped = {name for _, names in _HELP_GROUPS for name in names} missing = set(_SUBCOMMANDS) - grouped extra = grouped - set(_SUBCOMMANDS) # Raise explicitly rather than ``assert`` so the guard survives ``python -O`` # (which strips assertions): drift must never ship silently. if missing: raise RuntimeError( "subcommands missing from _HELP_GROUPS: %s" % missing) if extra: raise RuntimeError( "_HELP_GROUPS lists unknown subcommands: %s" % extra) _check_help_groups() def build_parser(): """Return the top-level parser used by ``--help`` and tooling. Subparsers are registered by name only — no per-subcommand arguments are added here. The legacy module owns its own ``--help`` output and is invoked lazily by :func:`main`. Keeps this function torch-free. """ parser = argparse.ArgumentParser( prog="mhcflurry", description=( "MHCflurry. Use 'mhcflurry --help' for details on " "any subcommand." ), ) # ``--version`` / ``-V`` is handled by main()'s early-exit before # parse_args runs; no argparse action needed here. sub = parser.add_subparsers(dest="subcommand", required=True) for name, (_module, _entry, help_text) in _SUBCOMMANDS.items(): sub.add_parser(name, help=help_text, add_help=False) return parser def format_help(): """Build the friendly help screen shown for bare ``mhcflurry`` and ``--help``. Replaces argparse's default flat-listing layout with grouped sections, a short usage banner, and a couple of example invocations. Pure-string formatting; no argparse internals involved. """ lines = [ "usage: mhcflurry [args]", "", "MHCflurry %s" % __version__, "", "Historical standalone mhcflurry-* scripts remain installed as", "compatibility shims. New namespaces such as train and eval live", "under the unified mhcflurry command.", "", ] name_width = max( len(name) for _, names in _HELP_GROUPS for name in names ) for group_name, names in _HELP_GROUPS: lines.append("%s:" % group_name) for name in names: _, _, help_text = _SUBCOMMANDS[name] lines.append(" %s %s" % (name.ljust(name_width), help_text)) lines.append("") lines.extend([ "Examples:", " mhcflurry predict --alleles HLA-A0201 --peptides SIINFEKL --out out.csv", " mhcflurry train pan-allele-release --run-dir runs/2.3.0 --release 2.3.0", " mhcflurry eval compare-models --a results/new_run/ --b public --out cmp/", " mhcflurry eval paper-figures run --a results/new_run/ --out eval/", " mhcflurry --help", "", "Options:", " -h, --help show this help message and exit", " --version, -V show 'mhcflurry %s' and exit" % __version__, ]) return "\n".join(lines) def _rewrite_parser_prog(parser, prog): """Recursively rewrite ``parser.prog`` and its subparsers' progs. Returns a list of ``(parser, original_prog)`` pairs that :func:`_restore_parser_progs` can use to undo the change. Walking the subparser tree is necessary because sub-subcommands (``downloads fetch``, ``pseudosequences filename``, …) take their prog from the parent at parser-build time, which for legacy modules is import time — before the unified dispatcher gets to rename the top-level parser. """ saved = [] if parser is None or not hasattr(parser, "prog"): return saved saved.append((parser, parser.prog)) parser.prog = prog # argparse._SubParsersAction is technically a private name (underscore # prefix), but the class has been stable across Python releases and is # the standard handle every CLI tool that walks subparser trees uses # (sphinx-autoprogram, click->argparse adapters, etc). for action in parser._actions: if isinstance(action, argparse._SubParsersAction): for sub_name, sub_parser in action.choices.items(): saved.extend(_rewrite_parser_prog( sub_parser, "%s %s" % (prog, sub_name))) return saved def _restore_parser_progs(saved): """Reverse :func:`_rewrite_parser_prog`; used as a tests-friendly finally.""" for parser, original_prog in saved: parser.prog = original_prog def _entry_accepts_prog(entry_func): """Return whether ``entry_func`` accepts a ``prog=`` display override.""" try: signature = inspect.signature(entry_func) except (TypeError, ValueError): return False return "prog" in signature.parameters def main(argv=None): """Dispatch entry point for the ``mhcflurry`` console script.""" if argv is None: argv = sys.argv[1:] if not argv: # Bare ``mhcflurry``: treat as "user asked for help". stdout + # exit 0 so the screen can be piped into ``less`` and so # tab-completion shells that probe ``mhcflurry`` don't see a # spurious error. print(style_help(format_help(), sys.stdout)) return 0 if argv[0] in ("-h", "--help"): print(style_help(format_help(), sys.stdout)) return 0 if argv[0] in ("-V", "--version"): print("mhcflurry %s" % __version__) return 0 subcommand = argv[0] remaining = argv[1:] if subcommand in _SUBCOMMANDS: module_path, entry, _ = _SUBCOMMANDS[subcommand] module = importlib.import_module(module_path) # Subcommands' parsers normally default ``prog`` to ``sys.argv[0]`` # (the console script name). When dispatched under the parent, keep # display ``prog`` separate from ``sys.argv`` so artifact-producing # commands can still record a reproducible command in GENERATE.sh. prog = "mhcflurry %s" % subcommand saved_progs = _rewrite_parser_prog( getattr(module, "parser", None), prog) entry_func = getattr(module, entry) try: if _entry_accepts_prog(entry_func): return entry_func(remaining, prog=prog) return entry_func(remaining) finally: _restore_parser_progs(saved_progs) # Unknown subcommand — let argparse emit the standard error + usage. build_parser().parse_args(argv) return 2 # unreachable; parse_args exits if __name__ == "__main__": sys.exit(main() or 0) mhcflurry-2.3.6/mhcflurry/cli/materialize_affinity_checkpoint.py000066400000000000000000000140421525677230600253150ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Materialize retained affinity checkpoints as an ordinary predictor.""" import argparse import hashlib import json from pathlib import Path import shutil import uuid import pandas from ..class1_affinity_predictor import Class1AffinityPredictor POLICIES = ("terminal", "best") def _sha256(path): digest = hashlib.sha256() with path.open("rb") as fd: for block in iter(lambda: fd.read(8 * 1024 * 1024), b""): digest.update(block) return digest.hexdigest() def make_parser(prog="mhcflurry train materialize-affinity-checkpoint"): parser = argparse.ArgumentParser(prog=prog, description=__doc__) parser.add_argument( "--models-dir", required=True, help="Predictor directory containing retained checkpoint sidecars.", ) parser.add_argument( "--policy", required=True, choices=POLICIES, help="Checkpoint policy to install as the predictor's primary weights.", ) parser.add_argument( "--out-models-dir", required=True, help="New predictor directory to create; it must not already exist.", ) return parser def _resolve_checkpoint(source, relative_path): relative = Path(str(relative_path)) if relative.is_absolute() or ".." in relative.parts: raise ValueError( "Checkpoint path must be relative and remain inside the predictor: " "%s" % relative_path) result = (source / relative).resolve() if source != result and source not in result.parents: raise ValueError( "Checkpoint path escapes predictor directory: %s" % relative_path) return result def materialize(models_dir, policy, out_models_dir): """Create a predictor whose primary files use ``policy`` checkpoints.""" source = Path(models_dir).resolve() out = Path(out_models_dir).resolve() manifest_path = source / "manifest.csv" if not manifest_path.is_file(): raise ValueError("Missing predictor manifest: %s" % manifest_path) if out.exists(): raise ValueError("Output already exists: %s" % out) if out == source or source in out.parents: raise ValueError("Output cannot be inside the source predictor directory") manifest = pandas.read_csv(manifest_path) checkpoint_column = "checkpoint_%s_weights" % policy if checkpoint_column not in manifest.columns: raise ValueError( "Predictor has no retained %s checkpoints (missing manifest " "column %s)" % (policy, checkpoint_column)) checkpoints = [] for _, row in manifest.iterrows(): relative_path = row[checkpoint_column] if pandas.isna(relative_path): raise ValueError( "Model %s has no retained %s checkpoint" % ( row.model_name, policy)) checkpoint = _resolve_checkpoint(source, relative_path) if not checkpoint.is_file(): raise ValueError( "Missing retained %s checkpoint for %s: %s" % ( policy, row.model_name, checkpoint)) checkpoints.append((row.model_name, checkpoint)) out.parent.mkdir(parents=True, exist_ok=True) temporary = out.parent / (".%s.tmp-%s" % (out.name, uuid.uuid4().hex)) try: shutil.copytree(source, temporary) provenance_models = [] for model_name, checkpoint in checkpoints: destination = Path(Class1AffinityPredictor.weights_path( str(temporary), model_name)) shutil.copy2(checkpoint, destination) digest = _sha256(checkpoint) provenance_models.append({ "model_name": model_name, "checkpoint_sha256": digest, "primary_weights_sha256": _sha256(destination), }) manifest["primary_checkpoint_policy"] = policy updated_configs = [] for raw_config in manifest.config_json: config = json.loads(raw_config) config["materialized_checkpoint_policy"] = policy fit_info = config.get("fit_info") or [] if fit_info: fit_info[-1]["materialized_checkpoint_policy"] = policy updated_configs.append(json.dumps(config)) manifest["config_json"] = updated_configs manifest.to_csv(temporary / "manifest.csv", index=False) removed_stale_metadata = [] for name in ("percent_ranks.csv", "percent_ranks.json", "optimization_info.json"): path = temporary / name if path.exists(): path.unlink() removed_stale_metadata.append(name) provenance = { "format": 1, "source_models_dir": str(source), "source_manifest_sha256": _sha256(manifest_path), "checkpoint_policy": policy, "models": provenance_models, "removed_stale_metadata": removed_stale_metadata, } with (temporary / "checkpoint_selection.json").open("w") as fd: json.dump(provenance, fd, indent=2, sort_keys=True) fd.write("\n") temporary.replace(out) except BaseException: if temporary.exists(): shutil.rmtree(temporary) raise return out def run_argv(argv=None, prog="mhcflurry train materialize-affinity-checkpoint"): args = make_parser(prog).parse_args(argv) out = materialize(args.models_dir, args.policy, args.out_models_dir) print("Materialized %s affinity checkpoints to: %s" % (args.policy, out)) return 0 if __name__ == "__main__": raise SystemExit(run_argv()) mhcflurry-2.3.6/mhcflurry/cli/merge_external_predictions.py000066400000000000000000000170211525677230600243130ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 """Merge precomputed external-predictor benchmark groups into one table.""" from __future__ import annotations import argparse import bz2 import json from pathlib import Path import pandas from mhcflurry.experiment_archive import sha256_file def make_parser(prog="mhcflurry eval merge-external-predictions"): """Build the external-prediction merge parser.""" parser = argparse.ArgumentParser(prog=prog, description=__doc__) parser.add_argument( "--group", action="append", required=True, metavar="PREDICTOR=MANIFEST.csv", help=( "Predictor name and data_evaluation group manifest. Repeat once " "per predictor. The manifests must describe the same base rows." ), ) parser.add_argument("--out", required=True, metavar="CSV[.bz2]") return parser def _parse_group(spec): if "=" not in spec: raise ValueError( "--group must have the form PREDICTOR=MANIFEST.csv: %s" % spec) predictor, manifest = spec.split("=", 1) predictor = predictor.strip() manifest = Path(manifest).expanduser().resolve() if not predictor or not manifest.is_file(): raise ValueError("Invalid --group: %s" % spec) return predictor, manifest def _member_key(filename, predictor): marker = ".%s." % predictor if marker not in filename: raise ValueError( "Group member does not contain predictor marker %s: %s" % ( marker, filename)) return filename.replace(marker, "..", 1) def _load_group(predictor, manifest): frame = pandas.read_csv(manifest) if list(frame.columns) != ["filename"]: raise ValueError( "Group manifest must contain only a filename column: %s" % manifest) records = [] seen = set() for filename in frame.filename: path = (manifest.parent / str(filename)).resolve() if not path.is_file(): raise ValueError("Missing group member: %s" % path) key = _member_key(path.name, predictor) if key in seen: raise ValueError("Duplicate group member identity: %s" % key) seen.add(key) records.append((key, path)) return records def merge_external_prediction_groups(group_specs, out_path): """Merge aligned per-predictor group members and return provenance.""" groups = [_parse_group(spec) for spec in group_specs] predictor_names = [predictor for predictor, _manifest in groups] if len(set(predictor_names)) != len(predictor_names): raise ValueError("Predictor names in --group must be unique") loaded = { predictor: (manifest, _load_group(predictor, manifest)) for predictor, manifest in groups } first_predictor = predictor_names[0] first_records = loaded[first_predictor][1] expected_keys = [key for key, _path in first_records] expected_key_set = set(expected_keys) for predictor in predictor_names[1:]: actual_keys = {key for key, _path in loaded[predictor][1]} if actual_keys != expected_key_set: raise ValueError( "Group %s describes different members: missing=%s extra=%s" % ( predictor, sorted(expected_key_set - actual_keys)[:5], sorted(actual_keys - expected_key_set)[:5], )) path_by_predictor = { predictor: dict(records) for predictor, (_manifest, records) in loaded.items() } out_path = Path(out_path).expanduser().resolve() out_path.parent.mkdir(parents=True, exist_ok=True) opener = bz2.open if out_path.suffix == ".bz2" else open input_records = [] total_rows = 0 metadata_columns = None with opener(out_path, "wt", newline="") as out_fd: for member_index, key in enumerate(expected_keys): merged = None for predictor in predictor_names: path = path_by_predictor[predictor][key] frame = pandas.read_csv(path) required = [predictor] missing = [column for column in required if column not in frame] if missing: raise ValueError( "%s lacks predictor column %s" % (path, predictor)) current_metadata = [ column for column in frame.columns if column not in ( predictor, "%s_best_allele" % predictor) ] if merged is None: metadata_columns = metadata_columns or current_metadata if current_metadata != metadata_columns: raise ValueError( "Benchmark metadata columns changed in %s" % path) merged = frame[current_metadata].copy() else: if current_metadata != metadata_columns: raise ValueError( "Benchmark metadata columns differ in %s" % path) if not frame[current_metadata].equals( merged[metadata_columns]): raise ValueError( "Benchmark rows are not aligned for %s in %s" % ( predictor, path)) merged[predictor] = frame[predictor].to_numpy() input_records.append({ "predictor": predictor, "member_identity": key, "path": str(path), "sha256": sha256_file(path), "rows": len(frame), }) merged.to_csv( out_fd, index=False, header=member_index == 0) total_rows += len(merged) completed = member_index + 1 if completed == len(expected_keys) or completed % 10 == 0: print( "Merged %d/%d benchmark members (%d rows)" % ( completed, len(expected_keys), total_rows), flush=True, ) manifest_records = [ { "predictor": predictor, "path": str(manifest), "sha256": sha256_file(manifest), } for predictor, manifest in groups ] provenance = { "schema_version": 1, "predictors": predictor_names, "metadata_columns": metadata_columns, "member_count": len(expected_keys), "row_count": total_rows, "group_manifests": manifest_records, "input_members": input_records, "output": { "path": str(out_path), "sha256": sha256_file(out_path), }, } provenance_path = Path("%s.provenance.json" % out_path) provenance_path.write_text( json.dumps(provenance, indent=2, sort_keys=True) + "\n") provenance["provenance_path"] = str(provenance_path) return provenance def run(args): """Merge external predictions specified on the command line.""" provenance = merge_external_prediction_groups(args.group, args.out) print(provenance["output"]["path"]) return 0 def run_argv(argv=None, prog="mhcflurry eval merge-external-predictions"): """Parse arguments and merge external prediction groups.""" return run(make_parser(prog).parse_args(argv)) if __name__ == "__main__": raise SystemExit(run_argv()) mhcflurry-2.3.6/mhcflurry/cli/model_comparison_constants.py000066400000000000000000000015271525677230600243410ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Shared constants for model comparison metrics and plots. """ METRIC_NAMES = ("roc_auc", "pr_auc", "ppv_at_n") PROCESSING_MODES = ("with_flanks", "no_flank", "short_flanks") PRESENTATION_MODES = ("with_flanks", "without_flanks") PRESENTATION_SCORE_KINDS = ("presentation_score", "presentation_percentile") mhcflurry-2.3.6/mhcflurry/cli/paper_figures.py000066400000000000000000003321351525677230600215500ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Generate paper-style figures from retraining/evaluation outputs. This command ports the figure families from the 2023 retraining notebooks into a reproducible CLI. It reads saved evaluation tables: raw saved prediction tables such as ``benchmark.multiallelic.csv.bz2``, derived score tables such as ``accuracy_scores.multiallelic.csv``, and the current ``compare-models`` output directory when supplied. Missing inputs are written to ``missing_inputs.md`` and ``manifest.csv`` so a training run can distinguish "not generated because the data is absent" from "plotting silently drifted." """ from __future__ import annotations import argparse import json import os import shutil import sys from dataclasses import dataclass from pathlib import Path from typing import Optional import numpy import pandas from .figure_style import ( SIDE_A_COLOR, SIDE_B_COLOR, apply_paper_style as _apply_paper_style, despine as _despine, predictor_color as _predictor_color, short_label as _short_label, ) from ..common import allele_locus_name, positive_int_arg CANDIDATE_PREDICTOR = "mhcflurry_production" DEFAULT_PREDICTOR_HIGHER_IS_BETTER = { "affinity": False, "affinity_percentile": False, "processing_score": True, "presentation_score": True, "presentation_percentile": False, "mhcflurry_production": False, "mhcflurry_production_affinity": False, "mhcflurry_production_percentile": False, "netmhcpan4.ba": False, "netmhcpan4.ba_affinity": False, "netmhcpan4.el": True, "netmhcpan4.el_rank": False, "netmhcpan4.el_percentile": False, "netmhcpan4.2.ba": False, "netmhcpan4.2.ba_affinity": False, "netmhcpan4.2.el": True, "netmhcpan4.2.el_rank": False, "netmhcpan4.2.el_percentile": False, "mixmhcpred": True, "presentation_with_flanks_presentation_score": True, "presentation_without_flanks_presentation_score": True, "presentation_with_flanks_processing_score": True, "presentation_without_flanks_processing_score": True, "presentation_with_flanks_affinity": False, "presentation_without_flanks_affinity": False, "presentation_with_flanks_presentation_percentile": False, "presentation_without_flanks_presentation_percentile": False, } EXTERNAL_BASELINES = ( ("netmhcpan4.ba", "ba"), ("netmhcpan4.el", "el"), ("mixmhcpred", "mixmhcpred"), ) PRESENTATION_PANEL_PREDICTORS = ( "presentation_without_flanks_presentation_score", "presentation_with_flanks_presentation_score", ) PRESENTATION_PANEL_BASELINES = ( "netmhcpan4.ba", "netmhcpan4.el", "mixmhcpred", "mhcflurry_production", ) PREFERRED_PREDICTORS = ( "netmhcpan4.ba", "netmhcpan4.el", "mixmhcpred", "mhcflurry_production", "presentation_without_flanks_presentation_score", "presentation_with_flanks_presentation_score", ) LENGTH_LABEL_ORDER = ("All", "8-mer", "9-mer", "10-mer", "11-mer") DEFAULT_FORMATS = ("svg", "pdf", "png") MONOALLELIC_PANEL_ROWS_PER_PAGE = 4 @dataclass(frozen=True) class PredictorConfig: candidate: str external_baselines: tuple preferred_predictors: tuple monoallelic_panel_predictors: tuple presentation_panel_predictors: tuple presentation_panel_baselines: tuple @dataclass(frozen=True) class FigureInputs: scores_dir: Path comparison_dir: Optional[Path] run_dir: Optional[Path] multiallelic_predictions: Optional[Path] monoallelic_predictions: Optional[Path] def make_parser(): """Return a standalone parser for documentation tooling.""" parser = argparse.ArgumentParser(prog="mhcflurry paper-figures") register_subparser(parser) return parser def run_argv(argv): """Entry point for the lazy ``mhcflurry paper-figures`` dispatcher.""" return run(make_parser().parse_args(argv)) def register_subparser(parser): parser.description = __doc__ parser.formatter_class = argparse.RawDescriptionHelpFormatter parser.epilog = """ Figure input contract: * comparison-dir: output from ``mhcflurry eval compare-models``. * scores-dir: reusable paper-figure inputs. Common files are accuracy_scores.multiallelic.csv, accuracy_scores.monoallelic.csv, benchmark.multiallelic.csv(.bz2), benchmark.monoallelic.csv(.bz2), sample_table.csv, and predictor_info.csv. * saved prediction tables: include hit, sample_id or allele/hla, optional peptide metadata, and canonical or explicitly declared score columns. * score direction is explicit. Built-in predictor names have defaults; custom score columns require predictor_info.csv rows with predictor and higher_is_better. Missing optional figure inputs are recorded in manifest.csv and missing_inputs.md instead of being silently fabricated. """ parser.add_argument( "--scores-dir", help=( "Directory containing saved figure inputs such as " "accuracy_scores.multiallelic.csv, benchmark.multiallelic.csv.bz2, " "and predictor_info.csv. Custom predictor rows in predictor_info.csv " "should include higher_is_better." ), ) parser.add_argument( "--artifacts-dir", help=( "Compatibility alias for --scores-dir. Prefer --scores-dir in " "new scripts." ), ) parser.add_argument( "--comparison-dir", help=( "Optional directory produced by ``mhcflurry compare-models``. " "When provided, paper-figures generates current-run panels from " "fresh MHCflurry side-A vs side-B evaluation outputs instead of " "requiring pre-derived score tables." ), ) parser.add_argument( "--multiallelic-predictions", help=( "Optional saved multiallelic test-set prediction table. If " "accuracy_scores.multiallelic.csv is absent, paper-figures derives " "per-sample AUC/PPV tables from this file. Default: " "/benchmark.multiallelic.csv.bz2 when present." ), ) parser.add_argument( "--monoallelic-predictions", help=( "Optional saved monoallelic test-set prediction table used to " "derive monoallelic AUC/PPV plots when " "accuracy_scores.monoallelic.csv is absent." ), ) parser.add_argument( "--out", required=True, help="Output directory for paper figures and manifest files.", ) parser.add_argument( "--formats", default=",".join(DEFAULT_FORMATS), help=( "Comma-separated output formats. Default: %(default)s. Use SVG/PDF " "for publication; PNG is for quick review." ), ) parser.add_argument( "--combined-pdf", default=None, help=( "Optional multi-page PDF path. Default: /paper_figures.pdf. " "Pass 'none' to skip." ), ) parser.add_argument( "--sample-table", help=( "Optional sample table with sample_id and sample_group columns. " "When present, panels that were recent-sample-only in the 2023 " "notebooks use --sample-group." ), ) parser.add_argument( "--sample-group", default="MULTIALLELIC-RECENT", help="Sample group for recent-only multiallelic panels.", ) parser.add_argument( "--candidate-predictor", default=CANDIDATE_PREDICTOR, help=( "Predictor to treat as the candidate MHCflurry model in " "notebook-style comparison panels. Default: %(default)s." ), ) parser.add_argument( "--external-baselines", default=",".join( "%s:%s" % (predictor, suffix) for predictor, suffix in EXTERNAL_BASELINES), help=( "Comma-separated external predictor comparators. Each item is " "PREDICTOR or PREDICTOR:PERCENT_CHANGE_SUFFIX. Default: " "%(default)s." ), ) parser.add_argument( "--preferred-predictors", default=",".join(PREFERRED_PREDICTORS), help=( "Comma-separated predictors for summary bar panels. Default: " "%(default)s." ), ) parser.add_argument( "--monoallelic-panel-predictors", default="", help=( "Comma-separated candidate predictors to show as rows in the " "monoallelic AUROC/AUPRC/PPV comparison grids. Default: only " "--candidate-predictor." ), ) parser.add_argument( "--presentation-panel-predictors", default=",".join(PRESENTATION_PANEL_PREDICTORS), help=( "Comma-separated candidate predictors for presentation-vs-baseline " "scatter grids. Default: %(default)s." ), ) parser.add_argument( "--presentation-panel-baselines", default=",".join(PRESENTATION_PANEL_BASELINES), help=( "Comma-separated baseline predictors for presentation-vs-baseline " "scatter grids. Default: %(default)s." ), ) parser.add_argument( "--max-scatter-points", type=positive_int_arg, default=20_000, help="Subsample scatter plots above this many points.", ) parser.add_argument( "--strict", action="store_true", default=False, help=( "Return a non-zero exit code if any requested non-metadata figure " "family skips or fails." ), ) return parser def run(args): import matplotlib matplotlib.use("Agg") out_dir = Path(args.out) formats = _parse_formats(args.formats) combined_pdf = _combined_pdf_path(args.combined_pdf, out_dir) _validate_paper_output_paths(out_dir, combined_pdf) writer = FigureWriter(out_dir, formats, combined_pdf) try: predictors = _parse_predictor_config(args) except ValueError as error: writer.fail("configuration", "predictor_config", str(error)) print("Invalid paper-figure configuration: %s" % error, file=sys.stderr) if not out_dir.exists(): out_dir.mkdir(parents=True, exist_ok=True) _write_manifest(out_dir, writer.rows) _write_missing_inputs(out_dir, writer.rows) return 2 _apply_paper_style() inputs = _resolve_figure_inputs(args, writer) if inputs is None: out_dir.mkdir(parents=True, exist_ok=True) _write_manifest(out_dir, writer.rows) _write_missing_inputs(out_dir, writer.rows) return 2 cleanup_conflicts = _paper_figure_cleanup_input_conflicts( args, inputs, out_dir, combined_pdf) if cleanup_conflicts: raise SystemExit( "Paper-figure output cleanup would delete input path(s): %s. " "Choose a separate --out directory." % ", ".join(str(path) for path in cleanup_conflicts) ) _clear_paper_figure_outputs(out_dir, combined_pdf) out_dir.mkdir(parents=True, exist_ok=True) try: predictor_info = _read_predictor_info( inputs.scores_dir / "predictor_info.csv", writer) sample_ids = _read_sample_group_ids(args, inputs, writer) _run_figure_family( writer, "multiallelic", "all", _generate_multiallelic_figures, inputs, predictor_info, sample_ids, args.sample_group, args.max_scatter_points, writer, predictors) _run_figure_family( writer, "model-selection", "all", _generate_model_selection_figures, inputs, writer) _run_figure_family( writer, "monoallelic", "all", _generate_monoallelic_figures, inputs, predictor_info, args.max_scatter_points, writer, predictors) _run_figure_family( writer, "antigen-processing", "all", _generate_processing_notebook_figures, inputs, predictor_info, writer, predictors) _run_figure_family( writer, "proteasome", "all", _generate_proteasome_figures, inputs, writer) _run_figure_family( writer, "architecture", "all", _copy_architecture_figures, inputs, writer) finally: writer.close() _write_manifest(out_dir, writer.rows) _write_missing_inputs(out_dir, writer.rows) # A rendering/computation exception is never an optional-input condition: # returning success would let release automation publish an incomplete PDF. # ``--strict`` additionally turns documented optional-input skips into an # error for callers that require every figure family. if any(row["status"] == "failed" for row in writer.rows): return 2 if args.strict and any(_strict_failure_row(row) for row in writer.rows): return 2 return 0 def _strict_failure_row(row): if row["status"] == "failed": return True if row["status"] != "skipped": return False return row["family"] != "metadata" def _run_figure_family(writer, family, figure, func, *args): try: func(*args) except Exception as e: writer.fail( family, figure, "%s: %s" % (type(e).__name__, e), ) class FigureWriter: """Write one plot to SVG/PDF/PNG and track the output manifest.""" def __init__(self, out_dir, formats, combined_pdf): self.out_dir = Path(out_dir) self.formats = tuple(formats) self.combined_pdf = Path(combined_pdf) if combined_pdf else None self.pdf_pages = None self.rows = [] def save(self, fig, name, family, note=""): from matplotlib.backends.backend_pdf import PdfPages import matplotlib.pyplot as plt paths = [] for fmt in self.formats: fmt_dir = self.out_dir / fmt fmt_dir.mkdir(parents=True, exist_ok=True) path = fmt_dir / ("%s.%s" % (name, fmt)) fig.savefig(path, transparent=True, bbox_inches="tight") paths.append(str(path)) if self.combined_pdf: self.combined_pdf.parent.mkdir(parents=True, exist_ok=True) if self.pdf_pages is None: self.pdf_pages = PdfPages(self.combined_pdf) self.pdf_pages.savefig(fig, transparent=True, bbox_inches="tight") plt.close(fig) self.rows.append({ "family": family, "figure": name, "status": "generated", "paths": ";".join(paths), "note": note, "missing": "", }) def skip(self, family, figure, missing, note): if isinstance(missing, (list, tuple)): missing = ";".join(str(item) for item in missing) self.rows.append({ "family": family, "figure": figure, "status": "skipped", "paths": "", "note": note, "missing": str(missing), }) def fail(self, family, figure, note): self.rows.append({ "family": family, "figure": figure, "status": "failed", "paths": "", "note": note, "missing": "", }) def close(self): if self.pdf_pages is not None: self.pdf_pages.close() def _parse_formats(value): formats = tuple(part.strip().lower() for part in value.split(",")) if not formats or any(not fmt for fmt in formats): raise ValueError("--formats contains an empty format") allowed = {"svg", "pdf", "png"} unknown = set(formats) - allowed if unknown: raise ValueError( "Unsupported figure formats: %s. Allowed: %s" % ( ", ".join(sorted(unknown)), ", ".join(sorted(allowed)))) duplicates = sorted({fmt for fmt in formats if formats.count(fmt) > 1}) if duplicates: raise ValueError("Duplicate figure formats: %s" % ( ", ".join(duplicates))) return formats def _parse_predictor_config(args): candidate = args.candidate_predictor.strip() if not candidate: raise ValueError("--candidate-predictor must be non-empty") presentation_panel_predictors = _parse_predictor_list( args.presentation_panel_predictors) if not presentation_panel_predictors: raise ValueError( "--presentation-panel-predictors must contain at least one " "predictor") presentation_panel_baselines = _parse_predictor_list( args.presentation_panel_baselines) if not presentation_panel_baselines: raise ValueError( "--presentation-panel-baselines must contain at least one " "predictor") return PredictorConfig( candidate=candidate, external_baselines=_parse_external_baselines(args.external_baselines), preferred_predictors=_parse_predictor_list(args.preferred_predictors), monoallelic_panel_predictors=_parse_predictor_list( args.monoallelic_panel_predictors), presentation_panel_predictors=presentation_panel_predictors, presentation_panel_baselines=presentation_panel_baselines, ) def _parse_predictor_list(value): return tuple(part.strip() for part in value.split(",") if part.strip()) def _parse_external_baselines(value): result = [] for part in _parse_predictor_list(value): if ":" in part: predictor, suffix = part.split(":", 1) else: predictor = part suffix = part.rsplit(".", 1)[-1] predictor = predictor.strip() suffix = suffix.strip() if predictor: result.append((predictor, suffix)) if not result: raise ValueError("--external-baselines must contain at least one predictor") return tuple(result) def _combined_pdf_path(value, out_dir): if value == "none": return None if value: return value return str(Path(out_dir) / "paper_figures.pdf") def _validate_paper_output_paths(out_dir, combined_pdf): """Reject output aliases that overwrite command metadata or directories.""" out_dir = Path(out_dir).resolve() if out_dir.exists() and not out_dir.is_dir(): raise SystemExit("Paper-figure --out must be a directory: %s" % out_dir) if combined_pdf is None: return combined_pdf = Path(combined_pdf).resolve() reserved = { out_dir, (out_dir / "manifest.csv").resolve(), (out_dir / "missing_inputs.md").resolve(), } reserved.update((out_dir / fmt).resolve() for fmt in DEFAULT_FORMATS) reserved.add((out_dir / "assets").resolve()) command_owned_dirs = [ (out_dir / name).resolve() for name in (*DEFAULT_FORMATS, "assets") ] if combined_pdf in reserved or any( _path_is_within(combined_pdf, directory) for directory in command_owned_dirs): raise SystemExit( "--combined-pdf collides with a command-owned directory or " "metadata path: %s" % combined_pdf ) def _clear_paper_figure_outputs(out_dir, combined_pdf): """Remove outputs owned by this command before a clean rerender.""" out_dir = Path(out_dir) if out_dir.is_dir(): for name in (*DEFAULT_FORMATS, "assets"): path = out_dir / name if path.is_dir() and not path.is_symlink(): shutil.rmtree(path) elif path.exists() or path.is_symlink(): path.unlink() for path in out_dir.glob("*.pdf"): path.unlink() for name in ("manifest.csv", "missing_inputs.md"): path = out_dir / name if path.exists() or path.is_symlink(): path.unlink() if combined_pdf is not None: combined_pdf = Path(combined_pdf) if combined_pdf.exists() or combined_pdf.is_symlink(): combined_pdf.unlink() def _paper_figure_cleanup_input_conflicts( args, inputs, out_dir, combined_pdf): """Return inputs that command-owned cleanup would remove.""" out_dir = Path(out_dir).resolve() cleanup_dirs = [ (out_dir / name).resolve() for name in (*DEFAULT_FORMATS, "assets") ] cleanup_files = { (out_dir / name).resolve() for name in ("manifest.csv", "missing_inputs.md") } if combined_pdf is not None: cleanup_files.add(Path(combined_pdf).resolve()) input_dirs = [ path for path in ( inputs.scores_dir, inputs.comparison_dir, inputs.run_dir, ) if path is not None ] input_files = [ path for path in ( inputs.multiallelic_predictions, inputs.monoallelic_predictions, Path(args.sample_table) if args.sample_table else None, ) if path is not None ] conflicts = [] for path in input_dirs: resolved = Path(path).resolve() if resolved == out_dir or any( _path_is_within(resolved, directory) for directory in cleanup_dirs): conflicts.append(resolved) for path in input_files: resolved = Path(path).resolve() if ( resolved in cleanup_files or any(_path_is_within(resolved, directory) for directory in cleanup_dirs) or (resolved.parent == out_dir and resolved.suffix == ".pdf")): conflicts.append(resolved) return tuple(dict.fromkeys(conflicts)) def _path_is_within(path, directory): try: path.relative_to(directory) return True except ValueError: return False def _resolve_figure_inputs(args, writer): scores_value = args.scores_dir or args.artifacts_dir comparison_dir = _resolve_comparison_dir( args.comparison_dir, Path(scores_value) if scores_value else None, ) multiallelic_predictions = ( Path(args.multiallelic_predictions) if args.multiallelic_predictions else None ) monoallelic_predictions = ( Path(args.monoallelic_predictions) if args.monoallelic_predictions else None ) if scores_value: scores_dir = Path(scores_value) elif multiallelic_predictions: scores_dir = multiallelic_predictions.parent elif monoallelic_predictions: scores_dir = monoallelic_predictions.parent elif comparison_dir is not None: scores_dir = comparison_dir else: writer.fail( "configuration", "inputs", ( "Specify --scores-dir, --artifacts-dir, --comparison-dir, " "--multiallelic-predictions, or --monoallelic-predictions." ), ) return None if multiallelic_predictions is None: default_path = scores_dir / "benchmark.multiallelic.csv.bz2" if default_path.is_file(): multiallelic_predictions = default_path if monoallelic_predictions is None: for name in ( "benchmark.monoallelic.csv.bz2", "benchmark.monoallelic.train_excluded.csv.bz2"): default_path = scores_dir / name if default_path.is_file(): monoallelic_predictions = default_path break return FigureInputs( scores_dir=scores_dir, comparison_dir=comparison_dir, run_dir=_resolve_run_dir(comparison_dir), multiallelic_predictions=multiallelic_predictions, monoallelic_predictions=monoallelic_predictions, ) def _resolve_comparison_dir(value, scores_dir): if value: return Path(value) if ( scores_dir is not None and (scores_dir / "release_summary.csv").is_file() and (scores_dir / "side_a.json").is_file() and (scores_dir / "side_b.json").is_file()): return scores_dir return None def _resolve_run_dir(comparison_dir): if comparison_dir is None: return None comparison_dir = Path(comparison_dir) if comparison_dir.name == "eval_comparison": return comparison_dir.parent parent = comparison_dir.parent if any( (parent / name).exists() for name in ("affinity", "processing", "presentation")): return parent return None def _current_affinity_per_allele(comparison_dir): if comparison_dir is None: return None path = Path(comparison_dir) / "affinity" / "per_allele.csv" if not path.is_file(): return None df = pandas.read_csv(path) required = { "allele", "n", "n_pos", "a_roc_auc", "b_roc_auc", "a_ppv_at_n", "b_ppv_at_n", } if not required.issubset(df.columns): return None return df def _comparison_labels(comparison_dir): result = {"a": "Side A", "b": "Side B"} if comparison_dir is None: return result for side in ("a", "b"): path = Path(comparison_dir) / ("side_%s.json" % side) if not path.is_file(): continue try: with open(path) as fd: loaded = json.load(fd) label = loaded.get("label") if label: result[side] = str(label) except (OSError, ValueError, TypeError): pass return result def _read_predictor_info(path, writer): if not path.is_file(): writer.skip( "metadata", "predictor_info", [path], "Predictor labels/colors unavailable; using fallback labels.") return pandas.DataFrame(columns=[ "predictor", "description", "primary", "color", "short", "detail"]) df = pandas.read_csv(path) if "predictor" not in df.columns: writer.skip( "metadata", "predictor_info", [path], "predictor_info.csv lacks a predictor column; using fallback labels.") return pandas.DataFrame(columns=[ "predictor", "description", "primary", "color", "short", "detail"]) return df.set_index("predictor", drop=False) def _coerce_optional_bool(value): if isinstance(value, bool): return value if pandas.isnull(value): return None text = str(value).strip().lower() if text in ("1", "true", "yes", "y", "on"): return True if text in ("0", "false", "no", "n", "off"): return False return None def _predictor_orientations(predictor_info): result = dict(DEFAULT_PREDICTOR_HIGHER_IS_BETTER) if ( predictor_info is not None and not predictor_info.empty and "higher_is_better" in predictor_info.columns): for predictor, row in predictor_info.iterrows(): if "predictor" in predictor_info.columns: predictor = row.get("predictor", predictor) value = _coerce_optional_bool(row.get("higher_is_better")) if value is None: continue result[str(predictor)] = value normalized = _normalize_predictor_name(predictor) result[normalized] = value return result def _read_sample_group_ids(args, inputs, writer): artifacts_dir = inputs.scores_dir path = Path(args.sample_table) if args.sample_table else ( artifacts_dir / "sample_table.csv") if not path.is_file(): benchmark_paths = [] if inputs.multiallelic_predictions is not None: benchmark_paths.append(Path(inputs.multiallelic_predictions)) benchmark_paths.extend([ artifacts_dir / "benchmark.multiallelic.csv.bz2", artifacts_dir / "benchmark.multiallelic.csv", ]) seen = set() for benchmark_path in benchmark_paths: if benchmark_path in seen: continue seen.add(benchmark_path) if not benchmark_path.is_file(): continue try: df = pandas.read_csv( benchmark_path, usecols=["sample_id", "sample_group"]) result = set(df.loc[ df["sample_group"] == args.sample_group, "sample_id", ]) if result: return result except (OSError, ValueError): pass writer.skip( "sample-groups", args.sample_group, [path] + benchmark_paths, "Sample-group table absent; recent-only panels use all samples.") return None df = pandas.read_csv(path) sample_col = _first_present(df, ("sample_id", "sample", "id")) group_col = _first_present(df, ("sample_group", "group", "category")) if sample_col is None or group_col is None: writer.skip( "sample-groups", args.sample_group, [path], "Sample table must contain sample_id and sample_group columns.") return None result = set(df.loc[df[group_col] == args.sample_group, sample_col]) if not result: writer.skip( "sample-groups", args.sample_group, [path], "No rows found for sample group %s." % args.sample_group) return None return result def _read_multiallelic_scores(inputs, writer, figure, predictors, predictor_info): path = inputs.scores_dir / "accuracy_scores.multiallelic.csv" if path.is_file(): return _normalize_score_predictors(pandas.read_csv(path)) if inputs.multiallelic_predictions is not None: return _scores_from_saved_predictions( inputs.multiallelic_predictions, index_column="sample_id", kind="multiallelic", family="multiallelic", figure=figure, writer=writer, predictor_orientations=_predictor_orientations(predictor_info), declared_predictors=_predictor_info_names(predictor_info), external_baselines=predictors.external_baselines, ) writer.skip( "multiallelic", figure, [path, inputs.scores_dir / "benchmark.multiallelic.csv.bz2"], "Multiallelic score table or saved prediction table is required.", ) return None def _read_monoallelic_scores(inputs, writer, figure, predictors, predictor_info): path = inputs.scores_dir / "accuracy_scores.monoallelic.csv" if path.is_file(): return _normalize_score_predictors(pandas.read_csv(path)) if inputs.monoallelic_predictions is not None: return _scores_from_saved_predictions( inputs.monoallelic_predictions, index_column=None, kind="monoallelic", family="monoallelic", figure=figure, writer=writer, predictor_orientations=_predictor_orientations(predictor_info), declared_predictors=_predictor_info_names(predictor_info), external_baselines=predictors.external_baselines, ) return None def _scores_from_saved_predictions( path, index_column, family, figure, writer, row_filter=None, kind=None, predictor_orientations=None, predictor_columns=None, declared_predictors=(), external_baselines=EXTERNAL_BASELINES): path = Path(path) if not path.is_file(): writer.skip( family, figure, [path], "Saved prediction table is absent.") return None df = pandas.read_csv(path) if row_filter is not None: df = row_filter(df) if "hit" not in df.columns: writer.skip( family, figure, [path], "Saved prediction table must contain a hit column.") return None hit = pandas.to_numeric(df["hit"], errors="coerce") invalid_hit = ~hit.isin([0, 1]) if invalid_hit.any(): writer.skip( family, figure, [path], "Saved prediction table contains %d non-binary or missing hit " "value(s); expected only 0 and 1." % int(invalid_hit.sum())) return None df["hit"] = hit.astype(int) index_column = index_column or _prediction_index_column(df, kind=kind) if index_column is None: writer.skip( family, figure, [path], "Saved prediction table needs sample_id, allele, or hla column.") return None if "length" not in df.columns: if "peptide_len" in df.columns: df["length"] = df["peptide_len"] elif "peptide" in df.columns: df["length"] = df["peptide"].astype(str).str.len() else: df["length"] = numpy.nan try: predictor_columns = _prediction_score_columns( df, predictor_columns=predictor_columns, declared_predictors=declared_predictors, ) except ValueError as error: writer.skip(family, figure, [path], str(error)) return None if not predictor_columns: writer.skip( family, figure, [path], ( "Saved prediction table has no recognized predictor score " "columns. Use canonical score names, declare custom columns " "and their direction in predictor_info.csv, or explicitly " "select declared columns with --predictor-columns." )) return None predictor_orientations = ( predictor_orientations if predictor_orientations is not None else _predictor_orientations(None) ) unknown_orientation = [ predictor for predictor in predictor_columns if ( predictor not in predictor_orientations and _normalize_predictor_name(predictor) not in predictor_orientations ) ] if unknown_orientation: writer.skip( family, figure, unknown_orientation, ( "Saved prediction table has predictor columns without score " "orientation. Add higher_is_better true/false rows to " "predictor_info.csv." )) return None rows = [] for group_value, group in df.groupby(index_column): rows.extend(_scores_for_prediction_group( group, index_column, group_value, None, "All", predictor_columns, predictor_orientations=predictor_orientations)) for length, length_group in group.groupby("length"): if pandas.isnull(length): continue length = int(length) rows.extend(_scores_for_prediction_group( length_group, index_column, group_value, length, "%d-mer" % length, predictor_columns, predictor_orientations=predictor_orientations, )) scores = pandas.DataFrame(rows) if scores.empty: writer.skip( family, figure, [path], "Saved prediction table produced no evaluable score rows.") return None scores = _normalize_score_predictors(scores) return _add_percent_change_columns(scores, external_baselines) class _ScoreTableErrorCollector: def __init__(self): self.message = None def skip(self, family, figure, missing, note): self.message = note def score_saved_prediction_table( path, index_column=None, kind=None, predictor_info=None, external_baselines=EXTERNAL_BASELINES, predictor_columns=None): """Return notebook-style AUC/PPV rows from a saved prediction table. The input table must contain ``hit`` and one grouping column (``sample_id``, ``allele``, or ``hla`` unless ``index_column`` is passed). Canonical score columns are selected from the built-in predictor registry. Custom columns must be declared in a ``predictor_info`` DataFrame with ``predictor`` and ``higher_is_better`` columns. ``predictor_columns`` can explicitly restrict selection to canonical or declared columns. Numeric metadata is never inferred to be a predictor score. When ``kind="monoallelic"``, allele identifiers are preferred over ``sample_id`` for automatic grouping. """ writer = _ScoreTableErrorCollector() scores = _scores_from_saved_predictions( path, index_column=index_column, family="score-predictions", figure="score-predictions", writer=writer, kind=kind, predictor_orientations=_predictor_orientations(predictor_info), predictor_columns=predictor_columns, declared_predictors=_predictor_info_names(predictor_info), external_baselines=external_baselines, ) if scores is None: raise ValueError(writer.message or "No evaluable score rows.") return scores def _prediction_index_column(df, kind=None): if kind == "monoallelic": columns = ("allele", "hla", "sample_id") else: columns = ("sample_id", "allele", "hla") for column in columns: if column in df.columns: return column return None def _predictor_info_names(predictor_info): if predictor_info is None or predictor_info.empty: return () if "predictor" in predictor_info.columns: values = predictor_info["predictor"] else: values = predictor_info.index return tuple(str(value) for value in values if not pandas.isnull(value)) def _prediction_score_columns( df, predictor_columns=None, declared_predictors=()): """Select score columns from the canonical or explicitly declared schema.""" if predictor_columns is None: expected = set(DEFAULT_PREDICTOR_HIGHER_IS_BETTER) expected.update(str(value) for value in declared_predictors) selected = [column for column in df.columns if column in expected] else: selected = list(dict.fromkeys(str(value) for value in predictor_columns)) if not selected: raise ValueError("--predictor-columns must contain at least one column.") missing = [column for column in selected if column not in df.columns] if missing: raise ValueError( "Requested predictor score column(s) are absent: %s." % ", ".join(missing) ) result = [] nonnumeric = [] for column in selected: values = pandas.to_numeric(df[column], errors="coerce") if values.notnull().any(): df[column] = values result.append(column) else: nonnumeric.append(column) if nonnumeric: raise ValueError( "Predictor score column(s) contain no numeric values: %s." % ", ".join(nonnumeric) ) return result def _scores_for_prediction_group( group, index_column, group_value, length, length_label, predictor_columns, predictor_orientations=None): from sklearn.metrics import average_precision_score, roc_auc_score labels = pandas.to_numeric(group["hit"], errors="coerce") valid_labels = labels.isin([0, 1]) group = group.loc[valid_labels].copy() y_true = labels.loc[valid_labels].astype(int).values tie_breaker = _prediction_tie_breaker(group) oriented_scores = {} shared_mask = numpy.ones(len(group), dtype=bool) for predictor in predictor_columns: score = pandas.to_numeric(group[predictor], errors="coerce").values score = _orient_prediction_score( predictor, score, predictor_orientations) oriented_scores[predictor] = score shared_mask &= numpy.isfinite(score) # Every predictor in a comparison must be evaluated on the same examples. # Otherwise an external predictor can improve its apparent AUC/PPV merely # by omitting unsupported or difficult rows. y = y_true[shared_mask] ties = tie_breaker[shared_mask] rows = [] for predictor in predictor_columns: s = oriented_scores[predictor][shared_mask] if len(y) == 0 or y.sum() == 0 or y.sum() == len(y): auc = numpy.nan pr_auc = numpy.nan ppv = numpy.nan else: auc = float(roc_auc_score(y, s)) pr_auc = float(average_precision_score(y, s)) ppv = _ppv_at_n(y, s, int(y.sum()), tie_breaker=ties) rows.append({ index_column: group_value, "sample_id": group_value, "length": length, "length_label": length_label, "predictor": predictor, "n": int(len(y)), "n_pos": int(y.sum()), "ppv": ppv, "auc": auc, "pr_auc": pr_auc, }) return rows def _prediction_tie_breaker(group): identity_columns = [ column for column in ( "sample_id", "allele", "hla", "peptide", "n_flank", "c_flank", "length", "peptide_len") if column in group.columns ] if identity_columns: values = pandas.util.hash_pandas_object( group[identity_columns].astype(str), index=False).values return values.astype("float64") / float(numpy.iinfo("uint64").max) return numpy.random.default_rng(0).random(len(group)) def _orient_prediction_score(predictor, score, predictor_orientations=None): score = numpy.asarray(score, dtype=float) if predictor_orientations is None: predictor_orientations = _predictor_orientations(None) candidates = [str(predictor), _normalize_predictor_name(predictor)] for candidate in candidates: if candidate in predictor_orientations: if predictor_orientations[candidate]: return score return -score raise ValueError( "No score orientation configured for predictor %s. Add it to " "predictor_info.csv with higher_is_better true/false." % predictor) def _ppv_at_n(y_true, y_score, n, tie_breaker=None): if n <= 0: return numpy.nan y_score = numpy.asarray(y_score, dtype=float) if tie_breaker is None: tie_breaker = numpy.zeros(len(y_score)) tie_breaker = numpy.asarray(tie_breaker, dtype=float) order = numpy.lexsort((tie_breaker, -y_score)) top = order[:n] return float(numpy.asarray(y_true)[top].sum()) / float(n) def _add_percent_change_columns(scores, external_baselines=EXTERNAL_BASELINES): result = scores.copy() for metric in ("auc", "pr_auc", "ppv"): if metric not in result: continue pivot = result.pivot_table( index=["sample_id", "length_label"], columns="predictor", values=metric, aggfunc="mean", ) for baseline, suffix in external_baselines: if baseline not in pivot.columns: continue baseline_values = pivot[baseline].replace(0, numpy.nan) percent = pivot.subtract(baseline_values, axis=0).divide( baseline_values, axis=0) * 100.0 column = "percent_change_%s_%s" % (metric, suffix) stacked = percent.reset_index().melt( id_vars=["sample_id", "length_label"], var_name="predictor", value_name=column, ) result = result.merge( stacked, on=["sample_id", "length_label", "predictor"], how="left", ) return result def _first_present(df, names): for name in names: if name in df.columns: return name return None def _external_baselines_in_predictors(predictors, available_predictors): available = set(available_predictors) return tuple( (predictor, suffix) for predictor, suffix in predictors.external_baselines if predictor in available ) def _external_baselines_with_percent_change(predictors, columns, metric): columns = set(columns) return tuple( (predictor, suffix) for predictor, suffix in predictors.external_baselines if "percent_change_%s_%s" % (metric, suffix) in columns ) def _generate_multiallelic_figures( inputs, predictor_info, recent_sample_ids, sample_group, max_scatter_points, writer, predictors): scores = _read_multiallelic_scores( inputs, writer, "all", predictors, predictor_info) if scores is None: return required = { "sample_id", "length_label", "predictor", "auc", "ppv", } missing = sorted(required - set(scores.columns)) if missing: writer.skip( "multiallelic", "all", [inputs.scores_dir / "accuracy_scores.multiallelic.csv"], "Missing required columns: %s" % ", ".join(missing)) return recent_note = ( "Sample table not supplied; using all samples instead of %s." % sample_group if recent_sample_ids is None else "Restricted to sample group %s." % sample_group ) _plot_external_scatter_triptych( scores, predictor_info, "auc", "AUC", "fig.3_scores_plots_multiallelic.scatter.auc.ba", max_scatter_points, writer, predictors) _plot_external_scatter_triptych( scores, predictor_info, "ppv", "PPV", "fig.3_scores_plots_multiallelic.scatter.ppv.ba", max_scatter_points, writer, predictors) _plot_percent_change_by_length( scores, predictor_info, "auc", "AUC", "fig.3_scores_plots_multiallelic.bar_by_peptide_length.auc.ba", writer, predictors) _plot_percent_change_bars( scores, predictor_info, "auc", "AUC", "fig.3_scores_plots_multiallelic.bar.auc.presentation", writer, predictors) _plot_percent_change_bars( scores, predictor_info, "ppv", "PPV", "fig.3_scores_plots_multiallelic.bar.ppv.presentation", writer, predictors) _plot_mean_ppv_small( scores, predictor_info, recent_sample_ids, recent_note, "fig.3_scores_plots_multiallelic.mean_ppv_small_plot", writer, predictors) _plot_presentation_scatter_grid( scores, predictor_info, recent_sample_ids, recent_note, max_scatter_points, "fig.3_scores_plots_multiallelic.scatter.ppv.presentation", writer, predictors) _plot_graphical_abstract_logistic_regression( predictor_info, "fig.3_scores_plots_multiallelic.graphical_abstract_logistic_regression", writer, predictors) def _plot_external_scatter_triptych( scores, predictor_info, metric, metric_label, name, max_points, writer, predictors): import matplotlib.pyplot as plt candidate = predictors.candidate pivot = _pivot_all_lengths(scores, metric) if candidate not in pivot.columns: writer.skip( "multiallelic", name, [candidate], "Candidate predictor absent from multiallelic scores.") return baselines = _external_baselines_in_predictors( predictors, pivot.columns) if not baselines: writer.skip( "multiallelic", name, [predictor for predictor, _ in predictors.external_baselines], "No external baseline predictors found in multiallelic scores.") return n_cols = len(baselines) fig, axes = plt.subplots( 1, n_cols, figsize=(max(2.4, 2.35 * n_cols), 2.2), squeeze=False) y_label = _short_label(predictor_info, candidate) for ax, (baseline, _suffix) in zip(axes[0], baselines): sub = pivot[[baseline, candidate]].replace( [numpy.inf, -numpy.inf], numpy.nan).dropna() _scatter_with_winner_colors( ax, sub[baseline].values, sub[candidate].values, baseline, candidate, predictor_info, max_points) _finish_metric_scatter( ax, _short_label(predictor_info, baseline), y_label, "%s vs %s" % ( y_label, _short_label(predictor_info, baseline)), metric_label) fig.tight_layout(w_pad=1.0) writer.save(fig, name, "multiallelic") def _plot_percent_change_by_length( scores, predictor_info, metric, metric_label, name, writer, predictors): import matplotlib.pyplot as plt predictor = predictors.candidate sub = scores.loc[scores["predictor"] == predictor].copy() if sub.empty: writer.skip( "multiallelic", name, [predictor], "MHCflurry production scores absent.") return baselines = _external_baselines_with_percent_change( predictors, sub.columns, metric) if not baselines: writer.skip( "multiallelic", name, [ "percent_change_%s_%s" % (metric, suffix) for _predictor, suffix in predictors.external_baselines ], "No percent-change columns found for external baselines.") return plot_specs = [] for baseline, suffix in baselines: column = "percent_change_%s_%s" % (metric, suffix) if column not in sub.columns: continue plot_df = ( sub[["length_label", column]] .replace([numpy.inf, -numpy.inf], numpy.nan) .dropna() ) values = ( plot_df.groupby("length_label")[column] .mean() .reindex(LENGTH_LABEL_ORDER) .dropna() ) if not values.empty: plot_specs.append((baseline, values)) if not plot_specs: writer.skip( "multiallelic", name, [ "percent_change_%s_%s" % (metric, suffix) for _baseline, suffix in baselines ], "No finite per-length percent-change values were available.", ) return n_cols = len(plot_specs) fig, axes = plt.subplots( 1, n_cols, figsize=(max(2.4, 2.35 * n_cols), 2.1), sharey=True, squeeze=False) color = _predictor_color(predictor_info, predictor) finite_values = numpy.concatenate([ values.to_numpy(dtype=float) for _baseline, values in plot_specs ]) y_min = float(finite_values.min()) y_max = float(finite_values.max()) y_pad = max((y_max - y_min) * 0.05, abs(y_max) * 0.05, 1.0) for ax, (baseline, values) in zip(axes[0], plot_specs): x = numpy.arange(len(values)) ax.bar(x, values.values, color=color, edgecolor="white", linewidth=0.6) ax.axhline(0, color="0.35", linewidth=0.8) ax.set_xticks(x) ax.set_xticklabels(values.index, rotation=30, ha="right") ax.set_title("vs %s" % _short_label(predictor_info, baseline)) ax.set_ylabel("%% change in %s" % metric_label) ax.set_ylim(y_min - y_pad, y_max + y_pad) _despine(ax) fig.tight_layout(w_pad=1.0) writer.save(fig, name, "multiallelic") def _plot_percent_change_bars( scores, predictor_info, metric, metric_label, name, writer, predictors): import matplotlib.pyplot as plt sub = _all_length_rows(scores) selected_predictors = [ predictor for predictor in predictors.preferred_predictors if predictor in set(sub["predictor"]) ] if not selected_predictors: writer.skip( "multiallelic", name, list(predictors.preferred_predictors), "No preferred predictors found in multiallelic scores.") return baselines = _external_baselines_with_percent_change( predictors, sub.columns, metric) if not baselines: writer.skip( "multiallelic", name, [ "percent_change_%s_%s" % (metric, suffix) for _predictor, suffix in predictors.external_baselines ], "No percent-change columns found for external baselines.") return n_cols = len(baselines) fig, axes = plt.subplots( 1, n_cols, figsize=(max(2.4, 2.35 * n_cols), 3.3), sharey=True, squeeze=False) for ax, (baseline, suffix) in zip(axes[0], baselines): column = "percent_change_%s_%s" % (metric, suffix) if column not in sub.columns: ax.set_visible(False) continue means = ( sub.loc[ sub["predictor"].isin(selected_predictors), ["predictor", column], ] .replace([numpy.inf, -numpy.inf], numpy.nan) .dropna() .groupby("predictor")[column] .mean() .reindex(selected_predictors) .dropna() ) labels = [_short_label(predictor_info, item) for item in means.index] colors = [_predictor_color(predictor_info, item) for item in means.index] y = numpy.arange(len(means)) ax.barh(y, means.values, color=colors, edgecolor="white", linewidth=0.6) ax.axvline(0, color="0.35", linewidth=0.8) ax.set_yticks(y) ax.set_yticklabels(labels) ax.invert_yaxis() ax.set_title("vs %s" % _short_label(predictor_info, baseline)) ax.set_xlabel("%% change in %s" % metric_label) _despine(ax) fig.tight_layout(w_pad=1.0) writer.save(fig, name, "multiallelic") def _plot_mean_ppv_small( scores, predictor_info, recent_sample_ids, note, name, writer, predictors): import matplotlib.pyplot as plt sub = _all_length_rows(scores) if recent_sample_ids is not None: sub = sub.loc[sub["sample_id"].isin(recent_sample_ids)] candidates = [ predictors.candidate, "presentation_with_flanks_processing_score", "presentation_with_flanks_presentation_score", ] rows = [] for predictor in candidates: values = sub.loc[sub["predictor"] == predictor, "ppv"].replace( [numpy.inf, -numpy.inf], numpy.nan).dropna() if len(values): rows.append((predictor, values.mean(), _predictor_color( predictor_info, predictor))) external_baselines = _external_baselines_in_predictors( predictors, sub["predictor"]) external_means = ( sub.loc[sub["predictor"].isin([p for p, _ in external_baselines])] .assign( ppv=lambda df: df["ppv"].replace( [numpy.inf, -numpy.inf], numpy.nan)) .groupby("predictor")["ppv"] .mean() .dropna() ) if len(external_means): rows.append(("external_tools", external_means.mean(), (0.45, 0.45, 0.45))) if not rows: writer.skip( "multiallelic", name, candidates, "No PPV values available for selected predictors.") return labels = [ "External tools" if predictor == "external_tools" else _short_label(predictor_info, predictor) for predictor, _mean, _color in rows ] values = [mean for _predictor, mean, _color in rows] colors = [color for _predictor, _mean, color in rows] fig, ax = plt.subplots(figsize=(3.2, 2.2)) x = numpy.arange(len(values)) ax.bar(x, values, color=colors, edgecolor="white", linewidth=0.6) ax.set_xticks(x) ax.set_xticklabels(labels, rotation=25, ha="right") ax.set_ylabel("Mean PPV") ax.set_ylim(0, max(values) * 1.2 if values else 1.0) _despine(ax) fig.tight_layout() writer.save(fig, name, "multiallelic", note=note) def _plot_presentation_scatter_grid( scores, predictor_info, recent_sample_ids, note, max_points, name, writer, predictors): import matplotlib.pyplot as plt pivot = _pivot_all_lengths(scores, "ppv") if recent_sample_ids is not None: pivot = pivot.loc[pivot.index.isin(recent_sample_ids)] candidate_predictors = [ predictor for predictor in predictors.presentation_panel_predictors if predictor in pivot.columns ] baseline_predictors = [ predictor for predictor in predictors.presentation_panel_baselines if predictor in pivot.columns ] if not candidate_predictors or not baseline_predictors: writer.skip( "multiallelic", name, ( list(predictors.presentation_panel_predictors) + list(predictors.presentation_panel_baselines) ), "Required presentation-panel predictors absent.") return n_rows = len(candidate_predictors) n_cols = len(baseline_predictors) fig, axes = plt.subplots( n_rows, n_cols, figsize=(max(2.0, 1.8 * n_cols), max(2.0, 1.95 * n_rows)), squeeze=False, ) for row_index, candidate in enumerate(candidate_predictors): for col_index, baseline in enumerate(baseline_predictors): ax = axes[row_index, col_index] sub = pivot[[baseline, candidate]].replace( [numpy.inf, -numpy.inf], numpy.nan).dropna() _scatter_with_winner_colors( ax, sub[baseline].values, sub[candidate].values, baseline, candidate, predictor_info, max_points) ax.set_title(_short_label(predictor_info, baseline)) if col_index == 0: ax.set_ylabel(_short_label(predictor_info, candidate)) else: ax.set_ylabel("") if row_index == len(candidate_predictors) - 1: ax.set_xlabel("Baseline PPV") else: ax.set_xlabel("") _set_unit_limits(ax) _despine(ax) fig.tight_layout(w_pad=0.9, h_pad=0.9) writer.save(fig, name, "multiallelic", note=note) def _plot_graphical_abstract_logistic_regression( predictor_info, name, writer, predictors): import matplotlib.pyplot as plt x = numpy.linspace(-5.0, 5.0, 200) y = 1.0 / (1.0 + numpy.exp(-x)) ba_color = _predictor_color(predictor_info, predictors.candidate) ap_color = _predictor_color( predictor_info, "presentation_with_flanks_processing_score") ps_color = _predictor_color( predictor_info, "presentation_with_flanks_presentation_score") fig, ax = plt.subplots(figsize=(3.0, 2.2)) ax.plot(x, y, color=ps_color, linewidth=2.0) ax.fill_between(x, 0, y, color=ps_color, alpha=0.12, linewidth=0) ax.scatter([-2.7, -0.7, 1.8], [0.06, 0.34, 0.86], color=[ba_color, ap_color, ps_color], s=38, edgecolor="white", linewidth=0.5, zorder=3) ax.set_xlabel("Combined affinity + processing evidence") ax.set_ylabel("Presentation probability") ax.set_xticks([]) ax.set_yticks([0, 0.5, 1.0]) ax.set_ylim(-0.02, 1.02) _despine(ax) fig.tight_layout() writer.save(fig, name, "multiallelic") def _generate_model_selection_figures(inputs, writer): path = _first_existing( inputs.scores_dir, ("model_selection_accuracy.csv", "model_selection_accuracy.xlsx")) baseline_col = None score_label = "AUC" baseline_label = None count_label = "Training peptides" source_path = path if path is not None: df = ( pandas.read_excel(path) if path.suffix == ".xlsx" else pandas.read_csv(path) ) allele_col = _first_present(df, ("allele", "hla", "mhc_allele")) score_col = _first_present(df, ("auc", "AUC", "score", "accuracy")) count_col = _first_present( df, ("num_peptides", "peptides", "train_peptides", "train_count")) binder_col = _first_present( df, ("percent_binders", "binder_percent", "binders_percent")) else: per_allele = _current_affinity_per_allele(inputs.comparison_dir) if per_allele is None: writer.skip( "model-selection", "fig.1_model_selection_predictor_accuracy.scores.by_locus", [ inputs.scores_dir / "model_selection_accuracy.csv", inputs.scores_dir / "model_selection_accuracy.xlsx", ( Path(inputs.comparison_dir) / "affinity" / "per_allele.csv" if inputs.comparison_dir else "compare-models affinity/per_allele.csv" ), ], "No model-selection table or current affinity comparison table.") return labels = _comparison_labels(inputs.comparison_dir) df = per_allele.copy() df["percent_binders"] = ( pandas.to_numeric(df["n_pos"], errors="coerce") / pandas.to_numeric(df["n"], errors="coerce").replace(0, numpy.nan) * 100.0 ) allele_col = "allele" score_col = "a_roc_auc" baseline_col = "b_roc_auc" score_label = "%s AUROC" % labels["a"] baseline_label = "%s AUROC" % labels["b"] count_col = "n" count_label = "Evaluation peptides" binder_col = "percent_binders" source_path = ( Path(inputs.comparison_dir) / "affinity" / "per_allele.csv" if inputs.comparison_dir else None ) if allele_col is None or score_col is None: writer.skip( "model-selection", "fig.1_model_selection_predictor_accuracy.scores.by_locus", [source_path], "Table must contain allele and AUC/score columns.") return import matplotlib.pyplot as plt from matplotlib.ticker import NullFormatter df = df.copy() df["locus"] = df[allele_col].map(_allele_locus) optional_panels = [] if count_col: optional_panels.append( (count_col, count_label, (0.55, 0.55, 0.55), True)) if binder_col: optional_panels.append((binder_col, "% binders", (0.65, 0.39, 0.67), False)) for locus, label in ( ("HLA-A", "hla_a"), ("HLA-B", "hla_b"), ("HLA-C", "hla_c"), ("H2", "h2"), ("other", "other")): sub = df.loc[df["locus"] == locus].sort_values(score_col) if sub.empty: writer.skip( "model-selection", "fig.1_model_selection_predictor_accuracy.scores.%s" % label, [path], "No rows for locus %s." % locus) continue has_baseline = bool(baseline_col and baseline_col in sub.columns) figure_height = max( 2.1 if has_baseline else 1.7, 0.18 * len(sub) + (1.0 if has_baseline else 0.6), ) fig, axes = plt.subplots( 1, 1 + len(optional_panels), figsize=(7.1, figure_height), squeeze=False) ax = axes[0, 0] y = numpy.arange(len(sub)) legend_handles = None legend_labels = None if has_baseline: height = 0.36 ax.barh( y - height / 2, sub[score_col], height=height, color=_predictor_color( pandas.DataFrame(), "mhcflurry_production"), label=score_label, ) ax.barh( y + height / 2, sub[baseline_col], height=height, color=(0.55, 0.55, 0.55), label=baseline_label, ) legend_handles, legend_labels = ax.get_legend_handles_labels() else: ax.barh(y, sub[score_col], color=(0.34, 0.46, 0.75)) ax.set_yticks(y) ax.set_yticklabels(sub[allele_col]) ax.set_xlabel(score_label if not baseline_col else "AUROC") ax.set_title(locus) _despine(ax) for panel_index, (column, xlabel, color, log_scale) in enumerate( optional_panels, start=1): ax = axes[0, panel_index] ax.barh(y, sub[column], color=color) ax.set_yticks(y) ax.set_yticklabels([]) if log_scale: ax.set_xscale("log") ax.xaxis.set_minor_formatter(NullFormatter()) ax.set_xlabel(xlabel) _despine(ax) bottom_margin = 0.0 if legend_handles: bottom_margin = min(0.18, 0.4 / figure_height) fig.legend( legend_handles, legend_labels, frameon=False, loc="lower center", bbox_to_anchor=(0.5, 0.01), ncol=2, fontsize=7, ) fig.tight_layout(rect=(0, bottom_margin, 1, 1), w_pad=1.0) writer.save( fig, "fig.1_model_selection_predictor_accuracy.scores.%s" % label, "model-selection") def _generate_monoallelic_figures( inputs, predictor_info, max_scatter_points, writer, predictors): scores = _read_monoallelic_scores( inputs, writer, "fig.3_scores_plots_monoallelic.scatter.auc.monoallelic.ba", predictors, predictor_info, ) if scores is not None: _plot_monoallelic_metric_overview( scores, predictor_info, "fig.3_scores_plots_monoallelic.summary.all_predictors", writer, predictors) _plot_monoallelic_scatter( scores, predictor_info, "auc", "AUC", max_scatter_points, "fig.3_scores_plots_monoallelic.scatter.auc.monoallelic.ba", writer, predictors) _plot_monoallelic_scatter( scores, predictor_info, "pr_auc", "AUPRC", max_scatter_points, "fig.3_scores_plots_monoallelic.scatter.pr_auc.monoallelic.ba", writer, predictors) _plot_monoallelic_scatter( scores, predictor_info, "ppv", "PPV", max_scatter_points, "fig.3_scores_plots_monoallelic.scatter.ppv.monoallelic.ba", writer, predictors) else: _plot_current_affinity_scatter( inputs.comparison_dir, "roc_auc", "AUROC", "fig.3_scores_plots_monoallelic.scatter.auc.monoallelic.ba", writer, ) _plot_current_affinity_scatter( inputs.comparison_dir, "ppv_at_n", "PPV@N", "fig.3_scores_plots_monoallelic.scatter.ppv.monoallelic.ba", writer, ) novel_path = inputs.scores_dir / "accuracy_scores.monoallelic.novel_alleles.csv" if novel_path.is_file(): scores = _normalize_score_predictors(pandas.read_csv(novel_path)) _plot_monoallelic_scatter( scores, predictor_info, "auc", "AUC", max_scatter_points, "fig.3_scores_plots_monoallelic.scatter.auc.monoallelic.novel_alleles.ba", writer, predictors, preferred_candidate="no_additional_ms_similar") else: writer.skip( "monoallelic", "fig.3_scores_plots_monoallelic.scatter.auc.monoallelic.novel_alleles.ba", [novel_path], "Novel-allele monoallelic accuracy scores absent.") def _plot_current_affinity_scatter( comparison_dir, metric, metric_label, name, writer): import matplotlib.pyplot as plt per_allele = _current_affinity_per_allele(comparison_dir) if per_allele is None: writer.skip( "monoallelic", name, ["accuracy_scores.monoallelic.csv", "affinity/per_allele.csv"], "No monoallelic score table or current affinity comparison table.") return labels = _comparison_labels(comparison_dir) x_col = "b_%s" % metric y_col = "a_%s" % metric if x_col not in per_allele.columns or y_col not in per_allele.columns: writer.skip( "monoallelic", name, [comparison_dir], "Current affinity comparison lacks %s columns." % metric) return sub = per_allele[[x_col, y_col]].replace( [numpy.inf, -numpy.inf], numpy.nan).dropna() if sub.empty: writer.skip( "monoallelic", name, [comparison_dir], "Current affinity comparison has no finite %s values." % metric) return fig, ax = plt.subplots(figsize=(2.7, 2.5)) ax.scatter( sub[x_col], sub[y_col], c=[ SIDE_A_COLOR if y >= x else SIDE_B_COLOR for x, y in zip(sub[x_col], sub[y_col]) ], s=16, alpha=0.8, edgecolor="white", linewidth=0.2, ) _add_diagonal(ax, sub[x_col], sub[y_col]) ax.set_xlabel("%s %s" % (labels["b"], metric_label)) ax.set_ylabel("%s %s" % (labels["a"], metric_label)) ax.set_title("Allele-level %s" % metric_label) _set_unit_limits(ax) _despine(ax) fig.tight_layout() writer.save(fig, name, "monoallelic") def _plot_monoallelic_scatter( scores, predictor_info, metric, metric_label, max_points, name, writer, predictors, preferred_candidate="no_additional_ms"): scores = _all_length_rows(scores) if scores.empty: writer.skip( "monoallelic", name, ["All-length monoallelic scores"], "Monoallelic scores have no All-length rows.") return available = set(scores["predictor"]) if predictors.monoallelic_panel_predictors: candidates = list(predictors.monoallelic_panel_predictors) missing_candidates = [ predictor for predictor in candidates if predictor not in available ] else: candidates = [ preferred_candidate if preferred_candidate in available else predictors.candidate ] missing_candidates = [ candidate for candidate in candidates if candidate not in available ] if not candidates or missing_candidates: writer.skip( "monoallelic", name, missing_candidates or candidates, "Configured MHCflurry candidate predictors are absent.") return pivot = scores.pivot_table( index=_monoallelic_index_columns(scores), columns="predictor", values=metric, aggfunc="mean") baselines = _external_baselines_in_predictors( predictors, pivot.columns) if not baselines: writer.skip( "monoallelic", name, [predictor for predictor, _ in predictors.external_baselines], "No external baseline predictors found in monoallelic scores.") return pages = [ candidates[index:index + MONOALLELIC_PANEL_ROWS_PER_PAGE] for index in range(0, len(candidates), MONOALLELIC_PANEL_ROWS_PER_PAGE) ] for page_index, page_candidates in enumerate(pages, start=1): page_name = ( name if len(pages) == 1 else "%s.page_%02d" % (name, page_index) ) _plot_scatter_grid_from_pivot( pivot, predictor_info, page_candidates, metric_label, max_points, page_name, "monoallelic", writer, predictors, baselines=baselines) def _plot_monoallelic_metric_overview( scores, predictor_info, name, writer, predictors): """Plot macro allele-level metrics for all requested candidates/baselines.""" import matplotlib.pyplot as plt rows = _all_length_rows(scores) candidates = list(predictors.monoallelic_panel_predictors) if not candidates: candidates = [predictors.candidate] baselines = [ predictor for predictor, _suffix in predictors.external_baselines ] selected = list(dict.fromkeys(candidates + baselines)) selected = [ predictor for predictor in selected if predictor in set(rows["predictor"]) ] metrics = [ ("auc", "Macro AUROC"), ("pr_auc", "Macro AUPRC"), ("ppv", "Macro PPV@N"), ] metrics = [(column, label) for column, label in metrics if column in rows] if not selected or not metrics: writer.skip( "monoallelic", name, selected, "No configured predictors or monoallelic metrics were available.") return means = ( rows.loc[rows["predictor"].isin(selected)] .groupby("predictor")[[column for column, _label in metrics]] .mean() .reindex(selected) ) labels = [_short_label(predictor_info, predictor) for predictor in selected] colors = [_predictor_color(predictor_info, predictor) for predictor in selected] height = max(3.2, 0.28 * len(selected) + 1.0) fig, axes = plt.subplots( 1, len(metrics), figsize=(3.0 * len(metrics), height), sharey=True, squeeze=False) y = numpy.arange(len(selected)) for metric_index, (column, label) in enumerate(metrics): ax = axes[0, metric_index] values = means[column] ax.barh(y, values, color=colors, edgecolor="white", linewidth=0.5) ax.set_yticks(y) if metric_index == 0: ax.set_yticklabels(labels) else: ax.tick_params(axis="y", labelleft=False) ax.set_xlim(0.0, 1.0) ax.set_xlabel(label) for row_index, value in enumerate(values): if numpy.isfinite(value): inside = float(value) > 0.85 ax.text( float(value) - 0.008 if inside else float(value) + 0.008, row_index, "%.4f" % value, ha="right" if inside else "left", va="center", color="white" if inside else "black", fontsize=6, ) _despine(ax) axes[0, 0].invert_yaxis() fig.tight_layout(w_pad=1.0) writer.save(fig, name, "monoallelic") def _generate_processing_notebook_figures( inputs, predictor_info, writer, predictors): no_c_path = inputs.scores_dir / "accuracy_scores.multiallelic.no_C.csv" motif_path = inputs.scores_dir / "antigen_processing.motifs.xlsx" correlation_path = ( inputs.scores_dir / "correlation.processing_vs_affinity.sampled.csv.bz2" ) training_path = inputs.scores_dir / "train_data.ap.production.csv" # Historical no-C tables have no matching assignments/provenance. They # must not silently supply processing-performance claims in new reports. if _plot_current_ap_vs_summary(inputs, writer): writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.auc.ap.c_removed.scatter", [no_c_path], "Cysteine-removed score table absent; generated current AP summary only.") writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.auc.ap.c_removed.bar", [no_c_path], "Cysteine-removed score table absent; generated current AP summary only.") else: writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.auc.ap.c_removed.scatter", [no_c_path], "Cysteine-removed multiallelic benchmark scores absent.") writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.auc.ap.c_removed.bar", [no_c_path], "Cysteine-removed multiallelic benchmark scores absent.") writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.bar.ap_vs_others", [no_c_path], "AP-vs-other benchmark table absent.") if motif_path.is_file(): _plot_ap_motif_logo(motif_path, writer) elif _plot_ap_motif_from_training(inputs, writer): pass else: writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.logo.ap", [motif_path], "Antigen-processing motif workbook absent.") if correlation_path.is_file() and training_path.is_file(): _plot_ap_correlation_panels(correlation_path, training_path, writer) elif _plot_ap_correlation_from_saved_predictions(inputs, writer): pass else: writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.correlation.ap_by_gene", [correlation_path, training_path], "AP correlation and training-data tables absent.") writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.extended.ap_correlation", [correlation_path, training_path], "AP correlation and training-data tables absent.") writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.correlation.included_vs_excluded", [correlation_path, training_path], "AP correlation and training-data tables absent.") def _read_cysteine_removed_scores( inputs, no_c_path, writer, predictors, predictor_info): if no_c_path.is_file(): return _normalize_score_predictors(pandas.read_csv(no_c_path)) if inputs.multiallelic_predictions is None: return None return _scores_from_saved_predictions( inputs.multiallelic_predictions, index_column="sample_id", kind="multiallelic", family="antigen-processing", figure="fig.4_processing_predictor_plots.auc.ap.c_removed.scatter", writer=writer, predictor_orientations=_predictor_orientations(predictor_info), declared_predictors=_predictor_info_names(predictor_info), external_baselines=predictors.external_baselines, row_filter=lambda df: df.loc[ ~df.get("peptide", pandas.Series("", index=df.index)) .astype(str) .str.contains("C", na=False) ].copy(), ) def _plot_cysteine_removed_panels( inputs, no_c, predictor_info, writer, predictors): import matplotlib.pyplot as plt full = _read_multiallelic_scores( inputs, writer, "fig.4_processing_predictor_plots.auc.ap.c_removed.scatter", predictors, predictor_info, ) if full is None: writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.auc.ap.c_removed.scatter", [inputs.scores_dir / "accuracy_scores.multiallelic.csv"], "Full multiallelic benchmark scores absent.") return no_c = _normalize_score_predictors(no_c) predictor = "presentation_without_flanks_processing_score" full_pivot = _pivot_all_lengths(full, "auc") no_c_pivot = _pivot_all_lengths(no_c, "auc") if predictor not in full_pivot.columns or predictor not in no_c_pivot.columns: writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.auc.ap.c_removed.scatter", [predictor], "AP predictor absent from full or cysteine-removed benchmark.") return joined = pandas.DataFrame({ "full": full_pivot[predictor], "c_removed": no_c_pivot[predictor], }).dropna() fig, ax = plt.subplots(figsize=(2.5, 2.4)) ax.scatter(joined["full"], joined["c_removed"], color=_predictor_color(predictor_info, predictor), s=16, alpha=0.8, edgecolor="white", linewidth=0.2) _add_diagonal(ax, joined["full"], joined["c_removed"]) ax.set_xlabel("Full benchmark AUC") ax.set_ylabel("Cysteine removed AUC") _despine(ax) fig.tight_layout() writer.save( fig, "fig.4_processing_predictor_plots.auc.ap.c_removed.scatter", "antigen-processing") means = pandas.Series({ "Full": joined["full"].mean(), "C removed": joined["c_removed"].mean(), }) fig, ax = plt.subplots(figsize=(2.1, 2.2)) ax.bar(numpy.arange(len(means)), means.values, color=_predictor_color(predictor_info, predictor), edgecolor="white", linewidth=0.6) ax.set_xticks(numpy.arange(len(means))) ax.set_xticklabels(means.index, rotation=25, ha="right") ax.set_ylabel("Mean AUC") _despine(ax) fig.tight_layout() writer.save( fig, "fig.4_processing_predictor_plots.auc.ap.c_removed.bar", "antigen-processing") _plot_ap_vs_others(no_c, predictor_info, writer, predictors) def _plot_ap_vs_others(scores, predictor_info, writer, predictors): import matplotlib.pyplot as plt sub = _all_length_rows(scores) comparison_predictors = dict.fromkeys(( "presentation_without_flanks_processing_score", "presentation_with_flanks_processing_score", predictors.candidate, *[predictor for predictor, _ in predictors.external_baselines], )) selected_predictors = [ predictor for predictor in comparison_predictors if predictor in set(sub["predictor"]) ] if not selected_predictors: writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.bar.ap_vs_others", [], "No AP comparison predictors found.") return means = ( sub.loc[sub["predictor"].isin(selected_predictors)] .groupby("predictor")["auc"] .mean() .reindex(selected_predictors) .dropna() ) fig, ax = plt.subplots(figsize=(3.4, 2.4)) x = numpy.arange(len(means)) ax.bar( x, means.values, color=[_predictor_color(predictor_info, p) for p in means.index], edgecolor="white", linewidth=0.6) ax.set_xticks(x) ax.set_xticklabels( [_short_label(predictor_info, p) for p in means.index], rotation=30, ha="right") ax.set_ylabel("Mean AUC") _despine(ax) fig.tight_layout() writer.save( fig, "fig.4_processing_predictor_plots.bar.ap_vs_others", "antigen-processing") def _plot_current_ap_vs_summary(inputs, writer): if inputs.comparison_dir is None: return False from .plot_model_comparison import _processing_cohort_policy if _processing_cohort_policy(inputs.comparison_dir) != "matched": return False processing_path = ( Path(inputs.comparison_dir) / "processing" / "summary_table.csv" ) if not processing_path.is_file(): return False frames = [] if processing_path.is_file(): processing = pandas.read_csv(processing_path) for _, row in processing.iterrows(): frames.append({ "label": "AP %s" % str(row.get("mode", "")).replace("_", " "), "AUROC": row.get("a_macro_roc_auc"), "AUPRC": row.get("a_macro_pr_auc"), "PPV@N": row.get("a_macro_ppv_at_n"), }) df = pandas.DataFrame(frames) if df.empty: return False import matplotlib.pyplot as plt metrics = ["AUROC", "AUPRC", "PPV@N"] fig, axes = plt.subplots(1, len(metrics), figsize=(7.0, 2.6), squeeze=False) x = numpy.arange(len(df)) colors = [ (0.353, 0.612, 0.518) if label.startswith("AP") else (0.596, 0.557, 0.835) for label in df["label"] ] for ax, metric in zip(axes[0], metrics): values = pandas.to_numeric(df[metric], errors="coerce") ax.bar(x, values, color=colors, edgecolor="white", linewidth=0.6) ax.set_title(metric) ax.set_xticks(x) ax.set_xticklabels(df["label"], rotation=35, ha="right") finite = values[numpy.isfinite(values)] upper = max(1.0, float(finite.max()) * 1.05) if len(finite) else 1.0 ax.set_ylim(0, upper) _despine(ax) axes[0, 0].set_ylabel("Macro mean") fig.tight_layout(w_pad=1.0) writer.save( fig, "fig.4_processing_predictor_plots.bar.ap_vs_others", "antigen-processing", note="Affinity/length-matched processing only; presentation has a different cohort.", ) return True def _plot_ap_motif_logo(path, writer): import matplotlib.pyplot as plt try: import logomaker except ImportError: writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.logo.ap", [path], "logomaker is not installed.") return workbook = pandas.read_excel(path, sheet_name=None) sheet_name = next(iter(workbook)) df = workbook[sheet_name] if "position" in df.columns: df = df.set_index("position") numeric = df.select_dtypes(include=[numpy.number]) if numeric.empty: writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.logo.ap", [path], "Motif workbook contains no numeric amino-acid matrix.") return fig, ax = plt.subplots(figsize=(7.0, 2.0)) logomaker.Logo(numeric, ax=ax) ax.set_xlabel("Position") ax.set_ylabel("Weight") _despine(ax) fig.tight_layout() writer.save( fig, "fig.4_processing_predictor_plots.logo.ap", "antigen-processing") def _plot_ap_motif_from_training(inputs, writer): path = _processing_training_data_path(inputs) if path is None: return False import matplotlib.pyplot as plt try: df = pandas.read_csv( path, usecols=lambda column: column in ("n_flank", "c_flank", "hit"), nrows=200_000, ) except (OSError, ValueError): return False if "hit" in df.columns: df = df.loc[pandas.to_numeric(df["hit"], errors="coerce") == 1] if df.empty or "n_flank" not in df.columns or "c_flank" not in df.columns: return False amino_acids = list("ACDEFGHIKLMNPQRSTVWY") positions = ["N-%d" % i for i in range(5, 0, -1)] + [ "C+%d" % i for i in range(1, 6) ] counts = pandas.DataFrame(0.0, index=positions, columns=amino_acids) for flank_col, offset in (("n_flank", 0), ("c_flank", 5)): strings = df[flank_col].fillna("").astype(str) for row in strings: row = row[-5:] if flank_col == "n_flank" else row[:5] row = row.rjust(5, "X") if flank_col == "n_flank" else row.ljust(5, "X") for i, aa in enumerate(row): if aa in counts.columns: counts.iloc[offset + i, counts.columns.get_loc(aa)] += 1.0 frequencies = counts.divide(counts.sum(axis=1).replace(0, numpy.nan), axis=0) fig, ax = plt.subplots(figsize=(6.8, 2.4)) im = ax.imshow( frequencies.fillna(0).values, aspect="auto", cmap="viridis", vmin=0, vmax=float(numpy.nanmax(frequencies.values)) if numpy.isfinite( frequencies.values).any() else 1.0, ) ax.set_xticks(numpy.arange(len(amino_acids))) ax.set_xticklabels(amino_acids) ax.set_yticks(numpy.arange(len(positions))) ax.set_yticklabels(positions) ax.set_xlabel("Amino acid") ax.set_ylabel("Flank position") fig.colorbar(im, ax=ax, shrink=0.8, label="Frequency") _despine(ax) fig.tight_layout() writer.save( fig, "fig.4_processing_predictor_plots.logo.ap", "antigen-processing", note="Generated from current processing training flanks.", ) return True def _processing_training_data_path(inputs): candidates = [ inputs.scores_dir / "train_data.ap.production.csv", inputs.scores_dir / "train_data.csv.bz2", ] if inputs.run_dir is not None: candidates.extend([ Path(inputs.run_dir) / "processing" / "train_data.csv.bz2", Path(inputs.run_dir) / "processing" / "models.selected.with_flanks" / "train_data.csv.bz2", Path(inputs.run_dir) / "processing" / "models.selected.no_flank" / "train_data.csv.bz2", ]) for path in candidates: if path.is_file(): return path return None def _plot_ap_correlation_panels(correlation_path, training_path, writer): import matplotlib.pyplot as plt corr = pandas.read_csv(correlation_path) training = pandas.read_csv(training_path) x_col = _first_present(corr, ("affinity_score", "affinity", "ba_score")) y_col = _first_present(corr, ("processing_score", "ap_score", "processing")) gene_col = _first_present(corr, ("gene", "protein", "protein_id")) if x_col is None or y_col is None: writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.correlation.ap_by_gene", [correlation_path], "Correlation table must contain affinity and processing columns.") return fig, ax = plt.subplots(figsize=(3.0, 2.5)) if gene_col is not None: top_genes = corr[gene_col].value_counts().head(6).index for gene in top_genes: sub = corr.loc[corr[gene_col] == gene] ax.scatter(sub[x_col], sub[y_col], s=8, alpha=0.6, label=str(gene)) ax.legend(frameon=False, loc="best", handlelength=1.0) else: ax.scatter(corr[x_col], corr[y_col], s=8, alpha=0.6) ax.set_xlabel("Affinity score") ax.set_ylabel("Processing score") _despine(ax) fig.tight_layout() writer.save( fig, "fig.4_processing_predictor_plots.correlation.ap_by_gene", "antigen-processing") fig, ax = plt.subplots(figsize=(3.0, 2.5)) numeric = corr.select_dtypes(include=[numpy.number]) if len(numeric.columns) < 2: plt.close(fig) writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.extended.ap_correlation", [correlation_path], "Correlation heatmap requires at least two numeric columns.") else: im = ax.imshow(numeric.corr(), cmap="coolwarm", vmin=-1, vmax=1) ax.set_xticks(numpy.arange(len(numeric.columns))) ax.set_yticks(numpy.arange(len(numeric.columns))) ax.set_xticklabels(numeric.columns, rotation=45, ha="right") ax.set_yticklabels(numeric.columns) fig.colorbar(im, ax=ax, shrink=0.8, label="Correlation") _despine(ax) fig.tight_layout() writer.save( fig, "fig.4_processing_predictor_plots.extended.ap_correlation", "antigen-processing") if "included" in training.columns and y_col in training.columns: included = _coerce_bool_series(training["included"]) if included is None: writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.correlation.included_vs_excluded", [training_path], "Included flag contains values that are not parseable as booleans.") return fig, ax = plt.subplots(figsize=(2.5, 2.3)) groups = [ training.loc[included, y_col].dropna(), training.loc[~included, y_col].dropna(), ] try: ax.boxplot( groups, tick_labels=["Included", "Excluded"], showfliers=False) except TypeError: ax.boxplot( groups, labels=["Included", "Excluded"], showfliers=False) ax.set_ylabel("Processing score") _despine(ax) fig.tight_layout() writer.save( fig, "fig.4_processing_predictor_plots.correlation.included_vs_excluded", "antigen-processing") else: writer.skip( "antigen-processing", "fig.4_processing_predictor_plots.correlation.included_vs_excluded", [training_path], "Training table lacks included flag or processing score column.") def _plot_ap_correlation_from_saved_predictions(inputs, writer): path = inputs.multiallelic_predictions if path is None or not Path(path).is_file(): return False import matplotlib.pyplot as plt try: df = pandas.read_csv(path, nrows=250_000) except (OSError, ValueError): return False affinity_col = _first_present( df, ( "presentation_with_flanks_affinity", "presentation_without_flanks_affinity", "mhcflurry_production_affinity", ), ) processing_col = _first_present( df, ( "presentation_with_flanks_processing_score", "presentation_without_flanks_processing_score", ), ) if affinity_col is None or processing_col is None: return False df = df.copy() affinity_columns = [ column for column in df.columns if "affinity" in str(column).lower() ] for column in affinity_columns: df[column] = _affinity_to_evidence_score(df[column]) df[processing_col] = pandas.to_numeric( df[processing_col], errors="coerce") finite = df[[affinity_col, processing_col]].replace( [numpy.inf, -numpy.inf], numpy.nan).dropna() if finite.empty: return False fig, ax = plt.subplots(figsize=(3.0, 2.5)) if "protein_accession" in df.columns: top = df["protein_accession"].value_counts().head(6).index for protein in top: sub = df.loc[df["protein_accession"] == protein] ax.scatter( sub[affinity_col], sub[processing_col], s=7, alpha=0.55, label=str(protein)) ax.legend(frameon=False, loc="best", handlelength=1.0, fontsize=6) else: ax.scatter(finite[affinity_col], finite[processing_col], s=7, alpha=0.55) ax.set_xlabel("Affinity evidence") ax.set_ylabel("Processing score") _despine(ax) fig.tight_layout() writer.save( fig, "fig.4_processing_predictor_plots.correlation.ap_by_gene", "antigen-processing", note="Generated from saved multiallelic predictions.", ) numeric_cols = [ column for column in df.columns if ( "affinity" in str(column).lower() or "processing_score" in str(column).lower() or "presentation_score" in str(column).lower() ) ] numeric = df[numeric_cols].apply(pandas.to_numeric, errors="coerce") if len(numeric.columns) >= 2: fig, ax = plt.subplots(figsize=(4.5, 3.8)) corr = numeric.corr() im = ax.imshow(corr, cmap="coolwarm", vmin=-1, vmax=1) ax.set_xticks(numpy.arange(len(corr.columns))) ax.set_yticks(numpy.arange(len(corr.columns))) ax.set_xticklabels( [_short_score_label(column) for column in corr.columns], rotation=45, ha="right", ) ax.set_yticklabels([_short_score_label(column) for column in corr.columns]) fig.colorbar(im, ax=ax, shrink=0.8, label="Correlation") _despine(ax) fig.tight_layout() writer.save( fig, "fig.4_processing_predictor_plots.extended.ap_correlation", "antigen-processing", note="Generated from saved multiallelic predictions.", ) if "hit" in df.columns: hit = pandas.to_numeric(df["hit"], errors="coerce").fillna(0) > 0 fig, ax = plt.subplots(figsize=(2.7, 2.3)) groups = [ df.loc[hit, processing_col].dropna(), df.loc[~hit, processing_col].dropna(), ] try: ax.boxplot(groups, tick_labels=["Hit", "Decoy"], showfliers=False) except TypeError: ax.boxplot(groups, labels=["Hit", "Decoy"], showfliers=False) ax.set_ylabel("Processing score") _despine(ax) fig.tight_layout() writer.save( fig, "fig.4_processing_predictor_plots.processing_score.hit_vs_decoy", "antigen-processing", note="Generated from saved multiallelic predictions.", ) return True def _affinity_to_evidence_score(values): return -numpy.log10( numpy.clip(pandas.to_numeric(values, errors="coerce"), 1e-3, 1e8) ) def _short_score_label(column): return ( str(column) .replace("presentation_with_flanks_", "with flanks ") .replace("presentation_without_flanks_", "without flanks ") .replace("mhcflurry_production_", "MHCflurry ") .replace("_", " ") ) def _coerce_bool_series(series): if pandas.api.types.is_bool_dtype(series): return series.fillna(False).astype(bool) if pandas.api.types.is_numeric_dtype(series): return series.fillna(0).astype(float) != 0 normalized = series.fillna("").astype(str).str.strip().str.lower() true_values = {"1", "true", "t", "yes", "y", "included", "include"} false_values = { "", "0", "false", "f", "no", "n", "excluded", "exclude" } parsed = normalized.map( lambda value: True if value in true_values else ( False if value in false_values else numpy.nan ) ) if parsed.isnull().any(): return None return parsed.astype(bool) def _generate_proteasome_figures(inputs, writer): path = _first_existing( inputs.scores_dir, ("Additional File 8.csv", "proteasome_mass_spec.csv")) if path is None and inputs.run_dir is not None: run_path = Path(inputs.run_dir) / "processing" / "hits_with_tpm.csv.bz2" if run_path.is_file(): path = run_path if path is None: writer.skip( "proteasome", "fig.1_proteasome_mass_spec.proteosome.ms", [ inputs.scores_dir / "Additional File 8.csv", inputs.scores_dir / "proteasome_mass_spec.csv", ( Path(inputs.run_dir) / "processing" / "hits_with_tpm.csv.bz2" if inputs.run_dir is not None else "run/processing/hits_with_tpm.csv.bz2" ), ], "Proteasome mass-spec source table absent.") return df = pandas.read_csv(path) category_col = _first_present( df, ("sample_type", "format", "sample", "category", "condition", "gene")) value_col = _first_present(df, ("count", "spectra", "intensity", "value")) if value_col is None and "hit_id" in df.columns: df["count"] = 1 value_col = "count" if category_col is None or value_col is None: writer.skip( "proteasome", "fig.1_proteasome_mass_spec.proteosome.ms", [path], "Proteasome table must contain category and numeric value columns.") return import matplotlib.pyplot as plt values = df.groupby(category_col)[value_col].sum().sort_values(ascending=False) fig, ax = plt.subplots(figsize=(5.5, 2.7)) x = numpy.arange(len(values)) ax.bar(x, values.values, color=(0.34, 0.46, 0.75), edgecolor="white", linewidth=0.6) ax.set_xticks(x) ax.set_xticklabels(values.index, rotation=35, ha="right") ax.set_ylabel(value_col.replace("_", " ").title()) _despine(ax) fig.tight_layout() writer.save(fig, "fig.1_proteasome_mass_spec.proteosome.ms", "proteasome") def _copy_architecture_figures(inputs, writer): patterns = ( "*architecture*.svg", "*architecture*.pdf", "*architecture*.png", "*model_information*.svg", "*model_information*.pdf", "*model_information*.png", "*model_info*.svg", "*model_info*.pdf", "*model_info*.png", ) copied = [] asset_dir = writer.out_dir / "assets" for pattern in patterns: for path in inputs.scores_dir.glob(pattern): asset_dir.mkdir(parents=True, exist_ok=True) target = asset_dir / path.name shutil.copy2(path, target) copied.append(str(target)) if copied: writer.rows.append({ "family": "architecture", "figure": "architecture_diagrams", "status": "generated", "paths": ";".join(copied), "note": "Copied existing architecture/model-info artwork.", "missing": "", }) elif _plot_current_model_information(inputs, writer): return else: writer.skip( "architecture", "architecture_diagrams", [ inputs.scores_dir / "*architecture*", inputs.scores_dir / "*model_info*", ( Path(inputs.run_dir) / "**" / "manifest.csv" if inputs.run_dir is not None else "run/**/manifest.csv" ), ( Path(inputs.run_dir) / "presentation" / "models" / "weights.csv" if inputs.run_dir is not None else "run/presentation/models/weights.csv" ), ], "Architecture/model-information source artwork absent.") def _plot_current_model_information(inputs, writer): if inputs.run_dir is None: return False summary = _current_model_counts(inputs.run_dir) if summary.empty: return False import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=(4.8, max(2.2, 0.32 * len(summary)))) y = numpy.arange(len(summary)) ax.barh( y, summary["models"], color=(0.596, 0.557, 0.835), edgecolor="white", linewidth=0.6, ) ax.set_yticks(y) ax.set_yticklabels(summary["component"]) ax.set_xlabel("Final models") ax.set_title("Current model ensemble") _despine(ax) fig.tight_layout() writer.save( fig, "fig.1_predictor_model_information.model_counts", "architecture", note="Generated from canonical final run model artifacts.", ) return True def _current_model_counts(run_dir): """Return final ensemble sizes from canonical top-level artifacts.""" run_dir = Path(run_dir) manifests = _final_model_manifest_paths(run_dir) rows = [] for path in manifests: try: df = pandas.read_csv(path, usecols=["model_name"]) except (OSError, ValueError): continue if df.empty: continue label = _manifest_component_label(path, run_dir) rows.append((label, int(df["model_name"].nunique()))) presentation_weights = ( run_dir / "presentation" / "models" / "weights.csv") try: weights = pandas.read_csv(presentation_weights, index_col=0) except (OSError, ValueError): weights = pandas.DataFrame() if not weights.empty: rows.append(("Presentation", int(weights.index.nunique()))) if not rows: return pandas.DataFrame(columns=["component", "models"]) return ( pandas.DataFrame(rows, columns=["component", "models"]) .groupby("component", as_index=False)["models"] .sum() .sort_values("models", ascending=True) ) def _final_model_manifest_paths(run_dir): """Return model manifests that define the release's final ensembles.""" run_dir = Path(run_dir) candidates = [ run_dir / "affinity" / "models.combined" / "manifest.csv", ] candidates.extend(sorted( (run_dir / "processing").glob( "models.selected.*/manifest.csv"))) return tuple(path for path in candidates if path.is_file()) def _manifest_component_label(path, run_dir): try: rel = path.relative_to(run_dir) except ValueError: rel = path parts = rel.parts if "affinity" in parts: return "Affinity" if "presentation" in parts: return "Presentation" if "processing" in parts: parent = path.parent.name if parent.startswith("models.selected."): return "Processing %s" % parent.replace("models.selected.", "").replace("_", " ") return "Processing" return path.parent.name.replace("_", " ") def _plot_scatter_triptych_from_pivot( pivot, predictor_info, candidate, metric_label, max_points, name, family, writer, predictors, baselines=None): _plot_scatter_grid_from_pivot( pivot, predictor_info, [candidate], metric_label, max_points, name, family, writer, predictors, baselines=baselines) def _plot_scatter_grid_from_pivot( pivot, predictor_info, candidates, metric_label, max_points, name, family, writer, predictors, baselines=None): import matplotlib.pyplot as plt if baselines is None: baselines = _external_baselines_in_predictors( predictors, pivot.columns) if not baselines: writer.skip( family, name, [predictor for predictor, _ in predictors.external_baselines], "No external baseline predictors found.") return n_rows = len(candidates) n_cols = len(baselines) fig, axes = plt.subplots( n_rows, n_cols, figsize=(max(2.4, 2.35 * n_cols), max(2.2, 2.2 * n_rows)), squeeze=False) for row_index, candidate in enumerate(candidates): for column_index, (baseline, _suffix) in enumerate(baselines): ax = axes[row_index, column_index] sub = pivot[[baseline, candidate]].replace( [numpy.inf, -numpy.inf], numpy.nan).dropna() _scatter_with_winner_colors( ax, sub[baseline].values, sub[candidate].values, baseline, candidate, predictor_info, max_points) candidate_label = _short_label(predictor_info, candidate) baseline_label = _short_label(predictor_info, baseline) if n_rows == 1: _finish_metric_scatter( ax, baseline_label, candidate_label, "%s vs %s" % (candidate_label, baseline_label), metric_label) else: ax.set_title(baseline_label if row_index == 0 else "") ax.set_xlabel( "%s %s" % (baseline_label, metric_label) if row_index == n_rows - 1 else "") ax.set_ylabel( _grid_row_label(candidate_label) if column_index == 0 else "", rotation=0, ha="right", va="center", labelpad=42, fontsize=7, ) _set_unit_limits(ax) _despine(ax) fig.tight_layout(w_pad=1.0) writer.save(fig, name, family) def _grid_row_label(label): """Wrap compact factorial labels into readable scatter-grid row labels.""" parts = str(label).split(" | ") if len(parts) < 3: return str(label) midpoint = (len(parts) + 1) // 2 return "%s\n%s" % ( " | ".join(parts[:midpoint]), " | ".join(parts[midpoint:]), ) def _pivot_all_lengths(scores, metric): rows = _all_length_rows(scores) return rows.pivot_table( index="sample_id", columns="predictor", values=metric, aggfunc="mean") def _normalize_score_predictors(scores): if "predictor" not in scores.columns: return scores scores = scores.copy() scores["predictor"] = scores["predictor"].map(_normalize_predictor_name) return scores def _normalize_predictor_name(predictor): predictor = str(predictor) suffix = "_affinity" if predictor.endswith(suffix): return predictor[:-len(suffix)] return predictor def _all_length_rows(scores): if "length_label" in scores.columns: return scores.loc[scores["length_label"] == "All"].copy() if "length" in scores.columns: return scores.loc[scores["length"].isnull()].copy() return scores.copy() def _monoallelic_index_columns(scores): for candidates in ( ("allele", "peptide_length"), ("allele", "length"), ("allele",), ("sample_id",), ): if all( column in scores.columns and ( column not in ("peptide_length", "length") or scores[column].notnull().any() ) for column in candidates): return list(candidates) return scores.index def _scatter_with_winner_colors( ax, x, y, x_predictor, y_predictor, predictor_info, max_points): x = numpy.asarray(x, dtype=float) y = numpy.asarray(y, dtype=float) mask = numpy.isfinite(x) & numpy.isfinite(y) x = x[mask] y = y[mask] if len(x) > max_points: rng = numpy.random.default_rng(0) indices = rng.choice(len(x), size=max_points, replace=False) x = x[indices] y = y[indices] x_color = _predictor_color(predictor_info, x_predictor) y_color = _predictor_color(predictor_info, y_predictor) colors = [y_color if y_val >= x_val else x_color for x_val, y_val in zip(x, y)] ax.scatter( x, y, c=colors, s=14, alpha=0.78, edgecolor="white", linewidth=0.2, rasterized=False) _add_diagonal(ax, x, y) def _finish_metric_scatter(ax, x_label, y_label, title, metric_label): ax.set_title(title) ax.set_xlabel("%s %s" % (x_label, metric_label)) ax.set_ylabel("%s %s" % (y_label, metric_label)) _set_unit_limits(ax) _despine(ax) def _set_unit_limits(ax): xmin, xmax = ax.get_xlim() ymin, ymax = ax.get_ylim() low = max(0.0, min(xmin, ymin)) high = min(1.0, max(xmax, ymax)) if high <= low: low, high = 0.0, 1.0 pad = (high - low) * 0.05 ax.set_xlim(max(0.0, low - pad), min(1.0, high + pad)) ax.set_ylim(max(0.0, low - pad), min(1.0, high + pad)) ax.set_aspect("equal", adjustable="box") def _add_diagonal(ax, x, y): finite = numpy.asarray(list(x) + list(y), dtype=float) finite = finite[numpy.isfinite(finite)] if len(finite): low = max(0.0, float(finite.min())) high = min(1.0, float(finite.max())) else: low, high = 0.0, 1.0 if high <= low: low, high = 0.0, 1.0 pad = (high - low) * 0.05 low = max(0.0, low - pad) high = min(1.0, high + pad) ax.plot([low, high], [low, high], color="0.35", linewidth=0.8, zorder=0) def _allele_locus(value): locus = allele_locus_name(value) return locus if locus in ("HLA-A", "HLA-B", "HLA-C", "H2") else "other" def _first_existing(directory, names): for name in names: path = directory / name if path.is_file(): return path return None def _write_manifest(out_dir, rows): path = Path(out_dir) / "manifest.csv" pandas.DataFrame(rows).to_csv(path, index=False) def _write_missing_inputs(out_dir, rows): skipped = [ row for row in rows if row["status"] in ("skipped", "failed") ] path = Path(out_dir) / "missing_inputs.md" with open(path, "w") as fd: fd.write("# Missing or failed paper-figure inputs\n\n") if not skipped: fd.write("All requested figure families were generated.\n") return for row in skipped: fd.write("## %s / %s\n\n" % (row["family"], row["figure"])) if row["missing"]: fd.write("Missing: `%s`\n\n" % row["missing"].replace(";", "`, `")) fd.write("%s\n\n" % row["note"]) # Module-level parser for sphinx autoprogram; behaves like the legacy # ``mhcflurry-*`` command modules. parser = make_parser() if __name__ == "__main__": raise SystemExit(run_argv(os.sys.argv[1:])) mhcflurry-2.3.6/mhcflurry/cli/plot_loss_curves.py000066400000000000000000000414061525677230600223200ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Plot training loss curves for every network in a run + highlight which ones were picked by the selection step. The fit_info arrays (``loss``, ``val_loss``, plus the optional per-epoch timing breakdowns) are serialized inside each row's ``config_json`` in the trained models' ``manifest.csv``. Before selection, that manifest has one row per candidate; after selection it contains only the models that entered the final ensemble. Usage — aggregate curves over the full candidate pool, colored by selection status: mhcflurry train plot-loss-curves \\ --unselected-dir results/new_run/models.unselected.combined \\ --selected-dir results/new_run/models.combined \\ --out results/plots/loss_curves Usage — just the selected ensemble: mhcflurry train plot-loss-curves \\ --selected-dir results/new_run/models.combined \\ --out results/plots/loss_curves Produces (in ``--out``): - ``loss_curves_by_model.png`` — per-model train+val curves. Non- selected models in gray (if ``--unselected-dir`` is provided), selected in color. - ``loss_curves_by_arch.png`` — curves colored by architecture identity. - ``per_fold_summary.png`` — one panel per fold showing val_loss convergence of selected vs non-selected. - ``summary.csv`` — final-epoch losses and explicit checkpoint metadata. """ from __future__ import annotations import argparse import ast import json import os from collections import defaultdict import numpy import pandas def _matplotlib_available(): """Return ``True`` when PNG plots can be written in this environment.""" try: import matplotlib.pyplot # noqa: F401 except ImportError as exc: print( "Skipping PNG loss plots: matplotlib is not installed " f"({exc}). Summary CSV will still be written.", flush=True, ) return False return True def _parse_config_json(raw): """Handle both JSON and Python-repr config_json encodings.""" try: return json.loads(raw) except (json.JSONDecodeError, TypeError): return ast.literal_eval(raw) def _architecture_metadata(hp): """Describe affinity dense networks and processing CNNs without conflation.""" if "convolutional_kernel_size" not in hp: sizes = tuple(hp.get("layer_sizes", [])) return {"model_type": "affinity", "architecture": str(sizes), "architecture_key": "affinity:" + str(sizes), "l1": hp.get("dense_layer_l1_regularization"), "l2": None} fields = ( "amino_acid_encoding", "peptide_max_length", "n_flank_length", "c_flank_length", "flanking_averages", "convolutional_filters", "convolutional_kernel_size", "convolutional_padding_mode", "convolutional_activation", "convolutional_kernel_l1_l2", "dropout_rate", "post_convolutional_dense_layer_sizes", "normalization", "cleavage_boundary_flank_length", "cleavage_boundary_peptide_length", "cleavage_boundary_hidden_size", "cleavage_boundary_context_dropout", ) architecture = "CNN k%s/f%s, flanks %s/%s" % ( hp["convolutional_kernel_size"], hp.get("convolutional_filters", "?"), hp.get("n_flank_length", "?"), hp.get("c_flank_length", "?")) if hp.get("cleavage_boundary_flank_length", 0): architecture += ", boundary %sx%s/h%s" % ( hp["cleavage_boundary_flank_length"], hp.get("cleavage_boundary_peptide_length", "?"), hp.get("cleavage_boundary_hidden_size", "?")) # Label a malformed or scalar entry blank rather than aborting the # plotting stage, which a sweep runs after training has finished. regularization = hp.get("convolutional_kernel_l1_l2") if not isinstance(regularization, (list, tuple)) or len(regularization) != 2: regularization = [None, None] return {"model_type": "processing", "architecture": architecture, "architecture_key": "processing:" + json.dumps( {name: hp.get(name) for name in fields}, sort_keys=True), "l1": regularization[0], "l2": regularization[1]} def _epoch_label(models): """Label observed fit history, without assuming pretraining exists.""" return ("Epoch (fit calls concatenated)" if any(len(m["phase_curves"]) > 1 for m in models) else "Epoch") def _load_manifest_curves(manifest_path): """Load a manifest.csv and pull per-model fit_info curves. Returns a list of dicts: {model_name, arch, layer_sizes, l1, fold, loss_history, val_loss_history, final_val_loss, phase}. """ df = pandas.read_csv(manifest_path) rows = [] for _, r in df.iterrows(): cfg = _parse_config_json(r.config_json) hp = cfg.get("hyperparameters", cfg) fit_info = cfg.get("fit_info") or [] # Each fit_info record is one .fit() invocation; pan-allele has # a pretrain pass then a finetune pass. Both are useful to plot. model_row = { "model_name": r.model_name, "layer_sizes": tuple(hp.get("layer_sizes", [])), **_architecture_metadata(hp), "fold": None, "arch_num": None, "replicate": None, "work_item_name": None, "phase_curves": [], } for fit_rec in fit_info: if not isinstance(fit_rec, dict): continue tinfo = fit_rec.get("training_info") or {} model_row["fold"] = tinfo.get("fold_num", model_row["fold"]) model_row["arch_num"] = tinfo.get( "architecture_num", model_row["arch_num"]) model_row["replicate"] = tinfo.get( "replicate_num", model_row["replicate"]) model_row["work_item_name"] = tinfo.get( "work_item_name", model_row["work_item_name"]) losses = fit_rec.get("loss") or [] val_losses = fit_rec.get("val_loss") or [] model_row["phase_curves"].append({ "phase": tinfo.get("phase", "unknown"), "loss": list(losses), "val_loss": list(val_losses), "final_val_loss": ( float(val_losses[-1]) if val_losses else float("nan") ), "best_epoch": fit_rec.get("best_epoch"), "best_val_loss": fit_rec.get("best_val_loss"), "restored_best_weights": fit_rec.get("restored_best_weights"), "checkpoint_policy": ( fit_rec["restored_checkpoint_policy"] if "restored_checkpoint_policy" in fit_rec else "best" if fit_rec.get("restored_best_weights") is True else "terminal" if fit_rec.get("restored_best_weights") is False else "unknown"), }) rows.append(model_row) return rows def _selection_key(model): """Return the stable identity of a candidate across selection cloning.""" if model["work_item_name"]: return ("work_item_name", model["work_item_name"]) training_coordinates = ( model["fold"], model["arch_num"], model["replicate"], ) if all(value is not None for value in training_coordinates): return ("training_coordinates",) + training_coordinates return ("model_name", model["model_name"]) def _plot_all_curves(selected_keys, all_models, out_path, title_suffix=""): """Plot train/val curves for every model, gray non-selected + colored selected. Non-selected models get a low-alpha gray; selected get distinguishable colors so the eye can follow them through the phase transitions. """ import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 2, figsize=(14, 6)) cmap = plt.get_cmap("tab10") selected_color_idx = 0 for m in all_models: is_selected = _selection_key(m) in selected_keys label = None if is_selected: color = cmap(selected_color_idx % 10) alpha = 0.9 lw = 1.4 label = f"{m['architecture']} f{m['fold']}" selected_color_idx += 1 else: color = "#666666" alpha = 0.12 lw = 0.7 # Plot all fit epochs even if inference restored an earlier checkpoint. loss_curve = [] val_curve = [] for ph in m["phase_curves"]: loss_curve.extend(ph["loss"]) val_curve.extend(ph["val_loss"]) x = numpy.arange(1, len(loss_curve) + 1) if len(loss_curve): axes[0].plot( x, loss_curve, color=color, alpha=alpha, lw=lw, label=label, ) if len(val_curve): xv = numpy.arange(1, len(val_curve) + 1) axes[1].plot( xv, val_curve, color=color, alpha=alpha, lw=lw, label=label, ) axes[0].set_title("Train loss") axes[0].set_xlabel(_epoch_label(all_models)) axes[0].set_ylabel("loss") axes[0].set_yscale("log") axes[1].set_title("Val loss") axes[1].set_xlabel(_epoch_label(all_models)) axes[1].set_ylabel("val loss") axes[1].set_yscale("log") if 0 < selected_color_idx <= 12: # Only show legend when it won't swallow the plot. With >12 # selected models the legend is more noise than signal. axes[1].legend(loc="upper right", fontsize=7, ncol=2) fig.suptitle( f"Loss curves ({selected_color_idx} selected of {len(all_models)}) " f"{title_suffix}".strip(), fontsize=12, ) fig.text(0.5, 0.01, "Full epoch history; final epoch may differ from inference checkpoint (see summary.csv).", ha="center", fontsize=9) fig.tight_layout(rect=(0, 0.04, 1, 1)) fig.savefig(out_path, dpi=150) plt.close(fig) def _plot_by_arch(all_models, out_path): """Color curves by architecture — groups see how different archs behave during training, independent of selection outcome.""" import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 2, figsize=(14, 6)) arch_groups = defaultdict(list) for m in all_models: arch_groups[m["architecture_key"]].append(m) sorted_archs = sorted(arch_groups) cmap = plt.get_cmap("viridis") for i, arch in enumerate(sorted_archs): color = cmap(i / max(len(sorted_archs) - 1, 1)) for j, m in enumerate(arch_groups[arch]): loss_curve = [] val_curve = [] for ph in m["phase_curves"]: loss_curve.extend(ph["loss"]) val_curve.extend(ph["val_loss"]) label = ("%d: %s" % (i + 1, m["architecture"])) if j == 0 else None if len(loss_curve): axes[0].plot( numpy.arange(1, len(loss_curve) + 1), loss_curve, color=color, alpha=0.4, lw=0.8, label=label, ) if len(val_curve): axes[1].plot( numpy.arange(1, len(val_curve) + 1), val_curve, color=color, alpha=0.4, lw=0.8, ) axes[0].set_title("Train loss by arch") axes[0].set_xlabel(_epoch_label(all_models)) axes[0].set_ylabel("loss") axes[0].set_yscale("log") axes[0].legend(loc="upper right", fontsize=7) axes[1].set_title("Val loss by arch") axes[1].set_xlabel(_epoch_label(all_models)) axes[1].set_ylabel("val loss") axes[1].set_yscale("log") fig.tight_layout() fig.savefig(out_path, dpi=150) plt.close(fig) def _plot_per_fold(selected_keys, all_models, out_path): """One panel per fold; selected vs non-selected val_loss curves.""" import matplotlib.pyplot as plt folds = sorted({m["fold"] for m in all_models if m["fold"] is not None}) if not folds: return fig, axes = plt.subplots( 1, len(folds), figsize=(5 * len(folds), 5), sharey=True, ) if len(folds) == 1: axes = [axes] for ax, fold in zip(axes, folds): fold_models = [m for m in all_models if m["fold"] == fold] for m in fold_models: val_curve = [] for ph in m["phase_curves"]: val_curve.extend(ph["val_loss"]) if not val_curve: continue if _selection_key(m) in selected_keys: color = "#d62728" alpha = 0.95 lw = 1.4 else: color = "#666666" alpha = 0.18 lw = 0.7 ax.plot( numpy.arange(1, len(val_curve) + 1), val_curve, color=color, alpha=alpha, lw=lw, ) ax.set_title(f"Fold {fold}") ax.set_xlabel(_epoch_label(fold_models)) ax.set_yscale("log") axes[0].set_ylabel("val loss") fig.suptitle( "Val loss per fold — red=selected, gray=not-selected", fontsize=12, ) fig.tight_layout() fig.savefig(out_path, dpi=150) plt.close(fig) def make_parser(prog="mhcflurry train plot-loss-curves"): """Return the command-line parser for training-loss diagnostics.""" parser = argparse.ArgumentParser( prog=prog, description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter, ) parser.add_argument( "--unselected-dir", help=( "Path to models.unselected.combined/ (has the full candidate " "pool). When provided, all candidates are plotted in gray + " "the selected ones in color." ), ) parser.add_argument( "--selected-dir", required=True, help="Path to models.combined/ (the selected ensemble)", ) parser.add_argument("--out", required=True, help="Output directory") return parser def run(args): """Generate training-loss plots and a per-model summary.""" os.makedirs(args.out, exist_ok=True) selected = _load_manifest_curves( os.path.join(args.selected_dir, "manifest.csv"), ) selected_keys = {_selection_key(m) for m in selected} if args.unselected_dir: all_models = _load_manifest_curves( os.path.join(args.unselected_dir, "manifest.csv"), ) else: all_models = selected print( f"Loaded {len(all_models)} candidate model(s); " f"{len(selected_keys)} selected." ) wrote_plots = False if _matplotlib_available(): _plot_all_curves( selected_keys, all_models, os.path.join(args.out, "loss_curves_by_model.png"), title_suffix="(selected in color)", ) _plot_by_arch( all_models, os.path.join(args.out, "loss_curves_by_arch.png"), ) _plot_per_fold( selected_keys, all_models, os.path.join(args.out, "per_fold_summary.png"), ) wrote_plots = True rows = [] for m in all_models: for ph in m["phase_curves"]: rows.append({ "model_name": m["model_name"], "layer_sizes": str(m["layer_sizes"]), "model_type": m["model_type"], "architecture": m["architecture"], "architecture_key": m["architecture_key"], "l1": m["l1"], "l2": m["l2"], "fold": m["fold"], "replicate": m["replicate"], "selected": _selection_key(m) in selected_keys, "phase": ph["phase"], "n_epochs": len(ph["loss"]), "final_loss": ( float(ph["loss"][-1]) if ph["loss"] else float("nan") ), "final_val_loss": ph["final_val_loss"], "best_epoch": ph["best_epoch"], "best_val_loss": ph["best_val_loss"], "restored_best_weights": ph["restored_best_weights"], "checkpoint_policy": ph["checkpoint_policy"], }) summary_df = pandas.DataFrame(rows) summary_df.to_csv( os.path.join(args.out, "summary.csv"), index=False, ) if wrote_plots: print(f"Wrote plots + summary to {args.out}/") else: print(f"Wrote summary to {args.out}/") return 0 def run_argv(argv=None, prog="mhcflurry train plot-loss-curves"): """Parse ``argv`` and generate training-loss diagnostics.""" return run(make_parser(prog).parse_args(argv)) def main(): """Compatibility entry point for the repository script.""" return run_argv() if __name__ == "__main__": main() mhcflurry-2.3.6/mhcflurry/cli/plot_model_comparison.py000066400000000000000000001553571525677230600233160ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Plot the metric outputs from ``mhcflurry compare-models``. Reads the CSVs + JSON written by ``compare-models`` and renders ROC / PR / scatter / per-allele delta plots under ``/plots/`` for affinity, processing, and presentation comparisons. Kept as a separate subcommand so the metric pipeline doesn't pay the matplotlib import cost. """ from __future__ import annotations import argparse import json import os import shutil from pathlib import Path import numpy import pandas from .figure_style import ( DIAGONAL_COLOR, NEGATIVE_DELTA_COLOR, POSITIVE_DELTA_COLOR, SIDE_A_COLOR, SIDE_B_COLOR, apply_paper_style as _apply_paper_style, ) from .model_comparison_constants import ( METRIC_NAMES, PRESENTATION_MODES, PRESENTATION_SCORE_KINDS, PROCESSING_MODES, ) from ..common import positive_int_arg METRIC_DISPLAY_NAMES = { "roc_auc": "AUROC", "pr_auc": "AUPRC", "ppv_at_n": "PPV@N", } def make_parser(): """Return a standalone parser for documentation tooling (autoprogram).""" parser = argparse.ArgumentParser(prog="mhcflurry plot-model-comparison") register_subparser(parser) return parser def run_argv(argv): """Entry point for the lazy ``mhcflurry plot-model-comparison`` dispatcher.""" return run(make_parser().parse_args(argv)) def register_subparser(parser): parser.description = __doc__ parser.formatter_class = argparse.RawDescriptionHelpFormatter parser.epilog = """ Plotting layers: * This command always reads an existing compare-models directory and writes diagnostic plots under /plots. * --summary-pdf collects those diagnostic plot PDFs into one review packet. * The --paper-figures-* flags optionally call ``mhcflurry eval paper-figures render`` with saved score/prediction inputs for the broader paper-style figure suite. * Custom saved-prediction score columns need predictor_info.csv metadata with predictor and higher_is_better. """ parser.add_argument("--allow-legacy-processing-plots", action="store_true", help="Explicitly render unmatched processing diagnostics, labelled as such.") parser.add_argument( "--input", required=True, help="Output directory produced by ``mhcflurry compare-models``.", ) parser.add_argument( "--max-scatter-points", type=positive_int_arg, default=100_000, help="Subsample scatter plots above this many points (default 100k).", ) parser.add_argument( "--components", default="auto", help=( "Comma-separated subset of {affinity, processing, presentation}; " "default 'auto' plots whichever components are present in --input." ), ) parser.add_argument( "--summary-pdf", help=( "Optional PDF path. When set, generated plots are collected into " "a single PDF, preserving vector plots where possible. Use a " "top-level file under /plots or a path outside the plot " "tree; paper and diagnostic subdirectories are reserved." ), ) parser.add_argument( "--a-label", help=( "Override side A label from side_a.json. Useful for regenerating " "plots from an existing comparison without recomputing metrics." ), ) parser.add_argument( "--b-label", help=( "Override side B label from side_b.json. Useful for regenerating " "plots from an existing comparison without recomputing metrics." ), ) parser.add_argument( "--paper-figures-scores-dir", help=( "Optional saved figure-input directory passed to " "``mhcflurry paper-figures --scores-dir``. This may contain " "saved prediction tables, derived score tables, and predictor " "metadata such as predictor_info.csv." ), ) parser.add_argument( "--paper-figures-artifacts-dir", help=( "Compatibility alias for --paper-figures-scores-dir." ), ) parser.add_argument( "--paper-figures-out", help=( "Output directory for paper-style figures. Default: " "/plots/paper_figures. Must be a dedicated directory, " "not /plots or a diagnostic component directory." ), ) parser.add_argument( "--paper-figures-formats", default="svg,pdf,png", help="Comma-separated paper-figure formats. Default: %(default)s.", ) parser.add_argument( "--include-paper-figures-in-summary-pdf", action="store_true", default=False, help=( "When --summary-pdf and paper-style figures are enabled, append " "paper_figures/paper_figures.pdf to the summary PDF." ), ) parser.add_argument( "--paper-figures-candidate-predictor", help="Candidate predictor passed through to ``mhcflurry paper-figures``.", ) parser.add_argument( "--paper-figures-external-baselines", help=( "External baselines passed through to ``mhcflurry paper-figures`` " "as PREDICTOR or PREDICTOR:PERCENT_CHANGE_SUFFIX." ), ) parser.add_argument( "--paper-figures-multiallelic-predictions", help=( "Saved multiallelic test-set prediction table passed through to " "``mhcflurry paper-figures``." ), ) parser.add_argument( "--paper-figures-monoallelic-predictions", help=( "Saved monoallelic test-set prediction table passed through to " "``mhcflurry paper-figures``." ), ) parser.add_argument( "--paper-figures-preferred-predictors", help=( "Comma-separated preferred predictors passed through to " "``mhcflurry paper-figures``." ), ) parser.add_argument( "--paper-figures-presentation-panel-predictors", help=( "Comma-separated presentation-panel candidate predictors passed " "through to ``mhcflurry paper-figures``." ), ) parser.add_argument( "--paper-figures-presentation-panel-baselines", help=( "Comma-separated presentation-panel baseline predictors passed " "through to ``mhcflurry paper-figures``." ), ) return parser def run(args): import matplotlib matplotlib.use("Agg") _apply_paper_style() labels = _load_side_labels(args.input) if args.a_label: labels["a"] = args.a_label if args.b_label: labels["b"] = args.b_label available = _detect_available_components(args.input) if args.components == "auto": components = available else: requested = [p.strip() for p in args.components.split(",")] if not requested or any(not component for component in requested): raise SystemExit("--components contains an empty component") duplicates = sorted({ component for component in requested if requested.count(component) > 1 }) if duplicates: raise SystemExit("Duplicate --components entries: %s" % ( ", ".join(duplicates))) components = [c for c in requested if c in available] missing = sorted(set(requested) - set(available)) if missing: raise SystemExit( "Requested component(s) not present in %s: %s" % ( args.input, ", ".join(missing))) if "processing" in components and _processing_cohort_policy(args.input) != "matched" and not getattr(args, "allow_legacy_processing_plots", False): raise ValueError("Processing plots require affinity/length-matched evaluation. Re-evaluate " "or explicitly request --allow-legacy-processing-plots for historical diagnostics.") plot_dir = os.path.join(args.input, "plots") paper_figures_dir = args.paper_figures_out or os.path.join( plot_dir, "paper_figures") paper_scores_dir = ( args.paper_figures_scores_dir or args.paper_figures_artifacts_dir ) _validate_paper_figure_inputs_outside_plot_dir( plot_dir, { "--paper-figures-scores-dir": paper_scores_dir, "--paper-figures-multiallelic-predictions": ( args.paper_figures_multiallelic_predictions ), "--paper-figures-monoallelic-predictions": ( args.paper_figures_monoallelic_predictions ), }, ) _validate_plot_output_paths( plot_dir, paper_figures_dir, args.summary_pdf) _reset_plot_directory( plot_dir, preserve_directory=paper_figures_dir) if args.summary_pdf: try: os.unlink(args.summary_pdf) except FileNotFoundError: pass paper_dir = os.path.join(plot_dir, "paper") os.makedirs(paper_dir, exist_ok=True) for component in components: if component == "affinity": _plot_affinity( args.input, plot_dir, labels, args.max_scatter_points) elif component == "processing": _plot_processing( args.input, plot_dir, labels, args.max_scatter_points) elif component == "presentation": _plot_presentation( args.input, plot_dir, labels, args.max_scatter_points) _plot_release_summary(args.input, paper_dir, labels) paper_inputs_requested = any([ paper_scores_dir, args.paper_figures_multiallelic_predictions, args.paper_figures_monoallelic_predictions, ]) if paper_inputs_requested: from . import paper_figures paper_argv = [ "--comparison-dir", args.input, "--out", paper_figures_dir, "--formats", args.paper_figures_formats, ] if paper_scores_dir: paper_argv.extend(["--scores-dir", paper_scores_dir]) paper_args = paper_figures.make_parser().parse_args(paper_argv) _append_optional_paper_figure_args(args, paper_args) status = paper_figures.run(paper_args) if status: return status if args.summary_pdf: _write_summary_pdf( plot_dir, args.summary_pdf, include_paper_figures=args.include_paper_figures_in_summary_pdf, paper_figures_dir=paper_figures_dir, ) if not os.path.isfile(args.summary_pdf): raise RuntimeError( "No plot pages were generated for summary PDF: %s" % args.summary_pdf) return 0 def _reset_plot_directory(plot_dir, preserve_directory=None): """Remove stale plots while retaining an existing paper-figure suite.""" plot_dir = Path(os.path.abspath(plot_dir)) preserve_directory = ( Path(os.path.abspath(preserve_directory)) if preserve_directory is not None else None ) if ( preserve_directory is not None and not _path_is_within(preserve_directory, plot_dir)): preserve_directory = None if plot_dir.is_dir() and not plot_dir.is_symlink(): _clean_directory_except(plot_dir, preserve_directory) elif plot_dir.exists() or plot_dir.is_symlink(): plot_dir.unlink() plot_dir.mkdir(parents=True, exist_ok=True) def _validate_paper_figure_inputs_outside_plot_dir(plot_dir, input_paths): """Reject paper inputs that diagnostic cleanup would recursively remove.""" plot_dir = Path(os.path.abspath(plot_dir)) resolved_plot_dir = plot_dir.resolve(strict=False) conflicts = [] for option, value in input_paths.items(): if value is None: continue path = Path(os.path.abspath(value)) if _path_is_within_location( path, plot_dir, resolved_directory=resolved_plot_dir): conflicts.append((option, path)) if conflicts: details = ", ".join( "%s=%s" % (option, path) for (option, path) in conflicts) raise SystemExit( "Paper-figure input paths must be outside the diagnostic plot " "output directory %s because that directory is cleared before " "rendering. Refusing to delete input: %s. Move the input or " "choose a different --input comparison directory." % (plot_dir, details) ) def _validate_plot_output_paths( plot_dir, paper_figures_dir, summary_pdf=None): """Reject overlapping command-owned output locations before cleanup.""" plot_dir = Path(os.path.abspath(plot_dir)) paper_figures_dir = Path(os.path.abspath(paper_figures_dir)) diagnostic_dirs = tuple( plot_dir / name for name in ("affinity", "processing", "presentation", "paper") ) comparison_dir = plot_dir.parent if _same_location(paper_figures_dir, plot_dir) or any( _path_is_within_location(paper_figures_dir, directory) for directory in diagnostic_dirs): raise SystemExit( "--paper-figures-out must be a dedicated directory distinct " "from the diagnostic plot directory and its command-owned " "component directories. Refusing unsafe output: %s" % paper_figures_dir ) if ( _path_is_within_location(paper_figures_dir, comparison_dir) and not _path_is_within_location(paper_figures_dir, plot_dir)): raise SystemExit( "--paper-figures-out cannot be inside the comparison input tree " "but outside its plots directory: %s" % paper_figures_dir ) if summary_pdf is None: return summary_pdf = Path(os.path.abspath(summary_pdf)) conflicting_dirs = (paper_figures_dir,) + diagnostic_dirs if ( _same_location(summary_pdf, plot_dir) or any( _path_is_within_location(summary_pdf, directory) for directory in conflicting_dirs) ): raise SystemExit( "--summary-pdf collides with command-owned figure output: %s. " "Use a top-level file under %s (for example, %s) or a path " "outside the paper and diagnostic output directories." % ( summary_pdf, plot_dir, plot_dir / "model_comparison_figures.pdf", ) ) if ( _path_is_within_location(summary_pdf, comparison_dir) and not _path_is_within_location(summary_pdf, plot_dir)): raise SystemExit( "--summary-pdf cannot overwrite files in the comparison input " "tree outside its plots directory: %s" % summary_pdf ) def _same_location(left, right): left = Path(os.path.abspath(left)) right = Path(os.path.abspath(right)) return ( left == right or left.resolve(strict=False) == right.resolve(strict=False) ) def _path_is_within_location(path, directory, resolved_directory=None): path = Path(os.path.abspath(path)) directory = Path(os.path.abspath(directory)) if _path_is_within(path, directory): return True if resolved_directory is None: resolved_directory = directory.resolve(strict=False) return _path_is_within( path.resolve(strict=False), resolved_directory) def _clean_directory_except(directory, preserve_directory): for child in directory.iterdir(): child = Path(os.path.abspath(child)) if preserve_directory is not None and child == preserve_directory: continue if ( preserve_directory is not None and _path_is_within(preserve_directory, child) and child.is_dir() and not child.is_symlink()): _clean_directory_except(child, preserve_directory) continue if child.is_dir() and not child.is_symlink(): shutil.rmtree(child) else: child.unlink() def _path_is_within(path, directory): try: path.relative_to(directory) return True except ValueError: return False def _append_optional_paper_figure_args(args, paper_args): passthrough = { "paper_figures_candidate_predictor": "candidate_predictor", "paper_figures_external_baselines": "external_baselines", "paper_figures_multiallelic_predictions": "multiallelic_predictions", "paper_figures_monoallelic_predictions": "monoallelic_predictions", "paper_figures_preferred_predictors": "preferred_predictors", "paper_figures_presentation_panel_predictors": ( "presentation_panel_predictors" ), "paper_figures_presentation_panel_baselines": ( "presentation_panel_baselines" ), } for source, target in passthrough.items(): value = getattr(args, source) if value: setattr(paper_args, target, value) def _safe_plot(label, func, *args, **kwargs): try: return func(*args, **kwargs) except Exception as e: print( "WARNING: skipping %s: %s: %s" % ( label, type(e).__name__, e)) return None def _load_side_labels(input_dir): labels = {"a": "Side A", "b": "Side B"} for letter in ("a", "b"): path = os.path.join(input_dir, "side_%s.json" % letter) if os.path.isfile(path): with open(path) as fd: labels[letter] = json.load(fd).get("label", letter) return labels def _detect_available_components(input_dir): components = [] affinity_dir = os.path.join(input_dir, "affinity") if any( os.path.isfile(os.path.join(affinity_dir, name)) for name in ( "predictions.csv.bz2", "per_allele.csv", "per_length.csv", "summary.json", )): components.append("affinity") if os.path.isdir(os.path.join(input_dir, "processing")): components.append("processing") if os.path.isdir(os.path.join(input_dir, "presentation")): components.append("presentation") return components def _read_optional_csv(path): try: return pandas.read_csv(path) except pandas.errors.EmptyDataError: return pandas.DataFrame() # --------------------------------------------------------------------------- # affinity # --------------------------------------------------------------------------- def _plot_affinity(input_dir, plot_dir, labels, max_scatter_points): import matplotlib.pyplot as plt from sklearn.metrics import ( average_precision_score, precision_recall_curve, roc_auc_score, roc_curve, ) sub_dir = os.path.join(plot_dir, "affinity") os.makedirs(sub_dir, exist_ok=True) paper_dir = os.path.join(plot_dir, "paper") os.makedirs(paper_dir, exist_ok=True) pred_path = os.path.join(input_dir, "affinity", "predictions.csv.bz2") label_a, label_b = labels["a"], labels["b"] if os.path.isfile(pred_path): df = _read_optional_csv(pred_path) if not {"hit", "a_score", "b_score"}.issubset(df.columns): df = pandas.DataFrame() else: df = pandas.DataFrame() if not df.empty: y = df.hit.values a_score = df.a_score.values b_score = df.b_score.values _save_roc(plt, roc_curve, roc_auc_score, y, a_score, b_score, label_a, label_b, os.path.join(sub_dir, "roc.png"), title="Affinity ROC") _save_pr(plt, precision_recall_curve, average_precision_score, y, a_score, b_score, label_a, label_b, os.path.join(sub_dir, "pr.png"), title="Affinity PR") _save_scatter(plt, b_score, a_score, label_b, label_a, os.path.join(sub_dir, "scatter.png"), title="Affinity score: %s vs %s" % (label_a, label_b), max_points=max_scatter_points) per_allele_path = os.path.join(input_dir, "affinity", "per_allele.csv") if os.path.isfile(per_allele_path): per_allele = _read_optional_csv(per_allele_path) _save_per_allele_delta(plt, per_allele, sub_dir, label_a, label_b) _save_metric_scatter_grid( plt, [("alleles", per_allele)], os.path.join(paper_dir, "affinity_per_allele_scatter.png"), label_a, label_b, "Affinity per-allele accuracy", ) per_length_path = os.path.join(input_dir, "affinity", "per_length.csv") if os.path.isfile(per_length_path): _save_per_length_grid( plt, [("affinity", pandas.read_csv(per_length_path))], os.path.join(paper_dir, "affinity_per_length_macro.png"), label_a, label_b, "Affinity by peptide length", ) def _save_per_allele_delta(plt, per_allele, sub_dir, label_a, label_b): if "roc_auc_diff" not in per_allele.columns: return sorted_df = per_allele.sort_values("roc_auc_diff", ascending=False) if sorted_df.empty: return fig, ax = plt.subplots(figsize=(7.1, 2.5)) values = sorted_df["roc_auc_diff"].to_numpy(dtype=float) ax.bar( numpy.arange(len(sorted_df)), values, color=_delta_colors(values), edgecolor="white", linewidth=0.3, ) ax.axhline(0, color=DIAGONAL_COLOR, linewidth=0.8) ax.set_xlabel("allele (sorted by ROC-AUC delta)") ax.set_ylabel("%s - %s ROC-AUC" % (label_a, label_b)) ax.set_title("Per-allele ROC-AUC delta") fig.tight_layout() _save_figure(fig, os.path.join(sub_dir, "per_allele_roc_delta.png")) plt.close(fig) # --------------------------------------------------------------------------- # processing # --------------------------------------------------------------------------- def _processing_cohort_policy(input_dir): path = os.path.join(input_dir, "processing", "cohort.json") if not os.path.isfile(path): return "legacy-unmatched" with open(path) as fd: return json.load(fd).get("policy", "legacy-unmatched") def _plot_processing(input_dir, plot_dir, labels, max_scatter_points): import matplotlib.pyplot as plt from sklearn.metrics import ( average_precision_score, precision_recall_curve, roc_auc_score, roc_curve, ) sub_dir = os.path.join(plot_dir, "processing") os.makedirs(sub_dir, exist_ok=True) paper_dir = os.path.join(plot_dir, "paper") os.makedirs(paper_dir, exist_ok=True) label_a, label_b = labels["a"], labels["b"] processing_dir = os.path.join(input_dir, "processing") cohort_label = "affinity/length matched" if _processing_cohort_policy(input_dir) == "matched" else "UNMATCHED diagnostic" for mode in PROCESSING_MODES: pred_path = os.path.join( processing_dir, "predictions_%s.csv.bz2" % mode) if not os.path.isfile(pred_path): continue df = pandas.read_csv(pred_path) a_score = _score_values(df, "a", "processing_score") b_score = _score_values(df, "b", "processing_score") y = df.hit.values _save_roc(plt, roc_curve, roc_auc_score, y, a_score, b_score, label_a, label_b, os.path.join(sub_dir, "roc_%s.png" % mode), title="%s processing ROC (%s)" % (_display_identifier(mode), cohort_label)) _save_pr(plt, precision_recall_curve, average_precision_score, y, a_score, b_score, label_a, label_b, os.path.join(sub_dir, "pr_%s.png" % mode), title="%s processing PR (%s)" % (_display_identifier(mode), cohort_label)) _save_scatter(plt, b_score, a_score, label_b, label_a, os.path.join(sub_dir, "scatter_%s.png" % mode), title="%s processing (%s): %s vs %s" % ( _display_identifier(mode), cohort_label, label_a, label_b), max_points=max_scatter_points) summary_table_path = os.path.join(processing_dir, "summary_table.csv") if os.path.isfile(summary_table_path): summary = _read_optional_csv(summary_table_path) _safe_plot( "processing macro bars", _save_macro_bars, plt, summary, sub_dir, label_a, label_b, "Processing (%s)" % cohort_label) _save_component_paper_plots( plt, processing_dir, paper_dir, "processing", PROCESSING_MODES, "processing_score", label_a, label_b, title_prefix="Processing score (%s)" % cohort_label, ) # --------------------------------------------------------------------------- # presentation # --------------------------------------------------------------------------- def _plot_presentation(input_dir, plot_dir, labels, max_scatter_points): import matplotlib.pyplot as plt from sklearn.metrics import ( average_precision_score, precision_recall_curve, roc_auc_score, roc_curve, ) sub_dir = os.path.join(plot_dir, "presentation") os.makedirs(sub_dir, exist_ok=True) paper_dir = os.path.join(plot_dir, "paper") os.makedirs(paper_dir, exist_ok=True) label_a, label_b = labels["a"], labels["b"] presentation_dir = os.path.join(input_dir, "presentation") for mode in PRESENTATION_MODES: pred_path = os.path.join( presentation_dir, "predictions_%s.csv.bz2" % mode) if not os.path.isfile(pred_path): continue df = pandas.read_csv(pred_path) for score_kind in PRESENTATION_SCORE_KINDS: a_score = _score_values(df, "a", score_kind) b_score = _score_values(df, "b", score_kind) y = df.hit.values stub = "%s_%s" % (mode, score_kind) _save_roc(plt, roc_curve, roc_auc_score, y, a_score, b_score, label_a, label_b, os.path.join(sub_dir, "roc_%s.png" % stub), title="%s ROC (%s)" % ( _display_identifier(mode), _display_score_kind(score_kind))) _save_pr(plt, precision_recall_curve, average_precision_score, y, a_score, b_score, label_a, label_b, os.path.join(sub_dir, "pr_%s.png" % stub), title="%s PR (%s)" % ( _display_identifier(mode), _display_score_kind(score_kind))) _save_scatter(plt, b_score, a_score, label_b, label_a, os.path.join(sub_dir, "scatter_%s.png" % stub), title="%s (%s): %s vs %s" % ( _display_identifier(mode), _display_score_kind(score_kind), label_a, label_b), max_points=max_scatter_points) summary_table_path = os.path.join(presentation_dir, "summary_table.csv") if os.path.isfile(summary_table_path): summary = _read_optional_csv(summary_table_path) _safe_plot( "presentation macro bars", _save_macro_bars, plt, summary, sub_dir, label_a, label_b, "Presentation") for score_kind in PRESENTATION_SCORE_KINDS: suffix = "" if score_kind == "presentation_score" else "_%s" % score_kind _save_component_paper_plots( plt, presentation_dir, paper_dir, "presentation", PRESENTATION_MODES, score_kind, label_a, label_b, name_suffix=suffix, title_prefix=_score_kind_title(score_kind), ) def _score_values(df, prefix, score_kind): """Higher = better; mirror the convention from compare_models.""" if score_kind == "presentation_score": return df["%s_presentation_score" % prefix].values if score_kind == "presentation_percentile": return -df["%s_presentation_percentile" % prefix].values if score_kind == "processing_score": return df["%s_processing_score" % prefix].values raise ValueError("Unknown score kind: %s" % score_kind) def _plot_release_summary(input_dir, paper_dir, labels): import matplotlib.pyplot as plt summary_path = os.path.join(input_dir, "release_summary.csv") if not os.path.isfile(summary_path): return summary = _read_optional_csv(summary_path) if summary.empty: return required = {"average", "component", "metric", "side_a", "side_b", "diff"} if not required.issubset(summary.columns): return # Processing uses a different matched risk-set prevalence. Its own panels # compare sides on that cohort; do not mix these absolute metrics with PS. macro = summary.loc[(summary.average == "Macro") & (summary.component != "processing")].copy() if macro.empty: return macro["plot_group"] = macro.apply(_release_summary_group_label, axis=1) ordered_groups = list(dict.fromkeys(macro["plot_group"])) fig, axes = plt.subplots( 1, len(METRIC_NAMES), figsize=(3.2 * len(METRIC_NAMES), 3.6), squeeze=False, ) for ax, metric in zip(axes[0], METRIC_NAMES): rows = macro.loc[macro.metric == METRIC_DISPLAY_NAMES[metric]] rows = ( rows.groupby("plot_group", as_index=False)[ ["side_a", "side_b", "diff"] ] .mean() ) rows = rows.set_index("plot_group").reindex(ordered_groups) x = numpy.arange(len(rows)) width = 0.36 ax.bar( x - width / 2, rows.side_a, width, label=labels["a"], color=SIDE_A_COLOR, edgecolor="white", linewidth=0.5) ax.bar( x + width / 2, rows.side_b, width, label=labels["b"], color=SIDE_B_COLOR, edgecolor="white", linewidth=0.5) ax.set_title(METRIC_DISPLAY_NAMES[metric]) ax.set_xticks(x) ax.set_xticklabels(rows.index, rotation=35, ha="right") ax.set_ylim(_metric_ylim(metric, rows[["side_a", "side_b"]].values)) ax.grid(axis="y") axes[0][0].set_ylabel("Macro mean") handles, legend_labels = axes[0][-1].get_legend_handles_labels() fig.suptitle("Model comparison: macro accuracy by component", y=0.98) fig.legend( handles, legend_labels, frameon=False, loc="upper center", bbox_to_anchor=(0.5, 0.91), ncol=2, ) fig.tight_layout(rect=(0, 0, 1, 0.80)) _save_figure(fig, os.path.join(paper_dir, "release_summary_macro.png")) plt.close(fig) fig, axes = plt.subplots( 1, len(METRIC_NAMES), figsize=(3.2 * len(METRIC_NAMES), 3.6), squeeze=False, ) for ax, metric in zip(axes[0], METRIC_NAMES): rows = macro.loc[macro.metric == METRIC_DISPLAY_NAMES[metric]] rows = ( rows.groupby("plot_group", as_index=False)[ ["side_a", "side_b", "diff"] ] .mean() ) rows = rows.set_index("plot_group").reindex(ordered_groups) values = rows["diff"].values ax.bar( numpy.arange(len(rows)), values, color=_delta_colors(values), edgecolor="white", linewidth=0.5) ax.axhline(0, color=DIAGONAL_COLOR, linewidth=0.8) ax.set_title(METRIC_DISPLAY_NAMES[metric]) ax.set_xticks(numpy.arange(len(rows))) ax.set_xticklabels(rows.index, rotation=35, ha="right") ax.grid(axis="y") axes[0][0].set_ylabel("Macro difference") fig.suptitle("Model comparison: macro deltas by component", y=0.98) fig.text( 0.5, 0.90, "%s − %s" % (labels["a"], labels["b"]), ha="center", va="top", ) fig.tight_layout(rect=(0, 0, 1, 0.80)) _save_figure(fig, os.path.join(paper_dir, "release_summary_macro_delta.png")) plt.close(fig) def _release_summary_group_label(row): component = row.get("component", "") mode = row.get("flank_mode", "") if isinstance(mode, str) and mode: return "%s\n%s" % ( _display_identifier(component), _display_identifier(mode)) return _display_identifier(row.get("eval", component)) def _save_component_paper_plots( plt, component_dir, paper_dir, component, modes, score_kind, label_a, label_b, name_suffix="", title_prefix=None): if title_prefix is None: title_prefix = component.title() sample_frames = [] length_frames = [] for mode in modes: sample_path = os.path.join( component_dir, "per_sample_%s_%s.csv" % (mode, score_kind)) if os.path.isfile(sample_path): sample = _read_optional_csv(sample_path) if not sample.empty: sample_frames.append((mode, sample)) length_path = os.path.join( component_dir, "per_length_%s_%s.csv" % (mode, score_kind)) if os.path.isfile(length_path): length_df = _read_optional_csv(length_path) if not length_df.empty: length_frames.append((mode, length_df)) if sample_frames: _save_metric_scatter_grid( plt, sample_frames, os.path.join( paper_dir, "%s_per_sample_scatter%s.png" % (component, name_suffix)), label_a, label_b, "%s per-sample accuracy" % title_prefix, ) _save_metric_delta_boxplots( plt, sample_frames, os.path.join( paper_dir, "%s_per_sample_delta_boxplots%s.png" % ( component, name_suffix)), "%s per-sample deltas" % title_prefix, label_a, label_b, ) if length_frames: _save_per_length_grid( plt, length_frames, os.path.join( paper_dir, "%s_per_length_macro%s.png" % (component, name_suffix)), label_a, label_b, "%s by peptide length" % title_prefix, ) def _save_metric_scatter_grid( plt, frames, out_path, label_a, label_b, title, average=None): n_rows = len(frames) n_cols = len(METRIC_NAMES) fig, axes = plt.subplots( n_rows, n_cols, figsize=(3.0 * n_cols, 2.7 * n_rows), squeeze=False, ) for row_idx, (row_label, df) in enumerate(frames): for col_idx, metric in enumerate(METRIC_NAMES): ax = axes[row_idx][col_idx] a_col, b_col = _metric_columns(metric, average=average) if a_col not in df.columns or b_col not in df.columns: ax.axis("off") continue x = df[b_col].to_numpy(dtype=float) y = df[a_col].to_numpy(dtype=float) mask = numpy.isfinite(x) & numpy.isfinite(y) if not mask.any(): ax.axis("off") continue x = x[mask] y = y[mask] colors = _winner_colors(x, y) ax.scatter( x, y, s=13, alpha=0.72, linewidths=0.15, edgecolors="white", c=colors) low, high = _metric_ylim(metric, numpy.concatenate([x, y])) ax.plot([low, high], [low, high], color=DIAGONAL_COLOR, linewidth=0.8) ax.set_xlim(low, high) ax.set_ylim(low, high) ax.grid(False) ax.set_title(METRIC_DISPLAY_NAMES[metric]) row_display = _display_identifier(row_label) if col_idx == 0: ax.set_ylabel("%s\n%s" % (row_display, label_a)) else: ax.set_ylabel(label_a) ax.set_xlabel(label_b) ax.text( 0.04, 0.96, "n=%d\nmean Δ=%+.3f" % (len(x), numpy.nanmean(y - x)), transform=ax.transAxes, va="top", ha="left", fontsize=8, bbox={"boxstyle": "round,pad=0.2", "fc": "white", "ec": "0.85"}, ) fig.suptitle(title) fig.tight_layout() _save_figure(fig, out_path) plt.close(fig) def _save_metric_delta_boxplots( plt, frames, out_path, title, label_a, label_b): fig, axes = plt.subplots( 1, len(METRIC_NAMES), figsize=(3.0 * len(METRIC_NAMES), 3.0), squeeze=False, ) labels = [_display_identifier(label) for (label, _) in frames] for ax, metric in zip(axes[0], METRIC_NAMES): a_col, b_col = _metric_columns(metric) data = [] for _, df in frames: if a_col not in df.columns or b_col not in df.columns: data.append([]) continue values = (df[a_col] - df[b_col]).dropna().values data.append(values) try: artists = ax.boxplot( data, tick_labels=labels, showfliers=False, patch_artist=True) except TypeError: artists = ax.boxplot( data, labels=labels, showfliers=False, patch_artist=True) _style_boxplot(artists) ax.axhline(0, color=DIAGONAL_COLOR, linewidth=0.8) ax.set_title(METRIC_DISPLAY_NAMES[metric]) ax.set_ylabel("%s - %s" % (label_a, label_b)) ax.tick_params(axis="x", labelrotation=25) ax.grid(axis="y") fig.suptitle(title) fig.tight_layout() _save_figure(fig, out_path) plt.close(fig) def _save_per_length_grid( plt, frames, out_path, label_a, label_b, title): n_rows = len(frames) n_cols = len(METRIC_NAMES) fig, axes = plt.subplots( n_rows, n_cols, figsize=(3.2 * n_cols, 2.6 * n_rows), squeeze=False, ) legend_handles = None legend_labels = None for row_idx, (row_label, df) in enumerate(frames): if "length" not in df.columns: for ax in axes[row_idx]: ax.axis("off") continue x = numpy.arange(len(df)) lengths = [str(v) for v in df["length"]] width = 0.36 for col_idx, metric in enumerate(METRIC_NAMES): ax = axes[row_idx][col_idx] a_col, b_col = _metric_columns(metric, average="macro") if a_col not in df.columns or b_col not in df.columns: ax.axis("off") continue ax.bar( x - width / 2, df[a_col], width, label=label_a, color=SIDE_A_COLOR, edgecolor="white", linewidth=0.5) ax.bar( x + width / 2, df[b_col], width, label=label_b, color=SIDE_B_COLOR, edgecolor="white", linewidth=0.5) ax.set_title(METRIC_DISPLAY_NAMES[metric]) ax.set_xticks(x) ax.set_xticklabels(lengths) ax.set_xlabel("Peptide length") ax.set_ylim(_metric_ylim(metric, df[[a_col, b_col]].values)) ax.grid(axis="y") if col_idx == 0: ax.set_ylabel("%s\nMacro mean" % ( _display_identifier(row_label))) else: ax.set_ylabel("Macro mean") if row_idx == 0 and col_idx == n_cols - 1: legend_handles, legend_labels = ax.get_legend_handles_labels() if legend_handles: fig.legend( legend_handles, legend_labels, loc="lower center", ncol=len(legend_labels), frameon=False, bbox_to_anchor=(0.5, 0.0), ) fig.suptitle(title) fig.tight_layout(rect=(0.0, 0.06, 1.0, 0.96)) _save_figure(fig, out_path) plt.close(fig) def _metric_columns(metric, average=None): if average is None: return "a_%s" % metric, "b_%s" % metric return "a_%s_%s" % (average, metric), "b_%s_%s" % (average, metric) def _winner_colors(x_values, y_values): return [ SIDE_A_COLOR if y_value >= x_value else SIDE_B_COLOR for x_value, y_value in zip(x_values, y_values) ] def _delta_colors(values): values = numpy.asarray(values, dtype=float) return [ POSITIVE_DELTA_COLOR if value >= 0 else NEGATIVE_DELTA_COLOR for value in values ] def _style_boxplot(artists): for patch in artists.get("boxes", []): patch.set_facecolor(SIDE_A_COLOR) patch.set_alpha(0.35) patch.set_edgecolor("0.30") patch.set_linewidth(0.8) for median in artists.get("medians", []): median.set_color("0.15") median.set_linewidth(1.1) for key in ("whiskers", "caps"): for artist in artists.get(key, []): artist.set_color("0.35") artist.set_linewidth(0.8) def _metric_ylim(metric, values): values = numpy.asarray(values, dtype=float) values = values[numpy.isfinite(values)] if values.size == 0: return 0.0, 1.0 if metric == "roc_auc": low = min(0.5, max(0.0, float(values.min()) - 0.03)) else: low = 0.0 high = min(1.0, max(0.1, float(values.max()) + 0.04)) return low, high def _write_summary_pdf( plot_dir, out_path, include_paper_figures=False, paper_figures_dir=None): plot_dir = Path(plot_dir) out_path = Path(out_path) out_path.parent.mkdir(parents=True, exist_ok=True) pdfs = _summary_pdf_paths( plot_dir, out_path, include_paper_figures, paper_figures_dir) if pdfs: try: try: pdf_reader, pdf_writer = _pdf_reader_writer() except ImportError: _write_summary_pdf_from_pngs( plot_dir, out_path, include_paper_figures, paper_figures_dir) return writer = pdf_writer() for path in pdfs: reader = pdf_reader(str(path)) for page in reader.pages: writer.add_page(page) with open(out_path, "wb") as fd: writer.write(fd) return except Exception as e: print( "WARNING: PDF merge failed; rebuilding summary from PNGs: " "%s: %s" % (type(e).__name__, e)) try: out_path.unlink() except FileNotFoundError: pass _write_summary_pdf_from_pngs( plot_dir, out_path, include_paper_figures, paper_figures_dir) return _write_summary_pdf_from_pngs( plot_dir, out_path, include_paper_figures, paper_figures_dir) def _summary_pdf_paths( plot_dir, out_path, include_paper_figures=False, paper_figures_dir=None): result = [] paper_pdfs = [] for path in sorted(Path(plot_dir).rglob("*.pdf")): if _include_pdf_in_summary( path, plot_dir, out_path, include_paper_figures, paper_figures_dir): if _is_combined_paper_figures_pdf( path, plot_dir, paper_figures_dir): _append_unique_path(paper_pdfs, path) else: _append_unique_path(result, path) if include_paper_figures: for paper_dir in _paper_figure_dirs(plot_dir, paper_figures_dir): paper_pdf = Path(paper_dir) / "paper_figures.pdf" if paper_pdf.is_file(): _append_unique_path(paper_pdfs, paper_pdf) return paper_pdfs + result def _append_unique_path(paths, path, prepend=False): path = Path(path) resolved = path.resolve() if any(existing.resolve() == resolved for existing in paths): return if prepend: paths.insert(0, path) else: paths.append(path) def _paper_figure_dirs(plot_dir, paper_figures_dir=None): result = [] if paper_figures_dir: result.append(Path(paper_figures_dir)) plot_dir = Path(plot_dir) result.extend([plot_dir / "paper_figures", plot_dir / "paper_2023"]) unique = [] for path in result: resolved = path.resolve() if not any(existing.resolve() == resolved for existing in unique): unique.append(path) return tuple(unique) def _is_combined_paper_figures_pdf(path, plot_dir, paper_figures_dir=None): path = Path(path) if path.name != "paper_figures.pdf": return False return any( path.parent.resolve() == Path(paper_dir).resolve() for paper_dir in _paper_figure_dirs(plot_dir, paper_figures_dir) ) def _path_is_relative_to(path, directory): try: Path(path).resolve().relative_to(Path(directory).resolve()) return True except ValueError: return False def _include_pdf_in_summary( path, plot_dir, out_path, include_paper_figures, paper_figures_dir=None): path = Path(path) plot_dir = Path(plot_dir) out_path = Path(out_path) if path.resolve() == out_path.resolve(): return False for paper_dir in _paper_figure_dirs(plot_dir, paper_figures_dir): if _path_is_relative_to(path, paper_dir): return ( include_paper_figures and path.name == "paper_figures.pdf" and path.parent.resolve() == Path(paper_dir).resolve() ) try: relative_parts = path.relative_to(plot_dir).parts except ValueError: return False return len(relative_parts) > 1 def _pdf_reader_writer(): try: from pypdf import PdfReader, PdfWriter return PdfReader, PdfWriter except ImportError: try: from PyPDF2 import PdfReader, PdfWriter return PdfReader, PdfWriter except ImportError as e: raise ImportError("pypdf or PyPDF2 is required") from e def _include_png_in_summary( path, plot_dir, out_path, include_paper_figures, paper_figures_dir=None): path = Path(path) plot_dir = Path(plot_dir) out_path = Path(out_path) if path.resolve() == out_path.resolve(): return False for paper_dir in _paper_figure_dirs(plot_dir, paper_figures_dir): if _path_is_relative_to(path, paper_dir): return include_paper_figures try: relative_parts = path.relative_to(plot_dir).parts except ValueError: return False return len(relative_parts) > 1 def _write_summary_pdf_from_pngs( plot_dir, out_path, include_paper_figures=False, paper_figures_dir=None): import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages plot_dir = Path(plot_dir) out_path = Path(out_path) out_path.parent.mkdir(parents=True, exist_ok=True) pngs = [] if include_paper_figures: for paper_dir in _paper_figure_dirs(plot_dir, paper_figures_dir): for path in sorted(Path(paper_dir).rglob("*.png")): if _include_png_in_summary( path, plot_dir, out_path, include_paper_figures, paper_figures_dir): _append_unique_path(pngs, path) for path in sorted(plot_dir.rglob("*.png")): if _include_png_in_summary( path, plot_dir, out_path, include_paper_figures, paper_figures_dir): _append_unique_path(pngs, path) if not pngs: return paper = [path for path in pngs if "paper" in path.parts] rest = [path for path in pngs if path not in paper] ordered = paper + rest with PdfPages(out_path) as pdf: for path in ordered: image = plt.imread(path) fig = plt.figure(figsize=(11.0, 8.5)) ax = fig.add_axes([0.04, 0.06, 0.92, 0.84]) ax.imshow(image) ax.axis("off") try: title = str(path.relative_to(plot_dir)) except ValueError: title = str(path) fig.suptitle(title, fontsize=10) pdf.savefig(fig) plt.close(fig) def _save_figure(fig, out_path): path = Path(out_path) path.parent.mkdir(parents=True, exist_ok=True) fig.savefig(path, dpi=300, bbox_inches="tight") if path.suffix.lower() == ".png": fig.savefig(path.with_suffix(".pdf"), bbox_inches="tight") def _save_macro_bars(plt, summary, sub_dir, label_a, label_b, title_prefix): if summary.empty: return required = {"mode", "score_kind"} for metric in METRIC_NAMES: required.add("a_macro_%s" % metric) required.add("b_macro_%s" % metric) if not required.issubset(summary.columns): return x_labels = [ "%s\n%s" % ( _display_identifier(row.mode), _display_score_kind(row.score_kind), ) for row in summary.itertuples() ] x = numpy.arange(len(summary)) width = 0.38 for metric in METRIC_NAMES: fig, ax = plt.subplots(figsize=(7.1, 3.0)) ax.bar( x - width / 2, summary["a_macro_%s" % metric], width, label=label_a, color=SIDE_A_COLOR, edgecolor="white", linewidth=0.5, ) ax.bar( x + width / 2, summary["b_macro_%s" % metric], width, label=label_b, color=SIDE_B_COLOR, edgecolor="white", linewidth=0.5, ) ax.set_xticks(x) ax.set_xticklabels(x_labels, rotation=30, ha="right") ax.set_ylabel(METRIC_DISPLAY_NAMES[metric]) ax.set_title("%s: macro %s over samples" % ( title_prefix, METRIC_DISPLAY_NAMES[metric])) ax.set_ylim(_metric_ylim( metric, summary[["a_macro_%s" % metric, "b_macro_%s" % metric]].values, )) ax.grid(axis="y") ax.legend(frameon=False, loc="upper left", bbox_to_anchor=(1.0, 1.0)) fig.tight_layout() _save_figure(fig, os.path.join(sub_dir, "macro_%s.png" % metric)) plt.close(fig) # --------------------------------------------------------------------------- # Shared plot helpers # --------------------------------------------------------------------------- def _save_roc(plt, roc_curve_fn, roc_auc_fn, y, a_score, b_score, label_a, label_b, out_path, title): figsize, legend_kwargs = _curve_legend_layout(label_a, label_b) fig, ax = plt.subplots(figsize=figsize) y, a_score, b_score = _shared_finite_curve_values(y, a_score, b_score) for label, values, color in ( (label_a, a_score, SIDE_A_COLOR), (label_b, b_score, SIDE_B_COLOR)): if len(y) == 0 or len(numpy.unique(y)) < 2: continue fpr, tpr, _ = roc_curve_fn(y, values) auc = roc_auc_fn(y, values) ax.plot( fpr, tpr, label="%s AUC=%.3f" % (label, auc), color=color, linewidth=1.6) ax.plot([0, 1], [0, 1], color=DIAGONAL_COLOR, linewidth=0.8) ax.set_xlabel("False positive rate") ax.set_ylabel("True positive rate") ax.set_title(title) if ax.get_legend_handles_labels()[0]: ax.legend(frameon=False, **legend_kwargs) ax.grid(False) fig.tight_layout() _save_figure(fig, out_path) plt.close(fig) def _save_pr(plt, pr_curve_fn, ap_fn, y, a_score, b_score, label_a, label_b, out_path, title): figsize, legend_kwargs = _curve_legend_layout(label_a, label_b) fig, ax = plt.subplots(figsize=figsize) y, a_score, b_score = _shared_finite_curve_values(y, a_score, b_score) for label, values, color in ( (label_a, a_score, SIDE_A_COLOR), (label_b, b_score, SIDE_B_COLOR)): if len(y) == 0 or len(numpy.unique(y)) < 2: continue precision, recall, _ = pr_curve_fn(y, values) ap = ap_fn(y, values) ax.plot( recall, precision, label="%s AP=%.3f" % (label, ap), color=color, linewidth=1.6) ax.set_xlabel("Recall") ax.set_ylabel("Precision") ax.set_title(title) if ax.get_legend_handles_labels()[0]: ax.legend(frameon=False, **legend_kwargs) ax.grid(False) fig.tight_layout() _save_figure(fig, out_path) plt.close(fig) def _curve_legend_layout(*labels): """Keep long comparison labels clear of curve axes and tick labels.""" if max((len(str(label)) for label in labels), default=0) <= 32: return (3.2, 3.0), {} return (4.2, 3.6), { "bbox_to_anchor": (0.5, -0.20), "handlelength": 1.5, "loc": "upper center", "fontsize": 8, } def _shared_finite_curve_values(y, a_score, b_score): """Return paired finite inputs for an A/B diagnostic curve.""" y = numpy.asarray(y) a_score = numpy.asarray(a_score, dtype=float) b_score = numpy.asarray(b_score, dtype=float) mask = numpy.isfinite(y) & numpy.isfinite(a_score) & numpy.isfinite(b_score) return y[mask], a_score[mask], b_score[mask] def _save_scatter(plt, x_score, y_score, x_label, y_label, out_path, title, max_points): mask = numpy.isfinite(x_score) & numpy.isfinite(y_score) idx = numpy.flatnonzero(mask) if len(idx) == 0: return if len(idx) > max_points: rng = numpy.random.default_rng(17) idx = rng.choice(idx, size=max_points, replace=False) x = x_score[idx] y = y_score[idx] fig, ax = plt.subplots(figsize=(3.2, 3.0)) ax.scatter( x, y, s=7, alpha=0.42, c=_winner_colors(x, y), edgecolors="none", rasterized=False, ) _add_identity_line(ax, x, y) ax.set_xlabel(x_label) ax.set_ylabel(y_label) ax.set_title(title) ax.grid(False) fig.tight_layout() _save_figure(fig, out_path) plt.close(fig) def _add_identity_line(ax, x, y): finite = numpy.concatenate([ numpy.asarray(x, dtype=float), numpy.asarray(y, dtype=float), ]) finite = finite[numpy.isfinite(finite)] if finite.size == 0: return low = float(finite.min()) high = float(finite.max()) if high <= low: pad = max(abs(high) * 0.05, 0.01) low -= pad high += pad else: pad = (high - low) * 0.05 low -= pad high += pad ax.plot([low, high], [low, high], color=DIAGONAL_COLOR, linewidth=0.8) ax.set_xlim(low, high) ax.set_ylim(low, high) ax.set_aspect("equal", adjustable="box") def _display_identifier(value): return str(value).replace("_", " ") def _display_score_kind(value): display = { "presentation_score": "presentation score", "presentation_percentile": "presentation percentile", "processing_score": "processing score", } return display.get(str(value), _display_identifier(value)) def _score_kind_title(value): display = { "presentation_score": "Presentation score", "presentation_percentile": "Presentation percentile rank", "processing_score": "Processing score", } return display.get(str(value), _display_score_kind(value).title()) # Module-level parser for sphinx autoprogram; behaves like the legacy # ``mhcflurry-*`` command modules. parser = make_parser() mhcflurry-2.3.6/mhcflurry/cli/predict_command.py000066400000000000000000000452561525677230600220520ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Predict binding affinity, antigen processing and presentation for peptides. Provide a CSV or use --alleles and --peptides. Use --affinity-only for binding affinity alone. Results go to stdout unless --out is given. Examples: mhcflurry predict INPUT.csv --out RESULT.csv mhcflurry predict --alleles HLA-A0201 --peptides SIINFEKL DENDREKLLL mhcflurry predict --alleles 'HLA-A*02:01;HLA-A*03:01' --peptides SIINFEKL CSV columns: allele, peptide, n_flank and c_flank. Available N/C flanks are used by default; use --no-flanking to compare without sequence context. Flank columns may be omitted when context is unavailable. Input columns are preserved in the output. Separate --alleles arguments are independent queries, each scored against every peptide. Delimit alleles within a CSV cell or quoted argument with commas, semicolons or spaces to score one MHC allele set; its row reports the strongest binding allele. """ import sys import itertools import logging import os import re from .help import HelpArgumentParser from ..downloads import get_default_class1_presentation_models_dir, get_model_release_dir from ..parallelism import add_prediction_parallelism_args from ..version import __version__ parser = HelpArgumentParser( usage="%(prog)s [OPTIONS] [INPUT.csv]", description=__doc__, add_help=False) input_args = parser.add_argument_group(title="Input (required)") input_args.add_argument( "input", metavar="INPUT.csv", nargs="?", help="Input CSV") input_args.add_argument( "--alleles", metavar="ALLELE", nargs="+", help="MHC allele or allele-set queries (exclusive with an input CSV). " "Separate arguments are independent queries; delimit alleles within one " "argument with ';' or ',' to score them as one MHC allele set.") input_args.add_argument( "--peptides", metavar="PEPTIDE", nargs="+", help="Peptides to predict (exclusive with passing an input CSV)") input_mod_args = parser.add_argument_group(title="Input options") input_mod_args.add_argument( "--allele-column", metavar="NAME", default="allele", help="Input column name for MHC allele or delimited allele-set queries. " "Default: '%(default)s'") input_mod_args.add_argument( "--peptide-column", metavar="NAME", default="peptide", help="Input column name for peptides. Default: '%(default)s'") input_mod_args.add_argument( "--n-flank-column", metavar="NAME", default="n_flank", help="Column giving N-terminal flanking sequence. Default: '%(default)s'") input_mod_args.add_argument( "--c-flank-column", metavar="NAME", default="c_flank", help="Column giving C-terminal flanking sequence. Default: '%(default)s'") input_mod_args.add_argument( "--no-throw", action="store_true", default=False, help="Return NaNs for unsupported alleles or peptides instead of raising") output_args = parser.add_argument_group(title="Output options") output_args.add_argument( "--out", metavar="OUTPUT.csv", help="Output CSV") output_args.add_argument( "--prediction-column-prefix", metavar="NAME", default="mhcflurry_", help="Prefix for output column names. Default: ``%(default)s``") output_args.add_argument( "--output-delimiter", metavar="CHAR", default=",", help="Delimiter character for results. Default: '%(default)s'") output_args.add_argument( "--no-affinity-percentile", default=False, action="store_true", help="Do not include affinity percentile rank") output_args.add_argument( "--always-include-best-allele", default=False, action="store_true", help="Always include the best_allele column even when it is identical " "to the allele column (i.e. all queries are monoallelic).") model_args = parser.add_argument_group(title="Model options") model_selection = model_args.add_mutually_exclusive_group() model_selection.add_argument( "--models", metavar="DIR", default=None, help="Directory containing models. Either a binding affinity predictor or " "a presentation predictor can be used. " "Default: %s" % get_default_class1_presentation_models_dir( test_exists=False)) model_selection.add_argument( "--model-release", metavar="RELEASE", help="Use the presentation weights from a download release, overriding model " "path defaults. List choices: mhcflurry downloads releases models_class1_presentation.") model_args.add_argument( "--affinity-only", action="store_true", default=False, help="Affinity prediction only (no antigen processing or presentation)") model_args.add_argument( "--no-flanking", action="store_true", default=False, help="Do not use flanking sequence information even when available") add_prediction_parallelism_args(parser) helper_args = parser.add_argument_group(title="Help") helper_args.add_argument( "-h", "--help", action="help", help="Show this help message and exit" ) helper_args.add_argument( "--list-supported-alleles", action="store_true", default=False, help="Prints the list of supported alleles and exits" ) helper_args.add_argument( "--list-supported-peptide-lengths", action="store_true", default=False, help="Prints the list of supported peptide lengths and exits" ) helper_args.add_argument( "--version", action="version", version="mhcflurry %s" % __version__, ) _PREDICTOR_CACHE = {} _ALLELE_LIST_DELIMITER_RE = re.compile(r"[;,\s]+") def _split_allele_string(allele_string): return [ allele for allele in _ALLELE_LIST_DELIMITER_RE.split(str(allele_string)) if allele ] def _detect_affinity_only_models(models_dir): """ Detect whether ``models_dir`` is an affinity-only bundle without importing torch or loading the predictor. We need this in the CLI before deciding whether to fork worker processes: on Linux the parent must stay CUDA-clean so per-worker ``CUDA_VISIBLE_DEVICES`` pinning takes effect. A presentation bundle is identified by the presence of ``weights.csv`` at the top level. """ return not os.path.exists(os.path.join(models_dir, "weights.csv")) def _load_predictor_for_command(models_dir): """ Load a presentation predictor or wrap an affinity-only predictor. Returns ------- tuple ``(predictor, affinity_only_models)``. """ from ..class1_presentation_predictor import Class1PresentationPredictor from ..class1_affinity_predictor import Class1AffinityPredictor cache_key = os.path.abspath(models_dir) if cache_key not in _PREDICTOR_CACHE: if os.path.exists(os.path.join(models_dir, "weights.csv")): predictor = Class1PresentationPredictor.load(models_dir) affinity_only_models = False else: affinity_predictor = Class1AffinityPredictor.load(models_dir) predictor = Class1PresentationPredictor( affinity_predictor=affinity_predictor) affinity_only_models = True _PREDICTOR_CACHE[cache_key] = (predictor, affinity_only_models) return _PREDICTOR_CACHE[cache_key] def _allele_string_to_alleles(df, allele_column): return ( df.drop_duplicates(allele_column).set_index( allele_column, drop=False)[ allele_column ].map(_split_allele_string)).to_dict() def _predict_dataframe_chunk(predictor, df, options): allele_string_to_alleles = _allele_string_to_alleles( df, options["allele_column"]) if options["affinity_only"]: predictions = predictor.predict_affinity( peptides=df[options["peptide_column"]].values, alleles=allele_string_to_alleles, sample_names=df[options["allele_column"]], throw=options["throw"], include_affinity_percentile=options[ "include_affinity_percentile"], model_kwargs=options["affinity_model_kwargs"]) else: n_flanks = None c_flanks = None if options["use_flanking"]: n_flanks = df[options["n_flank_column"]].values c_flanks = df[options["c_flank_column"]].values predictions = predictor.predict( peptides=df[options["peptide_column"]].values, n_flanks=n_flanks, c_flanks=c_flanks, alleles=allele_string_to_alleles, sample_names=df[options["allele_column"]], throw=options["throw"], include_affinity_percentile=options[ "include_affinity_percentile"], affinity_model_kwargs=options["affinity_model_kwargs"], processing_batch_size=options["processing_batch_size"]) predictions = predictions.reset_index(drop=True) predictions.index = df.index if "peptide_num" in predictions.columns: predictions["peptide_num"] = predictions.index return predictions def _predict_dataframe_chunk_worker(work_item): predictor, _ = _load_predictor_for_command(work_item["models_dir"]) predictions = _predict_dataframe_chunk( predictor, work_item["dataframe"], work_item["options"]) return work_item["chunk_num"], predictions def run(argv=sys.argv[1:]): if not argv: parser.print_help() parser.exit(1) args = parser.parse_args(argv) try: selected_models_dir = ( get_model_release_dir(args.model_release) if args.model_release else None) except (ValueError, RuntimeError) as error: parser.error(str(error)) import pandas from ..parallelism import ( chunk_ranges_for_local_parallelism, num_workers_per_gpu_from_args, worker_pool_with_gpu_assignments_from_args, ) from ..pytorch_sizing import default_prediction_batch_is_auto from ..workload_planning import ( WORKLOAD_AFFINITY_INFERENCE, WORKLOAD_PRESENTATION_INFERENCE, model_artifact_size_bytes, path_size_bytes, ) # It's hard to pass a tab in a shell, so we correct a common error: if args.output_delimiter == "\\t": args.output_delimiter = "\t" models_dir = args.models or selected_models_dir if models_dir is None: # The reason we set the default here instead of in the argument parser # is that we want to test_exists at this point, so the user gets a # message instructing them to download the models if needed. models_dir = get_default_class1_presentation_models_dir(test_exists=True) # Detect models type by file presence so the parent stays torch-free # on paths that will fork workers. Workers pin to GPUs via # CUDA_VISIBLE_DEVICES, which only works when the parent has not # initialized CUDA. affinity_only_models = _detect_affinity_only_models(models_dir) if affinity_only_models and not args.affinity_only: logging.warning( "Specified models are an affinity predictor, which implies " "--affinity-only. Specify this argument to silence this warning.") args.affinity_only = True if args.list_supported_alleles: predictor, _ = _load_predictor_for_command(models_dir) print("\n".join(predictor.supported_alleles)) return if args.list_supported_peptide_lengths: predictor, _ = _load_predictor_for_command(models_dir) min_len, max_len = predictor.supported_peptide_lengths print("\n".join([str(length) for length in range(min_len, max_len + 1)])) return if args.input: if args.alleles or args.peptides: parser.error( "If an input file is specified, do not specify --alleles " "or --peptides") df = pandas.read_csv(args.input) print( "Read input CSV with %d rows, columns are: %s" % ( len(df), ", ".join(df.columns)), file=sys.stderr) for col in [args.allele_column, args.peptide_column]: if col not in df.columns: raise ValueError( "No such column '%s' in CSV. Columns are: %s" % ( col, ", ".join(["'%s'" % c for c in df.columns]))) else: if not args.alleles or not args.peptides: parser.error( "Specify either an input CSV file or both the " "--alleles and --peptides arguments") pairs = list(itertools.product(args.alleles, args.peptides)) df = pandas.DataFrame({ "allele": [p[0] for p in pairs], "peptide": [p[1] for p in pairs], }) logging.info( "Predicting for %d alleles and %d peptides = %d predictions" % ( len(args.alleles), len(args.peptides), len(df))) df = df.reset_index(drop=True) allele_string_to_alleles = _allele_string_to_alleles( df, args.allele_column) use_flanking = ( not args.no_flanking and args.n_flank_column in df.columns and args.c_flank_column in df.columns ) if not args.affinity_only and not args.no_flanking and not use_flanking: logging.warning( "No flanking information provided. Specify --no-flanking " "to silence this warning") workload_name = ( WORKLOAD_AFFINITY_INFERENCE if args.affinity_only else WORKLOAD_PRESENTATION_INFERENCE ) workload_hints = { "data_bytes": path_size_bytes(args.input), "elastic_batch": default_prediction_batch_is_auto(), "model_bytes": model_artifact_size_bytes(models_dir), "prediction_rows": len(df), } if len(df) == 0: # No rows means no worker pool. Build a zero-row DataFrame that # carries the same prediction-column schema the populated path # would have produced, so downstream readers and threshold # filters don't choke on a schema-less object. Mirrors the # predict-scan empty-input fast path. predictor, _ = _load_predictor_for_command(models_dir) predictions = pandas.DataFrame( columns=predictor.predict_columns( affinity_only=args.affinity_only, use_flanking=use_flanking, include_affinity_percentile=( not args.no_affinity_percentile), )) predictions.index = df.index else: worker_pool = worker_pool_with_gpu_assignments_from_args( args, workload_name=workload_name, workload_hints=workload_hints, # Workers run PyTorch inference and pin to GPUs via # CUDA_VISIBLE_DEVICES. Force spawn so they don't inherit # any PyTorch / CUDA state from the parent (matches predict-scan). start_method="spawn", ) affinity_model_kwargs = {} if hasattr(args, "max_workers_per_gpu"): affinity_model_kwargs["num_workers_per_gpu"] = ( num_workers_per_gpu_from_args(args) ) prediction_options = { "affinity_only": args.affinity_only, "allele_column": args.allele_column, "peptide_column": args.peptide_column, "n_flank_column": args.n_flank_column, "c_flank_column": args.c_flank_column, "use_flanking": use_flanking, "throw": not args.no_throw, "include_affinity_percentile": not args.no_affinity_percentile, "affinity_model_kwargs": affinity_model_kwargs, "processing_batch_size": "auto", } if worker_pool is None: # Serial path: no fork will happen, so loading the predictor # in this process is safe. predictor, _ = _load_predictor_for_command(models_dir) predictions = _predict_dataframe_chunk( predictor, df, prediction_options) else: # Parallel path: do NOT load the predictor in this process. # Each worker loads it after CUDA_VISIBLE_DEVICES is set, # so per-worker GPU pinning takes effect. try: # Build the work items inside the try so a failure here (e.g. # an OOM while copying chunk dataframes) still tears the pool # down via the finally rather than leaking non-daemon workers. ranges = chunk_ranges_for_local_parallelism( len(df), args.num_jobs) work_items = [ { "chunk_num": chunk_num, "models_dir": models_dir, "dataframe": df.iloc[start:end].copy(), "options": prediction_options, } for (chunk_num, start, end) in ranges ] results = worker_pool.imap_unordered( _predict_dataframe_chunk_worker, work_items, chunksize=1) chunks = [result for result in results] worker_pool.close() worker_pool.join() worker_pool = None finally: # On failure mid-iteration, terminate() rather than # close()/join() (which can hang on a wedged worker) and # leave non-daemon workers behind. if worker_pool is not None: worker_pool.terminate() worker_pool.join() # ``df.reset_index(drop=True)`` above guarantees the chunks' # row indices form a monotonic 0..N-1 partition, so a # chunk_num-ordered concat already preserves input order. predictions = pandas.concat( [chunk for (_, chunk) in sorted(chunks)], axis=0, ) # If each query is just for a single allele, the "best_allele" column # is redundant so we remove it. if not args.always_include_best_allele: if all(len(a) == 1 for a in allele_string_to_alleles.values()): if "best_allele" in predictions: del predictions["best_allele"] for col in predictions.columns: if col not in ("allele", "peptide", "sample_name", "peptide_num"): df[args.prediction_column_prefix + col] = predictions[col] if args.out: df.to_csv(args.out, index=False, sep=args.output_delimiter) print("Wrote: %s" % args.out, file=sys.stderr) else: df.to_csv(sys.stdout, index=False, sep=args.output_delimiter) mhcflurry-2.3.6/mhcflurry/cli/predict_scan_command.py000066400000000000000000000464241525677230600230540ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Scan proteins for peptide presentation using a CSV, FASTA or --sequences. With --alleles, return peptides with affinity percentile ranks at most 2.0 by default. Use --results-all for every peptide or --threshold-* to change the filters. Without --alleles, predict processing only. Results go to stdout unless --out is given. Examples: mhcflurry predict-scan proteins.fasta --alleles HLA-A0201 --out hits.csv mhcflurry predict-scan proteins.csv --alleles 'HLA-A*02:01;HLA-A*03:01' mhcflurry predict-scan --sequences SIINFEKLGGGNLVPMVATV --alleles HLA-A0201 CSV columns: sequence_id, sequence. Each --alleles argument is one sample; delimit alleles within a quoted argument with commas or semicolons to give a sample MHC allele set. """ import sys import collections from .help import HelpArgumentParser from ..downloads import get_default_class1_presentation_models_dir, get_model_release_dir from ..parallelism import add_prediction_parallelism_args from ..version import __version__ parser = HelpArgumentParser( usage="%(prog)s [OPTIONS] [INPUT]", description=__doc__, add_help=False) input_args = parser.add_argument_group(title="Input options") input_args.add_argument( "input", metavar="INPUT", nargs="?", help="Input CSV or FASTA") input_args.add_argument( "--input-format", choices=("guess", "csv", "fasta"), default="guess", help="Format of input file. By default, it is guessed from the file " "extension.") input_args.add_argument( "--alleles", metavar="ALLELE", nargs="+", help="Sample MHC allele or allele-set queries. Each argument is one sample; " "delimit alleles within a sample with ',' or ';'.") input_args.add_argument( "--sequences", metavar="SEQ", nargs="+", help="Sequences to predict (exclusive with passing an input file)") input_args.add_argument( "--sequence-id-column", metavar="NAME", default="sequence_id", help="Input CSV column name for sequence IDs. Default: '%(default)s'") input_args.add_argument( "--sequence-column", metavar="NAME", default="sequence", help="Input CSV column name for sequences. Default: '%(default)s'") input_args.add_argument( "--no-throw", action="store_true", default=False, help="Return NaNs for unsupported alleles or peptides instead of raising") results_args = parser.add_argument_group(title="Result options") results_args.add_argument( "--peptide-lengths", default="8-11", metavar="L", help="Peptide lengths to consider. Pass as START-END (e.g. 8-11) or a " "comma-separated list (8,9,10,11). When using START-END, the range is " "INCLUSIVE on both ends. Default: %(default)s.") default_thresholds = { "presentation_score": 0.7, "processing_score": 0.5, "affinity": 500, "affinity_percentile": 2.0, } results_args.add_argument( "--results-all", action="store_true", default=False, help="Disable the default affinity-percentile filter. Explicit thresholds still apply.") results_args.add_argument( "--threshold-presentation-score", type=float, help="Keep presentation scores >= this value. No default filter on this score.") results_args.add_argument( "--threshold-processing-score", type=float, help="Keep processing scores >= this value. No default filter on this score.") results_args.add_argument( "--threshold-affinity", type=float, help="Keep predicted affinities <= this value in nM. No default filter on nM affinity.") results_args.add_argument( "--threshold-affinity-percentile", type=float, help=f"Keep affinity percentiles <= this value. Defaults to {default_thresholds['affinity_percentile']} " "when no thresholds or --results-all are supplied.") output_args = parser.add_argument_group(title="Output options") output_args.add_argument( "--out", metavar="OUTPUT.csv", help="Output CSV") output_args.add_argument( "--output-delimiter", metavar="CHAR", default=",", help="Delimiter character for results. Default: '%(default)s'") output_args.add_argument( "--no-affinity-percentile", default=False, action="store_true", help="Do not include affinity percentile rank") model_args = parser.add_argument_group(title="Model options") model_selection = model_args.add_mutually_exclusive_group() model_selection.add_argument( "--models", metavar="DIR", default=None, help="Directory containing presentation models. " "Default: %s" % get_default_class1_presentation_models_dir( test_exists=False)) model_selection.add_argument( "--model-release", metavar="RELEASE", help="Use the presentation weights from a download release, overriding model " "path defaults. List choices: mhcflurry downloads releases models_class1_presentation.") model_args.add_argument( "--no-flanking", action="store_true", default=False, help="Do not use flanking sequence information in predictions") add_prediction_parallelism_args(parser) helper_args = parser.add_argument_group(title="Help") helper_args.add_argument( "-h", "--help", action="help", help="Show this help message and exit" ) helper_args.add_argument( "--list-supported-alleles", action="store_true", default=False, help="Print the list of supported alleles and exit" ) helper_args.add_argument( "--list-supported-peptide-lengths", action="store_true", default=False, help="Print the list of supported peptide lengths and exit" ) helper_args.add_argument( "--version", action="version", version="mhcflurry %s" % __version__, ) _PREDICTOR_CACHE = {} def _load_predictor_for_command(models_dir): from ..class1_presentation_predictor import Class1PresentationPredictor if models_dir not in _PREDICTOR_CACHE: _PREDICTOR_CACHE[models_dir] = Class1PresentationPredictor.load( models_dir) return _PREDICTOR_CACHE[models_dir] # One parallel chunk's predictions plus the comparison quantity the predictor # resolved for it. ``comparison_quantity`` is identical across chunks (it # depends only on the predictor's capabilities and the alleles, not on the # chunk's sequences); it is carried per-chunk so the parent can apply the same # global sort the serial path would without re-loading the predictor. ChunkResult = collections.namedtuple( "ChunkResult", ["chunk_num", "predictions", "comparison_quantity"]) def _predict_sequences_chunk_worker(work_item): predictor = _load_predictor_for_command(work_item["models_dir"]) result_df = predictor.predict_sequences( sequences=work_item["sequences"], alleles=work_item["alleles"], result="all", peptide_lengths=work_item["peptide_lengths"], use_flanks=work_item["use_flanks"], include_affinity_percentile=work_item[ "include_affinity_percentile"], throw=work_item["throw"], affinity_model_kwargs=work_item["affinity_model_kwargs"], processing_batch_size=work_item["processing_batch_size"]) return ChunkResult( chunk_num=work_item["chunk_num"], predictions=result_df, comparison_quantity=predictor.resolve_comparison_quantity( work_item["alleles"])) def parse_peptide_lengths(value): try: if "-" in value: (start, end) = value.split("-", 2) start = int(start.strip()) end = int(end.strip()) peptide_lengths = list(range(start, end + 1)) else: peptide_lengths = [ int(length.strip()) for length in value.split(",") ] except ValueError: raise ValueError("Couldn't parse peptide lengths: ", value) return peptide_lengths def run(argv=sys.argv[1:]): if not argv: parser.print_help() parser.exit(1) args = parser.parse_args(argv) try: selected_models_dir = ( get_model_release_dir(args.model_release) if args.model_release else None) except (ValueError, RuntimeError) as error: parser.error(str(error)) import pandas from ..parallelism import ( chunk_ranges_for_local_parallelism, num_workers_per_gpu_from_args, worker_pool_with_gpu_assignments_from_args, ) from ..pytorch_sizing import default_prediction_batch_is_auto from ..workload_planning import ( WORKLOAD_PRESENTATION_INFERENCE, WORKLOAD_PROCESSING_INFERENCE, model_artifact_size_bytes, path_size_bytes, ) from ..class1_presentation_predictor import Class1PresentationPredictor from ..fasta import read_fasta_to_dataframe # It's hard to pass a tab in a shell, so we correct a common error: if args.output_delimiter == "\\t": args.output_delimiter = "\t" peptide_lengths = parse_peptide_lengths(args.peptide_lengths) threshold_args = [ args.threshold_presentation_score, args.threshold_processing_score, args.threshold_affinity, args.threshold_affinity_percentile, ] if not args.results_all and all(x is None for x in threshold_args): print( "Filtering by affinity-percentile <= %s" % default_thresholds["affinity_percentile"], file=sys.stderr) print( "to show all predictions, pass --results-all", file=sys.stderr) args.threshold_affinity_percentile = default_thresholds["affinity_percentile"] models_dir = args.models or selected_models_dir if models_dir is None: # The reason we set the default here instead of in the argument parser # is that we want to test_exists at this point, so the user gets a # message instructing them to download the models if needed. models_dir = get_default_class1_presentation_models_dir(test_exists=True) if args.list_supported_alleles: predictor = _load_predictor_for_command(models_dir) print("\n".join(predictor.supported_alleles)) return if args.list_supported_peptide_lengths: predictor = _load_predictor_for_command(models_dir) min_len, max_len = predictor.supported_peptide_lengths print("\n".join([str(length) for length in range(min_len, max_len + 1)])) return if args.input: if args.sequences: parser.error( "If an input file is specified, do not specify --sequences") input_format = args.input_format if input_format == "guess": extension = args.input.lower().split(".")[-1] if extension in ["gz", "bzip2"]: extension = args.input.lower().split(".")[-2] if extension == "csv": input_format = "csv" elif extension in ["fasta", "fa"]: input_format = "fasta" else: parser.error( "Couldn't guess input format from file extension: %s\n" "Pass the --input-format argument to specify if it is a " "CSV or fasta file" % args.input) print( "Guessed input file format:", input_format, file=sys.stderr) if input_format == "csv": df = pandas.read_csv(args.input) print( "Read input CSV with %d rows, columns are: %s" % ( len(df), ", ".join(df.columns)), file=sys.stderr) for col in [args.sequence_column,]: if col not in df.columns: raise ValueError( "No such column '%s' in CSV. Columns are: %s" % ( col, ", ".join(["'%s'" % c for c in df.columns]))) elif input_format == "fasta": df = read_fasta_to_dataframe(args.input) print( "Read input fasta with %d sequences" % len(df), file=sys.stderr) print(df, file=sys.stderr) else: raise ValueError("Unsupported input format", input_format) else: if not args.sequences: parser.error( "Specify either an input file or the --sequences argument") df = pandas.DataFrame({ args.sequence_column: args.sequences, }) if args.sequence_id_column not in df: df[args.sequence_id_column] = "sequence_" + df.index.astype(str) df = df.set_index(args.sequence_id_column) if args.alleles: genotypes = pandas.Series(args.alleles).str.split(r"[;,\s]+") genotypes.index = genotypes.index.map(lambda i: "genotype_%02d" % i) alleles = genotypes.to_dict() else: print( "No alleles specified. Will perform processing prediction only.", file=sys.stderr) alleles = {} sequences = df[args.sequence_column].to_dict() if not sequences: # Empty input: return a DataFrame with the same schema the # predictor would have produced for non-empty input, so # threshold filters and downstream readers don't see a # schema-less object. The column list is derived from the # predictor (single source of truth) — see test_empty_and_populated_schemas_match. predictor = _load_predictor_for_command(models_dir) result_df = pandas.DataFrame( columns=predictor.predict_sequences_columns( alleles=alleles, use_flanks=not args.no_flanking, include_affinity_percentile=not args.no_affinity_percentile, )) else: worker_pool = worker_pool_with_gpu_assignments_from_args( args, workload_name=( WORKLOAD_PRESENTATION_INFERENCE if alleles else WORKLOAD_PROCESSING_INFERENCE ), workload_hints={ "data_bytes": path_size_bytes(args.input), "elastic_batch": ( not alleles or default_prediction_batch_is_auto()), "model_bytes": model_artifact_size_bytes(models_dir), "num_rows": len(df), }, # Predict-scan workers run PyTorch inference. On Linux, the default # fork context can inherit a parent process where PyTorch has # already been initialized by earlier command invocations/tests, # which makes later model .to(...) calls unsafe in workers. start_method="spawn", ) affinity_model_kwargs = {} if hasattr(args, "max_workers_per_gpu"): affinity_model_kwargs["num_workers_per_gpu"] = ( num_workers_per_gpu_from_args(args) ) if worker_pool is None: predictor = _load_predictor_for_command(models_dir) result_df = predictor.predict_sequences( sequences=sequences, alleles=alleles, result="all", peptide_lengths=peptide_lengths, use_flanks=not args.no_flanking, include_affinity_percentile=not args.no_affinity_percentile, throw=not args.no_throw, affinity_model_kwargs=affinity_model_kwargs, processing_batch_size="auto") else: try: # Build the work items inside the try so a failure here still # tears the pool down via the finally rather than leaking # non-daemon workers. sequence_items = list(sequences.items()) ranges = chunk_ranges_for_local_parallelism( len(sequence_items), args.num_jobs) work_items = [] for (chunk_num, start, end) in ranges: work_items.append({ "chunk_num": chunk_num, "models_dir": models_dir, "sequences": dict(sequence_items[start:end]), "alleles": alleles, "peptide_lengths": peptide_lengths, "use_flanks": not args.no_flanking, "include_affinity_percentile": ( not args.no_affinity_percentile), "throw": not args.no_throw, "affinity_model_kwargs": affinity_model_kwargs, "processing_batch_size": "auto", }) results = worker_pool.imap_unordered( _predict_sequences_chunk_worker, work_items, chunksize=1) chunks = [result for result in results] worker_pool.close() worker_pool.join() worker_pool = None finally: # On failure mid-iteration, terminate() rather than # close()/join() (which can hang on a wedged worker) and # leave non-daemon workers behind. if worker_pool is not None: worker_pool.terminate() worker_pool.join() # Restore input sequence order by chunk_num before the global # re-sort. chunks.sort(key=lambda chunk: chunk.chunk_num) result_df = pandas.concat( [chunk.predictions for chunk in chunks], ignore_index=True) # Apply the same global sort serial predict_sequences(result="all") # uses (Class1PresentationPredictor.sort_predictions). Each chunk is # sorted only within its sequence subset, so after concat we re-sort # globally. All chunks resolved the same comparison quantity, so we # take it from any of them — keeping parallel output ranking # identical to serial, including the deterministic peptide # tie-break. comparison_quantity = chunks[0].comparison_quantity result_df = Class1PresentationPredictor.sort_predictions( result_df, comparison_quantity).reset_index(drop=True) # Apply thresholds, skipping ones whose column is missing (e.g. # processing-only run with no alleles, or --no-affinity-percentile # leaves affinity_percentile out). threshold_filters = [ ("presentation_score", args.threshold_presentation_score, "ge"), ("processing_score", args.threshold_processing_score, "ge"), ("affinity", args.threshold_affinity, "le"), ("affinity_percentile", args.threshold_affinity_percentile, "le"), ] for col, thresh, op in threshold_filters: if thresh is None or col not in result_df.columns: continue if op == "ge": result_df = result_df.loc[result_df[col] >= thresh] else: result_df = result_df.loc[result_df[col] <= thresh] # Write results if args.out: result_df.to_csv(args.out, index=False, sep=args.output_delimiter) print("Wrote: %s" % args.out, file=sys.stderr) else: result_df.to_csv(sys.stdout, index=False, sep=args.output_delimiter) mhcflurry-2.3.6/mhcflurry/cli/processing_affinity_control.py000066400000000000000000000403511525677230600245160ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 """Evaluate processing scores on affinity-controlled hit/decoy risk sets.""" from __future__ import annotations import argparse import glob import json import os from pathlib import Path import numpy import pandas from .compare_models import _metrics from ..common import add_random_seed_arg from ..experiment_archive import sha256_file from ..processing_matching import ( MATCHING_POLICY, make_affinity_controlled_risk_sets, validate_matching_assignments) IDENTITY_COLUMNS = ( "sample_id", "peptide", "hit", "n_flank", "c_flank", ) AFFINITY_COLUMN = "mhcflurry_production_affinity" def make_parser(prog="mhcflurry eval processing-affinity-control"): """Return the command-line parser.""" parser = argparse.ArgumentParser(prog=prog, description=__doc__) parser.add_argument( "--score", action="append", required=True, metavar="NAME=PATH:COLUMN", help=( "Named score column from a saved processing prediction table. " "Repeat for every model to compare."), ) parser.add_argument( "--baseline", required=True, help="Score name used as the paired comparison baseline.", ) affinity_input = parser.add_mutually_exclusive_group() affinity_input.add_argument( "--data-dir", help="data_evaluation directory containing cached production affinity.", ) affinity_input.add_argument( "--affinity-cache", help="Archived ordered cohort with frozen production-affinity scores.") parser.add_argument( "--existing", help=( "Existing processing-affinity-control output to extend. Its " "ordered cohort and risk-set assignments are verified and reused, " "so only the new --score tables are read." ), ) parser.add_argument("--out", required=True) parser.add_argument("--decoys-per-hit", type=int, default=10) add_random_seed_arg(parser) parser.add_argument( "--same-protein-caliper", type=float, default=0.25, help=( "Maximum absolute log10-affinity distance for preferred " "same-protein decoys. Remaining slots use the same sample and " "peptide length. Default: 0.25."), ) return parser def _parse_score_spec(value): try: name, source = value.split("=", 1) path, column = source.rsplit(":", 1) except ValueError as error: raise ValueError( "Invalid --score %r; expected NAME=PATH:COLUMN" % value ) from error if not name or not path or not column: raise ValueError( "Invalid --score %r; expected NAME=PATH:COLUMN" % value) return name, os.path.abspath(path), column def _cohort_hash(frame): normalized = frame.loc[:, list(IDENTITY_COLUMNS)].copy() labels = pandas.to_numeric(normalized["hit"], errors="raise") if not labels.isin([0, 1]).all(): raise ValueError("Prediction cohort requires nonmissing binary labels") normalized["hit"] = labels.astype("int8") for column in ("sample_id", "peptide", "n_flank", "c_flank"): normalized[column] = normalized[column].fillna("").astype(str) return pandas.util.hash_pandas_object( normalized, index=False).to_numpy(dtype="uint64") def _load_scores(specs): cohort = None cohort_hash = None sources = [] seen = set() specs_by_path = {} for spec in specs: name, path, column = _parse_score_spec(spec) if name in seen: raise ValueError("Duplicate score name: %s" % name) seen.add(name) if not os.path.isfile(path): raise ValueError("Score table does not exist: %s" % path) specs_by_path.setdefault(path, []).append((name, column)) for path, path_specs in specs_by_path.items(): score_columns = list(dict.fromkeys( column for _, column in path_specs)) usecols = list(IDENTITY_COLUMNS) + score_columns frame = pandas.read_csv(path, usecols=usecols) current_hash = _cohort_hash(frame) if cohort is None: cohort = frame.loc[:, IDENTITY_COLUMNS].copy() cohort_hash = current_hash elif ( len(current_hash) != len(cohort_hash) or not numpy.array_equal(current_hash, cohort_hash)): raise ValueError( "Scores from %s do not use the same ordered benchmark cohort" % path) digest = sha256_file(path) for name, column in path_specs: values = pandas.to_numeric(frame[column], errors="coerce") if not numpy.isfinite(values).all(): raise ValueError( "%s has %d non-finite scores" % ( name, int((~numpy.isfinite(values)).sum()))) cohort[name] = values.to_numpy(dtype="float64") sources.append({ "name": name, "path": path, "column": column, "sha256": digest, }) return cohort, sources def _extend_existing(existing_dir, new_cohort, new_sources): """Attach new score columns to verified saved cohort and risk sets.""" existing_dir = Path(existing_dir) experiment_path = existing_dir / "experiment.json" heldout_path = existing_dir / "heldout_predictions.csv.bz2" matched_path = existing_dir / "matched_predictions.csv.bz2" for path in (experiment_path, heldout_path, matched_path): if not path.is_file(): raise ValueError("Existing affinity-control artifact missing: %s" % path) configuration = json.loads(experiment_path.read_text()) old_sources = configuration.get("score_sources", []) old_names = [source["name"] for source in old_sources] new_names = [source["name"] for source in new_sources] duplicates = set(old_names).intersection(new_names) if duplicates: raise ValueError( "New score names already exist: %s" % sorted(duplicates)) heldout = pandas.read_csv(heldout_path) if ( len(heldout) != len(new_cohort) or not numpy.array_equal( _cohort_hash(heldout), _cohort_hash(new_cohort))): raise ValueError( "New scores do not use the existing ordered benchmark cohort") for name in new_names: heldout[name] = new_cohort[name].to_numpy(dtype="float64") matched = pandas.read_csv(matched_path) if "source_row" not in matched: raise ValueError("Existing matched predictions lack source_row") numeric_rows = pandas.to_numeric(matched.source_row, errors="raise").to_numpy() if not numpy.isfinite(numeric_rows).all() or not numpy.equal(numeric_rows, numpy.floor(numeric_rows)).all(): raise ValueError("Existing matched predictions have noninteger source_row") source_rows = numeric_rows.astype("int64") if ( len(source_rows) and (source_rows.min() < 0 or source_rows.max() >= len(heldout))): raise ValueError("Existing matched predictions have invalid source_row") source_identity = heldout.iloc[source_rows].reset_index(drop=True) if not numpy.array_equal( _cohort_hash(source_identity), _cohort_hash(matched)): raise ValueError( "Existing matched predictions do not agree with source_row") if not numpy.array_equal(source_identity[AFFINITY_COLUMN], matched[AFFINITY_COLUMN]): raise ValueError("Existing matched affinities disagree with their source") expected_hits = numpy.flatnonzero(heldout.hit.to_numpy() == 1) if not numpy.array_equal(numpy.sort(source_rows[matched.hit == 1]), expected_hits): raise ValueError("Existing matching omitted or repeated held-out hits") diagnostics = dict(configuration.get("diagnostics", {})) if diagnostics.get("policy") != MATCHING_POLICY: raise ValueError("Existing assignments use an older matching policy; regenerate the cohort") validate_matching_assignments( matched, AFFINITY_COLUMN, diagnostics["decoys_per_hit"]) diagnostics.update(policy=MATCHING_POLICY, max_log10_affinity_distance=0.25) for name in new_names: matched[name] = heldout[name].to_numpy()[source_rows] return { "heldout": heldout, "matched": matched, "score_sources": old_sources + new_sources, "affinity_sources": configuration.get("affinity_sources", []), "diagnostics": diagnostics, "existing_experiment": str(experiment_path.resolve()), "existing_experiment_sha256": sha256_file(experiment_path), } def _production_paths_by_sample(data_dir): pattern = os.path.join( data_dir, "benchmark.multiallelic.production.train_excluded.*.csv.bz2", ) result = {} for path in sorted(glob.glob(pattern)): sample = pandas.read_csv(path, usecols=["sample_id"], nrows=1) if sample.empty: raise ValueError("Cached production-affinity file is empty: %s" % path) sample_id = str(sample.sample_id.iloc[0]) if sample_id in result: raise ValueError( "Multiple cached production-affinity files for sample %s" % sample_id) result[sample_id] = path return result def _attach_affinity(cohort, data_dir=None, cached_affinity=None): frames = [] paths = [] usecols = list(IDENTITY_COLUMNS) + [ "protein_accession", AFFINITY_COLUMN, ] if cached_affinity: input_paths = [cached_affinity] elif data_dir: paths_by_sample = _production_paths_by_sample(data_dir) input_paths = [] for sample_id in cohort.sample_id.drop_duplicates(): path = paths_by_sample.get(str(sample_id)) if path is None: raise ValueError("No cached production-affinity file for sample %s" % sample_id) input_paths.append(path) else: raise ValueError("Specify --data-dir or --affinity-cache for the frozen reference") for path in input_paths: frame = pandas.read_csv(path, usecols=usecols) frame["n_flank"] = frame.n_flank.fillna("") frame["c_flank"] = frame.c_flank.fillna("") frames.append(frame) paths.append({"path": path, "sha256": sha256_file(path)}) affinity = pandas.concat(frames, ignore_index=True) if ( len(affinity) != len(cohort) or not numpy.array_equal(_cohort_hash(affinity), _cohort_hash(cohort))): raise ValueError( "Cached affinity rows do not exactly match the ordered prediction " "cohort") values = pandas.to_numeric(affinity[AFFINITY_COLUMN], errors="coerce") if not numpy.isfinite(values).all() or (values <= 0).any(): raise ValueError("Cached affinity must be finite and positive") result = cohort.copy() result["protein_accession"] = affinity.protein_accession.to_numpy() result[AFFINITY_COLUMN] = values.to_numpy(dtype="float64") result["log10_affinity"] = numpy.log10(result[AFFINITY_COLUMN]) result["peptide_len"] = result.peptide.str.len().astype("int8") result["hit"] = pandas.to_numeric( result.hit, errors="raise").astype("int8") return result, paths def _concordance(frame, score_column): keys = ["sample_id", "risk_set_id"] hits = frame.loc[frame.hit == 1].set_index(keys)[score_column] decoys = frame.loc[frame.hit == 0] targets = pandas.MultiIndex.from_frame(decoys[keys]).map(hits).to_numpy() scores = decoys[score_column].to_numpy() wins = (targets > scores) + 0.5 * (targets == scores) return float(decoys[keys].assign(win=wins).groupby(keys).win.mean().mean()) def _metric_record(frame, score, scope, group): metrics = _metrics(frame.hit.to_numpy(), frame[score].to_numpy()) return { "scope": scope, "group": str(group), "score": score, **metrics, "concordance": _concordance(frame, score), } def score_risk_sets(frame, score_columns): """Return overall, sample, and peptide-length metrics.""" records = [] for score in score_columns: records.append(_metric_record(frame, score, "overall", "all")) for sample_id, group in frame.groupby("sample_id", sort=False): records.append(_metric_record( group, score, "sample", sample_id)) for length, group in frame.groupby("peptide_len", sort=True): records.append(_metric_record(group, score, "length", int(length))) return pandas.DataFrame(records) def summarize_metrics(metrics, baseline): """Return score summaries and paired deltas from the baseline.""" overall = metrics.loc[metrics.scope == "overall"].set_index("score") samples = metrics.loc[metrics.scope == "sample"] macro = samples.groupby("score")[ ["roc_auc", "pr_auc", "ppv_at_n", "concordance"] ].mean().add_prefix("macro_") summary = overall[[ "n", "n_pos", "roc_auc", "pr_auc", "ppv_at_n", "concordance", ]].join(macro).reset_index() if baseline not in set(summary.score): raise ValueError("Unknown baseline score: %s" % baseline) baseline_row = summary.set_index("score").loc[baseline] comparisons = summary.copy() for column in ( "roc_auc", "pr_auc", "ppv_at_n", "concordance", "macro_roc_auc", "macro_pr_auc", "macro_ppv_at_n", "macro_concordance"): comparisons[column + "_diff"] = ( comparisons[column] - baseline_row[column]) comparisons.insert(1, "baseline", baseline) return summary, comparisons def run(args): """Run affinity-controlled processing evaluation.""" out = Path(args.out) out.mkdir(parents=True, exist_ok=True) cohort, new_score_sources = _load_scores(args.score) if args.existing: extended = _extend_existing( args.existing, cohort, new_score_sources) attached = extended["heldout"] matched = extended["matched"] score_sources = extended["score_sources"] affinity_sources = extended["affinity_sources"] diagnostics = extended["diagnostics"] else: score_sources = new_score_sources if args.baseline not in set(source["name"] for source in score_sources): raise ValueError("--baseline is not one of the named --score values") if not args.existing: attached, affinity_sources = _attach_affinity(cohort, args.data_dir, args.affinity_cache) matched, diagnostics = make_affinity_controlled_risk_sets( attached, decoys_per_hit=args.decoys_per_hit, same_protein_caliper=args.same_protein_caliper, random_seed=args.random_seed, ) score_columns = [source["name"] for source in score_sources] metrics = score_risk_sets(matched, score_columns) summary, comparisons = summarize_metrics(metrics, args.baseline) # Preserve the complete, ordered held-out cohort as the canonical join # surface for external predictors. The matched table selects only a subset # of the negatives and therefore cannot serve that purpose on its own. attached.to_csv(out / "heldout_predictions.csv.bz2", index=False) matched.to_csv(out / "matched_predictions.csv.bz2", index=False) metrics.to_csv(out / "metrics.csv", index=False) summary.to_csv(out / "summary.csv", index=False) comparisons.to_csv(out / "comparisons.csv", index=False) configuration = { "design": "processing-affinity-controlled-risk-sets-v2", "score_sources": score_sources, "affinity_sources": affinity_sources, "baseline": args.baseline, "data_dir": os.path.abspath(args.data_dir) if args.data_dir else None, "diagnostics": diagnostics, } if args.existing: configuration.update({ "extended_from": extended["existing_experiment"], "extended_from_sha256": extended[ "existing_experiment_sha256"], }) (out / "experiment.json").write_text( json.dumps(configuration, indent=2, sort_keys=True) + "\n") print(summary.to_string(index=False)) print("Wrote %s" % out) return 0 def run_argv(argv=None, prog="mhcflurry eval processing-affinity-control"): """Parse arguments and run the command.""" return run(make_parser(prog).parse_args(argv)) mhcflurry-2.3.6/mhcflurry/cli/reassign_mass_spec_training_data.py000066400000000000000000000070071525677230600254460ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Reassign affinity values for mass-spec training rows.""" import argparse import os import sys import pandas from mhcflurry.release_holdout import exclude_affinity_pmhcs def make_parser(prog=None): """Build the command-line parser.""" parser = argparse.ArgumentParser(description=__doc__, prog=prog) parser.add_argument("data", metavar="CSV", help="Training data.") parser.add_argument("--ms-only", action="store_true", default=False) parser.add_argument("--drop-negative-ms", action="store_true", default=False) parser.add_argument("--set-measurement-value", type=float) parser.add_argument("--out-csv") parser.add_argument( "--exclude-pmhcs", help="CSV of frozen evaluation allele,peptide pairs to exclude.") parser.add_argument( "--verbose", action="store_true", default=False, help="Print input and changed-row previews.") return parser def reassign_mass_spec_training_data( data, ms_only=False, drop_negative_ms=False, set_measurement_value=None, exclude_pmhcs=None, out_csv=None, verbose=False): """Return a curated training dataframe with requested MS-row edits.""" df = pandas.read_csv(data) print("Read %d rows from %s" % (len(df), data), file=sys.stderr) if verbose: print(df, file=sys.stderr) if drop_negative_ms: bad = df.loc[ (df.measurement_kind == "mass_spec") & (df.measurement_inequality != "<") ] print("Dropping %d negative MS rows" % len(bad), file=sys.stderr) df = df.loc[~df.index.isin(bad.index)].copy() if ms_only: print("Filtering to MS only", file=sys.stderr) df = df.loc[df.measurement_kind == "mass_spec"].copy() if exclude_pmhcs: df = exclude_affinity_pmhcs(df, exclude_pmhcs) if set_measurement_value is not None: indexer = df.measurement_kind == "mass_spec" df.loc[indexer, "measurement_value"] = set_measurement_value print( "Reassigned measurement_value for %d MS rows to %s" % ( indexer.sum(), set_measurement_value), file=sys.stderr) if verbose: print(df.loc[indexer], file=sys.stderr) if out_csv: out_csv = os.path.abspath(out_csv) df.to_csv(out_csv, index=False) print("Wrote %s" % out_csv, file=sys.stderr) return df def run_argv(argv=None, prog=None): """Run the command.""" args = make_parser(prog=prog).parse_args(argv) reassign_mass_spec_training_data( args.data, ms_only=args.ms_only, drop_negative_ms=args.drop_negative_ms, set_measurement_value=args.set_measurement_value, exclude_pmhcs=args.exclude_pmhcs, out_csv=args.out_csv, verbose=args.verbose) def main(argv=None): """Entry point for script compatibility.""" if argv is None: argv = sys.argv[1:] return run_argv(argv) if __name__ == "__main__": main() mhcflurry-2.3.6/mhcflurry/cli/select_allele_specific_models_command.py000066400000000000000000000754601525677230600264250ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Model select class1 single allele models. """ import argparse import os import sys import time import random from pprint import pprint import numpy import pandas from scipy.stats import kendalltau, percentileofscore, pearsonr from sklearn.metrics import roc_auc_score import tqdm # progress bar from ..class1_affinity_predictor import Class1AffinityPredictor from ..common import ( add_random_seed_arg, configure_logging, configure_random_seed, derive_seed, filter_canonicalizable_alleles, install_sigusr1_stack_trace_handler, positive_int_arg, normalize_allele_name, random_peptides, write_generate_sh, ) from ..encodable_sequences import EncodableSequences from ..parallelism import ( add_local_parallelism_args, worker_pool_with_gpu_assignments_from_args, ) from ..workload_planning import WORKLOAD_AFFINITY_SELECTION, path_size_bytes from ..regression_target import from_ic50 tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 # To avoid pickling large matrices to send to child processes when running in # parallel, we use this global variable as a place to store data. Data that is # stored here before creating the thread pool will be inherited to the child # processes upon fork() call, allowing local workers to read the same # copy-on-write pages instead of receiving a pickled copy. WORKER_CONTEXT = {} parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "--data", metavar="FILE.csv", required=False, help=( "Model selection data CSV. Expected columns: " "allele, peptide, measurement_value")) parser.add_argument( "--exclude-data", metavar="FILE.csv", required=False, help=( "Data to EXCLUDE from model selection. Useful to specify the original " "training data used")) parser.add_argument( "--models-dir", metavar="DIR", required=True, help="Directory to read models") parser.add_argument( "--out-models-dir", metavar="DIR", required=True, help="Directory to write selected models") parser.add_argument( "--out-unselected-predictions", metavar="FILE.csv", help="Write predictions for validation data using unselected predictor to " "FILE.csv") parser.add_argument( "--unselected-accuracy-scorer", metavar="SCORER", default="combined:mass-spec,mse") parser.add_argument( "--unselected-accuracy-scorer-num-samples", type=positive_int_arg, default=1000) parser.add_argument( "--unselected-accuracy-percentile-threshold", type=float, metavar="X", default=95) parser.add_argument( "--allele", default=None, nargs="+", help="Alleles to select models for. If not specified, all alleles with " "enough measurements will be used.") parser.add_argument( "--combined-min-models", type=positive_int_arg, default=8, metavar="N", help="Min number of models to select per allele when using combined selector") parser.add_argument( "--combined-max-models", type=positive_int_arg, default=1000, metavar="N", help="Max number of models to select per allele when using combined selector") parser.add_argument( "--combined-min-contribution-percent", type=float, default=1.0, metavar="X", help="Use only model selectors that can contribute at least X %% to the " "total score. Default: %(default)s") parser.add_argument( "--mass-spec-min-measurements", type=positive_int_arg, metavar="N", default=1, help="Min number of measurements required for an allele to use mass-spec model " "selection") parser.add_argument( "--mass-spec-min-models", type=positive_int_arg, default=8, metavar="N", help="Min number of models to select per allele when using mass-spec selector") parser.add_argument( "--mass-spec-max-models", type=positive_int_arg, default=1000, metavar="N", help="Max number of models to select per allele when using mass-spec selector") parser.add_argument( "--mse-min-measurements", type=positive_int_arg, metavar="N", default=1, help="Min number of measurements required for an allele to use MSE model " "selection") parser.add_argument( "--mse-min-models", type=positive_int_arg, default=8, metavar="N", help="Min number of models to select per allele when using MSE selector") parser.add_argument( "--mse-max-models", type=positive_int_arg, default=1000, metavar="N", help="Max number of models to select per allele when using MSE selector") parser.add_argument( "--scoring", nargs="+", default=["mse", "consensus"], help="Scoring procedures to use in order") parser.add_argument( "--consensus-min-models", type=positive_int_arg, default=8, metavar="N", help="Min number of models to select per allele when using consensus selector") parser.add_argument( "--consensus-max-models", type=positive_int_arg, default=1000, metavar="N", help="Max number of models to select per allele when using consensus selector") parser.add_argument( "--consensus-num-peptides-per-length", type=positive_int_arg, default=10000, help="Num peptides per length to use for consensus scoring") parser.add_argument( "--mass-spec-regex", metavar="REGEX", default="mass[- ]spec", help="Regular expression for mass-spec data. Runs on measurement_source col." "Default: %(default)s.") parser.add_argument( "--verbosity", type=int, help="Verbosity. Default: %(default)s", default=0) add_local_parallelism_args(parser) add_random_seed_arg(parser) def run(argv=sys.argv[1:]): install_sigusr1_stack_trace_handler() args = parser.parse_args(argv) for prefix in ("combined", "mass_spec", "mse", "consensus"): minimum = getattr(args, "%s_min_models" % prefix) maximum = getattr(args, "%s_max_models" % prefix) if minimum > maximum: parser.error( "--%s-min-models must not exceed --%s-max-models" % ( prefix.replace("_", "-"), prefix.replace("_", "-"))) args.out_models_dir = os.path.abspath(args.out_models_dir) configure_logging(verbose=args.verbosity > 1) # Seed all randomness up front (the allele shuffle below runs in this # process). Per-allele scrambling in model_select runs in workers, so we # also stash the master seed in WORKER_CONTEXT and reseed per allele there. master_seed = configure_random_seed( args.random_seed, name="select-allele-specific") input_predictor = Class1AffinityPredictor.load(args.models_dir) print("Loaded: %s" % input_predictor) if args.allele: # User-supplied alleles must canonicalize; mismatch is a config error. alleles = [normalize_allele_name(a) for a in args.allele] else: # Pre-filter pseudogene / null / questionable supported_alleles so a # single bad row doesn't crash the parallel selection mid-fold. alleles = filter_canonicalizable_alleles( input_predictor.supported_alleles, log_label="supported_alleles", ) metadata_dfs = {} if args.data: df = pandas.read_csv(args.data) print("Loaded data: %s" % (str(df.shape))) df = df.loc[ (df.peptide.str.len() >= 8) & (df.peptide.str.len() <= 15) ] print("Subselected to 8-15mers: %s" % (str(df.shape))) # Allele names in data are assumed to be already normalized. df = df.loc[df.allele.isin(alleles)].dropna() print("Selected %d alleles: %s" % (len(alleles), ' '.join(alleles))) if args.exclude_data: exclude_df = pandas.read_csv(args.exclude_data) metadata_dfs["model_selection_exclude"] = exclude_df print("Loaded exclude data: %s" % (str(df.shape))) df["_key"] = df.allele + "__" + df.peptide exclude_df["_key"] = exclude_df.allele + "__" + exclude_df.peptide df["_excluded"] = df._key.isin(exclude_df._key.unique()) print("Excluding measurements per allele (counts): ") print(df.groupby("allele")._excluded.sum()) print("Excluding measurements per allele (fractions): ") print(df.groupby("allele")._excluded.mean()) df = df.loc[~df._excluded] del df["_excluded"] del df["_key"] print("Reduced data to: %s" % (str(df.shape))) metadata_dfs["model_selection_data"] = df df["mass_spec"] = df.measurement_source.str.contains( args.mass_spec_regex) else: df = None if args.out_unselected_predictions: df["unselected_prediction"] = input_predictor.predict( alleles=df.allele.values, peptides=df.peptide.values) df.to_csv(args.out_unselected_predictions) print("Wrote: %s" % args.out_unselected_predictions) selectors = {} selector_to_model_selection_kwargs = {} def make_selector( scoring, combined_min_contribution_percent=args.combined_min_contribution_percent): if scoring in selectors: return ( selectors[scoring], selector_to_model_selection_kwargs[scoring]) start = time.time() if scoring.startswith("combined:"): model_selection_kwargs = { 'min_models': args.combined_min_models, 'max_models': args.combined_max_models, } component_selectors = [] for component_selector in scoring.split(":", 1)[1].split(","): component_selectors.append( make_selector( component_selector)[0]) selector = CombinedModelSelector( component_selectors, min_contribution_percent=combined_min_contribution_percent) elif scoring == "mse": model_selection_kwargs = { 'min_models': args.mse_min_models, 'max_models': args.mse_max_models, } min_measurements = args.mse_min_measurements selector = MSEModelSelector( df=df.loc[~df.mass_spec], predictor=input_predictor, min_measurements=min_measurements) elif scoring == "mass-spec": mass_spec_df = df.loc[df.mass_spec] model_selection_kwargs = { 'min_models': args.mass_spec_min_models, 'max_models': args.mass_spec_max_models, } min_measurements = args.mass_spec_min_measurements selector = MassSpecModelSelector( df=mass_spec_df, predictor=input_predictor, min_measurements=min_measurements) elif scoring == "consensus": model_selection_kwargs = { 'min_models': args.consensus_min_models, 'max_models': args.consensus_max_models, } selector = ConsensusModelSelector( predictor=input_predictor, num_peptides_per_length=args.consensus_num_peptides_per_length) else: raise ValueError("Unsupported scoring method: %s" % scoring) print("Instantiated model selector %s in %0.2f sec." % ( scoring, time.time() - start)) return (selector, model_selection_kwargs) for scoring in args.scoring: (selector, model_selection_kwargs) = make_selector(scoring) selectors[scoring] = selector selector_to_model_selection_kwargs[scoring] = model_selection_kwargs unselected_accuracy_scorer = None if args.unselected_accuracy_scorer: # Force running all selectors by setting combined_min_contribution_percent=0. unselected_accuracy_scorer = make_selector( args.unselected_accuracy_scorer, combined_min_contribution_percent=0.0)[0] print("Using unselected accuracy scorer: %s" % unselected_accuracy_scorer) WORKER_CONTEXT["unselected_accuracy_scorer"] = unselected_accuracy_scorer print("Selectors for alleles:") allele_to_selector = {} allele_to_model_selection_kwargs = {} for allele in alleles: selector = None for possible_selector in args.scoring: if selectors[possible_selector].usable_for_allele(allele=allele): selector = selectors[possible_selector] print("%20s %s" % (allele, selector.plan_summary(allele))) break if selector is None: raise ValueError("No selectors usable for allele: %s" % allele) allele_to_selector[allele] = selector allele_to_model_selection_kwargs[allele] = ( selector_to_model_selection_kwargs[possible_selector]) WORKER_CONTEXT["args"] = args WORKER_CONTEXT["input_predictor"] = input_predictor WORKER_CONTEXT["unselected_accuracy_scorer"] = unselected_accuracy_scorer WORKER_CONTEXT["allele_to_selector"] = allele_to_selector WORKER_CONTEXT["allele_to_model_selection_kwargs"] = allele_to_model_selection_kwargs WORKER_CONTEXT["seed"] = master_seed if not os.path.exists(args.out_models_dir): print("Attempting to create directory: %s" % args.out_models_dir) os.mkdir(args.out_models_dir) print("Done.") result_predictor = Class1AffinityPredictor(metadata_dataframes=metadata_dfs) worker_pool = worker_pool_with_gpu_assignments_from_args( args, workload_name=WORKLOAD_AFFINITY_SELECTION, workload_hints={ "data_bytes": sum( value or 0 for value in ( path_size_bytes(args.data), path_size_bytes(args.exclude_data), ) ) or None, }, worker_context_module=__name__, worker_context_data=WORKER_CONTEXT, ) start = time.time() if worker_pool is None: # Serial run print("Running in serial.") results = ( model_select(allele) for allele in alleles) else: # Parallel run random.shuffle(alleles) results = worker_pool.imap_unordered( model_select, alleles, chunksize=1) unselected_summary = [] model_selection_dfs = [] try: for result in tqdm.tqdm(results, total=len(alleles)): pprint(result) summary_dict = dict(result) summary_dict["retained"] = result["selected"] is not None del summary_dict["selected"] unselected_summary.append(summary_dict) if result['selected'] is not None: model_selection_dfs.append( result['selected'].metadata_dataframes['model_selection']) result_predictor.merge_in_place([result['selected']]) if worker_pool: worker_pool.close() worker_pool.join() worker_pool = None finally: if worker_pool is not None: worker_pool.terminate() worker_pool.join() if model_selection_dfs: model_selection_df = pandas.concat( model_selection_dfs, ignore_index=True) model_selection_df["selector"] = model_selection_df.allele.map( allele_to_selector) result_predictor.metadata_dataframes["model_selection"] = ( model_selection_df) result_predictor.metadata_dataframes["unselected_summary"] = ( pandas.DataFrame(unselected_summary)) print("Done model selecting for %d alleles." % len(alleles)) result_predictor.save(args.out_models_dir) write_generate_sh(args.out_models_dir) model_selection_time = time.time() - start print("Model selection time %0.2f min." % (model_selection_time / 60.0)) print("Predictor written to: %s" % args.out_models_dir) class ScrambledPredictor(object): def __init__(self, predictor): self.predictor = predictor self._predictions = {} self._allele = None def predict(self, peptides, allele): if peptides not in self._predictions: self._predictions[peptides] = pandas.Series( self.predictor.predict(peptides=peptides, allele=allele)) self._allele = allele assert allele == self._allele return self._predictions[peptides].sample(frac=1.0).values def model_select(allele, constant_data=WORKER_CONTEXT): # Runs in a worker, which reseeds its RNGs from entropy on startup. Reseed # from the run's master seed mixed with the allele so the scrambling # ``.sample(frac=1.0)`` in the accuracy scorer is reproducible per allele. numpy.random.seed(derive_seed(constant_data.get("seed"), allele) % (2 ** 32)) unselected_accuracy_scorer = constant_data["unselected_accuracy_scorer"] selector = constant_data["allele_to_selector"][allele] model_selection_kwargs = constant_data[ "allele_to_model_selection_kwargs" ][allele] predictor = constant_data["input_predictor"] args = constant_data["args"] unselected_accuracy_scorer_samples = constant_data["args"].unselected_accuracy_scorer_num_samples result_dict = { "allele": allele } unselected_score = None unselected_score_percentile = None unselected_score_scrambled_mean = None if unselected_accuracy_scorer: unselected_score_function = ( unselected_accuracy_scorer.score_function(allele)) additional_metadata = {} unselected_score = unselected_score_function( predictor, additional_metadata_out=additional_metadata) scrambled_predictor = ScrambledPredictor(predictor) scrambled_scores = numpy.array([ unselected_score_function( scrambled_predictor) for _ in range(unselected_accuracy_scorer_samples) ]) unselected_score_scrambled_mean = scrambled_scores.mean() unselected_score_percentile = percentileofscore( scrambled_scores, unselected_score) print( "Unselected score and percentile", allele, unselected_score, unselected_score_percentile, additional_metadata) result_dict.update( dict(("unselected_%s" % key, value) for (key, value) in additional_metadata.items())) selected = None threshold = args.unselected_accuracy_percentile_threshold if unselected_score_percentile is None or unselected_score_percentile >= threshold: selected = predictor.model_select( score_function=selector.score_function(allele=allele), alleles=[allele], **model_selection_kwargs) result_dict["unselected_score_plan"] = ( unselected_accuracy_scorer.plan_summary(allele) if unselected_accuracy_scorer else None) result_dict["selector_score_plan"] = selector.plan_summary(allele) result_dict["unselected_accuracy_score_percentile"] = unselected_score_percentile result_dict["unselected_score"] = unselected_score result_dict["unselected_score_scrambled_mean"] = unselected_score_scrambled_mean result_dict["selected"] = selected result_dict["num_models"] = len(selected.neural_networks) if selected else None return result_dict def cache_encoding(predictor, peptides): # Encode the peptides for each neural network, so the encoding # becomes cached. for network in predictor.neural_networks: network.peptides_to_network_input(peptides) class ScoreFunction(object): """ Thin wrapper over a score function (Class1AffinityPredictor -> float). Used to keep a summary string associated with the function. """ def __init__(self, function, summary=None): self.function = function self.summary = summary if summary else "(n/a)" def __call__(self, *args, **kwargs): return self.function(*args, **kwargs) class CombinedModelSelector(object): """ Model selector that computes a weighted average over other model selectors. """ def __init__(self, model_selectors, weights=None, min_contribution_percent=1.0): if weights is None: weights = numpy.ones(shape=(len(model_selectors),)) self.model_selectors = model_selectors self.selector_to_weight = dict(zip(self.model_selectors, weights)) self.min_contribution_percent = min_contribution_percent def usable_for_allele(self, allele): return any( selector.usable_for_allele(allele) for selector in self.model_selectors) def plan_summary(self, allele): return self.score_function(allele, dry_run=True).summary def score_function(self, allele, dry_run=False): selector_to_max_weighted_score = {} for selector in self.model_selectors: weight = self.selector_to_weight[selector] if selector.usable_for_allele(allele): max_weighted_score = selector.max_absolute_value(allele) * weight else: max_weighted_score = 0 selector_to_max_weighted_score[selector] = max_weighted_score max_total_score = sum(selector_to_max_weighted_score.values()) # Use only selectors that can contribute >1% to the total score selectors_to_use = [ selector for selector in self.model_selectors if ( selector_to_max_weighted_score[selector] > max_total_score * self.min_contribution_percent / 100.0) ] summary = ", ".join([ "%s(|%.3f|)" % ( selector.plan_summary(allele), selector_to_max_weighted_score[selector]) for selector in selectors_to_use ]) if dry_run: score = None else: score_functions_and_weights = [ (selector.score_function(allele=allele), self.selector_to_weight[selector]) for selector in selectors_to_use ] def score(predictor, additional_metadata_out=None): scores = numpy.array([ score_function( predictor, additional_metadata_out=additional_metadata_out) * weight for (score_function, weight) in score_functions_and_weights ]) if additional_metadata_out is not None: additional_metadata_out["combined_score_terms"] = str( list(scores)) return scores.sum() return ScoreFunction(score, summary=summary) class ConsensusModelSelector(object): """ Model selector that scores sub-ensembles based on their Kendall tau consistency with the full ensemble over a set of random peptides. """ def __init__( self, predictor, num_peptides_per_length=10000, multiply_score_by_value=10.0): (min_length, max_length) = predictor.supported_peptide_lengths peptides = [] for length in range(min_length, max_length + 1): peptides.extend( random_peptides(num_peptides_per_length, length=length)) self.peptides = EncodableSequences.create(peptides) self.predictor = predictor self.multiply_score_by_value = multiply_score_by_value cache_encoding(self.predictor, self.peptides) def usable_for_allele(self, allele): return True def max_absolute_value(self, allele): return self.multiply_score_by_value def plan_summary(self, allele): return "consensus (%d points)" % len(self.peptides) def score_function(self, allele): full_ensemble_predictions = self.predictor.predict( allele=allele, peptides=self.peptides) def score(predictor, additional_metadata_out=None): predictions = predictor.predict( allele=allele, peptides=self.peptides, ) tau = kendalltau(predictions, full_ensemble_predictions).correlation if additional_metadata_out is not None: additional_metadata_out["score_consensus_tau"] = tau return tau * self.multiply_score_by_value return ScoreFunction( score, summary=self.plan_summary(allele)) class MSEModelSelector(object): """ Model selector that uses mean-squared error to score models. Inequalities are supported. """ def __init__( self, df, predictor, min_measurements=1, multiply_score_by_data_size=True): self.df = df self.predictor = predictor self.min_measurements = min_measurements self.multiply_score_by_data_size = multiply_score_by_data_size def usable_for_allele(self, allele): return (self.df.allele == allele).sum() >= self.min_measurements def max_absolute_value(self, allele): if self.multiply_score_by_data_size: return (self.df.allele == allele).sum() else: return 1.0 def plan_summary(self, allele): return self.score_function(allele).summary def score_function(self, allele): sub_df = self.df.loc[self.df.allele == allele].reset_index(drop=True) peptides = EncodableSequences.create(sub_df.peptide.values) def score(predictor, additional_metadata_out=None): predictions = predictor.predict( allele=allele, peptides=peptides, ) deviations = from_ic50(predictions) - from_ic50( sub_df.measurement_value) if 'measurement_inequality' in sub_df.columns: # Must reverse meaning of inequality since we are working with # transformed 0-1 values, which are anti-correlated with the ic50s. # The measurement_inequality column is given in terms of ic50s. deviations.loc[ ( (sub_df.measurement_inequality == "<") & (deviations > 0)) | ((sub_df.measurement_inequality == ">") & (deviations < 0)) ] = 0.0 score_mse = (1 - (deviations ** 2).mean()) if additional_metadata_out is not None: additional_metadata_out["score_MSE"] = 1 - score_mse # We additionally include other scores on (=) measurements as # a convenience eq_df = sub_df if 'measurement_inequality' in sub_df.columns: eq_df = sub_df.loc[ sub_df.measurement_inequality == "=" ] additional_metadata_out["score_pearsonr"] = ( pearsonr( numpy.log(eq_df.measurement_value.values), numpy.log(predictions[eq_df.index.values]))[0]) for threshold in [500, 5000, 15000]: if (eq_df.measurement_value < threshold).nunique() == 2: additional_metadata_out["score_AUC@%d" % threshold] = ( roc_auc_score( (eq_df.measurement_value < threshold).values, -1 * predictions[eq_df.index.values])) return score_mse * ( len(sub_df) if self.multiply_score_by_data_size else 1) summary = "mse (%d points)" % (len(sub_df)) return ScoreFunction(score, summary=summary) class MassSpecModelSelector(object): """ Model selector that uses PPV of differentiating decoys from hits from mass-spec experiments. """ def __init__( self, df, predictor, decoys_per_length=0, min_measurements=100, multiply_score_by_data_size=True): # Index is peptide, columns are alleles hit_matrix = df.groupby( ["peptide", "allele"]).measurement_value.count().unstack().fillna( 0).astype(bool) if decoys_per_length: (min_length, max_length) = predictor.supported_peptide_lengths decoys = [] for length in range(min_length, max_length + 1): decoys.extend( random_peptides(decoys_per_length, length=length)) decoy_matrix = pandas.DataFrame( index=decoys, columns=hit_matrix.columns, dtype=bool) decoy_matrix[:] = False full_matrix = pandas.concat([hit_matrix, decoy_matrix]) else: full_matrix = hit_matrix if len(full_matrix) > 0: full_matrix = full_matrix.sample(frac=1.0).astype(float) self.df = full_matrix self.predictor = predictor self.min_measurements = min_measurements self.multiply_score_by_data_size = multiply_score_by_data_size self.peptides = EncodableSequences.create(full_matrix.index.values) cache_encoding(self.predictor, self.peptides) @staticmethod def ppv(y_true, predictions): df = pandas.DataFrame({"prediction": predictions, "y_true": y_true}) return df.sort_values("prediction", ascending=True)[ : int(y_true.sum()) ].y_true.mean() def usable_for_allele(self, allele): return allele in self.df.columns and ( self.df[allele].sum() >= self.min_measurements) def max_absolute_value(self, allele): if self.multiply_score_by_data_size: return self.df[allele].sum() else: return 1.0 def plan_summary(self, allele): return self.score_function(allele).summary def score_function(self, allele): total_hits = self.df[allele].sum() total_decoys = (self.df[allele] == 0).sum() multiplier = total_hits if self.multiply_score_by_data_size else 1 def score(predictor, additional_metadata_out=None): predictions = predictor.predict( allele=allele, peptides=self.peptides, ) ppv = self.ppv(self.df[allele], predictions) if additional_metadata_out is not None: additional_metadata_out["score_mass_spec_PPV"] = ppv # We additionally compute AUC score. additional_metadata_out["score_mass_spec_AUC"] = roc_auc_score( self.df[allele].values, -1 * predictions) return ppv * multiplier summary = "mass-spec (%d hits / %d decoys)" % (total_hits, total_decoys) return ScoreFunction(score, summary=summary) if __name__ == '__main__': run() mhcflurry-2.3.6/mhcflurry/cli/select_pan_allele_models_command.py000066400000000000000000000426661525677230600254200ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Model select class1 pan-allele models. APPROACH: For each training fold, we select at least min and at most max models (where min and max are set by the --{min/max}-models-per-fold argument) using a step-up (forward) selection procedure. The final ensemble is the union of all selected models across all folds. """ import argparse import os import re import sys import time import hashlib from pprint import pprint import numpy import pandas import tqdm # progress bar from ..class1_affinity_predictor import Class1AffinityPredictor from ..encodable_sequences import EncodableSequences from ..allele_encoding import AlleleEncoding from ..common import ( configure_logging, filter_canonicalizable_alleles, install_sigusr1_stack_trace_handler, positive_int_arg, write_generate_sh, ) from ..parallelism import ( refine_local_parallelism_from_worker_context, resolve_local_parallelism_args, worker_pool_with_gpu_assignments_from_args, add_local_parallelism_args) from ..workload_planning import ( WORKLOAD_AFFINITY_SELECTION, model_artifact_size_bytes, path_size_bytes, ) from ..cluster_parallelism import ( add_cluster_parallelism_args, cluster_results_from_args) from ..regression_target import from_ic50, to_ic50 tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 # To avoid pickling large matrices to send to child processes when running in # parallel, we use this global variable as a place to store data. Data that is # stored here before creating the thread pool will be inherited to the child # processes upon fork() call, allowing local workers to read the same # copy-on-write pages instead of receiving a pickled copy. WORKER_CONTEXT = {} parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "--data", metavar="FILE.csv", required=False, help=( "Model selection data CSV. Expected columns: " "allele, peptide, measurement_value")) parser.add_argument( "--models-dir", metavar="DIR", required=True, help="Directory to read models") parser.add_argument( "--out-models-dir", metavar="DIR", required=True, help="Directory to write selected models") parser.add_argument( "--min-models-per-fold", type=positive_int_arg, default=None, metavar="N", help=( "Min number of models to select per fold. Default: 2, or the " "requested maximum when it is smaller.")) parser.add_argument( "--max-models-per-fold", type=positive_int_arg, default=1000, metavar="N", help="Max number of models to select per fold") parser.add_argument( "--mass-spec-regex", metavar="REGEX", default="mass[- ]spec", help="Regular expression for mass-spec data. Runs on measurement_source col." "Default: %(default)s.") parser.add_argument( "--verbosity", type=int, help="Verbosity. Default: %(default)s", default=0) parser.add_argument( "--save-validation-predictions", action="store_true", default=False, help=( "Save row-level out-of-fold predictions from the selected ensemble " "as model_selection_predictions.csv.bz2.")) add_local_parallelism_args(parser) add_cluster_parallelism_args(parser) def mse( predictions, actual, inequalities=None, affinities_are_already_01_transformed=False): """ Mean squared error of predictions vs. actual Parameters ---------- predictions : list of float actual : list of float inequalities : list of string (">", "<", or "=") affinities_are_already_01_transformed : boolean Predictions and actual are taken to be nanomolar affinities if affinities_are_already_01_transformed is False, otherwise 0-1 values. Returns ------- float """ if not affinities_are_already_01_transformed: predictions = from_ic50(predictions) actual = from_ic50(actual) deviations = ( numpy.asarray(predictions) - numpy.asarray(actual)) if inequalities is not None: # Must reverse meaning of inequality since we are working with # transformed 0-1 values, which are anti-correlated with the ic50s. # The measurement_inequality column is given in terms of ic50s. inequalities = numpy.asarray(inequalities) deviations[ ((inequalities == "<") & (deviations > 0)) | ( (inequalities == ">") & (deviations < 0)) ] = 0.0 return (deviations ** 2).mean() def run(argv=sys.argv[1:]): install_sigusr1_stack_trace_handler() args = parser.parse_args(argv) if args.min_models_per_fold is None: args.min_models_per_fold = min(2, args.max_models_per_fold) if args.min_models_per_fold > args.max_models_per_fold: parser.error( "--min-models-per-fold must not exceed --max-models-per-fold") args.out_models_dir = os.path.abspath(args.out_models_dir) configure_logging(verbose=args.verbosity > 1) resolve_local_parallelism_args( args, cap_auto_num_jobs=not args.cluster_parallelism, workload_name=WORKLOAD_AFFINITY_SELECTION, workload_hints={ "data_bytes": path_size_bytes(args.data), "model_bytes": model_artifact_size_bytes(args.models_dir), }, ) df = pandas.read_csv(args.data) print("Loaded data: %s" % (str(df.shape))) input_predictor = Class1AffinityPredictor.load( args.models_dir, optimization_level=0) print("Loaded: %s" % input_predictor) # Filter pseudogene / null / questionable alleles up front so a single # bad row in ``input_predictor.supported_alleles`` doesn't crash the # parallel selection pass mid-fold. Same helper that calibrate uses. alleles = filter_canonicalizable_alleles( input_predictor.supported_alleles, log_label="supported_alleles", ) (min_peptide_length, max_peptide_length) = ( input_predictor.supported_peptide_lengths) metadata_dfs = {} # Match only ``fold_`` exactly so a stray ``fold_0_x`` column # (e.g. from a pandas merge with default ``_x``/``_y`` suffixes) is # surfaced as a clean error instead of crashing later in # ``int(col.split("_")[-1])``. The merge that produced the suffix # collision is fixed upstream in train_pan_allele_models_command; # this is the defense-in-depth so the parser never lies. fold_cols = [c for c in df if re.match(r"^fold_\d+$", c)] num_folds = len(fold_cols) if num_folds <= 1: raise ValueError( "Too few clean ``fold_`` columns: %d (saw: %s)" % ( num_folds, [c for c in df if c.startswith("fold_")])) def make_train_peptide_hash(sub_df): train_peptide_hash = hashlib.sha1() for peptide in sorted(sub_df.peptide.values): train_peptide_hash.update(peptide.encode()) return train_peptide_hash.hexdigest() # Compute the per-fold training-peptide hash on the raw saved data # *before* applying the peptide-length / canonicalizable-allele # filters below. The saved ``train_data.csv.bz2`` was written by # ``train_pan_allele_models_command`` from the same df it trained # on, and the train-time hash is over that unfiltered fold subset. # Hashing the filtered df here would silently drop any rows whose # allele fails ``normalize_allele_name`` (pseudogenes / null # annotations are real entries in the public allele_sequences.csv) # and produce a false-positive mismatch against the train-time hash. fold_hashes = { int(col.split("_")[-1]): make_train_peptide_hash(df.loc[df[col] == 1]) for col in fold_cols } df = df.loc[ (df.peptide.str.len() >= min_peptide_length) & (df.peptide.str.len() <= max_peptide_length) ] print("Subselected to %d-%dmers: %s" % ( min_peptide_length, max_peptide_length, str(df.shape))) print("Num folds: ", num_folds, "fraction included:") print(df[fold_cols].mean()) # Allele names in data are assumed to be already normalized. df = df.loc[df.allele.isin(alleles)] print("Subselected to supported alleles: %s" % str(df.shape)) metadata_dfs["model_selection_data"] = df df["mass_spec"] = df.measurement_source.str.contains( args.mass_spec_regex) folds_to_predictors = { fold_num: ([], fold_hashes[fold_num]) for fold_num in fold_hashes } print(folds_to_predictors) for model in input_predictor.class1_pan_allele_models: training_info = model.fit_info[-1]['training_info'] fold_num = training_info['fold_num'] assert num_folds == training_info['num_folds'] (lst, hash) = folds_to_predictors[fold_num] train_peptide_hash = training_info['train_peptide_hash'] numpy.testing.assert_equal(hash, train_peptide_hash) lst.append(model) work_items = [] for (fold_num, (models, _)) in folds_to_predictors.items(): work_items.append({ 'fold_num': fold_num, 'models': models, 'min_models': args.min_models_per_fold, 'max_models': args.max_models_per_fold, 'save_validation_predictions': args.save_validation_predictions, }) WORKER_CONTEXT["data"] = df WORKER_CONTEXT["input_predictor"] = input_predictor if not args.cluster_parallelism: refine_local_parallelism_from_worker_context(args, WORKER_CONTEXT) if not os.path.exists(args.out_models_dir): print("Attempting to create directory: %s" % args.out_models_dir) os.mkdir(args.out_models_dir) print("Done.") result_predictor = Class1AffinityPredictor( allele_to_sequence=input_predictor.allele_to_sequence, metadata_dataframes=metadata_dfs) serial_run = not args.cluster_parallelism and args.num_jobs == 0 worker_pool = None start = time.time() print(f"TIMING_MARKER selection_start {start:.3f}") if serial_run: # Serial run print("Running in serial.") results = (model_select(**item) for item in work_items) elif args.cluster_parallelism: # Run using separate processes HPC cluster. print("Running on cluster.") results = cluster_results_from_args( args, work_function=model_select, work_items=work_items, constant_data=WORKER_CONTEXT, result_serialization_method="pickle") else: worker_pool = worker_pool_with_gpu_assignments_from_args( args, worker_context_module=__name__, worker_context_data=WORKER_CONTEXT, ) print("Worker pool", worker_pool) assert worker_pool is not None print("Processing %d work items in parallel." % len(work_items)) assert not serial_run # Parallel run results = worker_pool.imap_unordered( do_model_select_task, work_items, chunksize=1) models_by_fold = {} summary_dfs = [] validation_prediction_dfs = [] try: for result in tqdm.tqdm(results, total=len(work_items)): pprint({ key: value for (key, value) in result.items() if key != "validation_predictions" }) fold_num = result['fold_num'] (all_models_for_fold, _) = folds_to_predictors[fold_num] models = result['selected_models'] summary_df = result['summary'].copy() summary_df.index = summary_df.index.map( lambda idx, models=all_models_for_fold: models[idx]) summary_dfs.append(summary_df) if result['validation_predictions'] is not None: validation_prediction_dfs.append( result['validation_predictions']) print("Selected %d models for fold %d: %s" % ( len(models), fold_num, result['selected_indices'])) models_by_fold[fold_num] = models for model in models: result_predictor.add_pan_allele_model(model) if worker_pool: worker_pool.close() worker_pool.join() worker_pool = None finally: if worker_pool is not None: worker_pool.terminate() worker_pool.join() summary_df = pandas.concat(summary_dfs, ignore_index=False) summary_df["model_config"] = summary_df.index.map(lambda m: m.get_config()) result_predictor.metadata_dataframes["model_selection_summary"] = ( summary_df.reset_index(drop=True)) if validation_prediction_dfs: result_predictor.metadata_dataframes[ "model_selection_predictions"] = pandas.concat( validation_prediction_dfs, ignore_index=True).sort_values( ["validation_row_index", "fold_num"], kind="stable", ) result_predictor.save(args.out_models_dir) write_generate_sh(args.out_models_dir) model_selection_time = time.time() - start print(f"TIMING_MARKER selection_done {time.time():.3f}") print("Model selection time %0.2f min." % (model_selection_time / 60.0)) print("Predictor [%d models] written to: %s" % ( len(result_predictor.neural_networks), args.out_models_dir)) def do_model_select_task(item, constant_data=WORKER_CONTEXT): if 'constant_data' in item: constant_data = item.pop('constant_data') return model_select(constant_data=constant_data, **item) def model_select( fold_num, models, min_models, max_models, save_validation_predictions=False, constant_data=WORKER_CONTEXT): """ Model select for a fold. Parameters ---------- fold_num : int models : list of Class1NeuralNetwork min_models : int max_models : int constant_data : dict save_validation_predictions : bool Include per-model validation predictions in the result. Returns ------- dict with keys 'fold_num', 'selected_indices', 'summary' """ full_data = constant_data["data"] input_predictor = constant_data["input_predictor"] df = full_data.loc[ full_data["fold_%d" % fold_num] == 0 ] peptides = EncodableSequences.create(df.peptide.values) alleles = AlleleEncoding( df.allele.values, borrow_from=input_predictor.master_allele_encoding) predictions_df = df.copy() for (i, model) in enumerate(models): predictions_df[i] = from_ic50(model.predict(peptides, alleles)) actual = from_ic50(predictions_df.measurement_value) selected = [] selected_score = 0 remaining_models = set(numpy.arange(len(models))) individual_model_scores = {} while remaining_models and len(selected) < max_models: best_model = None best_model_score = 0 for i in remaining_models: possible_ensemble = list(selected) + [i] predictions = predictions_df[possible_ensemble].mean(axis=1) mse_score = 1 - mse( predictions, actual, inequalities=( predictions_df.measurement_inequality if 'measurement_inequality' in predictions_df.columns else None), affinities_are_already_01_transformed=True) if mse_score >= best_model_score: best_model = i best_model_score = mse_score if not selected: # First iteration. Store individual model scores. individual_model_scores[i] = mse_score if len(selected) < min_models or best_model_score > selected_score: selected_score = best_model_score remaining_models.remove(best_model) selected.append(best_model) else: break assert selected selected_models = [models[i] for i in selected] for model in selected_models: model.clear_allele_representations() summary_df = pandas.Series(individual_model_scores)[ numpy.arange(len(models)) ].to_frame() summary_df.columns = ['mse_score'] validation_predictions = None if save_validation_predictions: output_columns = [ column for column in df.columns if not re.match(r"^fold_\d+$", column) ] validation_predictions = df[output_columns].copy() validation_predictions.insert( 0, "validation_row_index", df.index.to_numpy()) validation_predictions["fold_num"] = fold_num prediction_01 = predictions_df[selected].mean(axis=1).to_numpy() validation_predictions["affinity_prediction_01"] = prediction_01 validation_predictions["affinity_prediction"] = to_ic50(prediction_01) validation_predictions["selected_model_indices"] = ",".join( str(index) for index in selected) return { 'fold_num': fold_num, 'selected_indices': selected, 'selected_models': selected_models, 'summary': summary_df, # indexed by model index 'validation_predictions': validation_predictions, } if __name__ == '__main__': run() mhcflurry-2.3.6/mhcflurry/cli/select_processing_models_command.py000066400000000000000000000340671525677230600254740ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Model select antigen processing models. APPROACH: For each training fold, we select at least min and at most max models (where min and max are set by the --{min/max}-models-per-fold argument) using a step-up (forward) selection procedure. The final ensemble is the union of all selected models across all folds. AUC is used as the metric. """ import argparse import os import re import sys import time import hashlib from pprint import pprint import numpy import pandas from sklearn.metrics import roc_auc_score import tqdm # progress bar from ..class1_processing_predictor import Class1ProcessingPredictor from ..flanking_encoding import FlankingEncoding from ..common import ( configure_logging, install_sigusr1_stack_trace_handler, positive_int_arg, write_generate_sh, ) from ..parallelism import ( refine_local_parallelism_from_worker_context, resolve_local_parallelism_args, worker_pool_with_gpu_assignments_from_args, add_local_parallelism_args) from ..workload_planning import ( WORKLOAD_PROCESSING_SELECTION, model_artifact_size_bytes, path_size_bytes, ) from ..cluster_parallelism import ( add_cluster_parallelism_args, cluster_results_from_args) tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 # To avoid pickling large matrices to send to child processes when running in # parallel, we use this global variable as a place to store data. Data that is # stored here before creating the thread pool will be inherited to the child # processes upon fork() call, allowing local workers to read the same # copy-on-write pages instead of receiving a pickled copy. WORKER_CONTEXT = {} parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument("--processing-data-policy", choices=("matched", "legacy"), default="matched") parser.add_argument( "--data", metavar="FILE.csv", required=False, help=( "Model selection data CSV. Expected columns: " "peptide, hit, fold_0, ..., fold_N")) parser.add_argument( "--models-dir", metavar="DIR", required=True, help="Directory to read models") parser.add_argument( "--out-models-dir", metavar="DIR", required=True, help="Directory to write selected models") parser.add_argument( "--min-models-per-fold", type=positive_int_arg, default=None, metavar="N", help=( "Min number of models to select per fold. Default: 2, or the " "requested maximum when it is smaller.")) parser.add_argument( "--max-models-per-fold", type=positive_int_arg, default=1000, metavar="N", help="Max number of models to select per fold") parser.add_argument( "--verbosity", type=int, help="Verbosity. Default: %(default)s", default=0) parser.add_argument( "--save-validation-predictions", action="store_true", default=False, help=( "Save row-level out-of-fold predictions from the selected ensemble " "as model_selection_predictions.csv.bz2.")) add_local_parallelism_args(parser) add_cluster_parallelism_args(parser) def run(argv=sys.argv[1:]): install_sigusr1_stack_trace_handler() args = parser.parse_args(argv) if args.min_models_per_fold is None: args.min_models_per_fold = min(2, args.max_models_per_fold) if args.min_models_per_fold > args.max_models_per_fold: parser.error( "--min-models-per-fold must not exceed --max-models-per-fold") args.out_models_dir = os.path.abspath(args.out_models_dir) configure_logging(verbose=args.verbosity > 1) resolve_local_parallelism_args( args, cap_auto_num_jobs=not args.cluster_parallelism, workload_name=WORKLOAD_PROCESSING_SELECTION, workload_hints={ "data_bytes": path_size_bytes(args.data), "model_bytes": model_artifact_size_bytes(args.models_dir), }, ) from mhcflurry.training_folds import read_processing_training_data df = read_processing_training_data(args.data) from ..processing_matching import validate_matched_training_data validate_matched_training_data(df, args.processing_data_policy) print("Loaded data: %s" % (str(df.shape))) input_predictor = Class1ProcessingPredictor.load(args.models_dir) print("Loaded: %s" % input_predictor) metadata_dfs = {} fold_cols = [c for c in df if re.match(r"^fold_\d+$", c)] num_folds = len(fold_cols) if num_folds <= 1: raise ValueError( "Too few clean ``fold_`` columns: %d (saw: %s)" % ( num_folds, [c for c in df if c.startswith("fold_")])) print("Num folds: ", num_folds, "fraction included:") print(df[fold_cols].mean()) metadata_dfs["model_selection_data"] = df def make_train_peptide_hash(sub_df): train_peptide_hash = hashlib.sha1() for peptide in sorted(sub_df.peptide.values): train_peptide_hash.update(peptide.encode()) return train_peptide_hash.hexdigest() folds_to_predictors = dict( (int(col.split("_")[-1]), ( [], make_train_peptide_hash(df.loc[df[col] == 1]))) for col in fold_cols) print(folds_to_predictors) for model in input_predictor.models: training_info = model.fit_info[-1]['training_info'] fold_num = training_info['fold_num'] assert num_folds == training_info['num_folds'] (lst, hash) = folds_to_predictors[fold_num] train_peptide_hash = training_info['train_peptide_hash'] numpy.testing.assert_equal(hash, train_peptide_hash) lst.append(model) work_items = [] for (fold_num, (models, _)) in folds_to_predictors.items(): work_items.append({ 'fold_num': fold_num, 'models': models, 'min_models': args.min_models_per_fold, 'max_models': args.max_models_per_fold, 'save_validation_predictions': args.save_validation_predictions, }) WORKER_CONTEXT["data"] = df WORKER_CONTEXT["input_predictor"] = input_predictor if not args.cluster_parallelism: refine_local_parallelism_from_worker_context(args, WORKER_CONTEXT) if not os.path.exists(args.out_models_dir): print("Attempting to create directory: %s" % args.out_models_dir) os.mkdir(args.out_models_dir) print("Done.") result_predictor = Class1ProcessingPredictor( models=[], metadata_dataframes=metadata_dfs) serial_run = not args.cluster_parallelism and args.num_jobs == 0 worker_pool = None start = time.time() if serial_run: # Serial run print("Running in serial.") results = (model_select(**item) for item in work_items) elif args.cluster_parallelism: # Run using separate processes HPC cluster. print("Running on cluster.") results = cluster_results_from_args( args, work_function=model_select, work_items=work_items, constant_data=WORKER_CONTEXT, result_serialization_method="pickle") else: worker_pool = worker_pool_with_gpu_assignments_from_args( args, worker_context_module=__name__, worker_context_data=WORKER_CONTEXT, ) print("Worker pool", worker_pool) assert worker_pool is not None print("Processing %d work items in parallel." % len(work_items)) assert not serial_run # Parallel run results = worker_pool.imap_unordered( do_model_select_task, work_items, chunksize=1) models_by_fold = {} summary_dfs = [] validation_prediction_dfs = [] try: for result in tqdm.tqdm(results, total=len(work_items)): pprint({ key: value for (key, value) in result.items() if key != "validation_predictions" }) fold_num = result['fold_num'] (all_models_for_fold, _) = folds_to_predictors[fold_num] models = [ all_models_for_fold[i] for i in result['selected_indices'] ] summary_df = result['summary'].copy() summary_df.index = summary_df.index.map( lambda idx, models=all_models_for_fold: models[idx]) summary_dfs.append(summary_df) if result['validation_predictions'] is not None: validation_prediction_dfs.append( result['validation_predictions']) print("Selected %d models for fold %d: %s" % ( len(models), fold_num, result['selected_indices'])) models_by_fold[fold_num] = models result_predictor.add_models(models) if worker_pool: worker_pool.close() worker_pool.join() worker_pool = None finally: if worker_pool is not None: worker_pool.terminate() worker_pool.join() summary_df = pandas.concat(summary_dfs, ignore_index=False) summary_df["model_config"] = summary_df.index.map(lambda m: m.get_config()) result_predictor.metadata_dataframes["model_selection_summary"] = ( summary_df.reset_index(drop=True)) if validation_prediction_dfs: result_predictor.metadata_dataframes[ "model_selection_predictions"] = pandas.concat( validation_prediction_dfs, ignore_index=True).sort_values( ["validation_row_index", "fold_num"], kind="stable", ) result_predictor.save(args.out_models_dir) write_generate_sh(args.out_models_dir) model_selection_time = time.time() - start print("Model selection time %0.2f min." % (model_selection_time / 60.0)) print("Predictor [%d models] written to: %s" % ( len(result_predictor.models), args.out_models_dir)) def do_model_select_task(item, constant_data=WORKER_CONTEXT): return model_select(constant_data=constant_data, **item) def model_select( fold_num, models, min_models, max_models, save_validation_predictions=False, constant_data=WORKER_CONTEXT): """ Model select for a fold. Parameters ---------- fold_num : int models : list of Class1ProcessingNeuralNetwork min_models : int max_models : int constant_data : dict save_validation_predictions : bool Include per-model validation predictions in the result. Returns ------- dict with keys 'fold_num', 'selected_indices', 'summary' """ full_data = constant_data["data"] df = full_data.loc[ full_data["fold_%d" % fold_num] == 0 ] sequences = FlankingEncoding( peptides=df.peptide.values, n_flanks=df.n_flank.values, c_flanks=df.c_flank.values) targets = df.hit.values prediction_matrix = numpy.empty((len(df), len(models)), dtype=numpy.float32) for (i, model) in enumerate(models): prediction_matrix[:, i] = model.predict_encoded(sequences) selected = [] selected_sum = None selected_score = -numpy.inf remaining_models = set(range(len(models))) individual_model_scores = {} selected_in_round = {} ensemble_score_when_selected = {} while remaining_models and len(selected) < max_models: best_model = None best_model_score = -numpy.inf for i in remaining_models: if selected_sum is None: predictions = prediction_matrix[:, i] else: predictions = ( selected_sum + prediction_matrix[:, i] ) / float(len(selected) + 1) auc_score = roc_auc_score(targets, predictions) if auc_score > best_model_score: best_model = i best_model_score = auc_score if not selected: # First iteration. Store individual model scores. individual_model_scores[i] = auc_score if len(selected) < min_models or best_model_score > selected_score: selected_score = best_model_score remaining_models.remove(best_model) selected.append(best_model) if selected_sum is None: selected_sum = prediction_matrix[:, best_model].copy() else: selected_sum += prediction_matrix[:, best_model] selected_in_round[best_model] = len(selected) ensemble_score_when_selected[best_model] = selected_score else: break assert selected summary_df = pandas.Series(individual_model_scores)[ numpy.arange(len(models)) ].to_frame() summary_df.columns = ['auc_score'] summary_df["selected_in_round"] = pandas.Series(selected_in_round) summary_df["ensemble_score_when_selected"] = pandas.Series( ensemble_score_when_selected) validation_predictions = None if save_validation_predictions: output_columns = [ column for column in df.columns if not re.match(r"^fold_\d+$", column) ] validation_predictions = df[output_columns].copy() validation_predictions.insert( 0, "validation_row_index", df.index.to_numpy()) validation_predictions["fold_num"] = fold_num validation_predictions["processing_score"] = ( prediction_matrix[:, selected].mean(axis=1)) validation_predictions["selected_model_indices"] = ",".join( str(index) for index in selected) print(summary_df) return { 'fold_num': fold_num, 'selected_indices': selected, 'summary': summary_df, # indexed by model index 'validation_predictions': validation_predictions, } if __name__ == '__main__': run() mhcflurry-2.3.6/mhcflurry/cli/train_allele_specific_models_command.py000066400000000000000000000633121525677230600262540ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Train Class1 single allele models. """ import argparse import os import sys import time import random from functools import partial import numpy import pandas import yaml from sklearn.metrics.pairwise import cosine_similarity from sklearn.model_selection import StratifiedKFold import tqdm # progress bar from ..class1_affinity_predictor import Class1AffinityPredictor from ..device_footprint import estimate_affinity_training_device_worker_gb from ..common import ( add_random_seed_arg, configure_logging, configure_random_seed, derive_seed, install_sigusr1_stack_trace_handler, normalize_allele_name, positive_float_arg, positive_int_arg, write_generate_sh, ) from ..parallelism import ( add_local_parallelism_args, apply_resolved_training_hyperparameters_to_work_items, resolve_local_parallelism_args, worker_pool_with_gpu_assignments_from_args, call_wrapped_kwargs) from ..workload_planning import ( WORKLOAD_AFFINITY_TRAINING, path_size_bytes, ) from ..hyperparameters import HyperparameterDefaults from ..allele_encoding import AlleleEncoding tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 # To avoid pickling large matrices to send to child processes when running in # parallel, we use this global variable as a place to store data. Data that is # stored here before creating the thread pool will be inherited to the child # processes upon fork() call, allowing local workers to read the same # copy-on-write pages instead of receiving a pickled copy. WORKER_CONTEXT = {} def _held_out_fraction_reciprocal_arg(value): result = positive_int_arg(value) if result < 2: raise argparse.ArgumentTypeError( "held-out fraction reciprocal must be at least 2" ) return result def _alleles_with_minimum_measurements(allele_counts, minimum): """Return alleles meeting the documented inclusive count threshold.""" return list(allele_counts.loc[allele_counts >= minimum].index) # Note on parallelization: # When running in parallel, avoid using the neural network backend in the main # process. Model loading and inference should happen in worker processes. parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "--data", metavar="FILE.csv", required=True, help=( "Training data CSV. Expected columns: " "allele, peptide, measurement_value")) parser.add_argument( "--out-models-dir", metavar="DIR", required=True, help="Directory to write models and manifest") parser.add_argument( "--hyperparameters", metavar="FILE.json", required=True, help="JSON or YAML of hyperparameters") parser.add_argument( "--allele", default=None, nargs="+", help="Alleles to train models for. If not specified, all alleles with " "enough measurements will be used.") parser.add_argument( "--min-measurements-per-allele", type=positive_int_arg, metavar="N", default=50, help="Train models for alleles with >=N measurements.") parser.add_argument( "--held-out-fraction-reciprocal", type=_held_out_fraction_reciprocal_arg, metavar="N", default=None, help="Hold out 1/N fraction of data (for e.g. subsequent model selection. " "For example, specify 5 to hold out 20 percent of the data.") parser.add_argument( "--held-out-fraction-seed", type=int, metavar="N", default=None, help="Seed for randomizing which measurements are held out. Only matters " "when --held-out-fraction-reciprocal is specified. When omitted, the " "held-out split " "is derived from --random-seed (so the whole run reproduces from one " "value). Pass this explicitly to control the split directly — e.g. to " "reproduce a pre-2.3.0 split — overriding --random-seed for the split.") add_random_seed_arg(parser) parser.add_argument( "--ignore-inequalities", action="store_true", default=False, help="Do not use affinity value inequalities even when present in data") parser.add_argument( "--n-models", type=positive_int_arg, metavar="N", help="Ensemble size, i.e. how many models to train for each architecture. " "If specified here it overrides any 'n_models' specified in the " "hyperparameters.") parser.add_argument( "--max-epochs", type=positive_int_arg, metavar="N", help="Max training epochs. If specified here it overrides any 'max_epochs' " "specified in the hyperparameters.") parser.add_argument( "--allele-sequences", metavar="FILE.csv", help="Allele sequences file. Used for computing allele similarity matrix.") parser.add_argument( "--save-interval", type=positive_float_arg, metavar="N", default=60, help="Write models to disk every N seconds. Only affects parallel runs; " "serial runs write each model to disk as it is trained.") parser.add_argument( "--verbosity", type=int, help="Verbosity. Default: %(default)s", default=0) add_local_parallelism_args(parser) TRAIN_DATA_HYPERPARAMETER_DEFAULTS = HyperparameterDefaults( subset="all", pretrain_min_points=None, ) def run(argv=sys.argv[1:]): install_sigusr1_stack_trace_handler() args = parser.parse_args(argv) args.out_models_dir = os.path.abspath(args.out_models_dir) configure_logging(verbose=args.verbosity > 1) # Resolve the master seed once for the whole run and seed this process's # global RNGs before any main-process randomness: the held-out split # (subselect_df_held_out), the per-allele ``.sample(frac=1.0)`` data # shuffles in train_model, the ``random.shuffle(work_items)`` dispatch # ordering, and alleles_by_similarity's ``.sample``. Per-fit weight init # and shuffles happen inside workers (which reseed from entropy), so # those are pinned separately via derive_seed below. --random-seed # defaults to 42; the resolved value is logged either way. master_seed = configure_random_seed( args.random_seed, name="train-allele-specific") with open(args.hyperparameters) as fd: hyperparameters_lst = yaml.safe_load(fd) if not isinstance(hyperparameters_lst, list) or not hyperparameters_lst: raise ValueError( "Hyperparameters file must contain a non-empty list of mappings" ) if not all(isinstance(item, dict) for item in hyperparameters_lst): raise ValueError("Every hyperparameter entry must be a mapping") for index, hyperparameters in enumerate(hyperparameters_lst): if args.n_models is None: if "n_models" not in hyperparameters: raise ValueError( "Hyperparameter entry %d must specify a positive n_models " "or --n-models must be supplied" % index ) try: hyperparameters["n_models"] = positive_int_arg( hyperparameters["n_models"]) except argparse.ArgumentTypeError as error: raise ValueError( "Hyperparameter entry %d has invalid n_models: %s" % ( index, error) ) from error if "max_epochs" in hyperparameters: value = hyperparameters["max_epochs"] try: parsed = int(value) except (TypeError, ValueError): parsed = -1 if ( isinstance(value, bool) or parsed < 0 or (isinstance(value, float) and not value.is_integer())): raise ValueError( "Hyperparameter entry %d has invalid max_epochs: expected " "a non-negative integer, got %r" % (index, value) ) hyperparameters["max_epochs"] = parsed if "minibatch_size" in hyperparameters: try: hyperparameters["minibatch_size"] = positive_int_arg( hyperparameters["minibatch_size"]) except argparse.ArgumentTypeError as error: raise ValueError( "Hyperparameter entry %d has invalid minibatch_size: %s" % ( index, error) ) from error print("Loaded hyperparameters list: %s" % str(hyperparameters_lst)) df = pandas.read_csv(args.data) print("Loaded training data: %s" % (str(df.shape))) required_columns = { "allele", "peptide", "measurement_value", "measurement_type", } missing_columns = sorted(required_columns.difference(df.columns)) if missing_columns: raise ValueError( "Training data is missing required column(s): %s" % ", ".join(missing_columns) ) df = df.loc[ (df.peptide.str.len() >= 8) & (df.peptide.str.len() <= 15) ] print("Subselected to 8-15mers: %s" % (str(df.shape))) if args.ignore_inequalities and "measurement_inequality" in df.columns: print("Dropping measurement_inequality column") del df["measurement_inequality"] # Canonicalize allele names (merge aliased / retired / alternative spellings # to one canonical name) before counting and grouping, so the same allele # under different spellings trains as a single model rather than fragmenting # into several. Unparseable names are dropped. Allele-specific models have no # shared pseudosequence space, so plain normalization (mhcgnomes aliases # applied) is the canonical form here. # Drop null alleles up front (curated data has none, but a user-supplied # CSV might) so they don't reach the dict-keyed map below. df = df.dropna(subset=["allele"]) allele_norm = { a: normalize_allele_name(a, raise_on_error=False) for a in df.allele.unique() } n_unparseable = sum(1 for v in allele_norm.values() if v is None) if n_unparseable: print("Dropping %d unparseable allele name(s) from training data" % n_unparseable) df = df.assign(allele=df.allele.map(allele_norm)).dropna(subset=["allele"]) # Allele counts are in terms of quantitative data only. allele_counts = ( df.loc[df.measurement_type == "quantitative"].allele.value_counts()) if args.allele: alleles = [normalize_allele_name(a) for a in args.allele] else: alleles = _alleles_with_minimum_measurements( allele_counts, args.min_measurements_per_allele) print("Selected %d/%d alleles: %s" % (len(alleles), df.allele.nunique(), ' '.join(alleles))) essential_columns = [ "allele", "peptide", "measurement_value", "measurement_type", ] if "measurement_inequality" in df.columns: essential_columns.append("measurement_inequality") df = df.loc[df.allele.isin(alleles)].dropna(subset=essential_columns) if "measurement_inequality" in df.columns: invalid_inequalities = ~df.measurement_inequality.isin(["=", "<", ">"]) if invalid_inequalities.any(): raise ValueError( "Training data contains %d invalid measurement_inequality " "value(s); expected only =, <, or >" % int(invalid_inequalities.sum()) ) if not alleles or df.empty: raise ValueError( "No training rows remain for the requested allele/count filters" ) if args.held_out_fraction_reciprocal: # An explicit --held-out-fraction-seed controls the split directly # (legacy behavior, e.g. to reproduce a pre-2.3.0 split). Otherwise # --random-seed governs the split too, so the whole run reproduces # from one value; derive a stable sub-seed so it's decorrelated from # the per-fit seeds. held_out_seed = ( args.held_out_fraction_seed if args.held_out_fraction_seed is not None else derive_seed(master_seed, "held_out_fraction")) df = subselect_df_held_out( df, reciprocal_held_out_fraction=args.held_out_fraction_reciprocal, seed=held_out_seed % (2 ** 32)) print("Training data: %s" % (str(df.shape))) WORKER_CONTEXT["train_data"] = df WORKER_CONTEXT["args"] = args # Persist the resolved master seed so workers (which reseed from entropy # in worker_init) can derive a stable per-fit seed via derive_seed. The # main-process global seeding above doesn't reach worker fits. WORKER_CONTEXT["seed"] = master_seed resolve_local_parallelism_args( args, per_worker_gb=max(( estimate for estimate in ( estimate_affinity_training_device_worker_gb(hp, len(df)) for hp in hyperparameters_lst ) if estimate is not None ), default=None), workload_name=WORKLOAD_AFFINITY_TRAINING, workload_hints={ "data_bytes": path_size_bytes(args.data), "num_work_items": int(df.allele.nunique()) * sum( int(args.n_models or hp.get("n_models") or 1) for hp in hyperparameters_lst ), "num_rows": len(df), }, ) if not os.path.exists(args.out_models_dir): print("Attempting to create directory: %s" % args.out_models_dir) os.mkdir(args.out_models_dir) print("Done.") predictor = Class1AffinityPredictor( metadata_dataframes={ 'train_data': df, }) serial_run = args.num_jobs == 0 work_items = [] for (h, hyperparameters) in enumerate(hyperparameters_lst): n_models = None if 'n_models' in hyperparameters: n_models = hyperparameters.pop("n_models") if args.n_models: n_models = args.n_models n_models = positive_int_arg(n_models) if args.max_epochs: hyperparameters['max_epochs'] = args.max_epochs hyperparameters['train_data'] = ( TRAIN_DATA_HYPERPARAMETER_DEFAULTS.with_defaults( hyperparameters.get('train_data', {}))) if hyperparameters['train_data']['pretrain_min_points'] and ( 'allele_similarity_matrix' not in WORKER_CONTEXT): print("Generating allele similarity matrix.") if not args.allele_sequences: parser.error( "Allele sequences required when using pretrain_min_points") allele_sequences = pandas.read_csv( args.allele_sequences, index_col="allele") print("Read %d allele sequences" % len(allele_sequences)) allele_sequences = allele_sequences.loc[ allele_sequences.index.isin(df.allele.unique()) ] print("Allele sequences matching train data: %d" % len(allele_sequences)) blosum_encoding = ( AlleleEncoding( allele_sequences.index.values, allele_sequences.pseudosequence.to_dict()) .fixed_length_vector_encoded_sequences("BLOSUM62")) allele_similarity_matrix = pandas.DataFrame( cosine_similarity( blosum_encoding.reshape((len(allele_sequences), -1))), index=allele_sequences.index.values, columns=allele_sequences.index.values) WORKER_CONTEXT['allele_similarity_matrix'] = allele_similarity_matrix print("Computed allele similarity matrix") print(allele_similarity_matrix) for (i, allele) in enumerate(df.allele.unique()): for model_num in range(n_models): work_dict = { 'n_models': 1, 'allele_num': i, 'n_alleles': len(alleles), 'model_num': model_num, 'hyperparameter_set_num': h, 'num_hyperparameter_sets': len(hyperparameters_lst), 'allele': allele, 'hyperparameters': hyperparameters, 'verbose': args.verbosity, 'progress_print_interval': None if not serial_run else 5.0, 'predictor': predictor if serial_run else None, 'save_to': args.out_models_dir if serial_run else None, } work_items.append(work_dict) apply_resolved_training_hyperparameters_to_work_items(work_items, args) start = time.time() worker_pool = worker_pool_with_gpu_assignments_from_args( args, worker_context_module=__name__, worker_context_data=WORKER_CONTEXT, ) if args.num_jobs == 0 and not serial_run: # Loaded spawn-context sizing can safely tighten an automatic pool all # the way to serial execution. Reconfigure work items that were built # before the final in-memory context size was known. serial_run = True for item in work_items: item["progress_print_interval"] = 5.0 item["predictor"] = predictor item["save_to"] = args.out_models_dir if args.num_jobs != 0: print("Processing %d work items in parallel." % len(work_items)) # The estimated time to completion is more accurate if we randomize # the order of the work. random.shuffle(work_items) # NOTE: torch.compile warmup is currently wired only for the # pan-allele and processing trainers, which expose a # ``compile_warmup_only=True`` short-circuit in their # ``train_model``. The allele-specific trainer goes through # ``fit_allele_specific_predictors`` and would need its own # warmup short-circuit; until that exists, the production pool # eats one ~30 s first-compile per architecture per process, # which is acceptable for this trainer's smaller sweeps. assert worker_pool is not None results_generator = worker_pool.imap_unordered( partial(call_wrapped_kwargs, train_model), work_items, chunksize=1) try: unsaved_predictors = [] last_save_time = time.time() for new_predictor in tqdm.tqdm(results_generator, total=len(work_items)): unsaved_predictors.append(new_predictor) if time.time() > last_save_time + args.save_interval: # Save current predictor. save_start = time.time() new_model_names = predictor.merge_in_place(unsaved_predictors) predictor.save( args.out_models_dir, model_names_to_write=new_model_names, write_metadata=False) print( "Saved predictor (%d models total) including %d new models " "in %0.2f sec to %s" % ( len(predictor.neural_networks), len(new_model_names), time.time() - save_start, args.out_models_dir)) unsaved_predictors = [] last_save_time = time.time() predictor.merge_in_place(unsaved_predictors) worker_pool.close() worker_pool.join() worker_pool = None finally: # On failure mid-iteration, terminate() rather than # close()/join() (which can hang on a wedged worker) and # leave non-daemon workers behind. if worker_pool is not None: worker_pool.terminate() worker_pool.join() else: assert worker_pool is None # Run in serial. In this case, every worker is passed the same predictor, # which it adds models to, so no merging is required. It also saves # as it goes so no saving is required at the end. for _ in tqdm.trange(len(work_items)): item = work_items.pop(0) # want to keep freeing up memory work_predictor = train_model(**item) assert work_predictor is predictor assert not work_items print("Saving final predictor to: %s" % args.out_models_dir) predictor.save(args.out_models_dir) # write all models just to be sure write_generate_sh(args.out_models_dir) print("Done.") print("*" * 30) training_time = time.time() - start print("Trained affinity predictor with %d networks in %0.2f min." % ( len(predictor.neural_networks), training_time / 60.0)) print("*" * 30) if worker_pool: worker_pool.close() worker_pool.join() print("Predictor written to: %s" % args.out_models_dir) def alleles_by_similarity(allele): allele_similarity = WORKER_CONTEXT['allele_similarity_matrix'] if allele not in allele_similarity.columns: # Use random alleles print("No similar alleles for: %s" % allele) return [allele] + list( allele_similarity.columns.to_series().sample(frac=1.0)) return ( allele_similarity[allele] + ( allele_similarity.index == allele) # force specified allele first ).sort_values(ascending=False).index.tolist() def train_model( n_models, allele_num, n_alleles, model_num, hyperparameter_set_num, num_hyperparameter_sets, allele, hyperparameters, verbose, progress_print_interval, predictor, save_to, constant_data=WORKER_CONTEXT): if predictor is None: predictor = Class1AffinityPredictor() # One stable per-fit seed controls every stochastic step of this work # item. Seed the worker's global RNG from it up front — workers reseed # from entropy in worker_init, so the main process's global seeding does # not reach here. This pins the randomness that runs before fit(): the # similar-allele selection in alleles_by_similarity (pretrain path) and # the data shuffle below. Derived from the run's master seed plus this # fit's identity coordinates, so the whole run is reproducible from # --random-seed regardless of dispatch order. When no master seed was # recorded (legacy run) training is left stochastic. master_seed = constant_data.get("seed") work_item_seed = ( None if master_seed is None else derive_seed( master_seed, allele, hyperparameter_set_num, model_num)) if work_item_seed is not None: numpy.random.seed(work_item_seed % (2 ** 32)) pretrain_min_points = hyperparameters['train_data']['pretrain_min_points'] data = constant_data["train_data"] subset = hyperparameters.get("train_data", {}).get("subset", "all") if subset == "quantitative": data = data.loc[ data.measurement_type == "quantitative" ] elif subset == "all": pass else: raise ValueError("Unsupported subset: %s" % subset) data_size_by_allele = data.allele.value_counts() if pretrain_min_points: similar_alleles = alleles_by_similarity(allele) alleles = [] while not alleles or data_size_by_allele.loc[alleles].sum() < pretrain_min_points: alleles.append(similar_alleles.pop(0)) data = data.loc[data.allele.isin(alleles)] assert len(data) >= pretrain_min_points, (len(data), pretrain_min_points) train_rounds = (data.allele == allele).astype(int).values else: train_rounds = None data = data.loc[data.allele == allele] progress_preamble = ( "[%2d / %2d hyperparameters] " "[%4d / %4d alleles] %s " % ( hyperparameter_set_num + 1, num_hyperparameter_sets, allele_num + 1, n_alleles, allele)) # Shuffle with an explicit random_state derived from the work-item seed, # so the data order is reproducible and decoupled from however many draws # alleles_by_similarity took from the global RNG above. train_data = data.sample( frac=1.0, random_state=( None if work_item_seed is None else work_item_seed % (2 ** 32))) predictor.fit_allele_specific_predictors( n_models=n_models, architecture_hyperparameters_list=[hyperparameters], allele=allele, peptides=train_data.peptide.values, affinities=train_data.measurement_value.values, inequalities=( train_data.measurement_inequality.values if "measurement_inequality" in train_data.columns else None), train_rounds=train_rounds, models_dir_for_save=save_to, progress_preamble=progress_preamble, progress_print_interval=progress_print_interval, seed=work_item_seed, verbose=verbose) return predictor def subselect_df_held_out(df, reciprocal_held_out_fraction=10, seed=0): df = df.copy() df["allele_peptide"] = df.allele + "_" + df.peptide kf = StratifiedKFold( n_splits=reciprocal_held_out_fraction, shuffle=True, random_state=seed) # Stratify by both allele and binder vs. nonbinder. df["key"] = [ "%s_%s" % ( row.allele, "binder" if row.measurement_value <= 500 else "nonbinder") for (_, row) in df.iterrows() ] (train, test) = next(kf.split(df, df.key)) selected_allele_peptides = df.iloc[train].allele_peptide.unique() result_df = df.loc[ df.allele_peptide.isin(selected_allele_peptides) ] del result_df["allele_peptide"] return result_df if __name__ == '__main__': run() mhcflurry-2.3.6/mhcflurry/cli/train_command.py000066400000000000000000000300421525677230600215200ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Release-training workflow commands. ``mhcflurry train`` is the semantic home for maintainer-level training workflows that compose lower-level training CLIs. The first command is a source-checkout wrapper around ``scripts/release/retrain_evaluate_deploy.sh``: it keeps Brev/runplz orchestration, artifact sync, evaluation, plotting, and optional deployment in one maintained implementation while giving users a stable ``mhcflurry`` entry point. """ import argparse import os from pathlib import Path import subprocess import sys WORKFLOW_SCRIPT = Path("scripts/release/retrain_evaluate_deploy.sh") TRAINING_SCRIPTS = { "benchmark-processing-sampler": Path("scripts/training/benchmark_processing_sampler.py"), "benchmark-processing-preparation": Path("scripts/training/benchmark_processing_preparation.py"), "processing-kernel-sweep": Path("scripts/training/run_processing_kernel_sweep.py"), "processing-hyperparameter-sweep": Path("scripts/training/run_processing_kernel_sweep.py"), "processing-data": Path("scripts/training/release_exact/make_train_data.processing.py"), "exact-public-processing": Path("scripts/training/run_exact_public_processing.py"), "audit-training-data": Path("scripts/training/audit_training_data_identity.py"), "compose-processing-ensemble": Path( "scripts/training/compose_processing_ensemble.py"), } def make_parser(prog="mhcflurry train"): parser = argparse.ArgumentParser( prog=prog, description=( "Training workflows that compose lower-level MHCflurry training " "commands." ), ) sub = parser.add_subparsers(dest="train_subcommand") sub.add_parser("benchmark-processing-preparation", add_help=False, help="Benchmark numeric preparation and verify matching/prediction parity") sub.add_parser("benchmark-processing-sampler", add_help=False, help="Benchmark numeric-position versus reservoir candidate sampling.") sub.add_parser("processing-kernel-sweep", add_help=False, help="Run the paired, matched-data processing kernel-width sweep.") sub.add_parser("processing-hyperparameter-sweep", add_help=False, help="Run a paired processing width or optimizer/initialization/batch design.") sub.add_parser("processing-data", add_help=False, help="Generate affinity/length-matched processing training data.") sub.add_parser("validate-processing-data", add_help=False, help="Verify cached matched processing data before reuse.") sub.add_parser("exact-public-processing", add_help=False, help="Replay the frozen processing candidate on exact public rows/folds.") sub.add_parser("audit-training-data", add_help=False, help="Audit exact training row identity between two tables.") pan = sub.add_parser( "pan-allele-release", add_help=False, help=( "Train pan-allele release weights, optionally evaluate, plot, " "sync remote artifacts, and deploy model archives." ), description=( "Delegate to scripts/release/retrain_evaluate_deploy.sh. " "Run 'mhcflurry train pan-allele-release --help' for the full " "workflow flags." ), ) pan.add_argument( "workflow_args", nargs=argparse.REMAINDER, help="Arguments forwarded to scripts/release/retrain_evaluate_deploy.sh.", ) holdout = sub.add_parser( "release-holdout", add_help=False, help="Build or validate the frozen release evaluation holdout.", ) holdout.add_argument("holdout_args", nargs=argparse.REMAINDER) loss_curves = sub.add_parser( "plot-loss-curves", add_help=False, help="Plot training loss curves and highlight selected models.", ) loss_curves.add_argument("plot_args", nargs=argparse.REMAINDER) snapshot = sub.add_parser( "snapshot-experiment", add_help=False, help="Archive reproducible experiment metadata and plotting tables.", ) snapshot.add_argument("snapshot_args", nargs=argparse.REMAINDER) checkpoints = sub.add_parser( "materialize-affinity-checkpoint", add_help=False, help="Create a predictor from retained terminal or best checkpoints.", ) checkpoints.add_argument("checkpoint_args", nargs=argparse.REMAINDER) compose = sub.add_parser( "compose-processing-ensemble", add_help=False, help="Combine complete processing predictors with recorded provenance.", ) compose.add_argument("compose_args", nargs=argparse.REMAINDER) return parser def _format_help(prog): return "\n".join([ ( "usage: %s {pan-allele-release,release-holdout," "plot-loss-curves,snapshot-experiment," "materialize-affinity-checkpoint,compose-processing-ensemble," "audit-training-data,exact-public-processing,processing-data," "validate-processing-data,processing-kernel-sweep,processing-hyperparameter-sweep,benchmark-processing-sampler," "benchmark-processing-preparation} ..." % prog ), "", "Training workflows.", "", "Subcommands:", " pan-allele-release Train/evaluate/plot release weights from one entry point.", " release-holdout Build/validate frozen evaluation exclusions.", " plot-loss-curves Plot candidate losses and selected models.", " snapshot-experiment Archive hashes, provenance, metrics, and epoch tables.", " materialize-affinity-checkpoint", " Select retained terminal or best affinity weights.", " compose-processing-ensemble", " Build a provenance-recorded processing ensemble.", " audit-training-data Audit exact row identity and multiplicities.", " exact-public-processing Replay exact public processing/presentation data.", " processing-data Generate matched processing training data.", " processing-kernel-sweep Train/evaluate the paired 48-network width sweep.", " processing-hyperparameter-sweep Run a paired width or training-recipe design.", " benchmark-processing-sampler Compare candidate sampling implementations.", " benchmark-processing-preparation Check numeric, matching and prediction parity/timings.", " validate-processing-data Verify cached matching assignments and metadata.", "", "Examples:", " %s pan-allele-release --run-dir runs/2.3.0 --release 2.3.0 --backend local" % prog, " %s pan-allele-release --run-dir runs/2.3.0 --release 2.3.0 --backend brev-provision" % prog, " %s plot-loss-curves --selected-dir models.combined --out plots" % prog, " %s snapshot-experiment --source-dir results/run --name batch-sweep" % prog, ( " %s materialize-affinity-checkpoint --models-dir models.unselected.combined " "--policy best --out-models-dir models.unselected.best" % prog ), "", "Deployment is opt-in. Pass --deploy-mode dry-run, draft, or publish " "to run the model-artifact deployment step.", ]) def _workflow_script_path(): repo_root = Path(__file__).resolve().parents[2] candidates = [ repo_root / WORKFLOW_SCRIPT, Path.cwd() / WORKFLOW_SCRIPT, ] for candidate in candidates: if candidate.exists(): return candidate raise SystemExit( "Could not find %s. This command must be run from a source checkout " "or an editable install that includes the scripts/ directory." % WORKFLOW_SCRIPT ) def _training_script_path(subcommand): relative = TRAINING_SCRIPTS[subcommand] repo_root = Path(__file__).resolve().parents[2] for candidate in (repo_root / relative, Path.cwd() / relative): if candidate.exists(): return candidate raise SystemExit( "Could not find %s. This command must be run from a source checkout " "or editable install." % relative) def _run_training_script(subcommand, argv): env = os.environ.copy() env["MHCFLURRY_CLI_PROG"] = "mhcflurry train %s" % subcommand return subprocess.call([ sys.executable, str(_training_script_path(subcommand)), *argv, ], env=env) def _require_explicit_design(argv, prog): """Stop the generic sweep alias from inheriting the kernel-width default.""" parser = argparse.ArgumentParser( prog=prog, usage="%(prog)s --design DESIGN [options]", add_help=False) parser.add_argument("-h", "--help", action="store_true") parser.add_argument("--design") known, _ = parser.parse_known_args(argv) if not known.help and known.design is None: parser.error( "--design is required; see --help for designs, or use " "processing-kernel-sweep for the kernel-width sweep") def _print_pan_allele_release_help(script, prog): result = subprocess.run( ["bash", str(script), "--help"], capture_output=True, text=True, check=False, ) help_text = result.stdout or result.stderr help_text = help_text.replace(str(WORKFLOW_SCRIPT), prog) print(help_text, end="" if help_text.endswith("\n") else "\n") return result.returncode def _run_pan_allele_release(argv, prog): script = _workflow_script_path() if argv and argv[0] in ("-h", "--help"): return _print_pan_allele_release_help(script, prog) return subprocess.call(["bash", str(script)] + list(argv)) def run_argv(argv, prog="mhcflurry train"): if not argv or argv[0] in ("-h", "--help"): print(_format_help(prog)) return 0 if argv[0] == "pan-allele-release": return _run_pan_allele_release( argv[1:], "%s pan-allele-release" % prog) if argv[0] == "validate-processing-data": import pandas from ..processing_matching import validate_matched_training_data validation_parser = argparse.ArgumentParser(prog=prog + " validate-processing-data") validation_parser.add_argument("--data", required=True) validation_args = validation_parser.parse_args(argv[1:]) frame = pandas.read_csv(validation_args.data) validate_matched_training_data(frame) print("Validated %d matched rows across %d samples" % (len(frame), frame.sample_id.nunique())) return 0 if argv[0] == "release-holdout": from mhcflurry import release_holdout return release_holdout.run_argv( argv[1:], prog="%s release-holdout" % prog) if argv[0] == "plot-loss-curves": from . import plot_loss_curves return plot_loss_curves.run_argv( argv[1:], prog="%s plot-loss-curves" % prog) if argv[0] == "snapshot-experiment": from . import experiment_snapshot return experiment_snapshot.run_argv( argv[1:], prog="%s snapshot-experiment" % prog) if argv[0] == "materialize-affinity-checkpoint": from . import materialize_affinity_checkpoint return materialize_affinity_checkpoint.run_argv( argv[1:], prog="%s materialize-affinity-checkpoint" % prog) if argv[0] == "processing-hyperparameter-sweep": _require_explicit_design(argv[1:], "%s %s" % (prog, argv[0])) if argv[0] in TRAINING_SCRIPTS: return _run_training_script(argv[0], argv[1:]) make_parser(prog).parse_args(argv) return 2 parser = make_parser() if __name__ == "__main__": sys.exit(run_argv(sys.argv[1:]) or 0) mhcflurry-2.3.6/mhcflurry/cli/train_pan_allele_models_command.py000066400000000000000000001403421525677230600252440ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Train Class1 pan-allele models. """ import argparse import os from os.path import join import sys import time import random import pprint import hashlib import pickle import uuid import resource from functools import partial import numpy import pandas import yaml import tqdm # progress bar from ..training_folds import extract_training_folds from ..class1_affinity_predictor import Class1AffinityPredictor from ..class1_encoding import peptide_sequences_to_network_input from ..class1_neural_network import Class1NeuralNetwork from ..common import ( add_random_seed_arg, canonicalize_allele_series, configure_random_seed, configure_logging, derive_seed, install_sigusr1_stack_trace_handler, normalize_allele_name, positive_int_arg, write_generate_sh, ) from ..parallelism import ( add_local_parallelism_args, apply_resolved_training_hyperparameters_to_work_items, call_wrapped_kwargs, refine_local_parallelism_from_worker_context, resolve_local_parallelism_args, run_single_worker_resource_probe, worker_pool_with_gpu_assignments_from_args, ) from ..workload_planning import ( WORKLOAD_AFFINITY_TRAINING, path_size_bytes, ) from ..device_footprint import ( estimate_affinity_training_device_worker_gb, ) from ..pytorch_sizing import ( begin_peak_memory_measurement, end_peak_memory_measurement, release_unused_torch_memory, ) from ..cluster_parallelism import ( add_cluster_parallelism_args, cluster_results_from_args) from ..allele_encoding import AlleleEncoding from ..encodable_sequences import EncodableSequences from ..regression_target import from_ic50 tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 # To avoid pickling large matrices to send to child processes when running in # parallel, we use this global variable as a place to store data. Data that is # stored here before creating the thread pool will be inherited to the child # processes upon fork() call, allowing local workers to read the same # copy-on-write pages instead of receiving a pickled copy. WORKER_CONTEXT = {} # Note on parallelization: # When running in parallel, avoid using the neural network backend in the main # process. Model loading and inference should happen in worker processes. def _pop_train_param(train_params, names, default, verbose=0): """Pop one training parameter, honoring backward-compatible aliases.""" present = [name for name in names if name in train_params] if len(present) > 1: values = {name: train_params[name] for name in present} raise ValueError( "Conflicting train_data aliases specified for %s: %s" % (names[0], values) ) if present: name = present[0] result = train_params.pop(name) if verbose: suffix = "" if name == names[0] else f" [alias for {names[0]}]" print("Train param", name, "=", result, suffix) return result if verbose: print("Train param", names[0], "=", default, "[default]") return default def _log_process_telemetry(marker): """Emit lightweight per-process RSS / FD telemetry.""" try: rss = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss rss_mb = ( rss / (1024 * 1024) if sys.platform == "darwin" else rss / 1024 ) rss_field = f"{rss_mb:.1f}" except Exception: rss_field = "na" fd_field = "na" for path in ("/proc/self/fd", "/dev/fd"): if os.path.isdir(path): try: fd_field = str(len(os.listdir(path))) except OSError: pass break print( f"PROCESS_TELEMETRY pid={os.getpid()} marker={marker} " f"rss_mb={rss_field} num_fds={fd_field}" ) parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "--reuse-folds", action="store_true", help="Use existing fold_0..N columns instead of generating new folds.") parser.add_argument( "--data", metavar="FILE.csv", help=( "Training data CSV. Expected columns: " "allele, peptide, measurement_value")) parser.add_argument( "--pretrain-data", metavar="FILE.csv", help=( "Pre-training data CSV. Expected columns: " "allele, peptide, measurement_value")) parser.add_argument( "--out-models-dir", metavar="DIR", required=True, help="Directory to write models and manifest") parser.add_argument( "--hyperparameters", metavar="FILE.json", help="JSON or YAML of hyperparameters") parser.add_argument( "--held-out-measurements-per-allele-fraction-and-max", type=float, metavar="X", nargs=2, default=[0.25, 100], help="Fraction of measurements per allele to hold out, and maximum number") parser.add_argument( "--ignore-inequalities", action="store_true", default=False, help="Do not use affinity value inequalities even when present in data") parser.add_argument( "--num-folds", type=positive_int_arg, default=4, metavar="N", help="Number of training folds.") parser.add_argument( "--num-replicates", type=positive_int_arg, metavar="N", default=1, help="Number of replicates per (architecture, fold) pair to train.") add_random_seed_arg(parser) parser.add_argument( "--max-epochs", type=positive_int_arg, metavar="N", help="Max training epochs. If specified here it overrides any 'max_epochs' " "specified in the hyperparameters.") parser.add_argument( "--allele-sequences", metavar="FILE.csv", help="Allele sequences file.") parser.add_argument( "--verbosity", type=int, help="Verbosity. Default: %(default)s", default=0) parser.add_argument( "--debug", action="store_true", default=False, help="Launch python debugger on error") parser.add_argument( "--continue-incomplete", action="store_true", default=False, help="Continue training models from an incomplete training run. If this is " "specified then the only required argument is --out-models-dir") parser.add_argument( "--only-initialize", action="store_true", default=False, help="Do not actually train models. The initialized run can be continued " "later with --continue-incomplete.") parser.add_argument( "--save-all-checkpoints", action="store_true", default=False, help=( "Retain both terminal and minimum-validation weights for every fit. " "The restore_best_weights hyperparameter still selects the primary " "predictor weights." )) add_local_parallelism_args(parser) add_cluster_parallelism_args(parser) def assign_folds(df, num_folds, held_out_fraction, held_out_max, seed=None): """ Split training data into multiple test/train pairs, which we refer to as folds. Note that a given data point may be assigned to multiple test or train sets; these folds are NOT a non-overlapping partition as used in cross validation. A fold is defined by a boolean value for each data point, indicating whether it is included in the training data for that fold. If it's not in the training data, then it's in the test data. Folds are balanced in terms of allele content. Parameters ---------- df : pandas.DataFrame training data num_folds : int held_out_fraction : float Fraction of data to hold out as test data in each fold held_out_max For a given allele, do not hold out more than held_out_max number of data points in any fold. seed : int, optional Master seed. When given, numpy's global RNG (which the per-allele ``.sample()`` calls below draw from) is seeded up front, so fold membership is reproducible. When None, fold assignment is left in the current NumPy RNG state. Returns ------- pandas.DataFrame index is same as df.index, columns are "fold_0", ... "fold_N" giving whether the data point is in the training data for the fold """ if seed is not None: numpy.random.seed(int(seed) % (2 ** 32)) result_df = pandas.DataFrame(index=df.index) # Per-allele invariants (medians, low/high peptides, held-out count) are # fold-independent. Precompute once outside the fold loop; the fold loop # then only does the RNG-dependent sampling. ``groupby("allele")`` defaults # to sort=True, so iteration order is deterministic — must be materialized # so the same order is reused across folds and sample() advances pandas' # global RNG in the same sequence as the pre-refactor implementation. allele_groups = list(df.groupby("allele")) allele_precomputed = {} for (allele, sub_df) in allele_groups: medians = sub_df.groupby("peptide").measurement_value.median() median_of_medians = medians.median() allele_precomputed[allele] = { "medians": medians, "low_peptides": medians[medians < median_of_medians].index.values, "high_peptides": medians[medians >= median_of_medians].index.values, "held_out_count": int( min(len(medians) * held_out_fraction, held_out_max)), "sub_df_index": sub_df.index, "sub_df_peptide": sub_df.peptide, } for fold in range(num_folds): result_df["fold_%d" % fold] = True for (allele, _sub_df) in allele_groups: cached = allele_precomputed[allele] medians = cached["medians"] low_peptides = cached["low_peptides"] high_peptides = cached["high_peptides"] held_out_count = cached["held_out_count"] held_out_peptides = set() if held_out_count == 0: pass elif held_out_count < 2: held_out_peptides = set( medians.index.to_series().sample(n=held_out_count)) else: held_out_low_count = min( len(low_peptides), int(held_out_count / 2)) held_out_high_count = min( len(high_peptides), held_out_count - held_out_low_count) held_out_low = pandas.Series(low_peptides).sample( n=held_out_low_count) if held_out_low_count else set() held_out_high = pandas.Series(high_peptides).sample( n=held_out_high_count) if held_out_high_count else set() held_out_peptides = set(held_out_low).union(set(held_out_high)) sub_df_peptide = cached["sub_df_peptide"] result_df.loc[ cached["sub_df_index"][sub_df_peptide.isin(held_out_peptides)], "fold_%d" % fold ] = False print("Training points per fold") print(result_df.sum()) print("Test points per fold") print((~result_df).sum()) return result_df def pretrain_data_iterator( filename, master_allele_encoding, peptides_per_chunk=1024, shard_rank=0, num_shards=1): """ Step through a CSV file giving predictions for a large number of peptides (rows) and alleles (columns). Parameters ---------- filename : string master_allele_encoding : AlleleEncoding peptides_per_chunk : int shard_rank : int Zero-based worker shard index. num_shards : int Assign each CSV chunk to one shard by its chunk index. Returns ------- Generator of (AlleleEncoding, EncodableSequences, float affinities) tuples """ empty, usable_alleles, _ = _get_pretrain_allele_info( filename, master_allele_encoding, verbose=True, ) allele_encoding_cache = {} while True: synthetic_iter = pandas.read_csv( filename, index_col=0, chunksize=peptides_per_chunk) for (k, df) in enumerate(synthetic_iter): if num_shards > 1 and (k % num_shards) != shard_rank: continue df.columns = empty.columns df = df[usable_alleles] chunk_len = len(df) if chunk_len == 0: continue if chunk_len not in allele_encoding_cache: allele_encoding_cache[chunk_len] = AlleleEncoding( numpy.tile(usable_alleles, chunk_len), borrow_from=master_allele_encoding, ) allele_encoding = allele_encoding_cache[chunk_len] repeated_peptides = numpy.repeat(df.index.values, len(usable_alleles)) encodable_peptides = EncodableSequences(repeated_peptides) yield (allele_encoding, encodable_peptides, df.stack().values) _LOGGED_PRETRAIN_ALLELE_INFO = set() def _get_pretrain_allele_info(filename, master_allele_encoding, verbose): """Return (normalized-empty-df, usable_alleles, skipped_alleles). Verbose output is dedup'd per (filename, skipped_alleles) tuple at module scope: this function gets called repeatedly by the per-fold pretrain loaders and was emitting 10× redundant 'Pretrain alleles' + 'Skipped alleles' blocks per training run that drowned the log. """ empty = pandas.read_csv(filename, index_col=0, nrows=0) empty.columns = empty.columns.map(normalize_allele_name) usable_alleles = [ c for c in empty.columns if c in master_allele_encoding.allele_to_sequence ] skipped_alleles = [ c for c in empty.columns if c not in master_allele_encoding.allele_to_sequence ] if verbose: log_key = (filename, tuple(skipped_alleles)) if log_key not in _LOGGED_PRETRAIN_ALLELE_INFO: _LOGGED_PRETRAIN_ALLELE_INFO.add(log_key) print("Pretrain alleles available: ", *empty.columns.values) print("Using %d / %d alleles" % ( len(usable_alleles), len(empty.columns) )) print("Skipped alleles: ", skipped_alleles) return empty, usable_alleles, skipped_alleles def pretrain_network_input_iterator( filename, master_allele_encoding, peptide_encoding, peptides_per_chunk=1024, worker_id=0, num_workers=1, compact_peptide_repeats=False, peptide_amino_acid_encoding_torch=True): """Yield pretrain batches as network-input ``(x_dict, y)`` tuples.""" empty, usable_alleles, _ = _get_pretrain_allele_info( filename, master_allele_encoding, verbose=(worker_id == 0), ) allele_encoding_cache = {} allele_indices_cache = {} synthetic_iter = pandas.read_csv( filename, index_col=0, chunksize=peptides_per_chunk) for chunk_num, df in enumerate(synthetic_iter): if num_workers > 1 and (chunk_num % num_workers) != worker_id: continue df.columns = empty.columns df = df[usable_alleles] chunk_len = len(df) if chunk_len == 0: continue if chunk_len not in allele_encoding_cache: allele_encoding_cache[chunk_len] = AlleleEncoding( numpy.tile(usable_alleles, chunk_len), borrow_from=master_allele_encoding, ) allele_indices_cache[chunk_len] = ( allele_encoding_cache[chunk_len].indices.values.copy() ) if compact_peptide_repeats: peptide_values = df.index.values else: peptide_values = numpy.repeat(df.index.values, len(usable_alleles)) peptide_rows = peptide_sequences_to_network_input( peptide_values, peptide_encoding=peptide_encoding, peptide_amino_acid_encoding_torch=peptide_amino_acid_encoding_torch, ) x_dict = { "peptide": peptide_rows, "allele": allele_indices_cache[chunk_len], } if compact_peptide_repeats: x_dict["peptide_repeat_count"] = len(usable_alleles) yield (x_dict, from_ic50(df.stack().values)) def run(argv=sys.argv[1:]): install_sigusr1_stack_trace_handler() args = parser.parse_args(argv) held_out_fraction, held_out_max = ( args.held_out_measurements_per_allele_fraction_and_max) if not numpy.isfinite(held_out_fraction) or not 0 <= held_out_fraction <= 1: parser.error( "--held-out-measurements-per-allele-fraction-and-max fraction " "must be in [0, 1]; got %r" % held_out_fraction) if ( not numpy.isfinite(held_out_max) or held_out_max < 0 or not float(held_out_max).is_integer()): parser.error( "--held-out-measurements-per-allele-fraction-and-max maximum " "must be a non-negative integer; got %r" % held_out_max) if args.debug: try: return main(args) except Exception as e: print(e) import ipdb # pylint: disable=import-error ipdb.set_trace() raise else: return main(args) def _estimate_training_per_worker_gb(args): """Measurement-driven per-worker VRAM (GB) for this training run, or None. Reads the hyperparameters YAML and counts the training rows (cheaply, one column) to size the device-resident dataset tensor. Takes the max over the configured architectures so the worker count fits the heaviest one. Any failure returns None -> the planner uses the static profile default. """ try: with open(args.hyperparameters) as fd: hyperparameters_lst = yaml.safe_load(fd) # One-column read just to count rows; ``initialize_training`` re-reads # the full file later. A deliberate, one-time decompression pass at # planning time (negligible against a multi-hour training run). num_rows = len(pandas.read_csv(args.data, usecols=[0])) except Exception: return None estimates = [ estimate_affinity_training_device_worker_gb(hyperparameters, num_rows) for hyperparameters in (hyperparameters_lst or []) ] estimates = [gb for gb in estimates if gb is not None] return max(estimates) if estimates else None def _training_work_item_count(args): """Best-effort number of model fits in this command.""" try: with open(args.hyperparameters) as fd: hyperparameters_lst = yaml.safe_load(fd) return ( len(hyperparameters_lst) * int(args.num_folds) * int(args.num_replicates) ) except Exception: return None def main(args): print("Arguments:") print(args) args.out_models_dir = os.path.abspath(args.out_models_dir) configure_logging(verbose=args.verbosity > 1) resolve_local_parallelism_args( args, cap_auto_num_jobs=not getattr(args, "cluster_parallelism", False), per_worker_gb=_estimate_training_per_worker_gb(args), workload_name=WORKLOAD_AFFINITY_TRAINING, workload_hints={ "data_bytes": path_size_bytes(args.data), "num_work_items": _training_work_item_count(args), }, ) if not args.continue_incomplete: initialize_training(args) if not args.only_initialize: train_models(args) def initialize_training(args): required_arguments = [ "data", "out_models_dir", "hyperparameters", "num_folds", ] for arg in required_arguments: if getattr(args, arg) is None: parser.error("Missing required arg: %s" % arg) # TIMING_MARKER lines let the sweep harness compute clean per-phase # wall times: # start — argparse + validation done; before any I/O # data_loaded — train_data CSV parsed + filtered + folded # setup_done — pool + all WORKER_CONTEXT # training_done — all work items finished # Extract deltas by grepping stdout for ``TIMING_MARKER``. print(f"TIMING_MARKER start {time.time():.3f}") print("Initializing training.") with open(args.hyperparameters) as fd: hyperparameters_lst = yaml.safe_load(fd) assert isinstance(hyperparameters_lst, list) print("Loaded hyperparameters list:") pprint.pprint(hyperparameters_lst) allele_sequences = pandas.read_csv( args.allele_sequences, index_col=0).iloc[:,0] # pyarrow parser is 3–10× faster than the default C engine for # typical CSV. Still bzip2-bound on the I/O side but the parse phase # becomes negligible. Falls back to C engine if pyarrow isn't # installed (it's a pandas optional dep). try: df = pandas.read_csv(args.data, engine="pyarrow") except (ImportError, ValueError): df = pandas.read_csv(args.data) print("Loaded training data: %s" % (str(df.shape))) # Canonicalize allele names to the pseudosequence key set (no-alias-first), # so aliased / retired / alternative spellings resolve to their canonical # key instead of being silently dropped or fragmented into separate # embedding rows. Rows that resolve to no key become NaN and are filtered # out below. (The minimal canonical set is whatever keys allele_sequences # provides; every alias of a key routes back to it.) df = df.assign(allele=canonicalize_allele_series( df.allele.values, allele_sequences.index, log_label="training alleles")) # Collapse the filter chain into a single boolean mask. The original # code chained 3 ``.loc[]`` calls which each materialize a full # DataFrame copy. Single-mask form scans each column once and allocates # one result buffer. ``allele.notnull()`` keeps only rows that resolved to # a known pseudosequence key (canonicalize_allele_series guarantees a # resolved value is in allele_sequences.index). peptide_len = df.peptide.str.len() mask = ( (peptide_len >= 8) & (peptide_len <= 15) & df.measurement_value.notnull() & df.allele.notnull() ) df = df.loc[mask] print("Filtered to valid (len, non-null, known-allele): %s" % (str(df.shape))) print("Data inequalities:") print(df.measurement_inequality.value_counts()) if args.ignore_inequalities and "measurement_inequality" in df.columns: print("Dropping measurement_inequality column") del df["measurement_inequality"] # Allele names were canonicalized to pseudosequence keys above. print("Training data: %s" % (str(df.shape))) # Resolve the master seed once for the whole run and seed this process's # global RNGs (so fold assignment below is reproducible). Per-fit weight # init, shuffles, and random negatives in train_model derive from the # same value via derive_seed. --random-seed defaults to 42 (reproducible # out of the box); the resolved value is logged either way. master_seed = configure_random_seed( args.random_seed, name="train-pan-allele") (held_out_fraction, held_out_max) = ( args.held_out_measurements_per_allele_fraction_and_max) df, folds_df = extract_training_folds( df, args.num_folds, reuse=getattr(args, "reuse_folds", False)) if folds_df is None: folds_df = assign_folds( df=df, num_folds=args.num_folds, held_out_fraction=held_out_fraction, held_out_max=held_out_max, seed=master_seed) print(f"TIMING_MARKER data_loaded {time.time():.3f}") allele_sequences_in_use = allele_sequences[ allele_sequences.index.isin(df.allele) ] print("Will use %d / %d allele sequences" % ( len(allele_sequences_in_use), len(allele_sequences))) # All alleles, not just those with training data. full_allele_encoding = AlleleEncoding( alleles=allele_sequences.index.values, allele_to_sequence=allele_sequences.to_dict() ) # Only alleles with training data. For efficiency we perform model training # using only these alleles in the neural network embedding layer. allele_encoding = AlleleEncoding( alleles=allele_sequences_in_use.index.values, allele_to_sequence=allele_sequences_in_use.to_dict()) if not os.path.exists(args.out_models_dir): print("Attempting to create directory: %s" % args.out_models_dir) os.mkdir(args.out_models_dir) print("Done.") predictor = Class1AffinityPredictor( allele_to_sequence=allele_encoding.allele_to_sequence, metadata_dataframes={ 'train_data': pandas.merge( df, folds_df, left_index=True, right_index=True) }) work_items = [] for (h, hyperparameters) in enumerate(hyperparameters_lst): if 'n_models' in hyperparameters: raise ValueError("n_models is unsupported") if args.max_epochs: hyperparameters['max_epochs'] = args.max_epochs if hyperparameters.get("train_data", {}).get("pretrain", False): if not args.pretrain_data: raise ValueError("--pretrain-data is required") for fold in range(args.num_folds): for replicate in range(args.num_replicates): work_dict = { 'work_item_name': str(uuid.uuid4()), 'architecture_num': h, 'num_architectures': len(hyperparameters_lst), 'fold_num': fold, 'num_folds': args.num_folds, 'replicate_num': replicate, 'num_replicates': args.num_replicates, 'hyperparameters': hyperparameters, 'pretrain_data_filename': args.pretrain_data, } work_items.append(work_dict) training_init_info = {} training_init_info["train_data"] = df training_init_info["folds_df"] = folds_df training_init_info["allele_encoding"] = allele_encoding training_init_info["full_allele_encoding"] = full_allele_encoding training_init_info["work_items"] = work_items # Persist the master seed so the train_models phase (which may run in a # separate invocation via --continue-incomplete) derives per-fit seeds # from the same value used for fold assignment. training_init_info["seed"] = master_seed training_init_info["save_all_checkpoints"] = bool( args.save_all_checkpoints) # Save empty predictor (for metadata) predictor.save(args.out_models_dir) # Write training_init_info. with open(join(args.out_models_dir, "training_init_info.pkl"), "wb") as fd: pickle.dump(training_init_info, fd, protocol=pickle.HIGHEST_PROTOCOL) print("Done initializing training.") print(f"TIMING_MARKER setup_done {time.time():.3f}") def train_models(args): print("Beginning training.") predictor = Class1AffinityPredictor.load( args.out_models_dir, optimization_level=0) print("Loaded predictor with %d networks" % len(predictor.neural_networks)) with open(join(args.out_models_dir, "training_init_info.pkl"), "rb") as fd: WORKER_CONTEXT.update(pickle.load(fd)) print("Loaded training init info.") # Work items are dispatched separately. Do not copy the complete queue # into every spawn worker as part of its read-only training context. all_work_items = WORKER_CONTEXT.pop("work_items") if not args.cluster_parallelism: refine_local_parallelism_from_worker_context(args, WORKER_CONTEXT) apply_resolved_training_hyperparameters_to_work_items(all_work_items, args) complete_work_item_names = [ network.fit_info[-1]["training_info"]["work_item_name"] for network in predictor.neural_networks ] work_items = [ item for item in all_work_items if item["work_item_name"] not in complete_work_item_names ] print("Found %d work items, of which %d are incomplete and will run now." % ( len(all_work_items), len(work_items))) serial_run = not args.cluster_parallelism and args.num_jobs == 0 # The estimated time to completion is more accurate if we randomize # the order of the work. Seed from the master seed so even the dispatch # order is reproducible (per-fit results don't depend on order — each # fit reseeds from its own work-item seed — but this keeps the whole # run deterministic). master_seed = WORKER_CONTEXT.get("seed") random.Random(master_seed).shuffle(work_items) for (work_item_num, item) in enumerate(work_items): item['work_item_num'] = work_item_num item['num_work_items'] = len(work_items) item['progress_print_interval'] = 60.0 if not serial_run else 5.0 item['predictor'] = predictor if serial_run else None item['save_to'] = args.out_models_dir if serial_run else None item['verbose'] = args.verbosity item['save_all_checkpoints'] = bool( WORKER_CONTEXT.get("save_all_checkpoints", False) or args.save_all_checkpoints) if args.pretrain_data: item['pretrain_data_filename'] = args.pretrain_data start = time.time() worker_pool = None if not work_items: print("No incomplete work items; skipping warmup and worker startup.") results_generator = None elif serial_run: # Run in serial. Every worker is passed the same predictor, # which it adds models to, so no merging is required. It also saves # as it goes so no saving is required at the end. print("Processing %d work items in serial." % len(work_items)) for _ in tqdm.trange(len(work_items)): item = work_items.pop(0) # want to keep freeing up memory work_predictor = train_model(**item) assert work_predictor is predictor assert not work_items results_generator = None elif args.cluster_parallelism: # Run using separate processes HPC cluster. results_generator = cluster_results_from_args( args, work_function=train_model, work_items=work_items, constant_data=WORKER_CONTEXT, result_serialization_method="save_predictor") else: run_single_worker_resource_probe( args, work_items, train_model, constant_data=WORKER_CONTEXT, ) worker_pool = worker_pool_with_gpu_assignments_from_args( args, worker_context_module=__name__, worker_context_data=WORKER_CONTEXT, ) print("Worker pool", worker_pool) assert worker_pool is not None print("Processing %d work items in parallel." % len(work_items)) assert not serial_run results_generator = None try: if worker_pool is not None: results_generator = worker_pool.imap_unordered( partial(call_wrapped_kwargs, train_model), work_items, chunksize=1) if results_generator: for new_predictor in tqdm.tqdm(results_generator, total=len(work_items)): save_start = time.time() (new_model_name,) = predictor.merge_in_place([new_predictor]) predictor.save( args.out_models_dir, model_names_to_write=[new_model_name], write_metadata=False) print( "Saved predictor (%d models total) with 1 new models" "in %0.2f sec to %s" % ( len(predictor.neural_networks), time.time() - save_start, args.out_models_dir)) if worker_pool: worker_pool.close() worker_pool.join() worker_pool = None finally: # On failure mid-iteration, terminate() rather than # close()/join() (which can hang on a wedged worker) and # leave non-daemon workers behind. if worker_pool is not None: worker_pool.terminate() worker_pool.join() # We want the final predictor to support all alleles with sequences, not # just those we actually used for model training. predictor.allele_to_sequence = ( WORKER_CONTEXT['full_allele_encoding'].allele_to_sequence) predictor.clear_cache() predictor.save(args.out_models_dir) write_generate_sh(args.out_models_dir) print("Done.") print("*" * 30) training_time = time.time() - start print("Trained affinity predictor with %d networks in %0.2f min." % ( len(predictor.neural_networks), training_time / 60.0)) print("*" * 30) print("Predictor written to: %s" % args.out_models_dir) print(f"TIMING_MARKER training_done {time.time():.3f}") def _build_train_peptides(peptide_values): """Construct an EncodableSequences for the fold's training peptides.""" return EncodableSequences(peptide_values) def _run_compile_warmup(hyperparameters, fold_num, constant_data): """One forward+backward through a freshly-built network for compile-cache priming. Retained for explicit ``compile_warmup_only`` calls. Normal training uses the full-residency resource probe instead. Trains for one epoch on ``minibatch_size`` rows with pretrain/validation/early-stop disabled, discards the resulting model, and returns. The compile cache write is the only durable side effect. """ df = constant_data["train_data"] folds_df = constant_data["folds_df"] allele_encoding = constant_data["allele_encoding"] minibatch = max(int(hyperparameters.get("minibatch_size", 128) or 128), 1) fold_mask = folds_df["fold_%d" % fold_num] train_subset = df.loc[fold_mask].head(minibatch) if len(train_subset) == 0: train_subset = df.head(minibatch) train_peptides = _build_train_peptides(train_subset.peptide.values) train_alleles = AlleleEncoding( train_subset.allele.values, borrow_from=allele_encoding) # Subselect to keys this network actually accepts so warmup is # robust to upstream configs carrying parameters from a different # network or removed-but-still-present keys. hp = Class1NeuralNetwork.hyperparameter_defaults.subselect( dict(hyperparameters)) hp["max_epochs"] = 1 hp["validation_split"] = 0.0 hp["early_stopping"] = False hp["data_dependent_initialization_method"] = None train_data_overrides = dict(hp.get("train_data") or {}) train_data_overrides["pretrain"] = False hp["train_data"] = train_data_overrides print( "compile_warmup_only: layer_sizes=%s topology=%s minibatch=%d " "rows=%d" % ( hp.get("layer_sizes"), hp.get("topology"), minibatch, len(train_subset), ) ) started = time.time() memory_token = begin_peak_memory_measurement() model = None try: model = Class1NeuralNetwork(**hp) model.fit( peptides=train_peptides, affinities=train_subset.measurement_value.values, allele_encoding=train_alleles, inequalities=( train_subset.measurement_inequality.values if "measurement_inequality" in train_subset.columns else None ), verbose=0, ) report = end_peak_memory_measurement(memory_token) report["elapsed_seconds"] = time.time() - started print("compile_warmup_only: completed in %.1f sec" % ( report["elapsed_seconds"])) return report finally: if model is not None: model.clear_allele_representations() model._network = None model = None release_unused_torch_memory() def _run_resource_probe(hyperparameters, fold_num, constant_data): """Measure a bounded finetune pass with production-shaped residency. Unlike the legacy compile warmup, this uses the complete training fold and keeps validation enabled. One epoch is enough to exercise device-resident inputs, the configured minibatch, optimizer state, and the actual batched validation path that determines peak VRAM. """ df = constant_data["train_data"] folds_df = constant_data["folds_df"] allele_encoding = constant_data["allele_encoding"] fold_mask = folds_df["fold_%d" % fold_num] train_data = df.loc[fold_mask] if len(train_data) == 0: train_data = df hp = Class1NeuralNetwork.hyperparameter_defaults.subselect( dict(hyperparameters)) hp["max_epochs"] = 1 hp["early_stopping"] = False train_data_overrides = dict(hp.get("train_data") or {}) train_data_overrides["pretrain"] = False hp["train_data"] = train_data_overrides print( "resource_probe_only: layer_sizes=%s topology=%s minibatch=%d " "rows=%d validation_split=%s" % ( hp.get("layer_sizes"), hp.get("topology"), int(hp.get("minibatch_size", 128) or 128), len(train_data), hp.get("validation_split"), ) ) train_peptides = _build_train_peptides(train_data.peptide.values) train_alleles = AlleleEncoding( train_data.allele.values, borrow_from=allele_encoding) started = time.time() memory_token = begin_peak_memory_measurement() model = None try: model = Class1NeuralNetwork(**hp) model.fit( peptides=train_peptides, affinities=train_data.measurement_value.values, allele_encoding=train_alleles, inequalities=( train_data.measurement_inequality.values if "measurement_inequality" in train_data.columns else None ), seed=0, verbose=0, ) report = end_peak_memory_measurement(memory_token) report["elapsed_seconds"] = time.time() - started print("resource_probe_only: completed in %.1f sec: %s" % ( report["elapsed_seconds"], report)) return report finally: if model is not None: model.clear_allele_representations() model._network = None model = None release_unused_torch_memory() def train_model( work_item_name, work_item_num, num_work_items, architecture_num, num_architectures, fold_num, num_folds, replicate_num, num_replicates, hyperparameters, pretrain_data_filename, verbose, progress_print_interval, predictor, save_to, save_all_checkpoints=False, compile_warmup_only=False, constant_data=WORKER_CONTEXT, resource_probe_only=False): if resource_probe_only: return _run_resource_probe(hyperparameters, fold_num, constant_data) if compile_warmup_only: return _run_compile_warmup(hyperparameters, fold_num, constant_data) df = constant_data["train_data"] folds_df = constant_data["folds_df"] allele_encoding = constant_data["allele_encoding"] if predictor is None: predictor = Class1AffinityPredictor( allele_to_sequence=allele_encoding.allele_to_sequence) numpy.testing.assert_equal(len(df), len(folds_df)) # Don't shuffle here: fit() owns ordering via its seeded # ``shuffle_permutation`` (host, for the train/val split) and an # on-device ``torch.randperm`` each epoch. A host-side ``.sample()`` # would just add an unseeded numpy-global shuffle ahead of fit's # seeding, breaking single-seed reproducibility. train_data = df.loc[folds_df["fold_%d" % fold_num]] train_peptides = _build_train_peptides(train_data.peptide.values) train_alleles = AlleleEncoding( train_data.allele.values, borrow_from=allele_encoding) progress_preamble = ( "[task %2d / %2d]: " "[%2d / %2d folds] " "[%2d / %2d architectures] " "[%4d / %4d replicates] " % ( work_item_num + 1, num_work_items, fold_num + 1, num_folds, architecture_num + 1, num_architectures, replicate_num + 1, num_replicates)) print("%s [pid %d]. Hyperparameters:" % (progress_preamble, os.getpid())) pprint.pprint(hyperparameters) # GPU memory telemetry at task boundaries. With max-tasks-per-worker>1, # a single worker process handles # many arch×fold tasks sequentially. Logging allocated/reserved VRAM # plus the max-allocated high-water-mark at task start and end gives # us a trajectory to detect leaks: if the high-water mark or the # start-of-task "residual" allocation creeps upward across tasks # within a worker, there's a leak somewhere (PyTorch allocator fails # to release, cached tensors pinned, etc). Flat across 140 tasks is # the "no leak" signal. def _log_gpu_memory(marker): import torch if not torch.cuda.is_available(): return alloc_gb = torch.cuda.memory_allocated() / 1e9 reserved_gb = torch.cuda.memory_reserved() / 1e9 max_alloc_gb = torch.cuda.max_memory_allocated() / 1e9 print( f"GPU_MEMORY_TELEMETRY pid={os.getpid()} " f"task={work_item_num + 1}/{num_work_items} marker={marker} " f"allocated_gb={alloc_gb:.3f} reserved_gb={reserved_gb:.3f} " f"max_allocated_gb={max_alloc_gb:.3f}" ) _log_gpu_memory("START") _log_process_telemetry("START") train_params = dict(hyperparameters.get("train_data", {})) def get_train_param(param, default): return _pop_train_param( train_params, names=(param,), default=default, verbose=verbose, ) def progress_callback(): import torch if torch.cuda.is_available(): mem = torch.cuda.memory_allocated() / 10**9 print("Current used GPU memory: ", mem, "gb") # One stable per-work-item seed controls every stochastic step of this # fit — pretrain weight init + batch order, then the finetune shuffles # and random negatives. Derived from the run's master seed plus this # fit's identity coordinates, so the whole run is reproducible from # --seed regardless of dispatch order across workers. work_item_seed = derive_seed( constant_data.get("seed"), architecture_num, fold_num, replicate_num) if get_train_param("pretrain", False): pretrain_patience = get_train_param("pretrain_patience", 10) pretrain_min_delta = get_train_param("pretrain_min_delta", 0.0) pretrain_steps_per_epoch = get_train_param( "pretrain_steps_per_epoch", 10) pretrain_max_epochs = get_train_param("pretrain_max_epochs", 1000) pretrain_min_epochs = get_train_param("pretrain_min_epochs", 0) pretrain_peptides_per_step = _pop_train_param( train_params, names=( "pretrain_peptides_per_step", "pretrain_peptides_per_epoch", ), default=1024, verbose=verbose, ) max_val_loss = get_train_param("pretrain_max_val_loss", None) if verbose: print("Unused train params", train_params) attempt = 0 while True: attempt += 1 print("Pre-training attempt %d" % attempt) if attempt > 10: print("Too many pre-training attempts! Stopping pretraining.") break model = Class1NeuralNetwork(**hyperparameters) assert model.network() is None make_pretrain_generator = partial( pretrain_network_input_iterator, filename=pretrain_data_filename, master_allele_encoding=allele_encoding, peptide_encoding=hyperparameters["peptide_encoding"], peptides_per_chunk=pretrain_peptides_per_step, compact_peptide_repeats=True, peptide_amino_acid_encoding_torch=( model.uses_peptide_torch_encoding() ), ) model.fit_streaming_batches( generator=make_pretrain_generator(), generator_factory=make_pretrain_generator, generator_batches_are_encoded=True, validation_peptide_encoding=train_peptides, validation_affinities=train_data.measurement_value.values, validation_allele_encoding=train_alleles, validation_inequalities=train_data.measurement_inequality.values, patience=pretrain_patience, min_delta=pretrain_min_delta, steps_per_epoch=pretrain_steps_per_epoch, epochs=pretrain_max_epochs, min_epochs=pretrain_min_epochs, verbose=verbose, progress_callback=progress_callback, progress_preamble=progress_preamble + "PRETRAIN", progress_print_interval=progress_print_interval, # Per-attempt offset so a rejected init (val loss too high) # is followed by a *different* init on retry, while the # attempt sequence stays reproducible from the work-item seed. seed=work_item_seed + attempt, ) model.fit_info[-1].setdefault( "training_info", {}).update({ "pretrain_attempt": attempt, "phase": "pretrain", }) if not max_val_loss: break final_val_loss = model.fit_info[-1]["val_loss"][-1] if final_val_loss >= max_val_loss: print("Val loss %f >= max val loss %f. Pre-training again." % ( final_val_loss, max_val_loss)) else: print("Val loss %f < max val loss %f. Done pre-training." % ( final_val_loss, max_val_loss)) break # Use a smaller learning rate for training on real data learning_rate = model.fit_info[-1]["learning_rate"] model.hyperparameters['learning_rate'] = learning_rate / 10 else: model = Class1NeuralNetwork(**hyperparameters) model.fit( peptides=train_peptides, affinities=train_data.measurement_value.values, allele_encoding=train_alleles, inequalities=( train_data.measurement_inequality.values if "measurement_inequality" in train_data.columns else None), progress_preamble=progress_preamble, progress_callback=progress_callback, progress_print_interval=progress_print_interval, seed=work_item_seed, verbose=verbose, save_all_checkpoints=save_all_checkpoints) # Save model-specific training info train_peptide_hash = hashlib.sha1() for peptide in sorted(train_data.peptide.values): train_peptide_hash.update(peptide.encode()) model.fit_info[-1].setdefault("training_info", {}).update({ "phase": "finetune", "fold_num": fold_num, "num_folds": num_folds, "replicate_num": replicate_num, "num_replicates": num_replicates, "architecture_num": architecture_num, "num_architectures": num_architectures, "train_peptide_hash": train_peptide_hash.hexdigest(), "work_item_name": work_item_name, }) numpy.testing.assert_equal( predictor.manifest_df.shape[0], len(predictor.class1_pan_allele_models)) predictor.add_pan_allele_model(model, models_dir_for_save=save_to) numpy.testing.assert_equal( predictor.manifest_df.shape[0], len(predictor.class1_pan_allele_models)) predictor.clear_cache() # Delete the network to release memory model.clear_allele_representations() model.update_network_description() # save weights and config model._network = None # release network to free memory # Release any cached allocator blocks we can, then log residual state. # empty_cache() doesn't free live tensors — just returns unused # cached blocks to the driver. If the END telemetry shows growing # "allocated_gb" across tasks despite this call, a reference is # being retained somewhere. import torch if torch.cuda.is_available(): torch.cuda.empty_cache() _log_gpu_memory("END") _log_process_telemetry("END") return predictor if __name__ == '__main__': run() mhcflurry-2.3.6/mhcflurry/cli/train_presentation_models_command.py000066400000000000000000000435161525677230600256700ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Train Class1 presentation models. """ import argparse import os import sys import time from functools import partial import numpy import pandas import tqdm # progress bar from ..affinity.calibration_sizing import estimate_calibration_peak_bytes_per_row from ..pytorch_sizing import estimate_peak_bytes_per_row from ..memory_budget import module_tensor_bytes from ..class1_processing_predictor import Class1ProcessingPredictor from ..class1_affinity_predictor import Class1AffinityPredictor from ..class1_presentation_predictor import Class1PresentationPredictor from ..common import ( add_random_seed_arg, configure_logging, configure_random_seed, install_sigusr1_stack_trace_handler, positive_int_arg, write_generate_sh, ) from ..parallelism import ( add_local_parallelism_args, call_wrapped_kwargs, refine_local_parallelism_from_worker_context, resolve_local_parallelism_args, worker_pool_with_gpu_assignments_from_args, ) from ..workload_planning import ( WORKLOAD_PRESENTATION_TRAINING, env_float, path_size_bytes, ) tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 WORKER_CONTEXT = {} # Presentation feature workers keep affinity + processing predictors resident # and then run one model family at a time in auto-sized prediction batches. # These floors cover CUDA context, torch.compile/runtime caches, allocator # fragmentation, and non-model torch state that is not visible from parameters. _PRESENTATION_WORKER_RUNTIME_FLOOR_GB = 6.0 _PRESENTATION_WORKER_SAFETY_FACTOR = 1.3 parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "--data", metavar="FILE.csv", help="Training data CSV. Expected columns: peptide, n_flank, c_flank, hit") parser.add_argument( "--out-models-dir", metavar="DIR", required=True, help="Directory to write models and manifest") parser.add_argument( "--affinity-predictor", metavar="DIR", required=True, help="Affinity predictor models dir") parser.add_argument( "--processing-predictor-with-flanks", metavar="DIR", required=True, help="Processing predictor with flanks") parser.add_argument( "--processing-predictor-without-flanks", metavar="DIR", required=True, help="Processing predictor without flanks") parser.add_argument( "--verbosity", type=int, help="Default: %(default)s", default=1) parser.add_argument( "--debug", action="store_true", default=False, help="Launch python debugger on error") parser.add_argument( "--hla-column", default="hla", help="Column in data giving space-separated MHC I alleles") parser.add_argument( "--target-column", default="hit", help="Column in data giving hit (1) vs decoy (0)") parser.add_argument( "--feature-chunk-size", type=positive_int_arg, default=250000, metavar="N", help=( "Rows per parallel presentation feature-prediction task. Larger " "chunks reduce scheduling overhead but increase worker memory. " "Default: %(default)s")) add_local_parallelism_args(parser) add_random_seed_arg(parser) def run(argv=sys.argv[1:]): install_sigusr1_stack_trace_handler() args = parser.parse_args(argv) if args.debug: try: return main(args) except Exception as e: print(e) import ipdb # pylint: disable=import-error ipdb.set_trace() raise else: return main(args) def main(args): print("Arguments:") print(args) args.out_models_dir = os.path.abspath(args.out_models_dir) configure_logging(verbose=args.verbosity > 1) # Presentation training has no stochastic step today (fit_from_scores # uses a deterministic solver with no subsampling, and the parallel # feature path is pure inference), but every other training CLI exposes # --random-seed and logs the resolved value. Seed here too for uniformity # and so the resolved seed is recorded; if a stochastic step is ever # added (e.g. a switch to a stochastic solver) it is already covered. configure_random_seed(args.random_seed, name="train-presentation") df = pandas.read_csv( args.data, dtype={"sample_id": str}, low_memory=False, ) print("Loaded training data: %s" % (str(df.shape))) df = df.loc[ (df.peptide.str.len() >= 8) & (df.peptide.str.len() <= 15) ] print("Subselected to 8-15mers: %s" % (str(df.shape))) df["experiment_id"] = df[args.hla_column] experiment_to_alleles = dict(( key, key.split()) for key in df.experiment_id.unique()) if not os.path.exists(args.out_models_dir): print("Attempting to create directory: %s" % args.out_models_dir) os.makedirs(args.out_models_dir) print("Done.") affinity_predictor = Class1AffinityPredictor.load( args.affinity_predictor, optimization_level=0) processing_predictor_with_flanks = Class1ProcessingPredictor.load( args.processing_predictor_with_flanks) processing_predictor_without_flanks = Class1ProcessingPredictor.load( args.processing_predictor_without_flanks) print("Loaded affinity predictor", affinity_predictor) print( "Loaded processing_predictor_with_flanks", processing_predictor_with_flanks) print("Loaded processing_predictor_without_flanks", processing_predictor_without_flanks) predictor = Class1PresentationPredictor( affinity_predictor=affinity_predictor, processing_predictor_with_flanks=processing_predictor_with_flanks, processing_predictor_without_flanks=processing_predictor_without_flanks) # We want to predict using an optimized Class1AffinityPredictor but # save the presentation models using an un-optimized Class1AffinityPredictor, # since the optimized (merged) network is only needed at inference time. print("Before fit: saving affinity and processing predictors.") predictor.save( args.out_models_dir, write_affinity_predictor = True, write_processing_predictor = True, write_weights = False, write_percent_ranks = False, write_info = False, write_metadata = False) print("Done writing: ", args.out_models_dir) print("Optimizing affinity predictor.") optimized = affinity_predictor.optimize() print("Optimization performed: ", optimized) presentation_worker_gb = estimate_presentation_feature_worker_gb( args, predictor, ) resolve_local_parallelism_args( args, workload_name=WORKLOAD_PRESENTATION_TRAINING, workload_hints={ "data_bytes": path_size_bytes(args.data), "num_work_items": sum( max( 1, (len(group) + max(args.feature_chunk_size, 1) - 1) // max(args.feature_chunk_size, 1), ) for _, group in df.groupby("experiment_id", sort=False) ), "per_worker_gb": presentation_worker_gb, "transient_rows": args.feature_chunk_size, }, ) if args.num_jobs: df = df.sort_values("experiment_id", kind="stable").reset_index(drop=True) print("Fitting.") start = time.time() if args.num_jobs: scores = predict_features_parallel( args=args, predictor=predictor, df=df, experiment_to_alleles=experiment_to_alleles, ) predictor.fit_from_scores( targets=df[args.target_column].values, affinities=scores["affinity"], processing_scores_by_model=scores["processing_scores_by_model"], verbose=args.verbosity) else: predictor.fit( targets=df[args.target_column].values, peptides=df.peptide.values, alleles=experiment_to_alleles, sample_names=df.experiment_id, n_flanks=df.n_flank.values, c_flanks=df.c_flank.values, verbose=args.verbosity) print("Done fitting in", time.time() - start, "seconds") print("Saving weights and metadata.") predictor.save( args.out_models_dir, write_affinity_predictor = False, write_processing_predictor = False, write_weights = True, write_percent_ranks = True, write_info = True, write_metadata = True) write_generate_sh(args.out_models_dir) print("Wrote", args.out_models_dir) def estimate_presentation_feature_worker_gb(args, predictor): """Estimate steady per-worker VRAM for presentation feature generation. Presentation workers are inference workers, not model-fit workers. Their persistent device memory is the optimized affinity predictor plus the two processing predictor ensembles. Transient activation memory is handled by each predictor's auto batch-size resolver, but the local worker-count resolver still needs a per-worker base footprint so it does not schedule too many independent processes onto one GPU. """ runtime_floor_gb = env_float( "MHCFLURRY_PRESENTATION_WORKER_RUNTIME_FLOOR_GB", _PRESENTATION_WORKER_RUNTIME_FLOOR_GB, bounds=(0.0, None), ) safety = env_float( "MHCFLURRY_PRESENTATION_WORKER_SAFETY_FACTOR", _PRESENTATION_WORKER_SAFETY_FACTOR, bounds=(0.0, None), ) networks = list(iter_presentation_feature_networks(predictor)) parameter_bytes = sum(network_parameter_bytes(network) for network in networks) runtime_bytes = int(runtime_floor_gb * (1 << 30)) estimate_gb = ( (parameter_bytes + runtime_bytes) * safety / float(1 << 30) ) estimate_gb = max(estimate_gb, 4.0) print( "Estimated presentation feature worker VRAM: %.2f GB " "(networks=%d, params=%.2f GB, runtime_floor=%.2f GB, " "safety=%.1fx)" % ( estimate_gb, len(networks), parameter_bytes / float(1 << 30), runtime_floor_gb, safety, ) ) return estimate_gb def iter_presentation_feature_networks(predictor): """Yield torch networks that can become GPU-resident in one worker.""" affinity_predictor = predictor.affinity_predictor for model in getattr(affinity_predictor, "class1_pan_allele_models", []): yield model.network(borrow=True) for models in getattr( affinity_predictor, "allele_to_allele_specific_models", {}, ).values(): for model in models: yield model.network(borrow=True) for processing_predictor in ( predictor.processing_predictor_without_flanks, predictor.processing_predictor_with_flanks, ): if processing_predictor is None: continue for model in getattr(processing_predictor, "models", []): yield model.network() def network_parameter_bytes(network): """Return unique parameter + buffer bytes for a torch module.""" return module_tensor_bytes(network) def presentation_network_peak_bytes_per_row(network): """Estimate forward peak memory for a presentation feature network.""" sub_networks = getattr(network, "networks", None) if sub_networks is not None and not hasattr(network, "peptide_encoding_shape"): return estimate_calibration_peak_bytes_per_row(network) return estimate_peak_bytes_per_row(network) def predict_features_parallel(args, predictor, df, experiment_to_alleles): """ Predict BA/AP features in local worker processes. Presentation training fits only logistic-regression weights, but feature generation is expensive: it runs the affinity predictor and both processing predictors over tens of millions of rows. Split by sample and row chunk so each worker can use its assigned GPU independently. """ work_items = make_feature_work_items(df, args.feature_chunk_size) print( "Predicting presentation features in parallel: %d rows, %d chunks, " "num_jobs=%d, gpus=%d, max_workers_per_gpu=%s" % ( len(df), len(work_items), args.num_jobs, args.gpus, args.max_workers_per_gpu, ) ) include_without_flanks = ( predictor.processing_predictor_without_flanks is not None ) include_with_flanks = ( predictor.processing_predictor_with_flanks is not None and "n_flank" in df and "c_flank" in df ) for item in work_items: item["include_without_flanks"] = include_without_flanks item["include_with_flanks"] = include_with_flanks WORKER_CONTEXT.clear() WORKER_CONTEXT.update({ "predictor": predictor, "data": df, "experiment_to_alleles": experiment_to_alleles, }) refine_local_parallelism_from_worker_context(args, WORKER_CONTEXT) worker_pool = None try: worker_pool = worker_pool_with_gpu_assignments_from_args( args, worker_context_module=__name__, worker_context_data=WORKER_CONTEXT, ) print("Worker pool", worker_pool) affinity = numpy.empty(len(df), dtype="float64") processing_scores_by_model = {} if include_without_flanks: processing_scores_by_model["without_flanks"] = numpy.empty( len(df), dtype="float64") if include_with_flanks: processing_scores_by_model["with_flanks"] = numpy.empty( len(df), dtype="float64") if worker_pool is None: print("Feature prediction is running serially in the loaded parent.") results = ( predict_feature_chunk(**item) for item in work_items ) else: results = worker_pool.imap_unordered( partial(call_wrapped_kwargs, predict_feature_chunk), work_items, chunksize=1, ) for result in tqdm.tqdm(results, total=len(work_items)): start = result["start"] end = result["end"] affinity[start:end] = result["affinity"] for (model_name, values) in result["processing_scores"].items(): processing_scores_by_model[model_name][start:end] = values if worker_pool is not None: worker_pool.close() worker_pool.join() worker_pool = None return { "affinity": affinity, "processing_scores_by_model": processing_scores_by_model, } finally: # On failure mid-iteration, terminate() rather than close()/join() # (which can hang on a wedged worker) and leave non-daemon workers # behind. On the success path worker_pool is set to None above. if worker_pool is not None: worker_pool.terminate() worker_pool.join() def make_feature_work_items(df, chunk_size): chunk_size = max(int(chunk_size or 0), 1) work_items = [] for (sample_name, sub_df) in df.groupby("experiment_id", sort=False): if len(sub_df) == 0: continue first = int(sub_df.index[0]) last = int(sub_df.index[-1]) if last - first + 1 != len(sub_df): raise ValueError( "Presentation feature chunks require experiment_id-contiguous " "data. Sort by experiment_id before chunking.") for start in range(first, last + 1, chunk_size): end = min(start + chunk_size, last + 1) work_items.append({ "chunk_num": len(work_items), "start": start, "end": end, "sample_name": sample_name, }) return work_items def predict_feature_chunk( chunk_num, start, end, sample_name, include_without_flanks, include_with_flanks, constant_data=WORKER_CONTEXT): predictor = constant_data["predictor"] df = constant_data["data"].iloc[start:end] experiment_to_alleles = constant_data["experiment_to_alleles"] print( "Presentation feature chunk %d: rows [%d, %d), sample=%s" % ( chunk_num, start, end, sample_name) ) affinity_df = predictor.predict_affinity( peptides=df.peptide.values, alleles={sample_name: experiment_to_alleles[sample_name]}, sample_names=numpy.repeat(sample_name, len(df)), include_affinity_percentile=False, verbose=0, model_kwargs={"batch_size": "auto"}, ) result = { "chunk_num": chunk_num, "start": start, "end": end, "affinity": affinity_df.affinity.values.astype("float64", copy=False), "processing_scores": {}, } if include_without_flanks: result["processing_scores"]["without_flanks"] = ( predictor.predict_processing( peptides=df.peptide.values, n_flanks=None, c_flanks=None, verbose=0, batch_size="auto", ).astype("float64", copy=False) ) if include_with_flanks: result["processing_scores"]["with_flanks"] = ( predictor.predict_processing( peptides=df.peptide.values, n_flanks=df.n_flank.values, c_flanks=df.c_flank.values, verbose=0, batch_size="auto", ).astype("float64", copy=False) ) return result if __name__ == '__main__': run() mhcflurry-2.3.6/mhcflurry/cli/train_processing_models_command.py000066400000000000000000001002071525677230600253200ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Train Class1 processing models. """ import argparse import os from os.path import join import sys import time import random import pprint import hashlib import pickle import uuid from functools import partial import numpy import pandas import yaml import tqdm # progress bar from ..class1_processing_predictor import Class1ProcessingPredictor from ..training_folds import extract_training_folds from ..class1_processing_neural_network import Class1ProcessingNeuralNetwork from ..pytorch_sizing import ( TRAINING_PEAK_MULTIPLIER, begin_peak_memory_measurement, end_peak_memory_measurement, estimate_peak_bytes_per_row, release_unused_torch_memory, ) from ..memory_budget import training_module_bytes from ..common import ( add_random_seed_arg, configure_random_seed, configure_logging, derive_seed, install_sigusr1_stack_trace_handler, positive_int_arg, write_generate_sh, ) from ..parallelism import ( add_local_parallelism_args, refine_local_parallelism_from_worker_context, resolve_local_parallelism_args, run_single_worker_resource_probe, worker_pool_with_gpu_assignments_from_args, call_wrapped_kwargs) from ..workload_planning import ( WORKLOAD_PROCESSING_TRAINING, path_size_bytes, ) from ..cluster_parallelism import ( add_cluster_parallelism_args, cluster_results_from_args) from ..processing_matching import validate_matched_training_data, sample_validation_mask tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 # To avoid pickling large matrices to send to child processes when running in # parallel, we use this global variable as a place to store data. Data that is # stored here before creating the thread pool will be inherited to the child # processes upon fork() call, allowing local workers to read the same # copy-on-write pages instead of receiving a pickled copy. WORKER_CONTEXT = {} _PROCESSING_WORKER_RUNTIME_FLOOR_GB = 2.0 _PROCESSING_WORKER_SAFETY_FACTOR = 1.3 # Note on parallelization: # When running in parallel, avoid using the neural network backend in the main # process. Model loading and inference should happen in worker processes. parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument("--processing-data-policy", choices=("matched", "legacy"), default="matched", help="Require matched processing data; legacy is explicit historical replay only.") parser.add_argument( "--reuse-folds", action="store_true", help="Use existing fold_0..N columns instead of generating new folds.") parser.add_argument( "--data", metavar="FILE.csv", help="Training data CSV. Expected columns: peptide, n_flank, c_flank, hit") parser.add_argument( "--out-models-dir", metavar="DIR", required=True, help="Directory to write models and manifest") parser.add_argument( "--hyperparameters", metavar="FILE.json", help="JSON or YAML of hyperparameters") parser.add_argument( "--held-out-samples", type=positive_int_arg, metavar="N", default=10, help="Number of experiments to hold out per fold") parser.add_argument( "--num-folds", type=positive_int_arg, default=4, metavar="N", help="Number of training folds.") parser.add_argument( "--num-replicates", type=positive_int_arg, metavar="N", default=1, help="Number of replicates per (architecture, fold) pair to train.") add_random_seed_arg(parser) parser.add_argument( "--max-epochs", type=positive_int_arg, metavar="N", help="Max training epochs. If specified here it overrides any 'max_epochs' " "specified in the hyperparameters.") parser.add_argument( "--verbosity", type=int, help="Verbosity. Default: %(default)s", default=0) parser.add_argument( "--debug", action="store_true", default=False, help="Launch python debugger on error") parser.add_argument( "--continue-incomplete", action="store_true", default=False, help="Continue training models from an incomplete training run. If this is " "specified then the only required argument is --out-models-dir") parser.add_argument( "--only-initialize", action="store_true", default=False, help="Do not actually train models. The initialized run can be continued " "later with --continue-incomplete.") add_local_parallelism_args(parser) add_cluster_parallelism_args(parser) def assign_folds(df, num_folds, held_out_samples, seed=None): """ Split training data into multiple test/train pairs, which we refer to as folds. Note that a given data point may be assigned to multiple test or train sets; these folds are NOT a non-overlapping partition as used in cross validation. A fold is defined by a boolean value for each data point, indicating whether it is included in the training data for that fold. If it's not in the training data, then it's in the test data. Parameters ---------- df : pandas.DataFrame training data num_folds : int held_out_samples : int seed : int, optional Master seed. When given, numpy's global RNG (which the per-fold ``.sample()`` call below draws from) is seeded up front, so held-out-sample membership is reproducible. When None, fold assignment is left in the current NumPy RNG state. Returns ------- pandas.DataFrame index is same as df.index, columns are "fold_0", ... "fold_N" giving whether the data point is in the training data for the fold """ if seed is not None: numpy.random.seed(int(seed) % (2 ** 32)) result_df = pandas.DataFrame(index=df.index) sample_names = pandas.Series(df.sample_id.unique()) # Every fold holds out this many samples and trains on the rest, and # matched early stopping needs at least two training samples. if len(sample_names) < held_out_samples + 2: raise ValueError( "--held-out-samples %d needs at least %d training samples; the " "data has %d. Reduce --held-out-samples or train on more samples." % (held_out_samples, held_out_samples + 2, len(sample_names))) for fold in range(num_folds): samples_to_exclude = sample_names.sample(n=held_out_samples) result_df["fold_%d" % fold] = ~df.sample_id.isin(samples_to_exclude) print("Fold", fold, "holding out samples", *samples_to_exclude) print("Training points per fold") print(result_df.sum()) print("Test points per fold") print((~result_df).sum()) return result_df def run(argv=sys.argv[1:]): install_sigusr1_stack_trace_handler() args = parser.parse_args(argv) if args.debug: try: return main(args) except Exception as e: print(e) import ipdb # pylint: disable=import-error ipdb.set_trace() raise else: return main(args) def main(args): print("Arguments:") print(args) args.out_models_dir = os.path.abspath(args.out_models_dir) configure_logging(verbose=args.verbosity > 1) processing_worker_gb = estimate_processing_worker_gb(args) resolve_local_parallelism_args( args, cap_auto_num_jobs=not getattr(args, "cluster_parallelism", False), workload_name=WORKLOAD_PROCESSING_TRAINING, workload_hints={ "data_bytes": path_size_bytes(args.data), "num_work_items": processing_work_item_count(args), "per_worker_gb": processing_worker_gb, }, ) if not args.continue_incomplete: initialize_training(args) if not args.only_initialize: train_models(args) def processing_work_item_count(args): """Best-effort number of model fits in this command.""" try: with open(args.hyperparameters) as fd: hyperparameters_lst = yaml.safe_load(fd) return ( len(hyperparameters_lst) * int(args.num_folds) * int(args.num_replicates) ) except Exception: return None def estimate_processing_worker_gb(args): """Estimate steady per-worker VRAM for processing training. Processing is not shaped like affinity training: workers keep encoded flank tensors resident on-device, then run Conv1d models whose peak activation width scales with flank length and convolutional filters. This estimate sizes worker concurrency from the exact encoded dataset, model/gradient/optimizer state, and training activation peak for the largest architecture in the hyperparameter sweep. Validation and post-fit scoring use the remaining per-worker live-memory budget at runtime, so they do not need a second fixed launch-time batch assumption. """ data_path = getattr(args, "data", None) hyperparameters_path = getattr(args, "hyperparameters", None) if not data_path or not hyperparameters_path: return None try: row_count = len(pandas.read_csv(data_path, usecols=["peptide"])) hyperparameters_lst = yaml.unsafe_load(open(hyperparameters_path)) if not isinstance(hyperparameters_lst, list): return None max_sequence_bytes_per_row = 0 max_training_batch_bytes = 0 max_training_state_bytes = 0 for hyperparameters in hyperparameters_lst: model = Class1ProcessingNeuralNetwork(**hyperparameters) network = model.make_network( **model.network_hyperparameter_defaults.subselect( model.hyperparameters ) ) seq_len = ( int(network.n_flank_length) + int(network.peptide_max_length) + int(network.c_flank_length) ) # Encoded sequence + peptide_length + target + index tensors. # Sequences are always index-encoded (int8), one byte per position. sequence_bytes_per_row = seq_len * 1 + 8 + 4 + 8 max_sequence_bytes_per_row = max( max_sequence_bytes_per_row, sequence_bytes_per_row, ) forward_bytes_per_row = estimate_peak_bytes_per_row(network) minibatch_size = int(model.hyperparameters["minibatch_size"]) optimizer_state_copies = { "adam": 2, "rmsprop": 1, "sgd": 0, }.get(str(model.hyperparameters["optimizer"]).lower(), 2) max_training_state_bytes = max( max_training_state_bytes, training_module_bytes( network, optimizer_state_copies=optimizer_state_copies, ), ) max_training_batch_bytes = max( max_training_batch_bytes, minibatch_size * forward_bytes_per_row * TRAINING_PEAK_MULTIPLIER, ) if not max_training_batch_bytes: return None dataset_bytes = row_count * max_sequence_bytes_per_row runtime_bytes = int(_PROCESSING_WORKER_RUNTIME_FLOOR_GB * (1 << 30)) estimate_gb = ( ( dataset_bytes + max_training_state_bytes + max_training_batch_bytes + runtime_bytes ) * _PROCESSING_WORKER_SAFETY_FACTOR / float(1 << 30) ) estimate_gb = max(estimate_gb, 4.0) print( "Estimated processing worker VRAM: %.2f GB " "(rows=%d, sequence=%.2f GB, training_state=%.2f GB, " "train_batch=%.2f GB, " "runtime_floor=%.2f GB, safety=%.1fx)" % ( estimate_gb, row_count, dataset_bytes / float(1 << 30), max_training_state_bytes / float(1 << 30), max_training_batch_bytes / float(1 << 30), _PROCESSING_WORKER_RUNTIME_FLOOR_GB, _PROCESSING_WORKER_SAFETY_FACTOR, ) ) return estimate_gb except Exception as exc: print( "Could not estimate processing worker VRAM; falling back to " "default local parallelism estimate: %s" % (exc,) ) return None def initialize_training(args): required_arguments = [ "data", "out_models_dir", "hyperparameters", "num_folds", ] for arg in required_arguments: if getattr(args, arg) is None: parser.error("Missing required arg: %s" % arg) print("Initializing training.") hyperparameters_lst = yaml.unsafe_load(open(args.hyperparameters)) assert isinstance(hyperparameters_lst, list) print("Loaded hyperparameters list:") if len(hyperparameters_lst) > 7: pprint.pprint(hyperparameters_lst[:3]) print("...") pprint.pprint(hyperparameters_lst[-3:]) else: pprint.pprint(hyperparameters_lst) print("Length of hyperparameters list: %d" % (len(hyperparameters_lst))) from mhcflurry.training_folds import read_processing_training_data df = read_processing_training_data(args.data) validate_matched_training_data(df, getattr(args, "processing_data_policy", "matched")) print("Loaded training data: %s" % (str(df.shape))) df = df.loc[ (df.peptide.str.len() >= 8) & (df.peptide.str.len() <= 15) ] print("Subselected to 8-15mers: %s" % (str(df.shape))) # Resolve the master seed once for the whole run and seed this process's # global RNGs (so fold assignment below is reproducible). Per-fit weight # init and the train-data shuffle in train_model derive from the same # value via derive_seed. --random-seed defaults to 42; the resolved value # is logged either way. master_seed = configure_random_seed( args.random_seed, name="train-processing") df, folds_df = extract_training_folds( df, args.num_folds, reuse=getattr(args, "reuse_folds", False)) if folds_df is None: folds_df = assign_folds( df=df, num_folds=args.num_folds, held_out_samples=args.held_out_samples, seed=master_seed) if getattr(args, "processing_data_policy", "matched") == "matched": validate_matched_training_data(pandas.concat([df, folds_df], axis=1)) if not os.path.exists(args.out_models_dir): print("Attempting to create directory: %s" % args.out_models_dir) os.mkdir(args.out_models_dir) print("Done.") predictor = Class1ProcessingPredictor( models=[], metadata_dataframes={ 'train_data': pandas.merge( df, folds_df, left_index=True, right_index=True) }) work_items = [] for (h, hyperparameters) in enumerate(hyperparameters_lst): if args.max_epochs: hyperparameters['max_epochs'] = args.max_epochs for fold in range(args.num_folds): for replicate in range(args.num_replicates): work_dict = { 'work_item_name': str(uuid.uuid4()), 'architecture_num': h, 'num_architectures': len(hyperparameters_lst), 'fold_num': fold, 'num_folds': args.num_folds, 'replicate_num': replicate, 'num_replicates': args.num_replicates, 'hyperparameters': hyperparameters, } work_items.append(work_dict) training_init_info = {} training_init_info["train_data"] = df training_init_info["folds_df"] = folds_df training_init_info["work_items"] = work_items # Persist the master seed so the train_models phase (which may run in a # separate invocation via --continue-incomplete) derives per-fit seeds # from the same value used for fold assignment. training_init_info["seed"] = master_seed # Save empty predictor (for metadata) predictor.save(args.out_models_dir) # Write training_init_info. with open(join(args.out_models_dir, "training_init_info.pkl"), "wb") as fd: pickle.dump(training_init_info, fd, protocol=pickle.HIGHEST_PROTOCOL) print("Done initializing training.") def train_models(args): print("Beginning training.") predictor = Class1ProcessingPredictor.load(args.out_models_dir) print("Loaded predictor with %d networks" % len(predictor.models)) with open(join(args.out_models_dir, "training_init_info.pkl"), "rb") as fd: WORKER_CONTEXT.update(pickle.load(fd)) validate_matched_training_data( pandas.concat([WORKER_CONTEXT["train_data"], WORKER_CONTEXT["folds_df"]], axis=1), getattr(args, "processing_data_policy", "matched")) print("Loaded training init info.") # Work items are dispatched separately. Do not copy the complete queue # into every spawn worker as part of its read-only training context. all_work_items = WORKER_CONTEXT.pop("work_items") if not args.cluster_parallelism: refine_local_parallelism_from_worker_context(args, WORKER_CONTEXT) complete_work_item_names = [ network.fit_info[-1]["training_info"]["work_item_name"] for network in predictor.models ] work_items = [ item for item in all_work_items if item["work_item_name"] not in complete_work_item_names ] print("Found %d work items, of which %d are incomplete and will run now." % ( len(all_work_items), len(work_items))) serial_run = not args.cluster_parallelism and args.num_jobs == 0 # The estimated time to completion is more accurate if we randomize # the order of the work. Seed from the master seed so even the dispatch # order is reproducible (per-fit results don't depend on order — each # fit reseeds from its own work-item seed — but this keeps the whole # run deterministic). master_seed = WORKER_CONTEXT.get("seed") random.Random(master_seed).shuffle(work_items) for (work_item_num, item) in enumerate(work_items): item['work_item_num'] = work_item_num item['num_work_items'] = len(work_items) item['progress_print_interval'] = 60.0 if not serial_run else 5.0 item['predictor'] = predictor if serial_run else None item['save_to'] = args.out_models_dir if serial_run else None item['verbose'] = args.verbosity start = time.time() worker_pool = None if not work_items: print("No incomplete work items; skipping warmup and worker startup.") results_generator = None elif serial_run: # Run in serial. Every worker is passed the same predictor, # which it adds models to, so no merging is required. It also saves # as it goes so no saving is required at the end. print("Processing %d work items in serial." % len(work_items)) for _ in tqdm.trange(len(work_items)): item = work_items.pop(0) # want to keep freeing up memory work_predictor = train_model(**item) assert work_predictor is predictor pprint.pprint(predictor.models[-1].fit_info[-1]['training_info']) assert not work_items results_generator = None elif args.cluster_parallelism: # Run using separate processes HPC cluster. results_generator = cluster_results_from_args( args, work_function=train_model, work_items=work_items, constant_data=WORKER_CONTEXT, result_serialization_method="pickle") else: run_single_worker_resource_probe( args, work_items, train_model, constant_data=WORKER_CONTEXT, ) worker_pool = worker_pool_with_gpu_assignments_from_args( args, worker_context_module=__name__, worker_context_data=WORKER_CONTEXT, ) print("Worker pool", worker_pool) assert worker_pool is not None print("Processing %d work items in parallel." % len(work_items)) assert not serial_run results_generator = None try: if worker_pool is not None: results_generator = worker_pool.imap_unordered( partial(call_wrapped_kwargs, train_model), work_items, chunksize=1) if results_generator: for new_predictor in tqdm.tqdm(results_generator, total=len(work_items)): save_start = time.time() (model,) = new_predictor.models pprint.pprint(model.fit_info[-1]['training_info']) (new_model_name,) = predictor.add_models(new_predictor.models) predictor.save( args.out_models_dir, model_names_to_write=[new_model_name], write_metadata=False) print( "Saved predictor (%d models total) with 1 new models" "in %0.2f sec to %s" % ( len(predictor.models), time.time() - save_start, args.out_models_dir)) if worker_pool: worker_pool.close() worker_pool.join() worker_pool = None finally: # On failure mid-iteration, terminate() rather than # close()/join() (which can hang on a wedged worker) and # leave non-daemon workers behind. if worker_pool is not None: worker_pool.terminate() worker_pool.join() predictor.save(args.out_models_dir) write_generate_sh(args.out_models_dir) print("Done saving.") print("*" * 30) training_time = time.time() - start print("Trained processing predictor with %d networks in %0.2f min." % ( len(predictor.models), training_time / 60.0)) print("*" * 30) print("Predictor written to: %s" % args.out_models_dir) def _run_compile_warmup(hyperparameters, fold_num, constant_data): """One forward+backward through a freshly-built processing network. Companion to ``mhcflurry.cli.train_pan_allele_models_command._run_compile_warmup``. Retained for explicit ``compile_warmup_only`` calls. Normal training uses the full-residency resource probe instead. Discards the resulting model. """ from mhcflurry.flanking_encoding import FlankingEncoding df = constant_data["train_data"] folds_df = constant_data["folds_df"] minibatch = max(int(hyperparameters.get("minibatch_size", 128) or 128), 1) fold_mask = folds_df["fold_%d" % fold_num] train_subset = df.loc[fold_mask].head(minibatch) if len(train_subset) == 0: train_subset = df.head(minibatch) # Subselect to keys this network actually accepts so warmup is # robust to upstream configs carrying parameters that belong to a # different network (e.g. affinity-only data_dependent_initialization_method # used to leak in here and crash the strict-keys check). hp = Class1ProcessingNeuralNetwork.hyperparameter_defaults.subselect( dict(hyperparameters)) hp["max_epochs"] = 1 hp["validation_split"] = 0.0 hp["early_stopping"] = False hp["monitor_validation_ranking"] = False hp["checkpoint_metric"] = "val_loss" print( "compile_warmup_only (processing): convolutional_filters=%s " "post_dense=%s minibatch=%d rows=%d" % ( hp.get("convolutional_filters"), hp.get("post_convolutional_dense_layer_sizes"), minibatch, len(train_subset), ) ) started = time.time() memory_token = begin_peak_memory_measurement() model = None try: model = Class1ProcessingNeuralNetwork(**hp) model.fit( sequences=FlankingEncoding( peptides=train_subset.peptide.values, n_flanks=train_subset.n_flank.values, c_flanks=train_subset.c_flank.values), targets=train_subset.hit.values, verbose=0, ) report = end_peak_memory_measurement(memory_token) report["elapsed_seconds"] = time.time() - started print("compile_warmup_only (processing): completed in %.1f sec" % ( report["elapsed_seconds"])) return report finally: if model is not None: model._network = None model = None release_unused_torch_memory() def _run_resource_probe(hyperparameters, fold_num, constant_data): """Measure one full-residency processing fit epoch with validation.""" from mhcflurry.flanking_encoding import FlankingEncoding df = constant_data["train_data"] folds_df = constant_data["folds_df"] fold_mask = folds_df["fold_%d" % fold_num] train_data = df.loc[fold_mask] if len(train_data) == 0: train_data = df hp = Class1ProcessingNeuralNetwork.hyperparameter_defaults.subselect( dict(hyperparameters)) hp["max_epochs"] = 1 hp["early_stopping"] = False hp["monitor_validation_ranking"] = False hp["checkpoint_metric"] = "val_loss" print( "resource_probe_only (processing): convolutional_filters=%s " "post_dense=%s minibatch=%d rows=%d validation_split=%s" % ( hp.get("convolutional_filters"), hp.get("post_convolutional_dense_layer_sizes"), int(hp.get("minibatch_size", 128) or 128), len(train_data), hp.get("validation_split"), ) ) started = time.time() memory_token = begin_peak_memory_measurement() model = None try: model = Class1ProcessingNeuralNetwork(**hp) model.fit( sequences=FlankingEncoding( peptides=train_data.peptide.values, n_flanks=train_data.n_flank.values, c_flanks=train_data.c_flank.values), targets=train_data.hit.values, seed=0, verbose=0, ) report = end_peak_memory_measurement(memory_token) report["elapsed_seconds"] = time.time() - started print("resource_probe_only (processing): completed in %.1f sec: %s" % ( report["elapsed_seconds"], report)) return report finally: if model is not None: model._network = None model = None release_unused_torch_memory() def train_model( work_item_name, work_item_num, num_work_items, architecture_num, num_architectures, fold_num, num_folds, replicate_num, num_replicates, hyperparameters, verbose, progress_print_interval, predictor, save_to, compile_warmup_only=False, constant_data=WORKER_CONTEXT, resource_probe_only=False): from sklearn.metrics import roc_auc_score from mhcflurry.flanking_encoding import FlankingEncoding if resource_probe_only: return _run_resource_probe(hyperparameters, fold_num, constant_data) if compile_warmup_only: return _run_compile_warmup(hyperparameters, fold_num, constant_data) df = constant_data["train_data"] folds_df = constant_data["folds_df"] if predictor is None: predictor = Class1ProcessingPredictor(models=[]) numpy.testing.assert_equal(len(df), len(folds_df)) # Don't shuffle here: fit() owns ordering via its seeded # ``shuffle_permutation`` (a ``numpy.random.permutation`` drawn from the # global RNG that fit() seeds from the work-item seed). A host-side # ``.sample()`` would just add an unseeded numpy-global shuffle ahead of # fit's seeding, breaking single-seed reproducibility. train_data = df.loc[folds_df["fold_%d" % fold_num]].copy() test_data = df.loc[~folds_df["fold_%d" % fold_num]].copy() if (hyperparameters.get("monitor_validation_ranking") or hyperparameters.get("checkpoint_metric") == "val_macro_ap"): if set(train_data.sample_id) & set(test_data.sample_id): raise ValueError("Outer evaluation samples overlap processing training samples") print("Training on %d points (%d points held-out)." % ( len(train_data), len(test_data))) progress_preamble = ( "[task %2d / %2d]: " "[%2d / %2d folds] " "[%2d / %2d architectures] " "[%4d / %4d replicates] " % ( work_item_num + 1, num_work_items, fold_num + 1, num_folds, architecture_num + 1, num_architectures, replicate_num + 1, num_replicates)) print("%s [pid %d]. Hyperparameters:" % (progress_preamble, os.getpid())) pprint.pprint(hyperparameters) # One stable per-work-item seed controls every stochastic step of this # fit — weight init plus the train/val shuffles. Derived from the run's # master seed plus this fit's identity coordinates, so the whole run is # reproducible from --random-seed regardless of dispatch order across # workers. work_item_seed = derive_seed( constant_data.get("seed"), architecture_num, fold_num, replicate_num) model = Class1ProcessingNeuralNetwork(**hyperparameters) validation_mask = None if "processing_matching_policy" in train_data: validation_mask = sample_validation_mask( train_data, model.hyperparameters["validation_split"], derive_seed(constant_data.get("seed"), "processing-validation", fold_num)) model.fit( sequences=FlankingEncoding( peptides=train_data.peptide.values, n_flanks=train_data.n_flank.values, c_flanks=train_data.c_flank.values), targets=train_data.hit.values, validation_mask=validation_mask, sample_ids=train_data.sample_id.to_numpy(), progress_preamble=progress_preamble, progress_print_interval=progress_print_interval, seed=work_item_seed, verbose=verbose) # Fit can leave large unused CUDA allocator blocks reserved after the # validation forward. Release those before post-fit AUC scoring so this # worker's own cache does not crowd co-resident workers. release_unused_torch_memory() # Save model-specific training info train_peptide_hash = hashlib.sha1() for peptide in sorted(train_data.peptide.values): train_peptide_hash.update(peptide.encode()) # Compute AUC on held-out data just so it can be logged. for some_df in [train_data, test_data]: some_df["prediction"] = model.predict( peptides=some_df.peptide.values, n_flanks=some_df.n_flank.values, c_flanks=some_df.c_flank.values) train_auc = roc_auc_score( train_data.hit.values, train_data.prediction.values) test_auc = roc_auc_score(test_data.hit.values, test_data.prediction.values) print("Train AUC", train_auc) print("Test AUC", test_auc) model.fit_info[-1].setdefault("training_info", {}).update({ "fold_num": fold_num, "num_folds": num_folds, "replicate_num": replicate_num, "num_replicates": num_replicates, "architecture_num": architecture_num, "num_architectures": num_architectures, "train_peptide_hash": train_peptide_hash.hexdigest(), "work_item_name": work_item_name, "train_auc": train_auc, "test_auc": test_auc, "processing_data_policy": "matched" if "processing_matching_policy" in train_data else "legacy", "validation_samples": sorted(train_data.loc[validation_mask, "sample_id"].unique().tolist()) if validation_mask is not None else None, }) numpy.testing.assert_equal( predictor.manifest_df.shape[0], len(predictor.models)) predictor.add_models([model]) if save_to: predictor.save(save_to) print("Wrote", save_to) numpy.testing.assert_equal( predictor.manifest_df.shape[0], len(predictor.models)) # Delete the network to release memory model._network = None # release network to free memory release_unused_torch_memory() return predictor if __name__ == '__main__': run() mhcflurry-2.3.6/mhcflurry/cluster_parallelism.py000066400000000000000000000373621525677230600222200ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Simple, relatively naive parallel map implementation for HPC clusters. Used for training MHCflurry models. """ import sys import os import time import argparse import pickle import subprocess import shutil from shlex import quote from .parallelism import ( call_wrapped_kwargs, configure_cluster_worker_torch_compile_threads, ) from .class1_affinity_predictor import Class1AffinityPredictor from .common import install_sigusr1_stack_trace_handler def add_cluster_parallelism_args(parser): """ Add commandline arguments controlling cluster parallelism to an argparse ArgumentParser. Parameters ---------- parser : argparse.ArgumentParser """ group = parser.add_argument_group("Cluster parallelism") group.add_argument( "--cluster-parallelism", default=False, action="store_true") group.add_argument( "--cluster-submit-command", default='sh', help="Default: %(default)s") group.add_argument( "--cluster-results-workdir", default='./cluster-workdir', help="Default: %(default)s") group.add_argument( "--additional-complete-file", default='STDERR', help="Additional file to monitor for job completion. Default: %(default)s") group.add_argument( '--cluster-script-prefix-path', help="", ) group.add_argument( '--cluster-max-retries', type=int, help="How many times to rerun failing jobs. Default: %(default)s", default=3) def cluster_results_from_args( args, work_function, work_items, constant_data=None, input_serialization_method="pickle", result_serialization_method="pickle", clear_constant_data=False): """ Parallel map configurable using commandline arguments. See the cluster_results() function for docs. The `args` parameter should be an argparse.Namespace from an argparse parser generated using the add_cluster_parallelism_args() function. Parameters ---------- args : argparse.Namespace Parsed cluster configuration. work_function : callable Function called with each item's keyword arguments and constant_data. work_items : iterable of dict Keyword arguments for each work item. constant_data : object, optional Shared input made available to each job. input_serialization_method : str Input serializer: 'pickle' or 'dill'. result_serialization_method : str Result serializer: 'pickle' or 'save_predictor'. clear_constant_data : bool Clear the shared-input dictionary after serialization to free memory. Returns ------- generator """ return cluster_results( work_function=work_function, work_items=work_items, constant_data=constant_data, submit_command=args.cluster_submit_command, results_workdir=args.cluster_results_workdir, additional_complete_file=args.additional_complete_file, script_prefix_path=args.cluster_script_prefix_path, input_serialization_method=input_serialization_method, result_serialization_method=result_serialization_method, max_retries=args.cluster_max_retries, clear_constant_data=clear_constant_data ) def cluster_results( work_function, work_items, constant_data=None, submit_command="sh", results_workdir="./cluster-workdir", additional_complete_file=None, script_prefix_path=None, input_serialization_method="pickle", result_serialization_method="pickle", max_retries=3, clear_constant_data=False): """ Parallel map on an HPC cluster. Returns [work_function(item) for item in work_items] where each invocation of work_function is performed as a separate HPC cluster job. Results are yielded as completed jobs are observed, not in input order. Optionally, "constant data" can be specified, which will be passed to each work_function() invocation as a keyword argument called constant_data. This data is serialized once and all workers read it from the same source, which is more efficient than serializing it separately for each worker. Each worker's input is serialized to a shared NFS directory and the submit_command is used to launch a job to process that input. The shared filesystem is polled occasionally to watch for results, which are fed back to the user. Parameters ---------- work_function : A -> B work_items : list of A constant_data : object submit_command : string For running on LSF, we use "bsub" here. results_workdir : string Path to NFS shared directory where inputs and results can be written script_prefix_path : string Path to script that will be invoked to run each worker. A line calling the _mhcflurry-cluster-worker-entry-point command will be appended to the contents of this file. result_serialization_method : string, one of "pickle" or "save_predictor" The "save_predictor" works only when the return type of work_function is Class1AffinityPredictor input_serialization_method : str Input/context serialization format (pickle or dill). additional_complete_file : str, optional Alternative worker-completion marker, relative to the job directory. Its presence also triggers result/error inspection. max_retries : int How many times to attempt to re-launch a failed worker clear_constant_data : bool If True, the constant data dict is cleared on the launching host after it is serialized to disk. Returns ------- generator of B """ if input_serialization_method == "dill": import dill input_serialization_module = dill else: assert input_serialization_method == "pickle" input_serialization_module = pickle constant_payload = { 'constant_data': constant_data, 'function': work_function, } if not os.path.exists(results_workdir): os.mkdir(results_workdir) work_dir = os.path.join( os.path.abspath(results_workdir), str(int(time.time()))) os.mkdir(work_dir) constant_payload_path = os.path.join( work_dir, "global_data." + input_serialization_method) with open(constant_payload_path, "wb") as fd: input_serialization_module.dump( constant_payload, fd, protocol=input_serialization_module.HIGHEST_PROTOCOL) print("Wrote:", constant_payload_path) if clear_constant_data: constant_data.clear() print("Cleared constant data to free up memory.") if script_prefix_path: with open(script_prefix_path) as fd: script_prefix = fd.read() else: script_prefix = "#!/bin/bash" result_items = [] for (i, item) in enumerate(work_items): item_workdir = os.path.join( work_dir, "work-item.%03d-of-%03d" % (i, len(work_items))) os.mkdir(item_workdir) item_data_path = os.path.join( item_workdir, "data." + input_serialization_method) with open(item_data_path, "wb") as fd: input_serialization_module.dump( item, fd, protocol=input_serialization_module.HIGHEST_PROTOCOL) print("Wrote:", item_data_path) item_result_path = os.path.join(item_workdir, "result") item_error_path = os.path.join(item_workdir, "error.pkl") item_finished_path = os.path.join(item_workdir, "COMPLETE") item_script_pieces = [ script_prefix.format(work_item_num=i, work_dir=item_workdir) ] worker_command = os.environ.get( "MHCFLURRY_CLUSTER_WORKER_COMMAND", "_mhcflurry-cluster-worker-entry-point" ) item_script_pieces.append(" ".join([ worker_command, "--constant-data", quote(constant_payload_path), "--worker-data", quote(item_data_path), "--result-out", quote(item_result_path), "--error-out", quote(item_error_path), "--complete-dir", quote(item_finished_path), "--input-serialization-method", input_serialization_method, "--result-serialization-method", result_serialization_method, ])) item_script = "\n".join(item_script_pieces) item_script_path = os.path.join( item_workdir, "run.%d.sh" % i) with open(item_script_path, "w") as fd: fd.write(item_script) print("Wrote:", item_script_path) launch_command = " ".join([ submit_command, "<", quote(item_script_path) ]) subprocess.check_call(launch_command, shell=True) print("Invoked", launch_command) result_items.append({ 'work_dir': item_workdir, 'finished_path': item_finished_path, 'result_path': item_result_path, 'error_path': item_error_path, 'retry_num': 0, 'launch_command': launch_command, }) def result_generator(): additional_complete_file_path = None start = time.time() while result_items: print("[%0.1f sec elapsed] waiting on %d / %d items." % ( time.time() - start, len(result_items), len(work_items))) while True: result_item = None for d in result_items: if additional_complete_file: additional_complete_file_path = os.path.join( d['work_dir'], additional_complete_file) if os.path.exists(d['finished_path']): result_item = d break if additional_complete_file and os.path.exists( additional_complete_file_path): result_item = d print("Exists", additional_complete_file_path) break if result_item is None: time.sleep(60) else: result_items.remove(result_item) break complete_dir = result_item['finished_path'] result_path = result_item['result_path'] error_path = result_item['error_path'] retry_num = result_item['retry_num'] launch_command = result_item['launch_command'] print("[%0.1f sec elapsed] processing item %s" % ( time.time() - start, result_item)) if os.path.exists(error_path) or not os.path.exists(result_path): if os.path.exists(error_path): print("Error path exists", error_path) try: with open(error_path, "rb") as fd: exception = pickle.load(fd) print(exception) except Exception as e: exception = RuntimeError( "Error, but couldn't read error path: %s %s" % ( type(e), str(e))) else: exception = RuntimeError("Error, but no exception saved") if not os.path.exists(result_path): print("Result path does NOT exist", result_path) if retry_num < max_retries: print("Relaunching", launch_command) attempt_dir = os.path.join( result_item['work_dir'], "attempt.%d" % retry_num) if os.path.exists(complete_dir): shutil.move(complete_dir, attempt_dir) # directory if additional_complete_file and os.path.exists( additional_complete_file_path): shutil.move(additional_complete_file_path, attempt_dir) if os.path.exists(error_path): shutil.move(error_path, attempt_dir) subprocess.check_call(launch_command, shell=True) print("Invoked", launch_command) result_item['retry_num'] += 1 result_items.append(result_item) continue else: print("Max retries exceeded", max_retries) raise exception if os.path.exists(result_path): print("Result path exists", result_path) if result_serialization_method == "save_predictor": result = Class1AffinityPredictor.load(result_path) elif result_serialization_method == "pickle": with open(result_path, "rb") as fd: result = pickle.load(fd) else: raise ValueError( "Unsupported serialization method", result_serialization_method) yield result else: raise RuntimeError("Results do not exist", result_path) return result_generator() parser = argparse.ArgumentParser( usage="Entry point for cluster workers") parser.add_argument( "--constant-data", required=True, ) parser.add_argument( "--worker-data", required=True, ) parser.add_argument( "--result-out", required=True, ) parser.add_argument( "--error-out", required=True, ) parser.add_argument( "--complete-dir", ) parser.add_argument( "--input-serialization-method", choices=("pickle", "dill"), default="pickle") parser.add_argument( "--result-serialization-method", choices=("pickle", "save_predictor"), default="pickle") def worker_entry_point(argv=sys.argv[1:]): """ Entry point for the worker command. Parameters ---------- argv : list of string """ install_sigusr1_stack_trace_handler() args = parser.parse_args(argv) if args.input_serialization_method == "dill": import dill input_serialization_module = dill else: assert args.input_serialization_method == "pickle" input_serialization_module = pickle with open(args.constant_data, "rb") as fd: constant_payload = input_serialization_module.load(fd) with open(args.worker_data, "rb") as fd: worker_data = input_serialization_module.load(fd) kwargs = dict(worker_data) if constant_payload['constant_data'] is not None: kwargs['constant_data'] = constant_payload['constant_data'] try: configure_cluster_worker_torch_compile_threads() result = call_wrapped_kwargs(constant_payload['function'], kwargs) if args.result_serialization_method == 'save_predictor': result.save(args.result_out) else: with open(args.result_out, "wb") as fd: pickle.dump(result, fd, pickle.HIGHEST_PROTOCOL) print("Wrote:", args.result_out) except Exception as e: print("Exception: ", e) with open(args.error_out, "wb") as fd: pickle.dump(e, fd, pickle.HIGHEST_PROTOCOL) print("Wrote:", args.error_out) raise finally: if args.complete_dir: os.mkdir(args.complete_dir) print("Created: ", args.complete_dir) mhcflurry-2.3.6/mhcflurry/cluster_worker_entry_point.py000066400000000000000000000013461525677230600236470ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Module entry point for cluster workers to ensure the current interpreter is used. """ from .cluster_parallelism import worker_entry_point if __name__ == "__main__": worker_entry_point() mhcflurry-2.3.6/mhcflurry/common.py000066400000000000000000001033541525677230600174350ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import collections import argparse import datetime import hashlib import logging import random import shlex import sys import os import json import math import warnings import numpy import pandas from mhcgnomes import ( parse, parse_gene_class, Allele, AlleleWithoutGene, Gene, Serotype, ) from . import amino_acid # Default master seed for CLI commands that accept --random-seed. A fixed # seed supports reproducible sampling; numerical results can still depend on # hardware, library versions and nondeterministic kernels. DEFAULT_RANDOM_SEED = 42 def positive_int_arg(value): """Parse an argparse value as an integer greater than zero.""" if isinstance(value, bool): raise argparse.ArgumentTypeError( "expected a positive integer, got %r" % (value,) ) try: result = int(value) except (TypeError, ValueError): raise argparse.ArgumentTypeError( "expected a positive integer, got %r" % (value,) ) from None if isinstance(value, (float, numpy.floating)) and not value.is_integer(): raise argparse.ArgumentTypeError( "expected a positive integer, got %r" % (value,) ) if result < 1: raise argparse.ArgumentTypeError( "expected a positive integer, got %r" % (value,) ) return result def positive_float_arg(value): """Parse an argparse value as a finite float greater than zero.""" try: result = float(value) except (TypeError, ValueError): raise argparse.ArgumentTypeError( "expected a positive number, got %r" % (value,) ) from None if not math.isfinite(result) or result <= 0: raise argparse.ArgumentTypeError( "expected a positive number, got %r" % (value,) ) return result def fraction_arg(value): """Parse an argparse value as a finite fraction in ``(0, 1]``.""" result = positive_float_arg(value) if result > 1: raise argparse.ArgumentTypeError( "expected a fraction in (0, 1], got %r" % (value,) ) return result def add_random_seed_arg(parser): """Add the standard ``--random-seed`` argument to a CLI parser. Training commands use this flag to record a shared source of random seeds. It does not guarantee identical results across devices or library versions. Pair with :func:`configure_random_seed` at the start of the command's ``run``/``main``. """ parser.add_argument( "--random-seed", type=int, metavar="N", default=DEFAULT_RANDOM_SEED, help="Master random seed for this command " "(numpy, Python `random`, and torch): data shuffles, fold/held-out " "sampling, weight initialization, and random peptide/negative " "sampling. Default: %(default)s. Exact numerical results can still " "vary with hardware, library versions and nondeterministic kernels.") def configure_random_seed(seed=None, name="mhcflurry"): """Resolve, apply, and log a master random seed. Seeds numpy's, Python's, and torch's *global* RNGs so every randomness source in this process derives from one value. When ``seed`` is None a value is drawn from system entropy. Returns the resolved seed so callers can derive worker-local sub-seeds via :func:`derive_seed`. """ resolved = ( int(seed) if seed is not None else int.from_bytes(os.urandom(4), "little")) numpy.random.seed(resolved % (2 ** 32)) random.seed(resolved) try: import torch torch.manual_seed(resolved & ((1 << 63) - 1)) except ImportError: pass print("%s random seed: %d%s" % ( name, resolved, "" if seed is not None else " (drawn from entropy)")) return resolved def install_sigusr1_stack_trace_handler(): """Install a SIGUSR1 handler that prints this process's stack trace.""" import signal import traceback signum = getattr(signal, "SIGUSR1", None) if signum is None: return False print("To show stack trace, run:\nkill -s USR1 %d" % os.getpid()) signal.signal(signum, lambda _signum, _frame: traceback.print_stack()) return True def derive_seed(master_seed, *parts): """Derive a stable sub-seed from a master seed and identity ``parts``. Gives independent units of work (e.g. one training fit, keyed by architecture/fold/replicate) decorrelated but reproducible seeds, all rooted in the run's single master seed. ``master_seed`` may be None (e.g. a legacy run with no recorded seed); the result is still stable. """ pieces = [str(p) for p in ((master_seed,) + parts)] # The "|" join is unambiguous only because no coordinate contains "|" # (parts are integers / allele names today). Guard it so a future caller # passing a "|"-containing identity fails loudly rather than silently # colliding with a differently-split set of parts -- e.g. ("a|b",) vs # ("a", "b"). Kept as a guard rather than a new length-prefixed encoding # so every existing derived seed is unchanged. assert not any("|" in piece for piece in pieces), ( "derive_seed parts must not contain '|': %r" % (parts,)) identity = "|".join(pieces) return int(hashlib.sha1(identity.encode()).hexdigest()[:16], 16) def normalize_allele_name( raw_name, forbidden_substrings=("MIC", "HFE"), raise_on_error=True, default_value=None, use_allele_aliases=True): """ Parses a string into a normalized allele representation. Parameters ---------- raw_name : str Input string to normalize forbidden_substrings : tuple of str Legacy argument naming retained for compatibility. Values identify exact genes; ``MIC`` identifies the mhcgnomes class-Ic family. Input names are never rejected by substring matching. raise_on_error : bool If an allele fails to parse raise an exception if this argument is True default_value : str or None If raise_on_error is False and allele fails to parse, return this value use_allele_aliases : bool If True, use mhcgnomes allele alias table (IMGT historical name reassignments). Some old allele names (e.g. B*44:01, Cw*0201) were retired by IMGT when the original sequences were found to contain errors. Defaults to True, so retired/aliased names resolve to their current canonical form. Callers that must preserve current IMGT nomenclature (e.g. pseudosequence-key matching, which is no-alias-first with explicit fallback) pass use_allele_aliases=False. Returns ------- str or None """ if not isinstance(raw_name, str) or not raw_name.strip(): message = ( "Invalid MHC allele name: %r. Expected a non-empty string." % (raw_name,) ) if raise_on_error: raise ValueError(message) return default_value result = parse( raw_name, only_class1=True, required_result_types=[Allele, AlleleWithoutGene, Gene], preferred_result_types=[Allele], use_allele_aliases=use_allele_aliases, infer_class2_pairing=False, collapse_singleton_haplotypes=True, collapse_singleton_serotypes=True, raise_on_error=False, ) if result is None: parsed_any_class = parse( raw_name, only_class1=False, use_allele_aliases=use_allele_aliases, infer_class2_pairing=False, collapse_singleton_haplotypes=True, collapse_singleton_serotypes=True, raise_on_error=False, ) if isinstance(parsed_any_class, Serotype): message = ( "Ambiguous MHC serotype is not a specific allele: %s. " "Provide a sequence-resolved allele such as HLA-A*02:01; " "MHCflurry does not choose or average serotype members." % raw_name ) elif getattr(parsed_any_class, "is_class2", False): message = ( "Unsupported MHC class II allele for a class I predictor: " "%s. Use an MHC class I allele and a model containing its " "pseudosequence." % raw_name ) elif parsed_any_class is not None: message = ( "Unsupported MHC name for class I allele prediction: %s " "(parsed as %s, not a class I allele)." % (raw_name, type(parsed_any_class).__name__) ) else: message = ( "Invalid MHC allele name: %s. Provide a sequence-resolved " "MHC class I allele such as HLA-A*02:01." % raw_name ) if raise_on_error: raise ValueError(message) return default_value gene_name = getattr(result, "gene_name", "") or "" gene_class = parse_gene_class(raw_name, raise_on_error=False) for forbidden_gene in forbidden_substrings: is_forbidden = ( gene_name == forbidden_gene or ( forbidden_gene == "MIC" and getattr(gene_class, "mhc_class", None) == "Ic" ) ) if is_forbidden: if raise_on_error: raise ValueError( "Unsupported gene in MHC allele name: %s. MHCflurry " "affinity models support classical MHC class I alleles, " "not %s-family genes." % (raw_name, forbidden_gene) ) return default_value if getattr(result, "is_pseudogene", False): if raise_on_error: raise ValueError( "Unsupported pseudogene MHC allele: %s. Pseudogene alleles " "do not have a usable class I product for affinity " "prediction." % raw_name ) return default_value if result.annotation_null: if raise_on_error: raise ValueError( "Unsupported null-expression MHC allele: %s. Null alleles " "are not expressed and are not supported for prediction." % raw_name ) return default_value if result.annotation_questionable: if raise_on_error: raise ValueError( "Unsupported questionable-expression MHC allele: %s. " "Alleles with uncertain expression are not supported for " "prediction." % raw_name ) return default_value return result.restrict_allele_fields(2).to_string() def normalize_sequence_resolved_allele_name(raw_name): """Return a canonical, sequence-resolved class-I allele name. HLA allele groups require at least two fields because a one-field group can contain multiple protein sequences. Other species require at least one allele field. Serotypes, genes, class-II names, pseudogenes, and invalid spellings fail through :func:`normalize_allele_name` with its specific diagnostic. """ normalized = normalize_allele_name(raw_name) parsed = parse(normalized, only_class1=True, raise_on_error=False) species = getattr(parsed, "species", None) required_fields = 2 if getattr(species, "mhc_prefix", None) == "HLA" else 1 if ( parsed is None or len(getattr(parsed, "allele_fields", ())) < required_fields): raise ValueError( "Expected a sequence-resolved class-I allele with at least %d " "field%s; got %r." % ( required_fields, "" if required_fields == 1 else "s", raw_name, ) ) return normalized def normalize_class1_genotype(value): """Canonicalize whitespace-delimited class-I MHC alleles into a tuple.""" if not isinstance(value, str) or not value.strip(): raise ValueError( "Expected a non-empty whitespace-delimited class-I genotype; " "got %r." % value ) return tuple(dict.fromkeys( normalize_sequence_resolved_allele_name(allele) for allele in value.split() )) def allele_locus_name( raw_name, raise_on_error=False, default_value="other", use_allele_aliases=True): """Return a class-I MHC locus label using mhcgnomes parsing. Human loci are returned as ``HLA-A``, ``HLA-B``, etc. Mouse H-2 loci are collapsed to ``H2`` for the plotting/MHC-sampling code that only needs a species-level bucket. Unparseable inputs raise when ``raise_on_error`` is true. Valid but unhandled loci still return ``default_value``. """ result = parse( str(raw_name), only_class1=True, required_result_types=[Allele, AlleleWithoutGene, Gene, Serotype], preferred_result_types=[Allele], use_allele_aliases=use_allele_aliases, infer_class2_pairing=False, collapse_singleton_haplotypes=True, collapse_singleton_serotypes=True, raise_on_error=False, ) if result is None: if raise_on_error: raise ValueError("Invalid MHC allele name: %s" % raw_name) return default_value species = getattr(result, "species", None) prefix = getattr(species, "mhc_prefix", None) gene_name = getattr(result, "gene_name", None) if prefix == "HLA" and gene_name: return "HLA-%s" % gene_name if prefix == "H2": return "H2" return default_value def filter_canonicalizable_alleles(alleles, log_label="alleles"): """Drop alleles that ``normalize_allele_name`` refuses to canonicalize. Returns the surviving names **unchanged** (raw input strings), having only removed the un-canonicalizable ones. ``predictor.supported_alleles`` (and any user-supplied ``--alleles-file``) can contain pseudogenes / null alleles / questionable annotations — those are real entries in the public ``allele_sequences.csv`` (which aims to be exhaustive), but ``predict_to_dataframe`` raises on them mid-iteration. Filter once up front so iteration doesn't crash partway through, and log the dropped sample so the missing rows in the resulting output table are explainable. Survivors are returned verbatim rather than canonicalized: callers that need names to match a predictor's pseudosequence keys must map them through ``predictor.canonicalize_allele_name`` (which prefers the no-alias form, matching how ``allele_to_sequence`` keys are built). A generic alias-applying normalization here would silently remap retired alleles (e.g. ``HLA-B*44:01`` -> ``HLA-B*44:02``) away from their own key. A local memo keeps the per-allele ``normalize_allele_name`` cost bounded. mhcgnomes also caches its own parses, so even the full ~20K-allele predictor set is a one-time ~1-2 sec single-threaded pre-pass (measured), not the minutes a naive uncached parse would cost. """ seen = {} def _ok(allele): if allele not in seen: try: normalize_allele_name(allele) seen[allele] = True except (ValueError, TypeError): seen[allele] = False return seen[allele] filtered = [] dropped = [] for a in alleles: (filtered if _ok(a) else dropped).append(a) if dropped: sample = ", ".join(dropped[:5]) + ( ", ..." if len(dropped) > 5 else "" ) logging.warning( "Skipping %d %s that fail canonicalization " "(pseudogene/null/questionable): %s", len(dropped), log_label, sample, ) return filtered def build_allele_alias_map(valid_keys): """Map mhcgnomes-aliased names back to the canonical keys in ``valid_keys``. For each key, compute its alias-applied normalization; if that differs from the key and isn't itself a key, record ``alias -> key``. Mirrors the map the affinity predictor builds at load time (``allele_to_canonical``), but for an arbitrary key set — e.g. an allele-sequences table at training time. """ valid = set(valid_keys) alias_map = {} for key in valid: aliased = normalize_allele_name( key, raise_on_error=False, use_allele_aliases=True) if aliased is not None and aliased != key and aliased not in valid: alias_map[aliased] = key return alias_map class AlleleKeyResolver(object): """Resolves allele names to a fixed set of canonical keys, no-alias-first. A name is resolved by this priority (each step checked against ``valid_keys``): 1. its own no-alias normalization, if that is already a key — so an allele with its own pseudosequence isn't remapped onto an alias target (e.g. retired ``HLA-B*44:01`` keeps its own entry rather than collapsing to ``HLA-B*44:02``); 2. its alias-applied normalization, if *that* is a key; 3. the key it is a retired alias of, via the reverse alias map. Two resolution modes, deliberately distinct: * :meth:`resolve_to_key` — strict. Returns the resolved key, or None for any name that maps to no key (whether unsupported or unparseable). Use this when an unmatched name should be dropped (e.g. training ingestion). * :meth:`resolve` — best effort. Like ``resolve_to_key`` for names that do match a key, but a name that *normalizes* yet matches no key is returned as its normalized form (not None), so callers can surface it as an unsupported allele downstream. Returns None only when the name can't be normalized at all (and ``raise_on_error=False``). The reverse alias map (``build_allele_alias_map``, an O(len(valid_keys)) scan) is built once and cached on first use — so already-canonical inputs, which resolve at step 1 or 2, never pay for it. Pass it prebuilt (e.g. a predictor's load-time ``allele_to_canonical``) to skip the scan entirely. ``valid_keys`` should support O(1) ``in`` (a dict or set); an empty/falsy value skips steps 1-2 (e.g. allele-specific predictors with no pseudosequences), so every name falls through to the reverse-map step. """ def __init__(self, valid_keys, alias_map=None): self.valid_keys = valid_keys self._alias_map = alias_map # built lazily by reverse_alias_map() def reverse_alias_map(self): """The alias -> key map, built once on first use and cached.""" if self._alias_map is None: self._alias_map = build_allele_alias_map(self.valid_keys) return self._alias_map def resolve(self, raw_name, raise_on_error=False): """Best-effort resolution. See the class docstring for the contract.""" if self.valid_keys: no_alias = normalize_allele_name( raw_name, raise_on_error=False, use_allele_aliases=False) if no_alias is not None and no_alias in self.valid_keys: return no_alias normalized = normalize_allele_name( raw_name, raise_on_error=raise_on_error) if normalized is None: return None if self.valid_keys and normalized in self.valid_keys: return normalized return self.reverse_alias_map().get(normalized, normalized) def resolve_to_key(self, raw_name): """Strict resolution: a key in ``valid_keys``, or None. Drops the best-effort fallback of :meth:`resolve` — an unsupported or unparseable name both return None. """ resolved = self.resolve(raw_name, raise_on_error=False) if self.valid_keys and resolved in self.valid_keys: return resolved return None def canonicalize_allele_series(alleles, valid_keys, log_label="alleles"): """Map allele names to canonical keys (no-alias-first), strictly. Returns a list parallel to ``alleles`` with each name resolved to a key in ``valid_keys``, or None when it resolves to no key (so the row can be dropped). Memoizes per unique input, so it is cheap over a long training column with few distinct alleles, and the reverse alias map is built lazily (only if some name is a current-name request for a retired key) — so already-canonical data never pays the ~O(len(valid_keys)) scan. Logs a sample of names that did not resolve. Use this for training ingestion. """ resolver = AlleleKeyResolver(set(valid_keys)) # alias map built lazily resolved = {} dropped = [] def _resolve(name): if name not in resolved: key = resolver.resolve_to_key(name) # key, or None to drop resolved[name] = key if key is None: dropped.append(name) return resolved[name] out = [_resolve(a) for a in alleles] if dropped: sample = ", ".join(map(str, dropped[:5])) + ( ", ..." if len(dropped) > 5 else "") logging.warning( "Dropping %d %s that resolve to no supported allele key: %s", len(dropped), log_label, sample) return out _pytorch_backend = "auto" _PYTORCH_BACKEND_ALIASES = { "default": "auto", } _TENSORFLOW_BACKEND_ALIASES = { "tensorflow": "auto", "tensorflow-default": "auto", "tensorflow-gpu": "gpu", "tensorflow-cpu": "cpu", } _VALID_PYTORCH_BACKENDS = ("auto", "gpu", "mps", "cpu") def normalize_pytorch_backend(backend): """ Normalize a requested backend name and validate it. Parameters ---------- backend : str or None Returns ------- str or None """ if backend is None: return None backend = _PYTORCH_BACKEND_ALIASES.get(backend, backend) if backend not in _VALID_PYTORCH_BACKENDS: raise ValueError( "Invalid backend %r. Expected one of: %s" % ( backend, ", ".join(_VALID_PYTORCH_BACKENDS), ) ) return backend def configure_pytorch(backend=None, gpu_device_nums=None, num_threads=None): """ Configure PyTorch device backend and threading. Can be called multiple times. Each call updates the settings provided. Parameters ---------- backend : str, optional Device backend: "auto", "gpu", "mps", or "cpu". "auto" selects the best available device (GPU > MPS > CPU). gpu_device_nums : list of str or int, optional CUDA device identifiers to expose via CUDA_VISIBLE_DEVICES. An empty list hides CUDA entirely for the current process. num_threads : int, optional Number of threads for PyTorch operations """ global _pytorch_backend if backend is not None: _pytorch_backend = normalize_pytorch_backend(backend) if gpu_device_nums is not None: os.environ['CUDA_VISIBLE_DEVICES'] = ','.join(map(str, gpu_device_nums)) if num_threads: import torch torch.set_num_threads(num_threads) def configure_tensorflow(backend=None, gpu_device_nums=None, num_threads=None): """ Backward-compatible configuration entry point from the TF backend era. Parameters ---------- backend : str, optional Legacy backend value retained for API compatibility. TensorFlow-era names such as "tensorflow-cpu" are translated to the equivalent PyTorch backend and emit a deprecation warning. gpu_device_nums : list of str or int, optional GPU device identifiers to potentially use. num_threads : int, optional Number of threads for backend operations. """ translated_backend = None if backend is not None: translated_backend = _TENSORFLOW_BACKEND_ALIASES.get(backend) if translated_backend is not None: warnings.warn( ( "configure_tensorflow(backend=%r) is deprecated; " "using PyTorch backend=%r. Use configure_pytorch() instead." ) % (backend, translated_backend), FutureWarning, stacklevel=2, ) else: translated_backend = normalize_pytorch_backend(backend) configure_pytorch( backend=translated_backend, gpu_device_nums=gpu_device_nums, num_threads=num_threads, ) def get_pytorch_device(): """ Get the PyTorch device based on the backend set by ``configure_pytorch``. Returns ------- torch.device """ import torch backend = _pytorch_backend if backend == "gpu": if not torch.cuda.is_available(): raise RuntimeError( "Backend 'gpu' requested but CUDA is not available") return torch.device('cuda') elif backend == "mps": if not (hasattr(torch.backends, 'mps') and torch.backends.mps.is_available()): raise RuntimeError( "Backend 'mps' requested but MPS is not available") return torch.device('mps') elif backend == "cpu": return torch.device('cpu') else: # auto: GPU > MPS > CPU if torch.cuda.is_available(): return torch.device('cuda') elif (hasattr(torch.backends, 'mps') and torch.backends.mps.is_available()): return torch.device('mps') else: return torch.device('cpu') def configure_logging(verbose=False): """ Configure logging module using defaults. Parameters ---------- verbose : boolean If true, output will be at level DEBUG, otherwise, INFO. """ level = logging.DEBUG if verbose else logging.INFO logging.basicConfig( format="%(asctime)s.%(msecs)d %(levelname)s %(module)s - %(funcName)s:" " %(message)s", datefmt="%Y-%m-%d %H:%M:%S", stream=sys.stderr, level=level, ) def amino_acid_distribution(peptides, smoothing=0.0): """ Compute the fraction of each amino acid across a collection of peptides. Parameters ---------- peptides : list of string smoothing : float, optional Small number (e.g. 0.01) to add to all amino acid fractions. The higher the number the more uniform the distribution. Returns ------- pandas.Series indexed by amino acids """ peptides = pandas.Series(peptides) aa_counts = pandas.Series(peptides.map(collections.Counter).sum()) normalized = aa_counts / aa_counts.sum() if smoothing: normalized += smoothing normalized /= normalized.sum() return normalized def random_peptides(num, length=9, distribution=None, rng=None): """ Generate random peptides (kmers). Parameters ---------- num : int Number of peptides to return length : int Length of each peptide distribution : pandas.Series Maps 1-letter amino acid abbreviations to probabilities. If not specified a uniform distribution is used. rng : numpy.random.Generator, optional If provided, peptides are sampled from this generator instead of the global ``numpy.random`` state. Used by callers that need deterministic peptide generation, such as pre-generated random-negative pools. When None the global state is used, preserving legacy call-site semantics. Returns ------- list of string """ if num == 0: return [] if distribution is None: distribution = pandas.Series(1, index=sorted(amino_acid.COMMON_AMINO_ACIDS)) distribution /= distribution.sum() if rng is None: sampled = numpy.random.choice( distribution.index, p=distribution.values, size=(int(num), int(length)) ) else: sampled = rng.choice( distribution.index.to_numpy(), p=distribution.values, size=(int(num), int(length)), ) return ["".join(peptide_sequence) for peptide_sequence in sampled] def positional_frequency_matrix(peptides): """ Given a set of peptides, calculate a length x amino acids frequency matrix. Parameters ---------- peptides : list of string All of same length Returns ------- pandas.DataFrame Index is position, columns are amino acids """ length = len(peptides[0]) assert all(len(peptide) == length for peptide in peptides) counts = pandas.DataFrame( index=[a for a in amino_acid.BLOSUM62_MATRIX.index if a != "X"], columns=numpy.arange(1, length + 1), ) for i in range(length): counts[i + 1] = pandas.Series([p[i] for p in peptides]).value_counts() result = (counts / len(peptides)).fillna(0.0).T result.index.name = "position" return result def save_weights(weights_list, filename): """ Save model weights to the given filename using numpy's ".npz" format. Parameters ---------- weights_list : list of numpy array filename : string """ numpy.savez( filename, **dict((("array_%d" % i), w) for (i, w) in enumerate(weights_list)) ) def load_weights(filename): """ Restore model weights from the given filename, which should have been created with `save_weights`. Parameters ---------- filename : string Returns ------- list of array """ with numpy.load(filename) as loaded: weights = [loaded["array_%d" % i] for i in range(len(loaded.keys()))] return weights class NumpyJSONEncoder(json.JSONEncoder): """ JSON encoder (used with json module) that can handle numpy arrays. """ def default(self, obj): if isinstance( obj, ( numpy.int_, numpy.intc, numpy.intp, numpy.int8, numpy.int16, numpy.int32, numpy.int64, numpy.uint8, numpy.uint16, numpy.uint32, numpy.uint64, ), ): return int(obj) elif isinstance( obj, (numpy.float_, numpy.float16, numpy.float32, numpy.float64) ): return float(obj) if isinstance(obj, numpy.ndarray): return obj.tolist() return json.JSONEncoder.default(self, obj) _GENERATE_SH_TEMPLATE = """\ #!/usr/bin/env bash # Auto-generated by mhcflurry {version} on {timestamp}. # # Run this script with no arguments to produce a tar.gz snapshot of # the artifact directory it lives in: # # bash GENERATE.sh # # Pass `regenerate` as the first argument to re-run the originating # mhcflurry command (which recreates the directory) and then snapshot: # # bash GENERATE.sh regenerate # # The originating command is recorded in ORIGINAL_COMMAND below; paths # inside it may need adjustment if you run from a different machine. set -euo pipefail HERE="$(cd "$(dirname "${{BASH_SOURCE[0]}}")" && pwd)" NAME="$(basename "$HERE")" PARENT="$(dirname "$HERE")" ORIGINAL_CWD={cwd} ORIGINAL_COMMAND=( {cmd} ) if [ "${{1:-}}" = "regenerate" ]; then # Safety checks before destroying the artifact dir: # * $HERE must resolve to a directory we own, # * not be the filesystem root or $HOME, # * and contain the GENERATE.sh we are running -- the canonical # marker that this dir was produced by mhcflurry. Without these # checks, a user re-running GENERATE.sh from inside an already- # replaced mountpoint, or with $HERE corrupted by a path edit, # could rm -rf an unrelated tree. if [ -z "$HERE" ] || [ "$HERE" = "/" ] || [ "$HERE" = "$HOME" ]; then echo "regenerate: refusing to rm -rf suspicious path: $HERE" >&2 exit 1 fi if [ ! -d "$HERE" ] || [ ! -O "$HERE" ]; then echo "regenerate: $HERE is not a directory we own" >&2 exit 1 fi if [ ! -f "$HERE/GENERATE.sh" ]; then echo "regenerate: GENERATE.sh missing in $HERE -- refusing" >&2 exit 1 fi cd "$ORIGINAL_CWD" rm -rf "$HERE" "${{ORIGINAL_COMMAND[@]}}" fi TARBALL="$PARENT/$NAME.tar.gz" echo "Snapshotting $HERE -> $TARBALL ..." tar czf "$TARBALL" -C "$PARENT" "$NAME" echo "Snapshot complete: $TARBALL" """ def write_generate_sh(out_dir, argv=None, mhcflurry_version=None): """ Write a GENERATE.sh in ``out_dir`` recording how to reproduce the artifact directory and snapshot it as a tar.gz. Called by every artifact-producing CLI (train/select/calibrate) so each output directory ships a one-liner snapshot script. Parameters ---------- out_dir : str Directory to write GENERATE.sh into. Created by the caller. argv : list of str, optional Command-line invocation to record. Defaults to ``sys.argv``. mhcflurry_version : str, optional Version string for the audit comment. Defaults to current. Returns ------- str Absolute path to the GENERATE.sh that was written. """ if argv is None: argv = list(sys.argv) if mhcflurry_version is None: try: from mhcflurry.version import __version__ as mhcflurry_version except Exception: mhcflurry_version = "unknown" timestamp = datetime.datetime.now().isoformat(timespec="seconds") cmd_lines = " \\\n ".join(shlex.quote(a) for a in argv) cwd = shlex.quote(os.getcwd()) contents = _GENERATE_SH_TEMPLATE.format( version=mhcflurry_version, timestamp=timestamp, cwd=cwd, cmd=cmd_lines, ) out_dir = os.path.abspath(out_dir) os.makedirs(out_dir, exist_ok=True) path = os.path.join(out_dir, "GENERATE.sh") with open(path, "w") as f: f.write(contents) os.chmod(path, 0o755) return path mhcflurry-2.3.6/mhcflurry/compact_percent_rank_transform.py000066400000000000000000000311011525677230600244070ustar00rootroot00000000000000"""Compact percentile transforms for affinity, processing, and presentation. Approximate the background survival function in logit coordinates. Unlike a histogram lookup, interpolation retains within-interval order. Extreme-tail extrapolation is a modeling assumption, not an empirical percentile guarantee. """ import heapq import numpy as np def probability_logits(values): """Convert probabilities to finite logits, preserving NaNs. Exact zero/one scores use the nearest interior float64 values. This cannot recover distinctions already lost by rounding the underlying raw scores. """ values = np.asarray(values, dtype=np.float64) if np.any(np.isinf(values) | (values < 0) | (values > 1)): raise ValueError("Scores must be probabilities in [0, 1] or NaN") interior = np.clip(values, np.nextafter(0.0, 1.0), np.nextafter(1.0, 0.0)) return np.log(interior) - np.log1p(-interior) def select_monotonic_knots(x, y, budget): """Greedily compress a strictly monotonic curve to at most budget knots. The largest vertical interpolation error determines each next split. Endpoints are always retained; equal errors use the earliest source index. """ x, y = np.asarray(x, dtype=float), np.asarray(y, dtype=float) if (x.ndim != 1 or y.shape != x.shape or len(x) < 2 or not np.isfinite(x).all() or not np.isfinite(y).all() or np.any(np.diff(x) <= 0) or np.any(np.diff(y) >= 0)): raise ValueError("Expected finite increasing x and strictly decreasing y") if isinstance(budget, bool) or int(budget) != budget or budget < 2: raise ValueError("Knot budget must be an integer of at least two") selected, pending = {0, len(x) - 1}, [] def add_interval(left, right): if right - left <= 1: return local_x = x[left + 1:right] linear = y[left] + (y[right] - y[left]) * ( (local_x - x[left]) / (x[right] - x[left])) errors = np.abs(y[left + 1:right] - linear) offset = int(np.argmax(errors)) heapq.heappush(pending, (-float(errors[offset]), left + 1 + offset, left, right)) add_interval(0, len(x) - 1) while pending and len(selected) < budget: negative_error, middle, left, right = heapq.heappop(pending) if -negative_error <= 1e-12: break selected.add(middle) add_interval(left, middle) add_interval(middle, right) return np.array(sorted(selected), dtype=np.int64) class CompactPercentRankTransform: """Small, versioned monotonic approximation to background percentiles. The knots store transformed raw scores and logit midrank survival probabilities. Linear interpolation in those coordinates followed by a sigmoid gives upper-tail percentiles; the complementary sigmoid gives CDF percentiles. Duplicate reference scores are weighted by their mass. No evaluation labels are required or accepted. Parameters ---------- score_transform : {"logit", "log"} Use logit for probability-valued processing/presentation scores and log for positive quantities such as affinity IC50. This selects the input coordinate, not the output direction: pass ``survival=True`` to transform processing/presentation scores into lower-is-stronger ranks. Notes ----- Low-level ``fit`` uses a fixed budget (64 by default). Predictor calibration uses the shared validation selector to decide whether 128 is warranted. Tail extrapolation models, rather than establishes, rare frequencies. """ FORMAT = "compact-log-survival-linear-v1" def __init__(self, score_transform="logit"): if score_transform not in ("logit", "log"): raise ValueError("score_transform must be 'logit' or 'log'") self.score_transform = score_transform self.x = self.y = self.tail_slopes = self.reference_bounds = None self.reference_count = None self.selection = None def _coordinates(self, values): values = np.asarray(values, dtype=np.float64) if self.score_transform == "logit": return probability_logits(values) if np.any(np.isinf(values) | (values <= 0)): raise ValueError("Scores must be positive finite values or NaN") return np.log(values) def _set_curve(self, x, y, tail_slopes, reference_bounds, reference_count): self.x = np.asarray(x, dtype=np.float64) self.y = np.asarray(y, dtype=np.float64) self.tail_slopes = np.asarray(tail_slopes, dtype=np.float64) self.reference_bounds = np.asarray(reference_bounds, dtype=np.float64) if (isinstance(reference_count, bool) or int(reference_count) != reference_count or reference_count < 2): raise ValueError("Invalid reference observation count") self.reference_count = int(reference_count) if (self.x.ndim != 1 or self.y.shape != self.x.shape or len(self.x) < 2 or not np.isfinite(self.x).all() or not np.isfinite(self.y).all() or np.any(np.diff(self.x) <= 0) or np.any(np.diff(self.y) >= 0)): raise ValueError("Knots must be finite and strictly monotonic") if (self.tail_slopes.shape != (2,) or not np.isfinite(self.tail_slopes).all() or np.any(self.tail_slopes >= 0)): raise ValueError("Both extrapolation slopes must be finite and negative") if (self.reference_bounds.shape != (2,) or not np.isfinite(self.reference_bounds).all() or not self.reference_bounds[0] < self.reference_bounds[1] or self.reference_count < 2): raise ValueError("Invalid reference bounds or observation count") if not np.allclose(self._coordinates(self.reference_bounds), self.x[[0, -1]], rtol=0, atol=1e-12): raise ValueError("Reference bounds must match the endpoint knots") def fit(self, scores, num_knots=64): """Fit a curve with a fixed knot budget; return this instance. Parameters ---------- scores : one-dimensional sequence of float Finite, nonconstant background scores. Log coordinates require positive values; logit coordinates require values in [0, 1]. num_knots : int, default 64 Maximum knot count, including endpoints. This low-level method does not choose between budgets or use validation data. Returns ------- CompactPercentRankTransform This fitted instance. Fewer knots may suffice for small or linear reference curves. Any previous automatic-selection metadata is cleared. """ scores = np.asarray(scores, dtype=np.float64) if scores.ndim != 1 or len(scores) < 2 or not np.isfinite(scores).all(): raise ValueError("Reference scores must be a finite one-dimensional sample") self._coordinates(scores) # Validate before deduplication. unique, counts = np.unique(scores, return_counts=True) if len(unique) < 2: raise ValueError("Cannot calibrate a constant score distribution") x = self._coordinates(unique) # Endpoint clipping/log rounding can merge already adjacent floats. # Aggregate their reference mass rather than constructing zero-width knots. x, inverse = np.unique(x, return_inverse=True) counts = np.bincount(inverse, weights=counts) if len(x) < 2: raise ValueError("Cannot calibrate a constant score distribution") # Counts above this value plus half the mass at this exact value. survival = (len(scores) - np.cumsum(counts) + 0.5 * counts) / len(scores) y = probability_logits(survival) indices = select_monotonic_knots(x, y, num_knots) tail_size = min(32, len(x)) slopes = [] for rows in (slice(0, tail_size), slice(-tail_size, None)): local_x, local_y = x[rows], y[rows] centered_x, centered_y = local_x - local_x.mean(), local_y - local_y.mean() slopes.append(float(centered_x @ centered_y / (centered_x @ centered_x))) self._set_curve(x[indices], y[indices], slopes, unique[[0, -1]], len(scores)) self.selection = None return self def log_percentiles(self, scores, survival=False): """Return natural logs of percentiles on the 0--100 scale. Parameters ---------- scores : float or array-like Scores in the fitted coordinate's domain; NaNs propagate. survival : bool, default False False returns log CDF-percentile; True returns log upper-tail percentile directly. This is not the log of a 0--1 probability. Returns ------- numpy.ndarray or numpy scalar Log-percentiles, retaining tiny-tail information before ordinary percentile exponentiation underflows. Extrapolation is not an empirical guarantee of extreme-tail accuracy. """ if self.x is None: raise ValueError("Percentile transform has not been fitted") z = self._coordinates(scores) eta = np.interp(z, self.x, self.y) eta = np.where(z < self.x[0], self.y[0] + self.tail_slopes[0] * (z - self.x[0]), eta) eta = np.where(z > self.x[-1], self.y[-1] + self.tail_slopes[1] * (z - self.x[-1]), eta) if not survival: eta = -eta with np.errstate(invalid="ignore"): return np.log(100.0) - np.logaddexp(0.0, -eta) def transform(self, scores, survival=False): """Return CDF or upper-tail percentiles in [0, 100]. Parameters ---------- scores : float or array-like Raw scores in the fitted coordinate's domain. NaNs propagate; infinities and out-of-domain values raise ValueError. survival : bool, default False Use False for affinity IC50 (lower raw values get lower ranks). Use True for processing/presentation probabilities (higher raw values get lower ranks). The upper tail is evaluated directly, without subtracting a rounded CDF percentile from 100. Returns ------- numpy.ndarray or numpy scalar Percentiles. Float64 rounding and underflow can still create ties in extreme tails; use ``log_percentiles`` for tiny-tail analysis. """ return np.minimum(100.0, np.exp(self.log_percentiles(scores, survival=survival))) def to_dict(self): """Return a JSON-serializable, explicitly versioned representation.""" if self.x is None: raise ValueError("Percentile transform has not been fitted") return dict(format=self.FORMAT, score_transform=self.score_transform, x=self.x.tolist(), y=self.y.tolist(), tail_slopes=self.tail_slopes.tolist(), reference_bounds=self.reference_bounds.tolist(), reference_count=self.reference_count, selection=self.selection) @classmethod def from_dict(cls, values): """Load a curve, rejecting unsupported versions and invalid knots.""" if values.get("format") != cls.FORMAT: raise ValueError("Unsupported compact-percentile format") result = cls(score_transform=values["score_transform"]) result._set_curve(**{key: values[key] for key in ( "x", "y", "tail_slopes", "reference_bounds", "reference_count")}) result.selection = values.get("selection") return result class CompactPresentationPercentiles(CompactPercentRankTransform): """Compatibility adapter for the original presentation-only experiment. New callers should use CompactPercentRankTransform().fit(...) and pass survival=True explicitly. No separate fitting algorithm lives here. """ @classmethod def from_scores(cls, scores, num_knots=64): """Fit a new adapter instance. ``fit`` stays the base class's instance method, which refits the receiver in place; overriding it with a constructor would silently discard in-place refits such as the knot-budget selection. """ return cls().fit(scores, num_knots) def transform(self, scores, survival=True): return super().transform(scores, survival=survival) def log_percentiles(self, scores, survival=True): return super().log_percentiles(scores, survival=survival) @classmethod def from_dict(cls, values): if values.get("format") == "presentation-logit-survival-linear-v1": values = dict(values, format=cls.FORMAT, score_transform="logit") return super().from_dict(values) mhcflurry-2.3.6/mhcflurry/custom_loss.py000066400000000000000000000226021525677230600205130ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Custom loss functions. For losses supporting inequalities, each training data point is associated with one of (=), (<), or (>). For e.g. (>) inequalities, penalization is applied only if the prediction is less than the given value. This module now delegates to pytorch_losses.py for the actual loss implementations. """ import numpy # Import PyTorch implementations from .pytorch_losses import ( MSEWithInequalities as PyTorchMSEWithInequalities, MSEWithInequalitiesAndMultipleOutputs as PyTorchMSEWithInequalitiesAndMultipleOutputs, MultiallelicMassSpecLoss as PyTorchMultiallelicMassSpecLoss, StandardLoss as PyTorchStandardLoss, ) CUSTOM_LOSSES = {} def get_loss(name): """ Get a custom_loss.Loss instance by name. Parameters ---------- name : string Returns ------- custom_loss.Loss """ if name.startswith("custom:"): try: custom_loss = CUSTOM_LOSSES[name.replace("custom:", "")] except KeyError: raise ValueError( "No such custom loss: %s. Supported losses are: %s" % ( name, ", ".join([ "custom:" + loss_name for loss_name in CUSTOM_LOSSES ]))) return custom_loss return StandardKerasLoss(name) class Loss(object): """ Thin wrapper to keep track of neural network loss functions, which could be custom or baked into PyTorch. Each subclass or instance should define these properties/methods: - name : string - loss : callable This is the PyTorch loss function - encode_y : numpy.ndarray -> numpy.ndarray Transformation to apply to regression target before fitting """ def __init__(self, name=None): self.name = name if name else self.name # use name from class instance def __str__(self): return "" % self.name def loss(self, y_true, y_pred): raise NotImplementedError() def get_keras_loss(self, reduction="sum_over_batch_size"): """ Backward-compatible accessor from the TF/Keras backend era. Parameters ---------- reduction : string Ignored. Kept for API compatibility. """ del reduction # unused legacy argument return self.loss class StandardKerasLoss(Loss): """ A standard loss function such as MSE. """ supports_inequalities = False supports_multiple_outputs = False def __init__(self, loss_name="mse"): self._pytorch_loss = PyTorchStandardLoss(loss_name) self.loss = loss_name Loss.__init__(self, loss_name) @staticmethod def encode_y(y): return numpy.array(y, dtype=numpy.float32) class TransformPredictionsLossWrapper(Loss): """ Wrapper that applies an arbitrary transform to y_pred before calling an underlying loss function. The y_pred_transform function should be a tensor -> tensor function. """ def __init__( self, loss, y_pred_transform=None): self.wrapped_loss = loss self.name = "transformed_%s" % loss.name self.y_pred_transform = y_pred_transform self.supports_inequalities = loss.supports_inequalities self.supports_multiple_outputs = loss.supports_multiple_outputs def encode_y(self, *args, **kwargs): return self.wrapped_loss.encode_y(*args, **kwargs) def loss(self, y_true, y_pred): y_pred_transformed = self.y_pred_transform(y_pred) return self.wrapped_loss.loss(y_true, y_pred_transformed) class MSEWithInequalities(Loss): """ Supports training a regression model on data that includes inequalities (e.g. x < 100). Mean square error is used as the loss for elements with an (=) inequality. For elements with e.g. a (> 0.5) inequality, then the loss for that element is (y - 0.5)^2 (standard MSE) if y < 0.5 and 0 otherwise. This loss assumes that the normal range for y_true and y_pred is 0 - 1. As a hack, the implementation uses other intervals for y_true to encode the inequality information. y_true is interpreted as follows: between 0 - 1 Regular MSE loss is used. Penalty (y_pred - y_true)**2 is applied if y_pred is greater or less than y_true. between 2 - 3: Treated as a ">" inequality. Penalty (y_pred - (y_true - 2))**2 is applied only if y_pred is less than y_true - 2. between 4 - 5: Treated as a "<" inequality. Penalty (y_pred - (y_true - 4))**2 is applied only if y_pred is greater than y_true - 4. """ name = "mse_with_inequalities" supports_inequalities = True supports_multiple_outputs = False def __init__(self): self._pytorch_loss = PyTorchMSEWithInequalities() @staticmethod def encode_y(y, inequalities=None): return PyTorchMSEWithInequalities.encode_y(y, inequalities) @staticmethod def _max_value(values): if hasattr(values, "detach"): return float(values.detach().max().item()) return float(numpy.asarray(values).max()) def loss(self, y_true, y_pred): # Support both historical Keras-style (y_true, y_pred) and current # PyTorch-style (y_pred, y_true) calling conventions. if self._max_value(y_true) <= 1.5 and self._max_value(y_pred) > 1.5: y_true, y_pred = y_pred, y_true return self._pytorch_loss(y_pred, y_true) class MSEWithInequalitiesAndMultipleOutputs(Loss): """ Loss supporting inequalities and multiple outputs. This loss assumes that the normal range for y_true and y_pred is 0 - 1. As a hack, the implementation uses other intervals for y_true to encode the inequality and output-index information. Inequalities are encoded into the regression target as in the MSEWithInequalities loss. Multiple outputs are encoded by mapping each regression target x (after transforming for inequalities) using the rule x -> x + i * 10 where i is the output index. The reason for explicitly encoding multiple outputs this way (rather than just making the regression target a matrix instead of a vector) is that in our use cases we frequently have missing data in the regression target. This encoding gives a simple way to penalize only on (data point, output index) pairs that have labels. """ name = "mse_with_inequalities_and_multiple_outputs" supports_inequalities = True supports_multiple_outputs = True def __init__(self): self._pytorch_loss = PyTorchMSEWithInequalitiesAndMultipleOutputs() @staticmethod def encode_y(y, inequalities=None, output_indices=None): return PyTorchMSEWithInequalitiesAndMultipleOutputs.encode_y( y, inequalities, output_indices ) def loss(self, y_true, y_pred): # Support both historical Keras-style (y_true, y_pred) and current # PyTorch-style (y_pred, y_true) calling conventions. if ( getattr(y_true, "ndim", None) == 2 and getattr(y_pred, "ndim", None) == 2 and y_true.shape[1] > 1 and y_pred.shape[1] == 1): y_true, y_pred = y_pred, y_true else: max_true = MSEWithInequalities._max_value(y_true) max_pred = MSEWithInequalities._max_value(y_pred) if max_true <= 1.5 and max_pred > 1.5: y_true, y_pred = y_pred, y_true return self._pytorch_loss(y_pred, y_true) class MultiallelicMassSpecLoss(Loss): """ Multiallelic mass spec loss function. """ name = "multiallelic_mass_spec_loss" supports_inequalities = True supports_multiple_outputs = False def __init__(self, delta=0.2, multiplier=1.0): self.delta = delta self.multiplier = multiplier self._pytorch_loss = PyTorchMultiallelicMassSpecLoss(delta, multiplier) @staticmethod def encode_y(y): return PyTorchMultiallelicMassSpecLoss.encode_y(y) def loss(self, y_true, y_pred): # Support both historical Keras-style (y_true, y_pred) and current # PyTorch-style (y_pred, y_true) calling conventions. if getattr(y_true, "ndim", None) == 2 and y_true.shape[1] > 1: y_true, y_pred = y_pred, y_true return self._pytorch_loss(y_pred, y_true) def check_shape(name, arr, expected_shape): """ Raise ValueError if arr.shape != expected_shape. Parameters ---------- name : string Included in error message to aid debugging arr : numpy.ndarray expected_shape : tuple of int """ if arr.shape != expected_shape: raise ValueError("Expected %s to have shape %s not %s" % ( name, str(expected_shape), str(arr.shape))) # Register custom losses. for cls in [ MSEWithInequalities, MSEWithInequalitiesAndMultipleOutputs, MultiallelicMassSpecLoss]: CUSTOM_LOSSES[cls.name] = cls() mhcflurry-2.3.6/mhcflurry/data_dependent_weights_initialization.py000066400000000000000000000226531525677230600257470ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Layer-sequential unit-variance initialization for neural networks. See: Mishkin and Matas, "All you need is a good init". 2016. https://arxiv.org/abs/1511.06422 """ # # LSUV initialization code in this file is adapted from: # https://github.com/ducha-aiki/LSUV-keras/blob/master/lsuv_init.py # by Dmytro Mishkin # # Here is the license for the original code: # # # Copyright (C) 2017, Dmytro Mishkin # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import numpy import torch import torch.nn as nn def svd_orthonormal(shape): """ Generate an orthonormal matrix using SVD. Parameters ---------- shape : tuple Shape of the weight matrix (must have at least 2 dimensions) Returns ------- numpy.ndarray Orthonormal matrix of the given shape """ # Orthonormal init code is from Lasagne # https://github.com/Lasagne/Lasagne/blob/master/lasagne/init.py if len(shape) < 2: raise RuntimeError("Only shapes of length 2 or more are supported.") flat_shape = (shape[0], numpy.prod(shape[1:])) a = numpy.random.standard_normal(flat_shape).astype("float32") u, _, v = numpy.linalg.svd(a, full_matrices=False) q = u if u.shape == flat_shape else v q = q.reshape(shape) return q def get_activations_pytorch( model, layer_name, x_dict, device=None, target="post_activation", ): """ Get activations from a specific layer in a PyTorch model. Parameters ---------- model : nn.Module PyTorch model layer_name : str Name of the layer to get activations from x_dict : dict Input dictionary with tensors device : torch.device, optional Device to run on target : {"post_activation", "pre_activation"} Which affine-layer output to return. Historical Keras LSUV used the post-activation Dense output. Returns ------- numpy.ndarray Activations from the specified layer """ if target not in ("post_activation", "pre_activation"): raise ValueError( "target must be 'post_activation' or 'pre_activation'; got %r" % target ) if device is None: device = next(model.parameters()).device activations = {} def hook_fn(module, input, output): activation_output = getattr(model, "activation_output_for_layer", None) if target == "post_activation" and activation_output is not None: output = activation_output(module, output) activations["output"] = output.detach().cpu().numpy() # Find the layer by name target_layer = None for name, module in model.named_modules(): if name == layer_name: target_layer = module break if target_layer is None: raise ValueError(f"Layer '{layer_name}' not found in model") # Register hook handle = target_layer.register_forward_hook(hook_fn) # Forward pass model.eval() with torch.no_grad(): # Convert inputs to tensors inputs = {} for key, value in x_dict.items(): if isinstance(value, numpy.ndarray): if not value.flags.writeable: value = value.copy() inputs[key] = torch.from_numpy(value).to(device) else: inputs[key] = value.to(device) # Run forward pass _ = model(inputs) # Remove hook handle.remove() return activations['output'] def get_activations(model, layer, X_batch): """ Backward-compatible activation helper from the TF backend era. Parameters ---------- model : nn.Module layer : str or object with ``name`` attribute X_batch : dict Network input dictionary. """ layer_name = layer if isinstance(layer, str) else getattr(layer, "name", None) if layer_name is None: raise ValueError("Layer must be a layer name or an object with a name attribute.") if not isinstance(X_batch, dict): raise ValueError("X_batch must be a dict of model inputs.") return get_activations_pytorch(model, layer_name, X_batch) def lsuv_init( model, batch, verbose=True, margin=0.1, max_iter=100, target="post_activation", ): """ Initialize neural network weights using layer-sequential unit-variance initialization. See: Mishkin and Matas, "All you need is a good init". 2016. https://arxiv.org/abs/1511.06422 Parameters ---------- model : nn.Module PyTorch model batch : dict Training data batch (dict of numpy arrays or tensors) verbose : boolean Whether to print progress to stdout margin : float Acceptable variance margin max_iter : int Maximum iterations per layer target : {"post_activation", "pre_activation"} Activation boundary whose variance LSUV normalizes. Returns ------- nn.Module Same model, modified in-place """ needed_variance = 1.0 layers_initialized = 0 device = next(model.parameters()).device # Get list of layers to initialize (Dense/Linear and Conv layers) layers_to_init = [] for name, module in model.named_modules(): if isinstance(module, (nn.Linear, nn.Conv1d, nn.Conv2d)): layers_to_init.append((name, module)) for layer_name, layer in layers_to_init: # Get output shape try: activations = get_activations_pytorch( model, layer_name, batch, device, target=target, ) output_size = numpy.prod(activations.shape[1:]) except Exception as e: if verbose: print(f'LSUV initialization skipping {layer_name}: {e}') continue # Skip small layers if output_size < 32: if verbose: print(f'LSUV initialization skipping {layer_name} (output size {output_size} < 32)') continue layers_initialized += 1 # Apply orthonormal initialization to weights with torch.no_grad(): weight = layer.weight.data.cpu().numpy() ortho_weight = svd_orthonormal(weight.shape) layer.weight.data = torch.from_numpy(ortho_weight).to(device) # Get activations and compute variance activations = get_activations_pytorch( model, layer_name, batch, device, target=target, ) variance = numpy.var(activations) iteration = 0 if verbose: print(layer_name, variance) while abs(needed_variance - variance) > margin: if verbose: print( 'LSUV initialization', layer_name, iteration, needed_variance, margin, variance) if numpy.abs(numpy.sqrt(variance)) < 1e-7: break # avoid zero division # Scale weights to achieve unit variance with torch.no_grad(): scale_factor = numpy.sqrt(needed_variance) / numpy.sqrt(variance) layer.weight.data *= scale_factor # Recompute activations and variance activations = get_activations_pytorch( model, layer_name, batch, device, target=target, ) variance = numpy.var(activations) iteration += 1 if iteration >= max_iter: break if verbose: print('Done with LSUV: total layers initialized', layers_initialized) return model mhcflurry-2.3.6/mhcflurry/device_footprint.py000066400000000000000000000274761525677230600215220ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Measurement-driven per-worker GPU memory estimates. The orchestrator decides how many workers to pack on each GPU from a per-worker VRAM estimate (``device_worker_gb``). Historically that was a static constant in the workload profile (e.g. 24 GB for calibration, 4 GB for training) — a value hand-tuned for one production config that is wrong for jobs / networks of other sizes. This module estimates it instead, from the model architecture (read from ``manifest.csv`` — no weights) and the job size, so the worker count adapts. Every estimator returns ``None`` whenever it can't read the model or lacks the job size, so the planner falls back to the static profile default. Estimates are deliberately conservative (a safety multiplier + a floor) so we never pack more aggressively than the validated baseline. The per-row resident formulas track the genuinely-varying terms: full dataset / peptide-universe row count, the peptide encoding dims (``max_length`` x feature width, which differ by ``vector_encoding_name`` — BLOSUM62=21, physchem/atchley/composite encodings differ), network width, ensemble size, and batch size. """ import json from os.path import join, exists import pandas _GIB = 1024.0 ** 3 _FLOAT32_BYTES = 4 # ---- Affinity calibration (cached peptide-stage tensor) -------------------- # Fallback peptide-stage width used only when manifest.csv is unreadable so # the true width can't be derived. Deliberately pessimistic: 1024 is ~2.5x the # observed real stage_dim (~400 implied by the ~12 GB anchor below), and # over-estimating VRAM is safe -- it only lowers max_workers_per_gpu, never # oversubscribes the card. _CALIBRATION_DEFAULT_STAGE_DIM = 1024 _CALIBRATION_OVERHEAD_GB = 3.0 # model weights + activation headroom _CALIBRATION_MIN_DEVICE_WORKER_GB = 4.0 # don't over-pack from a tiny estimate # A merged ensemble without explicit peptide-dense layers expands the raw # peptide vector into a wider fast-path representation than the manifest alone # exposes. The rc14 GCP calibration run measured a 9450-wide stage for a # 10-network BLOSUM62 ensemble (3x the naive 10 * 15 * 21 estimate). _CALIBRATION_MERGED_STAGE_FACTOR = 3.0 # ---- Affinity training ----------------------------------------------------- # Peptides are stored device-resident as compact (N, L) int8 indices # (``peptide_amino_acid_encoding_torch``, default True) and embedded to float32 # vectors per-batch via a frozen table. So the resident dataset is tiny; the # footprint is dominated by a fixed base + per-batch activations, NOT by dataset # size. The dataset term only matters at extreme row counts. # # Fixed per-worker cost that does NOT scale with the dataset or batch: CUDA # context, torch.compile inductor workspace, model weights + Adam optimizer # state, the embedding table. Calibrated so the release config lands in the # measured ~2 GB band (resident + activation terms are negligible there). _TRAINING_BASE_GB = 1.8 # Per resident row beyond the peptide: allele index + target + sample weight. _TRAINING_PER_ROW_SCALAR_BYTES = 12 # The device fit materializes real rows AND a random-negative slice in one # combined buffer (~2x rows). Conservative. _TRAINING_RANDOM_NEGATIVE_FACTOR = 2.0 # Forward activations + gradients + backward working set, as a multiple of the # single-forward minibatch activation bytes. _TRAINING_ACTIVATION_BACKWARD_FACTOR = 3.0 _PEPTIDE_INDEX_BYTES = 1 # int8 per position (peptides are always index-encoded) _TRAINING_DEFAULT_MINIBATCH = 128 _TRAINING_DEFAULT_MERGE_WIDTH = 1024 # when layer widths can't be derived # Applied to the whole estimate; keeps margin over the measured peak. _TRAINING_SAFETY_MARGIN = 1.3 # Never below the measured steady-state; prevents over-packing vs the baseline. _TRAINING_MIN_DEVICE_WORKER_GB = 2.5 def _peptide_vector_encoding_width(name): """Per-amino-acid feature width of a vector encoding, or None if unknown.""" if not name: return None try: from .amino_acid import get_vector_encoding_df return int(get_vector_encoding_df(name).shape[1]) except Exception: return None def _read_manifest(models_dir): """Return ``(num_networks, first_hyperparameters)`` from ``manifest.csv``. Reads only the manifest (no weights). Returns ``None`` if it can't be read. """ manifest_path = join(models_dir, "manifest.csv") if not exists(manifest_path): return None try: manifest = pandas.read_csv(manifest_path) except Exception: return None if len(manifest) == 0: return None try: hyperparameters = json.loads( manifest.iloc[0]["config_json"]).get("hyperparameters", {}) except Exception: hyperparameters = {} return max(len(manifest), 1), hyperparameters def _peptide_stage_dim(hyperparameters): """Peptide-side activation width: the last peptide dense layer if set, else the flattened peptide vector encoding (max_length x feature width).""" dense = hyperparameters.get("peptide_dense_layer_sizes") or [] if dense: return int(dense[-1]) encoding = hyperparameters.get("peptide_encoding", {}) max_length = int(encoding.get("max_length", 0) or 0) width = _peptide_vector_encoding_width(encoding.get("vector_encoding_name")) if max_length and width: return max_length * width return None def _peptide_embedded_row_bytes(hyperparameters): """Bytes for one peptide's embedded ``(L, V) float32`` representation (the per-batch activation; peptides are stored resident as int8 indices and embedded on the fly), or None.""" encoding = hyperparameters.get("peptide_encoding", {}) max_length = int(encoding.get("max_length", 0) or 0) width = _peptide_vector_encoding_width(encoding.get("vector_encoding_name")) if max_length and width: return max_length * width * _FLOAT32_BYTES return None def _peptide_resident_row_bytes(hyperparameters): """Bytes for one peptide's device-resident encoding, or None. Peptides are always index-encoded: ``L`` int8 bytes (one per position). """ encoding = hyperparameters.get("peptide_encoding", {}) max_length = int(encoding.get("max_length", 0) or 0) if not max_length: return None return max_length * _PEPTIDE_INDEX_BYTES def _merge_width(hyperparameters): """Rough peak hidden-layer width for the activation estimate.""" candidates = [] for key in ("layer_sizes", "peptide_dense_layer_sizes", "allele_dense_layer_sizes"): candidates.extend(int(x) for x in (hyperparameters.get(key) or [])) stage = _peptide_stage_dim(hyperparameters) if stage: candidates.append(int(stage)) return max(candidates) if candidates else _TRAINING_DEFAULT_MERGE_WIDTH def estimate_affinity_calibration_device_worker_gb(models_dir, prediction_rows): """Per-worker VRAM (GB) for affinity percentile-rank calibration, or None. Dominant consumer: the cached peptide-stage tensor (peptide-side activations precomputed for the whole peptide universe and reused across allele batches), ``~ num_networks x stage_dim x num_peptides x 4``. """ if not prediction_rows: return None manifest = _read_manifest(models_dir) if manifest is None: return None num_networks, hyperparameters = manifest stage_dim = ( _peptide_stage_dim(hyperparameters) or _CALIBRATION_DEFAULT_STAGE_DIM ) if not (hyperparameters.get("peptide_dense_layer_sizes") or []): stage_dim *= _CALIBRATION_MERGED_STAGE_FACTOR cache_gb = ( num_networks * int(stage_dim) * int(prediction_rows) * _FLOAT32_BYTES / _GIB ) return max( _CALIBRATION_MIN_DEVICE_WORKER_GB, _CALIBRATION_OVERHEAD_GB + cache_gb) def estimate_affinity_training_device_worker_gb( hyperparameters, num_rows, minibatch_size=None): """Per-worker VRAM (GB) for device-resident affinity training, or None. Takes the ``hyperparameters`` dict directly (the model doesn't exist yet at training time — it's read from the hyperparameters YAML the command loaded). Peptides are stored device-resident as compact ``(N, L)`` int8 indices (default) and embedded per-batch, so unlike calibration the footprint is NOT dominated by the dataset — it is dominated by a fixed base plus per-batch activations. The terms: * resident dataset: ``rn_factor x rows x (peptide_index_bytes + scalars)`` — tiny at normal scale (int8), only material at extreme row counts. * per-batch activations: ``minibatch x (embedded_peptide + merge_width) x 4 x backward_factor`` — the live batch's float32 embedded vectors and hidden activations. This is what scales with batch size / network width. * a fixed base (CUDA context + compile workspace + weights + optimizer + embedding table) that does not scale with either. Forward-only validation is intentionally absent: its batch is selected at runtime from the same live per-worker budget as inference, after the fixed tensors represented here have been allocated. A safety multiplier and a floor keep it conservative. """ if not num_rows or hyperparameters is None: return None resident_row_bytes = _peptide_resident_row_bytes(hyperparameters) embedded_row_bytes = _peptide_embedded_row_bytes(hyperparameters) if resident_row_bytes is None or embedded_row_bytes is None: # Unknown encoding: the base dominates anyway, so use the floor rather # than a bogus estimate. return _TRAINING_MIN_DEVICE_WORKER_GB minibatch = int(minibatch_size or hyperparameters.get("minibatch_size") or _TRAINING_DEFAULT_MINIBATCH) merge_width = _merge_width(hyperparameters) resident_gb = ( _TRAINING_RANDOM_NEGATIVE_FACTOR * int(num_rows) * (resident_row_bytes + _TRAINING_PER_ROW_SCALAR_BYTES) / _GIB ) activation_gb = ( minibatch * (embedded_row_bytes + merge_width * _FLOAT32_BYTES) * _TRAINING_ACTIVATION_BACKWARD_FACTOR / _GIB ) footprint = ( (_TRAINING_BASE_GB + resident_gb + activation_gb) * _TRAINING_SAFETY_MARGIN ) return max(_TRAINING_MIN_DEVICE_WORKER_GB, footprint) def estimate_device_worker_gb(workload_name, hints, models_dir=None): """Unified per-worker VRAM (GB) estimate, or None to use the profile default. Dispatches per workload. ``hints`` is a dict that may carry: * calibration: ``prediction_rows`` (+ ``models_dir`` for the trained model). * training: ``training_rows``, ``hyperparameters`` (the model isn't trained yet, so the architecture comes from the hyperparameters dict), ``minibatch_size``. """ hints = hints or {} # Imported lazily to avoid a circular import at module load. from .workload_planning import ( WORKLOAD_AFFINITY_CALIBRATION, WORKLOAD_AFFINITY_TRAINING, ) if workload_name == WORKLOAD_AFFINITY_CALIBRATION: if models_dir is None: return None return estimate_affinity_calibration_device_worker_gb( models_dir, hints.get("prediction_rows")) if workload_name == WORKLOAD_AFFINITY_TRAINING: return estimate_affinity_training_device_worker_gb( hints.get("hyperparameters"), hints.get("training_rows"), minibatch_size=hints.get("minibatch_size")) return None mhcflurry-2.3.6/mhcflurry/downloads.py000066400000000000000000000314361525677230600201400ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Manage local downloaded data. """ import logging import yaml from os.path import join, exists, dirname, abspath from os import environ from shlex import quote from importlib.resources import files from collections import OrderedDict from appdirs import user_data_dir import csv ENVIRONMENT_VARIABLES = [ "MHCFLURRY_DATA_DIR", "MHCFLURRY_DOWNLOADS_CURRENT_RELEASE", "MHCFLURRY_DOWNLOADS_DIR", "MHCFLURRY_DEFAULT_CLASS1_MODELS", "MHCFLURRY_DEFAULT_CLASS1_PRESENTATION_MODELS_DIR", "MHCFLURRY_DEFAULT_CLASS1_PROCESSING_MODELS_DIR", ] _DOWNLOADS_DIR = None _CURRENT_RELEASE = None _METADATA = None _MHCFLURRY_DEFAULT_CLASS1_MODELS_DIR = environ.get( "MHCFLURRY_DEFAULT_CLASS1_MODELS") _MHCFLURRY_DEFAULT_CLASS1_PRESENTATION_MODELS_DIR = environ.get( "MHCFLURRY_DEFAULT_CLASS1_PRESENTATION_MODELS_DIR") _MHCFLURRY_DEFAULT_CLASS1_PROCESSING_MODELS_DIR = environ.get( "MHCFLURRY_DEFAULT_CLASS1_PROCESSING_MODELS_DIR") def get_downloads_dir(release=None): """ Return the download directory for a release, respecting custom overrides. """ if release is None or _CURRENT_RELEASE is None: return _DOWNLOADS_DIR return join(dirname(_DOWNLOADS_DIR), release) def get_current_release(): """ Return the current downloaded data release """ return _CURRENT_RELEASE def get_downloads_metadata(): """ Return the contents of downloads.yml as a dict """ global _METADATA if _METADATA is None: _METADATA = yaml.safe_load( files("mhcflurry").joinpath("downloads.yml").read_text() ) return _METADATA def resolve_release(release=None): """Validate a catalogue identifier, defaulting to the configured release.""" metadata = get_downloads_metadata() release = release or get_current_release() or metadata['current-release'] if release not in metadata['releases']: raise ValueError( "Unknown download release %r. Run 'mhcflurry downloads releases' " "for valid identifiers (these are separate from package versions)." % release) return release def get_download_urls(metadata): """Return ordered archive URLs, including every part of split downloads.""" return [metadata['url']] if 'url' in metadata else metadata['part_urls'] def get_bundle_description(name): """Return the purpose and category of a named download.""" try: return get_downloads_metadata()['bundles'][name] except KeyError: raise ValueError( "Unknown download %r. Run 'mhcflurry downloads list'." % name) from None def get_bundle_versions(name): """Group catalogue entries for one bundle by identical archive URLs. URL equality identifies shared sources, not verified content equality. """ get_bundle_description(name) versions = OrderedDict() for release, info in get_downloads_metadata()['releases'].items(): for download in info['downloads']: if download['name'] == name: urls = tuple(get_download_urls(download)) versions.setdefault(urls, []).append(release) return [dict(releases=releases, urls=list(urls)) for urls, releases in versions.items()] def get_model_release_dir(release): """Resolve explicitly selected presentation weights without model imports. Explicit selection overrides default-model environment variables. Custom, unversioned download roots must record matching source URLs so a release selector cannot silently load a different set of weights. """ release = resolve_release(release) metadata = get_downloads_metadata() if (metadata['releases'][release]['compatibility-version'] != metadata['current-compatibility-version']): raise ValueError("Download release %s uses an incompatible model format." % release) name = 'models_class1_presentation' available = get_release_downloads(release) if name not in available: raise ValueError( "Release %s has no presentation bundle. Run 'mhcflurry downloads " "releases models_class1_presentation'. For other predictors, use --models DIR." % release) info = available[name] path = get_path(name, 'models', release=release) if info['up_to_date'] is False or ( get_current_release() is None and info['up_to_date'] is not True): raise ValueError( "Cannot confirm that %s contains release %s: recorded source URLs " "are missing or different. Use a versioned MHCFLURRY_DATA_DIR, " "or select your local weights explicitly with --models DIR." % (quote(path), release)) return abspath(path) def get_default_class1_models_dir(test_exists=True): """ Return the absolute path to the default class1 models dir. If environment variable MHCFLURRY_DEFAULT_CLASS1_MODELS is set to an absolute path, return that path. If it's set to a relative path (i.e. does not start with /) then return that path taken to be relative to the mhcflurry downloads dir. If environment variable MHCFLURRY_DEFAULT_CLASS1_MODELS is NOT set, then return the pan-allele affinity path in the "models_class1_pan" download. Parameters ---------- test_exists : boolean, optional Whether to raise an exception if the path does not exist Returns ------- string : absolute path """ if _MHCFLURRY_DEFAULT_CLASS1_MODELS_DIR: result = join(get_downloads_dir(), _MHCFLURRY_DEFAULT_CLASS1_MODELS_DIR) if test_exists and not exists(result): raise IOError("No such directory: %s" % result) return result return get_path( "models_class1_pan", "models.combined", test_exists=test_exists) def get_default_class1_presentation_models_dir(test_exists=True): """ Return the absolute path to the default class1 presentation models dir. See `get_default_class1_models_dir`. If environment variable MHCFLURRY_DEFAULT_CLASS1_PRESENTATION_MODELS_DIR is set to an absolute path, return that path. If it's set to a relative path (does not start with /) then return that path taken to be relative to the mhcflurry downloads dir. Parameters ---------- test_exists : boolean, optional Whether to raise an exception if the path does not exist Returns ------- string : absolute path """ if _MHCFLURRY_DEFAULT_CLASS1_PRESENTATION_MODELS_DIR: result = join( get_downloads_dir(), _MHCFLURRY_DEFAULT_CLASS1_PRESENTATION_MODELS_DIR) if test_exists and not exists(result): raise IOError("No such directory: %s" % result) return result return get_path( "models_class1_presentation", "models", test_exists=test_exists) def get_default_class1_processing_models_dir(test_exists=True): """ Return the absolute path to the default class1 processing models dir. See `get_default_class1_models_dir`. If environment variable MHCFLURRY_DEFAULT_CLASS1_PROCESSING_MODELS_DIR is set to an absolute path, return that path. If it's set to a relative path (does not start with /) then return that path taken to be relative to the mhcflurry downloads dir. Parameters ---------- test_exists : boolean, optional Whether to raise an exception if the path does not exist Returns ------- string : absolute path """ if _MHCFLURRY_DEFAULT_CLASS1_PROCESSING_MODELS_DIR: result = join( get_downloads_dir(), _MHCFLURRY_DEFAULT_CLASS1_PROCESSING_MODELS_DIR) if test_exists and not exists(result): raise IOError("No such directory: %s" % result) return result # Default to the 'with flanks' model variant. return get_path( "models_class1_processing", "models.selected.with_flanks", test_exists=test_exists) def get_release_downloads(release): """ Return a dict of all available downloads in a release. Parameters ---------- release : string Release whose download metadata to return. Returns ------- collections.OrderedDict Download names mapped to dictionaries with three entries: ``downloaded`` (bool), whether the local directory exists; ``metadata`` (dict), catalogue metadata such as URLs; and ``up_to_date`` (bool or None), whether the recorded download URLs match the catalogue, or None when unknown. This does not verify the integrity of installed files. """ downloads = ( get_downloads_metadata() ['releases'] [resolve_release(release)] ['downloads']) def up_to_date(dir, urls): try: with open(join(dir, "DOWNLOAD_INFO.csv"), newline="") as fd: reader = csv.DictReader(fd) if not reader.fieldnames or "url" not in reader.fieldnames: return None return [row["url"] for row in reader] == list(urls) except (OSError, csv.Error, UnicodeError): return None return OrderedDict( (download["name"], { 'downloaded': exists(join(get_downloads_dir(release), download["name"])), 'up_to_date': up_to_date( join(get_downloads_dir(release), download["name"]), get_download_urls(download)), 'metadata': download, }) for download in downloads ) def get_current_release_downloads(): """Return a dict of all available downloads in the current release.""" return get_release_downloads(get_current_release()) def get_path(download_name, filename='', test_exists=True, release=None): """ Get the local path to a file in a MHCflurry download Parameters ---------- download_name : string filename : string Relative path within the download to the file of interest test_exists : boolean If True (default) throw an error telling the user how to download the data if the file does not exist release : string, optional Requested release; defaults to the configured current release. Returns ------- string giving local absolute path """ assert '/' not in download_name, "Invalid download: %s" % download_name path = join(get_downloads_dir(release), download_name, filename) if test_exists and not exists(path): raise RuntimeError( "Missing MHCflurry downloadable file: %s. " "To download this data, run:\n\tmhcflurry downloads fetch %s%s\n" "in a shell." % (quote(path), download_name, " --release " + quote(release) if release else "")) return path def configure(): """ Setup various global variables based on environment variables. """ global _DOWNLOADS_DIR global _CURRENT_RELEASE _CURRENT_RELEASE = None _DOWNLOADS_DIR = environ.get("MHCFLURRY_DOWNLOADS_DIR") if not _DOWNLOADS_DIR: metadata = get_downloads_metadata() _CURRENT_RELEASE = environ.get("MHCFLURRY_DOWNLOADS_CURRENT_RELEASE") if not _CURRENT_RELEASE: _CURRENT_RELEASE = metadata['current-release'] current_release_compatability = ( metadata["releases"].get(_CURRENT_RELEASE, {}).get("compatibility-version")) current_compatability = metadata["current-compatibility-version"] if (current_release_compatability is not None and current_release_compatability != current_compatability): logging.warning( "The specified downloads are not compatible with this version " "of the MHCflurry codebase. Downloads: release %s, " "compatability version: %d. Code compatability version: %d", _CURRENT_RELEASE, current_release_compatability, current_compatability) data_dir = environ.get("MHCFLURRY_DATA_DIR") if not data_dir: # increase the version every time we make a breaking change in # how the data is organized. For changes to e.g. just model # serialization, the downloads release numbers should be used. data_dir = user_data_dir("mhcflurry", version="4") _DOWNLOADS_DIR = join(data_dir, _CURRENT_RELEASE) logging.debug("Configured MHCFLURRY_DOWNLOADS_DIR: %s", _DOWNLOADS_DIR) configure() mhcflurry-2.3.6/mhcflurry/downloads.yml000066400000000000000000001474261525677230600203200ustar00rootroot00000000000000# This file describes collections of data and trained model weights that are # released with MHCflurry. We refer to these datasets as "downloads." # # Downloads are organized into "releases", which generally correspond with # MHCflurry releases of the same version. # # When users run "mhcflurry-downloads fetch" without specifying any downloads # by name, the downloads with "default=true" are downloaded. # This should usually be the latest release. current-release: 2.3.0 # An integer indicating what models the current MHCflurry code base is compatible # with. Increment this integer when changes are made to MHCflurry that would break # the use of previously released models. current-compatibility-version: 2 # Add new releases here as they are made. releases: 2.3.0: compatibility-version: 2 downloads: - name: models_class1_pan url: https://github.com/openvax/mhcflurry/releases/download/2.3.0/models_class1_pan.selected.20260928.tar.bz2 default: false - name: models_class1_presentation url: https://github.com/openvax/mhcflurry/releases/download/2.3.0/models_class1_presentation.20260928.tar.bz2 default: true - name: models_class1_processing url: https://github.com/openvax/mhcflurry/releases/download/2.3.0/models_class1_processing.selected.20260928.tar.bz2 default: false - name: models_class1_pan_unselected url: https://github.com/openvax/mhcflurry/releases/download/pre-2.0/models_class1_pan.20200610.tar.bz2 default: false - name: models_class1_pan_variants url: https://github.com/openvax/mhcflurry/releases/download/pre-2.0/models_class1_pan_variants.selected.20200610.tar.bz2 default: false - name: data_evaluation part_urls: - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_evaluation.20200611.tar.bz2.part.aa - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_evaluation.20200611.tar.bz2.part.ab - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_evaluation.20200611.tar.bz2.part.ac default: false - name: analysis_predictor_info url: https://github.com/openvax/mhcflurry/releases/download/pre-2.0/analysis_predictor_info.20200711.tar.bz2 default: false - name: data_predictions part_urls: - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.aa - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ab - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ac - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ad - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ae - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.af - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ag - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ah - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ai - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.aj - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ak - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.al default: false - name: data_mass_spec_annotated url: https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_annotated.20191226.tar.bz2 default: false - name: data_references url: https://github.com/openvax/mhcflurry/releases/download/pre-1.4.0/data_references.20190927.tar.bz2 default: false - name: data_iedb url: https://github.com/openvax/mhcflurry/releases/download/pre-2.1/data_iedb.20231019.tar.bz2 default: false - name: data_systemhcatlas url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/data_systemhcatlas.20190506.tar.bz2 default: false - name: allele_sequences url: https://github.com/openvax/mhcflurry/releases/download/pre-2.1/allele_sequences.20231025.tar.bz2 default: false - name: random_peptide_predictions url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/random_peptide_predictions.20190506.tar.bz2 default: false - name: data_published url: https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_published.20200501.tar.bz2 default: false - name: data_curated url: https://github.com/openvax/mhcflurry/releases/download/pre-2.1/data_curated.20231023.tar.bz2 default: true # Older downloads - name: models_class1 url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1.20180225.tar.bz2 default: true - name: models_class1_selected_no_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_selected_no_mass_spec.20180225.tar.bz2 default: false - name: models_class1_unselected url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_unselected.20180221.tar.bz2 default: false - name: models_class1_trained_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_trained_with_mass_spec.20180228.tar.bz2 default: false - name: models_class1_unselected_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_unselected_with_mass_spec.20180227.tar.bz2 default: false - name: models_class1_minimal url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_minimal.20180226.tar.bz2 default: false 2.2.0: compatibility-version: 2 downloads: - name: models_class1_pan url: https://github.com/openvax/mhcflurry/releases/download/pre-2.0/models_class1_pan.selected.20200610.tar.bz2 default: false - name: models_class1_presentation url: https://github.com/openvax/mhcflurry/releases/download/pre-2.0/models_class1_presentation.20200611.tar.bz2 default: true - name: models_class1_processing url: https://github.com/openvax/mhcflurry/releases/download/pre-2.0/models_class1_processing.selected.20200611.tar.bz2 default: false - name: models_class1_pan_unselected url: https://github.com/openvax/mhcflurry/releases/download/pre-2.0/models_class1_pan.20200610.tar.bz2 default: false - name: models_class1_pan_variants url: https://github.com/openvax/mhcflurry/releases/download/pre-2.0/models_class1_pan_variants.selected.20200610.tar.bz2 default: false - name: data_evaluation part_urls: - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_evaluation.20200611.tar.bz2.part.aa - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_evaluation.20200611.tar.bz2.part.ab - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_evaluation.20200611.tar.bz2.part.ac default: false - name: analysis_predictor_info url: https://github.com/openvax/mhcflurry/releases/download/pre-2.0/analysis_predictor_info.20200711.tar.bz2 default: false - name: data_predictions part_urls: - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.aa - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ab - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ac - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ad - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ae - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.af - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ag - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ah - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ai - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.aj - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ak - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.al default: false - name: data_mass_spec_annotated url: https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_annotated.20191226.tar.bz2 default: false - name: data_references url: https://github.com/openvax/mhcflurry/releases/download/pre-1.4.0/data_references.20190927.tar.bz2 default: false - name: data_iedb url: https://github.com/openvax/mhcflurry/releases/download/pre-2.1/data_iedb.20231019.tar.bz2 default: false - name: data_systemhcatlas url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/data_systemhcatlas.20190506.tar.bz2 default: false - name: allele_sequences url: https://github.com/openvax/mhcflurry/releases/download/pre-2.1/allele_sequences.20231025.tar.bz2 default: false - name: random_peptide_predictions url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/random_peptide_predictions.20190506.tar.bz2 default: false - name: data_published url: https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_published.20200501.tar.bz2 default: false - name: data_curated url: https://github.com/openvax/mhcflurry/releases/download/pre-2.1/data_curated.20231023.tar.bz2 default: true # Older downloads - name: models_class1 url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1.20180225.tar.bz2 default: true - name: models_class1_selected_no_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_selected_no_mass_spec.20180225.tar.bz2 default: false - name: models_class1_unselected url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_unselected.20180221.tar.bz2 default: false - name: models_class1_trained_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_trained_with_mass_spec.20180228.tar.bz2 default: false - name: models_class1_unselected_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_unselected_with_mass_spec.20180227.tar.bz2 default: false - name: models_class1_minimal url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_minimal.20180226.tar.bz2 default: false 2.0.0: compatibility-version: 2 downloads: - name: models_class1_pan url: https://github.com/openvax/mhcflurry/releases/download/pre-2.0/models_class1_pan.selected.20200610.tar.bz2 default: false - name: models_class1_presentation url: https://github.com/openvax/mhcflurry/releases/download/pre-2.0/models_class1_presentation.20200611.tar.bz2 default: true - name: models_class1_processing url: https://github.com/openvax/mhcflurry/releases/download/pre-2.0/models_class1_processing.selected.20200611.tar.bz2 default: false - name: models_class1_pan_unselected url: https://github.com/openvax/mhcflurry/releases/download/pre-2.0/models_class1_pan.20200610.tar.bz2 default: false - name: models_class1_pan_variants url: https://github.com/openvax/mhcflurry/releases/download/pre-2.0/models_class1_pan_variants.selected.20200610.tar.bz2 default: false - name: data_evaluation part_urls: - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_evaluation.20200611.tar.bz2.part.aa - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_evaluation.20200611.tar.bz2.part.ab - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_evaluation.20200611.tar.bz2.part.ac default: false - name: analysis_predictor_info url: https://github.com/openvax/mhcflurry/releases/download/pre-2.0/analysis_predictor_info.20200711.tar.bz2 default: false - name: data_predictions part_urls: - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.aa - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ab - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ac - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ad - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ae - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.af - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ag - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ah - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ai - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.aj - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.ak - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_predictions.20200713.tar.bz2.part.al default: false - name: data_mass_spec_annotated url: https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_annotated.20191226.tar.bz2 default: false - name: data_references url: https://github.com/openvax/mhcflurry/releases/download/pre-1.4.0/data_references.20190927.tar.bz2 default: false - name: data_iedb url: https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_iedb.20200427.tar.bz2 default: false - name: data_systemhcatlas url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/data_systemhcatlas.20190506.tar.bz2 default: false - name: allele_sequences url: https://github.com/openvax/mhcflurry/releases/download/1.4.0/allele_sequences.20191231.tar.bz2 default: false - name: random_peptide_predictions url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/random_peptide_predictions.20190506.tar.bz2 default: false - name: data_published url: https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_published.20200501.tar.bz2 default: false - name: data_curated url: https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_curated.20200427.tar.bz2 default: true # Older downloads - name: models_class1 url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1.20180225.tar.bz2 default: true - name: models_class1_selected_no_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_selected_no_mass_spec.20180225.tar.bz2 default: false - name: models_class1_unselected url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_unselected.20180221.tar.bz2 default: false - name: models_class1_trained_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_trained_with_mass_spec.20180228.tar.bz2 default: false - name: models_class1_unselected_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_unselected_with_mass_spec.20180227.tar.bz2 default: false - name: models_class1_minimal url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_minimal.20180226.tar.bz2 default: false 1.7.0: compatibility-version: 2 downloads: - name: models_class1_pan url: https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/models_class1_pan.selected.20200610.tar.bz2 default: false - name: models_class1_presentation url: https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/models_class1_presentation.20200611.tar.bz2 default: true - name: models_class1_processing url: https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/models_class1_processing.selected.20200611.tar.bz2 default: false - name: models_class1_pan_unselected url: https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/models_class1_pan.20200610.tar.bz2 default: false - name: models_class1_pan_variants url: https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/models_class1_pan_variants.selected.20200610.tar.bz2 default: false - name: models_class1_processing_variants url: https://github.com/openvax/mhcflurry/releases/download/1.6.0/models_class1_processing_variants.selected.20200124.tar.bz2 default: false - name: data_evaluation part_urls: - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_evaluation.20200611.tar.bz2.part.aa - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_evaluation.20200611.tar.bz2.part.ab - https://github.com/openvax/mhcflurry/releases/download/pre-2.0/data_evaluation.20200611.tar.bz2.part.ac default: false - name: analysis_predictor_info url: https://github.com/openvax/mhcflurry/releases/download/pre-2.0/analysis_predictor_info.20200610.tar.bz2 defaultl: false - name: data_predictions part_urls: - https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_predictions.20200430.tar.bz2.part.aa - https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_predictions.20200430.tar.bz2.part.ab - https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_predictions.20200430.tar.bz2.part.ac - https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_predictions.20200430.tar.bz2.part.ad - https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_predictions.20200430.tar.bz2.part.ae - https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_predictions.20200430.tar.bz2.part.af - https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_predictions.20200430.tar.bz2.part.ag - https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_predictions.20200430.tar.bz2.part.ah - https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_predictions.20200430.tar.bz2.part.ai - https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_predictions.20200430.tar.bz2.part.aj - https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_predictions.20200430.tar.bz2.part.ak - https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_predictions.20200430.tar.bz2.part.al - https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_predictions.20200430.tar.bz2.part.am - https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_predictions.20200430.tar.bz2.part.an - https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_predictions.20200430.tar.bz2.part.ao default: false - name: data_mass_spec_annotated url: https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_annotated.20191226.tar.bz2 default: false - name: data_references url: https://github.com/openvax/mhcflurry/releases/download/pre-1.4.0/data_references.20190927.tar.bz2 default: false - name: data_iedb url: https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_iedb.20200427.tar.bz2 default: false - name: data_systemhcatlas url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/data_systemhcatlas.20190506.tar.bz2 default: false - name: allele_sequences url: https://github.com/openvax/mhcflurry/releases/download/1.4.0/allele_sequences.20191231.tar.bz2 default: false - name: random_peptide_predictions url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/random_peptide_predictions.20190506.tar.bz2 default: false - name: data_published url: https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_published.20200501.tar.bz2 default: false - name: data_curated url: https://github.com/openvax/mhcflurry/releases/download/pre-1.7.0/data_curated.20200427.tar.bz2 default: true # Older downloads - name: models_class1 url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1.20180225.tar.bz2 default: true - name: models_class1_selected_no_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_selected_no_mass_spec.20180225.tar.bz2 default: false - name: models_class1_unselected url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_unselected.20180221.tar.bz2 default: false - name: models_class1_trained_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_trained_with_mass_spec.20180228.tar.bz2 default: false - name: models_class1_unselected_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_unselected_with_mass_spec.20180227.tar.bz2 default: false - name: models_class1_minimal url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_minimal.20180226.tar.bz2 default: false 1.6.0: compatibility-version: 2 downloads: - name: models_class1_pan url: https://github.com/openvax/mhcflurry/releases/download/1.6.0/models_class1_pan.selected.20200204.tar.bz2 default: false - name: models_class1_presentation url: https://github.com/openvax/mhcflurry/releases/download/1.6.0/models_class1_presentation.20200205.tar.bz2 default: true - name: models_class1_processing url: https://github.com/openvax/mhcflurry/releases/download/1.6.0/models_class1_processing.selected.20200122.tar.bz2 default: false - name: models_class1_pan_unselected url: https://github.com/openvax/mhcflurry/releases/download/1.6.0/models_class1_pan.20200104.tar.bz2 default: false - name: models_class1_pan_variants url: https://github.com/openvax/mhcflurry/releases/download/1.6.0/models_class1_pan_variants.selected.20200307.tar.bz2 default: false - name: models_class1_processing_variants url: https://github.com/openvax/mhcflurry/releases/download/1.6.0/models_class1_processing_variants.selected.20200124.tar.bz2 default: false - name: data_evaluation url: https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_evaluation.20200209.tar.bz2 default: false - name: data_mass_spec_benchmark part_urls: - https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_benchmark.20200105.tar.bz2.part.aa - https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_benchmark.20200105.tar.bz2.part.ab - https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_benchmark.20200105.tar.bz2.part.ac - https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_benchmark.20200105.tar.bz2.part.ad - https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_benchmark.20200105.tar.bz2.part.ae - https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_benchmark.20200105.tar.bz2.part.af - https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_benchmark.20200105.tar.bz2.part.ag - https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_benchmark.20200105.tar.bz2.part.ah - https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_benchmark.20200105.tar.bz2.part.ai - https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_benchmark.20200105.tar.bz2.part.aj - https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_benchmark.20200105.tar.bz2.part.ak - https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_benchmark.20200105.tar.bz2.part.al - https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_benchmark.20200105.tar.bz2.part.am - https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_benchmark.20200105.tar.bz2.part.an - https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_benchmark.20200105.tar.bz2.part.ao default: false - name: data_mass_spec_annotated url: https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_mass_spec_annotated.20191226.tar.bz2 default: false - name: data_references url: https://github.com/openvax/mhcflurry/releases/download/pre-1.4.0/data_references.20190927.tar.bz2 default: false - name: data_iedb url: https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_iedb.20191220.tar.bz2 default: false - name: data_systemhcatlas url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/data_systemhcatlas.20190506.tar.bz2 default: false - name: allele_sequences url: https://github.com/openvax/mhcflurry/releases/download/1.4.0/allele_sequences.20191231.tar.bz2 default: false - name: random_peptide_predictions url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/random_peptide_predictions.20190506.tar.bz2 default: false - name: data_published url: https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_published.20191220.tar.bz2 default: false - name: data_curated url: https://github.com/openvax/mhcflurry/releases/download/1.6.0/data_curated.20200103.tar.bz2 default: true # Older downloads - name: models_class1 url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1.20180225.tar.bz2 default: true - name: models_class1_selected_no_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_selected_no_mass_spec.20180225.tar.bz2 default: false - name: models_class1_unselected url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_unselected.20180221.tar.bz2 default: false - name: models_class1_trained_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_trained_with_mass_spec.20180228.tar.bz2 default: false - name: models_class1_unselected_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_unselected_with_mass_spec.20180227.tar.bz2 default: false - name: models_class1_minimal url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_minimal.20180226.tar.bz2 default: false 1.5.0: compatibility-version: 2 downloads: - name: models_class1_pan url: https://github.com/openvax/mhcflurry/releases/download/1.4.0/models_class1_pan.20191221.tar.bz2 default: false - name: models_class1_pan_unselected part_urls: - https://github.com/openvax/mhcflurry/releases/download/1.4.0/models_class1_pan_unselected.20191221.tar.bz2.part.aa default: false - name: models_class1_pan_refined url: https://github.com/openvax/mhcflurry/releases/download/1.4.0/models_class1_pan_refined.20191212c.tar.bz2 default: false - name: models_class1_pan_variants part_urls: - https://github.com/openvax/mhcflurry/releases/download/1.4.0/models_class1_pan_variants.20191226.tar.bz2.part.aa - https://github.com/openvax/mhcflurry/releases/download/1.4.0/models_class1_pan_variants.20191226.tar.bz2.part.ab default: false - name: data_mass_spec_benchmark part_urls: - https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_mass_spec_benchmark.20191225.tar.bz2.part.aa - https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_mass_spec_benchmark.20191225.tar.bz2.part.ab - https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_mass_spec_benchmark.20191225.tar.bz2.part.ac - https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_mass_spec_benchmark.20191225.tar.bz2.part.ad - https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_mass_spec_benchmark.20191225.tar.bz2.part.ae - https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_mass_spec_benchmark.20191225.tar.bz2.part.af - https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_mass_spec_benchmark.20191225.tar.bz2.part.ag - https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_mass_spec_benchmark.20191225.tar.bz2.part.ah - https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_mass_spec_benchmark.20191225.tar.bz2.part.ai - https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_mass_spec_benchmark.20191225.tar.bz2.part.aj - https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_mass_spec_benchmark.20191225.tar.bz2.part.ak - https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_mass_spec_benchmark.20191225.tar.bz2.part.al - https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_mass_spec_benchmark.20191225.tar.bz2.part.am - https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_mass_spec_benchmark.20191225.tar.bz2.part.an default: false - name: data_mass_spec_annotated url: https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_mass_spec_annotated.20191226.tar.bz2 default: false - name: data_references url: https://github.com/openvax/mhcflurry/releases/download/pre-1.4.0/data_references.20190927.tar.bz2 default: false - name: data_iedb url: https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_iedb.20191220.tar.bz2 default: false - name: data_systemhcatlas url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/data_systemhcatlas.20190506.tar.bz2 default: false - name: allele_sequences url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/allele_sequences.20190506.tar.bz2 default: false - name: random_peptide_predictions url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/random_peptide_predictions.20190506.tar.bz2 default: false - name: data_published url: https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_published.20191220.tar.bz2 default: false - name: data_curated url: https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_curated.20191226.tar.bz2 default: true # Older downloads - name: models_class1 url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1.20180225.tar.bz2 default: true - name: models_class1_selected_no_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_selected_no_mass_spec.20180225.tar.bz2 default: false - name: models_class1_unselected url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_unselected.20180221.tar.bz2 default: false - name: models_class1_trained_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_trained_with_mass_spec.20180228.tar.bz2 default: false - name: models_class1_unselected_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_unselected_with_mass_spec.20180227.tar.bz2 default: false - name: models_class1_minimal url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_minimal.20180226.tar.bz2 default: false 1.4.0: compatibility-version: 2 downloads: - name: models_class1_pan url: https://github.com/openvax/mhcflurry/releases/download/pre-1.4.0/models_class1_pan.20190928.tar.bz2 default: false - name: models_class1_pan_unselected part_urls: - https://github.com/openvax/mhcflurry/releases/download/pre-1.4.0/models_class1_pan_unselected.20190924.tar.bz2.part.aa default: false - name: models_class1_pan_refined url: https://github.com/openvax/mhcflurry/releases/download/1.4.0/models_class1_pan_refined.20191212c.tar.bz2 default: false - name: models_class1_pan_variants part_urls: - https://github.com/openvax/mhcflurry/releases/download/1.4.0/models_class1_pan_variants.20191101.tar.bz2.part.aa - https://github.com/openvax/mhcflurry/releases/download/1.4.0/models_class1_pan_variants.20191101.tar.bz2.part.ab default: false - name: data_mass_spec_benchmark url: https://www.dropbox.com/s/4wzotlnl58i1w32/data_mass_spec_benchmark.20191027.tar.bz2?dl=1 default: false - name: data_mass_spec_annotated url: https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_mass_spec_annotated.20191030.tar.bz2 default: false - name: data_references url: https://github.com/openvax/mhcflurry/releases/download/pre-1.4.0/data_references.20190927.tar.bz2 default: false - name: data_iedb url: https://github.com/openvax/mhcflurry/releases/download/pre-1.4.0/data_iedb.20190916.tar.bz2 default: false - name: data_systemhcatlas url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/data_systemhcatlas.20190506.tar.bz2 default: false - name: allele_sequences url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/allele_sequences.20190506.tar.bz2 default: false - name: random_peptide_predictions url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/random_peptide_predictions.20190506.tar.bz2 default: false - name: data_published url: https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_published.20191030.tar.bz2 default: false - name: data_curated url: https://github.com/openvax/mhcflurry/releases/download/1.4.0/data_curated.20191030.tar.bz2 default: true # Older downloads - name: models_class1 url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1.20180225.tar.bz2 default: true - name: models_class1_selected_no_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_selected_no_mass_spec.20180225.tar.bz2 default: false - name: models_class1_unselected url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_unselected.20180221.tar.bz2 default: false - name: models_class1_trained_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_trained_with_mass_spec.20180228.tar.bz2 default: false - name: models_class1_unselected_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_unselected_with_mass_spec.20180227.tar.bz2 default: false - name: models_class1_minimal url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_minimal.20180226.tar.bz2 default: false 1.3.0: compatibility-version: 2 downloads: - name: models_class1_pan url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/models_class1_pan.20190829.tar.bz2 default: false - name: models_class1_pan_unselected part_urls: - http://github.com/openvax/mhcflurry/releases/download/pan-dev1/models_class1_pan_unselected.20190826.tar.bz2.part.aa - http://github.com/openvax/mhcflurry/releases/download/pan-dev1/models_class1_pan_unselected.20190826.tar.bz2.part.ab default: false - name: data_iedb url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/data_iedb.20190610.tar.bz2 default: false - name: data_systemhcatlas url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/data_systemhcatlas.20190506.tar.bz2 default: false - name: allele_sequences url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/allele_sequences.20190506.tar.bz2 default: false - name: random_peptide_predictions url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/random_peptide_predictions.20190506.tar.bz2 default: false - name: data_published url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/data_published.tar.bz2 default: false - name: data_curated url: http://github.com/openvax/mhcflurry/releases/download/pan-dev1/data_curated.20190516.tar.bz2 default: true # Older downloads - name: models_class1 url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1.20180225.tar.bz2 default: true - name: models_class1_selected_no_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_selected_no_mass_spec.20180225.tar.bz2 default: false - name: models_class1_unselected url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_unselected.20180221.tar.bz2 default: false - name: models_class1_trained_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_trained_with_mass_spec.20180228.tar.bz2 default: false - name: models_class1_unselected_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_unselected_with_mass_spec.20180227.tar.bz2 default: false - name: models_class1_minimal url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_minimal.20180226.tar.bz2 default: false 1.2.0: compatibility-version: 2 downloads: - name: models_class1 url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1.20180225.tar.bz2 default: true - name: models_class1_selected_no_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_selected_no_mass_spec.20180225.tar.bz2 default: true - name: models_class1_unselected url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_unselected.20180221.tar.bz2 default: false - name: models_class1_trained_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_trained_with_mass_spec.20180228.tar.bz2 default: false - name: models_class1_unselected_with_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2.1/models_class1_unselected_with_mass_spec.20180227.tar.bz2 default: false - name: models_class1_minimal url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/models_class1_minimal.20180226.tar.bz2 default: false - name: data_iedb url: http://github.com/openvax/mhcflurry/releases/download/pre-1.0/data_iedb.tar.bz2 default: false - name: data_published url: http://github.com/openvax/mhcflurry/releases/download/pre-1.1/data_published.tar.bz2 default: false - name: data_systemhcatlas url: http://github.com/openvax/mhcflurry/releases/download/pre-1.1/data_systemhcatlas.tar.bz2 default: false - name: data_curated url: http://github.com/openvax/mhcflurry/releases/download/pre-1.2/data_curated.20180219.tar.bz2 default: true 1.1.0: compatibility-version: 2 downloads: - name: models_class1 url: http://github.com/openvax/mhcflurry/releases/download/pre-1.1/models_class1.20180205.tar.bz2 default: true - name: models_class1_no_mass_spec url: http://github.com/openvax/mhcflurry/releases/download/pre-1.1/models_class1_no_mass_spec.20180205.tar.bz2 default: true - name: models_class1_experiments1 url: http://github.com/openvax/mhcflurry/releases/download/pre-1.1/models_class1_experiments1.tar.bz2 default: false - name: cross_validation_class1 url: http://github.com/openvax/mhcflurry/releases/download/pre-1.1/cross_validation_class1.tar.bz2 default: false - name: data_iedb url: http://github.com/openvax/mhcflurry/releases/download/pre-1.0/data_iedb.tar.bz2 default: false - name: data_published url: http://github.com/openvax/mhcflurry/releases/download/pre-1.1/data_published.tar.bz2 default: false - name: data_systemhcatlas url: http://github.com/openvax/mhcflurry/releases/download/pre-1.1/data_systemhcatlas.tar.bz2 default: false - name: data_curated url: http://github.com/openvax/mhcflurry/releases/download/pre-1.1/data_curated.tar.bz2 default: true 1.0.0: compatibility-version: 2 downloads: - name: models_class1 url: http://github.com/openvax/mhcflurry/releases/download/pre-1.0/models_class1.tar.bz2 default: true - name: models_class1_experiments1 url: http://github.com/openvax/mhcflurry/releases/download/pre-1.0/models_class1_experiments1.tar.bz2 default: false - name: cross_validation_class1 url: http://github.com/openvax/mhcflurry/releases/download/pre-1.0/cross_validation_class1.tar.bz2 default: false - name: data_iedb url: http://github.com/openvax/mhcflurry/releases/download/pre-1.0/data_iedb.tar.bz2 default: false - name: data_kim2014 url: http://github.com/openvax/mhcflurry/releases/download/0.9.1/data_kim2014.tar.bz2 default: false - name: data_curated url: http://github.com/openvax/mhcflurry/releases/download/pre-1.0/data_curated.tar.bz2 default: true 0.9.2: compatibility-version: 2 downloads: - name: models_class1 url: http://github.com/openvax/mhcflurry/releases/download/0.9.2/models_class1.tar.bz2 default: true - name: data_curated url: http://github.com/openvax/mhcflurry/releases/download/0.9.1/data_curated.tar.bz2 default: true - name: data_kim2014 url: http://github.com/openvax/mhcflurry/releases/download/0.9.1/data_kim2014.tar.bz2 default: false - name: data_iedb url: http://github.com/openvax/mhcflurry/releases/download/0.9.1/data_iedb.tar.bz2 default: false - name: models_class1_experiments1 url: http://github.com/openvax/mhcflurry/releases/download/0.9.2/models_class1_experiments1.tar.bz2 default: false 0.9.1: compatibility-version: 2 downloads: - name: models_class1 url: http://github.com/openvax/mhcflurry/releases/download/0.9.1/models_class1.tar.bz2 default: true - name: data_curated url: http://github.com/openvax/mhcflurry/releases/download/0.9.1/data_curated.tar.bz2 default: true - name: data_kim2014 url: http://github.com/openvax/mhcflurry/releases/download/0.9.1/data_kim2014.tar.bz2 default: false - name: data_iedb url: http://github.com/openvax/mhcflurry/releases/download/0.9.1/data_iedb.tar.bz2 default: false - name: models_class1_experiments1 url: http://github.com/openvax/mhcflurry/releases/download/0.9.1/models_class1_experiments1.tar.bz2 default: false 0.2.0: compatibility-version: 1 downloads: - name: models_class1_allele_specific_ensemble url: http://github.com/openvax/mhcflurry/releases/download/0.2.0/models_class1_allele_specific_ensemble.tar.bz2 default: true - name: models_class1_allele_specific_single url: http://github.com/openvax/mhcflurry/releases/download/0.2.0/models_class1_allele_specific_single.tar.bz2 default: false - name: data_kim2014 url: http://github.com/openvax/mhcflurry/releases/download/0.0.8/data_kim2014.tar.bz2 default: true - name: data_combined_iedb_kim2014 url: http://github.com/openvax/mhcflurry/releases/download/0.0.8/data_combined_iedb_kim2014.tar.bz2 default: true 0.0.8: compatibility-version: 1 downloads: - name: models_class1_allele_specific_single url: http://github.com/openvax/mhcflurry/releases/download/0.0.8/models_class1_allele_specific_single.no_impute.tar.bz2 default: true - name: data_kim2014 url: http://github.com/openvax/mhcflurry/releases/download/0.0.8/data_kim2014.tar.bz2 default: true - name: data_combined_iedb_kim2014 url: http://github.com/openvax/mhcflurry/releases/download/0.0.8/data_combined_iedb_kim2014.tar.bz2 default: true # Bundle purposes are independent of catalogue releases and archive storage tags. bundles: models_class1_presentation: kind: models group: Prediction models description: Full presentation predictor, including affinity and processing components. models_class1_pan: kind: models group: Prediction models description: Selected pan-allele binding-affinity ensemble; no presentation combiner. models_class1_processing: kind: models group: Prediction models description: Standalone antigen-processing ensembles with and without N/C flanks. models_class1_pan_unselected: kind: models group: Historical experiments description: Pan-allele affinity candidates before ensemble selection. models_class1_pan_variants: kind: models group: Historical experiments description: Alternative pan-allele affinity architectures and training variants. models_class1_pan_refined: kind: models group: Historical experiments description: Historical refined pan-allele affinity models. models_class1_processing_variants: kind: models group: Historical experiments description: Alternative antigen-processing training variants. models_class1: kind: models group: Legacy allele-specific models description: Legacy allele-specific affinity ensemble; not the modern presentation bundle. models_class1_selected_no_mass_spec: kind: models group: Legacy allele-specific models description: Selected allele-specific affinity models trained without mass-spec data. models_class1_no_mass_spec: kind: models group: Legacy allele-specific models description: Historical allele-specific affinity models without mass-spec training data. models_class1_trained_with_mass_spec: kind: models group: Legacy allele-specific models description: Allele-specific affinity models trained with mass-spec data. models_class1_unselected: kind: models group: Legacy allele-specific models description: Allele-specific affinity candidates before ensemble selection. models_class1_unselected_with_mass_spec: kind: models group: Legacy allele-specific models description: Unselected allele-specific candidates trained with mass-spec data. models_class1_minimal: kind: models group: Legacy allele-specific models description: Small historical allele-specific affinity ensemble. models_class1_experiments1: kind: models group: Historical experiments description: Early experimental allele-specific models. models_class1_allele_specific_ensemble: kind: models group: Legacy allele-specific models description: Early allele-specific ensemble in an obsolete serialization format. models_class1_allele_specific_single: kind: models group: Legacy allele-specific models description: Early single allele-specific models in an obsolete serialization format. data_evaluation: kind: data group: Evaluation and analysis data description: Historical evaluation datasets; not the stable release comparison report. data_predictions: kind: data group: Evaluation and analysis data description: Precomputed predictions for historical evaluation datasets. analysis_predictor_info: kind: data group: Evaluation and analysis data description: Historical predictor analysis and summaries. cross_validation_class1: kind: data group: Evaluation and analysis data description: Historical class I cross-validation results. data_mass_spec_benchmark: kind: data group: Evaluation and analysis data description: Historical mass-spectrometry benchmark data. random_peptide_predictions: kind: data group: Evaluation and analysis data description: Precomputed random-peptide predictions for background analyses. data_mass_spec_annotated: kind: data group: Training and reference data description: Annotated mass-spectrometry peptides and source-sequence context. data_references: kind: data group: Training and reference data description: Reference protein sequences and supporting resources. data_iedb: kind: data group: Training and reference data description: IEDB data snapshot; see the archive name for the snapshot date. data_systemhcatlas: kind: data group: Training and reference data description: SystemHC Atlas mass-spectrometry source data. allele_sequences: kind: data group: Training and reference data description: MHC allele sequences used by pan-allele predictors and training. data_published: kind: data group: Training and reference data description: Published experimental datasets used in data preparation. data_curated: kind: data group: Training and reference data description: Curated training data; see the archive name for the snapshot date. data_combined_iedb_kim2014: kind: data group: Training and reference data description: Historical combined IEDB and Kim et al. 2014 affinity data. data_kim2014: kind: data group: Training and reference data description: Kim et al. 2014 affinity dataset. mhcflurry-2.3.6/mhcflurry/downloads_command.py000066400000000000000000000014241525677230600216300ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Compatibility wrapper for :mod:`mhcflurry.cli.downloads_command`.""" from .cli import downloads_command as _impl run = _impl.run parser = _impl.parser def __getattr__(name): return getattr(_impl, name) __all__ = ["run", "parser"] mhcflurry-2.3.6/mhcflurry/encodable_sequences.py000066400000000000000000000507571525677230600221440ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Class for encoding variable-length peptides to fixed-size numerical matrices """ import math import numpy import pandas from . import amino_acid class EncodingError(ValueError): """ Exception raised when peptides cannot be encoded """ def __init__(self, message, supported_peptide_lengths): self.supported_peptide_lengths = supported_peptide_lengths ValueError.__init__( self, message + " Supported lengths: %s - %s." % supported_peptide_lengths) class EncodableSequences(object): """ Class for encoding variable-length peptides to fixed-size numerical matrices This class caches various encodings of a list of sequences. In practice this is used only for peptides. To encode MHC allele sequences, see AlleleEncoding. """ unknown_character = "X" @classmethod def create(klass, sequences): """ Factory that returns an EncodableSequences given a list of strings. As a convenience, you can also pass it an EncodableSequences instance, in which case the object is returned unchanged. """ if isinstance(sequences, klass): return sequences return klass(sequences) def __init__(self, sequences): if not all(isinstance(obj, str) for obj in sequences): raise ValueError("Sequence of strings is required") self.sequences = numpy.array(sequences) lengths = pandas.Series(self.sequences, dtype=numpy.object_).str.len() self.min_length = lengths.min() self.max_length = lengths.max() self.encoding_cache = {} self.fixed_sequence_length = None if len(self.sequences) > 0 and all( len(s) == len(self.sequences[0]) for s in self.sequences): self.fixed_sequence_length = len(self.sequences[0]) def __len__(self): return len(self.sequences) def variable_length_to_fixed_length_categorical( self, alignment_method="pad_middle", left_edge=4, right_edge=4, max_length=15, trim=False, allow_unsupported_amino_acids=False): """ Encode variable-length sequences to a fixed-size index-encoded (integer) matrix. See `sequences_to_fixed_length_index_encoded_array` for details. Parameters ---------- alignment_method : string One of "pad_middle", "left_pad_right_pad", "left_pad_centered_right_pad", "left_pad", or "right_pad" left_edge : int, size of fixed-position left side Only relevant for pad_middle alignment method right_edge : int, size of the fixed-position right side Only relevant for pad_middle alignment method max_length : maximum supported peptide length trim : bool If True, longer sequences will be trimmed to fit the maximum supported length. Not supported for all alignment methods. allow_unsupported_amino_acids : bool If True, non-canonical amino acids will be replaced with the X character before encoding. Returns ------- numpy.array of integers with shape (num sequences, encoded length) For pad_middle, left_pad and right_pad, the encoded length is max_length. For left_pad_right_pad it is 2 * max_length; for left_pad_centered_right_pad it is 3 * max_length. """ cache_key = ( "fixed_length_categorical", alignment_method, left_edge, right_edge, max_length, trim, allow_unsupported_amino_acids) if cache_key not in self.encoding_cache: fixed_length_sequences = ( self.sequences_to_fixed_length_index_encoded_array( self.sequences, alignment_method=alignment_method, left_edge=left_edge, right_edge=right_edge, max_length=max_length, trim=trim, allow_unsupported_amino_acids=allow_unsupported_amino_acids)) self.encoding_cache[cache_key] = fixed_length_sequences return self.encoding_cache[cache_key] def variable_length_to_fixed_length_vector_encoding( self, vector_encoding_name, alignment_method="pad_middle", left_edge=4, right_edge=4, max_length=15, trim=False, allow_unsupported_amino_acids=False): """ Encode variable-length sequences to a fixed-size matrix. Amino acids are encoded as specified by the vector_encoding_name argument. DEPRECATED (scheduled for removal): the dense ``(N, L, V)`` peptide/ sequence vector path has been retired — models always index-encode peptides ((N, L) int8) and embed on device. This method has no production caller; it is retained only for benchmark/encoding-cache tests and will be removed once those migrate to the categorical path. Use ``variable_length_to_fixed_length_categorical`` instead. See `sequences_to_fixed_length_index_encoded_array` for details. See also: variable_length_to_fixed_length_categorical. Parameters ---------- vector_encoding_name : string How to represent amino acids. Registered names include "BLOSUM62", "one-hot", "PMBEC", "contact", "physchem", and "atchley"; ``+``-joined composites such as "BLOSUM62+physchem" are also accepted. Add the ``:minmax`` suffix to a component to scale its non-X values to [-1, 1], for example "PMBEC:minmax+contact:minmax". alignment_method : string One of "pad_middle", "left_pad_right_pad", "left_pad_centered_right_pad", "left_pad", or "right_pad" left_edge : int Size of fixed-position left side. Only relevant for pad_middle alignment method right_edge : int Size of the fixed-position right side. Only relevant for pad_middle alignment method max_length : int Maximum supported peptide length trim : bool If True, longer sequences will be trimmed to fit the maximum supported length. Not supported for all alignment methods. allow_unsupported_amino_acids : bool If True, non-canonical amino acids will be replaced with the X character before encoding. Returns ------- numpy.array with shape (num sequences, encoded length, m) where - m is the vector encoding length (usually 21). - encoded length is max_length if alignment_method is pad_middle; 2 * max_length for left_pad_right_pad and 3 * max_length for left_pad_centered_right_pad; left_pad/right_pad use max_length. """ cache_key = ( "fixed_length_vector_encoding", vector_encoding_name, alignment_method, left_edge, right_edge, max_length, trim, allow_unsupported_amino_acids) if cache_key not in self.encoding_cache: fixed_length_sequences = ( self.sequences_to_fixed_length_index_encoded_array( self.sequences, alignment_method=alignment_method, left_edge=left_edge, right_edge=right_edge, max_length=max_length, trim=trim, allow_unsupported_amino_acids=allow_unsupported_amino_acids)) result = amino_acid.fixed_vectors_encoding( fixed_length_sequences, amino_acid.get_vector_encoding_df(vector_encoding_name)) assert result.shape[0] == len(self.sequences) self.encoding_cache[cache_key] = result return self.encoding_cache[cache_key] @classmethod def sequences_to_fixed_length_index_encoded_array( klass, sequences, alignment_method="pad_middle", left_edge=4, right_edge=4, max_length=15, trim=False, allow_unsupported_amino_acids=False): """ Encode variable-length sequences to a fixed-size index-encoded (integer) matrix. How variable length sequences get mapped to fixed length is set by the "alignment_method" argument. Supported alignment methods are: pad_middle Encoding designed for preserving the anchor positions of class I peptides. This is what is used in allele-specific models. Each string must be of length at least left_edge + right_edge and at most max_length. The first left_edge characters in the input always map to the first left_edge characters in the output. Similarly for the last right_edge characters. The middle characters are filled in based on the length, with the X character filling in the blanks. Example: AAAACDDDD -> AAAAXXXCXXXDDDD left_pad_centered_right_pad Encoding that makes no assumptions on anchor positions but is 3x larger than pad_middle, since it duplicates the peptide (left aligned + centered + right aligned). This is what is used for the pan-allele models. Example: AAAACDDDD -> AAAACDDDDXXXXXXXXXAAAACDDDDXXXXXXXXXAAAACDDDD left_pad_right_pad Same as left_pad_centered_right_pad but only includes left- and right-padded peptide. Example: AAAACDDDD -> AAAACDDDDXXXXXXXXXXXXAAAACDDDD Parameters ---------- sequences : list of string alignment_method : string One of "pad_middle", "left_pad_right_pad", "left_pad_centered_right_pad", "left_pad", or "right_pad" left_edge : int Size of fixed-position left side. Only relevant for pad_middle alignment method right_edge : int Size of the fixed-position right side. Only relevant for pad_middle alignment method max_length : int maximum supported peptide length trim : bool If True, longer sequences will be trimmed to fit the maximum supported length. Not supported for all alignment methods. allow_unsupported_amino_acids : bool If True, non-canonical amino acids will be replaced with the X character before encoding. Returns ------- numpy.array of integers with shape (num sequences, encoded length) For pad_middle, the encoded length is max_length. For left_pad_right_pad, it's 2 * max_length. For left_pad_centered_right_pad, it's 3 * max_length. """ if allow_unsupported_amino_acids: fill_value = amino_acid.AMINO_ACID_INDEX['X'] def get_amino_acid_index(a): return amino_acid.AMINO_ACID_INDEX.get(a, fill_value) else: get_amino_acid_index = amino_acid.AMINO_ACID_INDEX.__getitem__ result = None if alignment_method == 'pad_middle': if trim: raise NotImplementedError("trim not supported") # Result array is int32, filled with X (null amino acid) value. result = numpy.full( fill_value=amino_acid.AMINO_ACID_INDEX['X'], shape=(len(sequences), max_length), dtype="int32") df = pandas.DataFrame({"peptide": sequences}, dtype=numpy.object_) df["length"] = df.peptide.str.len() middle_length = max_length - left_edge - right_edge min_length = left_edge + right_edge # For efficiency we handle each supported peptide length using bulk # array operations. for (length, sub_df) in df.groupby("length"): if length < min_length or length > max_length: raise EncodingError( "Sequence '%s' (length %d) unsupported. There are %d " "total peptides with this length." % ( sub_df.iloc[0].peptide, length, len(sub_df)), supported_peptide_lengths=( min_length, max_length)) # Array of shape (num peptides, length) giving fixed-length # amino acid encoding each peptide of the current length. fixed_length_sequences = numpy.stack( sub_df.peptide.map( lambda s: numpy.array([ get_amino_acid_index(char) for char in s ])).values) num_null = max_length - length num_null_left = int(math.ceil(num_null / 2)) num_middle_filled = middle_length - num_null middle_start = left_edge + num_null_left # Set left edge result[sub_df.index, :left_edge] = fixed_length_sequences[ :, :left_edge ] # Set middle. result[ sub_df.index, middle_start : middle_start + num_middle_filled ] = fixed_length_sequences[ :, left_edge : left_edge + num_middle_filled ] # Set right edge. result[ sub_df.index, -right_edge: ] = fixed_length_sequences[:, -right_edge:] elif alignment_method == "left_pad_right_pad": if trim: raise NotImplementedError("trim not supported") # We arbitrarily set a minimum length of 5, although this encoding # could handle smaller peptides. min_length = 5 # Result array is int32, filled with X (null amino acid) value. result = numpy.full( fill_value=amino_acid.AMINO_ACID_INDEX['X'], shape=(len(sequences), max_length * 2), dtype="int32") df = pandas.DataFrame({"peptide": sequences}, dtype=numpy.object_) # For efficiency we handle each supported peptide length using bulk # array operations. for (length, sub_df) in df.groupby(df.peptide.str.len()): if length < min_length or length > max_length: raise EncodingError( "Sequence '%s' (length %d) unsupported. There are %d " "total peptides with this length." % ( sub_df.iloc[0].peptide, length, len(sub_df)), supported_peptide_lengths=( min_length, max_length)) # Array of shape (num peptides, length) giving fixed-length # amino acid encoding each peptide of the current length. fixed_length_sequences = numpy.stack(sub_df.peptide.map( lambda s: numpy.array([ get_amino_acid_index(char) for char in s ])).values) # Set left edge result[sub_df.index, :length] = fixed_length_sequences # Set right edge. result[sub_df.index, -length:] = fixed_length_sequences elif alignment_method == "left_pad_centered_right_pad": if trim: raise NotImplementedError("trim not supported") # We arbitrarily set a minimum length of 5, although this encoding # could handle smaller peptides. min_length = 5 # Result array is int32, filled with X (null amino acid) value. result = numpy.full( fill_value=amino_acid.AMINO_ACID_INDEX['X'], shape=(len(sequences), max_length * 3), dtype="int32") df = pandas.DataFrame({"peptide": sequences}, dtype=numpy.object_) # For efficiency we handle each supported peptide length using bulk # array operations. for (length, sub_df) in df.groupby(df.peptide.str.len()): if length < min_length or length > max_length: raise EncodingError( "Sequence '%s' (length %d) unsupported. There are %d " "total peptides with this length." % ( sub_df.iloc[0].peptide, length, len(sub_df)), supported_peptide_lengths=( min_length, max_length)) # Array of shape (num peptides, length) giving fixed-length # amino acid encoding each peptide of the current length. fixed_length_sequences = numpy.stack(sub_df.peptide.map( lambda s: numpy.array([ get_amino_acid_index(char) for char in s ])).values) # Set left edge result[sub_df.index, :length] = fixed_length_sequences # Set right edge. result[sub_df.index, -length:] = fixed_length_sequences # Set center. center_left_padding = int( math.floor((max_length - length) / 2)) center_left_offset = max_length + center_left_padding result[ sub_df.index, center_left_offset : center_left_offset + length ] = fixed_length_sequences elif alignment_method in ("right_pad", "left_pad"): min_length = 1 # Result array is int32, filled with X (null amino acid) value. result = numpy.full( fill_value=amino_acid.AMINO_ACID_INDEX['X'], shape=(len(sequences), max_length), dtype="int32") df = pandas.DataFrame({"peptide": sequences}, dtype=numpy.object_) # For efficiency we handle each supported peptide length using bulk # array operations. for (length, sub_df) in df.groupby(df.peptide.str.len()): if length < min_length or (not trim and length > max_length): raise EncodingError( "Sequence '%s' (length %d) unsupported. There are %d " "total peptides with this length." % ( sub_df.iloc[0].peptide, length, len(sub_df)), supported_peptide_lengths=( min_length, max_length)) peptides = sub_df.peptide if length > max_length: # Trim. if alignment_method == "right_pad": peptides = peptides.str.slice(0, max_length) else: peptides = peptides.str.slice(length - max_length) # Array of shape (num peptides, length) giving fixed-length # amino acid encoding each peptide of the current length. fixed_length_sequences = numpy.stack(peptides.map( lambda s: numpy.array([ get_amino_acid_index(char) for char in s ])).values) if alignment_method == "right_pad": # Left align (i.e. pad right): set left edge result[sub_df.index, :length] = fixed_length_sequences else: # Right align: set right edge. result[sub_df.index, -length:] = fixed_length_sequences else: raise NotImplementedError( "Unsupported alignment method: %s" % alignment_method) return result mhcflurry-2.3.6/mhcflurry/ensemble_centrality.py000066400000000000000000000057561525677230600222040ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Measures of centrality (e.g. mean) used to combine predictions across an ensemble. The input to these functions are log affinities, and they are expected to return a centrality measure also in log-space. """ import numpy def _nanmean_no_warnings(log_values): """ Row-wise nanmean that returns nan for all-nan rows without warnings. """ valid = ~numpy.isnan(log_values) counts = valid.sum(axis=1).astype("float64") sums = numpy.where(valid, log_values, 0.0).sum(axis=1) result = numpy.full(log_values.shape[0], numpy.nan, dtype="float64") numpy.divide(sums, counts, out=result, where=counts > 0) return result def _nanmedian_no_warnings(log_values): """ Row-wise nanmedian that returns nan for all-nan rows without warnings. """ result = numpy.full(log_values.shape[0], numpy.nan, dtype="float64") row_has_values = (~numpy.isnan(log_values)).any(axis=1) if row_has_values.any(): result[row_has_values] = numpy.nanmedian(log_values[row_has_values], axis=1) return result def robust_mean(log_values): """ Mean of values falling within the 25-75 percentiles. Parameters ---------- log_values : 2-d numpy.array Center is computed along the second axis (i.e. per row). Returns ------- center : numpy.array of length log_values.shape[0] """ if log_values.shape[1] <= 3: # Too few values to use robust mean. return _nanmean_no_warnings(log_values) result = numpy.full(log_values.shape[0], numpy.nan, dtype="float64") row_has_values = (~numpy.isnan(log_values)).any(axis=1) if not row_has_values.any(): return result valid_rows = log_values[row_has_values] without_nans = numpy.nan_to_num(valid_rows) # replace nan with 0 p75 = numpy.nanpercentile(valid_rows, 75, axis=1).reshape((-1, 1)) p25 = numpy.nanpercentile(valid_rows, 25, axis=1).reshape((-1, 1)) mask = ( (~numpy.isnan(valid_rows)) & (without_nans <= p75) & (without_nans >= p25)) mask_f = mask.astype("float64") numerator = (without_nans * mask_f).sum(axis=1) denominator = mask_f.sum(axis=1) robust = numpy.full(valid_rows.shape[0], numpy.nan, dtype="float64") numpy.divide(numerator, denominator, out=robust, where=denominator > 0) result[row_has_values] = robust return result CENTRALITY_MEASURES = { "mean": _nanmean_no_warnings, "median": _nanmedian_no_warnings, "robust_mean": robust_mean, } mhcflurry-2.3.6/mhcflurry/experiment_archive.py000066400000000000000000000541361525677230600220310ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Create portable, plot-reconstructable snapshots of training experiments.""" from __future__ import annotations import csv from datetime import datetime, timezone import hashlib from importlib import metadata import json import os from pathlib import Path import platform import re import shutil import subprocess import pandas SCHEMA_VERSION = 1 DEFAULT_MAX_COPY_BYTES = 64 * 1024 * 1024 HASH_LINE_RE = re.compile(r"^([0-9a-f]{64})\s+(.+)$") def sha256_file(path, chunk_size=1024 * 1024): """Return the SHA256 digest of ``path`` without loading it into memory.""" digest = hashlib.sha256() with Path(path).open("rb") as fd: for chunk in iter(lambda: fd.read(chunk_size), b""): digest.update(chunk) return digest.hexdigest() def _json_value(value): if pandas.isna(value) if not isinstance(value, (list, dict)) else False: return None if isinstance(value, (str, int, float, bool)) or value is None: return value return json.dumps(value, sort_keys=True, separators=(",", ":")) def _write_csv(path, rows, preferred_fields=()): path = Path(path) all_fields = {key for row in rows for key in row} fieldnames = [field for field in preferred_fields if field in all_fields] fieldnames.extend(sorted(all_fields - set(fieldnames))) with path.open("w", newline="") as fd: if not fieldnames: return writer = csv.DictWriter(fd, fieldnames=fieldnames) writer.writeheader() writer.writerows(rows) def _model_manifest_paths(source_dir): result = [] for path in sorted(Path(source_dir).rglob("manifest.csv")): with path.open(newline="") as fd: fieldnames = next(csv.reader(fd), []) if "model_name" in fieldnames and "config_json" in fieldnames: result.append(path) return result def export_training_tables(source_dir, out_dir): """Export normalized model, fit, and per-epoch tables from manifests. The source manifests remain authoritative. These tables deliberately omit serialized network graphs and weights so ordinary plotting and audit code can consume the histories without loading model implementations. """ source_dir = Path(source_dir).resolve() out_dir = Path(out_dir) out_dir.mkdir(parents=True, exist_ok=True) model_rows = [] fit_rows = [] epoch_rows = [] config_records = [] for manifest_path in _model_manifest_paths(source_dir): relative_manifest = manifest_path.relative_to(source_dir).as_posix() manifest = pandas.read_csv(manifest_path) for _, manifest_row in manifest.iterrows(): config = json.loads(manifest_row["config_json"]) hyperparameters = config.get("hyperparameters", {}) or {} fit_infos = config.get("fit_info", []) or [] model_name = str(manifest_row["model_name"]) config_payload = json.dumps( { "hyperparameters": hyperparameters, "fit_info": fit_infos, }, sort_keys=True, separators=(",", ":"), ) model_rows.append({ "manifest_path": relative_manifest, "model_name": model_name, "allele": manifest_row.get("allele"), "config_sha256": hashlib.sha256( str(manifest_row["config_json"]).encode()).hexdigest(), "fit_count": len(fit_infos), "topology": hyperparameters.get("topology"), "layer_sizes": json.dumps( hyperparameters.get("layer_sizes", []), separators=(",", ":"), ), "activation": hyperparameters.get("activation"), "convolutional_activation": hyperparameters.get( "convolutional_activation"), "normalization": hyperparameters.get("normalization", "none"), "dropout_keep_probability": hyperparameters.get( "dropout_probability"), "dropout_rate": hyperparameters.get("dropout_rate"), "restore_best_weights": hyperparameters.get( "restore_best_weights", False), "patience": hyperparameters.get("patience"), "learning_rate": hyperparameters.get("learning_rate"), "minibatch_size": hyperparameters.get("minibatch_size"), "optimizer": hyperparameters.get("optimizer"), "optimizer_implementation": hyperparameters.get( "optimizer_implementation"), "initializer": hyperparameters.get("init"), "data_dependent_initialization_method": hyperparameters.get( "data_dependent_initialization_method"), "data_dependent_initialization_target": hyperparameters.get( "data_dependent_initialization_target"), "convolutional_filters": hyperparameters.get( "convolutional_filters"), "convolutional_kernel_size": hyperparameters.get( "convolutional_kernel_size"), "n_flank_length": hyperparameters.get("n_flank_length"), "c_flank_length": hyperparameters.get("c_flank_length"), "hyperparameters_json": json.dumps( hyperparameters, sort_keys=True, separators=(",", ":")), }) config_records.append({ "manifest_path": relative_manifest, "model_name": model_name, "config": json.loads(config_payload), }) for fit_index, fit_info in enumerate(fit_infos): if not isinstance(fit_info, dict): continue training_info = fit_info.get("training_info", {}) or {} identity = { "manifest_path": relative_manifest, "model_name": model_name, "fit_index": fit_index, "phase": training_info.get("phase", "unknown"), "fold": training_info.get("fold_num"), "architecture": training_info.get("architecture_num"), "replicate": training_info.get("replicate_num"), "work_item_name": training_info.get("work_item_name"), } scalar_info = { "fit_" + key: _json_value(value) for key, value in fit_info.items() if key != "training_info" and not isinstance(value, list) } scalar_training_info = { "training_" + key: _json_value(value) for key, value in training_info.items() if not isinstance(value, list) } fit_rows.append({ **identity, **scalar_info, **scalar_training_info, "fit_info_json": json.dumps( fit_info, sort_keys=True, separators=(",", ":")), }) series = { key: value for key, value in fit_info.items() if isinstance(value, list) and ( key in ("loss", "val_loss", "optimizer_steps") or key.startswith("epoch_") or key.startswith("val_macro_")) } # Sample/row identity and retained-state names are list-valued # metadata too, not epoch series. Preserve them in fit_info_json # without inventing thousands of epochs from validation IDs. epoch_count = len(fit_info.get("loss", [])) for epoch_index in range(epoch_count): row = {**identity, "epoch": epoch_index + 1} for key, values in series.items(): if epoch_index < len(values): row[key] = _json_value(values[epoch_index]) epoch_rows.append(row) preferred = ( "manifest_path", "model_name", "fit_index", "phase", "fold", "architecture", "replicate", "work_item_name", "epoch", ) _write_csv(out_dir / "models.csv", model_rows, preferred[:2]) _write_csv(out_dir / "fits.csv", fit_rows, preferred[:-1]) _write_csv(out_dir / "training_history.csv", epoch_rows, preferred) with (out_dir / "model_configs.jsonl").open("w") as fd: for record in config_records: fd.write(json.dumps(record, sort_keys=True) + "\n") return { "model_manifest_count": len(_model_manifest_paths(source_dir)), "model_count": len(model_rows), "fit_count": len(fit_rows), "epoch_count": len(epoch_rows), } def _artifact_role(relative_path): path = Path(relative_path) name = path.name lower_name = name.lower() if name.startswith("weights_") and path.suffix == ".npz": return "weight" if name == "train_data.csv.bz2": return "training_data" if name == "manifest.csv" and "models" in relative_path: return "model_manifest" if name == "gpu_occupancy.csv": return "telemetry" if ( "prediction" in lower_name and lower_name.endswith((".csv", ".csv.bz2", ".parquet"))): return "prediction" if name.startswith("benchmark.") and name.endswith((".csv", ".csv.bz2")): return "prediction" if set(path.parts) & {"training_feature_cache", "component_scores"} and path.suffix == ".npy": return "prediction" if name == "bootstrap_deltas.npz": return "metric" if path.suffix.lower() in (".pdf", ".png", ".svg"): return "figure" if name.endswith((".log", ".txt")) and ( "log" in name.lower() or name.startswith("LOG-worker")): return "log" if ( path.parent.name == ".runplz" and path.suffix.lower() in (".py", ".sh")): return "provenance" if "condition" in path.parts and path.suffix in (".yaml", ".yml"): return "configuration" if name.startswith("provenance") or name in { "manifest.json", "manifest.csv", "command.sh", "started_at_utc.txt", "completed_at_utc.txt", "queue_provenance.txt", "verification.json"}: return "provenance" if name in { "summary.csv", "summary.json", "summary.md", "summary_table.csv", "release_summary.csv", "release_summary.md", "per_allele.csv", "per_length.csv", "per_length_per_allele.csv", "training_overlap.json", "model_selection_summary.csv.bz2"}: return "metric" if name == "predictor_info.csv" or name.startswith("accuracy_scores."): return "metric" if lower_name == "weights.csv" or lower_name.endswith(".weights.csv"): return "weight" if lower_name.endswith((".csv", ".csv.bz2")): return "metric" if path.suffix.lower() == ".json": return "provenance" return "other" def _copy_role(role): return role in { "weight", "training_data", "model_manifest", "telemetry", "log", "configuration", "provenance", "metric", "prediction", "figure", } def _copy_regardless_of_size(role): return role == "prediction" def _copy_artifact(source, target): """Copy an artifact into an immutable experiment snapshot.""" shutil.copy2(source, target) return "copy" def _environment_record(): distributions = {} for distribution in metadata.distributions(): name = distribution.metadata.get("Name") if name: distributions[name] = distribution.version gpu_query = None try: result = subprocess.run( [ "nvidia-smi", "--query-gpu=name,memory.total,driver_version", "--format=csv,noheader,nounits", ], capture_output=True, check=False, text=True, timeout=15, ) if result.returncode == 0: gpu_query = result.stdout.strip().splitlines() except (FileNotFoundError, subprocess.TimeoutExpired): pass return { "python": platform.python_version(), "python_executable": os.path.realpath(os.sys.executable), "platform": platform.platform(), "machine": platform.machine(), "packages": dict(sorted(distributions.items(), key=lambda item: item[0].lower())), "gpus": gpu_query, } def _external_hash_records(source_dir): records = [] for provenance in sorted(Path(source_dir).rglob("*provenance*")): if not provenance.is_file() or provenance.stat().st_size > 8 * 1024 * 1024: continue try: lines = provenance.read_text(errors="replace").splitlines() except OSError: continue for line in lines: match = HASH_LINE_RE.match(line.strip()) if match: records.append({ "recorded_sha256": match.group(1), "path": match.group(2), "recorded_in": provenance.relative_to(source_dir).as_posix(), }) return records def _slug(value): result = re.sub(r"[^A-Za-z0-9._-]+", "-", value).strip("-._") if not result: raise ValueError("Experiment name must contain a letter or number") return result def _read_source_commit(source_dir, explicit): if explicit: return explicit.strip() provenance = Path(source_dir) / "provenance.txt" if provenance.exists(): for line in provenance.read_text(errors="replace").splitlines(): if line.startswith("source_commit="): return line.split("=", 1)[1].strip() raise ValueError( "source_commit is required when source_dir/provenance.txt does not " "record source_commit=") def _collector_commit(): repo_root = Path(__file__).resolve().parents[1] try: result = subprocess.run( ["git", "-C", str(repo_root), "rev-parse", "HEAD"], capture_output=True, check=False, text=True, ) except FileNotFoundError: return None return result.stdout.strip() if result.returncode == 0 else None def snapshot_experiment( source_dir, experiments_dir, name, *, source_commit=None, collector_commit=None, source_archive=None, command_files=(), input_files=(), captured_at=None, max_copy_bytes=DEFAULT_MAX_COPY_BYTES, ): """Create and return one immutable timestamped experiment snapshot.""" source_dir = Path(source_dir).resolve() if not source_dir.is_dir(): raise ValueError("source_dir is not a directory: %s" % source_dir) source_commit = _read_source_commit(source_dir, source_commit) if not source_commit: raise ValueError("source_commit must not be empty") captured_at = captured_at or datetime.now(timezone.utc) if captured_at.tzinfo is None: raise ValueError("captured_at must be timezone-aware") captured_at = captured_at.astimezone(timezone.utc) timestamp = captured_at.strftime("%Y%m%dT%H%M%SZ") snapshot_name = "%s-%s-%s" % ( timestamp, _slug(name), _slug(source_commit)[:12]) experiments_dir = Path(experiments_dir).resolve() experiments_dir.mkdir(parents=True, exist_ok=True) destination = experiments_dir / snapshot_name temporary = experiments_dir / ("." + snapshot_name + ".tmp") if destination.exists() or temporary.exists(): raise FileExistsError("Experiment snapshot already exists: %s" % destination) temporary.mkdir() artifacts_dir = temporary / "artifacts" artifacts_dir.mkdir() data_dir = temporary / "data" data_dir.mkdir() inventory = [] for source_path in sorted(path for path in source_dir.rglob("*") if path.is_file()): relative_path = source_path.relative_to(source_dir) role = _artifact_role(relative_path.as_posix()) size = source_path.stat().st_size copied = _copy_role(role) and ( size <= max_copy_bytes or _copy_regardless_of_size(role)) storage = "inventory_only" if copied: target = artifacts_dir / relative_path target.parent.mkdir(parents=True, exist_ok=True) storage = _copy_artifact(source_path, target) inventory.append({ "relative_path": relative_path.as_posix(), "role": role, "size_bytes": size, "sha256": sha256_file(source_path), "copied": copied, "storage": storage, }) training_tables = export_training_tables(source_dir, data_dir) _write_csv( temporary / "source_files.csv", inventory, ( "relative_path", "role", "size_bytes", "sha256", "copied", "storage", ), ) _write_csv( temporary / "external_inputs.csv", _external_hash_records(source_dir), ("path", "recorded_sha256", "recorded_in"), ) supplemental = [] for role, paths in (("command", command_files), ("input", input_files)): resolved_paths = [Path(value).resolve() for value in paths] basenames = [path.name for path in resolved_paths] disambiguate = len(basenames) != len(set(basenames)) for index, path in enumerate(resolved_paths): if not path.is_file(): raise ValueError("%s file does not exist: %s" % (role, path)) record = { "role": role, "path": str(path), "size_bytes": path.stat().st_size, "sha256": sha256_file(path), "copied": path.stat().st_size <= max_copy_bytes, } if record["copied"]: target_name = ( "%03d-%s" % (index, path.name) if disambiguate else path.name ) target = temporary / "supplemental" / role / target_name target.parent.mkdir(parents=True, exist_ok=True) shutil.copy2(path, target) record["snapshot_path"] = target.relative_to(temporary).as_posix() supplemental.append(record) source_archive_record = None if source_archive: archive = Path(source_archive).resolve() if not archive.is_file(): raise ValueError("source_archive is not a file: %s" % archive) target = temporary / "source" / archive.name target.parent.mkdir() shutil.copy2(archive, target) source_archive_record = { "path": str(archive), "snapshot_path": target.relative_to(temporary).as_posix(), "size_bytes": archive.stat().st_size, "sha256": sha256_file(archive), } experiment = { "schema_version": SCHEMA_VERSION, "name": name, "captured_at_utc": captured_at.isoformat().replace("+00:00", "Z"), "source_commit": source_commit, "collector_commit": collector_commit or _collector_commit(), "source_dir": str(source_dir), "source_archive": source_archive_record, "training_tables": training_tables, "source_file_count": len(inventory), "copied_source_file_count": sum(row["copied"] for row in inventory), "supplemental_files": supplemental, } (temporary / "experiment.json").write_text( json.dumps(experiment, indent=2, sort_keys=True) + "\n") (temporary / "environment.json").write_text( json.dumps(_environment_record(), indent=2, sort_keys=True) + "\n") (temporary / "README.md").write_text( "\n".join([ "# %s" % name, "", "- Captured: `%s`" % experiment["captured_at_utc"], "- Training source commit: `%s`" % source_commit, "- Snapshot collector commit: `%s`" % ( experiment["collector_commit"] or "unavailable"), "- Original output: `%s`" % source_dir, "", "`data/training_history.csv` is the tidy per-epoch table used to " "rebuild learning-curve plots. `data/models.csv`, `data/fits.csv`, " "and `data/model_configs.jsonl` preserve model and fit metadata. " "Comparison tables, telemetry, configs, manifests, and logs are " "under `artifacts/`. Held-out prediction tables and generated " "figures are copied there even when prediction files exceed the " "ordinary artifact-size threshold. Prediction tables are copied, " "not hard-linked, so later changes to a live run cannot mutate " "the snapshot. Storage mode is recorded in `source_files.csv`.", "", "`source_files.csv` inventories every original artifact by SHA256. " "Weights and per-model training tables below the configured copy-size " "limit are retained; larger files remain checksummed in the inventory. " "`external_inputs.csv` preserves hashes recorded by the runner. " "`environment.json` records the capture environment.", "", "To reconstruct, check out the training source commit, verify input " "and weight hashes against the inventories, then use a preserved " "command file from `supplemental/command/` or `artifacts/command.sh`.", "", "Rebuild learning curves with `mhcflurry train plot-loss-curves` " "against a copied model manifest. Rebuild comparison plots and a " "review PDF with `mhcflurry plot-model-comparison --input " "artifacts/ --summary-pdf `.", "", ])) temporary.rename(destination) return destination mhcflurry-2.3.6/mhcflurry/fasta.py000066400000000000000000000110731525677230600172370ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Adapted from pyensembl, github.com/openvax/pyensembl Original implementation by Alex Rubinsteyn. The worse sin in bioinformatics is to write your own FASTA parser. We're doing this to avoid adding another dependency to MHCflurry, however. """ from gzip import GzipFile import logging import pandas def read_fasta_to_dataframe(filename, full_descriptions=False): """ Parse a fasta file to a pandas DataFrame. Parameters ---------- filename : string full_descriptions : bool If true, instead of returning sequence IDs (the first space-separated token), return the full description associated with each record. Returns ------- pandas.DataFrame with columns "sequence_id" and "sequence". """ reader = FastaParser() rows = reader.iterate_over_file( filename, full_descriptions=full_descriptions) return pandas.DataFrame( rows, columns=["sequence_id", "sequence"]) class FastaParser(object): """ FastaParser object consumes lines of a FASTA file incrementally. """ def __init__(self): self.current_id = None self.current_lines = [] def iterate_over_file(self, fasta_path, full_descriptions=False): """ Generator that yields identifiers paired with sequences. """ with self.open_file(fasta_path) as f: for line in f: line = line.rstrip() if len(line) == 0: continue # have to slice into a bytes object or else get a single integer first_char = line[0:1] if first_char == b">": previous_entry = self._current_entry() self.current_id = self._parse_header_id( line, full_description=full_descriptions) if len(self.current_id) == 0: logging.warning( "Unable to parse ID from header line: %s", line) self.current_lines = [] if previous_entry is not None: yield previous_entry elif first_char == b";": # semicolon are comment characters continue else: self.current_lines.append(line) # the last sequence is still in the lines buffer after we're done with # the file so make sure to yield it id_and_seq = self._current_entry() if id_and_seq is not None: yield id_and_seq def _current_entry(self): # when we hit a new entry, if this isn't the first # entry of the file then put the last one in the dictionary if self.current_id: if len(self.current_lines) == 0: logging.warning("No sequence data for '%s'", self.current_id) else: sequence = b"".join(self.current_lines).decode("ascii") return self.current_id, sequence @staticmethod def open_file(fasta_path): """ Open either a text file or compressed gzip file as a stream of bytes. """ if fasta_path.endswith("gz") or fasta_path.endswith("gzip"): return GzipFile(fasta_path, 'rb') else: return open(fasta_path, 'rb') @staticmethod def _parse_header_id(line, full_description=False): """ Pull the transcript or protein identifier from the header line which starts with '>' """ if type(line) is not bytes: raise TypeError("Expected header line to be of type %s but got %s" % ( bytes, type(line))) if len(line) <= 1: raise ValueError("No identifier on FASTA line") # split line at first space to get the unique identifier for # this sequence space_index = line.find(b" ") if space_index >= 0 and not full_description: identifier = line[1:space_index] else: identifier = line[1:] return identifier.decode("ascii") mhcflurry-2.3.6/mhcflurry/flanking_encoding.py000066400000000000000000000332311525677230600216000ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Class for encoding variable-length flanking and peptides to fixed-size numerical matrices """ from collections import namedtuple import logging from . import amino_acid from .encodable_sequences import EncodingError, EncodableSequences import numpy import pandas EncodingResult = namedtuple( "EncodingResult", ["array", "peptide_lengths", "unsupported_mask"], defaults=(None,)) class FlankingEncoding(object): """ Encode peptides and optionally their N- and C-flanking sequences into fixed size numerical matrices. Similar to EncodableSequences but with support for flanking sequences and the encoding scheme used by the processing predictor. Instances of this class have an immutable list of peptides with flanking sequences. Encodings are cached in the instances for faster performance when the same set of peptides needs to be encoded more than once. """ unknown_character = "X" def __init__(self, peptides, n_flanks, c_flanks): """ Constructor. Sequences of any lengths can be passed. Parameters ---------- peptides : list of string Peptide sequences n_flanks : list of string [same length as peptides] Upstream sequences c_flanks : list of string [same length as peptides] Downstream sequences """ self.dataframe = pandas.DataFrame({ "peptide": peptides, "n_flank": n_flanks, "c_flank": c_flanks, }, dtype=str) self.encoding_cache = {} self.tensor_cache = {} def __getstate__(self): """Drop device tensors when pickling.""" state = self.__dict__.copy() state["tensor_cache"] = {} return state def __len__(self): """ Number of peptides. """ return len(self.dataframe) def clear_tensor_cache(self): """Release cached torch tensors held by this encoding.""" self.tensor_cache.clear() def vector_encode( self, vector_encoding_name, peptide_max_length, n_flank_length, c_flank_length, allow_unsupported_amino_acids=True, throw=True): """ Encode variable-length sequences to a fixed-size dense matrix. DEPRECATED (scheduled for removal): the processing model always index-encodes sequences ((N, L) int8) and embeds on device. This dense ``(N, L, V)`` encoder has no remaining caller — use ``categorical_encode`` (or ``categorical_encode_tensors``) instead. Parameters ---------- vector_encoding_name : string How to represent amino acids. One of "BLOSUM62", "one-hot", etc. See `amino_acid.available_vector_encodings()`. peptide_max_length : int Maximum supported peptide length. n_flank_length : int Maximum supported N-flank length c_flank_length : int Maximum supported C-flank length allow_unsupported_amino_acids : bool If True, non-canonical amino acids will be replaced with the X character before encoding. throw : bool Whether to raise exception on unsupported peptides Returns ------- numpy.array with shape (num sequences, length, m) where - num sequences is number of peptides, i.e. len(self) - length is peptide_max_length + n_flank_length + c_flank_length - m is the vector encoding length (usually 21). """ cache_key = ( "vector_encode", vector_encoding_name, peptide_max_length, n_flank_length, c_flank_length, allow_unsupported_amino_acids, throw) if cache_key not in self.encoding_cache: result = self.encode( vector_encoding_name=vector_encoding_name, df=self.dataframe, peptide_max_length=peptide_max_length, n_flank_length=n_flank_length, c_flank_length=c_flank_length, allow_unsupported_amino_acids=allow_unsupported_amino_acids, throw=throw) self.encoding_cache[cache_key] = result return self.encoding_cache[cache_key] def categorical_encode( self, peptide_max_length, n_flank_length, c_flank_length, allow_unsupported_amino_acids=True, throw=True): """ Encode variable-length sequences to fixed-size amino-acid indices. This mirrors :meth:`vector_encode` but stops before expanding amino acids to dense vector encodings. The resulting integer array is suited for torch-side embedding lookup. """ cache_key = ( "categorical_encode", peptide_max_length, n_flank_length, c_flank_length, allow_unsupported_amino_acids, throw) if cache_key not in self.encoding_cache: result = self.encode_indices( df=self.dataframe, peptide_max_length=peptide_max_length, n_flank_length=n_flank_length, c_flank_length=c_flank_length, allow_unsupported_amino_acids=allow_unsupported_amino_acids, throw=throw) self.encoding_cache[cache_key] = result return self.encoding_cache[cache_key] def categorical_encode_tensors( self, peptide_max_length, n_flank_length, c_flank_length, device, allow_unsupported_amino_acids=True, throw=True): """ Encode variable-length sequences to cached torch tensors. The CPU numpy encoding remains the source of truth. This method keeps a device-resident view/copy keyed by encoding parameters and device so repeated processing models can slice the same tensors without per-batch host-to-device transfers. """ import torch device = torch.device(device) if device.type == "cuda" and device.index is None: device = torch.device("cuda", torch.cuda.current_device()) cache_key = ( "categorical_encode_tensors", peptide_max_length, n_flank_length, c_flank_length, allow_unsupported_amino_acids, throw, device.type, device.index) if cache_key not in self.tensor_cache: encoded = self.categorical_encode( peptide_max_length=peptide_max_length, n_flank_length=n_flank_length, c_flank_length=c_flank_length, allow_unsupported_amino_acids=allow_unsupported_amino_acids, throw=throw) sequence_array = encoded.array if not sequence_array.flags.writeable: sequence_array = sequence_array.copy() peptide_lengths = numpy.asarray(encoded.peptide_lengths) if not peptide_lengths.flags.writeable: peptide_lengths = peptide_lengths.copy() # These transfers are blocking: the source tensors come from # torch.from_numpy(...) and are not pinned, so non_blocking=True # would be a silent no-op. This is a one-time, cached transfer per # cache key (not a per-batch hot path), so pinning the host buffer # to enable an async copy isn't worth the extra staging copy. self.tensor_cache[cache_key] = EncodingResult( array=torch.from_numpy(sequence_array).to(device), peptide_lengths=torch.from_numpy(peptide_lengths).to(device), unsupported_mask=( torch.from_numpy(numpy.asarray( encoded.unsupported_mask, dtype=bool, )).to(device) if encoded.unsupported_mask is not None else None )) return self.tensor_cache[cache_key] @staticmethod def _fixed_length_index_encoding( df, peptide_max_length, n_flank_length, c_flank_length, allow_unsupported_amino_acids=False, throw=True): """ Encode variable-length sequences to a fixed-size matrix. Helper function. Users should use `categorical_encode`. Parameters ---------- df : pandas.DataFrame peptide_max_length : int n_flank_length : int c_flank_length : int allow_unsupported_amino_acids : bool throw : bool Returns a tuple ``(index_array, peptide_lengths, error_df)``. """ df = df.reset_index(drop=True).copy() error_df = df.loc[ (df.peptide.str.len() > peptide_max_length) | (df.peptide.str.len() < 1) ] if len(error_df) > 0: message = ( "Sequence '%s' (length %d) unsupported. There are %d " "total peptides with this length." % ( error_df.iloc[0].peptide, len(error_df.iloc[0].peptide), len(error_df))) if throw: raise EncodingError( message, supported_peptide_lengths=(1, peptide_max_length + 1)) logging.warning(message) # Replace invalid peptides with X's. The encoding will be set to # NaNs for these peptides farther below. df.loc[error_df.index, "peptide"] = "X" * peptide_max_length if n_flank_length > 0: n_flanks = df.n_flank.str.pad( n_flank_length, side="left", fillchar="X").str.slice(-n_flank_length).str.upper() else: n_flanks = pandas.Series([""] * len(df), dtype=str) c_flanks = df.c_flank.str.pad( c_flank_length, side="right", fillchar="X").str.slice(0, c_flank_length).str.upper() peptides = df.peptide.str.upper() concatenated = n_flanks + peptides + c_flanks encoder = EncodableSequences.create(concatenated.values) array = encoder.variable_length_to_fixed_length_categorical( alignment_method="right_pad", max_length=n_flank_length + peptide_max_length + c_flank_length, allow_unsupported_amino_acids=allow_unsupported_amino_acids) return (array, peptides.str.len().values, error_df) @staticmethod def encode_indices( df, peptide_max_length, n_flank_length, c_flank_length, allow_unsupported_amino_acids=False, throw=True): """ Encode variable-length sequences to fixed-size amino-acid indices. """ array, peptide_lengths, error_df = FlankingEncoding._fixed_length_index_encoding( df=df, peptide_max_length=peptide_max_length, n_flank_length=n_flank_length, c_flank_length=c_flank_length, allow_unsupported_amino_acids=allow_unsupported_amino_acids, throw=throw) unsupported_mask = numpy.zeros(len(array), dtype=bool) if len(error_df) > 0: unsupported_mask[error_df.index] = True return EncodingResult( array.astype("int8", copy=False), peptide_lengths=peptide_lengths, unsupported_mask=unsupported_mask) @staticmethod def encode( vector_encoding_name, df, peptide_max_length, n_flank_length, c_flank_length, allow_unsupported_amino_acids=False, throw=True): """ Encode variable-length sequences to a fixed-size matrix. Helper function. Users should use `vector_encode`. Parameters ---------- vector_encoding_name : string df : pandas.DataFrame peptide_max_length : int n_flank_length : int c_flank_length : int allow_unsupported_amino_acids : bool throw : bool Returns ------- numpy.array """ index_array, peptide_lengths, error_df = ( FlankingEncoding._fixed_length_index_encoding( df=df, peptide_max_length=peptide_max_length, n_flank_length=n_flank_length, c_flank_length=c_flank_length, allow_unsupported_amino_acids=allow_unsupported_amino_acids, throw=throw)) array = amino_acid.fixed_vectors_encoding( index_array, amino_acid.get_vector_encoding_df(vector_encoding_name)) array = array.astype("float32") # So NaNs can be used. if len(error_df) > 0: array[error_df.index] = numpy.nan unsupported_mask = numpy.zeros(len(array), dtype=bool) if len(error_df) > 0: unsupported_mask[error_df.index] = True result = EncodingResult( array, peptide_lengths=peptide_lengths, unsupported_mask=unsupported_mask) return result mhcflurry-2.3.6/mhcflurry/histogram_percent_rank_transform.py000066400000000000000000000223041525677230600247630ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Class for transforming arbitrary values into percent ranks given a distribution. """ import numpy import pandas class HistogramPercentRankTransform(object): """ Historical histogram-based CDF lookup, with preserved bin semantics. The old PercentRankTransform name remains an alias. New predictor calibration defaults to CompactPercentRankTransform; use this class for saved-table compatibility or explicitly selected histogram calibration. Distinct raw scores can share one step value. Use ``survival=True`` for upper-tail percentiles, as required by processing/presentation predictors. """ def __init__(self): self.cdf = None self.bin_edges = None def fit(self, values, bins): """ Fit the transform using the given values (e.g. ic50s). Parameters ---------- values : predictions (e.g. ic50 values) bins : bins for the cumulative distribution function Anything that can be passed to numpy.histogram's "bins" argument can be used here. Returns ------- HistogramPercentRankTransform This fitted instance. Fit a fresh instance for each distribution. """ assert self.cdf is None assert self.bin_edges is None assert len(values) > 0 (hist, self.bin_edges) = numpy.histogram(values, bins=bins) self.cdf = numpy.ones(len(hist) + 3) * numpy.nan self.cdf[0] = 0.0 self.cdf[1] = 0.0 self.cdf[-1] = 100.0 numpy.cumsum(hist * 100.0 / numpy.sum(hist), out=self.cdf[2:-1]) assert not numpy.isnan(self.cdf).any() return self @classmethod def fit_batch_torch(cls, values_2d, bin_edges_1d): """Batched GPU fit across multiple distributions. Equivalent to calling ``fit(values_2d[i], bins=bin_edges_1d)`` for each row i, but vectorized across the row dim — eliminates the per-allele Python loop in calibrate's hot path. Rows with no values inside the bin range are invalid and raise instead of fabricating an empty CDF. Parameters ---------- values_2d : torch.Tensor of shape (n_distributions, n_values). Stays on whatever device it's on; histogram bucketing happens there. bin_edges_1d : torch.Tensor of shape (n_edges,), monotonically increasing. Same device as values_2d. Returns ------- list of HistogramPercentRankTransform One transform per input distribution. Numerically equivalent to the per-row ``numpy.histogram`` path (matching to ≤1e-12, not bit-for-bit -- division/cumsum ordering on CUDA drifts in the last ULPs, far below bin resolution): same bin assignment (right-open intervals, last bin inclusive), same CDF normalization (% out of in-range count), and an identical ``cdf`` array layout (length n_bins+3, sentinels at [0]=[1]=0, [-1]=100, cumsum in [2:-1]). """ import torch assert values_2d.dim() == 2, values_2d.shape assert bin_edges_1d.dim() == 1, bin_edges_1d.shape assert values_2d.device == bin_edges_1d.device n_dist, n_values = values_2d.shape n_edges = int(bin_edges_1d.numel()) n_bins = n_edges - 1 assert n_bins > 0 assert n_values > 0 # numpy.histogram semantics: bins are half-open ``[edges[k], # edges[k+1])`` *except* the last bin which is closed # ``[edges[-2], edges[-1]]``. Values strictly outside the bin # range are dropped (not counted). # # torch.bucketize with right=True returns the first index k such # that edges[k] > value: # value < edges[0] -> 0 # value in [edges[k-1], edges[k]) -> k (1..n_edges-1) # value == edges[-1] -> n_edges (no edge > value) # value > edges[-1] -> n_edges # The "last bin closed" rule means value == edges[-1] is in the # last bin; we recover that by an explicit equality mask. Values # below first edge or strictly above last edge get a weight of 0. indices = torch.bucketize(values_2d, bin_edges_1d, right=True) bin_idx = (indices - 1).clamp(min=0, max=n_bins - 1) in_range_interior = (indices >= 1) & (indices <= n_bins) last_edge_match = (values_2d == bin_edges_1d[-1]) weights = (in_range_interior | last_edge_match).long() # In-place scatter_add fills hist[a, bin_idx[a, p]] += weight[a, p] # vectorized across both axes. hist = torch.zeros(n_dist, n_bins, dtype=torch.long, device=values_2d.device) hist.scatter_add_(1, bin_idx, weights) totals = hist.sum(dim=1, keepdim=True) zero_total = totals == 0 if bool(zero_total.any().item()): rows = torch.nonzero(zero_total.flatten(), as_tuple=False).flatten() raise ValueError( "Cannot fit PercentRankTransform for row(s) with no values " "inside the bin range: %s" % rows.cpu().numpy().tolist() ) math_dtype = ( torch.float32 if values_2d.device.type == "mps" else torch.float64 ) totals = totals.to(math_dtype) cumsum = torch.cumsum(hist.to(math_dtype) * 100.0 / totals, dim=1) cumsum_cpu = cumsum.cpu().numpy() bin_edges_cpu = bin_edges_1d.cpu().numpy() transforms = [] for i in range(n_dist): t = cls() cdf = numpy.empty(n_bins + 3, dtype=numpy.float64) cdf[0] = 0.0 cdf[1] = 0.0 cdf[-1] = 100.0 cdf[2:-1] = cumsum_cpu[i] t.cdf = cdf t.bin_edges = bin_edges_cpu transforms.append(t) return transforms def transform(self, values, survival=False): """ Return percent ranks (range [0, 100]) for the given values. Parameters ---------- values : sequence of float Raw scores. Input NaNs become output NaNs. survival : bool, default False False returns the historical CDF lookup. True returns 100 minus that lookup, retaining the historical upper-tail behavior. Returns ------- numpy.ndarray Percentiles using the saved histogram, without interpolation. """ assert self.cdf is not None assert self.bin_edges is not None indices = numpy.searchsorted(self.bin_edges, values) result = self.cdf[indices] assert len(result) == len(values) # NaNs in input become NaNs in output result[numpy.isnan(values)] = numpy.nan result = numpy.minimum(result, 100.0) return 100.0 - result if survival else result def to_dict(self): """Serialize without the NaN sentinels used in the historical CSV index.""" return dict(format="histogram-cdf-v1", cdf=self.cdf.tolist(), bin_edges=self.bin_edges.tolist()) @classmethod def from_dict(cls, values): """Restore a versioned histogram transform.""" if values.get("format") != "histogram-cdf-v1": raise ValueError("Unsupported histogram-percentile format") result = cls() result.cdf = numpy.asarray(values["cdf"], dtype=float) result.bin_edges = numpy.asarray(values["bin_edges"], dtype=float) if (result.bin_edges.ndim != 1 or result.cdf.ndim != 1 or len(result.bin_edges) < 2 or len(result.cdf) != len(result.bin_edges) + 2 or not numpy.isfinite(result.cdf).all() or numpy.isnan(result.bin_edges).any() or numpy.any(numpy.diff(result.bin_edges) < 0) or numpy.any(numpy.diff(result.cdf) < -1e-10)): raise ValueError("Invalid histogram percentile arrays") return result def to_series(self): """ Serialize the fit to a pandas.Series. The index on the series gives the bin edges and the values give the CDF. Returns ------- pandas.Series """ return pandas.Series( self.cdf, index=[numpy.nan] + list(self.bin_edges) + [numpy.nan]) @staticmethod def from_series(series): """ Deserialize a histogram transform from a pandas.Series, as returned by `to_series()`. Parameters ---------- series : pandas.Series Returns ------- HistogramPercentRankTransform """ result = HistogramPercentRankTransform() result.cdf = series.values result.bin_edges = series.index.values[1:-1] return result mhcflurry-2.3.6/mhcflurry/hyperparameters.py000066400000000000000000000101371525677230600213540ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Hyperparameter (neural network options) management """ import itertools class HyperparameterDefaults(object): """ Class for managing hyperparameters. Thin wrapper around a dict. Instances of this class are a specification of the hyperparameters *supported* by a model and their defaults. The particular hyperparameter settings to be used, for example, to train a model are kept in plain dicts. """ def __init__(self, **defaults): self.defaults = dict(defaults) def extend(self, other): """ Return a new HyperparameterDefaults instance containing the hyperparameters from the current instance combined with those from other. It is an error if self and other have any hyperparameters in common. """ overlap = [key for key in other.defaults if key in self.defaults] if overlap: raise ValueError( "Duplicate hyperparameter(s): %s" % " ".join(overlap)) new = dict(self.defaults) new.update(other.defaults) return HyperparameterDefaults(**new) def with_defaults(self, obj): """ Given a dict of hyperparameter settings, return a dict containing those settings augmented by the defaults for any keys missing from the dict. """ self.check_valid_keys(obj) obj = dict(obj) for (key, value) in self.defaults.items(): if key not in obj: obj[key] = value return obj def subselect(self, obj): """ Filter a dict of hyperparameter settings to only those keys defined in this HyperparameterDefaults . """ return dict( (key, value) for (key, value) in obj.items() if key in self.defaults) def check_valid_keys(self, obj): """ Given a dict of hyperparameter settings, throw an exception if any keys are not defined in this HyperparameterDefaults instance. """ invalid_keys = [ x for x in obj if x not in self.defaults ] if invalid_keys: raise ValueError( "No such model parameters: %s. Valid parameters are: %s" % (" ".join(invalid_keys), " ".join(self.defaults))) def models_grid(self, **kwargs): ''' Make a grid of models by taking the cartesian product of all specified model parameter lists. Parameters ---------- The valid kwarg parameters are the entries of this HyperparameterDefaults instance. Each parameter must be a list giving the values to search across. Returns ------- list of dict giving the parameters for each model. The length of the list is the product of the lengths of the input lists. ''' # Check parameters self.check_valid_keys(kwargs) for (key, value) in kwargs.items(): if not isinstance(value, list): raise ValueError( "All parameters must be lists, but %s is %s" % (key, str(type(value)))) # Make models, using defaults. parameters = dict( (key, [value]) for (key, value) in self.defaults.items()) parameters.update(kwargs) parameter_names = list(parameters) parameter_values = [parameters[name] for name in parameter_names] models = [ dict(zip(parameter_names, model_values)) for model_values in itertools.product(*parameter_values) ] return models mhcflurry-2.3.6/mhcflurry/keras_optimizers.py000066400000000000000000000116171525677230600215370ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """PyTorch optimizers implementing the historical Keras update equations.""" import math import torch class KerasRMSprop(torch.optim.Optimizer): """RMSprop with Keras' ``sqrt(velocity + epsilon)`` denominator.""" def __init__(self, params, lr=0.001, rho=0.9, epsilon=1e-7): if lr < 0.0: raise ValueError("learning rate must be non-negative") if not 0.0 <= rho < 1.0: raise ValueError("rho must be in [0, 1)") if epsilon < 0.0: raise ValueError("epsilon must be non-negative") super().__init__( params, dict(lr=lr, rho=rho, epsilon=epsilon), ) @torch.no_grad() def step(self, closure=None): """Perform one Keras-compatible RMSprop update.""" loss = None if closure is not None: with torch.enable_grad(): loss = closure() for group in self.param_groups: for parameter in group["params"]: gradient = parameter.grad if gradient is None: continue if gradient.is_sparse: raise RuntimeError("KerasRMSprop does not support sparse gradients") state = self.state[parameter] if not state: state["velocity"] = torch.zeros_like( parameter, memory_format=torch.preserve_format, ) velocity = state["velocity"] velocity.mul_(group["rho"]).addcmul_( gradient, gradient, value=1.0 - group["rho"], ) denominator = velocity.add(group["epsilon"]).sqrt_() parameter.addcdiv_(gradient, denominator, value=-group["lr"]) return loss class KerasAdam(torch.optim.Optimizer): """Adam with Keras' non-adaptive epsilon placement.""" def __init__( self, params, lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-7, ): if lr < 0.0: raise ValueError("learning rate must be non-negative") if not 0.0 <= beta_1 < 1.0: raise ValueError("beta_1 must be in [0, 1)") if not 0.0 <= beta_2 < 1.0: raise ValueError("beta_2 must be in [0, 1)") if epsilon < 0.0: raise ValueError("epsilon must be non-negative") super().__init__( params, dict( lr=lr, beta_1=beta_1, beta_2=beta_2, epsilon=epsilon, ), ) @torch.no_grad() def step(self, closure=None): """Perform one Keras-compatible Adam update.""" loss = None if closure is not None: with torch.enable_grad(): loss = closure() for group in self.param_groups: beta_1 = group["beta_1"] beta_2 = group["beta_2"] for parameter in group["params"]: gradient = parameter.grad if gradient is None: continue if gradient.is_sparse: raise RuntimeError("KerasAdam does not support sparse gradients") state = self.state[parameter] if not state: state["step"] = 0 state["momentum"] = torch.zeros_like( parameter, memory_format=torch.preserve_format, ) state["velocity"] = torch.zeros_like( parameter, memory_format=torch.preserve_format, ) state["step"] += 1 momentum = state["momentum"] velocity = state["velocity"] momentum.lerp_(gradient, 1.0 - beta_1) velocity.mul_(beta_2).addcmul_( gradient, gradient, value=1.0 - beta_2, ) alpha = ( group["lr"] * math.sqrt(1.0 - beta_2 ** state["step"]) / (1.0 - beta_1 ** state["step"]) ) denominator = velocity.sqrt().add_(group["epsilon"]) parameter.addcdiv_(momentum, denominator, value=-alpha) return loss mhcflurry-2.3.6/mhcflurry/local_parallelism.py000066400000000000000000000014241525677230600216170ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Compatibility wrapper for :mod:`mhcflurry.parallelism`.""" from . import parallelism as _parallelism from .parallelism import * # noqa: F403 def __getattr__(name): return getattr(_parallelism, name) __all__ = _parallelism.__all__ mhcflurry-2.3.6/mhcflurry/memory_budget.py000066400000000000000000000122431525677230600210030ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Shared memory-budget calculations for training and inference. Launch-time worker packing and runtime batch sizing must use the same budget. Otherwise each layer can independently claim the same free memory and a plan that looks conservative on paper can still OOM. This module is deliberately free of torch imports so the parent process can size a spawn/fork worker pool without initializing CUDA. """ import math GIB = float(1 << 30) # Keep one shared reserve for CUDA contexts, allocator fragmentation, and # allocations racing between co-resident workers. The reserve is a small # fraction on large accelerators but never disappears on small ones. MEMORY_RESERVE_FRACTION = 0.10 DEVICE_MIN_RESERVE_BYTES = 1 << 30 HOST_MIN_RESERVE_BYTES = 2 << 30 def memory_reserve_bytes( available_bytes, *, min_reserve_bytes=DEVICE_MIN_RESERVE_BYTES, reserve_fraction=MEMORY_RESERVE_FRACTION): """Return the shared reserve to leave outside an automatic plan.""" available_bytes = max(int(available_bytes), 0) if not available_bytes: return 0 reserve = max( int(min_reserve_bytes), int(available_bytes * float(reserve_fraction)), ) return min(reserve, available_bytes) def usable_memory_bytes( available_bytes, *, min_reserve_bytes=DEVICE_MIN_RESERVE_BYTES, reserve_fraction=MEMORY_RESERVE_FRACTION): """Memory an automatic plan may spend after the shared reserve.""" available_bytes = max(int(available_bytes), 0) return max( available_bytes - memory_reserve_bytes( available_bytes, min_reserve_bytes=min_reserve_bytes, reserve_fraction=reserve_fraction, ), 0, ) def per_worker_memory_budget_bytes( available_bytes, num_workers, *, min_reserve_bytes=DEVICE_MIN_RESERVE_BYTES, reserve_fraction=MEMORY_RESERVE_FRACTION): """Split usable memory evenly between co-resident workers.""" return usable_memory_bytes( available_bytes, min_reserve_bytes=min_reserve_bytes, reserve_fraction=reserve_fraction, ) // max(int(num_workers), 1) def memory_worker_capacity( available_gb, per_worker_gb, *, min_reserve_bytes=DEVICE_MIN_RESERVE_BYTES, reserve_fraction=MEMORY_RESERVE_FRACTION): """Return how many complete worker working sets fit in available memory. At least one worker is returned: a caller with a GPU should attempt one worker and let its normal preflight produce the detailed undersized-device warning. There is intentionally no default performance hard cap here. """ available_gb = float(available_gb) per_worker_gb = float(per_worker_gb) if not math.isfinite(available_gb) or not math.isfinite(per_worker_gb): raise ValueError( "Memory capacity inputs must be finite; got available_gb=%r, " "per_worker_gb=%r" % (available_gb, per_worker_gb) ) available_bytes = max(available_gb, 0.0) * GIB per_worker_bytes = max(per_worker_gb, 0.0) * GIB if per_worker_bytes <= 0: return 1 return max( 1, int(usable_memory_bytes( available_bytes, min_reserve_bytes=min_reserve_bytes, reserve_fraction=reserve_fraction, ) // per_worker_bytes), ) def module_tensor_bytes(module): """Return unique parameter and buffer bytes for a torch-like module.""" seen = set() total = 0 tensors = list(module.parameters(recurse=True)) tensors.extend(module.buffers(recurse=True)) for tensor in tensors: try: key = (str(tensor.device), int(tensor.data_ptr())) except RuntimeError: key = id(tensor) if key in seen: continue seen.add(key) total += int(tensor.nelement()) * int(tensor.element_size()) return total def training_module_bytes(module, optimizer_state_copies=2): """Estimate model, gradient, and optimizer-state bytes for training. Parameters and buffers are counted exactly. Trainable parameters also need one gradient tensor and, for Adam/RMSProp-like optimizers, one or more parameter-sized state tensors. The caller supplies that state count. """ parameter_bytes = sum( int(parameter.nelement()) * int(parameter.element_size()) for parameter in module.parameters(recurse=True) ) buffer_bytes = sum( int(buffer.nelement()) * int(buffer.element_size()) for buffer in module.buffers(recurse=True) ) return ( buffer_bytes + parameter_bytes * (2 + max(int(optimizer_state_copies), 0)) ) mhcflurry-2.3.6/mhcflurry/model_provenance.py000066400000000000000000000020071525677230600214560ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Release provenance fields embedded in trained model metadata.""" import os def add_release_provenance(rows, environ=os.environ): """Append release commit/workflow metadata when supplied by a launcher.""" for label, variable in ( ("git commit", "MHCFLURRY_RELEASE_GIT_COMMIT"), ("workflow id", "MHCFLURRY_RELEASE_WORKFLOW_ID")): value = environ.get(variable, "").strip() if value: rows.append((label, value)) return rows mhcflurry-2.3.6/mhcflurry/motif_summary.py000066400000000000000000000306001525677230600210310ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ GPU motif-summary helpers used by the fast percentile-rank calibration path. These are stateless tensor/numpy routines: given a chunk of predicted IC50s for a set of (allele, peptide) pairs, they reproduce the per-allele ``DataFrame(...).drop_duplicates().groupby('length').nsmallest(...)`` motif summary (top-binder amino-acid frequency matrices + length distributions) of the legacy slow path, but vectorized on the calibration device. They live in their own module — rather than on :class:`~mhcflurry.class1_affinity_predictor.Class1AffinityPredictor` — because they hold no predictor state and are unit-tested in isolation (see ``test/test_calibrate_percentile_ranks_fast.py``). The predictor only orchestrates: it builds the per-worker state once via :func:`prepare_motif_summary_state_gpu` and then calls :func:`motif_summary_chunk_gpu` per allele chunk. """ import numpy import pandas from .amino_acid import AMINO_ACID_INDEX, AMINO_ACIDS def prepare_motif_summary_state_gpu(encoded_peptides, device): """One-time setup for GPU motif_summary; lifts the per-allele ``drop_duplicates`` + length-bucket + AA-encoding work out of the calibrate chunk loop so each chunk is pure tensor math. Returns ------- dict Device-resident tensors and their unique-peptide count: - ``unique_idx_t``: (n_unique,) long first-occurrence indices into the full peptide list. Selecting columns from ``ic50_device`` reproduces ``drop_duplicates('peptide')`` semantics (first row wins). - ``length_groups``: dict[L] of (n_at_L,) long indices into the unique peptide axis for peptides of length L. - ``aa_codes_per_length``: dict[L] of (n_at_L, L) long tensors of amino acid index codes, matching ``AMINO_ACID_INDEX`` (X = 20). - ``unique_lengths_t``: (n_unique,) long peptide lengths, used for the per-allele length distribution. - ``n_unique``: integer count of unique peptides. """ import torch seqs = list(encoded_peptides.sequences) seen = set() unique_idx = [] for i, s in enumerate(seqs): if s not in seen: seen.add(s) unique_idx.append(i) unique_idx = numpy.asarray(unique_idx, dtype=numpy.int64) unique_seqs = [seqs[i] for i in unique_idx] lengths = numpy.fromiter( (len(p) for p in unique_seqs), dtype=numpy.int64, count=len(unique_seqs), ) unique_lengths_t = torch.from_numpy(lengths).to(device) unique_idx_t = torch.from_numpy(unique_idx).to(device) # ASCII -> AA-index lookup so the per-residue encoding is one # vectorized numpy gather instead of 8M Python ops over 800k # peptides. Unknown bytes map to X and the X bucket is dropped # from the final 20-column matrix, matching # positional_frequency_matrix's treatment of non-common letters. ascii_lut = numpy.full( 256, AMINO_ACID_INDEX["X"], dtype=numpy.int64, ) for letter, idx in AMINO_ACID_INDEX.items(): if len(letter) == 1: ascii_lut[ord(letter)] = idx length_groups = {} aa_codes_per_length = {} for L_np in numpy.unique(lengths): L = int(L_np) sel = numpy.where(lengths == L)[0].astype(numpy.int64) n_at_L = int(sel.shape[0]) joined = "".join(unique_seqs[i] for i in sel).encode("ascii") byte_arr = numpy.frombuffer( joined, dtype=numpy.uint8, ).reshape(n_at_L, L) codes = ascii_lut[byte_arr] # (n_at_L, L) int64 length_groups[L] = torch.from_numpy(sel).to(device) aa_codes_per_length[L] = torch.from_numpy( numpy.ascontiguousarray(codes), ).to(device) return { "unique_idx_t": unique_idx_t, "length_groups": length_groups, "aa_codes_per_length": aa_codes_per_length, "unique_lengths_t": unique_lengths_t, "n_unique": int(unique_idx.shape[0]), } def topk_first_tie_indices(values, k): """Return k smallest column indices per row with pandas tie semantics. ``torch.topk`` is fast but does not promise which entries it returns when the kth value is tied. Pandas ``Series.nsmallest`` defaults to ``keep='first'``; after ``drop_duplicates('peptide')``, "first" means lower position on the unique-peptide axis. Keep the fast ``topk`` path for normal continuous predictions and repair only rows whose cutoff falls inside an exact tie block. """ import torch n = int(values.shape[1]) if k >= n: return torch.arange( n, dtype=torch.long, device=values.device, ).expand(int(values.shape[0]), n) top = torch.topk(values, k, dim=1, largest=False, sorted=False) top_idx = top.indices boundary = top.values.max(dim=1).values.unsqueeze(1) lt_counts = (values < boundary).sum(dim=1) eq_counts = (values == boundary).sum(dim=1) tie_needed = k - lt_counts tied_cutoff_rows = eq_counts > tie_needed if not bool(tied_cutoff_rows.any().item()): return top_idx top_idx = top_idx.clone() row_ids = torch.nonzero( tied_cutoff_rows, as_tuple=False, ).flatten() row_values = values.index_select(0, row_ids) row_boundary = boundary.index_select(0, row_ids) row_lt = row_values < row_boundary row_eq = row_values == row_boundary row_tie_needed = tie_needed.index_select(0, row_ids).unsqueeze(1) eq_rank = row_eq.to(torch.int64).cumsum(dim=1) selected = row_lt | (row_eq & (eq_rank <= row_tie_needed)) stable_idx = selected.nonzero(as_tuple=False)[:, 1].reshape( int(row_ids.numel()), k, ) top_idx[row_ids] = stable_idx return top_idx def motif_summary_chunk_gpu( ic50_device, state, summary_top_peptide_fractions, batch_alleles): """GPU motif_summary for one allele chunk. Replaces the per-allele ``DataFrame(...).drop_duplicates().groupby('length').nsmallest(...)`` block in the fast path with vectorized tensor ops: * ``torch.topk(largest=False)`` selects top-k tightest binders per (allele, length), with a small tie repair to match pandas ``nsmallest(keep='first')`` at exact cutoff ties. * AA frequency matrices are computed by gathering precomputed per-length AA-code tensors and ``scatter_add`` into a one-hot counts buffer of shape ``(a_size, L, 21)``; pandas only assembles the final per-row schema. * Length distributions are ``topk`` over the full unique-peptide axis followed by a per-row ``scatter_add`` (a row-wise ``bincount``). All math runs on the calibration device; per-batch ``.cpu()`` transfers happen once per (cutoff_fraction, length) at chunk-end instead of inside the per-allele Python loop, and pandas only stamps the persistent per-row schema on the consolidated per-block tensors. Returns ``(freq_matrix_dfs, length_dist_dfs)`` — lists of ``pandas.DataFrame`` matching the legacy slow path's per-row schema, ready to ``pandas.concat`` once all chunks are done. """ import torch a_size = len(batch_alleles) device = ic50_device.device count_dtype = torch.float32 if device.type == "mps" else torch.float64 n_unique = state["n_unique"] # AMINO_ACIDS = COMMON_AMINO_ACIDS_WITH_UNKNOWN keys, alphabetical # then X — first 20 entries are the BLOSUM62-ordered non-X rows # the legacy ``positional_frequency_matrix`` returns. aa_columns = AMINO_ACIDS[:20] ic50_unique = ic50_device.index_select(1, state["unique_idx_t"]) # Stage 1 (Torch on device): build all freq + length-dist tensors. # Each entry is (cutoff_fraction, k, L, freq_t (a_size, L, 20)). freq_tensors = [] # Each entry is (cutoff_fraction, k_total, length_fractions_t (a_size, max_len_p1)). length_fraction_tensors = [] for cutoff_fraction in summary_top_peptide_fractions: for L, idx_in_unique in state["length_groups"].items(): n_at_L = int(idx_in_unique.numel()) k = min(max(int(n_at_L * cutoff_fraction), 1), n_at_L) ic50_L = ic50_unique.index_select(1, idx_in_unique) top_idx = topk_first_tie_indices( ic50_L, k, ) # (a_size, k) codes = state["aa_codes_per_length"][L] # (n_at_L, L) long selected_codes = codes[top_idx] # (a_size, k, L) long # Permute to (a_size, L, k) so scatter_add packs counts # along the last (AA) axis. We allocate 21 AA slots to # absorb X (index 20) and discard the X column at the # end — this matches the legacy semantics where # ``positional_frequency_matrix``'s row index excludes X # while the divisor stays at ``k`` (so positions with # any X residues sum to <1 across the 20 columns). scatter_dst = selected_codes.permute(0, 2, 1) counts = torch.zeros( a_size, L, 21, dtype=count_dtype, device=device, ) counts.scatter_add_( 2, scatter_dst, torch.ones_like(scatter_dst, dtype=count_dtype), ) freq_t = counts[:, :, :20] / float(k) # device tensor freq_tensors.append( (float(cutoff_fraction), int(k), int(L), freq_t), ) k_total = min(max(int(n_unique * cutoff_fraction), 1), n_unique) top_full_idx = topk_first_tie_indices( ic50_unique, k_total, ) # (a_size, k_total) lengths_per_topk = state["unique_lengths_t"][top_full_idx] max_len_p1 = int(state["unique_lengths_t"].max().item()) + 1 length_counts = torch.zeros( a_size, max_len_p1, dtype=count_dtype, device=device, ) length_counts.scatter_add_( 1, lengths_per_topk, torch.ones_like(lengths_per_topk, dtype=count_dtype), ) length_fractions_t = length_counts / float(k_total) length_fraction_tensors.append( (float(cutoff_fraction), int(k_total), length_fractions_t), ) # Stage 2 (single device→host transfer per logical block): build # one wide-format pandas DataFrame per (cutoff_fraction, L) in # one shot — the per-allele Python loop is replaced by a flat # reshape + numpy.repeat for the allele/position axes. batch_alleles_arr = numpy.asarray(batch_alleles) freq_matrices = [] for cutoff_fraction, k, L, freq_t in freq_tensors: freq_arr = freq_t.cpu().numpy() # (a_size, L, 20) row_count = a_size * L wide = freq_arr.reshape(row_count, 20) row_metadata = pandas.DataFrame( { "allele": numpy.repeat(batch_alleles_arr, L), "length": numpy.full(row_count, L, dtype=numpy.int64), "cutoff_fraction": numpy.full(row_count, cutoff_fraction), "cutoff_count": numpy.full(row_count, k, dtype=numpy.int64), "position": numpy.tile(numpy.arange(1, L + 1), a_size), } ) df = pandas.concat( [row_metadata, pandas.DataFrame(wide, columns=aa_columns)], axis=1, ) freq_matrices.append(df) length_dists = [] for cutoff_fraction, k_total, length_fractions_t in length_fraction_tensors: length_fractions = length_fractions_t.cpu().numpy() a_idx, l_idx = numpy.where(length_fractions > 0) if a_idx.size == 0: continue ld = pandas.DataFrame({ "allele": batch_alleles_arr[a_idx], "cutoff_fraction": cutoff_fraction, "cutoff_count": k_total, "length": l_idx.astype(numpy.int64), "fraction": length_fractions[a_idx, l_idx], })[[ "allele", "cutoff_fraction", "cutoff_count", "length", "fraction", ]].sort_values( ["allele", "cutoff_fraction", "length"] ).reset_index(drop=True) length_dists.append(ld) return freq_matrices, length_dists mhcflurry-2.3.6/mhcflurry/numeric_proteome.py000066400000000000000000000247331525677230600215240ustar00rootroot00000000000000"""Reusable numeric processing candidates; strings are an export operation.""" from dataclasses import dataclass import numpy import pandas import torch from .amino_acid import AMINO_ACID_INDEX, COMMON_AMINO_ACIDS from .numeric_sequences import NumericSequences, UNKNOWN_INDEX from .proteome_decoys import PROTEOME_PEPTIDE_COLUMNS, unique_in_order MAX_PROCESSING_LENGTH = 11 def sequence_keys(indices): """Collision-free fixed-width numeric identity, including X padding.""" indices = numpy.ascontiguousarray(indices, dtype="int8") if indices.ndim != 2 or indices.shape[1] != MAX_PROCESSING_LENGTH: raise ValueError("Processing identities require eleven numeric columns") return indices.view("V%d" % MAX_PROCESSING_LENGTH).ravel() class ProcessingProteome: """Encode source proteins once; sample numeric positions and gather on device. CPU sampling preserves the historical eligible-window population and RNG stream when passed an equivalent ``numpy.random.RandomState``. A device copy is created lazily by the scoring owner, never by CPU preparation threads. """ def __init__(self, sequences): self.accessions = list(sequences) self.sequences = list(sequences.values()) self.accession_index = {name: i for i, name in enumerate(self.accessions)} self.lengths = numpy.asarray([len(s) for s in self.sequences], dtype="int64") self.offsets = numpy.r_[0, numpy.cumsum(self.lengths)] lookup = numpy.full(256, -1, dtype="int8") for letter in COMMON_AMINO_ACIDS: lookup[ord(letter)] = AMINO_ACID_INDEX[letter] encoded = [lookup[numpy.frombuffer(s.encode("ascii", errors="replace"), dtype="uint8")] for s in self.sequences] self.residues = numpy.concatenate(encoded) if encoded else numpy.empty(0, dtype="int8") self.invalid_prefix = [numpy.r_[0, numpy.cumsum(row < 0)] for row in encoded] self._devices = {} def raw_rows(self, proteins, starts, lengths): """Gather CPU numeric identities for filtering without string creation.""" if not len(starts): return numpy.empty((0, MAX_PROCESSING_LENGTH), dtype="int8") columns = numpy.arange(MAX_PROCESSING_LENGTH) positions = self.offsets[proteins, None] + starts[:, None] + columns return numpy.where(columns < lengths[:, None], self.residues[positions.clip(0, len(self.residues) - 1)], UNKNOWN_INDEX) def gather(self, windows, device="cpu"): """Gather selected peptide rows into Torch directly from encoded proteins.""" if windows.proteome is not self: raise ValueError("Windows belong to a different encoded proteome") device = torch.device(device) key = str(device) if key not in self._devices: self._devices[key] = torch.as_tensor(self.residues, device=device) if not len(windows): return NumericSequences(torch.empty((0, MAX_PROCESSING_LENGTH), dtype=torch.int8, device=device), torch.empty(0, dtype=torch.long, device=device)) starts = torch.as_tensor(self.offsets[windows.proteins] + windows.starts, device=device) lengths = torch.as_tensor(windows.lengths, device=device) columns = torch.arange(MAX_PROCESSING_LENGTH, device=device) positions = starts[:, None] + columns rows = self._devices[key][positions.clamp(0, len(self.residues) - 1)] return NumericSequences(torch.where(columns < lengths[:, None], rows, UNKNOWN_INDEX), lengths) def sample(self, accessions, length, n, excluded, rng): """Draw n eligible windows without replacement, then deduplicate peptides. Exhaustion returns the available population. As in the previous caller, duplicate sequences are removed *after* n position draws, keeping the first retained source position. No peptide/flank strings are constructed. """ if not 1 <= length <= MAX_PROCESSING_LENGTH or n < 0: raise ValueError("Invalid processing window length or count") if n == 0: empty = numpy.empty(0, dtype="int64") return ProteinWindows(self, empty, empty, empty) starts, proteins = [], [] for accession in unique_in_order(accessions): i = self.accession_index[accession] # Preserve the historical excluded final length-mer start. candidates = numpy.arange(max(0, self.lengths[i] - length)) prefix = self.invalid_prefix[i] candidates = candidates[(prefix[candidates + length] - prefix[candidates]) == 0] starts.append(candidates) proteins.append(numpy.full(len(candidates), i, dtype="int64")) starts = numpy.concatenate(starts) if starts else numpy.empty(0, dtype="int64") proteins = numpy.concatenate(proteins) if proteins else numpy.empty(0, dtype="int64") excluded = [p for p in excluded if len(p) == length] excluded_keys = sequence_keys(NumericSequences.from_strings(excluded, MAX_PROCESSING_LENGTH).indices.numpy()) order = rng.permutation(len(starts)) retained = [] remaining = n for offset in range(0, len(order), 65536): if not remaining: break draw = order[offset:offset + 65536] lengths = numpy.full(len(draw), length, dtype="int64") keys = sequence_keys(self.raw_rows(proteins[draw], starts[draw], lengths)) keep = draw[~numpy.isin(keys, excluded_keys)][:remaining] retained.append(keep) remaining -= len(keep) retained = numpy.concatenate(retained) if retained else numpy.empty(0, dtype="int64") result = ProteinWindows(self, proteins[retained], starts[retained], numpy.full(len(retained), length, dtype="int64")) _, first = numpy.unique(result.keys, return_index=True) return result.take(numpy.sort(first)) @dataclass class ProteinWindows: """Selected source positions with collision-free numeric peptide identities. ``proteins``, ``starts`` and ``lengths`` are equally sized one-dimensional integer arrays. Starts are zero-based; each window must fit its protein and have a length between one and ``MAX_PROCESSING_LENGTH``. """ proteome: ProcessingProteome proteins: numpy.ndarray starts: numpy.ndarray lengths: numpy.ndarray def __post_init__(self): for name in ("proteins", "starts", "lengths"): values = numpy.asarray(getattr(self, name)) if values.ndim != 1 or (values.size and values.dtype.kind not in "iu"): raise ValueError("Window positions and lengths must be integer vectors") setattr(self, name, values.astype("int64", copy=True)) if not (len(self.proteins) == len(self.starts) == len(self.lengths)): raise ValueError("Window position vectors have different lengths") if ((self.proteins < 0) | (self.proteins >= len(self.proteome.lengths))).any(): raise ValueError("Window refers to an unknown protein index") if ((self.starts < 0) | (self.lengths < 1) | (self.lengths > MAX_PROCESSING_LENGTH) | (self.starts > self.proteome.lengths[self.proteins] - self.lengths)).any(): raise ValueError("Window lies outside its protein or supported peptide lengths") def __len__(self): return len(self.starts) @property def keys(self): return sequence_keys(self.proteome.raw_rows(self.proteins, self.starts, self.lengths)) def take(self, rows): return type(self)(self.proteome, self.proteins[rows], self.starts[rows], self.lengths[rows]) @classmethod def concatenate(cls, parts): if not parts or any(part.proteome is not parts[0].proteome for part in parts): raise ValueError("Window batches must share one encoded proteome") return cls(parts[0].proteome, *(numpy.concatenate([getattr(p, attr) for p in parts]) for attr in ("proteins", "starts", "lengths"))) def to_frame(self, flank_length): """Construct sequence/flank strings only when exporting scored artifacts.""" if not isinstance(flank_length, (int, numpy.integer)) or flank_length < 0: raise ValueError("Flank length must be a nonnegative integer") rows = [] for protein, start, length in zip(self.proteins, self.starts, self.lengths): sequence = self.proteome.sequences[protein] end = start + length rows.append((self.proteome.accessions[protein], sequence[start:end], sequence[max(0, start - flank_length):start].rjust(flank_length, "X"), sequence[end:end + flank_length].ljust(flank_length, "X"), start)) return pandas.DataFrame.from_records(rows, columns=PROTEOME_PEPTIDE_COLUMNS) class NumericCandidatePool: """Observed rows plus numeric negatives, ready for scoring then export.""" def __init__(self, hits, windows, sample, flank_length): self.hits = hits self.windows = windows self.sample = sample self.flank_length = flank_length self.hit_peptides = NumericSequences.from_strings(hits.peptide, MAX_PROCESSING_LENGTH) keys = numpy.r_[sequence_keys(self.hit_peptides.indices.numpy()), windows.keys] _, first, inverse = numpy.unique(keys, return_index=True, return_inverse=True) order = numpy.argsort(first) self.unique_rows = first[order] self.inverse = numpy.argsort(order)[inverse] def prediction_input(self, device): """Use the scoring owner's device; no strings or host round trip.""" candidates = self.windows.proteome.gather(self.windows, device) return NumericSequences(torch.cat([self.hit_peptides.indices.to(device), candidates.indices]), torch.cat([self.hit_peptides.lengths.to(device), candidates.lengths])).take(self.unique_rows) def with_scores(self, values): """Export a scored pool in the established observed-then-decoy order.""" values = numpy.asarray(values) if values.shape != (len(self.unique_rows),): raise ValueError("Numeric candidate score count mismatch") negatives = self.windows.to_frame(self.flank_length).drop(columns="start_position") negatives["hit"] = 0 frame = pandas.concat([self.hits, negatives], ignore_index=True, sort=False) frame["sample_id"] = self.sample frame["affinity_prediction"] = values[self.inverse] return frame mhcflurry-2.3.6/mhcflurry/numeric_sequences.py000066400000000000000000000152741525677230600216650ustar00rootroot00000000000000"""String-free peptide inputs with the existing class-I alignment semantics.""" import numpy import torch from .amino_acid import AMINO_ACID_INDEX from .encodable_sequences import EncodingError UNKNOWN_INDEX = AMINO_ACID_INDEX["X"] class NumericSequences: """Unaligned integer residue rows and actual lengths, on CPU or accelerator. Parameters ---------- indices : array-like or torch.Tensor Shape (N, width); entries index ``AMINO_ACID_INDEX``. Padding is ignored. lengths : array-like or torch.Tensor N integer lengths between zero and width. """ def __init__(self, indices, lengths): indices = torch.as_tensor(indices) lengths = torch.as_tensor(lengths, device=indices.device) integers = (torch.uint8, torch.int8, torch.int16, torch.int32, torch.int64) if indices.ndim != 2 or lengths.ndim != 1 or len(indices) != len(lengths): raise ValueError("Numeric peptides require an (N, width) matrix and N lengths") if indices.dtype not in integers or lengths.dtype not in integers: raise ValueError("Numeric peptide indices and lengths must be integers") if ((lengths < 0) | (lengths > indices.shape[1])).any(): raise ValueError("Numeric peptide length exceeds its row width") valid = torch.arange(indices.shape[1], device=indices.device)[None, :] < lengths[:, None] if (valid & ((indices < 0) | (indices > UNKNOWN_INDEX))).any(): raise ValueError("Invalid numeric amino-acid index") self.indices = torch.where(valid, indices, UNKNOWN_INDEX).to(torch.int8) self.lengths = lengths.to(torch.int64).clone() def __len__(self): return len(self.lengths) @classmethod def from_strings(cls, sequences, width=None): """Encode existing strings once, with vectorized ASCII lookup.""" sequences = list(sequences) if not all(isinstance(value, str) for value in sequences): raise ValueError("Sequence of strings is required") lengths = numpy.fromiter(map(len, sequences), dtype="int64", count=len(sequences)) width = int(lengths.max()) if width is None and len(lengths) else (width or 0) if len(lengths) and lengths.max() > width: raise ValueError("Sequence length exceeds numeric width") if not width: return cls(numpy.empty((len(sequences), 0), dtype="int8"), lengths) lookup = numpy.full(256, -1, dtype="int8") for letter, index in AMINO_ACID_INDEX.items(): lookup[ord(letter)] = index encoded = numpy.asarray(sequences, dtype="S%d" % width).view("uint8").reshape(-1, width) valid = numpy.arange(width)[None, :] < lengths[:, None] return cls(numpy.where(valid, lookup[encoded], UNKNOWN_INDEX), lengths) def take(self, rows): """Select a vector of integer row indices or a same-length boolean mask.""" rows = torch.as_tensor(rows, device=self.indices.device) if rows.ndim != 1: raise ValueError("Numeric row selection must be one-dimensional") if rows.dtype == torch.bool: if len(rows) != len(self): raise ValueError("Numeric row mask must match sequence count") elif rows.numel() and rows.dtype not in (torch.uint8, torch.int8, torch.int16, torch.int32, torch.int64): raise ValueError("Numeric row indices must be integers") else: rows = rows.to(torch.long) return type(self)(self.indices[rows], self.lengths[rows]) def to_strings(self): """Materialize strings for export or diagnostics, never for scoring.""" alphabet = numpy.full(UNKNOWN_INDEX + 1, b"X", dtype="S1") for letter, index in AMINO_ACID_INDEX.items(): alphabet[index] = letter.upper().encode("ascii") rows = alphabet[self.indices.cpu().numpy()] return numpy.asarray([row.tobytes()[:int(length)].decode("ascii") for row, length in zip(rows, self.lengths.cpu().numpy())]) def aligned_tensor(self, peptide_encoding, device=None): """Gather the exact categorical network input on the requested device.""" method = peptide_encoding.get("alignment_method", "pad_middle") width = int(peptide_encoding.get("max_length", 15)) left = int(peptide_encoding.get("left_edge", 4)) right = int(peptide_encoding.get("right_edge", 4)) trim = peptide_encoding.get("trim", False) if width < 1 or left < 0 or right < 0: raise ValueError("Invalid peptide alignment widths") if trim and method not in ("left_pad", "right_pad"): raise NotImplementedError("trim not supported") minimum = left + right if method == "pad_middle" else ( 1 if method in ("left_pad", "right_pad") else 5) if ((self.lengths < minimum) | ((self.lengths > width) & (not trim))).any(): raise EncodingError("Numeric peptide lengths outside supported range", supported_peptide_lengths=(minimum, width)) data = self.indices.to(device=device or self.indices.device) lengths = self.lengths.to(device=data.device)[:, None] positions = torch.arange(width, device=data.device)[None, :].expand(len(self), -1) if method == "pad_middle": middle_start = left + (width - lengths + 1) // 2 source = torch.where(positions < left, positions, torch.where(positions >= width - right, lengths - right + positions - (width - right), left + positions - middle_start)) valid = ((positions < left) | (positions >= width - right) | ((positions >= middle_start) & (positions < middle_start + lengths - left - right))) elif method in ("left_pad", "right_pad", "left_pad_right_pad", "left_pad_centered_right_pad"): left_aligned = positions right_aligned = positions - (width - lengths) if method == "right_pad": source = left_aligned elif method == "left_pad": source = right_aligned elif method == "left_pad_right_pad": source = torch.cat([left_aligned, right_aligned], dim=1) else: centered = positions - (width - lengths) // 2 source = torch.cat([left_aligned, centered, right_aligned], dim=1) valid = (source >= 0) & (source < lengths) else: raise NotImplementedError("Unsupported alignment method: " + method) if not len(self): return torch.empty(source.shape, dtype=torch.int8, device=data.device) return torch.where(valid, data.gather(1, source.clamp(0, data.shape[1] - 1)), UNKNOWN_INDEX) mhcflurry-2.3.6/mhcflurry/parallelism/000077500000000000000000000000001525677230600200725ustar00rootroot00000000000000mhcflurry-2.3.6/mhcflurry/parallelism/__init__.py000066400000000000000000000072121525677230600222050ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Local parallelism helpers. This package contains the implementation formerly held in ``mhcflurry.local_parallelism``. The old module remains as an import compatibility shim. """ from importlib import import_module _SUBMODULES = ("cli_args", "planning", "torch_compile", "worker_pool", "worker_runtime") _EXPORTS = { name: module for module, names in { "cli_args": ( "add_local_parallelism_args", "add_prediction_parallelism_args", ), "planning": ( "apply_dataloader_num_workers_to_work_items", "apply_random_negative_pool_epochs_to_work_items", "apply_resolved_training_hyperparameters_to_work_items", "auto_dataloader_num_workers", "auto_max_workers_per_gpu", "auto_num_jobs", "auto_random_negative_pool_epochs", "detect_free_vram_per_gpu_gb", "free_vram_per_gpu_from_nvidia_smi_gb", "num_workers_per_gpu_from_args", "refresh_device_memory_budget", "refine_local_parallelism_from_spawn_context", "refine_local_parallelism_from_warmup", "resolve_cpu_thread_budget", "resolve_cpu_threads_per_worker", "resolve_dataloader_num_workers", "resolve_local_parallelism_args", "resolve_max_workers_per_gpu", ), "torch_compile": ( "configure_cluster_worker_torch_compile_threads", "hoist_torchinductor_compile_threads", "resolve_torchinductor_compile_threads_env", "run_single_worker_resource_probe", "run_single_worker_torch_compile_warmup", ), "worker_pool": ( "NonDaemonContext", "NonDaemonPool", "NonDaemonProcess", "NonDaemonSpawnContext", "NonDaemonSpawnProcess", "attach_constant_data_to_work_items_if_needed", "chunk_ranges_for_local_parallelism", "estimate_worker_context_bytes", "refine_local_parallelism_from_worker_context", "make_worker_pool", "non_daemon_context", "validate_worker_pool_args", "worker_pool_uses_fork", "worker_pool_with_gpu_assignments", "worker_pool_with_gpu_assignments_from_args", "worker_init_kwargs_for_scheduler", ), "worker_runtime": ( "WrapException", "call_wrapped", "call_wrapped_kwargs", "worker_init", "worker_init_entry_point", ), }.items() for name in names } __all__ = sorted((*_SUBMODULES, *_EXPORTS)) def __getattr__(name): """Import worker/runtime helpers only when callers request them.""" if name in _SUBMODULES: value = import_module("." + name, __name__) elif name in _EXPORTS: value = getattr(import_module("." + _EXPORTS[name], __name__), name) else: raise AttributeError("module %r has no attribute %r" % (__name__, name)) globals()[name] = value return value def __dir__(): return sorted(set(globals()) | set(__all__)) mhcflurry-2.3.6/mhcflurry/parallelism/cli_args.py000066400000000000000000000267061525677230600222420ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Argument-parser helpers for local parallelism.""" def _max_workers_per_gpu_arg(value): """argparse type for ``--max-workers-per-gpu``. Accepts ``"auto"`` or int>=1.""" import argparse if isinstance(value, str) and value.lower() == "auto": return "auto" try: v = int(value) except (TypeError, ValueError): raise argparse.ArgumentTypeError( "--max-workers-per-gpu must be 'auto' or an integer >= 1, got %r" % (value,) ) if v < 1: raise argparse.ArgumentTypeError( "--max-workers-per-gpu must be >= 1, got %d" % (v,) ) return v def _num_jobs_arg(value): """argparse type for ``--num-jobs``. Accepts ``"auto"`` or int>=0.""" import argparse if isinstance(value, str) and value.lower() == "auto": return "auto" try: v = int(value) except (TypeError, ValueError): raise argparse.ArgumentTypeError( "--num-jobs must be 'auto' or an integer >= 0, got %r" % (value,) ) if v < 0: raise argparse.ArgumentTypeError( "--num-jobs must be >= 0, got %d" % (v,) ) return v def _dataloader_num_workers_arg(value): """argparse type for ``--dataloader-num-workers``. ``"auto"`` or int>=0.""" import argparse if isinstance(value, str) and value.lower() == "auto": return "auto" try: v = int(value) except (TypeError, ValueError): raise argparse.ArgumentTypeError( "--dataloader-num-workers must be 'auto' or an integer >= 0, " "got %r" % (value,) ) if v < 0: raise argparse.ArgumentTypeError( "--dataloader-num-workers must be >= 0, got %d" % (v,) ) return v def _random_negative_pool_epochs_arg(value): """argparse type for ``--random-negative-pool-epochs``. ``"auto"`` or int>=1.""" import argparse if isinstance(value, str) and value.lower() == "auto": return "auto" try: v = int(value) except (TypeError, ValueError): raise argparse.ArgumentTypeError( "--random-negative-pool-epochs must be 'auto' or an integer >= 1, " "got %r" % (value,) ) if v < 1: raise argparse.ArgumentTypeError( "--random-negative-pool-epochs must be >= 1, got %d" % (v,) ) return v def _positive_int_arg(value): """argparse type for strictly positive worker-lifecycle counts.""" import argparse try: v = int(value) except (TypeError, ValueError): raise argparse.ArgumentTypeError( "expected an integer >= 1, got %r" % (value,) ) from None if v < 1: raise argparse.ArgumentTypeError( "expected an integer >= 1, got %r" % (value,) ) return v def add_local_parallelism_args(parser): """ Add local parallelism arguments to the given argparse.ArgumentParser. Parameters ---------- parser : argparse.ArgumentParser """ group = parser.add_argument_group("Local parallelism") group.add_argument( "--num-jobs", default="auto", type=_num_jobs_arg, metavar="N", help="Number of local processes to parallelize training over. " "Pass 'auto' (default) to derive from " "``--gpus * --max-workers-per-gpu`` once the latter is " "resolved (so workers never overflow to CPU silently). " "Pass 0 for serial run, or an int to pin.") group.add_argument( "--backend", choices=("auto", "default", "gpu", "mps", "cpu"), default="auto", help="Device backend. 'default' is a legacy alias for 'auto'. 'gpu' " "means CUDA. 'auto' (default) selects the " "best available device: GPU > MPS > CPU. When --gpus is set, " "GPU-assigned workers use CUDA and overflow workers are forced " "to CPU.") group.add_argument( "--gpus", type=int, metavar="N", help="Number of CUDA GPUs to assign across parallel workers. When " "CUDA_VISIBLE_DEVICES is set, this is a count within that " "scheduler-visible mask. Requires --num-jobs > 0. Each assigned " "worker gets one GPU; workers beyond " "--gpus * --max-workers-per-gpu run on CPU.") group.add_argument( "--max-workers-per-gpu", type=_max_workers_per_gpu_arg, metavar="N", default="auto", help="Maximum number of workers to assign to a GPU. Pass 'auto' " "(default) to pick a value based on detected free VRAM, the " "estimated per-worker working set, and a shared safety reserve " "(see ``auto_max_workers_per_gpu``). Pass an integer to pin. " "Workers beyond ``--gpus * --max-workers-per-gpu`` run on CPU.") group.add_argument( "--max-tasks-per-worker", type=_positive_int_arg, metavar="N", default=None, help="Restart workers after N tasks. Workaround for memory leaks.") group.add_argument( "--worker-log-dir", default=None, help="Write worker stdout and stderr logs to given directory.") group.add_argument( "--dataloader-num-workers", type=_dataloader_num_workers_arg, metavar="N", default="auto", help="Per-fit-worker DataLoader child count for streaming " "pretraining. Pass " "'auto' (default) to derive from box vCPUs / RAM / " "fit-worker plan via " "``mhcflurry.parallelism.auto_dataloader_num_workers`` " "(empirical throughput cap = 4). Pass an integer to pin (0 builds " "pretraining batches in-process). Overrides any " "``dataloader_num_workers`` set in component-model " "hyperparameters when applicable; non-affinity train commands " "accept the flag for uniformity but currently no-op.") group.add_argument( "--random-negative-pool-epochs", type=_random_negative_pool_epochs_arg, metavar="N", default="auto", help="Number of consecutive epochs that share a pre-encoded " "random-negative pool. Pass 'auto' (default) to size from " "system RAM / fit-worker plan via " "``mhcflurry.parallelism.auto_random_negative_pool_epochs`` " "(empirical throughput cap = 10). Pass an integer to pin (1 means " "fresh " "random negatives every epoch). Overrides any " "``random_negative_pool_epochs`` set in component-model " "hyperparameters.") group.add_argument( "--torch-compile", choices=("auto", "0", "1"), default="auto", help="Enable torch.compile for forward kernels. '1' on, '0' off, " "'auto' (default) reads MHCFLURRY_TORCH_COMPILE env (off when " "unset). When on, the orchestrator also auto-sizes " "TORCHINDUCTOR_COMPILE_THREADS — see " "hoist_torchinductor_compile_threads.") group.add_argument( "--torch-compile-loss", choices=("auto", "0", "1"), default="auto", help="Enable torch.compile for training loss modules. 'auto' " "(default) reads MHCFLURRY_TORCH_COMPILE_LOSS env; when unset, " "loss compilation follows enabled CUDA network compilation. CUDA " "workers run a one-op autograd warmup before compiling losses to " "avoid the PyTorch 2.4 / Triton invalid-device-context bug.") group.add_argument( "--matmul-precision", choices=("none", "highest", "high", "medium"), default="none", help="torch.set_float32_matmul_precision setting + cudnn.benchmark " "enable. 'highest' keeps full fp32 numerics with cudnn " "auto-tuning; 'high'/'medium' enable TF32 on Ampere+ (~2x " "matmul speedup, fp32 accumulation preserved, input-mantissa " "truncated). 'none' (default) leaves PyTorch's default " "untouched. CPU/MPS: no-op.") group.add_argument( "--enable-timing", action="store_true", default=False, help="Populate per-epoch timing arrays in fit_info " "(epoch_fetch_time, epoch_train_time, epoch_validation_time). " "Persisted in the model's config_json for post-hoc breakdown. " "No runtime cost beyond a few timestamp records per epoch.") def add_prediction_parallelism_args(parser): """ Add prediction-time local parallelism arguments to an argparse parser. This is the inference subset of ``add_local_parallelism_args``: the worker scheduler, backend selection, and torch forward-kernel knobs, without training-only DataLoader/random-negative options. """ group = parser.add_argument_group("Prediction parallelism") group.add_argument( "--num-jobs", default="auto", type=_num_jobs_arg, metavar="N", help="Number of local prediction worker processes. Pass 'auto' " "(default) to size from detected CUDA capacity, host memory " "and work items; CPU/MPS run serially. Pass 0 for " "serial prediction.") group.add_argument( "--backend", choices=("auto", "default", "gpu", "mps", "cpu"), default="auto", help="Device backend. 'auto' (default) selects GPU > MPS > CPU. " "When --gpus is set, GPU-assigned workers use CUDA.") group.add_argument( "--gpus", type=int, metavar="N", help="Number of CUDA GPUs to assign across parallel prediction " "workers. Defaults to all visible CUDA devices with the auto " "or gpu backend. When CUDA_VISIBLE_DEVICES is set, this is a count " "within that scheduler-visible mask. Requires --num-jobs > 0.") group.add_argument( "--max-workers-per-gpu", type=_max_workers_per_gpu_arg, metavar="N", default="auto", help="Maximum prediction workers to assign to each CUDA GPU. Pass " "'auto' (default) to choose from detected free VRAM, or an int " "to pin.") group.add_argument( "--max-tasks-per-worker", type=_positive_int_arg, metavar="N", default=None, help="Restart workers after N prediction chunks.") group.add_argument( "--worker-log-dir", default=None, help="Write prediction worker stdout and stderr logs to this directory.") group.add_argument( "--torch-compile", choices=("auto", "0", "1"), default="auto", help="Enable torch.compile for forward kernels. 'auto' reads " "MHCFLURRY_TORCH_COMPILE (off when unset). CUDA only.") group.add_argument( "--matmul-precision", choices=("none", "highest", "high", "medium"), default="none", help="torch.set_float32_matmul_precision setting. CPU/MPS: no-op.") mhcflurry-2.3.6/mhcflurry/parallelism/planning.py000066400000000000000000001512741525677230600222640ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Hardware planning helpers for local parallelism.""" import logging import math import os import re import subprocess import sys from dataclasses import replace from ..common import configure_pytorch, normalize_pytorch_backend from ..memory_budget import ( GIB, HOST_MIN_RESERVE_BYTES, memory_worker_capacity, per_worker_memory_budget_bytes, usable_memory_bytes, ) from ..workload_planning import ( HOST_RAM_PER_DATALOADER_CHILD_GB, WORKLOAD_GENERIC, available_or_total_memory_gb, capacity_warnings, env_float, env_int, host_memory_num_jobs_cap, plan_local_parallelism, system_memory_info_gb, ) # Generic per-worker VRAM fallback when a command cannot provide an analytic # model/dataset estimate. Workload-aware commands replace it; compile warmup # measurements may only raise the estimate. Override remains for expert use. _AUTO_MWPG_PER_WORKER_GB_DEFAULT = 4.0 # Fallback free-VRAM estimate per GPU (gigabytes) when ``nvidia-smi`` is not # available. This path deliberately does not import torch: local pools use fork # on Linux, and touching the CUDA runtime in the parent before forking causes # CUDA re-initialization failures in children. _AUTO_MWPG_FREE_VRAM_FALLBACK_GB = 16.0 # ----- Auto DataLoader prefetch worker count -------------------------------- # # ``dataloader_num_workers`` controls child processes for the streaming # pretraining DataLoader. The standard affinity fit() loop is device-resident # and forms minibatches by indexing tensors directly, so this knob does not # control affinity fine-tuning. # # The pretraining trade-off: # # * 0 -> in-process batch building. No spawn cost; no parallel prefetch. # Acceptable on tiny/CPU-only configs. # * 1 -> one prefetcher per fit() worker. Hides some CSV/encoding/collation # work behind the GPU step. # * 2-4 -> multiple prefetchers feed batches in parallel. Past 4 we hit # diminishing returns on most boxes from PyTorch queue and process # scheduling overhead. # # This auto-resolver picks per-fit-worker prefetch count from: # * total vCPUs (default ``os.cpu_count()``) # * fit-worker count (NUM_JOBS or num_gpus × max_workers_per_gpu) # * total RAM in GB (optional, for tight-RAM boxes) # * optional expert hard cap (none by default) # # Intent: the recipe pins ``DATALOADER_NUM_WORKERS=auto`` and the orchestrator # computes the right value per box. Hardware tier mismatches like the # L40S-tuned "1" landing on a 176-vCPU 8×A100 box can't recur. _AUTO_DATALOADER_HARD_CAP_DEFAULT = 4 # Approximate RSS that one DataLoader child holds: torch + mhcflurry imports # (~0.5 GB) plus a small per-batch buffer. _AUTO_DATALOADER_RAM_PER_CHILD_GB = HOST_RAM_PER_DATALOADER_CHILD_GB # Approximate RSS that the main fit() worker holds before any DataLoader # children. Used by the RAM guard to avoid over-allocating prefetchers when # RAM-per-fit is tight. ~2 GB covers torch, mhcflurry, the validation cache, # and pretraining batch state. _AUTO_DATALOADER_RAM_BASELINE_PER_FIT_GB = 2.0 # Effective cores per DL child for the CPU budget. Each prefetcher does # fancy-indexing + collation in one process; with ~50% blocking on the work # queue, two physical cores per child is a comfortable upper bound. _AUTO_DATALOADER_CORES_PER_CHILD = 2 def cuda_visible_devices_from_env(): """Return CUDA_VISIBLE_DEVICES entries, or ``None`` when unset.""" value = os.environ.get("CUDA_VISIBLE_DEVICES") if value is None: return None value = value.strip() if not value: return [] devices = [part.strip() for part in value.split(",") if part.strip()] if not devices: return [] if devices[0].lower() in ("-1", "none", "void", "nodevfiles"): return [] return devices def free_vram_per_gpu_override_gb(num_gpus): """Return env-pinned free VRAM in GB as a per-GPU list, or ``None``. ``MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB`` accepts either one value applied to every GPU or a comma/space-separated list. It exists for tests and unusual launchers where ``nvidia-smi`` is hidden but the caller knows the device budget. """ name = "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB" value = os.environ.get(name) if not value: return None parts = [p for p in value.replace(",", " ").split() if p] if not parts: return None try: vals = [float(p) for p in parts] except ValueError as exc: raise ValueError( "Environment variable %s=%r contains a non-float entry: %s" % (name, value, exc) ) from None if any(not math.isfinite(item) or item < 0 for item in vals): raise ValueError( "Environment variable %s=%r must contain finite non-negative " "free-VRAM values" % (name, value) ) if len(vals) == 1: # A single value applies to every GPU. vals = vals * max(int(num_gpus), 1) return vals[:max(int(num_gpus), 1)] def free_vram_override_gb(num_gpus): """Minimum env-pinned free VRAM in GB, or ``None``.""" vals = free_vram_per_gpu_override_gb(num_gpus) return min(vals) if vals else None def detect_num_cuda_devices_no_torch(): """Return the number of visible CUDA devices without importing torch. ``CUDA_VISIBLE_DEVICES`` is authoritative when set by a scheduler or container. Otherwise shell out so the orchestrator can size a fork-based worker pool without initializing CUDA in the parent process. Returns 0 when nvidia-smi is unavailable or no GPUs are visible. """ cuda_visible_devices = cuda_visible_devices_from_env() if cuda_visible_devices is not None: return len(cuda_visible_devices) try: output = subprocess.check_output( ["nvidia-smi", "-L"], stderr=subprocess.DEVNULL, timeout=5, ) except ( OSError, subprocess.CalledProcessError, subprocess.TimeoutExpired): return 0 # nvidia-smi -L output is one line per device: # "GPU 0: NVIDIA A100-SXM4-80GB (UUID: GPU-...)" # Match the index-prefixed form so we don't count MIG slices or stray # diagnostic lines that happen to start with "GPU ". pattern = re.compile(r"^GPU \d+:") n = 0 for line in output.decode("utf-8", errors="ignore").splitlines(): if pattern.match(line): n += 1 return n def free_vram_per_gpu_from_nvidia_smi_gb(num_gpus): """Return a list of free VRAM (GB) per visible GPU using ``nvidia-smi``. Returns ``None`` if ``nvidia-smi`` is unavailable or returns nothing. The per-GPU list (not collapsed to a scalar) lets capacity diagnostics see heterogeneous / partially-occupied cards; the worker-count math separately takes the ``min`` via ``free_vram_from_nvidia_smi_gb``. This is intentionally a subprocess call instead of ``torch.cuda`` so the orchestrator can size a fork-based worker pool without initializing CUDA in the parent process. """ cuda_visible_devices = cuda_visible_devices_from_env() if cuda_visible_devices is not None: cuda_visible_devices = cuda_visible_devices[:max(int(num_gpus), 1)] if not cuda_visible_devices: return None device_args = ["-i", ",".join(cuda_visible_devices)] else: device_args = [] command = ["nvidia-smi"] + device_args + [ "--query-gpu=memory.free", "--format=csv,noheader,nounits", ] try: output = subprocess.check_output( command, stderr=subprocess.DEVNULL, timeout=5, ) except ( OSError, subprocess.CalledProcessError, subprocess.TimeoutExpired): return None vals = [] for line in output.decode("utf-8", errors="ignore").splitlines(): line = line.strip() if not line: continue try: # nvidia-smi reports MiB for memory.free with nounits. vals.append(float(line.split()[0]) / 1024.0) except (ValueError, IndexError): continue if not vals: return None return vals[:max(int(num_gpus), 1)] def free_vram_from_nvidia_smi_gb(num_gpus): """Minimum free VRAM (GB) across visible GPUs, or ``None``.""" vals = free_vram_per_gpu_from_nvidia_smi_gb(num_gpus) return min(vals) if vals else None def detect_free_vram_per_gpu_gb(num_gpus): """Per-GPU free VRAM (GB) as a list, or ``None`` if undetectable. Env override (``MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB``) first, then ``nvidia-smi``. Unlike the scalar helpers used by the worker-count math, this preserves the per-GPU values so capacity warnings can flag small or uneven cards. """ override = free_vram_per_gpu_override_gb(num_gpus) if override is not None: return override return free_vram_per_gpu_from_nvidia_smi_gb(num_gpus) def auto_max_workers_per_gpu( num_jobs, num_gpus, backend="auto", per_worker_gb=None): """Pick ``max_workers_per_gpu`` based on detected hardware. Returns an int ≥ 1. Logic: * ``num_gpus == 0`` (CPU-only) → 1. * Otherwise: take the minimum of two capacity limits: - ``num_jobs // num_gpus`` — don't oversubscribe a GPU beyond the jobs that actually exist. - complete per-worker working sets that fit in free VRAM after the shared allocator/context reserve. Free VRAM is read from ``nvidia-smi`` (or from ``MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB``). It deliberately avoids ``torch.cuda`` so resolving local parallelism before forking does not initialize CUDA in the parent process. Per-worker VRAM upper bound and the optional expert hard cap are overridable via ``MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB`` and ``MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_HARD_CAP``. Calibrate's per-worker footprint is dominated by the cached_stages tensor, so the planner passes ``per_worker_gb`` explicitly — the affinity calibration workload profile's ``device_worker_gb`` of 24 GB — overriding the 4 GB train default. When given, the explicit hint wins over the env var. (No env var for it: the workload-specific knowledge belongs in the workload profile, not in a global env.) The result is logged so the chosen value is visible in the worker log alongside the reasoning. """ if not num_gpus or num_gpus < 1 or backend == "cpu": return 1 if per_worker_gb is None: per_worker_gb = env_float( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB", _AUTO_MWPG_PER_WORKER_GB_DEFAULT, bounds=(0.0, None), ) else: per_worker_gb = float(per_worker_gb) if not math.isfinite(per_worker_gb) or per_worker_gb < 0: raise ValueError( "per_worker_gb must be a finite non-negative number; got %r" % per_worker_gb ) hard_cap_raw = os.environ.get( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_HARD_CAP") hard_cap = ( env_int( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_HARD_CAP", hard_cap_raw, bounds=(1, None), ) if hard_cap_raw not in (None, "") else None ) # Backward-compatible expert override. The default path uses the shared # reserve calculation instead of a fixed spendable fraction. vram_fraction_raw = os.environ.get( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_VRAM_FRACTION") vram_fraction = ( env_float( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_VRAM_FRACTION", vram_fraction_raw, bounds=(0.0, 1.0), ) if vram_fraction_raw not in (None, "") else None ) # Honor an explicit env override even when it resolves to 0.0 (falsy); # only fall through to nvidia-smi when no override was set at all. free_vram_override = free_vram_override_gb(num_gpus) free_vram_gb = ( free_vram_override if free_vram_override is not None else free_vram_from_nvidia_smi_gb(num_gpus) ) free_vram_gb_used = ( free_vram_gb if free_vram_gb is not None else _AUTO_MWPG_FREE_VRAM_FALLBACK_GB ) # When ``num_jobs`` is user-explicit (>0) it caps how many workers/GPU # we can pack: e.g. --num-jobs 8 across 8 GPUs means 1/GPU regardless # of VRAM. When ``num_jobs <= 0`` (the default; user delegated to # auto_num_jobs), don't let it clamp — otherwise this is a chicken/egg # with auto_num_jobs (which derives num_jobs from max_workers_per_gpu) # and the resolver pins itself to whatever happens to be in args # before the resolver runs. Practical effect on the 8x80GB tier: # without the user-explicit guard, by_jobs would clamp MWPG to 2 # (16//8) when production sets num_jobs=16; with the guard, memory and # host/CPU capacity determine concurrency. # ``num_jobs`` may arrive as ``"auto"`` when called from # ``resolve_local_parallelism_args`` (which resolves MWPG before # num_jobs); treat that as "user delegated" — same as ``num_jobs=0``. if isinstance(num_jobs, str) and num_jobs.strip().lower() == "auto": num_jobs_int = 0 else: num_jobs_int = int(num_jobs) if per_worker_gb <= 0: by_vram = 1 elif vram_fraction is not None: by_vram = max( 1, int(free_vram_gb_used * vram_fraction / per_worker_gb), ) else: by_vram = memory_worker_capacity( free_vram_gb_used, per_worker_gb, ) if hard_cap is not None: by_vram = min(by_vram, hard_cap) if num_jobs_int > 0: by_jobs = max(1, num_jobs_int // max(int(num_gpus), 1)) chosen = max(1, min(by_jobs, by_vram)) by_jobs_log = str(by_jobs) else: chosen = max(1, by_vram) by_jobs_log = "skipped (num_jobs auto)" logging.info( "auto_max_workers_per_gpu: chose %d " "(num_jobs=%d, num_gpus=%d, by_jobs=%s, by_vram=%d at " "free_vram=%.1f GB%s, %.1f GB/worker, budget=%s, hard_cap=%s)", chosen, num_jobs_int, int(num_gpus), by_jobs_log, by_vram, free_vram_gb_used, "" if free_vram_gb is not None else " (fallback)", per_worker_gb, ( "legacy %.2f fraction" % vram_fraction if vram_fraction is not None else "shared reserve" ), hard_cap if hard_cap is not None else "none", ) return chosen def auto_dataloader_num_workers( num_fit_workers, vcpus=None, ram_gb=None, hard_cap=None): """Pick per-fit-worker DataLoader child count from box capacity. Returns an int >= 0. The result is the value that should be plugged into each component model's ``dataloader_num_workers`` hyperparameter. A return of ``0`` means in-process batching (no prefetch children), which is correct for serial runs and very tight CPU configs. Parameters ---------- num_fit_workers : int Total fit() worker processes that will share the box. Equal to ``num_gpus * max_workers_per_gpu`` for the canonical GPU run, or ``num_jobs`` for CPU-only runs. vcpus : int, optional Total vCPU count. Default ``os.cpu_count()``. ram_gb : float, optional Total system RAM in GB. ``None`` skips the RAM cap (CPU-only decision). hard_cap : int, optional Maximum DL children per fit-worker. Default 4 (overridable via ``MHCFLURRY_AUTO_DATALOADER_HARD_CAP``); beyond this, process/queue overhead reduced measured throughput. Notes ----- 1. **Serial / no GPU work**: if ``num_fit_workers <= 0``, return 0. The caller will run fit() in-process; spawning children would buy nothing and cost a process-fork. 2. **CPU budget per fit-worker**: ``cpu_per_fit = vcpus // num_fit_workers``. Each DL child needs ~``_AUTO_DATALOADER_CORES_PER_CHILD`` (=2) physical cores to keep up with fancy-indexing + collate without starving the main fit-worker's OMP/MKL pool. 3. **CPU cap**: ``cpu_cap = cpu_per_fit // 2``. 4. **RAM cap** (when ``ram_gb`` is provided): each DL child holds ~``_AUTO_DATALOADER_RAM_PER_CHILD_GB`` (=0.5) GB of RSS for the torch+mhcflurry imports; the main fit-worker baseline is ~``_AUTO_DATALOADER_RAM_BASELINE_PER_FIT_GB`` (=2.0) GB. ``ram_cap = max(0, (ram_per_fit_gb - 2.0) / 0.5)``. 5. **Throughput cap**: ``min(cpu_cap, ram_cap, hard_cap)``. 6. **Floor**: return 0 when any CPU, RAM or explicit hard cap is 0. Otherwise the minimum is 1. **Edge cases** * ``num_fit_workers > vcpus`` → ``cpu_per_fit = 0``, ``cpu_cap = 0``, result 0. The main fit-workers themselves are oversubscribed; adding DL children would make it worse. * ``ram_gb`` very small (e.g. < 2 GB / fit) → ``ram_cap = 0``, falls back to in-process batching to preserve correctness over throughput. * ``hard_cap`` env override of ``0`` → forces in-process for diagnostics. **Cross-checks (see test_orchestrator_helpers.py)** * 8×A100-80GB Verda (176v / 16 fit / 400G) → 4 * 8×A100-40GB (176v / 8 fit / 400G) → 4 * 8×L40S (96v / 16 fit / 200G) → 3 * Single A100 80G Lambda (30v / 2 fit / 200G) → 4 * Single A100 80G tight (16v / 2 fit / 64G) → 4 * Single T4 (8v / 1 fit / 16G) → 4 * CPU 8-thread (8v / 0 fit) → 0 * Tight cluster node (32v / 16 fit / 64G) → 1 * RAM-starved (176v / 16 fit / 32G) → 0 """ if num_fit_workers is None or int(num_fit_workers) <= 0: return 0 num_fit_workers = int(num_fit_workers) if vcpus is None: vcpus = os.cpu_count() or 1 vcpus = int(vcpus) if hard_cap is None: hard_cap = env_int( "MHCFLURRY_AUTO_DATALOADER_HARD_CAP", _AUTO_DATALOADER_HARD_CAP_DEFAULT, bounds=(0, None), ) hard_cap = int(hard_cap) cpu_per_fit = max(0, vcpus // num_fit_workers) cpu_cap = cpu_per_fit // _AUTO_DATALOADER_CORES_PER_CHILD if ram_gb is not None: ram_per_fit = float(ram_gb) / num_fit_workers ram_for_dl = max(0.0, ram_per_fit - _AUTO_DATALOADER_RAM_BASELINE_PER_FIT_GB) ram_cap = int(ram_for_dl / _AUTO_DATALOADER_RAM_PER_CHILD_GB) else: ram_cap = None chosen = min(hard_cap, cpu_cap) if ram_cap is not None: chosen = min(chosen, ram_cap) # Floor at 1 when the box has CPU + RAM + cap headroom; floor at 0 # when ANY of cpu_cap / ram_cap / hard_cap is itself 0 (the user or # the box explicitly forced in-process batching). The 1-floor exists # so capable boxes don't accidentally disable prefetch when integer # division rounds down to 0; it must not override an explicit 0. if ( cpu_cap == 0 or (ram_cap is not None and ram_cap == 0) or hard_cap == 0 ): chosen = 0 else: chosen = max(1, chosen) chosen = max(0, chosen) logging.info( "auto_dataloader_num_workers: chose %d (num_fit_workers=%d, vcpus=%d, " "ram_gb=%s, cpu_per_fit=%d, cpu_cap=%d, ram_cap=%s, hard_cap=%s)", chosen, num_fit_workers, vcpus, f"{ram_gb:.1f}" if ram_gb is not None else "?", cpu_per_fit, cpu_cap, str(ram_cap) if ram_cap is not None else "?", hard_cap, ) return chosen def resolve_dataloader_num_workers( value, num_fit_workers=None, vcpus=None, ram_gb=None): """Normalize a ``dataloader_num_workers`` value to an int. Accepts ``"auto"`` / unset / ``None`` (delegates to ``auto_dataloader_num_workers``), or any int-coercible value. Used by both the orchestrator-side resolver and the shell helper that injects ``dataloader_num_workers`` into the recipe's hyperparameters.yaml. """ if value is None or (isinstance(value, str) and value.strip().lower() == "auto"): return auto_dataloader_num_workers( num_fit_workers=num_fit_workers, vcpus=vcpus, ram_gb=ram_gb, ) try: out = int(value) except (TypeError, ValueError): raise ValueError( "dataloader_num_workers must be 'auto' or a non-negative integer; " "got %r" % (value,) ) if out < 0: raise ValueError( "dataloader_num_workers must be >= 0; got %d" % out ) return out def auto_random_negative_pool_epochs( num_random_negatives, peptide_max_length, num_workers, ram_gb=None, *, safety_fraction=None, per_pool_epoch_per_worker_bytes=None, hard_cap=None, base_worker_gb=0.0): """Pick ``random_negative_pool_epochs`` from box capacity. The pool sits in the heap of every fit-worker process. Per-pool-epoch memory cost is dominated by: * ``num_random_negatives × peptide_max_length`` int8 indices, * intermediate ``pandas.Series[str]`` allocations and encoder buffers observed in practice at ~10–40× the int8 size on 2026-04 measurements (the old ``pool_epochs=100`` run OOM'd a 944 GB box at ~199 GB / worker worth of transient pool cost). We budget for the pessimistic ``per_pool_epoch_per_worker_bytes`` figure so the auto value is safe under transient peaks; tunable via env when a workload is known to behave better than the empirical pessimistic figure. Returns an int >= 1. ``1`` means fresh random negatives every epoch. ``> 1`` amortizes random-negative generation + encoding across N epochs. Parameters ---------- num_random_negatives : int Number of random-negative peptides per epoch (the planner's ``get_total_count()``). The size of one pool-epoch in the cycle. peptide_max_length : int Longest peptide the encoding allocates space for. With the fixed-vector encoding lookup, the per-peptide footprint is ``peptide_max_length`` int8 bytes. num_workers : int Total fit() worker processes that will share the box. Each holds its own RN pool, so total RAM cost = ``num_workers × pool_epochs × per_pool_epoch_per_worker_bytes``. ram_gb : float, optional Total system RAM in GB. ``None`` returns ``1`` (safe default — we don't know the budget so don't bump pool_epochs above legacy). safety_fraction : float, optional Expert fraction of RAM available to RN pools across all workers. By default the shared host reserve is used and ``base_worker_gb`` is subtracted first. Override via ``MHCFLURRY_AUTO_RN_POOL_SAFETY_FRACTION``. per_pool_epoch_per_worker_bytes : float, optional Empirical per-pool-epoch per-worker RAM cost in bytes. Default ``1 GB`` (conservative — captures the int8 indices + transient pandas + encoder buffers seen on the 2026-04 run). Override via ``MHCFLURRY_AUTO_RN_POOL_PER_EPOCH_PER_WORKER_GB``. hard_cap : int, optional Maximum pool epochs. Default 10 (expert-overridable); larger pools add startup/memory cost after generation overhead is already amortized. base_worker_gb : float, optional Baseline host memory per fit worker, subtracted before sizing pools. Notes ----- Total available bytes for RN pools across the box is usable host memory after the shared reserve and fit-worker base RSS. An explicit ``safety_fraction`` replaces that calculation. Per-worker budget is ``available / max(num_workers, 1)``. The number of pool epochs that fit is ``per_worker_budget / per_pool_epoch_per_worker_bytes``, clamped to ``[1, hard_cap]``. **Cross-checks** * 8×A100-80GB Verda shares the same reserve and worker-RSS estimate as the outer process planner, then stops at the throughput cap. * Single A100 80G Lambda uses the shared host reserve minus the two workers' base RSS, then fills the remaining per-worker pool budget. * Tight and RAM-starved nodes naturally fall back toward one pooled epoch as the fit-worker base RSS consumes the shared usable budget. """ if num_workers is None or int(num_workers) <= 0: return 1 if ram_gb is None: return 1 if safety_fraction is None: raw_fraction = os.environ.get( "MHCFLURRY_AUTO_RN_POOL_SAFETY_FRACTION") safety_fraction = ( env_float( "MHCFLURRY_AUTO_RN_POOL_SAFETY_FRACTION", raw_fraction, bounds=(0.0, 1.0), ) if raw_fraction not in (None, "") else None ) if per_pool_epoch_per_worker_bytes is None: per_pool_epoch_per_worker_bytes = env_float( "MHCFLURRY_AUTO_RN_POOL_PER_EPOCH_PER_WORKER_GB", "1.0", bounds=(0.0, None), ) * (1024 ** 3) if hard_cap is None: hard_cap = env_int( "MHCFLURRY_AUTO_RN_POOL_HARD_CAP", "10", bounds=(1, None), ) from ..memory_budget import HOST_MIN_RESERVE_BYTES, usable_memory_bytes available_bytes = float(ram_gb) * (1024 ** 3) if safety_fraction is not None: pool_budget = available_bytes * float(safety_fraction) else: pool_budget = usable_memory_bytes( available_bytes, min_reserve_bytes=HOST_MIN_RESERVE_BYTES, ) pool_budget -= ( max(float(base_worker_gb), 0.0) * max(int(num_workers), 1) * (1024 ** 3) ) per_worker_budget = max(pool_budget, 0.0) / max(int(num_workers), 1) by_memory = max(1, int(per_worker_budget / max( per_pool_epoch_per_worker_bytes, 1.0))) # The `num_random_negatives` and `peptide_max_length` inputs are # accepted for API symmetry / future extensions (e.g. variable-size # encodings); the empirical per-pool-epoch figure already covers them. del num_random_negatives, peptide_max_length return min(by_memory, max(1, int(hard_cap))) def resolved_int(value, name): if isinstance(value, str) and value.strip().lower() == "auto": raise ValueError( "%s must be resolved to an int before use; got 'auto'" % name ) return int(value) def auto_num_jobs(num_gpus, max_workers_per_gpu): """Compute total fit-worker count from GPU plan. Returns ``num_gpus * max_workers_per_gpu`` for GPU runs, ``0`` when no GPUs are visible (caller decides serial vs explicit CPU pool). Treats ``"auto"`` ``max_workers_per_gpu`` as not-yet-resolved and raises; callers must resolve it first via ``auto_max_workers_per_gpu``. """ if not num_gpus or int(num_gpus) <= 0: return 0 max_workers_per_gpu = resolved_int( max_workers_per_gpu, "max_workers_per_gpu") return int(num_gpus) * max_workers_per_gpu def resolve_max_workers_per_gpu( args, per_worker_gb=None, num_gpus=None, backend=None): """Resolve ``args.max_workers_per_gpu`` to an int, mutating ``args``. Accepts the literal string ``"auto"`` (the default) or an int. When ``"auto"``, calls ``auto_max_workers_per_gpu`` with the rest of the args' parallelism config to pick a value. Idempotent — calling twice on the same args is a no-op the second time. ``per_worker_gb`` lets workload-specific commands (e.g. calibrate, where cached_stages dominates per-worker VRAM at ~15 GB) override the train-default. Falls back to env var / the module default when not given. Returns the resolved int (also stored on ``args.max_workers_per_gpu`` so subsequent consumers see the int). """ if backend is None: backend = getattr(args, "backend", "auto") if num_gpus is None: num_gpus = getattr(args, "gpus", 0) or 0 value = getattr(args, "max_workers_per_gpu", None) if value is None: value = "auto" if isinstance(value, str) and value.lower() == "auto": resolved = auto_max_workers_per_gpu( num_jobs=getattr(args, "num_jobs", 0), num_gpus=num_gpus, backend=backend, per_worker_gb=per_worker_gb, ) else: resolved = int(value) args.max_workers_per_gpu = resolved return resolved def num_workers_per_gpu_from_args(args): """Return resolved ``max_workers_per_gpu`` for model auto-sizing. Callers must run ``resolve_local_parallelism_args`` first so workload- and hardware-aware defaults have already converted the CLI sentinel ``"auto"`` into an integer. """ value = getattr(args, "max_workers_per_gpu", 1) if value is None: return 1 if isinstance(value, str) and value.strip().lower() == "auto": raise ValueError( "max_workers_per_gpu is still 'auto'; call " "resolve_local_parallelism_args before using it as " "num_workers_per_gpu." ) return resolved_int(value, "max_workers_per_gpu") def refresh_device_memory_budget(args): """Snapshot and propagate one fixed launch-time entitlement per worker.""" plan = getattr(args, "workload_plan", None) if ( plan is None or plan.backend not in ("auto", "gpu") or int(plan.gpus) < 1): args.device_memory_budget_bytes = None return None available_bytes = getattr( args, "_device_memory_available_bytes_at_launch", None) if available_bytes is None: per_gpu = detect_free_vram_per_gpu_gb(plan.gpus) if per_gpu: available_bytes = int(min(float(value) for value in per_gpu) * GIB) args._device_memory_available_bytes_at_launch = available_bytes if available_bytes is None: args.device_memory_budget_bytes = None return None budget_bytes = per_worker_memory_budget_bytes( available_bytes, max(int(plan.max_workers_per_gpu), 1), ) args.device_memory_budget_bytes = int(budget_bytes) args.workload_plan = replace( plan, device_memory_available_gb=available_bytes / GIB, device_memory_budget_gb=budget_bytes / GIB, ) return int(budget_bytes) def resolve_local_parallelism_args( args, cap_auto_num_jobs=True, per_worker_gb=None, workload_name=WORKLOAD_GENERIC, workload_hints=None): """Resolve and normalize local parallelism arguments through the planner.""" if getattr(args, "_local_parallelism_args_resolved", False): return args plan = plan_local_parallelism( args, workload_name=workload_name, workload_hints=workload_hints, per_worker_gb=per_worker_gb, cap_auto_num_jobs=cap_auto_num_jobs, normalize_backend=normalize_pytorch_backend, detect_num_cuda_devices=detect_num_cuda_devices_no_torch, auto_max_workers_per_gpu=auto_max_workers_per_gpu, auto_num_jobs=auto_num_jobs, resolve_dataloader_num_workers=resolve_dataloader_num_workers, auto_random_negative_pool_epochs=auto_random_negative_pool_epochs, ) args.backend = plan.backend args.gpus = plan.gpus args.gpus_was_auto = plan.gpus_was_auto args.max_workers_per_gpu = plan.max_workers_per_gpu args.max_workers_per_gpu_was_auto = plan.max_workers_per_gpu_was_auto args.num_jobs = plan.num_jobs args.num_jobs_was_auto = plan.num_jobs_was_auto args.dataloader_num_workers = plan.dataloader_num_workers args.dataloader_num_workers_was_auto = plan.dataloader_num_workers_was_auto args.random_negative_pool_epochs = plan.random_negative_pool_epochs args.random_negative_pool_epochs_was_auto = ( plan.random_negative_pool_epochs_was_auto ) ( cpu_threads_per_worker, cpu_threads_per_worker_was_auto, ) = resolve_cpu_thread_budget(plan) plan = replace( plan, cpu_threads_per_worker=cpu_threads_per_worker, cpu_threads_per_worker_was_auto=cpu_threads_per_worker_was_auto, ) args.cpu_threads_per_worker = cpu_threads_per_worker args.cpu_threads_per_worker_was_auto = ( cpu_threads_per_worker_was_auto ) args.workload_plan = plan refresh_device_memory_budget(args) plan = args.workload_plan if ( plan.num_jobs == 0 and not getattr(args, "cluster_parallelism", False) and cpu_threads_per_worker_was_auto): # Serial commands execute the work function directly in this process, # so worker_init never gets a chance to resize native/PyTorch pools # that were initialized before planning ran. from .worker_runtime import configure_worker_cpu_threads applied_threads = configure_worker_cpu_threads( cpu_threads_per_worker, auto_owned=True, ) configure_pytorch(num_threads=applied_threads) # Promote orchestrator-owned tuning knobs from CLI to env so the # existing call sites (pytorch_training.maybe_compile_network, # configure_matmul_precision, class1_training._timing_enabled, # hoist_torchinductor_compile_threads) read a single source of truth. # Auto -> leave env untouched (preserves backward-compat for env-only # deploys); explicit CLI value -> overrides env. Workers inherit # via the multiprocessing fork done after this resolver runs. if plan.torch_compile in ("0", "1"): os.environ["MHCFLURRY_TORCH_COMPILE"] = plan.torch_compile if plan.torch_compile_loss in ("0", "1"): os.environ["MHCFLURRY_TORCH_COMPILE_LOSS"] = plan.torch_compile_loss if plan.matmul_precision != "none": os.environ["MHCFLURRY_MATMUL_PRECISION"] = plan.matmul_precision if plan.enable_timing: os.environ["MHCFLURRY_ENABLE_TIMING"] = "1" # Preflight: compare the resolved plan against measured machine capacity # (per-GPU free VRAM, available RAM, CPU count) and warn when we are below # a safe operating range, so a future OOM/contention is diagnosable. preflight = capacity_warnings( workload_name=plan.workload_name, backend=plan.backend, gpus=plan.gpus, num_jobs=plan.num_jobs, per_gpu_free_vram_gb=detect_free_vram_per_gpu_gb(plan.gpus), device_worker_gb=plan.device_worker_gb, available_ram_gb=plan.host_memory_available_gb, host_worker_gb=plan.host_worker_gb, cpu_count=os.cpu_count(), ) for warning in list(plan.warnings) + preflight: print("Local parallelism:", warning, file=sys.stderr) from .torch_compile import hoist_torchinductor_compile_threads hoist_torchinductor_compile_threads(args) print("Local workload plan:", plan, file=sys.stderr) args._local_parallelism_args_resolved = True return args def resolve_cpu_threads_per_worker(plan, cpu_count=None): """Set unset BLAS/OpenMP thread env vars from the final worker plan.""" threads, _was_auto = resolve_cpu_thread_budget(plan, cpu_count=cpu_count) return threads def resolve_cpu_thread_budget(plan, cpu_count=None): """Resolve native threads per fit worker and environment ownership. A uniform runtime resize is safe only when all supported environment variables are unset or were written by an earlier mhcflurry auto pass. Any caller-owned value makes the environment authoritative; the numeric auto estimate is still recorded for diagnostics but must not be applied to loaded native or PyTorch pools. """ if cpu_count is None: cpu_count = os.cpu_count() or 1 fit_workers = max(int(plan.num_jobs), 1) reserved = 2 + fit_workers * int(plan.dataloader_num_workers) available = max(int(cpu_count) - reserved, fit_workers) per_worker = max(1, available // fit_workers) auto_owned = True for name in ( "OMP_NUM_THREADS", "MKL_NUM_THREADS", "OPENBLAS_NUM_THREADS"): marker = "MHCFLURRY_%s_AUTO" % name marker_value = os.environ.get(marker) current_value = os.environ.get(name) # Record the exact value written by the auto planner. A boolean marker # is insufficient: after an earlier auto pass, a caller can replace # OMP_NUM_THREADS while the inherited marker remains in the # environment. Treat the value as auto-owned only while it still # matches what MHCflurry wrote. marker_matches = ( marker_value is not None and marker_value == current_value ) if current_value is None or marker_matches: os.environ[name] = str(per_worker) os.environ[marker] = str(per_worker) else: auto_owned = False logging.info( "CPU thread budget: %d thread(s)/fit-worker " "(cpus=%d, fit_workers=%d, dataloader_workers=%d, source=%s)", per_worker, int(cpu_count), fit_workers, int(plan.dataloader_num_workers), "auto" if auto_owned else "environment", ) return per_worker, auto_owned def refine_local_parallelism_from_warmup(args, reports): """Tighten an automatic plan using representative warmup measurements. The analytic estimate remains the floor because a one-batch warmup does not contain a full resident dataset or validation. Measured CUDA reserved memory and process peak RSS can only increase the estimated working set and reduce automatic concurrency. Explicit ``--num-jobs`` and ``--max-workers-per-gpu`` values are never changed. """ reports = [report for report in (reports or []) if report] plan = getattr(args, "workload_plan", None) if plan is None or not reports: return args gib = float(1 << 30) device_values = [ max( int(report.get("cuda_process_peak_estimate_bytes") or 0), int(report.get("cuda_peak_allocated_bytes") or 0), int(report.get("cuda_peak_reserved_bytes") or 0), ) / gib for report in reports if ( report.get("cuda_peak_allocated_bytes") is not None or report.get("cuda_peak_reserved_bytes") is not None or report.get("cuda_process_peak_estimate_bytes") is not None ) ] host_values = [ int(report["host_peak_rss_bytes"]) / gib for report in reports if report.get("host_peak_rss_bytes") is not None ] device_peak_gb = max(device_values) if device_values else None host_peak_gb = max(host_values) if host_values else None # Peak counters are exact for the representative step; the margin covers # later allocator fragmentation and small input-shape differences. measured_device_worker_gb = ( device_peak_gb * 1.15 if device_peak_gb is not None else None ) # RUSAGE_SELF measures only the warmed fit worker. Production also starts # DataLoader children, so retain their analytic allowance when the # measured main-process RSS becomes the binding estimate. measured_host_worker_gb = ( host_peak_gb * 1.10 + int(plan.dataloader_num_workers) * HOST_RAM_PER_DATALOADER_CHILD_GB if host_peak_gb is not None else None ) device_candidates = [ value for value in ( plan.device_worker_gb, measured_device_worker_gb, ) if value is not None ] host_candidates = [ value for value in ( plan.host_worker_gb, measured_host_worker_gb, ) if value is not None ] device_worker_gb = ( max(device_candidates) if device_candidates else None ) host_worker_gb = max(host_candidates) if host_candidates else 0.0 new_mwpg = int(plan.max_workers_per_gpu) if ( plan.max_workers_per_gpu_was_auto and plan.gpus > 0 and device_worker_gb is not None): launch_available_bytes = getattr( args, "_device_memory_available_bytes_at_launch", None) if launch_available_bytes is not None: measured_mwpg = memory_worker_capacity( launch_available_bytes / GIB, device_worker_gb, ) else: measured_mwpg = auto_max_workers_per_gpu( num_jobs="auto", num_gpus=plan.gpus, backend=plan.backend, per_worker_gb=device_worker_gb, ) new_mwpg = min(new_mwpg, int(measured_mwpg)) new_num_jobs = int(plan.num_jobs) if plan.num_jobs_was_auto and new_num_jobs > 0 and plan.gpus > 0: new_num_jobs = min(new_num_jobs, plan.gpus * new_mwpg) host_cap = plan.host_memory_num_jobs_cap if plan.host_memory_available_gb is not None: host_cap = host_memory_num_jobs_cap( { "available_gb": plan.host_memory_available_gb, "total_gb": plan.host_memory_total_gb, }, host_worker_gb, ) if ( plan.num_jobs_was_auto and host_cap is not None and new_num_jobs > 0): new_num_jobs = min(new_num_jobs, int(host_cap)) if plan.max_workers_per_gpu_was_auto and plan.gpus > 0: new_mwpg = min( new_mwpg, max(1, (new_num_jobs + plan.gpus - 1) // plan.gpus), ) changed = ( new_mwpg != plan.max_workers_per_gpu or new_num_jobs != plan.num_jobs ) refined = replace( plan, max_workers_per_gpu=new_mwpg, num_jobs=new_num_jobs, capacity=( min(new_num_jobs, plan.gpus * new_mwpg) if new_num_jobs > 0 and plan.gpus > 0 else plan.capacity ), device_worker_gb=device_worker_gb, host_worker_gb=host_worker_gb, host_memory_num_jobs_cap=host_cap, warmup_device_peak_gb=device_peak_gb, warmup_host_peak_gb=host_peak_gb, ) ( cpu_threads_per_worker, cpu_threads_per_worker_was_auto, ) = resolve_cpu_thread_budget(refined) refined = replace( refined, cpu_threads_per_worker=cpu_threads_per_worker, cpu_threads_per_worker_was_auto=cpu_threads_per_worker_was_auto, ) args.workload_plan = refined args.max_workers_per_gpu = new_mwpg args.num_jobs = new_num_jobs args.cpu_threads_per_worker = cpu_threads_per_worker args.cpu_threads_per_worker_was_auto = ( cpu_threads_per_worker_was_auto ) refresh_device_memory_budget(args) refined = args.workload_plan if ( refined.warmup_device_peak_gb is not None and refined.device_memory_budget_gb is not None and refined.warmup_device_peak_gb > refined.device_memory_budget_gb): warning = ( "observed device peak (%.1f GB) exceeds the %.1f GB " "per-worker entitlement on the smallest GPU; the resolved " "concurrency cannot accommodate the measured workload without " "elastic batch shrink or OOM." % ( refined.warmup_device_peak_gb, refined.device_memory_budget_gb, ) ) if warning not in refined.warnings: refined = replace( refined, warnings=refined.warnings + (warning,), ) args.workload_plan = refined print("Local parallelism:", warning, file=sys.stderr) if changed: print( "Warmup memory calibration tightened local parallelism: %s" % ( refined,), file=sys.stderr, ) else: print( "Warmup memory calibration confirmed local parallelism: %s" % ( refined,), file=sys.stderr, ) return args def refine_local_parallelism_from_spawn_context( args, context_bytes, memory=None): """Cap automatic spawn workers using the loaded per-process context. Spawn serializes the full worker initializer context into every process, unlike fork's copy-on-write inheritance. Input files may be compressed, so their on-disk size is not a reliable host-RAM estimate. This refinement is deliberately performed after the dataset/model context has been loaded but before any workers start. """ plan = getattr(args, "workload_plan", None) if plan is None or int(getattr(args, "num_jobs", 0) or 0) <= 0: return args context_bytes = int(context_bytes) if context_bytes < 0: raise ValueError("context_bytes must be non-negative") if not context_bytes: return args if memory is None: memory = system_memory_info_gb() available_gb = available_or_total_memory_gb(memory) if available_gb is None: return args # Deep object-size accounting captures resident array/string payloads. The # multiplier covers pickle reconstruction, indexes, allocator overhead, # and transient copies while the child imports its runtime. The runtime # floor prevents a tiny context from erasing the workload profile's normal # Python/torch allowance. context_gb = context_bytes / float(1 << 30) context_host_worker_gb = ( 1.0 + context_gb * 1.5 + int(plan.dataloader_num_workers) * HOST_RAM_PER_DATALOADER_CHILD_GB ) host_worker_gb = max(float(plan.host_worker_gb), context_host_worker_gb) host_cap = host_memory_num_jobs_cap(memory, host_worker_gb) usable_host_gb = usable_memory_bytes( float(available_gb) * (1 << 30), min_reserve_bytes=HOST_MIN_RESERVE_BYTES, ) / float(1 << 30) # The generic host-cap helper deliberately returns at least one worker so # GPU planning can attempt a minimally viable launch. Spawn is different: # the parent already owns the loaded context, and starting even one child # makes another full copy. If the safe remaining budget cannot hold that # copy, execute serially in the parent instead of forcing a likely OOM. if usable_host_gb < host_worker_gb: host_cap = 0 warnings = list(plan.warnings) new_num_jobs = int(plan.num_jobs) new_mwpg = int(plan.max_workers_per_gpu) host_cap_applied = False if ( host_cap is not None and plan.num_jobs_was_auto and new_num_jobs > int(host_cap)): host_cap_applied = True warnings.append( "auto num_jobs capped from %d to %d by loaded spawn context " "(%.1f GB available from %s, %.1f GB context, %.1f GB/worker)" % ( new_num_jobs, int(host_cap), float(available_gb), memory.get("source", "unknown"), context_gb, host_worker_gb, ) ) new_num_jobs = int(host_cap) if plan.max_workers_per_gpu_was_auto and plan.gpus > 0: new_mwpg = min( new_mwpg, max(1, (new_num_jobs + plan.gpus - 1) // plan.gpus), ) elif ( host_cap is not None and not plan.num_jobs_was_auto and new_num_jobs > int(host_cap)): warnings.append( "explicit num_jobs=%d exceeds loaded spawn-context host-memory " "estimate %d; honoring CLI override" % (new_num_jobs, host_cap) ) refined = replace( plan, max_workers_per_gpu=new_mwpg, num_jobs=new_num_jobs, capacity=( new_num_jobs if host_cap_applied else plan.capacity ), host_worker_gb=host_worker_gb, host_memory_total_gb=memory.get("total_gb"), host_memory_available_gb=memory.get("available_gb"), host_memory_source=memory.get("source", "unknown"), host_memory_num_jobs_cap=host_cap, warnings=tuple(warnings), ) ( cpu_threads_per_worker, cpu_threads_per_worker_was_auto, ) = resolve_cpu_thread_budget(refined) refined = replace( refined, cpu_threads_per_worker=cpu_threads_per_worker, cpu_threads_per_worker_was_auto=cpu_threads_per_worker_was_auto, ) args.workload_plan = refined args.max_workers_per_gpu = new_mwpg args.num_jobs = new_num_jobs args.cpu_threads_per_worker = cpu_threads_per_worker args.cpu_threads_per_worker_was_auto = cpu_threads_per_worker_was_auto refresh_device_memory_budget(args) refined = args.workload_plan if new_num_jobs == 0 and int(plan.num_jobs) > 0: # Commands decide between their serial and parallel branches # immediately after this late, context-aware refinement. Apply the # runtime limit here because no worker initializer will run. from .worker_runtime import configure_worker_cpu_threads applied_threads = configure_worker_cpu_threads( cpu_threads_per_worker, auto_owned=cpu_threads_per_worker_was_auto, ) configure_pytorch(num_threads=applied_threads) if refined != plan: print( "Loaded spawn-context memory refinement: %s" % refined, file=sys.stderr, ) return args def apply_random_negative_pool_epochs_to_work_items( work_items, pool_epochs, *, log=None): """Inject ``random_negative_pool_epochs`` into every work item's hyperparameters. Parallel to ``apply_dataloader_num_workers_to_work_items``: the orchestrator chooses an auto value once at startup (or honors the CLI int) and writes it into every per-work-item hyperparameter dict. fit() reads it from ``self.hyperparameters['random_negative_pool_epochs']`` when constructing its ``RandomNegativesPool``. Parameters ---------- work_items : list of dict Each dict has a ``hyperparameters`` sub-dict. pool_epochs : int The resolved value from ``resolve_local_parallelism_args`` (>= 1). log : callable, optional Logging hook. Defaults to ``print``. """ if log is None: log = print pool_epochs_int = int(pool_epochs) overridden = 0 for item in work_items: hp = item.get("hyperparameters") if hp is None: continue prev = hp.get("random_negative_pool_epochs") hp["random_negative_pool_epochs"] = pool_epochs_int if prev is None or int(prev) != pool_epochs_int: overridden += 1 log( "apply_random_negative_pool_epochs_to_work_items: set %d/%d items to " "random_negative_pool_epochs=%d (overridden=%d)" % ( len(work_items), len(work_items), pool_epochs_int, overridden, ) ) def apply_dataloader_num_workers_to_work_items(work_items, num_workers, *, log=None): """Inject ``dataloader_num_workers`` into every work item's hyperparameters. Writes the resolved value into affinity work-item hyperparameters. It is consumed by streaming pretraining; in-memory affinity fitting ignores it. Processing models do not use this affinity DataLoader hyperparameter. Parameters ---------- work_items : list of dict Each dict has a ``hyperparameters`` sub-dict (the canonical shape produced by ``train_pan_allele_models_command`` / ``train_allele_specific_models_command``). num_workers : int The resolved value from ``resolve_local_parallelism_args``. Use 0 to force in-process batching (no prefetch children). log : callable, optional Logging hook for the human-readable summary. Defaults to ``print``. """ if log is None: log = print overridden = 0 for item in work_items: hp = item.get("hyperparameters") if hp is None: continue prev = hp.get("dataloader_num_workers") hp["dataloader_num_workers"] = int(num_workers) if prev is None or int(prev) != int(num_workers): overridden += 1 log( "apply_dataloader_num_workers_to_work_items: set %d/%d items to " "dataloader_num_workers=%d (overridden=%d)" % ( len(work_items), len(work_items), int(num_workers), overridden, ) ) def apply_resolved_training_hyperparameters_to_work_items( work_items, args, *, log=None): """Inject resolved per-model training knobs into work item hyperparameters. ``resolve_local_parallelism_args`` owns hardware-dependent CLI resolution. Trainers should call this once after constructing work items so pan-allele, allele-specific, and future affinity trainers all persist the same resolved settings in component-model hyperparameters. """ if getattr(args, "dataloader_num_workers", None) is not None: apply_dataloader_num_workers_to_work_items( work_items, int(args.dataloader_num_workers), log=log, ) if getattr(args, "random_negative_pool_epochs", None) is not None: apply_random_negative_pool_epochs_to_work_items( work_items, int(args.random_negative_pool_epochs), log=log, ) mhcflurry-2.3.6/mhcflurry/parallelism/torch_compile.py000066400000000000000000000405731525677230600233040ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Torch compile environment and cache-warmup helpers.""" import os import sys import time from ..common import normalize_pytorch_backend from ..memory_budget import per_worker_memory_budget_bytes from ..workload_planning import env_int from .planning import ( refine_local_parallelism_from_warmup, resolve_local_parallelism_args, ) from .worker_pool import worker_pool_with_gpu_assignments from .worker_runtime import call_wrapped_kwargs _INDUCTOR_THREAD_HARD_CAP = 16 _INDUCTOR_WARMUP_THREAD_HARD_CAP = 64 WORKER_CONTEXT = {} def _run_resource_probe_item(work_function, work_item): """Run one resource probe using data installed once in this process.""" item = dict(work_item) if "constant_data" not in item and "constant_data" in WORKER_CONTEXT: item["constant_data"] = WORKER_CONTEXT["constant_data"] return call_wrapped_kwargs(work_function, item) def _torch_compile_enabled(): return os.environ.get("MHCFLURRY_TORCH_COMPILE", "0") == "1" def _auto_torchinductor_compile_threads(num_jobs, phase="production"): """Return auto-sized Inductor compile helper count for this phase.""" cpu_count_ = os.cpu_count() or 1 if phase == "warmup": threads = min(cpu_count_, _INDUCTOR_WARMUP_THREAD_HARD_CAP) cap_name = "MHCFLURRY_TORCHINDUCTOR_WARMUP_COMPILE_THREADS_CAP" else: threads = min( _INDUCTOR_THREAD_HARD_CAP, max(1, cpu_count_ // max(int(num_jobs), 1)), ) cap_name = "MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_CAP" raw_cap = os.environ.get(cap_name) if raw_cap not in (None, ""): threads = min( threads, env_int(cap_name, raw_cap, bounds=(1, None)), ) return max(1, threads) def _compile_threads_env_is_auto_owned(): return ( os.environ.get("MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_AUTO") == "1" or os.environ.get("TORCHINDUCTOR_COMPILE_THREADS") == "auto" ) def _set_auto_torchinductor_compile_threads(num_jobs, phase="production"): """Set ``TORCHINDUCTOR_COMPILE_THREADS`` to the auto value.""" threads = _auto_torchinductor_compile_threads(num_jobs, phase=phase) os.environ["TORCHINDUCTOR_COMPILE_THREADS"] = str(threads) os.environ["MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_AUTO"] = "1" return threads def _compile_threads_num_jobs(num_jobs): if num_jobs is None: return 1 if isinstance(num_jobs, str) and num_jobs.strip().lower() == "auto": return 1 return max(int(num_jobs), 1) def resolve_torchinductor_compile_threads_env(num_jobs=1, phase="production"): """Ensure ``TORCHINDUCTOR_COMPILE_THREADS`` is parseable by PyTorch. MHCflurry launchers accept ``TORCHINDUCTOR_COMPILE_THREADS=auto`` as an orchestrator-owned sentinel so each command can size the Inductor compiler helper pool after it knows its local worker count. PyTorch itself does not accept that sentinel: Inductor parses the env var with ``int(...)``. This helper is for entry points that do not run the full local-parallelism resolver before importing or spawning PyTorch work. It leaves unset and user-pinned integer values alone, resolves orchestrator-owned ``auto`` to a numeric value, and fails early on other invalid values with a clearer message than the downstream Inductor traceback. """ value = os.environ.get("TORCHINDUCTOR_COMPILE_THREADS") if value in (None, ""): return None auto_owned = ( value == "auto" or os.environ.get("MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_AUTO") == "1" ) if auto_owned: return _set_auto_torchinductor_compile_threads( num_jobs=_compile_threads_num_jobs(num_jobs), phase=phase, ) try: int(value) except (TypeError, ValueError): raise ValueError( "TORCHINDUCTOR_COMPILE_THREADS must be an integer or the " "MHCflurry-owned sentinel 'auto'; got %r" % (value,) ) return int(value) def configure_cluster_worker_torch_compile_threads(): """Auto-size Inductor helper threads inside one cluster worker process. Cluster parallelism submits each work item as its own process, often on different nodes. We therefore do not try to share a compile cache across the cluster. Each worker process still needs the same local policy: if compile is enabled and ``TORCHINDUCTOR_COMPILE_THREADS`` is unset or ``auto``, pick a numeric value on that machine before the first ``torch.compile`` call. If a scheduler packs several mhcflurry work items onto one node, set ``MHCFLURRY_CLUSTER_WORKERS_PER_NODE`` so the auto value is divided across those co-resident compiler processes. Otherwise the default assumes one work process owns its scheduler CPU allocation. """ if not _torch_compile_enabled(): resolve_torchinductor_compile_threads_env(num_jobs=1) return if "TORCHINDUCTOR_COMPILE_THREADS" in os.environ and not ( _compile_threads_env_is_auto_owned()): resolve_torchinductor_compile_threads_env(num_jobs=1) return workers_per_node = env_int( "MHCFLURRY_CLUSTER_WORKERS_PER_NODE", "1", bounds=(1, None), ) threads = _set_auto_torchinductor_compile_threads( num_jobs=max(workers_per_node, 1), phase="production", ) print( "torch.compile: cluster worker auto-set " "TORCHINDUCTOR_COMPILE_THREADS=%d " "(MHCFLURRY_CLUSTER_WORKERS_PER_NODE=%d)" % ( threads, workers_per_node, ), file=sys.stderr, ) def hoist_torchinductor_compile_threads(args, phase="production"): """Auto-size ``TORCHINDUCTOR_COMPILE_THREADS`` for local training. ``torch.compile`` (when enabled via ``MHCFLURRY_TORCH_COMPILE=1``) spins up an inductor compile worker pool that defaults to ``os.cpu_count()`` threads. With N fit() workers each running their own compile pool, that multiplies into an oversubscribed compile storm. The production phase uses an auto value derived from available cores and the worker count; the warmup phase uses a larger value because only one worker is compiling. The orchestrator owns "how many workers will exist", so it owns the env knob too: set once before forking, every worker inherits. Skips the hoist when the user has already pinned the value or when ``MHCFLURRY_TORCH_COMPILE`` isn't on. Cluster workers running on other hosts must size themselves locally; see ``configure_cluster_worker_torch_compile_threads``. Lives here (not in any one ``train_*_command`` module) so processing, allele-specific, and any future train command can call it the same way. """ if not _torch_compile_enabled(): # No compile = no compile pool to size, but still normalize any # inherited MHCflurry-owned sentinel before a worker imports PyTorch. resolve_torchinductor_compile_threads_env( num_jobs=getattr(args, "num_jobs", 1), phase=phase, ) return auto_owned = _compile_threads_env_is_auto_owned() if "TORCHINDUCTOR_COMPILE_THREADS" in os.environ and not auto_owned: # User pinned explicitly; don't second-guess. resolve_torchinductor_compile_threads_env( num_jobs=getattr(args, "num_jobs", 1), phase=phase, ) print( "torch.compile: TORCHINDUCTOR_COMPILE_THREADS=%s " "(user-pinned, orchestrator hoist skipped)" % os.environ["TORCHINDUCTOR_COMPILE_THREADS"], file=sys.stderr, ) return num_jobs = _compile_threads_num_jobs(getattr(args, "num_jobs", 1)) cpu_count_ = os.cpu_count() or 1 threads = _auto_torchinductor_compile_threads(num_jobs, phase=phase) if ( auto_owned and os.environ.get("TORCHINDUCTOR_COMPILE_THREADS") == str(threads)): return _set_auto_torchinductor_compile_threads(num_jobs, phase=phase) print( "torch.compile: hoisted TORCHINDUCTOR_COMPILE_THREADS=%d " "(phase=%s, num_jobs=%d, cpu_count=%d)" % ( threads, phase, num_jobs, cpu_count_, ), file=sys.stderr, ) _COMPILE_KEY_HYPERPARAMS = ( "layer_sizes", "topology", "dropout_probability", "batch_normalization", "activation", "output_activation", "peptide_dense_layer_sizes", "allele_dense_layer_sizes", "peptide_allele_merge_method", "peptide_allele_merge_activation", "locally_connected_layers", "peptide_amino_acid_encoding", "peptide_amino_acid_encoding_torch", "peptide_encoding", "num_outputs", "loss", "convolutional_filters", "convolutional_kernel_size", "convolutional_activation", "post_convolutional_dense_layer_sizes", "convolutional_kernel_l1_l2", "n_flank_length", "c_flank_length", ) def _arch_compile_key(hyperparameters): """Stable fingerprint for hyperparameters that change the compile graph. Two work items with the same key produce the same torch.compile graph and therefore share an on-disk compile cache entry; warming one warms both. Hyperparameters that only affect optimization or regularization (learning rate, L1/L2 reg, max_epochs, patience, ...) are excluded — they're applied outside the compiled forward / loss closure. """ import json return json.dumps( {k: hyperparameters.get(k) for k in _COMPILE_KEY_HYPERPARAMS}, sort_keys=True, default=str, ) _RESOURCE_KEY_HYPERPARAMS = _COMPILE_KEY_HYPERPARAMS + ( "minibatch_size", "validation_batch_size", "validation_split", "fit_tensor_residency", "optimizer", "random_negative_rate", "random_negative_constant", "random_negative_method", "random_negative_pool_epochs", "train_data", ) def _resource_probe_key(hyperparameters): """Stable fingerprint for parameters that can change peak resources.""" import json return json.dumps( {k: hyperparameters.get(k) for k in _RESOURCE_KEY_HYPERPARAMS}, sort_keys=True, default=str, ) def run_single_worker_resource_probe( args, work_items, work_function, constant_data=None): """Measure one real peak phase for every resource-distinct architecture. The command's ``resource_probe_only`` path must exercise its true resident data, configured minibatch, and validation phase for one bounded epoch. The single spawned worker records process-level CUDA memory (including the context), allocator peaks, and host RSS. Those observations may only tighten automatic concurrency before the production pool starts. When torch.compile is enabled the same pass also primes its on-disk cache; resource safety is intentionally independent of compile being enabled. ``work_items`` is not mutated: every task still runs in production. Returns ``None`` when skipped, otherwise the number of unique architectures warmed. """ if not work_items: return None resolve_local_parallelism_args(args) if getattr(args, "cluster_parallelism", False): return None if int(getattr(args, "num_jobs", 0) or 0) <= 1: return None if os.environ.get("MHCFLURRY_RESOURCE_PROBE", "1") == "0": return None compile_enabled = _torch_compile_enabled() backend = normalize_pytorch_backend(getattr(args, "backend", "auto") or "auto") if backend in ("cpu", "mps"): return None seen_keys = set() unique_warmup_items = [] for item in work_items: hp = item.get("hyperparameters") or {} key = _resource_probe_key(hp) if key in seen_keys: continue seen_keys.add(key) unique_warmup_items.append(item) if not unique_warmup_items: return None print( "Resource probe: measuring %d resource-distinct architecture(s) " "of %d work items (full residency + train + validation, " "single-worker phase%s)" % ( len(unique_warmup_items), len(work_items), "; also priming torch.compile cache" if compile_enabled else "", ), file=sys.stderr, ) explicit_threads = compile_enabled and ( "TORCHINDUCTOR_COMPILE_THREADS" in os.environ and not _compile_threads_env_is_auto_owned() ) if compile_enabled and not explicit_threads: threads = _set_auto_torchinductor_compile_threads( num_jobs=1, phase="warmup" ) print( "Resource probe: TORCHINDUCTOR_COMPILE_THREADS=%d " "(single-worker codegen phase)" % threads, file=sys.stderr, ) warmup_pool = None reports = [] try: # The probe is the only GPU worker in this phase. Give it the full # launch-time usable envelope so it measures the requested production # minibatch and validation peak instead of inheriting (and potentially # shrinking to) the preliminary N-worker slice we are validating. launch_available_bytes = getattr( args, "_device_memory_available_bytes_at_launch", None) probe_device_budget_bytes = ( per_worker_memory_budget_bytes(launch_available_bytes, 1) if launch_available_bytes is not None else None ) warmup_pool = worker_pool_with_gpu_assignments( num_jobs=1, num_gpus=1 if int(getattr(args, "gpus", 0) or 0) > 0 else 0, backend=backend, # This phase intentionally has one resident GPU worker. Keep the # advertised co-resident count consistent with the full launch # entitlement above; otherwise runtime batch sizing divides the # probe's budget by the preliminary production density again. max_workers_per_gpu=1, device_memory_budget_bytes=probe_device_budget_bytes, max_tasks_per_worker=len(unique_warmup_items) + 1, worker_log_dir=getattr(args, "worker_log_dir", None), cpu_threads_per_worker=getattr( args, "cpu_threads_per_worker", None), cpu_threads_per_worker_was_auto=getattr( args, "cpu_threads_per_worker_was_auto", True), # Spawn (not fork) for parity with the production pools below; # forked CUDA workers break if the parent has touched CUDA. start_method="spawn", worker_context_module=(__name__ if constant_data is not None else None), worker_context_data=( {"constant_data": constant_data} if constant_data is not None else None ), ) warmup_started_at = time.time() for warmup_item in unique_warmup_items: item_for_worker = dict(warmup_item) item_for_worker["resource_probe_only"] = True report = warmup_pool.apply( _run_resource_probe_item, (work_function, item_for_worker) ) if report: reports.append(report) warmup_pool.close() warmup_pool.join() warmup_pool = None print( "Resource probe: completed %d architecture probe(s) in " "%.1f sec." % ( len(unique_warmup_items), time.time() - warmup_started_at, ), file=sys.stderr, ) finally: if warmup_pool is not None: warmup_pool.terminate() warmup_pool.join() if compile_enabled: hoist_torchinductor_compile_threads(args, phase="production") refine_local_parallelism_from_warmup(args, reports) return len(unique_warmup_items) def run_single_worker_torch_compile_warmup( args, work_items, work_function, constant_data=None): """Compatibility alias for :func:`run_single_worker_resource_probe`.""" return run_single_worker_resource_probe( args, work_items, work_function, constant_data=constant_data, ) mhcflurry-2.3.6/mhcflurry/parallelism/worker_pool.py000066400000000000000000000672361525677230600230240ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Multiprocessing worker-pool scheduling helpers.""" import itertools import logging import multiprocessing import multiprocessing.pool import os import sys import types from multiprocessing import cpu_count from pprint import pprint import numpy from ..common import configure_pytorch, normalize_pytorch_backend from ..workload_planning import WORKLOAD_GENERIC from .planning import ( cuda_visible_devices_from_env, refine_local_parallelism_from_spawn_context, resolve_local_parallelism_args, ) from .worker_runtime import ( configure_worker_cpu_threads, worker_init, worker_init_entry_point, ) # ---- Non-daemonic worker pool -------------------------------------------- # # By default ``multiprocessing.Pool`` spawns daemon workers, and daemon # processes cannot fork their own children. Streaming pretraining can use # PyTorch DataLoader workers to prefetch batches, so mhcflurry's outer training # pool must use non-daemonic workers. The runtime fallback in # ``class1_training._effective_num_workers`` still downgrades to # ``num_workers=0`` if an external caller uses a daemon process, but production # training should keep prefetch available by using this pool. # # Non-daemon workers have one behavioral difference worth naming: if the # parent process dies ungracefully (e.g. SIGKILL), the workers may # linger as zombies rather than being auto-reaped by init. The # training orchestrator's ``try/finally`` closes and joins the pool on # clean exit, so this only matters under unusual fault modes. class _NonDaemonProcessMixin: @property def daemon(self) -> bool: return False @daemon.setter def daemon(self, value) -> None: # Silently ignore; ``multiprocessing.Pool._repopulate_pool`` sets # daemon=True on every fresh worker, so we must tolerate the # assignment without raising. pass class NonDaemonProcess(_NonDaemonProcessMixin, multiprocessing.Process): """A ``multiprocessing.Process`` whose ``daemon`` flag cannot be set. Reading ``.daemon`` always returns False; writes are no-ops. This lets us instantiate ``multiprocessing.pool.Pool`` with a worker class that declines to be a daemon, so the DataLoader inside each worker can spawn its own prefetch children. """ class NonDaemonContext(type(multiprocessing.get_context())): """A multiprocessing context that hands out ``NonDaemonProcess`` workers. Subclasses the current default multiprocessing context so its start method is preserved — we only swap the Process class. The Pool uses ``self._ctx.Process(...)`` to create workers and will now get our non-daemonic variant. """ Process = NonDaemonProcess class NonDaemonSpawnProcess( _NonDaemonProcessMixin, multiprocessing.context.SpawnProcess): pass class NonDaemonSpawnContext(multiprocessing.context.SpawnContext): Process = NonDaemonSpawnProcess if hasattr(multiprocessing.context, "ForkProcess"): class NonDaemonForkProcess( _NonDaemonProcessMixin, multiprocessing.context.ForkProcess): pass class NonDaemonForkContext(multiprocessing.context.ForkContext): Process = NonDaemonForkProcess else: NonDaemonForkContext = None if hasattr(multiprocessing.context, "ForkServerProcess"): class NonDaemonForkServerProcess( _NonDaemonProcessMixin, multiprocessing.context.ForkServerProcess): pass class NonDaemonForkServerContext( multiprocessing.context.ForkServerContext): Process = NonDaemonForkServerProcess else: NonDaemonForkServerContext = None _NON_DAEMON_CONTEXT_BY_START_METHOD = { "spawn": NonDaemonSpawnContext, } if NonDaemonForkContext is not None: _NON_DAEMON_CONTEXT_BY_START_METHOD["fork"] = NonDaemonForkContext if NonDaemonForkServerContext is not None: _NON_DAEMON_CONTEXT_BY_START_METHOD["forkserver"] = ( NonDaemonForkServerContext) def non_daemon_context(start_method=None): """Return a multiprocessing context whose workers are non-daemonic.""" if start_method is None: return NonDaemonContext() try: context_class = _NON_DAEMON_CONTEXT_BY_START_METHOD[start_method] except KeyError: raise ValueError( "Unsupported multiprocessing start_method: %s" % ( start_method,)) from None return context_class() class NonDaemonPool(multiprocessing.pool.Pool): """A ``multiprocessing.Pool`` that runs non-daemonic workers. Pool's constructor takes a ``context`` kwarg — we thread a ``NonDaemonContext`` through so each worker is a ``NonDaemonProcess``. Everything else (apply_async, imap, etc.) inherits unchanged. """ def __init__(self, *args, **kwargs): start_method = kwargs.pop("start_method", None) if start_method is not None and "context" in kwargs: raise ValueError("Pass either context or start_method, not both") # Callers may pass their own context; if not, use our non-daemon one. kwargs.setdefault("context", non_daemon_context(start_method)) super().__init__(*args, **kwargs) def chunk_ranges_for_local_parallelism( num_items, num_jobs=0, chunks_per_worker=4): """ Split a row/sequence axis into stable contiguous chunks for local workers. Parameters ---------- num_items : int Number of input items. num_jobs : int Number of worker processes. ``0`` yields one serial chunk. chunks_per_worker : int Target number of work chunks per worker for load balancing. Returns ------- list of tuple ``(chunk_index, start, end)`` ranges. """ num_items = int(num_items) if num_items <= 0: return [] num_jobs = max(int(num_jobs or 0), 1) target_chunks = min(num_items, max(1, num_jobs * int(chunks_per_worker))) chunk_size = int(numpy.ceil(float(num_items) / target_chunks)) return [ (i, start, min(start + chunk_size, num_items)) for (i, start) in enumerate(range(0, num_items, chunk_size)) ] def worker_pool_with_gpu_assignments_from_args( args, workload_name=WORKLOAD_GENERIC, workload_hints=None, start_method=None, worker_context_module=None, worker_context_data=None): """ Create a multiprocessing.Pool where each worker uses its own GPU. Uses commandline arguments. See `worker_pool_with_gpu_assignments`. Resolves ``args.max_workers_per_gpu="auto"`` to an int (mutating ``args`` so downstream consumers — e.g. inference batch sizing in calibrate — observe the same value). Parameters ---------- args : argparse.Namespace Parsed local-parallelism options. workload_name : str Workload profile used for automatic sizing. workload_hints : dict, optional Model/data size hints for that profile. start_method : str, optional Multiprocessing start method. worker_context_module : str, optional Module whose WORKER_CONTEXT receives constant data. worker_context_data : dict, optional Constant data installed once per worker. Returns ------- multiprocessing.Pool """ resolve_local_parallelism_args( args, workload_name=workload_name, workload_hints=workload_hints, ) refine_local_parallelism_from_worker_context( args, worker_context_data, start_method=start_method, ) # --gpus only takes effect when there are worker processes to assign it to. # A serial run (num_jobs == 0) ignores it. Warn when the user *explicitly* # asked for GPUs but ends up serial, so "--gpus 4 --num-jobs 0" doesn't # silently drop the GPU request. (The auto path legitimately resolves gpus # alongside num_jobs == 0 on CPU-only boxes, so don't warn there.) if (args.num_jobs == 0 and args.gpus and not getattr(args, "gpus_was_auto", False)): print( "Warning: --gpus %d is ignored because num_jobs resolved to 0 " "(serial run). Pass --num-jobs > 0 to fan out across the " "requested GPUs." % args.gpus, file=sys.stderr) return worker_pool_with_gpu_assignments( num_jobs=args.num_jobs, num_gpus=args.gpus, backend=args.backend, max_workers_per_gpu=args.max_workers_per_gpu, device_memory_budget_bytes=getattr( args, "device_memory_budget_bytes", None), max_tasks_per_worker=args.max_tasks_per_worker, worker_log_dir=args.worker_log_dir, cpu_threads_per_worker=getattr( args, "cpu_threads_per_worker", None), cpu_threads_per_worker_was_auto=getattr( args, "cpu_threads_per_worker_was_auto", True), start_method=start_method, worker_context_module=worker_context_module, worker_context_data=worker_context_data, ) def refine_local_parallelism_from_worker_context( args, worker_context_data, start_method=None): """Apply spawn-context host sizing before code chooses serial/parallel.""" effective_start_method = ( start_method or multiprocessing.get_start_method(allow_none=True) or multiprocessing.get_context().get_start_method() ) refinement_key = (id(worker_context_data), effective_start_method) if getattr(args, "_worker_context_memory_refinement_key", None) == ( refinement_key): return args if ( worker_context_data is not None and effective_start_method != "fork" and int(args.num_jobs) > 0): refine_local_parallelism_from_spawn_context( args, estimate_worker_context_bytes(worker_context_data), ) args._worker_context_memory_refinement_key = refinement_key return args def estimate_worker_context_bytes(value, _seen=None): """Best-effort deep resident size for data copied into spawn workers.""" if _seen is None: _seen = set() identity = id(value) if identity in _seen: return 0 _seen.add(identity) if value is None or isinstance(value, (bool, int, float, complex)): return sys.getsizeof(value) if isinstance(value, (str, bytes, bytearray)): return sys.getsizeof(value) if isinstance(value, numpy.ndarray): # Owned ndarrays usually include their buffer in getsizeof; views do # not. Taking the maximum avoids double-counting the common case. return max(sys.getsizeof(value), int(value.nbytes)) if isinstance(value, (types.ModuleType, types.FunctionType, type)): return 0 # pandas DataFrame/Series/Index expose accurate deep payload accounting. memory_usage = getattr(value, "memory_usage", None) if callable(memory_usage): try: usage = memory_usage(deep=True) return int(usage.sum() if hasattr(usage, "sum") else usage) except (AttributeError, TypeError, ValueError): pass # Torch tensors are optional and must not force a torch import in the # orchestrator. Duck-type their exact storage payload when already loaded. if ( value.__class__.__module__.startswith("torch") and hasattr(value, "nelement") and hasattr(value, "element_size")): try: return int(value.nelement()) * int(value.element_size()) except (RuntimeError, TypeError, ValueError): pass size = sys.getsizeof(value) if isinstance(value, dict): return size + sum( estimate_worker_context_bytes(item, _seen) for pair in value.items() for item in pair ) if isinstance(value, (list, tuple, set, frozenset)): return size + sum( estimate_worker_context_bytes(item, _seen) for item in value ) attributes = getattr(value, "__dict__", None) if isinstance(attributes, dict): size += estimate_worker_context_bytes(attributes, _seen) return size def worker_pool_uses_fork(worker_pool=None): """Return True when local Pool workers inherit parent globals by fork.""" context = getattr(worker_pool, "_ctx", None) if context is not None: return context.get_start_method() == "fork" try: method = multiprocessing.get_start_method(allow_none=True) if method is None: method = multiprocessing.get_context().get_start_method() return method == "fork" except RuntimeError: return False def attach_constant_data_to_work_items_if_needed( work_items, constant_data, worker_pool, *, log=None): """Attach constant data only when the Pool cannot inherit it by fork.""" if log is None: log = print if worker_pool_uses_fork(worker_pool): log( "Local Pool uses fork; workers inherit WORKER_CONTEXT without " "per-task pickle payloads." ) return False log( "Local Pool does not use fork; attaching WORKER_CONTEXT to each work " "item for worker delivery." ) for item in work_items: item["constant_data"] = constant_data return True def worker_pool_with_gpu_assignments( num_jobs, num_gpus=0, backend=None, max_workers_per_gpu=1, max_tasks_per_worker=None, worker_log_dir=None, cpu_threads_per_worker=None, cpu_threads_per_worker_was_auto=True, start_method=None, worker_context_module=None, worker_context_data=None, device_memory_budget_bytes=None): """ Create a multiprocessing.Pool where each worker uses its own GPU. Parameters ---------- num_jobs : int Number of worker processes. num_gpus : int backend : string max_workers_per_gpu : int max_tasks_per_worker : int worker_log_dir : string cpu_threads_per_worker : int Runtime BLAS/OpenMP/PyTorch thread limit applied in each worker. cpu_threads_per_worker_was_auto : bool Whether mhcflurry owns the uniform runtime limit. False preserves caller-provided OMP/MKL/OpenBLAS settings. start_method : string Optional multiprocessing start method, e.g. ``"spawn"`` when workers must not inherit PyTorch state from the parent process. worker_context_module : string, optional Module containing a ``WORKER_CONTEXT`` dictionary used by worker functions. worker_context_data : dict, optional Constant data to install once per process during initialization. This avoids serializing the same large payload with every queued task on spawn-based platforms. device_memory_budget_bytes : int, optional Fixed launch-time device-memory entitlement propagated to each GPU worker for elastic batch sizing. Kept last in the signature so adding the planner-owned value does not change existing positional calls. Returns ------- multiprocessing.Pool """ backend = normalize_pytorch_backend(backend or "auto") if (worker_context_module is None) != (worker_context_data is None): raise ValueError( "worker_context_module and worker_context_data must be supplied " "together" ) validate_worker_pool_args( num_jobs=num_jobs, num_gpus=num_gpus, backend=backend, max_workers_per_gpu=max_workers_per_gpu) if num_jobs == 0: applied_threads = configure_worker_cpu_threads( cpu_threads_per_worker, auto_owned=cpu_threads_per_worker_was_auto, ) configure_pytorch(backend=backend, num_threads=applied_threads) return None worker_init_kwargs = worker_init_kwargs_for_scheduler( num_jobs=num_jobs, num_gpus=num_gpus, backend=backend, max_workers_per_gpu=max_workers_per_gpu, device_memory_budget_bytes=device_memory_budget_bytes, cpu_threads_per_worker=cpu_threads_per_worker, cpu_threads_per_worker_was_auto=( cpu_threads_per_worker_was_auto )) if num_gpus: print( "Assigning %d workers across %d CUDA GPUs (%d workers max per GPU). " "Overflow workers will run on CPU." % ( num_jobs, num_gpus, max_workers_per_gpu), file=sys.stderr) for (worker_num, kwargs) in enumerate(worker_init_kwargs): print( "Worker %d assigned backend=%s GPUs=%s" % ( worker_num, kwargs["backend"], kwargs.get("gpu_device_nums")), file=sys.stderr) if worker_log_dir: os.makedirs(worker_log_dir, exist_ok=True) for kwargs in worker_init_kwargs: kwargs["worker_log_dir"] = worker_log_dir worker_pool = make_worker_pool( processes=num_jobs, initializer=worker_init, initializer_kwargs_per_process=worker_init_kwargs, initializer_shared_kwargs=( { "worker_context_module": worker_context_module, "worker_context_data": worker_context_data, } if worker_context_module is not None else None ), max_tasks_per_worker=max_tasks_per_worker, start_method=start_method) return worker_pool def validate_worker_pool_args( num_jobs, num_gpus=0, backend="auto", max_workers_per_gpu=1): """ Validate local worker scheduling arguments. ``--gpus`` controls CUDA worker assignment only. It does not select MPS devices and it does not distribute a single model across multiple GPUs. """ backend = normalize_pytorch_backend(backend or "auto") if num_jobs < 0: raise ValueError("num_jobs must be >= 0") if num_gpus is None: num_gpus = 0 if num_gpus < 0: raise ValueError("num_gpus must be >= 0") if max_workers_per_gpu < 1: raise ValueError("max_workers_per_gpu must be >= 1") if num_gpus and num_jobs > 0: if backend not in ("auto", "gpu"): raise ValueError( "num_gpus is only supported with backend 'auto' or 'gpu'") def worker_init_kwargs_for_scheduler( num_jobs, num_gpus=0, backend="auto", max_workers_per_gpu=1, cpu_threads_per_worker=None, cpu_threads_per_worker_was_auto=True, device_memory_budget_bytes=None): """ Build per-worker init kwargs from the local scheduling configuration. When ``num_gpus`` is set, workers are assigned one CUDA GPU each in round robin order. Any additional workers are forced onto CPU by hiding CUDA and setting their backend to ``cpu``. """ backend = normalize_pytorch_backend(backend or "auto") validate_worker_pool_args( num_jobs=num_jobs, num_gpus=num_gpus, backend=backend, max_workers_per_gpu=max_workers_per_gpu) if not num_gpus: result = [ {"backend": backend, "max_workers_per_gpu": max_workers_per_gpu} for _ in range(num_jobs) ] if cpu_threads_per_worker is not None: for kwargs in result: kwargs["cpu_threads_per_worker"] = cpu_threads_per_worker kwargs["cpu_threads_per_worker_was_auto"] = ( cpu_threads_per_worker_was_auto ) return result cuda_visible_devices = cuda_visible_devices_from_env() if cuda_visible_devices is None: gpu_device_nums = list(range(num_gpus)) else: gpu_device_nums = cuda_visible_devices[:num_gpus] if len(gpu_device_nums) < num_gpus: logging.warning( "num_gpus=%d exceeds CUDA_VISIBLE_DEVICES=%r; assigning " "only the %d scheduler-visible GPU(s)", num_gpus, os.environ.get("CUDA_VISIBLE_DEVICES"), len(gpu_device_nums), ) gpu_assignments = list(itertools.chain.from_iterable( gpu_device_nums for _ in range(max_workers_per_gpu))) worker_kwargs = [] for worker_num in range(num_jobs): if worker_num < len(gpu_assignments): worker_kwargs.append({ "backend": "gpu", "gpu_device_nums": [gpu_assignments[worker_num]], "max_workers_per_gpu": max_workers_per_gpu, }) else: worker_kwargs.append({ "backend": "cpu", "gpu_device_nums": [], "max_workers_per_gpu": max_workers_per_gpu, }) if cpu_threads_per_worker is not None: for kwargs in worker_kwargs: kwargs["cpu_threads_per_worker"] = cpu_threads_per_worker kwargs["cpu_threads_per_worker_was_auto"] = ( cpu_threads_per_worker_was_auto ) if device_memory_budget_bytes is not None: for kwargs in worker_kwargs: if kwargs["backend"] == "gpu": kwargs["device_memory_budget_bytes"] = int( device_memory_budget_bytes) return worker_kwargs def make_worker_pool( processes=None, initializer=None, initializer_kwargs_per_process=None, initializer_shared_kwargs=None, max_tasks_per_worker=None, start_method=None): """ Convenience wrapper to create a multiprocessing.Pool. This function adds support for per-worker initializer arguments, which are not natively supported by the multiprocessing module. The motivation for this feature is to support allocating each worker to a (different) GPU. IMPLEMENTATION NOTE: The per-worker initializer arguments are implemented using a ``SimpleQueue``. Each worker reads its arguments from this queue when it starts. When it terminates, it adds its initializer arguments back to the queue, so a future process can initialize itself using these arguments. ``SimpleQueue`` is important here: ``Queue.put`` uses a feeder thread, so workers can observe a transiently empty queue during startup and duplicate GPU assignments. A worker that puts its arguments back can also hang forever joining that feeder thread during process finalization. There is one issue with this approach, however. If a worker crashes, it never repopulates the queue of initializer arguments. This will prevent any future worker from re-using those arguments. To deal with this issue we add a second 'backup queue'. This queue always contains the full set of initializer arguments: whenever a worker reads from it, it always pushes the pop'd args back to the end of the queue immediately. If the primary arg queue is ever empty, then workers will read from this backup queue. Parameters ---------- processes : int Number of workers. Default: num CPUs. initializer : function, optional Init function to call in each worker initializer_kwargs_per_process : list of dict, optional Arguments to pass to initializer function for each worker. Length of list must equal the number of workers. initializer_shared_kwargs : dict, optional Arguments passed once to every worker initializer. Unlike work-item arguments, large values here are serialized only once per process. max_tasks_per_worker : int, optional Restart workers after this many tasks. start_method : string, optional Multiprocessing start method to use for the worker pool. Returns ------- multiprocessing.Pool """ if processes is None: processes = cpu_count() if int(processes) < 1: raise ValueError("processes must be a positive integer") processes = int(processes) if max_tasks_per_worker is not None: max_tasks_per_worker = int(max_tasks_per_worker) if max_tasks_per_worker < 1: raise ValueError("max_tasks_per_worker must be a positive integer") if initializer_shared_kwargs is not None: if initializer is None: raise ValueError( "initializer_shared_kwargs requires an initializer" ) if not isinstance(initializer_shared_kwargs, dict): raise TypeError("initializer_shared_kwargs must be a dict") if initializer_kwargs_per_process is not None: if initializer is None: raise ValueError( "initializer_kwargs_per_process requires an initializer" ) if len(initializer_kwargs_per_process) != processes: raise ValueError( "initializer_kwargs_per_process must contain one mapping " "per worker (%d expected, %d received)" % ( processes, len(initializer_kwargs_per_process)) ) if not all( isinstance(kwargs, dict) for kwargs in initializer_kwargs_per_process): raise TypeError( "initializer_kwargs_per_process entries must be dicts" ) if initializer_shared_kwargs: overlaps = [ sorted(set(kwargs).intersection(initializer_shared_kwargs)) for kwargs in initializer_kwargs_per_process ] overlaps = [values for values in overlaps if values] if overlaps: raise ValueError( "Initializer arguments supplied as both shared and " "per-process values: %s" % ", ".join(overlaps[0]) ) pool_context = non_daemon_context(start_method) if start_method else None pool_kwargs = { 'processes': processes, } if max_tasks_per_worker is not None: pool_kwargs["maxtasksperchild"] = max_tasks_per_worker if start_method: pool_kwargs["context"] = pool_context if initializer: if initializer_kwargs_per_process: assignment_context = pool_context or multiprocessing.get_context() slots = assignment_context.Array("q", processes) sequence = assignment_context.Value("q", 0, lock=False) pool_kwargs["initializer"] = worker_init_entry_point pool_kwargs["initargs"] = ( initializer, initializer_kwargs_per_process, slots, sequence, initializer_shared_kwargs, ) elif initializer_shared_kwargs: pool_kwargs["initializer"] = worker_init_entry_point pool_kwargs["initargs"] = ( initializer, None, None, None, initializer_shared_kwargs, ) else: pool_kwargs["initializer"] = initializer # Use a non-daemonic pool so workers can spawn DataLoader children. # See NonDaemonPool for the rationale. worker_pool = NonDaemonPool(**pool_kwargs) print("Started pool: %s" % str(worker_pool), file=sys.stderr) printable_pool_kwargs = dict(pool_kwargs) if initializer_shared_kwargs or initializer_kwargs_per_process: printable_pool_kwargs["initargs"] = ( initializer, "", "" % ", ".join( sorted(initializer_shared_kwargs or {}) ), ) pprint(printable_pool_kwargs, stream=sys.stderr) return worker_pool mhcflurry-2.3.6/mhcflurry/parallelism/worker_runtime.py000066400000000000000000000231211525677230600235170ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Worker initialization and error-wrapping helpers.""" import importlib import os import random import sys import time import traceback from multiprocessing.util import Finalize import numpy from threadpoolctl import threadpool_limits from ..common import configure_pytorch from ..pytorch_sizing import ( CUDA_FREE_BEFORE_CONTEXT_ENV, cuda_free_memory_before_context_bytes, ) from .planning import resolved_int _WORKER_THREADPOOL_LIMITER = None def install_worker_context(module_name, data): """Install one process-wide constant-data mapping for worker functions.""" module = importlib.import_module(module_name) target = getattr(module, "WORKER_CONTEXT", None) if not isinstance(target, dict): raise ValueError("%s.WORKER_CONTEXT must be a dict" % module_name) if data is None: raise ValueError( "worker_context_data is required with worker_context_module" ) # Under fork this may be the exact inherited dictionary. Under spawn it is # a separately unpickled object that must be installed in the module-level # dictionary captured by worker function defaults. if target is not data: target.clear() target.update(data) return target def configure_worker_cpu_threads(num_threads, auto_owned=True): """Apply a fit worker's CPU-thread budget to loaded native runtimes. Forked workers inherit already-initialized BLAS/OpenMP pools, so setting only environment variables in the parent is insufficient. Keep the environment synchronized for libraries loaded later and use threadpoolctl to resize the native pools already present in this process. Caller-owned OMP/MKL/OpenBLAS settings are authoritative and must not be replaced by a uniform auto-derived limit. """ global _WORKER_THREADPOOL_LIMITER if num_threads is None or not auto_owned: return None num_threads = resolved_int(num_threads, "cpu_threads_per_worker") if num_threads < 1: raise ValueError("cpu_threads_per_worker must be at least 1") for name in ( "OMP_NUM_THREADS", "MKL_NUM_THREADS", "OPENBLAS_NUM_THREADS"): os.environ[name] = str(num_threads) _WORKER_THREADPOOL_LIMITER = threadpool_limits(limits=num_threads) return num_threads def release_initializer_slot(slots, slot, generation): """Return a worker's assignment without writing a shutdown pipe.""" with slots.get_lock(): if slots[slot] == generation: slots[slot] = 0 def worker_init_entry_point( init_function, kwargs_per_process=None, slots=None, sequence=None, shared_kwargs=None): kwargs = {} if kwargs_per_process: # Arguments travel through normal process startup (shared under fork), # never a preloaded pipe. Only assignment generations use shared memory. with slots.get_lock(): count = len(kwargs_per_process) start = sequence.value % count slot = next(( (start + offset) % count for offset in range(count) if slots[(start + offset) % count] == 0 ), start) # If a killed worker skipped finalizers, retain the previous # round-robin fallback. Generations protect a reclaimed slot from # a late finalizer belonging to its previous owner. sequence.value += 1 generation = sequence.value slots[slot] = generation kwargs = dict(kwargs_per_process[slot]) Finalize( None, release_initializer_slot, (slots, slot, generation), exitpriority=1) print("Initializing worker with: %s" % sorted(kwargs), file=sys.stderr) if shared_kwargs: overlap = set(kwargs).intersection(shared_kwargs) if overlap: raise ValueError( "Worker initializer arguments supplied as both shared and " "per-process values: %s" % ", ".join(sorted(overlap)) ) kwargs.update(shared_kwargs) init_function(**kwargs) def worker_init( keras_backend=None, backend=None, gpu_device_nums=None, worker_log_dir=None, max_workers_per_gpu=None, cpu_threads_per_worker=None, cpu_threads_per_worker_was_auto=True, worker_context_module=None, worker_context_data=None, device_memory_budget_bytes=None): del keras_backend # legacy argument retained for API compatibility if worker_log_dir: os.makedirs(worker_log_dir, exist_ok=True) # Line buffering (buffering=1) ensures every print/traceback flushes # to disk immediately. Without it, Python defaults to ~8 KB block # buffering on a regular file, which silently swallows worker # output if the worker is killed (OOM, signal) before the buffer # fills. With block buffering, a worker spinning at 99% CPU and # then OOM-killed leaves a 0-byte LOG file because no flush # ever fires before the worker dies — line buffering avoids that. sys.stderr = sys.stdout = open(os.path.join( worker_log_dir, "LOG-worker.%d.%d.txt" % (os.getpid(), int(time.time()))), "w", buffering=1) if backend == "gpu" and gpu_device_nums and len(gpu_device_nums) == 1: free_before_context = cuda_free_memory_before_context_bytes( gpu_device_nums[0]) if free_before_context is not None: os.environ[CUDA_FREE_BEFORE_CONTEXT_ENV] = str( free_before_context) # Each worker needs distinct random numbers numpy.random.seed() random.seed() cpu_threads_per_worker = configure_worker_cpu_threads( cpu_threads_per_worker, auto_owned=cpu_threads_per_worker_was_auto, ) configure_kwargs = {"backend": backend} if gpu_device_nums is not None: configure_kwargs["gpu_device_nums"] = gpu_device_nums if cpu_threads_per_worker is not None: configure_kwargs["num_threads"] = cpu_threads_per_worker if gpu_device_nums is not None: print("WORKER pid=%d assigned GPU devices: %s" % ( os.getpid(), gpu_device_nums), file=sys.stderr) configure_pytorch(**configure_kwargs) # Reseed torch's global RNG too (numpy/random above don't touch it). # Torch RNG drives weight init and any tensor op without an explicit # generator; without this, forked workers would share a stream. Seed # from the freshly-reseeded numpy RNG so the value is per-worker # distinct. Done after configure_pytorch so any visible CUDA device is # seeded; a no-op for CUDA generators when the worker is CPU-pinned. import torch torch.manual_seed(int(numpy.random.randint(0, 2 ** 31 - 1))) # Install model/data context only after the worker's runtime and GPU # assignment are configured. This keeps context initialization from # accidentally creating runtime state against the parent's device view. if worker_context_module is not None: install_worker_context(worker_context_module, worker_context_data) # Propagate workers-per-GPU into the process env so auto-sized # batching (Class1NeuralNetwork.predict / fit's # check_training_batch_fits) can partition VRAM correctly when # multiple fit()/predict() calls are co-resident on one GPU. if max_workers_per_gpu is not None: os.environ["MHCFLURRY_MAX_WORKERS_PER_GPU"] = str( resolved_int(max_workers_per_gpu, "max_workers_per_gpu")) if device_memory_budget_bytes is not None and backend == "gpu": device_memory_budget_bytes = int(device_memory_budget_bytes) if device_memory_budget_bytes < 0: raise ValueError("device_memory_budget_bytes must be non-negative") os.environ["MHCFLURRY_DEVICE_MEMORY_BUDGET_BYTES"] = str( device_memory_budget_bytes) # Solution suggested in https://bugs.python.org/issue13831 class WrapException(Exception): """ Add traceback info to exception so exceptions raised in worker processes can still show traceback info when re-raised in the parent. """ def __init__(self): exc_type, exc_value, exc_tb = sys.exc_info() self.exception = exc_value self.formatted = ''.join(traceback.format_exception(exc_type, exc_value, exc_tb)) def __str__(self): return '%s\nOriginal traceback:\n%s' % (Exception.__str__(self), self.formatted) def call_wrapped(function, *args, **kwargs): """ Run function on args and kwargs and return result, wrapping any exception raised in a WrapException. Parameters ---------- function : arbitrary function Any other arguments provided are passed to the function. Returns ------- object """ try: return function(*args, **kwargs) except Exception: raise WrapException() def call_wrapped_kwargs(function, kwargs): """ Invoke function on given kwargs and return result, wrapping any exception raised in a WrapException. Parameters ---------- function : arbitrary function kwargs : dict Returns ------- object Result of calling ``function(**kwargs)``. """ return call_wrapped(function, **kwargs) mhcflurry-2.3.6/mhcflurry/peptide_reference.py000066400000000000000000000203621525677230600216120ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Helpers for matching observed peptides to reference proteins.""" import collections import pandas import tqdm tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 def normalize_reference_dataframe(reference_df): """Return reference proteins indexed by accession.""" if "accession" not in reference_df.columns: if reference_df.index.name == "accession": return reference_df raise ValueError("Expected reference_df to include an accession column") return reference_df.set_index("accession") def annotate_peptide_references( peptide_df, reference_df, flanking_length=15, debug_max_rows=None): """Annotate peptides with matching reference proteins and flanks. Parameters ---------- peptide_df : pandas.DataFrame DataFrame with a ``peptide`` column. Its index is carried into the output as ``hit_id``. reference_df : pandas.DataFrame DataFrame with protein ``accession`` and ``seq`` columns. flanking_length : int Number of residues to include on each side of the peptide. debug_max_rows : int, optional Stop building annotations after this many reference rows have been produced. Intended only for generation-script debugging. Returns ------- pandas.DataFrame Original peptide rows joined to their reference protein annotations. """ return _annotate_peptide_references( peptide_df, reference_df, flanking_length=flanking_length, debug_max_rows=debug_max_rows, backend="auto") def _annotate_peptide_references( peptide_df, reference_df, flanking_length=15, debug_max_rows=None, backend="auto"): reference_df = normalize_reference_dataframe(reference_df) if "seq" not in reference_df.columns: raise ValueError("Expected reference_df to include a seq column") if "peptide" not in peptide_df.columns: raise ValueError("Expected peptide_df to include a peptide column") peptides = set(peptide_df.peptide) print("Unique peptides", len(peptides)) occurrences = _find_peptide_occurrences( peptides, reference_df, backend=backend) print("Peptides with protein matches", len(occurrences)) join_df = _build_join_dataframe( peptide_df, reference_df, occurrences, flanking_length, debug_max_rows) join_df["protein_accession"] = join_df.match_index.map( reference_df.index.to_series().reset_index(drop=True)) del join_df["match_index"] protein_cols = [ c for c in reference_df.columns if c not in ["name", "description", "seq"] ] for col in protein_cols: join_df["protein_%s" % col] = join_df.protein_accession.map( reference_df[col]) return pandas.merge( join_df, peptide_df, how="left", left_on="hit_id", right_index=True) def _non_overlapping_starts(starts, peptide_length): """Match legacy ``re.finditer(peptide, seq)`` semantics.""" result = [] next_allowed_start = 0 for start in sorted(set(starts)): if start >= next_allowed_start: result.append(start) next_allowed_start = start + peptide_length return result def _normalize_occurrences(occurrences): result = {} for peptide, protein_to_starts in occurrences.items(): peptide_length = len(peptide) normalized = {} for protein_idx, starts in protein_to_starts.items(): starts = _non_overlapping_starts(starts, peptide_length) if starts: normalized[protein_idx] = starts if normalized: result[peptide] = normalized return result def _find_occurrences_sliding(peptides, reference_df): """Pure-Python fallback: scan each protein by observed peptide length.""" peptides_by_length = collections.defaultdict(set) for peptide in peptides: peptides_by_length[len(peptide)].add(peptide) length_sets = sorted(peptides_by_length.items()) occurrences = collections.defaultdict(lambda: collections.defaultdict(list)) for protein_idx, seq in tqdm.tqdm( enumerate(reference_df.seq), total=len(reference_df), desc="Scanning proteins"): seq_len = len(seq) for length, length_peptides in length_sets: stop = seq_len - length + 1 if stop <= 0: continue for start in range(stop): peptide = seq[start:start + length] if peptide in length_peptides: occurrences[peptide][protein_idx].append(start) return _normalize_occurrences(occurrences) def _find_occurrences_ahocorasick(peptides, reference_df): """Use Rust-backed Aho-Corasick exact matching.""" import ahocorasick_rs peptides = sorted(peptides) automaton = ahocorasick_rs.AhoCorasick( peptides, matchkind=ahocorasick_rs.MATCHKIND_STANDARD) occurrences = collections.defaultdict(lambda: collections.defaultdict(list)) for protein_idx, seq in tqdm.tqdm( enumerate(reference_df.seq), total=len(reference_df), desc="Scanning proteins"): for pattern_idx, start, end in automaton.find_matches_as_indexes( seq, overlapping=True): peptide = peptides[pattern_idx] if end - start == len(peptide): occurrences[peptide][protein_idx].append(start) return _normalize_occurrences(occurrences) def _find_peptide_occurrences(peptides, reference_df, backend="auto"): if backend == "auto": backend = "ahocorasick" if backend == "ahocorasick": print("Using ahocorasick-rs peptide reference lookup", flush=True) return _find_occurrences_ahocorasick(peptides, reference_df) if backend == "sliding": print("Using sliding-window peptide reference lookup", flush=True) return _find_occurrences_sliding(peptides, reference_df) raise ValueError("Unsupported peptide reference backend: %s" % backend) def _build_join_dataframe( peptide_df, reference_df, occurrences, flanking_length, debug_max_rows): join_df = [] for row in tqdm.tqdm( peptide_df.itertuples(), total=len(peptide_df), desc="Building annotations"): hit_id = row.Index peptide = row.peptide protein_to_starts = occurrences.get(peptide, {}) for match_index, starts in sorted(protein_to_starts.items()): reference_row = reference_df.iloc[match_index] for start in starts: end_pos = start + len(peptide) n_flank = reference_row.seq[ max(start - flanking_length, 0): start ].rjust(flanking_length, "X") c_flank = reference_row.seq[ end_pos: (end_pos + flanking_length) ].ljust(flanking_length, "X") join_df.append(( hit_id, match_index, len(protein_to_starts), len(starts), start, start / len(reference_row.seq), n_flank, c_flank, )) if debug_max_rows and len(join_df) > debug_max_rows: break return pandas.DataFrame( join_df, columns=[ "hit_id", "match_index", "num_proteins", "num_occurrences_in_protein", "start_position", "start_fraction_in_protein", "n_flank", "c_flank", ]).drop_duplicates() mhcflurry-2.3.6/mhcflurry/percent_rank_transform.py000066400000000000000000000006341525677230600227100ustar00rootroot00000000000000"""Backward-compatible import for the historical histogram implementation. New code should use the explicit HistogramPercentRankTransform name. The alias also allows historical pickle references to resolve. """ from .histogram_percent_rank_transform import HistogramPercentRankTransform PercentRankTransform = HistogramPercentRankTransform __all__ = ["HistogramPercentRankTransform", "PercentRankTransform"] mhcflurry-2.3.6/mhcflurry/percentile_calibration.py000066400000000000000000000261331525677230600226450ustar00rootroot00000000000000"""Shared method selection and persistence for predictor percentile ranks.""" import json import hashlib import os import uuid import warnings from pathlib import Path import numpy as np import pandas as pd from .compact_percent_rank_transform import CompactPercentRankTransform from .histogram_percent_rank_transform import HistogramPercentRankTransform def calibration_method(method, bins): """Resolve the default without changing historical explicit-bin calls.""" if method is None: method = "histogram" if bins is not None else "compact" if method not in ("histogram", "compact"): raise ValueError("Percentile method must be 'histogram' or 'compact'") if method == "compact" and bins is not None: raise ValueError("Histogram bins cannot be combined with compact calibration") return method def factorize_calibration_groups(groups): """Return ``(inverse, group_count)`` codes reusable across aligned fits. Calibrating many alleles against one peptide reference repeats the same grouping. Factorize it once and pass the result as ``group_codes``; the fitted transforms are identical to passing ``groups`` each time. """ unique, inverse = np.unique(np.asarray(groups), return_inverse=True) return inverse.reshape(-1), len(unique) def fit_percent_rank_transform(values, *, method=None, bins=None, score_transform="logit", survival=False, max_knots=128, groups=None, group_codes=None): """Fit a histogram or a label-free, validation-selected compact curve. Compact fitting starts with 64 knots. A deterministic 80/20 background split permits 128 only for a meaningful reduction in cutoff-mass error. Groups (normally peptides) cannot cross that split. The selected budget is refitted on the full reference; no evaluation labels are accepted. Parameters ---------- values : one-dimensional sequence of float Independent reference scores, not case/control labels. method : {"compact", "histogram"}, optional Compact unless explicit bins select histogram. Compact plus bins is invalid. This low-level helper requires bins for histogram fitting. bins : int or sequence, optional Histogram bin definition, forwarded without changing its semantics. score_transform : {"logit", "log"} Compact input coordinate: log for positive affinity IC50, logit for probability-valued processing/presentation scores. survival : bool, default False Percentile direction for budget validation: True for upper-tail processing/presentation ranks, False for affinity CDF ranks. This does not change the returned transform's default direction; pass survival=True explicitly when evaluating upper-tail percentiles. max_knots : {64, 128}, default 128 Compact ceiling. Fit 64 unless held-out cutoff-mass error improves beyond max(0.01, 10% of the better error). Ignored for histograms. groups : sequence, optional Aligned identities that must not cross the selection split. If absent, each row is a separate group. Selection uses fixed seed 403, requires at least 1,000 groups and two cutoffs with ten expected observations. group_codes : tuple of (array of int, int), optional Precomputed ``factorize_calibration_groups(groups)`` for the same aligned reference rows. Mutually exclusive with ``groups``. Returns ------- HistogramPercentRankTransform or CompactPercentRankTransform Fitted transform. Compact ``selection`` metadata records the decision and available reference-validation diagnostics. """ method = calibration_method(method, bins) if method == "histogram": if bins is None: raise ValueError("Histogram fitting requires bins") return HistogramPercentRankTransform().fit(values, bins) if max_knots not in (64, 128): raise ValueError("max_knots must be 64 or 128") values = np.asarray(values, dtype=float) if groups is not None and group_codes is not None: raise ValueError("Pass calibration groups or group_codes, not both") # Validate even references too small for a split. model = CompactPercentRankTransform(score_transform).fit(values, 64) if group_codes is not None: inverse, group_count = group_codes inverse = np.asarray(inverse) if inverse.shape != values.shape: raise ValueError("Calibration groups must align with reference scores") elif groups is None: inverse = np.arange(len(values)) group_count = len(values) else: groups = np.asarray(groups) if groups.shape != values.shape: raise ValueError("Calibration groups must align with reference scores") unique, inverse = np.unique(groups, return_inverse=True) group_count = len(unique) selected = 64 diagnostics = dict(selected_knots=64, max_knots=max_knots, seed=403, reference_count=len(values), group_count=group_count, reference_sha256=hashlib.sha256(values.astype("= 1000: shuffled = np.random.default_rng(403).permutation(group_count) validation_groups = np.zeros(group_count, dtype=bool) validation_groups[shuffled[:group_count // 5]] = True validation = validation_groups[inverse] fit_values, validation_values = values[~validation], values[validation] # Avoid trying to validate cutoffs supported by fewer than ten scores. cutoffs = np.array([.03, .1, .3, 1., 3., 10.]) cutoffs = cutoffs[cutoffs * len(validation_values) / 100 >= 10] if (len(cutoffs) >= 2 and len(np.unique(fit_values)) >= 2): errors = {} for budget in (64, 128): trial = CompactPercentRankTransform(score_transform).fit(fit_values, budget) ranks = np.sort(trial.transform(validation_values, survival=survival)) counts = np.searchsorted(ranks, cutoffs, side="right") observed = 100 * (counts + .5) / (len(ranks) + 1) errors[budget] = float(np.sqrt(np.mean(np.log10(observed / cutoffs) ** 2))) tolerance = max(.01, .1 * min(errors.values())) if errors[64] > errors[128] + tolerance: selected = 128 model.fit(values, 128) diagnostics.update( selected_knots=selected, fit_count=len(fit_values), validation_count=len(validation_values), cutoffs=cutoffs.tolist(), validation_mask_sha256=hashlib.sha256(validation.tobytes()).hexdigest(), rms_log10_error=errors, tolerance=tolerance, reason="128 improves validation beyond tolerance" if selected == 128 else "64 is within validation tolerance") diagnostics["actual_knots"] = len(model.x) model.selection = diagnostics return model def save_percent_rank_transforms(models_dir, transforms): """Save calibrations with atomic replacement of the target file. CSV is retained when all histograms share an edge grid. JSON is authoritative for compact, mixed, or differing-grid collections. Remove the old alternate calibration only after its replacement is successfully written. An empty collection leaves existing calibration files untouched, as historical saves did, so an uncalibrated or incremental save cannot erase a calibration. Files get ordinary umask permissions. Neural-network files are never touched. This does not make the entire model-directory save a transaction across multiple files. """ directory = Path(models_dir) csv_path, json_path = directory / "percent_ranks.csv", directory / "percent_ranks.json" if not transforms: return histogram_only = bool(transforms) and all( isinstance(t, HistogramPercentRankTransform) for t in transforms.values()) series = {name: t.to_series() for name, t in transforms.items()} if histogram_only else {} # Historical CSV requires identical edges for all distributions. same_edges = histogram_only and all( np.array_equal(s.index, next(iter(series.values())).index, equal_nan=True) for s in series.values()) target, alternate = (csv_path, json_path) if same_edges else (json_path, csv_path) # Let the kernel apply this process's umask. mkstemp would force # owner-only mode, and reading the umask to undo that would race other # threads, since the umask is process-global. os.replace keeps the mode. temp = directory / (".percent-ranks-%d-%s" % (os.getpid(), uuid.uuid4().hex)) descriptor = os.open(temp, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o666) try: with os.fdopen(descriptor, "w") as stream: if same_edges: pd.DataFrame(series).to_csv(stream, index=True, index_label="bin") else: json.dump(dict(format="mhcflurry-percent-ranks-v1", transforms={ name: t.to_dict() for name, t in transforms.items()}), stream, allow_nan=False, indent=2) stream.flush() os.fsync(stream.fileno()) os.replace(temp, target) alternate.unlink(missing_ok=True) finally: temp.unlink(missing_ok=True) def load_percent_rank_transforms(models_dir): """Read new calibrations or historical CSV without refitting either.""" directory = Path(models_dir) json_path, csv_path = directory / "percent_ranks.json", directory / "percent_ranks.csv" use_json = json_path.exists() if json_path.exists() and csv_path.exists(): # A save replaces its target and only then removes the alternate format, # so both existing means it was interrupted. Load the newer file and # warn: refusing would make the whole predictor directory unreadable. use_json = json_path.stat().st_mtime >= csv_path.stat().st_mtime warnings.warn( "Both percent_ranks.json and percent_ranks.csv exist in %s; an interrupted " "calibration save left %s behind. Loading the newer file; remove the stale " "one or recalibrate." % (directory, (csv_path if use_json else json_path).name)) if use_json: with json_path.open() as stream: payload = json.load(stream) if payload.get("format") != "mhcflurry-percent-ranks-v1": raise ValueError("Unsupported percentile collection format") result = {} for name, values in payload["transforms"].items(): implementation = (HistogramPercentRankTransform if values.get("format") == "histogram-cdf-v1" else CompactPercentRankTransform) result[name] = implementation.from_dict(values) return result if (directory / "percent_ranks.csv").exists(): frame = pd.read_csv(directory / "percent_ranks.csv", index_col=0) return {name: HistogramPercentRankTransform.from_series(frame[name]) for name in frame} return {} mhcflurry-2.3.6/mhcflurry/predict_command.py000066400000000000000000000014201525677230600212640ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Compatibility wrapper for :mod:`mhcflurry.cli.predict_command`.""" from .cli import predict_command as _impl run = _impl.run parser = _impl.parser def __getattr__(name): return getattr(_impl, name) __all__ = ["run", "parser"] mhcflurry-2.3.6/mhcflurry/predict_scan_command.py000066400000000000000000000014321525677230600222730ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Compatibility wrapper for :mod:`mhcflurry.cli.predict_scan_command`.""" from .cli import predict_scan_command as _impl run = _impl.run parser = _impl.parser def __getattr__(name): return getattr(_impl, name) __all__ = ["run", "parser"] mhcflurry-2.3.6/mhcflurry/processing_evaluation.py000066400000000000000000000050631525677230600225460ustar00rootroot00000000000000"""Integrity checks for a frozen, expanded processing evaluation cohort.""" import hashlib import json from pathlib import Path import numpy import pandas from .experiment_archive import sha256_file from .processing_matching import MATCHING_POLICY, validate_matched_training_data IDENTITY = ["sample_id", "peptide", "protein_accession", "n_flank", "c_flank", "hla", "hit"] def hit_identity(frame): """Ordered hit identities, including MHC alleles and protein context.""" hits = frame.loc[frame.hit.eq(1), IDENTITY].fillna("").astype(str) return pandas.util.hash_pandas_object(hits, index=False).to_numpy() def verify_hits(original, matched): """Fail if matching removes, duplicates, reorders or changes a held-out hit.""" if not numpy.array_equal(hit_identity(original), hit_identity(matched)): raise ValueError("Expanded processing cohort changed held-out hits") def load_processing_cohort(directory, original): """Read a checksummed 10:1 cohort and prove it retains the benchmark hits.""" directory = Path(directory) metadata = json.loads((directory / "cohort.json").read_text()) filename = metadata["cohort_file"] if Path(filename).name != filename: raise ValueError("Invalid processing cohort filename") path = directory / filename if sha256_file(path) != metadata["cohort_sha256"]: raise ValueError("Processing cohort checksum mismatch") if metadata["policy"] != MATCHING_POLICY or metadata["decoys_per_hit"] != 10: raise ValueError("Processing evaluation requires current-policy unique 10:1 negatives") frame = pandas.read_csv(path, dtype={"sample_id": str}) frame[["n_flank", "c_flank"]] = frame[["n_flank", "c_flank"]].fillna("") validate_matched_training_data(frame) verify_hits(original, frame) if (set(frame.sample_id) != set(original.sample_id.astype(str)) or len(frame) != metadata["rows"] or int(frame.hit.sum()) != metadata["hits"] or frame.sample_id.nunique() != metadata["samples"] or not frame.matching_decoys_per_hit.eq(10).all() or not frame.matching_max_log10_distance.eq(metadata["max_log10_affinity_distance"]).all() or not frame.matching_random_seed.eq(metadata["seed"]).all() or not frame.matching_affinity_reference_sha256.eq(metadata["affinity_reference"]["sha256"]).all() or hashlib.sha256(hit_identity(frame).tobytes()).hexdigest() != metadata["hit_identity_sha256"]): raise ValueError("Processing cohort metadata disagrees with saved assignments") return frame, metadata mhcflurry-2.3.6/mhcflurry/processing_initialization.py000066400000000000000000000127011525677230600234230ustar00rootroot00000000000000"""Explicit hidden-layer initialization for processing recipe experiments. LSUV follows orthogonal initialization with sequential variance adjustment (Mishkin and Matas, https://arxiv.org/abs/1511.06422). Scalar processing heads and the final aggregation/gating weights are deliberately not reinitialized. """ import math import torch from .data_dependent_weights_initialization import svd_orthonormal METHODS = ("none", "orthogonal", "lsuv_pre", "lsuv_post") def processing_hidden_layers(model): """Return eligible named affine layers in the actual forward order.""" result = [] if model.cleavage_boundary_enabled: result += [("n_boundary_hidden", model.n_boundary_hidden), ("c_boundary_hidden", model.c_boundary_hidden)] result.append(("conv1", model.conv1)) for prefix in ("n_flank_post_convs", "c_flank_post_convs"): result += [("%s.%d" % (prefix, index), layer) for index, layer in enumerate(getattr(model, prefix)[:-1])] return result def processing_activation_variance(model, layer, inputs, post_activation=False): """Measure a hidden output, excluding positions beyond each input sequence. Post-activation means the configured activation immediately after the affine layer, before any normalization/dropout. Missing-context X tokens inside configured windows are included; maximum-length tail padding is not. The caller owns eval mode. Hooks are removed even if forward fails. """ captured = [] def capture(module, args, output): value = model.conv_activation(output) if post_activation else output if value.ndim == 3: lengths = inputs["peptide_length"].reshape(-1) if not model.cleavage_boundary_enabled: lengths = lengths + model.n_flank_length + model.c_flank_length positions = torch.arange(value.shape[2], device=value.device) mask = positions.unsqueeze(0) < lengths.unsqueeze(1) value = value.transpose(1, 2)[mask] captured.append(value.var(unbiased=False).item()) handle = layer.register_forward_hook(capture) try: with torch.no_grad(): model(inputs) finally: handle.remove() if len(captured) != 1 or not math.isfinite(captured[0]): raise ValueError("Initialization requires exactly one finite hidden-layer output") return captured[0] def initialize_processing_network(model, inputs, method="none", margin=0.05, max_iter=32): """Initialize eligible hidden layers, with auditable pre/post-LSUV results. Parameters ---------- model : Class1ProcessingModel Fresh eager network. Output/scalar-head parameters remain untouched. inputs : dict Fixed calibration batch containing training rows only, on model device. method : {"none", "orthogonal", "lsuv_pre", "lsuv_post"} Explicit initialization policy. None is an exact no-op, including RNG. margin : float Maximum absolute deviation of the measured variance from one. max_iter : int Maximum scaling iterations per layer; failure is explicit. Returns ------- dict Effective policy, variance mask, and per-layer initialization diagnostics. """ if method not in METHODS: raise ValueError("Unknown processing initialization method: %s" % method) if not 0 < margin < 1 or max_iter < 1: raise ValueError("Invalid processing LSUV margin or iteration limit") report = {"method": method, "layers": [], "variance_mask": "configured_context_without_tail_padding"} if method == "none": return report if not len(inputs["peptide_length"]): raise ValueError("Initialization requires a nonempty training calibration batch") training_states = [(module, module.training) for module in model.modules()] original = {name: value.detach().clone() for name, value in model.state_dict().items()} model.eval() try: for name, layer in processing_hidden_layers(model): with torch.no_grad(): weight = torch.as_tensor(svd_orthonormal(tuple(layer.weight.shape)), device=layer.weight.device, dtype=layer.weight.dtype) layer.weight.copy_(weight) record = {"layer": name, "iterations": 0} if method != "orthogonal": variance = processing_activation_variance(model, layer, inputs, method == "lsuv_post") record["initial_variance"] = variance while abs(variance - 1) > margin and record["iterations"] < max_iter: if variance < 1e-14: raise ValueError("Degenerate processing LSUV output: " + name) with torch.no_grad(): layer.weight.mul_(1 / math.sqrt(variance)) variance = processing_activation_variance(model, layer, inputs, method == "lsuv_post") record["iterations"] += 1 record["final_variance"] = variance if abs(variance - 1) > margin: raise ValueError("Processing LSUV did not converge: %s variance=%g" % (name, variance)) report["layers"].append(record) except Exception: # A rejected initialization must not leave a partially transformed model. model.load_state_dict(original) raise finally: for module, training in training_states: module.training = training return report mhcflurry-2.3.6/mhcflurry/processing_matching.py000066400000000000000000000644321525677230600221760ustar00rootroot00000000000000"""Shared, auditable affinity/length matching for processing data.""" import hashlib import json from functools import lru_cache from pathlib import Path import numpy import pandas from .experiment_archive import sha256_file from .common import DEFAULT_RANDOM_SEED, derive_seed, positive_int_arg, positive_float_arg MATCHING_POLICY = "sample-length-affinity-random-without-replacement-v2" class IncompleteProcessingMatches(ValueError): """A valid scored pool lacks enough negatives for the listed hit rows.""" def __init__(self, message, failures): super().__init__(message) self.failures = failures def __reduce__(self): return type(self), (str(self), self.failures) def add_processing_matching_args(parser): """Shared processing-data CLI policy; legacy filtering is opt-in.""" parser.add_argument("--negative-policy", choices=("matched", "legacy-top-binders"), default="matched") parser.add_argument("--decoys-per-hit", type=positive_int_arg, default=1, help="Matched training negatives per hit (default 1).") parser.add_argument("--max-affinity-distance", type=positive_float_arg, default=0.25, help="Maximum log10-affinity distance, at most 0.25.") def initialize_matching_artifacts(args): """Fingerprint the reference and data before generating any matched table.""" if args.negative_policy == "legacy-top-binders": return None if not numpy.isfinite(args.max_affinity_distance) or not 0 < args.max_affinity_distance <= 0.25: raise ValueError("Processing matching caliper may not exceed 0.25 log10 units") reference = affinity_reference_fingerprint(args.affinity_predictor) directory = Path(str(args.out) + ".matching") if (directory.exists() or Path(args.out).exists()) and not getattr(args, "resume", False): raise ValueError("Use fresh processing data output; preserve prior matching artifacts") sources = [args.hits, args.proteome_peptides or args.proteome_reference_csv] if getattr(args, "exclude_samples_file", None): sources.append(args.exclude_samples_file) provenance = {"policy": MATCHING_POLICY, "affinity_reference": reference, "decoys_per_hit": args.decoys_per_hit, "max_log10_affinity_distance": args.max_affinity_distance, "candidate_pool_multiplier": args.ppv_multiplier, "seed": getattr(args, "random_seed", None), "inputs": {str(Path(p).resolve()): sha256_file(p) for p in sources}} policy_path = directory / "experiment.json" if getattr(args, "resume", False): if not policy_path.is_file(): raise ValueError("Cannot resume without saved matching provenance") saved = json.loads(policy_path.read_text()) validate_preparation_provenance(saved, provenance) if not getattr(args, "resume_matching_dir", None): args.resume_matching_dir = saved.get("reused_matching_artifacts", {}).get("path") prior = getattr(args, "resume_matching_dir", None) if prior: prior_path = Path(prior) / "experiment.json" validate_preparation_provenance(json.loads(prior_path.read_text()), provenance) provenance["reused_matching_artifacts"] = { "path": str(Path(prior).resolve()), "experiment_sha256": sha256_file(prior_path)} if getattr(args, "resume", False) and saved.get("reused_matching_artifacts", {}).get( "experiment_sha256") != sha256_file(prior_path): raise ValueError("Changed processing preparation cache provenance") directory.mkdir(parents=True, exist_ok=True) if not policy_path.exists(): provenance.update(schema_version=2, sampler="numeric-positions-v1") if hasattr(args, "preparation_pipeline_depth"): provenance.update(preparation_pipeline_depth=args.preparation_pipeline_depth, candidate_representation="protein-indices-v1" if args.proteome_reference_csv else "dataframe", matching_implementation=MATCHING_POLICY) policy_path.write_text(json.dumps(provenance, indent=2) + "\n") return reference def validate_preparation_provenance(saved, current): """Allow relocated caches only when scientific inputs and policy agree.""" for key in ("policy", "decoys_per_hit", "max_log10_affinity_distance", "candidate_pool_multiplier", "seed"): if saved.get(key) != current.get(key): raise ValueError("Changed processing preparation input: " + key) if saved["affinity_reference"]["sha256"] != current["affinity_reference"]["sha256"]: raise ValueError("Changed processing preparation affinity reference") def normalized_inputs(value): pairs = [(Path(path).name, digest) for path, digest in value["inputs"].items()] if len({name for name, _ in pairs}) != len(pairs): raise ValueError("Ambiguous preparation input basenames") return sorted(pairs) if normalized_inputs(saved) != normalized_inputs(current): raise ValueError("Changed processing preparation input files") def prepare_processing_training_sample(frame, args, reference): """Save the scored pool before matching; retain failure evidence too.""" directory = Path(str(args.out) + ".matching") sample = str(frame.sample_id.iloc[0]) name = hashlib.sha256(sample.encode()).hexdigest()[:24] frame.to_csv(directory / (name + ".candidate_pool.csv.bz2"), index=False) try: matched, diagnostics = matched_training_data( frame, reference, decoys_per_hit=args.decoys_per_hit, max_distance=args.max_affinity_distance, random_seed=getattr(args, "random_seed", DEFAULT_RANDOM_SEED)) except ValueError as error: (directory / (name + ".failure.json")).write_text(json.dumps( {"sample_id": sample, "error": str(error)}, indent=2) + "\n") raise diagnostics["sample_id"] = sample (directory / (name + ".matching.json")).write_text(json.dumps(diagnostics, indent=2) + "\n") return matched def _random_unique_assignments(targets, proteins, values, negative_proteins, count, caliper, protein_caliper, rng): """Random sequential bipartite matching with augmenting-path repair. ``values`` must be sorted. Each hit has ``count`` slots; a negative can own only one slot. Random draws prefer eligible same-protein negatives. Repair can move earlier assignments to complete a feasible matching. No dense hit-by-negative matrix or recursive graph traversal is needed. """ lower = numpy.searchsorted(values, numpy.nextafter(targets - caliper, -numpy.inf), side="left") upper = numpy.searchsorted(values, numpy.nextafter(targets + caliper, numpy.inf), side="right") # Equal-width calipers form ordered intervals. Earliest-target / # earliest-negative assignment gives an exact feasibility check in # linear time after sorting, before random augmenting paths. In sparse # strong-binder tails this avoids repeatedly exploring the same exhausted # candidate component for hundreds of unmatched hits. feasible = numpy.full((len(targets), count), -1, dtype="int64") cursor = 0 for hit in numpy.argsort(targets, kind="stable"): cursor = max(cursor, int(lower[hit])) found = 0 while cursor < upper[hit] and found < count: distance = float(values[cursor]) - float(targets[hit]) if distance > caliper: break if abs(distance) <= caliper: feasible[hit, found] = cursor found += 1 cursor += 1 if (feasible < 0).any(): return feasible missing_proteins = pandas.isna(proteins) protein_codes = pandas.factorize(numpy.concatenate((proteins, negative_proteins)), sort=False)[0] proteins, negative_proteins = protein_codes[:len(proteins)], protein_codes[len(proteins):] owner = numpy.full(len(values), -1, dtype="int64") assigned = numpy.full(len(targets) * count, -1, dtype="int64") @lru_cache(maxsize=128) def neighborhood(hit): # Slots for one hit share fixed neighborhoods. Bound the cache rather # than materializing the complete hit-by-negative graph. candidates = numpy.arange(lower[hit], upper[hit]) # Search bounds can round at an inclusive caliper boundary. Check # the actual subtraction too, as the saved-assignment validator does. candidates = candidates[numpy.abs(values[candidates] - targets[hit]) <= caliper] preferred = ((negative_proteins[candidates] == proteins[hit]) & (numpy.abs(values[candidates] - targets[hit]) <= protein_caliper)) if missing_proteins[hit]: preferred[:] = False return candidates, preferred def eligible(slot, free_only=False): candidates, preferred = neighborhood(slot // count) if free_only: free = owner[candidates] < 0 return candidates[free], preferred[free] return candidates, preferred def repair(root): # Every occupied negative leads to its owning slot. Parent edges # recover the alternating path when we reach a free negative. parents = {root: None} visited = numpy.zeros(len(assigned), dtype=bool) visited[root] = True queue = [root] for slot in queue: candidates, preferred = eligible(slot) order = numpy.concatenate((rng.permutation(candidates[preferred]), rng.permutation(candidates[~preferred]))) # Each occupied negative has a distinct owning slot. Once that # slot is queued, revisiting its edge cannot extend the search. # Filter after permutation to preserve RNG consumption and the # exact original path order for every seed. owners = owner[order] order = order[(owners < 0) | ~visited[owners]] for negative in order: other = int(owner[negative]) if other < 0: while True: assigned[slot] = negative owner[negative] = slot parent = parents[slot] if parent is None: return True slot, negative = parent elif other not in parents: parents[other] = (slot, int(negative)) visited[other] = True queue.append(other) return False for slot in rng.permutation(len(assigned)): candidates, preferred = eligible(int(slot), free_only=True) if len(candidates): choices = candidates[preferred] if preferred.any() else candidates negative = int(rng.choice(choices)) assigned[slot] = negative owner[negative] = slot else: repair(int(slot)) return assigned.reshape(len(targets), count) def _sample_unique_negatives(frame, negatives, hits, count, caliper, protein_caliper, random_seed): """Match independently per sample/length, retaining the input hit order.""" selected = numpy.full((len(hits), count), -1, dtype="int64") keys = ["sample_id", "peptide_len"] pools = {key: group.sort_values("log10_affinity", kind="stable") for key, group in negatives.groupby(keys, sort=False)} for (sample, length), group in hits.groupby(keys, sort=False): pool = pools.get((sample, length)) if pool is None: continue # Separate calls / worker scheduling cannot change a sample's RNG. seed = derive_seed(random_seed, MATCHING_POLICY, hashlib.sha256(str(sample).encode()).hexdigest(), int(length)) positions = _random_unique_assignments( group.log10_affinity.to_numpy(dtype="float64"), group.protein_accession.astype(object).where(group.protein_accession.notna(), None).to_numpy(), pool.log10_affinity.to_numpy(dtype="float64"), pool.protein_accession.astype(object).where(pool.protein_accession.notna(), None).to_numpy(), count, caliper, protein_caliper, numpy.random.default_rng(seed)) valid = positions >= 0 rows = numpy.full(positions.shape, -1, dtype="int64") rows[valid] = pool.index.to_numpy()[positions[valid]] # Keep same-protein rows first for the existing match-rank convention. negative_proteins = pool.protein_accession.astype(object).where( pool.protein_accession.notna(), None).to_numpy() hit_proteins = group.protein_accession.astype(object).where( group.protein_accession.notna(), None).to_numpy() same = (valid & group.protein_accession.notna().to_numpy()[:, None] & (negative_proteins[positions.clip(0)] == hit_proteins[:, None]) & (numpy.abs(pool.log10_affinity.to_numpy()[positions.clip(0)] - group.log10_affinity.to_numpy()[:, None]) <= protein_caliper)) order = numpy.argsort(~same, axis=1, kind="stable") selected[group.index.to_numpy()] = numpy.take_along_axis(rows, order, axis=1) return selected def make_affinity_controlled_risk_sets( frame, decoys_per_hit=10, same_protein_caliper=0.25, max_distance=0.25, random_seed=DEFAULT_RANDOM_SEED): """Return seeded random risk sets without reusing negatives per sample. Draw uniformly among available negatives within the affinity caliper, preferring the same source protein. Randomized assignment order and augmenting-path repair avoid false failures caused by greedy competition. This does not sample complete matchings uniformly. ``random_seed`` is recorded in diagnostics; identical ordered inputs and seed reproduce the assignments independently of sample batching. """ if decoys_per_hit < 1 or int(decoys_per_hit) != decoys_per_hit: raise ValueError("decoys_per_hit must be positive") if not numpy.isfinite(max_distance) or not 0 <= max_distance <= 0.25: raise ValueError("Matching requires a finite affinity caliper between 0 and 0.25") if isinstance(random_seed, bool) or not isinstance(random_seed, (int, numpy.integer)): raise ValueError("Matching requires an integer random seed") if frame.empty or not frame.index.equals(pandas.RangeIndex(len(frame))): raise ValueError("Matching requires a nonempty, range-indexed cohort") if not numpy.isfinite(frame.log10_affinity).all(): raise ValueError("Matching affinity must be finite") if frame[["sample_id", "peptide", "peptide_len", "hit"]].isna().any().any(): raise ValueError("Matching identities and labels must be nonmissing") if not frame.hit.isin([0, 1]).all() or not frame.hit.eq(1).any(): raise ValueError("Matching requires binary labels and at least one hit") if not frame.peptide.str.len().eq(frame.peptide_len).all(): raise ValueError("Peptide lengths do not match sequences") if same_protein_caliper is not None and ( not numpy.isfinite(same_protein_caliper) or same_protein_caliper < 0): raise ValueError("same_protein_caliper must be finite and nonnegative") negatives = frame.index[frame.hit == 0].to_numpy(dtype="int64") # One sequence per sample is one decoy, even if it maps to many proteins. # Factorize unsorted identities once. Building two MultiIndexes sorted # hundreds of thousands of peptide strings just to check set membership. identities = frame.groupby(["sample_id", "peptide"], sort=False).ngroup().to_numpy(dtype="int64") if numpy.isin(identities[negatives], identities[frame.hit == 1]).any(): raise ValueError("An observed peptide is also labelled as a negative in its sample") _, first = numpy.unique(identities[negatives], return_index=True) negative_frame = frame.loc[negatives[numpy.sort(first)]] hit_indices = frame.index[frame.hit == 1].to_numpy() hits = frame.loc[hit_indices].reset_index(drop=True) targets = hits.log10_affinity.to_numpy(dtype="float64") protein_distance = (min(max_distance, same_protein_caliper) if same_protein_caliper is not None else max_distance) selected = _sample_unique_negatives(frame, negative_frame, hits, decoys_per_hit, max_distance, protein_distance, random_seed) counts = (selected >= 0).sum(axis=1) unresolved = numpy.flatnonzero(counts != decoys_per_hit) if len(unresolved): failures = [{"sample_id": str(hits.at[i, "sample_id"]), "peptide": hits.at[i, "peptide"], "available": int(counts[i]), "log10_affinity": float(targets[i]), "peptide_length": int(hits.at[i, "peptide_len"])} for i in unresolved] raise IncompleteProcessingMatches( "%d hits could not be assigned %d affinity/length-matched decoys " "without replacement within %.3g log10 units. Expand the scored candidate pool; " "no hits were silently dropped and no unmatched fallback was used. Examples: %s" % ( len(unresolved), decoys_per_hit, max_distance, failures[:5]), failures) row_indices = numpy.column_stack([hit_indices, selected]).ravel() risk_ids = numpy.repeat(numpy.arange(len(hits)), decoys_per_hit + 1) match_ranks = numpy.tile(numpy.arange(decoys_per_hit + 1), len(hits)) same_protein = numpy.ones((len(hits), decoys_per_hit + 1), dtype=bool) proteins = frame.protein_accession.astype(object).where( frame.protein_accession.notna(), None).to_numpy() hit_proteins = proteins[hit_indices] for i in range(decoys_per_hit): same_protein[:, i + 1] = ( hits.protein_accession.notna().to_numpy() & (proteins[selected[:, i]] == hit_proteins) & (numpy.abs(frame.log10_affinity.to_numpy()[selected[:, i]] - targets) <= protein_distance)) same_protein = same_protein.ravel() distances = numpy.abs(frame.log10_affinity.to_numpy()[row_indices] - targets[risk_ids]) result = frame.loc[row_indices].copy().reset_index().rename( columns={"index": "source_row"}) result["risk_set_id"] = numpy.asarray(risk_ids, dtype="int64") result["match_rank"] = numpy.asarray(match_ranks, dtype="int16") result["same_protein_match"] = numpy.asarray(same_protein, dtype=bool) result["log10_affinity_distance"] = numpy.asarray( distances, dtype="float64") negative_counts = result.loc[result.hit.eq(0)].groupby(["sample_id", "peptide"]).size() diagnostics = { "policy": MATCHING_POLICY, "max_log10_affinity_distance": max_distance, "risk_sets": int(result.risk_set_id.nunique()), "rows": int(len(result)), "decoys_per_hit": int(decoys_per_hit), "same_protein_caliper": same_protein_caliper, "fallback_decoys": int((~same_protein).sum()), "random_seed": int(random_seed), "replacement": False, "unique_negative_sample_peptides": int(len(negative_counts)), "max_negative_reuse": int(negative_counts.max()), "sampling": "uniform-eligible-same-protein-preferred-augmenting-paths", "same_protein_decoy_fraction": float( result.loc[result.hit == 0, "same_protein_match"].mean()), "median_log10_affinity_distance": float( result.loc[result.hit == 0, "log10_affinity_distance"].median()), "p95_log10_affinity_distance": float( result.loc[result.hit == 0, "log10_affinity_distance"].quantile(.95)), } return result, diagnostics def affinity_reference_fingerprint(directory): """Identify the frozen reference using its manifest, weights and sequences.""" directory = Path(directory) paths = [directory / "manifest.csv", directory / "allele_sequences.csv"] for name in pandas.read_csv(paths[0], usecols=["model_name"]).model_name: if Path(name).name != name: raise ValueError("Invalid affinity model name") paths.append(directory / ("weights_" + name + ".npz")) files = {path.name: sha256_file(path) for path in paths} digest = hashlib.sha256(json.dumps(files, sort_keys=True).encode()).hexdigest() return {"path": str(directory.resolve()), "sha256": digest, "files": files} def matched_training_data(frame, reference, decoys_per_hit=1, max_distance=0.25, random_seed=DEFAULT_RANDOM_SEED): """Retain hits and construct a fixed number of matched negatives per hit.""" frame = frame.copy().reset_index(drop=True) if not frame.hit.fillna(0).isin([0, 1]).all(): raise ValueError("Matching requires binary hit labels") frame["hit"] = frame.hit.fillna(0).astype(int) affinity = pandas.to_numeric(frame.affinity_prediction, errors="raise") if not numpy.isfinite(affinity).all() or (affinity <= 0).any(): raise ValueError("Matching affinity must be finite and positive") frame["log10_affinity"] = numpy.log10(affinity) frame["peptide_len"] = frame.peptide.str.len() matched, diagnostics = make_affinity_controlled_risk_sets( frame, decoys_per_hit=decoys_per_hit, max_distance=max_distance, random_seed=random_seed) matched["processing_matching_policy"] = MATCHING_POLICY matched["matching_affinity_reference_sha256"] = reference["sha256"] matched["matching_max_log10_distance"] = max_distance matched["matching_decoys_per_hit"] = decoys_per_hit matched["matching_random_seed"] = int(random_seed) return matched, diagnostics def validate_matched_training_data(frame, policy="matched"): """Reject unmatched/corrupt cached tables before training or resuming.""" if policy == "legacy": return if policy != "matched": raise ValueError("Unknown processing data policy: " + policy) required = ["sample_id", "peptide", "hit", "risk_set_id", "affinity_prediction", "processing_matching_policy", "matching_affinity_reference_sha256", "matching_max_log10_distance", "matching_decoys_per_hit", "matching_random_seed"] if frame.empty or set(required) - set(frame): raise ValueError("Processing requires matched training data. Regenerate it; " "use --processing-data-policy legacy only for explicit historical replay.") if frame[required].isna().any().any() or not frame.processing_matching_policy.eq(MATCHING_POLICY).all(): raise ValueError("Invalid processing matching metadata") for name in ("matching_affinity_reference_sha256", "matching_max_log10_distance", "matching_decoys_per_hit", "matching_random_seed"): if frame[name].nunique() != 1: raise ValueError("Inconsistent matching configuration: " + name) seed = frame.matching_random_seed.iloc[0] if isinstance(seed, (bool, numpy.bool_)) or not isinstance(seed, (int, numpy.integer)): raise ValueError("Invalid matching random seed") caliper = float(frame.matching_max_log10_distance.iloc[0]) count = float(frame.matching_decoys_per_hit.iloc[0]) reference = str(frame.matching_affinity_reference_sha256.iloc[0]) if len(reference) != 64 or any(c not in "0123456789abcdef" for c in reference): raise ValueError("Invalid affinity reference fingerprint") validate_matching_assignments(frame, "affinity_prediction", count, caliper) fold_columns = [c for c in frame if c.startswith("fold_") and c[5:].isdigit()] if fold_columns and frame.groupby("sample_id")[fold_columns].nunique().gt(1).any().any(): raise ValueError("Matched training folds must keep complete samples together") def validate_matching_assignments(frame, affinity_column, count, caliper=0.25): """Recompute matching invariants instead of trusting saved distances.""" count = float(count) if not numpy.isfinite(caliper) or not 0 <= caliper <= 0.25 or count < 1 or not count.is_integer(): raise ValueError("Invalid matching caliper or negative count") required = ["sample_id", "risk_set_id", "peptide", "hit", affinity_column] if frame.empty or set(required) - set(frame) or frame[required].isna().any().any(): raise ValueError("Matching assignments are empty or missing required identities") values = pandas.to_numeric(frame[affinity_column], errors="raise") if not numpy.isfinite(values).all() or (values <= 0).any(): raise ValueError("Invalid matching affinities") groups = frame.groupby(["sample_id", "risk_set_id"], sort=False) sizes = groups.hit.agg(["sum", "count"]) if not frame.hit.isin([0, 1]).all() or not sizes["sum"].eq(1).all() or not sizes["count"].eq(count + 1).all(): raise ValueError("Invalid matched hit/decoy ratio") lengths = frame.assign(_length=frame.peptide.str.len()).groupby(["sample_id", "risk_set_id"])._length.nunique() if not lengths.eq(1).all(): raise ValueError("Matching group mixes peptide lengths") hits = frame.loc[frame.hit == 1].set_index(["sample_id", "risk_set_id"])[affinity_column] targets = pandas.MultiIndex.from_frame(frame[["sample_id", "risk_set_id"]]).map(hits) if (numpy.abs(numpy.log10(values.to_numpy()) - numpy.log10(numpy.asarray(targets, dtype=float))) > caliper + 1e-10).any(): raise ValueError("Saved negatives exceed their affinity caliper") if frame.duplicated(["sample_id", "risk_set_id", "peptide"]).any(): raise ValueError("A matched risk set repeats a peptide") positives = pandas.MultiIndex.from_frame(frame.loc[frame.hit == 1, ["sample_id", "peptide"]]) negatives = pandas.MultiIndex.from_frame(frame.loc[frame.hit == 0, ["sample_id", "peptide"]]) if negatives.duplicated().any(): raise ValueError("Matching without replacement repeats a negative peptide within a sample") if negatives.isin(positives).any(): raise ValueError("An observed peptide is also labelled as a negative in its sample") def sample_validation_mask(frame, fraction, seed): """Choose complete samples, independently of architecture-specific fit seeds.""" if not 0 <= fraction < 1: raise ValueError("Validation fraction must be in [0, 1)") if fraction == 0: return numpy.zeros(len(frame), dtype=bool) samples = numpy.sort(frame.sample_id.unique()) if len(samples) < 2: raise ValueError("Matched processing early stopping requires at least two training samples") count = min(len(samples) - 1, max(1, int(numpy.ceil(len(samples) * fraction)))) selected = numpy.random.default_rng(seed).permutation(samples)[:count] return frame.sample_id.isin(selected).to_numpy() mhcflurry-2.3.6/mhcflurry/processing_preparation.py000066400000000000000000000361611525677230600227260ustar00rootroot00000000000000"""Resumable, bounded preparation of scored processing-negative pools.""" import hashlib import json from pathlib import Path import shutil import time from dataclasses import dataclass import numpy import pandas from .common import derive_seed, positive_int_arg from .experiment_archive import sha256_file from .processing_matching import ( IncompleteProcessingMatches, matched_training_data, validate_matched_training_data) from .numeric_proteome import NumericCandidatePool, sequence_keys, MAX_PROCESSING_LENGTH from .numeric_sequences import NumericSequences @dataclass class ScoredValues: """Prediction values and actual scoring time, excluding pipeline queue waits.""" values: object seconds: float def _scored_frame(unscored, response): if not isinstance(response, ScoredValues): raise TypeError("Sample workflows require timed ScoredValues responses") if isinstance(unscored, NumericCandidatePool): return unscored.with_scores(response.values) return unscored.assign(affinity_prediction=response.values) def add_processing_preparation_args(parser): """Options for the adaptive, resumable processing-data command.""" parser.add_argument("--resume", action="store_true", help="Resume the same verified processing preparation output.") parser.add_argument("--resume-matching-dir", help="Reuse scored samples from a prior matching-artifacts directory.") parser.add_argument("--max-expansion-rounds", type=positive_int_arg, default=8, help="Maximum additional candidate rounds per unresolved sample.") parser.add_argument("--expansion-candidates-per-length", type=positive_int_arg, default=100000, help="Additional draws per unresolved length per round (default 100000).") parser.add_argument("--preparation-pipeline-depth", type=positive_int_arg, default=3, help="Maximum active samples per scoring worker (default 3; 1 disables overlap).") def write_json_atomic(path, value): """Publish metadata only after the corresponding data files are closed.""" temporary = path.with_name(path.name + ".tmp") temporary.write_text(json.dumps(value, indent=2, sort_keys=True) + "\n") temporary.replace(path) def write_csv_atomic(path, frame): """Keep interrupted compression from looking like a completed artifact.""" temporary = path.with_name(path.name + ".tmp") frame.to_csv(temporary, index=False, compression="bz2") temporary.replace(path) def validate_pool_hits(frame, hits): """Require exactly the current ordered observed rows and finite scores.""" columns = ["peptide", "protein_accession", "n_flank", "c_flank", "sample_id"] observed = frame.loc[frame.hit.fillna(0).eq(1), columns].fillna("").astype(str).reset_index(drop=True) expected = hits[columns].fillna("").astype(str).reset_index(drop=True) if not observed.equals(expected): raise ValueError("Cached candidate pool has different observed hit rows") affinities = pandas.to_numeric(frame.affinity_prediction, errors="raise") if not numpy.isfinite(affinities).all() or (affinities <= 0).any(): raise ValueError("Cached candidate pool has invalid affinity scores") if not frame.sample_id.eq(str(hits.sample_id.iloc[0])).all(): raise ValueError("Cached candidate pool mixes samples") class SamplePreparation: """Immutable scored rounds plus a checksummed final matched sample.""" def __init__(self, args, sample, hits): self.args = args self.sample = str(sample) self.hits = hits self.directory = Path(str(args.out) + ".matching") self.name = hashlib.sha256(self.sample.encode()).hexdigest()[:24] self.rounds = [] def path(self, suffix): return self.directory / (self.name + suffix) def load_pool(self): """Recover committed rounds, or import a verified prior sample pool.""" prior = getattr(self.args, "resume_matching_dir", None) if prior and Path(prior).resolve() != self.directory.resolve(): source_dir = Path(prior) prior_rounds = sorted(source_dir.glob(self.name + ".round-*.json")) for index, metadata_path in enumerate(prior_rounds): record = json.loads(metadata_path.read_text()) expected = self.name + ".round-%02d.csv.bz2" % index source = source_dir / expected if (record["round"] != index or record["file"] != expected or sha256_file(source) != record["sha256"]): raise ValueError("Corrupt prior processing candidate rounds") target_metadata = self.path(".round-%02d.json" % index) if target_metadata.exists(): if json.loads(target_metadata.read_text())["sha256"] != record["sha256"]: raise ValueError("Prior processing rounds differ from local rounds") continue target = self.directory / expected temporary = target.with_name(target.name + ".tmp") shutil.copy2(source, temporary) temporary.replace(target) write_json_atomic(target_metadata, {**record, "origin": str(source)}) metadata = sorted(self.directory.glob(self.name + ".round-*.json")) if metadata: frames = [] for index, path in enumerate(metadata): record = json.loads(path.read_text()) expected = self.name + ".round-%02d.csv.bz2" % index if record["round"] != index or record["file"] != expected: raise ValueError("Invalid or noncontiguous saved processing rounds") source = self.directory / expected if sha256_file(source) != record["sha256"]: raise ValueError("Corrupt saved processing candidate scores") frames.append(pandas.read_csv(source, dtype={"sample_id": str}, low_memory=False)) self.rounds.append(record) frame = pandas.concat(frames, ignore_index=True) validate_pool_hits(frame, self.hits) return frame # Old runs saved a single complete scored pool but no per-round hashes. source_dir = Path(prior) if prior else self.directory source = source_dir / (self.name + ".candidate_pool.csv.bz2") if not source.exists(): return None frame = pandas.read_csv(source, dtype={"sample_id": str}, low_memory=False) validate_pool_hits(frame, self.hits) self.save_round(frame, {"round": 0, "origin": str(source), "origin_sha256": sha256_file(source), "origin_had_round_checksums": False, "sampler": "legacy-unversioned", "seed": None, "lengths": sorted(frame.peptide.str.len().unique().tolist())}, source=source) return frame def save_round(self, frame, record, source=None): index = len(self.rounds) path = self.path(".round-%02d.csv.bz2" % index) started = time.monotonic() if source is None: write_csv_atomic(path, frame) else: temporary = path.with_name(path.name + ".tmp") shutil.copy2(source, temporary) temporary.replace(path) record.update(round=index, file=path.name, sha256=sha256_file(path), sample_id=self.sample, rows=len(frame), artifact_write_seconds=time.monotonic() - started) write_json_atomic(self.path(".round-%02d.json" % index), record) self.rounds.append(record) if index == 0: # Retain the established single-pool artifact name for consumers. shutil.copy2(path, self.path(".candidate_pool.csv.bz2")) def load_result(self): marker = self.path(".complete.json") if not marker.exists(): return None record = json.loads(marker.read_text()) path = self.path(".matched.csv.bz2") if sha256_file(path) != record["sha256"]: raise ValueError("Corrupt saved matched processing sample") if record["round_sha256"] != [r["sha256"] for r in self.rounds]: raise ValueError("Matched processing sample refers to changed rounds") frame = pandas.read_csv(path, dtype={"sample_id": str}, low_memory=False) validate_pool_hits(frame, self.hits) validate_matched_training_data(frame) return frame def finish(self, frame, diagnostics): diagnostics.update(sample_id=self.sample, rounds=len(self.rounds)) path = self.path(".matched.csv.bz2") write_csv_atomic(path, frame) write_json_atomic(self.path(".matching.json"), diagnostics) write_json_atomic(self.path(".complete.json"), { "sha256": sha256_file(path), "sample_id": self.sample, "round_sha256": [r["sha256"] for r in self.rounds]}) def sample_preparation_steps(args, sample, hits, seed, initial_pool, additional_candidates): """CPU coroutine yielding unscored peptides and receiving affinity scores. Callbacks keep proteome access and affinity model ownership in the worker. Initial/additional pools contain unscored rows. Yielded requests contain only peptides absent from committed rounds. Each continuation commits its scored round before matching, expanding, or publishing sample completion. """ store = SamplePreparation(args, sample, hits) pool = store.load_pool() if pool is not None: saved = store.load_result() if saved is not None: print("Reusing completed matched sample", sample, flush=True) return saved print("Reusing scored pool", sample, len(pool), flush=True) else: started = time.monotonic() unscored = initial_pool() sampled_at = time.monotonic() response = yield unscored if isinstance(unscored, NumericCandidatePool) else unscored.peptide materializing_at = time.monotonic() pool = _scored_frame(unscored, response) store.save_round(pool, {"seed": seed, "sampler": "numeric-positions-v1", "lengths": sorted(pool.peptide.str.len().unique().tolist()), "sampling_seconds": sampled_at - started, "scoring_seconds": response.seconds, "materialization_seconds": time.monotonic() - materializing_at, "score_queue_seconds": max(0, materializing_at - sampled_at - response.seconds)}) while True: started = time.monotonic() try: result, diagnostics = matched_training_data(pool, args.matching_reference, decoys_per_hit=args.decoys_per_hit, max_distance=args.max_affinity_distance, random_seed=getattr(args, "random_seed", seed)) except IncompleteProcessingMatches as error: failed_at = time.monotonic() next_round = len(store.rounds) lengths = sorted({failure["peptide_length"] for failure in error.failures}) request = {"sample_id": str(sample), "round": next_round, "unresolved_hits": error.failures, "lengths": lengths, "matching_seconds": failed_at - started} write_json_atomic(store.path(".failure.json"), request) if next_round > args.max_expansion_rounds: raise IncompleteProcessingMatches( "Processing candidate expansion budget exhausted: " + str(error), error.failures) from error parts = [] seeds = {} # One exclusion set serves every length: the pool is fixed for the # whole round, so rebuilding it per length only repeats the work. scored_peptides = set(pool.peptide) for length in lengths: round_seed = derive_seed(seed, "processing-expansion-v1", next_round, length) seeds[str(length)] = round_seed parts.append(additional_candidates(length, scored_peptides, round_seed)) if isinstance(parts[0], NumericCandidatePool): from .numeric_proteome import ProteinWindows if any(not part.hits.empty for part in parts): raise ValueError("Expansion may not add observed hits") windows = ProteinWindows.concatenate([part.windows for part in parts]) # Not redundant with the exclusion set above: samplers are # caller-supplied, so committed peptides are rejected here # numerically instead of trusting the callback to honor it. known = sequence_keys(NumericSequences.from_strings(pool.peptide, MAX_PROCESSING_LENGTH).indices.numpy()) windows = windows.take(numpy.flatnonzero(~numpy.isin(windows.keys, known))) unscored = NumericCandidatePool(parts[0].hits, windows, sample, parts[0].flank_length) count = len(windows) valid_lengths = numpy.isin(windows.lengths, lengths).all() else: unscored = pandas.concat(parts, ignore_index=True) unscored = unscored.loc[~unscored.peptide.isin(pool.peptide)].drop_duplicates("peptide").copy() count = len(unscored) valid_lengths = unscored.peptide.str.len().isin(lengths).all() if not count: raise IncompleteProcessingMatches( "No unscored candidates remain in unresolved processing pools: " + str(error), error.failures) from error if not valid_lengths: raise ValueError("Expansion generated an unrelated peptide length") sampled_at = time.monotonic() response = yield unscored if isinstance(unscored, NumericCandidatePool) else unscored.peptide materializing_at = time.monotonic() additions = _scored_frame(unscored, response) store.save_round(additions, {**request, "seeds_by_length": seeds, "sampler": "numeric-positions-v1", "sampling_seconds": sampled_at - failed_at, "scoring_seconds": response.seconds, "materialization_seconds": time.monotonic() - materializing_at, "score_queue_seconds": max(0, materializing_at - sampled_at - response.seconds)}) pool = pandas.concat([pool, additions], ignore_index=True) print("Expanded", sample, "round", next_round, "lengths", lengths, "new scored peptides", len(additions), flush=True) else: diagnostics["matching_seconds"] = time.monotonic() - started store.finish(result, diagnostics) return result def prepare_sample(args, sample, hits, seed, initial_pool, additional_candidates, score): """Synchronous adapter for the same resumable sample workflow.""" workflow = sample_preparation_steps(args, sample, hits, seed, initial_pool, additional_candidates) value = None try: while True: try: request = workflow.send(value) except StopIteration as finished: return finished.value started = time.monotonic() values = score(request) value = ScoredValues(values, time.monotonic() - started) finally: workflow.close() mhcflurry-2.3.6/mhcflurry/processing_ranking.py000066400000000000000000000046301525677230600220270ustar00rootroot00000000000000"""Sample-balanced ranking metrics for processing stopping-validation data.""" import numpy from sklearn.metrics import average_precision_score class SampleRankingMonitor: """Validate a fixed binary cohort and compute equal-sample AP and PPV@N. Parameters ---------- targets : array-like Binary labels in the fixed validation prediction order. sample_ids : array-like Nonempty string sample identifiers, one per label. Each sample must contain both labels. No rows or samples are silently excluded. Notes ----- AP uses sklearn's threshold-grouped treatment of ties. PPV uses stable descending score order, with original validation-row order breaking ties. Neither metric uses training sample weights. """ def __init__(self, targets, sample_ids): self.targets = numpy.asarray(targets) samples = numpy.asarray(sample_ids, dtype=object) if (self.targets.ndim != 1 or samples.shape != self.targets.shape or not len(samples) or not numpy.isin(self.targets, [0, 1]).all()): raise ValueError("Ranking monitor requires aligned nonempty binary targets and sample IDs") if not all(isinstance(value, str) and value for value in samples): raise ValueError("Ranking monitor requires nonempty string sample IDs") self.sample_ids = sorted(set(samples)) self.groups = [numpy.flatnonzero(samples == value) for value in self.sample_ids] if any(len(numpy.unique(self.targets[rows])) != 2 for rows in self.groups): raise ValueError("Every ranking-validation sample must contain both labels") def __call__(self, predictions): """Return macro AP and PPV for all fixed validation rows, failing closed.""" scores = numpy.asarray(predictions) if (scores.shape != self.targets.shape or not numpy.isfinite(scores).all() or ((scores < 0) | (scores > 1)).any()): raise ValueError("Ranking predictions must be aligned finite probabilities") ap, ppv = [], [] for rows in self.groups: labels, values = self.targets[rows], scores[rows] ap.append(average_precision_score(labels, values)) n = int(labels.sum()) ppv.append(labels[numpy.argsort(-values, kind="stable")[:n]].sum() / n) return {"val_macro_ap": float(numpy.mean(ap)), "val_macro_ppv_at_n": float(numpy.mean(ppv))} mhcflurry-2.3.6/mhcflurry/proteome_decoys.py000066400000000000000000000236531525677230600213500ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Utilities for generating proteome peptide decoy candidates.""" from __future__ import annotations import pandas import numpy from .amino_acid import COMMON_AMINO_ACIDS PROTEOME_PEPTIDE_COLUMNS = [ "protein_accession", "peptide", "n_flank", "c_flank", "start_position", ] def unique_in_order(values): """Return unique non-null values while preserving first-seen order.""" return list(dict.fromkeys(value for value in values if pandas.notnull(value))) def infer_flanking_length(hit_df): """Infer the fixed flanking sequence length used for peptide decoys.""" lengths = set(hit_df.n_flank.dropna().str.len().unique()) lengths.update(hit_df.c_flank.dropna().str.len().unique()) if len(lengths) != 1: raise ValueError("Expected one flank length, got %s" % sorted(lengths)) return lengths.pop() def load_reference_sequences(reference_csv, accessions): """Load protein sequences keyed by accession for the requested accessions.""" accessions = unique_in_order(accessions) try: reference_df = pandas.read_csv( reference_csv, usecols=["accession", "seq"]) except ValueError: reference_df = pandas.read_csv(reference_csv) if "accession" not in reference_df.columns: raise ValueError( "Expected reference CSV %s to have an 'accession' column" % reference_csv) if "seq" not in reference_df.columns: raise ValueError( "Expected reference CSV %s to have a 'seq' column" % reference_csv) reference_df = ( reference_df .drop_duplicates("accession") .set_index("accession") ) missing = [accession for accession in accessions if accession not in reference_df.index] if missing: raise ValueError( "Missing %d protein accessions in %s, including: %s" % ( len(missing), reference_csv, ", ".join(missing[:10]))) return reference_df.loc[accessions].seq.to_dict() def iter_protein_peptide_records( accession, sequence, lengths=(8, 9, 10, 11), flanking_length=15, valid_amino_acids=None): """Yield peptide/flank records for one protein sequence. The start-position range intentionally matches the historical ``write_proteome_peptides.py`` behavior so release data generation remains comparable. Concretely, ``range(0, len(sequence) - min_length)`` has an exclusive upper bound, so the last start position is ``len(sequence) - min_length - 1`` and the single ``min_length``-mer that would start at ``len(sequence) - min_length`` (the C-terminal ``min_length``-mer) is NOT emitted. This off-by-one is deliberate bug-for-bug parity, not an oversight: changing it would alter the decoy set used to generate released models. ``test_iter_protein_peptide_records_*`` pins the resulting counts so the behavior can't drift silently. """ valid_amino_acids = set(valid_amino_acids or COMMON_AMINO_ACIDS) lengths = sorted(lengths) min_length = min(lengths) for start in range(0, len(sequence) - min_length): for length in lengths: end_pos = start + length if end_pos > len(sequence): break peptide = sequence[start:end_pos] if any(letter not in valid_amino_acids for letter in peptide): continue n_flank = sequence[ max(start - flanking_length, 0):start ].rjust(flanking_length, "X") c_flank = sequence[ end_pos:(end_pos + flanking_length) ].ljust(flanking_length, "X") yield accession, peptide, n_flank, c_flank, start def make_peptide_frame_for_accessions( accessions, sequences_by_accession, lengths=(8, 9, 10, 11), flanking_length=15, valid_amino_acids=None): """Generate a peptide/flank DataFrame for the requested accessions.""" rows = [] for accession in unique_in_order(accessions): rows.extend(iter_protein_peptide_records( accession=accession, sequence=sequences_by_accession[accession], lengths=lengths, flanking_length=flanking_length, valid_amino_acids=valid_amino_acids, )) return pandas.DataFrame.from_records(rows, columns=PROTEOME_PEPTIDE_COLUMNS) def sample_peptide_frame_for_accessions( accessions, sequences_by_accession, lengths=(8, 9, 10, 11), flanking_length=15, exclude_peptides=(), n=1, valid_amino_acids=None, sampling_method="positions", allow_smaller=False): """Sample windows without replacement; build flanks only for retained rows. Position sampling preserves the eligible population, not the historical reservoir's RNG sequence. Use ``sampling_method='reservoir'`` for replay. ``allow_smaller`` returns the complete eligible population on exhaustion. """ if n < 0: raise ValueError("n must be non-negative") if n == 0: return pandas.DataFrame(columns=PROTEOME_PEPTIDE_COLUMNS) if sampling_method == "positions": return _sample_numeric_positions( accessions, sequences_by_accession, lengths, flanking_length, exclude_peptides, n, valid_amino_acids, allow_smaller) if sampling_method != "reservoir": raise ValueError("Unknown peptide sampling method: " + sampling_method) exclude_peptides = set(exclude_peptides) reservoir = [] seen = 0 for accession in unique_in_order(accessions): for record in iter_protein_peptide_records( accession=accession, sequence=sequences_by_accession[accession], lengths=lengths, flanking_length=flanking_length, valid_amino_acids=valid_amino_acids): if record[1] in exclude_peptides: continue seen += 1 if len(reservoir) < n: reservoir.append(record) continue replace_index = numpy.random.randint(seen) if replace_index < n: reservoir[replace_index] = record if seen < n and not allow_smaller: raise ValueError( "Cannot take a larger sample than population when " "'replace=False' (requested %d, population %d)" % (n, seen)) return pandas.DataFrame.from_records( reservoir, columns=PROTEOME_PEPTIDE_COLUMNS) def _sample_numeric_positions(accessions, sequences, lengths, flank_length, excluded, n, valid_amino_acids, allow_smaller): """Draw from the same valid window population as the reference iterator.""" lengths = sorted(lengths) if not lengths or lengths[0] <= 0: raise ValueError("Peptide lengths must be positive") alphabet = set(valid_amino_acids or COMMON_AMINO_ACIDS) excluded = set(excluded) segments = [] counts = [] for accession in unique_in_order(accessions): sequence = sequences[accession] invalid = numpy.fromiter((c not in alphabet for c in sequence), dtype="int8") prefix = numpy.concatenate(([0], numpy.cumsum(invalid))) for length in lengths: # Preserve the iterator's exclusive minimum-length terminal bound. count = max(0, min(len(sequence) - lengths[0], len(sequence) - length + 1)) starts = numpy.arange(count) starts = starts[(prefix[starts + length] - prefix[starts]) == 0] if len(starts): segments.append((accession, sequence, length, starts)) counts.append(len(starts)) ends = numpy.cumsum(counts, dtype="int64") total = int(ends[-1]) if len(ends) else 0 # Only numeric indices are shuffled. No peptide/flank tuples are created # for the unsampled population. Rejecting excluded peptides from a random # permutation is uniform sampling of the remaining eligible windows. positions = numpy.random.permutation(total) rows = [] for offset in range(0, total, 65536): chunk = positions[offset:offset + 65536] segment_indices = numpy.searchsorted(ends, chunk, side="right") for index, segment_index in zip(chunk, segment_indices): accession, sequence, length, starts = segments[segment_index] base = int(ends[segment_index - 1]) if segment_index else 0 start = int(starts[index - base]) peptide = sequence[start:start + length] if peptide in excluded: continue end = start + length rows.append((accession, peptide, sequence[max(0, start - flank_length):start].rjust(flank_length, "X"), sequence[end:end + flank_length].ljust(flank_length, "X"), start)) if len(rows) == n: return pandas.DataFrame.from_records(rows, columns=PROTEOME_PEPTIDE_COLUMNS) if not allow_smaller: raise ValueError("Cannot take a larger sample than population when 'replace=False' " "(requested %d, population %d)" % (n, len(rows))) return pandas.DataFrame.from_records(rows, columns=PROTEOME_PEPTIDE_COLUMNS) def peptides_by_length_from_frame(peptide_df): """Return peptide DataFrames keyed by peptide length.""" peptide_df = peptide_df.copy() peptide_df["length"] = peptide_df.peptide.str.len() return dict(iter(peptide_df.groupby("length"))) mhcflurry-2.3.6/mhcflurry/pseudosequences.py000066400000000000000000000215041525677230600213540ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Class I pseudosequence artifact names and lookup helpers. This module is the canonical registry for pseudosequence CSV filenames used by MHCflurry training and model serialization. Canonical pseudosequence files: * ``pseudosequences.netmhcpan.34aa.csv``: NetMHCpan-derived 34 amino acid pseudosequences. * ``pseudosequences.mhcflurry.37aa.csv``: MHCflurry-generated 37 amino acid pseudosequences used by older public pan-allele model bundles. * ``pseudosequences.mhcflurry.39aa.csv``: MHCflurry-generated 39 amino acid pseudosequences from the aligned full-sequence pipeline. Compatibility aliases: * ``allele_sequences.csv``: legacy runtime/model artifact filename. * ``class1_pseudosequences.csv``: legacy NetMHCpan 34aa filename. * ``allele_sequences.no_differentiation.csv``: legacy pan-variant experiment output; not a canonical pseudosequence artifact name. Trained model directories should ship the exact pseudosequence CSV used during training. The saved weights depend on both the representation width and the position definition. Expected locations: * ``downloads-generation/*/pseudosequences.netmhcpan.34aa.csv``: checked-in generation seed tables. * standalone ``allele_sequences`` download: should contain ``pseudosequences.mhcflurry.39aa.csv`` plus ``allele_sequences.csv`` as a compatibility copy. * trained model directories: should contain ``allele_sequences.csv`` and, for newly-saved models, the matching canonical ``pseudosequences.*.*aa.csv``. """ from __future__ import annotations import argparse import logging from dataclasses import dataclass from glob import glob from os.path import basename, exists, join import pandas LEGACY_ALLELE_SEQUENCES_FILENAME = "allele_sequences.csv" LEGACY_CLASS1_PSEUDOSEQUENCES_FILENAME = "class1_pseudosequences.csv" LEGACY_NO_DIFFERENTIATION_FILENAME = "allele_sequences.no_differentiation.csv" PSEUDOSEQUENCE_GLOB = "pseudosequences.*.*aa.csv" @dataclass(frozen=True) class PseudosequenceDefinition: """A named pseudosequence CSV definition.""" source: str length: int filename: str description: str PSEUDOSEQUENCE_DEFINITIONS = ( PseudosequenceDefinition( source="netmhcpan", length=34, filename="pseudosequences.netmhcpan.34aa.csv", description="NetMHCpan-derived 34 amino acid pseudosequences.", ), PseudosequenceDefinition( source="mhcflurry", length=37, filename="pseudosequences.mhcflurry.37aa.csv", description=( "MHCflurry-generated 37 amino acid pseudosequences used by older " "public pan-allele model bundles." ), ), PseudosequenceDefinition( source="mhcflurry", length=39, filename="pseudosequences.mhcflurry.39aa.csv", description=( "MHCflurry-generated 39 amino acid pseudosequences from the " "aligned full-sequence pipeline." ), ), ) PSEUDOSEQUENCE_DEFINITIONS_BY_LENGTH = { definition.length: definition for definition in PSEUDOSEQUENCE_DEFINITIONS } PSEUDOSEQUENCE_FILENAMES_BY_LENGTH = { length: definition.filename for (length, definition) in PSEUDOSEQUENCE_DEFINITIONS_BY_LENGTH.items() } PSEUDOSEQUENCE_FILENAME_PREFERENCE = ( LEGACY_ALLELE_SEQUENCES_FILENAME, PSEUDOSEQUENCE_FILENAMES_BY_LENGTH[39], PSEUDOSEQUENCE_FILENAMES_BY_LENGTH[37], PSEUDOSEQUENCE_FILENAMES_BY_LENGTH[34], LEGACY_CLASS1_PSEUDOSEQUENCES_FILENAME, ) LEGACY_FILENAMES = { "allele_sequences": LEGACY_ALLELE_SEQUENCES_FILENAME, "class1_pseudosequences": LEGACY_CLASS1_PSEUDOSEQUENCES_FILENAME, "no_differentiation": LEGACY_NO_DIFFERENTIATION_FILENAME, } def pseudosequence_length(allele_to_sequence): """Return the common pseudosequence length, or ``None`` if ambiguous.""" if not allele_to_sequence: return None lengths = set() for sequence in allele_to_sequence.values(): if pandas.isnull(sequence): continue lengths.add(len(str(sequence))) if len(lengths) == 1: return lengths.pop() return None def pseudosequence_filename_for_length(length): """Return the canonical pseudosequence filename for a representation length.""" if length is None: return None return PSEUDOSEQUENCE_FILENAMES_BY_LENGTH.get(int(length)) def pseudosequence_filename_for_mapping(allele_to_sequence): """Return the canonical pseudosequence filename for a saved mapping.""" return pseudosequence_filename_for_length( pseudosequence_length(allele_to_sequence)) def pseudosequence_filename_candidates(models_dir): """ Pseudosequence files accepted when loading a saved predictor. ``allele_sequences.csv`` and ``class1_pseudosequences.csv`` are legacy artifact filenames. The ``pseudosequences.*.*aa.csv`` names make the source and representation width explicit for newly-generated artifacts. """ result = [] for filename in PSEUDOSEQUENCE_FILENAME_PREFERENCE: if exists(join(models_dir, filename)): result.append(filename) for path in sorted(glob(join(models_dir, PSEUDOSEQUENCE_GLOB))): filename = basename(path) if filename not in result: result.append(filename) return result def pseudosequence_path(directory, length, fallback_legacy=True): """Return the preferred pseudosequence path in ``directory``. When the canonical ``pseudosequences.*.aa.csv`` is absent and ``fallback_legacy`` is true, returns the legacy ``allele_sequences.csv`` path and logs a warning so callers don't silently read a different sequence set than requested. """ filename = pseudosequence_filename_for_length(length) if filename is None: raise ValueError("No canonical pseudosequence filename for %saa" % length) path = join(directory, filename) if exists(path) or not fallback_legacy: return path legacy_path = join(directory, LEGACY_ALLELE_SEQUENCES_FILENAME) logging.warning( "Canonical pseudosequence file %s not found in %s; falling back to " "legacy %s. The legacy file may carry a different representation " "width than requested (%saa).", filename, directory, LEGACY_ALLELE_SEQUENCES_FILENAME, length, ) return legacy_path def _run_filename(args): filename = pseudosequence_filename_for_length(args.length) if filename is None: raise SystemExit("No canonical pseudosequence filename for %saa" % ( args.length,)) print(filename) def _run_legacy(args): print(LEGACY_FILENAMES[args.name]) def _run_path(args): print(pseudosequence_path( args.directory, args.length, fallback_legacy=args.fallback_legacy)) def _run_list(_args): for definition in PSEUDOSEQUENCE_DEFINITIONS: print("%s\t%s\t%s" % ( definition.length, definition.source, definition.filename, )) def main(argv=None, prog=None): """Command-line access for shell generation scripts.""" parser = argparse.ArgumentParser(prog=prog, description=__doc__) subparsers = parser.add_subparsers(dest="command", required=True) filename_parser = subparsers.add_parser( "filename", help="Print the canonical pseudosequence filename for a length.") filename_parser.add_argument("--length", required=True, type=int) filename_parser.set_defaults(func=_run_filename) legacy_parser = subparsers.add_parser( "legacy", help="Print a legacy compatibility filename.") legacy_parser.add_argument("name", choices=sorted(LEGACY_FILENAMES)) legacy_parser.set_defaults(func=_run_legacy) path_parser = subparsers.add_parser( "path", help="Print the preferred pseudosequence path in a directory.") path_parser.add_argument("--directory", required=True) path_parser.add_argument("--length", required=True, type=int) path_parser.add_argument( "--fallback-legacy", action="store_true", help="Use allele_sequences.csv if the canonical file is absent.") path_parser.set_defaults(func=_run_path) list_parser = subparsers.add_parser( "list", help="List canonical pseudosequence definitions.") list_parser.set_defaults(func=_run_list) args = parser.parse_args(argv) args.func(args) if __name__ == "__main__": main() mhcflurry-2.3.6/mhcflurry/pytorch_layers.py000066400000000000000000000153131525677230600212110ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ PyTorch custom layers for mhcflurry. """ import math import torch import torch.nn as nn import torch.nn.functional as F def get_activation(name): """ Map activation name string to a PyTorch activation function. Parameters ---------- name : str Activation name: "tanh", "sigmoid", "relu", "silu"/"swish", "gelu", "linear", or "" Returns ------- callable or None Activation function, or None for no activation """ if not name or name == "linear": return None name = name.lower() if name == "tanh": return torch.tanh elif name == "sigmoid": return torch.sigmoid elif name == "relu": return F.relu elif name in {"silu", "swish"}: return F.silu elif name == "gelu": return F.gelu else: raise ValueError(f"Unknown activation: {name}") class KerasBatchNorm1d(nn.BatchNorm1d): """BatchNorm1d with Keras-compatible running-statistics updates. PyTorch normalizes with the biased batch variance but updates ``running_var`` with an unbiased estimate. Keras uses the biased population variance for both. ``momentum`` retains PyTorch's new-batch-coefficient convention so ``0.01`` corresponds to Keras ``momentum=0.99``. Supports both ``(batch, features)`` dense outputs and ``(batch, channels, positions)`` sequence outputs. In the sequence case, statistics are accumulated over batch and position, matching Keras ``BatchNormalization(axis=-1)`` on the equivalent channels-last tensor. """ def forward(self, inputs): self._check_input_dim(inputs) if inputs.dim() == 2: reduction_dims = (0,) broadcast_shape = (1, -1) elif inputs.dim() == 3: reduction_dims = (0, 2) broadcast_shape = (1, -1, 1) else: raise ValueError( "KerasBatchNorm1d supports 2D dense or 3D sequence outputs; " "got shape %s" % (tuple(inputs.shape),) ) if self.training or not self.track_running_stats: mean = inputs.mean(dim=reduction_dims) variance = inputs.var(dim=reduction_dims, unbiased=False) if self.training and self.track_running_stats: with torch.no_grad(): self.num_batches_tracked.add_(1) self.running_mean.lerp_(mean.detach(), self.momentum) self.running_var.lerp_(variance.detach(), self.momentum) else: mean = self.running_mean variance = self.running_var mean = mean.view(broadcast_shape) variance = variance.view(broadcast_shape) result = (inputs - mean) * torch.rsqrt(variance + self.eps) if self.affine: result = ( result * self.weight.view(broadcast_shape) + self.bias.view(broadcast_shape) ) return result class LocallyConnected1D(nn.Module): """ A locally connected 1D layer (unshared convolution). Unlike Conv1D, this layer uses different filter weights at each position in the input sequence. This is equivalent to Keras' LocallyConnected1D. Parameters ---------- in_channels : int Number of input channels out_channels : int Number of output channels (filters) input_length : int Length of the input sequence kernel_size : int Size of the convolution kernel activation : str Activation function name """ def __init__(self, in_channels, out_channels, input_length, kernel_size, activation="tanh"): super(LocallyConnected1D, self).__init__() self.in_channels = in_channels self.out_channels = out_channels self.input_length = input_length self.kernel_size = kernel_size self.activation_name = activation self.output_length = input_length - kernel_size + 1 # Weight shape: (output_length, out_channels, in_channels * kernel_size) self.weight = nn.Parameter( torch.randn(self.output_length, out_channels, in_channels * kernel_size) ) # Bias shape: (output_length, out_channels) self.bias = nn.Parameter( torch.zeros(self.output_length, out_channels) ) self._activation = get_activation(activation) # Match Keras LocallyConnected1D GlorotUniform. Keras computes fan-in # and fan-out on its (output_length, flattened_input, filters) kernel; # applying torch's generic 3D fan calculation to our transposed storage # would use different fan values. flattened_input = in_channels * kernel_size fan_in = self.output_length * flattened_input fan_out = self.output_length * out_channels bound = math.sqrt(6.0 / (fan_in + fan_out)) nn.init.uniform_(self.weight, -bound, bound) def forward(self, x): """ Forward pass. Parameters ---------- x : torch.Tensor Input tensor of shape (batch, sequence_length, in_channels) Returns ------- torch.Tensor Output tensor of shape (batch, output_length, out_channels) """ batch_size = x.size(0) # Use unfold to extract patches and match Keras flatten order. # x_unfolded shape: (batch, output_length, in_channels, kernel_size) x_unfolded = x.unfold(1, self.kernel_size, 1) # Keras flattens patches with kernel positions first, then channels. x_unfolded = x_unfolded.permute(0, 1, 3, 2) # Reshape to (batch, output_length, kernel_size * in_channels) x_unfolded = x_unfolded.reshape( batch_size, self.output_length, self.kernel_size * self.in_channels ) # Apply locally connected weights via einsum # x_unfolded: (batch, output_length, in_channels * kernel_size) # weight: (output_length, out_channels, in_channels * kernel_size) # result: (batch, output_length, out_channels) output = torch.einsum('boi,ofi->bof', x_unfolded, self.weight) + self.bias if self._activation is not None: output = self._activation(output) return output mhcflurry-2.3.6/mhcflurry/pytorch_losses.py000066400000000000000000000330001525677230600212130ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ PyTorch loss functions for mhcflurry. Supports inequality constraints where training data includes (=), (<), and (>) relationships. For inequality constraints, penalization is applied only when predictions violate the constraint. """ import numpy import torch import torch.nn as nn import torch.nn.functional as F class MSEWithInequalities(nn.Module): """ MSE loss with inequality support. y_true is encoded as follows: - [0, 1]: equality constraint, standard MSE - [2, 3]: greater-than constraint (value = y_true - 2), penalize if pred < value - [4, 5]: less-than constraint (value = y_true - 4), penalize if pred > value """ supports_inequalities = True supports_multiple_outputs = False @staticmethod def encode_y(y, inequalities=None): """ Encode targets with inequality information. Parameters ---------- y : array-like Target values in [0, 1] inequalities : array-like of str, optional One of "=", ">", "<" for each target Returns ------- numpy.ndarray """ y = numpy.array(y, dtype=numpy.float32) if numpy.isnan(y).any(): raise ValueError("y contains NaN") if (y < 0).any() or (y > 1).any(): raise ValueError("Targets must be in [0, 1] for MSEWithInequalities") if inequalities is None: return y if len(inequalities) != len(y): raise ValueError("inequalities must have same length as y") for ineq in inequalities: if ineq not in {"=", ">", "<"}: raise ValueError("Inequalities must be one of '=', '>', '<'") offsets = numpy.array([ {'=': 0, '>': 2, '<': 4}[ineq] for ineq in inequalities ], dtype=numpy.float32) encoded = y + offsets assert not numpy.isnan(encoded).any() return encoded def forward(self, y_pred, y_true, sample_weights=None): """ Compute loss. Parameters ---------- y_pred : torch.Tensor Predictions, shape (batch,) or (batch, 1) y_true : torch.Tensor Encoded targets, shape (batch,) or (batch, 1) sample_weights : torch.Tensor or None Optional per-example weights. Returns ------- torch.Tensor Scalar loss value """ numerator, denominator = self.loss_numerator_and_denominator( y_pred, y_true, sample_weights=sample_weights) return numerator / torch.clamp(denominator, min=1.0) def loss_numerator_and_denominator( self, y_pred, y_true, sample_weights=None): """Return additive reduction terms for exact batched validation.""" y_true = y_true.reshape(-1) y_pred = y_pred.reshape(-1) # Handle (=) inequalities: 0 <= y_true <= 1 diff1 = y_pred - y_true diff1 = diff1 * (y_true >= 0.0).float() * (y_true <= 1.0).float() # Handle (>) inequalities: 2 <= y_true <= 3 # Penalize only if pred < threshold (diff < 0) diff2 = y_pred - (y_true - 2.0) diff2 = diff2 * (y_true >= 2.0).float() * (y_true <= 3.0).float() diff2 = diff2 * (diff2 < 0.0).float() # Handle (<) inequalities: y_true >= 4 # Penalize only if pred > threshold (diff > 0) diff3 = y_pred - (y_true - 4.0) diff3 = diff3 * (y_true >= 4.0).float() diff3 = diff3 * (diff3 > 0.0).float() per_sample = diff1.square() + diff2.square() + diff3.square() if sample_weights is None: denominator = (y_true != 2.0).float().sum() return per_sample.sum(), denominator sample_weights = sample_weights.reshape(-1).to(per_sample.device) mask = (y_true != 2.0).float() denominator = (sample_weights * mask).sum() return (per_sample * sample_weights).sum(), denominator class MSEWithInequalitiesAndMultipleOutputs(nn.Module): """ MSE loss with inequality and multiple output support. Extends MSEWithInequalities by encoding the output index into the target: encoded_target = inequality_encoded_value + output_index * 10 """ supports_inequalities = True supports_multiple_outputs = True @staticmethod def encode_y(y, inequalities=None, output_indices=None): """ Encode targets with inequality and output index information. Parameters ---------- y : array-like Target values in [0, 1] inequalities : array-like of str, optional One of "=", ">", "<" for each target output_indices : array-like of int, optional Output index for each target Returns ------- numpy.ndarray """ encoded = MSEWithInequalities.encode_y(y, inequalities) if output_indices is not None: output_indices = numpy.array(output_indices) if output_indices.shape != (len(encoded),): raise ValueError( "Expected output_indices to have shape %s not %s" % ((len(encoded),), output_indices.shape) ) if (output_indices < 0).any(): raise ValueError("Invalid output indices: %s" % output_indices) encoded = encoded + output_indices.astype(numpy.float32) * 10 return encoded def forward(self, y_pred, y_true, sample_weights=None): """ Compute loss. Parameters ---------- y_pred : torch.Tensor Predictions, shape (batch, num_outputs) y_true : torch.Tensor Encoded targets, shape (batch,) or (batch, 1) sample_weights : torch.Tensor or None Optional per-example weights. Returns ------- torch.Tensor Scalar loss value """ numerator, denominator = self.loss_numerator_and_denominator( y_pred, y_true, sample_weights=sample_weights) return numerator / torch.clamp(denominator, min=1.0) def loss_numerator_and_denominator( self, y_pred, y_true, sample_weights=None): """Return additive reduction terms for exact batched validation.""" y_true = y_true.reshape(-1) if y_pred.dim() == 1: y_pred = y_pred.unsqueeze(1) # Decode output indices output_indices = (y_true / 10.0).long() inequality_encoded = y_true - output_indices.float() * 10.0 # Select the relevant output for each sample batch_indices = torch.arange(len(y_true), device=y_pred.device) output_indices_clamped = output_indices.clamp(0, y_pred.shape[1] - 1) selected_pred = y_pred[batch_indices, output_indices_clamped] # Apply MSEWithInequalities logic on selected predictions y_t = inequality_encoded y_p = selected_pred # Handle (=) inequalities diff1 = y_p - y_t diff1 = diff1 * (y_t >= 0.0).float() * (y_t <= 1.0).float() # Handle (>) inequalities diff2 = y_p - (y_t - 2.0) diff2 = diff2 * (y_t >= 2.0).float() * (y_t <= 3.0).float() diff2 = diff2 * (diff2 < 0.0).float() # Handle (<) inequalities diff3 = y_p - (y_t - 4.0) diff3 = diff3 * (y_t >= 4.0).float() diff3 = diff3 * (diff3 > 0.0).float() per_sample = diff1.square() + diff2.square() + diff3.square() if sample_weights is None: denominator = (y_t != 2.0).float().sum() return per_sample.sum(), denominator sample_weights = sample_weights.reshape(-1).to(per_sample.device) mask = (y_t != 2.0).float() denominator = (sample_weights * mask).sum() return (per_sample * sample_weights).sum(), denominator class MultiallelicMassSpecLoss(nn.Module): """ Loss function for multiallelic mass spectrometry data. For each (hit, decoy) pair, penalizes when any decoy allele prediction is greater than the best hit allele prediction minus delta. The squared hinge encourages each hit to exceed every decoy allele by at least delta. y_true encoding: - 1.0: hit (positive) - 0.0: decoy (negative) - -1.0: ignored """ supports_inequalities = True supports_multiple_outputs = False supports_independent_samples = False def __init__(self, delta=0.2, multiplier=1.0): super(MultiallelicMassSpecLoss, self).__init__() self.delta = delta self.multiplier = multiplier @staticmethod def encode_y(y): """Encode y (no-op for this loss).""" y = numpy.array(y, dtype=numpy.float32) assert numpy.isin(y, [-1.0, 0.0, 1.0]).all() return y def forward(self, y_pred, y_true, sample_weights=None): """ Compute loss. Parameters ---------- y_pred : torch.Tensor Predictions, shape (batch, num_alleles) y_true : torch.Tensor Labels, shape (batch,) or (batch, 1) sample_weights : torch.Tensor or None Accepted for interface compatibility; ignored by this pairwise loss. Returns ------- torch.Tensor Scalar loss value """ y_true = y_true.reshape(-1) if y_pred.dim() == 1: y_pred = y_pred.unsqueeze(1) # Get hit and decoy masks hit_mask = (y_true == 1.0) decoy_mask = (y_true == 0.0) num_hits = hit_mask.sum().item() num_decoys = decoy_mask.sum().item() if num_hits == 0 or num_decoys == 0: return torch.tensor(0.0, device=y_pred.device, requires_grad=True) num_alleles = y_pred.shape[1] # Best allele prediction for each hit: (num_hits,) hit_preds = y_pred[hit_mask] hit_max = hit_preds.max(dim=1).values # (num_hits,) # All decoy predictions: (num_decoys, num_alleles) decoy_preds = y_pred[decoy_mask] # Compute pairwise terms: # For each (decoy, allele, hit): max(0, decoy_pred - hit_max + delta)^2 # decoy_preds: (num_decoys, num_alleles) -> (num_decoys, num_alleles, 1) # hit_max: (num_hits,) -> (1, 1, num_hits) term = decoy_preds.unsqueeze(2) - hit_max.unsqueeze(0).unsqueeze(0) + self.delta penalty = torch.clamp(term, min=0.0).square() denominator = num_hits * num_decoys * num_alleles result = self.multiplier * penalty.sum() / denominator return result class StandardLoss(nn.Module): """ Wrapper for standard PyTorch loss functions (MSE, MAE, etc). """ supports_inequalities = False supports_multiple_outputs = False def __init__(self, loss_name="mse"): super(StandardLoss, self).__init__() self.loss_name = loss_name if loss_name == "mse": self._loss_fn = nn.MSELoss() elif loss_name == "mae": self._loss_fn = nn.L1Loss() else: raise ValueError(f"Unknown standard loss: {loss_name}") @staticmethod def encode_y(y): """Encode y (simple cast to float32).""" return numpy.array(y, dtype=numpy.float32) def forward(self, y_pred, y_true, sample_weights=None): """ Compute loss. Parameters ---------- y_pred : torch.Tensor y_true : torch.Tensor sample_weights : torch.Tensor | None Optional per-example weights. Returns ------- torch.Tensor Scalar loss value """ y_pred = y_pred.reshape(-1) y_true = y_true.reshape(-1) if sample_weights is None: return self._loss_fn(y_pred, y_true) if self.loss_name == "mse": losses = F.mse_loss(y_pred, y_true, reduction="none") elif self.loss_name == "mae": losses = F.l1_loss(y_pred, y_true, reduction="none") else: losses = self._loss_fn(y_pred, y_true) sample_weights = sample_weights.reshape(-1).to(losses.device) denominator = torch.clamp(sample_weights.sum(), min=1.0) return (losses * sample_weights).sum() / denominator # Registry of custom losses _CUSTOM_LOSSES = { 'mse_with_inequalities': MSEWithInequalities, 'mse_with_inequalities_and_multiple_outputs': MSEWithInequalitiesAndMultipleOutputs, 'multiallelic_mass_spec_loss': MultiallelicMassSpecLoss, } def get_pytorch_loss(name): """ Get a PyTorch loss object by name. Parameters ---------- name : str Loss name. Prefix with "custom:" for custom losses, otherwise a standard loss name like "mse". Returns ------- nn.Module Loss module with encode_y, supports_inequalities, and supports_multiple_outputs attributes. """ if name.startswith("custom:"): custom_name = name.replace("custom:", "") if custom_name not in _CUSTOM_LOSSES: raise ValueError( f"No such custom loss: {name}. " f"Supported: {', '.join('custom:' + k for k in _CUSTOM_LOSSES)}" ) return _CUSTOM_LOSSES[custom_name]() return StandardLoss(name) mhcflurry-2.3.6/mhcflurry/pytorch_sizing.py000066400000000000000000001201041525677230600212100ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Prediction and training batch-size helpers.""" import gc import logging import math import os import subprocess import sys from dataclasses import dataclass from .memory_budget import ( DEVICE_MIN_RESERVE_BYTES, MEMORY_RESERVE_FRACTION, memory_reserve_bytes, usable_memory_bytes, ) DEFAULT_PREDICT_BATCH_SIZE = "auto" AUTO_BATCH_MAX_ROWS = sys.maxsize AUTO_BATCH_MIN_ROWS = 1024 # floor: avoid pathologically tiny batches AUTO_BATCH_CPU_FALLBACK = 32_768 # CPU: large batches thrash L3; stay modest AUTO_BATCH_FREE_FRACTION = None AUTO_BATCH_CALIBRATION_PROBE_ROWS = 4096 AUTO_BATCH_CALIBRATION_SAFETY_MULTIPLIER = 2.0 _MPS_PSUTIL_WARNED = False # one-shot warning if psutil is missing on MPS CUDA_FREE_BEFORE_CONTEXT_ENV = ( "MHCFLURRY_CUDA_FREE_BEFORE_CONTEXT_BYTES" ) if os.environ.get("MHCFLURRY_DEFAULT_PREDICT_BATCH_SIZE"): raw_default_batch_size = os.environ["MHCFLURRY_DEFAULT_PREDICT_BATCH_SIZE"] try: DEFAULT_PREDICT_BATCH_SIZE = int(raw_default_batch_size) except ValueError: raise ValueError( "MHCFLURRY_DEFAULT_PREDICT_BATCH_SIZE must be a positive integer; " "got %r" % raw_default_batch_size ) from None if DEFAULT_PREDICT_BATCH_SIZE < 1: raise ValueError( "MHCFLURRY_DEFAULT_PREDICT_BATCH_SIZE must be a positive integer; " "got %r" % raw_default_batch_size ) logging.info( "Configured default predict batch size: %s" % DEFAULT_PREDICT_BATCH_SIZE ) def default_prediction_batch_is_auto(): """Whether the effective default prediction batch can shrink on OOM.""" return DEFAULT_PREDICT_BATCH_SIZE in (None, "auto") def begin_peak_memory_measurement(): """Reset CUDA peak counters and return an opaque measurement token.""" token = {"started": True} try: import torch if torch.cuda.is_available(): device = torch.cuda.current_device() torch.cuda.synchronize(device) torch.cuda.reset_peak_memory_stats(device) token["cuda_device"] = int(device) except Exception as exc: token["cuda_error"] = str(exc) return token def _process_namespace_pids(): """Return host/container PID aliases reported for this process.""" result = {os.getpid()} try: with open("/proc/self/status") as status_fd: for line in status_fd: if not line.startswith("NSpid:"): continue for value in line.split()[1:]: result.add(int(value)) break except (OSError, ValueError): pass return result def cuda_process_memory_bytes(pid=None): """Return this process's CUDA memory from ``nvidia-smi``, if available. PyTorch allocator counters omit the CUDA context and other non-PyTorch allocations. Those bytes matter when many worker processes share a GPU. Querying the driver gives resource probes a complete steady-state working set without initializing CUDA in the parent process. """ pids = _process_namespace_pids() if pid is None else {int(pid)} try: output = subprocess.check_output( [ "nvidia-smi", "--query-compute-apps=pid,used_memory", "--format=csv,noheader,nounits", ], stderr=subprocess.DEVNULL, timeout=5, ) except ( OSError, subprocess.CalledProcessError, subprocess.TimeoutExpired): return None total_mib = 0.0 found = False for line in output.decode("utf-8", errors="ignore").splitlines(): fields = [field.strip() for field in line.split(",")] if len(fields) < 2: continue try: row_pid = int(fields[0]) used_mib = float(fields[1].split()[0]) except ValueError: continue if row_pid in pids: total_mib += used_mib found = True return int(total_mib * (1 << 20)) if found else None def cuda_free_memory_before_context_bytes(device_id): """Query one physical CUDA device's free memory without importing torch.""" try: output = subprocess.check_output( [ "nvidia-smi", "--id=%s" % device_id, "--query-gpu=memory.free", "--format=csv,noheader,nounits", ], stderr=subprocess.DEVNULL, timeout=5, ) value = float(output.decode("utf-8", errors="ignore").splitlines()[0]) except ( IndexError, OSError, subprocess.CalledProcessError, subprocess.TimeoutExpired, ValueError): return None return int(value * (1 << 20)) def _nonnegative_env_bytes(name): """Read an optional non-negative byte count from the environment.""" raw = os.environ.get(name) if raw in (None, ""): return None try: value = int(raw) except ValueError: raise ValueError( "%s must be a non-negative integer; got %r" % (name, raw) ) from None if value < 0: raise ValueError( "%s must be a non-negative integer; got %r" % (name, raw) ) return value def _cuda_process_bytes_with_baseline( free_bytes, measured_process_bytes, *, allow_baseline=True): """Include context usage when driver PIDs differ across namespaces.""" candidates = [max(int(measured_process_bytes or 0), 0)] baseline_free = _nonnegative_env_bytes(CUDA_FREE_BEFORE_CONTEXT_ENV) if allow_baseline and baseline_free is not None: candidates.append(max(baseline_free - max(int(free_bytes), 0), 0)) return max(candidates) def _process_peak_rss_bytes(): """Best-effort process peak RSS in bytes on Linux and macOS.""" try: import resource import sys value = int(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss) return value if sys.platform == "darwin" else value * 1024 except Exception: return None def end_peak_memory_measurement(token): """Finish a measurement begun by :func:`begin_peak_memory_measurement`.""" result = {"host_peak_rss_bytes": _process_peak_rss_bytes()} device = token.get("cuda_device") if token else None if device is not None: try: import torch torch.cuda.synchronize(device) result.update({ "cuda_peak_allocated_bytes": int( torch.cuda.max_memory_allocated(device)), "cuda_peak_reserved_bytes": int( torch.cuda.max_memory_reserved(device)), }) current_reserved = int(torch.cuda.memory_reserved(device)) current_free, _ = torch.cuda.mem_get_info(device) measured_process_bytes = cuda_process_memory_bytes() process_bytes = _cuda_process_bytes_with_baseline( current_free, measured_process_bytes, ) if measured_process_bytes is not None or os.environ.get( CUDA_FREE_BEFORE_CONTEXT_ENV) not in (None, ""): # nvidia-smi is a current whole-process measurement; PyTorch's # peak is an allocator high-water mark. A before-context free # memory baseline covers PID-namespaced containers where the # nvidia-smi process PID cannot match os.getpid(). Preserve the # observed non-PyTorch component and add allocator growth that # was released before the probe ended. non_torch_bytes = max(process_bytes - current_reserved, 0) result["cuda_process_memory_bytes"] = process_bytes result["cuda_process_peak_estimate_bytes"] = ( non_torch_bytes + result["cuda_peak_reserved_bytes"] ) except Exception as exc: result["cuda_error"] = str(exc) return result def is_device_out_of_memory_error(exc): """Whether ``exc`` is a CUDA/MPS allocator out-of-memory error.""" message = str(exc).lower() return ( "out of memory" in message and ("cuda" in message or "mps" in message or "allocator" in message) ) def release_cached_device_memory(device): """Return unused accelerator allocator blocks to the shared device.""" try: import torch if device.type == "cuda": torch.cuda.empty_cache() elif device.type == "mps" and hasattr(torch.mps, "empty_cache"): torch.mps.empty_cache() except Exception: pass def release_device_memory_after_oom(device): """Release cached allocator blocks before retrying a smaller auto batch.""" release_cached_device_memory(device) def synchronize_device(device): """Wait for accelerator work so deferred errors surface at their source. CUDA and MPS kernels are asynchronous. Without an explicit synchronization at the end of an elastic prediction attempt, an OOM from a network forward can be reported by an unrelated later tensor transfer, outside the retry loop that can safely reduce the batch size. """ try: import torch except ImportError: return if device.type == "cuda": torch.cuda.synchronize(device) elif device.type == "mps" and hasattr(torch.mps, "synchronize"): torch.mps.synchronize() def release_unused_torch_memory(): """Collect dead tensors and return unused accelerator cache memory. Resource probes deliberately reuse one worker for several architectures. Python reference cycles can otherwise keep the previous fit's tensors alive until a later, unrelated collection, while allocator cache blocks continue to hide global device headroom. Collect cycles before emptying the backend cache so the next probe observes only its own residency. """ gc.collect() try: import torch except ImportError: return try: if torch.cuda.is_available(): torch.cuda.empty_cache() return except RuntimeError: pass try: if ( hasattr(torch.backends, "mps") and torch.backends.mps.is_available() and hasattr(torch, "mps") and hasattr(torch.mps, "empty_cache")): torch.mps.empty_cache() except RuntimeError: pass def estimate_peak_bytes_per_row(model): """Worst-case peak activation bytes per sample during a forward. Walks the model's configured layers and returns the maximum hidden- layer width (in fp32 bytes) × 2 (one input + one output of the current layer stay live under torch's eval-time no_grad reuse). A 4× multiplier covers framework overhead, cuDNN scratch buffers, and Python-side tensor bookkeeping. Used by ``compute_prediction_batch_size``. """ if model is None: return 32 * 1024 # conservative 32 KB/row fallback # Class1ProcessingModel is convolutional over the full # flank+peptide sequence. Its peak activation is not represented by # the affinity model's peptide_dense_layers/dense_layers attributes, # so compute it from the Conv1d sequence width. This keeps prediction # autosizing sensitive to future flank length / filter count changes # instead of falling back to the generic 1024-width estimate. try: conv1 = model.conv1 seq_len = ( int(model.n_flank_length) + int(model.peptide_max_length) + int(model.c_flank_length) ) widths = [ seq_len * int(conv1.in_channels), seq_len * int(conv1.out_channels), ] for convs_name in ("n_flank_post_convs", "c_flank_post_convs"): for layer in getattr(model, convs_name, []): widths.append(seq_len * int(layer.out_channels)) if getattr(model, "flanking_averages", False): widths.append(seq_len * int(conv1.out_channels)) peak = max(widths) return int(peak * 4 * 2 * 4) # fp32 × 2 buffers × 4x safety except (AttributeError, TypeError, ValueError): pass # MergedClass1NeuralNetwork wraps N sub-networks and runs each one's # forward independently in a list comprehension, then combines the # outputs. All N sub-networks' peak intermediates are alive # simultaneously, so the per-row peak is the SUM of per-sub-network # peaks, not the max. Without this, the merged ensemble's auto-sized # batch overshoots VRAM by Nx (~8x for the production 8-network # release ensemble) and OOMs in calibrate's cartesian forward. sub_networks = getattr(model, "networks", None) if sub_networks is not None and not hasattr(model, "peptide_encoding_shape"): try: return int(sum( estimate_peak_bytes_per_row(net) for net in sub_networks )) except (AttributeError, TypeError) as exc: logging.warning( "Could not estimate peak per-row bytes for merged ensemble; " "falling back to per-network walk: %s", exc, ) widths = [] try: lc_out_len = int(model.peptide_encoding_shape[0]) lc_out_ch = int(model.peptide_encoding_shape[1]) for lc_layer in model.lc_layers: lc_out_ch = getattr(lc_layer, "out_channels", lc_out_ch) try: lc_out_len = int(lc_layer.output_length) except AttributeError: pass widths.append(lc_out_len * lc_out_ch) for layer in model.peptide_dense_layers: widths.append(int(layer.out_features)) except AttributeError: widths.append(1024) try: allele_out = None if getattr(model, "allele_embedding", None) is not None: allele_out = int(model.allele_embedding.weight.shape[1]) for layer in getattr(model, "allele_dense_layers", []): allele_out = layer.out_features if allele_out is not None: widths.append(allele_out) except AttributeError: pass try: for layer in model.dense_layers: widths.append(int(layer.out_features)) except AttributeError: widths.append(1024) peak = max(widths) if widths else 1024 return int(peak * 4 * 2 * 4) # fp32 × 2 buffers × 4x safety def free_device_memory_bytes(device): """Best-effort free-memory query. Returns a conservative value when the device doesn't expose a direct free-memory API. - CUDA: ``torch.cuda.mem_get_info`` (exposed free + reserved tracking). - MPS: Apple's ``recommended_max_memory`` on unified memory, minus whatever the MPS driver has already handed us. Cap by ``psutil`` available RAM when present so other apps aren't evicted. Falls back to 4 GB if neither API is reachable. - CPU / unknown: 2 GB conservative budget (the helper short-circuits for CPU anyway, but keep a sensible value in case callers pass a foreign device). """ import torch if device.type == "cuda": try: free, _ = torch.cuda.mem_get_info(device) return int(free) except Exception: props = torch.cuda.get_device_properties(device) reserved = torch.cuda.memory_reserved(device) return max(int(props.total_memory) - int(reserved), 0) if device.type == "mps": # Apple Silicon: unified memory, so "free VRAM" is better # estimated from the MPS driver's recommended ceiling minus # whatever it's already allocated. Ceiling is typically # ~75-80% of total system RAM on M-series chips. try: ceiling = int(torch.mps.recommended_max_memory()) except Exception: ceiling = 4 * (1 << 30) allocated = 0 try: allocated = int(torch.mps.driver_allocated_memory()) except Exception: pass free = max(ceiling - allocated, 0) # Don't evict other apps: also cap by the OS-reported free # RAM when psutil is available. This gets us a realistic # "what's safe to claim right now" rather than the MPS # driver's peak permission. try: import psutil free = min(free, int(psutil.virtual_memory().available)) except ImportError: try: from .workload_planning import system_memory_info_gb available_gb = system_memory_info_gb().get("available_gb") if available_gb is not None: free = min(free, int(available_gb * (1 << 30))) except Exception: # psutil isn't a hard dep. Log once per process so the # skip is visible rather than silent — without this cap # the MPS driver's "recommended max" can exceed what's # actually safe to claim alongside other apps. global _MPS_PSUTIL_WARNED if not _MPS_PSUTIL_WARNED: logging.warning( "psutil not available and OS memory fallback failed; " "MPS free-memory estimate will use " "torch.mps.recommended_max_memory alone, which may " "overshoot actual available RAM." ) _MPS_PSUTIL_WARNED = True except Exception: # Any other psutil failure (broken install, etc.) — skip # the cap but don't fail the whole batch-size query. pass # Zero is a valid and important measurement: on unified-memory Macs it # means the process has no safe headroom. Replacing it with the 4 GiB # API fallback would make auto-sizing attempt another large allocation # under peak memory pressure. The caller turns a zero budget into its # one-row minimum batch. return free return 2 * (1 << 30) @dataclass(frozen=True) class DeviceMemoryBudget: """Stable per-worker device-memory entitlement and remaining headroom.""" free_bytes: int total_bytes: int reserve_bytes: int worker_entitlement_bytes: int process_bytes: int available_bytes: int def device_memory_budget( device, num_workers_per_gpu=1, free_memory_fraction=None, reserve_fraction=MEMORY_RESERVE_FRACTION, reserve_min_bytes=DEVICE_MIN_RESERVE_BYTES): """Return a race-free memory budget for one co-resident worker. The old calculation divided *live free memory* by the declared worker count. Live free memory already reflects allocations made by workers that initialized earlier, so that calculation double-discounted memory and made the resulting batch size depend on startup order. Here every worker gets a fixed entitlement captured from launch-time free capacity (falling back to total device capacity for direct API calls), subtracts its own resident working set, and finally caps the result by live global headroom. Managed workers therefore cannot collectively claim more than the shared launch budget. """ workers = int(num_workers_per_gpu) if workers < 1: raise ValueError("num_workers_per_gpu must be at least 1") if free_memory_fraction is not None: free_memory_fraction = float(free_memory_fraction) if ( not math.isfinite(free_memory_fraction) or not 0 < free_memory_fraction <= 1): raise ValueError("free_memory_fraction must be in (0, 1]") free = int(free_device_memory_bytes(device)) total = free process_bytes = 0 if device.type == "cuda": try: import torch free, total = ( int(value) for value in torch.cuda.mem_get_info(device) ) process_bytes = cuda_process_memory_bytes() if process_bytes is None: process_bytes = int(torch.cuda.memory_reserved(device)) process_bytes = _cuda_process_bytes_with_baseline( free, process_bytes, # A launch baseline is isolated only when this is the sole # resident worker. With peers it can include allocations made # by workers that initialized after this process. allow_baseline=(workers == 1), ) except Exception: try: import torch total = int(torch.cuda.get_device_properties(device).total_memory) process_bytes = int(torch.cuda.memory_reserved(device)) except Exception: total = free process_bytes = 0 elif device.type == "mps": try: import torch total = int(torch.mps.recommended_max_memory()) process_bytes = int(torch.mps.driver_allocated_memory()) except Exception: total = free process_bytes = 0 reserve = memory_reserve_bytes( total, min_reserve_bytes=reserve_min_bytes, reserve_fraction=reserve_fraction, ) spendable = usable_memory_bytes( total, min_reserve_bytes=reserve_min_bytes, reserve_fraction=reserve_fraction, ) if free_memory_fraction is not None: spendable = min( spendable, int(total * free_memory_fraction), ) entitlement = spendable // workers launch_budget = _nonnegative_env_bytes( "MHCFLURRY_DEVICE_MEMORY_BUDGET_BYTES") if launch_budget is not None: entitlement = min(entitlement, launch_budget) available = min( max(free, 0), max(entitlement - max(process_bytes, 0), 0), ) return DeviceMemoryBudget( free_bytes=max(free, 0), total_bytes=max(total, 0), reserve_bytes=max(reserve, 0), worker_entitlement_bytes=max(entitlement, 0), process_bytes=max(process_bytes, 0), available_bytes=max(available, 0), ) def compute_prediction_batch_size( device, model=None, num_workers_per_gpu=1, free_memory_fraction=AUTO_BATCH_FREE_FRACTION, max_rows=AUTO_BATCH_MAX_ROWS, min_rows=AUTO_BATCH_MIN_ROWS, cpu_fallback=AUTO_BATCH_CPU_FALLBACK, total_rows=None): """Auto-size a prediction batch for ``device`` and ``model``. Uses the worker's remaining fixed device-memory entitlement and the model's per-row peak activation estimate, capped by current global headroom. ``max_rows`` is only an optional caller limit; the default auto path has no hardwired batch cap. CPU: returns ``cpu_fallback`` — large batches on CPU thrash L3 cache and rarely help for the small networks mhcflurry trains. """ workers = int(num_workers_per_gpu) if workers < 1: raise ValueError("num_workers_per_gpu must be at least 1") if max_rows is not None and int(max_rows) < 1: raise ValueError("max_rows must be at least 1") if total_rows is not None and int(total_rows) < 0: raise ValueError("total_rows must be non-negative") if free_memory_fraction is not None: free_memory_fraction = float(free_memory_fraction) if ( not math.isfinite(free_memory_fraction) or not 0 < free_memory_fraction <= 1): raise ValueError("free_memory_fraction must be in (0, 1]") if device.type == "cpu": rows = int(cpu_fallback) if rows < 1: raise ValueError("cpu_fallback must be at least 1") return ( min(rows, max(int(total_rows), 1)) if total_rows is not None else rows ) peak_bytes = estimate_peak_bytes_per_row(model) memory = device_memory_budget( device, num_workers_per_gpu=workers, free_memory_fraction=free_memory_fraction, ) free = memory.free_bytes budget = memory.available_bytes rows = max(1, budget // peak_bytes) if rows < min_rows: logging.warning( "Auto-sized prediction batch below the normal floor: %d rows " "(free=%.2f GB, workers/GPU=%d, peak=%.1f KB/row).", rows, free / float(1 << 30), workers, peak_bytes / 1024.0, ) if max_rows is not None: rows = min(rows, int(max_rows)) if total_rows is not None: rows = min(rows, max(int(total_rows), 1)) return int(rows) def env_workers_per_gpu(default=1): """Read the ``MHCFLURRY_MAX_WORKERS_PER_GPU`` env var. The local parallelism pool sets this in each training worker so auto-sized batching + training-memory checks can partition VRAM across co-resident workers without the caller wiring it explicitly. """ value = os.environ.get("MHCFLURRY_MAX_WORKERS_PER_GPU") if value: try: return max(int(value), 1) except ValueError: pass return default def resolve_prediction_batch_size( value, device, model=None, num_workers_per_gpu=1, total_rows=None): """Resolve an explicit int or ``"auto"`` to a concrete batch size. Accepts ``None`` as a synonym for ``"auto"``. Propagates an explicit int through unchanged so callers can always pin the size when they know better than the heuristic. """ if value in (None, "auto"): return compute_prediction_batch_size( device, model=model, num_workers_per_gpu=num_workers_per_gpu, total_rows=total_rows, ) result = int(value) if result < 1: raise ValueError("prediction batch size must be at least 1") return result def calibrate_prediction_batch_size( batch_size, device, model, inputs, num_workers_per_gpu=1, total_rows=None, probe_rows=AUTO_BATCH_CALIBRATION_PROBE_ROWS, safety_multiplier=AUTO_BATCH_CALIBRATION_SAFETY_MULTIPLIER, transfer_inputs_to_device=False): """Tighten an automatic CUDA prediction batch from a real forward probe. The analytic estimator cannot know the exact allocator and convolution workspace chosen for every model shape and CUDA runtime. This function measures the incremental peak of the loaded model with its real resident input tensors, then recomputes the batch from the worker's remaining fixed device-memory entitlement. The result never exceeds either ``batch_size`` or the largest batch exercised successfully by the probe. CUDA convolution workspaces are not reliably linear in batch size, especially while peer workers initialize, so extrapolating above a measured batch is unsafe. CPU and MPS return ``batch_size`` unchanged. MPS does not expose an equivalent resettable peak allocator counter, so it retains the analytic estimate and the caller's elastic OOM retry. Explicit batches should not be passed to this function; callers retain authority over pinned values. Parameters ---------- batch_size : int Analytically selected automatic batch size. device : torch.device Device on which ``model`` and ``inputs`` reside. model : callable Eval-mode model accepting the sliced ``inputs`` mapping. inputs : mapping Tensor inputs with a shared leading row dimension. They may remain on the host when ``transfer_inputs_to_device`` is true. num_workers_per_gpu : int Co-resident workers sharing the device entitlement. total_rows : int, optional Number of available rows. Inferred from ``inputs`` when omitted. probe_rows : int Maximum rows in the measurement forward. The actual probe is also capped at one eighth of the analytic entitlement so measurement cannot consume the batch it is meant to protect. safety_multiplier : float Margin applied to the measured per-row peak when deciding whether the verified probe batch must be tightened further. transfer_inputs_to_device : bool Move each probe slice to ``device`` inside the protected measurement. This models streaming inference and makes transfer OOMs recoverable. Returns ------- int A calibrated batch no larger than ``batch_size`` or the successfully exercised probe batch. """ batch_size = int(batch_size) if batch_size < 1: raise ValueError("batch_size must be at least 1") workers = int(num_workers_per_gpu) if workers < 1: raise ValueError("num_workers_per_gpu must be at least 1") probe_rows = int(probe_rows) if probe_rows < 1: raise ValueError("probe_rows must be at least 1") safety_multiplier = float(safety_multiplier) if ( not math.isfinite(safety_multiplier) or safety_multiplier < 1): raise ValueError("safety_multiplier must be finite and at least 1") if device.type != "cuda" or batch_size == 1: return batch_size if not inputs: raise ValueError("inputs must contain at least one tensor") if total_rows is None: total_rows = len(next(iter(inputs.values()))) total_rows = int(total_rows) if total_rows < 0: raise ValueError("total_rows must be non-negative") if total_rows <= 1: return min(batch_size, max(total_rows, 1)) analytic_bytes_per_row = max(estimate_peak_bytes_per_row(model), 1) memory_before = device_memory_budget( device, num_workers_per_gpu=workers, ) # Keep the probe safely inside the analytic entitlement. A one-eighth # slice is large enough to exercise release processing convolutions while # leaving room for co-resident workers probing at the same time. entitlement_probe_rows = max( memory_before.available_bytes // (analytic_bytes_per_row * 8), 1, ) actual_probe_rows = min( batch_size, total_rows, probe_rows, entitlement_probe_rows, ) try: import torch except Exception as exc: logging.warning( "CUDA prediction batch calibration unavailable before any " "successful probe; forcing batch 1: %s", exc, ) return 1 def finish(result): # cuDNN may reserve a workspace far larger than the final calibrated # batch needs. The probe output and sliced inputs are dead at each # return below, so give those unused blocks back before peer workers # make their own probes or transfers. release_cached_device_memory(device) return int(result) def run_probe(rows): probe_inputs = { name: ( value[:rows].to(device) if transfer_inputs_to_device else value[:rows] ) for name, value in inputs.items() } with torch.no_grad(): return model(probe_inputs) # Trigger lazy CUDA context, kernel, and optional compile setup before # resetting counters. The measured pass then represents repeatable # inference allocation rather than one-time initialization. warmup_output = None try: warmup_output = run_probe(1) torch.cuda.synchronize(device) except Exception as exc: if is_device_out_of_memory_error(exc): release_device_memory_after_oom(device) logging.warning( "CUDA prediction batch calibration failed before any successful " "probe; forcing batch 1: %s", exc, ) return finish(1) finally: del warmup_output measurement_error = None while True: try: allocated_before = int(torch.cuda.memory_allocated(device)) reserved_before = int(torch.cuda.memory_reserved(device)) torch.cuda.reset_peak_memory_stats(device) except Exception as exc: measurement_error = exc probe_output = None try: probe_output = run_probe(actual_probe_rows) torch.cuda.synchronize(device) except Exception as exc: if is_device_out_of_memory_error(exc) and actual_probe_rows > 1: previous_probe_rows = actual_probe_rows actual_probe_rows = max(1, actual_probe_rows // 2) release_device_memory_after_oom(device) logging.warning( "CUDA prediction batch probe OOM at %d rows; retrying " "calibration at %d.", previous_probe_rows, actual_probe_rows, ) continue if is_device_out_of_memory_error(exc): release_device_memory_after_oom(device) logging.warning( "CUDA prediction batch calibration failed above the verified " "one-row warmup; forcing batch 1: %s", exc, ) return finish(1) finally: del probe_output break if measurement_error is not None: logging.warning( "CUDA prediction batch counters unavailable; using verified " "probe batch %d: %s", actual_probe_rows, measurement_error, ) return finish(min(batch_size, actual_probe_rows, total_rows)) try: peak_allocated = max( int(torch.cuda.max_memory_allocated(device)) - allocated_before, 0, ) peak_reserved = max( int(torch.cuda.max_memory_reserved(device)) - reserved_before, 0, ) except Exception as exc: logging.warning( "CUDA prediction batch peak counters unavailable; using verified " "probe batch %d: %s", actual_probe_rows, exc, ) return finish(min(batch_size, actual_probe_rows, total_rows)) measured_peak_bytes = max(peak_allocated, peak_reserved) if measured_peak_bytes <= 0: logging.warning( "CUDA prediction batch calibration observed no incremental peak; " "using verified probe batch %d.", actual_probe_rows, ) return finish(min(batch_size, actual_probe_rows, total_rows)) measured_bytes_per_row = int(math.ceil( measured_peak_bytes / float(actual_probe_rows) )) effective_bytes_per_row = max( analytic_bytes_per_row, int(math.ceil(measured_bytes_per_row * safety_multiplier)), ) memory_after = device_memory_budget( device, num_workers_per_gpu=workers, ) calibrated = max( memory_after.available_bytes // effective_bytes_per_row, 1, ) # A real forward proves that ``actual_probe_rows`` fits this architecture; # it does not prove that a larger convolution uses the same CUDA algorithm # or workspace. In particular, co-resident workers can cross those # allocator thresholds at slightly different times. Never extrapolate an # automatic batch above the largest shape that actually ran successfully. calibrated = min( calibrated, actual_probe_rows, batch_size, total_rows, ) logging.info( "Calibrated CUDA prediction batch: %d -> %d rows " "(probe=%d, analytic=%.1f KB/row, measured=%.1f KB/row, " "effective=%.1f KB/row, remaining entitlement=%.2f GB, " "verified ceiling=%d).", batch_size, calibrated, actual_probe_rows, analytic_bytes_per_row / 1024.0, measured_bytes_per_row / 1024.0, effective_bytes_per_row / 1024.0, memory_after.available_bytes / float(1 << 30), actual_probe_rows, ) return finish(calibrated) # Inference keeps only activations of the current layer alive (input + # output). Training keeps the whole forward-pass activation stack for backward # plus gradients and optimizer state. RMSProp/Adam each store 1-2x weights in # moving averages on top, so 4x the inference peak is a conservative floor that # leaves headroom for cuDNN workspace and Python-side torch overhead. TRAINING_PEAK_MULTIPLIER = 4 def check_training_batch_fits( requested_batch_size, device, model, num_workers_per_gpu=1, free_memory_fraction=None, min_batch=64, logger=None): """Verify that ``requested_batch_size`` will fit on ``device``. Training peak memory = activations kept alive across the forward pass (for backward), plus gradients, plus optimizer state. That's roughly ``4 × estimate_peak_bytes_per_row`` (inference peak). Returns ``(effective_batch_size, shrunk: bool)``. When the requested batch is too large for the available VRAM — partitioned across co-resident workers — the batch is shrunk to the largest power-of-two that fits. ``min_batch`` is a normal-performance floor, not a memory-safety floor: under severe pressure the result may be smaller so the guard does not knowingly force an OOM. A loud warning is emitted via ``logger`` / stderr explaining that the training dynamics (BN running stats, gradient noise scale) now differ from what the caller configured. CPU short-circuits — no OOM risk there that a size-based heuristic can catch. Returns ``(requested_batch_size, False)`` in that case. """ import sys requested_batch_size = int(requested_batch_size) if requested_batch_size < 1: raise ValueError("requested training batch size must be at least 1") if device.type == "cpu": return requested_batch_size, False workers = int(num_workers_per_gpu) if workers < 1: raise ValueError("num_workers_per_gpu must be at least 1") if free_memory_fraction is not None: free_memory_fraction = float(free_memory_fraction) if ( not math.isfinite(free_memory_fraction) or not 0 < free_memory_fraction <= 1): raise ValueError("free_memory_fraction must be in (0, 1]") peak_bytes = estimate_peak_bytes_per_row(model) * TRAINING_PEAK_MULTIPLIER memory = device_memory_budget( device, num_workers_per_gpu=workers, free_memory_fraction=free_memory_fraction, ) free = memory.free_bytes budget = memory.available_bytes max_rows = max(budget // peak_bytes, 1) if requested_batch_size <= max_rows: return requested_batch_size, False shrunk = 1 while shrunk * 2 <= max_rows: shrunk *= 2 below_normal_floor = shrunk < int(min_batch) message = ( "!!! TRAINING BATCH WILL NOT FIT !!! " "Requested minibatch_size=%d on %s with %d worker(s)/GPU. " "Estimated need ~%.1f GB of %.1f GB free VRAM (per-worker budget " "~%.1f GB). Shrinking to %d. " "This CHANGES TRAINING DYNAMICS: batch-norm running stats, " "gradient noise scale, and effective learning-rate schedule " "all depend on batch size. Re-check convergence before " "trusting the trained model. To pin an explicit size and " "silence this guard, set a minibatch_size the caller knows " "fits.%s" % ( requested_batch_size, device, workers, requested_batch_size * peak_bytes / 1e9, free / 1e9, budget / 1e9, shrunk, ( " Available memory requires going below the normal " "performance floor of %d." % int(min_batch) if below_normal_floor else "" ), ) ) if logger is not None: logger.warning(message) else: logging.warning(message) # Also scream to stderr so it's loud in the job log regardless of # which logger config the caller uses. print("\n" + message + "\n", file=sys.stderr, flush=True) if os.environ.get("MHCFLURRY_FAIL_ON_TRAINING_BATCH_SHRINK") == "1": raise RuntimeError( message + " Automatic shrink is forbidden by " "MHCFLURRY_FAIL_ON_TRAINING_BATCH_SHRINK=1." ) return int(shrunk), True mhcflurry-2.3.6/mhcflurry/pytorch_training.py000066400000000000000000000241121525677230600215220ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Shared PyTorch training helpers used by multiple mhcflurry trainers. These helpers are model-agnostic: they assume only that the caller has a ``torch.nn.Module`` network and a ``torch.device``. They provide checkpoint copying, numerical settings, compilation and validation sizing for ``Class1NeuralNetwork`` (affinity) and ``Class1ProcessingNeuralNetwork``. Anything that touches affinity-specific machinery (random-negative resampling, multi-output / inequality losses, allele encoding, percentile-rank calibration) stays in the class I modules. """ import logging import os import torch from .parallelism import resolve_torchinductor_compile_threads_env _TRITON_AUTOGRAD_WARMED_DEVICES = set() def copy_module_state_dict_to_cpu(module): """Return an independent CPU checkpoint of a module's complete state.""" return { name: value.detach().cpu().clone() for name, value in module.state_dict().items() } def configure_matmul_precision(device): """Apply an explicitly requested CUDA matmul precision and cuDNN autotuning. ``MHCFLURRY_MATMUL_PRECISION`` accepts ``highest``, ``high`` or ``medium``. When unset, this helper leaves PyTorch settings unchanged. CPU and MPS calls are no-ops. On CUDA it sets float32 matmul precision and enables cuDNN benchmarking when cuDNN is available. ``highest`` retains full float32 matmul precision; the other modes may use reduced-precision internal operations on supported hardware. cuDNN benchmarking chooses algorithms for observed input shapes and can add initial search time or affect reproducibility. This helper does not enable deterministic algorithms or guarantee identical seeded results. """ if device.type != "cuda": return precision = os.environ.get("MHCFLURRY_MATMUL_PRECISION") if not precision: return torch.set_float32_matmul_precision(precision) # cuDNN benchmark is cheap to enable and has no effect if the # workload never triggers a cuDNN kernel (plain Linear + RMSprop # MLP). Guarded against environments that disabled cuDNN entirely. if torch.backends.cudnn.is_available(): torch.backends.cudnn.benchmark = True def maybe_compile_network(network, device): """Wrap ``network`` with ``torch.compile`` when the env asks for it. Gated on ``MHCFLURRY_TORCH_COMPILE=1`` and a CUDA device. ``torch.compile`` is heavy: JIT graph capture + kernel fusion + on- disk cache + recompile-on-shape-change. The TF32 knob is cheaper and independent — see ``configure_matmul_precision``. ``MHCFLURRY_TORCH_COMPILE_MODE`` picks the ``mode=`` kwarg (default, reduce-overhead, max-autotune). Default is "default" — codegen time is already heavy without max-autotune, and our shape-stable batching is what unlocks the big wins regardless of mode. Returns the compiled module (an ``OptimizedModule`` that forwards ``.train()``, ``.eval()``, ``.state_dict()``, ``.parameters()`` to the wrapped original) so call sites can swap it in without threading a second reference through the training loop. Compilation cost: first forward pass triggers graph capture + codegen (typically 30 s – 2 min on a 2-layer MLP like ours). Subsequent calls with the same input shapes hit the in-process cache; subsequent *processes* hit the on-disk cache (``~/.cache/torch``) as long as the graph matches. """ if device.type != "cuda": return network if os.environ.get("MHCFLURRY_TORCH_COMPILE", "0") != "1": return network # Idempotent: if ``network`` is already an OptimizedModule (i.e. # we've been called before on the same instance, from inside an # epoch loop), return it unchanged. if hasattr(network, "_orig_mod"): return network mode = os.environ.get("MHCFLURRY_TORCH_COMPILE_MODE", "default") resolve_torchinductor_compile_threads_env() # ``dynamic=True`` tells dynamo to generate one shape-polymorphic # graph instead of specializing on every batch shape it sees. # mhcflurry's forward is called with at least three distinct row # counts per work item — pretrain (64 rows), finetune (128), and # validation (4× finetune = 512) — so dynamic=False triggers a # recompile storm (8+ specializations observed in stderr with # [0/8] from torch._dynamo.convert_frame). Each recompile is a # 10-30 s codegen pass, defeating the point. Dynamic mode costs a # few % on the individual kernel but avoids paying the storm. # Override with MHCFLURRY_TORCH_COMPILE_DYNAMIC=0 for static mode # if a caller can guarantee single-shape input. dynamic = os.environ.get("MHCFLURRY_TORCH_COMPILE_DYNAMIC", "1") != "0" logging.info("torch.compile enabled (mode=%s, dynamic=%s)", mode, dynamic) return torch.compile(network, mode=mode, dynamic=dynamic) def maybe_compile_loss(loss_obj, device): """Wrap a loss module with ``torch.compile`` when the env asks for it. Gated on ``MHCFLURRY_TORCH_COMPILE=1`` and a CUDA device — same criteria as ``maybe_compile_network``. ``MSEWithInequalities`` issues ~10 small elementwise kernels per step in eager mode (reshape → subtract → compare → cast → multiply → compare → cast → multiply → square → sum), each with its own launch overhead that adds up to meaningful wall-clock on A100 with a sub-ms compute budget. Dynamo fuses those into a couple of kernels and cuts the loss's share of step time to near-zero. Dispatch via ``MHCFLURRY_TORCH_COMPILE_LOSS_MODE`` (falls back to ``MHCFLURRY_TORCH_COMPILE_MODE``) so the loss's compile mode can be tuned independently of the network's — loss ops are tiny and "reduce-overhead" makes less sense than on the full forward pass. Idempotent: a second call on an already-wrapped loss returns it unchanged. """ if device.type != "cuda": return loss_obj if os.environ.get("MHCFLURRY_TORCH_COMPILE", "0") != "1": return loss_obj # Loss compilation is enabled by default when network compilation is # enabled. PyTorch 2.4 / Triton 3.0 has an upstream bug where the first # Triton kernel launched from autograd's backward worker thread can fail # with ``RuntimeError: Triton Error [CUDA]: invalid device context``. # Running a tiny CUDA backward in the *training worker process* initializes # that thread-local CUDA context before the compiled loss backward fires. if os.environ.get("MHCFLURRY_TORCH_COMPILE_LOSS", "1") != "1": return loss_obj if hasattr(loss_obj, "_orig_mod"): return loss_obj mode = os.environ.get( "MHCFLURRY_TORCH_COMPILE_LOSS_MODE", os.environ.get("MHCFLURRY_TORCH_COMPILE_MODE", "default"), ) resolve_torchinductor_compile_threads_env() # Loss takes (y_pred, y_true) and optionally sample_weights with # dynamic-batch shapes that mirror the network's forward. Match the # network's dynamic/static policy via the same env knob. dynamic = os.environ.get("MHCFLURRY_TORCH_COMPILE_DYNAMIC", "1") != "0" _warm_cuda_autograd_for_triton(device) logging.info("torch.compile applied to loss (mode=%s, dynamic=%s)", mode, dynamic) return torch.compile(loss_obj, mode=mode, dynamic=dynamic) def _warm_cuda_autograd_for_triton(device): """Initialize CUDA context in autograd's backward thread once per device.""" if device.type != "cuda": return index = device.index if index is None: index = torch.cuda.current_device() key = int(index) if key in _TRITON_AUTOGRAD_WARMED_DEVICES: return with torch.cuda.device(device): torch.empty(1, device=device, requires_grad=True).sum().backward() torch.cuda.synchronize(device) _TRITON_AUTOGRAD_WARMED_DEVICES.add(key) def uncompiled_network(network): """Return the eager module behind ``network``.""" return network._orig_mod if hasattr(network, "_orig_mod") else network def validation_forward_network(network, eager_network): """Choose the module used for validation forward passes during training.""" if os.environ.get("MHCFLURRY_TORCH_COMPILE_VALIDATION", "0") == "1": return network return eager_network def effective_validation_batch_size( device, configured_batch_size, minibatch_size, model=None, num_workers_per_gpu=1, total_rows=None): """Return the validation batch size to use for the current device. CUDA validation uses the same live-memory budget as inference. Callers compute this once per fit and persist it in ``fit_info`` so torch.compile sees a stable shape across epochs. Explicit configured values are never changed. """ if configured_batch_size: configured_batch_size = int(configured_batch_size) if configured_batch_size < 1: raise ValueError("validation batch size must be at least 1") return configured_batch_size device_type = getattr(device, "type", device) if device_type in ("cuda", "mps") and model is not None: from .pytorch_sizing import compute_prediction_batch_size return compute_prediction_batch_size( device, model=model, num_workers_per_gpu=num_workers_per_gpu, total_rows=total_rows, ) if device_type == "cuda": # Parent-process planning cannot initialize CUDA. Keep a deterministic # analytic fallback until the worker has a live model and memory view. rows = max(4 * minibatch_size, 4096) return min(rows, int(total_rows)) if total_rows is not None else rows return 4 * minibatch_size mhcflurry-2.3.6/mhcflurry/random_negative_peptides.py000066400000000000000000001034461525677230600232060ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import logging import math import numpy import pandas from . import amino_acid from .encodable_sequences import EncodableSequences from .hyperparameters import HyperparameterDefaults from .common import amino_acid_distribution, random_peptides class RandomNegativePeptides(object): """ Generate random negative (peptide, allele) pairs. These are used during model training, where they are resampled at each epoch. """ hyperparameter_defaults = HyperparameterDefaults( random_negative_rate=0.0, random_negative_constant=0, random_negative_match_distribution=True, random_negative_distribution_smoothing=0.0, random_negative_method="recommended", random_negative_binder_threshold=None, random_negative_lengths=[8,9,10,11,12,13,14,15]) """ Hyperperameters for random negative peptides. Number of random negatives will be: random_negative_rate * (num measurements) + random_negative_constant where the exact meaning of (num measurements) depends on the particular random_negative_method in use. If random_negative_match_distribution is True, then the amino acid frequencies of the training data peptides are used to generate the random peptides. Valid values for random_negative_method are: "by_length": used for allele-specific prediction. See description in `RandomNegativePeptides.plan_by_length` method. "by_allele": used for pan-allele prediction. See `RandomNegativePeptides.plan_by_allele` method. "by_allele_equalize_nonbinders": used for pan-allele prediction. See `RandomNegativePeptides.plan_by_allele_equalize_nonbinders` method. "recommended": the default. Use by_length if the predictor is allele- specific and by_allele if it's pan-allele. """ def __init__(self, **hyperparameters): self.hyperparameters = self.hyperparameter_defaults.with_defaults( hyperparameters) self.plan_df = None self.aa_distribution = None def plan(self, peptides, affinities, alleles=None, inequalities=None): """ Calculate the number of random negatives for each allele and peptide length. Call this once after instantiating the object. Parameters ---------- peptides : list of string affinities : list of float alleles : list of string, optional inequalities : list of string (">", "<", or "="), optional Returns ------- pandas.DataFrame indicating number of random negatives for each length and allele. """ numpy.testing.assert_equal(len(peptides), len(affinities)) if alleles is not None: numpy.testing.assert_equal(len(peptides), len(alleles)) if inequalities is not None: numpy.testing.assert_equal(len(peptides), len(inequalities)) peptides = pandas.Series(peptides, copy=False) peptide_lengths = peptides.str.len() if self.hyperparameters['random_negative_match_distribution']: distribution = amino_acid_distribution( peptides.values, smoothing=self.hyperparameters[ 'random_negative_distribution_smoothing' ]) # Random negatives are decoys over the common amino acids. Drop X # and any residue absent from the canonical amino-acid index # (e.g. B/Z/U) -- treat both as the X/unknown index -- then # renormalize so the host sampler (random_peptides over this # distribution) and the device sampler agree. The device sampler # (aa_distribution_to_index_weights) indexes AMINO_ACID_INDEX and # would KeyError on an unsupported letter, so it must never reach # here. Defaulting get() to X_INDEX is load-bearing: a bare # get(letter) returns None for an unsupported residue, and # None != X_INDEX keeps it, which would let the host path emit it # while the device path raises before the first epoch. keep = [ letter for letter in distribution.index if amino_acid.AMINO_ACID_INDEX.get(letter, amino_acid.X_INDEX) != amino_acid.X_INDEX ] distribution = distribution.loc[keep] total = distribution.sum() if total <= 0: # Only reachable if every residue in every training peptide is # X (or otherwise maps to the unknown index) — there are no # common amino acids left to sample random negatives from. raise ValueError( "Cannot match random-negative amino acid distribution: " "the training peptides contain no common amino acids " "(every residue mapped to X after dropping the unknown " "index).") self.aa_distribution = distribution / total logging.info( "Using amino acid distribution for random negative:\n%s" % ( str(self.aa_distribution.to_dict()))) df_all = pandas.DataFrame({ 'length': peptide_lengths, 'affinity': affinities, }) df_all["allele"] = "" if alleles is None else alleles df_all["inequality"] = "=" if inequalities is None else inequalities df_binders = None df_nonbinders = None if self.hyperparameters['random_negative_binder_threshold']: df_nonbinders = df_all.loc[ (df_all.inequality != "<") & (df_all.affinity > self.hyperparameters[ 'random_negative_binder_threshold' ]) ] df_binders = df_all.loc[ (df_all.inequality != ">") & (df_all.affinity <= self.hyperparameters[ 'random_negative_binder_threshold' ]) ] method = self.hyperparameters['random_negative_method'] if method == 'recommended': # by_length for allele-specific prediction and by_allele for pan. method = ( "by_length" if alleles is None else "by_allele") function = { 'by_length': self.plan_by_length, 'by_allele': self.plan_by_allele, 'by_allele_equalize_nonbinders': self.plan_by_allele_equalize_nonbinders, }[method] function(df_all, df_binders, df_nonbinders) assert self.plan_df is not None logging.info("Random negative plan [%s]:\n%s", method, self.plan_df) return self.plan_df def plan_by_length(self, df_all, df_binders=None, df_nonbinders=None): """ Generate a random negative plan using the "by_length" policy. Parameters are as in the `plan` method. No return value. Used for allele-specific predictors. Does not work well for pan-allele. Different numbers of random negatives per length. Alleles are sampled proportionally to the number of times they are used in the training data. """ assert list(df_all.allele.unique()) == [""], ( "by_length only recommended for allele specific prediction") df = df_all if df_binders is None else df_binders lengths = self.hyperparameters['random_negative_lengths'] length_to_num_random_negative = {} length_counts = df.length.value_counts().to_dict() for length in lengths: length_to_num_random_negative[length] = int( length_counts.get(length, 0) * self.hyperparameters['random_negative_rate'] + self.hyperparameters['random_negative_constant']) plan_df = pandas.DataFrame(index=sorted(df.allele.unique())) for length in lengths: plan_df[length] = length_to_num_random_negative[length] self.plan_df = plan_df.astype(int) def plan_by_allele(self, df_all, df_binders=None, df_nonbinders=None): """ Generate a random negative plan using the "by_allele" policy. Parameters are as in the `plan` method. No return value. For each allele, a particular number of random negatives are used for all lengths. Across alleles, the number of random negatives varies; within an allele, the number of random negatives for each length is a constant """ allele_to_num_per_length = {} total_random_peptides_per_length = 0 df = df_all if df_binders is None else df_binders lengths = self.hyperparameters['random_negative_lengths'] all_alleles = df_all.allele.unique() for allele in all_alleles: sub_df = df.loc[df.allele == allele] num_for_allele = len(sub_df) * ( self.hyperparameters['random_negative_rate'] ) + self.hyperparameters['random_negative_constant'] num_per_length = int(math.ceil( num_for_allele / len(lengths))) total_random_peptides_per_length += num_per_length allele_to_num_per_length[allele] = num_per_length plan_df = pandas.DataFrame(index=sorted(df.allele.unique())) for length in lengths: plan_df[length] = plan_df.index.map(allele_to_num_per_length) self.plan_df = plan_df.astype(int) def plan_by_allele_equalize_nonbinders( self, df_all, df_binders, df_nonbinders): """ Generate a random negative plan using the "by_allele_equalize_nonbinders" policy. Parameters are as in the `plan` method. No return value. Requires that the random_negative_binder_threshold hyperparameter is set. In a first step, the number of random negatives selected by the "by_allele" method are added (see `plan_by_allele`). Then, the total number of non-binders are calculated for each allele and length. This total includes non-binder measurements in the training data plus the random negative peptides added in the first step. In a second step, additional random negative peptides are added so that for each allele, all peptide lengths have the same total number of non-binders. """ assert df_binders is not None assert df_nonbinders is not None lengths = self.hyperparameters['random_negative_lengths'] self.plan_by_allele(df_all, df_binders, df_nonbinders) first_pass_plan = self.plan_df self.plan_df = None # Use floating point while populating so NaN assignment remains valid # across pandas versions; cast to int at the end. new_plan = first_pass_plan.astype(float).copy() new_plan[:] = numpy.nan for (allele, first_pass_per_length) in first_pass_plan.iterrows(): real_nonbinders_by_length = df_nonbinders.loc[ df_nonbinders.allele == allele ].length.value_counts().reindex(lengths).fillna(0) total_nonbinders_by_length = ( real_nonbinders_by_length + first_pass_per_length) new_plan.loc[allele] = first_pass_per_length + ( total_nonbinders_by_length.max() - total_nonbinders_by_length) if new_plan.isna().any().any(): raise AssertionError( "Random negative plan contains NaN after equalization; " "this indicates an incomplete per-allele assignment bug." ) self.plan_df = new_plan.astype(int) def get_alleles(self): """ Get the list of alleles corresponding to each random negative peptide as returned by `get_peptides`. This does NOT change and can be safely called once and reused. Returns ------- list of string """ assert self.plan_df is not None, "Call plan() first" alleles = [] for allele, row in self.plan_df.iterrows(): alleles.extend([allele] * int(row.sum())) assert len(alleles) == self.get_total_count() return alleles def get_peptides(self, rng=None): """ Get the list of random negative peptides. This will be different each time the method is called. Parameters ---------- rng : numpy.random.Generator, optional When supplied, all random draws go through this generator. Lets a caller make the returned peptide list deterministic — used by ``RandomNegativesPool`` to build reproducible multi-epoch pools. When None the numpy global state is used, preserving the historical "fresh peptides every call" behavior. Returns ------- list of string """ assert self.plan_df is not None, "Call plan() first" peptides = [] for allele, row in self.plan_df.iterrows(): for (length, num) in row.items(): peptides.extend( random_peptides( num, length=length, distribution=self.aa_distribution, rng=rng)) assert len(peptides) == self.get_total_count() return peptides def get_total_count(self): """ Total number of planned random negative peptides. Returns ------- int """ return self.plan_df.sum().sum() class RandomNegativesPool(object): """Amortize random-negative generation and encoding across N epochs. ``Class1NeuralNetwork.fit`` needs random-negative peptides each epoch. Generating them and encoding them into network inputs can dominate training time for large pan-allele runs. This class generates ``pool_epochs`` worth of random peptides in one call to the planner, encodes the whole pool once, and hands back an O(1) slice per epoch. Setting ``pool_epochs=1`` samples and encodes fresh negatives every epoch. Setting ``pool_epochs>1`` amortizes generation and encoding across the pool; the trade-off is that consecutive epochs in a pool cycle see distinct slices of the same generated pool rather than independently generated peptides. A new pool is generated at each ``epoch // pool_epochs`` boundary. Seeding is optional. When ``seed`` is None the peptides are drawn from the process's numpy global state, matching the pre-pool semantics. Worker initialization is responsible for independent RNG states; separate processes alone do not guarantee them. Supplying an explicit seed makes pool contents reproducible — useful for debugging and for regression tests. """ def __init__( self, planner, peptide_encoder, pool_epochs=1, seed=None, device=None, peptide_encoding=None): """ Parameters ---------- planner : RandomNegativePeptides A planner that has already had ``plan(...)`` called on it. peptide_encoder : callable Receives an ``EncodableSequences`` and returns an encoded numpy array (typically ``Class1NeuralNetwork .peptides_to_network_input``). Called once per cycle on the full pool. Ignored when ``device`` is set — the device path samples and encodes integer indices directly. pool_epochs : int Number of consecutive epochs that share a pool. 1 means fresh random negatives every epoch. seed : int, optional Seed for the per-cycle RNG. When None, draws go through numpy's global state (or torch's global state on the device path). device : torch.device or str, optional When set, the pool builds device-resident int8 tensors via :func:`encode_random_negatives_on_device` instead of the host-side string-→encoder path. ``peptide_encoding`` must be provided alongside; ``peptide_encoder`` is unused on this path. Peptide strings are not materialized (``get_epoch_inputs`` returns ``(None, encoded_slice)``). peptide_encoding : dict, optional Required when ``device`` is set. Subset of the model's ``peptide_encoding`` hyperparameter — at minimum ``alignment_method`` and ``max_length`` (plus ``left_edge`` / ``right_edge`` for ``pad_middle``). """ assert planner.plan_df is not None, "Call planner.plan() first" if device is not None and peptide_encoding is None: raise ValueError( "RandomNegativesPool: device-resident pool requires " "peptide_encoding (alignment_method, max_length, ...)" ) self.planner = planner self.peptide_encoder = peptide_encoder self.pool_epochs = max(int(pool_epochs), 1) self.seed = seed self.device = device self.peptide_encoding = peptide_encoding self._total_count = int(planner.get_total_count()) self._current_cycle = None self._current_encoded = None # shape: (pool_epochs * total_count, ...) self._current_peptides = None # list of str, len = pool_epochs * total_count # Allocated lazily on first device-mode build, reused per cycle. self._device_buffer = None def _rng_for_cycle(self, cycle): if self.seed is None: return None seed_seq = numpy.random.SeedSequence( entropy=int(self.seed), spawn_key=(int(cycle),) ) return numpy.random.default_rng(seed_seq) def _torch_generator_for_cycle(self, cycle): """Per-cycle torch.Generator for the device path. Returns ``None`` when ``self.seed`` is None (let torch's global state vary per worker). Mirrors the SeedSequence(seed, cycle) deterministic mix used by the host path so seeded device pools are reproducible across rebuilds. """ import torch as _torch if self.seed is None: return None seed_seq = numpy.random.SeedSequence( entropy=int(self.seed), spawn_key=(int(cycle),) ) # Squeeze the SeedSequence into a 64-bit unsigned int seed. state = seed_seq.generate_state(2, dtype=numpy.uint32).astype( numpy.uint64 ) seed64 = int(state[0]) | (int(state[1]) << 32) seed64 &= (1 << 63) - 1 # torch wants signed positive 64-bit gen = _torch.Generator(device=self.device) gen.manual_seed(seed64) return gen def _build_cycle(self, cycle): if self.device is not None: self._build_cycle_device(cycle) return rng = self._rng_for_cycle(cycle) peptides = [] for _ in range(self.pool_epochs): peptides.extend(self.planner.get_peptides(rng=rng)) assert len(peptides) == self.pool_epochs * self._total_count encoded = self.peptide_encoder(EncodableSequences.create(peptides)) self._current_peptides = peptides self._current_encoded = encoded self._current_cycle = cycle def _build_cycle_device(self, cycle): """Device-resident path: sample + encode int indices on device. Allocates a single device-resident int8 tensor on first call and refills it in place every cycle. ``_current_peptides`` stays ``None`` — fit() doesn't need the strings; logging / debug callers can re-materialize via :func:`amino_acid.indices_to_peptide`. """ gen = self._torch_generator_for_cycle(cycle) if self._device_buffer is None: self._device_buffer = encode_random_negatives_on_device( planner=self.planner, pool_epochs=self.pool_epochs, peptide_encoding=self.peptide_encoding, device=self.device, generator=gen, ) else: encode_random_negatives_on_device( planner=self.planner, pool_epochs=self.pool_epochs, peptide_encoding=self.peptide_encoding, device=self.device, generator=gen, out=self._device_buffer, ) self._current_encoded = self._device_buffer self._current_peptides = None self._current_cycle = cycle def get_epoch_inputs(self, epoch): """Return ``(peptides_list, encoded_slice)`` for ``epoch``. The returned ``encoded_slice`` is a view into the pool-level encoded array — no copy — so downstream assignments that expect to own the memory should ``.copy()`` it first. The list of raw peptide strings is included for callers that need it (e.g. logging / diagnostics). On the device-resident path ``peptides_list`` is ``None`` (the strings are never materialized; recover them via :func:`amino_acid.indices_to_peptide` against the int8 encoded slice if a logging caller needs them). """ cycle = int(epoch) // self.pool_epochs if cycle != self._current_cycle: self._build_cycle(cycle) offset = (int(epoch) % self.pool_epochs) * self._total_count end = offset + self._total_count if self._current_peptides is None: peptides_slice = None else: peptides_slice = self._current_peptides[offset:end] encoded_slice = self._current_encoded[offset:end] return peptides_slice, encoded_slice @property def total_count(self): return self._total_count # --- Device-resident random-negative encoding ----------------------------- # # The host path generates peptides by sampling AA letters via # ``numpy.random.choice``, joining each row into a Python string, and then # round-tripping the strings through ``EncodableSequences.create`` → # ``sequences_to_fixed_length_index_encoded_array`` to recover integer # indices. On a release-exact run that string round-trip dominated random- # negative generation: ~22.5 M Python string allocations + 1.5 M joins per # epoch. # # The helpers below skip the round-trip entirely. They sample integer # indices directly via ``torch.multinomial`` against the canonical AA # distribution and apply the same per-(allele, length) alignment math as # the host path, writing into a pre-allocated device-resident int8 tensor. # Output rows match ``planner.get_peptides()`` order: outer loop over # pool epochs, then ``plan_df`` row-major iteration of (allele, length, # count). Within a (allele, length) block, the row order is the order # returned by torch.multinomial — not the same RNG stream as the numpy # path, but the row layout (which (allele, length) sits where) is # byte-identical. _SUPPORTED_DEVICE_ALIGNMENTS = ( "left_pad_centered_right_pad", "pad_middle", ) def supports_device_random_negative_encoding(peptide_encoding): """Return whether random negatives can be encoded directly on device.""" return peptide_encoding.get("alignment_method") in _SUPPORTED_DEVICE_ALIGNMENTS def _place_indices_with_alignment( out_rows, block, length, alignment, max_length, left_edge=4, right_edge=4): """Write a ``(count, length)`` index block into ``out_rows`` in place. ``out_rows`` is a (count, encoded_length) tensor or array prefilled with the X index. Mirrors the per-length branch of :func:`EncodableSequences.sequences_to_fixed_length_index_encoded_array` for the supported alignment methods, but operates on already-sampled integer indices instead of peptide strings. Factored out so the device-aware encoder and host-side parity tests share one source of truth for the alignment math. """ L = int(length) if alignment == "left_pad_centered_right_pad": # Mirror the reference encoder, which arbitrarily sets a minimum # length of 5 for this alignment (see # EncodableSequences.sequences_to_fixed_length_index_encoded_array). # Keeping the same floor means the device path rejects exactly the # lengths the host path would, rather than silently accepting 1..4. min_length = 5 if L < min_length or L > int(max_length): raise ValueError( "left_pad_centered_right_pad requires %d <= length <= " "max_length=%d; got %d" % (min_length, max_length, L) ) out_rows[:, :L] = block out_rows[:, -L:] = block center_left_padding = (int(max_length) - L) // 2 center_left_offset = int(max_length) + center_left_padding out_rows[:, center_left_offset : center_left_offset + L] = block return if alignment == "pad_middle": min_length = int(left_edge) + int(right_edge) if L < min_length or L > int(max_length): raise ValueError( "pad_middle requires %d <= length <= max_length=%d; " "got %d" % (min_length, max_length, L) ) middle_length = int(max_length) - int(left_edge) - int(right_edge) num_null = int(max_length) - L num_null_left = int(math.ceil(num_null / 2)) num_middle_filled = middle_length - num_null middle_start = int(left_edge) + num_null_left out_rows[:, : int(left_edge)] = block[:, : int(left_edge)] out_rows[:, -int(right_edge) :] = block[:, -int(right_edge) :] if num_middle_filled > 0: out_rows[ :, middle_start : middle_start + num_middle_filled ] = block[ :, int(left_edge) : int(left_edge) + num_middle_filled ] return raise NotImplementedError( "Device-resident RN encoder supports alignment_method in %r; " "got %r." % (_SUPPORTED_DEVICE_ALIGNMENTS, alignment) ) def encoded_length_for_alignment(alignment, max_length): """Return the per-row encoded length for an alignment method. Mirrors the shape contract of :func:`EncodableSequences.sequences_to_fixed_length_index_encoded_array`. Covers every alignment method for shape bookkeeping / host-path parity; note the device random-negative encoder only supports the subset in ``_SUPPORTED_DEVICE_ALIGNMENTS`` (left_pad_centered_right_pad / pad_middle), so the ``left_pad_right_pad`` / ``right_pad`` / ``left_pad`` branches here are reachable only on the host path, not on device. """ if alignment == "left_pad_centered_right_pad": return 3 * int(max_length) if alignment == "pad_middle": return int(max_length) if alignment == "left_pad_right_pad": return 2 * int(max_length) if alignment in ("right_pad", "left_pad"): return int(max_length) raise NotImplementedError( "encoded_length_for_alignment: unknown alignment %r" % (alignment,) ) def aa_distribution_to_index_weights(distribution, device=None, dtype=None): """Convert a letter-indexed AA distribution to a torch index-weight vector. Parameters ---------- distribution : pandas.Series or None Letter→probability map (typically the planner's ``aa_distribution``). When ``None``, weights are uniform over the 20 common amino acids. device, dtype : forwarded to the result tensor. ``dtype`` defaults to ``torch.float32`` (multinomial requires float). Returns ------- torch.Tensor of shape ``(len(amino_acid.AMINO_ACIDS),)`` — index 20 (X) is always zero so X is never sampled. """ import torch as _torch if dtype is None: dtype = _torch.float32 weights = _torch.zeros( len(amino_acid.AMINO_ACIDS), dtype=dtype, device=device ) if distribution is None: for letter in amino_acid.COMMON_AMINO_ACIDS: weights[amino_acid.AMINO_ACID_INDEX[letter]] = 1.0 else: for letter, prob in distribution.items(): idx = amino_acid.AMINO_ACID_INDEX[letter] if idx == amino_acid.X_INDEX: continue weights[idx] = float(prob) total = weights.sum() if float(total) <= 0.0: raise ValueError( "aa_distribution_to_index_weights: all weights are zero. " "Either supply a distribution covering common AAs or pass " "distribution=None for a uniform fallback." ) weights = weights / total return weights def encode_random_negatives_on_device( *, planner, pool_epochs, peptide_encoding, device, generator=None, dtype=None, out=None): """Sample + encode ``pool_epochs`` cycles of random negatives on device. Parameters ---------- planner : RandomNegativePeptides Already had ``plan(...)`` called. pool_epochs : int Number of consecutive get_peptides() epochs to materialize. The result has ``pool_epochs * planner.get_total_count()`` rows. peptide_encoding : dict Subset of ``Class1NeuralNetwork.network_hyperparameter_defaults`` that controls peptide encoding. Required keys: ``alignment_method``, ``max_length``. For ``pad_middle``, ``left_edge`` and ``right_edge`` are also consulted (default 4 each, matching the historical defaults). device : torch.device or str Output tensor device. Sampling and alignment writes happen here (no host round-trip). generator : torch.Generator, optional When supplied, all multinomial draws are routed through it. The caller is responsible for seeding (the numpy / torch RNG streams are not bridged — for reproducible parity tests, seed both). dtype : torch.dtype, optional Output dtype. Default ``torch.int8`` (alphabet size 21 fits with room to spare). out : torch.Tensor, optional Pre-allocated output tensor of the correct shape, dtype, and device. When supplied, this function refills it in place — the usual pattern for the device-resident fit path, where the per-fit RN buffer is allocated once and reused per cycle. Returns ------- torch.Tensor of shape ``(pool_epochs * total_count, encoded_length)``, dtype int8 by default, on ``device``. Rows are the per-(allele, length) blocks in canonical ``planner.plan_df`` row-major order, repeated ``pool_epochs`` times — same layout the host path produces after encoding ``planner.get_peptides()``. """ import torch as _torch if planner.plan_df is None: raise ValueError( "encode_random_negatives_on_device: planner has no plan; " "call planner.plan(...) before encoding." ) pool_epochs = max(int(pool_epochs), 1) if dtype is None: dtype = _torch.int8 alignment = peptide_encoding["alignment_method"] max_length = int(peptide_encoding["max_length"]) if not supports_device_random_negative_encoding(peptide_encoding): raise NotImplementedError( "encode_random_negatives_on_device: alignment_method %r not " "supported on device. Callers should gate on " "supports_device_random_negative_encoding() and use the host " "EncodableSequences path instead." % (alignment,) ) left_edge = int(peptide_encoding.get("left_edge", 4)) right_edge = int(peptide_encoding.get("right_edge", 4)) encoded_length = encoded_length_for_alignment(alignment, max_length) total_count = int(planner.get_total_count()) expected_rows = pool_epochs * total_count expected_shape = (expected_rows, encoded_length) if out is None: out = _torch.full( expected_shape, int(amino_acid.X_INDEX), dtype=dtype, device=device, ) else: if tuple(out.shape) != expected_shape: raise ValueError( "out shape mismatch: expected %r, got %r" % ( expected_shape, tuple(out.shape), ) ) if out.dtype != dtype: raise ValueError( "out dtype mismatch: expected %r, got %r" % (dtype, out.dtype) ) out.fill_(int(amino_acid.X_INDEX)) weights = aa_distribution_to_index_weights( planner.aa_distribution, device=device ) plan_df = planner.plan_df alleles = list(plan_df.index) length_columns = list(plan_df.columns) cursor = 0 for _epoch in range(pool_epochs): for allele in alleles: for length in length_columns: num = int(plan_df.at[allele, length]) if num <= 0: continue L = int(length) flat = _torch.multinomial( weights, num_samples=num * L, replacement=True, generator=generator, ) block = flat.view(num, L).to(dtype) _place_indices_with_alignment( out[cursor : cursor + num], block, length=L, alignment=alignment, max_length=max_length, left_edge=left_edge, right_edge=right_edge, ) cursor += num if cursor != expected_rows: raise AssertionError( "encode_random_negatives_on_device: wrote %d rows, expected " "%d (planner.get_total_count() drift?)" % ( cursor, expected_rows, ) ) return out mhcflurry-2.3.6/mhcflurry/regression_target.py000066400000000000000000000030131525677230600216620ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import numpy def from_ic50(ic50, max_ic50=50000.0): """ Convert ic50s to regression targets in the range [0.0, 1.0]. Parameters ---------- ic50 : numpy.array of float Affinities in nM; values outside [1, max_ic50] saturate the target. max_ic50 : float, default 50000.0 Upper affinity scale in nM (must be greater than 1). Returns ------- numpy.array of float """ x = 1.0 - (numpy.log(numpy.maximum(ic50, 1e-12)) / numpy.log(max_ic50)) return numpy.minimum( 1.0, numpy.maximum(0.0, x)) def to_ic50(x, max_ic50=50000.0): """ Convert regression targets in the range [0.0, 1.0] to ic50s in the range [1, max_ic50] nM. Values outside [0, 1] are not clipped. Parameters ---------- x : numpy.array of float max_ic50 : float, default 50000.0 Upper affinity scale in nM (must be greater than 1). Returns ------- numpy.array of float """ return max_ic50 ** (1.0 - x) mhcflurry-2.3.6/mhcflurry/release_holdout.py000066400000000000000000000374371525677230600213330ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. """Build and validate the frozen evaluation holdout for model releases.""" import argparse import hashlib import json from pathlib import Path import pandas from .common import ( normalize_class1_genotype, normalize_sequence_resolved_allele_name, ) BENCHMARK_FILES = { "monoallelic": "benchmark.monoallelic.train_excluded.csv.bz2", "multiallelic": "benchmark.multiallelic.train_excluded.csv.bz2", } AFFINITY_PMHCS_FILE = "affinity_pmhcs.csv" AFFINITY_SAMPLES_FILE = "affinity_samples.csv" PROCESSING_SAMPLES_FILE = "processing_samples.csv" PRESENTATION_SAMPLES_FILE = "presentation_samples.csv" POLICY_FILE = "policy.json" VALIDATION_FILE = "validation.json" PRESENTATION_HOLDOUT_PMIDS = ("31154438",) def _sha256(path): digest = hashlib.sha256() with open(path, "rb") as fd: for block in iter(lambda: fd.read(1024 * 1024), b""): digest.update(block) return digest.hexdigest() def _benchmark_rows(path, chunksize): for chunk in pandas.read_csv( path, usecols=["peptide", "sample_id", "hit", "hla"], chunksize=chunksize): yield chunk def canonical_allele_mapping(values): """Map raw class-I allele names to sequence-resolved canonical names.""" result = {} for raw in pandas.Series(values).dropna().astype(str).unique(): try: result[raw] = normalize_sequence_resolved_allele_name(raw) except ValueError: result[raw] = None return result def build_release_holdout( data_dir, training_data, mass_spec_data, out_dir, presentation_holdout_pmids=PRESENTATION_HOLDOUT_PMIDS, chunksize=500_000): """Derive release exclusions for one frozen source-study holdout. Affinity metrics are evaluated on every monoallelic benchmark sample. Every pMHC from current affinity training that appears in those rows or in the selected multiallelic holdout (hit or decoy) is excluded so downstream presentation evaluation cannot leak through the affinity component. Processing and presentation are evaluated only on the named multiallelic source-study holdout; presentation excludes those samples from training in full. """ data_dir = Path(data_dir).resolve() training_data = Path(training_data).resolve() mass_spec_data = Path(mass_spec_data).resolve() out_dir = Path(out_dir).resolve() out_dir.mkdir(parents=True, exist_ok=True) if not training_data.is_file(): raise ValueError(f"Missing affinity training data: {training_data}") if not mass_spec_data.is_file(): raise ValueError(f"Missing annotated MS data: {mass_spec_data}") training = pandas.read_csv( training_data, usecols=["allele", "peptide"]) training_allele_map = canonical_allele_mapping(training.allele) training["canonical_allele"] = training.allele.astype(str).map( training_allele_map) training = training.loc[training.canonical_allele.notna()] training_pmhcs = set(zip( training.canonical_allele, training.peptide.astype(str), strict=True)) sample_metadata = pandas.read_csv( mass_spec_data, usecols=["sample_id", "pmid", "format", "mhc_class"], ).drop_duplicates("sample_id") sample_metadata["sample_id"] = sample_metadata.sample_id.astype(str) sample_metadata["pmid"] = sample_metadata.pmid.astype(str) holdout_pmids = tuple(str(value) for value in presentation_holdout_pmids) presentation_samples = set(sample_metadata.loc[ sample_metadata.mhc_class.eq("I") & sample_metadata.format.eq("MULTIALLELIC") & sample_metadata.pmid.isin(holdout_pmids), "sample_id", ]) if not presentation_samples: raise ValueError( f"No multiallelic samples found for holdout PMIDs {holdout_pmids}") affinity_pmhcs = set() affinity_samples = set() evaluation_row_counts = {} hit_counts = {} input_files = {} genotype_cache = {} for kind, filename in BENCHMARK_FILES.items(): path = data_dir / filename if not path.is_file(): raise ValueError(f"Missing release benchmark: {path}") row_count = 0 hit_count = 0 benchmark_samples = set() for rows in _benchmark_rows(path, chunksize=chunksize): rows["sample_id"] = rows.sample_id.astype(str) if kind == "multiallelic": rows = rows.loc[ rows.sample_id.isin(presentation_samples)].copy() else: affinity_samples.update(rows.sample_id) if rows.empty: continue row_count += len(rows) hit_count += int(rows.hit.sum()) benchmark_samples.update(rows.sample_id) rows["hla"] = rows.hla.astype(str) rows["peptide"] = rows.peptide.astype(str) for genotype, genotype_rows in rows.groupby("hla", sort=False): alleles = genotype_cache.get(genotype) if alleles is None: alleles = normalize_class1_genotype(genotype) genotype_cache[genotype] = alleles peptides = genotype_rows.peptide.unique() for allele in alleles: affinity_pmhcs.update( (allele, peptide) for peptide in peptides if (allele, peptide) in training_pmhcs) evaluation_row_counts[kind] = row_count hit_counts[kind] = hit_count input_files[kind] = { "path": str(path), "sha256": _sha256(path), } if kind == "multiallelic": missing = sorted(presentation_samples - benchmark_samples) if missing: raise ValueError( "Holdout samples missing from multiallelic benchmark: " f"{missing}") affinity_frame = pandas.DataFrame( sorted(affinity_pmhcs), columns=["allele", "peptide"]) affinity_samples_frame = pandas.DataFrame({ "sample_id": sorted(affinity_samples), }) processing_frame = pandas.DataFrame({ "sample_id": sorted(presentation_samples), }) presentation_frame = pandas.DataFrame({ "sample_id": sorted(presentation_samples), }) affinity_frame.to_csv(out_dir / AFFINITY_PMHCS_FILE, index=False) affinity_samples_frame.to_csv( out_dir / AFFINITY_SAMPLES_FILE, index=False) processing_frame.to_csv(out_dir / PROCESSING_SAMPLES_FILE, index=False) presentation_frame.to_csv(out_dir / PRESENTATION_SAMPLES_FILE, index=False) holdout_files = {} for filename, frame in ( (AFFINITY_PMHCS_FILE, affinity_frame), (AFFINITY_SAMPLES_FILE, affinity_samples_frame), (PROCESSING_SAMPLES_FILE, processing_frame), (PRESENTATION_SAMPLES_FILE, presentation_frame)): holdout_files[filename] = { "rows": len(frame), "sha256": _sha256(out_dir / filename), } policy = { "schema_version": 1, "policy": { "affinity": ( "Evaluate affinity metrics on all monoallelic samples. " "Exclude every current-training pMHC that occurs in those " "rows or in the named multiallelic source-study holdout, " "including decoys; expand multiallelic genotypes to every " "listed allele so presentation evaluation cannot leak " "through the affinity component." ), "processing": ( "Evaluate only the named multiallelic source-study holdout; " "enforce zero training sample-id overlap." ), "presentation": ( "Evaluate only the named multiallelic source-study holdout " "and exclude those whole samples from training." ), }, "input_files": { **input_files, "affinity_training_data": { "path": str(training_data), "sha256": _sha256(training_data), }, "mass_spec_data": { "path": str(mass_spec_data), "sha256": _sha256(mass_spec_data), }, }, "presentation_holdout_pmids": list(holdout_pmids), "evaluation_row_counts": evaluation_row_counts, "evaluation_hit_counts": hit_counts, "holdout_files": holdout_files, "affinity_pmhc_count": len(affinity_frame), "affinity_sample_count": len(affinity_samples_frame), "processing_sample_count": len(processing_frame), "presentation_sample_count": len(presentation_frame), } with open(out_dir / POLICY_FILE, "w") as fd: json.dump(policy, fd, indent=2, sort_keys=True) fd.write("\n") return policy def load_excluded_samples(path): """Load a generated one-column sample exclusion manifest.""" frame = pandas.read_csv(path) if list(frame.columns) != ["sample_id"]: raise ValueError( f"Expected one sample_id column in {path}; " f"got {list(frame.columns)}") return set(frame.sample_id.astype(str)) def exclude_samples(frame, manifest, label): """Remove rows belonging to samples in ``manifest`` and report counts.""" excluded = load_excluded_samples(manifest) sample_ids = frame.sample_id.astype(str) mask = sample_ids.isin(excluded) print( f"Release holdout excluded {mask.sum()} rows across " f"{sample_ids.loc[mask].nunique()} {label} samples") return frame.loc[~mask].copy() def exclude_affinity_pmhcs(frame, manifest): """Remove affinity rows whose canonical pMHC is in ``manifest``.""" exclusions = pandas.read_csv(manifest) required = ["allele", "peptide"] if list(exclusions.columns) != required: raise ValueError( f"Expected columns {required} in {manifest}; " f"got {list(exclusions.columns)}") exclusion_index = pandas.MultiIndex.from_frame(exclusions[required]) canonical = frame[required].copy() allele_map = canonical_allele_mapping(canonical.allele) canonical["allele"] = canonical.allele.astype(str).map(allele_map) row_index = pandas.MultiIndex.from_frame(canonical) mask = row_index.isin(exclusion_index) print( f"Release holdout excluded {mask.sum()} affinity rows across " f"{row_index[mask].nunique()} unique pMHCs") return frame.loc[~mask].copy() def validate_holdout_manifests(holdout_dir): """Validate the exclusion manifests against the frozen policy record.""" holdout_dir = Path(holdout_dir).resolve() policy_path = holdout_dir / POLICY_FILE with open(policy_path) as fd: policy = json.load(fd) if policy.get("schema_version") != 1: raise ValueError( f"Unsupported release holdout policy schema: {policy_path}") expected_files = { AFFINITY_PMHCS_FILE, AFFINITY_SAMPLES_FILE, PROCESSING_SAMPLES_FILE, PRESENTATION_SAMPLES_FILE, } holdout_files = policy.get("holdout_files", {}) if set(holdout_files) != expected_files: raise ValueError( f"Release holdout policy has unexpected manifests: " f"{sorted(holdout_files)}") for filename, expected in holdout_files.items(): path = holdout_dir / filename actual_sha256 = _sha256(path) if actual_sha256 != expected.get("sha256"): raise ValueError( f"Release holdout manifest checksum mismatch: {path}") actual_rows = len(pandas.read_csv(path)) if actual_rows != expected.get("rows"): raise ValueError( f"Release holdout manifest row count mismatch: {path}") return policy def validate_release_holdout( holdout_dir, affinity_training_data, processing_training_data, presentation_training_data, out=None): """Fail if any frozen evaluation identity remains in release training.""" holdout_dir = Path(holdout_dir).resolve() policy = validate_holdout_manifests(holdout_dir) affinity = pandas.read_csv( affinity_training_data, usecols=["allele", "peptide"]) affinity_map = canonical_allele_mapping(affinity.allele) affinity["allele"] = affinity.allele.astype(str).map(affinity_map) affinity = affinity.loc[affinity.allele.notna()] affinity_exclusions = pandas.read_csv( holdout_dir / AFFINITY_PMHCS_FILE) affinity_overlap = pandas.MultiIndex.from_frame( affinity[["allele", "peptide"]]).isin( pandas.MultiIndex.from_frame(affinity_exclusions)).sum() def count_sample_overlaps(training_data, manifest): excluded = load_excluded_samples(holdout_dir / manifest) overlap_rows = 0 for chunk in pandas.read_csv( training_data, usecols=["sample_id"], dtype={"sample_id": str}, chunksize=500_000): overlap_rows += chunk.sample_id.isin(excluded).sum() return int(overlap_rows) processing_overlap = count_sample_overlaps( processing_training_data, PROCESSING_SAMPLES_FILE) presentation_overlap = count_sample_overlaps( presentation_training_data, PRESENTATION_SAMPLES_FILE) result = { "schema_version": 1, "policy_sha256": _sha256(holdout_dir / POLICY_FILE), "holdout_files": policy["holdout_files"], "affinity_overlap_rows": int(affinity_overlap), "processing_overlap_rows": int(processing_overlap), "presentation_overlap_rows": int(presentation_overlap), } if out: with open(out, "w") as fd: json.dump(result, fd, indent=2, sort_keys=True) fd.write("\n") nonzero = {key: value for key, value in result.items() if key.endswith("_overlap_rows") and value} if nonzero: raise ValueError(f"Release holdout validation failed: {nonzero}") return result def make_parser(prog="mhcflurry train release-holdout"): parser = argparse.ArgumentParser(prog=prog, description=__doc__) subparsers = parser.add_subparsers(dest="command", required=True) build = subparsers.add_parser("build") build.add_argument("--data-dir", required=True) build.add_argument("--training-data", required=True) build.add_argument("--mass-spec-data", required=True) build.add_argument("--out-dir", required=True) build.add_argument( "--presentation-holdout-pmids", nargs="+", default=list(PRESENTATION_HOLDOUT_PMIDS), ) build.add_argument("--chunksize", type=int, default=500_000) validate = subparsers.add_parser("validate") validate.add_argument("--holdout-dir", required=True) validate.add_argument("--affinity-training-data", required=True) validate.add_argument("--processing-training-data", required=True) validate.add_argument("--presentation-training-data", required=True) validate.add_argument("--out") return parser def run_argv(argv=None, prog="mhcflurry train release-holdout"): args = make_parser(prog=prog).parse_args(argv) if args.command == "build": build_release_holdout( data_dir=args.data_dir, training_data=args.training_data, mass_spec_data=args.mass_spec_data, out_dir=args.out_dir, presentation_holdout_pmids=args.presentation_holdout_pmids, chunksize=args.chunksize, ) else: validate_release_holdout( holdout_dir=args.holdout_dir, affinity_training_data=args.affinity_training_data, processing_training_data=args.processing_training_data, presentation_training_data=args.presentation_training_data, out=args.out, ) return 0 if __name__ == "__main__": run_argv() mhcflurry-2.3.6/mhcflurry/scoring.py000066400000000000000000000036371525677230600176140ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Measures of prediction accuracy """ import logging import sklearn.metrics import numpy import scipy from .regression_target import from_ic50 def make_scores( ic50_y, ic50_y_pred, sample_weight=None, threshold_nm=500, max_ic50=50000): """ Calculate AUC, F1, and Kendall Tau scores. Parameters ---------- ic50_y : float list true IC50s (i.e. affinities) ic50_y_pred : float list predicted IC50s sample_weight : float list [optional] threshold_nm : float [optional] max_ic50 : float [optional] Returns ------- dict with entries "auc", "f1", "tau" """ y_pred = from_ic50(ic50_y_pred, max_ic50) try: auc = sklearn.metrics.roc_auc_score( ic50_y <= threshold_nm, y_pred, sample_weight=sample_weight) except ValueError as e: logging.warning(e) auc = numpy.nan try: f1 = sklearn.metrics.f1_score( ic50_y <= threshold_nm, ic50_y_pred <= threshold_nm, sample_weight=sample_weight) except ValueError as e: logging.warning(e) f1 = numpy.nan try: tau = scipy.stats.kendalltau(ic50_y_pred, ic50_y)[0] except ValueError as e: logging.warning(e) tau = numpy.nan return dict( auc=auc, f1=f1, tau=tau) mhcflurry-2.3.6/mhcflurry/scoring_pipeline.py000066400000000000000000000064451525677230600215010ustar00rootroot00000000000000"""Bounded CPU preparation/persistence around one accelerator scoring owner.""" from concurrent.futures import FIRST_COMPLETED, ThreadPoolExecutor, wait def _advance(workflow, value=None): try: return False, workflow.send(value) except StopIteration as finished: return True, finished.value def scoring_pipeline(workflows, score, max_in_flight=3, cpu_workers=2): """Run resumable CPU workflows around serial caller-owned scoring. Parameters ---------- workflows : iterable of (key, generator) Each generator prepares a request, yields it to scoring, receives the returned scores, then persists/matches them. It may request additional scoring rounds, or return its completed result without requesting scores. Generators must own their mutable state and use independent RNGs. score : callable ``score(key, request)`` runs only on the caller's thread. The accelerator and predictor need not be thread-safe. max_in_flight : int Maximum active sample workflows, including queued work and scored writes. cpu_workers : int Maximum concurrently running CPU continuations. Yields ------ (key, result) Completed samples in completion order. Callers restore scientific row order using keys, not completion order. Notes ----- Backpressure bounds executor submission, not just worker count. On error or iterator close, queued work is cancelled and already running CPU stages are joined before generators close. Successful atomic writes remain resumable. """ if max_in_flight < 1 or cpu_workers < 1: raise ValueError("Pipeline capacities must be positive") source = iter(workflows) pending = {} active = {} seen = set() exhausted = False executor = ThreadPoolExecutor(max_workers=cpu_workers, thread_name_prefix="processing-cpu") def fill(): nonlocal exhausted while not exhausted and len(active) < max_in_flight: try: key, workflow = next(source) except StopIteration: exhausted = True break if key in seen: workflow.close() raise ValueError("Duplicate scoring workflow key: %r" % (key,)) seen.add(key) active[key] = workflow pending[executor.submit(_advance, workflow)] = key try: fill() while pending: completed, _ = wait(pending, return_when=FIRST_COMPLETED) for future in [f for f in pending if f in completed]: key = pending.pop(future) done, value = future.result() if done: del active[key] # Hand off the finished result before refilling: a failure # pulling the next workflow must not discard a computed one. yield key, value fill() else: prediction = score(key, value) pending[executor.submit(_advance, active[key], prediction)] = key finally: for future in pending: future.cancel() executor.shutdown(wait=True, cancel_futures=True) for workflow in active.values(): workflow.close() mhcflurry-2.3.6/mhcflurry/select_allele_specific_models_command.py000066400000000000000000000014741525677230600256500ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Compatibility wrapper for :mod:`mhcflurry.cli.select_allele_specific_models_command`.""" from .cli import select_allele_specific_models_command as _impl run = _impl.run parser = _impl.parser def __getattr__(name): return getattr(_impl, name) __all__ = ["run", "parser"] mhcflurry-2.3.6/mhcflurry/select_pan_allele_models_command.py000066400000000000000000000014621525677230600246360ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Compatibility wrapper for :mod:`mhcflurry.cli.select_pan_allele_models_command`.""" from .cli import select_pan_allele_models_command as _impl run = _impl.run parser = _impl.parser def __getattr__(name): return getattr(_impl, name) __all__ = ["run", "parser"] mhcflurry-2.3.6/mhcflurry/select_processing_models_command.py000066400000000000000000000014621525677230600247160ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Compatibility wrapper for :mod:`mhcflurry.cli.select_processing_models_command`.""" from .cli import select_processing_models_command as _impl run = _impl.run parser = _impl.parser def __getattr__(name): return getattr(_impl, name) __all__ = ["run", "parser"] mhcflurry-2.3.6/mhcflurry/testing_utils.py000066400000000000000000000016261525677230600210410ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Utilities used in MHCflurry unit tests. """ from . import Class1NeuralNetwork from .common import configure_pytorch def startup(): """ Configure PyTorch for running unit tests. """ configure_pytorch(num_threads=2) def cleanup(): """ Clear PyTorch session and other process-wide resources. """ Class1NeuralNetwork.clear_model_cache() mhcflurry-2.3.6/mhcflurry/train_allele_specific_models_command.py000066400000000000000000000014721525677230600255040ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Compatibility wrapper for :mod:`mhcflurry.cli.train_allele_specific_models_command`.""" from .cli import train_allele_specific_models_command as _impl run = _impl.run parser = _impl.parser def __getattr__(name): return getattr(_impl, name) __all__ = ["run", "parser"] mhcflurry-2.3.6/mhcflurry/train_pan_allele_models_command.py000066400000000000000000000014601525677230600244720ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Compatibility wrapper for :mod:`mhcflurry.cli.train_pan_allele_models_command`.""" from .cli import train_pan_allele_models_command as _impl run = _impl.run parser = _impl.parser def __getattr__(name): return getattr(_impl, name) __all__ = ["run", "parser"] mhcflurry-2.3.6/mhcflurry/train_presentation_models_command.py000066400000000000000000000014641525677230600251150ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Compatibility wrapper for :mod:`mhcflurry.cli.train_presentation_models_command`.""" from .cli import train_presentation_models_command as _impl run = _impl.run parser = _impl.parser def __getattr__(name): return getattr(_impl, name) __all__ = ["run", "parser"] mhcflurry-2.3.6/mhcflurry/train_processing_models_command.py000066400000000000000000000014601525677230600245520ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Compatibility wrapper for :mod:`mhcflurry.cli.train_processing_models_command`.""" from .cli import train_processing_models_command as _impl run = _impl.run parser = _impl.parser def __getattr__(name): return getattr(_impl, name) __all__ = ["run", "parser"] mhcflurry-2.3.6/mhcflurry/training_benchmark.py000066400000000000000000000445741525677230600220020ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Training benchmark / profiling harness for pan-allele runs.""" from __future__ import annotations import argparse import json import os import re import shlex import subprocess import sys from pathlib import Path import numpy import pandas TIMING_MARKER_RE = re.compile(r"TIMING_MARKER\s+(\S+)\s+([0-9]+(?:\.[0-9]+)?)") PROCESS_TELEMETRY_RE = re.compile( r"PROCESS_TELEMETRY pid=(\d+) marker=(\S+) rss_mb=([^\s]+) num_fds=([^\s]+)" ) GPU_TELEMETRY_RE = re.compile( r"GPU_MEMORY_TELEMETRY pid=(\d+) task=(\S+) marker=(\S+) " r"allocated_gb=([0-9.]+) reserved_gb=([0-9.]+) max_allocated_gb=([0-9.]+)" ) def _scalar(value, default=0.0): if value is None: return default if isinstance(value, (list, tuple)): if not value: return default return float(value[0]) if isinstance(value, (int, float, numpy.integer, numpy.floating)): return float(value) return default def _series(info, key): value = info.get(key, []) if value is None: return [] if isinstance(value, list): return [float(v) for v in value] if isinstance(value, tuple): return [float(v) for v in value] if isinstance(value, (int, float, numpy.integer, numpy.floating)): return [float(value)] return [] def _sum_series(info, key): return float(sum(_series(info, key))) def _safe_div(numerator, denominator): if not denominator: return None return numerator / denominator def _flatten_fit_records(models_dir: str | os.PathLike[str]): manifest_path = Path(models_dir) / "manifest.csv" manifest_df = pandas.read_csv(manifest_path) records = [] for _, row in manifest_df.iterrows(): config = json.loads(row["config_json"]) fit_infos = config.get("fit_info", []) or [] for fit_index, info in enumerate(fit_infos): training_info = info.get("training_info", {}) or {} records.append( { "model_name": row["model_name"], "fit_index": fit_index, "phase": training_info.get("phase", "unknown"), "info": info, "training_info": training_info, } ) return records def _summarize_fit_records(records): if not records: return { "num_fits": 0, "total_time_s": 0.0, } total_time = sum(_scalar(record["info"].get("time")) for record in records) total_epochs = sum(len(record["info"].get("loss", [])) for record in records) total_train_time = sum(_sum_series(record["info"], "epoch_train_time") for record in records) total_fetch_time = sum(_sum_series(record["info"], "epoch_fetch_time") for record in records) total_h2d_time = sum(_sum_series(record["info"], "epoch_h2d_time") for record in records) total_loss_sync_time = sum( _sum_series(record["info"], "epoch_loss_sync_time") for record in records ) total_input_build_time = sum( _sum_series(record["info"], "epoch_input_build_time") for record in records ) total_initialization_time = sum( _sum_series(record["info"], "epoch_initialization_time") for record in records ) total_shuffle_time = sum( _sum_series(record["info"], "epoch_shuffle_dataset_time") for record in records ) total_dataloader_setup_time = sum( _sum_series(record["info"], "epoch_dataloader_setup_time") for record in records ) total_validation_materialize_time = sum( _sum_series(record["info"], "epoch_validation_materialize_time") for record in records ) total_validation_compute_time = sum( _sum_series(record["info"], "epoch_validation_time") for record in records ) total_callback_time = sum( _sum_series(record["info"], "epoch_callback_time") for record in records ) total_gc_time = sum(_sum_series(record["info"], "epoch_gc_time") for record in records) total_epoch_time = sum(_sum_series(record["info"], "epoch_total_time") for record in records) total_train_batches = int( sum(sum(record["info"].get("epoch_num_train_batches", [])) for record in records) ) total_train_rows = int( sum(sum(record["info"].get("epoch_num_train_rows", [])) for record in records) ) total_tail_rows = int( sum(sum(record["info"].get("epoch_tail_train_rows", [])) for record in records) ) total_validation_batches = int( sum(sum(record["info"].get("epoch_num_validation_batches", [])) for record in records) ) compile_overhead_estimates = [] first_batch_times = [] for record in records: info = record["info"] first_batch_time = info.get("first_batch_time") epoch_train_times = _series(info, "epoch_train_time") epoch_train_batches = info.get("epoch_num_train_batches", []) if first_batch_time is None: continue first_batch_times.append(float(first_batch_time)) total_batches = int(sum(epoch_train_batches)) if epoch_train_batches else 0 if total_batches <= 1 or not epoch_train_times: continue steady_batch_time = _safe_div(sum(epoch_train_times) - float(first_batch_time), total_batches - 1) if steady_batch_time is None: continue compile_overhead_estimates.append(max(0.0, float(first_batch_time) - steady_batch_time)) validation_rows_total = 0 effective_validation_batch_sizes = [] validation_cache_reused_count = 0 dataloader_num_workers = [] iterator_setup_time = 0.0 for record in records: info = record["info"] epochs = len(info.get("loss", [])) validation_rows = int(_scalar(info.get("validation_rows"), default=0)) validation_rows_total += validation_rows * epochs batch_size = info.get("effective_validation_batch_size") if batch_size is not None: effective_validation_batch_sizes.append(int(batch_size)) if info.get("validation_cache_reused"): validation_cache_reused_count += 1 dataloader_num_workers.append(int(_scalar(info.get("dataloader_num_workers"), default=0))) iterator_setup_time += _scalar(info.get("iterator_setup_time"), default=0.0) validation_total_time = total_validation_materialize_time + total_validation_compute_time return { "num_fits": len(records), "total_time_s": total_time, "total_epochs": total_epochs, "total_epoch_timing_s": total_epoch_time, "train_time_s": total_train_time, "fetch_time_s": total_fetch_time, "h2d_time_s": total_h2d_time, "loss_sync_time_s": total_loss_sync_time, "input_build_time_s": total_input_build_time, "initialization_time_s": total_initialization_time, "shuffle_time_s": total_shuffle_time, "dataloader_setup_time_s": total_dataloader_setup_time, "iterator_setup_time_s": iterator_setup_time, "validation_materialize_time_s": total_validation_materialize_time, "validation_compute_time_s": total_validation_compute_time, "validation_total_time_s": validation_total_time, "callback_time_s": total_callback_time, "gc_time_s": total_gc_time, "train_time_fraction_of_epoch_timing": _safe_div(total_train_time, total_epoch_time), "validation_time_fraction_of_epoch_timing": _safe_div(validation_total_time, total_epoch_time), "fetch_time_fraction_of_epoch_timing": _safe_div(total_fetch_time, total_epoch_time), "input_build_fraction_of_epoch_timing": _safe_div(total_input_build_time, total_epoch_time), "h2d_time_fraction_of_epoch_timing": _safe_div(total_h2d_time, total_epoch_time), "loss_sync_time_fraction_of_epoch_timing": _safe_div( total_loss_sync_time, total_epoch_time ), "total_train_batches": total_train_batches, "total_train_rows": total_train_rows, "total_tail_train_rows": total_tail_rows, "total_validation_batches": total_validation_batches, "validation_rows_seen": validation_rows_total, "train_rows_per_second": _safe_div(total_train_rows, total_train_time), "validation_rows_per_second": _safe_div(validation_rows_total, validation_total_time), "steady_state_train_batch_time_s": _safe_div( total_train_time - sum(first_batch_times), total_train_batches - len(first_batch_times), ) if total_train_batches > len(first_batch_times) else None, "first_batch_time_s_median": float(numpy.median(first_batch_times)) if first_batch_times else None, "first_batch_time_s_max": max(first_batch_times) if first_batch_times else None, "compile_warmup_overhead_s_sum": float(sum(compile_overhead_estimates)), "compile_warmup_overhead_s_median": float(numpy.median(compile_overhead_estimates)) if compile_overhead_estimates else None, "compile_warmup_overhead_s_max": max(compile_overhead_estimates) if compile_overhead_estimates else None, "effective_validation_batch_sizes": sorted(set(effective_validation_batch_sizes)), "validation_cache_reused_fit_count": validation_cache_reused_count, "dataloader_num_workers": sorted(set(dataloader_num_workers)), } def _parse_log_file(log_path: str | os.PathLike[str] | None): if log_path is None: return { "path": None, "timing_markers": {}, "process_telemetry": [], "gpu_telemetry": [], } path = Path(log_path) markers = {} process_telemetry = [] gpu_telemetry = [] with path.open() as fd: for line in fd: match = TIMING_MARKER_RE.search(line) if match: markers[match.group(1)] = float(match.group(2)) match = PROCESS_TELEMETRY_RE.search(line) if match: rss_value = None if match.group(3) == "na" else float(match.group(3)) fd_value = None if match.group(4) == "na" else int(match.group(4)) process_telemetry.append( { "pid": int(match.group(1)), "marker": match.group(2), "rss_mb": rss_value, "num_fds": fd_value, } ) match = GPU_TELEMETRY_RE.search(line) if match: gpu_telemetry.append( { "pid": int(match.group(1)), "task": match.group(2), "marker": match.group(3), "allocated_gb": float(match.group(4)), "reserved_gb": float(match.group(5)), "max_allocated_gb": float(match.group(6)), } ) return { "path": str(path), "timing_markers": markers, "process_telemetry": process_telemetry, "gpu_telemetry": gpu_telemetry, } def _summarize_telemetry(parsed_log): process_entries = parsed_log["process_telemetry"] gpu_entries = parsed_log["gpu_telemetry"] process_by_pid = {} for entry in process_entries: pid_entries = process_by_pid.setdefault(entry["pid"], {}) pid_entries[entry["marker"]] = entry rss_growth = [] fd_growth = [] for pid, markers in process_by_pid.items(): start_entry = markers.get("START") end_entry = markers.get("END") if start_entry and end_entry: if start_entry["rss_mb"] is not None and end_entry["rss_mb"] is not None: rss_growth.append( { "pid": pid, "rss_mb_delta": end_entry["rss_mb"] - start_entry["rss_mb"], } ) if start_entry["num_fds"] is not None and end_entry["num_fds"] is not None: fd_growth.append( { "pid": pid, "fd_delta": end_entry["num_fds"] - start_entry["num_fds"], } ) max_gpu_reserved = max((entry["reserved_gb"] for entry in gpu_entries), default=None) max_gpu_allocated = max((entry["allocated_gb"] for entry in gpu_entries), default=None) max_gpu_highwater = max((entry["max_allocated_gb"] for entry in gpu_entries), default=None) max_rss = max( (entry["rss_mb"] for entry in process_entries if entry["rss_mb"] is not None), default=None, ) max_fds = max( (entry["num_fds"] for entry in process_entries if entry["num_fds"] is not None), default=None, ) return { "num_process_samples": len(process_entries), "num_gpu_samples": len(gpu_entries), "max_rss_mb": max_rss, "max_num_fds": max_fds, "max_gpu_reserved_gb": max_gpu_reserved, "max_gpu_allocated_gb": max_gpu_allocated, "max_gpu_highwater_gb": max_gpu_highwater, "rss_growth_by_pid": rss_growth, "fd_growth_by_pid": fd_growth, } def _derive_top_level_wall_times(train_log, selection_log): train_markers = train_log["timing_markers"] selection_markers = selection_log["timing_markers"] return { "data_load_s": _safe_div( train_markers.get("data_loaded", 0.0) - train_markers.get("start", 0.0), 1.0, ) if "start" in train_markers and "data_loaded" in train_markers else None, "setup_s": _safe_div( train_markers.get("setup_done", 0.0) - train_markers.get("data_loaded", 0.0), 1.0, ) if "data_loaded" in train_markers and "setup_done" in train_markers else None, "training_s": _safe_div( train_markers.get("training_done", 0.0) - train_markers.get("setup_done", 0.0), 1.0, ) if "setup_done" in train_markers and "training_done" in train_markers else None, "selection_s": _safe_div( selection_markers.get("selection_done", 0.0) - selection_markers.get("selection_start", 0.0), 1.0, ) if "selection_start" in selection_markers and "selection_done" in selection_markers else None, } def analyze_training_run( models_dir: str | os.PathLike[str], *, train_log: str | os.PathLike[str] | None = None, selection_log: str | os.PathLike[str] | None = None, ): records = _flatten_fit_records(models_dir) phase_to_records = {} for record in records: phase_to_records.setdefault(record["phase"], []).append(record) parsed_train_log = _parse_log_file(train_log) parsed_selection_log = _parse_log_file(selection_log) summary = { "models_dir": str(models_dir), "num_models": len({record["model_name"] for record in records}), "num_fit_records": len(records), "top_level_wall_times_s": _derive_top_level_wall_times( parsed_train_log, parsed_selection_log ), "train_log": parsed_train_log, "selection_log": parsed_selection_log, "telemetry": { "train": _summarize_telemetry(parsed_train_log), "selection": _summarize_telemetry(parsed_selection_log), }, "phase_summaries": { phase: _summarize_fit_records(phase_records) for phase, phase_records in sorted(phase_to_records.items()) }, "all_fit_summary": _summarize_fit_records(records), } return summary def _write_json(result, out_json): payload = json.dumps(result, indent=2, sort_keys=True) if out_json: Path(out_json).write_text(payload + "\n") print(payload) def _run_command(command, *, log_path, cwd): args = shlex.split(command) env = os.environ.copy() env.setdefault("MHCFLURRY_ENABLE_TIMING", "1") with Path(log_path).open("w") as fd: subprocess.run( args, cwd=cwd, env=env, stdout=fd, stderr=subprocess.STDOUT, check=True, ) def build_arg_parser(): parser = argparse.ArgumentParser(description=__doc__) subparsers = parser.add_subparsers(dest="command", required=True) analyze_parser = subparsers.add_parser( "analyze", help="Analyze an existing training/models directory and timing logs.", ) analyze_parser.add_argument("--models-dir", required=True) analyze_parser.add_argument("--train-log") analyze_parser.add_argument("--selection-log") analyze_parser.add_argument("--out-json") run_parser = subparsers.add_parser( "run", help="Run profiled train/select commands and emit a JSON summary.", ) run_parser.add_argument("--models-dir", required=True) run_parser.add_argument("--train-command", required=True) run_parser.add_argument("--selection-command") run_parser.add_argument("--cwd", default=".") run_parser.add_argument("--log-dir") run_parser.add_argument("--out-json") return parser def main(argv=None): parser = build_arg_parser() args = parser.parse_args(argv) if args.command == "analyze": result = analyze_training_run( args.models_dir, train_log=args.train_log, selection_log=args.selection_log, ) _write_json(result, args.out_json) return 0 log_dir = Path(args.log_dir or (Path(args.models_dir) / "benchmark_profile_logs")) log_dir.mkdir(parents=True, exist_ok=True) train_log = log_dir / "train.log" selection_log = log_dir / "select.log" _run_command(args.train_command, log_path=train_log, cwd=args.cwd) if args.selection_command: _run_command(args.selection_command, log_path=selection_log, cwd=args.cwd) selection_log_path = str(selection_log) else: selection_log_path = None result = analyze_training_run( args.models_dir, train_log=str(train_log), selection_log=selection_log_path, ) _write_json(result, args.out_json) return 0 if __name__ == "__main__": raise SystemExit(main(sys.argv[1:])) mhcflurry-2.3.6/mhcflurry/training_folds.py000066400000000000000000000033171525677230600211450ustar00rootroot00000000000000"""Preserve explicit training folds when replaying archived model inputs.""" import pandas def read_processing_training_data(path): """Read frozen processing data without numeric drift across CSV rewrites. The round-trip parser preserves the binary float represented by the saved decimal, including matching-reference scores that are not model inputs. Sample identifiers stay strings, including purely numeric identifiers. """ return pandas.read_csv( path, float_precision="round_trip", dtype={ "sample_id": str, "matching_affinity_reference_sha256": str}) def extract_training_folds(data, num_folds, reuse=False): """Return data without fold columns and optionally validated stored folds.""" # Remove malformed legacy merge suffixes as well when regenerating folds; # fail closed on them when the user requests exact reuse. existing = [name for name in data if name.startswith("fold_")] cleaned = data.drop(columns=existing) if not reuse: return cleaned, None expected = ["fold_%d" % fold for fold in range(num_folds)] if set(existing) != set(expected): raise ValueError("--reuse-folds requires exactly these columns: %s" % expected) folds = pandas.DataFrame(index=data.index) for name in expected: parsed = data[name].astype(str).str.lower().map({ "true": True, "false": False, "1": True, "0": False}) if parsed.isna().any(): raise ValueError("Invalid or missing boolean values in %s" % name) if not parsed.any() or parsed.all(): raise ValueError("%s must contain both training and validation rows" % name) folds[name] = parsed.astype(bool) return cleaned, folds mhcflurry-2.3.6/mhcflurry/version.py000066400000000000000000000010671525677230600176300ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. __version__ = "2.3.6" mhcflurry-2.3.6/mhcflurry/workload_planning.py000066400000000000000000001150311525677230600216500ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Central workload planning for local GPU/CPU orchestration.""" from __future__ import annotations import os import math import re import subprocess import zipfile from dataclasses import dataclass from typing import Optional, Tuple from .memory_budget import ( GIB, HOST_MIN_RESERVE_BYTES, usable_memory_bytes, ) HOST_RAM_PER_DATALOADER_CHILD_GB = 0.5 DEVICE_RUNTIME_BASE_GB = 1.5 MODEL_TENSOR_SAFETY_FACTOR = 1.2 def env_float(name, default, bounds=None): """Read ``name`` from the environment as float, falling back to ``default``. ``bounds`` is an optional ``(low, high)`` tuple; either side may be ``None``. Both endpoints are inclusive. Bad values are reported with the offending variable name so users don't get a bare ``ValueError``. """ raw = os.environ.get(name) if raw in (None, ""): value = float(default) else: try: value = float(raw) except ValueError as exc: raise ValueError( "Environment variable %s=%r is not a valid float: %s" % (name, raw, exc) ) from None if not math.isfinite(value): raise ValueError( "Environment variable %s=%r must be finite" % (name, raw if raw not in (None, "") else value) ) if bounds is not None: low, high = bounds if (low is not None and value < low) or ( high is not None and value > high): raise ValueError( "Environment variable %s=%r is outside allowed range %s" % (name, raw if raw not in (None, "") else value, bounds) ) return value def env_int(name, default, bounds=None): """Read ``name`` from the environment as int, falling back to ``default``. Bad values surface with the offending variable name. ``bounds`` works the same as :func:`env_float`. """ raw = os.environ.get(name) if raw in (None, ""): value = int(default) else: try: value = int(raw) except ValueError as exc: raise ValueError( "Environment variable %s=%r is not a valid int: %s" % (name, raw, exc) ) from None if bounds is not None: low, high = bounds if (low is not None and value < low) or ( high is not None and value > high): raise ValueError( "Environment variable %s=%r is outside allowed range %s" % (name, raw if raw not in (None, "") else value, bounds) ) return value WORKLOAD_GENERIC = "generic" WORKLOAD_AFFINITY_TRAINING = "affinity_training" WORKLOAD_AFFINITY_INFERENCE = "affinity_inference" WORKLOAD_AFFINITY_SELECTION = "affinity_selection" WORKLOAD_AFFINITY_CALIBRATION = "affinity_calibration" WORKLOAD_PROCESSING_DATA = "processing_data" WORKLOAD_PROCESSING_TRAINING = "processing_training" WORKLOAD_PROCESSING_INFERENCE = "processing_inference" WORKLOAD_PROCESSING_SELECTION = "processing_selection" WORKLOAD_PRESENTATION_TRAINING = "presentation_training" WORKLOAD_PRESENTATION_CALIBRATION = "presentation_calibration" WORKLOAD_PRESENTATION_INFERENCE = "presentation_inference" @dataclass(frozen=True) class WorkloadProfile: """Policy defaults for one workload family.""" name: str device_worker_gb: Optional[float] data_pressure_start_gb: float = 0.0 data_pressure_factor: float = 0.0 data_pressure_cap_gb: float = 0.0 host_worker_gb: float = 2.0 host_data_multiplier: float = 0.0 host_data_cap_gb: float = 32.0 description: str = "" @dataclass(frozen=True) class LocalParallelismPlan: """Resolved local orchestration plan. This is the single object readers need to understand: it records the workload, hardware facts, CLI overrides, planner estimates, and final values that get written back onto argparse ``args``. """ workload_name: str backend: str gpus: int gpus_was_auto: bool max_workers_per_gpu: int max_workers_per_gpu_was_auto: bool num_jobs: int num_jobs_was_auto: bool dataloader_num_workers: int dataloader_num_workers_was_auto: bool random_negative_pool_epochs: Optional[int] random_negative_pool_epochs_was_auto: bool torch_compile: str torch_compile_loss: str matmul_precision: str enable_timing: bool capacity: int device_worker_gb: Optional[float] data_pressure_gb: float host_worker_gb: float host_memory_total_gb: Optional[float] host_memory_available_gb: Optional[float] host_memory_source: str host_memory_num_jobs_cap: Optional[int] cli_overrides: Tuple[str, ...] = () warnings: Tuple[str, ...] = () hints: Tuple[Tuple[str, object], ...] = () warmup_device_peak_gb: Optional[float] = None warmup_host_peak_gb: Optional[float] = None cpu_threads_per_worker: Optional[int] = None cpu_threads_per_worker_was_auto: bool = True # Append new fields to preserve positional compatibility for callers that # construct this public diagnostic dataclass directly. device_memory_available_gb: Optional[float] = None device_memory_budget_gb: Optional[float] = None def __str__(self): device_worker = ( "%.1f" % self.device_worker_gb if self.device_worker_gb is not None else "default" ) host_available = ( "%.1f GB" % self.host_memory_available_gb if self.host_memory_available_gb is not None else "unknown" ) device_budget = ( "%.1f GB" % self.device_memory_budget_gb if self.device_memory_budget_gb is not None else "unknown" ) return ( "LocalParallelismPlan(" "workload=%s, backend=%s, jobs=%d, gpus=%d, workers/gpu=%d, " "dataloader_workers=%d, device_worker_gb=%s, device_budget=%s, " "host_worker_gb=%.1f, host_available=%s from %s, " "warmup_device_peak_gb=%s, warmup_host_peak_gb=%s, " "cpu_threads_per_worker=%s [%s])" % ( self.workload_name, self.backend, self.num_jobs, self.gpus, self.max_workers_per_gpu, self.dataloader_num_workers, device_worker, device_budget, self.host_worker_gb, host_available, self.host_memory_source, ( "%.1f" % self.warmup_device_peak_gb if self.warmup_device_peak_gb is not None else "none" ), ( "%.1f" % self.warmup_host_peak_gb if self.warmup_host_peak_gb is not None else "none" ), ( str(self.cpu_threads_per_worker) if self.cpu_threads_per_worker is not None else "none" ), ( "auto" if self.cpu_threads_per_worker_was_auto else "environment" ), ) ) WORKLOAD_PROFILES = { WORKLOAD_GENERIC: WorkloadProfile( name=WORKLOAD_GENERIC, device_worker_gb=None, host_worker_gb=2.0, description="Fallback plan; preserves global auto_max_workers defaults.", ), WORKLOAD_AFFINITY_TRAINING: WorkloadProfile( name=WORKLOAD_AFFINITY_TRAINING, device_worker_gb=None, data_pressure_start_gb=4.0, data_pressure_factor=0.02, data_pressure_cap_gb=2.0, host_worker_gb=3.0, host_data_multiplier=0.05, description="Pan-allele affinity training and fine-tuning.", ), WORKLOAD_AFFINITY_INFERENCE: WorkloadProfile( name=WORKLOAD_AFFINITY_INFERENCE, device_worker_gb=4.0, data_pressure_start_gb=2.0, data_pressure_factor=0.02, data_pressure_cap_gb=2.0, host_worker_gb=3.0, host_data_multiplier=0.02, description="Affinity predictor inference.", ), WORKLOAD_AFFINITY_SELECTION: WorkloadProfile( name=WORKLOAD_AFFINITY_SELECTION, device_worker_gb=None, host_worker_gb=3.0, host_data_multiplier=0.02, description="Affinity model selection / held-out scoring.", ), WORKLOAD_AFFINITY_CALIBRATION: WorkloadProfile( name=WORKLOAD_AFFINITY_CALIBRATION, device_worker_gb=24.0, host_worker_gb=4.0, description="Affinity percentile-rank calibration.", ), WORKLOAD_PROCESSING_DATA: WorkloadProfile( name=WORKLOAD_PROCESSING_DATA, device_worker_gb=8.0, data_pressure_start_gb=2.0, data_pressure_factor=0.05, data_pressure_cap_gb=4.0, host_worker_gb=4.0, host_data_multiplier=0.10, description="Processing training-data generation.", ), WORKLOAD_PROCESSING_TRAINING: WorkloadProfile( name=WORKLOAD_PROCESSING_TRAINING, device_worker_gb=8.0, data_pressure_start_gb=2.0, data_pressure_factor=0.10, data_pressure_cap_gb=8.0, host_worker_gb=4.0, host_data_multiplier=0.15, description="Processing Conv1d training.", ), WORKLOAD_PROCESSING_INFERENCE: WorkloadProfile( name=WORKLOAD_PROCESSING_INFERENCE, # Four 8 GB workers fit arithmetically on an A100-40GB after the # shared reserve, but the release processing ensemble can cross that # envelope when four convolution workspaces peak concurrently. The # 10 GB resident-workload floor was established from the release # holdout failure at the 5-aa condition after ten prior comparisons. device_worker_gb=10.0, data_pressure_start_gb=2.0, data_pressure_factor=0.03, data_pressure_cap_gb=4.0, host_worker_gb=4.0, host_data_multiplier=0.03, description="Processing predictor inference with convolution peaks.", ), WORKLOAD_PROCESSING_SELECTION: WorkloadProfile( name=WORKLOAD_PROCESSING_SELECTION, device_worker_gb=8.0, data_pressure_start_gb=2.0, data_pressure_factor=0.05, data_pressure_cap_gb=4.0, host_worker_gb=4.0, host_data_multiplier=0.05, description="Processing model selection / AUC scoring.", ), WORKLOAD_PRESENTATION_TRAINING: WorkloadProfile( name=WORKLOAD_PRESENTATION_TRAINING, device_worker_gb=16.0, data_pressure_start_gb=2.0, data_pressure_factor=0.05, data_pressure_cap_gb=6.0, host_worker_gb=6.0, host_data_multiplier=0.05, description="Presentation feature generation and model fitting.", ), WORKLOAD_PRESENTATION_CALIBRATION: WorkloadProfile( name=WORKLOAD_PRESENTATION_CALIBRATION, device_worker_gb=24.0, data_pressure_start_gb=2.0, data_pressure_factor=0.05, data_pressure_cap_gb=6.0, host_worker_gb=6.0, host_data_multiplier=0.02, description="Presentation percentile-rank calibration.", ), WORKLOAD_PRESENTATION_INFERENCE: WorkloadProfile( name=WORKLOAD_PRESENTATION_INFERENCE, device_worker_gb=16.0, data_pressure_start_gb=2.0, data_pressure_factor=0.05, data_pressure_cap_gb=6.0, host_worker_gb=6.0, host_data_multiplier=0.05, description="Presentation predictor inference.", ), } def get_workload_profile(workload_name): """Return a workload profile, falling back to generic for unknown names.""" return WORKLOAD_PROFILES.get(workload_name, WORKLOAD_PROFILES[WORKLOAD_GENERIC]) def path_size_bytes(path): """Best-effort file size lookup for planner hints.""" if not path: return None try: return os.path.getsize(path) except OSError: return None def model_artifact_size_bytes(path): """Best-effort uncompressed bytes for a model file or directory. NumPy ``.npz`` weights are ZIP containers, so their on-disk size can be much smaller than their resident parameter tensors. Summing ZIP member sizes gives the planner a closer parameter-byte input without importing torch or loading a predictor in the parent process. """ if not path: return None paths = [] if os.path.isdir(path): for root, _, filenames in os.walk(path): paths.extend(os.path.join(root, name) for name in filenames) else: paths.append(path) total = 0 found = False for filename in paths: try: if zipfile.is_zipfile(filename): with zipfile.ZipFile(filename) as archive: total += sum(info.file_size for info in archive.infolist()) else: total += os.path.getsize(filename) found = True except (OSError, zipfile.BadZipFile): continue return total if found else None def _memory_info(total_gb=None, available_gb=None, source="unknown"): return { "total_gb": total_gb, "available_gb": available_gb, "source": source, } def _memory_env_override(): total_raw = os.environ.get("MHCFLURRY_SYSTEM_RAM_GB") available_raw = os.environ.get("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB") if total_raw in (None, "") and available_raw in (None, ""): return None return _memory_info( total_gb=env_float( "MHCFLURRY_SYSTEM_RAM_GB", 0.0, bounds=(0.0, None)) if total_raw not in (None, "") else None, available_gb=env_float( "MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", 0.0, bounds=(0.0, None)) if available_raw not in (None, "") else None, source="env", ) def _linux_memory_info_gb(): values = {} try: with open("/proc/meminfo", "r") as fh: for line in fh: key, rest = line.split(":", 1) if key in ("MemTotal", "MemAvailable"): parts = rest.split() values[key] = float(parts[0]) / (1024 * 1024) except (OSError, ValueError, IndexError): return None if not values: return _linux_cgroup_memory_info_gb() host = _memory_info( total_gb=values.get("MemTotal"), available_gb=values.get("MemAvailable"), source="/proc/meminfo", ) cgroup = _linux_cgroup_memory_info_gb() if cgroup is None: return host host_total = host["total_gb"] if host_total is not None and cgroup["total_gb"] >= host_total: return host return cgroup def _read_cgroup_memory_value(paths): for path in paths: try: with open(path, "r") as fh: raw = fh.read().strip() except OSError: continue if not raw or raw == "max": continue try: return int(raw) except ValueError: continue return None def _linux_cgroup_memory_info_gb(): """Return the container memory budget when a finite cgroup limit exists.""" limit = _read_cgroup_memory_value(( "/sys/fs/cgroup/memory.max", "/sys/fs/cgroup/memory/memory.limit_in_bytes", )) # Cgroup v1 represents an unlimited controller with a huge near-int64 # sentinel. It is not a usable machine-memory estimate. if limit is None or limit <= 0 or limit >= 2 ** 60: return None current = _read_cgroup_memory_value(( "/sys/fs/cgroup/memory.current", "/sys/fs/cgroup/memory/memory.usage_in_bytes", )) available = None if current is None else max(limit - current, 0) return _memory_info( total_gb=limit / GIB, available_gb=available / GIB if available is not None else None, source="cgroup", ) def _macos_memory_info_gb(): try: total_bytes = int(subprocess.check_output( ["sysctl", "-n", "hw.memsize"], stderr=subprocess.DEVNULL, timeout=5, ).decode("utf-8").strip()) except ( OSError, subprocess.CalledProcessError, subprocess.TimeoutExpired, ValueError): total_bytes = None try: output = subprocess.check_output( ["vm_stat"], stderr=subprocess.DEVNULL, timeout=5, ).decode("utf-8", errors="ignore") except ( OSError, subprocess.CalledProcessError, subprocess.TimeoutExpired): output = "" page_size = 4096 first_line = output.splitlines()[0] if output else "" match = re.search(r"page size of (\d+) bytes", first_line) if match: page_size = int(match.group(1)) pages = {} for line in output.splitlines()[1:]: if ":" not in line: continue key, value = line.split(":", 1) try: pages[key.strip()] = int(value.strip().rstrip(".")) except ValueError: continue available_page_names = ( "Pages free", "Pages inactive", "Pages speculative") available_pages = sum( pages.get(name, 0) for name in available_page_names) available_bytes = ( available_pages * page_size if any(name in pages for name in available_page_names) else None ) if total_bytes is None and available_bytes is None: return None return _memory_info( total_gb=total_bytes / GIB if total_bytes is not None else None, available_gb=( available_bytes / GIB if available_bytes is not None else None ), source="vm_stat", ) def system_memory_info_gb(): """Return host memory totals without importing heavy optional packages.""" return ( _memory_env_override() or _linux_memory_info_gb() or _macos_memory_info_gb() or _memory_info() ) def available_or_total_memory_gb(memory): """Return available RAM when measured, including a valid zero value.""" available_gb = memory.get("available_gb") if available_gb is not None: return available_gb return memory.get("total_gb") def normalize_workload_hints(hints=None, **extra_hints): """Merge workload hints, dropping unset additions. Explicit keyword additions replace same-named values from ``hints``. This is the normalization boundary shared by workload estimation and local parallelism planning. """ values = {} if hints: values.update(dict(hints)) values.update({k: v for (k, v) in extra_hints.items() if v is not None}) return values def _finite_nonnegative_hint(hints, name): """Return a numeric planning hint or fail before capacity arithmetic.""" raw = hints.get(name) if raw is None: return None try: value = float(raw) except (TypeError, ValueError): raise ValueError( "Workload hint %s must be a finite non-negative number; got %r" % (name, raw) ) from None if not math.isfinite(value) or value < 0: raise ValueError( "Workload hint %s must be a finite non-negative number; got %r" % (name, raw) ) return value def estimate_workload_memory(workload_name=WORKLOAD_GENERIC, hints=None): """Estimate device and host memory for a workload.""" hints = normalize_workload_hints(hints) profile = get_workload_profile(workload_name) notes = [] data_bytes = _finite_nonnegative_hint(hints, "data_bytes") or 0.0 model_bytes = _finite_nonnegative_hint(hints, "model_bytes") data_gb = data_bytes / GIB workload_env = "MHCFLURRY_WORKLOAD_%s_PER_WORKER_GB" % ( profile.name.upper().replace("-", "_"), ) if os.environ.get(workload_env) not in (None, ""): device_worker_gb = env_float(workload_env, 0.0, bounds=(0.0, None)) notes.append("env override") elif hints.get("per_worker_gb") is not None: device_worker_gb = _finite_nonnegative_hint(hints, "per_worker_gb") notes.append("command estimate") else: device_worker_gb = profile.device_worker_gb if device_worker_gb is not None: notes.append("profile default") if model_bytes: artifact_worker_gb = ( DEVICE_RUNTIME_BASE_GB + float(model_bytes) / GIB * MODEL_TENSOR_SAFETY_FACTOR ) if device_worker_gb is None or artifact_worker_gb > device_worker_gb: # Artifact size is a resident-memory floor, not a replacement for # the workload profile. An elastic batch can shrink transient # activations, but it cannot shrink CUDA contexts, model state, or # the other predictors held by a composite workload. Analytic # command estimates and expert env overrides remain authoritative; # unlike raw artifact size, they describe a complete worker. device_worker_gb = artifact_worker_gb notes.append("uncompressed model artifact floor") elif hints.get("elastic_batch"): notes.append("elastic batches retain resident workload floor") data_pressure_gb = 0.0 if data_bytes and device_worker_gb is not None: if data_gb > profile.data_pressure_start_gb: data_pressure_gb = min( profile.data_pressure_cap_gb, (data_gb - profile.data_pressure_start_gb) * profile.data_pressure_factor, ) if data_pressure_gb: device_worker_gb += data_pressure_gb notes.append("data pressure %.2f GB" % data_pressure_gb) host_worker_gb = profile.host_worker_gb if data_gb and profile.host_data_multiplier: host_worker_gb += min( profile.host_data_cap_gb, data_gb * profile.host_data_multiplier, ) return { "workload_name": profile.name, "device_worker_gb": device_worker_gb, "host_worker_gb": host_worker_gb, "data_pressure_gb": data_pressure_gb, "hints": tuple(sorted(hints.items())), "notes": tuple(notes), } def host_memory_num_jobs_cap( memory, host_worker_gb, dataloader_num_workers=0, safety_fraction=None): """Return worker cap from currently available host memory.""" available_gb = available_or_total_memory_gb(memory) if available_gb is None: return None worker_gb = ( float(host_worker_gb) + int(dataloader_num_workers) * HOST_RAM_PER_DATALOADER_CHILD_GB ) if worker_gb <= 0: return None if safety_fraction is None: raw_fraction = os.environ.get( "MHCFLURRY_AUTO_HOST_MEMORY_SAFETY_FRACTION") if raw_fraction not in (None, ""): safety_fraction = env_float( "MHCFLURRY_AUTO_HOST_MEMORY_SAFETY_FRACTION", raw_fraction, bounds=(0.0, 1.0), ) if safety_fraction is not None: usable_gb = float(available_gb) * float(safety_fraction) else: usable_gb = usable_memory_bytes( float(available_gb) * GIB, min_reserve_bytes=HOST_MIN_RESERVE_BYTES, ) / GIB return max(1, int(usable_gb / worker_gb)) def is_auto_value(value): """Return whether a CLI/programmatic sizing value delegates to auto.""" return value is None or (isinstance(value, str) and value.lower() == "auto") def _clip_auto_num_jobs_to_host_memory( num_jobs, max_workers_per_gpu, num_gpus, was_auto_mwpg, memory, memory_plan, warnings, dataloader_num_workers=0): """Clamp an auto-resolved ``num_jobs`` to what host RAM can support. Returns ``(num_jobs, max_workers_per_gpu, host_cap)``. ``host_cap`` is ``None`` when no clamp was applied (the input fit within memory); when a clamp happens it is the host-memory worker cap, which equals the returned ``num_jobs``. Callers use a non-None ``host_cap`` to report capacity as the clamped worker count rather than re-deriving it from the (ceil-rounded) ``max_workers_per_gpu``. """ cap = host_memory_num_jobs_cap( memory, memory_plan["host_worker_gb"], dataloader_num_workers=dataloader_num_workers, ) if cap is None or int(num_jobs) <= cap: return num_jobs, max_workers_per_gpu, None worker_gb = ( memory_plan["host_worker_gb"] + int(dataloader_num_workers) * HOST_RAM_PER_DATALOADER_CHILD_GB ) warnings.append( "auto num_jobs capped from %d to %d by available host memory " "(%.1f GB from %s, workload=%s, %.1f GB/worker)" % ( int(num_jobs), cap, available_or_total_memory_gb(memory), memory.get("source"), memory_plan["workload_name"], worker_gb, ) ) num_jobs = cap if was_auto_mwpg and num_gpus > 0: max_workers_per_gpu = max(1, (int(num_jobs) + int(num_gpus) - 1) // int(num_gpus)) return num_jobs, max_workers_per_gpu, cap # Free VRAM below this multiple of the per-worker estimate is flagged as # "way below safe operating range" — the auto batch-sizer can still shrink to # fit, but the margin for a worker's minimum working set is thin. _CAPACITY_VRAM_SAFE_FRACTION = 1.0 # Free VRAM this many times larger on the biggest GPU than the smallest is # flagged as heterogeneous (the plan sizes everything to the smallest card). _CAPACITY_VRAM_HETEROGENEITY_RATIO = 1.5 def capacity_warnings( *, workload_name, backend, gpus, num_jobs, per_gpu_free_vram_gb, device_worker_gb, available_ram_gb, host_worker_gb, cpu_count): """Compare a resolved plan against measured machine capacity. Returns a list of human-readable warning strings for resources that are below a safe operating range (small / uneven / undetectable GPU VRAM, host RAM below the per-worker estimate, more workers than CPUs). Pure: no I/O and no side effects — the caller decides how to surface the strings. All measured inputs may be ``None`` when detection failed; each check is skipped when its inputs are missing. """ out = [] gpu_backend = backend in ("auto", "gpu") and gpus and int(gpus) > 0 if gpu_backend: if per_gpu_free_vram_gb is None: out.append( "could not detect free GPU VRAM (nvidia-smi unavailable and no " "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB override); " "worker and batch sizing fall back to conservative defaults — " "pin --max-workers-per-gpu / the batch-size flags if you OOM.") else: free = [float(g) for g in per_gpu_free_vram_gb if g is not None] if free and device_worker_gb: min_free = min(free) if min_free < _CAPACITY_VRAM_SAFE_FRACTION * float(device_worker_gb): out.append( "free GPU VRAM is below the per-worker estimate for " "workload %r: smallest free %.1f GB vs ~%.1f GB/worker. " "The auto batch-sizer shrinks batches to fit, but " "throughput drops and a worker can OOM if its minimum " "working set exceeds free VRAM — reduce the batch-size " "flags or use a larger GPU." % (workload_name, min_free, float(device_worker_gb))) if (len(free) > 1 and min_free > 0 and max(free) / min_free >= _CAPACITY_VRAM_HETEROGENEITY_RATIO): out.append( "free GPU VRAM is uneven across GPUs (%s GB); the plan " "sizes every GPU to the smallest (%.1f GB), " "underutilizing the larger card(s)." % (", ".join("%.0f" % g for g in free), min_free)) if (num_jobs and int(num_jobs) > 0 and available_ram_gb is not None and host_worker_gb): needed = float(host_worker_gb) * int(num_jobs) if float(available_ram_gb) < needed: out.append( "available host RAM (%.0f GB) is below the ~%.0f GB estimate " "for %d workers (~%.1f GB each); workers may be OOM-killed " "under memory pressure — reduce --num-jobs." % (float(available_ram_gb), needed, int(num_jobs), float(host_worker_gb))) if num_jobs and cpu_count and int(num_jobs) > int(cpu_count): out.append( "planned %d worker processes exceed detected CPUs (%d); workers " "will contend for cores — consider --num-jobs <= %d." % (int(num_jobs), int(cpu_count), int(cpu_count))) return out def plan_local_parallelism( args, *, workload_name=WORKLOAD_GENERIC, workload_hints=None, per_worker_gb=None, cap_auto_num_jobs=True, normalize_backend, detect_num_cuda_devices, auto_max_workers_per_gpu, auto_num_jobs, resolve_dataloader_num_workers, auto_random_negative_pool_epochs): """Resolve all local-parallelism CLI flags into a plan. Explicit CLI values override planner estimates. For explicit values that exceed estimated capacity, the planner records a warning and still returns the explicit value. """ hints = normalize_workload_hints( workload_hints, per_worker_gb=per_worker_gb, ) memory_plan = estimate_workload_memory(workload_name, hints) memory = system_memory_info_gb() warnings = [] cli_overrides = [] backend_raw = getattr(args, "backend", "auto") or "auto" backend = normalize_backend(backend_raw) if backend_raw not in ("auto", None): cli_overrides.append("backend") gpus_raw = getattr(args, "gpus", None) gpus_was_auto = gpus_raw is None and backend in ("auto", "gpu") if gpus_was_auto: gpus = int(detect_num_cuda_devices()) else: gpus = int(gpus_raw or 0) if gpus_raw is not None: cli_overrides.append("gpus") mwpg_raw = getattr(args, "max_workers_per_gpu", None) mwpg_was_auto = is_auto_value(mwpg_raw) if mwpg_was_auto: max_workers_per_gpu = int(auto_max_workers_per_gpu( num_jobs=getattr(args, "num_jobs", 0), num_gpus=gpus, backend=backend, per_worker_gb=memory_plan["device_worker_gb"], )) else: max_workers_per_gpu = int(mwpg_raw) cli_overrides.append("max_workers_per_gpu") capacity = ( int(auto_num_jobs(gpus, max_workers_per_gpu)) if backend in ("auto", "gpu") else 0 ) num_jobs_raw = getattr(args, "num_jobs", "auto") num_jobs_was_auto = is_auto_value(num_jobs_raw) if num_jobs_was_auto: num_jobs = capacity if cap_auto_num_jobs and num_jobs > 0: num_jobs, max_workers_per_gpu, host_cap = ( _clip_auto_num_jobs_to_host_memory( num_jobs, max_workers_per_gpu, gpus, mwpg_was_auto, memory, memory_plan, warnings, ) ) if host_cap is not None and backend in ("auto", "gpu"): # Host memory is now the binding constraint, so report the # clamped worker count as capacity. Recomputing # gpus * ceil(num_jobs / gpus) here would over-report (e.g. # num_jobs=5 on 2 GPUs -> mwpg=3 -> capacity=6 > num_jobs). capacity = int(num_jobs) else: num_jobs = int(num_jobs_raw) cli_overrides.append("num_jobs") if cap_auto_num_jobs and capacity > 0 and num_jobs > capacity: warnings.append( "explicit num_jobs=%d exceeds GPU capacity estimate %d; " "honoring CLI override" % (num_jobs, capacity) ) cpu_count = os.cpu_count() if cap_auto_num_jobs and cpu_count and int(num_jobs) > int(cpu_count): if num_jobs_was_auto: warnings.append( "auto num_jobs capped from %d to %d by available CPUs" % ( int(num_jobs), int(cpu_count))) num_jobs = int(cpu_count) if mwpg_was_auto and gpus > 0: max_workers_per_gpu = max( 1, (num_jobs + gpus - 1) // gpus) if backend in ("auto", "gpu"): capacity = int(num_jobs) else: warnings.append( "explicit num_jobs=%d exceeds detected CPUs=%d; honoring " "CLI override" % (int(num_jobs), int(cpu_count))) work_item_cap = hints.get("num_work_items") if work_item_cap is None and workload_name.endswith("_inference"): work_item_cap = hints.get("prediction_rows") or hints.get("num_rows") if work_item_cap is not None: work_item_cap = max(int(work_item_cap), 1) if ( cap_auto_num_jobs and num_jobs_was_auto and work_item_cap is not None and int(num_jobs) > work_item_cap): warnings.append( "auto num_jobs capped from %d to %d by available work items" % ( int(num_jobs), work_item_cap)) num_jobs = work_item_cap if mwpg_was_auto and gpus > 0: max_workers_per_gpu = max( 1, (num_jobs + gpus - 1) // gpus) if backend in ("auto", "gpu"): capacity = int(num_jobs) dataloader_fit_workers = max(0, int(num_jobs)) if ( int(num_jobs) <= 0 and gpus > 0 and backend in ("auto", "gpu")): # An explicit serial run can still execute one fit on an accelerator. dataloader_fit_workers = 1 effective_fit_workers = max(1, int(num_jobs)) dl_raw = getattr(args, "dataloader_num_workers", "auto") dl_was_auto = is_auto_value(dl_raw) if dl_was_auto: dataloader_num_workers = int(resolve_dataloader_num_workers( dl_raw, num_fit_workers=dataloader_fit_workers, ram_gb=available_or_total_memory_gb(memory), )) else: dataloader_num_workers = int(dl_raw) cli_overrides.append("dataloader_num_workers") torch_compile = getattr(args, "torch_compile", "auto") if torch_compile != "auto": cli_overrides.append("torch_compile") torch_compile_loss = getattr(args, "torch_compile_loss", "auto") if torch_compile_loss != "auto": cli_overrides.append("torch_compile_loss") matmul_precision = getattr(args, "matmul_precision", "none") if matmul_precision != "none": cli_overrides.append("matmul_precision") enable_timing = bool(getattr(args, "enable_timing", False)) if enable_timing: cli_overrides.append("enable_timing") host_worker_gb = ( memory_plan["host_worker_gb"] + int(dataloader_num_workers) * HOST_RAM_PER_DATALOADER_CHILD_GB ) host_memory_cap = host_memory_num_jobs_cap( memory, memory_plan["host_worker_gb"], dataloader_num_workers=dataloader_num_workers, ) if host_memory_cap is not None: if ( cap_auto_num_jobs and num_jobs_was_auto and int(num_jobs) > host_memory_cap): num_jobs, max_workers_per_gpu, host_cap = ( _clip_auto_num_jobs_to_host_memory( num_jobs, max_workers_per_gpu, gpus, mwpg_was_auto, memory, memory_plan, warnings, dataloader_num_workers=dataloader_num_workers, ) ) if host_cap is not None and backend in ("auto", "gpu"): # Host memory is now the binding constraint, so report the # clamped worker count as capacity. Recomputing # gpus * ceil(num_jobs / gpus) here would over-report (e.g. # num_jobs=5 on 2 GPUs -> mwpg=3 -> capacity=6 > num_jobs). capacity = int(num_jobs) effective_fit_workers = max(1, int(num_jobs)) host_memory_cap = host_memory_num_jobs_cap( memory, memory_plan["host_worker_gb"], dataloader_num_workers=dataloader_num_workers, ) elif (not num_jobs_was_auto) and int(num_jobs) > host_memory_cap: warnings.append( "explicit num_jobs=%d exceeds host-memory estimate %d; " "honoring CLI override" % (num_jobs, host_memory_cap) ) rn_raw = getattr(args, "random_negative_pool_epochs", "auto") rn_was_auto = is_auto_value(rn_raw) if rn_was_auto: random_negative_pool_epochs = int(auto_random_negative_pool_epochs( num_random_negatives=None, peptide_max_length=None, num_workers=effective_fit_workers, ram_gb=available_or_total_memory_gb(memory), base_worker_gb=host_worker_gb, )) else: random_negative_pool_epochs = int(rn_raw) cli_overrides.append("random_negative_pool_epochs") return LocalParallelismPlan( workload_name=memory_plan["workload_name"], backend=backend, gpus=int(gpus), gpus_was_auto=gpus_was_auto, max_workers_per_gpu=int(max_workers_per_gpu), max_workers_per_gpu_was_auto=mwpg_was_auto, num_jobs=int(num_jobs), num_jobs_was_auto=num_jobs_was_auto, dataloader_num_workers=int(dataloader_num_workers), dataloader_num_workers_was_auto=dl_was_auto, random_negative_pool_epochs=random_negative_pool_epochs, random_negative_pool_epochs_was_auto=rn_was_auto, torch_compile=torch_compile, torch_compile_loss=torch_compile_loss, matmul_precision=matmul_precision, enable_timing=enable_timing, capacity=int(capacity), device_worker_gb=memory_plan["device_worker_gb"], data_pressure_gb=memory_plan["data_pressure_gb"], host_worker_gb=host_worker_gb, host_memory_total_gb=memory.get("total_gb"), host_memory_available_gb=memory.get("available_gb"), host_memory_source=memory.get("source", "unknown"), host_memory_num_jobs_cap=host_memory_cap, cli_overrides=tuple(cli_overrides), warnings=tuple(warnings), hints=memory_plan["hints"], ) mhcflurry-2.3.6/notebooks/000077500000000000000000000000001525677230600155555ustar00rootroot00000000000000mhcflurry-2.3.6/notebooks/example1.ipynb000066400000000000000000000046311525677230600203400ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Simple example for generating predictions with MHCflurry.\n", "import mhcflurry" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Load a predictor\n", "predictor = mhcflurry.Class1PresentationPredictor.load()\n", "predictor" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Predict peptides with their N/C source-protein flanks.\n", "# These windows are from docs/example.fasta.\n", "peptides = [\"TPVCPNGPG\", \"RLLEGMEMI\"]\n", "alleles = {\"sample1\": [\"HLA-A*02:01\", \"HLA-A*03:01\"]}\n", "results1 = predictor.predict(\n", " peptides, alleles,\n", " n_flanks=[\"MSSSS\", \"MVENK\"],\n", " c_flanks=[\"NCQV\", \"FGQVI\"],\n", ")\n", "results1\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Compare the same peptides and MHC alleles without flanking context.\n", "results_no_flanks = predictor.predict(peptides, alleles)\n", "results_no_flanks\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Predict across protein sequences\n", "# Try help(predictor.predict_sequences) for other options.\n", "results2 = predictor.predict_sequences(\n", " sequences={\n", " 'protein1': \"MDSKGSSQKGSRLLLLLVVSNLL\",\n", " 'protein2': \"SSLPTPEDKEQAQQTHH\",\n", " },\n", " alleles={\n", " \"sample1\": [\"A0201\", \"A0301\", \"B0702\"],\n", " \"sample2\": [\"A0101\", \"C0202\"],\n", " },\n", " result=\"filtered\",\n", " comparison_quantity=\"affinity\",\n", " filter_value=500)\n", "results2" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 4 } mhcflurry-2.3.6/notebooks/mhcflurry-colab.ipynb000066400000000000000000000157411525677230600217210ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "source": [ "# Setup" ], "metadata": { "id": "ZBP3mFgsZTxA" } }, { "cell_type": "markdown", "source": [ "This notebook demonstrates how to generate predictions using MHCflurry.\n", "\n", "The setup installs the latest stable MHCflurry 2.3 patch release and its presentation models." ], "metadata": { "id": "c4ukEYkrco5H" } }, { "cell_type": "code", "source": [ "# Install the package and download models\n", "%pip install --upgrade \"mhcflurry>=2.3,<2.4\"\n", "!mhcflurry-downloads --quiet fetch models_class1_presentation" ], "metadata": { "id": "uUFQLxFgZTAO" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "# Imports\n", "import mhcflurry\n", "from google.colab import files\n", "\n", "# Quiet warnings\n", "import warnings\n", "warnings.filterwarnings('ignore')" ], "metadata": { "id": "1sqAFdItWwd5" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "sHCsU4dNRGBk" }, "outputs": [], "source": [ "# Load a predictor\n", "predictor = mhcflurry.Class1PresentationPredictor.load()\n", "predictor" ] }, { "cell_type": "markdown", "source": [ "# Predict for specified peptides" ], "metadata": { "id": "SZyoFee7ZlaH" } }, { "cell_type": "code", "source": [ "# Predict peptides with their N/C source-protein flanks.\n", "# These windows are from docs/example.fasta.\n", "peptides = [\"TPVCPNGPG\", \"RLLEGMEMI\"]\n", "alleles = {\"sample1\": [\"HLA-A*02:01\", \"HLA-A*03:01\"]}\n", "results1 = predictor.predict(\n", " peptides, alleles,\n", " n_flanks=[\"MSSSS\", \"MVENK\"],\n", " c_flanks=[\"NCQV\", \"FGQVI\"],\n", ")\n", "results1\n" ], "metadata": { "id": "LaoQdnXlZLo8" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Compare the same peptides and MHC alleles without flanking context.\n", "results_no_flanks = predictor.predict(peptides, alleles)\n", "results_no_flanks\n" ] }, { "cell_type": "code", "source": [ "# Download results\n", "results1.to_csv('mhcflurry-results.csv')\n", "files.download('mhcflurry-results.csv')" ], "metadata": { "id": "B2YXOk6waeli" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "# See help for more options:\n", "help(predictor.predict)" ], "metadata": { "id": "OIYIyhiudmis" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "# Predict by scanning across protein sequences" ], "metadata": { "id": "TAJlyQ-4axay" } }, { "cell_type": "code", "source": [ "# Paste your fasta here\n", "proteins_fasta = \"\"\"\n", ">tr|A0A6B9WFC7|A0A6B9WFC7_SARS2 Envelope small membrane protein\n", "MYSFVSEETGTLIVNSVLLFLAFVVFLLVTLAILTALRLCAYCCNIVNVSLVKPSFYVYS\n", "RVKNLNSSRVPDLLV\n", ">tr|A0A6B9W0L4|A0A6B9W0L4_SARS2 ORF6 protein\n", "MFHLVDFQVTIAEILLIIMRTFKVSIWNLDYIINLIIKNLSKSLTENKYSQLDEEQPMEI\n", "D\n", ">tr|A0A6G7S6S0|A0A6G7S6S0_SARS2 Nonstructural protein NS3\n", "MDLFMRIFTIGTVTLKQGEIKDATPSDFVRATATIPIQASLPFGWLIVGVALLAVFQSAS\n", "KIITLKKRWQLALSKGVHFVCNLLLLFVTVYSHLLLVAAGLEAPFLYLYALVYFLQSINF\n", "VRIIMRLWLCWKCRSKNPLLYDANYFLCWHTNCYDYCIPYNSVTSSIVITSGDGTTSPIS\n", "EHDYQIGGYTEKWESGVKDCVVLHSYFTSDYYQLYSTQLSTDTGVEHVTFFIYNKIVDEP\n", "EEHVQIHTIDGSSGVVNPVMEPIYDEPTTTTSVPL\n", ">tr|A0A6B9VLF3|A0A6B9VLF3_SARS2 Membrane protein\n", "MADSNGTITVEELKKLLEQWNLVIGFLFLTWICLLQFAYANRNRFLYIIKLIFLWLLWPV\n", "TLACFVLAAVYRINWITGGIAIAMACLVGLMWLSYFIASFRLFARTRSMWSFNPETNILL\n", "NVPLHGTILTRPLLESELVIGAVILRGHLRIAGHHLGRCDIKDLPKEITVATSRTLSYYK\n", "LGASQRVAGDSGFAAYSRYRIGNYKLNTDHSSSSDNIALLVQ\n", "\"\"\"\n", "\n", "import mhcflurry.fasta\n", "\n", "with open(\"temp.fa\", \"w\") as fd:\n", " fd.write(proteins_fasta)\n", "\n", "proteins = mhcflurry.fasta.read_fasta_to_dataframe(\"temp.fa\").set_index(\"sequence_id\")\n", "proteins" ], "metadata": { "id": "IORcEbHkbBsJ" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "# Define alleles for each sample\n", "alleles={\n", " \"my-sample\": [\"A0201\", \"A0301\", \"B0702\", \"C0802\"],\n", "}" ], "metadata": { "id": "zwPHH09RcgCt" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "tYRpxn5YRGBk" }, "outputs": [], "source": [ "# Predict across protein sequences and return peptides with predicted affinity\n", "# at most 500 nM.\n", "results2 = predictor.predict_sequences(\n", " sequences=proteins.sequence.to_dict(),\n", " alleles=alleles,\n", " result=\"filtered\",\n", " comparison_quantity=\"affinity\",\n", " filter_value=500)\n", "results2" ] }, { "cell_type": "code", "source": [ "# Download results\n", "results2.to_csv('mhcflurry-results.csv')\n", "files.download('mhcflurry-results.csv')" ], "metadata": { "id": "CASrg0X5dgon" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "# See help for more options:\n", "help(predictor.predict_sequences)" ], "metadata": { "id": "RtbpRsdTdMRL" }, "execution_count": null, "outputs": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" }, "colab": { "name": "mhcflurry-colab.ipynb", "provenance": [] } }, "nbformat": 4, "nbformat_minor": 0 } mhcflurry-2.3.6/pylintrc000066400000000000000000000002141525677230600153360ustar00rootroot00000000000000[TYPECHECK] # Without ignoring this, we get errors like: # E:249,20: Module 'numpy' has no 'nan' member (no-member) ignored-modules = numpy mhcflurry-2.3.6/readthedocs.yml000066400000000000000000000000461525677230600165620ustar00rootroot00000000000000conda: file: docs/environment.yml mhcflurry-2.3.6/requirements.txt000066400000000000000000000001631525677230600170360ustar00rootroot00000000000000numpy>=1.22.4 pandas>=2.0 torch>=2.0.0 appdirs scikit-learn threadpoolctl matplotlib mhcgnomes>=3.33.6 pyyaml tqdm mhcflurry-2.3.6/ruff.toml000066400000000000000000000002721525677230600154120ustar00rootroot00000000000000# Keep the core error checks explicit so Ruff upgrades do not silently # enable additional style rules across the existing codebase (issue #361). [lint] select = ["E4", "E7", "E9", "F"] mhcflurry-2.3.6/scripts/000077500000000000000000000000001525677230600152415ustar00rootroot00000000000000mhcflurry-2.3.6/scripts/README.md000066400000000000000000000034471525677230600165300ustar00rootroot00000000000000# Maintained scripts This directory contains reusable training, release, validation, and developer utilities. Transient experiments, incident-specific launchers, and smoke tests belong in the ignored `jobs/` directory or in the test suite. ## Directory map - **`training/`** — production training stages, remote transport, sweeps, and profiling. See [training/README.md](training/README.md). - **`release/`** — end-to-end release orchestration, provenance validation, packaging, and deployment. See [release/README.md](release/README.md). - **`dev/`** — developer ergonomics that are not invoked by CI or releases. - **Top-level Python files** — focused validation tools for comparing a newly trained predictor with a release or fixture. The maintained public workflow for training, evaluation, plots, remote cleanup, and optional deployment is: ```shell mhcflurry train pan-allele-release --help ``` ## Validation tools - **`validate_against_public.py`** checks affinity and presentation rank correlation against a public release on a peptide-by-allele grid. - **`validate_allele_sequences.py`** verifies that shipped pseudosequences are stable across model bundles. - **`validate_presentation_with_flanks.py`** runs a small fixed presentation regression set with real flanks. These are acceptance checks for model work. General behavior tests belong in `test/`. ## Where new work belongs - Use ignored `jobs/` for local launchers, interrupted experiments, and machine-specific debugging. - Promote reusable operational tools from `jobs/` into `scripts/`. - Keep artifact generation reproducible through saved commands, configuration, input/source hashes and seeds. Use the maintained `training/` and `release/` workflows for current models; `downloads-generation/` retains historical recipes. mhcflurry-2.3.6/scripts/release/000077500000000000000000000000001525677230600166615ustar00rootroot00000000000000mhcflurry-2.3.6/scripts/release/README.md000066400000000000000000000216121525677230600201420ustar00rootroot00000000000000# Release workflows Maintainer tools for retraining, evaluating, synchronizing, packaging, and publishing model artifacts. Prediction users do not need these scripts. Run these workflows from a clean source checkout containing `scripts/`, with MHCflurry and the chosen backend dependencies installed. A wheel-only installation provides prediction and low-level training commands, but not these repository orchestration scripts. ## End-to-end workflow Use the public command rather than invoking the orchestration shell script directly: ```shell MHCFLURRY_RELEASE_RECIPE=final-2.3.0-candidate-v2 \ mhcflurry train pan-allele-release \ --run-dir /path/to/release-run \ --release 2.3.0 \ --backend local ``` The workflow runs these stages in order: 1. Build and persist the pMHC and sample manifests for the frozen release holdout (all monoallelic samples for affinity; PMID 31154438 for processing and presentation). 2. Train affinity outside the benchmark pMHC intersection and presentation outside the complete multiallelic holdout samples. 3. Validate zero holdout overlap in the final training artifacts. 4. Compare the new models with a configured public release or run directory, restricted to the frozen component-specific evaluation samples. 5. Render diagnostic plots and a combined PDF. 6. Copy remote artifacts back when using a remote backend. 7. Optionally package or deploy model archives. Each stage has a `--skip-*` option for controlled resumption. Logs and `status.tsv` are written under `/workflow_logs/`. Deployment is off by default. The command delegates process orchestration to `retrain_evaluate_deploy.sh`. That script remains internal because it owns shell training stages, traps, remote lifecycle, telemetry, and artifact synchronization. ## Choose a backend | Backend | Use it when | Required options | |---|---|---| | `local` | The current machine has the required compute and storage. | None beyond the common arguments. | | `brev-existing` | A named Brev instance already exists. | `--brev-instance NAME` | | `brev-provision` | The workflow should select or create a Brev instance. | None; the name and shape can be automatic. | | `ssh` | Training should run in a specific remote checkout. | `--remote`, `--remote-repo`, `--remote-run-dir` | SSH authentication comes from the local `ssh` and `rsync` configuration. Before training, the workflow verifies the remote commit and tracked worktree so model provenance cannot be stamped from a different checkout. By default every remote backend synchronizes its outputs before local evaluation, plotting, or deployment. `--no-sync-remote-output` is an explicit training-only mode: combine it with `--skip-eval --skip-plots` and leave deployment disabled. SSH runs validate the completed models on the remote host before returning success, and the Brev launcher performs the same artifact-only validation inside the remote job. This mode therefore does not depend on nonexistent local `info.txt` files. For Brev, deletion and delete-on-stop-failure cleanup are rejected because the instance disk holds the only artifact copy. ## Brev selection, synchronization, and cleanup `brev-provision` defaults to automatic inventory selection using the release workload requirements: 4 A100-class GPUs with at least 35 GB VRAM each, 32 CPUs, 300 GB RAM, and 1 TB disk. No resource environment variables are required. Use one of these options only when the default selection is unsuitable: - `--brev-provider gcp`, `denvr`, or `denvr-80gb` selects a common release shape. - `--brev-instance-type TYPE` selects an exact Brev type and takes precedence over automatic provider selection. - `--brev-exclude-providers PREFIXES` removes provider/type prefixes from automatic candidates. The wrapper verifies remote completion and copies artifacts before changing the instance state. The default `--brev-on-finish stop` stops a successful or failed run after synchronization. Use `delete` for disposable instances or `leave` only for active debugging. If a provisioned instance remains running after a successful stop request, the default stop-failure policy deletes it after artifacts are safe locally. `--brev-sync-mode release` copies the artifacts needed for evaluation and publication: selected models, logs, events, telemetry, comparison prediction tables and summaries, plots, and generated configuration. This keeps a synced run sufficient for a later plot-only resume after the remote instance is cleaned up. Use `--brev-sync-mode full` only for a deliberate post-mortem that needs every candidate model and training intermediate table. ## Release profiles and performance `--release-profile full` is the default. It trains the complete processing set: `with_flanks`, `no_flank`, and `short_flanks`. The frozen 2.3.0 v2 recipe uses an eight-network short-flank/boundary hybrid for presentation. The independently trained `with_flanks` predictor uses 15-residue flanks and is a diagnostic component, not that hybrid. Without an explicit recipe preset, the generic workflow uses its own documented defaults; it does not reproduce the released weight recipe. Optional profiles are: - `fast-8xa100`: selects the common 8×A100 80 GB Brev shape when no machine override was supplied. - `minimal-processing`: omits `short_flanks` from both training and evaluation. - `fast-minimal`: combines those two choices. Affinity minibatch defaults to the held-out-validated value 1024. Processing retains the published minibatch 512. Use `--affinity-minibatch-size` or `--processing-minibatch-size` only for a deliberate experiment. Affinity worker packing defaults to `--affinity-max-workers-per-gpu auto`. The training command estimates the complete per-worker working set from the model, data, configured batch, and detected memory. Pin an integer only after measuring a known machine; explicit values bypass automatic packing decisions. ## Evaluation and figures Evaluation covers affinity, processing, and presentation. The workflow writes component metrics, `release_summary.csv`, `release_summary.md`, individual plots, and `plots/model_comparison_figures.pdf`. Its default baseline is the explicit pre-2.3 public release, `public:2.2.0`; use `--compare-baseline public` to follow the currently configured release or provide another run directory/version. On Brev, comparison and diagnostic plotting run on the GPU instance before synchronization. This avoids repeating release-scale inference on a laptop. Broader paper figures can use saved prediction tables or score caches through `--paper-figures-scores-dir` and the explicit `--paper-figures-*-predictions` options. Local licensed predictors may be prepared while remote training runs with `--paper-figures-prepare-command`; their inputs remain on the control machine and render after remote artifacts arrive. See the [evaluation guide](../../docs/evaluation.md) for the canonical output map, saved-prediction schema, score orientation, and external-predictor adapter. Run `mhcflurry train pan-allele-release --help` for the complete release option list. ## Package and deploy models Package a completed run without uploading it: ```shell scripts/release/deploy_trained_models.sh \ --run-dir /path/to/release-run \ --release 2.3.0 \ --github-release 2.3.0 \ --mode package-only ``` The script writes archives, `SHA256SUMS`, and a `downloads.yml` snippet under `/release-assets/` by default. - `--mode draft` uploads to a draft GitHub release. - `--mode publish` uploads only after the GitHub release exists; it does not publish that release because publication also triggers package workflows. Direct deployment packages `no_flank` and `with_flanks` by default. Include `short_flanks` only when it belongs to the current release. The end-to-end workflow forwards its exact trained variant set, so stale directories from an older run are never packaged merely because they exist. `--mode dry-run` only validates and prints the plan. `--mode package-only` builds local archives for loading and prediction checks. Exports include only manifest-selected network weights and remove checkpoint-only manifest paths; original training directories remain unchanged. Training tables and calibration are retained, with manifest digests in `inference_export.json`. When distributing already-trained weights from a different source version, pass `--training-package-version` with their exact recorded version and `--allow-artifact-source-mismatch`. The output `provenance.json` records both training and packaging identities. Never rewrite model `info.txt` to pretend that a stable packaging checkout trained the weights. The generated downloads snippet contains the model entries only. When adding a release to `mhcflurry/downloads.yml`, also retain the data and historical-model bundles needed by supported commands. Publish the GitHub release only after its code CI, archives, checksums and download metadata have been verified; the publication event triggers the package upload to PyPI. mhcflurry-2.3.6/scripts/release/deploy_trained_models.sh000077500000000000000000000300451525677230600235670ustar00rootroot00000000000000#!/usr/bin/env bash # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set -euo pipefail # Do not add macOS extended attributes or AppleDouble files to model archives. export COPYFILE_DISABLE=1 usage() { cat <<'EOF' Package trained MHCflurry release models and upload them to GitHub. Usage: scripts/release/deploy_trained_models.sh \ --run-dir /path/to/release-run \ --release 2.3.0 \ --github-release 2.3.0 \ [--processing-variants "no_flank with_flanks [short_flanks]"] \ [--repo /path/to/mhcflurry] [--allow-dirty-repo] \ [--allow-artifact-source-mismatch] [--training-package-version VERSION] \ [--date YYYYMMDD] \ [--assets-dir /path/to/assets] \ [--dry-run | --package-only | --draft | --publish | --mode MODE] Modes: --dry-run Validate paths and print planned assets. This is the default. --package-only Build and checksum assets locally without uploading. --draft Build assets and upload them to a draft GitHub release, creating the draft if needed. --publish Build assets and upload them to an existing GitHub release. This script does not publish a release because publishing also triggers package-release workflows. Expected run layout: /affinity/models.combined /processing/models.selected.no_flank /processing/models.selected.with_flanks /processing/models.selected.short_flanks (when requested) /presentation/models The script writes SHA256SUMS and a downloads.yml snippet beside the assets. Commit the downloads.yml update after the GitHub assets are uploaded and their final URLs are known. EOF } die() { echo "ERROR: $*" >&2 exit 2 } note() { echo "$*" >&2 } require_command() { command -v "$1" >/dev/null 2>&1 || die "Required command not found: $1" } require_dir() { [ -d "$1" ] || die "Missing directory: $1" } require_file() { [ -f "$1" ] || die "Missing file: $1" } require_one_file() { local label=$1 shift local candidate for candidate in "$@"; do if [ -f "$candidate" ]; then return 0 fi done die "Missing ${label}; tried: $*" } checksum_assets() { if command -v sha256sum >/dev/null 2>&1; then sha256sum "$@" elif command -v shasum >/dev/null 2>&1; then shasum -a 256 "$@" else die "Required command not found: sha256sum or shasum" fi } quote_cmd() { local arg printf '+' for arg in "$@"; do printf ' %q' "$arg" done printf '\n' } RUN_DIR= RELEASE= GITHUB_RELEASE= ASSETS_DIR= SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO="${REPO:-$(cd "$SCRIPT_DIR/../.." && pwd)}" ALLOW_DIRTY_REPO=0 ALLOW_ARTIFACT_SOURCE_MISMATCH=0 TRAINING_PACKAGE_VERSION= ASSET_DATE=$(date -u +%Y%m%d) MODE=dry-run PROCESSING_VARIANTS="no_flank with_flanks" while [ $# -gt 0 ]; do case "$1" in --run-dir) RUN_DIR=$2 shift 2 ;; --release) RELEASE=$2 shift 2 ;; --github-release) GITHUB_RELEASE=$2 shift 2 ;; --assets-dir) ASSETS_DIR=$2 shift 2 ;; --date) ASSET_DATE=$2 shift 2 ;; --processing-variants) PROCESSING_VARIANTS=$2 shift 2 ;; --repo) REPO=$2 shift 2 ;; --allow-dirty-repo) ALLOW_DIRTY_REPO=1 shift ;; --allow-artifact-source-mismatch) ALLOW_ARTIFACT_SOURCE_MISMATCH=1 shift ;; --training-package-version) TRAINING_PACKAGE_VERSION=$2 shift 2 ;; --package-only) MODE=package-only shift ;; --dry-run) MODE=dry-run shift ;; --draft) MODE=draft shift ;; --publish) MODE=publish shift ;; --mode) case "$2" in dry-run|package-only|draft|publish) MODE=$2 ;; *) die "--mode must be one of: dry-run, package-only, draft, publish" ;; esac shift 2 ;; -h|--help) usage exit 0 ;; *) die "Unknown argument: $1" ;; esac done [ -n "$RUN_DIR" ] || die "--run-dir is required" [ -n "$RELEASE" ] || die "--release is required" if [ -z "$GITHUB_RELEASE" ]; then GITHUB_RELEASE=$RELEASE fi if [ -z "$ASSETS_DIR" ]; then ASSETS_DIR="$RUN_DIR/release-assets" fi NORMALIZED_PROCESSING_VARIANTS= for kind in $PROCESSING_VARIANTS; do case "$kind" in no_flank|with_flanks|short_flanks) ;; *) die "--processing-variants contains unsupported variant: $kind" ;; esac case " $NORMALIZED_PROCESSING_VARIANTS " in *" $kind "*) die "--processing-variants contains duplicate variant: $kind" ;; esac NORMALIZED_PROCESSING_VARIANTS="${NORMALIZED_PROCESSING_VARIANTS:+$NORMALIZED_PROCESSING_VARIANTS }$kind" done PROCESSING_VARIANTS=$NORMALIZED_PROCESSING_VARIANTS case " $PROCESSING_VARIANTS " in *" no_flank "*) ;; *) die "--processing-variants must include no_flank" ;; esac case " $PROCESSING_VARIANTS " in *" with_flanks "*) ;; *) die "--processing-variants must include with_flanks" ;; esac require_dir "$RUN_DIR" RUN_DIR=$(cd "$RUN_DIR" && pwd) case "$ASSETS_DIR" in /*) ;; *) ASSETS_DIR="$(pwd)/$ASSETS_DIR" ;; esac ASSETS_DIR=${ASSETS_DIR%/} AFFINITY_DIR="$RUN_DIR/affinity" PROCESSING_DIR="$RUN_DIR/processing" PRESENTATION_DIR="$RUN_DIR/presentation" AFFINITY_MODELS="$AFFINITY_DIR/models.combined" PRESENTATION_MODELS="$PRESENTATION_DIR/models" PAN_ASSET="models_class1_pan.selected.${ASSET_DATE}.tar.bz2" PROCESSING_ASSET="models_class1_processing.selected.${ASSET_DATE}.tar.bz2" PRESENTATION_ASSET="models_class1_presentation.${ASSET_DATE}.tar.bz2" SHA_FILE="SHA256SUMS" SNIPPET_FILE="downloads.${RELEASE}.snippet.yml" RELEASE_NOTES_FILE="$REPO/RELEASE_NOTES_${RELEASE}.md" require_command tar require_command python3 if [ "$MODE" = "draft" ] || [ "$MODE" = "publish" ]; then require_command gh fi PROVENANCE_ARGS=( python3 "$REPO/scripts/release/validate_release_provenance.py" --repo "$REPO" --run-dir "$RUN_DIR" --release "$RELEASE" --processing-variants "$PROCESSING_VARIANTS" --require-artifacts ) if [ "$ALLOW_DIRTY_REPO" = "1" ]; then PROVENANCE_ARGS+=(--allow-dirty-repo) fi if [ "$ALLOW_ARTIFACT_SOURCE_MISMATCH" = "1" ]; then PROVENANCE_ARGS+=(--allow-artifact-source-mismatch) fi if [ -n "$TRAINING_PACKAGE_VERSION" ]; then PROVENANCE_ARGS+=(--training-package-version "$TRAINING_PACKAGE_VERSION") fi # Keep validation before any archive construction. PROVENANCE_JSON=$("${PROVENANCE_ARGS[@]}") require_dir "$AFFINITY_MODELS" require_file "$AFFINITY_MODELS/manifest.csv" require_one_file "affinity percent ranks" \ "$AFFINITY_MODELS/percent_ranks.csv" \ "$AFFINITY_MODELS/percent_ranks.csv.bz2" \ "$AFFINITY_MODELS/percent_ranks.json" PROCESSING_ARCHIVE_DIRS=() for kind in $PROCESSING_VARIANTS; do processing_models="$PROCESSING_DIR/models.selected.$kind" require_dir "$processing_models" require_file "$processing_models/manifest.csv" PROCESSING_ARCHIVE_DIRS+=("models.selected.$kind") done require_dir "$PRESENTATION_MODELS" require_file "$PRESENTATION_MODELS/weights.csv" require_one_file "presentation percent ranks" \ "$PRESENTATION_MODELS/percent_ranks.csv" \ "$PRESENTATION_MODELS/percent_ranks.csv.bz2" \ "$PRESENTATION_MODELS/percent_ranks.json" note "Release: $RELEASE" note "GitHub release: $GITHUB_RELEASE" note "Run directory: $RUN_DIR" note "Assets directory: $ASSETS_DIR" note "Mode: $MODE" note "Processing: $PROCESSING_VARIANTS" note "" note "Assets:" note " $PAN_ASSET" note " $PROCESSING_ASSET" note " $PRESENTATION_ASSET" if [ "$MODE" = "dry-run" ]; then note "" note "Dry run only. Commands that would run:" note "Selected inference copies are staged before the tar commands below." quote_cmd mkdir -p "$ASSETS_DIR" quote_cmd tar --no-xattrs -C "$AFFINITY_DIR" -cjf "$ASSETS_DIR/$PAN_ASSET" models.combined quote_cmd tar --no-xattrs -C "$PROCESSING_DIR" -cjf "$ASSETS_DIR/$PROCESSING_ASSET" \ "${PROCESSING_ARCHIVE_DIRS[@]}" quote_cmd tar --no-xattrs -C "$PRESENTATION_DIR" -cjf "$ASSETS_DIR/$PRESENTATION_ASSET" models quote_cmd gh release upload "$GITHUB_RELEASE" \ "$ASSETS_DIR/$PAN_ASSET" \ "$ASSETS_DIR/$PROCESSING_ASSET" \ "$ASSETS_DIR/$PRESENTATION_ASSET" \ "$ASSETS_DIR/$SHA_FILE" \ --clobber exit 0 fi mkdir -p "$ASSETS_DIR" printf '%s\n' "$PROVENANCE_JSON" > "$ASSETS_DIR/provenance.json" STAGING_DIR=$(mktemp -d "${TMPDIR:-/tmp}/mhcflurry-export.XXXXXX") trap 'rm -rf "$STAGING_DIR"' EXIT python3 "$SCRIPT_DIR/export_inference_models.py" "$AFFINITY_MODELS" "$STAGING_DIR/affinity/models.combined" python3 "$SCRIPT_DIR/export_inference_models.py" "$PRESENTATION_MODELS" "$STAGING_DIR/presentation/models" for kind in $PROCESSING_VARIANTS; do python3 "$SCRIPT_DIR/export_inference_models.py" \ "$PROCESSING_DIR/models.selected.$kind" "$STAGING_DIR/processing/models.selected.$kind" done AFFINITY_DIR="$STAGING_DIR/affinity" PROCESSING_DIR="$STAGING_DIR/processing" PRESENTATION_DIR="$STAGING_DIR/presentation" tar --no-xattrs -C "$AFFINITY_DIR" -cjf "$ASSETS_DIR/$PAN_ASSET" models.combined tar --no-xattrs -C "$PROCESSING_DIR" -cjf "$ASSETS_DIR/$PROCESSING_ASSET" \ "${PROCESSING_ARCHIVE_DIRS[@]}" tar --no-xattrs -C "$PRESENTATION_DIR" -cjf "$ASSETS_DIR/$PRESENTATION_ASSET" models ( cd "$ASSETS_DIR" checksum_assets "$PAN_ASSET" "$PROCESSING_ASSET" "$PRESENTATION_ASSET" \ > "$SHA_FILE" ) cat > "$ASSETS_DIR/$SNIPPET_FILE" </dev/null 2>&1; then RELEASE_NOTES_ARGS=(--notes "") if [ -f "$RELEASE_NOTES_FILE" ]; then RELEASE_NOTES_ARGS=(--notes-file "$RELEASE_NOTES_FILE") fi gh release create "$GITHUB_RELEASE" --draft \ --title "MHCflurry $RELEASE" "${RELEASE_NOTES_ARGS[@]}" fi elif [ "$MODE" = "publish" ]; then gh release view "$GITHUB_RELEASE" >/dev/null 2>&1 || \ die "--publish requires an existing GitHub release: $GITHUB_RELEASE" else die "Unsupported mode: $MODE" fi gh release upload "$GITHUB_RELEASE" \ "$ASSETS_DIR/$PAN_ASSET" \ "$ASSETS_DIR/$PROCESSING_ASSET" \ "$ASSETS_DIR/$PRESENTATION_ASSET" \ "$ASSETS_DIR/$SHA_FILE" \ "$ASSETS_DIR/provenance.json" \ --clobber note "" note "Wrote:" note " $ASSETS_DIR/$SHA_FILE" note " $ASSETS_DIR/$SNIPPET_FILE" mhcflurry-2.3.6/scripts/release/export_inference_models.py000066400000000000000000000100401525677230600241300ustar00rootroot00000000000000#!/usr/bin/env python3 """Copy a selected predictor for distribution without training checkpoints.""" import argparse import csv import hashlib import json from pathlib import Path import shutil import sys csv.field_size_limit(sys.maxsize) def export_models(source, destination): """Preserve prediction inputs and audit tables; omit unused network states. The source is never modified. Each exported manifest records the digest of its original and the checkpoint-only columns removed for inference loading. Active NPZ files are copied byte-for-byte and must all exist. """ source, destination = Path(source).resolve(), Path(destination) if destination.exists(): raise ValueError("Export destination already exists: %s" % destination) if source == destination.resolve() or source in destination.resolve().parents: raise ValueError("Export destination must be outside the source") records = [] def copy_directory(src, dst): dst.mkdir(parents=True) manifest = src / "manifest.csv" selected = None if manifest.exists(): with manifest.open(newline="") as stream: reader = csv.DictReader(stream) fields = reader.fieldnames rows = list(reader) if not fields or "model_name" not in fields or not rows: raise ValueError("Empty or invalid model manifest: %s" % manifest) names = [row["model_name"] for row in rows] if len(set(names)) != len(names) or any( not name or Path(name).name != name or "\\" in name for name in names): raise ValueError("Invalid or duplicate model name: %s" % manifest) selected = {"weights_%s.npz" % name for name in names} missing = sorted(name for name in selected if not (src / name).is_file()) if missing: raise ValueError("Missing selected weights in %s: %s" % (src, missing)) removed = [f for f in fields if f.startswith("checkpoint_") and f.endswith("_weights")] with (dst / "manifest.csv").open("w", newline="") as stream: writer = csv.DictWriter(stream, fieldnames=[f for f in fields if f not in removed], extrasaction="ignore") writer.writeheader() writer.writerows(rows) records.append({ "manifest": str(manifest.relative_to(source)), "source_sha256": hashlib.sha256(manifest.read_bytes()).hexdigest(), "exported_sha256": hashlib.sha256((dst / "manifest.csv").read_bytes()).hexdigest(), "removed_checkpoint_columns": removed, "selected_weights": sorted(selected), }) for item in sorted(src.iterdir()): if item.is_symlink(): raise ValueError("Symlinks are not supported in model exports: %s" % item) if item.name == "manifest.csv" and selected is not None: continue if item.name == "checkpoints": continue if selected is not None and item.name.startswith("weights_") and item.suffix == ".npz" and item.name not in selected: continue if item.is_dir(): copy_directory(item, dst / item.name) else: shutil.copy2(item, dst / item.name) try: copy_directory(source, destination) (destination / "inference_export.json").write_text(json.dumps({ "format": 1, "description": "Selected inference weights; original training metadata retained.", "manifests": records, }, indent=2) + "\n") except Exception: shutil.rmtree(destination, ignore_errors=True) raise def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("source") parser.add_argument("destination") args = parser.parse_args() export_models(args.source, args.destination) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/release/retrain_evaluate_deploy.sh000077500000000000000000003514701525677230600241400ustar00rootroot00000000000000#!/usr/bin/env bash # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set -euo pipefail usage() { cat <<'EOF' Implementation engine for mhcflurry train pan-allele-release. Usage: mhcflurry train pan-allele-release \ --run-dir /path/to/release-run \ --release 2.3.0 \ [--backend local|brev-existing|brev-provision|ssh] \ [--release-profile full|final-2.3.0-candidate|final-2.3.0-candidate-v2|fast-8xa100|minimal-processing|fast-minimal] \ [--random-seed 42] \ [--minibatch-size 128] \ [--affinity-minibatch-size 128] \ [--affinity-optimizer-implementation keras|pytorch] \ [--affinity-lsuv-target post_activation|pre_activation] \ [--affinity-init glorot_uniform|glorot_normal|he_uniform|he_normal|orthogonal] \ [--affinity-max-workers-per-gpu auto] \ [--processing-minibatch-size 512] \ [--processing-num-jobs auto] \ [--processing-max-workers-per-gpu auto] \ [--processing-held-out-samples 10] \ [--processing-variants "with_flanks no_flank short_flanks"] \ [--processing-short-flank-boundary-radius 0] \ [--presentation-processing-with-flanks-kind short_flanks] \ [--presentation-decoys-per-hit 2] \ [--presentation-sample-fraction 0.1] \ [--presentation-feature-chunk-size 250000] \ [--presentation-num-jobs auto] \ [--presentation-max-workers-per-gpu 1] \ [--presentation-calibration-num-jobs auto] \ [--presentation-calibration-max-workers-per-gpu auto] \ [--presentation-calibration-prediction-batch-size auto] \ [--compare-presentation-num-jobs 1] \ [--compare-presentation-max-workers-per-gpu 1] \ [--compare-presentation-torch-compile 0] \ [--eval-max-benchmark-files N] \ [--compare-baseline public:2.2.0] \ [--compare-baseline-label "MHCflurry 2.2"] \ [--compare-gpus auto|N] \ [--brev-instance NAME] [--brev-on-finish leave|stop|delete] \ [--brev-provider auto|gcp|denvr|denvr-80gb] \ [--brev-stop-failure-action warn|delete] \ [--brev-cleanup-timeout-seconds 60] \ [--brev-create-timeout-seconds 2400] \ [--brev-container-image pytorch/pytorch:2.4.0-cuda12.1-cudnn9-runtime] \ [--brev-sync-mode release|full] \ [--paper-figures-scores-dir DIR] \ [--paper-figures-multiallelic-predictions FILE] \ [--paper-figures-monoallelic-predictions FILE] \ [--paper-figures-prepare-command COMMAND] \ [--brev-instance-type TYPE] \ [--no-sync-remote-output] \ [--allow-dirty-repo] \ [--skip-train] [--skip-eval] [--skip-plots] \ [--deploy-mode none|dry-run|draft|publish] Backends: local Run scripts/training/pan_allele_release_full.sh here. brev-existing Run on a named existing Brev instance. Requires --brev-instance. A missing instance is an error. brev-provision Provision a named Brev instance if it does not exist, then run the same remote training job. If --brev-instance is omitted, this script generates a run-specific name. By default runplz chooses an A100 machine matching the launcher resource requirements; pass --brev-instance-type to pin a specific Brev shape for reproducibility or price control. The release wrapper owns artifact sync and cleanup; runplz is asked to leave the instance up until those steps finish. --brev-provider is a convenience alias for common release shapes: auto delegates to runplz price/availability selection, gcp pins the old 4xA100 GCP shape, and denvr / denvr-80gb pin the cheaper 8xA100 Denvr shapes when available. ssh Run on a specific remote host, then rsync the run directory back. Requires --remote, --remote-repo, and --remote-run-dir. Authentication is whatever your local ssh/rsync configuration uses, typically SSH keys or an SSH config Host entry. Remote output: --no-sync-remote-output intentionally leaves newly trained artifacts on the remote machine. It is a training-only mode and therefore requires --skip-eval, --skip-plots, and --deploy-mode none. SSH and Brev artifacts are still provenance-validated remotely before this command succeeds. Release profiles: full Default. Train all release processing artifacts on the configured backend/provider. final-2.3.0-candidate Frozen decision set from the 2.3.0 screens: affinity mb1024/PyTorch RMSprop/pre-LSUV/Glorot, processing mb512 with all three legacy context grids, and a radius-5 cleavage-boundary family blended 50/50 with selected 5-aa models for presentation. All affinity fits retain both terminal and best checkpoints. final-2.3.0-candidate-v2 final-2.3.0-candidate with the 5-aa legacy grid replaced by the confirmed single ranking candidate (native RMSprop, width 13, inner-best-AP checkpoints). All other decisions and processing variants are unchanged. fast-8xa100 For throughput runs on 8xA100 / 80 GB machines. When provisioning Brev and no provider/type was explicitly set, request the Denvr 8xA100 80 GB shape. Worker packing still uses the normal auto resolver unless explicitly overridden. minimal-processing Train only with_flanks and no_flank processing artifacts and evaluate only those processing modes. Use this only when the short_flanks processing artifact is intentionally out of scope for the run. fast-minimal Apply fast-8xa100 and minimal-processing together. Evaluation: After training, the script runs: mhcflurry eval compare-models --a RUN_DIR --b COMPARE_BASELINE mhcflurry eval plot-comparison --input RUN_DIR/eval_comparison compare-models writes release_summary.csv and release_summary.md with affinity, processing, and presentation release-gate tables. Presentation inference is memory-heavier than affinity/processing, so the release wrapper defaults it to one GPU worker unless overridden. The default baseline is the current pre-2.3 public release in downloads.yml, public:2.2.0; pass --compare-baseline public to compare against the currently configured public release, or pass a model-run directory / public:. When affinity is included, the workflow also writes RUN_DIR/eval_comparison_train_excluded_affinity using the official models.no_additional_ms predictor and its matching train-excluded benchmark. This is the generalization gate; a production-release comparison may overlap historical training data and is retained only for descriptive continuity. --eval-max-benchmark-files limits each evaluation benchmark family to the first N benchmark input CSV files. It is intended only for smoke proofs that the end-to-end command wiring works. The plotting step also renders publication-style SVG/PDF/PNG panels under RUN_DIR/eval_comparison/plots/paper_figures/. By default those panels use the current compare-models output as their score directory. Pass --paper-figures-scores-dir or a saved prediction table to add external predictor score tables or other paper-figure inputs. External predictors such as NetMHCpan and MixMHCpred are not run by MHCflurry. To keep a one-line remote-training launch, pass --paper-figures-prepare-command COMMAND. The command runs locally on the control machine while remote training is active and should write canonical saved prediction tables or score caches to the path supplied through --paper-figures-scores-dir / --paper-figures-*-predictions. When local paper inputs are requested during a full Brev run, the wrapper waits for those inputs after training sync, stages them to the Brev machine, renders paper-ready figures remotely, syncs the PDFs/plots back, then cleans up. For NetMHCpan/MixMHCpred via mhctools, use the optional subprocess adapter: mhcflurry eval paper-figures external-predictors Deployment: Deployment is opt-in. By default --deploy-mode is none and the final deploy_trained_models.sh step is skipped. Pass --deploy-mode dry-run to validate and print release assets without uploading, or pass draft / publish for upload modes. The legacy --skip-deploy flag is accepted as a no-op for old automation; new workflows should omit it. Logs: The wrapper writes per-step logs and a status table under: RUN_DIR/workflow_logs/ Brev sync defaults to release mode: final selected model directories plus runplz events, training/eval logs, component comparison predictions, plots, GPU telemetry, and generated configs. Use --brev-sync-mode full only for full post-mortem copies of all candidate pools and intermediate CSVs. Postprocess-only Brev runs: With --backend brev-provision --skip-train, the wrapper can provision a temporary Brev machine, copy the final selected model artifacts from RUN_DIR, run compare-models / plot-model-comparison remotely, sync summary tables and figures back, and then apply --brev-on-finish. It does not upload the full training run or row-level prediction CSVs. EOF } die() { echo "ERROR: $*" >&2 exit 2 } note() { echo "$*" >&2 } warn() { echo "WARNING: $*" >&2 } require_command() { command -v "$1" >/dev/null 2>&1 || die "Required command not found: $1" } require_clean_runplz() { local runplz_executable local runplz_shebang local -a runplz_python runplz_executable="$(command -v runplz)" || \ die "Required command not found: runplz" IFS= read -r runplz_shebang < "$runplz_executable" || \ die "Could not read runplz executable: $runplz_executable" case "$runplz_shebang" in '#!'*) ;; *) die "runplz executable has no interpreter shebang: $runplz_executable" ;; esac read -r -a runplz_python <<< "${runplz_shebang#\#!}" [ "${#runplz_python[@]}" -gt 0 ] || \ die "Could not resolve the runplz interpreter: $runplz_executable" "${runplz_python[@]}" \ "$SCRIPT_DIR/validate_runplz_provenance.py" \ --executable "$runplz_executable" \ --required-version "$RUNPLZ_REQUIRED_VERSION" || \ die "runplz $RUNPLZ_REQUIRED_VERSION from PyPI or a clean checkout is required" } validate_release_provenance() { local step="$1" local require_artifacts="$2" local args=( python3 "$SCRIPT_DIR/validate_release_provenance.py" --repo "$REPO" --run-dir "$RUN_DIR" --release "$RELEASE" --workflow-id "$WORKFLOW_RUN_ID" --processing-variants "$PROCESSING_VARIANTS" --out "$RUN_DIR/release_provenance.json" ) if [ "$require_artifacts" = "1" ]; then args+=(--require-artifacts) if [ "$SKIP_TRAIN" != "1" ]; then args+=(--expected-artifact-workflow-id "$WORKFLOW_RUN_ID") fi fi if [ "$ALLOW_DIRTY_REPO" = "1" ]; then args+=(--allow-dirty-repo) fi if [ "$require_artifacts" = "1" ] && [ "$SKIP_TRAIN" = "1" ]; then args+=(--allow-artifact-source-mismatch) fi run_logged_step "$step" "${args[@]}" } validate_ssh_remote_release_provenance() { local args=( python3 "$REMOTE_REPO/scripts/release/validate_release_provenance.py" --repo "$REMOTE_REPO" --run-dir "$REMOTE_RUN_DIR" --release "$RELEASE" --workflow-id "$WORKFLOW_RUN_ID" --processing-variants "$PROCESSING_VARIANTS" --out "$REMOTE_RUN_DIR/release_provenance.json" --require-artifacts --expected-artifact-workflow-id "$WORKFLOW_RUN_ID" ) if [ "$ALLOW_DIRTY_REPO" = "1" ]; then args+=(--allow-dirty-repo) fi local arg local remote_command= for arg in "${args[@]}"; do if [ -n "$remote_command" ]; then remote_command="$remote_command " fi remote_command="$remote_command$(shell_quote "$arg")" done run_logged_step ssh_model_provenance ssh "$REMOTE" "$remote_command" } lowercase() { printf '%s' "$1" | tr '[:upper:]' '[:lower:]' } display_release_version() { printf '%s' "$1" | sed 's/[.-]\{0,1\}rc[0-9][0-9]*$//' } public_release_from_spec() { case "$1" in public:*) printf '%s\n' "${1#public:}" ;; esac } fetch_pinned_public_baseline_downloads() { local release release="$(public_release_from_spec "$COMPARE_BASELINE")" if [ -z "$release" ]; then return 0 fi MHCFLURRY_DOWNLOADS_CURRENT_RELEASE="$release" \ mhcflurry-downloads fetch \ models_class1_pan models_class1_processing models_class1_presentation } normalize_compare_torch_compile() { local value="${1:-auto}" case "$(lowercase "$value")" in auto) printf 'auto\n' ;; 1|true|yes|on) printf '1\n' ;; 0|false|no|off) printf '0\n' ;; *) die "COMPARE_TORCH_COMPILE must be auto, true/false, or 1/0; got '$value'" ;; esac } normalize_compare_matmul_precision() { local value="${1:-high}" local normalized normalized="$(lowercase "$value")" case "$normalized" in none|highest|high|medium) printf '%s\n' "$normalized" ;; *) die "COMPARE_MATMUL_PRECISION must be one of none, highest, high, medium; got '$value'" ;; esac } validate_compare_gpus() { local value="${1:-auto}" if [ "$(lowercase "$value")" = "auto" ]; then return 0 fi case "$value" in ''|*[!0-9]*) die "COMPARE_GPUS must be auto or a non-negative integer; got '$value'" ;; esac } validate_positive_integer() { local option=$1 local value=$2 if ! [[ "$value" =~ ^[1-9][0-9]*$ ]]; then die "$option must be a positive integer; got '$value'" fi } validate_nonnegative_integer() { local option=$1 local value=$2 if ! [[ "$value" =~ ^[0-9]+$ ]]; then die "$option must be a non-negative integer; got '$value'" fi } validate_auto_or_nonnegative_integer() { local option=$1 local value=$2 if [ "$(lowercase "$value")" != "auto" ]; then validate_nonnegative_integer "$option" "$value" fi } validate_auto_or_positive_integer() { local option=$1 local value=$2 if [ "$(lowercase "$value")" != "auto" ]; then validate_positive_integer "$option" "$value" fi } validate_positive_number() { local option=$1 local value=$2 if ! [[ "$value" =~ ^([0-9]+([.][0-9]*)?|[.][0-9]+)([eE][+-]?[0-9]+)?$ ]] || \ ! awk -v value="$value" 'BEGIN { exit !(value > 0) }'; then die "$option must be a finite positive number; got '$value'" fi } validate_fraction() { local option=$1 local value=$2 validate_positive_number "$option" "$value" if ! awk -v value="$value" 'BEGIN { exit !(value <= 1) }'; then die "$option must be no greater than 1; got '$value'" fi } brev_provider_instance_type() { case "$(lowercase "$1")" in auto|'') printf '\n' ;; gcp) printf 'a2-highgpu-4g:nvidia-tesla-a100:4\n' ;; denvr) printf 'denvr_A100_sxm4x8\n' ;; denvr-80gb) printf 'denvr_A100_sxm4_80Gx8\n' ;; *) die "--brev-provider must be one of: auto, gcp, denvr, denvr-80gb" ;; esac } apply_fast_gpu_profile() { if [ "$BACKEND" = "brev-provision" ] && \ [ "$BREV_PROVIDER_EXPLICIT" = "0" ] && \ [ "$BREV_INSTANCE_TYPE_EXPLICIT" = "0" ]; then BREV_PROVIDER=denvr-80gb fi } apply_minimal_processing_profile() { if [ "$PROCESSING_VARIANTS_EXPLICIT" = "0" ]; then PROCESSING_VARIANTS="with_flanks no_flank" fi if [ "$PROCESSING_MODES_EXPLICIT" = "0" ]; then PROCESSING_MODES="with_flanks,no_flank" fi if [ "$PRESENTATION_PROCESSING_WITH_FLANKS_KIND_EXPLICIT" = "0" ]; then PRESENTATION_PROCESSING_WITH_FLANKS_KIND=with_flanks fi } apply_release_profile() { case "$RELEASE_PROFILE" in full) ;; final-2.3.0-candidate) apply_final_230_candidate_recipe ;; final-2.3.0-candidate-v2) apply_final_230_candidate_v2_recipe ;; fast-8xa100) apply_fast_gpu_profile ;; minimal-processing) apply_minimal_processing_profile ;; fast-minimal) apply_fast_gpu_profile apply_minimal_processing_profile ;; *) die "--release-profile must be one of: full, final-2.3.0-candidate, final-2.3.0-candidate-v2, fast-8xa100, minimal-processing, fast-minimal" ;; esac } processing_variant_requested() { case " $PROCESSING_VARIANTS " in *" $1 "*) return 0 ;; *) return 1 ;; esac } validate_processing_configuration() { local derived_modes= local mode local modes_list local modes_seen=0 local seen_modes=" " local seen_variants=" " local variant validate_nonnegative_integer \ "--processing-short-flank-boundary-radius" \ "$PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS" if [ "$PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS" -gt 15 ]; then die "--processing-short-flank-boundary-radius must be no greater than 15" fi for variant in $PROCESSING_VARIANTS; do case "$variant" in with_flanks|no_flank|short_flanks) ;; *) die "Unknown --processing-variants entry: $variant" ;; esac case "$seen_variants" in *" $variant "*) die "Duplicate --processing-variants entry: $variant" ;; esac seen_variants="$seen_variants$variant " if [ -n "$derived_modes" ]; then derived_modes="$derived_modes,$variant" else derived_modes=$variant fi done [ -n "$derived_modes" ] || \ die "--processing-variants must contain at least one variant" if [ "$PROCESSING_MODES_EXPLICIT" = "0" ]; then PROCESSING_MODES=$derived_modes fi case "$PROCESSING_MODES" in ,*|*,|*,,*) die "--processing-modes contains an empty entry" ;; esac modes_list=$(printf '%s' "$PROCESSING_MODES" | tr ',' ' ') for mode in $modes_list; do modes_seen=1 case "$mode" in with_flanks|no_flank|short_flanks) ;; *) die "Unknown --processing-modes entry: $mode" ;; esac case "$seen_modes" in *" $mode "*) die "Duplicate --processing-modes entry: $mode" ;; esac seen_modes="$seen_modes$mode " processing_variant_requested "$mode" || die \ "--processing-modes requests '$mode', but --processing-variants does not train it" done [ "$modes_seen" = "1" ] || \ die "--processing-modes must contain at least one mode" if [ "$SKIP_TRAIN" != "1" ]; then processing_variant_requested no_flank || die \ "--processing-variants must include no_flank for presentation training" case "$PRESENTATION_PROCESSING_WITH_FLANKS_KIND" in with_flanks|short_flanks) ;; *) die "--presentation-processing-with-flanks-kind must be with_flanks or short_flanks" ;; esac processing_variant_requested \ "$PRESENTATION_PROCESSING_WITH_FLANKS_KIND" || die \ "--processing-variants must include the presentation with-flanks variant '$PRESENTATION_PROCESSING_WITH_FLANKS_KIND'" if [ "$PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS" -ne 0 ]; then processing_variant_requested short_flanks || die \ "--processing-short-flank-boundary-radius requires short_flanks" [ "$PRESENTATION_PROCESSING_WITH_FLANKS_KIND" = short_flanks ] || \ die "--processing-short-flank-boundary-radius requires short_flanks presentation processing" fi fi if [ "$DEPLOY_MODE" != "none" ]; then processing_variant_requested with_flanks || die \ "--deploy-mode $DEPLOY_MODE requires the canonical with_flanks processing artifact" fi } paper_figure_inputs_requested() { [ -n "$PAPER_FIGURES_SCORES_DIR" ] || \ [ -n "$PAPER_FIGURES_ARTIFACTS_DIR" ] || \ [ -n "$PAPER_FIGURES_MULTIALLELIC_PREDICTIONS" ] || \ [ -n "$PAPER_FIGURES_MONOALLELIC_PREDICTIONS" ] } format_command() { local arg for arg in "$@"; do printf ' %q' "$arg" done } workflow_timestamp() { date -u +"%Y-%m-%dT%H:%M:%SZ" } record_workflow_event() { local step="$1" local status="$2" shift 2 || true if [ "${DRY_RUN:-0}" = "1" ]; then return 0 fi if [ -z "${WORKFLOW_STATUS_LOG:-}" ]; then return 0 fi printf '%s\t%s\t%s\t%s\n' \ "$(workflow_timestamp)" \ "$step" \ "$status" \ "$*" >> "$WORKFLOW_STATUS_LOG" } run_cmd() { printf '+' format_command "$@" printf '\n' if [ "$DRY_RUN" != "1" ]; then "$@" fi } run_logged_step() { local step="$1" local log_file="$WORKFLOW_LOG_DIR/$step.log" local errexit_was_set=0 case "$-" in *e*) errexit_was_set=1 ;; esac shift run_cmd mkdir -p "$WORKFLOW_LOG_DIR" record_workflow_event "$step" start \ "log=$log_file command=$(format_command "$@")" if [ "$DRY_RUN" = "1" ]; then run_cmd "$@" record_workflow_event "$step" 0 "dry-run log=$log_file" return 0 fi { printf '[%s] start step=%s command=' "$(workflow_timestamp)" "$step" format_command "$@" printf '\n' } | tee -a "$log_file" >&2 set +e ( set -o pipefail "$@" 2>&1 | tee -a "$log_file" ) local status=$? if [ "$errexit_was_set" = "1" ]; then set -e else set +e fi { printf '[%s] end step=%s status=%s\n' \ "$(workflow_timestamp)" "$step" "$status" } | tee -a "$log_file" >&2 record_workflow_event "$step" "$status" "log=$log_file" return "$status" } shell_quote() { printf "'%s'" "$(printf '%s' "$1" | sed "s/'/'\\\\''/g")" } verify_ssh_remote_checkout() { local check_script local remote_command check_script='set -eu remote_repo=$1 expected_commit=$2 allow_dirty=$3 actual_commit=$(git -C "$remote_repo" rev-parse HEAD) if [ "$actual_commit" != "$expected_commit" ]; then printf "ERROR: remote checkout commit %s does not match local release commit %s: %s\n" "$actual_commit" "$expected_commit" "$remote_repo" >&2 exit 2 fi if [ "$allow_dirty" != "1" ]; then dirty=$(git -C "$remote_repo" status --porcelain --untracked-files=no) if [ -n "$dirty" ]; then printf "ERROR: remote checkout has tracked changes: %s\n" "$remote_repo" >&2 printf "%s\n" "$dirty" >&2 exit 2 fi fi printf "Verified remote source provenance: commit=%s repo=%s\n" "$actual_commit" "$remote_repo"' remote_command="bash -c $(shell_quote "$check_script") _" remote_command="$remote_command $(shell_quote "$REMOTE_REPO")" remote_command="$remote_command $(shell_quote "$RELEASE_GIT_COMMIT")" remote_command="$remote_command $(shell_quote "$ALLOW_DIRTY_REPO")" run_logged_step ssh_source_provenance ssh "$REMOTE" "$remote_command" } run_with_timeout() { local timeout_seconds="$1" shift python3 - "$timeout_seconds" "$@" <<'PY' import subprocess import sys timeout_seconds = float(sys.argv[1]) command = sys.argv[2:] try: result = subprocess.run(command, timeout=timeout_seconds) except subprocess.TimeoutExpired: print( "Command timed out after %.0f seconds: %s" % ( timeout_seconds, " ".join(command), ), file=sys.stderr, ) raise SystemExit(124) raise SystemExit(result.returncode) PY } run_logged_step_with_timeout() { local step="$1" local timeout_seconds="$2" shift 2 run_logged_step "$step" run_with_timeout "$timeout_seconds" "$@" } start_paper_figures_prepare() { if [ -z "${PAPER_FIGURES_PREPARE_COMMAND:-}" ]; then return 0 fi if [ "${PAPER_FIGURES_PREPARE_DONE:-0}" = "1" ] || \ [ -n "${PAPER_FIGURES_PREPARE_PID:-}" ]; then return 0 fi local step=paper_figures_prepare local log_file="$WORKFLOW_LOG_DIR/$step.log" run_cmd mkdir -p "$WORKFLOW_LOG_DIR" record_workflow_event "$step" start \ "background=1 log=$log_file command=$PAPER_FIGURES_PREPARE_COMMAND" if [ "$DRY_RUN" = "1" ]; then run_cmd bash -lc "$PAPER_FIGURES_PREPARE_COMMAND" record_workflow_event "$step" 0 "dry-run log=$log_file" PAPER_FIGURES_PREPARE_DONE=1 return 0 fi { printf '[%s] start step=%s background=1 command=%s\n' \ "$(workflow_timestamp)" "$step" "$PAPER_FIGURES_PREPARE_COMMAND" } | tee -a "$log_file" >&2 ( set -o pipefail bash -lc "$PAPER_FIGURES_PREPARE_COMMAND" 2>&1 | tee -a "$log_file" exit "${PIPESTATUS[0]}" ) & PAPER_FIGURES_PREPARE_PID=$! note "Started local paper-figure input preparation as PID $PAPER_FIGURES_PREPARE_PID." } wait_paper_figures_prepare() { if [ -z "${PAPER_FIGURES_PREPARE_COMMAND:-}" ]; then return 0 fi if [ "${PAPER_FIGURES_PREPARE_DONE:-0}" = "1" ]; then return 0 fi if [ -z "${PAPER_FIGURES_PREPARE_PID:-}" ]; then return 0 fi local step=paper_figures_prepare local log_file="$WORKFLOW_LOG_DIR/$step.log" local errexit_was_set=0 local status case "$-" in *e*) errexit_was_set=1 ;; esac note "Waiting for local paper-figure input preparation (PID $PAPER_FIGURES_PREPARE_PID)." set +e wait "$PAPER_FIGURES_PREPARE_PID" status=$? if [ "$errexit_was_set" = "1" ]; then set -e else set +e fi PAPER_FIGURES_PREPARE_DONE=1 PAPER_FIGURES_PREPARE_PID= { printf '[%s] end step=%s status=%s\n' \ "$(workflow_timestamp)" "$step" "$status" } | tee -a "$log_file" >&2 record_workflow_event "$step" "$status" "log=$log_file" return "$status" } cleanup_background_jobs() { if [ -n "${PAPER_FIGURES_PREPARE_PID:-}" ] && \ [ "${PAPER_FIGURES_PREPARE_DONE:-0}" != "1" ]; then if kill -0 "$PAPER_FIGURES_PREPARE_PID" 2>/dev/null; then warn "Stopping unfinished paper-figure input preparation (PID $PAPER_FIGURES_PREPARE_PID)." kill "$PAPER_FIGURES_PREPARE_PID" 2>/dev/null || true wait "$PAPER_FIGURES_PREPARE_PID" 2>/dev/null || true fi fi } write_git_repo_archive() { local output="$1" local tar_output="${output%.bz2}" rm -f "$tar_output" "$output" || return $? git -C "$REPO" archive --format=tar HEAD -o "$tar_output" || return $? bzip2 -f "$tar_output" || return $? [ -s "$output" ] } run_dir_has_model_artifacts() { [ -d "$RUN_DIR/affinity/models.combined" ] || return 1 [ -d "$RUN_DIR/presentation/models" ] || return 1 local kind for kind in $PROCESSING_VARIANTS; do [ -d "$RUN_DIR/processing/models.selected.$kind" ] || return 1 done return 0 } run_dir_matches_workflow() { local marker="$RUN_DIR/.runplz/mhcflurry_release_workflow_id" [ -f "$marker" ] || return 1 [ "$(cat "$marker")" = "$WORKFLOW_RUN_ID" ] } run_dir_has_synced_brev_outputs() { run_dir_matches_workflow || return 1 run_dir_has_model_artifacts || return 1 [ -f "$RUN_DIR/release_holdout/policy.json" ] || return 1 [ -f "$RUN_DIR/release_holdout/validation.json" ] || return 1 if [ "${BREV_EXPECT_REMOTE_EVAL:-0}" = "1" ] && \ [ ! -d "$RUN_DIR/eval_comparison" ]; then return 1 fi if [ "${BREV_EXPECT_REMOTE_PLOTS:-0}" = "1" ] && \ [ ! -d "$RUN_DIR/eval_comparison/plots" ]; then return 1 fi return 0 } brev_latest_remote_workflow_id() { require_command brev local output output="$( run_with_timeout "$BREV_CLEANUP_TIMEOUT_SECONDS" brev exec "$BREV_INSTANCE" \ "bash -lc 'marker=\$(cat ~/runplz-latest/out/.runplz/mhcflurry_release_workflow_id 2>/dev/null || true); printf \"MHCFLURRY_WORKFLOW_ID=%s\\n\" \"\$marker\"'" \ 2>/dev/null || true )" printf '%s\n' "$output" | sed -n \ 's/^MHCFLURRY_WORKFLOW_ID=//p' \ | tail -1 } brev_latest_remote_exit_code() { require_command brev local output local expected expected="$(printf '%q' "$WORKFLOW_RUN_ID")" output="$( run_with_timeout "$BREV_CLEANUP_TIMEOUT_SECONDS" brev exec "$BREV_INSTANCE" \ "MHCFLURRY_RELEASE_WORKFLOW_ID=$expected bash -lc 'marker=\$(cat ~/runplz-latest/out/.runplz/mhcflurry_release_workflow_id 2>/dev/null || true); [ \"\$marker\" = \"\$MHCFLURRY_RELEASE_WORKFLOW_ID\" ] || exit 0; cat ~/runplz-latest/out/.runplz/mhcflurry_release_workflow_exit_code 2>/dev/null || true'" \ 2>/dev/null || true )" printf '%s\n' "$output" | sed -n \ 's/[^0-9]*\([0-9][0-9]*\).*/\1/p' \ | tail -1 } brev_instance_status() { require_command brev BREV_INSTANCE_NAME="$BREV_INSTANCE" \ BREV_CLEANUP_TIMEOUT_SECONDS="$BREV_CLEANUP_TIMEOUT_SECONDS" \ python3 - <<'PY' import json import os import subprocess import sys name = os.environ["BREV_INSTANCE_NAME"] timeout_seconds = float(os.environ["BREV_CLEANUP_TIMEOUT_SECONDS"]) try: result = subprocess.run( ["brev", "ls", "--json"], capture_output=True, check=True, text=True, timeout=timeout_seconds, ) except subprocess.TimeoutExpired: print( "brev ls --json timed out after %.0f seconds" % timeout_seconds, file=sys.stderr, ) raise SystemExit(124) except subprocess.CalledProcessError as exc: if exc.stderr: print(exc.stderr, file=sys.stderr, end="") raise SystemExit(exc.returncode) for item in json.loads(result.stdout or "[]"): if item.get("name") == name: print(item.get("status", "")) break PY } brev_instance_field() { require_command brev local field="$1" BREV_INSTANCE_NAME="$BREV_INSTANCE" \ BREV_INSTANCE_FIELD="$field" \ BREV_CLEANUP_TIMEOUT_SECONDS="$BREV_CLEANUP_TIMEOUT_SECONDS" \ python3 - <<'PY' import json import os import subprocess import sys name = os.environ["BREV_INSTANCE_NAME"] field = os.environ["BREV_INSTANCE_FIELD"] timeout_seconds = float(os.environ["BREV_CLEANUP_TIMEOUT_SECONDS"]) try: result = subprocess.run( ["brev", "ls", "--json"], capture_output=True, check=True, text=True, timeout=timeout_seconds, ) except subprocess.TimeoutExpired: print( "brev ls --json timed out after %.0f seconds" % timeout_seconds, file=sys.stderr, ) raise SystemExit(124) except subprocess.CalledProcessError as exc: if exc.stderr: print(exc.stderr, file=sys.stderr, end="") raise SystemExit(exc.returncode) for item in json.loads(result.stdout or "[]"): if item.get("name") == name: print(item.get(field, "")) break PY } wait_for_brev_shell_ready() { local attempt local status local shell_status local health_status for attempt in $(seq 1 "$BREV_SHELL_READY_ATTEMPTS"); do status="$(brev_instance_status || true)" shell_status="$(brev_instance_field shell_status || true)" health_status="$(brev_instance_field health_status || true)" note "Brev readiness check $attempt/$BREV_SHELL_READY_ATTEMPTS: status=${status:-unknown} shell=${shell_status:-unknown} health=${health_status:-unknown}" if [ "$status" = "RUNNING" ] && [ "$shell_status" = "READY" ]; then return 0 fi if [ "$status" = "FAILURE" ]; then return 1 fi sleep "$BREV_SHELL_READY_DELAY_SECONDS" done return 1 } build_brev_postprocess_archives() { local staging="$1" local remote_paper_inputs_root="$2" local remote_data_dir="$3" local repo_archive="$staging/repo.tar.bz2" local models_archive="$staging/model_artifacts.tar.bz2" local artifact_paths=( affinity/models.combined presentation/models release_holdout ) if [ "$SKIP_PLOTS" != "1" ]; then artifact_paths+=(affinity/models.unselected.combined) fi local kind for kind in $PROCESSING_VARIANTS; do artifact_paths+=("processing/models.selected.$kind") done run_cmd mkdir -p "$staging" run_logged_step postprocess_package_repo \ write_git_repo_archive "$repo_archive" run_logged_step postprocess_package_models \ tar -C "$RUN_DIR" -cjf "$models_archive" "${artifact_paths[@]}" build_brev_paper_input_archive "$staging" "$remote_paper_inputs_root" build_brev_data_dir_archive "$staging" "$remote_data_dir" } canonical_existing_path() { local path="$1" if [ -d "$path" ]; then (cd "$path" && pwd -P) else local dir local base dir="$(dirname "$path")" base="$(basename "$path")" printf '%s/%s\n' "$(cd "$dir" && pwd -P)" "$base" fi } same_existing_path() { local left="$1" local right="$2" if [ -z "$left" ] || [ -z "$right" ]; then return 1 fi if [ ! -e "$left" ] || [ ! -e "$right" ]; then return 1 fi [ "$(canonical_existing_path "$left")" = "$(canonical_existing_path "$right")" ] } stage_brev_paper_input() { local source="$1" local target_relative="$2" local input_dir="$3" local remote_root="$4" [ -e "$source" ] || die "Paper-figure input not found: $source" local target="$input_dir/$target_relative" rm -rf "$target" mkdir -p "$(dirname "$target")" if [ -d "$source" ]; then mkdir -p "$target" ( cd "$source" tar -cf - . ) | ( cd "$target" tar -xf - ) else cp "$source" "$target" fi printf '%s/%s\n' "$remote_root" "$target_relative" } build_brev_paper_input_archive() { local staging="$1" local remote_root="$2" local paper_input_dir="$staging/paper_inputs" local paper_archive="$staging/paper_inputs.tar.bz2" local multiallelic_basename local monoallelic_basename BREV_REMOTE_PAPER_FIGURES_SCORES_DIR= BREV_REMOTE_PAPER_FIGURES_ARTIFACTS_DIR= BREV_REMOTE_PAPER_FIGURES_MULTIALLELIC_PREDICTIONS= BREV_REMOTE_PAPER_FIGURES_MONOALLELIC_PREDICTIONS= rm -rf "$paper_input_dir" "$paper_archive" if [ -z "$PAPER_FIGURES_SCORES_DIR" ] && \ [ -z "$PAPER_FIGURES_ARTIFACTS_DIR" ] && \ [ -z "$PAPER_FIGURES_MULTIALLELIC_PREDICTIONS" ] && \ [ -z "$PAPER_FIGURES_MONOALLELIC_PREDICTIONS" ]; then return 0 fi mkdir -p "$paper_input_dir" if [ -n "$PAPER_FIGURES_SCORES_DIR" ]; then BREV_REMOTE_PAPER_FIGURES_SCORES_DIR="$( stage_brev_paper_input \ "$PAPER_FIGURES_SCORES_DIR" \ scores_dir \ "$paper_input_dir" \ "$remote_root" )" fi if [ -n "$PAPER_FIGURES_ARTIFACTS_DIR" ]; then if same_existing_path \ "$PAPER_FIGURES_ARTIFACTS_DIR" "$PAPER_FIGURES_SCORES_DIR"; then BREV_REMOTE_PAPER_FIGURES_ARTIFACTS_DIR="$BREV_REMOTE_PAPER_FIGURES_SCORES_DIR" else BREV_REMOTE_PAPER_FIGURES_ARTIFACTS_DIR="$( stage_brev_paper_input \ "$PAPER_FIGURES_ARTIFACTS_DIR" \ artifacts_dir \ "$paper_input_dir" \ "$remote_root" )" fi fi if [ -n "$PAPER_FIGURES_MULTIALLELIC_PREDICTIONS" ]; then multiallelic_basename="$(basename "$PAPER_FIGURES_MULTIALLELIC_PREDICTIONS")" BREV_REMOTE_PAPER_FIGURES_MULTIALLELIC_PREDICTIONS="$( stage_brev_paper_input \ "$PAPER_FIGURES_MULTIALLELIC_PREDICTIONS" \ "multiallelic_predictions/$multiallelic_basename" \ "$paper_input_dir" \ "$remote_root" )" fi if [ -n "$PAPER_FIGURES_MONOALLELIC_PREDICTIONS" ]; then monoallelic_basename="$(basename "$PAPER_FIGURES_MONOALLELIC_PREDICTIONS")" BREV_REMOTE_PAPER_FIGURES_MONOALLELIC_PREDICTIONS="$( stage_brev_paper_input \ "$PAPER_FIGURES_MONOALLELIC_PREDICTIONS" \ "monoallelic_predictions/$monoallelic_basename" \ "$paper_input_dir" \ "$remote_root" )" fi run_logged_step postprocess_package_paper_inputs \ tar -C "$paper_input_dir" -cjf "$paper_archive" . } build_brev_data_dir_archive() { local staging="$1" local remote_data_dir="$2" local data_input_dir="$staging/data_dir" local data_archive="$staging/data_dir.tar.bz2" BREV_REMOTE_DATA_DIR= rm -rf "$data_input_dir" "$data_archive" if [ -z "$DATA_DIR" ]; then return 0 fi [ -d "$DATA_DIR" ] || die "Evaluation data directory not found: $DATA_DIR" mkdir -p "$data_input_dir" ( cd "$DATA_DIR" tar -cf - . ) | ( cd "$data_input_dir" tar -xf - ) BREV_REMOTE_DATA_DIR="$remote_data_dir" run_logged_step postprocess_package_data_dir \ tar -C "$data_input_dir" -cjf "$data_archive" . } ensure_brev_postprocess_instance() { local auto_create="$1" require_command brev local status status="$(brev_instance_status || true)" if [ -z "$status" ]; then if [ "$auto_create" != "1" ]; then die "Brev instance not found: $BREV_INSTANCE" fi local create_args=( brev create "$BREV_INSTANCE" --mode container --container-image "$BREV_CONTAINER_IMAGE" --timeout "$BREV_CREATE_TIMEOUT_SECONDS" ) if [ -n "$BREV_INSTANCE_TYPE" ]; then create_args+=(--type "$BREV_INSTANCE_TYPE") fi run_logged_step_with_timeout \ brev_create_postprocess "$BREV_CREATE_TIMEOUT_SECONDS" \ "${create_args[@]}" return 0 fi if [ "$status" != "RUNNING" ]; then run_logged_step_with_timeout \ brev_start_postprocess "$BREV_CREATE_TIMEOUT_SECONDS" \ brev start "$BREV_INSTANCE" fi } run_brev_postprocess() { local auto_create="$1" set +e ( set -e run_brev_postprocess_impl "$auto_create" ) local status=$? set -e if [ "$status" -ne 0 ]; then warn "Brev postprocess failed with status $status; leaving $BREV_INSTANCE available to preserve remote artifacts." return "$status" fi if [ "$SKIP_EVAL" != "1" ]; then BREV_REMOTE_EVAL_DONE=1 fi if [ "$SKIP_PLOTS" != "1" ]; then if [ "$DRY_RUN" = "1" ] || [ -d "$RUN_DIR/eval_comparison/plots" ]; then BREV_REMOTE_PLOTS_DONE=1 fi fi } run_brev_postprocess_impl() { local auto_create="$1" if [ "$SKIP_EVAL" = "1" ]; then return 0 fi if [ "$DRY_RUN" = "1" ]; then note "Would run Brev postprocess-only eval/plot on $BREV_INSTANCE." BREV_REMOTE_EVAL_DONE=1 if [ "$SKIP_PLOTS" != "1" ]; then BREV_REMOTE_PLOTS_DONE=1 fi return 0 fi run_dir_has_model_artifacts || \ die "Postprocess-only Brev run requires final model artifacts in $RUN_DIR" require_command brev require_command tar run_cmd mkdir -p "$RUN_DIR" local staging="$RUN_DIR/.brev-postprocess" local remote_root=/root/mhcflurry-postprocess local repo_archive="$staging/repo.tar.bz2" local models_archive="$staging/model_artifacts.tar.bz2" local paper_archive="$staging/paper_inputs.tar.bz2" local data_archive="$staging/data_dir.tar.bz2" local remote_script="$staging/run_remote_postprocess.sh" local remote_sync_script="$staging/build_postprocess_sync_archive.sh" local remote_archive="$remote_root/postprocess_sync.tar.bz2" local local_archive="$staging/postprocess_sync.tar.bz2" local remote_paper_inputs_root="$remote_root/paper_inputs" local remote_data_dir="$remote_root/data_dir" BREV_EXPECT_REMOTE_EVAL=1 BREV_EXPECT_REMOTE_PLOTS=0 if [ "$SKIP_PLOTS" != "1" ]; then BREV_EXPECT_REMOTE_PLOTS=1 fi run_cmd rm -rf "$staging" build_brev_postprocess_archives \ "$staging" "$remote_paper_inputs_root" "$remote_data_dir" ensure_brev_postprocess_instance "$auto_create" run_logged_step postprocess_wait_for_shell \ wait_for_brev_shell_ready run_logged_step_with_timeout \ postprocess_prepare_remote_dir "$BREV_CREATE_TIMEOUT_SECONDS" \ brev exec "$BREV_INSTANCE" "rm -rf '$remote_root' && mkdir -p '$remote_root'" run_logged_step_with_timeout \ postprocess_copy_repo "$BREV_CREATE_TIMEOUT_SECONDS" \ brev copy "$repo_archive" "$BREV_INSTANCE:$remote_root/repo.tar.bz2" run_logged_step_with_timeout \ postprocess_copy_models "$BREV_CREATE_TIMEOUT_SECONDS" \ brev copy "$models_archive" "$BREV_INSTANCE:$remote_root/model_artifacts.tar.bz2" if [ -f "$paper_archive" ]; then run_logged_step_with_timeout \ postprocess_copy_paper_inputs "$BREV_CREATE_TIMEOUT_SECONDS" \ brev copy "$paper_archive" "$BREV_INSTANCE:$remote_root/paper_inputs.tar.bz2" fi if [ -f "$data_archive" ]; then run_logged_step_with_timeout \ postprocess_copy_data_dir "$BREV_CREATE_TIMEOUT_SECONDS" \ brev copy "$data_archive" "$BREV_INSTANCE:$remote_root/data_dir.tar.bz2" fi { cat <<'EOF' #!/usr/bin/env bash set -euo pipefail EOF printf 'export RUN_LABEL=%q\n' "$RUN_LABEL" printf 'export RUN_RELEASE_PLOTS=%q\n' "$BREV_EXPECT_REMOTE_PLOTS" printf 'export COMPARE_BASELINE=%q\n' "$COMPARE_BASELINE" printf 'export COMPARE_BASELINE_LABEL=%q\n' "$COMPARE_BASELINE_LABEL" printf 'export COMPARE_INCLUDE=%q\n' "$COMPARE_INCLUDE" printf 'export EVAL_MAX_BENCHMARK_FILES=%q\n' "$EVAL_MAX_BENCHMARK_FILES" printf 'export PROCESSING_MODES=%q\n' "$PROCESSING_MODES" printf 'export PRESENTATION_MODES=%q\n' "$PRESENTATION_MODES" printf 'export COMPARE_BACKEND=%q\n' "$COMPARE_BACKEND" printf 'export COMPARE_NUM_JOBS=%q\n' "$COMPARE_NUM_JOBS" printf 'export COMPARE_MAX_WORKERS_PER_GPU=%q\n' "$COMPARE_MAX_WORKERS_PER_GPU" printf 'export COMPARE_MAX_TASKS_PER_WORKER=%q\n' "$COMPARE_MAX_TASKS_PER_WORKER" printf 'export COMPARE_TORCH_COMPILE=%q\n' "$COMPARE_TORCH_COMPILE" printf 'export COMPARE_MATMUL_PRECISION=%q\n' "$COMPARE_MATMUL_PRECISION" printf 'export COMPARE_GPUS=%q\n' "$COMPARE_GPUS" printf 'export DATA_DIR=%q\n' "$BREV_REMOTE_DATA_DIR" printf 'export COMPARE_PRESENTATION_NUM_JOBS=%q\n' "$COMPARE_PRESENTATION_NUM_JOBS" printf 'export COMPARE_PRESENTATION_MAX_WORKERS_PER_GPU=%q\n' "$COMPARE_PRESENTATION_MAX_WORKERS_PER_GPU" printf 'export COMPARE_PRESENTATION_MAX_TASKS_PER_WORKER=%q\n' "$COMPARE_PRESENTATION_MAX_TASKS_PER_WORKER" printf 'export COMPARE_PRESENTATION_TORCH_COMPILE=%q\n' "$COMPARE_PRESENTATION_TORCH_COMPILE" printf 'export PAPER_FIGURES_SCORES_DIR=%q\n' "$BREV_REMOTE_PAPER_FIGURES_SCORES_DIR" printf 'export PAPER_FIGURES_ARTIFACTS_DIR=%q\n' "$BREV_REMOTE_PAPER_FIGURES_ARTIFACTS_DIR" printf 'export PAPER_FIGURES_MULTIALLELIC_PREDICTIONS=%q\n' "$BREV_REMOTE_PAPER_FIGURES_MULTIALLELIC_PREDICTIONS" printf 'export PAPER_FIGURES_MONOALLELIC_PREDICTIONS=%q\n' "$BREV_REMOTE_PAPER_FIGURES_MONOALLELIC_PREDICTIONS" printf 'export PAPER_FIGURES_FORMATS=%q\n' "$PAPER_FIGURES_FORMATS" printf 'export PAPER_FIGURES_CANDIDATE_PREDICTOR=%q\n' "$PAPER_FIGURES_CANDIDATE_PREDICTOR" printf 'export PAPER_FIGURES_EXTERNAL_BASELINES=%q\n' "$PAPER_FIGURES_EXTERNAL_BASELINES" printf 'export PAPER_FIGURES_PREFERRED_PREDICTORS=%q\n' "$PAPER_FIGURES_PREFERRED_PREDICTORS" printf 'export PAPER_FIGURES_PRESENTATION_PANEL_PREDICTORS=%q\n' "$PAPER_FIGURES_PRESENTATION_PANEL_PREDICTORS" printf 'export PAPER_FIGURES_PRESENTATION_PANEL_BASELINES=%q\n' "$PAPER_FIGURES_PRESENTATION_PANEL_BASELINES" cat <<'EOF' remote_root=/root/mhcflurry-postprocess repo_dir="$remote_root/repo" run_dir="$remote_root/run" # BEGIN BREV POSTPROCESS REPLAY GUARD # Some Brev CLI versions replay the complete remote command after an SSH # transport failure. Coalesce that retry with the original invocation so setup # and evaluation are never executed twice. The outer workflow recreates # remote_root for every intentional run, so this state cannot block a later # user-requested rerun. postprocess_state_dir="$remote_root/postprocess_state" postprocess_status_file="$postprocess_state_dir/exit_status" postprocess_owner_file="$postprocess_state_dir/owner_pid" if ! mkdir "$postprocess_state_dir" 2>/dev/null; then echo "Detected replay of Brev postprocess command; waiting for original invocation." >&2 while [ ! -f "$postprocess_status_file" ]; do postprocess_owner_pid="$(cat "$postprocess_owner_file" 2>/dev/null || true)" postprocess_owner_state="" if [ -n "$postprocess_owner_pid" ]; then postprocess_owner_state="$( awk '{print $3}' "/proc/$postprocess_owner_pid/stat" \ 2>/dev/null || true )" fi if [ -n "$postprocess_owner_pid" ] && { [ -z "$postprocess_owner_state" ] || \ [ "$postprocess_owner_state" = "Z" ]; }; then # The owner may have exited between its final command and the EXIT # trap's atomic marker rename. Give that narrow race one interval # to publish the real status before declaring the run abandoned. sleep 1 [ -f "$postprocess_status_file" ] && continue printf '70\n' > "$postprocess_status_file.tmp.$$" mv "$postprocess_status_file.tmp.$$" "$postprocess_status_file" echo "Original Brev postprocess owner exited without a status marker." >&2 break fi sleep 1 done postprocess_original_status="$(cat "$postprocess_status_file")" echo "Brev postprocess replay returning original status $postprocess_original_status." >&2 exit "$postprocess_original_status" fi printf '%s\n' "$$" > "$postprocess_owner_file" record_postprocess_status() { local status="$?" trap - EXIT printf '%s\n' "$status" > "$postprocess_status_file.tmp.$$" mv "$postprocess_status_file.tmp.$$" "$postprocess_status_file" exit "$status" } trap record_postprocess_status EXIT trap 'exit 129' HUP trap 'exit 130' INT trap 'exit 143' TERM # END BREV POSTPROCESS REPLAY GUARD # Reuse the PyTorch environment that produced the models when the Brev # training image exposes it. Falling back to the host interpreter here can # silently install a newer Torch/CUDA stack for evaluation than for training. if [ -x /opt/conda/bin/python ]; then export PATH="/opt/conda/bin:$PATH" fi export MKL_THREADING_LAYER="${MKL_THREADING_LAYER:-GNU}" # Compiling every model in every short-lived comparison worker multiplies # Inductor compiler pools by the worker count. Eager inference is the safe # default; COMPARE_TORCH_COMPILE still carries any explicit caller override. export MHCFLURRY_TORCH_COMPILE="${MHCFLURRY_TORCH_COMPILE:-0}" export MHCFLURRY_MATMUL_PRECISION="${MHCFLURRY_MATMUL_PRECISION:-highest}" export MHCFLURRY_ENABLE_TIMING="${MHCFLURRY_ENABLE_TIMING:-1}" apt-get update DEBIAN_FRONTEND=noninteractive apt-get install -y \ python-is-python3 python3-pip bzip2 wget rsync build-essential git \ libhdf5-dev libxml2-dev libxslt1-dev procps python -m pip install --upgrade pip python -m pip install pypdf rm -rf "$repo_dir" "$run_dir" mkdir -p "$repo_dir" "$run_dir" tar -C "$repo_dir" -xjf "$remote_root/repo.tar.bz2" tar -C "$run_dir" -xjf "$remote_root/model_artifacts.tar.bz2" if [ -f "$remote_root/paper_inputs.tar.bz2" ]; then rm -rf "$remote_root/paper_inputs" mkdir -p "$remote_root/paper_inputs" tar -C "$remote_root/paper_inputs" -xjf "$remote_root/paper_inputs.tar.bz2" fi if [ -f "$remote_root/data_dir.tar.bz2" ]; then rm -rf "$remote_root/data_dir" mkdir -p "$remote_root/data_dir" tar -C "$remote_root/data_dir" -xjf "$remote_root/data_dir.tar.bz2" fi cd "$repo_dir" python -m pip install -e . if [ -n "${DATA_DIR:-}" ]; then data_dir="$DATA_DIR" mhcflurry downloads fetch \ models_class1_pan models_class1_processing models_class1_presentation else mhcflurry downloads fetch \ data_evaluation models_class1_pan \ models_class1_processing models_class1_presentation data_dir="$(mhcflurry downloads path data_evaluation)" fi case ",${COMPARE_INCLUDE:-affinity,processing,presentation}," in *,affinity,*) mhcflurry downloads fetch models_class1_pan_variants ;; esac baseline_release="${COMPARE_BASELINE#public:}" if [ "$baseline_release" != "$COMPARE_BASELINE" ]; then MHCFLURRY_DOWNLOADS_CURRENT_RELEASE="$baseline_release" \ mhcflurry downloads fetch \ models_class1_pan models_class1_processing models_class1_presentation fi compare_args=( mhcflurry eval compare-models --a "$run_dir" \ --a-label "${RUN_LABEL:-new}" \ --b "${COMPARE_BASELINE:-public:2.2.0}" \ --b-label "${COMPARE_BASELINE_LABEL:-MHCflurry 2.2}" \ --data-dir "$data_dir" \ --release-holdout-dir "$run_dir/release_holdout" \ --affinity-training-overlap-policy audit \ --include "${COMPARE_INCLUDE:-affinity,processing,presentation}" \ --processing-modes "${PROCESSING_MODES:-with_flanks,no_flank,short_flanks}" \ --presentation-modes "${PRESENTATION_MODES:-with_flanks,without_flanks}" \ --out "$run_dir/eval_comparison" \ --backend "$COMPARE_BACKEND" \ --num-jobs "$COMPARE_NUM_JOBS" \ --max-workers-per-gpu "$COMPARE_MAX_WORKERS_PER_GPU" \ --max-tasks-per-worker "$COMPARE_MAX_TASKS_PER_WORKER" \ --presentation-num-jobs "$COMPARE_PRESENTATION_NUM_JOBS" \ --presentation-max-workers-per-gpu "$COMPARE_PRESENTATION_MAX_WORKERS_PER_GPU" \ --presentation-max-tasks-per-worker "$COMPARE_PRESENTATION_MAX_TASKS_PER_WORKER" \ --presentation-torch-compile "$COMPARE_PRESENTATION_TORCH_COMPILE" \ --worker-log-dir "$run_dir/eval_comparison/worker_logs" \ --torch-compile "$COMPARE_TORCH_COMPILE" \ --matmul-precision "$COMPARE_MATMUL_PRECISION" ) if [ -n "${EVAL_MAX_BENCHMARK_FILES:-}" ]; then compare_args+=(--limit-files "$EVAL_MAX_BENCHMARK_FILES") fi case "$(printf '%s' "$COMPARE_GPUS" | tr '[:upper:]' '[:lower:]')" in auto) ;; *) compare_args+=(--gpus "$COMPARE_GPUS") ;; esac "${compare_args[@]}" case ",${COMPARE_INCLUDE:-affinity,processing,presentation}," in *,affinity,*) train_excluded_affinity_dir="$( mhcflurry downloads path models_class1_pan_variants )/models.no_additional_ms" fair_affinity_args=( mhcflurry eval compare-models --a "$run_dir" --a-label "${RUN_LABEL:-new}" --b "$train_excluded_affinity_dir" --b-affinity-dir "$train_excluded_affinity_dir" --b-label "MHCflurry no-additional-MS (train-excluded)" --data-dir "$data_dir" --release-holdout-dir "$run_dir/release_holdout" --affinity-training-overlap-policy exclude --include affinity --affinity-source no_additional_ms --out "$run_dir/eval_comparison_train_excluded_affinity" --backend "$COMPARE_BACKEND" --num-jobs "$COMPARE_NUM_JOBS" --max-workers-per-gpu "$COMPARE_MAX_WORKERS_PER_GPU" --max-tasks-per-worker "$COMPARE_MAX_TASKS_PER_WORKER" --worker-log-dir \ "$run_dir/eval_comparison_train_excluded_affinity/worker_logs" --torch-compile "$COMPARE_TORCH_COMPILE" --matmul-precision "$COMPARE_MATMUL_PRECISION" ) if [ -n "${EVAL_MAX_BENCHMARK_FILES:-}" ]; then fair_affinity_args+=(--limit-files "$EVAL_MAX_BENCHMARK_FILES") fi case "$(printf '%s' "$COMPARE_GPUS" | tr '[:upper:]' '[:lower:]')" in auto) ;; *) fair_affinity_args+=(--gpus "$COMPARE_GPUS") ;; esac "${fair_affinity_args[@]}" ;; esac if [ "${RUN_RELEASE_PLOTS:-1}" = "1" ]; then plot_args=( mhcflurry eval plot-comparison --input "$run_dir/eval_comparison" --a-label "${RUN_LABEL:-new}" --b-label "${COMPARE_BASELINE_LABEL:-MHCflurry 2.2}" --summary-pdf "$run_dir/eval_comparison/plots/model_comparison_figures.pdf" --paper-figures-out "$run_dir/eval_comparison/plots/paper_figures" --paper-figures-formats "${PAPER_FIGURES_FORMATS:-svg,pdf,png}" --paper-figures-scores-dir "${PAPER_FIGURES_SCORES_DIR:-$run_dir/eval_comparison}" --include-paper-figures-in-summary-pdf ) if [ -n "${PAPER_FIGURES_MULTIALLELIC_PREDICTIONS:-}" ]; then plot_args+=(--paper-figures-multiallelic-predictions "$PAPER_FIGURES_MULTIALLELIC_PREDICTIONS") fi if [ -n "${PAPER_FIGURES_MONOALLELIC_PREDICTIONS:-}" ]; then plot_args+=(--paper-figures-monoallelic-predictions "$PAPER_FIGURES_MONOALLELIC_PREDICTIONS") fi if [ -n "${PAPER_FIGURES_CANDIDATE_PREDICTOR:-}" ]; then plot_args+=(--paper-figures-candidate-predictor "$PAPER_FIGURES_CANDIDATE_PREDICTOR") fi if [ -n "${PAPER_FIGURES_EXTERNAL_BASELINES:-}" ]; then plot_args+=(--paper-figures-external-baselines "$PAPER_FIGURES_EXTERNAL_BASELINES") fi if [ -n "${PAPER_FIGURES_PREFERRED_PREDICTORS:-}" ]; then plot_args+=(--paper-figures-preferred-predictors "$PAPER_FIGURES_PREFERRED_PREDICTORS") fi if [ -n "${PAPER_FIGURES_PRESENTATION_PANEL_PREDICTORS:-}" ]; then plot_args+=(--paper-figures-presentation-panel-predictors "$PAPER_FIGURES_PRESENTATION_PANEL_PREDICTORS") fi if [ -n "${PAPER_FIGURES_PRESENTATION_PANEL_BASELINES:-}" ]; then plot_args+=(--paper-figures-presentation-panel-baselines "$PAPER_FIGURES_PRESENTATION_PANEL_BASELINES") fi "${plot_args[@]}" if [ -d "$run_dir/eval_comparison_train_excluded_affinity" ]; then mhcflurry eval plot-comparison \ --input "$run_dir/eval_comparison_train_excluded_affinity" \ --a-label "${RUN_LABEL:-new}" \ --b-label "MHCflurry no-additional-MS (train-excluded)" \ --summary-pdf \ "$run_dir/eval_comparison_train_excluded_affinity/plots/model_comparison_figures.pdf" fi mhcflurry train plot-loss-curves \ --selected-dir "$run_dir/affinity/models.combined" \ --unselected-dir "$run_dir/affinity/models.unselected.combined" \ --out "$run_dir/affinity/loss_plots" fi EOF } > "$remote_script" chmod +x "$remote_script" run_logged_step_with_timeout \ postprocess_run_remote "$BREV_POSTPROCESS_TIMEOUT_SECONDS" \ brev exec "$BREV_INSTANCE" "@$remote_script" cat > "$remote_sync_script" <<'EOF' #!/usr/bin/env bash set -euo pipefail remote_root=/root/mhcflurry-postprocess run_dir="$remote_root/run" archive="$remote_root/postprocess_sync.tar.bz2" manifest="$remote_root/postprocess_sync_paths.txt" rm -f "$archive" "$manifest" cd "$run_dir" add_path() { if [ -e "$1" ]; then printf '%s\n' "$1" >> "$manifest" else printf 'missing optional sync path: %s\n' "$1" >&2 fi } add_glob() { local path for path in "$@"; do [ -e "$path" ] && printf '%s\n' "$path" >> "$manifest" done return 0 } add_path eval_comparison/release_summary.csv add_path eval_comparison/release_summary.md add_path eval_comparison/summary.md add_path eval_comparison/side_a.json add_path eval_comparison/side_b.json add_path eval_comparison/plots add_path affinity/loss_plots add_glob eval_comparison/*/summary.json add_glob eval_comparison/*/training_overlap.json add_glob eval_comparison/*/summary_table.csv add_glob eval_comparison/*/per_*.csv add_glob eval_comparison/*/predictions*.csv.bz2 add_path eval_comparison_train_excluded_affinity/release_summary.csv add_path eval_comparison_train_excluded_affinity/release_summary.md add_path eval_comparison_train_excluded_affinity/summary.md add_path eval_comparison_train_excluded_affinity/side_a.json add_path eval_comparison_train_excluded_affinity/side_b.json add_path eval_comparison_train_excluded_affinity/plots add_glob eval_comparison_train_excluded_affinity/*/summary.json add_glob eval_comparison_train_excluded_affinity/*/training_overlap.json add_glob eval_comparison_train_excluded_affinity/*/per_*.csv add_glob eval_comparison_train_excluded_affinity/*/predictions*.csv.bz2 sort -u "$manifest" -o "$manifest" tar -cjf "$archive" -T "$manifest" printf 'postprocess sync manifest:\n' cat "$manifest" du -sh "$archive" EOF chmod +x "$remote_sync_script" run_logged_step_with_timeout \ postprocess_prepare_sync "$BREV_CREATE_TIMEOUT_SECONDS" \ brev exec "$BREV_INSTANCE" "@$remote_sync_script" run_logged_step_with_timeout \ postprocess_copy_outputs "$BREV_CREATE_TIMEOUT_SECONDS" \ brev copy "$BREV_INSTANCE:$remote_archive" "$staging/" run_logged_step postprocess_extract_outputs \ tar -C "$RUN_DIR" -xjf "$local_archive" run_cmd rm -rf "$staging" BREV_REMOTE_EVAL_DONE=1 if [ "$SKIP_PLOTS" != "1" ] && [ -d "$RUN_DIR/eval_comparison/plots" ]; then BREV_REMOTE_PLOTS_DONE=1 fi apply_brev_cleanup } sync_brev_output() { if [ "$SYNC_REMOTE_OUTPUT" != "1" ]; then note "Skipping Brev output sync because --no-sync-remote-output was set." return 0 fi if run_dir_has_synced_brev_outputs; then note "Brev output already present locally; skipping explicit copy." return 0 fi require_command brev require_command rsync require_command tar local remote_workflow_id remote_workflow_id="$(brev_latest_remote_workflow_id)" if [ "$remote_workflow_id" != "$WORKFLOW_RUN_ID" ]; then die "Refusing to sync Brev output for workflow '${remote_workflow_id:-unknown}'; expected '$WORKFLOW_RUN_ID'" fi run_cmd mkdir -p "$RUN_DIR" local sync_parent="$RUN_DIR/.brev-sync" local copied_out="$sync_parent/out" run_cmd rm -rf "$sync_parent" run_cmd mkdir -p "$sync_parent" if [ "$BREV_SYNC_MODE" = "release" ]; then sync_brev_release_output "$sync_parent" else sync_brev_full_output "$sync_parent" fi run_dir_has_model_artifacts || \ die "Brev sync finished but expected model artifacts are missing in $RUN_DIR" run_dir_matches_workflow || \ die "Brev sync finished but its local workflow marker does not match $WORKFLOW_RUN_ID" } sync_brev_full_output() { local sync_parent="$1" local copied_out="$sync_parent/out" set +e run_logged_step_with_timeout \ brev_sync_copy "$BREV_CREATE_TIMEOUT_SECONDS" \ brev copy "$BREV_INSTANCE:/root/runplz-latest/out" "$sync_parent/" local copy_status=$? set -e if [ "$copy_status" -ne 0 ]; then return "$copy_status" fi set +e if [ -d "$copied_out" ]; then run_logged_step brev_sync_merge rsync -a "$copied_out/" "$RUN_DIR/" else run_logged_step brev_sync_merge rsync -a "$sync_parent/" "$RUN_DIR/" fi local merge_status=$? set -e if [ "$merge_status" -ne 0 ]; then return "$merge_status" fi run_cmd rm -rf "$sync_parent" } sync_brev_release_output() { local sync_parent="$1" local remote_archive=/root/runplz-latest/out/.runplz/release_sync.tar.bz2 local local_archive="$sync_parent/release_sync.tar.bz2" local sync_script="$sync_parent/build_release_sync_archive.sh" cat > "$sync_script" <<'EOF' #!/usr/bin/env bash set -euo pipefail cd ~/runplz-latest/out mkdir -p .runplz manifest=.runplz/release_sync_paths.txt archive=.runplz/release_sync.tar.bz2 rm -f "$manifest" "$archive" add_path() { if [ -e "$1" ]; then printf '%s\n' "$1" >> "$manifest" else printf 'missing optional sync path: %s\n' "$1" >&2 fi } add_glob() { local path for path in "$@"; do [ -e "$path" ] && printf '%s\n' "$path" >> "$manifest" done return 0 } add_path .runplz/events.ndjson add_path .runplz/heartbeat.ndjson add_path .runplz/last.log add_path .runplz/run.json add_path .runplz/run.sh add_path .runplz/run_driver.log add_path .runplz/mhcflurry_release_workflow_id add_path .runplz/mhcflurry_release_workflow_exit_code add_path eval_comparison/release_summary.csv add_path eval_comparison/release_summary.md add_path eval_comparison/summary.md add_path eval_comparison/side_a.json add_path eval_comparison/side_b.json add_path eval_comparison/plots add_glob eval_comparison/*/summary.json add_glob eval_comparison/*/training_overlap.json add_glob eval_comparison/*/summary_table.csv add_glob eval_comparison/*/per_*.csv add_glob eval_comparison/*/predictions*.csv.bz2 add_path eval_comparison_train_excluded_affinity/release_summary.csv add_path eval_comparison_train_excluded_affinity/release_summary.md add_path eval_comparison_train_excluded_affinity/summary.md add_path eval_comparison_train_excluded_affinity/side_a.json add_path eval_comparison_train_excluded_affinity/side_b.json add_path eval_comparison_train_excluded_affinity/plots add_glob eval_comparison_train_excluded_affinity/*/summary.json add_glob eval_comparison_train_excluded_affinity/*/training_overlap.json add_glob eval_comparison_train_excluded_affinity/*/per_*.csv add_glob eval_comparison_train_excluded_affinity/*/predictions*.csv.bz2 add_path affinity/models.combined add_path affinity/eval_comparison add_path affinity/loss_plots add_path affinity/calibrate.log add_path affinity/eval.log add_path affinity/fetch_eval_data.log add_path affinity/gpu_occupancy.csv add_path affinity/hyperparameters.yaml add_path affinity/plot_loss_curves.log add_path affinity/release_driver.log add_path affinity/release_heartbeat.log add_path affinity/select.log add_path affinity/train.log add_glob affinity/LOG-worker.*.txt add_path release_holdout add_glob processing/models.selected.* add_path processing/hits_with_tpm.csv.bz2 add_path processing/gpu_occupancy.csv add_path processing/hyperparameters.base.yaml add_glob processing/hyperparameters.*.yaml add_path processing/train_data.csv.bz2 add_glob processing/LOG-worker.*.txt add_path presentation/models add_path presentation/gpu_occupancy.csv add_path presentation/make_train_data.presentation.py add_path presentation/train_data.csv.bz2 sort -u "$manifest" -o "$manifest" tar -cjf "$archive" -T "$manifest" printf 'release sync manifest:\n' cat "$manifest" du -sh "$archive" EOF chmod +x "$sync_script" set +e run_logged_step_with_timeout \ brev_sync_prepare_release_archive "$BREV_CREATE_TIMEOUT_SECONDS" \ brev exec "$BREV_INSTANCE" "@$sync_script" local prepare_status=$? set -e if [ "$prepare_status" -ne 0 ]; then return "$prepare_status" fi set +e run_logged_step_with_timeout \ brev_sync_copy_release_archive "$BREV_CREATE_TIMEOUT_SECONDS" \ brev copy "$BREV_INSTANCE:$remote_archive" "$sync_parent/" local copy_status=$? set -e if [ "$copy_status" -ne 0 ]; then return "$copy_status" fi if [ ! -f "$local_archive" ]; then die "Brev release sync archive was not copied to $local_archive" fi run_logged_step brev_sync_extract_release_archive \ tar -C "$RUN_DIR" -xjf "$local_archive" run_cmd rm -rf "$sync_parent" } apply_brev_cleanup() { case "$BACKEND" in brev-existing|brev-provision) ;; *) return 0 ;; esac case "$BREV_ON_FINISH" in leave) note "Leaving Brev instance running: $BREV_INSTANCE" return 0 ;; stop) set +e run_logged_step_with_timeout \ brev_stop "$BREV_CLEANUP_TIMEOUT_SECONDS" \ brev stop "$BREV_INSTANCE" local stop_status=$? set -e if [ "$stop_status" -ne 0 ]; then warn "brev stop failed for $BREV_INSTANCE with status $stop_status" fi sleep 15 local status status="$(brev_instance_status || true)" if [ "$status" = "RUNNING" ]; then warn "Brev instance is still RUNNING after stop: $BREV_INSTANCE" if [ "$BREV_STOP_FAILURE_ACTION" = "delete" ]; then warn "Deleting provisioned instance because stop did not take effect." set +e run_logged_step_with_timeout \ brev_delete_after_failed_stop \ "$BREV_CLEANUP_TIMEOUT_SECONDS" \ brev delete "$BREV_INSTANCE" local delete_status=$? set -e if [ "$delete_status" -ne 0 ]; then warn "brev delete failed for $BREV_INSTANCE with status $delete_status" fi else warn "Leaving instance running; rerun 'brev stop $BREV_INSTANCE' or delete it manually." fi else note "Brev instance status after stop: ${status:-unknown}" fi ;; delete) set +e run_logged_step_with_timeout \ brev_delete "$BREV_CLEANUP_TIMEOUT_SECONDS" \ brev delete "$BREV_INSTANCE" local delete_status=$? set -e if [ "$delete_status" -ne 0 ]; then warn "brev delete failed for $BREV_INSTANCE with status $delete_status" fi ;; esac } run_brev_training() { local auto_create=$1 if [ "$DRY_RUN" != "1" ]; then require_command runplz require_clean_runplz fi run_cmd mkdir -p "$RUN_DIR" local runplz_on_finish=leave local run_release_eval=0 local run_release_plots=0 local run_remote_paper_postprocess=0 if [ "$SKIP_EVAL" != "1" ]; then if [ -n "$DATA_DIR" ]; then note "Custom DATA_DIR is local to this wrapper; evaluation will run after Brev sync." else run_release_eval=1 fi fi if [ "$SKIP_PLOTS" != "1" ]; then if paper_figure_inputs_requested; then note "Paper-figure inputs are local to this wrapper; plotting will run in a Brev postprocess after sync." run_remote_paper_postprocess=1 elif [ "$run_release_eval" = "1" ]; then run_release_plots=1 fi fi BREV_EXPECT_REMOTE_EVAL=$run_release_eval BREV_EXPECT_REMOTE_PLOTS=$run_release_plots local remote_paper_scores_dir= local remote_paper_artifacts_dir= local remote_paper_multiallelic_predictions= local remote_paper_monoallelic_predictions= if [ "$run_release_plots" = "1" ]; then remote_paper_scores_dir=$PAPER_FIGURES_SCORES_DIR remote_paper_artifacts_dir=$PAPER_FIGURES_ARTIFACTS_DIR remote_paper_multiallelic_predictions=$PAPER_FIGURES_MULTIALLELIC_PREDICTIONS remote_paper_monoallelic_predictions=$PAPER_FIGURES_MONOALLELIC_PREDICTIONS fi local runplz_env=( "MHCFLURRY_OUT=$RUN_DIR" "REPO=$REPO" "MHCFLURRY_RELEASE_RECIPE=$MHCFLURRY_RELEASE_RECIPE" "RELEASE_RANDOM_SEED=$RELEASE_RANDOM_SEED" "TRAINING_MINIBATCH_SIZE=$TRAINING_MINIBATCH_SIZE" "AFFINITY_MINIBATCH_SIZE=$AFFINITY_MINIBATCH_SIZE" "AFFINITY_OPTIMIZER_IMPLEMENTATION=$AFFINITY_OPTIMIZER_IMPLEMENTATION" "AFFINITY_LSUV_TARGET=$AFFINITY_LSUV_TARGET" "AFFINITY_INIT=$AFFINITY_INIT" "AFFINITY_MAX_WORKERS_PER_GPU=$AFFINITY_MAX_WORKERS_PER_GPU" "PROCESSING_MINIBATCH_SIZE=$PROCESSING_MINIBATCH_SIZE" "PROCESSING_NUM_JOBS=$PROCESSING_NUM_JOBS" "PROCESSING_MAX_WORKERS_PER_GPU=$PROCESSING_MAX_WORKERS_PER_GPU" "PROCESSING_HELD_OUT_SAMPLES=$PROCESSING_HELD_OUT_SAMPLES" "PROCESSING_VARIANTS=$PROCESSING_VARIANTS" "PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS=$PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS" "PRESENTATION_PROCESSING_WITH_FLANKS_KIND=$PRESENTATION_PROCESSING_WITH_FLANKS_KIND" "PRESENTATION_DECOYS_PER_HIT=$PRESENTATION_DECOYS_PER_HIT" "PRESENTATION_SAMPLE_FRACTION=$PRESENTATION_SAMPLE_FRACTION" "PRESENTATION_FEATURE_CHUNK_SIZE=$PRESENTATION_FEATURE_CHUNK_SIZE" "PRESENTATION_NUM_JOBS=$PRESENTATION_NUM_JOBS" "PRESENTATION_MAX_WORKERS_PER_GPU=$PRESENTATION_MAX_WORKERS_PER_GPU" "PRESENTATION_CALIBRATION_NUM_JOBS=$PRESENTATION_CALIBRATION_NUM_JOBS" "PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU=$PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU" "PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE=$PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE" "RUN_RELEASE_EVAL=$run_release_eval" "RUN_RELEASE_PLOTS=$run_release_plots" "COMPARE_INCLUDE=$COMPARE_INCLUDE" "EVAL_MAX_BENCHMARK_FILES=$EVAL_MAX_BENCHMARK_FILES" "COMPARE_BASELINE=$COMPARE_BASELINE" "COMPARE_BASELINE_LABEL=$COMPARE_BASELINE_LABEL" "COMPARE_BACKEND=$COMPARE_BACKEND" "COMPARE_NUM_JOBS=$COMPARE_NUM_JOBS" "COMPARE_MAX_WORKERS_PER_GPU=$COMPARE_MAX_WORKERS_PER_GPU" "COMPARE_MAX_TASKS_PER_WORKER=$COMPARE_MAX_TASKS_PER_WORKER" "COMPARE_TORCH_COMPILE=$COMPARE_TORCH_COMPILE" "COMPARE_MATMUL_PRECISION=$COMPARE_MATMUL_PRECISION" "COMPARE_GPUS=$COMPARE_GPUS" "DATA_DIR=" "COMPARE_PRESENTATION_NUM_JOBS=$COMPARE_PRESENTATION_NUM_JOBS" "COMPARE_PRESENTATION_MAX_WORKERS_PER_GPU=$COMPARE_PRESENTATION_MAX_WORKERS_PER_GPU" "COMPARE_PRESENTATION_MAX_TASKS_PER_WORKER=$COMPARE_PRESENTATION_MAX_TASKS_PER_WORKER" "COMPARE_PRESENTATION_TORCH_COMPILE=$COMPARE_PRESENTATION_TORCH_COMPILE" "MHCFLURRY_TORCH_COMPILE=$MHCFLURRY_TORCH_COMPILE" "MHCFLURRY_TORCH_COMPILE_LOSS=$MHCFLURRY_TORCH_COMPILE_LOSS" "MHCFLURRY_MATMUL_PRECISION=$MHCFLURRY_MATMUL_PRECISION" "MATMUL_PRECISION=$MATMUL_PRECISION" "MATMUL_PRECISION_CLI=$MATMUL_PRECISION_CLI" "PROCESSING_MODES=$PROCESSING_MODES" "PRESENTATION_MODES=$PRESENTATION_MODES" "PAPER_FIGURES_SCORES_DIR=$remote_paper_scores_dir" "PAPER_FIGURES_ARTIFACTS_DIR=$remote_paper_artifacts_dir" "PAPER_FIGURES_MULTIALLELIC_PREDICTIONS=$remote_paper_multiallelic_predictions" "PAPER_FIGURES_MONOALLELIC_PREDICTIONS=$remote_paper_monoallelic_predictions" "PAPER_FIGURES_FORMATS=$PAPER_FIGURES_FORMATS" "PAPER_FIGURES_CANDIDATE_PREDICTOR=$PAPER_FIGURES_CANDIDATE_PREDICTOR" "PAPER_FIGURES_EXTERNAL_BASELINES=$PAPER_FIGURES_EXTERNAL_BASELINES" "PAPER_FIGURES_PREFERRED_PREDICTORS=$PAPER_FIGURES_PREFERRED_PREDICTORS" "PAPER_FIGURES_PRESENTATION_PANEL_PREDICTORS=$PAPER_FIGURES_PRESENTATION_PANEL_PREDICTORS" "PAPER_FIGURES_PRESENTATION_PANEL_BASELINES=$PAPER_FIGURES_PRESENTATION_PANEL_BASELINES" "RUN_LABEL=$RUN_LABEL" "MHCFLURRY_RELEASE_WORKFLOW_ID=$WORKFLOW_RUN_ID" "MHCFLURRY_RELEASE_GIT_COMMIT=$RELEASE_GIT_COMMIT" "MHCFLURRY_RELEASE_VERSION=$RELEASE" "RUNPLZ_BREV_AUTO_CREATE=$auto_create" "RUNPLZ_BREV_ON_FINISH=$runplz_on_finish" "RUNPLZ_BREV_INSTANCE_TYPE_FALLBACK_COUNT=$BREV_INSTANCE_TYPE_FALLBACK_COUNT" "RUNPLZ_BREV_EXCLUDE_PROVIDERS=$BREV_EXCLUDE_PROVIDERS" ) if [ -n "$BREV_INSTANCE_TYPE" ]; then runplz_env+=("RUNPLZ_BREV_INSTANCE_TYPE=$BREV_INSTANCE_TYPE") fi if [ -n "$BREV_MAX_RUNTIME_SECONDS" ]; then runplz_env+=("RUNPLZ_BREV_MAX_RUNTIME_SECONDS=$BREV_MAX_RUNTIME_SECONDS") fi set +e run_logged_step train_brev env \ "${runplz_env[@]}" \ runplz brev --outputs-dir "$RUN_DIR" \ --log-file "$RUN_DIR/runplz-driver.log" \ --instance "$BREV_INSTANCE" \ "$REPO/scripts/training/launch_pan_allele_training_remote.py" local runplz_status=$? set -e if [ "$DRY_RUN" = "1" ]; then if [ "$run_remote_paper_postprocess" = "1" ]; then wait_paper_figures_prepare run_brev_postprocess 0 else if [ "$run_release_eval" = "1" ]; then BREV_REMOTE_EVAL_DONE=1 fi if [ "$run_release_plots" = "1" ]; then BREV_REMOTE_PLOTS_DONE=1 fi fi return 0 fi local remote_exit remote_exit="$(brev_latest_remote_exit_code || true)" if [ "$runplz_status" -ne 0 ]; then if [ "$remote_exit" = "0" ]; then warn "runplz exited with $runplz_status, but remote command exit_code=0; continuing after explicit sync." else warn "runplz exited with $runplz_status; remote exit_code=${remote_exit:-unknown}." local remote_status remote_status="$(brev_instance_status || true)" if [ -z "$remote_status" ]; then warn "Brev instance $BREV_INSTANCE does not exist; skipping sync and cleanup." return "$runplz_status" fi sync_brev_output || { warn "Brev output sync failed; leaving $BREV_INSTANCE available to preserve artifacts." return "$runplz_status" } apply_brev_cleanup return "$runplz_status" fi fi sync_brev_output || { warn "Brev output sync failed; leaving $BREV_INSTANCE available to preserve artifacts." return 1 } if [ "$run_release_eval" = "1" ] && [ -d "$RUN_DIR/eval_comparison" ]; then BREV_REMOTE_EVAL_DONE=1 fi if [ "$run_release_plots" = "1" ] && \ [ -d "$RUN_DIR/eval_comparison/plots" ]; then BREV_REMOTE_PLOTS_DONE=1 fi if [ "$run_remote_paper_postprocess" = "1" ]; then set +e wait_paper_figures_prepare local prepare_status=$? set -e if [ "$prepare_status" -ne 0 ]; then warn "Paper-figure input preparation failed; applying Brev cleanup without remote paper plotting." apply_brev_cleanup return "$prepare_status" fi run_brev_postprocess 0 return fi apply_brev_cleanup } RUN_DIR= RELEASE= GITHUB_RELEASE= BACKEND=local REMOTE= REMOTE_REPO= REMOTE_RUN_DIR= SYNC_REMOTE_OUTPUT=1 BREV_INSTANCE="${RUNPLZ_BREV_INSTANCE:-${BREV_INSTANCE:-}}" BREV_ON_FINISH="${RUNPLZ_BREV_ON_FINISH:-${BREV_ON_FINISH:-}}" BREV_PROVIDER_EXPLICIT=0 if [ -n "${RUNPLZ_BREV_PROVIDER:-}" ] || [ -n "${BREV_PROVIDER:-}" ]; then BREV_PROVIDER_EXPLICIT=1 fi BREV_PROVIDER="${RUNPLZ_BREV_PROVIDER:-${BREV_PROVIDER:-auto}}" BREV_INSTANCE_TYPE_EXPLICIT=0 if [ -n "${RUNPLZ_BREV_INSTANCE_TYPE:-}" ] || \ [ -n "${BREV_INSTANCE_TYPE:-}" ]; then BREV_INSTANCE_TYPE_EXPLICIT=1 fi BREV_INSTANCE_TYPE="${RUNPLZ_BREV_INSTANCE_TYPE:-${BREV_INSTANCE_TYPE:-}}" DEFAULT_BREV_PROVISION_INSTANCE_TYPE="${DEFAULT_BREV_PROVISION_INSTANCE_TYPE:-}" BREV_CONTAINER_IMAGE="${BREV_CONTAINER_IMAGE:-pytorch/pytorch:2.4.0-cuda12.1-cudnn9-runtime}" BREV_MAX_RUNTIME_SECONDS="${RUNPLZ_BREV_MAX_RUNTIME_SECONDS:-${BREV_MAX_RUNTIME_SECONDS:-}}" RUNPLZ_REQUIRED_VERSION="3.24.31" BREV_INSTANCE_TYPE_FALLBACK_COUNT="${RUNPLZ_BREV_INSTANCE_TYPE_FALLBACK_COUNT:-3}" BREV_EXCLUDE_PROVIDERS="${RUNPLZ_BREV_EXCLUDE_PROVIDERS:-oci}" BREV_STOP_FAILURE_ACTION_EXPLICIT=0 if [ -n "${BREV_STOP_FAILURE_ACTION:-}" ]; then BREV_STOP_FAILURE_ACTION_EXPLICIT=1 fi BREV_STOP_FAILURE_ACTION="${BREV_STOP_FAILURE_ACTION:-}" BREV_CLEANUP_TIMEOUT_SECONDS="${BREV_CLEANUP_TIMEOUT_SECONDS:-60}" BREV_CREATE_TIMEOUT_SECONDS="${BREV_CREATE_TIMEOUT_SECONDS:-2400}" BREV_POSTPROCESS_TIMEOUT_SECONDS="${BREV_POSTPROCESS_TIMEOUT_SECONDS:-86400}" BREV_SHELL_READY_ATTEMPTS="${BREV_SHELL_READY_ATTEMPTS:-40}" BREV_SHELL_READY_DELAY_SECONDS="${BREV_SHELL_READY_DELAY_SECONDS:-15}" BREV_SYNC_MODE="${BREV_SYNC_MODE:-release}" SKIP_TRAIN=0 SKIP_EVAL=0 SKIP_PLOTS=0 SKIP_DEPLOY=0 DEPLOY_MODE=none RELEASE_PROFILE="${RELEASE_PROFILE:-full}" MHCFLURRY_RELEASE_RECIPE="${MHCFLURRY_RELEASE_RECIPE:-}" DATA_DIR= COMPARE_INCLUDE=affinity,processing,presentation EVAL_MAX_BENCHMARK_FILES="${EVAL_MAX_BENCHMARK_FILES:-}" PROCESSING_MODES_EXPLICIT=0 if [ -n "${PROCESSING_MODES:-}" ]; then PROCESSING_MODES_EXPLICIT=1 fi PROCESSING_MODES="${PROCESSING_MODES:-with_flanks,no_flank,short_flanks}" PRESENTATION_MODES=with_flanks,without_flanks COMPARE_BACKEND="${COMPARE_BACKEND:-auto}" COMPARE_NUM_JOBS="${COMPARE_NUM_JOBS:-auto}" COMPARE_MAX_WORKERS_PER_GPU="${COMPARE_MAX_WORKERS_PER_GPU:-auto}" COMPARE_MAX_TASKS_PER_WORKER="${COMPARE_MAX_TASKS_PER_WORKER:-12}" MHCFLURRY_TORCH_COMPILE="${MHCFLURRY_TORCH_COMPILE:-0}" MHCFLURRY_TORCH_COMPILE_LOSS="${MHCFLURRY_TORCH_COMPILE_LOSS:-0}" MHCFLURRY_MATMUL_PRECISION="${MHCFLURRY_MATMUL_PRECISION:-highest}" MATMUL_PRECISION="${MATMUL_PRECISION:-highest}" MATMUL_PRECISION_CLI="${MATMUL_PRECISION_CLI:-highest}" COMPARE_TORCH_COMPILE="${COMPARE_TORCH_COMPILE:-$MHCFLURRY_TORCH_COMPILE}" COMPARE_MATMUL_PRECISION="${COMPARE_MATMUL_PRECISION:-$MHCFLURRY_MATMUL_PRECISION}" COMPARE_GPUS="${COMPARE_GPUS:-auto}" COMPARE_PRESENTATION_NUM_JOBS="${COMPARE_PRESENTATION_NUM_JOBS:-auto}" COMPARE_PRESENTATION_MAX_WORKERS_PER_GPU="${COMPARE_PRESENTATION_MAX_WORKERS_PER_GPU:-auto}" COMPARE_PRESENTATION_MAX_TASKS_PER_WORKER="${COMPARE_PRESENTATION_MAX_TASKS_PER_WORKER:-1}" COMPARE_PRESENTATION_TORCH_COMPILE="${COMPARE_PRESENTATION_TORCH_COMPILE:-0}" COMPARE_BASELINE="${COMPARE_BASELINE:-public:2.2.0}" COMPARE_BASELINE_LABEL="${COMPARE_BASELINE_LABEL:-}" PAPER_FIGURES_ARTIFACTS_DIR="${PAPER_FIGURES_ARTIFACTS_DIR:-}" PAPER_FIGURES_SCORES_DIR="${PAPER_FIGURES_SCORES_DIR:-$PAPER_FIGURES_ARTIFACTS_DIR}" PAPER_FIGURES_MULTIALLELIC_PREDICTIONS="${PAPER_FIGURES_MULTIALLELIC_PREDICTIONS:-}" PAPER_FIGURES_MONOALLELIC_PREDICTIONS="${PAPER_FIGURES_MONOALLELIC_PREDICTIONS:-}" PAPER_FIGURES_PREPARE_COMMAND="${PAPER_FIGURES_PREPARE_COMMAND:-}" PAPER_FIGURES_PREPARE_PID= PAPER_FIGURES_PREPARE_DONE=0 PAPER_FIGURES_FORMATS="${PAPER_FIGURES_FORMATS:-svg,pdf,png}" PAPER_FIGURES_CANDIDATE_PREDICTOR="${PAPER_FIGURES_CANDIDATE_PREDICTOR:-}" PAPER_FIGURES_EXTERNAL_BASELINES="${PAPER_FIGURES_EXTERNAL_BASELINES:-}" PAPER_FIGURES_PREFERRED_PREDICTORS="${PAPER_FIGURES_PREFERRED_PREDICTORS:-}" PAPER_FIGURES_PRESENTATION_PANEL_PREDICTORS="${PAPER_FIGURES_PRESENTATION_PANEL_PREDICTORS:-}" PAPER_FIGURES_PRESENTATION_PANEL_BASELINES="${PAPER_FIGURES_PRESENTATION_PANEL_BASELINES:-}" RUN_LABEL="${RUN_LABEL:-}" DRY_RUN=0 ALLOW_DIRTY_REPO="${ALLOW_DIRTY_REPO:-0}" RELEASE_RANDOM_SEED="${RELEASE_RANDOM_SEED:-42}" TRAINING_MINIBATCH_SIZE="${TRAINING_MINIBATCH_SIZE:-128}" AFFINITY_MINIBATCH_SIZE="${AFFINITY_MINIBATCH_SIZE:-}" AFFINITY_OPTIMIZER_IMPLEMENTATION="${AFFINITY_OPTIMIZER_IMPLEMENTATION:-keras}" AFFINITY_LSUV_TARGET="${AFFINITY_LSUV_TARGET:-post_activation}" AFFINITY_INIT="${AFFINITY_INIT:-glorot_uniform}" AFFINITY_MAX_WORKERS_PER_GPU_EXPLICIT=0 if [ -n "${AFFINITY_MAX_WORKERS_PER_GPU:-}" ]; then AFFINITY_MAX_WORKERS_PER_GPU_EXPLICIT=1 fi AFFINITY_MAX_WORKERS_PER_GPU="${AFFINITY_MAX_WORKERS_PER_GPU:-auto}" PROCESSING_MINIBATCH_SIZE="${PROCESSING_MINIBATCH_SIZE:-}" PROCESSING_NUM_JOBS="${PROCESSING_NUM_JOBS:-auto}" PROCESSING_MAX_WORKERS_PER_GPU="${PROCESSING_MAX_WORKERS_PER_GPU:-auto}" PROCESSING_HELD_OUT_SAMPLES="${PROCESSING_HELD_OUT_SAMPLES:-10}" PROCESSING_VARIANTS_EXPLICIT=0 if [ -n "${PROCESSING_VARIANTS:-}" ]; then PROCESSING_VARIANTS_EXPLICIT=1 fi PROCESSING_VARIANTS="${PROCESSING_VARIANTS:-with_flanks no_flank short_flanks}" PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS="${PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS:-0}" PRESENTATION_PROCESSING_WITH_FLANKS_KIND_EXPLICIT=0 if [ -n "${PRESENTATION_PROCESSING_WITH_FLANKS_KIND:-}" ]; then PRESENTATION_PROCESSING_WITH_FLANKS_KIND_EXPLICIT=1 fi PRESENTATION_PROCESSING_WITH_FLANKS_KIND="${PRESENTATION_PROCESSING_WITH_FLANKS_KIND:-short_flanks}" PRESENTATION_DECOYS_PER_HIT="${PRESENTATION_DECOYS_PER_HIT:-2}" PRESENTATION_SAMPLE_FRACTION="${PRESENTATION_SAMPLE_FRACTION:-0.1}" PRESENTATION_FEATURE_CHUNK_SIZE="${PRESENTATION_FEATURE_CHUNK_SIZE:-250000}" PRESENTATION_NUM_JOBS="${PRESENTATION_NUM_JOBS:-auto}" PRESENTATION_MAX_WORKERS_PER_GPU="${PRESENTATION_MAX_WORKERS_PER_GPU:-auto}" PRESENTATION_CALIBRATION_NUM_JOBS="${PRESENTATION_CALIBRATION_NUM_JOBS:-auto}" PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU="${PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU:-auto}" PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE="${PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE:-auto}" WORKFLOW_LOG_DIR= WORKFLOW_STATUS_LOG= WORKFLOW_RUN_ID="${WORKFLOW_RUN_ID:-$(date -u +%Y%m%dT%H%M%SZ)-$$}" RELEASE_GIT_COMMIT= BREV_EXPECT_REMOTE_EVAL=0 BREV_EXPECT_REMOTE_PLOTS=0 BREV_REMOTE_EVAL_DONE=0 BREV_REMOTE_PLOTS_DONE=0 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO="${REPO:-$(cd "$SCRIPT_DIR/../.." && pwd)}" # shellcheck disable=SC1091 source "$SCRIPT_DIR/../training/release_recipes.sh" while [ $# -gt 0 ]; do case "$1" in --run-dir) RUN_DIR=$2 shift 2 ;; --release) RELEASE=$2 shift 2 ;; --github-release) GITHUB_RELEASE=$2 shift 2 ;; --backend) BACKEND=$2 shift 2 ;; --release-profile) RELEASE_PROFILE=$2 shift 2 ;; --remote) REMOTE=$2 shift 2 ;; --remote-repo) REMOTE_REPO=$2 shift 2 ;; --remote-run-dir) REMOTE_RUN_DIR=$2 shift 2 ;; --brev-instance) BREV_INSTANCE=$2 shift 2 ;; --brev-on-finish) BREV_ON_FINISH=$2 shift 2 ;; --brev-provider) BREV_PROVIDER=$2 BREV_PROVIDER_EXPLICIT=1 shift 2 ;; --brev-instance-type) BREV_INSTANCE_TYPE=$2 BREV_INSTANCE_TYPE_EXPLICIT=1 shift 2 ;; --brev-stop-failure-action) BREV_STOP_FAILURE_ACTION=$2 BREV_STOP_FAILURE_ACTION_EXPLICIT=1 shift 2 ;; --brev-cleanup-timeout-seconds) BREV_CLEANUP_TIMEOUT_SECONDS=$2 shift 2 ;; --brev-create-timeout-seconds) BREV_CREATE_TIMEOUT_SECONDS=$2 shift 2 ;; --brev-container-image) BREV_CONTAINER_IMAGE=$2 shift 2 ;; --brev-sync-mode) BREV_SYNC_MODE=$2 shift 2 ;; --brev-max-runtime-seconds) BREV_MAX_RUNTIME_SECONDS=$2 shift 2 ;; --brev-instance-type-fallback-count) BREV_INSTANCE_TYPE_FALLBACK_COUNT=$2 shift 2 ;; --brev-exclude-providers) BREV_EXCLUDE_PROVIDERS=$2 shift 2 ;; --no-sync-remote-output) SYNC_REMOTE_OUTPUT=0 shift ;; --skip-train) SKIP_TRAIN=1 shift ;; --skip-eval) SKIP_EVAL=1 shift ;; --skip-plots) SKIP_PLOTS=1 shift ;; --skip-deploy) SKIP_DEPLOY=1 shift ;; --deploy-mode) DEPLOY_MODE=$2 shift 2 ;; --data-dir) DATA_DIR=$2 shift 2 ;; --compare-include) COMPARE_INCLUDE=$2 shift 2 ;; --eval-max-benchmark-files) EVAL_MAX_BENCHMARK_FILES=$2 shift 2 ;; --presentation-modes) PRESENTATION_MODES=$2 shift 2 ;; --compare-presentation-num-jobs) COMPARE_PRESENTATION_NUM_JOBS=$2 shift 2 ;; --compare-presentation-max-workers-per-gpu) COMPARE_PRESENTATION_MAX_WORKERS_PER_GPU=$2 shift 2 ;; --compare-presentation-max-tasks-per-worker) COMPARE_PRESENTATION_MAX_TASKS_PER_WORKER=$2 shift 2 ;; --compare-presentation-torch-compile) COMPARE_PRESENTATION_TORCH_COMPILE=$2 shift 2 ;; --compare-baseline) COMPARE_BASELINE=$2 shift 2 ;; --compare-baseline-label) COMPARE_BASELINE_LABEL=$2 shift 2 ;; --compare-gpus) COMPARE_GPUS=$2 shift 2 ;; --paper-figures-scores-dir) PAPER_FIGURES_SCORES_DIR=$2 shift 2 ;; --paper-figures-artifacts-dir) PAPER_FIGURES_ARTIFACTS_DIR=$2 if [ -z "$PAPER_FIGURES_SCORES_DIR" ]; then PAPER_FIGURES_SCORES_DIR=$2 fi shift 2 ;; --paper-figures-multiallelic-predictions) PAPER_FIGURES_MULTIALLELIC_PREDICTIONS=$2 shift 2 ;; --paper-figures-monoallelic-predictions) PAPER_FIGURES_MONOALLELIC_PREDICTIONS=$2 shift 2 ;; --paper-figures-prepare-command) PAPER_FIGURES_PREPARE_COMMAND=$2 shift 2 ;; --paper-figures-candidate-predictor) PAPER_FIGURES_CANDIDATE_PREDICTOR=$2 shift 2 ;; --paper-figures-external-baselines) PAPER_FIGURES_EXTERNAL_BASELINES=$2 shift 2 ;; --paper-figures-preferred-predictors) PAPER_FIGURES_PREFERRED_PREDICTORS=$2 shift 2 ;; --paper-figures-presentation-panel-predictors) PAPER_FIGURES_PRESENTATION_PANEL_PREDICTORS=$2 shift 2 ;; --paper-figures-presentation-panel-baselines) PAPER_FIGURES_PRESENTATION_PANEL_BASELINES=$2 shift 2 ;; --run-label) RUN_LABEL=$2 shift 2 ;; --dry-run) DRY_RUN=1 shift ;; --allow-dirty-repo) ALLOW_DIRTY_REPO=1 shift ;; --minibatch-size) TRAINING_MINIBATCH_SIZE=$2 shift 2 ;; --random-seed) RELEASE_RANDOM_SEED=$2 shift 2 ;; --affinity-minibatch-size) AFFINITY_MINIBATCH_SIZE=$2 shift 2 ;; --affinity-optimizer-implementation) AFFINITY_OPTIMIZER_IMPLEMENTATION=$2 shift 2 ;; --affinity-lsuv-target) AFFINITY_LSUV_TARGET=$2 shift 2 ;; --affinity-init) AFFINITY_INIT=$2 shift 2 ;; --affinity-max-workers-per-gpu) AFFINITY_MAX_WORKERS_PER_GPU=$2 AFFINITY_MAX_WORKERS_PER_GPU_EXPLICIT=1 shift 2 ;; --processing-minibatch-size) PROCESSING_MINIBATCH_SIZE=$2 shift 2 ;; --processing-num-jobs) PROCESSING_NUM_JOBS=$2 shift 2 ;; --processing-max-workers-per-gpu) PROCESSING_MAX_WORKERS_PER_GPU=$2 shift 2 ;; --processing-held-out-samples) PROCESSING_HELD_OUT_SAMPLES=$2 shift 2 ;; --processing-variants) PROCESSING_VARIANTS=$2 PROCESSING_VARIANTS_EXPLICIT=1 shift 2 ;; --processing-short-flank-boundary-radius) PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS=$2 shift 2 ;; --presentation-processing-with-flanks-kind) PRESENTATION_PROCESSING_WITH_FLANKS_KIND=$2 PRESENTATION_PROCESSING_WITH_FLANKS_KIND_EXPLICIT=1 shift 2 ;; --presentation-decoys-per-hit) PRESENTATION_DECOYS_PER_HIT=$2 shift 2 ;; --presentation-sample-fraction) PRESENTATION_SAMPLE_FRACTION=$2 shift 2 ;; --presentation-feature-chunk-size) PRESENTATION_FEATURE_CHUNK_SIZE=$2 shift 2 ;; --presentation-num-jobs) PRESENTATION_NUM_JOBS=$2 shift 2 ;; --presentation-max-workers-per-gpu) PRESENTATION_MAX_WORKERS_PER_GPU=$2 shift 2 ;; --presentation-calibration-num-jobs) PRESENTATION_CALIBRATION_NUM_JOBS=$2 shift 2 ;; --presentation-calibration-max-workers-per-gpu) PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU=$2 shift 2 ;; --presentation-calibration-prediction-batch-size) PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE=$2 shift 2 ;; --processing-modes) PROCESSING_MODES=$2 PROCESSING_MODES_EXPLICIT=1 shift 2 ;; -h|--help) usage exit 0 ;; *) die "Unknown argument: $1" ;; esac done [ -n "$RUN_DIR" ] || die "--run-dir is required" [ -n "$RELEASE" ] || die "--release is required" if [ -z "$GITHUB_RELEASE" ]; then GITHUB_RELEASE=$RELEASE fi if [ -z "$RUN_LABEL" ]; then RUN_LABEL="MHCflurry $(display_release_version "$RELEASE")" fi if [ -z "$COMPARE_BASELINE_LABEL" ]; then baseline_release="$(public_release_from_spec "$COMPARE_BASELINE")" if [ -n "$baseline_release" ]; then COMPARE_BASELINE_LABEL="MHCflurry $(display_release_version "$baseline_release")" elif [ "$COMPARE_BASELINE" = "public" ]; then COMPARE_BASELINE_LABEL="MHCflurry public" else COMPARE_BASELINE_LABEL="$(basename "$COMPARE_BASELINE")" fi fi if [ -z "$AFFINITY_MINIBATCH_SIZE" ]; then AFFINITY_MINIBATCH_SIZE=$TRAINING_MINIBATCH_SIZE fi if [ -z "$PROCESSING_MINIBATCH_SIZE" ]; then PROCESSING_MINIBATCH_SIZE=512 fi apply_release_profile validate_processing_configuration validate_nonnegative_integer "--random-seed" "$RELEASE_RANDOM_SEED" validate_positive_integer "--affinity-minibatch-size" "$AFFINITY_MINIBATCH_SIZE" validate_positive_integer "--processing-minibatch-size" "$PROCESSING_MINIBATCH_SIZE" case "$AFFINITY_OPTIMIZER_IMPLEMENTATION" in keras|pytorch) ;; *) die "--affinity-optimizer-implementation must be keras or pytorch" ;; esac case "$AFFINITY_LSUV_TARGET" in post_activation|pre_activation) ;; *) die "--affinity-lsuv-target must be post_activation or pre_activation" ;; esac case "$AFFINITY_INIT" in glorot_uniform|glorot_normal|he_uniform|he_normal|orthogonal) ;; *) die "unsupported --affinity-init: $AFFINITY_INIT" ;; esac validate_positive_integer "--processing-held-out-samples" "$PROCESSING_HELD_OUT_SAMPLES" validate_positive_number "--presentation-decoys-per-hit" "$PRESENTATION_DECOYS_PER_HIT" validate_fraction "--presentation-sample-fraction" "$PRESENTATION_SAMPLE_FRACTION" validate_positive_integer "--presentation-feature-chunk-size" "$PRESENTATION_FEATURE_CHUNK_SIZE" validate_auto_or_positive_integer "--affinity-max-workers-per-gpu" "$AFFINITY_MAX_WORKERS_PER_GPU" validate_auto_or_nonnegative_integer "--processing-num-jobs" "$PROCESSING_NUM_JOBS" validate_auto_or_positive_integer "--processing-max-workers-per-gpu" "$PROCESSING_MAX_WORKERS_PER_GPU" validate_auto_or_nonnegative_integer "--presentation-num-jobs" "$PRESENTATION_NUM_JOBS" validate_auto_or_positive_integer "--presentation-max-workers-per-gpu" "$PRESENTATION_MAX_WORKERS_PER_GPU" validate_auto_or_nonnegative_integer "--presentation-calibration-num-jobs" "$PRESENTATION_CALIBRATION_NUM_JOBS" validate_auto_or_positive_integer "--presentation-calibration-max-workers-per-gpu" "$PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU" validate_auto_or_positive_integer "--presentation-calibration-prediction-batch-size" "$PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE" validate_auto_or_nonnegative_integer "COMPARE_NUM_JOBS" "$COMPARE_NUM_JOBS" validate_auto_or_positive_integer "COMPARE_MAX_WORKERS_PER_GPU" "$COMPARE_MAX_WORKERS_PER_GPU" validate_positive_integer "COMPARE_MAX_TASKS_PER_WORKER" "$COMPARE_MAX_TASKS_PER_WORKER" validate_auto_or_nonnegative_integer "COMPARE_PRESENTATION_NUM_JOBS" "$COMPARE_PRESENTATION_NUM_JOBS" validate_auto_or_positive_integer "COMPARE_PRESENTATION_MAX_WORKERS_PER_GPU" "$COMPARE_PRESENTATION_MAX_WORKERS_PER_GPU" validate_positive_integer "COMPARE_PRESENTATION_MAX_TASKS_PER_WORKER" "$COMPARE_PRESENTATION_MAX_TASKS_PER_WORKER" validate_positive_number "--brev-cleanup-timeout-seconds" "$BREV_CLEANUP_TIMEOUT_SECONDS" validate_positive_number "--brev-create-timeout-seconds" "$BREV_CREATE_TIMEOUT_SECONDS" validate_positive_number "BREV_POSTPROCESS_TIMEOUT_SECONDS" "$BREV_POSTPROCESS_TIMEOUT_SECONDS" validate_positive_integer "BREV_SHELL_READY_ATTEMPTS" "$BREV_SHELL_READY_ATTEMPTS" validate_positive_number "BREV_SHELL_READY_DELAY_SECONDS" "$BREV_SHELL_READY_DELAY_SECONDS" validate_nonnegative_integer "BREV_INSTANCE_TYPE_FALLBACK_COUNT" "$BREV_INSTANCE_TYPE_FALLBACK_COUNT" if [ -n "$BREV_MAX_RUNTIME_SECONDS" ]; then validate_positive_number "--brev-max-runtime-seconds" "$BREV_MAX_RUNTIME_SECONDS" fi COMPARE_TORCH_COMPILE="$(normalize_compare_torch_compile "$COMPARE_TORCH_COMPILE")" COMPARE_PRESENTATION_TORCH_COMPILE="$(normalize_compare_torch_compile "$COMPARE_PRESENTATION_TORCH_COMPILE")" COMPARE_MATMUL_PRECISION="$(normalize_compare_matmul_precision "$COMPARE_MATMUL_PRECISION")" validate_compare_gpus "$COMPARE_GPUS" if [ -n "$EVAL_MAX_BENCHMARK_FILES" ]; then case "$EVAL_MAX_BENCHMARK_FILES" in ''|*[!0-9]*) die "--eval-max-benchmark-files must be a positive integer; got '$EVAL_MAX_BENCHMARK_FILES'" ;; 0) die "--eval-max-benchmark-files must be a positive integer; got '$EVAL_MAX_BENCHMARK_FILES'" ;; esac fi case "$BACKEND" in local|brev-existing|brev-provision|ssh) ;; *) die "--backend must be one of: local, brev-existing, brev-provision, ssh" ;; esac case "$DEPLOY_MODE" in none|dry-run|draft|publish) ;; *) die "--deploy-mode must be one of: none, dry-run, draft, publish" ;; esac if [ "$SYNC_REMOTE_OUTPUT" != "1" ] && [ "$SKIP_TRAIN" != "1" ]; then case "$BACKEND" in local) die "--no-sync-remote-output requires a remote backend" ;; ssh|brev-existing|brev-provision) [ "$SKIP_EVAL" = "1" ] || die \ "--no-sync-remote-output requires --skip-eval because the trained models will not exist locally" [ "$SKIP_PLOTS" = "1" ] || die \ "--no-sync-remote-output requires --skip-plots because the evaluation artifacts will not exist locally" [ "$DEPLOY_MODE" = "none" ] || die \ "--no-sync-remote-output requires --deploy-mode none because deployment reads local artifacts" ;; esac fi if [ "$ALLOW_DIRTY_REPO" = "1" ]; then case "$DEPLOY_MODE" in draft|publish) die "--allow-dirty-repo cannot be combined with --deploy-mode $DEPLOY_MODE" ;; esac fi if [ "$SKIP_DEPLOY" = "1" ]; then if [ "$DEPLOY_MODE" != "none" ]; then die "--skip-deploy cannot be combined with --deploy-mode $DEPLOY_MODE; deployment is opt-in, so omit --skip-deploy or use --deploy-mode none" fi warn "--skip-deploy is deprecated and no longer needed; deployment is opt-in." fi if [ -n "$PAPER_FIGURES_PREPARE_COMMAND" ]; then if [ "$SKIP_PLOTS" = "1" ]; then die "--paper-figures-prepare-command cannot be combined with --skip-plots" fi if ! paper_figure_inputs_requested; then die "--paper-figures-prepare-command requires --paper-figures-scores-dir or --paper-figures-*-predictions so its outputs are used" fi fi if [ -z "$BREV_ON_FINISH" ]; then case "$BACKEND" in brev-provision) BREV_ON_FINISH=stop ;; *) BREV_ON_FINISH=leave ;; esac fi case "$BREV_ON_FINISH" in leave|stop|delete) ;; *) die "--brev-on-finish must be one of: leave, stop, delete" ;; esac if [ -z "$BREV_STOP_FAILURE_ACTION" ]; then if [ "$SYNC_REMOTE_OUTPUT" != "1" ]; then # A failed stop must never fall through to deletion while the only # artifact copy still lives on the remote disk. BREV_STOP_FAILURE_ACTION=warn else case "$BACKEND" in brev-provision) BREV_STOP_FAILURE_ACTION=delete ;; *) BREV_STOP_FAILURE_ACTION=warn ;; esac fi fi case "$BREV_STOP_FAILURE_ACTION" in warn|delete) ;; *) die "--brev-stop-failure-action must be one of: warn, delete" ;; esac if [ "$SYNC_REMOTE_OUTPUT" != "1" ]; then case "$BACKEND" in brev-existing|brev-provision) [ "$BREV_ON_FINISH" != "delete" ] || die \ "--no-sync-remote-output cannot be combined with --brev-on-finish delete because that would destroy the only artifact copy" if [ "$BREV_STOP_FAILURE_ACTION" = "delete" ]; then if [ "$BREV_STOP_FAILURE_ACTION_EXPLICIT" = "1" ]; then die "--no-sync-remote-output cannot be combined with --brev-stop-failure-action delete because that could destroy the only artifact copy" fi BREV_STOP_FAILURE_ACTION=warn fi ;; esac fi case "$BREV_SYNC_MODE" in release|full) ;; *) die "--brev-sync-mode must be one of: release, full" ;; esac if [ "$BACKEND" = "brev-provision" ] && [ -z "$BREV_INSTANCE" ]; then RELEASE_SLUG=$( printf '%s' "$RELEASE" | tr -cs 'A-Za-z0-9' '-' | sed 's/^-//; s/-$//' ) BREV_INSTANCE="mhcflurry-${RELEASE_SLUG}-$(date +%Y%m%d-%H%M%S)" fi if [ "$BACKEND" = "brev-provision" ] && \ [ -n "$BREV_INSTANCE_TYPE" ]; then if [ "$BREV_PROVIDER_EXPLICIT" = "1" ] && \ [ "$(lowercase "$BREV_PROVIDER")" != "auto" ]; then die "a non-auto --brev-provider cannot be combined with --brev-instance-type" fi # An exact type is a complete Brev selection. Do not let an implicit # provider default or a release profile add a second selection mechanism. BREV_PROVIDER=auto elif [ "$BACKEND" = "brev-provision" ] && \ [ "$(lowercase "$BREV_PROVIDER")" != "auto" ]; then BREV_INSTANCE_TYPE="$(brev_provider_instance_type "$BREV_PROVIDER")" fi if [ "$BACKEND" = "brev-provision" ] && \ [ -z "$BREV_INSTANCE_TYPE" ] && \ [ -n "$DEFAULT_BREV_PROVISION_INSTANCE_TYPE" ]; then BREV_INSTANCE_TYPE=$DEFAULT_BREV_PROVISION_INSTANCE_TYPE fi case "$BACKEND" in brev-existing) [ -n "$BREV_INSTANCE" ] || \ die "--brev-instance is required for --backend brev-existing" ;; brev-provision) [ -n "$BREV_INSTANCE" ] || \ die "could not derive a Brev instance name for --backend brev-provision" ;; esac case "$RUN_DIR" in /*) ;; *) RUN_DIR="$(pwd)/$RUN_DIR" ;; esac RUN_DIR=${RUN_DIR%/} WORKFLOW_LOG_DIR="$RUN_DIR/workflow_logs" WORKFLOW_STATUS_LOG="$WORKFLOW_LOG_DIR/status.tsv" run_cmd mkdir -p "$WORKFLOW_LOG_DIR" if [ "$DRY_RUN" != "1" ]; then printf 'timestamp\tstep\tstatus\tdetails\n' > "$WORKFLOW_STATUS_LOG" fi note "Run directory: $RUN_DIR" note "Release: $RELEASE" note "Backend: $BACKEND" note "Profile: $RELEASE_PROFILE" note "Random seed: $RELEASE_RANDOM_SEED" note "Batch sizes: affinity=$AFFINITY_MINIBATCH_SIZE processing=$PROCESSING_MINIBATCH_SIZE" note "Affinity: optimizer=$AFFINITY_OPTIMIZER_IMPLEMENTATION; lsuv=$AFFINITY_LSUV_TARGET; init=$AFFINITY_INIT" note "Compare: $RUN_LABEL vs $COMPARE_BASELINE_LABEL ($COMPARE_BASELINE)" note "Affinity MWPG: $AFFINITY_MAX_WORKERS_PER_GPU" note "Processing: variants=$PROCESSING_VARIANTS; eval_modes=$PROCESSING_MODES; boundary_radius=$PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS; jobs=$PROCESSING_NUM_JOBS; workers/gpu=$PROCESSING_MAX_WORKERS_PER_GPU" note "Presentation: decoys/hit=$PRESENTATION_DECOYS_PER_HIT; sample_fraction=$PRESENTATION_SAMPLE_FRACTION; jobs=$PRESENTATION_NUM_JOBS; workers/gpu=$PRESENTATION_MAX_WORKERS_PER_GPU" if [ -n "$PAPER_FIGURES_PREPARE_COMMAND" ]; then note "Paper inputs: local prepare command configured" fi case "$BACKEND" in brev-existing|brev-provision) note "Brev instance: $BREV_INSTANCE" note "Brev cleanup: $BREV_ON_FINISH" note "Brev provider: $BREV_PROVIDER" note "Stop fallback: $BREV_STOP_FAILURE_ACTION" note "Brev sync: $BREV_SYNC_MODE" note "Brev type: ${BREV_INSTANCE_TYPE:-runplz auto-select}" note "Brev image: $BREV_CONTAINER_IMAGE" ;; esac validate_release_provenance source_provenance 0 if [ "$DRY_RUN" = "1" ]; then RELEASE_GIT_COMMIT='' else RELEASE_GIT_COMMIT="$(git -C "$REPO" rev-parse HEAD)" fi trap cleanup_background_jobs EXIT start_paper_figures_prepare if [ "$SKIP_TRAIN" = "1" ]; then validate_release_provenance model_provenance 1 fi if [ "$SKIP_TRAIN" != "1" ]; then case "$BACKEND" in local) run_cmd mkdir -p "$RUN_DIR" run_logged_step train_local env \ "MHCFLURRY_OUT=$RUN_DIR" \ "REPO=$REPO" \ "MHCFLURRY_RELEASE_WORKFLOW_ID=$WORKFLOW_RUN_ID" \ "MHCFLURRY_RELEASE_GIT_COMMIT=$RELEASE_GIT_COMMIT" \ "MHCFLURRY_RELEASE_RECIPE=$MHCFLURRY_RELEASE_RECIPE" \ "RELEASE_RANDOM_SEED=$RELEASE_RANDOM_SEED" \ "TRAINING_MINIBATCH_SIZE=$TRAINING_MINIBATCH_SIZE" \ "AFFINITY_MINIBATCH_SIZE=$AFFINITY_MINIBATCH_SIZE" \ "AFFINITY_OPTIMIZER_IMPLEMENTATION=$AFFINITY_OPTIMIZER_IMPLEMENTATION" \ "AFFINITY_LSUV_TARGET=$AFFINITY_LSUV_TARGET" \ "AFFINITY_INIT=$AFFINITY_INIT" \ "AFFINITY_MAX_WORKERS_PER_GPU=$AFFINITY_MAX_WORKERS_PER_GPU" \ "PROCESSING_MINIBATCH_SIZE=$PROCESSING_MINIBATCH_SIZE" \ "PROCESSING_NUM_JOBS=$PROCESSING_NUM_JOBS" \ "PROCESSING_MAX_WORKERS_PER_GPU=$PROCESSING_MAX_WORKERS_PER_GPU" \ "PROCESSING_HELD_OUT_SAMPLES=$PROCESSING_HELD_OUT_SAMPLES" \ "PROCESSING_VARIANTS=$PROCESSING_VARIANTS" \ "PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS=$PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS" \ "PRESENTATION_PROCESSING_WITH_FLANKS_KIND=$PRESENTATION_PROCESSING_WITH_FLANKS_KIND" \ "PRESENTATION_DECOYS_PER_HIT=$PRESENTATION_DECOYS_PER_HIT" \ "PRESENTATION_SAMPLE_FRACTION=$PRESENTATION_SAMPLE_FRACTION" \ "PRESENTATION_FEATURE_CHUNK_SIZE=$PRESENTATION_FEATURE_CHUNK_SIZE" \ "PRESENTATION_NUM_JOBS=$PRESENTATION_NUM_JOBS" \ "PRESENTATION_MAX_WORKERS_PER_GPU=$PRESENTATION_MAX_WORKERS_PER_GPU" \ "PRESENTATION_CALIBRATION_NUM_JOBS=$PRESENTATION_CALIBRATION_NUM_JOBS" \ "PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU=$PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU" \ "PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE=$PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE" \ "MHCFLURRY_TORCH_COMPILE=$MHCFLURRY_TORCH_COMPILE" \ "MHCFLURRY_TORCH_COMPILE_LOSS=$MHCFLURRY_TORCH_COMPILE_LOSS" \ "MHCFLURRY_MATMUL_PRECISION=$MHCFLURRY_MATMUL_PRECISION" \ "MATMUL_PRECISION=$MATMUL_PRECISION" \ "MATMUL_PRECISION_CLI=$MATMUL_PRECISION_CLI" \ bash "$REPO/scripts/training/pan_allele_release_full.sh" ;; brev-existing) run_brev_training 0 ;; brev-provision) run_brev_training 1 ;; ssh) require_command ssh [ -n "$REMOTE" ] || die "--remote is required for --backend ssh" [ -n "$REMOTE_REPO" ] || die "--remote-repo is required for --backend ssh" [ -n "$REMOTE_RUN_DIR" ] || \ die "--remote-run-dir is required for --backend ssh" verify_ssh_remote_checkout REMOTE_REPO_QUOTED="$(shell_quote "$REMOTE_REPO")" REMOTE_COMMAND="cd $REMOTE_REPO_QUOTED" REMOTE_COMMAND="$REMOTE_COMMAND && MHCFLURRY_OUT=$(shell_quote "$REMOTE_RUN_DIR")" REMOTE_COMMAND="$REMOTE_COMMAND REPO=$(shell_quote "$REMOTE_REPO")" REMOTE_COMMAND="$REMOTE_COMMAND MHCFLURRY_RELEASE_WORKFLOW_ID=$(shell_quote "$WORKFLOW_RUN_ID")" REMOTE_COMMAND="$REMOTE_COMMAND MHCFLURRY_RELEASE_GIT_COMMIT=\$(git -C $REMOTE_REPO_QUOTED rev-parse HEAD)" REMOTE_COMMAND="$REMOTE_COMMAND MHCFLURRY_RELEASE_RECIPE=$(shell_quote "$MHCFLURRY_RELEASE_RECIPE")" REMOTE_COMMAND="$REMOTE_COMMAND RELEASE_RANDOM_SEED=$(shell_quote "$RELEASE_RANDOM_SEED")" REMOTE_COMMAND="$REMOTE_COMMAND TRAINING_MINIBATCH_SIZE=$(shell_quote "$TRAINING_MINIBATCH_SIZE")" REMOTE_COMMAND="$REMOTE_COMMAND AFFINITY_MINIBATCH_SIZE=$(shell_quote "$AFFINITY_MINIBATCH_SIZE")" REMOTE_COMMAND="$REMOTE_COMMAND AFFINITY_OPTIMIZER_IMPLEMENTATION=$(shell_quote "$AFFINITY_OPTIMIZER_IMPLEMENTATION")" REMOTE_COMMAND="$REMOTE_COMMAND AFFINITY_LSUV_TARGET=$(shell_quote "$AFFINITY_LSUV_TARGET")" REMOTE_COMMAND="$REMOTE_COMMAND AFFINITY_INIT=$(shell_quote "$AFFINITY_INIT")" REMOTE_COMMAND="$REMOTE_COMMAND AFFINITY_MAX_WORKERS_PER_GPU=$(shell_quote "$AFFINITY_MAX_WORKERS_PER_GPU")" REMOTE_COMMAND="$REMOTE_COMMAND PROCESSING_MINIBATCH_SIZE=$(shell_quote "$PROCESSING_MINIBATCH_SIZE")" REMOTE_COMMAND="$REMOTE_COMMAND PROCESSING_NUM_JOBS=$(shell_quote "$PROCESSING_NUM_JOBS")" REMOTE_COMMAND="$REMOTE_COMMAND PROCESSING_MAX_WORKERS_PER_GPU=$(shell_quote "$PROCESSING_MAX_WORKERS_PER_GPU")" REMOTE_COMMAND="$REMOTE_COMMAND PROCESSING_HELD_OUT_SAMPLES=$(shell_quote "$PROCESSING_HELD_OUT_SAMPLES")" REMOTE_COMMAND="$REMOTE_COMMAND PROCESSING_VARIANTS=$(shell_quote "$PROCESSING_VARIANTS")" REMOTE_COMMAND="$REMOTE_COMMAND PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS=$(shell_quote "$PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS")" REMOTE_COMMAND="$REMOTE_COMMAND PRESENTATION_PROCESSING_WITH_FLANKS_KIND=$(shell_quote "$PRESENTATION_PROCESSING_WITH_FLANKS_KIND")" REMOTE_COMMAND="$REMOTE_COMMAND PRESENTATION_DECOYS_PER_HIT=$(shell_quote "$PRESENTATION_DECOYS_PER_HIT")" REMOTE_COMMAND="$REMOTE_COMMAND PRESENTATION_SAMPLE_FRACTION=$(shell_quote "$PRESENTATION_SAMPLE_FRACTION")" REMOTE_COMMAND="$REMOTE_COMMAND PRESENTATION_FEATURE_CHUNK_SIZE=$(shell_quote "$PRESENTATION_FEATURE_CHUNK_SIZE")" REMOTE_COMMAND="$REMOTE_COMMAND PRESENTATION_NUM_JOBS=$(shell_quote "$PRESENTATION_NUM_JOBS")" REMOTE_COMMAND="$REMOTE_COMMAND PRESENTATION_MAX_WORKERS_PER_GPU=$(shell_quote "$PRESENTATION_MAX_WORKERS_PER_GPU")" REMOTE_COMMAND="$REMOTE_COMMAND PRESENTATION_CALIBRATION_NUM_JOBS=$(shell_quote "$PRESENTATION_CALIBRATION_NUM_JOBS")" REMOTE_COMMAND="$REMOTE_COMMAND PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU=$(shell_quote "$PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU")" REMOTE_COMMAND="$REMOTE_COMMAND PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE=$(shell_quote "$PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE")" REMOTE_COMMAND="$REMOTE_COMMAND MHCFLURRY_TORCH_COMPILE=$(shell_quote "$MHCFLURRY_TORCH_COMPILE")" REMOTE_COMMAND="$REMOTE_COMMAND MHCFLURRY_TORCH_COMPILE_LOSS=$(shell_quote "$MHCFLURRY_TORCH_COMPILE_LOSS")" REMOTE_COMMAND="$REMOTE_COMMAND MHCFLURRY_MATMUL_PRECISION=$(shell_quote "$MHCFLURRY_MATMUL_PRECISION")" REMOTE_COMMAND="$REMOTE_COMMAND MATMUL_PRECISION=$(shell_quote "$MATMUL_PRECISION")" REMOTE_COMMAND="$REMOTE_COMMAND MATMUL_PRECISION_CLI=$(shell_quote "$MATMUL_PRECISION_CLI")" REMOTE_COMMAND="$REMOTE_COMMAND bash" REMOTE_COMMAND="$REMOTE_COMMAND scripts/training/pan_allele_release_full.sh" run_logged_step train_ssh ssh "$REMOTE" \ "$REMOTE_COMMAND" if [ "$SYNC_REMOTE_OUTPUT" = "1" ]; then require_command rsync run_cmd mkdir -p "$RUN_DIR" run_logged_step ssh_sync_output \ rsync -a "$REMOTE:$REMOTE_RUN_DIR/" "$RUN_DIR/" fi ;; esac else note "Skipping training." case "$BACKEND" in brev-existing) wait_paper_figures_prepare run_brev_postprocess 0 ;; brev-provision) wait_paper_figures_prepare run_brev_postprocess 1 ;; esac fi if [ "$SKIP_TRAIN" != "1" ]; then if [ "$BACKEND" = "ssh" ] && [ "$SYNC_REMOTE_OUTPUT" != "1" ]; then validate_ssh_remote_release_provenance elif [ "$BACKEND" != "local" ] && [ "$SYNC_REMOTE_OUTPUT" != "1" ]; then note "Using model provenance validation completed by the remote Brev launcher." else validate_release_provenance model_provenance 1 fi fi if [ "$SKIP_EVAL" != "1" ]; then if [ "$BREV_REMOTE_EVAL_DONE" = "1" ]; then note "Using evaluation produced on the Brev instance." else EVAL_OUT="$RUN_DIR/eval_comparison" run_cmd mkdir -p "$EVAL_OUT" if [ -z "$DATA_DIR" ]; then require_command mhcflurry-downloads run_logged_step fetch_eval_downloads \ mhcflurry-downloads fetch data_evaluation models_class1_pan \ models_class1_processing models_class1_presentation if [ "$DRY_RUN" = "1" ]; then DATA_DIR='' else DATA_DIR="$(mhcflurry-downloads path data_evaluation)" fi fi case ",$COMPARE_INCLUDE," in *,affinity,*) run_logged_step fetch_train_excluded_affinity_baseline \ mhcflurry-downloads fetch models_class1_pan_variants ;; esac run_logged_step fetch_compare_baseline_downloads \ fetch_pinned_public_baseline_downloads compare_args=( mhcflurry eval compare-models --a "$RUN_DIR" --a-label "$RUN_LABEL" --b "$COMPARE_BASELINE" --b-label "$COMPARE_BASELINE_LABEL" --data-dir "$DATA_DIR" --release-holdout-dir "$RUN_DIR/release_holdout" --affinity-training-overlap-policy audit --include "$COMPARE_INCLUDE" --processing-modes "$PROCESSING_MODES" --presentation-modes "$PRESENTATION_MODES" --backend "$COMPARE_BACKEND" --num-jobs "$COMPARE_NUM_JOBS" --max-workers-per-gpu "$COMPARE_MAX_WORKERS_PER_GPU" --max-tasks-per-worker "$COMPARE_MAX_TASKS_PER_WORKER" --presentation-num-jobs "$COMPARE_PRESENTATION_NUM_JOBS" --presentation-max-workers-per-gpu "$COMPARE_PRESENTATION_MAX_WORKERS_PER_GPU" --presentation-max-tasks-per-worker "$COMPARE_PRESENTATION_MAX_TASKS_PER_WORKER" --presentation-torch-compile "$COMPARE_PRESENTATION_TORCH_COMPILE" --torch-compile "$COMPARE_TORCH_COMPILE" --matmul-precision "$COMPARE_MATMUL_PRECISION" --out "$EVAL_OUT" ) if [ -n "$EVAL_MAX_BENCHMARK_FILES" ]; then compare_args+=(--limit-files "$EVAL_MAX_BENCHMARK_FILES") fi case "$(lowercase "$COMPARE_GPUS")" in auto) ;; *) compare_args+=(--gpus "$COMPARE_GPUS") ;; esac run_logged_step compare_models "${compare_args[@]}" case ",$COMPARE_INCLUDE," in *,affinity,*) if [ "$DRY_RUN" = "1" ]; then TRAIN_EXCLUDED_AFFINITY_DIR='/models.no_additional_ms' else TRAIN_EXCLUDED_AFFINITY_DIR="$( mhcflurry-downloads path models_class1_pan_variants )/models.no_additional_ms" fi fair_affinity_args=( mhcflurry eval compare-models --a "$RUN_DIR" --a-label "$RUN_LABEL" --b "$TRAIN_EXCLUDED_AFFINITY_DIR" --b-affinity-dir "$TRAIN_EXCLUDED_AFFINITY_DIR" --b-label "MHCflurry no-additional-MS (train-excluded)" --data-dir "$DATA_DIR" --release-holdout-dir "$RUN_DIR/release_holdout" --affinity-training-overlap-policy exclude --include affinity --affinity-source no_additional_ms --backend "$COMPARE_BACKEND" --num-jobs "$COMPARE_NUM_JOBS" --max-workers-per-gpu "$COMPARE_MAX_WORKERS_PER_GPU" --max-tasks-per-worker "$COMPARE_MAX_TASKS_PER_WORKER" --torch-compile "$COMPARE_TORCH_COMPILE" --matmul-precision "$COMPARE_MATMUL_PRECISION" --out "$RUN_DIR/eval_comparison_train_excluded_affinity" ) if [ -n "$EVAL_MAX_BENCHMARK_FILES" ]; then fair_affinity_args+=( --limit-files "$EVAL_MAX_BENCHMARK_FILES") fi case "$(lowercase "$COMPARE_GPUS")" in auto) ;; *) fair_affinity_args+=(--gpus "$COMPARE_GPUS") ;; esac run_logged_step compare_models_train_excluded_affinity \ "${fair_affinity_args[@]}" ;; esac fi else note "Skipping evaluation." fi if [ "$SKIP_PLOTS" != "1" ]; then wait_paper_figures_prepare if [ "$BREV_REMOTE_PLOTS_DONE" = "1" ]; then note "Using plots produced on the Brev instance." else plot_args=( mhcflurry eval plot-comparison --input "$RUN_DIR/eval_comparison" --a-label "$RUN_LABEL" --b-label "$COMPARE_BASELINE_LABEL" --summary-pdf "$RUN_DIR/eval_comparison/plots/model_comparison_figures.pdf" --paper-figures-out "$RUN_DIR/eval_comparison/plots/paper_figures" --paper-figures-formats "$PAPER_FIGURES_FORMATS" --paper-figures-scores-dir "${PAPER_FIGURES_SCORES_DIR:-$RUN_DIR/eval_comparison}" --include-paper-figures-in-summary-pdf ) if [ -n "$PAPER_FIGURES_MULTIALLELIC_PREDICTIONS" ]; then plot_args+=(--paper-figures-multiallelic-predictions "$PAPER_FIGURES_MULTIALLELIC_PREDICTIONS") fi if [ -n "$PAPER_FIGURES_MONOALLELIC_PREDICTIONS" ]; then plot_args+=(--paper-figures-monoallelic-predictions "$PAPER_FIGURES_MONOALLELIC_PREDICTIONS") fi if [ -n "$PAPER_FIGURES_CANDIDATE_PREDICTOR" ]; then plot_args+=(--paper-figures-candidate-predictor "$PAPER_FIGURES_CANDIDATE_PREDICTOR") fi if [ -n "$PAPER_FIGURES_EXTERNAL_BASELINES" ]; then plot_args+=(--paper-figures-external-baselines "$PAPER_FIGURES_EXTERNAL_BASELINES") fi if [ -n "$PAPER_FIGURES_PREFERRED_PREDICTORS" ]; then plot_args+=(--paper-figures-preferred-predictors "$PAPER_FIGURES_PREFERRED_PREDICTORS") fi if [ -n "$PAPER_FIGURES_PRESENTATION_PANEL_PREDICTORS" ]; then plot_args+=(--paper-figures-presentation-panel-predictors "$PAPER_FIGURES_PRESENTATION_PANEL_PREDICTORS") fi if [ -n "$PAPER_FIGURES_PRESENTATION_PANEL_BASELINES" ]; then plot_args+=(--paper-figures-presentation-panel-baselines "$PAPER_FIGURES_PRESENTATION_PANEL_BASELINES") fi run_logged_step plot_model_comparison \ "${plot_args[@]}" if [ -d "$RUN_DIR/eval_comparison_train_excluded_affinity" ]; then run_logged_step plot_train_excluded_affinity_comparison \ mhcflurry eval plot-comparison \ --input "$RUN_DIR/eval_comparison_train_excluded_affinity" \ --a-label "$RUN_LABEL" \ --b-label "MHCflurry no-additional-MS (train-excluded)" \ --summary-pdf \ "$RUN_DIR/eval_comparison_train_excluded_affinity/plots/model_comparison_figures.pdf" fi fi else note "Skipping plots." fi if [ "$DEPLOY_MODE" != "none" ]; then deploy_args=( "$SCRIPT_DIR/deploy_trained_models.sh" --run-dir "$RUN_DIR" --release "$RELEASE" --github-release "$GITHUB_RELEASE" --processing-variants "$PROCESSING_VARIANTS" --repo "$REPO" --mode "$DEPLOY_MODE" ) if [ "$ALLOW_DIRTY_REPO" = "1" ]; then deploy_args+=(--allow-dirty-repo) fi if [ "$SKIP_TRAIN" = "1" ]; then deploy_args+=(--allow-artifact-source-mismatch) fi run_logged_step deploy_trained_models \ "${deploy_args[@]}" else note "Skipping deploy step. Pass --deploy-mode dry-run, draft, or publish to opt in." fi mhcflurry-2.3.6/scripts/release/validate_release_provenance.py000077500000000000000000000432161525677230600247550ustar00rootroot00000000000000#!/usr/bin/env python3 # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Validate and record source/model provenance for a release workflow.""" import argparse import datetime import hashlib import json import pathlib import re import subprocess VERSION_RE = re.compile(r'^__version__\s*=\s*[\'\"]([^\'\"]+)[\'\"]', re.MULTILINE) PACKAGE_RE = re.compile(r"^package\s+mhcflurry\s+(\S+)\s*$", re.MULTILINE) BASE_VERSION_RE = re.compile(r"^(\d+\.\d+\.\d+)") PROCESSING_VARIANTS = ("no_flank", "with_flanks", "short_flanks") HOLDOUT_MANIFESTS = ( "affinity_pmhcs.csv", "affinity_samples.csv", "processing_samples.csv", "presentation_samples.csv", ) def base_version(version): """Return the three-component release version, excluding rc suffixes.""" match = BASE_VERSION_RE.match(version) if not match: raise ValueError("Invalid MHCflurry version: %s" % version) return match.group(1) def source_package_version(repo): """Read the package version without importing mhcflurry.""" path = pathlib.Path(repo) / "mhcflurry" / "version.py" match = VERSION_RE.search(path.read_text()) if not match: raise ValueError("Could not find __version__ in %s" % path) return match.group(1) def model_package_version(path): """Read the training package version from a model info file.""" match = PACKAGE_RE.search(pathlib.Path(path).read_text()) if not match: raise ValueError("Could not find MHCflurry package version in %s" % path) return match.group(1) def model_metadata(path): """Read the two-column model info file into normalized string fields.""" result = {} for line in pathlib.Path(path).read_text().splitlines(): fields = line.split("\t", 1) if len(fields) == 2: result[fields[0].strip()] = fields[1].strip() return result def sha256(path): """Return the SHA256 digest of a file.""" digest = hashlib.sha256() with open(path, "rb") as fd: for block in iter(lambda: fd.read(1024 * 1024), b""): digest.update(block) return digest.hexdigest() def collect_holdout_provenance(run_dir, require_artifacts=False): """Validate and summarize the release holdout proof files.""" holdout_dir = pathlib.Path(run_dir) / "release_holdout" policy_path = holdout_dir / "policy.json" validation_path = holdout_dir / "validation.json" if not policy_path.is_file() or not validation_path.is_file(): if require_artifacts: raise ValueError( "Missing required release holdout policy or validation: %s" % holdout_dir) return {} policy = json.loads(policy_path.read_text()) validation = json.loads(validation_path.read_text()) if policy.get("schema_version") != 1: raise ValueError("Unsupported release holdout policy schema") if validation.get("schema_version") != 1: raise ValueError("Unsupported release holdout validation schema") if validation.get("policy_sha256") != sha256(policy_path): raise ValueError( "Release holdout validation does not match policy.json") manifest_records = policy.get("holdout_files", {}) if set(manifest_records) != set(HOLDOUT_MANIFESTS): raise ValueError( "Release holdout policy has unexpected manifests: %s" % sorted(manifest_records)) if validation.get("holdout_files") != manifest_records: raise ValueError( "Release holdout validation manifest records do not match policy") for filename in HOLDOUT_MANIFESTS: path = holdout_dir / filename expected = manifest_records[filename] if not path.is_file() or sha256(path) != expected.get("sha256"): raise ValueError( "Release holdout manifest checksum mismatch: %s" % path) overlaps = { key: validation.get(key) for key in ( "affinity_overlap_rows", "processing_overlap_rows", "presentation_overlap_rows", ) } if any(value != 0 for value in overlaps.values()): raise ValueError( "Release holdout validation contains overlap: %s" % overlaps) return { "policy_sha256": sha256(policy_path), "validation_sha256": sha256(validation_path), "evaluation_row_counts": policy.get("evaluation_row_counts", {}), "evaluation_hit_counts": policy.get("evaluation_hit_counts", {}), "presentation_holdout_pmids": policy.get( "presentation_holdout_pmids", []), "holdout_files": manifest_records, "overlap_rows": overlaps, } def git_output(repo, *args): return subprocess.check_output( ["git", "-C", str(repo)] + list(args), text=True).strip() def tracked_worktree_is_dirty(repo): """Return whether tracked files differ from HEAD (untracked files ignored).""" for args in (("diff", "--quiet"), ("diff", "--cached", "--quiet")): result = subprocess.run(["git", "-C", str(repo)] + list(args)) if result.returncode not in (0, 1): raise RuntimeError("git %s failed" % " ".join(args)) if result.returncode == 1: return True return False def artifact_info_paths(run_dir, processing_variants): """Return expected top-level model info paths keyed by artifact role.""" run_dir = pathlib.Path(run_dir) processing_variants = tuple(processing_variants) invalid = sorted(set(processing_variants) - set(PROCESSING_VARIANTS)) if invalid: raise ValueError( "Unknown processing variant(s): %s. Expected: %s" % ( ", ".join(invalid), ", ".join(PROCESSING_VARIANTS)) ) duplicates = sorted({ value for value in processing_variants if processing_variants.count(value) > 1 }) if duplicates: raise ValueError( "Duplicate processing variant(s): %s" % ", ".join(duplicates) ) result = { "affinity": run_dir / "affinity" / "models.combined" / "info.txt", "presentation": run_dir / "presentation" / "models" / "info.txt", } for variant in processing_variants: result["processing.%s" % variant] = ( run_dir / "processing" / ("models.selected.%s" % variant) / "info.txt" ) return result def collect_artifact_provenance( run_dir, release, processing_variants=(), require_artifacts=False, expected_artifact_git_commit="", expected_artifact_workflow_id=""): """Validate model metadata without requiring a Git checkout.""" run_dir = pathlib.Path(run_dir).resolve() release_base = base_version(release) artifact_provenance = {} missing = [] for role, path in artifact_info_paths( run_dir, processing_variants).items(): if path.is_file(): version = model_package_version(path) if base_version(version) != release_base: raise ValueError( "%s artifact was trained by MHCflurry %s, not release %s: " "%s" % (role, version, release, path)) metadata = model_metadata(path) artifact_commit = metadata.get("git commit", "") artifact_workflow_id = metadata.get("workflow id", "") if require_artifacts and expected_artifact_git_commit and ( artifact_commit != expected_artifact_git_commit): raise ValueError( "%s artifact git commit '%s' does not match source commit " "'%s': %s" % ( role, artifact_commit or "missing", expected_artifact_git_commit, path)) if require_artifacts and expected_artifact_workflow_id and ( artifact_workflow_id != expected_artifact_workflow_id): raise ValueError( "%s artifact workflow id '%s' does not match workflow " "'%s': %s" % ( role, artifact_workflow_id or "missing", expected_artifact_workflow_id, path)) artifact_provenance[role] = { "package_version": version, "git_commit": artifact_commit, "workflow_id": artifact_workflow_id, } elif require_artifacts: missing.append(str(path)) if missing: raise ValueError( "Missing required model provenance file(s): %s" % ", ".join(missing)) if require_artifacts: missing_commits = sorted( role for role, item in artifact_provenance.items() if not item["git_commit"]) if missing_commits: raise ValueError( "Model artifact provenance is missing git commit for: %s" % ", ".join(missing_commits)) commits = { item["git_commit"] for item in artifact_provenance.values() } if len(commits) > 1: raise ValueError( "Model artifacts do not agree on git commit: %s" % ", ".join(sorted(commits))) missing_workflows = sorted( role for role, item in artifact_provenance.items() if not item["workflow_id"]) if missing_workflows: raise ValueError( "Model artifact provenance is missing workflow id for: %s" % ", ".join(missing_workflows)) workflow_ids = { item["workflow_id"] for item in artifact_provenance.values() } if len(workflow_ids) > 1: raise ValueError( "Model artifacts do not agree on workflow id: %s" % ", ".join(sorted(workflow_ids))) return artifact_provenance def collect_provenance( repo, run_dir, release, workflow_id="", processing_variants=(), require_artifacts=False, allow_dirty_repo=False, expected_artifact_workflow_id="", allow_artifact_source_mismatch=False, training_package_version=""): """Validate release identity and return serializable provenance.""" repo = pathlib.Path(repo).resolve() run_dir = pathlib.Path(run_dir).resolve() source_version = source_package_version(repo) release_base = base_version(release) if base_version(source_version) != release_base: raise ValueError( "Release %s does not match source package version %s" % ( release, source_version)) dirty = tracked_worktree_is_dirty(repo) if dirty and not allow_dirty_repo: raise ValueError( "Tracked source files differ from HEAD; commit them before release " "or use --allow-dirty-repo for a deliberately non-release run") source_commit = git_output(repo, "rev-parse", "HEAD") artifact_provenance = collect_artifact_provenance( run_dir=run_dir, release=training_package_version or release, processing_variants=processing_variants, require_artifacts=require_artifacts, expected_artifact_git_commit=( source_commit if require_artifacts and not allow_artifact_source_mismatch else ""), expected_artifact_workflow_id=expected_artifact_workflow_id, ) if training_package_version: for role, item in artifact_provenance.items(): if item["package_version"] != training_package_version: raise ValueError("%s training version %s does not match explicit %s" % ( role, item["package_version"], training_package_version)) artifact_commits = { item["git_commit"] for item in artifact_provenance.values() if item["git_commit"] } artifact_workflow_ids = { item["workflow_id"] for item in artifact_provenance.values() if item["workflow_id"] } artifact_training = {} if artifact_commits: artifact_training = { "git_commit": next(iter(artifact_commits)), "workflow_id": next(iter(artifact_workflow_ids), ""), "matches_evaluation_source": artifact_commits == {source_commit}, } holdout_provenance = collect_holdout_provenance( run_dir, require_artifacts=require_artifacts) return { "schema_version": 2, "recorded_at": datetime.datetime.now(datetime.timezone.utc).isoformat(), "release": release, "release_base_version": release_base, "expected_training_package_version": training_package_version or None, "source": { "package_version": source_version, "git_commit": source_commit, "tracked_worktree_dirty": dirty, }, "workflow_id": workflow_id, "artifact_training": artifact_training, "artifacts": artifact_provenance, "release_holdout": holdout_provenance, } def make_parser(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--repo") parser.add_argument("--run-dir", required=True) parser.add_argument("--release", required=True) parser.add_argument("--workflow-id", default="") parser.add_argument( "--training-package-version", default="", help="Require this exact original training version when packaging previously trained weights.") parser.add_argument("--artifact-only", action="store_true") parser.add_argument("--expected-artifact-git-commit", default="") parser.add_argument("--expected-artifact-workflow-id", default="") parser.add_argument( "--processing-variants", default="with_flanks no_flank short_flanks", ) parser.add_argument("--require-artifacts", action="store_true") parser.add_argument("--allow-dirty-repo", action="store_true") parser.add_argument( "--allow-artifact-source-mismatch", action="store_true", help=( "Permit a postprocess/deploy checkout newer than the model-training " "commit while still requiring all model artifacts to agree on " "their recorded commit and workflow." ), ) parser.add_argument("--out") return parser def main(argv=None): args = make_parser().parse_args(argv) try: if args.artifact_only: if args.training_package_version: raise ValueError("Use --release for artifact-only version validation") if args.repo: raise ValueError( "--repo is not used with --artifact-only; omit it") if not args.require_artifacts: raise ValueError( "--artifact-only requires --require-artifacts") if not args.expected_artifact_git_commit: raise ValueError( "--artifact-only requires --expected-artifact-git-commit") if not args.expected_artifact_workflow_id: raise ValueError( "--artifact-only requires " "--expected-artifact-workflow-id") artifacts = collect_artifact_provenance( run_dir=args.run_dir, release=args.release, processing_variants=args.processing_variants.split(), require_artifacts=True, expected_artifact_git_commit=( args.expected_artifact_git_commit), expected_artifact_workflow_id=( args.expected_artifact_workflow_id), ) holdout = collect_holdout_provenance( args.run_dir, require_artifacts=True) provenance = { "schema_version": 2, "recorded_at": datetime.datetime.now( datetime.timezone.utc).isoformat(), "release": args.release, "release_base_version": base_version(args.release), "source": { "expected_git_commit": ( args.expected_artifact_git_commit), }, "workflow_id": args.workflow_id, "artifacts": artifacts, "release_holdout": holdout, } else: if not args.repo: raise ValueError("--repo is required unless --artifact-only") provenance = collect_provenance( repo=args.repo, run_dir=args.run_dir, release=args.release, workflow_id=args.workflow_id, processing_variants=args.processing_variants.split(), require_artifacts=args.require_artifacts, allow_dirty_repo=args.allow_dirty_repo, expected_artifact_workflow_id=( args.expected_artifact_workflow_id), allow_artifact_source_mismatch=( args.allow_artifact_source_mismatch), training_package_version=args.training_package_version, ) except (OSError, RuntimeError, ValueError) as error: raise SystemExit("ERROR: %s" % error) from error text = json.dumps(provenance, indent=2, sort_keys=True) + "\n" if args.out: out = pathlib.Path(args.out) out.parent.mkdir(parents=True, exist_ok=True) temporary = out.with_name(out.name + ".tmp") temporary.write_text(text) temporary.replace(out) else: print(text, end="") return 0 if __name__ == "__main__": raise SystemExit(main()) mhcflurry-2.3.6/scripts/release/validate_runplz_provenance.py000066400000000000000000000106711525677230600246630ustar00rootroot00000000000000#!/usr/bin/env python3 # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Validate the runplz installation selected by the release workflow.""" import argparse import importlib.metadata import json import pathlib import subprocess import sys import urllib.parse import urllib.request def editable_install_root(distribution): """Return the PEP 610 editable source root, if this is an editable install.""" direct_url_text = distribution.read_text("direct_url.json") if not direct_url_text: return None direct_url = json.loads(direct_url_text) if not direct_url.get("dir_info", {}).get("editable", False): return None parsed = urllib.parse.urlsplit(direct_url.get("url", "")) if parsed.scheme != "file": raise ValueError( "editable runplz install has a non-file source URL: %s" % ( direct_url.get("url"), ) ) return pathlib.Path( urllib.request.url2pathname(parsed.path) ).resolve() def validate_runplz_provenance(executable, required_version): """Validate version and checkout cleanliness for the active interpreter.""" try: distribution = importlib.metadata.distribution("runplz") except importlib.metadata.PackageNotFoundError as error: raise ValueError( "runplz package metadata was not found in selected interpreter %s" % ( sys.executable, ) ) from error actual_version = distribution.version if actual_version != required_version: raise ValueError( "runplz version mismatch: required %s, found %s" % ( required_version, actual_version, ) ) import runplz source_version = getattr(runplz, "__version__", None) if source_version is None: raise ValueError( "imported runplz source does not expose __version__: %s" % ( runplz.__file__, ) ) if source_version != actual_version: raise ValueError( "runplz source/distribution version mismatch: " "imported source reports %s, package metadata reports %s" % ( source_version, actual_version, ) ) executable = pathlib.Path(executable).resolve() module_path = pathlib.Path(runplz.__file__).resolve() identity = "executable=%s interpreter=%s version=%s module=%s" % ( executable, pathlib.Path(sys.executable).resolve(), actual_version, module_path, ) editable_root = editable_install_root(distribution) if editable_root is not None: try: commit = subprocess.check_output( ["git", "-C", str(editable_root), "rev-parse", "HEAD"], text=True, ).strip() dirty = subprocess.check_output( ["git", "-C", str(editable_root), "status", "--porcelain"], text=True, ).strip() except subprocess.CalledProcessError as error: raise ValueError( "editable runplz install is not a usable git checkout: %s" % ( editable_root, ) ) from error if dirty: raise ValueError( "editable runplz checkout is dirty: %s" % editable_root ) identity += " editable_root=%s git_commit=%s" % ( editable_root, commit, ) return identity def main(argv=None): parser = argparse.ArgumentParser() parser.add_argument("--executable", required=True) parser.add_argument("--required-version", required=True) args = parser.parse_args(argv) try: identity = validate_runplz_provenance( args.executable, args.required_version, ) except (ValueError, json.JSONDecodeError) as error: parser.error(str(error)) print("runplz provenance: %s" % identity) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/000077500000000000000000000000001525677230600170545ustar00rootroot00000000000000mhcflurry-2.3.6/scripts/training/README.md000066400000000000000000000214431525677230600203370ustar00rootroot00000000000000# Training scripts Maintained scripts for building the pan-allele release models. For a complete retrain, evaluation, synchronization, and optional deployment, start with: ```shell mhcflurry train pan-allele-release --help ``` The files in this directory are the lower-level stages and profiling tools used by that command. One-off experiments and machine-specific launchers belong in the ignored `jobs/` directory, not here. ## Release training stages - **`pan_allele_release_affinity.sh`** trains, selects, and calibrates the affinity ensemble. It supports incomplete-run continuation and writes heartbeat, snapshot, event, and evaluation records. - **`presentation_from_affinity.sh`** starts from an affinity `models.combined/`, trains the configured processing variants, then fits and calibrates presentation models. - **`pan_allele_release_full.sh`** runs both stages in order for a complete local training pass. - **`run_release_affinity_ablations.sh`** and **`run_release_processing_ablations.sh`** run the small, paired parity panels described in the neural hyperparameter audit before a full release retrain. - **`launch_pan_allele_training_remote.py`** transports the same stages through runplz. Use it directly only when debugging transport; normal remote releases should use `mhcflurry train pan-allele-release`. Affinity, processing, and presentation stages write persistent GPU telemetry. Worker packing defaults to workload-aware `auto`; pin a count only for a measured machine-specific benchmark. ## Reproduce the 2.3.0 weights Use the frozen `final-2.3.0-candidate-v2` recipe identifier. It selects the released settings; the identifier is retained for reproducibility and does not indicate the package release status. See the [recipe](../../docs/release_training_recipe.md) for data and component settings and the [launch guide](../../docs/final_230_candidate_experiment.md) for local and Modal execution, resumption and artifact collection. The original v1 preset is retained for reproducing earlier experiments and is not the 2.3.0 weight recipe. For transport debugging, `launch_pan_allele_training_remote.py` accepts `MHCFLURRY_REMOTE_WORKFLOW=full` (default), `affinity-ablations` or `processing-ablations`. Use a persistent remote output directory and preserve the recorded source commit and generated configuration. ## Training data and hyperparameters - **`mhcflurry class1-generate-training-hyperparameters`** generates the maintained affinity and processing grids. The affinity minibatch defaults to the published value 128; processing defaults to 512. Both can be changed with `--minibatch-size`. - **`release_exact/generate_hyperparameters*.py`** are compatibility shims for historical direct-script workflows. - **`release_exact/make_train_data.processing.py`** and **`make_train_data.presentation.py`** prepare annotated hits, decoys, and model-family input tables. - **`mhcflurry class1-reassign-mass-spec-training-data`** reruns the maintained mass-spec affinity remapping step. Its file under `release_exact/` is a compatibility shim. ## Evaluation Model comparison and plotting are package commands, not training scripts. Use `mhcflurry eval ...` after a standalone stage run, or let `mhcflurry train pan-allele-release` invoke them automatically. See the [evaluation guide](../../docs/evaluation.md) for comparison outputs, paper figures, saved-prediction tables, and external predictors. ## Sweeps and profiling - **`full_ensemble_minibatch_sweep.sh`** runs resumable minibatch and validation batch experiments. It writes per-cell completion sentinels, summaries, and GPU occupancy data. Defaults stay on the automatic worker and validation-batch paths; explicit values are for controlled comparisons. - **`plot_minibatch_sweep.py`** renders throughput and loss plots from `sweep_summary.csv`. - **`run_affinity_factorial.sh`** trains controlled affinity-recipe conditions, saves per-epoch histories and held-out predictions, and compares every condition directly to an explicitly supplied public `models.no_additional_ms` predictor. The direct comparisons exclude union training overlap, assert one common cohort identity, and render one review PDF per condition. **`evaluate_affinity_factorial_public.sh`** applies the same evaluation/figure gate to an already-trained factorial directory. - **`mhcflurry eval affinity-candidate-figures`** combines shortlisted conditions, public 2.2, and any available canonical NetMHCpan/MixMHCpred columns into one reusable held-out prediction table and paper-figure suite. - **`mhcflurry train compose-processing-ensemble`** builds a fixed processing ensemble while hashing every source predictor. - **`mhcflurry train processing-kernel-sweep`** trains widths 5/7/9/11/13/15 for legacy 5-aa and boundary 5x5 families (48 fits, four shared folds). Requires verified matched training negatives, restores best checkpoints, uses explicit X context padding and preserves per-fold/per-member predictions. See `docs/processing_kernel_sweep.md`; the bounded single-A100 launcher is `launch_processing_kernel_sweep_modal.py` (`runplz modal --detach`). - **`mhcflurry train processing-hyperparameter-sweep --design training-recipe`** runs the 64-fit optimizer/initialization/batch factorial with explicit processing LSUV, independent best/terminal checkpoints, paired frozen folds and per-member state predictions. Use `--evaluation none` for development screening. Width recovery imports complete conditions without resampling. See `docs/processing_hyperparameter_campaign.md` for recovery, budget controls and the distinction between screening and compact-ensemble selection. - **`mhcflurry train processing-hyperparameter-sweep --design ranking-confirmation`** runs the six-condition, 24-fit width/optimizer/checkpoint panel with sample-disjoint inner ranking monitoring and retained best/best-AP/terminal states. **`mhcflurry eval processing-confirmation-analysis`** applies the recorded paired gate to a collected snapshot and exports the candidate recipe; `generate_processing_recipe.confirmed_processing_candidate_hyperparameters()` defines the short-flank settings included in the frozen 2.3.0 v2 recipe. - **`mhcflurry train processing-data`** now supports `--resume` and `--resume-matching-dir`: verify cached inputs/scores and expand only unmatched peptide-length pools, with unchanged affinity calipers and bounded rounds. Per-round score hashes, seeds, timings and final matched rows are durable. `--preparation-pipeline-depth 3` (default) overlaps bounded CPU preparation and atomic writes around caller-owned inference; use depth 1 as the serial control. Protein-reference inputs stay numeric through device-side gathering and scoring. Strings are materialized when exporting artifacts. Independent sample seeds preserve draws across pipeline depths. - **`mhcflurry train benchmark-processing-preparation`** checks exact numeric sampling/export and matching parity, records timing repetitions and source/input hashes, and optionally checks real ensemble predictions with `--affinity-predictor`. See `docs/processing_preparation_acceleration.md`. - **`mhcflurry train benchmark-processing-sampler`** compares the numeric-position and historical reservoir samplers on a reproducible synthetic CPU workload. - **`mhcflurry eval processing-ensemble`** and **`mhcflurry eval presentation-affinity-ensemble`** score preserved prediction tables without rerunning inference. - **`mhcflurry eval processing-ensemble-subsets`** caches individual network scores on strict matched risk sets and evaluates every fixed-size subset. It verifies reconstruction of the full cached ensemble, preserves subset membership and predictions, and reports composition sensitivity without selecting a subset on held-out metrics. - **`mhcflurry eval release-experiment-figures`** regenerates the release training figures from archived experiment inputs. - **`mhcflurry train plot-loss-curves`** renders per-architecture loss curves from a trained ensemble. The historical `plot_loss_curves.py` path remains a compatibility shim. - **`benchmark_training_profile.py`** reports data-load, encoding, fit, and save timings for one architecture. When an experiment becomes published release evidence, move or wrap it under `downloads-generation//GENERATE.sh` so the artifact records its inputs, command, version, and Git commit. ## Shared performance helpers - **`set_cpu_threads.sh`** sets automatic BLAS/OpenMP thread budgets before Python imports native runtimes. Explicit caller settings remain authoritative, and serial execution applies an automatic runtime limit in-process. - **`gpu_telemetry.sh`** records `nvidia-smi` samples for training stages. Set `MHCFLURRY_GPU_TELEMETRY=0` to disable it or `MHCFLURRY_GPU_TELEMETRY_SECONDS=N` to change the interval. mhcflurry-2.3.6/scripts/training/analyze_processing_confirmation.py000066400000000000000000000342601525677230600261020ustar00rootroot00000000000000"""Compare retained processing checkpoints and export a gated candidate recipe. This is development selection, not release acceptance or final ensemble scoring. The independent stopping partition selects epochs; this report compares recipes on shared outer development folds. Use a fresh output directory per snapshot. """ import argparse import json from pathlib import Path import shutil import numpy import pandas import yaml from mhcflurry.experiment_archive import sha256_file METRICS = ["roc_auc", "pr_auc", "ppv_at_n"] POLICIES = ["best", "best_ap", "terminal"] BASELINE = "legacy_5aa__adam_keras__k11" KEYS = ["checkpoint_policy", "fold_num", "sample_id"] def collect_metrics(experiment): """Validate complete state/fold cohorts for every reported condition.""" design = json.loads((experiment / "experiment.json").read_text()) records = design["records"] if (design.get("design") != "processing-ranking-confirmation-v1" or len(records) != 6 or len({row["condition"] for row in records}) != 6 or any(row["fold_count"] != 4 or row["checkpoint_policy"] != "best_ap" or len(row["hyperparameters"]) != 1 for row in records)): raise ValueError("Require the six-condition four-fold ranking-confirmation design") samples, micro, inputs, pending = [], [], [experiment / "experiment.json"], [] reference = None for record in records: name = record["condition"] path = experiment / name / "checkpoint_per_sample.csv" micro_path = experiment / name / "checkpoint_micro_by_fold.csv" if not path.exists() or not micro_path.exists(): pending.append(name) continue frame = pandas.read_csv(path, dtype={"sample_id": str}) pooled = pandas.read_csv(micro_path) for table, keys in ((frame, KEYS), (pooled, KEYS[:2])): if (table.empty or set(table.condition) != {name} or table.duplicated(keys).any() or table[keys].isna().any().any() or not numpy.isfinite(table[METRICS + ["n", "n_pos"]]).all().all() or not table[METRICS].ge(0).all().all() or not table[METRICS].le(1).all().all() or not table.n_pos.gt(0).all() or not table.n.eq(2 * table.n_pos).all() or set(table.checkpoint_policy) != set(POLICIES) or any(set(group.fold_num) != {0, 1, 2, 3} for _, group in table.groupby("checkpoint_policy"))): raise ValueError("Require complete finite balanced checkpoint metrics: " + name) state_reference = None for policy in POLICIES: identity = frame.loc[frame.checkpoint_policy == policy].set_index(KEYS[1:])[ ["n", "n_pos"]].sort_index() if state_reference is None: state_reference = identity else: pandas.testing.assert_frame_equal(identity, state_reference, check_exact=True) if reference is None: reference = state_reference else: pandas.testing.assert_frame_equal(reference, state_reference, check_exact=True) counts = frame.groupby(KEYS[:2])[["n", "n_pos"]].sum().sort_index() pandas.testing.assert_frame_equal(counts, pooled.set_index(KEYS[:2])[["n", "n_pos"]].sort_index(), check_exact=True) samples.append(frame) micro.append(pooled) inputs.extend([path, micro_path]) if not samples: raise ValueError("No completed checkpoint metrics yet") return design, pandas.concat(samples, ignore_index=True), pandas.concat(micro, ignore_index=True), pending, inputs def compare_and_choose(design, samples, micro, pending, replicates=10000, seed=42): """Apply the declared macro/micro gate; incomplete screens cannot promote.""" if not samples.condition.eq(BASELINE).any(): raise ValueError("Baseline condition is not complete: " + BASELINE) means = samples.groupby(["condition", "checkpoint_policy", "sample_id"])[METRICS].mean() summary = means.groupby(["condition", "checkpoint_policy"]).mean().reset_index() baseline = means.loc[(BASELINE, "best")].sort_index() base_micro = micro.loc[(micro.condition == BASELINE) & (micro.checkpoint_policy == "best")].set_index("fold_num")[METRICS] indices = numpy.random.default_rng(seed).integers(len(baseline), size=(replicates, len(baseline))) comparisons, differences, draws = [], [], {} for (condition, policy), group in means.groupby(level=[0, 1]): group = group.droplevel([0, 1]).sort_index() pandas.testing.assert_index_equal(group.index, baseline.index) delta = group - baseline pooled = micro.loc[(micro.condition == condition) & (micro.checkpoint_policy == policy)].set_index("fold_num")[METRICS] pooled_delta = pooled - base_micro row = {"condition": condition, "checkpoint_policy": policy, "samples": len(baseline)} for metric in METRICS: values = delta[metric].to_numpy() bootstrap = values[indices].mean(axis=1) low, high = numpy.quantile(bootstrap, [0.025, 0.975]) row.update({metric + "_delta": float(values.mean()), metric + "_low": float(low), metric + "_high": float(high), metric + "_worst_fold_micro_delta": float(pooled_delta[metric].min())}) draws[condition + "__" + policy + "__" + metric] = bootstrap row["development_gate"] = bool( row["pr_auc_delta"] > 0 and row["ppv_at_n_delta"] > 0 and row["pr_auc_low"] > 0 and row["ppv_at_n_low"] > -0.002 and all(row[m + "_worst_fold_micro_delta"] >= -0.002 for m in METRICS)) comparisons.append(row) differences.append(delta.reset_index().assign(condition=condition, checkpoint_policy=policy)) comparisons = pandas.DataFrame(comparisons) candidates = summary.merge(comparisons, on=["condition", "checkpoint_policy"]) eligible = candidates.loc[(candidates.checkpoint_policy == "best_ap") & candidates.development_gate] winner = None if not pending and not eligible.empty: winner = eligible.sort_values(["pr_auc", "ppv_at_n", "condition"], ascending=[False, False, True]).iloc[0].condition decision = {"status": "incomplete" if pending else "candidate" if winner else "retain_control", "candidate_condition": winner, "pending": pending, "baseline": BASELINE + " / best loss", "checkpoint_selection": "inner sample-macro AP; earliest exact tie; loss-based patience", "gate": "Both macro deltas positive; AP 95% paired lower bound >0; PPV lower bound >-0.002; all four-fold pooled AUROC/AP/PPV deltas >=-0.002.", "limitations": "Exploratory repeated development screening; intervals conditional on fits, without multiple-screening or study-cluster correction. Not a fixed ensemble or presentation test.", "release_accepted": False} return summary, comparisons, pandas.concat(differences, ignore_index=True), draws, decision def render(summary, comparisons, out, experiment=None): """Render policy-separated score maps and paired development intervals.""" import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages names = sorted(summary.condition.unique()) labels = [name.replace("legacy_5aa__", "").replace("_keras", "").replace("_pytorch", "").replace("__", " / ") for name in names] with PdfPages(out / "confirmation.pdf") as pdf: fig, axes = plt.subplots(1, 3, figsize=(12, 4.8), constrained_layout=True) for axis, metric, title in zip(axes, METRICS, ["AUROC", "AUPRC", "PPV@N"]): for policy, label, marker in zip(POLICIES, ["Best loss", "Inner-best AP", "Terminal"], ["o", "s", "^"]): values = summary.loc[summary.checkpoint_policy == policy].set_index("condition").reindex(names) axis.plot(numpy.arange(len(names)), values[metric], marker=marker, label=label, markerfacecolor="none" if policy == "best_ap" else None) axis.set(xticks=range(len(names)), xticklabels=labels, ylabel="Macro " + title) axis.tick_params(axis="x", rotation=45) axis.grid(alpha=0.2) axes[0].legend() fig.suptitle("Processing / 1:1 affinity-length-matched development\n%d samples; %d/6 conditions; four paired fits, not ensembles" % (int(comparisons.samples.iloc[0]), len(names))) pdf.savefig(fig) fig.savefig(out / "scores.png", dpi=160) plt.close(fig) fig, axes = plt.subplots(1, 2, figsize=(11, 5), constrained_layout=True) primary = comparisons.loc[comparisons.checkpoint_policy == "best_ap"].set_index("condition").reindex(names) for axis, metric, title in zip(axes, METRICS[1:], ["AUPRC", "PPV@N"]): delta = primary[metric + "_delta"].to_numpy() errors = numpy.array([delta - primary[metric + "_low"], primary[metric + "_high"] - delta]) axis.errorbar(delta, numpy.arange(len(names)), xerr=errors, fmt="o", capsize=3) axis.axvline(0, color="gray", linestyle="--") axis.set(yticks=range(len(names)), yticklabels=labels, xlabel="Macro " + title + " difference") fig.suptitle("Inner-best AP versus Adam width 11 best-loss control\nExploratory 95% paired sample intervals; no screening/study correction") pdf.savefig(fig) fig.savefig(out / "paired-intervals.png", dpi=160) plt.close(fig) if experiment is not None: for name in names: path = experiment / name / "processing/models.unselected.short_flanks/manifest.csv" if not path.exists(): continue # Metric-only snapshots remain independently usable. configs = pandas.read_csv(path).config_json.map(json.loads) fits = sorted((config["fit_info"][-1] for config in configs), key=lambda fit: fit["training_info"]["fold_num"]) if [fit["training_info"]["fold_num"] for fit in fits] != [0, 1, 2, 3]: raise ValueError("Epoch diagnostics require one fit in each held-out fold") fig, axes = plt.subplots(2, 4, figsize=(13, 6.2), sharey="row", constrained_layout=True) for col, fit in enumerate(fits): epochs = numpy.arange(1, len(fit["loss"]) + 1) if any(len(fit[key]) != len(epochs) for key in ("val_loss", "val_macro_ap", "val_macro_ppv_at_n")): raise ValueError("Incomplete epoch ranking/loss history") axes[0, col].plot(epochs, fit["loss"], label="Training loss", color="0.65") axes[0, col].plot(epochs, fit["val_loss"], label="Inner validation loss", color="0.15") axes[1, col].plot(epochs, fit["val_macro_ap"], label="Inner macro AP") axes[1, col].plot(epochs, fit["val_macro_ppv_at_n"], label="Inner macro PPV", color="tab:green") for row in range(2): axes[row, col].axvline(fit["best_epoch"], color="tab:blue", linestyle=":", label="Best loss epoch") axes[row, col].axvline(fit["best_ranking_epoch"], color="tab:orange", linestyle="--", label="Best AP epoch") axes[row, col].grid(alpha=0.15) axes[0, col].set_title("Fold %d / %d inner samples" % (col, len(fit["ranking_validation_samples"]))) axes[1, col].set_xlabel("Epoch (trace ends at terminal)") axes[0, 0].set_ylabel("Binary cross-entropy") axes[1, 0].set_ylabel("Inner sample-macro ranking") axes[0, 0].legend(fontsize=7) axes[1, 0].legend(fontsize=7) fig.suptitle(name.replace("__", " / ") + "\nStopping-validation trajectories; outer scores never select epochs") pdf.savefig(fig) fig.savefig(out / (name + ".epochs.png"), dpi=160) plt.close(fig) def main(argv=None): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--experiment", type=Path, required=True) parser.add_argument("--out", type=Path, required=True) parser.add_argument("--replicates", type=int, default=10000) parser.add_argument("--seed", type=int, default=42) args = parser.parse_args(argv) if args.out.exists() or args.replicates < 100: raise ValueError("Require a new output directory and at least 100 bootstrap draws") design, samples, micro, pending, inputs = collect_metrics(args.experiment) summary, comparisons, differences, draws, decision = compare_and_choose( design, samples, micro, pending, args.replicates, args.seed) args.out.mkdir(parents=True) for name, frame in (("condition_means", summary), ("paired_comparisons", comparisons), ("sample_differences", differences), ("per_fold_sample_metrics", samples), ("micro_by_fold", micro)): frame.to_csv(args.out / (name + ".csv"), index=False) numpy.savez_compressed(args.out / "bootstrap_deltas.npz", **draws) (args.out / "decision.json").write_text(json.dumps(decision, indent=2) + "\n") if decision["candidate_condition"]: record = next(row for row in design["records"] if row["condition"] == decision["candidate_condition"]) (args.out / "candidate_hyperparameters.yaml").write_text(yaml.safe_dump(record["hyperparameters"], sort_keys=True)) render(summary, comparisons, args.out, args.experiment) inputs.extend(path for name in summary.condition.unique() if (path := args.experiment / name / "processing/models.unselected.short_flanks/manifest.csv").exists()) shutil.copyfile(__file__, args.out / "analysis_source.py") provenance = {"arguments": {key: str(value) if isinstance(value, Path) else value for key, value in vars(args).items()}, "inputs": [{"path": str(path.resolve()), "sha256": sha256_file(path)} for path in inputs], "outputs": [{"path": path.name, "sha256": sha256_file(path)} for path in sorted(args.out.iterdir())]} (args.out / "provenance.json").write_text(json.dumps(provenance, indent=2) + "\n") print(summary.to_string(index=False)) print(json.dumps(decision, indent=2)) return 0 if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/analyze_processing_recipe.py000066400000000000000000000374241525677230600246660ustar00rootroot00000000000000"""Map a processing recipe factorial from saved paired development metrics. No training, inference, model selection, or release-benchmark evaluation occurs. """ import argparse import hashlib from itertools import combinations import json import os from pathlib import Path import shutil import numpy import pandas from paired_sample_metrics import paired_summary METRICS = ["roc_auc", "pr_auc", "ppv_at_n"] FACTORS = ["family", "optimizer_recipe", "initialization", "batch_size"] INITIALIZATIONS = ["none", "orthogonal", "lsuv_pre", "lsuv_post"] LIMITATIONS = ( "Exploratory paired sample bootstrap, conditional on trained fits; no " "correction for repeated screening, multiple comparisons or study clustering. " "Per-member development metrics, not ensemble or presentation performance. " "Point-estimate Pareto membership is not a significance or release gate." ) def validate_inputs(experiment, metrics): """Validate a single frozen factorial and exact fold/sample pairing. Entire unreported conditions are allowed; partially reported conditions, changing cohorts, duplicate units and nonfinite metrics are rejected. """ if experiment.get("design") != "processing-training-recipe-v1": raise ValueError("Require a processing-training-recipe-v1 design") if not experiment.get("train_data_sha256"): raise ValueError("Missing frozen training table identity") records = pandas.DataFrame(experiment["records"]) required = ["condition", "family", "optimizer", "optimizer_implementation", "initialization", "batch_size", "fold_count", "network_count", "kernel_width", "checkpoint_policy", "hyperparameters"] if set(required) - set(records): raise ValueError("Missing design fields") if records[required].isna().any().any() or records.condition.duplicated().any(): raise ValueError("Nonmissing unique design identities required") records["optimizer_recipe"] = records.optimizer + "/" + records.optimizer_implementation if records.duplicated(FACTORS).any(): raise ValueError("Duplicate factorial coordinates") if (not records.initialization.isin(INITIALIZATIONS).all() or not records.checkpoint_policy.eq("best").all() or records.fold_count.nunique() != 1 or not records.fold_count.eq(records.network_count).all() or records.kernel_width.nunique() != 1): raise ValueError("Require common width, best-loss policy and one member per paired fold") changing = {"optimizer", "optimizer_implementation", "initialization_method", "minibatch_size"} fixed_by_family = {} for record in records.to_dict("records"): if len(record["hyperparameters"]) != 1: raise ValueError("Require one architecture per condition") hp = record["hyperparameters"][0] expected = {"optimizer": record["optimizer"], "optimizer_implementation": record["optimizer_implementation"], "initialization_method": record["initialization"], "minibatch_size": record["batch_size"], "convolutional_kernel_size": record["kernel_width"], "restore_best_weights": True} if any(hp.get(key) != value for key, value in expected.items()): raise ValueError("Design axes disagree with hyperparameters") fixed = {key: value for key, value in hp.items() if key not in changing} previous = fixed_by_family.setdefault(record["family"], fixed) if previous != fixed: raise ValueError("Uncontrolled hyperparameter change within a family") keys = ["condition", "fold_num", "sample_id"] fields = keys + ["n", "n_pos"] + METRICS if set(fields) - set(metrics) or metrics.empty: raise ValueError("Missing or empty per-fold/sample metric table") if metrics[fields].isna().any().any() or metrics.duplicated(keys).any(): raise ValueError("Nonmissing unique fold/sample identities required") if set(metrics.condition) - set(records.condition): raise ValueError("Metrics contain conditions outside the frozen design") if "checkpoint_policy" in metrics and not metrics.checkpoint_policy.eq("best").all(): raise ValueError("Metric checkpoint policy differs from the design") numeric = metrics[["fold_num", "n", "n_pos"] + METRICS].to_numpy(dtype=float) if not numpy.isfinite(numeric).all() or not metrics[METRICS].ge(0).all().all() or not metrics[METRICS].le(1).all().all(): raise ValueError("Require finite metrics between zero and one") counts = metrics[["n", "n_pos", "fold_num"]].to_numpy(dtype=float) if not numpy.equal(counts, numpy.floor(counts)).all(): raise ValueError("Counts and fold identifiers must be integers") if not metrics.n_pos.gt(0).all() or not metrics.n.eq(2 * metrics.n_pos).all(): raise ValueError("This analysis requires one matched negative per positive") expected_folds = set(range(int(records.fold_count.iloc[0]))) anchor = None for _, group in metrics.groupby("condition", sort=True): if set(group.fold_num) != expected_folds: raise ValueError("Incomplete condition: missing requested folds") cohort = group.set_index(["fold_num", "sample_id"])[["n", "n_pos"]].sort_index() if anchor is None: anchor = cohort elif not cohort.equals(anchor): raise ValueError("Unmatched fold/sample cohorts or counts") records["status"] = numpy.where(records.condition.isin(metrics.condition), "evaluated", "pending") return records def analyze(experiment, metrics, *, replicates=10000, seed=42): """Return design, sample means, condition means and one-factor contrasts.""" records = validate_inputs(experiment, metrics) # Repeated appearances of a sample are not independent bootstrap units. samples = metrics.groupby(["condition", "sample_id"], as_index=False)[METRICS + ["n", "n_pos"]].mean() means = samples.groupby("condition")[METRICS].mean().add_prefix("macro_").reset_index() means["samples"] = means.condition.map(samples.groupby("condition").size()) means = means.merge(records.drop(columns="hyperparameters"), on="condition", validate="one_to_one") points = means[["macro_pr_auc", "macro_ppv_at_n"]].to_numpy() means["pareto_point_estimate"] = [not ((points >= point).all(axis=1) & (points > point).any(axis=1)).any() for point in points] complete = records.loc[records.status == "evaluated"].sort_values("condition") contrasts, differences = [], [] for left, right in combinations(complete.to_dict("records"), 2): changed = [key for key in FACTORS if left[key] != right[key]] if len(changed) != 1: continue factor = changed[0] if factor == "initialization": reverse = INITIALIZATIONS.index(left[factor]) > INITIALIZATIONS.index(right[factor]) else: reverse = left[factor] > right[factor] if reverse: left, right = right, left pair = samples.loc[samples.condition.isin([left["condition"], right["condition"]])] summary, delta, _ = paired_summary( pair, units=["sample_id"], condition="condition", metrics=METRICS, baseline=left["condition"], replicates=replicates, seed=seed) wide = delta.pivot(index="sample_id", columns="metric", values="delta") summary["joint_samples_improved"] = int((wide.pr_auc.gt(0) & wide.ppv_at_n.gt(0)).sum()) metadata = {"factor": factor, "from_value": str(left[factor]), "to_value": str(right[factor]), "fixed_settings": json.dumps({key: left[key] for key in FACTORS if key != factor}, sort_keys=True)} for key, value in metadata.items(): summary[key] = value delta[key] = value delta["baseline"] = left["condition"] contrasts.append(summary) differences.append(delta) return (records, samples, means, pandas.concat(contrasts, ignore_index=True) if contrasts else pandas.DataFrame(), pandas.concat(differences, ignore_index=True) if differences else pandas.DataFrame()) def render_report(records, means, contrasts, out): """Render missing-aware maps and paginated paired-effect plots.""" import matplotlib matplotlib.use("Agg") from matplotlib import pyplot from matplotlib.backends.backend_pdf import PdfPages title = "Processing / 1:1 affinity-length-matched development" subtitle = "Per-member scores; best-loss checkpoint; folds averaged within sample (not an ensemble)" colors = pyplot.get_cmap("viridis").with_extremes(bad="#eeeeee") with PdfPages(out / "recipe-analysis.pdf") as pdf: page = 0 def save(fig): nonlocal page page += 1 pdf.savefig(fig) fig.savefig(out / ("recipe-analysis-%02d.png" % page), dpi=160) pyplot.close(fig) for family in sorted(records.family.unique()): design = records.loc[records.family == family].copy() design["column"] = design.optimizer_recipe + " / " + design.batch_size.astype(str) columns = (design.sort_values(["optimizer_recipe", "batch_size"]) .column.drop_duplicates().tolist()) group = design[["condition", "initialization", "column"]].merge(means, on=["condition", "initialization"], how="left") fig, axes = pyplot.subplots(1, 2, figsize=(12, 6)) for axis, metric, label in zip(axes, ["pr_auc", "ppv_at_n"], ["AUPRC", "PPV@N"]): values = group.pivot(index="initialization", columns="column", values="macro_" + metric).reindex(index=INITIALIZATIONS, columns=columns) limits = means["macro_" + metric] lower, upper = limits.min(), limits.max() upper = max(upper, lower + 1e-6) plotted = axis.imshow(numpy.ma.masked_invalid(values.to_numpy()), cmap=colors, aspect="auto", vmin=lower, vmax=upper) axis.set(xticks=range(len(columns)), xticklabels=columns, yticks=range(len(INITIALIZATIONS)), yticklabels=INITIALIZATIONS, title="Macro " + label) axis.tick_params(axis="x", rotation=25, labelsize=8) for i in range(len(values)): for j in range(len(columns)): value = values.iloc[i, j] color = "black" if not numpy.isfinite(value) or value > (lower + upper) / 2 else "white" axis.text(j, i, "%.4f" % value if numpy.isfinite(value) else "pending", ha="center", va="center", color=color, fontsize=9) fig.colorbar(plotted, ax=axis, fraction=0.04) fig.suptitle(title + "\n" + family + " | " + subtitle + "\n%d folds, %d held-out samples; none = Glorot" % ( int(records.fold_count.iloc[0]), int(means.samples.iloc[0])), fontsize=10) fig.text(0.5, 0.02, "Equal sample weighting. Gray cells are unreported, not zero. Common color scale across families.", ha="center", fontsize=9) fig.tight_layout(rect=(0, 0.09, 1, 0.9)) save(fig) if contrasts.empty: return for factor, group in contrasts.groupby("factor", sort=True): identities = group[["condition", "baseline"]].drop_duplicates().to_records(index=False).tolist() for start in range(0, len(identities), 12): chunk = identities[start:start + 12] fig, axes = pyplot.subplots(1, 2, figsize=(14, max(4, 0.52 * len(chunk) + 2.5))) for axis, metric, label in zip(axes, ["pr_auc", "ppv_at_n"], ["AUPRC", "PPV@N"]): rows = group.loc[group.metric == metric].set_index(["condition", "baseline"]).loc[chunk] y = numpy.arange(len(rows)) axis.hlines(y, rows.ci_low, rows.ci_high, color="#286b8d", linewidth=2) axis.scatter(rows.delta, y, color="#143b52", zorder=3) labels = [] for row in rows.itertuples(): fixed = json.loads(row.fixed_settings) context = ", ".join(str(fixed[key]) for key in FACTORS if key in fixed) labels.append(row.to_value + " - " + row.from_value + "\n" + context) axis.set(yticks=y, yticklabels=labels if axis is axes[0] else [], title="Macro " + label, xlabel="Difference (95% paired sample interval)") axis.tick_params(axis="y", labelsize=8) axis.axvline(0, color="gray", linestyle="--", linewidth=1) axis.invert_yaxis() fig.suptitle(title + "\nOne-factor contrasts: " + factor, fontsize=12) fig.text(0.5, 0.02, "Exploratory intervals; no multiple-screening or study-cluster correction. Other recipe settings held fixed.", ha="center", fontsize=9) fig.tight_layout(rect=(0, 0.07, 1, 0.9)) save(fig) def main(argv=None): parser = argparse.ArgumentParser(prog=os.environ.get("MHCFLURRY_CLI_PROG"), description=__doc__) parser.add_argument("--experiment", type=Path, required=True) parser.add_argument("--metrics", type=Path, required=True) parser.add_argument("--out", type=Path, required=True) parser.add_argument("--replicates", type=int, default=10000) parser.add_argument("--seed", type=int, default=42) args = parser.parse_args(argv) if args.replicates < 1: parser.error("--replicates must be positive") if args.out.exists() and any(args.out.iterdir()): raise ValueError("Use a new output directory for each immutable analysis snapshot") experiment = json.loads(args.experiment.read_text()) metrics = pandas.read_csv(args.metrics, dtype={"sample_id": str}, float_precision="round_trip") records, samples, means, contrasts, differences = analyze(experiment, metrics, replicates=args.replicates, seed=args.seed) args.out.mkdir(parents=True, exist_ok=True) for name, frame in (("design_status", records.drop(columns="hyperparameters")), ("sample_means", samples), ("condition_means", means), ("paired_contrasts", contrasts), ("sample_differences", differences)): frame.to_csv(args.out / (name + ".csv"), index=False) render_report(records, means, contrasts, args.out) provenance = { "arguments": {key: str(value) if isinstance(value, Path) else value for key, value in vars(args).items()}, "inputs": [{"path": str(path.resolve()), "sha256": hashlib.sha256(path.read_bytes()).hexdigest()} for path in (args.experiment, args.metrics, Path(__file__), Path(__file__).with_name("paired_sample_metrics.py"))], "train_data_sha256": experiment["train_data_sha256"], "evaluated_conditions": len(means), "planned_conditions": len(records), "method": "Average folds within sample, then paired sample percentile bootstrap; one-factor contrasts only.", "limitations": LIMITATIONS, } source_dir = args.out / "analysis_source" source_dir.mkdir() for path in (Path(__file__), Path(__file__).with_name("paired_sample_metrics.py")): shutil.copyfile(path, source_dir / path.name) provenance["outputs"] = [ {"path": str(path.relative_to(args.out)), "sha256": hashlib.sha256(path.read_bytes()).hexdigest()} for path in sorted(args.out.rglob("*")) if path.is_file()] (args.out / "provenance.json").write_text(json.dumps(provenance, indent=2) + "\n") print(means[["condition", "macro_pr_auc", "macro_ppv_at_n", "samples", "pareto_point_estimate"]].to_string(index=False)) print("Evaluated %d/%d conditions. %s" % (len(means), len(records), LIMITATIONS)) return 0 if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/assemble_affinity_checkpoint.py000066400000000000000000000057271525677230600253340ustar00rootroot00000000000000#!/usr/bin/env python3 """Make an affinity checkpoint self-contained with its pseudosequences.""" import argparse import hashlib import json import shutil from pathlib import Path from mhcflurry import Class1AffinityPredictor def sha256_file(path): """Return the SHA256 digest of a file.""" digest = hashlib.sha256() with open(path, "rb") as fd: for block in iter(lambda: fd.read(8 * 1024 * 1024), b""): digest.update(block) return digest.hexdigest() def fingerprint_directory(path): """Hash all files in a directory by relative path and content.""" path = Path(path).resolve() digest = hashlib.sha256() files = [] for item in sorted(path.rglob("*")): if not item.is_file(): continue relative = item.relative_to(path).as_posix() item_hash = sha256_file(item) digest.update(relative.encode("utf-8")) digest.update(b"\0") digest.update(item_hash.encode("ascii")) digest.update(b"\0") files.append({"path": relative, "sha256": item_hash}) return {"sha256": digest.hexdigest(), "files": files} def parse_args(argv=None): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--models", required=True) parser.add_argument("--allele-sequences", required=True) parser.add_argument("--out", required=True) return parser.parse_args(argv) def run(args): source = Path(args.models).resolve() allele_sequences = Path(args.allele_sequences).resolve() out = Path(args.out).resolve() if not (source / "manifest.csv").is_file(): raise ValueError("Missing affinity manifest: %s" % source) if allele_sequences.name not in ( "allele_sequences.csv", "allele_sequences.csv.bz2", ): raise ValueError("Unexpected pseudosequence filename: %s" % allele_sequences) if out.exists(): raise ValueError("Output already exists: %s" % out) shutil.copytree(source, out) copied_sequences = out / allele_sequences.name shutil.copy2(allele_sequences, copied_sequences) predictor = Class1AffinityPredictor.load(str(out), optimization_level=0) provenance = { "format": 1, "source_models": { "path": str(source), "fingerprint": fingerprint_directory(source), }, "allele_sequences": { "path": str(allele_sequences), "sha256": sha256_file(allele_sequences), }, "assembled_predictor": { "path": str(out), "models": int(len(predictor.neural_networks)), "supported_alleles": int(len(predictor.supported_alleles)), }, } with open(out / "assembly_provenance.json", "w") as fd: json.dump(provenance, fd, indent=2, sort_keys=True) fd.write("\n") print(json.dumps(provenance["assembled_predictor"], sort_keys=True)) def main(argv=None): run(parse_args(argv)) return 0 if __name__ == "__main__": raise SystemExit(main()) mhcflurry-2.3.6/scripts/training/audit_training_data_identity.py000066400000000000000000000052461525677230600253400ustar00rootroot00000000000000#!/usr/bin/env python3 """Audit training row identity, multiplicities, order, and novel examples.""" import argparse import hashlib import json from pathlib import Path import pandas def compare_rows(reference, candidate, columns): """Compare exact parsed rows on explicit columns, including duplicates.""" reference = reference[columns].fillna("").astype(str) candidate = candidate[columns].fillna("").astype(str) left = reference.value_counts(sort=False, dropna=False).rename("reference_count") right = candidate.value_counts(sort=False, dropna=False).rename("candidate_count") counts = pandas.concat([left, right], axis=1).fillna(0).astype("int64") shared = counts.min(axis=1) summary = { "reference_rows": len(reference), "candidate_rows": len(candidate), "shared_rows_with_multiplicity": int(shared.sum()), "reference_only_rows_with_multiplicity": int((counts.reference_count - shared).sum()), "candidate_only_rows_with_multiplicity": int((counts.candidate_count - shared).sum()), "same_row_multiset": bool((counts.reference_count == counts.candidate_count).all()), "same_ordered_rows": reference.reset_index(drop=True).equals(candidate.reset_index(drop=True)), "identity_columns": columns, } return summary, counts.loc[counts.reference_count != counts.candidate_count].reset_index() def main(argv=None): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--reference", required=True) parser.add_argument("--candidate", required=True) parser.add_argument("--columns", nargs="+", required=True) parser.add_argument("--out", required=True) args = parser.parse_args(argv) # Preserve literal labels and numbers rather than inventing equivalences. # Supply normalized tables explicitly if semantic normalization is desired. reference = pandas.read_csv(args.reference, dtype=str, keep_default_na=False) candidate = pandas.read_csv(args.candidate, dtype=str, keep_default_na=False) summary, differences = compare_rows(reference, candidate, args.columns) summary["files"] = { name: {"path": path, "sha256": hashlib.sha256(Path(path).read_bytes()).hexdigest()} for name, path in (("reference", args.reference), ("candidate", args.candidate)) } summary["comparison"] = "exact parsed values on explicit columns; counts preserve duplicates" out = Path(args.out) out.mkdir(parents=True, exist_ok=True) differences.to_csv(out / "row_differences.csv.bz2", index=False) (out / "summary.json").write_text(json.dumps(summary, indent=2) + "\n") print(json.dumps(summary, indent=2)) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/benchmark_processing_preparation.py000066400000000000000000000200571525677230600262240ustar00rootroot00000000000000"""Reproducible sampler, matching and optional real-predictor parity timings.""" import argparse import importlib.util import json from pathlib import Path import platform import statistics import time import numpy import pandas import torch from mhcflurry.amino_acid import COMMON_AMINO_ACIDS from mhcflurry.common import positive_int_arg from mhcflurry.experiment_archive import sha256_file from mhcflurry.numeric_proteome import ProcessingProteome from mhcflurry.processing_matching import matched_training_data from mhcflurry.proteome_decoys import sample_peptide_frame_for_accessions def timed(call, repeats): times = [] cpu_times = [] result = None for _ in range(repeats): start = time.perf_counter() cpu_start = time.process_time() result = call() times.append(time.perf_counter() - start) cpu_times.append(time.process_time() - cpu_start) return result, {"seconds": times, "median_seconds": statistics.median(times), "cpu_seconds": cpu_times, "median_cpu_seconds": statistics.median(cpu_times)} def timed_pair(first, second, repeats): """Alternate comparison order to avoid separate-block load/warmup bias.""" results = [None, None] timings = [{"seconds": [], "cpu_seconds": []} for _ in range(2)] orders = [] for repeat in range(repeats): order = [0, 1] if repeat % 2 == 0 else [1, 0] orders.append(order) for index in order: results[index], measured = timed((first, second)[index], 1) for key in ("seconds", "cpu_seconds"): timings[index][key].extend(measured[key]) for measured in timings: measured["median_seconds"] = statistics.median(measured["seconds"]) measured["median_cpu_seconds"] = statistics.median(measured["cpu_seconds"]) return results, timings, orders def run(args=None): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--out", required=True) parser.add_argument("--proteins", type=positive_int_arg, default=100) parser.add_argument("--protein-length", type=positive_int_arg, default=1000) parser.add_argument("--draws", type=positive_int_arg, default=25000) parser.add_argument("--repeats", type=positive_int_arg, default=3) parser.add_argument("--seed", type=int, default=42) parser.add_argument("--scored-pool", action="append", default=[], help="Saved real scored pool(s) to concatenate for matching parity.") parser.add_argument("--baseline-matching-source", help="Frozen processing_matching.py implementing the same policy for exact parity checks.") parser.add_argument("--affinity-predictor", help="Optional actual weights for numeric/string prediction parity.") parser.add_argument("--allele", default="HLA-A*02:01") parsed = parser.parse_args(args) out = Path(parsed.out) if out.exists(): raise FileExistsError(out) rng = numpy.random.RandomState(parsed.seed) alphabet = numpy.asarray(sorted(COMMON_AMINO_ACIDS)) proteins = {"p%d" % i: "".join(rng.choice(alphabet, parsed.protein_length)) for i in range(parsed.proteins)} start = time.perf_counter() index = ProcessingProteome(proteins) setup = time.perf_counter() - start def original(): numpy.random.seed(parsed.seed) return sample_peptide_frame_for_accessions(proteins, proteins, [8], 5, n=parsed.draws, allow_smaller=True).drop_duplicates("peptide").reset_index(drop=True) baseline, baseline_timing = timed(original, parsed.repeats) windows, numeric_timing = timed(lambda: index.sample(proteins, 8, parsed.draws, (), numpy.random.RandomState(parsed.seed)), parsed.repeats) exported, export_timing = timed(lambda: windows.to_frame(5), parsed.repeats) pandas.testing.assert_frame_equal(exported, baseline) result = { "parameters": vars(parsed), "python": platform.python_version(), "numpy": numpy.__version__, "pandas": pandas.__version__, "torch": torch.__version__, "sampler": {"dataset": "synthetic", "protein_encoding_seconds": setup, "previous_numeric_positions_with_strings": baseline_timing, "reusable_numeric_positions_without_strings": numeric_timing, "export_strings_seconds": export_timing, "exact_export_parity": True}, "source_hashes": {str(path): sha256_file(path) for path in [Path(__file__), *[ Path(__file__).resolve().parents[2] / relative for relative in ( "mhcflurry/numeric_proteome.py", "mhcflurry/numeric_sequences.py", "mhcflurry/processing_matching.py", "mhcflurry/scoring_pipeline.py", "mhcflurry/processing_preparation.py", "mhcflurry/class1_encoding.py", "mhcflurry/class1_neural_network.py", "mhcflurry/class1_affinity_predictor.py", "scripts/training/release_exact/make_train_data.processing.py")]]}} if parsed.scored_pool: frames = [pandas.read_csv(path, low_memory=False) for path in parsed.scored_pool] frame = pandas.concat(frames, ignore_index=True) reference = {"sha256": "benchmark-only"} def compare(): return matched_training_data(frame, reference) result["matching"] = {"inputs": {p: sha256_file(p) for p in parsed.scored_pool}, "rows": len(frame), "missing_protein_rows": int(frame.protein_accession.isna().sum())} if parsed.baseline_matching_source: spec = importlib.util.spec_from_file_location("mhcflurry._benchmark_baseline", parsed.baseline_matching_source) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) (actual, expected), (timing, original_timing), orders = timed_pair(compare, lambda: module.matched_training_data(frame, reference), parsed.repeats) pandas.testing.assert_frame_equal(actual[0], expected[0]) assert actual[1] == expected[1] result["matching"].update(baseline=original_timing, exact_assignment_and_diagnostics_parity=True, baseline_source_sha256=sha256_file(parsed.baseline_matching_source), execution_order=orders, execution_order_labels=["vectorized", "baseline"], speedup=original_timing["median_seconds"] / timing["median_seconds"]) else: actual, timing = timed(compare, parsed.repeats) result["matching"].update(matched_rows=len(actual[0]), vectorized=timing) if parsed.affinity_predictor: from mhcflurry import Class1AffinityPredictor from mhcflurry.processing_matching import affinity_reference_fingerprint predictor = Class1AffinityPredictor.load(parsed.affinity_predictor) allele = predictor.canonicalize_allele_name(parsed.allele) models = predictor.class1_pan_allele_models or predictor.allele_to_allele_specific_models[allele] device = models[0].get_device() numeric = index.gather(windows, device) # Warm both paths before timing. Returned NumPy predictions synchronize # accelerator work, so timings include actual completed inference. predictor.predict(exported.peptide, allele=allele) predictor.predict_numeric(numeric, allele=allele) expected, old_time = timed(lambda: predictor.predict(exported.peptide, allele=allele), parsed.repeats) actual, new_time = timed(lambda: predictor.predict_numeric(numeric, allele=allele), parsed.repeats) numpy.testing.assert_allclose(actual, expected, rtol=1e-6, atol=1e-6) result["prediction"] = {"device": str(device), "rows": len(numeric), "reference": affinity_reference_fingerprint(parsed.affinity_predictor), "string": old_time, "numeric": new_time, "max_absolute_difference": float(numpy.max(numpy.abs(actual - expected))), "allclose_rtol": 1e-6, "allclose_atol": 1e-6} out.parent.mkdir(parents=True, exist_ok=True) out.write_text(json.dumps(result, indent=2, sort_keys=True) + "\n") print(json.dumps(result, indent=2, sort_keys=True)) return result if __name__ == "__main__": run() mhcflurry-2.3.6/scripts/training/benchmark_processing_sampler.py000066400000000000000000000041771525677230600253500ustar00rootroot00000000000000#!/usr/bin/env python3 """Reproducible CPU benchmark of processing candidate sampling (no model fits).""" import argparse import json from pathlib import Path import time import numpy from mhcflurry.proteome_decoys import sample_peptide_frame_for_accessions def main(argv=None): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--out", type=Path, required=True) parser.add_argument("--proteins", type=int, default=1000) parser.add_argument("--protein-length", type=int, default=1000) parser.add_argument("--sample-size", type=int, default=25000) parser.add_argument("--seed", type=int, default=42) args = parser.parse_args(argv) if args.proteins < 1 or args.protein_length < 9 or args.sample_size < 1: parser.error("Require positive protein/sample counts and protein length >=9") if args.out.exists(): raise ValueError("Use a fresh benchmark output to preserve previous evidence") rng = numpy.random.default_rng(args.seed) alphabet = numpy.array(list("ACDEFGHIKLMNPQRSTVWY")) sequences = {str(index): "".join(rng.choice(alphabet, args.protein_length)) for index in range(args.proteins)} records = [] for method in ("reservoir", "positions"): numpy.random.seed(args.seed) started = time.perf_counter() frame = sample_peptide_frame_for_accessions(sequences, sequences, lengths=[8], n=args.sample_size, sampling_method=method) elapsed = time.perf_counter() - started record = {"method": method, "seconds": elapsed, "rows": len(frame)} records.append(record) print(record, flush=True) output = {"design": "synthetic-processing-sampler-benchmark-v1", "biological_performance_experiment": False, "parameters": {k: v for k, v in vars(args).items() if k != "out"}, "numpy_version": numpy.__version__, "records": records, "speedup": records[0]["seconds"] / records[1]["seconds"]} args.out.parent.mkdir(parents=True, exist_ok=True) args.out.write_text(json.dumps(output, indent=2) + "\n") if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/benchmark_training_profile.py000066400000000000000000000013241525677230600247730ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """CLI wrapper for mhcflurry.training_benchmark.""" from mhcflurry.training_benchmark import main if __name__ == "__main__": raise SystemExit(main()) mhcflurry-2.3.6/scripts/training/collate_experiment_figures.py000066400000000000000000000055501525677230600250420ustar00rootroot00000000000000#!/usr/bin/env python3 """Collate experiment PDFs and annotated figure panels into one report.""" import argparse import hashlib import io import json from pathlib import Path from pypdf import PdfReader, PdfWriter from reportlab.lib.styles import getSampleStyleSheet from reportlab.lib.utils import ImageReader from reportlab.pdfgen.canvas import Canvas from reportlab.platypus import Paragraph def main(argv=None): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--pdf", action="append", default=[]) parser.add_argument("--addendum", required=True, help="JSON list of panels with title, text, and optional image") parser.add_argument("--out", required=True) args = parser.parse_args(argv) panels = json.loads(Path(args.addendum).read_text()) writer = PdfWriter() inputs = [Path(args.addendum)] for filename in args.pdf: writer.append(filename) inputs.append(Path(filename)) styles = getSampleStyleSheet() for panel in panels: width, height = 900, 650 buffer = io.BytesIO() canvas = Canvas(buffer, pagesize=(width, height)) title = Paragraph(panel["title"], styles["Title"]) _, size = title.wrap(width - 72, 90) title.drawOn(canvas, 36, height - 30 - size) paragraph = Paragraph(panel["text"], styles["BodyText"]) _, size = paragraph.wrap(width - 72, 180) y = height - 90 - size paragraph.drawOn(canvas, 36, y) if panel.get("image"): path = Path(panel["image"]) inputs.append(path) image = ImageReader(str(path)) image_width, image_height = image.getSize() scale = min((width - 72) / image_width, (y - 65) / image_height) canvas.drawImage(image, (width - image_width * scale) / 2, 45, width=image_width * scale, height=image_height * scale) canvas.setFont("Helvetica", 9) canvas.drawString(36, 20, "MHCflurry 2.3.0 candidate experiments | exploratory results, not release acceptance") canvas.showPage() canvas.save() buffer.seek(0) writer.append(PdfReader(buffer)) out = Path(args.out) if out.resolve() in {path.resolve() for path in inputs}: raise ValueError("Output must differ from every input") out.parent.mkdir(parents=True, exist_ok=True) writer.write(out) manifest = { "arguments": vars(args), "pages": len(writer.pages), "inputs": [{"path": str(path), "sha256": hashlib.sha256(path.read_bytes()).hexdigest()} for path in inputs], "output_sha256": hashlib.sha256(out.read_bytes()).hexdigest(), } out.with_suffix(".manifest.json").write_text(json.dumps(manifest, indent=2) + "\n") print("Wrote %d pages to %s" % (len(writer.pages), out)) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/compare_presentation_external_predictors.py000066400000000000000000001045221525677230600300130ustar00rootroot00000000000000#!/usr/bin/env python3 """Compare saved MHCflurry scores with precomputed NetMHCpan and MixMHCpred. Compare-models prediction tables are joined row for row with the NetMHCpan 4.0 BA, NetMHCpan 4.0 EL and MixMHCpred columns distributed in data_evaluation. Per-sample, macro and pooled (micro) AUROC, AUPRC and PPV@N use the compare-models metric code. By default each predictor uses its covered rows and each pair uses rows both score. With --coverage common every metric and figure uses the same intersection of covered rows. Paired intervals resample whole samples. No predictor is run here. """ import argparse from collections import namedtuple import importlib.util import json import os from pathlib import Path import shutil import numpy import pandas from mhcflurry.cli.compare_models import _metrics, _normalize_benchmark_genotype from mhcflurry.experiment_archive import sha256_file KEYS = ["protein_accession", "peptide", "sample_id", "n_flank", "c_flank", "hit", "hla"] METRICS = ["roc_auc", "pr_auc", "ppv_at_n"] METRIC_TITLES = {"roc_auc": "AUROC", "pr_auc": "AUPRC", "ppv_at_n": "PPV@N"} EXTERNAL = { "netmhcpan4.el": ("NetMHCpan 4.0 EL", True), "netmhcpan4.ba": ("NetMHCpan 4.0 BA", False), "netmhcpan4.1.el": ("NetMHCpan 4.1 EL", True), "netmhcpan4.1.ba": ("NetMHCpan 4.1 BA", False), "netmhcpan4.2.el": ("NetMHCpan 4.2 EL", True), "netmhcpan4.2.ba": ("NetMHCpan 4.2 BA", False), "mixmhcpred": ("MixMHCpred", True), } # Color carries the predictor family; version is an ordinal step within it, so # three NetMHCpan versions do not spend three unrelated hues. Both ramps pass # the ordinal checks (monotone lightness, >=0.06 steps, one hue, light end # clear of the surface). Five families cannot all separate under deuteranopia # in one chart, so the eluted-ligand and binding-affinity ramps belong to # separate facets; MixMHCpred and the reference series stay deliberately muted # and always carry direct labels. ROLE_COLORS = {"a": "#2a78d6", "b": "#eb6834", "netmhcpan4.el": "#34c191", "netmhcpan4.1.el": "#199a6d", "netmhcpan4.2.el": "#0c6b4b", "netmhcpan4.ba": "#a79ee2", "netmhcpan4.1.ba": "#6d5dc6", "netmhcpan4.2.ba": "#42328f", "mixmhcpred": "#898781", "baseline": "#5c5b55", "random": "#c3c2b7"} AMINO_ACIDS = "ACDEFGHIKLMNPQRSTVWY" TERMINAL_RESIDUES = 4 BASELINES = ("random", "terminal-logistic") SURFACE, INK, SECONDARY, MUTED = "#fcfcfb", "#0b0b0b", "#52514e", "#898781" GRID, BASELINE_INK = "#e1e0d9", "#c3c2b7" STYLE = { "figure.facecolor": SURFACE, "axes.facecolor": SURFACE, "savefig.facecolor": SURFACE, "axes.edgecolor": BASELINE_INK, "axes.linewidth": 0.8, "axes.labelcolor": SECONDARY, "axes.titlecolor": INK, "axes.titlesize": 11, "axes.spines.top": False, "axes.spines.right": False, "xtick.color": BASELINE_INK, "ytick.color": BASELINE_INK, "xtick.labelcolor": SECONDARY, "ytick.labelcolor": INK, "grid.color": GRID, "grid.linewidth": 0.8, "grid.linestyle": "-", "font.size": 9, "text.color": INK, "legend.frameon": False, } Condition = namedtuple("Condition", ["label", "higher_is_better", "role"]) def row_identity(frame): """Hash benchmark row identity; NA-like strings compare consistently. compare-models saves canonical MHC allele sets (sorted, homozygous copies removed), so both sides pass through its idempotent normalizer first. """ hit = pandas.to_numeric(frame["hit"], errors="raise") if not hit.isin([0, 1]).all(): raise ValueError("Benchmark hit values must be 0 or 1") keys = pandas.DataFrame({ name: hit.astype("int64") if name == "hit" else frame[name].fillna("").astype(str) for name in KEYS}) genotypes = {value: _normalize_benchmark_genotype(value) for value in pandas.unique(keys["hla"])} keys["hla"] = keys["hla"].map(genotypes) return pandas.util.hash_pandas_object(keys, index=False).to_numpy() def read_predictions(path, score_columns): """Read one compare-models table with identity, source file and scores.""" path = Path(path) if not path.is_file(): raise FileNotFoundError("Missing saved predictions: %s" % path) required = set(KEYS) | {"source_file"} | set(score_columns) frame = pandas.read_csv( path, usecols=lambda name: name in required or name in EXTERNAL, dtype={name: str for name in KEYS if name != "hit"}, low_memory=False) missing = sorted(required - set(frame.columns)) if missing: raise ValueError("%s lacks columns: %s" % (path, ", ".join(missing))) frame["_identity"] = row_identity(frame) frame["hit"] = frame["hit"].astype("int64") return frame def load_saved_scores(comparison_dir, cohort, a_label, b_label): """Return saved rows, named score conditions and their input files.""" comparison_dir = Path(comparison_dir) conditions = {} if cohort == "multiallelic": score_columns = ["a_presentation_score", "b_presentation_score", "a_presentation_percentile", "b_presentation_percentile"] paths = {mode: comparison_dir / "presentation" / ("predictions_%s.csv.bz2" % mode) for mode in ("with_flanks", "without_flanks")} tables = {mode: read_predictions(path, score_columns) for mode, path in paths.items()} with_flanks, without_flanks = tables["with_flanks"], tables["without_flanks"] if (len(with_flanks) != len(without_flanks) or not numpy.array_equal(with_flanks["_identity"], without_flanks["_identity"]) or not with_flanks.source_file.equals(without_flanks.source_file)): raise ValueError("With- and without-flank predictions must describe identical rows in one order") keep = ["sample_id", "source_file", "hit", "peptide", "_identity"] + [ name for name in EXTERNAL if name in with_flanks] frame = with_flanks[keep].copy() for mode, table in tables.items(): mode_label = mode.replace("_", " ") for side, label in (("a", a_label), ("b", b_label)): frame["%s_%s" % (side, mode)] = table[side + "_presentation_score"].to_numpy(dtype=float) conditions["%s_%s" % (side, mode)] = Condition("%s, %s" % (label, mode_label), True, side) name = "%s_%s_percentile" % (side, mode) frame[name] = table[side + "_presentation_percentile"].to_numpy(dtype=float) conditions[name] = Condition("%s, %s, percentile" % (label, mode_label), False, side) return frame, conditions, list(paths.values()) path = comparison_dir / "affinity" / "predictions.csv.bz2" table = read_predictions(path, ["a_pred", "b_pred"]) frame = table[["sample_id", "source_file", "hit", "peptide", "_identity"] + [ name for name in EXTERNAL if name in table]].copy() for side, label in (("a", a_label), ("b", b_label)): frame[side + "_affinity"] = table[side + "_pred"].to_numpy(dtype=float) conditions[side + "_affinity"] = Condition("%s affinity" % label, False, side) return frame, conditions, [path] def external_path(directories, cohort, predictor, source_file): """Find one predictor's file for a saved benchmark file, compressed or not.""" marker = ".train_excluded." if not source_file.startswith("benchmark.%s." % cohort) or marker not in source_file: raise ValueError("Unrecognized %s benchmark source file: %s" % (cohort, source_file)) name = "benchmark.%s.%s%s%s" % (cohort, predictor, marker, source_file.split(marker, 1)[1]) names = [name, name[:-len(".bz2")]] if name.endswith(".bz2") else [name] for directory in directories: for candidate in names: path = Path(directory) / candidate if path.is_file(): return path raise FileNotFoundError("No %s file for %s in: %s" % ( predictor, source_file, ", ".join(str(directory) for directory in directories))) def attach_external(frame, cohort, directories, predictors): """Attach precomputed predictor columns by source file and exact row identity. Saved rows are an ordered subset of each benchmark file, so the k-th saved occurrence of an identity matches the k-th external occurrence. Every saved row must match exactly once; a saved copy of a predictor column must agree. """ frame = frame.copy() frame["_row"] = numpy.arange(len(frame)) frame["_occurrence"] = frame.groupby(["source_file", "_identity"], sort=False).cumcount() pieces, inputs = [], [] for source_file, sub in frame.groupby("source_file", sort=True): for predictor in predictors: path = external_path(directories, cohort, predictor, source_file) raw = pandas.read_csv(path, usecols=KEYS + [predictor], dtype={name: str for name in KEYS if name != "hit"}, low_memory=False) external = pandas.DataFrame({ "_identity": row_identity(raw), predictor: pandas.to_numeric(raw[predictor], errors="coerce").to_numpy()}) external["_occurrence"] = external.groupby("_identity", sort=False).cumcount() existing = sub.pop(predictor).to_numpy(dtype=float) if predictor in sub else None merged = sub.merge(external, on=["_identity", "_occurrence"], how="left", validate="one_to_one", indicator=True) unmatched = int((merged["_merge"] != "both").sum()) if unmatched: raise ValueError("%d saved rows from %s lack a matching %s row" % ( unmatched, source_file, predictor)) if existing is not None and not numpy.allclose( existing, merged[predictor].to_numpy(dtype=float), rtol=1e-12, atol=1e-12, equal_nan=True): raise ValueError("Saved %s values disagree with %s" % (predictor, path.name)) sub = merged.drop(columns="_merge") inputs.append(path) pieces.append(sub) joined = pandas.concat(pieces, ignore_index=True).sort_values("_row", kind="stable") return joined.drop(columns="_occurrence").reset_index(drop=True), inputs def condition_scores(frame, name, condition): """Finite-row mask and higher-is-better scores for one condition.""" values = frame[name].to_numpy(dtype=float) return numpy.isfinite(values), values if condition.higher_is_better else -values def per_sample_metrics(frame, names, conditions, mask): """compare-models metrics per sample for named conditions on masked rows.""" rows = numpy.flatnonzero(mask) hits = frame.hit.to_numpy()[rows] positions = pandas.Series(numpy.arange(len(rows))).groupby( frame.sample_id.to_numpy()[rows], sort=True).indices scores = {name: condition_scores(frame, name, conditions[name])[1][rows] for name in names} records = [] for sample in sorted(positions): index = positions[sample] for name in names: records.append(dict(sample_id=sample, condition=name, label=conditions[name].label, **_metrics(hits[index], scores[name][index]))) result = pandas.DataFrame(records) if (result.empty or result[METRICS].isna().any().any() or result.sample_id.nunique() != frame.sample_id.nunique()): raise ValueError("Every sample needs scored hits and decoys for: %s" % ", ".join(names)) return result def score_conditions(frame, conditions): """Each predictor on the rows it scores: per-sample, macro and pooled metrics.""" coverage = pandas.DataFrame({"sample_id": frame.sample_id.to_numpy(), "rows": 1}) per_sample, summary = [], [] hits = frame.hit.to_numpy() for name, condition in conditions.items(): mask, scores = condition_scores(frame, name, condition) coverage[name + "_unscored"] = ~mask metrics = per_sample_metrics(frame, [name], conditions, mask) pooled = _metrics(hits[mask], scores[mask]) summary.append(dict(condition=name, label=condition.label, samples=metrics.sample_id.nunique(), rows=pooled["n"], hits=pooled["n_pos"], **{"macro_" + metric: metrics[metric].mean() for metric in METRICS}, **{"micro_" + metric: pooled[metric] for metric in METRICS})) per_sample.append(metrics) coverage = coverage.groupby("sample_id", sort=True).sum().reset_index() return pandas.concat(per_sample, ignore_index=True), pandas.DataFrame(summary), coverage def common_coverage(frame, conditions): """Retain identical scored rows for every model, preserving every sample.""" mask = numpy.logical_and.reduce([ condition_scores(frame, name, condition)[0] for name, condition in conditions.items()]) result = frame.loc[mask].copy() if set(result.sample_id) != set(frame.sample_id): raise ValueError("Common coverage would drop an entire evaluation sample") return result def terminal_residue_features(peptides): """One-hot the first and last four residues; other symbols share one slot.""" import scipy.sparse series = pandas.Series(peptides, dtype=object).fillna("").astype(str).str.upper() lookup = numpy.full(256, len(AMINO_ACIDS), dtype=numpy.int64) for index, residue in enumerate(AMINO_ACIDS): lookup[ord(residue)] = index width, alphabet = TERMINAL_RESIDUES, len(AMINO_ACIDS) + 1 blocks = [] for part in (series.str[:width].str.ljust(width, "X"), series.str[-width:].str.rjust(width, "X")): raw = numpy.frombuffer("".join(part).encode("ascii", "replace"), dtype=numpy.uint8) blocks.append(lookup[raw].reshape(len(series), width)) columns = numpy.hstack(blocks) + numpy.arange(2 * width) * alphabet rows = numpy.repeat(numpy.arange(len(series)), 2 * width) return scipy.sparse.csr_matrix( (numpy.ones(rows.size, dtype=numpy.float32), (rows, columns.ravel())), shape=(len(series), 2 * width * alphabet)) def leave_one_sample_out_logistic(frame): """Score each sample with a logistic regression fitted on every other sample. Features are the one-hot first and last four residues only, with no MHC or flank input, so this measures how much generic peptide-terminus composition separates hits from decoys. A sample's own labels never reach its scores. """ from sklearn.linear_model import LogisticRegression features = terminal_residue_features(frame.peptide.to_numpy()) hits = frame.hit.to_numpy() samples = frame.sample_id.to_numpy() scores = numpy.full(len(frame), numpy.nan) for sample in numpy.unique(samples): test, train = numpy.flatnonzero(samples == sample), numpy.flatnonzero(samples != sample) if len(numpy.unique(hits[train])) < 2: raise ValueError("Leave-one-sample-out baseline needs hits and decoys outside %s" % sample) model = LogisticRegression(C=1.0, max_iter=1000) model.fit(features[train], hits[train]) scores[test] = model.decision_function(features[test]) return scores def comparison_pairs(cohort, conditions): """Candidate/reference pairs reported with paired intervals.""" candidate, reference = (("a_with_flanks", "b_with_flanks") if cohort == "multiallelic" else ("a_affinity", "b_affinity")) pairs = [(candidate, reference)] # Derive external pairs from the supported registry, including every # requested version and both score types. Availability is filtered below. pairs.extend((candidate, name) for name in EXTERNAL) pairs.append((candidate, "terminal_logistic")) if cohort == "multiallelic": pairs.extend([("a_without_flanks", "b_without_flanks"), ("a_with_flanks_percentile", "b_with_flanks_percentile")]) pairs.extend((reference, name) for name in EXTERNAL) return [pair for pair in pairs if set(pair) <= set(conditions)] def paired_comparisons(frame, conditions, per_sample, pairs, replicates, seed): """Paired sample bootstrap per pair on rows both predictors score. One seed gives every pair the same resampled samples. """ path = Path(__file__).resolve().parent / "paired_sample_metrics.py" spec = importlib.util.spec_from_file_location("paired_sample_metrics", path) paired_module = importlib.util.module_from_spec(spec) spec.loader.exec_module(paired_module) summaries, differences, draws = [], [], {} for candidate, reference in pairs: candidate_mask = condition_scores(frame, candidate, conditions[candidate])[0] reference_mask = condition_scores(frame, reference, conditions[reference])[0] joint = candidate_mask & reference_mask if joint.sum() == candidate_mask.sum() == reference_mask.sum(): subset = per_sample.loc[per_sample.condition.isin([candidate, reference])] else: subset = per_sample_metrics(frame, [candidate, reference], conditions, joint) summary, delta, bootstrap = paired_module.paired_summary( subset[["sample_id", "condition", "n", "n_pos"] + METRICS], units=["sample_id"], condition="condition", metrics=METRICS, baseline=reference, replicates=replicates, seed=seed) summaries.append(summary.rename(columns={"condition": "candidate", "baseline": "reference"}) .assign(rows_excluded=int(len(frame) - joint.sum()))) differences.append(delta.rename(columns={"condition": "candidate"}).assign(reference=reference)) for key, values in bootstrap.items(): draws["%s-vs-%s:%s" % (candidate, reference, key.split(":", 1)[1])] = values return pandas.concat(summaries, ignore_index=True), pandas.concat(differences, ignore_index=True), draws def color_for(name, conditions): return ROLE_COLORS[conditions[name].role] def spread(count): return numpy.linspace(-0.18, 0.18, count) if count > 1 else numpy.zeros(count) def plot_metric_strips(names, conditions, per_sample, summary, title): import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 3, figsize=(13, 1.8 + 0.45 * len(names)), sharey=True, layout="constrained") macro = summary.set_index("condition") for axis, metric in zip(axes, METRICS): for row, name in enumerate(names): values = per_sample.loc[per_sample.condition == name, metric].to_numpy() color = color_for(name, conditions) axis.scatter(values, row + spread(len(values)), s=12, color=color, alpha=0.4, linewidths=0, zorder=2) mean = macro.loc[name, "macro_" + metric] axis.scatter([mean], [row], s=64, color=color, edgecolors=SURFACE, linewidths=1.5, zorder=3) axis.annotate("%.3f" % mean, (mean, row), xytext=(0, 9), textcoords="offset points", ha="center", fontsize=8, color=SECONDARY) axis.set_title("Macro " + METRIC_TITLES[metric], loc="left") axis.grid(axis="x") axis.set_axisbelow(True) axis.set_xlabel("Small dots: samples. Large dots: macro mean.") axes[0].set_yticks(numpy.arange(len(names)), labels=[conditions[name].label for name in names]) axes[0].set_ylim(len(names) - 0.5, -0.6) fig.suptitle(title, x=0.01, ha="left", fontsize=12) return fig def plot_paired(pairs, conditions, paired, differences, title): import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 3, figsize=(13, 1.8 + 0.62 * len(pairs)), sharey=True, layout="constrained") for axis, metric in zip(axes, METRICS): for row, (candidate, reference) in enumerate(pairs): match = (paired.candidate == candidate) & (paired.reference == reference) summary = paired.loc[match & (paired.metric == metric)].iloc[0] deltas = differences.loc[(differences.candidate == candidate) & (differences.reference == reference) & (differences.metric == metric), "delta"].to_numpy() color = color_for(reference, conditions) axis.scatter(deltas, row + spread(len(deltas)), s=12, color=MUTED, alpha=0.55, linewidths=0, zorder=2) axis.hlines(row, summary.ci_low, summary.ci_high, color=color, linewidth=2, zorder=3) axis.scatter([summary.delta], [row], s=64, color=color, edgecolors=SURFACE, linewidths=1.5, zorder=4) axis.axvline(0, color=BASELINE_INK, linewidth=1, zorder=1) axis.set_title(METRIC_TITLES[metric] + " difference", loc="left") axis.grid(axis="x") axis.set_axisbelow(True) axis.set_xlabel("Dots: samples. Bar: 95% paired sample interval.") axes[0].set_yticks(numpy.arange(len(pairs)), labels=[ "%s\nminus %s" % (conditions[candidate].label, conditions[reference].label) for candidate, reference in pairs]) axes[0].set_ylim(len(pairs) - 0.5, -0.6) fig.suptitle(title, x=0.01, ha="left", fontsize=12) return fig def plot_precision_recall(names, conditions, summary, frame, title): import matplotlib.pyplot as plt from sklearn.metrics import precision_recall_curve fig, axis = plt.subplots(figsize=(7.5, 5.4), layout="constrained") micro = summary.set_index("condition")["micro_pr_auc"] hits = frame.hit.to_numpy() for name in names: mask, scores = condition_scores(frame, name, conditions[name]) precision, recall, _ = precision_recall_curve(hits[mask], scores[mask]) step = max(1, len(recall) // 4000) index = numpy.unique(numpy.r_[numpy.arange(0, len(recall), step), len(recall) - 1]) axis.plot(recall[index], precision[index], color=color_for(name, conditions), linewidth=2, solid_joinstyle="round", solid_capstyle="round", label="%s (pooled AUPRC %.3f)" % (conditions[name].label, micro[name])) axis.set(xlim=(0, 1), ylim=(0, 1), xlabel="Recall", ylabel="Precision") axis.grid(True) axis.set_axisbelow(True) axis.legend(loc="upper right", fontsize=8) fig.suptitle(title, x=0.01, ha="left", fontsize=12) return fig def render(out, cohort, conditions, frame, per_sample, summary, paired, differences, pairs): """Write the comparison pages as one PDF and separate PNGs.""" import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages samples = int(summary.samples.iloc[0]) cohort_title = ("%d held-out multiallelic presentation samples" % samples if cohort == "multiallelic" else "%d monoallelic samples" % samples) raw = [name for name in conditions if not name.endswith("_percentile")] curve_order = (["a_with_flanks", "b_with_flanks"] if cohort == "multiallelic" else ["a_affinity", "b_affinity"]) curve_order += [name for name in EXTERNAL if name in conditions] # Candidate-versus-reference differences are an order of magnitude smaller # than external gaps; separate pages keep both legible. internal = [pair for pair in pairs if conditions[pair[1]].role in ("a", "b")] external = [pair for pair in pairs if conditions[pair[1]].role not in ("a", "b")] with plt.rc_context(STYLE), PdfPages(out / "external_comparison.pdf") as pdf: pages = [("macro_metrics", lambda: plot_metric_strips( raw, conditions, per_sample, summary, "Ranking metrics per predictor, " + cohort_title))] if internal: pages.append(("paired_differences_mhcflurry", lambda: plot_paired( internal, conditions, paired, differences, "MHCflurry candidate versus MHCflurry reference, " + cohort_title))) if external: pages.append(("paired_differences_external", lambda: plot_paired( external, conditions, paired, differences, "MHCflurry versus NetMHCpan and MixMHCpred, " + cohort_title))) pages.append(("precision_recall", lambda: plot_precision_recall( [name for name in curve_order if name in conditions], conditions, summary, frame, "Pooled precision-recall, " + cohort_title))) for name, make in pages: fig = make() pdf.savefig(fig) fig.savefig(out / (name + ".png"), dpi=180) plt.close(fig) def markdown(frame, columns, headers, formats): lines = ["| " + " | ".join(headers) + " |", "|" + "|".join("---" if fmt is None else "---:" for fmt in formats) + "|"] for _, row in frame.iterrows(): lines.append("| " + " | ".join( str(row[column]) if fmt is None else fmt % row[column] for column, fmt in zip(columns, formats)) + " |") return "\n".join(lines) def write_summary_markdown(out, args, summary, paired, coverage): paired = paired.assign(interval=[ "[%+.4f, %+.4f]" % (low, high) for low, high in zip(paired.ci_low, paired.ci_high)], improved=["%d/%d" % (up, n) for up, n in zip(paired.samples_improved, paired.samples)]) labels = summary.set_index("condition")["label"] paired = paired.assign(candidate_label=paired.candidate.map(labels), reference_label=paired.reference.map(labels), metric_label=paired.metric.map(METRIC_TITLES)) unscored = ["%s %d" % (labels[column[:-len("_unscored")]], int(coverage[column].sum())) for column in coverage.columns if column.endswith("_unscored") and coverage[column].sum()] coverage_description = ( "Every predictor, paired comparison and figure uses the same %d rows " "(%d rows excluded from every predictor)." % ( int(summary.rows.iloc[0]), int(coverage.common_excluded.sum())) if args.coverage == "common" else "Each predictor is scored on the rows it covers and each paired " "comparison on rows both predictors score.") text = [ "# External predictor comparison (%s)" % args.cohort, "", "%d samples, %d original benchmark rows. %s Rows without a score before " "filtering: %s. Macro metrics average samples; micro metrics pool rows. Intervals " "are paired sample bootstraps (%d draws, seed %d): exploratory, conditional on " "the trained models, and uncorrected for multiple comparisons." % ( int(summary.samples.iloc[0]), int(coverage.rows.sum()), coverage_description, ", ".join(unscored) or "none", args.replicates, args.seed), "", "## Metrics", "", markdown(summary, ["label", "rows", "macro_roc_auc", "macro_pr_auc", "macro_ppv_at_n", "micro_roc_auc", "micro_pr_auc", "micro_ppv_at_n"], ["Predictor", "Rows", "Macro AUROC", "Macro AUPRC", "Macro PPV@N", "Micro AUROC", "Micro AUPRC", "Micro PPV@N"], [None, "%d"] + ["%.4f"] * 6), "", "## Paired differences", "", markdown(paired, ["candidate_label", "reference_label", "metric_label", "delta", "interval", "improved", "rows_excluded"], ["Candidate", "Reference", "Metric", "Difference", "95% interval", "Samples improved", "Rows excluded"], [None, None, None, "%+.4f", None, None, "%d"]), ""] (out / "summary.md").write_text("\n".join(text)) def json_argument(value): """Paths, including repeatable path options, are recorded as strings.""" if isinstance(value, Path): return str(value) if isinstance(value, (list, tuple)): return [str(item) if isinstance(item, Path) else item for item in value] return value def main(argv=None): parser = argparse.ArgumentParser(prog=os.environ.get("MHCFLURRY_CLI_PROG"), description=__doc__) parser.add_argument("--comparison-dir", type=Path, required=True, help="compare-models output directory with saved prediction tables.") parser.add_argument("--data-dir", type=Path, required=True, help="data_evaluation download containing precomputed predictor files.") parser.add_argument("--external-dir", type=Path, action="append", default=[], help="Extra directory of predictor files, repeatable. Searched after " "--data-dir; files may be plain CSV. Use for locally generated scores.") parser.add_argument("--cohort", choices=("multiallelic", "monoallelic"), default="multiallelic", help="multiallelic: saved presentation scores; monoallelic: saved affinities.") parser.add_argument("--external", default=",".join(EXTERNAL), help="Comma-separated precomputed predictors (default: %(default)s).") parser.add_argument("--baselines", default=",".join(BASELINES), help="Reference baselines: random, terminal-logistic, or none " "(default: %(default)s).") parser.add_argument("--a-label", default="MHCflurry candidate") parser.add_argument("--b-label", default="MHCflurry 2.2") parser.add_argument("--replicates", type=int, default=10000) parser.add_argument("--seed", type=int, default=42) parser.add_argument("--coverage", choices=("available", "common"), default="available", help="Use each predictor's covered rows, or identical rows for every metric and figure.") parser.add_argument("--skip-joined-table", action="store_true", help="Do not write joined_scores.csv.gz (large monoallelic cohorts).") parser.add_argument("--out", type=Path, required=True, help="New or empty output directory.") args = parser.parse_args(argv) predictors = [name.strip() for name in args.external.split(",") if name.strip()] if not predictors or set(predictors) - set(EXTERNAL): raise ValueError("--external must name predictors from: %s" % ", ".join(EXTERNAL)) baselines = [] if args.baselines.strip().lower() == "none" else [ name.strip() for name in args.baselines.split(",") if name.strip()] if set(baselines) - set(BASELINES): raise ValueError("--baselines must name: %s, or none" % ", ".join(BASELINES)) if args.replicates < 100: raise ValueError("Use at least 100 bootstrap draws") if args.out.exists() and any(args.out.iterdir()): raise ValueError("Output directory must be new or empty: %s" % args.out) frame, conditions, inputs = load_saved_scores( args.comparison_dir, args.cohort, args.a_label, args.b_label) frame, external_inputs = attach_external( frame, args.cohort, [args.data_dir] + list(args.external_dir), predictors) for predictor in predictors: label, higher_is_better = EXTERNAL[predictor] conditions[predictor] = Condition(label, higher_is_better, predictor) if "random" in baselines: frame["random"] = numpy.random.default_rng(args.seed).random(len(frame)) conditions["random"] = Condition("Random scores", True, "random") if "terminal-logistic" in baselines: frame["terminal_logistic"] = leave_one_sample_out_logistic(frame) conditions["terminal_logistic"] = Condition( "Terminal 4-residue logistic regression, no MHC", True, "baseline") original_rows, original_hits = len(frame), int(frame.hit.sum()) original_coverage = None if args.coverage == "common": common = common_coverage(frame, conditions) original_coverage = pandas.DataFrame({ "sample_id": frame.sample_id, "rows": 1, "common_excluded": ~frame.index.isin(common.index), **{name + "_unscored": ~condition_scores(frame, name, condition)[0] for name, condition in conditions.items()}, }).groupby("sample_id", sort=True).sum().reset_index() frame = common per_sample, summary, coverage = score_conditions(frame, conditions) if original_coverage is not None: coverage = original_coverage pairs = comparison_pairs(args.cohort, conditions) paired, differences, draws = paired_comparisons( frame, conditions, per_sample, pairs, args.replicates, args.seed) args.out.mkdir(parents=True, exist_ok=True) per_sample.to_csv(args.out / "per_sample_metrics.csv", index=False) summary.to_csv(args.out / "summary.csv", index=False) coverage.to_csv(args.out / "coverage.csv", index=False) paired.to_csv(args.out / "paired_differences.csv", index=False) differences.to_csv(args.out / "sample_differences.csv", index=False) numpy.savez_compressed(args.out / "bootstrap_deltas.npz", **draws) if not args.skip_joined_table: columns = ["_row", "source_file", "sample_id", "hit"] + list(conditions) frame[columns].rename(columns={"_row": "prediction_row"}).to_csv( args.out / "joined_scores.csv.gz", index=False, compression={"method": "gzip", "compresslevel": 1}) render(args.out, args.cohort, conditions, frame, per_sample, summary, paired, differences, pairs) write_summary_markdown(args.out, args, summary, paired, coverage) shutil.copyfile(__file__, args.out / "analysis_source.py") provenance = { "arguments": {key: json_argument(value) for key, value in vars(args).items()}, "conditions": {name: condition._asdict() for name, condition in conditions.items()}, "pairs": pairs, "coverage": {"policy": args.coverage, "original_rows": original_rows, "original_hits": original_hits, "scored_rows": len(frame), "scored_hits": int(frame.hit.sum()), "excluded_rows": original_rows - len(frame)}, "method": ("compare-models _metrics per sample; " + ( "all predictors and pairs on identical common rows; " if args.coverage == "common" else "each predictor on its scored rows, each pair on rows both score; ") + "paired sample percentile bootstrap of equal-sample macro means"), "baselines": { "random": "uniform scores from numpy default_rng(seed)", "terminal-logistic": "one-hot first and last four residues (21 symbols each), " "sklearn LogisticRegression(C=1), fitted leave-one-sample-out; " "no MHC or flank input"}, "inputs": [{"path": str(Path(path).resolve()), "sha256": sha256_file(path)} for path in inputs + external_inputs], } (args.out / "provenance.json").write_text(json.dumps(provenance, indent=2) + "\n") print((args.out / "summary.md").read_text()) return 0 if __name__ == "__main__": raise SystemExit(main()) mhcflurry-2.3.6/scripts/training/compare_presentation_percentiles.py000066400000000000000000000556341525677230600262610ustar00rootroot00000000000000#!/usr/bin/env python """Reproducible compact-percentile comparison using cached model predictions. Subcommands separate label-free calibration/selection from presentation evaluation. No command loads neural-network weights or changes saved models. """ import argparse import hashlib import json import sys import time from pathlib import Path import numpy as np import pandas as pd from sklearn.metrics import average_precision_score, roc_auc_score from mhcflurry.class1_presentation_predictor import presentation_percent_rank_bins from mhcflurry.compact_percent_rank_transform import CompactPresentationPercentiles from mhcflurry.percent_rank_transform import PercentRankTransform CUTOFFS = np.array([.001, .003, .01, .03, .1, .3, 1., 3., 10., 30., 50., 90.]) SELECTION_CUTOFFS = [.03, .1, .3, 1., 3., 10.] METRICS = ["auprc", "auroc", "ppv_expected_random_ties"] # Resolve from this checkout (scripts/training/ is two levels below the root), not the cwd. COMPACT_TRANSFORM_SOURCE = ( Path(__file__).resolve().parents[2] / "mhcflurry" / "compact_percent_rank_transform.py") def sha256(path): digest = hashlib.sha256() with open(path, "rb") as handle: for chunk in iter(lambda: handle.read(1024 * 1024), b""): digest.update(chunk) return digest.hexdigest() def write_json(path, data): Path(path).write_text(json.dumps(data, indent=2, allow_nan=False) + "\n") def grouped_reference_split(peptides, seed): """Return 60/20/20 split IDs, with duplicate peptides kept together.""" unique, inverse = np.unique(np.asarray(peptides), return_inverse=True) if len(unique) < 5: raise ValueError("At least five distinct peptides are required") order = np.random.default_rng(seed).permutation(len(unique)) groups = np.full(len(unique), 2, dtype=np.int8) groups[order[:int(.6 * len(unique))]] = 0 groups[order[int(.6 * len(unique)):int(.8 * len(unique))]] = 1 return groups[inverse] def calibration_accuracy(percentiles, cutoffs=CUTOFFS): """Compare predicted percentile thresholds with observed background mass.""" values = np.asarray(percentiles) if values.ndim != 1 or len(values) == 0 or not np.isfinite(values).all(): raise ValueError("Expected a nonempty finite percentile vector") records = [] for cutoff in cutoffs: count = int(np.count_nonzero(values <= cutoff)) observed = 100.0 * count / len(values) smoothed = 100.0 * (count + .5) / (len(values) + 1) records.append(dict(cutoff=float(cutoff), count=count, rows=len(values), observed_percent=observed, smoothed_percent=smoothed, log10_error=float(np.log10(smoothed / cutoff)))) return pd.DataFrame(records) def select_compact_method(accuracy): """Choose the smallest curve near the best validation-only calibration error.""" selected_rows = accuracy.loc[ (accuracy.split == "validation") & accuracy.method.str.startswith("compact_") & accuracy.cutoff.isin(SELECTION_CUTOFFS)].copy() losses = selected_rows.groupby("method").log10_error.apply( lambda values: float(np.sqrt(np.mean(np.square(values))))) if losses.empty or not np.isfinite(losses).all(): raise ValueError("Missing finite validation calibration errors") best = float(losses.min()) tolerance = max(.1 * best, .01) eligible = losses[losses <= best + tolerance].index selected = min(eligible, key=lambda name: int(name.split("_")[-1])) return dict(selected=selected, validation_rms_log10_error=losses.to_dict(), best=best, tolerance=tolerance, selection_cutoffs=SELECTION_CUTOFFS) def ranking_metrics(labels, scores): """Return AP/AUROC and analytic expected PPV when cutoff scores are tied.""" labels, scores = np.asarray(labels), np.asarray(scores) if (labels.shape != scores.shape or labels.ndim != 1 or not np.isin(labels, [0, 1]).all() or not np.isfinite(scores).all()): raise ValueError("Expected aligned binary labels and finite scores") n = int(labels.sum()) if not 0 < n < len(labels): raise ValueError("Ranking evaluation needs both positive and negative rows") cutoff = np.partition(scores, len(scores) - n)[len(scores) - n] above, tied = scores > cutoff, scores == cutoff expected = labels[above].sum() + (n - above.sum()) * labels[tied].mean() return dict(auprc=float(average_precision_score(labels, scores)), auroc=float(roc_auc_score(labels, scores)), ppv_expected_random_ties=float(expected / n)) def fit_methods(reference, budgets): methods = {} for name, bins in [ ("uniform_step", np.unique(np.quantile(reference, np.linspace(0, 1, 10001)))), ("tail_step", presentation_percent_rank_bins(reference))]: model = PercentRankTransform() model.fit(reference, bins=bins) methods[name] = model for budget in budgets: methods["compact_%d" % budget] = CompactPresentationPercentiles.from_scores(reference, budget) return methods def percentiles(model, scores): if isinstance(model, CompactPresentationPercentiles): return model.transform(scores) return 100.0 - model.transform(scores) def save_methods(methods, destination): destination.mkdir() records = [] for name, model in methods.items(): if isinstance(model, CompactPresentationPercentiles): path = destination / (name + ".json") write_json(path, model.to_dict()) restored = CompactPresentationPercentiles.from_dict(json.loads(path.read_text())) probe = np.r_[np.linspace(0, 1, 10001), model.reference_bounds] np.testing.assert_array_equal(model.transform(probe), restored.transform(probe)) count, knots = len(model.x) * 2 + 2, len(model.x) else: path = destination / (name + ".csv") model.to_series().to_csv(path) count, knots = len(model.cdf) + len(model.bin_edges), len(model.bin_edges) records.append(dict(method=name, knots=knots, numeric_scalars=count, coordinate_bytes=count * 8, serialized_bytes=path.stat().st_size, sha256=sha256(path))) return records def load_methods(destination): methods = {} for path in sorted(Path(destination).glob("*")): if path.suffix == ".json": methods[path.stem] = CompactPresentationPercentiles.from_dict(json.loads(path.read_text())) elif path.suffix == ".csv": table = pd.read_csv(path, index_col=0, float_precision="round_trip") methods[path.stem] = PercentRankTransform.from_series(table.iloc[:, 0]) return methods def fit_command(args): started = time.perf_counter() out = Path(args.out) out.mkdir(parents=True, exist_ok=False) source = Path(args.reference_dir) peptide_path = source / "reference_peptides.csv.bz2" peptides = pd.read_csv(peptide_path).peptide.to_numpy() paths = sorted(source.glob("reference_scores_*.npy")) if not paths: raise ValueError("No cached reference score files found") chunks = [np.load(path) for path in paths] if any(chunk.shape != (len(peptides),) for chunk in chunks): raise ValueError("Each allele must have one score per reference peptide") reference = np.concatenate(chunks) peptide_splits = grouped_reference_split(peptides, args.seed) splits = np.tile(peptide_splits, len(chunks)) np.savez_compressed(out / "reference_split.npz", peptide_split=peptide_splits, reference_split=splits, reference_scores=reference) print("Reference rows by split:", np.bincount(splits).tolist(), flush=True) methods = fit_methods(reference[splits == 0], args.knots) sizes = save_methods(methods, out / "split_fit") accuracy = [] for split_id, split_name in [(1, "validation"), (2, "test")]: for name, model in methods.items(): frame = calibration_accuracy(percentiles(model, reference[splits == split_id])) frame["method"], frame["split"] = name, split_name accuracy.append(frame) accuracy = pd.concat(accuracy, ignore_index=True) accuracy.to_csv(out / "calibration_accuracy.csv", index=False) selection = select_compact_method(accuracy) write_json(out / "selection.json", selection) print("Label-free selection:", selection, flush=True) full_methods = fit_methods(reference, args.knots) full_sizes = save_methods(full_methods, out / "full_fit") pd.DataFrame([dict(fit="split", **row) for row in sizes] + [dict(fit="full", **row) for row in full_sizes]).to_csv( out / "model_sizes.csv", index=False) provenance = dict(command=sys.argv, seed=args.seed, knots=args.knots, reference_rows=len(reference), reference_peptides=len(peptides), reference_hashes={str(path): sha256(path) for path in [peptide_path] + paths}, elapsed_seconds=time.perf_counter() - started, source_hashes={str(path): sha256(path) for path in [Path(__file__), COMPACT_TRANSFORM_SOURCE]}, notes="Peptide-grouped split; no presentation labels used. Uniform-AA cached " "reference differs from original release calibration policy.") for name in ("parameters.json", "provenance.json"): if (source / name).exists(): provenance["reference_" + name.removesuffix(".json")] = json.loads((source / name).read_text()) write_json(out / "provenance.json", provenance) def evaluate_command(args): started = time.perf_counter() root = Path(args.calibration_dir) out = root / args.mode out.mkdir(exist_ok=False) methods = load_methods(root / "full_fit") if not methods: raise ValueError("No full-reference calibration curves found") columns = ["sample_id", "hla", "hit"] + [ side + "_presentation_" + field for side in ("a", "b") for field in ("score", "percentile")] print("Reading frozen", args.mode, "prediction columns", flush=True) frame = pd.read_csv(args.predictions, usecols=columns, low_memory=False) if frame[columns].isna().any().any(): raise ValueError("Evaluation table has missing values") labels = frame.hit.to_numpy(dtype=np.int8) raw = frame.a_presentation_score.to_numpy() groups = list(frame.groupby(["sample_id", "hla"], sort=False).indices.items()) group_id = np.empty(len(frame), dtype=np.int32) group_records = [] for index, ((sample_id, hla), rows) in enumerate(groups): group_id[rows] = index group_records.append(dict(group_id=index, sample_id=str(sample_id), hla=str(hla), rows=len(rows), hits=int(labels[rows].sum()))) pd.DataFrame(group_records).to_csv(out / "groups.csv", index=False) print("Loaded", len(frame), "rows;", len(groups), "groups", flush=True) variants = dict(candidate_raw=raw, candidate_saved=-frame.a_presentation_percentile.to_numpy(), public_raw=frame.b_presentation_score.to_numpy(), public_saved=-frame.b_presentation_percentile.to_numpy()) timings, audits = [], [] raw_order = np.argsort(raw, kind="stable") raw_sorted = raw[raw_order] different = np.diff(raw_sorted) != 0 raw_unique = int(np.count_nonzero(different) + 1) for name, model in methods.items(): durations = [] for _ in range(3): before = time.perf_counter() mapped = percentiles(model, raw) durations.append(time.perf_counter() - before) variants[name] = -mapped diffs = np.diff(mapped[raw_order]) bounds = (model.reference_bounds if isinstance(model, CompactPresentationPercentiles) else model.bin_edges[[0, -1]]) audits.append(dict(method=name, raw_unique=raw_unique, percentile_unique=int(np.unique(mapped).size), distinct_adjacent_raw_pairs_tied=int(np.count_nonzero(different & (diffs == 0))), inversions=int(np.count_nonzero(diffs > 0)), below_reference=int(np.count_nonzero(raw < bounds[0])), above_reference=int(np.count_nonzero(raw > bounds[1])), zero_percentiles=int(np.count_nonzero(mapped == 0)), full_percentiles=int(np.count_nonzero(mapped == 100)))) timings.append(dict(method=name, rows=len(raw), median_seconds=float(np.median(durations)), seconds_1=durations[0], seconds_2=durations[1], seconds_3=durations[2])) pd.DataFrame(timings).to_csv(out / "timings.csv", index=False) pd.DataFrame(audits).to_csv(out / "ranking_audit.csv", index=False) records = [] for name, scores in variants.items(): records.append(dict(method=name, scope="micro", sample_id="all", hla="all", **ranking_metrics(labels, scores))) for (sample_id, hla), rows in groups: records.append(dict(method=name, scope="sample", sample_id=str(sample_id), hla=str(hla), **ranking_metrics(labels[rows], scores[rows]))) print(args.mode, name, "metrics evaluated", flush=True) results = pd.DataFrame(records) results.to_csv(out / "metrics.csv", index=False) macro = results.loc[results.scope == "sample"].groupby("method")[METRICS].mean() macro.to_csv(out / "macro.csv") np.savez_compressed(out / "evaluation_scores.npz", source_row=np.arange(len(frame)), hit=labels, group_id=group_id, **variants) write_json(out / "provenance.json", dict( command=sys.argv, prediction_source=str(Path(args.predictions).resolve()), prediction_sha256=sha256(args.predictions), rows=len(frame), hits=int(labels.sum()), groups=len(groups), selection=json.loads((root / "selection.json").read_text()), elapsed_seconds=time.perf_counter() - started, source_sha256=sha256(__file__), score_convention="All saved score variants are higher-is-better; percentile variants are negated.", model_hashes={str(path): sha256(path) for path in (root / "full_fit").glob("*")})) print(macro.to_string(), flush=True) def plot_command(args): import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt root = Path(args.calibration_dir) selection = json.loads((root / "selection.json").read_text()) selected = selection["selected"] accuracy = pd.read_csv(root / "calibration_accuracy.csv") sizes = pd.read_csv(root / "model_sizes.csv") plt.rcParams.update({"font.size": 10, "axes.spines.top": False, "axes.spines.right": False}) fig, axes = plt.subplots(1, 2, figsize=(12, 5), constrained_layout=True) for ax, split in zip(axes, ["validation", "test"]): for method, group in accuracy.loc[accuracy.split == split].groupby("method", sort=False): ax.loglog(group.cutoff, group.smoothed_percent, marker="o", markersize=3, linewidth=2.5 if method == selected else 1, label=method) ax.plot([.001, 90], [.001, 90], "--", color="black", linewidth=1, label="ideal") ax.axvspan(.001, .03, color="grey", alpha=.08) ax.set(xlabel="Predicted percentile cutoff (%)", ylabel="Observed background mass (%)", title=split.capitalize() + " background peptides") ax.grid(alpha=.2) axes[1].legend(fontsize=8) fig.suptitle("Compact percentile calibration: peptide-grouped 60/20/20 split\n" "Shaded rare tail is descriptive; counts use +0.5 smoothing only for log plotting") for suffix in ("png", "svg"): fig.savefig(root / ("background_calibration." + suffix), dpi=180) plt.close(fig) modes = [mode for mode in ["with-flanks", "without-flanks"] if (root / mode / "macro.csv").exists()] if not modes: return fig, axes = plt.subplots(len(modes), 3, figsize=(15, 4.2 * len(modes)), squeeze=False, constrained_layout=True) tables = [] for row, mode in enumerate(modes): table = pd.read_csv(root / mode / "macro.csv", index_col="method") group_count = len(pd.read_csv(root / mode / "groups.csv")) order = ["public_raw", "public_saved", "candidate_raw", "candidate_saved", "uniform_step", "tail_step"] + sorted([name for name in table.index if name.startswith("compact_")], key=lambda name: int(name.split("_")[-1])) table = table.loc[order] tables.append((mode, table)) colors = ["#00876c" if name == selected else "#4c78a8" if name.startswith("compact_") else "#999999" for name in order] for ax, metric in zip(axes[row], METRICS): ax.barh(order, table[metric], color=colors) ax.invert_yaxis() ax.axvline(table.loc["candidate_raw", metric], color="black", linestyle="--", linewidth=1) title = {"auprc": "AUPRC", "auroc": "AUROC", "ppv_expected_random_ties": "PPV@N (tie-neutral)"}[metric] ax.set(title=mode + ": " + title, xlabel="Macro metric (%d sample/HLA groups)" % group_count) for index, value in enumerate(table[metric]): ax.text(value, index, " %.6f" % value, va="center", fontsize=8) ax.set_xlim(0, table[metric].max() * 1.17) fig.suptitle("Frozen presentation predictions; dashed line = candidate raw ranking\n" "Green = selected using background validation only; PPV@N is tie-neutral") for suffix in ("png", "svg"): fig.savefig(root / ("presentation_metrics." + suffix), dpi=180) plt.close(fig) fig, axes = plt.subplots(1, 2, figsize=(11, 4.5), constrained_layout=True) full_sizes = sizes.loc[sizes.fit == "full"].set_index("method") for mode in modes: timing = pd.read_csv(root / mode / "timings.csv").set_index("method").loc[full_sizes.index] axes[1].plot(timing.index, timing.median_seconds * 1000 / timing.rows * 1e6, "o-", label=mode) axes[0].bar(full_sizes.index, full_sizes.coordinate_bytes / 1024) axes[0].set(yscale="log", ylabel="Numeric coordinate storage (KiB)", title="Fixed calibration size") axes[1].set(ylabel="Milliseconds per million scores", title="Mapping only; median of 3 calls\nLocal timing, concurrent test workload") axes[1].legend() for ax in axes: ax.tick_params(axis="x", rotation=30) for suffix in ("png", "svg"): fig.savefig(root / ("size_and_runtime." + suffix), dpi=180) plt.close(fig) lines = ["# Compact presentation-percentile comparison", "", "Selected without presentation labels: **%s**." % selected, "", "## Calibration selection", "", "Validation RMS log10 cutoff error:", ""] lines.extend("- %s: %.6f" % (name, value) for name, value in selection["validation_rms_log10_error"].items()) lines.extend(["", "Selection uses cutoffs 0.03–10%; the smallest model within the predefined", "tolerance of the best validation error is retained. Test background peptides", "were not used for fitting or selection. All allele scores for a peptide stay", "in one split. Full-reference refits are used below.", ""]) for mode, table in tables: lines.extend(["## " + mode, "", "| Method | Macro AUPRC | Macro AUROC | Macro PPV@N |", "|---|---:|---:|---:|"]) lines.extend("| %s | %.6f | %.6f | %.6f |" % (name, *values) for name, values in table[METRICS].iterrows()) lines.append("") lines.extend(["## Interpretation and limits", "", "These methods approximate background percentiles, not probabilities of presentation.", "No networks were retrained and no saved candidate/public calibration was changed.", "The paired uniform/tail/compact comparison uses the same 400,000 cached scores.", "Existing candidate/public percentile baselines have different calibration references.", "The cached reference uses uniform amino acids, lengths 8–15, and eight single-allele", "queries; it is not the original release calibration policy. With-flank evaluation", "reuses this no-flank reference, as in the preceding controlled binning comparison.", "Tail extrapolation is an explicit model assumption; scores outside reference support", "are counted in ranking_audit.csv. Logit interpolation cannot undo pre-existing raw", "score ties or eliminate all floating-point saturation. Ranking preservation and", "absolute percentile accuracy are distinct gates; neither implies release readiness.", "All evaluation score arrays are higher-is-better (percentiles are negated), include", "source-row indices, labels and group IDs, and join to the hashed original CSV.", "Per-sample/micro metrics, calibration counts, serialized curves, and timing repetitions", "are preserved alongside PNG/SVG figures. PPV uses expected hits within cutoff ties.", ""]) (root / "REPORT.md").write_text("\n".join(lines)) plot_inputs = [root / "selection.json", root / "calibration_accuracy.csv", root / "model_sizes.csv"] plot_inputs.extend(root / mode / name for mode in modes for name in ("macro.csv", "timings.csv", "groups.csv")) write_json(root / "plot_provenance.json", dict( command=sys.argv, script_sha256=sha256(__file__), matplotlib_version=matplotlib.__version__, input_hashes={str(path): sha256(path) for path in plot_inputs}, notes="Plot-only refinements follow the numerical comparison; its original source is archived.")) def main(): parser = argparse.ArgumentParser(description=__doc__) commands = parser.add_subparsers(dest="command", required=True) fit = commands.add_parser("fit", help="Fit and select using background scores only") fit.add_argument("--reference-dir", required=True) fit.add_argument("--out", required=True) fit.add_argument("--seed", type=int, default=403) fit.add_argument("--knots", nargs="+", type=int, default=[64, 128, 256]) fit.set_defaults(function=fit_command) evaluate = commands.add_parser("evaluate", help="Score frozen presentation predictions") evaluate.add_argument("--calibration-dir", required=True) evaluate.add_argument("--predictions", required=True) evaluate.add_argument("--mode", required=True, choices=["with-flanks", "without-flanks"]) evaluate.set_defaults(function=evaluate_command) plot = commands.add_parser("plot", help="Generate report and paper-ready figures") plot.add_argument("--calibration-dir", required=True) plot.set_defaults(function=plot_command) args = parser.parse_args() args.function(args) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/compose_processing_ensemble.py000066400000000000000000000076341525677230600252130ustar00rootroot00000000000000#!/usr/bin/env python3 """Compose a processing ensemble from complete predictor directories.""" import argparse import hashlib import json import os from pathlib import Path from mhcflurry import Class1ProcessingPredictor def sha256_file(path): """Return the SHA256 digest of a file.""" digest = hashlib.sha256() with open(path, "rb") as fd: for block in iter(lambda: fd.read(8 * 1024 * 1024), b""): digest.update(block) return digest.hexdigest() def fingerprint_directory(path): """Hash prediction-relevant files in a predictor directory.""" path = Path(path).resolve() digest = hashlib.sha256() count = 0 for item in sorted(path.rglob("*")): if not item.is_file() or item.name.endswith("train_data.csv.bz2"): continue relative = item.relative_to(path).as_posix() digest.update(relative.encode("utf-8")) digest.update(b"\0") digest.update(sha256_file(item).encode("ascii")) digest.update(b"\0") count += 1 return {"sha256": digest.hexdigest(), "files": count} def parse_predictor(value): """Parse a LABEL=PATH predictor specification.""" try: label, path = value.split("=", 1) except ValueError as error: raise argparse.ArgumentTypeError( "predictors must have the form LABEL=PATH" ) from error if not label or not path: raise argparse.ArgumentTypeError("predictor label and path must be nonempty") return label, path def parse_args(argv=None): parser = argparse.ArgumentParser( prog=os.environ.get("MHCFLURRY_CLI_PROG"), description=__doc__) parser.add_argument( "--predictor", action="append", type=parse_predictor, required=True ) parser.add_argument("--require-equal-counts", action="store_true") parser.add_argument("--out", required=True) return parser.parse_args(argv) def run(args): out = Path(args.out).resolve() if out.exists(): raise ValueError("Output already exists: %s" % out) loaded = [] sources = [] for label, raw_path in args.predictor: path = Path(raw_path).resolve() predictor = Class1ProcessingPredictor.load(str(path)) loaded.append(predictor) sources.append( { "label": label, "path": str(path), "models": int(len(predictor.models)), "fingerprint": fingerprint_directory(path), } ) counts = [len(predictor.models) for predictor in loaded] if args.require_equal_counts and len(set(counts)) != 1: raise ValueError("Predictor model counts differ: %s" % counts) result = Class1ProcessingPredictor( models=[model for predictor in loaded for model in predictor.models], provenance_string="fixed ensemble: %s" % ", ".join( source["label"] for source in sources ), ) out.parent.mkdir(parents=True, exist_ok=True) result.save(str(out)) reloaded = Class1ProcessingPredictor.load(str(out)) if len(reloaded.models) != sum(counts): raise RuntimeError("Reloaded ensemble has the wrong model count") provenance = { "format": 1, "averaging": "equal weight per network", "sources": sources, "assembled_predictor": { "path": str(out), "models": int(len(reloaded.models)), "source_model_counts": counts, "effective_source_weights": [ float(count) / sum(counts) for count in counts ], "fingerprint": fingerprint_directory(out), }, } with open(out / "ensemble_provenance.json", "w") as fd: json.dump(provenance, fd, indent=2, sort_keys=True) fd.write("\n") print(json.dumps(provenance["assembled_predictor"], sort_keys=True)) def main(argv=None): run(parse_args(argv)) return 0 if __name__ == "__main__": raise SystemExit(main()) mhcflurry-2.3.6/scripts/training/evaluate_affinity_factorial_public.sh000066400000000000000000000245221525677230600264760ustar00rootroot00000000000000#!/usr/bin/env bash # Compare every trained affinity-factorial condition directly to public weights. set -euo pipefail usage() { cat <<'EOF' Usage: evaluate_affinity_factorial_public.sh [OPTIONS] Required: --factorial-dir PATH Completed or partially completed factorial --public-affinity-dir PATH Official models.no_additional_ms predictor --data-eval-dir PATH Evaluation data directory --release-holdout-dir PATH Frozen release-holdout manifests --analysis-source-commit COMMIT Exact comparison-code commit Optional: --external-predictions FILE Benchmark-aligned NetMHCpan/MixMHCpred table for combined candidate figures --public-label LABEL Report label (default: public-no-additional-ms) --gpus INTEGER|auto GPU count (default: auto) --max-workers-per-gpu INTEGER|auto Worker density (default: auto) --max-tasks-per-worker INTEGER Worker recycling interval (default: 12) --torch-compile VALUE auto, 0, or 1 (default: 0) --matmul-precision VALUE none, highest, high, or medium (default: highest) -h, --help Show this help EOF } require_value() { if [ "$#" -lt 2 ] || [ -z "$2" ]; then printf 'Missing value for %s\n' "$1" >&2 usage >&2 exit 2 fi } FACTORIAL_DIR="" PUBLIC_AFFINITY_DIR="" DATA_EVAL_DIR="" RELEASE_HOLDOUT_DIR="" ANALYSIS_SOURCE_COMMIT="" EXTERNAL_PREDICTIONS="" PUBLIC_LABEL="public-no-additional-ms" GPUS="auto" MAX_WORKERS_PER_GPU="auto" MAX_TASKS_PER_WORKER=12 TORCH_COMPILE=0 MATMUL_PRECISION="highest" while [ "$#" -gt 0 ]; do case "$1" in --factorial-dir) require_value "$@"; FACTORIAL_DIR="$2"; shift 2 ;; --public-affinity-dir) require_value "$@"; PUBLIC_AFFINITY_DIR="$2"; shift 2 ;; --data-eval-dir) require_value "$@"; DATA_EVAL_DIR="$2"; shift 2 ;; --release-holdout-dir) require_value "$@"; RELEASE_HOLDOUT_DIR="$2"; shift 2 ;; --analysis-source-commit) require_value "$@"; ANALYSIS_SOURCE_COMMIT="$2"; shift 2 ;; --external-predictions) require_value "$@"; EXTERNAL_PREDICTIONS="$2"; shift 2 ;; --public-label) require_value "$@"; PUBLIC_LABEL="$2"; shift 2 ;; --gpus) require_value "$@"; GPUS="$2"; shift 2 ;; --max-workers-per-gpu) require_value "$@"; MAX_WORKERS_PER_GPU="$2"; shift 2 ;; --max-tasks-per-worker) require_value "$@"; MAX_TASKS_PER_WORKER="$2"; shift 2 ;; --torch-compile) require_value "$@"; TORCH_COMPILE="$2"; shift 2 ;; --matmul-precision) require_value "$@"; MATMUL_PRECISION="$2"; shift 2 ;; -h|--help) usage; exit 0 ;; *) printf 'Unknown argument: %s\n' "$1" >&2 usage >&2 exit 2 ;; esac done if [ -n "$EXTERNAL_PREDICTIONS" ] && [ ! -f "$EXTERNAL_PREDICTIONS" ]; then printf 'External predictions file does not exist: %s\n' \ "$EXTERNAL_PREDICTIONS" >&2 exit 2 fi for required in \ FACTORIAL_DIR PUBLIC_AFFINITY_DIR DATA_EVAL_DIR \ RELEASE_HOLDOUT_DIR ANALYSIS_SOURCE_COMMIT; do if [ -z "${!required}" ]; then printf 'Missing required argument for %s\n' "$required" >&2 usage >&2 exit 2 fi done for directory in \ "$FACTORIAL_DIR" "$PUBLIC_AFFINITY_DIR" \ "$DATA_EVAL_DIR" "$RELEASE_HOLDOUT_DIR"; do if [ ! -d "$directory" ]; then printf 'Not a directory: %s\n' "$directory" >&2 exit 2 fi done for required_file in \ "$FACTORIAL_DIR/manifest.json" \ "$FACTORIAL_DIR/manifest.csv" \ "$PUBLIC_AFFINITY_DIR/manifest.csv" \ "$PUBLIC_AFFINITY_DIR/train_data.csv.bz2" \ "$RELEASE_HOLDOUT_DIR/policy.json" \ "$RELEASE_HOLDOUT_DIR/affinity_samples.csv" \ "$RELEASE_HOLDOUT_DIR/affinity_pmhcs.csv"; do if [ ! -f "$required_file" ]; then printf 'Missing required file: %s\n' "$required_file" >&2 exit 2 fi done case "$TORCH_COMPILE" in auto|0|1) ;; *) printf 'Invalid --torch-compile: %s\n' "$TORCH_COMPILE" >&2; exit 2 ;; esac case "$MATMUL_PRECISION" in none|highest|high|medium) ;; *) printf 'Invalid --matmul-precision: %s\n' "$MATMUL_PRECISION" >&2; exit 2 ;; esac if [ "$GPUS" = "auto" ]; then if command -v nvidia-smi >/dev/null 2>&1; then GPUS="$(nvidia-smi -L | wc -l | tr -d ' ')" else GPUS=0 fi fi SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BASELINE_CONDITION="$(python -c \ 'import json,sys; print(json.load(open(sys.argv[1]))["baseline_condition"])' \ "$FACTORIAL_DIR/manifest.json")" PROVENANCE="$FACTORIAL_DIR/public_comparison_provenance.txt" { printf '%s\n' \ "schema_version=1" \ "analysis_source_commit=$ANALYSIS_SOURCE_COMMIT" \ "public_affinity_dir=$PUBLIC_AFFINITY_DIR" \ "public_label=$PUBLIC_LABEL" \ "affinity_source=no_additional_ms" \ "affinity_training_overlap_policy=exclude" sha256sum \ "$FACTORIAL_DIR/manifest.json" \ "$RELEASE_HOLDOUT_DIR/policy.json" \ "$RELEASE_HOLDOUT_DIR/affinity_samples.csv" \ "$RELEASE_HOLDOUT_DIR/affinity_pmhcs.csv" while IFS= read -r public_file; do sha256sum "$public_file" done < <(find "$PUBLIC_AFFINITY_DIR" -maxdepth 1 -type f | sort) if [ -n "$EXTERNAL_PREDICTIONS" ]; then sha256sum "$EXTERNAL_PREDICTIONS" if [ -f "$EXTERNAL_PREDICTIONS.provenance.json" ]; then sha256sum "$EXTERNAL_PREDICTIONS.provenance.json" fi fi } > "$PROVENANCE" conditions=("$BASELINE_CONDITION") while IFS= read -r condition; do if [ "$condition" != "$BASELINE_CONDITION" ] && \ [ -f "$FACTORIAL_DIR/$condition/predictor_path.txt" ]; then conditions+=("$condition") fi done < <(tail -n +2 "$FACTORIAL_DIR/manifest.csv" | cut -d, -f1) public_predictions="" for condition in "${conditions[@]}"; do condition_out="$FACTORIAL_DIR/$condition" predictor_path_file="$condition_out/predictor_path.txt" if [ ! -f "$predictor_path_file" ]; then continue fi predictor="$(cat "$predictor_path_file")" if [ ! -d "$predictor" ]; then printf 'Predictor path is not a directory for %s: %s\n' \ "$condition" "$predictor" >&2 exit 2 fi unselected="$condition_out/models.unselected.combined" if [ ! -f "$condition_out/.loss-plots.done" ]; then loss_plot_args=( --selected-dir "$predictor" --out "$condition_out/loss_plots" ) if [ "$predictor" != "$unselected" ]; then loss_plot_args+=(--unselected-dir "$unselected") fi mhcflurry train plot-loss-curves "${loss_plot_args[@]}" date -u +%Y-%m-%dT%H:%M:%SZ \ > "$condition_out/.loss-plots.done" fi if [ "$condition" = "$BASELINE_CONDITION" ]; then comparison="$FACTORIAL_DIR/baseline-vs-public-no-additional-ms" else comparison="$condition_out/comparison-vs-public-no-additional-ms" fi if [ ! -f "$comparison/.done" ]; then mkdir -p "$comparison" reuse_public_args=() if [ "$condition" != "$BASELINE_CONDITION" ]; then if [ ! -f "$public_predictions" ]; then printf 'Reusable public predictions are missing: %s\n' \ "$public_predictions" >&2 exit 2 fi reuse_public_args=( --b-affinity-predictions "$public_predictions" --b-affinity-prediction-column b_pred ) fi mhcflurry eval compare-models \ --a "$predictor" \ --a-label "$condition" \ --b public \ --b-label "$PUBLIC_LABEL" \ --b-affinity-dir "$PUBLIC_AFFINITY_DIR" \ --data-dir "$DATA_EVAL_DIR" \ --release-holdout-dir "$RELEASE_HOLDOUT_DIR" \ --affinity-source no_additional_ms \ --affinity-training-overlap-policy exclude \ "${reuse_public_args[@]}" \ --include affinity \ --out "$comparison" \ --num-jobs auto \ --gpus "$GPUS" \ --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" \ --max-tasks-per-worker "$MAX_TASKS_PER_WORKER" \ --torch-compile "$TORCH_COMPILE" \ --matmul-precision "$MATMUL_PRECISION" \ 2>&1 | tee "$comparison/eval.log" date -u +%Y-%m-%dT%H:%M:%SZ > "$comparison/.done" fi if [ "$condition" = "$BASELINE_CONDITION" ]; then public_predictions="$comparison/affinity/predictions.csv.bz2" if [ ! -f "$public_predictions" ]; then printf 'Baseline comparison did not save public predictions: %s\n' \ "$public_predictions" >&2 exit 2 fi fi if [ ! -f "$comparison/.plots.done" ]; then mhcflurry plot-model-comparison \ --input "$comparison" \ --components affinity \ --summary-pdf "$comparison/plots/model_comparison_figures.pdf" date -u +%Y-%m-%dT%H:%M:%SZ > "$comparison/.plots.done" fi printf 'Verified direct public comparison: %s\n' "$condition" done python "$SCRIPT_DIR/summarize_affinity_factorial.py" \ "$FACTORIAL_DIR" > "$FACTORIAL_DIR/summary.stdout.json" candidate_figure_out="$FACTORIAL_DIR/candidate_figures-vs-public-2.2" if [ ! -f "$candidate_figure_out/.done" ]; then candidate_figure_args=() for condition in "${conditions[@]}"; do candidate_figure_args+=(--condition "$condition") done if [ "${#candidate_figure_args[@]}" -eq 0 ]; then printf 'No trained predictor paths were available for figures.\n' >&2 exit 2 fi if [ -n "$EXTERNAL_PREDICTIONS" ]; then candidate_figure_args+=( --external-predictions "$EXTERNAL_PREDICTIONS" ) fi mhcflurry eval affinity-candidate-figures \ --factorial-dir "$FACTORIAL_DIR" \ --out "$candidate_figure_out" \ --public-predictor-name mhcflurry_public_2_2 \ "${candidate_figure_args[@]}" date -u +%Y-%m-%dT%H:%M:%SZ > "$candidate_figure_out/.done" fi date -u +%Y-%m-%dT%H:%M:%SZ \ > "$FACTORIAL_DIR/public_comparisons.completed_at_utc.txt" mhcflurry-2.3.6/scripts/training/evaluate_processing_fold_ensembles.py000066400000000000000000000215241525677230600265350ustar00rootroot00000000000000"""Score specified ensembles within shared held-out folds from cached predictions. This is development evaluation of fold-specific ensembles, not final model selection or an estimate for one ensemble combining members across folds. """ import argparse import json import os from pathlib import Path import shutil import numpy import pandas from mhcflurry.cli.compare_models import _metrics from mhcflurry.experiment_archive import sha256_file KEYS = ["fold_num", "validation_row_index"] SCORE_COLUMNS = ["condition", "model_name", "checkpoint_policy", "processing_score"] SCOPE = "per-member held-out fold, retained best and terminal states" RANKING_SCOPE = "per-member held-out fold, retained best-loss, best-AP and terminal states" def load_predictions(path, policies): """Verify a checkpoint cache and its exact row identity across states.""" marker_path = path.with_name(path.name + ".json") marker = json.loads(marker_path.read_text()) identity = marker["identity"] if marker["prediction_sha256"] != sha256_file(path) or identity.get("scope") not in (SCOPE, RANKING_SCOPE): raise ValueError("Changed checkpoint cache or incompatible prediction scope") frame = pandas.read_csv(path, dtype={"sample_id": str}, float_precision="round_trip") required = KEYS + SCORE_COLUMNS + ["sample_id", "hit", "peptide", "n_flank", "c_flank", "risk_set_id"] if set(required) - set(frame) or frame.empty: raise ValueError("Missing identified checkpoint predictions") if set(frame.condition) != {identity["condition"]}: raise ValueError("Checkpoint condition differs from its marker") if (frame[KEYS + ["sample_id", "model_name", "checkpoint_policy"]].isna().any().any() or frame.duplicated(KEYS + ["checkpoint_policy"]).any() or not numpy.isfinite(frame.processing_score).all() or not frame.hit.isin([0, 1]).all()): raise ValueError("Require unique finite held-out predictions and binary labels") if not frame.groupby("fold_num").model_name.nunique().eq(1).all(): raise ValueError("Require exactly one member per condition and fold") mapping = frame[["fold_num", "model_name"]].drop_duplicates() if mapping.model_name.duplicated().any(): raise ValueError("A model cannot represent multiple held-out folds") values, reference = {}, None for policy in policies: selected = frame.loc[frame.checkpoint_policy == policy].set_index(KEYS).sort_index() if selected.empty: raise ValueError("Missing requested checkpoint policy: " + policy) metadata = selected.drop(columns=SCORE_COLUMNS) if reference is None: reference = metadata elif not reference.equals(metadata): raise ValueError("Checkpoint states do not share identical held-out rows") values[policy] = selected.processing_score.to_numpy(dtype="float32") fingerprint = {"path": str(path.resolve()), "sha256": marker["prediction_sha256"], "marker_sha256": sha256_file(marker_path), "identity": identity} return reference, values, mapping, fingerprint def score_ensembles(definitions, base, policies): """Average only row-aligned, same-fold members and preserve every score.""" if not definitions or not policies or len(set(policies)) != len(policies): raise ValueError("Require ensembles and distinct checkpoint policies") reference, training_hash = None, None scores, members, inputs = {}, [], [] for name, paths in definitions.items(): if not name or not paths: raise ValueError("Require nonempty ensemble names and members") sums = {} seen_conditions, seen_models = set(), set() for index, filename in enumerate(paths): path = (base / filename).resolve() print("Verifying %s member %d/%d: %s" % (name, index + 1, len(paths), path.name), flush=True) metadata, values, mapping, fingerprint = load_predictions(path, policies) current_hash = fingerprint["identity"].get("training_data_sha256") if not current_hash: raise ValueError("Missing training-table identity") if reference is None: reference, training_hash = metadata, current_hash elif training_hash != current_hash or not reference.equals(metadata): raise ValueError("Members do not share frozen data and identical held-out fold rows") condition = fingerprint["identity"]["condition"] if condition in seen_conditions or set(mapping.model_name) & seen_models: raise ValueError("Duplicate ensemble member") seen_conditions.add(condition) seen_models.update(mapping.model_name) for row in mapping.itertuples(index=False): members.append({"ensemble": name, "member_index": index, "condition": condition, "fold_num": row.fold_num, "model_name": row.model_name}) for policy in policies: if policy not in sums: sums[policy] = numpy.zeros(len(metadata), dtype="float32") sums[policy] += values[policy] inputs.append(fingerprint) for policy, total in sums.items(): column = name + "__" + policy if column in reference.columns or column in scores: raise ValueError("Generated score name collision") scores[column] = total / numpy.float32(len(paths)) result = reference.reset_index() for column, values in scores.items(): result[column] = values rows, micro = [], [] for name in scores: for (fold, sample), group in result.groupby(["fold_num", "sample_id"]): rows.append({"condition": name, "fold_num": fold, "sample_id": sample, **_metrics(group.hit, group[name])}) for fold, group in result.groupby("fold_num"): micro.append({"condition": name, "fold_num": fold, **_metrics(group.hit, group[name])}) per_sample = pandas.DataFrame(rows) metrics = ["roc_auc", "pr_auc", "ppv_at_n", "n", "n_pos"] sample_means = per_sample.groupby(["condition", "sample_id"], as_index=False)[metrics].mean() summary = sample_means.groupby("condition")[metrics[:3]].mean().add_prefix("macro_").reset_index() return result, pandas.DataFrame(members), per_sample, sample_means, pandas.DataFrame(micro), summary, inputs def main(argv=None): parser = argparse.ArgumentParser(prog=os.environ.get("MHCFLURRY_CLI_PROG"), description=__doc__) parser.add_argument("--ensembles", required=True, type=Path, help="JSON object mapping ensemble names to ordered checkpoint-cache paths, relative to this JSON.") parser.add_argument("--checkpoint-policy", nargs="+", choices=["best", "best_ap", "terminal"], default=["best", "terminal"]) parser.add_argument("--out", required=True, type=Path) args = parser.parse_args(argv) if args.out.exists(): raise ValueError("Use a fresh output directory") definitions = json.loads(args.ensembles.read_text()) result, members, metrics, sample_means, micro, summary, inputs = score_ensembles( definitions, args.ensembles.parent, args.checkpoint_policy) args.out.mkdir(parents=True) for name, frame in [("members", members), ("per_fold_sample_metrics", metrics), ("sample_means", sample_means), ("micro_by_fold", micro), ("summary", summary)]: frame.to_csv(args.out / (name + ".csv"), index=False) print(summary.to_string(index=False), flush=True) print("Writing %d joinable prediction rows with gzip level 1" % len(result), flush=True) temporary = args.out / "fold_ensemble_predictions.tmp.gz" result.to_csv(temporary, index=False, compression={"method": "gzip", "compresslevel": 1, "mtime": 0}) temporary.replace(args.out / "fold_ensemble_predictions.csv.gz") shutil.copyfile(__file__, args.out / "analysis_source.py") provenance = { "arguments": {key: str(value) if isinstance(value, Path) else value for key, value in vars(args).items()}, "definitions": definitions, "definitions_sha256": sha256_file(args.ensembles), "inputs": inputs, "arithmetic": "Sequential float32 summation in specified member order, then float32 division.", "scope": "Each evaluated row uses only that fold's models; average fold metrics within sample, then macro over samples.", "limitations": "Exploratory development diagnostic of fold-specific ensembles, not one fixed ensemble across folds; no selection or release acceptance.", "training": False, "inference": False, "release_accepted": False, "outputs": [{"path": path.name, "sha256": sha256_file(path)} for path in sorted(args.out.iterdir())], } (args.out / "provenance.json").write_text(json.dumps(provenance, indent=2) + "\n") return 0 if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/evaluate_processing_subsets.py000066400000000000000000000332341525677230600252450ustar00rootroot00000000000000#!/usr/bin/env python3 """Evaluate every fixed-size subset of a processing ensemble, without selection.""" import argparse import itertools import json import math import os from pathlib import Path import numpy import pandas from mhcflurry.cli.processing_affinity_control import ( AFFINITY_COLUMN, IDENTITY_COLUMNS, score_risk_sets, summarize_metrics, ) from mhcflurry.common import configure_pytorch from mhcflurry.experiment_archive import sha256_file from mhcflurry.processing_matching import MATCHING_POLICY, validate_matching_assignments def unique_inputs(frame): """Return one verified peptide/flank identity per original source row.""" result = frame[["source_row", *IDENTITY_COLUMNS]].copy() for column in ("n_flank", "c_flank"): result[column] = result[column].fillna("") if result.isna().any().any() or result.empty: raise ValueError("Require nonempty identified source rows") rows = pandas.to_numeric(result.source_row, errors="raise") if not (numpy.isfinite(rows) & (rows >= 0) & (rows == numpy.floor(rows))).all(): raise ValueError("source_row must contain nonnegative integers") result["source_row"] = rows.astype("int64") result = result.drop_duplicates() if result.source_row.duplicated().any(): raise ValueError("Inconsistent identities for repeated source_row") return result.sort_values("source_row").reset_index(drop=True) def subsets(model_count, size, max_subsets=10000): """Enumerate all combinations independently of labels and predictions.""" if not 1 <= size <= model_count: raise ValueError("Subset size must be between one and the model count") count = math.comb(model_count, size) if count > max_subsets: raise ValueError("Requested %d subsets exceeds limit %d" % (count, max_subsets)) return list(itertools.combinations(range(model_count), size)) def subset_distribution(summary, names): """Summarize composition sensitivity; these are not sampling intervals.""" selected = summary.set_index("score").loc[names] metrics = ["roc_auc", "pr_auc", "ppv_at_n", "macro_roc_auc", "macro_pr_auc", "macro_ppv_at_n"] records = [] for metric in metrics: values = selected[metric] records.append({"metric": metric, "subsets": len(values), "mean": values.mean(), "median": values.median(), "min": values.min(), "max": values.max(), "q25": values.quantile(0.25), "q75": values.quantile(0.75)}) return pandas.DataFrame(records) def plot_subset_distribution(summary, names, comparisons, out): """Plot composition sensitivity and fixed comparisons, not significance.""" import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt from matplotlib.ticker import MaxNLocator, FormatStrFormatter table = summary.set_index("score") metrics = [("macro_roc_auc", "Macro AUROC"), ("macro_pr_auc", "Macro AUPRC"), ("macro_ppv_at_n", "Macro PPV@N")] colors = ["#262626", "#2166ac", "#c65d16", "#597b39"] fig, axes = plt.subplots(1, 3, figsize=(12, 3.8), layout="constrained") for ax, (metric, label) in zip(axes, metrics): ax.hist(table.loc[names, metric], bins=12, color="#c8d2de", edgecolor="white", label="All %d subsets" % len(names)) for index, comparison in enumerate(comparisons): ax.axvline(table.loc[comparison, metric], color=colors[index % len(colors)], linewidth=2, linestyle="--" if index == 0 else "-", label=comparison.replace("_", " ")) ax.set_xlabel(label) ax.set_ylabel("Number of subsets") ax.xaxis.set_major_locator(MaxNLocator(4)) ax.xaxis.set_major_formatter(FormatStrFormatter("%.3f")) ax.spines[["top", "right"]].set_visible(False) axes[0].legend(fontsize=8, loc="upper left") fig.suptitle("Every fixed-size subset; no held-out selection", fontsize=13) for extension in ("png", "svg"): fig.savefig(Path(out) / ("subset_distribution." + extension), dpi=180) plt.close(fig) def make_parser(): """Build the source-checkout experiment command.""" parser = argparse.ArgumentParser( prog=os.environ.get("MHCFLURRY_CLI_PROG"), description=__doc__) parser.add_argument("--input", required=True, type=Path, help="Strict processing-affinity-control matched_predictions table.") parser.add_argument("--models-dir", required=True, type=Path) parser.add_argument("--subset-size", type=int, default=4) parser.add_argument("--max-subsets", type=int, default=10000) parser.add_argument("--reference-score", required=True, help="Cached full-ensemble score to verify before subset evaluation.") parser.add_argument("--comparison-score", action="append", default=[]) parser.add_argument("--verification-atol", type=float, default=1e-5) parser.add_argument("--member-cache-dir", type=Path, help="Reuse fingerprinted member predictions from a prior run.") parser.add_argument("--out", required=True, type=Path) parser.add_argument("--backend", choices=("cpu", "mps", "gpu"), default="cpu") parser.add_argument("--threads", type=int, default=4) parser.add_argument("--batch-size", type=int, default=4096) return parser def run(args): """Cache member predictions, verify full scores, and score every subset.""" if args.out.exists(): raise ValueError("Use a fresh output directory to preserve previous results") if args.threads < 1 or args.batch_size < 1 or args.max_subsets < 1: raise ValueError("Threads, batch size and subset limit must be positive") if not numpy.isfinite(args.verification_atol) or args.verification_atol < 0: raise ValueError("Verification tolerance must be finite and nonnegative") frame = pandas.read_csv(args.input, dtype={"sample_id": str}) counts = frame.groupby(["sample_id", "risk_set_id"]).size() - 1 if counts.empty or counts.nunique() != 1: raise ValueError("Require a common positive decoys-per-hit count") validate_matching_assignments(frame, AFFINITY_COLUMN, int(counts.iloc[0])) # Derive this rather than trusting a stale auxiliary column in a cache. frame["peptide_len"] = frame.peptide.str.len() unique = unique_inputs(frame) comparisons = list(dict.fromkeys([args.reference_score] + args.comparison_score)) for column in comparisons: if column not in frame or not numpy.isfinite(frame[column]).all(): raise ValueError("Missing or nonfinite comparison score: %s" % column) manifest_path = args.models_dir / "manifest.csv" manifest = pandas.read_csv(manifest_path) model_names = manifest.model_name.tolist() if not model_names or len(set(model_names)) != len(model_names): raise ValueError("Require nonempty unique model names") members = [] for index, name in enumerate(model_names): if not isinstance(name, str) or Path(name).name != name: raise ValueError("Invalid model name") weights = args.models_dir / ("weights_" + name + ".npz") members.append({"index": index, "model_name": name, "weights": str(weights.resolve()), "sha256": sha256_file(weights)}) combinations = subsets(len(members), args.subset_size, args.max_subsets) subset_names = ["subset_" + "_".join(map(str, indices)) for indices in combinations] if set(comparisons) & set(subset_names + ["reconstructed_full"]): raise ValueError("Comparison name collides with a generated score") provenance = { "design": "processing-exhaustive-ensemble-subsets-v1", "arguments": {k: str(v) if isinstance(v, Path) else v for k, v in vars(args).items()}, "input_sha256": sha256_file(args.input), "manifest_sha256": sha256_file(manifest_path), "members": members, "processing_matching_policy": MATCHING_POLICY, "rows": len(frame), "unique_source_rows": len(unique), "subsets": len(combinations), "selection": "none; enumerate all combinations", "training": False, "release_accepted": False, } args.out.mkdir(parents=True) (args.out / "experiment.json").write_text(json.dumps(provenance, indent=2) + "\n") manifest.to_csv(args.out / "manifest.csv", index=False) unique.to_csv(args.out / "prediction_inputs.csv.bz2", index=False) if args.member_cache_dir: saved = json.loads((args.member_cache_dir / "experiment.json").read_text()) for key in ("input_sha256", "manifest_sha256", "members"): if saved[key] != provenance[key]: raise ValueError("Member cache identity mismatch: %s" % key) for key in ("backend", "threads", "batch_size"): if saved["arguments"][key] != provenance["arguments"][key]: raise ValueError("Member cache execution mismatch: %s" % key) with numpy.load(args.member_cache_dir / "member_predictions.npz", allow_pickle=False) as cache: if not numpy.array_equal(cache["source_row"], unique.source_row.to_numpy()): raise ValueError("Member cache source rows differ") matrix = cache["predictions"].copy() if matrix.shape != (len(unique), len(members)) or not numpy.isfinite(matrix).all(): raise ValueError("Invalid member cache predictions") provenance["member_cache"] = { "path": str(args.member_cache_dir.resolve()), "sha256": sha256_file(args.member_cache_dir / "member_predictions.npz")} (args.out / "experiment.json").write_text(json.dumps(provenance, indent=2) + "\n") else: configure_pytorch(backend=args.backend, num_threads=args.threads) from mhcflurry import Class1ProcessingPredictor from mhcflurry.flanking_encoding import FlankingEncoding predictor = Class1ProcessingPredictor.load(str(args.models_dir)) if len(predictor.models) != len(members): raise ValueError("Loaded model count differs from fingerprinted manifest") sequences = FlankingEncoding(unique.peptide, unique.n_flank, unique.c_flank) matrix = numpy.empty((len(unique), len(members)), dtype="float64") for index, network in enumerate(predictor.models): print("Scoring member %d/%d on %d source rows" % ( index + 1, len(members), len(unique)), flush=True) values = network.predict_encoded(sequences, batch_size=args.batch_size) if not numpy.isfinite(values).all(): raise ValueError("Nonfinite member predictions") matrix[:, index] = values pandas.DataFrame({"source_row": unique.source_row, "score": values}).to_csv( args.out / ("member_%02d_predictions.csv.bz2" % index), index=False) if args.member_cache_dir: for index in range(len(members)): pandas.DataFrame({"source_row": unique.source_row, "score": matrix[:, index]}).to_csv( args.out / ("member_%02d_predictions.csv.bz2" % index), index=False) # Individual predictions + the membership table reconstruct all conditions # without storing seventy redundant full peptide/flank tables. numpy.savez_compressed(args.out / "member_predictions.npz", source_row=unique.source_row.to_numpy(), predictions=matrix) indices = pandas.Index(unique.source_row).get_indexer(frame.source_row) if (indices < 0).any(): raise ValueError("Failed to map source rows to cached predictions") full = matrix.mean(axis=1)[indices] error = numpy.abs(full - frame[args.reference_score].to_numpy()) verification = {"max_absolute_error": float(error.max()), "mean_absolute_error": float(error.mean()), "absolute_tolerance": args.verification_atol} (args.out / "verification.json").write_text(json.dumps(verification, indent=2) + "\n") if error.max() > args.verification_atol: raise ValueError("Reconstructed ensemble differs from cached reference: %g" % error.max()) frame["reconstructed_full"] = full metrics = [score_risk_sets(frame, comparisons + ["reconstructed_full"])] membership = [] for number, (name, selected) in enumerate(zip(subset_names, combinations), 1): frame[name] = matrix[:, selected].mean(axis=1)[indices] metrics.append(score_risk_sets(frame, [name])) membership.append({"score": name, "indices": list(selected), "model_names": [model_names[i] for i in selected]}) if number % 10 == 0 or number == len(combinations): print("Evaluated %d/%d subsets" % (number, len(combinations)), flush=True) metrics = pandas.concat(metrics, ignore_index=True) summary, deltas = summarize_metrics(metrics, args.reference_score) distribution = subset_distribution(summary, subset_names) (args.out / "subset_membership.json").write_text(json.dumps(membership, indent=2) + "\n") frame.to_csv(args.out / "matched_predictions.csv.bz2", index=False) metrics.to_csv(args.out / "metrics.csv", index=False) summary.to_csv(args.out / "summary.csv", index=False) deltas.to_csv(args.out / "comparisons.csv", index=False) distribution.to_csv(args.out / "subset_distribution.csv", index=False) plot_subset_distribution(summary, subset_names, ["reconstructed_full"] + comparisons[1:], args.out) print(distribution.to_string(index=False), flush=True) print(summary.loc[summary.score.isin(comparisons)].to_string(index=False), flush=True) (args.out / "completed.json").write_text(json.dumps({"complete": True}) + "\n") return 0 def main(argv=None): return run(make_parser().parse_args(argv)) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/evaluate_saved_candidate.py000066400000000000000000000305451525677230600244210ustar00rootroot00000000000000#!/usr/bin/env python3 """Finish held-out evaluation of saved ensembles, without any network training.""" import argparse import csv import json import os from pathlib import Path import shutil from compose_processing_ensemble import fingerprint_directory, sha256_file from run_exact_public_processing import ( CONDITIONS, Driver, fit_combiners, utc_now, verify_public_inputs, write_json) def model_inventory(directory): """Require primary weights for every manifest model, not merely a directory.""" directory = Path(directory) with (directory / "manifest.csv").open() as fd: rows = list(csv.DictReader(fd)) if not rows: raise ValueError("Empty predictor: %s" % directory) for row in rows: name = row["model_name"] if Path(name).name != name or not (directory / ("weights_" + name + ".npz")).is_file(): raise ValueError("Missing or invalid model weights: %s / %s" % (directory, name)) return {"path": str(directory), "models": len(rows), "fingerprint": fingerprint_directory(directory)} def copy_predictor(source, destination): """Make a portable evaluation copy; resume only byte-identical directories.""" source, destination = Path(source), Path(destination) if destination.exists(): if fingerprint_directory(source) != fingerprint_directory(destination): raise ValueError("Changed or incomplete predictor copy: %s" % destination) return destination.parent.mkdir(parents=True, exist_ok=True) staging = destination.with_name(destination.name + ".copying") # A failed copy may be resumed, but never expose it as a complete predictor. shutil.copytree(source, staging, dirs_exist_ok=True) if fingerprint_directory(source) != fingerprint_directory(staging): raise ValueError("Predictor copy verification failed: %s" % staging) staging.rename(destination) def comparison_command(args, candidate, out, components, extra=()): """Use the frozen release policy and always save prediction-level outputs.""" return ["mhcflurry", "eval", "compare-models", "--a", str(candidate), "--a-label", candidate.name, "--b", "public:2.2.0", "--b-label", "selected-public-2.1.x", "--include", components, "--data-dir", str(args.public_root / "data_evaluation"), "--release-holdout-dir", str(args.release_holdout_dir), "--affinity-training-overlap-policy", "audit", "--out", str(out), "--backend", args.backend, "--gpus", str(args.gpus), "--num-jobs", "1", "--max-workers-per-gpu", "1", "--torch-compile", "0", "--matmul-precision", "highest", *map(str, extra)] def evaluate(driver, args, name, candidate, components, extra=()): comparison = args.out / "comparisons" / name driver.run(name + "-evaluate", comparison_command( args, candidate, comparison, components, extra)) driver.run(name + "-plots", ["mhcflurry", "eval", "plot-comparison", "--input", comparison, "--components", components, "--summary-pdf", comparison / "plots/model_comparison_figures.pdf"]) def finish_exact_replay(args, driver): """Assemble saved four-per-family fits in a new evaluation-only directory.""" source = args.exact_processing_run processing_root = args.public_root / "models_class1_processing" processing_data = processing_root / "models.selected.short_flanks/train_data.csv.bz2" presentation_data = args.public_root / "models_class1_presentation/train_data.csv.bz2" verify_public_inputs(processing_data, presentation_data, args.release_holdout_dir) out = args.out / "exact-public-replay" out.mkdir(exist_ok=True) processors = {"public_refit": processing_root / "models.selected.short_flanks"} for name in CONDITIONS: for stage in ("train", "select"): marker = source / "stages" / (name + "-" + stage + ".json") if json.loads(marker.read_text()).get("exit_code") != 0: raise ValueError("Incomplete saved stage: %s" % marker) identity = json.loads((source / name / "training_identity.json").read_text()) if not identity["same_ordered_rows"]: raise ValueError("Exact-public training identity failed: " + name) original = source / name / "processing/models.selected.short_flanks" if model_inventory(original)["models"] != 4: raise ValueError("Require four saved networks per exact-data condition") selected = out / name / "processing/models.selected.short_flanks" copy_predictor(original, selected) processors[name] = selected hybrid = out / "hybrid/processing/models.selected.short_flanks" driver.run("exact-compose-hybrid", ["mhcflurry", "train", "compose-processing-ensemble", "--predictor", "legacy=" + str(processors[CONDITIONS[0]]), "--predictor", "boundary=" + str(processors[CONDITIONS[1]]), "--require-equal-counts", "--out", hybrid]) processors["hybrid"] = hybrid fit_combiners(out, presentation_data, args.public_root / "models_class1_pan/models.combined", processing_root / "models.selected.no_flank", processors) for name in processors: evaluate(driver, args, "exact-" + name, out / name, "processing,presentation", [ "--a-processing-dir", processing_root if name == "public_refit" else out / name / "processing", "--processing-modes", "short_flanks", "--presentation-score-kinds", "presentation_score"]) write_json(out / "completed.json", {"at": utc_now(), "networks_trained_here": 0, "scope": "eight-network exact-data replay, not full architecture selection"}) def make_parser(): parser = argparse.ArgumentParser(description=__doc__) for name in ("candidate", "out", "public-root", "release-holdout-dir"): parser.add_argument("--" + name, type=Path, required=True) parser.add_argument("--exact-processing-run", type=Path) parser.add_argument("--source-commit", required=True, help="Evaluator commit, not the training commit.") parser.add_argument("--backend", choices=("gpu", "cpu", "mps", "auto"), default="gpu") parser.add_argument("--gpus", type=int, default=1) parser.add_argument("--prepare-only", action="store_true") parser.add_argument("--phase", choices=("all", "full", "exact"), default="all") return parser def main(argv=None): args = make_parser().parse_args(argv) if args.phase == "exact" and args.exact_processing_run is None: raise ValueError("--phase exact requires --exact-processing-run") for name in ("candidate", "out", "public_root", "release_holdout_dir", "exact_processing_run"): value = getattr(args, name) if value is not None: setattr(args, name, value.resolve()) for source in (args.candidate, args.public_root, args.release_holdout_dir, args.exact_processing_run): if source is not None and (args.out == source or source in args.out.parents or args.out in source.parents): raise ValueError("Evaluation output must be separate from all source directories") bundle = args.candidate / "presentation/models" sources = { "affinity": bundle / "affinity_predictor", "hybrid_processing": bundle / "processing_predictor_with_flanks", "no_flank_processing": bundle / "processing_predictor_without_flanks", "legacy_5aa": args.candidate / "processing/models.selected.short_flanks", "legacy_15aa": args.candidate / "processing/models.selected.with_flanks", } inventory = {key: model_inventory(path) for key, path in sources.items()} public_models = {name: fingerprint_directory(args.public_root / relative) for name, relative in ( ("affinity", "models_class1_pan/models.combined"), ("affinity_train_excluded", "models_class1_pan_variants/models.no_additional_ms"), ("processing", "models_class1_processing"), ("presentation", "models_class1_presentation/models"))} if any(value["files"] == 0 for value in public_models.values()): raise ValueError("Missing required public model bundle") if args.exact_processing_run: for name in CONDITIONS: inventory["exact-" + name] = model_inventory( args.exact_processing_run / name / "processing/models.selected.short_flanks") provenance = {"evaluator_commit": args.source_commit, "candidate_run": str(args.candidate), "training_provenance": json.loads((args.candidate / "provenance.json").read_text()), "models": inventory, "presentation_bundle": fingerprint_directory(bundle), "public_root": str(args.public_root), "public_models": public_models, "affinity_training_sha256": sha256_file(args.candidate / "affinity/models.combined/train_data.csv.bz2"), "holdout": fingerprint_directory(args.release_holdout_dir), "networks_trained_here": 0, "release_accepted": False, "phase": args.phase, "exact_processing_run": str(args.exact_processing_run) if args.exact_processing_run else None} args.out.mkdir(parents=True, exist_ok=True) document = args.out / "evaluation.json" if document.exists() and json.loads(document.read_text()) != provenance: raise ValueError("Refusing changed evaluation inputs or evaluator source") write_json(document, provenance) shutil.copytree(args.release_holdout_dir, args.out / "release_holdout", dirs_exist_ok=True) if args.prepare_only: print(json.dumps(provenance, indent=2)) return 0 os.environ.update({"MHCFLURRY_TORCH_COMPILE": "0", "MHCFLURRY_TORCH_COMPILE_LOSS": "0", "MHCFLURRY_MATMUL_PRECISION": "highest"}) driver = Driver(args.out) if args.phase == "exact": finish_exact_replay(args, driver) write_json(args.out / "completed.json", {"at": utc_now(), "release_accepted": False}) return 0 candidate = args.out / "candidate" copy_predictor(bundle, candidate / "presentation/models") # Use the bundle's actual components for both standalone and joint evaluation. for source, destination in ( (sources["affinity"], candidate / "affinity/models.combined"), (sources["hybrid_processing"], candidate / "processing/models.selected.short_flanks"), (sources["no_flank_processing"], candidate / "processing/models.selected.no_flank"), (sources["legacy_15aa"], candidate / "processing/models.selected.with_flanks")): copy_predictor(source, destination) affinity_data = args.candidate / "affinity/models.combined/train_data.csv.bz2" target_data = candidate / "affinity/models.combined/train_data.csv.bz2" if not target_data.exists(): shutil.copy2(affinity_data, target_data) if sha256_file(affinity_data) != sha256_file(target_data): raise ValueError("Candidate affinity training audit table differs") evaluate(driver, args, "full-presentation", candidate, "presentation") evaluate(driver, args, "full-processing", candidate, "processing") evaluate(driver, args, "full-legacy-processing", candidate, "processing", [ "--a-processing-dir", args.candidate / "processing", "--processing-modes", "short_flanks"]) baseline = args.public_root / "models_class1_pan_variants/models.no_additional_ms" fair = comparison_command(args, candidate, args.out / "comparisons/full-affinity-train-excluded", "affinity") for flag, value in (("--b", str(baseline)), ("--b-label", "public-no-additional-MS"), ("--affinity-training-overlap-policy", "exclude")): fair[fair.index(flag) + 1] = value fair += ["--b-affinity-dir", str(baseline), "--affinity-source", "no_additional_ms"] driver.run("full-affinity-train-excluded-evaluate", fair) driver.run("full-affinity-train-excluded-plots", ["mhcflurry", "eval", "plot-comparison", "--input", args.out / "comparisons/full-affinity-train-excluded", "--components", "affinity", "--summary-pdf", args.out / "comparisons/full-affinity-train-excluded/plots/model_comparison_figures.pdf"]) evaluate(driver, args, "full-affinity-descriptive", candidate, "affinity") write_json(args.out / "full_candidate_completed.json", {"at": utc_now(), "release_accepted": False}) if args.exact_processing_run and args.phase == "all": finish_exact_replay(args, driver) write_json(args.out / "completed.json", {"at": utc_now(), "release_accepted": False}) return 0 if __name__ == "__main__": raise SystemExit(main()) mhcflurry-2.3.6/scripts/training/final_230_candidate_recipe.json000066400000000000000000000033351525677230600247530ustar00rootroot00000000000000{ "format": 1, "name": "final-2.3.0-candidate", "status": "historical v1 recipe; retained for reproduction", "affinity": { "architectures": 35, "folds": 4, "minibatch_size": 1024, "optimizer": "rmsprop", "optimizer_implementation": "pytorch", "init": "glorot_uniform", "lsuv_target": "pre_activation", "dropout": 0.5, "patience": 20, "primary_checkpoint": "terminal", "retained_checkpoints": [ "terminal", "best" ] }, "processing": { "folds": 4, "minibatch_size": 512, "legacy_architectures_per_variant": 128, "variants": [ "with_flanks", "no_flank", "short_flanks" ], "with_flanks_recipe": "kaiming-pytorch-adam", "no_flank_recipe": "glorot-keras-adam", "short_flanks_recipe": "glorot-keras-adam", "cleavage_boundary": { "architecture": "large_relu", "flank_context": 5, "peptide_context": 5, "models_per_fold": 1 }, "presentation_with_flanks_ensemble": { "legacy_short_flanks_models_per_fold": 1, "cleavage_boundary_models_per_fold": 1, "family_weights": [ 0.5, 0.5 ] } }, "presentation": { "processing_with_flanks": "short_flanks plus radius-5 boundary hybrid", "processing_without_flanks": "selected no_flank ensemble", "component_factorial": [ "public affinity plus public processing", "new affinity plus public processing", "public affinity plus new processing", "new affinity plus new processing" ] }, "acceptance": { "primary": [ "macro AUPRC", "macro PPV@N" ], "safeguards": [ "micro", "per sample", "per length", "allele", "locus" ] } } mhcflurry-2.3.6/scripts/training/final_230_candidate_v2_recipe.json000066400000000000000000000043271525677230600253640ustar00rootroot00000000000000{ "format": 1, "name": "final-2.3.0-candidate-v2", "status": "frozen recipe used for the 2.3.0 weights", "affinity": { "architectures": 35, "folds": 4, "minibatch_size": 1024, "optimizer": "rmsprop", "optimizer_implementation": "pytorch", "init": "glorot_uniform", "lsuv_target": "pre_activation", "dropout": 0.5, "patience": 20, "primary_checkpoint": "terminal", "retained_checkpoints": [ "terminal", "best" ] }, "processing": { "folds": 4, "minibatch_size": 512, "legacy_architectures_per_variant": { "with_flanks": 128, "no_flank": 128, "short_flanks": 1 }, "variants": [ "with_flanks", "no_flank", "short_flanks" ], "with_flanks_recipe": "kaiming-pytorch-adam", "no_flank_recipe": "glorot-keras-adam", "short_flanks_recipe": "confirmed-ranking-candidate: legacy_5aa__rmsprop_pytorch__k13, native RMSprop, Glorot, L1/L2 0, batch 512, inner-best-AP checkpoints (loss-based patience)", "cleavage_boundary": { "architecture": "large_relu", "flank_context": 5, "peptide_context": 5, "models_per_fold": 1 }, "presentation_with_flanks_ensemble": { "legacy_short_flanks_models_per_fold": 1, "cleavage_boundary_models_per_fold": 1, "family_weights": [ 0.5, 0.5 ] }, "short_flanks_confirmation": { "experiment": "processing-ranking-confirmation-20260909", "runplz_run_id": "a8889cc8dfbb4f4390d4ceb153ad81e1", "decision_sha256": "5529a81d35defa8939784cabc96f7f077c8918f059a13fee11fb78fafdb29921" } }, "presentation": { "processing_with_flanks": "short_flanks plus radius-5 boundary hybrid", "processing_without_flanks": "selected no_flank ensemble", "component_factorial": [ "public affinity plus public processing", "new affinity plus public processing", "public affinity plus new processing", "new affinity plus new processing" ] }, "acceptance": { "primary": [ "macro AUPRC", "macro PPV@N" ], "safeguards": [ "micro", "per sample", "per length", "allele", "locus" ] }, "based_on": "final-2.3.0-candidate" } mhcflurry-2.3.6/scripts/training/full_ensemble_minibatch_sweep.sh000066400000000000000000000407271525677230600254570ustar00rootroot00000000000000#!/usr/bin/env bash # # Full-ensemble affinity throughput sweep. For each minibatch in # ${MINIBATCH_SIZES}, validation batch in ${VALIDATION_BATCH_SIZES}, and # workers-per-GPU cap in ${MAX_WORKERS_PER_GPU_VALUES}, runs the full # release_affinity pipeline (train -> select -> calibrate -> eval) into a # per-cell subdirectory and records phase wall times + eval metrics into # sweep_summary.csv. # # Reuses the existing v7 box's downloaded data (training data, allele # sequences, pretrain predictions, eval benchmarks, public predictor) # so each iteration only re-trains and re-evaluates -- no fresh box # bring-up per size. # # Required env (defaults assume the v7 release-exact run dir layout): # MHCFLURRY_OUT base output dir (e.g. .../out/affinity) # SWEEP_OUT sweep root (default: $MHCFLURRY_OUT/full_sweep) # MINIBATCH_SIZES space-separated list (default: "256 512 1024 2048 4096 8192 16384") # VALIDATION_BATCH_SIZES # space-separated validation_batch_size values to test. # "auto" leaves the template value unchanged. # MAX_WORKERS_PER_GPU_VALUES # space-separated --max-workers-per-gpu values to test. # Use "2" on 80 GB A100 boxes to test whether two # concurrent affinity workers fit; "auto" preserves the # workload-aware resolver. # TRAIN_DATA train_data.csv.bz2 from prior run # HYPERPARAMS_TPL template hyperparameters.yaml to patch # ALLELE_SEQUENCES path to a pseudosequence CSV # PRETRAIN_DATA path to random_peptide_predictions/predictions.csv.bz2 # DATA_EVAL_DIR data_evaluation/ for benchmark hits/decoys # GPUS, MAX_TASKS_PER_WORKER # MHCFLURRY_SCALE_LR_BASE_MB reference minibatch for sqrt LR scaling # (default 128, matching the historical # 2.0.0–2.2.x pan-allele recipe — the # old documented value of 64 was wrong). # MHCFLURRY_SCALE_LR if "1", multiply learning_rate by sqrt(mb/BASE_MB) for # mb>BASE_MB (square-root LR scaling, Goyal et al. 2017 # Appendix B). Default "0" leaves LR untouched, so # the sweep isolates the effect of minibatch size at # fixed LR -- run twice (once with, once without) # into separate $SWEEP_OUT roots to compare. # (--num-jobs auto-resolves from the requested workers-per-GPU and GPU count) # # Output layout: # $SWEEP_OUT/ # mb_1024/{hyperparameters.yaml,train.log,select.log,calibrate.log,eval.log, # models.unselected.combined/, models.combined/, eval_comparison/} # mb_1024__val_4096__mwpg_2/... # ... # sweep_summary.csv -- one row per sweep cell # set -euo pipefail set -x SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck disable=SC1091 source "$SCRIPT_DIR/gpu_telemetry.sh" GPU_TELEMETRY_PID="" trap stop_gpu_telemetry EXIT : "${MHCFLURRY_OUT:?MHCFLURRY_OUT must be set}" SWEEP_OUT="${SWEEP_OUT:-$MHCFLURRY_OUT/full_sweep}" MINIBATCH_SIZES="${MINIBATCH_SIZES:-256 512 1024 2048 4096 8192 16384}" VALIDATION_BATCH_SIZES="${VALIDATION_BATCH_SIZES:-auto}" MAX_WORKERS_PER_GPU_VALUES="${MAX_WORKERS_PER_GPU_VALUES:-auto}" TRAIN_DATA="${TRAIN_DATA:-$MHCFLURRY_OUT/train_data.csv.bz2}" HYPERPARAMS_TPL="${HYPERPARAMS_TPL:-$MHCFLURRY_OUT/hyperparameters.yaml}" if [ -z "${ALLELE_SEQUENCES:-}" ]; then ALLELE_SEQUENCES_DIR="$(mhcflurry-downloads path allele_sequences)" ALLELE_SEQUENCES="$(mhcflurry pseudosequences path \ --directory "$ALLELE_SEQUENCES_DIR" \ --length 39 \ --fallback-legacy)" fi PRETRAIN_DATA="${PRETRAIN_DATA:-$(mhcflurry-downloads path random_peptide_predictions)/predictions.csv.bz2}" DATA_EVAL_DIR="${DATA_EVAL_DIR:-$(mhcflurry-downloads path data_evaluation)}" GPUS="${GPUS:-8}" MAX_TASKS_PER_WORKER="${MAX_TASKS_PER_WORKER:-12}" # Model selection bounds. mhcflurry-class1-select-pan-allele-models picks # between MIN_MODELS_PER_FOLD and MAX_MODELS_PER_FOLD models per training # fold; with 4 folds, total ensemble size lands in # [4*MIN_MODELS_PER_FOLD, 4*MAX_MODELS_PER_FOLD]. Default range matches # the historical 2.x recipe; pin both to the same value to fix ensemble # size (e.g. =3 → 12 models = 3/fold × 4 folds). MIN_MODELS_PER_FOLD="${MIN_MODELS_PER_FOLD:-2}" MAX_MODELS_PER_FOLD="${MAX_MODELS_PER_FOLD:-8}" MHCFLURRY_SCALE_LR="${MHCFLURRY_SCALE_LR:-0}" MHCFLURRY_SCALE_LR_BASE_MB="${MHCFLURRY_SCALE_LR_BASE_MB:-128}" # When 1, skip the calibrate phase entirely (eval doesn't need percentile # ranks, only the predict outputs from models.combined). Useful for fast # multi-cell sweeps where calibrate would be ~10-15min/cell of pure # overhead. Run calibrate manually for the winning cell at the end. MHCFLURRY_SKIP_CALIBRATE="${MHCFLURRY_SKIP_CALIBRATE:-0}" # --num-jobs is passed as ``auto`` so the resolver never overflows workers to # CPU silently. --max-workers-per-gpu is swept explicitly so 80 GB boxes can # test whether 2 workers/GPU improves throughput without OOM. mkdir -p "$SWEEP_OUT" SUMMARY="$SWEEP_OUT/sweep_summary.csv" SUMMARY_HEADER="minibatch,validation_batch_size,max_workers_per_gpu,n_models,params_M,train_seconds,select_seconds,calibrate_seconds,eval_seconds,total_seconds,n_alleles_reported,n_hits,n_rows,roc_auc_macro_new,roc_auc_macro_public,pr_auc_macro_new,pr_auc_macro_public,ppv_at_n_macro_new,ppv_at_n_macro_public,roc_auc_micro_new,roc_auc_micro_public,pr_auc_micro_new,pr_auc_micro_public,ppv_at_n_micro_new,ppv_at_n_micro_public,new_better_roc_auc,new_better_pr_auc,new_better_ppv_at_n,public_better_roc_auc,public_better_pr_auc,public_better_ppv_at_n" cell_dir_name() { local mb="$1" local validation_batch_size="$2" local max_workers_per_gpu="$3" if [ "$VALIDATION_BATCH_SIZES" = "auto" ] && \ [ "$MAX_WORKERS_PER_GPU_VALUES" = "auto" ]; then printf 'mb_%s\n' "$mb" else printf 'mb_%s__val_%s__mwpg_%s\n' \ "$mb" "$validation_batch_size" "$max_workers_per_gpu" fi } # Rebuild sweep_summary.csv from the durable per-cell row.csv files (header + # each cell's row in MINIBATCH_SIZES order). Written atomically via a temp # file so a crash never leaves a half-written summary, and regenerated from # the per-cell rows every time, so a completed cell's row can never be lost. rebuild_summary() { local mb local validation_batch_size local max_workers_per_gpu local cell_name { echo "$SUMMARY_HEADER" for mb in $MINIBATCH_SIZES; do for validation_batch_size in $VALIDATION_BATCH_SIZES; do for max_workers_per_gpu in $MAX_WORKERS_PER_GPU_VALUES; do cell_name="$(cell_dir_name \ "$mb" "$validation_batch_size" "$max_workers_per_gpu")" [ -f "$SWEEP_OUT/$cell_name/row.csv" ] && \ cat "$SWEEP_OUT/$cell_name/row.csv" done done done } > "$SUMMARY.tmp" mv "$SUMMARY.tmp" "$SUMMARY" } for MB in $MINIBATCH_SIZES; do for VALIDATION_BATCH_SIZE in $VALIDATION_BATCH_SIZES; do for MAX_WORKERS_PER_GPU in $MAX_WORKERS_PER_GPU_VALUES; do CELL_NAME="$(cell_dir_name \ "$MB" "$VALIDATION_BATCH_SIZE" "$MAX_WORKERS_PER_GPU")" SIZE_OUT="$SWEEP_OUT/$CELL_NAME" # Per-cell completion is marked by row.csv, written (atomically) only # after metrics are extracted -- NOT by summary.json, which compare-models # writes partway through eval. A cell that died after eval but before its # row was recorded therefore re-enters, skips every expensive phase via # its ..done sentinel, and just regenerates the row. if [ -f "$SIZE_OUT/row.csv" ]; then echo "=== $CELL_NAME already complete, skipping ===" continue fi mkdir -p "$SIZE_OUT" cd "$SIZE_OUT" # Phase-level idempotency: each phase writes a sentinel # ($SIZE_OUT/..done) on success, recording its wall time # for the summary CSV. A killed-mid-phase rerun skips already-done # phases (avoids re-training when only calibrate failed last time). TRAIN_SENTINEL="$SIZE_OUT/.train.done" SELECT_SENTINEL="$SIZE_OUT/.select.done" CALIBRATE_SENTINEL="$SIZE_OUT/.calibrate.done" EVAL_SENTINEL="$SIZE_OUT/.eval.done" # Patch the hyperparameters template's minibatch_size in every spec. # When MHCFLURRY_SCALE_LR=1 and mb > MHCFLURRY_SCALE_LR_BASE_MB, # also scale learning_rate by sqrt(mb/BASE_MB) (square-root LR # scaling, Goyal et al. 2017). BASE_MB defaults to 128 to match the # 2.0.0–2.2.x pan-allele recipe; sweeps at or below the baseline # don't get downscaled because smaller batches already train fine # at the baseline LR. if [ ! -f "$SIZE_OUT/hyperparameters.yaml" ]; then python3 - "$HYPERPARAMS_TPL" "$MB" "$VALIDATION_BATCH_SIZE" \ "$MHCFLURRY_SCALE_LR" "$MHCFLURRY_SCALE_LR_BASE_MB" \ <<'PY' > "$SIZE_OUT/hyperparameters.yaml" import math, sys, yaml src = sys.argv[1] mb = int(sys.argv[2]) validation_batch_size = sys.argv[3] scale_lr = sys.argv[4] == "1" base_mb = int(sys.argv[5]) with open(src) as f: specs = yaml.safe_load(f) for spec in specs: spec["minibatch_size"] = mb if validation_batch_size != "auto": spec["validation_batch_size"] = int(validation_batch_size) if (scale_lr and mb > base_mb and spec.get("learning_rate") is not None): spec["learning_rate"] = ( float(spec["learning_rate"]) * math.sqrt(mb / base_mb)) print(yaml.safe_dump(specs)) PY fi # ---- train ---- if [ -f "$TRAIN_SENTINEL" ]; then train_sec=$(cat "$TRAIN_SENTINEL") echo "=== $CELL_NAME train already complete (${train_sec}s), skipping ===" else train_start=$(date +%s) start_gpu_telemetry "$SIZE_OUT/gpu_occupancy.csv" mhcflurry-class1-train-pan-allele-models \ --data "$TRAIN_DATA" \ --allele-sequences "$ALLELE_SEQUENCES" \ --pretrain-data "$PRETRAIN_DATA" \ --held-out-measurements-per-allele-fraction-and-max 0.25 100 \ --num-folds 4 \ --hyperparameters hyperparameters.yaml \ --out-models-dir "$SIZE_OUT/models.unselected.combined" \ --worker-log-dir "$SIZE_OUT" \ --num-jobs auto \ --max-tasks-per-worker "$MAX_TASKS_PER_WORKER" \ --gpus "$GPUS" \ --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" \ --dataloader-num-workers 1 \ --torch-compile auto \ --matmul-precision none \ --enable-timing \ 2>&1 | tee "$SIZE_OUT/train.log" stop_gpu_telemetry train_end=$(date +%s) train_sec=$(( train_end - train_start )) echo "$train_sec" > "$TRAIN_SENTINEL" fi # ---- select ---- if [ -f "$SELECT_SENTINEL" ]; then select_sec=$(cat "$SELECT_SENTINEL") echo "=== $CELL_NAME select already complete (${select_sec}s), skipping ===" else select_start=$(date +%s) cd "$SIZE_OUT" mhcflurry-class1-select-pan-allele-models \ --data "$SIZE_OUT/models.unselected.combined/train_data.csv.bz2" \ --models-dir "$SIZE_OUT/models.unselected.combined" \ --out-models-dir "$SIZE_OUT/models.combined" \ --min-models-per-fold "$MIN_MODELS_PER_FOLD" \ --max-models-per-fold "$MAX_MODELS_PER_FOLD" \ --save-validation-predictions \ --num-jobs auto \ --max-tasks-per-worker "$MAX_TASKS_PER_WORKER" \ --gpus "$GPUS" \ --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" \ --dataloader-num-workers 1 \ --torch-compile auto \ --matmul-precision none \ --enable-timing \ 2>&1 | tee "$SIZE_OUT/select.log" select_end=$(date +%s) select_sec=$(( select_end - select_start )) echo "$select_sec" > "$SELECT_SENTINEL" fi # ---- calibrate (auto MWPG accounts for cartesian forward + cache) ---- if [ "$MHCFLURRY_SKIP_CALIBRATE" = "1" ]; then cal_sec=0 echo "0" > "$CALIBRATE_SENTINEL" echo "=== $CELL_NAME calibrate skipped (MHCFLURRY_SKIP_CALIBRATE=1) ===" elif [ -f "$CALIBRATE_SENTINEL" ]; then cal_sec=$(cat "$CALIBRATE_SENTINEL") echo "=== $CELL_NAME calibrate already complete (${cal_sec}s), skipping ===" else cal_start=$(date +%s) mhcflurry-calibrate-percentile-ranks \ --models-dir "$SIZE_OUT/models.combined" \ --match-amino-acid-distribution-data "$SIZE_OUT/models.unselected.combined/train_data.csv.bz2" \ --motif-summary --num-peptides-per-length 50000 \ --alleles-per-work-chunk 30 --gpu-batched --verbosity 1 \ --num-jobs auto \ --max-tasks-per-worker "$MAX_TASKS_PER_WORKER" \ --gpus "$GPUS" \ --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" \ --dataloader-num-workers 1 \ --torch-compile auto \ --matmul-precision none \ --enable-timing \ 2>&1 | tee "$SIZE_OUT/calibrate.log" cal_end=$(date +%s) cal_sec=$(( cal_end - cal_start )) echo "$cal_sec" > "$CALIBRATE_SENTINEL" fi # ---- eval (compare against public 2.2.0) ---- if [ -f "$EVAL_SENTINEL" ]; then eval_sec=$(cat "$EVAL_SENTINEL") echo "=== $CELL_NAME eval already complete (${eval_sec}s), skipping ===" else eval_start=$(date +%s) mkdir -p "$SIZE_OUT/eval_comparison" mhcflurry eval compare-models \ --a "$SIZE_OUT/models.combined" \ --a-label "$CELL_NAME" \ --b public \ --data-dir "$DATA_EVAL_DIR" \ --include affinity \ --out "$SIZE_OUT/eval_comparison" \ 2>&1 | tee "$SIZE_OUT/eval.log" eval_end=$(date +%s) eval_sec=$(( eval_end - eval_start )) echo "$eval_sec" > "$EVAL_SENTINEL" fi total_sec=$(( train_sec + select_sec + cal_sec + eval_sec )) # Pull metrics out of summary.json into the cell's own row.csv (written # atomically; the sweep_summary.csv is rebuilt from these rows below). # n_models + params_M are derived from models.combined: row count of # manifest.csv gives ensemble size, and summing the element counts across # each weights_.npz gives the total number of saved parameters (in # millions). python3 - "$SIZE_OUT/eval_comparison/affinity/summary.json" "$MB" \ "$VALIDATION_BATCH_SIZE" "$MAX_WORKERS_PER_GPU" "$train_sec" \ "$select_sec" "$cal_sec" "$eval_sec" "$total_sec" "$SIZE_OUT/row.csv" \ "$SIZE_OUT/models.combined" "$CELL_NAME" <<'PY' import json, os, sys import numpy import pandas (summary_path, mb, validation_batch_size, max_workers_per_gpu, train_s, sel_s, cal_s, eval_s, tot_s, csv_path, models_dir, cell_name) = sys.argv[1:13] with open(summary_path) as f: s = json.load(f) mac = s["macro_mean_over_alleles"] mic = s["micro_pooled"] ac = s["allele_count"] manifest = pandas.read_csv(os.path.join(models_dir, "manifest.csv")) n_models = len(manifest) total_params = 0 for name in manifest["model_name"]: weights_path = os.path.join(models_dir, f"weights_{name}.npz") with numpy.load(weights_path) as wf: for key in wf.files: total_params += int(wf[key].size) params_M = total_params / 1_000_000.0 row = [ mb, validation_batch_size, max_workers_per_gpu, n_models, f"{params_M:.3f}", train_s, sel_s, cal_s, eval_s, tot_s, s["n_alleles_reported"], s["n_hits"], s["n_rows"], mac["roc_auc"]["a"], mac["roc_auc"]["b"], mac["pr_auc"]["a"], mac["pr_auc"]["b"], mac["ppv_at_n"]["a"],mac["ppv_at_n"]["b"], mic["a"]["roc_auc"], mic["b"]["roc_auc"], mic["a"]["pr_auc"], mic["b"]["pr_auc"], mic["a"]["ppv_at_n"],mic["b"]["ppv_at_n"], ac["a_better_roc_auc"], ac["a_better_pr_auc"], ac["a_better_ppv_at_n"], ac["b_better_roc_auc"], ac["b_better_pr_auc"], ac["b_better_ppv_at_n"], ] # Write the single row atomically (temp file + os.replace) so a crash # mid-write can never leave a truncated line that a later run would treat as # a completed cell. tmp_path = csv_path + ".tmp" with open(tmp_path, "w") as f: f.write(",".join(str(x) for x in row) + "\n") os.replace(tmp_path, csv_path) print(f"=== minibatch={mb} done: n_models={n_models} params={params_M:.2f}M " f"validation_batch_size={validation_batch_size} " f"max_workers_per_gpu={max_workers_per_gpu} cell={cell_name} " f"train={train_s}s select={sel_s}s calibrate={cal_s}s " f"eval={eval_s}s total={tot_s}s ===") PY rebuild_summary cd "$MHCFLURRY_OUT" done done done # Final rebuild so a run where every cell was already complete (and therefore # skipped above) still refreshes the summary from the per-cell rows. rebuild_summary echo "=== sweep complete ===" cat "$SUMMARY" mhcflurry-2.3.6/scripts/training/generate_affinity_factorial.py000066400000000000000000000315631525677230600251450ustar00rootroot00000000000000#!/usr/bin/env python """Generate a controlled affinity optimizer/LSUV/batch/initializer sweep.""" import argparse import csv import hashlib import itertools import json from pathlib import Path import yaml from mhcflurry.cli.generate_training_hyperparameters import ( AFFINITY_INIT_CHOICES, LSUV_TARGET_CHOICES, OPTIMIZER_IMPLEMENTATION_CHOICES, build_affinity_grid, ) DEFAULT_MINIBATCH_SIZES = (128, 256, 512, 1024) DEFAULT_INITIALIZERS = ("glorot_uniform", "he_uniform", "orthogonal") DESIGN_CHOICES = ("optimizer-lsuv-batch-init", "regularization-activation") REGULARIZATION_BASE_RECIPES = { "native-pre-1024": { "minibatch_size": 1024, "optimizer_implementation": "pytorch", "data_dependent_initialization_method": "lsuv", "lsuv_target": "pre_activation", }, "native-post-1024": { "minibatch_size": 1024, "optimizer_implementation": "pytorch", "data_dependent_initialization_method": "lsuv", "lsuv_target": "post_activation", }, "keras-no-lsuv-1024": { "minibatch_size": 1024, "optimizer_implementation": "keras", "data_dependent_initialization_method": None, "lsuv_target": "not_applicable", }, } REGULARIZATION_ACTIVATION_VARIANTS = ( ("control", "tanh", "none", 0.50, False, 20), ("activation-relu", "relu", "none", 0.50, False, 20), ("activation-silu", "silu", "none", 0.50, False, 20), ("activation-gelu", "gelu", "none", 0.50, False, 20), ("normalization-batch", "tanh", "batch", 0.50, False, 20), ("normalization-layer", "tanh", "layer", 0.50, False, 20), ("dropout-keep-075", "tanh", "none", 0.75, False, 20), ("dropout-keep-100", "tanh", "none", 1.00, False, 20), ("restore-best", "tanh", "none", 0.50, True, 20), ("restore-best-patience-40", "tanh", "none", 0.50, True, 40), ) REPRESENTATIVE_ARCHITECTURES = ( ("feedforward", (512, 512), 1e-8), ("with-skip-connections", (256, 512, 512), 1e-8), ) MANIFEST_FIELDS = ( "condition", "minibatch_size", "optimizer_implementation", "data_dependent_initialization_method", "lsuv_target", "init", "effective_hidden_initializer", "architecture_count", "fold_count", "network_count", "hyperparameters_path", "hyperparameters_sha256", "design", "base_recipe", "activation", "normalization", "dropout_keep_probability", "restore_best_weights", "patience", ) def condition_name(minibatch_size, optimizer_implementation, lsuv_target, init): """Return the stable filesystem label for one factorial condition.""" return "__".join(( "mb_%d" % minibatch_size, "rmsprop_%s" % optimizer_implementation, "lsuv_%s" % lsuv_target, "init_%s" % init, )) def select_representative_architectures(grid): """Select the paired architectures used in the release parity audit.""" selected = [ item for item in grid if ( item["topology"], tuple(item["layer_sizes"]), item["dense_layer_l1_regularization"], ) in REPRESENTATIVE_ARCHITECTURES ] if len(selected) != len(REPRESENTATIVE_ARCHITECTURES): raise RuntimeError( "Expected %d representative architectures; found %d" % ( len(REPRESENTATIVE_ARCHITECTURES), len(selected), ) ) return selected def build_conditions( mode="representative", minibatch_sizes=DEFAULT_MINIBATCH_SIZES, optimizer_implementations=OPTIMIZER_IMPLEMENTATION_CHOICES, lsuv_targets=LSUV_TARGET_CHOICES, initializers=DEFAULT_INITIALIZERS, ): """Return ``(condition, hyperparameters, axes)`` sweep records. LSUV replaces eligible hidden-layer weights with orthonormal matrices before variance scaling. Crossing a nominal Glorot/He initializer with LSUV would therefore be a misleading mostly-inactive axis. Instead, this design crosses the two LSUV activation targets using their canonical orthogonal replacement, then compares Glorot, He, and orthogonal weights in separate no-LSUV arms. """ records = [] shared_axes = itertools.product( minibatch_sizes, optimizer_implementations, ) initialization_recipes = [ { "data_dependent_initialization_method": "lsuv", "lsuv_target": target, "init": "glorot_uniform", "effective_hidden_initializer": "orthogonal_then_lsuv", } for target in lsuv_targets ] + [ { "data_dependent_initialization_method": None, "lsuv_target": "not_applicable", "init": init, "effective_hidden_initializer": init, } for init in initializers ] for (minibatch_size, optimizer), recipe in itertools.product( shared_axes, initialization_recipes, ): grid = build_affinity_grid( minibatch_size=minibatch_size, optimizer_implementation=optimizer, data_dependent_initialization_target=( recipe["lsuv_target"] if recipe["lsuv_target"] != "not_applicable" else "post_activation" ), init=recipe["init"], ) for item in grid: item["data_dependent_initialization_method"] = recipe[ "data_dependent_initialization_method" ] if mode == "representative": grid = select_representative_architectures(grid) elif mode != "full": raise ValueError("Unknown factorial mode: %s" % mode) axes = { "minibatch_size": minibatch_size, "optimizer_implementation": optimizer, **recipe, } records.append((condition_name( minibatch_size, optimizer, recipe["lsuv_target"], recipe["init"], ), grid, axes)) return records def build_regularization_activation_conditions(base_recipe="native-pre-1024"): """Return one-factor-at-a-time variants of a fixed affinity recipe.""" if base_recipe not in REGULARIZATION_BASE_RECIPES: raise ValueError("Unknown regularization base recipe: %s" % base_recipe) recipe = REGULARIZATION_BASE_RECIPES[base_recipe] grid = build_affinity_grid( minibatch_size=recipe["minibatch_size"], optimizer_implementation=recipe["optimizer_implementation"], data_dependent_initialization_target=( recipe["lsuv_target"] if recipe["lsuv_target"] != "not_applicable" else "post_activation" ), init="glorot_uniform", ) grid = select_representative_architectures(grid) records = [] for ( variant, activation, normalization, dropout_keep, restore_best_weights, patience, ) in ( REGULARIZATION_ACTIVATION_VARIANTS): condition = "%s__%s" % (base_recipe, variant) condition_grid = [] for source in grid: item = dict(source) item.update({ "activation": activation, "batch_normalization": False, "normalization": normalization, "dropout_probability": dropout_keep, "restore_best_weights": restore_best_weights, "patience": patience, "data_dependent_initialization_method": recipe[ "data_dependent_initialization_method"], }) condition_grid.append(item) records.append((condition, condition_grid, { "design": "regularization-activation", "base_recipe": base_recipe, "minibatch_size": recipe["minibatch_size"], "optimizer_implementation": recipe[ "optimizer_implementation"], "data_dependent_initialization_method": recipe[ "data_dependent_initialization_method"], "lsuv_target": recipe["lsuv_target"], "init": "glorot_uniform", "effective_hidden_initializer": ( "orthogonal_then_lsuv" if recipe["data_dependent_initialization_method"] == "lsuv" else "glorot_uniform" ), "activation": activation, "normalization": normalization, "dropout_keep_probability": dropout_keep, "restore_best_weights": restore_best_weights, "patience": patience, })) return records def write_conditions( out_dir, mode="representative", design="optimizer-lsuv-batch-init", regularization_base_recipe="native-pre-1024", **factorial_axes): """Write condition YAML files and checksummed JSON/CSV manifests.""" out_dir = Path(out_dir) conditions_dir = out_dir / "conditions" conditions_dir.mkdir(parents=True, exist_ok=True) records = [] if design == "optimizer-lsuv-batch-init": conditions = build_conditions(mode=mode, **factorial_axes) baseline_condition = condition_name( 128, "keras", "post_activation", "glorot_uniform") elif design == "regularization-activation": if mode != "representative": raise ValueError( "regularization-activation supports representative mode only") conditions = build_regularization_activation_conditions( regularization_base_recipe) baseline_condition = "%s__control" % regularization_base_recipe else: raise ValueError("Unknown affinity factorial design: %s" % design) for condition, grid, axes in conditions: relative_path = Path("conditions") / (condition + ".yaml") payload = yaml.safe_dump(grid, sort_keys=True) (out_dir / relative_path).write_text(payload) records.append({ "condition": condition, **axes, "architecture_count": len(grid), "fold_count": 4, "network_count": 4 * len(grid), "hyperparameters_path": str(relative_path), "hyperparameters_sha256": hashlib.sha256( payload.encode() ).hexdigest(), }) fixed_controls = { "fold_count": 4, "learning_rate": 0.001, "optimizer": "rmsprop", "random_seed": 42, "lsuv_replaces_eligible_weights_with_orthogonal": True, } if design == "regularization-activation": fixed_controls.update({ "activation_screen": ["tanh", "relu", "silu", "gelu"], "dropout_probability_semantics": "keep_probability", }) manifest = { "schema_version": 1, "design": design, "mode": mode, "baseline_condition": baseline_condition, "fixed_controls": fixed_controls, "records": records, } (out_dir / "manifest.json").write_text( json.dumps(manifest, indent=2, sort_keys=True) + "\n" ) with (out_dir / "manifest.csv").open("w", newline="") as fd: writer = csv.DictWriter(fd, fieldnames=MANIFEST_FIELDS) writer.writeheader() writer.writerows(records) return manifest def make_parser(): """Return the command-line parser.""" parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("out_dir") parser.add_argument( "--mode", choices=("representative", "full"), default="representative" ) parser.add_argument( "--design", choices=DESIGN_CHOICES, default="optimizer-lsuv-batch-init", ) parser.add_argument( "--regularization-base-recipe", choices=tuple(REGULARIZATION_BASE_RECIPES), default="native-pre-1024", ) parser.add_argument( "--minibatch-sizes", nargs="+", type=int, default=DEFAULT_MINIBATCH_SIZES, ) parser.add_argument( "--optimizer-implementations", nargs="+", choices=OPTIMIZER_IMPLEMENTATION_CHOICES, default=OPTIMIZER_IMPLEMENTATION_CHOICES, ) parser.add_argument( "--lsuv-targets", nargs="+", choices=LSUV_TARGET_CHOICES, default=LSUV_TARGET_CHOICES, ) parser.add_argument( "--initializers", nargs="+", choices=AFFINITY_INIT_CHOICES, default=DEFAULT_INITIALIZERS, ) return parser def main(argv=None): """Write the requested factorial grid.""" args = make_parser().parse_args(argv) if any(value <= 0 for value in args.minibatch_sizes): raise ValueError("Minibatch sizes must be positive") manifest = write_conditions( args.out_dir, mode=args.mode, design=args.design, regularization_base_recipe=args.regularization_base_recipe, minibatch_sizes=args.minibatch_sizes, optimizer_implementations=args.optimizer_implementations, lsuv_targets=args.lsuv_targets, initializers=args.initializers, ) print(json.dumps(manifest, indent=2, sort_keys=True)) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/generate_processing_cleavage_boundaries.py000066400000000000000000000217671525677230600275330ustar00rootroot00000000000000#!/usr/bin/env python """Write paired compact/extended cleavage-boundary processing panels.""" import argparse import csv from copy import deepcopy import hashlib import json from pathlib import Path import yaml from mhcflurry.cli.generate_training_hyperparameters import ( build_processing_ablation_panels, build_processing_variant_grid, ) ARCHITECTURES = { ("tanh", 256, 11): "small_tanh", ("relu", 512, 17): "large_relu", } DEFAULT_WINDOWS = { "compact_5x2": 2, "extended_5x5": 5, } CONTEXT_DROPOUT = 0.25 KERNEL_WIDTHS = (5, 7, 9, 11, 13, 15) MANIFEST_FIELDS = ( "condition", "architecture", "model_kind", "window", "baseline_5aa_condition", "baseline_no_flank_condition", "external_context_length", "peptide_context_length", "context_dropout", "fold_count", "network_count", "hyperparameters_path", "hyperparameters_sha256", ) def _controls(): controls = build_processing_variant_grid( build_processing_ablation_panels()["glorot_keras_adam"], "short_flanks", ) result = {} for item in controls: key = ( item["convolutional_activation"], item["convolutional_filters"], item["convolutional_kernel_size"], ) architecture = ARCHITECTURES.get(key) if architecture is None or architecture in result: raise RuntimeError("Unexpected representative architecture: %r" % (key,)) result[architecture] = item if set(result) != set(ARCHITECTURES.values()): raise RuntimeError("Missing representative processing architecture") return result def _window_name(peptide_context_length): """Return stable names for the primary and follow-up window sizes.""" primary_names = { value: name for (name, value) in DEFAULT_WINDOWS.items() } return primary_names.get( peptide_context_length, "intermediate_5x%d" % peptide_context_length, ) def build_conditions( architectures=None, peptide_context_lengths=None, include_controls=True): """Return boundary conditions and their exactly matched legacy controls.""" if architectures is None: architectures = tuple(ARCHITECTURES.values()) architectures = tuple(architectures) unknown_architectures = set(architectures).difference(ARCHITECTURES.values()) if unknown_architectures: raise ValueError( "Unknown architectures: %s" % sorted(unknown_architectures)) if peptide_context_lengths is None: peptide_context_lengths = tuple(DEFAULT_WINDOWS.values()) peptide_context_lengths = tuple(int(value) for value in peptide_context_lengths) if not peptide_context_lengths or any( value < 1 or value > 15 for value in peptide_context_lengths): raise ValueError("Peptide context lengths must be between 1 and 15") records = [] for architecture, control in _controls().items(): if architecture not in architectures: continue baseline_5aa = "%s__legacy_5aa" % architecture baseline_no_flank = "%s__legacy_no_flank" % architecture common_axes = { "architecture": architecture, "baseline_5aa_condition": baseline_5aa, "baseline_no_flank_condition": baseline_no_flank, } if include_controls: records.append((baseline_5aa, [deepcopy(control)], { **common_axes, "model_kind": "legacy_5aa", "window": "legacy_5aa", "external_context_length": 5, "peptide_context_length": 0, "context_dropout": 0.0, })) no_flank = deepcopy(control) no_flank.update({"n_flank_length": 0, "c_flank_length": 0}) records.append((baseline_no_flank, [no_flank], { **common_axes, "model_kind": "legacy_no_flank", "window": "legacy_no_flank", "external_context_length": 0, "peptide_context_length": 0, "context_dropout": 0.0, })) for peptide_context_length in peptide_context_lengths: window = _window_name(peptide_context_length) item = deepcopy(control) item.update({ "flanking_averages": False, "cleavage_boundary_flank_length": 5, "cleavage_boundary_peptide_length": peptide_context_length, "cleavage_boundary_hidden_size": 32, "cleavage_boundary_context_dropout": CONTEXT_DROPOUT, }) condition = "%s__%s" % (architecture, window) records.append((condition, [item], { **common_axes, "model_kind": "cleavage_boundary", "window": window, "external_context_length": 5, "peptide_context_length": peptide_context_length, "context_dropout": CONTEXT_DROPOUT, })) return records def write_conditions( out_dir, architectures=None, peptide_context_lengths=None, include_controls=True, design="processing-cleavage-boundaries"): """Write condition YAMLs and a checksummed experiment manifest.""" out_dir = Path(out_dir) conditions_dir = out_dir / "conditions" conditions_dir.mkdir(parents=True, exist_ok=True) records = [] for condition, grid, axes in build_conditions( architectures=architectures, peptide_context_lengths=peptide_context_lengths, include_controls=include_controls): relative_path = Path("conditions") / (condition + ".yaml") payload = yaml.safe_dump(grid, sort_keys=True) (out_dir / relative_path).write_text(payload) records.append({ "condition": condition, **axes, "fold_count": 4, "network_count": 4, "hyperparameters_path": str(relative_path), "hyperparameters_sha256": hashlib.sha256( payload.encode()).hexdigest(), }) manifest = { "schema_version": 1, "design": design, "fixed_controls": { "flank_length_each_side": 5, "boundary_hidden_size": 32, "fold_count": 4, "held_out_samples_per_fold": 10, "minibatch_size": 512, "optimizer_implementation": "keras", "init": "glorot_uniform", "random_seed": 42, }, "network_budget": { "boundary_networks": 4 * sum( record["model_kind"] == "cleavage_boundary" for record in records), "legacy_control_networks": 4 * sum( record["model_kind"] != "cleavage_boundary" for record in records), "total_networks": 4 * len(records), }, "records": records, } (out_dir / "manifest.json").write_text( json.dumps(manifest, indent=2, sort_keys=True) + "\n") with (out_dir / "manifest.csv").open("w", newline="") as fd: writer = csv.DictWriter(fd, fieldnames=MANIFEST_FIELDS) writer.writeheader() writer.writerows(records) return manifest def build_kernel_conditions(): """Return the fixed 48-fit paired width experiment, without mixed ensembles.""" bases = build_conditions( architectures=("large_relu",), peptide_context_lengths=(5,)) result = [] for width in KERNEL_WIDTHS: for _, grid, axes in bases: if axes["model_kind"] == "legacy_no_flank": continue grid = deepcopy(grid) grid[0].update( convolutional_kernel_size=width, convolutional_padding_mode="unknown", restore_best_weights=True, ) family = ("legacy_5aa" if axes["model_kind"] == "legacy_5aa" else "boundary_5x5") result.append(("%s__k%02d" % (family, width), grid, { "family": family, "kernel_width": width, "fold_count": 4, "network_count": 4, "convolutional_padding_mode": "unknown", "checkpoint_policy": "best", })) return result def main(argv=None): """Write the experiment design.""" parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("out_dir") parser.add_argument( "--architectures", nargs="+", choices=tuple(ARCHITECTURES.values()), default=None, ) parser.add_argument( "--peptide-context-lengths", nargs="+", type=int, default=None, ) parser.add_argument("--no-controls", action="store_true") parser.add_argument( "--design", default="processing-cleavage-boundaries", ) args = parser.parse_args(argv) print(json.dumps(write_conditions( args.out_dir, architectures=args.architectures, peptide_context_lengths=args.peptide_context_lengths, include_controls=not args.no_controls, design=args.design, ), indent=2, sort_keys=True)) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/generate_processing_recipe.py000066400000000000000000000123721525677230600250100ustar00rootroot00000000000000"""The paired 64-fit processing optimizer/initialization/batch factorial.""" from copy import deepcopy from generate_processing_cleavage_boundaries import build_kernel_conditions def build_processing_recipe_conditions(): """Return 32 family-specific recipes, each evaluated on two paired folds.""" anchors = [(grid[0], axes) for _, grid, axes in build_kernel_conditions() if axes["kernel_width"] == 11] records = [] for optimizer, implementation in (("adam", "keras"), ("rmsprop", "pytorch")): for method in ("none", "orthogonal", "lsuv_pre", "lsuv_post"): for batch in (512, 1024): for base, axes in anchors: hp = deepcopy(base) hp.update(optimizer=optimizer, optimizer_implementation=implementation, initialization_method=method, initialization_batch_size=512, minibatch_size=batch, learning_rate=0.001, convolutional_kernel_l1_l2=[0.0, 0.0], save_all_checkpoints=True, restore_best_weights=True) name = "%s__%s_%s__%s__mb%d" % ( axes["family"], optimizer, implementation, method, batch) records.append((name, [hp], { **axes, "fold_count": 2, "network_count": 2, "initialization": method, "optimizer": optimizer, "optimizer_implementation": implementation, "batch_size": batch})) return records def processing_candidate_hyperparameters(kernel_width=13, optimizer="rmsprop"): """Return the explicit shortlisted processing recipe, not a public default. The optimizer/width must still pass confirmation and presentation gates. Ranking checkpoints use inner validation only; patience remains loss-based. """ if kernel_width not in (11, 13, 15) or optimizer not in ("adam", "rmsprop"): raise ValueError("Candidate requires width 11/13/15 and adam/rmsprop") base = next(grid[0] for _, grid, axes in build_kernel_conditions() if axes["family"] == "legacy_5aa" and axes["kernel_width"] == kernel_width) hp = deepcopy(base) hp.update(optimizer=optimizer, optimizer_implementation="keras" if optimizer == "adam" else "pytorch", initialization_method="none", minibatch_size=512, learning_rate=0.001, convolutional_kernel_l1_l2=[0.0, 0.0], save_all_checkpoints=True, restore_best_weights=True, monitor_validation_ranking=True, checkpoint_metric="val_macro_ap") return hp def build_processing_confirmation_conditions(): """Six recipes / 24 paired fits; three retained policies per trajectory.""" records = [] for width in (11, 13, 15): for optimizer in ("adam", "rmsprop"): hp = processing_candidate_hyperparameters(width, optimizer) name = "legacy_5aa__%s_%s__k%02d" % (optimizer, hp["optimizer_implementation"], width) records.append((name, [hp], { "family": "legacy_5aa", "kernel_width": width, "fold_count": 4, "network_count": 4, "optimizer": optimizer, "optimizer_implementation": hp["optimizer_implementation"], "batch_size": 512, "initialization": "none", "checkpoint_policy": "best_ap", "retained_policies": ["best", "best_ap", "terminal"], "stopping_metric": "val_loss"})) return records CONFIRMED_PROCESSING_CANDIDATE = { "condition": "legacy_5aa__rmsprop_pytorch__k13", "kernel_width": 13, "optimizer": "rmsprop", "checkpoint_policy": "best_ap", "control": "legacy_5aa__adam_keras__k11 / best", "experiment": "processing-ranking-confirmation-20260909", "runplz_run_id": "a8889cc8dfbb4f4390d4ceb153ad81e1", "source_commit": "9778c6256b7e99d98238dd19b648a34bfc8f5d9e", "decision_sha256": "5529a81d35defa8939784cabc96f7f077c8918f059a13fee11fb78fafdb29921", "release_accepted": False, } def confirmed_processing_candidate_hyperparameters(): """Return the recipe promoted by the 2026-09-10 ranking confirmation. Development selection only: four paired fits per condition on 37 held-out samples, gated against Adam/Keras width-11 best-loss weights by ``mhcflurry eval processing-confirmation-analysis``. It is not a public default, a release weight set, a compact-ensemble selection or a presentation result; those gates remain separate. """ return processing_candidate_hyperparameters( CONFIRMED_PROCESSING_CANDIDATE["kernel_width"], CONFIRMED_PROCESSING_CANDIDATE["optimizer"]) def main(argv=None): """Write the confirmed candidate as a one-architecture hyperparameter grid.""" import argparse import sys import yaml parser = argparse.ArgumentParser(description=main.__doc__) parser.add_argument("--confirmed-candidate", action="store_true", help="Emit confirmed_processing_candidate_hyperparameters() as YAML on stdout.") args = parser.parse_args(argv) if not args.confirmed_candidate: parser.error("Pass --confirmed-candidate") sys.stdout.write(yaml.safe_dump([confirmed_processing_candidate_hyperparameters()], sort_keys=True)) return 0 if __name__ == "__main__": raise SystemExit(main()) mhcflurry-2.3.6/scripts/training/generate_processing_regularization_activation.py000077500000000000000000000145101525677230600310200ustar00rootroot00000000000000#!/usr/bin/env python """Generate matched 5-aa processing regularization/activation experiments.""" import argparse import csv from copy import deepcopy import hashlib import json from pathlib import Path import yaml from mhcflurry.cli.generate_training_hyperparameters import ( build_processing_ablation_panels, build_processing_variant_grid, ) ACTIVATIONS = ("tanh", "relu", "silu", "gelu") NORMALIZATIONS = ("none", "batch", "layer") ARCHITECTURE_NAMES = ("small", "large") MANIFEST_FIELDS = ( "condition", "architecture", "baseline_condition", "variant", "activation", "normalization", "dropout_rate", "restore_best_weights", "patience", "minibatch_size", "optimizer_implementation", "init", "fold_count", "network_count", "hyperparameters_path", "hyperparameters_sha256", ) def _architecture_controls(): grid = build_processing_variant_grid( build_processing_ablation_panels()["glorot_keras_adam"], "short_flanks", ) keys = { ("tanh", 256, 11): "small", ("relu", 512, 17): "large", } result = { keys.get(( item["convolutional_activation"], item["convolutional_filters"], item["convolutional_kernel_size"], )): item for item in grid } if None in result or set(result) != set(ARCHITECTURE_NAMES): raise RuntimeError("Could not identify representative architectures") return result def build_conditions(): """Return independent, one-factor-at-a-time processing conditions.""" records = [] for architecture, control in _architecture_controls().items(): control_activation = control["convolutional_activation"] control_dropout = control["dropout_rate"] control_patience = control["patience"] variants = [( "control", control_activation, "none", control_dropout, False, control_patience)] variants.extend( ( "activation-%s" % activation, activation, "none", control_dropout, False, control_patience, ) for activation in ACTIVATIONS if activation != control_activation ) variants.extend(( ( "normalization-batch", control_activation, "batch", control_dropout, False, control_patience), ( "normalization-layer", control_activation, "layer", control_dropout, False, control_patience), ( "dropout-half", control_activation, "none", control_dropout / 2.0, False, control_patience), ( "dropout-none", control_activation, "none", 0.0, False, control_patience), ( "restore-best", control_activation, "none", control_dropout, True, control_patience), ( "restore-best-patience-40", control_activation, "none", control_dropout, True, 40), )) baseline = "%s__control" % architecture for ( variant, activation, normalization, dropout_rate, restore_best_weights, patience, ) in variants: item = deepcopy(control) item.update({ "convolutional_activation": activation, "normalization": normalization, "dropout_rate": dropout_rate, "restore_best_weights": restore_best_weights, "patience": patience, }) records.append(("%s__%s" % (architecture, variant), [item], { "architecture": architecture, "baseline_condition": baseline, "variant": variant, "activation": activation, "normalization": normalization, "dropout_rate": dropout_rate, "restore_best_weights": restore_best_weights, "patience": patience, "minibatch_size": item["minibatch_size"], "optimizer_implementation": item["optimizer_implementation"], "init": item["init"], })) return records def write_conditions(out_dir): """Write condition YAMLs and a checksummed manifest.""" out_dir = Path(out_dir) conditions_dir = out_dir / "conditions" conditions_dir.mkdir(parents=True, exist_ok=True) records = [] for condition, grid, axes in build_conditions(): relative_path = Path("conditions") / (condition + ".yaml") payload = yaml.safe_dump(grid, sort_keys=True) (out_dir / relative_path).write_text(payload) records.append({ "condition": condition, **axes, "fold_count": 4, "network_count": 4, "hyperparameters_path": str(relative_path), "hyperparameters_sha256": hashlib.sha256( payload.encode()).hexdigest(), }) manifest = { "schema_version": 1, "design": "processing-5aa-regularization-activation", "fixed_controls": { "flank_length_each_side": 5, "fold_count": 4, "held_out_samples_per_fold": 10, "minibatch_size": 512, "learning_rate": 0.001, "optimizer": "adam", "optimizer_implementation": "keras", "init": "glorot_uniform", "random_seed": 42, }, "architectures": list(ARCHITECTURE_NAMES), "activation_screen": list(ACTIVATIONS), "normalization_screen": list(NORMALIZATIONS), "records": records, } (out_dir / "manifest.json").write_text( json.dumps(manifest, indent=2, sort_keys=True) + "\n") with (out_dir / "manifest.csv").open("w", newline="") as fd: writer = csv.DictWriter(fd, fieldnames=MANIFEST_FIELDS) writer.writeheader() writer.writerows(records) return manifest def main(argv=None): """Write the experiment design requested on the command line.""" parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("out_dir") args = parser.parse_args(argv) print(json.dumps(write_conditions(args.out_dir), indent=2, sort_keys=True)) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/generate_release_hyperparameter_ablations.py000066400000000000000000000055371525677230600300760ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Write the paired hyperparameter panels from the 2.3.0 parity audit.""" import argparse import hashlib import json from pathlib import Path import yaml from mhcflurry.cli.generate_training_hyperparameters import ( build_affinity_ablation_panels, build_processing_ablation_panels, build_processing_batch_sweep_panels, build_processing_variant_grid, ) def write_panels(out_dir): """Write ablation YAML files and a checksummed manifest.""" out_dir = Path(out_dir) out_dir.mkdir(parents=True, exist_ok=True) records = [] def write_yaml(name, values): path = out_dir / name payload = yaml.safe_dump(values, sort_keys=True) path.write_text(payload) records.append({ "path": name, "architectures": len(values), "sha256": hashlib.sha256(payload.encode()).hexdigest(), }) for condition, values in build_affinity_ablation_panels().items(): write_yaml("affinity.%s.yaml" % condition, values) for condition, base_values in build_processing_ablation_panels().items(): for variant in ("with_flanks", "no_flank", "short_flanks"): write_yaml( "processing.%s.%s.yaml" % (condition, variant), build_processing_variant_grid(base_values, variant), ) for condition, values in build_processing_batch_sweep_panels().items(): write_yaml("processing_batch_sweep.%s.yaml" % condition, values) manifest = { "schema_version": 1, "affinity_folds": 4, "processing_folds": 4, "processing_batch_sweep": { "minibatch_sizes": [128, 256, 512, 1024], "priority": ["short_flanks", "no_flank"], "with_flanks_policy": "excluded_except_targeted_8mer_diagnostic", }, "records": records, } manifest_path = out_dir / "manifest.json" manifest_path.write_text(json.dumps(manifest, indent=2, sort_keys=True) + "\n") return manifest def main(argv=None): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("out_dir", help="Directory for YAML panels and manifest") args = parser.parse_args(argv) manifest = write_panels(args.out_dir) print(json.dumps(manifest, indent=2, sort_keys=True)) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/gpu_telemetry.sh000066400000000000000000000045411525677230600223010ustar00rootroot00000000000000#!/usr/bin/env bash # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Sourced by release training scripts. Writes a durable nvidia-smi CSV while a # stage is running so GPU utilization can be analyzed after remote teardown. GPU_TELEMETRY_PID="${GPU_TELEMETRY_PID:-}" start_gpu_telemetry() { local gpu_log="$1" local interval="${2:-${MHCFLURRY_GPU_TELEMETRY_SECONDS:-30}}" stop_gpu_telemetry if [ "${MHCFLURRY_GPU_TELEMETRY:-1}" = "0" ]; then printf >&2 '[gpu_telemetry] disabled; not writing %s\n' "$gpu_log" return 0 fi if ! command -v nvidia-smi >/dev/null 2>&1; then printf >&2 '[gpu_telemetry] nvidia-smi missing; not writing %s\n' "$gpu_log" return 0 fi mkdir -p "$(dirname "$gpu_log")" ( echo "timestamp,gpu_index,util_percent,mem_used_mib,mem_total_mib" while :; do ts=$(date +%s) nvidia-smi \ --query-gpu=index,utilization.gpu,memory.used,memory.total \ --format=csv,noheader,nounits 2>/dev/null \ | awk -F, -v ts="$ts" ' { for (i = 1; i <= NF; i++) { gsub(/^[[:space:]]+|[[:space:]]+$/, "", $i) } print ts "," $1 "," $2 "," $3 "," $4 } ' || true sleep "$interval" done ) > "$gpu_log" 2>/dev/null & GPU_TELEMETRY_PID=$! printf >&2 \ '[gpu_telemetry] started pid=%s interval_seconds=%s log=%s\n' \ "$GPU_TELEMETRY_PID" "$interval" "$gpu_log" } stop_gpu_telemetry() { if [ -n "${GPU_TELEMETRY_PID:-}" ]; then kill "$GPU_TELEMETRY_PID" 2>/dev/null || true wait "$GPU_TELEMETRY_PID" 2>/dev/null || true printf >&2 '[gpu_telemetry] stopped pid=%s\n' "$GPU_TELEMETRY_PID" GPU_TELEMETRY_PID="" fi } mhcflurry-2.3.6/scripts/training/launch_exact_public_processing_modal.py000066400000000000000000000110151525677230600270300ustar00rootroot00000000000000"""Bounded runplz/Modal launcher for the exact-public-data processing replay. Run from a clean ``git archive`` extraction, not the working tree containing large experiment outputs. See docs/exact_public_data_experiment.md. """ import hashlib import json import os from pathlib import Path import subprocess import sys from runplz import App, Image from runplz.backends import modal as runplz_modal VOLUME = "mhcflurry-230-final-weights" RUN_ID = os.environ["EXACT_PUBLIC_RUN_ID"] SOURCE_COMMIT = os.environ["EXACT_PUBLIC_SOURCE_COMMIT"] SOURCE_SHA256 = os.environ["EXACT_PUBLIC_SOURCE_SHA256"] # runplz #165: its current Modal CLI has no detached-run switch. Keep this # adapter explicit until the upstream backend exposes the durable-run option. _subprocess_run = runplz_modal.subprocess.run def _modal_detached(command, *args, **kwargs): command = list(command) if command[:2] == ["modal", "run"] and "--detach" not in command: command.insert(2, "--detach") return _subprocess_run(command, *args, **kwargs) runplz_modal.subprocess.run = _modal_detached app = App("mhcflurry-" + RUN_ID) # A git archive has no .git ancestor. runplz otherwise falls back to the # nested launcher's directory, staging scripts/training rather than the package. app.repo_root = Path(__file__).resolve().parents[2] if not (app.repo_root / "setup.py").is_file(): raise ValueError("Launch from a complete mhcflurry source archive") image = (Image.from_registry("pytorch/pytorch:2.4.0-cuda12.1-cudnn9-runtime") .apt_install("python-is-python3", "bzip2", "build-essential", "git") .pip_install("runplz==4.4.2", "pyarrow", "pypdf", "reportlab") .pip_install_local_dir(".", editable=True)) @app.function( image=image, gpu="A100-40GB", num_gpus=1, min_cpu=8, min_memory=64, timeout=8 * 60 * 60, volumes={"/persist": VOLUME}, env={"EXACT_PUBLIC_RUN_ID": RUN_ID, "EXACT_PUBLIC_SOURCE_COMMIT": SOURCE_COMMIT, "EXACT_PUBLIC_SOURCE_SHA256": SOURCE_SHA256, "MHCFLURRY_DATA_DIR": "/persist/downloads", "MHCFLURRY_DOWNLOADS_CURRENT_RELEASE": "2.2.0", "PYTHONUNBUFFERED": "1", "MHCFLURRY_TORCH_COMPILE": "0", "MHCFLURRY_TORCH_COMPILE_LOSS": "0", "MHCFLURRY_MATMUL_PRECISION": "highest", "MHCFLURRY_ENABLE_TIMING": "1", "MHCFLURRY_FAIL_ON_TRAINING_BATCH_SHRINK": "1", "OMP_NUM_THREADS": "1", "MKL_NUM_THREADS": "1"}) def replay(): """Train, evaluate and preserve results without launching any extra-data run.""" out = Path("/persist/runs") / RUN_ID out.mkdir(parents=True, exist_ok=True) archive = Path("/persist/inputs") / RUN_ID / "source.tar.gz" digest = hashlib.sha256(archive.read_bytes()).hexdigest() if digest != SOURCE_SHA256: raise ValueError("Exact source archive hash mismatch") provenance = {"source_commit": SOURCE_COMMIT, "source_archive": str(archive), "source_archive_sha256": digest, "modal_volume": VOLUME, "gpu": "A100-40GB", "num_gpus": 1, "timeout_seconds": 8 * 60 * 60} (out / "launch_provenance.json").write_text(json.dumps(provenance, indent=2) + "\n") with (out / "pip_freeze.txt").open("w") as fd: subprocess.run([sys.executable, "-m", "pip", "freeze"], stdout=fd, check=True) # Unlike the prior factorial's private staging area, this replay resolves # the actual public baseline from its normal, release-specific bundle. subprocess.run(["mhcflurry-downloads", "fetch", "--release", "2.2.0", "models_class1_pan", "models_class1_processing", "models_class1_presentation", "data_evaluation"], check=True) command = ["mhcflurry", "train", "exact-public-processing", "--out", str(out), "--public-root", "/persist/downloads/2.2.0", "--release-holdout-dir", "/persist/inputs/release_holdout", "--source-commit", SOURCE_COMMIT, "--gpus", "1", "--num-jobs", "1"] with (out / "gpu_occupancy.csv").open("a") as telemetry_file: telemetry = subprocess.Popen([ "nvidia-smi", "--query-gpu=timestamp,index,utilization.gpu,memory.used,memory.total", "--format=csv,noheader,nounits", "--loop-ms=5000"], stdout=telemetry_file) try: subprocess.run(command, check=True) finally: telemetry.terminate() telemetry.wait(timeout=10) Path("/out/modal-volume-receipt.json").write_text(json.dumps({ "status": "complete", "volume": VOLUME, "path": str(out)}, indent=2) + "\n") @app.local_entrypoint() def main(): replay.remote() mhcflurry-2.3.6/scripts/training/launch_pan_allele_training_remote.py000077500000000000000000000766101525677230600263370ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Launch pan-allele training on remote GPU machines. This is the maintained runplz wrapper for the full release workflow and its paired pre-release ablation panels. The release workflow chooses whether Brev should use an existing instance or intentionally provision one by setting RUNPLZ_BREV_* environment variables before invoking ``runplz brev``. Local runs should call the shell scripts directly. """ from __future__ import annotations import os import subprocess import sys from pathlib import Path try: from runplz import App, Image from runplz.config import BrevConfig except ImportError as e: raise SystemExit( "runplz is required for this launcher. Install it with " "`pip install runplz` or run pan_allele_release_full.sh locally." ) from e APP_NAME = os.environ.get("RUNPLZ_APP_NAME", "mhcflurry-pan-allele-training") GPU_TYPE = os.environ.get("RUNPLZ_GPU", "A100") NUM_GPUS = int(os.environ.get("RUNPLZ_NUM_GPUS", "4")) MIN_GPU_MEMORY = int(os.environ.get("RUNPLZ_MIN_GPU_MEMORY", "35")) MIN_CPU = int(os.environ.get("RUNPLZ_MIN_CPU", "32")) MIN_MEMORY = int(os.environ.get("RUNPLZ_MIN_MEMORY", "300")) _MIN_DISK_VALUE = os.environ.get("RUNPLZ_MIN_DISK", "1000").strip() MIN_DISK = ( None if _MIN_DISK_VALUE.lower() in {"", "none", "null"} else int(_MIN_DISK_VALUE) ) _OUTPUT_VOLUME_NAME = os.environ.get("RUNPLZ_OUTPUT_VOLUME", "").strip() OUTPUT_VOLUMES = ( {"/out": _OUTPUT_VOLUME_NAME} if _OUTPUT_VOLUME_NAME else {} ) # Modal rejects function timeouts above 24 hours before allocating a worker. # Keep the shared launcher valid on every backend by default; long release # jobs resume from their persistent manifests in another 24-hour window. FUNCTION_TIMEOUT_SECONDS = int(os.environ.get( "RUNPLZ_TIMEOUT_SECONDS", str(60 * 60 * 24))) DEFAULT_OUT = os.environ.get( "MHCFLURRY_OUT", "/root/mhcflurry-pan-allele-training-run" ) TRUE_ENV_VALUES = {"1", "true", "yes", "on"} FALSE_ENV_VALUES = {"0", "false", "no", "off"} REMOTE_WORKFLOW_SCRIPTS = { "full": "scripts/training/pan_allele_release_full.sh", "affinity-ablations": ( "scripts/training/run_release_affinity_ablations.sh" ), "processing-ablations": ( "scripts/training/run_release_processing_ablations.sh" ), "processing-cleavage-boundaries": ( "scripts/training/run_processing_cleavage_boundaries_remote.sh" ), "processing-cleavage-boundary-radius": ( "scripts/training/run_processing_cleavage_boundary_radius_remote.sh" ), } def env_bool(environ, name, default=False): value = environ.get(name) if value is None: return default normalized = value.strip().lower() if normalized in TRUE_ENV_VALUES: return True if normalized in FALSE_ENV_VALUES: return False raise ValueError( "%s must be one of %s or %s; got %r" % ( name, sorted(TRUE_ENV_VALUES), sorted(FALSE_ENV_VALUES), value, ) ) def compare_torch_compile_value(environ): value = environ.get( "COMPARE_TORCH_COMPILE", environ.get("MHCFLURRY_TORCH_COMPILE", "auto"), ) normalized = value.strip().lower() if normalized in TRUE_ENV_VALUES: return "1" if normalized in FALSE_ENV_VALUES: return "0" if normalized == "auto": return "auto" raise ValueError( "COMPARE_TORCH_COMPILE must be auto, true/false, or 1/0; got %r" % value ) def compare_matmul_precision_value(environ): value = environ.get( "COMPARE_MATMUL_PRECISION", environ.get("MHCFLURRY_MATMUL_PRECISION", "highest"), ) normalized = value.strip().lower() if normalized not in {"none", "highest", "high", "medium"}: raise ValueError( "COMPARE_MATMUL_PRECISION must be one of none, highest, high, " "medium; got %r" % value ) return normalized def env_int_optional(environ, name): value = environ.get(name) if value is None or not value.strip(): return None return int(value) def env_csv_tuple(environ, name, default): value = environ.get(name) if value is None: return default if not value.strip(): return () return tuple(item.strip() for item in value.split(",") if item.strip()) def remote_workflow_script(environ=os.environ): """Return the committed shell entrypoint selected for this remote run.""" workflow = environ.get("MHCFLURRY_REMOTE_WORKFLOW", "full") try: return workflow, REMOTE_WORKFLOW_SCRIPTS[workflow] except KeyError as error: raise ValueError( "MHCFLURRY_REMOTE_WORKFLOW must be one of %s; got %r" % ( ", ".join(sorted(REMOTE_WORKFLOW_SCRIPTS)), workflow, ) ) from error def validate_local_release_source(repo, environ=os.environ): """Reject mislabeled or locally modified source for release launches.""" expected_commit = environ.get( "MHCFLURRY_RELEASE_GIT_COMMIT", "").strip() if not expected_commit: return actual_commit = subprocess.check_output( ["git", "-C", str(repo), "rev-parse", "HEAD"], text=True, ).strip() if actual_commit != expected_commit: raise ValueError( "MHCFLURRY_RELEASE_GIT_COMMIT=%s does not match local HEAD %s" % ( expected_commit, actual_commit)) status = subprocess.check_output( [ "git", "-C", str(repo), "status", "--porcelain", "--untracked-files=all", "--", "mhcflurry", "scripts", "setup.py", "setup.cfg", ], text=True, ).strip() if status: raise ValueError( "Release launch source has modified or untracked executable files; " "commit them before running:\n%s" % status) def validate_smoke_output(environ=os.environ): """Keep reduced-scale smoke runs out of release output paths.""" flag = environ.get("MHCFLURRY_RELEASE_SMOKE", "0").strip() if flag in ("", "0"): return if flag != "1": raise ValueError("MHCFLURRY_RELEASE_SMOKE must be 0 or 1; got %r" % flag) out = (environ.get("MHCFLURRY_RELEASE_OUT", "") or environ.get("RUNPLZ_OUT", "") or environ.get("MHCFLURRY_OUT", "")) if "smoke" not in out: raise ValueError( "MHCFLURRY_RELEASE_SMOKE=1 requires an output path containing 'smoke'; " "got %r" % out) def write_runplz_output_pointer(out, environ=os.environ): """Record the stable release path inside a detached run's own output dir. Detached Modal runs collect ``RUNPLZ_OUT`` (``/out/runplz/``), while the release writes to ``MHCFLURRY_RELEASE_OUT`` so relaunches resume in place. The pointer tells whoever collects the run where the weights actually are. """ runplz_out = environ.get("RUNPLZ_OUT", "").strip() if not runplz_out or Path(runplz_out).resolve() == Path(out).resolve(): return None pointer = Path(runplz_out) / "mhcflurry_release_out.txt" pointer.parent.mkdir(parents=True, exist_ok=True) pointer.write_text(str(out) + "\n") return pointer def brev_config_from_env(environ=os.environ): return BrevConfig( auto_create_instances=env_bool( environ, "RUNPLZ_BREV_AUTO_CREATE", default=False ), instance_type=( environ.get("RUNPLZ_BREV_INSTANCE_TYPE") or environ.get("BREV_INSTANCE_TYPE") or None ), mode=environ.get("RUNPLZ_BREV_MODE", "container"), on_finish=environ.get("RUNPLZ_BREV_ON_FINISH", "leave"), max_runtime_seconds=env_int_optional( environ, "RUNPLZ_BREV_MAX_RUNTIME_SECONDS" ), ssh_ready_wait_seconds=int( environ.get("RUNPLZ_BREV_SSH_READY_WAIT_SECONDS", "2400") ), instance_type_fallback_count=int( environ.get("RUNPLZ_BREV_INSTANCE_TYPE_FALLBACK_COUNT", "3") ), exclude_providers=env_csv_tuple( environ, "RUNPLZ_BREV_EXCLUDE_PROVIDERS", ("oci",) ), ) def remote_training_env(environ=os.environ): env = { "COMPARE_INCLUDE": environ.get( "COMPARE_INCLUDE", "affinity,processing,presentation" ), "EVAL_MAX_BENCHMARK_FILES": environ.get( "EVAL_MAX_BENCHMARK_FILES", "" ), "PROCESSING_EVALUATION_COHORT": environ.get("PROCESSING_EVALUATION_COHORT", ""), "COMPARE_BASELINE": environ.get("COMPARE_BASELINE", "public:2.2.0"), "COMPARE_BASELINE_LABEL": environ.get( "COMPARE_BASELINE_LABEL", "MHCflurry 2.2" ), "COMPARE_BACKEND": environ.get("COMPARE_BACKEND", "auto"), "COMPARE_GPUS": environ.get("COMPARE_GPUS", "auto"), "COMPARE_MATMUL_PRECISION": environ.get( "COMPARE_MATMUL_PRECISION", environ.get("MHCFLURRY_MATMUL_PRECISION", "highest"), ), "COMPARE_MAX_TASKS_PER_WORKER": environ.get( "COMPARE_MAX_TASKS_PER_WORKER", environ.get("MAX_TASKS_PER_WORKER", "12"), ), "COMPARE_MAX_WORKERS_PER_GPU": environ.get( "COMPARE_MAX_WORKERS_PER_GPU", "auto" ), "COMPARE_NUM_JOBS": environ.get("COMPARE_NUM_JOBS", "auto"), "COMPARE_PRESENTATION_MAX_TASKS_PER_WORKER": environ.get( "COMPARE_PRESENTATION_MAX_TASKS_PER_WORKER", "1" ), "COMPARE_PRESENTATION_MAX_WORKERS_PER_GPU": environ.get( "COMPARE_PRESENTATION_MAX_WORKERS_PER_GPU", "auto" ), "COMPARE_PRESENTATION_NUM_JOBS": environ.get( "COMPARE_PRESENTATION_NUM_JOBS", "auto" ), "COMPARE_PRESENTATION_TORCH_COMPILE": environ.get( "COMPARE_PRESENTATION_TORCH_COMPILE", "0" ), "COMPARE_TORCH_COMPILE": environ.get( "COMPARE_TORCH_COMPILE", environ.get("MHCFLURRY_TORCH_COMPILE", "0"), ), # This must be a path visible inside the remote runplz job. Do not # inherit DATA_DIR from the local shell; in the release wrapper that is # a control-machine path and is handled by explicit staging instead. "DATA_DIR": environ.get("RUNPLZ_EVAL_DATA_DIR", ""), "DATALOADER_NUM_WORKERS": environ.get("DATALOADER_NUM_WORKERS", "auto"), "AFFINITY_NUM_JOBS": environ.get("AFFINITY_NUM_JOBS", ""), "AFFINITY_DATALOADER_NUM_WORKERS": environ.get( "AFFINITY_DATALOADER_NUM_WORKERS", "" ), "AFFINITY_ABLATION_CONDITIONS": environ.get( "AFFINITY_ABLATION_CONDITIONS", "" ), "AFFINITY_ABLATION_BASELINE_DIR": environ.get( "AFFINITY_ABLATION_BASELINE_DIR", "" ), "AFFINITY_OPTIMIZER_IMPLEMENTATION": environ.get( "AFFINITY_OPTIMIZER_IMPLEMENTATION", "keras" ), "AFFINITY_LSUV_TARGET": environ.get( "AFFINITY_LSUV_TARGET", "post_activation" ), "AFFINITY_INIT": environ.get( "AFFINITY_INIT", "glorot_uniform" ), "MAX_TASKS_PER_WORKER": environ.get("MAX_TASKS_PER_WORKER", "12"), "MAX_WORKERS_PER_GPU": environ.get("MAX_WORKERS_PER_GPU", "auto"), # PyTorch/Inductor workers load GNU OpenMP (libgomp). The PyTorch # conda image also includes mkl-service, whose INTEL threading default # aborts when libgomp is already loaded. "MKL_THREADING_LAYER": environ.get("MKL_THREADING_LAYER", "GNU"), "MHCFLURRY_ENABLE_TIMING": environ.get("MHCFLURRY_ENABLE_TIMING", "1"), "MHCFLURRY_GPU_TELEMETRY": environ.get( "MHCFLURRY_GPU_TELEMETRY", "1" ), "MHCFLURRY_GPU_TELEMETRY_SECONDS": environ.get( "MHCFLURRY_GPU_TELEMETRY_SECONDS", "30" ), "MHCFLURRY_TORCH_COMPILE": environ.get("MHCFLURRY_TORCH_COMPILE", "0"), "MHCFLURRY_TORCH_COMPILE_LOSS": environ.get( "MHCFLURRY_TORCH_COMPILE_LOSS", "0" ), "MHCFLURRY_MATMUL_PRECISION": environ.get( "MHCFLURRY_MATMUL_PRECISION", "highest" ), "MHCFLURRY_RELEASE_WORKFLOW_ID": environ.get( "MHCFLURRY_RELEASE_WORKFLOW_ID", "" ), "MHCFLURRY_RELEASE_GIT_COMMIT": environ.get( "MHCFLURRY_RELEASE_GIT_COMMIT", "" ), "MHCFLURRY_RELEASE_VERSION": environ.get( "MHCFLURRY_RELEASE_VERSION", "" ), "MHCFLURRY_RELEASE_RECIPE": environ.get( "MHCFLURRY_RELEASE_RECIPE", "" ), "MHCFLURRY_RELEASE_SMOKE": environ.get("MHCFLURRY_RELEASE_SMOKE", "0"), "MHCFLURRY_RELEASE_DATA_VINTAGE": environ.get( "MHCFLURRY_RELEASE_DATA_VINTAGE", ""), "MHCFLURRY_RELEASE_OUT": environ.get("MHCFLURRY_RELEASE_OUT", ""), "MHCFLURRY_REMOTE_WORKFLOW": environ.get( "MHCFLURRY_REMOTE_WORKFLOW", "full" ), "BOUNDARY_RADIUS_ARCHITECTURE": environ.get( "BOUNDARY_RADIUS_ARCHITECTURE", "large_relu" ), "BOUNDARY_RADIUS_AFFINITY_CONTROL": environ.get( "BOUNDARY_RADIUS_AFFINITY_CONTROL", "none" ), "BOUNDARY_RADIUS_BASE_RUN": environ.get( "BOUNDARY_RADIUS_BASE_RUN", "" ), "BOUNDARY_RADIUS_HOLDOUT_DIR": environ.get( "BOUNDARY_RADIUS_HOLDOUT_DIR", "" ), "BOUNDARY_RADIUS_OUT": environ.get("BOUNDARY_RADIUS_OUT", ""), "BOUNDARY_RADIUS_PARALLEL_CONDITIONS": environ.get( "BOUNDARY_RADIUS_PARALLEL_CONDITIONS", "1" ), "BOUNDARY_RADIUS_TRAIN_DATA": environ.get( "BOUNDARY_RADIUS_TRAIN_DATA", "" ), "MATMUL_PRECISION": environ.get("MATMUL_PRECISION", "highest"), "MATMUL_PRECISION_CLI": environ.get( "MATMUL_PRECISION_CLI", "highest" ), "NUM_JOBS": environ.get("NUM_JOBS", "auto"), "PRESENTATION_PROCESSING_WITH_FLANKS_KIND": environ.get( "PRESENTATION_PROCESSING_WITH_FLANKS_KIND", "short_flanks" ), "PRESENTATION_DECOYS_PER_HIT": environ.get( "PRESENTATION_DECOYS_PER_HIT", "2" ), "PRESENTATION_SAMPLE_FRACTION": environ.get( "PRESENTATION_SAMPLE_FRACTION", "0.1" ), "PRESENTATION_FEATURE_CHUNK_SIZE": environ.get( "PRESENTATION_FEATURE_CHUNK_SIZE", "250000" ), "PRESENTATION_NUM_JOBS": environ.get("PRESENTATION_NUM_JOBS", "auto"), "PRESENTATION_MAX_WORKERS_PER_GPU": environ.get( "PRESENTATION_MAX_WORKERS_PER_GPU", "auto" ), "PRESENTATION_CALIBRATION_NUM_JOBS": environ.get( "PRESENTATION_CALIBRATION_NUM_JOBS", "auto" ), "PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU": environ.get( "PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU", "auto" ), "PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE": environ.get( "PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE", "auto" ), "PRESENTATION_MODES": environ.get( "PRESENTATION_MODES", "with_flanks,without_flanks" ), "PAPER_FIGURES_SCORES_DIR": environ.get( "PAPER_FIGURES_SCORES_DIR", environ.get("PAPER_FIGURES_ARTIFACTS_DIR", ""), ), "PAPER_FIGURES_ARTIFACTS_DIR": environ.get( "PAPER_FIGURES_ARTIFACTS_DIR", "" ), "PAPER_FIGURES_MULTIALLELIC_PREDICTIONS": environ.get( "PAPER_FIGURES_MULTIALLELIC_PREDICTIONS", "" ), "PAPER_FIGURES_MONOALLELIC_PREDICTIONS": environ.get( "PAPER_FIGURES_MONOALLELIC_PREDICTIONS", "" ), "PAPER_FIGURES_FORMATS": environ.get( "PAPER_FIGURES_FORMATS", "svg,pdf,png" ), "PAPER_FIGURES_CANDIDATE_PREDICTOR": environ.get( "PAPER_FIGURES_CANDIDATE_PREDICTOR", "" ), "PAPER_FIGURES_EXTERNAL_BASELINES": environ.get( "PAPER_FIGURES_EXTERNAL_BASELINES", "" ), "PAPER_FIGURES_PREFERRED_PREDICTORS": environ.get( "PAPER_FIGURES_PREFERRED_PREDICTORS", "" ), "PAPER_FIGURES_PRESENTATION_PANEL_PREDICTORS": environ.get( "PAPER_FIGURES_PRESENTATION_PANEL_PREDICTORS", "" ), "PAPER_FIGURES_PRESENTATION_PANEL_BASELINES": environ.get( "PAPER_FIGURES_PRESENTATION_PANEL_BASELINES", "" ), "PROCESSING_VARIANTS": environ.get( "PROCESSING_VARIANTS", "with_flanks no_flank short_flanks" ), "PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS": environ.get( "PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS", "0" ), "PROCESSING_SHORT_FLANKS_HYPERPARAMETERS": environ.get( "PROCESSING_SHORT_FLANKS_HYPERPARAMETERS", "grid" ), "PROCESSING_HELD_OUT_SAMPLES": environ.get( "PROCESSING_HELD_OUT_SAMPLES", "10" ), "PROCESSING_NUM_JOBS": environ.get("PROCESSING_NUM_JOBS", "auto"), "PROCESSING_MAX_WORKERS_PER_GPU": environ.get( "PROCESSING_MAX_WORKERS_PER_GPU", "auto" ), "PROCESSING_MODES": environ.get( "PROCESSING_MODES", "with_flanks,no_flank,short_flanks" ), "RUN_LABEL": environ.get("RUN_LABEL", "new"), "RUN_RELEASE_EVAL": environ.get("RUN_RELEASE_EVAL", "0"), "RUN_RELEASE_PLOTS": environ.get("RUN_RELEASE_PLOTS", "0"), "RELEASE_RANDOM_SEED": environ.get("RELEASE_RANDOM_SEED", "42"), "TORCHINDUCTOR_COMPILE_THREADS": environ.get( "TORCHINDUCTOR_COMPILE_THREADS", "auto" ), "TRAINING_MINIBATCH_SIZE": environ.get("TRAINING_MINIBATCH_SIZE", "128"), } # Detached Modal runs reject any RUNPLZ_OUT key, even empty, and assign # their own per-run path; use MHCFLURRY_RELEASE_OUT for a stable, resumable # output path there. Attached launches that set RUNPLZ_OUT keep it. if environ.get("RUNPLZ_OUT", "").strip(): env["RUNPLZ_OUT"] = environ["RUNPLZ_OUT"] for name in ( "AFFINITY_MINIBATCH_SIZE", "AFFINITY_MAX_WORKERS_PER_GPU", "PROCESSING_MINIBATCH_SIZE", ): if name in environ: env[name] = environ[name] return env image = ( Image.from_registry( os.environ.get( "RUNPLZ_IMAGE", "pytorch/pytorch:2.4.0-cuda12.1-cudnn9-runtime", ) ) .apt_install( "python-is-python3", "bzip2", "wget", "rsync", "build-essential", "git", "libhdf5-dev", "libxml2-dev", "libxslt1-dev", "procps", ) .pip_install("pypdf") # The bootstrap re-imports this launcher inside the remote image, so its # runplz runtime must understand every decorator argument used above. # 4.4.2 matches the other maintained Modal launchers and supports the # detached submission and result-receipt contract used by long runs. .pip_install("runplz==4.4.2") .pip_install_local_dir(".", editable=True) ) app = App( APP_NAME, brev_config=brev_config_from_env(), ) @app.function( image=image, gpu=GPU_TYPE, num_gpus=NUM_GPUS, min_gpu_memory=MIN_GPU_MEMORY, min_cpu=MIN_CPU, min_memory=MIN_MEMORY, min_disk=MIN_DISK, volumes=OUTPUT_VOLUMES, timeout=FUNCTION_TIMEOUT_SECONDS, env=remote_training_env(), ) def train_release_full(): """Run the selected maintained release or ablation workflow.""" validate_smoke_output() # Bootstrap working directories differ by backend (Brev historically # starts in the repository, while Modal starts at ``/``). Resolve from # this staged launcher so every relative workflow path means the same # thing on every backend. repo = Path(__file__).resolve().parents[2] out = Path( os.environ.get("MHCFLURRY_RELEASE_OUT") or os.environ.get("RUNPLZ_OUT") or os.environ.get("MHCFLURRY_OUT") or DEFAULT_OUT ).resolve() write_runplz_output_pointer(out) env = os.environ.copy() env.update({"MHCFLURRY_OUT": str(out), "REPO": str(repo)}) workflow, workflow_script = remote_workflow_script(env) if workflow != "full" and ( env_bool(env, "RUN_RELEASE_EVAL", default=False) or env_bool(env, "RUN_RELEASE_PLOTS", default=False)): raise ValueError( "Remote evaluation/plotting is only valid for the full workflow" ) workflow_id = env.get("MHCFLURRY_RELEASE_WORKFLOW_ID", "").strip() exit_path = None if workflow_id: marker_dir = out / ".runplz" marker_dir.mkdir(parents=True, exist_ok=True) (marker_dir / "mhcflurry_release_workflow_id").write_text(workflow_id) exit_path = marker_dir / "mhcflurry_release_workflow_exit_code" try: exit_path.unlink() except FileNotFoundError: pass marker_dir = out / ".runplz" marker_dir.mkdir(parents=True, exist_ok=True) (marker_dir / "mhcflurry_remote_workflow").write_text(workflow) try: subprocess.run( ["bash", workflow_script], check=True, cwd=repo, env=env, ) if workflow == "full": validate_remote_release_artifacts(repo, out, env) if env_bool(env, "RUN_RELEASE_EVAL", default=False): run_release_evaluation(repo, out, env) if env_bool(env, "RUN_RELEASE_PLOTS", default=False): run_release_plots(repo, out, env) except subprocess.CalledProcessError as e: if exit_path is not None: exit_path.write_text(str(e.returncode)) raise except Exception: if exit_path is not None: exit_path.write_text("1") raise else: if exit_path is not None: exit_path.write_text("0") def validate_remote_release_artifacts(repo, out, env): """Validate remote outputs before runplz reports training success.""" release = env.get("MHCFLURRY_RELEASE_VERSION", "").strip() commit = env.get("MHCFLURRY_RELEASE_GIT_COMMIT", "").strip() workflow_id = env.get("MHCFLURRY_RELEASE_WORKFLOW_ID", "").strip() missing = [ name for name, value in ( ("MHCFLURRY_RELEASE_VERSION", release), ("MHCFLURRY_RELEASE_GIT_COMMIT", commit), ("MHCFLURRY_RELEASE_WORKFLOW_ID", workflow_id), ) if not value ] if missing: raise ValueError( "Remote release validation requires: %s" % ", ".join(missing) ) subprocess.run( [ sys.executable, str(repo / "scripts" / "release" / "validate_release_provenance.py"), "--artifact-only", "--run-dir", str(out), "--release", release, "--workflow-id", workflow_id, "--processing-variants", env.get( "PROCESSING_VARIANTS", "with_flanks no_flank short_flanks", ), "--require-artifacts", "--expected-artifact-git-commit", commit, "--expected-artifact-workflow-id", workflow_id, "--out", str(out / "release_provenance.json"), ], check=True, cwd=repo, env=env, ) def run_release_evaluation(repo, out, env): """Fetch release eval data and run compare-models on the remote GPU box.""" eval_out = out / "eval_comparison" eval_out.mkdir(parents=True, exist_ok=True) data_dir = env.get("DATA_DIR", "").strip() if data_dir: if not Path(data_dir).is_dir(): raise SystemExit( "DATA_DIR does not exist on the remote machine: %s" % data_dir ) download_names = [ "models_class1_pan", "models_class1_processing", "models_class1_presentation", ] else: download_names = [ "data_evaluation", "models_class1_pan", "models_class1_processing", "models_class1_presentation", ] if "affinity" in env.get( "COMPARE_INCLUDE", "affinity,processing,presentation").split(","): download_names.append("models_class1_pan_variants") subprocess.run( ["mhcflurry", "downloads", "fetch"] + download_names, check=True, cwd=repo, env=env, ) if not data_dir: data_dir = subprocess.check_output( ["mhcflurry", "downloads", "path", "data_evaluation"], cwd=repo, env=env, text=True, ).strip() baseline = env.get("COMPARE_BASELINE", "public:2.2.0") if baseline.startswith("public:"): baseline_env = env.copy() baseline_env["MHCFLURRY_DOWNLOADS_CURRENT_RELEASE"] = ( baseline.split(":", 1)[1] ) subprocess.run( [ "mhcflurry", "downloads", "fetch", "models_class1_pan", "models_class1_processing", "models_class1_presentation", ], check=True, cwd=repo, env=baseline_env, ) compare_args = [ "mhcflurry", "eval", "compare-models", "--a", str(out), "--a-label", env.get("RUN_LABEL", "new"), "--b", env.get("COMPARE_BASELINE", "public:2.2.0"), "--b-label", env.get("COMPARE_BASELINE_LABEL", "MHCflurry 2.2"), "--data-dir", data_dir, "--release-holdout-dir", str(out / "release_holdout"), "--affinity-training-overlap-policy", "audit", "--include", env.get("COMPARE_INCLUDE", "affinity,processing,presentation"), "--processing-modes", env.get( "PROCESSING_MODES", "with_flanks,no_flank,short_flanks" ), "--presentation-modes", env.get( "PRESENTATION_MODES", "with_flanks,without_flanks" ), "--out", str(eval_out), "--backend", env.get("COMPARE_BACKEND", "auto"), "--num-jobs", env.get("COMPARE_NUM_JOBS", "auto"), "--max-workers-per-gpu", env.get("COMPARE_MAX_WORKERS_PER_GPU", "auto"), "--max-tasks-per-worker", env.get("COMPARE_MAX_TASKS_PER_WORKER", "12"), "--presentation-num-jobs", env.get( "COMPARE_PRESENTATION_NUM_JOBS", "auto"), "--presentation-max-workers-per-gpu", env.get( "COMPARE_PRESENTATION_MAX_WORKERS_PER_GPU", "auto" ), "--presentation-max-tasks-per-worker", env.get( "COMPARE_PRESENTATION_MAX_TASKS_PER_WORKER", "1" ), "--presentation-torch-compile", compare_torch_compile_value({ "COMPARE_TORCH_COMPILE": env.get( "COMPARE_PRESENTATION_TORCH_COMPILE", "0" ) }), "--worker-log-dir", str(eval_out / "worker_logs"), "--torch-compile", compare_torch_compile_value(env), "--matmul-precision", compare_matmul_precision_value(env), ] if env.get("PROCESSING_EVALUATION_COHORT", "").strip(): compare_args.extend(["--processing-matched-cohort", env["PROCESSING_EVALUATION_COHORT"]]) compare_gpus = env.get("COMPARE_GPUS", "auto") if compare_gpus.strip().lower() != "auto": compare_args.extend(["--gpus", compare_gpus]) eval_max_benchmark_files = env.get( "EVAL_MAX_BENCHMARK_FILES", "" ).strip() if eval_max_benchmark_files: compare_args.extend(["--limit-files", eval_max_benchmark_files]) subprocess.run(compare_args, check=True, cwd=repo, env=env) if "affinity" in env.get( "COMPARE_INCLUDE", "affinity,processing,presentation").split(","): variants_dir = subprocess.check_output( ["mhcflurry", "downloads", "path", "models_class1_pan_variants"], cwd=repo, env=env, text=True).strip() baseline_dir = str(Path(variants_dir) / "models.no_additional_ms") fair_out = out / "eval_comparison_train_excluded_affinity" fair_args = list(compare_args) replacements = { "--b": baseline_dir, "--b-label": "MHCflurry no-additional-MS (train-excluded)", "--include": "affinity", "--affinity-training-overlap-policy": "exclude", "--out": str(fair_out), "--worker-log-dir": str(fair_out / "worker_logs"), } for flag, value in replacements.items(): fair_args[fair_args.index(flag) + 1] = value fair_args.extend([ "--b-affinity-dir", baseline_dir, "--affinity-source", "no_additional_ms", ]) subprocess.run(fair_args, check=True, cwd=repo, env=env) def run_release_plots(repo, out, env): """Render compare-models plots before the remote instance is cleaned up.""" plot_args = [ "mhcflurry", "eval", "plot-comparison", "--input", str(out / "eval_comparison"), "--a-label", env.get("RUN_LABEL", "new"), "--b-label", env.get("COMPARE_BASELINE_LABEL", "MHCflurry 2.2"), "--summary-pdf", str(out / "eval_comparison" / "plots" / "model_comparison_figures.pdf"), "--paper-figures-out", str(out / "eval_comparison" / "plots" / "paper_figures"), "--paper-figures-formats", env.get("PAPER_FIGURES_FORMATS", "svg,pdf,png"), "--include-paper-figures-in-summary-pdf", ] scores_dir = ( env.get("PAPER_FIGURES_SCORES_DIR", "").strip() or str(out / "eval_comparison") ) plot_args.extend(["--paper-figures-scores-dir", scores_dir]) multiallelic_predictions = env.get( "PAPER_FIGURES_MULTIALLELIC_PREDICTIONS", "").strip() monoallelic_predictions = env.get( "PAPER_FIGURES_MONOALLELIC_PREDICTIONS", "").strip() if multiallelic_predictions: plot_args.extend([ "--paper-figures-multiallelic-predictions", multiallelic_predictions, ]) if monoallelic_predictions: plot_args.extend([ "--paper-figures-monoallelic-predictions", monoallelic_predictions, ]) passthrough = ( ("PAPER_FIGURES_CANDIDATE_PREDICTOR", "--paper-figures-candidate-predictor"), ("PAPER_FIGURES_EXTERNAL_BASELINES", "--paper-figures-external-baselines"), ("PAPER_FIGURES_PREFERRED_PREDICTORS", "--paper-figures-preferred-predictors"), ("PAPER_FIGURES_PRESENTATION_PANEL_PREDICTORS", "--paper-figures-presentation-panel-predictors"), ("PAPER_FIGURES_PRESENTATION_PANEL_BASELINES", "--paper-figures-presentation-panel-baselines"), ) for env_name, flag in passthrough: value = env.get(env_name, "").strip() if value: plot_args.extend([flag, value]) subprocess.run(plot_args, check=True, cwd=repo, env=env) fair_out = out / "eval_comparison_train_excluded_affinity" if fair_out.is_dir(): subprocess.run([ "mhcflurry", "eval", "plot-comparison", "--input", str(fair_out), "--a-label", env.get("RUN_LABEL", "new"), "--b-label", "MHCflurry no-additional-MS (train-excluded)", "--summary-pdf", str(fair_out / "plots/model_comparison_figures.pdf"), ], check=True, cwd=repo, env=env) @app.local_entrypoint() def main(): validate_smoke_output() validate_local_release_source(Path.cwd()) train_release_full.remote() mhcflurry-2.3.6/scripts/training/launch_processing_kernel_sweep_modal.py000066400000000000000000000252671525677230600270670ustar00rootroot00000000000000"""Single-A100 runplz/Modal launcher for the matched processing width sweep. Launch from a frozen source extraction using ``runplz modal --detach``. Use ``runplz status/collect --outputs-dir ...`` with the resulting receipt. """ import hashlib import os from pathlib import Path import shutil import subprocess import sys from runplz import App, Image RUN_ID = os.environ["PROCESSING_KERNEL_RUN_ID"] SOURCE_COMMIT = os.environ["PROCESSING_KERNEL_SOURCE_COMMIT"] SOURCE_SHA256 = os.environ["PROCESSING_KERNEL_SOURCE_SHA256"] RESUME_MATCHING_DIR = os.environ.get("PROCESSING_KERNEL_RESUME_MATCHING_DIR", "") PRIOR_SWEEP = os.environ.get("PROCESSING_KERNEL_PRIOR_SWEEP", "") TRAIN_DATA = os.environ.get("PROCESSING_KERNEL_TRAIN_DATA", "") EVALUATION = os.environ.get("PROCESSING_KERNEL_EVALUATION", "none") RECIPE_AFTER_WIDTHS = os.environ.get("PROCESSING_RECIPE_AFTER_WIDTHS", "0") == "1" RANKING_CONFIRMATION = os.environ.get("PROCESSING_RANKING_CONFIRMATION", "0") == "1" TIMEOUT = int(os.environ.get("PROCESSING_KERNEL_TIMEOUT_SECONDS", str(8 * 60 * 60))) DEADLINE = os.environ.get("MHCFLURRY_EXPERIMENT_DEADLINE_EPOCH", "") if not 1 <= TIMEOUT <= int(15.5 * 60 * 60): raise ValueError("Processing campaign timeout exceeds the approved first allocation") if RECIPE_AFTER_WIDTHS and not DEADLINE: raise ValueError("A combined campaign requires an absolute budget deadline") if RANKING_CONFIRMATION and (not DEADLINE or not TRAIN_DATA or RECIPE_AFTER_WIDTHS or TIMEOUT > 4 * 60 * 60): raise ValueError("Ranking confirmation requires frozen data, an absolute deadline and at most four GPU-hours") if EVALUATION not in ("all", "none"): raise ValueError("PROCESSING_KERNEL_EVALUATION must be all or none") VOLUME = "mhcflurry-230-final-weights" PRIOR_VOLUME = "mhcflurry-processing-cleavage-f50c70f8c-20260904" app = App("mhcflurry-" + RUN_ID) app.repo_root = Path(__file__).resolve().parents[2] if not (app.repo_root / "setup.py").is_file(): raise ValueError("Launch from a complete frozen mhcflurry source extraction") image = (Image.from_registry("pytorch/pytorch:2.4.0-cuda12.1-cudnn9-runtime") .apt_install("python-is-python3", "bzip2", "build-essential", "git") .pip_install("runplz==4.4.2", "pyarrow", "pypdf", "reportlab") .pip_install_local_dir(".", editable=True)) @app.function( image=image, gpu="A100-40GB", num_gpus=1, min_cpu=8, min_memory=64, timeout=TIMEOUT, volumes={"/out": VOLUME, "/prior": PRIOR_VOLUME}, env={"PROCESSING_KERNEL_RUN_ID": RUN_ID, "PROCESSING_KERNEL_SOURCE_COMMIT": SOURCE_COMMIT, "PROCESSING_KERNEL_SOURCE_SHA256": SOURCE_SHA256, "PROCESSING_KERNEL_RESUME_MATCHING_DIR": RESUME_MATCHING_DIR, "PROCESSING_KERNEL_PRIOR_SWEEP": PRIOR_SWEEP, "PROCESSING_KERNEL_TRAIN_DATA": TRAIN_DATA, "PROCESSING_KERNEL_EVALUATION": EVALUATION, "PROCESSING_KERNEL_TIMEOUT_SECONDS": str(TIMEOUT), "PROCESSING_RECIPE_AFTER_WIDTHS": "1" if RECIPE_AFTER_WIDTHS else "0", "PROCESSING_RANKING_CONFIRMATION": "1" if RANKING_CONFIRMATION else "0", "MHCFLURRY_EXPERIMENT_DEADLINE_EPOCH": DEADLINE, "MHCFLURRY_DATA_DIR": "/out/downloads", "MHCFLURRY_DOWNLOADS_CURRENT_RELEASE": "2.2.0", "PYTHONUNBUFFERED": "1", "MHCFLURRY_TORCH_COMPILE": "0", "MHCFLURRY_TORCH_COMPILE_LOSS": "0", "MHCFLURRY_MATMUL_PRECISION": "highest", "MHCFLURRY_ENABLE_TIMING": "1", "MHCFLURRY_FAIL_ON_TRAINING_BATCH_SHRINK": "1", "OMP_NUM_THREADS": "1", "MKL_NUM_THREADS": "1"}) def sweep(): """Preserve preparation failures and never fall back to unmatched negatives.""" out = Path(os.environ["RUNPLZ_OUT"]) out.mkdir(parents=True, exist_ok=True) sys.path.insert(0, str(Path(__file__).resolve().parent)) from run_exact_public_processing import Driver, write_json driver = Driver(out) archive = Path("/out/inputs") / RUN_ID / "source.tar.gz" digest = hashlib.sha256(archive.read_bytes()).hexdigest() if digest != SOURCE_SHA256: raise ValueError("Source archive hash mismatch") shutil.copy2(archive, out / "source.tar.gz") write_json(out / "launch_provenance.json", { "source_commit": SOURCE_COMMIT, "source_archive_sha256": digest, "modal_volume": VOLUME, "run_id": RUN_ID, "output_path": str(out), "gpu": "A100-40GB", "num_gpus": 1, "timeout_seconds": TIMEOUT, "resume_matching_dir": RESUME_MATCHING_DIR or None, "prior_sweep": PRIOR_SWEEP or None, "frozen_train_data": TRAIN_DATA or None, "evaluation": EVALUATION, "recipe_after_widths": RECIPE_AFTER_WIDTHS, "ranking_confirmation": RANKING_CONFIRMATION, "absolute_budget_deadline_epoch": DEADLINE or None}) with (out / "pip_freeze.txt").open("w") as fd: subprocess.run([sys.executable, "-m", "pip", "freeze"], stdout=fd, check=True) public = Path("/out/downloads/2.2.0") holdout = Path("/out/inputs/release_holdout") shared = out / "processing.shared" shared.mkdir(exist_ok=True) with (out / "gpu_occupancy.csv").open("a") as telemetry_file: telemetry = subprocess.Popen([ "nvidia-smi", "--query-gpu=timestamp,index,utilization.gpu,memory.used,memory.total", "--format=csv,noheader,nounits", "--loop-ms=5000"], stdout=telemetry_file) try: resume_args = ["--resume-matching-dir", RESUME_MATCHING_DIR] if RESUME_MATCHING_DIR else [] if TRAIN_DATA: source = Path(TRAIN_DATA) if not source.is_file(): raise ValueError("Missing frozen matched training data: " + TRAIN_DATA) train_data = source else: train_data = shared / "train_data.csv" driver.run("matched-training-data", ["mhcflurry", "train", "processing-data", *resume_args, "--hits", "/prior/processing.shared/hits_with_tpm.csv.bz2", "--affinity-predictor", public / "models_class1_pan/models.combined", "--proteome-reference-csv", public / "data_references/uniprot_proteins.csv.bz2", "--ppv-multiplier", 100, "--negative-policy", "matched", "--decoys-per-hit", 1, "--max-affinity-distance", 0.25, "--exclude-samples-file", holdout / "processing_samples.csv", "--random-seed", 42, "--out", train_data, "--gpus", 1, "--num-jobs", 1, "--max-workers-per-gpu", 1, "--max-tasks-per-worker", 100, "--torch-compile", 0, "--matmul-precision", "highest"]) recovery_args = ["--resume-from", PRIOR_SWEEP] if PRIOR_SWEEP else [] if RANKING_CONFIRMATION: driver.run("ranking-confirmation", ["mhcflurry", "train", "processing-hyperparameter-sweep", "--design", "ranking-confirmation", "--out", out / "ranking_confirmation", "--train-data", train_data, "--folds-from", train_data, "--public-root", public, "--release-holdout-dir", holdout, "--source-commit", SOURCE_COMMIT, "--gpus", 1, "--num-jobs", 1, "--evaluation", "none", "--save-all-checkpoints"]) return driver.run("kernel-sweep", ["mhcflurry", "train", "processing-kernel-sweep", "--out", out / "kernel_sweep", "--train-data", train_data, "--public-root", public, "--release-holdout-dir", holdout, "--source-commit", SOURCE_COMMIT, "--gpus", 1, "--num-jobs", 1, "--evaluation", EVALUATION, "--save-all-checkpoints", *recovery_args]) figures = out / "kernel_sweep" panels = [{"title": "Processing kernel-width sweep", "text": "48 fits: six widths, two unmixed families, four paired folds. " "Best validation checkpoints; matched negatives. Validation has one " "negative per hit. Release evaluation mode: " + EVALUATION + ". " "If included, release results are exploratory, not an untouched test."}] for path in sorted(figures.glob("*/loss_plots/*.png")): panels.append({"title": path.parent.parent.name + " / " + path.stem, "text": "Per-condition epoch traces; full fit histories are in model manifests.", "image": str(path)}) write_json(out / "figure_panels.json", panels) evaluation_pdf = (["--pdf", figures / "evaluation/kernel_width.pdf"] if EVALUATION == "all" else []) driver.run("all-figures", ["mhcflurry", "eval", "collate-figures", "--pdf", figures / "validation_kernel_width.pdf", *evaluation_pdf, "--addendum", out / "figure_panels.json", "--out", out / "all-figures.pdf"]) if RECIPE_AFTER_WIDTHS: frozen = figures / "inputs/training_with_folds.csv.bz2" driver.run("training-recipe-sweep", ["mhcflurry", "train", "processing-hyperparameter-sweep", "--design", "training-recipe", "--out", out / "recipe_sweep", "--train-data", frozen, "--folds-from", frozen, "--public-root", public, "--release-holdout-dir", holdout, "--source-commit", SOURCE_COMMIT, "--gpus", 1, "--num-jobs", 1, "--evaluation", "none", "--save-all-checkpoints"]) panels.append({"title": "Processing optimizer / initialization / batch screen", "text": "64 fits on two paired development folds. Learning rate 0.001; " "one matched negative per hit. Confirm finalists on four folds. " "No new release evaluation or final ensemble selection in this stage."}) for path in sorted((out / "recipe_sweep").glob("*/loss_plots/*.png")): panels.append({"title": path.parent.parent.name + " / " + path.stem, "text": "Epoch histories, best/terminal checkpoints and member predictions retained.", "image": str(path)}) write_json(out / "campaign_figure_panels.json", panels) driver.run("campaign-all-figures", ["mhcflurry", "eval", "collate-figures", "--pdf", figures / "validation_kernel_width.pdf", "--pdf", out / "recipe_sweep/validation_training_recipe.pdf", "--addendum", out / "campaign_figure_panels.json", "--out", out / "campaign-all-figures.pdf"]) finally: telemetry.terminate() telemetry.wait(timeout=10) @app.local_entrypoint() def main(): sweep.remote() mhcflurry-2.3.6/scripts/training/launch_saved_candidate_evaluation_modal.py000066400000000000000000000152001525677230600274570ustar00rootroot00000000000000"""Run saved-candidate evaluation through runplz/Modal, without training.""" import hashlib import json import os from pathlib import Path import subprocess import sys import threading import time from runplz import App, Image from runplz.backends import modal as runplz_modal VOLUME = "mhcflurry-230-final-weights" RUN_ID = os.environ["SAVED_EVAL_RUN_ID"] SOURCE_COMMIT = os.environ["SAVED_EVAL_SOURCE_COMMIT"] SOURCE_SHA256 = os.environ["SAVED_EVAL_SOURCE_SHA256"] CANDIDATE_RUN = os.environ["SAVED_EVAL_CANDIDATE_RUN"] EXACT_RUN = os.environ.get("SAVED_EVAL_EXACT_RUN", "") PHASE = os.environ.get("SAVED_EVAL_PHASE", "all") for value in (RUN_ID, CANDIDATE_RUN, EXACT_RUN): if value and (Path(value).name != value or value in (".", "..")): raise ValueError("Run IDs must be single directory names") # Explicit adapter pending runplz #165 (durable detached execution). _subprocess_run = runplz_modal.subprocess.run def _modal_detached(command, *args, **kwargs): command = list(command) if command[:2] == ["modal", "run"] and "--detach" not in command: command.insert(2, "--detach") return _subprocess_run(command, *args, **kwargs) runplz_modal.subprocess.run = _modal_detached app = App("mhcflurry-" + RUN_ID) app.repo_root = Path(__file__).resolve().parents[2] if not (app.repo_root / "setup.py").is_file(): raise ValueError("Launch from a complete clean source archive") image = (Image.from_registry("pytorch/pytorch:2.4.0-cuda12.1-cudnn9-runtime") .apt_install("python-is-python3", "bzip2", "build-essential", "git") .pip_install("runplz==4.4.2", "pyarrow", "pypdf", "reportlab") .pip_install_local_dir(".", editable=True)) @app.function( image=image, gpu="A100-40GB", num_gpus=1, min_cpu=8, min_memory=64, timeout=8 * 60 * 60, volumes={"/persist": VOLUME}, env={"SAVED_EVAL_RUN_ID": RUN_ID, "SAVED_EVAL_SOURCE_COMMIT": SOURCE_COMMIT, "SAVED_EVAL_SOURCE_SHA256": SOURCE_SHA256, "SAVED_EVAL_CANDIDATE_RUN": CANDIDATE_RUN, "SAVED_EVAL_EXACT_RUN": EXACT_RUN, "SAVED_EVAL_PHASE": PHASE, "MHCFLURRY_DATA_DIR": "/persist/downloads", "MHCFLURRY_DOWNLOADS_CURRENT_RELEASE": "2.2.0", "PYTHONUNBUFFERED": "1", "MHCFLURRY_TORCH_COMPILE": "0", "MHCFLURRY_TORCH_COMPILE_LOSS": "0", "MHCFLURRY_MATMUL_PRECISION": "highest", "OMP_NUM_THREADS": "1", "MKL_NUM_THREADS": "1"}) def evaluate(): out = Path("/persist/runs") / RUN_ID out.mkdir(parents=True, exist_ok=True) archive = Path("/persist/inputs") / RUN_ID / "source.tar.gz" digest = hashlib.sha256(archive.read_bytes()).hexdigest() if digest != SOURCE_SHA256: raise ValueError("Evaluator source archive hash mismatch") provenance = {"evaluator_commit": SOURCE_COMMIT, "source_archive_sha256": digest, "candidate_run": CANDIDATE_RUN, "exact_run": EXACT_RUN, "phase": PHASE, "gpu": "A100-40GB", "gpus": 1, "timeout_seconds": 8 * 60 * 60, "networks_trained_here": 0} path = out / "launch_provenance.json" if path.exists() and json.loads(path.read_text()) != provenance: raise ValueError("Refusing changed launch provenance") path.write_text(json.dumps(provenance, indent=2) + "\n") with (out / "pip_freeze.txt").open("w") as fd: subprocess.run([sys.executable, "-m", "pip", "freeze"], stdout=fd, check=True) subprocess.run(["mhcflurry-downloads", "fetch", "--release", "2.2.0", "models_class1_pan", "models_class1_pan_variants", "models_class1_processing", "models_class1_presentation", "data_evaluation"], check=True) command = ["mhcflurry", "eval", "saved-candidate", "--out", str(out), "--candidate", "/persist/runs/" + CANDIDATE_RUN, "--public-root", "/persist/downloads/2.2.0", "--release-holdout-dir", "/persist/inputs/release_holdout", "--source-commit", SOURCE_COMMIT, "--phase", PHASE] if EXACT_RUN: command += ["--exact-processing-run", "/persist/runs/" + EXACT_RUN] (out / "driver_command.json").write_text(json.dumps(command, indent=2) + "\n") monitor_stop = threading.Event() def monitor_memory(): # Durable cgroup counters distinguish OOM pressure from other # cancellations without relying on a surviving Python traceback. with (out / "memory_occupancy.jsonl").open("a") as fd: while not monitor_stop.is_set(): record = {"unix_time": time.time()} for name in ("memory.current", "memory.peak", "memory.max", "memory.events"): path = Path("/sys/fs/cgroup") / name if path.is_file(): record[name] = path.read_text().strip() if "memory.current" not in record: # Modal's sandbox may hide cgroups. RSS is not a cgroup # usage/limit measurement (shared pages may be counted twice). result = subprocess.run(["ps", "-eo", "pid=,ppid=,rss="], capture_output=True, text=True) record["process_rss_kib"] = result.stdout.strip() record["process_rss_returncode"] = result.returncode record["cgroup_counters_available"] = False fd.write(json.dumps(record) + "\n") fd.flush() monitor_stop.wait(5) monitor = threading.Thread(target=monitor_memory, daemon=True) monitor.start() with (out / "gpu_occupancy.csv").open("a") as telemetry_file, (out / "driver.log").open("a") as log: telemetry = subprocess.Popen([ "nvidia-smi", "--query-gpu=timestamp,index,utilization.gpu,memory.used,memory.total", "--format=csv,noheader,nounits", "--loop-ms=5000"], stdout=telemetry_file) try: subprocess.run(command, check=True, stdout=log, stderr=subprocess.STDOUT) except BaseException as error: (out / "failure.json").write_text(json.dumps({ "unix_time": time.time(), "error": repr(error), "returncode": getattr(error, "returncode", None), }, indent=2) + "\n") print("Saved evaluation failed; durable driver log:", out / "driver.log", flush=True) raise finally: telemetry.terminate() telemetry.wait(timeout=10) monitor_stop.set() monitor.join(timeout=10) Path("/out/modal-volume-receipt.json").write_text(json.dumps({ "status": "complete", "volume": VOLUME, "path": str(out)}, indent=2) + "\n") @app.local_entrypoint() def main(): evaluate.remote() mhcflurry-2.3.6/scripts/training/paired_sample_metrics.py000066400000000000000000000162771525677230600237760ustar00rootroot00000000000000#!/usr/bin/env python3 """Estimate paired sample uncertainty from saved per-sample metric tables.""" import argparse import hashlib import json import os from pathlib import Path import numpy import pandas def comparison_long_frame(frame, *, units, condition, metrics, labels): """Convert compare-models paired a_/b_ columns without changing cohorts.""" if len(labels) != 2 or labels[0] == labels[1]: raise ValueError("Require distinct side A and B labels") shared = units + [name for name in ("n", "n_pos") if name in frame and name not in units] pieces = [] for prefix, label in zip(("a", "b"), labels): columns = {prefix + "_" + metric: metric for metric in metrics} piece = frame[shared + list(columns)].rename(columns=columns).copy() piece[condition] = label pieces.append(piece) return pandas.concat(pieces, ignore_index=True) def paired_summary(frame, *, units, condition, metrics, baseline, replicates=10000, seed=42): """Bootstrap complete matched samples; never silently drop unmatched rows.""" if replicates < 1: raise ValueError("replicates must be positive") keys = units + [condition] if frame[keys].isna().any().any() or frame.duplicated(keys).any(): raise ValueError("Sample/condition identities must be nonmissing and unique") wide = frame.set_index(keys)[metrics].unstack(condition).sort_index() if baseline not in frame[condition].unique(): raise ValueError("Baseline condition is missing") if len(wide) < 2 or not numpy.isfinite(wide.to_numpy()).all(): raise ValueError("Require at least two complete, finite matched samples") for count in ("n", "n_pos"): if count in frame: sizes = frame.set_index(keys)[count].unstack(condition) if (sizes.nunique(axis=1) != 1).any(): raise ValueError("Unmatched sample counts: %s" % count) rng = numpy.random.default_rng(seed) # Resample samples together across conditions and metrics. This estimates # uncertainty of equal-sample macro means, not pooled (micro) metrics. indices = rng.integers(0, len(wide), size=(replicates, len(wide))) summary = [] differences = [] draws = {} for name in sorted(set(frame[condition]) - {baseline}): for metric in metrics: delta = wide[(metric, name)] - wide[(metric, baseline)] bootstrap = delta.to_numpy()[indices].mean(axis=1) lower, upper = numpy.quantile(bootstrap, [0.025, 0.975]) summary.append({ "condition": name, "baseline": baseline, "metric": metric, "samples": len(delta), "mean": wide[(metric, name)].mean(), "baseline_mean": wide[(metric, baseline)].mean(), "delta": delta.mean(), "ci_low": lower, "ci_high": upper, "samples_improved": int((delta > 0).sum()), "samples_regressed": int((delta < 0).sum()), }) values = delta.rename("delta").reset_index() values["condition"] = name values["metric"] = metric differences.append(values) draws["%s:%s" % (name, metric)] = bootstrap if not summary: raise ValueError("Need at least one alternative condition") return pandas.DataFrame(summary), pandas.concat(differences), draws def select_conditions(frame, column, names, baseline): """Restrict an archived screen to explicitly named comparisons.""" if not names: return frame if baseline not in names or set(names) - set(frame[column]): raise ValueError("Selected conditions must exist and include the baseline") return frame.loc[frame[column].isin(names)].copy() def main(argv=None): parser = argparse.ArgumentParser( prog=os.environ.get("MHCFLURRY_CLI_PROG"), description=__doc__) parser.add_argument("--metrics", required=True) parser.add_argument("--unit-columns", nargs="+", required=True) parser.add_argument("--condition-column", required=True) parser.add_argument("--metric-columns", nargs="+", required=True) parser.add_argument("--baseline", required=True) parser.add_argument("--comparison-labels", nargs=2, metavar=("A", "B"), help="Read compare-models a_/b_ metric columns with these side labels.") parser.add_argument("--scope", help="Select rows whose scope column equals this value") parser.add_argument("--conditions", nargs="+", help="Include only these named conditions, including baseline.") parser.add_argument("--replicates", type=int, default=10000) parser.add_argument("--seed", type=int, default=42) parser.add_argument("--out", required=True) args = parser.parse_args(argv) source = Path(args.metrics) frame = pandas.read_csv(source, dtype={name: str for name in args.unit_columns}) if args.scope: frame = frame.loc[frame.scope == args.scope].copy() if args.comparison_labels: frame = comparison_long_frame(frame, units=args.unit_columns, condition=args.condition_column, metrics=args.metric_columns, labels=args.comparison_labels) frame = select_conditions(frame, args.condition_column, args.conditions, args.baseline) summary, differences, draws = paired_summary( frame, units=args.unit_columns, condition=args.condition_column, metrics=args.metric_columns, baseline=args.baseline, replicates=args.replicates, seed=args.seed) out = Path(args.out) out.mkdir(parents=True, exist_ok=True) frame.to_csv(out / "paired_input.csv", index=False) summary.to_csv(out / "summary.csv", index=False) differences.to_csv(out / "sample_differences.csv", index=False) numpy.savez_compressed(out / "bootstrap_deltas.npz", **draws) provenance = { "arguments": vars(args), "input_sha256": hashlib.sha256(source.read_bytes()).hexdigest(), "method": "paired sample percentile bootstrap, equal-sample macro mean", "limitations": "Exploratory, conditional on trained models; no correction for model selection or multiple comparisons.", } (out / "provenance.json").write_text(json.dumps(provenance, indent=2) + "\n") import matplotlib matplotlib.use("Agg") from matplotlib import pyplot fig, axes = pyplot.subplots( 1, len(args.metric_columns), figsize=(12, max(3, len(draws) * 0.35)), squeeze=False, layout="constrained") for axis, metric in zip(axes[0], args.metric_columns): values = summary.loc[summary.metric == metric].reset_index(drop=True) y = numpy.arange(len(values)) axis.hlines(y, values.ci_low, values.ci_high, color="#26728e", linewidth=2) axis.scatter(values.delta, y, color="#173f5f", zorder=3) axis.axvline(0, color="gray", linestyle="--", linewidth=1) axis.set_yticks(y, labels=values.condition) axis.set_title(metric) axis.set_xlabel("Macro difference (95% paired sample interval)") axis.invert_yaxis() fig.suptitle("Reference: %s" % args.baseline) for extension in ("svg", "png"): fig.savefig(out / ("paired_sample_intervals." + extension), dpi=180) pyplot.close(fig) print(summary.to_string(index=False)) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/pan_allele_release_affinity.sh000077500000000000000000000552601525677230600251100ustar00rootroot00000000000000#!/usr/bin/env bash # # Exact replication of the public mhcflurry pan-allele release training # recipe (models_class1_pan, 2.2.0's GENERATE.sh — local mode, not # cluster). Uses the same curated_training_data and pretrain data # (random_peptide_predictions), same 4 folds, same architecture sweep, # same min/max-models-per-fold selection, and runs percentile-rank # calibration on the final ensemble. # # Env: # MHCFLURRY_OUT required — where artifacts are written. # Final selected ensemble lives at # $MHCFLURRY_OUT/models.combined/. # NUM_JOBS=N parallelism (default: $GPUS). Controls # how many networks train concurrently; # mhcflurry pairs jobs 1:1 with GPUs. # TRAINING_MINIBATCH_SIZE shared release minibatch default (128) # AFFINITY_MINIBATCH_SIZE affinity-specific override # (default 128, matching 2.1.x/2.2.x) # AFFINITY_OPTIMIZER_IMPLEMENTATION # keras or pytorch (default keras) # AFFINITY_LSUV_TARGET post_activation or pre_activation # (default post_activation) # AFFINITY_INIT affinity initializer (default glorot_uniform) # AFFINITY_HYPERPARAMETERS_FILE # optional pre-generated YAML for controlled # experiments; release runs leave this unset # RELEASE_RANDOM_SEED master seed for folds, fits, random negatives, # and calibration (default 42) # SKIP_CALIBRATE=1 skip percentile calibration for experiments # that compare raw affinity predictions # # Every fit retains both terminal and minimum-validation checkpoint sidecars. # Materialize either policy with `mhcflurry train # materialize-affinity-checkpoint`; the configured restore_best_weights value # still determines the primary weights used by this release workflow. set -euo pipefail set -x : "${MHCFLURRY_OUT:?MHCFLURRY_OUT must be set}" export PYTHONUNBUFFERED=1 # Release weights use eager, full-FP32 matrix multiplication unless a caller # deliberately overrides these controls. Neither compilation nor TF32 has # isolated held-out evidence establishing identical training trajectories. export MHCFLURRY_TORCH_COMPILE="${MHCFLURRY_TORCH_COMPILE:-0}" export MHCFLURRY_TORCH_COMPILE_LOSS="${MHCFLURRY_TORCH_COMPILE_LOSS:-0}" export MHCFLURRY_MATMUL_PRECISION="${MHCFLURRY_MATMUL_PRECISION:-highest}" RELEASE_RANDOM_SEED="${RELEASE_RANDOM_SEED:-42}" # The resource probe should make the configured release minibatch safe. If it # does not, changing optimization dynamics is a provenance failure. export MHCFLURRY_FAIL_ON_TRAINING_BATCH_SHRINK="${MHCFLURRY_FAIL_ON_TRAINING_BATCH_SHRINK:-1}" # Inductor defaults to a large compile helper pool per training process. # With 8-16 concurrent mhcflurry workers that multiplies into thousands of # short-lived subprocesses and can stall the box. Leave the env unset by # default: mhcflurry.parallelism resolves it from the final NUM_JOBS # in the same place that resolves Pool/GPU concurrency. Callers can still # export TORCHINDUCTOR_COMPILE_THREADS before invoking this script to pin. # OMP/MKL/OPENBLAS set via set_cpu_threads helper below — auto-computes # from nproc + GPU/worker layout. Manually override any of them before # calling this script to pin an explicit value. SCRIPT_ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" SCRIPT_DIR="$(dirname "$SCRIPT_ABSOLUTE_PATH")" # shellcheck disable=SC1091 source "$SCRIPT_DIR/set_cpu_threads.sh" mkdir -p "$MHCFLURRY_OUT" cd "$MHCFLURRY_OUT" RELEASE_LOG="$MHCFLURRY_OUT/release_driver.log" HEARTBEAT_LOG="$MHCFLURRY_OUT/release_heartbeat.log" TRAIN_LOG="$MHCFLURRY_OUT/train.log" SELECT_LOG="$MHCFLURRY_OUT/select.log" CALIBRATE_LOG="$MHCFLURRY_OUT/calibrate.log" FETCH_LOG="$MHCFLURRY_OUT/fetch_eval_data.log" EVAL_LOG="$MHCFLURRY_OUT/eval.log" PLOT_LOG="$MHCFLURRY_OUT/plot_loss_curves.log" : > "$RELEASE_LOG" : > "$HEARTBEAT_LOG" : > "$TRAIN_LOG" : > "$SELECT_LOG" : > "$CALIBRATE_LOG" : > "$FETCH_LOG" : > "$EVAL_LOG" : > "$PLOT_LOG" CURRENT_PHASE="bootstrap" GPU_SAMPLER_PID="" HEARTBEAT_PID="" timestamp_utc() { date -u +"%Y-%m-%dT%H:%M:%SZ" } format_command() { printf '%q ' "$@" } log_release_event() { local event="$1" shift || true printf '%s event=%s phase=%s %s\n' \ "$(timestamp_utc)" \ "$event" \ "$CURRENT_PHASE" \ "$*" | tee -a "$RELEASE_LOG" >&2 } write_snapshot() { local reason="$1" { printf '=== snapshot timestamp=%s reason=%s phase=%s pid=%s ppid=%s ===\n' \ "$(timestamp_utc)" \ "$reason" \ "$CURRENT_PHASE" \ "$$" \ "$PPID" printf 'host=%s cwd=%s script=%s\n' \ "$(hostname)" \ "$(pwd)" \ "$SCRIPT_ABSOLUTE_PATH" df -h . 2>/dev/null || true ps -Ao pid,ppid,etime,%cpu,%mem,command --sort=-%cpu 2>/dev/null | head -n 25 || true if command -v nvidia-smi >/dev/null 2>&1; then nvidia-smi \ --query-gpu=index,utilization.gpu,memory.used,memory.total \ --format=csv,noheader,nounits 2>/dev/null || true fi printf '\n' } >> "$HEARTBEAT_LOG" 2>&1 || true } start_heartbeat() { local interval="${RELEASE_HEARTBEAT_SECONDS:-60}" ( while :; do write_snapshot heartbeat sleep "$interval" done ) & HEARTBEAT_PID=$! log_release_event heartbeat_started "pid=$HEARTBEAT_PID interval_seconds=$interval" } stop_background_loggers() { local pid for pid in "${HEARTBEAT_PID:-}" "${GPU_SAMPLER_PID:-}"; do if [ -n "$pid" ]; then kill "$pid" 2>/dev/null || true wait "$pid" 2>/dev/null || true fi done } on_error() { local status="$1" local line="$2" local command="$3" log_release_event error "status=$status line=$line command=$(printf '%q' "$command")" write_snapshot error } on_signal() { local signal_name="$1" log_release_event signal "name=$signal_name" write_snapshot "signal_$signal_name" case "$signal_name" in INT) exit 130 ;; TERM) exit 143 ;; *) exit 1 ;; esac } cleanup_release_logging() { local status="$?" log_release_event script_exit "status=$status" write_snapshot exit stop_background_loggers } run_logged_step() { local phase="$1" local log_file="$2" shift 2 CURRENT_PHASE="$phase" log_release_event phase_start "log=$log_file command=$(format_command "$@")" write_snapshot "phase_start_$phase" set +e ( set -o pipefail "$@" 2>&1 | tee -a "$log_file" ) local status="$?" set -e log_release_event phase_end "status=$status log=$log_file" write_snapshot "phase_end_$phase" return "$status" } trap 'on_error "$?" "$LINENO" "$BASH_COMMAND"' ERR trap 'on_signal INT' INT trap 'on_signal TERM' TERM trap cleanup_release_logging EXIT log_release_event script_start \ "pid=$$ out_dir=$MHCFLURRY_OUT pythonunbuffered=$PYTHONUNBUFFERED torch_compile=$MHCFLURRY_TORCH_COMPILE inductor_threads=${TORCHINDUCTOR_COMPILE_THREADS:-auto} random_seed=$RELEASE_RANDOM_SEED" write_snapshot startup start_heartbeat # ---- GPU occupancy sampler (background, for later analysis) ---------- # Sample nvidia-smi every 30 s into a CSV that rsync-down can pull back. # Captures per-GPU util, memory, and timestamp so we can answer "what # was the steady-state occupancy?" without having to SSH live during # the run. Auto-exits when the training process ends (watches its pid). if command -v nvidia-smi >/dev/null 2>&1; then GPU_LOG="$MHCFLURRY_OUT/gpu_occupancy.csv" { echo "timestamp,gpu_index,util_percent,mem_used_mib,mem_total_mib" while :; do ts=$(date +%s) nvidia-smi \ --query-gpu=index,utilization.gpu,memory.used,memory.total \ --format=csv,noheader,nounits 2>/dev/null \ | while IFS=',' read -r idx util mem_used mem_total; do echo "$ts,${idx// /},${util// /},${mem_used// /},${mem_total// /}" done sleep 30 done } > "$GPU_LOG" 2>/dev/null & GPU_SAMPLER_PID=$! log_release_event gpu_sampler_started "pid=$GPU_SAMPLER_PID log=$GPU_LOG" fi # ---- parallelism ----------------------------------------------------- if command -v nvidia-smi >/dev/null 2>&1; then GPUS=$(nvidia-smi -L 2>/dev/null | wc -l | tr -d ' ') else GPUS=0 fi echo "Detected GPUS: $GPUS" PROCESSORS=$(getconf _NPROCESSORS_ONLN) echo "Detected processors: $PROCESSORS" MAX_WORKERS_PER_GPU_REQUESTED="${MAX_WORKERS_PER_GPU:-auto}" if [ "$GPUS" -eq "0" ]; then NUM_JOBS="${NUM_JOBS:-1}" MAX_WORKERS_PER_GPU=1 else MAX_WORKERS_PER_GPU="$MAX_WORKERS_PER_GPU_REQUESTED" NUM_JOBS="${NUM_JOBS:-auto}" fi if [ "$GPUS" -gt 0 ] && [ "$NUM_JOBS" != "auto" ]; then case "$NUM_JOBS" in *[!0-9]*) echo "NUM_JOBS must be auto or an integer; got '$NUM_JOBS'." >&2 exit 2 ;; esac if [ "$NUM_JOBS" -lt 1 ]; then echo "NUM_JOBS must be at least 1; got '$NUM_JOBS'." >&2 exit 2 fi if [ "$MAX_WORKERS_PER_GPU" = "auto" ]; then echo "NUM_JOBS=$NUM_JOBS with MAX_WORKERS_PER_GPU=auto is unsafe for affinity training; using NUM_JOBS=auto so the training orchestrator can size workers from the minibatch-aware VRAM estimate." >&2 NUM_JOBS=auto else capacity="$(( GPUS * MAX_WORKERS_PER_GPU ))" if [ "$NUM_JOBS" -gt "$capacity" ]; then echo "Clamping NUM_JOBS=$NUM_JOBS to GPU capacity $capacity." >&2 NUM_JOBS="$capacity" fi fi fi echo "Num jobs: $NUM_JOBS (max-workers-per-gpu=$MAX_WORKERS_PER_GPU; requested=$MAX_WORKERS_PER_GPU_REQUESTED)" # Recycle after a bounded number of tasks so compile is still amortized # but leaks / descriptor creep / orphaned-runtime state cannot accumulate # indefinitely inside one worker. Override with MAX_TASKS_PER_WORKER. MAX_TASKS_PER_WORKER="${MAX_TASKS_PER_WORKER:-12}" # DataLoader prefetch workers per training worker. Default ``auto`` is # resolved via the same helper the orchestrator uses so the shell-side OMP # budget and the training hyperparameters stay in lockstep. DATALOADER_NUM_WORKERS="${DATALOADER_NUM_WORKERS:-auto}" DATALOADER_NUM_WORKERS_REQUESTED="$DATALOADER_NUM_WORKERS" PARALLELISM_ARGS=( --num-jobs "$NUM_JOBS" --max-tasks-per-worker "$MAX_TASKS_PER_WORKER" --gpus "$GPUS" --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" --dataloader-num-workers "$DATALOADER_NUM_WORKERS_REQUESTED" # Orchestrator-owned tuning knobs. CLI-resolved values are propagated # to env (MHCFLURRY_TORCH_COMPILE / MHCFLURRY_MATMUL_PRECISION / # MHCFLURRY_ENABLE_TIMING) inside resolve_local_parallelism_args, so # the existing maybe_compile_network / configure_matmul_precision / # _timing_enabled call sites continue to read env unchanged. The release # recipe pins eager/full-FP32 defaults; callers can still override them for # non-release throughput experiments. --random-negative-pool-epochs 1 --torch-compile "${TORCH_COMPILE_CLI:-0}" --matmul-precision "${MATMUL_PRECISION_CLI:-highest}" ) if [ "${MHCFLURRY_ENABLE_TIMING:-0}" = "1" ]; then PARALLELISM_ARGS+=(--enable-timing) fi # The Python planner owns CPU threads when either worker count is automatic, # because only it knows the final workload-aware GPU/RAM/CPU plan. Retain the # shell helper for fully explicit expert configurations. if [ "$NUM_JOBS" != "auto" ] && \ [ "$DATALOADER_NUM_WORKERS_REQUESTED" != "auto" ]; then NUM_JOBS="$NUM_JOBS" GPUS="$GPUS" \ MAX_WORKERS_PER_GPU="$MAX_WORKERS_PER_GPU" \ DATALOADER_NUM_WORKERS="$DATALOADER_NUM_WORKERS_REQUESTED" \ set_cpu_threads else echo "CPU thread budget delegated to workload planner." >&2 fi # ---- data ------------------------------------------------------------ CURRENT_PHASE="data_setup" log_release_event phase_info "starting data download and preprocessing" mhcflurry-downloads fetch data_curated allele_sequences random_peptide_predictions RELEASE_HOLDOUT_ARGS=() if [ -n "${RELEASE_HOLDOUT_DIR:-}" ]; then RELEASE_HOLDOUT_ARGS=( --exclude-pmhcs "$RELEASE_HOLDOUT_DIR/affinity_pmhcs.csv" ) fi mhcflurry class1-reassign-mass-spec-training-data \ "$(mhcflurry-downloads path data_curated)/curated_training_data.csv.bz2" \ --set-measurement-value 100 \ ${RELEASE_HOLDOUT_ARGS[@]+"${RELEASE_HOLDOUT_ARGS[@]}"} \ --out-csv "$(pwd)/train_data.csv" bzip2 -f "$(pwd)/train_data.csv" TRAINING_DATA="$(pwd)/train_data.csv.bz2" # ---- hyperparameters ------------------------------------------------- CURRENT_PHASE="hyperparameters" TRAINING_MINIBATCH_SIZE="${TRAINING_MINIBATCH_SIZE:-128}" AFFINITY_MINIBATCH_SIZE="${AFFINITY_MINIBATCH_SIZE:-$TRAINING_MINIBATCH_SIZE}" # Smoke mode shrinks scale only; every stage and code path still runs. SMOKE_HELPER="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/release_smoke.py" AFFINITY_EVAL_LIMIT_ARGS=() if [ "${MHCFLURRY_RELEASE_SMOKE:-0}" = "1" ]; then CALIBRATE_PEPTIDES_PER_LENGTH="${CALIBRATE_PEPTIDES_PER_LENGTH:-1000}" AFFINITY_EVAL_LIMIT_ARGS=(--limit-files "${EVAL_MAX_BENCHMARK_FILES:-2}") fi AFFINITY_OPTIMIZER_IMPLEMENTATION="${AFFINITY_OPTIMIZER_IMPLEMENTATION:-keras}" AFFINITY_LSUV_TARGET="${AFFINITY_LSUV_TARGET:-post_activation}" AFFINITY_INIT="${AFFINITY_INIT:-glorot_uniform}" if [ -n "${AFFINITY_HYPERPARAMETERS_FILE:-}" ]; then [ -f "$AFFINITY_HYPERPARAMETERS_FILE" ] || { echo "AFFINITY_HYPERPARAMETERS_FILE not found: $AFFINITY_HYPERPARAMETERS_FILE" >&2 exit 2 } cp "$AFFINITY_HYPERPARAMETERS_FILE" hyperparameters.yaml else mhcflurry class1-generate-training-hyperparameters affinity \ --minibatch-size "$AFFINITY_MINIBATCH_SIZE" \ --optimizer-implementation "$AFFINITY_OPTIMIZER_IMPLEMENTATION" \ --data-dependent-initialization-target "$AFFINITY_LSUV_TARGET" \ --init "$AFFINITY_INIT" \ > hyperparameters.yaml fi # ``dataloader_num_workers`` is no longer injected here. The orchestrator # overrides each work item's hyperparameters via the # ``--dataloader-num-workers`` CLI flag at planning time (see # ``apply_dataloader_num_workers_to_work_items``). One source of truth → # saved component-model configs reflect the value the orchestrator # actually chose for the run, not whatever the YAML happened to say. if [ "${MHCFLURRY_RELEASE_SMOKE:-0}" = "1" ]; then python "$SMOKE_HELPER" cap-hyperparameters hyperparameters.yaml --max-architectures 2 --max-epochs 2 fi ARCH_COUNT=$(python -c "import yaml; print(len(yaml.safe_load(open('hyperparameters.yaml'))))") echo "Architectures in sweep: $ARCH_COUNT" ALLELE_SEQUENCES_DIR="$(mhcflurry-downloads path allele_sequences)" ALLELE_SEQUENCES="$(mhcflurry pseudosequences path \ --directory "$ALLELE_SEQUENCES_DIR" \ --length 39 \ --fallback-legacy)" PRETRAIN_DATA="$(mhcflurry-downloads path random_peptide_predictions)/predictions.csv.bz2" # ---- train all candidates (4 folds × ARCH_COUNT architectures) ------ # `combined` is the only kind the public release trains (see GENERATE.sh). for kind in combined do UNSELECTED_DIR="models.unselected.${kind}" CONTINUE_ARGS=() if [ -d "$UNSELECTED_DIR" ]; then log_release_event continue_incomplete "models_dir=$UNSELECTED_DIR" CONTINUE_ARGS=(--continue-incomplete) fi run_logged_step "train_${kind}" "$TRAIN_LOG" \ mhcflurry-class1-train-pan-allele-models \ --data "$TRAINING_DATA" \ --allele-sequences "$ALLELE_SEQUENCES" \ --pretrain-data "$PRETRAIN_DATA" \ --held-out-measurements-per-allele-fraction-and-max 0.25 100 \ --num-folds 4 \ --random-seed "$RELEASE_RANDOM_SEED" \ --hyperparameters hyperparameters.yaml \ --out-models-dir "$(pwd)/$UNSELECTED_DIR" \ --save-all-checkpoints \ --worker-log-dir "$MHCFLURRY_OUT" \ "${PARALLELISM_ARGS[@]}" \ ${CONTINUE_ARGS[@]+"${CONTINUE_ARGS[@]}"} done log_release_event phase_info "training_complete beginning_model_selection" # ---- select --------------------------------------------------------- for kind in combined do UNSELECTED_DIR="models.unselected.${kind}" SELECTED_DIR="models.${kind}" run_logged_step "select_${kind}" "$SELECT_LOG" \ mhcflurry-class1-select-pan-allele-models \ --data "$UNSELECTED_DIR/train_data.csv.bz2" \ --models-dir "$UNSELECTED_DIR" \ --out-models-dir "$SELECTED_DIR" \ --min-models-per-fold 2 \ --max-models-per-fold 8 \ --save-validation-predictions \ "${PARALLELISM_ARGS[@]}" cp "$UNSELECTED_DIR/train_data.csv.bz2" "$SELECTED_DIR/train_data.csv.bz2" # ---- percentile rank calibration (matches release) --------------- # Two throughput-only speedups vs the legacy invocation: # # --gpu-batched: batches many alleles into one forward pass via # the GPU-hoisted fast path. Bit-identical on CUDA; ~5-30x # faster than the per-allele predict() loop. # --alleles-per-work-chunk 30 (was 10): better amortization of # per-chunk fixed costs (pool dispatch, model load, aggregate). # ~3x fewer chunks. Override with CALIBRATE_ALLELES_PER_CHUNK. # The statistical calibration sample remains the published 100000 # peptides per length; only execution batching is changed. SKIP_CALIBRATE="${SKIP_CALIBRATE:-0}" if [ "$SKIP_CALIBRATE" = "1" ]; then log_release_event phase_skipped "SKIP_CALIBRATE=1" continue fi CALIBRATE_PEPTIDES_PER_LENGTH="${CALIBRATE_PEPTIDES_PER_LENGTH:-100000}" CALIBRATE_ALLELES_PER_CHUNK="${CALIBRATE_ALLELES_PER_CHUNK:-30}" # Calibrate's peak VRAM per worker is dominated by the merged # ensemble's peptide-stage cache (~8x stage_dim × n_peptides × 4 # bytes ≈ 6-13 GB depending on architecture). After the GPU # PercentRankTransform.fit move this is GPU-bound (cartesian # forward + bucketize + scatter_add), not Python-bound, so # 1 worker/GPU saturates the SMs on its own — but we let the # auto-resolver pick: it'll choose 1 on small-VRAM cards or # workloads that hit the cache hard, and >1 only when there's # genuine slack. Override with CALIBRATE_MAX_WORKERS_PER_GPU. # Keep --num-jobs on auto by default too: if we manufacture a numeric # ceiling here, the planner must honor it as an explicit CLI override # and overflow workers spill to CPU when MWPG resolves lower. # Override with CALIBRATE_NUM_JOBS only when deliberately pinning. CALIBRATE_NUM_JOBS="${CALIBRATE_NUM_JOBS:-auto}" CALIBRATE_MAX_WORKERS_PER_GPU="${CALIBRATE_MAX_WORKERS_PER_GPU:-auto}" CALIBRATE_PARALLELISM_ARGS=( --num-jobs "$CALIBRATE_NUM_JOBS" --max-tasks-per-worker "$MAX_TASKS_PER_WORKER" --gpus "$GPUS" --max-workers-per-gpu "$CALIBRATE_MAX_WORKERS_PER_GPU" --dataloader-num-workers "$DATALOADER_NUM_WORKERS" --torch-compile "${TORCH_COMPILE_CLI:-0}" --matmul-precision "${MATMUL_PRECISION_CLI:-highest}" ) if [ "${MHCFLURRY_ENABLE_TIMING:-0}" = "1" ]; then CALIBRATE_PARALLELISM_ARGS+=(--enable-timing) fi run_logged_step "calibrate_${kind}" "$CALIBRATE_LOG" \ mhcflurry-calibrate-percentile-ranks \ --models-dir "$SELECTED_DIR" \ --match-amino-acid-distribution-data "$UNSELECTED_DIR/train_data.csv.bz2" \ --motif-summary \ --num-peptides-per-length "$CALIBRATE_PEPTIDES_PER_LENGTH" \ --alleles-per-work-chunk "$CALIBRATE_ALLELES_PER_CHUNK" \ --gpu-batched \ --random-seed "$RELEASE_RANDOM_SEED" \ --verbosity 1 \ "${CALIBRATE_PARALLELISM_ARGS[@]}" done # ---- eval against public release ------------------------------------ # Compares the freshly-trained ensemble vs the published 2.2.0 ensemble # on the data_evaluation hit/decoy benchmark. Per-allele ROC-AUC, # PR-AUC, PPV@N. Skip cleanly with SKIP_EVAL=1. # # CURRENT_PHASE is set unconditionally so the heartbeat / error trap # logs the right phase even when the stage is skipped (otherwise the # preceding ``calibrate_combined`` would leak through). CURRENT_PHASE="eval" SKIP_EVAL="${SKIP_EVAL:-0}" if [ "$SKIP_EVAL" = "1" ]; then log_release_event phase_skipped "SKIP_EVAL=1" else log_release_event phase_info "starting eval against public release" # ``mhcflurry-downloads fetch`` accepts multiple targets via nargs="*" # (see mhcflurry/cli/downloads_command.py:74). Both go to FETCH_LOG so # the per-allele eval output stays unpolluted by extraction progress. run_logged_step "fetch_eval_data" "$FETCH_LOG" \ mhcflurry-downloads fetch data_evaluation models_class1_pan DATA_EVAL_DIR="$(mhcflurry-downloads path data_evaluation)" EVAL_OUT="$MHCFLURRY_OUT/eval_comparison" mkdir -p "$EVAL_OUT" COMPARE_HOLDOUT_ARGS=() if [ -n "${RELEASE_HOLDOUT_DIR:-}" ]; then COMPARE_HOLDOUT_ARGS=( --release-holdout-dir "$RELEASE_HOLDOUT_DIR" --affinity-training-overlap-policy audit ) fi run_logged_step "eval_compare_new_vs_public" "$EVAL_LOG" \ mhcflurry eval compare-models \ --a "$MHCFLURRY_OUT/models.combined" \ --a-label new \ --b public \ --data-dir "$DATA_EVAL_DIR" \ ${COMPARE_HOLDOUT_ARGS[@]+"${COMPARE_HOLDOUT_ARGS[@]}"} \ ${AFFINITY_EVAL_LIMIT_ARGS[@]+"${AFFINITY_EVAL_LIMIT_ARGS[@]}"} \ --include affinity \ --out "$EVAL_OUT" fi # ---- loss-curve plots ----------------------------------------------- # Reads fit_info from the candidate-pool + selected manifests; emits # loss_curves_by_model.png, loss_curves_by_arch.png, per_fold_summary.png, # summary.csv. Skip cleanly with SKIP_PLOTS=1. CURRENT_PHASE="plot" SKIP_PLOTS="${SKIP_PLOTS:-0}" if [ "$SKIP_PLOTS" = "1" ]; then log_release_event phase_skipped "SKIP_PLOTS=1" else PLOT_OUT="$MHCFLURRY_OUT/loss_plots" run_logged_step "plot_loss_curves" "$PLOT_LOG" \ mhcflurry train plot-loss-curves \ --selected-dir "$MHCFLURRY_OUT/models.combined" \ --unselected-dir "$MHCFLURRY_OUT/models.unselected.combined" \ --out "$PLOT_OUT" fi CURRENT_PHASE="complete" log_release_event complete "final_dir=$MHCFLURRY_OUT/models.combined" { echo "Full release-exact pipeline completed." echo "Final ensemble: $MHCFLURRY_OUT/models.combined/" echo "Eval comparison: $MHCFLURRY_OUT/eval_comparison/ (if SKIP_EVAL!=1)" echo "Loss-curve plots: $MHCFLURRY_OUT/loss_plots/ (if SKIP_PLOTS!=1)" ls -la "$MHCFLURRY_OUT/models.combined" | head -30 } | tee -a "$RELEASE_LOG" mhcflurry-2.3.6/scripts/training/pan_allele_release_full.sh000077500000000000000000001016411525677230600242340ustar00rootroot00000000000000#!/usr/bin/env bash # # Full mhcflurry release pipeline: affinity → processing → presentation, # end-to-end at full architecture-sweep size. # # Composition: # - Stage 1 (affinity) delegates to pan_allele_release_affinity.sh, # which carries the heartbeat / write_snapshot / log_release_event # instrumentation, --continue-incomplete resume logic, and the # calibrate + eval-against-public-release phases. # - Stages 2-3 (processing + presentation) are inlined here, with # the full architecture sweep (no truncation). # # Each stage writes to its own subdirectory under MHCFLURRY_OUT so # artifacts don't collide (affinity/, processing/, presentation/). The # downstream eval step in stage 3 uses all three predictors together. # # Resumption: re-running this script reuses incomplete affinity and processing # training directories via --continue-incomplete. Selection, presentation, and # evaluation are deterministic and may be regenerated after training completes. # # Env (caller-tunable; all have sensible defaults): # MHCFLURRY_OUT required — root for all artifacts # REPO path to the mhcflurry repo # (default: this checkout) # MAX_WORKERS_PER_GPU default per-GPU worker cap for shared stages # AFFINITY_MAX_WORKERS_PER_GPU # affinity per-GPU worker cap (default auto) # DATALOADER_NUM_WORKERS 'auto' (default) lets the orchestrator pick # PROCESSING_NUM_JOBS processing worker count (default auto) # PROCESSING_MAX_WORKERS_PER_GPU # processing per-GPU worker cap (default auto) # PROCESSING_HELD_OUT_SAMPLES processing fold holdout (default 10) # PRESENTATION_DECOYS_PER_HIT presentation decoys per hit (default 2) # PRESENTATION_SAMPLE_FRACTION presentation row subsample (default 0.1) # TRAINING_MINIBATCH_SIZE affinity training default (default 128) # AFFINITY_MINIBATCH_SIZE affinity minibatch (default 128) # PROCESSING_MINIBATCH_SIZE processing minibatch (default 512) # PROCESSING_VARIANTS space-separated variants to train # (default "with_flanks no_flank short_flanks") # PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS # 0 disables the optional cleavage-boundary family # (default); 1-15 adds one large-ReLU architecture # over four folds and forms a fixed 50/50 hybrid # with one selected legacy short-flank model/fold # PRESENTATION_PROCESSING_WITH_FLANKS_KIND # processing variant used as presentation's # with-flanks predictor (default short_flanks) # RELEASE_RANDOM_SEED master seed for data generation, folds, fits, # random negatives, and calibration (default 42) # MHCFLURRY_GPU_TELEMETRY 0 disables processing/presentation GPU CSVs # MHCFLURRY_GPU_TELEMETRY_SECONDS # telemetry sampling interval (default 30) # MHCFLURRY_RELEASE_RECIPE optional shared recipe preset; currently # final-2.3.0-candidate set -euo pipefail set -x : "${MHCFLURRY_OUT:?MHCFLURRY_OUT must be set}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" RECIPE_DIR="$SCRIPT_DIR/release_exact" : "${REPO:=$(cd "$SCRIPT_DIR/../.." && pwd)}" # shellcheck disable=SC1091 source "$SCRIPT_DIR/gpu_telemetry.sh" # shellcheck disable=SC1091 source "$SCRIPT_DIR/release_recipes.sh" GPU_TELEMETRY_PID="" trap stop_gpu_telemetry EXIT export PYTHONUNBUFFERED=1 # Same eager/full-FP32 release defaults as the affinity stage. export MHCFLURRY_TORCH_COMPILE="${MHCFLURRY_TORCH_COMPILE:-0}" export MHCFLURRY_TORCH_COMPILE_LOSS="${MHCFLURRY_TORCH_COMPILE_LOSS:-0}" export MHCFLURRY_MATMUL_PRECISION="${MHCFLURRY_MATMUL_PRECISION:-highest}" # Preserve the configured optimization problem for release weights. Affinity # training must fail rather than silently shrink its effective minibatch. export MHCFLURRY_FAIL_ON_TRAINING_BATCH_SHRINK="${MHCFLURRY_FAIL_ON_TRAINING_BATCH_SHRINK:-1}" # Training-data vintage. "current" keeps the 2.2.0 download label: October # 2023 curated affinity data and the 2023 pseudosequence table. "public-2020" # selects the 2.0.0 label, the June 2020 data behind the public 2.1.5 and 2.2 # weights. Mass spec hits are the same December 2019 annotations under both # labels, and every other download URL is identical, so this changes the # affinity training rows and the allele sequence table and nothing else. MHCFLURRY_RELEASE_DATA_VINTAGE="${MHCFLURRY_RELEASE_DATA_VINTAGE:-current}" case "$MHCFLURRY_RELEASE_DATA_VINTAGE" in current) ;; public-2020) export MHCFLURRY_DOWNLOADS_CURRENT_RELEASE=2.0.0 ;; *) echo "MHCFLURRY_RELEASE_DATA_VINTAGE must be current or public-2020." >&2 exit 2 ;; esac echo "training-data vintage: $MHCFLURRY_RELEASE_DATA_VINTAGE (download label ${MHCFLURRY_DOWNLOADS_CURRENT_RELEASE:-default})" BASE_OUT="$MHCFLURRY_OUT" mkdir -p "$BASE_OUT/affinity" "$BASE_OUT/processing" "$BASE_OUT/presentation" # Freeze the final evaluation boundary before any training work. The public # data_evaluation bundle is train-excluded relative to the old public models; # these generated manifests remove the candidate-training pMHC intersection # and select the independent multiallelic source-study holdout. mhcflurry-downloads fetch data_evaluation data_curated data_mass_spec_annotated allele_sequences mkdir -p "$BASE_OUT/config" VINTAGE_ALLELE_DIR="$(mhcflurry-downloads path allele_sequences)" VINTAGE_ALLELE_CSV="$(mhcflurry pseudosequences path --directory "$VINTAGE_ALLELE_DIR" --length 39 --fallback-legacy)" python - "$BASE_OUT/config/data_vintage.json" \ "$MHCFLURRY_RELEASE_DATA_VINTAGE" \ "$(mhcflurry-downloads path data_curated)/curated_training_data.csv.bz2" \ "$(mhcflurry-downloads path data_mass_spec_annotated)/annotated_ms.csv.bz2" \ "$VINTAGE_ALLELE_DIR" "$VINTAGE_ALLELE_CSV" <<'PYVINTAGE' import hashlib, json, os, sys out, vintage, curated, mass_spec, allele_dir, allele_csv = sys.argv[1:7] def digest(path): hasher = hashlib.sha256() with open(path, "rb") as handle: for chunk in iter(lambda: handle.read(1 << 20), b""): hasher.update(chunk) return hasher.hexdigest() record = {"vintage": vintage, "downloads_label": os.environ.get("MHCFLURRY_DOWNLOADS_CURRENT_RELEASE", "default"), "curated_training_data": {"path": curated, "sha256": digest(curated)}, "annotated_ms": {"path": mass_spec, "sha256": digest(mass_spec)}, "allele_sequences_dir": allele_dir, "allele_sequences": {"path": allele_csv, "sha256": digest(allele_csv)}} with open(out, "w") as handle: json.dump(record, handle, indent=2) handle.write("\n") print("recorded data vintage:", json.dumps(record["curated_training_data"])) PYVINTAGE RELEASE_HOLDOUT_DIR="$BASE_OUT/release_holdout" mhcflurry train release-holdout build \ --data-dir "$(mhcflurry-downloads path data_evaluation)" \ --training-data "$(mhcflurry-downloads path data_curated)/curated_training_data.csv.bz2" \ --mass-spec-data "$(mhcflurry-downloads path data_mass_spec_annotated)/annotated_ms.csv.bz2" \ --out-dir "$RELEASE_HOLDOUT_DIR" export RELEASE_HOLDOUT_DIR # Detect GPU count once; reuse for all stages. if command -v nvidia-smi >/dev/null 2>&1; then GPUS=$(nvidia-smi -L 2>/dev/null | wc -l | tr -d ' ') else GPUS=0 fi # Default to auto so each training command exercises the orchestrator's # workload-aware resolver. Affinity training in particular has a # minibatch-sensitive validation footprint; leave worker packing to the # in-process training command, which sees the hyperparameters and row count. MAX_WORKERS_PER_GPU="${MAX_WORKERS_PER_GPU:-auto}" DATALOADER_NUM_WORKERS="${DATALOADER_NUM_WORKERS:-auto}" PROCESSING_HELD_OUT_SAMPLES="${PROCESSING_HELD_OUT_SAMPLES:-10}" PRESENTATION_DECOYS_PER_HIT="${PRESENTATION_DECOYS_PER_HIT:-2}" PRESENTATION_SAMPLE_FRACTION="${PRESENTATION_SAMPLE_FRACTION:-0.1}" PRESENTATION_FEATURE_CHUNK_SIZE="${PRESENTATION_FEATURE_CHUNK_SIZE:-250000}" TRAINING_MINIBATCH_SIZE="${TRAINING_MINIBATCH_SIZE:-128}" AFFINITY_MINIBATCH_SIZE="${AFFINITY_MINIBATCH_SIZE:-$TRAINING_MINIBATCH_SIZE}" AFFINITY_MAX_WORKERS_PER_GPU="${AFFINITY_MAX_WORKERS_PER_GPU:-auto}" PROCESSING_MINIBATCH_SIZE="${PROCESSING_MINIBATCH_SIZE:-512}" PROCESSING_WITH_FLANKS_OPTIMIZER_IMPLEMENTATION="${PROCESSING_WITH_FLANKS_OPTIMIZER_IMPLEMENTATION:-keras}" PROCESSING_WITH_FLANKS_INIT="${PROCESSING_WITH_FLANKS_INIT:-glorot_uniform}" PROCESSING_VARIANTS="${PROCESSING_VARIANTS:-with_flanks no_flank short_flanks}" PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS="${PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS:-0}" PRESENTATION_PROCESSING_WITH_FLANKS_KIND="${PRESENTATION_PROCESSING_WITH_FLANKS_KIND:-short_flanks}" PROCESSING_SHORT_FLANKS_HYPERPARAMETERS="${PROCESSING_SHORT_FLANKS_HYPERPARAMETERS:-grid}" RELEASE_RANDOM_SEED="${RELEASE_RANDOM_SEED:-42}" case "${MHCFLURRY_RELEASE_RECIPE:-}" in '') ;; final-2.3.0-candidate) apply_final_230_candidate_recipe ;; final-2.3.0-candidate-v2) apply_final_230_candidate_v2_recipe ;; *) echo "Unknown MHCFLURRY_RELEASE_RECIPE: $MHCFLURRY_RELEASE_RECIPE" >&2 exit 2 ;; esac # Smoke mode shrinks scale only; every stage and code path still runs. Its # outputs are never release artifacts: the launcher requires a smoke path. SMOKE_HELPER="$SCRIPT_DIR/release_smoke.py" PRESENTATION_CALIBRATION_PEPTIDES_PER_LENGTH="${PRESENTATION_CALIBRATION_PEPTIDES_PER_LENGTH:-10000}" PRESENTATION_CALIBRATION_GENOTYPES="${PRESENTATION_CALIBRATION_GENOTYPES:-50}" if [ "${MHCFLURRY_RELEASE_SMOKE:-0}" = "1" ]; then PRESENTATION_SAMPLE_FRACTION=0.01 PRESENTATION_CALIBRATION_PEPTIDES_PER_LENGTH=500 PRESENTATION_CALIBRATION_GENOTYPES=5 SMOKE_PROCESSING_SAMPLES="${SMOKE_PROCESSING_SAMPLES:-20}" # Folds hold out samples from the reduced pool, so the release value of 10 # would leave too few training samples for the matched inner stopping split. PROCESSING_HELD_OUT_SAMPLES=4 echo "MHCFLURRY_RELEASE_SMOKE=1: reduced-scale run, not a release artifact." >&2 fi case "$PROCESSING_SHORT_FLANKS_HYPERPARAMETERS" in grid|confirmed-ranking-candidate) ;; *) echo "PROCESSING_SHORT_FLANKS_HYPERPARAMETERS must be grid or confirmed-ranking-candidate." >&2 exit 2 ;; esac mkdir -p "$BASE_OUT/config" case "${MHCFLURRY_RELEASE_RECIPE:-}" in final-2.3.0-candidate) cp "$SCRIPT_DIR/final_230_candidate_recipe.json" \ "$BASE_OUT/config/final_architecture_decision.json" ;; final-2.3.0-candidate-v2) cp "$SCRIPT_DIR/final_230_candidate_v2_recipe.json" \ "$BASE_OUT/config/final_architecture_decision.json" ;; esac processing_variant_enabled() { case " $PROCESSING_VARIANTS " in *" $1 "*) return 0 ;; *) return 1 ;; esac } seen_processing_variants=" " for processing_variant in $PROCESSING_VARIANTS; do case "$processing_variant" in with_flanks|no_flank|short_flanks) ;; *) echo "Unknown PROCESSING_VARIANTS entry: $processing_variant" >&2 exit 2 ;; esac case "$seen_processing_variants" in *" $processing_variant "*) echo "Duplicate PROCESSING_VARIANTS entry: $processing_variant" >&2 exit 2 ;; esac seen_processing_variants="$seen_processing_variants$processing_variant " done processing_variant_enabled no_flank || { echo "PROCESSING_VARIANTS must include no_flank for presentation training." >&2 exit 2 } case "$PRESENTATION_PROCESSING_WITH_FLANKS_KIND" in with_flanks|short_flanks) ;; *) echo "PRESENTATION_PROCESSING_WITH_FLANKS_KIND must be with_flanks or short_flanks." >&2 exit 2 ;; esac processing_variant_enabled "$PRESENTATION_PROCESSING_WITH_FLANKS_KIND" || { echo "PROCESSING_VARIANTS must include PRESENTATION_PROCESSING_WITH_FLANKS_KIND=$PRESENTATION_PROCESSING_WITH_FLANKS_KIND." >&2 exit 2 } case "$PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS" in 0) ;; *[!0-9]*|'') echo "PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS must be 0 or an integer from 1 to 15." >&2 exit 2 ;; *) if [ "$PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS" -lt 1 ] || \ [ "$PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS" -gt 15 ]; then echo "PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS must be 0 or an integer from 1 to 15." >&2 exit 2 fi processing_variant_enabled short_flanks || { echo "Boundary hybrid requires short_flanks in PROCESSING_VARIANTS." >&2 exit 2 } if [ "$PRESENTATION_PROCESSING_WITH_FLANKS_KIND" != short_flanks ]; then echo "Boundary hybrid requires PRESENTATION_PROCESSING_WITH_FLANKS_KIND=short_flanks." >&2 exit 2 fi if [ "$PROCESSING_MINIBATCH_SIZE" -ne 512 ]; then echo "Boundary hybrid is frozen at PROCESSING_MINIBATCH_SIZE=512." >&2 exit 2 fi ;; esac if [ "$GPUS" -eq 0 ]; then NUM_JOBS=1 MAX_WORKERS_PER_GPU=1 else NUM_JOBS="${NUM_JOBS:-auto}" case "$NUM_JOBS" in auto) ;; *[!0-9]*) echo "NUM_JOBS must be auto or an integer; got '$NUM_JOBS'." >&2 exit 2 ;; *) if [ "$NUM_JOBS" -lt 1 ]; then echo "NUM_JOBS must be at least 1; got '$NUM_JOBS'." >&2 exit 2 fi ;; esac fi DATALOADER_NUM_WORKERS_REQUESTED="$DATALOADER_NUM_WORKERS" # Shared parallelism args for the later stages. The affinity stage uses its own # worker cap and job count below. COMMON_PARALLELISM_ARGS=( --num-jobs "$NUM_JOBS" --max-tasks-per-worker 1000 --gpus "$GPUS" --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" --dataloader-num-workers "$DATALOADER_NUM_WORKERS" --torch-compile "${TORCH_COMPILE_CLI:-0}" --matmul-precision "${MATMUL_PRECISION:-highest}" ) if [ "${MHCFLURRY_ENABLE_TIMING:-0}" = "1" ]; then COMMON_PARALLELISM_ARGS+=(--enable-timing) fi # Processing has a different VRAM profile from affinity training: Conv1d # flank models keep encoded sequence tensors resident and run post-fit AUC # prediction over large fold splits. Leave worker packing as "auto" here so # mhcflurry-class1-train-processing-models can resolve it from the processing # data + hyperparameter sweep instead of inheriting affinity's resolved value. PROCESSING_NUM_JOBS="${PROCESSING_NUM_JOBS:-auto}" PROCESSING_MAX_WORKERS_PER_GPU="${PROCESSING_MAX_WORKERS_PER_GPU:-auto}" PROCESSING_PARALLELISM_ARGS=( --num-jobs "$PROCESSING_NUM_JOBS" --max-tasks-per-worker 1000 --gpus "$GPUS" --max-workers-per-gpu "$PROCESSING_MAX_WORKERS_PER_GPU" --dataloader-num-workers "$DATALOADER_NUM_WORKERS" --torch-compile "${TORCH_COMPILE_CLI:-0}" --matmul-precision "${MATMUL_PRECISION:-highest}" ) if [ "${MHCFLURRY_ENABLE_TIMING:-0}" = "1" ]; then PROCESSING_PARALLELISM_ARGS+=(--enable-timing) fi # Presentation training is mostly feature generation over a large # presentation CSV. Each worker loads the merged affinity predictor plus the PRESENTATION_NUM_JOBS="${PRESENTATION_NUM_JOBS:-auto}" PRESENTATION_MAX_WORKERS_PER_GPU="${PRESENTATION_MAX_WORKERS_PER_GPU:-auto}" PRESENTATION_PARALLELISM_ARGS=( --num-jobs "$PRESENTATION_NUM_JOBS" --max-tasks-per-worker 1000 --gpus "$GPUS" --max-workers-per-gpu "$PRESENTATION_MAX_WORKERS_PER_GPU" --dataloader-num-workers "$DATALOADER_NUM_WORKERS" --torch-compile "${TORCH_COMPILE_CLI:-0}" --matmul-precision "${MATMUL_PRECISION:-highest}" ) if [ "${MHCFLURRY_ENABLE_TIMING:-0}" = "1" ]; then PRESENTATION_PARALLELISM_ARGS+=(--enable-timing) fi # Presentation percentile calibration has the same resident predictor stack as # presentation feature generation, but a different transient memory profile. # Leave its worker packing and prediction batch size as auto by default so the # calibrate command's workload-specific VRAM hint can resolve both together. PRESENTATION_CALIBRATION_NUM_JOBS="${PRESENTATION_CALIBRATION_NUM_JOBS:-auto}" PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU="${PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU:-auto}" PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE="${PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE:-auto}" PRESENTATION_CALIBRATION_PARALLELISM_ARGS=( --num-jobs "$PRESENTATION_CALIBRATION_NUM_JOBS" --max-tasks-per-worker 1000 --gpus "$GPUS" --max-workers-per-gpu "$PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU" --dataloader-num-workers "$DATALOADER_NUM_WORKERS" --torch-compile "${TORCH_COMPILE_CLI:-0}" --matmul-precision "${MATMUL_PRECISION:-highest}" ) if [ "${MHCFLURRY_ENABLE_TIMING:-0}" = "1" ]; then PRESENTATION_CALIBRATION_PARALLELISM_ARGS+=(--enable-timing) fi compress_csv_bzip2() { local path="$1" if command -v lbzip2 >/dev/null 2>&1; then lbzip2 -f "$path" elif command -v pbzip2 >/dev/null 2>&1; then pbzip2 -f "$path" else bzip2 -f "$path" fi } # ============================================================ # STAGE 1 — AFFINITY # ============================================================ echo "=== STAGE 1: AFFINITY ===" STAGE1_START=$(date +%s) AFFINITY_NUM_JOBS="${AFFINITY_NUM_JOBS:-}" if [ -z "$AFFINITY_NUM_JOBS" ] && [ "$GPUS" -eq 0 ]; then AFFINITY_NUM_JOBS=1 elif [ -z "$AFFINITY_NUM_JOBS" ] && \ [ "$AFFINITY_MAX_WORKERS_PER_GPU" != "auto" ]; then AFFINITY_NUM_JOBS="$(( GPUS * AFFINITY_MAX_WORKERS_PER_GPU ))" fi AFFINITY_ENV=( "MHCFLURRY_OUT=$BASE_OUT/affinity" "GPUS=$GPUS" "MAX_WORKERS_PER_GPU=$AFFINITY_MAX_WORKERS_PER_GPU" "DATALOADER_NUM_WORKERS=${AFFINITY_DATALOADER_NUM_WORKERS:-$DATALOADER_NUM_WORKERS_REQUESTED}" "SKIP_EVAL=${SKIP_EVAL:-0}" "SKIP_PLOTS=${SKIP_PLOTS:-0}" "TRAINING_MINIBATCH_SIZE=$TRAINING_MINIBATCH_SIZE" "AFFINITY_MINIBATCH_SIZE=$AFFINITY_MINIBATCH_SIZE" "AFFINITY_OPTIMIZER_IMPLEMENTATION=${AFFINITY_OPTIMIZER_IMPLEMENTATION:-keras}" "AFFINITY_LSUV_TARGET=${AFFINITY_LSUV_TARGET:-post_activation}" "AFFINITY_INIT=${AFFINITY_INIT:-glorot_uniform}" ) if [ -n "$AFFINITY_NUM_JOBS" ]; then AFFINITY_ENV+=("NUM_JOBS=$AFFINITY_NUM_JOBS") fi env "${AFFINITY_ENV[@]}" bash "$SCRIPT_DIR/pan_allele_release_affinity.sh" AFFINITY_PREDICTOR="$BASE_OUT/affinity/models.combined" echo "STAGE 1 duration: $(( $(date +%s) - STAGE1_START )) sec" echo "affinity predictor: $AFFINITY_PREDICTOR" # ============================================================ # STAGE 2 — PROCESSING # Trains the configured processing variants. Presentation consumes no_flank and # the configured with-flanks source (short_flanks by default). # ============================================================ echo "=== STAGE 2: PROCESSING ===" STAGE2_START=$(date +%s) start_gpu_telemetry "$BASE_OUT/processing/gpu_occupancy.csv" cd "$BASE_OUT/processing" mhcflurry-downloads fetch data_mass_spec_annotated data_references cp "$REPO/downloads-generation/models_class1_processing/annotate_hits_with_expression.py" . cp "$RECIPE_DIR/make_train_data.processing.py" . # Matched preparation records the hash of this file, so a relaunch after the # function time cap must present the same bytes to resume its scored pools. # Parallel bzip2 output can depend on the worker count, so reuse the readable # table this run already wrote instead of recompressing it. if [ -s "$(pwd)/hits_with_tpm.csv.bz2" ] && \ bzip2 -t "$(pwd)/hits_with_tpm.csv.bz2" 2>/dev/null; then echo "Reusing annotated hits: $(pwd)/hits_with_tpm.csv.bz2" else python annotate_hits_with_expression.py \ --hits "$(mhcflurry-downloads path data_mass_spec_annotated)/annotated_ms.csv.bz2" \ --expression "$(mhcflurry-downloads path data_curated)/rna_expression.csv.bz2" \ --out "$(pwd)/hits_with_tpm.csv" compress_csv_bzip2 "$(pwd)/hits_with_tpm.csv" fi # Freeze the matching reference independently of the new affinity candidate. if [ -z "${PROCESSING_AFFINITY_REFERENCE:-}" ]; then mhcflurry-downloads fetch models_class1_pan fi PROCESSING_AFFINITY_REFERENCE="${PROCESSING_AFFINITY_REFERENCE:-$(mhcflurry-downloads path models_class1_pan)/models.combined}" PROCESSING_EXCLUDE_SAMPLES="$RELEASE_HOLDOUT_DIR/processing_samples.csv" if [ "${MHCFLURRY_RELEASE_SMOKE:-0}" = "1" ]; then python "$SMOKE_HELPER" sample-exclusions \ --hits "$(pwd)/hits_with_tpm.csv.bz2" \ --holdout "$RELEASE_HOLDOUT_DIR/processing_samples.csv" \ --keep "$SMOKE_PROCESSING_SAMPLES" --seed "$RELEASE_RANDOM_SEED" \ --out "$(pwd)/smoke_excluded_samples.csv" PROCESSING_EXCLUDE_SAMPLES="$(pwd)/smoke_excluded_samples.csv" fi # A relaunch after the function time cap reuses a table that passes the # maintained validator, so variants trained before and after the relaunch share # one negative set. Output directories are per-run, so a table here is this run's. if [ -s "$(pwd)/train_data.csv.bz2" ] && \ mhcflurry train validate-processing-data --data "$(pwd)/train_data.csv.bz2"; then echo "Reusing validated processing training data: $(pwd)/train_data.csv.bz2" else # Preparation preserves its scored candidate pools under # train_data.csv.matching and refuses to overwrite them. A relaunch resumes # from them: completed samples are reused and provenance hashes are checked. PROCESSING_DATA_RESUME_ARGS=() if [ -f "$(pwd)/train_data.csv.matching/experiment.json" ]; then echo "Resuming matched processing preparation from saved candidate pools" PROCESSING_DATA_RESUME_ARGS=(--resume) elif [ -d "$(pwd)/train_data.csv.matching" ]; then # An interrupted launch can leave the directory without provenance, and # then there is nothing to resume from. rmdir refuses to discard scored # pools: it only removes the directory when it is empty. rmdir "$(pwd)/train_data.csv.matching" fi mhcflurry train processing-data \ ${PROCESSING_DATA_RESUME_ARGS[@]+"${PROCESSING_DATA_RESUME_ARGS[@]}"} \ --hits "$(pwd)/hits_with_tpm.csv.bz2" \ --affinity-predictor "$PROCESSING_AFFINITY_REFERENCE" \ --proteome-reference-csv "$(mhcflurry-downloads path data_references)/uniprot_proteins.csv.bz2" \ --ppv-multiplier 100 \ --negative-policy matched --decoys-per-hit 1 --max-affinity-distance 0.25 \ --exclude-samples-file "$PROCESSING_EXCLUDE_SAMPLES" \ --random-seed "$RELEASE_RANDOM_SEED" \ --out "$(pwd)/train_data.csv" \ "${COMMON_PARALLELISM_ARGS[@]}" compress_csv_bzip2 "$(pwd)/train_data.csv" fi mhcflurry class1-generate-training-hyperparameters processing-base \ --minibatch-size "$PROCESSING_MINIBATCH_SIZE" \ --optimizer-implementation keras \ --init glorot_uniform \ > hyperparameters.base.yaml for kind in $PROCESSING_VARIANTS; do PROCESSING_VARIANT_HYPERPARAMETER_ARGS=( --optimizer-implementation keras --init glorot_uniform ) if [[ "$kind" == "with_flanks" ]]; then PROCESSING_VARIANT_HYPERPARAMETER_ARGS=( --optimizer-implementation "$PROCESSING_WITH_FLANKS_OPTIMIZER_IMPLEMENTATION" --init "$PROCESSING_WITH_FLANKS_INIT" ) fi if [[ "$kind" == "short_flanks" && \ "$PROCESSING_SHORT_FLANKS_HYPERPARAMETERS" == "confirmed-ranking-candidate" ]]; then # The named 2026-09-10 confirmation winner; see # docs/processing_hyperparameter_campaign.md. Matched training data # supplies the sample-disjoint inner stopping split its ranking # checkpoint requires. python "$SCRIPT_DIR/generate_processing_recipe.py" --confirmed-candidate \ > "hyperparameters.$kind.yaml" else mhcflurry class1-generate-training-hyperparameters processing-variant \ hyperparameters.base.yaml "$kind" \ "${PROCESSING_VARIANT_HYPERPARAMETER_ARGS[@]}" \ > "hyperparameters.$kind.yaml" fi if [ "${MHCFLURRY_RELEASE_SMOKE:-0}" = "1" ]; then python "$SMOKE_HELPER" cap-hyperparameters "hyperparameters.$kind.yaml" --max-architectures 2 --max-epochs 2 fi ARCH_COUNT=$(python -c \ "import yaml; print(len(yaml.safe_load(open('hyperparameters.$kind.yaml'))))") echo "processing.$kind: using $ARCH_COUNT architectures" if [ -f "$(pwd)/models.unselected.$kind/manifest.csv" ]; then mhcflurry-class1-train-processing-models \ --out-models-dir "$(pwd)/models.unselected.$kind" \ --continue-incomplete \ "${PROCESSING_PARALLELISM_ARGS[@]}" else mhcflurry-class1-train-processing-models \ --data "$(pwd)/train_data.csv.bz2" \ --held-out-samples "$PROCESSING_HELD_OUT_SAMPLES" \ --num-folds 4 \ --random-seed "$RELEASE_RANDOM_SEED" \ --hyperparameters "hyperparameters.$kind.yaml" \ --out-models-dir "$(pwd)/models.unselected.$kind" \ --worker-log-dir "$BASE_OUT/processing" \ "${PROCESSING_PARALLELISM_ARGS[@]}" fi mhcflurry-class1-select-processing-models \ --data "$(pwd)/models.unselected.$kind/train_data.csv.bz2" \ --models-dir "$(pwd)/models.unselected.$kind" \ --out-models-dir "$(pwd)/models.selected.$kind" \ --min-models-per-fold 1 \ --max-models-per-fold 2 \ --save-validation-predictions \ "${PROCESSING_PARALLELISM_ARGS[@]}" cp "$(pwd)/models.unselected.$kind/train_data.csv.bz2" \ "$(pwd)/models.selected.$kind/train_data.csv.bz2" done PRESENTATION_PROCESSING_WITH_FLANKS_PATH="$BASE_OUT/processing/models.selected.$PRESENTATION_PROCESSING_WITH_FLANKS_KIND" if [ "$PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS" -ne 0 ]; then BOUNDARY_RADIUS="$PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS" BOUNDARY_ROOT="$BASE_OUT/processing/boundary-radius-$BOUNDARY_RADIUS" mkdir -p "$BOUNDARY_ROOT" python "$SCRIPT_DIR/generate_processing_cleavage_boundaries.py" \ "$BOUNDARY_ROOT" \ --architectures large_relu \ --peptide-context-lengths "$BOUNDARY_RADIUS" \ --no-controls \ --design final-2.3.0-processing-boundary \ > "$BOUNDARY_ROOT/manifest.stdout.json" BOUNDARY_CONDITION=$(python - "$BOUNDARY_ROOT/manifest.json" <<'PY' import json import sys with open(sys.argv[1]) as fd: manifest = json.load(fd) (record,) = manifest["records"] print(record["condition"]) PY ) BOUNDARY_HYPERPARAMETERS="$BOUNDARY_ROOT/conditions/$BOUNDARY_CONDITION.yaml" if [ "${MHCFLURRY_RELEASE_SMOKE:-0}" = "1" ]; then python "$SMOKE_HELPER" cap-hyperparameters "$BOUNDARY_HYPERPARAMETERS" --max-architectures 1 --max-epochs 2 fi python - "$BOUNDARY_HYPERPARAMETERS" "$BOUNDARY_RADIUS" <<'PY' import sys import yaml with open(sys.argv[1]) as fd: (item,) = yaml.safe_load(fd) assert item["minibatch_size"] == 512, item assert item["optimizer_implementation"] == "keras", item assert item["init"] == "glorot_uniform", item assert item["cleavage_boundary_flank_length"] == 5, item assert item["cleavage_boundary_peptide_length"] == int(sys.argv[2]), item assert item["cleavage_boundary_context_dropout"] == 0.25, item PY BOUNDARY_UNSELECTED="$BASE_OUT/processing/models.unselected.boundary-radius-$BOUNDARY_RADIUS" BOUNDARY_SELECTED="$BASE_OUT/processing/models.selected.boundary-radius-$BOUNDARY_RADIUS" if [ -f "$BOUNDARY_UNSELECTED/manifest.csv" ]; then mhcflurry-class1-train-processing-models \ --out-models-dir "$BOUNDARY_UNSELECTED" \ --continue-incomplete \ "${PROCESSING_PARALLELISM_ARGS[@]}" else mhcflurry-class1-train-processing-models \ --data "$BASE_OUT/processing/train_data.csv.bz2" \ --held-out-samples "$PROCESSING_HELD_OUT_SAMPLES" \ --num-folds 4 \ --random-seed "$RELEASE_RANDOM_SEED" \ --hyperparameters "$BOUNDARY_HYPERPARAMETERS" \ --out-models-dir "$BOUNDARY_UNSELECTED" \ --worker-log-dir "$BASE_OUT/processing" \ "${PROCESSING_PARALLELISM_ARGS[@]}" fi mhcflurry-class1-select-processing-models \ --data "$BOUNDARY_UNSELECTED/train_data.csv.bz2" \ --models-dir "$BOUNDARY_UNSELECTED" \ --out-models-dir "$BOUNDARY_SELECTED" \ --min-models-per-fold 1 \ --max-models-per-fold 1 \ --save-validation-predictions \ "${PROCESSING_PARALLELISM_ARGS[@]}" cp "$BOUNDARY_UNSELECTED/train_data.csv.bz2" \ "$BOUNDARY_SELECTED/train_data.csv.bz2" LEGACY_FOUR="$BASE_OUT/processing/models.selected.short_flanks.legacy-four" mhcflurry-class1-select-processing-models \ --data "$BASE_OUT/processing/models.unselected.short_flanks/train_data.csv.bz2" \ --models-dir "$BASE_OUT/processing/models.unselected.short_flanks" \ --out-models-dir "$LEGACY_FOUR" \ --min-models-per-fold 1 \ --max-models-per-fold 1 \ --save-validation-predictions \ "${PROCESSING_PARALLELISM_ARGS[@]}" cp "$BASE_OUT/processing/models.unselected.short_flanks/train_data.csv.bz2" \ "$LEGACY_FOUR/train_data.csv.bz2" PROCESSING_HYBRID="$BASE_OUT/processing/models.selected.short_flanks-boundary-radius-$BOUNDARY_RADIUS" if [ ! -f "$PROCESSING_HYBRID/ensemble_provenance.json" ]; then python "$SCRIPT_DIR/compose_processing_ensemble.py" \ --predictor "legacy=$LEGACY_FOUR" \ --predictor "boundary=$BOUNDARY_SELECTED" \ --require-equal-counts \ --out "$PROCESSING_HYBRID" fi cp "$BASE_OUT/processing/train_data.csv.bz2" \ "$PROCESSING_HYBRID/train_data.csv.bz2" PRESENTATION_PROCESSING_WITH_FLANKS_PATH="$PROCESSING_HYBRID" fi stop_gpu_telemetry echo "STAGE 2 duration: $(( $(date +%s) - STAGE2_START )) sec" # ============================================================ # STAGE 3 — PRESENTATION (Class1PresentationPredictor) # ============================================================ echo "=== STAGE 3: PRESENTATION ===" STAGE3_START=$(date +%s) start_gpu_telemetry "$BASE_OUT/presentation/gpu_occupancy.csv" cd "$BASE_OUT/presentation" cp "$RECIPE_DIR/make_train_data.presentation.py" \ make_train_data.presentation.py python make_train_data.presentation.py \ --hits "$BASE_OUT/processing/hits_with_tpm.csv.bz2" \ --proteome-reference-csv "$(mhcflurry-downloads path data_references)/uniprot_proteins.csv.bz2" \ --decoys-per-hit "$PRESENTATION_DECOYS_PER_HIT" \ --exclude-pmid 31844290 31495665 31154438 \ --exclude-samples-file "$RELEASE_HOLDOUT_DIR/presentation_samples.csv" \ --only-format MULTIALLELIC \ --sample-fraction "$PRESENTATION_SAMPLE_FRACTION" \ --random-seed "$RELEASE_RANDOM_SEED" \ --out "$(pwd)/train_data.csv" compress_csv_bzip2 "$(pwd)/train_data.csv" mhcflurry-class1-train-presentation-models \ --data "$(pwd)/train_data.csv.bz2" \ --affinity-predictor "$AFFINITY_PREDICTOR" \ --processing-predictor-with-flanks "$PRESENTATION_PROCESSING_WITH_FLANKS_PATH" \ --processing-predictor-without-flanks "$BASE_OUT/processing/models.selected.no_flank" \ --out-models-dir "$(pwd)/models" \ --random-seed "$RELEASE_RANDOM_SEED" \ --feature-chunk-size "$PRESENTATION_FEATURE_CHUNK_SIZE" \ "${PRESENTATION_PARALLELISM_ARGS[@]}" mhcflurry-calibrate-percentile-ranks \ --models-dir "$(pwd)/models" \ --match-amino-acid-distribution-data "$AFFINITY_PREDICTOR/train_data.csv.bz2" \ --alleles-file "$AFFINITY_PREDICTOR/train_data.csv.bz2" \ --predictor-kind class1_presentation \ --num-peptides-per-length "$PRESENTATION_CALIBRATION_PEPTIDES_PER_LENGTH" \ --alleles-per-genotype 1 \ --num-genotypes "$PRESENTATION_CALIBRATION_GENOTYPES" \ --prediction-batch-size "$PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE" \ --random-seed "$RELEASE_RANDOM_SEED" \ --verbosity 1 \ "${PRESENTATION_CALIBRATION_PARALLELISM_ARGS[@]}" # Bundle training-data CSVs into the final presentation predictor dir # so it's self-contained for distribution. cp "$AFFINITY_PREDICTOR/train_data.csv.bz2" \ "$(pwd)/models/affinity_predictor_train_data.csv.bz2" cp "$PRESENTATION_PROCESSING_WITH_FLANKS_PATH/train_data.csv.bz2" \ "$(pwd)/models/processing_predictor_with_flanks_train_data.csv.bz2" cp "$BASE_OUT/processing/models.selected.no_flank/train_data.csv.bz2" \ "$(pwd)/models/processing_predictor_no_flank_train_data.csv.bz2" mhcflurry train release-holdout validate \ --holdout-dir "$RELEASE_HOLDOUT_DIR" \ --affinity-training-data "$AFFINITY_PREDICTOR/train_data.csv.bz2" \ --processing-training-data "$BASE_OUT/processing/train_data.csv.bz2" \ --presentation-training-data "$(pwd)/train_data.csv.bz2" \ --out "$RELEASE_HOLDOUT_DIR/validation.json" stop_gpu_telemetry echo "STAGE 3 duration: $(( $(date +%s) - STAGE3_START )) sec" echo "=== DONE ===" echo "affinity: $AFFINITY_PREDICTOR" echo "processing: $BASE_OUT/processing/models.selected.{${PROCESSING_VARIANTS// /,}}" echo "presentation with-flank processing: $PRESENTATION_PROCESSING_WITH_FLANKS_PATH" echo "presentation: $BASE_OUT/presentation/models" ls -la "$BASE_OUT/presentation/models" | head -20 mhcflurry-2.3.6/scripts/training/plot_loss_curves.py000066400000000000000000000012751525677230600230400ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Compatibility shim for ``mhcflurry train plot-loss-curves``.""" from mhcflurry.cli.plot_loss_curves import main if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/plot_minibatch_sweep.py000066400000000000000000000344351525677230600236360ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Plot the full-ensemble minibatch sweep summary. Reads the ``sweep_summary.csv`` produced by ``full_ensemble_minibatch_sweep.sh`` and emits, into ``--out``: * ``per_variable/_{linlin,loglog}.png`` -- one chart per non-constant numeric column, x-axis = minibatch_size, y-axis = the variable. * ``scatter/_vs__{linlin,loglog}.png`` -- a scatter plot for every pair of non-constant numeric columns. Dots are colored along the viridis gradient by minibatch size, with a colorbar. * ``index.html`` -- an offline gallery linking everything above so a reviewer can scroll through the whole sweep on one page. Constant columns (``n_rows``, ``n_hits``, ``n_alleles_reported`` -- anything where every row has the same value) are dropped because they yield uninformative flat lines. Each chart is rendered in just two axis-scale combos: linear-linear and log-log. Usage: python plot_minibatch_sweep.py \ --sweep-csv path/to/sweep_summary.csv \ --out plots/ """ import argparse import itertools import os import sys import pandas as pd import matplotlib matplotlib.use("Agg") # headless import matplotlib.pyplot as plt from matplotlib.cm import ScalarMappable from matplotlib.colors import LogNorm, Normalize from matplotlib.ticker import FixedLocator, ScalarFormatter, NullLocator try: # adjustText iteratively repositions text to avoid overlapping any # dots or other labels. Optional; we fall back to fixed offsets. from adjustText import adjust_text as _adjust_text except ImportError: _adjust_text = None # Columns excluded from plotting because they are not values we want # to compare. ``minibatch`` is the primary axis. Constants are dropped # automatically downstream. NON_PLOTTABLE = {"minibatch"} # Visual defaults tuned for the small-N sweep summaries. FIGSIZE = (9.5, 6.2) DPI = 130 DOT_SIZE = 160 DOT_EDGE = "#222" DOT_EDGE_WIDTH = 0.8 LINE_COLOR = "#444" LINE_ALPHA = 0.45 LABEL_PAD = 12 TITLE_PAD = 16 GRID_KW = dict(which="both", linestyle=":", alpha=0.4, linewidth=0.8) def _setup_style(): """Apply a clean, modern matplotlib style for all figures.""" plt.rcParams.update({ "figure.facecolor": "white", "axes.facecolor": "white", "axes.edgecolor": "#444", "axes.linewidth": 0.9, "axes.titlesize": 14, "axes.titleweight": "bold", "axes.labelsize": 12, "axes.labelweight": "regular", "axes.spines.top": False, "axes.spines.right": False, "xtick.labelsize": 10, "ytick.labelsize": 10, "xtick.color": "#333", "ytick.color": "#333", "font.family": "DejaVu Sans", "savefig.bbox": "tight", "savefig.pad_inches": 0.25, }) def _is_log_safe(series): s = pd.to_numeric(series, errors="coerce") return s.notna().all() and (s > 0).all() # Minimum span (max/min) for a log scale to add visual information. # Below this, log just stretches the axis linearly and the resulting # plot is indistinguishable from lin-lin. _LOG_SPAN_THRESHOLD = 1.5 def _wide_enough_for_log(series): s = pd.to_numeric(series, errors="coerce").dropna() s = s[s > 0] if len(s) < 2: return False return float(s.max()) / float(s.min()) >= _LOG_SPAN_THRESHOLD def _is_constant(series): s = pd.to_numeric(series, errors="coerce").dropna() return s.nunique() <= 1 def _plain_formatter(): fmt = ScalarFormatter(useMathText=False) fmt.set_scientific(False) fmt.set_useOffset(False) return fmt def _force_plain_ticks(ax, x_scale, y_scale): if x_scale == "log": ax.xaxis.set_major_formatter(_plain_formatter()) ax.xaxis.set_minor_formatter(_plain_formatter()) if y_scale == "log": ax.yaxis.set_major_formatter(_plain_formatter()) ax.yaxis.set_minor_formatter(_plain_formatter()) def _save(fig, path): os.makedirs(os.path.dirname(path), exist_ok=True) # constrained_layout (set on the figure) handles colorbar padding # automatically; explicit tight_layout would fight with it. fig.savefig(path, dpi=DPI) plt.close(fig) def _mb_norm(mb_values, log=True): """Normalize minibatch values to a colormap range. Log-norm by default since mb sweeps are usually geometric.""" vmin, vmax = float(min(mb_values)), float(max(mb_values)) if log and vmin > 0: return LogNorm(vmin=vmin, vmax=vmax) return Normalize(vmin=vmin, vmax=vmax) def _add_mb_colorbar(fig, ax, mb_values, norm): """Append a colorbar showing the minibatch gradient and pin its ticks to the actual mb values in the sweep.""" sm = ScalarMappable(cmap="viridis", norm=norm) sm.set_array([]) cbar = fig.colorbar(sm, ax=ax, pad=0.02, fraction=0.045) cbar.set_label("minibatch_size", fontsize=11) ticks = sorted(set(int(v) for v in mb_values)) cbar.set_ticks(ticks) cbar.ax.set_yticklabels([str(t) for t in ticks]) return cbar def _annotate_points(ax, xs, ys, labels): """Place mb labels next to each dot, then (if available) iteratively nudge them to avoid overlapping each other and the dots. Falls back to a fixed NE offset if adjustText isn't installed.""" texts = [] for xi, yi, lbl in zip(xs, ys, labels): if pd.notna(xi) and pd.notna(yi): t = ax.text( xi, yi, str(lbl), fontsize=8.5, color="#222", ha="left", va="bottom", ) texts.append(t) if not texts: return if _adjust_text is not None: # Treat the data points as obstacles too so labels don't sit on # top of any dot. expand_text/expand_points pad bounding boxes # so adjacent labels keep a small gap. valid = [(x, y) for x, y in zip(xs, ys) if pd.notna(x) and pd.notna(y)] x_arr = [v[0] for v in valid] y_arr = [v[1] for v in valid] _adjust_text( texts, x=x_arr, y=y_arr, ax=ax, expand=(1.2, 1.4), arrowprops=dict(arrowstyle="-", color="#888", lw=0.6, alpha=0.6), time_lim=2.0, max_move=20, ) else: # Static NE offset; readers will sometimes see overlap, but # without adjustText there's no automated fix. for t, xi, yi in zip(texts, xs, ys): t.set_position((xi, yi)) t.set_x(xi) t.set_y(yi) def _filter_columns(df): """Drop columns that are non-numeric, constant, or in NON_PLOTTABLE.""" keep = [] for c in df.columns: if c in NON_PLOTTABLE: continue s = pd.to_numeric(df[c], errors="coerce") if s.notna().sum() < 2: continue if _is_constant(s): continue keep.append(c) return keep def plot_per_variable(df, out_dir): out_dir = os.path.join(out_dir, "per_variable") os.makedirs(out_dir, exist_ok=True) written = [] x = df["minibatch"].astype(float) mb_values = sorted(int(v) for v in df["minibatch"].unique()) norm = _mb_norm(mb_values, log=True) cmap = plt.get_cmap("viridis") point_colors = [cmap(norm(v)) for v in x] cols = _filter_columns(df) for col in cols: y = pd.to_numeric(df[col], errors="coerce") for x_scale, y_scale in (("linear", "linear"), ("log", "log")): if x_scale == "log" and (not _is_log_safe(x) or not _wide_enough_for_log(x)): continue if y_scale == "log" and (not _is_log_safe(y) or not _wide_enough_for_log(y)): continue fig, ax = plt.subplots(figsize=FIGSIZE, constrained_layout=True) ax.plot(x, y, color=LINE_COLOR, linewidth=1.4, alpha=LINE_ALPHA, zorder=1) ax.scatter(x, y, c=point_colors, s=DOT_SIZE, edgecolor=DOT_EDGE, linewidth=DOT_EDGE_WIDTH, zorder=3) _annotate_points(ax, x, y, [f"mb={int(v)}" for v in x]) ax.set_xscale(x_scale) ax.set_yscale(y_scale) _force_plain_ticks(ax, x_scale, y_scale) ax.xaxis.set_major_locator(FixedLocator(mb_values)) ax.xaxis.set_minor_locator(NullLocator()) ax.set_xlabel("minibatch_size", labelpad=LABEL_PAD) ax.set_ylabel(col, labelpad=LABEL_PAD) ax.set_title(f"{col} vs minibatch_size", pad=TITLE_PAD) ax.text( 0.99, 1.02, f"axes: {x_scale}-{y_scale}", ha="right", va="bottom", transform=ax.transAxes, fontsize=9, color="#666", ) ax.grid(True, **GRID_KW) tag = "loglog" if x_scale == "log" else "linlin" path = os.path.join(out_dir, f"{col}__{tag}.png") _save(fig, path) written.append(path) return written def plot_pairs(df, out_dir): out_dir = os.path.join(out_dir, "scatter") os.makedirs(out_dir, exist_ok=True) cols = _filter_columns(df) written = [] mb_values = sorted(int(v) for v in df["minibatch"].unique()) norm = _mb_norm(mb_values, log=True) cmap = plt.get_cmap("viridis") point_colors = [cmap(norm(v)) for v in df["minibatch"].astype(float)] for x_col, y_col in itertools.combinations(cols, 2): xv = pd.to_numeric(df[x_col], errors="coerce") yv = pd.to_numeric(df[y_col], errors="coerce") for x_scale, y_scale in (("linear", "linear"), ("log", "log")): if x_scale == "log" and (not _is_log_safe(xv) or not _wide_enough_for_log(xv)): continue if y_scale == "log" and (not _is_log_safe(yv) or not _wide_enough_for_log(yv)): continue fig, ax = plt.subplots(figsize=FIGSIZE, constrained_layout=True) ax.scatter(xv, yv, c=point_colors, s=DOT_SIZE, edgecolor=DOT_EDGE, linewidth=DOT_EDGE_WIDTH, zorder=3) _annotate_points( ax, xv, yv, [f"mb={int(m)}" for m in df["minibatch"]], ) ax.set_xscale(x_scale) ax.set_yscale(y_scale) _force_plain_ticks(ax, x_scale, y_scale) ax.set_xlabel(x_col, labelpad=LABEL_PAD) ax.set_ylabel(y_col, labelpad=LABEL_PAD) ax.set_title(f"{y_col} vs {x_col}", pad=TITLE_PAD) ax.text( 0.99, 1.02, f"axes: {x_scale}-{y_scale}", ha="right", va="bottom", transform=ax.transAxes, fontsize=9, color="#666", ) ax.grid(True, **GRID_KW) _add_mb_colorbar(fig, ax, mb_values, norm) tag = "loglog" if x_scale == "log" else "linlin" path = os.path.join(out_dir, f"{x_col}__VS__{y_col}__{tag}.png") _save(fig, path) written.append(path) return written def write_index(out_dir, per_var_paths, scatter_paths): rel = lambda p: os.path.relpath(p, out_dir) html = [ "", "Minibatch sweep", "", "

Minibatch sweep — full ensemble

", ] html.append("

Per-variable (vs minibatch_size)

") for p in sorted(per_var_paths): html.append( f"
" f"
{os.path.basename(p)}
" ) html.append("
") html.append("

Pairwise scatter (color = minibatch_size)

" "
") for p in sorted(scatter_paths): html.append( f"
" f"
{os.path.basename(p)}
" ) html.append("
") with open(os.path.join(out_dir, "index.html"), "w") as f: f.write("\n".join(html)) def main(): p = argparse.ArgumentParser() p.add_argument("--sweep-csv", required=True, help="Path to sweep_summary.csv") p.add_argument("--out", required=True, help="Output dir for plots") args = p.parse_args() df = pd.read_csv(args.sweep_csv) if "minibatch" not in df.columns: sys.exit("sweep_summary.csv missing 'minibatch' column") df = df.sort_values("minibatch").reset_index(drop=True) os.makedirs(args.out, exist_ok=True) _setup_style() cols = _filter_columns(df) dropped = [c for c in df.columns if c not in NON_PLOTTABLE and c not in cols] if dropped: print(f"dropped uninformative cols: {dropped}") per_var = plot_per_variable(df, args.out) scatter = plot_pairs(df, args.out) write_index(args.out, per_var, scatter) print(f"Wrote {len(per_var)} per-variable charts and {len(scatter)} " f"scatter plots to {args.out}") print(f"Open {os.path.join(args.out, 'index.html')} in a browser.") if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/prepare_processing_evaluation.py000066400000000000000000000175241525677230600255600ustar00rootroot00000000000000#!/usr/bin/env python3 """Expand and freeze unique 10:1 processing evaluation risk sets. Original held-out hits and cached public affinities are retained. Only missing negative capacity is supplied, from the same source-protein population and frozen public predictor. All processing comparators consume the saved table. """ import argparse import hashlib import json from pathlib import Path import numpy import pandas from mhcflurry.common import add_random_seed_arg, derive_seed, positive_int_arg from mhcflurry.cli.compare_models import _load_presentation_benchmark_for_component from mhcflurry.cli.processing_affinity_control import _attach_affinity, AFFINITY_COLUMN from mhcflurry.experiment_archive import sha256_file from mhcflurry.processing_matching import ( MATCHING_POLICY, affinity_reference_fingerprint, validate_matched_training_data, validate_preparation_provenance) from mhcflurry.processing_evaluation import hit_identity, verify_hits from mhcflurry.processing_preparation import ( SamplePreparation, add_processing_preparation_args, prepare_sample, write_csv_atomic, write_json_atomic) from mhcflurry.proteome_decoys import ( load_reference_sequences, sample_peptide_frame_for_accessions) def expand_sample(args, pool, sequences, score): """Resume scored rounds, expanding only lengths with insufficient capacity.""" sample = str(pool.sample_id.iloc[0]) hits = pool.loc[pool.hit.eq(1)].copy() seed = derive_seed(args.random_seed, "processing-evaluation-expansion", sample) store = SamplePreparation(args, sample, hits) if store.load_pool() is None: store.save_round(pool, {"seed": seed, "origin": "frozen-benchmark-cache"}) accessions = pool.protein_accession.dropna().drop_duplicates().tolist() flank_length = max(pool.n_flank.str.len().max(), pool.c_flank.str.len().max()) genotype = pool.hla.iloc[0] def initial(): raise AssertionError("The frozen benchmark pool must already be saved") def additional(length, excluded, round_seed): # The maintained string sampler uses numpy's RNG. This command is # serial, with a recorded, independent seed for each sample/round/length. numpy.random.seed(int(round_seed) % (2 ** 32)) frame = sample_peptide_frame_for_accessions( accessions, sequences, lengths=[length], flanking_length=int(flank_length), exclude_peptides=excluded, n=args.expansion_candidates_per_length, allow_smaller=True).drop_duplicates("peptide") return frame.assign(sample_id=sample, hit=0, hla=genotype) result = prepare_sample(args, sample, hits, seed, initial, additional, score) verify_hits(pool, result) return result def main(argv=None): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--data-dir", required=True) parser.add_argument("--release-holdout-dir", required=True) parser.add_argument("--affinity-predictor", required=True) parser.add_argument("--proteome-reference-csv", required=True) parser.add_argument("--out", type=Path, required=True) parser.add_argument("--decoys-per-hit", type=positive_int_arg, default=10) add_random_seed_arg(parser) add_processing_preparation_args(parser) args = parser.parse_args(argv) if args.resume_matching_dir: parser.error("Use --resume in this experiment's own output directory") args.limit_files = None destination = args.out args.out = destination / "matched.csv" args.max_affinity_distance = 0.25 args.matching_reference = affinity_reference_fingerprint(args.affinity_predictor) cohort = _load_presentation_benchmark_for_component(args.data_dir, args, "processing") cohort, sources = _attach_affinity(cohort, args.data_dir) cohort["sample_id"] = cohort.sample_id.astype(str) cohort["affinity_prediction"] = cohort[AFFINITY_COLUMN] manifest = Path(args.release_holdout_dir) / "processing_samples.csv" inputs = {source["path"]: source["sha256"] for source in sources} inputs.update({str(Path(args.data_dir) / name): sha256_file(Path(args.data_dir) / name) for name in cohort.source_file.unique()}) inputs.update({str(path): sha256_file(path) for path in (manifest, Path(args.proteome_reference_csv))}) provenance = {"policy": MATCHING_POLICY, "affinity_reference": args.matching_reference, "decoys_per_hit": args.decoys_per_hit, "max_log10_affinity_distance": 0.25, "candidate_pool_multiplier": None, "seed": args.random_seed, "inputs": inputs, "expansion_candidates_per_length": args.expansion_candidates_per_length, "preparation_script_sha256": sha256_file(__file__)} directory = Path(str(args.out) + ".matching") provenance_path = directory / "experiment.json" if destination.exists() and any(destination.iterdir()): if not args.resume: raise ValueError("Use a fresh output directory or --resume") saved = json.loads(provenance_path.read_text()) validate_preparation_provenance(saved, provenance) if saved["expansion_candidates_per_length"] != args.expansion_candidates_per_length: raise ValueError("Changed expansion candidate count") if saved["preparation_script_sha256"] != provenance["preparation_script_sha256"]: raise ValueError("Changed preparation source; preserve the original experiment") else: directory.mkdir(parents=True, exist_ok=True) write_json_atomic(provenance_path, provenance) sequences = load_reference_sequences(args.proteome_reference_csv, cohort.protein_accession) from mhcflurry import Class1AffinityPredictor, Class1PresentationPredictor predictor = Class1PresentationPredictor( affinity_predictor=Class1AffinityPredictor.load(args.affinity_predictor)) results = [] checks = [] for sample, pool in cohort.groupby("sample_id", sort=False): alleles = pool.hla.iloc[0].split() def score(peptides, genotype=alleles): return predictor.predict_affinity( peptides=list(peptides), alleles={"sample": genotype}, include_affinity_percentile=False, verbose=0).affinity.to_numpy() # The historical cache lacks model hashes. Require the supplied # predictor to numerically reproduce a deterministic spread of its # scores before extending it, and record the exact check and tolerance. rows = numpy.unique(numpy.linspace(0, len(pool) - 1, min(256, len(pool)), dtype=int)) expected = pool.affinity_prediction.to_numpy()[rows] actual = score(pool.peptide.iloc[rows]) error = numpy.max(numpy.abs(numpy.log10(actual) - numpy.log10(expected))) if not numpy.isfinite(error) or error > 1e-4: raise ValueError("Affinity reference disagrees with frozen cache for %s: %g" % (sample, error)) checks.append({"sample_id": sample, "rows": rows.tolist(), "max_log10_error": float(error)}) results.append(expand_sample(args, pool.reset_index(drop=True), sequences, score)) result = pandas.concat(results, ignore_index=True) verify_hits(cohort, result) validate_matched_training_data(result) output = destination / "matched.csv.bz2" write_csv_atomic(output, result) write_json_atomic(destination / "cohort.json", { **provenance, "rows": len(result), "hits": int(result.hit.sum()), "samples": int(result.sample_id.nunique()), "cohort_file": output.name, "cohort_sha256": sha256_file(output), "hit_identity_sha256": hashlib.sha256(hit_identity(result).tobytes()).hexdigest(), "reference_checks": checks, "reference_check_max_log10_tolerance": 1e-4, "purpose": "processing only; original presentation cohort unchanged"}) print("Frozen processing cohort:", output, "rows:", len(result), flush=True) return 0 if __name__ == "__main__": raise SystemExit(main()) mhcflurry-2.3.6/scripts/training/presentation_from_affinity.sh000077500000000000000000000307131525677230600250460ustar00rootroot00000000000000#!/usr/bin/env bash # # Train processing + presentation predictors against an *already trained* # affinity ensemble (models.combined dir). Mirrors stages 2-3 of # pan_allele_release_full.sh but skips stage 1, so it's cheap to run as # a tail-on after a sweep that has already produced the affinity stack. # # Required env: # AFFINITY_PREDICTOR path to existing models.combined dir # BASE_OUT where to write processing/, presentation/ # # Optional env (all have defaults compatible with release_full): # REPO, GPUS, MAX_WORKERS_PER_GPU, NUM_JOBS, DATALOADER_NUM_WORKERS, # MATMUL_PRECISION, MHCFLURRY_TORCH_COMPILE, # PROCESSING_NUM_JOBS, PROCESSING_MAX_WORKERS_PER_GPU, # PROCESSING_HELD_OUT_SAMPLES, PRESENTATION_DECOYS_PER_HIT, # PRESENTATION_FEATURE_CHUNK_SIZE, # PROCESSING_MINIBATCH_SIZE, PROCESSING_VARIANTS, # PRESENTATION_PROCESSING_WITH_FLANKS_KIND, # RELEASE_RANDOM_SEED, # MHCFLURRY_GPU_TELEMETRY, MHCFLURRY_GPU_TELEMETRY_SECONDS set -euo pipefail set -x : "${AFFINITY_PREDICTOR:?AFFINITY_PREDICTOR must be set}" : "${BASE_OUT:?BASE_OUT must be set}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" RECIPE_DIR="$SCRIPT_DIR/release_exact" : "${REPO:=$(cd "$SCRIPT_DIR/../.." && pwd)}" # shellcheck disable=SC1091 source "$SCRIPT_DIR/gpu_telemetry.sh" GPU_TELEMETRY_PID="" trap stop_gpu_telemetry EXIT export PYTHONUNBUFFERED=1 export MHCFLURRY_TORCH_COMPILE="${MHCFLURRY_TORCH_COMPILE:-0}" export MHCFLURRY_TORCH_COMPILE_LOSS="${MHCFLURRY_TORCH_COMPILE_LOSS:-0}" export MHCFLURRY_MATMUL_PRECISION="${MHCFLURRY_MATMUL_PRECISION:-highest}" mkdir -p "$BASE_OUT/processing" "$BASE_OUT/presentation" if command -v nvidia-smi >/dev/null 2>&1; then GPUS=$(nvidia-smi -L 2>/dev/null | wc -l | tr -d ' ') else GPUS=0 fi MAX_WORKERS_PER_GPU="${MAX_WORKERS_PER_GPU:-auto}" DATALOADER_NUM_WORKERS="${DATALOADER_NUM_WORKERS:-auto}" PROCESSING_HELD_OUT_SAMPLES="${PROCESSING_HELD_OUT_SAMPLES:-10}" PRESENTATION_DECOYS_PER_HIT="${PRESENTATION_DECOYS_PER_HIT:-2}" PRESENTATION_SAMPLE_FRACTION="${PRESENTATION_SAMPLE_FRACTION:-0.1}" PRESENTATION_FEATURE_CHUNK_SIZE="${PRESENTATION_FEATURE_CHUNK_SIZE:-250000}" PROCESSING_MINIBATCH_SIZE="${PROCESSING_MINIBATCH_SIZE:-512}" PROCESSING_VARIANTS="${PROCESSING_VARIANTS:-with_flanks no_flank short_flanks}" PRESENTATION_PROCESSING_WITH_FLANKS_KIND="${PRESENTATION_PROCESSING_WITH_FLANKS_KIND:-short_flanks}" RELEASE_RANDOM_SEED="${RELEASE_RANDOM_SEED:-42}" processing_variant_enabled() { case " $PROCESSING_VARIANTS " in *" $1 "*) return 0 ;; *) return 1 ;; esac } seen_processing_variants=" " for processing_variant in $PROCESSING_VARIANTS; do case "$processing_variant" in with_flanks|no_flank|short_flanks) ;; *) echo "Unknown PROCESSING_VARIANTS entry: $processing_variant" >&2 exit 2 ;; esac case "$seen_processing_variants" in *" $processing_variant "*) echo "Duplicate PROCESSING_VARIANTS entry: $processing_variant" >&2 exit 2 ;; esac seen_processing_variants="$seen_processing_variants$processing_variant " done processing_variant_enabled no_flank || { echo "PROCESSING_VARIANTS must include no_flank for presentation training." >&2 exit 2 } case "$PRESENTATION_PROCESSING_WITH_FLANKS_KIND" in with_flanks|short_flanks) ;; *) echo "PRESENTATION_PROCESSING_WITH_FLANKS_KIND must be with_flanks or short_flanks." >&2 exit 2 ;; esac processing_variant_enabled "$PRESENTATION_PROCESSING_WITH_FLANKS_KIND" || { echo "PROCESSING_VARIANTS must include PRESENTATION_PROCESSING_WITH_FLANKS_KIND=$PRESENTATION_PROCESSING_WITH_FLANKS_KIND." >&2 exit 2 } if [ "$GPUS" -eq 0 ]; then NUM_JOBS=1 MAX_WORKERS_PER_GPU=1 else NUM_JOBS="${NUM_JOBS:-auto}" case "$NUM_JOBS" in auto) ;; *[!0-9]*) echo "NUM_JOBS must be auto or an integer; got '$NUM_JOBS'." >&2 exit 2 ;; *) if [ "$NUM_JOBS" -lt 1 ]; then echo "NUM_JOBS must be at least 1; got '$NUM_JOBS'." >&2 exit 2 fi ;; esac fi DATALOADER_NUM_WORKERS_REQUESTED="$DATALOADER_NUM_WORKERS" COMMON_PARALLELISM_ARGS=( --num-jobs "$NUM_JOBS" --max-tasks-per-worker 1000 --gpus "$GPUS" --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" --dataloader-num-workers "$DATALOADER_NUM_WORKERS" --torch-compile "${TORCH_COMPILE_CLI:-0}" --matmul-precision "${MATMUL_PRECISION:-highest}" ) [ "${MHCFLURRY_ENABLE_TIMING:-0}" = "1" ] && COMMON_PARALLELISM_ARGS+=(--enable-timing) PROCESSING_NUM_JOBS="${PROCESSING_NUM_JOBS:-auto}" PROCESSING_MAX_WORKERS_PER_GPU="${PROCESSING_MAX_WORKERS_PER_GPU:-auto}" PROCESSING_PARALLELISM_ARGS=( --num-jobs "$PROCESSING_NUM_JOBS" --max-tasks-per-worker 1000 --gpus "$GPUS" --max-workers-per-gpu "$PROCESSING_MAX_WORKERS_PER_GPU" --dataloader-num-workers "$DATALOADER_NUM_WORKERS" --torch-compile "${TORCH_COMPILE_CLI:-0}" --matmul-precision "${MATMUL_PRECISION:-highest}" ) [ "${MHCFLURRY_ENABLE_TIMING:-0}" = "1" ] && PROCESSING_PARALLELISM_ARGS+=(--enable-timing) PRESENTATION_NUM_JOBS="${PRESENTATION_NUM_JOBS:-auto}" PRESENTATION_MAX_WORKERS_PER_GPU="${PRESENTATION_MAX_WORKERS_PER_GPU:-auto}" PRESENTATION_PARALLELISM_ARGS=( --num-jobs "$PRESENTATION_NUM_JOBS" --max-tasks-per-worker 1000 --gpus "$GPUS" --max-workers-per-gpu "$PRESENTATION_MAX_WORKERS_PER_GPU" --dataloader-num-workers "$DATALOADER_NUM_WORKERS" --torch-compile "${TORCH_COMPILE_CLI:-0}" --matmul-precision "${MATMUL_PRECISION:-highest}" ) [ "${MHCFLURRY_ENABLE_TIMING:-0}" = "1" ] && PRESENTATION_PARALLELISM_ARGS+=(--enable-timing) PRESENTATION_CALIBRATION_NUM_JOBS="${PRESENTATION_CALIBRATION_NUM_JOBS:-auto}" PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU="${PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU:-auto}" PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE="${PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE:-auto}" PRESENTATION_CALIBRATION_PARALLELISM_ARGS=( --num-jobs "$PRESENTATION_CALIBRATION_NUM_JOBS" --max-tasks-per-worker 1000 --gpus "$GPUS" --max-workers-per-gpu "$PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU" --dataloader-num-workers "$DATALOADER_NUM_WORKERS" --torch-compile "${TORCH_COMPILE_CLI:-0}" --matmul-precision "${MATMUL_PRECISION:-highest}" ) [ "${MHCFLURRY_ENABLE_TIMING:-0}" = "1" ] && PRESENTATION_CALIBRATION_PARALLELISM_ARGS+=(--enable-timing) compress_csv_bzip2() { local path="$1" if command -v lbzip2 >/dev/null 2>&1; then lbzip2 -f "$path" elif command -v pbzip2 >/dev/null 2>&1; then pbzip2 -f "$path" else bzip2 -f "$path" fi } # ============================================================ # STAGE 2 — PROCESSING # ============================================================ STAGE2_START=$(date +%s) start_gpu_telemetry "$BASE_OUT/processing/gpu_occupancy.csv" cd "$BASE_OUT/processing" mhcflurry-downloads fetch data_mass_spec_annotated data_references cp "$REPO/downloads-generation/models_class1_processing/annotate_hits_with_expression.py" . cp "$RECIPE_DIR/make_train_data.processing.py" . python annotate_hits_with_expression.py \ --hits "$(mhcflurry-downloads path data_mass_spec_annotated)/annotated_ms.csv.bz2" \ --expression "$(mhcflurry-downloads path data_curated)/rna_expression.csv.bz2" \ --out "$(pwd)/hits_with_tpm.csv" compress_csv_bzip2 "$(pwd)/hits_with_tpm.csv" # Keep the processing matching reference independent of the candidate affinity. if [ -z "${PROCESSING_AFFINITY_REFERENCE:-}" ]; then mhcflurry-downloads fetch models_class1_pan fi PROCESSING_AFFINITY_REFERENCE="${PROCESSING_AFFINITY_REFERENCE:-$(mhcflurry-downloads path models_class1_pan)/models.combined}" mhcflurry train processing-data \ --hits "$(pwd)/hits_with_tpm.csv.bz2" \ --affinity-predictor "$PROCESSING_AFFINITY_REFERENCE" \ --proteome-reference-csv "$(mhcflurry-downloads path data_references)/uniprot_proteins.csv.bz2" \ --ppv-multiplier 100 \ --negative-policy matched --decoys-per-hit 1 --max-affinity-distance 0.25 \ --random-seed "$RELEASE_RANDOM_SEED" \ --out "$(pwd)/train_data.csv" \ "${COMMON_PARALLELISM_ARGS[@]}" compress_csv_bzip2 "$(pwd)/train_data.csv" mhcflurry class1-generate-training-hyperparameters processing-base \ --minibatch-size "$PROCESSING_MINIBATCH_SIZE" \ --optimizer-implementation keras \ --init glorot_uniform \ > hyperparameters.base.yaml for kind in $PROCESSING_VARIANTS; do PROCESSING_VARIANT_HYPERPARAMETER_ARGS=( --optimizer-implementation keras --init glorot_uniform ) if [[ "$kind" == "with_flanks" ]]; then PROCESSING_VARIANT_HYPERPARAMETER_ARGS=( --optimizer-implementation pytorch --init kaiming_uniform_fan_in ) fi mhcflurry class1-generate-training-hyperparameters processing-variant \ hyperparameters.base.yaml "$kind" \ "${PROCESSING_VARIANT_HYPERPARAMETER_ARGS[@]}" \ > "hyperparameters.$kind.yaml" mhcflurry-class1-train-processing-models \ --data "$(pwd)/train_data.csv.bz2" \ --held-out-samples "$PROCESSING_HELD_OUT_SAMPLES" \ --num-folds 4 \ --random-seed "$RELEASE_RANDOM_SEED" \ --hyperparameters "hyperparameters.$kind.yaml" \ --out-models-dir "$(pwd)/models.unselected.$kind" \ --worker-log-dir "$BASE_OUT/processing" \ "${PROCESSING_PARALLELISM_ARGS[@]}" mhcflurry-class1-select-processing-models \ --data "$(pwd)/models.unselected.$kind/train_data.csv.bz2" \ --models-dir "$(pwd)/models.unselected.$kind" \ --out-models-dir "$(pwd)/models.selected.$kind" \ --min-models-per-fold 1 \ --max-models-per-fold 2 \ --save-validation-predictions \ "${PROCESSING_PARALLELISM_ARGS[@]}" cp "$(pwd)/models.unselected.$kind/train_data.csv.bz2" \ "$(pwd)/models.selected.$kind/train_data.csv.bz2" done stop_gpu_telemetry echo "STAGE 2 duration: $(( $(date +%s) - STAGE2_START )) sec" # ============================================================ # STAGE 3 — PRESENTATION # ============================================================ STAGE3_START=$(date +%s) start_gpu_telemetry "$BASE_OUT/presentation/gpu_occupancy.csv" cd "$BASE_OUT/presentation" cp "$RECIPE_DIR/make_train_data.presentation.py" \ make_train_data.presentation.py python make_train_data.presentation.py \ --hits "$BASE_OUT/processing/hits_with_tpm.csv.bz2" \ --proteome-reference-csv "$(mhcflurry-downloads path data_references)/uniprot_proteins.csv.bz2" \ --decoys-per-hit "$PRESENTATION_DECOYS_PER_HIT" \ --exclude-pmid 31844290 31495665 31154438 \ --only-format MULTIALLELIC \ --sample-fraction "$PRESENTATION_SAMPLE_FRACTION" \ --random-seed "$RELEASE_RANDOM_SEED" \ --out "$(pwd)/train_data.csv" compress_csv_bzip2 "$(pwd)/train_data.csv" mhcflurry-class1-train-presentation-models \ --data "$(pwd)/train_data.csv.bz2" \ --affinity-predictor "$AFFINITY_PREDICTOR" \ --processing-predictor-with-flanks "$BASE_OUT/processing/models.selected.$PRESENTATION_PROCESSING_WITH_FLANKS_KIND" \ --processing-predictor-without-flanks "$BASE_OUT/processing/models.selected.no_flank" \ --out-models-dir "$(pwd)/models" \ --random-seed "$RELEASE_RANDOM_SEED" \ --feature-chunk-size "$PRESENTATION_FEATURE_CHUNK_SIZE" \ "${PRESENTATION_PARALLELISM_ARGS[@]}" mhcflurry-calibrate-percentile-ranks \ --models-dir "$(pwd)/models" \ --match-amino-acid-distribution-data "$AFFINITY_PREDICTOR/train_data.csv.bz2" \ --alleles-file "$AFFINITY_PREDICTOR/train_data.csv.bz2" \ --predictor-kind class1_presentation \ --num-peptides-per-length 10000 \ --alleles-per-genotype 1 \ --num-genotypes 50 \ --prediction-batch-size "$PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE" \ --random-seed "$RELEASE_RANDOM_SEED" \ --verbosity 1 \ "${PRESENTATION_CALIBRATION_PARALLELISM_ARGS[@]}" cp "$AFFINITY_PREDICTOR/train_data.csv.bz2" \ "$(pwd)/models/affinity_predictor_train_data.csv.bz2" cp "$BASE_OUT/processing/models.selected.$PRESENTATION_PROCESSING_WITH_FLANKS_KIND/train_data.csv.bz2" \ "$(pwd)/models/processing_predictor_with_flanks_train_data.csv.bz2" cp "$BASE_OUT/processing/models.selected.no_flank/train_data.csv.bz2" \ "$(pwd)/models/processing_predictor_no_flank_train_data.csv.bz2" stop_gpu_telemetry echo "STAGE 3 duration: $(( $(date +%s) - STAGE3_START )) sec" echo "=== presentation predictor at $BASE_OUT/presentation/models ===" mhcflurry-2.3.6/scripts/training/processing_flank_ablation.py000066400000000000000000000161631525677230600246350ustar00rootroot00000000000000#!/usr/bin/env python3 """Diagnose external-flank reliance of fixed processing ensembles on risk sets.""" import argparse import json from pathlib import Path import numpy import pandas from mhcflurry.cli.processing_affinity_control import ( IDENTITY_COLUMNS, score_risk_sets, summarize_metrics) from mhcflurry.common import configure_pytorch from mhcflurry.experiment_archive import sha256_file from mhcflurry.processing_matching import MATCHING_POLICY, validate_matching_assignments def perturbation_table(frame, seed): """Keep one deterministic input per source row, including reused decoys.""" required = ["source_row", *IDENTITY_COLUMNS] if frame.empty or frame[required].drop(columns=["n_flank", "c_flank"]).isna().any().any(): raise ValueError("Require nonempty, identified source rows") normalized = frame[required].copy() for column in ("n_flank", "c_flank"): normalized[column] = normalized[column].fillna("") unique = normalized.drop_duplicates() if unique.source_row.duplicated().any(): raise ValueError("A source row maps to inconsistent peptide/label/flanks") unique = unique.sort_values("source_row").reset_index(drop=True) unique["peptide_len"] = unique.peptide.str.len() rng = numpy.random.default_rng(seed) donor = numpy.arange(len(unique)) for indices in unique.groupby(["sample_id", "peptide_len"], sort=True).indices.values(): donor[indices] = rng.permutation(indices) unique["donor_source_row"] = unique.source_row.to_numpy()[donor] for column in ("n_flank", "c_flank"): unique["shuffled_" + column] = unique[column].to_numpy()[donor] return unique def flank_audit(frame, radius=5): """Count usable local context; stored X padding is not observed sequence.""" records = [] for (sample, hit), group in frame.groupby(["sample_id", "hit"], sort=True): record = {"sample_id": sample, "hit": hit, "n": len(group)} for side in ("n", "c"): sequence = group[side + "_flank"].fillna("") context = sequence.str[-radius:] if side == "n" else sequence.str[:radius] complete = context.str.len().eq(radius) & ~context.str.contains("[^ACDEFGHIKLMNPQRSTVWY]") record[side + "_complete_fraction"] = complete.mean() record[side + "_empty_fraction"] = sequence.eq("").mean() records.append(record) return pandas.DataFrame(records) def predictor_files(directory): """Fingerprint only the manifest and the primary weights actually loaded.""" directory = Path(directory) manifest = directory / "manifest.csv" names = pandas.read_csv(manifest, usecols=["model_name"]).model_name if names.empty or names.duplicated().any(): raise ValueError("Require nonempty unique model names") paths = [manifest] for name in names: if Path(name).name != name: raise ValueError("Invalid model name") paths.append(directory / ("weights_" + name + ".npz")) return {p.name: sha256_file(p) for p in paths} def main(argv=None): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--input", required=True, type=Path, help="Saved processing-affinity-control matched_predictions table.") parser.add_argument("--predictor", action="append", required=True, metavar="NAME=DIR") parser.add_argument("--out", required=True, type=Path) parser.add_argument("--seed", type=int, default=42) parser.add_argument("--backend", choices=("cpu", "mps", "gpu"), default="cpu") parser.add_argument("--threads", type=int, default=4) parser.add_argument("--batch-size", type=int, default=4096) args = parser.parse_args(argv) if args.threads < 1 or args.batch_size < 1: raise ValueError("Threads and batch size must be positive") if args.out.exists(): raise ValueError("Use a fresh output directory to preserve prior experiments") models = {} for spec in args.predictor: name, directory = spec.split("=", 1) if not name or Path(name).name != name or name in models: raise ValueError("Require distinct nonempty predictor names") models[name] = Path(directory).resolve() provenance = {"design": "fixed-weights-flank-perturbation-v1", "seed": args.seed, "input": str(args.input.resolve()), "input_sha256": sha256_file(args.input), "backend": args.backend, "threads": args.threads, "batch_size": args.batch_size, "predictors": {name: {"path": str(path), "files": predictor_files(path)} for name, path in models.items()}, "training": False, "release_accepted": False} frame = pandas.read_csv(args.input) counts = frame.groupby(["sample_id", "risk_set_id"]).size() - 1 validate_matching_assignments(frame, "mhcflurry_production_affinity", counts.iloc[0]) provenance["processing_matching_policy"] = MATCHING_POLICY unique = perturbation_table(frame, args.seed) args.out.mkdir(parents=True) (args.out / "experiment.json").write_text(json.dumps(provenance, indent=2) + "\n") unique.to_csv(args.out / "perturbed_inputs.csv.bz2", index=False) flank_audit(unique).to_csv(args.out / "flank_audit.csv", index=False) configure_pytorch(backend=args.backend, num_threads=args.threads) from mhcflurry import Class1ProcessingPredictor score_columns = [] for name, path in models.items(): predictor = Class1ProcessingPredictor.load(str(path)) for mode in ("real", "masked", "shuffled"): print("Scoring", name, mode, len(unique), "unique rows", flush=True) if mode == "masked": n_flanks = c_flanks = [""] * len(unique) else: prefix = "shuffled_" if mode == "shuffled" else "" n_flanks = unique[prefix + "n_flank"].tolist() c_flanks = unique[prefix + "c_flank"].tolist() values = predictor.predict(unique.peptide.tolist(), n_flanks, c_flanks, batch_size=args.batch_size) if not numpy.isfinite(values).all(): raise ValueError("Nonfinite predictions") score = name + "__" + mode mapped = pandas.Series(values, index=unique.source_row) frame[score] = frame.source_row.map(mapped) score_columns.append(score) # Persist each inference result before starting the next condition. pandas.DataFrame({"source_row": unique.source_row, score: values}).to_csv( args.out / (score + ".csv.bz2"), index=False) del predictor metrics = score_risk_sets(frame, score_columns) summary, comparisons = summarize_metrics(metrics, score_columns[0]) frame.to_csv(args.out / "matched_predictions.csv.bz2", index=False) metrics.to_csv(args.out / "metrics.csv", index=False) summary.to_csv(args.out / "summary.csv", index=False) comparisons.to_csv(args.out / "comparisons.csv", index=False) print(summary.to_string(index=False), flush=True) (args.out / "completed.json").write_text(json.dumps({"complete": True}) + "\n") if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/release_exact/000077500000000000000000000000001525677230600216605ustar00rootroot00000000000000mhcflurry-2.3.6/scripts/training/release_exact/generate_hyperparameters.base.py000066400000000000000000000020751525677230600302340ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Generate grid of hyperparameters. """ from mhcflurry.cli.generate_training_hyperparameters import ( PROCESSING_DEFAULT_MINIBATCH_SIZE, add_minibatch_argument, build_processing_base_grid as build_grid, processing_base_grid_iter as hyperparameters_grid, run_processing_base_argv as main, ) def make_parser(): import argparse parser = argparse.ArgumentParser(description=__doc__) add_minibatch_argument(parser, PROCESSING_DEFAULT_MINIBATCH_SIZE) return parser if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/release_exact/generate_hyperparameters.py000066400000000000000000000017121525677230600273200ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Generate grid of hyperparameters. """ from mhcflurry.cli.generate_training_hyperparameters import ( DEFAULT_MINIBATCH_SIZE, add_minibatch_argument, build_affinity_grid as build_grid, run_affinity_argv as main, ) def make_parser(): import argparse parser = argparse.ArgumentParser(description=__doc__) add_minibatch_argument(parser) return parser if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/release_exact/generate_hyperparameters.variants.py000066400000000000000000000027051525677230600311510ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Generate grid of hyperparameters. """ import argparse from mhcflurry.cli.generate_training_hyperparameters import ( PROCESSING_VARIANT_CHOICES, build_processing_variant_grid, run_processing_variant_argv as main, transform_processing_hyperparameters, ) def make_parser(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( "production_hyperparameters", metavar="YAML", help="Production processing hyperparameter grid.") parser.add_argument( "kind", choices=PROCESSING_VARIANT_CHOICES, help="Hyperparameters variant to output.") return parser def transform(kind, hyperparameters): return [transform_processing_hyperparameters(kind, hyperparameters)] def build_grid(production_hyperparameters, kind): return build_processing_variant_grid(production_hyperparameters, kind) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/release_exact/make_train_data.presentation.py000066400000000000000000000263721525677230600300610ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Make training data by selecting decoys, etc. """ import sys import argparse import numpy import collections import pandas import tqdm import mhcflurry from mhcflurry.common import ( add_random_seed_arg, configure_random_seed, derive_seed, fraction_arg, normalize_class1_genotype, normalize_sequence_resolved_allele_name, positive_float_arg, ) from mhcflurry.proteome_decoys import ( infer_flanking_length, load_reference_sequences, peptides_by_length_from_frame, sample_peptide_frame_for_accessions, ) from mhcflurry.release_holdout import exclude_samples parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "--hits", metavar="CSV", required=True, help="Multiallelic mass spec") proteome_source_group = parser.add_mutually_exclusive_group(required=True) proteome_source_group.add_argument( "--proteome-peptides", metavar="CSV", help="Proteome peptides") proteome_source_group.add_argument( "--proteome-reference-csv", metavar="CSV", help=( "Protein reference CSV with accession and seq columns. If specified, " "decoy peptide candidates are generated per sample instead of reading " "a materialized proteome peptide CSV.")) parser.add_argument( "--decoys-per-hit", type=positive_float_arg, metavar="N", default=2, help="Decoys per hit") parser.add_argument( "--exclude-pmid", nargs="+", default=[], help="Exclude given PMID") parser.add_argument( "--only-pmid", nargs="*", default=[], help="Include only the given PMID") parser.add_argument( "--exclude-train-data", nargs="+", default=[], help="Remove hits and decoys included in the given training data") parser.add_argument( "--exclude-samples-file", help="Generated release-holdout CSV of sample_id values to exclude") parser.add_argument( "--only-format", choices=("MONOALLELIC", "MULTIALLELIC"), help="Include only data of the given format") parser.add_argument( "--sample-fraction", type=fraction_arg, help="Subsample data by specified fraction (e.g. 0.1)") parser.add_argument( "--out", metavar="CSV", required=True, help="File to write") add_random_seed_arg(parser) def canonicalize_training_allele(raw_name): """Return a sequence-resolved class-I allele or fail immediately.""" return normalize_sequence_resolved_allele_name(raw_name) def split_hla_genotype(value): """Split whitespace-delimited MHC alleles and canonicalize each token.""" return normalize_class1_genotype(value) def run(): args = parser.parse_args(sys.argv[1:]) master_seed = configure_random_seed( args.random_seed, name="make-presentation-train-data") hit_df = pandas.read_csv(args.hits) hit_df["pmid"] = hit_df["pmid"].astype(str) original_samples_pmids = hit_df.pmid.unique() numpy.testing.assert_equal(hit_df.hit_id.nunique(), len(hit_df)) hit_df = hit_df.loc[ (hit_df.mhc_class == "I") & (hit_df.peptide.str.len() <= 11) & (hit_df.peptide.str.len() >= 8) & (~hit_df.protein_ensembl.isnull()) & (hit_df.peptide.str.match("^[%s]+$" % "".join( mhcflurry.amino_acid.COMMON_AMINO_ACIDS))) ] hit_df['alleles'] = hit_df.hla.map(split_hla_genotype) # Every downstream predictor input comes from this canonical spelling. # Keep the tuple for exclusion checks and the space-delimited column for # the presentation training/prediction APIs. hit_df["hla"] = hit_df["alleles"].map(" ".join) print("Loaded hits from %d samples" % hit_df.sample_id.nunique()) if args.only_format: hit_df = hit_df.loc[hit_df.format == args.only_format].copy() print("Subselected to %d %s samples" % ( hit_df.sample_id.nunique(), args.only_format)) if args.exclude_samples_file: hit_df = exclude_samples( hit_df, args.exclude_samples_file, "presentation") if args.only_pmid or args.exclude_pmid: assert not (args.only_pmid and args.exclude_pmid) pmids = list(args.only_pmid) + list(args.exclude_pmid) missing = [pmid for pmid in pmids if pmid not in original_samples_pmids] assert not missing, (missing, original_samples_pmids) mask = hit_df.pmid.isin(pmids) if args.exclude_pmid: mask = ~mask new_hit_df = hit_df.loc[mask] print( "Selecting by pmids", pmids, "reduced dataset from", len(hit_df), "to", len(new_hit_df)) hit_df = new_hit_df.copy() print("Subselected by pmid to %d samples" % hit_df.sample_id.nunique()) allele_to_excluded_peptides = collections.defaultdict(set) for train_dataset in args.exclude_train_data: if not train_dataset: continue print("Excluding hits from", train_dataset) train_df = pandas.read_csv(train_dataset) train_df["allele"] = train_df.allele.map(canonicalize_training_allele) for (allele, peptides) in train_df.groupby("allele").peptide.unique().items(): allele_to_excluded_peptides[allele].update(peptides) train_counts = train_df.groupby( ["allele", "peptide"]).measurement_value.count().to_dict() hit_no_train = hit_df.loc[ [ not any([ train_counts.get((allele, row.peptide)) for allele in row.alleles ]) for _, row in tqdm.tqdm(hit_df.iterrows(), total=len(hit_df))] ] print( "Excluding hits from", train_dataset, "reduced dataset from", len(hit_df), "to", len(hit_no_train)) hit_df = hit_no_train sample_table = hit_df.drop_duplicates("sample_id").set_index("sample_id") grouped = hit_df.groupby("sample_id").nunique() for col in sample_table.columns: if (grouped[col] > 1).any(): del sample_table[col] if args.proteome_peptides: print("Loading proteome peptides") all_peptides_df = pandas.read_csv(args.proteome_peptides) print("Loaded: ", all_peptides_df.shape) all_peptides_df = all_peptides_df.loc[ all_peptides_df.protein_accession.isin( hit_df.protein_accession.unique()) & all_peptides_df.peptide.str.match("^[%s]+$" % "".join( mhcflurry.amino_acid.COMMON_AMINO_ACIDS)) ].copy() all_peptides_by_length = peptides_by_length_from_frame(all_peptides_df) print( "Subselected proteome peptides by accession: ", all_peptides_df.shape) proteome_sequences = None flanking_length = None else: print("Loading protein reference sequences") proteome_sequences = load_reference_sequences( args.proteome_reference_csv, hit_df.protein_accession.unique()) print("Loaded %d protein sequences" % len(proteome_sequences)) all_peptides_by_length = None flanking_length = infer_flanking_length(hit_df) print("Will generate proteome peptides per sample with flank length", flanking_length) print("Selecting decoys.") lengths = [8, 9, 10, 11] result_df = [] for sample_id, sub_df in tqdm.tqdm( hit_df.groupby("sample_id"), total=hit_df.sample_id.nunique()): # Make each sample independent of group iteration order while keeping # every decoy draw rooted in the one recorded release seed. numpy.random.seed( derive_seed(master_seed, "sample", sample_id) % (2 ** 32)) result_df.append( sub_df[[ "protein_accession", "peptide", "sample_id", "n_flank", "c_flank", ]].copy()) result_df[-1]["hit"] = 1 excluded_peptides = set() for allele in sample_table.loc[sample_id].alleles: excluded_peptides.update(allele_to_excluded_peptides[allele]) print( sample_id, "will exclude", len(excluded_peptides), "peptides from decoy universe") for length in lengths: sample_peptides = sub_df.peptide.unique() sample_accessions = sub_df.protein_accession.unique() exclude_peptides = set(sample_peptides) exclude_peptides.update(excluded_peptides) num_decoys = int(len(sub_df) * args.decoys_per_hit / len(lengths)) if all_peptides_by_length is None: selected_decoys = sample_peptide_frame_for_accessions( sample_accessions, proteome_sequences, lengths=[length], flanking_length=flanking_length, exclude_peptides=exclude_peptides, n=num_decoys, # Same seed, same decoys as historical releases and the # processing script; the position sampler draws differently. sampling_method="reservoir", ) else: universe = all_peptides_by_length[length] possible_universe = universe.loc[ (~universe.peptide.isin(sample_peptides)) & (~universe.peptide.isin(excluded_peptides)) & (universe.protein_accession.isin( sample_accessions)) ] selected_decoys = possible_universe.sample(n=num_decoys) result_df.append(selected_decoys[ ["protein_accession", "peptide", "n_flank", "c_flank"] ].copy()) result_df[-1]["hit"] = 0 result_df[-1]["sample_id"] = sample_id result_df = pandas.concat(result_df, ignore_index=True, sort=False) result_df["hla"] = result_df.sample_id.map(sample_table.hla) print(result_df) print("Counts:") print(result_df.groupby(["sample_id", "hit"]).peptide.nunique()) print("Hit counts:") print( result_df.loc[ result_df.hit == 1 ].groupby("sample_id").hit.count().sort_values()) print("Hit rates:") print(result_df.groupby("sample_id").hit.mean().sort_values()) if args.sample_fraction: print("Subsampling to ", args.sample_fraction) result_df = result_df.sample( frac=args.sample_fraction, random_state=( derive_seed(master_seed, "sample_fraction") % (2 ** 32) ), ) print("Subsampled:") print(result_df) print("Hit rates:") print(result_df.groupby("sample_id").hit.mean().sort_values()) result_df.to_csv(args.out, index=False) print("Wrote: ", args.out) if __name__ == '__main__': run() mhcflurry-2.3.6/scripts/training/release_exact/make_train_data.processing.py000066400000000000000000000526041525677230600275170ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Make training data by selecting decoys, etc. """ import sys import argparse import numpy import time from functools import partial import pandas import tqdm from mhcflurry.processing_matching import ( add_processing_matching_args, initialize_matching_artifacts, validate_matched_training_data) from mhcflurry.processing_preparation import ( add_processing_preparation_args, sample_preparation_steps, ScoredValues) from mhcflurry.scoring_pipeline import scoring_pipeline from mhcflurry.numeric_proteome import ProcessingProteome, ProteinWindows, NumericCandidatePool from mhcgnomes import parse from mhcflurry.common import ( add_random_seed_arg, allele_locus_name, configure_logging, configure_random_seed, derive_seed, normalize_allele_name, positive_float_arg, positive_int_arg, ) from mhcflurry.parallelism import ( add_local_parallelism_args, resolve_local_parallelism_args, worker_pool_with_gpu_assignments_from_args, call_wrapped_kwargs) from mhcflurry.workload_planning import ( WORKLOAD_PROCESSING_DATA, path_size_bytes, ) from mhcflurry.proteome_decoys import ( infer_flanking_length, load_reference_sequences, peptides_by_length_from_frame, sample_peptide_frame_for_accessions, ) from mhcflurry.release_holdout import exclude_samples from mhcflurry.cluster_parallelism import ( add_cluster_parallelism_args, cluster_results_from_args) tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 # To avoid pickling large matrices to send to child processes when running in # parallel, we use this global variable as a place to store data. Data that is # stored here before creating the thread pool will be inherited to the child # processes upon fork() call, allowing local workers to read the same # copy-on-write pages instead of receiving a pickled copy. WORKER_CONTEXT = {} HUMAN_CLASS1_ABC_LOCI = ("HLA-A", "HLA-B", "HLA-C") def canonicalize_processing_allele(raw_name): """Return a sequence-resolved canonical HLA-A/B/C allele or ``None``. Non-HLA-A/B/C names retain the historical filtering behavior and return ``None``. A serotype (for example ``A2``) or one-field allele group (for example ``A*02``) is an error: neither identifies one allele sequence, so choosing a representative or averaging affinities would silently change processing-training decoy selection. """ raw_name = str(raw_name).strip() if allele_locus_name(raw_name) not in HUMAN_CLASS1_ABC_LOCI: return None # Preserve the predictor's no-alias-first contract. Retired names can have # their own pseudosequence key; the predictor applies an IMGT alias only # when that original key is unavailable. normalized = normalize_allele_name( raw_name, raise_on_error=False, use_allele_aliases=False, ) parsed = ( parse(normalized, only_class1=True, raise_on_error=False) if normalized is not None else None ) if parsed is None or len(getattr(parsed, "allele_fields", ())) < 2: raise ValueError( "Processing training requires a sequence-resolved HLA-A/B/C " "allele with at least two fields; got %r. Serotypes and " "one-field allele groups cannot be converted without choosing " "among multiple alleles." % raw_name ) return normalized def predictor_allele_for_processing(affinity_predictor, allele): """Resolve a normalized training allele to a supported predictor key.""" predictor_allele = affinity_predictor.canonicalize_allele_name(allele) if predictor_allele not in affinity_predictor.supported_alleles: raise ValueError( "Affinity predictor does not support normalized processing " "allele %s (resolved to %s)." % (allele, predictor_allele) ) return predictor_allele parser = argparse.ArgumentParser(usage=__doc__) add_processing_matching_args(parser) add_processing_preparation_args(parser) parser.add_argument( "--hits", metavar="CSV", required=True, help="Multiallelic mass spec") parser.add_argument( "--affinity-predictor", required=True, metavar="CSV", help="Class 1 affinity predictor to use") proteome_source_group = parser.add_mutually_exclusive_group(required=True) proteome_source_group.add_argument( "--proteome-peptides", metavar="CSV", help="Proteome peptides") proteome_source_group.add_argument( "--proteome-reference-csv", metavar="CSV", help=( "Protein reference CSV with accession and seq columns. If specified, " "decoy peptide candidates are generated inside workers instead of " "materializing a proteome peptide CSV.")) parser.add_argument( "--hit-multiplier-to-take", type=positive_float_arg, default=1, help="") parser.add_argument( "--ppv-multiplier", type=positive_int_arg, metavar="N", default=1000, help="Candidate decoys per hit before matching (legacy: top-binder pool multiplier).") parser.add_argument( "--exclude-contig", help="Exclude entries annotated to the given contig") parser.add_argument( "--exclude-samples-file", help="Generated release-holdout CSV of sample_id values to exclude") parser.add_argument( "--out", metavar="CSV", required=True, help="File to write") parser.add_argument( "--alleles", nargs="+", help="Include only the specified alleles") add_random_seed_arg(parser) add_local_parallelism_args(parser) add_cluster_parallelism_args(parser) def do_process_samples(samples, seed=None, constant_data=None): import mhcflurry import pandas import tqdm tqdm.monitor_interval = 0 # see https://github.com/tqdm/tqdm/issues/481 columns_to_keep = [ "hit_id", "protein_accession", "n_flank", "c_flank", "peptide", "sample_id", "affinity_prediction", "hit", ] if constant_data is None: constant_data = WORKER_CONTEXT args = constant_data['args'] lengths = constant_data['lengths'] all_peptides_by_length = constant_data.get('all_peptides_by_length') proteome_sequences = constant_data.get('proteome_sequences') flanking_length = constant_data.get('flanking_length') sample_table = constant_data['sample_table'] hit_df = constant_data['hit_df'] hit_df = hit_df.loc[ hit_df.sample_id.isin(samples) ] def get_predictor(): cached = constant_data.get("processing_affinity_predictor") if cached is None: cached = (args.affinity_predictor, mhcflurry.Class1AffinityPredictor.load(args.affinity_predictor)) constant_data["processing_affinity_predictor"] = cached print("Loaded worker affinity predictor", cached[1], flush=True) if cached[0] != args.affinity_predictor: raise ValueError("Worker affinity predictor changed between samples") return cached[1] numeric = args.negative_policy == "matched" and all_peptides_by_length is None if numeric and "processing_proteome" not in constant_data: constant_data["processing_proteome"] = ProcessingProteome(proteome_sequences) proteome = constant_data.get("processing_proteome") def build_sample(sample_id, sub_hit_df): # A distinct generator scope owns each sample's callbacks and RNG. sub_hit_df = sub_hit_df.copy().assign(hit=1) sub_hit_df = sub_hit_df[[c for c in columns_to_keep if c != "affinity_prediction"]] sample_peptides = sub_hit_df.peptide.unique() sample_accessions = sub_hit_df.protein_accession.unique() sample_seed = constant_data.get("sample_seeds", {}).get(sample_id, seed) rng = numpy.random.RandomState(None if sample_seed is None else int(sample_seed) % (2 ** 32)) def draw_candidates(length, excluded, count, draw_rng): if numeric: return proteome.sample(sample_accessions, length, count, excluded, draw_rng) if all_peptides_by_length is None: selected_decoys = sample_peptide_frame_for_accessions( sample_accessions, proteome_sequences, lengths=[length], flanking_length=flanking_length, exclude_peptides=excluded, n=count, sampling_method="reservoir", ) else: universe = all_peptides_by_length[length] possible_universe = universe.loc[ (~universe.peptide.isin(excluded)) & (universe.protein_accession.isin(sample_accessions)) ] if args.negative_policy == "matched": count = min(count, len(possible_universe)) selected_decoys = possible_universe.sample(n=count, random_state=draw_rng if args.negative_policy == "matched" else None) return selected_decoys[["protein_accession", "peptide", "n_flank", "c_flank"]].drop_duplicates("peptide") def initial_pool(): if args.negative_policy != "matched" and sample_seed is not None: numpy.random.seed(int(sample_seed) % (2 ** 32)) count = int(len(sub_hit_df) * args.ppv_multiplier / len(lengths)) parts = [draw_candidates(length, sample_peptides, count, rng) for length in lengths] if numeric: return NumericCandidatePool(sub_hit_df, ProteinWindows.concatenate(parts), sample_id, flanking_length) frames = [sub_hit_df] + parts merged = pandas.concat(frames, ignore_index=True, sort=False) merged["sample_id"] = sample_id return merged[[column for column in columns_to_keep if column != "affinity_prediction"]] def additional(length, excluded, round_seed): part = draw_candidates(length, excluded, args.expansion_candidates_per_length, numpy.random.RandomState(int(round_seed) % (2 ** 32))) if numeric: return NumericCandidatePool(sub_hit_df.iloc[:0], part, sample_id, flanking_length) return part.assign(sample_id=sample_id, hit=0) if args.negative_policy == "matched": selected_df = yield from sample_preparation_steps( args, sample_id, sub_hit_df, sample_seed, initial_pool, additional) else: merged_df = initial_pool() response = yield merged_df.peptide merged_df["affinity_prediction"] = response.values merged_df = merged_df.sort_values("affinity_prediction", ascending=True) num_to_take = int(len(sub_hit_df) * args.hit_multiplier_to_take) selected_df = merged_df.head(num_to_take)[ columns_to_keep ].sample(frac=1.0).copy() selected_df["hit"] = selected_df["hit"].fillna(0) selected_df["sample_id"] = sample_id print( "Processed sample", sample_id, "with hit and decoys:\n", selected_df.hit.value_counts()) return selected_df def score(sample_id, request): started = time.monotonic() predictor = get_predictor() resolved = predictor_allele_for_processing(predictor, sample_table.loc[sample_id].allele) if isinstance(request, NumericCandidatePool): models = predictor.class1_pan_allele_models or predictor.allele_to_allele_specific_models[resolved] peptides = request.prediction_input(models[0].get_device()) values = predictor.predict_numeric(peptides, allele=resolved) else: unique = pandas.Index(request).unique() by_peptide = pandas.Series(predictor.predict(unique, allele=resolved), index=unique) values = by_peptide.reindex(request).to_numpy() return ScoredValues(values, time.monotonic() - started) workflows = ((sample_id, build_sample(sample_id, group)) for sample_id, group in hit_df.groupby("sample_id", sort=False)) depth = args.preparation_pipeline_depth if args.negative_policy == "matched" else 1 results = dict(scoring_pipeline(workflows, score, max_in_flight=depth, cpu_workers=min(depth, 2))) result_df = [results[sample_id] for sample_id in hit_df.sample_id.unique()] result_df = pandas.concat(result_df, ignore_index=True, sort=False) return result_df def run(): import mhcflurry args = parser.parse_args(sys.argv[1:]) args.matching_reference = initialize_matching_artifacts(args) configure_logging() master_seed = configure_random_seed( args.random_seed, name="make-processing-train-data") resolve_local_parallelism_args( args, cap_auto_num_jobs=not args.cluster_parallelism, workload_name=WORKLOAD_PROCESSING_DATA, workload_hints={ "data_bytes": sum( value or 0 for value in ( path_size_bytes(args.hits), path_size_bytes(args.proteome_peptides), path_size_bytes(args.proteome_reference_csv), ) ) or None, }, ) serial_run = not args.cluster_parallelism and args.num_jobs == 0 hit_df = pandas.read_csv(args.hits) numpy.testing.assert_equal(hit_df.hit_id.nunique(), len(hit_df)) hit_df = hit_df.loc[ (hit_df.mhc_class == "I") & (hit_df.peptide.str.len() <= 11) & (hit_df.peptide.str.len() >= 8) & (~hit_df.protein_ensembl.isnull()) & (hit_df.peptide.str.match("^[%s]+$" % "".join( mhcflurry.amino_acid.COMMON_AMINO_ACIDS))) ] print("Loaded hits from %d samples" % hit_df.sample_id.nunique()) hit_df = hit_df.loc[hit_df.format == "MONOALLELIC"].copy() print("Subselected to %d monoallelic samples" % hit_df.sample_id.nunique()) if args.exclude_samples_file: hit_df = exclude_samples( hit_df, args.exclude_samples_file, "processing") hit_df["allele"] = hit_df.hla.map(canonicalize_processing_allele) hit_df = hit_df.loc[~hit_df.allele.isnull()].copy() print( "Subselected to %d sequence-resolved HLA-A/B/C samples" % hit_df.sample_id.nunique() ) if args.exclude_contig: new_hit_df = hit_df.loc[ hit_df.protein_primary_ensembl_contig.astype(str) != args.exclude_contig ] print( "Excluding contig", args.exclude_contig, "reduced dataset from", len(hit_df), "to", len(new_hit_df)) hit_df = new_hit_df.copy() if args.alleles: filter_alleles = set() for value in args.alleles: normalized = canonicalize_processing_allele(value) if normalized is None: raise ValueError( "--alleles requires HLA-A/B/C alleles; got %r" % value ) filter_alleles.add(normalized) new_hit_df = hit_df.loc[ hit_df.allele.isin(filter_alleles) ] print( "Selecting alleles", args.alleles, "reduced dataset from", len(hit_df), "to", len(new_hit_df)) hit_df = new_hit_df.copy() if hit_df.empty: raise ValueError( "No sequence-resolved HLA-A/B/C monoallelic hits remain after " "the requested filters." ) sample_table = hit_df.drop_duplicates("sample_id").set_index("sample_id") grouped = hit_df.groupby("sample_id").nunique() for col in sample_table.columns: if (grouped[col] > 1).any(): del sample_table[col] sample_table["total_hits"] = hit_df.groupby("sample_id").peptide.nunique() if args.proteome_peptides: print("Loading proteome peptides") all_peptides_df = pandas.read_csv(args.proteome_peptides) print("Loaded: ", all_peptides_df.shape) all_peptides_df = all_peptides_df.loc[ all_peptides_df.protein_accession.isin( hit_df.protein_accession.unique()) & all_peptides_df.peptide.str.match("^[%s]+$" % "".join( mhcflurry.amino_acid.COMMON_AMINO_ACIDS)) ].copy() all_peptides_by_length = peptides_by_length_from_frame(all_peptides_df) print( "Subselected proteome peptides by accession: ", all_peptides_df.shape) proteome_sequences = None flanking_length = None else: print("Loading protein reference sequences") proteome_sequences = load_reference_sequences( args.proteome_reference_csv, hit_df.protein_accession.unique()) print("Loaded %d protein sequences" % len(proteome_sequences)) all_peptides_by_length = None flanking_length = infer_flanking_length(hit_df) print("Will generate proteome peptides in workers with flank length", flanking_length) print("Selecting decoys.") WORKER_CONTEXT.clear() WORKER_CONTEXT['args'] = args WORKER_CONTEXT['lengths'] = [8, 9, 10, 11] WORKER_CONTEXT['all_peptides_by_length'] = all_peptides_by_length WORKER_CONTEXT['proteome_sequences'] = proteome_sequences WORKER_CONTEXT['flanking_length'] = flanking_length WORKER_CONTEXT['sample_table'] = sample_table WORKER_CONTEXT['hit_df'] = hit_df worker_pool = None start = time.time() sample_order = list(hit_df.sample_id.unique()) WORKER_CONTEXT["sample_seeds"] = {sample: derive_seed(master_seed, "sample", sample) for sample in sample_order} # Each pool task owns enough samples to overlap stages, while limiting the # granularity of process recycling and work distribution across GPUs. chunk_size = 4 * args.preparation_pipeline_depth if args.negative_policy == "matched" else 1 tasks = [ { "samples": sample_order[start:start + chunk_size], } for start in range(0, len(sample_order), chunk_size) ] if serial_run: # Serial run print("Running in serial.") results = [ do_process_samples(**task) for task in tasks ] elif args.cluster_parallelism: # Run using separate processes HPC cluster. print("Running on cluster.") results = cluster_results_from_args( args, work_function=do_process_samples, work_items=tasks, constant_data=WORKER_CONTEXT, input_serialization_method="dill", result_serialization_method="pickle", clear_constant_data=False) else: worker_pool = worker_pool_with_gpu_assignments_from_args( args, worker_context_module=__name__, worker_context_data=WORKER_CONTEXT, ) print("Worker pool", worker_pool) assert worker_pool is not None results = worker_pool.imap_unordered( partial(call_wrapped_kwargs, do_process_samples), tasks, chunksize=1) print("Reading results") result_by_sample = {} try: for worker_result in tqdm.tqdm(results, total=len(tasks)): for sample_id, selected_df in worker_result.groupby("sample_id"): print( "Received result for sample", sample_id, "with hit and decoys:\n", selected_df.hit.value_counts()) if sample_id in result_by_sample: raise RuntimeError( "Received duplicate processing result for sample %s" % sample_id) result_by_sample[sample_id] = selected_df if worker_pool: worker_pool.close() worker_pool.join() worker_pool = None finally: if worker_pool: worker_pool.terminate() worker_pool.join() print("Received all results in %0.2f sec" % (time.time() - start)) missing_samples = [ sample for sample in sample_order if sample not in result_by_sample ] if missing_samples: raise RuntimeError( "Missing processing result for sample(s): %s" % ", ".join(map(str, missing_samples))) result_df = pandas.concat( [result_by_sample[sample] for sample in sample_order], ignore_index=True, sort=False, ) result_df["hla"] = result_df.sample_id.map(sample_table.allele) print(result_df) print("Counts:") print(result_df.groupby(["sample_id", "hit"]).peptide.nunique()) print("Hit counts:") print( result_df.loc[ result_df.hit == 1 ].groupby("sample_id").hit.count().sort_values()) print("Hit rates:") print(result_df.groupby("sample_id").hit.mean().sort_values()) validate_matched_training_data( result_df, policy="matched" if args.negative_policy == "matched" else "legacy") result_df.to_csv(args.out, index=False) print("Wrote: ", args.out) if __name__ == '__main__': run() mhcflurry-2.3.6/scripts/training/release_exact/reassign_mass_spec_training_data.py000066400000000000000000000020621525677230600307660ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Reassign affinity values for mass spec data. """ from mhcflurry.cli.reassign_mass_spec_training_data import ( make_parser, reassign_mass_spec_training_data, ) parser = make_parser() def go(args): return reassign_mass_spec_training_data( args.data, ms_only=args.ms_only, drop_negative_ms=args.drop_negative_ms, set_measurement_value=args.set_measurement_value, out_csv=args.out_csv, verbose=args.verbose) if __name__ == "__main__": go(parser.parse_args()) mhcflurry-2.3.6/scripts/training/release_recipes.sh000066400000000000000000000022651525677230600225470ustar00rootroot00000000000000#!/usr/bin/env bash # Shared, machine-launcher-independent release recipe presets. apply_final_230_candidate_recipe() { MHCFLURRY_RELEASE_RECIPE=final-2.3.0-candidate AFFINITY_MINIBATCH_SIZE=1024 AFFINITY_OPTIMIZER_IMPLEMENTATION=pytorch AFFINITY_LSUV_TARGET=pre_activation AFFINITY_INIT=glorot_uniform PROCESSING_MINIBATCH_SIZE=512 PROCESSING_WITH_FLANKS_OPTIMIZER_IMPLEMENTATION=pytorch PROCESSING_WITH_FLANKS_INIT=kaiming_uniform_fan_in PROCESSING_VARIANTS="with_flanks no_flank short_flanks" PROCESSING_MODES="with_flanks,no_flank,short_flanks" PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS=5 PRESENTATION_PROCESSING_WITH_FLANKS_KIND=short_flanks } apply_final_230_candidate_v2_recipe() { # v1 plus the 2026-09-10 confirmed 5-aa ranking candidate: one legacy # architecture (native RMSprop, width 13, inner-best-AP checkpoints) per # fold instead of the 128-architecture Glorot/Keras-Adam grid. Every other # v1 decision, including all three processing variants, is unchanged. apply_final_230_candidate_recipe MHCFLURRY_RELEASE_RECIPE=final-2.3.0-candidate-v2 PROCESSING_SHORT_FLANKS_HYPERPARAMETERS=confirmed-ranking-candidate } mhcflurry-2.3.6/scripts/training/release_smoke.py000066400000000000000000000153771525677230600222610ustar00rootroot00000000000000#!/usr/bin/env python3 """Shrink release-pipeline inputs for MHCFLURRY_RELEASE_SMOKE runs. A smoke run exercises every stage and code path of the release pipeline at tiny scale, to catch integration failures before an expensive run. It is never a release artifact. The release scripts call this helper only when MHCFLURRY_RELEASE_SMOKE=1. """ import argparse from pathlib import Path import numpy import pandas import yaml SMOKE_PRETRAIN_STEPS_PER_EPOCH = 16 def load_canonicalize_allele(): """The processing data command's own allele resolver, loaded by path.""" import importlib.util script = Path(__file__).resolve().parent / "release_exact" / "make_train_data.processing.py" spec = importlib.util.spec_from_file_location("make_train_data_processing", script) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module.canonicalize_processing_allele def cap_hyperparameters(items, max_architectures, max_epochs): """Keep the first architectures and cap every training and pretraining epoch count.""" if not isinstance(items, list) or not items: raise ValueError("Expected a non-empty list of hyperparameter dicts") if max_architectures < 1 or max_epochs < 1: raise ValueError("max_architectures and max_epochs must be positive") capped = [] for item in items[:max_architectures]: item = dict(item) item["max_epochs"] = min(int(item.get("max_epochs", max_epochs)), max_epochs) train_data = item.get("train_data") if isinstance(train_data, dict): train_data = dict(train_data) if "pretrain_max_epochs" in train_data: train_data["pretrain_max_epochs"] = min(int(train_data["pretrain_max_epochs"]), max_epochs) if "pretrain_min_epochs" in train_data: train_data["pretrain_min_epochs"] = min( int(train_data["pretrain_min_epochs"]), int(train_data.get("pretrain_max_epochs", max_epochs))) if "pretrain_steps_per_epoch" in train_data: train_data["pretrain_steps_per_epoch"] = min( int(train_data["pretrain_steps_per_epoch"]), SMOKE_PRETRAIN_STEPS_PER_EPOCH) item["train_data"] = train_data capped.append(item) return capped COMMON_AMINO_ACIDS = "ACDEFGHIKLMNPQRSTVWY" def eligible_processing_hits(frame, canonicalize=None): """Keep only hits that processing training itself would keep. Mirrors make_train_data.processing.py: class I, 8-11mers of common amino acids with a protein, monoallelic, and a sequence-resolved HLA-A/B/C allele. Selecting smoke samples from the raw hit table instead silently dropped most of them, leaving too few samples to assign folds. """ keep = ( (frame.mhc_class.astype(str) == "I") & frame.peptide.astype(str).str.len().between(8, 11) & ~frame.protein_ensembl.isnull() & frame.peptide.astype(str).str.match("^[%s]+$" % COMMON_AMINO_ACIDS) & (frame.format.astype(str) == "MONOALLELIC") ) frame = frame.loc[keep] if canonicalize is None: return frame def resolved(name): try: return canonicalize(name) is not None except ValueError: # Serotypes and one-field groups are fatal in the real command, so # a smoke sample must never depend on one. return False allowed = {name for name in frame.hla.astype(str).unique() if resolved(name)} return frame.loc[frame.hla.astype(str).isin(allowed)] def smoke_sample_exclusions(hit_samples, holdout_samples, keep, seed, min_hits=200): """Exclude the holdout plus every training sample except a seeded subset. Candidates need at least min_hits hits so matched decoy generation and the processing fold assignment have enough rows. Pass hit_samples from eligible_processing_hits, so a kept sample survives to training. Returns (excluded, kept). """ counts = pandas.Series(hit_samples).astype(str).value_counts() holdout = set(pandas.Series(holdout_samples).astype(str)) candidates = sorted(set(counts.index[counts >= min_hits]) - holdout) if len(candidates) < keep: raise ValueError("Only %d eligible training samples have at least %d hits; need %d" % (len(candidates), min_hits, keep)) kept = sorted(numpy.random.default_rng(seed).choice(candidates, size=keep, replace=False)) excluded = sorted(holdout | (set(counts.index) - set(kept))) return excluded, kept def main(argv=None): parser = argparse.ArgumentParser(description=__doc__) sub = parser.add_subparsers(dest="command", required=True) cap = sub.add_parser("cap-hyperparameters", help="Truncate and cap a hyperparameter YAML in place.") cap.add_argument("path") cap.add_argument("--max-architectures", type=int, required=True) cap.add_argument("--max-epochs", type=int, required=True) exclude = sub.add_parser("sample-exclusions", help="Write a smoke processing sample exclusion CSV.") exclude.add_argument("--hits", required=True) exclude.add_argument("--holdout", required=True) exclude.add_argument("--keep", type=int, required=True) exclude.add_argument("--seed", type=int, required=True) exclude.add_argument("--min-hits", type=int, default=200) exclude.add_argument("--out", required=True) args = parser.parse_args(argv) if args.command == "cap-hyperparameters": path = Path(args.path) items = cap_hyperparameters(yaml.safe_load(path.read_text()), args.max_architectures, args.max_epochs) path.write_text(yaml.safe_dump(items, sort_keys=True)) print("smoke: %s capped to %d architecture(s), max_epochs %d" % (path, len(items), args.max_epochs)) else: columns = ["sample_id", "mhc_class", "peptide", "protein_ensembl", "format", "hla"] hits = pandas.read_csv(args.hits, usecols=columns) holdout = pandas.read_csv(args.holdout, usecols=["sample_id"]) eligible = eligible_processing_hits(hits, load_canonicalize_allele()) print("smoke: %d of %d hit samples are eligible for processing training" % (eligible.sample_id.nunique(), hits.sample_id.nunique())) excluded, kept = smoke_sample_exclusions( eligible.sample_id, holdout.sample_id, args.keep, args.seed, args.min_hits) # Excluding every ineligible sample as well keeps the file explicit # about what this run trains on. excluded = sorted(set(excluded) | (set(hits.sample_id.astype(str)) - set(kept))) pandas.DataFrame({"sample_id": excluded}).to_csv(args.out, index=False) print("smoke: keeping %d processing samples: %s" % (len(kept), " ".join(kept))) return 0 if __name__ == "__main__": raise SystemExit(main()) mhcflurry-2.3.6/scripts/training/render_release_experiment_paper_figures.py000066400000000000000000000557261525677230600275770ustar00rootroot00000000000000#!/usr/bin/env python """Render manuscript figures directly from archived release experiments.""" from __future__ import annotations import argparse import hashlib import json import os from pathlib import Path import matplotlib import numpy import pandas from mhcflurry.cli.figure_style import ( NEGATIVE_DELTA_COLOR, POSITIVE_DELTA_COLOR, apply_paper_style, despine, ) AFFINITY_COMPARISONS = ( ( "Keras/post-LSUV, mb1024", "proposed_release-vs-published_parity/release_summary.csv", ), ( "Keras/pre-LSUV, mb1024", "pre_activation_lsuv-vs-published_parity/release_summary.csv", ), ( "Keras/no-LSUV, mb1024", "no_lsuv-vs-published_parity/release_summary.csv", ), ( "PyTorch/post-LSUV, mb1024", "pytorch_rmsprop-vs-published_parity/release_summary.csv", ), ) PROCESSING_COMPARISONS = ( ( "Kaiming + Keras Adam", "kaiming_keras_adam-vs-glorot_keras_adam/release_summary.csv", ), ( "Glorot + PyTorch Adam", "glorot_pytorch_adam-vs-glorot_keras_adam/release_summary.csv", ), ( "Kaiming + PyTorch Adam", "kaiming_pytorch_adam-vs-glorot_keras_adam/release_summary.csv", ), ) FLANK_LABELS = { "with_flanks": "15 aa", "no_flank": "0 aa", "short_flanks": "5 aa", } METRICS = ("AUROC", "AUPRC", "PPV@N") AFFINITY_FRONTIER_CONDITIONS = ( ( "mb_128__rmsprop_keras__lsuv_post_activation__init_glorot_uniform", "Keras/post-LSUV, mb128", ), ( "mb_256__rmsprop_keras__lsuv_post_activation__init_glorot_uniform", "Keras/post-LSUV, mb256", ), ( "mb_512__rmsprop_keras__lsuv_post_activation__init_glorot_uniform", "Keras/post-LSUV, mb512", ), ( "mb_1024__rmsprop_keras__lsuv_not_applicable__init_glorot_uniform", "Keras/no-LSUV, mb1024", ), ( "mb_256__rmsprop_pytorch__lsuv_post_activation__init_glorot_uniform", "PyTorch/post-LSUV, mb256", ), ( "mb_512__rmsprop_pytorch__lsuv_post_activation__init_glorot_uniform", "PyTorch/post-LSUV, mb512", ), ( "mb_1024__rmsprop_pytorch__lsuv_post_activation__init_glorot_uniform", "PyTorch/post-LSUV, mb1024", ), ( "mb_1024__rmsprop_pytorch__lsuv_pre_activation__init_glorot_uniform", "PyTorch/pre-LSUV, mb1024", ), ) def make_parser(): """Build the command-line parser.""" parser = argparse.ArgumentParser( prog=os.environ.get("MHCFLURRY_CLI_PROG"), description=__doc__) parser.add_argument("--affinity-ablation-dir", required=True) parser.add_argument("--affinity-native128-dir", required=True) parser.add_argument("--processing-run-dir", required=True) parser.add_argument( "--affinity-frontier-dir", help=( "Optional terminal eight-condition affinity frontier. When set, " "render the direct candidate-versus-public summary as Figure 4." ), ) parser.add_argument( "--processing-boundary-summary", help="Optional affinity-controlled cleavage-boundary summary CSV.", ) parser.add_argument( "--presentation-factorial-summary", help="Optional cached 2x2 presentation factorial summary CSV.", ) parser.add_argument("--out", required=True) parser.add_argument("--formats", default="svg,pdf,png") return parser def sha256_file(path): """Return the SHA256 digest for one source or output file.""" digest = hashlib.sha256() with open(path, "rb") as stream: for chunk in iter(lambda: stream.read(1024 * 1024), b""): digest.update(chunk) return digest.hexdigest() def require_file(path, inputs): """Validate and record one manuscript input file.""" path = Path(path).resolve() if not path.is_file(): raise ValueError("Missing experiment source file: %s" % path) inputs.append({ "path": str(path), "sha256": sha256_file(path), "bytes": path.stat().st_size, }) return path def read_release_summary(path, inputs): """Read one standardized release comparison table.""" path = require_file(path, inputs) result = pandas.read_csv(path) required = {"metric", "average", "pct_change"} missing = sorted(required - set(result.columns)) if missing: raise ValueError("%s lacks columns: %s" % (path, ", ".join(missing))) return result def read_affinity_comparison_summary(path, inputs): """Read and validate one direct affinity comparison summary.""" path = require_file(path, inputs) result = json.loads(path.read_text()) required_averages = {"macro_mean_over_alleles", "micro_pooled"} missing = sorted(required_averages - set(result)) if missing: raise ValueError("%s lacks summaries: %s" % (path, ", ".join(missing))) return result def affinity_benchmark_identity(summary): """Return fields that must match across direct candidate comparisons.""" # Metric reductions can differ in their final floating-point accumulator # bits even when the reused public predictions and rows are identical. # Nine decimal places is much tighter than any reported precision while # keeping the identity check focused on material differences. return { "n_rows": summary.get("n_rows"), "n_hits": summary.get("n_hits"), "n_alleles_reported": summary.get("n_alleles_reported"), "public_macro": { metric: round( summary["macro_mean_over_alleles"][metric]["b"], 9) for metric in ("roc_auc", "pr_auc", "ppv_at_n") }, "public_micro": { key: ( round(value, 9) if key in {"roc_auc", "pr_auc", "ppv_at_n"} else value ) for key, value in summary["micro_pooled"]["b"].items() }, } def render_heatmap(ax, values, row_labels, column_labels, title): """Render an annotated, zero-centered percent-change heatmap.""" finite = values[numpy.isfinite(values)] limit = max(float(numpy.abs(finite).max()) if finite.size else 0.0, 1.0) from matplotlib.colors import LinearSegmentedColormap, TwoSlopeNorm cmap = LinearSegmentedColormap.from_list( "release_delta", [NEGATIVE_DELTA_COLOR, (0.98, 0.98, 0.98), POSITIVE_DELTA_COLOR], ) image = ax.imshow( values, aspect="auto", cmap=cmap, norm=TwoSlopeNorm(vmin=-limit, vcenter=0.0, vmax=limit), ) ax.set_xticks(numpy.arange(len(column_labels))) ax.set_xticklabels(column_labels, rotation=35, ha="right") ax.set_yticks(numpy.arange(len(row_labels))) ax.set_yticklabels(row_labels) ax.set_title(title) for row in range(values.shape[0]): for column in range(values.shape[1]): value = values[row, column] if numpy.isfinite(value): ax.text( column, row, "%+.2f%%" % value, ha="center", va="center", fontsize=7, ) ax.tick_params(length=0) for spine in ax.spines.values(): spine.set_visible(False) return image def affinity_interaction_figure( affinity_dir, native128_dir, inputs, outputs, out_dir, formats): """Render optimizer/LSUV/batch interactions from paired affinity runs.""" records = [] comparison_root = Path(affinity_dir) / "paired_comparisons" for label, relative in AFFINITY_COMPARISONS: table = read_release_summary(comparison_root / relative, inputs) table["condition"] = label records.append(table) native_path = ( Path(native128_dir) / "paired_comparisons" / "pytorch_rmsprop_batch128-vs-published_parity" / "release_summary.csv" ) native = read_release_summary(native_path, inputs) native["condition"] = "PyTorch/post-LSUV, mb128" records.append(native) table = pandas.concat(records, ignore_index=True) row_labels = list(table["condition"].drop_duplicates()) import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 2, figsize=(8.4, 3.4), sharey=True) for axis, average in zip(axes, ("Macro", "Micro")): subset = table.loc[table.average == average] values = ( subset.pivot(index="condition", columns="metric", values="pct_change") .reindex(index=row_labels, columns=METRICS) .to_numpy(dtype=float) ) image = render_heatmap( axis, values, row_labels, METRICS, "%s change vs Keras/post-LSUV, mb128" % average) fig.colorbar(image, ax=axis, fraction=0.046, pad=0.04, label="Change (%)") fig.tight_layout(w_pad=1.0) save_figure(fig, "affinity_recipe_interactions", out_dir, formats, outputs) def processing_interaction_figure( processing_dir, inputs, outputs, out_dir, formats): """Render processing initializer/optimizer interactions across flanks.""" records = [] comparison_root = Path(processing_dir) / "paired_comparisons" for label, relative in PROCESSING_COMPARISONS: table = read_release_summary(comparison_root / relative, inputs) table["condition"] = label records.append(table) table = pandas.concat(records, ignore_index=True) row_labels = list(table["condition"].drop_duplicates()) column_keys = [ (flank, metric) for flank in ("with_flanks", "no_flank", "short_flanks") for metric in ("AUPRC", "PPV@N") ] column_labels = [ "%s\n%s" % (FLANK_LABELS[flank], metric) for flank, metric in column_keys ] import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 2, figsize=(10.2, 3.25), sharey=True) for axis, average in zip(axes, ("Macro", "Micro")): subset = table.loc[table.average == average] values = numpy.full((len(row_labels), len(column_keys)), numpy.nan) for row_index, condition in enumerate(row_labels): for column_index, (flank, metric) in enumerate(column_keys): matched = subset.loc[ (subset.condition == condition) & (subset.flank_mode == flank) & (subset.metric == metric), "pct_change", ] if len(matched) == 1: values[row_index, column_index] = matched.iloc[0] image = render_heatmap( axis, values, row_labels, column_labels, "%s change vs Glorot + Keras Adam" % average) fig.colorbar(image, ax=axis, fraction=0.046, pad=0.04, label="Change (%)") fig.tight_layout(w_pad=1.0) save_figure( fig, "processing_recipe_interactions", out_dir, formats, outputs) def flank_context_figure( processing_dir, inputs, outputs, out_dir, formats): """Render the direct 5-aa versus 15-aa comparison and length CIs.""" comparison = ( Path(processing_dir) / "direct_comparisons" / "best_5aa-vs-best_15aa" ) samples_path = require_file(comparison / "per_sample.csv", inputs) summary_path = require_file(comparison / "summary.json", inputs) samples = pandas.read_csv(samples_path) summary = json.loads(summary_path.read_text()) import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 2, figsize=(7.7, 3.15)) ax = axes[0] ax.scatter( samples.pr_auc_b, samples.pr_auc_a, color=POSITIVE_DELTA_COLOR, edgecolor="white", linewidth=0.4, s=35, ) low = min(samples.pr_auc_a.min(), samples.pr_auc_b.min()) high = max(samples.pr_auc_a.max(), samples.pr_auc_b.max()) pad = (high - low) * 0.08 ax.plot([low - pad, high + pad], [low - pad, high + pad], color="0.45") ax.set_xlim(low - pad, high + pad) ax.set_ylim(low - pad, high + pad) ax.set_xlabel("15-aa Kaiming/PyTorch AUPRC") ax.set_ylabel("5-aa Glorot/Keras AUPRC") ax.set_title("Ten held-out samples") despine(ax) ax = axes[1] lengths = [8, 9, 10, 11] for offset, (metric, label, color) in enumerate(( ("pr_auc", "AUPRC", POSITIVE_DELTA_COLOR), ("ppv_at_n", "PPV@N", (0.345, 0.467, 0.741)))): differences = [] lower = [] upper = [] for length in lengths: record = summary["per_length_macro_over_samples"][str(length)][metric] differences.append(record["diff"]) lower.append(record["diff_ci95_sample_bootstrap"][0]) upper.append(record["diff_ci95_sample_bootstrap"][1]) differences = numpy.asarray(differences) errors = numpy.vstack([ differences - numpy.asarray(lower), numpy.asarray(upper) - differences, ]) x = numpy.arange(len(lengths)) + (offset - 0.5) * 0.14 ax.errorbar( x, differences, yerr=errors, fmt="o", color=color, capsize=3, label=label) ax.axhline(0.0, color="0.45", linewidth=0.8) ax.set_xticks(numpy.arange(len(lengths))) ax.set_xticklabels(["%d-mer" % length for length in lengths]) ax.set_ylabel("5-aa minus 15-aa") ax.set_title("Sample-bootstrap 95% CIs") ax.legend() despine(ax) fig.tight_layout(w_pad=1.2) save_figure(fig, "processing_flank_context", out_dir, formats, outputs) def affinity_frontier_figure( frontier_dir, inputs, outputs, out_dir, formats): """Render all frontier candidates directly against public MHCflurry 2.2.""" frontier_dir = Path(frontier_dir) row_labels = [] summaries = [] for index, (directory, label) in enumerate(AFFINITY_FRONTIER_CONDITIONS): if index == 0: path = ( frontier_dir / "baseline-vs-public-no-additional-ms" / "affinity" / "summary.json" ) else: path = ( frontier_dir / directory / "comparison-vs-public-no-additional-ms" / "affinity" / "summary.json" ) summaries.append(read_affinity_comparison_summary(path, inputs)) row_labels.append(label) reference_identity = affinity_benchmark_identity(summaries[0]) for label, summary in zip(row_labels[1:], summaries[1:]): identity = affinity_benchmark_identity(summary) if identity != reference_identity: raise ValueError( "Affinity frontier comparison does not share the baseline " "benchmark identity (%s): %s != %s" % ( label, json.dumps(identity, sort_keys=True), json.dumps(reference_identity, sort_keys=True), ) ) metric_keys = ("roc_auc", "pr_auc", "ppv_at_n") import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 2, figsize=(8.8, 4.5), sharey=True) for axis, average in zip(axes, ("Macro", "Micro")): values = numpy.full((len(summaries), len(metric_keys)), numpy.nan) for row_index, summary in enumerate(summaries): if average == "Macro": for column_index, metric in enumerate(metric_keys): scores = summary["macro_mean_over_alleles"][metric] values[row_index, column_index] = ( 100.0 * (scores["a"] - scores["b"]) / scores["b"] ) else: for column_index, metric in enumerate(metric_keys): scores = summary["micro_pooled"] values[row_index, column_index] = ( 100.0 * (scores["a"][metric] - scores["b"][metric]) / scores["b"][metric] ) image = render_heatmap( axis, values, row_labels, METRICS, "%s change vs public MHCflurry 2.2" % average, ) fig.colorbar( image, ax=axis, fraction=0.046, pad=0.04, label="Change (%)") fig.tight_layout(w_pad=1.0) save_figure(fig, "affinity_frontier_vs_public", out_dir, formats, outputs) def processing_boundary_figure(path, inputs, outputs, out_dir, formats): """Plot affinity-controlled local-boundary architecture performance.""" table = pandas.read_csv(require_file(path, inputs)).set_index("score") rows = ( ("large_relu__legacy_5aa", "Legacy 5-aa"), ("large_relu__compact_5x2", "Boundary 5x2"), ("large_relu__intermediate_5x3", "Boundary 5x3"), ("large_relu__intermediate_5x4", "Boundary 5x4"), ("large_relu__extended_5x5", "Boundary 5x5"), ) missing = [name for name, _ in rows if name not in table.index] if missing or "public_2_1_selected" not in table.index: raise ValueError( "Boundary summary lacks required rows: %s" % ", ".join(missing or ["public_2_1_selected"])) import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 2, figsize=(8.8, 3.6), sharex=True) x = numpy.arange(len(rows)) for axis, (column, title) in zip(axes, ( ("macro_pr_auc", "Macro AUPRC"), ("macro_ppv_at_n", "Macro PPV@N"))): public = table.loc["public_2_1_selected", column] values = numpy.asarray([ 100.0 * (table.loc[name, column] - public) / public for name, _ in rows ]) axis.bar( x, values, color=[POSITIVE_DELTA_COLOR if value >= 0 else NEGATIVE_DELTA_COLOR for value in values], width=0.72) axis.axhline(0.0, color="0.35", linewidth=0.8) for position, value in zip(x, values): axis.annotate( "%+.2f%%" % value, (position, value), xytext=(0, 4 if value >= 0 else -12), textcoords="offset points", ha="center", fontsize=7, ) axis.set_xticks(x) axis.set_xticklabels( [label for _, label in rows], rotation=35, ha="right") axis.set_ylabel("Change vs selected public 2.1.x (%)") axis.set_title(title) despine(axis) fig.suptitle("Affinity-controlled cleavage-boundary comparison") fig.tight_layout() save_figure( fig, "processing_cleavage_boundary_context", out_dir, formats, outputs) def presentation_factorial_figure(path, inputs, outputs, out_dir, formats): """Plot the cached public/new affinity-processing component factorial.""" table = pandas.read_csv(require_file(path, inputs)) table = table.loc[ table.flank_mode.eq("with_flanks") & table.average.eq("Macro") & table.metric.isin(["AUPRC", "PPV@N"]) ].copy() labels = ( ("public_affinity__public_processing", "Public + public"), ("new_affinity__public_processing", "New affinity"), ("public_affinity__new_processing", "New processing"), ("new_affinity__new_processing", "New + new"), ) expected = {(condition, metric) for condition, _ in labels for metric in ("AUPRC", "PPV@N")} observed = set(zip(table.condition, table.metric)) if not expected.issubset(observed): raise ValueError("Presentation factorial summary is incomplete") import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 2, figsize=(8.4, 3.6), sharex=True) x = numpy.arange(len(labels)) for axis, metric in zip(axes, ("AUPRC", "PPV@N")): subset = table.loc[table.metric == metric].set_index("condition") values = numpy.asarray([ subset.loc[condition, "pct_change"] for condition, _ in labels ]) axis.bar( x, values, color=[POSITIVE_DELTA_COLOR if value >= 0 else NEGATIVE_DELTA_COLOR for value in values], width=0.72) axis.axhline(0.0, color="0.35", linewidth=0.8) for position, value in zip(x, values): axis.annotate( "%+.2f%%" % value, (position, value), xytext=(0, 4 if value >= 0 else -12), textcoords="offset points", ha="center", fontsize=7, ) axis.set_xticks(x) axis.set_xticklabels( [label for _, label in labels], rotation=35, ha="right") axis.set_ylabel("Change vs public 2.2 (%)") axis.set_title("Macro %s" % metric) despine(axis) fig.suptitle("Presentation component factorial (with flanks)") fig.tight_layout() save_figure( fig, "presentation_component_factorial", out_dir, formats, outputs) def save_figure(fig, name, out_dir, formats, outputs): """Save one manuscript figure and record all emitted files.""" import matplotlib.pyplot as plt for file_format in formats: path = out_dir / ("%s.%s" % (name, file_format)) metadata = ( {"Date": None, "Creator": "MHCflurry release experiment renderer"} if file_format == "svg" else None ) fig.savefig( path, bbox_inches="tight", transparent=True, metadata=metadata) outputs.append({ "figure": name, "format": file_format, "path": str(path.resolve()), "sha256": sha256_file(path), "bytes": path.stat().st_size, }) plt.close(fig) def run(args): """Render all currently available source-backed manuscript figures.""" matplotlib.use("Agg") apply_paper_style() matplotlib.rcParams["svg.hashsalt"] = "mhcflurry-release-2.3-experiments" formats = tuple(part.strip().lower() for part in args.formats.split(",")) if not formats or any(part not in {"svg", "pdf", "png"} for part in formats): raise ValueError("--formats must contain svg, pdf, and/or png") out_dir = Path(args.out).resolve() out_dir.mkdir(parents=True, exist_ok=True) inputs = [] outputs = [] affinity_interaction_figure( args.affinity_ablation_dir, args.affinity_native128_dir, inputs, outputs, out_dir, formats, ) processing_interaction_figure( args.processing_run_dir, inputs, outputs, out_dir, formats) flank_context_figure( args.processing_run_dir, inputs, outputs, out_dir, formats) if args.affinity_frontier_dir: affinity_frontier_figure( args.affinity_frontier_dir, inputs, outputs, out_dir, formats, ) if args.processing_boundary_summary: processing_boundary_figure( args.processing_boundary_summary, inputs, outputs, out_dir, formats, ) if args.presentation_factorial_summary: presentation_factorial_figure( args.presentation_factorial_summary, inputs, outputs, out_dir, formats, ) manifest = { "schema_version": 1, "inputs": inputs, "outputs": outputs, } (out_dir / "manifest.json").write_text( json.dumps(manifest, indent=2, sort_keys=True) + "\n") print(out_dir) return 0 if __name__ == "__main__": raise SystemExit(run(make_parser().parse_args())) mhcflurry-2.3.6/scripts/training/run_affinity_factorial.sh000066400000000000000000000477001525677230600241410ustar00rootroot00000000000000#!/usr/bin/env bash # Train and evaluate the controlled affinity recipe sweep. set -euo pipefail usage() { cat <<'EOF' Usage: run_affinity_factorial.sh [OPTIONS] Required: --out PATH Experiment output directory --train-data PATH Affinity training measurements --allele-sequences PATH Allele pseudosequences CSV --pretrain-data PATH Affinity pretraining predictions --data-eval-dir PATH Evaluation data directory --release-holdout-dir PATH Frozen release-holdout manifests --public-affinity-dir PATH Official models.no_additional_ms predictor --source-commit COMMIT Exact source commit being evaluated Experiment controls: --mode MODE representative (default) or full --design NAME optimizer-lsuv-batch-init (default) or regularization-activation --regularization-base-recipe NAME native-pre-1024 (default), native-post-1024, or keras-no-lsuv-1024 --condition NAME Run one generated condition; repeatable --random-seed INTEGER Release random seed (default: 42) --evaluation MODE all (default) or none Experiment archiving: --experiments-dir PATH Write a timestamped snapshot after success --experiment-name NAME Snapshot label (default: affinity-factorial) --source-archive PATH Preserve the exact source archive in snapshot Execution controls: --gpus INTEGER|auto GPU count (default: auto) --max-workers-per-gpu INTEGER|auto Worker density (default: auto) --dataloader-num-workers N|auto Workers per training dataloader (default: 1) --max-tasks-per-worker INTEGER Worker recycling interval (default: 12) --torch-compile VALUE auto, 0, or 1 (default: 0) --torch-compile-loss VALUE auto, 0, or 1 (default: 0) --matmul-precision VALUE none, highest, high, or medium (default: highest) -h, --help Show this help EOF } require_value() { if [ "$#" -lt 2 ] || [ -z "$2" ]; then printf 'Missing value for %s\n' "$1" >&2 usage >&2 exit 2 fi } MHCFLURRY_OUT="" TRAIN_DATA="" ALLELE_SEQUENCES="" PRETRAIN_DATA="" DATA_EVAL_DIR="" RELEASE_HOLDOUT_DIR="" PUBLIC_AFFINITY_DIR="" SOURCE_COMMIT="" FACTORIAL_MODE="representative" FACTORIAL_DESIGN="optimizer-lsuv-batch-init" REGULARIZATION_BASE_RECIPE="native-pre-1024" RELEASE_RANDOM_SEED=42 EVALUATION=all MAX_TASKS_PER_WORKER=12 MAX_WORKERS_PER_GPU="auto" DATALOADER_NUM_WORKERS=1 GPUS="auto" TORCH_COMPILE=0 TORCH_COMPILE_LOSS=0 MATMUL_PRECISION="highest" FACTORIAL_CONDITIONS=() EXPERIMENTS_DIR="" EXPERIMENT_NAME="affinity-factorial" SOURCE_ARCHIVE="" ORIGINAL_ARGS=("$@") while [ "$#" -gt 0 ]; do case "$1" in --out) require_value "$@"; MHCFLURRY_OUT="$2"; shift 2 ;; --train-data) require_value "$@"; TRAIN_DATA="$2"; shift 2 ;; --allele-sequences) require_value "$@"; ALLELE_SEQUENCES="$2"; shift 2 ;; --pretrain-data) require_value "$@"; PRETRAIN_DATA="$2"; shift 2 ;; --data-eval-dir) require_value "$@"; DATA_EVAL_DIR="$2"; shift 2 ;; --release-holdout-dir) require_value "$@"; RELEASE_HOLDOUT_DIR="$2"; shift 2 ;; --public-affinity-dir) require_value "$@"; PUBLIC_AFFINITY_DIR="$2"; shift 2 ;; --source-commit) require_value "$@"; SOURCE_COMMIT="$2"; shift 2 ;; --mode) require_value "$@"; FACTORIAL_MODE="$2"; shift 2 ;; --design) require_value "$@"; FACTORIAL_DESIGN="$2"; shift 2 ;; --regularization-base-recipe) require_value "$@"; REGULARIZATION_BASE_RECIPE="$2"; shift 2 ;; --condition) require_value "$@"; FACTORIAL_CONDITIONS+=("$2"); shift 2 ;; --random-seed) require_value "$@"; RELEASE_RANDOM_SEED="$2"; shift 2 ;; --evaluation) require_value "$@"; EVALUATION="$2"; shift 2 ;; --experiments-dir) require_value "$@"; EXPERIMENTS_DIR="$2"; shift 2 ;; --experiment-name) require_value "$@"; EXPERIMENT_NAME="$2"; shift 2 ;; --source-archive) require_value "$@"; SOURCE_ARCHIVE="$2"; shift 2 ;; --gpus) require_value "$@"; GPUS="$2"; shift 2 ;; --max-workers-per-gpu) require_value "$@"; MAX_WORKERS_PER_GPU="$2"; shift 2 ;; --dataloader-num-workers) require_value "$@"; DATALOADER_NUM_WORKERS="$2"; shift 2 ;; --max-tasks-per-worker) require_value "$@"; MAX_TASKS_PER_WORKER="$2"; shift 2 ;; --torch-compile) require_value "$@"; TORCH_COMPILE="$2"; shift 2 ;; --torch-compile-loss) require_value "$@"; TORCH_COMPILE_LOSS="$2"; shift 2 ;; --matmul-precision) require_value "$@"; MATMUL_PRECISION="$2"; shift 2 ;; -h|--help) usage; exit 0 ;; *) printf 'Unknown argument: %s\n' "$1" >&2 usage >&2 exit 2 ;; esac done if [ -n "$SOURCE_ARCHIVE" ] && [ ! -f "$SOURCE_ARCHIVE" ]; then printf '%s is not a file: %s\n' '--source-archive' "$SOURCE_ARCHIVE" >&2 exit 2 fi for required in \ MHCFLURRY_OUT TRAIN_DATA ALLELE_SEQUENCES PRETRAIN_DATA \ DATA_EVAL_DIR RELEASE_HOLDOUT_DIR PUBLIC_AFFINITY_DIR SOURCE_COMMIT; do if [ -z "${!required}" ]; then printf 'Missing required argument for %s\n' "$required" >&2 usage >&2 exit 2 fi done case "$FACTORIAL_MODE" in representative|full) ;; *) printf 'Invalid --mode: %s\n' "$FACTORIAL_MODE" >&2; exit 2 ;; esac case "$FACTORIAL_DESIGN" in optimizer-lsuv-batch-init|regularization-activation) ;; *) printf 'Invalid --design: %s\n' "$FACTORIAL_DESIGN" >&2; exit 2 ;; esac case "$REGULARIZATION_BASE_RECIPE" in native-pre-1024|native-post-1024|keras-no-lsuv-1024) ;; *) printf 'Invalid --regularization-base-recipe: %s\n' \ "$REGULARIZATION_BASE_RECIPE" >&2; exit 2 ;; esac case "$EVALUATION" in all|none) ;; *) printf 'Invalid --evaluation: %s\n' "$EVALUATION" >&2; exit 2 ;; esac if [ "$FACTORIAL_DESIGN" = "regularization-activation" ] && \ [ "$FACTORIAL_MODE" != "representative" ]; then printf '%s supports representative mode only\n' \ 'regularization-activation' >&2 exit 2 fi case "$MATMUL_PRECISION" in none|highest|high|medium) ;; *) printf 'Invalid --matmul-precision: %s\n' "$MATMUL_PRECISION" >&2; exit 2 ;; esac case "$TORCH_COMPILE" in auto|0|1) ;; *) printf 'Invalid --torch-compile: %s\n' "$TORCH_COMPILE" >&2; exit 2 ;; esac case "$TORCH_COMPILE_LOSS" in auto|0|1) ;; *) printf 'Invalid --torch-compile-loss: %s\n' "$TORCH_COMPILE_LOSS" >&2; exit 2 ;; esac for value_and_name in \ "$RELEASE_RANDOM_SEED:--random-seed" \ "$MAX_TASKS_PER_WORKER:--max-tasks-per-worker"; do value="${value_and_name%%:*}" name="${value_and_name#*:}" if ! [[ "$value" =~ ^[0-9]+$ ]]; then printf '%s must be a nonnegative integer: %s\n' "$name" "$value" >&2 exit 2 fi done if [ "$DATALOADER_NUM_WORKERS" != "auto" ] && \ ! [[ "$DATALOADER_NUM_WORKERS" =~ ^[0-9]+$ ]]; then printf '%s must be auto or a nonnegative integer: %s\n' \ '--dataloader-num-workers' "$DATALOADER_NUM_WORKERS" >&2 exit 2 fi if [ "$MAX_TASKS_PER_WORKER" -eq 0 ]; then printf '%s must be positive\n' '--max-tasks-per-worker' >&2 exit 2 fi if [ "$MAX_WORKERS_PER_GPU" != "auto" ] && \ ! [[ "$MAX_WORKERS_PER_GPU" =~ ^[1-9][0-9]*$ ]]; then printf '%s must be auto or a positive integer: %s\n' \ '--max-workers-per-gpu' "$MAX_WORKERS_PER_GPU" >&2 exit 2 fi if [ "$GPUS" != "auto" ] && ! [[ "$GPUS" =~ ^[0-9]+$ ]]; then printf '%s must be auto or a nonnegative integer: %s\n' \ '--gpus' "$GPUS" >&2 exit 2 fi for path_and_name in \ "$TRAIN_DATA:--train-data" \ "$ALLELE_SEQUENCES:--allele-sequences" \ "$PRETRAIN_DATA:--pretrain-data"; do path="${path_and_name%%:*}" name="${path_and_name#*:}" if [ ! -f "$path" ]; then printf '%s is not a file: %s\n' "$name" "$path" >&2 exit 2 fi done for path_and_name in \ "$DATA_EVAL_DIR:--data-eval-dir" \ "$RELEASE_HOLDOUT_DIR:--release-holdout-dir" \ "$PUBLIC_AFFINITY_DIR:--public-affinity-dir"; do path="${path_and_name%%:*}" name="${path_and_name#*:}" if [ ! -d "$path" ]; then printf '%s is not a directory: %s\n' "$name" "$path" >&2 exit 2 fi done for holdout_file in \ policy.json affinity_samples.csv affinity_pmhcs.csv; do if [ ! -f "$RELEASE_HOLDOUT_DIR/$holdout_file" ]; then printf '%s is missing required file: %s\n' \ '--release-holdout-dir' "$holdout_file" >&2 exit 2 fi done for public_file in manifest.csv train_data.csv.bz2; do if [ ! -f "$PUBLIC_AFFINITY_DIR/$public_file" ]; then printf '%s is missing required file: %s\n' \ '--public-affinity-dir' "$public_file" >&2 exit 2 fi done SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" export PYTHONUNBUFFERED=1 # Training-batch shrinkage would confound this experiment. The library guard # currently has no CLI equivalent, so keep this one invariant in the runtime # environment and verify the effective minibatch in every saved model. export MHCFLURRY_FAIL_ON_TRAINING_BATCH_SHRINK=1 if [ "$GPUS" = "auto" ]; then if command -v nvidia-smi >/dev/null 2>&1; then GPUS="$(nvidia-smi -L | wc -l | tr -d ' ')" else GPUS=0 fi fi mkdir -p "$MHCFLURRY_OUT" date -u +%Y-%m-%dT%H:%M:%SZ > "$MHCFLURRY_OUT/started_at_utc.txt" { printf 'bash %q' "$0" printf ' %q' "${ORIGINAL_ARGS[@]}" printf '\n' } > "$MHCFLURRY_OUT/command.sh" python "$SCRIPT_DIR/generate_affinity_factorial.py" \ "$MHCFLURRY_OUT" \ --mode "$FACTORIAL_MODE" \ --design "$FACTORIAL_DESIGN" \ --regularization-base-recipe "$REGULARIZATION_BASE_RECIPE" \ > "$MHCFLURRY_OUT/manifest.stdout.json" BASELINE_CONDITION="$(python -c \ 'import json,sys; print(json.load(open(sys.argv[1]))["baseline_condition"])' \ "$MHCFLURRY_OUT/manifest.json")" for selected in "${FACTORIAL_CONDITIONS[@]}"; do if ! tail -n +2 "$MHCFLURRY_OUT/manifest.csv" | cut -d, -f1 | \ grep -Fqx -- "$selected"; then printf 'Unknown --condition: %s\n' "$selected" >&2 exit 2 fi done condition_selected() { local condition="$1" if [ "${#FACTORIAL_CONDITIONS[@]}" -eq 0 ] || \ [ "$condition" = "$BASELINE_CONDITION" ]; then return 0 fi local selected for selected in "${FACTORIAL_CONDITIONS[@]}"; do if [ "$selected" = "$condition" ]; then return 0 fi done return 1 } if [ "${#FACTORIAL_CONDITIONS[@]}" -eq 0 ]; then FACTORIAL_CONDITIONS_PROVENANCE=all else FACTORIAL_CONDITIONS_PROVENANCE="$( IFS=,; printf '%s' "${FACTORIAL_CONDITIONS[*]}" )" fi { printf '%s\n' \ "schema_version=1" \ "source_commit=$SOURCE_COMMIT" \ "factorial_mode=$FACTORIAL_MODE" \ "factorial_design=$FACTORIAL_DESIGN" \ "regularization_base_recipe=$REGULARIZATION_BASE_RECIPE" \ "evaluation=$EVALUATION" \ "factorial_conditions=$FACTORIAL_CONDITIONS_PROVENANCE" \ "random_seed=$RELEASE_RANDOM_SEED" \ "gpus=$GPUS" \ "max_workers_per_gpu=$MAX_WORKERS_PER_GPU" \ "dataloader_num_workers=$DATALOADER_NUM_WORKERS" \ "max_tasks_per_worker=$MAX_TASKS_PER_WORKER" \ "torch_compile=$TORCH_COMPILE" \ "torch_compile_loss=$TORCH_COMPILE_LOSS" \ "matmul_precision=$MATMUL_PRECISION" \ "experiments_dir=$EXPERIMENTS_DIR" \ "experiment_name=$EXPERIMENT_NAME" \ "source_archive=$SOURCE_ARCHIVE" \ "public_affinity_dir=$PUBLIC_AFFINITY_DIR" \ "baseline_condition=$BASELINE_CONDITION" sha256sum \ "$TRAIN_DATA" \ "$ALLELE_SEQUENCES" \ "$PRETRAIN_DATA" \ "$RELEASE_HOLDOUT_DIR/policy.json" \ "$RELEASE_HOLDOUT_DIR/affinity_samples.csv" \ "$RELEASE_HOLDOUT_DIR/affinity_pmhcs.csv" \ "$MHCFLURRY_OUT/manifest.json" while IFS= read -r public_file; do sha256sum "$public_file" done < <(find "$PUBLIC_AFFINITY_DIR" -maxdepth 1 -type f | sort) } > "$MHCFLURRY_OUT/provenance.txt" # shellcheck disable=SC1091 source "$SCRIPT_DIR/gpu_telemetry.sh" GPU_TELEMETRY_PID="" trap stop_gpu_telemetry EXIT start_gpu_telemetry "$MHCFLURRY_OUT/gpu_occupancy.csv" tail -n +2 "$MHCFLURRY_OUT/manifest.csv" | cut -d, -f1 | \ while IFS= read -r condition; do if ! condition_selected "$condition"; then continue fi condition_out="$MHCFLURRY_OUT/$condition" unselected="$condition_out/models.unselected.combined" train_done="$condition_out/.train.done" mkdir -p "$condition_out" if [ -f "$train_done" ]; then python "$SCRIPT_DIR/verify_affinity_factorial_models.py" \ "$unselected" \ "$MHCFLURRY_OUT/conditions/$condition.yaml" \ > "$condition_out/verification.json" printf 'Training already complete: %s\n' "$condition" continue fi continue_args=() if [ -f "$unselected/manifest.csv" ]; then continue_args=(--continue-incomplete) fi mhcflurry-class1-train-pan-allele-models \ --data "$TRAIN_DATA" \ --allele-sequences "$ALLELE_SEQUENCES" \ --pretrain-data "$PRETRAIN_DATA" \ --held-out-measurements-per-allele-fraction-and-max 0.25 100 \ --num-folds 4 \ --random-seed "$RELEASE_RANDOM_SEED" \ --hyperparameters "$MHCFLURRY_OUT/conditions/$condition.yaml" \ --out-models-dir "$unselected" \ --worker-log-dir "$condition_out" \ --num-jobs auto \ --max-tasks-per-worker "$MAX_TASKS_PER_WORKER" \ --gpus "$GPUS" \ --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" \ --dataloader-num-workers "$DATALOADER_NUM_WORKERS" \ --random-negative-pool-epochs 1 \ --torch-compile "$TORCH_COMPILE" \ --torch-compile-loss "$TORCH_COMPILE_LOSS" \ --matmul-precision "$MATMUL_PRECISION" \ --enable-timing \ "${continue_args[@]}" \ 2>&1 | tee "$condition_out/train.log" python "$SCRIPT_DIR/verify_affinity_factorial_models.py" \ "$unselected" \ "$MHCFLURRY_OUT/conditions/$condition.yaml" \ > "$condition_out/verification.json" date -u +%Y-%m-%dT%H:%M:%SZ > "$train_done" done tail -n +2 "$MHCFLURRY_OUT/manifest.csv" | cut -d, -f1 | \ while IFS= read -r condition; do if ! condition_selected "$condition"; then continue fi condition_out="$MHCFLURRY_OUT/$condition" unselected="$condition_out/models.unselected.combined" if [ "$FACTORIAL_MODE" = "full" ]; then predictor="$condition_out/models.combined" select_done="$condition_out/.select.done" if [ ! -f "$select_done" ]; then mhcflurry-class1-select-pan-allele-models \ --data "$unselected/train_data.csv.bz2" \ --models-dir "$unselected" \ --out-models-dir "$predictor" \ --min-models-per-fold 2 \ --max-models-per-fold 8 \ --save-validation-predictions \ --num-jobs auto \ --max-tasks-per-worker "$MAX_TASKS_PER_WORKER" \ --gpus "$GPUS" \ --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" \ --dataloader-num-workers "$DATALOADER_NUM_WORKERS" \ --torch-compile "$TORCH_COMPILE" \ --torch-compile-loss "$TORCH_COMPILE_LOSS" \ --matmul-precision "$MATMUL_PRECISION" \ --enable-timing \ 2>&1 | tee "$condition_out/select.log" cp "$unselected/train_data.csv.bz2" "$predictor/train_data.csv.bz2" date -u +%Y-%m-%dT%H:%M:%SZ > "$select_done" fi else predictor="$unselected" fi printf '%s\n' "$predictor" > "$condition_out/predictor_path.txt" if [ ! -f "$condition_out/.loss-plots.done" ]; then loss_plot_args=( --selected-dir "$predictor" --out "$condition_out/loss_plots" ) if [ "$predictor" != "$unselected" ]; then loss_plot_args+=(--unselected-dir "$unselected") fi mhcflurry train plot-loss-curves "${loss_plot_args[@]}" date -u +%Y-%m-%dT%H:%M:%SZ \ > "$condition_out/.loss-plots.done" fi done if [ "$EVALUATION" = all ]; then baseline_predictor="$(cat \ "$MHCFLURRY_OUT/$BASELINE_CONDITION/predictor_path.txt")" tail -n +2 "$MHCFLURRY_OUT/manifest.csv" | cut -d, -f1 | \ while IFS= read -r condition; do if ! condition_selected "$condition"; then continue fi if [ "$condition" = "$BASELINE_CONDITION" ]; then continue fi condition_out="$MHCFLURRY_OUT/$condition" comparison="$condition_out/comparison-vs-baseline" predictor="$(cat "$condition_out/predictor_path.txt")" if [ ! -f "$comparison/.done" ]; then mkdir -p "$comparison" mhcflurry eval compare-models \ --a "$predictor" \ --a-label "$condition" \ --b "$baseline_predictor" \ --b-label "$BASELINE_CONDITION" \ --data-dir "$DATA_EVAL_DIR" \ --release-holdout-dir "$RELEASE_HOLDOUT_DIR" \ --affinity-source no_additional_ms \ --affinity-training-overlap-policy exclude \ --include affinity \ --out "$comparison" \ --num-jobs auto \ --gpus "$GPUS" \ --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" \ --max-tasks-per-worker "$MAX_TASKS_PER_WORKER" \ --torch-compile "$TORCH_COMPILE" \ --matmul-precision "$MATMUL_PRECISION" \ 2>&1 | tee "$comparison/eval.log" date -u +%Y-%m-%dT%H:%M:%SZ > "$comparison/.done" fi if [ ! -f "$comparison/.plots.done" ]; then mhcflurry plot-model-comparison \ --input "$comparison" \ --components affinity \ --summary-pdf "$comparison/plots/model_comparison_figures.pdf" date -u +%Y-%m-%dT%H:%M:%SZ > "$comparison/.plots.done" fi done bash "$SCRIPT_DIR/evaluate_affinity_factorial_public.sh" \ --factorial-dir "$MHCFLURRY_OUT" \ --public-affinity-dir "$PUBLIC_AFFINITY_DIR" \ --public-label public-2.2-no-additional-ms \ --data-eval-dir "$DATA_EVAL_DIR" \ --release-holdout-dir "$RELEASE_HOLDOUT_DIR" \ --analysis-source-commit "$SOURCE_COMMIT" \ --gpus "$GPUS" \ --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" \ --max-tasks-per-worker "$MAX_TASKS_PER_WORKER" \ --torch-compile "$TORCH_COMPILE" \ --matmul-precision "$MATMUL_PRECISION" fi date -u +%Y-%m-%dT%H:%M:%SZ > "$MHCFLURRY_OUT/completed_at_utc.txt" stop_gpu_telemetry GPU_TELEMETRY_PID="" if [ -n "$EXPERIMENTS_DIR" ]; then snapshot_args=( --source-dir "$MHCFLURRY_OUT" --experiments-dir "$EXPERIMENTS_DIR" --name "$EXPERIMENT_NAME" --source-commit "$SOURCE_COMMIT" --command-file "$MHCFLURRY_OUT/command.sh" --input-file "$TRAIN_DATA" --input-file "$ALLELE_SEQUENCES" --input-file "$PRETRAIN_DATA" --input-file "$PUBLIC_AFFINITY_DIR/manifest.csv" --input-file "$PUBLIC_AFFINITY_DIR/train_data.csv.bz2" --input-file "$RELEASE_HOLDOUT_DIR/policy.json" --input-file "$RELEASE_HOLDOUT_DIR/affinity_samples.csv" --input-file "$RELEASE_HOLDOUT_DIR/affinity_pmhcs.csv" ) if [ -n "$SOURCE_ARCHIVE" ]; then snapshot_args+=(--source-archive "$SOURCE_ARCHIVE") fi snapshot_path="$(mhcflurry train snapshot-experiment "${snapshot_args[@]}")" printf '%s\n' "$snapshot_path" | tee "$MHCFLURRY_OUT/snapshot_path.txt" fi mhcflurry-2.3.6/scripts/training/run_affinity_factorial_architecture_evaluation.sh000077500000000000000000000212461525677230600311320ustar00rootroot00000000000000#!/usr/bin/env bash # Evaluate every affinity-factorial condition separately by architecture. set -euo pipefail usage() { cat <<'EOF' Usage: run_affinity_factorial_architecture_evaluation.sh [OPTIONS] Required: --factorial-dir PATH Completed affinity-factorial output --data-eval-dir PATH Evaluation data directory --release-holdout-dir PATH Frozen holdout manifests --training-source-commit COMMIT Commit used to train the models --analysis-source-commit COMMIT Commit used for this postprocessing Execution controls: --gpus INTEGER|auto GPU count (default: auto) --max-workers-per-gpu INTEGER|auto Worker density (default: auto) --max-tasks-per-worker INTEGER Worker recycling interval (default: 12) --torch-compile VALUE auto, 0, or 1 (default: 0) --matmul-precision VALUE none, highest, high, or medium (default: highest) -h, --help Show this help EOF } require_value() { if [ "$#" -lt 2 ] || [ -z "$2" ]; then printf 'Missing value for %s\n' "$1" >&2 usage >&2 exit 2 fi } FACTORIAL_DIR="" DATA_EVAL_DIR="" RELEASE_HOLDOUT_DIR="" TRAINING_SOURCE_COMMIT="" ANALYSIS_SOURCE_COMMIT="" GPUS="auto" MAX_WORKERS_PER_GPU="auto" MAX_TASKS_PER_WORKER=12 TORCH_COMPILE=0 MATMUL_PRECISION="highest" while [ "$#" -gt 0 ]; do case "$1" in --factorial-dir) require_value "$@"; FACTORIAL_DIR="$2"; shift 2 ;; --data-eval-dir) require_value "$@"; DATA_EVAL_DIR="$2"; shift 2 ;; --release-holdout-dir) require_value "$@"; RELEASE_HOLDOUT_DIR="$2"; shift 2 ;; --training-source-commit) require_value "$@"; TRAINING_SOURCE_COMMIT="$2"; shift 2 ;; --analysis-source-commit) require_value "$@"; ANALYSIS_SOURCE_COMMIT="$2"; shift 2 ;; --gpus) require_value "$@"; GPUS="$2"; shift 2 ;; --max-workers-per-gpu) require_value "$@"; MAX_WORKERS_PER_GPU="$2"; shift 2 ;; --max-tasks-per-worker) require_value "$@"; MAX_TASKS_PER_WORKER="$2"; shift 2 ;; --torch-compile) require_value "$@"; TORCH_COMPILE="$2"; shift 2 ;; --matmul-precision) require_value "$@"; MATMUL_PRECISION="$2"; shift 2 ;; -h|--help) usage; exit 0 ;; *) printf 'Unknown argument: %s\n' "$1" >&2 usage >&2 exit 2 ;; esac done for required in \ FACTORIAL_DIR DATA_EVAL_DIR RELEASE_HOLDOUT_DIR \ TRAINING_SOURCE_COMMIT ANALYSIS_SOURCE_COMMIT; do if [ -z "${!required}" ]; then printf 'Missing required argument for %s\n' "$required" >&2 usage >&2 exit 2 fi done for directory in "$FACTORIAL_DIR" "$DATA_EVAL_DIR" "$RELEASE_HOLDOUT_DIR"; do if [ ! -d "$directory" ]; then printf 'Not a directory: %s\n' "$directory" >&2 exit 2 fi done for file in \ "$FACTORIAL_DIR/manifest.json" \ "$FACTORIAL_DIR/manifest.csv" \ "$RELEASE_HOLDOUT_DIR/policy.json" \ "$RELEASE_HOLDOUT_DIR/affinity_samples.csv" \ "$RELEASE_HOLDOUT_DIR/affinity_pmhcs.csv"; do if [ ! -f "$file" ]; then printf 'Missing required file: %s\n' "$file" >&2 exit 2 fi done if ! [[ "$MAX_TASKS_PER_WORKER" =~ ^[1-9][0-9]*$ ]]; then printf '%s must be a positive integer\n' '--max-tasks-per-worker' >&2 exit 2 fi if [ "$MAX_WORKERS_PER_GPU" != "auto" ] && \ ! [[ "$MAX_WORKERS_PER_GPU" =~ ^[1-9][0-9]*$ ]]; then printf '%s must be auto or a positive integer\n' \ '--max-workers-per-gpu' >&2 exit 2 fi if [ "$GPUS" != "auto" ] && ! [[ "$GPUS" =~ ^[0-9]+$ ]]; then printf '%s must be auto or a nonnegative integer\n' '--gpus' >&2 exit 2 fi case "$TORCH_COMPILE" in auto|0|1) ;; *) printf 'Invalid --torch-compile: %s\n' "$TORCH_COMPILE" >&2; exit 2 ;; esac case "$MATMUL_PRECISION" in none|highest|high|medium) ;; *) printf 'Invalid --matmul-precision: %s\n' \ "$MATMUL_PRECISION" >&2 exit 2 ;; esac SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ARCH_OUT="$FACTORIAL_DIR/architecture_evaluation" mkdir -p "$ARCH_OUT/subsets" "$ARCH_OUT/comparisons" if [ "$GPUS" = "auto" ]; then if command -v nvidia-smi >/dev/null 2>&1; then GPUS="$(nvidia-smi -L | wc -l | tr -d ' ')" else GPUS=0 fi fi BASELINE_CONDITION="$(python -c \ 'import json,sys; print(json.load(open(sys.argv[1]))["baseline_condition"])' \ "$FACTORIAL_DIR/manifest.json")" { printf '%s\n' \ "schema_version=1" \ "training_source_commit=$TRAINING_SOURCE_COMMIT" \ "analysis_source_commit=$ANALYSIS_SOURCE_COMMIT" \ "baseline_condition=$BASELINE_CONDITION" \ "gpus=$GPUS" \ "max_workers_per_gpu=$MAX_WORKERS_PER_GPU" \ "max_tasks_per_worker=$MAX_TASKS_PER_WORKER" \ "torch_compile=$TORCH_COMPILE" \ "matmul_precision=$MATMUL_PRECISION" sha256sum \ "$FACTORIAL_DIR/provenance.txt" \ "$FACTORIAL_DIR/manifest.json" \ "$RELEASE_HOLDOUT_DIR/policy.json" \ "$RELEASE_HOLDOUT_DIR/affinity_samples.csv" \ "$RELEASE_HOLDOUT_DIR/affinity_pmhcs.csv" } > "$ARCH_OUT/provenance.txt" tail -n +2 "$FACTORIAL_DIR/manifest.csv" | cut -d, -f1 | \ while IFS= read -r condition; do condition_dir="$FACTORIAL_DIR/$condition" if [ ! -f "$condition_dir/.train.done" ]; then printf 'Factorial training is incomplete: %s\n' "$condition" >&2 exit 1 fi python "$SCRIPT_DIR/split_affinity_architectures.py" \ "$condition_dir/models.unselected.combined" \ "$ARCH_OUT/subsets/$condition" \ > "$ARCH_OUT/subsets/$condition.stdout.json" done baseline_subsets="$ARCH_OUT/subsets/$BASELINE_CONDITION" for baseline in "$baseline_subsets"/architecture_*; do architecture="$(basename "$baseline")" comparison="$ARCH_OUT/baseline-vs-public/$architecture" if [ ! -f "$comparison/.done" ]; then mkdir -p "$comparison" mhcflurry eval compare-models \ --a "$baseline" \ --a-label "$BASELINE_CONDITION/$architecture" \ --b public \ --data-dir "$DATA_EVAL_DIR" \ --release-holdout-dir "$RELEASE_HOLDOUT_DIR" \ --affinity-training-overlap-policy audit \ --skip-affinity-predictions \ --include affinity \ --out "$comparison" \ --num-jobs auto \ --gpus "$GPUS" \ --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" \ --max-tasks-per-worker "$MAX_TASKS_PER_WORKER" \ --torch-compile "$TORCH_COMPILE" \ --matmul-precision "$MATMUL_PRECISION" \ 2>&1 | tee "$comparison/eval.log" date -u +%Y-%m-%dT%H:%M:%SZ > "$comparison/.done" fi done tail -n +2 "$FACTORIAL_DIR/manifest.csv" | cut -d, -f1 | \ while IFS= read -r condition; do if [ "$condition" = "$BASELINE_CONDITION" ]; then continue fi for candidate in "$ARCH_OUT/subsets/$condition"/architecture_*; do architecture="$(basename "$candidate")" baseline="$baseline_subsets/$architecture" if [ ! -d "$baseline" ]; then printf 'Missing baseline subset: %s\n' "$baseline" >&2 exit 1 fi comparison="${ARCH_OUT}/comparisons/${condition}/${architecture}-vs-baseline" if [ ! -f "$comparison/.done" ]; then mkdir -p "$comparison" mhcflurry eval compare-models \ --a "$candidate" \ --a-label "$condition/$architecture" \ --b "$baseline" \ --b-label "$BASELINE_CONDITION/$architecture" \ --data-dir "$DATA_EVAL_DIR" \ --release-holdout-dir "$RELEASE_HOLDOUT_DIR" \ --affinity-training-overlap-policy audit \ --skip-affinity-predictions \ --include affinity \ --out "$comparison" \ --num-jobs auto \ --gpus "$GPUS" \ --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" \ --max-tasks-per-worker "$MAX_TASKS_PER_WORKER" \ --torch-compile "$TORCH_COMPILE" \ --matmul-precision "$MATMUL_PRECISION" \ 2>&1 | tee "$comparison/eval.log" date -u +%Y-%m-%dT%H:%M:%SZ > "$comparison/.done" fi done python "$SCRIPT_DIR/summarize_affinity_factorial_architectures.py" \ "$FACTORIAL_DIR" > "$ARCH_OUT/summary.stdout.json" done python "$SCRIPT_DIR/summarize_affinity_factorial_architectures.py" \ "$FACTORIAL_DIR" > "$ARCH_OUT/summary.stdout.json" mhcflurry-2.3.6/scripts/training/run_exact_public_processing.py000066400000000000000000000405061525677230600252150ustar00rootroot00000000000000#!/usr/bin/env python3 """Replay the frozen processing/presentation candidate on exact public data.""" import argparse from datetime import datetime, timezone import json import os from pathlib import Path import shutil import signal import subprocess import sys import time import numpy import pandas import yaml from audit_training_data_identity import compare_rows from compose_processing_ensemble import fingerprint_directory, sha256_file from generate_processing_cleavage_boundaries import build_conditions PUBLIC_PROCESSING_SHA256 = "f875773ec6ca75824e831a677301545f70519bf0f7f8f4a058f64eee90cdc3af" PUBLIC_PRESENTATION_SHA256 = "5b1f8fec4d8a1756e3fa49dd048f27dec20ed9fffa94089778adb4d6c1e5abb1" CONDITIONS = ("large_relu__legacy_5aa", "large_relu__extended_5x5") IDENTITY_COLUMNS = ["peptide", "n_flank", "c_flank", "sample_id", "hit", "hla"] def write_json(path, value): """Atomically publish a metadata document.""" path = Path(path) path.parent.mkdir(parents=True, exist_ok=True) temporary = path.with_name(path.name + ".tmp") temporary.write_text(json.dumps(value, indent=2, sort_keys=True) + "\n") temporary.replace(path) def utc_now(): return datetime.now(timezone.utc).isoformat() def verify_public_inputs(processing, presentation, holdout): """Reject changed public tables or training/evaluation sample overlap.""" from mhcflurry.release_holdout import load_excluded_samples from mhcflurry.training_folds import extract_training_folds files = {} for name, path, expected in ( ("processing", processing, PUBLIC_PROCESSING_SHA256), ("presentation", presentation, PUBLIC_PRESENTATION_SHA256)): digest = sha256_file(path) if digest != expected: raise ValueError("Not the archived public %s training file: %s" % (name, path)) data = pandas.read_csv(path, dtype={"sample_id": str}) excluded = set(load_excluded_samples(str(holdout / (name + "_samples.csv")))) overlap = sorted(set(data.sample_id) & excluded) if overlap: raise ValueError("%s training overlaps release holdout: %s" % (name, overlap)) if name == "processing": extract_training_folds(data, 4, reuse=True) files[name] = {"path": str(path), "sha256": digest, "rows": len(data)} return files class Driver: """Log resumable command stages without hiding a failing subprocess.""" def __init__(self, out, deadline=None): self.out = out configured = os.environ.get("MHCFLURRY_EXPERIMENT_DEADLINE_EPOCH") self.deadline = float(configured) if deadline is None and configured else deadline def run(self, stage, command): command = list(map(str, command)) marker = self.out / "stages" / (stage + ".json") if marker.exists(): saved = json.loads(marker.read_text()) if saved["command"] != command: raise ValueError("Refusing changed command for completed stage: " + stage) return event = {"stage": stage, "command": command, "started_at": utc_now()} write_json(self.out / "commands" / (stage + ".json"), event) log_path = self.out / "logs" / (stage + ".log") log_path.parent.mkdir(exist_ok=True) print("Starting", stage, command, flush=True) remaining = self.deadline - time.time() if self.deadline is not None else None if remaining is not None and remaining <= 0: raise TimeoutError("Experiment budget deadline reached before: " + stage) # Nested maintained commands inherit the outer command's process group. # Only its owner creates/kills that group, so no orphan GPU worker survives # an outer deadline. Ordinary non-budgeted commands keep legacy behavior. group_owner = (remaining is not None and os.name == "posix" and not os.environ.get("MHCFLURRY_BUDGET_PROCESS_GROUP")) child_env = os.environ.copy() if group_owner: child_env["MHCFLURRY_BUDGET_PROCESS_GROUP"] = "1" with log_path.open("a") as log: process = subprocess.Popen(command, stdout=log, stderr=subprocess.STDOUT, start_new_session=group_owner, env=child_env) try: status = process.wait(timeout=remaining) if remaining is not None else process.wait() except subprocess.TimeoutExpired: try: if group_owner: os.killpg(process.pid, signal.SIGTERM) else: process.terminate() except ProcessLookupError: pass try: process.wait(timeout=5) except subprocess.TimeoutExpired: if group_owner: os.killpg(process.pid, signal.SIGKILL) else: process.kill() process.wait(timeout=5) status = 124 event["budget_deadline_exceeded"] = True event.update(exit_code=status, finished_at=utc_now()) write_json(self.out / "commands" / (stage + ".json"), event) if status: raise subprocess.CalledProcessError(status, command) write_json(marker, event) def cached_scores(out, name, data, input_hash, model_dir, calculate, ordering="original archived presentation table order"): """Bind every cached vector to both its row ordering and model files.""" cache = out / "component_scores" cache.mkdir(exist_ok=True) path = cache / (name + ".npy") metadata_path = cache / (name + ".json") identity = {"input_sha256": input_hash, "rows": len(data), "ordering": ordering, "predictor": fingerprint_directory(model_dir)} if metadata_path.exists() and path.exists(): metadata = json.loads(metadata_path.read_text()) if metadata.get("identity") == identity and metadata.get("sha256") == sha256_file(path): values = numpy.load(path, allow_pickle=False) if values.shape == (len(data),) and numpy.isfinite(values).all(): return values values = numpy.asarray(calculate(), dtype="float64") if values.shape != (len(data),) or not numpy.isfinite(values).all(): raise ValueError("Invalid component scores: " + name) temporary = path.with_suffix(".tmp") with temporary.open("wb") as fd: numpy.save(fd, values, allow_pickle=False) temporary.replace(path) write_json(metadata_path, {"identity": identity, "sha256": sha256_file(path)}) return values def fit_combiners(out, training_data, affinity_dir, no_flank_dir, processing_dirs): """Refit identical combiners, reusing the shared public component scores.""" from mhcflurry import ( Class1AffinityPredictor, Class1PresentationPredictor, Class1ProcessingPredictor) data = pandas.read_csv(training_data, dtype={"sample_id": str}).fillna("") if not data.peptide.str.len().between(8, 15).all(): raise ValueError("Exact-data replay cannot silently filter presentation rows") data.to_csv(out / "presentation_training_rows.csv.bz2", index=False) input_hash = sha256_file(training_data) affinity = Class1AffinityPredictor.load(str(affinity_dir), optimization_level=0) no_flank = Class1ProcessingPredictor.load(str(no_flank_dir)) stack = Class1PresentationPredictor( affinity_predictor=affinity, processing_predictor_without_flanks=no_flank) affinities = cached_scores(out, "public_affinity", data, input_hash, affinity_dir, lambda: stack.predict_affinity( peptides=data.peptide.values, alleles={hla: hla.split() for hla in data.hla.unique()}, sample_names=data.hla.values, include_affinity_percentile=False).affinity.values) without = cached_scores(out, "public_no_flank", data, input_hash, no_flank_dir, lambda: stack.predict_processing(data.peptide.values)) for name, model_dir in processing_dirs.items(): processor = Class1ProcessingPredictor.load(str(model_dir)) stack.processing_predictor_with_flanks = processor scores = cached_scores(out, name, data, input_hash, model_dir, lambda: stack.predict_processing( data.peptide.values, data.n_flank.values, data.c_flank.values)) stack.fit_from_scores(targets=data.hit.values, affinities=affinities, processing_scores_by_model={"with_flanks": scores, "without_flanks": without}, verbose=1) models_dir = out / name / "presentation/models" models_dir.parent.mkdir(parents=True, exist_ok=True) stack.save(str(models_dir), write_percent_ranks=False) joined = data.copy() joined["affinity"] = affinities joined["processing_with_flanks"] = scores joined["processing_without_flanks"] = without joined.to_csv(out / name / "presentation/training_component_scores.csv.bz2", index=False) def make_parser(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--out", type=Path, required=True) parser.add_argument("--public-root", type=Path, required=True, help="Public download root containing the original model bundles.") parser.add_argument("--release-holdout-dir", type=Path, required=True) parser.add_argument("--source-commit", required=True) parser.add_argument("--gpus", type=int, default=1) parser.add_argument("--num-jobs", type=int, default=1) parser.add_argument("--random-seed", type=int, default=42) parser.add_argument("--prepare-only", action="store_true") return parser def main(argv=None): args = make_parser().parse_args(argv) args.out = args.out.resolve() args.public_root = args.public_root.resolve() args.release_holdout_dir = args.release_holdout_dir.resolve() out = args.out out.mkdir(parents=True, exist_ok=True) processing_root = args.public_root / "models_class1_processing" processing_data = processing_root / "models.selected.short_flanks/train_data.csv.bz2" presentation_data = args.public_root / "models_class1_presentation/train_data.csv.bz2" files = verify_public_inputs(processing_data, presentation_data, args.release_holdout_dir) config = {"design": "exact-public-processing", "inputs": files, "source_commit": args.source_commit, "random_seed": args.random_seed, "conditions": CONDITIONS, "networks": 8, "reuse_original_folds": True, "primary_contrast": "public affinity + fixed legacy/boundary processing vs public", "extra_data_training_authorized_by_driver": False, "holdout_sha256": {p.name: sha256_file(p) for p in sorted(args.release_holdout_dir.glob("*")) if p.is_file()}} config = json.loads(json.dumps(config)) if (out / "experiment.json").exists(): if json.loads((out / "experiment.json").read_text()) != config: raise ValueError("Refusing to reuse output directory with different experiment inputs") write_json(out / "experiment.json", config) for name, path in (("processing", processing_data), ("presentation", presentation_data)): destination = out / "inputs" / (name + ".csv.bz2") destination.parent.mkdir(exist_ok=True) if not destination.exists(): shutil.copy2(path, destination) shutil.copytree(args.release_holdout_dir, out / "release_holdout", dirs_exist_ok=True) for name, grid, _axes in build_conditions( architectures=["large_relu"], peptide_context_lengths=[5]): if name in CONDITIONS: (out / "inputs" / (name + ".yaml")).write_text(yaml.safe_dump(grid, sort_keys=True)) if args.prepare_only: print(json.dumps(config, indent=2)) return 0 os.environ.update({"MHCFLURRY_TORCH_COMPILE": "0", "MHCFLURRY_TORCH_COMPILE_LOSS": "0", "MHCFLURRY_MATMUL_PRECISION": "highest"}) driver = Driver(out) parallel = ["--gpus", args.gpus, "--num-jobs", args.num_jobs, "--max-workers-per-gpu", "1", "--torch-compile", "0", "--matmul-precision", "highest"] training_parallel = [*parallel, "--dataloader-num-workers", "1"] for name in CONDITIONS: processing = out / name / "processing" processing.mkdir(parents=True, exist_ok=True) unselected = processing / "models.unselected.short_flanks" selected = processing / "models.selected.short_flanks" # Always use the same resume command: initialize only before its first invocation. if not (unselected / "training_init_info.pkl").exists(): driver.run(name + "-initialize", ["mhcflurry", "class1-train-processing-models", "--processing-data-policy", "legacy", "--data", processing_data, "--reuse-folds", "--num-folds", "4", "--random-seed", args.random_seed, "--hyperparameters", out / "inputs" / (name + ".yaml"), "--out-models-dir", unselected, "--only-initialize", *training_parallel]) driver.run(name + "-train", ["mhcflurry", "class1-train-processing-models", "--processing-data-policy", "legacy", "--out-models-dir", unselected, "--continue-incomplete", *training_parallel]) columns = IDENTITY_COLUMNS + ["fold_%d" % i for i in range(4)] reference = pandas.read_csv(processing_data, dtype=str, keep_default_na=False) replay = pandas.read_csv(unselected / "train_data.csv.bz2", dtype=str, keep_default_na=False) identity, _ = compare_rows(reference, replay, columns) write_json(out / name / "training_identity.json", identity) if not identity["same_ordered_rows"]: raise ValueError("Training command changed public rows/folds") driver.run(name + "-select", ["mhcflurry", "class1-select-processing-models", "--processing-data-policy", "legacy", "--data", unselected / "train_data.csv.bz2", "--models-dir", unselected, "--out-models-dir", selected, "--min-models-per-fold", "1", "--max-models-per-fold", "1", "--save-validation-predictions", *training_parallel]) driver.run(name + "-loss-plots", ["mhcflurry", "train", "plot-loss-curves", "--selected-dir", selected, "--unselected-dir", unselected, "--out", out / name / "loss_plots"]) hybrid = out / "hybrid/processing/models.selected.short_flanks" driver.run("compose-hybrid", ["mhcflurry", "train", "compose-processing-ensemble", "--predictor", "legacy=" + str(out / CONDITIONS[0] / "processing/models.selected.short_flanks"), "--predictor", "boundary=" + str(out / CONDITIONS[1] / "processing/models.selected.short_flanks"), "--require-equal-counts", "--out", hybrid]) processors = {"public_refit": processing_root / "models.selected.short_flanks", **{name: out / name / "processing/models.selected.short_flanks" for name in CONDITIONS}, "hybrid": hybrid} fit_combiners(out, presentation_data, args.public_root / "models_class1_pan/models.combined", processing_root / "models.selected.no_flank", processors) for name in processors: comparison = out / "comparisons" / (name + "-vs-public") driver.run(name + "-evaluate", ["mhcflurry", "eval", "compare-models", "--a", out / name, "--a-label", name, "--a-presentation-dir", out / name / "presentation/models", "--a-processing-dir", processing_root if name == "public_refit" else out / name / "processing", "--b", "public:2.2.0", "--b-label", "selected-public-2.1.x", "--data-dir", args.public_root / "data_evaluation", "--release-holdout-dir", args.release_holdout_dir, "--include", "processing,presentation", "--processing-modes", "short_flanks", "--presentation-score-kinds", "presentation_score", "--presentation-modes", "with_flanks,without_flanks", "--out", comparison, *parallel]) driver.run(name + "-plots", ["mhcflurry", "eval", "plot-comparison", "--input", comparison, "--components", "processing,presentation", "--summary-pdf", comparison / "plots/model_comparison_figures.pdf"]) write_json(out / "completed.json", {"at": utc_now(), "extra_data_gate": "requires review of held-out results"}) return 0 if __name__ == "__main__": sys.exit(main()) mhcflurry-2.3.6/scripts/training/run_processing_batch_sweep.sh000077500000000000000000000154251525677230600250260ustar00rootroot00000000000000#!/usr/bin/env bash # Run the focused processing minibatch sweep without repeating prior ablations. set -euo pipefail usage() { cat <<'EOF' Usage: run_processing_batch_sweep.sh \ --out DIR \ --train-data CSV.BZ2 \ --data-eval-dir DIR \ --release-holdout-dir DIR \ --source-commit COMMIT \ [--gpus N] [--num-jobs N|auto] \ [--max-workers-per-gpu N|auto] \ [--dataloader-num-workers N|auto] \ [--max-tasks-per-worker N] [--random-seed N] Trains the controlled 128/256/512/1024 processing batch panels. The primary mode is 5-aa flanks and the secondary mode is no flanks. A broad 15-aa sweep is intentionally excluded. EOF } OUT="" TRAIN_DATA="" DATA_EVAL_DIR="" RELEASE_HOLDOUT_DIR="" SOURCE_COMMIT="" GPUS="auto" NUM_JOBS="auto" MAX_WORKERS_PER_GPU="auto" DATALOADER_NUM_WORKERS="1" MAX_TASKS_PER_WORKER="12" RANDOM_SEED="42" while [ "$#" -gt 0 ]; do case "$1" in --out) OUT="$2"; shift 2 ;; --train-data) TRAIN_DATA="$2"; shift 2 ;; --data-eval-dir) DATA_EVAL_DIR="$2"; shift 2 ;; --release-holdout-dir) RELEASE_HOLDOUT_DIR="$2"; shift 2 ;; --source-commit) SOURCE_COMMIT="$2"; shift 2 ;; --gpus) GPUS="$2"; shift 2 ;; --num-jobs) NUM_JOBS="$2"; shift 2 ;; --max-workers-per-gpu) MAX_WORKERS_PER_GPU="$2"; shift 2 ;; --dataloader-num-workers) DATALOADER_NUM_WORKERS="$2"; shift 2 ;; --max-tasks-per-worker) MAX_TASKS_PER_WORKER="$2"; shift 2 ;; --random-seed) RANDOM_SEED="$2"; shift 2 ;; -h|--help) usage; exit 0 ;; *) echo "Unknown argument: $1" >&2; usage >&2; exit 2 ;; esac done for required in OUT TRAIN_DATA DATA_EVAL_DIR RELEASE_HOLDOUT_DIR SOURCE_COMMIT; do if [ -z "${!required}" ]; then echo "Missing required argument for $required" >&2 usage >&2 exit 2 fi done if [ ! -f "$TRAIN_DATA" ]; then echo "Training data not found: $TRAIN_DATA" >&2 exit 2 fi if [ ! -f "$RELEASE_HOLDOUT_DIR/processing_samples.csv" ]; then echo "Processing holdout manifest not found in: $RELEASE_HOLDOUT_DIR" >&2 exit 2 fi if [ ! -d "$DATA_EVAL_DIR" ]; then echo "Evaluation data directory not found: $DATA_EVAL_DIR" >&2 exit 2 fi mhcflurry train validate-processing-data --data "$TRAIN_DATA" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck disable=SC1091 source "$SCRIPT_DIR/gpu_telemetry.sh" GPU_TELEMETRY_PID="" trap stop_gpu_telemetry EXIT if [ "$GPUS" = auto ]; then if command -v nvidia-smi >/dev/null 2>&1; then GPUS="$(nvidia-smi -L 2>/dev/null | wc -l | tr -d ' ')" else GPUS=0 fi fi PANEL_DIR="$OUT/hyperparameter_panels" PAIRWISE_DIR="$OUT/paired_comparisons" mkdir -p "$PANEL_DIR" "$PAIRWISE_DIR" python "$SCRIPT_DIR/generate_release_hyperparameter_ablations.py" "$PANEL_DIR" \ > "$OUT/panel_manifest.stdout.json" { printf 'source_commit=%s\n' "$SOURCE_COMMIT" printf 'train_data=%s\n' "$TRAIN_DATA" printf 'train_data_sha256=' sha256sum "$TRAIN_DATA" | cut -d' ' -f1 printf 'release_holdout_dir=%s\n' "$RELEASE_HOLDOUT_DIR" printf 'processing_holdout_sha256=' sha256sum "$RELEASE_HOLDOUT_DIR/processing_samples.csv" | cut -d' ' -f1 printf 'batch_sizes=128,256,512,1024\n' printf 'mode_priority=short_flanks,no_flank\n' printf 'gpus=%s\n' "$GPUS" printf 'num_jobs=%s\n' "$NUM_JOBS" printf 'max_workers_per_gpu=%s\n' "$MAX_WORKERS_PER_GPU" printf 'dataloader_num_workers=%s\n' "$DATALOADER_NUM_WORKERS" printf 'max_tasks_per_worker=%s\n' "$MAX_TASKS_PER_WORKER" printf 'random_seed=%s\n' "$RANDOM_SEED" } > "$OUT/provenance.txt" COMMON_PARALLELISM_ARGS=( --num-jobs "$NUM_JOBS" --max-tasks-per-worker "$MAX_TASKS_PER_WORKER" --gpus "$GPUS" --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" --torch-compile 0 --matmul-precision highest ) TRAINING_PARALLELISM_ARGS=( "${COMMON_PARALLELISM_ARGS[@]}" --dataloader-num-workers "$DATALOADER_NUM_WORKERS" ) train_panel() { local minibatch_size="$1" local variant="$2" local condition_root="$OUT/processing_batch_sweep.batch$minibatch_size" local processing_root="$condition_root/processing" local unselected="$processing_root/models.unselected.$variant" local selected="$processing_root/models.selected.$variant" local hyperparameters="$PANEL_DIR/processing_batch_sweep.batch$minibatch_size.$variant.yaml" mkdir -p "$processing_root" if [ -f "$unselected/manifest.csv" ]; then mhcflurry-class1-train-processing-models \ --out-models-dir "$unselected" \ --continue-incomplete \ "${TRAINING_PARALLELISM_ARGS[@]}" else mhcflurry-class1-train-processing-models \ --data "$TRAIN_DATA" \ --held-out-samples 10 \ --num-folds 4 \ --random-seed "$RANDOM_SEED" \ --hyperparameters "$hyperparameters" \ --out-models-dir "$unselected" \ --worker-log-dir "$processing_root" \ "${TRAINING_PARALLELISM_ARGS[@]}" fi if [ ! -f "$selected/train_data.csv.bz2" ]; then mhcflurry-class1-select-processing-models \ --data "$unselected/train_data.csv.bz2" \ --models-dir "$unselected" \ --out-models-dir "$selected" \ --min-models-per-fold 1 \ --max-models-per-fold 2 \ --save-validation-predictions \ "${TRAINING_PARALLELISM_ARGS[@]}" cp "$unselected/train_data.csv.bz2" \ "$selected/train_data.csv.bz2" fi } for minibatch_size in 128 256 512 1024; do processing_root="$OUT/processing_batch_sweep.batch$minibatch_size/processing" mkdir -p "$processing_root" start_gpu_telemetry "$processing_root/gpu_occupancy.csv" train_panel "$minibatch_size" short_flanks train_panel "$minibatch_size" no_flank stop_gpu_telemetry done batch512="$OUT/processing_batch_sweep.batch512" for minibatch_size in 128 256 1024; do mhcflurry eval compare-models \ --a "$OUT/processing_batch_sweep.batch$minibatch_size" \ --a-label "processing_batch_$minibatch_size" \ --b "$batch512" \ --b-label processing_batch_512 \ --data-dir "$DATA_EVAL_DIR" \ --release-holdout-dir "$RELEASE_HOLDOUT_DIR" \ --include processing \ --processing-modes short_flanks,no_flank \ --out "$PAIRWISE_DIR/processing_batch_$minibatch_size-vs-512" \ "${COMMON_PARALLELISM_ARGS[@]}" done mhcflurry eval compare-models \ --a "$batch512" \ --a-label processing_batch_512 \ --b public \ --b-label public \ --data-dir "$DATA_EVAL_DIR" \ --release-holdout-dir "$RELEASE_HOLDOUT_DIR" \ --include processing \ --processing-modes short_flanks,no_flank \ --out "$PAIRWISE_DIR/processing_batch_512-vs-public" \ "${COMMON_PARALLELISM_ARGS[@]}" mhcflurry-2.3.6/scripts/training/run_processing_cleavage_boundaries.sh000077500000000000000000000256621525677230600265300ustar00rootroot00000000000000#!/usr/bin/env bash # Train and evaluate paired cleavage-boundary processing models and controls. set -euo pipefail usage() { cat <<'EOF' Usage: run_processing_cleavage_boundaries.sh [OPTIONS] Required: --out PATH Experiment output directory --train-data PATH Frozen processing training table --data-eval-dir PATH Evaluation data directory --release-holdout-dir PATH Frozen release-holdout manifests --source-commit COMMIT Exact source commit being evaluated Experiment controls: --random-seed INTEGER Shared folds/fits seed (default: 42) --evaluation MODE none or all (default: all) Execution controls: --gpus INTEGER|auto GPU count (default: auto) --num-jobs INTEGER|auto Concurrent jobs (default: auto) --max-workers-per-gpu INTEGER|auto Worker density (default: auto) --dataloader-num-workers N|auto Workers per dataloader (default: 1) --max-tasks-per-worker INTEGER Worker recycling interval (default: 12) -h, --help Show this help The fixed screen contains 32 networks: compact 5+2 and extended 5+5 boundary models plus retrained legacy 5-aa and no-flank controls, for two representative architectures and four shared folds. Every condition gets loss curves and one saved prediction column on the same frozen held-out cohort. EOF } require_value() { if [ "$#" -lt 2 ] || [ -z "$2" ]; then printf 'Missing value for %s\n' "$1" >&2 usage >&2 exit 2 fi } sha256_path() { if command -v sha256sum >/dev/null 2>&1; then sha256sum "$1" | cut -d' ' -f1 else shasum -a 256 "$1" | cut -d' ' -f1 fi } OUT="" TRAIN_DATA="" DATA_EVAL_DIR="" RELEASE_HOLDOUT_DIR="" SOURCE_COMMIT="" RANDOM_SEED=42 EVALUATION=all GPUS=auto NUM_JOBS=auto MAX_WORKERS_PER_GPU=auto DATALOADER_NUM_WORKERS=1 MAX_TASKS_PER_WORKER=12 ORIGINAL_ARGS=("$@") while [ "$#" -gt 0 ]; do case "$1" in --out) require_value "$@"; OUT="$2"; shift 2 ;; --train-data) require_value "$@"; TRAIN_DATA="$2"; shift 2 ;; --data-eval-dir) require_value "$@"; DATA_EVAL_DIR="$2"; shift 2 ;; --release-holdout-dir) require_value "$@"; RELEASE_HOLDOUT_DIR="$2"; shift 2 ;; --source-commit) require_value "$@"; SOURCE_COMMIT="$2"; shift 2 ;; --random-seed) require_value "$@"; RANDOM_SEED="$2"; shift 2 ;; --evaluation) require_value "$@"; EVALUATION="$2"; shift 2 ;; --gpus) require_value "$@"; GPUS="$2"; shift 2 ;; --num-jobs) require_value "$@"; NUM_JOBS="$2"; shift 2 ;; --max-workers-per-gpu) require_value "$@"; MAX_WORKERS_PER_GPU="$2"; shift 2 ;; --dataloader-num-workers) require_value "$@"; DATALOADER_NUM_WORKERS="$2"; shift 2 ;; --max-tasks-per-worker) require_value "$@"; MAX_TASKS_PER_WORKER="$2"; shift 2 ;; -h|--help) usage; exit 0 ;; *) printf 'Unknown argument: %s\n' "$1" >&2; usage >&2; exit 2 ;; esac done for required in OUT TRAIN_DATA DATA_EVAL_DIR RELEASE_HOLDOUT_DIR SOURCE_COMMIT; do if [ -z "${!required}" ]; then printf 'Missing required argument for %s\n' "$required" >&2 usage >&2 exit 2 fi done case "$EVALUATION" in none|all) ;; *) printf 'Invalid --evaluation: %s\n' "$EVALUATION" >&2; exit 2 ;; esac if [ ! -f "$TRAIN_DATA" ]; then printf 'Training data is not a file: %s\n' "$TRAIN_DATA" >&2 exit 2 fi if [ ! -d "$DATA_EVAL_DIR" ]; then printf 'Evaluation data is not a directory: %s\n' "$DATA_EVAL_DIR" >&2 exit 2 fi for holdout_file in policy.json processing_samples.csv; do if [ ! -f "$RELEASE_HOLDOUT_DIR/$holdout_file" ]; then printf 'Missing release holdout file: %s\n' "$holdout_file" >&2 exit 2 fi done mhcflurry train validate-processing-data --data "$TRAIN_DATA" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [ "$GPUS" = auto ]; then if command -v nvidia-smi >/dev/null 2>&1; then GPUS="$(nvidia-smi -L 2>/dev/null | wc -l | tr -d ' ')" else GPUS=0 fi fi mkdir -p "$OUT" date -u +%Y-%m-%dT%H:%M:%SZ > "$OUT/started_at_utc.txt" { printf 'bash %q' "$0" printf ' %q' "${ORIGINAL_ARGS[@]}" printf '\n' } > "$OUT/command.sh" python "$SCRIPT_DIR/generate_processing_cleavage_boundaries.py" \ "$OUT" > "$OUT/manifest.stdout.json" { printf '%s\n' \ "schema_version=1" \ "source_commit=$SOURCE_COMMIT" \ "design=processing-cleavage-boundaries" \ "random_seed=$RANDOM_SEED" \ "evaluation=$EVALUATION" \ "gpus=$GPUS" \ "num_jobs=$NUM_JOBS" \ "max_workers_per_gpu=$MAX_WORKERS_PER_GPU" \ "dataloader_num_workers=$DATALOADER_NUM_WORKERS" \ "max_tasks_per_worker=$MAX_TASKS_PER_WORKER" printf '%s %s\n' "$(sha256_path "$TRAIN_DATA")" "$TRAIN_DATA" printf '%s %s\n' \ "$(sha256_path "$RELEASE_HOLDOUT_DIR/policy.json")" \ "$RELEASE_HOLDOUT_DIR/policy.json" printf '%s %s\n' \ "$(sha256_path "$RELEASE_HOLDOUT_DIR/processing_samples.csv")" \ "$RELEASE_HOLDOUT_DIR/processing_samples.csv" printf '%s %s\n' "$(sha256_path "$OUT/manifest.json")" \ "$OUT/manifest.json" } > "$OUT/provenance.txt" COMMON_PARALLELISM_ARGS=( --num-jobs "$NUM_JOBS" --max-tasks-per-worker "$MAX_TASKS_PER_WORKER" --gpus "$GPUS" --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" --torch-compile 0 --matmul-precision highest ) TRAINING_PARALLELISM_ARGS=( "${COMMON_PARALLELISM_ARGS[@]}" --dataloader-num-workers "$DATALOADER_NUM_WORKERS" ) # shellcheck disable=SC1091 source "$SCRIPT_DIR/gpu_telemetry.sh" GPU_TELEMETRY_PID="" trap stop_gpu_telemetry EXIT start_gpu_telemetry "$OUT/gpu_occupancy.csv" tail -n +2 "$OUT/manifest.csv" | cut -d, -f1 | \ while IFS= read -r condition; do condition_out="$OUT/$condition" processing_out="$condition_out/processing" unselected="$processing_out/models.unselected.short_flanks" selected="$processing_out/models.selected.short_flanks" hyperparameters="$OUT/conditions/$condition.yaml" mkdir -p "$processing_out" if [ -f "$unselected/manifest.csv" ]; then mhcflurry-class1-train-processing-models \ --out-models-dir "$unselected" \ --continue-incomplete \ "${TRAINING_PARALLELISM_ARGS[@]}" else mhcflurry-class1-train-processing-models \ --data "$TRAIN_DATA" \ --held-out-samples 10 \ --num-folds 4 \ --random-seed "$RANDOM_SEED" \ --hyperparameters "$hyperparameters" \ --out-models-dir "$unselected" \ --worker-log-dir "$processing_out" \ "${TRAINING_PARALLELISM_ARGS[@]}" fi if [ ! -f "$selected/train_data.csv.bz2" ]; then mhcflurry-class1-select-processing-models \ --data "$unselected/train_data.csv.bz2" \ --models-dir "$unselected" \ --out-models-dir "$selected" \ --min-models-per-fold 1 \ --max-models-per-fold 1 \ --save-validation-predictions \ "${TRAINING_PARALLELISM_ARGS[@]}" cp "$unselected/train_data.csv.bz2" "$selected/train_data.csv.bz2" fi printf '%s\n' "$condition_out" > "$condition_out/predictor_path.txt" if [ ! -f "$condition_out/.loss-plots.done" ]; then mhcflurry train plot-loss-curves \ --selected-dir "$selected" \ --unselected-dir "$unselected" \ --out "$condition_out/loss_plots" date -u +%Y-%m-%dT%H:%M:%SZ > "$condition_out/.loss-plots.done" fi done stop_gpu_telemetry GPU_TELEMETRY_PID="" run_comparison() { local name="$1" local a_condition="$2" local b_spec="$3" local comparison="$OUT/comparisons/$name" if [ -f "$comparison/.done" ]; then return fi mkdir -p "$comparison" mhcflurry eval compare-models \ --a "$OUT/$a_condition" \ --a-label "$a_condition" \ --b "$b_spec" \ --b-label "$(basename "$b_spec")" \ --data-dir "$DATA_EVAL_DIR" \ --release-holdout-dir "$RELEASE_HOLDOUT_DIR" \ --include processing \ --processing-modes short_flanks \ --out "$comparison" \ "${COMMON_PARALLELISM_ARGS[@]}" mhcflurry eval plot-comparison \ --input "$comparison" \ --components processing \ --summary-pdf "$comparison/plots/model_comparison_figures.pdf" date -u +%Y-%m-%dT%H:%M:%SZ > "$comparison/.done" } if [ "$EVALUATION" = all ]; then mkdir -p "$OUT/comparisons" # Score the large public ensemble only once. Every remaining condition is # paired to its architecture-matched 5-aa control, except the large 5-aa # control itself, which is paired to the small 5-aa anchor. run_comparison \ small_tanh__legacy_5aa-vs-public \ small_tanh__legacy_5aa public for condition in \ small_tanh__legacy_no_flank \ small_tanh__compact_5x2 \ small_tanh__extended_5x5 do run_comparison \ "$condition-vs-small_tanh__legacy_5aa" \ "$condition" "$OUT/small_tanh__legacy_5aa" done run_comparison \ large_relu__legacy_5aa-vs-small_tanh__legacy_5aa \ large_relu__legacy_5aa "$OUT/small_tanh__legacy_5aa" for condition in \ large_relu__legacy_no_flank \ large_relu__compact_5x2 \ large_relu__extended_5x5 do run_comparison \ "$condition-vs-large_relu__legacy_5aa" \ "$condition" "$OUT/large_relu__legacy_5aa" done prediction_suffix="processing/predictions_short_flanks.csv.bz2" small_anchor="$OUT/comparisons/small_tanh__legacy_5aa-vs-public/$prediction_suffix" large_anchor="$OUT/comparisons/large_relu__legacy_5aa-vs-small_tanh__legacy_5aa/$prediction_suffix" affinity_args=( --score "public_5aa=$small_anchor:b_processing_score" --score "small_tanh__legacy_5aa=$small_anchor:a_processing_score" --score "large_relu__legacy_5aa=$large_anchor:a_processing_score" ) for condition in \ small_tanh__legacy_no_flank \ small_tanh__compact_5x2 \ small_tanh__extended_5x5 do path="$OUT/comparisons/$condition-vs-small_tanh__legacy_5aa/$prediction_suffix" affinity_args+=(--score "$condition=$path:a_processing_score") done for condition in \ large_relu__legacy_no_flank \ large_relu__compact_5x2 \ large_relu__extended_5x5 do path="$OUT/comparisons/$condition-vs-large_relu__legacy_5aa/$prediction_suffix" affinity_args+=(--score "$condition=$path:a_processing_score") done mhcflurry eval processing-affinity-control \ "${affinity_args[@]}" \ --baseline public_5aa \ --data-dir "$DATA_EVAL_DIR" \ --decoys-per-hit 10 \ --same-protein-caliper 0.25 \ --out "$OUT/affinity_controlled" fi date -u +%Y-%m-%dT%H:%M:%SZ > "$OUT/completed_at_utc.txt" mhcflurry-2.3.6/scripts/training/run_processing_cleavage_boundaries_remote.sh000077500000000000000000000077241525677230600301020ustar00rootroot00000000000000#!/usr/bin/env bash # Build frozen prerequisites and run the cleavage-boundary panel on runplz. set -euo pipefail : "${MHCFLURRY_OUT:?MHCFLURRY_OUT must be set}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" : "${REPO:=$(cd "$SCRIPT_DIR/../.." && pwd)}" export PYTHONUNBUFFERED=1 export MHCFLURRY_TORCH_COMPILE="${MHCFLURRY_TORCH_COMPILE:-0}" export MHCFLURRY_TORCH_COMPILE_LOSS="${MHCFLURRY_TORCH_COMPILE_LOSS:-0}" export MHCFLURRY_MATMUL_PRECISION="${MHCFLURRY_MATMUL_PRECISION:-highest}" HOLDOUT_DIR="$MHCFLURRY_OUT/release_holdout" SHARED_DIR="$MHCFLURRY_OUT/processing.shared" RUN_DIR="$MHCFLURRY_OUT/processing-cleavage-boundaries" mkdir -p "$HOLDOUT_DIR" "$SHARED_DIR" "$RUN_DIR" mhcflurry-downloads fetch \ data_evaluation data_curated data_mass_spec_annotated data_references \ models_class1_pan models_class1_processing mhcflurry train release-holdout build \ --data-dir "$(mhcflurry-downloads path data_evaluation)" \ --training-data \ "$(mhcflurry-downloads path data_curated)/curated_training_data.csv.bz2" \ --mass-spec-data \ "$(mhcflurry-downloads path data_mass_spec_annotated)/annotated_ms.csv.bz2" \ --out-dir "$HOLDOUT_DIR" if command -v nvidia-smi >/dev/null 2>&1; then GPUS="$(nvidia-smi -L 2>/dev/null | wc -l | tr -d ' ')" else GPUS=0 fi NUM_JOBS="${NUM_JOBS:-auto}" MAX_WORKERS_PER_GPU="${MAX_WORKERS_PER_GPU:-auto}" DATALOADER_NUM_WORKERS="${DATALOADER_NUM_WORKERS:-auto}" MAX_TASKS_PER_WORKER="${MAX_TASKS_PER_WORKER:-12}" RELEASE_RANDOM_SEED="${RELEASE_RANDOM_SEED:-42}" TRAINING_PARALLELISM_ARGS=( --num-jobs "$NUM_JOBS" --max-tasks-per-worker "$MAX_TASKS_PER_WORKER" --gpus "$GPUS" --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" --dataloader-num-workers "$DATALOADER_NUM_WORKERS" --torch-compile 0 --matmul-precision highest ) compress_csv_bzip2() { local path="$1" if command -v lbzip2 >/dev/null 2>&1; then lbzip2 -f "$path" elif command -v pbzip2 >/dev/null 2>&1; then pbzip2 -f "$path" else bzip2 -f "$path" fi } AFFINITY_PREDICTOR="${AFFINITY_PREDICTOR:-$(mhcflurry-downloads path models_class1_pan)/models.combined}" if [ ! -f "$SHARED_DIR/train_data.csv.bz2" ]; then python "$REPO/downloads-generation/models_class1_processing/annotate_hits_with_expression.py" \ --hits \ "$(mhcflurry-downloads path data_mass_spec_annotated)/annotated_ms.csv.bz2" \ --expression \ "$(mhcflurry-downloads path data_curated)/rna_expression.csv.bz2" \ --out "$SHARED_DIR/hits_with_tpm.csv" compress_csv_bzip2 "$SHARED_DIR/hits_with_tpm.csv" mhcflurry train processing-data \ --hits "$SHARED_DIR/hits_with_tpm.csv.bz2" \ --affinity-predictor "$AFFINITY_PREDICTOR" \ --proteome-reference-csv \ "$(mhcflurry-downloads path data_references)/uniprot_proteins.csv.bz2" \ --ppv-multiplier 100 \ --negative-policy matched --decoys-per-hit 1 --max-affinity-distance 0.25 \ --exclude-samples-file "$HOLDOUT_DIR/processing_samples.csv" \ --random-seed "$RELEASE_RANDOM_SEED" \ --out "$SHARED_DIR/train_data.csv" \ "${TRAINING_PARALLELISM_ARGS[@]}" compress_csv_bzip2 "$SHARED_DIR/train_data.csv" fi mhcflurry train validate-processing-data --data "$SHARED_DIR/train_data.csv.bz2" SOURCE_COMMIT="${MHCFLURRY_RELEASE_GIT_COMMIT:-}" if [ -z "$SOURCE_COMMIT" ]; then SOURCE_COMMIT="$(git -C "$REPO" rev-parse HEAD)" fi bash "$SCRIPT_DIR/run_processing_cleavage_boundaries.sh" \ --out "$RUN_DIR" \ --train-data "$SHARED_DIR/train_data.csv.bz2" \ --data-eval-dir "$(mhcflurry-downloads path data_evaluation)" \ --release-holdout-dir "$HOLDOUT_DIR" \ --source-commit "$SOURCE_COMMIT" \ --random-seed "$RELEASE_RANDOM_SEED" \ --gpus "$GPUS" \ --num-jobs "$NUM_JOBS" \ --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" \ --dataloader-num-workers "$DATALOADER_NUM_WORKERS" \ --max-tasks-per-worker "$MAX_TASKS_PER_WORKER" mhcflurry-2.3.6/scripts/training/run_processing_cleavage_boundary_radius.sh000077500000000000000000000252561525677230600275660ustar00rootroot00000000000000#!/usr/bin/env bash # Compare 3- and 4-residue peptide-side cleavage windows on one frozen base. set -euo pipefail usage() { cat <<'EOF' Usage: run_processing_cleavage_boundary_radius.sh [OPTIONS] Required: --out PATH Follow-up output directory --base-run PATH Completed processing-cleavage-boundaries run --architecture NAME small_tanh or large_relu --train-data PATH Frozen processing training table --data-eval-dir PATH Evaluation data directory --release-holdout-dir PATH Frozen release-holdout manifests --source-commit COMMIT Exact follow-up source commit Execution controls: --random-seed INTEGER Shared folds/fits seed (default: 42) --gpus INTEGER GPU count (default: auto) --num-jobs INTEGER Concurrent jobs per condition (default: auto) --dataloader-num-workers N Workers per dataloader (default: auto) --parallel-conditions N Conditions trained concurrently (default: 1) --affinity-control MODE all or none (default: all) -h, --help Show this help The scientific contrast is fixed to 5 external residues and either 3 or 4 peptide-side residues at both cleavage sites. The two conditions use the same data, folds, seed, and recipe as the supplied base run. Set --parallel-conditions 2 only after the seeded packing probe passes. EOF } require_value() { if [ "$#" -lt 2 ] || [ -z "$2" ]; then printf 'Missing value for %s\n' "$1" >&2 usage >&2 exit 2 fi } sha256_path() { if command -v sha256sum >/dev/null 2>&1; then sha256sum "$1" | cut -d' ' -f1 else shasum -a 256 "$1" | cut -d' ' -f1 fi } OUT="" BASE_RUN="" ARCHITECTURE="" TRAIN_DATA="" DATA_EVAL_DIR="" RELEASE_HOLDOUT_DIR="" SOURCE_COMMIT="" RANDOM_SEED=42 GPUS=auto NUM_JOBS=auto DATALOADER_NUM_WORKERS=auto PARALLEL_CONDITIONS=1 AFFINITY_CONTROL=all ORIGINAL_ARGS=("$@") while [ "$#" -gt 0 ]; do case "$1" in --out) require_value "$@"; OUT="$2"; shift 2 ;; --base-run) require_value "$@"; BASE_RUN="$2"; shift 2 ;; --architecture) require_value "$@"; ARCHITECTURE="$2"; shift 2 ;; --train-data) require_value "$@"; TRAIN_DATA="$2"; shift 2 ;; --data-eval-dir) require_value "$@"; DATA_EVAL_DIR="$2"; shift 2 ;; --release-holdout-dir) require_value "$@"; RELEASE_HOLDOUT_DIR="$2"; shift 2 ;; --source-commit) require_value "$@"; SOURCE_COMMIT="$2"; shift 2 ;; --random-seed) require_value "$@"; RANDOM_SEED="$2"; shift 2 ;; --gpus) require_value "$@"; GPUS="$2"; shift 2 ;; --num-jobs) require_value "$@"; NUM_JOBS="$2"; shift 2 ;; --dataloader-num-workers) require_value "$@"; DATALOADER_NUM_WORKERS="$2"; shift 2 ;; --parallel-conditions) require_value "$@"; PARALLEL_CONDITIONS="$2"; shift 2 ;; --affinity-control) require_value "$@"; AFFINITY_CONTROL="$2"; shift 2 ;; -h|--help) usage; exit 0 ;; *) printf 'Unknown argument: %s\n' "$1" >&2; usage >&2; exit 2 ;; esac done for required in \ OUT BASE_RUN ARCHITECTURE TRAIN_DATA DATA_EVAL_DIR \ RELEASE_HOLDOUT_DIR SOURCE_COMMIT do if [ -z "${!required}" ]; then printf 'Missing required argument for %s\n' "$required" >&2 exit 2 fi done case "$ARCHITECTURE" in small_tanh|large_relu) ;; *) printf 'Invalid architecture: %s\n' "$ARCHITECTURE" >&2; exit 2 ;; esac case "$PARALLEL_CONDITIONS" in 1|2) ;; *) printf 'Parallel conditions must be 1 or 2\n' >&2; exit 2 ;; esac case "$AFFINITY_CONTROL" in all|none) ;; *) printf 'Affinity control must be all or none\n' >&2; exit 2 ;; esac for path in \ "$TRAIN_DATA" \ "$BASE_RUN/manifest.json" \ "$RELEASE_HOLDOUT_DIR/policy.json" \ "$RELEASE_HOLDOUT_DIR/processing_samples.csv" do if [ ! -f "$path" ]; then printf 'Missing required file: %s\n' "$path" >&2 exit 2 fi done for condition in legacy_5aa compact_5x2 extended_5x5; do path="$BASE_RUN/${ARCHITECTURE}__${condition}/predictor_path.txt" if [ ! -f "$path" ]; then printf 'Base run lacks %s\n' "$path" >&2 exit 2 fi done mhcflurry train validate-processing-data --data "$TRAIN_DATA" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [ "$GPUS" = auto ]; then if command -v nvidia-smi >/dev/null 2>&1; then GPUS="$(nvidia-smi -L 2>/dev/null | wc -l | tr -d ' ')" else GPUS=0 fi fi mkdir -p "$OUT" date -u +%Y-%m-%dT%H:%M:%SZ > "$OUT/started_at_utc.txt" { printf 'bash %q' "$0" printf ' %q' "${ORIGINAL_ARGS[@]}" printf '\n' } > "$OUT/command.sh" python "$SCRIPT_DIR/generate_processing_cleavage_boundaries.py" \ "$OUT" \ --architectures "$ARCHITECTURE" \ --peptide-context-lengths 3 4 \ --no-controls \ --design processing-cleavage-boundary-radius \ > "$OUT/manifest.stdout.json" { printf '%s\n' \ "schema_version=1" \ "source_commit=$SOURCE_COMMIT" \ "design=processing-cleavage-boundary-radius" \ "base_run=$BASE_RUN" \ "architecture=$ARCHITECTURE" \ "random_seed=$RANDOM_SEED" \ "gpus=$GPUS" \ "num_jobs=$NUM_JOBS" \ "dataloader_num_workers=$DATALOADER_NUM_WORKERS" \ "parallel_conditions=$PARALLEL_CONDITIONS" \ "affinity_control=$AFFINITY_CONTROL" printf '%s %s\n' "$(sha256_path "$TRAIN_DATA")" "$TRAIN_DATA" printf '%s %s\n' "$(sha256_path "$BASE_RUN/manifest.json")" \ "$BASE_RUN/manifest.json" printf '%s %s\n' "$(sha256_path "$OUT/manifest.json")" \ "$OUT/manifest.json" } > "$OUT/provenance.txt" COMMON_ARGS=( --num-jobs "$NUM_JOBS" --gpus "$GPUS" --max-workers-per-gpu 1 --max-tasks-per-worker 12 --torch-compile 0 --matmul-precision highest ) TRAINING_ARGS=( "${COMMON_ARGS[@]}" --dataloader-num-workers "$DATALOADER_NUM_WORKERS" ) # shellcheck disable=SC1091 source "$SCRIPT_DIR/gpu_telemetry.sh" GPU_TELEMETRY_PID="" trap stop_gpu_telemetry EXIT start_gpu_telemetry "$OUT/gpu_occupancy.csv" train_condition() { local condition="$1" local condition_out="$OUT/$condition" local processing_out="$condition_out/processing" local unselected="$processing_out/models.unselected.short_flanks" local hyperparameters="$OUT/conditions/$condition.yaml" mkdir -p "$processing_out" mhcflurry-class1-train-processing-models \ --data "$TRAIN_DATA" \ --held-out-samples 10 \ --num-folds 4 \ --random-seed "$RANDOM_SEED" \ --hyperparameters "$hyperparameters" \ --out-models-dir "$unselected" \ --worker-log-dir "$processing_out" \ "${TRAINING_ARGS[@]}" } CONDITIONS=( "${ARCHITECTURE}__intermediate_5x3" "${ARCHITECTURE}__intermediate_5x4" ) if [ "$PARALLEL_CONDITIONS" -eq 2 ]; then train_condition "${CONDITIONS[0]}" > "$OUT/${CONDITIONS[0]}.runner.log" 2>&1 & first_pid=$! train_condition "${CONDITIONS[1]}" > "$OUT/${CONDITIONS[1]}.runner.log" 2>&1 & second_pid=$! first_status=0 second_status=0 wait "$first_pid" || first_status=$? wait "$second_pid" || second_status=$? if [ "$first_status" -ne 0 ] || [ "$second_status" -ne 0 ]; then printf 'Concurrent training failed: %s=%d %s=%d\n' \ "${CONDITIONS[0]}" "$first_status" \ "${CONDITIONS[1]}" "$second_status" >&2 exit 1 fi else for condition in "${CONDITIONS[@]}"; do train_condition "$condition" 2>&1 | tee "$OUT/$condition.runner.log" done fi for condition in "${CONDITIONS[@]}"; do condition_out="$OUT/$condition" processing_out="$condition_out/processing" unselected="$processing_out/models.unselected.short_flanks" selected="$processing_out/models.selected.short_flanks" mhcflurry-class1-select-processing-models \ --data "$unselected/train_data.csv.bz2" \ --models-dir "$unselected" \ --out-models-dir "$selected" \ --min-models-per-fold 1 \ --max-models-per-fold 1 \ --save-validation-predictions \ "${TRAINING_ARGS[@]}" cp "$unselected/train_data.csv.bz2" "$selected/train_data.csv.bz2" printf '%s\n' "$condition_out" > "$condition_out/predictor_path.txt" mhcflurry train plot-loss-curves \ --selected-dir "$selected" \ --unselected-dir "$unselected" \ --out "$condition_out/loss_plots" done stop_gpu_telemetry GPU_TELEMETRY_PID="" mkdir -p "$OUT/comparisons" # One paired invocation loads the frozen 2.05-million-row cohort once and # scores each new condition once. Comparisons to all prior anchors are derived # from these saved row-identical columns by the combined affinity control. radius_comparison="$OUT/comparisons/${CONDITIONS[0]}-vs-${CONDITIONS[1]}" mhcflurry eval compare-models \ --a "$OUT/${CONDITIONS[0]}" \ --a-label "${CONDITIONS[0]}" \ --b "$OUT/${CONDITIONS[1]}" \ --b-label "${CONDITIONS[1]}" \ --data-dir "$DATA_EVAL_DIR" \ --release-holdout-dir "$RELEASE_HOLDOUT_DIR" \ --include processing \ --processing-modes short_flanks \ --out "$radius_comparison" \ "${COMMON_ARGS[@]}" mhcflurry eval plot-comparison \ --input "$radius_comparison" \ --components processing \ --summary-pdf "$radius_comparison/plots/model_comparison_figures.pdf" prediction_suffix="processing/predictions_short_flanks.csv.bz2" if [ "$AFFINITY_CONTROL" = all ]; then small_anchor="$BASE_RUN/comparisons/small_tanh__legacy_5aa-vs-public/$prediction_suffix" large_anchor="$BASE_RUN/comparisons/large_relu__legacy_5aa-vs-small_tanh__legacy_5aa/$prediction_suffix" affinity_args=( --score "public_2_1_selected=$small_anchor:b_processing_score" --score "small_tanh__legacy_5aa=$small_anchor:a_processing_score" --score "large_relu__legacy_5aa=$large_anchor:a_processing_score" ) for architecture in small_tanh large_relu; do anchor="${architecture}__legacy_5aa" for window in legacy_no_flank compact_5x2 extended_5x5; do condition="${architecture}__${window}" path="$BASE_RUN/comparisons/$condition-vs-$anchor/$prediction_suffix" affinity_args+=(--score "$condition=$path:a_processing_score") done done path="$radius_comparison/$prediction_suffix" affinity_args+=(--score "${CONDITIONS[0]}=$path:a_processing_score") affinity_args+=(--score "${CONDITIONS[1]}=$path:b_processing_score") mhcflurry eval processing-affinity-control \ "${affinity_args[@]}" \ --baseline public_2_1_selected \ --data-dir "$DATA_EVAL_DIR" \ --decoys-per-hit 10 \ --same-protein-caliper 0.25 \ --out "$OUT/affinity_controlled" fi date -u +%Y-%m-%dT%H:%M:%SZ > "$OUT/completed_at_utc.txt" mhcflurry-2.3.6/scripts/training/run_processing_cleavage_boundary_radius_remote.sh000077500000000000000000000035041525677230600311310ustar00rootroot00000000000000#!/usr/bin/env bash # Run the focused peptide-side cleavage-radius follow-up on a shared volume. set -euo pipefail : "${MHCFLURRY_OUT:?MHCFLURRY_OUT must be set}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" : "${REPO:=$(cd "$SCRIPT_DIR/../.." && pwd)}" export PYTHONUNBUFFERED=1 export MHCFLURRY_TORCH_COMPILE=0 export MHCFLURRY_TORCH_COMPILE_LOSS=0 export MHCFLURRY_MATMUL_PRECISION=highest BASE_RUN="${BOUNDARY_RADIUS_BASE_RUN:-$MHCFLURRY_OUT/processing-cleavage-boundaries}" FOLLOWUP_OUT="${BOUNDARY_RADIUS_OUT:-$MHCFLURRY_OUT/processing-cleavage-boundary-radius}" TRAIN_DATA="${BOUNDARY_RADIUS_TRAIN_DATA:-$MHCFLURRY_OUT/processing.shared/train_data.csv.bz2}" HOLDOUT_DIR="${BOUNDARY_RADIUS_HOLDOUT_DIR:-$MHCFLURRY_OUT/release_holdout}" ARCHITECTURE="${BOUNDARY_RADIUS_ARCHITECTURE:-large_relu}" PARALLEL_CONDITIONS="${BOUNDARY_RADIUS_PARALLEL_CONDITIONS:-1}" AFFINITY_CONTROL="${BOUNDARY_RADIUS_AFFINITY_CONTROL:-none}" mhcflurry-downloads fetch data_evaluation if command -v nvidia-smi >/dev/null 2>&1; then GPUS="$(nvidia-smi -L 2>/dev/null | wc -l | tr -d ' ')" else GPUS=0 fi SOURCE_COMMIT="${MHCFLURRY_RELEASE_GIT_COMMIT:-}" if [ -z "$SOURCE_COMMIT" ]; then SOURCE_COMMIT="$(git -C "$REPO" rev-parse HEAD)" fi bash "$SCRIPT_DIR/run_processing_cleavage_boundary_radius.sh" \ --out "$FOLLOWUP_OUT" \ --base-run "$BASE_RUN" \ --architecture "$ARCHITECTURE" \ --train-data "$TRAIN_DATA" \ --data-eval-dir "$(mhcflurry-downloads path data_evaluation)" \ --release-holdout-dir "$HOLDOUT_DIR" \ --source-commit "$SOURCE_COMMIT" \ --random-seed "${RELEASE_RANDOM_SEED:-42}" \ --gpus "$GPUS" \ --num-jobs "${NUM_JOBS:-auto}" \ --dataloader-num-workers "${DATALOADER_NUM_WORKERS:-auto}" \ --parallel-conditions "$PARALLEL_CONDITIONS" \ --affinity-control "$AFFINITY_CONTROL" mhcflurry-2.3.6/scripts/training/run_processing_kernel_sweep.py000066400000000000000000000725611525677230600252440ustar00rootroot00000000000000#!/usr/bin/env python3 """Train paired width or training-recipe sweeps on frozen matched processing data.""" import argparse import json import os from pathlib import Path import shutil import sys import numpy import pandas import yaml from generate_processing_cleavage_boundaries import build_kernel_conditions from run_exact_public_processing import Driver, cached_scores, utc_now, write_json from mhcflurry.cli.compare_models import _metrics from mhcflurry.experiment_archive import sha256_file from mhcflurry.processing_matching import validate_matched_training_data from mhcflurry.release_holdout import load_excluded_samples def import_completed_conditions(previous, out, config): """Copy verified completed conditions and frozen folds into a new run. Failed/partial conditions are left untouched in the source run and are not imported. Retention-only changes may be added for new fits; missing old terminal states are recorded, never synthesized from best weights. """ from mhcflurry import Class1ProcessingPredictor previous, out = Path(previous).resolve(), Path(out).resolve() if previous == out or previous in out.parents or out in previous.parents: raise ValueError("Recovery source and destination must be separate directories") prior_manifest = previous / "experiment.json" prior = json.loads(prior_manifest.read_text()) for key in ("random_seed", "train_data_sha256", "holdout_sha256"): if prior[key] != config[key]: raise ValueError("Recovery input mismatch: " + key) expected_records = {r["condition"]: r for r in config["records"]} for record in prior["records"]: expected = expected_records.get(record["condition"]) if expected is None: raise ValueError("Recovery contains an unknown condition") for actual_hp, expected_hp in zip(record["hyperparameters"], expected["hyperparameters"]): left, right = dict(actual_hp), dict(expected_hp) left.pop("save_all_checkpoints", None) right.pop("save_all_checkpoints", None) if left != right: raise ValueError("Recovery hyperparameters differ: " + record["condition"]) if len(record["hyperparameters"]) != len(expected["hyperparameters"]): raise ValueError("Recovery architecture count differs") source_folds = previous / "inputs/training_with_folds.csv.bz2" destination_folds = out / "inputs/training_with_folds.csv.bz2" if not source_folds.exists(): raise ValueError("Recovery source has no frozen folds") if destination_folds.exists(): if sha256_file(destination_folds) != sha256_file(source_folds): raise ValueError("Recovery frozen folds changed") else: shutil.copy2(source_folds, destination_folds) imported = [] files = {} for record in prior["records"]: name = record["condition"] source = previous / name selected = source / "processing/models.selected.short_flanks" predictions = selected / "model_selection_predictions.csv.bz2" if not predictions.exists() or not (source / "validation_metrics.csv").exists(): continue predictor = Class1ProcessingPredictor.load(str(selected)) folds = [m.fit_info[-1]["training_info"]["fold_num"] for m in predictor.models] if sorted(folds) != list(range(record["fold_count"])): raise ValueError("Recovery is not one completed model per fold: " + name) source_data = source / "processing/models.unselected.short_flanks/train_data.csv.bz2" if sha256_file(source_data) != sha256_file(source_folds): raise ValueError("Recovery condition has different frozen folds: " + name) validation_metrics(predictions, name) destination = out / name inventory = {str(p.relative_to(previous)): sha256_file(p) for p in source.rglob("*") if p.is_file()} if destination.exists(): for relative, digest in inventory.items(): copied = out / relative if not copied.exists() or sha256_file(copied) != digest: raise ValueError("Recovered artifact changed: " + relative) else: temporary = out / (name + ".importing") if temporary.exists(): raise ValueError("Incomplete recovery copy requires inspection: " + str(temporary)) shutil.copytree(source, temporary) temporary.rename(destination) files.update(inventory) imported.append(name) write_json(out / "recovery.json", { "source": str(previous), "source_manifest_sha256": sha256_file(prior_manifest), "source_commit": prior["source_commit"], "completed_conditions": imported, "frozen_folds_sha256": sha256_file(source_folds), "copied_files_sha256": files, "checkpoint_note": "Imported legacy fits may lack terminal states; only new fits retain both."}) return set(imported) def validation_metrics(path, condition): """Sample-balanced held-out metrics; repeated sample folds remain explicit.""" frame = pandas.read_csv(path, dtype={"sample_id": str}) if frame.empty or not numpy.isfinite(frame.processing_score).all(): raise ValueError("Incomplete validation predictions: " + str(path)) records = [] for (fold, sample), group in frame.groupby(["fold_num", "sample_id"]): records.append({"condition": condition, "fold_num": fold, "sample_id": sample, **_metrics(group.hit, group.processing_score)}) return pandas.DataFrame(records) def save_checkpoint_validation_predictions(model_dir, destination, condition): """Save context-joinable, genuinely held-out predictions for every state.""" from mhcflurry import Class1ProcessingPredictor from mhcflurry.training_folds import read_processing_training_data from compose_processing_ensemble import fingerprint_directory model_dir, destination = Path(model_dir), Path(destination) marker = destination.with_name(destination.name + ".json") identity = {"condition": condition, "predictor": fingerprint_directory(model_dir), "training_data_sha256": sha256_file(model_dir / "train_data.csv.bz2"), "scope": "per-member held-out fold, retained best and terminal states"} configs = pandas.read_csv(model_dir / "manifest.csv", usecols=["config_json"]).config_json.map(json.loads) if any(config.get("hyperparameters", {}).get("monitor_validation_ranking") or config.get("hyperparameters", {}).get("checkpoint_metric") == "val_macro_ap" for config in configs): identity["scope"] = "per-member held-out fold, retained best-loss, best-AP and terminal states" if marker.exists(): saved = json.loads(marker.read_text()) if (saved["identity"] != identity or not destination.exists() or saved["prediction_sha256"] != sha256_file(destination)): raise ValueError("Changed checkpoint prediction cache: " + str(destination)) return predictor = Class1ProcessingPredictor.load(str(model_dir)) data = read_processing_training_data(model_dir / "train_data.csv.bz2") result = [] for row in predictor.manifest_df.itertuples(): model = row.model info = model.fit_info[-1] fold = info["training_info"]["fold_num"] membership = data["fold_%d" % fold].astype(str).str.lower().map( {"true": True, "false": False, "1": True, "0": False}) if membership.isna().any(): raise ValueError("Invalid validation fold membership") held_out = data.loc[~membership].copy() if held_out.empty: raise ValueError("Empty validation fold") held_out = held_out.drop(columns=[c for c in held_out if c.startswith("fold_")]) held_out.insert(0, "validation_row_index", held_out.index) original = model.get_weights() policies = dict(getattr(model, "checkpoint_weights", {})) primary = info.get("restored_checkpoint_policy", "best" if info.get("restored_best_weights") else "terminal") policies.setdefault(primary, original) try: for policy, weights in sorted(policies.items()): model.network().set_weights_list(weights, auto_convert_keras=False) frame = held_out.copy() frame["processing_score"] = model.predict( frame.peptide.tolist(), frame.n_flank.fillna("").tolist(), frame.c_flank.fillna("").tolist()) if not numpy.isfinite(frame.processing_score).all(): raise ValueError("Non-finite checkpoint validation predictions") frame["condition"] = condition frame["model_name"] = row.model_name frame["fold_num"] = fold frame["checkpoint_policy"] = policy result.append(frame) finally: model.network().set_weights_list(original, auto_convert_keras=False) compression = ({"method": "gzip", "compresslevel": 1, "mtime": 0} if destination.suffix == ".gz" else "bz2") temporary = destination.with_name(destination.name + ".tmp") pandas.concat(result, ignore_index=True).to_csv(temporary, index=False, compression=compression) temporary.replace(destination) write_json(marker, {"identity": identity, "prediction_sha256": sha256_file(destination)}) def prepare_evaluation(args): """Freeze the release cohort once, using the standard strict matching policy.""" from mhcflurry.cli.compare_models import _load_presentation_benchmark_for_component from mhcflurry.cli.processing_affinity_control import _attach_affinity from mhcflurry.processing_matching import make_affinity_controlled_risk_sets directory = args.out / "evaluation" directory.mkdir(exist_ok=True) path = directory / "matching_assignments.csv.bz2" marker = directory / "cohort.json" if marker.exists(): info = json.loads(marker.read_text()) if info["assignments_sha256"] != sha256_file(path): raise ValueError("Changed saved evaluation risk sets") return pandas.read_csv(path, dtype={"sample_id": str}) options = argparse.Namespace(release_holdout_dir=str(args.release_holdout_dir), limit_files=None) cohort = _load_presentation_benchmark_for_component( str(args.public_root / "data_evaluation"), options, "processing") cohort, sources = _attach_affinity(cohort, str(args.public_root / "data_evaluation")) cohort.to_csv(directory / "candidate_pool.csv.bz2", index=False) matched, diagnostics = make_affinity_controlled_risk_sets(cohort) matched.to_csv(path, index=False) write_json(marker, {"diagnostics": diagnostics, "affinity_sources": sources, "assignments_sha256": sha256_file(path), "candidate_pool_sha256": sha256_file(directory / "candidate_pool.csv.bz2"), "role": "exploratory release holdout; not an untouched final test"}) return matched def evaluate_predictor(out, name, model_dir, matched): """Cache each member's predictions as well as the unmixed ensemble mean.""" from mhcflurry import Class1ProcessingPredictor from mhcflurry.cli.processing_affinity_control import score_risk_sets directory = out / "evaluation" unique = matched.drop_duplicates("source_row").sort_values("source_row") input_hash = sha256_file(directory / "matching_assignments.csv.bz2") predictor = Class1ProcessingPredictor.load(str(model_dir)) scores = unique[["source_row", "sample_id", "peptide", "hit", "n_flank", "c_flank"]].copy() columns = [] for index, model in enumerate(predictor.models): column = "member_%02d" % index scores[column] = cached_scores(directory, name + "__" + column, unique, input_hash, model_dir, lambda model=model: model.predict( unique.peptide.tolist(), unique.n_flank.fillna("").tolist(), unique.c_flank.fillna("").tolist(), batch_size=4096), ordering="unique matched evaluation source_row ascending") columns.append(column) # Match the public predictor's ordered float32 summation, including ties. ensemble = numpy.zeros(len(scores), dtype="float32") for column in columns: ensemble += scores[column].to_numpy(dtype="float32") scores[name] = ensemble / numpy.float32(len(columns)) scores.to_csv(directory / (name + ".predictions.csv.bz2"), index=False) scored = matched.copy() scored[name] = scored.source_row.map(scores.set_index("source_row")[name]) metrics = score_risk_sets(scored, [name]) metrics.to_csv(directory / (name + ".metrics.csv"), index=False) return metrics def render_summary(out, records): """Refresh plot-ready paired validation and release-evaluation summaries.""" import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt axes = pandas.DataFrame([dict(condition=name, **axes) for name, _, axes in records]) tables = [] for name, _, _ in records: path = out / name / "validation_metrics.csv" if path.exists(): tables.append(pandas.read_csv(path, dtype={"sample_id": str})) if not tables: return per_sample = pandas.concat(tables, ignore_index=True) per_sample.to_csv(out / "validation_per_sample.csv", index=False) # Average folds within each sample before giving each sample equal weight. metrics = ["roc_auc", "pr_auc", "ppv_at_n"] summary = per_sample.groupby(["condition", "sample_id"])[metrics].mean().groupby("condition").mean() summary = summary.add_prefix("macro_").reset_index().merge(axes, on="condition") summary.to_csv(out / "validation_summary.csv", index=False) confirmation = any(axes.get("checkpoint_policy") == "best_ap" for _, _, axes in records) if confirmation: fig, panels = plt.subplots(1, 3, figsize=(12, 3.6), constrained_layout=True) for panel, metric, label in zip(panels, metrics, ["AUROC", "AUPRC", "PPV@N"]): for optimizer, group in summary.groupby("optimizer"): group = group.sort_values("kernel_width") panel.plot(group.kernel_width, group["macro_" + metric], "o-", label=optimizer) panel.set(xlabel="Kernel width", ylabel="Macro " + label, xticks=[11, 13, 15]) panel.grid(alpha=0.2) panels[0].legend() fig.suptitle("Processing / 1:1 matched development / four folds / inner-best AP checkpoints") fig.savefig(out / "validation_ranking_confirmation.png", dpi=200) fig.savefig(out / "validation_ranking_confirmation.pdf") plt.close(fig) return if "initialization" in summary: families = sorted(summary.family.unique()) fig, panels = plt.subplots(len(families), 3, figsize=(13, 4 * len(families)), squeeze=False, constrained_layout=True) order = ["none", "orthogonal", "lsuv_pre", "lsuv_post"] for row, family in enumerate(families): group = summary.loc[summary.family == family].copy() group["optimizer_batch"] = group.optimizer + " / " + group.batch_size.astype(str) for col, (metric, label) in enumerate(zip(metrics, ["AUROC", "AUPRC", "PPV@N"])): values = group.pivot(index="initialization", columns="optimizer_batch", values="macro_" + metric).reindex(order) panel = panels[row, col] plotted = panel.imshow(values.to_numpy(), aspect="auto", cmap="viridis") panel.set(xticks=range(len(values.columns)), xticklabels=values.columns, yticks=range(len(order)), yticklabels=order, title=family + " / " + label) panel.tick_params(axis="x", rotation=45) for i in range(len(order)): for j in range(len(values.columns)): value = values.iloc[i, j] if numpy.isfinite(value): panel.text(j, i, "%.4f" % value, ha="center", va="center", color="white") fig.colorbar(plotted, ax=panel) fig.suptitle("Processing recipe screen: sample-balanced, two paired folds, one matched decoy per hit") fig.savefig(out / "validation_training_recipe.png", dpi=200) fig.savefig(out / "validation_training_recipe.pdf") plt.close(fig) return fig, panels = plt.subplots(1, 3, figsize=(12, 3.6), constrained_layout=True) for panel, metric, label in zip(panels, metrics, ["AUROC", "AUPRC", "PPV@N"]): for family, group in summary.groupby("family"): group = group.sort_values("kernel_width") panel.plot(group.kernel_width, group["macro_" + metric], "o-", label=family) panel.set(xlabel="Kernel width (residues)", ylabel="Macro " + label, xticks=[5, 7, 9, 11, 13, 15]) panel.grid(alpha=0.2) panels[0].legend(fontsize=8) fig.suptitle("Matched processing validation — sample-balanced, four paired folds") fig.savefig(out / "validation_kernel_width.png", dpi=200) fig.savefig(out / "validation_kernel_width.pdf") plt.close(fig) evaluation = list((out / "evaluation").glob("*.metrics.csv")) if evaluation: from mhcflurry.cli.processing_affinity_control import summarize_metrics combined = pandas.concat([pandas.read_csv(path) for path in evaluation]) combined.to_csv(out / "evaluation/metrics.csv", index=False) summary, deltas = summarize_metrics(combined, "public_2_1_x") summary.to_csv(out / "evaluation/summary.csv", index=False) deltas.to_csv(out / "evaluation/comparisons.csv", index=False) plotted = summary.merge(axes, left_on="score", right_on="condition") public = summary.set_index("score").loc["public_2_1_x"] fig, panels = plt.subplots(1, 3, figsize=(12, 3.6), constrained_layout=True) for panel, metric, label in zip(panels, metrics, ["AUROC", "AUPRC", "PPV@N"]): for family, group in plotted.groupby("family"): group = group.sort_values("kernel_width") panel.plot(group.kernel_width, group["macro_" + metric], "o-", label=family + " (4)") panel.axhline(public["macro_" + metric], color="black", linestyle="--", label="public (8)") panel.set(xlabel="Kernel width (residues)", ylabel="Macro " + label, xticks=[5, 7, 9, 11, 13, 15]) panel.grid(alpha=0.2) panels[0].legend(fontsize=8) fig.suptitle("Exploratory release holdout - 10 affinity/length-matched decoys per hit") fig.savefig(out / "evaluation/kernel_width.png", dpi=200) fig.savefig(out / "evaluation/kernel_width.pdf") plt.close(fig) def main(argv=None): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--out", type=Path, required=True) parser.add_argument("--train-data", type=Path, required=True) parser.add_argument("--public-root", type=Path, required=True) parser.add_argument("--release-holdout-dir", type=Path, required=True) parser.add_argument("--source-commit", required=True) parser.add_argument("--design", choices=("kernel-width", "training-recipe", "ranking-confirmation"), default="kernel-width") parser.add_argument("--folds-from", type=Path, help="Frozen fold table; use the number of folds declared by the selected design.") parser.add_argument("--random-seed", type=int, default=42) parser.add_argument("--gpus", type=int, default=1) parser.add_argument("--num-jobs", type=int, default=1) parser.add_argument("--prepare-only", action="store_true") parser.add_argument("--evaluation", choices=("all", "none"), default="all") parser.add_argument("--resume-from", type=Path, help="Read-only prior width run; import completed conditions and frozen folds.") parser.add_argument("--save-all-checkpoints", action="store_true", help="Retain terminal and best weights for newly trained models.") args = parser.parse_args(argv) for key in ("out", "train_data", "public_root", "release_holdout_dir"): setattr(args, key, getattr(args, key).resolve()) args.out.mkdir(parents=True, exist_ok=True) from mhcflurry.training_folds import read_processing_training_data frame = read_processing_training_data(args.train_data) validate_matched_training_data(frame) excluded = set(load_excluded_samples(str(args.release_holdout_dir / "processing_samples.csv"))) if excluded.intersection(frame.sample_id): raise ValueError("Processing training overlaps release holdout samples") if args.design == "training-recipe": from generate_processing_recipe import build_processing_recipe_conditions records = build_processing_recipe_conditions() elif args.design == "ranking-confirmation": from generate_processing_recipe import build_processing_confirmation_conditions records = build_processing_confirmation_conditions() if not args.folds_from or args.evaluation != "none": raise ValueError("Ranking confirmation requires --folds-from and --evaluation none") else: records = build_kernel_conditions() fold_count = records[0][2]["fold_count"] if args.save_all_checkpoints: for _, grid, _ in records: for hp in grid: hp["save_all_checkpoints"] = True design_names = {"kernel-width": "processing-kernel-sweep-v1", "training-recipe": "processing-training-recipe-v1", "ranking-confirmation": "processing-ranking-confirmation-v1"} config = {"design": design_names[args.design], "networks": sum(axes["network_count"] for _, _, axes in records), "random_seed": args.random_seed, "source_commit": args.source_commit, "train_data_sha256": sha256_file(args.train_data), "training_validation": {"policy": "matched", "rows": len(frame), "samples": int(frame.sample_id.nunique())}, "public_root": str(args.public_root), "evaluation": args.evaluation, "holdout_sha256": {p.name: sha256_file(p) for p in args.release_holdout_dir.glob("*") if p.is_file()}, "records": [dict(condition=name, hyperparameters=grid, **axes) for name, grid, axes in records]} if args.resume_from: if args.design != "kernel-width": raise ValueError("--resume-from currently supports the width design only") config["resume_from"] = str(args.resume_from.resolve()) if args.folds_from: config["folds_from_sha256"] = sha256_file(args.folds_from) manifest = args.out / "experiment.json" if manifest.exists() and json.loads(manifest.read_text()) != config: raise ValueError("Refusing to change inputs/design in an existing experiment") write_json(manifest, config) inputs = args.out / "inputs" inputs.mkdir(exist_ok=True) if args.folds_from: original = read_processing_training_data(args.folds_from) selected_columns = ["fold_%d" % i for i in range(fold_count)] if not set(selected_columns) <= set(original): raise ValueError("Missing requested frozen folds") compared = original.drop(columns=[c for c in original if c.startswith("fold_")]) # Use the frozen table itself as --train-data when inheriting old folds. # Do not forgive floating-point drift or check only neural input columns. expected = frame.drop(columns=[c for c in frame if c.startswith("fold_")]) pandas.testing.assert_frame_equal( compared, expected, check_exact=True) table = original.drop(columns=[c for c in original if c.startswith("fold_") and c not in selected_columns]) validate_matched_training_data(table) path = inputs / "training_with_folds.csv.bz2" if path.exists(): pandas.testing.assert_frame_equal(read_processing_training_data(path), table, check_exact=True) else: table.to_csv(path, index=False) for name, grid, _ in records: (inputs / (name + ".yaml")).write_text(yaml.safe_dump(grid, sort_keys=True)) if args.prepare_only: return 0 imported = import_completed_conditions(args.resume_from, args.out, config) if args.resume_from else set() os.environ.update(MHCFLURRY_TORCH_COMPILE="0", MHCFLURRY_TORCH_COMPILE_LOSS="0", MHCFLURRY_MATMUL_PRECISION="highest") driver = Driver(args.out) parallel = ["--gpus", args.gpus, "--num-jobs", args.num_jobs, "--max-workers-per-gpu", 1, "--torch-compile", 0, "--matmul-precision", "highest", "--dataloader-num-workers", 1] matched = None if args.evaluation == "all": from mhcflurry.common import configure_pytorch configure_pytorch(backend="gpu" if args.gpus else "cpu", num_threads=1) matched = prepare_evaluation(args) evaluate_predictor(args.out, "public_2_1_x", args.public_root / "models_class1_processing/models.selected.short_flanks", matched) folded = inputs / "training_with_folds.csv.bz2" for name, _, _ in records: processing = args.out / name / "processing" processing.mkdir(parents=True, exist_ok=True) unselected = processing / "models.unselected.short_flanks" selected = processing / "models.selected.short_flanks" if name not in imported and not (unselected / "training_init_info.pkl").exists(): data_args = ["--data", folded, "--reuse-folds"] if folded.exists() else [ "--data", args.train_data, "--held-out-samples", 10] driver.run(name + "-initialize", ["mhcflurry", "class1-train-processing-models", *data_args, "--num-folds", fold_count, "--random-seed", args.random_seed, "--hyperparameters", inputs / (name + ".yaml"), "--out-models-dir", unselected, "--only-initialize", *parallel]) generated = unselected / "train_data.csv.bz2" if not folded.exists(): shutil.copy2(generated, folded) else: expected = pandas.read_csv(folded, dtype=str, keep_default_na=False) observed = pandas.read_csv(generated, dtype=str, keep_default_na=False) pandas.testing.assert_frame_equal(expected, observed) if name not in imported: driver.run(name + "-train", ["mhcflurry", "class1-train-processing-models", "--out-models-dir", unselected, "--continue-incomplete", *parallel]) driver.run(name + "-select", ["mhcflurry", "class1-select-processing-models", "--data", generated, "--models-dir", unselected, "--out-models-dir", selected, "--min-models-per-fold", 1, "--max-models-per-fold", 1, "--save-validation-predictions", *parallel]) if name not in imported: validation_metrics(selected / "model_selection_predictions.csv.bz2", name).to_csv( args.out / name / "validation_metrics.csv", index=False) validation_predictions = pandas.read_csv(selected / "model_selection_predictions.csv.bz2") pandas.DataFrame([dict(fold_num=fold, **_metrics(group.hit, group.processing_score)) for fold, group in validation_predictions.groupby("fold_num")]).to_csv( args.out / name / "validation_micro_by_fold.csv", index=False) driver.run(name + "-loss-plots", ["mhcflurry", "train", "plot-loss-curves", "--selected-dir", selected, "--unselected-dir", unselected, "--out", args.out / name / "loss_plots"]) checkpoint_predictions = args.out / "checkpoint_predictions" checkpoint_predictions.mkdir(exist_ok=True) suffix = ".csv.gz" if args.design == "ranking-confirmation" else ".csv.bz2" prediction_path = checkpoint_predictions / (name + ".validation_predictions" + suffix) save_checkpoint_validation_predictions(unselected, prediction_path, name) if args.design == "ranking-confirmation": checkpoint_frame = pandas.read_csv(prediction_path, dtype={"sample_id": str}, float_precision="round_trip") checkpoint_metrics = [] checkpoint_micro = [] for (policy, fold, sample), group in checkpoint_frame.groupby(["checkpoint_policy", "fold_num", "sample_id"]): checkpoint_metrics.append(dict(condition=name, checkpoint_policy=policy, fold_num=fold, sample_id=sample, **_metrics(group.hit, group.processing_score))) for (policy, fold), group in checkpoint_frame.groupby(["checkpoint_policy", "fold_num"]): checkpoint_micro.append(dict(condition=name, checkpoint_policy=policy, fold_num=fold, **_metrics(group.hit, group.processing_score))) pandas.DataFrame(checkpoint_metrics).to_csv(args.out / name / "checkpoint_per_sample.csv", index=False) pandas.DataFrame(checkpoint_micro).to_csv(args.out / name / "checkpoint_micro_by_fold.csv", index=False) from mhcflurry.experiment_archive import export_training_tables export_training_tables(unselected, args.out / name / "training_tables") if matched is not None: evaluate_predictor(args.out, name, selected, matched) render_summary(args.out, records) write_json(args.out / "progress.json", {"last_completed_condition": name, "at": utc_now()}) write_json(args.out / "completed.json", {"at": utc_now(), "release_accepted": False}) return 0 if __name__ == "__main__": sys.exit(main()) mhcflurry-2.3.6/scripts/training/run_processing_regularization_activation.sh000077500000000000000000000231201525677230600300110ustar00rootroot00000000000000#!/usr/bin/env bash # Train the matched 5-aa processing regularization/activation screen. set -euo pipefail usage() { cat <<'EOF' Usage: run_processing_regularization_activation.sh [OPTIONS] Required: --out PATH Experiment output directory --train-data PATH Frozen processing training table --data-eval-dir PATH Evaluation data directory --release-holdout-dir PATH Frozen release-holdout manifests --source-commit COMMIT Exact source commit being evaluated Experiment controls: --random-seed INTEGER Shared folds/fits seed (default: 42) --evaluation MODE none, baselines, or all (default: all) Experiment archiving: --experiments-dir PATH Write a timestamped snapshot after success --experiment-name NAME Snapshot label --source-archive PATH Preserve exact source archive in snapshot Execution controls: --gpus INTEGER|auto GPU count (default: auto) --num-jobs INTEGER|auto Concurrent jobs (default: auto) --max-workers-per-gpu INTEGER|auto Worker density (default: auto) --dataloader-num-workers N|auto Workers per dataloader (default: 1) --max-tasks-per-worker INTEGER Worker recycling interval (default: 12) -h, --help Show this help EOF } require_value() { if [ "$#" -lt 2 ] || [ -z "$2" ]; then printf 'Missing value for %s\n' "$1" >&2 usage >&2 exit 2 fi } OUT="" TRAIN_DATA="" DATA_EVAL_DIR="" RELEASE_HOLDOUT_DIR="" SOURCE_COMMIT="" RANDOM_SEED=42 EVALUATION=all EXPERIMENTS_DIR="" EXPERIMENT_NAME="processing-5aa-regularization-activation" SOURCE_ARCHIVE="" GPUS=auto NUM_JOBS=auto MAX_WORKERS_PER_GPU=auto DATALOADER_NUM_WORKERS=1 MAX_TASKS_PER_WORKER=12 ORIGINAL_ARGS=("$@") while [ "$#" -gt 0 ]; do case "$1" in --out) require_value "$@"; OUT="$2"; shift 2 ;; --train-data) require_value "$@"; TRAIN_DATA="$2"; shift 2 ;; --data-eval-dir) require_value "$@"; DATA_EVAL_DIR="$2"; shift 2 ;; --release-holdout-dir) require_value "$@"; RELEASE_HOLDOUT_DIR="$2"; shift 2 ;; --source-commit) require_value "$@"; SOURCE_COMMIT="$2"; shift 2 ;; --random-seed) require_value "$@"; RANDOM_SEED="$2"; shift 2 ;; --evaluation) require_value "$@"; EVALUATION="$2"; shift 2 ;; --experiments-dir) require_value "$@"; EXPERIMENTS_DIR="$2"; shift 2 ;; --experiment-name) require_value "$@"; EXPERIMENT_NAME="$2"; shift 2 ;; --source-archive) require_value "$@"; SOURCE_ARCHIVE="$2"; shift 2 ;; --gpus) require_value "$@"; GPUS="$2"; shift 2 ;; --num-jobs) require_value "$@"; NUM_JOBS="$2"; shift 2 ;; --max-workers-per-gpu) require_value "$@"; MAX_WORKERS_PER_GPU="$2"; shift 2 ;; --dataloader-num-workers) require_value "$@"; DATALOADER_NUM_WORKERS="$2"; shift 2 ;; --max-tasks-per-worker) require_value "$@"; MAX_TASKS_PER_WORKER="$2"; shift 2 ;; -h|--help) usage; exit 0 ;; *) printf 'Unknown argument: %s\n' "$1" >&2; usage >&2; exit 2 ;; esac done for required in OUT TRAIN_DATA DATA_EVAL_DIR RELEASE_HOLDOUT_DIR SOURCE_COMMIT; do if [ -z "${!required}" ]; then printf 'Missing required argument for %s\n' "$required" >&2 usage >&2 exit 2 fi done case "$EVALUATION" in none|baselines|all) ;; *) printf 'Invalid --evaluation: %s\n' "$EVALUATION" >&2; exit 2 ;; esac if [ ! -f "$TRAIN_DATA" ]; then printf 'Training data is not a file: %s\n' "$TRAIN_DATA" >&2 exit 2 fi if [ ! -d "$DATA_EVAL_DIR" ]; then printf 'Evaluation data is not a directory: %s\n' "$DATA_EVAL_DIR" >&2 exit 2 fi for holdout_file in policy.json processing_samples.csv; do if [ ! -f "$RELEASE_HOLDOUT_DIR/$holdout_file" ]; then printf 'Missing release holdout file: %s\n' "$holdout_file" >&2 exit 2 fi done if [ -n "$SOURCE_ARCHIVE" ] && [ ! -f "$SOURCE_ARCHIVE" ]; then printf 'Source archive is not a file: %s\n' "$SOURCE_ARCHIVE" >&2 exit 2 fi mhcflurry train validate-processing-data --data "$TRAIN_DATA" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [ "$GPUS" = auto ]; then if command -v nvidia-smi >/dev/null 2>&1; then GPUS="$(nvidia-smi -L 2>/dev/null | wc -l | tr -d ' ')" else GPUS=0 fi fi mkdir -p "$OUT" date -u +%Y-%m-%dT%H:%M:%SZ > "$OUT/started_at_utc.txt" { printf 'bash %q' "$0" printf ' %q' "${ORIGINAL_ARGS[@]}" printf '\n' } > "$OUT/command.sh" python "$SCRIPT_DIR/generate_processing_regularization_activation.py" \ "$OUT" > "$OUT/manifest.stdout.json" { printf '%s\n' \ "schema_version=1" \ "source_commit=$SOURCE_COMMIT" \ "design=processing-5aa-regularization-activation" \ "random_seed=$RANDOM_SEED" \ "evaluation=$EVALUATION" \ "gpus=$GPUS" \ "num_jobs=$NUM_JOBS" \ "max_workers_per_gpu=$MAX_WORKERS_PER_GPU" \ "dataloader_num_workers=$DATALOADER_NUM_WORKERS" \ "max_tasks_per_worker=$MAX_TASKS_PER_WORKER" sha256sum \ "$TRAIN_DATA" \ "$RELEASE_HOLDOUT_DIR/policy.json" \ "$RELEASE_HOLDOUT_DIR/processing_samples.csv" \ "$OUT/manifest.json" } > "$OUT/provenance.txt" COMMON_PARALLELISM_ARGS=( --num-jobs "$NUM_JOBS" --max-tasks-per-worker "$MAX_TASKS_PER_WORKER" --gpus "$GPUS" --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" --torch-compile 0 --matmul-precision highest ) TRAINING_PARALLELISM_ARGS=( "${COMMON_PARALLELISM_ARGS[@]}" --dataloader-num-workers "$DATALOADER_NUM_WORKERS" ) # shellcheck disable=SC1091 source "$SCRIPT_DIR/gpu_telemetry.sh" GPU_TELEMETRY_PID="" trap stop_gpu_telemetry EXIT start_gpu_telemetry "$OUT/gpu_occupancy.csv" tail -n +2 "$OUT/manifest.csv" | cut -d, -f1 | \ while IFS= read -r condition; do condition_out="$OUT/$condition" processing_out="$condition_out/processing" unselected="$processing_out/models.unselected.short_flanks" selected="$processing_out/models.selected.short_flanks" hyperparameters="$OUT/conditions/$condition.yaml" mkdir -p "$processing_out" if [ -f "$unselected/manifest.csv" ]; then mhcflurry-class1-train-processing-models \ --out-models-dir "$unselected" \ --continue-incomplete \ "${TRAINING_PARALLELISM_ARGS[@]}" else mhcflurry-class1-train-processing-models \ --data "$TRAIN_DATA" \ --held-out-samples 10 \ --num-folds 4 \ --random-seed "$RANDOM_SEED" \ --hyperparameters "$hyperparameters" \ --out-models-dir "$unselected" \ --worker-log-dir "$processing_out" \ "${TRAINING_PARALLELISM_ARGS[@]}" fi if [ ! -f "$selected/train_data.csv.bz2" ]; then mhcflurry-class1-select-processing-models \ --data "$unselected/train_data.csv.bz2" \ --models-dir "$unselected" \ --out-models-dir "$selected" \ --min-models-per-fold 1 \ --max-models-per-fold 1 \ --save-validation-predictions \ "${TRAINING_PARALLELISM_ARGS[@]}" cp "$unselected/train_data.csv.bz2" "$selected/train_data.csv.bz2" fi printf '%s\n' "$condition_out" > "$condition_out/predictor_path.txt" if [ ! -f "$condition_out/.loss-plots.done" ]; then mhcflurry train plot-loss-curves \ --selected-dir "$selected" \ --unselected-dir "$unselected" \ --out "$condition_out/loss_plots" date -u +%Y-%m-%dT%H:%M:%SZ > "$condition_out/.loss-plots.done" fi done stop_gpu_telemetry GPU_TELEMETRY_PID="" if [ "$EVALUATION" != none ]; then tail -n +2 "$OUT/manifest.csv" | \ while IFS=, read -r condition architecture baseline _rest; do if [ "$condition" != "$baseline" ] && [ "$EVALUATION" = baselines ]; then continue fi comparison="$OUT/$condition/comparison-vs-public" if [ ! -f "$comparison/.done" ]; then mkdir -p "$comparison" mhcflurry eval compare-models \ --a "$OUT/$condition" \ --a-label "$condition" \ --b public \ --b-label public \ --data-dir "$DATA_EVAL_DIR" \ --release-holdout-dir "$RELEASE_HOLDOUT_DIR" \ --include processing \ --processing-modes short_flanks \ --out "$comparison" \ "${COMMON_PARALLELISM_ARGS[@]}" mhcflurry plot-model-comparison \ --input "$comparison" \ --components processing \ --summary-pdf "$comparison/plots/model_comparison_figures.pdf" date -u +%Y-%m-%dT%H:%M:%SZ > "$comparison/.done" fi printf 'Evaluated %s (%s)\n' "$condition" "$architecture" done fi date -u +%Y-%m-%dT%H:%M:%SZ > "$OUT/completed_at_utc.txt" if [ -n "$EXPERIMENTS_DIR" ]; then snapshot_args=( --source-dir "$OUT" --experiments-dir "$EXPERIMENTS_DIR" --name "$EXPERIMENT_NAME" --source-commit "$SOURCE_COMMIT" --command-file "$OUT/command.sh" --input-file "$TRAIN_DATA" --input-file "$RELEASE_HOLDOUT_DIR/policy.json" --input-file "$RELEASE_HOLDOUT_DIR/processing_samples.csv" ) if [ -n "$SOURCE_ARCHIVE" ]; then snapshot_args+=(--source-archive "$SOURCE_ARCHIVE") fi snapshot_path="$(mhcflurry train snapshot-experiment "${snapshot_args[@]}")" printf '%s\n' "$snapshot_path" | tee "$OUT/snapshot_path.txt" fi mhcflurry-2.3.6/scripts/training/run_release_affinity_ablations.sh000066400000000000000000000044761525677230600256540ustar00rootroot00000000000000#!/usr/bin/env bash # Run the paired affinity hyperparameter panel on the frozen release holdout. set -euo pipefail : "${MHCFLURRY_OUT:?MHCFLURRY_OUT must be set}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" : "${REPO:=$(cd "$SCRIPT_DIR/../.." && pwd)}" PANEL_DIR="$MHCFLURRY_OUT/hyperparameter_panels" HOLDOUT_DIR="$MHCFLURRY_OUT/release_holdout" mkdir -p "$PANEL_DIR" "$HOLDOUT_DIR" python "$SCRIPT_DIR/generate_release_hyperparameter_ablations.py" "$PANEL_DIR" \ > "$MHCFLURRY_OUT/panel_manifest.stdout.json" mhcflurry-downloads fetch data_evaluation data_curated data_mass_spec_annotated mhcflurry train release-holdout build \ --data-dir "$(mhcflurry-downloads path data_evaluation)" \ --training-data "$(mhcflurry-downloads path data_curated)/curated_training_data.csv.bz2" \ --mass-spec-data "$(mhcflurry-downloads path data_mass_spec_annotated)/annotated_ms.csv.bz2" \ --out-dir "$HOLDOUT_DIR" DEFAULT_CONDITIONS="published_parity proposed_release pre_activation_lsuv no_lsuv pytorch_rmsprop pytorch_rmsprop_batch128" read -r -a CONDITIONS <<< "${AFFINITY_ABLATION_CONDITIONS:-$DEFAULT_CONDITIONS}" for condition in "${CONDITIONS[@]}"; do condition_out="$MHCFLURRY_OUT/affinity.$condition" env \ MHCFLURRY_OUT="$condition_out" \ REPO="$REPO" \ RELEASE_HOLDOUT_DIR="$HOLDOUT_DIR" \ AFFINITY_HYPERPARAMETERS_FILE="$PANEL_DIR/affinity.$condition.yaml" \ SKIP_CALIBRATE=1 \ SKIP_EVAL=1 \ SKIP_PLOTS=0 \ bash "$SCRIPT_DIR/pan_allele_release_affinity.sh" done DATA_EVAL_DIR="$(mhcflurry-downloads path data_evaluation)" PAIRWISE_DIR="$MHCFLURRY_OUT/paired_comparisons" mkdir -p "$PAIRWISE_DIR" BASELINE_DIR="${AFFINITY_ABLATION_BASELINE_DIR:-$MHCFLURRY_OUT}" for condition in "${CONDITIONS[@]}"; do if [ "$condition" = "published_parity" ]; then continue fi mhcflurry eval compare-models \ --a "$MHCFLURRY_OUT/affinity.$condition/models.combined" \ --a-label "$condition" \ --b "$BASELINE_DIR/affinity.published_parity/models.combined" \ --b-label published_parity \ --data-dir "$DATA_EVAL_DIR" \ --release-holdout-dir "$HOLDOUT_DIR" \ --affinity-training-overlap-policy audit \ --include affinity \ --out "$PAIRWISE_DIR/$condition-vs-published_parity" done mhcflurry-2.3.6/scripts/training/run_release_processing_ablations.sh000077500000000000000000000234541525677230600262170ustar00rootroot00000000000000#!/usr/bin/env bash # Run the paired processing initializer/optimizer panel on the frozen holdout. # RELEASE_RANDOM_SEED controls shared decoys, folds, and every fit (default 42). set -euo pipefail : "${MHCFLURRY_OUT:?MHCFLURRY_OUT must be set}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" : "${REPO:=$(cd "$SCRIPT_DIR/../.." && pwd)}" # shellcheck disable=SC1091 source "$SCRIPT_DIR/gpu_telemetry.sh" GPU_TELEMETRY_PID="" trap stop_gpu_telemetry EXIT export PYTHONUNBUFFERED=1 export MHCFLURRY_TORCH_COMPILE="${MHCFLURRY_TORCH_COMPILE:-0}" export MHCFLURRY_TORCH_COMPILE_LOSS="${MHCFLURRY_TORCH_COMPILE_LOSS:-0}" export MHCFLURRY_MATMUL_PRECISION="${MHCFLURRY_MATMUL_PRECISION:-highest}" PANEL_DIR="$MHCFLURRY_OUT/hyperparameter_panels" HOLDOUT_DIR="$MHCFLURRY_OUT/release_holdout" SHARED_DIR="$MHCFLURRY_OUT/processing.shared" PAIRWISE_DIR="$MHCFLURRY_OUT/paired_comparisons" mkdir -p "$PANEL_DIR" "$HOLDOUT_DIR" "$SHARED_DIR" "$PAIRWISE_DIR" python "$SCRIPT_DIR/generate_release_hyperparameter_ablations.py" "$PANEL_DIR" \ > "$MHCFLURRY_OUT/panel_manifest.stdout.json" mhcflurry-downloads fetch \ data_evaluation data_curated data_mass_spec_annotated data_references \ models_class1_pan models_class1_processing mhcflurry train release-holdout build \ --data-dir "$(mhcflurry-downloads path data_evaluation)" \ --training-data "$(mhcflurry-downloads path data_curated)/curated_training_data.csv.bz2" \ --mass-spec-data "$(mhcflurry-downloads path data_mass_spec_annotated)/annotated_ms.csv.bz2" \ --out-dir "$HOLDOUT_DIR" if command -v nvidia-smi >/dev/null 2>&1; then GPUS="$(nvidia-smi -L 2>/dev/null | wc -l | tr -d ' ')" else GPUS=0 fi if [ "$GPUS" -eq 0 ]; then NUM_JOBS="${NUM_JOBS:-1}" MAX_WORKERS_PER_GPU="${MAX_WORKERS_PER_GPU:-1}" else NUM_JOBS="${NUM_JOBS:-auto}" MAX_WORKERS_PER_GPU="${MAX_WORKERS_PER_GPU:-auto}" fi DATALOADER_NUM_WORKERS="${DATALOADER_NUM_WORKERS:-auto}" RELEASE_RANDOM_SEED="${RELEASE_RANDOM_SEED:-42}" COMMON_PARALLELISM_ARGS=( --num-jobs "$NUM_JOBS" --max-tasks-per-worker 1000 --gpus "$GPUS" --max-workers-per-gpu "$MAX_WORKERS_PER_GPU" --torch-compile 0 --matmul-precision highest ) TRAINING_PARALLELISM_ARGS=( "${COMMON_PARALLELISM_ARGS[@]}" --dataloader-num-workers "$DATALOADER_NUM_WORKERS" ) compress_csv_bzip2() { local path="$1" if command -v lbzip2 >/dev/null 2>&1; then lbzip2 -f "$path" elif command -v pbzip2 >/dev/null 2>&1; then pbzip2 -f "$path" else bzip2 -f "$path" fi } # Hold affinity fixed at the public release while constructing processing # decoys, so this panel isolates processing initialization and optimizer # equations. Generate the expensive shared training table only once. AFFINITY_PREDICTOR="${AFFINITY_PREDICTOR:-$(mhcflurry-downloads path models_class1_pan)/models.combined}" if [ ! -f "$SHARED_DIR/train_data.csv.bz2" ]; then python "$REPO/downloads-generation/models_class1_processing/annotate_hits_with_expression.py" \ --hits "$(mhcflurry-downloads path data_mass_spec_annotated)/annotated_ms.csv.bz2" \ --expression "$(mhcflurry-downloads path data_curated)/rna_expression.csv.bz2" \ --out "$SHARED_DIR/hits_with_tpm.csv" compress_csv_bzip2 "$SHARED_DIR/hits_with_tpm.csv" mhcflurry train processing-data \ --hits "$SHARED_DIR/hits_with_tpm.csv.bz2" \ --affinity-predictor "$AFFINITY_PREDICTOR" \ --proteome-reference-csv "$(mhcflurry-downloads path data_references)/uniprot_proteins.csv.bz2" \ --ppv-multiplier 100 \ --negative-policy matched --decoys-per-hit 1 --max-affinity-distance 0.25 \ --exclude-samples-file "$HOLDOUT_DIR/processing_samples.csv" \ --random-seed "$RELEASE_RANDOM_SEED" \ --out "$SHARED_DIR/train_data.csv" \ "${TRAINING_PARALLELISM_ARGS[@]}" compress_csv_bzip2 "$SHARED_DIR/train_data.csv" fi mhcflurry train validate-processing-data --data "$SHARED_DIR/train_data.csv.bz2" conditions=( glorot_keras_adam kaiming_keras_adam glorot_pytorch_adam kaiming_pytorch_adam ) read -r -a variants <<< \ "${PROCESSING_ABLATION_VARIANTS:-with_flanks no_flank}" if [ "${#variants[@]}" -eq 0 ]; then echo "PROCESSING_ABLATION_VARIANTS must name at least one variant" >&2 exit 2 fi for variant in "${variants[@]}"; do case "$variant" in with_flanks|no_flank|short_flanks) ;; *) echo "Unknown processing ablation variant: $variant" >&2 exit 2 ;; esac done PROCESSING_ABLATION_COMPARE_MODES="${PROCESSING_ABLATION_COMPARE_MODES:-}" if [ -z "$PROCESSING_ABLATION_COMPARE_MODES" ]; then PROCESSING_ABLATION_COMPARE_MODES="${variants[0]}" for variant in "${variants[@]:1}"; do PROCESSING_ABLATION_COMPARE_MODES+=",$variant" done fi train_processing_panel() { local condition_root="$1" local variant="$2" local hyperparameters="$3" local processing_root="$condition_root/processing" local unselected="$processing_root/models.unselected.$variant" local selected="$processing_root/models.selected.$variant" mkdir -p "$processing_root" if [ -f "$unselected/manifest.csv" ]; then mhcflurry-class1-train-processing-models \ --out-models-dir "$unselected" \ --continue-incomplete \ "${TRAINING_PARALLELISM_ARGS[@]}" else mhcflurry-class1-train-processing-models \ --data "$SHARED_DIR/train_data.csv.bz2" \ --held-out-samples 10 \ --num-folds 4 \ --random-seed "$RELEASE_RANDOM_SEED" \ --hyperparameters "$hyperparameters" \ --out-models-dir "$unselected" \ --worker-log-dir "$processing_root" \ "${TRAINING_PARALLELISM_ARGS[@]}" fi if [ ! -f "$selected/train_data.csv.bz2" ]; then mhcflurry-class1-select-processing-models \ --data "$unselected/train_data.csv.bz2" \ --models-dir "$unselected" \ --out-models-dir "$selected" \ --min-models-per-fold 1 \ --max-models-per-fold 2 \ --save-validation-predictions \ "${TRAINING_PARALLELISM_ARGS[@]}" cp "$unselected/train_data.csv.bz2" \ "$selected/train_data.csv.bz2" fi } for condition in "${conditions[@]}"; do condition_root="$MHCFLURRY_OUT/processing.$condition" processing_root="$condition_root/processing" mkdir -p "$processing_root" start_gpu_telemetry "$processing_root/gpu_occupancy.csv" for variant in "${variants[@]}"; do hyperparameters="$PANEL_DIR/processing.$condition.$variant.yaml" train_processing_panel \ "$condition_root" "$variant" "$hyperparameters" done stop_gpu_telemetry done # The initializer/optimizer panel above deliberately holds the published # processing batch of 512 fixed. This focused release gate isolates processing # minibatch size and prioritizes 5-aa, then no-flank. The 15-aa variant is not # expanded into a broad batch sweep based on a sparse 8-mer PPV signal. batch_sweep_variants=(short_flanks no_flank) for minibatch_size in 128 256 512 1024; do condition_root="$MHCFLURRY_OUT/processing_batch_sweep.batch$minibatch_size" processing_root="$condition_root/processing" mkdir -p "$processing_root" start_gpu_telemetry "$processing_root/gpu_occupancy.csv" for variant in "${batch_sweep_variants[@]}"; do hyperparameters="$PANEL_DIR/processing_batch_sweep.batch$minibatch_size.$variant.yaml" train_processing_panel \ "$condition_root" "$variant" "$hyperparameters" done stop_gpu_telemetry done DATA_EVAL_DIR="$(mhcflurry-downloads path data_evaluation)" baseline_root="$MHCFLURRY_OUT/processing.glorot_keras_adam" for condition in \ kaiming_keras_adam \ glorot_pytorch_adam \ kaiming_pytorch_adam do mhcflurry eval compare-models \ --a "$MHCFLURRY_OUT/processing.$condition" \ --a-label "$condition" \ --b "$baseline_root" \ --b-label glorot_keras_adam \ --data-dir "$DATA_EVAL_DIR" \ --release-holdout-dir "$HOLDOUT_DIR" \ --include processing \ --processing-modes "$PROCESSING_ABLATION_COMPARE_MODES" \ --out "$PAIRWISE_DIR/$condition-vs-glorot_keras_adam" \ "${COMMON_PARALLELISM_ARGS[@]}" done # Keep one external anchor: the retrained historical-parity condition versus # the currently published processing ensemble on the identical frozen rows. mhcflurry eval compare-models \ --a "$baseline_root" \ --a-label glorot_keras_adam \ --b public \ --b-label public \ --data-dir "$DATA_EVAL_DIR" \ --release-holdout-dir "$HOLDOUT_DIR" \ --include processing \ --processing-modes "$PROCESSING_ABLATION_COMPARE_MODES" \ --out "$PAIRWISE_DIR/glorot_keras_adam-vs-public" \ "${COMMON_PARALLELISM_ARGS[@]}" batch_sweep_baseline="$MHCFLURRY_OUT/processing_batch_sweep.batch512" for minibatch_size in 128 256 1024; do mhcflurry eval compare-models \ --a "$MHCFLURRY_OUT/processing_batch_sweep.batch$minibatch_size" \ --a-label "processing_batch_$minibatch_size" \ --b "$batch_sweep_baseline" \ --b-label processing_batch_512 \ --data-dir "$DATA_EVAL_DIR" \ --release-holdout-dir "$HOLDOUT_DIR" \ --include processing \ --processing-modes short_flanks,no_flank \ --out "$PAIRWISE_DIR/processing_batch_$minibatch_size-vs-512" \ "${COMMON_PARALLELISM_ARGS[@]}" done mhcflurry eval compare-models \ --a "$batch_sweep_baseline" \ --a-label processing_batch_512 \ --b public \ --b-label public \ --data-dir "$DATA_EVAL_DIR" \ --release-holdout-dir "$HOLDOUT_DIR" \ --include processing \ --processing-modes short_flanks,no_flank \ --out "$PAIRWISE_DIR/processing_batch_512-vs-public" \ "${COMMON_PARALLELISM_ARGS[@]}" mhcflurry-2.3.6/scripts/training/set_cpu_threads.sh000077500000000000000000000126271525677230600225770ustar00rootroot00000000000000#!/usr/bin/env bash # # Auto-compute the per-training-worker CPU thread budget and set # OMP_NUM_THREADS, MKL_NUM_THREADS, OPENBLAS_NUM_THREADS uniformly. # # All three env vars control the same concern — per-process BLAS / OpenMP # thread count — but they live in different libraries (Intel MKL, # OpenBLAS, OpenMP runtime) so PyTorch + numpy + scikit-learn route to # whichever happens to back the workload. Setting them independently # is a footgun. This script gives one knob: # # Inputs (env, all must be set before sourcing): # GPUS number of visible CUDA devices (0 allowed) # MAX_WORKERS_PER_GPU training workers per GPU, or "auto" when # NUM_JOBS is provided by the caller # NUM_JOBS optional total training workers; preferred # when MAX_WORKERS_PER_GPU is auto # DATALOADER_NUM_WORKERS per-training-worker DataLoader prefetch procs # # Optional override: # MHCFLURRY_CPU_THREADS_PER_WORKER # explicit per-training-worker thread count; skips auto-calc. # # Allocation model: # total_cores = nproc() # total_training_workers = NUM_JOBS when provided, else # max(1, GPUS * MAX_WORKERS_PER_GPU) # reserved = 2 (OS / orchestrator) + total_training_workers * DATALOADER_NUM_WORKERS # per_worker = max(1, (total_cores - reserved) / total_training_workers) # # Then exports OMP / MKL / OPENBLAS = per_worker, and prints a summary. # User-set env vars are respected (only set if unset). # # Prints one human-readable summary line on stderr so logs show the # decision and inputs that led to it. # MKL uses INTEL threading by default in some conda images, which aborts when # PyTorch's GNU libgomp is already loaded ("MKL_THREADING_LAYER=INTEL is # incompatible with libgomp.so.1"). Pin GNU so MKL and torch share one OpenMP # runtime. This must be set before Python imports numpy/torch. : "${MKL_THREADING_LAYER:=GNU}" export MKL_THREADING_LAYER resolve_dataloader_num_workers() { local num_fit_workers=${1:-${NUM_JOBS:-}} local requested=${DATALOADER_NUM_WORKERS:-auto} if [ "$requested" != "auto" ]; then case "$requested" in *[!0-9]*|"") echo "resolve_dataloader_num_workers: value must be 'auto' or numeric, got '$requested'" >&2 return 2 ;; esac printf '%s\n' "$requested" return 0 fi case "$num_fit_workers" in *[!0-9]*|"") echo "resolve_dataloader_num_workers: NUM_JOBS must be numeric, got '$num_fit_workers'" >&2 return 2 ;; esac NUM_FIT_WORKERS="$num_fit_workers" python -c ' import os from mhcflurry.parallelism import auto_dataloader_num_workers from mhcflurry.workload_planning import system_memory_info_gb print(auto_dataloader_num_workers( num_fit_workers=int(os.environ["NUM_FIT_WORKERS"]), ram_gb=system_memory_info_gb()["total_gb"], )) ' } set_cpu_threads() { local cores cores=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1) local gpus=${GPUS:-0} local wpg=${MAX_WORKERS_PER_GPU:-1} local num_jobs=${NUM_JOBS:-} local dl=${DATALOADER_NUM_WORKERS:-0} case "$dl" in *[!0-9]*|"") echo "set_cpu_threads: DATALOADER_NUM_WORKERS must be numeric, got '$dl'" >&2 return 2 ;; esac local total_workers if [ -n "$num_jobs" ]; then case "$num_jobs" in *[!0-9]*|"") echo "set_cpu_threads: NUM_JOBS must be numeric, got '$num_jobs'" >&2 return 2 ;; esac total_workers="$num_jobs" else case "$wpg" in *[!0-9]*|"") echo "set_cpu_threads: MAX_WORKERS_PER_GPU must be numeric when NUM_JOBS is unset, got '$wpg'" >&2 return 2 ;; esac total_workers=$(( gpus * wpg )) fi if [ "$total_workers" -lt 1 ]; then total_workers=1 fi local per_worker if [ -n "${MHCFLURRY_CPU_THREADS_PER_WORKER:-}" ]; then per_worker="$MHCFLURRY_CPU_THREADS_PER_WORKER" else # Reserve 2 cores for OS + orchestrator driver process, plus # one core per DataLoader worker process across all training # workers. local reserved=$(( 2 + total_workers * dl )) local available=$(( cores - reserved )) if [ "$available" -lt "$total_workers" ]; then # CPU is oversubscribed; give each training worker 1 thread. # This matches the "release" convention and avoids numpy # spawning 22 BLAS threads per process on a box that can't # schedule them all. per_worker=1 else per_worker=$(( available / total_workers )) if [ "$per_worker" -lt 1 ]; then per_worker=1; fi fi fi # User overrides take precedence — only default if unset. : "${OMP_NUM_THREADS:=$per_worker}" : "${MKL_NUM_THREADS:=$per_worker}" : "${OPENBLAS_NUM_THREADS:=$per_worker}" export OMP_NUM_THREADS MKL_NUM_THREADS OPENBLAS_NUM_THREADS printf >&2 \ '[set_cpu_threads] cores=%d gpus=%d workers_per_gpu=%s total_workers=%d dl_workers=%d → per_worker=%d (OMP=%s MKL=%s OPENBLAS=%s)\n' \ "$cores" "$gpus" "$wpg" "$total_workers" "$dl" "$per_worker" \ "$OMP_NUM_THREADS" "$MKL_NUM_THREADS" "$OPENBLAS_NUM_THREADS" } mhcflurry-2.3.6/scripts/training/split_affinity_architectures.py000077500000000000000000000167041525677230600254120ustar00rootroot00000000000000#!/usr/bin/env python """Split a trained pan-allele ensemble into fold-complete architectures.""" import argparse import hashlib import json import os from pathlib import Path import shutil import tempfile import pandas ARCHITECTURE_FIELDS = ( "topology", "layer_sizes", "dense_layer_l1_regularization", ) SHARED_METADATA_NAMES = ( "allele_sequences.csv", "info.txt", "train_data.csv.bz2", ) def sha256_file(path): """Return the SHA256 digest of ``path``.""" digest = hashlib.sha256() with open(path, "rb") as fd: for chunk in iter(lambda: fd.read(1024 * 1024), b""): digest.update(chunk) return digest.hexdigest() def model_record(row): """Return architecture/fold metadata from one manifest row.""" config = json.loads(row.config_json) hyperparameters = config["hyperparameters"] training_info = None for fit in reversed(config.get("fit_info", [])): candidate = fit.get("training_info", {}) if "architecture_num" in candidate and "fold_num" in candidate: training_info = candidate break if training_info is None: raise ValueError( "Model %s has no architecture_num/fold_num training metadata" % row.model_name ) return { "model_name": row.model_name, "architecture_num": int(training_info["architecture_num"]), "fold_num": int(training_info["fold_num"]), "architecture": { field: hyperparameters[field] for field in ARCHITECTURE_FIELDS }, } def link_or_copy(source, target): """Hard-link a file when possible, otherwise copy it.""" try: os.link(source, target) return "hardlink" except OSError: shutil.copy2(source, target) return "copy" def shared_metadata_paths(models_dir): """Yield predictor metadata required for loading and overlap auditing.""" models_dir = Path(models_dir) seen = set() for name in SHARED_METADATA_NAMES: path = models_dir / name if path.is_file(): seen.add(path.name) yield path for path in sorted(models_dir.glob("pseudosequences.*.csv")): if path.name not in seen: yield path def split_models(models_dir, out_dir, expected_folds=4): """Write one loadable model directory per architecture.""" models_dir = Path(models_dir) out_dir = Path(out_dir) manifest_path = models_dir / "manifest.csv" manifest = pandas.read_csv(manifest_path) missing = {"model_name", "allele", "config_json"} - set(manifest.columns) if missing: raise ValueError( "Manifest missing required column(s): %s" % ", ".join(sorted(missing)) ) if set(manifest.allele) != {"pan-class1"}: raise ValueError("Architecture split requires pan-class1 models only") records = [model_record(row) for row in manifest.itertuples(index=False)] by_architecture = {} for record in records: by_architecture.setdefault(record["architecture_num"], []).append(record) out_dir.mkdir(parents=True, exist_ok=True) results = [] manifest_sha256 = sha256_file(manifest_path) for architecture_num, architecture_records in sorted(by_architecture.items()): descriptors = { json.dumps(record["architecture"], sort_keys=True) for record in architecture_records } if len(descriptors) != 1: raise ValueError( "Architecture %d has inconsistent hyperparameters" % architecture_num ) folds = sorted(record["fold_num"] for record in architecture_records) if folds != list(range(expected_folds)): raise ValueError( "Architecture %d has folds %s; expected %s" % (architecture_num, folds, list(range(expected_folds))) ) names = [record["model_name"] for record in architecture_records] target = out_dir / ("architecture_%d" % architecture_num) provenance = { "schema_version": 2, "calibration": "omitted; recalibrate each subset before using ranks", "source_models_dir": str(models_dir.resolve()), "source_manifest_sha256": manifest_sha256, "architecture_num": architecture_num, "architecture": architecture_records[0]["architecture"], "folds": folds, "model_names": names, } if target.exists(): existing_path = target / "subset_provenance.json" if not existing_path.is_file() or json.loads( existing_path.read_text()) != provenance: raise ValueError( "Existing architecture subset does not match: %s" % target ) results.append({"models_dir": str(target), **provenance}) continue temp = Path(tempfile.mkdtemp( dir=out_dir, prefix=".%s-" % target.name )) try: subset = manifest[manifest.model_name.isin(names)].copy() if len(subset) != expected_folds: raise ValueError( "Architecture %d selected %d manifest rows; expected %d" % (architecture_num, len(subset), expected_folds) ) subset.to_csv(temp / "manifest.csv", index=False) link_modes = set() for name in names: source = models_dir / ("weights_%s.npz" % name) if not source.is_file(): raise ValueError("Missing model weights: %s" % source) link_modes.add(link_or_copy(source, temp / source.name)) for column in ("checkpoint_terminal_weights", "checkpoint_best_weights"): if column not in subset: continue for filename in subset[column].dropna().unique(): relative = Path(filename) if relative.is_absolute() or ".." in relative.parts: raise ValueError("Invalid checkpoint path: %s" % filename) source = models_dir / relative if not source.is_file(): raise ValueError("Missing checkpoint weights: %s" % source) destination = temp / relative destination.parent.mkdir(parents=True, exist_ok=True) link_modes.add(link_or_copy(source, destination)) for source in shared_metadata_paths(models_dir): link_modes.add(link_or_copy(source, temp / source.name)) (temp / "subset_provenance.json").write_text( json.dumps(provenance, indent=2, sort_keys=True) + "\n" ) os.replace(temp, target) except BaseException: shutil.rmtree(temp, ignore_errors=True) raise results.append({ "models_dir": str(target), "link_modes": sorted(link_modes), **provenance, }) return results def main(argv=None): """Run the architecture splitter.""" parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("models_dir") parser.add_argument("out_dir") parser.add_argument("--expected-folds", type=int, default=4) args = parser.parse_args(argv) result = split_models( args.models_dir, args.out_dir, expected_folds=args.expected_folds ) print(json.dumps(result, indent=2, sort_keys=True)) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/summarize_affinity_factorial.py000066400000000000000000000147571525677230600253750ustar00rootroot00000000000000#!/usr/bin/env python """Summarize paired affinity-factorial comparisons without merging sides.""" import argparse import csv import json from pathlib import Path METRICS = ("roc_auc", "pr_auc", "ppv_at_n") PUBLIC_COMPARISON_NAME = "comparison-vs-public-no-additional-ms" BASELINE_PUBLIC_COMPARISON_NAME = "baseline-vs-public-no-additional-ms" def side_metrics(summary, side): """Return flattened macro/micro metrics for one comparison side.""" result = {} for metric in METRICS: result["macro_" + metric] = summary["macro_mean_over_alleles"][ metric ][side] result["micro_" + metric] = summary["micro_pooled"][side][metric] return result def benchmark_identity(summary, path): """Return the scored-row identity or reject an obsolete comparison.""" result = summary.get("benchmark_identity") if not result or not result.get("sha256"): raise ValueError( "Direct public comparison lacks benchmark_identity: %s" % path) return result def summarize(factorial_dir): """Write and return one record per completed factorial condition.""" factorial_dir = Path(factorial_dir) manifest = json.loads((factorial_dir / "manifest.json").read_text()) baseline = manifest["baseline_condition"] records = [] public_benchmark_identity = None for condition_record in manifest["records"]: condition = condition_record["condition"] if condition == baseline: summary_path = ( factorial_dir / BASELINE_PUBLIC_COMPARISON_NAME / "affinity" / "summary.json" ) if not summary_path.exists(): continue summary = json.loads(summary_path.read_text()) candidate = side_metrics(summary, "a") reference = candidate public_candidate = candidate public = side_metrics(summary, "b") direct_public_summary = summary comparison = "baseline_vs_public" else: summary_path = ( factorial_dir / condition / "comparison-vs-baseline" / "affinity" / "summary.json" ) if not summary_path.exists(): continue summary = json.loads(summary_path.read_text()) candidate = side_metrics(summary, "a") reference = side_metrics(summary, "b") public_summary_path = ( factorial_dir / condition / PUBLIC_COMPARISON_NAME / "affinity" / "summary.json" ) public = None public_candidate = None direct_public_summary = None if public_summary_path.exists(): public_summary = json.loads(public_summary_path.read_text()) public_candidate = side_metrics(public_summary, "a") public = side_metrics(public_summary, "b") direct_public_summary = public_summary comparison = "candidate_vs_baseline" direct_identity = None if direct_public_summary is not None: direct_identity = benchmark_identity( direct_public_summary, summary_path if condition == baseline else public_summary_path, ) if public_benchmark_identity is None: public_benchmark_identity = direct_identity elif direct_identity != public_benchmark_identity: raise ValueError( "Direct public comparisons used different benchmark rows: " "%s has %s, expected %s" % ( condition, direct_identity, public_benchmark_identity, )) record = { **condition_record, "comparison": comparison, "n_rows": summary["n_rows"], "n_hits": summary["n_hits"], "n_alleles_reported": summary["n_alleles_reported"], "public_benchmark_identity_sha256": ( direct_identity["sha256"] if direct_identity else None), "public_n_rows": ( direct_public_summary["n_rows"] if direct_public_summary is not None else None), "public_n_hits": ( direct_public_summary["n_hits"] if direct_public_summary is not None else None), } for key, value in candidate.items(): record[key] = value record[key + "_baseline"] = reference[key] record[key + "_delta"] = value - reference[key] record[key + "_relative_delta"] = ( (value - reference[key]) / reference[key] if reference[key] else None ) public_value = public[key] if public is not None else None public_candidate_value = ( public_candidate[key] if public_candidate is not None else None) record[key + "_public"] = public_value record[key + "_vs_public_candidate"] = public_candidate_value record[key + "_vs_public_delta"] = ( public_candidate_value - public_value if public_value is not None else None ) record[key + "_vs_public_relative_delta"] = ( (public_candidate_value - public_value) / public_value if public_value else None ) allele_count = summary.get("allele_count", {}) for metric in METRICS: record["alleles_candidate_better_" + metric] = allele_count.get( "a_better_" + metric ) record["alleles_baseline_better_" + metric] = allele_count.get( "b_better_" + metric ) records.append(record) if records: fieldnames = list(records[0]) out_path = factorial_dir / "summary.csv" with out_path.open("w", newline="") as fd: writer = csv.DictWriter(fd, fieldnames=fieldnames) writer.writeheader() writer.writerows(records) return records def main(argv=None): """Run the summarizer.""" parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("factorial_dir") args = parser.parse_args(argv) records = summarize(args.factorial_dir) print(json.dumps(records, indent=2, sort_keys=True)) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/summarize_affinity_factorial_architectures.py000077500000000000000000000115601525677230600303120ustar00rootroot00000000000000#!/usr/bin/env python """Summarize architecture-stratified affinity-factorial comparisons.""" import argparse import csv import json from pathlib import Path METRICS = ("roc_auc", "pr_auc", "ppv_at_n") def side_metrics(summary, side): """Return flattened macro/micro metrics for one comparison side.""" result = {} for metric in METRICS: result["macro_" + metric] = summary["macro_mean_over_alleles"][ metric ][side] result["micro_" + metric] = summary["micro_pooled"][side][metric] return result def dominance_label(deltas): """Classify strict metric dominance against the matched baseline.""" if all(value > 0 for value in deltas): return "strictly_dominates_baseline" if all(value < 0 for value in deltas): return "strictly_dominated_by_baseline" return "mixed" def summarize(factorial_dir): """Write and return one record per completed condition/architecture.""" factorial_dir = Path(factorial_dir) architecture_dir = factorial_dir / "architecture_evaluation" manifest = json.loads((factorial_dir / "manifest.json").read_text()) baseline = manifest["baseline_condition"] records = [] for condition_record in manifest["records"]: condition = condition_record["condition"] subset_root = architecture_dir / "subsets" / condition for provenance_path in sorted(subset_root.glob( "architecture_*/subset_provenance.json")): provenance = json.loads(provenance_path.read_text()) architecture_num = provenance["architecture_num"] architecture_name = "architecture_%d" % architecture_num if condition == baseline: summary_path = ( architecture_dir / "baseline-vs-public" / architecture_name / "affinity" / "summary.json" ) comparison = "baseline_vs_public" else: summary_path = ( architecture_dir / "comparisons" / condition / (architecture_name + "-vs-baseline") / "affinity" / "summary.json" ) comparison = "candidate_vs_baseline" if not summary_path.exists(): continue summary = json.loads(summary_path.read_text()) candidate = side_metrics(summary, "a") reference = ( candidate if condition == baseline else side_metrics(summary, "b") ) architecture = provenance["architecture"] record = { **condition_record, "architecture_num": architecture_num, "topology": architecture["topology"], "layer_sizes": json.dumps(architecture["layer_sizes"]), "dense_layer_l1_regularization": architecture[ "dense_layer_l1_regularization" ], "comparison": comparison, "n_rows": summary["n_rows"], "n_hits": summary["n_hits"], "n_alleles_reported": summary["n_alleles_reported"], } deltas = [] for key, value in candidate.items(): reference_value = reference[key] delta = value - reference_value record[key] = value record[key + "_baseline"] = reference_value record[key + "_delta"] = delta record[key + "_relative_delta"] = ( delta / reference_value if reference_value else None ) if condition != baseline: deltas.append(delta) record["metric_dominance"] = ( "reference" if condition == baseline else dominance_label(deltas) ) allele_count = summary.get("allele_count", {}) for metric in METRICS: record["alleles_candidate_better_" + metric] = allele_count.get( "a_better_" + metric ) record["alleles_baseline_better_" + metric] = allele_count.get( "b_better_" + metric ) records.append(record) if records: out_path = architecture_dir / "summary.csv" with out_path.open("w", newline="") as fd: writer = csv.DictWriter(fd, fieldnames=list(records[0])) writer.writeheader() writer.writerows(records) return records def main(argv=None): """Run the summarizer.""" parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("factorial_dir") args = parser.parse_args(argv) print(json.dumps(summarize(args.factorial_dir), indent=2, sort_keys=True)) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/summarize_presentation_affinity_ensemble.py000066400000000000000000000366431525677230600300140ustar00rootroot00000000000000#!/usr/bin/env python3 """Fit and evaluate a fixed public/new affinity score ensemble.""" import argparse import hashlib import json import os from pathlib import Path import numpy import pandas from sklearn.linear_model import LogisticRegression from sklearn.metrics import average_precision_score, roc_auc_score from mhcflurry import Class1PresentationPredictor from mhcflurry.common import configure_random_seed from mhcflurry.regression_target import from_ic50, to_ic50 METRICS = ("AUROC", "AUPRC", "PPV@N") CONDITIONS = ( "public_2_2", "public_affinity__new_processing", "new_affinity__new_processing", "hybrid_affinity__new_processing", "dual_affinity_features__new_processing", ) def sha256_file(path): """Return the SHA256 digest of a file.""" digest = hashlib.sha256() with open(path, "rb") as fd: for block in iter(lambda: fd.read(8 * 1024 * 1024), b""): digest.update(block) return digest.hexdigest() def metric_values(targets, scores): """Calculate release metrics with deterministic PPV@N ties.""" targets = numpy.asarray(targets) scores = numpy.asarray(scores) if not numpy.isfinite(scores).all(): raise ValueError("Non-finite score encountered") num_positives = int(targets.sum()) if not num_positives or num_positives == len(targets): return {name: numpy.nan for name in METRICS} order = numpy.argsort(-scores, kind="stable")[:num_positives] return { "AUROC": float(roc_auc_score(targets, scores)), "AUPRC": float(average_precision_score(targets, scores)), "PPV@N": float(targets[order].sum()) / num_positives, } def logistic_score(intercept, affinity_weight, processing_weight, affinity_score, processing_score): """Evaluate the published two-feature logistic presentation combiner.""" logits = ( float(intercept) + float(affinity_weight) * numpy.asarray(affinity_score) + float(processing_weight) * numpy.asarray(processing_score) ) return 1.0 / (1.0 + numpy.exp(-numpy.clip(logits, -40.0, 40.0))) def summarize_scores(frame, mode): """Return overall, per-sample, and per-length metric tables.""" per_sample_rows = [] for (sample_id, hla), group in frame.groupby( ["sample_id", "hla"], dropna=False, sort=False): for condition in CONDITIONS: values = metric_values(group.hit.values, group[condition].values) per_sample_rows.append({ "flank_mode": mode, "sample_id": sample_id, "hla": hla, "condition": condition, "n": int(len(group)), "n_pos": int(group.hit.sum()), **values, }) per_sample = pandas.DataFrame(per_sample_rows) overall_rows = [] for condition in CONDITIONS: micro = metric_values(frame.hit.values, frame[condition].values) condition_samples = per_sample.loc[ per_sample.condition == condition] for metric in METRICS: overall_rows.extend([ { "flank_mode": mode, "condition": condition, "average": "Micro", "metric": metric, "value": micro[metric], }, { "flank_mode": mode, "condition": condition, "average": "Macro", "metric": metric, "value": float(condition_samples[metric].mean()), }, ]) per_length_rows = [] for length, group in frame.groupby("peptide_len", sort=True): for condition in CONDITIONS: micro = metric_values(group.hit.values, group[condition].values) sample_metrics = [] for _, sample_group in group.groupby( ["sample_id", "hla"], dropna=False, sort=False): sample_metrics.append(metric_values( sample_group.hit.values, sample_group[condition].values, )) for metric in METRICS: per_length_rows.extend([ { "flank_mode": mode, "length": int(length), "condition": condition, "average": "Micro", "metric": metric, "value": micro[metric], }, { "flank_mode": mode, "length": int(length), "condition": condition, "average": "Macro", "metric": metric, "value": float(numpy.nanmean([ values[metric] for values in sample_metrics ])), }, ]) return ( pandas.DataFrame(overall_rows), per_sample, pandas.DataFrame(per_length_rows), ) def parse_args(argv=None): parser = argparse.ArgumentParser( prog=os.environ.get("MHCFLURRY_CLI_PROG"), description=__doc__) parser.add_argument("--training-data", required=True) parser.add_argument("--public-affinity-cache", required=True) parser.add_argument("--new-affinity-cache", required=True) parser.add_argument("--processing-with-cache", required=True) parser.add_argument("--processing-without-cache", required=True) parser.add_argument("--with-flanks-predictions", required=True) parser.add_argument("--without-flanks-predictions", required=True) parser.add_argument("--public-new-processing-weights", required=True) parser.add_argument("--out", required=True) parser.add_argument("--public-model-count", type=int, default=10) parser.add_argument("--new-model-count", type=int, default=8) parser.add_argument("--random-seed", type=int, default=42) return parser.parse_args(argv) def main(argv=None): args = parse_args(argv) configure_random_seed( args.random_seed, name="presentation-affinity-ensemble-followup") out = Path(args.out).resolve() out.mkdir(parents=True, exist_ok=True) data = pandas.read_csv( args.training_data, dtype={"sample_id": str}, low_memory=False) data = data.loc[data.peptide.str.len().between(8, 15)].copy() data["experiment_id"] = data.hla data = data.sort_values( "experiment_id", kind="stable").reset_index(drop=True) public_affinity = numpy.load(args.public_affinity_cache) new_affinity = numpy.load(args.new_affinity_cache) processing_with = numpy.load(args.processing_with_cache) processing_without = numpy.load(args.processing_without_cache) arrays = { "public affinity": public_affinity, "new affinity": new_affinity, "processing with flanks": processing_with, "processing without flanks": processing_without, } for name, values in arrays.items(): if len(values) != len(data): raise ValueError( "%s cache has %d rows; expected %d" % ( name, len(values), len(data))) if not numpy.isfinite(values).all(): raise ValueError("%s cache contains non-finite values" % name) total_models = args.public_model_count + args.new_model_count public_weight = args.public_model_count / float(total_models) new_weight = args.new_model_count / float(total_models) hybrid_affinity_score = ( public_weight * from_ic50(public_affinity) + new_weight * from_ic50(new_affinity) ) hybrid_affinity = to_ic50(hybrid_affinity_score) predictor = Class1PresentationPredictor() predictor.fit_from_scores( targets=data.hit.values, affinities=hybrid_affinity, processing_scores_by_model={ "with_flanks": processing_with, "without_flanks": processing_without, }, verbose=1, ) predictor.weights_dataframe.to_csv(out / "weights.csv") dual_models = {} dual_weight_rows = [] public_affinity_score = from_ic50(public_affinity) new_affinity_score = from_ic50(new_affinity) for mode, processing_score in ( ("with_flanks", processing_with), ("without_flanks", processing_without)): model = LogisticRegression(solver="lbfgs") model.fit( numpy.column_stack([ public_affinity_score, new_affinity_score, processing_score, ]), data.hit.astype(float).values, ) dual_models[mode] = model dual_weight_rows.append({ "flank_mode": mode, "intercept": float(model.intercept_[0]), "public_affinity_score": float(model.coef_[0, 0]), "new_affinity_score": float(model.coef_[0, 1]), "processing_score": float(model.coef_[0, 2]), }) pandas.DataFrame(dual_weight_rows).to_csv( out / "dual_feature_weights.csv", index=False) public_new_weights = pandas.read_csv( args.public_new_processing_weights, index_col=0) all_overall = [] correlation_rows = [] for mode, path in ( ("with_flanks", args.with_flanks_predictions), ("without_flanks", args.without_flanks_predictions)): frame = pandas.read_csv(path, low_memory=False) required = { "hit", "sample_id", "hla", "peptide_len", "a_affinity", "b_affinity", "a_processing_score", "a_presentation_score", "b_presentation_score", } missing = sorted(required - set(frame.columns)) if missing: raise ValueError("%s is missing columns: %s" % ( path, ", ".join(missing))) new_score = from_ic50(frame.a_affinity.values) public_score = from_ic50(frame.b_affinity.values) hybrid_score = public_weight * public_score + new_weight * new_score processing_score = frame.a_processing_score.values hybrid_model = predictor.get_model(mode) hybrid_presentation = hybrid_model.predict_proba( numpy.column_stack([hybrid_score, processing_score]))[:, 1] row = public_new_weights.loc[mode] public_new_presentation = logistic_score( row.intercept, row.affinity_score, row.processing_score, public_score, processing_score, ) scored = frame[[ "protein_accession", "peptide", "sample_id", "n_flank", "c_flank", "hit", "hla", "source_file", "peptide_len", ]].copy() scored["public_affinity_score"] = public_score scored["new_affinity_score"] = new_score scored["hybrid_affinity_score"] = hybrid_score scored["new_processing_score"] = processing_score scored["public_2_2"] = frame.b_presentation_score.values scored["public_affinity__new_processing"] = public_new_presentation scored["new_affinity__new_processing"] = ( frame.a_presentation_score.values) scored["hybrid_affinity__new_processing"] = hybrid_presentation scored["dual_affinity_features__new_processing"] = ( dual_models[mode].predict_proba(numpy.column_stack([ public_score, new_score, processing_score, ]))[:, 1] ) output_path = out / ("predictions_%s.csv.bz2" % mode) scored.to_csv(output_path, index=False, compression="bz2") overall, per_sample, per_length = summarize_scores(scored, mode) overall.to_csv(out / ("summary_%s.csv" % mode), index=False) per_sample.to_csv(out / ("per_sample_%s.csv" % mode), index=False) per_length.to_csv(out / ("per_length_%s.csv" % mode), index=False) all_overall.append(overall) for subset, mask in ( ("all", numpy.ones(len(scored), dtype=bool)), ("hits", scored.hit.values == 1), ("decoys", scored.hit.values == 0)): values = scored.loc[mask, [ "public_affinity_score", "new_affinity_score", "new_processing_score", ]] matrix = values.corr(method="pearson") for left in matrix.columns: for right in matrix.columns: if left < right: correlation_rows.append({ "flank_mode": mode, "subset": subset, "left": left, "right": right, "pearson": float(matrix.loc[left, right]), "n": int(len(values)), }) overall = pandas.concat(all_overall, ignore_index=True) reference_rows = [] for reference in ( "public_2_2", "public_affinity__new_processing"): reference_values = overall.loc[ overall.condition == reference, ["flank_mode", "average", "metric", "value"], ].rename(columns={"value": "reference_value"}) comparison = overall.merge( reference_values, on=["flank_mode", "average", "metric"], how="left", ) comparison["reference"] = reference comparison["diff"] = comparison.value - comparison.reference_value comparison["pct_change"] = ( 100.0 * comparison["diff"] / comparison.reference_value) reference_rows.append(comparison) release_summary = pandas.concat(reference_rows, ignore_index=True) release_summary.to_csv(out / "release_summary.csv", index=False) pandas.DataFrame(correlation_rows).to_csv( out / "score_correlations.csv", index=False) input_paths = { key: Path(value).resolve() for key, value in { "training_data": args.training_data, "public_affinity_cache": args.public_affinity_cache, "new_affinity_cache": args.new_affinity_cache, "processing_with_cache": args.processing_with_cache, "processing_without_cache": args.processing_without_cache, "with_flanks_predictions": args.with_flanks_predictions, "without_flanks_predictions": args.without_flanks_predictions, "public_new_processing_weights": ( args.public_new_processing_weights), }.items() } provenance = { "format": 1, "random_seed": args.random_seed, "blend": { "level": "presentation affinity_score after best-allele selection", "public_model_count": args.public_model_count, "new_model_count": args.new_model_count, "public_weight": public_weight, "new_weight": new_weight, "ratio_was_tuned": False, "network_merge_avoided": ( "source predictors use different allele pseudosequence tables" ), }, "rows": { "presentation_training": int(len(data)), }, "inputs": { key: {"path": str(path), "sha256": sha256_file(path)} for key, path in input_paths.items() }, "outputs": { path.name: sha256_file(path) for path in sorted(out.iterdir()) if path.is_file() and path.name != "provenance.json" }, } with open(out / "provenance.json", "w") as fd: json.dump(provenance, fd, indent=2, sort_keys=True) fd.write("\n") return 0 if __name__ == "__main__": raise SystemExit(main()) mhcflurry-2.3.6/scripts/training/summarize_processing_ensemble.py000066400000000000000000000073531525677230600255600ustar00rootroot00000000000000#!/usr/bin/env python3 """Score a fixed weighted ensemble from preserved processing predictions.""" import argparse import hashlib import json import os from pathlib import Path import numpy import pandas from mhcflurry.cli.processing_affinity_control import ( score_risk_sets, summarize_metrics, ) def sha256_file(path): """Return the SHA256 digest of a file.""" digest = hashlib.sha256() with open(path, "rb") as fd: for block in iter(lambda: fd.read(8 * 1024 * 1024), b""): digest.update(block) return digest.hexdigest() def parse_member(value): """Parse a COLUMN=WEIGHT member specification.""" try: column, weight = value.rsplit("=", 1) weight = float(weight) except (TypeError, ValueError) as error: raise argparse.ArgumentTypeError( "members must have the form COLUMN=WEIGHT" ) from error if not column or not numpy.isfinite(weight) or weight < 0: raise argparse.ArgumentTypeError( "member columns must be nonempty and weights finite and nonnegative" ) return column, weight def parse_args(argv=None): parser = argparse.ArgumentParser( prog=os.environ.get("MHCFLURRY_CLI_PROG"), description=__doc__) parser.add_argument("--predictions", required=True) parser.add_argument("--member", action="append", type=parse_member, required=True) parser.add_argument("--name", required=True) parser.add_argument("--baseline", required=True) parser.add_argument("--out", required=True) return parser.parse_args(argv) def run(args): out = Path(args.out).resolve() out.mkdir(parents=True, exist_ok=True) source = Path(args.predictions).resolve() frame = pandas.read_csv(source, dtype={"sample_id": str}, low_memory=False) columns = [column for column, _ in args.member] missing = sorted(set(columns + [args.baseline]) - set(frame.columns)) if missing: raise ValueError("Missing score columns: %s" % ", ".join(missing)) if args.name in frame.columns: raise ValueError("Output score column already exists: %s" % args.name) weights = numpy.asarray([weight for _, weight in args.member], dtype="float64") if weights.sum() <= 0: raise ValueError("At least one member weight must be positive") weights /= weights.sum() frame[args.name] = numpy.average( frame[columns].to_numpy(dtype="float64"), axis=1, weights=weights ) score_columns = list(dict.fromkeys([args.baseline] + columns + [args.name])) metrics = score_risk_sets(frame, score_columns) summary, comparisons = summarize_metrics(metrics, args.baseline) predictions_path = out / "matched_predictions.csv.bz2" frame.to_csv(predictions_path, index=False, compression="bz2") metrics.to_csv(out / "metrics.csv", index=False) summary.to_csv(out / "summary.csv", index=False) comparisons.to_csv(out / "comparisons.csv", index=False) provenance = { "format": 1, "source": { "path": str(source), "sha256": sha256_file(source), "rows": int(len(frame)), }, "name": args.name, "baseline": args.baseline, "members": [ {"column": column, "normalized_weight": float(weight)} for column, weight in zip(columns, weights) ], "outputs": { "matched_predictions_sha256": sha256_file(predictions_path), }, } with open(out / "provenance.json", "w") as fd: json.dump(provenance, fd, indent=2, sort_keys=True) fd.write("\n") print(summary.loc[summary.score.isin(score_columns)].to_string(index=False)) def main(argv=None): run(parse_args(argv)) return 0 if __name__ == "__main__": raise SystemExit(main()) mhcflurry-2.3.6/scripts/training/summarize_training_stops.py000077500000000000000000000105121525677230600245670ustar00rootroot00000000000000#!/usr/bin/env python """Summarize convergence and early-stopping behavior from saved traces.""" import argparse import json from pathlib import Path import numpy import pandas FIT_KEYS = ( "manifest_path", "model_name", "fit_index", "phase", "fold", "architecture", "replicate", ) def summarize(training_history): """Return per-fit details and condition-level early-stop summaries.""" frame = pandas.read_csv(training_history) required = [*FIT_KEYS, "epoch", "val_loss"] missing = [column for column in required if column not in frame] if missing: raise ValueError( "Training history lacks required column(s): %s" % ", ".join(missing)) frame["condition"] = frame.manifest_path.str.split("/").str[0] details = [] for keys, group in frame.groupby(list(FIT_KEYS), dropna=False, sort=False): group = group.sort_values("epoch") finite = group[numpy.isfinite(group.val_loss)] if finite.empty: continue best_index = finite.val_loss.idxmin() best = group.loc[best_index] final = group.iloc[-1] row = dict(zip(FIT_KEYS, keys)) row.update({ "condition": str(group.condition.iloc[0]), "epoch_count": len(group), "best_epoch": int(best.epoch), "final_epoch": int(final.epoch), "epochs_after_best": int(final.epoch - best.epoch), "best_val_loss": float(best.val_loss), "final_val_loss": float(final.val_loss), "final_minus_best_val_loss": float( final.val_loss - best.val_loss), "relative_final_val_loss_gap": float( (final.val_loss - best.val_loss) / abs(best.val_loss) if best.val_loss else numpy.nan), }) for source, target in ( ("epoch_num_train_batches", "optimizer_steps"), ("epoch_num_train_rows", "training_rows_seen"), ("epoch_train_time", "summed_train_seconds"), ("epoch_total_time", "summed_epoch_seconds"), ): row[target] = ( float(pandas.to_numeric(group[source], errors="coerce").sum()) if source in group else numpy.nan) details.append(row) details = pandas.DataFrame(details) if details.empty: return details, pandas.DataFrame() summaries = [] for (condition, phase), group in details.groupby( ["condition", "phase"], dropna=False, sort=False): summaries.append({ "condition": condition, "phase": phase, "fit_count": len(group), "total_epochs": int(group.epoch_count.sum()), "median_epochs": float(group.epoch_count.median()), "median_best_epoch": float(group.best_epoch.median()), "median_epochs_after_best": float( group.epochs_after_best.median()), "total_optimizer_steps": float(group.optimizer_steps.sum()), "total_training_rows_seen": float(group.training_rows_seen.sum()), "summed_train_seconds": float(group.summed_train_seconds.sum()), "median_relative_final_val_loss_gap": float( group.relative_final_val_loss_gap.median()), "max_relative_final_val_loss_gap": float( group.relative_final_val_loss_gap.max()), }) return details, pandas.DataFrame(summaries) def main(argv=None): """Write per-fit and aggregate convergence tables.""" parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("training_history") parser.add_argument("--out-dir", required=True) args = parser.parse_args(argv) out_dir = Path(args.out_dir) out_dir.mkdir(parents=True, exist_ok=True) details, summary = summarize(args.training_history) details.to_csv(out_dir / "early_stopping_per_fit.csv", index=False) summary.to_csv(out_dir / "early_stopping_summary.csv", index=False) payload = { "training_history": str(Path(args.training_history).resolve()), "fit_count": len(details), "conditions": summary.to_dict(orient="records"), } (out_dir / "early_stopping_summary.json").write_text( json.dumps(payload, indent=2, sort_keys=True) + "\n") print(json.dumps(payload, indent=2, sort_keys=True)) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/verify_affinity_factorial_models.py000066400000000000000000000121051525677230600262110ustar00rootroot00000000000000#!/usr/bin/env python """Verify a completed affinity-factorial model collection.""" import argparse import csv import json from collections import Counter from pathlib import Path import yaml CONTROL_KEYS = ( "data_dependent_initialization_method", "data_dependent_initialization_target", "init", "learning_rate", "minibatch_size", "optimizer", "optimizer_implementation", ) ARCHITECTURE_KEYS = ( "topology", "layer_sizes", "dense_layer_l1_regularization", ) def architecture_signature(hyperparameters): """Return the stable architecture identity used for fold accounting.""" return tuple( tuple(hyperparameters[key]) if isinstance(hyperparameters[key], list) else hyperparameters[key] for key in ARCHITECTURE_KEYS ) def verify(models_dir, hyperparameters_path, num_folds=4): """Raise on missing, shrunken, duplicated, or misconfigured models.""" models_dir = Path(models_dir) expected = yaml.safe_load(Path(hyperparameters_path).read_text()) expected_by_arch = { architecture_signature(hyperparameters): hyperparameters for hyperparameters in expected } if len(expected_by_arch) != len(expected): raise ValueError("Expected hyperparameter YAML has duplicate architectures") with (models_dir / "manifest.csv").open(newline="") as fd: rows = list(csv.DictReader(fd)) expected_count = len(expected) * num_folds if len(rows) != expected_count: raise ValueError( "Expected %d models; found %d" % (expected_count, len(rows)) ) observed = Counter() fold_hashes = {} for row in rows: weights_path = models_dir / ("weights_%s.npz" % row["model_name"]) if not weights_path.is_file(): raise ValueError("Missing weights: %s" % weights_path) config = json.loads(row["config_json"]) actual = config["hyperparameters"] signature = architecture_signature(actual) if signature not in expected_by_arch: raise ValueError("Unexpected architecture: %r" % (signature,)) expected_hyperparameters = expected_by_arch[signature] for key in CONTROL_KEYS: expected_value = expected_hyperparameters.get(key) # The published pan-allele recipe intentionally fine-tunes at one # tenth of the pretraining learning rate. Training serializes that # effective value in the fitted model while the input YAML retains # the pretraining value. This behavior is present in v2.1.x and is # not a recipe mismatch. if ( key == "learning_rate" and expected_hyperparameters.get( "train_data", {}).get("pretrain", False) and expected_value is not None): expected_value /= 10 if actual.get(key) != expected_value: raise ValueError( "%s mismatch for %r: expected %r; found %r" % ( key, signature, expected_value, actual.get(key), ) ) fit_info = config["fit_info"][-1] configured_batch = int(actual["minibatch_size"]) if int(fit_info["effective_minibatch_size"]) != configured_batch: raise ValueError( "Training minibatch shrank for %s: configured %d; effective %s" % ( row["model_name"], configured_batch, fit_info["effective_minibatch_size"], ) ) training_info = fit_info["training_info"] fold = int(training_info["fold_num"]) if int(training_info["num_folds"]) != num_folds: raise ValueError("Wrong fold count for %s" % row["model_name"]) observed[(signature, fold)] += 1 fold_hash = training_info["train_peptide_hash"] previous_hash = fold_hashes.setdefault(fold, fold_hash) if fold_hash != previous_hash: raise ValueError("Training-row hash differs within fold %d" % fold) expected_pairs = { (signature, fold) for signature in expected_by_arch for fold in range(num_folds) } if set(observed) != expected_pairs or set(observed.values()) != {1}: raise ValueError("Architecture/fold coverage is not exactly one each") return { "architecture_count": len(expected), "fold_count": num_folds, "model_count": len(rows), "fold_training_peptide_hashes": fold_hashes, } def main(argv=None): """Run model verification and print its JSON report.""" parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("models_dir") parser.add_argument("hyperparameters") parser.add_argument("--num-folds", type=int, default=4) args = parser.parse_args(argv) print(json.dumps( verify(args.models_dir, args.hyperparameters, args.num_folds), indent=2, sort_keys=True, )) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/training/verify_processing_boundary_compatibility.py000066400000000000000000000070121525677230600300220ustar00rootroot00000000000000#!/usr/bin/env python3 """Compare saved processing predictions with a reference boundary extractor.""" import argparse import ast import hashlib import json from pathlib import Path import subprocess from unittest.mock import patch import numpy import pandas import torch from mhcflurry import Class1ProcessingPredictor from mhcflurry.class1_processing_neural_network import Class1ProcessingModel from mhcflurry.cli.processing_affinity_control import score_risk_sets from mhcflurry.common import configure_pytorch def main(argv=None): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--models", required=True) parser.add_argument("--predictions", required=True) parser.add_argument("--reference-commit", required=True) parser.add_argument("--out", required=True) args = parser.parse_args(argv) repo = Path(__file__).resolve().parents[2] filename = "mhcflurry/class1_processing_neural_network.py" source = subprocess.check_output( ["git", "show", "%s:%s" % (args.reference_commit, filename)], cwd=repo, text=True) model_class = next(node for node in ast.parse(source).body if isinstance(node, ast.ClassDef) and node.name == "Class1ProcessingModel") method = next(node for node in model_class.body if isinstance(node, ast.FunctionDef) and node.name == "_extract_boundary_windows") namespace = {"torch": torch} exec(compile(ast.Module(body=[method], type_ignores=[]), filename, "exec"), namespace) configure_pytorch(backend="cpu", num_threads=2) frame = pandas.read_csv(args.predictions, dtype={"sample_id": str}, low_memory=False) predictor = Class1ProcessingPredictor.load(args.models) if any(model.hyperparameters.get("cleavage_boundary_peptide_length", 0) > frame.peptide.str.len().min() for model in predictor.models): raise ValueError("Reference extractor requires peptide context within every peptide") kwargs = dict(peptides=frame.peptide, n_flanks=frame.n_flank, c_flanks=frame.c_flank) frame["candidate_score"] = predictor.predict(**kwargs) with patch.object(Class1ProcessingModel, "_extract_boundary_windows", namespace["_extract_boundary_windows"]): frame["reference_score"] = predictor.predict(**kwargs) delta = frame.candidate_score.to_numpy() - frame.reference_score.to_numpy() out = Path(args.out) out.mkdir(parents=True, exist_ok=True) frame.to_csv(out / "matched_predictions.csv.bz2", index=False) metrics = score_risk_sets(frame, ["candidate_score", "reference_score"]) metrics.to_csv(out / "metrics.csv", index=False) result = { "arguments": vars(args), "rows": len(frame), "models": len(predictor.models), "max_absolute_difference": float(numpy.abs(delta).max()), "exactly_equal": bool(numpy.array_equal(frame.candidate_score, frame.reference_score)), "reference_source_sha256": hashlib.sha256(source.encode()).hexdigest(), "candidate_source_sha256": hashlib.sha256((repo / filename).read_bytes()).hexdigest(), "input_sha256": hashlib.sha256(Path(args.predictions).read_bytes()).hexdigest(), "model_manifest_sha256": hashlib.sha256((Path(args.models) / "manifest.csv").read_bytes()).hexdigest(), } (out / "verification.json").write_text(json.dumps(result, indent=2) + "\n") print(json.dumps(result, indent=2)) if not result["exactly_equal"]: raise SystemExit("Boundary compatibility check changed predictions") if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/validate_against_public.py000066400000000000000000000311441525677230600224530ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Compare a freshly-trained pan-allele predictor against the public mhcflurry release on a peptide × allele grid. Two levels of comparison are reported: 1. **Affinity** — load each model as a Class1AffinityPredictor and predict IC50 for every (peptide, allele) pair. Spearman measures rank agreement with the public affinity predictor. 2. **Presentation** — load the public Class1PresentationPredictor, then swap its affinity predictor for ours while keeping the public's processing predictors and logistic weights. This isolates how much our affinity change propagates through the full presentation stack. We also tally canonical-allele rank-1 hits and best-allele agreement across random per-peptide 4-subsets of the allele pool. Run: python scripts/validate_against_public.py \\ --ours out/models.unselected.release/ \\ --public "$(mhcflurry downloads path models_class1_pan)/models.combined/" \\ --public-presentation "$(mhcflurry downloads path models_class1_presentation)/models/" """ from __future__ import annotations import argparse import random import sys from pathlib import Path import pandas as pd # Well-characterized peptide / allele binding pairs with source antigen. # SPRWYFYYL (SARS-CoV-2 N protein) dropped: both ours and public rank # B*07:02 over B*35:01 for that peptide (motif at C-term Leu fits B*07, # not B*35), so the canonical label is ambiguous and it penalized both # models equally. KNOWN_BINDERS = [ # peptide, canonical_allele, source antigen ("SLLQHLIGL", "HLA-A*02:01", "HCV NS3 1406-1414"), ("GILGFVFTL", "HLA-A*02:01", "Influenza A M1 58-66"), ("SLYNTVATL", "HLA-A*02:01", "HIV-1 Gag p17 77-85"), ("NLVPMVATV", "HLA-A*02:01", "HCMV pp65 495-503"), ("NYNYLYRLF", "HLA-A*24:02", "HIV-1 Nef 134-142"), ("RYPLTFGWCF", "HLA-A*24:02", "synthetic A*24 probe"), ("VYFFKTNKF", "HLA-A*24:02", "SARS-CoV-2 Spike"), ("TPRVTGGGAM", "HLA-B*07:02", "HCMV pp65 265-274"), ("APRTVALTA", "HLA-B*07:02", "synthetic B*07 probe"), ("IPSINVHHY", "HLA-B*35:01", "EBV EBNA-1 407-417"), ] # All alleles we'll consider. Using each canonical + some distractors # (other MHC class I supertypes) so every peptide has both "should bind" # and "should not bind" options in the grid. ALLELE_POOL = sorted({ "HLA-A*02:01", "HLA-A*24:02", "HLA-B*07:02", "HLA-B*35:01", "HLA-A*03:01", "HLA-A*11:01", # A3 supertype "HLA-B*08:01", "HLA-B*15:01", "HLA-C*07:01", }) def load_affinity_predictor(path: Path): from mhcflurry import Class1AffinityPredictor return Class1AffinityPredictor.load(str(path)) def load_presentation_predictor(path: Path): from mhcflurry import Class1PresentationPredictor return Class1PresentationPredictor.load(str(path)) def swap_affinity_into_presentation(public_presentation, new_affinity): """Build a Class1PresentationPredictor that uses our affinity but keeps the public's processing predictors and logistic weights. This isolates how much our affinity change propagates through the full presentation stack.""" from mhcflurry import Class1PresentationPredictor return Class1PresentationPredictor( affinity_predictor=new_affinity, processing_predictor_with_flanks=public_presentation.processing_predictor_with_flanks, processing_predictor_without_flanks=public_presentation.processing_predictor_without_flanks, weights_dataframe=public_presentation.weights_dataframe, metadata_dataframes=getattr(public_presentation, "metadata_dataframes", None), ) def predict_affinity(pred, peptides, alleles) -> pd.DataFrame: """Tall DataFrame: peptide, allele, affinity_nM. Batches by allele so the full peptide list goes through predict() once per allele. """ rows = [] peptides = list(peptides) for a in alleles: try: affs = pred.predict( peptides=peptides, alleles=[a] * len(peptides), ) except Exception as exc: print(f" [warn] affinity allele={a}: {exc!r}", file=sys.stderr) affs = [float("nan")] * len(peptides) for p, aff in zip(peptides, affs): rows.append({"peptide": p, "allele": a, "affinity_nM": float(aff)}) return pd.DataFrame(rows) def predict_presentation(pred, peptides, alleles) -> pd.DataFrame: """Tall DataFrame: peptide, allele, presentation_score. Uses the without-flanks processing model since our canonical peptide list doesn't carry true source-protein context. Higher = more likely presented.""" rows = [] for a in alleles: try: df = pred.predict(peptides=list(peptides), alleles=[a], verbose=0) except Exception as exc: print(f" [warn] presentation allele={a}: {exc!r}", file=sys.stderr) for p in peptides: rows.append({"peptide": p, "allele": a, "presentation_score": float("nan")}) continue for p in peptides: row_ = df[df["peptide"] == p] if row_.empty: rows.append({"peptide": p, "allele": a, "presentation_score": float("nan")}) else: rows.append({ "peptide": p, "allele": a, "presentation_score": float(row_.iloc[0]["presentation_score"]), }) return pd.DataFrame(rows) def canonical_agreement(df: pd.DataFrame, score_col: str, lower_is_better: bool, label: str) -> int: """For each canonical peptide-allele pair, does the peptide's best scoring allele (lowest affinity or highest presentation score) match the canonical binder?""" wins = 0 ascending = lower_is_better unit_tag = "nM" if score_col == "affinity_nM" else "" for peptide, canonical, antigen in KNOWN_BINDERS: sub = df[df["peptide"] == peptide].sort_values(score_col, ascending=ascending) if sub.empty: continue rank = ( sub["allele"].tolist().index(canonical) + 1 if canonical in sub["allele"].values else -1 ) top = sub.iloc[0] mark = "✓" if top["allele"] == canonical else " " val = top[score_col] val_str = f"{val:.2f} {unit_tag}".strip() if pd.notna(val) else "?" print( f" {mark} {label:8s} {peptide:12s} canonical={canonical:14s} " f"antigen={antigen:28s} rank={rank}/{len(sub):<2} top={top['allele']} ({val_str})" ) if top["allele"] == canonical: wins += 1 return wins def spearman(df_ours: pd.DataFrame, df_public: pd.DataFrame, score_col: str) -> float: from scipy.stats import spearmanr merged = df_ours.merge(df_public, on=["peptide", "allele"], suffixes=("_ours", "_public")) if merged.empty: return float("nan") rho, _ = spearmanr( merged[f"{score_col}_ours"], merged[f"{score_col}_public"], nan_policy="omit", ) return rho def per_sample_random(df: pd.DataFrame, score_col: str, lower_is_better: bool, *, k: int = 4, n_samples: int = 20, seed: int = 17) -> pd.DataFrame: rng = random.Random(seed) ascending = lower_is_better rows = [] for p in df["peptide"].unique(): pdf = df[df["peptide"] == p] alleles = pdf["allele"].tolist() for _ in range(n_samples): subset = rng.sample(alleles, k=min(k, len(alleles))) sdf = pdf[pdf["allele"].isin(subset)].sort_values(score_col, ascending=ascending) if sdf.empty: continue top = sdf.iloc[0] rows.append({ "peptide": p, "subset": ",".join(sorted(subset)), "best_allele": top["allele"], "best_score": float(top[score_col]), }) return pd.DataFrame(rows) def run_comparison(df_ours, df_public, score_col, lower_is_better, block_label): total = len(KNOWN_BINDERS) print() print(f"== {block_label}: canonical allele at rank 1? ==") w_ours = canonical_agreement(df_ours, score_col, lower_is_better, "ours") print() w_public = canonical_agreement(df_public, score_col, lower_is_better, "public") print() print(f"[{block_label}] ours: {w_ours}/{total} canonical pairs with true allele at rank 1") print(f"[{block_label}] public: {w_public}/{total}") rho = spearman(df_ours, df_public, score_col) n_pairs = len(df_ours.merge(df_public, on=["peptide", "allele"])) print(f"[{block_label}] Spearman rank correlation over {n_pairs} (peptide,allele) pairs: {rho:.3f}") print() print(f"== {block_label}: random 4-subset best-allele agreement ==") rand_ours = per_sample_random(df_ours, score_col, lower_is_better) rand_public = per_sample_random(df_public, score_col, lower_is_better) merged = rand_ours.merge(rand_public, on=["peptide", "subset"], suffixes=("_ours", "_public")) if len(merged) == 0: print(f"[{block_label}] best-allele agreement on random 4-subsets: " f"no overlapping (peptide,subset) pairs to compare (skipped)") return merged agree = (merged["best_allele_ours"] == merged["best_allele_public"]).sum() print(f"[{block_label}] best-allele agreement on random 4-subsets: " f"{agree}/{len(merged)} ({agree/len(merged)*100:.0f}%)") return merged def main(): p = argparse.ArgumentParser() p.add_argument("--ours", required=True, help="dir with trained affinity predictor") p.add_argument("--public", required=True, help="dir with public models_class1_pan predictor (models.combined)") p.add_argument("--public-presentation", default=None, help="dir with public models_class1_presentation/models/. " "If given, presentation Spearman is also reported.") args = p.parse_args() peptides = [pep for pep, _, _ in KNOWN_BINDERS] alleles = ALLELE_POOL print(f"[peptides] ({len(peptides)})") for pep, canon, antigen in KNOWN_BINDERS: print(f" {pep:12s} canonical={canon:14s} antigen={antigen}") print(f"[alleles] ({len(alleles)}) {alleles}") print(f"\n[load] ours affinity <- {args.ours}") ours_aff = load_affinity_predictor(Path(args.ours)) print(f"[load] public affinity <- {args.public}") public_aff = load_affinity_predictor(Path(args.public)) print(f"[predict] affinity: {len(peptides)} peptides × {len(alleles)} alleles = " f"{len(peptides)*len(alleles)} pairs, both models") df_aff_ours = predict_affinity(ours_aff, peptides, alleles) df_aff_public = predict_affinity(public_aff, peptides, alleles) out = Path("out/validation") out.mkdir(parents=True, exist_ok=True) merged_aff = run_comparison(df_aff_ours, df_aff_public, "affinity_nM", True, "AFFINITY") df_aff_ours.to_csv(out / "preds_affinity_ours.csv", index=False) df_aff_public.to_csv(out / "preds_affinity_public.csv", index=False) merged_aff.to_csv(out / "subset_agreement_affinity.csv", index=False) if args.public_presentation: print(f"\n[load] public presentation <- {args.public_presentation}") public_pres = load_presentation_predictor(Path(args.public_presentation)) ours_pres = swap_affinity_into_presentation(public_pres, ours_aff) print(f"[predict] presentation: {len(peptides)} peptides × {len(alleles)} alleles, " f"both models (without flanks — canonical peptide list has no true " f"source-protein flanking context)") df_pres_ours = predict_presentation(ours_pres, peptides, alleles) df_pres_public = predict_presentation(public_pres, peptides, alleles) merged_pres = run_comparison( df_pres_ours, df_pres_public, "presentation_score", False, "PRESENTATION" ) df_pres_ours.to_csv(out / "preds_presentation_ours.csv", index=False) df_pres_public.to_csv(out / "preds_presentation_public.csv", index=False) merged_pres.to_csv(out / "subset_agreement_presentation.csv", index=False) print(f"\n[saved] prediction + agreement tables under {out}/") if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/validate_allele_sequences.py000066400000000000000000000236471525677230600230110ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Validate that allele name -> pseudosequence mappings are consistent. Checks: 1. The raw pseudosequence CSV from the standalone allele_sequences download is loaded identically by both the current code and a from-scratch parse. 2. The renormalization step (mhcgnomes) in Class1AffinityPredictor.load() produces a deterministic mapping with no collisions or lost alleles. 3. The downloaded model artifact's own pseudosequence CSV is internally consistent. It may intentionally differ from the standalone download. 4. Every allele used in the fixture CSV resolves to a sequence. Usage: python scripts/validate_allele_sequences.py """ import os import sys import pandas as pd from mhcflurry import Class1AffinityPredictor from mhcflurry.common import normalize_allele_name from mhcflurry.downloads import configure, get_path, get_default_class1_models_dir from mhcflurry.pseudosequences import LEGACY_ALLELE_SEQUENCES_FILENAME def load_raw_csv(path): """Load a pseudosequence CSV exactly as on disk (no renormalization).""" return pd.read_csv(path, index_col=0).iloc[:, 0].to_dict() def renormalize(raw_mapping): """ Apply the same renormalization that Class1AffinityPredictor.load() does. Returns (renormalized_dict, skipped_list, collision_list). """ renormalized = {} skipped = [] collisions = [] for name, sequence in raw_mapping.items(): normalized = normalize_allele_name(name, raise_on_error=False) if normalized is None: skipped.append(name) continue if normalized in renormalized and name != normalized: collisions.append((name, normalized)) continue renormalized[normalized] = sequence return renormalized, skipped, collisions def main(): configure() errors = [] # --- 1. Load the standalone allele_sequences download --- print("=" * 70) print("1. Loading standalone allele_sequences download") print("=" * 70) standalone_csv = get_path( "allele_sequences", LEGACY_ALLELE_SEQUENCES_FILENAME) standalone_raw = load_raw_csv(standalone_csv) print(" Raw entries: %d" % len(standalone_raw)) standalone_norm, standalone_skipped, standalone_collisions = renormalize( standalone_raw) print(" After renormalization: %d entries" % len(standalone_norm)) print(" Skipped (unparseable): %d" % len(standalone_skipped)) print(" Collisions (duplicate after renorm): %d" % len( standalone_collisions)) if standalone_skipped: print(" Skipped names (first 20): %s" % standalone_skipped[:20]) # --- 2. Load from the predictor (goes through the same renorm logic) --- print() print("=" * 70) print("2. Loading allele_to_sequence from Class1AffinityPredictor.load()") print("=" * 70) models_dir = get_default_class1_models_dir() predictor = Class1AffinityPredictor.load(models_dir) predictor_seq = predictor.allele_to_sequence print(" Entries: %d" % len(predictor_seq)) # --- 3. Load the raw CSV from the models directory --- print() print("=" * 70) print("3. Loading raw CSV from models directory") print("=" * 70) models_csv = os.path.join(models_dir, LEGACY_ALLELE_SEQUENCES_FILENAME) models_raw = load_raw_csv(models_csv) print(" Raw entries: %d" % len(models_raw)) models_norm, models_skipped, models_collisions = renormalize(models_raw) print(" After renormalization: %d entries" % len(models_norm)) print(" Skipped: %d" % len(models_skipped)) print(" Collisions: %d" % len(models_collisions)) # --- 4. Compare predictor mapping vs models dir renormalized --- print() print("=" * 70) print("4. Comparing predictor.allele_to_sequence vs models-dir renormalized") print("=" * 70) pred_keys = set(predictor_seq.keys()) model_keys = set(models_norm.keys()) only_pred = pred_keys - model_keys only_model = model_keys - pred_keys common = pred_keys & model_keys print(" In predictor only: %d" % len(only_pred)) print(" In models-dir renorm only: %d" % len(only_model)) print(" In common: %d" % len(common)) mismatched = [] for k in sorted(common): if predictor_seq[k] != models_norm[k]: mismatched.append(k) if mismatched: print(" MISMATCH in %d alleles:" % len(mismatched)) for k in mismatched[:20]: print(" %s:" % k) print(" predictor: %s" % predictor_seq[k]) print(" models: %s" % models_norm[k]) errors.append( "Predictor vs models-dir mismatch: %d alleles" % len(mismatched)) else: print(" All %d common alleles have identical sequences." % len(common)) # --- 5. Compare models-dir vs standalone download (informational) --- # The models ship with their own allele_sequences.csv which may use a # different pseudosequence definition than the standalone download. # Differences here are expected and not an error. print() print("=" * 70) print("5. Comparing models-dir vs standalone allele_sequences download") print(" (informational — different pseudosequence versions are expected)") print("=" * 70) model_keys_set = set(models_norm.keys()) standalone_keys_set = set(standalone_norm.keys()) only_models = model_keys_set - standalone_keys_set only_standalone = standalone_keys_set - model_keys_set common2 = model_keys_set & standalone_keys_set print(" In models only: %d" % len(only_models)) print(" In standalone only: %d" % len(only_standalone)) print(" In common: %d" % len(common2)) mismatched2 = [] for k in sorted(common2): if models_norm[k] != standalone_norm[k]: mismatched2.append(k) if mismatched2: same_len = all( len(models_norm[k]) == len(standalone_norm[k]) for k in mismatched2) print(" Different sequences: %d / %d (same length: %s)" % ( len(mismatched2), len(common2), same_len)) print(" (This is expected if pseudosequence positions differ.)") else: print(" All %d common alleles have identical sequences." % len( common2)) # --- 6. Validate fixture alleles --- print() print("=" * 70) print("6. Validating fixture alleles resolve to sequences") print("=" * 70) fixture_csv = os.path.join( os.path.dirname(__file__), os.pardir, "test", "data", "master_released_class1_presentation_highscore_rows.csv.gz", ) if os.path.exists(fixture_csv): fixture_df = pd.read_csv(fixture_csv, keep_default_na=False) fixture_alleles = fixture_df["allele"].unique() print(" Fixture alleles: %d" % len(fixture_alleles)) missing = [] for allele in sorted(fixture_alleles): normalized = normalize_allele_name(allele, raise_on_error=False) if normalized is None: missing.append((allele, "failed to normalize")) elif normalized not in predictor_seq: missing.append((allele, "normalized to '%s' but not in predictor" % normalized)) if missing: print(" MISSING %d fixture alleles:" % len(missing)) for allele, reason in missing: print(" %s: %s" % (allele, reason)) errors.append("Missing fixture alleles: %d" % len(missing)) else: print(" All %d fixture alleles resolve correctly." % len( fixture_alleles)) else: print(" Fixture CSV not found, skipping.") # --- 7. Verify normalize_allele_name is deterministic --- print() print("=" * 70) print("7. Verifying normalize_allele_name determinism (sample of 1000)") print("=" * 70) sample_alleles = sorted(predictor_seq.keys())[:1000] nondeterministic = [] for allele in sample_alleles: n1 = normalize_allele_name(allele, raise_on_error=False) n2 = normalize_allele_name(allele, raise_on_error=False) if n1 != n2: nondeterministic.append((allele, n1, n2)) if nondeterministic: print(" NON-DETERMINISTIC: %d alleles" % len(nondeterministic)) errors.append("Non-deterministic normalization: %d" % len( nondeterministic)) else: print(" All 1000 sampled alleles normalize deterministically.") # --- 8. Check idempotency: normalize(normalize(x)) == normalize(x) --- print() print("=" * 70) print("8. Checking normalize idempotency (sample of 1000)") print("=" * 70) non_idempotent = [] for allele in sample_alleles: n1 = normalize_allele_name(allele, raise_on_error=False) if n1 is None: continue n2 = normalize_allele_name(n1, raise_on_error=False) if n1 != n2: non_idempotent.append((allele, n1, n2)) if non_idempotent: print(" NON-IDEMPOTENT: %d alleles" % len(non_idempotent)) for allele, n1, n2 in non_idempotent[:10]: print(" %s -> %s -> %s" % (allele, n1, n2)) errors.append("Non-idempotent normalization: %d" % len( non_idempotent)) else: print(" All sampled alleles normalize idempotently.") # --- Summary --- print() print("=" * 70) if errors: print("ERRORS FOUND:") for e in errors: print(" - %s" % e) sys.exit(1) else: print("ALL CHECKS PASSED") sys.exit(0) if __name__ == "__main__": main() mhcflurry-2.3.6/scripts/validate_presentation_with_flanks.py000066400000000000000000000235501525677230600245750ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Compare trained ensemble vs public mhcflurry on 10 peptides with their real source-protein flanks. This is a small prediction-agreement check, not an accuracy benchmark. What this script does: 1. For each of 10 well-characterized epitopes (incl. SLLQHLIGL in PRAME, A*02:01 + A*24:02 coverage), look up the peptide in uniprot_proteins and extract real N- and C-terminal 10-AA flanks from the source protein. Falls back to empty flanks when a peptide isn't found. 2. Predict presentation scores with both our ensemble and the public ensemble, on (peptide, allele, n_flank, c_flank) tuples for a small allele pool. 3. Report Spearman rank correlation overall, per peptide, and the canonical-allele rank check (is the peptide's best-scoring allele the one the literature says binds?). Run: python scripts/validate_presentation_with_flanks.py \\ --ours /path/to/models.combined/ \\ --public "$(mhcflurry downloads path models_class1_presentation)/models/" """ from __future__ import annotations import argparse import sys from pathlib import Path import pandas as pd from scipy.stats import spearmanr # 10 peptides: A*02:01 (4), A*24:02 (3), B*07:02/B*35:01 (3). # Canonical allele is the literature-cited binder; we still predict over # the full ALLELE_POOL to check ranking behavior. PEPTIDES = [ # peptide, canonical_allele, source_antigen_comment ("SLLQHLIGL", "HLA-A*02:01", "PRAME (melanoma preferentially expressed)"), ("GILGFVFTL", "HLA-A*02:01", "Influenza A M1 58-66"), ("SLYNTVATL", "HLA-A*02:01", "HIV-1 Gag p17 77-85"), ("NLVPMVATV", "HLA-A*02:01", "HCMV pp65 495-503"), ("NYNYLYRLF", "HLA-A*24:02", "HIV-1 Nef 134-142"), ("VYFFKTNKF", "HLA-A*24:02", "SARS-CoV-2 Spike"), ("RYPLTFGWCF", "HLA-A*24:02", "synthetic A*24 probe"), ("TPRVTGGGAM", "HLA-B*07:02", "HCMV pp65 265-274"), ("IPSINVHHY", "HLA-B*35:01", "EBV EBNA-1 407-417"), ("KAFSPEVIPMF", "HLA-B*57:01", "HIV-1 Gag KF11"), ] ALLELE_POOL = [ "HLA-A*02:01", "HLA-A*24:02", "HLA-B*07:02", "HLA-B*35:01", "HLA-B*57:01", "HLA-A*03:01", "HLA-C*07:01", ] FLANK_SIZE = 10 # AAs on each side def lookup_flanks(peptides): """Return dict peptide -> (n_flank, c_flank, source_id) for each peptide. Uses mhcflurry's bundled uniprot_proteins.csv.bz2. Searches every protein for the peptide; takes the first protein that contains it. Returns empty flanks if not found. """ try: from mhcflurry.downloads import get_path path = get_path("data_references", "uniprot_proteins.csv.bz2") except Exception as exc: print(f"[warn] uniprot_proteins reference not available: {exc}", file=sys.stderr) return {p: ("", "", "N/A") for p in peptides} df = pd.read_csv(path) seqs = df[["gene_name", "accession", "seq"]].dropna(subset=["seq"]) result = {} for pep in peptides: found = False for _, row in seqs.iterrows(): seq = str(row["seq"]) idx = seq.find(pep) if idx >= 0: n = seq[max(0, idx - FLANK_SIZE):idx] c = seq[idx + len(pep): idx + len(pep) + FLANK_SIZE] source = f"{row['gene_name']}/{row['accession']}" result[pep] = (n, c, source) found = True break if not found: result[pep] = ("", "", "NOT_FOUND") return result def load_predictor(path): from mhcflurry import Class1PresentationPredictor return Class1PresentationPredictor.load(str(path)) def predict_all(predictor, peptides, flanks, alleles): """Predict presentation with flanks for each (peptide, allele) pair. Uses Class1PresentationPredictor.predict with explicit n_flanks/c_flanks. Returns tall DataFrame: peptide, allele, n_flank, c_flank, score. """ rows = [] for allele in alleles: peps = [p for p, _, _ in PEPTIDES] n_flanks = [flanks[p][0] for p in peps] c_flanks = [flanks[p][1] for p in peps] try: df = predictor.predict( peptides=peps, alleles=[allele], n_flanks=n_flanks, c_flanks=c_flanks, verbose=0, ) except Exception as exc: print(f" [warn] {allele}: {exc!r}", file=sys.stderr) for p in peps: rows.append({ "peptide": p, "allele": allele, "n_flank": flanks[p][0], "c_flank": flanks[p][1], "score": float("nan"), }) continue for p in peps: sub = df[df["peptide"] == p] score = float(sub.iloc[0]["presentation_score"]) if not sub.empty else float("nan") rows.append({ "peptide": p, "allele": allele, "n_flank": flanks[p][0], "c_flank": flanks[p][1], "score": score, }) return pd.DataFrame(rows) def spearman_all(ours, public): """Overall Spearman on (peptide, allele, score).""" merged = ours.merge( public, on=["peptide", "allele"], suffixes=("_ours", "_public") ) if merged.empty: return float("nan"), 0 rho, _ = spearmanr( merged["score_ours"], merged["score_public"], nan_policy="omit" ) return rho, len(merged) def spearman_per_peptide(ours, public): """Spearman per peptide (across the 7 alleles). Captures within-peptide ranking agreement — the signal most relevant for ranking likely presenters of a given epitope.""" merged = ours.merge( public, on=["peptide", "allele"], suffixes=("_ours", "_public") ) rows = [] for p, grp in merged.groupby("peptide"): if len(grp) < 3: rows.append({"peptide": p, "n_alleles": len(grp), "spearman": float("nan")}) continue rho, _ = spearmanr( grp["score_ours"], grp["score_public"], nan_policy="omit" ) rows.append({"peptide": p, "n_alleles": len(grp), "spearman": rho}) return pd.DataFrame(rows) def canonical_ranks(df, label): """For each peptide, is the canonical allele ranked #1 by score?""" wins = 0 for pep, canonical, antigen in PEPTIDES: sub = df[df["peptide"] == pep].sort_values("score", ascending=False) if sub.empty: continue top_allele = sub.iloc[0]["allele"] rank = ( sub["allele"].tolist().index(canonical) + 1 if canonical in sub["allele"].values else -1 ) ok = "✓" if top_allele == canonical else " " score = sub.iloc[0]["score"] print(f" {ok} {label:6s} {pep:12s} canonical={canonical:14s}" f" top={top_allele:14s} (score={score:.3f}) rank={rank}" f" [{antigen}]") if top_allele == canonical: wins += 1 return wins def main(): ap = argparse.ArgumentParser() ap.add_argument("--ours", required=True, help="Dir with trained Class1PresentationPredictor") ap.add_argument("--public", required=True, help="Dir with public Class1PresentationPredictor") ap.add_argument("--out-dir", default="out/validation_with_flanks") args = ap.parse_args() out = Path(args.out_dir) out.mkdir(parents=True, exist_ok=True) peptides = [p for p, _, _ in PEPTIDES] print(f"[flanks] looking up source-protein flanks for {len(peptides)} peptides...") flanks = lookup_flanks(peptides) for p, canon, antigen in PEPTIDES: n, c, src = flanks[p] print(f" {p:12s} N={n or '(empty)':10s} C={c or '(empty)':10s} src={src}") print(f"\n[load] ours <- {args.ours}") ours = load_predictor(Path(args.ours)) print(f"[load] public <- {args.public}") public = load_predictor(Path(args.public)) print(f"\n[predict] {len(peptides)} peptides × {len(ALLELE_POOL)} alleles = " f"{len(peptides) * len(ALLELE_POOL)} pairs, each model") df_ours = predict_all(ours, peptides, flanks, ALLELE_POOL) df_public = predict_all(public, peptides, flanks, ALLELE_POOL) df_ours.to_csv(out / "preds_ours.csv", index=False) df_public.to_csv(out / "preds_public.csv", index=False) # Overall Spearman rho, n = spearman_all(df_ours, df_public) print(f"\n[overall] Spearman rank correlation (peptide×allele, n={n}): {rho:.3f}") # Per-peptide Spearman per_pep = spearman_per_peptide(df_ours, df_public) per_pep.to_csv(out / "spearman_per_peptide.csv", index=False) print("\n[per-peptide] within-peptide Spearman (across alleles):") for _, row in per_pep.iterrows(): rho_str = f"{row['spearman']:.3f}" if pd.notna(row["spearman"]) else "NaN" print(f" {row['peptide']:12s} n_alleles={row['n_alleles']} rho={rho_str}") print(f"\n[per-peptide] mean Spearman: {per_pep['spearman'].mean():.3f}") # Canonical-allele ranking print("\n[canonical] is the canonical allele the top-scoring one?") w_ours = canonical_ranks(df_ours, "ours") print() w_public = canonical_ranks(df_public, "public") print(f"\n[canonical] ours: {w_ours}/{len(PEPTIDES)}") print(f"[canonical] public: {w_public}/{len(PEPTIDES)}") print(f"\n[saved] predictions + spearman under {out}/") if __name__ == "__main__": main() mhcflurry-2.3.6/setup.py000066400000000000000000000100321525677230600152600ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os import logging import re from setuptools import find_packages, setup readme_dir = os.path.dirname(__file__) readme_filename = os.path.join(readme_dir, "README.md") try: with open(readme_filename, "r") as f: readme = f.read() except: logging.warning("Failed to load %s" % readme_filename) readme = "" with open("mhcflurry/version.py", "r") as f: version = re.search( r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', f.read(), re.MULTILINE ).group(1) if __name__ == "__main__": required_packages = [ "pandas>=2.0", "appdirs", "ahocorasick-rs", "scikit-learn", "threadpoolctl", "matplotlib", "mhcgnomes>=3.33.6", "numpy>=1.22.4", "pyyaml", "tqdm", "torch>=2.0.0", ] setup( name="mhcflurry", version=version, description="MHC Binding Predictor", author="Tim O'Donnell and Alex Rubinsteyn", author_email="timodonnell@gmail.com", url="https://github.com/openvax/mhcflurry", license="Apache-2.0", entry_points={ "console_scripts": [ "mhcflurry = mhcflurry.cli.main:main", "mhcflurry-downloads = mhcflurry.cli.downloads_command:run", "mhcflurry-pseudosequences = mhcflurry.pseudosequences:main", "mhcflurry-predict = mhcflurry.cli.predict_command:run", "mhcflurry-predict-scan = mhcflurry.cli.predict_scan_command:run", "mhcflurry-class1-train-allele-specific-models = " "mhcflurry.cli.train_allele_specific_models_command:run", "mhcflurry-class1-train-pan-allele-models = " "mhcflurry.cli.train_pan_allele_models_command:run", "mhcflurry-class1-train-processing-models = " "mhcflurry.cli.train_processing_models_command:run", "mhcflurry-class1-select-allele-specific-models = " "mhcflurry.cli.select_allele_specific_models_command:run", "mhcflurry-class1-select-pan-allele-models = " "mhcflurry.cli.select_pan_allele_models_command:run", "mhcflurry-class1-select-processing-models = " "mhcflurry.cli.select_processing_models_command:run", "mhcflurry-calibrate-percentile-ranks = " "mhcflurry.cli.calibrate_percentile_ranks_command:run", "mhcflurry-class1-train-presentation-models = " "mhcflurry.cli.train_presentation_models_command:run", "_mhcflurry-cluster-worker-entry-point = " "mhcflurry.cluster_parallelism:worker_entry_point", ] }, python_requires=">=3.10", classifiers=[ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Operating System :: OS Independent", "Intended Audience :: Science/Research", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Scientific/Engineering :: Bio-Informatics", ], package_data={ "mhcflurry": ["downloads.yml"], }, install_requires=required_packages, long_description=readme, long_description_content_type="text/markdown", packages=find_packages(include=["mhcflurry", "mhcflurry.*"]), ) mhcflurry-2.3.6/test-environment.yml000066400000000000000000000001551525677230600176170ustar00rootroot00000000000000name: test-environment channels: - conda-forge - defaults dependencies: - pip>=23.3 - setuptools>=68 mhcflurry-2.3.6/test/000077500000000000000000000000001525677230600145315ustar00rootroot00000000000000mhcflurry-2.3.6/test/__init__.py000066400000000000000000000116441525677230600166500ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Utility functions for tests. """ import os import sys import time def data_path(name): """ Return the absolute path to a file in the test/data directory. The name specified should be relative to test/data. """ return os.path.join(os.path.dirname(__file__), "data", name) def initialize(): """ Initialize logging and PyTorch, numpy, and python random seeds. """ import logging logging.getLogger("matplotlib").disabled = True import numpy import random import torch seed = int(os.environ.get("MHCFLURRY_TEST_SEED", "1")) if seed == 0: # Enable nondeterminism seed = int(time.time()) print("Using random seed", seed) # Set seeds for reproducibility numpy.random.seed(seed) random.seed(seed) torch.manual_seed(seed) if torch.cuda.is_available(): torch.cuda.manual_seed_all(seed) # Enable deterministic operations where possible torch.use_deterministic_algorithms(False) # Some ops don't have deterministic impl def _torch_device_available(torch, device_type): """Return (available, reason) for a non-CPU torch device.""" if device_type == "cuda" and not torch.cuda.is_available(): return False, "torch.cuda.is_available() returned false" if device_type == "mps": if not hasattr(torch.backends, "mps"): return False, "torch.backends.mps is missing" if not torch.backends.mps.is_built(): return False, "torch.backends.mps.is_built() returned false" if not torch.backends.mps.is_available(): reason = "torch.backends.mps.is_available() returned false" if os.path.basename(sys.argv[0]) == "pytest": reason += ( "; on this macOS/PyTorch setup the pytest console script " "can hide MPS while `python -m pytest` can exercise it" ) return False, reason try: torch.empty(1, device=device_type) except Exception as e: return False, "%s allocation failed: %s" % ( device_type, str(e).splitlines()[0]) return True, None def _accelerator_skip_param(reason): import pytest return pytest.param( "unavailable", "unavailable", marks=pytest.mark.skip(reason=reason), ) def available_torch_accelerators(): """ Return available non-CPU torch backends as (mhcflurry backend, torch device). Set MHCFLURRY_TEST_ACCELERATORS to a comma-separated list such as "mps" or "gpu,mps" to require specific accelerator coverage. If PyTorch cannot use a requested device in the pytest collection process, collection fails loudly instead of silently skipping accelerator assertions. """ import torch candidates = { "gpu": ("gpu", "cuda"), "cuda": ("gpu", "cuda"), "mps": ("mps", "mps"), } requested = os.environ.get("MHCFLURRY_TEST_ACCELERATORS", "").strip() if requested: backends = [] failures = [] for item in requested.split(","): name = item.strip().lower() if not name: continue if name not in candidates: failures.append("%s is not one of: gpu, cuda, mps" % item) continue backend, device_type = candidates[name] available, reason = _torch_device_available(torch, device_type) if available: backends.append((backend, device_type)) else: failures.append("%s requested but unavailable: %s" % ( name, reason)) if failures: raise RuntimeError( "MHCFLURRY_TEST_ACCELERATORS could not be satisfied: %s" % "; ".join(failures)) if backends: return backends raise RuntimeError("MHCFLURRY_TEST_ACCELERATORS was empty after parsing") backends = [] diagnostics = [] for backend, device_type in (("gpu", "cuda"), ("mps", "mps")): available, reason = _torch_device_available(torch, device_type) if available: backends.append((backend, device_type)) else: diagnostics.append("%s: %s" % (device_type, reason)) if not backends: return [_accelerator_skip_param( "No non-CPU torch accelerator available during pytest collection " "(%s)" % "; ".join(diagnostics))] return backends mhcflurry-2.3.6/test/conftest.py000066400000000000000000000064521525677230600167370ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Pytest configuration and session-wide initialization. """ import pytest from . import initialize # Ensure deterministic test setup without per-file initialize() calls. initialize() from mhcflurry.common import configure_pytorch # noqa: E402 # Unit tests default to CPU for speed and determinism. Tests that exercise # CUDA/MPS opt into those backends explicitly. configure_pytorch(backend="cpu") @pytest.fixture(autouse=True) def _default_pytorch_backend_cpu(): configure_pytorch(backend="cpu") yield configure_pytorch(backend="cpu") @pytest.fixture(scope="session") def released_allele_specific_predictor(): from mhcflurry import Class1AffinityPredictor from mhcflurry.downloads import get_path return Class1AffinityPredictor.load(get_path("models_class1", "models")) @pytest.fixture(scope="session") def released_pan_allele_predictor(): from mhcflurry import Class1AffinityPredictor from mhcflurry.downloads import get_path return Class1AffinityPredictor.load( get_path("models_class1_pan", "models.combined")) @pytest.fixture(scope="session") def released_pan_allele_predictor_two_models(): from mhcflurry import Class1AffinityPredictor from mhcflurry.downloads import get_path return Class1AffinityPredictor.load( get_path("models_class1_pan", "models.combined"), max_models=2) @pytest.fixture(scope="session") def released_affinity_predictors( released_allele_specific_predictor, released_pan_allele_predictor): return { "allele-specific": released_allele_specific_predictor, "pan-allele": released_pan_allele_predictor, } @pytest.fixture(scope="session") def released_affinity_predictors_two_pan_models( released_allele_specific_predictor, released_pan_allele_predictor_two_models): return { "allele-specific": released_allele_specific_predictor, "pan-allele": released_pan_allele_predictor_two_models, } def pytest_configure(config): # Register custom marks used across tests. config.addinivalue_line("markers", "slow: marks tests as slow") config.addinivalue_line( "markers", "integration: marks end-to-end command/training tests", ) config.addinivalue_line( "markers", "downloads: marks tests that require locally cached MHCflurry bundles", ) # PyTorch warns that padding='same' with even kernels may allocate a # temporary padded copy. This is expected for our processing defaults. config.addinivalue_line( "filterwarnings", ( "ignore:Using padding='same' with even kernel lengths and odd " "dilation may require a zero-padded copy of the input be created.*:" "UserWarning:torch\\.nn\\.modules\\.conv" ), ) mhcflurry-2.3.6/test/data/000077500000000000000000000000001525677230600154425ustar00rootroot00000000000000mhcflurry-2.3.6/test/data/data_10mer.csv000066400000000000000000000000511525677230600200700ustar00rootroot00000000000000peptide,mhc,meas AAAAAAAAAA,HLA-A0201,400mhcflurry-2.3.6/test/data/data_8mer.csv000066400000000000000000000000471525677230600200240ustar00rootroot00000000000000peptide,mhc,meas AAAAAAAA,HLA-A0201,400mhcflurry-2.3.6/test/data/data_9mer.csv000066400000000000000000000000501525677230600200170ustar00rootroot00000000000000peptide,mhc,meas AAAAAAAAA,HLA-A0201,400mhcflurry-2.3.6/test/data/example.fasta000066400000000000000000000007551525677230600201240ustar00rootroot00000000000000>QHN73810.1 surface glycoprotein [Severe acute respiratory syndrome coronavirus 2] prefix MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVfrssVLHSTQDLFLPFFSNVTWFHAIHV SGTNGTKRFDNPVLPFNDGVYFASTEKSNIIRGWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPF LGVYYHKNNKSWMESEFRVYSSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPI >protein1 MDSKGSSQKGSRLLLLLVVSNLLLCQGVVSTPVCPNGPGNCQV EMFNEFDKRYAQGKGFITMALNSCHTSSLPTPEDKEQAQQTHH >protein2 VTEVRGMKGAPDAILSRAIEIEEENKRLLEGMEMIFGQVIPGA ARYSAFYNLLHCLRRDSSKIDTYLKLLNCRIIYNNNC mhcflurry-2.3.6/test/data/hpv_predictions.csv000066400000000000000000002031741525677230600213660ustar00rootroot00000000000000allele,peptide,Length,Affinity (uM),Binding Capacity,Status,Security,affinity,netmhcpan3,netmhcpan4,netmhc,MHCflurry 1.2.0,MHCflurry (train MS),MHCflurry (no MS) HLA-A*02:01,LMGTLGIVCPI,11,0.29,strong,novel,CONFIDENTIAL,290.0,261.8,214.5,248.47,167.22380960425482,74.84751152620106,301.93403988869073 HLA-A*02:01,RTLEDLLMGTL,11,1.95,strong,novel,CONFIDENTIAL,1950.0,3836.9,2582.2,3257.01,2830.2157958268767,2188.9538132772736,2132.3345643653206 HLA-A*02:01,MGTLGIVCPI,10,2.01,strong,novel,CONFIDENTIAL,2010.0,322.0,296.3,393.31,7561.020273281272,7718.081462632219,4225.447860121435 HLA-A*02:01,YMLDLQPETTD,11,2.83,strong,novel,CONFIDENTIAL,2830.0,11400.9,9155.6,4351.54,6287.6952523646105,9355.44304469742,5658.571030354306 HLA-A*02:01,FQDPQERPI,9,3.36,strong,novel,CONFIDENTIAL,3360.0,2044.2,2257.7,1166.07,735.5087046488492,1298.7161222243133,1665.7433194119546 HLA-A*02:01,TTIHEIILECV,11,3.57,strong,novel,CONFIDENTIAL,3570.0,8613.5,4527.0,3024.93,2554.8469340269025,1810.7353167190304,1699.1128317557593 HLA-A*02:01,KLPDLCTELQT,11,3.9,strong,novel,CONFIDENTIAL,3900.0,11935.0,6485.2,6742.69,1493.95057048418,2041.3286363075747,3488.3542353067187 HLA-A*02:01,TIHEIILECV,10,6.61,intermediate,novel,CONFIDENTIAL,6610.0,451.8,408.9,259.31,1428.0179037333828,698.7850153544011,1037.8827485898053 HLA-A*02:01,TIHEIRLECV,10,8.62,intermediate,novel,CONFIDENTIAL,8620.0,2086.4,1587.4,1719.29,2623.970703334057,1942.8046329664567,2620.8693158569736 HLA-A*02:01,YMLDLQPE,8,9.69,intermediate,novel,CONFIDENTIAL,9690.0,7303.5,8102.5,5042.35,782.0608447431365,981.9365057280755,2292.0327441099435 HLA-A*02:01,ELQTTIHEI,9,10.61,intermediate,novel,CONFIDENTIAL,10610.0,2957.5,2929.5,1769.68,2295.581304708852,1796.3302915309757,2763.6730228020515 HLA-A*02:01,EDLLMGTLGIV,11,12.07,intermediate,novel,CONFIDENTIAL,12070.0,1599.5,1510.9,971.14,14678.11653386876,18844.65527176244,11576.74126684321 HLA-A*02:01,TTIHEIRLECV,11,14.01,intermediate,novel,CONFIDENTIAL,14010.0,17971.1,12699.0,10173.59,5309.987246377647,3922.455924078571,6448.9484310722155 HLA-A*02:01,FQDPQERPIKL,11,14.03,intermediate,novel,CONFIDENTIAL,14030.0,11214.0,6086.6,8579.48,2232.255948165024,2319.270770821285,5867.236637410394 HLA-A*02:01,KLPQLCTELQT,11,27.145,weak,novel,CONFIDENTIAL,27145.0,16616.3,8531.1,10551.05,4005.921189159136,5135.113451729935,7277.304901511617 HLA-A*02:01,RYYCYSVYGT,10,28.2,weak,novel,CONFIDENTIAL,28200.0,13147.0,15049.1,18721.52,9613.502999977934,9152.728921945634,9621.349989269409 HLA-A*02:01,YRYYCYSV,8,29.43,weak,novel,CONFIDENTIAL,29430.0,22112.3,19446.0,9128.42,906.80060226134,659.7409889715294,2156.7317840689675 HLA-A*02:01,YRYYCYSL,8,32.78,weak,novel,CONFIDENTIAL,32780.0,23243.3,20212.7,14919.58,2964.261133692841,2320.4297748900585,6774.905546806434 HLA-A*02:01,TTIHDIILECV,11,35.72063432,weak,novel,CONFIDENTIAL,35720.63432,7569.3,3945.1,3483.89,1682.8116357450924,999.0395725488116,859.2392689717731 HLA-A*02:01,LLMGTLGIVCP,11,47.53,weak,novel,CONFIDENTIAL,47530.0,3969.1,2993.6,3239.61,4453.276686751863,5139.813945807773,3630.920394105956 HLA-A*02:01,ILECVYCKQQL,11,48.75666667,weak,novel,CONFIDENTIAL,48756.66667,5305.8,4136.1,8507.65,4865.669632619836,7471.308350302104,6224.036410094804 HLA-A*02:01,IRTLEDLLMGT,11,54.56,weak,novel,CONFIDENTIAL,54560.0,9448.4,5149.0,8339.86,15749.863216740647,17063.417773345544,12394.628341531134 HLA-A*02:01,MLDLQPET,8,59.36,weak,novel,CONFIDENTIAL,59360.0,9487.8,11631.9,4072.64,4314.772648482042,4568.488501987155,7890.133873821171 HLA-A*02:01,KISEYRYYCYS,11,65.6,weak,novel,CONFIDENTIAL,65600.0,21152.4,18205.2,25066.62,7743.224282745778,8249.90329061251,7770.289216385544 HLA-A*02:01,SEYRYYCYSV,10,76.64,weak,novel,CONFIDENTIAL,76640.0,6925.8,7485.7,6255.27,1083.5856435034402,1243.166012373093,2682.1753853576192 HLA-A*02:01,SEYRYYCYSL,10,78.22,weak,novel,CONFIDENTIAL,78220.0,12376.5,14030.9,11628.92,3409.681674777167,3911.731710904121,7951.765029734319 HLA-A*02:01,TIHEIILEC,9,82.01,weak,novel,CONFIDENTIAL,82010.0,3635.3,3470.3,3629.49,7046.813797831271,6971.597573231845,8045.3140793790035 HLA-A*02:01,DLLMGTLGIVC,11,83.34,weak,novel,CONFIDENTIAL,83340.0,5638.5,10687.9,2747.2,8054.668925826633,11427.961477186245,2380.608862941643 HLA-A*01:01,CTELQTTIH,9,1.4,strong,novel,CONFIDENTIAL,1400.0,1036.7,2136.9,6705.74,1528.1812706714318,1429.5692489150265,2060.9423819981425 HLA-A*01:01,DLQPETTDLY,10,1.77,strong,novel,CONFIDENTIAL,1770.0,2245.9,1323.5,3675.65,193.50561967984606,201.231897331688,290.17355954864087 HLA-A*01:01,AVCDKCLKFY,10,2.7,strong,novel,CONFIDENTIAL,2700.0,1140.4,1547.3,3210.16,6849.596682068725,8034.716592367712,5342.243682887992 HLA-A*01:01,LKFYSKISEY,10,7.7,intermediate,novel,CONFIDENTIAL,7700.0,14948.7,15773.3,17014.02,12422.761301072042,12400.829967565891,10658.091389039851 HLA-A*01:01,GTTLEQQY,8,16.2,weak,novel,CONFIDENTIAL,16200.0,15250.7,14780.6,11701.75,1059.4330640275084,1520.6973609096137,5918.9567991423155 HLA-A*01:01,KISEYRHYCY,10,18.4,weak,novel,CONFIDENTIAL,18400.0,1377.0,1230.1,330.74,1453.3474707081182,1482.838019653631,1479.8110134773426 HLA-A*01:01,DTPTLHEY,8,32.0,weak,novel,CONFIDENTIAL,32000.0,7096.4,8641.0,6601.07,1203.6621607075274,1486.3283925246994,5269.391140890927 HLA-A*03:01,LIRCINCQK,9,4.67,strong,novel,CONFIDENTIAL,4670.0,162.3,145.8,375.07,204.0478698313392,435.8311949480205,350.2389716370093 HLA-A*03:01,GIVCPICSQK,10,6.49,intermediate,novel,CONFIDENTIAL,6490.0,156.6,157.8,343.48,215.34416992422456,230.1221633521149,151.1602721982741 HLA-A*03:01,AVCDKCLKFY,10,9.29,intermediate,novel,CONFIDENTIAL,9290.0,990.5,1364.5,932.09,2047.2596287287881,2735.4138567447353,2745.2271592296443 HLA-A*03:01,SLYGTTLEQQY,11,10.06,intermediate,novel,CONFIDENTIAL,10060.0,162.5,131.8,233.79,1272.2137029730231,1360.821450087417,1225.4807167540018 HLA-A*03:01,KFYSKISEYR,10,11.72,intermediate,novel,CONFIDENTIAL,11720.0,924.2,1046.0,319.36,535.3088903701828,659.2740478699708,599.8433012394488 HLA-A*03:01,GTTLEQQYNK,10,17.33,weak,novel,CONFIDENTIAL,17330.0,1092.1,804.8,1292.32,1025.619711037487,1096.7490729173253,1019.6007981576853 HLA-A*03:01,KQRFHNIRGR,10,21.01,weak,novel,CONFIDENTIAL,21010.0,1768.7,1270.2,1602.6,932.8032378723947,854.2980408145897,1234.1362547195588 HLA-A*03:01,CVYCKQQLLR,10,30.56,weak,novel,CONFIDENTIAL,30560.0,377.7,319.8,112.79,56.32241532369268,52.70881959032983,52.85686131251664 HLA-A*03:01,AVCDKCLK,8,34.39,weak,novel,CONFIDENTIAL,34390.0,5533.2,7695.2,6961.08,219.5139365424112,772.7494025534432,1790.5815297337801 HLA-A*03:01,RHYCYSLY,8,58.09,weak,novel,CONFIDENTIAL,58090.0,10536.2,12510.7,10604.15,5011.41873021642,4586.303522172484,5479.046498205236 HLA-A*11:01,FAFRDLCIVYR,11,2.67,strong,novel,CONFIDENTIAL,2670.0,1597.0,1170.5,6087.15,198.5418558836729,767.7842293451082,759.5269541462752 HLA-A*11:01,AVCDKCLKFY,10,4.8,strong,novel,CONFIDENTIAL,4800.0,533.8,419.6,219.88,488.06798984272723,1069.0895760249005,1703.2245972516055 HLA-A*11:01,LIRCINCQK,9,5.21,intermediate,novel,CONFIDENTIAL,5210.0,287.3,338.0,1089.12,398.9452823944749,1091.5759819174523,1239.654411219963 HLA-A*11:01,TLEQQYNK,8,6.03,intermediate,novel,CONFIDENTIAL,6030.0,5308.2,7464.8,3131.9,376.55410528228134,2962.719959672343,4638.566296504541 HLA-A*11:01,LGIVCPICSQK,11,6.32,intermediate,novel,CONFIDENTIAL,6320.0,1398.0,1627.3,1807.2,1571.9827102006725,3357.029177949049,1283.0588085190461 HLA-A*11:01,ILECVYCK,8,8.34,intermediate,novel,CONFIDENTIAL,8340.0,2359.2,4510.3,4750.58,162.8377973720471,1098.030205507943,1498.1961045921537 HLA-A*11:01,AVCDKCLKFYS,11,11.51,intermediate,novel,CONFIDENTIAL,11510.0,11471.3,12747.5,9182.5,760.7260316491818,2889.8862445569057,2580.9365830201405 HLA-A*11:01,RCMSCCRSSR,10,12.19,intermediate,novel,CONFIDENTIAL,12190.0,1721.1,1956.4,1927.66,10366.764450311626,17378.519334733573,16695.884904110924 HLA-A*11:01,YAVCDKCLK,9,12.64,intermediate,novel,CONFIDENTIAL,12640.0,979.9,834.3,1462.48,305.35638363147206,1246.2218943284665,1720.2926725701159 HLA-A*11:01,DLLIRCINCQK,11,14.75,intermediate,novel,CONFIDENTIAL,14750.0,3140.1,5360.6,4278.29,3141.671074869477,6922.462818808072,7522.20865864938 HLA-A*11:01,YNIVTFCCK,9,15.83,weak,novel,CONFIDENTIAL,15830.0,961.0,780.0,2722.16,1366.3231568518531,1823.5975197172027,1245.35475751254 HLA-A*11:01,PYAVCDKCLK,10,15.99,weak,novel,CONFIDENTIAL,15990.0,7038.1,7230.3,8296.39,6694.072757669444,7382.799710571277,6964.978182003566 HLA-A*11:01,NIVTFCCK,8,17.88,weak,novel,CONFIDENTIAL,17880.0,5011.1,7719.3,8169.19,177.44387922524263,1271.0049548564928,1324.9382491538568 HLA-A*11:01,EVYDFAFR,8,27.75,weak,novel,CONFIDENTIAL,27750.0,4961.4,6460.5,9341.53,146.23879735518875,1179.4278141381164,803.5471316545512 HLA-A*11:01,AHYNIVTFCCK,11,28.95,weak,novel,CONFIDENTIAL,28950.0,5908.5,3047.8,4515.23,1799.4665054888096,4097.776212326945,2556.585920952502 HLA-A*11:01,NPYAVCDKCLK,11,31.11,weak,novel,CONFIDENTIAL,31110.0,18020.2,12853.2,19279.42,5561.112420245893,8852.317456986519,8280.409444184594 HLA-A*11:01,CVYCKQQLLR,10,36.49,weak,novel,CONFIDENTIAL,36490.0,348.8,356.5,506.27,54.98115951529731,125.60064701018942,161.45982239468202 HLA-A*11:01,YAVCDKCLKFY,11,40.88,weak,novel,CONFIDENTIAL,40880.0,7708.6,10967.8,2634.65,7952.677805963036,12250.765710981861,16787.055726162154 HLA-A*11:01,YGTTLEQQYNK,11,43.48,weak,novel,CONFIDENTIAL,43480.0,956.5,539.9,962.76,4318.5973365009995,7398.7202017867285,7566.772095061476 HLA-A*11:01,AFRDLCIVYR,10,47.68,weak,novel,CONFIDENTIAL,47680.0,3801.2,2782.3,6053.46,2622.759087481481,4940.091758791927,3030.899009631936 HLA-A*11:01,AVCDKCLKF,9,48.82,weak,novel,CONFIDENTIAL,48820.0,12744.2,10508.3,9085.16,3531.4624077727067,6345.713974481844,6720.213609332939 HLA-A*11:01,KISEYRHYCY,10,48.83,weak,novel,CONFIDENTIAL,48830.0,553.5,715.8,263.87,96.67683826219296,125.95280812849022,97.50901080742322 HLA-A*11:01,VCDKCLKFYSK,11,58.43,weak,novel,CONFIDENTIAL,58430.0,20498.8,16472.8,16577.36,2927.256576617747,5664.311988434344,4358.709052700608 HLA-A*11:01,WTGRCMSCCR,10,82.74,weak,novel,CONFIDENTIAL,82740.0,4430.8,5391.6,15228.16,3411.959775768269,5846.378194697021,5182.588436200903 HLA-A*24:02,VYDFAFRDLCI,11,0.256666667,strong,novel,CONFIDENTIAL,256.6666667,2621.4,2073.9,2480.67,648.37494940904,1484.3033637780072,5029.309818093023 HLA-A*24:02,PYAVCDKCLKF,11,0.28,strong,novel,CONFIDENTIAL,280.0,3417.5,1843.7,1976.58,83.28087797328301,243.88324986590942,3576.553843681802 HLA-A*24:02,VYGTTLEQQY,10,0.68,strong,novel,CONFIDENTIAL,680.0,8525.7,8380.9,6614.94,1629.7666773485894,3107.701590567886,4106.562015411532 HLA-A*24:02,TFCCKCDSTL,10,0.7533333329999999,strong,novel,CONFIDENTIAL,753.3333332999997,5243.0,8383.4,9077.1,3332.1846862068824,5905.839785214386,4944.675457011142 HLA-A*24:02,QYNKPLCDLLI,11,0.7666666670000001,strong,novel,CONFIDENTIAL,766.6666667000003,1659.7,1162.3,2768.8,134.74745049246454,402.8452453716209,542.4886114927364 HLA-A*24:02,KLPQLCTEL,9,0.83,strong,novel,CONFIDENTIAL,830.0,6113.0,6747.1,11100.88,1551.3652961517096,3712.5243927747533,5494.156914058253 HLA-A*24:02,VYRDGNPYAV,10,1.06,strong,novel,CONFIDENTIAL,1060.0,1933.7,2111.0,3259.54,402.34460018719125,1015.4575794850017,1397.3121809349875 HLA-A*24:02,YAVCDKCLKF,10,1.093333333,strong,novel,CONFIDENTIAL,1093.333333,7763.1,7692.7,12914.62,4306.466832601471,6667.05677309083,9985.12989112205 HLA-A*24:02,DRAHYNIVTF,10,1.316666667,strong,novel,CONFIDENTIAL,1316.666667,11145.0,12097.2,6105.89,2428.8140888228404,4939.367664513643,7255.9444215451795 HLA-A*24:02,LQTTIHEII,9,1.65,strong,novel,CONFIDENTIAL,1650.0,12345.4,11328.9,7819.96,5914.300147570152,7860.195300661325,2281.5229434808784 HLA-A*24:02,EYRHYCYSLY,10,1.983333333,strong,novel,CONFIDENTIAL,1983.3333329999998,7319.8,7218.3,6231.43,703.2658386654582,1515.9408499157364,1477.5881767756796 HLA-A*24:02,AHYNIVTF,8,2.2766666669999998,strong,novel,CONFIDENTIAL,2276.666667,7995.6,10388.4,12213.63,535.0480605196514,830.1737520796222,2491.9112158124303 HLA-A*24:02,VYCKQQLL,8,2.4533333330000002,strong,novel,CONFIDENTIAL,2453.333333,2262.2,3318.8,1910.18,52.27313383518106,88.41831947379872,575.635438043838 HLA-A*24:02,DFAFRDLCI,9,3.353333333,strong,novel,CONFIDENTIAL,3353.333333,6895.2,8358.8,5299.67,2321.9605565176307,4833.893616635816,2774.791392983021 HLA-A*24:02,YSLYGTTL,8,3.356666667,strong,novel,CONFIDENTIAL,3356.666667,9147.3,10801.2,5320.23,7199.2723693321095,9213.709378071613,13122.858103833583 HLA-A*24:02,FYSKISEY,8,3.36,strong,novel,CONFIDENTIAL,3360.0,12309.7,12705.1,17137.81,2205.404661591299,3581.325026470185,6557.405367260899 HLA-A*24:02,VYDFAFRDLC,10,4.303333333,strong,novel,CONFIDENTIAL,4303.333333,6027.3,5872.8,7810.15,3261.5361858609203,4541.968966974872,5575.954542513338 HLA-A*24:02,EVYDFAFRDL,10,4.7466666669999995,strong,novel,CONFIDENTIAL,4746.666667,7778.9,7300.7,10889.37,10584.928627802516,14998.341370715189,16265.726335821162 HLA-A*24:02,FYSKISEYRH,10,4.76,strong,novel,CONFIDENTIAL,4760.0,17447.3,19539.6,4653.72,2557.610445090333,4367.497745288996,5044.566675718917 HLA-A*24:02,HYNIVTFCC,9,6.06,intermediate,novel,CONFIDENTIAL,6060.0,5297.5,7451.3,3700.51,883.2590003262035,1556.9247929275973,1614.7965128506924 HLA-A*24:02,CYSLYGTTLE,10,6.8666666670000005,intermediate,novel,CONFIDENTIAL,6866.666667,3660.3,5860.6,1124.93,1459.6902336809735,2496.7356419659945,3525.4328802793743 HLA-A*24:02,LYGTTLEQQY,10,7.08,intermediate,novel,CONFIDENTIAL,7080.0,9536.2,11002.8,10662.6,1941.517006322411,3576.9833205995587,4657.422623464599 HLA-A*24:02,KCLKFYSKI,9,7.503333333,intermediate,novel,CONFIDENTIAL,7503.333333,14133.4,17530.9,2341.86,699.1338794910405,1171.0981253622886,1770.7628128622314 HLA-A*24:02,LECVYCKQQL,10,8.133333333,intermediate,novel,CONFIDENTIAL,8133.333333,38821.8,37065.8,37771.0,10864.99221187379,11788.509292507915,19923.786170055457 HLA-A*24:02,EYRYYCYSV,9,8.64,intermediate,novel,CONFIDENTIAL,8640.0,972.8,1102.6,2521.31,443.0731091832768,775.765326629387,2495.118062975035 HLA-A*24:02,FYSKISEYRHY,11,10.6,intermediate,novel,CONFIDENTIAL,10600.0,11705.4,8762.6,14075.75,2915.085842405545,5116.743170286183,10544.696205113243 HLA-A*24:02,PYAVCDKCLK,10,10.92666667,intermediate,novel,CONFIDENTIAL,10926.66667,25168.5,27683.3,26543.21,6885.730236669599,9592.873322236668,13304.621298708753 HLA-A*24:02,YDFAFRDLCI,10,11.01333333,intermediate,novel,CONFIDENTIAL,11013.33333,2877.7,4657.9,2956.78,12352.424311027677,16119.501861361616,17724.81775456142 HLA-A*24:02,SEYRHYCYSL,10,11.97666667,intermediate,novel,CONFIDENTIAL,11976.66667,480.4,743.8,825.17,4777.401079101041,8473.810658312603,12884.606885147292 HLA-A*24:02,HYNIVTFC,8,16.50666667,weak,novel,CONFIDENTIAL,16506.66667,22350.0,21160.9,23030.23,4943.438196616697,5891.456284818602,17692.391313008437 HLA-A*24:02,VYCKQQLLRR,10,22.28,weak,novel,CONFIDENTIAL,22280.0,25203.4,28044.8,13917.2,3204.1311394463733,5560.819014680763,6042.764371359264 HLA-A*24:02,REVYDFAF,8,23.27,weak,novel,CONFIDENTIAL,23270.0,18654.2,23029.5,23691.66,1850.0543105860065,2478.076299821525,6735.1965030939145 HLA-A*24:02,KKQRFHNIR,9,28.63666667,weak,novel,CONFIDENTIAL,28636.66667,36419.0,38575.1,35997.06,18840.464726183844,21098.373761501232,19027.297846877213 HLA-A*24:02,KFYSKISEYRH,11,31.99666667,weak,novel,CONFIDENTIAL,31996.66667,32363.3,34292.3,19160.27,8006.412012230704,11191.558204349676,13840.797318332548 HLA-A*24:02,CYSVYGTTLE,10,32.71,weak,novel,CONFIDENTIAL,32710.0,4245.8,6458.2,1649.91,1569.781391307999,2487.4000289810565,4869.80660107878 HLA-A*24:02,YCYSLYGTTLE,11,36.66333333,weak,novel,CONFIDENTIAL,36663.33333,7610.9,9765.9,2313.58,16139.756539090044,18650.695843017987,23113.19583519468 HLA-A*24:02,YSVYGTTL,8,37.87,weak,novel,CONFIDENTIAL,37870.0,11241.5,11347.0,7091.69,8065.2962258007765,10251.465162052817,14753.287936076544 HLA-A*24:02,VYCKQQLLR,9,46.39666667,weak,novel,CONFIDENTIAL,46396.66667,17707.0,20124.1,6744.89,1776.1100492444934,3229.353309718729,4718.3223038401975 HLA-A*24:02,KKQRFHNI,8,46.83666667,weak,novel,CONFIDENTIAL,46836.66667,30641.7,29623.0,24111.62,3941.4027541538735,5280.337684102296,10622.243090510694 HLA-A*24:02,DKKQRFHNI,8,55.94666667,weak,novel,CONFIDENTIAL,55946.66667000001,39079.2,38729.5,25336.02,8260.198769933226,10568.709366954625,11615.771585035689 HLA-A*24:02,HLDKKQRFHNI,11,60.8,weak,novel,CONFIDENTIAL,60800.0,35515.4,30329.4,35114.98,10190.34608252548,12609.65475151052,22871.03164018196 HLA-A*24:02,VQSTHVDI,8,84.61333333,weak,novel,CONFIDENTIAL,84613.33333,33737.3,33855.8,29711.28,7667.765794228896,8752.810114048165,21345.212270250264 HLA-A*24:02,DLYCYEQF,8,29.23,weak,novel,CONFIDENTIAL,29230.0,23229.4,20680.1,24389.75,2811.256108620112,4375.938952621141,11821.029639805005 HLA-B*07:02,LIRCINCQKPL,11,0.16,strong,novel,CONFIDENTIAL,160.0,3064.8,4560.3,10601.75,1945.3949554892865,1759.2480536978715,13235.818200827416 HLA-B*07:02,RPRKLPQLC,9,0.29,strong,novel,CONFIDENTIAL,290.0,99.6,70.6,286.03,57.26882685127524,59.91249013361661,172.89450329842686 HLA-B*07:02,RGRWTGRCM,9,0.33,strong,novel,CONFIDENTIAL,330.0,544.1,737.1,167.14,88.23814698866963,80.05266353876195,72.67379631603724 HLA-B*07:02,RPRKLPQLCT,10,0.53,strong,novel,CONFIDENTIAL,530.0,496.2,414.4,170.01,62.07504609258122,67.46746511764775,178.43235602677032 HLA-B*07:02,RPRKLPQLCTE,11,0.81,strong,novel,CONFIDENTIAL,810.0,5681.8,4260.3,3632.24,304.6591113264488,285.9482746084626,3531.0372933871067 HLA-B*07:02,RTRRETQL,8,1.1,strong,novel,CONFIDENTIAL,1100.0,3895.8,2410.3,4306.76,302.2911569113051,202.7473844585019,718.8179070458214 HLA-B*07:02,TPTLHEYM,8,1.35,strong,novel,CONFIDENTIAL,1350.0,6604.3,5514.7,6866.75,1465.150113174896,1121.1330423351164,2429.2378272886103 HLA-B*07:02,TPTLHEYML,9,2.27,strong,novel,CONFIDENTIAL,2270.0,505.2,481.8,521.93,118.06538967914535,140.81757469280657,92.07467249450524 HLA-B*07:02,RAHYNIVTF,9,2.33,strong,novel,CONFIDENTIAL,2330.0,1801.2,1073.9,2595.16,1032.0194526410553,1071.074685897953,861.016487718305 HLA-B*07:02,DPQERPRKL,9,2.93,strong,novel,CONFIDENTIAL,2930.0,6430.7,8586.4,6673.02,4447.920925284252,5032.4869670550315,12010.097114484184 HLA-B*07:02,SSRTRRETQL,10,4.06,strong,novel,CONFIDENTIAL,4060.0,2089.8,2816.0,2016.89,2538.6524520076005,2004.4016130475518,4567.458624166775 HLA-B*07:02,CPEEKQRHL,9,4.23,strong,novel,CONFIDENTIAL,4230.0,893.3,1528.5,2463.79,1394.2744805759644,2149.807140578608,872.0581690760785 HLA-B*07:02,IVYRDGNPYAV,11,12.94,intermediate,novel,CONFIDENTIAL,12940.0,26980.1,26763.8,29570.16,7479.563593333048,6102.175369168072,9605.759184515084 HLA-B*07:02,LEQQYNKPL,9,15.1,weak,novel,CONFIDENTIAL,15100.0,13788.5,14910.4,16353.78,6259.887601536141,8331.416242786941,15960.857492638128 HLA-B*07:02,EPDRAHYNIV,10,19.27,weak,novel,CONFIDENTIAL,19270.0,2351.6,2782.2,1084.14,6278.3163427984155,7045.2443973048275,3790.5555744968437 HLA-B*07:02,KPLCDLLIRCI,11,21.1,weak,novel,CONFIDENTIAL,21100.0,6869.7,7330.3,12509.87,801.2379327776382,643.0833456130414,2284.5703449437165 HLA-B*07:02,KPLCDLLI,8,21.62,weak,novel,CONFIDENTIAL,21620.0,6518.4,5417.9,8852.66,1815.3360300680606,1719.2729086743375,8584.752287226422 HLA-B*07:02,NIRGRWTGRCM,11,49.58,weak,novel,CONFIDENTIAL,49580.0,12004.9,10710.7,12157.85,1904.0345404286825,2252.3556481610667,6420.5002847491005 HLA-B*07:02,LLRREVYDFAF,11,53.51,weak,novel,CONFIDENTIAL,53510.0,22487.3,25001.3,26384.57,2863.3737518256316,2094.5426998534267,6319.718643066938 HLA-B*15:01,CLKFYSKISEY,11,0.29,strong,?,CONFIDENTIAL,290.0,978.1,1148.9,3333.73,100.12875865670289,89.79060745300224,482.6428077286937 HLA-B*15:01,LKFYSKISEY,10,2.44,strong,?,CONFIDENTIAL,2440.0,328.6,360.4,670.13,464.4010900707389,365.56287514368285,226.36814205834855 HLA-B*15:01,SEYRHYCYSLY,11,2.5,strong,?,CONFIDENTIAL,2500.0,1944.7,2054.2,11010.92,1401.9870967130635,2102.273337412692,3603.7637607179827 HLA-B*15:01,AVCDKCLKFY,10,2.96,strong,?,CONFIDENTIAL,2960.0,3065.1,2645.1,1317.37,178.86701409141514,170.1696154317968,235.54338201813513 HLA-B*15:01,RHYCYSLY,8,3.96,strong,?,CONFIDENTIAL,3960.0,6469.3,4021.1,9120.32,6001.048237865377,6277.851617263311,8776.537436401066 HLA-B*15:01,GQAEPDRAHY,10,3.97,strong,?,CONFIDENTIAL,3970.0,38.7,26.9,18.62,17.40913832461758,22.93177948959837,18.25441985354535 HLA-B*15:01,KISEYRHYCY,10,4.18,strong,?,CONFIDENTIAL,4180.0,722.1,673.9,532.56,188.0057025142708,285.77394447106343,265.58478819185194 HLA-B*15:01,LQPETTDLY,9,4.87,strong,?,CONFIDENTIAL,4870.0,233.2,307.5,114.64,86.10233924690445,138.71362381007455,93.16515819544595 HLA-B*15:01,AFRDLCIVY,9,5.23,intermediate,?,CONFIDENTIAL,5230.0,1030.7,1057.2,460.29,424.3561939924511,612.2269976892022,976.4649149914122 HLA-B*15:01,FAFRDLCIVY,10,5.27,intermediate,?,CONFIDENTIAL,5270.0,30.0,54.0,72.32,85.35493740907567,113.36915764673607,144.0842521338272 HLA-B*15:01,YRHYCYSLY,9,5.62,intermediate,?,CONFIDENTIAL,5620.0,2226.8,2396.0,4253.87,2232.1043002386045,4070.7985953310827,4481.40899937409 HLA-B*15:01,LQPETTDLYCY,11,6.08,intermediate,?,CONFIDENTIAL,6080.0,2534.8,2382.0,1904.75,106.96510326211235,116.31407824150664,57.36903618129154 HLA-B*15:01,KQQLLRREVY,10,6.23,intermediate,?,CONFIDENTIAL,6230.0,178.4,74.7,76.01,30.491063196285573,44.73951549010499,68.18582442576489 HLA-B*15:01,CIVYRDGNPY,10,6.58,intermediate,?,CONFIDENTIAL,6580.0,125.9,114.3,110.45,40.53014006414743,45.807707973742865,31.46490517047732 HLA-B*15:01,IVYRDGNPY,9,6.63,intermediate,?,CONFIDENTIAL,6630.0,46.1,31.9,61.09,52.87880709132674,84.07449075465877,47.86039440508893 HLA-B*15:01,LLMGTLGIV,9,7.1,intermediate,?,CONFIDENTIAL,7100.0,860.8,937.1,2322.78,534.5426071153162,849.7323988294139,462.22498009594113 HLA-B*15:01,SLYGTTLEQQY,11,7.19,intermediate,?,CONFIDENTIAL,7190.0,338.0,230.4,1740.59,117.23636408487276,234.18830949346,105.37219050298744 HLA-B*15:01,QQYNKPLCDL,10,8.52,intermediate,?,CONFIDENTIAL,8520.0,1829.3,1621.3,1345.65,600.4679447031629,899.1971301644063,850.2194364474872 HLA-B*15:01,KLPQLCTEL,9,8.8,intermediate,?,CONFIDENTIAL,8800.0,3978.6,4085.5,5949.82,3835.943090749321,7120.605089018278,7847.671348501214 HLA-B*15:01,QQLLRREVY,9,8.9,intermediate,?,CONFIDENTIAL,8900.0,300.0,207.4,193.81,230.91940954822832,219.41800195333204,282.60995304812405 HLA-B*15:01,LCIVYRDGNPY,11,10.49,intermediate,?,CONFIDENTIAL,10490.0,494.5,301.2,982.82,339.8685867172298,227.20500067595367,682.6748668050218 HLA-B*15:01,LLRREVYDFAF,11,11.34,intermediate,?,CONFIDENTIAL,11340.0,381.6,399.3,1704.66,67.71174660960358,212.11992230183037,839.4445432934434 HLA-B*15:01,LLRREVYDF,9,13.73,intermediate,?,CONFIDENTIAL,13730.0,87.9,94.0,281.84,73.4518778217546,114.8259665577371,62.3035983246114 HLA-B*15:01,VYRDGNPY,8,14.08,intermediate,?,CONFIDENTIAL,14080.0,3951.2,3244.9,2753.92,813.0948639229259,1064.1938077744298,1394.6899762223227 HLA-B*15:01,RAHYNIVTF,9,15.85,weak,?,CONFIDENTIAL,15850.0,64.7,62.2,82.18,59.67455706810693,86.34963096148407,35.39766823681614 HLA-B*15:01,GQAEPDRAH,9,17.31,weak,?,CONFIDENTIAL,17310.0,1672.1,886.6,1526.88,627.7935489433132,1156.7461202151535,940.5329764058071 HLA-B*15:01,TLHEYMLDL,9,19.1,weak,?,CONFIDENTIAL,19100.0,3961.2,4781.2,5412.44,3188.32234786814,4370.989395819677,6157.718865619735 HLA-B*15:01,YAVCDKCLKFY,11,19.77,weak,?,CONFIDENTIAL,19770.0,2994.2,3383.8,11119.27,1313.5652926667344,1123.1035569308099,2332.3519035580634 HLA-B*15:01,LQTTIHDII,9,20.8,weak,?,CONFIDENTIAL,20800.0,3201.7,3183.3,6475.15,3508.220617041432,5252.916723398049,3558.7993737839442 HLA-B*15:01,QQLLRREVYDF,11,20.84,weak,?,CONFIDENTIAL,20840.0,4777.8,3005.2,6524.1,1395.5709140240094,1647.8974388280567,3234.8884455717102 HLA-B*15:01,KQRFHNIRGRW,11,21.33,weak,?,CONFIDENTIAL,21330.0,10844.6,6519.9,12284.4,3209.069828170334,5037.071796544306,7191.905607823522 HLA-B*15:01,AGQAEPDRAHY,11,21.56,weak,?,CONFIDENTIAL,21560.0,1404.6,1362.3,1407.49,523.3780922619607,1174.1391466687742,2108.223246766194 HLA-B*15:01,YSKISEYRHY,10,21.64,weak,?,CONFIDENTIAL,21640.0,174.5,235.9,48.14,49.734400543630066,38.94847000263059,41.31760975565961 HLA-B*15:01,QLLRREVY,8,28.48,weak,?,CONFIDENTIAL,28480.0,7374.1,4959.3,4022.01,334.1041331076923,497.43111535595193,996.4526394200656 HLA-B*15:01,KQRHLDKKQRF,11,29.77,weak,?,CONFIDENTIAL,29770.0,4349.9,1481.7,3954.91,264.1992655778023,799.4991513146069,3186.967792936229 HLA-B*15:01,YAVCDKCLKF,10,29.92,weak,?,CONFIDENTIAL,29920.0,341.8,721.3,1324.03,589.5003656676157,322.8184699303833,170.59555698221587 HLA-B*15:01,HDIILECVY,9,32.57,weak,?,CONFIDENTIAL,32570.0,2732.9,4656.1,1976.11,1364.6114315053885,1536.2820888670612,1348.9721708118166 HLA-B*15:01,TIHDIILECVY,11,37.79,weak,?,CONFIDENTIAL,37790.0,1072.7,1127.3,2106.16,595.6118816499967,979.8290459326907,3282.111249651654 HLA-B*15:01,IVYRDGNPYA,10,40.0,weak,?,CONFIDENTIAL,40000.0,871.8,544.8,935.11,5431.139564386863,5685.053856764514,5664.246317872208 HLA-B*15:01,SEYRHYCY,8,41.84,weak,?,CONFIDENTIAL,41840.0,6850.1,7695.0,8495.33,1628.083811935315,1895.3144773195527,2815.4525280584785 HLA-B*15:01,LLMGTLGI,8,43.75,weak,?,CONFIDENTIAL,43750.0,6292.9,6789.1,14125.18,465.4261794512378,605.1702826248901,1208.890677643299 HLA-B*15:01,RGRWTGRCM,9,45.1,weak,?,CONFIDENTIAL,45100.0,4008.0,3340.2,2544.8,1820.363713752112,3486.2518669557435,4006.836697906264 HLA-B*15:01,AVCDKCLKF,9,51.89,weak,?,CONFIDENTIAL,51890.0,1434.1,1425.9,2322.91,762.744945580612,819.5206751963057,640.1132456383094 HLA-B*15:01,SKISEYRHY,9,56.55,weak,?,CONFIDENTIAL,56550.0,1435.6,1678.9,2651.99,3236.554371663517,4229.655776556141,2363.137677540985 HLA-B*15:01,KISEYRHY,8,57.15,weak,?,CONFIDENTIAL,57150.0,4275.6,3402.6,3430.92,212.9623859156265,389.45988157147883,426.76252622744016 HLA-B*15:01,CQKPLCPEE,9,67.81,weak,?,CONFIDENTIAL,67810.0,16285.1,13486.3,11536.18,7714.102386831012,11886.001598087749,7346.684977628699 HLA-B*15:01,LRREVYDFAF,10,69.3,weak,?,CONFIDENTIAL,69300.0,5789.7,4932.3,6139.74,1691.4770197820444,3493.9972978175706,3106.905203122733 HLA-B*15:01,QLLRREVYDF,10,77.7,weak,?,CONFIDENTIAL,77700.0,1215.3,1582.7,2564.26,330.5604649673025,416.60424757969736,437.37861422193896 HLA-B*15:01,FYSKISEY,8,94.5,weak,?,CONFIDENTIAL,94500.0,2369.7,2379.5,7637.92,2414.7564272356617,3321.432577617953,4414.84818994649 HLA-A*02:01,LLMGTLGI,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,184.0,328.6,212.27,40.10507816195131,36.68413487712265,150.4233501819733 HLA-A*02:01,LMGTLGIV,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,1875.4,3868.3,1105.59,1731.2786926325007,1034.1209486251953,3385.6201356725123 HLA-A*02:01,EYMLDLQPETT,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,6152.0,5367.0,1548.09,19607.41628195521,22932.299772195034,21660.167247021807 HLA-A*02:01,LRLCVQSTHV,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1971.4,2131.1,1815.24,6258.1693122330225,8850.5216424582,11139.886334756673 HLA-A*02:01,KISEYRYYC,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,675.0,1585.7,2349.63,1616.7235765366324,1361.5868928858724,1663.4471790977288 HLA-A*02:01,YSLYGTTLEQ,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4849.4,6125.2,2507.49,4946.262186569977,7276.920108129971,5348.447744367745 HLA-A*02:01,DLLMGTLGI,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,1327.9,1727.9,2529.15,1247.362388651159,736.5847222237112,721.9583442636213 HLA-A*02:01,PLCDLLIRCI,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4404.1,6552.8,2553.9,6227.56022017545,5538.638762408619,9368.909416015516 HLA-A*02:01,FAFRDLCIVY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,6485.2,8256.3,3191.53,6896.565730348924,8109.559671334478,7189.8532424441355 HLA-A*02:01,IVYRDGNPYAV,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,2531.3,518.2,3287.59,291.0171642495432,384.71909049438193,563.1260951324526 HLA-A*02:01,YCYSVYGTTL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,9502.8,8457.4,3314.52,4414.623268810618,4277.971516972154,4779.208919603183 HLA-A*02:01,QLLRREVYDFA,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,5854.7,2327.3,3518.78,799.2711256419948,503.36698776390966,765.5631997379436 HLA-A*02:01,MLDLQPETTDL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,4519.0,2556.8,3950.38,2691.260928057141,2899.896483807252,3845.047174100261 HLA-A*02:01,IILECVYCK,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,17699.0,14731.4,4245.82,3546.5930165011573,4096.682345418097,5340.488501547996 HLA-A*02:01,YRDGNPYAV,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,7286.9,4990.8,4312.26,697.3534782821471,793.9928564089412,702.6178592295229 HLA-A*02:01,IILECVYC,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,13575.9,16281.2,5793.17,2605.483298879635,3189.755504599269,4549.1810265154745 HLA-A*02:01,TLRLCVQSTHV,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,9657.4,5423.7,6275.13,4642.816820403671,6367.344637406844,10467.335317603565 HLA-A*02:01,YDFAFRDLCIV,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,9827.2,5663.8,6605.64,8537.612365776004,9076.15995019165,8472.794847172467 HLA-A*02:01,YDFAFRDLCI,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,9356.6,8596.9,7051.13,5783.470457750719,8886.639869166393,6900.1844605167835 HLA-A*02:01,LLIRCINCQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,17771.5,18562.4,7167.67,6194.734449463747,6730.359385664998,9156.309395339307 HLA-A*02:01,TLEQQYNKPL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,8846.4,9944.9,7526.68,8247.187903778167,7724.006369247068,7934.689593833418 HLA-A*02:01,LMGTLGIVC,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,6752.4,7936.9,7548.2,5956.836085965389,7680.189836417857,6188.5104047798995 HLA-A*02:01,SEYRHYCYSV,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,7213.2,7818.5,7961.17,2208.7935464187963,2195.755402862796,3869.8187165363624 HLA-A*02:01,SLYGTTLEQQ,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,13853.8,14694.2,8398.45,4484.348332784442,5169.1361410017635,6238.559002635688 HLA-A*02:01,TIHDIILECVY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,16111.2,13565.7,8436.97,18480.247525559542,17254.18407367307,16052.805885011456 HLA-A*02:01,DLCTELQTTI,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,13562.4,11451.5,8439.62,10315.064570869743,7829.124137416472,8372.603499441011 HLA-A*02:01,LLIRCINC,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,14592.1,18081.7,9263.13,5840.7933342989,7219.689803403051,8153.439741505592 HLA-A*02:01,KPLCDLLIRCI,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,21675.5,24361.3,9568.74,11669.912353975344,12963.024986499122,6933.274830652026 HLA-A*02:01,KQQLLRREV,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,12405.4,12030.3,10473.71,11151.684959687818,13378.011377737554,9381.644580361364 HLA-A*02:01,QLLRREVYDF,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,13898.1,12025.3,11086.96,11557.492136930747,8072.482127910267,9421.217765296751 HLA-A*02:01,RLECVYCKQQL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,7444.6,6179.7,11254.96,6057.102203953418,7857.069310594371,6712.316098963371 HLA-A*02:01,LLIRCINCQK,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,16704.8,17019.5,11948.67,8211.356112912066,8409.215012137936,7444.559187973554 HLA-A*02:01,KCLKFYSKI,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,17601.4,16904.7,12145.36,5452.758713298393,5650.7759692530835,5573.756294555697 HLA-A*02:01,ILECVYCK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,28087.3,23841.6,13210.86,12045.85456890354,13370.493728100842,21677.317790126628 HLA-A*02:01,LLRREVYDFAF,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,15235.6,13611.5,13943.72,10421.877091861914,9958.824701602422,8713.581563985184 HLA-A*02:01,HLDKKQRFHNI,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,17238.0,13408.9,13960.33,2299.22418049324,1599.8286874944306,3929.7162390308467 HLA-A*02:01,ELQTTIHEIIL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,17333.4,13077.5,14052.78,10684.042104244922,9762.87125737261,12016.088103237638 HLA-A*02:01,YNKPLCDLLI,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,22341.3,20470.9,14169.12,10628.921221182429,11308.44710150331,6290.237739071789 HLA-A*02:01,SEYRHYCYSL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,13026.1,15061.2,14259.85,5811.169006151247,5824.826979669005,10007.41998819825 HLA-A*02:01,SLYGTTLEQQY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,18915.2,13566.9,14538.09,9040.57917762621,9154.051955183671,7841.014786675651 HLA-A*02:01,QQYNKPLCDLL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,13660.3,7395.5,14733.66,7881.58844606867,10235.307999333174,9186.411917724126 HLA-A*02:01,YAVCDKCLKF,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,18867.1,18812.7,15271.88,14274.15507299491,16838.86644164798,14951.32987603311 HLA-A*02:01,VYRDGNPYAV,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,18526.3,19492.7,15454.89,4585.286102298362,7438.690507727205,5895.185063371625 HLA-A*02:01,RTLEDLLM,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,19711.8,18336.2,15875.55,2484.2089733460502,2163.61486135186,6388.379531010197 HLA-A*02:01,ISEYRHYCYSV,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,22763.2,17417.3,16198.28,2894.512011167368,2426.831196366345,5418.379048304882 HLA-A*02:01,CMSCCRSSRT,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,12198.2,13951.6,16991.94,10535.60112853321,10118.68679835581,14725.56271574406 HLA-A*02:01,DLYCYEQL,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,17409.5,16955.4,17632.1,8137.1463906061745,7442.693714332056,18847.28762692309 HLA-A*02:01,TTLEQQYNKPL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,16075.4,9390.2,17677.19,10436.028647722613,7351.251124982511,9772.915561571059 HLA-A*02:01,YSLYGTTL,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,20908.9,19223.6,17993.27,2281.09855045255,1766.0101648825876,6784.524748974714 HLA-A*02:01,LECVYCKQQLL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,18246.4,11673.4,19398.9,15988.749501063316,17994.289200286003,22286.800243045924 HLA-A*02:01,FQDPQERPRKL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,23015.3,17750.8,20790.04,6434.987943781,7658.949352552701,7701.4660952873155 HLA-A*02:01,DLLIRCINCQK,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,33080.9,32321.3,20836.43,15381.046882179076,16312.850147876072,12752.31784017157 HLA-A*02:01,YCYSVYGT,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,30982.1,30513.7,20902.36,6802.646468665559,5963.458511143889,11849.150764435824 HLA-A*02:01,HVDIRTLEDLL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,26313.3,20053.4,21135.7,11756.82545898115,9757.506531027086,8429.851731645947 HLA-A*02:01,QQLLRREVYDF,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,30678.9,27432.3,22055.0,19048.964668808807,18004.958876280023,20164.68452413133 HLA-A*02:01,QYNKPLCDLLI,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,35465.9,31893.7,23709.1,12473.319358348526,16566.3994972223,15278.271757940349 HLA-A*02:01,GIVCPICSQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,24846.0,29028.1,24415.38,16340.00360103559,17338.576062648906,18546.03609115097 HLA-A*02:01,YSKISEYRHYC,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,19293.2,16011.7,24619.36,20768.38521022667,21379.50661678288,19188.252615464804 HLA-A*02:01,LQPETTDLY,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,24655.3,24832.0,25371.14,15306.476435863176,19334.568885193483,15652.590707128582 HLA-A*02:01,KISEYRHYCYS,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,22367.7,20249.9,25555.72,9021.712561571116,10503.08016267608,14106.538410439864 HLA-A*02:01,QLNDSSEEE,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,27846.4,29819.8,28772.62,14869.244790561152,16809.168241559193,12204.426798386134 HLA-A*02:01,CVYCKQQL,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,22673.2,21594.1,28998.27,13189.078881145795,14659.685439640254,21627.67462792852 HLA-A*02:01,QQLLRREVYD,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,38188.5,37815.6,30968.04,22971.137238845695,25162.71603898916,20481.405031208604 HLA-A*02:01,VQSTHVDI,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,34280.8,31479.2,31123.22,14870.238291291284,14288.133752706222,23077.704869215453 HLA-A*02:01,LCVQSTHVDIR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,37863.9,36133.6,34584.06,21318.04847828535,23000.069879246737,25881.846850535672 HLA-A*02:01,PQLCTELQTTI,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,14066.9,13293.0,8717.3,13500.485965757342,15988.82079411965,13075.008237186474 HLA-A*02:01,IILECVYCKQQ,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,33495.1,30770.0,18479.01,12839.402238388291,16496.963366211512,13032.423575407904 HLA-A*02:01,STHVDIRTL,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,21370.0,21277.7,13064.73,13081.25664250346,11367.70054316108,14121.00018631782 HLA-A*02:01,GIVCPICS,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,34852.3,34494.7,31844.36,16979.390982186476,17001.090435871018,22019.158545689672 HLA-A*03:01,RCMSCCRSSR,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,338.5,229.2,274.07,2146.151895876547,2678.6392705485628,1852.490604772033 HLA-A*03:01,KISEYRHYCY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,421.4,625.5,572.58,508.5271761850045,198.21151382809373,295.13399784149385 HLA-A*03:01,CMSCCRSSR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,890.9,665.7,711.79,698.3657242942412,2116.4394014354266,1511.9583619970472 HLA-A*03:01,CLKFYSKISEY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,894.8,1363.0,1540.97,2095.081375326685,5205.889344177251,5802.133969881049 HLA-A*03:01,DIILECVYCK,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1882.1,2341.3,1829.27,6024.303744160254,4179.40804463089,5637.158934176868 HLA-A*03:01,DLLIRCINCQK,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,1145.9,2405.2,2443.06,1671.6915196553628,1513.4730710112726,1936.349688276893 HLA-A*03:01,CVYCKQQLLRR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,2237.6,2458.8,2848.84,95.13939639605283,126.24882041983204,176.5199522745506 HLA-A*03:01,AHYNIVTFCCK,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,10306.1,7881.6,2918.19,942.6111512922834,2353.3178810853587,2133.4108950052528 HLA-A*03:01,CIVYRDGNPY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1467.2,2175.4,3007.11,4834.8995768888535,4183.345336629446,3218.6861814278805 HLA-A*03:01,NIRGRWTGR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,8301.7,8766.1,3240.31,2543.19939076268,4158.268367969763,2273.462019112702 HLA-A*03:01,HYNIVTFCCK,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4049.9,4137.7,3307.86,2198.6174472625776,584.9455802587668,1084.223382567712 HLA-A*03:01,LKFYSKISEY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,3145.9,4157.9,3753.5,9631.77876679148,6822.620760297989,6779.638719408612 HLA-A*03:01,LGIVCPICSQK,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,1894.1,3028.7,4665.87,4029.238428165269,8264.699832136585,7763.458517971719 HLA-A*03:01,MSCCRSSRTR,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4520.9,5366.9,4817.98,1521.4009021341074,947.6102090610506,861.4797598619441 HLA-A*03:01,AFRDLCIVYR,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4587.1,3393.3,5085.86,4400.140655805826,6190.8345548087855,5804.855243630565 HLA-A*03:01,SLYGTTLEQQ,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1800.8,2198.7,5755.56,2883.4793280106846,1957.5732183517416,3642.2699172915004 HLA-A*03:01,FAFRDLCIVY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,6733.5,7682.8,6638.96,5603.9553562641795,4502.49950017559,4077.4811835858773 HLA-A*03:01,ILECVYCK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,3159.6,4307.9,6671.15,890.273813982895,2692.586448413381,2374.3744309074427 HLA-A*03:01,IVYRDGNPYA,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,7084.6,8807.6,7479.27,5575.002201934725,7304.863413406947,7168.783410726695 HLA-A*03:01,YNIVTFCCK,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,7521.7,6165.1,7847.85,3252.6544931259614,1437.3016960840844,2674.2028326013715 HLA-A*03:01,AFRDLCIVY,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,8917.6,9238.2,7946.88,9427.562999067719,10594.479488804085,10957.51729834966 HLA-A*03:01,TIHDIILECVY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,7794.2,7411.9,8104.13,10238.983678331142,10535.356809094204,6687.412723396845 HLA-A*03:01,YAVCDKCLK,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,7155.4,6883.9,8224.8,3821.649764439815,2424.348143472158,4209.584907778554 HLA-A*03:01,KFYSKISEYRH,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,12156.0,13864.3,8573.91,8079.243506444573,13968.451334406172,17485.818462512172 HLA-A*03:01,SEYRHYCYSLY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,16141.2,13640.5,8860.23,3824.429784223868,5840.156611897132,8804.176450141538 HLA-A*03:01,CQKPLCPEEK,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,6276.4,6630.4,9041.61,7555.636156280687,9600.987179295393,11138.161583549549 HLA-A*03:01,RLCVQSTHV,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,10478.1,15291.1,9250.01,9181.889033252728,12869.854545414255,13561.35189596395 HLA-A*03:01,CMSCCRSSRTR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,4846.3,5407.0,10382.31,1255.8368120386338,5820.3946396026795,10020.255721723788 HLA-A*03:01,FAFRDLCIVYR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,5944.0,6144.5,10464.76,2491.416241486951,3000.0494697373656,4183.038873089809 HLA-A*03:01,CDKCLKFYSK,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,15320.0,14495.2,10654.87,4404.859869695959,2186.190658739226,2983.1005232107013 HLA-A*03:01,TLEQQYNK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,8603.6,10288.9,10744.48,2689.6793224747407,5570.180711962954,10546.89805472796 HLA-A*03:01,VYCKQQLLR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,16174.8,15505.3,11111.21,5567.253279410506,6462.855881066801,12767.768012515184 HLA-A*03:01,YGTTLEQQYNK,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,8477.2,6768.1,11681.38,9249.895196629821,13146.110479915269,14859.272306690418 HLA-A*03:01,WTGRCMSCCR,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,8888.0,10630.0,12285.99,8769.71255533588,8526.06828795749,9365.77933071704 HLA-A*03:01,LLMGTLGIVC,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,25372.2,25636.3,12569.3,6640.963839857213,5425.959510050151,6041.896311538562 HLA-A*03:01,KISEYRHY,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,12211.8,13743.6,12912.53,1745.7820230340333,5329.022384307455,5567.132124374539 HLA-A*03:01,NIVTFCCK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,10964.7,13002.8,12935.6,1844.1544916120545,3736.831761832908,4925.956839391305 HLA-A*03:01,KQRHLDKK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,14324.0,13835.5,12994.1,978.3974358896014,1889.583078871707,4983.341587821577 HLA-A*03:01,RAHYNIVTF,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,11466.9,12923.0,13236.75,9593.774954796472,8075.12897822427,12654.867729913249 HLA-A*03:01,AVCDKCLKF,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,18440.7,16946.0,13831.93,7889.603419329891,8646.709244506084,10614.6251828039 HLA-A*03:01,ISEYRHYCY,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,15430.7,14319.7,14211.49,12713.65719886557,8762.981746819096,8380.195323653576 HLA-A*03:01,KQRFHNIR,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,14637.8,13352.3,14664.95,7402.795328586102,17833.537842691203,16238.782362526514 HLA-A*03:01,MSCCRSSRTRR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,11276.2,11875.2,15034.96,2449.284978813199,6777.043043756836,5270.466920037933 HLA-A*03:01,TLHEYMLDL,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,19457.6,18168.3,15136.0,13478.837615421822,15576.67774404172,16919.82201004596 HLA-A*03:01,RLCVQSTH,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,9516.8,10452.0,15734.3,5585.55143358981,11921.371380186743,15486.510604749796 HLA-A*03:01,KQRFHNIRGRW,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,16747.9,20875.5,15845.69,17769.847494111054,19599.174139326293,20086.92059187255 HLA-A*03:01,GTLGIVCPI,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,16237.1,14216.1,16709.72,12524.864051355848,12949.151893041524,13325.577079707613 HLA-A*03:01,QLLRREVYDF,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,19300.3,20194.8,17676.8,14022.340680721682,20082.35074421348,18551.78613098005 HLA-A*03:01,LLIRCINCQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,8157.2,11563.9,18800.89,12143.728454198936,9472.68106483512,9922.57257387812 HLA-A*03:01,DLLMGTLGIV,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,23381.5,25829.0,19532.01,19685.621315083717,16714.310190655182,13696.421961249798 HLA-A*03:01,EVYDFAFR,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,13702.2,15071.1,19611.21,1767.8732388699136,3858.152467319781,7339.085909331587 HLA-A*03:01,MSCCRSSR,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,13412.8,17131.7,19626.06,4265.170604589931,9705.2678010256,11207.538346703797 HLA-A*03:01,LRLCVQSTHV,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,21693.8,25703.0,19670.29,23725.232869921416,21818.993890530248,22001.21513133623 HLA-A*03:01,STLRLCVQSTH,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,18133.0,16029.2,20787.57,6090.8665088837915,7790.524470676007,10694.070090191282 HLA-A*03:01,QLLRREVY,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,20930.4,23909.5,21021.66,7983.111817600068,14737.649498897768,17877.926347847344 HLA-A*03:01,LLRREVYDF,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,21305.1,22277.1,24721.05,15832.304015760437,19283.206536874794,20248.882622842077 HLA-A*03:01,KCLKFYSKI,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,26463.2,30831.3,28007.8,21373.22114892818,26154.45167537219,26504.28315878981 HLA-A*03:01,MSCCRSSRT,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,24516.5,27338.6,28748.97,15119.46430226626,19740.653965912104,24027.66602289625 HLA-A*03:01,PLCPEEKQR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,36295.1,36868.6,34912.68,15986.350453537061,23361.048188657267,25231.38625942724 HLA-A*11:01,AGQAEPDRA,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,41723.4,40700.5,32897.81,19487.655921806832,30992.293143074872,28645.275312916296 HLA-A*11:01,CDKCLKFYSK,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,8273.7,6893.5,5287.81,1057.9586125305268,1930.9392149616751,1160.6200182226905 HLA-A*11:01,CIVYRDGNPY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1549.9,1954.0,4175.53,1201.5119232425986,1523.6402337495904,1299.5845012037664 HLA-A*11:01,CLKFYSKISEY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,7376.9,8920.5,19570.09,7637.329624943686,8607.709095106029,8762.37463560671 HLA-A*11:01,CMSCCRSSR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,1592.3,1773.2,1842.96,488.0842002240792,1874.2298925866912,1782.2213109483835 HLA-A*11:01,CMSCCRSSRTR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,8619.7,9396.2,12933.23,2050.42703281226,5002.305870894132,4060.2372663091705 HLA-A*11:01,CQKPLCPEEK,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,5449.0,4837.6,4576.07,3343.3340164938622,4865.293587730572,2478.4329499518435 HLA-A*11:01,CTELQTTIHDI,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,35925.5,35188.4,35050.81,22798.707627700576,28660.626685495805,29746.469768459243 HLA-A*11:01,CVQSTHVDIR,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,2449.3,2115.8,3271.2,1291.8619090634695,4487.297919064697,3476.411583807726 HLA-A*11:01,CVYCKQQL,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,31728.1,31864.3,39604.52,14035.357103872793,20154.58255974632,21930.36670288617 HLA-A*11:01,CVYCKQQLLRR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,2403.7,2456.7,4831.97,93.83898846301727,390.7621648395705,423.73524575262087 HLA-A*11:01,DEIDGPAG,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,48003.1,47382.8,46217.22,27792.657178297242,38917.54642211169,38973.699846921714 HLA-A*11:01,DGNPYAVCDKC,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,40538.8,40097.4,36277.0,22644.889294346005,32958.07360819781,31155.150716482636 HLA-A*11:01,DIILECVYCKQ,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,17383.4,25455.0,12219.31,15002.464793098225,21154.070358240133,25959.531548526524 HLA-A*11:01,DKCLKFYSK,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,25328.9,27730.4,18143.61,5625.1027409749695,7487.455608354694,5159.269579738569 HLA-A*11:01,ETTDLYCY,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,28056.6,27712.1,27009.93,3114.3400173612004,8754.660161221043,11449.502370931597 HLA-A*11:01,ETTDLYCYE,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,16807.5,16298.1,23906.67,7638.863420046611,9078.933396460823,8752.514875295234 HLA-A*11:01,EVYDFAFRD,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,33871.9,29166.3,22421.45,10000.986830999123,14992.82471561801,10471.836474467988 HLA-A*11:01,FAFRDLCIVY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4890.6,5787.0,6695.51,2111.8075182587977,3764.62808001404,3468.643622885065 HLA-A*11:01,FYSKISEYR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,7460.3,7323.0,11508.38,7598.6440074526,9063.00748065181,7878.682800473727 HLA-A*11:01,GIVCPICS,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,36529.9,36951.7,37710.98,12178.449899354055,22401.8645937304,21862.68336374641 HLA-A*11:01,GIVCPICSQKP,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,5977.6,9779.0,7427.01,19797.42036602359,18897.169929317624,20931.652420488208 HLA-A*11:01,GNPYAVCDK,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,5427.2,9063.5,12577.73,3810.7391846558003,6521.732590493438,5437.6556973628 HLA-A*11:01,GTLGIVCPI,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,5656.2,4368.8,11138.54,6941.08461334701,9651.926068364071,7345.191953283194 HLA-A*11:01,GTTLEQQY,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,28459.9,28050.6,29129.4,4644.142127747263,11274.911093989678,12875.288108669034 HLA-A*11:01,GTTLEQQYNKP,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,6917.7,9681.4,4733.19,14846.621207594035,14920.752522801706,15942.816579493032 HLA-A*11:01,HYNIVTFCCK,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1212.9,1213.5,1042.44,986.2134889530138,1106.5693237358985,862.0328849786329 HLA-A*11:01,IILECVYCKQ,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1574.5,3232.2,2186.62,3679.051824763417,5954.129636216291,4311.148633844881 HLA-A*11:01,IRCINCQK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,16016.2,21088.2,18778.93,8480.580280892878,17388.291093062242,15253.674597972657 HLA-A*11:01,IVCPICSQKP,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,2826.4,4960.7,2205.49,16508.530727223904,16974.72338982387,15775.722075404898 HLA-A*11:01,KCLKFYSK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,15541.6,15933.7,6483.71,1688.5798741481885,5655.4332857194995,7313.001651474084 HLA-A*11:01,KFYSKISEY,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,4277.8,4132.4,4210.14,4972.939038785257,9118.133117261548,8700.969290004108 HLA-A*11:01,KFYSKISEYR,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1605.3,1633.4,2366.54,1137.0639999806385,2272.9980293324465,1729.8826861340624 HLA-A*11:01,KFYSKISEYRH,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,18415.7,19655.2,25751.96,14699.295372019302,23992.417951230054,25590.848944466867 HLA-A*11:01,KISEYRHY,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,17931.7,19198.5,15027.49,1522.6065110482944,4477.380176476408,5070.170946378111 HLA-A*11:01,KISEYRHYC,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,20196.7,19172.7,11647.81,10281.016527436794,4944.240035832017,5751.106983853338 HLA-A*11:01,KISEYRHYCYS,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,13337.5,14596.4,11597.26,4377.158306251542,7540.125987623304,7993.637624355907 HLA-A*11:01,KLPQLCTE,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,38181.5,38757.1,41573.79,16633.422440105976,27104.274879078985,29385.089805161864 HLA-A*11:01,KPLCDLLIR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,15434.3,15102.8,16968.61,8793.072708583251,11116.526219165933,11621.30038642246 HLA-A*11:01,KQRFHNIR,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,21443.4,19892.5,25255.0,5787.74716083292,13307.040556423251,13540.427098056638 HLA-A*11:01,KQRFHNIRGR,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4249.5,4445.0,12018.69,5409.382204732741,9711.896646958934,9812.403449787995 HLA-A*11:01,KQRHLDKK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,23657.8,18900.6,11497.93,2586.227786574936,6783.142480139129,7998.383868129876 HLA-A*11:01,LKFYSKISEYR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,11847.9,12677.9,15475.8,13037.329081950098,15505.198031189448,15286.376816878057 HLA-A*11:01,MFQDPQERPRK,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,10202.0,9296.4,11308.67,1280.2721339000564,1711.5512873649725,919.0610016561909 HLA-A*11:01,MSCCRSSR,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,8484.7,11909.6,13500.58,745.2206048255368,5216.293578749275,6881.621862690828 HLA-A*11:01,MSCCRSSRT,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,22981.7,27596.0,23953.79,11060.567746376115,14862.260431497814,13589.971511163352 HLA-A*11:01,MSCCRSSRTR,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1533.6,2308.9,1643.51,903.9767868061217,2074.1432121998073,1958.2968832103518 HLA-A*11:01,NIRGRWTGR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,14493.5,17810.6,20180.34,5890.516113854318,10879.94574628364,12143.640015284895 HLA-A*11:01,PAGQAEPDRA,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,46355.4,44968.7,41496.95,23063.434845277046,34165.494001505336,30850.645412976253 HLA-A*11:01,PLCPEEKQR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,36829.9,37176.6,32709.34,16598.379289006047,25603.592946354336,24689.211771860093 HLA-A*11:01,QTTIHDIILE,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,15820.5,17922.7,25662.12,5541.484079375929,11350.789872319578,9146.047895482036 HLA-A*11:01,RDGNPYAVCDK,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,23425.8,22986.2,21483.84,2351.0427263159063,5694.4144232026865,5896.370227517439 HLA-A*11:01,REVYDFAFR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,12364.8,10984.1,13509.78,2239.19763824527,5266.938322697817,4025.0188421705866 HLA-A*11:01,RHYCYSLY,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,20679.4,18175.4,26264.11,11030.244842726494,20766.472612386984,22126.468640123534 HLA-A*11:01,RLCVQSTHVD,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,36665.7,38873.9,31502.68,16439.925064143878,20797.42164828521,18900.914768442428 HLA-A*11:01,RTLEDLLM,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,25073.4,25150.0,28533.91,8568.430817036431,17210.176195650718,16426.73627097718 HLA-A*11:01,RTLEDLLMGT,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,10614.7,11547.7,17957.28,5427.7381364339035,11073.460570718235,8382.788506029578 HLA-A*11:01,SCCRSSRTR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,18883.7,24145.6,26662.08,15485.848069987858,21890.10996332307,20287.36552220845 HLA-A*11:01,SEYRHYCYS,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,23398.2,20096.9,25882.7,7242.909501939216,11946.170085596685,7814.238764311442 HLA-A*11:01,SEYRHYCYSLY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,17141.7,11630.6,20957.16,4964.468160017936,10681.487881770356,11395.416258121184 HLA-A*11:01,SKISEYRHYCY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,7955.9,12019.7,3460.45,8211.261537746985,13027.182753105479,13348.301499116104 HLA-A*11:01,SLYGTTLEQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,1994.1,2518.8,5669.4,909.8688747359337,2583.0824601605514,1509.6991300998684 HLA-A*11:01,SSEEEDEIDG,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,46388.6,45398.5,42990.49,21625.90201824093,30902.77595538252,30192.822903541386 HLA-A*11:01,STHVDIRTLE,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,8180.6,10690.3,17396.74,2351.1514694241355,3626.466390078379,3108.056300285067 HLA-A*11:01,STLRLCVQS,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,7311.6,8398.6,11216.42,2592.2153659165165,4993.4326595202865,3624.604111059481 HLA-A*11:01,STLRLCVQSTH,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,11210.0,8508.4,21889.29,3677.2775077249353,6870.0783172152405,6505.549577252196 HLA-A*11:01,TFCCKCDSTLR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,22933.5,20909.8,22830.75,2175.4325392765772,7119.048522834347,6740.3866863709045 HLA-A*11:01,TGRCMSCCR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,11664.8,14196.3,18365.21,7303.337786462746,12676.74558320295,12030.401042609656 HLA-A*11:01,TIHDIILEC,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,27744.8,24875.3,17265.29,14935.346863415803,15595.43261271422,13548.678252515494 HLA-A*11:01,TIHDIILECVY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,3895.1,2672.8,4811.78,2174.707726321328,6132.897803971964,4242.112406686189 HLA-A*11:01,TTDLYCYEQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,10077.9,11981.9,10163.91,2173.431967459284,5313.533654592557,3318.6427623216523 HLA-A*11:01,TTDLYCYEQLN,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,35658.6,32336.7,29490.29,10811.590918534217,14704.748465398878,12049.104505257204 HLA-A*11:01,TTIHDIILE,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,5708.2,6682.6,9740.68,2152.1711328398355,3144.269092022183,2404.548142607724 HLA-A*11:01,TTIHDIILEC,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,20096.2,21278.2,15893.42,13869.607493932192,15474.210571434014,13922.373319334065 HLA-A*11:01,TTLEQQYNKP,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1705.9,1893.4,709.82,14394.018049627624,10986.393844503771,8565.266976037352 HLA-A*11:01,TTLEQQYNKPL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,16816.0,14604.8,7924.39,16751.873641029164,19942.592102160306,15317.980158638191 HLA-A*11:01,VTFCCKCDS,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,15433.2,18465.4,20534.74,6336.414626546366,11300.937689146247,10910.325644877645 HLA-A*11:01,VYCKQQLLR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,8470.8,9908.1,6611.43,4227.101931069413,8653.539142274069,6781.498224130493 HLA-A*11:01,YSKISEYR,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,10650.0,13959.6,19078.77,5073.774072307504,9928.3530788146,7545.033627566686 HLA-A*11:01,YSKISEYRH,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,23416.7,21120.8,19254.0,13898.256380507719,20758.7157315749,17581.880315582115 HLA-A*11:01,YSLYGTTLEQ,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4900.2,5991.6,16898.07,5990.40340289689,8845.80405880307,7233.2704224236295 HLA-A*24:02,RWTGRCMSCC,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,12646.1,17842.8,9956.13,2327.51469183589,4316.3125469468705,4864.483113368513 HLA-A*24:02,IVYRDGNPYA,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,30398.7,29113.0,27617.81,14403.729281193133,19063.353259695068,18682.20111462103 HLA-A*24:02,LLMGTLGIVC,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,41830.1,38467.6,31101.01,8535.885812364837,10566.25636941926,17589.22672256815 HLA-A*24:02,CDSTLRLCV,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,37420.4,34181.2,35314.62,17019.067445824192,19265.427300303934,21144.969105576147 HLA-A*24:02,RWTGRCMSC,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,8183.3,11769.2,4275.6,1252.129180436395,3292.725140390301,2210.2280345417207 HLA-A*24:02,KKQRFHNIRG,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,40321.0,40204.7,39485.14,18274.05257410025,19301.011905667063,23056.192391966866 HLA-A*24:02,DFAFRDLCIV,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,19689.7,20285.9,20730.97,7285.596677999693,11784.91100066803,11840.785810576412 HLA-A*24:02,YCYSLYGTTL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,268.9,342.4,134.87,4045.001672952072,6291.939345660424,4901.339636410948 HLA-A*24:02,CYEQLNDSSE,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,33221.5,33039.4,27771.52,10510.647969789583,12029.17312200454,19754.559503290977 HLA-A*24:02,EYMLDLQPE,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,24906.0,25762.3,13459.45,2627.735370486799,4674.805189252864,4188.678260213211 HLA-A*24:02,LYCYEQLNDS,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,33078.8,30784.3,26307.61,7872.069624051399,9035.551260635362,21149.095121956765 HLA-A*24:02,EYMLDLQPET,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,27655.5,25809.7,21242.99,4744.62409060371,7767.151151194414,9194.004919948033 HLA-A*24:02,HYCYSLYGTT,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,13921.3,13727.3,9117.55,4160.420166078235,7680.8767122373865,6305.814446087444 HLA-A*24:02,CYEQLNDSS,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,31067.7,31256.9,25011.36,7807.102866221178,8956.773474358984,12966.768480464609 HLA-A*24:02,QQYNKPLCDL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,8431.5,11155.1,14362.04,14481.133400705226,18341.356262682217,22837.715700467557 HLA-A*24:02,NPYAVCDKCL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,10467.5,15642.6,18381.11,19232.4395447782,22612.536963433042,29874.648854998188 HLA-A*24:02,LYGTTLEQQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,28990.4,26818.0,14067.07,3472.181258108957,5467.901453685499,7824.765679419533 HLA-A*24:02,LDKKQRFHNI,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,39331.7,33720.9,24254.75,10760.48301466704,13079.386571515302,20192.747930564517 HLA-A*24:02,LRREVYDFAF,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,15282.3,13888.3,9032.62,3396.447163543621,4625.537091423434,6698.489881155511 HLA-A*24:02,RCINCQKPL,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,37134.8,37655.9,23544.46,10265.641030587249,14067.48892259074,21094.348221815093 HLA-A*24:02,TLEDLLMGTL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,30399.7,28756.1,28965.04,11968.230862651542,14649.88784954922,26051.10082437397 HLA-A*24:02,FYSKISEYR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,9771.4,9577.7,7663.92,2517.1746850747663,4142.750766266233,4009.092735139147 HLA-A*24:02,QLLRREVYDF,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,8433.7,9138.2,6034.56,1310.3032659857092,2974.8412189658825,5017.241639230572 HLA-A*24:02,RHLDKKQRF,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,5098.1,9996.1,2766.13,624.1467030641506,1176.3738893945574,2251.6225660901514 HLA-A*24:02,VDIRTLEDL,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,31430.5,32842.3,26183.23,14396.492717335888,17405.885082392062,21649.131058989424 HLA-A*24:02,VDIRTLEDLL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,30708.1,31901.9,23643.51,16245.343259640471,19853.677601398125,25142.400644843307 HLA-A*24:02,DPQERPRKL,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,45927.6,44371.8,40129.47,18731.668651537042,20882.49224815732,25848.272337163253 HLA-A*24:02,LCVQSTHVDIR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,44114.8,42730.3,37951.25,23082.196613387925,25362.85581135644,34825.67527716447 HLA-A*24:02,TFCCKCDSTLR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,26034.1,32333.2,29078.7,16550.591567148018,19665.39300949906,24965.192500271387 HLA-A*24:02,EYMLDLQPETT,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,33132.1,29578.5,26569.63,2314.188613306457,4274.95201592503,6762.439605732876 HLA-A*24:02,RTLEDLLMGTL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,23833.8,19335.6,26563.04,7132.363209150767,10084.0069546467,16049.337486401597 HLA-A*24:02,CYSLYGTT,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,26920.4,27792.6,18030.1,2537.044719367281,3859.837211588529,12517.958554324397 HLA-A*24:02,SEYRHYCYSLY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,10564.2,16609.5,9611.69,10111.367483128466,15044.378332556398,22937.54791454256 HLA-A*24:02,QQLLRREVYDF,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,13218.7,13841.1,18489.62,2628.5987247809007,4844.5063343588,14465.954769608485 HLA-A*24:02,REVYDFAFRDL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,8446.6,6586.4,14573.68,11115.580407908974,14349.687826574016,11849.240258871943 HLA-A*24:02,ECVYCKQQLLR,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,38119.6,37341.5,31379.52,25523.90440628299,26560.196552286587,35494.326036429564 HLA-A*24:02,YDFAFRDLCIV,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,21789.1,26267.5,16421.16,18867.044391276177,22701.055813824718,30793.33695416457 HLA-A*24:02,GNPYAVCDKCL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,26546.4,27740.6,34978.46,16938.861890850312,20381.577819995644,27403.483742458222 HLA-A*24:02,CLKFYSKISEY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,24856.2,23225.4,37524.57,26914.97977266992,27765.476529918862,40336.140749917526 HLA-A*24:02,ISEYRHYCYSL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,2833.5,2355.4,3113.45,8899.099085509657,11589.442806600184,19249.411082425595 HLA-A*24:02,EVYDFAFRDLC,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,24585.8,25415.6,22725.03,20922.26895286488,23293.65328310457,32126.65772282363 HLA-A*24:02,YYCYSVYGTTL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,216.6,202.8,604.7,111.89359456203823,301.8856522689136,427.51753151815245 HLA-A*24:02,YYCYSVYGTT,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,7525.9,7137.3,1947.24,1525.68790783909,3382.4220501099353,3628.565531893391 HLA-A*24:02,SEYRYYCYSV,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1054.0,2190.0,2876.35,7275.177471932455,11336.546020412681,15400.903755077848 HLA-A*24:02,YYCYSVYGT,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,7889.0,7567.3,6728.99,2629.136425290338,4638.798012449303,6811.211221578079 HLA-A*24:02,EYRYYCYSVY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,7795.8,7867.7,7892.64,991.8631191941313,1866.2659332119367,3302.622051967073 HLA-A*24:02,VYGTTLEQQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,28208.5,24869.1,10684.19,3000.441701810754,4928.23580615368,6186.455574963915 HLA-B*07:02,GPAGQAEPDRA,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,14048.1,16452.5,15440.19,8439.613951352983,7297.677323820672,19040.17544763588 HLA-B*07:02,LPQLCTELQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,11909.2,16362.1,8416.83,5938.424953192735,4843.336291632932,6641.374936153506 HLA-B*07:02,TPTLHEYMLDL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,3949.5,5038.2,2848.26,768.4217841785478,1302.9485673908416,2715.12986266422 HLA-B*07:02,EPDRAHYNI,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,4371.2,5465.6,10667.68,7408.608322233509,7762.451996891709,12742.865461393372 HLA-B*07:02,RCINCQKPL,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,5829.8,10020.6,10881.59,3948.634140996812,3630.282590768997,7602.4332938880725 HLA-B*07:02,LPQLCTELQTT,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,11770.8,12514.7,11799.65,4419.9396490359295,3282.740576315066,8159.9436921048045 HLA-B*07:02,YSLYGTTL,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,15487.0,12208.5,23550.32,8041.795089062719,5743.020502832607,14662.043113555439 HLA-B*07:02,GPAGQAEPD,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,18549.3,22758.7,10408.18,5409.346556132906,4792.710922930783,6776.763925503233 HLA-B*07:02,CVYCKQQL,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,24775.7,17574.2,29636.79,9462.35507254124,8425.700072279475,13477.150061657196 HLA-B*07:02,NPYAVCDKCL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,2833.6,2857.8,3554.75,1510.460666972149,1788.5132709715024,3572.3129531873565 HLA-B*07:02,SEYRHYCYSL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,16944.8,13971.8,23377.94,11601.694482651614,11169.815939819517,14290.891903899379 HLA-B*07:02,QPETTDLYCY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,26188.3,26393.7,28506.75,18330.593632548607,14625.753154498847,15556.322880163614 HLA-B*15:01,DLQPETTDLY,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,1985.9,2981.1,1131.31,3901.182659640288,4483.832141070158,1783.8474540063705 HLA-B*15:01,SEYRHYCYSL,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,4282.6,5063.9,4628.91,3965.6009998798,6776.729747724399,4161.584395180935 HLA-B*15:01,RLCVQSTHV,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,3307.3,3976.7,1399.08,991.6851693379456,782.1412939991621,668.6607439441259 HLA-B*15:01,LMGTLGIVC,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,10940.6,9196.3,2283.83,1163.2972888083507,2451.3715853407625,1714.1131992773676 HLA-B*15:01,SLYGTTLEQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,7925.2,8401.9,4879.94,3679.8327331602363,4346.2989638983645,4685.072392552245 HLA-B*15:01,LLIRCINCQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,15785.5,17114.1,7808.63,4894.483493790985,6755.436663280311,4899.414494827697 HLA-B*15:01,LEQQYNKPL,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,10517.3,11395.1,3724.69,2763.669943063591,3815.3322109175483,1596.0868186309488 HLA-B*15:01,QAEPDRAHY,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,5004.4,6088.1,3473.69,2522.379797450491,4143.677865503523,3351.3820256185163 HLA-B*15:01,GTLGIVCPI,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,3304.0,3917.1,6258.59,4511.577434755824,6087.242606478117,4170.298962941786 HLA-B*15:01,GIVCPICSQ,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,15376.8,18112.8,6329.0,6001.218223650592,7331.933504408098,6918.57362795794 HLA-B*15:01,QLNDSSEEE,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,32349.3,31283.9,17375.87,13513.985673522251,15056.571198816013,20926.329416096352 HLA-B*15:01,CMSCCRSSR,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,17864.8,16099.6,15117.01,6856.540480813101,7400.988988509392,10515.678390013729 HLA-B*15:01,MSCCRSSRT,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,21090.0,24486.0,20596.6,9843.743232345192,12450.37128504561,16894.533840304917 HLA-B*15:01,RSSRTRRETQ,10,100.0,nb,,NON-CONFIDENTIAL,100000.0,24184.0,26577.4,17711.83,5047.551635684806,7137.601056542866,3896.277724665923 HLA-B*15:01,FAFRDLCIV,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,4061.7,4421.6,11152.53,4739.977927422689,6404.1837745263065,6853.42945161375 HLA-B*15:01,LIRCINCQK,9,100.0,nb,,NON-CONFIDENTIAL,100000.0,20383.5,18954.9,15499.94,6841.424715671967,9989.585883938127,12415.662202950058 HLA-B*15:01,LMGTLGIVCPI,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,3804.9,5684.1,5377.35,300.37054166544965,480.78461830160103,1357.4092613559171 HLA-B*15:01,REVYDFAF,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,7893.8,8117.0,4471.38,319.6990871014404,329.72918502561424,730.5215018668864 HLA-B*15:01,VQSTHVDIRTL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,7355.2,4917.9,11578.08,871.4412256872432,997.933215443048,2237.2053353204565 HLA-B*15:01,LIRCINCQKPL,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,4240.5,6136.4,8293.61,1327.251814535686,2510.971864538838,5517.449886787486 HLA-B*15:01,RLCVQSTH,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,15171.7,13984.7,17594.75,1230.1589376680622,1082.1936270282201,1195.1841288138844 HLA-B*15:01,FYSKISEYRHY,11,100.0,nb,,NON-CONFIDENTIAL,100000.0,5921.2,6033.2,5410.21,6511.682318012961,7712.374659604434,10691.632383740738 HLA-B*15:01,TLGIVCPI,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,20397.2,18270.7,18481.22,3542.624250266721,3264.328781981469,4857.917071540425 HLA-B*15:01,RTRRETQL,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,20971.0,19528.8,24587.69,3000.259755732219,5335.501010276689,5763.350117362581 HLA-B*15:01,MSCCRSSR,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,27739.7,31263.0,33102.03,9088.570284361696,10481.258964209477,17024.63267992658 HLA-B*15:01,CVYCKQQL,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,26148.1,21053.8,30864.02,3813.192639109835,7495.5400912868445,8313.235518311285 HLA-B*15:01,KQRHLDKK,8,100.0,nb,,NON-CONFIDENTIAL,100000.0,29028.1,28410.4,29631.98,9377.071195923309,11672.093401923024,19848.68824116367 mhcflurry-2.3.6/test/data/master_affinity_fixture_config.json000066400000000000000000000155251525677230600246240ustar00rootroot00000000000000{"_network": null, "fit_info": [], "hyperparameters": {"activation": "tanh", "allele_amino_acid_encoding": "BLOSUM62", "allele_dense_layer_sizes": [], "batch_normalization": true, "data_dependent_initialization_method": null, "dense_layer_l1_regularization": 0.0, "dense_layer_l2_regularization": 0.0, "dropout_probability": 0.0, "early_stopping": true, "init": "glorot_uniform", "layer_sizes": [4], "learning_rate": null, "locally_connected_layers": [{"activation": "tanh", "filters": 2, "kernel_size": 2}], "loss": "custom:mse_with_inequalities", "max_epochs": 500, "min_delta": 0.0, "minibatch_size": 128, "num_outputs": 1, "optimizer": "rmsprop", "output_activation": "sigmoid", "patience": 20, "peptide_allele_merge_activation": "", "peptide_allele_merge_method": "multiply", "peptide_dense_layer_sizes": [], "peptide_encoding": {"alignment_method": "pad_middle", "left_edge": 4, "max_length": 15, "right_edge": 4, "vector_encoding_name": "BLOSUM62"}, "random_negative_affinity_max": 50000.0, "random_negative_affinity_min": 20000.0, "random_negative_binder_threshold": null, "random_negative_constant": 0, "random_negative_distribution_smoothing": 0.0, "random_negative_lengths": [8, 9, 10, 11, 12, 13, 14, 15], "random_negative_match_distribution": true, "random_negative_method": "recommended", "random_negative_output_indices": null, "random_negative_rate": 0.0, "topology": "feedforward", "train_data": {}, "validation_split": 0.1}, "network_json": "{\"class_name\": \"Functional\", \"config\": {\"name\": \"predictor\", \"trainable\": true, \"layers\": [{\"module\": \"keras.layers\", \"class_name\": \"InputLayer\", \"config\": {\"batch_input_shape\": [null, 15, 21], \"dtype\": \"float32\", \"sparse\": false, \"ragged\": false, \"name\": \"peptide\"}, \"registered_name\": null, \"name\": \"peptide\", \"inbound_nodes\": []}, {\"module\": \"keras.layers\", \"class_name\": \"LocallyConnected1D\", \"config\": {\"name\": \"lc_0\", \"trainable\": true, \"dtype\": \"float32\", \"filters\": 2, \"kernel_size\": [2], \"strides\": [1], \"padding\": \"valid\", \"data_format\": \"channels_last\", \"activation\": \"tanh\", \"use_bias\": true, \"kernel_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"GlorotUniform\", \"config\": {\"seed\": null}, \"registered_name\": null}, \"bias_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"Zeros\", \"config\": {}, \"registered_name\": null}, \"kernel_regularizer\": null, \"bias_regularizer\": null, \"activity_regularizer\": null, \"kernel_constraint\": null, \"bias_constraint\": null, \"implementation\": 1}, \"registered_name\": null, \"build_config\": {\"input_shape\": [null, 15, 21]}, \"name\": \"lc_0\", \"inbound_nodes\": [[[\"peptide\", 0, 0, {}]]]}, {\"module\": \"keras.layers\", \"class_name\": \"Flatten\", \"config\": {\"name\": \"flattened_0\", \"trainable\": true, \"dtype\": \"float32\", \"data_format\": \"channels_last\"}, \"registered_name\": null, \"build_config\": {\"input_shape\": [null, 14, 2]}, \"name\": \"flattened_0\", \"inbound_nodes\": [[[\"lc_0\", 0, 0, {}]]]}, {\"module\": \"keras.layers\", \"class_name\": \"BatchNormalization\", \"config\": {\"name\": \"batch_norm_early\", \"trainable\": true, \"dtype\": \"float32\", \"axis\": [1], \"momentum\": 0.99, \"epsilon\": 0.001, \"center\": true, \"scale\": true, \"beta_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"Zeros\", \"config\": {}, \"registered_name\": null}, \"gamma_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"Ones\", \"config\": {}, \"registered_name\": null}, \"moving_mean_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"Zeros\", \"config\": {}, \"registered_name\": null}, \"moving_variance_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"Ones\", \"config\": {}, \"registered_name\": null}, \"beta_regularizer\": null, \"gamma_regularizer\": null, \"beta_constraint\": null, \"gamma_constraint\": null}, \"registered_name\": null, \"build_config\": {\"input_shape\": [null, 28]}, \"name\": \"batch_norm_early\", \"inbound_nodes\": [[[\"flattened_0\", 0, 0, {}]]]}, {\"module\": \"keras.layers\", \"class_name\": \"Dense\", \"config\": {\"name\": \"dense_0\", \"trainable\": true, \"dtype\": \"float32\", \"units\": 4, \"activation\": \"tanh\", \"use_bias\": true, \"kernel_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"GlorotUniform\", \"config\": {\"seed\": null}, \"registered_name\": null}, \"bias_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"Zeros\", \"config\": {}, \"registered_name\": null}, \"kernel_regularizer\": null, \"bias_regularizer\": null, \"activity_regularizer\": null, \"kernel_constraint\": null, \"bias_constraint\": null}, \"registered_name\": null, \"build_config\": {\"input_shape\": [null, 28]}, \"name\": \"dense_0\", \"inbound_nodes\": [[[\"batch_norm_early\", 0, 0, {}]]]}, {\"module\": \"keras.layers\", \"class_name\": \"BatchNormalization\", \"config\": {\"name\": \"batch_norm_0\", \"trainable\": true, \"dtype\": \"float32\", \"axis\": [1], \"momentum\": 0.99, \"epsilon\": 0.001, \"center\": true, \"scale\": true, \"beta_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"Zeros\", \"config\": {}, \"registered_name\": null}, \"gamma_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"Ones\", \"config\": {}, \"registered_name\": null}, \"moving_mean_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"Zeros\", \"config\": {}, \"registered_name\": null}, \"moving_variance_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"Ones\", \"config\": {}, \"registered_name\": null}, \"beta_regularizer\": null, \"gamma_regularizer\": null, \"beta_constraint\": null, \"gamma_constraint\": null}, \"registered_name\": null, \"build_config\": {\"input_shape\": [null, 4]}, \"name\": \"batch_norm_0\", \"inbound_nodes\": [[[\"dense_0\", 0, 0, {}]]]}, {\"module\": \"keras.layers\", \"class_name\": \"Dense\", \"config\": {\"name\": \"output\", \"trainable\": true, \"dtype\": \"float32\", \"units\": 1, \"activation\": \"sigmoid\", \"use_bias\": true, \"kernel_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"GlorotUniform\", \"config\": {\"seed\": null}, \"registered_name\": null}, \"bias_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"Zeros\", \"config\": {}, \"registered_name\": null}, \"kernel_regularizer\": null, \"bias_regularizer\": null, \"activity_regularizer\": null, \"kernel_constraint\": null, \"bias_constraint\": null}, \"registered_name\": null, \"build_config\": {\"input_shape\": [null, 4]}, \"name\": \"output\", \"inbound_nodes\": [[[\"batch_norm_0\", 0, 0, {}]]]}], \"input_layers\": [[\"peptide\", 0, 0]], \"output_layers\": [[\"output\", 0, 0]]}, \"keras_version\": \"2.17.0\", \"backend\": \"tensorflow\"}", "network_weights": null, "network_weights_loader": null, "prediction_cache": null}mhcflurry-2.3.6/test/data/master_affinity_fixture_predictions.json000066400000000000000000000001771525677230600256770ustar00rootroot00000000000000{"peptides": ["AAAAAAAAA", "CCCCCCCCC", "ACDEFGHIK"], "predictions": [223.6097539934542, 223.6097539934542, 223.6097539934542]}mhcflurry-2.3.6/test/data/master_affinity_fixture_weights.npz000066400000000000000000000221061525677230600246600ustar00rootroot00000000000000PK-!0]u�ÿÿÿÿÿÿÿÿ array_0.npyàà“NUMPYv{'descr': '%>J >o>“>¸>Ý$>+>'1>L7 >q= >–C >ºI >ßO >V>)\>Nb>sh>˜n>¼t>áz>�>+‡>P�>u“>š™>¾Ÿ>ã¥>¬>-²>R¸>w¾>œÄ >ÁÊ!>åÐ"> ×#>/Ý$>Tã%>yé&>žï'>Ãõ(>çû)> +>1,>V->{.> />Å 0>é&1>-2>333>X94>}?5>¢E6>ÇK7>ìQ8>X9>5^:>Zd;>j<>¤p=>Év>>î|?>ƒ@>7‰A>\�B>�•C>¦›D>Ë¡E>ð§F>®G>9´H>^ºI>ƒÀJ>¨ÆK>ÍÌL>òÒM>ÙN>;ßO>`åP>…ëQ>ªñR>Ï÷S>ôýT>V>= W>bX>‡Y>¬Z>Ñ"[>ö(\>/]>?5^>d;_>‰A`>®Ga>ÓMb>øSc>Zd>B`e>fff>‹lg>°rh>Õxi>ú~j>…k>D‹l>h‘m>�—n>²�o>×£p>ü©q>!°r>F¶s>j¼t>�Âu>´Èv>ÙÎw>þÔx>#Ûy>Ház>mç{>‘í|>¶ó}>Ûù~>€>ƒ€>%�>7‰�>J ‚>\�‚>oƒ>�•ƒ>“„>¦›„>¸…>Ë¡…>Ý$†>ð§†>+‡>®‡>'1ˆ>9´ˆ>L7‰>^º‰>q=Š>ƒÀŠ>–C‹>¨Æ‹>ºIŒ>ÍÌŒ>ßO�>òÒ�>VŽ>ÙŽ>)\�>;ß�>Nb�>`å�>sh‘>…ë‘>˜n’>ªñ’>¼t“>Ï÷“>áz”>ôý”>�•>–>+‡–>= —>P�—>b˜>u“˜>‡™>š™™>¬š>¾Ÿš>Ñ"›>㥛>ö(œ>¬œ>/�>-²�>?5ž>R¸ž>d;Ÿ>w¾Ÿ>‰A >œÄ >®G¡>ÁÊ¡>ÓM¢>åТ>øS£> ×£>Z¤>/ݤ>B`¥>Tã¥>ff¦>yé¦>‹l§>žï§>°r¨>Ãõ¨>Õx©>çû©>ú~ª> «>…«>1¬>D‹¬>V­>h‘­>{®>�—®> ¯>²�¯>Å °>×£°>é&±>ü©±>-²>!°²>33³>F¶³>X9´>j¼´>}?µ>�µ>¢E¶>´È¶>ÇK·>Ùη>ìQ¸>þÔ¸>X¹>#Û¹>5^º>Háº>Zd»>mç»>j¼>‘í¼>¤p½>¶ó½>Év¾>Ûù¾>î|¿>À>ƒÀ>%Á>7‰Á>J Â>\�Â>oÃ>�•Ã>“Ä>¦›Ä>¸Å>Ë¡Å>Ý$Æ>ð§Æ>+Ç>®Ç>'1È>9´È>L7É>^ºÉ>q=Ê>ƒÀÊ>–CË>¨ÆË>ºIÌ>ÍÌÌ>ßOÍ>òÒÍ>VÎ>ÙÎ>)\Ï>;ßÏ>NbÐ>`åÐ>shÑ>…ëÑ>˜nÒ>ªñÒ>¼tÓ>Ï÷Ó>ázÔ>ôýÔ>�Õ>Ö>+‡Ö>= ×>P�×>bØ>u“Ø>‡Ù>š™Ù>¬Ú>¾ŸÚ>Ñ"Û>ã¥Û>ö(Ü>¬Ü>/Ý>-²Ý>?5Þ>R¸Þ>d;ß>w¾ß>‰Aà>œÄà>®Gá>ÁÊá>ÓMâ>åÐâ>øSã> ×ã>Zä>/Ýä>B`å>Tãå>ffæ>yéæ>‹lç>žïç>°rè>Ãõè>Õxé>çûé>ú~ê> ë>…ë>1ì>D‹ì>Ví>h‘í>{î>�—î> ï>²�ï>Å ð>×£ð>é&ñ>ü©ñ>-ò>!°ò>33ó>F¶ó>X9ô>j¼ô>}?õ>�Âõ>¢Eö>´Èö>ÇK÷>ÙÎ÷>ìQø>þÔø>Xù>#Ûù>5^ú>Háú>Zdû>mçû>jü>‘íü>¤pý>¶óý>Évþ>Ûùþ>î|ÿ>?‰A?ƒ?œÄ?%?®G?7‰?ÁÊ?J ?ÓM?\�?åÐ?o?øS?�•? ×?“?Z?¦›?/Ý?¸?B`?Ë¡?Tã?Ý$?ff?ð§?yé?+?‹l?®?žï?'1?°r?9´?Ãõ?L7 ?Õx ?^º ?çû ?q= ?ú~ ?ƒÀ ?  ?–C ?… ?¨Æ ?1 ?ºI ?D‹ ?ÍÌ ?V ?ßO ?h‘ ?òÒ ?{?V?�—?Ù? ?)\?²�?;ß?Å ?Nb?×£?`å?é&?sh?ü©?…ë?-?˜n?!°?ªñ?33?¼t?F¶?Ï÷?X9?áz?j¼?ôý?}??�?�Â??¢E?+‡?´È?= ?ÇK?P�?ÙÎ?b?ìQ?u“?þÔ?‡?X?š™?#Û?¬?5^?¾Ÿ?Há?Ñ"?Zd?ã¥?mç?ö(?j?¬?‘í?/?¤p?-²?¶ó??5?Év?R¸?Ûù?d;?î|?w¾? ?‰A ?ƒ ?œÄ ?%!?®G!?7‰!?ÁÊ!?J "?ÓM"?\�"?åÐ"?o#?øS#?�•#? ×#?“$?Z$?¦›$?/Ý$?¸%?B`%?Ë¡%?Tã%?Ý$&?ff&?ð§&?yé&?+'?‹l'?®'?žï'?'1(?°r(?9´(?Ãõ(?L7)?Õx)?^º)?çû)?q=*?ú~*?ƒÀ*? +?–C+?…+?¨Æ+?1,?ºI,?D‹,?ÍÌ,?V-?ßO-?h‘-?òÒ-?{.?V.?�—.?Ù.? /?)\/?²�/?;ß/?Å 0?Nb0?×£0?`å0?é&1?sh1?ü©1?…ë1?-2?˜n2?!°2?ªñ2?333?¼t3?F¶3?Ï÷3?X94?áz4?j¼4?ôý4?}?5?�5?�Â5?6?¢E6?+‡6?´È6?= 7?ÇK7?P�7?ÙÎ7?b8?ìQ8?u“8?þÔ8?‡9?X9?š™9?#Û9?¬:?5^:?¾Ÿ:?Há:?Ñ";?Zd;?ã¥;?mç;?ö(?Év>?R¸>?Ûù>?d;??î|??w¾??@?‰A@?ƒ@?œÄ@?%A?®GA?7‰A?ÁÊA?J B?ÓMB?\�B?åÐB?oC?øSC?�•C? ×C?“D?ZD?¦›D?/ÝD?¸E?B`E?Ë¡E?TãE?Ý$F?ffF?ð§F?yéF?+G?‹lG?®G?žïG?'1H?°rH?9´H?ÃõH?L7I?ÕxI?^ºI?çûI?q=J?ú~J?ƒÀJ? K?–CK?…K?¨ÆK?1L?ºIL?D‹L?ÍÌL?VM?ßOM?h‘M?òÒM?{N?VN?�—N?ÙN? O?)\O?²�O?;ßO?Å P?NbP?×£P?`åP?é&Q?shQ?ü©Q?…ëQ?-R?˜nR?!°R?ªñR?33S?¼tS?F¶S?Ï÷S?X9T?ázT?j¼T?ôýT?}?U?�U?�ÂU?V?¢EV?+‡V?´ÈV?= W?ÇKW?P�W?ÙÎW?bX?ìQX?u“X?þÔX?‡Y?XY?š™Y?#ÛY?¬Z?5^Z?¾ŸZ?HáZ?Ñ"[?Zd[?ã¥[?mç[?ö(\?j\?¬\?‘í\?/]?¤p]?-²]?¶ó]??5^?Év^?R¸^?Ûù^?d;_?î|_?w¾_?`?‰A`?ƒ`?œÄ`?%a?®Ga?7‰a?ÁÊa?J b?ÓMb?\�b?åÐb?oc?øSc?�•c? ×c?“d?Zd?¦›d?/Ýd?¸e?B`e?Ë¡e?Tãe?Ý$f?fff?ð§f?yéf?+g?‹lg?®g?žïg?'1h?°rh?9´h?Ãõh?L7i?Õxi?^ºi?çûi?q=j?ú~j?ƒÀj? k?–Ck?…k?¨Æk?1l?ºIl?D‹l?ÍÌl?Vm?ßOm?h‘m?òÒm?{n?Vn?�—n?Ùn? o?)\o?²�o?;ßo?Å p?Nbp?×£p?`åp?é&q?shq?ü©q?…ëq?-r?˜nr?!°r?ªñr?33s?¼ts?F¶s?Ï÷s?X9t?ázt?j¼t?ôýt?}?u?�u?�Âu?v?¢Ev?+‡v?´Èv?= w?ÇKw?P�w?ÙÎw?bx?ìQx?u“x?þÔx?‡y?Xy?š™y?#Ûy?¬z?5^z?¾Ÿz?Ház?Ñ"{?Zd{?ã¥{?mç{?ö(|?j|?¬|?‘í|?/}?¤p}?-²}?¶ó}??5~?Év~?R¸~?Ûù~?d;?î|?w¾?€?Å €?‰A€?Nb€?ƒ€?×£€?œÄ€?`å€?%�?é&�?®G�?sh�?7‰�?ü©�?ÁÊ�?…ë�?J ‚?-‚?ÓM‚?˜n‚?\�‚?!°‚?åЂ?ªñ‚?oƒ?33ƒ?øSƒ?¼tƒ?�•ƒ?F¶ƒ? ׃?Ï÷ƒ?“„?X9„?Z„?áz„?¦›„?j¼„?/Ý„?ôý„?¸…?}?…?B`…?�…?Ë¡…?�Â…?Tã…?†?Ý$†?¢E†?ff†?+‡†?ð§†?´È†?yé†?= ‡?+‡?ÇK‡?‹l‡?P�‡?®‡?Ù·?žï‡?bˆ?'1ˆ?ìQˆ?°rˆ?u“ˆ?9´ˆ?þÔˆ?Ãõˆ?‡‰?L7‰?X‰?Õx‰?š™‰?^º‰?#Û‰?çû‰?¬Š?q=Š?5^Š?ú~Š?¾ŸŠ?ƒÀŠ?HáŠ? ‹?Ñ"‹?–C‹?Zd‹?…‹?㥋?¨Æ‹?mç‹?1Œ?ö(Œ?ºIŒ?jŒ?D‹Œ?¬Œ?ÍÌŒ?‘íŒ?V�?/�?ßO�?¤p�?h‘�?-²�?òÒ�?¶ó�?{Ž??5Ž?VŽ?ÉvŽ?�—Ž?R¸Ž?ÙŽ?ÛùŽ? �?d;�?)\�?î|�?²��?w¾�?;ß�?�?Å �?‰A�?Nb�?ƒ�?×£�?œÄ�?`å�?%‘?é&‘?®G‘?sh‘?7‰‘?ü©‘?ÁÊ‘?…ë‘?J ’?-’?ÓM’?˜n’?\�’?!°’?åÐ’?ªñ’?o“?33“?øS“?¼t“?�•“?F¶“? ד?Ï÷“?“”?X9”?Z”?áz”?¦›”?j¼”?/Ý”?ôý”?¸•?}?•?B`•?�•?Ë¡•?�•?Tã•?–?Ý$–?¢E–?ff–?PK-!ø¡=aÿÿÿÿÿÿÿÿ array_1.npyðð“NUMPYv{'descr': '%>J >o>“>¸>Ý$>+>'1>L7 >q= >–C >ºI >ßO >V>)\>Nb>sh>˜n>¼t>áz>�>+‡>P�>u“>š™>¾Ÿ>ã¥>¬>-²>R¸>w¾>œÄ >ÁÊ!>åÐ"> ×#>/Ý$>Tã%>yé&>žï'>Ãõ(>çû)> +>1,>V->{.> />Å 0>é&1>-2>333>X94>}?5>¢E6>ÇK7>ìQ8>X9>5^:>Zd;>j<>¤p=>Év>>î|?>ƒ@>7‰A>\�B>�•C>¦›D>Ë¡E>ð§F>®G>9´H>^ºI>ƒÀJ>¨ÆK>ÍÌL>òÒM>ÙN>;ßO>`åP>…ëQ>ªñR>Ï÷S>ôýT>V>= W>bX>‡Y>¬Z>Ñ"[>ö(\>/]>?5^>d;_>‰A`>®Ga>ÓMb>øSc>Zd>B`e>fff>‹lg>°rh>Õxi>ú~j>…k>D‹l>h‘m>�—n>²�o>×£p>ü©q>!°r>F¶s>j¼t>�Âu>´Èv>ÙÎw>þÔx>#Ûy>Ház>mç{>‘í|>¶ó}>Ûù~>€>ƒ€>%�>7‰�>J ‚>\�‚>oƒ>�•ƒ>“„>¦›„>¸…>Ë¡…>Ý$†>ð§†>+‡>®‡>'1ˆ>9´ˆ>L7‰>^º‰>q=Š>ƒÀŠ>–C‹>¨Æ‹>ºIŒ>ÍÌŒ>ßO�>òÒ�>VŽ>ÙŽ>)\�>;ß�>Nb�>`å�>sh‘>…ë‘>˜n’>ªñ’>¼t“>Ï÷“>áz”>ôý”>�•>–>+‡–>= —>P�—>b˜>u“˜>‡™>š™™>¬š>¾Ÿš>Ñ"›>㥛>ö(œ>¬œ>/�>-²�>?5ž>R¸ž>d;Ÿ>w¾Ÿ>‰A >œÄ >®G¡>ÁÊ¡>ÓM¢>åТ>øS£> ×£>Z¤>/ݤ>B`¥>Tã¥>ff¦>yé¦>‹l§>žï§>°r¨>Ãõ¨>Õx©>çû©>ú~ª> «>…«>1¬>D‹¬>V­>h‘­>{®>�—®> ¯>²�¯>Å °>×£°>é&±>ü©±>-²>!°²>33³>F¶³>X9´>j¼´>}?µ>�µ>¢E¶>´È¶>ÇK·>Ùη>ìQ¸>þÔ¸>X¹>#Û¹>5^º>Háº>Zd»>mç»>j¼>‘í¼>¤p½>¶ó½>Év¾>Ûù¾>î|¿>À>ƒÀ>%Á>7‰Á>J Â>\�Â>oÃ>�•Ã>“Ä>¦›Ä>¸Å>Ë¡Å>Ý$Æ>ð§Æ>+Ç>®Ç>'1È>9´È>L7É>^ºÉ>q=Ê>ƒÀÊ>–CË>¨ÆË>ºIÌ>ÍÌÌ>ßOÍ>òÒÍ>VÎ>ÙÎ>)\Ï>;ßÏ>NbÐ>`åÐ>shÑ>…ëÑ>˜nÒ>ªñÒ>¼tÓ>Ï÷Ó>ázÔ>ôýÔ>�Õ>Ö>+‡Ö>= ×>P�×>bØ>u“Ø>‡Ù>š™Ù>¬Ú>¾ŸÚ>Ñ"Û>ã¥Û>ö(Ü>¬Ü>/Ý>-²Ý>?5Þ>R¸Þ>d;ß>w¾ß>‰Aà>œÄà>®Gá>ÁÊá>ÓMâ>åÐâ>øSã> ×ã>Zä>/Ýä>B`å>Tãå>ffæ>yéæ>‹lç>žïç>°rè>Ãõè>Õxé>çûé>ú~ê> ë>…ë>1ì>D‹ì>Ví>h‘í>{î>�—î> ï>²�ï>Å ð>×£ð>é&ñ>ü©ñ>-ò>!°ò>33ó>F¶ó>X9ô>j¼ô>}?õ>�Âõ>¢Eö>´Èö>ÇK÷>ÙÎ÷>ìQø>þÔø>Xù>#Ûù>5^ú>Háú>Zdû>mçû>jü>‘íü>¤pý>¶óý>Évþ>Ûùþ>î|ÿ>?‰A?ƒ?œÄ?%?®G?7‰?ÁÊ?J ?ÓM?\�?åÐ?o?øS?�•? ×?“?Z?¦›?/Ý?¸?B`?Ë¡?Tã?Ý$?ff?ð§?yé?+?‹l?®?žï?'1?°r?9´?Ãõ?L7 ?Õx ?^º ?çû ?q= ?ú~ ?ƒÀ ?  ?–C ?… ?¨Æ ?1 ?ºI ?D‹ ?ÍÌ ?V ?ßO ?h‘ ?òÒ ?{?V?�—?Ù? ?)\?²�?;ß?Å ?Nb?×£?`å?é&?sh?ü©?…ë?-?˜n?!°?ªñ?33?¼t?F¶?Ï÷?X9?áz?j¼?ôý?}??�?�Â??¢E?+‡?´È?= ?ÇK?P�?ÙÎ?b?ìQ?u“?þÔ?‡?X?š™?#Û?¬?5^?¾Ÿ?Há?Ñ"?Zd?ã¥?mç?ö(?j?¬?‘í?/?¤p?-²?¶ó??5?Év?R¸?Ûù?d;?î|?w¾? ?‰A ?ƒ ?œÄ ?%!?®G!?7‰!?ÁÊ!?J "?ÓM"?\�"?åÐ"?o#?øS#?�•#? ×#?“$?Z$?¦›$?/Ý$?¸%?B`%?Ë¡%?Tã%?Ý$&?ff&?ð§&?yé&?+'?‹l'?®'?žï'?'1(?°r(?9´(?Ãõ(?L7)?Õx)?^º)?çû)?q=*?ú~*?ƒÀ*? +?–C+?…+?¨Æ+?1,?ºI,?D‹,?ÍÌ,?V-?ßO-?h‘-?òÒ-?{.?V.?�—.?Ù.? /?)\/?²�/?;ß/?Å 0?Nb0?×£0?`å0?é&1?sh1?ü©1?…ë1?-2?˜n2?!°2?ªñ2?333?¼t3?F¶3?Ï÷3?X94?áz4?j¼4?ôý4?}?5?�5?�Â5?6?¢E6?+‡6?´È6?= 7?ÇK7?P�7?ÙÎ7?b8?ìQ8?u“8?þÔ8?‡9?X9?š™9?#Û9?¬:?5^:?¾Ÿ:?Há:?Ñ";?Zd;?ã¥;?mç;?ö(?Év>?R¸>?Ûù>?d;??î|??w¾??@?‰A@?ƒ@?œÄ@?%A?®GA?7‰A?ÁÊA?J B?ÓMB?\�B?åÐB?oC?øSC?�•C? ×C?“D?ZD?¦›D?/ÝD?¸E?B`E?Ë¡E?TãE?Ý$F?ffF?ð§F?yéF?+G?‹lG?®G?žïG?'1H?°rH?9´H?ÃõH?L7I?ÕxI?^ºI?çûI?q=J?ú~J?ƒÀJ? K?–CK?…K?¨ÆK?1L?ºIL?D‹L?ÍÌL?VM?ßOM?h‘M?òÒM?{N?VN?�—N?ÙN? O?)\O?²�O?;ßO?Å P?NbP?×£P?`åP?é&Q?shQ?ü©Q?…ëQ?-R?˜nR?!°R?ªñR?33S?¼tS?F¶S?Ï÷S?X9T?ázT?j¼T?ôýT?}?U?�U?�ÂU?V?¢EV?+‡V?´ÈV?= W?ÇKW?P�W?ÙÎW?bX?ìQX?u“X?þÔX?‡Y?XY?š™Y?#ÛY?¬Z?5^Z?¾ŸZ?HáZ?Ñ"[?Zd[?ã¥[?mç[?ö(\?j\?¬\?‘í\?/]?¤p]?-²]?¶ó]??5^?Év^?R¸^?Ûù^?d;_?î|_?w¾_?`?‰A`?ƒ`?œÄ`?%a?®Ga?7‰a?ÁÊa?J b?ÓMb?\�b?åÐb?oc?øSc?�•c? ×c?“d?Zd?¦›d?/Ýd?¸e?B`e?Ë¡e?Tãe?Ý$f?fff?ð§f?yéf?+g?‹lg?®g?žïg?'1h?°rh?9´h?Ãõh?L7i?Õxi?^ºi?çûi?q=j?ú~j?ƒÀj? k?–Ck?…k?¨Æk?1l?ºIl?D‹l?ÍÌl?Vm?ßOm?h‘m?òÒm?{n?Vn?�—n?Ùn? o?)\o?²�o?;ßo?Å p?Nbp?×£p?`åp?é&q?shq?ü©q?PK-!ÄûACÿÿÿÿÿÿÿÿ array_1.npyŒŒ“NUMPYv{'descr': '�:ñÿÿÿÿÿÿÿÿ array_23.npyˆˆ“NUMPYv{'descr': '�:ñˆˆ €p!array_23.npyPK--!H­Jˆˆ €6"array_24.npyPK--!î• •„„ €ü"array_25.npyPKÚ¾#mhcflurry-2.3.6/test/data/master_multi_output_fixture_config.json000066400000000000000000000077331525677230600255670ustar00rootroot00000000000000{"hyperparameters": {"peptide_dense_layer_sizes": [], "layer_sizes": [4], "activation": "tanh", "output_activation": "sigmoid", "dropout_probability": 0.0, "batch_normalization": false, "locally_connected_layers": [], "topology": "feedforward", "num_outputs": 3, "allele_amino_acid_encoding": "BLOSUM62", "allele_dense_layer_sizes": [], "peptide_encoding": {"vector_encoding_name": "BLOSUM62", "alignment_method": "pad_middle", "left_edge": 4, "right_edge": 4, "max_length": 15}, "peptide_allele_merge_method": "multiply", "peptide_allele_merge_activation": "", "dense_layer_l1_regularization": 0.001, "dense_layer_l2_regularization": 0.0, "init": "glorot_uniform", "loss": "custom:mse_with_inequalities", "optimizer": "rmsprop", "learning_rate": null, "max_epochs": 500, "validation_split": 0.1, "early_stopping": true, "minibatch_size": 128, "data_dependent_initialization_method": null, "random_negative_affinity_min": 20000.0, "random_negative_affinity_max": 50000.0, "random_negative_output_indices": null, "random_negative_rate": 0.0, "random_negative_constant": 0, "random_negative_match_distribution": true, "random_negative_distribution_smoothing": 0.0, "random_negative_method": "recommended", "random_negative_binder_threshold": null, "random_negative_lengths": [8, 9, 10, 11, 12, 13, 14, 15], "patience": 20, "min_delta": 0.0, "train_data": {}}, "_network": null, "network_json": "{\"class_name\": \"Functional\", \"config\": {\"name\": \"predictor\", \"trainable\": true, \"layers\": [{\"module\": \"keras.layers\", \"class_name\": \"InputLayer\", \"config\": {\"batch_input_shape\": [null, 15, 21], \"dtype\": \"float32\", \"sparse\": false, \"ragged\": false, \"name\": \"peptide\"}, \"registered_name\": null, \"name\": \"peptide\", \"inbound_nodes\": []}, {\"module\": \"keras.layers\", \"class_name\": \"Flatten\", \"config\": {\"name\": \"flattened_0\", \"trainable\": true, \"dtype\": \"float32\", \"data_format\": \"channels_last\"}, \"registered_name\": null, \"build_config\": {\"input_shape\": [null, 15, 21]}, \"name\": \"flattened_0\", \"inbound_nodes\": [[[\"peptide\", 0, 0, {}]]]}, {\"module\": \"keras.layers\", \"class_name\": \"Dense\", \"config\": {\"name\": \"dense_0\", \"trainable\": true, \"dtype\": \"float32\", \"units\": 4, \"activation\": \"tanh\", \"use_bias\": true, \"kernel_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"GlorotUniform\", \"config\": {\"seed\": null}, \"registered_name\": null}, \"bias_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"Zeros\", \"config\": {}, \"registered_name\": null}, \"kernel_regularizer\": {\"module\": \"keras.regularizers\", \"class_name\": \"L1L2\", \"config\": {\"l1\": 0.0010000000474974513, \"l2\": 0.0}, \"registered_name\": null}, \"bias_regularizer\": null, \"activity_regularizer\": null, \"kernel_constraint\": null, \"bias_constraint\": null}, \"registered_name\": null, \"build_config\": {\"input_shape\": [null, 315]}, \"name\": \"dense_0\", \"inbound_nodes\": [[[\"flattened_0\", 0, 0, {}]]]}, {\"module\": \"keras.layers\", \"class_name\": \"Dense\", \"config\": {\"name\": \"output\", \"trainable\": true, \"dtype\": \"float32\", \"units\": 3, \"activation\": \"sigmoid\", \"use_bias\": true, \"kernel_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"GlorotUniform\", \"config\": {\"seed\": null}, \"registered_name\": null}, \"bias_initializer\": {\"module\": \"keras.initializers\", \"class_name\": \"Zeros\", \"config\": {}, \"registered_name\": null}, \"kernel_regularizer\": null, \"bias_regularizer\": null, \"activity_regularizer\": null, \"kernel_constraint\": null, \"bias_constraint\": null}, \"registered_name\": null, \"build_config\": {\"input_shape\": [null, 4]}, \"name\": \"output\", \"inbound_nodes\": [[[\"dense_0\", 0, 0, {}]]]}], \"input_layers\": [[\"peptide\", 0, 0]], \"output_layers\": [[\"output\", 0, 0]]}, \"keras_version\": \"2.17.0\", \"backend\": \"tensorflow\"}", "network_weights": null, "network_weights_loader": null, "fit_info": [], "prediction_cache": null}mhcflurry-2.3.6/test/data/master_multi_output_fixture_predictions.json000066400000000000000000000002371525677230600266350ustar00rootroot00000000000000{"peptides": ["SYFPEITHI", "AAAAAAAAA", "CCCCCCCCC", "DDDDDDDDD"], "predictions": [39441.12426571068, 39441.12426571068, 39441.12426571068, 39441.12426571068]}mhcflurry-2.3.6/test/data/master_multi_output_fixture_weights.npz000066400000000000000000000137521525677230600256300ustar00rootroot00000000000000PK-!C-:Íÿÿÿÿÿÿÿÿ array_0.npy00“NUMPYv{'descr': '%>J >o>“>¸>Ý$>+>'1>L7 >q= >–C >ºI >ßO >V>)\>Nb>sh>˜n>¼t>áz>�>+‡>P�>u“>š™>¾Ÿ>ã¥>¬>-²>R¸>w¾>œÄ >ÁÊ!>åÐ"> ×#>/Ý$>Tã%>yé&>žï'>Ãõ(>çû)> +>1,>V->{.> />Å 0>é&1>-2>333>X94>}?5>¢E6>ÇK7>ìQ8>X9>5^:>Zd;>j<>¤p=>Év>>î|?>ƒ@>7‰A>\�B>�•C>¦›D>Ë¡E>ð§F>®G>9´H>^ºI>ƒÀJ>¨ÆK>ÍÌL>òÒM>ÙN>;ßO>`åP>…ëQ>ªñR>Ï÷S>ôýT>V>= W>bX>‡Y>¬Z>Ñ"[>ö(\>/]>?5^>d;_>‰A`>®Ga>ÓMb>øSc>Zd>B`e>fff>‹lg>°rh>Õxi>ú~j>…k>D‹l>h‘m>�—n>²�o>×£p>ü©q>!°r>F¶s>j¼t>�Âu>´Èv>ÙÎw>þÔx>#Ûy>Ház>mç{>‘í|>¶ó}>Ûù~>€>ƒ€>%�>7‰�>J ‚>\�‚>oƒ>�•ƒ>“„>¦›„>¸…>Ë¡…>Ý$†>ð§†>+‡>®‡>'1ˆ>9´ˆ>L7‰>^º‰>q=Š>ƒÀŠ>–C‹>¨Æ‹>ºIŒ>ÍÌŒ>ßO�>òÒ�>VŽ>ÙŽ>)\�>;ß�>Nb�>`å�>sh‘>…ë‘>˜n’>ªñ’>¼t“>Ï÷“>áz”>ôý”>�•>–>+‡–>= —>P�—>b˜>u“˜>‡™>š™™>¬š>¾Ÿš>Ñ"›>㥛>ö(œ>¬œ>/�>-²�>?5ž>R¸ž>d;Ÿ>w¾Ÿ>‰A >œÄ >®G¡>ÁÊ¡>ÓM¢>åТ>øS£> ×£>Z¤>/ݤ>B`¥>Tã¥>ff¦>yé¦>‹l§>žï§>°r¨>Ãõ¨>Õx©>çû©>ú~ª> «>…«>1¬>D‹¬>V­>h‘­>{®>�—®> ¯>²�¯>Å °>×£°>é&±>ü©±>-²>!°²>33³>F¶³>X9´>j¼´>}?µ>�µ>¢E¶>´È¶>ÇK·>Ùη>ìQ¸>þÔ¸>X¹>#Û¹>5^º>Háº>Zd»>mç»>j¼>‘í¼>¤p½>¶ó½>Év¾>Ûù¾>î|¿>À>ƒÀ>%Á>7‰Á>J Â>\�Â>oÃ>�•Ã>“Ä>¦›Ä>¸Å>Ë¡Å>Ý$Æ>ð§Æ>+Ç>®Ç>'1È>9´È>L7É>^ºÉ>q=Ê>ƒÀÊ>–CË>¨ÆË>ºIÌ>ÍÌÌ>ßOÍ>òÒÍ>VÎ>ÙÎ>)\Ï>;ßÏ>NbÐ>`åÐ>shÑ>…ëÑ>˜nÒ>ªñÒ>¼tÓ>Ï÷Ó>ázÔ>ôýÔ>�Õ>Ö>+‡Ö>= ×>P�×>bØ>u“Ø>‡Ù>š™Ù>¬Ú>¾ŸÚ>Ñ"Û>ã¥Û>ö(Ü>¬Ü>/Ý>-²Ý>?5Þ>R¸Þ>d;ß>w¾ß>‰Aà>œÄà>®Gá>ÁÊá>ÓMâ>åÐâ>øSã> ×ã>Zä>/Ýä>B`å>Tãå>ffæ>yéæ>‹lç>žïç>°rè>Ãõè>Õxé>çûé>ú~ê> ë>…ë>1ì>D‹ì>Ví>h‘í>{î>�—î> ï>²�ï>Å ð>×£ð>é&ñ>ü©ñ>-ò>!°ò>33ó>F¶ó>X9ô>j¼ô>}?õ>�Âõ>¢Eö>´Èö>ÇK÷>ÙÎ÷>ìQø>þÔø>Xù>#Ûù>5^ú>Háú>Zdû>mçû>jü>‘íü>¤pý>¶óý>Évþ>Ûùþ>î|ÿ>?‰A?ƒ?œÄ?%?®G?7‰?ÁÊ?J ?ÓM?\�?åÐ?o?øS?�•? ×?“?Z?¦›?/Ý?¸?B`?Ë¡?Tã?Ý$?ff?ð§?yé?+?‹l?®?žï?'1?°r?9´?Ãõ?L7 ?Õx ?^º ?çû ?q= ?ú~ ?ƒÀ ?  ?–C ?… ?¨Æ ?1 ?ºI ?D‹ ?ÍÌ ?V ?ßO ?h‘ ?òÒ ?{?V?�—?Ù? ?)\?²�?;ß?Å ?Nb?×£?`å?é&?sh?ü©?…ë?-?˜n?!°?ªñ?33?¼t?F¶?Ï÷?X9?áz?j¼?ôý?}??�?�Â??¢E?+‡?´È?= ?ÇK?P�?ÙÎ?b?ìQ?u“?þÔ?‡?X?š™?#Û?¬?5^?¾Ÿ?Há?Ñ"?Zd?ã¥?mç?ö(?j?¬?‘í?/?¤p?-²?¶ó??5?Év?R¸?Ûù?d;?î|?w¾? ?‰A ?ƒ ?œÄ ?%!?®G!?7‰!?ÁÊ!?J "?ÓM"?\�"?åÐ"?o#?øS#?�•#? ×#?“$?Z$?¦›$?/Ý$?¸%?B`%?Ë¡%?Tã%?Ý$&?ff&?ð§&?yé&?+'?‹l'?®'?žï'?'1(?°r(?9´(?Ãõ(?L7)?Õx)?^º)?çû)?q=*?ú~*?ƒÀ*? +?–C+?…+?¨Æ+?1,?ºI,?D‹,?ÍÌ,?V-?ßO-?h‘-?òÒ-?{.?V.?�—.?Ù.? /?)\/?²�/?;ß/?Å 0?Nb0?×£0?`å0?é&1?sh1?ü©1?…ë1?-2?˜n2?!°2?ªñ2?333?¼t3?F¶3?Ï÷3?X94?áz4?j¼4?ôý4?}?5?�5?�Â5?6?¢E6?+‡6?´È6?= 7?ÇK7?P�7?ÙÎ7?b8?ìQ8?u“8?þÔ8?‡9?X9?š™9?#Û9?¬:?5^:?¾Ÿ:?Há:?Ñ";?Zd;?ã¥;?mç;?ö(?Év>?R¸>?Ûù>?d;??î|??w¾??@?‰A@?ƒ@?œÄ@?%A?®GA?7‰A?ÁÊA?J B?ÓMB?\�B?åÐB?oC?øSC?�•C? ×C?“D?ZD?¦›D?/ÝD?¸E?B`E?Ë¡E?TãE?Ý$F?ffF?ð§F?yéF?+G?‹lG?®G?žïG?'1H?°rH?9´H?ÃõH?L7I?ÕxI?^ºI?çûI?q=J?ú~J?ƒÀJ? K?–CK?…K?¨ÆK?1L?ºIL?D‹L?ÍÌL?VM?ßOM?h‘M?òÒM?{N?VN?�—N?ÙN? O?)\O?²�O?;ßO?Å P?NbP?×£P?`åP?é&Q?shQ?ü©Q?…ëQ?-R?˜nR?!°R?ªñR?33S?¼tS?F¶S?Ï÷S?X9T?ázT?j¼T?ôýT?}?U?�U?�ÂU?V?¢EV?+‡V?´ÈV?= W?ÇKW?P�W?ÙÎW?bX?ìQX?u“X?þÔX?‡Y?XY?š™Y?#ÛY?¬Z?5^Z?¾ŸZ?HáZ?Ñ"[?Zd[?ã¥[?mç[?ö(\?j\?¬\?‘í\?/]?¤p]?-²]?¶ó]??5^?Év^?R¸^?Ûù^?d;_?î|_?w¾_?`?‰A`?ƒ`?œÄ`?%a?®Ga?7‰a?ÁÊa?J b?ÓMb?\�b?åÐb?oc?øSc?�•c? ×c?“d?Zd?¦›d?/Ýd?¸e?B`e?Ë¡e?Tãe?Ý$f?fff?ð§f?yéf?+g?‹lg?®g?žïg?'1h?°rh?9´h?Ãõh?L7i?Õxi?^ºi?çûi?q=j?ú~j?ƒÀj? k?–Ck?…k?¨Æk?1l?ºIl?D‹l?ÍÌl?Vm?ßOm?h‘m?òÒm?{n?Vn?�—n?Ùn? o?)\o?²�o?;ßo?Å p?Nbp?×£p?`åp?é&q?shq?ü©q?…ëq?-r?˜nr?!°r?ªñr?33s?¼ts?F¶s?Ï÷s?X9t?ázt?j¼t?ôýt?}?u?�u?�Âu?v?¢Ev?+‡v?´Èv?= w?ÇKw?P�w?ÙÎw?bx?ìQx?u“x?þÔx?‡y?Xy?š™y?#Ûy?¬z?5^z?¾Ÿz?Ház?Ñ"{?Zd{?ã¥{?mç{?ö(|?j|?¬|?‘í|?/}?¤p}?-²}?¶ó}??5~?Év~?R¸~?Ûù~?d;?î|?w¾?€?Å €?‰A€?Nb€?ƒ€?×£€?œÄ€?`å€?%�?é&�?®G�?sh�?7‰�?ü©�?ÁÊ�?…ë�?J ‚?-‚?ÓM‚?˜n‚?\�‚?!°‚?åЂ?ªñ‚?oƒ?33ƒ?øSƒ?¼tƒ?�•ƒ?F¶ƒ? ׃?Ï÷ƒ?“„?X9„?Z„?áz„?¦›„?j¼„?/Ý„?ôý„?¸…?}?…?B`…?�…?Ë¡…?�Â…?Tã…?†?Ý$†?¢E†?ff†?+‡†?ð§†?´È†?yé†?= ‡?+‡?ÇK‡?‹l‡?P�‡?®‡?Ù·?žï‡?bˆ?'1ˆ?ìQˆ?°rˆ?u“ˆ?9´ˆ?þÔˆ?Ãõˆ?‡‰?L7‰?X‰?Õx‰?š™‰?^º‰?#Û‰?çû‰?¬Š?q=Š?5^Š?ú~Š?¾ŸŠ?ƒÀŠ?HáŠ? ‹?Ñ"‹?–C‹?Zd‹?…‹?㥋?¨Æ‹?mç‹?1Œ?ö(Œ?ºIŒ?jŒ?D‹Œ?¬Œ?ÍÌŒ?‘íŒ?V�?/�?ßO�?¤p�?h‘�?-²�?òÒ�?¶ó�?{Ž??5Ž?VŽ?ÉvŽ?�—Ž?R¸Ž?ÙŽ?ÛùŽ? �?d;�?)\�?î|�?²��?w¾�?;ß�?�?Å �?‰A�?Nb�?ƒ�?×£�?œÄ�?`å�?%‘?é&‘?®G‘?sh‘?7‰‘?ü©‘?ÁÊ‘?…ë‘?J ’?-’?ÓM’?˜n’?\�’?!°’?åÐ’?ªñ’?o“?33“?øS“?¼t“?�•“?F¶“? ד?Ï÷“?“”?X9”?Z”?áz”?¦›”?j¼”?/Ý”?ôý”?¸•?}?•?B`•?�•?Ë¡•?�•?Tã•?–?Ý$–?¢E–?ff–?+‡–?ð§–?´È–?yé–?= —?+—?ÇK—?‹l—?P�—?®—?ÙΗ?žï—?b˜?'1˜?ìQ˜?°r˜?u“˜?9´˜?þÔ˜?Ãõ˜?‡™?L7™?X™?Õx™?š™™?^º™?#Û™?çû™?¬š?q=š?5^š?ú~š?¾Ÿš?ƒÀš?Háš? ›?Ñ"›?–C›?Zd›?…›?㥛?¨Æ›?mç›?1œ?ö(œ?ºIœ?jœ?D‹œ?¬œ?ÍÌœ?‘íœ?V�?/�?ßO�?¤p�?h‘�?-²�?òÒ�?¶ó�?{ž??5ž?Vž?Évž?�—ž?R¸ž?Ùž?Ûùž? Ÿ?d;Ÿ?)\Ÿ?î|Ÿ?²�Ÿ?w¾Ÿ?;ߟ? ?Å  ?‰A ?Nb ?ƒ ?×£ ?œÄ ?`å ?%¡?é&¡?PK-!6f�ÿÿÿÿÿÿÿÿ array_1.npy��“NUMPYv{'descr': '%>J >o>“>¸>Ý$>+>'1>L7 >q= >–C >ºI >ßO >V>)\>Nb>sh>˜n>¼t>áz>�>+‡>P�>u“>š™>¾Ÿ>ã¥>¬>-²>R¸>w¾>œÄ >ÁÊ!>åÐ"> ×#>/Ý$>Tã%>yé&>žï'>Ãõ(>çû)> +>1,>V->{.> />Å 0>é&1>-2>333>X94>}?5>¢E6>ÇK7>ìQ8>X9>5^:>Zd;>j<>¤p=>Év>>î|?>ƒ@>7‰A>\�B>�•C>¦›D>Ë¡E>ð§F>®G>9´H>^ºI>ƒÀJ>¨ÆK>ÍÌL>òÒM>ÙN>;ßO>`åP>…ëQ>ªñR>Ï÷S>ôýT>V>= W>bX>‡Y>¬Z>Ñ"[>ö(\>/]>?5^>d;_>‰A`>®Ga>ÓMb>øSc>Zd>B`e>fff>‹lg>°rh>Õxi>ú~j>…k>D‹l>h‘m>�—n>²�o>×£p>ü©q>!°r>F¶s>j¼t>�Âu>´Èv>ÙÎw>þÔx>#Ûy>Ház>mç{>‘í|>¶ó}>Ûù~>€>ƒ€>%�>7‰�>J ‚>\�‚>oƒ>�•ƒ>“„>¦›„>¸…>Ë¡…>Ý$†>ð§†>+‡>®‡>'1ˆ>9´ˆ>L7‰>^º‰>q=Š>ƒÀŠ>–C‹>¨Æ‹>ºIŒ>ÍÌŒ>ßO�>òÒ�>VŽ>ÙŽ>)\�>;ß�>Nb�>`å�>sh‘>…ë‘>˜n’>ªñ’>¼t“>Ï÷“>áz”>ôý”>�•>–>+‡–>= —>P�—>b˜>u“˜>‡™>š™™>¬š>¾Ÿš>Ñ"›>㥛>ö(œ>¬œ>/�>-²�>?5ž>R¸ž>d;Ÿ>w¾Ÿ>‰A >œÄ >®G¡>ÁÊ¡>ÓM¢>åТ>øS£> ×£>Z¤>/ݤ>B`¥>Tã¥>ff¦>yé¦>‹l§>žï§>°r¨>Ãõ¨>Õx©>çû©>ú~ª> «>…«>1¬>D‹¬>V­>h‘­>{®>�—®> ¯>²�¯>Å °>×£°>é&±>ü©±>-²>!°²>33³>F¶³>X9´>j¼´>}?µ>�µ>¢E¶>´È¶>ÇK·>Ùη>ìQ¸>þÔ¸>X¹>#Û¹>5^º>Háº>Zd»>mç»>j¼>‘í¼>¤p½>¶ó½>Év¾>Ûù¾>î|¿>À>ƒÀ>%Á>7‰Á>J Â>\�Â>oÃ>�•Ã>“Ä>¦›Ä>¸Å>Ë¡Å>Ý$Æ>ð§Æ>+Ç>®Ç>'1È>9´È>L7É>^ºÉ>q=Ê>ƒÀÊ>–CË>¨ÆË>ºIÌ>ÍÌÌ>ßOÍ>òÒÍ>VÎ>ÙÎ>)\Ï>;ßÏ>NbÐ>`åÐ>shÑ>…ëÑ>˜nÒ>ªñÒ>¼tÓ>Ï÷Ó>ázÔ>ôýÔ>�Õ>Ö>+‡Ö>= ×>P�×>bØ>u“Ø>‡Ù>š™Ù>¬Ú>¾ŸÚ>Ñ"Û>ã¥Û>ö(Ü>¬Ü>/Ý>-²Ý>?5Þ>R¸Þ>d;ß>w¾ß>‰Aà>œÄà>®Gá>ÁÊá>ÓMâ>åÐâ>øSã> ×ã>Zä>/Ýä>B`å>Tãå>ffæ>yéæ>‹lç>žïç>°rè>Ãõè>Õxé>çûé>ú~ê> ë>…ë>1ì>D‹ì>Ví>h‘í>{î>�—î> ï>²�ï>Å ð>×£ð>é&ñ>ü©ñ>-ò>!°ò>33ó>F¶ó>X9ô>j¼ô>}?õ>�Âõ>¢Eö>´Èö>ÇK÷>ÙÎ÷>ìQø>þÔø>Xù>#Ûù>5^ú>Háú>Zdû>mçû>jü>‘íü>¤pý>¶óý>Évþ>Ûùþ>î|ÿ>?‰A?ƒ?œÄ?%?®G?7‰?ÁÊ?J ?ÓM?\�?åÐ?o?øS?�•? ×?“?Z?¦›?/Ý?¸?B`?Ë¡?Tã?Ý$?ff?ð§?yé?+?‹l?®?žï?'1?°r?9´?Ãõ?L7 ?Õx ?^º ?çû ?q= ?ú~ ?ƒÀ ?  ?–C ?… ?¨Æ ?1 ?ºI ?D‹ ?ÍÌ ?V ?ßO ?h‘ ?òÒ ?{?V?�—?Ù? ?)\?²�?;ß?Å ?Nb?×£?`å?é&?sh?ü©?…ë?-?˜n?!°?ªñ?33?¼t?F¶?Ï÷?X9?áz?j¼?ôý?}??�?�Â??¢E?+‡?´È?= ?ÇK?P�?ÙÎ?b?ìQ?u“?þÔ?‡?X?š™?#Û?¬?5^?¾Ÿ?Há?Ñ"?Zd?ã¥?mç?ö(?j?¬?‘í?/?¤p?-²?¶ó??5?Év?R¸?Ûù?d;?î|?w¾? ?‰A ?ƒ ?œÄ ?%!?®G!?7‰!?ÁÊ!?J "?ÓM"?\�"?åÐ"?o#?øS#?�•#? ×#?“$?Z$?¦›$?/Ý$?¸%?B`%?Ë¡%?Tã%?Ý$&?ff&?ð§&?yé&?+'?‹l'?®'?žï'?'1(?°r(?9´(?Ãõ(?L7)?Õx)?^º)?çû)?q=*?ú~*?ƒÀ*? +?–C+?…+?¨Æ+?1,?ºI,?D‹,?ÍÌ,?V-?ßO-?h‘-?òÒ-?{.?V.?�—.?Ù.? /?)\/?²�/?;ß/?Å 0?Nb0?×£0?`å0?é&1?sh1?ü©1?…ë1?-2?˜n2?!°2?ªñ2?333?¼t3?F¶3?Ï÷3?X94?áz4?j¼4?ôý4?}?5?�5?�Â5?6?¢E6?+‡6?´È6?= 7?ÇK7?P�7?ÙÎ7?b8?ìQ8?u“8?þÔ8?‡9?X9?š™9?#Û9?¬:?5^:?¾Ÿ:?Há:?Ñ";?Zd;?ã¥;?mç;?ö(?Év>?R¸>?Ûù>?d;??î|??w¾??@?‰A@?ƒ@?œÄ@?%A?®GA?7‰A?ÁÊA?J B?ÓMB?\�B?åÐB?oC?øSC?�•C? ×C?“D?ZD?¦›D?/ÝD?¸E?B`E?Ë¡E?TãE?Ý$F?ffF?ð§F?yéF?+G?‹lG?®G?žïG?'1H?°rH?9´H?ÃõH?L7I?ÕxI?^ºI?çûI?q=J?ú~J?ƒÀJ? K?–CK?…K?¨ÆK?1L?ºIL?D‹L?ÍÌL?VM?ßOM?h‘M?òÒM?{N?VN?�—N?ÙN? O?)\O?²�O?;ßO?Å P?NbP?×£P?`åP?é&Q?shQ?ü©Q?…ëQ?-R?˜nR?!°R?ªñR?33S?¼tS?F¶S?Ï÷S?X9T?ázT?j¼T?ôýT?}?U?�U?�ÂU?V?¢EV?+‡V?´ÈV?= W?ÇKW?P�W?ÙÎW?bX?ìQX?u“X?þÔX?‡Y?XY?š™Y?#ÛY?¬Z?5^Z?¾ŸZ?HáZ?Ñ"[?Zd[?ã¥[?mç[?ö(\?j\?¬\?‘í\?/]?¤p]?-²]?¶ó]??5^?Év^?R¸^?Ûù^?d;_?î|_?w¾_?`?‰A`?ƒ`?œÄ`?%a?®Ga?7‰a?ÁÊa?J b?ÓMb?\�b?åÐb?oc?øSc?�•c? ×c?“d?Zd?¦›d?/Ýd?¸e?B`e?Ë¡e?Tãe?Ý$f?fff?ð§f?yéf?+g?‹lg?®g?žïg?'1h?°rh?9´h?Ãõh?L7i?Õxi?^ºi?çûi?q=j?ú~j?ƒÀj? k?–Ck?…k?¨Æk?1l?ºIl?D‹l?ÍÌl?Vm?ßOm?h‘m?òÒm?{n?Vn?�—n?Ùn? o?)\o?²�o?;ßo?Å p?Nbp?×£p?`åp?é&q?shq?ü©q?…ëq?-r?˜nr?!°r?ªñr?33s?¼ts?F¶s?Ï÷s?X9t?ázt?j¼t?ôýt?}?u?�u?�Âu?v?¢Ev?+‡v?´Èv?= w?ÇKw?P�w?ÙÎw?bx?ìQx?u“x?þÔx?‡y?Xy?š™y?#Ûy?¬z?5^z?¾Ÿz?Ház?Ñ"{?Zd{?ã¥{?mç{?ö(|?j|?¬|?‘í|?/}?¤p}?-²}?¶ó}??5~?Év~?R¸~?Ûù~?d;?î|?w¾?€?Å €?‰A€?Nb€?ƒ€?×£€?œÄ€?`å€?%�?é&�?®G�?sh�?7‰�?ü©�?ÁÊ�?…ë�?J ‚?-‚?ÓM‚?˜n‚?\�‚?!°‚?åЂ?ªñ‚?oƒ?33ƒ?øSƒ?¼tƒ?�•ƒ?F¶ƒ? ׃?Ï÷ƒ?“„?X9„?Z„?áz„?¦›„?j¼„?/Ý„?ôý„?¸…?}?…?B`…?�…?Ë¡…?�Â…?Tã…?†?Ý$†?¢E†?ff†?+‡†?ð§†?´È†?yé†?= ‡?+‡?ÇK‡?‹l‡?P�‡?®‡?Ù·?žï‡?bˆ?'1ˆ?ìQˆ?°rˆ?u“ˆ?9´ˆ?þÔˆ?Ãõˆ?‡‰?L7‰?X‰?Õx‰?š™‰?^º‰?#Û‰?çû‰?¬Š?q=Š?5^Š?ú~Š?¾ŸŠ?ƒÀŠ?HáŠ? ‹?Ñ"‹?–C‹?Zd‹?…‹?㥋?¨Æ‹?mç‹?1Œ?ö(Œ?ºIŒ?jŒ?D‹Œ?¬Œ?ÍÌŒ?‘íŒ?V�?/�?ßO�?¤p�?h‘�?-²�?òÒ�?¶ó�?{Ž??5Ž?VŽ?ÉvŽ?�—Ž?R¸Ž?ÙŽ?ÛùŽ? �?d;�?)\�?î|�?²��?w¾�?;ß�?�?Å �?‰A�?Nb�?ƒ�?×£�?œÄ�?`å�?%‘?é&‘?®G‘?sh‘?7‰‘?ü©‘?ÁÊ‘?…ë‘?J ’?-’?ÓM’?˜n’?\�’?!°’?åÐ’?ªñ’?o“?33“?øS“?¼t“?�•“?F¶“? ד?Ï÷“?“”?X9”?Z”?áz”?¦›”?j¼”?/Ý”?ôý”?¸•?}?•?B`•?�•?Ë¡•?�•?Tã•?–?Ý$–?¢E–?ff–?PK-!-ÄÊÿÿÿÿÿÿÿÿ array_1.npyðð“NUMPYv{'descr': '@{>@Ý$>@?5>@¢E>@V>@ff>@Év>@+‡>@�—>@ð§>@R¸>@´È>@Ù>@yé>@Ûù>@= ?@ ?@+?@d;?@ÇK?@)\?@‹l?@î|?@P�?@²�?@®?@w¾?@ÙÎ?@;ß?@žï?@@@b@@Å @@'1@@‰A@@ìQ@@Nb@@°r@@ƒ@@u“@@×£@@9´@@œÄ@@þÔ@@`å@@Ãõ@@%A@‡A@é&A@L7A@®GA@XA@shA@ÕxA@7‰A@š™A@ü©A@^ºA@ÁÊA@#ÛA@…ëA@çûA@J B@¬B@-B@q=B@ÓMB@5^B@˜nB@ú~B@\�B@¾ŸB@!°B@ƒÀB@åÐB@HáB@ªñB@ C@oC@Ñ"C@33C@–CC@øSC@ZdC@¼tC@…C@�•C@ã¥C@F¶C@¨ÆC@ ×C@mçC@Ï÷C@1D@“D@ö(D@X9D@ºID@ZD@jD@ázD@D‹D@¦›D@¬D@j¼D@ÍÌD@/ÝD@‘íD@ôýD@VE@¸E@/E@}?E@ßOE@B`E@¤pE@�E@h‘E@Ë¡E@-²E@�ÂE@òÒE@TãE@¶óE@F@{F@Ý$F@?5F@¢EF@VF@ffF@ÉvF@+‡F@�—F@ð§F@R¸F@´ÈF@ÙF@yéF@ÛùF@= G@ G@+G@d;G@ÇKG@)\G@‹lG@î|G@P�G@²�G@®G@w¾G@ÙÎG@;ßG@žïG@H@bH@Å H@'1H@‰AH@ìQH@NbH@°rH@ƒH@u“H@×£H@9´H@œÄH@þÔH@`åH@ÃõH@%I@‡I@é&I@L7I@®GI@XI@shI@ÕxI@7‰I@š™I@ü©I@^ºI@ÁÊI@#ÛI@…ëI@çûI@J J@¬J@-J@q=J@ÓMJ@5^J@˜nJ@ú~J@\�J@¾ŸJ@!°J@ƒÀJ@åÐJ@HáJ@ªñJ@ K@oK@Ñ"K@33K@–CK@øSK@ZdK@¼tK@…K@�•K@ã¥K@F¶K@¨ÆK@ ×K@mçK@Ï÷K@1L@“L@ö(L@X9L@ºIL@ZL@jL@ázL@D‹L@¦›L@¬L@j¼L@ÍÌL@/ÝL@‘íL@ôýL@VM@¸M@/M@}?M@ßOM@B`M@¤pM@�M@h‘M@Ë¡M@-²M@�ÂM@òÒM@TãM@¶óM@N@{N@Ý$N@?5N@¢EN@VN@ffN@ÉvN@+‡N@�—N@ð§N@R¸N@´ÈN@ÙN@yéN@ÛùN@= O@ O@+O@d;O@ÇKO@)\O@‹lO@î|O@P�O@²�O@®O@w¾O@ÙÎO@;ßO@žïO@P@bP@Å P@'1P@‰AP@ìQP@NbP@°rP@ƒP@u“P@×£P@9´P@œÄP@þÔP@`åP@ÃõP@%Q@‡Q@é&Q@L7Q@®GQ@XQ@shQ@ÕxQ@7‰Q@š™Q@ü©Q@^ºQ@ÁÊQ@#ÛQ@…ëQ@çûQ@J R@¬R@-R@q=R@ÓMR@5^R@˜nR@ú~R@\�R@¾ŸR@!°R@ƒÀR@åÐR@HáR@ªñR@ S@oS@Ñ"S@33S@–CS@øSS@ZdS@¼tS@…S@�•S@ã¥S@F¶S@¨ÆS@ ×S@mçS@Ï÷S@1T@“T@ö(T@X9T@ºIT@ZT@jT@ázT@D‹T@¦›T@¬T@j¼T@ÍÌT@/ÝT@‘íT@ôýT@VU@¸U@/U@}?U@ßOU@B`U@¤pU@�U@h‘U@Ë¡U@-²U@�ÂU@òÒU@TãU@¶óU@V@{V@Ý$V@?5V@¢EV@VV@ffV@ÉvV@+‡V@�—V@ð§V@R¸V@´ÈV@ÙV@yéV@ÛùV@= W@ W@+W@d;W@ÇKW@)\W@‹lW@î|W@P�W@²�W@®W@w¾W@ÙÎW@;ßW@žïW@X@bX@Å X@'1X@‰AX@ìQX@NbX@°rX@ƒX@u“X@×£X@9´X@œÄX@þÔX@`åX@ÃõX@%Y@‡Y@é&Y@L7Y@®GY@XY@shY@ÕxY@7‰Y@š™Y@ü©Y@^ºY@ÁÊY@#ÛY@…ëY@çûY@J Z@¬Z@-Z@q=Z@ÓMZ@5^Z@˜nZ@ú~Z@\�Z@¾ŸZ@!°Z@ƒÀZ@åÐZ@HáZ@ªñZ@ [@o[@Ñ"[@33[@–C[@øS[@Zd[@¼t[@…[@�•[@ã¥[@F¶[@¨Æ[@ ×[@mç[@Ï÷[@1\@“\@ö(\@X9\@ºI\@Z\@j\@áz\@D‹\@¦›\@¬\@j¼\@ÍÌ\@/Ý\@‘í\@ôý\@V]@¸]@/]@}?]@ßO]@B`]@¤p]@�]@h‘]@Ë¡]@-²]@�Â]@òÒ]@Tã]@¶ó]@^@{^@Ý$^@?5^@¢E^@V^@ff^@Év^@+‡^@�—^@ð§^@R¸^@´È^@Ù^@yé^@Ûù^@= _@ _@+_@d;_@ÇK_@)\_@‹l_@î|_@P�_@²�_@®_@w¾_@ÙÎ_@;ß_@žï_@`@b`@Å `@'1`@‰A`@ìQ`@Nb`@°r`@ƒ`@u“`@×£`@9´`@œÄ`@þÔ`@`å`@Ãõ`@%a@‡a@é&a@L7a@®Ga@Xa@sha@Õxa@7‰a@š™a@ü©a@^ºa@ÁÊa@#Ûa@…ëa@çûa@J b@¬b@-b@PK-! [æ?ÿÿÿÿÿÿÿÿ array_3.npyÐГNUMPYv{'descr': '%>J >o>“>¸>Ý$>+>'1>L7 >q= >–C >ºI >ßO >V>)\>Nb>sh>˜n>¼t>áz>�>+‡>P�>u“>š™>¾Ÿ>ã¥>¬>-²>R¸>w¾>œÄ >ÁÊ!>åÐ"> ×#>/Ý$>Tã%>yé&>žï'>Ãõ(>çû)> +>1,>V->{.> />Å 0>é&1>-2>333>X94>}?5>¢E6>ÇK7>ìQ8>X9>5^:>Zd;>j<>¤p=>Év>>î|?>ƒ@>7‰A>\�B>�•C>¦›D>Ë¡E>ð§F>®G>9´H>^ºI>ƒÀJ>¨ÆK>ÍÌL>òÒM>ÙN>;ßO>`åP>…ëQ>ªñR>Ï÷S>ôýT>V>= W>bX>‡Y>¬Z>Ñ"[>ö(\>/]>?5^>d;_>‰A`>®Ga>ÓMb>øSc>Zd>B`e>fff>‹lg>°rh>Õxi>ú~j>…k>D‹l>h‘m>�—n>²�o>×£p>ü©q>!°r>F¶s>j¼t>�Âu>´Èv>ÙÎw>þÔx>#Ûy>Ház>mç{>‘í|>¶ó}>Ûù~>€>ƒ€>%�>7‰�>J ‚>\�‚>oƒ>�•ƒ>“„>¦›„>¸…>Ë¡…>Ý$†>ð§†>+‡>®‡>'1ˆ>9´ˆ>L7‰>^º‰>q=Š>ƒÀŠ>–C‹>¨Æ‹>ºIŒ>ÍÌŒ>ßO�>òÒ�>VŽ>ÙŽ>)\�>;ß�>Nb�>`å�>sh‘>…ë‘>˜n’>ªñ’>¼t“>Ï÷“>áz”>ôý”>�•>–>+‡–>= —>P�—>b˜>u“˜>‡™>š™™>¬š>¾Ÿš>Ñ"›>㥛>ö(œ>¬œ>/�>-²�>?5ž>R¸ž>d;Ÿ>w¾Ÿ>‰A >œÄ >®G¡>ÁÊ¡>ÓM¢>åТ>øS£> ×£>Z¤>/ݤ>B`¥>Tã¥>ff¦>yé¦>‹l§>žï§>°r¨>Ãõ¨>Õx©>çû©>ú~ª> «>…«>1¬>D‹¬>V­>h‘­>{®>�—®> ¯>²�¯>Å °>×£°>é&±>ü©±>-²>!°²>33³>F¶³>X9´>j¼´>}?µ>�µ>¢E¶>´È¶>ÇK·>Ùη>ìQ¸>þÔ¸>X¹>#Û¹>5^º>Háº>Zd»>mç»>j¼>‘í¼>¤p½>¶ó½>Év¾>Ûù¾>î|¿>À>ƒÀ>%Á>7‰Á>J Â>\�Â>oÃ>�•Ã>“Ä>¦›Ä>¸Å>Ë¡Å>Ý$Æ>ð§Æ>+Ç>®Ç>'1È>9´È>L7É>^ºÉ>q=Ê>ƒÀÊ>–CË>¨ÆË>ºIÌ>ÍÌÌ>ßOÍ>òÒÍ>VÎ>ÙÎ>)\Ï>;ßÏ>NbÐ>`åÐ>shÑ>…ëÑ>˜nÒ>ªñÒ>¼tÓ>Ï÷Ó>ázÔ>ôýÔ>�Õ>Ö>+‡Ö>= ×>P�×>bØ>u“Ø>‡Ù>š™Ù>¬Ú>¾ŸÚ>Ñ"Û>ã¥Û>ö(Ü>¬Ü>/Ý>-²Ý>?5Þ>R¸Þ>d;ß>w¾ß>‰Aà>œÄà>®Gá>ÁÊá>ÓMâ>åÐâ>øSã> ×ã>Zä>/Ýä>B`å>Tãå>ffæ>yéæ>‹lç>žïç>°rè>Ãõè>Õxé>çûé>ú~ê> ë>…ë>1ì>D‹ì>Ví>h‘í>{î>�—î> ï>²�ï>Å ð>×£ð>é&ñ>ü©ñ>-ò>!°ò>33ó>F¶ó>X9ô>j¼ô>}?õ>�Âõ>¢Eö>´Èö>ÇK÷>ÙÎ÷>ìQø>þÔø>Xù>#Ûù>5^ú>Háú>Zdû>mçû>jü>‘íü>¤pý>¶óý>Évþ>Ûùþ>î|ÿ>?‰A?ƒ?œÄ?%?®G?7‰?ÁÊ?J ?ÓM?\�?åÐ?o?øS?�•? ×?“?Z?¦›?/Ý?¸?B`?Ë¡?Tã?Ý$?ff?ð§?yé?+?‹l?®?žï?'1?°r?9´?Ãõ?L7 ?Õx ?^º ?çû ?q= ?ú~ ?ƒÀ ?  ?–C ?… ?¨Æ ?1 ?ºI ?D‹ ?ÍÌ ?V ?ßO ?h‘ ?òÒ ?{?V?�—?Ù? ?)\?²�?;ß?Å ?Nb?×£?`å?é&?sh?ü©?…ë?-?˜n?!°?ªñ?33?¼t?F¶?Ï÷?X9?áz?j¼?ôý?}??�?�Â??¢E?+‡?´È?= ?ÇK?P�?ÙÎ?b?ìQ?u“?þÔ?‡?X?š™?#Û?¬?5^?¾Ÿ?Há?Ñ"?Zd?ã¥?mç?ö(?j?¬?‘í?/?¤p?-²?¶ó??5?Év?R¸?Ûù?d;?î|?w¾? ?‰A ?ƒ ?œÄ ?%!?®G!?7‰!?ÁÊ!?J "?ÓM"?\�"?åÐ"?o#?øS#?�•#? ×#?“$?Z$?¦›$?/Ý$?¸%?B`%?Ë¡%?Tã%?Ý$&?ff&?ð§&?yé&?+'?‹l'?®'?žï'?'1(?°r(?9´(?Ãõ(?L7)?Õx)?^º)?çû)?q=*?ú~*?ƒÀ*? +?–C+?…+?¨Æ+?1,?ºI,?D‹,?ÍÌ,?V-?ßO-?h‘-?òÒ-?{.?V.?�—.?Ù.? /?)\/?²�/?;ß/?Å 0?Nb0?×£0?`å0?é&1?sh1?ü©1?…ë1?-2?˜n2?!°2?ªñ2?333?¼t3?F¶3?Ï÷3?X94?áz4?j¼4?ôý4?}?5?�5?�Â5?6?¢E6?+‡6?´È6?= 7?ÇK7?P�7?ÙÎ7?b8?ìQ8?u“8?þÔ8?‡9?X9?š™9?#Û9?¬:?5^:?¾Ÿ:?Há:?Ñ";?Zd;?ã¥;?mç;?ö(?Év>?R¸>?Ûù>?d;??î|??w¾??@?‰A@?ƒ@?œÄ@?%A?®GA?7‰A?ÁÊA?J B?ÓMB?\�B?åÐB?oC?øSC?�•C? ×C?“D?ZD?¦›D?/ÝD?¸E?B`E?Ë¡E?TãE?Ý$F?ffF?ð§F?yéF?+G?‹lG?®G?žïG?'1H?°rH?9´H?ÃõH?L7I?ÕxI?^ºI?çûI?q=J?ú~J?ƒÀJ? K?–CK?…K?¨ÆK?1L?ºIL?D‹L?ÍÌL?VM?ßOM?h‘M?òÒM?{N?VN?�—N?ÙN? O?)\O?²�O?;ßO?Å P?NbP?×£P?`åP?é&Q?shQ?ü©Q?…ëQ?-R?˜nR?!°R?ªñR?33S?¼tS?F¶S?Ï÷S?X9T?ázT?j¼T?ôýT?}?U?�U?�ÂU?V?¢EV?+‡V?´ÈV?= W?ÇKW?P�W?ÙÎW?bX?ìQX?u“X?þÔX?‡Y?XY?š™Y?#ÛY?¬Z?5^Z?¾ŸZ?HáZ?Ñ"[?Zd[?ã¥[?mç[?ö(\?j\?¬\?‘í\?/]?¤p]?-²]?¶ó]??5^?Év^?R¸^?Ûù^?d;_?î|_?w¾_?`?‰A`?ƒ`?œÄ`?%a?®Ga?7‰a?ÁÊa?J b?ÓMb?\�b?åÐb?oc?øSc?�•c? ×c?“d?Zd?¦›d?/Ýd?¸e?B`e?Ë¡e?Tãe?Ý$f?fff?ð§f?yéf?+g?‹lg?®g?žïg?'1h?°rh?9´h?Ãõh?L7i?Õxi?^ºi?çûi?q=j?ú~j?ƒÀj? k?–Ck?…k?¨Æk?1l?ºIl?D‹l?ÍÌl?Vm?ßOm?h‘m?òÒm?{n?Vn?�—n?Ùn? o?)\o?²�o?;ßo?Å p?Nbp?×£p?`åp?é&q?shq?ü©q?…ëq?-r?˜nr?!°r?ªñr?33s?¼ts?F¶s?Ï÷s?X9t?ázt?j¼t?ôýt?}?u?�u?�Âu?v?¢Ev?+‡v?´Èv?= w?ÇKw?P�w?ÙÎw?bx?ìQx?u“x?þÔx?‡y?Xy?š™y?#Ûy?¬z?5^z?¾Ÿz?Ház?Ñ"{?Zd{?ã¥{?mç{?ö(|?j|?¬|?‘í|?/}?¤p}?-²}?¶ó}??5~?Év~?R¸~?Ûù~?d;?î|?w¾?€?Å €?‰A€?Nb€?ƒ€?×£€?œÄ€?`å€?%�?é&�?®G�?sh�?7‰�?ü©�?ÁÊ�?…ë�?J ‚?-‚?ÓM‚?˜n‚?\�‚?!°‚?åЂ?ªñ‚?oƒ?33ƒ?øSƒ?¼tƒ?�•ƒ?F¶ƒ? ׃?Ï÷ƒ?“„?X9„?Z„?áz„?¦›„?j¼„?/Ý„?ôý„?¸…?}?…?B`…?�…?Ë¡…?�Â…?Tã…?†?Ý$†?¢E†?ff†?+‡†?ð§†?´È†?yé†?= ‡?+‡?ÇK‡?‹l‡?P�‡?®‡?Ù·?žï‡?bˆ?'1ˆ?ìQˆ?°rˆ?u“ˆ?9´ˆ?þÔˆ?Ãõˆ?‡‰?L7‰?X‰?Õx‰?š™‰?^º‰?#Û‰?çû‰?¬Š?q=Š?5^Š?ú~Š?¾ŸŠ?ƒÀŠ?HáŠ? ‹?Ñ"‹?–C‹?Zd‹?…‹?㥋?¨Æ‹?mç‹?1Œ?ö(Œ?ºIŒ?jŒ?D‹Œ?¬Œ?ÍÌŒ?‘íŒ?V�?/�?ßO�?¤p�?h‘�?-²�?òÒ�?¶ó�?{Ž??5Ž?VŽ?ÉvŽ?�—Ž?R¸Ž?ÙŽ?ÛùŽ? �?d;�?)\�?î|�?²��?w¾�?;ß�?�?Å �?‰A�?Nb�?ƒ�?×£�?œÄ�?`å�?%‘?é&‘?®G‘?sh‘?7‰‘?ü©‘?ÁÊ‘?…ë‘?J ’?-’?ÓM’?˜n’?\�’?!°’?åÐ’?ªñ’?o“?33“?øS“?¼t“?�•“?F¶“? ד?Ï÷“?“”?X9”?Z”?áz”?¦›”?j¼”?/Ý”?ôý”?¸•?}?•?B`•?�•?Ë¡•?�•?Tã•?–?Ý$–?¢E–?ff–?PK-!-ÄÊÿÿÿÿÿÿÿÿ array_1.npyðð“NUMPYv{'descr': '@{>@Ý$>@?5>@¢E>@V>@ff>@Év>@+‡>@�—>@ð§>@R¸>@´È>@Ù>@yé>@Ûù>@= ?@ ?@+?@d;?@ÇK?@)\?@‹l?@î|?@P�?@²�?@®?@w¾?@ÙÎ?@;ß?@žï?@@@b@@Å @@'1@@‰A@@ìQ@@Nb@@°r@@ƒ@@u“@@×£@@9´@@œÄ@@þÔ@@`å@@Ãõ@@%A@‡A@é&A@L7A@®GA@XA@shA@ÕxA@7‰A@š™A@ü©A@^ºA@ÁÊA@#ÛA@…ëA@çûA@J B@¬B@-B@q=B@ÓMB@5^B@˜nB@ú~B@\�B@¾ŸB@!°B@ƒÀB@åÐB@HáB@ªñB@ C@oC@Ñ"C@33C@–CC@øSC@ZdC@¼tC@…C@�•C@ã¥C@F¶C@¨ÆC@ ×C@mçC@Ï÷C@1D@“D@ö(D@X9D@ºID@ZD@jD@ázD@D‹D@¦›D@¬D@j¼D@ÍÌD@/ÝD@‘íD@ôýD@VE@¸E@/E@}?E@ßOE@B`E@¤pE@�E@h‘E@Ë¡E@-²E@�ÂE@òÒE@TãE@¶óE@F@{F@Ý$F@?5F@¢EF@VF@ffF@ÉvF@+‡F@�—F@ð§F@R¸F@´ÈF@ÙF@yéF@ÛùF@= G@ G@+G@d;G@ÇKG@)\G@‹lG@î|G@P�G@²�G@®G@w¾G@ÙÎG@;ßG@žïG@H@bH@Å H@'1H@‰AH@ìQH@NbH@°rH@ƒH@u“H@×£H@9´H@œÄH@þÔH@`åH@ÃõH@%I@‡I@é&I@L7I@®GI@XI@shI@ÕxI@7‰I@š™I@ü©I@^ºI@ÁÊI@#ÛI@…ëI@çûI@J J@¬J@-J@q=J@ÓMJ@5^J@˜nJ@ú~J@\�J@¾ŸJ@!°J@ƒÀJ@åÐJ@HáJ@ªñJ@ K@oK@Ñ"K@33K@–CK@øSK@ZdK@¼tK@…K@�•K@ã¥K@F¶K@¨ÆK@ ×K@mçK@Ï÷K@1L@“L@ö(L@X9L@ºIL@ZL@jL@ázL@D‹L@¦›L@¬L@j¼L@ÍÌL@/ÝL@‘íL@ôýL@VM@¸M@/M@}?M@ßOM@B`M@¤pM@�M@h‘M@Ë¡M@-²M@�ÂM@òÒM@TãM@¶óM@N@{N@Ý$N@?5N@¢EN@VN@ffN@ÉvN@+‡N@�—N@ð§N@R¸N@´ÈN@ÙN@yéN@ÛùN@= O@ O@+O@d;O@ÇKO@)\O@‹lO@î|O@P�O@²�O@®O@w¾O@ÙÎO@;ßO@žïO@P@bP@Å P@'1P@‰AP@ìQP@NbP@°rP@ƒP@u“P@×£P@9´P@œÄP@þÔP@`åP@ÃõP@%Q@‡Q@é&Q@L7Q@®GQ@XQ@shQ@ÕxQ@7‰Q@š™Q@ü©Q@^ºQ@ÁÊQ@#ÛQ@…ëQ@çûQ@J R@¬R@-R@q=R@ÓMR@5^R@˜nR@ú~R@\�R@¾ŸR@!°R@ƒÀR@åÐR@HáR@ªñR@ S@oS@Ñ"S@33S@–CS@øSS@ZdS@¼tS@…S@�•S@ã¥S@F¶S@¨ÆS@ ×S@mçS@Ï÷S@1T@“T@ö(T@X9T@ºIT@ZT@jT@ázT@D‹T@¦›T@¬T@j¼T@ÍÌT@/ÝT@‘íT@ôýT@VU@¸U@/U@}?U@ßOU@B`U@¤pU@�U@h‘U@Ë¡U@-²U@�ÂU@òÒU@TãU@¶óU@V@{V@Ý$V@?5V@¢EV@VV@ffV@ÉvV@+‡V@�—V@ð§V@R¸V@´ÈV@ÙV@yéV@ÛùV@= W@ W@+W@d;W@ÇKW@)\W@‹lW@î|W@P�W@²�W@®W@w¾W@ÙÎW@;ßW@žïW@X@bX@Å X@'1X@‰AX@ìQX@NbX@°rX@ƒX@u“X@×£X@9´X@œÄX@þÔX@`åX@ÃõX@%Y@‡Y@é&Y@L7Y@®GY@XY@shY@ÕxY@7‰Y@š™Y@ü©Y@^ºY@ÁÊY@#ÛY@…ëY@çûY@J Z@¬Z@-Z@q=Z@ÓMZ@5^Z@˜nZ@ú~Z@\�Z@¾ŸZ@!°Z@ƒÀZ@åÐZ@HáZ@ªñZ@ [@o[@Ñ"[@33[@–C[@øS[@Zd[@¼t[@…[@�•[@ã¥[@F¶[@¨Æ[@ ×[@mç[@Ï÷[@1\@“\@ö(\@X9\@ºI\@Z\@j\@áz\@D‹\@¦›\@¬\@j¼\@ÍÌ\@/Ý\@‘í\@ôý\@V]@¸]@/]@}?]@ßO]@B`]@¤p]@�]@h‘]@Ë¡]@-²]@�Â]@òÒ]@Tã]@¶ó]@^@{^@Ý$^@?5^@¢E^@V^@ff^@Év^@+‡^@�—^@ð§^@R¸^@´È^@Ù^@yé^@Ûù^@= _@ _@+_@d;_@ÇK_@)\_@‹l_@î|_@P�_@²�_@®_@w¾_@ÙÎ_@;ß_@žï_@`@b`@Å `@'1`@‰A`@ìQ`@Nb`@°r`@ƒ`@u“`@×£`@9´`@œÄ`@þÔ`@`å`@Ãõ`@%a@‡a@é&a@L7a@®Ga@Xa@sha@Õxa@7‰a@š™a@ü©a@^ºa@ÁÊa@#Ûa@…ëa@çûa@J b@¬b@-b@PK-! [æ?ÿÿÿÿÿÿÿÿ array_3.npyÐГNUMPYv{'descr': 'þÑŸþ¦]þžÙÿõg_û¯ÿçï“oΧÓ/ß?þùþïÕ‡öõrM9•VªÕ/}K >„}Ïú©é£�}ŒzÌ»jIÆï½ç÷·þ|ýÿóÄi'NF} :—r÷ëêÞ²6¨Aä¼×—ß|)­ù–SÚã­lú—PÒ~ÿËͶºŸ]åñõ×^Cr)Ĩ—ž6ýI-–‰ëï‘]cî^ö,ÒA_Ǫƒ¶º—s#¼�íÂÛï.¼m!ë+´˜Š–¥˜ê-Vï¶=ì0Q§Æ‰Ù1ï¢W}…Ñuy­©Õùîk�Ý©��.3Vÿ!jâlÒyÕ¹ [ôc],ï‘]c¬^SðE÷!ŠŸ-êdm‰{|¿2y/vjÝÀٟϧ¶yŸ7�JÞRÙ«ØèœAñÑé«! n>èÞm�ÝrúA[Ó—‰Ým6ºŸ\?±NçFçµèÎû½Ý²>*m/ü¼–tEß"ºx^uœ²ó¥Õ¤?Ê:h'¢úCc«¿°õû [u|Ùr«:è:‘A_56Ÿ¶XBt99ý=Þ|Ij©¹ù7ïÅý,9Ãë«ûÉVwz“g—Y«óØ’®¥oÚW2(o¥ù;_u1sx“ì"sS›n§~¯¯NÌ�º Mò)œ�Y–´’ò¿˜(6é®À�*EW¯” ¯áv]<é6ý#';¾ˆÛ½m±…�Zòº_Yro¯ºži¶COìùÜúymº‘Ùµ]lÕÑÕ¼téÛƒ§­¼ArUºV炾Et¡e]UÉžZžïq¯¦º¼›0Ô_*½¼vÔËÑ~ºè:úÛÞôÖøa×Gµ¿é®eÑKbuºÁò�'Ë{B÷‡Öϧ4|‹:vºÑKLŠc{»‹¶Æñ\#·z.%Úš“Œ‘°IÉ^DÒµ¨Ç±”¶26ú ÃÀFI̸…]Ôk1Š©Öš¶ÀÒV-Æ[à$nAêXò`÷Ŭ²-é‡ùç­*“�zš“ëÜÕ1Í^NŒÓW{¥»^ן÷ü>íUV{)ɆŠn¥D€ŽTt½�±:Œ¬öy`µNvÛ\ÍœJ‰h­r2_u$Ë$´‚$˜ŠØ¾a�éÄF‰éÎwß¾Ívꉎ ÖYͽñ’¡²¬«—œ H¤§Àûˆôª& »Û«ÌL]ñ[[yé�Ç[ŒÓqätØa[u?6Ù7>;½=) ‡]¼Éä¥0õso>K é£ŠF 25ƒôp‘tZ7:XãN=ÍñùuáëÅ<¹ Aûb¦M,~)©œ> ½Êh5 rÉd9ìfâJÇÅCv”’½Ù >Í9íOœæUm^¯N›êͬ :™ ‰+Ö¶ž‘,œ]fn ü(Ž´dòË>G£õ$‡ç×Õœd¾$šNp̘޲;«Cz˜bå¤m^Yµ²DÌßmçÛóL×»ºËFöƒô²ììÜ(EVÊÙ�_ti�m$ïCÕïË2â‘‹™crr3ëd£žäøüºè(2jÒ_E‚ -‡û™â÷æ(¯he½TQ"$MàÛ`¦• ›Ãܪˆ2w|«’)a“5>’•) Òª�C²IÉÈÅ¡“6DVíÝõ�³�zšÃŠ7��Šœn:é‹ÖÆ{Äß0=d &üÄlrkfzÔ‘×¹Ž&±îãæñŒô]dÉ"–b—Ñí,òºƒÃ4reß*Þ}A‚XBJ}]É8Ù©§y}þ )�ö ˆõ( )Á0üÚH¯šÊÒÒ½2h$‘¤›¾G”¾¸›ÊÇ¡nWFÿ¿ÿ°—«�–r«YB¾Hmׯí“Á$ûq“ICÀ£Šá²òtO%³ŠLóÆv7É’¨ï,²COìõà2g=ÂWd8´!à¡ë¿B ³î’‹ÅÍ’Íâ,�#ç{P¹p4ìŽGWº¢Ô�_P%z‚¤ª,Ó¼é6J•–ˆÃ-s9–M"MYRŸP@Ä¥qqOåñÐŒÌDR$BšâŒ‘Kä–™Øä KÌâ°æø&º‘‰. ÷_ #o2½šD´ &í[6‰íè%ÔeqË:ªÒ$2¸93: ·ºIƒàë{J�§Þ8z¹Äbš<üÚ¦ñÆ5zË‘F¯³¡/"…˜õÑ,ÒüÈÈ02R²)m2¬dšG½ü˜oÒSÞ{%áñJGºM*F)iß*'¯í¯¿òl£žæ¸à sW*I’%ÊC§æîÛ´W̓R´§´uCˆ„Mÿx9(á8°aäsÜŠ s9Ë"— $­$±)M[|’–BƒÑ�ìDÀ-”?O°SoA‚ÆK�ÉGDŽŽ;ôÄ^¾qý%zš´DÃÈ“ë¿NrYȉ2X†u _qÂÑ8¸{–=¤:µ^Þï}ª‘“<’ÿÖjÚeÌÈ#‘ƒ(« ÞŸHê{Mvê‰NV,;º�ò��lÚiÃg �Ø£Å#? ¾èCâåR”¤3duÝÜ&éTp•ù1r"͹Îɵ�ƒ®C“èÖïKÎLrY亓òN$Ï›¿�Y`Ò’IìND‚7�êÚE§ãd£žädÁ2¯S¬Ò•i—¡Ýôð˜*û#Î[ò'Ä×Xíu‡<+|qz�Ú*ç,ëO/»¡Á�XzÈ#«Óè®ß—�@‚CžÂNÖRöŒü̽ñ[äÉ"ðè•�¸§‘r®N­K±”Ù^=ÙÉŠuWBfl•Ÿ€÷” �Ë ‹&>¡ü˜ˆ/‡Öt)dy¦"Q’Ë<´Ê„ÝƒÛ–å “b‘Ö�É5½¾&›]÷Tæ:±6y÷:ÙúGMaÞò’1�Ï'õ$' VY�d52^-Œ06士Ç_ÿ„ø«3áIkgñgs­Sxœlñ¸úƒ×uÂë2hAÒBúÖò 3Ñ ]Ò,H¿k' [‹dã-ê#¢á’-ú•rÐMW%’ãúžÒó±UÆ’'‰¦êf—Sî™u“å“×I®±³e’ z•­Jõ†h;ì’Yf¹”¯ÆÎ‰s–W"&{œ††}¤“¡¯›åÑ{ <¬Þ[Ê[ãç‘r•±«�µ=Yß“z>·ÌOý$ÝöBÖáÉ[hÖù“ü_¦¹ÊPÉ—¿,î®Þ£O?»i÷Á5ûG ðÇ‹1,Cq“èB g‡Ýîr Ü 6þ�+…'M¼ÎI��A®Kâ'fI²É=­×sëÆ/a�EéW_-ÑVô€ïÃÒ¯ù ’Ë1Þ*“PN!tj_ˆñF7áhtYѹ“uÃUÖ[‘k"»A§œ�‰l‰ÒZdgJ o2Õ(-È9I—‘ñÚ[šmÐÓz<¶nó6¹þ^·[FQÅ�Ñ¿?󖈀e‚«o‘)Ÿ$’åÚs7ÞÒ³t!§ÓOx™ÆPã�Ò|’\hPÙ0úŽ ®ór�ä©%W7Y Jµé]Éõ”gÔ›5“�z’ãóë&A•Q¢‹!F'…0n,ˆ´ü08? ½zhåUÈØ•O&·Êj& &|ÎWÇBŒl…º%ŽI�I7�I�%m"_°J èw³_2¦$Õ$� }îÍ™ÉN=ÑÉŠeVëgíIšy×W+cÔú#Ò‹¬–��àÙë"U¼â]"XùÈL”láÅ'¼ Òîúòú»Ìó‚)m(U„]$ìä«(xùNN_˜€D’œ › ±4[ß“z<¶.nõí‹4—ìJË� ×u�âj(ÇòÑ(LyáQ²p“°xÅjÛÁÌ4gæåàêT5²õˆ±ë¸½ð…Püb§œaâûy/<$ƒË“%.”2óéU•7ìÔÓŸC�QÁˆ K¥¦©:{—ôª„h’À¾ˆAÂßR—IFñÃE»W‘Å<át½rZæU [ó$Od½Ë—É¥Ÿ,›K,•ù!ÿ¸y¹Ã� qÑ ,•Ӫ㔺H”ŸìÔÓœ,xÃ?#<(QШeꟽM{Õ=Óíͨ€ ãVÍ=Û»ZŒÕedµó×Àƒ|ŸºEÝûFÞÕéã’%ÝaJY_òâM_>n© ­e^K˜éÞB8uŒ÷éI^¬Ÿi)žF†)Ëì$?I�ÄÄ]óPeó ñ5Nˆ–@B`½Q´�î‡8òP}û�ÕuÂêt=Õiž²,]gÙ?j ’ܽ@MoóÒ±¤Ù°àe¡ë¹Lm2õt]“Õ=�ÇSËÑŠ¢92ÑÜp"gQ?èñÓäÌæeŠ‹Ñ²¦ÍÎv„»%‰¯˜‚Ä•ÕCžôÚïEÐÍì^}Í­*'ð¬/-ÆIìÊ”!-—³ävØ @.j{}{r¯²OKëòØe²QOr²`ùØê8’ûN”ãx L·ôª/hb{þ„øâ±�zg�Uÿ™‰ËŠuñ™Ô5‘0–gUo_ÿøã׿ýþw?|÷»sü/~ý‹ï¾¹ýöwß}û뛌�MÖ%!A ½'³X§&PþÒ(ñö7Yà[“)¾ËJur–ô~±eö“s:ît®¼Wˆ·Nž¬üŠ€¥×>ªžŒ¢6®èÿô‘ÞD·“˜û õ@Ñ*,Ô}Ñ’/|${Bôï²ù¤ïndÅëë]ggÜN=·ïåð=Ÿu-²“쨕�ÄŸiRØ,HæˆÕHÌÊ¡G©' Ì+p¨¾×#i²Ñ�ÚäÙUËZÃ(®Òw’¡Ìê|ß"»ÆYâM&…Žr&Ìo…rƒ{tî~’ã…·ß]x+/^4éïE$\e'"K"I@QUe¼‰ÆFB¬HŸ\™yZGËÍŽ¿Ï—ÕЭ”s›MæPÖÆ²Þ%뚎nöbeBŒ¸S©ê°Õ�ÞäÙõ³[Š™Gpi×{ëŸÞ¢º|t›èJ.£îöô¥£[.ÌýþÂ\‡™N˜Ÿˆƒ ÊÓ£œ ��¿î_ŸrA~S¦zKïѺ®ÈÊûØ÷U = ñLJ×®ôœ¾‡…C%¯fÉù÷è®r·Ñ˜áäˆ[•®ó&²7YW:ÃÝxº]…ü‰Å©ßß�·À)n¨“Ň¡‚´wªVl¦Ë©¯âb¤}¥¹Sýÿeý—Êÿ×xšx­yGÌ¡Žé—uŠ«b Ц#aC¦±¡ =YÇg&Õx™'¼ôW^z‰2ÑÇLMî·©±$K� AëIö“»ÚýV›lÐ)HHe“ë·žlÑS{=¸~H +È��“Õâ'ý?oÐ\= ´OXŠLugÃ'Äט->*ò.²¼9¬!y:¯”ŽhÌn#³�âøžÙfÐìYG¤áƒ¯’§¶É2Ï)É! ÖÍ‚òЗð4Gz|ð¸E¥—µã&õ$¯Ï¿a•‘9¥Í¶$‚ D娧籎úè}Ú‹ÇšNWô€nÌnÊæʃÏiŸóÙŸøLÔ~£0¹‘¶“/#˾éìêÈ$¹,»šZ$©j‹›[+ų]…ì¸QOòúü|¦õÀ›÷=ÒmÓßrR X7ì}Ò‹lM&ƒÎ˜NµDvûjŒÏnÂçÁŒHt3~’ÿ@Cƒ~ˆØì+¥÷†xÔ@‹„%š„¢çé#Y.{ŸÆ�ìÔÓŸ_v“õ»õói˳êýÔ§°tÅ}@{ÑI–VÕ=ÑÖ—ÊV´#Cî¾FŒæ%'?áô %�‚Ø{²ŠÜQ¹R,™|gÙð·¬gô^�Þp#Ÿ`åÅ“—V÷tO­ò´I/ø*c\ìÊyØ-¯r·òë:½5>ʬ�`¬AWx÷¶Þ¥ÖÝ–`vE #�Â÷Sh'nR"ÈÚ;=I½b½*iÀÒÛ¼r1R‡F‘ÖÃamOåxf™‡Ò_ºˆMlLææÛÅÔ{<ª`¨‘Y¤·ÆC:ž0T¤'õö¢·ZBzŒò½N$â5^™ø¨q?Y¼òh©ºØ+U'c’èÛ¦_CÆt—ï@ø4or,¹j²Ðè„ß,þ8¬í©ÜZ÷s‰­Ðf’¨¢h³ôû½U7�âˆ-ËÈ2¬lüÜöÊ Ó„‹ÃQdƒŠ Gï '»PwªvÔ›Iowúþü*Ê„e`»{ ã=­çsëÜ”$x, ^î5QM¥=*_¨d[&¹í ö%Žžè/„ RzTº_*�® ¯,•–èÅ¥d‹Y΂½ï‹§,@®b¹ÖTɱG8XzÝ¢§özðžRóž)P�¢™ót•æ:S­X”¦GþSËÈÔ00•&A/*‰×DÕÒM惬BÎHe…~RÎ=³U/ÔòÜ!u¥˜q²QOr|~™Ã2)P©”éKá�”ùú�TÉÛ¤Wƒú¹ÒeÞÑe] )¾ÊÝÓ~ð¹Ž|Žƒk@‰x{#·â�“Z,5(‰eéü`ÑÂU‘õFLWç)ÖS@i²SOt²b™ÕºÛºP®Z§ ãïýˆøê©öÕJñ�|?ús*¥ïÏ‹D™£xÝ&¼Žƒþb‡�*'ìj;Àò·’åeR÷$ ”�íú!)Eª�ªýX€(^¥qŸžàøø2C6\¨zÁ{Á®EÆ»„WYœè%Š`EÑNA0XF{çÿ™‘�÷9“Ùɤèð=Eð‘þŒ Ϙ‘wªòx þN§6ím ¤ÉòžÐã©u–êE™"ºæ´ðÍŠ .³Òí4Wì"Zhgš³Ò�¬Lƒ›åñœ$¥díÈ[Œ ¬}qÊ)t‘¬ÜX¦ ‚�˜{Ùiû“_kèÒPq²Õ©‚~\°Îa º�r � Ãe×ð>íUfì;\/% 'Ïj”ôÉÚö£É~ÂìÁÓ´/©Où7Rìu�•£â�À²7@ËJÕRi‰6Ù3Ù¸SOtXðN¼¼‚ ÏJ ¥ÐGÄWµ%ü˜è;U7ty«Ã„Õe`µ� J³$zÀxK½ÔÊOóˆ 2købx÷’8·wÙ¿4Û©':Y±ÎjN-òCWË8M´îk5ü>íå$…ArÈÀH2ºü[½ -t„»/Tª›#ì¿Yºì  n^z°arèO¤§Ár4åõ˜Ue¶WOv²b]ŠÔ(� 8)N ~? ½,E(?•ÔÈÄÓ—¤ÈàÜ=JãÏfs¡lš‚t±ìþ&[N¿­¢ì"½sú=TvQË—jD­[o1ÙµëâžÊã¡uûX[CE’·­ÛûLEX¥·zh / 82•)£On\Ì.ÆA@T曂£È�Žäš<ÐJ—+ù®{LKû„ö*«õ5$ø@ÛÔ:úõõn›sÇý¯VçÑÅ�Ý¥³Š¼ÿ@¥›l=m'�Ëí�¿!‹¡TÌPGaRj`¨qÚ; ¥qŸžâøü*›½\ä�À6\€'nÉüã{�)Y�÷I¯q™.˜h¹q]±uR‰i|n>OL'Sç…zIk,ùâú�Eê�Niþ2!B‘=Ú<%19Á%Óˆ>ÓÙ—òûûƒo :,Ä]¼/bj1,Ó\6‹ˆDÝ Ÿç†BÙçõ!!õbjDné€s žt†TàðýÍŠ ).�³J¹g‘í»8JšmÕS�¬XgrÐ[ÖEuö«'á_¤K¹í@Gƹœ(nÂí:È ð…6®¢�DfZPÄUí¨W¹ƒµF» ½e[µACJ Gñ½Î³NU÷ÏßðädòÃvþh ¼·Ns݃ƒy; æàNm¯âGžï§\@Dîªu‰ô„?J]ôÒœƒ#Üd®ëšiOºƒ¬„àˆÁö(vãF=ÉëóëÙ_Œ ýôÁCÑK¥ò¹ë-K¥}@z‘ÑUš&€Q­¯R͘ÄNŸö‘*aÂç4dÙ¥;‹dZlt™nü@®&2A¿ÚÌâ; ß´xO¦T�bãòžÎó©õŒz Ô½[ßž\2Rê:=� ôBo•âj"½ZHÎa+�˜œcåI�õåî§Dº.›V›O¡IŽAjÇ ¡q¡Ä¶ù†/Qß*Ç“–ľå¸MOp|~ùÀê�RnÀÍ‘aH¥ÝÁé ü!yû>íÕj'Š Á3<í8éÄHêW¿üîû_ÿö‚æÿã~üöûÛ¿ûæ‡oAŒÖfrÀHj€wJ~ÑÜÞHгó-Å=S_¥×æ©Â@`°ô5!ãF'šã2æz�¹ñm«£Ûsúу] v5€ÚeíQ œ?J�*ecïÇÞ â ÜÒqþ‘‹f¢\àLzÅ¡«“�-âszòù^é~â0p): AØåÓ‚6$ÞêW‰wjwÀ¤ ÙÒÖ-!ã@én›ýÑ3åg[Ý /³w§Þ<Ùu"lR·�GöÖHðÝ5Îî)KÛ²D’‡³tág¿»r6¤�à‘~@y™e'/úN4°:ó’>ÉzSº˜»åÚ7 k-¯yÝàNåõÈ*�ërtÁÄ‘)SvòPÔtä¯P[e^3äH½´"[Îͪž�«>1ïç3óÚ%©ŽH t~Qs±Q†›Sj2¥,0 (¢+ÀWœÂë]Ù%ž×�îÄ®�¶u^îzs\ì@1˜¹BTµ>¥ÑÏ7ˆ®²´Úxop Ü¬N·†Ò³ôû+K飣†ÅpÌ)t‰}|Ž$íï¼+eÖ—ä×ÑÕ~$÷‰ùštØéQ)}ö�êiAKx®¾¢­ò+^â³DÞ¢»ÈXÖ`cÖ_T(Ë £®3>,ç Æî�í ØÏšŠVû=,…kížÕmÅ  €¢¼‘Ç–…,Q*ÛÊ•ý(E‰0tXÜ“¹?´~>qñk ”‚¿%‘éöô¬ÉŒ|·5‚«gX™B’œä2••{¾²Ð�,,­n|5rli·V'ñ#*« À.+VÜõýŠSÇ$ ¹Yr+{0èÉV'¸üqÅ:wAÃ$&”S$·0åîûÔ—Õ]‹º«Tõ†4gu¹²:\Y�>§¸BòÙ*UƒÕP5Y ƒtMõþn�ç�­*ïGfœü'*“ zRÏÇ–Õ’ Q|µÃù$S’-«£Þd.è–öþö°MOo||�Á’µ:¨²JsÙ :½†’”÷I¯óã¸Hyë÷ÇÝ>᯿HÞÝS Ë\¡J«H £ eE³§Ä�Ü †xdŠ•åÑQ&ä;j£Ã ²ÀÍ6êiŽ ÖÅn�öÏ$ÌAÒÀè’¤x”ÁÍú„ö²~g— “ŒúÔÇ8Î×…Ën<Ų\6ÃÉ™Z«<È.m U­[ÊܧÐEa³~TføP—M;µn³ zZ¯×½+°™BU~éôä.]e§˜‡Ô§±…©L�7yáæ¨Âœ.;ýš»wàtr¥8b“ó*Ç7„ݘ™LƒOÑ'±êLÒ–÷”žÏ½!R`lW2€û6gå*ÍåÛߨ4ˆÐIGøÀÉpáäQˆ~6ôÍ™ˆ@YÕÅG0Y*‡D i§S¿-ãÒ4€wðÈ�¤9ÃŒ�aƒžÖëÁ7Ì� X[™ô÷ÔX&ºÌM:¨¨Ÿ(ÞìM¸OÜ|T¤ŸÏ%fŠLgƒš¨–¨l¬àZ—@ÐyÂH9QX& Ýr\ß“z=øÆ%—Ĭ œÔ9±ATû†ûÑtá-šëw\ˆ'óyQ¢^ã•™ÃÑ�P_7GÔúó ^•Á3Sq¨d dƒXrD¢BÜHΦÉúžÒó±uVj»â )XŠ´&¨gë$—9Ùˆ’§J£fꌓùÂÉ£ ½ç$…™öÕ‚� ÖÕ�Q¨H�q&Ž ˜üè¶"êd�€ç×)í J¬‡}ت§z¬xÃóo`¾2g4OЬIÅòC¹{â'Ë$™J¥6'ïu”Æjݯ˜.sæixª× Sx'ßÃH™M²L™Hiò„O)tòÛdj ®®' 8®ïI=Ÿ{#2¥C‡ˆ±‚…6�L­’\¶�q޽`Úú/ØFõÂÊ8Xø’�äIœà¹Èå&ÿÖmâ¦ä¿Ô¸¡d)×£WE¿<²)�=îEžìtªe¿.X7ó©ßÎ6poÑ Ð7Š4Ÿ¸€ŸP^d²¼ƒ&Ù „¨£TqÄeÞÙ…Çñª™t ïI¶—è3sÎêÑA§§Q¯VŠ�ËF"'3ãÄÉ]9.¨�I—÷„ž�­²“î8©ZÎŒ%ŸY÷ d ?×I®ñ¤ð,a'wMÇßÞé³U€¾( ï÷ Ù�¿É¸�•Ú-�ÁQÁ`F eJb#e €‘F ƒ˜‚áÃ×Öÿ5îÔ“œ<¿Î[ý’ùtöåà�‹šŸ`áôÔ¾O{‘Éॣû+v™³>~÷"ß¼¸ì.\Nc@µZZ�àL¡ƒ�Ɇ² ­=‘Cì(5èH€gG*åœzO»líxÃV=Ñë‚w’SUäÁLÄð±ÒËî™~‹P—ör$� ¯3Ž«:�zeóàF9°v)ö¤’H:ùc`¬lÕÓ·Dk@3¬“F�#�ï"4À#ŽUšíp.Z¿?·¬ÅÐåV>É@Ôä¶w tµÔ7H®ÚÖ~']#[D?ûf3Äž]¶»ä«WV–++uÙ6JLPz»«ám¤“®YªT¬e÷‰ Ž[²Æz ¸x¬L¶:U§� V™+Óu×Á¶Ñ¦À“¾ß_n*ÉúOˆ¯±™Ž=Ñf‚A&ÊH›~{1SÁ_¬4º«2òu:�™ªF%±Cê0'1R@_¦|*PAjÆ™Lø”zö9•¤__— ô÷xpbˆíHÙð”ï†ÍFÂÛoÓ^, ® É™£ýÆ×{å=¡áÎn×£düï6¦™D†ÏQþè©ÛÝ(j¡xWv ̶Ô±�r昖f;ôÄ^¾‘ÕbΘîP©™p¤á2=u·ÌÜ·ˆ.[·ÌÆäeH–Ç8µn}¾ò3Žn,cÉíç:“Ü<æ½�&.Wœ9Ð8-Y¾—PUV˶Q4dŽì°COìõàºîb’ˆÌXI¢J_ƽlJs׉.+-¯wÅpWÑon®´Ê•Ÿ£ãE¿²RnÌsM¥PÓ R‡´ÙÈAÚÞ j$ñ˜bA&$„Þ™�lÔ“Ÿ£l…ºÅÌ –ºž•­¼K{™É…Fñ#¥qmÎäzer’žy –j�;åE7æÏèÓ;>¡¾ÊçAM€pêO&Ø5¸+£ë hÙÚˆP”J²ÁÑôoP\O2Lž<Ŧ(1¶¬ƒD›ìÔ¼©¥¼WbO?´|)Rû6ñõ˜­$eÅÝ‹õ³ þÂç£Jüt é®ßèé²�(LT§¢LòЩŠnnÜÏh/LB%Ê�ö0G¤vÜ §õxlùðêNËû±|L´ÿùˆ+Ðû¹LqõÀê3fnezGK˜ôÈÔ®ŒLÃ�•1^6’D´ÞS>ÇäŠwÁõšô1UºŒ¬†ô£H²‚jÝÏúœìÔÓ”w*4öI'2°\ÓÍ·I/—k’…Qô2/×|©²¾DüÄe -†v`+·t ·ïÓÓ¾¨�õ!£Ö6ÆÆè�Ȭd®2r_½7Ùª§:Y±n3¤`™Å£ FS4üDƒb Å'Ô—­2TûzkœX è©zûö§_ýýïúöZÿëï¿ùîëÛ¿úÝ�¿Â‹ÔU“m»K Tì  0*Ôú£�ƒÜÉž  h?”µG¿¦ Kœmu";®0ôø�0üíþ E˜*‘G4ø#êú¹ÂP¶ðuàÐ)õ`¼‰DP�†˜C…R¢@ÅõQ!ò -cÑø�z~ß‹Ç{N;ü?)•B×râfܤ(Í>…œÔI5Ó‚ÙŒˆd°méÚÚé­yld*¨2|'w}¶,sXæoÄéq´ÂÄ:ëÍ|“î�‘rKën3¼¦• Iz°TµÊ$øç[ ÕX/¬ýîÂÚH­ä^K³ŠÈD5¬î¡¤m‚òâµ÷­o+[”ª½€hÀ†6Ð¥%Ç�îÔîϦe†ÊS¸ºéEF*™§]ßo•—¨­±QªŒWǨ\ÝR¬ë \�Ço“Åv02ŒüùÄÈz5U5Œ‹¯ñˆŽoY–¯^s5�õl´‰K ZcW=ü�tΘ�+‘�àºS›<»ÊÒb�‚;©Ne8Ú»÷ו¦hõ=ºkÌe.lA®ª "‡›Àò«/X51·\˜ûý•¹!1>•·|32 ä!*¬+ÐÖT‡Ì„ÿÒGª/7ñu7ºS]å­äÝ[TšZÇq%úýjEhì-²k¬õàMï”|3çÃ�R‰µ>ÜoyÅLªí,[»2󞿺FÀ–c~}¤/‘oLÚœ¶ŒIm#ÇhË1pOR0ܵqyOèùزD­4dÓ4k¦$¡�àÿà¡Àe’kŠÊP».Xb7Ž—(Mò°4jÜÌnú+7�²7o «åkhà`þZmè6F¤y›žíU�gò…ú ¯çV $:‡{¢ãó«<Þm¼|ÓÝsÔ{åøû´yM㥓?C9ìêòô ¤3›±ºŽ¬>jÌÏÇ—ô9Q›�†‡†_阴Éäv¶¬•içqsGCÃK’r÷0B-¾¶ª†»܉è}Á;§¸"=™"#=s¢‡xöÔÒü²Jqõ Sà-ÛGäÞAî0Ú)ÛFÆÅå'ÆS; b˜~K¡zÆnépÄ´;‹òFÊ€Br”×Éw/ô›.2ÙèTÐ~Yà×lÜÑ•M»aô`TÊ‹{ŠA¢ö>ñE Ä5];vG®v�Õ6=¶íûœÑþÌh�h•‡Gժ̃vKÒM`DËÉiÉ0˜‹¹Y°ü"¨–=ݰQOòúü^—MË0'ÌÙæþÆúþ{žlÏûÄ×ÍxÕlq{Z»š5<s÷Ëv“0iäõ`:ÔFgóedÙ€…F‹00Û¦" �V6Ê\:0n€ì§ —ÇF‘Fö}?#Ê__ç´k˜r©"�ÕcÌÝPßø6éÅ}m‘®m&d3* Ÿî.<ÌùÕ—¹<¨?Yz©ŠcÚæF ì&;—±NŽðÕ-WƒŠÔ "™Ž¬»?õqŸžâøü*—Ais&'™¤kµ;õk÷q©áÒk\¦Áœœ&5‰¢ï ýþfÌpãsù|ÔªŸ# �\bœ ¦²‡òß�ˆ!ßLÒô &AãQåVdÇ·D =·¢NÆWš_NT'+Ö#’M;©‹\aÌ¡<ž%å†O÷õE•H6O q½Ýàâ7ÖÏÑñ`w¼²ûQÎ~²ê€¹£'—F$x‭´-ZвÕpE™0›vLa$`üZϬ*~ÉÔó¹eŽþkF&2¸W¿zÖ¬·Ns‘Ÿ.’v+©V›Çëu«;×Ü'cgš°s<½ºc4 Êç0l}[ÆŠn7Š ­ {É¿bjÁ"¢ Fª×{��ä_ådîuOóºà #ò몷=ìÏ™e¹Z”ä}⋜®÷1GàœáW‚äYOƒzÛžG^…î'^Ëé®ÖM9W“j¹%ëÐ#¹¹™ãV">'Ïæ0ƒÄB!méa¼–ü³ùã 9>¿Ìjè±×ȽqO%ÖöG¨�äòû´5Ÿ«–¤¶É×Íß‹ª^E¨û¡úÊÈè00Zþݾ&ô’)i¤ÄemOÒêÜJü´p&S“ «‘c—¥uÏ}Zò†àOÇç—ÕA>-ÑRsØL»bÚáaaT‹�¾MzQõ�l&U™YiƒÛµøDÖ¤úØø\G>ÇÁ;!Ðã­å´ÈÌw»Í»Ûqòd»#IWnª—ÍpDåûèªTà'ÏÓ9Ç�zšã‚eéL=F¥ €¾‚;ÀÒÃpõÞÐxß&¾Æë�$5“`È›å4«)2^· ¯ãUïQü¹%&!$š%Á ”¤µTS„ADœ~œ@IM ©Á™ë›�&ûô‡çÃ1xÊ9 ¾RqG >tÎ=ý~_cµ^-ª�QiÎÉBò¯`•d’ƒÕnŸ³:\²tÎ1ë/RN«cC^>�—]³§E=ßdkˆý´ PUhYØ�¹[çŠÕc§Œp—CÓN4Çç—y]PÃg®y“ЇR´Êö÷I/ �È}a:5¸[¯�è•Æi7r: ž Ì5p�AåøãTë—XÒ72;ÔÉ,¡TІ4Ñ(%ïF9Eß/žû4 b»œH^¼a|8â‘;É�Ôèhj}B{ÑöÐ9«É&(ÃP«ë™xhãxˆç'œžxƒ2àöe3¢õÅ÷²Q›› sŽé¯:(›ÜCú·Cf,' ißLøØ‰Êb½‘öN”îcdžˉgk/1×zûšY$ùÕ�AXñꋉg k²p´Šùðšžµî!™btaÂí2†í ðd° ­0î,ƒ|X88)øó' FAŠ´ì@8ž3»“�zš“«Ì��®±ÝðM´×gÂôÞ¾÷ñ5^3:ÃÑÔEÚ=Xj¯ªw°�Ù�0 .Œ—!ÈëÚ0n+dz–AJVsm-÷ VNBËpRªï£Iq²QOr²`ù`7Ü»Äp8ìG+<3)Ôh}B|‘×.GC Šú vÉË÷–Ò8äõà->ŠðOI¿š€Ü­ËNŒŽȃÙPMrNÖ^$eiƒ_0rc`€},ÖEf`ؽ#øAæxfÝS‘ ÁŒD2ª—®ŒgUji�Ú¢o" šžÞÆI¾Öx˜'<ŒÃqÝÁÀó˜l¤ÕðU«îÌÜh†Úx@�PæúyÆñ’¡AcS tŒtß)�ù)[Û_0ðÇ«ì%ß¶SàÍÙC¢FO˜WÃuü€ú»“Õ£:æS[1¸uðŸvó]— »'NwnÔŒêîe† !Šõ�7+F¡´>6C±ÎζC<Ëç½ÑVÛ—ÙäçN2 å)у{":.XO¡ÔÅUFúƒ}ÚçÞ'½êuëÿjmÈøX);²ù\OñàÌëvuÂé|õP2%x².8Áø¬þFÍyÞ*øôÿ`²'PI‰k¨Oîen§HÒcí` G¢x}þ� ýqÕ´ }Ñ0ˆ“�k'íþñEó‚ F*v Ûlï’_&Ž|«®Ü„Õ£}á]Û8"r°,8žn…h‹Ùp'éÉ¡µfӹЫ• Öû¼·[œ*¤Ÿ;QïàÛ3Hþ¸`9]å32Äf£¨ø½)w½Ûö_LWU€…�ì}.™þLV vPß�Ô ßç̾¤cÚ¨.€a¯†®[#©4+èÆZÎ@Z ‡@%˜±ù°Œé�õÞÞ—˜¬R�Ç– 7BùTòÑLw˜N%¿"’4d.S\´ ú À(P3ûÑœžºJ�fuCÄìFnÖ�›AžÝ¶3¹Z‹áŠp²éÙ®8Z1+ mŸm°sf¼gÌÙNÈ´uÒxا§x}þ�ÚL¢„R]t¡ÆÔ&éûh/z|]©)P)0k^Co)c< ýÈè£Zÿ’ÿ°Hö¯/ÀÛ7ˆÁ›sõ 4Ü(ƒ"ÇÊ0&¹©‘&qiÚ.²èûP-C9r¨g�üqÁ @œ„·ÁH–¾¿†"?!¾šŒÌô’â'ž„¹&)@&¬NÙ–¼­²àˆë2½S«ô yŸIS_;Kßé®1í!ÝÂhIjÉ]„Œ¸ïà±Çi„É'b¯—�qb溎âtPª‰î‡ö,Ë ðe�èâùm˜X�•fCKéÒ•öŒ–8³ÛüIÅõuúç œD¥´AâHVÊ q+b&}*y‹á,×Fæ"�+Lâ †2|oŸ¿¾o”uÆ)ý«'’Ãóñ� õ WÍÙÊ€}yVª{ëHz›öjÎ$‘tÒñ”y$Ò÷_IpÊÝûîßüð럾ùÅ7ß�+ô¿ùÕ·?üpûñÛoóq6m6VÏjydø¤[‘GBñoHŒT“‚Ño‰Hã-èWbé±XltX}¢t »^÷7$þ�öŠó�êÞ¨|@KD¢@Œ&xD�ªY-«$A«‘hxÂ:šÄËqô 0¼ú¨¬ñ]Éñž’13õ̼ãŸØ8ã†Þ�ëÛ,[ˆÝEÁ™Ìéèx¦ï#Û¸½ÍºÞkš¬¿y>±ÊÃ=ÈíMÍŠvä@2;‡½5„.ÐZcžü\[=OÁ¤á^¼pï» ÷){]uJ¹³�o‘LhJ;�ÀI[;s5˜ÚτЂ±~‚c·¹Ó]æ&�UÜ‚†G©Ò,¯þZ«„}‹ê"_u¬ ó"=ëÛh«”jKŒ­y`ëÏ'¶ê½�c ¸Az?„Y·œ %þÖ *áæ6DÂŽ£’¨!”zŽ7 [ÝéMž]?©Œ¿ *ç•°ã¯|“ìê¡%¬B‡y5Õ1�Ž„¹åÂÜï/ÌÅÖ¯Ò’’E׋ )µîTJOµ£n;fÚŒ8F{Ú­Ù1òé·z`å�¯s·ʧò²P­>™ôù&ÝUöJ]�ó_¸¹“ASÌ[=ñ·«Æ?�`YiŒ_Qô-Ø<ƒbe\žfFÍSñõX,¿±åc~ø°þ„�l�§€bd9‘�1Èn€Z'¸ÊLixº“Q‡6Ø®l褗gà�™yÂL?¨zŒBBá@óó­ óëà‹05qÀ^E®£è(E ­ñ™„ÓL6êi^„uþFCd³™]ÖÉ™˜Ïó„}³š…÷i¯²ºE‰k<kd›5ÖÂê2au¸²š€¾—!ìw±°Ù¨[¢�,†°ëçyPo‘Dô5iºl¥ñÃêžÎý¡Už¶Xó%¨Ë(4è¾Ôµ·Ç˜W ®1R´n…nmÁ0åhfx öLÀº:2ò(»? ù+¸é�â[Ò€tƒ¢wQ†ˆx#P`½b(ál“æäʹѸ¾'õ|î @܇¼¯t˜ €U‚Ë@®GÈ2æô=\ú’h#7� û“ ®�öO¯ƒQ(?»s:„ÞRa2°éñs„˜$ì,\Om¶SOt²bÙˆ¹äD“c˜_{ÆÿéÆþˆø·ÅavÒN íGçcîBµÁ,/¿Ï¹íÏgW�S˜˜eëˆÐà’S#:'‹‘Vjæ¤ÊðÙž# =`3=��CÅ [õD' V¹M]9hb�ÑJï^Byñí5fÓøéIlôçÛ@´KŽñÚMx= MpÛ™_¯£,™ài?L€�Ç ¢û KÌÛ6©ŽPìX”rf�lÔ“œ,X>וà�ô ¤vL„{ô}g u~@|ñ\ƒÃÝK™)µaFvÒ¢eÞOx=*7ÆWS˜ß¢ÜÌŠÛ'3bc(•OQ«´ÎÒ^[[aJwlûÑ¡³Ÿ¦F�]jü/ϯ²ÚÐSmDµU5»I,õÚ‹òš\#ƒ+w„*èñ›Ï]½»ß-  k>pú¨µ?gâ&oºY;t/Ó­‚§ ¿Â`ºŸ9Zy>Í4†b~Ä3ý©Âk²QOs\ðFÄ&5�(›!u„yÄæm⫱›JK!ú‚yí¦ÅéïÚ¢Œ×ñÊëGõýéT»Âø‰Ôl$�ŽD54pJ´à]t}˜ž ŸÙ˜MB¾>'ª  ï}kÒd§žè¸`ÙøðC@$"ñâF|�OH¯š!t’ï5Ðð'ž8PóáYÞŒÓiÂéáT3À¼ [�h.j†§¶O€ i›Â$¹Å=üäo½>[ÜÓ9ZghH5†TåqÎô*½e.V¢D´óâP|�‹yäâQb².*À¿dZ=~½Ùº„Z�ä=�‹ ´ùÒD%ã"D:t¬ÑayOèõÜ:+ kæFÖf§Eq€…{ƒä*7)7’eR ­„ø�IÔw�jÌ,#3CšIx03°÷å§o�ôyÔdú0=2ŒZm\›�Ksv±‘«ÃúžÒó±7Îe�Ï´[e)õ»Ós¹FqýdbôFKÊ_ºßudf¼ 2\yÃ̉MÖ3m=ae™ö˜#ì^ZJ&ËT1MŽy?!YŸFìR½“½z²÷ïpÖ›7¡Ë�g›L�|ƒæ2oéßÕûKŒ½Š_àm›ð6ŽZªÊŠeö¬éqÃÕN¥LV¿J<Ã�ËVØÍr¥0BhKMÇÄšë=©×sïè$G…DÈhñ0UJ«$×u‘!Óêÿõ«ÛœŸaŸó3\ø)Ïzí»Ë×JJ~BBžÙÀŒ82R\5xŽ ƒÝæÎæ¸OOq|þ öJº5r($»æ:ÿ]Òël–½&—4Z2û lv#›ÓÇE+™ÎVVÈ$y·1Ò%Yõ1¾05p4q€Á¹EO‡AÏK³­zª×î¡ ˜½'ŸãSt¡ûíe^ƒ©_Íð 3¦¼ö^�îÙî’uœz pöt”éWiĦX"bF^m£ÉÓ�´Ûï»)²ëâžÌó±7xJy££°’&Š©"[¤¸®È Ézo5È_:µaÂÉ2¸_òZäÄÊ¡�‚ØG7G¢{‰ªgÏØ!Âæm.'Xî=Zú,Y�ïuhÇ�N(ýã‚õˆ¹«€I…Aô– ¤ør�˜ðíUVK¢G°ûÍÆ\Ãë‰û•§€wBk#ƒ¥éAT ´>¹¶{ŸŠ²œÂâhöm¤�vS7øÂ¥ï(·:!ö�+ÞÈXÆb#@œ�a˜f,ß'¾œ·LzÝÌÔª pžiÞ2 .Ø£îýœ ÒFº�ÍFòéÀÜHz¼L@êëI]Æ&Qwro@P³¹�|â»fêq£žädÁ;© z lÀà›³TÐÛ´×SA9¢w-zå © �'¬Ž£Ÿ&çvc<“5Ý8�'s�-¼ÓŠ›è62—¶^æá‚jžÝ =nô°QOñúü;j/ñ‰ZÉûÊm긽IyÝ£ø†Ë`™™ÿʄɣ3œ²“ $±oÅC�jvâø[@05† PMø=Ò|JŸˆ³!¤�>�u4Ù©':.Xç3=²$8�%�pÞŸÐ^å4q#Ð89— –<»×½rˆŽ:au¾z ¸¿Œ¼%K°š|¬‘¶ï@w•´b´> ²2¦|‚T™B@´†Ã׉·ê‰N¬Wí$¼bJèË{01Ûën4Ëø„öjíŽNXÉ%P/]­ÊÅ®ø½ZV#´ ¯GDï«P݇µ‘ÁÚ»IW3°’ ¸LÙY�âx›òš} n³�DVŸ€ÿï�½!‘y“Œ¬É ÅO%ò"Åe9œ á"#Nò—äpÜç¼ô— ½Bº�1t†-E‰^ÓWbnnbf'É.É;y%ÕfÙú^9a–âòÉœ÷êÉNV¬[Yj 1|,І%{N¦ÎÓÀ0¬žˆ/—ó‰˜åäÈ¡÷h^Îç&ü®Cö³ÄÄë Õ“¡�Ö…� ŠDâ�%(’4…FqdæëëTw�y²SOóºàÍGµ= D R½�¹©Ãð”ÉP^Ö|r©Â Âð…Èeô#›�Ò÷³8,$Ùΰ ”²[¶FMLxÇ�–‰�þ–A¤ë vÈÛ”áW¤mܨ'9Yð†0¶®/C~à8΄ñÛ´—…q@Îæ‰XïçDÇ0atäNì2:?C–áMÖx¥»Jÿ1IVŽIÓQ"ÕwÕªý˜+;.¾TÛ§wœj:kQ3€4}{€vÝ«F"äUz‹L¤GƒÙ˜ELbÞ^ }EÆqZO ­/u¿MJ ,ˆxÒ)©²E ° ±JѾѸDœ‰Jƒ o=¸œltBý¿.Xw<¼5€€´KËà�ó˜ŸøÔQ…�¨/ÖDDÆe-ê+¬Jö�ƒ Óâ+g͇ßÿôõ~óý/û›sùûï~øõ�¿ºýúÛ_üðõÍ*å™ôŽ4…É™=‘ËÂ4rÖvà˜-jZ)©”d’™s/É6nu¢:¬8~1 ”q žªŽé'ŽUzÚL†;b7ܹú�h3¶‡ æ‚så q†ežê#€>¬Ÿ.·.½m¦@_¼¾WÊ÷\fìÄøX¦ßÎn;hã�!F�‰{Œ7êf6znò½°ŠƒÝ@§Çõw"Ï'ÖX¹S Z°$;`ia³–õgI—Zk¬ó.2áØã¬D‚·ŽÄï/Nê'óâ™yß]˜§·¶$IID‡™›Íº"Á�«y`ŠØbšß1þãjÆåw�ÖXLja)¤j¨2_mÖå 'Aê ©5ÎeÆj6r‰»„¨ &®üƒV¡<Òìž ã~>1ÎÓ�ox¡�,B*>`º k[ï©�mž©šîµ1§tÀ¸ÑÈxv�›fi)óަvŠžÝsÔ® ïQ]c,=LŽãó �ÿ{ÿ@Ä8[ΜýþÊÙFH#rªÁ'e#:å·\ ì)·L H‚¿2rÊô‚£¥ŽÈ^º`‡�[Ý N^½å ¦Vø$Nýrò=ª‹÷Ý&œIýxzµŒôªóüW�IŽo»Â÷“À”E0±[SÚOF@R¤çå&zL¼—¶L…¡›²´°Á$ÀÔ"Vs–úúq£žädÁ—õ‹£”„$'#YÍÖ™6Õ'Üñ?!½xš›õë¿Ó}Œö¬%ïnfIû|eà2ŸÃ•Ï®æ 1‘/’r6[ƒQÛŒ2Ê4�?A…Rc.d‰äŠœi¶SOôº`ù8“$¨ôùq^ód¾Ý'”×øŒ0hÏ¡Y_ à5¸6›ëÀæ£Xþtœ™„!£ P°¾Ó�‚æh14ÖÈG¨¹ 0›Cy MÖ÷”O­r|¶‚f9÷}™Ú"z½fÃÔ¤ ?o†’ö4’ \l�rø“¹V2g8ÇJ�±/´¡P&­kE«7:`âTu’†©$(6¢>]P&NvêiN,²61öÊfd…ÆH�çÓ¬´ž ÷)/ ߈(Ha÷–Þk“aª_‘*™òÙŸOk”� €¾:2$�Ý‘oɧœ Éab¥‡ƒŠµN˜lt)¾¿.X¾©<€¶>F�×äžm,�3ý>åEÙ«·–hgó`9ƒ·Úýs¨…7°Ù�l, ½Äj 3·Ù’d§@ËØlí:JÖßDèÆÜŸløó³ zZÏçVåXõ%H¿:æŽLâoP\” ò“0 =(\€ÛEFQ?Om, fú‘™£" `@îTÌ3ášù3TR0|"SQÈÅÑÓ‰øjÀ ìò�-øϽAãF=ÍqÁ"we Xùqjä°fã?!½Èf ÈþûàfØìR–ÃW6}eóQâ~vÜ �N~škt"X;¥u8·<2>4êbn© Ò;Þ¦~­ßc'ØÊd«žèdÁê1Ž–¹# “#5g×BƒO(¯ Ö‰„{ʧMet½é�ý[ã…Ï�úöÓq-Ôæ×Éæ’a íK@€´³ x›º°•Èd%ìz·'dË6Û©'z_±*$ÊN"!f‰%¼r§"ãáiø¦óm‘âW+“#€£Þ´¦ì^æ®Î[M#[‡ã›“wœ�¦ô×G,¤¤8ü&~k´¼;Š—uZñ/W’R“õ=¥çc‹¼là ‚„\ÁH1íR¹¤÷S³— .† ½Þù ›½•Ž1]wkî+sù®¬<ªÜOƘô ?Fi«B3`#Œa`š$vÆ”ÙU B$˜�N˜äØHÃF=Éû‚´n�YE†K_ú‰£æ’.·²NnÕìÒ„¬beÃÈh�}:‚ÙÎf†êøIP4`rãªì‰A؃†‹�ÉzØ=¼Àc ¯Žï¦yب§8y~�³Œ~ ˜>IÒûéèÇ÷)¯1èB`Ú P�i]WO«Ú¦;Áå:p9î£Ñ¥Ó¸9fÉb@z5s¦ëÜ r'¿?Ð(Ÿëg^ûÉV§Bûë‚eýUha ‰S)s� P|@yÕ ˆ\ïxŒ²(‘xâ y³ÚÈæ8¸òo­�Ò»h!j È8â¼3yÜÛ t�™ ‘@N¥Pß«�²¥“­zªã‚U>KØ¡=Qj³²†ÖôOH¯ .g£÷ʼ¢¼Ù ‘‡�«Öö)ŸÃ%NFÆA‚7XJž2ÇÄH2IºD·‚·"âjcöÊΜ'Í1 ;žAr†­z¢¶`Ý•‹ÐWࣘˆ9åí¹U~RF¨1>ÙM ¯æ†¦Á)a~üI26vÐæ“|:jÐðyZd °!lL�%tŒ_�ã¾ûÞ6�“�zšÇ‚e†2�‚VBÂ1L`J–É-ª5‰gzÇä‚dÀŒ"¹Ïr)Y�_Yjxàè,Ä(+1>2hÀ õâw¢‰²êtJAKÔ3­èHJ±‘ D]øS:OvêiN,†˜Ád[Öªþ˜!5 �ß# ;ØHïS^ãs 0§ÊvˆT˜X¢ôÞ'^uuˆÜF>—áä²}O~¶-êÌQp ©ÀÁ”CL#úC-õ³Ôm<á°Õ>X°hðêî{j¾<@ù8ü}k»Tï¤M_1·ÆWÚ} h#•Ù5&O/—õ ‚‹ò!S�"'ŽÚ>ò¦³{ÙdÒT_™1=0st�=m_ x[•+…yWt¸Ë5t†ñT)n`6F¡úØ‚ Þ�:Ù6nÔ“¼/HËÅJ`)°±õÁõÃý:ÁÕ %Œo9³¬.¡È.æ©ÿ}e'~àib”…bCâ€b–Ü éÉÑr� “‹|GKîÊ5uf$’U“å=¥Çc«A0Â`Îé¿r¶Ã{«2 j•Þj ÎSã ÈÁíÔ”hÿÊNÌÀÈÁLÈà)²JdßK™Þ¢ä=VàØ™·rk²�Ü¡Vƒ‚uÓ–4Y¥ÉúžÒó±Å3¹'›Jí�–®î`i¯zÅì*ÁÕX‘ó*òZúQzöê �ÑY™Í>eåùLÆ}£•2€—éåò�­Ù@¥mæZ_™nÀðÜLQûòýص›,?cÝß[ä$ð[ [¨š 6tï\„ôÁENÂZq;¸_Ò æ‡uhrb³±Ò�¬¬WVÒf…Ò…!‡ ½üBÆë7ɼµ¢ƒŠe!µ¤+osp §^fŽ;õ4ï –oº¡Jî6Wƒ!ß6-°+w“:X¦·ÈTÐOv@ô¥ÂQÕÙú-S�,xveêQn~ºê­n D–I¨R᤿˜Úš0§X�ðÕ©`¶©ÇníAÑÒd§žæ°`5¤¨Ã¨ŸÊ|e¦‡SÇC—²văަ¼ÆçDí¹ì1( i+r*®«%pë¬*gàstSBžïèW^�Là[a^y BRš·Q¬��,}òÑ’5-÷]ZÔ¶�;õD'+íTcÔ½üîê¼âM@š|B{Q{Åhxï•FèìC‚òÉ»h*á�¹½úê+ÒÏÑšMeõÊáfÌOb*RÕµ1ð|™pcNФS¨$Y}"ôxŒ˜€\ ]y:.ðä#Ý#þ ßy|4漆BÐ|üÉÝH2p±ééœ|DT�Ê�f þŠuÇG@$æ©vܼף÷|¤“—)^ÀYÉj6_¥#ÌyÕᬲdkKVƒE³šä²?BJi²øYñn¾Ê?ÒÎÑw£_�ßGmÿýh0Õ{…Öãè¢Õ¯‹ú:uƒ9òJÀd8c\¼0î» ã˜O ú œýdêTŸP,”¢ÒäoÔŽÄéˆmQlpcÚj<9Óã6wZ㣫Üôø0;%ö.ëþ7ôVë ?A~�ìc%-]Â[¤<žâ�íÔøš¾þ|âk¨”+ÓÓFwHt6?R™©W™9µH9¾±QèOn“L¾MÞík j�mõ@¸^æn)«s‚"W¸{îÆö6á5þÊ”Gš²] Ì‘ÜGÍÜ!>Ë…¿ß_øKÞÅ”9ƒA‘I'FZ@p§šcPì �×dŒg»&ðÛmTÆŸŠÛÇ�øöã³ËÌÝ¥8â0òb�/í‘Ä…2‡wé.ñÖüJ™Í ´L&~Û»Þ\׌·ù,L»ªô“D­kã}€Ž †&©¦ +V¦ õT­Þ¨øgÚy(*ýiܤ롟×7Ù¨§9,ˆËlvŒÛ`$*6ön6uê“åù3ÚK¬–» ŸNg#ѱz¤®»¶°r°:OXí¯¬–Ñ7YP¸"I‡C‡R²œq¯¨,iÝnŽ$áÆ4\h¢½„&n²MãòžÐã©e¦ê_3�–™žG³­ðÛÃŒ|‡àÚ¡åçЛjqPä¤Õì?q‡�NˆÆ‘“a8´ì´é„†3šºRŸúQÔÓFÙ°©‚&Å”É� â—h{Ð�ÛOWn²SOt\°Ê_Ð=«j6Dåêf-xŸ_;µ‘(+�¬ J”¾ /Ç×›µ•ëÈë£*½çµbXÊ—¬^3Ì~¹¹…ÁwÌÃá—&y=Þ#!¨WáíFÐík§šgõ4Çˬ¦ü^b°b°Òd64é|Bz�ÑúÙô%zºG$�Ì é²�…ÖGqº�œ>jÔO§Zo�Øs•CÀɸI¾3Pè(Ö±vL‘)äèé÷ ˆ!×Á�‘˜†�zšã‚õC çµ?ŸjYÕ Í¡¿)ùÔ](¥l²ëñ|ýQ¶¦ËC+ %™:ðÕ›�t}K¨oãNçêøaÅ*·™–ëÈkì„°,�Í,Ì{>›Ò穯y¦õô—Ä(õÈx.©o~o»Ý„Ý£•!‹ž¹xÒáÒÐ%Õ'£˜°1I§Œ'ZÒ6¦ËÎ ~ªÓRÒ1mXß“z<¶.1(� kœ«ä&£¼Ö). Š¢ÝåæHd‚ö,Åꨛ€î›˜(~ÂËAùÀ*³\€‘Ðóæ?:…º[ôh*Ô‡J]ö=výVå<é~Øé|]ðuJ-«ƒÇS(ž�Å–^}¡~D{�Ó:W|“ ¿38(—Nñ&³ØJY}T¬Ÿ¥n<]’Ù’Òg%çX7.0§Ì‘ždø‚JwU†[Ÿ ôÇ­NuòãŠefS#êœU5J/ŒíŸÑ^d¶!ƨRš<–³ã•Ù�òõ3³eÛoðò–ˆTUÛ˜ OßQ&ïFS ì²]™8,¥pkàÅt H~¶UOu\°Îë È&Øž„~%7Dâa3‡�è.ŠWh0Œ½n7“ˆÔ§î«f<—4áóäP˺ߢ^ÚÎÔ\œz+t0´9æ;ï@Sz®ëIh­ñ« ‚ÝM/Nv艽|‡­2†qèþÊ#_× ®ò“zѨÓÔ@°ù?óÈÏ£²ýÄÏÒ6‹ÏIî©oÔ MÖT Ò~ÀA: v&ØÆ��+FÌ÷±«q§žædÁ*õ½µ°3|0pöÓY‹è>"¾Äkf7Édˆ@„ø#n"IÑfÑ7^—‘×aàuŠÖŽšõŽt†Þ\µÎ:p£ÈÆ à–ˆØ³ WØ2ë'D�;õ4Çç—cBôñ™A;´ šL®ðÏ$güŒöš‹]°³<’¶L5óï‘—îª¯ŽœŽ£3ÒàF�[ÞÑ!åi©¢´€ ‹—YCE½ž7ogÆMbìM7.g²Ó¹Àþº`ÝŠc"q¢»¡½(@Z'v:<éZp·ŒÓmÂéxÕ{ºq¬Ć ™Y9Ï��I»•œóò‹"ýºU¹’prý*4�ëÛÓÆ­zª×uÝÇNT›îò£�–66 ÿš¯ci–O¨/q;Úô‚�Ú$9ÙÇX£.a奦àwÝçüç0\©[²‰@µX ½lå�~ÒÆÌ^skŒEõŸ3Àq¦ãÚôÄSAY7ê)Nž_å5³Œ@j“:rû1Äé:ËèÚKœN5F½iðä8ËVgûÕ”žFóTª9�Ü:ÚCݤu¼Õx|Žd! » *IlŠiƒÝ3·È�gÙI…)h©wꉎ ÞðþÙt¤ÈÄü„ö¢ ‘Ŭ•‘YbÉè%«ý„ÕƒSèmdø�L6ì$‚‹àÅÉ"ûØ€·¼Éò$Þ(¢æð»Z§ÈWœìÔÓœ,XeuiĉÄhþŽÅ�!ðÂÿ Xùñ5#„Ɇ·HFîî�Býð*Ú÷s&Ì.ƒBg&�V»á@QÓC‹Ÿ‘\Ý*Ê©KØ‹ VÍG�%a“åç²|ÿÀ_[Ìç'KãÓ¤Žâ³gÙ4¨‰oÑ\KèÛbç¥X÷£4Ô&w<îMf@׉ã—ê„�å,Íb“M“H-ŸÎÔ5'£T_ ��û„‚O6·P~X8øyY.¿¿?ö;év¥üÝcç|��‹$W¹©‹drJ׿ÄÎÁ¿{Ô½ŸÙYuóåQiÇÈHáõ„ ÓíÇhOÊfvÚÝõå©–f¼!ž»÷ƒ�×õ=¥çcëIR¦å" ކŸ{âóQÆåd­S\L�úX©Þ THa¥J½Ó x7ÁónvpÍnÆÁ–Ø�¸æUÖWˆŒùÓ÷ÞP\Ù4t;êP�ŽäCvÆ«ÑìzÓ2Ͷê©^W¬gô\10-3P Wnl¹ú€ô¯wF¯ƒfŸIs¸=ÆX]&¬œ;©O‘•ü6R¢€„]-8,O GÚMV7â¤ÿér%Ò¹Q¿qº8ìÓSŸ_>É4Ä08f@[¬ÂòÚkåLém.Q2ÜsF× £óÕã AGGkÔÀX¹"Ÿ0¥>s)%pë Õ,³ŸÂ{&ƒ£Ò�¡÷é)ŽÏ/3:ê“ßž)©Ú›•ñ½p1 ÄøÚkŒ–ó 9’=RNÆü×`#^ì%§»UÖ&Œ \e݇œ+ÇN< rf;SD­WEš­5zŸ‚¸‡µY¶¶�Š+Æ�z’ãóË)¦½P¼¯ûêi¦áXéà¾â<þÊk|–[%Ó¨ÊÌ%DŸA{ÖvÆCåµ}Îç‹ - Ž5 èà¹è[Zö¦bõQr@ïÚ@÷h·¢Æ„Ê‹ Ÿk³';õD'+–«�é¯Ì)Óã€]ȯ~MæÞ}F}̓&JB³ÆÞÜ »w*ïúBxqÛM¸]¯Ü.•ÎAR7ŒQñØ’Šq³‰5Vg�J”ñnÉÚ`¨C XN<ãÔ^0îÔ,kD›UG_f1]û2É^Å»VÉö ñ5�ÈiǾ ÿt´}“u·ƒ‚ÑL´I—¨Ìž ‡–À'x¬]Ì–‹m�ÏsGu™íuîV,n�~”ÀȬ§#Œ÷„Ë"oê?£¾v¸3ÕãÎZ µ}>Úy_±@7áºÛïÿé÷ßÿø»ßüðÓ¹Pÿßüøë_Ýþé—ÿôí?ßgŒëi ETPТõK3ÚæR—¼ËÑ&Ì Žþ(‘´ ±öSêÆ}N$dž9䙼ˆ A{Òü#:¿9YAâ²€Zty?ü¢ö ñ²B Ôxá£D¢*‚ Rèáá¬ÇN»U§SÇé{IÏc`éFhªy m~§3�¡¿ ÓA:ãÑ[â¾Èt� óºþa7ÛéNox6,sXŒÓ$ÃV&hÄ'Æ(½Kx�»¢&º2md…¥2­Ê œíÌÜï®Ì•hÓ)!ÿ˜{¼‰Òœ�Ü}JÌu‘‰ä@ ò†Îm ¤ Wú€ò¸Õ�àäáeîzÏØl†�Óm™g¥ß$¼ÈÝäe1fÎ9¢Ž*!ÖGp5ÚÑÍWîþ|殬A¬›ïB•¤u±È°ðˆùCú²·P©DMYžÚÊB›®/§NûÉNwzã³oœ\IÚÀ>ú<=¹oÑ]=¸²Y$•‘ëŒ~À†yN­•ûcË™±ß_‹{c@si —M$¨%Ú<è43ßlLµ~8)9ùÉŠ )?ë¿ô¸Ó�Üðè‡ÖÒýz‘RæöM†êÙ÷¨®±Õ0Gè›Ø i |åý…š-¦ˆ¯þ$k»zþ“RKt&0†–,‚3ôr& ”�ü,úo@1�U‘Û¶#qûþ›q§3”ÿ°b•ÅÀ”4WøÊ01ÝôÞ!ÐÙý„ú«�"ØAȦ³q'3„‹ÙuQLŸGfû+³=urf@äo M!nåÌŠ†5w‹’44È[Âͪ!6Jd+ƒ' îÉN'<ÿqź  ʹ›µ.ÕšgÈËŸP_žòrF1C±Ó Vgàux­»Ñl\'Q d¯³�„RËÅIÑÀÙXóv@wƒ7Š, ½]±è®;õ4Çç×Õ�´œÞµ¤.c'óèß§¼¬ï*ƒ ­Šà­8è;_.åþ=—1ïâæ D÷°èr–À¤q½© FUÈ.5zÎtž¤[îh�ç±a¶QOs²b™Í‘ TRbêh:}D|‘Ó od—UÝ"¨0 ±¼0ÕääÃê6°ú¨ö?[oúMDfŠó Š¥·:e;5E—•ëgÀÿf¢:�\?€u²UOu²â N_D^`’鉌ÏL¸÷©¯žk3*b¦˜_ü˜”%V}ß)³ýù\‡Ê馯šs4Ì~æWÊS%Pž)nÔÇ´yËv&Û({„øo,=0�›íÔ¬²Ú›­8VÕU»B€Ä¾f4„ÿûÄ×8™»˜…OšµÅw½äSÄj7²z°@€ÛiÈ]“T¨—Ü“ ´KçœÕ£!©µõFm “mª!‚� å»Q*“�z¢“ëÇz—å.©F˜FJfsxA)¤�h¯ªD’VY ˜ƒ_HuðG¤cr8Lƒ–š»UaÊÄyÍ› “ idõäLû�¡ÎÍæÀ²Iñ&ªîÀž¡wQÚ`ÓÁÿFßÇSÇQÐói²AOêùØú+}ÄWl9Œã°Ö).ºÜß�¡Z£MS¥T#t%¼¥ÂË<ðòh8 b¬MPÍ£õxYn)¦�Él6Ê�ê W”˜tŠƒ”o ¦9µõ$Çç—nÀíÐíº‹¼G å•�²nƒ÷i/ºÛÜ+#StHMlÑÅ—0uW.‡4F66y7�™±u¸eß—IæÒ 2éÐØÔãÖÖXf‡!i\ÞÓy>µÊQý'bŸ[ÄÝ´fàüäY "h‘âqÀp¶ê‘wÙ}7xFrNÖ�“qðµÙºTçÃM7p3 NšôSeÆŠf“õF7Ú†‰¥“àölaVneü#XôQ¢Ë�üáq§žè¸à�S+˽%PBÃÎg§ömÚ«ŒæêHí@¿dk¥’õóBƒq¨­èGN^ øtWgšVž]N)?Â9^ô@ >Dò=2Â3ãöö\Ïö†�ÎÍÂUN˦,¨÷]Æ&á?¡½¨Öv;­¼|1+Âê|BËäp #£Ë•Ñ`ÚÐ@2Ñ~ôy3,L°›TðŠŠTæÆ€D|žÙå@ÕÇ~žMšlÔ“œ,X>Ñ2"Ž.©!w̽H�Í@¯ÏÄí°�D=c…9}¤|¸LϺs©x8=ºiiâ;èЂŠY1ä{ÃÚ‚ KÒNò�À=‘»)É�¾²ògOço?Ùª§:¬xÇ!ääÙ†Q;uˆß¦½êYìÄAmš{îÇ«›ö(ð?±:S¸™)¤ß%‘¢µF&aÉtÌZúÀO)—Öý‰]]2ûr²COìõàzLçÞtT�·­ù’Ð ã ¸·h.Êc½;2QÁ- 4Ð߃` Í#Cãà«E}}¦FXý<.æ�‡í(²ôžN&NS¿52qtxetÈ¿mÒÁ»;ª•1€‰dÀ84Г÷ÛºØ(fÚ·àz5á'[õD' Þ)>¡“RâNzÛfUΊOÞ%¾^€"+�!×»Y>.Ö‘Óùê\Т·Ñ8º!ˆ‰rËÀÏ÷ ö$¼nÕðǘ“ Ò6CÛ}ƒ¥OÙŽ[õD' –9�(=“±­Ÿ/ϱŽ�ÖOh/ŠZ,}Z8­œÅ 'R7&‚¼±�œÌà�ÁøÕ{_h)ä-KäHd Ý{Ù•[h†,lÚü3]lب'y}þ�m#_ªk™FM¦XÝ3úçò¤W«SD fëÎE¡ÒšGGU*ØiŸ²ùâME¾=SPj“ cæz`ûæÆü«zó^–á®/�]–o.Þ ¤ÉF=ÉÉ‚õêªFÈðÞà5S'ÌwŸøjq “©`‰áxèÚ´Ra,{8¹‘ÓõÊiéPŽ2c6ä%"ˆhЖ·[JÏ‘}iÔP0 dCÐ ÂHc N{À�q«žèdÁPBš±-Tÿ|A¾KzYâp«œN6i8)¿ò«E&?°ù¨Î¿ÔQëÜ(r;”8µ3УP-#{‘0AÀš†˜ëIô MÃF=Éëóî��v�ê ½x eRs̗؃MTÈÈÒG›^*_Ñ;uûéŸþù—¿ýá?žËñÿñ»Ÿ¾þæöÃ7ßüøO2/-/ßSä©/½É tX;142íôÞèÞ±žÇhÈ w€qÝé%7†}N$Çü0ôùN�Æü6ÿ( t3µ1 6$Å\Ðg…±Ám¾O;ÑèvƒD¤>{þ}$ņñ�1‚� ™ôDVAø¼¿ø|¯É?qX6~É]‹Π3•ƒ×—Ú�F%WÍÊ+à…gæb„£ù—˜r'ðâl§Çü‚ëÃy™¿6˜–²ÈLƒm¢@¦ôsJŒØù.Ý5Þîˆspè3`xWþ+ðuN¬ýîÂZ"¯Ò½Œ´§±ðÉù¸5Ê9J•‘ªúÖvŒÀZH´Óx<ÿ½oDžìt§7yx™µ…*CZpõì >Cóä¶ß£»ÈZº:(ŒÌLºhu¬íI€Ÿ9ûó™³Rjò1¤‘«òØ ÐŸÎ$Z$ä ycªRŒ‡$,VnA@ê'SŽ{=&Œ¯[�U@ç(4¸¦ëë]º‹¼¥$¼…0'LfvÓwx‚ö’ן˜ûý…¹…6ÀÊ\mªìØØVåÈäVæ—`!ˆäFêåFñQ ~BÄwz6\]e,g0PýP˜¯�h¸}jƒòÙE¾Jµ0ö¦讄®ZÒÿ+rx_»:üž¹AÎKa†g å/Óœ†u‰¿\A,ÑÛ (æÌµ‹4"DfmJD´¶íd£žäøüòɶºÑwÚV†”ï”WE®£¬ÞFÈ&TÈÏq®VLv“ý`5Øè‰ÈHé�“å<ÅÚ- t×Í3p£E‡ð·öÂm‹'+>Ͷê©NV¬‹"ÃÞªÌè‹ëv?"¾¬ÞÁØ,ЈêT½%?°: çYʡ٠B�J¾@�´L�#½@RÅœ‰$2çà+Ëð¤Ö2MÖ÷”ž�­Ÿ^æS1j ‹Ô3½¡´WºÙl´Jq•“»ÍÎ#iµ[áâ�ÃÈpeäQcb$ƒË6 ­‚_V[ ü7ÊE‘]*Ó½(ð�A àø%±1D›�—'€‡4Ûª§:Y±Î^öJä¬Ù v�@"ØO9?"¾ÊiÏÜ\©ÑÝš÷'Ájx¯¼>*ìϼ¦<²‘€ìµ6CʴδH³�74Ù ’}L"¾YJ†‰˜‘á�¯xĸSOs|þ FË�‘¥ÔlRš2ú]ÒËl—-*Ç”ÍiÆfÑuŽä‹¥m¬ ŸVP <Ðð]*ÃK�øŒ³Á™òÉ‚mÙOà›íÔ½.¨ïh;ú>¿g@u'ÚîmÒËê®d®Îàðæê.|mŠ µ 8³,Jgw0Ø(ˆ ” ¡4ÉO˜Ô� øÑ­TàòÓ¸º'óxè ù˼VpµõK€½˜Èß%zËLšmüéE}�‰e`â¨Èä¶ë=Âh¢û ñËhÙh•ž‰8€›b²“®j$n Â1™¬ï)½ž{CÈõÎ@Îq‘ÃT¬’\°º±Ø(Éð%[¯Ìß|‘½êÜN%Xp$éŒ8Cº¦ÞÑF¡’qsØ §õ|î nb·b yë6åæ*Éen2kóª0ðí Ülgn> à{nfZ“)kÏ)Ó¼ØnÑ%ú~=�Ì7�·æ*0â¢ÈDÌbQdÚú:C›»#ù¹9Ù©':,èŽ2Ž*£�ýü#ÚZÐp'~lký„øªx LÆ }¿•[%uôjN¦Ò/- ΃ǔۚ#j[©{�§�õ‡`ÑJÊ%§KY<õj6ȾB ÅyÄâ°SOs²`�ÑúíÚ³ÚÌC…¹ }B{•Ï g •Á8Ù€m#éû§‘9Ñåâ¤=ŠáORçW†:H“Ñað')ü¤µ"ÑßȰ½¶5’S Ú/-€–ôqçq£ó�aÁ*›)øw¼¾R  w¨ý„ø"ŸmHi6°®ÈŽß#ä—É%«\p£ã ¤iÍ�•NÃÓž‚×dm&�äöQ^´ÛQ)‘,ß\Ûi¾Ô°MOðú|}ClÈèx$í̶�¬cýÂÛ´—kÊqXÈ5MkŠx<ºnô„mVdâÃʼñ\³š1g�(nŽÎÉ �7ƱéøÁD–SßÛ°QOs\°lºáZU@ìwÅô¾³ÿ„ö"—±Ê×¥úv¿†aGbsØœ¯î†#B�úþÿ9;³äBˆ^ÈE…aÜÿbé'oÌÀžß”A‰LÐB«;W�ï4‰TZÐÕ£K`¤ëÇvhë}<Up8z rê'M€ÅV'˜þ¼bÚ€ð.Nå[ò,‹qËø¦«kt?ÀGõo¼Åï½áI²åÉÕsÂ�¸mÔRœÿ˜‰ ^+ÍzRšJ-6Ó—!‚Þ½õ@âwä‘„nÚk4»X±ÿøžAs¨Kp_çÅ8Æã» sÈl)NÍ3Ѹº¬\}9ÕI®t|‚<u©B¸…Ê ªB|srf’uzu†lZ“ló0ä`«�F£‹ÛŽVò£#!“쮕¦å !W¡Znß½¥;ô¾F“¼ô<Ã× ˜°«ŸÛìç|D¦üI”!®³@ÉŸdz L�™A÷\©HˆTxî±Ñ²Øj´:-øáD£ˆ”(›J?jÓàdó¯€dŠ%·¬o{º©të>þ‚pƬé,_ÛÕ×Oìüù­’ЦX£„‘Á€d;à¶ îPJÁÎY�¦Ü•¯‘“·ܼx4óüÌöm¬ä: ]ø×/ÛŠ�{æö=?>Ú Ê§œhÇt¢Þ°ÏP×&–ëa¥�¬&(ꨕàíï)ô.3­kÐ[°ÝfeùúëYõ»ô›Ž„Îñ¼Áhêó±m?F^×eÃ3FDI‰ß{ó‹»¡Œ’«¨yu¥XUJº6IJö~Še°�„šªÒÈ仫¤Ë *kKÚƒW¯‚@w|nðÖ&—Hã>˜�f>Ûoû:^ ÁóÂ,ǪvÛµ¸Ýì-ˆ852:Z¼Oüÿÿzv¾¸±mhcflurry-2.3.6/test/data/master_released_class1_presentation_highscore_rows_metadata.json000066400000000000000000000014731525677230600325070ustar00rootroot00000000000000{ "allele_count": 35, "context_count": 9, "high_score_threshold": 0.9, "low_score_stats": { "pres_with_presentation_score": { "context_count": 9, "contexts_with_low_allele": 9, "low_score_threshold": 0.2 }, "pres_without_presentation_score": { "context_count": 9, "contexts_with_low_allele": 9, "low_score_threshold": 0.2 } }, "low_score_threshold": 0.2, "presentation_internal_affinity_provenance": "generated on Thu Jun 11 13:31:45 2020", "presentation_provenance": "generated on Thu Jun 11 13:37:18 2020", "release": "2.2.0", "row_count": 315, "score_columns": [ "pres_with_presentation_score", "pres_without_presentation_score" ], "source_tf_predictions_csv": "/private/tmp/mhcflurry-cross-allele-1000-randflanks/tf_predictions.csv.gz" }mhcflurry-2.3.6/test/data/multiallelic.benchmark.small.csv.bz2000066400000000000000000111017571525677230600244100ustar00rootroot00000000000000BZh91AY&SY‚HÚ¾ÝÅ_€ø@ÿð?ÿÿà¯oLc‰ð((»Ö¾æ¨©öõÔ÷[”\ç¸]Ú×v»d9v  ¶… ´vÔª € (øtt÷}àð”@¡U (@(ªQAAJ% {ÓìÄŠ WÝ–Ô:®*¬Zh§>½çµ‘D€ë.Ú*¶VI³*­³]p¬›®Ì44 â„kCC9»µlͲ‰iÜt:RЦRÓ'Gvcd®¹]·puUEÛ¶ lJÐ\ѡ*ª)›`›¢:Ŧ·¾î|ß4¶VµU2­ÖHAW»ÞB=KMZÛRöîÈ©Mî—.›­ÖŠíÝM¶Gk4t¦²Öš‰$%4Ém½†Š’äÉ[ M˜„J)ªÄ«mIØvÊ�T—m@=wd­,Ùj"¶ÓT×nÚÙ®öè‘í¢¢TÖ­µI{5Ói[wTEØÔ¢;n¶ÙV�¶²�U&Ýu«»Š"1ÓEÝœ¸ÃT3»ƒ³ª»*6µ²—m[)®†‹fì³ *®Ý:fÝ®ºu]˜‹¦R¢„ëEVÙkU¶Ö›¶íÝ�ÕC¬wŽØª-¶ll2*D¨hÉk,˜rn™�¹¬(ôÕI5 ½hVÝtÓQ4ÆŒ´Ô«vá$-�p)kwjíg»»Kh+f¨ÕdD¥·»\µ+0Ñm­dÜÀ»%BBè÷e]™¢–Ê…¡½‡ThÛ2U3»Š5¥.Å´Ùl•ÐwY¤©4Ò� J­-Žšªš4…*¥MÞÞõ=iJ�«M´©FÙ¡‡­J{á¾ñ„�öê(}Üѡ풉nܪíÝ‘iŽÀÎŒ²Š´nÚjmˆ*M¶YM•¤VÍB;t8³PÑ6˶ƒf«­Û»%J©³lY–ÃI%H©…”i”�ÙÅ-™§mÖ±·wv´³U[mjíŽÊÒ�W@ÝÓ½·mV¶±IìÍvêêHIÝœ³ShµY5Î:횪%³2ÒŒº§4Â"K­URH‰]Û›™Ýb(ÚŠÖ°´ºVJ‡­EÛtŶ‰:ÎíÕ)!EP¢’颡ÓPiËlNëÕ´’"*‚ëR­µ)RQ¦ÕY’•±šÉ,Ø„·uS°Ý4Ø5Ö’‰Û6eB�EE³½½ímuÎ1EëJ kVµM�¹T‰U@ìjв֖զ‰P•´Þžö¤·³ª$@µªA£"( –´U³NÚì˜a]»Ží.Úª 6§Nª¶•Ù”‘SÊç^àôÖ¶ÛU,¶öˆºCw;ƒs¦·eÕ$,•š�×X÷»¢®Ý]Z©Üèí-�«D¢®ÀÊAUTÓUìÞ´¦Ú• R¯-.–³UJRdÑZÖî9Nµ³T…5›d…UÛ:u»wYÆÆµ»U²¨Ø5le݃šÔ«lVwumëÞÓ;¹'lÚe½uJ«¦ºjëD[:éEÕµîw½ŽnÙÕÖ’‡Z¨›b­šVÙsº¥T•YššbP¶ªj6Í2­¦Û²Ö›¸èãF„逮Ì«[Y¡6VšvÁvärªîîdë­d�¶Øˆbhµ�³)U¬—nÝs*¢J!@{j<™­)J¶� ©­›Ùs�;¬:¯]ÎæT©¥ÖØÅèU"uªµµ®Û¦§FìÒ-†Bº³P¥ØÚÒ¥Qk Ód-ÕkF¨¡kfíÝWCDs5Vl•kEZÂH¨–›`Ý´Gkji€ŽŽª�R�§vëLvÕUS£]š^²»ÝÅÝÝÖ-¶›JK¦ëZ çV—mUSZÚµìÓ³HkU¢4Â4ÐE[eëu­Žæº$Ái·gH«¬dݰïnWL¨–š­{†.”4J­™RM²6ˆ–°»Úö= ’kRU)$¥VÌÒíÀ¤©ë"M²=VÓe¬Ù˜«-”U]«‹¡mšÐ”$›¡[d 'fí«¶‘¢î»·Òk[etj�†4¬fª…+¦ŠìÊh%GZK[l%7fÚŽŠ.´„P‚.ŽìM[jF·­UE]†£ONE+¶R²’„Ú´ôÞš{bPª¬†´5ØÖ›«1!¶«lTwn‹³[h§XMš Rš5Ðë’•š@!ûÌ=J–ÆŽçvÃJ¡*�j¥R"@ºevÐu…Ã() ÚA­$ ªMw¢*Ÿà€ "E5Ÿ¡¥ÐEOÂ0A)I©©¦€ŠŸ€RªCõOPÈhhLÈ(‰SÕOõSô 42&€jy4%)SÒz›I iµ3Sdm < “Õ$•�šx(b¤Ðd¨ô@ìÿ×û�û@ÿBsÿ�ÒŸêuþÃH‚ó!:Ú—÷ýÿª·ÈÇúÞ·#YTvBÖXhõ”&¬!%]ÄÞZ»kØ^„âªEÕÍëwÿ}ö6›ÕcG;q«9)˜2Bh(í]hD¸&eî …p’lfÁž ¡«h™pž�j¾ˆ6а¼'3U§°ÿ|î‚’IW#zkÙ@¸R¡µ šàQ…Œ�D‘ÅC B=>¥ñ$"°èÔÞ)J>kœ4š�@Eïx0ˆ¥*@ @¨˜ŠzªI ¤²‚M)@LOmo››T[~kmÿý?ð„Á×zröîí̽׽ݔïw«ÎÝÕ×wAÔ÷³®”¹qغíî÷ÝôÆó¡N‡;¨\uïwß}ÞÝ÷|�÷½„¥xïw¸çWur3½è�Ù½Ç-|åÎóïu뮘R÷Ýå»»ïo»ÍÏ÷½ÞëÝ˺åÇÝw¡wKŽÓ®wuÓœ�½óï»»7'9w]ÀáÒdSŸw¼rqÝ{º÷w>îzîîmÐÜ»º¼ûç}w]çnçW|èÈIIf|ù�w™wguç^{Þ½s¸—WnIrî½×xéϽ޻®»§×»Ý»´ƒ»�½å!|¯.÷Ïæö÷_zí^‘ÝÝuÂbîînL4¯:»ºòã»»­ßwzç>]yÞ{ÜóxMž^v½t•É.s—¹×7¹ÏuÞ¾÷¾î…÷ÝËÝp¾õï{¼——½ïK¸]ÏzóiçNuνÜõÒï�÷såó›åóÈçCº¹ÍÅ9vI¯sÛ×}ïŸuÉ÷u=ܾîYçÎ�K»Þè½ÝsǾ{îû׎ï{|ñww¾÷®\ž÷]/wtãºùÒ<—w:+¾÷{»Þöós{§»Ú÷]îŠîîë¼óÝÕÒ뻞c½Ó3½ëtƒ®¹çvó×zóÝtsnêvåÞëÞéq%w;˜òïuÔó—»ï{¯•ìh=Ý/wwkËØ½×½Ý¸q̹Ǟ»Þ>oùìæu¸Bs²9>v’=Üvû¼½w9Ù˺qÎw^½Ýº.íuÙ ºäº÷uë×Îöã¹¢'-Û›ß^ûëÞíz}÷¢½{Ý®Ÿ7½ÄîçJîë½îö»¥ß.ž®ï…Ø÷S»šäQÍܺç]Ü»®»§v_w½Û�pîê÷Ýñw;®í÷½ïo] s®›¢]ÝÇΞçw/ø÷‡ŽnBîüºõÔ;]s¥Ïw¡9sÙ'7]w{ÞõÝËÞ÷{Ľ®\ÛÎ.ýëï}è×IÞ÷.˜ïw4…邹qÝ{®{ºO.¾í×Ïœ§wß|õ÷ºô‡½xžçgw7..îß{Þ{®ï{»Þ^÷�ç Óvîîî<ító¯wk»¯:W¦æçe9w—7ßsÝw_{§Ž;§<÷ŽfùóÃæë»ïyäLuÙuÝ×>n/rî^éã×»ËÝ''G]Ó¸¹vIÝÓÞº y¤»¯»ÞPä÷]½Ó—|èûë¼Ü/½åëÝÚó™w]Îî÷»y;ÝØ½ïuèïuÏM:î@»º÷nž=ÞO{¯O{Ýë®u{ÞÞ†:9.�É{¹ïº÷»»¸!¥ÝÆî×]Ñ:]ts®ùïvíǽw¹»ÝÛÉÝîñïtç¹ìuæÞxwÝîuã›»—{®=Üçwnˆ»Þõy»œ9gœK˾/zäå×¹ïyÝEÉ Û¹pŸw}×Þ÷®½Û»º÷¹{Þé+�ï.ÞðóÇyïwÞ¾û§Î£]Îì‰fåß/zûÝ{¸�Òà�Ü-Üw.Œ÷n|îï¼ëÝïÎ9Ó—º¸ò÷�½÷½íÀ%í×9Ï; åÔîäçuÐéïsÍï]ywyëï}ðúî]½w\å盯>÷>vWNR9÷®÷>õé{¾ûžûÒï½ï9�Ø�Ouáw½î;®3Þïïz÷A×;{½êû®Þo§‹ÜZòò÷¾ë‹ë’åÎÝØï9çg»ÓÜ»}÷Bo¥Ã>uu×ûªûÛ¼åçWuÝ�( »÷^ïzåéÝuãÝtQë£su×c»�/KÎÝÒ\Ü®S"ìì{Ýêîéóヒå|÷ìùïuÔ_:÷.é:ï‡xâç=ë¯yîöñN½ëÓ�9Ó»q÷^û¾G¹ïyé¾÷=Ü›¦èv;®¼ºþ5«¯ß·WÝ.òç¥åï]ÎçwqÓr‹�?w½òëÜîã\êëËÈžuÝuݺ>÷Þëî�ÑνÝ#Þöæ/sÞ¹}ß]ÝÝÓ‡]¹’eÂú÷½É‘�$n½7{»¾÷µîë»é<îîß=|ø^ sËÎnò4{t÷¹.åÉ}Üõó×°î盯v÷z÷�{»»®÷¼î�Î9]ß9�d‹º`HE$$ �“’DQ½êézû·Iîùǹïy{®Kî»Ý×w. ;«¢÷zz÷�ëÞ÷»¯{våî÷wg»º'Hç;®åw8»½×Žëž�2\îWQºãt}Ü]Þ^1s¾z÷;wr›Ý¸û¯0£€h‹º¡t’bÜ&"ˆdÌrÈ®\/»ç‰œ¾y÷o¼çžù}0Þ:çÞäòœ÷¸x÷z{ºï{Ǽõ뛂W:î釗.÷w¯{»®7}ÕwºÇ{¸^½Ý÷¾÷Ý×].Dr_zöôãws}Þ½wwÝêñÞï=w\Ýs{%}Ýîº]ÝÆè—RéÝ÷{ÎkŽë¯�î'}îœÞ½ÕË·;íÎë¨4É.}÷×ÝÜù\{½îã—_9y¾^z—»Ïw;åÏŽíôž÷›�>ï§ËíÝáóãÛ®u×}Þr÷»Î½Æ9N½í×—}î�w>ë’{¹|ÝyÝß9åÝÙÝÙî¸÷u÷w¹./w½rùÜÉÐyÑw¼õÞeï{ÛÝ]BG{µËÒy>÷ß}zK°ˆÝrêû®7€¯}íçÏ)÷^_wu:çÞç1ïw%ë�y÷Ü^�{¾÷Bó£íØœû³·¼÷W½Ó»®»žëçÏ®º'{ÎíéwÝÞ»Îiëï}÷|wq7C;—.»®ÜìÜtºwgk«·twp Ì硊óu —;½ëžçHºèŸw/Ÿ'·qÝ×½è¯wN’qÎâ;¹×3¸uÝ»“Ý8Þºõݽît‹ŽàžêëÝË®ë¾÷¤¤“&„»çß__uöùï®Å÷¯{r®÷tÇÞ÷¥Ý9w ò÷^õæºç<¹žçvç8æï9�Ù÷½I}Ü›¾÷‘åÕÊï<Þ¹÷uï½Å÷¾ñw_zêwy7�çs‘‹Ñºë§Lîó{Òu{º�¾ï^é^ïyßw¯]vë—'uu|Ü÷quÝËžv÷9Û®;Ÿ}ïW¾ï À÷w:w·z{·§·8†=ëÓÛ¹ÝÓ·{¾÷}çx“�ϧ‹ï»Ëî«›{»»£O'y�å×½ëÇÝ|½Ý¹¾os½»®ö÷z^ó×»ïk×»…ÇÞð}îùò@nçrçÎz}×vîn^ržº/=î˽»ÝÜ®äƒs½Üï{¼÷x½ÝÝÎÝ;º]ï\7œé9r÷WG�ÎŒuîç�\Ý×%ß{Ëw^öñë¯/suç^ï{Ïs¯uÓ×s˸q½Ü÷w]{»×K¥Î—tºëÝsž÷yïW•åÏ3×§o\ÝïsÛÇݽïw¥î쓺íΛ³îç®tåúµ]µµj¿ë«JÛZþ-¶Íµª×ÛjÓZ­­ÿ]k[5­µÌ"È,@cHÈ’!a4”e5˜2HˆÓ$H…"”e2•I1„H‚�1„&m2R&"M&DÆU­–U´­©m´Ûj•ZVÛ5ke¬ÖµKmkDdÄ& FC°2ˆ“CL”)Ɖˆdb$„fF¢dd°ÀI±‰(€$ÕjͶmVʪ¦Ûk5­køÛjšÛWkUifÚ«MµM«iªê×[VÚí²µ­•[}kmnªßû*³mZÞÖÖ¥­¶m·Õ­l­ZºÛZ²¶Ö•UK[SjÕ}m¶êÛ–1Q¢,h½Ú�“EŠ¢,EHXÓ)+F E¨65‘C3Z¦ÛWm´­V›m«Õuª[[Ö«­¶ÞÛU™­^Õuµk{m¯mkª«omª[mžØ¤¢F¢1d6 $’ÆQ(ˆÄl’ Œ…’�F€!(±’…DL˜Æ4f˜cX„„£†6��D4Ìl„ELÉ&ɲb�"Qˆ© ¨CA’5%²RQ`Æz«TÕ*ª¿mµ^¾Í±Š1$V #DͨÑhØŠ0TËE˜`„‚¦ÖÚ¥t $‰$H”db HšHÌSMÀà %’‚Æf�€ �)0‚HDфؙKd�È@ÏZÚ·µª�Ý£–ç1¹3h.î‰..uÃg]t¹·Ü:Ní;¹wK®›”ìë»­rîéwâ¸]×;®rÜásp»�s hã“tEK¹ÇrèN�]�×9×\Žé74îæ.)œ×d;·\äë±b'7t¹·wh�×+‘wtîºì»W+�Ý�Ý AM#]9‹×`»»s¹Ù4�ÝÎdŠë»\Æ‚.w8I»Ž9±nr¹pº[œçM£»uÍÌf�\å·.wvÇ Ãã¡qºê+¤F»#˜]×a®Wî¹ —w]Ûp©•Üêçnwv�Æî»ëºWw\ç-ÍÇn, ÕTÛG#é¸Ü¸—uÈ…w.îÀ"n]s¡whqºκî�:uØu×"¹1ÄD —(¹Ò κîíÐʤœÜîèíÎåräé×GNwmÍrGnGw0ë­Ã»t;»v8;·$î;¶LwqΈîå¶Û¹²hbLLÌ™˜@:¶ÕrEèw.XŠ$9ÊNîSrÝçIçÕ&ç5Ý»�½ÝÑåË�ºçž™‘ówwW.×uÄÂ/{»Õååw^o6õÜÃÝvÒ^íËη{³Ýîïw:óN‘×ENë�»¹/ÜÜÄDëÞÝîÇs«�ݲîäyåæ ÀpÜwrȉ˳#»‘»;’^îžPò»Ý®œ�ÕÎÝ;wr0;º“�<�¼½œèw]î’÷t®îØ9{ÝzkÞëÒì ÷w½×=DS»§]»½ïítŠst^yé:ê�Û»¡»º.NÆõÝŠôu×7—§woK½î÷pé7JåtÎ�»»uåÙˆa{«¤”‘eë½îÝÝ“•ïuÝÆ÷]Šåç¯uï]yv÷{×;ºDyæò»³¹rç{½HI]ZÖößΙŒb @$Q‰4f�™„4ÈI € f‘�)J4dPY@lI‚ f”¢3M,C LR"ȤÆ@Ä’"*JdD abF"C(€ÉˆJ°Ã4š˜Ìƒ!“ ›µçÒ}ÕæÞGœÕæ¸^÷ïîîéå½*å”îëÞëÌy¹{®½ÞõÞÜ{»Ów»ÝÔŽíºš"óÐw½yÊóW/{ªó®i9¢+Ýîö÷gžÜ9=Ü®nW;Ý‹Ï{¸y¼ŠóËzUÝwœŒsÈï{×½ÓÜyyyí×w½zä÷mæ­[Öµ–­[Ë!²Ñ&d7Ý\·7¥Ôƒ»�Åç= ù_1çÍ7<æï»›Þï—¯v¹îwÃçËÒô¼Œ§Ýr]¢âî’J_w>÷9óÕô¼åßw�åß{ß/Ÿ+îï'|ç­¯�ÝØ»º¾w»ï_5ÞtwGÎF-÷]“^sÞëy±¤¯—ͼ³»Ëßv½÷Otîùs|ô×¾ãçÃl{Ýá·ÝvÜ××—_{çϼ¼¹z÷8>sy>良ÞoŸ7/MÎû¶ùç¾ëË™Ýo§³kÞûëíñï^»»–ûÝO®®YÝÈ‹¯uÏ—}Û|áËé^ïzóäû½!….ºç›¤¾�}÷Þ¼‹›�uó{îÑ\¼u¯˜Œ\Þ—6ô÷·;¹î¾½Q¾îòO7žîéÝrû¹÷½SÎù·¥w{ѹõÜËï½÷Û^^»¹îí|ܹÞêç»®û£|Þ=ÝîÝ}Ý=Û»µîê7˾âcÝ]{¯ž—�÷W½ÆåÝv½÷T_Kå×§$;®]%Çg—zî‹wt¹^r¼¡÷[Ï(¢£í÷º’·7Íäo9G—^ëïqwvù]÷Þ¼ÐËßqé ¯w|׌ !’gdÈ—*�$(Éå2 ÌYÑ!—½¯¾ï¾…së¾õÃåóÓ}Ø·.\åu·ó­UÖ«ÚÛÖµ\L•É �m³–å®Xçé¹nk™. Šdƒ¦ä™ÝŠ.·9\Š‹%guÍ›b‡u\ÕÊÙ(آƳ�L £œ´sœ¹n:ê ¥ÝÙn\\ºB‹wuÝ!w]snhç#r¹ÍÊÉmQ¢ÄnîåÓ››Ní»4T»­sQDXÚ5Œ‘«—M!Š6wså2E‰(é\¬é\±®krÝÝ®n•ŽkqÝrܹl§uÍDtµËÍÈÖHNíË'u�rJ31rér¹nUÊÆšÚÒÕ´¶«v¶µÍlZ‹mdÀÃA4ReŒD£™€Ä‰�3„îºspî7]w]θ�ÒÛ‘N'�Üîë:W75tåsœ�ÉÈn[®íq'tIݺN»qýöÖ¶Õÿn¶ÚËm[V[m›me¶«RÚ´Ûj–Ûj©µ¶«Uÿmmm¨’Òd‹HEF´mRµim¬Ö­-V¶kjëkRÛZ¶íªÛf­Y¶µTÕjj¶³Z¶UU]ªÕ¶•m[+jµ–ªÛ[5¶ª–µÙÿeþS®ä®ã�Ó»ºçwl�ÉΚèá&éÎËÛ�ºé.érçÉ®ç:t“¥ÎéC�§uÝKŽîvìŽî]Ø»s�\Ó·.Žu:áÉÎw.ìÝ7wv;˜;º•Ó®œât‹·rìêuÝ×wÎ]Ýwr·~7ÿ»YÖ!vÿXÁ/ý ç9ŸIõËõ?ä�•iÝÓcª°¥ùÿ^€Ã+ÿpxܾÞ¯Í7âiZ½Èå%uÀ@Î?௭¼T›cÿO÷úgoãõp/À) [ù¹ÿ,bÎl‹9˜î~Y þpßþ)µ<`�]Yßu®—?àr{P#´ªÐ°¯þ .\¿�®-"¦™dëÿTÅ“ ¢È°ã¯ãŸšÙöÇý;CUV:÷ |þaôÊĨkü*œ­c *ÿÔ[ïüéÓ¢U7þhµ†aV¤lq�ýn69ý&�c˜Z7ª’–EœjTnÁZSú#9í®q�:ˆ8j9v¡Ap)=+êƒRÑl^îåb7® ]hŠþ1Ú[fU£ÕÞâoÃ%ÅqnvÑœ��ìÃÚØE­S«R­KX¯qžÊbÏ“Ìp°mE ;Tã P0ihv0½é™-Ys"e� »d„ÌËä C½{y»?Öžë‚*Î&±Q†uQOù:Ó YÇXÐî9)V•ËÓ݇°…®c›åX±Ú-Cº½í’ÝõœQ&`t–ÛÚÐõMÕ7¢·a‰ººæ)­N³½Áµ—›ŠH=Ó ªþs˜9t�[MN�†: �ñ†ØfŒ{®TÐyñ8=ìì>–=}ý¥… ?é,–ß·7{\m¥À�u]e�*¶Ü.*2Ô2X¡5ºÝj_gf?±»ÿ¼Kónª�˜«½ßÂÝ¿ð_ž’¹ÑvÇuM*l7È']�Æ¢±SlÌêo­ÙíI¼/ä­.Ç“…kÞ³hÃ5�¤²ð½ÎC-²ò›!�Èšê�sÄ[«g î˜+ܬõ~t½|÷”µ6…á°> ùáyÈ,\Å€“-´Õ¥×x0ÒXœbi¸¯àÐHÜžýM†­T/–Jÿf4'k½ßJrL´1mšÞ©a¾SN¨å¡ Û`SeXîØ©å›ý(N¢Y/¨å…wn¦ðí™k›O&—ü,ýj?7ØéÁ8ãOË¢zª”W¶.ÀÕ• 7Žxc÷„±ƒÿ=V×K‡sÓ+ßévú~åÿéo£Zœ_<6ÇÆ[ سáQÉVÕˆ£õ&2�‡ùÖ8Ë P¹ÿ?>ίˆÂ;v»ÜÈU¿’X±p¶¡¬c¥xDä˜dÂ/ÿ4×Vè—ß ¦µ©Ûî&ËÐ `8Ú½Ëì{®Q „úï¦Ë"Ös01ð½�¹{eaJú ^ˆŸ <œ #£  �ª±aÙ‰ñ3âÖ‹-IXÂЈ†ˆæ–›ò¨ÉVÕšbÛçüާ±!ûAš@YÁ/~uÀcÍrð-§ûxÔŠÙ_ç{!²!]ä�!è~{¹`[kqî”îçxþ·)� ñ4wºˆK&WMè´Eöí®w¥F·–¨Œå²ÃÅ®5Ø-#QÕ5Þ¿›KîûÃ|–ª‹§÷9{ÿå¨ 4à3‰ƒöšå••Ÿ³1T ›'CØ¡‘om`:D¼Ì†. ,[õdÂøöén‡X�‡Gj¡0õ^vc1tœÿʵý¶Î¥´ýf[^®¾ aÅb 0 ®¾cïä�裤+®/Þ�ÙÎÓ¢�²O*ÂÞþºB»‹+ìoÜóïòùZ(Ø&ü~mعRbnù#ò²¨ œ𩙏gvC5 BDϳ�áØ#§I`,– ÆüçÚ¤—°ì§„;оZtk%Yßx#Ãg¸¶4�ÌâbÙ¶à0‡ÿ8*Ü9„s'ÑÏ'iÑÏc°ÚçáXÒ "Îxç\ú¯™Ó‘ïëdè�·Îûe�ˆ,îÈŠ¶Ysröpæú…7:TÞÀÎÔF‡•¢$>–¤ Í´¾T¹¬[ ì‚÷ùN>®ÙS<æ†þ75r#$Ÿø�YYÜX…Iðâ®¶­�\62ÁþCG”rë™^*­Æ\}DœøÉ~CÎÜM™@ºÌ¬V_X©Í³H„à.wÕNì’PYÎb{~p™ËbÉ¡QÆ-7'Â(£#þšã)܆úªl9M´ÎÇë¬çÇFbì�c†�5½Aó¸6Äæ1]=B�vMËQHf4ZĪÙôšOŸè›ñ‚Vªœ:<^ Þל¯wlQZÙ*W,!å(Ÿ,¡ÈŸmðÃh¤•7—ÆxÚåŒR(ó¸ Á ßi¬�âæ2ÓMH]·#ŒÅåÔ+‚çàãu)Á¡¨¿¡¸ç®9šÇíÞßôgA6šEÇö+é×µ¶ÁÐÛìçRÿÙ�ÙªdîøD„[&ë]¹9¥--Ék�¹4_k6øõ¼JŒ/ìòãsv^ÿg¿Q“¸]Eee##úc«ü$qne¯q…3I�Y!T(êå~_¨Uˆ6\B\¿æÑDü¼õÑ&0ˆjÊ€©—Þµ£l§®r²é•(óg:ÐØ?ž xT©« ¼ø Ùh„?·%ílúÍýùŸ•ïå.ØäjmeÍÍ¿î¥÷ [vçÛÇíE¤<¼‰¹ÇAÙ¦qW±w=gb¨µ4S>[XQqšÆìÎ"úá\Zòż–Æ5žk•µ9ŒY¿ÅÌïÌ«à™~¥Ò1W,­¸ ?¿ä0ûÊJæöÐöveÌOø�ËÎd²5E¾Ü6]ˆûûͪ‡[.¡Û晫8!©25œã6Ä¥¡G Ëš^¯›ÝoÛ‚\WL|è‡Á«á4-Ÿ½}üμäÙÇü±Å§.(÷ÞÊ?è¬9·ë.|ü¸$íB±ä�[cƒþP‰Œd²2Æ�PŸåư̈́,=ß0I«(tr½�4¥ÞÑf®|Ú·O ]u‹õôÃGL��â£5v,ÿµÍ²˜_—ÿ ´–æP*Ü%S<Ö^ÃfQ€‘~\¹ÿ‡ûP9¯ã†r\ÏùG?£/{4×'ƒÖy‹OÀæ!—óëz�Þ�åÄðtä¯ Z$Κ¨³f®ÐX$wZ\I�g˜Z®q'®OAr¬l3c†É•þÙŽ¯G8=RCýc´Ö¶ÿËb,3[» Ëx< ¦/ãÁ„Ò67À…ý+¡é‹{Õ²gn�/SƒE¦´}¯;1q__©yWæFU2‰õúÄO)3ëuŠI9ï_©õÏûuÓ†š§TcïNœñÕ)]J­-Èàs}ò8qw�™[ªnØ}XY,llñŸƒ!SÑ^ÛUvyhÕ‰… MÿÊÂ1.D­ÁJÑÂIšÄ߬Z–nχ¬f÷¡ŒEØs]'#Æ„¡TuYø–l˜Ø¬»pÎ>¿_ÐÒ»óB% Vn7õ†Iñq$³˜Õw²¦¿MãòºÄŒ»´gó–+2Õ ž²pøò~eû©2ž‰`>¯ZŒÉ¬"óGMI ¾CúD¤9r¤ZotE€Üôð*ÈYñÅ_!„8Sö¼²×‡Æ=›ØñÞE¨ØPÙÑ­–å>(4vù¨ ß§¯ŸÇÿz¼�€Õ‰ßgŠ’¼Hp§qÇŠ°V80°6À‘€Ymsk¨ ®Ò,"0¢K‰ù-¿ø¨âÆQI»™ýuC¦ÚþVºÍ¢ÆoM¬Ïø\_“hj†f1W;&%Û•›ÕÃÿ† ïû‚ÝléPoãï–9K’ÊTe¨bç.”¬Þm£zÖÃÌ?’—EmØ#2U/®»®öZ%ÞÁןDt¶ a+¥6XrÊÛûø×Њ (fæ?fsd‡q<\Àèš}Ù@­«J+BlÙZY‘JeUm˜[=H§" |i`/y¥É— Bæ‚ëÆz¦7A­kf£Pc3Å=³ÄÓdrf`Älÿý¨m�¼q¼v÷®f•]2aËS¤tCªÒ3önà½`!ãOlChN¿å&í‹Æ¢š-D°¬iíQ])Ë“íXÜ 6!¶™#¸µ§óT­þv†nf]fe�U޼h�ì1#Ò#«¼¸šfœòóA¨j—H\ÞØ»‰ Í™ÍiÕo%ª.ÙTáëG+ÉÍ×öåÿc÷dæç ¾ä=4ãwõ]EëYö>¼Þ] 5ßÔÅ&ý™�ØTx°¡SÏSÁ—ÂüKõ(q8óX ¢™Ü’83'Ùïë±5'¶Ð2�Ôý䛾ž\a½Ë�Ýߎ)£ ÑÑѵþµZ®‹3½ õZñèPqF>tÀ”ÈÙ~�Š€×ìpä*aQåñ^Σ^ì¾yc™L "|Ð.éÁŠZ†Ql‚v?‚íbªEË÷ôWœkLÚ–Ãó*þå»eÁórE/�¤ ö4Ì‚\qÕ]Ã-¥9ÿ1¬Úæì ;Õ¿ÈU�ºÔïâÌO×µkÍóC4.^þ8¿ò¸ÌÁ~T-Pso´¤Ò ”5qðµ7ã͉Þ[u_ ]º}žY˜—Ú6¾FG]ñš¶.ùæ¥7È£ äÐÔ¦Œ}çîW¬à­íç‡Ó·ÙwÀD1 ÜJw ³\§˜oÓv@™°AÕ:Y—]¿¸iâí«?$ „ÁÜ«º'ÁÉ¿ÚÖ²3ÊØG܆"Ì"3K}°3„‹ö#cþö¡êÚ†R™K´ vdÆ‘¬uG+/‘RC É»�8«ˆGôºÄæ–ö±“«½¨.\fˆÔ�åúÔBáLM¨Ní”8ràŠ¦[G'5‘Ö+eâ g*:z&IBS\~—®J,Ö1üOË£²|ß8²îZÃ;WGÎ.°ì3wüGl©wʉwüœmÊo©eõ(Okkš2x‹XÉžgU‘°è”—öf�^ÿëÝjÝÒ\?ãsÑM¯ø~q{+3bYÎ¥�î²¶¥yaƒr˜'¼åøåÑùæç`M<�æVî!ÇݸCNذ¾.N8iŠ ¤, F™n5s]*±!9ñ–=s1‡2t Ð†ìßç²4›¬y9M9 ­YD”§™ã` ´•ÚÝ7gzüÌ¿±(rÛ HƒPŸÑ‘‚²"ÍpŸô…`AÅs¹Dc࿵-eáÐ<+¬9ÎG&e,áâ"øb€ë4褙òm�. ¹¤ôBJ¥b°&º­în„0ùÅR½^ÊþúÈÞïàì´p߯I¯Ö Lq³¨_Wþ4Û´gB&ͳ™™V™'»ûH/£HÈ]|ÅuGü{ø¬†-ñ¨C³9JríïïÇ[ôŸ¿Ù½7LÚoµØKfRN}؆ºŒÃ˜Õœö¹¥ã Fi€~à¸'ˆn*æýånÃàÔä6ÿYÈ4àíÃ'=i×Ò6ÐwÀjŸïŸöÿš˜jŠ_õnå±_û/?õWz¯²„I«zrþ(�”Ö$#ò;÷Ë8ŒÛ¼Ó£ WÚ¿õ·Ž·�¥Ðô7XÞNÊœÀ-ì\]—ø�MZÈ/"¿͘uÿ¾W¹.e©Ê<ñØ‚fù“ ”t®Gž uK±kRz‰ ·®ÞI›)©ÍË�±4á•õ— �hª™µ[ÁŒ]}áØÉ‘dp¶‚ÊØ7œ4Q/Ì‘$.[*ošÿÙÙ^)6ÐJÆÑ”-4nت¯ùCåá#¯¬ð5\qgF/¹íïŠêšA¤ÞŽÍˆÏ@A’3‘8h4ÔŽ�ŒKþøâ/Û~á÷áÙ *nҳʱ›8–m‚{{wS·?Oæ˜9!–êŒÌjº<1Û öŒ�G%j}6`tÈ[°%ÀœgÜÛ�®gF�3oä°ÞÕÞI åHTj{׌å[Pý¦c¨g6X©1T­澇þeØË|»·lø\¨×ß8×ä¯Xoƒ>[Ïn_¿õ8ü‡³c ©pÃb°¹‹�&”KÀ–|y¿ÕÈübÒfNax ÑÇúÙ?‚ür¬ÛÛâÎoô;—w`ä’¿o„ù§]Úd9Sni7ÖÁD´9üQçÐá%’€µÅÎöûÙ•’9½[>F-ë W9¡†n‘:tÛ¾8vm7+%Dî3îkl/˜ 2ãȰ5Kñ6kxÄʲucpš[]îµ~B>‘3Ú„µ MN�ˆë¶Ñׄ±Clcɳ¶°à`ÿ†ÑOùùo�ëËf|Í,šëgPûGžk4üå¡hÙBs+ÜùéóFÞ8ªüëËiå‘¥/_ªjÖÜqÓ{ÇfÖïX¶ ‡F>§£'j®lðÖj ¸†‚£Lš¹^"÷ížE†Ð>88r=Ë 6mχolºÁ¾2g½üẳT–àÉf5œx�¤®x/mæ…¶U)­m¸ChdÿÉ�¶Ëòƣ͔¯`@›$ înPÐõå<.ä¡X6¼–?›©ãÛó£Ýš¼òÃAACt‚nš‚q2s˜ë:\�/éÆ� §‹.’õ4±ÎÉÖñ±F:¤×¢ v£ (1�ößß_­÷ó]�B”¨Þê¦KÍWѬs]mIŸÊkž£>±P‘*µÒ¡ÜB\½™ r*ç¾í`ƒ�U^8õÓzk�ÉÎøš–†ŒÛI¥‡"+©ˆ!›Ó¼ùÄøÏ6ºÎ‹ ùxüfl §HÅ멵ÂÙ$%vï†2À¼ EŽ�cYÝ\ðW:HòöŽX—ŽtÙkKéÝu9ÄH ðGjW[‰à®±)vÞ—3óô1ÿ¾aKºw²Ün éCê·n2 j —Æàù㬔æ¾{X×¢wî5öë%.TKX/»>øãû73¸ðŠ0(·š ãøæ(Mž”°gêÄMÔ8;?ê~÷~غ(›� Á¼gƒþý‡ñ¹=Ž§Ë£Çx4â=—‡ß2Ï+–¿}a0mÉŽv/` �W!Ó­7ÚÄt �ÿ§(¥¯9Ì<Ý5ü0ë2q'qäþú–� —z Ós†§dp¸5R ÖÅg Å­fý ™½ÓBKj ÉsÝ<|b¦`3°ðÞÎÍà¸Ç®A®ðèÓÀ˜ö³ß £PX�˜pîoÜîÑÀ÷Òë†%§rA.4TÎ",Á±ú}Q ÛÄúÓòß“už\ åüdz÷ˆ'ÂwÇû|+¶Nü专8Žn‡»{4µœM^Âæ0„p fŒcv³2 ÓxþN„½š/0‹cìßß›l}®©ßÖ¯U`Þž˜PùÛäÀØ™ªtoÊuÐyÖÁ…öŒø�$Ì�� aÉ1^F�¢eÛ>…Ía„[=0zJpÓ³œ>'亓§-°æ_ž Dg¶I¤_‚èï ¬,»é»^Ùhmµø:Ù±°Âø}Þrq<:N±Üº”PµÈAñ«è÷)‹Ûæc‰4µçB©IIšGroräÜÆÝ7 GÂdêï�Gë¡x>¡BòÕ¿ ’x2�/ö–Fù»`Às¸ØT8{ÁÙìE¥¸ˆ¤Gç…pì±{ʲ’äâ*<=†ëœ€“’P«§[ó¸ ¹³'ä6~æµ…}¯ôx…Þ` ìmúÂát_0Ü.•#äg<)Yð ĮŜ‰!«1ÌŽò'%'ˆ³˜”.òËcH9¿˜ÝÂ@òærM›ã‰¢Á12 H“›\X ßl´‚wÌ8�‘9áÿ5d>ÊîÖ )1ÇnÉ‹£ÛmѰSî ×Eèüùg#ŸJ¤°KÍPÑtÑ¤Ø £]�j ³ä9Åe›>$%Æ!ËœÈ?¥ F røþV'kk¸W5D/ÀãúPÀCÂt Gd™%S¡Õ�w$ÆòîQ•ÙŽ¯NÑà¡Èr•E[Å[‚Qò§kÞ+þÀ±ËåJÌù´Ü[�ŒþhZ!Ý3Tü±q±ƒøÇ(ÞCá�½I�=—KøÍû*‚C¯ùÝÅBð£ÔµËÍþ4e‚›I~•Z[œŸòÏé´HûÈËÈáÖüý/î3\é@OL{n¤´!kFièš]Èäj³$piØÀxÿ18»óJuÿXmÜÍ'` pùT±�ÕkC¡pýBл,„“æ+¦ÃûªCÎö‘¥8‡wÆ1G�O¿PùãŽRo !c}\s7ŸûÛÖºSwTí Æ÷ ¤è]9ÿ1Ó4n²Fèžþ bLô€ýN¬p†p­Yó®àÄÒÁ¦È^Wá©î'³œ:Û©ß@&Øó ,àùò@ÀˆqšÕb¬Ýººí-ñ…&GQç0p7Öd"ßQ» ìv'S·^|l~v|¯X’»ûàUñgF_~d³('ž9(ÍqÀNˆÂ3¹âRMäî¹PŸÎQ|ÿ)ú„¿Ïë}>E¶ê\GQž Ž7âÌ‘<?©"W D!! Ì®^›šÔñ²ì7Í]f&GŸœ±âæ\õ Ïm 5tä'·Vu¥2Z!iúöŒ¥ ê!ɸg�InÆ*_Rø)¤p«*Ä›3Œ¼”àÜ 8àø=ªžA¬sª2œ¸³ï”lózŒâM}Й…þG¦©kÁ‚ùzÏ {ñîî†w­zn<ß«ßR«í»—ÒúÝEŠÛ†KÚë•ѱÆñЭ„8¡ÕËYÃÊÙ�j¶%Ês™%XêR68É0S#©\e1Ì �õÛxc¸V �òÅh'×Î*!&¼Y×wÌu¿Î;ŒÆ%Ós„‡ç´j?íi�#x/±C‡5'ŸÆOR;¸ðT‹'mfçÁ|É)á z]? ?,ëÖ½uDâož),ݤäÇêµÛ,Í0Ž¡ŸãÌD8s…üž.2åé9ÿ\¦ 7Õ±ÓÌ‹oÖŠí�}|)Ê¿¡ü*VÈŸ3ŠÜní.´)Å?Ëî"RŒ×Žé,?�“ãºÑºOõY²ØoFá|}éWš¾¾H_µsø¦ìùSë˜:r»¡Þ'Y—F•‘töíút÷)¯£€�:Çò9º7u3$}”21â _©‹Gì#g@r/fxÆ1o`Ÿ=ìˆXúos�)Mî©ÍöæHÝãeÓÏÊSt‘VPî³™�gÇ㟆 N2ãåšcåÕ!ˆrÍÄ x®y}Ý·Fc‹hŸÂÇ_,•z‚W«™]4äÎuxNq>ü!È(Rd'¾pî Õæ¿$MMԯ̡rÌf/ý£~Ó_1§ç�dmùÎ:cÎcW‘Â]=áÏv�ñññxu7E‘S°³£cgP�¨×#£ÞfÍÜhlÜ"�µfÛ\{‰°–ld_:ï�ÇüáÉJ3Î5Î8žÜåÙT«WVÅå‡í¤Ñ›3 Ü‚é^éõcÏ"æ³—¸(AI|æõù@�—9ÇUÚhú‰ß<ÀQ¤„ç¤�©$•„† ÿGò^xt}YȪÿåX9`\ž•#~ûgÂyÉÁ‡!×jÉ ;®ÔùçÎ?W2c^!g[ùVd«®%ÞáúÓ7Y¯Æ%ñ¿Œ¦âèÀ§?ŽÃ…Ùõ½ë0°eÔ¯„I¶hU}Y€~và‡0ŒâËÙ­´ÙPM17£'íL|”ø˜²³Š´8aÛ™\g-¨ìߓӫ:ºða«ˆç :0§ƒY®�:À¶ÛãS·\1»Yû ŠÐ7<é?¾ÀéwG�Aypa­•Ýr±4èŸÈ7™žýx%¿°ÌeÁs¹Ý ÷Þÿ–u#§[ˆ77]>ðý}¦ÈLßé~NúäRVå’ZEö©+jÉh°’4›ÿÏÚ§÷+ƒ@ß>» ”»7‡T/ÎÆ—ùÜoËcaD± ÍCá¶äpÛΧ ïKòã7TG§)Ø)I |mZñšKä³(âËW+o>7ì>î™ïö53ž¢×ðr�âr'¨fu뾞vfúN!áËŒõȰ›`«©¸sôÍ‹"@Bíu_–ë¢ÒûGÄ»Ï0å«N÷àL6'‰ÅáUq?�€�àˆ€ˆˆ‘$‚Œ2‚I±Q¤0±BDc$AdÊIŠ!ˆ0ÊcJI D SD B$E&“1I)"”T ’1$dh’D˜ˆ‰dÉ£#AˆIM(Œ(,Æl̉š $�Rc(‰ƒDÌDÙÉ1€ÑAÉ&C’"A”�“"É“ !–‘4j%„F‘›B † $¥Y�É&P$‚ Q#˜’ÄfbL‰%#hÌ“D #4™2h4$˜ÌRKI¦Â$ ÄTŠQ)"CM&E1™,¤Í€"LR”È"L"6Q�ÌaŒ&ˆÆI£bE"I$d�2(dˆ“ ÒF” ¥� &…!¡$BŠ Œ)cM)£DÉ3 fHÌ1Dl™™’"„Ã&É!„RÈ1�¢H™³R1JbCA�i( ”ØM‰ a ‘‚YYRXf“‘)3LXц¤ˆ’™!D…#2`b�$˜€Fb ©�„Á$Á�ÓC˜ÐF�•0Ë j!‰BdH“ÈŠ,¢Ã"È3 ™%3 3 $JL%!$ÌD”©,$*i&�1˜ad1˜‰š 2�D¤RL2hÂfI‰ „¤�$B™&A&Ó¤…$Ã&HA @ AfcS4‰hŠ–DI–�Ë0Ð…K À)L²$&DÙ€˜DBB̦€,¦”P‰�HÄ™ Ò†IŠY31!BJYI% ”B–¦l›PÐ`Å%&„FI“"™,3bƒFaDd”„�ˆÀÊ$Ñ”I(‰� 3)bFd¦(@$™ŒKJ”„ÈÉf1$Æ!™1l2B1± ’6b Ä™e 02Áš�X؈¥’I RR"&‘%@˜Êbd‘"$ÓD’Y&„#0É# Æ�“Dd ÌD´!ƒR1ši“B%ˆ¤$0!�(@PšJ&23$‰Œ€f…,A ̉�’A™$¦I’31£06D…)fB‘HÀR$–ˆ2™‘”X“,dlÆRÅ Å6JR‚ÆŒIƒ"B@Âd’0É1&B™ŒÉ¢c0¢ ‘$„EŒ¦Ìˆa�‚™‹2 �”˜#FE0#F Bd�Ä"¡�1)"fJÉŒ‰ ™�Éi)¦É™Œ"(›&„ˆ"Œ¦“J$$¢dCJ&�I(h€‚a¢ÀLbÚ ‚DfÈÈ(’0ÒÂ`I$¤¤Œ”@M2FIˆR3(hšI,�’A$(ÀDQ¤ LH$’P�¤È’#ŒJd”¦ZCLJL É&$£Ó4É&¤Ò ÄI±‘&„�Êf‚3HÄ Š ŠÍ0L¤˜™D“D"(F‘2šfL"È‚R› ƒÆ&�’ ‘’aFH€Sd’@)dL ›$–2F!’š" ²"4‚B"LÅ€�‰F�2D%)"3 d¡‰±C$²J”ÒFSb&YB™(#d“æ<3ÆÚØ«9êa•r Ç^9­pYí-3¥?9Ã(ù]A±@âý�@È´×v'\Û®x7¶³4ý"ù3R(?\ó EÓ´¹b{T{0†–_•CI”šU¬F� y¿PcÊ¿µÏ~Ô.%ŽÈ›/#i±ýÁ><ÙÙùR©&N›ÝÇNæ�óˆNèÁd Vѽt“OQ²�YÆ-çKÔ³¡Ä¦¶… ž¤ZÎ{Jòtö67¦%×’ä°³¸…¼—Î[|áz—Fº¶ùçÆùGÞk¼cC‘9OóÐy� ÐUd–”_E/‹ðæó{ù¥#ì5Ô°ï¼ü�KæÜ�_Ø cø™f�PúûÛȵÃò DŒEŒ…º¼B=ޜ׸ ­¨*Œ¦’~ýlˆ?¹‚bޝ™ß}Cp�Vwu˜ƒ•*«i»5£)ï<<..tOR×IÝòÇï›jp³dÍ[©‰WÍFœ{„ww6i‚?¢Ñ¡û) Š 3Na`\=¦vr–6�Ì@X šA ¯zicã“Á{c' ËÑ›+YtÂÁ�V|¶òŽdþDz6ͤj8Æ#ÃOäºâÏlt¥B”ÝÎ�j†§ÁɆ²:i©ï§ør GÝ£ÐÎÌp†Z§�cËU2Ûªsƒ¥Ä–­q§ô®ÇÅNƒ2;÷°§+:œä4yEð½dsŒ2ô¿È‡¹[ó;V ô𓌯õ{=r1gþt0{4xa~xÜ`À°ƒµ¸ðdYKBþù˜Ò—%Ô£Ëï*ˆ{p?»~#¸`¥G·¾·×ðÛ/c¢Ó¦¼¡¼Ì!am�8a ¶œ¸šâ!:µ€½ƒ?>¦yý°H{ïäsvZûO)ÓôÔüb·ÍÚš!V•…Ÿ5Š4ô¬é<®U”~[Õ£¾(ƒþOa:¾ý“�öu}!É‚­I‰ZÎCóühz5Ž H¸n£Lº»±ñYÌ#�þYy¾Ž~7ZÖÑøæu#µÐê<áß_zü‘à4qþiöΈ*´çû ®I]\iŒíXë‡7Üø%R'¿͵ÖÅ$=Oa… Jg…ccJ„!üíœÔ7Öù„±UƒÂA�•é cûf›¸ÓLéåß7Û·¼>B£tÇ›z¤AÄDÒÅí·}lÝñ@ª¦1ÝØƒù}ËÏœ¶6{/lææT52ÚŒ6×F1Ôa›ÚQö“ö�qe»ÝÇû"ž#$ª»KÝK± G¸—Û°Ò¦ éO¾S÷÷ñœ ˆóv`ü?ºž-e%DïW2¶®ê]Á;]±@AM§á%ÜL¯›fzW׆>ZË`;¨hÌIÇÕ//»î=uNÚëTåH$C\¯E¯øÝŽÑ§Z¥2ŠP@4�Ûò="àâß�ñV}L(�-.Ë/)®Â6I\þm°ª¶6µ`|�º$;¹®.qâÎÎ~s%\Ï„_çOQÀdz•Qåø§ÅyåÌ4säz¶€©W–Ҩꆰ6g žtü4]¾Ö/:h©LüM«ÍvËÈ…½›O‡ÓT6ŠÅÐ?åXjÛÛ9ÃðÖË�8†ZœÆ1tcùbÙœ±Án+ÔVއ;7Ž`GÈÞ·�f2Å9b�å=@«N»–ô꜂J¶¢Œä&½& "ƒñš]9ÜQ%§d¶ï(±ò§´>³¢Ø¢hräPZ3�lξï·z¯(…Ž=Ù%Ôýª»òî{£JA‚bÑDâÁ3{ä¹ü`=›“…o�‘èp/x…)…¾U•Ä2a/,ê°*�¼ªkÍAq-ͱÌAj¬à¸‰i®Ñ^_Ä?6ab�se‰†fkÖ¯Q'ÿ/ƒ†F‚—Z–_WG…&*¾Úé°c780ÞÀlðM9�‰Øa0ïFj||…•”ƒÅË’y#jqih@:’ã=:ëBóå³�L@ÝÛÄJ¼`‚/Πc»ï¦Á…Õ‹ß÷åzWgŽ˜ T”g=bZ„ý÷Îäq$~Vïmw—Œ�áÈ3™šæ®W‹cî‹�ÀP¯ýRVü+#rŠÅ£Š Ó¦±÷·b�òäýìñ¶¢î^‘Z†Éñ®oÜ`A~ËÊð}Þ¿ƒþŠC(´�ë=°mI;ñýµß1~|–}‹Ë¬Õ+Ñ·À5?\ØP¥9¾f»;9¨TÞz#y ¬Ò¦ ø - ý~‘ÀúÉGsT)tònd =OÆx Ým æVŸ –wÎ/çºñ¨5QªÏõð:lHrø ¿•½ÄŒ±ëîÐz剸¼ýêSÈ¼È µo¬>ûžb÷Öi‡H¨RêƒÌ?âŸW…:„w ——´ ”oGYEß¶‘óâÌ2¿�ã~Û„Û*®+e:/iöö‰uðëÕ&Úzq¸cúù” é<øþ`ðîã* 9ƒ/Ë÷̼}&Á¨! íÉNe&ÌKXÚ;Q(•A†òo7ÊnËs;71WzÌÌKFÿ=Y¶´í¥t]ðéÊ>½÷憔¨?ŠëvG1”FÓ¶|±«±~yzE[Ž£/O¹]žŸðÊLjš°É Yó¾ßü°~“a’½ú’8[ïÃÞЂ5îã~6[;áÇÄ;8µ�¥ ×Ô…‚Õúýja¹¾¦Œ„=PpôÇ|ûÅîm~-kƒªà¬àˆ¦`J\0ÁÖ¤ÍܾkŠ…†³(ÑïÿFÀwŸ¯XZ—|ü ñ¾÷ýùšÞT´ËxÙrÏ[ø�E¯‘0"�yž¾À3>í?%:Êó[¾+*ö׷𤷠3ºZŠÜ—#^1,NMèA>º2%j~‹£"gœü–¸|I”GP SÍ1üN’WŽð¬#Ø÷P.ì\˜§c(wÄ£ø¢tDB¨/nëï�ë©qÐë ìcë%+ìù²ùnÙ:îtK­Ä ¡ÎQ�$¿:„Ù4‚{ÑÛØþYJã/qkFY™CKùa·DylöAÓŠ¶Æö£g6TøZµúéoÎóUfü›¯À5®ðáI�äŽqa…ÅE(8s]µ ”ö‡!*öÉB6¦úîÍ_Ý@ÙD â|s—#ñÓ±³¿n/Ä]¢ucÒλkñÏ¡ß,ué!hËô¬o|–*y� |jVkŒ!¤Y‚(¿ë~L}'5Ü ÅD~?i†°ÒÃYÙ6 FÐõ~î�¥Ö¢XÌ,û°XÎÉÇ—…Eœó2ª¿:‡Ë¢{L�¹Ÿ½s¡¯òý"íè¤Ëé=Ãá×/#U�1žµïz˜r5c ýŠ ±!ÏÎÍ ã½v \ë˜÷âÌ× ^ ÆMY·ì©îwò�¾ £Jü••¦Øî,Áf#HñSš¹á?ÏLPx8ð÷W˜\O›=ÝÎgWÊIUŽï½ê8bÞ`ÍVúC–S o&qRÜÙÇÅ@7ûlnÌ}­�…±†W©? �Ü_¶'=Nv©øþ ˜êö7WVNdûų¸³Jvõ¤ Ñ tN³Ã‚9�0çÅíkè;´«ûOò/]ë{ ÒÙí+–|Î�Xa@‚0퓬z9mÙed+1wìu÷y̦×fÚLèõrÃ.àg_$ˆæŽu^L5ø¿p”·‰>Ö�JXŽ•Šj쨉Ø2R u�ƒvIû̳ÈVÇ~wì˹qÅÜÓyet ç$òÌJè•lý•cZ!ñ“uTÍ{{R޶¹cGÝÉ:[Í8âöåâ Øá¸ï8j߈ý¾®ck%Üó~Î’F?:c¸®¼…ì×ÚEîYâèý�B üÀoêjú¬6Usí#íÐ×=!ºžú`´VX2ËR÷¥n ùÉZe™·Û5» ·Ó*Øä-&Õ´ŽXÏL²@" šÒ¬uAêðYõæáΡ�÷×¾½ÔhYnüÖº«6â•ÚXìµÅ­pk�J˜m“Ô18ÆÆÂ‡8ûd´ÛÜ蟒g7jóéæÊ] ʶI0Î9WÕÛ&˜)Þ¤«\7O7ÙÃK$å3çÒVg�xüR�õÍk�ä�È)¨z&2è¨äZ*×ç“�“‡À’¤#3*û[Rؼ¯ˆ^×mÃ3®på{^tUËÆ•°Æ§ ÎÕ´†Ùåù•aX3–'M €!î›.B²¹oÈ1 ×ìV¾GÂå¤-/ɺÌF‹ÇNã‹ëš·¨Q³·¥[q+–TGRªók²þ]ÖFâï…ˆ-x²ÂÀDÝ´md©«ØmÜñ´Ë¾cäJC±,ÒFs'ñ¶qrï·©Õ£ãpÕ‘=63cÌDÔ(\.€]Õ¢Ÿl.¡aˆ=Ú†\¯lM­'Ï�¤qŹÂxãLîñ!AeXÝŽ�“üõº¢âS"˜™ÃâTt4aÁÞKN$)3-jË©úŸ”+.ÍéW5ß™ ”R‘u‚µ�'½¼$uÛC+ʃa¦\6 Wµb2.vôÇ4,œ O̼ÜM¬þX1 Wò"çsÀáÌòR¦'k¾AŠTÑã“BÆíL–´Ã’V)è‘ø³]’Qs]ÊqHœ–¯sùÅÏ�Æ¢Rg{¥&[±ÊzÙ>1çàâ|éº�ªå)OXß�h†³nOl·ƒå²œÂû»lO�‡-/M?ع³ùß«Pã-;»¸yôQêJ#/’óNcOŠ…‰ýÔ,U-¼üm³•Ôž#G=ž8YÈ€êѺ¹Wå³­±ð­ˆÿª”akþX¿x‰°pù¨Ôý]}ô}8êùÊû(¢O¨{yg/ù®=/f µr�Òá¡9ÝûæaCéŒå‘N† ~J|pÁ€ý>^}4ûJ›½éÐiD›ëÝüh;›­ø\ŽRe_�~ÅféÁéü§ß~å»tnÖ' âˆJžQASá·ÎXåÒþêvïF³™kŒ·±á“9ˆ-gn†§‰ò4°4ÿûðö#ù}ýþ„]7Öé²Qâ�skª/Ûuôû´AŠÖ²³àÆ{£û8¹úõdøP˽ßÌ}Æç³À îýMê*�GÃ_®à Íi>ãÝ@ ‘è?…3?¡�ìaúÕir€‹à@øqãÞNÃöf!Û­ Ÿ\ÞßJèƒSr¸¡2yõG(py¶0š]šãö?ëB;òŒ]I³ÌLçoÍ�<�]œü¼cJÇß[í!†¿Ûòø/)#ÓäóA›š»:ºâ]¬¶.ã®ïZÄ0lYÚ·²¤}‹›çö«:”ÝËý\åÞ�ñµùÇ¿ÈÏœ›šç…ýù§Á8}v°ÉO�nƮá>'æQžƒpeúøÔ¼'B˜ƒ.Qò.†+;Äí×lw@™~‹¹2›–%yÌ(×8 À¡~8šL›câ�áõlbÕC{ùʽóR�(¶gÙ~Ñî°‡¾\S»¬gÎT– &�HA‰šr¥Åã—R’ê5HVápE�‹xjelÍ»yW9Àް׶e9Å‹B‡¯]J89üáëÇR�Üß!&ÕÎ_tù „ Uñb|GÙ#‹UÑôIF¤R…7ôˆO¶„ýÝ;l[Þ[l:öãŽL2ÀÊm�@p7â6nWd^J$#÷0ËÕ!�œ¹}ßÙtlör@ð¼÷=RAÇ0{éÂu· x}ÌSËNxo�ôÓRIÝ•aê-ÏR Œ÷ë³ÇÈäð|ÖPˆ\Ã’ý{ÚÀ´Á—.(f¿´›Ù]'¡{4-ôßືèñïÇÛÆáZiN'8“5ºÄ}f[œ+†0~Ã÷.þ_à�ߎôÜqÝ«,°zÏ�:�š_·Çï“d…öþ¸¿.2Û~&T¥ýc§ñÇûoÍKŠ‹úÌ(¼ØóÔ¦ôˆðƒ·é0�©Jy°0ñtb‡–ÅÔŸʱÅÅ·Ú?G©¶^�Ú­ú}o™‡%çm|t}Â3-p€ !àStåŽä·õÕ¹Þ xc¶x]ñ¾¾-ËžyJ ë|¹þñÏøÿ_ÒɽÔùÌ8Ã{Újz8úÓ²pJäí�„¾%ûøÃ¹µ“³n·(¿s�èÛÊ¿¨T\k§»Œ9ϧ/L“1ÕçOúCò£'üsE^ÏÙ½d:0 µ?ŸT`†�Gñþºä(ñ/»Ö9�ëw뽆 �˧2ùK÷0†7˪ëûüŒ£,Ó¿Ù‘2û'Îüaê,Ö¤‡xö×òè%øÒ�‘K²­½qVQ—}C‡yÚQÍþîªm«þ«ªÚÑÀׯÌN›¨j‘`kçS³ëÈ }Å)6+¦èè»+µ0P¯¦¢Ú1­^¿.ÇÎ[¾œ³Ÿr±ChCœïŽá… ÛŽ�=Å“¯ E¨mé¾<)ͣ౼ÏÌéôw¶À0RÈ‚>RéDpÞ‚Ù×EwHÈa„^/ãíß¹´¡Åoð¥�0ËF[—ˆöXÎÙ:s9¢Dš�úM;HÕ }D¾‚k·öÛ q ß<ÑDjÓRb 2Ÿ±o-Ä 8ﯩ0qP¸yONþÓËç�6æ¶Ga`É­GcpÙ‡OYÅKsDÇn#‡„—#á †ôa$D¦Ø± Æ[$mD-r%ÝÛK¹kÙ š_›› Ñë=§å’ A›s8¥‚Òi~›AòókÁZ‰2ê¼Ò+Ï¿¼éÒÅwQ¢Îƒ@ºHb.°“ ²9È .½ú&è}Ò»Ã©Žæûw’wKÌáÅuHæÉB�J›ÐêUá¿'¤ÝÓ6�t´‡tt8Ÿ&Püë¦åñÙbc:„zl»›µ–Ç¡Ò.½àQe‚eStÞJ •ZË�'oáOâïʼɤ@`:_ÏW² ãúÖ_yhÚÌȃ[úæ¿�;,"R¨âyáKž}»£Bé,ó/>}æ]âÍÃèÒ¶[Ò»ß'+¡ée<�Å9¨Â/úΉ>è_ì]P×_ðûœQ�0äÁ“ÎyYˆ(_zLÄ'+,äÏ NJV‡¸öBÏpÞlV¦³#âhÆ9Öag4L+°ò�f£§ð^|H¿ÂîR`ï½ò·dcÂ�Íú§©C爮âÛÓ„ò̾éÈ�ñ ÌsŽÊ˜Þ0±…qx¯Ejýñ쪥<|î§±*Y5J=WSo½Ð'Üsñ už÷ÎŽ:Fa8±LœÄ€¬x ùÛýÆ� 4§jÎ š žÈ¹©Žß|R­ r<ö�I´þ‹ÌìïÆ¹ªé¹Œj:඿Ε•Ÿ5å•úPYr¶;büù•½ùSl~Oæûy^\²¶Âún´W{2x>ÉÊ÷Q}M¿öWUiMÍÓeØï.c:uã À¾AƒöÏèöq¤SÍ·ï?^íÌ›Ãÿ¨®9ùÁŒ³ïY0)<ñ«èÇíàþ ñË.m}‰ÿ“�þ*…I¬§é…Žoý åwö߮ùohí•\¬d'9íTuNœ™á;,³q—MŸàÐyªîVÍsÏlè&² .w5Ù®«^´ZÕ5 �9?¹‡cB~'¢âþ»G[›ÙLö%ø7 |wÈBÍsâËaËøš=Ëyigüâ—´¨ð7ˆ�'/*û˯öÃ->'Fn*æ¥(íYس|�ù; gÎ" ’ž#ú�{§ñ¯¾Z�ðæU Å-Õ"ÖÅ¿—ÙJnÝ¥Û‰,ñC�p*¸ïtÍH¬ÆÜnúf-y†ö2Òÿ1ñuÇ +ZüÎÀz.^Éf/îÓ4©“)]wX6S±�ó~ Ð ñ¨súÊé�oÒþðë±üR°ý7µ®ÝÅÛdõ_±oû°ûªÀ^x?NÝ“8¨4Lp´¨|0/¼>„ A“õ5LÊM½ñ‚í^ðL£íáŸ}gP·Rí©'çd+Õiß„Li©gšD¿]¡øHÔþ«ˆüdCœH«/^+õ§Ð¹ÍhS†[ zâz¯sƒH&|¥ÏÇ&$ë¹µ`¦ç øöO¬s�ð;«ιv?oÅwP÷BËÛ�í'õ%߃V0ßåû2›zx8•¬qâ ÊQÆ)ºþ¾•X5ŽÿXqÏ.¬ñœ;'Ú.æª[¢Ô‚.¨ÓÎí@c‹÷x¹Ý²kYÇS÷öÛ»¨rtúu�Á~C›7®aŒ;—ÿ‰ÃBÜVþ1Ù@yÑ?™eXҌӶ1#^ῃ/ß!îåçŽÁ~5½GiÂï©_Þöâ-@l#�º­g×§³H´Î^K+H3¸>Ãë üW©ÁÄ-<ºÄßÁsI�Ç·âÔ�/¼Íîæýeóå°^ºÆ Ð�5˜SlH?rrJêF[ñÿ:ž¸Ã.ÐÌb{ÀH•]UgÑð1q|| œðÓh— †ÎTÃ?Œäç©Ã×ýuÝ~T+Ÿ�Nzg€¥ 3¾Ô'wšË=túDìëf°¨óŸ2ßIÁ9Ša ýrLšm0‚®ÈEixdÜ>>gå^/¸ d„Í?•TŸV¸B2ˆ‡"RG‡w–i»x!šI³û¶çÃk*‰f/w±•ßH­Ëçdç«‘„úP–î`4c£rÀ#•²à×aðÚàšý09a]ÚÿöUž¼™b£ÒË×̸UÒobÙ“9‹ÞâpXG—AcœFQR CuZÁöaÕu»Ö¾ ú,ô@Cè–¾I¤ Ár­�Ò6¦í®k§Á§ÇòKçñ&ÎV|KŸ;âщõK¤ìøjŠvôüƒU³¿a»6Ð0êqê9f.±®qͯn]œJòÖ0õGˆ@LéRðÿ5=KRO®8&û ´»åwNäë¹](.‹]oäü²VD! äRKËpv�½Þ>o‹3}�Pl÷µxyzTê×Ê>š�#I;ÔO<5u™Þ »§ÃRþV6o)Ø9pÚÆ �†x߬:?BÉ@Ek p¶Êû‚gœ¶0Ft߉ù{·H�v§ìñ‘¬W�SpU1+†¥Wà-PìáÒó»˜ óÇ5¾Æ]Yb,c}L´zÿ&í3Ž\œONИ³H;-ü‹x¦Ûg·e¾{k?Ös÷—ûè"4š(Œ&Ã)$±2#OÛj·ñ[k_ͶßÖµ­¿‹mªÿvÖ¿úV¶Õ²ÛmýªöÖš¶Ûþ5¶ªÿ•m¶Ö­’ˆPŠIšTdR¢"ɦR°F™#4¡‰EA¢M QµÇjÕ¶½­¶Õ¶¿Û¶¶ëVµ­vÚÚµMj¶¬Õµ¶ëmn¶µVíµkWjªºªÖÝ­m«­­Ö­µ·«[Mµ[j½Uºª«¶ÚÛe¶Ûü­WöÛj¿›[[u¶Ù[kWñZÚÛmMm©V­mWëýOü«ýžèäßù×Oty}=éß'N¼™�1¹±Ä14‰T1B‚$Ò Ÿ·žyìߺø¥%ﻉI±½ûø÷< ý7¿}{ò÷ïzõ×n\4îÜnë�ãU­­½÷¹_¹~™Ý|žëÙºï\ñyæëùyîæä J`jAd¡Þ©B„¨Ma”7Þ}õò¾{#;¾ýíâ}ÙŸ=çO�éÐ$1 Dɨe:dR²$²– ÈH!"îîwRæòýîßqÓï}÷KìB4)Q¡“‰ EàªB£’ ”IJ” NÈÂNÆ€K3ÑÞT ˜€šŒBa 0¡)HTgH:@’XÁ„�D¡óø÷ªüü¿­j¿ômµ¿ÂÛj¿ùmi­µ+Uþª­þûUþkkWóm©m­[›Ukþ[j·ýÚª¯V«mÕ¶µýª·ñªµÿV¶µ}­Z¿Ÿôæ!Ál‘� £h£DbÆ!Ñiš Å,fņ"Z!±£I£XÒƒ%)„ÔK,ÒP“d$#@LÂVd”Qb6… fˆ²PšDÈ”IF64�Ò(¢" ´�(¤¨É”H1'ª·«mU»ò-E’‚4XªLQ`Ö-QÑ&©-Œ†ÆÆŠ¤´W­¶ßø5_kVßß­Uümªþm«^ªª¿º¶¯óíµ¯ª­µ¿ÍUš¶Û†Ú­Ö¶þêÖUoVµÖ«5j�¨E)@•ÿ I9¤‚yÓðZYDMæö© 4»Cˆ,� ÑÔ@ĈµYáV°fɤÍA šª3«–PÉ: 4<ðÆ•—.˜À"* ‚Ä$ DH³=L¬:5†rU”Ì¡ z U]¢Z‰Ô¼rŒC$,òî�˜+�“Ú¥D³Z”¥4-mÿuU¿�¶«üÚµ·øí[[í­–Û–ª«ý¯­mm·úöÚ¥m«kÛüöÖ½«[}[k_ïµ­ûmª¿»VÕkøªªUª©[Vj[Vš­eµR¶ÖÊÛZZ¶Õ¿¾ÛZ¶jÕYª´Û[V«þoñ‚ÿÖÿuï‹ÛæÜøgA‚f!�fJ�,�$±IÙÓ³š$„.¹ßzù§¾½÷»w;Éy{Ü»¸7;Þ÷`ô•ïz÷]zï= ’rÞzç½ÐwÞÜŸu÷Þñ½ó‚ûÁ˜‚ 2 îî“°f` ¢H1sF,œ»ë·s®‚`/7œó®¼äô½Õî»t}Ô_Jûî½;Þo¾»îÝë·‹Û»¥Ô3™ßw¢ïyë¿�µ[ÖÛM¶«ûõK[WµU]ºµ­SlÛ[VÞ­«ü6ÕnÕ­ª¿®µVÿ Ú•ª¶[U–ªj­6ÛUþûZ¿šÕm»jÖªöÖš«lÛn¸dÒ ‚Å%“bÑhÑEd%* `ÖM“`ÃI� ÒÄ&C1X6dSD‘š6Š ´nÕU}mmUýûoúm«]«ýzÕú«vÕm´ÕZöª×Z×íWüõ«W[[ímjþvÕU›lÛ+ü[ÖÉEQPU£E¢�ÆÚý«VÔÛ5¶¬¶×ZªíµYjÖµýÐ¥Ò”‚€i—ÇhÔ3³ � EؤíDÈ\çç—Üõï}ïbï»\¹ù_—4û»Ýôß7»®W—âo›Îd¾]z÷«^X±÷yïeËçœó›”�ݯ•ùF7¾íz¿w§åz¾ûÛón_}Úù«ëï½~VýΟ¤ÝùÝÜ-t÷ÝÙyw»»µùåóïݼ¹ðå_»×¾î.SÞ÷Ý}ëæ®jò÷îôÞoÞï_;¾õï/Ïy½ï£Ý÷ÞñƒÓëÝwºrx`Br‰"(dÅA2¢6å+Óò»Êè¥ß^Ý ïvù÷×gÞñ®î·wWÝóÅû÷¶ò¾÷g½|çØ7æÞ^÷ßoÎû¾÷¾÷ÏwëÓ¢’hÄ‘ �(ÝÙ5µ(Hv†£šýû«É]wâíÍù½î‰û¯Å‹‚4NX0¢) �P$Ì„hÑ îƒ?}ïkï}êëÎæÅs~[p§œ\ 5ùåËòòåÇ»å¾këÝ^ýÛå÷ïsž¯ÝÆùW=­­J«^ÕZZÕ¿‹k_µKWê­ëZ¯æµ­•µ­êÚþ5oáz+;·6£bÛ¬VÜ­ÊÑm�W5µÎî¶**¹jæØ­sW5ÍÍmü[ZÞµ^ª¶¿®¶µê­oë­_­¶ßkm^Ûmf­mÚµµÖÕnÛ6Ú¥¶ÛlÕjUf«kvµ¶¥_ÕþéËÞ;t’„'�Œi1½Ýîè �Ýv2Ë�Žè죮»ÝÓ—s¸eîê]ïSÎ÷w±E:âï+Þî]^î z[‘nyҮ׻´†¼·w\®ëŒ%Õ-ç“6÷v#�K�wWnîräïw�{®Û»ˆ§iÛ»³Ýïve'—šþuk_Ω¶ßéÛU½¶ÕzµjþºÛU]­oêØŒZ5¢ «Å£%hÛ-Wô­U]Z×ójÛ[›kmËûrîéÏ﻽ÎäÞíÃ'÷Ýwuù콽ιÏ9ww»¸Ór1õÑ<×�sƒÂ^o{§]8»—1ÂÙÝSÞô…É“²rsÞ»¹»¥{Î.½½î¹9×råÝuÏ]v¼Î¹977rè[�ïos]/tŽ;�»;»¹Ý^ëÏ^=ÚñË£¤dîị«ÎÝ{½ÝÜäâë±wg½ïvï{yï{ÀƒÝ ÜÑ{׬õË—NF%ÎÝïzy»–Â÷w®]{ݼîìG{½xæNL»! ºì÷¼^{ÒëÚ%{£Í{Êé<é/Bçw^ïx»Ývðì÷½½Üw{ܧ·py{O{ÎnÞÏ@vî»—.ìîèîëºuÔNçw»ÓzFõîïuçŽÝ=د{¯Þó¸÷wnè‹#Ýç{×½î÷ ¹•ÍÜïw³Ýw�œåË„÷±w;’úµµöÚ­üÚÕÖµ­ûV´ÛU¿¥µ¾ªÞÕ­zÖ³m¥mm­¿š¶­•[úkUkW›E±j½yQ¬E¬ÌQ¤#RbÅ@j2E ¢HŒE@c` £b‹a1¨ˆ“–…–*C]«oúvÚ¯­­vÖÛÀ€”F1f� šh&lQ±%%“A4bHÆI#Hl¦‹0˜(š6ÆûV¶þ¶Ú­»U­üí«Y[5µ«Ö²µ®ªËjÒÕ;ZöÛj×¶ÛÚÚ×[kí¶©¶ÝZÿ ¶­¿�Vß×Vd ©-£`ɱEÓDBe&²ÈÆŠd¦Š¢¥1Z˜Vl#%°È(Œ„ÑI±¥†H6ˆß[mºÚ­¿¥¶ß«jþ•µÿEk[³VµzÚµûmWö­keZ²­¶¯ôÿX’*D ²b› Î:-Fp�(Ð,ië¯3ܽæï{¹Ä½5Ë÷¾ûë»÷^Ó U’¤*; �;‡xwb%4’œ³ ÄÝÑÃ…—›¹Ýîé½oeyø»§Û‡×S¸,éç^K»ºt3�îè½ÝÞïyïo›èÞ}^å¨hŠÁ¨ðKC¤‰. Hвf£»ï¾yûï/sïwºéã¢s¯8ôí¸çMüuØzîù{Ý{ËÝûï/»²nþ;Ÿ…÷q�tžwuÞw—³¼ý÷¾ü¹=×Lß»�o=ü{×—Ã^—{w§ŸÃ½õéÝÝÆçqÞ½|ñŠ$KË8!Ý‘¡„QdHÁNìYr÷w/\ëÝëº÷{®^û¾úûz7w];½Ãóåóë½'îûï®ïx.÷Ï.ëËçKä<î÷ï^ó«£§A\þ>ïÓó¿{Þ÷^÷W,y½ïwnõs¾ë‘îâ9ww}܃çouó¹ëÕÝÌ`™‚)Q ‘³<0hŠ2L‰*‰™ ŽW{®“ÝyuÝ=Îïá½ó«®ïžî-Ë)yïzyîôþ¿{Ÿºçºñ"Y‹”ȰH‚D²dì !Ðw»‡Ÿw|ú�û÷Uûî ÓËÏ:ïw¹{Üîï{×}Þõ÷»ÝÎkÑùëÁÅ÷W{ÝçuNï.\âïºïÝ}îôêQÆ�2d‹ “0 EÒ£�$J ™h!ÒHР‚AÐ dB–cÉ�4Fž~÷ß%õçwwsÝÅçWœ÷§vzî„2ƒNP.B=¡ ¡™ËÑB dR¢†b@bEA@a”Ê!8‚�'ìîÝæ½ë…=׻ׯKƒÜó¿{¨Þ]õïnsžë·œÜë»×uåÝÞêyïž÷~Wáówݹ^ë£{¼÷.o {±ï=×§»Î÷½ç=<_}õó÷o×·ÞóÍæûîú}Þô'9 Æë¿w{»ëÝáÝr¼¹Þëß�}÷”NNôõÝw½ç«çžG~÷µÝéè¿ÔzG_»éóë»Üô½yuÝs»«Èô/w½|Ý÷o½×.¯»½Üùï8®G¾÷½ß]z½ÝÝÜôÝ=ïx¼.÷>ûÅù~÷~½Ü÷·½{Þ‰xwrG;—›ÝÝëújÛùÖÛe·ô¶Öí«n¶­6´Ú¶–©¶ÖëZÝ­«¶ÙªU¶ºÕuµY­UÕ·m«nµiZµvÖ­ujºµ¶ÝªÖ®Õµ-m6ÝjµºÛmÕ+mikmoçmªZÖꪑ"b@ˆ”„b!4¦ K!,“C3&bFµmýûjš®¶Úb@X’I³" )4XÙ­¯µmÚÕMkUÖµ¦Ö¾­µ¦Ûúm³mëj×ñmZþ¶ÛkµZßÅmí¶Û}ZúÖÚß[U}moj¾ª¶½µm{V¶úµ­¾ªß¶Õ¬­k­«_jÖ¦Ö•¶µëm½U^ªªþ-¶ûZÖþ*öÚµìÒS0Ê4–_Z®­V¾µ_[m»mkÚµ¯é«Zõ­Mµ[ø4`Š1™AÓ3É%0…E’˜ŒÌ’ŠvÕkøÛiµV–ÛoÕ[ùµ«Ú¶õmMZÛê­ý+ZÛõZ·õªÞÕ­vÖŸqÖíwn£º:�8˜äíÓ�ÙŽ¸'gk§té]ÜŽN�Lîî.Ý;®—9rînìîîÝÃs»¹Ë �:îÈtâs§sºÔ…»sœÕkWmµè‡»].î œæçg."Nv!™$ˆ"Ótæà‚(°`§w#ºît¦E—.† ”e1ÎILçC»§w]ÕÌ®p±Œ;®�7w4“¸Û²J™Šd¹q3#9Îp�Ãs.9’‰s£œ wvF#¥Òn뻫¦ã�®�:)ݸ†åÙ"s‚KœÎ]®t¦»¸Lî·D ›¡râ\è�×Is¹sD“Ë®âêé˜Ì\·eÈèiË‚AÝ.܉×3Nu1»­Ë»±LSBÄ1(îîp�£m¿¦m¾Ûo¶­f¶´¶«}mWôHÍ¿~ïJþ½_Ç®f~èw7~÷»®ÈÁ?<÷ίwww•ÌK×w�(wtk×s»ï¾ö¾w½ÐËݹ2{»/•×ËîïýÝw^^k�;«¹÷½==Û•îã/]×w½Ô¯Îß¾÷¤›¼½î½Û«÷tß›¯¸®»¿/?77ç½ÔÓóß¾½Œ[îâ÷tù®„9¾d÷wi®rSœ�ÑvòæNë޽—F¹K·$ŒMÎîé¤f¼¸)÷u“ò﻾÷¯Pýß/bŒæ÷»$‹Îf¾ûÚzä}ûÞ^]ùߟ{Þï»ïWuÝ}Ý.vcÝÈÞ~^ùËÊ÷º]ÏÞý÷Dß]ØÉÝåäÚKˉy¯žœß}õzßuËÝÀ€®_½ùå÷]�ç^îny÷ݼéBùÑËžn~wÝ÷¹<üõ1y§¾öß"w=ïzï½ô¾‡wÏK®¾yg~õì/œý+²bŒIÓǹLýîÞ”î¸ÛŽº/Ýu=;û®wܽÔîýî·åÈÚ—(·îÝkÈç?;˯ºv7Jeë®'»¯Ý¸ù÷®b]Úïw»½N|¼ÙËŸºãœOºçwÞÝ=×~ûï_wuî»ys»u|ÇDÏ»uË“Ÿ{»·%ÝÛ÷t7×tüüýîøa”‰÷½ë%½ÝÝùæøsœ~ûï¶ýïÕéw^W›Ýï}w{3ço˜éÌu+•ÇïÞ÷ÞíéœK‰GwmÝû½ï{ÞÌ—îäE7æÜ¿;M?.}ÛóÚ|ëév^uîçç/½íã˽ß5÷Ý÷ß}óݺæìÄ�ν×E%}Ýús_(½ï¾û÷×_>öìîÏuûßo¿/_.CWÞ÷§wtºsµùÔ0÷ÞÞ�—7ºç•s½÷ÞOuï¸Ï/›çÙ¤>ºåîAî÷ß{(¾{×nîÏwB¯—¾î¾ë¤Ž]ßt{}÷º{|®–?uÂIÝÜýçq§¾÷©Šüû×~çO]¼’üâfyNèMË‚gîê=Ûóæòùó‡w—9]…ÈÝæù½}Úå{¾õÑ'ÝÈŽ\óÝß{ëßuÇw.û¯;º½Û¤kžû¾øíÏ»¯ÍÏŽëó¥»×ºõǺ¼½/ݹ=wSï»zùÆ÷½¾¾ë3Ìû¯nçtÛžï~ûÍíÝ ?;Þ÷ïr—w3·uÎë·�íÌ÷ß}<§\c…Òïw¢��|õï/dún¯�ïÞ½>]îïw{¹û·7žöéÛ½×¾EÄ÷a÷w½û뺹ïw¡Ýïyâçgwc#.=ëÀfo=î¾rJ~î>îfouÛ½ÕòøføïÏ/5ù{?uÝ×>¿{]ë£?w~r+ÝÃ$aÝtwq÷só”¾ê÷¯^»Ýòò5Î÷{ß½_yÝ÷\ÒïÝ=tžr¾ëŠ÷rw[‘oÝÇzï]Ý0oÚÕT¶­¿�µÛ­j²µjþ6ÚݶÝUT¶«mWkm]m´ÚÕ·õ­Zº¶¦­ªí·ëU^ÕSm¦¶íZ´Ö¯mkúÕj¯[mÕ¶µükkjþ»omµµ[ß×�.�ÇuÌ»…ÝÉ.ºw9×:åGܺIƒG"®—:î¹ÕÝÙÝ9ºåËsœë‹ºIu×bëºæ¸Pws»Fé]—]¸×Jâîà+—‹§wuÊèåк»®KºîœÝw\.’#¹ÁÝÜ9·.§eݧbì4ÉvíÚî“•Ç]»»9λ®wwN“»¹Ü¢îî»�Òçu×t�Ý˸r$\1ˆFTTPOæÖ·³IŒE$hÅE6,jHÑ€ ÌÖ¶½W„_Ô\·Ù(ˆ9tÄPr�ÅÊá„Ñ Œ˜±¨îáˆtºQE‚SÕÈ*f,îÜ�nêæ¢Î\FŒE�)Ý»PJd¤LW.š.W*wsŠç J FIŒ“(“DŒÄÈÅ$îå\· L†@É!Ë…£ŒTL±$îèÉÝww0nr »sºà “Z #b3î°!br¹«ÖÚß«Tß¶Õ5·×ò±¶¾îˆÁ\ܶ»»QlXÛEXÄçTQ¨¢£skš»º¨­°l–s±rÛ›-£œÚKœ"îíG-sD�bÎjæÑhÒWw‚‹1´–ˆÅW5Ä´r�Ø�“kœ,b bKÄÙ-Íc•¤ÔmcQ[‘r’çHÙÝËE±Dmæá±�$W:kŠ�wu\8XÖ+®Zç3u·5s³UËFÚé­Ë·uºîå�E£ˆî»Rl`Åt¸h£Ý·#Y.W1ŠŠ;mWóZV«WÚ­-m­íªµö¶´¶Û{[Z•Y¶ºÛY­•ªZª[UºÖ¥ª§ã66‚‰"FP‘¨ �D”„ H� dRDhŒfllš6#HQHc3E‹”C,2Ñ@”a,hÃ3M`‘›0m¶ªú®U&´U�Z�ëm·Zµl«_×[V¯m¶×mµKU©ZÖݵ¯îÚ×÷þ~~çà~~æ<ä?ëoónçŸûñ_þ àþÈÿæÿ>¾_ñ`)(ÎÎßîYÉñ_ð*÷±ÅÐÁx9a¡ß5ÎnÙ¨¯m¸ ÄLA&#�Xž°JÌç$P$døÁß%ˆfÏZVÜ�èl]’U¾=)hØ·7å4³û�Jñ‡DO5•V?sãgH„Ñ&µ?¦¹­-Øì“ÍÎbÕZÏz–Á«¾Âwè·4žpšÖ×g­�[f:›Ö/%ÂBÆ‘™ì ë’¬”w•q�Ö ºÌÈPõV‰Ì¿7¦Ùí6äÚh‘Â2¹J^޹B^e"Ö".c¨Ï{jWe 6™_b¼Ok§n\air÷²†ú@^-cT²Ùa¼¨Êw+ý†áÂ0bz�ÌÙrÍšû‡ z®‰† 0‚…1ºAŒMÂC ¬ú4µï•+Þð«auš·¤1•0ð g•k—Í‚Ä+s»iía3‹»ã¢ÔôزL¼ØnV�„Ë[ K첊[]'(Ï ×¸lqN¢èL.…¶ÔÛ-CØ“fœC:г"[Oa £l–œ&Vt„ò–J7E4@]æì‚Á|ôf/\Þ„XHfYÜžaã|çìâÚ[˜,Ð0Û]³öІbÂ[V6;ÅabÓ\g=îŒì}ËGW@°Ä”grbáÿ¡BV‹Wá|Ö@ÇÄ^Yxç.©e�מ:æ:¢Š¾:Î §ëuñ­‚”r¬v<”=qè vÛn ÃÀ�OoÐÍÞEìc«WfF^/�%ZÓOV˜v5ôB–¶ÚÐ�êJ“ “ZŠž�v\ÇG!qØÓàʉ³“ ž åWs»Œ¾o·Â­`½<[¸¥ßZ$†à𼂓‚tÈÓܬ�rkZõe¤Èn+a‘´ƒï\»ì§­B�¡e§:âî•´vUê)æÃ¼rûƒš5±7…ÐaÛ/¡Õö{—¸¸’ÿ§xHˆ=bìY +{ °Úá*×a4h: ¥ b\–ODÙØ$æ?ª……áøÐð¼çÁvï5TdOœXCŠß_6Û‹uÀï©&ÕW…u×W€�ÞIã'ý©ÌÔé:£t£É¨;ïdï»Ð^Ïzƒ{1ÍììâÇc;¿‹ÜeÔ‡ý1äzAã©¡Ønº.÷¬÷a೬žûV0yA«ƒÊ/YÁho;Ìì®* ” XÒÆU«——�aó­ö+{²Õ¸Ó?–j`  Pé@ z¨â¨A'Ç*ê3W× Úökb,»�áå›,È£T&�Ù£)û&7J„:)Ñ™ùy­;9/4V=¦†=%¡ D‡Ç!÷œšsJ‰[˜n@®Û•yÝpq({¬ Yô�ˆjP(}Uxu;ÈžïTnw«W×0.D«�ÿnŸ"½Âw`j È óIÜdbeJþb•‚85ÍthȹÅÁ´ÚašQ¿%ò°ü�åõk|ö,ë=“Uã—È ¥O~š¸æñ¦wºŸä8 ­›ºR¥‘º˜ÎUˆˆ%Œ9ß²: [)"÷xQý¢¥Ž 1Ú—¨LìÜ×îºÚÿ‰ºÄרà -ò¦àQ cˆX¤ü!#€Š§)íð ühŠ]ÁZþ`”PÌ.Û[:ºÙB‡{ƒ˜Mcw�b+å(ÏmÕ \y³üÖub,Ë©›qùS`bÛÄ8ã·ö1MÜfÒšyÑ8‡Ü¾C½A`´‡µ ™œÊHjå^„F$E¾Yƒžç-U±s¥¾0vÜÃT6[œÐ,¬ïv>gŒðOªÀ»F¥E5�öÌ `"ç]ÖÃëÞÎ! GeCG¤~æÓÐsùª,ZøA‚ì ­/Ç®IÍQËûËòÖ-–Œ#8ì—Qa¡¢wE§æÙð`U8O°ð F3—„GTÁ^çÛO‚#2övÇr´�PéE†Çù«PÔ°"â ¼Ø+Ìd-—ÒYè÷ 1 ¼0U¦ý£¤Ç7E-,aÁK6Y:¨sn) V* ‡–—Œì\†üŽ.”à58!kçs›–ÅÍ®F‘(×·lç“àÜë>ÑDe`}ü¦ý¼Ø4O8WÅä!µ¸"t�hùÕßÏr\¨$ñmŒÕ_µ·zxš áµQ e¾Ï¯¥¾:S ¬{�±ƒ¸7U±›ß¶pC6•;=ÀUÛ‚á`µB¼p<Á&�Ÿwö¾�¨‚–g½¦®Õ~®ØânB‰$`Tu ×Îyi¥?0âÁ£mW…88é†u¥B0ç�´3(hffV P¡3]qß× ?]ôîd›„H�W"v(Ý…|¶þ™ÊI£†Æn÷4$|%d*K@ Ú¯?Õ1úVçÈUNüp:2aabΪ4Š Â­hN®f"ö¦iIõCH9%ñTÀ&vŒqT:ú‹¶§  ˆò‡pª ™Üã ÙJ‘M%2Þ×¼eð%Wþ¬ò´ž�ÞÂÀäUã¯^è Ð¿Ð�è_|¶¾ÞÏp{FÝ&?‚e ÔfŸ¬Émôäq #{‰˜-=šâ‹jO0WtNá0`2ª0ÖÚ‘ôå=¢�|%Æqí”×ÚÝæ2§w�œ¡Šy2òñçoº ylnàSdR”Fƒ&š�­�¿Ðª¯ñ_ѵþ*ßÜÚ¿£@dÐE(Hhr?´föÇxý×Â׿Ž=øäk´›Ç˜>c8­ƒ�.?JÙÊ�³ÊüëÐ+{@zf%æÝÇOûM²Š�n†qèè9y×ç×Ôoßy{ªé³˜âOõ[]ß› =¬˜²þ³{ÐÆÁaBà}‚·"qMµVËj±\•£Ð–çƒ6ÂÔ”R>ß%bÄš½0ÐnäÛ!–RÇó "ïâ×–Âjeõá›%«hi!ú¤h»cZð�‹~­°?X,;1ŸÊ"`þ§ás2år®êï@„Ö�ú�¡ãn݆§Ç£‘¨ß5à‹Î¡‰òܫDŽŒF$¸PŒþ å¯BEnûÑõtwÊÚhöºk}®W2Np>7�k|©b¶õ"¸¯‰…s}FÚù@‡î=EÚgmh›€�ãt«XSd\!â½°édÊ�X3ÁÖ_u¯‡ÔŠ i�ÉKðλ�×05Üî”cìp[ò´Ç�ÔþzyìmDÓ Vdß‹Aa1ø7\–fñ^Ç\“ÒÒ°18WÉqžüù†4 «ýœ¸[íDÊK‡‡nFX¸&ZÉsŒPN°Wl*†BŸ‡Õ~«õÆåìÓò ìGçÈÛx„�‚L€¥[.Š{=$ŒÂÍ›OVSB^k4¡ŒÚ¬ §Öæí^•¬<¦±Ì«‰aH8Ìz“(fçUƒ ~�D× 6”H²ó¬RÊuÊÃdf‰ŠÙ–å)é u¼·¨Ð=à5 áoz*^V^Øp§¸÷ ²ÃŒG⬬Pƒ0lóÇç‡üÀîcÉ'ˆ·{Uyîæ¯á µô7;HÏÈ<¯¤*É‚ìj.»ˆ»Ë A@�ß> é öì²d$ÚðÂˆÑžŠ¶QÒû&›ÒJ;BôНuzŒžôÈû[p¨*HÍÁ”‡¼îÉö9ñiëLâåIšÞlÞ5˜SÔ�©_IŽ¥‹ö3X÷!Ш®½ù¢á$7ö÷¡Ccˆ¯éÚ%¤7¤xÉp 0‡Æl&h 1ukJB)ÎLTµ�?0V®³`8¹æ,z«%8¼3¤Â*¬@5³†„WEãgP±Æ1öÒ× Gš÷xÛ&Cn%�°ã\â“÷¬F¾[1u�=ï‚V£î‹#;6È Q†±Ò“�P1ð~B€-t3+ÜÄhà\>H®?¿\KìË=3ˆ…’³²¬úûÄãhOx˜ÅØ”Q!Œð¬~bVž–cAåðÃyÙh­ç™ )ÛŽúöNä8K 5ö<¿u;º pc.lÁ:ž‹‡W‰KF—V¨888ÝD&šÊ�Ÿ�ØNsÔpš¸Œó¥u¬‰5ª'jýïYË`î€4ލ«iâŠ×wœ f<¥B d®WŨî*‘�Ÿ dY.DiÛÆ\B‘@bd%ÃC¢³´ú`⬣pÙ˜²ÉåÄà¥ýnˉñc{uG9·ËÓž¨¾©!Κú@å�ò–HL,7¦æ$4N¬gr¶ýåÃiSð0�X{Ñ(&á[ÔöRÞì¹çîN©rQ­|ÛbÃ*$¤ƒ"DS>ų-x8çÄ áñ¾¤Qí–ÊÅà:_;Ú¦á.ËÀY´Ÿ×|ß8Vãf!˜ö²4;«‚ç"ú8 Ö¶w·ôŒ‡ËaBÁp–Kcn â`EÁ�‹šÐ#üêei—jÞIv˜À F[yZ¯«ŽŸlS#, eÓ½µjokN@ø½ ›%\ÊFÞ0Í�)ÁlåùÆ#³ë�Æsñʂ؂¾bnnÂìLqèÚZ‡@+œ+¯ ü˜=rÐû:?s%ß‘6÷cë›—=o×?U‹œ½gYä5Ë\èQð “Ï%ÇÁ›®¬#J_¬ËB=O¹Õ›oÔ–,>Ä4U&½ÈÐ?H±»3±Ôëûcá¶Ýy.õêK—yˆ½ƒÍ'l¬5‡Ýy MfÇ `Ã\ÁUþPÊÚ'Su f½íXh†ŸiÌp¹3ÆOœ[JNdýÖwýìËÌøÒ†Yo¿‹Ky„Ý¿–zª=ßâþ�c3ö<ˆú§t‹‹:±16¾q¾Ý”8µå !Ÿ¥õù)ƒNmÐAÃzŽ¢nÿ77g6²ð7kß$ÅÀ¤}:DÅxÐ-˛ϟ¥_^Dw—žÕë¶ûGŸª¬ ûrj�Õ›dÉ�Dìnqz¯MFêø}4ØèË×µéÓ'�>ÊÀpÖZ‚’1VÄÛ~ î#Ka™l²�F³CxHîJPõæ™å¯8Ë è‡Aê­<Ï?œrm²ÛÕö.­_9t†êTÊþ§w¦ë4z'/1óШ#Ûñ2 òuÅ�çBÀF ) 8z¬ÍbŒ/k�ªþ ¾FâÙ,ä÷8 �”Úë 0›¬Ÿò´²OôEÁc˜üs,”��-Y‡Á C¡¡€Âfè˜1‹Ë­^.�Ø#¡»oâ²÷÷âÙ¥„r¯!žtz-¯@ûv4Š{xƒÛo6ïÁ‡§ ÿ·%`R³ÍêsÔZ£c$¡{Ø”MÖÊ©³®¼àî9(t{ü‘,�‰fW½œhÇ-¬ÞJû"|ÂÕqGß샻 Ì‘¾ÜÛ&¦7ˆÅûË<6Ÿlw»�¢Ý?y�TÞiãM…-Xsû‚ã¤rÒ~=ŒÈ)èF ΋‡´¡q—âg;¼ãg«^7²xSF“M²Ù{pÙÜÒ”kóü•SQc÷ìóÝ—¼þžzïÀX¾:«ˆZµØª`\²’M-ÃŽç(Ëk}£5„D$ !^ÓÚbo§Bf–³£»ÃV0*t*6«¼aóœ”ÂÛÆƒGVÙ{ˆá�í‚*9Ë©U#Hw®Ø9 Óɾy¾V( ÑÍç¶¼ŒKa°ée ïK È?K($ÆÅ m4ij†C#§¨XYVÚ B®ÎFG“„AÞ�Kï§æ¶1Å\å½X´0•ÿ\2¶�€ \a�lY^¯L@—e>Óé¨3]*ÝÕð†ª�!»ý ´¤|va ƒÜÑšžÐm&ö«K¾‡�9ÑO/’~‰]C“|ë Ò ,öjKýÓtB1x¼«?¤9±Üô6âôÂð<^–«Ü§ EZðâ4Ⱥ,Œé BËõ­+al*uŽù$DÚÄ;6V5ÊA¿çW1óKŒ-»#Û#�!;ë Bò ûBᬞ)+iŠVÝšñ¥"õc€¬€ÂàZôÃú‘/·ÿõþ¼Xïçíß–ßJ°=”ø!?…5¯.$à1~ViÊ�T9¾3‘�5‹ŽZñåçuŠ{¯cYý¸k[™Ë¬„²fÑÂZ—Õïè�_ùjmqO+cmÄ ´¾“­¬3“†žg‡æ4˜pb–1žd»6]v·Ü.{¶¤nšÉÎ(=T,±¤^MëSõ²¨mt¤6~i×tÕ ƒ ÞZÄê–·lÌÕË9ör¢ƒÜ •eØÃ¢¡óp 7k¸b¶-¬`½`ƒ~¹Öòñm«ÊF¢a¡Ý¼E›5ò› fÐ'fÕ�”1Èm;ö/¡äÄZ´²:§ssÃN®YÓZ¥ÙòÅ»1I[Ý ˜R²Ü^Ïc ¦+C jkë„V Fñ^õC�‚ZÈÚN¹[ôöû³€¹UÀ6•. �ŒÝRZ‹)K÷<¬<¥¼ƒ×55Ýï¶ûL·°JI!±`îa\ù‘Å÷òÛ†(\bj³ÚAö<Ãj^½– ãÞûÒ>=Ú9\êÚwM9•ö{>lp ÿ¬ÂnhhLYd0H”;Áö£zÃ,h9xÍrÒ<œÜ1…:ÊÑÑ4–ðI¥¹Êm˜/ˆ�q½Î[™ Òª4áØ6ú3A³o "ü‹Á—¸÷9VO$&ÒÓÑSûù"œ‡× ªe0œáW¥-“Ÿw ¡Ù4'(M‰ëŽA �Œé ¿5Ë:K�NÛ—›áó³Ãਡ–[Ö¤-åAóæA¾Íý{«oc\GX[¥v)¡6ßRÁc¶^Y'“‘YtqEênà{bÔa$n!¯Ü$%¦MOÃ[CêÂÚ[yáèH5—vÍ5œ¨xÆèü€EmŘÅîÚ­àºy{�Éü¡œ±®‹ü­Êp–é0´ut`ÐZ™¯-x]¥—½_§ºÁˆUÝSÀ;MìxÚ“6 ~@x&пº:¥=a,ÅWÇo]§¥ Š»Ž1ˆ4L»\œE´Õ%Ù¯‚ FŒ¹îdÞÚ Ç ¢ôÜŒá¶9¹Çƒ#Ž:À[í䆼)�ÎÆ‡¨ÍÍAÝg k /CqVos3k¹-Š’`ÆðN“\ŠÏ«¼æ¤Ë‡ßÒÂQ¢ã'ùéS#a¤Â3ïEðWÂ)‚GgoKðl힘.»­Jëv2d2&éé"¾sVîÉ�µœFïl·d¸9šEP–ì‚bçd[À{Îó2Ü®—gÏ´�ô* N•ÌÔŒ9³¸³c¹} Î4ÔNÒeµ¬˜×DŸûê0[<$S¼”\0KM‹¼‹¶fƘlfnA‡ o°ö'm_¤ Ç,þ@Âf²&í5¾R¶ÔÄÏ eýʪÔíŽ2ÅѲõ»ŒÃ[<±)½�8AŒ¤¹¿gs+P�jšH+èrPŸÌih‹ÛZ21Q›´+^.ÓÖ¯ãÊ,\-F¬�…7åW_ ‡a̲XUÚ_ÒÊÁ< ͬÊn|q ¨í]¯¶Å,4§â~ –…$”v!…vg²ñø­Vû {‹Ÿ`kâEDŽ䘀 òÀƒ¨ìï›§}g÷ÎIÄ$06�†Q·óXGloZŒ|>æ ˆ�æ–Ãô -ðNûÝÄ›§ƒ}Å/Û?ÞÜsßœøn‡ c •|.}O€¸båÚ¼Ž¡­\2Œ×cÙî²”gs›V ±ãAW6õ¢Z'B5v™ieú~¶"ý=¦B•¯¸¸¾à)AYÓöq+ÛÊòtÚËÞ©‘°L ‰`±#+ ÛBPI�t�õp2³EìW7®0Pz˳Ø”¬&0Ïç>XH•wæü—r(8-¯Ã|µWvçmbZÐoaœsq™›½4¸õ�mN ÁV¥uî:žµaòÝS•@ߤ;^EI!ÇŒá+ ѺõÐæÜÁ„Ñ�Iæ‡Â Zé°êHט`ícŽ"ªAµžÛ¶JO}cºä®:q`³äüØçPêäk1)‡{n*?bCô: ¹d 1÷¨m˲綷ƒ3Ùï;ùuœ&BÇ&ÁUt|So!±ì¥%øÆZ¹O“%Ž&ìÔê¬Öÿ¹9Ô{´øÒ.}³h_¢  Ôx9ÍÍ>Áɘ#Ã[<%¦.½yÛí™ðµ�$ ð:¯) ÉâÄæ‘Ý#q7•m?…´ßQ[0¨ì¨œ6ð!å½µÎlçÍ—–ØàeÆAr]êXPIQ¬×WâUãAeº®rÐßÒÎ.dæ67aÁ¸3Û;^‡ }Y…—¼Æ÷x=ÊH‹Â¦‘°›&$lÕ�5œµA@ŒÍ¸°�&Þ+v{«¹PÃûs�]4üœnfL,a»â�H'l–ȯDí/á�ÐæíÒôèè©Âsr&; %œR`ÚCw¾¿;#½îü$µÜ¸IJ_rx]ZFAéï�¢Y ›Ã´(Âï¿S½o ¼,ž4\ñ¿ P%Md¸3=ç(µ`bÑ�$ îø¾Œ�ör%LZD ÖlF xÕ¢ìç,¬؊ôlî$S�².Uƒ ŠõH%Ä/œ–¨ÈÕ·×tŸ‡Q�`m̹ƒÞžA¢76ס…F©L¯âÏÈ͈2HÓg˜?˜ðp;`·ÇZÆjݧ�{XMïj”˜~G›ç{azµC]Æ‹ˆ:ŠzëCÔgç�û1ù9�Ä›Lsš'¦£áÍ”Ÿ‘ò˜}À|×Y™Úbû»5Ñþ|ßxÁûLz·¥iaeˆ^ðCÄ”Á  )¿YéÉËÈbº‚Àb�÷ËËÍ­ufš|zkÏÖ(ÐÞ/*PLþ®¸ÍPY�k#mox»ŽBS¤ºK™ho¥W^P±Ý‚�²©h¹Åƒ·z�ËoÊ]\"‚4Ífœ¹˜¥Š©l<ßË !ô |Ë@;žÏc¡Í ʽù°ðJTÕ[å ˆ¹bõñ‡¾®©ý�}ÏìÕ­âÍ«0ÊöX>LšHíîSE·¥Qîy.˜üš’1 k­´€úÈ™“Ðæ™¥¬é¹])ÛPy®y/ŽÖÎW~Üb‚ßdóxI’Xµ²|ß®lw™®=ïß#^º�ê§—làä3瘼¬þE—ÁÛ»Ðm'#/D_ÖÊ'KZN†%úâŠÐË«ãYŸ²CÔ)Ó_éu$^ì0±š�”~ž"ã)vðÏò<ñÝ:äO�ª)OEõúéuB<×DÁP·œ˜b…¹F M•¸½‹æ+ø7%±·•_=íØäŨ†dÓ‰“ønl@–ꨋ»Ü›i�–B?f®<öAã˜'û~ïáÝ�é Géôõ¬èAå\Ü%7Ψ‹ù ,gtá´ž³-ȯ S¶²J+1؆?iô½&ÄyËB«´‘”“A ˜LF‚‘çt´R·Æ±ï^}±'^ rL¡x ^“»g·î"OœWj8Q¬¿‘Æü€í¨†Ç¯pû““¸ÐØ«fâIf\>T;ß+rTŸÞÝÇ2ÅA‹ÕÖ¢Âz`r98Þ\ô/[ §ãƒc*ÒR¥ßzz`sªÕâ˜5¤)?Žèûh 'xf=x†wþ[½ç¦…ãçÚØ“&Ét<:äÑô)¹*륞PîŽÀÿyñœ[“Ï7x(›-ÝD£Ýœ–]°<�£z€žˆ¨£…d»Úp¢ »a©™ìòˆ"䊖ˆD¹H> Ì<õ|º‚¢`€ 4æ 'ˆf*}­ËM¾‹ºÖßôP?e­xpq ŽO¨âó¨VAÇ ì»88íj<Ÿ?èÃ}\ÏYU˜.=¡!ŸÕ–4„»ÜâR¡ö4ã§8Ç[<Ÿ{ `ßу$¼�— A�Ck±Oà“"þ°rR¢ 3—ûQ:¿-²ÜÛCžoˆ/G/µ,³à =š»¡ÚGg‘<ˆ�«s±&i‚ ¨ý<ûpûåŒ5Žd•ŽÜe§�ëˆî”Ûžž5Äž¾áGvõm=º‚‚$d‹tðÖ†åÚç«Fá¹U_”ßêÀM Õ†¯j¼ÜÕ8îLã½mšˆ$1dÍSZ‰¿›HZÔbÇŠ¶v**óÐÒI¾ þT ˜tþ;ô4Váš@C{«ààMóBzkÕQÔ¿°ËLÀˆîüÌi7†‡ ®^× u-ô_µÜ.‡6UbQ¸�@Í^FªLyG#�jáá—\á"q® Eˆ8Ðì²½rÒµÃáÁ8g ‚e›l3–'éìgËGxœö„©B¯Æ†§óæãñªÇd¼`Š“ÞFc`j&3é´[Õ@¤À­0u¡Yq…¸ê&Y!@c,!ðÃ�¢@T#8Z¸šfÁµ£#H!¥úDH!úX ä–ûeÚX±H m¶†ûcµ$Qg’wNk Èípvô3cÛ¦×w­œgÅÑÍìW‡†ËÃ:ƒböô#`FÙZSЮIÆÆîÞJnE×ö(B^O©€í\Uá2�;š{£YZ>çw/¶èX<Ña8À; Fôë6EÓv`X0ËÃÅ0-�x\$�]�ØJôBÐ~Óo©”öân�»0%>þÝö– M^C °:¾Ü¶¡¦*׸%ÔÖ Zè ‹Î'r  7©X$Ààq­ºc½XË,Þ‡`9YÑSé°›Ävé`”Êäxµåömy^µ»èVˆ�o•Ó0žÔùk±«&2ÛÄ7NãW°0øÏ–ïøįè*v|ÙÒ5Áî±Îv´.;ëC-ès[Ǹôš1ÁEŽà¹¼1ß)�9S¸TB*û6’cx�Ýñå—{±‘V®¤‘v²'„¨¯ÇÓ¸pˆÈpøÝžvn[‹ß8‹| “©‡zìæÑ ¾¬¢îø¿ÅÐÂlÝ%AsØ*ÀÓ Ó¢“ Ó6¸Ü�P�BØ@eØÉØCŽXµˆÁísUªL^ú¯—nýÓ§{3µ³måXd1�0+µ†Ê\m~ 4бpO{)TjEFIuBö¿1«1![›,<¨|º”ÄŒ‚àwõ)‹�;ܪuÝWÝ�½xû.šß«Ÿ3#_š};oIJ¥¯’àì™ùz!yŠÙHò ”ë C‰‡>Yõð‚*v¼É_EÓ!)…ƒ›bÚÒ²~rÓ3¸ÅŒ¯PÀ1’ksLAuë¼øø‘<žk(é… ÊQ¶É©�83³|7¢ÛF+ÔsWiToØgøVzò¡ôxi_Á|om‹ ]l{¾© 0\ŒãÕØUÁÐ=óG5U®ƒäaa¶_o[K`$‹M½ó2\¶›7nQõ¨ôdv�X t€NVb¢èÄÓ.ÔÆ5`Èeu½Ù,¼.°¶·ƒ[d­íç€LÙ zËÑAnÝJÔ¬«_<¤FJé…‹rÐ ð_ÐX[t(j R#rÁʨ2<MeQFЩ›™&¶6yW=¡ßÆG¼ÉILÄ=–É¿®o2á÷*(ÌV�{R–Ñwn#™ááúÆ‹ÖzB××¾/<Žó·Í9·Ôª§6o)“t×fOÑ�z‚®Ï$¸`0è& Ìâ]¨,a]£ëØûÈ&Änoåâ#�ƒZ>.Œš.>ñ¯#¤R=»8¨ˆÉüÝ*ÖZó^~&b\”âÖ„¤lûɃL–ïLYÑ\¿/œÕ “ÂŒ¯ÂÐýêZë•Äâ;xÊ^뱸º†7i.aHHGFÚך`¢UWψù°m¤¡ƒÖ‡‘sHÓ .dÔ «¿,â£æ ådð‡Ë[¸º~HâbÃR†÷µ9L¬ÍKû…´-Y_GVÖH{ ‘¤“nˆØC‹‹±Q*’Ëve@ Zl{ ¶y1}Ñþ +÷©•BÜO3œ–!7Ô³ïàm„ƒ�È©'ƒawO”2ç¸Ø�!ÁõBËW¦ÉR óWßÛ´Ìç\û�w”ëv#í¸RÀ`²Ìs’nK騿Éé~ަ--ý¢VÅ÷�$§å„[Q�EIG4ªœš „žs梼%ãw» µ\"¯’~­7_ 1ý�Oõ6³l ‰ˆ7¬´œìA +6TstxŽQ ïö(I/™˜CÌúÛÚ›ÊÉMÑ2N¯,`àêჳ»¶Ñq/1Ž w~Šý�îÐ@عGm÷=énµ›ÃÉ._â¾²‰_$×$®¤ˆS±¹ÝçùÆt*bJ´ªÐ RŸ!î@ �[MoE¡¶¬Yç´îÅ0›�ù7wZÒE£¤“«zÞYz¦&ÀY7Ï-CHDH>ãg‡Íà¾CÇ+FÁGuéSeB’Åš¤rb)„kCó9žÝL7Š*œU"÷)ªëеöf˜ýR¾êïBôòЀ~%¡ï�¾ñ•8\e§šÀ¨7±ôu<´µÚd%Ð0,¯Š^1_uÉLýÄdõ‹0iŠ÷(¨¹ Ì€®–Q³POx[Ã-îe�C@]欚¼æ°cÒ¢Á +äˆZÐ{P<6LG5ײ«^�¹í¶«+%æ—á¸8$% ã\‡o·o†#Ÿ4ô)Ë2rzýÕ�Ž{»íe]H-ÕL^Dp׺=EZÇŸ§ß¡«'JXJ˜¼Âüÿ^ËEúé·yº‚7�)ÀåÌ"ô”.9 „¸ÖâáÀÍÒ‡gªGR`$³*/7s»1Ÿ{Ž´#:zôJ/™°7qM»¶a “{b;êÑ Î{ÐZî¨Ì¡<Í^ßšžÑÀ. Ý*÷cP©¸q´ÊnN5§ÌnÛ ,æ]?3Çìaã6Éa¢ñߥìŠîò·¼ŸÓ©ù|$3 ¨éGÎ`²�-[zzÞ>oÔyæx9(B ÕŒ9¾]¬pêí\þ½ÏÜÌ3… d”ÙL”¬5‹ï™—�…1%Ÿ2¥U&÷Û‰˜Ðd}†d¼fLÑ$ ¶F­©e‰¶‰X>ñ^âÌåÕ¸VÐ~æwÛ÷Ðç8 (qW¥�úÄ(’@Ä\�3ÒÕ™ÄH¨gmKk͆2ïÇ&K$�O¶Kž²�g@$dÂÕŽ¦+§dÙu«D,ßã[I¯â°Ò‚€�Ù„ñ$—™6»±%>ƒ1´ »�N8­XO*½�£ÉŸ`Þ5O|ãôÖ.úÂkröÉUè½7¥)@¦kšé°yü5É]‘÷øxLÅÈhgŠî¼Ä ËŠ½œ‡xA› ĸÖæ"ô£Ü¾Cnš½°,ú ·s\€¸[-­\Ϥ5ºb ßì¡w[Rg7Yâ“)Pch‡˜‚ „0€ÍûF—D1ü ù¾¾AÞJú‚¯Õƒ?rÕ¡ñ>i•§Óë­�,І"ú$ЇD ÐQ]¿­gRë“€l¯_‹b"§ O‰áñô@Ýð ˜2 4±uO¥/ëËå„À³Œˆ\2Î,ºÊXø½I)o �Ü�3�K›‰�¸¨–VŒÿcvhðÛ‰ÔtS¢W†ÐÚfÖv|‹úÀF­«¼ðU¿g]H2…[V*­œûª×°Ù9KlÊ3‡=/ÛuW‚ä6®žÖi…Ä ‰)ËȘVï ´�´(Úþ^óÐ~NÇõŸ3>Œí—Å u,íÞÞ .ØØË–q“¡Kѱ-àm‡`˜ó�cuû ›Z ka¥G6MËKÕ)€ÏëdÅfò •s§Òï%‹{íHÆþè=€cX4’qÛ1¨mÓkÈ õØ£Ã÷t·î*ÊÂÚ‰;T«Ÿ2íÀMdÿ�FqÛâ‡}~j�xOÈJY©6 €„~1©ˆ;Ó‹Ü vj ìÃ�¡ÔôœúÈZ3Æ2�Û?$ÑIŒþ?M¬Œac ¤ùL0Yl(qi½U3�aýPRþªv-d§g=QlHB+Ê [ÍØ{[ÚV„þ( [@%½iõ�Æ¢�� ÐX}-e/¡�7îLØì~PÔ7> Ú1,GNwc²À�–ÃFš d^¹Æ}”p£àßÀ{»ÅW‚Ü÷Ù‹ïÕ:ß�"ÜYæ—¼ê1³…˜îæ�Ñn`ì‹ÜÂ'Qe[ñw_hЊ à̤‡“ÇŽÀvÝà–âí 0Òø¿‚ÉšRõô¬Câ¹|}¼\Ôƒì^ÔÙû>å¼×a‰“ñ">}ù�,°±ÇÛ¶®&_rÞ¡rVGYÝ[�‘Ÿšò°/b»eP‹NÎ Âv½ ï b5EõÎhg3ÜvxDѦ>,+tÚ·©0ɳÀ˜Û ó#–]u¿xÚ¨·}Ønùã„eÈèÖ× Ù‰ÃäUq[}ÛÝP»9Àæs½�ç]Qà±…0x,~HÄ,{#´÷ r§np©–ö¡ŠyÞ-P_²7�yÒ>è1“�Ô9¦ƒ[µå» �Ž8O?R%1Œ8xLèy¾ˆô¯4ó»g«6òyÈ~¥9∎{Zÿ–€PPPR–þšÕ_åªÿnÚ¯ü[jµõjÖ­o}ûúÿ5ŵ–…J†bl=;(æ9x\l¨[¦ æÄÌ[z¬õT‹åÖØqâÞæÆShr{qÁ9ºÞÇz[)›ÔoˆS$A"ä º;�50@“§1Þš• Ä u³ASA[(4§†HÚÓRÆ‚Ä^ʃӣ,¨8F’=54ÑŒ;SM-pŒœá…Ž»«�'Ò `iá¥HT: AÓÒcîñwߊƒÂ< j¨ ²£] ·l`ª1 P`´{UXνaO­èíÿe�<#dTözž˜SæA7�áóä?J&Ž*‘F€?õ*+!~#ÀéþÛå¿0v‹8¹9>‘²){!FeAñ¬*áèì…ahJbŽ )“JESF”ÕÐ¥¿*‘AüÊ&‚Æ÷TÉk®ÅÖ�(1@¥)B OªŸ�KÑœµÒ‰¾· ³_û®YVô~0)HâKl”áj�ºæ°]ŸÒ½¸ƒd.æt»€±Yc8îW¾G`HgŒx[�´šiF™õÍ+{f©�Õ§N ÊgUÄįÜÒ}Ì €,_Á–”Ž`¼wrÎ:¢²*÷«.¯\—"Å+† Rú ½]ŠéÈÀ+kµ‚éh<{Z¸l”¥4Š™½ Qࣲú¶ço{ðË€XÀ^I‘½¦Ú¶»{´aUDšóYÊ…dÍB°¨Ž3 ènühöÆNIÖr¾†<B”¥)Ð|Èýçk¨|_†üÖÓIÏû/¼fVçUHq€0•S¤ú±—†Ñë_QÜËÔ�87í, nˆkß“ÀÎhþ~Ü-‘Ž—…v$Ì8±I§ë’x€†99ãÝ�·âߤÄ­ÅÀÄSœFW7Úföè·•L¹4Öú,œv7’õ%´Æb›³:s×ÌO«/( ÷{M_gæ~Uç`ð\ö¯R±ßvÏÅ\b5¿Ð P 8ÒaïÅå“»—ŸN@æßÅ<þï><ÒÞÚøpÉ«8?VP1IL¬jøœrÙdôï7ÌJîݽ{ƒ‰ò-ÜMY–l€Ý|¡„œ>Zô�°ô!>Cˆ²UÍœšì±Œ"|4 Ó‡Šù�+lÏeÊpö¶1E M?S�Üdý‹¿ c’=^(ØÔzù[Õβ�]�"7x{]k9æñSÍOW1 fùËLFØǬvc>æÁWè\傯îV„¿©�@ã{Òað‚ùŸ aUKS‹då³É`ÞǘK'.-m9æ 6â;Ù A Hï3* ªW¸ºÛ´0>ŒCövÁ_YrD¿…˜1·€¹^ÂÚ¸ñ³çËÓ ›Ñá¸>˜Ë#¾VŒé0xd¿A�ÙqÍ$\™+“¶!4f4?lÿ[} eÜ2øÐ¹ÓÜ–²k0g3~ ÐGdHî;ðJ ã–�}nÀYç¹w’c9hôNfö#þ0Wv½¯$<Í÷cŽüöàÑYÆñ¸û�Ê8·`ÅI¾;á^›ìÔQ¤{ÈxÙ®C·ü�¼ã‰¡ÕáqkëhAFÍœ{®þŽuxÐ8å¿@ç0´ÓXù\·Fb"ØR ŸÕÊ ™Cö�—ø&šÈ©Å[n1¶ÊL—í\Óný䎷²P9ÓÚºølƒ`Ÿß1ôJÀ\ùôôc¾ /]3°îD -Ä,Äïö\.R Y�R¤oQšË˜Ž$ÝÊú ½½)9$½42þX:m�|_¯kà5´BàÉAÞoMÝgi *öBqúc7¿·wHj¯(ê¬Øo) œƒµ³wî4Æì}If\É)@6{G�³�_PWÃpKöï)¹”UóöR�z[ú<)ÀƓчúäJh5õI{Gxñ­€rÈ„\ÈÕVèYR̘KxÜyÞUž­)pö™ÍBÑvø’Fî]«„=¶¾µ �›Á0·eÄöïæ)P † <�sG$§ƒUÍdq’�¼|löZ <Á3) ›NÊ"ýmL.ïE¡œªž�žâ2�›»­Z�ÇaqžRKÜ¢ñƒ´·qäü>•Ýp«œ=ÜtB³T!s„¸=õ¢ë·¦ˆÍÙƒ� ´\»šÈMëT²Î%Rͼ©d{ÄÛ êC ‰;ÄÇ…pÆ”Í㫊ˆÇëtwŒ.Èj¢¿ÀÀ€+‰,mÂ�C�…žþ#¦Ƥîiˆ ­¦bœõ§›OsÀö¶Ã§mºûJÊó¢Ûo3þšR€ ï®OõmFû‘Ú·ð³ù�Q±Réæ>’Æ »Ùáít{õ\Ë6öA®÷4•Í@(&~o,ö6F û J=ß"1zÞö¤ýsC #ãw­†<Æp^öB· À)Ë÷¹þÒ�J`=Mëèòú!ɼâ+¹(hœi–Òv!ÜÎy¯m _ wk­wŸèP”LU¤JëÃÞrWðrÞ"…>X0®¿Õjè–aV�Må¾|}¨ý ¨=ñT�ñëPPp#ØF#¦eÛzù×7;°uu–°ðˆß›61‘ÙDGz•~N°Þ×'V4< Àõ}´ �5 a~`æçxôT«h÷ˆ(nÑÁwòÍ+RÒÞÜ×BÁ¸G]wsƒ¿Á›ÐH`c¥¸(M1ɘÄgÛ}jg›è¸3≶óûÑÀzÛg¿?䥔¨#¤± àíÀùÜ€óŒÊÉñý‹£iî›%Ñ�C{Ùú6³Ýµ­3œ'™øCƒ“—Ο-Í>ÑéA„옮.W(ÝÕ�cŒ»5;le0’"»’)Ö{sès¼œ�žky`Á=Ž ºº_EÒ,dÔCZ•²ÓšYiB²Y„§k“v-“�¥ÿ‰$aYgÉv¹ÍÎ'ëîâ6òA% ¤»v}¼îBû‡+ª‹Öb›oò¼†Ž])¯»RcOhŽ3Æ|’eÄ;¾§>·/ÍòÃi ö²c ‚X šô�c„•Ó[ar8V™½#!Ó—6¶^7–âa[}Ù²5k´á©uÆä>aŽa4i—Àƒ§nÊ•á!$[P*züâ/9<+glü¿¯ØÃâú…\$¥ƒN8³Ê5ß¼ÔðGзñéÜGÒ"Ÿ>» Ba5 컂]Dþt Ëœ:ª¹ ˜mÕch6Á\ØMnóÆÒôáÎ[GšÆÖ.ŒWQò‹ 3h¢\Ìm¹”Ûg”Ç z�Æ¿™(ŠÇœÍôíÇß7bïT²É³ Tpì |˜SaP(\êó$òƒp9Œó‰›ˆv^ë­A>øù:ÒPÂXk…¡˜ÕÒ•Þn»wl¸€à ’æ ½@€ã(Ú„ÿl5Ó´Õ˜»Ç–�Ý›@¡@vÐŒ7™û¾^åb ÈØn¤ïd|‰Ž|@c�fœjÂK£ºÀ&ÒÛ`\T#�Š�TnZÐù:À×§´ðciÞé’Ü—m¦¦&«S$ð.xƱÜ\OÑ!­å!’_4ü±ƒë: DÒZvô¶3½ël+6CnHÈßjÐÔËN’fxõo]ÛGçàv´Ý®[‰Ün‡‡°¶àš=&(\´íÎÍÛͲŽtv^õTÂêTì@�¯N\)”YÝß!n¸ÍÕÍÄkHã—ȱœÍ�ƒ©€Ô¹­X;Â~رÈs R�@ €S±JR”ò‚€t1=³ô‡5–i‡ß¼ê ‹YÅøüÖ•klxC^!¦oÓÀOÛ{„m›læ®$§–;žïïž7‘í±Œ‘;ápèÐå°Jkº- ­–¿÷ÐR”¥ JaŠ«_‹=èg3üUƒm~üÙÇmã³ÿImT¡Êö7„�|oÒ­¼vŸï¦Ä•´zžè´Í£"鶻ޗ86nðõøbøO e�®Ñ¹ý}$ܤ ÞD»'Ø”Î�w’Í“‰K†èšÏL8r9�íðÇ4`&%¥ìp”ÒÄä�Í– Ã2Wëð Nz‘å# ��Úl WcÆ^Úsm‚.uŽâ ¶ Ê +·IÓ†�\*>ñ5Q‹éöσº¡7dI€«VÆBˆ­E®Êïø•·™k�î(ú llF.-b.HmSwM¤ÖYíßg#ʇjù¼Zù•”“KÑpâU+>tû+Ö¶â–-�¦¬Æw#‡[@�M°PÒ˸áÐ_îw;Ü Hñ:©¶�o=©-±ÍÏM¿A(\˜þ@‹òøÙèŠ!Êó,yàÌüEc }­>?pÂË{ú³õþÅ�“ëu'~þÝÿ3>‡ø�Aÿ&ŒßÅ2j“G }Æ=Ø”æ‘É-eÍ3rô¸©è+Fó8"T¡ô¢’l„¹ùö€/ã,RZÝêöD Ö0a  ü÷y¿×͹r,ü„—ØÀUÄF¢b=·OºN³L@,„tÙ {»[ ²êÉ Õ3¨û½�©Æó~þ¶1@5˜;d{4Ø}ƒ1:\./�×f&bëšò‰çpào:�ßw¼2“TÊËóÕ» o±ó·(M0-ç¯ÞSaº9+’Ì,¹Uå]œí7èµú2!šOr�¨~w0Èþ ;2föÊïß3j€÷€)E¢MoÄzãÓs¯°gÏ+Î,¢\„JvÇÀkÙØ9mª€ÍÆ;äöqëé½ÐÚ­èq «¾6Ç}œÄL”©‹p€­b$34�õ!-8­A9�=ÜBn ]§êwvŽ`2ŽQ*Ï-‹à[0ûŒ†å~[&+g çmíe$}ÕhPÞ½»a²Xr JBz—e‡1?–âSë0b°’ÄÂ?ˆ»óµàu‚ßqNñn…"TÉ=‹Û{Øs®%ºåó­Ôߨ©�ëd C|PlM8,ƒLàãÌï´ÌãJ�÷ °|¾6}þm£É†ovš`#@žÆ¯ï–-óݯûàÐÁá̤Å\ Ÿ¦ÁP±·ß³œºûß+¨çä�ûN' ŒÖÚ‘¶¶b<( :˜xL—?â'Íl`X¸�t_¸`笵چˆ£úúT2lS+œ†6‡X¨œ­ÑÜ>b+›ðîúÝ-99¾ ^–¼ý„<i¿›¹èíĪcHÁXë9éÄ› y \mÛ"ÛâÀ{Z±æ…GþÚ2ͺVð¶Ö˜[Ë«j;Ú3ˆeü‡'Í*”ÿν™¸d7®Fq¥ç+³HÃÆ|ç!÷ô}½�e ­îÒä™ÒG÷&ÑkbN!XÚ•.dõs‘t®/ZÜË*twßëoX¸�-ÒlœqËØŠv f}†9�EäÇ«@y׊l9€ÇÓj»{ÂŽA/»KÍ)ÖàOºÝöt¼·YõpûlYÎm–ε(ã[XÃÀLÊ«¨JGÓ°�)K]ôxAN�˜> Ò,RxhJkL[Ù€víëÚP)@»žÝª ƒoõo•MîQaåÒ¸Ê8Gâ\Í ñfܦӘLH Únz|ÈZGùC¾fÕÙ#™{€ˆ6¥;�žo‰•þßqŠ’=*zš™Í´Âªž¾OÔS ï&\Ph;}–1ËéíËó‘- ¨ykàx§…(öæñÈåØGØÀaÄö›ÈZäÓ†b;­Ò3¦+ ²àVõËYuÉÈQÛ“8~~¤•‹ëH‚¿ZÙ�ƒiãÈ£!c õ …�p,ñsä²û³·?a� ùÎw/ñïGž¿0×}Íÿ:B¡ßð(t´O‚ñ}{¿žôÚ�:ǖ閥ɚ ä•I9ñMŸÊ…ƒ¿^CcímÍk¬amyÿ“Ö<Œ-œ%œZvj¢Õ[† ´(ë�ÐÕ.3ÅhbÛ%¼ï8˜‘¢B†Íõg-GÓÄŸÐ[(�”ílÏ— [‘S.0˜¼RËÆ\%T¡ÂöL¨oï•Ç– ednq®l5}+$bC‚êCˆ£IÀâñµÍëî3`Ï$™%?$—*ûLŒ”ÕYÏÄ=Ðs!ËÐY^瘩XÅ‹ @V‹ï®BOÇq�&�{Qú•ʈ±£³1òéJº¬Ç“·N ‚9¯ï­(ç�²‘}1pŒþ:ßæLÜ`Ü[ׯ c�Y†µ_4/uÈñ`�ñyè �ƒzŠ„êE #úÈ%†ïf ÖϽn.cTb�{L,Ü'œÔ¡ðä‚Ô �ÉY¤‘«éÇÛÐ!×MÀ¥|´#±ÃP!/â ��ï +ÅšÛpÔèõ•Oü'æ“« ü1A®Ê´ÆÏØ# ŠH1-Ùd嬖ڈvç£`±ï:kü¿“P^èå7±Âc�ìñÄRÓ‚|o97:�³fÿF§—L¾5¬0\äÁ�pfÊíI_Í–ƒ| ¹–œƒªƒ:ôd ­k·ºHwöz›FÈŽU·ÆC ¬5�„[¡£åI2´`IÒ8M€æa1hþ>N)L=L‘Fô Ô"ïmEIà×ûUµ›ÒgÀÝÛÎSH; ‚å÷y‡›Q¡þ嵊{%DˆEzÅ”ñFÊ99¸‡ô�¤œbvûŽJS;jª ”ÍÞ/ý\‰ûE:Ö÷²œl±û`¸ž…²/ÎÖ×i‚H O®²9Ö¬H €½Ób�uàh¤àí@<7^> Cvlxƒ©ŽtO϶»Yöé)Ô�ŠÜ¿Ö½ak-œÅ¿4Øá±0÷Òâ¼#·6<.IGxy:v÷æ’<ðoüÛyÐêŵ–—[�@J1%7VOc` \ËèŒ ÉóÈ<=ÍŽ†[$MXX9Êuäòä-©åyj㕹„Àtµ»F|åûs)l™É"µ›DÅõH9«§)㉚{{ˆL*ˉﲼ±ž5Œ…Cµœô Ö‚6Ó— ÏM¼…¿[¦æ¬!ƽ²üG¦ÇÙϼ¡ŒƒñÐ}95‹}ƒà êô„Ð2�Ûmu',/·Ç±Ô:ö 69]á0˜Ánž§@‡ ¤0IÅÙëhïg|©ì2ÈÏ×ͼX1ùÀÏÈùŽøFÑöáòÄê¯YNb矑Z®ÌŒ¡ƒ žÊ®·Å¬H'¥÷Íœmª5?‹Iô#†ÄÀÿx nvø¶MjÚ] )$‚ ø9Ø¥Úµ ß5ð³vàf¶ lû ¥ê6¢Ì^Š»ÀÂ!þ9ùÊø(,4Ð ú©cÆ/ÍÚžÒ9=�nk@QÁðäQ'0Ç"–¯^ã¿5è28)[Öî�²¶Ë〤,wEpU­AR;?zJ¶v\3Ÿ*±a®rd–uæ—Ûö’' �¨Ô³ Àu§%¡—çØóÝ3Ÿ×ÞHÅs$Csh5Î÷büž›¥\>Øña >Öñó^áÉjcW3)nŽ1k·\“9EBÀ!‰¯¡({<ƒ¸fþªºIëïXLùAÞÛ-³RGQ^¡>Ѫ_›)F,'î»%Æ­…@ÓZ*A5;"ægL€!}J?Lóôƒ)MuV—Àb7àªä½$Œ�g¨À¿s"#ŸŠCÙ·Ôc¸JjdÓ7n`*wLIïçÐröámƒw õÃ\dø Ü,7õ]h»H‹t¬ô3 Å¹sVîþË>Á¬@�߃â”nFz­w0©‰µ(g!mµFݧ0çâÈ€y»íõ¸1°Ï½nê=‰m[„ô^ÍÂäÓ¶@Owó‘Uò Õ µà ì½âáódoz|c…ÐÍ7*ÈGý6­9ôllô‘¥DMÔ²Þ€Zïs7£{­Šô?É_ÈÁ÷N¼µÍúÖ÷‚ÿ\´#�*”+蜿`·"ÐÝɱ(0[:S1o‰ÞI´ÏƒM>ìTˆcÔ€Ýã9öãšÂÐ# (lÛWž(½‹  â}]mZ`GÚõ�šJBÀ?,ÝŽÜö4àÆ| Ö¼±ÀN\ ×êõ— µ’2FÙŠpÔ!Ã}" ÈA‘œ}àÜ�áãBìv�w[ Õµ#ÜÑÖœöDBÜÓGfÙ<†¨ày™§(¡Ã)ÖÃm6Üš6 5\p¡X¿'¶ 1'VÛrÝ÷“ÈÌëp|Â91cðA{ÖŦüâ”ßvKX@B `I¿"{û’ÏÛ² û¶k}L€aÀès©Í™ng*ÛØ¹ü€#À°íu;fÍ>J'/£6 X18Üa—d*@ƒ½¿Üš¯è÷7­ÔZ¥-|„Dz‡µùF^ý93q@õ\» A¨ßÉߦfì|Î�çïÀѵ^´‡ýØXõ±Çì?7‹9bC8râ>ޏ•[2>}¹n7Q3Íp”W›—T¢>M7O¼î>7× bûõˆtUžË+5Âl¡6‹Üæêß[S‘ûËzÃÂzÉÍ2©áÓo© Éj}2·ÍÈæßGVw÷vÙ% hùzøY²ß/g¬²©MFp™ÚŒ^’ÿC‹þr¾È(ww·ÎFÏoŽùÞXiCIÞŒ ©R¿¯N…Èžïóm-é'±Y²{lÌï[оáÿ>ocÖ©L1ˆü Ÿ¡|²‹{ãÉðrvɵÒ^Þºp˜sÒ„ç¤ó–Åì†Õ÷ˆ)Ào=•õÂñglI "p`ò��àP¹”(ZDFL:„Ž­�úü\Nü „^TÀ�°îÞ=†ÐÚ5è… ³¿[Óòå°c•;&(öÂVkç¼_[t3½É¥]2û–ƒ-Ȱ©9Æs:%S/ÑFLŽ ½¯¦] :¥dþÀãê+\Û%bzæ·üèü„ÖðVëRaí+ññ×Úò^ zåË ~À6”qKµGVþÐw|>‘˜Þ6ýK©EÃÆ ‚4Pr±êiâ<Ñ­m4}ÑXõ££9]¼ê&8ÉxtõAŒì {GŒ.õ[0Þ‘c{ãYJ{»ˆZ¹j[ÖkXw’ÀÀó˜kúAŸ® ÛË,jÒ™ýÏÓÕ»Ú9Y‰o žFëú³Ëª�j1yÄU±Õ€h“k¹åCûÔÖ‹ûšý·²Y%°|ñ9cïb €µð0bd§–±ÿo8~df@Ǥào÷zv ú$cØY¸¿½I¶blë}Ã%ÞëXßòxgõËpÎþîè!yÜ�ÈöK9Ið.!O¡„{êÄ—.„`*Óº�}cíº–\.S^"š_[¥ÙF S±¡)ܯRlò ‡ÉM_X Ó�ÐãŽcP·@m_õU.()£DöµÒýÚ¶�’4€u³Mk¦œNW4@8A*S% À†Ûž¦Û�ðyÒ½•Ó Ó$@0÷C7=×gê+1‘›Tr'‘˜Y|Î#ò`÷7•¹™À}—”¿ÃxbzýˆÖÈ |k3WC¸»[~ÃϽVVc<—Þ/or»ÁüYã’ׇ‰ËwAí0å&úëný]ÄJ£ÜÝL Tȵ¹J�8µ<ì—l„ú+y›>fÅÀ•$2U:B‹&Õž™-Y–dÈ:žÓ­±Ç/ηçÝF^´®Œ¾Äc0A^ö/„Ÿó&õëà~”k®—C‹×((.Ãýh Z.ã"HT�ñoVZUÔtÒ”)�œ[ü—WËŒáVÜu{sbòcµF—à$ò-[ïg!Õ^p0¬AÈÓñ£4åïZM,n¨ €¬~çsg»/;‰Ó7íT@–ÿdš GiKÖÄ õIxÂjÕ�n7¡ûšÉË5lÜ€Y“½› ØAÓVØUg|M4Ú´�õ%ê®à�7ÛÞ5l|±ú=Ü¿Xpˆƒá¡ ºÞ*Ú³ž~šÍòêÒayÇd:7J¯Z@B'³:•¿þ¹[s¤ÍP´6deGzsÔåño’™ID{�Èbïº�·vJrýí!†æÂò¬�Öš°¡Æ8ò&W3ÚdíŽO_wu¯m€l@›‰š« ó› µÃúê½v¢öœJ̰Ì~ªç÷¢¹rHû,ri78‡ÂuÀÐñ!®YÈÉ�}ŽtW.ŒYl0þ®^�¬Å÷+êîé,ä:Ú™NhÈR”È'oÍ“'$(:zÂ#“2=3�O¿t*ð¡¼Üdg· ¢ä1ôç¡æ§>O66Ö郜–tî�@ÂÌCwSÎ0Æ-ÜüÖu˽þ%éz˜`ÅÓˆE«>°<àdqw»Xç4c µ’øŠI ¦œ(ŒÓ±]Øb['ÓXõž_ö}5®ðÁÇ2ö¦„¨‘^O–ÊÊ�Ž:ÑžèZÝõ#óiËjÙ2êÏìßÚïÄØ_ ® φ۵ _ƒ wçߦí}È ´rZLÕãf„Ĉ1föºÜàcoôÎÁг ²l…Ì; RüMr¾p¼‰  ¿(ýœ#ˆé~¶_xƒíMîØšÔcÐ5ÔŒO›ån[!ÛéCÑ?/_LW»öš·†"#AifüÑL©`÷ôaEG�Æ€ é˜Ó×r°)¢@È–«n8}º‡qö¦¬S Ù;‹a~-¨–µM‚�ùŠh•ñ¿)ñþÀjÀ[m[æa|Ö´æI'Ž@‡+œsÖÄ^º]—X4”O_‹‹ÆÐ;>R0p«<¾|êÝS.eb×î§Ý.0ww3\SêÙv ɺB;ìèÃ[Öó #N2Y9_³á Ó×Ùè}÷‹ mK¤ÅÞ Ó,ì› îS€>Ù$ïEh¿¼N#·×îv‚{™_vŽˆ¶¢J¦�¨ß¬Û‡ï&K s�ƒ8 R_Y6ÝÛ¥Yù¬~ô̹¶®ÂOÁ�ñ±;o I®®&k•ô¡Åän8‡½%n*«ëöÉa.ÕŒs¸+­g*µ~kl€IG7ãÔæ4QX«®3 Uûåw×gdú“Í®Ã7x qÕ;­2XÐUaWÉnï0³ÅÀ§NªB€.!ó—#ïtÓ¡£âoˆò7mµ„BW4�בU¤‘�ûÄ}k5Ó²àèªz55ð½¿`)¹¾"'jø±"ƒ¶0BҤѻÑXÜáü“húwõl—�†æ¦#a [?E[”,«aËÜ)¦á´Qød\Ūó|³ñ"Ao²|’!î.:u»˜7jøëü\ÛVÏH D5 ^ðÉ| úa§%ŽƒåÀ»ÐbÊgàB¡— µ.3ñb3¦°Òæ‹ ð¯W6èÐà„&Oi%àæMêÒ„<ÚŸ)}Ë�UžHöŒQùÆ‘Gîfžš�”Ó»t·"4ëwél¡k‡c¨Ûª#­,Ü3¨øƒTÙ”ê8­·çdé‹*­«cµnýgü¡Ê­Åu Œ/”V÷É5¨,™hxjøáQäf›Z ÔÜóyÕ|ÛTf¦!ä¢äþÚÕïZ-§ÜXáªÉ0³ä±Å¢ƒµ…÷‡,XX;^\à"ï™#Pµ/ìÌG,¶%)°­¹{-tÐyfÌÏ„-ÊÔÇt‹¤’«~ªQ°,]hÀ·SmÚ1XwÙ¡%¸ c¸Ò8Ö_™ 3�ÌsÓO7-aÞ¯¿Æû];Žª8îÙi"gŽˆ@ÂÁ•­*iVÂ|;öë€¾ìøˆRm½ßTå¦D|Þk8Îì¶�ŒŒ2h´8º T¤‹nQ¯%뉱‹ñöÚ° Zú˜29W}h1²ˆ+ �—¡9WðÒ‘o>Æ_//=üÎ[ú@Íç³%±Ï»ÕE]×÷R˜õz@�*@­Pš¥vT)b“nÒ#dxh.@“‚2FˆÑntÃ&ƒŽ¨ÖU(Øñ…l´iiºn�Û¼]µ. ¥5¬7§*–�슂.E"–…ÕЩ¥Á£‘k*ø�²,Eˆ‚éPx@±¦7™z\ü”‘Ù¥;«P>•;"¦ƒ„µ và}âµÐG�Æ¥ŽÝÛF’]“1ŸŽE: vxEt€iÏœ5ÙQÁ¥È-¦©çµö݈苺<ÅñÍÅy`8BE \ðèÒ‚™0h6Eº±Ñ’ "ÖòÁˆŒ*oJ™#r¶@s’@¹Ìí®Eˆ§ÇR©M}—p6z#ÃI!�ÆUâ¢?n 4�îλXñ~ zinÕ0@ ÐWœa²�²©LAF�N˜P#NÍ�r0ue£JlŠJB�pE2Aë¶èØÒYò7îzz#Ak§Êb G l�Í#ñR‘N7UJ9 .øÒ�é£o–Mš@슑ҽwg¦}¯™÷ß|¾ã¯_DBB¤a@–WÇÃc'â7ÚiMš 6Ø}b¬ ßÈ P1@=v˜°¨ m*”hYš‚Ü)æÝ!@LÆƒŽ¸iB}3œË¤‘•:4ѧãH4Ü!ñýçA�+Y XŠ š@�0ÃÆ¶÷w§»BÇÉLh6~ÖZ€1D^�ˆ;@lØ–½»êh'žû½Þ¹>ææ˜ p`g{p(Å͈¢”2hνñQˆgTÁ³¿XêqĆƒ²)£I×Ì6nC�Š84oÔ:|m¹+†ò¬GÆ‚}Aºvè�&œd�¾zS.€srO #õWXC7AÈ‹œ™ñ>�nAªðÓvÔ½6h碪©�¢ü�e«*ºnÈ�:jÈÝ£ª¹ðØ  ìÒ–&…Ë[¦Áƒáå’_bñ“@;è*I F‚År÷(4*_.Ezi"™ I¦M x@ï–òó:Z$ôFHìÐN”Y 8íX‚E�” uò¥ÈºhM|iW4ÞY¨?33tÂ1†òÄ‚h(Æ›=ÝPp#úˆº��†Ö³H£t¶Êœ <«ÝI¹@úÉ£‘O8…"žø…,C‘)q ä=U2hufÛÛPv@‡@\‹Z[Ží²HÎ*6�¤‘Ù D \Ð “̪HªjÕaJoò ”ic]fǬ9èãÜSÓNiÐ 1MŸÌ‡„eAIÚèÒ‹QÍ=ßù#wµúG•9ZœE×®ž]-±—§½ù§f¹½;ƒäRû˲;Ûï�o˜R%‰sH"[|�¤ |F¬ ü&½›NØæ ’¤ûꄃæÇ·CžÇè †q2ºê²œA«!Xw+è6Æ}~€Ø<áûÚ�Ëäš­½¡l’¯“Ûš�hÃEšzS'å‹~ìd¯-z&A@·gµMÚ0O´‹�Xõ²Ìí‡r<¨ñ.g+qm¾íÈ£×�Öï†Òv—×¼³s¡T<¤ö%äG{H#‰Ú 2°1&µK�ZFØ!=‡-NîÂLa‘Ó©áÃY·¯¶QÔå£Ê¢±«òjöüÜÞ[f5ý1»û—/tÿ>÷õî;p=^:E½õv·4ï}tÚCw›¡–=Fn»±V#Z^¶¡ÈÑrñ§Æ_s˜Ülo¥ðs‰ns|0àÍ`3Ì6>)ºñäl§Šóuê<<Ôþ\ 2‰Ž 3n»`ewFcã%¡÷#dFµËH·•‚äCF\V�hSÒYrb29->ó$…ÃZ òD6ÊDzñ1õY—–Ø.ÙßJx@ß.›ŒÔá³\K§ŽÖc)òtó†–ãýg¾÷Š«Ô^=áÒ¤÷‰4*“Y_°ß] A‚ÈÇQF]Öj…€Ð-’ùáÿ×b×|yãri7ìéR™‹ráŠáÒ Á†€A‚`Œ']ßgakâøb,Ûf Õee)iû�ûâ„w´1É ç»TÜ,@ö„©'É¿t¶tòod‡öè4@³¡°à·8—,¾ ˆ ÄMAŸ}ºüÒA�}«döXk ›=õ6–íÛÿ„Ž'û1÷È ¡•÷íó4�êól¶HÅK!Åcv>\VÿÏò6aI�}Ed%¤ÒèØ9«11±Ù2TÇgv-Aªa‚ÙÀP;ŸÉ‡*�w ßJ[�åË›Þ,úÐ‚ÒÆ`6FÐzÔ`l±= ãnûÇ«öÖ“=ëû™Qâ²¢A~6\¨zXÕé-TôÒ+¼Í.²ƒ=-Ìu7›�M¥ŒZÒ-³[[Q|eUT7›4èˆU‚]mý·TJ„Ö ¨ok.0`¦>A1tîX z.èì~-kµ6¹Å,«gFE»>ÔÉGÖ�wÍêÒîLÐ48‹|l‘ó‚ªäøƒ*¢úôá,cküNÀÍσXô$$„ü`¢‘G¾þN|qøFC˜e†£+J“êèXeKðO«úlÃÛ¶#µÜ7<:i£‰’•¡?s:¿7<³PA¾qÜwüN0ôa÷…u[þ €Ú.a¤¾£ ª¨×Ûi¹53>4g&(«d|ÈvçÖÖÃÂÎW†o6¤ÕÎðC-zR�q5sçîx°;ð…Ç\ ãf[yºÓ\8š½Ýšã+ ÓjCSe�ÚôkÖ*$Åï‚Ýox-ßd€ù­zÀtåÍ– ë 0¹Ä1Ž,ìK [þ_ZR¹~5–vÒŽd ²è)ñÒÖƒL$õvÔRÈ'zŸ”ðý›B,pË+ÃN‘g„å×. V›Xêm£|K9]ÐXïÜ@ÁLÎ# MÚûº‰N€�Öf)°Q¦¬ó¨ €$[7˜š¡&Òa¹/áâT¤ #òXL4¹„•çý/»æ_ ï’špóÚ0úp®²”•е×&Ï;)¿‚ÉÑ,±‡ @Ã> —hü¸‚¹ï—óÍ;[ÍnYñµ¼G”ý!áK�‡é¾Ûfš®ïÇ—0tÒ©H)>š¡âúJ/£µ åÜ¢b'å½Þq#fNT óÏ´Û @^Ö=ÊÜ­øie1bóó5šõðf`Ÿ§]ŠÍìšûºÊœÈYî²è;Á°gðïwê(Ù Óu#Oòë�¸-ÿkIÙg\‹^ÀwPˆ¼|}ä4bÐõýÎ�\s3‹PÜýmü`¸Ã#1„6ÓïZ”ÚþÔ‚�¾Avi¹0f�‰É¼pEV÷=�Ýõ6ŒŽÈQ”Q€° ó?—jAò©�p�`BVX°}g¸êg=²å¾ Fk’ÈÌà¤hI¤{�›‹ÿ&»lÅpüŸËéÀ|'w°xëâÏ¡:Ôü®RÂä�s>±DnµuÓ Õøjƒ‰d=m>]JtR¤1�éiDyYRÆ•Šé<þÞîÖ*åØ.ÊW’W÷!˜ÄËE''ê;äüþ %ˆÓG­³MhUˆmO8k³§¼S“Ýw�b ޕ×ÛDìl>·Ø–9ÜæîÛ³2– bú ECŠ·r�¢É†S›{K'Y}ÅÄĸÅÃW#šöéKNÅ{ãgÆyv˪™A7=—Êú"ïÕØ%R,¿¼µ…%µÉ¥²Täì»Â[}E•ÆI”%A�dðS¨z~Š„Qœüv6ÄÐhÈü5ªiv¡VÓ'ÖïÖ̃ãV)tk†_0±Ä}È› †:çë÷ƒB´èˆ�^ò­ÄMÆÆ º°Xµ/ÁBZPQ tÈoíóa}8ŒPç�`´<‚�æÎöçžàû9¸f“âŒÂ¸g¦[ J|¥™�*G O;Ð-'Ö½a¤ˆ¸è ²ŒÁeŽ\0ú“‹  6}3xŒ®®Ê ÞGíþèm0Û©ûØh-Qy2ö; T~ÅZã[mÍäQÄmŒYðÀatZãØ®+$Ü@��AMãO™àb°—Â¡Š€Ú”3 ­hð5aÜE —Œ¿CLÃv*F½Î•„Ôá({®ù‹ F.,O1à.!‚Šlò+É©ÈÔ3Ò,5i-`öÑó¸öþéÏI<²æ:oì˜âÌÙÝt"RÛèàt‚†Ž“}‡ ^+™ žÅ�Êñ+zý™îQ¾Beà“\ƒ(HyK�¹%¿G;{T®|5à¡DlˆþäÑExêMþ<®×yV0wK9™�ô’éqÅéŠÔÝ¿¯›Ë¢µ¥kh�8 nÄŽW|g;�–†‰“÷ƬÀµŒs¶QÃRær | >Š—ƒ¢3 s;ጵÖFÍQª»eAA]B’�yLj -=áÁÌxG«½‹�ã…SŸG¬ÿ¤¶õ^1Ù4,˜o{K›Þ>ì6+ôby+€AÓÅj§Ä!/cŒãô9ˆ1= 8Œ�Ü�Ú(õ‹­=îȰ!’ݱŸqBC$À:{Žn�-ƒ¥[j BZÜ–ë;Eñ�ó�®ˆûÑŠ¹kg?°{eõjÖ¹Ÿ@�8|®wš†r~–ùL±­y�Üa‘ÖHÕÎ{û%ÇvF dØàÏ,¯:»;Öé"‚k2ø7�\YU·²–1Ûr6iò~º_¤h{ZJºšF+P!ê…Gˆ ä—)� ¯Ž­b/4_=uY·rûˆ}×uÅÆÏ Z@ÃjÈœ®X-PY#°"Ìœ”;K|ýY ¹¿ ˜ýj!RÜ ôõ¹J`ÔyNoŠzªN—N½Dc~óëƒN%À—>ákÁã 0'Kuûî@va^²mqO+r±SpÄ—ïg¯aÞ´ø!>àùõFBrýBëØèeÛ\´ï’ÛÄi´ŠŠû’Þ5‚,h�¹mu‰—*Ø)‚ì§®ŠÌåÜú0{ÌétÿCQ{xãüáÑpžû‹¸N­|`ôIB2�Í|ÚiÍa=áìæ‹;@épÕdî2¸ÊÀÂzví^÷4ä7¬¸“5ZPáó¬.äÜÄ9!ðHð'x$ž>îöoÒ‡©‹àq 6±ž18Kf\˜1fÀ9HÚYP­ñ%&~D;Ìc|ê_8 :šäÛö50—¤{�²Y›{tyH”†ë¸Àëç †„,sû}†hB¾�éÙó°sÏ{ßÓ^�¬Þáýe~ÊývÒ­«K¨±VÔ}^âF�—jvAmqû8cÅnç)þ!Ž­.–K ë‘�¯BÛIúÑ9XyÞÆÚüõw#Þ£‰"â6¹ƒ�cy†G£…SP3à0 ©ƒŽÙÍÃÒ¿lµc0x!w�¯/ ž¿ç \3ɳŢ•÷²Ï/ªPR€ À³˜ó/ÜÛŽëí•ôSáÁê×B>%÷ós_1ƒ[Ý�i¾h`* ³šŽŸq6Ô5’°Ð½7©]bÐì?_NŦSÌ4`“\ãoKÄ6Bß >YÃÓ`Ñåª#’ÐBse—!½¸ ÷|¦‚q"›Ê7†â9Ry«,½F"½P䪞„,M“� ©°þ@Ía‹ Žro „°2@^>µ¥‹% &B#mÞ¦ŸƒhI¢a¡œáŠ®/”1;²a&+.0¨Å…CãÓë•ÊàóÕò´<8³_©áè’Ö| :ð¦~c¸‹”°'F7LäZ㟩-{P $&à”,T I| ¢Ÿ38˾Í®¢e wy¦h"X‚[Ee²RƒõÜp€´ eVF\� 8s‹L!}²æï•ÇPTj.Úw+i÷q¾Ù%0¦\`â2šÍ‘i¶ÑY kçÖˆ/²5—{[Ste¾Üåk–›.óçò( _Œçå< ÐÓ”%5ïáÂdžØèì•(튅0P!ÚYÖÅTAœ@,�ÍÓÒVÂ@TÄØ0š¡"--[y­Ž o…ðk{Ãå~Ùw¹ààÄË'ˆ”¤sk|`¢W@Ýé1ÆvÆQÖ¾´Ùá”rÎjg?geж1fmœ.×L4ìFO°T±àÅ~#k8Õ‘‘»þÃû©Ÿ°Hà P)òØø[3:μK¡åÔD:Eý`"’l�„ —¹¡”FfN¹ç‹L Ø® ?›ùùXn ÍüÄàÇ÷0<a”3ãj0DŒ�TÓŽ´c Ξö”B ¸tú%UÈð÷¦ý›‹˜5Ø7”µ2;rñoãODÅ.k¡…׿žÏŠƒ.XÌ ³1Ïú¹±‰ŒZöÚvV=ÆXFP[7×#tˆ·UÜc¶Ó'ßeù‰’ädJàsÍë>|uÎsp‘³#EÞ‘e¡7dlv¡$ìPq±Úùlñ&@}Ír™2p­H›œž#Ù0,ï#„ÅÆ¥´™àR¸¥ß5¯š¸œ- |`êb�,ͧÀµ£-`½ã‡œ9‚.ì’½Ѐ­ëK#å—_:èo†W›ðpµÎTyÚðʼ’ÚòÛ�ÃoИ÷ÎdÛ‘!žЯßÅÌ8t»˜E’Ä3 hw¸›í®Ï¦¸|æÚ>)‘*�ÈX’èÖ8ÎETeGÂ0Uu’ äHØ^ÁÚnºß{±ÎpŸªƒVLbÁ”º;s²¸PiÖÇÆ;ÊÒçÉò AãÕo@;ƒt&Œ0I ¾0`@³gšLÜŸ…íé”D­¼´Ó�? ÝBÅr'Cq·G‰”%[-¤Égâó¦GŲõÂDúCâu§¿ta›*Õ�÷r0ÈL¬àÂâ§îœí®p\_'qÅ €Äöx&à�£ ÒÓ§®£o!¡ŽdùŒí[}á a÷³ïΙ÷ÊGÄM–Ì Üµž²ÙˆÓ•ß:|& ž}‚íí³¾4=È‘.¥ƒaªÀEÎÄ6ù O_}ù=—½‚€Ö“;öÌ`c|}$Eb…ßw°‘›[i1·*"ØÃ0Æ»Y¢ /3/–Ê÷x6·ò¶e÷2ò|{g  ¨×ç,`-'GoáUóNÀ—:AѸ†žO?.-kWö fqWî̇0É‘­k-œ'§Á˜¯*Ï„s‹:РI—×;P‹oíF£c¼R6r¨â¨[8,:–³^„®ò£„9Ñ�± S�Iݬ–“´©=(ÁÐa,ACõfFåjÔžr,ò;vÎyÕxlhHÃæ&÷ͳë‡Úžz�6`‰ºõÈ5-›añÒ0Ô cìâK}Ø­ê¸Sq¦~?‰ \ä%†÷Åû…d³/‡cP¹¼ #ˆhR|š<–ƒåQÐÖ\Ùã f¹å9¾æB Ó¶ÏM‹Q wT �¢æ1,Àxt¡µRÃö@¬_KZy%zKÒø½ŠäiØžÒ'œ›,uдu[6n`XÀ5lê›Ø-ÙoJÈ×Ü7œ\ ïDÑη´&:”£OÕ8 l 1Í–�ìÄñ±¤jf/#Œ”ßfø =êø�5ÁY-cOI{X¶v¨kS•�<-@Á@á‚`„îDkä/Gئ­„²Š®Ò¶¯ØÕ]D±†í…–” P2¦^Œð�.N?Qbàž¶KKlP»ÒÏfäuœ¡À-ºÕÐîo`½×­ërMùj>¤-Â"Œôô 9¢¡æXqc¥ˆHb�  º;g6ø 37M�­ĄÊp 7;)o@Öâè…Þ»pdCwsçŽö'Êõºôcb\¯~XjnD݈V­þB²1k8o‘’§Ñ¶Îvþ_'Hr™²ëÏw&¹.*ÏÇE‚7üE;· ùµ«[Dc+¿¿�ÝË´go�xý€±û;®8U¬«†8 b$Ñ�c?ËÕ‹�ÕnÏ�Ê7==ö¥ðü’î\ (�^Ào(nû!çŠ=^ÙbÁ¡�6‘B€ÀKë6Œö& L Ö‰ î—W|>´#âð4- ½Ï•¨Ñ ®Ðöp0¬5µtÜAEŽÛÆBÙL„ PS7²‹ÑĽˌíF­Õnà7\]êl³­‰mʰԃ҉%X¯ ƒn�/Sæm)!Øö|‰d;«3)Šƒ(?á,Ζ¯€’âÙùàŽ_Có¢"ƒ`쇛òö;ƒZv£‚¿÷^.ÏÆÛ6’t’Hh�Eð öÄ·1�úý©éiN-Û3ùIÇSûà’6IO6™~ÈðtÈhó5ê£q+ÄÙ;ÈP€’°–Ì’M ²/Àï7øÜåD“Ëᜎ§¶K\:±Ëq…pa©ýy ´DlÌ0:‚ýta1Þ ÇÂÌDoä‘ëb‰¯!^i,vµ'|Æ�Ù}g]Õ¡‘ôÁî›kÆ2(r#ÊÓ¨/;$šßì¿‹MýàÇ«[‡çy``�÷^çQº ðS •Tì˜![‡“²çà"¨ãT7E–mòuã 1Æ€èÇ’€ºCdK¾îß[Àáûì\ŠU*ïàÌz¦£·Øßjík¡‹þt~7{¾†wkÄŽyUµØyAhK€{ˆób!Ÿ.jîY ­-VfûƬùébmLºš 7zµk’ä\¸û›aŽç»Þó ½=œ …ì­ YQÝ+e)²C xKâo`g2´»ÊC‘úaP�¾ZÏ‚Ôfø\N`ÆÃ… åa“Ó»€¦C¥ú¬-Ÿ¢®þUõ¯{7Ø^¢åTÀOv;›†CZùßèsøFHÞ¶?;¸+ëò¢ìMÑÿa‘Þ±n¯µŒö5b}Ùc žÀsÖÞ=/o:§bæ£x£‡rÖn`û";£XÔà72 †�RœúûaÙ5Ê¡1`Ò“‹ÚìØŸžt0� @&Fºü;ƒ Õ0PÑ>ùjpU,†GpƲçÁ!GÙ�Ù2Æ»µ–÷Ô4¹1ÏÂ6,IN_T¹© I„¶h>ÝLç^>*¶užÃd!ö¶<•×Ñ“â hMaûB²² ©4×Éõ÷% �kàåjý–•¾¢¾¼>l¯òÉéø ûiεƒ¸YÕÀì÷*xŸÍ[ôHl¹ ÷Ž>�ÝíÍû–UÂ.s \ Qy›9V€ì?K'éÎæ§Ák^E¤>aňăA®AªPÛ1p7¥2+hCî£FÃ}ïuCÀ´²rù®¼-³«|¡@DÈ ~Û.¼ë¶Rƒó4ˆv™#% –£6sxà)V’[;]¨(-¨ÓŽ´pÁ¬ºLyŸcòÃÉNÖ¸�­m>�«{Ѧ{(FÏZzÊ´uÕÄÓéû0âCëÕ«ØlïI Îl©³}쥆ú¶áö;:Þ§l ³ÀœºCXPÖãùîVEö6—”› YJ ‘X­—®PURŸ$³ H‚‘­�ÙÇ è £fC#W§–·•M`j¶Z�aܰ"b#F�jêC¥nœfé¯y�â�*·Ã�<®¹7öC²=¹Øqf:o‡•E8ØÎWe�öåwˆæ%У§hQ^½�b¢ã ø,%½¦#7í¸3Nø!2ý»ñ¯}«'5Î~zܦƒ �¤ í´@µè ‚�&à ]NOXàÎ/�)J PEzŽ1{èylÊ�7]”|–œ‹à ‚`üqØ›þÇ•s3fZÛvç#¸uNápÝ!å¨Ù´Ììb‘'7W€ÇUZ ­Ýî7·:RxM¶cOŒ¨Jhz_®3¹n‚9®³¿Zv†iÀyn›–³>fU%žbÂsžßõ]Dœ¼!`Ú‰¿_ëú°¨x]a–KgñëΠ©�a«ãmUZ`ZËT|ºrmQ¿²Þ]íRO„FÍÌw�ÔYO÷"×;òbò‡öîÊü¼lcmp¢åà¡1x·²ïk²…�›yP-cØîµP…&á|Ûù˃2ÊbÄœ?9ǧ}‡u„,¯ .L'™XQ¿8£z›%µ!ñZbã£tÁ%Ú¯L4b]¤…Âê1?µÝ4Õâl"æ¼Ô›‹o[]N�¦Ê–"8� FT§ð8ŒˆŽ�pËÂC³D®]È\oñ†ÃÌþØiɨGÈÄEàl'v JŸx=¬°WdD[ÁÁ=T:zùý{ìV||:UáçsçO[äs#оÇXõÕU,êW�ÖîƒNk²€Öè)7Y™¥œðt!ÉPëÈ‹]º �ÜiY+_Ö°æaüž¿ÛòJÓ Õ“k9a Õ�¡`ÇŸ6HS‰ÀÃhõÏ3Õ\éëÜØÁ: �[â¿�xNv0�÷žàMgE3 �¾Däk³T Á£/îFÅGc�é[7@Ê–ª±K°KêÜ Ñ:qˆq¸Ì¦uã€Ä…Êš±rë:á´¼ÞÏ++ÊBºXݱ,ú­…‡M¤&ý[3í¤Y™ªùºEþ2÷==‹SêÙ[X5³�Ù3Ö9ìÎdkö›ˆ°žŒV™N²�3OÄQØ]FeK¶¶Eä�.¥†Å”ç{8ÚÏ7ɺÞlíúúA¥´%ÄäswqÀbD�âèâjíðpáèwk6Õ.ÄwûFÞòº;»†8pP×­¬Þ9°ƒú‚âêmêëÎD¦ UÍ/¼*¿y!TâÍ‘KÐ* ¸gjáùˆ³ `=Ì(dm~kŠ‰í´‚âzœ\¯øQ—½ ²Ç]Õ¤¸°xÏ +W²¾j–ÀG±±U—{lA¨À´M Jô ›‚ÎÉm HÐ#˜±E�GhÒöô2F}mzýŒŽËìœÌýС՞—(Ͱ�ŠáOOSU³º¡Ç@š–Õ£g«1h–Tœäd‚Û»3î6ÖüVÄî"ïä×\ÖŸ‘kœžÖ¬K@‰顉}u`Æçš´ÁíŸLôvx£­jʰ÷–°pz©u›`,Ü¿ºù¾¢ÙA$>û/OÕì¡jà4–Už?Và<«,ë»0°ºÁ’¦/œ"´úÀ[ Òµé^�оˆŽd i˜(9éß"Àò>Å; \ž�8 g;ZûsÔÒ`Bt<ª‰^�Õ� Qn½mŽ*õ6©ŠÞ�ÁÈy•M¥uz:� -T.�q{€Øêù'\RXôã‘Ü:Z{„ zÀH°]bñLˆ+QO›“³hÕ`9�ˆÖ!wq�È,#n=�Úúö8; ºíž®=îEvû™ãI!;zÅÊ>ÏZX.Ρm„}óU �c+cÖ„;Œæç™R˜Zm›�WnŠ/dq Uâ®vg¡Ê0°+ ‰HdÝF8—p¼Å²Á„{…Òç:¬/&�e¢ÚAÔê6«Í±g+Í47�ÖÒ1ÁVáÖÅ‹9ïjXÒq°Cî»àÔ¦æQycD­ìÈÕ®Ò³I�\L N ²ïtkÚ!uIo:j3gt:TÀz›J'»yìxÊ$ JCY�ª/¸]RÒ‰ ¥¿PéäÇ­ÈíR¸ê²1ikóK»ï\-œP)LÂæ<¹ë¼üí†fÓ¹_>ßW©rWWÄÁðÁ5�W�Ÿf†g ·×<wmˆòcÚB =¸¤2`ÀÐá­ŸeU b—ÝUí‹!iÎ{žã}}Èw쵂¬ý’25ïfó05À$.Ÿ$CVv>¼Q[ðÃÐÌ`9,_MÏ™`0S†^²o.¶8DY²¹3iyÝŒ3ƒ×šúád¶ÊB«¼v§{ö O2IÆæRœnl1lŒJ¹l6A€2D+Ÿ†›à[Í|-‚rËar¥R¡›„°—âÅUð)HZcÍ·W¤¼ëhá.% \Ä�¦ŽøÂÎ�ç4Õå†Ï±/Мx£ ‚²ùþÏFq´µ«ìUç§3^c­8`CEnÚ-ï¡ÕµµKÓk­GÈU`¹üoÀèůN 7ì¹×K}Æ~2N¶7`è|ëæö§`}Ä„T(q°z 9�ÝÒc�±Û·‡�[ ¨ a¡¶™™f?*ÊÙàn,8 — ¤dM³X¡vÃ-60ójÍÃ)åˆè™SŒ^W­OË£’Xf[áŽ_ðx|P¬A¾×Ï, Ò]tp_—CûÅø'ÊMäsØc�FþºVÊthܺÀ2ƒÄó®)#¬8ôÑåBáŒ5$®BAábI* W¼-kÊdÓÊìS{€CN�aP`!ÍÊáå&ðß;�ºû�àñXy½ÞöˆÈ%üÌ]M¡z»©eå$)Ü´Ÿ‡wMy‹Oj…_·N5Æ`È cíSÈj@°AßñÃÈIÖÎÆ|¯¥ŽƒÐò®|Ï~˜G½ÅH{qNG×õ´ß >Hˆ9„›÷a·Xs(Ó—FuºŠ}1¹‹ñÖÉ`#ØîAŸ~÷ÃÓî>µ}0M€²‚2MÐÏÓÐé-â�$a/wê|ãŒM@m6¶ûØÚ<ÍBA…ð¡MÊ@sí4|%á<èʳ à2ñ—s{ÔÞ;=höNœò ì¸ë}Ô‚úäî�øwšÆÙžé\J0þl›WèôÉö~U6Û<ë%„KK·±cøœ1Þçõ(=šX)êñu±¶©?�¨g9=ZÜt{—É]xл }åÅðÞ4Yú#.AÖÂIÕtïrš9?µæª~â»n6lvOR†Â¡ÆAR+oJK4 µÜcÀ •8’­SDÏu)» êÙä×ÚÞšXÄãØsH( •«×�Þ$"`cvî9Ë+‡qûœ:ŒûJZîC5·y äðš Ñðy}¾›PäsÝYµZëÖw¤ËÂ_”üß×ѿѿ¼ñƒh5Rj#pPÞ˜– ˜ßË/Sã—¢^y“X`¾·1ݸ�h "p`4ôÛ\ûÛ áÜsº·/\cz�%‚´»}šü1ŒeœT5Ô®ô“±äÕœHsöB‚´@Œ§‚Ö˜¯VƒH 5kƒ‹ð- ‹X›•_0zõÌã¼Æë|AÙP¯Ápp>1–Ÿ€}«WŸ©Ñí<åâ ïÙ,Äk5¾Í†> ÀXq=Št’,A'U­·;T R¥Îq^m:\ ››oxÎ$Ò6ÐFX}:È4Eg){Ò�¨Ëî7ßNžÚ¡ð¹ý.ˆå†¨:þ=Aerçÿ }u“j´A¿¹nÛîÕëøÂôDÿ7`|3¦WöŸï´µ¦B¯±¼óÔlΗ;Á"‰éó÷b ëÞuŸï"Ÿ·k›°UÓ÷Ÿ¬;t Ž3<ë_»r—æø;Û2îFrÉÞ›ëN#Õ+Ðò2ÜZž L©�‰©`Òo¥GÖ½óÌ,ô>ô<Ñä ÍyØ[ŸˆêPÌW×Ê@SÜ$ú=ùi-¥‘2Ó‚-Ãë:ÈžØåå�>¹ ŒBcÝÌ X_‹Y±˜dp쳊ŒTÀ}÷Ð{`¾%­s¼’¤sÛM«kùÅLu´1Yôe€mÁª@â´�z†kœŒ>ÀÂu¥îu§sEFÜÝFÓÀµÅø¡yþáp"1Z.Y¬råAšÝ¾óxgÈÛ’ï4�¾ôSm�ˆï´ùŠÊ vè?K|÷ÅhÒÛ›õÄ£,å |ðÙ·ËiWâ•àÔÖ²aÃb¡ÞÓ;[N¼× ´4„¤pÃ˸‚ƒ˜ƒG åW²ºã�æªÜì%Í`üÌ!ù¬ƒCGG°1QÖþóNÁ®f�Æ|§ Ž-ÿ§Ø €ωô!–¾#�‡ ˜y‹b½•Ѷk–†^ªÂ.³`w�u2èo™;žŠb<®kÂs­�9ˆvË÷5߯&:Žºc!lˆ.Ëë�qCî"s÷x¢<­æœäåüZÉ2 Ü‹;F.F¡›ƒŸÀyd‹�ÃyEÁ�o¸Ü q7Û]ªÒjjùÔõ8ôGɼ¼{yúÆÙ{š”JÇ0S_ZÁ–×ø[šÐ¢$ëWlØ=ã­‰y (›Ýþ}Ä#�‡Ý-øFŒ"‰‹—ˆP|胄·Aï›i¶ ´—Û@ä=ºØYDllW•ÉÊ.­É®¯�nÏ·oå)@¥4á 3­ýÕ1Q9€èìÇï¢Á÷žN�¬³Op²0áò¦—ÍùðnŒ÷“ŠíCß»^TuY%Dµ�ïO¼%‹ Bß2Üp8ý<_c¨ø"üª<ƒ]’¤ÒóèmÏ�=Þwcä‡@ÔD3dRóaüP¼sqqY º{FÁu|Àì†6ÿV”>óEøØÄ�|”tyè|¾”éSŸéŒ—&‚6·‹|E,9,â€|�ší>ØdñÊZ'dréÆ"š±XUã^ǬŠ\ÂW )Á§­Ö±Éåƒ_{£%—Væ0\\(tBˆ^ ö\Àç–¶Fk›^ ;¬ú0T§Üo;ìȱÆ68< Û–D{ -ä¾nì }Ò±KƒYÓÔɌӕà²6 •˜»÷‘#M cR” »gÞ7¶‚>6¬ÍE ÏÜŒ«Ü4[Kÿ]b{îG´S²,Ÿ×g¯DŒ®Ýã¿ê÷R,9Åî h†Ê�Ée'©?Üóè)ŸÄÓÁ&qo_ÍõáÂ�–@ÒšOI .9à‰x?ß—î�Žþ£¯ÞÂn ‡ðö{Ç—íÕ8, úÞO5ã|¿wÓe«ËæÊöv2ØV»Ñ§ˆ5‹Û`Œ;¾;ÐÏ:ÆV•ºâ€€KÆ5†$ljLÜC˜ ïí¥µ#pL313òµBg£-/ª±®�}[†ç^ýÄ sÑI°ÖÀRí©7œ©î¨Öª/É25ëŒÖw0fÜ“w¨‡ÄÜg$ÚWm]ú™ªæ÷¸L¶Øy€Ã_›\µ‚ŠU°]Q}æílyð@û$Æ&1»R=ëÉ[—™MÌÓåÉ·gÝA•ÆQd~ø¹nNzBîbÄ„>}²A�uÏWuðEIoÂKúÎ,êeh[DjybÇÁ±ÊžxÏ`Ò¿“½Uí@qXùö͹�רpá� yžc>Ù_aí¹°[ ô+ RÙLàâùC±cää&˜•÷kþK€ØéŤ\çŽõãóV�#6¬/gÅãK®£i,tÍÅÖÛ›ñ)Ë4ÞÕû\^ôæ[ƒ,/ÃÆ4,žS'~ëÓ1Ý*µô=€>6C|&Ä�£ZÓ hÜ~u½ì±ß^6Ù8ë(“ÁÚµYé²W°ž;¼î‡Zë˜n«_+¿³¢ZmP»)™í }r�·ÖLþe ªárNúuÀ,mxœ€€–¸/%ñ”“{n­kÃTfB;ˆ¶¸Ôçm˜aw¿1ái H—O›P�©£y·6¿¹¨&Éùƒ¥pôV[¦ꄽ˜^ÝÇÝÜ·íQµQ¨M÷‡íñ®ìÄ8s­üW®]÷vü+ñ„â¾zµ¬AÍx›]ï7ÑÛ ß ›tÞ̶Ä÷,ü¸4 œ%RÔ»—H~Êî¿%”/#öŒ:�pÖ| ϼÞ�“* ö�ÕN `âà,ÞÖ“`¿dçàëäŽÇò8Þk�†µ·|DžÛTTÐAôÙy'·(•÷ gVÝð!—iíá–æo~!XÈ(Ì$¹'™ ä�`-§¤É’ƒìªø©��kºÎ�Õ5w¹t'K8_EÈÐ([[©eÕÈ2Ý­`!€Ñ=si ßjy´¡¹ú·wZ·Ü&ˆ{k½þOwë_ÆÑ½�•Í sÜ4éF†:ɵ³ ù:4à8LÛ`ò¯9ÍmÞÓpÜ}ªp±•„ ùl�Ü·‘½YcFœ�îDLÉœðhdÇTØÃÖØ1âéñêyÕ~ï—Àj,c`T�¦#v—s,2à¯3ö¥\>¸Wmñ—ÝÂ]{õ¸žj<\T°ÿ_äõ¦Ûû�«,>™ÃØ_×,W9•w2ƒh è,Hafª·}|È=¤ãO±¸‹=ù­á.}žòT6{à:ŵ!À%9ezàìöº‹èl­ˆ¬ÛëÖ=U1«¼û(–9ÈÙÂx�V*²8˜Òf¢Móz{PÜoÎIžÖÏ�˜SëøÙjG »æ[¿/–¾» ¼kŸÊ²Ã¤Á›‡¦Mr9�xò¿”6RuQ†q‡ W,ò&Y^±#ö Úð>rÍãôæèxD~âŒ/“j>EÍâvÖñ+‹IœwK Árc àdO"‚ãc-ƒ÷!Bþ´$ãj¿›eå/n�`Lq…æT o²d›’ø²É±ØC¦­Ò ¿s�ŽàÖ�q@ºóí¾Ø àÆt½.§É©�ŽÈ2adìwjˆz1ö6Õ“²¹ÛI‚+¾5bÁæ ½™Ô‘Ï÷×ï»–ø5�]ÎyÇ ÑíþÛKdäãÙWaèäA§ÎõxºáBïæ|ä®Ú'¢p«ƒ²÷U�þ¨Má€nÞ‹›[@aG9Uë=µÌ„-ïXÖ�ƒv/ç„Á@d´‚§.IóÌ&¸“i‡æÉ;Ó6xõ£ÕàéÀ”©ñ(¨i?ž`àÞ,×7p±/ÖÀ=Œãpqéý"c ܨc»y–Þ ØsÏØÆm“!Ý/È¥Êb�Ïekß0`ö3¸µÂÔŽŒ×Up2é�¸Æ0l¨ÅMæP^EfÇ‘;ß9éÕnE¼ ÝÅ­£è‡l�ºßO+Ò ’Š”—E8Zbp¸ôØÀäÌø´«H± –vÜ™[ÜÓ9ª.–“.òU­ç8©qvy€Äç FŒ0ðFSQw( ÇÙ¾d… �kS‹ÑÌmE•�Ä7B ‘WZ–Ò3ƒrŸ:T�aï“"cÏñ>â5ïÖÜÍôo–¸‡€zîx� mæ÷¦SLÚÑc@žÑøK¶cg 3>бúݪܴۑØÙzCbyé„§[ƒËÍm¯áÚEN>öþ\- °ÁŒ<1,t,ËÎÉ·9]�¶‘ê5e!P{|ÇwÎ(þ¶x’½i±1²Ö­¿¶¹æN15arôàuÛMFä¿ØÒ�ŒÙ¼ƒtí©£' Ðû—ÞÕkã ¢‘™�TI{v»áȵýƒnz�õßcœ¦š7/cÄTC‘3ï� Å¡ã Aß•òßí †l%!›þEuÏ‹ÂâÕñzøÈç7q [½gtÃB¦KoAèÍ@½%�ßi¥çrcC/ï^/Öu@AAÂ�O­¹Û+>"d2iÌox½Ä®çaý­ ß±9W r¼O‚ˆšô]t�Mé��èÉ‚ó’0ñNŽßj˜"Á°fÝ®f†jl%¼‚Rfê´Hz–Väî�>ÑN;Á4ƒ9½'#ˆÃ±]&í?(4ÞWr V\‹Ÿp‹ÅÝ<ŒL_¸;àôCq’\fk*To ZAgšÝàÞ]O<;¾¨“ÌEo'so�:X*UÑO8mº ü;ûˆ/̃g®mu€â£ÊvÊÎ{ ^[­µ]®ÇHE±ÔxCì# œ)èÆçÓÜc'[V j ¿\@=Q·Ç¡cfcìðl sö­Á“€Ü°ÚIS™¸‚e;ÏÌ–alqײ-³ ÖYlcÀYöbÕäÊ™ö-1uÔtÂ!´ô(¤•Ì0h •¸p#Á£ZP0S°Óªj‡!@�Z¾B¡žö…±`› [LoRÞ:¶n ¼k‚ߣk<�V·ÈÌ@ÓªœÏ<˜ïü¨ Pñ|Üž>FÆE3ÐÐ@}Éæ_çÃkŽŠeÆÍð'•Ùf\ò•ÆšsóAjØm¦UçãF•ÖK™Ó#ÍÝmßÄÕ4ðŸ[�õr|Õ »:ߚ݉NÁSïÔGÖ/!OÇ øÍûÎü�žßšŸž\ÆvG9iƒ‹ëó"4hWB±¼‹5�‡�£¡LvyÏ¢Ã÷µ¬Ù*b¾�l%Œ À—ÃDÙSRc§÷&*ÓiuÈ4mg�Ã�`5ú~g�›Ó÷¬£¾i=öZÝ®vsz¾ô<\ûNáWi€ÇŽÏ°Ä,¨ST&�YÞí$Ô{�+ÿ)ÒjÃsضôõáƒhÈS§-[>µÃ5ÊLØTQ*Ïç6‡Û«a½ÈÆÄ$¾úã‰^ä �îC¿dÓÖ�(åî�ˆ.¦µ§/¹“R(ÄŒIR•A’å.<ªúíØÒwÉ®Kf¹¢˜æÚ¢ÌÑá8µ8<Í��€úþÚH„&­&Á ۈБ{r—|Ï�1¾šF…“}+oŸGú·ÄÝ$±Õ•æ�!$™¤óó¿ÙÏ´D®ˆªn8lÍ‹³R8¿1<`žP®­Ë0|ý8ÞºŽF7Ýð‰b�~­0¼ã—Í O/k‘TÛ�ôœI°ªeÄÏ›õ&h><–>u9Ñ À”Á¦ñ…�Ŧ{JAÙbš æ~ÖÅ2é$}Þ.Ú*á�ïÁÕVoµ&ÓÁ1˜�Æë�@vûnüݺ–$Æ­1�Q]t³€ã¬^üKçvž°Z»v“”E„£Ok{äé�êüp£õÐI6Ä5h×o¸ôë¼Îy‘ øt7Ü8èh½òŸÂÊõ/¾ø>63CR§ £OÇÈþH_V ýh?ÃŒwøó—Ðîí1¤æ# ¥hý³ �ŸPÌýÀS¯Ém¶2š‡¸„)yEp¦PÜsÈE©JUÆØçLê‹'F‰¢È4ñ³–Ð;]c"¶öXññöÄ&Áç×ð|ö˜üeœpϼUFŽwì8ñöËÎó":g9¶ :=ºTl·*nt IÖøÃÇÁh®9ùûk™FŒ�}ÄúX¡ی›+LUÀð{Ö —ܤßri kU�pnßã+tñöÓ �bcÃ{×ìB¹ßV:]¬jª}CÖ¯ëˆ>Þ[ðùC¿g¡= çZÍîÏ­ùŸMöWpþ,S«` ï.dAØéõ®üŒÎ„g*`êš;[î<ޝË-@XËë÷ñ¦"vŸ'P”Fèy9ÅwG(Vˆ=¼ ÈÁåRŸ¸Ííƒ2Ý(¦„alíöp Õ¯AŽwk�’×2, ‰+|{ú9~ÝG8×”´< ÛÕx¼�¥rCMIü3´$›nƒ Óõè0´9]S�ªéÞ=N?–H³A)9›ÕXá.pR–`lÂŽA¬¼%Ó‚S@ÂÜ=‡24Ø�ªi`]ä‚ê=V½ïM¡¬Aêë~hßA(qš™,>ÛzʱûZnô�-<½îฺAÛË*ÕËzý¶©@c =[s¬Þí×£6˜þLíÒRÏÛÖ�ã¹>¼£›Âdºx3gÚîÈåréôÞg òýdiÙiú+e‰ÓÊbÅöw㈰î2µ?´’�AltŽÇyåL2–í¶°ŠŸ¶·È]¯Às�zmóØ:,'ƒc¤Èk�Þ»_¥n%s¹xÞÄBf,")BË@^$­o Ñþ»Ìñ0q¬"1WÏaî¬6.?ªAš»a†ý|[z#ŽeBÊ-EóXŸo”#Þõþ‹cL^ñ†¤ˆ6£ÀŽc:ptÊÒð®ìî=Bï¸gã‡Ô0�»3BÌþ™w[xcÂ8ÖÌçk%É>´Ï]ÃH·É‰,а_òI«µ­ïÒ‹¹ã �¢$ÁqïP3 «a7ù�h,Œ<‹Y†gêÃà&ƒ¹±°Jß܉üØž0@²çÐ`fr€æ;Óè®ù•b~7×{cíùÎK}�Þý5;ʘ?vðš�‹}v‹Ë½˜�Ò!B�ï~µ5Þ–Û°qKõ[œ œzfÆ¾Ž§Ë8#»ÀXBÊ,šÜT€Û�¡â=±š]Ý›?!Ñibð\YÆIÙ²y+§Ãß]ø„8ét¡\;Ï…Å‹L?rnAßT-ïMZD.#rƒW×�’y!{¼¤A%�_ÛÉrVç„=WY˜G8�âo£´² ÆUMÁvnbrÉÒ7Õ7× e}%æ2RMEuCቷë®É­ 9þÒê°ª¹ÈXí­rËær‰{+$|j©ý¥ËÄä :¢÷ÚuZÜaÝÓèúQó¡u° ƒÿY×àq‚@Šz¤%BpM±h;»óO[D®8Ú=̾È�lØr/�là}H{T޲|£—ãò#›çŸ7dd>®ºV"@òÍk–î›÷³¯‰�×/5wì·Þ´ÑÅ?ç8¥ ÷#øÃÝrúÊ#ºÖ%b3€ŽQ8üð¡ÛðÙ—©` ãY˜¶“h[1ù)ÝÐ-âX– ì-¶¼—àPj¥±‘(ˆÁë-uòU“eoÅŒ¹îy8äd¨Bö�¸EÛŒ0_9îýÈHê`C �2ˆç�ÍÁf*ôÑn€'¬h8ÜšÏÚ¾Ü 0~)–²ß€`¿[³7ŽFo¬÷ØúŠþÔšûhÏÛÌbWmU‰áZ0fdHjR‚ÌajdëÇæõ 4ŸFüäp-�‡°Š„D‡([ .*yžßñ‰z°šñÀ²2¯ž=‹vÕ‹Ü� ßÏ ½èŠÏW[|ËÞûG`ðE}÷ƒ`F‡vß›\×óü¡—”ìärƒg¥3 �€,¸}/=öµ3½­¡UªX–!½_´}kcHˆUIïQ÷uÅáo=øÍü~î·™ª�)_E÷y†´%7�4H4p%¶–¸TxsFæ÷†LyóÍõfÖùñûÀwÏhFå›dÅ)g´RpX>ßkÀÐ ¸.ÝÚ]ßH4r”9@cÕj, 3³€ÁÑü,hè5œÈ³²|ªÅù�ƒ¦ƒ Ÿ�‹C#ákƒh¥_6 =çp †ZÓå¶å&RÚÆ=µóÃòô±r´@ßw˜fÀs ð*¤ô j> 0@bƽPG ëŽW÷Ä5k^:vë�…¤úí6Bǵ�×/6¹_ªà¬!„aÃ9o¨F}ÛŒ¢Ôy{wìf#{Ê©ÓU¾•ïàÆÀ‡0*¡�õ>(îr ƒÄÜ ‰V°oW5õȱdÍ�Á!])ƒ#õ[/JÚ+<ø:u¤© ×É÷Ó¬ý óâ[;ú÷?­®Ù¸;ˆðVÜÃðïT‰¿VØ�’s’ÉÛf¼�4£š”;5ówÙfm¹l_÷ÚH{¥Òס.§'îó›ß vp­¸ø�mbú ‚zÿÕ½ü0ûà²|™lT9ëß6§ð§Y¿ƒ(¨7À~sÏ= þ^‰/§^ù%½~Vó9š5Õ„«´¡,š¼/u+Þ étÉÌê— �ì^/­4�º)ØapõµÈ÷S£+$ÿRà‰è¿ÛwýÕûÍ·e šàõ~‰ÇÝ ‚þL¹Êæ×jÄ;*)Þ5Ã;HË'L7ý3+ zO-±þû-Pb1Þôñ°“ÏLO{Âuá>ágFß[4$þi.qŠàC DaKäÍ@=xÝ®Ã·ÊøDr_[ #¥ðÄñ�¸†Åôî§­LAcÙ‡®^\å_xjäë›Ijéˆ�£¾9†˜Ï)#™Í›@ú«™q’, )¡=Ú;Æ Ù”1¿'Ó5 Z÷ÃH]ŒÝþO±kSoÆ:cdª³¨®%v(‹ W)›�í¯DýE}ò•_¸÷ÖŽ¥ÛíÝs› a¬Æ´÷xüŒÖíª­aÀÌS–”ÄVüM�Æë‘€ùøTPŽa_v㑌g BßkH”w¹Y»ÿ{-óad¸³íX/ðîŠ {—Ö�V‡Ö.~ƾ¶ªñâ›çdQ“¿¿èèèBá}‘gâFðt�ìMˆ,¦+üÈ¡ŽxÚg ?Â/ï̵O ^’à–­Je‰Ûægúþç#XÄ.M²A~kú£�$6upÙQã0·Ê.ìÌí›4Ú™?\¾}$žho¼Èh+Ö> õBA M_]f ؆Y½^"/noŒ–²²¦ìùÄi\îÚï8¿±º2èeæ!ò)Žo�Û,=�\ÚÆ¤YR Ó˜b]áp¸¦Àîk @ph´&øðÁðóa¬§w‡gàg„q°ÍV¥æú=o�–à/µ¬+-®»�‹aÐ ƒV±³™9CJ²G:Øi,z�6ðq€Ú4}²ÂáÒ £¡IûÛ¶ÞÖªÈ<äc#_çõ®DZÔ¶‰UýéLbYÿ*òù�¾Vþøðn¹�ö�ž'J ¯ÎÑ­åïinMqhò¶‡Ìêþ=Ãk· ØwYÄ|w_¯uÛCçöÛÅ85ý„ÁÐOÑ‹JMs¬ U<g6Û™),@Å †u‚Q²_˜"jT¾jÿ­~˾Þõ� ‘ÝPdî0ËwÆná…k…)ÆnC›‘Ð&OûW ¼–M]- ¤ôÏÜ8„éiͪ=‡çŸ=É9a±ñìÑÌa!‰v�º�°ñ’»Û¸·èØjŸéÆúF |�p�³Ã{YzŽGi<>ÀQ£"[0žk­‡dsó¨i”¥‘@™$¡ÍÎ’AœÍœ±:­¡ÜÁwëÆ4!ÖHÛ�Ä+…ˇ˨kìò;‡âY•åñM„ŠqšáÏ]‡ sŽàpÄ! c«=íÐi¬D»û¢|Ð*ô×IYšàŽ×¾Ì[Yh„·X!ç9¥ÒÚþn‹"ü3nY$/¼�.E6H;ÆP¡VÊ�°›ôÂQÓùóœíd‚xº?õ� õË,… à¿(ç»ÃZõ[žŽ$zŠa™Ç¸Ù¿Ý›vxCñI–õ“P¡¥˜ÝŒ5†ËôÏ�`b—°¿9±áÅof”ÇìA�Øû,}—îõv#ʲ†ucwúBï³ÇÖTm)@0@ñ{�‡C?mç² Á\ql™R®*ÖvûåÝp]ÏDI‘,–|9¯n/Ú)v!–kg(]+&¨;@W*ŒëïK—¬ës2®ÚÚ)‚i춬ÛèaÊø"¤Ža ûì}Kkç·J.¸éžZ)´ø…Íè/qËÑY2ǃúÒ±ÁÌ: h9­žuÁ_P—²¸›µùÔåôÌÁx-Õ»ÐØkLÄXìô7œåÏ#–FÈ6�DIÒØ…(O^�,†rO†ª. 8CžƒØ+µŸf$yøíµ‹Õ:*ó€©ÌÝ©B'ÄMiM]—$u€Q eÕúöC\Ž’Ý{ª:GP¢L¬.Z¹rí%ÓÉ­Væöh§­v!¿U%™.1¨÷eUY¸XÛ ³ £dÂÀtÈ;Ä0†T³eVÌÍœùV‡pD6<Ñ´À>g5SѦ-£äå6¡và§ÏÎÆz H^¦U�ûœ)À²ª²nn:DÖ*â‹\ŠÑv¬e+såî ùB€˜ØÙhÆ1[³€‰ƒ´¸w[e¤ñ=®-®é,"ÌAÎm%è RXh¯×³0½„±?±�áÁ!ðêMåõŸÎæÓ oÈ÷–�­Î,=Ýðþ¹…—õÌÓ† {)nÖ÷Ð}Á|·i##׋qêpqQÇ!ÄÒ—�ºkM6òói·†ÙÏbÖæ@v�†™px3œe,¶¢¹r×èf¯Ò:3†înÒiý~n3±ÝƬ4Õ�#eÏXà ;þ‡lK�͆{ã§k` ¸‰¬ã§GS0ƒ}EÁA�@p?»ÞHþ~š©ˆ\aÐ}W0î¬áG�AÈæ ¼¥U:[ÍÔðÑò÷gD-!öþù/Nf`YšDíÑôý}’”ÀÜóQ…Ôi[éÈ­b Ðß(®Aj³€ê°cÏ]^:íös°îl>YK÷-=ª¬È"Ïö_Û‹¢rnõï½%V·$…�—’<áéŠþ˪Ãè>ÚÖãBàMee¼?˜�O™–í½ˆ�åÏžÂUŠþ-€Ÿ_sVn@½|ç b¥Ó“äŠ.]8 -Ýø‡ìÑ—Ð!*[Þ¤ÊÂ5]röƒ“ºw#àf³'Œ¬êÄ*].nü\êkÝKÞ÷n÷°[léòÍ¥† #iû´L@)ò+àømjÚó–Ÿf¬½@ë�mÀ±¾ˆŠ´ìîÁºù™Z;/ëÖÞ@zõ#ªêâq\»—žô¤¡ëLóÀ±X±š/‡‹v/^$‰B)·à¦kŸ½Ð.aiïv­Ý5Èé�¾ÇʯX‰½3%_7%T‘„<ù?¾öhÛy\i¸R ÿ·›ÚvyÜs6æõVîpºççpâ+/ènhïÄÁ ¦ázÃ\úÚ»Ôì2Á•‰xµõ!E9Τ8K—~v³ eìX ΄%ptö¶÷×»~îüÅõb¾Þ!PŸp<°e7Ã80™|+åVtD#'jË)r¦ Mwdž‡kŒòqs–:[*-@£‹îgASö걇[ˆ“ãE!¦ý¸ƒs‚|²f¬Ê0¡ò_½~4ä 7i `há%‹.HVÝÜÝ‹¾5'îb‚3Iš±¾ÔÃЭö2îîzX‘ùü*¬ï“6ÍìjÝp»ÖÍÀ¥|Y¢¾»ä³¨k¸7=Õá@Ô@Àìgt¤[p® –Ö)lVi ¨ñ§Çp·8ÄÈ3Í8á4w 稤sk7sMkASŠ»œB`$fÿºlg�¼(B(F2{¤¾%eµV}<Ò»†Ù,Þ;(ð+‚UU;Zý4^³˜�u¨Óœjµë"t‚5~üþN7¨¤€ ¶Õ}l«X§A« ñ[êö¬”A_ÿ8j­N*J£¬Ó— R¬¿Öy.†!È}zìkùþI0 Ñ豨)aŸ9´­Å®ÓñÝð^3i%íˆ1õóòx¶J€kÇ‚åV¾Yõ„5ÂõKw“Q–Ø*Ž®=­å‹U‚÷¾o¤;N;çÇTK–ÀV–%¦A}Œjîøe[ý¥6ó-5 F[vu÷F‹Nll½ûôŒù®!Hß 4ø/ô¼ø»»ÞHmôÃ�h÷¾ÇŸœ™ /DÏê·’ù±Ã@{ \Q ¦q)…ا™Ú­7¶Ð¹¾öq6x…½ÂCž4«±`-Ô-Ûœ/w°Å¶þnc†Á‰f ð9Aнç�yVså p…xÛ•|ñyJ¢.B�1iÂä…Ç»®MʃH‡®Û¹/QI'eí§h-/W¸1¨ˆ) WR=À¶‚0™·¬ÙS4N¤Gò«éq0Ê,·¹Zæmº@¾ Ë6–'<îu7}±t—X‹‚Z1ÿHGì„w Á…çD +ÜtëïÊ$º¥¹ú%õ‘À×ÐVû6Êk8£«XÍNÃLNí=.»2ˆW9Úß ŒA½JÔá²@!S¤vÝñ®�îƒA|ž›"Hî  ›7ȇ3ñÍIÑr~Òîy¾ZÐ[Årgš�'Jòvà¦þ„;Kº‰Š'H·T~xÍî2Ù\,®œïd8mŒv&eA÷pa+A„¡ ?Ø�æ× �[².v1ök»XŠïfl-);[_‘ÓØ±(Xt´lµc\ØjÉ=–{—sÚ*#ê9)¬9׿¯Y?Å~^núîcà¶�7AæÕT_F~k æ«Þôv£ ³|KN4n1{©¼a2.Àe"D_ÍØâÓŽHµžæ`æ<½Y{ æ)õÄ |»+×jÛÕùÙß6¡B`M×ÂóIº”lŽù)»µc]ž‰Œ·d'Œå‚ÄO� Äá{žØ×ìñk}üíŸÝ:ªØîoTøÃèùãcÉ߯:�\cïŠaTÅó ãrÃÜî „¹¹gú=Vý6íÄ�D9páÙXÁÔ¸ ê!l.ÆÝ[â˜ó)LDsO±½²,w+ßšvÜà0ã­oSs�{ë‹P–þì©Þ�ò³ÙÕäzܰr‹9ÖR‡ÍÊ÷}˜AÓª‰;_¬ÞÌiË=êç5Ê.q¿˜=€.Â÷uª›÷CDK@ü Ãà…ö�92g¬`�1"H58èMLYݵeb,�F…¾Ge0¾ÖÍ#E­Ó`zñ òÅ¥ÚÙ(çÍy&Œ ,ù{"0¹Ûh ¡ï&»BμS÷d‹b³­%0PÙÂñŸ˜íùl‰noW‡T|fQìj=ÎBl*0&¬ø,[pW!“'³îÕ‘¹é‹nc�_J7¡v´³G(=´{âá´ÕÓgÈÐTÖBº­Çk\+CùZô˜Q½â‹…ç�¼õ­¢>ŠÎ'Im—-šTªŽ¨ñ�²�Q@}Ì6WÁšD¶ÖÔ>4ü\ˆc+ûä^x[`¶äØTýO¹…lB¬„¿Iû9®{õû£PÔIûŸG8a|ŠhäØì²Äp!\àFÒì°V§s¯ŠÃBÁ¥ ÒŽlÃ0ˆt“¥OÈ¡Î_8ùÕÄ@Î�ç%w bb¾(fØl#P;Y˜¾IœK}¼B¬e’¼6Ö`'KÉ &ñ÷”ÚÛ�*ur O,­Nê#[œ^½/cWßÌà¼åÕ\»‚xßµÔðË`ÓV�¡JöˆäNÆå¨PaÏR…­ ÿ.¼8ê”Êió3`cJ3U@î®4ØâTåÌZöÖ´v‰Í“K¥ø}È{>Tl"ké¹lYȬìØùü zÚÄ »û%z3žo{»º÷<Ö=’–a¢,ñJä�ì¶iIÍð :!U7,Y¡�šD¹’ $b²×ÃlìëÉ2Ó¶ßTˆ(ÓÐçí7ÛÐ'{ÛÀŠG‚ŸJõùaZTüv=A~PãvÅZ<ÍèSÇ`w‘~‚ö¸ÄnC*Þöx›:'«‘ƒ2ÊùÑŸ1xÄq7Ýá^G s@ɶ@ ìÄ3Ä5 jP]y¯C1HÙL[™ p@l’å`x¼ú´¢,¹#‹ÆÛxÃj»MmGg}Û[Áò |Á�æ¡7<% ó–Z«”ˈñóÄ£­°P9mÂÁÑî/¡¾¸Ž�!û“´ ýÐ)u Û¤'dT>Ÿö�;feLÂøñQ¡~¾¶Gò o&@#Œªm"˜‰ÔšÆJ¯íí2`™PL…Èw�ïà!µ£é·Ù�®í­îJE/�ÍüáâÈ 1áÖº’ùM5"ÝÝNJAvZQÑÊkÀÕËLÎä%Ö嵑Þà êšÛè¸ÁœÜP¢rš+¶ð;5/™üÞùíãl Wí�jt"EöÂX}Þá%¼®’ֱ죻ý½p!l±�uouNã)Y@XòS§\�ÂZÛ ¨AÀð¡uÞ\óËŽ0Oøp#ˆý +-¹›,ƒ¢*™¹áŽ`Ï‚iÞx�†Í9€3‰uHU.ÜuÐÊDé–œ-Ö¤s¬0PÒå�€E±µ¸÷ÑL7™¬¥7¨h4l^ÚÜòØjÕ¢^ñ &èñZ-žQ~ÅÞdY/{³Ö€pÊx¥;HÅVáYQ^¶½ô¶,…�þÂÈ\nßn»ž mïG»R1„m�P_W-#‹FÙe»¿óÞëU}²"€R€òÒ”P]ŸïqL­hj¼~ ¨wu~ºqö0·ë EtB"B— *‹ŸÁ Þv ÜWˆäÂ$¢Ê8‡ ðTZA/bmÄ#>÷¼½:#D}½½h£#ËØlé}œÊ= íó®‘P^q[ËÎÏÀ`›•ÏêÊd-IŽŠSÎà1QfœnŠ7 ƒg"ÐÓþeäɬÀGÀœèZí’1×0>M¡‰Ä*%ö³Ü8Í0Â;äê6ÈÎÃ8=kéjüóŠÊ�UñÎöª�x$†^nbï0>;÷5¨ý�áÂt^|4ÎZzŠ£øop†å€¾÷~ /“^VøPý“³ÁÐ5ùR”§ ˆ!PÐS—Ú-† æÈhMÒé–Ì/¿éÂÑ@Û¹_'�õSqCñ1ðUa%¯ìWÁø7?Üzô† ý“$¿ôï=ì@Ô¢[&Üõ$Ú^?—Ü* '@“F¡[…;˯÷Ä»±!”J�‡IçAâ™>Óéûeôô16Ø^"™·Õ~¸yä­Œ ȺÕ›ûèŽæé¬ûËZ[ùÙkv�43Æ›êàôÆ“Ç>�¾ÒÛI—«âcj uàN,MžaIe0 :hB®ÐŒIpV`¸6÷Ÿ5óáÀ„ötŸ�\âEpSÝ[½?aZ7&“ë�f}ÓÝç¹.Œ€¡;d�àIÊëÞ¸x¥ŽÞú‚a=÷Â!ðqÿd®!°[놹N`]`;×ݘ¹}쀧Èüj+{z£ˆÏµh�H¦ºÆs³kŸT~ɼ’œ·ïY-º¯?�@§¡i))íœjiÕÙ:™æÁ—wûU±W“µ=+cñ‰œ†õî?ˉ�œïíN×»Þ³v\qnÙŒo¸y( bݪ°pšÑ*U±ï±íù²ñÐP`gD¡h©ÍYÀˆ5u®Ÿj•ðu8Ábúó4Ù™-FØÐ`ѳ?GN7ó†Ï=‚ŒìGF: Ö\MË7Np-ú‘·¨´´½,ãœ:È-¶7¬Ÿ y>RÝ÷^æîŠPÇÜ*.Uƒ¤  ’¹Y�øÏùùñïFÔД®Ë0 )yÛp£-¶tÈN§>ög¸—õõÅHCŽRÚLKíÞœ2%-ö6;¾íðÎù{þL <‹¦ú‚’âð…wY·VU{²,ØŽÖã�]ht¼M�ö¤E]Û¸dù°º¬¶-qã‰zÏ@ Ý ÏÜ_‹pc›x9UûÏǹÕñè«·fúš)5ø:ÙÛù³Þe‚ø»œ�w‰ýpAGr�Ë×דgEظoøNß-1~½Û[>çd&ŸC<äsb<áxK¢óí¨ó>ðÈÊ«ƒ°?4®Ð(#âJb bÕe¹Âój^ú¤ ÌWy0[´n8ð¢ XÐáë6UÝø$Íp0sÐÙô™ªÉì�\tÓU–»…&A»ã~Úé9­�9·e#~€.®Ñœ(4Я~ÆCk¹ lì’$ Ž>X2.¬!zj{öçÎ^ç½^³×Tnd4½0^äJôÒ¥pš >­VÚ�?2²D5¤2G_}Ë®hU¾"a£Ë§­Ð&õ¨¬.¡Ž`�ä'Þ®{.dúvD Á&Êwc QHæð Gm±ÎF®Ž�€� ð`T#wl<‡+b–¢ /Øî0ØK°^  $’¹–Ä­Á‚UîqUgëšëäŸØ½®Þ^öÄ–|‰ö(âlª…Ã×ø’Nbt!„ˆ¡þMÆ×ú¹_]•-'rûúÑGÌX¸¾]hÞPWé÷—ÖT³¹ë¿*bç6ö·&'%?r�µç1Q„óàM-9.ÝÆü%+‰Œt¯s)úóÇp –@Œö8{�¦èÖw¾å�…7l^ÙŽØX+"egÂ(bŒ6ª*¹å>oóá‚Ò&iEÿhÔ ]•ùع³°´o%¼�ÅU!+%q#qÕ�Ìí‹uf¼W ÅzÔ½ÊS䯴)ÀÍ?1Iêg ÷¦AÚ½ŸÉáa âºâßå–:þµp¡ó,‰òo¼®0$”;RÞ—6±èÈó­ªãnóëFs�Œ¨>o¤�ñL¾[Mk¶ühœÍt ÷ä¼9‰8Z—®Ž’,Md«„1žu7¥±ôÐ"œµ(À>ä1á4X�Ö7iôÖKyuWxt+ÔzÊ'UÝL,‚qÌf%/±²z‚#x�è\Ôž`ïz{÷wöêâ€=ð�tØÉØÉCTÁ# †5EYç>Ð6~°!ÇZ&ýŒÝ”L1%†ïŠòY„ 8ƒ‹þ&>Ý,• ÊC7‰_X¾6ÛÀU@3EçJ…rí^ܻ˱ž—¶ß¾Üt~€åéõ‚L9(LÏ…Ó{!ËNbź¿�¡Ø ½kLy¢¾ŸrÃØÆ¤½à㎙=°áΣYUÏa«ÕŸÐÀП'Þ�ôz8ID€¬ø3êV.ÊHjÈ3¤cÉ«ðšF𔓬$ Ó&^µ¾Â«¨´ÈPF&*YǶbÉÇ/ëž“9b¿‡ ÀÎHW†{6°+ÍV¤ímÒÕF>žbù•k=÷Ê~qõ——Ø–ô7Õ×… °0½nN‡ùë�ðºF¾0Œ«bd·p@ÛEkÝÑÊ2U];‚÷y™FXiêÎ@ŸÅáytÁ—žlAkŸˆòEaöàä7–íçŸRânà6¤0îU5�ÚÝ«_X6ŸŒ5jlXêìT�U¹Í&äMN¦õd¸pH2{élÓcœ¬È^­¶­7�ç)>i³ûFä«¿c œûduÎ;VK  Ýñë¡S_‰}Ũ¥ ¹lè=RÛAkš!nŠ 9ív,ZÙDmãÜTç¹QC÷Ãz—xÙ1äa`©>1Ìâ ¿?p¡¡T<í!TN�)|à~”…(mC³4_bYmP¹ ˆæuš;“ïj!h–À÷}µ_L’¨2nØ|¨&Ð[§Á¾XœM D'V ÊßÖ. ªN±Tèy�y+�w”mËÄ^Î@“žBµk˜#°gµå.h†ÌÔDˆ˜ÊÑ޴˱ ¸ÆGàßmgÁpØdöŽcÀÒOêÁ€sSâÕ�CÒ¹ç�¨7y%2¿½þî>íÛò?­zÇÍ#¾�ö’"lÚ]AæÚÅØ»ùJÍo•ÔèX��\“6\-µ’7á•mh…¼»™›®í™À":2©n©b¦¿ÅøâòøiEÍËÌD%÷�ŽlA©®]`wò§…ñ´¦øÖ’ün»ƒW†î·M×:¸è(;ù÷œ¥ªŠ4L<ÀrƸP]gâPŽéÁÙv üåß©@MÎ-�³\w«Ü•ãñp4kèú§7-ø:q‰x�É^¶>ªUt¹µñ ѶÙ†ÈñÃÖnæ^ê6ÃŒV8¡Ž4;Û'Ë%í¤X9½Àõz‡“½f‹¢�e¿zéܶ¢ºx~üUÏyPBÔEžY/]a¹²�-A/6Z­ dà3;ºSºîû× O ©ÌÛÍϹVÈ“rbË'^¿QƒÎgàîQ�ÝwK|œ´6›ËªöùJedû¹gyXÃû<£¯ÍS�æ·rSV<8ø®–[a4Äīл¹ðhõ¢KS+xz-n®ÍLørú¥®Ãr 6yøñ^ª::×iêF’9UÄþÓ{#‘ºç7Ç3yÆBVô·À ñ˜#!w»d®`G¬ŠÁ �!ƒ#åc2·½Ð5bÄœBº¸·lK��o}gÏ�íuu¢çî¾²Éö¯¨wñ±8c%Âc›%‰WÝ#_sE«“¼•¤U­M÷mÍOx¥íJo{æß¹]Öœ5Ò8sLȤúRdº§_§‹;wì“�e�>Æ�åßZM1l2®W›Þ&cÚÃYúƒ­äדOÂ1‰ âæÖ‚!ÌpüÅxæ!n6º™nMxfkMKÈ8¹QÞ#{ãVR€õxy+fà}v ‹ƒb%*6ZÅñÒœlÎd¡ºÀì™Î³"\ FrÞ —aÛ2¦É H›¨ÝñŽ/ š•^<`,ùXß*ÞÑ ¿&¸Ñá#®*Ü»M+li3o´wf{J"ÐYQª3i¤6ªà‡ûÅ0™X†—ouµó¬»\ôŸQÅ:ÄÄ–×(�@-毲àBÕÏJí©$Þ ;7 J¤Áö°Û-ñ,ƒ³ê,v^€™ù’¼5MæÓ•š¬‹^¦;£þ³�ÐÆy”t¬ÈZ Ógã²ã�øšhóºÂpÅV3‰R›ååë‡?-Á,£;�l$ñ8íwÕ˜àÙ $jþ”'ÚLªˆÍœFø³»®T""0·Ó½õ‹#r£?lŒi¬nõl§y¥\Of)y¸;bdac6áÈ‘(B3cƒØÎX¶!x M)J.9c‡-T¹-á Am¹óûL^à7„/¬,•öÍ ï7” ³S\Ò…¦ÎS¯ë^0†‡#8D¶Nì?6û]ÜØ|5¥fôk£…ã“xÀo}öAàУ,`Á%Ì^ ²6°`V9Rht—Z,iž? ØVJÂúŠXÜÆÚmŠ’CáºÈñ?‚ËÁ}�÷AlYp¶.}N毡ÝÙûj³³¶ÌŽÒ< Õ¼ T6lŸnÖð%ˆä3l%‚Ir–°v›„f@8G¨OÎp€:ŽÚ{ØvÙçôb6*p«`Ëa”p�ß̘›hmGf 8»R_l¼¢ncxMk)¹ ôYbÆIðj…Gë…éSFÍOVÖä´H?lSúŒ�5žÈNဘ\ß° dR1°¸¨‘E�Á83•�/D3’›tù-cë`x6¾­â¡¬^'G˜žò‚ÎÕ |Û»MÐ ¼L]àx4R¹aü=˜µüus \ûãÅ ç‹ûdý¤ WŸúl‡Ð¤†,oûÉÕtÌ ÁO¼�e #YEP¸y�‚oGà.M¿Ÿð ¼ù¾6ŸŒ#ÈãŽLÞÐüŽóµvá�a rß㔬€Ü͹›ÿ/0°A)š8kò³Ñž;5nL˜c{ÎÀoS ¦Îu ¦'¬¸úµ:Ç›O¨{0Cf2.0•Ô›Öpí›ì:çq<ñpü¡\¹™·=sQåTÙÅµÍ L.…7anðÖòÙyf}>´ÍBðM¢Ø<œƒׯX¸yÝÛ&y{ƒÖ~¯ X•»±¦€ƒÆÊ~uhÃÙÓªýrpÕñ©Ü]¹J(õÓÀö»+Þæ.õK¹tFçH“! ‘iFb×l’Æçš—µ½O‘ìãs´Ëb¿µ¨[ûòæLÜ- a�¨ÑFÏßχoŸ’6Á´fpدá­�}ÝѼʇXrÙA÷ìè3§[„ô@µ²ÄÑé€àX÷yþŒe`zÀ¶ãÝA¡Ú䗪ȈHBõ œÚq“Cë‡Ë}½©†Sä%4d�Ûªm§{„€Ç0¡� /Àؼ–,ã…ììÐxO¼Çû(Ïa©"ƒüwH¸Ì�Ä”¶ÌZ¼ï7¶=q�6T CQc°‰®!ðöf~Qh(¥¬ÐÊ™ø¥Z_WÅ{9ÑrÎå 1GŒbê—´‡{Mª÷•v>ïH·póŽUrÆ÷ÆTÿL:÷²üfî¸B_Zƒ wF; ·èÃJ�a@ùtD8PD ¸�'sôÓ¼í.O€Ç &ô‘|õN}7“c|%éFŠ$"ÿ‚7í÷�hÓk?gÁ­Cå- M`©]Ç­ÅÁ”Œdgë@Íc]W9zmcX„ûîØ>†H1Bö|–F^ªžã’³{†Ð§Ð[~8Âòá}’†B%»ÆXŸB,ì…/zÑE9ö“ŒöÒøÈ>[_€÷»mfK_J¨„1_‡Vñg6€ Ÿaêñ~‡H÷1ÁÑI| \_FðÒÈ¡9ûƒxv˜ZÔ—Ç*bGïŸ |4uEÆÏDìoq2¿jüRÞ@á— ~Y«�Þ×hÍåâZ|ùúвÑê½¼�1¡+ï»@KüÙÀMHçß77Þæð½éª\¾b{z˜ÎùN/.õ:GÕú›´‘)�¨—ÁòG³Ixq¿Áw¡Š!‰oG»ÆŸs®‚…ó6vÀÂçÔÒö™Õ†¶+#}Rò'Ø.ûëzÏïlCïݳ/g Å¿gOÖL²“‡5¢õò­„}iúKÞ&Zpä1tŠóq>€ìõ¬Zò¼{­:�º1…÷Dm‚maŠýÝ܆·×�]¦Ö¿_k€P�ÆÎà�t›T„%‡”†W¼@*Ö«ÁÔIY™–Û  'ü‚#"]¶�<:ÁI„q‚Ç¿‚qìÈ;Ü´½¬Šø° A}ºq‚Ïâ[÷íÁòI¤W¨GÍY-Ž29psÓtž0µ½bôWw&GA·Àn.�•L ˜tãYwdÏ “êÏ”¶Å#Ú»4„u¸N+· ÃÖyôg9² ÁÊ#§+ÁN¯O iÞ“Ïó^‚†S¶Ì�ëèø˜=zÏI>˜~ìªß{?yQLÜÔBN ·º.%ÛôÛL�Ðm§a¡ü^¼mÌ•‹ µpN»pãIðòè)šUTã“Ï˾\ÝÈ«&ñ¼ ¬€¡†‘æg¸¦“¿<·.�Å&ÇÛ??,ö†0îÇ©RòK�ûx°œƒ `Øï…TöÜd¡Fng%rìÞ´FÅîZ`²Ë5:Ö²WE s£[2ÙCçL:û©±í„^Ð À¼8`Û žiËà µ‹–벪ѲG@¦{Àe�KÛT�ýÝ÷•}8aŒ`÷R§8À˜0Z^Û¾¥qÛîwï OÄBùÚ8ü’t'ùˆ>Î~ÇxoÌ¿ø£¸ò?ÜËÐØc…[2jU>á@ïÜüJ°Î@#ä[¼Dj§Vç=¼…œÍ¯„½gêN Ý; ùR# I`C.çr×üb ± k…wx¢ä­êW²v(Kï¥>¹û¦îÔwíqÇ'"ñ�=²¼ÂBׄ =&dN-ne~¬a*ç2²Åâ}ŽfºãË3ïi¡¬©hîy\ 4XÎá¶qb…ÌÂ�ÑDЊü,(L OFè d~ËšÒ†±ËõC=Ð%ð`m[·S—=°À+¿ØÓ÷wêLÚ©‰˜à.é{@š–ýwŒí$g—ÉkÖ‘Ê$ùù˜‰þ‹´›‡æÚ÷öï/®_ë�Ø’âsÙ‚ˆ1k°|&´ÿfm�¢yü JÓS—'uƒ!½Þ%çS#:E./ ûÀߔþá~‡Åò9äçøÃC{doŒ€“N3üsÍH»É8K«¶a=~<8Af"Æ~L“?îËhÚÞ¥a+›V¯ˆd%!Œ0Aë[¶J‹ê¹g*†<°[Oýz>â·†²LÏX`ÜÒ©50¼È邨;þ õú¢i~QŒ-IhÕÍH³yR»vÔ—Øi˜[úÈÚÓ÷S\H]šd?«˜w4·óbSN¥%"WÊ÷<‘˜‡«òøöÒ»ZÚê¯lí÷›úÙåPÅU’Àd»_È ÌØ/Íîg2à»±±â (œÐÛ ­÷2­tÖÆÄu]õœ£\Â{äs•£�X;™VžVXh³ª�AYCZ"o.pÞc¹dÛ-¢fí±DÁCz—�f[„ŒÏ%|p×ÞZpq` ï£&œì¡yô¿(RÁŽ÷6NqóÝ7kŒj†XÍ“Ü�l¥m™W8§ Ü%wd+¤ª±æÓŒ~¢¿z ¬¢ƒ5²û¾Æ ôö� jÙÀK‡èl™‡N*ØáªhjÖNÅ5œÂûÖw¡¦æÁ„ÔÀ�‰;™�ù�íÚ}«P<÷¸É#jÌ9¹¹„Rç® ¨�ËIæ-ÕpQ›öH |s�MÆõ Nf�¦E|Yq{¦üÖçj¥]{°1hF[7è´ëŸT+ÚÖ÷Lß‚0C~o»lÉ–î'Ü:A ¾�,?¯tW³ïÊaˆ¬ü‚ÒÚ¸â´n>š'`õe²‚Õ2 +7£>§é°dW·¨`ÑNÿ}æs¶Ð}ýjÝqœP¡gk¦d-?QÉ |ÛÚè:9ý¼4_v×~»ó¿Õä¿v»Â`-¦HI¯” PŠa �½½~jxÑákÖlä 8ÂCÑÛ>³n†ú<-08�ØH»BŃ«1�Ìe«L€ñí;ùœÉ“¥7-3ú2»ÝJGëñ¬o±(¶Ð ‡o®ãaXÆ}¦±Zùv6`ÀÈ\ÚAÀcöŠ”ô›š¥ù¦b(h@áöHÕËÀ+s s݆­IZZ„ØFžÜ�÷‰;ö—â \öqp³mì- K=Éa¸â9 r¤Î1~„j‰Ö’ë‚Ï;C¹ŒAe—çŠcÑ‹æÌZ? 2ÌßXáí¦&Áå‘[ÏS šÈ¤ ±ê ³ä³‹`š´Ï¯k̃ØÙ%u_›Ù[X+ŒKåü¼»:èîÙEýËíáñËÛç¾zÃ$�[~]�ycŽv^[ÚÃߌz±è¥Q²™UC�át‹ƒæ�ûni)•€.ùC½°ø��ëyÑ7H«”6pŸƒÎcä. Ï®ï{·= b¤’óÒ�÷…b5Q¥\ÁM¼/«®> ö‹XÙùÄ;¯ 1¹^aðå«4_Œ§WtŤ6¥’nÉAaÇ´í_.аˆâºH �&k¨ç²¶ Σ)•;# + WòöðmXNkã´­L’àçŸ)†AGe–G1Ø%þ@Öô™8‰Ó‡98ÛJ _x!lÝÀè ·Mh4éuˈwäJˆsƒ,ñ�ØeY­ÑପsÛ6’¶lvÆôàU±Ð¾ ºÊSˆŽó`ôz¨¶ˆï»l¶tO»vo‡¡ï8ÅÂï”.´¿_}ö è§øÍÑÉnèƒÂ¬ð>KžÒp¼ñÈs¤Uš@?ÁåÃão@6Æ*’·¸óý2~yÕ«’DUåÀT�Ž*¦§»¹Ü\ [˜ù½½õ�¯ãÌ|ÎM?>óGØ{�‡°�T;B–Û ¯wǨO< |ÅASˆ/¿>ÛWí�]0XÎõÀHr­õñ€üšVÒyU™’ùAf,¾«êl½JÖŠ a›Ò›ÚRt5“+²˜ÊÜ•��X¯ƒs¿±µÅA�÷>¯Mlep쀽“ �P R�Jˆø¸Ý“¿r5ÁÔà”3lòÁœsx·kƒ‚2WËý!do—ßmêøËQØ/ׇÿzRãrÉóÁ‡AèGJ[F]ÿIxòâÓ;ºG>!0†ˆb<�ùº±Ú´E‘ô-k=Ôq‚+ç<�Oy‹m?›Ïª‘Óôø0;Xïmzp�á²�¡Ò{¤õçÇΫ_ÐÐq>8 b Ëm»:‰…vxØ¢èÑWm§.'qg壳¤ôe3zç6ÿ5d–›Óáöãë_�® o님 p®sîMôîöu¶þ 8G¿Ïý»F€ßù"~sqÖ8�Ð…ßøCÚmëo»|ŽuÚQ ¿ˆ ”Q<ÁXà¸cqzqÕº™¬¾ï˜ ÀäÓ²vr±»»SÛºP¿5¨›ž¤´ ¹4:^Qï¹ëT¨¡¨^( C}3æe˜-Öe ¨È¿(7pá6±¹‡Þbj3«ÿ¤‰£‚ίd²ˆe¸<gÊÑewïP꯫ fÇrmÖ¥l�ÛÁÚêÚÝ­/”¨jŒM/Ìk�ï‚ç>–ˆõï¡vß!!…8{S£8W S]ä\Ç«i˜n˜b¬ ¸qEÔ ‰c¿g•êŠÅ•2b|Éb »èÖr†ÌT³«>CH {“Þ S¶‚¦›uìF“c÷ Ü› …üq‰ÜOnå‰�õñ‡9ã¤xÕ„Ô›1%�ˆHÒg ÷ÞèØªú@‹“BÜŒfÜ.w®1ݘÆÍƒùnvÕ‚¼)t4ß  ö,LnL}óe\ÒÇ¿N|뫦m£ÉÙv5ü³¬ŒõPA\Ae[x=Nž«£¹~äÄŒ Ü”r-Nh±Ù»V+Uôa³¨öó>Š›„ã¦TžY¬ÎåµêW‡ã‹~ÂÜ7� ð`7jXÍûY9ÊÀh]"ª F„ SÇëSc�bº×†\z:|碰åŽec6©µE&qܸ V ®¾p1ØötÑ­_Ev>j¡Êô`uã°ôp þêz�"�L— ¬²-¼"îk¢Ì—*í Úö²^lhÿ¢ÝÆÕ5]w:âoa¯¹‡žï™{ ¦-u ÚýžB»VËÎ8®§ûâ`±YÔÜùÄ? œƒà»ÔýЄ†ÇMnÒ6†í ¡ð�^þá.¶÷Ʋ­À˜Qá¯á ñ ØLz\·°3‚ØðÂIçž(…A˜k?LBî71kÆê›·{ï ?¨¦,hªã¦¨…~½ÚO¬F4p?˜)/ ×ØÙ˜�쇔Ä'ɵNi!îø�è 6mŸ¸Æß7í^;Íânæ¹FH ÆÌ2%óc!RôDÓÝšü�„ˆö�s„(9ÎÈúuƒ@¥MÖ]èÒºÇIÎ…á¹{¤^,§vÛ³¶ÉgS¹Q}Ý, ;VâÆ(Õ”ç¦&åÙJB,)•Å4ø&¿Ã9ÓÏ‹îÛÔÚw¿ßF,ãõºSÍJfC¸û¿.ðK"›»¾p=wâòëžÈipk®o—hÃCØ ¬¢]ȳ⎛•n)ıM¸”íeªÐ3¬Ü* Bõ‰ðhð¹oÔvÖ4Éýu`�‹#˜m-³y |Wåè«Ç] £�íªlÕM«h[Ñ»|Jó<ßÑ;†LÝ©öÀZ„>/ó[;!±‡v$ì,¸+íÜé7>rݽAñça"Û/ÌUí§–œâ"ô�u‹ä0í·± :zS5®Y’§ä-§ ¯�VV<þ¬6 H•`-k:oÇdÛg!Æàdw-ÑÔÛÛ»L!ØÞ�Š#¼{ã]_ÏÛÊît~ 6!Íh™ÏñOH­ÞÛc«Á;ýÞ\<'�ùÚ{jKÕ´[ó6BšÌ‚vï…]Ëãæž°@ë �9ø²8ïŽáÆ Cáݘö~|÷gÀÎÜo~ˆÂ”Ö�9%9*™:¶Ç­[µ†Cž§ÖHñ¹§Ý†ôIì¬< ú<ûHéµ’áàZ§ qHçÙÈy\âz÷ÓØ}¾@„ɈÂZ;qÞ¨†�°^Án¯sÞç"}HÔ×ç—]×±”ò”9f¿?S²˜ •˜o?®ž½ƒâ]2§DÔG:¹…(@¦c½ÃÕ x˜a¾kR[éþD Úßí×k™—d2Ø®~Û%ƒ ¯ÍÚ–]éËgU&ËÔ¬ hèÛIÔ‰’Ë À¦3k5´VO�ª,úìYßàì1ޏUþfU’¶zFçŽ?%ÐÒø#öîH ;O®¿dæ÷WÔ->'›¡ æO�”þ*2[ÛÏÎ}´šÏÕ?•yaÁʈï§&Ä5ÙÑ%ãÑuˆÞÇOZò1óë-í;#›½¯³ùYÛ•›tÙy~x Uæ•8|¥a�=+6MþísA(ÎÏT¶rlZŠ�}m§ÃÉær`�— ½š{DzgHXtÜe]䪬u‘_£ßb7àͱ·xËžy�é‹®3¤óY08oêÝSo.ãA“ûbeù#]>8÷eþ›Ñò¯-û@|©æ´˜ícñ¶ý¨ˆ ð/‡s8ƒ5\ôe¬^‘žSØ¿#€ûè‰1¨[|yVÅfæÌ¡ .· lðè¦ÖÑeN{2û5>Ù—¸ânƒ"åBMe�ÖFéþe¢‹×•(Á†Tµ‘‹™=q7™¶_¦£zr‹›½ëضA`°ot ºz×(8¶*'—à ‚ÞSܘój¥ îÕØúì(üU)D+1\.Ñ‘³(4bnç�RCÆU- à¡´ …wö0n<:k›²œæ’±ÞÍŒ7^ݠ¢l2ËyÄ �×Ï'Òã6³ÈRÊBLÍu©U£Xä¨mEĺv¥Éq^h«ê’ûˆw BôàH:Ñ=;ðí6"Ö ncZb@^V!à ?¬Ñ�Ü­înd97²3ßÅV´¯ñ櫲{c ¶Úå¾_�Ǧ«÷k¯lˆðYÞòtsZÇçïQuÓ²t!‰GÈ mÓ"`æ’û}„6F›ƒ&;æÎH—¹™©´¤*åw‡ÆÕËØŽÚ³Á;=¹¶ãb£{â8�|m—¦Ó�•v¡ìÞGÖkg@öæQ´óåæ�<ܨTN._pçá‘vñrc˜ù³ÀÓîòÀ8¸¢¯/½¾×ŒNŽºä €Sj]¡#µ¾u¹N»¿‘ŒcÄ·�AgåFQ#?Ñ&œCóÊ`×?v_W©£õ%“WâÁ#c?��/3§o›Dîé‡yÅ¢E»c²€Ó£1¼HH°þ'p‚áéo…¦á”•c'ÞbÁ4>Öè=<�^‘&¯`Èï¦;¶îfýáà/^ɦÞio5Ì}!] æý±&×YŠ{h‹4}6�9-ζcpKH¸ä€ëTšh®¶´ò^á1�’üf7¾‚/Ü—Ú¡ô‚ýÎOówÚ`ŸÐíÆÀkäÑ^£¸‚æ)VHy±¶a½cygÎG•å¢-4ØãÈG§mÚ­±kžŒo�çrدû R�þè z�@°¾.ùÚæ}`æÚ‹Ó·^n ¯¥4"Ú"UŸä¬1`·»Ó”[uK¯ä>ƒül®…‡1†’MÝWQwI�ÅéˆFì�f9®¹¦� >à…tad!S |~ÍC ù±XIPýpUî}ê�΄ o¶r$ß923Ì%PP$êt·Š:ŠÐ.㋬ÙÂ4>¹jֲ˷D,f~Îí‘–›Z“e�>u Ž,”Ž¥ q(¥BäÐ+x®<ÔâFÎN�ÒØòNx:�>¼ Ù%ª�céè´`{Ò†F¥ŠYBÆÈA;-Î5ì "ÔGsj‰#¸Ú·~�œsuìËmx1Â�ø¶¡»'[µ�†,‘A|û¹C‹&­øß Ÿ\0ÈR¨È×ëW® ÖE× <³Ö{|1Ùî]PéÉû�PQ%±Œå¤yVå­Ëc¶¤ =±X:Re—gÃOQ!Ð7ý¶7†ä žàÜ ¶°Yôa—ÓnBï0èdÆž5ʲ:Ú›Œ¬¤Ã€lƒµ"¼Sç gòdü7bKsŠÿ¶í €¶rã×�ñÖ¡¨éÈ6ÎZÆÞ4Ë °+”} 9TÆG©tCUŠeì�žâ�mÊ…f.n$JN®ø�ÜØýž.›žDˆ2àÖK¹Hæ¡ö¯-ù›‡ŠÌÜ8êwS Ürø,* „³yÁܲñ…“»ul6k4 Ô­DfY›u${”LûÄ®`³]�§Eš‹vÝÕñy>–Âë)Ðîb+H28ñìÉ˹ã jÆfcô0ØÜÏ“¹ò÷™’‹¾¯Äåº £÷Z«7²¹¹,…ô ZeÀañ±Ò[Y×4îë19ê&V‚\¬þ•'ÄNƒWºy̼õF1&ÆÍµüÓ�VÔ¾!ò…R8ˆgÛ,Ô"qój!% ¨]v@*Ýh$9œÅaÖŒ.w&‘Ñs>Á?x0‚ Ó¯x!{©-¸u±_MÀéÎï…c²ŠàP/áŠ�·ë¾Ü”šÇæZ¤Å)J�C®úov¨Duîà\¸H’µÍ¤dä(vù‚㔓§v·ÃÇ­.™î,¬³:@4‚W³?!ÕïÌäyu¿C²)WØ’VÛèEòþ¸YÀ^ 3qJëHý7°Ê¡âK…(3�ÁúèÉÖÚÑÃK¤j³�uM–úƒ˜‹�8õšÔÃ0)·•¹p4iMsJ�[èÜå‚súN³Ûб–:0òã€P|˜ÔxºâíØùR†ÑMˆ¯Ãqö±¨5œCÀãæÀ<†µz;Jf�ùzzàƒ¥‚–¥‡IMñŸ¶`ÙZÙCê×Ö¢ógoÓ^ƾeìâ¤ðN|PEïVÁñ¥µõßkhA»{³TœKöZ ‚òq-VÖë #Nû‰o¡Æ~¹ÁñáXá †ä1oLEƒ‘x XȨ%1Iòcs†p�‚NË8ßc8Gaü*z“°žª‘¹ˆ)´n?(‰,ZŒÒK•h ¯j]7¤î€ÄìáÍí“R¨öÞ$ѶÍÞÑmùô¶"‘áDèúg{ä8ö‰…KýëO×¼Ñ/n÷Œj·l?í—Ë=ê–†êŸ$×1¡?ÞMÓi¾�âbx0áÁMQ,!Qw^q%g&1Ñ&ÝŒþä7Ï·ä‡ø´/¾WÛÑTÛHú�Õ­¾Q}¯£³ ýýÅæ¦ê70øÝ\ÁIɰ÷<mºüÓ@y¶r¹Fì6ZÂë›êuˆ ”–˜nÛè€äH-^_$Ó’b‹+à ðûÊ^–lü E™¹Rèÿso<ùã6Y… uû¥y &;kTtÃÊì :‡C¾³JÒ�ÍÎq^NÈÙ1z$R©k]¼wù¨·‚ã ý½eónX»“ÎÑyÑ„)Õ„ ãØžùNÚÚþÇFÛÓ$/¬¿uÐõŠ$.>¦×Á«î̸@fôÅ…k1쪌޹…:Ô=ð¦)�œ„Oª÷½);Hl�­ ÈÉ;±c‹5 WU-RG/â®öü©žÐÜc)_Ax°,Ls6V5LRjÅ÷U€Ÿ™˜µ¸!öìe•†Vàµ?$¯ö>ùß èÙaolj{ȆKDÝÒüíÁ‘lnÖt5ÍjOUøá»}ÁÌõ*µ7L£^X…Nn,U¯Žšns2$„µ¶"`òY–YÄ‹tÞ#è‹DU`´™¹/'7´‰Â„ïú°Î`‘¾š®y�Pw±\ 4ÛV÷÷.ýê—~i<¼ªú=¯†}'ßFxã»N cÒëãöu�~‰¥™Ä¦²Ò8�¯z-ø0, gGB­-f�¥7-)ž�Tè5ö­¥ÄrÖU×hœy`yNÈiB,¼çµG»6Ë6†Ç¸HË*$íWldÿ°bYI_Ù@Qy{&³h•Â1æz+ôÊÏ9ž%[ U·&;“ã,¢Âå#ñ—ÍrC)ׂ¤Ay•‰¹Ž°WvÎ>ªÏ8~ä2³N…YGm“Ïl&«`3}\gY˜{å¥씾˜Œâ©n®%(è²l�ó6w,ZÓÜJl1Œ] q{^H 'Ì˽°_‰ Â"3tš�}`Ÿv¢•aWTBmœ=Å´mÕ›Bûæ‚‘Ó&Ãm®:�‰¡˜ÄÂ@ÁãnG"‚ �N`² k«4t"ü[tˆkÝîyŒ‡h@ÔâÙDváß ¹ÖCÝ+in€BY H(Åü-^í­yë”7¦V‰ÇKÅ÷¼7(�U³�ƒÝ™ûësˆ=kŸ»—1Y†TÛíVößcÌ-¬_åÔŒ�óÑé´¬y†s+Öá´xË帹â(�9õë-MÏ8¶¦—D:÷†5k!ç. ÐpÍèsvuÉ€÷•¿Ç“ËO1…¯¦"®ü6þR” P;õÏ»¯A>Ê~<›mkð >�[tùœ(ŽÙÚ;ô9Æ#¿€`‹‘—"ÞJå°ùíe ’ÿùOUë[Õ OŸ�úÁƒÙa‰ð’…k®  ¡^±ßÆ$eÃ"GU¥à4£ÝA5kµ|˜û!ˆ/ÇôõqpmÛ2¶»ÜÕ0f Û)¾�•Šç&º¤çÉ× ûšëgwº±jƒa .|U_›©Ï‹–& ŠŒ¤fm±ß-æ>u1›h~�r²,2�ºûµ…Sûx»s hÈûŽþœ5üüAÍ�U16¨2fw�Ç{âá�6<2ÙlD‹”ïsØ%I·ÁÉ�E`àïš„'÷VX}þPé}Ï:5ÂT@lÄ-ÅâL“sšïJ.’N�²j˜WÒI‘U7¢³óoX;â >½êš 3¨(f ;Dypyf ½J¹+.ƒçì#5ˆÅwÍI–H»ï ͧ¹¬t(cª¾¿>ûÀ3Ì0l}kòZ¹»�TôÕ�a½Î[ß&\°û}ñû¢.ÎSà,UË$|ìÔ);Ð'¾êò·œØ�o:íéÃí`/—VïP-Ÿ'6Ž#…âÂQÐaÈfЮs}®œ`Œõ,³‡Í»¿¶à¾)uo±7é–-Έu-“2;lÇ1gP�¹I,t8as,]©øAmPì6½‘¾¡¸yAÊ÷{Ø—›­öÒãÐ÷ÍÀçÊü!¡¨é…†Ôo¹§À‰Îü‡ç÷~š·Âœ ¶·œ—Çã-çîñ‹«G‡¯6$oG©¶šñÜÙrW k>²ï˜[�Óü‹ƒ˜ þ”ù¬É,ÿ™”.Œ ñÎÍà’»­˜"–11½áEU ¥o«á•Ðmží7JÀßRºÊå‹S¸nC"ÃÍWë»`|ؘžœx]FÞ·ï¸ùÓî2a—Õ¢e|3k6r þÎlª±µ½£¼ÊÚ;c�¨¬³W¬Üô¾°J73—zî=P4ä…úriôŸ ³±Ù‰Lí‚ßXhÛÊ…ˆg$k­˜6……a`Cƒaµ,ò€f îãõ;Ï»ªÀÌîta´Öp=Ñ=— l¨¡^h`ÚÐ*ä¼ kEÉ3p½H(5pNßl%ˆÐ¡ŸAÀ” ¼Ó¨[)Œ>]н§ØTXËÆÊ‡(gÑm=^[AŒ.€…ù× Xµõz¹ò¾;L^Hñ^΃æßª¬r„³ŒƒIÄðQ]§ –Û½ Á5™ôS½„oSùoñéäó3Îø%ZÎâ¨v_1z 0-Ú^Å%z�Åܯ‚f¸j)ÝcºäÔ¡&Ö¬#ºÂÔó“¬îà)A"­uÕ°—Ñ}ÀC zo«0k A>,DÒ8Õz®«»®ÓÂ÷/Lû:›¦õ!}(Û�Ö WÍw�ŨM™²® » Nl ròÝŽB…w_êÁ�4¹» ØŒ#)F`4¹*ÏílKsBö%_­ÍÓ‡>VÎI�^ ºoådf•‘‘%`¡Õ‰ nK�¦i$ ¹ ®@ÂÃo�Òb†Š\ü �ë¾êw¶ �$ŠOhGv¼€Û¥yçŽÆ£¯\ GA#km=ŽèÇeE„ô1G­4¥èˆx r œ¹¥köáiD¹¸Žïø÷Øãq‚‰í ê8‚–p¸!ð0f8�úAm!¥Ì—ú`)M‡OÞøú�‘óñJÞæee¬!JÁ ò}àÞ÷¿¹ú 2®J]~4È,“ز$€–Q¼¶pÑÜÀ"”‡ )Cù^8Ø+ݵ®7<ÖÐê’8 ñgY6¸Úfˆ Éx¼ÊX$èØY*o}¦ô¨Ô] d»­aÞáM®…¨)J P~ìß8¶“2]Û|÷J¶èú­Û‰ªKI™Xz’ZPàÆ¢ïÛAaÙ,üó§gÖ먬Û÷ÚaÏsúgè[8ê=õZŸD`©V{ߤ”¦¸Ú{%¨]�»…(Ë(§ amgó¤ÞkÜÈjR™õŸ gb× ƒãÆí8»z¼sÓ£ÑM�µ½cÓ¬»z#˜¯]Vè´AŽïAóH[‡½�ó{‰èIâ(œµc¼Ç×âg¢¼LË W~}n4^g¶ñUN¨ŒŒ�ØåôŸAen'Wm/¦�äKOe¾*aÙ�ëêó{ˆ,b½³lÈ\Ê›Qu!¤Üo�oá¹ÙâxÃ: ™‚NŒÈÑQøÞ ï©Û�¸z^ç¾MÊ®}|ø‹­\ü‹jd²ÀÅ&[„á©´o¯knþ†­øÆ§2E‘B_‰µo�Âó×.¥›ÆæVFí̼iOw…ƒ†ôPíF\Ú÷y¬ªHÁž"¡dî=e�ÀúÁùgtüþ”ÄàÃx˜£d ‡B¸ * ô¬PµvÒZ"Å“wô&žœÄ6 .§„ º8[ã wÚn@kÏCо¹RŽ4’;ÜVZK€kVöçœ(r €}a^œú›»ŒïI­…O:§¬y¸=݉±bü||ÌïøDÎS/“.Î/�É ÷;Æ.W¡ 9•°#9¨®N±šÕÊDì0ïvÀ -„â×e¼QD³kDYTLÞ¯IhY 5£ç´FS+‡Oz-*ì~Qïxº—azÝ7§Þ�Oõrh¤„„z$Õ¢”ÖD~\_+é^uոēB¶‡00,݉[å˜\Í+GŒJ”ÊîþI*ñ‡\" J? ÈÍc;Š&Þñi( Ð:¦á§ÄF÷„Ьжv­Ð;í ‚å*¡1u0 �!ÎvÕÅ4V ŒÜñ.ÔÚ­üw7-Prpø»s"8»v‘ÞìN"!'¬t±tHÊu³»Sü��h¬ôˆˆuÝÍ9¯ÝÞúø£ºî�[‘áý°Ð–"öA%~ ?D† ì¦5ίêOyÆo–`Åú&4½&xöOÂ!Ȼ´nÕ±”@,,ØÏìÔ,Ï/)Ý ³Ìùº¨ÕÌËwt4 F<¾ùõùŠEIh^Ù$ÀKè øf`l 636”¶??K·ÝÐ@àR¤ó¹mmô÷žO¾…Qö`nZ‹é is›ø¡‰œ“X¡¨wøœ§²ž[.]ŸÂŠß�®#Íç¶µZÌ~¼¸Tacw9ÈXw�g×6Ÿ�æ¼�Šon_Ï)¾Zn$ ¿“�ž½#Vu^¿ìiŒ€°|¤)ï[7ÐÆ.ˆÊ‚<(„C#·_ž<>0¡ÁÞU°\íÉ‚…³‘/·§ê–£F­²»[Û‡ž¾˜mt�{gyá]©ùÒÌ=Õ0jˆ�†ÇH»XA˜ðƒÌB½`Îb$æ§ãµ�œ¿Ûm_úE 7®Â{‰™äEÌ”�`müxÚ˜4xš¶Õ—˽¢s,¯4'ˆ]ÁLOåfÀ¡|Wje=ŒàU²™ó�’/êôô~ ·Üø~àô‹“‹TýŸ1±C*¶|ïƒI“¹Ö9ï²›¡ˆÉYoˆƒà2·72dŽº7Ž„=‚‡PZІ™÷‚µ©Ç FX¨vn×+Ó(Ñ_™Ü¤=ï¦Ãã¶âŒ­˜Ø¼šPy#ºT»·*£»-ìy@›ž©alöðáh¹X¡ó–ÈÊmN…âo`»›žÁi”$Ïà¾2ϳ­.(+ɼR& ópo°îúØn¢á÷p Rïð£á^çåíÃÂV„µ€ŒŽ_ëDtÙ¨rß~TîÓ3v�Í®MÀ‰a¿„‘ZpÂõëԉ ¸‚¼%„,2¢ø#_p!mÔ;îeû×LÀ@ØsÖaÓEÖÔñ#N0¾.Y^gO`6Y¿9}S×`öJز£é�.ti¦­L5‰E-ëµZË>³ ”Eþ\( ð’^'Û._Y•�#�øyí¿�ˆøÊë5ϳx� wçE‰?Æ!„Uü^óÝkÎéÏ¢Æb@9܆v£Ü�fžr7p\i™w›½1ñ³t� J(ƒ+‘¶¯‹�„¯'š‚³AØÂÂþMá�Öv�½_˜XÞíÃýí¸÷½yšä46ûaAÊ @»†›*K0>Œ7Æ ó·8 …Û²wf [££Í©oZ°yfc‰n#Ì�†€n`Ç7�R¾s›.—6¬URTÎa ªÒ6l J“IS¼)ðÁ®”:F§Ë˜<-ç"-QrZY%fòìó€$<†GM§»Lé“�pÝò�8ˆ› c%h²äÙ^ok¯ÈF´Ô¿ÕÞÄ“ó¶n‹µˆ,5Z6­Í-Z&¹–íKt›Ai¬ÂÖØy…Á7qž/(h¶œm¶mÖ傪Ñmº®‚ì1ÕŒ[ò-LÌ .ÍO Ñm¶¸Î¢‡Ö�éóŽPY˜µ¾Nöà«!…ÁµÚ„É`Ø1‘ :Do^k¸f¹/¿Ó\p‘hY-ä<Ã]Û–µÃ—iŒ7®’:¥—¸9 冀Üyâÿ}¿NÝ)ocÒœzhRƒâìÎð�`Vð—üZPâCV±Rê> )¯.¯jÿgØHß+Cø€¶„ò¶*C¶ðÍÈ"d # >E Ø®ËÛ×^wv-jfõ<¯Ï›DëíÉ3ª¥›­‡Ôá9s»‚×åö™Îî„Æ�ÓŽmŸÑ�ƒ�:O ð¸Ù°TÆ®ñ½eâ¶ASvk=yXkÇÕš ò/´÷‘�k"ôØ�‹lZ0üÖØîÍd[q…1a–O-¬·¾´€�S“±z¿„³ø›©ƒQ‘Õã›.õ¬ËbÛØîÕ&´]UÎÃÁ)‚‹@†ÂSW»à©;¹\èâÞlë®ê§rëï%dÕ)¯§vMÒà;: b’øÁôÍäí©´\B§e#( p0ž\5‹é(n½ —/(;µØ±¶Ã*9ä˜ö¤¨¨i‹ôK^…©À¾‚-¤_Õ“‰LZ.ýÄíoßy–÷®õ}£6}¯3kæÓ4åê»wc÷±彉ÛÝ–ù#¸Êg‘ðB5G:6MÐiÃ|ݱÐb© ÞÚeàÀ¢ÜØÝ’’Ù "³é«b�-EÙ!5 yÞ5 -Ga¹ Üíâ7‹:ªán¾دW-§Á|[óhbãð3šÊ+¸Ú´M€¡¹Ö�4¨q™Ñ”ñ_Gn¾Õƒ —lØãµ$ýo´ç°`�¾P#@f˜P2ïÝ(Ç®_­r!ô¿2Ï¢÷ɢʽ_¿awµé]vt $YToèAÝ ƒD¶Áö…ó{ß´ë>�v=³†YâÚ!îËãæç¥ÅAPFJ{\‡uÚF߻ʧ/k4ÓŽuàè»1�[±ƒœ“܃Y½&kÓ(ésýëGˆ¹$a¦ÄXa ‚4öÞP%k %^XãÖs"=óRí“ åYQi¥¯‹ŸåÆ�‘¨”ptÖÞÇktK»Ð„eÐ+£9ÕM�φ‹h� “IAV�>Žó¥HeÉu©Ò ¸Fy_®++T»‚^"þ¶¶?5ë0–,¸¡*؆•À¡” öí.RÞ¢ÏziWØzÖ ÔT€¢=—�À{¥Äð>käSV¡Ò\ÌT"€JI0½¬ ^®�/1)¹vŠ>mZŸRÃLYÕÈ)5öH<•÷ÞíbF?©6ÿ¾(?°¡kP"kx²u šBBˆÇ­a�V².V@Ð�kºÕ2äƒÒgS—A£dÄJÞ©$«úÆ¢o|à šdD”’€òŽÖ`Ò†’aT(PV{y#ÖO'ÞðÃBA—cÎTC1»•—7 šwÖñ}Åã Ñ–-+èsê%¬`!­bë:´~\#œC'�•Þ“ kã{•¤ÂÄ( eÁ¬ xÅÌu@'¦¶†ÎFŶj8ÀPX Š¡¢Ä©]¦qx3ÖÎpDùF+<ŽsI¹²Å€·ýÇ #EVÀÙáÏïH3Ô®þ ù2£‰‘ .F˜m— 9]Æ7¦ ¡˜6>Î¥ù­íƒ+Õž5þÓPÄTaKÅ™´šhÞEj·m›J)æ6-·��mp>»ç?ÜÕQ*ùÏÇËÜ _Ò–Þ@ôÚÚší!‡¸ø}l[d–úÓS×@å¯fwõî{ TDSVŽÈËÍÅzf#þ®TÅÀlÕª_=(çsuúàÞÌ}2ŸâѶãëë/X\â?Œ[‹ “úF)õ®ÀüY+;½'Ú—ÆÎ�á�Nˆ¸.ù«žâ¼@)M’ùæâ4âXS+Lô�I²‚·¸³Ïˆlþ 6o^Ôù-ed�wŸ¾ù™sÑøª+ Z9Íþ#߱𣺉%Ž fgk{}VQeø ì:ŒXD"›•>Ðs’aÝ‚ú Ax2ák1`�u$O>+¨´ è³¶›a|sšÞHi:›ÎÃßµ‰ï'`Às»%rinô=^Žñ+ì­¬|IgtxÐJƒŒlí.Ùï¢z=`Õ`vß ±¯If¼é|»±¬¨ƒrÑ U{½�ë–·.1»Ã‹Ññ,À¢D˜S–‚„ÞlX ¯$GÇ¡�ÕA÷&›šHµ¨žòºÒ©úû{ =ð_�°&d×|àËÁAäØý ø�á>˨&/‰BòŽ5Ð c�Ë}Œƒø�†0•Ã8ž[A°Y€±é0Íoš 3ሪl¶/dÓUÓOÅ>§ê»$lnÒâp´,¶`·²÷"ا6—3óµ|«òþÙõ&>kü^½´!8³Õï|²¨À£†×“Å� $ÐuÓ¾#Yž´b8²sÁ©ì ãA–áPãñŒˆgE³i°[£sú¨8g«¦åm„>(káXG|ïÖêÐn+<‹ÞJæO›-ïÇs˜îC]GÖÕ=+}>¯S¸;,g{‡hE õŽªLNje€ìdÒƒž Øž�UÄT"IyAÃÎ*ë?¸¾'0" ;8óˆ8ópE�­ñ7éø ÜÂþ¾ : ùJÄsŽ6ñ#ÏŠÝëë µâ@rr¹!*1#À\†‚lÁ/ËQú6ö4 ÎI¬/°jè[cqo["(k2!²Ö°$ ?u@k€RÍÛ‰Åèá ½0k3=à� Ul;èXtG�ø ›ä5¦eëZ¿kyˆÉùn98®Þ»–ÒØ�y®1%šw–Q ö$˜eã�Ï9ÐçM»Cý‰È =žg›1’+ÃØMé¬eoÆÆ–ß0��KmrôÚ­Z 1€ÕáÄ s�Ýð'¢EcææÐn3üotî4 ÓrreNœ]fýú±û»¡ËxI;Ž•&L�¼Ç(ò4‹ð�Y⋵Œ—·G’`G ',Írn†²ÁóÚàÙìM˜b6C V0¥±Nâ„2™b mÞ¨w­Ës%J–¸.•ù+‘ÀÅòïWEÛwåÞçÁ|†ä„£)±¤&¶�õû.¹ÌÅp#OÇ¿NW Æí²Z[´°ÜC‰RÉ\ô¶|¦ÛÐÍz‘-oõµÔtâý©»³OˆYÛ-¹`#““É®6’)JêAöÃì+63A*ü+Œêè:#à”¨û³¢å ÒcA5Ëæâ{Ú7WM•ƒÔ]UèoŒ“†FÄQ#׿Gn·l8®/' í:5>29øK2.íbHÇ@75Éš1f¯�XÂi©ß–›ðž`oÝœgaD(‰’=’�åsmÏ‚úÅuè�äÞRþ=tí8ukåšnM«¢ Y®|bZ·^_Á½±2ƒuOfE6À{»îC+øPJðä1�ÝY  �?F¬„ÕOˆQ¡{A2ƒ=_%¾'tðì/¢�8êùÐ'|ë8÷âÒõ‚bB-QZ‘°Ü[½QWÃK|ññæ÷26´ÛCZ·OR—9QbÔù`â—ÖÄ.®«J&öw ¦BRñqê•ö¾²…”°›qÝðÍa½§‚¾w•}žsÄãàKN‘³W|àô–€(f»ã(~À(X<+¾ñ¨O»W/o%'ŽO]Xn®c#Ñ`©óbjw2ÍPVüóSÜ𸸕·H›Ç2Zã 7”Y –�bs)µ÷õ>Û Û’ˆëò0Ã�î] ÊUoªñz¾W$AÒ‡¶9Ê 3QØpØ{PzR%‹uÐ˜Õ£Ú ¥‹}]f÷ Q À†Î0V2È4wIK\€°SVãúß­z¼$õóD2^®]: S„„Ê’µŸ ´³#b–ŒÀ¬�N˜ð ;ƒTl�GA†\ <Å­š‘|#QZýº å�ÚQn2“m®4@yË1ض{èŸkŒ¬:ÚÞ·^é„ëÛm -Í[8lDµCY¹�ÝfÕ ú=¿' v¢'¢öºpS[³Î‚;|máÔH˜Ù/ ªÒq¬¿ æÆ°šÉàYwwÃ;ͪœÍßnWòÜ‹{îï}«–ú¼AÂi�9,ÎåÏz¨U [&Õå6̹9о’¼�È›có©¬c Ø–.¦$�È�÷¸¸Î¦Õ»¤Z nýKl¢ØqªÂÜŸ!tž)NØÇ'µ`UMzÔ0­g»2&7Õ��K÷(äµnÚØƒ H�øåƒÆÏ�H¶Î(„H&,Ã4ŒGÐ+²ÇJêÆ¯‡ ôoS¦Møã‰kÍv¸ <�V‘ÚÖÿ*Ö«�yQˆ]æ6iù›E¿¾ÚÁàc c¼W5&µ‹Ðl�ï„‹,3ìÍ�@±‰j39Ô÷„Û“ÃR”m©ôqÂÆÔÝç(ª¡>n�X¶e²Å[yž†@©ÛPîäDz¶Ü3r•­\D °RSŠ›ò˜ª±ŠÆÿZCŠgršÌeÜ!/ ÊÐd Ô‡C„�äp58a;ДBUÙÃUúˆÈ¨ìÈ™»­¦ä!`’s á_h…S«Úœ›VEaÅœ’3ž�åuS 8é¹�¸�RkˆêÊîÍg&`¶iµ2ek-3HäûÁ¥Û‚fºõ�;ÐØQ—|Ë5‘4ƒKi§Ýn ´#»¥X£?«—w=Öô*¨dåOv'æÿíeæÄJ9Ù•ó" —à(@ 5÷t|º¦°à@Y‡—¦øàÇfXgø>ûœ�d�çÜli^EBúnfÚ½X/qÉIùâo׬Dd²/FÌw—Úõ•íãj°H>û›~ä"ì½å‡Žj˜`\»Ýæo‘�X†rY7t]. "ñÈMQr·»c™€�6‘ïÌ×ÂÝ]¸³ Á(Øl`L±bض\c#DuS0ÍúÛ ’:!T_[ËûX*¼lÄa¥�vfÉZ0•z@Ç­aE  έgk›k e“ÂzgÉwU±«Šå§¹)ÚZ'P™¨Iñ­¯m «ÊCm+Y‰4Ëœ¾¤øÑ½e§8ÏŸ¦Þ¯×ï6“|£ °ß‘­8,Ñg¨ˆR’þØ+ÈÛUÆóa3wí+’³Ms7 ò¥íŠ#ÕHAB58F[Ä}{òél»Ù®n:�¢L¦½ HΗdð«Êó`aî©^x{@b7£ÅõŽðxÕ&÷Ñ`kƒÄÌ [rsÜz›dòÓ¦Œ¢0 – u�ãåýŽó_M‰Ðahµ:Qç³Ø}Ei·™ìpx1jMƒKKpw (o"IwtP5³Þ”òÐjÿfÍ�‡8œ‹òÖœk†ª‚Jbû‹LFwhv%±é/�XJ°jMÁQŸmß3£‘A¦f_Zª!ó™œoÈ ¹Ý-gE·H¼  5À2¹Œau‚8/)tfV³‚¹q±xa-j í“«bzKN i¦ ä…µgѸÝ0"Î-•Ø h�5j¿¤ê 7‹˜q„YÁq¸´¦%È‚ñ�~•äm¬Ÿ-f]+Ôto‚–gtyuñ½úc$oïLëoK›à•Z7ØW„/;¤ðß· °è{G¬5¯·…ŵªfœ[3´„HÀ…ÞáT¢,ꀷŽ6Ž ŠÀÏ’�ºbWR�y�Û/\mйÔÓ‚£ â¤AáR㸨­Hº® 7ÈŽÊmatô�‡9ÀÑC¢Ì³£ž€ô�k3!4¤FR­G–Ñ£‹Å-…žórò= Ü ¯Ìvä Iİ€zx.g'R�ðQzÇ5Ru”@aö3¨ŸDíÀzaÄv¾˜Ò`% X9[�bm¹|…³˜YóB°¼Ö™³àÀêµäŠR”SÚA@@¥6()@û²­| Y'Xé™Ùyä·\=ÍZw|z[Ž78Ö|6ÁíÞ‚ ¨æFº<¾0”k:'7ÎÌ–j1™TF”Tr0%Ïo®K‹aß&¹  PAŸ}Jï¯T†ùéÝ*¶ô¢ tÐ×âmuëæÄ2¨ì寚YNeö€Ÿžï‹=;@P|§í8a#!ø²bYô¢w½]NaÄÎ÷à{CSéŒ�Õ=0Z¶o~ȪžnÓN¡ŽÓ-Ìlž`½áÛœã-ºoV.lrÛGÈ:ùLs$¬|ËŽª�é+³» m¬è_*À,cÏ!î ž¯ƒãú›)(æcü†2æcŲúÙ�˜Ð´ÕƒC~ãZx¹KX,œ#±GéVÊÝð8À 4q¡×¸Å ¹+m±h½–R¦/ N± v» tÓJ$¤âtÀÌŠ´nI¤dʹê«g6]}8^vÏ!Ìì ¾“ò�H||LÔ}öÐ}$î€âbh�AC†a 7 8¾ÈµÜ¿š5p³rĪl¸…Ê‚wÙ]dTqÍ7›Ò%Û:ìDÜoðÞóõ—“[p‹(¸�ET1œVt;—Í\Î3Ö‚FGÃ@ã‰øº!»,é­ë°_+Ù›‡¾uç°ko¥v–te‚œM‚›¦}'¦èÞØÂ&�²™á4¤ß•l–..Öæ�7dÀÝ,Ñööõ\ �ˆ,L$4‰i&߇‘@T¡±CœwW`äÓÚÂgZ,.R«åÎCÙCìõ»çÊ¥éwj«àé¶"�MÕEX»¥ÜîVWëZ^6öÌAÁo´`•À½¬Éïoêij#YpYIÔ[è§L†JüLé.À¯[ðN9¥ÚŠ%ù9bgÃŽQŸ<¶µ î3Vä%ÄКKà7>Õ`�Л¥è@Ü‹õë„ï½óp† Ù¹c!©ç,¸©=Ž‚[ÁQ@ëš09ayÁ³ùŽ=qpKÔƒÊúÀU0|H“C¶ëª›Ä_�òˆªû+óG£�É÷:® ˜ÊNoËâ�݈=†XM¾»ikC[•oÈ&Wí�.^P ø;·ñú;Ç‚Œdæ5óiï¦â²Æ‚£•Q·\gÛÇøý"¸DM¥ŽüèìŸJÒ‰2_­ ŠGW z_·»duµÓꡯ–í¶„�èʦò—œG«‹¢EV0Ç'è}]I;¿}!ã}ƒõbS'p°�½ÜßOL ò¥‚ë"P~?±N«uÉü@„¸(ÚcNUÇùyŒÅQÇ3|&°§ÉËNT*á1®ÚìÝt+�’[kmïxõʇ¸³1p8U µ è#[CÕJÆl#37»´T½î43†Ôã:<ˆ¹`¬ú±â!%3‡j;fãTPTZÛ±aªõ íí�шp�‚Ð-7C€ÿ`rzò§mέ•¼+`"˜8Gá)ðJß69 ß5 e.2X OÃi q¼®4î7ée—<\�íÔZå�£2Ç) ŒÌeP*gÞ÷Ìå£dëÜ(5ßÝp›È9þ´þŠzÑ”P�¨ ð¿Å[†‚Ö§ ~\8PQ¦R¡ÇíVãMx ^μÕÛœ¿8!îàÿ5èö’y˜¶‹˜b܇Óã‘ôÂ(}¶Þ5œdåëáu_`‡òB�-½z" ¿%¨�—dÞ—t®Ô·g÷­ç(†ëðȺæÞeQž}}eËš� '¹ÍMˆJE“õ˜è¯«µòuùËx,Œ)ÖéC¡à_§Ò·}®\»Ã © ¥;»¹ P2Ç¥«�p›N$„6m�ë•G{Úmùm¼Ã†%SDgõ]�Ùèßäî9ÈÑ© F �9è¥}�ööÒ·àRh(y9ĵÍÌzØ2ÚG�‡­«·B·5]ZñËÄܰ¼á9�¼ PòBÕ¸]¶J|» Wn¯Š0â�®ˆV5(P‹˜ ŽÂ½¥g‹¤·Iá·¥æñ>±¶­u¨ºPŒ¬X„îìY íœA:˜ºõ� –º=ŽÖÛ+íHñUôÀ>f/|êOŸ#Ñ”ë ZÏ8ºIÉl\#8à¼á06³œ�³£BˆµÆA;‹~©û;Åv¬a‘:8Õ`Ò�8O^f­˜ºŒtzQ™¹ÏØšf !ï·é^ÊQÜñ’¨‰ÉRîUWíp*zº±çG›tÜgÝõgís�j3òöÞ°«m1ó`&†žBVö�-cÎÎ3Ð-<%ê% p)Ò™ÕöZ– MY™gä�E£G)¬su÷sn³ô5Ûæßå( 6a�.�Ÿâè­™ƒe<þš½X �@U‹#GÚ¬~þwðÚÍ.x_Ë=ñ0 ÛŸLà�b%+ù-­™þg7 /ÛÖLÈNÌSÿr&b s�Æ=`÷ñ£©c@Kïu±y1¡J nŠ’µ¢!ƒP@ºô“DàI‰:{à@‚ÙàÓãá6mV„X1°xœe²0@ã<6|jÁ+àõ#ðÌ\èõÀ²2q¿nÞ¿^tí4Zûß>r'�5$„\yÔX@Hrlas.3Þ&ï:ÁÖ‹� ¿].çæ@¦ÁˆPlhd yv/𸯧|šzõ�r´ê:EíÚ‹kfYÖmðpü ?¤²ø`~y‡ÄÇ1-„,­ ®à%í‚mF™ ¢•µ‚�œªnÏ–†0™ôÒÃwçrH6®²ñö¢§m�gUÀ€a<ŒäjÀ�Î&³½›¸ Á†¦sq³¡Mæà›]×&´‘–¢)s«ÊÆ]d^ç’Ñ*jp9neë g½Öòz²eÖÕ´i‚ÊÅ£˜³R-âi“0‚)$@Ìà²Å\Î…7‹P!£Fë,â¬vßB¡×®$.îYékJP6¦åÂ8¶Â¯›¢æÔ1yåœÂv  ©4.ôäŸ}Ö°C…O‡ÚºÃ×zõzᦱÕn\Ô ¥` psטƒÇ{ÖâÓ¸^̺ô„%})©‹îã¹>œ·ÃdÐ_@ žÔ]ýp¶“pE�ÁÑÒ?7Û¯´Ór‹\«íß[‰sæËkË9á¢�ÎëÚÄ_Ï�™è…ùA�%Â&ÔùI»dÃé Õ¤~9ùµ�;Ñ¡š>6ãgË0@†G™#(:>�?sîã�ŒÚnN{zÞAL�®6˜ÊAˆq*òI¦ 1=•-ÅŽ2#Ô ŸfþÌ`L¯v,Íé…�ÅaÌóÁW ÚPYµõÒË;·8Þ¹­ ¢Ý�xÙÖÂ_k}Åk’¶¶ÕsÖ:Û¯Àvw”®•ÊäÄ~ Œ�Â:ù å¿;àƒ°9ãv¡4=FnÒÖ‡)z+푈�x›…³i»€ë@Á2Ü]>rÚcm±#ç ´1) è03jû¡€¥»÷»‚ò¾íâ ?/˜Y™6„yŽ _�29¿L¢d€×†Ô~!ŸµäÑÞ,•5½…âß(óv ÆЉfà ¢7x•|•y¶°,¶w¬Aú5½�QCŸ×‡e�êØä·ì®c Ä^ë˜ÙG.u“¥Éð£[«Åò{na” #“t÷v=ZòÛ?#òâ�=þÝÅ�´Yåš(¢Ë"C+JÝ3FÙp÷\�š®Ÿ¡ÂþûŠ�)Ofáò®È !�Å"X»%ÉÕ€�)oœb-êÍ …°Òú4³žI¾íué›t¥G¬„ƒç8Æ™È6gj;“ÍÁ¤Aù·�–oKSÙžDÎÁðù”±ˆ0Ó7J/T{¿8T+sàïƒi¬ª\«‹&Í:Õd[9z©gòÓ1vÑEÓGŸøÆŽ É—v¹S=ƒ¤Ð7âÉ6ÃõSÃ@.ËNû˜Ô¡¨ñ ÒƦ˜ #& 2#ÖÚ¬ôûz~#D,Œêb:�ëö‰Ý¢íH«,ç[x¶ zv•û+!R]÷ ¸A63Å»gîÞ¥uã �­3PR\e—Š»µ{€›}…ÑÇŒÍ)í¿CëÒbû 5Kƒ¼Ö ½�ÔY¶Ø³ÚÛ·6,�†¥¹FY‚�™y¢§k‚Ÿh¾Ìá+zKr~.Çoß—=©O'‡†ï `”+ÔcëwU”îx÷ØèÙ¹ÁÉ&Êà¢Û®Ž¨„à.•¬�ëêÈBÖ®Ux á$Œ¦­«išôaA,™’!Éé)Š¥—xk�è$ݘ ]H÷xB¹Ñ° ³ ö_òÖ­¡ÇP²kjºÁÐgJ�Û�ï¼oºÀüsŸ~üª´òò`s²ãÀZϕ󟂂`[Еƒ[5ÈôîùªÇ±›†óÈ\Z¦'mû€ Zky�Ïó2"[·H�øó â¢[œcþo>tï`ˆLñ5z£ÃÿNƒõt3ha…¶L.à…@T{3ËÞ“-7×C�8õTØ·¬×ò?1Èj†mwOKPédº¬@*Óàõ)rPkd­¤ÞOT‰Zå“ô…J@w–G®ƒ;&�´�£@¬µ|0•3£uïXî5[K¬øc$ËÕ\÷´} u�Ò˜N³€¶é4úPÒ|çŸÍ7×[»krr뿜Œ1ïvQSŸfc±ŠÜåÕ¬XœÏ%•q. ð6yO(õ1–f‘‰ßØŠkÎLÔ9v\ >A®!q¥Û£•WØqŠrïðqgdÛ¸wJ~³ø,ã’’PEç§�×lÔÏRiAwüw�ÍîS8Èka!YKï|ÌO–M "êNʘÎÁq°‚Œ=ü ]­UÔ/«�qzñ'¼Á�Xbæß¹Z8Ãb"£Ú žÛ�o½A8Ô¹?ý»-R.�SÌé¬�R†<-?3’÷G�lȾBåMŸ|áhU^ Ý»2ýn Öu^ÁSó{1Ýè¼c�bÞ�?Ýòܶ‹zÖú–´ªÁ8Gh Æk‘\Õ6`÷G8CÓIV'5ó;×�í5[›†7®Uˆ!Û†SØjÂNœò\é6 ví–‘å7<Èéq"´²’„m¼_וUfŒ[*’Ô8lÛ},ÂëGµìð%qÌè+H73×,ÐEàF‘ªîF™…»‚gó4½Wvz�ã5­©aÇ›¬uA·¡g�ÅxyBüÓ��&o¦o½¢® j ¹ý ïŒ>ákL_/îÙüMßêÙåê�¸ºÑBbÝ�'Bº3ÅÊì¤ÍZ^äi[û�£'¾±Ëï·\ŸrðS#z' Õ;¶îX� ã/Ù0^­%ùD–ÍË2ÿÔõs�Ÿ9DŽZ¦C®¹?â­ ü¼Ãâû0³û'ÉB‰“)²îøð^¦ñãÌ¿’ �XÑ MEÅ¢Q•Peò—g!ÈÏ/½äBG �@ËÑ×ÿVòºvž1éQÎðw¨ï2*eYéK„ö·-{ðQX$ÍÖ}$Y~äÂú>ŒÍâž åÛ„ú��Æ0"ñ„›P_„ÁlÄffÕ5Œ>ô%zÞô×}Àí¯,ޏ{ê'}ÂZì¥R”4‡ùÕÕ®T›´tk#�0°%ƒŽÄèk„vB‘†rY,‰-(÷Œd­z¯6ì†ψؗß@ÍqÖæ¬jo*4Ü1±Ößb¾v:õû'Õ¶ #¿yªåvöyy+xmŠ‘púÇöNtRÓ³µ.m`ˆ­!ZFKm]fp'ø§;Uú α'rûP/Œ­êò[Ï ž²!wÐÚ Pæ£NOŽ”KÄÆ¥9Ê4z ™{7žo‰ªÀ¿y.Áù,*ðÈú9۽݈$&úÃ{%Ú hDȵóÚ@l~·•ú {¦ìDëvîñf ½c¿!d'©SË�0o6Iyújì˜ÚòùîuU祯Þ(l—©xýÛÏ)®÷L7ÑÍf¯C¡ïQ˜*ql @…—ÉaÁbc¡æc©k]Òj4ÔÇT�¶ø$ÕAñ õ«=ÊÍÊ'jC«‰\Hõë7è+\|OÎòé�g0ŒúîË¿žg›°D×`_uƒà‰lÖ’ºÆ’öÙÕvÝŒõ *ùÁiïS€tÜ�ú,ÖÂÜ99 ø͈–‘QnksŠ&Ðí°€¸æç8¬ÙlÌ<¾…îxÅFA›€xL+�N5-—Öd-î&³Àkï$©™3tîù½æ_@î7û|ÃÆv‰º[®‘•­Z°§µ½65èn½Ï°"24± I~Í‹âá¶yA� 1�J—uI3™×X4õÒF…½°àqÒ_(©éËw{»¨…tm:ûi†ÅZ,š»«Âå¿9òÔš•È8•¶Q^í·À\ã–[Q7ñ©K$TüøwQpµã ´CØž»„?D§&.NÚBt¿æŒ—`Aª–úÇ£Ç7_R7Ч¬ðºv1Ÿ6ò+Û9›“¬ú¬¥$%=‹;wp¸öß#e¸öñ°X ~­˜]ÒA)/¡=q“?FC£ú¹Ÿ([n†ö¿Q …·iß‹ªf¹Bßu Ù3öú�Ƽ§¼ri?¬À�>ã…¬’žlY«ÞÍ–o· vÄ”]£¬€Âä¡ï0!B¬AËÅ$R§¬£>Ëç©¿P®Ý`í"ã£�Ç^é£ÌeŽûx÷êS)ûä/Öìâ2¥"Ã$Ø®¸f÷ ~+h4Ý“�ùø›èãøs=߯AX÷'aá‹LI „w?7-üî5\ßS–JÅ�§dKÜáŽhÆNœ¦b{‹5� ÇHÀÚõL½–U¹ˆx88ê�_oÉ””½êf¶Ç-–Ô9Õe ›_IæQs&•Rb £‰Ù(VsŠrøpúŠÈé-Sl¿„ì7£2ïW{Eª_É ÉÝíÕzŸ» ˆ4æx¦©[!Õ´�ÍŰ òaè5™å�ƒ?[f~*KNÝíñTG2>öƒ›“ýüÒÝs¤n5Þ‚Üt­{ÚãurÄÚ.â3hÞžDx©8Lqgdñi­çG\È�ÿ¤ ŸŠLú j3£°µÖ͹ã�Áupد˜íÈ“”m>ÀëÉcªª†R´(Ÿo…Öü`2Õh˜W‚�Ð)øM³©öÒÚÎ(Ó†]SÛ€’á°‹bhì‡7@³ �Áþ­?÷%CARXé°|ØÎÝ—d_fNdò<üV¶õG%²{Ç¡± ½®ý$¨¨‹ë„p- A?wã¤Ç»¬,‡I$…¬Àý*t0Go5ôm*ÉpV ?ˆ/Äu1l“�ߺWÕ9ã8ââ<ÏÑFóvä:í•«Ì:€tžˆ}ú…ÌITzµÝ‘4i�¥¡rú±0%ýfBËTwѯ·¶}±üi… óB\K[Å”Œü´Ô¨.Ë6|lº s¸£$­~KÂ[ºgPŠÁ«E¥i_ÛÉø1©ó°Ì®û»‘Þ•mª¾3R¼¾}ºWGÁ­VšÛY=nà,Dky�«¥ßNÅmÈbÕi =òäËÂ~ôšµ™3Oéà>°¯éNX…õjçrÈ#]žW2o‹E蘬D –viÀÙõœ?÷?Ö)½„&‹Ë{ZJŸ£‘®)ºãvëdã!""‡Q¼ˆ7Œ¥Nøþù…EEƒ…wk‰cFƧoÝÝfÀ9vehçï1n¡m[ŒÁ•j¦WTõ³‰¦mÁ»À.5&œ Ž-s™qýE¨´Ýu±YÅ•ÆÖ;q·k])*àÑ9OprÕb •\AàšÅ–Û‚Þ¤ç˜yÉé\�—™ 7΄N-£Ï 7m=t¾¶�Æå$Ç£'ºIv‹A®iX¶÷7›#ŽW`¶ül ýõNuPtužzÊœ€Nüs#×10×Ow�T7 Z’žñäI>yîÒ2\Ò…Ä£–’V®Õ€¾lgú�`É´\Ýq7-Øt ’-µ‡Ù–dC8IÑG¯iºÝì_ÃÃý‘wB"£×ņCø^+6ºÞ\6’vó�áÜ-¶É^ö\¬«éîØ™«âùÅA»”ŒÝµæ­oá»V2ÿNÚp’?Rk>ŸY{ÜñÌ®é,!ï"¢.((u„äØ( W•¬>óXk,ž¾´÷{í—ý3ÔrØLGnq¸Mt6âP˘9Ø@•Zf #MâjÆíl8aHÛ�âSuÝ×Lí¶×ROyOecÁ|{U™ †ïX$œãC‡çПÇz ÿZûÒý®ãª®f�v öÍÞ/V½j6Ø1Ûáqš¨°”ºà?+ĵP —�@GB~äXuœMË­ìx[îé¬ow¿_KÒK‘—nA^^4Œy�ö,½Ð�ac2\ÓrÐ^GªmÌó»?g¡¡�×˼øigÁjèDç¼N¦D®r™/µÕÐ…œ**˜›‹iæD\Ë÷3P»Ã?É�YLm†jHŸºÖ¸W*ýܸ:áØH>zûPØõûìÎøëÙwnk*&6[�8-üéÇG—¶zx`ó¯}¢E ì •3žÅ(Ž#Å:'TIð«*ñ™�qX·V ³>¢²Í·Ø´Åí°\¯Ægu.ø¹Oã¿.bAà47¥ß„Ö›> PHnn’åóÝmµÑÒÇcÙxêôM0 z· $KIrÇÒ¶ÇO¦kpÈ$¹JÏÜ{­¾ÉweDÛ0@`úú@™�†Crß=‚ýŸLæ9ŠÏ�d·¡=unGºpE?±,tV ÒuF zn áC›ìEh€–ø‡ dìoak9_vBø<Àr”ò�¢å©Ù2isk˜õ|?w6¤�$s¢+&²X{R‹‡;ŠNà höàan'Vä)F ïÆŒ°˜Ã¦ÄÂûõãö‚ÔѶCTøQÞêÂÚdJ(‹IìaC=‹›Ü›"¡ØØ¹ ÍÈQoôü64EʺßàÞ†*ØÄ[—úùv'^v�`èoJt!ÑêÌ÷éÕ¬btÎOc³\5äÒᬠÑŸÇ ømÔS•͇d¨”5w+Õ:AtÊ•rdƒŽQïæ œ/í…tEèì!ô¿°9C$„¾Ì¬¿¼k î´Ë•’äÇáQ× )Œ›ÝJ¥»s+¤ÝðÞÎzL6»q¿?M”w^ fË}Î`¸®{á󑃰QEá쯼�;Iœ¼SÊ»ØÌ#O¿ Ï ÇFó’Mö@{�l@>|È\pèj—áƒÜö›Ê9 ¼…8žñ%}ñ·oß~�Ns¦Ä7R{�ËœàSO¤î˜-ùÆü°öÕË·_&Ë`0È&Í;6J¼òwÓûÚ¥ÓHärm›ýè ø* )ÞäF…´lZƒÊs?Sò2Û¹ ̖ݸU˜»´ZYHjÔ&§b±õ‚ãõ¸¹&ІwIô¦©Y÷dŠûª.äG„žÀŒÅ¨„xtábèô"Ù–ø Õšá©­nš-ÐÑ ,Cà»â³ß›TÅsr ’ö°œ€U¹µk4XÛªF@,=r!dßxÕ×›M+k'#MÍ_¦ñ™–sš+¥½–† ™3·)�µ˜äɈ¢l€«ÃérýÓÊð¸|?8Uª=�ÌZÄV:¯kÃ�Û�ô@‡)íò5Vûb:iw§ÏO�©C‹Ä~ X§Á4èÂR°GÕ»k^UEÁf:îïÏ­Ážv,‰¯«‹C|T·~IbjÚ‡T¡,"Ó³6¶El±…ëƒ 2&þq¿z÷Í@ãÚ¯9_;i¹éÞ2?[ZDX¸.þtœR,ª›ŠoÂVÉlmYNÜ)cç¶ö{`|‚d`üõåa>0ªˆr½­k1ÍGº9ЈfT˜Î̽kbÝîÒZUïvôÙo¶Â.‹º �Þ‰ƒ Z(â„h$Cà•\—Ô”9¨I¸-Ñ7«çO§Ü²©ô¹°â’"h ê-‡mä4&Æ«Í5U�¶K¬ U¬ä Ô�\ú~2]b´¬8£h�ãòËlß 8Mf ä�Æmæ%9;�õ½µÂqÒ�”¶…v渠]¬õ;$Ó} ú ×?iï,ûpÃöKà4µ öèouà'‡XkcVí\p¸ÔHK N`“;þÐ�Jk=~ÂcÍrmÝlfXÇ�”€ùg@%`r¿X�Zù3É™Ãt_ù·La7ÐüY VlO#a„G±ÆyLžÊ¸Cšðw©¸W”¸g¾ö™ÏAÏé{|Iv úÉŽN¯| 800صΧ�*\÷¼Y ꘖ-S`Ÿm¡£,æÐœÀF£@¼µIó€}Ա̉þÖìÒ_Í‘6m«š%÷[%jºò1-['áOCãaa0:¤yÀFidÔ˜Æ�”1ñ“Ù™\@Ø�Ø q‡zaÂ2 )q…>$!S3l$b¡)/öʤX°ƒ:L†ƽû¡hÇkŒœ “ßH´‚¨uÊ—¶Ÿ�¨Šî‡S`Õ\ú¯mÅ¿ ïtB{jÒ¯ãšx`ìÚ¹H-ÀÂ:ìÀ� ?¢Ý�Ïv£úp°@ÌVÖŠ¥ïi¶”€±€¬*ÛÀ�;ƒX+¥nrqæ½VÚC!{Ÿ×´ØkHÎÀìsd$£Ô8ŠÈÈpn,€%žeñ�Ìx6¡ˆ;°Gè\‹ãY"uà_÷Ç|r;×")Ú{ÃÌ.;Þ#±¶åðºÂì„A(Kû�m’äÌ}£ç BévV.wW† ÕLF÷± _T ýnØ�¿ß@a.lÊS‡®—’5‰~°™3[Ã3ì_Šð ^ÑON3«“Ûó¿¬j—çٳꋆJuj0R&þ�ÑÏœ¤ò¤£Òø­óù—[ê‘ÏĹ¾“ïrb1 ×&¯�~MOqõÊ㉫H„àÍL†÷æ3bD]«Ø”ŸîU±�S9Ù¾=ä¡Ý»ˆ@�Ÿí¸V­x¸´�P#qÌÊ•ì¶ Ô…æíœ¯,Mgv�¼`1¹B¾€ÔÀƒíOÀŒ:æ&ë…àÃ�¿Vþ«ç°î'•ˆ|^¹ò…Íö^í¦à¨WSÉ­÷ËjRôXÁº­¼'¬‡�qpuDÉ-ÂÀà`2“;�ÊÈé“[Væëvå¿BóB-:œ.AÆËH±¦QM�¯æ¸?û#Fß®ŹûlFÜ‘�Ñõg-_KƒÓ&DcœÿgÚ&‘AÞ½‚;ÔP‡µn�œ½1j•¨€Er«â鯢.@0[9€Vo',!]Ç­þ*ÏÓ�¥ÑÖ°÷Ru óX·¯—Š·EpE©u'‰'¡îòK]y؇OmF É#�”ÒHpùê?›Èñ Û~�Þ=Þ·Tu_�´‚ˆN.j܆]›g:ŸA¼­íM®ï»ÇbÅu¥€q¬�5]¼m†Ç—˜× � ]Teµ,¬Ö‰eÓ1í’É©³U{‹V¨„Î,MO›,Ü¿a&LÌ;rãŒÅy–eœ¸ �<^q½}#Œo© ]xpPJØaw<ƒ•>ÙÜ Oî8V¡¢ŠhÆ'!tóƒëŒˆMÛ*ÕÞŸ‚KIŠ>?xÉpUsöò¬äñÕö·®v׿ãê]äèx|Æ¢ þ“M– û}W8£{emðº|.·�ƒÓXiHH Ö‡*ãÇ1îžF9l¯¦šµ=wйÜ—‹Øƒ‰!FX!‚¼Œ»ÓóÑ‹+Öx‹}$Qý6E’›ŠÉîÅŽ¬rõ'Ü[²ÇˆB€ØMú·Ø £›8v�Á3d@¡…kq`ÀS­4ؾ!ˆëìÖ{áÉÏg7¶ëâç™öQŸ·ñ=#$Â#Éçµß°½å· /ñÀ�à/ýH%Z®Û×#”yKÚN­sK›úßf_êSäìá²Í‚`4Îäû~À-'Ä;›ñÙÅ£ìá=$ÝæÑy�óNö6uR 3dY>D±Kù[rÓêè™{cÔŸ;© @R B±½áùw> ‡[·å½úM°bðÚô¶ã#%ŒÔ†H #&{óŠÔX>|~Ø-Ëè€ÚJsÅ`‚I&.Ps¢`}Õæêï>Æ·/Ñ‚3ë;56yKù£D© ºA#/1ë>pxûÑ�4í˜âá#”"®Í,< 'ií‰7<¶ß>2·²øø�ÇX0S»ek,ë|½¯wS„OdâWë=?·«dC�`ØÑXgíä>koö&ëÍ´Ÿ¡P1�0Û—ú~g·€Ž'&"Òñcs ¨ôÈN‚ù—áôAn{¸:Å©ú²‰w5L•½–ëƒÍ'�êÑE:á%펿ohR_ÅÓ+Ž^§ÕšQ†‹Úç±Ù� ÙOi©¹¸höS/‘&aãp~æóƒ°._)#ÁÆèÚ¥B9‘ ĸa±‡ùå%‚îÆÃÑ!(8Ö^¦ËTRÉ4e[I€A³Ü'’w%žÒsk~t1%s¬šºÌÑó&ÿY2‚´3æž»‰À"•ø¤ro9|aÝ›Çe˜8Ž,'T½nj×Kß&ȨÐ|ˆÏn óîjÍ�¾ ăKÛãµiôd½rà6;|MÂ""à,âKFrÉsë& BÛ›µ w®7˜ ç‹Íã·Ñü‰Æ ï39…úYµ,»[®Ð…:Tʶã�~Žz³ „°@ ~ÖXN|+šòÒæ-¯tJï¦èá)T‡LA|} (™òð½å[î�²M|²×K�K˜?²B—pÈŽt:¨”p@ÇjF¶»@r«Ì* ÂÕ–ÓDZ|¨‡�ûŽßpc·oU.Öüê/T[B°L1gÞñã¢ZP¾u†4LgK¦�¹L·SSŒ÷Ï¿}-@«ÓåN»O¹†MJÿ-¸ žT$ŠÀ4ñ¬7,—¥ 2¤«�{X…ç×ëÔgꠠ͉ÇXèYHOÄRš€uLj nýƹÁ—ºÈØ, .às`°zÄÏ\¯�\Àâª3;ñÕfc\½Â2€Z+ÉÛ˘ÇÏH‡„ ÀëFñ–Ló‡T0õ.@¢‰a¥K(m¶-îrXP`FÔì‰Í²×4ñêm#/¨…lêù-³ql+òĨ1ÄlÚ:¼ h,å ‘‘l ìm-ćMÓÕ邎Y*eOj*Ùß/nk`æiµ¼²ËÎÆ’š‹·–¸¼‡“4¹Ø1µasYÌšž|Ö­/s’Ó»›þ{œ}ñ2ÉêÆe½Ã0êO {ÞðKX’jLçèõÖ·L·ê)hs’„�Wá!Gç´.f3rUœê«ZUîŠ×,›#L… Í,{ˆÒí ê KSZÓ=º kò*w±Ln©}¥¯:h€’�—�MºëúØÓ±÷.¤Í¸eÔè,ðIÓ]£KØ /3zãÎGi¦}·�Ʀõ²2ÇOɵíö:È€•Ä=3ÈF q¿;J³ÊJdè8y«h­žóÍ%æZwà»t"ùnF°Þ„÷=Æoƒ œD׸�#€îs yMXé´`åíÇVN3XÚ ï�šØá”¶ïöCoúmÏÞ@5ZðZúÇ= Yy[þ�¸6ÜwC) ¡Æ†•Þº’° ¥Y¶Á�ly±»xö9Ùµ ›æö£ým–­Ö礔Èz3È» +cž´™nª´Z .s¬;Äaò—ˆÖÞëþÊöCwÕ y+àoiA ë]NjU¬9¹q>}ÖC‰‘žlÍm{Dœ¨\”ç”HÏW†’êjs6÷$Ęn%Ú:]Æ�ñŽêÜÁÆØ�‹«XÊû˜¸�M�Šiw‡ã]GÆVLßê÷ÜõŠÞõY$Ëôr.a¥õξý§7Ø�r7û!³ Þµ©�ŸÛ·l†­íg"�î»*ñ-†ç5¼~–Ý^NñJGr×öþ‚̺m÷páßtu³Æ˜úöÖªñpæ¸]å°CݸÌ�WVó»¿ÂRU[�05õoʼnxàºõâ²ùØXW6 ­ª€WÃÛ×à&¿Kç3jàTR½K[ÅØyb·©@i{Œ k]�o£Y¾>faâ0ôcÔ_©<º3Z•_¶ãfêU–„Ó€ù{ ehFg:ëï"¿4F±Ä!ÉfŠn�ö ¬î°»Î'ÓlˆW–û9ÝüíáÈÆ†È!(v…Ækiñ?-Õ ö#¡S²†‹!•åía CA-å×�¼”NHÚQÌ ÝÖšØ�r'Û�6:ãE%O”ø7ãøk°~JRiÕ¾vÏÎ[5Gß5?4kÚ7nÇÖ$IÕ‡w%7Íø>¼ÏX%ã $^«„§ 'ì†q–Æ‚k £+x¸ƒ,§ˆ êλã:’…’$šŸjÇ4ËåL¼Å©C pb&c@_‡CÚÇmƒj!2�Æ~csYꨲºÄÃV�ÅCuŸÛwsÁ‡¯ë§¨©‚È#f£Çwä­! L‡]ñögif®•¬Ãƒå&+„_àNOÊze9zfTmׯëI—n7ÌgÛv0g�úMc—kUe×Y=Wt©ußôëNÑñ3kµ»Æ-ˆ,$ŠsUÕ1‘Ó}ÛgJg íÁ`4ÞÈÚ~OŽÕ_†ÉMì>¾þò %TZÒÅpÁºJƵiµ´æ8Úƒ'•ëíDZ¿Ð"”¿ÖóóqõãÑÓ?§IVͳöeõ6»)Y¯ófé‡Wm|Znë”ë+¥ç6âKa¸{ ‘ H3�óƒ4¦_Y,˜Ä8£�Ò Wz[ÖÍùS àžŒ¨_~0™uq+J¬åQÍá®Pt<ýÜor Zú}S:ý-ó2€Ÿ³sĨV�zŜ⭵zÏ7;VåAÉeâ< ²:êÊ""æ xžÄ¤Jü[ß}¾êº7MScÏ6D ´W8}tÖ¾æN=ÈFZˆÛ„eBõ†˜ ÓÀ†P¹ï döxÚãØP|ð½žxÿvI(ì¬rÀ�À˜ú¬}¡}ïvÆ[GµÆâG_wù‰Þg›¦íkt 'SèTEskß´‡f3MäÅøI�›§Ÿ:JÅ‘¯ QSZ~n•*ÈeÆçSM¬ýW”™º&è�¾»ÅÔò)ŒW²" ý(ÿ`-Û½ÏÉaâ¦:ÃÐ ðõ±§%~%ðÒ VtÐ� £znºØgwe2ãëÖŒ<•¸£š“ÐÈá¶<�¥‰ð�÷4·$ÃÊ+Ó�}~ÉZMCgs m[§·7ó\�œ|¢bèwͦlÙËQ·,Àrý`)]¶Pù©­«Ì+(mø&ËpE!¨ë¯¤ŒÖüÅVãCPäÇ0! )èÉŠSÌ[;WË�i¬ÂÔ™Ó\C:Í� Á¬É•U¶.à! ¼žó†œ?ïAqv’éøl®D”›Œ6,�Ä „¨s¥Íð9Š W¦Ù'ÝÈJ´¿.½nH]T¡Öó|~%}ÎÁŠÚ‚x«‚vy”qÆ‚Y3³Â7lqu-rÛŒ&©¾°yQ€…Ÿ…¯‰"¾cZÞ-¥!‡íRæÜ*<² ¡Û·Žë‹Š+o{$(Ü A< ìÖ§`¦¥;îÕŠGÀ¢+sQeéOì× &¬s¿.8Å;¨òÀ¸¨ÞÌwÑž�ë®…~Ŭ´[i ™f(Úöâ¶ÏãMð.ºõeïOÆøvó­Ýíka¦ƒÛeÙ•d(ë·¦Ð�м5–…?PIß¼† JƼk\á“-pêöÅSPYÓÐÛ˜WìQn c=9ï8�£µÝOÀ0]ù…’:À‚”£ßkíŽJfáÐÐ_càÁ¥}Ÿ•¹e ÷çñ߸TTMެ¸©øM[†Â4‘›|r3b hl�>á£ç�I�ÔåJ�Œ°w1y”)0ZöŠ. ÞÈ&=ÔtEð†Ñ»rÔÍêRéýàQäl°¼ré°tHgü!¶Ü"®<Òúw­µ¤‹£ÑÂÎ^lNû<ô.ÓiŒGPárS3e __[µjÜN!ûiàÒ˜Yl7äÙv>ëFh…Ä달á×Ì AwÛ¶5q¬d­„Dši æž¾,to&ƒ·××µ¾`_ÓÌdAFöb�9М§i­-Ue$¡jˆQ7—PCáöÕh¥zØMºV[oÖ¬òȳ, ­IÆ÷c¢x¬O7Þ³O¹I pŒy 87Æ\ð–§Ìý—¿­ÀÏke¼· ø¹‡Í#o¹X0jÂEÄ~ÍÝ9¼þ Ã6-#Í¥ÿN/—é”2¶¥XW8– q¯}‹PH/Ü «|Tß½> L‚ô2�Øá×®¼€|¹Ã�šŠu‚:�À¦Yo':Ã@cO½¾ä†¯0 aÌ…mw¿¯³åó­+~áV"È5IÇðèã¡~Ñ^Ç£÷¬-…h¸qýˆè_ L,œÔ!–o‘˜¤îž¸á+VSáB� qa<5Ój’×â[i �×Úã;aê90N'MTM�Üàî ™ÀvÉŒã£_{ñÁûA¥=]ìèTübé¶f±?_f}¨H†¤í³Ký}W4’¦8'± [Š�›º-[w“×u_k¡Â›„oÃÎÀ\äŒèú*Hp-`ï$»V#ÞÒÇœD¶ 2ÕKÀ¼Ÿ'=µXÆÜYíŠÀJ�´…+_›ÆgŽÙæÂÖ<)6wPm®h µâe—ãH; ¹s6í¦¯TÒ!¸`M§/‚¤œäã•:ŒºRWkfÑVP¦RmC8zû¡…6â³pV „熬¶Qü,ü¡\º¡ÍSˆCÄON~ßz„G|šŠp¼%½®i!ðϓ˸.í¾­ˆ~yäÙqî#þÖõ}×"�;B«íœQÀ¶ u“çÏ ÈÙÕшwqFjhª†k}:^ƵËïŸï®Üä`®ƒ°+½e‰¶QO ùöW:“«[ÂÏ.Ï`rä¾£MéºæÒ…\6¥o8ºDðNÚºÄ ï‹m^ß&Ý�Ë=žïö0Ñð�±j¨³¬}¿Äv¥⩘=#$8áüDÀ2Zº)­¦ûÖÞ•½{¸"#döª²RÓyÃXÉ…& î¾c¼ ²Í{;Br­ ¯­Í—;¶j‚Uç2@�Ù�±0Qß­l…•t8Ütm¤‚ÛŽ«Ïízó tiß�¾Fº±Žš Þ+Èoc‘WH¸Yƒ›°G -]}E›Wºç$Ck»kj£®£ª§~�Þ‹ÓO�"™0äª"p½ÖJ}9y!1;ĉµ¹ÕîÙ9È*�ã, ÝÖÙ¨Iˆ…ZŠ;‚¬ö“Sp;['ÞJû�@Ï�çªÐ—òZ)ùsù !cÃÈ¿wëiD­%—Qmœ`z#Ï£;IñâÚ¢8ŸeÓx¢dè í%"÷¾~=ùjX´péoB Æih5o½ûôrBü“’±¹^Ùõdý~z¬±ö.è÷*±j²Ó/ŸÀøßÊïŠìÒÇ€HþN.ˆ76P5 %cÃ]Ñ„tZ¨)âÙd2`¯§Ñuõm{Þl"5{Î5ªR�Jd€Íg�:ßó÷»µ�;ïö×ŸÊ ¾BƒþDTÐcJŽX@85‡ø r&¸Ái)û~3>Ñ–Èk5_†F" k¬<ùþi¯Ó3‹F-sKviw)4qÇï�ƒåÊ¿ *ƒXîMàSül&¼üº@!�õC�b“¯L"N’i?×úíërÕÎØ5=WO«×& ©‚ëæ[¨¬"õo�Ó§Æ`ÿ�•:ñ�ÿ_'Å7�jtÔæŒTyG¼zß_<Öj-~vG=ÿrÞY›MxV_â¢ñ´zG<§Âé™ï`ÿ’sñ‰ÀPéZ?¥·ˆ9§Q@ìƒ{“[O¸”y‹쟶Ü=ø û”›þšÍ�ðÓÛ­?•�seˆ_}0{7¯úüüüü á/óÆÀœ¾9ø8“:�}5i /v�ÀõkØðk–fÇ¢ªá¤ïÙy€[“|yFkáÌ“ŽOå–d"É" ·Çcì  ç‹È Ÿ8=p�ÆÊ±¤züÄAãEðH—ða®Üà7+@Œ «јæê ]'@ Ã9k]Í:ׇ~SÎpdg·Â’mN€¼ ëý8èXu~mÛ¸&ë[³¤�ÝY?r�=°å{7žÁ0ï–o� U׺¿3ï(žÿáý,£�„»’yŽrà„î�GõÈ¿Ö+5¢ŽTŸÄPc$t ¤£D )™ÎòÜ'æéxt7^µ…·Sã}ëÀÝ)¡þ}Ô¥Á-ÝGóSoø)N‡•¡ ý‹ëŒŽ%b=,€ü°pÕÄ „ÅyßêTƒôÉž·•î°œ`"â 8p»¯' kOÊHÍ“F`ð”vÁä-þ¨øNÃü# bK‘†çx)$æ8 ·"ç_óu†»�my½í3¬Ç!‰ŸÉJÛ‘ E¯û½€ÜzpXk«Ë y�l*!úéW™–ÿ8Á^s‚¹Ÿ”}îyÒ¡ïôj/÷JR�JP?è¥)@ P)¤æ¿çþ£Ž?®ã5äq|é‰QܘéNWÀô€1¢ã,y— ¹[6Ü(mâÅPÇ÷°äsÄö_Çt¢¡“~9‹ÃÄðG�HAªç¾Ê�^Yו#ÉÜ §DÛw®ên÷U›'$L‹%¸‘ì.Ú�O¯ÒŒRK‰õ#c,ò¥)MÔÜr™þæhìÛý,|g¼[Â�̉r?$þݱ ¨©ï\™ZÝ žó’±ºÎÛ=(Sµ»Þ›ÇÓýùÛº€ÀúźW»ÿfÑœ{ßbà{[Å•>,äµöªÿY«7¼æÀÀïÏÞü«ÁÅÈ#gͲ¶rZÎgñ–Œ0;)RaKè-v8§0�‹?3Ÿ¢Ó±ˆ'÷0¹OúÌM±ÙœÄÿxqŒ'>!hA#g*eÆ0lÑšöfŜհë_åþÆ©F%Ôï~w€ø�ô÷”=ÓC°O £¶hÇÚ‡r$�ƒÕó¼±±ƒ³FOÌ©( ›¥q†wLؼuk°'ÅJÄÃ^Rô”ñ›†Mm¢vBq�CíMxcÞ½Ýz�r'lµ•$6ªÙ쓚k"s燶ÒßâÀ!4FÉ8‚jâz’dø"@iù ]¼”*rnï¡ÐGá͇Zœl¿á[ïÎ�ˆ¯Ç,-5úàe°zªÞò‹q˜[1›„D)��ýÏú²Ö÷à;Høí·…í)J ÚßŰog=%ü_ɬƦ~äõ¿ARÛŽ’©×øí_ƒX *çL¨w}¹ñ9fÒØÛnxf£ÐMóšè)ÈsF¯­.nîDó?ísÍØt»‚ �p~ºd}àoìÜ× ‘”ØÃw€ÛðLÞFÝZeÏí­’ÐŽ³'„~›Ø«Ž‹Ÿ¯—õ«­”zeŸmŠø© ßxú¡Ô|º"ôÍ¿«B F¿ÊI†žœÇñg,à–?Ÿ ß•Ò8�>'T¢:Íù¢ UK¿!¼Wö5׉7Hìÿàä¿ÚÞÚцQC$Î ™’�Òa™ƒµ‘�vEª,É]�|kjPo¦S{éèáNË\Ã>%m$Õ�fÛË E¬+)¸]UDðÈFN%ä7Z™E�ìQa÷%ÐÉN[t½Í€ìäßY”/`Ÿf駃‘G’ õ›�î 7ߤ£–¯Œ,?l¬œ:­/µÜ»‰Ù œÿGaÝÙT`o³?ݺgú.~ŒZÁ¯çB‹}ÿb˜TGÞ�‘ü?ÆÞgPƒÚçs~2” ÂZ;^ðê“©µÀ€ª¾!õ:Ý�ù-`2áQ_З@¾ÑµPöuÕå`ÓŒù<Ü Èš?áë‚Ïwèê°_%Ô* îbXÂå yr(ÓºlæN`ß ßŽw Ël[0Í9�@ÏœÝ'~+jÑ@ZÌ\~&eÁšŽák¤VYÁÎ2 À8ç%ƒ3”�&†C͑ƒ› ÚJ>³ Îºò{ͼ;ŸøS»¼qÑÁ16ðoÖèí6F�±th{ ÇHÃùPXrŽ6è)SNkžø@»¼ˆ M¤ Fo\ŸífúœZ׌£JìaÿÝB<ü¬‡Ì¹aVÝæøoïÑ ˆà Æ>4ÄJSksWÍ«úµÀJ -±\vÉI °7†Í*ì)w ¯€xk1‹‡ŠYVq'.Û Rc¸É€èÂØ”%^mÇÛ²D!й²DÀtö#¯ñ{Ž­éZ–y5)U³ˆŽæ/EP£Nz©ÄN0ÄÓ‚ƒBò«ñ(áê3â3Z�ùãÚ“õÔƒ»1Ú�˜e�L®Š™Ïßèâ/mÜ àP@O}OêÙEÜ^]l�Ñ øgýÆÜÈÅö/ù¡ØÙ²¼˜ó~±Ž 8ªƒ‡‚ñ›ƒc`×ʯk&×üd5p2·ó#‹ðpÕõ60Ió‚†�¤ÎRC;5Þ?Âÿu@Ñ?3Oþcn+ZàÕ>É ~gQ̆õ+BΫ«Œ>#9u‚jÖPˆtª:wGxn­°2B9èúÇúÐ5s¬s86C ‘´ ¦zq67‘pÎÄšn´ÇÎÐÐfgMþÐ)§Þ˜ÖFÈ8þñöíí±`=Îå}Ô°851bç�}{[›6�ˆ^È[ÀK[wi¤¹Ú¹§DÏpTý;ïÄü°V ¨Êö¯ßägžÞ ßt¦D?•Ü+0iD9{‡Òý'cé±¹ñ �¦ƒÉò[7/)h`Òsû½#ÿkÜY]Ñ\ä#1*‰Î ¥“ñ×ÒÓjX¨ ‹Dˆ‹YoÛM�Ä?Ð"“X'ª¯”ÌßòzàìmE¼¨¾ctÄÞkxB®¿gö0é_é^½Ÿ½D£Î»ù§ÒÜOý•’·öôËèêV!Q‹£G­ òŽ·�~“¸=•‰Ž¬a«�Q`‚Û_VÙ¯õ¦Öÿ4è‰}L¤32UW±"! ð-q‹½›w̲…Ü3Ç<ÝWïx~Ø\ºXV™‡6 æ@~ÿoøæ¿ÈX'ÛK±ã›ÿ-W*ÚB1.ªôn»@&<çèøô�úÀAþôŽ¿žà;°0²È1L)@ÄÔ†b i¨¹b~jÁô “þ_ï­Pîr®Ì¬¡ Q4óƒÿ7«!gÊ ŠÌò;Œ‘ô÷r–¯/‰Íõ¶ "�‡„UûvcØÅVä¥ïïǶ÷ç yÎw‘˜…¿ŒÁR+°EìS‹!¥ºnSM9„•êS{-kA±ù9ßí Û°ÐmËS¶ÏUÂõ“þÞÓ!a¸H „bÝ ýgeA* œkÖh@(z‹i <&¹•Ó˜}kkšò—q´æÇÚah4¸áN%”bóâ ó󩃀:!‹�Hì3lªBØØSô�†b€ø©ôþ1ÉVÖ§\ÝуìÐËÃRÔÂhÖ�t XÖ‚“‘zºþL¦lŽ]ej˜L0S,º?�l(Ñ´ ì�ÿkÁ¹p˜1ëP œû°S±öh±ic'‡�,QX«*B�ýE¦pôxdÚ_¦N¨P–å Ù×ÁV¹¢&Ñ‘/Z@/·pM-ÌB„m¥ÔÞ~�KÇ¿$±™y‚å¥jE_3ž2�ü>òØýcN`©:+ñ`ùW£9útî—ª(3µÃ0ži`vô¨n÷[NÕÕÿ‘u9«‚þkú?ÆÍnJ�ñF³a£èë«ö茒cýÕÁq¡ñ!Ôu ã�?Á0õÌ®JÓÖï*Ü¿ò¨ûÙs7Ïç‡/ôýNxÜ ò�]åü{ïn·* *ºH!'×`&˜Vëƒ�‚«UÁÕy*ŸkdþúÖÃÆé0§¿{Ôsã'ü:…ù™<׸η«ÔÛŸ3_ Û�_Äøj{«·+Mvµm#}Àè0ØR3¬ˆœP9‚XV×RœHäÀ4¥Ãù…†·§EEůAôQëÃ��šßƒÆ¥ˆÔ@ÇúИf´'ñ\‹AS�*?ùVÃâ1Û©Ÿ¯aŸèØ}¯šV‘LueÑ--eç6›‘½^œRPð1İÀÙð\ Ê?2Õ!V4mÃ[‡€¹†QUœàMp5`{Í_Œ„f2t4óœNáiÓyÁŒw­«òXÕtŸ@ÇšØH/g‡À×âbâΦ¥$·Ñ«Û÷g±{'kg;µ�XD«ZXògbÇç”…‘E9[Ñõ©Éò”¸~ͯ�Á É¥C„%2ÐâøÂ“þ³2¾rEÜXÕ¸ø9�Çí‰ø¥X nwÙZý±Æ¯ÞÅ ù¢I �ç\ˆyÑ›cý­ïT!xã0*JÕçLy�5ìœ�"¼K›K¶ï—ÅñZÓ!�«ÖZÄ6%à¨æö'îÏX0%B›†÷Çj9rt�ÕKž¹KÅ)–Õ[;L Ÿ9�ÉùD.?< X+|ƒÛÎBx%–#å·}ÒE¢´�q‡ÑvÐ6Áó5ÀPÞ9U^žkm÷}çÍ4Lx©AJ:¥(>ÆÇ6̆DFÚåÖF޹¡µO¥œcw¦°Lyvß¶ÀÖx¾ ã’,ü­:ì÷ØWëÀ%`Ó@AŸsè·â8ò¹£kA`Ià1wÔ1…{ü¶å³=ȵñ JwçÑt_UŽp�²'E"öþÅvVö½!6;ÐÇ}WL3ä·¶&Û`_„‰öàÜ�6°ú?³!6Óeqê„iv “›ð )eK¡�™�ä+>£–Idã¿fþòJ;ï([w¼Vì™í‡$§-Ùë6GÅ\o/>æãÌà2óäÆ�•¼1ÑÞÇ6 hŽÃ"$¾r2�þÒTÜà¦ç™³õ2aŸŸJAŽ|§õRýÏiñ véÊtpŒ©@p[2˜Æ¯™£PÇ+(0L�à~½§nv¨{@‹m¶†Ú‘ýÖmç=æ¸Õ×§^)2ß©Ý𱟛¾�Ía’1f!ûˆæsÕy¼ÞþøÙ 匭|õñ�˸ֆå{ÈQô¸ä‹8ÝW.®ÜöYó,ÝdЗóÄÜ×.”³ë*Ð^—7i{|@b&SKƒÆŒÙ(Ù}½î@xíÌ-›óEuÚ%rV›ÿ` OèØƒi,ëýç» ´×d¯÷ˌΠÓL6:ðÖÿÆvÐI¨Vp€xÖÂö3ç\ÆIˆC «o¯ ý|¬É³�È?T4N õ_¡ q’`'*¦ñhNqpµ›0,�"t/tž˜Ê1b�©‚W÷8ái|_Y9�»ªýc²yúªØZ± :ºíE[¿#¶~úì>‹å¶»x̺“ÉÄÔßç`mÐíü5Ê\©Ý,‘‰¬Fëª;`íÄ bI½òæAGŸ#Ç£æ×ú¬IÎJâ ò:BumCfÉsEÝíלù[Õ@'Ì.$/ÔßHÍsñwžóÇÿ ÏÕ°Ïê®°Vܦ¿4ìùà˜\ØCÔ¬KN%ïL&­N`>ñÛEmj 4eR-�6vÊËe‰$¤¬÷³"|ÌMJ–Ú•ôk›($ƒ‘Û0í • ¬©ZŸ6×­2á&nH=ÑÊó˜O74gòÆý ã�Iû¿Û4AÂ\�qHÚ¶® o™~Õàëý‹}D? Ñ` w¼ŠwJ Õ¶”Æd­�+‚�øDé“O×ûb kí†Ô xdVòµFïd”)V. ¹òHÒ•€ªÒ_[T5óÇcÖ›t¿£cÝ%7Øð£äüj|iÎÐÅÁý!˜ØbAókÖ¬@t�Ñòs •r;‹1¼}ÛºOãë�ÇF_�"+8,]#ªÁ\“á˜x»f…šp8‡ØÇßÏ;jØr§x$ë„=Nˆ°ø‹J[Ú…¸n-äMchCN¶üóÁÉóq^Ay¬½¤•WÚæÈÿ¾4Nȼ­:�Â/¸°Í�oo¥[­ ÷å¦3s�SO­†i[>Jˆµ£Še�ðJ|ÇÅ[[aa?Ð ›«˜Fuîà¬ö�tDI™{0!ˆLwÖÞ¹u{7(&yœÏSåý�{¥ó…N/è6Nâ,U­�ÂîK½ß(ÎýãþÜÃt–áuÜújɵT:Ç/·i¼q�G•êkR¼MË«½”—µÛíí-çg ÁYíŽâßßaà1b8/¸|2–1“áÏsr¼Ó&I–®®+ጌmhŸ‡aîQk&!»“±;ì1!Žq[�‚xáXwAtUÑùX×/H)ÉÅ={ZÎý ~ bj*w¾øï§Ý·‰Pîžß7‰Ó�=döʘp €�È2lÁ/ck_] {!�ì°½MlÈxÎ ¾Öæ»iØÍÑç5nôÉ[Ú¤YˆÒWhÊU¸qœ°u–;u¤• ÝîWCoZö¢òžÃ;>ŸÏ«SÙ|€Ö2 V£TÍ„íö.w…TB‚5ÌÖV"/ Ô÷0ó�õy¨ãýÏR½`ñeZg"ù—Ùˆžù7KxÞoœÈÐÈèJœW„<�õ°Å9Cõùrµð@ # Øã/Xî¥Ú*>ÃÆ ƒ]�$Žât^Ä´HdY9\§ÕÂ7ZÖp(´–¸˜éì4ƒé×zµû“®*½µ»žXC`�5÷Íë]+á¦ßË‚æïP;Ër·5{ •ãç7¦fa+±Å¯ª˜Ïux#†]ÁÃ\î*/p ƒGˆx¼o{Í;™ ¿ÛZÍsÜ’øX­ÆÖƒP ¥�üó3¼è…ì6jªFov^¹¬¦·“aµŸÁƒSø!ñbÊTº//‹í°à8oEÎ\ô9xƒ³û¦Ùi£Š¬$hç,¬ÛwBî38 æMé2N¸«íŒñÇ÷Q©{â›Yƒ^6ó°«„áUlFÏdðsª‹ Õ…—%׀ȋ]GbGA‘7u¹)uÉùˆ}'Ÿ³Å}‡ý²È¸s½zÔpryÕ…zÕaP�uÞíÀÀ)£¨çCÙ[Ø¥jüO|¾]w¥}V7P{WÐ?Žm¬ˆF_²ˆ$K!€Ã–yO׿ÊiàÁVPäR6kÎL¥¾ƒíŸQÆR2r k±Êtßv©‚•IÐY�æÖ-ó yæ±™p,n—E4 ¥%*ºvåÙíëÛ ¾ \6[Û¦®ébDœ2Ö§T’j¦‘;)Šú‚ò)ãÒ 5ýz²-¸÷ï3¢xKû×Õô½­Ø7]:&¾?)ý@û¸M¥ª(QÊ›U�5Vp[°`¦÷ˆÙ_.W´÷TÙݯ<À4Z©œèÄ*À6¨‘ÅB2A ~¤ëxx÷f½€V +‡§4*MÚ ¤ÞùS‹Ü AĈfR�‹>£Q ñ<>´Ý_#„ûƒͼùN ¢ú±åŒñ—÷A&¢ùc*q)ep¡¼m,¨Bäq’Ø®ÊÆž¿ŸY sM]Âé±#2Zß蓦³È5Û�Îë´czä (dÁ…Ý�å�üù�e2ûŽ-›@x©ô –RO|Üè"jÕ£Þ̃›W ›’Æž.øä¸jÝE5ÆvÙgä®åE¸¿tÃÜ~Å*Óo3œP6Is÷ÌK¬ÚtEq‡ˆP¶F_#}ÄŸÏSæù?9ëJ�ŒBK\‰ŽH©‰d°´j2€x;/ØÛbÝ0G8›2é0júî"]tûæ5a¯PKá‘{žÛšxå¸Äç\»,¦,»êÍßI†î!##Kfµ·£Ý¹vò`âº|òV%¸Æ‰Û¿]ª;0¶�iê¥jYøAÞÌãܼëMÇðà㢕²Õ¿+#GOsÓœƒrš–<è�øÄ,åûpZëÎàϦçù¨mlï:¤..$P¸ó?«Us�jqÖÇÔ˜Ž®)´ÞkŸÜF›×…fŒÁãT­d+,ÂÖC³1Wçpà‚€ØwÎf„L“:z FÖvÛºÓ$a—Ç«Óü° ÎY{n`8Mµ×Yù Ô·ìVs!{s8·F­”MN£ŽAµf”c f»>üŠ.C†JòîFZ îÚ%=°k|]8ˆß.3m—Ç!ŸMnKK‹>¹`{Á9Ò¨.ŽÞ½Ã}ÓÛÌ|³µÀløŽjpÁÄ ˜B_o'È,͉—<Ð5}ÃQã#_%Ì èêntN¡G;zÈsóÈSå*ä™Ã_sC”Ç-oDìC>×Xž8¼ï'U)ÕŸ]¿vñç¸hrøµÊ:ÄöÖˆ;,×XçZã/)�hÅ�¦A†ž.¥Ë\ËܼöÜ@�Ɖwûg/Z™ˆˆÕïy½‹Íb¸¶O‹d,\,O‚=T³2Ó>3ñÏ#û°N}UvËüÄÈZ«çí*&6ÌŒ}-�‡)ö5WHnÁÚtlÕ´ƒ>ý5nUÊfÌY%ò¸xŸsCµúªçÂ[«Våkç½Å~ðv«mCÓ‰n"JÛæY�Íñ³\`2£5ÂÀ$Ddh%**º<°&«‘ýnª.y4Œ÷»ŸÏ«Þ·‹ç¦±\¶—àròZW+ƒøN‚©–4ÛM?éǤ\±ãc¾ÙpfKf+#Q‰ðùÅÁ-¼  ¶Epœuï@¼ä‚ùœÓf^°*+4¤÷6몌ìöqí�³Ò>ý{wäA§�ö'tÕ²z½Î­‘^€¨âqŒg‡,WÈAIÝG3ŠÛ~$¢!Ä×6}æA™gYø�ÃÙ†â~œ­ÝÒ�òÆK°�3ÑquAÆü“" pp7ÄZÚÑ'®DwÇÏ¡�¹»O2«TгõúüÀOÖñwwØöå'mŒâ¡ïôÛ  që.5høÂm ¯�$%å]*é ½lô­Í§D÷ØÑf‹Òíø¬/—4t+fÈ^K×ûÕe0dv˜ƒG™�¿'À–§¶²\¸\ìY‰ô¬þlLîK5ìn%Õ§­ž¶¢+Gù:‡Vû½ù‡$Û1ÏÓ/ÊÑIA=Ž\ÔØ9 Ë¥�a…qüÁ3°º†ÚöÍ%ß™‹«+°ã/3ž�þ"µá¨†f ùžm¹]ãÕ‹4çr¢ 7O‡EÜ\Ç:[eÄ«‹ê; (u Éµ-a|¸ÛÖí'TŒFï}]îü|í­ Áù`šËø~4¾ 3f¾tþ•6èÅýÎY÷Ë©‡tª¾í{¤nâ,7ÃeQp÷€ìäÞ€ggU Ý|Ô¦|¼Ü›ø6pI¹åå¯ÙÅf–W½žóÏ‘±Ü ß—ú4Ûu%ôÄ}¾ÑQ}à+{(ÎMUìÒYs*òö:Eø�Ä0‚.ÆHå¾µû§žª¦%lˆ Îû× cXtÈ b÷mžªÙJ6 4!s­_½C¯ÒVz‹a\%1�—+CàäØU,- ¯ƒ¦—½u3t %ž¾ôìØwŸA¼°SQN+e»Ú#L!îeP‡LhG¥Î¾Ãªùæ´+·pÉ‚l÷ÝíØÉŸŸ¬Õ9ó¹Æ0áÎ 89¶™Â,Ö_L f‹‘Íã´v<¨êÊ´@�¹ €ºE'Iê\‚(q暯â6“fßÌ£`5øŽwoº_‚.á@¬Êë¡E…y‡×@Ë_N¶í‹4Wzõ�® nœšáêÝò�¾÷;Âé +AO6…=Tžðíñ†©1 Ö([øŸ8Ñ�¾êgîÓ¡ÕÚ¨�rî(Âð[æO‰C“N…’ƒ�ûÿ{º‹ É~þ˜Eç—Eqô¸¯GûC%æëï}Oç=™ótÙßlt±}Ï;ñ\ ³)o�ÙH„=†±=aGa‘ö ? 3Zܨp5+•Þ¤kmo@¸^Vé}_ÎX6ÙóU1¼E~o¼š 3�‹8vý[±îö2|r)ãüÍ}ÙÊ/=9CÖûòw|JÆ�Oa¶¯½x<Ó)o»è ¦^N>ÞÃȹÉÖw“ÇÑÈi.‰ñIbü\QL"+;a*!õéëËo)qžcþtÔɰ÷A¿Xm4±›OV÷ éô¼)¤kx/eZ\5Tq¹¾‹lrb(¹A[ ê¤öó‡Ks ±ÆšŒCÈÿ1~‡´Ër‚§’Ÿ&ZøÒ&laŒ·ß5+ãA1•‰1YP/i£}«w‰I¼á˜¾\(DXÀ·Tð¬@´*,g‰õe8”°Óe�EEÃ3úY¼þoOº7p„)šõÞy>á’zõu›µï|qçŒ)ök=ÆÒ¯ÒnT«¨M""W6S`¡ÕWPà až0aÂÄAw ¶ñÚ4ÓŠƒi":ȺŌ¤D¯‚ÀU,—›�Ñ…™+\f�;Ü&ôÚ&AÅ-Æ7i3ƃ]�ÍãïjÖ=†C꽚G ?CB0ú-¶ï=`j˜¾ ÀGCÝX�´؆ÙÝá4Á¸¹ˆ÷ èXb¸¬jpòt|\>㙇©2Û¢_-œTq‰þ9¯6-ôõõkùö=WS§LE‚¾†�~Ò’„ ,o tP§„“AÝ ¥+{wü‡>7kJçårÀn@ÿ»›ôÆwI�“\|!Ä:�¾+Udñ!¤öaáº�š®™í`¥ÏSø§™ç?¦gÊWìP·#™óÈW4Ú�šÙÐ}áínõ§M båpùZƒÑæ€=¸€Þ¹º›1ƒÍ'«zXÕùö]#v#/%‰8í8 PYA¾!;wÇï›ßבñÙUq£2K×Àéoƒ ÎkF8ñÄ‚J‡Œ2Zpƃ<3ó@m]m½Lª1»¸}\ XºÓ¢g `£oÈYÚPÚ^%\Qd þ~Å£�[ÞüydVËŒ(yÜ,†:Š›ñ9¢‚'AA°�Q¾™’Ô›È\Ї90ȿʽG¾? k5½üe]ÁZ7á‹F7¹Z]Çn�Ús÷{zßѪ-šyágÀ«ðãšê†£«Xû 0Zç¡ûmlÍ]±»·Õ)ðfëo6!ß4o*^;Á#f8¡ÍjË>ð·3=Õ.*üz¡¾m9pÀw yÖ!¬ÕBœœßÈ.‘�Pj‰:x=vì•t“ ÷ ~ïõÈ3Û¾�=óDÛÍëôíÆVäx¥¾ 7Óª÷Ëç¹þ¸|W2X¯Óqpº†øWç“£SÕ?¼¨Dd÷©±´Îøls d³'˽!+�¹d[yãÏ‹ÔyJscg×÷[!@qÍr ”Ûdu(Ç·Þr=7÷ éSH^lÕßö²[9†¾Oë «û˜„#݃MÞfТ©;;Xè3ˆ%á ô¬À£åÍ=•M5{#�Ó%Aï·9áqì$‚És”îíéÔk|­ofó¼Ü{â"0ЧœƒÛWÆÂ›‘;»”Ö÷¾¢µ œ2jÇåMᘢ_t¥œHŒï¦Ð—6ÛÝü—}I_{ w5géBÚgÕ¾HÛxAT&«¿xùʲzªÎúØïÛ8nÅ$@ü»M z0x¬®1u‰åÄÌÙ³fskâëckB0¶Ë&¹6|o×ÉÑ­sÇcS×{qñG'W¤ ¥ü#‘}êÜÒÊŒ¨!ëJ×QËi!{®èqšÊLIM;6\ï *#Ê¢Ü. ë®§Yõ—]+ö8õÅnp—²BÆé“N7¨˜\ZQ"‡B–/cœ�nBÑ7ÃíéµqÂqy†)GUÌñ½nÖ®îr4õ·©Åƒ#@¥( Sö�ùçÍxé͇C/ê—ÆÂ`aŽÎs~µã¯¢fý�Àz²¦n{%ÆWjaO(Ù“8hJÊBʲ­[1�àΖL—¸v¾ÔÜ÷ãrî1Èe]'¾ù#N¡¤ñÖ5,MÚjeÌ1-„»Î>-O¦¶ëˆ­ÊŠÂNŒ]ÓÇ•ÉvæD'§²Kh ¶1+«F66 Ί/X  } …†ï(‡Ë~o¦AKàí{Ø¾Ì ã§Ï&ÿMíÌÍÄ/¿ŽÎž»¶‹Õcò¥YÅ÷Žš2¹k¹f÷/í  ‘H½gA?¤õQÕÐ&YÞÁ[N²F&´(Ð8í*ú=Ke¸¤g´.ƒEË Ž³3›¬s®6m·½ƒßä‘Â{íW$Ú¸ úö‰…n—Û ã€÷X¦—w2tÛ 5�6ýî{(!O‚ОÉëU^]62hŽÜ u3&Áö7‡ó|…Ž#÷ú]4%~uuPw‡ ¾Ô²iVý¿/Øúåø[Ý Hh IK`t“¡ÞŒЬcšaÞóð5±ZÓñ #õ˜yp4- \ìB‘ÐéDú3ÜBíî¡/•Æ3;ZËa§z‡»b 'KÏpBæØêS¸îvuÈ”E¬4µÄo½å-@Ø °™íg0vÑXj/7¬_ó–ˆr÷¿1G k ËÙeÒ¹¡_êf õu)à£*æXõqIs^ Z{š'@Ö#‰[Ê�;IXQæªél¶)S%]šÀr\'�D¤ññÁôÛsï3M÷}êñ³¢6+Ú�3¦¶üÿ8¥(??Å¢ r6MØ>òû/¬a¤F ‚ð˜qç¡%0À˜�ǃë% ^ãù -l…­—�»¨_üè ZÊÀÛñ±ö/ð7Ê–¼ý�×”´%ˆân56yœyQïIi ïÜ�p³œÄßWÇõ;­¾ësl½œJf´Þõ¢O°g‹íæ¹ÃE�jI*�\˜ó6®Sì ~\X–À¦¶œ8¡:åld$y»×@C;Bï� Èð;Åßö�@ˆ°¿{–:�¿”Çf½ïµKÊ™�‹/õ‚êU²ý?tn aØ%ŽÙýs€p¿„£SŸãYw°mu¡²ÌJç[�è°éuIWŽ+�dÃ7nwè_5˜ F¸+…X2$>U¸—ƒ·ÍÃÅ}â/¡?„:žù¾5h!õwLUcïÁaùK(-@à,G“¨‹_uÍy6CËp±‹hËgöÌC/*²Òéõ,ñ0?-‘€¥T¨aŽqÈ2*”„3íYïX?Ëâ(M¤Ééô«Þú±‡#oºðúÌš%‡¤ƒ”‡îj¡€ö¶ìÖuÙ^ßÔej5õøÓoƒ‹ö`K¾— VÉ…UôiÄ^Œ±Žq0ÄW|bÜú°ê\?·™¸ÇFßCÇ>¨ñù¹Gãóæ1ß/&cíÒ±ž÷ëc‚éWㆇ°ÝQ×Ò¡Nï�¡«3W½íI~å ‡WÁf*ƒ’xïF'Vi_Xœòq®©t|-É—[+(3\!™£j¶¸’¯6º:!KØÄ‚`pp�ºØäOÂûî^5˜êóm„ÐgÛ \¡öÝÛɾ¨²ÝßOÎ=s·Ap®N0 Zþ^6AóÕm{1|C¨ßÒ½¹Ôˆ^×qwí–°fภÏ�«wi¿Ú‹ˆÖHã·PCoˆ!ÇÛh(„`ŒÎn< x|‰(dìeOànfƒ!ZnnŒ†ôPlž0;€Ê°jìe‚Éž w9§qѵ/†H›ŠÉ´l]¨Ã^Çü 댄2†+wVÀü2Ëh³Fûq°h*pòW¡ œ�ß—]lƒ˜…YwËÂ$‚@,CˈЄé®Ã–�e8,"@{ü5ð…ŒH­mŽº×Iò@ê�èÓß[‘¸®�Ð 8ÅÚÃßöÚ‹Þé$LßwõnÛ~­™*Ÿ~×äËó^Ëã…†wÊ¢^�Ýçg<ÙHEÃ}ë‰pu·Ì¯®ZÚ-`ïüQýN›]1„+Û§V@©c'åº\L5ÇIÈ7)X—5Y¦— äMîö”ËØÊôà¢~É XZ¡`Sv^çîë(N³_p¶�D ^ŽÆ"Dç‘,VèÖ°ŠËÆ Ü¥º'õÔ%Ahg¤nwG麺ݡÁz«øsÓÙaò#ºÈÉá�ЀØí~2:­™í¹6‹ùïúÒD-†JÂ÷�&4sĪoö”¨ìZx°h_ª ¶‡°„³gZ—�œ ©`LA#8Zòa¤T�ypà nškYò’˜}Xà ål²VÁr!’Wa1V]þáKÖÕ¢Ú—_¿V²˜Ú)û­çÅ{{Äöùšµ*¡éÔ9Òå s8úW£-ÉÔÛ<0û�ØX-û­é&<­�Ã;ͱÂ×Y�¢YL:á»Ì†q‹¿è°Îo£9j{$C¾f_wÖ¥±‹665ƒA EÖç cò^˜kGéëšop qnjñâS¨gÐþaÊ|¥ö˜°7£óë“dH0¾b1õ�´ÕÏLð¿)P(…{Ñ·£WÁlN{«·k =Ö/Ä@cd²lª!UÓÞŠ¡Àóa=Y¾�f~+K)å/™ß rØ�$NâJ?ç�`Ýì}› \±FH©Jh&dåö0ïpÑB¯Û6¡Ž²½¸LBÛÏ|ûö¾Ê~ùßÛ�ˆÂ×;´Ñ¬çQÊš:‡± D$V–�J†'kF–T#°=›žó©éŠ÷ n`w&v“ 3éôºe±×udÄ }1Ü\#\wöÌ1Öó¢Øû€Í™wÐÑ�ZÝ éæ×¯<á¸Ý!®‡?"øì™w^Y{¶8ç~íd{¸�˜mpÖ¾-] ãç¡ÞW=å�ŸpŠä9¾dôÁN0æç•ÎÉ7*—ƒQ¼àêXy²™Íêã1Q” ñÉ °Kdt c²¹>ÎjÞmÉÛA¢�ê°4Àab´½˜Y&¸í¬ÄÚ]IPý±=Tb+kù /5̨Zh,Â-õl»{¾ƒÙ� ãa//ÛH3VÕ�«µñtø¢Ôsô $þ�|›’{c9Î.Ž�[Zp[¹;­@½(ê{wí‡C‰€ëܸ� EmA ’[¨[Uʺœòý¿7^vP$Ò*½Ã…8ËDP…òŸ� ç<«[¸de%•jX°‚È�ç4éâÚœ¬d$,]:ë°r—…f?Dˆfêá 6µ‘p¾g·rQàqpÑžê²ÂùgòĆ+T‹ú´igï ÉÌ(å·rPUµ8í|‰>½ùÆÙwÎ:�]ˆ9%» P8Ìa‡¡”®sòž=y²�d°Ü3Â=µd8¶½�w r‚ÆZ:ø%eâ3rmŠGšÖæ[¡Þ eŽù–7fÀW6 ̈½^ºÓ”ÌVÁì˃£b»Í,i×èÁ ŠÉŠOíñ­3ƒØÕÁÐâ- [ûiMý«Î@¢wðì¾¾§?í>|ŸaxÙ,G¥È캨ôa6x“ Ùá_›<Åþ®š@¢Eë[‹ "ÎàÓGä+7¬Øƒ¥Ù¼µ* ÚaŽ(ì½^dl5É }ï;}þ@W!b2°/3{o%cž8'´ýU@Ñé<†ãÚk˜ÀÝyÜw3Ù‡¦c»ÎÛO º’wq®‰Ç$´°¿HcBË94[·–fæpa…c—¸ýÍ‹iÃî™o- Îm€H;l¾äbO”Øw>°VŒÑË6$ö´-Û1s÷$îåÁ€È*z”<~…‚tMpË´gÓ9ôèŒ4PM�!ÛÔ]å¸ý¯2ØNz¿lZ¾Í�YþÛF§c žMíÌñ„H+_‡�µô½iOm‡xöå– CO÷¨¹¸‡¨ù–ÊÈMßEq2(‹y�–t³%Òjµqþ[…Ä6�8×ý_y.ÍŠJlË�ÛÐrK•‡ùÕ›¶#vÕŽJÀUŸ§IŠ~'×>‰´u&‘#€w‘€¶5‚‚Ö´¬7£‡ô ¦»yÑIXî w”•ÐépŒ=L@ìÄ£øØ>î±9ËFÑ÷ZÐ ðÇ{¶(Thº¨¨ŸP=‡Ç@3ò{O¹°âÛ�S–‹çs ûc7Ý–yÆ(1P>Åá/¬£ì³ Ö?qac @H©²~š@;Ábß.Â/6´dCv•‚‹CO)‰`²´íÁ·=Ôë™ðQ✠»Z^Í/Üï$ísïµl„h@¼U_ ³Ž…‚ãr·,U§îB�¶¯ö“S¤Ë ŠëÆp¥tøš\ÀHr8€ ¢é�†Ha·Mƒ_â9�‰éÙÒÎZ e¤ô·œ;žþK»Þ,o@�ÜC¥…¡†›nAG…m¹JR€ ã·Æ÷ŸjÖÃå mÛZºaP6^O7“±ó«|¶E…Ó#ß”íK˜\ý§–ZŠBÃ6o¿ϘÔk~Nï7gíªžwŪ âc6¤{)ÎòªGMœ×.cZ4¿é ×­ÂÉj%÷aŠï6Ú}ÈEϘ³•£{ž"Sœ Ý@<âf-±¶`ïd°óãû2qÇp˜|ÔärPÄ1¦éíqlåàK1ßÐXãÌsçÒÜ¿5’dåôØã•(¦•yc`Ëh,Ãó“ß\<–옇VÁ¹;:©œL4صˆI¾)Ù>œî­`‘“˜Õ‚¾cøÁÇ ã-ˆ]½›C/ªËÝ3£Q&<àz j÷�³ËœJÙñ™vëJ·6¡>Ù£áHƒsc‹(Jýo5Üè@ÇaýånãUm&°°QüÝÜmL¦Ò2ÑZ'k3L ßz µ„Dh—wj¢Ú Ö|ÆûÍåŠS ¬Î­öà÷A˜È }æšÂ~¬N³óùœ5bI93ìPæ kÍa.ÔZ]¤ÄêGfø@V²bÄr¸\_Î •ép­|Y³3YJûª—{3_,©S£sPuûN¶ô¿�^y—Le«S3uø[R Ldþî=ZAˆJÙߦ¤øôõ9~a‡ÖUZS¦Sµ#èãsgc·�Xd!þ*¸Û¹Ígé ‘4,íTû�´o¬ e»åA?«Ñ>¬jº®9Óï™:�Y\B\ ˜­95Ása³…Ó´PR{G{—; bÎMß–d©Ë¸Þ좹)>›CB|œ°„ÕFq§zþw«ªò€�"•È}dói`HpÒ¢ZÖ³Ëñ óxym͵¢Xƒö J¬š$S¶ã ^†Ó»>©°Ihh 7¾$#Øx{Öt�ÝF¼±²·ƒ{ïÎ]x�á@Wä²À÷œ›=½îYׯ€îTÅVøDT;ÝK%Ëæ©XÊr‰Ï5 Q´P+�ph»›ÓÖË ó• Š Šlõø¼!Ûjäƒb§ÞURkÃŒþì�Üa\Wzß›…ÊV©¼'HKÚMr‰�^܇­èG9‡]Í‹©*Qq[ ø´âõ§iŽeñX„\'nl?œ­îZãÛ®ã7XìÇ3Áù÷îwšmŽã%@pöó1Ê‹Úü  ¹5Ö. ë«ðK‘.pa©=ñ´gÊ+|@y~‚>ß=¼ó‹—…q»´LNo¾húx£]ø§J ò4­—‚õ~º2ŽÉ5A™E+§Ý |IªüŒ]ZA‘¯ÚÆÝfáÝÁÇM£è-¯ðßÔšÆñWÒò#Êñõý¬„ EÅAsŸ¾TM„ßðʇ~ú3N Fmã˜Ý·”äo�£À7=öòi@ûW=WW¢v·z’FlVb͇Bn‡.%²Ó'lQÎLS—¤î¸ÛJ„ànFT6qC{}uγ¥lk!ñjyrì'nI,|´ugÕ¢ÈvÁ&¡ž×&Í™º»+ÝLFñ•Ç]²ÆÎ–õ§õòÛÝínÙ̹‘ (ª¯+J�‚`0/ŠuJ¹KÞò‚1Ì}�q\(' îÜàè$ÄÛ*Ü>]S€à£�øÕIéú»þKÂop†oNÆáp¡�'©ݵ'J5€«@ olAŸ&ãxÉÆ]qÓ ³ÏzôÑœ—„#‹hªé„.¹û nã �\¹2;¾6¨ËwÇ#a–nX˜�Q‰Ì)«ª�íÛfn ~^î´E—4ªZÌÍ’¸…Ö82¸Ð‚ö¯¨³ë©Á»^\K$ ÊÛ�͈fc+ ¾º Yçu<¾óÅÊ&“e4k€»åTA¯6~;°SE­na*¿PºÂcˆ;Mó1� sÜâÚÅ`ÜN! I_K½ƒŽ4⥺©¨–oIW™q£ñò(Äqk•rÌ€D­yië´©l/­Ë¬4dŽUî0è•£L#ë_æ£SÊ4­p]Oy˜y,MÈ:'ç�Ì"·«‹�`V)aÁ+ÒìK­A°Æ¾e C‡&Æ%cÁ¶�xЉ€é:ãg£ fABÉé®ó·‹ÐÉ>Û­�¾å\õãAŽ bRPч¶ŸE™µ�˜)†AÚ7ˆ1†™’%"×ë+*"¡ŸW€°jÖÚù•ðd‰i¾‡Ü“zåË\ÙåTàˆ@İ UŒ‚Ô|Ú�dp jƒ°…díNdz»TŒž²H»•bh’&wʨ›Âùí„dJ·¾‹â×,ÖÄzî±|§Àû£Ô¨ ¨ãó¦xòñõàéøaQîž… öyƒ�Ÿs ïIª`j²\„PŒ‰ë±êûÌ ‹YÔÍÓ–qà¹íË:àNpƒ[x?wº¢À÷­ãxÊŒô½9C.®Þ 9$wîwݵóÀ\Õf;G*Ö5 •¶+fTcs9%?1¢vØ_ 眅lïÜ{–Ro õòûJÎ*,=�³A’é-õ÷ÎzAÛ¬ª ²vaÁ£ê¬$Ӱˆ#ØìC¡ÎþExÉS+½ð#‚K±›”r0·íý…Cì\‡•9m~C·Ó°f�ÅBµH:£\øF/bÇ~.µ7*GyH§žfèh+å÷Šø’Së\ÁùÄCËÉüÎÉd…e…®:Žêõ¶œ<+A¸ Ž(ƒ^=ˆ0³ØODt£˜Sµ4§W­9ÃÆwÎÓi«½$ëDx¬’:¿Žú8«�‘™Ùj/¢ªÖn_Ö.O‡øÃ¶‡ÆVùwyT_mÚ`„3êÀ¾©T‚fÚÒêÜ2A<¹®¾!K±Í²Öc°X\~ÝDô‚äùÅ�Ïx2�…&ºœæî&V¹Fq6�,§vÞèks!®FOq‘t °�J«ÆXáx¸MG/@¦gz�ºrÔš{˺3a7cÀ(SMè ûƒ1q šVñËþÓGÓݘïo`ѺÏoT¾ *} ÊA„èĈÓ÷ÕDYÂ;ðfy[Bž2:GLtwnl—è 1Tg?zøÍxæmõÌ“›ìýmÓóK°îµ|Bè7k^Aet^4Á]ƒ!Ô slx�4X¥Ps�´ƒ:š[ŒüûX�5}‡ÌÝ×qñäåzC—ºôæRD2ó§(ALL[3½ÎÉ€¹ZÀ6ƒ<ÐEê7% 5Ê}â'�OË fÊ®¢“8‹§åº&á·:� cð ´•Ë´±gU;¤Zº€ƒÆµd“Ѷ9E`ŸÑÙ¡<ÔØ�,f|úM£¿c¹$rÄ÷ÖlyRÄT÷ÚvǨÌΰ uõ¨šìüuY Ññ\\ûvˆ µÛÆ Jz.›ÍÉQÑvØd ½6Ü ÷lY!,ƒOØ}3 ïi-”ˆвøæ œ¤1üÒ`-è¹Ð�Ôìõéݹi^ZáÜ xp1ǦÀoƒÆæøÔø³�’ZûÖèZ s@o÷‡‡ûoç5ë 7ñ[æ›ØÜþjÈ›Ök‹Ggñ(Yþ-ÅÊw·8–M„¶ƒKêé»þ ˆjL_-o@øNb»W âùî¡Û9¦‘€•;kAÔ-‡ ²º�¨ƒ\¨+Óœašxº‡ƒÃ&ç6×±v7•¬uouK°'s[¼LGÞŒƒ½÷U éœ_�É® :´”Æl•µ¸Á²£MŒ×IÑ»%gœC�s��1~‹±}A¯BíOµ»hã²V4¢¸Æ L Ù<°a^Òô S4¿,Ö ØZ£v5ð¹`.–H�”D�C|�¶ÙȤÕZV¯æ¦,µ%¸ªÁnC#¶«d×2SÉ�²¼&ÍM¥ßYºrú<á•aß$ i�wÏt,öãñåv8€Á`k[”a·Ý f§Ç)¶ì‡Åúól¶zæ9ÜÄ{•…Ø2W÷º²¦,NólÖ+Ëñ.8‡ê‹K†s›L•4em1@ªbÒŽUZ)³¦ÙrsdîZ86A^%éX·;\â· íUÓU”žuö#¡Ùtµé—^íRЋҔw¾t×7jT3°±oCžF•[Bšf{,<­�Ë‘ô4ôø(�[&ë^@á�jgöH9zá½ÿË9y>J�Tâê¥�õósÝlë>J¹Å#�ºóAöãtõH=¡ü0ÛÓ!ób5Û0y“{ôiVÕä´ –”î‹K¾ãj¾ã…,2/–©ã@9ƒi+€ ÁŸ9Ó<XLÌú\ ;Á뎎4` í »bësÐÌíQ|·Ü¹b(´`Q�æÔø85Ï1~RÍÕ•Ï3--Dd7Š—åÜf™Ÿg8|Q%¤¡³­öLêêÀô^wΦœ€¬T]»ÀYêsÔ`´'=C¢g»PðÎÎ�êáD @ÞšØcz´Úî my<–÷‘à¶úW>cJÉ«8e$ÕÞ£"ÕžŽ 0N`8„ ?##^Ï�£­O|›Wºç~�›Ù‹ç¶ñÅÊJâ­p:*Ì…L.Hìílém½0ii›& nlG8:xXó�×táÔ)gÅ"³caŸ.û”ã,�Ü„Q.S¦¶»I.jp|¢'ÖëÀ¸om‡é¯(úÏq…ó^; © ô¹w²öœÒJÈÛ{¼âÙ¶'6˜mÛü‹R“ãEB>r°liÕüc±Ñht†>Õ›ËØU‘›ñxbÞyW+X.l!ÛÒ¡=i]lÉYhÁŽˆY8X�õwУ°' Æõóªr[>²KX:¹B×m¢DC=™â×7–ÞŸŒÅú¹Ó�´ÈYŠ4„8E(12Þnæ;�!ú3ÿÄÈl§Ú+Ãî—EJñ€Œ4„B¶ªñ X:ˆ•Þi"oÍ|êS­¨ñDøGi*í=™«°×§rÅ“ è»Ù¬dñŸØýÓàŠœ¼D‚žw›/kݵì=^{w¾øia YR^G�÷éXQÉcú9¼”J`ø¼³¾ABØû`,4¹óÂ×.Ò*Î×T.3®¤‡¾õó'ZxcäŽ�'w'¾(NBo Œ|Bñ+²N¨<Ù~Z,µµáм0@ˆL\m[ů_z\rþW=¯£ðs…”R#~ñc‘½aA5†@6 ⎂âG 8.àôÔQ g@P!áZ”u°Â¶Éq cø£=66å$šÆvEXkyæSÇm¤³Ú s ÂÔ"yÐn}™Ã¶|mÛ[®1ÇòÒœ]Uv\ö‘!ÆÛÂ1¤Y„’Åëæ"üÎ×ë!ª«W#sŸ¦êUÇ@¥ßÎÀkðcaÌodMÌÓ®ŒÏдšÃ¼`=`çÛ„ÄÙŽ!û¥Ž­%«röæƒ ª?RðjIÔ§º‹a°dwÀíÔ‹¨R‰k®9IøÐ �‡ùÉ,�Ž»ü‡â£ÇŸoÆ=ýºàS»û7~U¥2OJÚ^nÞ^æb�gãêÃJZTÖ$ŒÅX¢Ù0ÌÊïGõý}Ç�oó•'Ñà{Å ú°–ù=îùó/9°÷âÌôp_ŠA‚W¦´Û~N_A!�^*dKé{"�´YE,`ÀÒÁ¨u”6 <}mº�#âR·*êˆ:Üf]n,–=f)y‰Ë¾“: £Åã2;1-žºk€h+@[‡[lå°IhgÉ<à24–¾_³ðOåÀrF}ìyÃìÏ.aóIlþ?™ø˜<úµã®¦ÞýïÐñÐÆNIúk†Ùl—1ÐZ‹r˺„ŸÆìT>—Ã`~¹«àX[±ôÞ%f€î ìñw0_¡€„X£{à^ù‡ >Ú5ô˜®BKîlÞH}ÄÊ$—®ëɸøèY²ÑŸ0lúÝÌè¤)!êW�ľuÌÄïä'ó>5ð¼[‡µ–Þš�]Ö_Ì¥»È%Ãvƒl5ø®…û&â½.VÎÛÆ)3qímSáøõyñõÕá«T·üܶ­ÔÇV#ZŠar/)yËììÒÎ[`Sçÿ=�ÁtÕ«ÄÕ¨nfrM›ƒf¥ƒ™#°¡ÌÄ“�×Ý^@C-„‚a�ž¦"'?8Žq¸D ‡rÊùŒß—ÒUMÂ÷�Ø¥Hê˜WËnH#ÃðÌ}ÊÉ0(†üÖBkï¬Ð<~(„§å!Rº™™–2UïVpéeÅÓ°Ž à�ØT “ M÷-°Ë)éùxÉØ+ߢ:s!*˽sc–0ÕŒši�Á8ë’ÖtjÃãv ààà L·L0^këòtºÛäïmf\LcWa–nl›j*ÎÚÅø:¨õ­´™œ3™ïšUüŠl�*�Oa71MUÞ2Ÿ1EÀˆˆ-©Í¥3 ç±ímM¦+Ek…�=¤Hƒu„g½âF}ʽ´„㦓[%,?¯d�ÕÏë¦õw)|@(YŸ›$C˜M�*PÀF¶lÏ»™š>J(®ÃÀº-ÝÒ¡Ahn — ³e—`»×Sƒ² pξ<}…r¦c0¡pY·íþ¡`ÅöׯSì ³ü7Çiº4°VÐV.;®ÓMÇ6ØÞ�Ü2¡ÃŒEÓï‹Ü— £J MA™É…Ð~ëh<É×n%½¸Àã�¸Îž´V×<”"±X"SbeBø; ìoŸ&uör 3;«{×@œÛ�áUËÌÏ ò‘-óß!8^\ û°²·,]f�еK}{AО§Ïo-ÚŸ?VÇ2çfQn…ˆ0ÒkÈ—�YØE·Ô`ױijQt^ƒ?c¸°[—ŒÇäj…qŽ?-\3!ùê“zìb÷ ÁãX´á5¨aîøù܈&·Œl¿p8¢Ç¿NŠq͸}úÁºS ]Ô±o…sCïLv^ftfo~"Ÿ™¡?¯'›/V-e8 »ü†Ü=Žªvcåï7­LaúÌp¨—z¼¥—‰ñ%¦ÔîS“¦ÁÈé'T£ˆ�ä‚w_ϼÁ�Öˆói/Hsq+ƒrç}¯¥%FÀ z$CYŽ*ºÛA¨í CQûœß&Øã�Æ/>å»n˜¨87ï]8‹5æ­äí¾5´žŽË?5µÅæ)N{;À>!üÛwçð_uÜ8ïµÇòj=Áà[¾ß—§·ç^Akª;ÉvL0}‚]€¤_àîq‹N ÒÛî(ÞØœœ>“ilUÏŽ?`>|ÈÙøY{º‡ RõÎë{àÐr)ùf¸LuEª ŸAó6ƒžªBøîD(¸Ï—ƒÎ-\� v5׫•òØ´Ÿ§y¬Ø‚ö$|Ò“‘îTatT YbÍ�Rr7$}Ñ• }³{ÕÛ¬‡%¤dÌ�MùÚMu ¼˜àBwkìC–ŽŠÓl|΂;›miÀ;σµ”…CÎybä0Dº>½<¦ ,y׸Ë/Ÿlö i™œL^3Ìm›Ï)Îί…n«ß¾·Î/Ÿ«íŽˆ¡C9Õ˜(oL!_òûÁM¸e$ ? »r.š$ý‘~õˆ#°ù áx^\SÂ?­ëå|+†}n µš™wšÔn7Áò¾76¼Ábã9ƒóý§Ã¶›ù›Ã@vÁ†á9Cè )RðÝIùuØ8’‘q;‚Æ`@ÖÏ»Š‹£ƒu* ™¿Ìˆwˆn!.Gbbƒç,Yuù£Wîôû’Áøì¤TK\˜gʶ�õÞ Ýs–�‰w`Ê1AECù¼’Í€"é| stA–kat >@-Ð_Ú@Iùã�>ÚoßYñ)™l^ó £‡²‹aNáa¼N'·ú³›ˆ)¶Êü\½AÝùh�Ft¥eÎò“¿VïÞˆ�ÁÆYç×îï…:«µÉÞü`úZ­åA°TÛÎéfÔeqá3Hü¼nmä™ï3eÆžr‹¥0;XÊOˆ·eTÁ@<½¹�2°ãB³+½ðhAÎSx÷§nšÐÔý|—?,Se÷eG2–3tÇšÏuuáÕëÕ÷Êš(ÙöêÙõ_*ý.q7att²/¢:€`3½[EÂi«|M)lS›ËÇX±Pn„q ^¾÷ÒÅZå×{Ñ?£¹÷¼Œ¦Ã3ÐÎ.ê�sÇW �_äqj›\æ‚óg0cMîÍ•÷¹ßjÙ;mÑÂ+vxàYW�%Þ#õmŠ‘TÔqÍö@Ü-N«6ó.åú¡gôäBWܸxÞxÎŒ ÙGCĆ1µ9oÙöÛdÖÕPa¬Å­!pĉñgäõ¹(�"=½×‹í¶e?‘ÓÖA[Vî´š. ¾H¶ž�øé°ÓÐÜÔð÷ü‚M9ôz÷’“É u�»b¨ýÙãHsÛÕÈÁ«wRׂ°SÇÝc�V–\ ýE�=«o®’1Ÿ×oy‹¹`jk •ó‚nGÕ~+¶`‰Rq}«$Erg*i6Aµï:y¬¡Q»•¯†X·/®»ÕÔvÖJ/Yö*/²~wë•>;ø¾|-5úĵÀ‚ØX¼¬¾4�× K‘ò\¦o lo«.,J; µ¦Ùö!ÚC‡•4Ù«EÛåë+)¶Áí~¿ (œ/"Ú ™tlïyaÔVõc§´ÑKŽ†Ù„ºhÝ’N=‘4P’|úÎ…ï­:¸SÎ,¸z¹«ºrä +±!,I1ä½—I³Õ� °#܆.sW‹yÞÖ®üÝlE˜ƒgBzy’Ù_BSÑ»¿³lZq€.�ª-Îe:Ü¿4™¤¹$Î÷nm`>~ƒó{îÌÈX0UŠ>÷Ø‘¼›i™‰°.¹–ËyðZÄö!g-ºßo‡8LŸ­ãÇD¹úË*w§„gWôV‰!Ï" n‚ÃHˆ}nè˜kñ¸!=°3NkHö;¡¢µæ�æ¿. 0¸T5 uzw-ãiÒÎáŽ�ø€¬S pW‰ªÆ5ž3ÒÄ×¾Vþ\¹“âþ-�‚3'X7Àr_~âã§aLÚr ¾Áð`0+0¨·5†½ÁýU×½ˆ4uõ‡ü<­¹Êa#ùšED¿…ï˜AôÓ€Ÿ†¡D±ö±zïÇà¾îõWëÞ•OŸ¨"ä Ö/…D»Z6€`±•„P”5ŽæšÁÂäJ�–€Ñq_ň3ê<Ž®aÆðïá3)Vw‚¥í•‰±`;&0‡ðåHdªÍcNãR Äâú[ìôG#ÔàTVήó)(q«àõ—zØïQó™fr÷V\áèE™ežà…؆섲·øÎåuï0}À-’s»g‹Eë>&Ù¸’G³ávõë‚íº3±t´½ÑÆ‚ ÏMb7Þþ”-{p�«$Wy¸@Löì=·kïDçšI[üüƹÈQ«n.à™ÅÜB™6QÅœ«%Ç'Àö¤Ã–�e,ÝÂõYªñUÎuq—9£›IMkeg0TÐRψž¯¢z®¶ì 9÷|®Üœ�íî[C_=ëTÚïãk  ¬WV«g´5°Ç·í�S‹ÆÚÉÃ^mûmGuäh5?µ¨È×È,ƒSÜzúž/²“Aãwí 5»ÝñóßW.�Ë´ENnNÀ|/¶ß©Ø*{³vܱ¼òL8ãòò‡ ‚êË­7�­ÿE8ÉSÚ¼T’;J$•E¸«ºêG—t€l•¶*½¸/«s•‰!;¿±ÇÏLNgúg/f@Žg½yš¾¯�gAc€`ó;üáxX¯¹MÞ8ƒ¢˜�!†…艗-’6Yë—$/.Ä2‰=“5~Ž9X0NÑH¾…�äÐU<¼l$0Ò �×çVœ¿ÊV¸X•Úà™°¿ˆ¼>^‚ï¾³Ôe­bÙ“÷ZÇÑphpl‚Æè�;­xVúÿv” `÷#RÎ,>{tú:ôáÙ{9”5øÖ™Ž ¤ àÄF=¸¤ èž@xv|&/4¡Jc“jÂÖ}T00:ÐUžåµ§˜׋”Ûè½÷4�B.–¨È‡?|t?­ldPÆÁ0c°)½&+Í¡¦Hâ>¬ºËR-Ûê“:t¡YúºŸÒ#ãÂ0.NSšÀsµò¯Ü¥ä$¾{XÈÏo%�à»9å(7~ʆ¡P¦4z¹)_„þïD™ Õsh±tœõð† °Ôuݬ|”¼�y�ãÜäÚGÙ¬â;ì†Ã“¤èUƒ¾û5†blšAÃ¥ëîÁ“¾¶v6Τ³e ±k0â¦skЏµ>LÕjí§p~×ÌñWÐô0ÿ{6–�óiaÍ€h”Wïô€,Ð[#À�(ÍϦ=ælH‘ÈÊ=Q‡r†"á²1.n–9CªÅ:Xh¡Î\´áe¡7s&[ãP˜�ÊâVÆoƒ¾o'ƒ „ou=Ç]>Ü-Ž|ÉJÞÅæñ\ûE,ºˆxŠ™]VÀ'[�Ò• æÙ«<{¿}Ùë‡#?˜ÀÁê÷ÈŠÜ7•ÉáÁAÚ£f‰Lã;±Î'mé¨À[…ÆmððÛ¸X”lØVSÕØúQ0(å*ðéf=鶪ÞÐsè–9·¡Ì§Æqä­UI‹§‡O¾cΨ°BrR½gc¯$rÖhä…µr7ÀÒ€ý¦Mi¯ö>lŸ¹Í_a¦©>UOUÞ¬!ò1y)µœé¯v:ÄM«Åû†gãþ+uÞBhn«iVïseK_‚NΪw@˜µP¿5´çÜ÷Cãûì×YæÍV+9ß_l<6‚0U~¢ÄX·rdÈ\@å«sfdm[4)Q•EÃñŽÖ榳œ âÛ"²êènDz=h§o­œ¬Ô+…lÔ@ÔÀ>!ᕊ ·å�®Å¸DÛÁ’*iLø{¶o�½Ì…)yZ:ÌïœÕdÈòæ=T¾Šß¦Ïaó‚%- œ‘Œ³XÌ ¡‚rK#›‘¢ŽéÑ¿?.×%v›Í:Š2 ¾‹_¿˜"êO­8ê¬ï2äüÄé1ëÉu°ºŽ�[MQÇm~nZV#ï‹“ÇqØÖ\!pPÖ7øhæ¿dĹ—׺;9W¯z&ÒŸ|Ä…Ü—‹‚±K+X�Åö¾Ø,¥ò%´ÿÕŠ¡7¼!g‚ÞÀø(ù5Ì_1®º‰¾tži?” ÄHÊ›éâß��åã7²-bIhD†4TM­-�R?¯ßRìv/¬i•l¢¡ë’àÒH…k®¤¹x ®îlšj ôÄsuÊ�AnúùA¡&hm)v0ì¥æÜ¡.$/úK×s öÚ-YÞ@Â\¯`È?iú8ß^†-a�­¯kÃRá;·3—Ì9Åxý�%Ùv„ÍÄHµ%±€tZ�7±<9 ‚¥øj�9Öu÷ZW•ñƒ-z@®Ê)êàÈ—Rx³–X&åèÊFpAlÜ”t<>Ü)C˜÷÷8ÏÚ�y Å*k•ç±ôN°ý÷Ûm@|z.9yÞ%o}\õòXY¥ÐEÊ(5¬Uâd7hÆÆK8ŠH|JëÓkmÁˆC•PÝV…s;‡a^α,¶a¡{W Ë;Û%Ú=hk;ø>×Ö‡ß�C�a’E©„­l� )ß7Ð^€�.òòwK°ú™¿µ^Ãk|f¹uu�ÞAî¶ñÏžÖ ²Pz]ÃùlÀìÆ`A0Þ³™ c=>X 9ÇÛ1–uŽh#7LFƪ?8Üð9Øwì@vÛÁ™½WËI¥$\¹³‚ƒ8ï ‚4¸¬ƒh+'(ëxà}Úp¶‚"f”žûÌ#V¶QÒøšBÎFÁÕ¤¹ìÐnâ¬9Q]íL¶+œÜ%Â×äø_cAD²õŠú¹i¤‚`h_-Ý‘¹Ó-Òü xí³d®nè˜k(øœ@ØÝ4 ¨±6<l®/ž1î m*»^]Å¢Î*À¥´ml7V7Ä6[ Õ �ö縗Ėr\UË2?('Џ}ª°|X÷EXÞcL.¸±û˜ýÕ5áýïùpY×ÔÃÅú{Áo5÷Rb/j†C;ùl2ÀћΤKºá:�Çû_R¸$±è}P÷Cœg6$Ü7³„»1àAP5HãxCR`ÃÍî ‡Æ2oà˜æÀmµ=pÉPG"bœA¦bå!ª ¤™rqi¤×5½.#sËTiwW›tå^nŸj謦0/îÖ)ó^šlEC‘‘¤ú¨7_XÔ4ŠÏëTe; ;)à1ŠÏÓ»,E�ë-ÉBÿ|ÆÉs)8ÎòXÀ³q÷V°s‹Ý*_œ³Í«âè³RÑ»#ï¹Ü0ªPfÄÊ6ƒŒäÖ/%×y„¬¨M€Hþ]ó§ëñ¨æÐ¤Œƒü«Ï5ÙØªâ�óh]ãƒ\ª2°RJGUæo›*Z„,V�änç×è÷½«ï’øÎ?-‹Rú„x\”“¡„eåª2yb ^B-°öS½é„P”ŒuZ9ÐÌ%�ëbp£Œ oÎŒ;ó!¡¼[Œ¨rŒR�í(JìœùYlˆo•Û5×EÈáæÇ ‡ Ö i7ºZýÞÛ“G( èÆ[8Æ¥±ïrúSW<ÈÆdùãÿ ‹òk–˜ï‰}y R,—âõì xâ§â{µY÷óQdóO!{Ëœ§�þ›qò�¶ß¸`¶ªÃJ¬SZ͵^@ÜÊîz;˜8M=ÇÕÔâæ‹Њ ÎÞh‘KÚ¶4å­ñ ·™T�³ÃÞBé`\Ã3M©• =ǬƱôç©às5U8ë3…®dë¦nôUakÃe4@ÚŒy¤AÆw°>Tl•Ô9†£ÄÃYt9È«xÃr¹ªF`D'uu«6ØêמS²_…|·EŽÝª+ÃqCÊUÛ‰Ö±~ÎÔ&1„ŒõØÊ‰ÎNò×ÕÇ!b"üb¦îÏ?¶ùžƒH ­XÚ /À+Ì&.-‡q§R¹¦È5x+µÁ¦\žo6rÓsÃÂßR0‹×°¡ o·½lù¨ân¹µJà<äÔa’wá3µ32ƈž!V±D!„kš†Ùô'hß uªç2ˆ‘)\¹à"ˆbm¤bL³µ››=,DZV³F��Äå]‡C’ÖC*ú”ø4“…7�\óxÆèÀ¯†Å§‰ÀŒ�­Ø-k“›¾C?nlI–¬&Ôp –çt€¸Û R”+÷˜Òà¡9¶ù%£F}û&m ‹öK ÷5›%ÞÖ \ -H݇Øâ3¹8ê¾à!pÐ3U´Ñý`PPR†ÍZ׫ç 4ä?ò$K¯í¹zÚÆ 2cv9oQâ�¯5ÈfœÇ E•/ÌTÉ-¤²T¡‚ðNººWµÏÌoeT ´ÕÆÖs«Ç¾È¸„ùlÛ4ò5üˆêKc€Ì‹c:æÚPsË…¾ Í´î·°1‰i†= .-™½ ÜŽDÇ7)šÇžÛZ�'ÀMÜíÅÐî%�Æ¿Ù+–ý¿Ë™oªñ Zºr[¬ϱ»Ö«0;}�o‡SÆë;[YØÛ˜ô5OÆ’WŒß7Ð4ξÁí�£SŽ�]ÐÍ__]›%ö}x˜Ô®ós°(�àÑ ,«aƒn>•v¿³ëçðΙœ%ØÞ¾;_Š Å.—[lXÅÏ-…Â׸¡bÇG€ÖÒjoä(z…îëò¾öÇùÓ’u Ùíµ¨jb4B•µžî‡·ênm@4p¾„€U‰4è!Ÿ•ôݦ‘ñvô¤üÑÿ. (µr¡A€ØÆ!‡ Ú@]Y) [±!ƒI!SÛÝ2D Ô¿9‹ZR gͯ µVÞ'�á�[.†E´n`:ý˜¸`¨#_—­ƒûø˜VЉ£ú]w¯‹EΑ[çz†äÅ/¯©–àÝ÷ÝWm�â¾ à„HG�âéë|ؤ¼—vg9«´o�›ÀcŽÚɤ÷v„ !ÕðnƒÙLÉ�×i:”~K<¯×¹´¯¥›Š®6�}´årdZä2(k+èPö{•ô¨�çNÁ‘C“Êÿ½œœ –qº_µ@ýÞ°’ Ź^´½žzšÂ.�J­ÐDµÃv{Ú-U…8ß7MA—ïxÏbß–x¨_:êïú˜Ùê¶.Ÿeóo”U 3‰Xë€ð�ew3"Œ+"N%ðå‚ñÅ!ËÜpÀmþx `­Äè(œörÏ®³§¬yæpJºµ·q}Ó‘Ì�¸?œ5°EÈ*•”Wi§ÊÐ;S…šš.GYFp$¸™bÎÓ½;>§Ý±ùó!m¿¯8€ô8»g4K_ã[‡lVµú‹|€ó-Ü�jCª¯ëóÔ?|ÛeèF¯€”ÓFh?o.T�Á,tï~q»n�‡²×µÅ—…êK¼ ËcH8Îeš^¹bypQ‡À6ü¥%/��âŽm=;å¬ëÄ;ü_9F'î°g÷ŠÀ!%Üœ ÃÈ–¹adLt½.FæwìÈôO£@GN°ý€yÛ�gÇ(D^EßD±`°w×`Áº%ãµÄl;Å;Ýmë¢rÉö׿À›¯¡µqØmºº³�áÖÜ"“·ÅŒ�ÅAMêkª{ ôêzÐ3—~˜Õ/Cp³¸ÅsîÒŒŸˆ7Mõ!ÕÂ�¦yÑ&1^žY©v4´`C Ù³m(¾…2£P Ç{,É5šDUJ3II ùgŽVmö}áÕaŸö±];õüŒ÷$¢XÙò«öüãpÝøÀëq�ŒZÅŽLÛu%Òg™Ÿ=­|}ê(cæ_§½Þq�Ú5S#ΰøÒ�¾yÁU¢F‚‡Ãñ }T{6ŸrþµŸu’ò1žì´lû\Âý 0lf;}âlÏT« –‹Ñš‡­Ÿ=ßÒe 8^3 dI,H€¡ËÎŽöÏ„9§‘7B{ž0ƒaüÆê «-…fÔ<åfñô€à–Ë-enÜ¿ Yƒàö¨g0 @A}�}X­ð'Ù…8'„£Š€–é÷;�xÏx"a÷-pÙ†ú ²t”è’- ÛÙ‰of¸IÈߺ¶hg™’Ÿ|ÄRØOÏ7½ëN ó º�ÌÁö,±‘�rI÷sêPmq�óX&®ªUa]oSb§ïa˜,Ö­K³�Œû®ë¦ì‚™ïJ�„ÒìøE’©âÃv;°r¨Í 7�X{L3½¯šœ?U�rÀ¸‘ÃE!®%ÇèÉïàÙÕ CÆtÍÆ^È7ÙYBÔ‘÷•n㔋1hC¾¾8~„ùiE³fÊ0Ìÿ"£~*°«‰„–ظ+÷¾Dй�ûÌ@‡ÐÕíYå6&æ{h�k™-t"ð¸ß¡og$›:Q<&ˆé|«k‚ZÕþÐE³Ñé¸Ô‹§›R†ó6þu/wÈü˜åª8ªP•[ùcï¡C]j©˜" ÞÓ™}ã¹ÁÝ^ÙŸ›¦TIÆòWG½zÁ’�j‚è5ïÐïÆ*ס¯ß,?ìžJ‹ªÇ †C±^=—ë�b7ì—!¾ã�ùÀôYI–´#­ˆçO•«›ºÜ öÑà/Ô xé,ÛJø¶;¸Æ¤Dÿ:ü3Lb� òæÆõÑ,Ö< þcÁ‘ÌÐéóªÝ@eóïæËµvpNý…e1ÆîÚá‹nÅ‘æB|ß@ˆ)  s½ûÑŒße,Ö�Ŷ•]Ӻ«·Ò¾b]è²›a©IÂé¡H§#)¢�¼h¬.Ï+’1S¤tiÇ0�,$Vî¶ý1­ôòGP¥ðŽ}5h»� hpbDâ‰ÇØÚ±82Üù´ú3QÅÎ=‚p™H5… Îw$+ÒçWÇCxˆÖŽ ºÅ†Jn«³™¥ß�‰ú—E´í¹¨SS€ãG9#1¾-ÓVvÙôÆæŠú^VÁ-ì+w‹uw,cdu‘2ªm�RÍ~^�û`ÿ�RÏœ¨„åÚ‹X[>,cš,» 4ˆ[zŠD4}|–¸)ù‹³KYvÕÿ¶y¬ŠK~¥Y¬û;~ÇÛ¼Î�C°”ÈÀÙ,Ì�˜¥Æi$l?kí�cú`Ö èðDvù<“‘hLD'£öðÛ’ÑU`õéæ° xyƒ§nê͹PÉyø|›xi�]o¢Ú÷e³Ñ9 kèE žàkû»¤õ>…ÈÂC¢âùÏ]¶ãqHï�íCó(àÛœKsuËŽ}ü¡(¶Õ÷æiøÏÃ^ùÀ‰©®–F$¼ná¶±7†"ÅÕÅÌÁ¾È>1Ä[Lª¨nI�ŸõK±Y„ ºÉÄ_‘ÖKwû±¾toáŒÛVÍẳ֓|\;õ¯§BL�”¶þ‹ÀN©vE䎉1 „síF×lP ½¤•¨â”nWêÆí¨î3¢8Ö¥ ¶1޵�SÙõ/œ F267x¼ù�üOÆ@cøÌÐÅ¡»/Ãýá×X.zsÍœ„ßÌÍ�ɵAÅE“ûàòaq ç„Afió¤ÌS‰s·züÿ%…w AlØÅèbÃ'x5M+=Ÿ¬!ÆÂû’ªá`Æ2Y2P(C³J-|È�îëšQ±bÆ XVÖØEo‰ö§í©ó–XB0Ï=¨@{•¡÷XÀ_Ý^&¤`žˆâ?8p4 �¬âFhÎö.’‡e ©i" ñšÚߎS{ê¶çZåÛgÑ‹qÍLFÚW¬ ž@“ R8ãé¼8NWî°ŒŽcVÍ_$Ÿ†¨9_*«ÎL·é4q:{nw.€Ô B&ZF»â‚£)«=¹LñÜ¡vOcaæ¡w8^%â”Â9ašm«÷ Äa68Ä;Âpà ^2—ÁY]OgsAšœùlÐM‰ÓÈã<#¼epÀdê™�°0·'‘4+JImC1¢:·¯OúûIœ{� Nái›:ªòÃÚ?Ú0žÝ÷Ÿx1™•§A}ZtÜ)�˜îó8^Ž‚Ÿ¤/}ék]®r°ê¢JÁ HwB©¡-­xç+8$üácÂd«:o2õÜ ¶ëäÈYBѽ`ƒc}y¦æ£HI _�Cز)T�-­½^~Äܵ¦ŽóÕÎÁ'•aŒ…]ñ8̇5Ìv+ôØy `g³«Q‰·È ¶äR”ÁŒa[)KùL¬J®Ìg¡Å|]#ðâ<3Ò—BÞµ€q�Àåä”Ç!`Î ®2É€Tˆn¼ 2�g¿%¾]V‰Ž×5ײ?96µ ¤m÷un ÃæªL�´ìÿl )µ Åȼ{}šãÉϧ³®•¬\)KÈh4衎2nów;0»q¢è\Úf3òž¥ÔmC€äpÎåÎÚÏ:BA�¢î¦l;€’¬š Ûj8Š›Î©N5MHöŒ]„Ùä7žÑ¥ÊøÓZx*^¬,ç cÔÀ/AhG—áÖIR™ŒLÏ :{w1-�™MÍxdÅZÄcÛIµãô;×ç,Z˜ ­ˆ ¯TÛX¼Þ÷Õ@ø!Ç›ð Ã6IŠlòa­›ñ•uuÒñ×oÙ<Tž—6œê¿¹H,³el÷�å·!„û´Á×F=€·œ†ÌN¢3“Ø7М�{HÇ+Ûï{¿UP‚&Ö[hβ½æà„_¢­Áû2ùvìÈbGwlï(Zsï@Ó¬̆¬ÎÍPé$­®['“lö윷@äÇjˆÏaÚÆ›œa·uK¶»ºMu'¦DÜñàb-Xþ‹Ü)¾’ÞU ”-²lm˜uï¤Î9«u—ŠJÔÂ0`ƒf ¿ h0]ÐU^†›\.¢O²"�‚úT7=âï#ói$,aÕÐì„4»ú½Ì,èœ2uø—ÞOuoŠ`s·b�dˆIõ�kŽ“ÍQ‚Æ/PSHWûíUòfû@Û²{šÛ°Y±<¡§ÌdÕ¡Ïn!iK §�ÀÕG~ÖÝ™“„¨º ¸Í·Ž¯5‡LÛ�­ay­álµ´1�ZÉ«wO�‹ÞgLp0¦òáíÄQ¼Ñ—E=ÖîÔk·«ñ‹™µþ ´d+â©7.#ÔqÂX>Kw’Cj\û£ø2>t��ê†È™~Mæ÷ìà·è•gÈoÃë…nÉïÅ�Ÿ© øÔ!m›²Ü<13h3¯_e>ªÓ�×Ý@“½º‚¯ºµMW®Ïbôvi—=%Ó1/¯Áܤs²z¢ü¸Ÿ €Íì�¹ÇLª¿Å9º�V$y0:~ °ìª�údÇ•‰ŸÞð1¿¨!JÓ6A¯aS¼çÍ\ÑøÞ§™û¥´Я£ùƒ†‚lß#εð d²±s5ÈÙ–÷Ã�\ôÈßè'Î+,l6nÕ�Võ.XÈ߆v{O´M8åE ¬•§�@ caö�n…x!Qëu—gnF#ócwaP\ÍzæeÛ¡žƒ>Õùñ,pÈç' øwÌfÕÄpžÔÛ?)ª±9˜ÚÄ"치• ùŸÙqq@ûë=±½Rwø—ÛɲŸq¬§˜¼®R´ ¸¹ý¥_Œ‚á˜�[¦öŃk óé™÷ŽABÌaWo‰±¬>X=os Xµžt}{Î;·JÔíÆkP dÆÊÜ%Xø´¡†ÈèsмÀz:U;Lòÿ¼ìCŠidÍIo�)©ìì\ÆŽÁÄŒ��×{¯æþt¸âˆ·’=øp 2,AžÚŠ">tK´rw@úqÊR”ï}rúÅù¼Ï¥:97Œ8õJáÙ1 v02’sÏÂÎáš¹¿sDkŠÕCûee³Î!�"ˆ½Tmˆ@Hx9¬óoh-¶T  Iä$� ðl6‘±×ºU¨Ø%î1W²bSÑ�çä½FãÛÿiè_¢ýZp}TÄ< *5à‚ª öžŸYläÀ‡�uä 뽫ëE’-[¼æ2FŽ}åjø¯çÕLo‹Y»dBÀg4äûf? 0D0fö†´ŸÔßvó&B¿Ï‹lª)«Ÿ¨ž�^h0=õÄ àkz6}cyb{ÚæËŒ A\�ðÚÃC9û½4üÛ½b:iõòËr 4Ô(7ÁÀQÄzåM"¯ Lsx n>•´H@h=ó`uÆ?²wV™]CŸ7óï5X,ý~ `. ªfÖ-" Àôñ®‰Ñ ò™k�MpK�¼‚hè†"„0N*·ùþûÑæ#_Xaòà ÓÕ¹ÄòÞ7ÁÜô²OÉ}º‡##¹%ôV²Æá»ÛïÊ�GCz¼vn›7›È‚ç6ðÌHá¬~ÞZé@`¯ñf¤C a±‹�ƒ²rwáLuf´?çœytÝßE¼ôvHÃ�-œx·9a̋߹ÙLX·jªòé“éÝÒÔâãuq•?¥»³ZÐÓ;pmŠõ¬wLï7°$G”®¿Gz@×néz!0îHóQ>Îjÿr*ödøþk‚.pæ·yû=FgXM¾òË3ÚŒ¦ÈþK-›”xv-iê/Ö|ÆMÎü5 ®BK !Ïm˜Ní¿r¿nƒðD ó½±½]è:†3Å) ž£03Ú óÑÍ�Ô1ÛÙ®9Mþ)XÅ0{@J!uÙOo"üœhMH0ò ~õîòß’ŒÐ|^@+.³Ü°.›_föâÅfUk ¤!ª«•@p[a}ºk¥½X¹ÈÔ8Ý�ÀÙø¥&“½\hËàÕ®U;%X*‘«'£; P]rÖÛ£7Ú.¯m­ÎB �‘6ŽËSJWmÍñ˜MûU•µuލÌÊÆñ\»�ý—ôٹɶÇoå^NƯDÉÏ”×Ä´«Ë°}Ù0œ¥…!{…äðë6Ò‚|Ï/´o å›QŽ”œž÷ =Ü´÷ÚΗ£[Æ¡ŠjA%s\†´wyñ(²í²•k¼„ë—>èÉ�:þÇß}€—߯à&6n‰íé“ æz¾,Ž–¹J{@`Œu=ª¾Ýaí‹ßìl7ðÅ17/'.@ó:C> dŸ8l›„&˜ò4Šš ZÒºŽ²'œPµ­¬ïzjöŠË=é¾9¢\ÕAæ&ÜŒáR89@³ªÒÄx÷‹ð¨¯31žh.ô™ó¼'.޽bîdøŸë`òAÙé˜À‹Œa3¾��Öö‘ò©XKS:"#×m~#5¡’‡eD2£ìTì¿æíœí°äƒôŽÝ/ÅÙGÄÆM\Y<ÆZQêš‚€8C²ªÏŠ_âûJÙb¶éêüË0Ú/+ž”a縈ñÊmž+8xo‰=—MRú+¸溅×5˜Î+µá×Jÿn<› ÙW4OÒrΊ@òûLH{}�Élvt]o`7˜ öìÝ'áúÒÐÀið'nà ÜëJT.�Î5c5²æ·»·Ì—6�´ÆhcqŒ—¸ú¸Ðé'Yd«|åÈ ³nMÄLK2sp«S@¢µªIŽ�Mæ<¥$yˆ¬•¹æ3˹l–5œ‘àdNÒÅÍœU´É¤&�é„vVÐ0s[I»+²ê” Ó`¡U?Y>€ÞÖí7Î�2Wz~ð—r™‚‹‡™‡p¯¨­àv!g!Ömô¶À¥¥ÊSº¯Á¬tT☃ûìÞØ©.CÑŽ€¸pd¤Ëïaº|9ëOâ¦;Ý˶DÔ Î]aüÀÞÍÓnE¦â\<…D”kƒƒS_eélöfKepÏ÷29õÃ{a0ˆüì^Àud�µ#wd¾5h–åOœ °ƒe0)9IÇÑ?‹—v;œñ²Ê†wôìú8�+.É›¬gÎ{á”yÛ]J 9BÅ”…eNåÆMWtàÀ'.dÓeÀž§Ø.X˜³W@f¬šV%]ÙE6&ÉÀŒA‘±ï¼Œi™\ Á.ä¥gá°1ðrjK‡Ï¯4 lqÐÒÒh!µt¸‰,9Õ¦†ú!�Ù]ÕŃãÒ>7ÅuØz÷VÚáÄ­/QŒ×Åí½žäM¡GÆøÙÀ|öå㺧~•^Ï—ÍÜ',cö—ép5@S÷NlLå€=ŠDãçʬY¾Ôd–½èzÍöí�§Êñ�u6G)`±PboúØz~:ü‡—LZpv’ÖTÀ�¦V’ɜݟ6y †r- ˜2s¸AØeƒL\@cö6‰ú½rÆøeÛYµß.«W@ù9ÛenÃz×—Ù•ˆ-yÔ >^=S4ýb‚£ÌôRħÁ‰[I÷C("<;ÑcŒþF@5³c‡QÕ©qÒ´_…}VnÎQGµáð/v¶³Üî/@QS¾Xn¶OÊb#°ãrO„3Ø–¯¡^öml)Ö�„æ@‡\¿áI�€ÀpC]eÜ»cüþ]KF†,(Ø„üÖ9ü¯ƒº€â "ÔÏr.äÜó|6†á߇ËíÞËâ È%:Ÿ,D½koy”�‹:Æ�U·úvn4 }íÛN•–ìâŒw`€¥8;2κÚÌ9ÛáæWxW>ܤ…£ÀÏ¢ÖZÁ]`ÄLΧvœxÁºù©½LƒfeK¤FûÞBOR¶)·BÚ#›K›­okV°ì°¢ž#e¸™£rÂÔCz¾lía!nbGˆ»év[`p¶toPVk\Rƒ”QÀ¿¯#`‚¶¥Ô�Í–«! h¡´öÍêÂj_Už}:§¡>hk¤IŠü镹n/šHѵ_G{VHÒÀò� /–Vi`{­N×4ƒµ¿`2'£¨œRîôÛEÞ(ê*T2¥BjyÐï³ÖÝFª/¤'3[ˆôø\6­vˆ°à¶lš†K¹®‘„æ„$IdänÎ_¬:štßä ��»þ‹QÚÒ¥f'«3(ÚTÐö—=`TÌJk뵤·5²³Ü¯ÒÕ’èËRc½äX…{A¡+ž‘lš|E÷¤êËå�ä� n“ºÝ¨ob ÖXšƒ$Õ½se¦JÝô eK=ú~uðöK¯ì`ÿ&zŠØÎù6ˆ¬ÂõÅá²B^p'«ý½$Ú⺼í`1ëäæî˜$vÖº÷Ps×G7DŽ’x®~ÆØÍMÃÓ¤¾*À«‹‡’)álŠx¶¬©[žò:º´S9YƒoÕÚˆa©z ã9PŒo¹-dC5ǹ®Í�J6n1Bì™"†U…D׌ð9ñÕ|vtC»š1ñï«P®Mw  ¢dî·A�Óiqøà˜*ES "B�qí•g-¨§”›¼_b"”Â+Ö9Ëk:ö›Ì¶ÑH‰€Èà³M¤Q1™ÍYønÚi=›Ëã@lËmÀ+Ù¡a z·ÍëP¢Œ%‹hø½µgxæA&¹xl²� N.¨l‡Dë¯ 0Uï¡I“ì>$Æ 0&æ|‹7ddêÞbŽG‡!�z/Y1WœíEi}‰!NúŽÑxïDCëf0FU)P᥃Â�èOÇÜÎ/bq|9мâ륞µ=(ï²c©ªœ°’“¯îqðwݤqažÝ²–e5ÏWDL�“§]Ytñ8° és Þ®9ºó\Ø•z|H�‹ÿ%)J/@ ñônÆŽd›ö°Óñ×�rS=·Ð5U¤Íg6PUl2…“¸‡a(ÖÔ°YWLX…oc+B�>Ì!º/f1 pÙc!Rßøÿ XDÕÙðà²ŽÄØ‰[­Ý![‘åAæG M}ì fáÊ6Pv2W%¥†~áhA ؃d‘ˆˆ!ÿ6Jù‘�ÂÎ*e pÌ×o»ñd¤‡çy¾'­°o‰¦»µ =}¨xCw¡IÖæ› ��7nò—Y?õ8ª™ÖÁº¹Í§Z-š‘é{OAXûµŽÚ tUl? ´2 Ÿ=nG'£ëý>îï ˆ}çÊënEñ5÷eO8Êü΢Ä﬘2àÌí‘7«�žf•ïmv ðvÁýâ PÅÓŠ‘{ƒ'–ºM·í6¦W¯Š�ø ôPæ­5õfúïô ö)Z~Û;!b¥'ÚéÖð¤ ÊŸ—­’}vÚ¾¯&£¬á«�Ã#\ØA£¡íÃöæ£éMëe.½–¨[\à,–3úû€õè´ß³9ßBœoˆ“Ó@/=w¶oåò­^ág*p‘ºETû»l_ }4Û-D\¦Ðaô@°6:æ¶Ÿ¯Â9´¦ ñ…=—AÛC¼uµxU7Êüž~ð‘¯ÂCÕ÷a̳"j»Éý¶ÅÇìbW½¿ÜòmÃ^æðþ~ó!Ö82d)TxPûÑb�èé™ÃÏŽ|îŽO°ÅÏõðJ5\­‡H2pÙR1Èd\"%ñ‚ŸÝiO¶_¸‰ÅÇ«õüoc=´¿~iê¨ÞŠÔœ7+ʆF\CbT~îrÖ>[aºþVÃøÌ÷²xô†{¢kÜäÄ¡Ž÷ ²C!¨”\5Ø¢Vôø}9óø4Æ¢±{\æ¸>ª ê9¬ŸæCLÓŒá�3�©‚Dçp–�Lïît¤˜>Í:òêf£MÓ±Æ4joFwÇ,“ÏHs/»Îô �Ħ6`z{ã´ñ2ÉxWY³­ùö-gÊä Öb b†Xøh–¹ó–VLnÎ…g=ºvæ’ÃmÁ>.œ·ß›ÙÊYWGQ qœ2ÍúF>l¶ Üí‘4‡ìèÆ|¿¼c¹T|�( l#×ݺO3°ÇÚx8¢aîjM̾Œ{çM³žcœáÖU“Ûc<—ˆá3+¯í8SB,³zc½®VÆÚoæ,Æv ǓңU¿J2�…—P™ÔgSøî {¬‰ÂSÉ$œc´–É*E‡3÷#¢›[>ÑýùŒ5ÝõÛ%»rË×·Kh¸(F� Ðd¢ædN¼„³A†[¤ 9¦áëÙŠoy/˜¸=ÔõÞmUrsç?Uj»,œÞŠ‘»öm†n9O94!òÀž¡ð”û)>ÎÓíC,ã+ržúðã�üÀ¤3òh(ƒæ”÷3Ü5B¿üêÞBígÚAm¤ .»Ù Ʀ—~e¼ìÎé:äAôÀ¾râWÎzL¯'”ç¼|iØ9pŸ¡�n—|ýÏ�1¥·Ù§‡PòåG}J0á,¸€Úzö²Ø¸AÝŠØGõaa㘠!oÝš›m"²�e¬ÞlÃ6°näÓp ,¹…³PF ô¡TZ"…±6bÍÌzut~ülãüAΪîaþNÑŽd‡@NXB�¸æ´,ȼVŒ~BÆó;ð¿–Œ�úQ~ØÆ- W¼¶ZìcËmô¿mÿ°GŒ4ÕÆá&v8ÆÇ©:W 8!ª¬?³¾š�­kñ„é¯,u1:ñ9+»‚ƒhÉN˜F›`")¦��–û–M—-aQ¼à7Ç+‚�çñ„a�‹Ô ùa¨)ÉòKl6ÈŒd®v„¨ú6—°D6ùk£|ˆ û¾‘k ë<Ìá.î%ÏÐó¬É3]7¦—Î&¦mUí˜2a—Sɰnkx 0Ð1óE,¡V‹s|ÈNCë0å*¤ŽRv©!w(º¡ˆ bo×YA•å žù¤hü“»õ—¼PæF.â'§»ÝQmõåÞɦd¦ç�ØSŸ ÜXm†+ Ô+7Þ.íø_˜‡Ë…è‚÷®oõù¨±šé…·Nb8ñlyÐx­ª^­³–¬‚k>ŽÑ)ˆ�²ñ5ÄmÇË­ÃŽð*îŒ,‡9ê¼mÒžc¢€_h•!×x˜+­c#õ­kõ—?.Þ¾*«^S·ågÅàrö0´ü‚vK–³¾5Á_!R-ðe~¾ŸOí1zÒÔ8Æå×óÈÇ/Xxæ§%mدàœBO%ÖîmÈᎵZÛ+tŸmp~VÇöÕ%SÍqpópÀahÇÉÈ®PÒ0?”¯ß£,Á|l»´|½×Õ¹ýmmŽ»} ðÞûÄË5»xìN£¬äxëÜUUÍ�é›è°9NZ–=ÓfX§ H)Š(1¾»Ž÷W“Ç;}°qW´ê ߟï®w‡½dñÙÉ v:¿/«±V@ƒÉbw·+_‡,]lÙT(©{Ù¢kŽ7´HŠ[Æç*•®™Æâ²GÕ¿1!âX £°04ŽË}­=F–6ÒE'y—Éz-¶]À•r6—0L½+;·�'ÞP^X!*?a¥w�eª¤Y¼®0=š�m8#CtMõ¹l6ÖkK» “ZPsf0ÃP- -Î$•RDjÿ'ßM´¾âÄ„nïd\,y¯ËHXíë0Õ»zÒtÝñãw[l_`áð'˜aœ±Ñ_¡k•÷²žý¯s€Xü‹�ì5@Ö—Kø$µV¸A‘#sV'áB:±« ‹é±]cbÛE€“ªÁÔ!7Ϙa¹­€·ûž�¦�á·û §�ll�ûÆ€>åaõ„ ûNÕnå¡& A*ÙUñ ‚.éu-È?%& *k_ÆLHnò"xà'­Ðyúü]G#,žç)µ,jØ·˜÷�ºÄÙK@¨ZœÞeôÚó…·6F=ä:Ç[Vó~.I¤©¼åT]*,îxãe¬Á‡ A¢¶ s|9ã°%x’8¶5µÔ¨BÛR¶|ÂY¸�:¶º$Ä÷½Âñ[X«(tt·ÍòÕC�§ÕØxy“X÷ ÒÌf·]ÚÍs5â’¡õQeGÄyO.×i»«ï:œÙjíž”s¾;å´a’Ygx¸S€«üÞn :>œð8º&—W'*Ê»×&1}¬‚_Oêæ`âG J¨()Œ³#Þç@G‰w•#HQSWö:6–5ž=ûrø­•õ“Õ9 Rl¶)t ÚM­Ä,céʳ3¬¾jóôg_7›AA’1Çú½¬÷P‡&+ÐÝk¢7?Iú¾?5Rð7÷ÖÁ=ó˸d�Ê�BQÝ´Û{=oâÍåþºð6¶Ñ*êy«Q/èûœ§Ý±�ÒægE<^w{më¶ìpêüž¶Çæh`“DÖof£D IH ‹‚*\ïN[‰UÞÊ'éÈ;мùgaÇ>\(€WvßÒxÈ%¾n­k6éý�>…eV0·æŒZ%oÏ > öQ®t7ž¾Acºóüƒ¢w¾Íçšž=¯”�·b�/Zô‡=Újì28æ/M_ëªiV°šÇÃ@O·?p™ß Á´•Þx?j�#Ú¨µ»2öíoó@béÈÝw:R?La÷±C ô¸ƒí$ÐÈ÷: *ÚÍ�™`NôCØù¹ñÝòlñ½ Ü.zVþ¦*§X¼¶\ò¦Ãéê>®ú*VZ,ܭϬ!‡"¢ a6 ½…¬F3U‡Ùk·ïcØà`ÛȸQÖƒš5)ÄÄS—ä%pá2Æ0 c‚Q¦- .W‹‚Ø6÷�â¡eÛagÎ ·3²0Íá훿L·e—¸”݂٠·pU$A{sµçÈH°dvÒq%~è'!±è™�cYµ¹’…ÅõÎ:° �»5CI>$0ë‘ú HÜÈ3î¯"9¡aw;Ú6fj¥¥l¥à�[Ž u ˜6Ì¿¿NqKuÕèP7¤¥¸jï½¹U§T¢b”äTã°"ü¯¦ž²Y:M¾]÷s[{�ß‹¥\a¾®žÆ�Þú Gž€„'ƒ3W^—žÁºÆÜiœËH6S[/k·­žè[îðÙkT’Ò€™2dºe \!Iîê! E*Úøª¿AÉw\»l¼.=œ_ßð²a7 p5cnˆp§0§aýÛáØ¤a[û�3…úزÏ?nJëšäÕ�âuZ=>¾¢†åòv4ɳ™¶cñ£ y€ÎùË5¬h`$Ëžb—O7c" ©²‚öõðyëroÙH1ä º¤C{G²Mža ùÌÍÅü¬†È+JJz21«æWx­EÏú�ØW¬=lhDˆîù.gK#Ò ñÛ¦M!,`SlÆêø­×;j§*Æ‘š0¿°A°¾.�†eªÆ¡ÛèQváqÏÂËKmJ½ñ˜ Z¡¬›õhÂ…¯×½Àjäèâ2n|”å´õ&)�Ç2U™Õw²{ÿªR”“¬Z¸÷ÊÛU¨V?Ù¢."¼7Ë¢uÐ&ÃøCù°*8-z1ÁïÀ›¥X >>Ó{|ø9Âï6>Yâdá1”_u¿™k£„áboo{± –Þ&ÙÐ6Ë0ÇzBjì=õóM&ÒÆä˽z&3-¨Ì{�ŒÑv¬s©í«?�Y1WsÕú6CV®pÊÓ� (ýOu|b[=gò¹“\·‘Xm]m’— ÂsîS–A¸!Q“èa–âyýj½”/sÂeúDÏ»Í léBÚ�púð;Œ¡+ÄXÑx·Qv3Nè9¨î82¥,ç0ö^çNœl0 ¡¦´“¯¯@ZÖ§T�óªZ»œ78¡m°jù®Úm¸|ͶUŒŽæ+ïw4Ê�®pe;Õ�&tBØ7‰ÀQýÈð4ZrÊv‡`Ýþ;¼PnŸ?…ô ù<[Y¿-&­˜w úH HŽ…ÉÛHÍuJ3›‡Ê£“Š·šk‹*ns­?xçg1ÈÝoF6àÝðˆ„ •ˆ¾CBÙq )(ë/ÁO žo23Âx…SžÆÞͳ±°(•Ý9�]>uŸ¬ÌùGÃb:´²‡¡|P…¦å} Ýr–°JêU[H'×c“½ùʵŒ6au´ß.ÈŒµƒ3 aJ,„dÑá2WÜ5‰O‡È@ðñí�Éæ¡i6 ÄûËà©÷‰L<ܽ¶HX|. õ³m”7*Ϩ,,i»7ï©…ôý6àÜ®[pë®Õ2¦#“½È•høˆºúÖ@"’=v [[£æ�ñ£Z†Z;•Áf�p!8¢Ç ö5ÏdugàB<þcp“î¼4YìÏ ¯Ë£À3³áÝÏ�ž89À½Çñžb~k�ÄzD»¸ØT"6%K ‚„¼ÎŒXVÎ �À4–žrSÕhpKb.WôVv>#e葤¹nä}¥�íäéµÍùeº4DÌÄzùKp NDG!Q —í@Kr°ÂØ=}dêEwíýëµXÆW¨ÛÓ�ݸh°ž$Ï”¨§s�x¼ëçmi�Z¶™Jd=zPÊæ(Âù<‰DIìÍ ¸sN¡ÂM¸¤­eÞÝy±w6ËYdÛöv©X—À{Øñ7ÉýÔ ±üÍÚ`=š>)Ǭê]G„„TÆÃ2¡§ÖŒV÷°!âIÕ�v{Ùá¼C¬¨Ë}¬ ltû±üIq�ð½sØ¥ �ÛT ž¨Ä%Q‹hrwrï‹ Ø lé¶:»öL5'·wl’ä\rD¦MÜIivâTd *”åb{H*QÁµ(µé1ï@S¼‹…ó~E÷ܺ…›ÇŽJ$ 9òtVcÞó×{eáHŒ®øXî-Ä·í}~ß“¼õV<_2¿Z—[@£Þ(;ÆÆXè$”v¬JgÁaþ÷6P•œJÆ Jûí`< \ßZÖp….cѤ[ëF£³¸Œ(²‚Ò0²{>+51 bd:»†¬o«¦É²Hx–.¦ ÉÕ£èKåT¥< Y‡ÙdböÅ8¶73Y�`­¡+6ûç Të-J‡q€~I›±0‰Q0mÕÜôL,7ÇØ†ù_~º–¿qÃrê/Hx‹deÅ1DV™²F$ú­éçt†ØÒ¥dËV¯B][²z¨øšì/ëÄ8®)>ÈU9ƒú¨¶K}É�üƒ?2ì>¶ÆyÔÔ�•4Å‹wî®oOcn4æÃɾÖ(ø©ï ãL{c·’žèf¯s`š9dê6*0;Ôü¼¦W5�ÑcX[¸˜6[™Ç9W– È]ñÝÞÂÈÔ£Øæú»×{nP–³3� ÜÍŒ¹~Píodénl 7yÔwâüwú>åþ�a¹"?`£ê<ö;bcc¦G~%T?ÐÄ Î6-|Š»4r,Unä´”×òa;ضsÕï’À…«Ù†/½%As�z©¯~ò�ó$; 0éoìËu„·¡°9O…Aúý´žç»hƒü1]»‚Ôm¿oö-Þ|DþžEoê�&€ï [pÃø:-çå–B>Ò79tïø’ìE>.‘IÕ 7Õû”÷ŸAe­á†Òò‘™ƒÔÍÞs·øqÁ#Øt± #«Yxb”ºgÎÞ];õµÛ¯€BCI»KN“R5÷àSci·n~ÍEXù«¶ó¨Û­‡¶^gœÍ‘¶Ï¹ÛÞðäÃÉ%¶¥µ/`P%w *÷C\ðD –PàR9»²Dyø½ç~oß}Ã�C±ß^‹ à[–ñ[ûãU)úÚ¡x%2ô߀sz�;7.1ñÀ¡˜Î³ƒTçB“_t¯$ò�å·\�Pø\0Õ†'¨<£”Ô„ñ@XXá£Jã.¿“Ñfoº˜ÆSA#CÇl�ý _g[q³ëPpm�F!�Ëqк¶/†évÙèÈqñ?Žýo�€ßˆ‘"Á°;�–œDÏÂá–÷Ôu�?”×òdlöÅ€CdAä].ɬÐò›U;ªUölîøOiüÕXA{ºÜ>íñ Ë?S­ÓµëWtßÍpIß ñLg*›8ØU‘ójÔEØ-92‡ëa.Ïë¨ø�¹þ$U²B÷.íãøx{ù"ÝlSÂ953y� ‡Öd± �€F‚I:NôPÒÇ©ð»Þ2MBx®Cž_n�{âw6åùªq2["ˆÇ¨Yéþaår–Ò$tï–Ç1VÒøq&twTU©ó �ˆŸf¾Bg^§¬»� €ò:a}_ñüŽãÂT—Èûh¼=fè§îív¥€ÓmâävÌ »ã!÷,¼1îøÛOnѾ„‡±o—WÚúV›]ܘ¹V�÷pÁ`FùïRoÏ7æ–vèÐ ¬­o†x$0qvL‚ó‡¤m¸a…V¬ïÑvhÑ`m `œ8™=NÆ8;Þ,СÒV ì‚ !QFZ1EÑÇ"q.ÁGÀËÆÖÕ†Ž/âÞÎ; nÁ·-Ô°ªJŠë?-·ºnÙ~ê�ƒµ³‡jʾ�¬û�ïΖÀdn®óì''Û¥O�“ßù[ Ž7ñŸ¢4„�«ªŽHœ:Y¶Þé\ëÇÍ~æý7¹ð…ù5dJ:ŨÜß³_*BÆ�Úç¬;¬$®álRj ï<$4ÚrÙÿD«¸Ï—Tiƒw`È´©“±w © Ŭ֡BâùãzHPˆÂ%µƒ û‡´úã¢fK¶DÝ8ž¾B°×½Eá«-{�0ÙŸP@·!_ÖJ°×.Ù›åÄ)€£hxv¥C€kÁ…k· ñžçßÝý÷@à B›t±côb—ó,�C /@!ñ 5oW­t‘öz‰öô¥Z{…—*°Âv·#õ*™l5«a¸‹~‡}õ%Ö›BƘcÅFdT6v -‚¤zPn:î3ÁD‘Ý$ 5¤’NX;¦Ï-Î "Zl×îÜmÁÄwZG õÊs"' Ûé¨Ù¸Úòô{ó…zÿ{+u/tc ¬º^ûY/Cû)"?‚9¥ ]GoƒG·-`vC ¿,Œ.p1,6ÞqÄŽë}Ný “šG•ލF;äu¹GʾR+Ëܵ¦:>ð^|·ÙÖ^ÝÏÌL€{框×?Gc�í³x#[¥Ûr©"y�Ô¦y€,/(„½ÛnÓÐâ„noÄ?š�a�&ôÃPÖ›Âþµ­i|xC�¶�'ê‰Pü6ŽeÂû‘¬3Íàg¯›€®zp¾Ÿ•gÌL«ž˜‚miïRg8WŒäD~HÁΈC°‚ïû\7yÝÊ×¶'XŽšÇåm?œŒ#†àMÂÙ�ÑY—³ (9SàY•´AÄŽ­7hQöfÅ —lHNœ¾j뵃 ¬EcVá$ØØvwªñ…’ÞG [ǘP¹{D®õðëÉÐ-Mð5j˜Êîy·’îYžæ]¡œÝp+k{¼_\%}r‚óçõ“æGÌ*ÌÊÌ~ë“ݸÉå7ƒµßhdä‚ï¢? ì±Eú`H¥”-QúšÍ†ãx>ÜwËïèõ"xqq�…(½ 3ˆÉa%ëîi,C ’¤pÂürLÐ6ï®(k˜ÅîmWÜR¯óœ•è[¥VÚ‡7ÍBêTS'‡º–`™œ¤@FÔZ¢Î€çbKe8D›€å WñÀ÷&Çcàs7ëòI‚7{Sbˆ €Á�3v³½m˜õoK³fŠÈ·Çû[¡O‚ޏEÅC;Ùb*è­xbK=[ÌVüwGÖs9Åþ£Zlîä¸p½Šu†Î¾*]^× ’ª+×ÝXõª€àÒeu�Þ2æ%ÀÀ£¼Pù®•2"‰ÑÚ–çJÎøÇ|f‚?|°žú%�_Cîí\<ßÍ *æ¡ëò�w( �‚òVõbs0Gù–®îr>ÕÛ»°`|Si‹¢òÌÛaøß)pIÊíSÕ Nœ Ðä(8ÚÚE˜“]Ù PûÜ2IÚI?>½uŒú$ô˜zo¡Ã5˜Æ{ÜþÆ…ä[4=åB[Àô#(cxËzíwÝ­¦üRî•¶pm:ø�_ ‚—FêôÞÅ÷¼½³Pö=©š%C}j{æÇz¾®ø}ßÛŸ³ÉX…Œ~¾}?.‡$Z`<;@{}²\}2ïºR¾½³‰`cƒ›rÐ<UíµØÄEËš_—îUÆðG›q.¡|«x�8nrt ö£Øžò!lCÝ ¯æàL—7óntöŠGçÛm>×zϹ‰ÈÖÊúÕÊ;N·|]Ôk¢;¡Õ!ÌË‚³5¨{… †çzÇ0Q5«ïlå�¶—�ðæeD)Œ�¶¨\÷\»Æ¸R€H�O‰kɤ{úÙ×Á^§VÜÛ:Uá_ĊϕЀ¼ ôú|“ÕMb2dã¯^3awYÁïìÒem£‘ŒjA£€—}‘›EÞA–¯`[Îâ]ø¯{mÛR�þ{ijÇ#ÖÁþ-€ ‚p 6·9Ai«Š2€Q×W“Àœe¯€(°ù«2ïN³æ 8krÌ ÂIã=iî A‘Cºnó;SÆsTºh­oj­·cgî3`¨¹ þÁžì™\Q‚Ð…§-oѦ8,¹º‹ZŽÏpL’7p•%RYt¬ÄØóã”D�»ËÓClËËé°=sû ÁƓԽ��¶óF/×Ðý-ð·o‹�õxbîžIäþœ•�Šÿsæ­V´[hqOy’eôÄ®k¾n. ²Úë7iˆÕáìaÅËW¬‰++ŽßÔWŒ�C Q¶hOÅÁÑ¡ƒàd LW&Ì�}�Û—¶åã~^ 6>]…¬rÏYiÉYV™›jþ`˜˜óˆÉ«”œ:(ui `6žàBÒ'l¡‰1’fÖ¨xX{…¡®n8C} ‘O-ÖE,õÅú£noD‘MCqOxT3>ŽðÏ��Q9â[‡‹Á�‰Uö&˜ÂJq¨÷�)}u³­[æ½;½hVζk`’óoÜö)ƒ–ë Þ�)y’övÂrdþz·æ›»«#÷àgÛÛƒeŽEDWÚãÞ6vÀyðñŽå¼¯X·å�ñ0°–8+ŽÓŒÇú°®ÀØ«%Д‚k<wÛá\ª0´<•|Mgd;;Xéä騷}ãºÈ@nå� ßÌ«q£…‡TpÂÉg„´è˜¥ƒ×ëeMÞÄT|�ÞÛ‹� ö«¯,â÷_’¾Å˜ž,AíÖ” |/«ØœÔ¶òd¨éÙ›‚ÞJéL�+3Ú:eÜ*{fÍç&m(qµû|ev~õÖŸgK†ÈR*ç+-/!•»£‘-h˜ùà'G>�YlôS:>wÄ»øƒ��í&Z–çJ\â89ðÐÙæðÏi$ÌhÒžµ#ý{䩱¼Ê0æ‰õà†�ÆüjM°àýA•( ŽÅ�P7§óÏ‹'ý!Ww8ê îJwÈ�¥(cß+W.iN½ñ/ÀB¼Ïyv[ÏrÔMƒ¿;Úo©[]£ì¨X1ú×^d� ö´êaª dbÅ î}KT5–)è#á-áµíTƒˆŒµIS–Êj×c-˜ÙýåØ Zg,'*¸1ÅÔ.Q<±lzÍ×m…›¹«ÈgÔQ`Ûvn»R€"®ßö2E®…^löò³~•òű·‚f0A:6Ô|ø'qɨÁ—KC â¾”ÑÝ�s­ü�ÙÑwp}�Ž£%áe LW�ø²Î<%ø¾ëTHŸ«°j nUG¤g¤< ÓãB| Ê=cò¶�ØÃÖ5¢À¼]¥œ¡†:{Žðó;ξÃPh,�cÔPC"¢¨á‹ó�æö :Í¥/ù2\V? G󶾂ßX3[æ˜ùX«âŽÜ%Q—2:Öoìû€Œ 2ý�s¼ á7VµÅÙÝbÅ¢߀?íÊ Æ5¯îÍ^æ)£…®¯ ¤aæçÒosl}Mg9’w…ˆÞWa×ÈÄã082®ÎNe¨­sCœâ0%“µY‹ezbqó@¹Q†©»CˆV>|œilåÃÅà¨~Þ2ýÞÜ".8;Ê¥ä²ÂkÍp´<%o€’grR§¼x€M >Ô§ê­;:úƒEÔ‘ÂWÞNoUv6ÄëÔY_Ëör÷íewrxgêˆ�çVµCRYèu¯ l¹óaKÂO€GÚìˆåN:c—{,ˆox»¶C&*Ä�¯¨;âªXÔ.Ù¶Ç8+=øvÅò"€{Œ10nÚ2ZKº+>V#&:�e¤NÛˆ hòXš5CždðÜ;?ìl¿fÄפÊù«S‹ó†Y j–¢ |OzÞn­ÄÖäKÐZÙqŽl³k3‚ð~[�è>7xÄ$|Üñ^¨>åñî€uõUêe(2ÆŸt.؈r}1Ðe�•º+ öëýa‚E-ë#ko�S<¿®£¦Û·93óhÂøèM`œô·ûZê­�â{"àg;«ï pl¦:‡5¥_߯¹¼{uAwâyó]OîrÑi··»œgpÝõ�ÖomÙlnÈ$ÀÅ©#°�jÒˆºbzŠ÷™¶}½zw›ó‹"¡Ý­,ÁÎ�¸!ïN$.“Ô.”ç¹{ÝÄêûÀw€ÙR”ζ2á´P..W×xÀGàMÇÚC^Õìñô¹@Õ¯7ë"E5¾&u» ‚Ð÷X¦®â‡"ÁˆQ”éÓÏ_[eìÆbOÁy½126�…7�Ó´¾ƒ2€ÒÈ#nO«¾<JJ˜eC`Éîß°¬J5º9¼Zs,.Ó€ Ò©Û ¿?c ‹ŸåC:+(þˆuVò˜Fmnè”c"j< DÅmnö=){g¨”âeoŽ{!ÛZ¿%g»ëÉí¡Ì1On€ŒÚ� 01br€°F›aµ¦Ñaòry¢-6V˜¾„+&D•ˆÆ0ׯ]§=xW$6Çs†Eâ�g\Qвº$.e’ê=ßö šˆ6`�´Ó(žèÕîå[jZŒiõ¤`U[:—†(íkÉ–ÆÉ à9÷º}´&¢³‰;“šqúº ä8º:·:£‰“x,!â�ï6ÛV§¯›XâáÒ1ŽkaÜEÔÔŒ;,Ë…tÕ šçéЪeîÕ~Ÿôƒo¤rI©0»šÂ®§<$Òt—‰åïëeŽœŽÁëx,I�Éã8ÏYî5ã�»Yx(롌ß)–Ka‚^^DR7[@VСævàþÏtË6È4-QËð¢ ÎÁ¬¼Ú²ÊJšãë½Ö=óÜû¸×Hwè»þÛó‘7?]él—ø™|2,X¼)ñ™�z¨ �ÁAùíÖ”Y9ÎþºËà L�¬=RŽ« ˆo[ÆÞ¡C¾°6…O¡xuI-¼á©Î ¹0gø¡¼3¯¾m±4äb´—†„M0òˆ2¨Ùf£àŸŸg¤/^õ`_ƒ„dÁ%<+ =ËjÿK*¬Î@‹-Õî�5»ØÝ'ÆV±I+HhàTCÓßÔˆÂÕsAûš¾ME¸¦g® pÕÕ°`Ø ¢Ì[–ª�F­mPíæ/¦r\(Y·`� éöÆ06Ë:“©-÷}d•Ô%"NmyeZ+Ía~�¨<½ß·æB͇1Pw}#îÙ¢ÙfRRî_YqùÙÌ“1§eÈûÊyÉâÆ�Q¹-S3k'^�6oÉâ§3°{¢¶» ƒö”ï d Ø(öõ½o«û�aüÂzA0L¹›?_žÛbR·¦EWÈ�$NÌ,£§sŠMqwë%tøXX±áõ¹èmw&¶N£M[A�¬MÇ«õ,$º¯fü£è1opqÕ¥6ËûºdÚܶW&îǽd¹ˆä²Û`N›o“nrΨÁWS">V. +'â¾&GUÌÝ ÇÓIÞúäúÖΨuãÚ6ª¶„·É®Œñ�Á¶–�naÍK%cc´—üK ÞĹ^4ž� {6`…å�Ý r±ÃRák–³µMîKf$ÝŠZR™yv«RN ­yÔÔrä”cc-I¢ÏcRõšÕ*~¥@ªT†½eû³ÞÂèP“ÍÅ͆Áò®ú2%ÆSÉ·>üèså¹, ¶ ÷&R„ NäŠÇÓ?�ߨ0´_‡’µ.‡ÇÙäHnà�í³m@‰¢qû +¼¹Ë1k±Ì`¤^].¿/‡oo5kG¹6¯mÊÃÇ·RLˆ�+m畤νáÅý¬;ñç©a$”m¦Bi[‹hø°`Ç.ÞÓþ¼Û<ÚçÁ‚¿tØý«„€Ö:rʦQ滼é'»úøv.ãSÏ{�!Àã`–ý®4`8áîw¨m£;À2àc4·G¶+L«ÄíÃ!ÃÒd<”2ø0$ bõtÈ͸�»ì<1)¤¿rrüA@?ŸF�/¾K¬QØH:K³ÈQO±íEt7û“À|¢ó ‹P¤A‚¼BÐêêÖM#^%NG×[SÎÁwÙ\ÒóWà'ßQë“öUé8�ÙŸC@K.M-ÇcâQ›—ÀÉå 0a|Ö5ÕÁ_å-DY9…ðWbÓ£³“.1Dnd&QÆ¡ño–n]Ô-E߸x‡¸Üc<ñÎù»%2žü˜óÖšQÜ;&ª}¹?pü0 1±Ç`×ôŒ2åÛ+§À!B¯I Ó§›éœ²P¼æ[©Q-|…Äú®�rý6.¿è£Æ�a¾Ûl¶Öh<£(xô‘ïsžÝʨ&2\sXeäïL®x‹çÒÄ…¦®íq‡_=ªÄà¸�l‹»èfá ×b¦ÞsÝ+æýñ?º1æÀS\©Å ux�ñwzÒ2Êüß!¼<¶âŠ:«v6ÅmwÜ[7—âü¸|¹ðƒCK¬ßLjKªÜ(?�‰ár9�OlÓ½Ï~g¶z8îZŽEkÅû˜Aó–¹ôËÆeÈp5­™I�ÞW!àÞöûÇöŒ{°­}{èYs¶×jŠ”‘µÃí#©Û®ŸpŠ–Ê±Ûßн¹[`ÜÏS�ê …!5É7Ž 9z/- v4¬]Q^߃ƒmHígE7š›Ý%tƒ�6#™ˆ1°iÙdïµJÁ±òÞŠ‘·³op'O{Ô½�DÄqÎ5ÍËr��ÚIaã°vË3<—ÏYyþAþ°û:5¢¥�#vКÝéTb16\çy#�ÙrûdäßY ñø �[Úpd¢½ è�AáÒ@þ¸ç€vgÐ*­Ãyüà8[+æ.�öú¢Ç¾ x�;\�Wß[*a—ÇŒç´^Èï§š‹Õ…¸©Îù®­±¦üô@Ð@žŠšÂ:Žz˜ì æÝsm7•:èJºæì‹ùº¡dŠ3µ×·ÓÆ2ôõÏÉ¥›&·[gÕÅû8J�¬È‡3%6Äq–7rÊ<•°ÅŽöNД¥-¤`Úëb”·R)B~Ða®Æú’„1î€ÆjJÕ^]H« æ«éSMÆ(ß/è0!1õþùkHÕ©ñàÅ¥R�Zí‘«�!ã¥oÖä‹sÌzñ ÷­U0é”1Ÿw2�ÖŒzàÒa¦Iî·öÖ›Ly)Þ¶:Tge“ÛÞ,šÑtî/˜“2á.I*y5í´jP g éU}…m6ç8 W³­ÎÎüÜ••£_Ib~qÕ—!a�_ÔÅk7I|Ø›5�T«]ÝaA|ØÍétÀ‰¾ŒdÞ¼ž¶6X@[-û«âFœ›l¿u>ZŸ¶RVÞ£6‹(|Q»§¨ú9¶à/3º‚Ÿ0¦3ú]`ÏG>ºÙ™L؇ÉsÃ&šøÃ³–Ä^&Oòˆžﱸí`?¨üè©ÑÈíx CÞ‹È'³ŠV«ŸÔšœ‡";~(0„’3÷�•e‹îæÂOwàiþ-¶öuð\07ÉÝÝÅÚ80(0°dX>ÎIžj5+Ô™®Ê)@ ™­X3²>m:îW†…]^ê¶®­±¼�ƽMˆ‰-_€Ðþs}м«¨(f}ÎÁS2¤>0žQkVm6ÑJª¡ƒṈâÌxíÝÔOŒ62 µÇÙÄrd^øÒ3\‘0¨æ�ÄX˜$¯e¿bOZÆé(œ\é7ì&µÜ#ˆ×X8¥«XÆuÜÐd%MÞ0z½B‡©q“!©7v£~EËú“­KXÒh1þ‰W6΂éq¼8ñ|HØËà ‰qÕSᓈ‰ÓføÞfn~Ï> E%ù‡ÏÂK±™ìeTxïÌÝ�1FÇI‘·Y¨RBE¨¶ª�!ïÚñ´êä5v<‡è( Gö³ ‘Åk~-àDP']êsšù¯Ý~— žz¹àI"¯ up³=˜¸•»€ƒY¹‰œ&VêxwŠ'×ë-ä2ø�×âp9Ó4Or(¥•ýp oë(Шæfèë䃱ò2Z}ã*©‘þ@Òß\Dæ ›BgØC½6'­àí“;Pdå›Ù BÞ�ÝX…þ” Pqëן°Ü÷Ÿ ¯Ê³ý^ãT£þñëõˆ”-%»Þ^9�†š‹,UêÄüS²pè&ÀÖPÄ«á[ E›åc‚£ÑšÚ¢K�óiÚ�3´H¸Èµ °Ž7`{ˆ“Âæ¨-(¨€a�8#Ô…ÿzÚàl ]6÷LËÍžxɪР…8zsæ–qï•£ÀÎBÃÚç_ ý&£÷½Cmx’ëYu‚o¹î÷uGŒ8/w ¦ˆ��ˆKnÛ×Ö¸q°y¶Ë;ž<VÌ*ƒç„ŒçbUÕyÊù‹�@ãÏ L×­Q2Þ=Í AÛQ„[°±³³¢hÆqšž%õªÜÏ83½©ƒ�dAVboÈ;�nɵ*V­U¶Ö,È8ØÇI7q\Ùvú–šL6¬ZÄȴݯ<ãqlïÁÊ%7 _Øó‚ÆD�‘"ÉÀã=8Ôó{VÜs õ4ücglñ47Û ­›F¢·»äºów(AQî$û$˜·T=çsxh)›JÚÍ@y Üîìˆ[`ÄÜì¨ØöýM(Ed«»i|׿Åò£Ð­˜9 Úçžv’üaÿv–¬uàÞZ1ìuc»• £òôöne2ÑxÞO¡£÷<¯*–šk»¼IL jáFB¶b¿î5�Ú1MÛ’éÈ0Òþ¡^Ô²Œíuù¬AÌ™¡.rwëëÏyQiækOø±h¬¹®âÕö«x6§Î÷Ÿè ¹f…m¥‡…;âÜ=ìl¥ƒàÝþú<-îäwšvs.3±ßä�û;•DNðc)�fg#K´=¹ùˆ1QZ,ã°é©Þ&©:„µÆÖmˆd6¹÷+ŠUïLBh Ó–RP=…N%*4]s�1Ñ2ÂÂݦðZüÀN×Ö�Ï®|ŠO‰†þÉÕ(B±s2ÚÉp6vo`C5öBÂ7*· ºü‡ÒªªYíTõ§¿E‡-ûaŒ#G^ þÀ ª¼©Š:ᘠ¥¿Më€ú„¨n=¸Ž 2Ž…©Ý–`‡žê7•ê,�P;®¨Oª!(e ëùƒ‰ty=ñ$:{Ö¾ãå¸o¾T+Þ}rNó©ÛWA©Ç€•lø{š,‹Âþu (Šr�×7/’÷ôü˵E4.:�v[ a;¿Ã50o…/ïM®á™ß§kaIÊmBøÞuÁM+©ÈÊ}�Þ‘€h××6yßñ±Ïöyˆöè.›Ýšl* \¿ñ+j ‘Eo»â2e~íÈR�S†XËÇÂÏT1VüÝE�,D)¤bŽO/Q’¶ ‰5f¼Ãâ(x›$�Ãhû–êI†ù dÅmêóÄÛ¹;âm –úôÏ– ðq!œüFß’{vÏ‚û;ŒÉßÏ5Ÿ³LS·Æ°: û�v qÚo4æ~ù¿PÚä/µÈö¼ ë>.éï«BÜwȳ‚ìë( RT=€çS„»~»ÓeÇv"~s†(4;ïªÁǵëc¡—}£-Ö^;q!^âܹÚúê5Â:2ázx\»‚£… XNÈœj7íÔ_�CCµÀjrÒæ³R– ì½¹È±]¸n4ÈDRCgØ3è\;j @(„ÉÙ›  ,�y$ïÍäÉC"æ[?Û;‚¤x÷I¿Ho¶¶\¸Ìvod'ßh™Uòm—B,ã©6 |˜ÜØS ñð{}š@�¸›ÍßÅà¥A{[>„ŸY ƒíÓ\u€±SËû”¹Œ_ïœn ·è|á 6O+Ó-VçG q=i(A¯.v X«‡k+¥Pí�‚úzTJƒ@¨9°Ûñ®]YÔ×¾�\ Q»‰=‹�n —Ãñ-i  —ØND·3ÝZ òfaÊ7‹Þ!¯Õ¬ÜÛÌ�í>j«ˆ6üf¶åž‡�‹\èþB�ßdp Û½Öæƒ^å|J)~éaáF1|òìÏåÐ.îkÚ;äA!­(wÞ†Ç�¹(ï ÙÄÞ"Þw-þÓèöOãåæË†˜ É‚Ðë”Ò Kf;Á,>wm[’’нÓä*ÃjÜ0Ç¢ZåœÑ;$mãñäÆîÑ’¸ç‰nÙqª‚¬ÏÊ –ÇwV5L_c63}à:’ɓΠߞry\LDP£ªb’[g‚ÄoZ8´ÞÅÜD«6Š.‹ÈôóFdSõóÙ Q¨íÎõ§8°¯Xß¼5&°9J&Ùót@ø’A|V›gy†ù Xc/­a�R-!6d×x·O”Ÿ`3ßT�<˜¹�Ù ÈW†uÅq½”´ý¶£¯ð›õ�€Íƒ\:"Ã+ƒŒŽæªÌga{0(.¨.ÁΠ`{Á¯­g~¾T› �`¬Þ�ÜÔÒ„Ù ó>ƒ3«°ˆÍ‡�+l&>V¬b S³nÎÇx6¸î~_�Éï–1¯±=‘àŽÃU–Á'vN dײ#jОéí¾£r•Íi¨â{¶ÄÔÚØ�Ëv¾,?›¬¤ãIäðªhý&»pjýÞ¢­ŠoÆö,kb]+FA¾Ãgh³{ö÷àEZ‡h]t7 ˆ ç*ïÉœåyKõqf`Ê�[K4èà,žr{è�UtÑɰ¾£W™_-‚«5ŸÇ•à™îž]ot�gtdF+ø¼ß)à�¾Þ¦ûUcÉU¼Ì{<‰âFíÞYû½4òU¹-l³ŽÀQKR8C\NÅìèúg‡}68 &øêaÕ|®Ú]¥¿®¨gý¯¦gJ�ZœCà\Mƒ<¹÷·é¾s0‡AÇÇìX Í^-{éæ �ß^ – Q»!¨¸‚Œƒ¢Œ-£u²wÙÃÚ£Ä!œ`I�B4$„æº^bövµ§ÛX+ (,žÛkü;—•2‹©¥BM~œ7 ²Ñßà/ „bKÍ—ù‰ÔË=Rük[Ò ïÊ£3$µÔ2çëÆ¶÷»Û[VŸd> ÀŽÛÅùÏõeºÃá ¬MI…‹šÜˆi< vQ¦+Æ\APxg… Ï.øë+yú`;®ImKŒÌîÜèsùüÁswqœÞàÉÉÆVB×2ꧦ@y(ÑèÏøxxÂV¸Ÿcšþ6 Ý|õÉéõãUt¢ïÊã]*lçÓ;‘Ú Ç©ýß±Ù=í³¶'>{cz%º\�v#“}ïs¦—¨Ž’hUêÇ{µ™ŸPLFÀÚÏ5l ±y¹¼Û¯³P\BžÀܧö¢Z1ÕQoÅ‚a?«QÈám›?PÁjBAWà„ÙéÛ‚WÀÔqC*:,Å}¤T"µ-tC6`R@‡•¶¾¯¸j¬by»_ „+) •BSFHŠ|®šç¼@C�ž×ƒºzÎ\¸iŒ6ÜJ¯<«EÇ�ÝõHËɾu\\ }¬ Z㣡ە¡Ñ ½ÂAŸ(Ÿ·\a;h€I!À kÌ‹ÆÊïlöG5Ò ˜ƒÐšåKÛÈàqpè/£×Ø>"‡€Kìã™ZFáe�búq‡0úDÕ.éÊõö\Ôré­"O«!—–uYixΞi‚ÂN.£ÐC?Rϧ¬vý3÷¶Bšåµât\(ö±™‹Éµz¶áp”iH5/OyàëË"7Ńd×H6™µ c&{´ZG­äÍÒ–œƒE˜ëb�ƒAÔ=r6œÎ#ù‡�}� ›Ú´#VÇ9u!Òƒð$Œoˆ‡bëÚï®úÕã"5BîõÌÄyö�ƒ=r÷Á ëä²Z®aåïmÇ2¢7ÔŽ˜=ÔcõÞÝ�öå÷|˜G�]óÇÚF£†%ì7Ó0löõ½r)ƒe¥ÄÙî_˜1ãOP"¶`â6¸‹Ã 6—Rß $ºIÛ¦�olnÑÛ:’ï½·®11]‘õý�€@ v,›A‡z hÆoQΠ%]è§×?{šð oÝp!ç•b¬óož[n v(CžÊ…¹«Ð7ɹàÔykæ'O{7YÄ—_g�Ü£G`8M0Ž5�s7[\ 3RÝyÛPᤴ´ïÇÜ3†Ó�Ú2WïÚ‘Ð÷[⢅>eë=y6Ÿšær=C¬2�–�iØú;íH �ŽÉJúQÏ/…Á 3¡ÕÉzË«1™Œ”Óɵ£;ÔHÕŽÿKPT†3�é™�͇n x ëãi(âóè¡Wx€ �–ü Xv ~ÊÈwf,ćdôº§« [RÜG ú‰p ¡5dƒ ç pÚ4ásy sêÐ(Þ`3'-�_�×>æx¸¹ãè_Y4¡ó¡ˆ=$ƒˆÏ¯ÙHÇÍ{ÇuòîÇpsQ ³Œƒ¨({&ù�™føÑ"-ñ)³J»¨Þá(@‚XùËíÛðð3|Ÿ]¹Ù‹RoÀVú|7Ãx{^t=.ücEÕৃV¿ì†×Á@ø!csœ¢7h÷œBpã nÙ¯€´€„—ÞHÃêé�"|ø\fëš6 tžP��Š+ë7ÑHE‡‡ÞPZ³Mû6­ç?ek–ݾlÁXB‡%žb€î8Œ/ãòá²QˆõµÈúµË5�ÊÛœÍôàÈ*Du l!út‘B™Å›Šg-vmo”ÎtÅÚþÅœznçeà*…´xš~A“í°ï샻 –¶®5�bpQØËcÎŒªGÕ]*â!×Ï-~^œ07Pè)¶ º2¿™0Z1 ɵú*ãÇ^üs‡ ï./ó%Ö4™Ú»¥õ¹?˜œ4ýÞÙmVÖ¯mL¾G±c’ïŦÓÛ=I¤^ßß ¢YfÃwt2§âc_p@üvë_¾ƒå¾³ ±W�ÎêÅ�Qˆ bþè³t3;ZæqæQcÅþ±[y×"­`SnP˜æÊÉpVNz-¿ÅZŒÞ.;fð`²ÄèœÀ„w|¥íFß„+6Âé…Z^=î3†w„BÓ¨0m×xé$íƒ'C¼â¿`mF8Ý¥²²Ù>é×=«¹Þ|IòƒTp|�WÇÝçER_/Èu÷Ø·ïgg¤u¿²õM{6¯OåàuÚu­Ûô&ü^ÆŠ›ì~6¹6‘@ØÉ\—Eû‰³`íýÉŻЋ–‡2Â&/ 7º’ÇCÏ�f8í¼•ï�ƒ[Œj!¡¸¯“¾1ñ8ì˜�+>8âeïs½ÇµìÓ²Šýv?sVÞwøŠSÙM.9(rÔÞfOu_÷e¹g‚ß8cã½e‹{`ÏÀÿ­dó÷Ú�ƒb1 ÷ae9VüLÏ×�Zlþdfßt ›Úç*ĪDÑBÊGezÔ74µ%§+á¿Z suÈãÔ2ÂgÇ[ ZmuÖ'S‘wͰ®·w°àÙ­R™¦>*æ«p­}ë|Ï9~Bí_Ê®‡u¼e½:ëÃ+¤dwF¬$ïy‹2ߦî·Ü R>òéŠãæȱÜ+¥:X*V×ñêgïBŠo¾Åµ Ù‰Éô¬ÿhä/ø¹—rÓŒÑ@ð†oÓêgr| Ρw¬Eß8î>bà~ÖÇH´C¹¬' .°Ä¿Áge8Ù‘¿ÏˆB=ˆq>î.%œ•0j¨�Í:ècv p¶Üƒr«ˆ @r»TÎþßè=¸–óài+f*vHF=`ù";ntÖ—Òõظ§�®èûoÝ�AM½Ì#ˆ²ÝÀ¸/”ħç³÷L©Ó� w?爙wR[¤¶ß!ý=ÑÏw ×Ðì�ñÓqÞþ·wh¼ö¿Ž·ùyÊý|6C³0Û�ÑÿiýѾƒºµ÷n°UºÌŸp‹g˜‹»�aFžq=0�ë8�°t ÖFì)ÛƒCòòýÔ Å3a9Ð>gœý´ ŒY ¡”ˆ_˜0í]øÙí¦®ø›ióRËöÁ¯§õO¯föáá".ž�ÐŽ&ÁßÈHt�˜çCzø×ò_8ð9P9yuîôÖçΚß�™'ˆp±nVR.PI^oonb3È6bz°èÚz=¸µJüÚd”¥Ÿå�@¢…(@£R›îç3¥–Ч¹zˆ¯áù]`[ÒmÌRK¤+ÍÉTÅ\ªÎA’E$]åp€kƒ‰˜�þ™Š,H*ïd¨;‹ZÛT;¶›då¶~'$ ý…6Ò˜X]@¤rRH¨²[£\l/0¹,ÞúSÎ T‘Ê£ŽyþprrA³ïKŒXÅ£ÏÞ²¢š!ƒ/ZÇ1:�ÀC=òr» \D$ç\ef¢ÑNq9&B µºÓW{�É¡Ölüväb5O´orî¬S¨ï«»há�ó©ôÖî¹Æ=ÖËå2èY6 |?/ÜÎ&¦ŠjSC8Ïh-—"¿³µvˆs2΢›(@C¬»ŽD!XâHÌÔ Ö€ËLFãÆ>J­bÐ-Îâ�©²y Ã�œ”iÁQ" QÕ¯˜´á.Ž ªs|ÆmŒÂ~h'+ í�ÝCõµPojÝ[WË1ï›�ñž�vhC\UáãÈcXZÇígV³Fk§5[)ƒØt'k&ï�y¦« Þ^['V$RéêIÕ2ù4Ú©”Zàš«ßtT¸½I–!˜–Ù²º›txˆãëµðµÅÅ ´o­ßµ&È"—b}ÞéŸy‚ÝßEZ (–7Ó¼t¸Ê«ìãn; áì�Bt$ù„/|æä ëHñoØÐZ•6¯<~¬¡ùU3üõŽŠ×_0SZÚç¬IÃI00Ãë'ˆ†¡j €Üë ·íkÍ#ÕÖ)‡ïÏ›õˆ+Ûñtõ5­i§hˆ<ø$ØøŒ(Ñ9 ͆p)†í°¶¯•m70x¾†. «onƒ¦žk©¿’«¸0û÷L*=V²|(¼å”fóp`òFH³²Í­5i©çýF¹q»8tUUB÷Õú€úG̓ À%œt>QÅ·àx­˜:úf9€ìÚõ9±‡¤– zïŸ)†µ.u37ó—|qÐdíÃcE–];\nõ°.˜¶�;„q°úˆ_B6„Êé.­•�׳Ë)sGénÇUßÚ—nÁ��™ƒ1õF´Kìó'‡ªQæ1;³ÂÐK1¡–zÊ\»ƒ:®Ú‰ñ©ï›©­ÕLáø5t¡"¿3t[Nkª”Jì Áoè°þiñ¢P³Å^íù�¶ñÕ‹M;×èž§¥ó|xª/8°ý`oY[f,mü»é Û=>:uX¸“‰äÊÚ8ïjz„�Ç1 ÊêÎØ™ ½üAÂßAò·lªfPÁåŸÞhÄ絞 ƒa;ºÒÝ\ Ç%®gB ap{æá 9½œ£ �=ÂFEðK�Çì KJv�Ìs9^Û bi�Ÿ†ªhrg¶K¼i ìˆ�õ€’X.6�|Ú;çÏï§N0#Ñ㾺@´–Àï»*´LWsyS`Ø\ ñ­¤Ú}8Æ~@µç”e l�œr™�¾½/˜-Ì…û¨–÷8XgÊ'o7Wí¥sNmlî>‚ “qÞe,W"è3AÁÑeƒs]ß–LS¶æ6©ÏmšÒÕà—fLšWÛ\(—E9¤0 =Å€açP‚æL&mp¡·/»Ñ6ìÀ‘“�ä’ÿX�/ÅÛ˜è^Å3ƒ[Ïãs9©USÎ®ÂæØ+Mù§ºJ_&: QÏ gõÃã™?8vÎÔ–´^Yrè××VÛ5•µÏËðš+l×]CŠ‚9 Œ )@ {]W_6Ò¤\FïÂá=j B6S²žl‘¢Ò|î,2üQ›9§�€„ÊÕCó\ÊùµèTIж¼žÁͧa»¶ƒhZ0@Ónìëf06ö«ëfê ÜÍ„¬ðÒƒ£çò;~d­icDƒr볡Úú÷‹c,Ûp³6ƒM°i^D{ìto9].™ìhÃoMê˜KËëiC—;m´Ä¤7ï³Øfúr?} �û }Ã1çh �{Bï ˆcLÝzpvé®åy­Ëî¬E¾B|¶ØqÂÝ<'¶ĨZ£ç�>µmµÌ^�5Ðú\c¨Áψ[ë‰o6Hõ÷ŽÄ^ÿ@²+BxÖQô‹:�³aO2nVÃö‘¹cØ�jÜmîušåøS¦VÉr&‰ L„”—È ¼h ­-½s8­Ö€Ëó’gr^jÛʵ@Q¹Z "ƒDë–2½['m_Ž* šÆí„®Ý×Õ³âfüÙc¸®|…—=$H‰¹¡ÃjêÞ?hZ#ê>)Hþ6õR”OS|xãÍ_ ÕEôz|UZÛåˆW1V­~ÅF€´þØf3gÖ;SA´bÏå¬Ç T ±e[ê"…9«o‰ÏA\ªp=±^fÍL×Uz3½[os‚º½d»OÃ]·[«žV_EA!œ÷oØ&mîJ›EBˆY³åA¨|6®ïQs»µr5»Fð§m�@„~Xwpž¿s#µ…Ù{þkÔÛ1Ø`c“p‹¿Q:*/§ ÍŸ‘ミLÈ#.ÊJÁ6Ëó5 îÈEhþ‹¶Û2áÝÅšÙŒeØ;MÝŽ—FJ�õ/ŸzÍ*¦!Y[q·«jq .b#ŸôUµúÏ÷ô0½Ù‘K›@;`ò:Ð7Ý[Çá j�d�f`å¶ F€«íüк籔ÑQ9ॽ֟î„cÈõ õ±q>Ø8¬ó�ý´ÓI¦K‡šGã?àr#pXD¨uŒß*€€ hu7á_Õ&=«° Øná×x¸îLüú«ŽÆhù¶ Í®cНs;Z9ÈLzÚÑͼè_g¾\-ÞÐÀ¿~ô )x¬�]²jÓò¹öH~Z˜Ö87! i8zŸ¨šÖ'#æ†1y8ÊŠdï~>‹ar?KMÙì%¦ÄÚ£Sl²Cóä aI%?\…1Æ»›±¼P8CìŠ1½ÎÞ£¸”‹íüŨÒÉh'ãé[ ;÷6å… &½Aws“�{ÜÀ%zðhµÍ�  X$»Í*ù%®[Rm¸€�s$o};]0ï fHÍ;”½ú‹µ ”xLo{âe'žÂïŽóöRDn—Ñ�¼ñÃ{Q‡u#_–qõ¹�Èj“u·Užœ¸üç ²9q¹RÜã­D¾áoM‰i5kE³t^H >Ä YXq!§ÑÆ:‚™û=ÂNó�zƒ^(px»†DÍßu„½œ0dÚSæÕ˜jÓ¯ªƒe[Wm…°±¦î2µÞ³Žn²Ú¥*:!¬ípÚ4+0úÌ}Ç›â8n5iî4ô]TÕ–ožuͲ°FtùëàaÏFðÝ{‚å .p’\ � ÈX£…Þ&)B´Y”-,V®Ùªˆ~` ý ä0ö¢µ’µvׯÆHJUk›ÍÍ8\Û]YV¢’øw¯¦!(#næ~ §” Ńۅ«KÝ£à½j�nC×òö8½^… Q#¬»o»]øóÜë–2š[âÀõn[s¯Ì<«ÄEØÂ nZâ3 >6¤bAZ°ÙWq‰æØ�…ð²–,Ô¬ {Uw�’lk¸@!@ã%ä °I•áðcÆÕVíX—aÜK°(ÒN÷¬Î–ë”~âчW‘DÎð­«ü$�?m9åÑèϰE¼og"7—‡Ð‰?†!Ï1°ºe¥0&Ø…p´sÅ��¢õf€>6¯HV�àg· ½LÉ5Où~Õ¯n­~ô-Œ9+…ѯ¶Àü¯{b|K%k8üÌ–ÕâŸee :»‹£å�!;ÌÐ|ÈŒ¦ö{߆Z ú�¯ÙÞ�KW 9>4Ó'k#³¤àJJ8F� Qdœ“cÄÀo—žÅ,W ÒƒCA�¥•1¨uÍShc—Æ\M'æµM3ø�ÂY�­p,jc –†@X.ËwÕlŠþOA×-<í”·9×fEFᛢ¡Ëm—5“_(ˆ3¸È†^$Îਬ¶�ÌwæádqëϬ ‚žêïP u°TA"ùlo•ˆV˜ M¶NÛJJâ^”f¢–:@Ò°3Ÿ2šqºýõR2¬SS—ÃytsßOÖ]lù­´¾à’FÜjÌØV¬1v{Ì7 ØvB4XKõAêçøåû0÷§&3J>üѓ˜Ö_dAQ³‚Á�ÛÓàj†È{ô f4u—«_¥‡ÞnÆ!j§Òþâµñ¶T…ZK%”\x.‘Òð陣áË�ÇÖô"¯6"}cTð5„0†Ç̲â?ÐÍïöæ‚Øî„¸{€¡æoÃ8Uç³ùf$h†½[ÁÎH°[Eð ‚Öý Ý´GxƤú’ ^}UêLÈÔ ðéÕR\ÆÇ2�¬-Jm‹¾XöY&w›ªõn2öCÒÆ€­wNÌÔ¾�…É7ˆÙ2sh‹Á4f"7!¯o­ŒSÕÖÚLôãÜoÂëkÙׇ%ßfuÅ+÷vÀ+y2‹·iäÙX×»ô�[Í­ÓtXO¥î7† ¦öd£òØ.¾=fpÛÙ~òÉÉûÙiH‚x+«½Œˆ1tÄÞYBÂr@†½¥Ú#C‹çéûi¢l�_+µ²ó¬T{ D‰/«z;™œU&?z¯¶õêZÖîÙ¸ó‚ w™˜9 ípº &Çpã-Â7¼@ÓÊ^uÞb“OŒ‘e!JÕ)RÜ«Ü&ã6µ‰ÕzÍTY�º“Éäì—›TÜ0Y$î¦ãw¶?fæû­)Pg¼Éø”Ÿ.f-iª,p;aÚÖ¸0ó!eº3·Ê,Vah`×€M‡Šç»Æ,MÛû6·ÕãðkK¨‘«.«ÀVïŠ7´Öý ýe5­:M͚캢íÞRÅpª¡žŸå¼%ÄÖü±j/ìvS¢—8Ïo†æïFAe£:+wFÔK“ÂÓA¹ã ¬¢�ÂôÐ1›ÄBëKÜFv‰™kËúÁ{Ð#&/6&âÚy„–”¾£Ê·ª *�pôp"ÅÅÛæMAñS6ÆñLƒr³`§Êjû™7›&ŠAC¡Ô©ú36‘aUصd[‘žµŒÚA“$Dy úsP»Ƕ¼UÇ%üœâR7½£g@^|†Eæíªñ‹Ê‚ ÌoÛÐ#×=ÙMŽ&„.Ì[RZ^ )¤š¨?@W ûߌ¥â­,ص L{p#õá"Ëh³‘‹Z‘~6ÌÍYy`Ó â´•%n¿´¬‹Æ¨¸É½êà<á4(j �Œ‚®ÅÆ»UáÅ#¸‹7ûQ –¯}ŒÕwXÕð)�¶å®Äj{òJLÍoàç¯Â/³†~k¯c•x_£Î5º>ù÷«7?Œ»pݵ‘ÛˊׅñZ�5cQºå:÷l~ÖŸ[ÍÎ\Þ’¬xÈ^‚ SJd†ñ.< ä@òå´ ØHà,j×Ñä3��¯ÏǨ<2”$�þ±è}GŸ5Ihýè –7Íј �^’V³¬5‹Úú.]]õ ê˜D0¸œ”ZW#Y†bE­¥¨) Ùñåô@¡B ùÂi¸©gG�b‰¢{ºèôð!œä©õ¶›¯WÝÆð4܈âè숚¤öj©Ä»²‹ãrc�ÉÔÖ‹\<°Uý:p�Û–É[5€u�o$Ω_¸Ú‰J¹‡¹²k¤ôµbwÐ�…Eù ¢°ä)¨R»“ºtÖ,cZ¹&Ïv8>à;9�Sc‡ÌŠ–éÕ²ÍÛäÌøë<µY–fö¾Œ†æí¥Áñ\^4lâÐvÌ#(ÑÚ~ Th(ûêYMbØÔÎuœ«š§{üØ]Å Ieñáô/3‡F³kªJá:;�Ççî546`îò}g¼†ÄÔ¥�%@PaDÔüªù_g¢êãyÔpGÔzQЧó…ýlž%÷�9òdtòO:xý>M-–œ4?†9n„[beØ£P[ð@d Ãþ&DÞõ{o�ÄZþV§¸½쬃bžöØèÙ/øjäüæQEi3§Ÿ³C„&6çó®¶â^è˜Ó_�¤)ÃÛ€dϸ¤íÅaWŒ–Õñ†Ôëôt›¶€‰õ—¤=Ü =Â“Ç¤ÇØYš’Ñh@`{ENžÃTgF]Λ¸ …Ó›u.C¸QX%ôNµÜÙÀy> ǃÙ×nò›Ý�65Ьu‹=�ÞŽ²�‘žýÈÇ*t€³r!iÏÂ:u§Ôòê]°e¶ö>BÙ“r±=‡•‹{mŽ{¬Ûux,™P²Ø:±¨G½Ù ð»‡ÝÉ.cd,§,®Ï'Ñ™ñüð™ÝÇê~vñ÷€W–ŠÎK˜ëæ²Âf3�¬à%»¯žÿ}0{ݤCA´ÝÑg÷y,Ú›KÜ…ßÝMD A<›£¸Þ$›.’ø;¾k0gëÌ))e>Ç%r&|«rÊÌ# ý @i]dãpõrà0R-ƒ¢£Ø·µÕ5y×l½£æ�’îÐs…óZmи"ˆ~)ø*¶"ÌéB¬H;¢]âKi©C„íIÐGbÎáâ.!R¸´ÍcfC‹‹Í÷ÿ¾p¾ÙRÚž»¤@´Õ©­³¿Ú�ß×?µ¹Òí~(d]}Œc’õ+,ýì\*9äùrã.ö^€TA¬Q§ßnÀívê¯} åq—{Œ«¯¨5–ò�`z°èk‘õY>\æjZ> BI·™³�:V-  ú¤aîÛê È¿/ È¥l`ÊJ9¥@ä�€Çm›ÆË¶ØD”ã^‰Õ?f.@ý¼žóú>cëA�Þ÷Õ4nLáäéÄL³5�OŠV·NlWóîA…­´èÙ‘>+èî—ÎÌ)Òì]¶âwUp@ÏÜšÖµp�OáðwÙï¶+úO€þHσ�C†å Üw,Í âš@"#Y|N(q½œ ažc€QÒ&ÌÀžx…Úᲈû£üýøß“ÌpoŒ|äÞ+É(�n—›œ"òVØ.kø¨¯Åé äæzœ7Ò'±ª�öºÜrµâ–Y #rQ,;ßÀ=ijŸgŽ�o5A N:KᑬS'“ĕŸìõ®¯‚ HDRƒÞ‚�/«ó>‘Ê–aB#è ê³qŸ©Ð@­½õRkÚiÀcbl€kË€Ñ+æ/­á‡ÚIΆÇl…«0 .«A…ÀUæw4æ²HÒ–6<™¢°Ô5Ócññ G¾ˆÁ{¦ºd~¢äñJi‘#‹0'evlcËÍ�@<^³»V‘�¾"'äÊ\àÞ7¡âШÎQ­Bà.XŸ}-޼ÖTkCí‡cA¸%Ö ¼ýqôB}÷.ó$+ãöQ|/»‚çõ‚ÁíÍ…ltymÊN¯%Þk"]&y& Òï&¤!nÖØðÈ}ß#¨eüQšÊ@,Ö«šÂýâ ùd{V%üe�é®gÞŒaÓ€5MJ ŒŒu�©±§~ruž®�9Óâ¹æ úôÇXÃs*Aì‰6�Ûº¼[;ÞùJ "m¥ß«3†„Ãc\·âÅi'¹\íqbó’=c0Uk ã`Ó‘»’ã¡d‹0 mÚŽÞ|¥ Ú2qaÎú\ Ý1 ÖHŽV¦�"Ó�ßD¼a‹ÀC6ùŽ@�2€�úÆ–ÀŸ 6…¨º®vÕsM» ­ØãuÛ»�A�_7^ã z2æ8ÈçäØ 8O/)›€žÕjugú—�k�±5´ë:@�°`äuÑyíše`kq§HÍ­›*c)Ñ—{p Õr%¼€ÇUv`ï%È®šÆ ÐÂ�O O”Ì`44¤Î}â8 ¥zx O“‚¸�.=·{àK�@Zfߛүrc¹"|ݪ°„{0ºº6ÅzáùoÍY‚ðackÚE›£z:×"T3°À;c]uÞö›’vÉN a¶I9‡\äFÁöjw7Ø«Á#¤iÓzÆ‘²@¾k æ¾bú)¨‡²ŽH³Ø]ž|<®Ü¬[æøyfä)R{ì?€ºÕI"gñpЛæfÀ—†lH~ÑÖýpá¹õÌ�9O…Ø–ÈN5ÿQD>ºŽÈK¢sAé'Kð„!ò¡U×3�ïöKÖª&6 zU PÑ{­W×uÛÝ‚_Å8j‘!ƒM�u6Ì]m3µÞÏÇ)b1'KæbG¯yrÇ5ƒ,!Р—·`³ïuôbçBó®wçqÀX°˜K¨ ½9`‹žKš’¨ƒ´¯O;xÌP79P¹D’’žot„Ê*I¦[�¥Îo�]©g{B†ÈÒ¨Í×ðï šÝláêÆh„VÎ?sÞDFÖ8ü¬½o'9¥PàD •RÖz5>¼vIù_S%¡äÚQM7x¢S€zé¿a—s¹÷Ë„ÛΦp}¼68†œV^­l¾Åé>�Sæ0¡ ³ÞWµÖ ²l²ƒ»ÔV1FË Ûé]åy«Ѓ0`B1¨8ÑãzÌö‰šÔv,¡:%Ùjõë[">´åKuÉäl0„¥å:,¹6ØÑ/oJŽ2\±Æ pX©@ÏO¢Ky6¤@ÓVÐC\nÅ-*Îiè½$ÓèS£¬¦ ªøÄ5�YÆnëM¥§…°æ‹&<‹…�pH`b¾0²ñ»ØÊéµ+<_a¾^b€í½ÏTü¦ãÉù÷Ò¡}ÅN�ëD�©&¬#`å¼û´î,éÞ´‡6™L²ÁP.±ƒ"áï-Ó´ê’ö± {£¤ð~%È{Ì<ÐYÅCa­Üø¿R=>?G•5­žžãY�}eH û É|.kŠÔÏZ™[ðkçtwˆØhaA.LC1ï|Eã`Ëz8qâi²^¶x×½‚€å‡(Óªpâg{9{ü,|Z) VÚù"~ëV L4%ÅÃE¦-½¦å¦.Q�ßulâ~ô5«_¸e¬�¯µ¼�jÞË'xõ>P7¸"¬¤;d3€%¯§O »}—ž-Þ!|�<ô¶Û\çQà+«9¨®�å¾³|;•ö;¹®^¬jàçea±,696ðD´Xûê ?È#�ï77»¶ÃÍ› Pì "SMgJëtk€ºûÜ‚ÞÁÅî¡ô²¡Êúrƒìë`ïÅ&ä¶‘ ^(WÞ´Íùál`šêÖ†9¾`,ô—º<ŒÉtŽÓ½^ 7|?5œÑPCV[.‚±Ç]ˆrÚÀ‡Õ«•Ö,œ‹<œ ÄKGƒ ºCZ�íJfÂ`M]Cüù›:á5ƒ£JØcÊbBz&ÐHj0¶ï:Ëüô«cñFöPïBu°Êß…�Š0b¶©#“isç‘Ðï BAës;?éÂ]ßå#›þ޶;БG;ØOÆqiÌÍóx´Ò+—ØŸK؃á^`àœ‚~ZÍûÅÎÀcBÚk%û¥:«ñ@Aí.e44 KÐ#Mçe!F~]L9ðX*&/pOp]�O86rXz1 t†Vá¯K Ø4j˜ip’ ÊoÔ]PÆn€)|ƒ¾XXQâ1b@9ã¼™Â7ÒR.��‡¶Ýƒí—/Ò|ÜQ{ì¨8ë�V¬$Æ„á? \ˆ ñÏ4§~%ÛyxùÒþâNŒAó°IÓåV°_?ŽÛÖ%¹ÈÆö\³æÉÛelT�rVUZ\› nËÓ«6ˆñ¹àG'-¾ªH6ýÙCUo´Ë¸r`œ§žtÄsŒÐ��ÕÀ’îçZÑð^•¯a×,]µ ȼ±×‘~²\÷cØE�P´�z#ÓÅ™‚µ£:ÎÅ1.Ëf§jÄÈ~ÿ#ù¢3Üxh õRE®[ÜCØ·‹_fÁIó^Úi­õ’ Ø:Ì ¯BÌNæZ¦[im0DG»uæàdn_çµÛ}Ó^`®P:øCÎû¶-­²ŽÔ)MÃW6ÔxÕYm˜Z�gˆÆ¾ ž‘tÜÈÅciÆúàB6øýÝyóÊíä8$zWú˜T”ëmóýœ·Æ—‹Ó·-Mé‹CÅŸÛÓu¯Fà&(WÞÙkì0Y€‚Пïԕθ!n\†Îèü4Þõaµ‰ê~·(�½ô8vÜ·8½i�!dêÿ&÷£år3ÍLo^“æjc^I:Ÿ¶N0Xñ˜øÞq…¼>u¶~‚AÈ Ccë Ùd¢'[Çë‘�¿³ÛžDшŸõ‘¬¼û;Y°sá¶šÝ�o“VK¸¢õl0�KÚEôäo„ÔŒ–0 A�¦Q" )cÇŽ"0v¹^œ¡ñ8Òë«’ÙÜWÔ¶®¼²Ébé{⢩öÂ*�3Õ òÈŠes“+¯e&'_–9ŽýÏõó�νÂÌ­î„=øy�šR´ ´ÍìG¨?œ6´2¦Ci|$Vtºü›ó;PæÿµönbC¦7b‹e›�×ýêÄþd ð°ÐM\ÞÍtÉo[�c¾M¯“'µ(Bɧ‰¸upgÊ�|@´#—N.oØÞ`ñ6Xàjþßé1¾®BBø“O#4kB– AŽwÊ9ÝFj»í¥*†Ši!ؘ-aÀG‡gÔÐlÆ„¼–N²snp®®'¬×ɰÈcmH¡-]¼“ïxpǘŠ�Ák0)ìdtXQCÖË}�ÆŽ/»‡|ŒTã'´¾®=³n£qÛNÐuÑ®äEG�ÁÅMo‚ X8˜Ž^=mšèç„è<­0š§®ñ>õ¸,~­—{ {¡¶¯¯¾¯dJÛ ù–;©î3?£ïa!¬~±Ö<Äéy¸ZZt<ܱN÷%$0ˆÖZú³]àXû‘Ì�pT-Äï9a…ÑAÃÒÓŒ–ªížûœn5Š—X'4¨ÔÆÆ7(»åñ†dDÊ~+eáø!ÔvENNŒ&œ¤\‚â ó<štÙîaJ½ytµüÁ{ qq3A ËS·7Þcóö�­M¥[wp]i¶s€9zé·ê@Ê”#öTgØ=Á—|%Èà6#âzƒà·²Þ±{ ¶ûRw7ëªU‘ÓBYø² ×2Þrʵ›Ã!M�=^ÙN3û­kj黑qÇö_®%îØ°3]ßÏ>Eâ”ËFíâŸèØ®Ê�Ga—8>aá’¾÷—W¶§=ƒÕº·¿zƒá!èƒã1ðc°RÃ)Ý4ñ µ:þ˜èÖ#]ã™ö+�š*’%�6ýˆm’¶j;(&Ê š±†jö˘O7òV0ÛÝ“¼s¢ÅÜoV‰µY²û«Ruâ ÐEƒ~Kðe›pl·­E-R~†¸go™‚Ù‘ ã™\8hßs(� �„l+¼�¼©ÄK‹žº;ñÏ¥¤d04¯£ÍH&�.4ºü©À,vùfo¯õ ú²Û}ÑäºëÖ½­ç}…øå|yÚ<.�%RûW¶lQøi¤0àÁv°Ë™‰_ª|mûÁE¼8[B’Q6ÅÓÆöõÞÄ>ð92óuQ*‰Û‚=-¹”´'FD+1åÓÓñ¦ n@ކ{31(�#nbýïY3’©¿yÔà�vSˆÔ§v!1,æOÞc6\Àcóºöl\,UÑ«‹Áž¦NÔ=d"�ÄvÍrg µk¬—œ½§ n]2³nJÛJ”ÚµÛpÇ­ £W�ÃÊ—¡Ç­Öy�cì˜îÝÌá=Ò¹w�î® Èfú,¿5Þ›$‹'X2Ô³€»âà÷k¼p[Ûž·s 6ñ'˜¶x×kYqZX—" 5[HaÍcv7ׯЮ‡2è£lt—¶o;À.úçáÇ{È^‡ m0ü¢Ÿ`µÒNò—9‹d< ›#Ûzýã¶Ë«$—ÓyûûãF¾¦3‰PØ?WY(n…c.µo¬f8§¾ùŠÏ¾Ž ý…­Bv“)¦+|…ÂPÇ�ÿzª÷U‰'9¼2+0¼;º~þVÛiµ}�X/@¶ o· Ä9}Ç<¦ÕÁ9÷º®Å­Àûhù›×5ñ =¾~›ÛH$ °Ê­ôW×YA!“¹±HÍ¡ÒG©mxæw±Iº¼ã-¯¯Ä=ù/–½~×I• 5 ¬ÌÜÈ“}Äþ<.ÓwöðիɼĎuu ½îʧaz»6/S¢J‰œiî/cÚðR°ª©ÄQõ:Uáï¸ÙÉ7:w>WjñÉ�}÷ÖA!¢›iáMt wV ãünàWmæâ9ˆ ÐõZß¾o¹k|àÞ/‡.ø˜ù³VÈA%€JÀ O“P80yEEôoËÄÏ¢6N´Û Tæ)qõ´Ú´`Ú÷Mâ àí¡žéÌ–]ÔLKžéo[$]÷K ö"rÊÞŸ 1ÐCq×fÑéýÈõ£Æ{B�…�þæ0•˸š³Ú¹ðjý´¼ùý°YÁ|në³ Ì�^l÷´~Ã-¾ëÉ!èKÑŠµ6Óó„¿jÀœ%C†öÐ×í;«xCœXܯ,Öñ…V̱Ð$úJòž xî;Ͷ펗I·æ`Âå…Ùø2£ÕYôÙ†% ™†¯mhòkTŒ3MÃeBQšfLÄ{­‡+¹"ÒJØ0Ë·ÔN-,ùóOh"-Ýl89XÒ" £m¤|Ü0O¹lÅòàjxô,õ®Ë?røã«C33ÝW‚×ìÛh ”iÉ6ŽøµI>ì¢ 6yQ.ßRZ¡úÜài°zëoì@*î×? yvëdQ�‚5ÑøÂ&[>îñ7Cégó²ýÖ1|€tÈå~±âq‘ám„‡_2Ï�½ú\¼ÎÂ4I¸'¡CÀCÓ®ÝMÐeuê°˜ÀZA¶Ä¢:»˜P/"ÂsVÍÀÂtâ1˜-c’a ˜•¤‡q›­�>&1Tc€ÙÌ ·0¸êã/°x,_¶Ê[‰T¶~>Ž·)Ñú: @ s(ôá£Ùß<ö±™µI }7^÷>mŠ_´A´…¬\’N¦3ŽYîòüžê &ñ´ ¸,+«{’)�±r½PøìÂêi x!Šáml׿4ÂÑÅ�¡Šê޾¨›g\Ê~©oQzxMKLäL,üˆîwÇîùÊž¿„l h\üaÒµ�~l"N×i“'_€¼6/Ûbo‘ÁpØòÚöCé_žã­™ý°ß�T­x3’-¦ŽîN 눂ý Éó)úB1ñîõö5å#à�ï[dˆm»ä•§éä‘™°ê l�K½Î\G†}Æ—s‰cÃLÃÏ~:s`Õ_©´±…‘/½Ø9·ì:Æ;È ¹ò-ŠÒÉXaÙ{øf¸® øö©âíóãq°ñß tPgr;á#²>fñžyÛx éVîxqjYï¢ðËþ³¹�fûçâ"’nÜ[™@èˆ0 ÙËþĿ֙žÙ*®ïãÓV#�‡^ÆåþW™¶Q:¦xM�,ð‹£Þ¯Nþ]8àe -XŒ Nò¯s‚—)ÕÚW!ˆÂSTbÃŒáàVºšü3Ín%Ì=€�Àw•>• ¢pƒWK¸¸tæK6<½y=b²íÆÐ…«µí¼?@¯&iÏa ûl"ûDV¶˜+Š“›©\�{”Æ|ì\ú”õÏ >7´Ùs àTÖ^¤ÞVÛÛX�³�AžNfï=q3ë[i²8[Š‚¥0*¾ Øûo´[o~·«L}öº\ïZn1œüîq>€$C)×U¼ísÙË|ÐG¸ ä¨Í’ôGÜk–Û·tö<¹ýÞ*x4tÓÝzqŸcÚñ*5já°¶§r–[¨‹—/­+‡¼0˜VgßÛâ—ÍöoiµpÁ :2LáþîÔ^EþítŸÈ®—õiáæ�ƒáÍóÐÞ7`[—¸Y§àäz9�J8Mý �Ø m<`¸o}9ÔþD¡Ùë(7´ë¬»r™ õl`A”•Ã/t3ÿ[YC‹"‘'luTÚkBÇ·k‹fÁžêõÇ}?5 �óHƒ¹˜  ÇqËÓ‘Akç³%rÀñÏÐÏj5É¿Jßû]ó?õŸÜûçBY†ÔWµÐ^ÝQxmZÖ¯B¶ø£„±o®¹Ê€ü€c°ËÊæƒw“ ‚©bn «��°\àYï+ ‘/¬Ó9Á‡wWøÂÝV®P�½æ�¨<[|FªŒË{¸Xú| ^~¬ ®bÓtJ >rø¨vÉC‚NG›Ý^ŸÝ+%°!®ï«c\gMV0q»‰�¥À®ƒq†›·â'ãÄd-XÖCI}÷»¤®Æâ·Ào„z�B¹•Ûß«9…ó½ÖÂ÷€vÓ¹œ:m¾±ïDއÊÞ ‚m—uù67$É·NQ¢À(oÁÛW}®è«|Öï¹’ð¢[áÆ9HÃñ¢hºÆ¼¹Üm}à<Æ?{\â„Æq•ätñe¾ÏqÈìüÿïå�¯±ïæÇPÄøàû8è2�ñ÷OóÈ©ë-“$Mp§è V?±•�–´“\<—L[ „ŠŒ*öÓy‰Øó�Í"ô o¾š—5ÅD_«Îéœ A7²;7 Cß±¨å·wï‡-½q»ÚÒn­�S>éo}²½D) Ñ�¢™Û>Þþ7| d,d 1 Eî~ªO6™£í $ÄÕ ë¦¥B ‚{låN¢b“�[sN‹†Er9–n Öæ<­­‘5¶ë4Û@ ÿ@¥ @)êÚm•k-SmV›U«ÿmmüÿïÿ×ÿßñ#¿ÿ‡÷·øÿ¤@?üÿ†Aÿ?áRøïþ­Ïÿæ(+$Êk.¢^”À²e Àÿÿþÿÿüpÿ»À|P <ï_(ÛºÌí£­h»kUºÙWgs»´²ØQ»h[5Ðh+ ]ÝÀ€  è Ÿ8>°À@ €¥ˆQJ PyçÅ!R¯¶’Yk¹¸Š) Ú5e÷aÔ ¥2Ð,Mb¯UŽ�tçXvZ€¢ˆ ]Ü;4„ …4ÕS®�°âîîjª‘U$PÛ ”„ìfÚÍ£AH!&•]wY±¨vÔQvÍëw€Îa³J�mš U-VŤJ ›l­€ÂAAZÚVÕ¢Jºçi.fN±AA¾ÜvI" ¦­¥[jF˜I7n$”ª¥ …ëRzШ6Â*ª ¤ØÁ#­VÛ4ª :V¨�´ÚhªÖ%(­²´[Dí¨+&†ŠÅ-vCY6ÉKµµÔ±C¶¦šª«Jk'Bµ¦vkMÝ܆¤ZÔ)Öˆ¨ª��…Y³n�S³¹Š„Ù­š¡W`h픨PˆH´nÍP&²¥i¶ÐH*ª¢@kJ—c»"í‰"&ÌRP©U l‰)J¢)"aª”•ldØÕé­­‘FÍBNµí‡ eìÊ)C³%-jJQ*”ŠTH[jÛ$Ë*‰èÂAU'Z*ìè-*÷ ªõÀ)]ã§´ë×UT*Tz ©Il÷d¨¢¢![7ÎMm²‘µ4¢Ù¢hi ð›’”‘¶’Q ìd…T—m@DRPúj¶iC¶Ö"»3¶ww(UµŽ˜E)tÕ*lZΜ´[iU;±ªâ$„�Šlë7s”©³:XÄE(媥*• .Ú–µØ×m)ÓkUJ”®îri 0Эšª�jÍ™aD�,fµHŠ+@Õ¢P Ö¤lÄ‘kvÕÙ–Úë;-’ëF´PD•ºÁEUZÐ*”¡¤’m—c ’�#s“³¶”² UEET�ª¢ªR %Ö»,4•Ù©¤¥;–â^µ]i4¬…A†’ª�š¥F�’„“³J…u’ËJŽ�DDUJ é»2•k%³»]j*EZj(šÈ”ª"µˆÍ”„¤¨¥U@ i±Óª;b¡D��ˆ*¥¦ç‡££Í•@vdìÛ­‹XíÝmÔè»u®C¶]nœ…ÍÑv.Fõ›nØTm×vЩNmP»6Ì¥­H ‰%Dªª)KYZk ×³ÎÕ‚£,‘URÙª’½�ëÜ<쓵©©Xs{qN*$R*ŠÕ­m±îÁ'BŒë)A]²¶4ª@—MR¦µWww[sƒK†–±Šª:Í;†£QQ@‰¦×YUÑ‘B­uÍ5=Û¶j*Ë $ (õÑÈHH IbT­ B®Ù-†”¶ÅBmU%m¶4¨‚ˆT×Xìj‚”*¶Ê¨JÝ58D©%H•Q@îÕ—"š1UrÌÆ‰ÝŽÖ•ë]µ–³¦fÖ©H´Û®]eÖíÓs*ªsi­.Ç@u!C]ž÷xíaÕŠu»1Ú�t¢–Ú;-Ó]Ð×@Â%]`’K¦”FÚT‡váÓ—†è)lº³*fEl §F6¬ˆºÝdˆª.Ê2i’ФìÛY�ÞÞózj¡Ýº­T€Ûh†�¨]i1¢÷w¤Ýï\Š*½5Ù”ª¢H’S­Dn{ž•QNŵRVÚ)-5ZƒÖ�]Üîî¶©É¥Œ[Z³UD•U]– WY݇²—cD‰ö×¶ O] ›ÖNÆAUTØÕVÁª¯lݸJ¹[nFK¶¤í�±*$© °Q“³®UB‰ëR]OwPT*”©RTQÓRP­4µ•/f¥*”¯mèÐ’ R¤:2sa!k*ª{8«ÓŠí„¨(*©Ó"H6$:rB�÷˜êóÏ—OwD:è÷^{}Þòêá7d»�Ç;§pï{½ÕØ|öð9÷\¼’ûÜ%õÜ—ÎÞ�Ù¹‹.w½Îïgw›Îã—_zåîr÷rö]'Î÷î»®7]#]ëÛyîÎçHžwÎ_o]®½tNî¾ë×»»®Îîùï;^õï]#pë—nuÜïwž‘îäy®3»»ïzî×Aë·f»Îó»¾{×Ç{ÝÙwRt�×ÝÞû½ï=ä[¹×réî÷®÷t^w9;ˈ{³Ó½º}Þ¯}ïOw½Þqxíróº]q9{¼ôî¹÷qIKÝv¹ï;“xû½óåîÑ5×½ê{·½ß,ûï|½çzî»»¼·˜îè�ˆ×t<¼îóÜè÷qŠñïzîèïw“J{Þày8™�j"“3 íF,±H»0&Œ‚†÷iîîêózï{ÉÌ듽ÝÑÛÒò9ŽºèîÜA;ÝG=îw^×]×Ý÷¹òç+Ž»wv{Þ÷q.t ËÞéÞy޻ίyîõëç¾Ï�ÜÞ÷›Ý۹瞯NxçÝézwºùî½Ú÷ÜuË’nïžzuæéîíç™;Ý“ÜûÛ½ßw½I>둞ç]£·Ý׺æA%Î¹åç>õÙ¾ë uÂå×s�÷t÷rwqwO=¾÷|å×îï/{w¦\÷º÷WxëǸ÷nùÂù÷]÷}zs»ïx¼8îÝÎîé÷:ìž¹î»Ã¹ÝÃOzïK¹×‡{Íì®îôë®åÝ�òï^ôë¯7@u×9w—½|÷»¾÷zî8—{½÷_I㻯{ËÊwºò_wb ½÷ß]×½ºóÍÛÜÝ‘{×z ÷»Ó»—qÞõâorêPåÊóÏ:GC¦òôû®­åÓLß\pœã ÷Ý÷Î(�Øc�»ÃÞw”mwu.½ëÏ^z=wºôÎëÞ÷º½÷Þ¾²ûÝãÝÑÓxîôÏ� Û¼õîÝÎÜï>õº/ž÷1»·}÷os¹Â.ë¹ÉÏžôwwg{׹œ—G9wSÝyyõî7½Ù2�E’™0`é1¢Q.É™2pyÛœ&#Ý˼ë½]Þ÷§‘Ýë­å¼½<7{Ͼ¾û�¯w½Î¯w¼åÜ»ç»Ý^ææá"wpîùèœãÝ×]ܺîãÞé÷o�î½ξ÷@ž»ÝÓ×½ÓÍpfw×{ÝÕÍÚîÎçw}×{¹Ë—}Ü{®wu÷�ÒsÝÊçÝ×Îo²]îò<÷¯ž>÷¯ ÷}îî»ÝÉÙ®ºï]ëÙîóÏ;>î^î¾é×^^÷ËÈ÷nqÜwvù}îúîíï¾ïž{"ù|ù÷®åïw¸îb=çßwÜ>g]žî÷uîùô¾ë»]÷«Þë‘wyç»x÷y¯\yÛ›¤½îwºw»œOuî÷»ÎõÓŠ÷»ÎeÝçp{¼ˆî®î¸÷{Ýp¸ÝÔçoœ÷¾õyó¡×º½wvïz7®w¯r^»½Ýã½ëÊO;�\ºtžíãß{}î¾—»¡çKœë®W:ytùóÎï�îC�Þ]^=ë·�‘îï {Ýî9Üçc{Ü{®»ÝÞÅqÝ»�1.»¢»¸…î½>ûÞîºH×9®¯›®ùßO�.—–÷º;½÷Ͼñ|î{×ÝêñuÝ÷n÷l^íëÝ{·=Ý=Ü÷¯yûkw}Ø.ïºõç—§“·o{žë�wuw~÷s×{Æ{ïxô�÷/nu×{ºw»Ë¥ÝÜÜCί»ï}ãswy{™w=ÜôÜ÷wƒ½ÝïzïdÒéî¼zòòwr=ÜX“tÝ'›ÞÝ�’}ÅÞ\éÜû¸zíÒá÷žõ<äºç_/>to»>õ×w¼»¯{¯uÁåã×_//}ׯ{ºîêôwN뻺äìÉ9×»¹ÏwGpá:îûÕéè/½yï{×·N]œ�uÞ»çßsºîÝs¢ç6ùÈ¥{¼ðùÛî÷¸÷|÷—žó»•Ý4¾ëŸ.iÞ]ïzº¯|ï\˾{× Žîw:íË¥…Üëμ�Æã» w»¼îåÙ£ºíó}îÊwÝÞï6åÝÞmîq„=Ý»ºï½zžît”îí}íïtë·cÞæG»¹s�뮹ޛŒôáuÞ{ÝwÏO9ÇϾ¯žeó³»™ 78Ÿw&yrìÇ%=îû®}æ÷7îºî]uËœë¸ùÞàçËÞâO=< î»ÎÍåt}Û½×Îy®õíï;¼óyî÷˜éœuî]Þço{Óyï\o8K»·—\ûï¾wÝ;ºæŽîBîëÎ_wÞîm÷�ä#Þ™‰A™:Aع£‡ ºAÒ.D¤™$åçw|¾}ÝÁ/uÁÅ×]ÙÚq…Îåç{¹p:›�;ºîáï{Ý9ß{ÞîŒëºW\®}ëu{»9Ý×xkžââºî»“vïwzêwp]wt�s¾÷Þøî==7i}×/›î{Ø7{Þ÷qÝuÞ=xóÜóÝyÜæîè½Ü÷{º�>{ﯗÔió»†âèó³î»»¦û‡wwÏ<åÝÓ«œ»®:ûÝîçuÝœsºg;½Õï={É’ç�z{½Ë—Ýï}Ü÷NùÏ|¹õß=Îs¹Îû×gÎÊúï½{Þç¼rãO»u'Þö÷»r÷wÝÒ&ùÃÝw‰»2]Ýåà‰á}×½¹ww_}îû¡|¹Äé÷½¨ù×�˦÷^zníΣ/:s½ww}îÓzçÝ^F¯r:»‘ËÞ÷¢Cº^ïu•ݸ뷻¼$îìEç½»¾÷½ÜŽ»ç¸÷^ç3‡kžîñ9¹Éî÷§M:C»Ë§‹—dé»çy×ÝÂ÷w—<ž÷.ç—žwwcÞåó¾»¼ïºçÞõÞ|ïœÇϺ뻤7¾n{¨]Òë„ÇNv]Ýrî;®g»^>íå÷Êîæë’påt=ÝåäïyÝÝ×(§w½ç^ìzç{½€¯›Ÿs;G95Îùw—óy�w;Îô2ó®÷½�Ü‘Owró×®»�®rï—{»§uÝvîî; »çow)Îs†aºíÕÎ>ûÞóÞß1¼áº÷o9Þ뛦'G]§½ÏwqtŽ÷zùç}õîŽí7q·_wo›³îûÝ{§måéyÈCÎùs“¾=uwÝï¢ëï ¯$÷o{¼ùs×޽ë£Ó“ºíçMrè‘ÓŽ]sww_w÷¯&{¯ž.OuûZ¯á¿Z¶µ_󵥪­üê¶Uµµ~µk5µ­oùêÖÙµm®HI64˜Í"’� Éb& Œ‘Á… XŒ3hLY0C) A£%!F�YbD¤ˆ™M@”2Lh³kVSkiªÒ¶¥µ©ª³jÙ¶ÖÊÙµ¶Ê«m" If`ÑašŒ Jd‘6Ù!�bˆ†F"@…2QŠ Â"hФ ² km¥T«[+UJ«e­µ;mRÛmÖÚÖ”ÖÕiU¥m©µÖÝj­®ÚjÖÙªÛêÖ¶ë[ùµ³[momµSZ¶V×Úµ¶km««m«6­iµ­–Ú¦Ûj¾µlèÅ1h±�ƒMylb1±Ѷ1±FÓ4Q±b*(5“Tj#h±Š†¶¦ÛW[RÚµ+Z½UÕ´Ö×­kµ[{[Zi­^µÛm­½m^¶ÝUkz«KVÞâh(ˆÙ*#E£E-„ˆF4¦0FÄ„b F”Ñ´@X’ɱ¤‹DSŒXØÆ4š4`ØÔPhØ ¢"Q1¤´DŒ€Å2ÉEˆÑƒ`,0ТœfhÖ€ÂzÕUÛM­mûmªõòÙ1LÌa˜Q�Idƒ&$‹�¢(ÄTÖµS‘&™šC6CaÌÂB”Lƒ"b(™%)Œ’)D„¢¤Rad’dD(Ñ’(‰AFF˜HÀÇ­m[ÛmS›‘\é²[�ÝÜÆì³·W%Ý9ØwNurés·:nEÝÅ×vH‹»«‚r4‘ÌIT7vwTwv8îˆÒbä®ë®â®N»R\5ÝÙuź:�Ìlw.¹éÌww'uÑÝg\táÝÖ]w#nã«�Ò£˜·$Š+²]EpgK›’]×v;´ë�ÜuÎâÜ.î�räë´rL›’nA�Ìî¹¹K¸·NîØ§v廓�×7Nr9G;—våÎîÛ·;¦î¸ƒ§I9‰Ýwq»»nÄ+§www,\×L‘Ýw1w;–çNîÜÜÄ]wHÊéÉÝ�v¹ÝÅÎrë»»¹ˆ¡�wUÍspç&HJp®]ÛUªí þ®¹AÝwwwrÙ.î�Äî.u Ë›ºfºîvIÝu×w$w\.ìÝÆÆwtºî×w.»‰—fŽ:wb']Éë¤\¹wGSºëuÜ»®ÜÜ$]ÆîîI\æ#»¢É¢»¹9®¦rq×vw9Äî®Ã wtkg"i¢˜!&6 …‘6ë[jñÜ=׽ޝ+Žr.íÈós%rïuÓyK¹ï{×qÛÝžïK0ѤE2I’òò/ {·aI^îˆÝÓ§s9Ìîéwtw]ÝÉÞ÷{© #zô^sWd•îê"{‹»·î±={w;»�¤¼£¡îݼܽï^·9d»ºÄ^vé(÷n™owuu&î×"»£�ï;Þî™ë¯<Òg®ÑïG¹Éä¹¹\ÜÏw»º÷;·s§uÇw4.çmç@/tî‘ÝéãÊë»]Aλrœ™�Ývc£2i{½íÒæ»Î7»ŠuÏ{Ó×o1y{º¹ãº/=ÝÏ4š é¸ïw°ÈÐ{·IÝ¢ò÷»®:ºd.î÷t�Þç­èo7J^{Ü^î®÷y)wt»ÝÊõãº{¹çæóËŽê/w½�V­¿ŸhQ¦bP(e¤�‚i0¡$ˆ¦Ld$P”™ cF�’3 ™6$1ˆLÊP0�i ”“,³bFI“0�Á&‚‹2ÂD²M)„ ˜ÑP”¥‰DÙ b*êó¾ï6{»»Ò‹ÎRlh×™çnWwk×¹+�lAwºå¼¼5Êž{Øw�ç½ÜÓݺï{�uå½Ý\§¹Ýw®¹Ës]{½Ý¹¼ÆèYݺÄG{¬y%ÞíËÒ<¼åw®åè^^\*6çKÀÜ7{¼åîèÇ/<®•æwž¹ªÚö«fµkt2X¢"(FBE÷rnA¯|íyˤrçËç½ï^WÎï½§uy€úû¾}ß{ç}Úù^w¹Òíç–ûîÓç[ÝÑ>蹫¾éîó|ó½îõ®÷yﻤW.o¤û·<÷º¯.W/ºëå{Ý�ç«Åçc_9ó—šù_}÷´o—¯v*æ}×¾ûÚL÷p£�Ÿ:QP›åy|¹ï®;¹=Ýîë%ç òäWÊò½tíïusyÎûµå¼¾[šMÝÞŸ}×}Êh/yïo—™î¾îŸuÐ4õ×-åËç{¸_9æçΚF{«®o»Þ§¾õï]°gÏ^ïv¯]×4û¢÷º7).k»·ßz/uõßwÞ¶òóËßw�ß=s˜¢9p9o¾ûßwm÷wž_;Ý�wÞň+›§–ú|^¾½oŸ6}×�¹/»×©ç]ݾwº½}Õ=ÛËœ�Úô�5ÉuÔ÷=}Þïºòß>œƒzyåî÷·–¼éÏ6{«žo3º\çrçk˜Üœé×Ï]×{ço|è/9&‹îèù]zí×w.ûÝë¤y{½÷Ñ®W¾õéÄ>vw_/»«åï½zî¹¾oO4¼ìd¼×®î^O}ëÏs·(%÷nû®Qy^r÷{½ï{ØÇËwΨùtžî—9¼®{®×No½÷·É.W}t‡#|¯—Ëä]ßzéræ¹² s]µüÛm]­_U½µZæÆ�#R¶‰�ÕÈÆdF¹¹!d£nVæ„4ˇ5Gwji'wb·ÕX¹:âæÆ ‰¹\±Fî]n\îîW9£G74c;±s$”XÆÅ±$ÆåË»�;®]×Q$g:HÕÉÝ®îææ£]Ý‹\å��1]ÜÀ†×1]#Rh©–5Ž]-Í®:vLî“¡Q“×\îêç5Ì\»wn9us�Ý¢ÁŇun‰Ý¬›\Ö]ÜÖç*år‰$’¸Xé`»»D”[—(Á%Š -Òé®mÌî·MLÔîÎìI’Ésn¹º+•ÓdÆnîl«Vk[M­k­j¹EcmhµÔ � „�#$$³B2†FH –L12RNÜn]ÝÝÜ’Ý…:íÁÝDÉÝnbFlîÛš]Ü"Ý\wrcœÀ‘†nÍÓ­7ùÛZÛWþ–«Yj¶«-[-«*ÖÕ6¶¦ÛT­µj•­ZÕé«[j*ѱQ¬E1¶[m¥ZÍ­´«ZÙ¶µÕZ–µkn¶µ¶Um-ªª[mM­k5ZÊ­UÛU¶ÚUªÙ«V¬¶µ¶¶VÕª[jÿÏüïüíÝÓ»».;wîtÝ»£µÅÎ]+‹®Òî\îç;¹»pîUÓ�N�Âã‹»��Í]×ww;»—w.ãœ.c]Ð'iÝ¥Ó»®›�u쓥ΉÝÉvíws‰uËœrì™ÎÅpîÜDEèGЈ‰ˆ—¢!D""@!Ÿþ°ÞsÉ~õÿ�½½¿¥ÿˆú§ïåeoÙ±lsFÕŽr Ä7Ñ’SŠô¥#ºÅè1²\g7ÿ]âR‹M¼½³Jdw<ܬÚS´¨�™�ÈÒ·ú'¾'ø*š¹USS”Ã2{¡N�ŸýóB»´"Q1ÏÔࢡ Œ93ɵ4Çõã�na`�G"‡ö@ÿ˜&ˆ†rÿøÇyœÂ–®%‹v,‡9 ¬ Y…pxa/WYæpOÿ�õõbsÏŸ–œEDm¥`FP’î0í[·ÅIçŒ�œP4Œ’odý¨µÙ-©PçÓeüêp�bMðܶôl‡K’éÕùnÊk)È^Þßøó%q[ü½Z�ÛrÔWþk±X3óe=ü¦¿ÕÿÈ\aïÿ‹?ôaS5Ó¢öÕ{YíY×Îy®N#? K?ˆ’åŽA �ã}�ÈŠÍ6së# Ü#ý÷€¸m‡’SÅ�ð{çÿ½9Fmj•%[”2þ\B,Òôý²n�²¤°Ì)6V,F‚èQK­ìe›JâŤÿ9ØvŠÿ³Åm3—|âÚã¾4Ä ¦1d[óf­D!íÐÖ0u†OΞTÖKQ»P@­�Ê2?OÒ†¬‹mú3¼ ²%qñGÆ7�+ÊÔ®\ÌtîåM݉°D‹e™¸9k*­Š,�Q,c °„zUämv}PÝrðiD%žZÇÁ T"¯ójÚßûkÉvW3æ”f Óöè `­˜¡ó0yõ`ÁÌ…‰¯�KÁ3˜ˆ¶J¿„Ã2ü& . lš¿„¿üq“rfˆPâo˜×)(!âœZ8^¤“‚JvU·A˜¥ÈÝÅY-ö¸é9Öû[:�ß俼ŽnÕ|z£4âÅ«È4‹g‡`©ät4 §BÞT�ü~DqŸ�³‡µÇcÿËà$ ¾N»í–m3¶+ÛÍRã!(¢˜%Šna^¥ÿ’Üß÷µ}_7¯¿€ßS-b® )ÌÙ¦cd9@Q¶v´á&±Ú´ò”bøis ÌhÍø[â(*ßIMÑ%nÆ.�Î |"+påóÆ‹&”íSŸúïGXjßá��\”ÁÉÿ–¿4 ·7R¸úî…Æk¨©– èa½™sĽ’„µ"=ûÿoª9¤ÒºÎŠk •×kc C�WqÞ’u¼X›ØÎ" ¥�ö¿êØîšžò4űuÙü„G¢t€«‘¹IKt¹EPéß÷Ï­W¼{ml¼^ º}…�‚G={EnÚèè¿Üʶ^WxMNF�Ȩ�ö¡Ý¹7m£<0¡+5×x ¿õaýÝjí´É¸‡YÔÿ&ý¨�—Ðññ³È>>àÚ¬~ gìq- !ËJåÛÛvTé›·,°»À�ò~G 6š³¢ë屋^&aãµ-¼øa·«â·ÿu'œt4ò4µìæã‹,©Įéò"Šüî‘—(¶¿ú--‰þÞOs¹çØÉ>7/½îlZþYÙgú’"ìt+yßÊj¹Ò€ÿœ‡ëXñY¯sA€„�­™·¾n¤íuß‹²|&¿÷žŒ_|¾±Z †¥SƒŠYTêZº1"hîX¶Ÿ÷,– ÿ.;‹8Ûþ_öã|^§ÑY aoÂM—l;¾*@´HÌ¥Z{–š•G¿ž6XÍÁ²ÔY–òØËëYšë�LdL=bz±§õ|ì?+<Áûn,Žìñ·T=6{ÜP�“€‡Ü¹å¾*ÆÈ¸Y±”k‚*iF ŠÚ­àh°4pMç*>óÑK åË�è( o¡›áxgª~�øç6ÌbÛ”‘gq¶ÿí·ËJ€�nàƒ)‰YŸƒÑ÷›#gÆèÁÖànQ)=Í|E¯V/�_‹µÖùû¼Vµ¬œÈñ¢w£]ÁC“ä4?Óá‰iu$xuø�¶÷�e(,©&‰RBÀ_-ÆÎU�!ÈÈÿá#2h°{rŠ")jÑI¬ˆPÖÜ›*D±o8ˆ AøÍ?;{Ÿ§�qwÍT¬v�±Co³b`„øDª 'Ä1äA´ÉáNCÝeÔS)bܹ•*°k ¼`²4sç�ª”EâHI†ª˜Jôé}Ýþ–%ØU³ð[Iv`߯ÆAkA_§åK ¨š¹ˆ�—þ–…L' –œdçýÙ]Ü®›©3,Ö5–_ ä0þ¿=ò"®AÁOycE¸}‘mkª0ñüº4 J³(hÍÙQÕTcZ�¢ãM¹xJ|O'GQ‰·íÔ 9ayqy€ù�­ƒ¿É�q"âÆ½ÿù|¹ª¾F5¸––if(¯ãè¦Ü­\IÙbùe/Þ>@‚I¹Rêm¸ ÞmôŽÿŸ{©+y­�±G½·³õSb]5ÁklR¥�4™‰Ùʆ 69'@þ»Wšš ­|:Õ£Rƒ‚osÖÉúNÔ ÓTø@õtsDá`ÈqSœcNÝl Kþ³u�:åtõâ7¤Érnn$Á†æñ6"�õ¸þÛÏ5; íšýVqA]0d wæÊ¹­žý”Ÿ-”ÿW¸mlÁr©¿ÓCu¹CJîñ�n„ÿÛTΆÛE6…|ðré»uf1î«#ŠÆ}Ê»“L>taý²q]Áç¿#Ž×Ó;É7Wˆ™osgÞÊ�’s³­ì–± ‘aŸè7A|=ðCÒÿ‘Î4¾ôcü¹=°mè1š¦ÐŸœ)f’NS›½Ö†ÙÁ«ï!ÔyZçȱ?‘¶J8Žöh¥÷j«èÜrOS(¢ 1¿dm²Ó%Ëom�Hªäõ�žfva¢�ý²“Ã&„Ä{r÷WßëÖcû¿�ÍZ+JåònfEðâúDÒÒ! ûd\ò;#MÝpÃA“ɼTÁRïˆ_MsÇNDÅww“ü)s~RðƒŸ#aɬG^ÆÀ@�SoÐ&%è•�ç½–ÌøØlí5÷j“’ý ±žŸìÔ½tÊnˆT Y{$-·ôÑE±03ƉÎu§oú”Èî;ÐwZÊ­"Ÿ4$‘dãã�lüè³¾¤7kTX–|ïJrÞ9!±½2ÐîgÄäd6§4;�¨ÙŠ3”å"έû‘⣴Ö4ó_f¡lúámÖ…T˜w ;s:_6µàÞ Žc+C@µöDÂ8½*X�‡ml€Ÿ�œo˜r‘›(>.ßp>Ïý_¡Ä#zqz Cù½¾Éç4ŒÈáÎj®e˲ßÊËN Fk80Ù\XryÓJ�‹¡ªhù¥��bôvûÚ>ºœQÕH¦í—( òq”–]Ë“xM�â!yˆ6[llUÞ 6ï¾YÏR†àNÞ]­D›EÎlæ*-T$¤ù¸É¼¢ìۘΎÏ4I.×fMÖ‘ožŸk?_¯ä[ Úñ¥-Ôxç�±x� ê7ÊBq~èíµ‰Tnqò B2¼q ›P^äêN:aOá›�†¿ƒ7ç8¬m*ÉÐ Ãôñ5XFL&ÓRr/q#]îíaÄhxÿ¥Å^Ð^¥Df•óéÕ&[zÍ),ŒkE>Gz Ÿ—Ó¡f@ÜʪP:»i5�¼jNé+l»cÍ&Ŭ5máJ]ÜÐ_j 0)�½³%i5Óú!NƒÐÞMJœ j®&åç�L›7ŸXYç�ƒ§PFÒVÆt ú{³¦¾QFØFÊÞ¸«„éØÒE‹E vŒÜØþÎf£)׃2ƒÂûÊñŽçÑy·‡þX÷úÏcW­TµªÝÈÛLJ_'ã¬ß&O&CÏçMû}ZJÖ bˆÕ�’âÑ9d¡8rÙÏãägÏ*¼dXÞŒÃzá¼qÜŸ„£hàa(Ï÷e´+Çã!ŽÛ ᵃ Ëß2eŠÑßÔ˜¿6 dÕœgêv­ÞN‰Çl~IÖm†0„ …èPÄ­)1¿¢=êÖ”&O£zæT‹Ò/µ²ÈÓQcüWVK$IÏ�lU°Y‚~Õ£Ón÷zû~Ø>_Y®Zà—–a³3öwÒÛúnëL Þ¿âjÌå“fÔm�ÓÙ´k[�2,»,[�×Íͤ®p·ñç<—"±A ºÞ'÷bt Îòaü¾D,Î=‚¦« Ð\ÒMagfÎ7hyImóì­�:ù�k�­ù¼ߺ\ztyTÇïŸ�o?xJ§òéïð­ï­÷:­›ÌßÇq@ĘÄìæ1Gu”ù8->0©Eù#OªÈªbèEÑ{Ä¥ûóFÕW‡¸+a‘@cr擾‘!¬·øÆFºÚ{71Gwó/¶×ÞÓ†p¶ÞJÕ8ÔòpÒ:þJºâw³ È50íõuµve³J2‘uc+š çæ):f\Aƒ“ŵSº©2·ÕôÕ2¯4Ñ„(©Á—ü̲ظ£Ráž^ü_L~)X¹ÖíÁqëX{؉ÆëF`vIjT«S{dªše™aïŠ'×ÞßÍ•¨zâ&9hIÖ„aÁ½Y€QD“ƱLrWla•œ_O‰UŠm zÑ¿_êXÿæÑZ^’5ù–˜§ý¯ìîÆèE´Ób“»®V›ñN�ãnÁƒbÆŠd•[_`®#xL—γnþ{TþÈ#òLÀX³P{aˆÂÝ8…ºn.¯Ë´ÿÉÓ¶çåË"Iuß»¹qºúÛÕ»�kîšÄvªwKÐcýÂtøãÙ­¿%V⛳gÿ‡ÿ01ÿk“á:¦$Aþæïý6ÊÓþÓ›¿ê:‚Ó%OH1z7>øeä .’2>nÎ`89)<ÓcÀñÃÑ�Bº°<†®÷˜Ø k×ñÊ·õx{~.~š‰Ñ=5¨Ke(:j‰¡�î>ëÓ¡hcÐrG‘+8#X8ïvíTÝ.+lòúUeœ|éçY“ÌßL ] s3úˆ²®öˆTsÎí¼½Â#y‡ý\线« Ø.+] Íº­nmN|=5ZÈÅ¡F�&@aPÙ�ǽ1ãÚÔ˧ƒ³¨< k‘u†5ÑAד=óA�™²Õ—C¸FLk/×MJW–iÉaw„Ì?7•8ŽœiG)¶)ß}ÙÌ�[Ibòíê-ˆ‚-“ϋͷ­>ª²‰5e˯ß@Áà¸C8ÍP$”x{VWþ àkñõaÁ4còyƒݯ™â6x²‚Éàø1q}(»å[VMáÓ4òƧÌ_dšÞÔ¨BÓnÚ ¿¼ LW7| gî ìÖØ´9ƒ›Wf‘¯Û)Z_iž=6bÀ«¥à?puéá}7ˆ¨Õ®=L¬ƒt‰¿ê/m½Ón¤SDQE?Ö;¢Aîˆ�}4ýWR)‡o°Yœwhmùãf(^sóó²í„ ‹×grÔ§øÄÈæõŒžøzn‹v0p·� etH…\z'ÈÖ¬>>I²�!ˆêCß Œ7AÚ&JÁøB÷nŸÐ²™Z$]"éÙžT3«Äð¹PZ5Ø ½–üMXIú)¡ ݆G…mý2®'Ë \ÊMí³Bk-4>–h3«AÌ+:O[?¤àõ[kÀW½‰Yšß9žÍ]¶Ç1g务½6±WÝ>˜Mëæ{UPo쪖HIr�LOàÚÓzø¶œK-¹ü”jà¸Nòôb[ßÅ~êÐOº¦¿«—ûzM5{‡¶éº‡1Ünð½ÀÔÞQï¦8M¥]rË¡wŠŒ™;é|«ÍXŸ0[WëÍÉxþÍœ¹ ,�²Éôá�¯ºNK;“D @(‚˜£XX¸X\‚_^‘~š¸Õ)ú»Ÿ_fÕí¥Ç�b YÇoòseí.Ծà �4Ö¾Ï>+*¯&`ËeïU)¿×Py«™»pvŃhjp¤ ]?¯6íôrU¯dügÞmȵ”áé�]7´³@Õ¦TýÎ~È Ž…³1ôC�¤a™ËÔ—T�^GmüèYfè©*~ñïÀÏš’™˜\føŸ aÇužYIôNç0báê~S<ê/ºÍ§»|.^´àï.¼ &q&óô¦Ÿ <ëoã gxéÑo#é¥9XËî,{¸?P›±TNS\Æ#g¬Rª^¯{ŸDlîWÚÂTÖ—ÜcžÌ7WA8zmîf²õ\ÿÔÂÑì¼]}À8"Ιy§ñøv¤é8ø�ñÁÙxZ¸Vµ,8V=´ØÑy#œ8^…‘Ä ÖùP»¦Æøö<ÁỞjd¶´‹þ°8«$…ú7è³Ýχ<ŒéBD`+ÑzrdRï¦Ö*L‚;˜ ûîže˜ôÿi�ìÍ�Ò“�>[oÌ›á8[Å ¥ÉSN¹ǃþêý;ûÄ–R;_ fX-«‘Íj©ÌÙümDœA~m´“}ƒ À Yz/™^Gq¼Mð[7ì´›âÓGÆpù9�A/¥}Á’]R*bqèuî|4~Ô "Û?ñ-ÓyG©ë;w\<¾êb™qé«Lª�–ãË˧·­â2P1q³Ðîfƈ×Ï#®%åÝYœÌ%›sÕ%ñõå�üw[㮦œw²ûkX’nwÞÏàþ�œÀdÚF'Ã<7N-ìZ›�¿gy“(PàψÓ£ÁR*4×3’£gÄÝNÆÍeèÓCϰç$ú‹ü®æô]xMu¡?ÊÂ7¡w+vÛ¸¼ä»h:òìçÛ¢ Ìç-Ÿm£Â6ø‰ŸÒ¨J}Z]M¿ˆìg–P`ÓØÀÉC?�ü³z™Wµ#g‘2‘"œÂ�X´ÙábÆ™ÒCmxúñòùà`¨œa²¶Õ1¯ºïã!ç2èdD~/Ùü÷Ù$´éÃöë2 ú6r�ÌÍ›­ÜÑÂYa}É´Ó›M>vfRòGS»Í–Ço B¦£«aœa”y—±BÓÅÔ‘�( ²\³òèÞ] |µÅÝ×ö=ë‹xýô23˜¶ö.a\† ÊâsÞ‚OTË“�Çt›xAm’͵<—ïÏ}w«L ÷²ŸlÀö,p9' qF'²øøì9ê‹:ÁÞ34^òêÁÿ9ÇO!q3‰B8b;·Y'¾8›ó)Û�ΊîB-ï€Kã;(•g¼u×ç­5©'¼™¬¼°½&NéаÂN[ñ“â�Ç9†jØï�“mìúó‹]Û «¹ ög#ïß~1¯)éº{àÁ»cš½Ý»#I”÷ ­•"…�€ª;$n™+çìWé|ÞRÇ·†9jt ]!~'0�l1]í*Ñ I¤è¡jqˆÂ-g‡—\8++kòÚõ%° ßgèñHák×í“:dSƒá#’}�Á³{ÅÚÏ?9‘*iÿY¨èj7ÌA1Ì—¨—Õ{6öÂûŒ`«ôîãrG<ˆ6ù•ƒ”£Ù¡Ì*W{[¾ êŒëþû«x%9FB‰üŽ2eŽcN2ü¨t†*&ݳ¬-¸F»—_ïG²”ñ¼[ç;ü�ï‹l~º|vm.qÑ@�„?‚´âuZ8JÖ�Œü|`Ï~ó§ÖÜY=m0™ B•rT 8ùÝœÀevóL«²¸æÇ­m÷ø]ï4”Ã#üâÏá›&ø;ÆEÄÞ¾ cg¸ëUpq(K¼‘¼ßÎ]g�ó&;"ħ€þQgŒ¶÷¿yOÖ{Žú‰WPí>,°!wߛö°ògÕÛË|l§+ü—‡¿æ~.ý×tãŠö ¾Õññ1O ë—š|X cÙ¡�–ÍH¦î“ðX‚š¥1®Z´› 䔑Œéã¹Ï@çŒ�Œ2až‘A•¤ k<Â÷Ëjd (‘ãQ�&÷Ö1G7�u�Öóž4þ½%äÓ-]éùÕ7®ŸÌåÍaÃø°*¿�s†ƒ3ËÂ7Î-§.TÍ©¡«ä+­¹¾{*W™JÕ/ ¦Jgl°LÑ>ºå=qÜÛI<}žÚLc5ÇFÙ7–9«™£Û’ådõ‰B]Y‘‹G¨C•ˆxõrC›±6 ΢¡z}øõ×.ãß{í… ²Øt«Àfqǹº�•7ãg‡±É©T~œêMZê…¤²ã]{ªÙé#’[£9|‘ÉÐ8hÍ8+ÓV?8:Ïâõ™aIüø3À2×êÌDÄfÒã†×Qdx;uû‰^[îBs&†PKM e¤ìyµ8«»Wœ‰jŽúHv¼]šŒi'œÁdeaùÝè×¼múìÈØSCt…Ùæšm‹…A�v²Ó"IšÑ¥ŽÂ×¢‘5–k:xçDƒ7ÃÒèöŠÞ;^ö“­kMdÜá$C[£íAãýM_‚ÿ—›¼kaÃp+Ë�î^w£Õ(ýNÏñDö�a¨º¶‹{œòŸ]h,+'·2`-xû õ‰ì=¿Y‹gÛÎ2 2Ùû·-xÌ+v,9[ôÞ†¾-yCÞWÝž,5Äzmø¡Ç¶Â•¼^ébDÞújâÞ„ ®+笣 Ê‘ágÔ%·q_“ëÞkZ5× †Y[ÁjH/4;Ýœ;§ÿ9á°3À�ˆA÷Õm€—~[‡G|×fêcÅΩwzp�;=Ü^&ïoÍàÇTg@dT-ù… ÜBÃÈÛ˜£Ì¾si„õdPnå®9Îæ×œÏùû&²øö¸÷É;d y$‡8jä1(I=Aœ”éù¶óÞ$›%?ÈF,ú�ñQ\æó¤fxîP“}êѱe$òë¿Î 鯾× Æ—ßGã¸S©�þQðûï§SûåÙ×q{Õ†B•E-É£S0‡ÄînbW±?B] íÕb,Ý þ¢Á¦¿G‘¯nåº`C–9˜äk„Ay}©2ÌÎ:ÌSVuåëÄ+JÜtH�&í2¹ÀóÛ»·.…Kïp7S™@3w�uyU6³§ ç³Åkɘ%%Úâ°„¢Âº8žâ›M~2à!in—ÃêÌ? È"[;‡œ¹ØÅõos¿ˆîìn vŒtwÐÈ~ˆ"2e1TìÚ3�2æ¹½¿jŒõ ˜ÞÄ‚%áu×�$³Š±Ÿ<ðÜçƒØ`„¯¤EF2çüÅ!Ѐ„€È“(@C‰’cB`¥£&0‘‘…2R&2)�b‚HÅ ²d˜™£"H(hÌ̆1˜ÀIˆS&!$"šF@IF %f�†&!B2e�ɈˆHÄ4‚AI0HLZ2Â4™„�3c2 H”�&!hdB”S$c(ÒB�dE1JQ£`È0¦Œ€&‘‚,Jh©Ò�HŒbY¡,‘™H’)‚"2�„P2Fbb„‰šCL¡M!,RFLM1’!c!™„Œ¤Ìl$ „ Ä4™6I¤ L”™‘ DšcLALÊ14 BJfHÌJI$‘cd¡C HÍ›I"2H€Â‘€‘!Œ4Å3dÁ $†i„ÉdÑ3c@JCC„Œ0…˜ÈÐ) %&0ÌEŠ&¦#!0„eM& Ɖ ”˜€3 D˜¥#DH£L! L#10Œ&Eb™@““"h 2™RY%�(Ó KA›2Í%“dˆ¡ # ’ ’4 f2@H$(Ä¥@–2Ì„›†¤ÄÑ‘aÊ(‘„È„”�0DÈb¦IˆÈ$4)%É2H#™J ¦cdŒ’Ì4±FÂÉ!@¢f 4Q2dJ‚aL”"P‚Ì’S# @RÁ¦1 ‰h`ŠXšlÒFdš ¢šbÄ) ˜ÈÉD€„`• i�¦”ˆ‘%2$¦E!“1H“(Y3À˜4ÌbÆF&e¤hFd‘± !¥1I(Â(À €f”�(@Š0"3b4lăF&Í �RƒJI1&F!¦ Œˆ‰ƒ¦�ÂDMR`BldÂ`„“ £6%™$2&$Ìe¡„HÁMHЃ!,’"2”2"F)Œ�3,eD‘ƒ0Å4d!$†)D”ÉI†#HJ  3IhÉ20 ²„€`ŒÙ$%�¦2Éb0ÐK FSI˜L£ab’ PAJšDL#0ÉH�¡›HȈD¦`LˆÀ%•L”ˆŒPA‘‰aˆKÊ,dˆ0Ó!2’ˆÆL¦HÙ�0P“fD"…‚ŠLÈHb˜)PÊ™)I’`‰„I"¢1ÈÁ¤)±DHÉ#$Jj6ŒbÈ0„D´‚dˆBBL”0ÉiIbfIˆ4¥"$‚JLÄŠ&‰"D‰&@°¦"ˆ�Í”$E )2@ €�JI–I�I�f’Šh&FÄ’D£F"I�4JBBÅ„Mˆ¨E2’�Hi#4±¤�4e)¡€ˆ„+!!‰€2H&ÈÈ�Á�@„¢XYB‘(È c&ŒÅ0‰ A2£ 0f3L‘@“2ˆHf‚Ȩ1 Ì–I‘ R’˜„$$dÈY°dÁ$Q‘f(2”Øfˆ�DP"Y4� ÌI ›I¤ÄÉc Ø4ˆ)�i“0&bÈÈ3”TLÓa’ŒF 4Èn-jg[1¾ûËŸ�k_¥‰�‰á ¯ÎŽ÷Ì&æfÔe!6»ì^~}�S†»žrЭjÛeÔsgటьׇøÍÝÌâÿ VÀO‚àZW@7˜—\™1�B Qìàϲ`jQudò¯”ó‡,ƒðeGqÍ»c`Õÿc9ÇŠ3™}¤�„>bŒ»»Š÷T°>wü9ºajhüá(Û?ó­qÞ¡|éÓ<»,mÝÈ0­(AÌŠ½¸ª�Þê _›2WÎ8¤†N-¾£½«i‘,âz;H'}_Y¾­}é/”w 9Ž­œ í¡lù657SšÉÀæ^0´P{3T“ÿã“žÈÆ5n’±÷΢�Ð�ÕÌÌwWt fV0Uú6YgióíKä¹|kó�Æ`ö¾Áñ³i9ޤõ&çÜWŠñ/°¸½¶ñ²SSãhû'ÛÖÜS‘8yJÙz«¢ûukÎ\0ô'J¿‚W¾�‰[�õû ÜÌëѶwëT�ØzÔøR¨ä /~ßÜ@÷@:}¸�z�L|!ËùV”HëgÉËFGºmÎwa*QÞ–pNæO^úwH7"Þ40ö¬¼‘’‚›‚¹§KÛF·£)½Þ#Ì:ÑéJ8Úòà‰eödT†ß¹¤mÔ¶Ò­Æ©ûbD=¯î:â]³’¼ÔB=ÁOõ»L2Q‡±emçÝ_¾}ùN'Û«ŒчÇ"ÿÖhM£.ƒ¢¹p7áwóNjM„Wëõžü`tù�dg\u$‹yƒˆY^7Ìø»Ç_úèWØK˜*^Üš'FB†�ÀC÷ûÃq²ý÷$^²B øÐ÷qmi I›9_€¼M‰íþ ácS\ØÚÁ«·Ãÿy„í¡œ·ÏA˜QÝ£Ìlùjº/âu/³Î¿xËé“�ÿJ|cžy_m€õ8ªþ´qÌq‡ê96@¡Â(h‰j�‚¹.L�8‚{'ÉÄ�W�Z K)êIàºØÏR{å�|éûŸ%ƒ»�ôóF˜R³pjúÉÊ<¯%ÊbÀY–Œ�ä)ô+”s†¿–|ìQI¢Û0£õ~ [¥ª˜Ãö@aœ³õ¿˜�²×aÃÊNÇ7þy@”/²^æ¸uoŸÅ3ÑKp~°éfë’ÒEÿìÞ/[âSf)7²ììà Ÿ™9;�­Pâ!oßpüî¯eY -Šñû È2|ñÔZÝ—:@nÿÏÉ»8«x'"ƒ6; N'ìs&ÑcÚ8È×½-¨™uç›eqí¡»9«ž½,×µÔ¶W³îâMö!NÜÜŽ/lb±nx{«žåì‹?ncBÞFô›û†åfgm_´”óBIÛAmVâ Þ8™d)8åÛµÚþå ¦Èýu%63§2‘wßlt ,"ìžÆ÷øqäš;ËìPsÐùÚ$Õ�‰{(+Zäq¹“ëý(S›JÅÇu7ŽéÉ’kœŠûÔš›nßêðÂâêR-œ#ì÷Øß»Í5·p9µ‰ ôñÞK,â01œÑ‹€µÂÚòOBÊ—áñõ•ácÇÛýæÖˆyáRß7Í¢íüÎÛØKnC¹o˜â”o¶öß¶\mÐ6þ8ƒÎïFŸ™¬lØ=Ú”´ñ¨SOX˵ñ‡õ�úÙ<Šj:—TN¼Lp/ùbBŸí%ºo}6°…g!øñI€ÿ™qçܤ9ƒ_¥~¶÷œY}‰ÓóŠõ’oåù�ËMfF¡å`Ý\“ï ç3'c€9Íxyý‘é‚1^�ÏŸÔ¬äèo‰ßç, 07'îH4"¿)¾zFì×Z�’×\鸉•ÿ£ˆòéžøjG2Ïõ6D�+‡49· A’›f¼ ÷ïŸO–w?"í�`帇¹ƒØ7 H¢1Ô1 EæY{»^>ÖŒLÅ~­íœ’=xî”o‡6ln“%uÏÄyÜà3„êæÖƒ"Ù2òOÖ/âˆöo o6°¾QÒátÊMoÐ6aW„í’^D*Û±›îè’ö_®ßËèn…ž:cpWìž›ëoÛÐt89^žÛ||:ËÝF�Ê.ÓÉê.€°"ʦ}¼÷¤`8âø#ê„øskl«àÕ4–Ÿí]ÏÂLß@ŽÏ�ú6â¯âe/ŸšNöÜw<kñ˜5ìRñÜÏytut¨nÌq±Ê6žAàúûåü5q‰âgq³§q½MT ÞÏ’Ý}‹J :g=¹(̆©(>™|=Ó1գɱV”ÛïÜÑ쮥ÓùůÂÇéO‰q£U{·r…TŠÝb¸¾Ã1³¾Aô­9V‡˜–ÎE _KF00TE>ÙìúNGIê:pk§çQt“~žt%ùÄíXk‡‹8è¹—ι aÒ3ðÚ³³z>zéÜø™·†ˆ"µ¿ÆB+œÕjìÿAìÕ•éˆä¹]è��Á±|ø–ì‚�-[Fæ-‘-}Á7Ü(ñ�κêX66í×!¼i(‘æ… üë‚®/Åcþ¸•l´¹9”&Wñs1rvòÙ¦yØìOó�øÍì?®àD}”YÔàγO÷ï�§dÉ'É+'í€Î’æ~Ó¨Þ ÷úÆ;V“½í‘~ÅÐL4°ìZj�Ü­±Ë*u}ØO‚7§kzC&âäIL]üªþ½Fú'é6„MŒà=ˆc»¿£½¿!Û[Çux3鏿'I{0$&5#Eß­çÏ’ñ r„G=ßQÒI:·ÇÇ6µˆùó°:µÚ´;ãµP5ãæ„=ÿ¾tŽ·Îù/uØ»íÊå/Çûvïà #% ýF‘ž.eÂFc|W§M¾BH©×�~7UñM1×çìþ /ô–Ž~Ü Ï¯^*,@Ä[�±«Ë�ÎãöqhªÕX0¢MÜ/«E�Í£YvyŸÙÈCÌýƒy˜—·r Ù”w®¹µ0Ô¬!¥=W®ü×M˹|·Òà"Ó‹DC(å¢u†¨ƒ; /<‚àŽ\�]*]“2 G1“¼â|I�XÁü@m{¯{N^[5�Ðô–Ÿ¶Fý³ƒkÒýÒ]|.¥nQ½èºÏ<œ1;JÈsKЪ "›mã0ðCÓœ©{”ª Ä̹o¾—²ƒ¢8¡5Bø6u²í{Fä€H„~XÎß2ÜÉœVìl�éÝ]þ¤ö|ä°“ÚµÛ, \�ª�tPR•h{öÓÈ¿òÄ«ÙîËb�OÁêH‚ *0ÓtÖ7&#¹›¸òP’…ð»�ΛqÅ(ð.¥G�·ñ†mÓå�vüP�ï㈿3˜þ'Ím`òf´ûͧÌ-lCmêäUª{g£ï”Ÿ2«úÄaüÔGâÁøB÷6ߺÃlóó÷ËÃúVœAggµ> ýµ[ÍÊ’…!¯­§½ç-›añ…Lòíc³¬Ç eõÄìO£ÔíMaÃÖ‹å¯ó "é·áVn‡û‚Ð×CÚ¬Ùs8@ÞÃÝèSë¨~ÁáÓ›ÂêS�óÔ›óÎE†ŽŸ"Ô[E·dÑ¿)ř櫕¯ŠÍï€éwâËÆ¹±�jÜú´XúH Ò'¤ ï”†I§dœåÝØn/`©Ê׿‹Y.2×°™`�øÃEE¢Z˜Ad³jç§mÝs(ëDÙ'Ò‡4Ô²ßùzùmÓØQ“9ã–Û:Ÿå/¸˜õœ‡Ž¦À‰�÷óåÕü»›;¨{f¾;yíÓ¼£˜Ð„¯ÁŒI‚GÍ«¤eŸ°½¿oà+ïºÖs'I†Öq9ä ÈíÒ?® ÓòstU‘Ãx‡:hd_œ*®Ê°Î"cß\A œ'ˆBÚœŠ@‹H‚Y]YöЮ­J8¦™©*³"aG™›ÚtPAn¿7e9"ùV©;ª•Õ`[XE™0µAôa7‰°ÆH&&2¿±wÇqxÆØè�‰!Èö¤à2iÌœL³dŒì÷éôÃY9¼³·htÞ›€}-�€[j†ý°â½S=v柶&‚7vÊÑãÈí³h”EÏh¢3žQ™ 0BÝT“ºWž6Øn–—d­“�Ü4ʺN¹] èÍ;¶/rs^ù)@‹îÏÁÔ4ì¯8qƒŠUîôo·Å/NÂC'QF²�ù(úÚm·–çAî n)pù\Qòhe]j\\E Ûr±ÞìpZ‡Ìf.áâ· 1“!ë©ðÑ¡i ª4‘KǬ±þÝ¥úu�«™˜»~«�ê 5²XÐzL£áM=T¶Ý÷K%8|}2Gv¯÷œfç7?,`ÒD(êKíŸ>.•ó2ÍÆR¡Òaf<÷ò7ÓºáŽYΰFÉ)æï—ƒR¡Mh…± �y^â²ù7¥ ½ïñüf úícMƒöCŸHöI+‹ýÎ2ï†ë›L'ÅwÛó'ù°…*\,3q«EôÂÇ�ëI[ËÂ%þ±Ïü®¦M'ä³bÖ®2üÈ=âÇÆðû›wÌl€†šøÞ®ƒèœ?.l^# ‡f�n/ó5“€§åe‡6l=¶ù&èŸ-ówÙÇw­Óã¹w3îhÆäEâý~)Sž"“ß-á�Y�nø– .ØPù3„�'Ïrü¤åã0rB`y¡y#™ó\{—pÍg/è„(>Ø·“ÿ ­ÇºIzú¡PÝ‚C×Î-ÝÌ¡ûKÁ¶q—ààâé. ?È ý„x (ý�7næJ$êÇtm²ü@;«šÇ0-d{÷źœ9©×:ˆ[¯s†¡S,ElÞ…<�:¥Býù‰=žK¿É|òžï ý¡Þ->ø+°_¾á™ýxóóW6hX\QÏö&ØGß3ñÅÝqÔ~Q�±«ê‡ñ÷¨Ì4�è@Ì@Üœ«¦Ù7�_1h¼¼‹ñV+Máì‹4fîeÊ“…\Ѱ„²Æ‚bmVŠj¤þžzw{Hæ,Ëšü0´P6¶»ƒVËÖ4 –fÚÉØ¤a·‡V{´3ögß>ýùÓ4ÖÖØ¶ã¹yÖ Ù'†%ìì7÷8üÃø'<7âìtÙ[Wuc„üîìM¾#Õx¤¿R— ð[ãôÝ©N"z9=Ãwd•»f’Š“k]`£©‹Ó”¦³ñÚŠÜ÷½#Âh8ú³ð§Ò©ëðô:–?!©ñ&¶™øB1•½ókË68ö^ë¢l[%ñjÚ Ø•”¦æ0ÿ3ʾ¨;Z»Ý %¸ 1 †ç* éìaí]¸¦„˜�ê @ýŸ,d-Ÿ=þOØw׎ãó½q¦¾ÿ�õÀú%fk>>£Íéÿr=·{œoòÛ‡s Róåo€óàS£à[ÞÌhW•¹NeÛÀ›�N!l:Ãö–¼8¤]¬Âψ~¿Ž:(; ÙÙhÍþAúín°eÛT„ÊaˆI~åÀ®Œ'¡Ãä|_ÎäÕ©Ã0qwPËb¿ ®(ì)i×mJcôWöõeT¹6ÜÙÅ)‰¹KG¦²�PKì;øœ~|)�’÷ \[’íûÖkg£½D ô0ŸŒÀž¦d—²+ÆÆÌ὚UÇÕ›ßòG ånÞ5‹� ¾ W”Ý)ç“-÷N[›Ñ°"âŠþtë�3z÷̸Gd�{š§ÞÒ05£¼’lFøcœQý• ›œtûEfï(\už°cÜ«Ó(×BýꜳĻšËU(ÕBäŒ�n�ëí°¥8¡ô÷­,Ç, ÞTÝ̹Rí£u^ jé”ÙZœæ¹Æð6�­f\Ø} :­�ká�ÀW4~ºû:o x%|^}–k«šJ®ÍKŠ:ŽÆ¨Åañv=›Ì V.±™õWJí+Hkg “iòÊî¦ìMžìÃÀ=µ‘c;>únYò¤¬"”8*pÍ­åÏkG! 9ç,üÐSòÏáî3zò¨�O‡[¨Aå àz/Ù��”œ!ÄmâËï^>SÏ8Ó C €B½=ž|>° óÌg¼^ýyˆôÝMe¼°wÍòã–¡" „ºèøÇ]Ö‰}éê *9@n,gà:F… 5ÏâRâ›8¸bùGŽ¥UºGœLp$Ðï-m=7iݦØ+bl峿¿—«ñ9笢ôW•ÌDAAÁ㜾ÝÞƒi‡CjC‘úJ0cøuûÿ�÷í?¹Œewºc�öÂ^�®ÓÁÙ©›�».õ;>·,çÎM¸!õ‡8íí5ŒOÉôów0ÇO<ô]Ûé–Tϱ#¦*uõÐ³Ï ©ü'õN&´'D`o ch]¥Sœ€QÒ`tIï˜å•xu$¦À”û›ÝGƒÆgꇕ¹QãÞ¸'�Ò¥²Ä5�‹¢P†Ü#þ©j¶ø&€0•YH* #ŠÒ¬g Ù–uVu:~s¨7=ÜÆK¹‚Á‚˜1s#¨½ì»xªÐ@AÒíÑí�åÎ#™�,kIìr‘ž¦R(Á¸8Âɤµºóǵ–Ë­RbS—Ia^·MÄ÷I[a»¤-(žEÌÇްƉ4ýâb�È…›Z‰¦¤°EødFvp&‹fMË•sÿVü€C,ßÏ‘Bó´ <²Ë;˜Ìñ‹�„NøD4™ÕÂÔýð’|Ðyà+-4é-žØÉ¡:¬\óΊí÷IZù䤃þ±-C6%ÿz¨1¹wî|2Nsý…˜ˆSc“g§;xŒ¼]û«Ò^Ý6z§eŸÆp¿Â‰åò®IJ úLo?ìd=9b¤¬ÏosC¾-[µáDÁv=‚mÈásÑ4ð4¿: ¶Q¸ÜxŸî•¶™i,ñLAÝ=Üâ¨lLóNO"Ÿ»–¨0¬r—)¦&S4^\<âªØ‹ùq•|rO¿"fÀ´8z[¦Ýw#µŸ3:âs‚ˆé´½~6¬î|_ˆµÌ_ºŸöÜ]3§wii‚þ�¨6¶÷åãÐæŽ]º7}eyÿ\Ú[«ùJ•´Ù|* Gq¼˜<_›þ¿Vè¿!䨲;ð4c¾ö¦¢Ù”9ƒ—l/Ó“›§^(ÖNsèŸb£Þ8Æ9•aaZ–é5"Y›­ ³iE„¨F¸;Ù�g#¡úè" j¦§[uUPm¡™‰›bÈcâByTý¥ ƒ&{~wÚȆs±òÁ7°ùôýÔ PëáRP®ŠCiïÅPeFNßRåó£:,ƒbÉ3>÷cÈp¼Snsu‹pšñøq’׉Ën£¸Ü,Žÿ�µÚÏârõèö$½sVq¤ë¼�ü4ßA; úÙ'ç÷|sݸc#ëÁ“'K}í!ö{ÜgåéQ‡ì-8Â"Úá;�ã˜Ç‹OµÓÉÌãÅ�pþY;§R0�dm*É%ÄÒŽéÔÌb/Ï!ûü¿ ^w渳gsÍÜ_ÌR^:H;v9N�ùv”?“{œÞ›ËT†¸y™‹‰à¹TæÓÛòYkh(ä’$)ßt�ùŽùC®fî|Ã{µ#7=ÏÒgŽ™ÉéžÅ¾…:¿ÓÉÊ6,.‘c›Ãý°Ø;*Q®„¹æˆÅ–ã0í¤ÉvíX‡Æê,ÒGË›zˆ›îÃnkìúÓý[�£®=“ú>ÁïN¶|ÙáÐ÷šiÕâX¼�QÙ:ÅŒLïë{Z ˜/cÅs Rµv²À’¿‡[\¹ÉJFöZŸØÛ7 d¶•}q{MA™y…ÁŒâ¯ Æ�lIÌQ’l&üƒ <ʾ“ÖGäšmš2úW¯ÎüǾ…Ž{ûO‰×m§ˆžÕ óάçqF¤¶�Å\òŠç{lüå@>é˱bôm¬áÃ8>°‡(�3wÌGÇYÐ�ÊLnÆÌ�º7E)ÉÕœ=™qˆˆä©§BÌv½:�p` öö‚[.CBRÎHüÂÉþ© Äp¦cÍÆsÃ'%õ\åZrÓöZµH[ß½v1¾èÖ±!õ*xM®0HGaO�€*ܸŽ}=�½úVŒ5~Òi7r€v¡º…ØG|Ç1wL¥“�˜úÏ%Jç0”ôèv̳ _Û~ECU/'f¡Ó¶P$}�ŠÒ—]œ=ÚæÍ]vß§Vô=pW§cºTXË5ÒÑbN‘3dog¿ÇufŽƒvx—Ö&q–üŸ}a¡c>9ç–g‚*OŒºi°�? ’’–l?ç`—‹Rý¥ƒ•ï�ªùsAƒ9ëÆþ ~¨8~؉ä ÜsþWß%q¿¬Ð¢Ú](.ã‡$¼ùouwÃèÎǾyù¹qÄ#FQ_Et©q>\bP”§,;ùûß{óPt©–±S¹�ÍÊn§Ü8e¥“[–¶„>á·ßMbw4‹&•¬ lE¿vİůSÒÂWL(ñ?4WxV µ™<¨Áîõƒ½ý¬ã&wõ}â�üŒ&Ù}iSžeF-Îdºw^õ·Xs÷¹D)ã›ÒøÅX;æg~ŒîÀµ`W-k‡ýœNòt‹ðÉu´QÓÀ˜}=˜ Åï#Ê]¸H!¦/R¯;»jM9Ü(�¼>Î7^�Ãn”8økþtzR›á^9Jû'qÈKî�´ C¿© *É,“V}8 5ÔêîÍ[ZA�oßÙ8/×߯ùÃç×Çf ³‚P/kË—àû€´ÜRò3�¾ÑŸãC¯?Þkã¨î0všü!ØxZ1�/dÆï3ÆU”Ç·]YsüÐGó¿SÅý�s}°% ®óÎ�}¬77�^¼VD qÛk‹“½î®Ý¸ß~p×–`ðÿS¶˜\¢¨N£Œ¶›à’Ñâ*E<ŒI}ÊbGþ'Þ§${lâCŸŒ÷¦FYúÖV5þVfÐöǰYõ;¯´¡a^ Ë¿šÖååÀÏhb{Ž.¸u�ÃÄ—ñÖ”W³Ô EÍǽy¦³ˆ¨mØŸ7àSNöYâ4{hƼŽ›=o’ÖÃhØ…2ÊÅ™Îïõjœ+€@ðg®Ú�c‹›u—be‡Y¬ìÝÑOÔ¾ÕÎ@ž:š vAöœ… ¢èWÛ¾`9R®�G¯Š€‹þµËŽŠµ/Cïí{áÜ|“0ÆÇLùˆGÙ�½ÉÛJsÅSWhç¥|ÎBóŒÙ¶÷�ñÙm�šq[ɽÛto3:ìðÞç¾iO5Êk\x|wÃP„€zyæ¥tù<‚PI{JªþXªàžDA¥² üð¼Bã ØÈ°6§@5ݿ΀‡&ÉÕo�ÒÚ¢»&³‡ç~³9 ®{,©pJ§ã•¶M’ã]®ÿŠE}ÉqƒÆÄ�RF^Ì6Vc:ù5«³ž¥·£RÂvž,ý Ä+…:[<îÛ�ͦq[k¦ 2tÍŸ”F¤¤m@n&ÉYml=™K$�ù6ïŽÙÁ='\KK !÷½œõ�Ǩ‚ì‚7àí×Që´÷ÌÅ‘jm„U•ixïÖ5îZ×wÓîlÔs‰‹'©Àß4Eίû×Õ.z:«â6è´±Ï<°×jð,}ÚJ¿ <â rtü sö±{’÷Õ¦‰–Óä‹C†CàZ—0ˆ~y¶Å¢…c9jn•Zý “Ü«2bWÛXÒtÈå:Ý�¦·SñœF‡‡nåÇq)Ò¯¥erZÌê2„¢ÉW–ºœ®Ýø^s™Ó‰®È#Á-¨}”œºhh-B¸EÁ~¸Õ…°¨:,Äðg ¢ô5T$«p±VM Å@¾ cÇœ5Õ¾Û½L©{SÀsŸquýê Ëy�+†f­6N¬6·0iNž¤˜xEkYCá[ZX\æÉ×Êd=¥ŽYŠëçl¤ñãÈñÕ¼ƒ\Ö@¹[EV¶%ê¼¹7ãðŒÈºÁÖ,ׇ]./Ð@¢÷^8x:>ùÕâ2*¤a§§=9îþ?ÝÿvÛá6¬$ˆ ±Š2h¨MUk6­*Õ›V¥V¿áVÛoôþ¦Œ£$‚�™’°”’dÆÆÙ³P¦b2a‚Ì™bJ˜ÒŒˆšI(,eŒÙ†ÒdÈÍþ:Õ«�U²Û_å¶­õjëmjÿ}¶ßôÚÚÊÕ¾ÕmZ­põëÐsëÐz_çº? œ0AˆÁV¡ˆš�€�€™RÌeb–h%ƒ„À‘ d€R$É@²…áŒBx 'LeB‰’XÒ`¦˜4a4©G”Ä @E�„8BJÐÂa ™p�C;Ñ¥'O,Š!ä²™!Ù¡’˜„…J$±O2ÎK'b�„8QîÌ‚“™Lg/@JB-!Ù £ �ŒD²ff$Ò!&!3'•G�È’Q‰–p\‚É�„á“‘%ÞR�ጙ`îbS<‚ ¤™t^ ‰dîò„ˆFL8bÐì$±’X'BK9-)æÁ—A�<ËF!‰RÍ*Cì]0Ñ“áØ8‡u "–hOB\Jfx‡ òéó¾]{¼3½'¹y>ïEî¹¾ñÎ÷½Þôèë½×Î]"ƒ*'%ÝܦvsG(ÑÂD2b˯w;;‡»].�sœíîï{ݹÙ½ï<9î<ñ;½ïw7gÞ½Þóݼ¹gNþ5µ¯V«ûmµ_ßi­µ{ZÛvºµª¦Ój­míV¿Ë[Zê«Z¯ëZµ¿ËU¥ZÖÍ­i«ijÚkj¯ø[jþm­­ºÛZªõ«5«lªœ3l!�`ÑE(Ð1¤´XÉFÑ5�Qd´› F &ØÅŒlFB„’""„ÌÒdÆÁ±b5ƒ&ÅEk[o¶Öª¿¾×þ6«]¿ß­_­mÚ­m¥m«Õ¶®­·í¯ü5¶ÕÚÚûmª¿�­µYU6¿Õt[E¢�ж£U�±¶ýµj´ÚUU›[um·kkKjµ¯ñ­_m­Z¿½ïïü™Ÿó°‚D€ Ò�XÑ0‚ƒ2F!ƒ‡tÄ¢B�h `B IQ Ñ D`/9UÍ~~k—›žç„û·é¾îüÙ7•ò×-|ß—ëçU巽ס×ï{äï«÷º÷×>| ÖçÍ^ýÕ|¿I}wwmÂÇåó›è]Ýóô¹>î˜N}îæðó\¹yñûïÞŸ»ßºnww»«ç~˚?9õõ×OÝÇÓü¼±¯=î�îöß5÷uæN¨ �2¡‚… vAšA¤<;kÍóÞu»ºá¼·°üýî¹ßºçš¿w}yáÝsóßuwß½ÊeöîçîóL(�aÒ ¤]íDJŠC ‹–PÌoÒßžoÂíù^÷Ù¾ûžë¿u¿<4�ß¹ë÷¹÷dü.T[éòùʹsÛîòá±{ß½]Ýå{ïz÷»\Iûß½õ~_—¾è×å~œ.üí幸;¯~º¼žï/�óžç»º­[ûmm][jZ¶¿�µ¯ÛJ¯ÖÖõª¯çV¶Ê­mêÕüW÷Uüµ®ZÅXÕʹµslnU\ŒîÕQVæˆÚ6æ§u­wv«æ¸k•¢¯â­­êÚõjÚþªÕ½m«ZÕúÕ·ÖÛoU[*­»mjݵ­vÓmª[kU-¶¥­›ZÖê¶­}ܹ»®·ü¼-×»çI L.îîíPSd]Ýçw½{zêéRXÎîîŽ\£»ƒ®ä0‘t¸»»¥s2·šî뇚îu{Þ÷›– ËtAî콋—vÞ»Îo0\º”heåÛ×I»Ó·+¹ÅÎnr{‹»®]ݻݯ'{¯yo9rÞ™—§7.Ëù¶«;J«ý5µ¯VÛ{[m_ÕmZ®¶þ†£+h¢µE¬mFÛøÖÖ«¶­:¶ÚÛý•ª¿¿¿Ç»y½Û»®�ó\î»�$îÇ\:nç]îçMîëÝÞs{ܺ@Srîë�Ëy»Ý§:×pÚëž÷kÒ�yo^�¢Ž¢îìó[Ï^÷oiÜâîîî®wqÝÜîö½Óºõìïw‘é½î÷vrîìÍtâuÔ¹DC³¥ÎL÷sW{­ï9ÝÓÞîÒ½Ów&�wyÏsx÷–=BIœæ�ù¸tw®¯=ÑÑØéîì÷uÓ]Ý×w]Ó�tì÷O^{�Ç ÝÓºî%ÆîÑÇGtç]Gº»xÞ;ÏGNus»§^öÜ¡çt7+—\¸#…ïuÜ÷«œ{¯{×½îzì»·½{ݺâíÎo.J9É{u¼^tï{±J]Ãwn××—/{¼õtê¹ïvô¢Ç»¯=wyïywºî·�îž÷¬¯vÎê<ÜööåïuÞ½7Êê{Ó®yåïg];‘˯{±×»Þ»¹7tãßmmMmkù¶ÕÖ¶ÖýmVkk_Û[_ZÛÖÕoj¶[Sj¶¶ßÍZ­–¶þÖÛWømyk•cnöИÄhÐEA¬dÖ,iƒ#FÒX“BS-I¬QFJ�%D%J&bÌŠ’:ÛoüvÚ¯¶ÖºµWÈÉ5A#F˜(ØL… © %"„°&4 ÃlY“ !”´È£í¶¶ÿ mµ·V«:Ûk+M¶ªõlÚµÖÖZµ+kù¶ÞÖÚµêÚõZ·mkí¶©[]mþ[V¶þm¶ßÔ¥@l�b+�Æ £,$’“lId  �l�ƒmd&ÈÉ Ù “"ŠQWÖ­»mVßÚµ_µZþÕ«ÿž­m¿áªÚ½jµú«_á«[f­´ªµ¯í_èþrïñw¦�{«üÛÞçH"HdDd€à†t�D+ Åܪ,Å“$‰!ŒΉ$³3º¥ƒ±@§fIˆE™ƒfw ÉP‡dî‚eFAX‚Q)w®{®—‡]×uîöÞ÷·½9æuÑ‹årûîÞ{»g¿^ùë¾½ïsºáî÷w�מºw½ëÛ»³w—žâŒ{×'‹ºüÞ_¿uû»_=Ç~î{ƒ„_]×»Îñ¯{©½ïqåïyç+‰në»Ï{=Þ÷w—{ºïs»›¯N»®C“Ï{;›–ò÷�¸¾õï_s�½Ú_—ÏÎ;·Ï*uî÷§�ÝÓÞï.rŒ™‰@ÁNŠ pȦf äÊP¡¡ƒsÍró»·•ü}}çÞóÝ�u÷u÷'dĘ&LQ’Γ”Ä–B@tÀ ÝÇÝy{¾ëÏuËͻݸ÷yÓy»·{ÁïEåÐÎweç–w½ùò‹Ýttø{×{¿{·v÷ß¿}é|½//zŠvH€Bh†0L];*‘$ª:IËÌó»»{‡{ݽç½Òò¼ôëÞýÝ÷+ν{Ýôë„G ž÷›Ý×nè€! É™$2,ƒ1 )ŠIØ;'4»×¼ï=×kÒëÞô^ï¾¾ÞE|vç�×vçw»záÞw¼èçã§šõï{Þî=Û—†?uØó|÷ßuëwÞß¹÷¾ëïï^n®g_7¯w9ðz÷=yræ¼÷½î^óÆôŽººùß/®sÜ÷¿{çŽ�wÝ×»£{ÝésÑ{½Ýrüï;ç/7ïr÷;¹|wOtuÜWo{Þw9Ýww»·œ4eî½îô¤I—E’ Á–F„: )ê�˜”�`É™“Q�,Ô BÌÐÔN\±Ñ$œ åN9ÈgquݧN�×]ÑËÍt÷s¸íŽîß—žý×n{®Ñ'¸ï'º»½ë�Þôë¤ï{ÝÝîç§S^ìm×uïv·ï»À×wϾûî’û�÷p=Û}ïyï½ï{ßeòß:n÷Üìå?{¯ËÝ.ïuyA»ž{¥q{®ît¸;½Ò÷{½wznG"ïÎAçGÞ®wgsÞïG¹wžPû¾÷Ï\ïwšêW�çö¶ÛùÕµM¯íV·mµºÕ©jÊÛR¶–Õ»U·U«ª¦Òµ[­k¶µ¥¶ÕÕ®Úª»ZÓ[m]­m]­««m­ÛVÚ»jÔ­Sk¶µ[­[uRÚÖ•­müíµMVݵl!–f6d&!Bˆ…%AÒRR&mjßÞ«M®­©ƒ`¶MD–1¤£’V¾¶Û­¶¦ÖÛvÛj[o­­iµüVÓmëU¯íjµýVÚÝZ­üV½kZ¾¶úµ­¾µUö¶½kêÕµêÛWª­¾Õ­·Ö¶ý­¶³j×Zµ}ªÚ–¬¶µ¯V«Ûm½µ­¿ŠÕ}µµ¿�·­ZÞ… E%ëZëjÕõm}ªÛªÚõµ[û[U½m©­­d6,`’Jeˆ11¤Âm­_Ŷ•V¦«oÖÖþmµzÛoj´ª¶ýkoí«[oÖÛkúµ·­ªÝm‹îé»§Æ»%Ç+¢vnÝ;»ºë�ÎëºçMÜÎDã·p®»ƒ‰ÝHÝ×MÎívåÎpw]uÝݺî:r;ºÇwa×uÜî.Ý‘×dÎn™\å'9ÕZÕÖÕàòêçFçFS&C…)”îÝ™œäŒ'qÓ»‰ÝÚé$ —; wrc"1Îܺ&ÝÇ®¸»¸&‰ÍÌî¸2îfèÑ&�×]L©),%!†îÝ—MØæ.î¤E+œKºå›™’eÝv‘�×N\CÅ æâºèîwîè‘×\SçSráAwBYq]ˉfLçD wtÛ¨)¢î× '7h¹p ãºÇwBˆ$Dƒ!¦rí+ºâDc3(36i‚\݃3ºîîÒŒ‹F*¯í¦×Õµõµ¶U«6µ¯ª«Ê¿³'ôæ?ŽÝ®êé—ÝÞì¿wÝܘ9ùº~;³$Ë™§ç=w÷yé~ëózz;¾]Þïg{¼ÎpÌ7Ÿ/K]ûÞ$¨Åzêã_»±®ºïÝ®Œqæïv¸ýÅÀf?/½Ú¹ÓÝÚ>r(û»|ûÝ÷wßvò(¾÷¾û‘|»îÛÞ»>ûÞ’;»œÈ!å×1¼à�wgÏ{©Hòºû®`Dù¹Âë—ÎÑ4î¯=÷}ë¹y}öuß}ï#žöºùŸ]^^÷¼ž÷«æûÝtow_.»÷º˜Ò`D3ºxj�È�ᙋ°ïwîìf.n÷]5ïzô{»~o½¸¿1Å/ÝÐY0›¦{®o7å÷»îîr¹=Þ[¿}æyºîëçEïw/+ÝÂîäM�w>_zés î».]%Óë·ï{ÛïsÞw½ï~û;µ÷Wnn»«¦1 ÝÎ\™£îà¢7 ]×yÂ$w{Ý»®’9Ý܃åó=×7OŸ}÷åËê>î½û­é‹¡Òøu'»½îów\÷¼ŸvøˆåÝÝ7ºò»×|×r2û½÷qÝ]4'—»·€‡uÁ¯99uóŸw^;Ÿ]qÝw»«î:yÏ7xêæ /½ï]ÝòùáÎvì•û÷zD(7ÎB)ÝÑ£Ï ýݯ B~\¾ïž7»²0‚I7îé}Ü‹÷qÝùxÅùpK÷u’îìnýî{�íÝΗ{Þù»÷s!G×îôf�Û˜Îí×˨OÝûߓۯ.�ßw—ÝÝ×yÞn…Ýé¯Dh¢“ÎÂE÷w帣A~]uÝúíШç<ì¼¹}ÛŸ}Þ®õïiít÷ºôæèÀÉž\�íÒîÝîãîê)… T,”*1%ƒ¤„šP2‚¯¿{{{ºSÇtŸ]_/Išó™Î�›¾ësîã–;›»»¿uï¸ãOÝ~{òú÷\ä{¯½\×»„ÓÞ÷¿uëݦ¿+ïrù~W—{Þû·ûÞߟ½t‡ß�xûë¾û½5Ó>nAõÛŠwn¾ïwWM÷n=Ùs¸Rû·óå~Ÿw\!/{Ït‚KßuÞ}ë’ùÝÞîÞó¦üÜóïuï{È�¿w+Òì3Ays6Lœ£˜Èwtgw ¾íÒ÷s÷]Ÿºå÷ï^ùÔ ÝòÞ÷Wf5ù¹åÓ»²¿.Ço½Ë÷»ß�Ÿv¹$ G9yº3S/Îr÷¾¯|÷åÖû«�»¿<ò}Þûï{¸w~^_•É6ü÷žôoß~ýß>ëÞì~yäû÷zËî¹½úëÐËß½èÍÛmZ•«oçmvºÕk5¶ÕúÚ·U]Zªmk_¶Ú®¶ÛvÛi¶¶·õ­¶®Õi­UvÛõm·«YmJ·jÖ¦µzÛZÚÛzµ]mk_ÅVÚ¿­¯[Ukúôþ¥Îç]w;;¸wNɺwtt“—nN®¸ºRåÜînntˆÎWîî“®�Å®Q.»œº;°�Ò1˙ӷsræî»šI®.0•ˉ&뜜ŽiÕÖ]Iw]rrâ]šA¢껥wq7á×9]Ütëš\îp».»s9Á×nÝÁÜîë…×:;7w;¸fû£ºè î�Níu˦4ƒIE6­¼ÒY(¡5f2h I±LѤCŠKZ·kÄ·ô¹n›sJ`ÆFcsQp ÍÎmθ›•ÌmÆ+»¢ÉÈ„ÊB$®n‡véˤÉ4F#`‰Ë‰71ÌEÈâwnÅLÔZ4¥s›ssB•2î㻶ܨå¹t1®2#EŠJ™I…#c†ä•ŒË»¢ #Q¸\4“ºJé“0Ø]×)*-Œ ’»»:w:3�¤Ww4@WªÖý­©¯ÕZU¾×˜þ[nsE±¨­Í·5X®nF×9®nEc¤Ñ¹·+Äsk”QÝÓº·2ccQTš.kÒ«•Êå¹±A¨Å]9[ErÜĆ ­E´ks¹DQb#UË]+Z¹ÍŠ£R+(´V‹BTE\¹·-Ók›œÖåZ*6æ«–*,›cF¬¤ÑYˬhØ5P[åÌlkƦi×”¢®\�&ÑQ¨Üæ�ÍÈÔQQLÚ’ÒîÖîë¦þvÚ¯æÙkkWÕZVµ·ÕV¯ªÕš­½¶ÕKk6×U¬«5µ+m›Z×[jVÛ7å¤3 ¨²”2ÉŒY4 ÆH¤# †Å0¢‹%&,•YLI‘ P4 ¢À¬…Š,@b„ ˆØÉF“ MZÕ}sFÕ¢ªŠö«n­U²Ö¿«mm^Õ«vÛT­µMX=zôAèÔCׯA/Aë× õè=z^c_?¿ÏÏõ¯Žÿr‡�wËÿ¸`Ǫ è‰!ÿ³ÿ“È*’ —OðµœæE~òSÛ�–�•‰…‡wûYO_6¯ÈZk°ðšLºõ‚U£/´Ñ×—Äîš­ úÈ#åDÖ•Ë䇲âè}Û3!Þßû�·À·öì~©æÜT½ôgÝv�¸¬Õ0K”IÂZåjáÙGü«¬mŒ8· Õƒêw¸ù»®«‡:ã5þíoWnPæ>ÆŸ®Qêíú×õ�dLõÕ0jCÞ«!ÎèR‰~Õ€txªe UÈã§@Ðëí¸yÓeœ®z«Qí$Ôd§ŸšL°ù‘Öm"cyø¶kÎjx‰_4ý8`øTC‚w eÅÇUòîÃÃu+~Âoešu G6Ÿ\í’Õ"·®"£!âÆ¸%~í—#g¸²˜Èk ŽwºŸ /9kìhÎ.Ax�uˆQó&åq’ãü8æà%=}@³ofÙ^FdÅðŸ ï3�ÜÞÖž*‘0kRøä&ÅÙ¢Öé êÊ\·Œ¦ ÀéØ9œ ¶9C`½ZLb¦¿€ß£æ›-žÓC|i}A‡&ºÕ× Þà£ø³Cÿ×ÄoSñGÛ°Â$ DâZvÝtíב€wº_Pùbüº<+µP…ÒÑöÌ dºU�Å Ü,þüVêå^¥®™ƒý»iåÕÐniU.n|ßq?ì–&Î7Ë�ݬ‰Töçð/硕ب¤Æ¢ 1z`ú�¦alOw¬ïÂ�ûÌíÐ…¹x/¬`˜³ú÷‹Ôðq„Æ uKô`)Üë+ ~è:·7U·†Ÿ²)SÌpMœ`aïMøîï:e¶ÉÑ¿YÜ_M�ð!$DË}ØÇ2qÓ½ïx4‘VgL88bš›>Íý[á½³tŽö¢8Òº@ÏÏ‘kÃHÃZ_îv£€ö�%’ü4­`(lJK@•œ˜½1N¾˜a•¼ MäÍ=`W2â»ÍÕÚ›÷¹�–Γî;…34sróä\}L~öB§C~,#ÐÛ$vM¨[ßP0Û >€>¯>ã`rßb6øýuÓ"óI…ÃgIA6mk‚Ù@È‚1ëaê”b3œ¥9ºk:•¾E—õ¯Àh`V ïÖß#7'2ø�µð~k—ûzÚ¯öª×ð­þÖßݶÛòÿoûºµþ …:h)L�(?ó ⻸ï÷ó¶<;û÷!>õm5Tþë±V:i÷ð4F”ßÞ–m¡“{‰•™]à).Ïý±íD_`Ê骗€ïÏêV´M.)â6 �³Ï2W®4j€çÔ­·_ó"ÇÙÚ,k’C¸ÙÆÝyX‰ûîÄ÷˜ >{òƒÑ¿’�Äù%‚½euã� k¡ ¬:ó4vY}¾.=ä>aNæ¡ ˆÝ¾&k$úÙ1!_·<åÑ"Ô�‰K:œê �áni$óùÜâ½kñTçFl.Q2ù<ükÈ<ùß³„2† —ý¾\+%ÈÖ÷Âø´°æ¦ïöôk#]’±Àv�‚pºÃŸ‹îuÄõ.éK¤Îl2»AM¬ÁLíûL`ÅÛU óm�)1êž)ÆÄÏç‘Kä`3Õ£ŠJlKÇ÷Â+ åøf~rôÅæœ“jñ|£”ɦs.·ïO;¨Ø:þ¦¦8퉰DÄMu 5Øù:İBÆY-Š»Xiñ4AZÏ8Ù+˜°ÆvE¶¨Î3³ ËØòs-š³Ñ$é ²%ÁFÒÊÖw�=öŠ?“>r½ï_kŒšëÁ\xkjBc“ˆ9ðòƒqì&$˜¢Ò!?[š×Žv¼œ¾àŸÀj�z (°X›ãU³Í¸E¼x 7ÅÓiÈ»™Z‰Ö÷Ϫ²ªäÁté¶�÷±•Ÿ3|<Ó÷8%>�6AA¡¹ü[s ¤èä¼å¸jˆ·ÌçÑ|°³ý8àŠ��\åöùÑZIÅàªÖ›áÆäøÏÇAa`Z蛑|e®ù8\Ù¶¬b�“S±|]¸B§11™Ð+Û·*£Šƒ'¼yÔ�é IÚ¸xn¿gí^l<-ý8;íÀõ¸3å¢éxg}©s'@æ4@ õÆSm›nôy�QvÛ,Ø8[¨æƒŸÏÙÙ³Îr°ÄeöX”D<[6—‰PWÀý†ÁÝã)q )Iä³ÝàHI&/åßrÜÅZ4Ëcì•p™#zÞ’Ú0£áÚtç‹4#Jmã·ù�¶¾0Lc-TãSóó4|60']Ò Þ®¥‡õÈÏ"%q^û‘[Ve©Λ>÷®íý­n¬"„µxGãžSÐù¨+#”Ûò‹à¸UöU—Õõú$3(‰}¸MÊG‘þä§W}þÄ(f[�Ó…Ð%ú@bÒ*c†þFØ`ºŒ�x,° �‚Å{š†Ï ¶FŒænðd%僽Ê*06ï jÚ¸XöÞþN¸Ïi÷½·Ô‰XÊ߬/À)D±[¨@•SdgWØÅUíoä;ªá¿dkq ýå‚X·NO�x½GžF¸ γ{À1êO‹€dštÀÜpÒ¯^kK¿,7Ò�J/rn¿•¡UÎUI}Tu/Ÿ‹¢k€Žá>L'lE‘]™+lPv9ôÐc2ͯvY0Ãͤ…_õ�Dޤ¯J`᳤’ ßHÕÆŸõh•$a�Ó<»af@©ÚúS¶ ?ÀÞ{™Žðj ëž‘Cƒ"‹Í4ØS9íW—9Zz�Æ~Ûø�çw¶ƒÀ¨¸ÄëO" ‰tºWµ»¸‹81 Á°ˆ Zãð¡ â&½`¹hc«µ½^užå&Ã^¾.å÷iuñ¯¾X*]Ú $ÓÖéo?²CñÌééw ¥¬V›ÑÄö¶ÏRï oLæã² X�RQ�Ë×aŒê×­Üíø¿Yïv6ËðB§ptä¢á»V\ísšD;(o˜Þ¡¨8Î)>–™vÑ�~ÔóEoL‹ãJy>èæ[ÞŽ•v÷‹ŒÉîÛ {•A-»«¤jq"™R�Ñòù™ê3Ô²þ\Â"néšóÚ×?,Ø "F›³Ä‡ÐÒÆš,ÛrÜ®o>]w¥ Gê�-Èì#ëe[/)Éõe¬þk-ÆrdKÛ†d‹bñ~k¶”êóâÈÕæÉau|,ÖàS³ j‚RF2ü�ÝBÖMyæå7½Ãr±@‚˜ß'ŽáxÅNp™ý�LråË*#(0ˆvNM3°ôÎï6MBPp£¨-—þ·ÒÅuuf¿›3·–¯ik fY=¯›B"驉áרšèNP©“ÅŒ{ÎX½)7>ä-¨}6ÌBFúœ9L¹ü²†»ï::ƒ˜Âé4!Ó’ —p¬–JN<õ\W‰ÎÍ«Šñõ§ÈÿoaÍ;œY*Ê| Y}SxD/‡Oï@g„×< ÅU!­ªþ=Ââlø0Öråñ‘ê ±M ÄøÍÂ-Àn$ó™>IÅ·\`àè8À^V´r ÑŒÌ|ò¦'ó·H‡5=˜§†’5�̧öâðwÜÕJv>ç<‹éî$¦ÉvYª['Ã!h€,‰ÇŽmÖîñ5qNô²ß·�ž×œÀ}©pdà„Íɔִô+ƒÙ$ëŒ@ÞŽ"T¶·Ê™UÚn„��s’¢?JŽ%‚‚£€³&ÉÍ +¸•¨mã?Ðûò,ñmðuëì‰ÞÛuؤ͜BnG€G:vQªE¤Ÿ¦ú´áMm0_\�ØlîÚ²«†²5/†žK�æ¾ã^ýðjáÚ¾5ïÞ&9‹„b“ìþÒÞp�;RÒPN»ói¯¶�Ñ,Qûš°:¨(.,×!«Ó4DA3mï™ÅEÆ]GF* •v4“Ø„˜•c *ÒPÇçÂYŠ2ÞŸÍ0Þ�b£Ñäà .ÝJ¼e?×â&Dô S©_…·-ÌAD8Ë»³e³78XÃ}Ä´g!‚#�ævSyŒ ©ãœ’ÎešŽæ}ˆ‰°ç/ ‹g“Íi×z Îظڑ›F¥ â±O7»@2òk…é„‘óC5“ow i[�´K[EtÈöØzYK‘{µÜ [B™lL7¬Îºú?«ªJÔ\é�ëTÀtä$IaÕµW¹„p–ÑË<}ž1~›ãÆk ½LÄdÑñ& ƒ0l—¶¤†¥s2ÂQ]š±m ÄXÄvœµå˜àusK8šÞÛ=ÁRàÑ$ˆàÁ…󖮃©,ö·`@¨ùÄŽâG3Cð8©lÎ3ð¸^Ä0æöÚî°GÊù—o¦jée×ʯ¤æµKáõö©ŸÕ‘´^Álhz ¢Nn9Á|¾ƒxJ�3u³eçÁå·;¸]õT÷ÊMÊÛ¥1‚îrt *eÅ¡ †laBñ9ÒçVyöç»ì�OÎÙ.½eÀS�™t¬ÖFQ[{�7éª7p—š¼hVwì[3ºÊì·EPñiDÌŽ±•!�ºgp~"„¶x«f èˆZí·Žûx·C!� ÞÜ,2ÿ9urö t2 :ûDË`×ía-—�˜<jƒß&Ž~Ù¨`K!?I­¬œÅ\t¨©3î}bŽÄt¶Y³¥Zºˆ6c@5¼ºÕn3ßíúƒ$Ù´Í3XmªN+ã7Œ•…Ô“Ps9jæ_ÄñìòòPÔ 5qgâµ` ‡cÊ´üG‘×9Ôä§ îÛ­·7CËdÈ Áaj³¯£|hf,¥@““¹Äú²Ë´ÅÊÙ~t$ŸCã$ ½ ÃqUn{³A=ª]çu¬-Ô7v›SêÒÄÑÅ4Ð0žu„ÔÈÁÑeΛÄÑ€T´ýò^úæé§È.Ö®‰.ƒc ö M#¸Šøñ›¦KéÓo…ù¦K�/Û»­Œž�ݺuFªUõ Í>%àÄAH§-šØ1¢Ü-:; òRM“7ÊÞ¢Öåe’äwV8ï}¾†ãˆ$Ì¡Oሠƒzeµ uçw¼B.IÊ»îÞ°¹ÈØd†Â3’/ «ì„ž~7—°¥Ž™@¨aà ©ò� ÿJk7½®>O ÐZqG!oÚUN¢€Õ–åX˜Ž©Ë—rZkÜ_É…§l¦ªèýâj±5qj4*�åšOÈtµ§''ðáîäWT·…™>M_3<ÓÊ�†Fã`;²ÐêX¦ú ì.ȳ±¿m]ŒÔL¶ŸŠ”2?32åâî £ç�(Òб°–þ–‚CV¿á­õP �õç ÌŽ·zY…¼Ã$ÍM‹!¡ÙƒT7¼1ÆÌ0Ó k3H ¶ B·|üfc“o\ŠlÂQð¾ vˆM¼}׿k·N—îß��§°‡>˰<��…ñMì ïœì|·eÆn§8ˆeÜ~Ø›ƒ�tz3Å@É\Zq�~{Ú±¥,™a²¸p7Ì`C Q�\˃GVL¹Õ>Vщ·5�?ˆ1i›¾þx¥�CsÈjð”îû¸ÅÏÜ|¿Š‡Ì™Ðe@€C=5”æ‘�C¥×‹v �ÉAB?÷!ž�"ïF.Ý\Žíd÷jIjš³e»çó}º]V¾òµím rZZûz¦î´@‰{_Ãæê]±¤ä©(³6f÷dbÝ 9äá„ãc¿`µˆI^Àßf öx7gÏ-K ˆ&rÂâÊHh;ãË»ðwdÔ£ò=}E+³+1d>[¸×~>}}].;WñýIzp†0üRWpØc•á·{4¸àxG�[ìC IÊk �ÁP’Ñ} õ8I– "ÞÞ5¸*~îà�׺ͫc«q͘´Ê |ÝÃͦ819 yN�–Vœ¬Ó{%¢P¼m(ÃÇÚBæ?Y�¨·ºß37~|\À·PÛ­>à&¼Z¼ Gœ¢Ê»�aù¥ü´V[äBíAÐ/t“Ítv K…›ÛöÄ«G�)hÛLì=¢VhŒnŒ±<ÚÀ=¨.‘4 § (”–®3%ÃÔ…†à?ˆHY-vÃiÁÞ´ïå¶ôÁÚÖÁÊ�J—ñÖ|<øuÆ|£JÓŽûlq·Ítç/mÁ Ä !¨‘9(¸èC {dÔ±+%ŽÑ›áHì—IsvÎý;³ ´ïrfÒSÐ$Mà6¤Õ×¾ŒýÄԿγ_:E“ÌøÍ;Ì|¾*|û ‘Wi?}·±¿U•g¶V’v}›ÑÍq:³22³ù1¶€º¥Â)ýP�$Üm(¶î¾�¢—i •Ž/ ±6 _óa€³“}Ýljcöû(:4¦ó<]ïo¼ÛjµÄJב'†¦§3QÎ#Uk‘Íðõ7ëÏGf Õk¸ vA]^äÄdIóK÷éÚ_“ ¹-VùÖ0þ~©Õñ ˜ôɯp q#p|ü@}_¿¹¯Ï亇ҞN$TS‰!õ "B¼�³½ëÞ&Æ'mè‘ò"àBñáÅë’ÌI«;¾VÌø|}Y~¬�+Q aºS"ôJþ²Ï0Ȱ5ßÅ�Іš7C³šù­0YÐ^À*LÃíë-é›}‹×«âÖ‘‰>±£2³Ýô#sœ9£ûEoªÈ1Q·òM~eiw¬£U]~×Õc`ÈïÑ鼦BÙõ·xÒ(°ÂR_ªk5ÛÚr#”Þ|`%s®r�5§´¸:ÛdìO0!€Ø.4ŽØàŠ-‘3!ºØA>˜¹=d9Œ,Ëolj!Wl'W/Æe67iÔåF=å»/Yョm¼iŽÈþ·Nawy¶…|�rÕDCdÚ -‘ì^…ݪmvk_N8 ÂŽ‚$ |¥tš�9x1kˆKxFņ“[+y×:$‰°qŠœ–8-!$;O’ï" Vù4 „!Z`L¤á~¯Ÿ�Œ¦l '~3Û r‚W“~^ºÅ‹�î3X±�âg’·¦EÚá ÂïîÿaÞŠn.ºB‘ºpU®•øá`¬ù‚ÊwCߥQçÉš±á À)³ú*ÄÌùL9\¿}¶ñËã›HÀ:w»»l'{–PPÖ)Â6•H%ói7ŠÍ£„[:Ø:R»h« a 锤šx5É1k¦š» ?œlðÔÄf<»k{„Ùóµ|Á2`š8qR7ÆnÇ…f"¡h«‹$?.®šŽ)k‚ûìê ¨–Êö�t�h¶7ë†7輫¾c!†ÊXyÙ/›Êæº|h r{0ÑP½\�²ÞÇ)¢gHW²-™U×p¦›;0ç.mˆ@tPƒ >‰ÕùÕ�Ó@èX.—uæü|>î(¢œÂÙ|³4N)ŠtA[O�—B»ÙF6 FÄoU}Xñ›íçaÿ¬®;E_ÑέœEtrV ®òL1góqH» �”uÝ¿[ û­ïi–Ø'Üäk"ô'{iÛ7“=WLìk™ è£rq¯Û~G{<´1‘Ü-%kƒÚŠì7\6�ÂnrÄׯîÛ±0Ä�ch:¾éx«rk¡–£Ü�Fâ�µPi¬½H]Ã1ŸtaYºæÉxpcÅð µY,\òZÊd1°\ ‰€º7YŸò9Êã "&Ž}˾ø$(¼Š<îá?%c»M�0ݧ/õœÁ!�l›\^÷Çãh+‹l2 ÌŠG N&à îGZ¡^7ŠÚ¸`uÎXõr~5màðr`DéiÈ Ãý¨‹+P%UûÔ! )>éò…‘"«6#è‹êõfÃ(}W I2t+m‡pµØVðlDòV®ÙAÉB–¸Þˆ]§MT¬#ºÞ®£¢IÆQ¹¦€ÞD‚ãnf´fw\>ÌY0Ø÷RH)»¼ñì¹[áåŒ è3LøuY–È[ìúVу�ËuùÍó’×fP×}ꩱRóA”*|ol><ó¹ ©°É L 5‘f°ïxJ‡“N;¡(]j%�}¡ ¡–)ÈCsœƒ;ár3ú¡ÒñÜq3]H,‰}ÍÍ…ˆýÌl±À½%šk�É-§mzP{_ X¾V^kÔœ¸A—8¸h3ÚºÀ–Ã"dØX'µJÓÈëÇ!aÂúÆHöÝtDw·qp`Ž~](Jq’¾N#lÇÁ¶Œ'¡¢S;FNÐ?¸.6 °KÃØÿ2�c •X;“ÓÛ ¶g¾æ$³­‹Ž¶?["_’B‰wUÍ=Ûvëqnøž t¬#‡ Ê/L )S|kaîÐß+gMpæî9Û†S•¤sÓàÂìü@ÖWÙãºüÐÁ×Âß�¾Æ×ņÖ{1ƒ¡ß“d};ˆ–ÊZBVËv™}÷Ó· ï³÷[:^\î»ä¹@`¿9å­Ó…]]¾Ç‘òÚD@úÐùì�oš²iÈ6¯[Ô�2Ý l–-áùÅjZûþ†ï+èLoÓáA_—ªÛ9ÿ­mp�¶ži¢Ó$Cn9ÓÖ.ÿìÒ$�^ð8úßUØ/( “˜ÞRê&5ôvjbKò¯T…™ÖÀßëZ_%ÀêD¦6F!¯VUŠu¦ãf*·uöLG® ql` �T|T^£¢@x1  /¼¼³¹F¥ÃjYÑŒÓ/¹QÄСãÑl|gxT—pu÷/ó)WCœúáñí0'cµÏ‘Ól0Cðwk>\ö-”!ðîݩҜÁÏLg³`ê]›îj"½}vløåJFÕ3ñgçœExÑÁl¹XÐ2I[%6TÙ�&ш ­5­ø·ÊmÉ‘MB†¬NœÎ]é¾NþÚ)íLáï½r Ê‹˜ë,è˰�xv+´ Êã@¾~÷uÖ9qëÂÛéÎ{ì¡zܱ¯ˆÚêo€îÏ…{;0]ª¹ïJêM�,�Ù8[71ì7ž�^Q› úñ��B»ä8Þ«†û¼ îÎNF!&7Ŧv¢V–\â?A»ë3‚åãw]ºcs7 ‚º|Å«œ0�¯w0ÀâÑÊN£B�Š`}D Iw�ê² ­l„m»‹Éì©èpâ˽MP=“†M�(_,<Ì‚ÉcÉ•²¶ý´Ñ•ו�õÉÐdÜŠ:Õ ˜&R¼÷mg b %—ư˜`D•/´üj?%©sµ,ªO’‘ 2$õúªMý~}?}û„]%L7â>žU®'þ�Ú‰9‡ð?kAH>zÞ\B&¸¨)ÀíKM‚û6æh'€X«cþ“FJLóÏ7~+Vê°8úÏ„{ÅOZÌ��ígèŸä˜ZÁ&$ÆÐÊÇ·A–0é;W^.ë»]«˜­ÊT¾×ùˆ�#bçF7:�&<=ѬË-z+L–ÔBk�qP??ã¹�9nN—*†ì_¯‘´ÛÉp(#±êû%]X7AÍR€�ô@Ž÷$ª*|G ¢-¼ÑAðßõS�¬et} Ú³gTD.^øÒOÚ<t+”Â6Ÿ2çÁwµÒ(ƒa¦y±Œ–iˆ®-G»™ÕDÒá™N)‘ÅäwpU{k©úÌç€SýºÍ°÷ú¯•¶šö–,ÎgŽË8ªÌ¦-¡†&6>«EÞVà^kö1œl7—$6Ö*Þ‡íXwŠI’Øki”$Àë’m&× 5÷ 2´°eBc 8T°-_§yqÉUOõƒx±c­›Y@ÑÜ{wì$Gú–Ï„9>º ÝÇ—þ¤`÷ Us]ë©4ŒÙ‘ÆÈÐW~ktø¹ô-qºŠ<îœvÇ ó íø9É0ž”Ñ!"náE¿É›h÷ޱÍ1ićU WËÀjìkû3ïwy2p#ähËðwR…ÞÓÝÁ`.5‚Îp¡ébvKƒ²ÅÑçy݃&«¦>ˆ°ä˜'J¹La¬�O›œØ-_jmA-5S‰%g®˜£ kuù\°�ï—æ¸(lCd@G²Å£Ë½fÜíT6]Ù,*ÅŠÉ0£á‰¾Ä·wH‰¬@üªÏ}P¦ä¹8I î—â ýÇ¡pÕº?!pc»ÆÑx¹º“d1¯-òb£GLÕ¸ñ�èHr}KW–ë8–òùŽÌÙ˜E‘Ös=’/ àWd‡›cÝa”}�žÆ  àãžmA�÷|‡ÝÏ®õaSúoµ�æEQn÷.’ý…HüU�;g'pµÕOÇövÐÅuÝæŽÐpñ Õ¾ÄJÌKYô6 ó}¥°þz8Çã^?¹áõH…ô!F�în·Ü²%ëß?Ï�B FéÑ83—úþ_�¤+Dˆáõf´@HöŸ³ãjbÉ¬¿ ísL†Û”–%µ ÉîÆ¶“5úpV3‘c`ƒ ^á˜q¨³|&öl±aÊ,„a¤‡c·´‰-ÁìדaÔ\�+VI­®Iã�Ü\7vD­øìLÇk˜5‹§‡|­{“¨ä‚/pT ßž¢˜oó*†GÖöÁ¬ Î}ï#Ñ ¬÷ê±Kä"ÿr/…ïƒ;¸í)“õ¸éˬ׸Ó&+Яõ·"D Ò³’‚Øœ¡P@Ü{žõƒis Ñ3>¼“Bæ à�êê7O’7çu0hÛP[·ˆ.ú<ž¦.@˜$€Ûç‰W¸[ñJë}:Ü dà³�“Á¿JdÕ-6^RËØy¢mØ’ìÆV’à2‰dÎourô Á[ VÚþ�@¥žÛm_ékþÊ­Ým¶¯¶«mZß×û?Ãú½þ¯ðÿ~Só~t—MUf>5· ãv^¸·ëÂtU �µ~]B EkF›ÆÏýSU”�My© ”–/‹�ø¥ˆ¶©Ê¿Ñ°½Gý'çž¹4â¥?[€‹üãqrñ0TÉ�)å„Yù­5Hº�¿HÁÉ.¨4jd€8EÈ¢áTÙ¢"¤~T¤šQÒ4ò¹hÒ¨>â©§„pŽWNG„:E2r,5‡¥=eM‘ƒc'F˜ÝZš4¥‹u`x.¸Do�²(Æ�:4DƒáYW±@TÓ$|0°p@±–eH1 _��¿m¨7 ÿÙ·LR‘Ç»Š$d�‘d¤Tœ*9oä;iþz™7"Ùð�² ¹§ñŠdýË0 Éɱ¹ ®2£HS#ÃŒ+µ(:`ˆ4&ƒ$I »ê®3ÅM‘&äp‡4 èþ¥ @ï–óÃ7ma\¥¸úüPLáø·³Îˆ.'ŒGÉc¾¶'ÍlØ\+-'· ¥W°XÓ-”ˆAâÒFÏ#Ýiõe.^÷ºÑŒXYpÌ<Èirr|ÐÕÖÂ4�@@”­4¤…A�l6Œ³¸9ôÌïœ×y×E+J“SªÕb°AιšÅñ¨û êÙ |[¿¿àľ8 ¸åö¡!ÂKÄ•k[¼¶85íKCc»·«ÈÌXK'Faݯ÷Ä•Z·òç~‚¹Yõb²¶Mù@¥*îÕ÷]=q¶ÙAPÛ|œÄuœoªAhTö\ãs2+…·©™‰�¹¦}ÖnsÞ*Ý0r¸%xéâÒýý»õºs=È+ûŒØ�‡´:·¸Ò Éó»\Äšò7‰á-ùž<^Cû}_œ±ØNä‡[¢®¨aFö˜íþ{¿‰Gzo Ãß¼ìöÅùå}*¡U.D9Æ “ØÜ8M–=ó�´È…Ь–VÉñi¨¢»ªºä;܃b”-R\N†ÖEz$zlŸØ·__6©x<ûæÉCeQ÷˜Ølûo®Bð/áOCæ)º0/îï­p™09‚âêsÃzœ5Ìvh„£Ú„µømˆú ì±ý'* U«ü¨0¾PÔëFjlænŸ¾ÃLȲø±àcÝêŒpS¥-=µÂq“r\F2È$|7É,É�5Ö¤™Ë\½ÔU²:Á@¾c Af×É}tÄñǹÏa�cIÀ€çfo®”òüæ†O$åËÆè³ÌBdñÉâšF°¤Œ+&vmÓáÅêt?nÍ #¼‚Hn�;73b~9R_’¿wÐ=,Fü…@‘lжñ0™,¦ õ}gÖÖ-_}õÐ^9Î×'rƒ™÷DŽ%`õ‹$^\x%ïmú R” ÷œ“ Qc‰ýe½kx ¦ßÆL÷ú làk¤]Ä…£‰òÐÝ==`q÷ÿ@?±‹a4¸ë�g€cÙ¤�®Ø!|ŒOª÷IþÅ�ïs må^)º‰“»ÙÌ�ùë,�À�—ð k�‡›µHÅ€/æ†öÚ{Ù¯&¬¹'(a׿” .~{�ÈÎ9÷»21wõ¬„}?fÑ^ŒX2¤ÙÅ]&ZAƒÏ§¸äˆy?€JR”6•ÂÛÊXs/7÷Y ½}xר %ìêšþ?¶?Íw�tõ(`»'Œ}|Öàæ›rNMàæË‘A=qÖ Õ»ÏœÜ'áOàc‚‹º{êÂ�`ƒhH‰ ØÔVûî’¡ê7ÃØ¿ÍÈ+¯Fn^rm–G–.¯OŠyÔÛÝÁdÔ4þ[ôìmÜ¥K&ª-B¢{mY±’ç¡ ¸¨qU¨5!³¶²NÜŠâ1¸Ò³ŸpMms.¦ ðu‡ßÃl2ÀaÓ Ap:¿¹ž9‚'~Ó:ƒÊÁs‘ŠÃ_N –\Üxœ«Íæë¬uÞÛdåéDw5yíát¡¶W'g©,ÀO‡ËÐÒ6Ç[¿¼Z–0iƶ—�Š�£ ¤+亂ç˜BqU¬ná-f_=•ÈðÛÙ÷µ„hM‡Í«–ËQ\.œ×}vcÒÊX¥¶D9·Äé>ÐÂíßdŽÕs¸æ†3î��Ð Yø^ëÝ׸v[sly"‰Þse³*AfŬo96p*‘§©Eøy€%ß7n§[ž�X½§ó~½ â±[ˆß»ï³pêü ew æ3ª©l¬W` ìæÁè òÉz›.]-ë¥e‚±ÄÊv‹#~ÞˆDŽ Ð0í˜vÙ��Ö1ÒHVÞñ-r0Í´š^—rùRáO)ß`Y·€yË変|Æ¢³(DZËëÒRÏr…E‹_…­\xóu‡¯$—!PÅÚ½ž Ý‹ªªˆ(åžóâT·`Æ:!ËOæk|™áÕcÊt2ô³‹áµÞe#u=—3lzýDö™’ðÞ›SÞAׄÓ@Â5¾•�QíÚ™§Œ"ÝÄÒß&!¿lðEÀõñì?BÐö¸-’Ù6sÊ; SÕùžä8× ¿ �4aÝzõ �jÅY‹Vkó*¸µ!ò0îßMp¾D쪆¸mn�NÚiD³Z ý;5ýƒö¥×»…Ì…µõÁ†¾³ÛÚÛ =†$ý Ð8i†¿tø÷Ë­ÙÐ÷‹æ\§hÞ“�MEœš±uµ‰‹O:¨ÂÛÉÆàU²ÀÕÄcîuâÄOÝÁn©1µTâö�Â4x2Q«Š‰!žª]iÕð�¥õÇY9[mŠ*!8ÚíaÅ¦(í0™îžx<ݬ–zMè#¹°äwëašü�ñ®os�/C7�#_%wlÓ�ŽAÓŸ‹CDý¼¹,ÙÏð~DðAãï[åh|U·^ÅöÉcA6Hì^Jó6ZâG-{Ê2ÜFj€wð¾Áðfx4}¢ šëFØVüµ]jí�­Ê–éÁdVad‹bÀ¹Qªƒ©ne‘# V=kŒí_Lz©EäËa‡:ææÕa@Ž= !›þ-¦§Ùª+U§m{U,ÛxpÞeÖçqY¹9%…3tÚ\Ná`aÓ *�”ç»Væ„I8wÎß³w¤n=²ÛŠwRÝgŠuTM½î wRоá;·X¥ …½ùIœÖì|ï"sç çÆ×¦½lô&*‘XF7@îiÕíBÓ«^*‚ñ¢²íwW•ÕÙÌfÂI“º�a|¹�Xk]Îã†QQ¸Š>Ò†r«ÎÌÞ–qæ–ŠÄð |Í[\ôRù�lp[œ“ñÄûªèr2ðò€EZå×LJµ-pŸ+53žHˆB�f+°ðΘéDX­ì°N¶ÔcÈÆ;Ë+:÷¸®`M†$›|$8.é‘aÚUEC{<� Ï„s‰Ö!\ñdu#RPß :v�dXZm62#akÎÐß¶½(ìC?µ‚æ06»x߬O¶Ì½fŸ‡rÕ¸:f ùwxègl sÎÙÍRÌd}L�| nQ;ضAÛö ¼Õá1Ìœ“´qVVø"ª°¸–�­¨ng,™É VâУ7X:R”èR�NÐ)NP(�éâ×±ƒ+úY2>=ªpÔ ¸PQ~>jù[ô½�d&í�êÐna½hÐZö=,v©?�rj‚gs¥x;Hü™/-yòÉàe¿ÿ P(D¸U{ skãXå˜L��þojáÖ·yÀËaÏs0,IÝ]H�)(Ø‹åø,#„=sZ™Rï6êxߥ¿¬ÙõŸœ4¶)É‹=ü½öTP´âN‘Š:·u³¯`»�¿GÀ\|?�QW¢ãðp!ºÙ·çèÎZÉÊñïKÎó=m,@xÀ¶Änk©pDQÈ–ªÚ<,`g9*šj¼°pk` BÊUã<ß‘‚ò¨Ó³Ûÿ�}U‚¯íõÞ²ܾ-g¥÷bs.é5/Ñ>¹rãÙÖ7Bá#JUÌñCÖÊ©¹6¨-õ±èPY"åC_\ŸòDjÍm®bš_•yKù,Úús~Ž»)�sŒùíIQ/¥ˆð«‘Z@yîtŠŠw„S.ဩZÃÐ6:”'e¨{â!zÝ€+h±@ß`ßqËè)µ¤ÂkBA ´Rž,OÌ›‚r‘5´! ±[óšvÔÒkN¶\ïŽÅˆ—5=Ê_DˆÎ{Ãî0DVÜ�¨y€aåXé�÷&(\:üøöƒ¬óíO¡))Ÿj7®c’8'ªo½‹÷_!fåßm ¨P§ˆÈJh>¸®ú8¯³ö�_‡'Іö–{}5Q“«s7oL…eÇx/×é´;\Ò·R÷Å»©ó°¸Ä¼gùó‘Œôë{œ”x`X SÑè´\þb…0ÃoE=ë¾Ey€‡´Ì&Ûš¶ñȨé`Ð>Üxx‘u,(yY¯ B^Êô O ¼¾Þ–¹dËÀ…/kÍv>[ÿ|�¨çÜíd�qß~ˮəf~ëõ Äø;–•�xP ß§ª$ÕÎIº¥¦s)(>Eí¼Ìð­¸Þ„ <Ú'Åófâå�Öè3èYÓúOk¸þê�÷Ò§µðš{/E5ón÷�†Žÿ™;�N~HTè¢rä@l§©ç_Mà;Á/bXú�«*ÐùMþ|0¹fv`$>­d<ÀÓœjf�Ê÷­”}MÁÞFï„°±³k‚)l®b„˜ƒßÜfqÌû—Êæ—êcÈ1çÛÖ2x„ü&ö'(σ¸•¿@‹ÈXÍÍFåÜc@–9]ùq�j¢ ÚE IÞ|Sñz/Ϲö÷„Ñ8´ù{œx^F>�ø¤Z.iÃo›6V‘öµw¿`¦:�'§tè¢Ø R'`Ú9É<¸hC:GÈpÞÀ%)‰aò\ƒÏ<¦YÿéàöÜc²y�b5íõÙ’·©ëÍÞÁÎó—·o8Àe:ÈöØB Ê ùñý’¦M»¬m˳ŒZó¦ µ›50c`ÿVl<œ'ˆ&¬]ëKâƒè6ò&ã$‚¤ˆ«�¦yƒ?ï×—¨rBEå“ 1ƒýÖé§H ÄRùß3ƒ§YØáºíéhùþfÛÌá�Wœu¸®1ÃþÍKFÈž«{Ìk9 ['8Ö ŠÅ»t³š©7VÍ–!.'e˜‚´ñ„6åíf¹M†t®øÄ* Uv†¼“}ÍѤ°„V¢:KPÌù;›î.·ÜSy‰�Ž’àVµpÞ+x¿9¢eN¾æ!±÷¹‘ä5·;ß="€R˜Š¸l]Ñ ¾u9oµ¬sä…šÊg‡gf³gÆÐ<èd±[l8m°iÖÏ•¸ù`üˆR€}æömW¿G�){Äßåa?\YÏ61ÅÍM\5âœsú×H6ч•R`…xP xdÇyM¼;ÛàC�T¾gôç”Ûpí8™„•õ¡/!Ýî¥çsEbᆨITΚ YŒ'ÜgÔxñk°D ÚÔhÕ*È1>ïÁ–kð¤ïé76ˆ8ä>,šI¸X�nY@îY  4*`s¶g^2@xøŸ¼â6óQÍöØí^7?»Â˜w½…u÷œl¾!»Ñ\J¶G¿%«šÊƒ²€ÓÀGΓ\¨¦+m¿o ‹¿å)@ jeÌ Û̧~·0^/Ž è¥žn¾zuQÒ¬?ò~„¾ô4PÒš¾1°GUެÖ‚ñoÈ!ˆ拎ûÆo…þp¶ð±eEï2ÇiµŒ¸ Ú¤2ic": �Ù «„jG¼#iüÂ{òt®¯aÊ à­ˆô~Ï9Ëd%Ëgšv¦åòCàd/cÀiIw0’C§ýÎ]íÛoAkbG³Æ¤‹ É!‰îqäëz}Ñß8؇ÑEǰËcäã6=Š¢P.ÿ¡ -Ñhb•ÜNüro‚žô®1¯JmHäñ�È‚%&q3Û`ӛхVAªä5À^yDaÃhÈH“źçO' ̹p�Nl•¤,Ä1�cQL„=®X4vÚQ3”MŽð_�âËs‡á†r‚©x‹áã»¶JC sâ `Ï%,?“\!÷°¶&2Tm+µ›òíï*;p7pŒD¯]óÔÓ÷I iÿtS›±¨ûÛÓPòì  åÖ%Í… ø�p÷ êXçÅ�o�Éo‡ë "®Ó?Ʋ ¬šŒ:l=Ò¬ÄöÐ�Ä8Æ‹ª8Ádfe4—rCÉ~…‹i¹Ð–¿ΛÔÑc?±6Bžus蟕ÎÖ¦wêìª4‚ ZLQ»ïB“±ïı�TÛiÒæüŸ8bÓ2æû*²´9…œDC”â@ûÈ–~——öPDߓ“¸ì¸ˆ®rÉ´XwºÖ¸F«ŽsÖñY ‡Ri9’ä)à:ƒåf½ £é~Ä"ÄäœuתØ#¿«ÇžvŸG¼*�¿ZùâÏ„8÷�nôð^žtA¤�ÍI§µPB ûYÀ‡k“§.5ËsŒ„œ8ìOñ·m W^%1rGÄï¡�¥"jLÆXûŽ™Ô·Õt‰:‘Ë×#8Ó�[ioQïR?¯±fSĉƒ�À“dñ¾;úRÞg©å2AÑ(Þ~íÞïñÏ­Ÿ;îä#_}–î(#�ÎÕ n5ÆBŪmcœeTÒSXÅ=ì=ÝÊ* J†  ] Ÿ“’!ùtŸ­–vÝ‹¶%Þ™ðãXâÛo JF6½w[‘ÙÛÓøÞæ»–Ì6×Uq]íÿq#âd¤Á]˜ÄWvínÎ=彎êN�óiËÍ¡‡ xÐ:£”*Aï‡hž>ãx£u=¢i«³ŸYtB‚,o?�.[ÖËdŽÜˆÌO4ó$wµ§DìÑ÷!Y,„µDÿX÷À’¯¹RCζ@r¶²ÖsÄ;&LðŸrp¥¿Ñ'l}–FÊg—â“ËûÏ týÌóùÂÿZkRh»ç®·žµY²îÒ±–sûNàS=[èOz·k½×�¦O¬˜ïd™“^~Àj�³èL$‹qfÊ‚À8õöøÏNsÈœà*iOEZ6IzÎê3GµG‡ÕõeÆíˆÚ°É&Û僮ïoö¯ilزˆ…ÁR±Hi^ÑS#›Çê«×¼ÁÅ5jät¡¶ö½|Ž[YÑ+„í‘ÝÎ!^G�°vLõ¦\†r�÷+ó8°‘d9ò}œÒe{ñgävÈuçJ³ž¾ËÑœ+Žw�slŽ¿'2¼n '8“áKäߤÛHèùZ‘ñå`º îã\3~:…’ÇèøÈK„ß^^Cá0È}Û‡AsüüŠ©\µ�™ â;i°¥‚k�ô­ëÏ—‚��öôÍÝDã\½Ûíš�ÂÊ6ÎÛsZ±Àï;ŒÙF(´;û†–.Åi º}–®‚¸vd�$ÔÓ‚]%J<@;ÚʳßÑœ—QVº±´Î“w±B…d—8}å"Ô&Ö(s<¬"T1Çotªînþj°Ç%ˆ½'¾[rà?£yñqT!jÁ ßá.1¦ÚR‡È_š…Æw¬Ø3H{=õ]ºN¶îï˜M3¤c[TœmùlgŠsõ™3Õ6œ¿A`;Ðã8ò-ñ‡7&¿[\Î[à®ì~ÀïØ‡Rí°LvâÛ擉eA«l¥·U`@倔]‹ª3…¹µýLé�t !rÓfíϤ¡i¾ØÞ=`©ƒ_T)\{XZ i  ‰ÁŒÚÖŽ/ƒP�àÜÂ\.+é�ÔÏùHbZæk˜¹Ù8ÿ×ç„p_îåJgbµ—åÜê'*ÿÔ�äAê-JW»¹3Ä¢PoKœ§ÖÞÿ;éV9ÅÀÁë¦Öë˜Ê ‘L­×è*�7m.Ãû4Žé÷¦}I]$VF.>Ð'ËJ±éÊae3¹†¨¾ÿL÷Yí¹”É…ÝHÌxØT줅ÓoAÛ ÞÉ�ÖWP{ÌÞJè~^ŸÑÉ|ŒÃ•Þt4¸n¨Á¼ ÜøÂtZÕðák¦w{ä+�{†Æ‚_#œ•�ÙÛ "�¼k±ïvœ µ�y:YZ`^Plx£ nˆv1寑�šÊ¤N Ê@ϺZp8}:ËÏ´bj Ìfæígæ÷4c³HZm¦°l“Ty>ˆ^d #e··3€<¶÷ñå­›à‚áUÏ<ç9$½;H43�"¬Hâ˜4¿¬î|úSs÷7i B�ÞÖºãVå¾uàk4ž» @þ¨1]áK׊[@/ªN©ÄY+ºLÁP”Œw¥nº60Ä/‰B©~{7¨‰$×áL0aK¼=_aÅêìwM¡�u+ô– -¬7_�P™¡Ë£²w/ _a ÆÅPm¥ÎÜçYÀ¤©2Äë!v;!vn» fl’a|´Ž] 8é²\÷`T» #†—)„ºÔ¯ÒÊ– RÚ ÔôùÀ g’ƒ!6 ‘‘-ÎknBï !(-¬¨(¯å&˜]ˆF1ïgo"_ê}‘xpãÏÇ~ȡ۵…ÀFƒ˜2mä ~³Ðñ;jÎpgDe–Æ‘¦z3£ãáê 5ïfwƒ}N‘‚}'BÜjE¸¬HΛáo•Ä ËKÖ< Ε¿c£g¿­öIÕƒxfOi-6|ö(;…g Æ×ö¨Gp¯è]µ(Ÿ(¢_qÿkïäÈéý‰UøÑ�²¸%qÀ1 =îáxfå,œ-Æ �šh…#�ã¼êp`†µƒ–RI µŸ ¥ECµúgT#³›•Rô/Û]«œæd1YªVÂJëÛxoRšK…tÌ}ö#…Bà¬öDcú.É(ÙòýCyÌàTE€þ.oæS{LÇ4ãÌ•gO»(=ò�kõ¯òååî�³ á:CþNÓÐ|Xk© à·Ò —þBm=ϤlWÖ(àóÑóìíþÁµVÓ8*²�ÓA[ÁTZî­hmÑu�õ"¼b¸£vÿ X3î[A¼&ˆ;½«Þ,ŽZªÁͦDØ‚ÝÃE»’/¬UhºλâÌÏ¿1Gi8NÊÀ€¤@ç�Øl ÕïêœÛõ†#Þ³ü´ö�—û~ßt·ý�­KæÉM�yZ/©Kod&A³¤?9ÀÃéß6hh¨‰ö1Ü]ÍÿkfvsáÕ±ö@‚8 d© ¥´%Õ 9º29è0?w_^ƒÇsK‡x}à*ó¼›ü eAá8ô±¿=šãÁaüA,¸lQ‡[syÚ‹í1YB+X1s]àÉߣ )‰aø×2¡€¯2ݼÀìP‰ñ ^îG£j0ê]qÇ›ºÖ3·†øþßè¦kö3ï·:Í-þ4‡ÁJº}ïšgï�Ÿ¼Gµ³û_ZßC9¸äø¯ò¬i޶tÈöÛv~Å—xœ J•ോž¦^;ÚËév[Ï'ÅIO–âÈe9 l{MÑ0­Šî»Qûî\W±ÌdÙ+7?p*J E—* �Çøš<%¶ƒàˆÙ+^ئÁA1ªÁ“–\�P_â°ÉXÊóå¬ ôòXÊó‡íBKR;ÒÉÛ¯r+F_µ!šaMUš‰"…D2ÇXŒ¶ôª’¾»ß~pÔò‡sZ óæÀ9m­Mlä ,"#9%M š'nøÇLî¥�Þ¨12ù¸8‚hë¦z0v  'u[޽³|øwñ<ß‘ÊÜåðZ{/äiCQkÛ´ÛïcÚ¿%­Y)XãYó}Þÿì1ˆIÒD‰kñ§]«0~•Ò3ô:V ×*IÃ÷Ú7ýƒÈÓäßDÄ5 §–åNwU`û—EišXÍ,èÿF|l û Ø·Ò?Šrˆ‰¢FžÚ~ÈQ¡”ð4Ý{ééL[•„"¼p°{ÐàXt’ËZÑ&À&‹„†`8 /¼ÝÞû°ÔðÐ�Ñ [ëóî ‡.A€Æè@§G­ý);Ã�âàÏÓu;}iX)ÔØþù /Ú\7RùÖ1«ƒ×™ÁØÁ©q–:éWß¾ºní;~„.¦Íó9RHOênqíŽbÔ+”sÅ—=»`’PñŒ�ËÆÐb­Nމ¶¡ÅêÌHjìê^nãQGÖËÝ µo£N1Rþk9uvÐT9®ã8ôdÁ|ÞZŒpõ I›ÁŽÊR.îÅùи™ñãð†ïƒWS§áìØÝçˆälÝwoö±Ë9Eß]nht£Ü*Ÿ;!4¶††©õïfo߬á7 ;¬R?ï8çÀ9º¡2 ãC|µ™ 2 ¹±Mhî¹�l³°Zøˆt㦠·Û(«ªÚo6­|ò98\~×' ¥z|70òâ s]TµSŠÖ±Cà1™z&FStT­3øñªa€càä©÷úÖœÌ58w°`zImóøAjÏêÍ`Æ©áßÑ@˜á˜‡WPç8\Ä?7̆-†^: Ô£d™Sæ˜:2ï}‹Þ˜Ð±Í–ïñCÓŒ¨´TrS1‘q°Ccf¥š Ø­çØ+×MØz§ìªŸiu¿rm [?‹°ªWåh#@6š.a—@üüŒùú¥ ð¯è(¸`u-´¾Œ`,ǯ­M9¥ ÌáSQ*ZV¦� ƒCß"ž¢ðAtÍŒéo»×4›{—Í!¾{¨ �I¥±Ge "ûÐ%±ÉH¹ [ÃfŸ®w%¸';Œ³f†UF¸úÌgšPžÄÍ.ŽÖŸõœpAZ*ðúUº7;0ýÆ?­Â Š·Nç»Èï{íŽ3)ä+¥çì¨3( o{uZsO·(toÅ�Êd€Ü@ÿ_nšÓ¸ûIJ—êÍÅñ™Fоô~7ÉÇœŸÝâÚ7`Yï{Û>bý×AÚ Ü¥ ûQ{]Hñ+Œkº‘Î|d­ °¸Ž {VÒ:É®­iíþRãÞaínÖämÝÌ#€³m'½8œn]½°Ëjü²‡Ûõ¶½úÄYoÙ"2]y¬³ò ¦sX¾4š’ðá¡ í~]‚+*ýSÙŒ.zŒÍLakg%¥³`´ùõ½ÔÑÑx­é­V!u*=ÂLJføM–ÆgtV{=Ûä5ýçLïÖ¸Ù´»šÏÊ€}Hëð’¨ ôÕlˆxôùòµ® °Ö¾Ày’ÝSá”W=,ÿΚ¶aÄpº{tÅØ: ÷1~áÖqs�Ê)Ú_’·=]ÙX£›«lûu9*kE @0„Âà#Ý!¦WÄZéLÊz%4÷K[ÐðÝÝy¡uKÁÖ^=pÒ-ƒ•p¶™@ó£_pêN‚¬Áöcq˜˜@3eVÇc´‹ÚñÖ{Ëã^†y…{s¢3µ&Šb,·äÚû±· žÌ>�®ãG Ãâ•x†³›ìŸ ŒÐ}š¾«�,^A¶/¯^†ÒxlÛ¼)I¢«©7àœÚ"_�“Øy’ÍÜ…¼ZmçÓÃkBx+8YÒ°×&.ä‹ÚK­ý$>¶W5—ã<ýÕ8!íix骯îa£ï“ Ú7·OßÖ~"¯Æ8æ ÑÆ�]2ØÈ€ãûé2¶ÑšáJ*@CŒÌ ÷]šãÙ„îÆZ›¢ë/õl€¢ ¬#$OñDZÌŠ9­.P@çCÌúp}µŠ4šRÀ9)ŠÄK‹sßv<±¶¶aä¯{ºÇ휑`[ ׿Föë“ܲF3…?ˆ$õð]ùŽêÂÇ9úŒöZ‘ÞVo Ìž�rºsßóµÈ5–‰¿C@�h õ¶LóÀÈ]êž,g¡ýø= _³ßé ˆ¿¯ܪãßÖamR� 'Å™W]s8Kh3je¢«šbDt§¤RY΃iI‹ó$WÞ»Ôæ‘Õ1åÂ\6ò~°n«^Ø=KhNOEgbÙîJö¤z ¡ŽâòÊ$à÷œ�Ê�Š WÓ‡ZÌWÄÞÑâ¨^1’9]ÚLvå+jbÒMõH'›ÆÙ…-tV’<]c�‡­Tθró³ æÿeò¥ÎkŠ_2íï,߈•+8›÷·¥Õ™.î¼#Âd.®n^@”rR/rÛj:,½À*.uÍBèwØ)ë|Ù™{VüæY@o�Â2j%Ev*K]¾p•² €ëK¥2?ÎùA4È!a!vêťÒ{Ü«à™K¶X¨«_$ï DkÛï ÿ÷4 Ñ�£’ˆ ¯¼®¢/fþ"Jª�?ÂüD�6i­!HÂ"°¨‹ÃéÙ„$ì•#ùö^¼B8Ž šzh,E6iO†#ôª³oS×L˜Ã~š& ÂøÑSÆZ0që6N½_~T4ÿîãÞÚh8zhèÁpÎX>•¥] 6  œ�6iJöl‹ÍráŸL8Þ°Áfƒ†HŽKŠ…F²l¡áT€8G|ÇÙUåFYSãFŒKÐ9©úBÆ×ûå“•AÚÙ€øãÅ{* �aR”ÑšB–4Ñ ±Öbs”�,isiù¸vGÄ{*ñ§A\€?/ê®öÂH�XSg¦€XðU j„ �3�0��Ò×4éð�¸ÅÞ”ŠŽUâªMó¦’ªI&˜!ÇÓs@,h)b(Þ µhæ; (7ês“AßrF°† o˜<¯�¿êÙè3mÕò@é d*ýi›‘²;~üì@Ù< s œn}ú|½!‹�HŒúœ"êÍœ84EÈlõ®@úP6€óK°†Í­¹OO½ ät¾ d˜Á ÌªA.„¤)D7X(õ¨.@càÒ ~Ak*R¦ŒbW~n»"ÿµzÚïZxhö–$A߇Ÿœwj€ 锡tÐn[ÇEX 6@P©)R˜ �OãG³µM4@†Riº�ã×S#$ ~�߃À#„R²€bÎŒ²_•5úZƒ$`±“A¾ªIì¡›¦"„�•C|k‹µ#«„IÑ%ºÁ£\�€E"Õjl‚|8"ò©”ºph|DŠtÁ ér+¯šƒºB,¨=×µqOO7V‚*uTH ©ªø�©Z½˜lшÙ©“{31â÷*žBÙ äñ™×Æ›Úð±¹EŽ2½º¥4D—4“¿( Ž 7¤f&–8oš—”="²©ƒAᦈÉ9¤åô¸ÓÓÓSDuÝOŽ?P`�Zè à£ä3¥Ò)‚�Hb$Úê�@ràð‰uOM �Œq\„GGW Œ�æ�Y å~mþ¿·† Ÿë-Ò94£šd†3)¥HlqY =|wΩ�ì]éï~o�Hæýj'B™ ÝS¦”¥ˆk$lh>4Ÿ•$Ò™4±¥�˜ÒxU•LÝ hß…P $€7•AøÉ¥c„5Hh¸4šAËþg#øð¹£ÝSÂnPá‚M( L°_ÈF¡˜ßI’£Wµî)£¢8i¢;#%®¨�æ]ÖAr!ÁbÄ5�®7"n[‘Ì´¸^á!Ç…ÎHÁîKeû79oŽÑŽ–ð PÑs‡ni×Ï)¯ ß|%8NÎì‹Âc#–ã#77w2ˆ*2´8P§LbÖK5³°÷¥`ÝDpDRô9̌Ȼ¨�Й‰!˜AÑJÛupÁ�Öɾ„Ÿïõ˜K1úÀ4ј^ŒBûVf¦»1ê!X,K5ŸÔ™Ã6ᬠñÝ53û-‘TÃWÈC‡´ÂÂÿ1ŽnŽqy8–7_ÿ¯üf0#rßûúÐ=»ä#À^êäC>yVw!ù ª+3c0Q49íAè¾þ¿8[»ZŒ¢$—;òªÚûùjû’÷ÛxSäìµÜ”kƒÇŸ¯Mf ØÔ´yÞ3 X‘YfbжTrA.ÚÌÚ�Þr‡b©<Ä1dK: H¬EC{\~Ñ!~g{ “_U•&®UˆÔ‘÷Ííj³!|¼\“”ØO€S«›¥\�ýϼÈáéÈ“þ¹ÁZñ`]þ0»¬�Õb2A±:>Wc›¸lÃC¬ÜÚlng…Û¬ò dí°fö#úƸ÷0Þl÷ËÞÅïvð§Ǹ ÅÍx;ÇvÛ—¹S6ê´á“YRgJ$û°t7é¨*5ˆÁ ®¤ [MwòDÑØälØ#yÝQj–˜è1‚jjÅ´þJ;\üpö0tÃsà†ô77ç(Ø›`‘õQ��¡q«´YÖõîA,™ƒJÖè£�ÈÃä$  A䂙Κò‹ øÐ:3RÇÅkˆåfŸ�̾¾B.ylw0m¼<üFÃÞìuŒJáSš0w[‡üŸ=ÿ‹„J¢PßÇ“îcwç׿¤taê¬PÄêÆ " Ý  WŒÿR¾ÞW 6ìå PÍú¬ô$gPµÃÊO /»!¾åº˼sLHd6Zž�¡Þè\ß-ª§¦ ¢è±‹;@ �%ð¶n91�2zÉ„W–Ñ|˜ž�ñkßÚ¯Ž.%7¹?š-ö\nwŽñ&z[‘H�öø^•ì­Û@}÷¶ºJ)a¿#ê|0b„þ­aÚ›ç5„Só.Qïpf±\Ý*RŸtyLJ8Š‚ðøÇrHY²ón—Pê%î+æ«|b Fch�ïµ…ðÊýíøì+•ZuJVpvJV-n¼lÒ(OÙ°4¸¯#‚aÅßiY~~i߯æÒ·r´=Ûqœ½Ç^í`ñ°{)Ú`û“ÚúÃ6¶&Îtx´cñ\Aõû<‹,Hw`YÉ7qQ�êg;Ä*CÈõãE{з¯ñ¦ ÅûRGba±B¶´0ª—ú«Ü¼¥v@ïkXùím74—»pt’æPü®T™Bc{ Ô|WN�? å­ûذ`�ò šºo§€À 32°oæt«óݶ×DØ \í6)ó5½¥�Œd/ä•[™• ·4®zGtž4°2ûð «k}2Ž^5�4#l¯¶ÄÞç�n®3;AŸ­\� Û%3Ž>kTí¥_?;€t€qÀóXºÁFFZôh¸ÉÍGìÝ$ü%¼áß¹’à:êݽÃ\[“ ê‚Í‘�GÁ•v Ô›ÚÀ ô +¹ñ؃³XÑpê W½�„–qŒ'&ø) è—d·Ì…oh®i©Èárá+n›CzØ@!—á/y�¾\õ¶n®h\= Uä_² s*óu>+ ¢ê›Ta,TídS<ö�ÀCO8Õ�Êýç ½ÃŽ¢m:ì—lGlh5©ÄÈ{Wƒø-^» ò°�X ·±¼o�g£Á€~üýQä;Ž�dÌIPßôÝC£È&V�²_%¤wêÐõŠ…ðRD媸( T�¦~xØ•^�YKMçÚ”üs à4‰%Ö¹zÌ„˜voŸ›K1šJêKëh#L«I¡JÆmª¡ ‡!À ŒÄú°`vÚÀäâÄÂ)�¡UAú4 ƒ«óq©k…£üH-E:?³¬°-÷`±TˆšoX‰®ã¼Þ{—ìÆqÝ@±dqàæD�J¨÷ "É£“¾6øœI Ï�pOÉ>’}�}‹z]ý6î—V!DWÛ¤GêÀÑ¡«ù9j ‡B칓5~æ?g�W·D“EÛ¹ì°T’pl¿&·�OZ¢|@¹8²m4@a{,´Xñ)ª²àÞ_КŽDö2Aµñé1ôllH·"{â “á]21.íëÜ9ò·öÚ3â©’_‘ÉT’X Ãé™6%d‘ªz·î¡IL=ƒ6ãS,Bžß«Ö+”ÇÃ!9ϴܨœ¯]2·ôù‹FG¶;P¹ªã'L$½}÷ ¦Èb·!^LKcrë·±öGá–mÚãKZslØ…Q§VF»Ã¬’¾ÀT'ŸÃûÃ�QÉœ¶úQ DeŒP„j�NÂÕ6eD@DØ£±S7qc i/P1ãQà½:>ÑQþma¼†÷ .bCá¼>X£>�E�®Yƒr 7 HØÄg—aK$¿Âåm !@Ì#Jƒ )^¡ÝƒN[Ëd;�y·˜t¼¨: [º]{JÚ×p¯mZû®lvÊû–hkºá‰å¡Ü{�g¦ÞÛxÀ“Ò 2ù/}-.݉3ûlÚg‘o„7¬®kL›`C=bÏ÷fê~Ê.q¾6[�Å‹’f?sÀ°Á—cÆùÓ†K ²±¹®Úú@]ƒ½À^ÆÉlôž‘HV[”“«­È,ƒ?UtÀb€ÚÎÇàlmÎ…T6uÍ0D1ƘcuÀ=^7‡Ë_\› õðÙ5Æ`.Â&]£eF“9êš–±ÀÀ=^H£ìnËØlñ²ò$$·ñõ£;ZÞŒOJhVÕà;òl§F2t™/é6âæÉ›E ޲ÛÝ}ŠʲK-ì ²VjÛzi{s׋lLn3|Zã�È¢ƒ}&\ËÆ9f4l™sg¯ÂºÎ%óî[RsÂIŒÁ· 9j'œÖ²Ž‡Ë3¥g6G7®\1qg†½‡ÐÍ ¡æcÑ J…J!Q¬%ìÂ|Ö­½Fª8€­´ÿfðE’äÇ ò\ GÕNõf¦Æ"ƒ–<ßä˜Ñ)óE.(¶0Ä£_&IXwú¥~�� ¾îÓJ;ç`$9«"…á&yöß_…�zv]0Ë µƒU÷bòF8y¥º?å½~Dè¿9¨Ø.Ø>¶ÙK�€'ò4ÇxL¶Æ"€ÚÜ»‹J$4)k­Âk6gkA*/Ö[ú›­u~!"5• ?¦!32·?G»Ô\T r`V˜TÂ1kŽÚØÄa.ú…æA'OlÏpr¥“°½ II}œz.îŸO+Æ8æ^ʯ–€EsÔl› û½Æ}Ë„iòöëØððïÎðhÏ¼Í åÇñŠÇ�u¬•jwîM¬j–óC¯´gG�(„#� },62—qù–Öv�aæÎc,ÖGžKÐÕöAþ_ñTâá“VÕ\c6t‡aëPŽªš}V´{8»qc¾ì§€Æ\YG  Ôꬡs—0÷cN·£ÂØñq;¼�W3�¸ÃPÖNìîþÐ' ¯É¶oÀœm'­Ÿ[”3ñÞÚôÍ¡•SÏ ¥³×o9i e²FRѶпkáR™šG¾ã6»»ËÏqÀp|8òž†±gÛRBS�Ó[I…M”Mñûª×¾n62j3a}6“q9ξåOD:é‰:&ŒGŠƒÎo(k6äš~»Ä ’c³ù£¤º B3Mizâ ´ò +ÇrÚ:±ä‘l'c‚ê‚RóÊ䀇أL�í o¯„9ô4�&Ô8Zè?ÐÓ¿e¨/ÐÓ/™&~¹²hö‚½à›@g¿vûl3dˆ|™F¬A±sÏJ&}ºâS|>©ç¬YhàO/4¨§&mªB¿ ® i"B(NÐfÔfñ} u™¬N4¼«d1ˆ&~¨Üµ›88¶ U ³bu±•I QN;G¯ô��à@Õ b`°ãpÙùŠéLôO²u_� eÅ-‚_48ŽØXí¨vµ&«ôï�¼ÆhìHÒ�{1¯*žÓô¹«Mu"Óv , tíºhý•íù‹� kÒ[S >EbÔ#a‹¹šS™êÓÎÚ0N4±{)ƒKSS‚v`Ü‚Ÿzç1Ø�ܲ·õ¢ÜÈÊUcÙE`É‹Œß#8¦Ý€a»YŒ’ŒN ÆBQÒ˦°m~úbûÙI)Ûj[CpÊöLm›YC�)Ž^,SÖ.,éy,±µØr5×ËGq³1ݤÌ/ ü"ò‚ë9ÖÊ•RüÅzb§÷�,ÐRY´KóÊÃØ‚{Ö¦¬®ý4®-'¶œ›½ó›ƒÍµ ÷g/B€KºÊ~�½4KŠXHõ„wyQîÈ886ë†ÁÂÀOç¶Ð€R€�Ølhq¤>±‡úào½ U+¨<åç•àJNÊÏÄr[ mþÚ„½æ1ALp{p¾|3ÜsÆñèoùrA‰“ƒ"‘ZïŽ Δï®Ý‰¹ˆdï bÂçä§^7,ðñ‘Ç»X{ìˆTH€€¢¸²1á»#iÌü­ˆîÑÙ7²™2{Ææ1?�pب¡²=k$“•Í£wºØ ßÜ~œ²nÌZ7]²>À\ê‡KÛø†²d^­tSmt*~„ùï‚WlXJ‚D*o{–ÌÛ9|;¡öo2ðlUTLÕ÷Z©•Ô'ƒ÷¨ub^xwË0}kw"Ïmtkv7‰GIc‰,ï,×>ùô\h9)gæ5œCZÀéþ}kQ)Å«æZš™úÆncšmëÛ9‘ÞTŒò_¬!Š=ë$ 2QÑ ÕŸ²º£ÏÇ�HÃ')ÕLJi¿¾bL«œ_fg_"ºñv.Ñ IÔ¡ és7ݲ7– ÃÜsv±lœ`1 #,åÏBÓ¸æáÉ\‹#™‡‰vnCgžÉ]HÒÀev0´stÈ­Ó,K]}¨`ãN…ñCæ�äÒã©+�Hb[»­ló§¯wTÕ‹±òâ=sy`Š‚âUÜÎùÒ£àÞ4äYB¾ž Uƒâ„SZ“.;´]cMÄЂ`XLÃ7ûK¾f&Ͻ½”Ñô'@ÖÜ0ø»o¦€.÷öl·2û$‰±ÛŸ¥Ïò…"š�& £Y í¨AÞcsÛjvpcÝq�öNfØ]Í…'M–l´®lʯsxTFåöoyÉ\°D\ôŠO†´^YFÙå<˜×%úæ±K¥2ã ½4@Üv›šÅ k1ŠÊAµ(î ÙC³±E²ÀröŠÎŠbžoZMÃÅAÏpÆ9åù©­ Ëìží�A|û¼Û7çUÃ7û|^¬ÓnŽ«q�¦‘­!¼æC­Ï¦¯bbÞ¡lX[µ’#–ŵƄžÈú™qõ²à•ÍÇËÞ_tÐaFpA„751�vïà2Êã=\ÊÇÀ¸æÙÆ)3X5  @[+põ*o£i(Ã(àúƘ֔ýšÕàlý½ ð‡|s`">;.ÍV3]ÔGöa´‘3çéÐa†ª£Ô…Ž«wœyé„\ü߬s ÁÖ²'î|S» oyF­v»ck‘‹–©B÷ϹËTöHžmïZ“…œƒpîŽÄ zp”�zs È&H½Þa": öÕ~ÖáüµYê«kS€þnÈ®ŠB­¬@wù÷ne4Ø7—ªÝ AAÌHu8- ¿¡ö *a¼>g—É©s-ÚÏJ›¨4ÀwãÌ–Å,3Ö%Ð\VÑzr´�mø·ƒâUåÜ4_®`Æ#C{ì²'àhÚ¦tW}¾}_ÏFÝ'¹/q Ðh'ÜOÙhÉ Þ×Z\7ky~ÎÞÒö½ÕîWJèó_ÓL]ÎsªUíÖ·¼†«È†-¹|6Êm($�Ó7æ9Ȳ'6È Ûó#µÝ_;Ih�äñyšU9â´d3Ò\†yÙ §Œ,,å‚ÖÀ±f-!7W%Óu¡TöÁc œ!‘jVÑÜK©Å©•§-­V…a÷Æi¹�¨Ò¸ä‘ÔfgÓ‘ºHÛCFW´n)˜n­\Åû_ÇóÛI�®ÈÝñ1¯¨J\;ÔöBÖÓNé@¥(£9q“�'_<¯ÞM‚X`€ÒÃÜæ­ñ³]If1`”¸¢R*Ž—úÁôÎÙB¬ZbÓµõ'ŠKÑœ¾£î…öVãdÛ{ô«¸¬õ)Á5âñ¬FïòC�Ä{uÓ47µð0Ø;›Õ†¿"KÉ\q°\$€?Ü{¹ƒ½%©q××xÊp�%bE½Lk·éq@ÃowsR*FBò¨”™9’òs�OÀÏšõ5bÐ:C–¹¨Ù­gŒGe ¡Å»pf ;²Ù®§Òcœ-Xâ,1°¬YÞÞ#µYÀìØÍt&ž�&Ù“ƒ•´Z×KŠ�k¸¬iËLW4ŽÐh €P î×b TV$ÅÄò`ös£­)Ħß}<�`5W{µÛN¦È±œ™›N7‰_pÚñ€£#œµÉªÜ'¢Ó˜#ÚÊæQa@KYàœC>9xë¾jòywÍÓ:ð�KÂçVìc„[fÇ œ)"�a!÷ÒÖîeqÞïûy‘ˆ‹ç¿Š ™×K‚`C;À´¥a /Œµ›ò…"̲0“ŽÚ3g`.Ù&¬R8Z)òdàõÐLX\’¾›ËYŽ/)ò¤û�™yfz+ ?‹c}ã—yÏH‰)|Ò¦Ð#àãàa0<'GG^ö :.Ö;ŸK¨`=7û-ìÛÎ=2!öý¼"9¨l&Ç�Z3ͧ9Ôæ1Dë5Áø\�¯•ú݃¶Ü|ÒŽÇð¾\�1ôCœÉh\«?Ûë¶-�;e÷8ʨ FfÜâyy3z­'r \ÉÒ)8êÅ›»@%þ„ ìéXNׯ\ì'g~ÄU3glékáA<_°„.JaϬ °�óHxàã �ÝXHW]5‚ZPÍkX3Ü�Œ¬Úº}#¾&W€¶Á�ÃT öÊ+G0F\ѼÀŽJ ÉFeÈÍá*î^0{{êØØNwÆ[TûŒ)9Cå]^F> Þk|�¦ÈÚFZ÷~3„k8OAx—¹)Ô]wí9¾­=S´DîÜ™ŒôÙ|˜jI¶I¸€/˯ф*Ót–läÖk+Üv¯PœÎj•¢1>½&¥çªÜ%¿“½]Ç\à6ºÝaµÃ¤d8“á­Q…©tˆ÷uP–|²^4‹5¬`h“½'dùב®¥ƒîß3eÕµ3y•¾TR›;k8h'Y:¸ÛT�‚¸ËÍ6¯WÎôÄsŸ:;^tz"ýÛI“Àd1DÕ™Ia‡+Rœ#Ë*‚ÀØô T ;‡ÉKV_s¡M?„¬Î{·NJ¡Çý•y»ddšám¦A•˜mQŒkÃ�Z�3¨0g*#ôI©„õ"ºAk(V�3·‡‹éû¥@_j®Â!íPí(/+Ð-È[ñê²èn¢P¹ Ž~ñ\:çPÂ|sò_#‡ªýÀš) ‹ UiõÐFï[;½™5W;kD)xš%5¨‘L �2Màm |‡Á˜sÒç  ‘±©}vtê–E#:¯Œñ\èRî âéb²S €ä:ÑR!‚˜B7yÂô15Oê(Ü>,ê ¯ràyoº {ÏQ›ä´þ�c OÑçqyÈì'»�-nYB}>gO¥? :7RÎ\;jhW‘tœ°*ÊùBÑ´UlA# Gá'Ò}]-•=l§ï¾0}Ø&ضyõ�AÚØÂ—¾øÂp”�6>Ö^§B€\îp·tVÔ(b�¸Y4UÉÄ;æ?—MˆYß=U»‘IVÎÀn¢sè¿JQ‡¬TµÃÚÅvãJí€ Æ‚ ö#~€Å¶u€ê®á_‚ˆç@*Sum xžØ¯p|.Gí?®ÅßÃyRÉl)“ýäÛ¡7kK‘¹Ç¶a^pAYö™“_úÉËjF¦£âP@é’ôœv÷xÒçVÂF¥Ä/Ô…Þï’¿$¶Ùsdµ¬E’¹apð—Q„ÛŒ˜ ¦%×í6‚R'ëëÓ‚ÚãÝâ˜ß[éƒ�¹¿ Ó ¸€z´±²Q=ÒÏ«+ûdû-|X«sZQo¿.x"{€œôL¢B†­€ùGÕ›pÄ'IŹë`Œª!/ £¼Ä%^‚«[ºEY[wãÚÃô(EåGˆW²Ž^±u—I¶¯‘®V`-/ƒý«jÅÆ1½åi¹¶ÉTXuE·ÇërÒpŒÈ&ç@ÊÒnAWc‡±“ D¯µá±+ë$‰‹}1­ý÷êy¹–š†ñðÔ�<¹,ŒØ5PÍ ,23†£Tæ4ÞÛ­�ΚÒNuIÈ}е /­¶f�ó¬3}iÀ,æ!?vJz„îÂí4�É@Õ ¡W˜Õ¸'æA$¹§‚&)”û>Û=˜Pq›O:Nzv~½� CxXÛTÉH âZ@_6Q•êܺŸu¨=Š˜Ù—ÏÎûÖÁj©GˆèÚ3§R­?ê8¯a×~Óéèt‰ mã ã�Ã¥ÙiÑçPøÿ-‚ 5¿]Ÿøðÿ8ñˆTÇ.`ÀfþŒŒ=š¹�¹pØ AÑaŸ‘ü3�~L¾Vùü�¯ "¾'ñœˆ#È_ÊmÜûÒýòˆ"Gз E¢}'ê.ξ®°ߤÁzXPs ûëŠë�Óœ¥õžp²ÐeÃã},à80€WC-²y­ôUD›ì° ís9ßq˜ áXõ1M^z5ã.AÖùV evÙ(Á¹£¯ÇY£ðéø‘Ëû�š³KX["ìí,kšænÚËGjµ¨_¶ÁU¥[(^;»"jý~Yæ3còžD¹ í+ÆTWË`àv½è¾— om¬ˆ<WìØ Øí« mlG�±–:;â½ÒÁ¸6~µ*jIÙ·²’y@`ނ׿|× q Îz±«çÚ)mzWB—.Vxªêð‡X à+{ÔD˜SÒašp�ß¾ÒÛ =‹ W7kÜk€9w/Df6nÎyÄû"ЩF4ˆÓ•H¢¿×½–§ÂæÃöó Å¥ã×pÀnî¡CØ¥gUKO½ÞÞŸ5ÛȦÅôík£ÑdLhy~ø³:�›Z¬1g= 4ät¸ŠiÆß½\¡Ð¼ (ü¶Ñéƒæ0앸H„5~’ VKKGïÛ½aý-r³ÕgñE®¥Çº¹F>óŽåµ.¹¬�C¥Ãhaõ’xÈE�ȘF×Wlwkza«Š|ßÈ«�`¢'ûùq\i~Åw¼y_p=QqÊ„ãõ·'ëòÛŠp—;%%¦!_6ðd‚Ô·°©U¶°ÀáÖ�j»¹ÊaÅom1dª¿5iK"¤(»â„¯uE’Ũ QE÷ÞÜ@äà7¡¿Dä}¥ÉžSw貟>k�-ÛR7ô·ÅT@ƒ™ÔboóënÊK‰dƒR¶Gc½ll^×/!ÊÈ(ÉÊmíjwž©î tç" ªræ+“õhÖåc1‚X›#|7 àO͉ÎÎâ˜!–7N*_$r&Z¬�o›Î7³‹€…ØEïëk`)É!ÍNóôm‡29}Ž,¬÷n�º´”L|í¨8¶›õ5ËÓ{¼vXÅ´´ª/bJ·—éwÎ çÔ[Mš9´;Áe½ r×ñäS»[(´·Q 1�)I9¸óë ½:I‹v+X ÀÍN´¬~6$e@Ý#ØoÆðî¡Þ]�ç Z:Õ÷�HB¦õaÕE¾|‚„ñsfàz´6y{·O»\ÖˆnÎÅðQ0éwÕ²L$•¤Å æœì3ªÞjõ\4¶�UÃ~˜M+™�M­Ñ¸—ÇÀˆð\®;ã¨çÖó8�f%'°&ĭ5X뼨Q¡© LP®D¾Ñ²ç4² ˆn/©a1)·¥U„˜¼‹´üÃb‘ÇA¯h·–%4.7�æÐM�� BaPbЂ0 @Ø5œJ �gtIXP´‘Þ¹¤ ®ÉœA¥5¸2ßÔ˜Y6« Û¯6MЯ®C©d÷TI8 ]H‡aÕŸŸb�X=�L¢ÞtÕõ¸Á¯¶øÝ¶X#‚.ÃÄöÎÙy‹ÊÒøàè8Ñ>œ°(=ã38_+;Cñ†Äù:)²!ÆìÖpœú³bV¿4¾£9ŸÚ½¬2A3–~Ü×(m»ÛÑm·§ÙØ`Öö‰ù”Gs1BÚ¯£hün Ø‚úòÍ%Ëw~øÒ™n¾’5q"�ÅGwqq:Ÿ#6Þ«[s­Þn¯­@&,vÄ× ÏíÈÄwgCs”ù¹�_s¼¥àñó‘rS³Í(Xî�hRV3Ì0K�Ö,ž/'_Íík7 Úáº.j9ÑêI®”Ã5ÄšÌFnàø=nÙ!Ý\0ƒP{’<¢jN¾•#sCf]wpÛ‰ë¢CIª kñ•—Õ·ÐA[ŒDi xÄ6òz˜OȲ!•_©Ñg¯ÅÐôŸÿX&uõeqÏ$ /Û媭l… ºÞrÍW»õ/u‡µ“B¦‘gÒxŽúI¢tÝ©p¯½�5ßM6aÐù¨}}×=­ñSüܦãÝÝ¥{q”®2Ý¢ý`™£ä¨�½�<�é}²±&ˆ€L/Ñ;]ܽWòæW¼oTÚe.æJV옊Wb�÷ÎÞ v9Óš‚TY}„›òÍöWl¸�¡*æ¹}ç&•êy¡AÑ Öy}�%ø³è2ÌÁõ*‹‡ªÆ¡2ʰer®[ŒÆ¡L®ƒ¡ˆ:%äãºÅ�ZÄ5öÝ9‘Âß×u³�OØØâk´{‰©K‰£[­_œa§nêá%XÂ-õá~‚Z)ĆÌU÷&C�ÃÐØ d¢ö#½NQçd1l¤Lm¥$È%0°H†5Dä7Ž<…Ÿ—Äœ»*½jåÑ`¿Z¬k‹ÃŠHŽwh¦Læ%” ØÒ¹¶'"[UlØwe×…òûº€ë{;MƒƒhI ÇÌéµÎlõ�Ž''‚~w`šê£Õ–ªUó‹nE`(opÐÞÄɸ ÃÔæC1‡"­m/gÀwÜ„Ôgw%KÀ6ÊOW1H{£3fû8ÉBÑSBê�o ž´bü‡h˜`²äáIß×Í"á¢0vÖ”ìw)v/û+…«í71ÎÎú ý$ÊofáÌaöz fò‚ìˆ×_f¦Ù9¦Ó =ó7Žae~³jí}£®×=HÛ=í¤~‰‹>ö S5ÛÊ ~d+D^IϨW YÞ3{G­Ñû2ø/z3<»"ÐË)â.1vô,,ŽÙ£³2܆.ËkNØêPâá›8xøç dîÿ–æv cãèŠa·šŒnrèNÀ±—¬�t‡¥®Ëüw¯jÚì¡>â„WF±£kBô÷u (G¿ÐøïB�ïA•Y@‡¸`ÛS%Àqßo1}/4$é®Êbx,F†�ñhðóï§ÉÆ;}AÒdÖP›e EâÙ2ð2®br—Hª#{ ü…Ñq9‡KYe¦‚m·é=š„à•<`@0…†°RÒ|çÀŠJ±ŸÕ|F ‰V0ž°j×$ÜîbéñØ-\TwjK;…Ü.Ûœ*+ßW9—ðe¨”;ìãÛ²¯c{Ì(ó¾›é*5;6¸ÈŒ<ÝIÛ%w¬Ö³ë(H—_§Ü‚0­©×ue°ò5ê—™˜#Åö ˜{îòw¿Õ–�œð2’‘:Þ% [åÏĸ(k±˜Ch¶zÿ¶äe:3 È2ƒ~ýøöG¿4á!álCõ¡íl¡Ë zE¶õ—² ½¼ûcÈ{®LƒQ‘�êrÞ=R~ cà�µóŠÑe¶¾î²À`—Ÿ)ó—øk’0w‰`F!Á‹ Œnëöá¡�ò¶ü�õìc±Ú»~Ùgì¥ãy އëP%v² <û}hôjŠ[®9jêUíò�ŠÌƒ’J §›\HiãzBË»ÄÇî—Äž}ÙGúÑ1ïH›až9Ï(ˆçˆæ¨,—Ò Ñ9EYB£1ðeÒ§hÌv�®^»Ô ùÒSH[ùŠ{à®�ÅnŸ¸2��i°ª)×3 GÙo¾Ð…ïx YŽ þ ëšN¸IM´¬:4°:*O¯Í’áG*Ç-{€ìb“ô8H¦ÁVü}�—{ï,K0Ž ”m#·3²Ég§X÷ϚƻÏ9­®Àîn½½dºµ/—óÚ*á¿™__[ u¢sSÄ©)oQYøŸÉR5šc §‰¾ìýi6UÈ3Œ¿”†ø¿®{�9,ó€ eyžã˜:Ué1$DûÙ[Vn9^hñÄŠÞÙ4 jàB”KÕæ_O1wJ˜§j´•ºáƒÌÝÓ=q]am™§vœQ°è\�¶™])qpË\³eÚ/&²ºÍ.�_˜i¬í“aê k 6ŒÇÕIT•t¹.9ýö&ÂÊD[à¸×€ÆýÐÅ÷¤' ×!ÓF�òø5ÛåÈÅȰ¼¬awÍÏ�&,´ã¼N­KÛí¦49¸À‚i¶¢>÷oŽh‹zðèGd;Õ (Ú|FÊÛR¬ž8²ôþ½e—¯ßrÉç�¤²n0!òƒ3j€¸ÅD:‡'¹Èä¸gŒ« cöfÉ­Õíæ°úÈ�}UË,}�9£®CÕ¥ù'�ù‡ïß¿mŸ`F|nl«�œ¾ÌÇ™Wçñ²}�ndf{CuÛÉ$âû€öÃ]^¶ÇD߯ï½F2`¢saöÓ‰WVóÛaîf@N0Å£ÙTk“ 5~¸nñ¬ì N`g *çÂn�é�9£Øå3k×T4J"R¢·°ã¥j®IH½œ�Ûuw�ġ(‡{yZUTøXê<[ÑF:RäN»=ß-RÕ—ºÓý¬o^€¨ïT½µÔyl¶�à" ‚ 9— ²ÚÖ‡==0S}ûM¯E-€¼JÓÞz0Ïx/°X­ëú\»LFþ2–ö­>œØ1ðp†¯Íß™¯ë¥9úÏ�Âõ¼öF%§Œúén­óaÒ¯ç,}ìÆV [Ó.cÛk¬€ìªÅ-–-[Wùa0¨íe6[º¹+òzÚ«6#ìJ»]ù ¸ÝÏkŠ4PöRó0G¥eáoqÑêz$;K¶Œ÷aÙUÕ5svÒ'BŠA÷ b’0ïCºˆ~¾¸*¡ìNÑv6™ræ-�m%Æ"Nس6¤N(Mwj!éÉë,BŽE¶¸^xÞ,ðØ¡’3xY� 6Íêåséû‡•f³|Îá€VÞ:.Ëä1…]ÝÆû'ß9„ÏVH�kœæ— ù6œÐgžœî£gs)ÿÏêÔ+‚’µ‰Æy“ÈËÉþü öٖ׿7Õ” QÆŽ;r WH«‡CðGŽBeƒ¹ÞLQŒ8ÖcùÏ@/d´ù‡‚;MæÃÍŒP%®³õÜêw‚½$g¿3PÖ_[x ”ÈÎn¦ÖXK�¾(x rX½øÅˆ0°táÕ R3#÷Ù¶Z5¸ž"ó,ÇX�ûÙ}³ Ø`,‚7>‰rÕzñ àN£Vy¾±ÎÒ“Ž\z°Ôrû¤}–Q„òðÀìöÁ6†È²+ÖØK�ÂnóPæ�/„l�”ñ¥Â‹àO� ˆaH@KpˆØÓÞÇËs•u쾺qF꙼€—¸a�oÇ9;ð¯Í¿qSsµÄGxp͉ö͈[Æ@€­‹š±«=Dzòg/¼ ÿ`îŸ��¶�,Ó¿ÛÀ‡Û-ÕòK`Ï�>f öý¾(KU€»:ˆR}*¤Yí-Š«™=�0}J,Í'\EƳ0S¬sZ»@Ùv�sž ±†™ð�¿]ÀÀ…»�øL($Á+ä14Wžpe|-ô~Þ,Aê«'�׺$ b�Hsœœ"³¾®O�ñvžCB„Ynüêá¥÷D Àât(ŠHÿª¹L»â›X…Æç0ÚÎù£Ô†\eƒR�‹áú60dö¬9-QÓbØ.‡wÚðhê໎k©½Å ½¼å9¥ÛÏràtUñYc•ɽæm36.¶_"ïZàîpÕ…Û GµoÆ£þàŠýĘ”m§Ù˜jС݉-¹ï2¨Xq–ÑýUnB¾lq;÷ôÚ<áÐã"^ovÖø»¼cß^À¯5ø× �s@núD\ÚE?-ƒ7,VŸ� ?JR}y‡ZŠ|b »D$"]…›g_j²Íz.á†{kfê%¡sî±î\|Ó6û”ãñMFi¯y¬l;ïoÇ×c ö]IŠÁ"nÅø¸ÇÙð$7Ó‚’ 'é  ‘nÑÑpq€œ&Õ®[µ|ÚÓü7a.úš§EôµžL¯Ãy‚pôZô÷ðg°,ÙjNöÎà&ÍœïyÑÛl$óŽZ¨ÀÚWÝÜP¥£¿4 ¾ãítº—o­¦õb"°?qà—⼚oŸÎÓè|c´�bzêèºÂÀ§¸{Ø€,¸LƒEŸH“»Òö7©ð¬ç¨*û¬4Û a͉÷--†Û8¼Uïñàù¦>Qö×H©2 Î�Hn™Ña:ðgH<$ÑÓ "6£[?|Þ§\u;Ü)L®ý›„»¢©aõö¡‡LS(÷ e;íóÆÁR¶îZ~ oj&QC‹É§IË_ ö�ß6µ@2[–ì^ŽÅƒ-õ'éÔ·Œl”dÀ`IÇåò6îŸN\"VÖ—ìÜ”÷…hÏ¥>./£¶`Õ��ûu0K«ýÄ1OR–>Ï>Š ³ ÙÁgn},˜‹Áš ¹]Рr&SÖÞé¼)oa‡1û–Ýè)�סBŵùצ۲­-:†„“·p€ó…þ›[Šw· ü×å¤y|*y4\©ÆPˆ2ÇÛ\oÝ’TVèãæÿIçN{TÞ§¾{|E4g@„¯8¨1?õ¶‚µµã�Õwƒ:Xc Q¢N„ã¢Ú³ë Ù¹¤e•]ØÅò›Þ”kL|ÿÖî“•‹_æ¼J½±©¦4ÿRðœðOY8 ¬½ak�ÀTŸÖ‹>ÖßF€ïŸªùR1{ þÞ^¬×Siî•£hþc|ÜÛôÎ�ÿÌ\ÛBò½Œàr…eFÚéÆpCÙs®òô‹O¦yµŒuTÝpùjý›ç§,ó´Õ¦ùàº^ÍÆOEÛ(° Á,A¨EŸ¬Â󖾋ƒ5»Õ0e @M»\Ûç÷- kÏŸ§„×eâ!ÐM:wµj—Ûß7$›’öÛОÁ5ÅÖÿLÚšÚ‡{é¨àÈâôȸÛ�héÓ<ž~O¤öŸ.Býå)bé9Ñ)qOíwB…Žh‡E9\3gx¾¦wZ˜€ú7©¼KöLÁ\k;ò"ሌ¢LûÌþ[{`€IÎTfºáXÞ.d'‹°UôLjÀt•àR„ëp;”¥³ú¶5#Û/]!Å㌉^�@}«rҰ$¸¥€§²»Å×´Œ)K/‡Ý#Ó^õ6-¸?s,=¹O¦º?; ùDn@ÏÔž ü÷Ÿ²»@¯<¶u€àûï×Q×Õ®s×eä¶Vá£SÊ_cÕK$2.Žrj_6$0¶ÊÖ£2S¨ ³Îm¹h\‘?Î]pœ¦¹¨8ôeS;Mø6Æ-'öñ N‚]dá~&W÷i[ÏÎ�çx[ÄaÒÒûm_]oXu3õ—Z>i2ÁPßn©¼èùÄϱlk‹žôí¹pºV¥ñíbõåa<â¢aøcæ6}�§scÎ ªO¿Xj{4%dÚC’‡IçwMáN�[i›~ßS8ï9JU‹LÐ\Hl~X8‰^^û»�Òu »1ŒGñ9Õää\Ù_Åÿ[W›„�Da]üŸ|›Ûx$íÒüݽ˜h§ÿ€ o~_š…¹oÛ~ þ‡~gb#ðm£!hEÑ_ø·´%Å],£g˜ƒÇúÇV /寪øµR͹œ¨Bþ¿²(\YÚե쵋kdëa†v¾1b½+†Îî �”ŠwútÓÝží¿T¬ôWâ]ÁXO]ä 0:{[˜iÕïïs´xáw�)¬\^gƒ£V¾^õu p•f u•íÛmÜÄï‰Á°w(Gv—]^Ë”X¾Ø›d£ wI¯¦²N*Ú³2¾Î‡¦¶q[Ü2d‹gR{3ÄÃú²S‰ ¾2y–Á¶Š0÷c =�ŠÔ;¦Íë4‹k`3•¾ÅSCC1:Y:ldù‡ÔyÉ|F´v .œo‘qϵíЧGè1°h` Cå®öqª¶E¦ /ÆYãŠ;‹è­k‘!ƒ÷e2VŸŽÇ;MÞì@™¸ .à"adhÖHŽzz\ˆP:=7a™s�vbünéEâÙˆ¤Ù»(ëÊîí­ví�£¶¾1‘ü­krrªå‚J�Ä»Ce”3U�@ky•· #Sj™¹ “7Â[%•‚÷, l¼äÜE!óRj;°‘¬Ø Ü4r¸^f úñéˆP­Ü¯Éknô¡à³ַݽ@ˆr®ÉùGÔt"Å_D7Æ#2µ¾}ú,F*•ÖÏÚoqvÚ„ýhî@0*dçMìJPêi|ºƒ@ïÞk¸ïT•Ô:]xÐÈÐCwÎònÈÛÆh"ßU«ÉNqg‰ÙO¥‡¹26?Èt²\cüÜÆQ»¤%af‹VÐô—Ãr çÃ]æÖ•ïê¸m?P‚ì]�rNPxRƒÁãÑù‘[çDؤÙm ° vLªV~ÑÈúäy{¾ùÅ€‚>UKßnšŽøûnªGÖl,;t –#¡:!v>“sh‰±ZÒIý£+ÈYéįH…„—× " FJ.ÅÝØà$—K/t oº„9md`@ ÊGÂ6NW+Å]ùtÆßQÁŒ|ha•ùã|‹91Ø—£ûo"‚§ì[>†ronöW ,ã\Gd›Nû1ž ¶Ä?ÎD•p0' ExwÒ(²ÞÔÕä3’ûò2äçR0—kN÷3š¹/}»ü·º, õõ ÞO½��¬èØÜ  QPKÞt6„%È6Ó`ÝÌ‘é 7ŠÒBƒîÆY=QŽ6ÀÏ/»†®)|Xý!Ö¥£‡ì—œ"_n=B\Bç�¾ÚV†oU£Û˜1éáÚìdÛ°A‘€tu{Üš|©}¶™)}§j¼®¿Í}fJ�C��;Fñ˜C�å=tÑí”ë vÍóš4 ;zÿÎÎ(dn•ÍÂÉ Ž0Q_ã\©¨à†o�SÎT~B±sfùÝo@ìš–!ì7â³²pš/ :Çzl4UdT²°Ó9'¶9ç4 �=Ò“»Z¶�õ€3²-M7oVÄâï�¶"'’\aŸ€ì9ýaKŽ£ìC�ë6´ÊyÈý&Ók‹·"¹DÏu¦q…±¹ ½á/oœxÑo”󨶜Í'ÇÖc�·s j1ƒÅ¹ÐÊX àl5 »&³]|Á¸ä`ƒ ÖjGµ^l, íš×Á… ö: Ò.ƒ·x:ªÙ•'NScœ+‡�·­�5¬¹WKo²°ó�\•êÕÉZÜÏR·€ÜRno. ÐTln-I\�§«�ذƒÇðebtÔ:Þ$åæyŒ±!j�äÒ²ÎCRˆÄXçñ}‰¾\?6É“€ð@a}™iŠÓ^xr€¿kÌvã׆ܜöÖ­c>¥} /Ó˜2ÌÈÅcQ�晩ðË÷I2ÍL`ö®3( mÄ3«.þÛá�O 1(zf?N —{A ™|Pཱ£É ³&)Ö,m÷ƒ Ï{P&¡H�óð‰s‰¢²2Ì‹’Cס-àvþjs¢×�J/€ø¼—(ªïp<ºÛ_ºR”ÄúA¥óŒe›œý¾í½� vr¶ŸaÂÈÆ¸,Ü£cXÙm,>R~}ÎFo›pr¶QPÊ1u›´ýeß5)eÊÞj«ó<ßTà¡vH�0œÝC+—kë> œÿaMPĘñŽºÆPê2g‘’À+rj¸æx•κЌº|ˆkìüòú`èU?A€Ûš²=ZÜ7ÅŒŸë9o€ê¡àèq/ñ<Âö Ùî £aw$Eµ–ºDû¶RmÛ-inç‰÷žoÍNkElo:À»Îż�ý.2¯ÂαyÁ…�§ÜòîÙ Yâ«$ý¾%?3_báÚéÛ Mv A�ì…nØs5‡öõ7|èÈA¯ÈdÚ>®×,¬{À¶ì¶{¾ÎËoäµö'WÄútÞÒýÒnžÌÄý½q˜ŠDùÜoÐY·rK �dºÇ±ƒÞÜÚu�ÜRôW¹ËßC’ý¶Ð ž_íªLýs¤ñ¶20ïw<È&ÁÖ%Lc¦¹çæÞn$~¬WžÈ]SeBßmºyBêÐÑòc� »º�+%µpRXGiæ-Þí1°„ï50­° ~à﯒nî 22N+�Á›»_…L‚g°K½Ø¬Á…‚ø…`óCXZËÅxcV‡×Dì¡GcŒÓB.}$`$ Ryò˜z/n]Äžórõ/ß´ºÏÖÀGåeÑŒ Ï‹vZÁ 7aÌI£�]N>k'Y-ql�©G+ΫQHÞ>g¹ì�1hâ T‚Fºë…»“þ3¬—̺äÝ‚é*ú°+Ù£$‚¢vcÍ9Îe_‰;,•’ÀR9ÜB脸A6|h3;¹dÿ'-z9Ù¨³€HcO�ƒö€C˜j®\4?³� “EóI:Ö ìð+�ý̰ Áe^¾,ÊÀRŽýêì#5sŒZ Ü€¡0år;# ¼Â"Þ{€okuÑû×Ù]ôƒ¹Å^šz=uËÎu>MD놢ÜŸd1€8¹þ†ÒV­~yÂg˜¾ÝŸâÕÉF%ur¥ä{|´F6QÀ¸ …"-Qª»~ßGÈÎ=«7FH,<{éBà¡ÎHV5•Ò…2[ AÙr´K룚Î]r˜4L"ckç˜*ÎG9>ø 5�^ò¼å.T%â"Û¶s|<§håÛlŽÖØNì:kA”GHÝö„³¥NC|6 ÖY±aÕi\ÏEûF×iŽ£æá‘‹†×¸PSºÀâäèCPG¬ßó@âÁí¯��[Óºyù9:±EºâÚë`èÌ ß·ç.á“opz5Ûžó«8Þ_åw7O‹_bªÃFŸp5cjX�;•ãû~r�ÓÜĨ:‰œ¥{e€míåÚyµ/»2,à2åãÇ!;nòÔ®pc©Ó®˜¿=»Ô¹[&ƒ�­‹-w¢ë‘R¿bžUIDÛ�‹«kš$aájöNº±Ô ç,F `„²ßKØ ÕäÊmZé3i÷2°W~Ìþ¼Ü,)ÙÆœƒDƒËËÀw¡ l55hsÈñ ëFÖî$�5«G7BBüÙ=w‘˦5$��¦éŠlËÌ„4ƒí¢­¬†ß:׬ FæjÍ.63îY5+»“f»å4¤Öœü ¬8ûïµ_|‡u#1$ £�OÛÅwÌ)äC²ú!ï|ÞÏ K€i¤$†1Φ@› ´SC’';L†,cóã²FÜä6‘¸Mu�6Ô¬ð­s‚ÕY}¬YÑqU+I›eŠ`6¸ ñÐ56Œ-Zár*€„ú×r­L…ù¦yä_3Û^¤h�O+”bœl ö˜.\©šl§–ökDß 5Ú]:x8õøRÜ·à²|�`¨�x‚ÉlºrTn¡’Ė‹}ûWåו~Z‘DìZËõæƒCé)ô=^ºhA>–ˆB¡S:h”Þo|‹�à>wçÙÆ‹—2}EûeNǸԷJ0ˆ×$6³qph÷áï|Í_RwÅ�…JÚ]û?G£¿sË,ÎÌC÷’‘'†©r”‘ožŽv;ð˜[€Âè_~ à¶S·î‘¬S ¿n̰(¯èQ‡7«öô{WAL>¦ ^4­t|§Ë»‚†®ÖŸªªšò8ñ#Cn“ Íq)뮢èSÏÞ�7çn¾3ÛØ2ºªz�Òëâ,Æâ—>#>¤‚ÜõÃï¼êšˆIKÐM6’Jí:�`1Á‡Âoc=¹®¯·›¦UtÃ.kXŠm�½[R³xDÞýÎ4 ¦©“Ö*À·w«÷©�»¿j$v¼ªÔ°øU~-!JýC¹k‰M9âßvçU6Lx0•Oq5CîļëpknŽé¨#(é¾<„9–QËT['ì�—×”EËÝVì¨JЦuã÷Ì,Êo¯×0¢6wiÔ(fQŸƒÌ_/Aî‘F…èÜ>WË|»–é’µµMéfŽéú7¦æ¹å4YÖ±ãwÆ`4IS�Sf“]K[·ƒ&ŇB`ô`¤#êë¯Ã8×B˜S±q‰- ¾R‚~×L½äqÈ}»ÁPû03¬÷ë˜qßp8ÂHPUu›êº6KöØ‘¥Ÿc°¶Ì .¨À�•éxѸه[¿zÁñ2nçßÏ–RûØ45»{år©ÁÛÐ ºæ!>¶‚&nöÑtÂ+*½øú£þ‰¤Ý<‘™ù‹ËýõcüE€ñ5þ+¾‘‚㬺¢ªÜÀr‹ÒX=ç¬Ñ[+ÍoSý`³E×®’\o¤ý|Þ¢ êzðØñdf¨cÕ¨¿ƒØb‘Œ¸ ÁFkÖ¬tp‡�_W“oÍݤ äÉÞÔØ\Ø^ÖÂ_„PÁÎ0 ÎÿLP¥Â@ܳt4ƒ¿Üp°Õ×g)ìà\]ħã¤î²#훈o±ú,8Åe³ûÁœ^m…™ÀTxÞÔ”¢ÙÔ�G ]¸âà|³q+(ïO÷6¢ »²˜£�.|ÔþRµ¦Ç)ú”—{dÒí|ù¾ d7¨?D¾˜‘^·ñŒ¼C€þö’!h ÔöyœO.»=üƒÐ_, ll ó�ʾqkN¶ïÏ�Œàî¢ W¹mqm˜}ôµÓÊ�*¥RnD_™${|ÆT6PD™ùsÆ\nÞÿÁÄ‚‡Ê>�,l‹yPTlR�¬|bÒ¼â¼Öè“¿µ»Ž·aA)!9‹m=]&ù½x_Ê×ÊÛ·âÃðKÉgZ‘¾9¤¾}­jbþ›%ØÐ<>¤QeÀ€Ù4ošFÈ ó$U‰GÝ·%(œ/�œòig€A }ü*gÓ(î0(C‹4å¤-¢í*æø5ö­'�vÒ>gSìUµ�Zë6ß™5·JQðÎÞ•W‡ï¸žÞP"¢â]iæ§"Þ¿+v_�R68ºÿ(ÃU›º5 @ MâZxãló{è![`2G„3à©–¶n–¸å~ÉÜÂDF1ìÝë ¥êê&F;ÃáÄíäÄýžsL/:°G׋×Qd5PQ9Ù†mQr©õªõÖH2a+íwT1ªÕˆû|ªÚÄ[ƒË2âéó†w›Ï�]Nâ)—¥{�ãì�3%·¬qP«Ì -‡�Á%øW!"F¸´/Ð^2Pe�x�˜ŒN8…¦<½*ÞÝ’�´s;ր󸌖GÏ“ ÛíŠ<7#œïê`ŒpF�· �Á�Ëm‡™3Â~ Æ®€bx µ�2Õ/_cŠãÎJê€K¨¨…Phš±dñÔ5ñÎ딣/;Èùö ɾ‡Eèÿ,göÖ1ŽO§Äl~þ€XÖôòoñãX/p�éÍ­ÐA 3¢¦u»½ ¿ö·^o iØPßN?&ãu]ÀM�7C�†„e#iþÿ³‹îùyvk&eÆBï,·nCóü¿Ÿ!“Ñ&pîöȶB¹ŒÆ¾‰£HèmDü°­°Ø`2Ëhpí±¨ ž,80?aw¯¾æòbKLûŽ�cSMë1_pÄE·ÊÇ&ùþúóºù¦D:[ôºs"c³»8¿Zìã7 Ãìƒ�;úoµÀÜV3°Žáéu!ã0( ³c\ÔÄ”BÜ$Ú�e3òfÂg])sºWã²XÐ/œ†–û! LÐë·öÜÑ®¸©“RZo,1­.Þª��»‰‘!±ì‰4€nHê3 ñ«©m%kèå]ñ Hþž*älé£2ka^G˙ô+oi¦åø“v«oÉIå-̆B¯î½a›Ù�®’=Ú8W eSxoø’ãf�¶¯†¬tCƒèÕt¡J¯[”ÿ"×Üš>ªÎo×7b¼_«…Ì�UïlœßB?,$õuŽ»ˆïý­+‹R©lá@î‚ßVÿ4v!›ôÅÉŸ‚¥jPåVÿãH®d7)SqK#ÛRŸK ™´ íܶ.éÞ„pFÿ.O¥ûù÷wÂGœß²tX€Í+—C¶¿Ö¸îìÙ°ÓˆŒ>å=5¼sÛáÑKZ0’,]1gdkª™½Û‡,Œ„a_e.�â¢ÏßñÅõžêÓ~èù Ðãm�Rü5p ‰ì· œ�Nþƒ�Ö-ûÃn =ƒ’GŠüÇ+îÄfE•m`¼ê±¨»mw¸>€d€j•Kò™£lÐlÌ<ÔC�E\¿{©aˉÌÈp;­‡m˜i-¶0µ˜DÑv¥ìïØ§ûåg‘SYÄ“JmC´>éÒ…a!ÌÕ|€˜Q�3kàû•�Ugf ±\îl­ãäôIB+™Vž|ýïYà½vN¸v]hܯK—úIí¦§?5œø•P8Œ�R,£�šGªÁ|zÎh:+BØ0fÊçO‰¸.ø3Ë[§o^níóeøòÎX0ÞÎ÷®®7œŸÛ›C•þYÊ,íZE—5F…`7·nZkç÷]~clp­áæ’Øk¡�ræÖM³á§ÑaÏÖ7ŠfÞ ¥PÜœ ^¢�qvþ|Ÿ�úmÓoÖÕj3÷ÁZ\êÆxî=lã+êÉ@†±YL×Rd>’æeZVFÀaîÍÛôæß¡¯´ù?vâLK"¢#…´@\¹ÿ´qÂú°1å¹òÀg«†Äâ÷ýÎ�EžØ:}6ž�û åŠ:ß ð×b‚V–;Ñ]?Ê@�P+Ǿ¿ú̾Àèp+a¶xcùŦÆ&´a÷Ca�hW8˜Í#!|e@ÃnêÈë}¥Hµ©ó‡<˜üQvБRmå_6ËÅB®˜8ñó»k&¬ýá{‰`ë�û£bÛókÓK,~…­}Jš·)#�¹[Þò¡lq" `fÝ™•]Œ'83A¦ŠóìNƒ3ÇD~?ìØ°¹Ž–Åïw–7—9ÙTÉØ¥,>±Sÿp,�¤‰¬V#Íñp€L"=ø¶Šª@c2ú‹>$cÉí#s€GÚÛö¨–^抈8uâl‹à­F{œâ=u5eÔôƒi¦ñýá*Wû˜eÞ’A.ÑøÏR:öÅäÁû•ß²" µbps–^VR#¬‘†wœOÆ{õK ä)T ®d62èÎOí˯_Q»z¤’6œE”F‡¹Dék¦ôXk£$ªÛ9² óÑí9>t”5†¥E«gwßÏ=Öp!³åÓïú4¾¾ø8eŒÔ¸Ù‚þŸ|ï㭾ܭ<_s‚( šÉà°K¥²ô¡òVgÅû=;Ƹ‚~¶ˆi>yoT±«Åìl!¤ô-L2èË@•Øö­¾2ÆÅH,MeýìÖUçyÃ?C˜€)ø£˜®›^Rà ŽGÀM>˜Xnccò.0_‹‘µœë€�°˜†ç#u¥&ÓÍ~ Ï™OL«@Øêâ¨ÜYÔu/ÁÜãrŸ–›Jáu�ám»f÷aRéÏÔ®Ÿ'WÛºi߃¯ƒ‡àCñ¥ý}‘±Æ+Œa:ê÷�wžýœ¥Í¹ì5Òç넃—f`q ãu¿Æh$vE‡r\Þ•ž��ÛÐÀù<¶cõY¤[ô´F+«Ñ |Çì¢náÇ'À¿ôýÖ.×ñ:ZÛBMºk›sô´_­êmŸÁAÕ.ÑéÍ4ÅXTî1YÞ‡`† ’ô¾×Ù’7¬Ì’ñ(v[•V9ÌQFj�Dt\®[;›ŽD3š£ �2F¡5”ûga—ù|¬ëµö[Ø]zM¶¬=)­´Ô!r†•GÂ…ÉBsk€³óÛýÉ[Ûʤ҅ý$ƒ’¢A+ÜÀ�ÖEÀ„„òæv½X¢üW®[€}åÜ,€]l|€d,TÚ˜ãxñ9µn â6a�îÃ-Ï-_ öA²z ï …Ê/!? ò„·Î·ªÍNÒ¾0k]¦–bµOC6ºº–£·m©ósŸ2qõÓœŠpârzÒ¢yÙ� $WÈøB£p€ûÊÍnc<° fçZu¨¼¾úm§ à±@Ž“9%µçRŠ:—×s J. ø~ù O7¾†ÿHñG¢œŒËAÙ"é6kê)­Ð¨eêûX½E�RTÂÃs…‘m~q�¦h)/Ùt ¼Y÷�EéÓß+p:F“˜½"�§§¸ õ€ý¥½å%s{˜„L_tuÐ{ð,‹¹^ 7bµ› "8/Én7²ð·å²DPùhþ:æ¢}ºœHÕ(ìè.?“q›üš£ék)GIaÏxÕyM‰ú-‡˜ˆ!Y:ÆÓ¥fbt±9ÝlïÖâ_L݆ƒ7¬!±hLþ¬îþás:„ÂúØ8[,jqž8".`Ñ2'Bw´Ý5z6‘ �\C I&›Çö4LOƒ ÁžúM3Lt<ØCã…�ž„’9+[Éðì–5Äú´È%µ ÏJ§Ì.å®Zé ZÃ|·—Q—ìf9Ò»ô¯(`ýŸ‡ØïqÆ÷:i•9팶’·µE¥´ô;´g†«¶ÓC�Õ¾mVîà€o¬qºjSÔ ;—µ‰ã¶ÈYìÿR8Z«kBá…kkñÀáôH{m!ó½#a�,>;qÚ‡eµƒ¼šq‰]]Ÿ>íMg‰¯æ�'±oËö™”HhVÜâÞ=ö•lnÞG^}8Cár�£µÛå‰RÊOÄ_yWFû«# ÃWÂeÖ#píÁÎ-Vs£ ÈàÿU­B¦[hDa§y } ,£e/8mÐ#x6KœC[k(¡Á{¢ÝûŒ¡QÌ‹9;7_»-ûž¼šXóÑWs¥È„fS³Ûj„Xª%âën€ù02¿*τ̙ÀoV×i–x9Rö,ÖÌpé—À öý*@PóDº5øtãžH3€ÌÒ�œ•~`|ÆÐ¨ËÇÛ4ž¸„’GF ñaæp§ Ö%¬á�¦ã?[›Õª|C—œ•F¬…—Ÿ<í‰Öô‰Þ†ûcS“Ö`ðDœý³V9~’ öpÑa›€�½.rÓ:ÂÖ“j0~d/Èk>¡»§t‡xn<Ä’†zÃͶå¼äú€hU¹ŒÍ¹vç‘€÷ßvð A¦åXƒYq³$ÝÚ,‹ÜÊV/m¬Öõ?Œ :·³Ô3/XØôû«ëpr»î†áì%t$%GwôÙ¼/1Ç>gˆ�ì%÷Ÿ ¯6ÅÙ›XFX ¨ÄÕ^¹0’²î ¾Úš7L VÑ{Ýçb¿V ¬{–÷иspÌå’ééÛN�ñp1Q/ÆDkkóz’'˦&šÛO.g¬´eo»ÌZð:'¬÷P­ñ˳9#œÆ†õšçs;�ºØoë=®]ïuӈ̜DvýΧ±;,cq;FdKt+îc ŠÜIÍâö«]BÐ=MUÏzvI roiu>y©e×4µ´ûh¦�`t-Ì‹Ænä*þaßWéšdvf_¿>€ŽÛôbÙRY6ëBÕX¯La€¥)O÷ŠR” 忦£t�q²|µšA´¿òù›jwêå‡ùÚKÔj¡Ë„,݃Ïîãsi bC_ üäƒ~@d`«�°f)z½�ãÒ„YÊ;¶S‹#¯çåHêÏÌýS÷eÓ7„›Õï�TÚc4–Þ6�‰·èõƒî™˜§kˆñl,ƒ�ºcd™ìÄt±±ÜìïO¼%dÖ~?3¾ø»�º}�II�ß"s%!:Í”´èqÊgƒÒ-V÷ÖÆµõ[ç1~ñÌÍß$ -â­bGƒ‡µ>éþóS¼‰PÏ®­‰¶�!Éæwq~|ÀIhÉßy‚>2Û‹u�³Õyæî@ ø6¬zKýR�@˜œ&Èë]è0Ý÷Eر@aª�[¹)lr@µôˆãã’+¢/ôEi—e8´oØZŒ÷ÃAý¸háð௫‡à P —ÐÏ•^ r›úz¿a<ÍLi ®ß4”Û'¾-Ð.ˆ—ç[c€R™¼k¿±N†ZsXìŸtÑâÇîwøú© +|º³s×W˜Yõ(¬«ˆ»\¼Ë xµ´7~q¿X4Oî,.µ³-`ê›»úßyÀŸéßîÎóÒqLÑ¿Ý'ù~�•çÁe^tU(£eï~·7·Nêé¸ýfß1`—ÌMç´[¶˜k™’³ùs™LYÃÊ3#-´¾W©I'@Í€ö3r®rZ‡÷$¼ |nÝ +óu»ÚB0ºÎYÆ_Þ—`•¿0ʧ„ˆæn}ݸ�ÎrÜÍ_õ÷fö ­¼y‚½ÕŠ-jùñSó3_Éfæp<Ÿ¨¦pãóî6þ1UÙA÷¾3bõÙ5¬›:rVm ² ¼^ã~DºëI{@>¼aööA Bó-;S‰KéUe`,;›�Y�JÛ4Ø-Eƒr˜Ó•“’@Ú‘­¯óà…ÉpZÂyG7Qw€�aF§k±ìyüÓË�ã¥.¶ðƒëÊûÃŒ÷¦3520_[-u¶·9úÎË„‡/Äã:„ö“Û¿(2Ogr,Áš_ &Žs/Ǿ9ºö·–|ìšùöÌ) ¸­)½” A57¹×À¥7'��-ÛÛQpÐCôÒP!®ô\FËÄ56–7‰ÌÜ{h’Üî®E@85¬(OmJv·£–dÉZÙüìmµQÀ¾m�.ö3e#p¦Ù�ÉÎÑ€˜98 �–ìµû‚o7Ñ*É9qí¢KZÚ „̓ Ï.šüsa"|ÞJÉlq˜1ÌêÅéÁ7¡3Ýœ¥ŠwÉõ¾î;Ù-ªÒþ.„uååGfWˆ²zã ­©Üê[þ0Î øÇ«­¹æŽÎ @ /Ϭþž÷ü)±·Ÿ`´,£�³eÛ®Æ<éV†›žù}q¹!ëñ òÌMŒˆ?“lzujSÛ> Ò.�]—‘mGâL9*´¶ƒUa(Ø1Ójô0~ñBžàúÞ$yε¨CeW³cï&±&ðÏß’öÝñã+«¼K]=ñˆt¤�R²ˆ‚TÝ (nó<€íªÂÊAÚÅgBlé®Î8±Õ¹&û\í5´ ±¢è5Su1Åèœ�–åÖ\Èv‰Ð˜ÁcˆI@x%öiÅ«œW©üv±]97Ñm´ šØî¹°Þœùâ-ƒ\â2Õ'{ÖÐl•s¦b�q¿Kø Rs¬ÛŸŸ|ú‘öA›.°ÜVIé±Vï–iò júŸ÷¸W¤Ø`‰oš»‹qóËÜÒ«ÙH#®XNìÔºîCòîx®íaøÐo•Üq%ó�¨ ×3zµbuÔ]�>\åÕüÝ ÌMUç‚ sÝć¼œPÁu¼³K¸G ,m\ì°Ú<+\9hu}^"…·à™ý¦ |�X÷ùÛÝl×?³] yox”ÅÙkçèM> ¬+I5ñVþÁÍ)ε`°¥þKÓÙØ̽ޔǔá硞uª“zró‡ƒágX\è÷kò2¶ß¤[Ûê�Kx™ ñ"A ˆËô¬qìlÂ5M@*�Ìžñ ø�f¸­i�>©Àkl'0wú=�…2@^»àm­�ù6k«—.ónNF&*ð)‡ïŽZÓ‡Óm+vÈ_¬mìó?|ˆù)ô2…¹ÜB·o«Êá‚Høn¦™Üxžx´$I¦û )Hd Ó¢HãÚ¬EÌüöQhruÓc³´‡$›ë(f:cÈOU‡1ÔY¾^Íg¬q˜XaÃ>Y}Ç£VIqkw{Î7ðsà#)<÷úÍCô QíŸ?T Rªÿ­¶ËmM[T¶Ú¶ËZ²µ•e´ª¶•µTµjU¶ÚͶ֚ÛlÚ¶j´ÖÚÒÕ¬­­«MZ³j³k[-m¶µmþ?ßðF£ñ½¤ÔÂgŒµ¿T=GºFmªü©«‘­cåËÔë_Í,h£Xo^'!vyüÈ@%„ m¾=pæ7Æ[±Sh™xX'Ç»®Ô‡Áa¹Á Àý¬ÏxçpÄÀ0Ì¡<ÇGèæ«EÑÅ4x‰ÌÑmpÑ€Ïsy¦ eÙÕIƒs v—@ü#i±ÖBpâlé}î÷,æWU º�Æ„®86+\»kÔ~ó"ëµs!QAô„F!Ù¾ÑÑú€ypìU×(fäÏP³“p0å­±rÀ˜ål1…noÜwä6Ì*ÀL°Þ5—Ó×m‹ÍËÈŸ@ÏQüAX9^ëPë~‡î~Ì`¡OÒ”€yðEb§�·êï5|Xá¿l”/ͤœ•˜-œÜÕÛïdô¯ù°á’¸þ'xH�{–-1ß©�ÉÛJ°GáÔÜì «L^M+Ãgû®6e<ѰQ™\…TüIp�rÔƒrû ²)ÓÉ©ƒ\ñ•VùÝ^ôjye˜Ÿµ¶•L¶"�AÃí,ÆL¨y„‡½Àm79š[«æör"w+¼¥ðçfŽ|~�g·àÐO6-|~�n'=õ{{Ƥ¬™ŒòÕ^!�Ð#‰gWîñWúIÖ02kx²zqt�‘‰$¼mhCWÛ_¿].ûë�r*ÚëAæîih�êÊü|îw3k×sè¡P µÎ¾¯W;õ {æpS¹+êmÏœõàöm±Òú¤KF ß oj)Mk‹JÞ•%=žÒG*öçE&Šd&Ä„í.ÜF´fÖÃjO\”°µAœe ­S;–’ŒØ»Êó�»ã›ôà«Äg}Ò‡/8=-϶¿dHt=Éœ%¦äD¸\[ œÙCV:rW�šØ�Ž1ƒ¤p·m—#}Þû¯�º=áXaåM±@òrûnÝ"è$aYW6÷ƵKnt_&YÉß<&ÌD¼¹¹FHø–|–ùG¡y`=Kô/Ü+Ãö T"ñ K>¸û‰‹aü¯Ý®d§™2°2|c•¶Çò nŠ"Á½äð­‰nÆ PæÁjǃ£¹9W„ÓÜñ‘)lÓKaÙNùB1á êó¬àl/´ã[W”s{Ÿü$Ç-’àßë8ƒé]bÕqt¡¹ÂÔöd‚m)02úàtàÍÛ¼NÍ.!YËØ/Ûã£%¹éjX£(+9'º!¶ß? |Ýoªšrëö>÷´¢¯ƒ_T3[é]ƒ¹<¬EU•Ñ1Ȗͱg€K?ƺõ� (çJ (Ö™K‹æ®EŒEËçý12>€vÇîõVn‚ÏoX�\! Û½-z§BXKvÈŒ:étNñcÁ ¼¿žE@OŒ]ÈMNÜž"¹Úð ’2�ÎëoCg“¥´tîe®‚7.ÁÕ4龤 \BVaÆþ¸VŠ`Kì*€òí¥³¸ÑÅ`%òJÝõ-ß¶h]—Ï{3bÐê$ù$ ìæ€|²†3$BRG¦2¦áü¹´­¿W^¹ÌÔ&׊m|¨*ßÜ£°µZú ¬,³¦¼3»[Ì^žÎþC÷ÚtQîï÷7úêŒxÓ'E¨¶ù­¥xî|;ûï¤ äÙ÷y h�øR® }¬>ƒ-›áA{.9èE‹‚”è6çŒܽ~Ef;¥�0‡Sµ¡GŸÀdÕŽ�o¾œúY¶éŒ)Þ2�<Û6n§jUrRttæ=7¸?ÙÁ_ µ@û!5u ˆ:7©wKËóVÌ몄¥|;kt†îjOŠ‚è Ù«?QÚKz>"}›Å`DlbÑ´�:=ñeQÛn ,‘Ž�¬€È3h„„ ’î¬}?GûF³ínŽ-µÍ·£Ã…bí`gó¸GG�Ì1óa@Ï6Ñ>üH:ä—@9YÕJ4ViÎ+ÊîòTØŸc—§—]I¶y”)ì`,ÜPO®B&Î�Šâ¹€gG½ëÒMîã<È?y ú«L͉,1ÜqÈ öØ#‡Æø¦"›:Ý€ÂY½�ê&½ž¨*4^ù g3‚’öVE"$ú'$£íæg ™²|˜½¾…]¢�ÃQ*Gi¤õrû·,Ãl½`<ÈYÌÎå•Ú­¤ J ÂÐÿ|�©z—ŽÇ8å3œÞù0¿Ìg\¾«PØ1 dgÄ�PîþœØ�“y m[3¤F(µ"¥ÑÔCDw†¾ëVæ±Àë¯*T$7‘æMçSD…²~K¤ØtÜ’#-LÕ\ˆ/y#¿°çX|,“ #-- éÝn(ÀŸ-~aˆŒJ`ƒÀ]6}ÏHM=ŸP ªr2®nAÁÊÆeÓÜÆºXݰ“s‡8¶g Ð×ì{��3ºöµ‘ðRº8ÁÉD­Ç›·e¢êàš†Üʆ“@®#jê¢[²!!± Gò £÷|ÍÙòÇPL†jÜs ßYœ}Ëav2bÿ$»åÔ3�‹÷ŽoîæU€ï¹µ ¶o¾¯rƒ›Q&ÎkîF3°xNÓ¾Kgª=úÏŒ>gÛeE1æšEmkvytBÞîûêg‹®ñ¿¡í“{¡aÌ[7»ÝÇwü·öÅÈ,˜„îÇ: MÝBÍSæ¤*aÖS‘`²¨äP÷b!m6ón`žOFöÑÕ¿ˆåÝ#jðew,ž`ã"xçI­+šjÿªtöQÁ<¯Mõ�žr¶‚î�UÌÁþk=5aó{dìÒ—ô„» pUhàìJ–“%L´¶¨ü%bRB¶îØ0Öt¼ ÄÃÎòKî_i®!?N°ü"¾Þ9�ÊÝâøE¥Ôo:^Å©¨�.í¨ÞšE›©ëI·-¹îÑaG¸{;>@Òm©`1YÇîÛVkS5];ˆH«»WqE!²¬0bÙ|âVû‹ãñå[§¶qëû:*ØIÂZ󂥬«dKpmŒÛ9Ûš‡Ð|�hØrE|_zÉ: ƒ;À.Jeúäè•l–)×7´›²Ôìx£j|^:Õ{˜(&‘è.ºšÖ¥5ÅîspX’u ¶â[¸€!Õ~ÚF·Tu!CIÇC¹a7mÕJgNÇ"ĦÂh!�w–³)ñדËa•æyÛ¶Tg[–O­~®¤CÃmœ=�@¯¬ƒGj§8^„ h¹â =×{ÊI£I�q5÷jùÇ2\<ѸłëÌJ«f”5¾Âe±œY¦Òû4�…í�è ‚Â7ƶ?2N*G•§NXÌ¢¬FOí8wy+¯•(þ�õ´š±BL6œ×—1Ŷì¦RäV{R�ž¯3†Ø3âM�Õ§-A`Waµ`ÎïÝt.kóQökz­`ÊpçåñaïàO[܃w2¡S”l~üÈW,ºÜ«8ÁçG ±æ““"¦ÒDsŽÎLÊÀ96Öõ`Äàs±$¬5³µåí´OŒìùÔ³M³+-jY/7yÝFD1í][¶ŸÅc•v¬ª(ÃöÖË.yõÍ7'AìF1œ:;"î~§†ë5â·³^VÇT­ÂþØ8uñü ƒ¿=â³/‚TrºJnË4 Ï¯Š¢±­½^îˆ ±½wN¥ê}¶¶ QA¹7;ÄØÀ_ñìÿäì[Rÿ{LCì?0¼ÿ¯˜®ÿOb°®yž%„/Ñ‘ ›PjÉF·×ÔÒûa5�-¬GrfIÀ7v€iÏÔ1ú8‹R’¿ù_ ›l¸¾ ×Bh¡¡v´O ¯âyå"cýjêöq‹ˆ-ÙÙë,Ø:ïäçËm8`èU(¯�Ê9ÅÉÞçe$ö7�P³PwP媅3²Žë¤ÝNÈ iZÜá%Vòí¦Òнl]{ AZ\j>0VûVåcŸ"µÕQêÅaLï�¦hZË6 !eBà'ØK—ÑVÅtŸÜq¦»éÒXˆåm:‚޵Ó�pû’÷½Ï×g ŒS?’11·qβ] xþÜë\û•®ðôøwÅ1Œ‡Ô¼cFŸCKq Їå�¯‰�É}ª³ƒTø,Ü>3ïç�f;êrøå€Ù€™‚Ûä°´âƒÅÛl‹wŒšÏ—0Ep&›†×&\=1®‚©æPu8Î1^¶B?yßÁ’‰€‚ ªdy{y›š Ä]d[Z &)$W ¤à“Rœ®ó€¸¬DlË»U á U]ªéŒó+áx%3ÀúÓµ"4Ö€A#¾´Ý…KZª $Ëã}òÒéQIº1ÉÝËåw�çô>�þ�dAº(G%ë#Ü‘ A¾ßÑéÞ﫸÷·ÎazöÜ7ìõ½~Z%Ëevð‘y¶<Ÿ‰·gXÃ(kz0=N¬ßy·§Ñh~®2:½<>²ä×ß*ÚQß×YèlÏlnÑS{TbäØpuÛî‘È/l�“ùÇy=ö„Ó>:Y%l2]6"M[ø¶¼æÚ …$‹cO¯¦ŠÚm¹œæ?Ì)ö@­*ù‹[rMœôóÜÖ.Û÷—{•xÇTo{J¬áÃPÚëõ’÷/—¿ÑÌg6Sœ[_ÞÓ}/*[bÖütTøB›m´ï»­ÿ:Ú§4ا"~¿£« Ó½›Q·Ð”€”“(fvlâe¸lõ6lÎvHŒù•â¶—¬X¸ ¶`=h) 5v&R6�ÊÒMœö�;"¼„¶Cc ׊»=Æ…¬9ˆZ¶e'¯hÚÇèç‡:¨ýÝwš¿ñpz3N•=ó?Ü=‹zVµ) Ò|Pû”«Iq4X „F�ƒÊð/Gx{|Ä�®Ãôøt„ä˜îîÛÖôºö¤ýx4H>þù;Åb—Õ»ày0¡1·˜ZnAOÙ– ¼ &xÒUôkjóQxM¶ÿ–6�VVï—êO�·H+wÚ^ÏâMM׳zÿ½ûqÀ ' ;jeâ\Cc^ß5íV^¼`§sç§lBp ¶ó¨ú=›ì [Þ±ôºc0æ’†–ãd2Ì�� ¤D$<ò®º„¹:¢ä]ÁAq´ «ÈPž·‰;q7c£L <òøu�>’â¥ÛO™¿bmŸWéĔɲ•ü�›—ÁÉŸKó*ìmd°X (0ïmݵžl0Jy¯m±¼]Ýd+ v6xV8=‹r‹¸áD tí�ßÑ®`ƒ¹Ó~�È�zøÁÀÜì¤d�ñûN4ˆüdö>;ޢɓ›Ëû¿`žÇƒÞƒÒr-�d6Œ"ƛ֪àÒl). fζéUaˆ6ÆeÛH…ŠáVu¬×¸&k�iµ“Ü ®þp|”Ü-`kSÛgµ‹°ÅG-)#!ÕL ô6ßM`Ö|ûa=4›£¸rôìE.ºmôÃZIhU¶yôG#¦ Áýн�‚ö…½Z0 ´9ÖÁšÀïS—«°,Ù.B-vEŸßN»eÚèØ,<‘á&[TLe ÃãedÑ:Ïcë?.X6äY}>Š z8àû[ŠÒ:Ã#Ó«—U‡NL�$×·¥ ÊP/$íúÁ$!¡K¢©¦!jqÛ‚“o&êCƒd²ôFhCÑQ#: kn>ï×n7˜E›¡^ØlíÏ�þÎ{ß±½ˆÝۘƶgrŸ­ºo¶zð©lÎBDlš'ÈVúà SÐ `3«…zò˜å².¿'ú²¯bÕù0S€¸µI¿CΑ³A\ø‰;Ç· 7{aD®ù mÌhà+„÷…>ÑA’,ªÜc�[`ù�¥¤ƒ“=Ø(Œ ˜ é|ŽÕ†çàHåt~ˆ;Áp€ÔÞÞ�x4ß6Ö°09MS‡ì„WîDZÌOÀO£= ×Ù½/ïe¬s¶Ö¢ÝÇkݺÙç¹ArÏÎû’Z˃^˜2pÈù߸ÁÁ¿Þ¾ˆnŧŠÕåÚ}ÚˆàXÏq’‡ºOêN¼”bØa ‘«—ÐÄæzP¨¢/ÍejW :[<$Po, 5íz–�…µ�\ö)þÇÏýA[ÒŠº û–mh2&W¤ù¢Qj÷:–DO¦Ã¿luú@LJô¾½æáéžÌ¸mSy·ê¢òhÎ ~à†¶wÕ[a%‰þ2 Œy×}±6¹¸í�cÍ«¬°‡˜‘Èíõ^FV aA¨ŠÐ)J~à�ang›²P‡£_xƒ¹WÓÜ’Î#�Ü ¥û»ÄXM¿µ=fv+�ù‡[*¬‡×xÏ­�‡ÙP]ìcù)A‚ [+¹Ÿ‘þ£ßÇñ†8³’†+ôß—?¦øm¦uí±ß§ã´?Aþ%°IXX§—¨.Úþ¶ùÆú\ëëÞØ¸U¢ Òù»ÌÜ@²3BýÒ±�ùhqÕëß�¼-F´Ý<”–SWß'Ë)îÑkuzÑå: ¦£Ì ;»Vç( °Öîˣ…(Ö^÷!í§ëµõ˯̞|¨�ûÚÍäéI¡ù2\xF°ÕU4¯’àYj¾3š¸Nõîí»< ÊÛ)ž,%H}‡eTm1é;»S“6Áyn4&c™:‡ÒŠ9U9¿›RÖLù'  õ«¸z™×�ëE—¯ø­�rO†ûÅ2{<¸w b8ªÛ¿Ú›!‰g\.ƒ9GºmoƱƒ›GŽöû ɾvõ#¾,b¨ˆð‹€xÊ4±z–*ËKúÁ"£4â©atkŠý¿*`4 ø'·FVÖF+>zÇPûNnVy¬ZÐûI<žú¯#ÞRmaé„b�Û®kÁ9 )Ñæ MëµQžOöu ùb‹ß}Œ$nzk=åÝ-G0Ô —ð¢›éA¿Ìç#�[xm2˜ú™¹½`Þµ ð:0ÌKêÙ!urC¸Û>,JnQg¦´þð Ÿ!Æw4ýƸk�hC³éžBÿYO‘^Á{äZ>ÎynÃjw™nƒÞ±{öÉŠ–¼"p•u½Î䌮¥)AA®ˆg[Ç%±À–àVåuß]îöá­¥²ä§#Ý À�ç -i²3Ÿ©u‰£>ç�÷oûaZåÃj–ÕŸ×æÞW,pÂ3JÂ1®€vÝMyÀßÎUÖÛ@øG|” Cí®�M›|€¯]�xøu¶)n&âd}Ò«ëaŽN…mŸ4¯šÌ­ú›¦i¯\²Ã1&a¶ûâeh÷†ÆÐ–£/ÖŸb'Y &\:KàÝcFö�Áe…\8ÅYÖbµÞW$po^võ¯Ì[ 0ĆNÌË[&®ùÃŽ"4Áµ7ÆR�.ÃO.¸�–Êu�- ¿+EH.(/ï‚ôµÖ>‰�Ô1¤õi6¾ súã*S`MRX–ÄòOj»ÂÄpmxê{Z NéQÜ ó„C~V“ØÛŒmmä/u-µ~%ظÖòj]2ú—/XÍQ'ouzÅ��š¹·>L;s9ûÝ{¯Ûfn™º~/³ÞFô®ªÃž‘¹s¾ç¤è¼y¿y÷k ½/�8.öJI÷≿!�åêÌæ+yÁ=êÕ´øö I�®½j~] %§]Ü…>ÆM�•ìúGqÛ�/-± ß¡’Lˆyðůp!•Mgˆù¦éí¥¾Bøí¬ö½iÇ.|MÌó {#ÑV9ÛëX;Ìg ÝTÎrZa“¨`7L�f1Çò_vYµî߸[‡ð0ð¼@cyÞ(UÈa´¤ù;í=!±KFNù¤ÐVu¶7Bì�ÖG½`¶úŸ¹è ±¤‡4¥ÎÝÝxáŠã¶´ëÁÒ†Æ.…£Ø9ŸÐmˆ„ 9žjÁA°Êñ€K4ÍNl;@ãqÅ„�iT.ªå»Ô·Õ9¡XÉ/~å�â0ÅŸ°[öó³ýAX ß-»7Ã�ÎÎü0#aK}øqËˈÔ`ò',ñ.¥’“-Ü`u­S¶4Y‚°itÙ}Áé6?9_d&�äYW™¬åk6C†àÎÈì]næ×¾äk•é}w^mŽÁ½¤LÌI ŒRöC¡#K gmboŒnõg€baDËc÷…¡­¬’ gÖšh7W¯gB.³ äˈ+"iCÂ%`ŽQè–Ãˇœf;iùç,u�ü~€¥ >­|�‹çH"wŠ~%ÊдA ŒPŠù9 Ÿíxm"½öC›èÀg˜Fß9«Ní{Šö¯ß§Ϻ÷ cÜN·_WèxG®RíBG>ÁU«m�ò[8™¥+a��]æüí&¡¸:‘·ÃOÔį1A²¢½¾Ýje$ be�©Úô6Wl sa—œ\µ)¢„;þEfçžÚýƒ/D£Ž­¥€•É›‹b—îí_M`‹×ú󴟹‰ZY: 6m5Þ Q\>Ÿ6ù½anIS€< ðƒÙ}‹cÖ€�.ƒ�;Ãßrè‡B™ çærÖp««ç.!‰–5ÚzÁuZÏ¡¢ÁÏÇw!-/³h`g¡O½Ùk#–°{5ãî´ÿ¤ ôúÕª;öwÊz2VÄ!ðA7¢çÈ×{~‡™dJeRK_¸ÔÓH‚�ÐÅ�›‰änûîÌå›%w@ ¯¬œéÎçºÑ¢ óiôØyd!-Wi}~‡Tøêó×Átñw1a–ÂåùQ7 t¢ÔF'õ^+ A‰ÂX#jË—ƒ9f¥å¾ýXºáÞ ñŸ¯+Y•Þ³î8%NWÝ_S¶åWmËœáþ€×wIl°�¤qÐÔøó�ZûwMŸsaðvÊsÄL {¼¶–#¸MK¦—S€Q¹�M5]¸V�Þ Ìk�™Ø�Qh¡l�I¬]w—a�q-&CâA†^öÇÞ7ÚôŒyâ <š�j¨pMíЙðz1� €nåÜë¡ímh#¹u”¥)@äÀ2D®º3: tb÷o4“²’¼â®¼Òg#iÑ÷^k†¡‡Aä´äôïJk„´¬G¶ó2Ÿ¡–ÃcÆ-}¢õoû–È;;b�F¡T7Pª†¹f©˜Õ€šŠçÎÜീNN^ïòÏr×WèžX[ª™ë­e¢Ca{‡ÛÚ–4ž:œ¯Ïg]Šy€[O€úíeÄ}o ;OŸ›úzÖ´8ýg ͉~c¤Î�´›+dA»W I!Òy³ï»?>\S¸�ãÌÛ …§ÞwƒÁÐ\ÈnŸf g�ië·V*mæ(6À˜M¯"¾º�ê~Í÷݆ðÈ«p¹v�§�žN,Wîók<7àKÛÜ0Èì†S£,TZÊõ ŒÒûû— ÈÉ>×¾ ·A> Æb"·Û¬[¯MŸh €ù�ÅÏ<â�Pyí³ÁÊOÞiFi°Ê6mÙØH+àf;l’\”,æ.[10I¤ÜnYÕ‚Uf‘¦Þ¯Átûs7)2üës'CvÝøWæ)‹ÕÔÁ^¾Z2ÔØÕmÈÏe·€ãlcDݲô´>ä™h¹`Ò5)öÀ¡»—ê RÇShm Àõwö‚Œ9f+cK<áœ�CZz2ÏÛÎFìÖ}‹Ñ†¯±îÓŽ¾fA#>¬lzœ\˜9o¼³Ë,L¥" ÓÊ@’˜P•¸<¼çrÖäŒe_»kaöŽé¼„^³é<ôú¦Ý-\p¤´=fdÂe:BW (pÕ¸—àå7Œ#6ôpÕT—tÝ[Ãúá«æv™óߤlãÇwž�2ŠrÄ Ç6¯›Ÿ+¾¿ªÿÃP 3\Fx Ô 1¢Òl{Íáð-s0±>5„:½‚­Z(z†¡œ‹Ûa¯ª˜32!UóW6&~H}].#ÁpÀÞµ×—@®‡ùJSû)G¥0,l;oÊû™ë‰ŒM¬„§TÜ%XÓ[&&®Èâ“7(Ì;cÖ±o-�ɾÿ¯F–LØ7xÕQ<·û7ËÝú Y³�\Ö…�Ò§9‰jÎlÉ7¬õ.ª†F†#ÒÉîüÞ¶E"ï²È¦æ«)ib8a݈4ÏU}÷R�: SnÀÜÃhÐ2𑳵„(T…Þ7µ$­ªöN LEó°~m³nZÛ¾ÿÑnÊ`Æ;ƒ]hò±œOuÌ@ÙC¸ B¥r¯K+ˆ{$ÖR0½Y�—aHAä¸yuª0iÝ]¦×éU`…n$ö¶‡&í‰5Ëž050‡t½�¡gƒ„B‹_J÷îVc˜³‚8*rSñªâœâóuéá £_W¬>|zÑ_.¢�q¡gás9—ËCìP€bÄçIÅ{€fP…|¨n©mi›W¯¥ieóA ‘g·VÁ°a+8¹GsEè§{ƒ[ózö�ep¹f_d¾LÝ.«Ìǹ¡l€ÃŸ{¾Ê=ù¢éöx%Ü.³k<Îåó}kò£(õK£z‰ ½lMSÅY¥Ü6‰Þê¦Z å_Ês“RáâØCŽ&Bn¬�Y0ɼßx\'A¦òtsšQ֬Ƶœk§îqŠ(iš0q…N2êûýjkàT\Uy•‚Æý:Îð»®ðp+9òÀí‡fÛ‚õÑ<5Hèàƒ}߯åL-=¼~É ;pólá¬ÞÆÂÏÁUR*«675ºá&*˨ÀU„¹¾*ë)_› €mpÉŽøÇwÒ±‘Gnú„R! c¶ì™štÞ¼÷F¾šºˆ…ŒnÜÖá@ØÒãåÏ%ô¿êw%˪ZWŽñÕO "†Ý¶à÷ptk?ãe ¶Bo(Z”i‚~! ?WrïëÈ.f²?Än2*�¿3¹å•äx� »ëð à•ìXâàNZKÇ �K3K£ÏtðdÀaí]2¾àzQø™Ëú¯Â#xÚ×sR¤Åí%¹¹¿&ƒ¢i\,0)q¯_máùç"OٚͼðR” ”Í”kn6ìÞkµ=¶š÷sa°öjÓ#|*†�/½ ‡ÊÀðEïëìÛK8 ép�qˆ5î }cZ”ÜÂí¬cþšVé¨Þœ4>7ÛøQ-œÜÖÁÞ%Âaôj@ÃÓ)VL�^N•Ôdæt+V¶ævKwóÛk9ÚÜEsÝ®m‹s3Ê(|Ð(ýÝ5µ [)°3ùCB#Éö· ¥É¥1(nx�ìâEŽÚRõ”�¾ÛÅb×[gä.ÚgGíZ øúo{ÉÜNÙÚá«-»»Sk׌.Ã%vÉhRúØÇŸ¥ðà$lÚhój;í�<>c2p€ ™YåÃVÔ‘,½©*쟢[%7× u6îÝ´­¦1W°ØÑiVñ}U6¢¤êMdn¹›µjߨ‚‚R)œ2ቈέm|�V›ú¨tK�Fàç›]J2Åïg0™q¹œgW ÄœHý÷`?>¼o…\J°�@I™l>­â} |Áa?© gðPƒÁþ`rûÞdMqè8Ö¶ ô-B±GHY“Bø·é‡|ps)óéÓ÷@f€ÛHÖ‹J­aDêtí|š|…!T9X_®1èÍ¡jÃÙ5+* V¦ ™.Ùé-Í„/F›R&%kîp)f—¸…†¬±;ë³TÄB0*&ÒlÂðúó³cU~¨Í˜Fyıw•¨�F*zÆ1X’|˳SòöD‡á†õlìª2xŒÍuëkÊö†,;O+3¶½‹ÖðÑ«wºÞ ³YÏÃ%Ääq'¯¤€ôFOM9Ósïk›¯zvW þ ‡¸�æºbøŸbjq^a*~jVÚƒÝ[8�>m„�LŽß¯›Äå3û>e°‚…±ÍVí·«¡NæµÓÞßÈÁ¾sÏG ��BÒ>W$™>)ß�qU¨S\äU×Ìœ xܯ6j t\I…øiP__ÞMÜð$ùOëºòÝÝŽ–gŸ{ëëm’?½?*´µ¢Áoû&8ö¦×̨MBsΩé~ÛãÖ‡!&äâµô°¶¦¿ í>£àý¹qÙt~Ú°&ÔAüºí \µm%bº†âzD›ÎÌ»²’¶Ÿ9·ßBk'·× ¸«/h/@@ ùœ6ØOžÉ¨ª£ˆíayÑë�nÔÆ�Sº ¶×Z´ a ZŽ‚ß{E¶jÉ%‹ÛôXC}}³iÞ'º@ðwiûL[Kண!½ïEÙ&nn¨“sØ„D*•¯¨é’=X‡Ðo&˜>ZJ”Ž‚ˆ_j�× ü­à‡VV+\8+»ÆOPh\ÃÅR\�ñ(LÇ:_\ŠQ§¼ù¦†À¹nQ)&ÅÜ[qa ^‹µ#þ�±Çn;g¾—Ó¹?ã To€Hb¤•„Ó@Mä žƒœÆƒÃ‰Œ$–­pS¼ß)ÞGm#6­bjfò¸ Xˆ¹>y·ˆâN¶¶\˜…á1P;¿�ˆí�åÒ¤)8ð*‰nÛ¼œâƒTz¸NP�lµDE;Â`òÇËtŠƒaÊnqxãÝ®RÈ­Þö”ø²žúÓ:vþö©¼â©÷÷‡™Ü×F&l×ä}'K%À˜‘OÔºE«h¡ŠSž�Ðv¿›½ª§.÷‘hL\#JQŒÓõ¾£µý©Çf²#´³Û›Ô){�««J`ùi& éÑ ÿ @׬1m´HáVÉ&mè<¦è'¢æ@Áª s²2ß° ¶>×ιܨB>ãh0Ÿ_h¢S­�_Yºªú4­„Z9 v0�Ÿá^•#¾Ø¬‰ZÓ}³I{¬Äc j�˜PÃ}d—S þà7Xw­ÌóPAl6k-oÞ̪Gd‘�.´`Úg3« צKNS…Ižý@míÖš’ÃßÍìÀô•H�aÆ�£SXRÀà=Íuõ:°?�½Dš1°ÎÚWòH<ƒáDró¾61Ã1ˆ ?§5î)‘|“¦‰ÿ †[’šÈn°Y–6_ô“ìáÒ7R÷>$Óêt$N¾@þ¨)°ø•šNèN Çk„å”B¯G¡Ü.ÆÒô)TÅ«Vž9Yhÿ%„}ØC˜{ëÆÅšÖ£^D7¶øÕr]éÚ¼ˆQ°>R"€U|¬äŽG¡mêér®Ó7~]]Ê‚½�|ýÒ‘�‹ìcÕ´ŒÉæ¥ÄzhðÅkè‰`²7ÐÖ¬IoÝiX±.$ÔG¿�tDTøQ¾Œìde,©à‡µ»Ò¿áßÏ´í¾¶mz°£Á�‹‹[ßœ�ÖË•d3!™Ôœ¥3/›pëîé~z�9�/è+ZÑ™šê¡t1•Ã*[T}™TNôÕ6~�r ^ʼŠçðƾ�£c϶� oÎ軡pCV½¹S«\/p`ŽZËŽ‹·©VQp_OpÁ”sÈØ DD€½iipSî´¤º í[r¹Žm(!y«rúlkëz“¢ÆÊ·"�Aæ8˜Š€¾Ãë¨<´ÆsÕ5¹î^Aƒ¾%Êœå5 °¿!'']ÃwhWÜaä´Øêò±<ìRY‚Ë?75¼g|°iËAÂóÝBê€ÿB`–8Ml¸8¼É˜Ø_8Yå3»B+äs…9ÜHç#iùbyÓý±Ä I�V<ƒÇÆWžÜÛ|œt=æ'\ðˆ *Ôß¿M‹×ÃX�äÁ6¬×sY´O›ó®cÆ33|†Ã@?�JR” ê¹ó;š©s0§Š¤èÛ>òÞuo®Î¢_b¡(òšÍ�N¡h²ÿ7c”9-€Àæ\°úßHrPûæ¶>wËóLVs>™�µâ)@j‰[y ­Iü…xämÖéúBöøƒì/.sÌ\ƒ“)‘›Ý[0Ä-ò4bèù‹iÝ�OY1¹ôŠ'®T®R3¸R^Cà"3Œ<âtUp‡taæÇ[Æ‚½f °4hxmW÷XçC¹·]‰v冞pS…Ÿ&;‡e”v«vþ 8x>èj¶Wh#^ p´óÀJlcœOG–Tæ–.ù´¼­Ý‰-� eú®:‘ �9é²Z›–+7âi=­³å8áŸÏued½ Àò}¼ÝÕ!\S;ŽÅrÚÙÈÂñ[øªA]’„^å=®¥3™Šl›$á{è­ñ¥½–.q‰É´ÓEÉÚ§8Ýiþà[Ф‘¦Å“™Leôtz&&4ê–ƒOnöªGÉ›é¡YIúJfÃt5™68¦\-Õ2‹ŠÄDìÌàÑs%€õVÖ÷M…ßj6;ÚÕ _JšÏvßNŒœ/¢IV¬úçkÝ>ñ³¿Ê÷Þwòp+›C ­Æ}*q«8 8ØB"zf5¶¼_µ�;5©óqcb6O9·ö �™v9 l �+êdŒnBòÎÓ]̸XB?(0a.!�{ä P¹—Ä ‹Üõ¾6Ø Wuâ^,B�1\º ¡ ?\ìIn›.OWg\ˆ#?2µ�9.s!—�æ˜$óõ!ùÈ-·›�±"W¸æ[½‹±r©@kŒú-ÛFc(/ñ">Kîu_Ìâ¼Ýij�=9}Ré<&jºÉÜ\\ÄW‚’£Ó°iQuÛÞÙÜ(±ƒº1ÙYבˆ·|Œ!>kp±å¾ÊÌn•:ëwVb)JR‚ƒ�Ô`>_{™šýÞ6²v/»¸Rk/¨~L~à‹©®¦ÏZµä"h ä(E€~T z鵿e¡ï:òjubU¬é»&¶£ðïÝÓ؉ðg+b‹ã}“ ·¦Ýþ¥¦¾–ú+,^G‡ˆ\ð0©¦9ló¼˜62†¨JZË1fã._‰ùh—dç p¼ì–è` â!Ûþüê ÚÚ,*¿}Úׇ E¿½‰Ÿ6p o·•^Œbì¿l}}ض34 ²»ŒX:C=¸­ù±\3Ö3CÕ• ߈ÖúÀ0¯;Öpè_�Âñº[êÖ°Ör�€"§NŸ°…¹SŽ­«f‡Ìí1v¸Çˆ‰zèÄ5ö¶îÃÆl?γèÆ,›]»Ã?‡SÂç±–, ôJÖ/Ÿ0Vѱ)æ@渽i!3$=Þ…óÍ4¬ Èœ&.ܶ,Øè;P�N„u²²…áïpó€¤))ì³R8 ¹”áJUsŽâƒG¨@aAfš`׿Ž:³ "þî2ݾàwd¦éÁã!ÛðY¼ˆ=P¤Ð[Ëk ¸ üí\/ëiÌã.�°ld ÷¸I‰“¸^Ö¢sø+,ˆˆóÒ[5p¸.¾î5Ïžò8¹Vc|Gü=³wB_4ü˜D÷—!~½wÛ�Úç]¯· Ë»b¡ØC.zK‡É”D&<‡Ysr!(„‹–­Ë»¨«m)jñ´¿˜®58Ll�+íÏÛ!ûŒ/KÒÐkLpºåˆXÖ_¢^}<ŽØÐÂÚ1­b”H5„?‹h ê?Ói$xÜÏ?P:,L­if:Ôø–Ïi®ÇºÑ§¹p¶eÀ¾®TÚŒx‚føWêcØ\§ÂT}¤{Ýv”MùRÎÁˆ�)'ÙU[“B|÷ÝPo_‹½=Ü;žD톔¼g­[aSp±'ß™¶wèZï[ j–¢ÏÌ–"´´PØ%°5“-�kbZúaö÷pð>ŵåÕ"3ñ ÛùôpLaŸ�Ü.™²xô³XMœ?a‹ñTþÍHNš:e3Ä”ó”&Ø/™$Æofªg ¨¤ó‰ê¸?OÚö¾[}“^í,±s-Áx¡=C‘þã6wO­}u¸Ëä}†äag¦ÕMÈ ˆÕ·i@uí’ÿ`?¾v…ÞBÛË;—µ›Iq‡8ñZvxÝÓ�±ÔÆe¯Á6u.èç¢ÞœôŸ õÏC�¯…³shgMgoVAA¨Áþe~ ±]ì…ng#A¥ÃxbÒ1¥OEÔ©‚Hh�¼¸á\]nx“Ul!/tkv\ËPÁAQÌpAJåŸ�°ýl¬ÿ'NŠù òÖp&lº4!i’¾D?2™ˆ@®¦� 13«Í28ËáUH �¯¬ÖQ¿UÆÀ¡²úÇÕ•#{c9Ñ{™à…úK¼ÁUø�õDG—gsÍ••´¤a#õ WÇ•'rV›1j6”*<{�²&¥D dv;€«wÓGÄ7{\89x"Á¯õØÔ$Ó4FŠDhÁÂ=€¶“Âéª|‹WŠL¾‚íLdWʃc°á+Ådyp�•ÃÙT“vì¿­ñÊP¬u†Vv‰*€Ã¾¹ßá}Á9Mh®5‰;„`´'pû ‰;}_†E4Ú,pKS…ò88>2Oö5h½Øy “e>’8À²”@,¹nÙÞw…Þ´E¸§a,È™Pšò”,92“6>6½’TÅ’•|êú5›ÔÂq×Èrù›k|©5¾RÖo)ú¿x£!BL–·-*‚RNxÃŽYü"øT·Á^þ ÝÃÎ¥1ýØ 6 .Ë£B±7¨Óý~¾÷åzz »ò#ǰ¶@Ê"Ô<ø_gnQ[ë!¥ÝìÀ?ß+‹äó+ñ‹ýxâ¹ ů½ƒ§Õc´o,ÏŠÏq ¡1VèYut>‘ÛQ‡u‰)Q=< ¦™Å”Ð×C'øY•sƒâ;4ô]àÁ2A$Ap'Š.¼¹ ÄåHº‘R•)êZÐÁ{Éßµç¸Ú¸@·"±Z þ«»X[ U› ì_1ê æq5-ò¦m'êãÝ×by~A™¶EȧO6xaúòûYûAÄ©­£™h@ìæ›†ŠÒ(½ðo×�º±|„/\Ü5Ì�qSÐ/·/+‡¾fpªÑVë‰ÇåtzØìä¸2þ[~‹d=Tú g.5)LÕ§é=H ù1jyŒìßèÞeKò`–÷-ð°à£ºe‹<ÚÞU:*8ia È îq¸É¦f§"g±'úç›É~3ÁzøØélÅ )Ú¤ßz=ÛÉ¡%ð”öì Ññf…@…Åu›sï0ßrHÙq™½$5ƒ¼( çÚÄ.‹ {UÙ³‡^Ñ’5¦f8ªUïÓX­‹½c9¥Íh­�…«Ä)œ¦ñ¼½`¤•wÌgÂà<­ „bë”><Øê¬ÅΟwtR§ˆ51Xš1—ªN`O±‹c:sá;ž R‹e¸òøF§§R-™ß#Q\H^×›¬#ñ\X! »Î<& °oXæA¼On¶8B·§û~¯Z½Qâ ¾¡qøÆÈ &$#<ß=ù-õƒÇûŸqO«êq�”ãuBo¤1 dý–NCé]¾ø*ç»'›1Ù'N�´Vv>kÍc>ܦëæç<·®T ]Œ.vú-íO¾ûœÇ}§ø3 „Ò8Ø ‚p«�%í¾Ö4ËW üÌ{§³|îî0ÿ;Ö«vÅ»t昆1|Ý"ëY½µ·›_ôÎß ¶vÈþ7õSæo ®nÜ uûþ0çrØ$(;˜|2he œ+r]a"ñ}—x×!n*œÆscƹ.àsÔ¶ìN!/¬Ù\�)–V¢Âi/vœ!à8‘3p)2`Õ"~@�°l�‡=ߤ’|çÀ@#POÜÈHÀ¦û›(Fº{¤f]^¶ßŒ!ü·,\‚øŒßô’BÄ!�ºòêÈi‚¶ÌÍ1ö~ÞùÇï<Íü!žLÎACØô†ûêˆq¯¦Î`*᡼ ¡¦{’úéaïŽ÷Q(Ã…K¬yšñ#iª‰£I‡¬tÓÞ1�h*È|ÃÕ’Ò`T‰2È·—·Y�—TÒ› ¶[¥¡çm9ѱ eÖ q"m¾÷@õmkò ¡ÿ(ƒ359’@Ñׇ´7<;e¦5Bx’[ˆõßzÚ´ía‚ó3·=ä†=Ž¿@pË�§¹?Bä3€ã¡ §Ð¹6Û)&³;œÜmpÓ‰q¦åV~�«HöðJÎÙˆ ½ÊªÖ8­ë’8׉�ò¿—è›”;]+ÕÁÞÔu›åq޹k*`Gìå¬p¤ýpxó£ì=j}؃"¦J ¥ ²_†÷³x²*¸dhï·ÓU­Åã4»–i^ÛH›ï×€Ÿ²—a”J Nx‡[t�$Ç2"Q³ÄoKË· Ÿ}Ððc|ÛríâÝX‰³êVØÑä­|{0°TÂw5IØéxÐa \Å<3i&|j`dֽׄF-–±LF{úíP�ì¤êèâ0Z*E+ó`[€>¹æ^àè_7¹ �¥ªto›êæêˆâ~&ø|z£ºrñ²P’»ÇæËogX-•aor�ªùRªÁ�aüp«ö²½j<ÞàšX6#Nó›õ,Ó�õÐs¦¯ƒZŽ‚—ÓŠTd=|ûäùúG¼�òTlê7Ê÷1‚À| øÅ�ËÊg/zÐPn ì‰ë6\xžIo®Ïp¤Êb)â)œðD5׺q+‡MI}7wך& Ù}ï;Ž·Ì‰ûÏÓÁ5³*Öœ™'Þ$O X+*'r·¯N³’bÉŸMµUÚhûä_šWÞS†ý¼¬´/y î ($ð+±vý¸Ã‰Éàóc™Æõù“Fãè™E#Ký6²ÇO{.H>òïì)†ûÕ[1Œ�ž¬Œ`ƒËB©NR¨ ìR]0f§€ø‹ö´/H“ sðØu=s³‡‹b¶ÔNï† "s6HÖGDHAUá¤a·Ô4�ó/ÂÁ•‰Ešs¡¶¶ÝùžðÐ$sƒ”“+L$2‹1%ú¯Ðu;�¬2! AèBÞ7|sq—�º'Ëû ±ÎýkGXŸ?§-…žÛëL=ƒiØ„ý·G9%õ™ÁߥÂÛXiذÎBgȤ{–ÎíR´>+í:¾Â95‚ƒÍû-ë£<^ËÀ¿2Z.+,[bî€wv*‘­É Œ– º¨éœµË|ÙŸ´\Å/y¾‘ÁJ)ɹŸ“ ó¬†MÀmçùExU íL’c•‹X-kÝæ¡K©¶¶\&r¼¸:g´ÿXž>(ÆÏè¹·Ê*êZxã*ŠÍ�élÜH™�® BÄå /ËËÚçÔù1˜$ÏV })VÁ™YÕúH\j¸¶VÍãV6·´Ø(Ëmƒ8y~¶üuåZtCuR UªP¹Ûª ›·–¹S– âÈQ³ëÈËr1\Àضwq\°çxv²ŽFt'âKxŒ̲ðŒ �V<û.¹ó �báwM2%ù 5[tv<h/=tõËUZŽ6–€º#cI§Q®`opã®à¢ü]¦‹–Wx�5q�êÞLÌß×J.ŠéØlØHt8¾Žì³~o6²z�ÐlÍ#Ãò­/ eJЦâ‹Û=ÒÖrv1‹ î±+ÀƆägsMͯ2a}ǸÙS,ï$�bÃtçÒ ¿!ßÙ`1*}ësuß}n2}àÈ @ö-©'„aŠŽ£ü5»üO„NÒŽH1”,+ˆvíxªû¥˜lc'S�4yû 'Sf ´¥”i€n¯°›h)Gãwô?5´ ¼?k8Â�†ÏõÑQÍ A�“f‹-e…£ÛX(WlûX_9XÀ®‘bJ(bt{xF´hN4ûês oM­¬Dß.UádaM _T›DÝTNcL/ïbZÚÎÊ«GÞåtçI¢Û £$¢Ä¤äƒ­c¡Lú• YÜ�í}W?}h Zt O« ¹ ç ŒØvIw6F Aü&�Ô´}µoA®lmõ~ž±š˜7†3ÆÏ!òùí”g†RÊž_WgK j6]úñç\ç¤È È+ç©­vlg‡g/šÍD÷* üØmã– ã_ÑŒ^›…|†ðß-!†UC.êbEšÑKËâ&  î3P¯´Åhúç£ÑHòé"qk==b& ý8ígùurƹD`rZßñ 4ó%�r‰±ìÙÒrÿP%È"u ø5‹à Í5u¿Žâj4.¨f+âÀ* !ñ¥Gl†± ‰‡óÀä v;²”jW7°�K)q.÷2åç<: "„ƒ³s%d™B)-vU!S¹šAŽpþKûr�„îöfï'²¹vãFw¬ˆF9}-ãkL¶ !nr£‡…}Ì_Üî±|�ºkî¶—¶‚A¨ñ|–ÏМ�­eó[žÕ²qqfø™ç!çäM>Ú;éIõmíÑ:,~Ž\´ù,=ÃnÇÀÅØ)¿½Ô9¸{AéÿjܲgyƒqFšÔ¶Ð'´ËiÚ¸$•\bn÷¨´Uª#(c 6žžÆæÑÎj®%šT9�ùû»‡Ô�9 †ô%ð8*×všü4ñ½6±ðK`#è$òüѰ&û…Ÿ¹Ÿ‹-[Ië^bÇñ§Ì'šÙÀÔçœaY1¨Fò¶| «¨ ™ÝD¯K«N`8§™XPqSëFQŠïf(”†Ô´e€p/#|c2édŸkÏ€šÕ tÜ{’Ì6Π/¡Î]f¯²}ƒ–‰.â#:²o – ÛG÷ .<ÔØÖ¶6›h‚"_eà« Vºöfh«¸¨8¸„F4½_,IÔ„G¨cœC|„š�lÇõ�"5¤Òn!‹ñ™é̯uÜé X7p@ú¤Ô[røwr22�ƒ6*æ9CÁ¾É(órTõÃØ¦¶oäG½îçî‹RMKFÇ’ èKÍ{åFóÙ¥�!>w@�éË@Ì‚lD»-Æ�ߪ9�M£g*#±]\#F+¹±9KfrùKb1Îu*§WáÎf¤°®Ÿ›bVFêî 3ÄÕ ‚# ¢;#_�öêÖsÓ2©Ñv7'zƒÂ†DÒ/sr×fíùu„ñÍZ ­8ædßÛÃÌÂÕÙ÷`ˆ" UØùÆ?]îÒq%®O«?—U3â Æ„]ì×FbØmJ[+ÍNõ¦W à �ÜÐ/)x_³iO½V—@‹Xäc%$i5L¹º·›¨³Þ¤†dr?ÙžÖ¾±rkÎ$ªù� ÀØÝ¾V~šˆ¤‚ìf·dŸf^jcLÎWC U¯;åÍmEwÏn M1¡‘Ža þPÞg¢lg•LžIp € IPÃq™jù�šF vWNvQV2àÕ¦!XtÚÈ 'H& C �XÔT¡lÇ0šºÁ\ÄkwϘ�‚yAš³=ÐØe±×•ž á…£غÌ[Ü�!ù:þôb3cæ��@‚Påõ‚AdÓ|BŶé™JfÁ[M©Äç< æ—cÃe+ÀE�"Ös>+£>'WÃBH¼a±°{ß?6WÆ~QÒu±Ü¿%í×ìhŸéÆïïÊ·âx1–åä·tKLȶ|ÅMý~ö£bæWTõ¸&!�ð39{Éù®Ÿ·¦ÛJi‚Õog<†F¡<7 º:ôø6³5è·\8DŸo}€žé€}f¨Ào-«ù©ÀJx·}Š£ƒEÉI„=�Ñw™m\=ÙýÛÜÄ…reŽ.ÎÇ ùyÌÒhë›j˜¤ü'f¿nÁŒÞŒ09„¶q_h‡¿oêX‘`´\»¡Ñ¶"Ø–9ãȶP ŸUX±²˜÷z™0ó®ŠM›ƒ@@Íõ‘Qqå ûÙ¬û]ů¦paÖô²¿…ªYo{�üK¨Èü‡ÛIø®¶ Ñʯ‘_&ûIUùÝn1lçy¿‡W�úSèÃͦÀ¯[²âZâ%ˆaáÃ_gtY«гÖP$7ê쯫ï�“›žàÍòrsʰZÐGæ°ìZ`ífÀPAB¾ô§ðñí,P“i´Ëƒ3=7°1èIäÖÖ'VͳNäµÒª« �С�8c ”ᆠÁÀtT»‹0à÷«òÖÔ‚½21P|\Ç£8%ž´^¶‘�›` ®!œK€åÜ À¼�?£yã>p!Ôw�yÉܵ>GÂÞèi3–|W—L—¾’õÕ@-&ø¡¦—·j Ügy^›&ÈHM¸%ÌŽôæLÀ¶ŒO7V �ÔÒÕÄ/8º!j÷Ó§95•óy)Š”€ ýn²ëzn�[¾›…¶ÐÃ.ÎëW,n»)lú´á>h�P»Ð`¸Îhí-uè-•4É�qØæÎg4Fô QÎ>"*;v hqéŸïß¿hmvÖ°smÕã`‡éͽí—Q§0Û-ÞL–›[ŠM~w,Vaåh›(  ßa]æ]gl•Ñ»§O_k½«÷½#¹(ªtÔ�w ªß/Hµ¶Òr'súP÷)Ì`öÆÂ"6ñyFƒ¸u' rS×Ó{v¡ì oä&«u<ѶY ¼„�E`o×°ÝQó™\ï4¦µ§¼Û.ÛWõ„l4K¼U&'wÙÛšš  .Àt÷ß ZÍ«Müø•ãÓËÏ èlR§cËu§‰äh Å#N5ïj¿”fA™²;½“O:Ë_Á$ ¤àTã&5+è× ãã6F[&ZsrÈÊ…·sö£zŸ×‰EËX¯žÙÛepæ¥g0b ì… …>¾Fàš<!Ícן( tŠÓ­®|xF Æöœ•ªwȦtþš½ãJN]çòWÈ£ˆ-ãº(Êe­Îkƒ};JóØJ,`ôK;œ†nÓ|ë<) À-X‚šƒ„Þ’�Íß.«�Ñ.Éji ›U±tê>°SÝ” Ö/¼•"œv6£·»él�ˆ°-ZiÜr«œ:[k®íìÓ¤MÝ=‹qçSL¯Oê­–87‘`B�Ž3ᾫmw%˜q'� @�ÊšØÐ‡g¦ ®4‘˜ þÇ[¡kâqí1my»,Ø@ÌÈ)%ŒžèH±Fíg3@z ÷N–oh[mܳÅ+»~±&O[µŠöf+.³¸ÑlîXŒeÓÙðCSªÀž‚¼Ëó˜Ç'E˜º�aín”_“Ù¡®p:®U-†…ݧ{ŒZê=šÕÓ>–gÅæZÔªi@9¶¯dƒ<Š’ð¢.r�ƒ®\l°0¼f Âi,# ËÛã1Š�ÍU5¤9q‚�>0˜r¾ìÚ¼¿a$ðbÑRæ4¼<жÄ|ä•¶,ä�?9xì¸7<’RY•º ^ñ÷›í~n†@óhºT3AÛãœ' r]ì9ʳ·žf¡µŒÚæ­L{P3N\› ¼_°È }ë�G1¨ŽvNèP”Î3ú3K\œŽí½�¶ q“¿†Ùb£å¹iÈe`·É•¢+œÓ²ó5ty“Q1Yè4Y4üêå|"æžÝ¹/s+{ ,ÜV×5XÐÎWQÁUa¸N%2øÂX–Y”î0‚¬ƒ¨oRF¬:eÓ›¿Dæ|·´ANa-a\'³µüMqg74^S´ªq±-·ˆe¯Þ¿÷µÁŒH~ÜÒ€PPSáJ(@Õ)JlßìOw�îÁçw‚›>vZ–ÞjFŸîé@¾C”uq? ݈”Q“bŠ\"ôm6ëjU·?«ÐM¾î wœ:ÀäÕp:ésYðkxɸÌrC𔀠ùð‘jé ƒûºÞ³{Âh ÍØoôX‰‰ËŠLµG¿}�ú+#ÛÀzÙ;ÈžÏöšýüPñ¨p©î?§·¤ÙB ‡\†|Qÿ‚ÙFùþêÏÔá‹<ÜÅ«!쉇I°øµþ�ðþš}_ßý'V…æ÷ÂL!ÛíL„Wƒç®óÝfâêǃc6:Û¶b84pß[×È?–�Ï��ˆ]�è<ªÙ Ac‚šñlòL ù²e­y�ÆV£Sß§J)eí•õ³£ÕË=ý´6õá` g9•·  Î0áç$›ã{ªSÞ†/5ãÀš�àÝÙkÖ/{�ž?KÐëz¾›þ[0¼.©/(Ô†˜QˆŸT›Õ õÔ?{“(ÍQÌ a¡ôVœþ»h÷Ëé1G„{º÷Ký†ásÚ·³Žj7T^°ë¶‹Ô¼°R­3ûЪ& ×1þ°t9“áÜ]AŸnô*ʨ³Î '¨†ã:æ6ígoÄ0£•YyMhÕ�íñ£�…‰¤ (rú}‚k¹bÃÀ_É�.ßDÆÌ‹´ß²ÔPPG•GŒÊÓ:+ lÂס0ì©QÎÖÙ»9_z᲋ï�»…œ}–ì­�+iñî­×À�ŠKX ¬7vˆKvñ U¡÷d ;¨¾Ð{{„t�¶­ Ú3±ŽºnþõèÆßÊ¢ lì.<ð7w˸wx]Çʺ°x@å@ý½E™ô1$†È”úÎ$ô¥â$ôÂÌÖHšk‚…ŸªOrªU$]°Hí‹Ám lj)µ ­ú»{–¹^D³Õìr×Ï¥)‹Ÿ';Œ2dDˆË_–"\CÜ/!Û¤¾6ºUñ†Â#Ã'T$ï_C�9|«›3UùyЇÄÐÊ�LÏe-Œc­Â͈ã‘’!�èÎýªœÚÆØ�Aú&XÜìS.ò¬­Ã`5¯Èúèí†�k!’‰;[n (V•³n�ޝ§òçL`˜Œâì•`ɨ’掷ƒÖVöÅN(êÍ8ž|�¸hk R™Ø<šd«˜è•Zéá¥Q¼©öœµ³‹âÀ©”#gy ’~–¹¬<2ˆ‰1~g«—9hèM•EçÅ¿ ˜>ËŠA�Ü`#ö9œ¥!BQ†øÔØ2 ¤¶ü^^ YãÏ_weO³°×&ùÒÓпÀqà›cÖ¼Öõ ,{«}• ˆy¶ µpÈöà¾2¸DlhW8kõy¼~˜è³J~â4òœ¡�ùØåÕzü¹ó7Qú)ËÃÆ3®Á˜�Z<›`5&±öá�p°âø �kÑ,ÃYP Ò’MtLÜøÃ•øêË�×5‰ÆI{V}òH~öýµb’÷ÆÁ…™ 2ãgzºm6œ®â‚;t…[}¼b¯XÇrï-RÅ{pÈW.aÝ‹ùuë,�W(„¼8¦N9ŽÏæ�ßq`>·\>xBß�½�†<Ïø\PNÿCÀš…_~¶5BêFÜl�¸‡.„E FÃu�"}xTg”ˆ�yœÑá§mËZèaªmÂ(ã@Ç ¸<†âøÜl¥ n·Qk0‚j³†�ª'�áÍ÷¢p¡ß—)ýö0åÈúS¶P <©l8ØÀªŽ.»tùã$þaíi*q¯Ì8ï`¡3g?`ö  pÑàûrl(&ˆÆ;=}x7LÚ÷O£ÅÁßpkÔ�6r)k-§óZÃÓQ�¢Ý,ó¯ÚûÎj Óh¦†5Ÿ:Œë󹵸¾¥³¾î)­yƯþ�8`nä”÷Æ$bƒ9³+vØc†ÔF€ŠSj ÑEÏ×zk°®Jû¦È�áð�²>¹‡,GŒnÚe‡8$hí1áÙåìgZ w·çcûØŒ²çʾÒ{ûŠu &8±(G/ûîWçíÙ…óŒs©|“Ž“¾‡e#ûê·ÚÍ�.øi¶X5€ Ž eüÐX¾ÁõBã¡]ÅÍÊÊæíeÖóǬ^á?TšæÚr€ÊÚíã5’Œ÷ì%Ö@~ Ì@yÂù´G‹ŒZcé}Å?çÍ»ò†ðc<^ø„¾>üÞŒèVPþ“ü;6ÚIøm'¥¡ÈÇ€®¤Ø9¬\ìrÏ ir¡‘³hÁ¯v÷¹�̶©a¾Nð‘·�Úã�YtÎ`ìu‹”ø2œ,´#¬ü'ð·‹Pû»“±ˆqt·Úóah¢BÄ``{îìô.èá—–¯V"µ‚B}©ÃrÜÃswõx:g‚÷|ž]»|çJ~ÇbÉË4öÎS7=Þ¦9gd¨]àý. û Ä¾õëØhG;fà8ì¢ëÚ@^R}ïÑÚÊuý¬W°»½}Åí±²åY pò«°‰«K}d{çÚ×°Èß° PõðþÉÍò1 {r�© ¦ˆB¥Ö+EÍ;‚‹_“¡ÍÁ¾�uÔ’,�Ì]-¬æHß0žÙqg—×"”´££clÇãMcÈ<錮žâqIqXAí££ˆG˜1@(SA6Ü(VËŽãY÷]<¦è‡—Ï8Ó“Åx³½_„Ïkp-Â#9áVú÷ýÍV¥%%ÁD 4Ë.¼$šã… <ÝÒ„7°@¬çK@l�|«³;($ÚÈm»†�…qcØ]G×­=˜1¥N½œ¹1Êècˆ½{Zk(ý‚mÞ“¯çÐ&Úùm[{\^ÌGr9�Á•µªŸj«Ö=¹L±£ÔsTÙnev »Ø—ub|Eu¥\?ê£ ó©£?ŠZ™‚fÝÒà¦úB&,îß5Ÿت<ìVe¢~=¦c€ütë2ðÚpØ =Ã]ãXàlwóóyá¥ÊþÑã+çR‹­¯‡ŠàN°ëwÑÁ¥Ê =©u•ȶ�?`V¢Ç¥ ‚>N§»«ëG"  =ñ–ɤUBæÝÿkæß¸oHÙ?ÉÄê4ö^L»ý·1yÈ9–8»�Œmv†nù¿+çï+ ýu©‹Ÿ&|; }´qâË1ñq8F¸Âv¶šúnàÍYGC±| €^]ß1«BwV™ù°Äµ�G~”¢¿×õ–[W[ زŠ„ kÄo!¾¤57!èéù€»^Ø‚oÏ$ —Ž”Ü�‡•¸ ÀEç€�äÓœìJVböK”„RÚs¯}*’‰ŒêÝŒ–�m„sزsO°ð7¶øÖÉÑ„& é®ûÕ9qÆæ¶å³9Ïټ㥌LÑËyÚëÆ,†§‚Ã|ƒí²à\¡¤3Qó!Š¿F4£‰upÀ.ÑiÊ‚ó þ–DnñJó’$ 5èö$¹|I˜§†ÝÀi�©¾›}r)àûG`8⇠B_d.~bîö‡ð«@›dðÃi¡MŽk‘ícIIlÕÁÓuÚ�X³­Ì�0R¸ΣW=‚6[P@Ûþ†Å6ËÖ/xî4•#¦ŸØ²CJ#.p'kdH´ %0@ !+œš ŽÅLP+ Ž ÛÓo [$,� ”ìÁ>0°R<$ï{³ËþKn»q4åŒAåÿßÑðºçÞF^}× ~æžUÔ·ÑÛi³¶›5ÈSq¿BƖŪÔì›<:"Xèe|­c æ…£U[m…Ÿ×<ð'a`<íÂÿÊY›æðš¢¸.œ­Q™Àõ>pÍ÷!#¡²o¿¾¿I¯Õ,ž>â߬p "óe¸\Q\ã€Ìû#M6rÝ"êƒ nQ¹«ò7H€8púùr ¡?töÑ�Ià*^ó==B‰}› [Ù}Áö‡Ðvé"jS¶“¡üƒ&‡c‚÷nš¿£$ïÏÐö‰_¶‡»&Ó8Ú‚/Ýnð´ÑnMœä•g¦úРŸlZï]JO“¶J™’ci´Ñ r檮I‹—VÕ ¶*ØñJ×}Oo•$¶>RœC®M vÚÒêâÉBÈO9�£›>%jï‰.Ú¼÷{mÔeXtG�ö¶Ýƒˆe+ÔFšÕ×Úšš f.ïŸ\Þ�=^?"µ’ŒÎ-|ƒnÁÖºÏÊ÷añšQ¦TWÇq;^o¥÷þ׈+[R¬È�u@Xî�?Æ]¸äª1òvy„t¸ï7'¢N hþbÃ@�aµ'ƒ~÷·¿ò�‚Ì�ßU{g2oÏw¨FÆø¬×¥ƒ5E“wÍìôÆäÀÍ/[˜S‡ ë k˜ìtÜ;¢ S]–,’º±ª&k¦ËÄÝsð¶œýHˆ¤šËOø²Î;¬å_ÇlÍûœQ™â¬¹°±øÝ§0á˜pœí±NŽfžù·<èÅ1Ž£|[ Rì1øn rAJx)è¡Á£8Žÿ`»faðþiH´NaHu[Å$dä5¤¾ Ø=‰€��#°w&±>í9 ¸uÏ™;P'¶«¬å8�§_;—ÝXTÊÔlà‘UtìPjö#fåÔ>Ð.ïN~S Lµð+DTÄÙíåˆ/ªB “ÂFÄIw¢4¡AdÝÛ <]hdweÍøä߆òþÇŽùãö¶?M „Á�l¦h÷´ºh¦¹àªg œ ±L¥qÚN.î3ãa¾æÑôÀÝQ-Ú°™~Äâ�åöo±²|S9¹ _@øŽ  ©®o.OÉ~'³ê k1ÙÏp*ÞåHÇED–rã–žz~Ÿ¶¾<†”¤bq÷pFKnÈNÚè‹”æ?00wäíGA÷–Ë}½'ÙÒà!7p¡À—ÒPb!oV6< 9-cÀ9(0¢cŽ ÌP¿¾‚ñ4ø7€/aX"5A+‰4w.QØë—ŠkÎo�®\ «âµ(JdJ,wdŠö6Í“Èfé*Ž:©N]bÒØ¥)Lrt+ÞrC²ÎÅÃG‘{]ºübøNq" Œñƒi8ãÝVÙÄR�I`À’A6ÌìÑW½­�±>‰Ì6޵aõzïÕÁ\’ J†‰c ‚‘z5ÅX§ÄJ\Zð3`Tël^~—d=X9=U6ÆêøHùúœô…+€Â'‘y^ó(pjíó‹GÉn Tø¤)gÂÛÕÚÀmÅ’„ø4ÀïãªQ�†²HÁYÈÛ€OØ. És;$ÒX”¯u$^í'xð`O·{µ·uÈ繡í¾ln›PlFëµùÖ}ŘnGëWC8NM¯¯J…�¨U@�j'¼œF¶üå)ëT¯•«o¤[¾ÃÚ{{‰Hv°Èû†~ó^7«(!ؽxãF@4+Cß™r¼W;¸º…ìÞ»Æõ%xd8Ntwk[áúgá«âÛ_µ‚tf#Òo"®$³é7‹P¶q;ÝÒshM‘:i1ŵ�Ïÿ"ßS¼”ó mÇq{†Ža×n*hëˆ[¨-á…±½Í}pöF7 {}Íݘºi7bë[|!ˆZÊ´¿*8üÑ[TK’ê¥g;®t¸!sÂJ¢÷�ÊAèÏ9`<-;ð°a¤‡Ýo=Ô»¾|x¶;«+ö•±;¸o‘Ð労ÈdþÖñ~xõ³‰OÅÓTi�“4éä阎¥õ.%3Üô˜*k�ˆ‚²%¿VÚ+SÛJm�ÑF¥ÔmÆ»uǩ̥ü°êÃ…O¯æûOBÛSY=}ûTŸ/¯�ºµ_p›}5Çî¡JÜo<ÃÙ»}L³U’á™eW z±FM°U(©ÎŸ¿� OP,á‰W§sëÅþ.ÈH,öÖÓ Dåô€í„‹$ûm\;Ñ8<-«ßë_–|e®)æ¹-‘b‰–E%Ÿˆf}†›¶Û7<˜&ü‰][í»c\¿šs÷T̾Uœ¹Ò±T×Ö È¹º"ç倶,•Ö?Å|W=Ós~àv`Ò§»Ò^†l¢� �xØ·Jí ëFõÇìÌaå$}}ò�ã©\äB·ª½µ¯ Í+*ô°ü¢|?uöa²û+é�÷ˆðÖÃ8¾˜w6ùUp¸ß·^ω?0�ƒ”‹F0»„·©±:|~Å´6�ˆÞ'kë´?!_!VøQ�jÿj~¸÷ÊÚOI>\’ƺ€`ÀñÞ­™� ­ÅÞÃë—š2G±o~ùIœ—|#fÝï¹x � ÊBèkÇ|\Õô¢š”+yiËÁ°/¢Ñ8Mv|MÝóŒ œ�pMr÷¸÷’CЄ Œ¥ã«~~q>VlS'ÂË,…Öü€ïÙ-{„Ý‘wû’:{-1’Ù­F´Â{_¯¸ßÞaÞòÍ› TÓÄÊ>ʼ ?ÏÏ!`�\äÈÓ~Må˜l¼Å²$TĨxÍùk @f‘M‘èçÇWŠÙÝÖrjÆ `G,»w“{a¬fæxç8fd�ÀÝs*‡€Î_¢Ê¼‹ë¥Ì«>{oW‚©|$V�SÆr¤})’Øåk)ÜÚ†Úw+-°|ÀâÎ^°õn\,/öÚR Î%öRµt‰¥�)>Ö/íÛ¾<ønu›±BˆAá]JÛsµV3¡3`½Éôl�ﮥ�ŒšÛñ[§¬X4ŠL†îç÷kµ½$J°ò\9]ºÎ7Õ½} ó¸Û“ž0.40.w3 ³kÏ» šª˜.ãéÊÈ»o(LÄ-¾O/PyÚ´ß8¢Ù|_AGŠ>}^&‚ÑírÞÄ�×Ðeµå¥ âȮŔ>4ßèè†[†»€7k¾™¨ å�¯1÷Qï?7o˜ÁF$¾ÛeT¹O(ÝûÅz4=Z¯½ÙåWZ!ÃXL3á(<•JÍnÍ#�lÔ@À…嬸õWY�‰Ï{ö¾¯sm1À;I%*La@?>ËúMö&Èš»xñ§ØJä¿RfN¾hÎgy•EöQî¼ñ»“Ø‚¿èÑïy1¾Pþûvð ñÁ±µ›Ä@1‹9…”˜§pÿˆ5·ÃŽÃå„&æËëž®+Ýž/d‚ì#U ¾'륉>—Rñ�]Ýþ«2ïkL˜Ù†††µa6µˆ ‹1ß–ÔnŸ €ð3áµ›S¼ý�/Cq鎕�¡3Ó¼šuÃT´…`[E®3Rq TZÆ0ÌäR¨Œ�¯¶½Ú¹Ír°B‘�>^ ÁFèÊuì:®$ÐÕl3•Ã=¡ß=dÊ4^hí籤£Á¤‚ånËÂ`^ >nkdGClo¹¯"K Ô=äpïªMñcçbºº�¦¸?Abõ–.›F�v$¶g½ï'§¶5’l8³þZ<‰…µ õÓÒ ÊV1Ø\2À±©bµdÄ4=èG!׸,ÙˆèrÙ8:a‘ÚŽ;™Þ=lµX/.zmÕ:n\j×cèJ·5 Hv?p%i®o|‰çT˜µÞ•ylÛÃï®7lš‰ˆû›KîÔ§¥£›àÂ<Žcp‡Œç™ Ð¥0$;ëDô :.©X—t”#ñP8ô:£×祘Èïô9árÌíä&øs”8DpÎd pNˆ ΋yÉ,»9“S:œþï'VX„ûQñ.s·Ìj²&¤"Ã&ãbÒäƒYDl/ÞH×›aO¸%ÛJ-Ø‘ÐSÿ”ëy¨\PŠ4¼�†?Šïu Ô&ŒØ¹Hž�ÏFÂó`€RÈôÁ§�‡hÙ•Dî=naª¶Õƒ…ïûiEtíº Ü¢*]‚ŽÔ«’ÁäÞ÷‡°§\|¦À¶y8fß!eO²œ\Ü“(Èjš®v°@>w]ïy Ò›WvXŠíºVíðØ^>` ì´OÇŠi Þ²�ÑH.2i½ÇÏ£I›ªõ]R°X”�¢–›¹YXµk5ÎÃå~¶¯FÌC[LXÅ‘ý§kœk˜+A-Ði€òY²8á5fx¸íÜ8™ô`êÈ .ýubÖÎôÝ€®üúÃŽâÝéX;TÇŠÚ>O#;c-²±�›Oh8UÅ�®q'×$:6Hœ*h/ó(5ÿ9Æ6åÌýÕ<è¯Ôûc¡mŒ‚H×½o›î”ÜßÖ‘çXºäÍàÙÌÌ&_6 »êb÷ÍT¥´¶O¦Ú˲ÉZÁÜ&?2Ð8ˆ}„Xª†d2™¤PÌÇ4X�ÉÄä1º±íäxئS³µ¿3ä)5¦íGÃÁ7�7­Xo˜Ñh¾ß¥®—®{¸ ú¶� ↙¶Õ�€çcÍH*ôK- êPM€m�ó¬¹ôb$zãó*1: pGv@ �>æ6ž}ZM 1&¿CšÑHys&÷Ð홫}•�7º^—å¤ n]KO¸ñbX/„8‘øy‰°l78nÎC`ì:‡²L/Ã6hºl^$r0¹™–�Q¨Ms?UÏ[nË«âÄ»ÐY[�£ ,í²œPÐí ^+¾7º‹�±RF“2¡ƒÆZ¶ 41M{ÒPg÷5&w> 6µ¾Z#žB±«j?)y¢z ?aéÅû³§|cu[^zŠ„ËR}ï»�ófYÀWtXU2¥9]Î8ªêæ È~nCz/Ïe°P\ÐÅÅiдvh6eÂE?•áèºP¬2Ž�Gñ¡°ÿàåJ›uX¶«x>˜0Ûûu\Ö)7X 29çú "š'÷˜P´¦=ä ãú˜[cR³ÉÞ»%77®&³ˆ ¢k[}+HååAßøn4"©Çfå�[Ð$—Z4pt}å†�õ¢RLO‹uŒ'¢Ú†¡ÛuözµßÓýÈN{§Cƒlšìÿ'>«Y;ÇÇ® ðÅïf†¶ Õ»ôVÜå·[õým¤Ú¥±¶Ïó.Š éÊ»U`*K”š>�AÝ:±®òË tH "Šk]¨ÕV‘®ÿ$.ß™þº'‘¯�j@:ö½U"õ=Ž(bƒNË¿|3Waû|•Ø`±t’K4bÆ•Ž«m²ýŒmåU7Ô0[/Œ»p¸¾,ðnííæÕצÄ\6ó¦ Ї§ànt1Ä�_AÀG>óŽ-©œiçäÒv9‡Íq±ÜÃÀì'æ¾ìÈ-"å<6SàòÄô›Ð«)ãÜiIi´Òf²sWtu0†a<ëªçó–³p�¤&$;§ïÛÀñ4ê"òA–&½…ƒó½õéI•ÞßCÏLW7u\qêy¹TL´&èM” y…{^ŸÝ¡|ë6“ù­zÔÔ{D˜Öž�ÛÏŒb ;¨x§’l P:Úåï3X”M ûVàÏ…§æðW`:z¥ùì,wälù·¬Lt;`þ…š`™8wõÿ\ññÈto+€|#¾-nÎåÌ,ºÓè+W ’Ç+ÜÈ4mº`¹{˜æGoQ¤]:º¹çUj÷ y‰ÅÖ—›¾Ò›}ót^-Žua²ÔÆÁ@hÔqmÙj¡y¡š A¼ðîB"A{nc^³û?Ï=ög¼•Ë\ +\…Í··¨ñ˜fµZŠ$-.`#ó|žTß,:Z‹k»²vƬ!m¹Ïs•Ò,aËM Œ‰eSß8()Ä > †ºß|ǯŒ~s`oÍ7è¶µ„j cÈ�Ø,s6`3â‰ÛH ©½{1¥°¨ ‡5s�Æø{gâ*[Û�ÅZ\®N÷×Wšyv ¡Ì3Ù½´ƒÀü¨ I³%ä:îÅØ‡ù*Úù’ ¬šµMc3¬ %­Ä'^@ôýÔÎNÀÔ,ñèVûV°×Xˆ/�?XB8å‹¿4FkºÆùzÅMmšshϱZ :EöÀÅ÷z¡¿� Ó Q»úø/ä0D o4=e²”DåG .'—Ú†Ý‹Ž {,ݨÿžX)õ" ?ɯîuUº·Óâ+ïy»K³ü4íéþ½ ÚÌœû(‚Ã�X~³ •ÝõȳYv÷¢´’Ãܽ×n9fŽr×­®pÚPÓp—e¿ÑFEÑËÍ´FºPz†ÖB,T…È1oì�[ž äV[ydi)z¸ÛCÖÀm®Ýð 3‰Â%ÅÓ솛‘wëuQñ“%­iäa@Ï�­vñŠƒjÂÜô¼Ñb'îp sð½¾·žd�n9HÀý-ò…AÕ0VŒ¯Ü}ë3]ïÄPæ Xï–8Ôè´+ˆ4пõƒïœp8¾‚©ñ¼Ò/ Á¦‘ Ö SIö.ÿ{•­û· �±:9x =§5Î+qK�ºmW*• yŸ*kE3ÉÝЋ�£µpu\ 4M�O;KF4ÁoÝ�ÞÀ— ‡�²W …è™¶]pálw¼V-s>ˆbÜÍNëèÒŸk;ë)«þ+õ@{Ëò�Í£&Ç“Mr ºjÏ˨8 >¢•%SÄKŒ_Ù²t‡hà{~¯@N]!# ¶¡Øo-²ÅÖ‚· Z†È5fVΆÀ�D\¹™xLu6~¥'*ÂcÜÆH û}¼*¶BLJì ÚoËv�ú�ið‡nÍ {~´›érhñÎß>š ð+ªç®ñ õŒo ÂSá^Ù{µ MÏÖ°»ðƒëà\ƒÃ�Õ¶œäI>T~ËaþÜO€éµêk¹k›Õ„߲^m~ò{¯}1[—kÄñƒXÐIëiª�Ï–Zœq]QÖKœ62ê0i·@ư`â÷J3]nå|¸Ñ @’P®¯öœé¾9îK:ŸœlŽøˆ»nÖ@EÄW ‰J= MÂbÆÏlBl³ß©£¹¢û�éÍ,!;¥…öÒáñY#üÎX‚ç1t Ûž*Cœ,`»€½75}ywU‹ÕøÊŽ9WDG{\îÓ¡l¥°ùäL3`3cWG¶P5|п-¹íc,�‚�Ë%¡}–Tê!™LìeÜŽ¥î.ÂO"ºŸrÉîOodIEíÇœÌ@È΄cƒˆÎQz:Q�ZììDº¢¿YõÛ»Ÿ8—gÄý„í®›ó0öâ¬x`næiŽ�Û—9=ëUq—[Ü–]ßK—^mí­÷£°b«í“{^g¸¶Ú@:x’„ޱM²Ó*àÓkLÜK8Ld»V—Ýn¹oÉ‹S[<ÊÙô¥©1üÞ*Jv]õãž—úê} üqÂú£Aö(¡2P\X¬Y·–Ò¯š•ÑŒXÕ��e�Œ QkïAgG9Ø’× ÁmìÁ¾–r�gä¬è|-œŸR¬KŒVD/<t$.¾Ï” ìYK\Žp.<wÖcŸÆ‡×f܃Jàrá&@(xÛ* }ïs%ð±ÏíŒä½ðº1.D�T¾Õ{„YJ”Êw³k„xÚðT–ž(MƒØk8roñ„~jÖÌÔm;°lá‡q]71 (ƒ‰Q,Œ¡Ôå�G+pŽˆœ¹Ó:`Ã�í3žŒMõ¶ åýñó’ÍzsÛr¹†¿ì(tS&Ee·&@½“¿ãðˆûëÍô‹ê¿¾¿£¿}Õmξû«ÈRIó&ô�º´Ä,^¨|̇(»Þ÷$™žAž³ô¨Ë—¸ã¦êî £“¾9}X±áæØ¾ú¹.ÞìÒÇ�åÏ.™*õ{�Ü0ÉÊ<.X×�‘*…ûOv~ýyKw:Lxrœ²sFgC�~l䬜µ ägm¯¼A& ‘U® #ùÓÆx°8 sÍ9•†·¯�¦9~®êyíìs®»Þ#]a)t9M†£}ì.Ñh1 o\ïeù3¹#w‰-”O£iÈÚ}ž?ª;Å.Qtt¹' ¸kç©v©>,yí‡Þ±Ø=ßÞõÜƒš¯²¾ä ÂÌ ¾{`MXé \Nw¦ `•ä Žsq”‰Ö·¿»œ�âL7nyè˜6B/p¸4°¤éMž‘ÔiÆ�-¿\‡î¼ÀŸ=p‡íl±èç‹-öú=â¶# €aî÷<ëx3÷×GóÙà†› añòÜ wÁP6ãl5´ç¼’ÅȲ•áQ¹jùP�òÚkÆïc×^k«ªHTùÁ^Ìl²Â{£Ÿë¯Ì#ðª}ÑæAÉŠ•«ç>7.¼�³m¬Ö5l]tß­ó÷¿ ßœÑ ‰�[-Ûnˆ45ÞáZ£§hÎ#M]¤„åùA±G"ýQ’Þðï�ÆÄŒZÐñe«<òË®$î)÷¥R ¶”‰F‹â-E÷¼Ôfû‹óÞ½¶+78%°ìi»åÑ1½ñ™D¸†[XíÊ ¨âéË´dhž«%àW¶:‹lðô>Cø{Õ"m×±A²¡€¬]N9ËP®ã#À™ ÚÅð ´7zäƒ[w‘<`ã†Gd\žÅalçèÐñÓk žÄç̸S¾úuâ‡Óýt7wÀ6ö±yãé߈ï�Š:…aà mAC8×ÞYîVt‡ðãá¼ü2�ÛÕOe¿¿HÚ07«^�[«Z¡Q"®P¶Ó™ˆ9'¯V.ƒS&±qqüÖ÷Û 5žè,ÒÂgôY>c`Öþ~rÞÄXGJ·G­ã"ý;¢GJ£AÁŒïZPÆ©¼y5vÁ½¡Çë�±í(iä€[À<ëky $ܦR?kaÎ޵M`ŸÓ,.¼¼f9wEèkišpØoƒÐ>ŸmžKr2.àÚŒ¨_qïYq—@KðÂÊIˆBX\�EbÕί%ÃkÖÆ²aQ¢ßbælÁÐmb4XEÓžúL2.Â燄û÷ñå{°{3÷…þOg¶—_¤ô tž<áñXŽûNÈŒf»Ùª¾� T‘ÃÁYE^2Èñ™j·Æ•2b¯'ìfÉÌÓõåÊ*‰Ä(p—/œ~c²¥Ü#è-� yDdõ_è�¢Ð Ѫ67=¯/Îj"8ý�Ñq·n³l=7+MôÏó÷+ 3rW½6vºaŸîÅ WWÂá¢>Õhr@úÂRüv´}ñáQ³ÔË¢�&S‚Q§yë8Ø,ÃŒ¤°Ý§Ce]KW�ĽÀ]o¸±àR’ë¾#ýâX\àûS;tžˆh<@ߣšøµr8É&UÂg9ÇG¨�…ù€>wã™_´Øl}ºk½Ðµ®rÌ¡š1!Eõ‹™[¬–ü¾ùDWò-÷�­w �×RÙ©¹_DÄL Æ 7·êõ£iúÔ‹ŸswÞ„ó‰‘ûÝ诚yY:¢üί�‡¡‰ Û`sËßí×y¡Ú¶¯=ÅÁlW_•"Òó·U Ýr)г[3W ÐÚW>pš*Ê0[nu<lrRÈf,c�ǻ쪳•Öêø ƒîøu½ùÎïÒâ‚GOà�™¼.p]mqÀ¢p*¡c’rQwaÕÀ/truHg×èóÚu^dy9M»ß{kÚ€O>PÕþ•• žz~Bã-}øcÁÍúPî¾ï§}ý @šýk¶Ç,ûÒ*ccŸwíMùˆ?—]´Ët•Ó{:˜} Õ$ü/œ ¬ûô*|¼B ågÂ1²!ÙËÍÞ9:�§ŠÜŸ‹o¢À¥ÂÁ}&%Gl s’ÚÐö³îDFzÏ’ÌýÍ–C­Üg#5 äåïð…]ñ¬}ŽþtÊÕ]äG°±Bö­›ýÆÓ¿9ðÛ¼/�­ ôƒ ùæöýÍ ¸ò¤x¦Â.Ç(j$¬ d�i/êìÐ$`óqv Ë \VIq¥nnŒ;‰@ÐHoo£XÜPÜÑ[$ê0ªØ&=gvwí®ŽˆÓ_¥£i÷G¥¾%*פ•ô�^ BHxsý4úLsyšŸ’魯õ¾¥Åh·CÜ?œ�À&_iq›ûMò ÍRUt¿ƒ„?^j¸Ióô˜ïÃÞŸ˜ÆŸî�¶çܱÍ0k=´"p¼‰ñ»ß£Óø[]YGMìž`ÉË=S§è:@O§ y»#«këÒFÜô-Ñã%¬Ø•ë\FïºÙë*ÎÐèWÑ¿l\™ÀAwÏo2)oF¨zýú^ÞÕ-ùø˜Hh>ªÕEÚ‚w‹·!À£uo¼H2¦˜ª˜Ì6¾‡Ñ·~÷[%¥RÖ7Ì68Ö˜ƒ §d˜ÚÖ¬�2F³k•ǪÊÔÚ$Ë$ã0Q�åôƒWm‚ ´ŠÜÉJ†ãüWÖÝ< 8¡7[ŸÈÚòúšWe�œ®SÎt0aïí¸óªX„3xIå©Ö~/CƒÝWÄœ6Б†W!ΡҭǚÖ2°³uy° ¬˜ŽëÚ·û ¡“ÞÏ‘~ìTTªÛŽœ*mŸ˜º:�d` 6©uW$½Áq-Á όҼªú÷ Å´*€7«—ˆ7y�>ç‚#ëµÓµ“Î?«˜ òž¥]�¢¢Úùx»r®ã@9Q\žðß¾1Þÿ¶ø²àà;ý•9À³h*u?jààI$#a­žºðÒm¤PD¦ЕáLhΘI4�-«Í’¦aÓ@€8þÐ|wò�¼9«”¶ô�Î5M÷ÎwO»œ¸ç‹éXðeµ^þÕ…PR” ÚÝ>»;}òˆ�û ¤Æƒä™[ßb™9ü©Œ¡G4ôCѶgFæè%Ã}o,Rûë´ý®ÿTÿ…,uÿôS›_÷Ï?êÆ÷“Öÿ’{„Yw4Iˆ4%ãáéÊç1_ÑmÏ®înÚ¶aµä>²3*u9ñqP~Eï9Lè¯ü¤&ƒGÖQMLª|±•�í6Γ(K—w—ˆPoouÍYüæñ&¬“h�GÙÿúÞÄÌàùß_–Þ«¾Ðé ˜h"@äâqšÀ*ìD³’ôÍæzkéÑή£Coé òùR?Cºë(j>Šù‹3ÚÐ0Âc@@Eiôìåv�þ Aè]¡îØ“ï1‹KÐKŽMß‚V[¾ƒýŽì6)¹ò¬4˜ ÛçãZþ?BÞv$ùöi¥kÌ$zÔ Àm:p…˜…#ôeD"¤Þ‹a#þÝ� Mz^ƒÒ›ÙšHÒ#«ò¡Ay2zQÿYŽ�ŸÒÍu̱`>�4  gˆwlÃ"n0=<qcãLT¥¼«Ý*é;*W Œ¿kb²ÚV³s¸ Çau§RÒX-[`Ð 8-fâÂæÉk(ö÷@?í'‚ñ¼ëŒq¼¨�o·º»¼eÄ2Ž ¦ÓlÁ.ç8ž�sþ»ëÉ×ÜÏV§¾ÁefÜ “2· \\- p¾´Ûü»r¢,¡zl™ˆ0ùPá“6±á‡¡†°¬¨ÃÚÑl©N5#AÕÎÌéжpynåA8:¢R˜�òÊà-¬ˆ=ä"ßëmLzÆœ4,P¦ì�±Lè£r™« KôN_KÎW#¾>±$3Êqwÿh˜¾K_/–éµ´oýÞí°fÔu#À´(m–.×$džâøº6�:6K6‚tc‹ƒr³4á.>z@€=Ø=zôƒÔ«˜;ûå–¦»Å–a"�ØÇ€µ£7@9#q–¥¡kTÈ WO‰ƒæ�BŒÂ ±VI9œÜ¬¸qÕäÔdKëÊzð íq²XàYÝ@ØsóíÂÌ™e3ÜÉÜØ�ÖÛ^)æ8J¸¹ Ü™„v%†`Ìw'^Oü.ìü`Ö+ܶæ‰e…Æ#½* $Žá±õ§ìŽQCwé3dÂÜÙ�x{õè(ÆŒBw?Á®j—6á¹àûÏ6ÿÚp̲—ôp›øÞÁœk™‡·ç²�À- Ö?[‘<\, èŒ=ü¬ðY~näYeË„*§¼¹Ñ�] |OÍçþx#]¿ç±}~ßË�t ~wÿ«Ÿ*3Y ” .�[î1ìòÛÖŽë�u¹s=ç3\¹cÆL@�-!ßL_ÖÉÍ·M0åõܸmZ‚5F#ÝÆ$aV9À°ã³�ô%ž¢—fëãËÖûó[[V‚¬ ÝíòÿwŸß.¦ÖP+á{+Ü9]À©’_šê©�ï8ïw¬r6�+^[m—Ø?ðžø…ÀÜËÔ~oæ©é¾ëæJ½ßÛ;{÷šR”Õµ!ïᚆ�…¿ÑcóóKpåà1k��Or´þtÃaXÌwëq¬¡SC$Ù\dÕÎý1”2Ï‚J,F„f a;Õ¡á.Öw®_ÁÖ¢Ñvü•ÍR¡Ö÷ Û)ÿ–ˆÃqzëZ Xi*ÕuÂt<?HL³x„yñø�ÙÇÂÇ¡}DߘVÖ¿¥W»²�tWÅ1dù}ô¯ ÂO|gÿ0a�Ë“q"®bQx…¦½.«QÏð‡%t4Å—í”A6U>¦`€^~y4„$§³ë¿ÆÍŽ$硪ü÷ûÖ…Kù[ÉÌ7kb,ðrÐ^�­xc3×{¿ šÚ©T¯üœL„½ï¬ùù*üÍiÉúöòhÅ´\Øø¡«bì'g0I^þ•bÁxKÁx*¤M$ñøçÚÆíÌþkûåµ{á©Q»­"¥`òæ-Ê”ŸÒ°aúªP‘­AÏ4Ásœ_ÿÖŒŸG£¾�ý· ÐÝ¿ètÓ ‚iŸø)ÜA†d¤ˆ6DÜv¦‘BöÉÄýŒáôÃìll²,µÓ¡ÅˆbCö4€k `r¾_ÌúXi:ùüÇ�’…ðùm9ש/o,Ô2‘6üóŽÉÜ:`7SY/E�Y÷œóšŒ'¹Òjái�Vë/`æQkz¶ò{L¦ßB“rüw9ŒîÝ_3  nõ;’=¿‡i×u×hŽ!YÚ"Ä0.Ã06¦øœ>pµƒ8"Ì¢n~(Úpéìp ’Òuñ ª‚4ü/ƒý»�C&P¾s·óµø›*‹›+‹ ­nïw)Äâ‹ÝÊÌJá«U¤ÅïIù›¶—cˆp¢/~•ï³V­‰þJ´Ö'kþd0¡,gz¢$¢¯ñÐæEeïÿV£çèë�Žï[ËyÀ¼ÎÝã…„c}žvÖ3RhO‰± .ÊÍ!hkk/É|�3’ V­'v¡1Xš3Šð+¸Äácp=Ì8u¨Àd))§ÆXæ!*Ͳ(~ …. <×ûÝ7/¢ãîw#Ø¿Üÿ®Ý£±¿ºî¤[ÞwÂ<3fÚtݳ™Çäm;¿Wò¶9#mëe<\0¼gB ‹ðÓ} �+³aÎÀ_}¿¬3°§úË]k±. õ*³E�°`‘€\-v×H7¥x›T€C˜DÑ&JUÏŸˆ ûxó³Ôñ¡õŒÐÔ4¸óü]"~í-.Ù™ýBnÔð§øU­ßòq²c©ó ã,3´?1PQq-êúý”0¯bv°ãgŠÎùwX( …»]ìùs¢é²c¾Í]Z±ñ}ÀÓ…�;¹Ý>½žR¼µ’?õ7ñb$òk™?³ŒFúø1]r›6Œ”êCÿ¹ÆÃRöNà _³(q'ªºì ïŸÛË.…£ ,ßj¹Ð½�ó·$­³0bÙ¦$ó[ZïÀÀ¶IxSB,N'¦ðöp™ úÍÚk½r ©9{à”Ꭹ²…^­|_›KŸ·†à1j/»f+FRðý×ÁÕAj iåÌ}F ·RnõÞÊ#Þ`-ŸîáÀû™´rŠ:�¤÷®ÿr'92UšT¦—Ë;ñ€0bWþꈈý}{R {”‰Æ&LÁEÕã… “Šª,KÔ‡[2cÉ!µZjÚWJ8�»YÀî-„˜ì>惬Ö4Ñè X oÉÂNe£3¯üáÏ1¬j�SkùPü&¿yˆŽm4cÅ^°|ÿmÈò·âÍu®öF¹'–"˜Q§8fJ-Éî”!'1< :\Òˆõ:R¢hìbl+Ø;I‚Æ)&Å‹Bô2î´“IF ;½ËoÉÕ@¶ÓU~6Û+‹^ßW¶r?¸‰äÅ˃y=£'ˆrÑä÷C„C$¹v´ó“jsg£›¦îúÍo]CØ9ýSiK!ið¾9¦°œEˆo¶_)Q9á­}Û‡î¶â@­Gþï‡ÄçHù&œ�7Ú-E:�ò.VÏ\¡Ü[ÌÍ×�µö>›ÚŸï5�4,~ndôƒ˜¦À,‚ z´Èâ©L 9ß�‚k7�X$¡»æë{*>hÃY·öû«°Êž-€èö¨ã‹ó‹ŽìõöÛvÕZ¿ïŠñnkõÓETª8hGÎöÿU4•YöåVYíÿ¬‹œ=2 ±Ù×éÅ•àºÝ^Ææ@Ðûp±ÇAM5ØãüU £<•Ûze7×qÚÞ;Ç[„'Uq7ůþ¸QÛ¥…Îrž']=´ÏSGIyc±=K"Á>Þ¡õÀdZ̘ Væq…®®&ñ®£¸j5Ë�`ûY5ÞkË2§v~U$Ç:­n!;‡¸Ø@SlÚ^ß8u±³ö}Y8à°é8¸ªiÐï)kõ»wqšÕc*ÆŒ¡ój$®vnnä|Î-Q‹Ÿ6 �Äþ‹â(Qû–I¥U^ª-¨îx>¿×m¸:§s’â&Ðñ! M�½úÐîŽ!Œˆ`’1žñà¤Ô–6.ëŽbçzDç^W–€Ÿ Ü÷%Ÿë¼á!vÑ–-ëX3{�8³>àì`£èõNÀ\‰Òa,PÚÈ(Ö†A`ÝñXÀÕ¶pöÃeóê¯&¬²A¥ \ÔÞE­$ײ•óÓšOœÃmL‰Ôò]pâ^µvÌ÷5Ì?Ãyd  ³ü×Ö—IM`ÎmÄ!È;vÁ#Ô$šBbÙ,§"ÇÀó¶¦?7¦ßĺÁ¡0gMÌÄÁùR aä,¥æÒzã8Lì �k– 81�ÚîõË£Ž"Á²&¢é}²�ñ(øÌfÜ“¹hRkm‡MfÃ7 NßÔAr�®»õú?v’¬�߬"Ä8}GÀ¶}ñÌÛèAK¡5Míwhš{SéïA"i›5Ü7‹­l×/–ÙoTf(E}ï&$N±±bh3ˆN=™Ë ®$˜]ª$gÕ˜I'ëÙ>}µzF×`Á}“•ÔÍÛîzjüY”ºÞÅáˆ9ù-ñ毈÷X´œñû‹ç«­šàk@u’Í®-mœ”‰€Þs÷•Ä¿G±A:qºMø[9gÞ7ûÞ¿ÍôhþÐÚ ÇLM£ÎŰ÷^“'“Ô„‰ù3"ÿ2î{=—ÜA†Ø8_|¢Ûa.Šçˆ=_{G¥KÍ“â¼xµkö\”ùm&Åâ+6Z–5.’~Ó{Å+%N‘ôÌæ’�‹ŠOmp(‹Ü~Hï©qéØïÓ2.�`¢ütpÐ˱¶lÇ&å„;®îë¯Ì×ÚÄï‹Lˆ.âA°ÊÎlnì€> 4_Ù^:Ç!ÏkêÊï ^]ËŽ]ê BÒ?Ai+KS™WYú甜Z5Ž1…þ€s€d’� §1&_t©ƒÃÐè]Á^jõiÚA–K€‚¸#‰bE°� q=‹…Å`fw®¶mÊz9ÍÄ[�aStøúõ¢ó&ì�¿ÏW*é×£œæ|ô˜¶8FË:kRÚæfV„¤’˜f„Ý:OflmNt\8PI­ÓS8b‹;ù› Üç0"›9·u‰pmÈU÷—=$oîÌP�Ì´Ô‚Î]`z9®Ú®‘´ù•QýÐÕõ=Z”âˆÊ25¡n V8FèN«=ÕëDB#ØöCŸµ [’åq¿XB¡€2Q,iGw3?>!Èi®„æ/™B˜-°S�I¥[;9àÅìhwÈS©jÁ¸¥�®PaÁ6J8¶•1=ãW7Þí_�؈ö]¹vN̕ֈÛ�é �3=9.%¸Z†%ÝØ'Îí�ˆž$Ff~jâcG#®cH5 Ë[±b»q¿¼àÁXÖ ó¾ÀÆ7ˆÅmÛѸÀª{! ÔƒÕð7ŒÏ%y¬ÿ}ÙÇ6÷çadÄÍ�œ·Ž¢shSà8˜;„*È�~ûYÂlçØ¾Cqpæ›h(¦¤jñDN½m´¥ üBÏÆ{´ uáB+j˜eÇ~ª—yQF~¨ÖƒÜ²ë�¹Ê )X4½ãlƒ>o+ œ(*Ôq1<½õ]³ßâQõ‹ÚºYê_ëQ…Cû„Wp�ß –óRÛ±q¿, º·”ä7|ü3yÔô󆥟ÛWÆû?BRéìÑ€uöÏ69g|vÖU(9!<�"^Íä l°�I‚?ƒ®xïÀn´d­Å”îj‚,wd}9¶Õ×t‰÷Œ€Üñ…Ütͦ=(ÜÁ‚xš@µæ]–¹æ \üÆtá5Òè׬"�šëÔË£ñ¤Í¼ ™Õ/;àX¦’l‰ˆZujgd…sŽ¥Ë„yø}ÇnY ìÃK¥=^݇ՋÌúOõÓÍ4�ŽûÞÒ²\ƒ &¦Ìç<¦Í’ÙV^-îd¯ÜGÅüú)aŽŒ�TvØÎ×$€É~Ú§2.ŸØdp7פ³l¥ó_•¡•WvU@qþ»ÜPSz†w¼�k�Ò#¯¸G¼®Ëc<%HQ•~­²�ïÀÚÛWúÖF<\Ú�8sL¦ï_–°I–!ÀîÓ�‘wÒèæyJ„7þ3 ƒA×o=7nâÍÛ5h¥3«*½ºß×ð' ^¶wWíEšî6 ‰&Ík<]厅0¢Yf ÊœD\°•Ee‰QŽYF W‚s†€Ð˜š±o]Î`ï.×.kÿ%÷»¯™º]ìÓpl6(87®tÈÐ/Žó÷s‚9|IùŒhCØÐn·fæ‹cD´2‚v°?ƒ…͵²Cë׆0{U�+´õú/�9ƒU?Gª\÷jRzËm²>+‹Û¶ŸJúõæÅ™ëñDÏ„‹  y@Çõ.~·R2Õ>G ¶r�¢»ây ø½ò 4­oI•Æ&0¿A-ÅØÄÎ]ð�³Æ ]É 8Éu˜¬"Ñ|KcëóóþætÜѹ?]sÅ—kŒ*ÜàSfDÒ©µg )rá ÑDxŽèS–æAæȆŸªF5�S˜C©øÃ¬ŸO=¿Óà¢õJèl§‰`Ð[¦?£›¹û@áäéÙúìI–?¼¾\YÇ€Õ*Nº±jM` Å¬ ”jlÜ°Ô ¹åõqðçoL„ŒRÖ2y±p¢÷î^¡°9î;H Ûë„bû%Þÿ-¾ùA~Ã÷&èfá&†�±U rÌXíœ~Ì9Él±9 OÅ´Ê,­ô@d»Hè+�”é•ÏÀëüdžjnw÷S{?Š8Îf"³­6u´™^¶t¼�ý;»Ž¿&Ãb?;mÃ)ÓŽ.T ˆQ¾EôRgÜÊÔ9ºüµö‚Í'÷X*á1Ë%·¦�/É�>OÑ«]¡Ó¤Ø�WtdÏÈ�™³_Ø^ðõxWÀê¨9tÍÐ*63x.*Œn±Ø×åŸT,ï³k<•Ͼn�nÍËÌÆà±�ޏ¥¢òÚIЄŽZ­“ ²ÚêóÓaÃiOƒÊ¾òÒÞÎ�†x“õÞÊÚ •ÓâÙÍ¥1Ȱ�¤H!‰!ç]_Z°ù€¹0=Í®E�`ÌÌe˜¶žð·©x˜2ÕcQ²öÁ¬¤©ÄíÚJ8ôö÷ÁÂÁš!óɘÈ 0Û«‰+ðãäû)Žƒ‡Fç¡óý¹ùí'fÀ ‚˽¿3aòµ™¶Arq®Ä=à™´Wqc¥²@ärƒ«KXÅVy²°ìw{ºˆˆ> øEJ Ï–ç6ÂÝ7Il…¨¢ÓíºIeËl�·—`G³þÀ”† y�`“¸y•*½ùı�Ó‰goHeQ>°éÎPU%ßY`“Ñ@y·âë»¶by®Y3�®2' ':‰ÕjbÿQže9뼟u2 º:í¢ïû|¡žÐÈ_¸ãÚ¶b•!Iï¹Å>ãBú5Ð>xGéR¸XfeP!�æÝëm´J=7±úñ‘Q&.ëSå¸ZW¡ÍÚ %ÒßK0ZdnÌã¬yA|†º÷Îd±|&8?¼s°žq³@ƒ.àòDkóOÜ8"­yMs1 q†Bð lÑHc'8j‘æ‚êÚúF­géC§ÃR†_5^ 0ñ°¾p·o¯Îƒ3mB” Y»£ó…öó1»1‡ÃÝk_>1i䮣7¸ €Ž‹>)¨\=­eQgœ õ³c>v¬Y¢"ïE®ÑI¯ŠRçÛÏ󯱝�=ˆÓZ"Õ®Æ3Œ‚°eéy?ß‚KŽ-¸ù½326q»°+rêâ …P�ôã1!>6%Ð_V< [¢¸FE&Úß#K±süB�`Ôªj5ó³ætDYV%°móZP5è¢þ=ÝÆòñ�Ä\6lr�0]%çD/d�²� GfEà™ñYÅjуæ¤4R²ÙЙc$³w–¤Æ‚n™rÔñ˜QIÎ šÿgR·Ñ˜,Õ±.kB\©ƒ …d”í]ñ~ó�åÍ÷ 7�¦jȲèœ6¤²ÛÛRg- ßKH_ºïlWù™Sï’—À(÷l:üæ¼-\>›ý§m_]Ùü[ö¡IÌÆÓµˆØÝ濾'°]‚ç'RgÍYV»²?\2ªoÙÖ‹òd~Ã'¾Lwçjíp­wãšsêlžzó–.­[®g$‹¨®óÐW¸¸ ü†”³úŽCÍ£czgçs¸[g7DÜ¢/Ìï[iýv\�ýör‘£…ç5J‡¥0´÷öÈò"DÚD@–ù¸Å…ß�q¹__¯Ç7Ç)Ûyiî{ò(a@©aCŽÚ·ì�›Ã3·ÒI�“ב÷‘ºQ̃0ᬀa;Cïž/øAæ”$ØpU¡¬ýÑc¦ëa¶Â;.±Ò…FÉcÒÍñEñËkõðèI\îZ�8·îjIHÉqKÎÏKMPæÌÚ`åèÃ(›bÊå ,Ö炇)]0YRpNí‘PÛ)nîĬü˜¹è^ÌÃøß+у½ôY¸œà;Ù6²ùÒü�«¾¦BÄ%�¸h1óÒ ý·Ubk!Û!fï®üÙî+å|øÇŸë©6Òñ+0¬ŒÚLߨƒ­Ô°AäC»Þfgª[¿ío¯~sy�ƽЗÇylòúm547'šÿë¶úƒçî´ÌSf]£¡ˆX.åU½C Õ³¸Ó2ÞÚ •ÉÚ³õ|Îk ’ò[õ°“ó3¿29 ~ñ ¯ÜNöÞÁnò³,D�š÷õîÅÌým¢ÐUŒ–o¾ºu«ÇEئ4Cš/²Þ¹x¼Á°å‚®ZZ?;«z<{u¾K}ŒG¥¶xqL=ð7–/="¯"9 B_†÷5ól°Òµ–—Ô[?ÁšX³¾¤Â¬A_ì·±…°g@ü§BØ jà6Þ�ž²2×3—5™kæ~|�ìrD÷`�´à9/½5ºb É¢#ø*æƒTJÖ�¢…´:x Îùšyk%šbv¨ÞáêÛ@š‰Œ°Zx%B¼s'f·¦í¤!Š;;µwsîúÙ¤âŠn¶ÁP3>Dþ‹×ïë¤ÃÇe©Ý2Ïç<ã>ÆÆÇéM�Fcª8£UyH�W-q¾F»s™_ èŸ5ö¯á÷£Ãç,ºÀC ¬�ø¤n«[8O ­Ä‚ä¢ýÀáuûÞ´ã\Ä=^ò¨Ø7³�r5‰XÂTVsd¾¹n��€¢É9Ži1ÎvMJƒSwÔÆ6-H}‚Ø!Ü1XxLìWe.-ŠŽíÊ$ÁÊiê¹â]YI¹Œ1Ýs�õð£�M?‰›°Ý¡`µÂ.Y`ttÏ×òÔRç‡@ïcÖÃnw_¸ ½:—ž÷`úœ3ŽpÌà5ÙKX倈�FäìöØžW4ëÁÕÉû®¶WßdöÚh«§FVú£@Wé/›�†Ák]E$¯[{K �ë?ŸŽ#UÊ{u@Å�2†Ï¨Û”ø ð{``ÎYåÂv9œTq¸`åZËpÍ$ɰºœ3Íehʵñ]Ó¼÷5ö s�æK¨-£Ìå­·5f’Xþkë,�ê~jÀF·„àÏÌ!›®®�b ¡¹1�@á�ë”òâØ·Ç° ÙrüO^<Ê›l7Ã+…­;/Ù Ðôïw’o6Þ˜®:ÅÙ™”.!o¹”`.5ˆÁù®uªq™(øÊÏ^–Æ^¿[püôÚ~»—äº{^ °åp!h{rÁ„ceºH{0RZQ^޼cøžtSpê1ïS+¿…ä£Uð¿Âv瘜l!èÂ$d~‘RÀG½ì–W~È…Òù&f—jö^)¿5ƒÈZstkš¿|ˆ¹%vîYañ'GÞÆ_ŠÏ­îÌ"PBV5H#Ÿ¬4u«mI’דüòãVÑuùÅ2a›C'°ês×ÚªZ¥ëÅœO¾|ª½º]»äô-„„IQiJ…C  Ù.øJû � Hx� ‚7ÂïÖ`Œò·ï­QËkåÓ®•>aÿŽ?�'síÇ}¥)AAø PH ¥6c‰!¨‹Òö™ÕÉ{Qv»Ebš¦TuWkÀ`n¹ ?Óˆt©¦Þ�ª/ÏOz·oi"ÅßìÊ0nd .¸ùîEœ½¤Z³Ú^E�ÇK®î›Jóú×¹µH¬Eû$Ô{ÄÛ]Ë ¦»Ì& V;vÓÆXÙ¾p |v¯£¶$¾¨n_v[1˜¸N‹î/£Ñù0ÈÐîÆ´lg‚q�°zlš],åøj­°>=;<»#ÀÁ£çÓɆ†›|–�²ùÇÞ2I=ú[Ix¬Â³7âæ„!!»T­DcÌà_J¤Jáúé¡„ b½ìê�f©¸BÞr"„2LÉí-BЈ=áZ7 Ž3ãŸ!ñ¤7®¦Gd9>má�Δú=çÃxÙõ ž¯”ÔiÛÃ,>µEÆš0®ÅcYf¦cÓ#ÆÛs‘9%f£|O‹ü÷æ8ü=ÖÕ“ÉdÒDTgö§M>l^]Eê�èú1°U2Ú`õÁè‚%Ê‘õº*ì²±\æùa7ÓKæÄ•1—¹´[U•šy�‹R¡tÒò÷HËa-ìw¬E:Ìÿä~#C"¤Æ”ù+–ÎÌd—mC‚QÓûƒeÇ.áRqlÁßo»UÄ÷ñ@Rñ ßn:ÊñÛZ9NbªfÛ›l³�žÖ÷U;c¹Ü¼Ä.VE ˆQFÛfN@ï)`Ñ”N˜/g”4”V†eTD”h¤¿­*‡™VÄ8þ0˜¡fŠS�hä‚„m¥Ë††ª� R”¥i@ vçR~[aˆ{w{­ ò:+b3»ì�3:-$'â4FäàôHxº2ÌØ`™ Ü aˆlF‰å?„ñ³…– cE%†Ä<ì Ø(d²¨P+}uê—é”ô¢ä 4ÖÌxVåB¨Z)|@¯“Xع»â¡ÌqEÖª}E�µ(0-Õk'­¼,üvô l )²Ôz´5u7v×Ñ‹‡=‚KÏ9] &íš—çô{UW�;È”A{z­m[êHÈj{¬RPÊØdEsôZD_�ÿmÅñÝ€¸ �Q¡°Àæy^X|àY/–UA­Ç£Îý�ëg–?�ôÀc¿×Jâ{a ¹�¿ &’Û<ˆtð ªnûÀºYC°•+qhåËm\¸ÕÁ«è¦å—C’ãêF“»[¿õzŸ»/Ný–ÜeÄ|a»–hLÁ÷ZZ*~¯ª€¦h=ÚÈÜqkÚÑ!‡bÔf<%¹<ˆG‰èbòËA€#.¿Ê¢»Þ˜-ªu/|0]W>®Ûq^-â¹[™«=~—/·¼EQ€Xëçû*+&^q a1:?‰js½ ’»[)—Ê|´‰;ê|¾29høˆ1O…¢†ÐÑ­6BÞ¿¬ 6 ÛÈ0¯©0Š ë¸Y$95b}šÙ\ð–‚Ûæ,Ô<¹ºt1�ì¾…zànQ¨|u#æVÎæ!VÖàûÏ�ýõf“çžc,¨]ÄÛ©�3{4="ÁaY ®c]kJÌ+•ôlèk:�ßøAŽ–¾ÍÑCà°kZ0o\ õé#sîC×Ê^«‹·âoM© þá9�ƒaÐÿÊSŒó%Ü�_WïÚŠz91–†„½5—ÓܯŒ…—¹¸°ûÔxê÷ƒ­l¸¨ã¦[�t+32·»K ÑZE)E¼ûl¶œ¯kOå€ {pÄÿ Ó6´#ý¶BEÄ $šÿZª¯ö9ëcwšc®Y)ïÍ�±.Çst 0Mjé*¶Sƒrµ´@Kü�ª*þWúrxY =ßyÎ 6$uû3¥Ûäï=§�nw÷xèvž,®sŽâí£bÇRÅy±·o$(Ù=océ÷ªlhؾ”½[ºäxsý–}(åÌui äÅõ$»Œ„íÖÕR~å'ÍÝó°Kó~¸|‰³ý¸¶+0ø �áj5Ìoà¶� l^Ȫ¥Ä<5ìÐkèlPýå®_¡ê|î€ê?å“:�°4õ5™¿›x@Úñ¯ëáÞFŒ’èÖ)œlUmÅî²È@stýŒñé÷'eå[g,Ë›#^܉šd½™c‚l:%€Ž'(f£œý�È&N°„›»Ó Ás@‰G³FЇ ný±À›†ƒ†ÉùnN³w ¯’¸¶”pcçŽEûÛEï�ƒl¾-�Wkœlýš߆(§E–=–dêÕËPrÓªuüNÔ“ŸK *aÖÒK~»CXA´™€À]°ò/8ÃÉÓHbe™ÃíÜÏ¡–žÞÁu†o‡+  o½ä¾ù¾Ã_hN\ æ~s@ ÑÔúB ÎÙI5Ó}À÷eo +Ëã[zðß÷¾›Vy›ágݺɹ }VGnÄäoá¨Y/,{„6Ð]ã“qt è£<¶_¬u¼É¢5Ò_p¡óÍg�0˜»A°5�°;H›vçËuáܚäskm­Åáåílç„ Ác:$’üUÄ„ï#ê �In½$½èÒÙÞy·ksv¸a÷ 3fõý`ãVN=mVómÙþ®@§~Ÿ`©ñŒ”ÀøÆß¨YOäDe ´÷!š=B P$¥ýG¼kyW{2 :zá*ç àÈã`t21ECU+Eƒ­Ôg¯¶]‚Œ†f‚õVÒ”Ød Ã/qfúùÂßIs ÁÁçmáÕ9Àud|Ù‰JÔ—RÍ[ôÖM…ü+ d!)*Ñœ†£´ÌvÒìßVåV…ÍÈ;°fX±ÍíQLç&6Â8èÉÀ÷çÆh1 )• #-Ác{;�• •€¿¬…»ºìuUt…RãÙ®™(ì&AÒ‰k¯Ýö‡k9] Þœs·îbz‰ùø­œ ÿC÷Äú6óâþ|Tå¹pÃ{w¡Ÿü÷æ»SóÏáY bÌhm‹z,ìÔ’é�ì;}ïX¾jZGíqÄrM?wüm”uÅŽo"šý½µóf¨âgçJíõÍ®íÇd4ˆy�È æj‚ŒüÇ].l¿Ãûì“ÉNûžzÝÁ{‡š ŠÆO¢ÀØ>ð)dõ½\&2Kz›«¯¼]Þ7ìxw_�¬¹Ç8¡BµUãž8Oa À\lÑÐÅÅ*^j1æ åJ©j×ÚÊßäJ¹h^]=ÃùŒv~)ðžCæ—IwÙ™iŽ5Ìqp�oË3Waª¥~ߨyŽªæáÔÞ-PˆšÂ< w]Sû¦}Ä–ë@? Èà+”/íQÀs –˜é‚×r?/tD!cÄá^Îæ �S�–Äþt CËš¾[zz>¹�%�!ê'¹{¾zRó*uÊd}¾qYù9" âõ¹ôäK;Àêº>{î¥R;ç…µ|7uZ"Ýc«cwÞÌ.%ÃŒq¾Ô”bLæ̾¾žÕˆ hµ‡ÕÀ3€ ²ØÄ]­T\“ó› ÍÓ›ZxÌwqÑžiT÷ŸÁîÞ¥K{8âèIæð‚/Àì†2;S„À§ã®g�¸»Ë蘇¼³,)#\k+iPïB‰�œ�Ú—ç¸k]¯�õÓ«›Eò2ÎKÀlg.ĹH|±·á¾s’j çW�ú,ï•Nƒœ~i»ô=‚˜È�óñPT>:Á—ö׿T�0tê”ÍEíY<Ùpf™B}é³lÂW)ìi°¾3Z&–…1Š” –ӆѨJ°)lv‰OƒHö¦ËÞãÒ ;ÜýÛ«·îJš_4ª7ͽ"ª«Ñ´Ñ'̵œ˜ …!½wãi ²€¡ô€XÙØJJð_6#Å¡Vó‚¶5\®¤ G(È�²%scBʼnÕðHšïßr1i²Ýƒo¸ÁÜð9 =´µ€~ï]†×ЛÀâ<Òý.¿'†ûœ?��ûÃ\ 1÷[3¬‘¸ŸÝui>õÀ±¯¦Ö•·÷ž¨=…Hfóç—îŒdD ž¸Üz�´‹Þµ*ÙjÏcÆ�+OÈ™%Óø©¯=¶sðîÆAû±»2“õ�“aukÃë ‘„ D*¿„„;·�zâž}‚òjg"Ϫ/j©¢ÆÉ+7y«ì>@kú‡µ a-ƒš6vwÖçy®EéÃ]+Ù]�è•}ÝzGå ·ÝÒ…WtÒG#:è~ýû÷ï±,¿u¶åk�˜}òãj­úq¯”§²…i¢()@ ¿°*ÂôÏ4ŽÇÞwC#õí_ÙÆôzÛäç Î\f›m`Ö¼üÅô~žÈ` :%¶ÜûÅn…�*`ü·å½@¹æÉýcždzì³n/Ø%k3øö9>"ÍÌÓéïÙ×b¼^_“îê¹d•çHðÅÞZ/á "ÊPÌ?=\Ÿ®æ]ç¶y«oâïOÌ@ÜT~NüŠ­ti:¹™©Yèa.Ål3¹trÓ”eÞ@·×:TŠ?V?t-_¯ŽÖÚJµ«X…DÇ¢ÿQO.Úݾ¸}Pt7í¨ üæóÚ¨Ï:uù¸þØù3s¨ñôüU³ØxÜÚ/#u]i"ë©# Œþ€Y†çs-Š�¡DÈbB^2 „ËÝ-—žËß¡�¥[}NÉbsûVîÌ8‘›´ô‚û·ËžoÅ(_/• Ž(’|Ð4½A zS;àW€ðž¯[…¸Ü6ªÑF ×ÅRÙ¯ù§<¾ìÕ1Ê“�Ê4yûGÀ÷=€|Ã…µ]ÒÞã’kç©lU–C 8»m]ŠÂB·ð˜n˜Ž kD4ä€`}?6‡:ÌQw¥„&šàèmÈÌÈN>�Ñp/�ꬥ۳,ešÂó˜šÃ7¬ð\�@U™ÚöMéç(y! p“ðù\÷e8K”±—Þ€-.lR$®‡Ä9¡ ›§�ÓiJ›ëu› fï�ËÕieÍH÷¼›‹|µ8Œ‰ùƒ·&‡I©K�§±Ïd¢ûFeÞ›#®sèV�$]Ö"Èj°ð�“…Rî—û ¹òAžŽx±Ê«x{xpÝ0–Ð ¶ûÜâ½fű¬êül?Ö  ‚zž� !_ñü+G”|û¥Å-%A«|!�@,3.õ¡äbÅGh,þ‡ ïR—Z©„ ±\&ÛÞí WT¢�S]R»·*qÕ-€ª¿Ödß ~û¶Ï3ÖˆAÏxÙ3NqrA^Xûyd]ÑFõ-†*qŒ—kxßHÌA‚-ÆÚÞÚNÞé:î…è|Ääìàפ9z ù!¤!ç² åÛíÍIÀÃ×Ä{FQÃ4›Ü"‘”£¹wÏ•˜_:Tå­~ >ù¨°ÜšDŸkVxÙç|‰‹ ‚‹Ø:{R(>­=Ó¢�¶õy¼föະÞÛlu_© œÐ˜ ð h®-i¼—Â9]àèézšë´�ˆÍžƒMÏg)“rZ²D„–ë‹·|ßG|&¢Ö•CÈ›Ü;{šçG}ÕM("†ùP�'Å�±N÷ê!Îyú× 5°žnf5pÁ¼Ø¶3hh9ìñå WYTox“(½¼˜f•¨N|8º¨²¸î´ÆÑØh�ÚÑŽ‘bµÒv'›{1ˆ“óÏVî¼´0úÄ`"ÖN~ÏqånØs›p33£,2U‘¾m®3¹±tÁ4.ý Ã0³ý­â]Ä! òXØK÷"O¨:dä§×—Þ´‰×¬uéz_&_m°<ꪌ·núÁ<Öøô‹Ãç;Ä×rwyÅ� Jù’…eý:ïm0׋é5!ËJòã{sehœ-EõÀ=[`ÐËÒñ˜H–ôLÃßБ8¨-S®Ü,@<ªPpŸ×³¸¯Oa]/¯O¡XJ¶²ï£ýDwãÆÛ¶zwwN£4Ý«µ��ƒæuõ™óÐ.G‘+Yýw ²xê� �÷ÃÖÄmr~/�–qqÍžÃ`g(Õ‚7<6·º\®ë³­nCèZ%_2N|  ~õ¼=Öp6;Lã‰YšŸ½`?™ƒ‹t(±Îªû x3?IÒÍôÝ"ݪÖZ\\©–ÝÚ·I»Z+âÔ¨söĦÖÚCsô NZˆË+wí¶Ü�år=`5xvE_Ê Û´Ë9h ?(+�+˜réá-kgRùW5À‡ä¹‘ Ù°ß–Gípqy°ðszŸDY¡ÆËÃ&¾Á*Æv�‰Ù꣫¼-Šªûð3¾0CRöÏm¼Ö›Øúg8P±Øä4ýÿœb«„oTäÏü± ¨ÿ'Ìa™8'­±ÂèÅ"àœ¸¥ïþZÔe­¼Øž»iÈ|°Â”<;À/€ #°àÔ$ÕVü;(CibILIðúЏ.ðs̱[?Û¯6o­‰¦¾Á"P‡"| "âÛ‹œ;/ùÿ,˰‘ŽŒ–îü˜Në £¨¦0�QçÁ0L^ˆë¥èòó|)äÝ4Z¾ø¼>+è ~—ÆNº2ô&?ΩÚC’œF= ëzÀ�®`ëí_êkí‡` 7äñ¦£ly–ÊôVªz$´pŸ9¡ô°7ÍÄn¿Áv¾‹"Âö!×|‚‘Îtø�mصÎ"Ø<ɱµýæšëÏå×rFƒÐn–÷ –”¥\^®ŽŠ _Ÿp![²\PlçhXrSeÇPrü7 ¥œç—i Àð·°.øÇÍJè¾,–ó½R4sì8�\.öôQ+€ÛPbF— å‹eB-»ÚK¼ªâúcV &Ñ»[>TÞwÇàOé¾xÖ;mÀ¨0Ñ€>Él3ÛoœoiÞ”3jXÆuÌå®<º­˜e‰ÇÜRÁ샙I�7¶k¾ÆTlÎXýBÔ<än—Šñ@ÊbĶ8Ë݇3£B RdP£$ð�ö×�Ló :wgÆ5$¹ì óÔHéJs&qNnkdÇf7kè5:½í¡½‰Àȉõ4ØŠ©í²�JFä ›únC+X#+™ÜL}”±³V„~ÐiIj±[û I&ðwÐáyTˆ&a�îÏl �ÇvŒŒÝeÄáKeäÝÂ*8³ie¨t½ÈÀ�<…þÓ+Ó¥×ÜØ_f²Jl1´-�¸<5�d��çÃbœÅ5î@W?U³�úù³+p¸§³üóŸ¹pab㡤d agå/¨JGýtJ\IÖ[‡k 3_Þ×L3~NÚÿÃI“�×?¿ZWvж<ʹiX&OÇZµ‹?¢òБÇ_ "z±°|h`M1 k‘ï‡b;ˆÝÐcŸÚ´ÐgŒ×ämu�¯ ¸:sæÂmÊ‹€ÑlnnQk`X.ÎÃæZL°÷”,ÛˆŠÚÃ󳩈7ä=ö92“:¯hëI�ÚMéƒM¢½s ©Ó ]WC·¹~ppÌßz;Þ—–ž)d8«mrÅÛè6ºÚ•@ö*DŒßê;7î(p@¾ìæ�ôùJ"1=êq,]9J%:I××Þu<ë5ìBèë6e çÑŠ•!xÎŽÒqžz}…è\³‚›�EòE ªï=Ò[dH�úŠß‰^õ}q£·r—>«Ž¦�!‡±±ÆÜNH )œe�ùy>•(”[„·>O™Ñò!-wE�åûÑîÎ;´¯ÙÜN"ö˺xx<ˆ™m#O�;ul¥d{“ª–hÏí°k]Wí®î¥à‚ØëVÄ�élFz šˆ=¼çºHЙý4ó|rñÅÙ€ý³ê0 sƒâ/Ð,¨z.XÛLƒýpÁ Ä{I.–$Á^(Þ£à`óg“d•âÌ�R·6¶º­¯QÜÛÇ%ÐGK 3 l Æ\¶ËåPuÙè]ö Âü—ˆ Ç”³C¶ýwgËÙ[ EéqÚyîJÞ¢;ƒNOy·¹Ëd„VÍ"ÒíjˆÛ QËdÅÒŽ½7º[§¾Àæê½+ãLÚ—‘A�`t)•ë]ÙA. H�9M2]Ã(#U¶àÙ\ÙÏ.ïa@æ$Ç–¶g°sQcèà½u‘?WÕWm�}P-H'Ó[⨚äÑƉà-xNÔ}ó£qéuÛlƒæ!PÐ|lØ{«~0û¤JX"E^¶c«Þ;¢û ô{#î´Ïðp®­…ñ-Ó-2c��n7tRÎÚ7h:�ñE1Jh]D7éœíXVõ›ýHiÃÛgÚ^h•'îü«ÁQ&¦¡.&q6¹Ð”–N Q?fwè»cc§½ä,.Nä?-]±¯¨3*Žá+LÀ´[xTL“Ÿ‘#q‘¡½pÀ�*÷0@=¸dö0:wÒ†fᆅí5ïW¾ÄJ{ŒDW |¯^kŠ$�Ö®;«ò°êÕøN?y,‡$G )·;~“ÆEÅËæÍéÒ8À�«-óŸÛä©~ÆE7tã»,ÌëŸt¬Œq¼¼¤ ÃcO”0GÙ]6†°-RŠU)Vøç±“’ ýÂ;´��uxn‚šÐÍ´|®Ï›Óg³îW£½†ÃÄA†»�wÆÃz8çtðÕ‹�¿1#�FÇn››E–h’¥:¢VU‚§Aàè �%u™ +ÆóYæTm`êG™FoÉÒëŽ< HF³òýA�¥ßº¼&ßÁ�†“ƒãÈP¤Q'¤râx{I(�f:E~¶öÖk6hÈàhŒb%Umâ%Ý$ V®î¤[#ƶøVl“î¬ý,‘ÜT¦S§S³ÛçÅׂlE§Z7í¼8¸EÆ{ï£ZoT JÉÍ<…—@ã©×%#ÊQeþé§�­Lu˜¯"±¼ëe­ÖdeB²�dõz•�:»àñë®wÚÔƒd¡ËKÔkæ ï·kÏKW)xe¸üdåíwWM´ÜZP-Ê‹ýzIƒXa`™â¦ñsØõeÀ+Ã� ‘¨Ä´^¼ÓÞΞÝèž¾¥;óÐ+ì=dÃÚCÁVÕÅl‚ïžÁ‰`MQ·2f�Ž­�ö¶Äû!„¨¦õQIÔq )Ï={H,UXü~ÚÏs¶Ì°Zúßi¢ÂWBjÛìÄǼY‘zJûIúèD$æàÖ´LB6 To¸J˜¢8‚?DÃE{Å­t8`°}d°ˆ£ªa)µeÅX«êàIÖ*[½¹Ó”Ùïô9�kÁ.,hKoe1Ëf�†±×e–Æò �ê3דKI,¬É¼Ù‘¦ähüKç V\ºÜú6£ÁÃ=ÉÁp½àe“ºÎµ½oR¦2VŸ¦l�oR˪@T( meØ/­$wxÀˆuPSA­íf½�CyQ�'¯g„O=£‚ˆ iñ&›¤65ŽM³™!Ys{¾²[ÚìC;vk\h´FÑf[>#ångl¼ÆRmdµ°G‰¯8£žôcÑ�äüÉÙè‹m8ÀÌÙû“�“öýÊ£g|öðoöòcÕ³ö®QÍ‘o¦¼Ëò­pÈÙLÇZ³rh;¯mŸ¤gÏ>÷Þ~Ž�_iž`žµyÔû¦c ùºÑ >Ï¡7~bê¶îàÓ�Žj]J¡»Sjj¶üAËedg¾>þlÝ®'—6kR„`÷Â>Bx‰š1ÄàÈõ}ò…–‹ÍÑÉ‹š—½wî4ázîªÔ3à×±&’\A5Nd‡ýØ7o°à€\ø‘‡ë¢pPl�b•°Dôz¥è⹡ g(¯¢o>p(,9[ÝekŽŽ7OõZ˜×IoŽÐ7~ÇÇ1u•ùh_"!û¬y\îî¡ù!çÕ¾*Èfìî|„¬C“ç¯uK5‹6YCU‹(d(uvÙÃ@ Ï2%3|™ j��6¾x-ÏL¾ˆ+÷M2石ôéÑ^çáÝ`z—5¿›ÁóCÁw�^ñ�âÑUî·Ó .Dª6T;Õ²o\CÒFL¤%dÑü@'k†/Eóe”ÝžÒgˆ,ËêIÄ9³‡E «ÉÇUó5óèM¯¡3~& ý�uêx64Æ f{hŽÝÿW;AsË�͆�8¦AÅ�pÙºa\ésªeôçz ß–A¤Ì¯±Õ®=ájåHyb³ŒësŠäª8q•z…•ÞÜüœDÐZg­åqº ÈùÚ=å¶$c¶cœõ³‚&Öh u~ãÎÆÖ¹p¾SkRµm©ÑPq×<†Åùé†(¿�Êã˜sŸ =ïXãVrÒë9Â¥¥Ú å„qfÙÀM[6ÉlîÑ,%~]G›ÚÞ8ÿ¯Þ:!çy¤Õ�Àûħ"¶Œõ³Åt�–+ó¢ê]QŒ3——~3шnwå°¥_6E{:ÓLEq¥ÎÙ“€§’ÍòƒÒhó@asTOi›&³[.{¶ŠƒR¥ó†S8AÕr†òáfUÔª„B6G†:âLpryÞ2,MM˜ââÌÍÑ¿åÜ{bí�³šmSJàdYè.U¶‰{˜Ágsú¸Gé%kÍ�I‹�ôçµ îzáE•Ü@Mlö(λ �Ûˆ•Œ×oI«i—l‚Zíg˜íû�híä‡u2Ùˆ¶D5ĺ¨ ¤)-±g7 áÇ*rÕjé#¬™>!¬D-aÐ+¶y ¸³›©é)Ÿˆ²?T)h¿¤4k„ã-“G?r†ÁÚÍbø«’\»EC~�M5¤¡øÆ(ÏhŠGÕ>í§xL”öC{m9ñ¸rö©èØ,™Cˆ˜8rv‘N7Í4˜Z8,­â Û‚¼²áÃ.N³sS¨^9k gØÆ£ÇtyW`…Ý´4˜· áÄ„÷\Så6DÛìÕëw"´¼»ñý›>3¶ó%s£P†:ÊJ?òÚšåzßìÀÖ%$ºÁ�@Ðjü”‚‹i,•\1ÞÌdòzè0÷¢µˆÌ°Ö<k Ðpm†ÂÚ©©†ÒŠØ X‘Ïn(ôÖ–¶I± -ŠFÃbÓ»iBÁüμgÝܨ‚2üŒ¾MÀħ¯,3!F˜<�YpL:ýà=À·³žK^SO£JÜ)EކV¹ �ý'á[U*«e¯jûjú»U™{e¼Õ³–nóu»ÙHKƒN;t+¹¿tiÇN5Ù;d‚¸wH¼'â£E¿Šž½Ö]ƒ²÷ò36‰˜4—ÕÉ%³MzWf¸y� ð]À_ë˜çV0@-ßÍA¨fààÄstÚ\£¦ÕQ„ ³Úí9}‰/ås6´[�v¼3¥òÒØ�”·Ÿ²%ŠÔK\U”Å_?gæ¡Ï=Ý2U�ñ½Ž 8‚F ;2 0cšúïvjLSà8§&É%»çiSƒrp˜Öðå§ØãŸwXãøu~n!}Ü¿eÛiÏmp¿}–Ö7yÞõކ6ä´Vù¥¢�c‘·CÎåä4+jå’ªwÎ4xõ<&ÉY=Î:¶ nOÒ¨\5öxû5e)m,•ä>ª¬aÄÇ4÷ÎS7ªÌÀþKÕª‘qF:%)Âîäú“³éÖÏscƒÓæ--ä¼ë”¿!bœ`ç¢fØX°×é%’Éç5Ä„˜ãi&9èUBÜ2ÊÝO`Ü•¶2Ζç¿qm|�Ãú æY1`2Ô™A$‚i¬Œ[³Z¹¾s =HšaEÁî^öÆ tdg–ލŽûÓ®¬j+³O�.Žã±±ï€�!kI3SU`¹Î$•MÒzî¼bmn0+T¹$ä ÓítߨþÛ`LÖË@g³€uØß`¯:cטlwÊ.‡=z�©0Ì)}^«Íó""¸à…óê£ÊßyàYámp–±zþÇg}ê„ÚIÍ®¨ïhKr¼ùŽÏ<øý�„ð�3µ ù5õ?µy�¹×2Ý»¹Êå’úŸ]”€„'yÆ7Et;½µ&O‹Xæp`îì™J¿Öo6ç|@zÌÎíp¶~§RP»Áà8MÛ'̯2ñ}U ˜fÜÒu¤ÂâCÍé'AÙb=h>ávBÆ0!;'~ÀßJ%ãºÅâÚ#]°{¸}¹k±† ÀÄœõÉ7† —™+©I¤Ã˜kõ­�­tj6§im%úÄ2‰’ïîL$alü¹ûP4¿3ˆr vøêöX„ …¸ž¹¾–ñ�¢í²ÁÖˆ¦zž®YîÆiÒ¥¥<‘¯9ÈÉZÁÉÏíý÷EV•ªdpö›¯Uª Ð(kÏÏMù]ÁaC¾û`v›¸Ù.ለӠ1EŒ-·§¹_#<Ð{W¬oË3ÙP@º l%úÁ… gêüô�Û²½–6 ß®‰ð�°íl¯0ë”�ÖÅÇ£Íu'ó81w„R…;N—:6»±¥@›Ú!" Á¡´÷PÊ�Fó./ƒ­—qøøô)è upÐ[ð®Ù–tú�峂•ÇÞ®±e¤mU¾dŸ8ÐÞ’ÙÍó‰|i…é]]RZ3ò´ê–F-Û™ÀXcVw¯…ŒˆH(’° ÃbD›�5¸qÚj \Òê$š³ ð vx½¨ÂÉÊÐJ$àíuÀ4Ç·ÀxŠÓíÓ�AL Þyn«ÆE7Ò[Ç”ö“ FåÔÅ–¾¶ªÕÉO3î°d.§˜ÁvûÈó ¦üü¹©ìW´ÇrE!Kۨ؂��G4Æ®…±Ö|™†ÇP!øÀÿ zfLG§Ód5�œ°·b0���=Æ`B¬&Zö�Ø¡*¦•“{ýñØt^ǨØðêÐKÃF¼\úAåÆÝ`!ÖêÜ’C«°niмpÈ…“FÆØBÍEVÖ3Ù~“u‚ÂÚ ôqˆ�¾çºS›cÁId£‘1Å7aß9 —fÐÒ%¢ Œhà ª×…öèá{”Ý�glÌÈ{BóùÇáã/ÚƒttÔ6R`½^´îYõ;¾5Û"4Eüo~�-ç­‚›Åû³˜zŒLA³µ‡° Óœž¼¹k…ß;} s ‹ ¨BN;‹!�YéH/°\&œk_d…Í¡¼ëFŒv8 Úå¢è#%�c…ì¸>­eh¶4õØ7’øða;^[ÅcF „ 5Öx ¥XXöãW¡AáÉ…ï�†÷�}šÌ#£l€Œöòk„ÙØÊÊÕ}[æ°6ïõªñv?²8uô�ÜFö9ÝØŒ~pNñOö»Âä‹àvù½¸´óú3P—õzî{kõM8+ž@LG™�-­«÷Cn¼jÝvÎ^x~ÖÇz¼æÔÔ'Ç^ÅOœ¹HýX ã3õ"r‰ŽhÀ…‰÷E�Ë:ê½$›Ü]�–M�n¯;öÙ<8ÿ>;Éá2•'®wN«+ri*«ÉXzŒ!&hR"UúWqÁQ�·�Ÿkòؾ¢'ü¡ÌsøZæñný®š¸4Ñ� mÍ$ãÉ�Sù¼Æ¢ˆÜÙ®µ'æ¸÷Á€dœ*�Ⱦ}¾¬5äÕ8�7Yy ³½¤HìöÍ/¬¿ACNëlÑHÌ>T$KA9ÊÙ*Z&÷nºàE_ÓÒ“n ~v‚é‡|qØ3¦Nˆ®ƒ¶*0�AþØËœ~Mº¥ ygl§/Lâx�í™…‡êòîð3-¨�aSQ¾êóæº2ŸD¼�^wεwš¾›hk›Ü’³Ó·ç7S\¿”ß„ÍøÑèà�¬þÊ5›4•Ç×zÍøE‹U~#³Ó�—6ŠiìªíwƒÝ±·�-²–E˜tB]ÍM¦‚n>áaFü}µ®L,dÜ¢ô€k~àiŒ,¹�ÞE—±Tx‰”³Œ ;ÁY··­×s�f6Þ—N 82Q+S!ü.u0Ù6›Õ…£] >Wá½ „ôv4ñ•cÍ[ûä¾/«WÇõPCb$({Åüñ’±xÅ”¿'ŠÎôos®^4Æâƒú[®ÌÛùé~´¿¯íõÁóö!’�yËñþ*EUŸëèx^ŽLö¾KñâRùW†Ë:&5u?ÄvÃ>è³ò„ØÈì› ádß³¸uKN®¦@PhŶ{©M#; ÔÏ!�UWZˆÒü7…qÒO'L˜’^«}àºzkxÀ¶<|¶øm âb!Y,ÈyK 4= °Y :–äù%@�®g?Ìæ1ð¤~NÈ—`’c‘�¸é÷ç½±ŒOišð3wÜ|S”YL~àX×|ž¥í›ÌÏá nòFmÞNZ‚�ë¨ôUe„�ûv$0ßÍ™§\ ñÝñxY¦Ä¸ç²÷ƒSFó€¾GÞa6S€‘ÊÆgt ÌjØÎâoënS[ëiôUukÙ…|…¡ãux| åe¸-lÞn¿H%÷õ[|¾•¼N½0±Œõ㟼F/ÛeűM÷qoαìj®sb¾ÏËŽßuë¿ÁnúXd×g}îâôÊ‹"v{ð#{Þ“hÒ¹9ÂÞ3“ øhµ,D蟞½‰uËÛwÍêø0·ê(évˆc“dGÅqYHÅñ%}öâwy>Ž·š‹µ*B÷Ëg|¦7(“\¬[J�M• 0N={ÕŒ«…ؘÝP:Î T^Ô™9ýÀÞÕ�*ûÝñw0JÅ–ù”>ƒä~+k`ÈHô×(_@väàÝFêÚ%9¸žÄ{®i¶Î™'œW57HM&²ý‰•ͪ¬ û˜lËÀA“?t =;J+šÚ½Y {Åž·jȆŒ%yTLXò½Ý:¶{ ïtk5¹@’Qqòزb¶è'Û‘ -¥0U›Ñ8�èÚ›÷¹aó¼'ÚW+Ë Ì[(à㥮£¥!9tG¦ù£LdÐÈÐ/‚lP2=É_K…n®ÇYp€�& ®­gÛ ÂŒleårEÌ•ê.‰e )‹w¾Ñõ³1ñ€vòíàge!ÄäG@õo^ø±’Âuk1é©‹¾®`ìõñ ª”f”��fJ©Ç±î=ÕÃ�ºÞˆØHÃàÊ„Âì7’3Á åAÙ;’‚Xƒ=âÆjÅUÜ~,_]I]ˆwƒ˜Ïs–Ï$ŽÊX`™Ÿ9ËÀµ/ÎoÈC8÷W”¨wvOÄ·/ eäC¢ù«´’J"Õ�ìiÚÂ?„»6?EŸ9…‘˜Ñþ•¥fÖÖSç¥Èuò 꺷%Ê6KtTWn«Ös´Ä1ÓËþ=eŸ¤õ¨Në'ú&ƒ1ƒÉ¦‹ÙG}€Užm�ÎT߇W+UžÖ -ËÙ£ÁàO~å¡©HÇ”áže„X¯Fµ†ÜG©µqƒ+«¸1Û‡•66Ñõ €…£ô\ÆÀAÏÃNWÅó}]�ó�@VÁb`VhÞíö*K¼WÂÆ>ʈ)jôýàϸÑ" ü�ç¥>¤*ÞݵµZ}žå.®w‚­ŸìPøNŸ/‹{¥ŠÃô\è5¥”ç T£�[Y3R ª s¹* ®kBA<û¯ulœÖ9¥âÛa6o¹žn ;â]¦�ðh¦œÔê(q ìð�uGÛ¹òeõÕ²�ÄpTÄZŒì!°–�ñ7B¿ç<â¤1/–MTKëW[µ2~|FR„@ï¨ÛV>7pú®(l¶má�\Y¬-šAØÍ;_aîL<Ø4ûÐÄÍà ªÙØà'6|A&Tmõkiá�…tQ‚'£fަßçâ Œ Q@G&\úPb°,�V+ …|–¾D"±{%ó7w�„�âPõxÝ¥�FäVŠÁÛtà‰z××]+ДrL3fÕ`ª�×åfóïšÌI¹sé©«Ù†}CƒœzÀ‹úʾ0ì©6%µÙ]ˆ>E�Šrrw¬•‘@³”*íMï6³7`xö­.:^.ËjqÞQ˜Yfï3Â'Ã^Í;'É™Nsµ!¿×Xëwas/´¹’âòw,RX¬aÙhÖý›î6˜�ž'pÙ¾’;E(M‚Z<é;'Å€´ ûÆç¶¥éŒjwNá€Þ µöÕy‹cå µ “átk×ÂkÞö‹5n2h�x¨BWÎ#›åw‘Ÿ7�¥vÞˆGƵÈZ�öù 5` Jê›Î³Èæ1“·ƒéäÂKQ.y«.ŸVÌ@¼MZK±º ]‹5ˆŠ»?lb ; e·¦ÒަLhSA‡ƒ¤�Iôp;Ú›?/™)GçÚ±¸A½´a~ʬmõòyw{('ÈX™W0õQp²¢¼V¶üߟ\6@R]*4aQ==fD 7~B†>�mÚAûØÃX4þ7ï» .l „Šb¶k”‘ê¬çlÀδ¢ïªP¬}ÖC™á!<¬SO!ßSz«Z¬½Ì02psÙîa‰, n~;‰%f­û"lXß›s3¿lÃJAÎÁBò7›µˆò»+7^MB=cÄ;9.ÕH÷<Œ#‚Ñ~å×uf-HØÃ²[}ùÏ<³��ă¿ßªE¼þ`Í•™›ß~æ;¢Žlž¶ž³%õɾ–.ëðû0àr1ŠÐd^m)}޾ù&˜` Ìynó¡EÀåº5`¹éý�è™Gt�– ýߤ½ÇÖ7Go‘0¡[ÝjÉ.qg)¿ü— «VÂà ۰"±òÊ +ô?†�þì ¡§À3w*D…¤­ÇWçú$Èð±žRÿ\ÿν }åŸ{ z¿ç©Kóí5’ryu¡Y˜¶ô$À#ðšÿ«nÜØÇ~αVÁ2� ÙÏyÑ ýQ(¨¤:"ЖDòõczŸñ´)·¼seÄ›gšüe²5iXx”VÒíUžåe?źâ; ž°#¬ó ÉïU¬Qã1#žS B“—]‘L®€—ÚØËš– Þ3‡+•î"gÞÊKÅ8ô áV Ém®G—“¡—Áx™G,¨˰?÷Ë*%Ô­D“ A,Ù@‚9Öv±Z¯Îìý‡™²9<ÈRœ#ùÑ÷öØ”®}CvFZË2bFºPÈv ¥<"ýñxgµÖez@³"t=Ê�&sc¨&œá\AÉC 9°ü„Þ­.Òäãn¯µÌ‡ø!³Þ åœÛzœgŠuÚRÕ>± ö2öüŸ€?S ½³5úˆɶ5 àb2®E… ªÜ^â*µÑFÜrïÑÓ)JQah>äã@V ÎRþM ËY/ù}„ïHÏŽÛÐk.I岎|1ï×kçîCò�F7ã "ê¾F“H±„9?»H£[*<ýx扲·1'C…3+ÄÒL!jV‡äÈéÉ,ƒëßœáæ„©ãÞòÞ -DCŸUsâ*y!cà Ëp™›É´©f•—Š~ ¬é,”9v 5¡0t”álü>5Òœ{FÏ­àP.ÈiÉÅÃs´êu„­ý€Ô5¤#èlO·—‹VPKFåSXéÓÜŸ‹ÂµWóvà˜Ö§ÐÂxËà*á迳P†¾hý|D³Š–>5bžÉ|ûy3c¶ùÔï÷Ouñ!çVæv}×¾Û¯íÛÈK–˜=)'W»7É@ YMª¯€KF|Ç#10ÓÔ¸2Ü£û7ð½7ò)ÄÇúÌy§ J¼˜q°uŒ]Lް„¼áçÈ ø!ìÕžæ«÷щڦ/gż­«“s©€’\:àj-ÍØ—íýï¯}/3›O‡fX¥IRM¹ ¬»˜|ˆ§håÜ0ou™ –�e-|³m0uû†ƒìN,ÕƒÁƒ ðÀâ€JÂCž$â†×´­âæ={įld–7À_)0uTÉ»aXWsj`«j‚÷3Ù©Æ57rœJp!öÉ´ÞŠ†˜“XïØE¹yÊ™¤*²^›­v¾”–îo²ÝŠÊ™˜ ‹�5°ö@×ç8ÕØè¿‰ÿ¹Æç¸Ô‚õRÜö´ø9û�|§¸” ^S1mügù57àõmƒ€.í±ç#ïS¸%�«BØ?ÙžQÜ¢=ž±ø3˜3l† Å<á¥Ýñ@â>ʆ ;�KŒµh“Fõ áî£j™�•�`T”ˆÄ'°`ßIòȯ;€¨Šë=õíãf®¢§Å�Bd’™°¤",·iT¹ZµÛúßjÇ/ùKQ©¹Šˆû�ïYT�m¦°îìäěŸ¯ÙmCM‘ޱ§ ¹ô¡ïÌäW 8�„x@ÊÞÆ»ÀòÖ&ªÛ#>^Ü`S´f™` çg>¡\Æý‚E?h •Úœ)�}çÖª}Z0y;P±Â¢ô~ö´z²VB]aÁ‡×É‹5¬³9bŠ �0™,üå0N³ht Ö•í}-t“¦ã)�þ½ä,Ç× ÊoéH¤ž,È�Ö�¬·KwŸŽÀyù%ï Tã÷RÔ}¸& ¯¬Û}Øý½· Õ3DÊJèy»höqî,GXê=‡àöøÌO1û­µ¶›#šr=ÙŸ­µ «Jtú«Ä.`›BåH/Á¤Ÿ‚àd3ë5¡EºJ]÷ûHqr�]?ñ[pË{ j´Š?Ì|ÜlÜ'O78ã�Ë•Gs˜ Ið;ð´¡1œœš°¾Áá[m"èQ>ÛÈ\þôeÂr °å ºe‡?®g}@ƒqΦÈE¿:ÿFpß6?/'âCÍ –É¿rçyø{ɺL y,Öæ‚[´Ú ”T;xùÐ@ˆK|K �\7ró0CPÒ?ˆ 6YB½smµ¯±0µ!Û1Òsæßàí@}ñÙ×CÀG‚O—åo©BBå…³Z™|Z¯?ÎXÐIýx»æz÷T› ¤AòÉîÆè9"?°éCþMúN>|ó ¦UnÖUÀ©×M¹Ñ\â rºúN¢3Ë{ ätZ»1&Ï6ÈÐèþ�(ÁÊå�CËΟ3Ë|›²˜b)e³)Ô ×0_‘â5�â Å`€Š!�8`ÄÍdçc¦'s/áX×U¶ô«bñ‰%%–-k#¶¯A€ê{ǧÒoE4¡±~9•Z3Þ"µOuœ¤Eƒ£+›züÅ×'èn…È-cÃJS·]b#bÍÜï® G¼Ü �R¥3c�¢ÏtE²ž®oœó-^¸°`œtô`¯b*¨tÈeõw�g¸YvƹCš¿±•HE² R%°ÍvÑ C.ÐØ¬¯EÀUµ�Šâ:±t4ç´»i5À`“õ?IH ý%2\c"Æ8˜AâïùÖî±+ ófÓmÙ;à3ÇtT<;ÂR0$vDIÙ“I�€CùNùø>È”émHÕ&�EãJ0êà!fÖ¥åï5š§ñÊQ\aûàõ»\kœÁ^±lýt cò¤>õ½rH?ßp|˜ØÛâ«{¾3çŒ÷ q)Cí¨³~æ_Œ5UOj)QqÉe-Ûi`mŽ"ï0Ë“â^ÁÎæÔuxº#«´3” d�$iðCæÍ‘Ž×ã­ÁÜ)¾¾Õœ!íe1!,ë�DÞ^3Æè3u�M Þø‰qM*÷°…š¡á¯*æ4t3;á 7Uù,Â90³'퀪Һ ÃæAQ5d¶¸5½x”Wè@O�Ò,Èâ '&æM§ ;ã¥M:¤1âA¼ÞámÞ¥z�CÀÇ0YÍðÙ†~l¦o‚ûËV«á’JüSOrp^Àκ‘bË M&äGëO|¶i–ëû\ªŠ‘¨»±Ã8Î÷„®%5Õ¹s¡˜*Ÿœâ€S{˜jþ^·Ÿaì�`0`·/L]š_lW±5h£;K„…— û"YŸœ•"ðy¤b\Ï~è¶ŽÒsÀ�9Â^Úd¸.p¸;ØhŠ~¿¼Õr ø9±½­û‚P7Wuo¬ã}{1«>A·)³h´jŠáBnDb:<†‰·MZµ¶œý¶²šÕ¸õL4Wî±|œ«nV±=Ã’ê†°Ý &µ$- Y�`o÷Ê›;Ù}Ü8ä’bà�ªCµ‹¶» ˆ+´Ý}ul­ƒ,!æÎÈ3©heÅ€Ï�á³›/¹^´ŽgH>Nð A6�k$™g“/†Ý¯OÆ1tƒ‘¥P¿-lå–èÏÍ£Ô'” ø˜~|tYmžŠ]~Ý϶çxz DUÞÞÛ8]Üœð�›�%~·.¸Êà`L RèdÇxÌß|û„pËÝU q³ü}ãGÄž¦2ìV¯lŠÄ ÙN8 ZÝŒ5À÷{VÌV£�â„Ï×C{Q–ï•{A¾P¶súL¹P ¨3»ÝVbÄ@«~ýÉx¢úv—?zk^±!öë»·o6sdA�@[#àa�ú.Còo`ùÎóµ…º‹ºá[%YQ×,Øû2�E ç ÁÀZ¶«¾—–eÀ~ýï6ßâ}Á߇hʧ޼÷ÆKŒ¤ÚŠÆÊ'üœ4ø­¤ ³ŒÂY«=:f¯y”!8ŽD@Ÿ ÓF o$•ND!ä ù@ )H\¤™Ìf7\Õ‚êtÔ¼LXm-L ‚ ö`~ñ8è6[ÌÚÒ/¸ƒ |²Q)êR·ø3ÞË·ÚæÆÄ ‰!¡lÉa}Œ¬:J5h®ºñ+_¸‡Á…ËÙ�GÂ]=ŒÃ1âûññù&½±ï~¼†]ò‰“¸ÃšõÇòÎ×nȪœÆŽ…Ãõt®`hyÈÖ{’J…ÏÅ‘¬,+¯x­ç`ô@qC럪ׇªP­Äë�$ù·ç]ÄsL¹xMÎAæÈ_a‚¤¨ Çvðê�((;€Áöm^‹ñ(F€ôÄœNZ!\ ôqÚŒê°�V·ºŠ÷÷^³5wÍ¿V“Or%ç¸ß1Õ xt¥©r3ÏcJ×Ç•5�bÍÛ]öÕÑ/iëñŸ.¨Ú^6¦„Ü'ædÂ<�Œ5…òìè‹g"y}jâ÷ýz¿o™ø 0IÌ]L�> QภÇNüp‚°Ñ$·È°„ˆKNÆ]3½žEÚÄøWÑWöOF„”Xùª‡>M »ÊXlÕ„�)�ÕtÜ}+Ú;ü¢un}×Öô²Q/KL>ë€{¨ÍÔcß'¾kÓ;û䇺Y>�§>ANþº²“|V µ«ë-B˜&Óêv™´°²‡ÂNºÀt4ÉA©.Ú£ze/­- àè}ZŸ`ƒé òøìzæ0ÉS’è/ÃSz•ã.¬EàÊgî�‘ˆµ§&`¤&ÏGI„ƒŽo‰øAö¼ÖŒ È,ͼ Ò^ý>}I&õéǵ¶ãšöŚįcU\]ߊ·š@Y‹êd ñûNL‡dÙdxzÖ0¢v ï3½£ë"3šÊ6h~I¼NŽåʸ†7n¯ÂœÓÌÝ0”T€Ò í¹dü ÏÝCnç�ÊÏD-ocX ÜfBˆé‡NWòcñȨŸ_=Eæ‹ÍÛú$sLäD‘¾�˺¸`,ëZ/‘:’{2ålâ#† �}þÞâ©èãýörä]öøÜS 7Tí"øŒY� cûú“±´œeñü¡¾ûºH ��òÝU]‡Bàh �ß7‚qÛ¯&©©¶ýL”'¯€•ÞpX-¶1'¨:?t·ë>y»�€MÁsÔÞžvµ%7™+ƒ�ð%ál«5¶û¢ízÄqhÓJ^böétT0Ó©dœyélîã„Íè4žmµ)FµË8Óvß]œ¯´Ç8.�€ªƒ’Ö›uakÍœW©JÇ¢xiUT‚‡Ä&Ë8|§ÛØé¤7ÜX©ûP‰f?ªŒ3¾ËÍX d&. 2!@§!tP²hUP´i»Bt8Ña污Æ3.™%a[À‰ÞJ&ÍÈC¶Ÿz�]¿Ã;˜ÈB]YV^ÖýŒ(Z…A–6€9¼Fp�Ë:^ï Ú�»öäaµï&|ŸJ.Çæå„_j7ŸÑÞÜj‚DÈqä:…yKLïtÝÔ÷(Ý(Ÿ�1­ªÜÓ´æPç•ЖÇ}ƃa¥g®4nò­:厵�6±äаuã€×º¬ÃO/pdA;³GsOƒtj.×™£xdú×y�f‚‚ùÁròJl¡:š�­Œ­ÉƒW×Ñ8ÓèWdb=K²5hv„µŠ€Çß«íû¡öCϼ˜ÉÔ�b{_ãXšeªHK{�5—¨$kå­zÊýò¯:,(œ{ô�9bƒ[¡‚àŠË]ü=);ð ÂB¬¼±ñAL^s´ jcàŠŽª›´°\¤üò–,*�µ3âqtüV½œRÛÛ_—V# …þekE?Úd ƒhœg÷u"xqdáøË¯&s;Ê�¡|\W}wx0è1¿_¢5fœ¶…qeã�e>ò*F­ÆÞ+ر@ÛëòÁ¬ùÞ‰ ¤âëÂá�*ZÏFdËC¦Ý¹4ÖO¶:|jªæ ñÎØ?‹Bò1Ä›cïâ(â’\¸£vJÈ\ù‰`w�&Ë¢ú"›Ù-¸ë}¶âÓ²¡þ��¾–}ò”-@jµzLd=!vQl£ì:a®®@j¹52Âç»Ç&•1bâ}hWÉG5h™@ÞYد1&5k%CÚ-±¸NÞQ}Il©Î « z0ÆA;ÊoŠ{¿+bƒŽ—k zT õvÖ7Î@6ŠÜÛY¢“vM23›dnOdÈœ�äu�v´¥çõ^T´kqƒ˜n7+I¶žG„wCÈ{lž…-³Vr§œMëB…ÕDx�.TS#ˆ¾éû,¼ÝĤ¬O—´Ð=‘pü‹üf+†<â'vùÖÛ'Òs”ëvËõx‘@X«Ï8§vpÓ–€w‘”ƒ¸²˜åÂì(~U°-á<�õ£kúަ<ØÿUý¼gðKw¦þ{.E€ò?]“äu,fázÊs5…å[ODS-Ÿãpp�@bóûN¸C-a`s¬Öï-¶À —l¥ü¼m®’8)O×—‡˜ 3 &X+�´«{ž&Æ‹i<`Mf½ÚÐ(½¸¥á.¬uOŒ€lÝŰWÛ@q|LŠ‚é4ÕÂì§ôŽô¯¡6ûk¦»•z“À-ô}Ám¿³gp'Œ@@[åݰýŠª0ÃŒ~ðê›Öݬ4�Œ.é$™Ã¯„ílI·àÄ2ã@ñȼCúΪ'rüãKs6D üf|ê|)U<`Ai§ s ÷~ÑÃ_@@{,Ç^Ñ‚L¡ý�Ò÷î4s‘.[Jí‘9Ôî�¢“{—»X£±Oá4@Mïpo181=.Þù¤HÁŠbq-õ¹‡0ÊY-–QýÇŒ¡Ç m€Sâ—¹µ­÷IHÇñd[NK8²ƒTdÇ×½©E&BKAœùp°TL·*7 »:‡-v=_8�‰gÆÛÆv yCM½ßñ=ç$Çå�æ,³Âj~ú7{g“øÆ†÷&¹GÂ�òspÏìTÚä2 àça#/Ò4+Å­Fà'Ûa’ñ(Yþ¯ÓÜ–XP6ߨXçy'º·1Ιå¨Ù-t„¾‡�wŒB)GϽFm†—¥ñŒãXŒ<“G##KpÏËRG]¬k@ßÒó›e—+¡£†þ^(ôiÊÅÁO'°Û‘sÎNûTË{lz<ÁL•K‰jû0ÞÙv>{{n~8o'Ä”T(€yˆxzŽ2²>ÔònÕ\FŽ“ëžøåñ¿ºžøg*ZSü…¨IaÔ�@†Ûd�É’ [–zÖ€Ú—'Mi"0õû½bE²fЖ z±¾{¨¼�H26cÒ<«Ø›Õ·ÜÒ¥LR8" ]À¸sP¾ÃÒš¸É h�ëÎh$E¸3Í×›–hôsé=¡G–2ÌÈy;ä¸×Æý:ÐúZ€iZÓ|1½ßP¯sY™m7¹îóÚ%6¯®3Å5`ÀD‚Þí­è é­2…oðimQ\QKoD¨]úA´@¾k$\[˜Vr3çˆ Dýf:%ž“F …o9C ’˜òA€‚×\�q¢ 2lõ¢BáQÆè3hpÄ#Z1ctÁì]œyÓ¤�ú üÙ;û¡¡Ú×5YµkNyò�qBñÇÝÔÂ1jv!&«DŒ°ˆÞg3¾w×v®ä0óÂ[NðÇd¨ö;xúü aÁ¯¹Ã ÔVÀÞÖæÕ›sk?h9 o¶¡”ƒ,9ç,àšÔ|ŠK/>2q²¾»ÅX°<ºGƒèxùuçu¹ú:eªï†G­ŸèÕj�AG0˜ªC‘:IÉÙ"Ë!O‚<Ö’`]-Eäá7€Àé}êºÜ-¼ ß*<�»º&²<€Dö¬) _L‡>Ñʘ=¾x`Ûê½Ì³y�ñº;5úk[·¥ñJó›°„•Ïœì@>5r+� ÂF±–ÏW§èCâࣽџÊZë‡Ö0œžú 02ežÇ(¬CÞí~|ÝŸ[gõ¶ âëÍÛô('hÃûf{Î'´™eĬ`þgðÑ̸fa)°ç�GõA7Xåôûû›4!—vb=±!¥–¹�‹þïòkAÆÛžvÑœü¤¼Rq_\²Ã,Å€ËÅÅ`À”yµÖÀÆ(•r–ûX\e+ï½SŒÂMÍÀ`6uS e˜n©i�’‹á +5ÑW×L]…2 Ólç3‘§'ÌîÖȬ‘úPÏwBvÙžôäë"Úãúªž©‘!¡ɘbïZlafê7PP1Û£¦Ø€��õc90îêÓ6kòØ�F�8¡"ÙXÆ-¥pé·iÜøø»·ZdzqÁ†¥O¸xÅU)܇·�™sÍôñ�ÖZ¬B>†á{–nvbFÏL+2°ê=¤��ß(_Ggr*ã"„&¢œ®U¼‚q‰äX¬¡<$á”�f¦Ày},m‚4R&F2Þ¥ßìâO>ÅíðÐáï�nÍ{ÔyXæÛ<‹–Ë(uM>7­å†$2aµ]Äû|{]°Û•Câ0e¾){6öÃ;\jãa³˜ÁQÙ22Oºã_yrÈ\qlrñry–OØÑ~¶ÐÃIMƒW·hcÀ9îÃ/ w¦FÃðC§ÃýB 4š;€]!ní•UµB¿“{ƒŽÐšBåÚ$ ˆ;ú¡Š®à�ѸèíK«�Áv»â­éù`k€…bЪüQ¥åƒ<±"¢ÞêØ€†%™Ì9„s�ÜþL_ô@ d‘šòDn�í+/'·¥¹û‚ÕÜ·˜Ì²áÙf@¨ÐL¡Ó …~êwf4­¸bTú{;LµÒêÀ‚ãvÑê#zfýilƒÛ˺T€W~ˆœ­„ðV¸tüÄـ؎çÄϼ©f¶êßP!’æfµ_,¤zÛî zI÷ö\»Ê­s ~6“®JÃKJ%èh6zPÅÕ‘qJ^°ŒXþ»ýÉ<»¨§$Á&d SŒH¿×üBŒt€Ôu)iOGÞD ÛÃóêùÒ,ì°âš+ªá匠ä‰Ü0n8DÖË-𾦰Œå“MY–÷p <A�+Æ9L›È5hÕʘ`CÚfmjà‰e¼£6ÅmF-5m󖌆äXKÕ\Ðîq”WÎÐVp¢Õ–›ù,t8ù*Í·Ýü™±ZÔÞ`ÁZ^ÙNÛ±­+5sAmƒ ×¹­æ¢åHGPrpÁØà­¶ióÏŽòkÎNñšÒW¼OŽç@´¡KhSSÅÅ'Uóžç^@—á†ùœ‡¹RÄ¿"àÂ}Ý^ªà¿d+ ØÉ�>S¸d O6z�@JÆ'©¦õÛY&b­bâ3Æ®µD‚Ë‘‚LîâIñâÚy/M0ž¹Ô�¨ àŸÉk­ q{ØÈëÔ‡ágâú~¨ö¼ý™�·qûÑèpØÆç=ºñ=7Cõ,Ï4ít…<Ú³éuë|«öRtµr àû}…�n©¶ÚŠq�.HŸˆ'i�Cê/| [WÙŠß–³–«’Bh>Z.|è/QKá)Ñ�¯;jÚé°„›}+yõ‡ù)ç¿?­\‰ô¾|›·T^Á9äãäjì¶Kv—ÔaÂøÅœ.·@£!ÀzC#«–šC�Üé\˜/L6Ûepê�pÈ ³ë†(æ~¥u"€æ‚¶`Š¥¹ËŠóм"’1f©›ËŒÝsìÙÒî~]åCnb†C¿FÙEí‰E¯ÛÐu—×0ú>ïe‚B‘¾Ô�”r`|}’5Ò×Ói™›æÒ= V�²ªØ¥¶t`¢ºUæ�9[ëV¯…´Œ5|Ô!Ã}~?ÏÝ�¯ã™�rG\Ããþ´ÉÊàæÉ‚T -kœ ,à„#z$*Žß®øí±/W¤ y¨ù$ÎT\¶@Aó,‚ø"U‡ëï1ËR¶àZù‘&ª,½›ñ߸d]Ëî¦ö g¥võ‘í¢Ê‡k:c¶\ù—ͪ×LÒ1W�ôDKB˜œ÷Ó×z¯29��o>g>‘>„­ü¹ÓQ—"}VÐÞOÔ0—§ )øÁ9¥p)¥kp5lIAo…p\¶?8ŽKá#yÚÄü¶&?ì§®^ì5‚�•eŽË²ºnÀ]RÕþ\/ÍÉ"¿Ì¾r6Å�Và‡AlÂpQtûùmoå©õýùY}ÂA7êw)Zkç-»esöŽ>&·¿ŽÞ÷Vº­Ã .ЂÊi\[_°d¥ø|�;YÊ*[S‚…&ç ¶…ñ`g]0H%Á«¤Mï6 åOo´¸ ô³ôavG­¹q¶K€É:Ϧ0E ô¶8±n>GwúÀÀ—: e�Qê^Äõ»»¦¿3ýTÚ>ΧbúÒ¹>,PgúÚ²æ˜Å¿¼V¡?mL}]E¸�Dìç]¥±‘.:D ºúƒ€uçÜ•¢l²ÇÝ—$OO½æ,Š‚%ßm¡ÿmm�ªöc¸½Ì²^k²âë^¸äx|Ó:_9 ™Zw1§Fòàm³^Ýÿé^!n5€1!ßÖ‚‘ˆ3Æø´0G�6%[�]ððá„YœDטY´»+°{èîsI€/ M¿·�{fp!2}Tò¦ñꪦ’)Þ…Éè¿ÍÅéHâ—¶�3f©k¾#X¹÷•dýÑ'¯ÖÁqCü0ÍãD –^‘s§>Sú4]Y}$£Æ¶õÆ/r 7Îs#ÁâÞA¨4‰(¸åƒe`w¸Q7vÚ eOœ<žxƒ‹A{Ä=`!šcâ4•­_Ñ]>ñ¡³ô&»B'"‘~mWVmQIzËæü´”]�sJÎî¬ Ͻ ÍÀàˆµY^nƒ[ž8<´é”ó Ãh&ûjÞÁ®ÞÁ×N‹ƦJéÙ)Ä.­Mª(G¸[åÆoT}Sk~€Â-š7!A cŽ�²qëÉLSÝuб+5Š ï€èKÂÈð|0ú0*«É‚âK §¡ÂXÐÖBä$ˆò:-©Qô%†ôù’E‘ŒÑ9§“· ÇoÐI c#Ve!°¿7K»o…Io;6 Á†Â)deÈFC`fm¯Œàs«cvyÊÄA ]ò"–˜}EkSZ‡Ìoœ¥£\¶»”?½r Î^ Hw˜×žT§Q�ù`ªwGø3Ÿ�îW0±'f˜¯/�õ°u¥åtÑ–~&¤sJgÓÕsVU}lòâ[­þÁ–ÿ4àn¨P.-º ¶GǦ“ �D",é:©ƒø�=Ts@þªcxÿ#úïðvŽ-²±P  Û,vèàe%„ &MVÌ‚¡DŠt"ý ‹zs»(ZDˆ®UA�8]°Ø²7·üÛehó!6j›î²(ŒxíÆ¼Þ>Ì"UN‘{ì= ‡'œË�ºeÆ3«vVƒÃ!~p­Šìxˆ˜‰Õhumôd`­»±~œ€« 3B.s¬TõoÂÙÂü‰pj M–•ÀìøƶУ| 5â_#úåpø{MÃ!áYÃt^ÙáÊâÁÞ—ØöìY+XȨ¸•n©‡s1Mõ£…ö vƒ¢ÁÜ$VJ‘uͤ÷aàBZ¨»íJË{¼Õ×ÍœM ×[ÒîóáËîz�ζŠÙÁZ2r.¢ö rÝ.W0«e‹Ú�kë¸å§¤ôÞÖª KY¦ÎÍ0qBÄÝIÏ’à¬X½ˆbvžå­ÃÝ9j°LM~¶ökãJ_6[ŠÌl¡¸î¿ìÅ!ÀÛ}³C}æ¡ä²ÁÄLf¦(Ìè¯ìz ® fƼ_ߨ$èì7Û†÷ñ2ÞQ“˜,ܬ—lJz¦îRÛ°¢Ôp žómN³÷k±æ)·e>F°f©š0¼µk,×Ivñ})0 |µ¼ØÙ;Z”{€À~Úý� Ào`¯ö[õ“õÆ¡C�\Iæ0f?JNá-œ·¾Ö!ƒi=dŒŽY–ÖÎï7vd QøÖ‡VG$üC‰»6°ê—5_TÎGãœeUáG‡¢ÏɬS!w®¹ÛgˆÜd O›+ϳÏ;’úÁ�ïÍWÔV`á^iA¨›8E%‘„ M0îQéð�=ÖgŸA§#1ØÜ[3ந‡, qåÚ#À–°BÂìo3Îqi/.iœ‘¢}ÏrÂ2ýîs”Jå«!±°½w<°68ts­NÈ»jùCÔƒÏ3ZHºùY;8Ž—tÚKúrÙeÔßÈ(6½Jˆ¦o¦åÂ/!ÅÖÓ{Ío€ÝCr»ÎHôt,=ð€�öW-+Ï×™_ŸJÍÛÙ¦'`Yß]¿z|ßtŠ‹Û þÐ|°†Ê;�3)™ÏK†ÂoxéΊ¡ ï8•{½*¶ÞO2¡õ+Pd±’™{„Ö½8KE*rì&9=ÀhC³êã!úÚᣌp[!åÙjtœ x¬'”»hUãýp‡ß3k ‡Jë'¸7}W4yZhSÚ@ÜÆ°[f,ÉÎRí8g¿HJ“ÒÐy³L ¸Ó¡âÎß{wáyáÃqŠ\§0JÀ |µﻚ Çw倾»ÒÇ>Ú?�‘àð$¡�¦˜À@§Ãfe»Y-ªyê»ôÙ¼ª…g{lð}¸�ƒå>ZÝÁ¯ÎY®Ï³î²ÒñayZv½¡[ólu ßc_MŠ#æQ§2ÛïÔ÷ß‘\Ô°‡ôZ++CÏ>oaãâÄÁ+`‘Ý)“¡yDvÍßè ÇŤû¶Œñ_›’Ý[¶ø:»žóå#Ëyñò{²†³ù.køpÔŸ-ôÆ&ô=Çvá­~ÝòAÜ©§Ä/'ò–Ä Ìo`^bôØëdÆã¦ö8X¶ú¨º·ËÝ—��‘Ä¡yñÁÁ„ �Ù,ŠÐ8²à¡¬˜¸QŠ+å=ÉýMèØq¯çDS’b·Ù»—CåsS± ïOtÀuA†hJr5mÁLÜÁz’ü±p–MG_œ+ŸCÂ]1öKœf‰»#ײxrt¹¶ãjzäÒöe+wÚÜ7åØFw7ë»%oLýÊccÇô0�[s"¼¬sªŠ†ÞGŒ‹Ô)bÊÀ¢¤••q8ZÅŠÅy‡F]ÞÎeh�µ¾GàÇV[“~MLµI,qê9È^o_p½ÒqÛÍã�­ÏpÈNŠ/½+ Jú×f{àzº»·šHǨ¸]‡à†ú9½§I‡w °hip|ÑAÖ¬–g‚­]ãc¡Cu̺¼`2‹£•\ºÇaÅvNÚüõS½VO œ%Ì]Çz�Ò‹•w�o$*ŸjÄÙþ¬<Jk¨ˆëKfżߖÁ�Iéð´kbS4ºi¥[1ž<Ýù|Ý{3ÀªÌÆ­—} •ÑI¦ÉÇ¿û$î¼¶Ð_œJ};YIËœ %©Žóf¢ÜRbD^){óZëÚ/¹ŒåxéÞ¾ð ‚ƒÍøòŽ7ùõÚ”&0õâH¨äìÂ5;L?䙾ß³D‘» ómÜp»må�Ê…o) d8%ÍT*ryPO÷Ò�@§)ÛVˆ½ÒñÈpF(ê6ôì7’t6nõ¯ô}TÁÎFok˜jÙ…ÂõQªÎa³kZŠm£ ö¾¤Ñ0퉜è”ô]ká«yæÚâ4B.KuáŒÈZ C?„, ؃fî|Á8,v.Ëk”S<Ãyÿg9ÕJÝSZôo­æ¹~uƒT$«†˜[OªºrÆNýh9ÉÃ>ñâ8X=ä¡÷ÊÅZTÎAïsåR’=ï)îp9|Ú+Ñ_g]¡Œ[’ͳ#{NI�G¯¤¾øipC Œe�O-ž-óh²èE" rC@ä² ƒSIˆýgK~»©Î­î³ÓjÅÛ«Nì¶Å)Âéœc)&m )v<p«áÍ–2¿»³ Ê5¡Ÿ;šµR×η[¼8‚îÜžš§øØÂºofÀ% aäóÅO©q0¯|¯C¢Æ vìIƒ*ý¼Öû®Dµ•ø§™™Jƒ­Ÿ×/ßKÊnn�Ý=_ŸßmFpq;礒NW�µŒ%šÚ¿×Ç‹VgÍ>4¢ŸéÒ=´B»SNîá…Y’<«ŸC¦y¯Ðk:ZWK‹àòØà3ˆXš$yK^%Ƕ€6t »´‘¤~м0Ø0×jœ±Ü}š„$ 2�Q GÂ6Ç Ö½ôvÌmtÄ5,ÆBÛÃý6 ÝÐ @Þž QR€äÐçP©£îÁ»!•@ëpÔgñ VÙ›–lOI®‹�DƒÃk�KE‡ÁR-}6öŠ’áî5ÁŸeÈ~ ©jÐÌûÒé°ûѲ~€‹Y4¶9UÐ%mÛʯƒ| KõœÀ´—¥€B|7TÏì€×!à,áqII…ÌÂ%ª�ÕålŸU-_²ã ÓÝ_]Í·ˆÞ*=e�äVf‹”Œ¦(9»îÒ”§�µóµ >]*­3+°$dã±Ä¦¦aŽ(%…TÉ ÍIOP,P,ú�+#îÚÿê2¶VãlC· ³ƒÿ¬m×%ñuì- šêችjb·º¶]Êæ¥›)6’‰·Û@(#-‡m­ÃêM]ï¡S-$X¬BÖßÛî±Áب;Xžc›æýOã€Ç=ö”$]¬É¶�,¨éÛâº0*‡x¬q`6T´¸ù„{“ü5ZO.G`Ù,íu<2bÕ[#›øš­¨Òd‹!Õ¹jH탫¾�ÅÒèŸ8F¥©s¡Ð\‡ƒmÖ¨Y?so†þ`‘të�æólªc·t�ûŠëÎôí¿¯_¼ñz†Ào ;q²|pfÇ×äïÁÁ|cá�ž~× áô¶P)ËpÐòn¶®–Ëk_9çLÕ8”tÈ çk: 82ûæ»ÙzJ5g7ɬ7Cìûs‹÷´–_§xç•¿iµ¾ç@�¹ÆcÜ=Z�éÃ?·ðL’ù˰á×òMú”teŸÐæu @™éªÆŒÃ>ñfç¼°.²j�4†�›,y)$g²^ºxÛbå;ÝPÈÝׯÛåœi�ÖEAÔÏ]X0�Ùå^˸.‹Ñ·A€y×z¬+l\ƒ¸~¹œM�Dn¥~È$&é‡k. ­ ³*töÂòÎëKna®:€»a¯›Õ’ Ù„úVfc�#÷¶C¢ôšð¬ÆŒmåµË“»ù”ç¥ô¡€Ìer›ºmhæÔXP��²Š–+�êçÅ(ÈU{f‹F;‰´_Íø^ªš†îW¨[<Ê~±f×ËÙç‰�Ÿ"}·5!«u(}ˆÐÒ’UDƒ!ÕwßyæÞBëu[bÂÑ vCijxôzÑ+ÈsÕ‹¾Œ©uêŽh__XÝñrŸ�Zª‹¼3".lÕKbön#MɈâöQÔÛÞÎñÎÄ�áß~îÖË8…25(wMõá4ÂO•N5ˆÑ8$�>/Gšö·ÇXôûms@É­üéœ(àyÏ£q¦^èD³wj”¥Ïá,-ò ©@þf& c�SïN0³‚<Ö¸×ua­�¨„B9K…4•PY3†Ü*x³(4µ‘¹çÙ9V*k†Ýî™9*å ½ùoаŤÀ+ZæTúQ‘ kéÀû�–ojøh�jè.¶V¾ñ±'W9N FÅu“€ÑGnA«5½Ïu&èÓÉ éÊÛÆ¿8ýZÖÚ¹: {ÖÎjE¯6Hz«®uÐâè÷\ÖUƒjù#ä_’²Ã�iÌoOt.�µ ˜—*Ï›Hº¾zÀ±Ýõ%š XWÒ ]ÂÓŽÚlÐUì([—¥f üØ`—À3ƒ„gdKu³Õnnq��{±arvg@å,ƒ!ά{ŸÇRæíx¾\6V@؇)]3“pêA}¡ØÓ?Ó�ªzé½ZóíŸÐ.©Ké]ë_M> ßé¹—âä\ø`ÛŸ<¥`¨ÔÖ-±†ø¨\N¦äÛ¹4·“Q ã[ªr“=6@%S4®ÍâHÔ³FV ßjì{ØlâÛHšOrw;=ì¹n.ƒ)‰¼ 41ì¹°¯ ð"Å©Ǽ^fXÞ/^¨Øk†£Zu Ü!S%ïç) ûqg\äì�JY¼\¿O'5š†ýžKµ$R}¾j±?z„®n�1”°äad-í(©Û;�Õ#ëyB8¿ÉÞ¼ý¯Åè«ÞÞ‡{�ÑÎ\dsÃå`lþóLB±6²£Ý‹U„¾€HɆ c#O¡ÂÃ�€ÕÏ’è0AÝiûgchv“ÕîXùúò<î:\(z94¯èócSö’ø#®Eþ ¬ò[V `°>/=CN‹¥‚¾À�Ô!@Ú-ôNYòè¢ áñÖ‡Í!È´¾uôç Ã… ž�]¤;Ù¾ qhS/È—$›)f¿n+ü‰4ì¤7±a,�‚üÕM·"ñ‡Ä¾Ê)u8ÞË{XåptGæ“”üoëxnOÌ5†«ÒÜ"´Xc&â‰ÚÉãô­®–/ªQȳ�:}{CÀ™›Ã»eƒnGi:¤x ^¥ ÎoÅ1ºÙ£I·Û÷îÔ6GËÏo-�ohARœB{fÈù2F7 ®‰õÁÂ5 ìïµ¼®aÔ•³J[Ùu9Äaù9TþîMÏEG¯Ò} \ ÷VöÕ·¬¼Qt!‰)Z&ÖØ5òâØ<÷y0›Û fTYÇ:°óAckØ# ¦¿Y$6xj·� û¶[¼#†"l�~{eoÓçºÜÚäx€Pó]‡ qۆꪓ‘ç¹ÂÜTpÌ×6u×L>ƒN£ Ã¼ÉßËÖñiŸ@�n{<Æô�L-eÊ¥^ΖÖ~ l!XRx@ñÊnêÊÁZÃá—ƒÔ'du2ºL›}9|(K®Ç†Ú¾®³¦¥6EmßVBÝ»\g),µ„ÀD6‡ËFj+Žúû‘œ\ ‘ÞÑûÞ¿ìLqg™Û4Š wPѼÊfµjÿ£îÆ.8Óþ`eöšúmÌn‚ Vl�5,Ÿ¡­Øí ›XSDf9À��Tß�öãJºeÒÛ�7CtP3¼ÑJëVTüïž4¦µ¸KV.kºÈvo,ü=1kcª5vÎG#µ‚N>Ô-ò䙎ÖÊî)™î?5­åôS­¢^š19° ÜZÆbK”×K1»†Œ ™©«aDkqžæá�Ïq€ìò·�—,^ånƒÌ5‚ýß'/nÙªPçoCûÃÕŽ2Àò[iuÜxÙ $*êMw=²G{½^Ùaªf}p÷A­¸æÕ bƒ¢T* N�Skv<éØvÅ€�£>^«6¬øœå‡džïÈM½ïO}pvz­ä ª"wzžÜÛd-‹JJ&l‚�‚Áñ�¾¶t^ÉwvùÓK5ͨXjÕâÄ®„‡³iMÁ�|aWÀö|B`'Û7n�³\¥ií·˜ædÅ{¦_Ĭ!œef‘¯5¶ë: ïé@Ê˰>éK©(¡ë{±ç½�ï™ënŠè³àç±û8Œ³† +õƒ¦�¶¶·Îð3åµ›=íçÛHqšãËœœ†á §‚lwº–ºâÝÜ�€ïwª“,Æ…)°øJæ!@�c)tË$#Ò“‚I… ÷´ ¨¾žo»°Ýc†g…&á–°•j*7fæz5¸ ãí$¡jòelaîi-æ`�è?{a<3\%ú�pp©!\x�.åaPN”-Æ�¸ãRr§*à” ŒSäŽÃ·ð)Jn0ºß™…´U.üþøùïöŒ¡]<§*Ô×ÚH ÐFŠ œõ\šzìû]KÒ}‚³dP'y3§R|;Z‡¥Ž}‰¾� ö@Ávóx&lÜCbÒ‚ÝÆ3çÚÞª'ö–‘±;{ˆ}7R€#«+}ÐÐ$².�еù ci¨;0ó†ž'$J¤ŒyiÐR”¥ð>ÑN«–¶©sr P`É>÷¨€ÒàŽSWÞ�…Úmˆ»™íKUqÓ¢ZOÝ-ÅUwºØÕšýÕO8K=ð”6‰iYCgßVr=_'²|Ÿc·Û­îçæËQâüJo#¦µ¯.–í –7¢¢³@$²Ø]�΋´Þ°°0Ïkz’ 0ß$ßCN*=é€ò·…Ìݶ†½‡º…¼ÜÇýš>F¹T@Ì”È `üõÝü‹À+†ªvöú5pvÄãP΋ê#îÑ­Èyx]­ ˆ‚ä³€8÷ÞV'Ï*òÐ žIŸ£ž ì׈N0-»€O\Ï9QkØr«ÝÄ�¶ó€S3Ùµc;‡ÓÞ\}• �Hl 9ºú2÷àÀH+­r¨6y™¾³Èt�ždS|FOÇ~ey¾­3d*ðzìÞWè»Ý(åWcfnñÆÖžÈ4³×Ž *kÏ— ²êÊ|_hî"üBšžE‚^¶µ˜l«ÐC%Ä𠆲µJšKFX­™”dW|1Ô™!“x�ä™É“8k»`1” ìëcv ƒá&f¬2_�N x®ž!“K÷/ˆÅ‚[4àÍ$Ζùðwíšó<‚쟪I÷MJ·m>Xâ,v/ìµ¢gžJ„=®Êì2ÄÚŒ¯áºNx5Š»f#*À¥–ؽ¯Dê×/ãÔÌ�¸“?oº�”,^‹ÜJ¥=£hÔh r“g©ºhˆð!åC'53æÊJã&ž,«Û»½+¸Q4¼Ñ¯CÉ©ao5½!@á”r͸°P­»tŠútY;ä ë¤{M¯C—ѹ· žßï*;l7\#kp¸$>wcÆ:nŬǟ6¥º§ô:¬MáÖ)ˆ<iþtŠþ�é³Í嫡ܶÕÇRÌ›b4ÂÚM�Ì!Ý:å­4pë™� Lå]ÆûJÁ&�A9@Kr5æ⽘Ò2Æà¡n=ôÔü†@\=\š^5‹\�M5bm>.%6´» „­þÅ”îžû �‰Rç?E€„5ÍÆ>Çç.4tª+§Á8RHÄ’±KŒ º8—˜½öãáÝ|‡†Æóö¯¿b…máøÐ1ùJ·æ§ÑA‘+Ýþ.Ý�³»¦²«Ÿh²Ù¿ñ[eÅŒã´Ë,Ú§<1Ü™�•Ψ/vjš±ªû4/á²ÃÒ¸”2X£½Èì>Ã\,°«öMë9Bö‰ðg«~‰V•f° ·`ÒÙÓ—Û«íóu‹ò% ½ö6ΡÃ@³ÆÚæùâW83ƒOÌj»�Ö, à›U‡¦ü�¹Æ›¶µPýÐÁõŠÜ[e8õj1Néé‹í2Ðs´e7¬m³®fõpø7g‹‡FþÑ»igàð8:Ç: {Õ;Äó-Ù@F´_-­ËŽ"ÅÎg€~w§¦öEc4|ã#�cÜDhëú¼}6HÞèw�%ª;iº>ŠòKÿ—¨ n[ÜYŒ„6.òÊ“¯G‰CÁþmY4L{*X݇2£oP¥ü´]`M}†ƒ[b8¸ ¹αóáha5Tæº&Ê Úáð¹hQRU´óq°šd,^ÍŽª²‘ÆÝ–RöŸ6£G/Æ{u»­Ú�õÀ¯§óƒ˜²Ô…»Ëâd^„Wz–qŒÄd"-% Fê&™ÄÚpÎvÖœ=ŸÌj9(iÅº¨&zç†Ô™8"‘@/!˜Mø!·5ÕZpÖFÎú§$‘98©dyÎí ½„˜<ìõ¶\;×xîð�Q]-"8GM9b�²çÞƒìž�2 oA´@ï/ØÆ Õ¼lêÑåsÍ´³¯Æ±›™4�¢ ¶—ÊE+ù¥Èì�Êj_·Üû]iììÍ•°¹°£s"¡Ù&&±šù¬µ‚º§…Ù««(žl›‹´o1:ö`S¥ˆÈšˆIXLq0ÒÆ\/ï´‘'<£æ·”~&¹À�;”X î$m¥¹tWÓ.†ÒÞ,™J hd„ �-úØ«$�CÔ…‹<ú@ã·àçV2†ºp*̽ŽÏg-Ǹj~ãVeú8áoçÏ-x%@_’%ƒi²ê‡ýØ Í|›ÿ¿‘Už n6p,ƒª >ºÕõ1•·Õø ìÅ)Q¶ñ{ÌýðVÓ›½’›Ž&K} ƒ^ºë½ÆºÙÚ�ky;çxåwˆéàYìa6µ²¥²Gg$^ÜûÙéo¼µËy¤ ©)"Qõ”Gbí*†|” Û¹×¢ôKÜe§%2Ê:ÓÇ„•…rak!를Áû%<á³�‚—D~%—ô…ôãžÃeI´Ëíæ­Ï:NNÁ7dسËï…¢—Êã2K m%˜Gò\EG, xÕÕ~ò½��iÌrÝi¿›�8ï¬ü^(kš{7/§¼zúÔ{†Ç-“0 -m‡�¢K“�!¾)P1º¶Öø]VÆÊU]èªØå‚L½¯Ÿ˜0F%æýR?qaÓP¸ð€Â“é—±’½„9ñó»`@:&VNŒöƒ ×W‘Päe�¿°F÷:‡»iVàZ·,êØ}2l1£åæv#lgÔ'¾¢îRóÊVê’¾ÍÓËðg’˃xôwÝ5$µXݹ„ØäFëbœ³ÒæE�÷âã]º¾ÖÔ·@X�ÎHe‘©¢¿¶'¼hð8+¾ê´^vÚ‹WîïíUÄ•UÀ^Î˺p)ƒlLýïÐ�u²GDãz�ƒorn•›�Æ­Çd|6÷¯rLÕ"1î©ãq“Z¿ËAwÑp2Shõ'¶@>sÞºLÝnOŒK)oÎ^“ÊVÈpr±$Lyñ¹ Ðàèù†ã-ÞÓ66Ê3Þ[Üþ–�¬Ú´¶�ƒfÙ¶QƒÛcÍ£ë“_‘ß›œ ×hzÞ*QÜrªRX³Ü.ø*¾Ax¶¤[ri¦må3Õ­!Åž»bÆ­p¡Úâ…ƒ\ Ôr @ÜVXÑþ}R,6ë·ÄRœŽ×R›c·÷—›ñeê,ªxëE_³ ä,x•�yÞjji‡�Œh1ï†Ò®¬N°P‰Ñ"¡(ª�×k<#o´ºï7¥v|^~@\4üÄX½Ôs¾j�..%4‡€Ì]ë›¶H–@+�L›G>éNZÈàÀ&€uüÞ�Ac%·îõ�fd…yA–ávÙöUôA�,ÄÉï·n‰»ë>Ûðq±‚Ëâl‰´ª©wfKu©Þ4*P¬sA-ކa³1!“1‡à6 ‰‘³²9\ø?­}Š>”¬M‹€ÎAŒbá"� ¾]½¬Ü¬@¡ûiW¦ÞwǼãzß✮CGï�B„ ôå„ZA¡îx ’~§s�WKR+†uÔ¥šæÂï¡ØŸÑ¬ºy2Ýè˜Jþ‰Ì!Ù4Ö‡ ViI`¥`/5æí“XÂdp}ËŽyŒÁQj�løGã­ÕLo�M%ÈGOJ[ß±h|ohBúè‰�ô~½Ð±¦ëÒ^ÃÆ c¸@(´iµ½Éoi�&:šÈØ]ë|z¼èFvéÁ¸íËD8-‹$í²ƒüUÇa0¸üÒ¬-mSÚÖ¥†q3P™šo0½‹ î%»ypýÆêŒ›ŽŽI-§ì$œ°qÓÆûäÏL¶‹ db* ô�¿š_gü=Ö²Å?+Ž)£åTkô©··>h1+dŒ -&"©õ‡ñÎSW H/óÇnóá-¬²6ñ÷Z^Ãm~‹WulÙØÁRÁ?d��ÐÞ‚ã½²ŒñÀ¬³Ê9RC$c¸iAOغʅª?W{{:Þ¥;�é(6a‘xYõ¡#îow t„˜ä¸é_mXÐM½™�*äHDO`D$Áî¾ôü À.÷>‰ldYKt¯’VÙ¡¾Ø±±—¨?¢VÏŒ4Âíªùƒü^Z«r{a¯ãÜ9J§¥`õA7†!iCþ”õƒc³8ÑúÒyµlà¸P‰ç¹)3uTŒ`-ú–-o±€ßDäõ™öÚ·:q3rÃ\qŒ« ±ÜŸw#ª$ �9°±Õ¢K/àwkŒþuøµõu9—°u–¿Ò6|¾Ó=Ôr²E³ wíû_}bÚ1ê ¼ùX©Ì¡C>þ œ‰Z˜°9€½%r:Ç1SVá_`w]ªqc Á·04èí7¹Öã …ÄÌ!Ç{<ÎG†&ò"u83b,CIò4ûˆ‚[‡,J7p«²!Q�‹ès# G¹£+—bÈzÙ®~ƒ]›†/ÍÂÝÄæç›ôu’Pî½Ap®Û�ËB®êEŒÂ¯xŸExo,Ý­Ý—9õøùˆ1íª#÷Qƒ7íðlˆ,W¤‰Å&˜»ˆ´{¶¸m¦ÿÙÓ6Òéñ—»Ì†ÒWpóR[‡3ðP@46K±þDlò+0´½ü ¶k|”+B·`{êÂÑÒå–˜0ƒÖ;©^C”ݲèzÙºV‘Ù.zàº!úüµ (� (W -vêR�òLóó(ê'±ÊD3®(ôàæÇw臨›‡t[u#éå¾×*ÌVî!sö‹8K‰»¶Ì³` ¸ªŒ–!˜ÄýC)tQH�ˆÖy0n~œåÊ*T2–³¨hJÒHà%úµ�S0ñv‚�µkF3ò^ÌËI W¡YçÆë8‚ÜÃ3vP³!ðÍí£i€ÎlÆËŒ'“Ë;MUod­í_Ð÷`B‡IšÂoòs߯í²>ïˆd÷G, @ÿÑ:{µ`rš�6QĈì�áSÁøg$R¶¶�`Á¡± óÀ=iÓSŠòœo!fLÖ[�Ùù–æÝÿI’bñì«M·Êy÷ß—чØc+÷› F¤1iïŽ�ÍiÛG6Ìá‘¥ëæ¨™ÜöÉV3ô¿@àŠ}Òh;œÙ`»b¬èeçÏG�aÕtí7`ÿ+(p‘ä™^S%›Öìãacü¦Êku{bk›Xg¦R�ù*à70㪬xïajµ¸ûêÚ䣮Õß6šåO.iNT džÂùLëS¡©¶Ó™Ç5Éh¦_‡>ÕP:ƒÞek©½…Ø4=C9‹ùݳÏËÓ€‰™ en‡[[©5ì��Ì@ÝlºžEi*Û"Œ•}ÜŠû+‘�I¸í-¾zÙ|:ßqŠÞ׎­¹b¹ÊF¼¶N𸼟‘}·KÃp–ÚX8\~â\"®Ið{sx¿ay&]ó½÷l©™˜úÌ Ÿ‹½û˜üûñŽó³ï‰â;WÄMMþûD¤?nú¬=ÿ5=\¬£kÚ‚p"+h�T•˜¦C$ŒE£&¿³Ç�ÉfÛ =æ®.�ñð³F"ø5Ymc¿ÍZK{¹¼« ¸ñá[çò4…ˆïšnÖ7“ŠŽ?’~•\&…&ÖÔ—/ºM̉ýEO�ºDQÿ ILÆ4<%á‡Ë¾“ý»Žw}Wy»ßŒ7;FJm…^µ²?ý½{·‘"’ö%>¯Ö è|dºí%3Ð,g9]ð#w )Îz×5‰hÔå>â ø)Ç¿0e�ïP8WòTæÉɬX ÕH)09±F*E ª|^ «/É5k u(®€}6°Ó}›ê͘kÀ¼¾&ö3ÓA��º’ŽÇb³©‹#»9Ak41•®§ñjš‹Úï`Y *úr„ì!�£—àm¶‡°-toO†5­p\·2û¾Á–?M¡ÎR9Qå�¾ß"ÉÞĽޯ{¾ P R” wûq<‹éóÁÌ6�+ÖžˆF¤Ÿl‡Ö�/ ¸5YîJ)FÝÔ]V5µ…÷ÔxðP�¢éCad[ šd2¬<óçåôUK�¸6odÓ«ÙÍ ŒW³Œ¾¦¹Aöoz�­Û¹"R{|Ĥ‹Â u;”;ïZ ¶\ç=ÄB19è6SÏÇkA1Oáh}·±‡Öœ_ÓEl*$–uíÁ®W¨Y�a�ƒ°s;ƒœ ëá2M1A€„ç§Ûe‚³}D.cÄ\fL ìCÌÛ ’ûm7ãtÄdm —ìM¯î}ò—%3$i˜¹ÛÛB#E”/›#R³Ôå÷>½4Y“90± C¦ª9£ú4¿6âèü>Éoa; mÞA—}IÁë#Hÿ¾¡ù;÷µl#îÆGóøÒù£ºKŒGƒ¤È|'—“üñò ¡ÕQÖ¥!Éœ�RZ®X9žÈb£–${Ÿ*Õu^Ä>¾›òq€Õ‹ÛdKÉØ?ë ´MmÆîÃ×é5(�îØ=sÎé¡©�Á÷ší‘…à7xRç |€± �göEäì€d±r °}[Àr~•’úÝãk’4÷µ×èìYÊ�g-Û0lKõµi€˜T×kÚ[{c¡¼j™¾ŠNÂÕÔáô�€zúš-2É3h¹Ú··ÄŠ§ÏœüX‡2ǹïí¯�êy jÒ-á;#®Ÿx¹ÆÜÆuÛõñ9`«ofáÚÂ'Y9 Áx7sR\ŽG«Û†¬4¥�¯ú½¸ß=æêȧ2ÃÅà}žn¡²�nß�,Ãy¼^Š@Ä5ø úS„܇2y¿'Ê´A²9Ã`  �H¸þº ŸÖâ³^õ@äÅ=#Ì«‚gÉ“LÜ8þ¢šÍ�‚€_×­âB°/Ù;®Ë0ȶ¼}�Ý>s0Ì6Öz»Qì0lwh»J†qß¹9ðçïO"¨øæøU Ê�ÄÚóQ{Œ£[QgLü†™p^åòekÐÉ�}Îí*Nˆ}°iÑþ/§¾ZrT\(JR�îÎ,ÉïñÁf<�‰ê’v+_KŠRxË0Tƒ-Ì�/rÇBÅõú¡°¢Ö­·s Š@6™râçX³åô¤V:.;:ü}…ý¾�sl§îIáp¹ {ò¾Ó©uÿžƒÍe h�ä„Ãßï–‹†�™Ÿ{~]’‘—d¦KNkžÖÐ< S��"³Ô.f¢gY2Ðs«Áí®jCÂlÉ;—;ŽKÏ0À� }~Ë$†)å#ʃ;}s\'d·tgŸ±ó)æqläyú\>IðÚÑÎ;\Y²�dÞ¯ˆvÖɤ·~‚_¿­\�‚ö ÕýEìÄ ´†ôíЮFÛ5¬Uô–~Õ€ŠÌ_Œ¡Á‘À¨�7†ë¨ŠDk[»vå)èžÁ”‹ÆiøÛ )g›â³§ãg aÈ„“nŽõT£œ5À&_*ŸÞ4ü;¨b!¶);íŸ Ðqär_“ÉŒU©‹�=¬–1èömrìwjAfÝÒÇ——0Ü“ó]b>±›ƒÔÌ89†jaÜùØáo tÁz9m³ªª5`Ž{´ÆˆY3sPÛ]Td_­ E pvK 8Ž#Žêåôñ„ŽÀÓŽoŠÓœKó¥ì¶±×ÖQ¾ú€jVŠÕ–ÁâÕ‹ï®ÉÐùÊÎìs zuQù¸t8oòf¨5ÍkKwRFT(KƒŠQõ«%ý;<Z…ÎÏ{š½3h}{H7lô†a3© £Á¬å‹‚‹ÅH !¼\8¡QHù ÚŸ¥æb!4 <â¡`�¯Ö.½3ƒ®==áñ<Ø£­?àiY•›9-Ë&ªÈ;Á)uØà…�Azt5°ôþy„£pÞ¸˜á 48¤Ê<âË”MÔ ¨(C�­€U¾ÁåõÌAÖwWMÕ®ô°òbŽ!8îŠÕ–•ýüç/bÛ–¼š°04EÄÃjSÜ1™Á̓C¬q5 ×�à•CZº‹NÕ.n£ÛÑôW³ò³Á¦¼Sü;Á´c€�š½zÁáÞï,7p�©‹SóÛXÏ G §Ÿ|‹‰gÆáìlcg·À”· g°ÝQBúe¯9åHPŽÃ½ÎÛ¼ø{Á‚Y;òo!†õ‹RÜÙ£A?ááǽ‘Ÿgl3ˆ‚ý’G;Žë@ƒ¶…zøhÈè]¯e«ÕÒbô k3Pü;\¨/Öµø`>]ô§ûC« 0ñÓbzÛl‚_w)ºØí±µQÙŽ5,⓳t –ÓõùŒ#|ßÈuíâCbsÂâÁSV[k9ëZÍ {sQßj艱ÐÚüv¨Ù¶)-Ç“ž-ì±�ÝÀ×:x·#£µÎAPíXÈ:’ µ–ÏÈùÈzîNÆC Ÿ(äjt·ÅCEæBW-•ÁX¼˜»½·Ÿævá9$ÄI‘ï Ì�iµ„Ó0ßWƒåïÚëÄ�ÝŒÍ$Y]»ÕUÜùok± îÝ¢pÏX‚áð?˜Å�ò‘© #-_¥rËÖ<7h¡®0XúÑrEîÛVdp G¯4À¤J�˜Z!Á„°.@›…�>¨ô‘Œ²ˆâàæÀ1r‡¸½ˆÿ~ bÓÎnò¸�þ-Ó­ �N»ø›’è…¸ï��Ð~;íV/Œôí(K…ÔC®×i!q㯾òRoðù¬Ëÿhá—ÁZ¥B�GÂ=œ%.xRàP"¥ç ÐâË·–õß<¹¾ ®˜ýYÑÊSÔ/MïŽhw.±XÑ®Ë=¨öÛucæÁQ*¸Xaù"ÆÑ‘Hw_Ë1}w©þ%´ûÓÝ`q#½ZS ;üÌ M ¦ð_ Ba-#©«¦g6 qÝ�/S1yPÜjäð�.˜zc…%GœÀ…J8$Öt x" 4†:†’£Œ¥Z:)­(› =ÛEdÎPqDóH»>ã-®™ †%ó7ìSg;Ê\BÖMÛáÄoû! Ü¢8×>‘’E%Ë+ïŽFÒð@©k7FJ^WÑ[›™}{³ïáÖË!9Ý 0çeY¿æƒn©Z…=’q{ì§`Êu?œ£7 Œ[GÕ°èOÄËh¸/,ÛN~›øvÏÝеqÀ“ †ó':•Ћ�»\�dƒoÒÙ‘Y�¦.pc^oUIc‚<¥£Êš9M‡¦V¥À¹€|hf‘¨¥À6ìÁíʬ3g•ÿB‡Ñ¸( mî#ÑŒ†�¢è»Ï*Ø‘Ã�<®r6£ U�Š�­éE@¸Ç=�ˆÜ A¨)ÙáÅCLöî´ûªçÏ€\y¹¶Ùî@0AœY�2Âwk 0-EÇ2ÿg'Äå¸ÏÛw®;U¯¬ù¸ãé½éϸ¶vH/ZĦ¥-€Ã׋²Uf¶öõp=÷§/w½—ÞE ã¹Þù䪼ã(åsìáÎWõÎR�=#27ÞE»‡‹ßUpBéžF@Ÿ�MŠYƒ˜}ñ7¤�|PDosx3µxbÓ›ÚØï*•W—„{wíi?x¨Ow�¡²H(º.6û3ï¦ËO�ué^�<ÙlJ.Rì¦ï©Æ/Z0Úv›=ï grX»¤¯>,l#ÑÛüß`ƒ3Ä�R4­^Òç]‘�¾c*ÊL²–ÞþC±ü@ô^¿–®Yv–Fqsб�†K¼£O¾í±Üß2’Ͻ$µ—�mÒQá‰õ÷i­èÌC©îžÉÌ+ƒ/E_GÐ ‘îÇ"RØpAµS® ¬«NpY~&ß(SRè;§oÇ”%7Ù!BÇE©§�³�»¼J ÚçuûIMþyÁ§k™²¿‹‚¹kçÈt¶­ˆkòàzŠR¥ ¬ødA;µ÷p†nÎðåÅùÁ»(z-}šqlˆÜ—¹mg!¯® ÔUíá]‘·àÉõgvžsî­Å³A·ìÝG•<7Ý—§fÕ謾iðÕŸmvá†-pÞõ°šËˆ²ƒXQ`äX鑯n§W·½œô‡‰¾é’�"ÆÈx2*Ê*ÑõÉß³êðá×›ÞXª9r¯ ’R< ùÜgî}£”²/ÒÊýev?³3{c6|ï{ÓÀe-*Æûù}hB+¢ƒk H!G÷’)®Í«F³ÜÕ²—BÜOs¡©÷Ù�ÅÔz·›mCˆ?lÇÎ$/¿³§œcHå5zÞ¿^AžKÔFÂ'[›Ð+…~"÷ ˆ8º…Çùú#¥w(�É£CáòOoêÈ N›´×¸ÀXvgÇôTó}]VGø:Yé—tT–Ô4ÛðGG“¿¹6HÔY¤’fÖ{”�àøej,ã®XÈ„Ô�5~s›Ä– ¨³c|qÈË^®[£`2TxË£õ-Òð¾ëÞ#ƒÖ(]ßò¿´ÇtæŠÛCoJ!ó÷5<ãhLQ©G4À/ϯ*: )ö×H៖¥Gcï±QrÆBe›9¾� ‰W×kL¥ Â<fû0[ ÏšMÞÀj>¬všà@všt®Ø%Ç¡Ÿ˜Ë*¡æ4m�¯âå�äoƒ}“¥7Oh�k™­6³y‹»Å›/¯1fÒì„´ÛåZµŽHÀnx¬\•C‘ƒ~ €škšEß{ uÞBUÅÓÖ­–˜Î*÷ÍÁpjßú,¬^;[IÀ'½åCBƨrÆÓ¤C·z›û@ð½åäzö\1&Ç…vØ`‹zlÀó|QkÇÓG�óˆY›Ñ›qÈ’—`Y&ÇÑ9(„Û;ºIfÞ/)qi¯{C`=˜×O—�CÛ­×Ø»žX\‘a¨Dâá·¹Ú¯u‘åâP‡Ï9\ÈæŽÊ½«ó½¯£‹K�CàjŠ.qÞ2Úºzø@͘C#y ?@ÖgœÝáE e†ï¦ ìOÚû?6 Y›Aí¦A¥û|ïÃw]×xĤT�0¥·2mz®Ã©ò1 „{¸rÈΓ\Ó>…�lr7ȓݬr ˆS£k€*:Q«•Ø(QF]³®õ½1ÜyÞÚ�è Bç³ñWÎuÑm°•AÝ´‘O‹Lë5œ'f5ËYÈ^÷¿S#A�5xã¯xA•‹•˜$¬«�‡—䦭±ÒË�Fu=j`Ñ÷ ö¸Uà Z1®{²£�dŽÉ1°Uòžë25´™¼²6ÀŽºz4ÀîŸé ménhæl’Á |ûedg!¯–T 2Ý©`ÄἨ->_6Þ¢—BAܹ¨_ö�r£¡üûŒØ .^,¤cÞÈ\Ø� ;’âUä}ãÀ“+@pÚ{£0¾2ò36ù\ѯí‡A€ŒÈw@ÜgH†Øÿ5O&ŒÔ’9&·n Fgü› �Mî;lç-lýÅKX‹û?EªËj¥¬ ¹SÔù%k RËXI|¯dµ`'tŒHFœd‹(j¤–sX¯Õp (ìY(v Ñt •E†¡ßGi Цù} ÷Ã@_Ð[!=â,$¶r „¨}êß¡ÑÞ²«róÙ¤t”i®KÜ!œEƒ™žS_…eWwÆ«t¼¬ä–â�¥Å»Ýl:¶)¶¸‹iܬ];éM¡w%_†ÂÝ—�áä1°úù‡§7 Óçî`tæoòè¾ôö2!cÜè:àÆ–ÑßÞ F”6Š‘9À`Eèÿ!xâwÙÞnéW²àßíÕ*o� p…²°SZàa‹’äxJ¨ÚRÕHؘ›ÌÒx»…\þ5 =ºÃ?5vŸ¯K(}‘&ß#ïŒsWÕ–9Œe¥8šºäZ§ oÓúÀŒE…橳Ýìì[Zj•æ$¿Vk¾ZÃÙYÿ–m½Î;£¿!ÆùvÕ”û¾fÍmWŸ¢³•ðV.ûß!=ìèº5lŸjVíÕ(9‹„†Ë Ž푼+´6*й¹‹[Í[E²U·�I gòŒ,AjÅÛ­÷ßgñ­¼'FEÑëÚÂÍž@O¸@�¡0T–HÆ#ÊaŽì¼ÁEß‹îÇIø¥)LñºÉöô-ÞoP¬kGÅ~¯KzwKÞ¾‰¡‡Ÿ>{ðëØYöï}FÁµ.�¢]ÙBfxX]Ú^oHr|BƒÛ'ìÝ–sñ5ó¬àuOkq]ÞI…úš˜žÅ^"þàNœO/m8zÿ`#h¡—ÇÕ|T‰¢œÜñV¾ßÏŽ‚þÞKê±ëŨî*túÛh ôަI}| ÐŒ?YûÕ]îùÚ3Ü߆r(*Ø ì “iœ`ô$uÌÊÄ¡%‘_·†ç@\Ÿõ”‚œ,F˹�Å¥ý›±Îj1P—qÔ»�½GFèix­7¿l;ÄW�ë‡ß£H_`±äÀ êê"P)JPùb³²+{…¯8�7÷«T,âûíNÚÐÔ½%lf<`¹=\À×_u…³Ü=|ý”,Em€\û°^Åc6;ppÄ`=.´]ï`^Ð\BÕE³¸èY+åZr¸63Ìà>Ê}Hå39†;fÛzƉ·ä‚\Ä0 (WS¦ã´ÉÎ{ß`µ*ÇÜÛÏò P”¥pËímXÁ{�ï•ö°îgìè+C\�0jLš³!ÑζsWô=)ÞQ}m’¯¶nVÄ+ª=^úõ$ãÞ¤Í ­ƒ3)ñ]ŸA¦w,eùà˜¾�šêmÑ{úZ„¶m˜£xó—Ã[Ý¢;ˆ CÝ;]qIùÿï‡þkK–·O¾Ç…@Ô›i¯²••�i¾§ûVÍD©¡08_Eô½Ño€s�µ±‹y)eº±›ÿa*…d, ~„Ní\Jq<€½®LÇ.á?´ÄÃÞÏ…õvß}ÅìpŸî:k‚p�$ã}Àgãé ×Ï÷gîq@Lêîî5â›0S†gÑMîÙûQÀÒ\ oŸ.鯃 ҲݒÂïxg»Ù'šÐŒžP#�Èñ_ '”.’‹?`#ÎÀÝ›cǾýò¢…)¡…ý¬qø�ÙëcœöG_'qœ}l<æ° ëïyé;á´"(¥ûrË�œg6¨¶p,¬ˆ~eŹ=‹‘×Û«o|«0ü¸öÙ1ê~g�¥‡ñ£m+ìsˆa „†�u´‡³3j†�2¸”ÙNŠÛX™°r0Ý4eéñmÕTcT;ì—}}Ér5ßKìS( �.ñ%‹†·‰ïŽùm²þ±'vMŠî2B‡Hs>ý…{@ª1€9Â#ú:ê"EO‚™µ=Æþ$aÃ`-h ·="j¹™ùþŒUÚBYà;Æ,r7‹øŽô:¨h ¨/O8Ó‡o³n@0˜.ìÆ6Æ0H+ì%iÿ+‡^ý½t´ã0V$ÕIb-9bþ¢;Øéåø7Ã,çƒH\•H6—ígxévHžÎí”�›)5ÙŸR¦ÌÐvk‹t€o{Ž«¯¥ 9,Ü/Šj… ì·d-�ÍÃa‰Þ|É¿vtõEuva¶ë½ ¼[QÔ¡WuÁµ(Ûb<Ö²Ó·D Iζ)‚’2XE£Š›æß»u’ªÉN(SŒv’}ðFd.š0´O�¯S-'èÏš² 7,»pöÇìS]šÚ`Ó*£d¨mÜ–ƒxQþCKÝPÏÜ0ÄÎÁç&ààŸÀkÇ œXáè‰á­f}·Cä½—#'¹m‰¦,vùho[EéÔ?³íë wÒ/»˜H þ»´TŠ?ѽ)æœ+kîgÁ±ÍqÐ.±áL-?~\m¯œ�7jÝËê/Íy8~qÈ…¶JÕw-“VADÁ7M™mVAŽL:ÂoEÁ·¼^6¨)ÊxQ…ÙØpØy*¶Ÿ‰wÎBÁ鈦`ŒSA­ïˆùyà ½n¬%åö°Ý8®v̯§ý-ß~^sDø0¸8ãvæÕqh©ißW1)˜ç æ8ŒbÏ–]oMR`T%³{àBç|Ì…ÁkqÖÓi+�ƒʦïyÑÏ$Ñò±{|�¯†éN±3p|¿`y˜eÎãEŸÏKK‹\z°ž¨Òϼ­êYË6Êõy@ᬃ«"©dCrÔ>U�mšÁ±È†dBÈ’›&·bÔA‹òÐ Juu¶®’'×e!V)•«a§r1Ns;P̺_ué‰EË£QÊ_üüÕN7˜å‰�¯ùn"ã·LßMO‡U+~D¯X*k-¬ý,ÇWVÖö]]›€aRÚX^‚¸ŒZ†t ŠÐV± ‚ŒcÆgœáÕF2½BhtxÆ ¾q¥í•°î=˜±@þjŠ@u"`vKnMõ`’-=Ÿ eh¯Jî—©ÈÐzê.çÛÙFœv¬Il£w܆lP€ÈIo´WL*7*Öõ¸ìñëØ�1/yÃÖB§[?gÆ~j�NÛÙ�`Asƒk¥pÚ-Ìi7TE«üÏòÞf‡;·ÚØ«�VyŒkÜc|ríoñ|ãö7%¡¼¨lRÒ0ÀDå�»C©ÁÙÈ<`ÀØÔë+-µà{» ‰f`Ú™…“�šó†ù°PÛö>˜; rçiãº[ë%ccµ0hžî�Û!�Ù^ƒÎ¸¢ÃܘÉÈUñ8Iᬙ>C¨€L­èa÷‘]ä�6GM8}kím´ ÷x•Ïßò� õ¸~·Š‚­±ÆjE:/‰ƒ7�rÇÂÄ]¸B¬iÎ?9Bê�š]•ØpÅû¼í\§È¢ñ! …÷Êí–°Ãü‘£ÕV‹6€V ]~-üZk+¬§>ÙÜUáï>w³zÎ0Žgº.=›ÉÅË3x¡cº;.ÜÓ}yû{­ozf’x hQCŠ£pŽG….Û‰�sôâùè^v*U€Æ)Qego"yEŠõ#,,ι–œªÆX'}Åm2.è€5Ufж˜%-S<éŽ÷kgSBÝÈJjáçà1CÄÈ*Eºç‹¨˜ ÆÒÛ-ÃqC%`©NÄ®D¯@G2…ÁGËÔÖFĽ…Žhh?»‡L¬W“Nˆþô°ârvœg»§¿D䆸J‰Ó\s,Là»Õ�ô:û9=‡ÆöÐþ ÌÂ6$zÇdý®N­ÒYè›ò‰Ïì×눷‘Íõ»á³<Ãdp )d[1­™u¢Ø�!f„ºÅ7ËëZëƒbZ=Ñ¥ypÍ�¤»IÍ�D0¼Øœ5««ßPq_Ž�è’ô��š&ƒn_.L•Þ"l~‹›ãa¼°©Ð" ÆmS±âëeYÉÀŸÚ5BÓš%¦¡ð7Š9œ@‹oÞùWã ñBBÁÝ–ÄèzŠr}ƒ É©Yzã .Ú-8li÷»Ûs„Ðä§)É+ÂY%w‡»{O+•xC6µèí‹Í”’r¬CÑ»sŠ æºŠ87†5‡µªE$žÔŸ Üܶh�ðv9è­²šU~¦•¼7oçÞl÷ú+VáV>I⨓š‚k'€Èn®UA•ÄÌA‰P%â ¯¹²?æ³0¢M´áÌX•›ûKøi ”?Æ^ ·qkÞ¤[Î{º uÂÜ„r{6.¨‚ð’Û¯êÅõXÈnðÇ*y¾N~˜¥ ÞOJá|û#AÞûN«¶Èx^-�ñ[‹ÚˆÌa E Ó§÷‰c…Ü'-VÇQ“0™xôÞ²Úw ƒXŠí‡�ªkn¤÷­b(SÖX Æð[»æÇ�hC‰æ%uÙWé_éøÑˆ;M²šˆím;M˜v8SÑí²é³þ‰+w�@�nç‰<,uè£ ËÑÆ­ª01ûZ@qQþ›ñäCܱ„ÖBždpÞyÛLjå�„cMŽyN͹Õ�5šÒ¤j>•B¸<ñÚ=j�4ÐM[‚þ �ÅsR˱äÖÁ.«u,Í¿/‚f1 f3AâæÐó!�h.ß0,D`Y’Ôr¤ Öu¬ÒñÝñïaðiAŸM{�6!yz+ß„µ¤î–qr½%ð@¸7’i5߇Íi”XÚÎì"$^‘Õªì¦Zè÷@+²×:f9b$ñ„¶´ø #Y„-¯!vÎ(+ûmË'Ø\¼™1U#ÖQ°Ìh5·>WEFü‚^×Ò�!üÝÝ`'ðªœo–³`‡YùªË�[cNéæyE‡:À‹ÕP�êt†!ˆ#…9ãö<õFeÞºdÞsÓõ»ÅߌA›)V#†dào¦H:íátoc– Mo˜ ëûÕ0ûì¸ÁšãnYD׌ÊIûÉÈ(£1Q,hPD"NóS㟘 mfàëoiï·«�‹]Ù!¨<'±X‰ãJ Öb!Øt.­ßV�k>4Lv ž”y¹ÐbØ`Ì’¯C;Å‚èÇ}gOXòÒSô:r —êìo¿•~N ƒ–>Ÿ_ê¯7ÚÌ'»+|ÀjX¿-ÍÕôîÍN\B–ëïY´eº•T ›�âû¼XÐŒˆøEkkQ2r­îEÇ'O)DµËªÑºk¦ëé§ÑS UÝd¥ÊÀØ<·ñèFî nË{Y§ð®\HI_×ÖÔ sX'À }Ű݇¼²y�ÖV“A€ < º÷ììf…Û‚±=Çu`½Nš±XôÈ,¹­ô�žE-Mr‚GÎ ïVDZýšÙµkæø…Ü@uxÃ:no{w½{”(³ï °”'ºß\xÚ«‘ööÒ–,v-±'çÚ¦± p‘ —dCäp’oÖÆm²í�þ<ß'–®ÒG'ã(àñLo L=ˆY%â!áߘ5U°Žk?-òýt‚ÕÌ Q/½lÜ“¡oÊ�E6îU_þ@߯ßYt§|ô Âægu¹ƾʮ�ö±‹.µ½­•›ÀÄ7Xþ±I¦ç>d‡´ZÓ�mº÷XoÚ”3Ýàn|½WxA[Ø^Z@«1ÔËá‚Ë÷•m­q-í®�‚lz…N:ùxß]O-¡<Ç·÷)÷Њaö<·ÇÑš æ)5+ÂI^ŸÉ"Ûæ®eHæÓÆ•,Eb£«Ùpìû±ëÎ󯽋\=i¨jüJœ×;�xa0‚8@¸¹“'¯÷˯‚tGÞkÐñ!{„Ó¼ÄۙϻÝ#Ç€Î’èø¥W< RŠ>B?Û�m@b× (È%/xÔ°hV%b/n­ã1º—{?Pb~0à¨.�½ç;`ø »G¡QAÄâM>çÒã|BøµðYYØYxzÍç%PaŸ¸ð´“-;¶x|d|I "} oso˯Óg©¼£±DNYøí°úé6¶6À{^K-«‹n½–“[�¦ñí4~,»ÝÞD;:ǸI ÐáÎ…-!e�O0[D°éæQ†‹þ»w‘¨¶»öK[ê_ŸcI�³ož¿�*íKwgÎK¦ÇŒ"ZÓÚzðg¡‹l�“nÕüè[PjN^4ý[3 §™½¥$k ­‹QÄÚC#ˆ;‰çñÆûàŒ™Hµð ЏòùfÚ\XÈ=ÜE¶ÓmSŽ|)Ä-yNWî¸w|DǨ¤SÇ®üüØQýUW%r',¸`$é¾Îëhmô~~[u½d^ô3Á<mkP�¹ ¤|½E� êÙk€Û(ËcµâeÛQÉÄ$£îc“¾q_vÎäq`%ëk‚a7_…ÑìÝ´7¿b'â €êã˜Tg´÷R>"\bü_7žòqª«P–¼ÅúȽ‹Ü–åËË÷ÈG«šŽìΚmê‰×”¨ÿqbÅ!#AüÌs‹Q Uûr3cqêÕsÉV�n³R5ïY–�§bØÝµ7Ýp_»µi‹ƒÎoR>Ý °{tËqJ9è÷)‡‘⊡À�ë›è@«{óZeÖóÖ‘(¹E²†° }]ÈP:N§ë£Újyرù¾½Å½nç}ðy:òÊR€PSý” ¥6)@ R” öú?X6k^{�Sâ@LÍŸÓGGpë6¶b!hM6è�¾�nóme“dôçs³Œ/ö”’4iˆ|îÕEK‹‰›$¸ß³ËKÉÒ$Ô ª ãQM«W{—¼T–h™Ï ”´F‘9 "á¹Ý¸ÅêÌO�|ú­‰ô³dÛÙˆÙB^Lîâ*C¨¿/¹%nMË=Ü+@).‘—,ˆÎ{(½±ËL‰C�ÆmÇ fÙȆ… ¬Ú»æŒOöÔ?cfái£*ÖJ®š²Ž4ó~ÑôC¿b:K¶µ[ÔOUkãÙcn¤Ñ·–Çw�X§u[™-ò0~ÂØ™F6_^ÝóXn¦‰¢Ÿ§{ìãS!éô®û\µïö´ÄdÿD—æšÈ®”úøEÝFk‰#ÃsZAã8‡HQÔà‘¶Q?_Úƒ»ñAwš"ÝWt„Ú#M“)íò ؃­ª£lDŒö°Rt³Ùxcü|¸®Tì4)ašï&m=äñ°ˆ`ø²+†_…ýXk¨[Ë«kcù~¨Ývx+Õ…Ö‡³©I¯º”Xæí ·+OÕk¿/Œ:^N.w³†>tÃ{¨MSÛ�`«ÌÑý´ømú5!��&Å@ˆ”°_i¿0õ ÏBÀù±�‹†³t0HVÄív¼y%gƒìÛwŒèÁfÜEMʱìr#ÉB¢3FvOÏà÷»iÚëM(Dîrï‰Ðf´wgÌ�^“=­Eï%ÒE¿¸Cd‡'צ-Ûf†’ýÈFÙÓ «Í‰1€à,oÏœÝ_KÏo¨ÖÆ–RÅ!!J#¿-åA³qÆ›§6XÁ§Ö¯-€n=4®îH º‹.èóß©ÆÐ—êHêçKÌãŠ>¾Sa‰�6!êþ¾OÁÇFCêpC ªÓÙœå› ëriTE³ÃŠ%ãîN2ôzª�L‹ÑY,EÅó—6-Ý2ç׿U66|Ój… (°ÁÛ¢wf”+4î5·ì×Zë{…‘À¨ÕCOçÝb®&lª¿G´÷5â-�aÁÉ¿qU—‹m,y˜ví9Ú²É5¯F¤·_\c��üAŒ¸ñFû—‰9A¥w,#usùý»a7ûLoÙÐ2íy�AðpPj$€W¶ÚÏ^Óbù-Õôl€üpƺ¹¬³Ž9œøO$U^hƒ0-k,eZ¯j"ì�ë†}ÑrõÛ› `…Æ^š�”ë)ÓVè`sæüæN–WÅ#5�¬•ÃD.bk]I šÅ¤ nkׯ3‘ÄØÂ8-Á_š¶ìÃøA<÷ÌÚ låð°Xh=õ I‡¾k�ƒ/±¼‘AÍÿX~öU2ÄîÌ×åEÜ_nècúÃL·wˆ4|´ãîÎ@‹8­rÚ*s‡+¬:¨‚§ù¢À‡>kt þŸ€‡ÇqG.V®?YO 7¹€ý%2ÛÖ`ícÛÅÐ&1i]"À¶ªó; ê×hñ“\@s,­r\0ßÅÖÏ!�¶«Ä Rü{²�|õ7gÑoIËYC~6ùÃÆîñ|#.ºàþx{¨yéu›G° Ö\曳eOj jÙ "LhE ;,$ÔLÙ“5�Û]‘~>ÆÆfþYÌ=D1€™Ž�ÙW敽ÃpnQqu£¹±·é·3ä�0s”=6L»ÀœWVo­k\W�ZâbsÒâã=óì¿wuÁû1ß§„« €X÷ƒiâ+è~BòcEFKJœ/¬DE³²Àþ²¼o+†™'¨Md-ÙD°KÐ}‚Gè;Õä@϶^§¢“š„æ‘s×mÀׯåie ÜeÏ7à>Æ~—ÿ/Gø¨¾ó0@í!:ÌYÜ@Èì:ÝÉtY|ÎgùéK?D,d7f¾êHÀêǰ5µú;†ïfÙzÆ~œÇ*<£bq©Ê>/˜ÇqÛ�aë:^Ú²ÀSR7T¨Ác#N%Ã2ù’=†éZNÆí¬20uä×7” Ú˜°'üœ([®¿B2âžÅ¶q×R=ó{”C?zÀXáý$›S:ÍÅ퇥ì_º Œ ûwÛemt3Dcåù ªÄ]l¹x»Ö«R6ÕêmëJ§@E¶Ö¨ÙhâØ²0°9>,É›î­vf¹X€gǵQ¼d¹ÝV�'v»‘ê=±o¹™¬5ÃYbìà¯ûÐè!ÉÊùÈõçx�)!G(â4Þú²ÒZáþ+öæl/V0=BcÜeÖÞ ±¡ž­^)¦È,JŒ^÷lüÒ:"pn`·* ‚Þ $U¨eW3p8£}TV¹ê¼ôú |a>»ü‘fy±ÖÓ¾sÝ£{ê Øi<Ýa÷ß×ð‹¡{?š×¨øÊ¸¤¿Woƒ� =ÌKç;eÙ#"gEîìuæñÀº—®°�ká´_½–P•1ØÑ ÃÑ}~Ò”hÙþvÃN)ÔNËvÜ—Ñ|ÙÁç:µC·ñgqAHÃZY0% %�t”- Ú8¢TÉoÍ{KˆÌV«û@“«�Ç[fŽ€J�R’^ƒ·Qo%&õ¶ ÕØdW.8h‹'Bz¯ŠÝÌÁSðáå�4ÿh ýN$]!Ž1Ïb»B\}k~°ãë4ëy–Ê$ÒX]ÿˆ¹tn¹\ô2ÅÀØ(Fä ºÎv3–¿èùßh–mÃß3ã×õŸ»ÏboÝvªZw2÷ÝŒ$JÎcCU�Tj˜ߌÄZfÎ'3§ö*7œñåhtTb`dÊòa­¶8FõZþ–ÝÂêP!Î^›mVœÎWÞ@±¾\È0º˜„ðnh+af+ã·À†¤ T›ô°Xu*A£ÛǪ̈0ÝÈë9vÁaÁ»j HWúà�]û ‰Í bHËIèE¸wÖîöq�yes¿¥S`8+ŽBaÍK§ÀÍÛb\l8­ò²*€�¡Ž'\IcÁc|[’\~.ì•Ïb‡î±ƒ…É�$ ñÒÀ]`P2�)V8àCZ“MgÕ¨�t}N�CaÊ0Ç58¤{Ç/‹µïE\�–ٸٟÂX7îF¸� ³Œ_·‡¶£3k÷¸ˆäÞ)«¬Q- ¡Œ·ˆÞ ¬ËkæQÂn@)ª�”§Õœ¯WAZ<$' ó†Â{¶V´lõ-]߯"/}ع½`4r¡z†¡BÈ…¥sºt� {x1cTwfwøR`>ËpJóÀ¶§¸IÜ<ÛžÕò5æ’ÈA¥>f„÷£G²î$æ½jÏÜ5^ˆj~=ýŒMàæ ù@4‰ÞSÒMòÔr×»’“œ¯œû‚$iÔôªè![[dµÀÄy‘! 1¦OAXEЙ7Ü–Èð†ÛP-å\wÅ+�›±æ¾5í¯½áýÅ.ñU1¢brdÓÃqGapú²û¶ ÷‹Qß ðö°†!©_ä #,|€x`<‘`ÙµYuâ�ÕîÃð CYÓì%ƒ²x«;ÜßqÕùÌÔRÏm{W¬Í÷CUfïÈt\hé¯^Zظ}†™øGc¡µIÙ…<ý±è*×5%¤¤Ú\vÈ‹Ÿ©’Á7OÖ:ûíx­lÑöëõ‰C–ÁÐ,>Éi]4�ÖEŠuF†1iµçÎø!ÑL[ØÅÕôÛÄÞˆÄÙŒ,·ù,Fàx•KHí€×2ȧ÷}}^Ô¦³‡D6à­p“6&Œ÷7¿ »Íý›þê¤|­´�1éÑñ>ÅÆÂu7|t«Ýu6|ì÷9ÕºT>óo$\42ª~”…P¾D¯Ì}vºöòU�úý7�u;}­ìÄ( d>"w K¡ëiÊ Mt¯’.%ù»Óo»f¶ð€ÚZå¦Éj¼}Èû8Ž�ë$è‹Î¯yŒ“b�#sÙQÎ�´Cv1×~ L #3„kZa&\å½dîÃqáÐt™û\jT ¾OàbiŸ2C/ßpÁ™û¯�šêŒq�–E[ùr5ë8Pt$PÐP‚À“÷ÖèY¶.5vLXó[\±ý°IY{¢ïWdŽç9w+X+éÞÊG4 ŠØÃ3ôì™`P¨ÌÚ‘¦Ü·V­IQLú¾u§¾Ë©ì;ÅV{ýfŒ™t€±s6Û`Hí•¶a7Ksãꥨ |¹«�ôÃi°ú#Ù2̰×Yà­›QõV³ŽÖ&â,,Vl ‚Aª!D•j/ÑÆë é¿·�L ]B„�"œÖ£°ZD2–Ä+®E·�Æ’(-NŠé…plÕS¿0§p?8È9¸ßEáw‡™”OÙpµ1Z'ü¹D™n€žû¸gTy%q…tƒcã*Sß[2ŽHžyªËp0 ÖZpÝÂq¨bLnߨXãetˆ;k·0Ć8­Œ>C§g¨!ÁàR‡Þ¶sÊ=ò/k¿'+�¶£@â‘xð|‚m¶Z9TÇ€ãVK�ÆÀ®ÔDÆfÏ€ˆñB¡él �ŽÔ·€«Õ ö\ò(µ6/Us¹)¥xþ_ápKQ�k=/A¬Ÿ4ñ/­P&ßÁ£Dä|iBßÝoîàט>àÎ^×—ÚE«ˆöY†k¾nݧ…�Ì*{GY�š �6î pyÅoåJãg„×M*]L/V¸ñ7[~Kñù+lØ *I±K³�ü´²{fÐ$lžÖ2D h¹yqëqaƒ®#ØÜ0¢o® Ô¾“ÅÜ]ñÓè®=ÚT)¨Œ °ÈÇ.ãfÞØ w¼¦ÙÛ:Úã œ‰¸œÐà»Òù(/J7×C1CÉ�ˆ ÕÂä·òÈn211£ ¾1\Ç>’ßL/ËTœI³�n�ôàÀ†á¤*ËðÞÍs+ ý4u„óŠ ¥¥y}_µ3º¶m\ÔæÏ½Í©1; Fâl…_4(ŒXÝáXÛ}zå{£ó�uØëõ à ï±'éïT²¸¶9¨"Œ‚ÞŽUV_m™ç Ð`p‚x¼mÍC¾ŒvÏ[ΠˆZZ-ØæÓÞéûZbKõ`íX™¤ ˆ!¶u9ãötÈãUbª?þÓ�kî á÷©¬‰ÍwFø"–ɑ0�Ø]NjÛÞo gØd/>n¤m÷MµÝÝB;´ïT8Ç[N$µ±<AcÛ —­ + ÝŽÕ¥õ·VvWÂîÚ˜l¨îÄYcJ…* wÀršùúyŽË|Ü@É™=íš™­§³f!¨WLÀÃf@rfãDû›ægìç¨nCœ`˜XMΣ �@rBù‚º×ÝÀ’œàÇKV6-àƒ²iÛEŸE·@™Ïu›æ®TŽ+J ž¬³�òÖ�4ê†^ï\>Âsô·Špî»V\O„Û£@"„áqØ’ö)¬ÝwnÑo¤¨ñl ÛU�ßmðÉo#^ŽÅÄ1Ÿ�ùß�ù‘{ó! î÷÷ƒ ÀX—îf"×Eá>|eóÛÉ’+ ¥ÅȤ®}+—ŒÈ�šÛÜÀÓZ[V½³V.]¼¯H98�6Ó— s»ñëið†w–Åú¬†ÛÑhúT:Ît|Uû]4ÇZ«»8{î:7 ÃlAUH•O9fʚجµÆÃœÅ[xmÚ6 x]Ä=öd÷t!+HƒÐŠ*Oʶ uÖ\Vd®çô.÷àÆK—æ—îx2JÁ`wìØz+8=Sß;“K>F5«6|d¼ß¶Ä«asYÕ[k‘ïœð64½ÍÑGln¦©ç²;†x\xz!«îìJ’¡ƒ¸˜š—ZÛ­%XC ¼°bEÞ‹7ÅÕhÊ mKÍàΉ�JÖŒ,à¤QÑä÷Am¯ÛÜímS£d±¨º8ÜS1w³bÚrW È$µž§â×hÇ»à -X+˜­ö7§uÙò ³i4^²Åù‰&N=’ÊxW½fŒËÕ‹Z¸íŽô¿‘Z«/‘fßÛeY7 UÐP°‚3Å¢w¼îAt—WØ‹/hŠŽàHÅ—wã;4¦53ðÔzRU»sÍM(°žB¯�-µ&“vë*ÖòÅ$·Ë¦àúVp ÷fµ¢æ†’@�rzjY»æ7NÁó†ãîòsÉôΦô¯§î±Ë^³Ã¡„–Éí©ubJœ½Â1 °¢D\ܵè1Þ_J û¼ÖB' ûÁ7‹wÐà¤+ÌèâLŸj'>�Œ‚8 •–Ò+1//OÉpòu­:í‘sM*ÒU­±…ýÕ›6)t©¬»#UO,2|¾.bÉ­öÄwJ†ÎT©QŽcgÀí£ô̰IQ…D¬×�~ü2qDUŽw`´ã*�6›¿b†ÜÈA6¾£\b³wú·†Šxœò¦=Ù'²g‰Ù;ê;²R+ždç¾2@Üc{V‡tü¤°^\ú­ÇæÜ�Rá»í‘{Õ(];©`&.5è•‚î±£×GmC°¯%jkU6ÆRçã¦Äî¿M¢Á5’»äæ ‚Õ¨½jͦ® ÖîØdœ…©°�P¸äaƼótào«Xw|?ˆt¨T éø®^¯2Â�v{›ñ ¹AÓ,HZ[¸Û˰odƒ^doY(bö®UsÌt­`tJ¤ý"ö½Öë<¦æ{²Øgë¡âòÈ¢ûúøð¢¾Fi´@íÊK Ë‚u�ÛiÍ xdÐEàáƒxë-»ýÓØ4�—î-}Žæýヒu[¶hµ½÷ �5bÓ%TÓ�†Ré=&¨8: Ï)vÔô8¯ON¢Ï{²³]ˆ#‚Wu|öoËU³|-N­·öQ„öï`*£†»÷Y1ü6º´PÈ®9·½ãr9·l±Íªªëa½õñ�¤²¤ 1GlSkÚ¥ ¨­›—×±ÙÞ0@œC®ŒZo½]µÃm:êÐÝ«ª¿Û翞r÷s8¯¶À4{¢\!Ùx9‘• ¢‹9>‚!Iúè·è:"/-kä�ÛQqg6µ¶V® çv Öã�jXmU‰Üc©ÂÀÅ,Hý ñ‹½Ïh‡FÌ9Ð[µFï_`…ËcÏjµöè–Ž`yAb,Ú¦~¯k,–?C_0û÷b©7‘¦ÆÌ•K£àáó•ôTî]B¾âÀâ‡}ËüÈûÑýìGCÐôfÀ¼Œ_AÔV&´½I£Ã¶¶Au#oÜ­�yšQÿCÊacñu-Û§Í›Åâ< ¬¡œ7h!ÊW65 —¤oŒ³�§4A…P{åÖæŒøzɦµ[6Ïx®ßêNù)ôK>Îbçœlgxã–î�`¾ÓCIÚ|–J]B‚{c+Û›¬m±©nëÊÆ±•×–YªÈÛðTg€i4ÛÅúNÛ­Úú]ß®'VCVÅ5·FÓÈ÷› Œ!hE'‘¯ËÛOÁajécgŸÛÆê¾=¶æ Š�µMÒÅ�¼x{.{—<šA»¯;Wñ± w,™³Q�WÅÎŒäF»éå‹�¼G‚ÃÓ™÷Í«’Ã9<9êÂ� Á½îÆeûé²ñôáÌu¿gS�N]–ëN3aô Å3_5ú…öû¶"+¢éï­|íK‹­–ÌLع­îX’)–â¢À/ˆŽüÄ*Ñ0 |Ô_oGúñmÕ€Ù)‚¡TlxNaÈ>Pq\b΂¤žBáÖËì:1¹\—<b€îü¤d” ªFì ºò¾„tk=Tõô8fÙ–‹’½}F¬Iø* z%í,TÞ…wr9[¼í\{yAò¤»'#£|£ð&¦ˆ!+1Ƶ’N û¢1š³ Ãß!ë_ijÆ™ã'Dè€cÝP]úpλڰƒ‰,�Hq¢¼«UÞ7¾b;¥Þį»[içeÞƒ¸å5ÿQÞÉ[žF'x)}Zhž0vnZõ+h�ôë;Øï$ü^b'måÛ�kÃÙeäìn7.ݳ”ooÐ7Ôs ¦ï•w§›òù«Žšðò,$¦-“Å’t\¬ÈTpQÐ3 L!ãÉ£>tZ‚°«rÄtMñgX:Áþ,çÙÁC¡f4‰Ó%âYÖ®¶˜r—g “7®=À‚�²‚tØ û“]\ÞEµùx†8�5ÑèèÉ­�RÑ årÙÃnë½^ÊoÞØFX9ÚÂkEtHC_Zf¾>Ü#•°87–í•Ã�Ÿße‰‘jxòİ-úyT»îêõˆA,ï¹é…¸½¨+âó÷°/»ù¶zåöQ¨öÜA A«NU”Ä…í"nÔ``œ:„&*s+_®5 QÁÃ_ÆÐT×Å[vºSj�xi‰åµŸ–±„b ïÄÛ®�w~1âAðøk#Cü³ª¸{Ì÷Ó%üö æ›pn7†­ÉbÜÌFŠŒZs÷Ô|¨[¯CïÓõ7¤2�¢-僎�“ô²k�‡„¾|øû!W½Ÿäûëaˆ¬‰Ä©ê›²ïÜŒ¼ø,QöÒ:…P2Øâ½mMÁÄoAw9»^* 8d–@›ô=¬ ðdèf?4óÓX ó,™B ¶)Uʈ\lvV…£–º a(Œõ›;¦—Ñoûú ¿¾Ü" «¥ºÃWÁÜKÐb˜³Ë=š…öáAËsTÀ úô#~óMA „̈́ٔ¾X6ú_›-¥ÃøŠå­‡._3¥³<‘¬•1–ü]9û¾oœ²¨Y ÉýfÄ&S„Xrp‚Ä9uðì¤gqI¿L#MïF§ ÑntÖxaù•Ü ÖšZ ùܤܑªì…B)Ñî!æ_§+Mn­áT{aO¼Ðl2÷Ü•w£¿spdöÚRªá¼ákTŸr�{½ xs¨+^´å�G¥lóÎc‰K~ôþ|F èWq-%¢Ê mk .�Ù¸–hœ_I¯)jVô©´ô:Ž  †Øóï±ÀR%eïõ΂2 Æ«ÒýÀ®ìòúÙd �×h¶VW"šiV¼Òß$µ Î÷g åf’ho¹³Â�ëå á÷ä[—1»ás–3!〽͈Ód»âõÑU°cǺ+_x²YW7§¦m×:„Ó£ è_qÈ Æç–£K–®HsöæÀu»#á/ñúÀ#•À÷iÀ¿gTˆó-c ÑH#ýϬËr&í§ªC›�¡QáˆRWúʶPé>g8²Ý[×¾+Y¿D[°’%­g¾‡48A»X騘/%öqv1@ùU)¯g-§[`À¯eÉxiƳùò,öÂß¡™“¸([ÙÝLˆèEª Eo¦—!ï…ysšá—/i±Ç<%WR­,¯òm§fзrtXÛ�ç�¶´"¼ÍX˜ÓL§«è™Wc¯e|ërD;;lÈ,j{æôѪ@ÍùÞ‚iE…7,º¢Œ»ÙàT¡!{ʾ1ËëoVVÖ@øÍï' p;Šœ_Ç߉–p•b&T$AZý¿ºüÄ—=pÊÝDþø„Òý™–ur_J½Ïõ®- O9Ujbl—³üLݺâØ‚Å@k%ü�¾Lxä_f"¸{Ó§álâÓëùÕñ‹Ó«Æ Ñf{¥ËAØ"þw¾sÛjFFv<,g£ÇÔÉÚÞ`Äøç)Î[ŒÝð,ˆöF†ÕJ–†…f›ç³ºÍœJ_4ÊtL^-Ú¥L5¬FÓøU%ϸwËbU q�ä ÷:Žïc`UÌšÒ-7D`z­¼¢£ó¨aŸ–öcVÀË£gäÙ’‹N£Öî1<}RÓ 'ŠB°VæíWÊÕ$dlÛ(ôÕvÓÀÒͪ@ƒUÄOIë{ËÞ¯ AÁ…ã¸r�GÔ„ âbøÎϳ'‘È0°àÙ[:ì€áªÀ±Œ=ä,–¼8:ÎóÁ 9Y.0‚¨RGwÌâÚ}.·t;ˆ9í`±)„ul_× ú…dî)Q�Ný†ç<£bMG‰({uݬ|…ÆõõYëOLCŸ`m…\þ] ^4Ówe‘Ôïþ=˜‡H‡Ûè8ƒö2•ÉR@Ù=%{u;öwò5Êëi¾D VPB ç‹lƒMœ“¬µ$¬{³PL <•|¬ˆÓWíÃGF͇ |öu‘ÎN‰„ª=sµµgÏ|êN$éÉ®-8>]È�ׇÊý‚ÄPnú¾(˜ š=EɺàÆÕ‘çdƒ �e‹n¶››Ö]ÈÖmD~_TëUœy掂§èo´ÙëÙ}rVÁEƒy@ætç×ò#eg kI±_‹ºÖiÒJ+YœRÁ,×®"Âõ§¶Î±oc94ß>9²õ¾orÐ7�ŸÍ…¶ëÜ.‘sÙ­h9ÉË„15þÄêo²•[s ´Ï˵†j‡ÝÆÆßsìx‡çÃŒñcõœ‚�ë,g0®ñ ¡)Æm¤^ýúuê~6bç³îì¡Ú�ž}y!°ÆD¥õ"^ l+HZÚi¡<“3MãŸ0f/Yúüo}!¢\W�¾�`#R­Ä:òCG¬ÓRƒpeDÆwÚD˜¡ø9¤Ck~´ÅZ&jF^íš·p^™²g]ÆgD€w²æX 7Ô-D_]ì˜3a‚sÑÔdñr· 7VŸMãuùšpv_|ÝÌÄßVPH÷6(ýƒª®uO' jç»-…á:\ßõbazðØÏ„}{…PÅï%55üY÷—Š'U½ ØOs7í‡QÍhªÁ¦|÷¬þÜ]5- äü ÑêïÁ™Í‘y5|¡fâTNŸÞ»+Do ;ÂC\@„`Dƒ{Àí9ý+_Ç,W…Q9~7Å›ñ÷¼Œíüù’RÁ\¨ÝËs±c�Ka ðÍʼnòéëN„T×IxeÝüÅn—ú¤1uç¬øQÚ*ãNßTíŸ&ÚL¹°È Õ)…ë�8Íâ²�«ƒ Órt)ô2ZŸæÙ ‹rÇŸ–׹С•øjèv!-f>ÇŽ«ßÃ�‚�ÚvM<Ä—¼{ âÑ _Р@¦ÉýòhÑÆÁó˜;QÙ9{Ë-ÇDÙ–f$ÍIr†y²ÅY¶ ÆmlbñÀ¬j9Tw0δ±òà _=€>ëJÝH=®¹!:Ôo@€˜éÁþËXV5fl8¾ÖCoŸ4³‡^�JÆÃÇÖ|íóu”ëœÔ=�u³öŨ=‹NÏ€ ÖÏ‚«_e™o•Fß!Ä×&Ö›DxÏÁC(½Ú¬²"/°a"ò:˜ôhs~*¾ŽßÁÀ|9"ÚÓ$¥3„5O·½ˆòaüͶ' v< ´ï+û ûËL‘ú¶Œ4Ø�¿ÕvoN8S~œ=ÙJèíyµW]à™r�º|îÚ´À/{™J �£º:‡� Øÿh6ý” |(†ûñc‘ú†bz¶‚ú×S+ñO!�ù2›ýæÇíŠçøæ²°ñn|#æ2c,r™³Ð>TUƒ-Œ£g\+ZC— Cöý¶o+*¦µêJÁ¯)¼m>¨è¹™Ç«’f[%�Öj›K­�Äü9Xsy~/P’ûÄ\÷Üz_%yyÎ óå4j0~­¾.V^~Ù‹bžµ Ò´#¿¦â²_·XiŒè=¾ƒ¼&ãR˜ lênuœi#Z0RúO¯ËtVG¶£ãÜ´Öτô7ôÍ4oSB:Ú#ñ,�µP€O}žè½ 2»£:‹Þ1Áñ"BM¬­�€æÅ³ùn·æŨî9ÝÍø×{}vÛ©UÎQ·»åeº€x4�£oÛ(ô{0Ú†ºÓYß|Å×SxqöáæÊR”¥24¦F‘b ú>Wò«ý�÷?Ïøÿ?mþ¹IŠ6*`()Dhj”|×"P�êþ¶ºà¦Vƨ �4"”¥ð;žÞ܉ÿ9ö©J]yö‹[Û�}kÖ” U«ïpÅuq;Ò”KåEŸ“`$Ä€Rå[`†««Ï ´¥Qô(ÐO¶!€¥H°ËeØ5ͦ&�@f•ÐëcµT5úÍéJ^t8óXÑ1nQeåâ. ÈZ¼æ0Ü;väñjR‘Ì g¶ÛTÙ\“Ôsš‡ÞK‡O·™  W.—Æn6 �4¤éCë½ãàòÀF s›c’(Ä„Ú3ÓüâÚ¶r„~å ÜZ+ÿ)aa)ñÌesüùui@YT³cáLƧý:™õ^ÁzÁaL«)3ºDë¦YðȦ&Š‘iÑÚè«PÑý—À;&ä,&TO6qy!8´ž!OjîB�'’f|v�wPE;%™<œu�2oš:ïî®jëp«P³ãU[›Ý¹6´J+M§£Ìlȇz¼ÛB| {^×tܶ–T.my1Å­}bj Ú³L üåž·ÌH`Gc¯ùŒì5S9c³‰“>Ý¥�€r¢Ö>ñm@¾ÞÛªXm¹h{ÔÂí!,µ@šH2õ °óž�­]l}„ Ž0· ƒÆ“²§²~l¯_66Íмm Y,›>_îêk†T€êVŒ]бú&Mðý²_3ÇÌêèóÙhÀ¿`ˆòºå?#—>oÖŠŽDI½-�(„ùžs¬¶�Ô°AÏ$*Q¯¡ÒÊ‚Vï\©’æ›@2jÚdk’ ]-Òc|/ÛÍœÙd�f�^þGÚ‡{%Ê›+&7bÒ03·G!¥ÎXlr_›�Y€MeÑþl�ÚFéñ½ár¨zì7ÑŒ dxSL žO ‡VI©·£ÚÈ/2d ÇÑž)ß‚ÐM›‘/)99M5óf”³f�»§W��ÁµŒÆRÊ眃èĬ)¬8Ó4xãú"é8“�ÿ>†¹\ع[ß¿i/›·óT‹X–�PæºÂxÞ ÝÀÂuM³å÷¨9Ï�‰AðN6J­uœ°ápÆ‚Ï$•ŸõÄÀh³Ž<ÆŸÀªì‘3¦<íâÍÙÏqͮʃ“v "�‚Í[Zî§·rÒ!ÏÀR½s�|krXùäÓj©ÈF@s«7}…�+%Ø‹›ÂJu×¼Èt“~¤Ä[š�Nl¤ÇÞ™N피îºd,[.¼7¯§a Ê™MÒÏ6p¾¢¯óe? ¤,g±ÙßáÇâÇ�y}w‘�rõÁ) ?RÂhÜr+cÝmØ8Ìšùëàž#.Tîo 6>³-1ÒÇ jUZÔf{=Û®Hù¨nµ`8¸ÞÚ¬çÕ�§]hWíÏ'Ѽã\ìi¿A¡ŒiY(è!å:`–·bŒéŽï€ÀDfWsY¸c¡zªOÕñSmo¾šeÑäÚõá�ö$rIôæíÉ�¤rp¸ŸK{à§o¨è!ƒ}Açm�¯²èÿ92$8+Ói„¬O»!ä}‰Ü#ä¾A ÿÝËxWÃ’ù|Ê+è_‹8\–ßn›á_È dÏ+•®èó¿‰[7ö4-"KÚY¢«'ÖÛo¤ "zûWl>�b1ò~åRÓNƒ·í¶ "7ÕßÕ|÷R¡NÜÂï-×ßÖÍYŽ3®PÉ¿ Õ5\…r¹xé oÚ+wÒP{²¸Ÿ÷­‘AE®‰~šd®¯[�a¶éßw*Žqx±a¨’]÷O³ïŸZ–ŠÃër=¾ ùɪ ˆ(lp J5àmÆzÚú�Ð\+n7ÝéZ²v4z·m­ ž-ˆþà ÓèƒÛ 2â‹rñ¢I¼Ý�;ÇaM™¹‡¾Æœ—Lt5Þ–d=U·vBpÁSç ±Sc¿nuªhl D6, ºË¨Ð¨ÀUQÅ\-µWc q;„$.2y+�\®d‰.@òvNaËée¬kXÙrN–S…�§×ðR%ÖF–ÊâW‘kÅ_H2ºm¦Ìü`÷.p”óÜŸ­2QX±G|;ü¶ð§KÖiõÝ�ÒùÔïaç; ÃÇÇ}ÆïÌÀÙ±*µ»+íþjõ „wy~Ç]¾×e!6õÞ˜ï£÷sª]=¤¥W”uSjn�:,ÆuOгÞו€fº|ÛV6š(­^@oêSÜ–Š70C€Î°‡£-(�µÖ—éÁ¬yóLÅö'+�ž¡ -Ä›Ùê;ÚUk~Úé×LŠ…‹:k¢øwðb«ÛY»Ú`cØD§ Í´.-нÃñ…\"zñžÏî ”2K«¹°¬$ß:«Øé¶p%äýOgXÑbDUs[” úö4›6¥Áðv¹;¼ ’f·k†7ãÖÐ3 ÌÆ8 ),” ! D¾~Ófk£€:zÜÜóÇ}à÷Ç:@%ÛÞò§¡yzÅ•ûX\Ó™ƒw€ˆÀFî]š *Ü{“ GrMvâ_zeûÇvÄ óµ�]£�þß*šcF=êÚÓ\PW¯¬º'à„rêãq’ZÓ}|zƒÎË_ñÉÎ2äz ç±SÑþÛÓ 5\±h±^g϶û8[J‡Üú€à9/bTƉ1�IqNiCEVì6X›bþÃ�—"[pdèñna]ÁfûÌjñ!pb¡à¿ô€ª¾£!!œÒÅrw˜9Ù„ë!…åò·/+6vž Õ'£¾žÛмÎÃ<®?%Z/Ý—]Qƒ¥£ÚÖæ5—¦}ƒ }šú×<ôùT%÷ÀÂ?ž1¥èh¸­ÜAíïHè_DNÄHÁ�¥F )¢´ÒŽ$ íb�pqƒÊd±… “z6ÀXû&ÁIT¯s²‚&!ÛŒ·‡Ù*}^6i{›FµiÐe«„Èͪ±œ*Ü~bÍŒŠM, ëR¬îi¨÷àžÐD›^n`q‘Û˜qçx‡ Þç¹H2ÇX$lL)ƒ¿š{hŽƒ ƒ¤ Ê–‘ Œ`ê7ù\'"Û þœ­°'ôyH*æø¥(DÝË9_ØiïÓט‹${)ǹ ºîÂÑr66™ tRö«ø}â…Wj*,ˆDG*¢õ�òTÉ}¹÷¶]NÛ!oQÛ“÷ÌøŠ`hq�È¢�èÎí4¾äÔ" p eü”ü‰S›\!Æ¢uw­Ù[v£ÛByÞçÒ¤¹1w‡¯¯¼n¦à‡A¨�Ø“pÌ]àuB;eF@L ,ñ˲‡ÆËt3¯¡„'(a8,�‚Ä£“1U€ìæ öþö,3’óàŽ'Ç}¸¯f#NÖ˾Çɼ¸nÍzÎà)þ+ˆm¶¿gQÞîðÕç�cÎýSŽþè"»b¶žÐÜ®cG: £7xfžì­K|®È1V´à}l?0°ƒ;çÚRìê½ $U™F9ݘ’þzËF´%±;é ;2:�uªYEí¥×+ä>íA ˆÓ‚ ³À8-ÉûQ´Cœ†‘ÒÂó 9lCè�¾–¬åJÓÎ+†lóÀÚpÊ~]™Ž,’Œ Šõ ‰[‡ÎOPç]D;P �N·=”p×¹x^^o.L<\Þ9æMòàëí‘ó‰Ð�g6�6ºˆrÄòN`䜼‚H±rg½±Fó‚ø:"“Ì[8gt~¶c—íê>™0µ°¹vl*mLLõéPÙvýÄ:ÝL‘S�.¦ Ä�fã æÊu²„"”³ÞÁ��3 `97ÍSH—Q¬5nÅëÛ<­ƒDÕk§;ìúÁànILFIM×ÇÛÙÚÙkyyé:è76ït´8ÙÇ^9�¿1Þ·l=:<çm¼—o>V|1–<ºÑÚÙvžBÆÅeE9‹nÆNw¸¨‡­)œm¤8›–JÁㆠáÖJû ÆTaqVÒý…�°*_îZàͰÒ�Ø2§Í@w†-ÛDý¦°zSyØ;ôø�Ý Š�A«Bn4]õš�";tFõݱTùp•)œ»¼,6NÃ*&šxe´CɈÕeAe(qPÚf4ÖÉjÒ-¦–¶8›Dl?7ÈßßDs�‘"äöá‰zkÁ¿Vîz=ë^w›w÷FÇVO,ÅÉ|¥ŠW¦æ17�JqŽÝ;ŠH(OGL‡X>Yà–8¯D$okÉm2í {�“EÞ@UŠÌe t%bùí¿µ×`«p³ùÔ#åênï ðÎÂÁ Îû+½ªr4V,Y(�±)!‹üʃÆ´¨HnÒ[Cõ_îä8R¹ôäFµ[+–ZÞƒoΨ~Á¤þÁ޼ÛZþÈÁk#�nÿw… ®Ë mŸ#¤m ,ÃLÕÕHf6�mèµhŒÆ+6m�%ð%�ãúA �ÑÉm.¡EÌV"ß]èðõMAnb™È6ÿ¨ñw,#U�(¤óÔ¢7îŽÿ’÷Öð±£³„¯!2v„Þdö–«@�6ç~e¿í—¬åX\ß¹IUÅVƒ…âñÙg¾fÊ2Yoíà&›ëW«4R¶½7ܵûçàzn� \ÒŒóû»ÍJеÐ3õ®FþÀ Hæi­>%-ÆuÊP²}~”ëZ®^’<•rñ )c`íã׋»¦X@hÐ=sæMv@Fz˜Ómö ÆÖ•ÛÝPV¾‰5€³�ø° äÅ>ÆúÈ<ŒLŽ›•½¡@Z€ïåÓ«—ý3té·a¹eüÿ�: Cà`ÅLž�¹Ê…ô1ÔßÂéõv˜PÓ)hÒÎíd;ûcïAÇ+¦Ç +“©ÍŸuÉØÝµ|AqŸ‡z¿¿‰üctå]­Õ6^ë­íK1 þPk‡KYðoÑl›Œ4r4dXÆ÷ŒJ%à-¶C„ÉÉ5á$òÙ!Çç_ƒ[¹¦®(“º‘E°)Lƒk¾Áw÷ÏÈd v½Ü®û‡=ä Ì1il‚r6·[¬Ú?f:õóõñgÐ{(:)Ÿ4w .ŠŠC‰ÈfÞ]N™Ï#“p¬¸N”fP·¦;bŽY¶AÌ�]KÖÃ@Z‘öB�«¾‘^�WºoKw�m€ÆQ¹w’mE÷iûŲ»ô¿E ™3žà• ¼ß2}‹_€ï{/ÇÆ_€>Bu³@øðù­(Š�ûŽ<­u÷¢ ·ièë.•ŽÆ�¿!®Ä婯ùõöŒk¦9ÅëzL¯„ AA稓h“Þž5ûa¤Ð5ÐÙºo/†£ºO]‚´š÷«|`š”^§Ï�â±ù×è·Û!·1ÃDtø'šŒËœ(jøëž¶Í®Åi4#{Éá§Ë¨6½æT N¢tß3󥔄�Cƒ#íãy¡Ÿ‹Y_(f©1!à¯|ÎV½'¼ Uçíæµ"ã‘æO4ó~rÓ£ª R™ªÿ�m«þV«]µ[Õ©¶m«-im¶¥­¶ÿ÷Z¿ÿ˜ ¬“)¬š&ï :ó¯?ü ÿøÿÿðqÄo€ ï¾ùÜꑲë;†åu�I²ÜwqÎÇYÚºíÛ¹RQC°Â¥P’QD)[2  P@€ (ûà t€…PP  @€Q@ ßn€߀@@€¾ú’¨ª©!övÜÝ�ë:]3b}ž¼¯m±ˆUDŠ [m¥-�:ÕmŠvnn�% PD*‚ª¨P:Ë2ÝNÍ Û­€Ý£aÅTÑ¢'mA»:‘#Y5M5f–ZU)UUS:Ë*nîåI—v]Ìuº«gníTPˆ •@UU-vÚåRvç]PÕ¨¥.@ ’i¦™Û(FÆ;Pb¤Ñˆ¥NÍT¦ÚR—Z¢»1JSmAÙ¨ÛT„…*Tª$'h6Ê¡UÒ�ÀÒ; I6Öºq6µ™"ŠÐÄ�%I¤Awt‘:ÈŠŽ�ØjUZÉÑУ–Æt1Ûmª¢*U:d(•Ù‘T¢©R ´À»]h D*´’šm´T›’©6Ô©Tt0»eVîtŠCïoG©T+N¹J‘QPA ª¤)ÛP¨]t¡Û­À v£Z»ºZë‚ë![5$…U@4ÕJËJ¥(P¢Ù§f­5ÛÓi¨»2*U è¶�XUwaË­Tì Ý»MR°ÊRIJ�T©k–ÝÆ¹˜¥ ¢H¢îîÛJVÚ•o‹ƒ��yÚŠË­ôîÞÍ »wÅ«4ÚQkU*–«¦ª” U ƒm#mQJ¤êÙ»�h*Š¡ ´šeRTQD’¥i¥Ö‘;·(‰RDVvé ˆ¡Û (Wl»2PcUv5SM+µ`*TB¶fÚÛÛ)J‰Í¢ëºcgsdiRT€¹h”V²©°Åm«m"Ûm–š#l[c¶P Ó%Rª©B”RJ’I‚¥+C$Ó;iJknáÉ)HR!RR$ìÔ�±B¤Jµ¶ÄU$Q$ìi+ŒbJˆí•@‰ �ª¡R¨EID� )Ö©*i”¡QIU)HZdC²´ª]‡w]Ö‹lB¨ �›-¨ m‡lU(Rã¸u]¶�D•k%R¢*!*ÛÏÒ:=Öñ¶…gY{5ì÷;ÚVÛÚæ£Ó¡ÖöîšRuݘN°öë®Ø­±¬-³wt‡6”…vh^Ø‘RªU!UÚÕ‘Jªªª)RÙ”«Ö²2´Ê¤””Ð Š¡­4ÄmµÑÚÑ4.�&´k—v1J‘R[%¢U¥)Tˆ�¦Ùl¥»�.î¹ÝB´¢šj•)" ìhÖ»j¤å�t꺠B"R ŠìbEìíÝØ ¢¢•m¥ •Rwwºä¢@Dm”Š…",J•”»°â ¶�)E Ù�ŒQAQ¨ª6£§\¨‚êÃI.±JUP*ÐÕÛM5 hˆ)£%iª*ª{ÜA Ä*TZÏf)hÍj6ÒŽ“³ª(P¶Ð€»j+lªÑ‹–²ÕMš¢B© T•TPJ”·a„µŽµRªSFLÙ@¥°‚¥T«']iÜîÜÃ#Z—Z‰]Ø5@ÙŽš-­‚TZIPèd.Ì”hÑ"ìʪ÷¼{×MV³m" RvÌÎÚåÎ;«eH(Tº4TDB¨Wl´ÕÛP¦·`×Z•J*(’%(¶”¨BPA#ª1г¥*A³Wm$!RP¢teÛh£¢Ž%Ýݹ¸U*.Ú©U!TÛEIR‰¬Û:5BAÝΨ+c%P©;w U­³)A¶ª¥-µ (ª *fÌ$ªPVµJ(‚¤¨T©Q ¦Í @T‚UJ’’H ÙʶVŠ„T4:Üš…E)¾‡NÕêÍØÊNÚ’ªŽÃ))Uúèu•J¥$žNÌt$k UJ$¨*í|"©þ‚$)FT2h¨Sð†ŒJJ‰OÒ "§à”’ªÂ0�?2E&DB)ê”hhi5I$z(ô'£S@hiè$õI%DÔ f)§‰©ˆ6¦�¨dz�ûÿËÿµ @%Ÿðÿ¯þßó,GÿCþÊ]ÿêïkRÿî«ÿb·oþ%Íü (ŽlÜse†S?ÿ-B¨¤“vSŒÞ™;ÃßBÌ6øÔ4Ú¦Îá­F $LÑ¢m[XÚA±WZ{I�Ò?ç¢ 陎LÀäæåK®ô4—lBH©M‘¥É@–Õ.Ô°«+XŒÐ¬FsÔsG#!uwI ­V´©D¡Šäswq]Ý®w9—{Û‡·»×·$¸ç{º{ï]ïžywrv�{¨¹yQŸuî÷¯:÷_7Ÿw]uy�½^»»/'kÝÞ_{¾î¾îîîº{ß>÷Ýî�ػ~ßwo&wtò#­×%ÑD™;¤<óݽÝyÝvŽîœCËÏww¸º÷:.çKÝÙî—ž{�Ývn;ç½Ýtœ½×MÎäŸ{—ŽêK»»º'q�Ô]¹Ôòî÷ž¸CweËîëÛœë�îñÝÞ.÷=Üï;»®�7<î÷ßrû—ç]]>qçÞ»šûÖﻜÞy‰<¯w¼�ÜqÜ;ŽÇw½î÷·»®÷^fåã݉Ý:ëy»»›Ü�ïv<ùǺ½×ÞܾNN¼Þó97w^wºçwt¹�}ï/.ï¥ËÝ×>íóï�{Òó†è¾÷«Ýîï»ãÝÅu+“Ýx“ݹÍÎfn÷/{×,s«—wßw{ >k×w.òîæç®í×;{¾÷Ù„÷yx}÷=Ñçg½Þ¾G󼸓ÝÈ“º\—>õdz¹Ñß8o+ºû½w»½q{î½óïst“ÝÒ÷ÝÇ»·Þå{—bê\Îîvë½Û¼ î¸F÷7GS»ã�^{ºnt>ë·‘÷»{¹—!|ïr]îï]ÛœaÝÇ+ºëÝw›t0]ço Ëv@÷^^{»Çyîºê{Þ²wt{»»·½w¯zíë®îÝÑ×»yìûÝy×n>ô÷§Ÿ{‰>ûï{îç¹ÜÂç+¹÷¼ó”¹òå{»sÜs×p�ÜÆ�ÝàŽÝuÝÝÑqÍï]yÒ¾÷{œnë§w#¾ïwžïv{½xéÝÞv¼ä;®Þçrï^xî”ù½{ï^O\Ws¯{Þ»®Îî6îÜ9y^^î¡Ë®îó®îs·§W—}ÞñÝK‹»»�Ðîp÷«ïw+î÷½ÅÒ;Þ÷®wÞè÷\å¸wOwz.$�“w}ÞöJ\îÝݽé{»×‡º÷¯}îú÷×�ö,�t�]s�Üù^{K—_uîëǹÜâçrçuv.û¯K�Þî÷½t<¹{�ÎïuÁžìÏŸ>��^\ôŽ]‡½ÏkŽDôçw=Ü{â8½×w;¹®ë—s;{½;Û L›Ïw{ºžus§»�ó^‘ès§}ß{½|îòîîóvž÷¹îîwwtî¼õóìQŒž_^÷³¸O9=É×té×#yÎw«®I¥ÝÝ®îçG'ºãÝ]£§ßu÷}sÚ.òïsïtòøíÏ:»¯+Éë“O{Úõ{®zû¸ÞuóÞ⸇e;½{¯.û¯F$Ͼéë§»z÷yŽ{ºsÞ¼÷]ÜqΞw³ºçewu\‡w÷·½ÆîêîÝ^íÝíÝ{�Ïzgfó‘½'»È¼.nïwž÷¼^çÎó‹®ïž{A˹tùæy.ùÝî{¹wyÞœî÷|¾}8„2']Ž%9]Œ!ÇwÏ'§W>÷ž¯~ïË÷í:å×»\$ýßz8tÏ�{q;—;Þ½s|÷ÝϹï/ºò}ß9zôòîí9õÝîß/=ÝÝÉ#¹÷½Þï¾íå} w{ÝëÞÞîõéØìŽ\äë§ÝÔ5æûï}}Ý×Ï7§×k§uÞ»Üõîæ“ßw<ú÷Níîíû‡]¾t!÷}.{ÝÄ]ÆwPÍÓ�;ݸw3Òè=˧."éïgq¹}ß;ï}r{öÖöûéÛ§8çE§S—uÎs;�Ý˾pß›‘7Ÿ}ßyÜwRyɼîëœÜ0ìè{½îw]÷xó»•À»;.—Þ釣¶îޝuëÚåó½óç¾Ûîð^�ËÞÞ=ÝÛ—'9ÉÆùÞîî¹rÝËçžîîº=Û½Ü�Ý÷|õõÝ Ò÷|½÷i÷WžéÞ£Ü—ïz:Ü’ñí̽9î»Ã¯{Þ÷y¸é9:çw>w»�ÝwÝ^y×Ý×Ý÷®¾÷_{¼ûî½\ëÉs¯{»¹×{ ×¹×fë®îëº{žò÷ww;»»„w77]ß{¼ »;‹¥ß{¼w—½ç°»‹Þ¸îíâg:îp_==÷x÷S8ožHJUï¸÷wŒÑy\÷^{Äì•Ý;µÒ¹|¯w{¾õ×Ýõrò÷ž½ã‡<�wvôñ¼ï;›»:9½ÛÏIÝÀîçwnÞ{ÝÑuÛ»¾Wž¾evt`ªè¬ÎìYÙP2ª�J†fB”0Pªvtï{ ^»—K¯Žï¾÷ßtõÝÛº`å×0wËžèí×nùr{åïQ—wN÷¹í˰»»ç'ºë®u\5Ü“¾õ{½Þ.s�/zôžÝ:îç#žûÞ^íÏ®ÝÌîë®îìåÞï{ww½ã½Ñ{ƒ¦óÏ_/O\#žo»ï‚îß{qyÞuÇnØÜÝ÷»ÎëºíÎçÞ¼½7uÇMݸF]uÝÇ|ºo;îä;×yó½Ã§]¼»Üîܹ»Üy^÷¹ê:n�î�ï]wϾçÇ;œ÷Ý{îû½ïw^ë®sd®™ÝÜã+»Êæw¹¾úéÜpÞIÇÏ{»®"åÑ]ÙwN﻽vÇOwß×—9Ýv%î÷®Â»¼ò½Þ•åæ=Þôî÷réÝ×=ï{¼ö÷^îéèÁï:õ.]î¯x»ÞâðŽë¹Øy�®ã¯<÷»{¯/^�ÕÌË»ÏoFîóÉzeÝ}Õr{:/žSï{}÷bwždw®§»Î^è˽îyõ×{ïR{˹îö÷ºçÝrú;ï\û®¥ñÔn÷_K×w޽ݽ.ºçÞð”’o/¾÷ßNëºçwAÜ…ËœºäíÂs¾uï½ï]q÷½¾ï¼ûÝ»Ûç¡÷ Îç$³¸vù½ç;®û·œ¼"¼åÞûí}¾nçw½ÝênuËÏ//xíá�žB÷ ïp™î»½Þžä‰Ð‡S¾÷Q�]ݽîôîê8®îwv<×½]—tî.îåÍîïwvkåç;ßuáîï»Éë®eÝv|ºƒÝÈéyãÍÞ^—§»ž\¾y{‰Þ÷{O{ÞçÞé=ï]íÙ¥×M|Ÿwßréåê7Ý÷£—Ͻ\Cîä»«ËÆ^—9×w}îôºï8®';íõïŸ]º5Î |óåÊùòï ïyâû¹îwtäǺ½zå×vM;®^ë·.ò×vîû®ûîÞãÞö3Ý÷¾=¯¯vä;¹Øç§±{º»®ç'{Ûž®î¹»‘wu9w]ï¾ûË¥=õ{Îv»ws‰Ís¾o?oïkmûk[Uέ5UoæÚ©m­ZýjÖVÖµ¿ç[mf¶Û]D“ hÒ‚QAD¦™5"bŒ¦LP”L‚0©&@ѱ¤¢“&¦&˜@͘& “ i$¤6Ádd#1¢ ÕfU¬ÛTª²­©[l¶Ö[m¦´ÛZ¦­[M³¦›$¤P’!CIM™€Ac”HTd Œ2£D”1–ª²ÖkjË[T­Vmª×óµµ-UvÕV™Uµ¦µ¥[SjínÛkZê•¶Ömk}V¶ÝVßùÕ³mVÞ¶«JÛYZ¾­¶³km]­m¬µ¶¦µ¶m[6ÚÕõ­·WbÑ©$ÔT‘¥yF±R‰,hÛÄš-Œ[Aj6)1Œ!!‹%fµJÕº¶š¶´«Uë]mš¶õVëj¯m­d¶¯mukVõmzÛuµ­½­ikmîEb‰¤PXQH 1™R…“lIRF5É‹¢°mFÔ¦(¨‰(Ñ©$(¨É¢ØÅŒ[1E ÄlRQ£F6ˆÆ5…‹EŠÁlbÂTY5í«mÛSZÛ~ÚÚ½ò66I ’Š4ŒC-*#F„‹4¤¤–ÕªnÉ$e% #’L¡1E2,Á ÃI‘”d!J&Éa‘‘’)&T¥ �†I€‰�žªÚÞ­mÝwuÙÊGnéË\×eË»¸îL—g+‡wIÈ5ÈÜÝ9ÝÓ¸’ã�ŽQÍØWs°k��væ�Üí& ºhÆ —.îÕÌWNt‹§C¥Üç]ÎWJvë‘«šºs®ºí×l¹Ù8n\®î9¹®YÝ�Íȸ»³§tÛšæäîåÂæÝqÓuݸt!ÝvA\5ÝÕ—\çh»®ëŽØÖéwnÝÓ‡qÓ#®§î®h5˺íÝÚ'w)ÝF+‡ws:9ÜwA¹¡4»ˆ¹Ê.“»nçr»»\Ì£MÒçîÝÝFêË·4šé£:ísww.»´ë«œ.dÍÝ\�çJw\±té88ÜÝÅÍË›\ÊÖÛ5 ×nã»�w;NŒîíÍs»¸¸ë’—1ÎwwL\Üȹœîîë�ÝØî±—;;¸ë»¹Ý¦]:î±Ü¹'+²çL ¹\‹s¥¹''v;œ]Ü»�Ó•Üîš’âì�ÝÐ]×q.œ]ÜwwW7\º;“®'.9#wZÛ-Íb, ˆÒ`ɳ¥Úª×{·1rÜ€®zUçDåܹ.:zõïtðçœuÛÏîR{§ZååvK»®êîtœ�«’‚M˼ây»{žöõ×k¢"ò¹î.›Þäð¯{¯N\Ñuæô¼íçi½ÛŽëžE;®íÅÝÞyíè^odÞkÊ÷t^w®%Ç]îÛ°¤×rqîögž{ήîpï:R÷]<è÷tîëΗ»ºk¥^]={ÛÅ›¢dÞ;‚t»ºâ“ËÝטÉ<ì÷måî�$ïw«»ƒÏ{»·Qžt‹=Þz�v�Ïwzk«¥¹:÷Wotï;{˜[—9{Û×½zä—�w»Þîó]Þ÷·7.§»«ËÞ½ê]ºéÙ¼×yÓw\åÕ¼¼òáÔ·:»�vŽQqeΓ#·^ëÞîìbð¹;¹F×ίm¶×·ò0f`–E„Y  €2L‘$Å)4£) @ ÀB¡"X‘¢0fš¦±)‰HD$Ä’M2%”¦(hÍI4$Q„"e4hÂ2F$•$“L‚%‘H4’íÞ¾÷÷G¼íïzöÅæ×w½8ê¹yr¯Håuë±»ºæ7œ·»�Ò£+›ÝÛNî뻽âçžçyr‹åÍïw5{.çnk‘¹×»ÍŠëÞñyiÝG“½z¹nrô×§7Œ¹cÒíËŽîsÌyËnW—(;Ï*ÚÝjÙmªÝ‘EDHbLPóÏ/½ÛÊú}óÞ»Üzsæ®î®hÞkÎ}Ýç7Ý×8_/½Ôc½Ü0\óÍò¹wtF÷]Ý»Í÷Ý1ÊçÜê÷¹×½ò.y>É}îû·—ßqO}ëyÝß-tç ÷sîܯ3ço/—”xwvç7¾»®ë뺹Óº�ß{£|‹¤û§nî‹—º¾S×Ió§ÇÝ÷ÎÝî½/{¯6òíÜ|�/]ÉÜë$_/—¦¡/œ£ww×yãyå&O$ûÝå÷Ýä}÷%w·>÷¬ûß}÷}éÝrâ+š¹«Žë&¼ÛæÁ|9}}ïg.×O-xùï¾Õï;�›»tÙ{¯•Ê{ï¾¹îí¹¤çÏRß:o»‚ùwÝróã×Sä�$ú÷°{îæó_<÷]�˺¸sÏ}õì÷G5ÝÎíÂKßv½÷ypóšûÝy«å¾û¯—vè½ÝoÝß.CÝ:ì\.î¹.Nùç/¾êáÝß<ä>tÉy®‰‘;ݯÝÍ_{©ë�/<ûÞôçrºcs³Ò�Ï}÷­óA’2ûŠK—7½ÓÝW/w½yãÝ÷¯a3·^k¼ºJ4¾ë•ßwÃ{ë�wWΘ7/yÎw½}îß1Ëæï½Þ{¸\5äs&A ½Ûç›ß{žÛÍåæÝ<½îU6¶Ý[zÚ½µ¶åŠMBµ0‡w®d4›»±«œÄî«”®r4W+°ÒWwjåÍQ‹].dÑ¡ÝÂÝÝbç R;® ruܸQ³'u\å®Q…Ýs…dÕÝ×6Ý 3F7.k$î× —KstÈ"Dj¸Ip.mtåpÓº‹˜‹L�¨€Ææé®\î¹1œ‡v®DDræÎv"£bÁ£hJ¢.î¹È¬E§tWNî鹨n›…r¹bÓœF˺åwur5Ícj1¹nAEHMœuÀ¬Y.Ts®W.Vä•Ír¢.nE¢®r#nj扛IÍv¶ÚmV•µ®ªÕ˶Æ�M &a‘Í$2†0‰$’&#@i˜ÓHˆ¦î.‹rBîêçtîî2îÝ0�×nwwnçqnêvÜéuÊt\ç5Ý]×]K§.—ܧt\¹ÄËû­¶ÖÕÿMm­›U­YklÛVmmµKmiµµ-­ª¦¶¶­Wý-«mF¢Ø±´š6ÆØÑ“bÑF©ZÔ¶ÚZ­*Ûk5ªë[RµZÛµjÛ-µ¥«m³j´ÛZ³mVjÕWZ­U›VÖʶÕem¶ÚÙ¶ÛU-µîÿÒÿÒŽnë»#—N»¥ÎäÜ]ºî¸wnP¸î»®Ž\˜�ë»�;¹ÝÎëº]Œ.Ü7w7qŽë®�ÜâçI\»—\î®wwwrÇ8qu9:ã§'qÎ]Ó�Ñ-×.\ã×;¹7nn“—kº:\Üìë¸wwwwH! ü"/™ç'Û˃ÿŸó~zØÿÓýÿÐò€µÿüÿ°ÛÿÇÈü:ÆUéòÁé×aOø­#¶§ë_§»ƒÃR‡XëâŸü…°ç9ÈÛ�¹Íïÿ˜Ãh¹ I͇BOä4ÓmW3‚6ž^öÉJˆ×ÑByß•"p˜‰a,ò-¾m1R»k£–Ìøb]`î:ßþÔåÄWG6u=­�MÕÑ É|\_ÿxžòìŽ�´ÁÍŒRäõS»OXÄ}±ñ0Iÿ9ú¾£e@kÓ˜‹‹ý©b%î26ä<Š@Ç~Í¡…œ [ZdÍž_Y•¡Ç´S„òÛŽsV}T°U0A¼Óýõ¤´ÚtHdCµo¢y«£Áúø¢c°²�xÿÉE¹1æ•ëÇ·´ÌÀ».n÷wÂ5Þ —…°—ES!çÿ¥_ûY§¹£âÜŠÄw Ü<É»gfÝ,x‰ÔJsãë‚Ø²°-òµ5ú¹5$Ûªd¼29¤•uDg8‡•!�?å© ý>ƒµ.P ï�ž7Ûyõ÷Ù©¹¼®)}¬­%’ªùðXÎÖ‹m�YÕSõÑò­fl.äW¸á”¯�…?«>µk6.;®a=Ð�Vƒ–[î’K`äP7æŸü·¸¸^—qõ+�o‹¿û˜FÕ%™‰íuV,ò¤QÕ´šéþâ_‡6Æ6'¯4¬¦>EòQm‚ËtoËÐ×Í×þ�Ólr”AUGïObï–=rë––nn:ÏëWiòÿÌ-’° 1c®´«Ïöif `.Tøpÿñ/´Ô<³C,6fäÇ´`í$!M©ì2�u…¶VW'ö�†�+çn_»\ŸêêÏNé7ˆÒhW0ãît 6©�8yìÙÛɉïúóÕ�\»£Ú׎O”÷~÷®Ùkÿ›ƒ~”-5j¼eV ­•$¾¶U»ÞݾïP Kg«û]ÓÿÉ!r¢æ¯™J#UŽö÷,Ó¼Œëíÿ¬¯ÌõÓŠ›ìÄ“>Ž=~èëgÄÛ„ ‹(K+ñD+¿ÛR~ŒE´aƒµ X-Iˆ_*¨õc�=j\ÑJœƒJì’—Ϋ�„á¬t3ÚVí\ëÖ-öÐ ;ßk±ZÙ?*{m–ψAÀ�Õwµ:-‰âŒÝ?©añp7 æ§Œ?ænfÆEßZÆHFË‚­¤æàÛ¬¸IÍSGçÄ{TÄЕ(ø g‚ ¾qÏ V"?ÜEÜ„sQ+ h‘Ì—ý[G�ùÔzb(…3€h¿ý„ÌKÿU¡¯Ö‡ÛTq‰]òêf{°Âí³.#ÃK²L}ίa¶ˆ-ËY�ÇZÌÌøUÒ7ß(ëQcÚx¿»WTxˆÈ÷ŽnúÔ¹È�執©•¿9YÄc+kf#xt|éj-nÆM¬åŸð'ý¢v�ä�™µc¦Ì`ÞŒ«'gq7ØÛvB(Úãz> °ò÷ñÿ06YH£íônhiÿO4\ƒtžÍ›³V¬Sy/•áš¾óÚ¼ŠÃ­:oÌBÍ(¹Ñ ¥m1™NòÝ}u ·L°¨¥ ��-ˆÉ­Ü§êxÇí¬€’Âb½\çë‘÷3/»?ÁXÙŒ@è¢�K­–‡äs“£-º«!š"I\-âù•÷¶ö»Ù‚¸ÐÕ¸»£y3gÂb¨$®¢³XZcÚÁ-_銱ŒEâ‚1¸Ê°•ÜÄ—�¶}ÏÿJ˦ Õ$³² 3tŒcy íWÕÓ`á'9¿öC\´ò³¶ÜX/ksEhÄaÔÎ�f‡‚åKØäX<Ø*}â© œÖvWùÝõÇedýšñº­ä¨÷Ðþ‘GZm…Q1/æÎg¿/¥©…¤� ¨ÕvŸw|U½9¢Ëýø‡a.èwqÚ9 åQd¸†)qÑ­muÔÜO¸l¿·EÂuœˆVIvÕ»Óšð–¥¢/¹Zå¿c&YjÙ}›}R´~ Gê-î¦â7òED MÔ—zs!‡¦ )–n¹¸°E°ÈÓá�(ã#9ŠX66zÎ(öÅëþÔ‰‡N·jEFS{ÍZô�§×-l@h,J³e�±­› ¬J‘’†àz)¡£Ö”�‹E¤²':²tŒs97æâ¿ë뮸2NR£o)âÏTŠÐ±•?±ÊŠQÍíprº®#&åš hh ¶ðdQnö(VnÆÿ£¥ ÷¬¬«¡ýïë9—ünï­U�Á…�6z ±[aþIW©)3ƒ±;ðÛ³D­mŸî YÊéôøG'4œªîòæêÁR?² ‘6ÇwlÀc 097|ÿ¬ËÈ›QâÌ·Æ·‹‘CöYpM¶™`5V߃lÕÍÓ¤ú­jYJÏÍ‘LŠ„„ÚøŸì·"ö#±„©XRH$"¾͵“…�û45·jS&‡ þ‚âw¡:Ž»tnIÿ ³›ªæìXÇöæÎ/—Þ¡ðÚ’)3-ý‡ñЭºIØéÙ’—Õ¸R2“L¡dÉöu1fÃ9 Öìä¨2MˆÒ˜F®”x$>i·C7âS›MãY-ûÍ%¬“h>{qãÈØI<šs­M{Ÿ+•?³]’²sËßÚ¼Ñ>Fä.fU^º¶U¤(Ö꤇éd8ÚÈØs C04jRõ·Ó%½Œ6±èSAAóWª(ßA“p_Ýê»ØéR÷è•ìzìÆ7{Nä^ö„ü&ÜþÍ-ͯµ,ë�Ó‚¢§óËí‰à{¨oÖ“‹DÐOî;¬_N_»Éªà°èL’I�Â;¢�o†yƒ½³#I)Ð4‡Ö¥Q­‘]ÛÜÀØsJÂVAnwTw4TêÓ>Ìå>¶íÍ6Xk‹Ú!<1¦É]¤–ñŽÓKMÕ9Í ŽýÕƒsâÍtY�"šqñ#¹J÷í"<Î~áh»½"ÎŒ—1õ×OnµS~Ô,B‚øSÑá2³’‹Ycìqùx£œz5š¼áºÕЫ £`DÔܺDÇfÕÇm¤!e%bø¾öäôm‡ª<ÂøTËf‘qÅq6›WÒµ™ÅÒŽP+DOV¹UÞjºÏQ*ïÊ£¨yÑqðŒÔ54'ý]�7J6{9¡EE—õÞeÚýŸc'µm&óÅ:vþ—/¡®zÕ/›¸@ŠÊ]aÍPÚ•£¥±oLé³Ú¤'b®A&çî& èim(á…ÇJž§Tâ$Óvê åD8 ïL´}7µÔ¯p”»Œù^ˆ†àµ¬¯ßJSÚªå»þÕʲÿñO˜ã.PˆÉ2_§Åâ…üyí•HY9ÑÙçö'h‘nÌ {L›‹‚$F¾|®±äðQ^bOÓ‡®…�F«´Yýj¦L“§6.j#Tr]v­¸Æ…¯o‘(Ör�@~ÖœŽ‡XçÖ;—ýHüß©dü;Ô¥OÞû½ßØÈöKŽ�i㚀­Z"ìqÑ’þ"TZ…(îÅÜâ°¡êÞ—‘X“µÇMþ”„-Bþ¬gý ª·œiöùŽmsúÎBhås‚Ã�Ÿ±õ‘_ê�ºÄPVßïëfzI ÖæŸ�Š E˜WôqÅìw8[+ú¾AtYzí®o¤ï⃪S°þÉu\¥>ƒ$ÖÓ�L)áˆq9B!ZmúOç‘Ô~EˆßÔþœÌoÌ'óëU½ê]õûçxï^=c¢—jzñض�Ž%¨à”„ƒÎ=W{[0ºÓ#rdu4£–ÿ µB„+S"Ó]¡OÇSîò¦ ¨â$Ù�®x1„Í®¤£›:7?…V˜ûûÈ TŠ·¸Õû_\±<:üŸ¬oW´ÄÀíjäE¾4ð¶ÑµyäY››ÿ¥ ª¢öéd‘Xæt�þWJÔ�yzç“'?O‘«uÙÞg¿f9;´ä£T\ÀøÎXN"-QÿÕê´ï2;ekÐ*az®?Ìn,äc)•Úå6û½’¡ÅQþ+Ç‚5=s–¸ð9Å{wóºf¼šøÜlñbëDë]äðŸF­‡‡i£v9 T¡çëm¤9ªª©ReìÓXÐ#\!ZbËH-кéï¥âm�ÞmGlqþ«ûL•XF/~n‹eÍÏ_ò²h’æäpËQŒ„²²À�¶MEÅmþ•’Ž3b\×;Ô97Të¬ÛF,gîBY‚¾ N²Û¼ôËFyx.`°‘GÔ+ä Ô.´Fxø�yxa§.6ÂáÚípeÝÍÏû‹Kœ÷dÖöÏz�u±Æò'p(ã  �ñV¹;! E¡V׬8…d~[%öN[ÊIͨ?Sø+…V…8”+�50-¼M§ ñ“çe•ÁáN#œ^hƒE%ï›åÿ:Eî^~_VÏoë©ý94Åüú¿!¹5 A¢ý4eGÇÜf¾œöêb|Tw… 2ú8µ©ÎOVðߨz¾ŸX6�,%cÐsL!¼Þ?ƹ¸�mHÚ—¸{þî¶5Ë6.‘"Í×z©ùJî\È,é¨w¬£]L7 Þ7\–ͳtXá?ýÿŸ¯{ä3ž� ³Ò9T(³¥�(F> ÅzžãgwºÁËJ6SHOnuY·ûû×ç–†g@œ8:˜Š—K¸se‹VuÁ*�~)¯ü®j½¾/²®mÈJþâ<­ÓzánÐðù…~p#a’qï*äýAuåA¾&N¹éB�?¿íÿ{'�I:�Ûû€9šÕi%Ê!¨Zÿ¸kÿsÞä1;‚/ÿžiÝ›Bù‡>Ô¾ÒÀˆ¥2=üe|ý½�~ù7x ûû(úR2ŸºYh¼#í~Hà•+íâô@Ó*Íu–à)ŽQgÕËjF&«�“�Wš»™Ut,�xôoþʯ´õ¬ŒpÙ)RZÕQ÷Ÿ³MÁ‘Žmïxy Ë•“˨WÊÆ'ÿ¦¾hÛF寒 剧0kdŠÙ¿»�‹&)©˜“ksÙ½ÃÐ)¿~Dìû?H§\ú±1ô²úk-þ¬LëøfíOkr�–fM@4X»u/5ø½6BŒ#ZåZap¬A-Õ’ÁjMi4¹�‡sSz¥ £¦49ÄѧFÞ´ªüÑí½iYÃ+q׬å�h³k~­eºXªW_(KÍl;Žû꺖\w‡Tdî·e±vl§!³žèœ½¿÷µÍ”�;;®–i˜½ÌÆ“ö²‚ÖQH•p•Rn«I‡”Œú®|NjŸòp'GmcÐpWí[,ä‚ÿ’ê&�÷+_"€�e:\ë9;OµñŽØZ[øu<[™Ìd°!vNLútezÎÍZ:µ'ßoZòæÍÙŽv}VŠi‹@ ýÓR¢×Õ�à ¹øf¼÷–~±ýèáßêvW¤–’ —cf”yq ¤†òû&êÜùað·ë• ?šT–֢ƌ �+ÎÑÀ-è= ® bLãéU G.  HU˜3 =AŠ˜Û«ˆw+Àú«_–�»œ‹W‰q{–Ÿ|dV¼�\¤ÛËŸO”z„CéöJg—’Úá]± º‡ÅJ?®x²²çÎë¿xàŽ*S¥[„DW+ßkÚä„,ª*æ]פ«Hä†`š¹{YÞ±Ç„è …lÒ‚lüKê>3<`pë×Yzí€{ðH²ó�ºS×0¹¨£C�P§oå$¸o�#UüTÖœ7„ó­mxûµ_pçé(k‚»p‹Ï³Rîöœ!©<´tðgñ{»_qÁ\Gô¬4 ™ÍlRÀ�¼ËZ¼¹æ è¹ÛNíÙA*×G¢—Ô^!WÎ’ÆÒüÄϦ0OŸ×ü£â<é/…4k¹îÇ-ÍM®ËóÏ"‡\2��Ð#àö2³?ŒœáìZÑ—14î êCyWbŠ7l Q â1Îð›ž4›¡;,]k„‘€C-¬ÿO ˜ÝØ©WÁ÷K÷|vó|Ʋ�£…Cö­€ø¸±Rî4à€ù3åþÞÜTº²¡0 T«Iz÷ÓxO±Å-]+¾ƒ Ò~؆r½>àr^¤þ€Þ¯BˆÞu&3¨Þлͩ”¦jús t�t4gÒ±_âéØ&ÔÌpÞEØ»ú{û-áþ2bà‘¾¤P‚ )ó$X(9–hiîÉv¯�‡ßÁ+øaÖ›VÑA|-v&µTÃÑ ÛÓâþõ×CU³º0—‘-¦Y”ë~q­ËSkˆ,_~ÑpÄ[*oPrƒñVGZMЉåÇœë ª *J²½äZËÙ›ÏM«ËIg¸Öô¦ä-!Œâ(è3fT@ÁÀÓ -&âôÀ®Å¡ �>­ZžbÕŠ�¶¼ÿ¯ÆÐÄ^I2‘êkeúXŸæÅùú­»zw_σ  ò/<\'n ñ{Ò¡.ÒwrÔ8gnŽ5JÆ4ºIr›Ø–HÌ¢üÊ&íýþûhBýÊÑÎM…*3Š[ì0``Le²„þîNþ ɲ5ñŒ¡Ñ>þÑ«,µãwÉšø T®ÛŠ‘gôG†ç>ö"¬°X“† �oû°:êÕî`Næj“B¶òè ¨ `”:ar]œp$/rñÓ�5])(Ní´SfþøꀦngWó·ç�ÛçoÝ›°/΄ÿž{ƒF¦ËÛæJBÁ^¶X(ks½øÁ¨AôÅsýt”%ßêÁjˆ²ôÇ«é†rÓ¬Ü1göLxˆÍ?ñ{¯N\ž â_D42z�ÌÚ�Z„ß$—Ê£˜Á…oNù–ÍËŸ;�&FFü»è²ªEŸóÃd<0›1ÿW–XÛ ä߯ÚùjË‘X�%Õ犆$´£x+Ä v~லǵKجyÔ¦SUr¹É‹†"l”&>IQ`G�*·hC÷וµüœnÁh5a:? ^N —¯Æˆ[A¥1i÷§ìÂÓä¢Û%•å3®¥ÔÒnV“emoƒ˜z~buùýó·ýrœísÙÆ«Ì�Xy˜^<Ðíü¦’˜?.£­Û4Úqªy]ÊPÛN¿@Í�J­Å¼�ªÁ®~¬"ªÀ¥!*Ù’hF*Õeî¾\kˆ+´÷«Ï,x·¹/NVÝòËìdä•x,V> N=(z^Ç·mɰrƒO*¾º&õæK‘wsW;ˆâØXQ5Êñøï—c{QU&°’ú6Â3\ ,⺳ɖa—‘]ˆûªfT ŠF˯À�⛚§×8!hN)Ìí>[)}±`¹?Z„:‚6O”Çüo�+%=ÅnIIŽãA‹pÌ7ŠÚ­Ì°øÇ[8ºîÕË2òˆ+ùQª ¡º*,³ÁdÈ£“ÞêÏ´»ö†_Ôæ~…Ög µñ¬€—Ú~Ö¿ÖWÝ™$ Û»\’V¡Ü§¢ð¦¨ùu^7NMpÆêº )–tIB „¹°n× As‘ùÞÑJÏÑÙW�Õ‡g-@ñ#ï¥\fâÈg3Õ£ge\ ‘b¯7Ð.Dóì_y÷M‹¸LºmÏUH«áY|GÌ(ÀÙ¶.Ízzý”53«éŠn¡ú¾¼ö+ëL}‰�É¥ Þ5o–¾zïäõp»‹Ê4‚*$dñʬ{X'Óv�Š • ͰðÛq‚ìלE9!yU’†s*­Ú³\Íø¬¬#==�tÚÊ—¬ú«…o/Ê•f~eâk_:hcN´{:ö‹>'¢µø0º8�@¼iø«�<[åÕaÿ¼éöw]?d¥t]MUÔ 4¾Å�— ‹q«0º§gtxò<ÃÛ&¢Ælqg‹ÎÃÿ�Ý•ë;КÅH•ÝfþÝŽoçõ˜�e•êíý¬»ÊxWÆ•rÉðúõYÌÕžéV@tã|Óûö{>â×/…×/ɸ3�Ò‘êœhsÇuxuMè›ƶUa†ïߨ US%j©}@óJ(“ƒ“Y«!£Ð À‡¹(th/ÕÌF4²˜÷„Üܨ•º¡CÓ¹Ãöûô[ë ¥:sç“„ €ðW’aÇõ¯ó²m~†(0¢©ÑÚKË­×ê:òX7ß‹PAˆa¶„É á›|XoÂB0}¤½OÍNÞSH#~Þ8Á•/@¤é1•ÌÊÓ <+c¤-©±Å$áÌÆoûiæœ7%:›80lî'ãã¨=[�ÑI¿–ÿ‹Eâ<Ç^û˜š‡ÞâÖ Çшe’œÿmóäe걟õŠÀºšmãÀÌr^•Á±§J²âi.nCüƒ—F†Î‡Æ�!X& £_ Û9qÀ!JÅÐí«ÚCM ?àÌOßÕ†YË)«¼ëØ;Ú·ºõÊ"úБS? gÌîOŠÐ)*¯QKº”£HÜÂL?½fQ�îoÅA_¹¨Ð­Î›G£×¯Prû|`kÎzaÓ_~Ï6kyËÄ…¢cÝF-@Æ!}"÷ûîǸê-™¼¯Q³¢U6#)f‚›óS.·ÈGÀ+A–8¾iáäU%Wbݬÿ¾/û\|cújq™³—ˆJH$  ’HÉ0Q�ÓRT Ð‚É  ¡iš2H؈&M" F€FAHfÈ”0‚CÈQ)6HÄd‹–1”€1!$ÉÈÐ’ ŒH ˆ 0² # $F0 ’&bƒe 1&�A…¢h²C£CF‚H Ì‚&(bEi ‰�L!¡‘”ÍDIÉ“1³RhDM‚ÊB(fÒ4ŒšPLÀÀaH€�i2c&D‰”�X¤P&aD"„i(ÒSSÔšY€¤$ɉ¥ Ša  ‘ ¥I"FÁ’Cš”RLl A†#J"Ì¡LdXQFS ¢L3E0ŒˆŒ&"Pe & ) !˜ÌHÂC3ŒD‚SA"f)I‹,…¢PLbI I’d‘� E$(É�“!ŒH0‚d0ÀÁ–Ì©FI3)²B "d„L)F  Y$h†,‰™±&£ 2QLP˜DC#0ÒiHI‚`˜˜„¦0) 0I�S"¡!!ŒÈDšbHL–1 ¢"d�E ¥2�e(ÉP¥,,˜¡I)1˜¡¢M&&aJ˜�`„Ì¥M£!¥DŒ‚È4 fhH Y2lRF1¥“"R&̲0¢dĤd„HˆÂSBb ”#)›!„¢$ˆÀ2�L¢2 ”QÊ�¤…H ”�‰E ’"Ù‘"„„e™¤‹f(¦š Ze1(P̘˜eÊ$!21‰%6!33b1D¦d³ IJl�Lša&‰” ™”Ì’S)ƒBÁLLÄȈXI2e2$)HÀË4D ¦�ˆƒ"fLÒ”&)(0Ó ™¢4‰©†’H(Ҍĉ0’QDÄÆ$% 4Fi(ÃE) †e$�$f„1DY!‚C ‚…Œ± ŒÌb ’ɘ Šf4E2Ñ%3(†‚16% (Å#)¦#$e…É �•$a@”Rc2Ì“ ’if)�Ì2‰IÁ ‘°¢ŠLÄ!Q‘&Œ‚h’$LÑ1ƒ4Y¦@ ™2(Æl‚&1”Šƒ(-4$`„Ã* 2bdB$¥ ƒ2Ê21 $’$˜³DB“&A‰ˆ"” ”a 2™¢P#&@Ã4 "À ¤€#LC&2XF“²C$ˆ3%K*`l©&10™ 0Ù‘¤(2�ŠÉ3X30j”RÂcB,ŠX†‚$“4,R4RReB¤Ж¦$$‚‘ fHR”�™†ˆÌŒQ„0@0Ð’)³B™ ™‰±¤…†`JA‘$F“H‘ŒÅ* )1� e1‹!™Jd¥‘�„P‘bL¦!Ò‹†Œl„Æ„D`€Š`Y!†CÂ’„Ì(Ó0B@É! ¢H‚ ˜’H …"LR¤”ÌM3¡c‰ÉF0±D`ĉ“,”šRÊ$Êc"¤ÀŠd1$bL� ¡D¡ŒQ2`™ü?Ùþ¿¯ï¿Ïû¾÷]Ô.ÕU�Q,6w÷ö韢¯œßR©;îÑA WÕDÜa4ºN/ö^ÒÿÜæïîY ÖáåÅÇô`Öó/[šokñ¸ñÒƒ×FiÕ]½N�ù̲' #š+•4µbíºDÿ6T†”ß\¿—?­ÃZ×x“rý·:6ëæÌÕtÝc8iû™s}¢YzéÀÐ�+åUަ�ãX•ÎV�ªÇÑñ•\\aö,ó¸5BÑ'ÂyÔñþ¨™= tÖëÀsFÜÜ9‹±{Œ}Ê´£é¦¾§…�V &­éˆ¦¤ãj“µµîX±ª3Ò뛄«eßY”ZÅ~�igKîö,ë›{Äf]w”Ì£¦ËjüZ;¤ÈÑŠ 4Ÿ‚hkæ\ò§ÄÇO6äÆo yKüóãëð­D•:é�\*ê¾-ñÊÉO¾·öÛÏköG‰hû�Hvÿ~§&‘lé¡ÓuQ¸ €×¨…¦ü6daÒáìKÁXPçK‚ö§›”¹Çtl³™Bµ\ðfmK‡iÖòÏÅÊÀwkIOœ£%)ùˆ Ö ×\P3nY{K õQmüÜ%•­ÀUÛž•ȳj¾KïÞàëb2_cæ;ÆWkåó6:bE©j`Ç6�rww'0ð¹a¦Â|%Ö\¸]b2W/5­7Ö�Aü{Š¡ÃPœj‹¸éé7î[:¨šCc�VïjÖZö“QŒQÁŠ”Ïµ`9: _­¿7Ðé4—·Jp²¥a”ôþlî%ˆó‘e’FLåGÁµÁÒ­×Íäò"HùQ­çMá½à/~›y öwÐ=–©$Ça¡`þ9˜>e > á'ŸP��yEŸj*D@ µ4ãŒvP«TQeÇr‰ Lô—�oé­|!’5×n½‰|'Ä Ì¶ÏÝÜêªÝèÛ‰ì¿ðiÛôÉÂò_wÖªçczýøfÏü¶øô¤ÔUãV,^ö¢ßá®|ý¤öœý«D¼bjøÖ"cïÆ®Éæº ‰EÈü\ö Ö'úÉ�ù_1=‹è*@ú¿i6ÄöÉ@¼òBëÇ™þ40ç†];RGF…šþK‰ØòÎÕ Ü.î„Ö-q~•ÅõÕOÊB[Ó?$ñ£sHuá;QYö¥—Xjùz°û‚̨T«˜3rºïäÙC”áR¨´N‹YqKÅ«ì¨ÿ,ÿÇþàµ+“ó¹Ûqñ•‰utÙÇöý+AíÝnªµošÂŸ¦Ö\:2’jP“T]ü«)|�=¢ó7]:Qå&F iöùl°�ÝúfÝ.€Q¸${ª‚”½¹”lDÀ’‡Ý1K�žÔ{•F#kã] `MQp´¼ž§:[ °¼ÊXeu†®éy¬5ü}Þ®ÀY(Ë:³óeœù­K èÕ%|jàâ,Ž­IÅVöÛٳΑ¹Þ±uÐáñÅÍÎ܇Qñ- ŽøJS-NÓYN›Ã,Þ=PìeÖ<Ãî_•U5Üâå‹�›=wŠëNVÚ+c9³ÑÕ§Y—*ãݶrÿ_µ/ƒ æCiŒþtû8<Ý_Âÿ£ /T.ÜHÖç§Qȇn]÷ªÎŽ%àªÑiù$S¯DnT!íqß³’œóˆ+E*1ÐwQ¹¼D’ ùîÕ'(d‰,8%.¿�,7äÿ‡ö,øºüØ{Ý`Olm¦oµ¦”½)nxwì‰o÷%>Ëõ¶Ú�HæÐSI¼‡žûYñÿ”úOƒ:Éê§v™¿€+n™Q1뢤©ÔËçܰuñ™f«ˆüã�ßE8Ε¥ÎT2 ÜZ øÑN€é;ôqVA®4¾T# Ï÷|Œãù”¯Ó�ÕQ¡�Ûå�‘Ó[Ó†µ@’•ÓjœÛI2lø=›)L¼*´IgpóuüOâî‰^ެݲgÇÍ×0~IØ”Ä�r¤¯|ä6Þ°Z»‚´ø<<ñôYY’�!¿*@�Ù‡ë“åmõÃhòôÅdËcsm3¬9ÈVÅf�”ãEû«9ÎG£Ý³”*ZÐò=ç*ë=R­[{ÌqnnžÖ'ƒ²ÏÌè€Gí˜míˆ2êÌòh36¯ð‹µpY,¬ïµÒÖðÔÕºÌp¥Bˆc”ñÀ¶õƒ‡Tùˆx3yÆ ‚êc³ê_çZóä‰PÓÖbŸ[l�î—+h‹ÙÑ5[Ñ~yŸì*¸Ôó0¢”Æ´¼Uvɾ�ÛA:,RÝîÿ~SÅ?ô·7+ÊHÍSF�ÏRÝ?¬,£«êÊWûoÇ]Æ¿”FFé&ÝŸ›è¶#=ºþÑÞ¼«ç…iIñáb ‘s�…K *å%ü¬µ5†™Ž¢þ˜›)¾†È“al P”ܵ¢IŽi«1äUF®Íø†!ôR]~ÂQ®5–µçq>(úÜüñ’NÒÿ—é¿+zMoŠ€Úõh€�™"„ýû–wí>æ2«Su,_ ’©W1_ùa¦•¤ó­íTð¿�øåúà Ŕƒù&ø†ÁGä;ŸòTÞV6d£öq‡�Ô�Órœ¤½Û.XY>DT…Ööþ˜FöÃ(Ð¥»îÊåÿÞ�‚�È”>ÐäœêôZ×Lþõt½Xq sÔ{Î ‹|p¡Aàâ/Å8«‡ðÀ³we[sõÊî’•üOx‰¹÷ÕöµUѪ””ÒÌZÇÂÕgÆs²ŽP�‚ ë%€ýÖèÂÞ"šaûÞŒ�¿t~Ç ïP3á¥�W÷ê›XZö'‘²õã§Gاéåõ7õ$G¹âÒ—‰îšw—o¼âýi9öpY}«e“ëûŽÝ¥ÒZ¯^æ•c°«l<9‡Õê‹/Ì%¬>éR!}ú7}Î’Š¥d|í1"hgWuÖk—†�×d³þMóédÌÅ k€6ÓepŦ¿Y¨•ó<„jÍzéª÷ÀiÕ(–ߎSû¢fä­b×Îö9��»Ãy‚|–™ª.M3¯öø_ƶhZ·ÛGŒ&ª*ËÒ•–7ôÛG9©zmÅYšÿœI¾&�)ÜÈS¦ÀÕIÀ¥VïEþq¥Íd;TCCµTÏuàð¤p[°>’ܬ,@¸Q]J,¢šc§ü]N�(ø”7.š®œ@§‰6x½Ñ?ËÆÞ-�=�cM€©•¬W™£Î%VÎjöò´i²Ig–àìv;ÅVµYŸ?Êñˆn/}D(¼wz‚°¦áõ_Zf`‡LÜÃ+\ùß^_€0yMCmÁ„ø*¾0Êé®C»éÖ­,K]tŒ^õ &j“ì.7ZHÚELdYȾñýÁÝYhÆ ­-zuêÛ[¡%,‚î÷¢c—´«r&©¶•�ßÇù=w¾0'ö†Å¸Û惲ŠÉ�� {|ö;H£ç¥ñ$f ¯ø½Æ¦ VؼW5¨}ûuKmóœ~Žãi=ýUÕŸ^´'Ó�ÝYcóùgáÅWÒODÏ¿M�¬œË$*Sh-Xˆ‚ÕK�G/6²eþ”=Úú(¸;ƒº‰ýÃê5ÀÑùþ‰ †F8l8O¤è YœÍÿ6X�4 Tä¥ÂÑŒñH V0/gçm-6Ô�+ |EÃB¡÷nˆ©ùŒqÿ¦ß“g³ëj\ÁØr©" =q0v×�{¦‚t�1ÓéPwùĶà4ÓGÕ36d(¶l€Åµ 6ôÄÔÕÍ@žÏÛrlFl -“+ÎO²·Ž‡o6Øò¤m.ê,�xÄaNàÙO£êÅH1è�Ñ“#ÂT|�õÆÔR+J áUÇ|l©&Ãy/�~{’AF%´¶H²g[T°süpaÛÕ[(RuþΧ]¶V1mïÇ5‰�t½FkTªæÁÏÝQ4Ú½n† ¤¬$ÁËT¹ MãF/>otÿº§IÀ"§ò0õ>ãSv )H|@?)ç\Òô+ÞU¬ö{ÓL!@$†Uœæ�ÝK#-‹ÁîŠN‘:D£éÜ¿�S>JÁƒ¾¨>[Pém‹{[DÃ}&xÅÛºäaü‚�ò©§y}�tÆ>÷ì›<±bæý̧â;ÞÙ@Œ*Ù í–·Y}’ßÛÝTc"RC{Ϫµ\ÝU ÑgÖ±‡OYý¾˜’b¾ß¶Ò;�Ag@HΤwïJ·ÂŸeJ£|¬@vµ·Š–‹¸#IÖ©i’ÇäÄ€NöšO›•á}³“¬ºñ�‰N�×™„ä¶ùÚŠ°g^·õUm*ÞåvÈCZÝßÜå¥f –¥‘ïe&>r ×!(ßgŠÁz¯±Ø<Íc)Œî4~=I÷%Ãh4r¹ªÞi· �©uävþTY? )J¶A•RÛX#£Ñäš!µ‡œ8ŠÂ pÌYNìcÓœwVí­+�ß®è¿1O±¢™�ª,fë%ðlÚÀÇUÆ“œ¨ç_§õ[¸J`ô¥?±ð�Åf]±Z1ê �Ø®›Âo+“»ã¯×M™½�]ð€_>Ï•{ýw�lû~·…ЛY+œI²<#F-„·øLË^.SËR*ÓÝ=’áQn8¨ä3ˆ¨Å¯F×¶ƒVãtTxó¨Ö~¹·gPõ¬ —‘iìõ *��â…dê½Å·X|çZS¹ˆ×ZRÖ åêê?Nª”¨wÖ͸Ñ®¢â»/»ZwT$?<Âùfg{x¶óŠg4èZBÝ&ò©›U}ÌÑÈDÈæî˜Õv¿6_ÅZ�ÏwŸ¥ðüö⡉ÊÉ $7+nZ|]/ïoøS]û÷æ"@Ъ7ƒù¾9šˆ7œŠóéo$|èH߳ąIk7TÁŽm…•h¼çô’êÄî—½‚îÍ;&w#ZŽOMR“wñ¥8gÌÃM~Ea È"D#ÆæµV,³n—î¿zÔF\xØ[y÷./ZèqXq®söIjì鶆DHoÞÜB8H¬2sÜôÝaKËk‘œ¢�*hohw«é_��þ·¥×uå4¥~R ƒ¤hJ¹7d¯Ø`vjxR6ËJªòY7"Fíh2 *fã¤ï±ù€s¨tòét•ô›"“!ÌDª¥�2CÜ×[Í®—˜Œ–Í9÷�˜[›/!Õßž°aÁx5qŒì§zë]¦±6¿ùÝVÐÐôÁ%ǰ_6™åöá÷¶¢>y;&þNgû Áƈþª¨~yZ'Å\4žk*|÷vfV:µ£HÁ Œœ«QxáÆ¼¯Sd#¦þ1J¢XóÙ5*Ú—,\Mßvåyõñp•#.V˜v뤀2¢6<ï2ñnLÿ̺?Ëò›“$ãiˆÀAÜ�·bq}y.ö•©“×Ä‹ àpõYøêJOZ9Ë…ý‹Ý¯KM›Ê¦ûÇÛ*¼”¾¹P¾°póLÓ–ÙcË^N 'qÃåw´{’Ð2ét$y¸6bí¾(XV¡ÉŽÇ¾ö�q#±Io’îöm–1Ðu-BVhUsQݾ[U|å$Ù_Ó_Jv×xËmÛPzTîƒ3¼^Ó>ÔX³sïˆÙFÕg&¾ õÀ¿‘â5ž ÌrãíN]..�/~×ýáiJ]—*ÅêÜ|“MQ€±nÒëÖƽ˳ae{œr,‰ØE¾Ýr˲m{# 3ã>-•c_¥fmöô« 0 ƒ+ÒÓ•rÚÍXŒŸ�s×·š§åkžu‡Ï�¯§B»¸_âÕî Ÿ~0 w )Rm©u©æxo«è¯p×ô¯i¿h>ƒÊ·ô0Ä âµ^Ÿì�7ØØ.»ª"ÔµõJâíx6ÁÔÛ´ƒã™^ÝåB»®×ätâª�^�¡P ²Ü$¦V›©«sfÙ�Q^¨ÎûºÝÿ™^»gë•5Ào¤üé¥* |ñ¥2™(vöò{q.ÖÀ¤' øî­9x‘‚“1÷ z°ÿ`í%�L¹•hTd�-Õ]è+*`"”¤ ÁñÛ+QÛG°¦@ÃÑÄôE»ÜÚ/<þt[bƒ•V_˜wÖÂqrýyIvP·ºuÃâ±ëC"ˆ5k*Æaî•0ò¹ Cµô3‹¯�ãÝ%Zâ¦í^N2-]k$s˜� ,B¾”µå˯?âf¢3Ûc˜C§K”þØ8ð`OƬÔîvrUž}²ï“…(XžÕŠË!%*ŒF ·ëçdÝcn‹åöÖeUo²ÊZ � ósåþªëe½¿�„Sþûå¶ßF#ÿ ù××âÖ»dn¢g‘v ™ã Ë”,ǹ:­Eõ7#/90:ªüƒ�Š–tÕëFY&-úehìÛhA˜m¯S¯·}´BYuD�`÷/íÛ37�Jó}¡°õû&îMŠ“Ô„ �bÂ¥K¿îš�p>}Cj Øàå½SÃÜÍléÔ€¾¡<`b¦åÖbŒß*r^Zœ€Î„±kü£�Xº¤¿Œ½!ù¶ç)Óœùñÿð~]z~¦r\Rs²æq–7Õ|tjÌàË=�=I#ËdË~.Æ]'rzÐ|s�7íª %A‹“›í¥Ž:V½–ê�-.ú�^¥FÑ{˜ë«ëâæƒýsbÒÖOÏ}°nŒiLêl÷U�ßp}P‡ÕŵKþåîò~YÑîîüMæ'¨fñ;¼\kVeW5ãRõ—_ë予€ˆS æã?Â|ͤ ’5˜dö²è=ŒúÞ«ùo®ûÔÝXõÅð82ò?Ìyži‡¬³ª±ÿf¸ ³5_Ñ^¤®Ý ¿l¥@“oò¯—˜J§ˆ˜êŸ–@u1RÈŠŸ+sá[±ÉÚ猣 >¡3šæ žÏ¤\\¤ÙÛ¯fh½Ÿt¿ÆpÓ·õÕ“§›}qA”ªµ©óu�$ñø•1ŸÄö—V½Æ:¨VS²1?ZÊ-~�;Íé7×¾–­J­p�n®éx¨�—!Æ—¾Qæ±ôŠáþù%Ž?Å—X1ñº~ý®gÅÎwxÑöö;„½>,­Ê+µ/W«©4í˜^L^fïÝôôgx÷—2®¥C« _Ÿ_X£¡ÆÑSŠ0;+åÎ8\†þê ]NçÊo}`�¬¢oL³iBµ]Ÿ@öEMå%ÄŸ× Ð�‘ë* Ø9T¤nk¸±Ó‘M³(¥,R5¸ŸÐ4?Vb�Ÿ3'ǹ£;¡Áo©5¬ý–*ÿvŠô Áa‹aeU­NèN”l»n2ã�®ý^ûÛôi%Ë.•êÍ<˜i$s^÷[7ôë¶ÈÏÉò:RÉ1åæ˜ëÉpGÇ¿_äƒ�øïR²¶P‡ª$£ýÒðþÊ —ü9û«­¸’qBø7ÓÕìÁÁû\Ùa›+¥·,�«Sœ®Úßß«h´´²«Ô!ì‰KD…xZoN 1á®Ë )ômÍq­ùC ªcŒJ²h1Ã5_Fšl·= Ô¹6#lNOòç*1Nï5ó Z8µ6 ²OÔL95åaìOö*jùwŒ.¼µM"äb¨¸)èNbü‚Ȥ£[XPÑk4{õçu×iÕ¶éW[]±« Ž >J'2FçÊ¿|,}é— ~Ý@Íð¬G©àg³ãLÝ÷ãæÆt’r”~üOR;p}l-w| ®®cMº)ÓAõ,Ýýù¥üts[R, �‹¼˜? æŒÇ„Èêu³•Þ ³wh l™â'U¸Ù>\ο¸‡ÙÓä·[IX—Z³®+†­ã^Òðß�wH"]Iª!3žþ¿1ÏBOc>–šv¹T{X÷2ÛwMçj Ê$€º¼ u½Œ¢øRz�,ÇÔgôÉѪ@Û £=ÏH¦€/r¯ 9††þ,ìò»¬8é…µÛ²µÛC’yÝa1BnÌl¸ó[NQä!ÊšÈ|áYFõ®µ¸Ì@À‹wb‚óo6æ™7vEVÛxÉàWbbÛZ{‚¾«§ès‚‡wkR³Ur­õ$ ­ÎÖÅû"åv‹åÇÍl'ê™Tø�oÖƒ„T¸]!¯—´sãÄ.3Qo’|ƒ‡›­¡§hÈÚúzÞŠîR< °ÇðY ¨1)@:Û{RgÞúäøé¬Á¡r¾³%1["ðŽ.”=EÝV\æ¥DÕíŒ0¢æ¹/-5bª MÈ3‚›)-rQáì&†(óo©¨BäùqX¼.-9T‘¦ôØ·o,ƒ¹ç5“F‡F>ŽàÉð¸ã">»]bhî‡/SR¹Àˆv"Ñ}ÑÿôȨ̈h4jt ró­9ÃÁ‹6ÿ�Ñ�º6Û½a\Â)îë8^XOωTç°6Âoʡ󦼔îJ ëRϻʨÒà󮿒¢¬Û^?(fPb®æ×vÔ4³(·òø PñŸtš‰¾·*ÖŽNóÊÍ4áµ ¹A¶“|j²¢ÌIÕ*HM@,Õ„™„”Ÿ®ûŒE䲟r‚ëÓb�ñëÌ*ÛÔ ã�%«\#9µ7â¿-®–kÇRf•Vøî½oqþþÄïZ|'tǾÜW°ø^ðûáû¶ ;÷I�Ú縻âkÒþ3Æ0ÈK&–Xž¡íüšmçX$³þþŸfaM‚ò×å°©ägïÀÊ"0([‘¸êÇm!Í© ÔSpëµôé6aÕ)Δª’£õ­œ_Î>ö'üQYÖµÀ7>ø«iRFFÎY9¤¥+¯T¹sjîýG¨ß™|ݶüG ´Š¢…xåoŒOýŸôX�þ�šL¼Z¹ðµÿ*½EÈqÛåÓjßñR!…*¹ÎQ[¯<úÏ­i†‚uËèÿŠt:bP�°�|Õˆ[Ÿï¿_ÏWÑ—³a[:èþK¬¥!fª\Éž:õÊ’6Ç×_ïÉ>:R>ä˜êÑ.¬ËèúP¸ŽÜæQÓ†ßìšÒ ƒÅÍTWªæU(+Lóêú·6;¼!Ð…T܆8»BçÕd^ñUköwþ½'[n¡Ÿµ> ¯{ÝÛC!ÿ §½PªþÿÙƒ¯Æ�u•‡ç@gê-ÐS­·4¶v›Ù^GÈÍMhFo^êËQ sGZ%|@j¢¡Y ïùü*åÊ0Ù†éa¤{ 2„@vMəٰä¹=¼/xm¸+ Àj²nî[`÷µ{õê[ÞÞ‘‚Pÿu¢ã™ñsJЈ̱'ZR8M �èìÿÔ6©ñÕ_܉­«D[•XaM×äa kTUñ�‡äM�’( �Eu�²š0c�Ô…�lÄ$ì"çu&î“?Ø]6³ðSÌš¼=uJe±(ºA£&],¯Ów+sÚMœ3:jt-�«ƒPžd2šú4I‚]hö–çÆÑŸÓ£zÄÙLEµ=3(ú$šˆRù,¥™s ´øŠtº¿óûús�-ú¶p|WT0wçëe-wN“7“Ô«Ño¢2žJ6@¶$/Rð½˜oþ“TøÉ·ÕÙNCiø± Df[vêí×ë'voã|­Ö¼Ÿ©§œýM`™ÛoX+ço]_ÓK­‹M‹N¬\€è.Õ²¡Ûœ`VJVuÀ­ìë?¯�Å%½f]ޤA^9L@ûßäñftn#€³zP#"ZlÙ òê´¹ÕyŸØZÂÆÙay'O¡®Ô¬ë?äãÁaWÇÜɽ³uJƒ)=µtßèZªl6[Ÿ2Ë€,ÎAœh(,€;ÌM�~aŽtÏÐb±‘&'®$ f“ßK”pPqÜeSL9šW‚Û!÷lŒ`ÃÒ]¡Ôƒ±”ˆd+Dbë-¡G8áShx×?ɘ»ÈqÙ°båöYÅ€ØM&Ñ×óGÖ4ÝØ,Ïw#Ô¢gv*Ì¿˜Ž"¦B?8¢ƒ$&4MÌj/œ*Vo¥¼à¤Á ¹§,²œ’¯gu½pù]šœPh@TŽ¢·bü®#*1|´Ž­³°Ö¾j(©Sû5æmc2,0ˆ�d2©žú¦ë(´@¥e\˜ù¼ž×ÊùY½÷ÉØ9:ïêMÄyEŠî|­të£_16#1<Æ‹ƒ}äÆQÌü6úÞ¿]ܞܺ"Ä‘hK¼“œ¢Ëî t„—ãiô¸žÊô¤»‹§Ròù|•7Þ8�|ÎBÂäÌò%᤭(ãjŽ\coùæ™$ «·Ï×5lé¯}›:e¥E3I]J†s×ÛÊW ޝ¿P%×|� yýtÕ¯n„OÈA€PBA@ %Š(£Ya•¶ÒÕ¦¶ÚUZkZÿ»mU_Í¿í™#)0d¨±Œ))¦4R˜PР�ÀØY’`‰a5�B&±D@¤SJ ²Æ”�óÖ­[ýõmf¶¿×kkëjí­¶ÿ•m×kk+Zþúˆ@  DàˆOóêŸäʪňþê�ì3ý@tÌ ¬YÞZ`,BÁˆ`î&X4;+¸‚åÝÙÄ…TÙL X2‡"Hi˜wUi‡‚ò`D©2UHUVxxHb c ÐbaÚDÊ12ðʯ0ìYQAehy˜‰ˆu%Œ)• I˜BCJ©…‚Dº�à‡!eQŠº† ¬Ëªî¤3*!L°ˆv"T«2eU��e—f¥KL3L4,…—d!Jƒ$D«€ñ.î°Í0¬^K²²Ë4»»ే˜ *ŠÊLX+;˜"]бUˆhuT1F‘ æ @‚Ò 2Ì…cežB™ré.‘&CÈ—Kª»¢ÃD ªLY•)(¡šK:ÁiáÉf—– +L90Á¸r„ˆw’"”IW$¬²²)!H—xx –c+.Ì« ®!¤ÄªÄ8wfE�®X¼Ë ‚¦\’�`…FRJºˆ.gi!\D�\Ë8g.¹ƒ9Wwx)%Ýb]”ˆ2¬áÐËC ,¢!¦C@-1 1¤:´†`P–hw™U Á*¤+Dƒd2•%¥–]\†$R¬U–gurÅÜÁwgb’ª@x.¦e’°h™,È™V. f]™Tª¼³eeu,äAU‰�¦ròïÚLØ‚ò¤2«,Y٥ʈP&`´0!¢d+‚L–s"%–`+ËRA*"Kº»WW3%Œ*Ä4D,;1†rÆeYTË0…‡PÞdËÊ;ª ¨&faæK‚„D‡u† C**ªÉU*I0 …fW Ï êÁ¤43ª»+¸p vpªVÄ€ê$1 1QH%J;+•‰c �å%”™Pë€,°D³•Wfp­"2©p¢L*«&Týûøn^þ;�ùüz¿ËÈBPF‰¨’J&0šmµ­ú¶Ö¿ŠÖ¿ªÛkÖÕþúÕÿ­jÕ¶km¿«o[e«mÿ¶ÚÕ_õÕZÖ­"SA¤ÒfL4¤ŒÃ"a¥Ê�‚Kc 1„ Mµ¯ý¶¶­µêÕ­m¯÷ê¶êÕVµÚªÖ©­ZÕ•ZÛu¶×jµVêÛ[WmµWm­mºÖÕ®Õ·jÛkoUµ6ÚÛj½VÝ­m»[mlµ¶ÿ*­ýÛ[WóVÛn¶ªmµªþ*­[mkUMU[j¿­»÷®EüÿË÷ƒ÷÷w{Ýwñ÷{ŸÇuù|»øõïÝ÷ºý×7;ÏžJûîÞ÷s^î±FžíÀù¿�ߣò¼ßÃæK�ü{Û~ýûÞW/œßÇ\|~î¿wåäýv .êé;¯ò¶Ú«gðÞgñÜß¾»ßËïNwwtîâù-÷Ý¿…ÏÄß{«�ß�†fUP¡¡C»�¬ìÀ‡3 Ä)%I*åX+#0Ê�ÈPK»#Pî®UÕ•�‹ '÷®=×B_»¯%?‡›Ëø÷bÉë§—Þúþ?W¿}~íz}Üûwåé)\{÷¯—{½Ý{î7Ý÷½Ý÷¾÷L~绿<ïÝéœûß5ß;óçççîî{ÝÒñÜW?/|íýkUÿ~Õoñ¶¶¯ým²ÕSZ¯õ«oøÛoöZÚ¿šªV«[²¶«þ»k[ÿõUW¶ÚÖÝ[k_ÝVßÅmWþjµö¶Û?èa*‚‰ (HØÔ[#%±h´lh¢’Æ)4F•"†d²%QL! ÍŒXJŠÑbÅ©$�d”lELÑc$Ð’”F(¨H@ ªA,�‚”ÆÈX²h£šiQiMƒBdѽVÞÛ[m¯Úö-S+QªŒR•hÔZ"ÔQhÑŠ²V ½mUÿnÕöÚ­þ¶ßƵ¯æ­«ÚµUýûj¿Ómµ}µZ¶ÿm[*Ö·øí­n¶¯ïµJ¶õ«]VÙªµàP@O÷iÍ?òë QV\±lUÕºԘ‰.% °(•UT@ ‘E¢•*Z áݪáB+’%عr ³Iz¬.¬)E�ÀÒXL»Au‡—ˆbêÈîª^�Vª´ª´ÍT&‹2ðÊBĨ«ŠFy¡�3 ¡QèYáC*ÈrôdŠ" ""ÿdˆ(ˆ+ý•moò¶ªß[Uÿe­ÿeUWùí_[mj¯÷mmMVÛk×ûuZõ[[êÛZÿ�«oÖÖÛûõm¶¯ãZÛ6µU+V›*Ú•ZÊÕM¶­•¶´Öµ«…jµ³ZªÊÚ¦ªµªÿŸþÿø?Òn¿ìë§Kç¾ëï]w]½î›ÇkÇ^÷—My�ëÞ÷=ï/n ¹>û¼Rû»º\w¼ì{z÷½tëÍwš;Û¹�ÝåÞë®yÞ½êá뻣½îw^œsºs½ÝÝ$ït\:ñÞ^O_}u>æ»ÉîÙÞºóç½Õ绽ÇK·7žï<ç]y÷}ò/¸ðëÝG9sw®^ï�ë¾÷½sçy×Ý÷¿�µ­êÖ¿¶ÖÕþRÚÕꪮ»Uª¥M­U·¶ÕŽÚÖí[kUýkmµþ;j•Ul­­+k6­MV«þ6Ú¿�¶µ·VÖª½mSm«e­Û‘ŒÈ±£X±AEF*ddű¬B™¢4¢QX(1 �±‰”šŒZHˆ"Å&1°mj4Úºª«íµj¯ð«ÿ¶®ÛýÖÕú­»kUY[UêÚ®«_¶¯ûö¶ÕÚ¶ûmV¿�ZªËYR¿ÉU‚ØÔh-lmdÛõ[U¥MVÖmQk­Víµ¬Ûm[_ßm_kmm_éûüOÝþ'~÷x;s—×ß{éÏ—ÌÏÞ¾¿}s~gî÷Ý]î¹ð¹·Ë^mû÷uëµøsb¹¿6òÛËÆû®nûuó}Ý¢ùðù|¿9¼¾mE¼¼CÌo#^îåxkÃyùïs»ïw7+”]ç|·¾ûÛ˜üÛ÷߯Eú]ï½Óù±µóç¥B²«(HbìZ 9gT,ìu!Y”ÄußwËÝùz}}×ï¸ó¥åùë¥ß6å½ïK÷Þ~ýïcòïuöOvß›ó“îÚúútE¾^»¼¯Ëåî芿wï|Œ=Ú-ûݧ»_w|®n\¼Ô_~uŸ¿x÷î½îé_—ßw×w‘÷Ç}wîóÝ+ºçÍ÷Ý¡>îw_½ÇÎúíΟ½ÐgÝ_#qÝߺüýÝÃn~yÜ�Ò»º¾›†}óÕÏ-ú}>ûž÷«Ê?%û±ï®ùx;¯×ÝòûôÚ{´WÊ ~ó·»­Î~kåòø_¾»uߥϜ�÷çß7åá7®ýõϺ¾w½î]ïÞû[mkkkõmSVÖûU¯ÛR×ê¶öÕWó[memVõµµþÏn\¶»¸Õ¹µEcj-sUsW5\±knm£j£[˜ÕsmüUku¶öµ­ZÛkÖ«oêÚ¿ZÛ}j«ÕªÊ¶·V­n­­uM­©¶ÕTÚ­*Ù¶µnÚÚµ÷]7?àº÷^{»'g—ž÷o7{´w—‹—½íy�^O{Ò5μ®b’î·9r½Þ{—G—O9¤5æ÷qÍ=íï=ºíã½{›§®â2\+„–‰îò.yäiÕq»·I—�^[½Þo ÷Gh¯Rnæç4ç2·wO+‰éFº÷zî§»{îõÜ óss� b‹ºíÝqoçUkùÚ–·úm­ojÚ½µ¶¯ëm¶ªëjþ–±Tj¢Û£bÐh¶¿‹mµ]j×ó«m­¿Î¶«¿Ã»ûýÝÞKÑ»dé8Žçs¸w.ç½íéïsÞâå{®BwtŽ]ݵÓ&7 ºóuíÞí馗6ï.ÞÊS®›=u»Ìî§H®î�Ý9½r÷yîóÓ˜:÷n¼IÎ×g®òz{»Ü®EÈÝÇGMë×½xz½Cïo/d»ÝëÕÜ\=ïLT÷X9¼÷Ž„S�Cœ¤ÎnîÍëÜëÝîNv{ܵîë»¹Ž½ëÈ÷wr/:÷nÅÌžžFöîŒdJ¼ñîÝ{Üï^÷^]#»Þçk·IÝró¼O/4"õ×NçE×:»¹åç¢K�îc;—orìnìîäZs’HuåÝOxÙ&äóÞë�ÝÝÎI: ¸^ïxê;·žîîï^uîï;ºË®'½Óz÷\ó½î÷pg½y빺 ÞïwgS½î÷]ïsÉ]“«£Œî‰õ[WÛk[ù¶ÕÛZÖýª´ÛZßÛVßU·µV½jÙ[M­¶ÖßÎÕµ²­¿µ­·÷[W›W¯4i’‘"X 4VM¤Ú,!Dmˆ¨ D“,•H2b²TbŠ5FÆD‚3$×V×þ;[WÚ­vÖ«è‘›F%$1¦TTh£fQ‰¤Ñ�I–"Š)D�£ �„ÌÑ0SëmµýV­mê­oçmVÍYmV½­-Zê¶ZÕ-·óm½­Z×¶«ÚÛiÖ«í­©µ^Öÿ¶­¿�ª¯ëZH0Æ“k3T6©4�EFÌÒEf D�I1IF¨Ùˆ’-ELÙ5&£c&¢¾µ¶ëm[jÖ¿mªþÖÕÿ…mµ¿á¶¶¯Uµ~Ö°¸ˆ� D@ƒö(7|9pª•,%]}Ç»Ý=ïw½ûÝçËÝïOw]uç—wëï}ô¼:÷wºt»½Û“×{Ýüwn|$ù÷»½ï^¸ê÷u§¼]Þòó�ÚëΞëÂ÷ñ÷Ÿ~÷§é¯•ù÷×ws¥ó;Þõï»ï±sˆëë�ëšéÝÞyîù÷F<Þ÷ywNï½ï"ëë¯]ë»ÕÛÝ�×~ñ{Ý�w:ýÞ~úçºîî÷¯bï»wÎÑ_>î±^bö=:ë¾öþ=üzëçWç(¹K»gww{øë›ß]LÝî�׳‡—zêñÏzðç½»Þ÷¤ÜõÝÝן}Ï~÷Ï}uùp¼ÝÞ÷%÷wß{ï·=Øé»í÷�3R‡.ÎÊʌĀìñ YC–(¬[yÎs·.\÷vù¾_+¹Á¯ÏßwÓÒîè(ûï½;®Ÿ3»÷º{ ˜çIºû·éì½÷½ºî=î.ž|åøn—ë»ÝÞwÞûï—¿//Nh·½Ý{­Îçoww¤ôïz{z{ÎÞýï éßqíîŠõï^¿ví”÷νÂë“çº'C¦ë¸Üë®wß¾¯¯v¾‹Ž¹yïw{½›ø÷¼p»æî÷zW®î»—º/9={ï}éóÊæw]ݺ÷[¤ó²ï{Ýüw¾ïÝëÅ×ï]ž]$ç.D_ÇÞ=ïuä.îx^õç{¹»ÝqÝç�òç�÷¯wiîçf;žòO>ëß7ÜíÎuïž¾éÚ.�Ý÷½{GG]wEǽÕá½ë®ó×™=Ñyy»×¼ë·:kžþ;Þëç¦ç¥¼½ëׯ;¹û·×Þõ}ë‚g»¤¾|÷rbî÷_/�—9r"JçÞ¿}sÇÞbõ˼זïw¤rÝwbùçš¾»ÞÆžë½î÷=w^^—½Ñ¹Ø÷ÎFuïzçî¾—�Žíïw/8Ë×ß{ìù{ÝÜÞ]êﻄçyóœ÷«ŸuÏtî;ïW½Ó½î{¾õwßuéï½ïséܹxî]ïs›� šç*uÞw»&îîî´\½Ýï?w½ ~ýºûßyî;.r¾äêºî»ÝÝÛÞ÷{ÝÝ=Ý=כ˾û½ßs¸ïÝ^œûïžw=ïW5ý«kùڶʯímµÛknµª[T«j[fÚ·Z¶êªëYµ5«nªÝ[ZZÛv­ÚÛmÖµ6¶ÕÕ¶ÕÚÕu¶Õ]m¶ÕÚÖËZ•ukmu­·ZVÚÒ­m¿¶ÖÔµmÖÚË,‘¨ˆ ‰D¡’# %&&SH�&Ú­þÖ›WUY´ ÌI¶*4d‰“4BXKŒ«}[]klÛZ®Úµ-·Õ¶´«øÚ¥¯Uµj¶¯êÚµÕZ߯­í«Uö·Õkmõj¯µmí¯µ­kÕm^«k}[moªÛöÚ­–­u­WÛkj[T­µ¯Vµêµ{ZÛ­}µµ¿‹oVµ½`3h2•õVí[ZúÛ}mUÕ­{UkúÕZõ¶¦ÚÖþ6P0Œ™±bDdPHÉ"’Š ™#UZþ5´µµKj¯ÕmüÛjõm{mR­­ú­¿µmµ¿U­UmíU®¶ßurÜîwY®ìtgqÓ‹®îérSw.îîâë§'pîáw;¹ÍÎîœc.éq×9pK»®®î….r(s§7WèN®îvî¹�Ð�Ôg7w5«jV×¢Aî8ç9Ûa)LÝÑîÝK§ º:›sqw]»p c»•9ra×\sŠîãºâl¢2Îçt’]'nÌeÜ£»¦ç "w]¤Âæ×w]0 ‘ŽtÄ.\9»%ÜîÄ™Íp¡�ŒÝÛƒ @'uË»ˆR0‚H@#)ˆ’�ÜI®\¢�éÌç]w45ݸîº[»².îË»wuÃ%s’åÈI¤M(Lî®Üç;qÜ9Ù®î‰$æésŒ%$9«“.]2»®ìIw9.–·ö•}µ_U¶Ím´­­}¶Û¿µÚ?¥t�û» ¦O�GºççÃï¯]î‹ó‘/œ`“{ݯXo˘/ºüïÎ>k�îè¹Ó»Þóobwo½Þ¾÷°´åÍ0Œr�qyv—î×L×»r®}Ý^É�ÚéA˜Ó(æéd¿.$Kçcó¾î‹Êè;»,¹w×sÎ÷~ýö¼Lî¿{¼ï¿}ï¯ÑÝ}Ýùß<½”¦ó²îçºéðïw<¹:f{º+ç{»îº÷]}ï¾¾—|ïÝwÝw:îë›÷¸¼åÝ]%ùç<ýû«¿uô;»ÝÞî9×;ºýë£îãß{¯ws\}ï_+•Îw?s÷>èîàrtŸzñ9¼2QŸ— �ŸuÈÆŸuùõõ×w>—1…%s‡=Ýás¹t»·åÍëî»óßwÈ~±òàîû½â+ÝÔ‰ï;Ò^q KÝ×.owÎõÆ}|ûÖ>]ß{�×s=Ü�Û\‚3çíÄoΛãîÞ „‚O;¹w ¾wÜû»Úç~ùï¹rçLÓ&ó»ºS+çe}ÛŸv»'‘wwy¸æ>=yyÏ/ot÷|ø›çÏC3Κ÷q«º÷sÝ÷]wyäÑ•ÒyÍçeîåÍÞã– 2¦Ï—�Îùæ #Nû×åö…/w¾ýûëÏÝíê¾p=Ü’P†"ç}÷ï|½qwî?>û¤îæ|¸ïw„¾íä¾ùíÍîùíð¸û÷®x_—4oËsçs{½=w9}ÝW].Œ¾û«¾÷Úôïº,|é9åx4½Þ÷o»q�{¹¦kˇ=ÝÜp”íçÞãî¼½¼åîÞõ|«óÏŸ~öò\äžo}÷·ÎIòøöç—O:OwF9w»åìÆPû»îïv÷®÷tåóÒGË®û·¹q®ï¯nýû¯gÝ^ýß'·~;¯s»»ååáCÍÉ€ÅÝÛÞõávàÙîíÝÆÀŸ��/Ï?uÎnhf¾ë¤�»£Ãœ¿{Ç{^~î„�» ŒÏvûܯ;º½îD·ÞóÓº÷Ý|¹¾XßuÓÃî¹|×/? ©ubæTÀØËò[‘ ã!x+Ù¬ŒQ ­m�À­ t({´§š¸Æ_•Å$áÌ´a‘»æ)á2@fʆ—D¨Ö{8#uPȹÃ!Â>fE�ø J 7ņ4–ªµ ‰Zû| ß“† éoÕG“»reý’�! jÿÔ¬×9ãPjM¨Ë�-}ipóW5)sÇG6 4èH›Ö³Ûúãº^fÝâÇÚÍûÞ@‚pœ×¼eÏ[å’†ÄëÝ+T�Àt€AÏO£`J²ÅÒƒ–½� @ü¸šºji+Œë÷Ç =å¶#J[cúG4¶]Pg¥ ~�—?°øJB\ôåÀ° Ž’Jz%¶Ö"էܵ”.þj…ÎC;ݹ†µ¶Ý¨jLƒ I„6ÿHRð~j8î ð?²À¶{.u2Ú>Û›gÅ™ðK¸Ù„¨Q4í‚ûÆXÊîÆFûVÆU„2ÇUÎcÒaÎF]Í@M‰" _#{3 §BRŽÝG ß —ayÊO4Ù¾„Áó)Ç'µr&1vkÞ0ø EÖ./mp¨0ã”å1‰îÖÄî´„¨ ”ºàBª©ŒéˆÂZ¿˜-ûn¬”Ç!ömoÙš¸¡ Ä’øæô™ÔÕ™�\êI7Ø$Ï¿jAµ˜�ø‡åy*a‚ÛEÄoôƒË›…>ÑXè׌á0$³¶3uÀ11µ—®"xÝÒÖù¯‚2Ǒ͘H(g²4¤)³l[©Žÿ¿­.ã>Žóá)ã(Ö�²Lo§–T…\Ž ³ˆ>üÑœ7*ßM,�¸Kn¾±¬„Ëîï}jA2÷ ˜Ò46]DÆtfû%TŽW2»åiýF™æ+ß9,l Ý{ØŸm¥"Þ•ëL6 %ã×É<ÝlD/`0mtZX…w´N]S¢ñÙp¯úá5R÷¼(�Àן�í›éwi÷š²7_�9R»Bév¼·A&Vø=añõ6ôSÈ5D#…_™™€Îþ\hÇë‹n«x²Æ€ÔÓ@¬ t nõh0äv!ízõó‹F2$®8Må€Ðr}æ7tÁ¨ö©æÕ{@úteš£Ûž¶èC0áΦԘ1�7tnÖÁü/j#!'§‹é¿_%S°5ÊGK)Æ¿âÑœ-ÿuDèï±~Íë^ªÍ"~8ÏZÉs… ":úƒbpB‹»`ÉŒdeß‘Òý`òa[N“°“9M0žÇk¦¹ í®<Œ�ß1HRâ9q ²#…! {—™¤=¼8ì:{W`¬—Qœ–üd¾Ç‡s›•—…( P¡½# mÒ 0kÖª£Ãx+ú¬a¿s‰žR_™f_DŸ•!Ì4�µÖ ª›±�½rc+.!zÏ‘+q“ó2�2Ÿ2Ûw Ü6Í.”/žw–Åž†È!RúìhVsšŒy³?}¥i†°bP>$‘ß ~Ž�mU¯o¼Ö¡Ýú3m ]]F•™°Ó‡k0«‹þ\ Ø‹ÓvÜã¨Ðs„ËÖ0 ùZJœÜ;äk–¿Èê[dµñƒ[ÏÁÔOìÏ�¯œ“Û]¸ÐËÕ…=Ýì­³Ô·_ Ì/^Úéìx"›�Y[0iu~ÈbKXÐɲY_¦.Cr´Ásìßݸp$-K¬+±i€m.–©bë�ì"x9LZÖD>üñ¯ VnÒÎÞ¤ �8sak �X­)Çn±…ë¼hcB',(5lêhçùqæzOèõæÜ÷êfd½�€‚’àXA@@ìŸrÌè—f¸o@èB‹ý‡¢Ë0ñC‡ÁÓ¼ñÄÞö,) @9T—<”«K “æšYT(uÎ0j‡àŽM¯ë+ß�èó:‘“‹å„lLéÃêñõTÖ E|Šß;37Bwú9ÏsÔ¤û�FZ-3GZ&"ûä¢ì‚¼À_ªPéSèšCŠºœ‹Æê}=ßo°^$vGÕ±«{Ë Z nÕP#-n¶&È‚Ê&ZÏã#dNCxMàñè«TÞ±(¡/=£¸þÚ¦bŸ7€Ät2s— b¸H¤à ÅÆ•z;ÿýÎÝtqʳTßÌú5óßgؘ¡íŠ-cÈS"#�KÌ÷ã¼Øû4ÚçbcÅyÜpì¶á ³d¾V6[¼ÄŠ�æÓ`¢Ïrîw«Âþ€Ì>KÜ&6ìö-HWÞHláXìõ­]xÀ—ë]CM.—b�/ `3êx[µ3#:FL^ÖDDOÙ Úk-nä´;¿þål!î�:¤4ÌWèÌž(ŒÈ¹uÝàðUU¤ƒy¹ ÂM 2/€á}1rÇì諌Ze�/É(F ¨”–šÇ %2u¢¥Ðh*½ñò ×»‹ÒbB%CØKóaÓ¼‹ HÐ1(Û�†3%@#`‰o;Èz/ýÅQÜÿµè°û)Ú0p{Ì�M[Um§ÁmØ¡¾{kŠTgé•4Æ47P*0?ÖÆ/¢Vsæ 5)É[§òh"öçð-¶<�‚VÐô÷^Ù u¼½¢Ã`¨¦�Z¨ñB²×±pX÷gòýÊíãN‰óA–ô�6Ip÷[< Œé¼c•ëcjP�æPÀü6øûêÓX™«¶ ƒá¥ÕD^jàgž|ýíßjÓs¡IÙ:.× –•ˆ[ÉûØ…E ­Ã\fºµ+¦–›AkHÙO¨{OÍÌ^o#<äƒÞÏÄû˜ŒböfïtëÅ‚ÈÓ€ÒY&ÜrĽ¾2Ýí¦-ŠÈ…aÐÕÈAê©·ü Ùb˜�ã{ÜQòÉЯ­ãÈâ‚K‹Àm3eÌjÜw¬¶¡PWª€Á�(ðé¤`(&¤ðVÎ�/¼Óõqt”ÝÚÙÕ¨ž-.,Kg#CËfAÁ»ìµ P(œ•…ow¥“IçËë2“�ÎãS½ú®<ÁØP;ç•d«rÞ€Ó˜ëŃ?/üi(B©ðP}I=°˜ÀùC[ï&¹-DJÏp˜úª§ìá•�[ _`ù%¶%Éär›Ðü]hCžPÝ™ÃL�i¿)Gç^rÏ{’öî–’‘‹¤/AL¾ù¸½2¦þä‚üÎ?¹zoéÍëø~Øm»vPúfŠÑfô:öAä¼ÇóÏÑ:å›òûô÷ÑÈqÐ;/ ª,w¿dšÔ8�gF߉øªèÙ-ÅO®¹ÍÞ¿áÖy�6­�±#�ë}ý ;Xc�¹,ü.}ºÀ§ßvµ†l“=Œ ÄbȫM­*l&±éÕ¹NtVþ¬¥¡â¸X 北í�\âÇV‚M‰–¬\hKo>?5Ç?¡ž0ªyÈV«3¾Úí"âñqD4„L(öAºx…bý•¤GR¸Wpv0úm@ÀzJ�wç˾»¾ÂœÀÄ|÷Ó‚÷sy&:ÕŸš›ÆBç†Ê´%º�œ™óg¹@¥åìÓˆÉíÛXå äïŸË“Ž.öz}áF`‚‹ÇhKS¨{aÀðÆj�q1Åꡱ6éë >>lÙ� ²½êñBO|Öï6 Øg8k¥õL¥5ìI”ai$N¥³–L(Õ‹^Ö±«Ä⯛t‡Ñ‹.;˽Öü!½m‚6ÆÂÒ,ñ �m„F¤·K�]ÈVö¨6_¼áÏX<Œ1šŠ‰Ÿe«wQÒÕó¼ÄÜ;@Á�mæö&YýˆÙ~ëé2¯¼öÏ�èàÿýD¾Zr"#ÜDÚ‰T¨ñ@¼\²0*‹ˆ7`/{ç$ÙDømו$`u/<4G­qª{‘Jeúá¦Î*ð > à{3°•øL�E Ïkò¹æ°®+%à3ÜV1xÄþ;‹“YëÒRžlÁ}�⻾·‚¸ð”3 AÓótܸììaËwÌÃØ¨T�-eÅäÿD‡ŒûÈѸa¹½µÍÚðI‚Á@SެRD¥ïQk†VÉØQn¥€2؃mX0;¦ÚR!eú‹c­ ½µ“4tL:�j]“3à›ÝG®øÞÝì¢$8«æ‹*0t±“_{[MãÖÌ>¹±¹ÄQ¹iX=±7Ò$ˆ!xcP¾îÝ®M¢­ j)ú ã7aY;lõ— ›üq§jÀÕr¡péÄ^[€ôÕ°îÅ©Ä ˜ÛéÂ<åõè zí(¼ÏK×ËWì4¨œ“ ~íˆzaíšÚc"KÔ€¢&ÿPø¨¼‹`Û…”ÆÞu@Ø2!±½X%Õÿ û…q ÍÜ4g,ZÛn ÿ ” áä,‚#Bè•û"qlZ.–鸽µŒm.p¨w$äyß�0àbÓ»:õg#Ž�[ Ò±Œk mŸ -’,5¹$`ü‘jœÇÄAÑÀb]¼V3 �ÓÞ¼Ÿ˜.Ÿ�AD/»Už?=~ÝX‘ß°ÏNàP@EZˆC�w xï$5ÌH*ê˜G†úkÝÒ ‡Dá.ÏY+n{"¾WÚ@Ã%/K™^F^�ž£¼ ʳ«¹­Ì¯|’êÜå~v î/wF`ß΢âïëo0 ÚøöãâW‰J°7þ–ëåê•þR¡|«ÇH6ÆÐ¬pµx@û*GÅaû³9ʤzйÑyÙLg娠jšJ Ï|ÍfÆ Þ“Î ç…ƒØað@\Ù|'ò…`œâ‘Þ3¬¿ÍrÖ±rÉÚgtÆh´¦vAqÕ¦Mp‘”©‹ {Ö5sê Fði�ât£tÚ•Þ<ál=¹fQ¨ëꆃQÝ)›²1k¢Éн`6æù*õW Ö‹™:JRVyt´.ç,‚w5.éðý™:Ü»ð°ÎvoȾÙË �ÁbAA�À�IÈð�Q–ßgSz‡deËÀX’L&â†âí_ ÈnˆQ`yéÓÅtPîÙw:fC�Rฆ³<Þ'r‹ì¬j+¿¹Ý¯âÁyñ¾>0pî—B‰†Ê™™n HGy]çÁw™B5b±LD¿¾½šÏ÷ÈxÆ:\Þõ ÔÈ?Ì׿R%6o%g’8�y4k“p@V+³ѽƒ¨ÝKr¸vÑ%¬(£'›¯éªá»)6’*×Â-?Œ¬ìÙÙ.ca8Èæ°ªì;òðddå!_²#vmªmêDÖðHá|•…>¸lû±¸ø“/šÐJÇ…^†ý»ŠíãÒ 9úb á�§Zèý®"Õ"‹ñÖté+; ƒ'ÍI8°}ŽÿQâÌpW�Ê¥+a¾iRÚlþD'rDM­N¼C]ˆ3ÇÛ„4ß ›µânŒËv<™žþ' ÞÇ‹„‡û„9БØ‚RÊcà�GUÒœˆ1¹b&ïwÄ Ì…”%£ç®È 6•ªkTN­}Ê€ÇL1°òº3‚µÝ”÷ ¡ ™¹¸U.;‘(Á�µ6[ϦJ'ŽxŸºìäü©dt«7±îÙÿ'[wðy³3ºÂ1¶-›û}ÍÕä:3¸çvÀLË$r¤fDF8<3dB6 õ+Y&E-ÓOoQ°£âM˜¡ÌîÄ_;ÚÑ�y“³^•˜K�ܧ4Ù5÷ùª%ÞVð˜þY°G@8»þ¦béCžçyj_Þ,—�º3F6àKÇíØp+à1°$»-Ù+ýj•k½ÀÀ�©› ìÀó7>ßÔä¤z¸#ˆpX5pìÖ&éF÷@A˺¸CP‰Ëúü…¾´DЕm8ZäFÀö/…âý�‹p®#ñÍ¢#(3ûrÁ¤*¶ÂžÆøš\6rd½â(×O”‰_¥±P1Íœ-èkÜQ£ƒ13¢ŒŽ%Ìv°“X€‹?`ÑZïwa|ƒîÝp4ͱŸ ¬¤6aø“rhЬ:¤ÉYu¿fŒ1 ‹_�¤óÞ•ƒUãaÂèÛcmkÓ´pWã“ µ´ö Îð®¬8GR C»/Ka:Ü•.�cÆ,Y°7åµëtGàgrW,œ½èÃ�±•˜åªq;<�w)jéižðò 9¢¸Øµ°íp9OÇ -"•tŒ{­eò÷ä°µO´zÒ npÚïqŽcÔ/8 Ÿ„§g|ŒcwÝFmH ­Š9S†0.~š »0³^/¨^dí�‘G ÚÁ^cð÷)Úªöpcümß�ïÇ3X†|Š,çö¢Ö¬4à~•S‚»qQwR:zÀ¶‡õ"H)jF˱çÖ†À¥;;/júïÁŸÆöìDÍQÈ(NAõ ¸+÷ ï`üÞ|X)ì7 9Â�Õ%’÷m‰|˜±1Ûó�¶­§ zÉû7•ÀGç¦î45É%wÕe5�¶š6“2%Ø«Ål+ÃV…auój£hæž{ÏTw³™L÷�Ÿ#: ƒÑÅ-z[*¬†=æÍlóö®˜p«ëAe�š \›Œs~º ›œ,�ß®)úßJ†…|ë²´ÙÂ~ ÚKb¾z4Äܺ!a9Â1YðH…­Ç­`ˆMK©$ܵ4LŠÌŸ†5ñ¯„;avöõW^âÞ{Ý%{¹l‡,™ä­’átÎÄ¿V8>ñsSøÛ‹ÁN]µÉX­a×y'Y�šnÁl)ñ 3C¸)–‚ó4ºÊ5i=rbx½Hz�Å{mLnò5ù”˼ð±XÇ×ä˜q>:GÇØߪmB¢,Gb�ྋ kåš¡¬´ÛW ™–A›Aú@Â\üPÚ¬ÌNrÊ}ûW´â 6T€±|P¤‚"ì *¢IÍ1âøB°`œ˜ÿÖ áçÖ ú�²•§ÖÕôù�Ï·4ãr¶ë Ç’†œÂg‘½]ˆÛŒâ¢ �%Fóö ñÖËçÄØðá(½pS(œµ²èÆ ©Km(<¢– ¢ºK0ÉIZêFe�+ˆtá_ aŠ52*Bº´ä�×­‰jö 9ù¢ã÷O#+D1 ÂûoÁ Æöú¦q«å"ªOGCãB6¬²R‡‘!–,×ÌÁv9Þ%õZ­ë<ðÓÈp”ŠÚƒêšb×M‹þ|œIÃ�ÄÜä1ÈÑíC`¡ý D£¬º.ÎYš>…Y`˜(Ñ™�üʃ\ßLÎán¡Šœ¢­~ÇÉ~†¹§Q¾XHEQGdRµ2Šd¬2[~µÀlàI‹ÉГ§Ñ]l–oixçåÌèé<Û°�·Œ ƒXˆ RL’¨/½`«:3!®ólí)¶Èê‘X!µ ¯¶¬ �·3ÝÖrC°SÙúB wóòOMø÷Ý·5ƒ‚?ÐÏïD„'ÚìØ8î"öá ÙžK¯‡n°Ö¿ãà8õîêó;úê�kˆq˜ð¶ ¤¶=¥Y¨2¾1‰Ð�k#„À%ô†60#© š`¨¤\ÚFv]A9÷BMõÕÞpœ¦%�´¦Æ†ŸK²�^ •úå¶ž¿^ÑÐe|jq‹›×Z¤zwÞt­€ ÂsÛÙB ,Á@~ò‚º´¼\½º©yyÀîu$÷ oc¡á¯‡ŸxXöÀç8K–Ÿc&ìã‡ùµÆ×yø<çôŽbC>RápüüIã;û¥Ôz ¯®gHŽŸ+öBãKî +ÙðB‹<†À¾¢PŒVlVˆÕ¯j}ñ¬…ôDÛ÷Ö£¨ø² à½60ÈN±dy²ô8\…¶'Õ5¢Õ�T&5P…W £»ì¨­ã#¸ñÈF&mW¬QÝ'óN“›‡‹Õï‚f¸Ô'rîJá„¢²§Ä­»òö{a- °Èª$ï,©ÊÄÜî}í¤ºåŽå«o^N ¸·÷c´=è…ÅòÈûŠ|[1¯ÂË+åaßsÝ×çßUäÈô|î+_ëðï%{§É ¨Ø÷!*Gz9 Ó’5ôÎ_àÖÿ7ß÷»¥¿Ê\ðM¼%õ¢¨‰H�ŒúŸ%Ñ€¶¹ƒÞгž#ù '$ÃlŒ/?ðàr€¡J èôI«“£7õ„Û+«@Ú]ìE‘ :e@…Ÿæ;p¥ÈžblA+¿íƒPCÆ]¾Æ߯Sh>é‘;6›±’hNe¹óXvçõ÷ö&cf*/”[ÜAþœ¤P®S4¢âE­Úsé?­f† ¡j§ê!ÅñŠûÑûº´�1|GáÞXR›|™¯šgú¥ó„÷~8Þ&ê[èºÜò-’� ÚsàÅŽ�Jòj]ÁaMÚá8™’*Ð’ÐäR⪑9+·/M4ˆ™ÄV1î¼…Ã,L‡Ëš®y�“°£0´ÖKwÅ9®NÌ Ÿ[ [.Rïƒm öVݬוÏ…Oöýˆµ7\´qE ùöFá¨÷uš)ÕF›xÖÂêN‡³U·š¨ŸX½p%æépé¾Kº²ÖPùt¶×zLP£ráæï6å Ðð�r¿Ÿ·Äó%Š<û3TÚ * <²_ÂJ+ÕuÀ¬Ç|lÒ}v¢ÀZðs¸p*ÀîÇYé~°¡0�䩪©ìþ² ò]ôx¾Çœz›n™ž£Æ?fí· 6Ï¥·˜ÙÌGe÷t¦ÜÏ=¼êåeuGá<à÷Ö^Þ$Õç2I"„¼µ-æçõ™Ç¨F¿ð®°–ž[ë´S±kˆÒóé Æ”`ø¥ ÎÏ =wÛøÃ›´&”�·æ·¤5‘ƒ©ª|�V\¿Â¸(œ'ÖN¸Y™3¦ÌûŽÀ”L~Y ßñêé¦ñnè !Og!)DáâÏ^>sâ ÿ„ „6JÞö¡ ÝÖ�¥ŒûåÜ& Zœ¬y ܲV{Ûà" ¨ï�Îòs˜Îœlj‚÷¢¡�Ïpž 5ò{k‰«çi„‘¡"¡–Õ˜ˆö#c©UíGÏ�î”tS�çÑÍßê rr1V�½!ŒÏžÅ¿}8”= þ¹�(<ãx‹|K2ÅÌWá¹v Ía%Ó ç|�dø‘À?ß<­½€àµUÕf×êÎww±g¯‡{ü†&‚nEUžÇïÛQu¬n¯¿M›žZÑhT0W.aŸtŒz‘7sbÖ¶f‚�$O/6­½›¦÷•G?Q>Næ°›L´Ã%£k7“ãØcŠà‡"êu9=p€«…šùbl¸TùW‰ìɶ¼×*.c"²m�ú�…úæÚä¨óÔ ‘CrËX• ;ÖÌÂ’2ÈœÉ%„®9‚~m‡!a‚œ€�ÑåjFÔA¦%™@½âõ;å§îTÏwnXëìþÇëZ¦Ê+/ïr’Ö¨ó'‹ƒvZ¾tÃdá|®kUXy–X¹ú,õïª$ÑN–~b.á-aS¤/o{HÛÒ.aâˆæ0:NsA¥±¨Æqænp)v²È†ÏÏ €1í[ÏìêBti¡ÆÒ”µwæD;÷é,ä�ËqC…`Óàfý.ÛŒEŸ{49ŒV­!PËus¬öæ {hL®Ê#¬-ºv•5ÅX Ѓ¦—I&m¦w©)VÒZÁõÜ7Y±æ�®Øw¾ÚïeN £¸Ú5ºQT8/9¾ ûYbÄ€ùY$À@~¿ÍZëÂM&i:}ä\g*Z@o´_�O#¥ÇßiŽx \[Ùê:@±”Pñ§™ÕƒÔOÎͶúákY7œ)°�†É§M§îØ!¤,~Ïõ¶>/tù"`a"ÿÏ«°�")à¥1 ß»CÙ,i-{" ]‡E¯€Žòê$:¥Ê9âH"1õ‹/f ˜<Ç—ã(M*mšIbw”tŽè®R|é+dU¶·˜^O�Á¿K –®�T\@ßoL1œØÓ¨f;N”)dé¢â5`ˆG{‘¨â¹Å›þàîœX /9¬˜dÛú¢èçãr1™Å£É}†Æ©y�àY°b€õ?t¶]üF›…€Ø&÷0„Ì�Çöóîc~ÍÛÜ”ÕkF1àå?CšjŽÆa öf$xá{eÌXo9ÙƒœªÕp`m÷Zeë„�‡ÊG²®…Ìïec7ƒxÞ_�#ø>-¬[ ûdÉPE§`¼÷mÞSÕÍ)Ö÷3‹ Øaˆ9'kß�e¸�•™~•ÏMì ‰S¦ê<» î�^ôºø¯P8¾Æ¼õ‰ P¥ÞP §5HKö­CºÙd�DL©M¡¹- Vd²%4Å6—rŽ¥h§¡Û¹é±ÖÉC¹@óðØ¿Zγ[%™Ð;¯.I³ÈoÌݦÞÏ:ñ£ÛRk\ë�fŒ˜‚Û8è÷®¿™HŸ³Kl#FþñϤ;'êÕïu$¼†—Í(Ùž|Þ\àëœoZGA˜í£Yæ^Ñ˯Ìl¦·L6G¼šâcZ�çó0' ïl�|;“Ú^)ˆO['Å,Ä+áqZ[çÓXgÈL¹€âÒ錾DŠ/†­ãöSvÛ°ªÂæo—¾÷%Q�o> lQî»@‡Î$T• N6JN'„lpïõÞ]¼«K¼z Ÿ‰}êçonçÒKPòx[(,­6¡ˆž¤;�.µ}¹‰ßnÌe‚Üå̪bÔD¸3ÂÃÐ#æç�ªÞGƒL(2á,p.g¼û“XÖ’ú¨‹Š@¶§,õËŒH6ç2[X%nsa¦ºó&0ÑŒ2-�B_œóóÃi“Û¯g â¼î´c)¬PNÂ7§Ü&&V=yFňÿ±v¾Õî¯Èôªr`¢fQ�œãrxE™h.Å­Ú~µ¨xl'îN >À[¦6tbùc¶¿iD<º�o_TTzŽU»«ln\ÂÀy¬Ó¡ãÐcâ�xŸ»˜J�²¸?9YÃrÐ4�Ÿ¸A+Ì÷?¾Ä‘ÛJÀ¨Q; ø¬öa ¬ïæ½³\q׉Å)Á÷½jÝi|íCÁpð£_& 4ÖýŸœƒ�’ôzÕº/ެ‘óÝè+Fb!_-ð�<ÏAñjØàÙ/¿"¾¨·FGaažF<Åaù“^bÂmÀ´ä %—?\¸v¼2éNK8ÞÆŽ%Ýl1ÍwÀe¨Ž–èþ\42*|y;bà¬6gæ5dR¶9±ö9x†{0 CW6ìÍ_ÕöQ(² ½bqN‰!]ûºçžØŸÍLM¿uûÆÿ z"&‘ûÐ Aþ  @&©ŒñõeóFþiÙ÷W¿öİûƒoUöTóZ>4ò- š"“‡êkйEfÖ ›,WCÀâ×F­ömE¡Ü¶·i½ç3œ”Œ(BEl d…  ²Á ŸU™#£À©çWÎñ¸C‘züÙeRŽIˆ¡….ꈂ!Tò�U@É ¬À-—ŽQJRÔЄ EˆJRŽP~>bŒžmTÚÊ6Bxtl@O4T`¡ A# §â€|@Eg_ š��CÑP%œ«ˆABˆ!*rpËÂ$¦x®@ÍÖ˜T° '„ ªàøBiÔx\øŒƒa*€‘PˆÇ¤'¥Ê÷N¾­I5>”ôŠU@Ê�*ä¿…@ÉÔE$ô� Zªœ4 l®ÕTd¢X„\º°ßpü"†½fP£JèŽ�çã’ž\J°(¤ Dª""#z¯µÏÜ}nqCཟ6™[®aiG;ªØx{ÿŠâí6¼eïÉÈÞg »æ0ˆµÛ ¼µKFå Óœžì(Wzfü=ÁžÆšýí%E” #&ywއFž—Nà3Ìâde ]íôŠÖ7mí£®wщOÌÖ3hM§;ƒw·|[cñ˜(guqßËNm¦lz;Ž úàþDDD¯îâlQ³TÏê zn‡Ÿ†˜«DY«×Ãø"�{¡''±Ͻ·mcˆìèø!P Vê¶?¨çÜû´¨þÁ0¿Õ~®ëÆŒÔóôÓv4ŤãîÛòº_6ðÔÚ÷°D5|ûù¥™2üÈqϱô¿÷x¨û¼Í0……Vˆñ‰gZó»p´³•ë!G.¼%YöZÑ 0±™ÒÓ‰èÞùÕ"Üö]˜˜ám~ÓÁd²”÷Ò¶‡M_Úh7š®ÑßQSAg­ óââÿ¾¹ÃŠ™Í¦w• È"HŇ”¹Æ¼°¹.‘`¿‡5Úœ¡ÔŽ[¡o£-eî²CyhΠú(7êð{‚Õ‹ò‹bÛ{Ë´ Ìî,9Æj<œ=ïDá 5¾½­© Q \�*MSg9¾¹Þ/¾“ ^Ê£Ï�…O;ÂZ$Àmœ5 [{[aöü§ý›ïŠFý‚¢îýyþƃîN�”`#޹0rŸ4Á÷Û§Óߺ¬QâšÀüÏ”3¡úS3ÛaƒØq} }âî"í«ñ­�Rìã+|a†–¸õ\™¼ýR¼ù÷¶D‚Ûp‘ªâóúÛ�›é´Sõ«û«f±ç3ÜM婵§î·|µÌ-Ê…¼ç¡h-r_ïœ$³ªÞ‘lÅz;“ø/.0*pKV²bÂ)iÅÒØäßЛì=k�I ØAÎL1«"¹¤è®`ÿ¼�M<îóî¼×9½é3�Z`%û)¥œ¯7¾O"­s… ßßyQÂlòf„q�•ÔcyøÂ¤8w.aV”Û±T÷3!Ìt< ?´�'ç`‘jÇ þ¿×S² ÇÔgüþZ �Ù&pàö7}¦0kÅAþ×¾9ͱF=¯¾ìÌwØLJ­‰\ûg+)gæ€&«×‘´·£¶vFZæ¨u¿>IF½¸Míîàa³Íøô¼â¶O,™ð.tôØ¿¿¶¨*�¾h)Ê—‘# ˆ!¾!–æŸìˆ€X¶q÷�?œ]ÞŸ¼†äW�FìWu£×m’®å96¡-¨jXý¹N5Ër­,XÉ Mç‰å¶ø}Åbc¹¸òvȈcqÚú¤&X/ÝôD]ýÞ~ÜÞá†L�l3ö«}·ìõÌÆé!Ùaãx;72»±´UÇš{H'\ùÖÈ£yCëÚՒߌ «%ro}H~”>ÚÖq&ñÊÖ.°•�2!iû‚`l¥×ÌJAW�œüoyMŽÝ‚²¡„îû¿¼dŬ›Û|—Ø{ƒ\`Kµ…;9©)m rOÄÚ½6)úr<>}�÷–éŠ09R9MßLœ_̬ùà-ë‡Åðw–²×蘉ŽòÒ¿5�ÄN)UºX|dIMT~Œ*^/è¶Á~,ô~†§²RkÚÈ.Ó!Ë‹ä8—ÜwRÔq1KL,\Édn)ô…õ�U(c�Q̼a>ßžö==áÇ ½ì–|ÞÂ:ú¾ä‚»Öެnœ?‰.å/[°ØQ~hìc>öh¨MõäæÏCr5Ñ–7øˆ+Meù :Z"˜ŒË^ÏT»ûœ?{ØÁàIö;€ñ‘òpÁ¬wŒŸ�jiàNˆøžñûòp‘d|ºD²�@åù–¢,J 캒‹{B¿~¬Ó¯Ž3; .«~”€æí~c/ zÍrY›"ÏW(�|s/né0™µkSjÂÊŠ�ÛækGä¯s—!b¼™y^ÝZ¥Öᬃ|'`Ï!,í {ïýI`]¥èÏ£‹—ÜGñº4`õhòôø1"×DS÷¡\­|¡œa´MðNC×fØ”PU§D‚ü×®Ù¶ÄžÜy½†7-{·Éãñ×uhXD¶+B÷¿EF’ìlÊ!õÛìR†€}¨:Åý�¤N\yDÁ¼Ãü1Ë3¤É1åJáÛ÷Ðõ^•}´;dm˜�JTýjãÚì3ôeÞyj°,áE•ˆßGÄÜ!<‰�0w“j8ÒÅWâÐ[,©¤ °FïÄŸYÇ<)àÀZ®ä{b®Šºå¦ïâ‰ëC½q¹|嫱6D¬-ÅŽuÁC–í-åµ�¸™Üt±Ãôg6Ån®ÕF�Q6²QÚÚw¦;¿Ø·a™¹˜|ìÉÞÛÚ s÷}g×Ñ–Ô¦qänØ7irõ€K¶~`GwÉvêWæuFÇ ízoO@ÔŠ–ïf2Lb Z Ü€e‰�\¸Þ‚zѼ'�ï8ú݇=ß„Õf -Ë­p´%F‡Þ»ÔoeuÜ\÷|… ÆüÆ\¥7†ÝŒZîæ\¦xdžäžÊ'ò]EÓÖéÛº“|…ÏLî˜ÂG²fWtlÍž!t§“ŒK6·”é÷;Ô†•«‘˜ÖGry¶Ûq¸ÀŠ™ÐÝ®ùî^òGŸX|›ZM_»Hy/3Mô�¼:Î-¸ŒoT×U©ò¿b‰0k’†Åõw–Ù-æ�ϯÃE¡ æQ9€°gvtyµ”o¶- Zpvõn¼mmmmæbÄ—lòŠXD7Ž¡ãÑTüêw¤K¾Ýõ@xó¹®oÛ‘}R–ÓZUÝ¡„ Ê JysNs‹É?Úã©–÷ÕÄx¾¥•Y1ÎEÒû�ÞG'f °ê©.èàAõq ô¹®Mn>S°”n�QÚæÛ®¸‹y*�ɸ¶'˜lí“x½Æ«&ñÖ´é»ÙQòæç &�ýêâ{Wm6â³Ñ;0.°{pqÂQÆ{ÞÁ‚õõ²ñÙÆÅ°ioX˘F¨&ÅuÛÚÄAlsæ\lÙ#‡ìDnr» ¤­ œ`î¤Ô\Ï/±ÆS×Ä•â`®\GUgötžõùg鹿8}ª°ôÌÙD@ €=€àD¯7<ä{ªf­S³î=da«Y[1~ì±užÖxΫ¥=dm¬l2¤Ë<†²-.-Y\î¥à^ˆŠZ‰q$ ¶Ñaaüž®>Gàó ò³{BŸ£p¾óY´ö@ CkáDL øø­$Dœ 2IØÒ˜†h]Üm5ñ•�ÝÀÓh õTnà.ëô”ß)TJÒþÂàÇBG€�ÕkxKB(†m•¶Ð<@{>‹{ ¥Ž”ÎõW^ Ô1_õ¹˜Õ Ñ?záœnoæ¨[ #PÍ'N;‡w¹‰šº2ó�ì¦ÊùiÓô¨5(’hA�pÆcA‰‹ûËX¢ãž½M w3KÅþU•×yærMë¡A,+ÂV°‘_¯Ø4Mà¶Ð|ϑٹ÷ï•çG"ú›ë¬;£)Ô¢�Cï;¾m¬ß8¢Úª·V0Ì ›•1kꡞ’§¤‹8éþ:,ʯŒÍJBçheA’ 02xЙ°£n™I´¬qa.£"[¸é)˜HSéIç8·å‡EŽîàŽpŸWC�ôÌdÏ›TÛå.£Å|úR—ÌGFνÈc3a«‘ïL‰Bkø3|HµŠç£®Åpìx\(—‘¦ñ¦ü§÷oÌ`WEV2Û©¿H�u Ø#HW¦•CJŸbóh#Âl}yV÷Pxa‹Út¼/)ÊÇ~àÌå?()òP!àV6ÃÞ±¶Ë:jMw»£3 p¥ñ&7¢04û'Tû{~óÈ –ì§ E`÷NÃ> mˆ2´;%ËÕ:`|y¨ip44ÉòÔï¨#2 Á7;òZ0§�Ѓ“”ýø?~ùÜsï}ƒŸ78REVøÿ8}ø&6ª©nr”dŽLƒ�VxKeB�“x|SŒÚßlbs6éí„÷9¦Êã³!ŒçoXâ6‡z –ÿÚx4È2&ÄÌ!‚jæ†÷! -8o—.Õy­£Ñªy[ؾv§AâÇUy _Ysi/wy¶Ç;ïJ_»•9G5ÛÎE§3«/WyÆãàƒHÍF8çkV¾Ê˜ #-�YCaâÀ y¥�Å*e’sBW!ßÉ•+aÓˆ@¼ºdŽ2àž�gÐ-@_'Ö¿r4n­d¦Ÿ>Ï�Ê…©h?=bõð#è»ÆÎÑ�mÍÇÅ¡&)w!&”èÚ,>çg«yÁD‹€»Èoy 3ÃÀbIñ—Qq1Ÿíü÷žïA¾{»¨o­ÚNg €MöZ�Äóšvê™îöDndêÕ�g£ŽXƒŸ¤ü¸@‡ï–²~ HžzԃƺÒïÝYÞm¹ÎhzÿqèVà{ð`øhïš8ò¸íñ7o}6V“<£}ÀòëÎ û¬'â`´‡Ôoôñ¹ÄË2´ÙÂÅœ'Ϊ¸,jê¾bÙ4°Fû˜!hß Ò‡�š²ó·fñL.ótkh•"§½¼mô  ji¿�õ†r›ó]/×b|–:~ÇCÚ«)Š[PýoÉEÁ¦(¯º‘í£Ä)ÒP+ȶÕÜ‹wˆbDæa�‹„sú­o²÷ÌY‘ˆG`=@1I”c¾NAoÐX¬kš‰/ÒM‹h�8¼„«iGA¬ÂžË ‘€|€h¾nSœëTTë³ Ôñê×®. ²‡¼-ì·Z"C­m¹�B0jT2¢ž<ä�A;4�…«@*pÑaË“rMëã¾�Bï<±¼)#Xµ•Ë”ÚêsWë9þ-¦ó ;K޹…ú Y³Þg‹Ó�£4ÎL1] ú+LÙ°È]Ï�OŒa‘€ºX++ž•’¡¸ÀI8qS ÓþÈÞ0?¥"CJ TyÌÒÄXuŸ-Z@ÞÁ¥Û•ž0·œ’¥¼�A¸dÕâ�U@Ľ¸ßÁ}m­±´Ô¡:¦`(àKŒ¤9}¼Ž“¯hîý´l7¦R6p¸IßæMU¯Æcqåò}éJGgå‹ÑÙÓ9A0V»:¡»3šO)$4E8,\|@î¸ty*Öíͬ¹d@(7åÛuñ¿oy|’_+à’±“‹Ùpá™�g?Zå’À…çS‚ dƒjŒ~/onM0œ¯O<ðwº¸g®]Ëiܪ©1ñ÷)eµlx!8^Ž“²éŸmC¡f]mÔ/«]éAdö9°ë‘Ý¿—Ží¸â%™3 ÛÛj¯ðÈbßUΠ’ KƒIßÁÐÞª±G-žXpBÌ wUªµÌi¤Ä…®0á˜QY˜´‘O·Ü–YLꦂŽ<L=î>(ãçE™Í±óã©�¾­�þ»Fƒ÷u›ã�¦9�63ŸÑÒ&@.IÍÇ)ãœxü¬Ì¤BÞE@{-ZJ.T7–r#A½UNl˰Á«Mi[e­S†ôã°pçƒTÀ—æŽÊšÙ½y´\ÀM.'�gKW;`ŽÁV:Å–|m_•µŠàpûÌ�!í6´¬PZ•±'m�à€Þ—›Ì7˜#¸óN‰ƒL!”VO «Ùm‹gö ·m¬vÖq‡™B G.1ÓÓ÷±s‰Ë-ùç¶C¥ËhsÔá빓�c†�¸ÊÉo�œ÷°=Ê;¿nìÍM> ¢¹Í´dDe�!²Åèúìâ¸eíDG¡æ /%£žÙGèŽØ;¢Ê•|n(¶õÊo=€À4ÍU¬£¥{GÖ¶àhž&f1sÃòÙj8£Ä"‹ �]DÕK¯žéô éä e+­!3[� ØÁÁŠŸß1øY¨ƒ’´ô-�Àè©@,¢ðô¼Å¥²»YÕ¿ÉÖá F0¢�‹`‰àuúÜ¶í½¬­Ìé>(AÞ.A”»HÖô}v¢°oAéxܾ+µ a¾¡a\ñ!eï1P‹ô^º]6ui.[˜Þˆf&K«„à°˜G™Í°†ÿÖ`…³E®ö¥¦1�jó�`Ð1Ûåñ0X ì—…+Fy¢yuA[õ&H>†@»Š-Ú'¢ü‹ à@9Á»�¤a6ÁQs «is%‘  ÆrÝßÇwÕ¼ÇÖÌ3æì ½ÙE“"úÝìèL, °[6Càn€èèýÖù¹ÈuaEåL% «;¹FÆ×v’Ààlï?yT�Úþk£۪gᨠXg6ÕMsaz4D4ûŠ]›Í;?ê¥"§Å½ï±»Ò{õ/3":רˆOj ÎxÖˆ94å¼€¨–:¬�Z¯œ=¢­WDðBçy î% 0Q …b,xÚ&*~£ÇEçwÈ×o9hç­œÝÞ;œÝs{—  Ã'—�7ÀZàä@oTÎeù &Ÿ—_ìã‰@É`¹™B¨‰%ä–Íÿ‹ð\«ác ÜNpÎë€]‹ä®¦ì³‘Q7ƒ/•Ô‚Îypîü¥7xÀoûÈ‘Êr)3{¯V�°¢pÈ�}MïbúÇfD#o;𥅭7DÄ�Ô~È“b8ý—TÐ6Ü–¯' !DèƒÞ€^VÖgè•ÇÙ•z„\.=ú4{=àœyÑs¯Éº›Ë<«Y2W‘ >ä ` GtY1}Ãd!sãGÏiÓf¢ì¤ ‹¸0#¨ÇQ³lHd»ëÈS¶�ÅRõGZžcxÖªm ñÙV“ªZµÎgò…ƒ/˜™•Úfž”Û¿±f<¹í´$˜+éÓoa³èÈ]AkíDçuEi[�±§û·Â¾·�CIìäÂ;ïy??%�|SzT•_ghݸú3k¯Ó��”µ‡µ]´°?šìŸ–ÊWyµåõ×Ñ·deÆðí}�ÄüƒÁ°E´Xù¢Ó0À¡¬Õ*¸ofk…iîà°¯ ÂwWõ^Ö Ö ÿ›’y ®Æ±Ìc-pÅP¶Þ­iI¦Eïq…æ§(‘#©Õä9J¾˜À‹ û,Xb�Yöqî®]FË¿®¨ÅA¯)™F�­s˜ÑlÄ‚ýîòÌC:`úeÒàyS0 :Ò¨œèw'p[ŸjTÅqë]d�«ØL¬ûh;;?Ã`Ã,ÍþÙÏŒmï�ÜJ®ª ·A±XýéËæëŒ-Ÿçvªú¨eo— æÂpî@‚ Ý;Όڳ¼•‚ëÆ/€gå‡ß‰š¼�!`Ýyv­íܶ�¸o0'Ú@tØ@Gq¥ž¸Zå:A7õ/.µŸ@\)™xAs0h=ž8k¨+ûÑY�Àdé-XÎ9ªv—T;ùç¸=Úóñ�쑃¶^6;c)ëc[ çë °KÅÿâEÖïoCè| £É­2Ï+¨ì;qyÙyË;~ÕÃ;ËPV�8Î*�pÃ(ز©É3|$¤…4¦îWÚn¦¦3½ ô*†±£ç‚Ž¥¯<É6ÓðíÏ“¼¬•+#êÊ!#�›Ïg-ž˜�—»(NwfÛ®swyûŸaöDÛr.^½î1¡Øû¼œÛ+så�Þ<Í•bô²ýÙ%QîõX±}úˆÄõ‡hÆH؇q˜-W«®öÎ�ŒíÝgH9Ñ/Ü·ó¨ŒfûâÒE¥x2iD–ýû•è„[Héã&`­Á 6W÷‚NÃ%jW?=+ª¦,+ÂÂô;…E»ÌÛ[®y“ÃPE�v<øRÃ׬©l}öB³ äú!»hYuWO·à"®–hp7ýˆ{+F*°¸×tœ¥&Ý­’…¬owé,ÉÔ¸•¼á+;ª¹?2XMûr—,³½ùÁ€™Ø[)IëÑÝÔÜî°î=¼ÀË…G§aÞ†ËíX?¶=záq,ètê�_³”U]%áVŽå b燲µ‘ a vsð&-yÇϺÅaÑ 2‹z~õƒ¸¡_K?žÛ%¾•O\ÙtÇ+�²#f´ž�¦-m{m:©1ƒzJð;±�Y­žy?—áë¿=Ln»’öê’ÏØp°…áXªITe™8¸ãù@â@õíG4ÛÚÚ7˜å�í÷ÍÊÏ0šÏR|¼ßëŽ3x&O“ãé$V&Kë8é¼0“w­¨f]Û§ÙKnÏ”Iï×>ewX®Ü/e³L�ñPJ†à`±ÇÕÝÕÇ6M[t•Zªò¿ÏT¾auÖíö©-†ÞLê,E¿ÖïÊ~ø9—PoWG¼¤Ý|A«æB–ØwépEr‹×¾îz-BÝyãØ6j/õ=c!Šks $Ó†Àr³_X>ÅhÚâ_aÍ¿.t•k=ž‰ ]pÛ¶¼Zµ9g_|ž¤é Gï,›Ç6Ut · › 9â™b„hjÈãAb/ÔfÕ<ê*ù¯‘ïr/šø´�99hØ› ÙÆþm«àôj¨`#ŽNÎ3 ‰-ÞíˆTwIÂôXØ‚. `·tq@× 3aE#ž@�Q.ÊÁšíŸ8]jÃé.‰µt;Š×ó²çUÄÜÁòø>ˆp›\€ïm�Ó ÑîÊ@¬€ çxß*ö\²ðªðF-[Ú‡‡ox�›ð:ÛZd'±ÖXGp�©n[‘Ùm¾×‰×n¤‚7{™|ð0™»°‰8â!9ÄU“ç.È ˜n+n�[X™±@ºr轆5G$4”!6ci`9À™€èô / ÞÏ5k3î ˆáØNËiûµ¬ÚÓ{9XÕŸûºâÓ¸—fãÜ8v1{>v;,ÁMï~fó³‚{†i«E=•'zíb�Ö[o{r Ú·k>ø-@¶[ÅÞ‹÷]…¹Œá¶+U¦±€ÏYãå-êBnŸ~pøã|ËqtÅ*Kš¾ yBUúKë—Våš>^ÐøÅ~`4HÂø{ó6AÇQ"…%ÌÑCl zÀf¤\ƤC8¢ã�v¦·}©k§‚„¼w‘oœÏí¦Oæn‰ñlø£.öºÕ±¸•FbÂnˉŸ˜êF3‡<Œˆý‰^²…Áú�’‹Œ‡PIJj2ã³çiƒR â {qI‹¬9ÙAkwãÝîÕû×ZÇ»ÝÏÝ“¹bÍtÅQƒ8þ2�멊ÜHe~ãò‰º®ÎÎ…�…µô[¿[ƒðsº¦Ö´Þ…hôKqˆ0`a�Þ芧î‡| ¼ŠÔõà1«×—¹/OÞžvQTv 1ë OÙ‹êžÓxæq÷Zâ5"b†&=é¯cиΥÀè5îævé †9mù]áÙ[mC›s XÓî�-¼�[ó æBëñœס•JÒ¨}ß}(047$åØ#Õ ê=1 mOƒ,¦H0V°­ÿ'Ué­m„�U­Q“-.æSÇíñ¸VƲšpPćÆËÖyK(‚m'ÃL‘'<³¿T³PV )ĺ²ï;àxå|äU+©ì?r*uÝK†ËŒ%ùÅ?l‚ò%ËC“ÝŽÅc…;9J�ä·uQ'ܹk—f`m™çOuÛ›/L°`®Xο9iVÞÕñd!£$û`Æ@ÊÏ€X|ìk¿=ðâNCè‚>Åò‡‡³†í’9ÇÑE�ˆ1ìèò0€HsoÕÒ T³UÁ�©†æJ-j‚~½XþÄ­¬b8!¨D¡¿ƒ.`AÕ²$�3K0B ÷ðŸ-[È%Í×íbA2ª¶EQ2±%gÌN®⢪û”å»VÞ×QÕ±ÇdqÊž<=”èIŠRûÞ¦ æ¨¿8Öq’‡HQ‰¼úð*ç=În¬äÜ/²?…¬°ÿov�\±@ý«M²©Î�nW Û¼5î9+¾:‹U_`ß{¤;ÌAÙÅ;†w¹ü,²úеKs@S„-Oè \e„r šñcÁçvCÙ=ÐÇ9ÝÙ&á$ùq/†¥VrMË@¨/=¶©GX¬>#^gç«£šÄ$«þ¾,yaÀ1j—¡±5¨¨ I`b’a´òƒ¹í_î j+sxo¾Æ$A"y™­ô§³�W¿Ì‡µHîA<½Î莠fœ´{s–„@np Âk™Ä_¯%O0^ÞM=wêºÌÖ€_Þ¿õa±ÏØí[XûE± Ñ 7>ó§Þ¨0–»^r–´¨Œ‰€ØµdJîåôÔ¼$«Ø6ÍÎh—£UÉ´ûg‹¿œ“¡ãcQ­XÓÓ Éž,—Ä4á/â—›þÜÈU=ÈØÎgl÷¼̆–Úá§tÆVŒÏézúå»�-Ï«ËÑÔöW8á´®�u7 ¼¿j�9Îcr½Í¾MSî£�†‹¾®Çæ��2Û„aìHÙ’xá¨àð³|.ç»Nmø™aß`MŽÛ°(S8!ÿºìیႋŹ·=egÁ("KŸ7XW¬êÙο˜sP%7kË'­UaX´ ¶ßIÎï»Ãf…ÓZ þ¢Èí(È*»¼ËZ”,¹·+(·Œb~òÊÄáü•ìÛ!�à ,wrŒ{óKñêÚÁÏö¼1€ŽŽqÉÂñ¨K¬w$ ,fñ?-k%bç׸­V�‰­væ Kß„Dæ´x! ßÌÔÜÄ‘Nà¡$Ò]€‚­�®í„§6¼4ó‘yéÍ@›Ù0Dë¤bG|' ˜s]#}ãâ"PÇDµõ‹ï0Eª+­�Œ½Õ»ó{f ׂèŸ~Ê\‚ÿ_¼Òóz/°äv3š?„2¤-ñÐdê²×ŒqIZ=ÂöŸpb Ã[)äkÕXº§žQ^R&:!¹Váßâ�:È2Û|SîËVLv:AÊê(‚k¹ kB{'ßx¾FÐÁáÜÒ-·v½s�žhKCKt¾j¢?}¨ uþw¹#ÝSš% ‰tùËW^5QðÍn�…™“\+³•³o8:j�ÙŠ÷‹ ãóžub÷Z%’]vù6¢5±Å/!­Þk6mßT�.xëúJ SÎu‰×,κf½�˜ÕÖRB�•KE‹˜@v1°Ñ&Îë�ËY*ACé×JÈ5,"ÄÇ ©m>lûâ+ì>#ÞÎs?)Ôµ¥ñ?DÃßß ·¾Ü_<䨷hûV�Ï•;DñA~t+\ծό5�w‚¦¢c ¦û”Zllßä°`‹ã •ðòûWüÄqZ ¸E‰@tø«ï=âf-k–”“.+ñ˼|ø^ø¥Ï™P€å—²p%Ý߾βR·ŸÓÀ<%ø¨k½r®"xZÒ= ’oÌ€í6’•vÛhHçúÆt 5}$µðCÐï÷§ ¦[¸|nr©úýéd/ïéØs[èöË�´õ’†ÐC<ãÖ¶>ˆÃ;n[g¹à×ê�vûÀx@ÀÊxÛåð(šÚ^ËÊÁÊõ'J�ï5(³3»éÃÛÞC MaRA Qä™§§ÜLkzZÏdÛ½ÎCH/!�Ÿ…ì÷÷%5ÆÝ8+²]±«.®x[~ÂF”?©Ã…Ä�#¤û´*½ö7‘Æm•*Q¾ËG=�Í÷y�)¶ô˜ÎcmÉ´Í_éÌ1ºö`6V:›,6�yñß^ nþ/Y�M»ú]Øœ-<¢Þ'haÕu 1�ò�Q@"sf²8ºÖ�Ù+ïýñ†­r2 -¬ÐwE‘%Æ\ÞÓÜ3-ÒÉctQéWÆZ†ÌWmf±}©T£ÉßqR0?ݨMð°ÉH9ž³i�Š¢²×k¹Æw†ˆý†Ôä³ G&ȱj;|«E.cv$¾¤e“oZ½ æhE¬OuÞ²ÀËr¹ÂJ’ÜŠðR G"¢[±5ÙD'¼Sm¸ÍƒâÃó�/-‹ñ(ðViƒa´~M¸° K.Kކû,Ž×Fqr3¼æA81Ť僱ÞÛg¯�ïÚÎêóéôí—1ÿÊ'Šh÷M­N1Q¢ J‚A:Q¢�ô©b,ltfÒÛ¥Û;Ioøñ®dô±F.G„î±½ÏÄ ÕID9Q¾•r2pD*�´¢Ä ÑA£õ”"D(b‚çD0ýãmPU}dc"ÑQJXù¥ÉBC›ŸHÂŽæî¢§D9¹E!Ì:¨àˆ!J&ˆÉoÒ„�—X¢ j*”ôÔ§÷ÅÙ¡'„ ãÖãøÁ$�B=#…ˆ‚Ã�*Ä‚B ©Wû¯cµQÂ’ä#�“›ªŸHlY¼¥.ã¦KºŠ �‚Ç¥ \*>åŸJ;¾�×Q;»Ý®»ã)Ar$¥Š19.áA IF/eJ”±)‚š"ø³ sò‹9)&„n„`¤º‰=)é@$‡)–º²d�¤ ;:((P‚  _ThŠ”I cß ±LmšJ :"ä_J¸´)á@ïbɲ9ùlFHª¦ ÑtÊ.SñߌÈ”Á$P‰"Ä�=¿ „ÂÙœ¥0®Rç¤ ‘^+ilE¥QÌ \’"…GA'ñL�æ¾…WE-mNrkM¬-Ê%º£ÂJ1Q(¦ÊŽn‘ÃÃ?ªÕ)Âäè Z- ‘í”A§¤ òÌ¥4BáCRì‚H@Má·-Y :DÂêëÂ7¨­¤dì£Y@‚ MœáC‘î 1QH©�¨É p@ä3’‰™QsQƒ€FÏLŸ •#d;*jkGSáD¹2� ¸)†Ço³ZæÁT|@Û¨¾™‚#5)øicÚNó!è ‘ý*‹œóøÃ‰%4xFŠ~kþ ‚¤&ËqiÛµ�€“ï1· ì5© ™Q³…^( T�9Æ…> IÅK5òµ(ƒEÛÆu F¼Y,ªŒù}fCv€XËøÀ Ô>›ô‚D$ ‘R;µ«†ª }Ù€‚‚(ð�O… ¹3ûÆÎÖ„ $Ë�µåP‰’<8)^®J"zjQ6R̨K�€àŠœ-�el*.Õp‡ ”/æÄ :T‚Ä‘ü(2`R0Gâ4F„\½¸Ãcjq@é @܄Ѝ_/úОúT x©Ób˜ K¨„%JpË; mP•uD ˜Â�Å>¢‚S¢‡"„$*± ¤�2X�Ò*SÒ€ 4ÕÜ|@Æ#’û?ª>°‚ä&Š Y@©#d|R¥E„AEü¨iz\â>ýžéþH¯Ý:À=‰�Y$ýô9êw�GÖMÍ.kàî‚Ç_ß’óÁèç ÊCþê’�"�N®]| ðuh¼ë·À¼“ÇÖeØ(3ï»Oú:,å¯âPwéÀ·\…ÿ + !Ö+—´º´°hÌò0·>M"B £÷#Éë¹ >eÇ"µˆ’œœk=ÔdMãÏØS£?UV…f$Îð–uùmEMˆ³  ÜÌ6Ô(ÑÇn¥]ô!l ˜ä»–Ó®Î-ˆó7…¦¦³%;âà;U8âÙx�Ác ž>Þ™•S¸;E´å…;¡ *•Tsf`µ¹V¹dæ,ÙÚå÷¹�í ¦-»NßDUÙf$q´A\LGر6jX:)ZÂì×kmµb¶�›LQÒÖ1•9åßF@5sUäŠÂTüý·Îõ �‰…ëÆX)Ñ:)°—vÕó6«3´º1� ÚÅì .‰�&'sf}c%ƒ[PMÀY8`Ö}E°|敦xáÉØfœvú•Ùß¹«ü3g³½l^ëœZ«¶‘`à,îPðM÷Ú»zÈ 10í…´c{‘úÛ¼eƒÆŠJn�ÏÚÙ> I›DyÝêɘÂÌZ¥nÑ!Ç÷iØs ¥{b…wºàè>•}>G¹‰öæ«M¨𲑠ˆ«ƒ½€à¨® ÇVR–/éë”r†ÃÃm‚~9@À¼Ä¾·S÷Û¸±~о%–n ªä¹tíŽùÆñëïWõô`@¨Àym¦•g�‡ÜQ«K3!0ŽDÂB΂ûÍéé«V ˆ>Õ‰oâ¶}}ÛòÚ8jfÕ‚e¤`z<ð^¾äs–ÌU¯…ðÊ–,~[ˆÌÅ�K8e8´‡·ëÉ;°>¨îxu'�ý�b'�9~•¬÷Xnž•‚ÖˆK‰ß&Hvû|øŽ2òÜMû5ä�z~±…µÙ‘Tr3 —nýˆd@2’ORfÊÈ{ëƒü×�Õ¨{�å�¿Db-$ºÔkŒg�Ý¥‰pKg¨�6ÚÆJ‡‰ø­ûij˜¢±#E³e�ý2»IÀ ?ÖŽ5ç;ãC†“t× ™¸Ù…2¢: w‘ƒ ´.:Þ)ºâÖØJ2%3¼i¥ÿÖÚÐÓïn-~ DNÓ±ê—ÏÝu Q!b}l¸u�g_¨Ýw�˜nq=}O¬qÄ�¥}gí6ñŒYéWF¹é�™VÖçÔê— ç¨h,¸X{€�¯Ô EjGyÅâH´LÀü®·ÛMsëíu½²žŸÑÖîÖ[´aÚ®6‘=¢î¡ëqÑ£ï¶Ù¡³V…O+-0%ˆ.cï™Çm¸�WH-¨É'x¾û[YŠnLityH” V C6¸ÜÏ]‹M¨oü¦?¶J§€¿×²˜îG½c¢*š$0¸ª®ŠržÚ5/Á vD4Ñ9ƒøˆ'Îv±æÎFVHãÆZcN÷°ônØ`¯Ç�Ü Ue{¯O"àÚ@±±e÷n³[^Û31aBõ­…=dzûÎ9ÂSè:q<šä–¯YÍÃëîÒ ú¸î²è}¯wwׇ ë9³[sVRNïä.BÚLöêWÃ_ yJXNw­¸«-h·}Oêe‚çÙ¼v¹r„Ì™øx|'¹Jq–Ñ‹ŒžÍ‰²ý¥\d?.p&°¨ÝD³žh7íÍ"…g€ÐI½öÜQØ0Š`ÀSŽÃÛè@‰ÊA³Í�9•8ìÛœæ:R ÝÞ¦á‡Bãc�çØ©@QpÃÞÚùa>kAõË7v &“»,q¹†ˆÃº¯jýU^Î’x¡Wµ6±ú©o3 a¥I!™uŠ“U›Ô9 a!UП*ÂâÍŸç© âH8”p@Õ6ºˆHl‡õ’Úcbú^6ï/O¬` :Åé%|­CœE°ûÁ$¾ Ö’®�œ›r,;=Ú,hiCΈ%hlMÍš Ûa¼X6C‚ ¦,×/x¼í}8áã*˜ A޾Ÿ2— C~Öœ=>năŠöý×>ëZyë{³{Øh—1¿ÎfýÈòð…èP#ÜWÀ1mËÞÏ‹–[_·~æ0C±ŒëfU Òó¹µàfC@e?ŸØ ±É ŠC-3V�U6ãÀºÕ…Ü…¼^ ÈÑbæµd•'ÕÓú�%4e*6¿E4ÊÐ#ÇÚ3±ê×áF³fq&(RÐl¬­Húfƒc¯µhû°¬¸5h$q3d7Xû9Ô©©Aƒ! \Ýø[¿l¡hn¶¡ÊÜ{¨Û�ûWíðë+IQ²¤´ŒÑÍbÜHåÍ á›òaÉ‹¡ C�°lÓ‰wìÀGÏ~*ØÁø6·-+É%Ýg3¸ ‚ ê9 b�±9Ê$Bh9�¾™¡Œh¸˜ß·a—öƒ)›ØÞ7y’Á'›‘+yÊý+üǼdÎ^yÕŒð€ôÏ‘ýòºËH†2;ž9÷;tÆçˆ�Iãý‹ÚõkÛ“ŸÛëIàƒ+(ň­“°Ñ*£†�¨�ÑRH_¦ìÛzðôö{ñ 71ñ¦&¶XÊ™²ŠàSž0}¼()@— ¨kHNù4È�F÷–(úÙ¨N÷y| >eå|í¡éÃQPÒÚ—Ž u<3Õ]¡±e‚–Ènøs›’|ÌõNˆk ÄlX9£Ør«MÃäž)ÂÈð¶°>ž0r�ª•Š� -�Å¥jAÀÈUç,¤%R+/»F`ð¹Í»|"ÏBô3±#Å å×ð"�ˆ_nÃŽ/.ùMžæo'¼NåB[T�«6 ¡ó‘f–"€k¥ïȈ*„ˆj°Ñ¼ó)˜S º>¹xŠ€|ë%úâÕ¢“åÞ÷O¸R›Œk#k®³0¯0fd¸�‘Vz-�A–Äz³¼†ŒðÖ|ÅyªUô\y;¡�„„û(×ssˆ­ ré²½¦Ux ¯s°¹ÖÀ@ÞŒ‚–†)Lá¨÷–«ìjú{‰ -¶ÛQs0À�îR�¨¤‰xÀÄ35!k4;*`ÈXCwí–�.3ãgãr*”õ_JK|°"}û¸¥òµQÖÚ乺µb~•pð.¿]¼š`zÎcLP’ô²¬v]ËÙ×(ÍWô†ã°65{ZMœTDÁ®¦ÿ+«Æ"3›’añŽÁ¯Ë7ëU’é2;ÚÜÄÍ€îIØæ0!VùvwM‘ ¿Óéæø9�1ˆ£^’�/�s»Ã’æªÁ¬›e3!2Ø!1zDà à@¡À´d;-¶\ÑÐU*.!wŸWÙ+”øÐLÈô'`ß-éúÜuJ÷ ܪÑoi¯Ü•JCÕþµ¥O®³Gl�ˈ*ìbêA#C�0o Z/ÞX<…辋ó É æþuåUœ U`D86�fZìåÕ;5·nbAÇ<ð¼áC¹€àÓÍ«oѾM®ižáÌz&âSŠäÆÏ¢i›#�¼¿ OƒˆÆ:`;PtïnÕU˜n¶]ÐòeqòÍâ�ñMŠ¥ ÙæW8Э½/Ý;æÚ"0Á˜PUØÔ�•F8'íÀ�™òÔ]ì¹ÒÎy¿²ë3­ö[�ÔF|-Ç»¡ � ðG9®úQéh–£ÂÏæ¶Ñ {ƒz{Á…ï½êïƒwÛ”…ú ªª´¡}G·’±\ÛÛ•~ü]çëêñ¡R`�õû�ç9…&=ÃvaÀ4ãÐ0Jö‹p…ÝÅzRÛ‚j׋HÕ÷٪É*ED#¶â}\¬ö@²€ªYCéý—ç­¿1U†úÙX;FWDÑõRÛùÄÃ5/ÛwD=|7rAÖ±Æ@\ñÙi�h±‹qþ° µ†[“ïÇ�ŸgÒC8¾»J¤u þ?Ü|ä*Îúgi òD“Ú‘ x1±M™j*æXìRÚàb³nz£”À#%«ÍÓhõ )h�É-d*pÔ” Wbî~^_íÜsgl†Ùa®W+ó›nÇ‘²([Ä �ŒW€nå£úxõlfP /•Ô‰½!!þ17ø2µ|1ó)�GS7“«œ#CkØqûGY6Ú6…~ ûç°�¸çV¶Ì€Ò¦à±¦Z(«ôìw¾Öó÷Úå �@dá¶0Y‘.R.2¢AñV…©©5Ì"f„öv+y€ 5Mwö_ ÷Í]Å"»Üƒ’&ý¿i‰ …÷†_¿xÂ$o VfÛ§®0mÅ×Oõ¯rˆÅÇ7þÅ·GíFë sõ€Ý“èüè"ÈìI7E¦ÍõA0©¯­aB6'ž³Eÿ¶HßÉ6ÕáÄJîÓ`%4c?‹¢Æ]„ZÓïdY¸WÅÓi9„mÝ;�H;D›c9â‹ÃWßH«.«d‹ÄæðâGaYjÓ~øZøf¹íôf· ÏëŠ÷¶ŽÁ´š!#ïn¢)5” ¸`LÊKsÅÀø^6v;<{ѾˆjN/Ùceï](�sq4–µÃpQT0{Ø»ÕÉ‚”î®ûÆ` ËNp6—(@¹Ù¯¾v)ðzÞLÐÁ{¼�°Úß«`�޽YÔ«9 ƒsŒ…ÅØ.v¯|„ºÁ¥³{}pp wyñâé'©-¸ŸÛÅXFöà ˜@ƒÇ À ë''ó±Ò•”T-�~`›WÂ�Ší�òãõ£öÓ‘nçu»]p$OK�Ul õ޶µÌ`5î[ËåÙ˜Sдʼn¸Š¯p¡‡ÜdnéØ]vÂΠ•ø¬w,ÂZMŸ}§7^dÆ» âÜ죿˿}h*\-‚4/�‘�LCŽOmr#÷ƒí¢VÖ® „p„ZARäê• ÛÎC™ö ¹Ax‹œ�1Zäóã )³R§û|z´Å²á^ ’Ùy„ã ä;ü|ëÞð~½ö^œ @"·r¾Jþ§Ël]7Cc‡”“'JѲ?�¾eòÙ�{’()ø?ù-:OïmÁ4 ïg £ž]ª¼tŠæÖÍÙ^�CawÏmœ³<« ¬ 5(>ůìKÚpUœ'óÙɘe¥=EŸ]ÕÄ—BIÀ !™kw¹'9&é-ys|Ì8±Þ“µ£|Tä”þéYItU4”®ÿñÛ0žÒ¦l3gAøp.¼ÙÞªUbêol®•¯³m…|Îöñeƒ¦€­_“h,S qv¸‹uhá#¹[ E�ÛÞf\_ IÛ' ߣ.`Øì¦>Ùä-³È€÷뺓·2™B#í�ÁÊý‘­ÂBèÖn"î!© Òâ{z´Ñ‘ßÓjm�Lõ ÷ÑR¼Ã$c¬×I«L¾[ñõKèªåÝ""_Kö%¾õÕšTñ4äæ¼µ¸_…+ßßÕ–Ìy© ^1›ÓÁA4üY‹„WzH,!¡kÈÇëF²¡8)ÇFØÅ‡¥%„yDKÙÈhAžè§“j«3 S¤� L}À]uøÂ]„›Äi—0ÄéÆ.±–Rg3»K˜p˸†µ¡6ó�îŠØ7£Êö7+¤ õ  ÚÓÈENÝ|öt×çÌ -�ªþæd·÷ ûno˜Aû º�ùz $â°t.! 6²«·=nÛ�+6m*2Gޤíw¢%X�´!î+1Ê”ý¿HmÈ\ÏX‰¶ýɺÛCH ïîÆS°Ã�ôr&·Èsƒ�ÖqU‡¼BòtŽB‰®’"±u€î§wDý¾$m©é728åù!›b�[ÒÙ/1Œýyázö. G’^Ð<ÞUÆeÝ3¸Jû±»žwuËxäŠÓ+à®™.a�`øÄ##ó£0TðÉ©þÄn81YœVlQe@�â‰-@Š*ˆüoËoPmEÛBf޲…šÈÙº\^¨wÕ†P殢#Œ¾á¯fh±5ü‰¨ö2ˆ®ÝÒ£RèÁ¢“6 ÷d-ƨ¶V¸N¯¾#ßWöϽMr ÍðáD#ãÐB+õ±®…(À<ìT-û³fU›î Y]§ïµ�·‹Vλ÷£k4SÕ†&¶xw`h°ÔÅëwo«Î ÈÜ hûæ�»‡�JÂÖ`æÑnEÇ ˰ ‡cVªX¾§Zõ@ºl%m*Ž>51V+Œ�°-í´òˆt¥b¾œ”�´óZW�‹wwa�ZóíüÖä@�‡,¸Uõãd¶ {$zÓçÕ.£¹¦ê²¶"ÅšÀvܺ-ò7�DSžlQ>÷{ Ð›Ð(‚á _¯6{c¶{„Í¡‘#oþº'-CTÁZCü7ûo‹cT·ùÈGz ¥: OÄ9œÅÎo@S»lü(,ÌÀ@ÔE 2)áè/jS2 Å�î("4»®ìP:± ‰\hpf%ZÄáaYà”$ÃhFßT ·³åBx6?'RÇ�µ ƒ„Â@l‚e‡+Bå@FÊkxÿMèÆ;Û‚†P3�Œ«8ZÀ®)›xœ@ÁT~ÔÚ#-i'‘2›jð ‚Þ1‹®6Õ× ü(ˆŠP BÊ„AŠÇÓ…~��«xÿ’¿ ß Õ½Úĩч^²àá£^%ÀBïÖ¸4•À— €�‚0ù$âEõ0¦…à ö3¢ÅH^X.Ë~½hí0™J ©_â=ôcɲ|ÖËåsjèÂëô¯¼sÐE bN¾3Üž/”L8Z‚Þ™êì𥹠މg˜î!8ê1¥¸y)› 2ø¶çëj >T?„��%O4ïΚ…%H‘ÖóR2å‘ , I"»º§'@¶UYÐ@]kc™Åñž2‹dûPì“—vÁ¦3mòê­ö·}š-Vmæà>“Á¸Ž¿?@�l;&1W íidÏ'L˜MþP’†ÞQW;P]abR´wÄZ–G»J,Û|=þØ1©n�«�mì À™Hø�™+¾ÆóFwØ–²£À_'y-{^ù:âmF/·¨vaøÍà¨Ûdí~‰Žö�Äý/òëfº{\ªTx¡'oœ] :¹âùW®d)`!Ÿ¯õ·±±)6�\ÂéÂOæ?Þ ‰A,±¸öVbÄw;¿¬eÏ®‘Á³Š:ogèÌkÈÐ?¤ %öºá‚‡9§³6¤¡)ÐÖÌYÁX­ùö«îC«;’#ƒ|€’MŒ,f£›ºmKPŠ RÕÊ#g;ÄåC5 °,Ù Ì="’–SuC®îXv-¬~Á�b$í¼[ëÍ/‡{Í‚î2@ò=c Ŭ«µ — ÛçAg0­¦jrê-º+(øÏH£`-‘¤1•Þͺ|Ø80›`<MôXHTé�'"»[æ.H»I~Öd‹‚óÁ…Õ‚xš�½âܪYÈXÄŸˆ�82ü6ŠKºk šç2ìøñŰo䮀�y²Þp·®¦…Z„Q',>9Ùlï !G-hçºêëŠú+�~Óv0a`æÿˆÕ,áÒ•Ýö>•T`ÏÞɰƒ`ŒbõˆýŸºÊUm®M 5i¿šëÀJ±öÇõ_!;‘ÔÝz~eǃg9?_¦ñ‚­Ù„�7 ?Íü=ÛÞc Kh4ˆ¼JŸÈË8Kõ(É»ƒ%|íæ„D²ërM¶ñ—šãvÓoå¾›’¼œL·îÒ2~éí”OQ:bän{—šPyÖ¬ütnÃS×Ävëw›ðsÄ8ÇceÞÊúS½þ²øFˆ~¹�Ô‹xˆß«VF@„4îže9g�Ž)8ÛŸƒÖÜÇÀÑÅšwe|¾_= åùÊû¶¿+I7 Æø?cºÕ¢1…SS²ÁQ–|wϯiØ�•i²0ňhl ߨb3ħÅø‘mãdzéõ~,2û?Ìñ"e¾_yøóÏÕîþ \ìáÔ~+#·ìâýÈ]±äÄ›Úã a¶0ûh;Ä<èQnÖåJN°²ñ«¥MÈñQV4ª¥Â•çbç£ÁKf…Âð´Ù?ßDâý›Ù%åä° õ÷3Žœq(uåík„‘ëšÙnNG§œ9ú©�bÿ´d�=Y´*ÙRè-•Á7+ï4ÙJ±scÀ¿>ú= qáÞ¤EÝ,ÝÖDCrN¼ÊA³ù팾t(6Ûï(£ùœŸ-ô-5ÕÛ-î‡-Öïv›üÖÚœ–ÃÓ0qUä �@Ñ©11xÜ$·Ö<ßF>þÉ!ìbˆcq5XGIÞeéË�XºòñB†Ì ›Ac UÎË›I6cjÙLà¨nÎ3RòÿM.Œ5øãV1£Ô>&) ³!²»}Òè¨Ú{¼/8¦÷ ›}Ø¥ŒX¡µX�lH®9ÆW‚–„΄P¢:“îq…®�M¨^$\Õ&Žá1¨É54ʱۮvqÈèÅš7 ÄR6XÜÃØ¦ß>„0»;Ù1•좧™À"æDÈ9ǹ‚¾ŠÝ{¼Ï‡ÂÄ_æšñ›¢…(mFáBË¥šÀê2a�\…0$ܾ&p,Û‡7Ô~Âû$Ù˜jÀ´WÇ~ebJ¦]šͯ¼® *ÕüúøƒÞ¬tí¹Ø…±ûÁdÃqm¥‚£ WSšÃsɽ8î j„Ì È`æã%\Ù†÷Ƙ°";À¤XÔîÚ<á�ƒ3õ†›Ÿ®Ué°�|; Éà{WD0˜$œJdbÑ™�u³…Ý[»føzØ"�d>%—¼ VL(Ø3²øÛĺÁ:l‹»¡N0göÙñ7áF¡E,eˆðõØË; úQ ø=ZÍÅ#oÌǬ­¢1ÄdÐFÖ�ä9€ ãTi sÛê;*Âé„t©¶ç£iT²y[<ÏCÚ{�‚àŽU rjˆ ošâ�Kç8ë3£Æ]?„Ôâ3›ÄÐVj7x9VÑ Õl”ŒOÜ)PÖ®( ÌÒ¯Ñw‘�ÖŒÒä ÊclNAè½/¦f(©+CŠ{oÝžÉh±câãÖíâ 7a8Tµ½)Ô*/ÑKcÑ]Ñ}‰LM¨x<°C‡W)â™N“ j·ÖÓ–0êè‚Z�1A?5i¨þ«£Å;(NLI·ßˆ�œv2&èÅa€B wf ?1§€¤þp�Ѧ¯ÇAµXg�”å=NÆ jWáe+‹Ò#AýÞgä“a¾±ZžD1YJr¹wÕMÜðD"ص)5Zæ=}Þý¶¸(Ä]ono·ìûcªZ卯”»£Ç{ë{>ÁÅÍ¿o¾zõ�c–;:KòkzرaO—Ó„fyÊÌàó™îÉ�xØ %.æÃ¨ˆƒº¶£fI#Ã…J;<ÇáÅ\Ñ!ÜÞ*‰øµ}f:�nÇß¡uÌ9Ûs8z ócòËHõ0£Üå«0õâˆBKd=›¶U;‚pk°Õ´€�€!é¨ÐtʽØÑÂ?ÂôňÑÂÉ£ö½|ÍܯöÙ6÷,ä{ūЕ ›¾ºÔ’ÕÇm¼…wxp;åï‚…àU^àñˆ“ ¬Ò¶â9°å¸O~;±¬gAÎÃh)þ,VØßó¶QY„Mÿ<Ý?3éŒ éÃÉ2_eÓc¯`ß,muµÈFˆ2)Ú­«l@�K~‹µ°"瑳Ůo°œ¤‘¹e0™Óè.q2(ãÍŒ¹[mÚøzŒ’2Çç@rVZtòqp¤á#}ÁäZåæAÃ0*tlšã€Î—w?8ÎY]òîÊö j`sCÓw'KŽ[nµui¸@#¢;˜ú-»Cú2­Šý€c=Œ-‹7Aýo¦ßlß/{ï,B¬d×øÀ¾ !J°_ [Ý=ãßÌv¬Ç…�•íVàK�_�vÔjÇœ`*D¬æÎr7ä+±]3®ÆrÜ ·3Ú<ƒ«�>RÊX¹q«lÎ]‹‚82!Ø�ÂÂá鱊«A¹YœjÖ£X½ô–Î3�Ϭ|¢[䑸?|—›‡`9÷ëj�~yg²óé¼O^~ C–yðßœ¢Þ¢1"·Õ^šGÌÚfñ:*˜µ¢ÃÝtã²3V\¼‰Ä¹l;eÁ Pc(°qŽ-Ij0œÕò£ÎXy¤+å`œ®Ó†@<“ßi”q>1[š¹Õmà7´™µeê=Ðá°©�,oÑ€ÞÎ<±�~29f\k*B:…u?}ŽVûhqƒ¡×‚~?v1@2”â@Ó¨0#Ü)À-dÅD>Ò€�]×ê‡ÌÃ[‘)pš=á5L¼´Ýêêm we9sgS ‡ÓjYÅ“ehÒÜGð*Ð=�1Û¡y6…�–Nܼq^ØŸ…èF†Ð²’׃Be.”$97Ø�z'GVÔêÎéy§"7Ò Œž½§BÀØ„µTèÕ½ça»k>‹¾…}Ž83á×í÷.áWK³°lÛâø)xr`Õ9\;Nµr®FamÒ¶w)ºî{¹‡ XI€–ú·³�ë¯Uu˜Ö©†¾ O¼lö ‰…ù§Y'Ï!‘X0ÙL‘¹\¨,¨¯jÕ�òÈ h£lMó=¯ÚH¡ ãš—¯°+Ue’üû°}�cî|eë<´õÌÃ1�„pš.bž³;K˜ |¡ ›=†Ç;[ä8*½-XÈfûõßX;ý7yÛÐÖȯ™©»Ti®d3ðõAô©AèKŒç´û¿PèÒÚ+v·(Ê~ < ¸º#¨!Æãkn°Uá÷ò Ü9åÝ4_µÒ'Ì2›“&[„™Lp�RŸ%§ �²–‰�üoìu4�+òþ@À0#³‹®U®ŽëíL¼¹Ï�úùI+¹ƒáRÖFV ©ù#iIš ž1Ù¸!‡^Ä=¼&�ÒOöYµ ÷6™¯ØW}•Ïn#+�.ƒy»ÅùÆä.Ø¢zpz%éª9ôˆ Þ \Onî$VžøÐ@[$¡Ø·—Âç®úÎá�\þ}sÉÉ·{¾c>{ÀÌ"³>>S”{Öòc£ñÇ+¼šï¿Rk•Í�&d=cù 9cºØÎnV¾ �!"q.ü^H }íÛôÀ…¾uþ¸>ƒZ÷W–c‰ã¤hu|Ê!ZvâÀͨæþ>hŽkZ7/P% Ïï‚a¥ql>V&—¥Óv¤÷Þ\G™ÿ�º, +„c¶aágö´FžË•öÒ¹E–„RÔ©€ ÒÏ霦‡ìA¤È ’Fñ ê¾Ö°þ ÈWmY·¯'hK,µc. RéÌèµ³ß2àâ Jú³“%seï=™ ~ÙÝpʼfV«àd-“áó¾`>Lz& ÍCÕ-[6ÓNq�.µÁ@!Ñùî5¸ÕRÕ÷Úq!ücÊŸ:­qPZ•¢%|”²5�,å©x/¾è¦+U3V»37ÕúÃøW%X·RñÅ~-±Rca®òwn¶w¶Ñ7ò´hµ Øw‚çòÖƒvÎÁ`ºíùo!½ EÁ«xcË@£™l¸pgçhõG¤ë@W £Î²…í/¡:ŽCá§At¸C]ž#JuEV´¨ûQäÒáíí®Äëp’Wq+X5Y»Õ"`r 9‡o¢Óz»\®œZҧ6 I~r¹ï|1» ºkÙêÎδ«•ò/ÑÕd‹ìcxÆî££»3tèPb¹Ö vvr–ÆÑrD'»/>?uMÚ™e2jcTôS\*"?>¡fo?·}\Ô¯y&V·6+ÎúðË·ð¦ô":MõÍŽnù7&¸L·»¯Ð¥1ƒ¸Út2:Á¢•ž0•óYU{' èOÚ¼¿éÉmf4:µ½}8Íjékô´_+Õyžõ0¿7ôŽ÷ØQ�«êfî%ÔúVì'·Vz²¡ë¡�Æ-h>ÏpÌ�{0ðÑ�•k#¸ãJ•©3•à·Ú®'ÉgÂ\Ó/-iº ™Q ¬y¹fVyUõQ‹„ª5zçÓ¾ž÷¸å<)7oÍ‚ŒÄ*Aï��˜ ´~mÐ"5ÊË`S²‚þV Ã%·c{ƒ‘?êùnÑ>ޅ•b¼µå-΂âô3e²*ãRا ‚Φ�2X'B u€ÅÍZjÒ9¾»�d* ë‚éKÀ(#«u‚‰ØÜ/&ÿ^²¡PØøp¥]è„pyL¸{xæ>V–¥Ï­òZ‹§eáh®gbõe[ñ|Ð!© uÏbd�¢7[ÞÐ3SšÛ­ú0À×.D_:Ieœ Kîù Ð ùKXG×Ö>Þ|ÜZÛ!„tn)˹«Ù¼ùÍ_׫šÑ{8˜zH‘D? … u”±'a©=%ïgNÍ´¨V1¹,°ñ-Qls$¯èµó°¾Ýé;8‰ÄòÌÞåÇéé…†;7aT¾ÄÆÎÙ7M«3W�á¶_ˆ�Ú{d@ÁNŠ*Í€¬Xöú«fû~;�*ûO+”׺,Ànoáá½XÛúHd¯õï)“Ø„LÓFT�^vgÉÝž4j)jÙ_ÆÃŠê©­¸|©6O”Ámo€n2nÅûH<~ñ¨¹ý€î_SÖÛ{¸Å²¹¢–ýj0éM‘.šf,ÓÞ•”÷T·SBèð�!™S^йaF<]ñZî€Ò}‰p³¤lrŠ‘žgH [k—kµï77¯ÚP: sâY80{$äŒrov°¨Ñ àB‡ß°‘bŠ8Ï�3 çsAq;ì.f�ÄçF¢ƒÊCÏ9Šßd¹HïøXù¢RǽZ=¶�ÞÃÖƒÓO^Bî>�Y{ÂÑx9iÚð¸ËîÀU£‚„v¾9ZƒgA {ÖúÙõ¨~ÜVª{ Ê=š&ǵ2"ÞrnÚßïÀwŠQIÙ\7›ZJ&q9eÜ›%�ºÙtÎ&�ß¶žÕv'›[nL+&êA�ñeÏtg$U Ï“\±M§ ØoÓµbÇZQŠLÚ¸;D–oÚ[Á$û(¹ p=зá»{�ãÌD“îú|ÉeßXá‚Á)Ú~NÝšŸ§éKWÑ;íùwû-ó¦È ³nŠÎ’¨å¼º†1J «*ZvSH°çX#¶ÕÂršØ'm4òN -CÂ7tQà·Ñq2ïÑÈlU΋§ˆ6~>Üš*j»qª�'CÙpìnµ/ßž­ƒÀ¹r ÷ Ô„ÈÈ—â?—S{Dß·i¦z%2~ˆ*ë§p¥ñ\öw,Õ:ÝûÌRG{£6[ô ãËLÈ]鯽õí…•³“ågG�Ëxõëس{ç§õ™åš‡®k(N+%7ÞÞ¸ÛL†)&p$ÿCñ9šì‰g¢âãí6¬wdz^98®wÜAŠogEŸ^ÈébŒúQ5¼wÚ—êNÓ›l{gÙ Û¨sÓÁÁZbº^åÎBd°“a�Ìö Zõ¼‚ìÏܲ¡š¥^Ó¢üRéîè·s[á�Dà=Ê2g°‡¬F³ƒ…ée6uÒ`ç¹iÃ{¹mç¶4«Å(æ-2Ún9¸7ÏKz‹"8Y›ïtÒP’6YÓj”1}É ~¨Øó‘š=n=•§ìó•®•S1£‰g eãèvu¬s7\ð4ûdšhÈÐûH¹…}±8#<|wÀÌåÛÁÊûií=Ð(Í€¬‡`U‘#ÂÜfÔÒ˵¶MÙ�4ëœå·€“,€.RS˶¦^5fÈ ê(ÚY5£¹½à혲ÐÓÌô´Ó‡8ÀÁ’"ænÚ3²VxœÎ8 gÈ`Do0„‘µ¦�‡ˆšO”�ërìð.¥ÅA{ al’Ð;pV@‡Œ$ÇemDjWvÈf×Ê‚?”Í”¡í[ÌQ¥[ß/¹;ãªJaieÐÄãõI‰3 ðíÛ.£c±2Ó «rŸ;³p¡0À¡ž!h¶!Ô&ßojbÅ·2À¸´�(âânYL�È8• Y“‰g!K5ÆÓVóg :¨hdB5åŒäÃ,¬´. zå›"Ù½°:âóOäJÔŒËßÎ@zbÉ8ˆžx±׬XåÚÛºÁ,ƬëP¿E0ªÊi™‚e­!-(ÝÖteùä/:b¤]nÝH|½9˜ÛîPáX žICe�ÖùÀÖg€ÙDø—‘^û§=åUóÇÆÒøØpaäì®< "wì�xÔ9Å6°ÿÌ …�FµO«¿Íµ!Žd‡òÖ/†®¡�ŸJÅ#é¹€³0œÞÐ. ì® Ö`}êdám8Þ¿6ÙóÒD›®,Ø´”ñûlo N[Ê@6ËÄ./nÆvó£ÌÝ÷$ÛXƬ6T¥­‰sxQ°…$èbOqVÅ; ÷:Mßà vVòV3û!àÈ2 ŽÐÑ»øíÙï2ÏÛŸ–ÈÆÂÊ›ÐZZBݳqu1z\8¿ìó¾lø3à±YÄ5Å9žmw¨køxð¬µÒùŽáitÖ¶žLˆv¨�ýðk«A¯+uß»¦púëã Øujdö2ˆd,kP¸g¨9Xø5ÉzÌs¹ýïzö°|3�±‚II¿ õö‘ÎÔ÷Œy„ìë,¹¯ŠgFötŒììì¿'q˜:H ¤fϮ˺ø]\6YÇ ¤'¾EífmÁÎr©P¦²€Æ¿z0Ôo}Üô¦þs¸#u«¼±n ¡ÔsÙgÍ=ìÖØ}È@J±ËÖËOÝ,So8Åa ƒŸmÀÁ$·WÑ[…²É…™æÆõj\Ö±ztFøÏ;½é„&ÑÆÍãh'äTð[¾~¿½UöÕíÆŽAsÎ`Ö®öý¿†OqŠ­¾Qâû¬Í¢`OXð¹ë(•,UÛNãlé!÷;Ô;l¥ÒE¾PV¿ØJ׳޵·ï)íƒA],d»‡DF§‰]™ã‡ªÓ/-3vÀ Z­’4¸�˜¯ à…¾¾Å»�qÚsí>åNÑÀÛúPÁРfý�šVÿxÔ.BÓl€3†yëq��>çÇÀhÇT0BÎÆ{y jªå`Ž.ªÀsâ‰ýÓ0<0¸àó™ï°�X~Rî$Ÿ€kX‡³6µw =’}îÉEþµ™²fß9wrŽŽ¡Ùß­ïa=gõwWú‹›"ù!9‚ŽÞþíÝ8�ýܤ±}â#ŒI_0̽#ÐÓ?rôo´áÑ_8×Õ¬~ûð¶½V´ÛM¶Ï2Úuòߦ؟©À»ASÙøØ\øÖ°øéãj†ú³îµ:PÙBrÇ¿=kK¾t$:øDàä~æ‹–œŠMîz~ô�_\ãR‹VB o”ë—v*»=®9~GÑõ»½GÏôCß·f¨Ìl_‹B8=»„ñ_Û,È!þQcÞWpy%MVªã©ÃÝÞÃØÀsh>|ä-fkå§A>|7#ÁqêÐ9çÞ5�Ü{’š�E@u®ùKó>Zç×o÷´]µd9‘@)”ûx-[�Õ®Sý;:\4gó× o¸( ¢ÜV_Q'SMÿï¬)¥¼�¾êRëÍÅõîÂ…·yæÏÊU��ûyÎP=T~/¨”¢I ;M):~0Zµð™|ªç̃^%QE'ŽzØÚã( ˜Y1ul*e‹ó¶Ò7ò;ÏØ'ç¹ûhØ# â^¨ÐdåÙ `ø0ÄúÃc9¾âh�Wd—“Æ!u½„×wh�'{fËÆÜΔ¸_o¾/Oƒ �w`°ðÞà2{WŸÄ·ÒÞ£t¥lSõ™&0›Îg|•IŽ>ˆÐâý+P'y3ØœŒÀãÙÙÍÚü/ñÄX–J5†—|®­;Êyá â‹7" ™$aW÷Ø8FíÑÖk¡ŽZÛ‘|�ý“ý!`O4t‹�Šrm�Ô•ãA:]°Ð6°(1#ª¸0êb¤‚tQÐ2 \4¼(š4ÇÖ§mۉŠÝ>¿r×c߈qòÞOSÇp/BZ¼l�ëu‚�²�¯~äçâp–ltc¹ù/ܾø¾”8:kˆàKmöÛ{ZÅn�öûwéjgmÙ÷2 ‹ÀÉŒô9`ãÇ<· > ã Î[®–Y8Ç §ÇI@Þ€LÚý4´™Á}|L»ö�?–,}Ñôuž7ÁÍ´®-\†vœÊ× ;YàÛGÃt L§Ó™~ük×MömŒ¡2ϪöYµÄ›lß= Ù#gÝ—Ä�„=‹ò=˜¶ÕÖäý,ÜÓˆ¤V9ô\vÐ u¤ ­šÛ¾Ö¿Ä DL÷õ2M2ÅA–Ô!€}žóöÛ!û M†/»© Ž�€j• CØ`¢á�D._=±WÆqŒ=SÞ1�I þ‚™dïö°ùkÄ­îùŒû1%vÜçuìˆA[4/b”ƒµëïä^SD÷ÙNúßqdkk”Â$“ U ï¿q”–R;íùø,Í*mu+ˆáO9¥�g8 ¼·áÔ}ð ŒAzlÌØÚ™��o™™0?‚ò[�Å1¨–Ü æ¨ËxÖ½ ùïAÚ-¡Üe&Ϫ^È [·å›DÄFšÐK)yT Ç‘¬|S`�&QñÛ~ô°xˆÿdù Wk£sÓ›}cÈÆàòW•˜]]¢F¤óK¾Îf yH?�_6ç!µkbæqÎê,ƒ »Ø•}j“ìòòBb÷üy¾:ó•¨Szóûš½öJÀ¨I+¶CÞƒ~F™¾XIhÓ±~ ´K6+–¹«ÀM£<©ÆÅñq?£¡5dÁåLÙk†mwó^ôˤ›qhvG1¬¸°9àQ�S¡D�ƒÑ†äÌ ×¹zÒ°‚ ¹ˆoS{K‰/°>çÍÙÄVö°f¬FËî 6�J²á|^Åê©—¶o•çlf`ÍnØòaô‘ØŸqUÃ`�œ†Çë2B„b¹Vâ~tÞŠæ†òÙäm2TÔ{J*6æ¶Ñmë,©;Æ�Œ$]J³‡ÓPº7/Á\³qWœÚþh>$ˆ_@ó¯·æôïÓ\h{•" HD¹ÔšÉ¥·‚6ß\g¯`‡ÃsiNë–¹ùÂfÍ9¶G¦Øåç�¹iÙÁâÎõ7é’¸ƒ×â^ë£A‰,? ™lõ¡RX²Q¢û+‹}÷g LfûKÈ»8` «èÇŠ‡ ÚfGñ.^R„™w/ ©ù‡º¾â£Æý ùYàƒ’]®‘’ ’¶ÂuÎdMÌölœþðx×.á®ÈœšÖÍgòšÕÔýXÑRÍÔ$Šqe|UHw7÷¹6Ö„:µ¾‡™îz2ª>^®¨3ÏÐ5)¯rþ•ƾr�VøsWû¿Í?|FåQqDP… ¿^ZüéVX´a°’0ÏÓ:UÇ{;™¹o´ýŒä__@®½í…ݪªä¬cgÈÖcSfi-¨\{dˆ«z¾ñÁ-�¬r ÌÔJ¢°¤M¥l$�«×ïuUâ EgFDÌëàæÎ^ãm†‘ÂUÉžÛÆí*®„ÞwëRøS]ý~oÛˆ4ª ß©Ôò~Ñ(¬sgMF3¼pë.û»­ƒÝàtuZÔ"¶Ç݇¦h×ή7,^¨é‚àZ ñàù½…âÑ¥Ëjú ä8n8hÙ�AÈÞò»Áò,YKgÈFc¶¬ŽåÓ#œK‹ žÝÉ!@`ïòE§kàŒXc£»Ãûød'6êŒÚVê·\ �7õµð1©7ÈÉØ,E·»ËaCì 9ßg-äÀ¤:û’‰8¶¹XïIòEˆ}´·kœÂL&ÊâîÕv?§*Ðã\²�Å=ñYãU¾×H Þ«'ì2B–!zºPXÑô¨Z2Gûö>³:–ºæè 5ö—eØäØw’á.‰¹�8F§“i¢ÁZ®ÿ �ò¹JǼÇÑÝ«·,—ì]æô‚77ì¢�H_K«k†Èþˆî¾y0´o!|áíÔX¬HN¸/•mÎu¼€±P¶Eñ�Ð üåo«»�‰®P &ú¯‘¶ùÁ¥c?ÞºAØ)GkÁÙ:�6�Åt%]×WÃy-É‹—\ì0³qäà )xº°­PüªÒ |#ß3e-²g¡j¶Z4®.x#ËÚYëy§ÃK˜åv]Z;~�ø�_V,¼t´ñí–(”ç±5`ÑAV­´ › ñ ÜÚ‰¬åÓlâlÔ÷^ä�@“÷ˆ�ѦâêÃ^³›k ¬NŒó(}ôn™•²AµvãdïÜï#>Ó߸‰&}”·ì7uÜ)ß$ytôû�ÜW¤Ðpï]£˜²ò¸îܬÖÞön1kEÄHs‘r �ÛMûÙÆ,ߌ0Mg€ñoIî«Ï7Ï_�A¼>1Í1žÎ(žÆÓZFgC’h®tPÛÊ[Jç¨mó›Ñ‡�÷޻ɌÇ5pÛ\¡É_S±ù ~[öÖ<½¯ß†»È: /mkeg�¡mNd2KP=�¥üõÀIŒG¨ö4gbÈ}ÊDæqU¸$ýõZ"ß%ˆ#kñä£dCR¢‹bøc˜îÃL\ -ä3õ�8ˈ ¾½Uu¯† ñŒk%fpOô¡4éúÈÍ>Åø‘05J[{呯{6^ÆÒÚŸ¤Î¾•ïBÉÀ#æðó•ÄÜ…Ê L¬eF �Ka>€a†©—WU´iõ°ìÈ÷çŒ"LX�U34+Ä3�e d ããeåå¡-ŠŒ¾¨�nA�5.çÿ#Hêþ®7Ó8íåù6Ú9ÌÝkj[ÙœÏ:º^yg«î=MG�.?´õkUl‹X“Ø#1Xa3Ù±Úª¯pþ¾Ãœ�uA4Cói¨ËsÓgº^1à×Y¬Ýr.?^ïpB°nP˜ÄˆÆŽsˆD‚ �:v°?_oBtûû‘[´‚.t!æ1#GËÇÔ`j˜/vhý ø¬k ¤rô{W @ÓþÖM]9ö÷Dõ²ÝϺä¥-Ì﮳Ĵ¶‰¦K{塯º:„ÖöiÊîz3Û‰œ-Ù‹¶Ù>rxÄ¥Nd/¢y†–b0L„š³“s3¶ö[äI9^E�˜¸ÌÌÂ<øò­a°}r=l$úxO9ãmBÅ�ƒ9 ½u'9ü?`¢”ÍRø§Þi�]× >Žìê‘ÏÖÛÅÞá?�á²/¬AÜÖìâÞ1Q/¼¾šõRêïúnWØ%gy-¸–=6¿åî’ÛÅâŠÇIÈZؽÈg@›9m°È_j kê€W\ {8òå±bÊÉÄî×}ž8†»bâÓPk�¹ÖçHõœ[ ·ÂÛÖ{]ôM‰ææ´†}´*àjy¿ŽÙeß‹ð)yÜ$P™ø‚ð¥ÞX{£\Àˆ`îãâÕED¥>Òšì–ηÌVÓÏ ã¢SWœ¶þtÛ%q÷±|ì7tRÒpt¥†ôÛÞéè6››Ü"1œØuLø¶êt@Ž9 ¢(˜Œáä[nB†O5•]Ñ7��wà—Y†) ÏOjqÝž4ú.ö5¼ïhŠ=…Ò©u.Ç7·m×= d]ìÌ·ƒÁ)‰³†ºîüVµù99ÉHƒ{ÌU/†a�>û#ä²”<ëqî&üš'åœFë¡åÅ¿¯½ýtÓß`Š�t.åâ·è–¿»�Hä#D¦”uwžxŸe(pÏY¥¡W†¥Ákî˜êŸàá»Å¨.À`Ïî«>ùÖl,üm°+æŽâDCYVqV ¾ÎYç}oÓ½[ <>rr,ú$­íÉBÚ¾ã²âøÌÙ–ËëmOú"}�¬Û™¶oûn(*Ñø©Ûày.ŸØÉ+¬ÚE‹Ð�œª_ÂæAkYÅ¢l«µm…0míÝ©_HұF¹fT†Ð›ß|Šshsܽ,à2K žn’ lNòeÃ� [„™ ä-Áôp׸̪Ȍò0·éq±yžà²s©WZkòËùyíÂbÖ ÝH–#�Ndqм›ˆìýk*le+ ûÒx÷j¯yg'²FJÇa¦¤ý Ý%i�9­ÝÄœ{Ô¶5c³`ß¼´ÛUÍ ±æØo9HÝÝÇ­Í–‡”–;òW.ÎïzTÛÁ"hlæú¬ÚMŸ�°±Õ‰ïI OGX~€ê]+$‰m  )Š&<À}"7Ô2ÉŽ=À`÷<ÌßT-Žâ!Z ²Ö¾"õßµ~Tý¹$âzרh èQV6á³ùõÚp§½kK¨‹åÇèª ²¯¯5a¿ˆ n¤bg€ê,‰¡™$,Pëˆ.ú˜¼±a*/îWnôÚÀMûÂÄã *Û2�…ŸZ¼]YõrÓ:<ðî0×àýÈW’‹Æîï– g“gÌ^b–>^ÀõÙ­Fré&´71dN^Ç2Þ*ÒÄ´¤$=RK’òß&Ä4…z©1»Áÿqµ ¤²Ž�â}þ9_e+(’Œª×Ø?”šsä°ZlÑîy©ž™o�Ý—²ì?´Kç>3 YŠä0¡Î.»/.ZáÔYÖ[,˃ú3ŒÝ>ÍÄÎ3è©/Jkì£Úq^êÛz¨$Úûà„¯yÓU¤Ò“èG‘Ó;ߊ¿DXجÇ;òAC~˯[ÿO`<ý?ã�D0†ªþ²O_Ï>¿YóXúÔ—­S0R]�®†ÃÆ*E -ÁËT�‚¡ÞÓ–+ÑÌ™k8rÑQ¬¤¸ÐêJ„,!]{Ÿú¹%@ÀÆã¢Ág¡|µ»ê."þ/8óºÝ=‡bˆ0Þõ…¸ýìÎåôcª@Ùÿ¬záûªLì1ÅÍÙ`dÓF´ä Ì8aYéeõeJ_�­àÏ“rË_]Õš÷�Âé>5uµ½5¾o>çû9Z…™¹2û­› ú]ÿ”7L&$ŽîÐ÷&Ê^û)¶‚õ2y/|ë+ ¼×‡`Lš„ ”8†¾1¢/éBGµìáW‚úØÛ96°Ì]¼�¦¬Mì·Èäo�›�¨–ׂ�¢Æç  FPƒÍJ„ô­ù€†Á 4w´Äaf~m@_F’y‰]_4õ¹[8`­­¬ùá­ç_PG·Œä)r¢O£S.’ŦdüF[+ÌOã…¿ç¬ò4피€Á¢v¡XœB%Î.Œu¬…,°2Aér¨Ðã…�Í„T%w¼ëØ%玜Ns n\¿{©ä›¥Ÿ½þ|¦cº8œ9'¢3W^âæø²wÆ …ž*1ª­Ú–쮂íÁ'kF­OÔØ¿/¢&‚èmÑH %Ä�p>M&o~¶ÞÁf”Ûâ?hs1ø{/A¸9·tׯ²Î�U÷ûø7æœO])Wèõ8ÿ1ÃÅ^4|Ú;¹™›d�(¥Œ;aóï�Y—Z†­ãme"I[ªœ‘ ÆÍ,þÌß©w#¦\+åZGG³Âô¬yOî˜;oý_ÚÜ:ûô«>ÊÃ6‘»¾ší'pŒü 'ͳý¦6V�¹NivËo`$"È´¦t*¶·�7ÀÆI¦ÛÅä÷e-½Øbܾd€µCˆ–1õu€¬ŸÄ¾ã×ÔP“Å �ÖfOxVÒmD5‘é7×àœ év5�ºœˆo?~‹¡)æõÎgoï¥v­ð×Ç@Ññ N€°Gb~‘?�964bòA†�A3¢~ùp*¢úh³1v,�²fÂh«â¬ht>¹êG"£“‰!¸Ðäb{ZZ]Òoœ¾[µ`Ñ]âÄ}niƒfÆT�]�‚ÜÊX·XÒ(ä9`“£Óíèü˧ô½žx[Ì ˆ�­®6uzI•Cè7‡¸¢6ŒÆ¶šˆ‘ïû‘‚7ÈaK[óh·âÕàúø¶+Ë+òÛïÚÛ½ñéÀ‰áÝèU’‡v¶QþuP©•ï÷k^Å2]>hpÉ+�\ÈC[¸ ã>Ÿí0‰ðÚ²ç„ßEtÊxp‰<¿Ô¡'¯Ž3ðPì¬�p°Ë½›þâÚÎ öK½*»‘p¶êù0žgÞØ@iªv�gð` ùV�O‘D‰l�ê¬ÿ7j1Ì¿qq5ùs¢Àl¿QÎd¸†¢Û0Yºd«¶PIíF}u¬.&Q�QØ‚¿rfÆðºÍ5°mu°Ô³k-àó×{ãmòåC'¿‹Fê´¾šÖ¥ÑåA�±€†©SÆTT<ϷƲY&T$³À6€õ@ôIÀc·×P{ Ay(ä¾…>q“µ<³¸–1»ŒÀ<úEYÖyºZ µMlγ&ÇŒhÈÔvBaeœiOV]ì ÄÙÆ,ñ.6ÎOxUuwLŠ|áëÜ+²¢ÐS&XjÏò·Rˆ áp§µ›·Ûµ^߇¸?Ò‰Õ}M~ð¶ÍûÜzœ0þ1µ¬�Y©˜��–›BY¹Z¬Â¦�å�Š,1Ü3_¼ŠR¾op·PŠ~ˆ�Qy3š\Ò*V¬YAý0òSqù3UíBIZ€|eëZxï9(ÞFËX)o�¥ 9¹õ?¯úÞ¥UɦL-¤îL�ÖÕèÏîð>RoØ4Ë_íç>z Ìí‚)¹ê`–àê2À8+ñFÑÛ‹ðh\�ºÌ‹Ë cc:ÌŸìh²‹té} í<&³³Ä0Ëk=íöÍÍšãG*�#}\ºAôÝ“‘ ¨ÚÊÜGhbÙdLŸp¹É‘Ðéo-…l\²³vS¢Í% j¿6U&ŠÞlç'õ¢µ6¾}Ÿ‹`h­¬(e€G2UÙP)$ë‘—tû5‘ÁŸ`úºÛömÑYúÉpø×LA cm@Ȳikð­š:q3TYkÛÒlHrA‚µ%ÄpWÐÔÈZR Ëý¹P+GÙ§eL3‰´ëô„!ï_•‘júûPe|±i-CÒéòãㆡ 8dz»H„ý_d¿H´%œLí£ ¹ ©±Ý²Ö-tmeÙoÓL­‚Õ!Ù˜¸±v`öÈy}ô–@<‡P68½Xw] q”´g�Ù‘ömôLr(æ¼fx1)y‡K6�êÇÉ|ë Ÿ½ûŽyæ‰L9¶¯©�xz³cy¹ìì™Jî?fpú8oR€Ž¶”¼VP´vo|GÄ ¸`£^¼Žg"�D-�#Žà‘¾l{T=? °Õ³›1º|Ø5ÿ@áпl—ëÙõ–<Å­´ôµè¤ÀJÍeû¡”o­À²Œs,¯•Ù@nŸ÷°]ÿwqǧoÍ‹lA8b/Ôå\†Ù¡…ùˆô,r¹é¹µbnôý™_dMmÝÏ(ÙP}å¬<7W~ÙFHg�ªCpչ̘ð6�Ÿ#mq�³~óX[?³ù½?¶¬áËÚÊanÒ3�ýο7a®²®?)\,CGû�¼?»�.ÁŸv°N +‹œÔë>–-kh¯½±oŒN«ÏCÔš!Nzeé•�ìðÊ-ذʰ—ƒ(RЦù^¯•£TLÜܺ–T§Ö›ÀÅÇÙ­_v®§8…p¾îxƒ=ÊkyÞpøžê 8¥Ë[[ ½¨ˆ­äʉ* ‹¶ä./ éhvL?Ú×&ìÄKµŸ©= »²çðåáÛ2d�’Þ7Ö~_øùä~©ØÓªh©æArú­+~põÝVÙâ]ðb°y¶]Éž#–Ë´‡}Ap€ìW)ïöà…B;lÏpEÄAÎZGv3¼~Ô„ü `jsBƒû@‰æ–9 }… æ¿Kòwv¸ä�"ÿK|…ódðüõ7Ú€åìŽq·ìe­ÒÀï?>/¬Jnè„õ´ö�d•ó__Ò Å·l>#¿¥³÷�Lý9HÖu3t9³[N«ï“]÷Ú¢.½î…›là‡»nÂØçó‚®Xsúw§Þ÷ñŸ* g¯‹õ7f>jî?…eÉÕšG(>tuh¸E[˸‡d&¯³2*�¤¯ñ#ð÷Ð¥<­ïy:`Ù·l©÷º¹�Jâ†AçÂÍ&.}ñ …gm„Ñï /•2ž—SUïP�‚Ù`tcX¾ë³™7¦nÒˆAâCÝf¬·Ámû›k—™ÏC4�dXý³ÌnñOzM†Œ1‹úVÎÚä@lXƒP@û' =œ}r P~i9ïXíõyÔ|]$qèŸl`Û)’@èÛq(Ù€ÖD3z-¸rð�Ð%a²‡tL¥Zi[¾”å–õ©äx³\ž0'v¯ j<³1vJƒ§üaísMTb,Ûu¹‰E& qút1`j¬ÝØ�ˆÐ ^.-E½~åWfm¹a‰Ù{PâÁ�´Â,�bðQönÀ¤9ÌGÍ“Ý Å…k}¸zža¶ñq‰¾GtPDY  Çx@–âpP_;…N�¹9Å {-/f ÒØíéä4}XÎŵçEË÷îÃç¾öñkàý­‚ÐY"Ô©Ä·=ëWÁp¼¬„Ó°£\«#óŽ÷ãWP¨$6 [iÛ¥ãyŪšÒ_îâ‰]ë�È,åúÈ|5INz>úmŸº#[uÔ`*7ÔøPh#“Ûˆ–�ª?>D&wè;؉FpE–î5WyúM€‹ìkdž àÄOªEðK× ÁÞÍzL=A´Å§žÈ[nœß�‘ⶺÁ”úßNÄä7M¡ZéXmªh þù?så òâ=º#ó5ä0€‚$åûÍmiúí{üSꥼëã�.B†îy§Ö~,—=8 °––aÙF¬u{uïŠÌòß�¬»;%ª¯ bPR¼ b¶8[«!X °Ü\é¾>‚Á°Çì=È-Mª¾]21¿ÝUäZMëÐmòÛÀfžq°ÅcMÁ²#eé–ºMŽMÓŽš{æþCW{Ø9£óS d{`•½XÀÛpˆñúØL½uÆûä®þ¶úÝæÚë l›Á}÷„xÝx´kKŒä=ƒœÀ}Çë¼sT2tííËûÍÁr5hÂ�vŒTì™h'Æ"aà0ò-__»×EØ„ï@Ù©ó/#oÝôGˆüŠ?²$(p+Yt*Ìí¶´¬š+Ë©âb¸2VéåY’?|ו(l¤Ãâürcåói€©ÀÀo/ˆgJ•IÀbv�}.–dƒ:¡ÌÖ—ÙÈiŒûâ9*!“‡Û†À÷û­)doW½Ä…µçô,´ÎJœÖ𳥿(çaÝeTô`Ä¥¯Á†~ /o[èÆuˆ GD37¹è0T㺊R¸¶%ÿs ¤oB­9Í›âÄ–c˜kÖ}‹Í6>mÅÚ@óú2 k?³7¬f¼®ÌŒ`8؃xÉ‹ø�)ó„«nµu—D²†¾+ÒnúƘ–òÞf�{\°N0WPeLXQÞÄMšU`C¾¤€“8™iN 8ÑáÁÚ9H.§R´y„rÎ! ¦ìO§=;…÷†B"`ÛØí!q Ä&vË€ÂfÃÆE/så8OI¾[�ø’‹~œÎuåö’ÜpÛéö†Z+§ÕNÓ­D¯´@ü2²[6°jn�–ì–â[ã•݉¶znÃŽpnÖ­îñr æ|ֿМVcÕî�Ø”³ñÀÌsŸù~[` ž@ý2¾_„G`v¥(H‘¸v¾�_±¤^—/û{�0QÑ­°¡÷Û,D„§v‘é˱°O <Ź�ÍŸ6–M>‡BÙ¤^¯IG3œgÚÇ,+¬c·Ò¿-ÃP7M¥C~KËAÅž"›ቼ6V™·•“QŒ¡wF>|#wª·™«uBý ù®åë@~ü°5ÀðÉ·ï ®±¬ãbÀ"ÕFÏLÄyYŸ¬€.ELÀŽÎa;Ýó¶tÊÇåV ¤PQL6-m}÷ªoA+�®ëÀ’ßGíÚã#�q¬§.‹ÿ<ü^½"r×ÃïäÎO@A'Ky—´u�PÒH~‹ð ÞP‰'!YxÑ¿uc|zÝ.…‚HSUž…)`ÚõÁÕb¦ì„¾¨‹)—²0ØRL 1ÝÆ([;Ý2ür|9á·á¿!×=md&ã d¨�â¥y%œ�Êl¬ÁK,}|H�Ï8ݲ©D¤À]¸YüÍ9².X'qJ:4þ A¸è§ù¶×‘Ì. |È ¤�c|¶�È¡"Ltº«jWX(ßSÍåz 9t J�ÜEÈökd�|L5…7-B@ƒ+E�ê’ê£d{léí s%AHÒ ày\ð¯d<§âÈ3ø+lšýnC¢@ƒ§/�rn™¥µ8Âá ¬VrrqqÊêÉרüj2ß FÀ{¾s˜ö?zÅæèK.%5«ÙbE�4­W#;ÕŸ:½^ãzÞ–AM¾Ó‡ïÓèáø¢Û ]q|ôçvÁšX*Ê¡â7QOLÎ,ÔûkíæÄ›«Æóâq»0 ´i ôÜù dµí/ÃA"cz±¶n·Þ·ÑåÆœçÍÜ&PUð²Ký¾ÙqÀ´ŸXƒv›»>¢òÍËâ=ÅX€W…)û>„©! ™í0-ü^´Ñ‡ïÅz- J�‚–VüȽdR2¤#&ðLÈw0‹ôR-¤ü«àÅ1÷R¤2>Ô ·ËóÊ—ïò°gëw#ÀÞVCšLÉì0T¶Ó}ÄÛýú�l%‡=–æ¢×ãËEÞkXΉõ7k;ãþšÖgçÇ‹Š%¢0òUbsœü¼¹õJÊ×ÃtL˜žÐ»¬e$�ssÿÃqrVh`²‘÷KÛ†9úÇ¡ 7;Åt´½¦”+äIi8`¹RóC¼8Ö9ÏV6¤Nn¼£ÆÖù=>I.Œ[rñkÍoëK¸þÍ//aŠ�j,íÉ3pJi”)¹ž”å;AçÝœQçQq´ "/W®¹gñ&#.0�L&w^:agÎ.ð[ ñ–‹›*²ã5pjÌè“,ëA"åb³�éüì7žíy«¸s­àpú�Ы-ƒMÄ�'…R‚’c ´o£¥z­€›Êzî.ÿš$ÇWîlÞ©-½°Ã²`x–qÊ2SçcÞuÓ²p8Yל¸ø²~³ž�6{ºce{35ˆêBÈ0›¡V›’3dZ©q`¤´ æDÝ‘lœ\î@ö@ÖB”„Ùå»èÕ‡îìàO=Qìz8A Bûñ�ßã›ê÷É~²;­afäcë˜^ð¾à±‰ øYUÃáëï„€’íð�“46"v…&½Y*‡7¸ë´eJ”j0¹)U[�¢2ZŒ.4 ‡Š•‘ñ–*ë�ÐJkcûP×›QóÏPúTѺ';ÛÛM€·@ºÎÚ_º��ÀÝrRÐ =•Šù¾1ÞÚi²ãú§HLÈŠ#Þ3žÁËž×@i5îZjÒÅp¹W�xXâàžçV¡„˜ P³ipr M"‘~úÕ‚Hì´I�ƒeÇHüM©HÂ5Àiñ6žŽ°ùQ»^è;v_øZ|!¤Ä†è5¥`uGËÑ·~|eÊ ï|¬7¯‹‘_„±~åÊO¢¤à9kt?| ´ÒHL .ô´ ¡¿‚?½ †_ɬ Äl—,ó!ééü î롳2UšÀƒUô¶3Àæo–vÓ™¾ˆ�1/X I—$æƒ�&³V˜ ¨ozªÅÑ‹Bm>¦Å³O·æã#`)šÁcbÉRÛbÿ½jX‹×�™¾,¦n8›ÓâèX†Ù1ˆoØÚá\±4ÒC¯ÅŸkäþ½&ð\ åšqû¥îVg�×Öxmâ<¯ßjáÚ¸b )›%Ú!·©U)"ÊÆ¨&>0¸™xu¯¼˜��ñ§yo6Ï´m¡àøK ‚:Öp ¡{Ëâ�³¸–Á x·9ìËš¶¯ŽïÁBζREI]Æ`dÛtckGE~fmZÐÝ]å›(è+ìx *ö¾oª�Ró_Ûëξ ÎspzõòfqÝÑxåKé âJ¢Àbá&AÕ,Þwð–”ê–¼­d£bÁÎÚïF ŒÆ“=à£h� �1´ Ð isjÕ龯°<«×˜ TÈ\­EÞ¶Cx­vÀûŇ6¤dÛ�Æap_ž¾Ú-À½ïhuw"q|⬠òAñ'¦äk�€YV—8=—)œcig†‚µV»6„õgÝyÿК¼þs»§ãHÆì‹kæ6¯j�\a¯Ooè0ÍzüæÖ-a˜Í�GÁ–�ˆÀLß9rFÍq»N#ôGx"ï‚ìôÉÃÓò/8–9qXÜH?€¹;˜ö$V+¥QŠõbB {œÖB¿T•ˆ.ãë&ö�ïÞ¶þNs~N/Áœ�q¾ØÉfÀ,¥¶áŒ‰T‡ºMï”´-!>°#9ÐÛz² Ø=†ÈHJàÀšø‰9Í´]×HQF ÌipÄW“éT¬v I¤w ©`vÅ ÎÊ"ø^–cµç°UÊ7…ØÝ@àÚPh1jM×ùðõ“í`˜9‚�wà[L¤�_=§úÊÞíþ¥¹Lš¶qëXÜùåv„%û%‡”`0){i¯�"hNÊÓGê¶.›üCã­ñ‡æ°ù–+r0)7$‡(Ôu Ê"÷k6‡qM|VÛSÔe‡{$V4gMZØ:�Hlõ¯­n †<äöænB¶íÝBªF&ôi™,cç-Ö—!iŽû~Å{7ÅorÛ³ø-Ö‡˜ý¤ÄX¥ÞGXq �o)j¦_¾°b¼)õê¶°:Ëgîéõ^R~¸}ñ>òD¹yÐØ(¾¾‘iG ‚�ÕÓ1¸‘¡àlò£8pŲoм9Ar`{Ùµ- c©ÌdßF¹ØLg”¡²'Ï …tXv]öðÚ©×Ö =„*�G›Æ¾µPS¡z)úH°ƒ"rW¿ŒYTžT×êS+/×äŒcŠ2ôÀ¤pÉÕkMÌ9^þìæ¹gM"ŠýÍmþ{î€O~'YÚjòï]²'8„Ø…—¸ZÓ^Qž4ÉyêæÀùçµ$ìW}‘Ê/ôØv²±­IõkÓOZAêl=»Qðu€^¨^'Xòý´[ NêÿÆ­î'Œsð\+ÍÝX†Ž�b¡gÙ™ªôzjÝ®gÏy%‰˜,,¤¦’Á ôbŬ)¦ÞJà⹫NmåÈј^Ó>N1ê**g ëk•¶Ÿ„üó~ÝõGÍç´ âëØ1™0q‚²/\b…j¶<4sÓ^Ï·ŠQÞÆ/XÛÂgéÚÝÅ;ÐÅ=’L•…d�A‘¶QÆû–­cðl(O:®Îà¸0|½§ÎÁÜüöÈ­ÇGSº@>&ìàð{¹£ é“s°{Ü@�þ¯­-Üù½âRžiC:¶˜3¨²qPUK|,îÆyp~Pãd1dqP”_V…˜dxÕ�s\ãØ ž<‚¹oE´­Æœ´'p‘”ßuÚí¢¡Smq¤=ì'ÙG¨áŒ²Ö:“3Ùå6çø]õì˜{lnÌBïW/"é6¸ü#<æ×Q2Ôd!èÊqë^ñÁ1Ó�!U™° ùuüT¡�õ»£¾w´�³óFwŠ`.È>³¡èUþvI±q3e¹Cz‹®U—ú§ �Ä5ú»ïÞÛÚú$ޱ‰àᥭï_Íí}Àæù¦=Ù Ž‚Êìd¥™ ‚cOr �Ž¡/~Ÿå›–<7‡© 9âÆÐ�¼]Këù,Ïm(T�5ô@�oÜ{Žê¹ŒI¯YÍû–b'5^Ó9M 7ÑÑP,Ÿ ©È28- Ô‰�Äyy·ß—»Hß8ã`ŽóMiÊs3ïeWV\ÈÔ±H`uöý¼€€ØTº4—0.‰V Y_ t£êܨ+Ø8æ×_{â(ò�ÝbíîÔ}d @d,gâ_�¯¥gÆ�˜¾ïõ­8ÏØ}P¼ |d8„&1‘½uNL Üù›üšÑ ´—‘½ÑËáïëòo…ÀZSÆ`¡«~š&uÜÀ0¸P£æ»ªüÕ{VÅ!§|Ì~ãÖ =8Êi´ò_b!ñÈ©•qÇO"fcž]¸éÎøûr{™y#áíÄÝb»ó–ìëªV žb½ŒÜs|:T™ÃØ :’ú( ,©÷ÆÄ§ú8=øag$‘^Áû—@.›o’ç†ÇæñNo�ÊÆé؃Zf�šd„5ës·¶Ã&�ã3gÓšnœÑ®3~÷9‰ _EËrú;fêbë¹W–gî$ËÖ�†ÍxÜ$ó¼ÌRYv•7�ÈY*�ƒPǪÕÖ�(ÖŒ9ÙÄ@f´žÊÐfä —Áð‹-¼S}”jˆàRD!®3Fér#9Éq–8�‚äA·.ñ¸–òmí3’œ06JA6x‹ÈÞõd[vS?}]]×{ŸŸäùûûçØóH¹Ž£¢bn>Æ6;­àªY0W ê°îPlšÑŵ3èAU œ=c F¨àƒk®±…|@û,]sL¨xáé»ùqñ½Ê­c;ŠXøØ4$ŠÃø»}ê‹ ÁšÛƶA䇴ˆþU _(Rh›äåò*í;±`µ¼ü9°ö’ ¤|gæœVú'´¥”1М \B),pº*vª oùÎú™`%n¿gë ÆžÈ923ÏXÔ sa[0Ó÷´ÿˆ–¯±ï_A®m"SŒlAU´dQû•¿ù6 ó–HëXÊ¥)€ø·ô§ûÆï=>ÜmíIÊD€®qì~ÑÛð¿A¬|ÙÄë�Ö¸·æÆU4 ÔÈ�Ü8Dö¸»J„Èg#í2Ë ä\‹)çï.äS™ ·1ap9.ÎÀò®$ôaƒNp±Š‰‚4¼)œm…±û¡}‘þáVÛ«(fAm�«@õo�)á!–Jž}pË&÷da­2æBrò³Ñ�Éè”îW€Òq õÎg ð_Úáëp¹kÁâЂ˜³Ž3ŽL& ö&‡”¯dÇð&1RU¯tÌå1�^ÝËeû�ßŦúߟ^<öÓ {·ß^>ãfË#Ä�FÔa›¥=cP%¹AnåÐgÌ.Ï!¡¥{/xÈlphÙ2Y°„´Ç8x’„?Íøï¢Ã@Ùk;‡»W5¥¼æ(Í¿Eô*V” Êë¥N7,^G%îEó±nž®{GŸVqø�íOî3+›jÉ' Œ¡¤ÛQZkx9¶"LD:ûÂá«åm±f6H²ËÆ G/–ÆÌÆ ?ŽÐƒ`Îï?¶óim9Ì¥ÃÇìþµØœÀ~ÐPkÕ˜V� Èö2Çgæ�ñ¬`fJj¤66º…Q,AbŒzØùl•Â,p,Vƒ·´?@,ŒÊˆñ@œ_Æónhª>Å 69Ô³… Éej~¹iQªóÔ-Y@Ièî> 4®îY�í/¶ÊvGŸLĹ¯ÝöÜ“×ßÕv¹ㆨGYî�&;+0PÊ\ ¨@ðWŽ >-ß—X‹"þ¦Õßvö§íV8ÏÝ£Ê÷›[gpªPú‰®�ÜÊ(X ÐëjèE›Ë– #yÎA±<£{\ûàñ„ÂЭhù s–œ/œfì*Í}LÖpµØ-¾è@S³ ´ M•?Btˆv –í@ZŠÙ©îmm_‘Ó¢ ~¿c;l×¥Z<;ÛB6”�ë=qÚ]^c‡z$ö>�Øûö’�M!cœùhÏê-íÍu£Üu‚÷Ë}gK°à¢>­ÝÃq‚£D ²×zòù¯ÀU�mU¡¿4‘æ^é�cI4}Ÿjçû¼±l±Ïø@A 7k“Y³d€9ö®ŠÛSd+0DÅ4ÅVTô0É”àØ"-i�=îPë2tÙ—Ä‚"‰mÞ®ûŸå”¦q"³z+Q­ŒÌÊ.ГEMÁöÅ„tïŸ6‹åƒ$”xGÓÉÕ;Z\´�çN äÛØeÄUÃ÷^È$eÞƒ–éI·â\Êi­�l¹–2°r±M»÷±É¼`K#º#Ç'†¼³—q‹^(ö8�iÁ‹ç1 ¥ ³êÆŠ *By6OF̶5çbr l2p{^�V⩇śøv~¥âÇÞÉ\Ÿ †¯B—ŒÁb2»¹ªØa î€sxðÒmn6i“ž°Âô ¥°0¯÷í`>ÿ˜88ò0¬äM<–üÚ‡œð¶wÇžùwUº‰—ëÙ°Ò±¼ž7¹IÑ:c:«Üþùq7åþÈ6‡•�Œ‡É¿*w0D”à�ÖÚP{Á¢–€R«\Ø'Ucïœ[½WkXe¿Å/ò#jgÕ™úÀl!±±‚‹ë3¬½¥Ç–šœÑ†¤±WÝ÷�ëõ*ìÏjîcQÞ¿¬òÞ�0"fºYö�o¿Üˆˆ‰Ïn–vZùƒ–Æ‚³®j}÷Þ,Æÿ_gñxú¼ZVb?]ßùâå,>º(YêY;Ú÷-¢ºÔ�ïaÍ¥€MÓå�ƒ÷ïÌÕôxS¿|¿#rÔ9ñëÛ.#æØ'þKÜ^A¡šþ@7¶—kË‚¨§lŸÐàLÜ×é<wΞž»pÀùœ­ÙfIvj»MkÍ]m¤6Ã{ëg|ê�÷’OØHÜ-P¥f]ºt›Kô ¬Æá¬d(m Ó€WÍ8i7Ðso¯s«|í0×°¬§ØÍÁq°^ w*„ç¥s,áFS27͸Ïw}ug¸f%Üà¶"%“°No�اЉ[3hf0ûºE Ö½"¿uB÷} Lä)C�Ø×3ÁiP¨UA‰&™}§8Ѳáì.\üø#Á9g¹K¸ßÏ´¶GlÖ^µã’Vˆ Å›ÅZŠÙ±)÷¯æn½ˆ6Ñr/àüû÷w™«0ÒY…oœ#¹c¶»×rVíHÀ­·é…Kù26Õ¹%øà¥®–”Žq¦T®ÁWÄfÿ¯å wóy¨}7ýø?}t²—WžlsDèHsŒÕßUλVòQN!ïukÌÒÍAs¤m¸OJ1H…�ÂÄqÜKGIn‹>½W /½hCB##|Å¿ 7l10×­õ?7¡ÆµÏÒÆgšÁÚÉîÒÄ. EBa,wK°%Eà‚ ’‚^�¼+X9n·ÃÊôC°Ö?)†­ä(´6y€Ýw%ƒUY f*%èsáŒF£Ùûšææêž8ûØ;Æ!!¢Ege•,/UÇrÒý§Sð.4£t\žBƒÙ2Kü–'&¡6 Gxû¨�ØM’ðŸdß%%aÜàS 7æÄøÊ A}§š¯Fy`¼Úl 6Õ–�‚þî¨ïìÔq�JÍ€`]ª_{jÄ„15¬5ÜÌî7.Cr\.£­Ñ÷^{.ɸúØ`ŽÚDýËîC¦ÑbP´*UVF*x~á¹÷Á„þ� QÚöÇaXP¸2zƒ·«¹¹YµÙ¶[:['Ƭ…°–žJw¿•�xÊö½¿»‡`}Þí¥;•ˆ¢ffA ¯DLÞÚ7‚Ö=n»¤:}E0)ÐY+¨5SËr¸Óªk¯jÖ è—wb¹7)úZÔ…ö ®`íÇ~¾f’à v<ê,qHƒHøöt¾ ¹ÅìÎ!æÐàväÇ�ÿÐ@‰…Ø;6þ‡‘<‘xÊiçßY¿™?ªhþaWàPÒKE'°>ü¿¯b§ÿ‡®êö¾n Âã{ÈåÖ½†Ç¸þR/Hx«Z0ôç0 f{Ÿ­>S[Ľ¾Œ@]Žéþû4,}›†8Ô•¢åK˜8O€¯}Úf:AÞ“®ÄCJ>žy}|àê=\]yxHLE�Ó�’—Ï%y{*§’á'Y¶Ó�øaÍE×âu¾Çp›ù¿B ›yòÏV|åáyDãÑ[%ÏP'1‰âP(ƒLá­#y%ôÔ€s4NgŠÈ¶­°ëÙPDá£8§¹¬<=Ýî­sY­‚Ñã Ýà.yÔ°I"›D`>)fAKŽ[Z¯zRÄri4 ¬W�æå&EäpB•èœwª?uÿ^ûx»ÛÜ�]•�h¿ÞñÝ´Ãnh,m±eæ ³ÌùÙ^âéjcTOÓj›úÊë%µ¥0Ô™"ž7 ¬þšƒ*«â=rÜÀòĶá[C¬p|Y öyŒòº¼èÛXBœ.�8Ú`Ø�8|áÙÙ´ãzÏG¿ê Ñ¾ {“…xt}9ô†£óìB¾j7ŒÐÕ™U³ØÉá‚âì«�ðÕª~ÜáÂiìeO› ƒŒˆÖêðÛïar³Ù÷mÖ~ážõŽõö¡ò7#)Œ(²{Ö9=�Éæ]B–‚j‘NÅ6}#rÄk2f´ÌéaŽjˆ [°–V°ÙÃÃ[×e²ßD;Q„Š�î›{SÛ_{Û^ê°÷¼Ø|ymEëuzþüøs•<¼þDD@€þÀ"@„M›m´µ²Ú–´«[KVªkU6¶­f«m6ÚÙµTÛTÛm©jÖUVÖ›V²Ûi­mˆ»ºÛÞêÙÆ|ó´œ#ö_Å¿ôÏösý(ÙÜ }¡‹»–½Åžôô‰–S�½��ýçu¡·„2{BÍìg¡^KõuQ’pY »¥§ ûB㋃ÐÃ�ß?ã»p;hœ4‡ÜiòL~ñ ^¨*k¥3e÷¥ñÖ´X'Êá̓x]æ®K ‰µô+&y1�X�RãÃ*»Mýô®…§ö‹.vùŸ÷¹~ý_6èÊ‘ÝNðü¶06ø+ä="]»™Kß�» §ö™‚þ>ªÝu“ÆÆš¯N•ž�š|Z Óû\ñÜÊÊp°¾¬BD/b ë¬c£*»¯tâc“·ó×¥pŒ$sÜOê Rj¨šPëA·åõäïV–Ô¼o©–ú·ÚÄhâ=¹oZ¾ÀzmV°ïpwé<Ú¹õkR A}ïz øã¯9t.ʇv/E¬¯Þ>)C<%çê ìÓf÷ád>RÈ3Üu}sÖÖB½�òß�y¹ GBDâ³ô´à;ÊCåÏTÆYm©‹Â _]å­ ÿ£B�Ón*Tr䔟֛€–$˜\±k5`T+¥‰ýËgFØ¡*p3I.p/Và¹ñÇJÑi‡½y3áìâç:ÆÊ:B;YÕíéõ…!zn‘ZT—­hÁ·Ñ° %0ðÿ&s6E"²+- Fó §þÌÚD/pukƒë_Zͨˆf­=·¥6㥷¥ªæ*ôN)tÝëçdÄ �Ðá/z©06Ó™ø÷ïï$é`@¸3�R^FmÑ×=6·U?Mý-ÀJÌà0ÀxÐâ±ûíZSÜݾáá»óM¶ôk¿=j߯ã!Bj¿/U_:’eô¿“+È·vb6_½ïcž• ¶²`Îf»ÆOR©¸7¥àË·—Ã8aÆ4JXL¢öTmvÜ_³#S;™e=cg3L¤.R’Ì™ÆtŒ'DÆ~D®P8-ì—†§mŒž:—Òï¹½ÕwcPëÊáŠípÌü‰Õ³î(jºÛÜ´åK(Hò^1çV‡HïF; £±Þ·Cª`Œ8S‰ÀjÁv‚“ �¿“š}€c~VÙ· ½ æ�¶¾‡c#›¥šL)çõ”ØÈ#Äp¼`ÃlA €«ñ:é|ý�²·Ì™?EêGÿög]ÿ­Ÿáõ¸­†Í¯fŽ!ôI~ÓF€šéF–ls”ýȼ_}߬ÈÓOv�¶“;Ré§Ü,ê@ò ÙŸmqÔ¹E°¼|9S¹Â(ãWuM½”lmƒ;ZãN¨$ð¯|¬‡`�ÑX»9¢é~öZ$¨»¹×,=Ûk"×Às¹$]÷½ŽÒdUÎV(J‹E´p‚9îÉ“d aÔƒÍÛfñÂªÈ \óÏ(n@k„£Óþ®¶šVöÛInàýLìD†LFCÂx†Í1-›íŽ)ÈIÝSßå›…£Íy¾ÉÖ­wO]rÃ}§}îýP˨XLÂod‚‡�($�¡{89I¶ÏM爰•co¢=6-\ ¦ÛwÁ–VçzŸ‡ÙÚo¸b�ü¨‡«˜ áY^¯ÁfYqC/vÐ1ÉJFDN?mg+m³�m ÔÚÖ¶k!RïiÉ IË>ª¶Uå8-®ö––.0¯½®g·‰>>ZøFÆÐfî8['B+‡ëÖ_,%$V¶êÆ(‚tdж~Ñö€üá-ü>ØßɃPèsõN÷I§©s°Y-E«o|ùñI0°žÅÉÕÕÀ œ�„”9ĕٌm–<Ão;ŽžE �WÇÑÁ}ÇšûºÞLP/{/æÆùj¿�€°RÁjI‰Ý}­Ø¾ ܺÀÔ(§îD\w~aC¸š}ZB@ÃFPOòØ&äþP¬[ååÊ}¸Ð*ǘ7}�ˆ7FIZ±xPA¯h†1M”è{ï½ÛzÍå|†*i&ô‘eÍžœ£~ Æ$²ò¼è4ëä1:W5¡û‡�׋ròvŠý)TêM£¨0Ë^÷pÛМ-SŠB;ôì"¸z…¯£`ü*F4Ëy4±Y1.¥“—Lëå‘#yzƒždä2ÿßSƒàÍ©ùS¬žƒ‘�ì¥CÔ Ì·]rÿ0Ç|Õx,FÌé•‚)äK-ëí«å‹  §:ÇX› š#ðËÐ+×¼ñžM£ÍôއÏ[¼œ6†…î¡®HzMû†o4]åËlN$TZbyc ê{¸+j P„ -¬ÉåCu?érÌ‘ü‘¶¡,ê‹¿›ÕHz�tcu‘÷¾ow2/7ÇOÙèìËq“U’­ˆF€…Éü9˜«4}gI…“íiŒíŠTkïEMñî ™ íYi# ‚dìyjL�vº|0e²Ñæ/oйÕ,g‡ !vá{WŒUM£&PÕz¶~©Ù-i:R¸Úݵ©!ǧÀƒ‚ìœ\½'ï°w � ,bÔ¤$$‰æØ}ä‹hsOÚ‰†8λùÆåãhd¥³%®QA½mÎMÈ=ïrÜŒ^Ä9„òÿsñûxº \&1Ç̾¿ê¼3ÅÜJ÷ õƒ.ˆúøÓ0$Nþ‹b¶á&Yñ‹ßR ¶™|ÒX('®Êç;œHmÈyá©>uL‰¹ÛÔ`›×ñ«”Žû�7ß@%ñ®z©]¿ îëjê'Fº½ÖˆTèFŸY$÷õïû|Xåi·<¾ï§Íµó#Cg:LQK ¦ˆµÍulÐ!N&}¹Îá{™û€k£®>' Öê(˜©¼î@rïy8½ÓÝÉ aY;¸©M5Ò%Á4þ*©¶½p÷;ØX2ä*Ä ÁTÙž›dk ÊÜÑÂÂ�0Ù´fE\·ÏÁmæñ´ÃÛ 6ç_H%Ä£'È?lmgGíS˜PŽÅ‰ÆŽ 5?WÌ:W+±&ZµKiGRm�Õ¡ŽèC»w¾V'<¶ŽÛ7 ¸N!~4-ÜüSɱo9n>�ÊÅ_`Ѩopa-ïÙ�g¦ÁÚÎEш9ÍÜ™'µ…IÑÄÏón/ž&$#®Daõ°+ðÓb¾ù&O¡=LÙ Wm‡ ۜڼõ’ ÛÆœùQ0)"äX]¥äR£«U‰){Ê…û”+�„½NºB¬“°²8­†è÷ñºi0Z@-¹5„ªµÃaMåF}p1‚›¥‡±¼uÛ® �>=u¸ã«¢�•†Ð8M ¼ÕVÂûFAêÖX¨–¶›mž -—tb!5C6‹"ßñ{¼‹ÙR¬×¥Ž�žñoI�—©Äp:èêHï�©ÆM.T“a°ØÀÒöõ뼬øtÖðµ¸à’&NÚ[;\ã13®D¤nw(¹ö–$„Ÿ/¢Å÷ªY~NmPV:°\øÜĺNª’5$Ó�Â&dÂäÙ,RîµúV-€X'E¥©aÞ¶[!rÈÖH Áß6ËE³»®4è—ˆ¶m5CBXKµåiánÀ9Á´gà ¸È†A9µœ˜e×MfQjó<´Ÿoø¦†ÎO®fBÌðö|Z—FøòëQÍ¡¬�0زQâ«.w(¬Uwx¢`JÃM¯œB©làה˽_:f4Ùfx¤—QaÍŒ�,ÈÙp‰aÕDàƒK‚ gA …Pz=¤Ÿ¨:ÚmÞ×jûL×¹ ߣò‡Dáäçͼü+]óÚé³u x%gš…*'y}ýçaº}TÊ Š®®Ø8|ÉlêƒÞ´qAŠ)鬅¯@~kAÌÓßX˜ç¹[µ×CSP� s2Æö\hþ^H“¸ÇÓß�çÝÝ½Âæýèèæ žÞ#¯K}û¬\>h€ö£Þ8‡'a3´sžFï�²–�0Ýý ~u—`:E㼆e|x@϶U]#à¡&ŽÕqbÜë„–\4µµÊ,¨ \U9^_yöÉÖÀ@�ÖÃÕì ž_O,€Še¹ÓNòñÒ\Œ)` wm» ja¬W$7!€�D>/iýmî»nïnù ¡3�Ó“¬Öù4D€óÛÇ‚·o%ÔwóyéãçÜ ³ÎàXÀÏ�Z.¬í•œÛ¡(�¬¶=µrí‰ð8ZÄ¢\RôL@ï´¤qIÖfׯ@÷¾g™ÎO‚û«m=ÜoA•~öK¶!ItuÍCÖ`¦á‘gŒPz# ì®ã7¼�_X=p�j™>Pß+�í¾“š$dnöÒ,!”4¶>ÝÒŸèpÖ?e$‰± R¸m)'PR_Ƽ€Ã×5Q(+@=û.JñÙcÕ©íµø*e±ç¸½ ]í´|ÍÙå{V…{ryå”E±ŠëðË âB=lÚœ7ºNí_U­¢¦ )o¤4:+X‰À°¡ü¥÷Týƒ H¿Ž`å­³fùÏ<½ÃÇMÌPûF…Ö¤‚çcSšq×8�{‡Fúu&…è mW²õsl‚¶—�P/¦5l|-‹@«óàÛ.ËJ¤Ç¶ÈÁeº©å·[Ò™�%÷ìÉ[ÊŸ÷ý….6‚CQc¬^òë�Xønc÷6}Îm2jxxÔ>Jà±Â'¯Í*ɽ�~¾T§·a5ÏáÚk¡ÛQÊópÎàÙ"„qœ/æÔó§òõøº¯¸ëœÀ‡&·�¥:(qÞˆt«|Ý>ùõ^%àÚ‚âÉÙ€òž÷Ì \G“(Ö•ð"¦J ûžæ§Ä¡ÏI@Iº%º?Y¾¢Iͽ]aü{SÛBËxÆuÅæX‹ÂݵŒ=®¾§{¾ÇˆßE½š €Ç¼�ª{ÀbØÑ LFçÖ±ü,óñp|=sùTs)Éè®Ðȧ}Éú!¦Ã*~u£ÛUUú¦Q‚J2D§æ~ΫP7'0µ½$`\OZH—æA=$h‰s·eŒ�ûJ[{Ø9ÌÝÖ�ž6‹åºÂ¡Ï»H±^¨Ê-4RÙÝÒ>nM·É;šØ=3ŒMð§<9?¨ï°F�s7·èáscrGȯuœgß­ã�ìé®�›Ã2±&^^µÏ,iâ k½´Õý„Ý™ÿV^_V[4¥\ yd×<ýÁïU™3N:rpAÚ«éÞðÏv32¼æ]£¦D£Ë…Ü”†]Gˆä“`Kœý½fw;Ð OKRÔí_k1@ÓÜîž5Å—ö‚O„¶è5ö�nBX?åÜmð šnË—göL­\ŒvîÀs$ ¼œ²˜xpuœLÜaË^ 0rô‚e‚Œ9»ÚÐ Tyµ;@†®Á¤¾õ�¤WKÒ«Tï üÒ„e³i¼�…ÇqÑÉõ}£m&´i_c–Lì;•ŒŒ¢BÏ›`³lþvU´Kš„å'¸rq ¢«” ©Ÿ¨±Ga!Ï€s¬T©©¬ jY3Ì­í8êªp Ýè ¼máØÅŒÇE®Ñ}Û˜žÍæ2ÖsD»"ƒ¿‰Q2²ßBâŠ2aY} EÎëÿe8 Q¢‹/x†5 „ƒ-ñd@ùöKDœ_)¡Õ$%-¿Ã0ïüùø#µþŽr³ÜdµøLïN® ÿP7½Øíhëø·ÆkN¤ qšÎ¬‹Vö2�»Nšóëkäþ7A€?œ3žßçU€˜Mߨúwkl@Ɇ€õ DNä½`J¶ðšMÒý›�÷>ýômC SóÃÓI_I 5ÙÏxà7†<$/�¡ÏG›³âuä()ÞãGø¸¯“‚¾^&ú\g«qL;«_ÉøICʳ¥ ®7µÚ³{Ð8¹ýûÊ»~Œö¥æÝÖÂbéëc:E»÷,s³š—Þ[Z&ÖòÞOÜBØÚÙ=šùáU¡´‚»Ú¸�=œ+8>¸® ¨Øì…Ÿ£Î_…‹Q>Gw€tiìrà+œnö�>B8Æ«-ks-§°naßú«—¬ß/û…žãžwFdÞbmï9"�§¼&ãVÀ/Ñ5Ì„‡ (Ü‚yÖö/ƒw¿‡ãØT&÷+Ò µt9?¡¤LeŸO¼÷¼Šâͦۧ„Ã69�Ôrõ�l­·zå·óš<ÎN5\œ3ÙÁ ¶ DchæWÄaœ ³{»]¸.ðáwÔ…Þ—ëÌk›”Uc&Cf…s £�‹˜X“ IHÒ�Ê7 d+Aó,6Òú(ÖðÚ‹¼U÷тŷ•1¡_×�Ư…ò¬¶ØœYÝl¸S4õ+Nðب˜}Ó×è鼆C[^•@ë–!¬o䶆¯í„0Ï$H—ÔVy€OТ�‚òkRFD/Ž¿ã>VÝ„ ý¼^îpƒlåÐ6éIǺâa5‘ÊeQ§®ð)ßi¾{߆µ¡Íò´ˆ4ÊÌpÓ-Ôæ9ûó¿ XcA‚ Ý“œxái~Wå ZÎd¹µFƒ.bÅ(ÛÉysu€öÐèÀ­âÞ@Uð8;ÆÅY«„ê1ÛkåZè;õy§ÝØ—±—׫ž³èv8Brð'ŽiØùzß  ×”ÇÆºhö¼|¶×´˜¬mïœ�ºbó‹—öùd¯âL„9ü°ñ~ê0ƒýó|ÉK˜1Ã‚× îœüOà¾7Ñ&ÜÈz9•’°mÃ|Qx,ÛY•¼HŠó¹»=øÛXë§ £5¦ÃÖÚäûV9aÚ®øµ-7.¾¸Ýó«XzS$¿Ìd6ú½J…ÈÇå$¨{Jµä{ÛÓ[êl­ùiŸs•ËP´whs‰$@c×K×È5†ÕJÒ¦~„�K8ôÄìǽ0þô¬_nž�›¾õu·yêì6èøxÛH¨¨ÆmŽ»{Ã�êÞöÔærìë{8(D¢äýëtòýÈ.éæeÿF}õjI@:Μ•ŽÅžØ(:÷Äw^í~T˜Œ¢NÊÈûŽa$µ„v›ëû½àç·ºFfº·½ÑDÿѰÛ�`tª—îsãqý­Nó°%hzIF«NU)y>rÅTÉiO¸@V  ž:ûmO¼é•ÙÑö Ø´Bm‚à#Iw{…Jˆ58›w\ä¾~ŒŒ7½§ÎÇ”¾dyñ¼gw¿bÃ,Ë6|Óæ´ûů‚²J9ÚŸçG†½ƒ£÷ßn¥7ž|WHº‚S¥¢ñB²ÛFSË–‰°‡Î£ÃCº¨¾Sض“Rd ‰V«~¿ÃƒûXHäC´×¬«°Ò¨æ ÚÁhÞ¸ A{3¤Ö9ÑÍÍqª\"@Ê�1_ס¡�¢š¤ùì¶#r·tÓ×ï œ* iGLÌ3iŒ"l��®àü¡*6'y²Üóä÷ úïÍ4_¿¦ˆ0 �›È‡Z#€œÌ.æêr˸âXÐîxr¥Gj¼†C ‰F8Åá[PèÑ�¤®ãKúëLR›tëiú’:tXZÖtžß,VI-Çhn@¢øš/fÀ}÷¥¬‚Î |સßSˆÒ'ßw€¯‚h3�ÐZUsª Sœ›4�i›ƒûÜ2jA=Ð�9rÄaá½·üŒÇ4Fø]Ýöà+òkr˜µsºÍþ€ï-Ëë²HòT’>BûjH vAþÙãŠ:u•&kÕ£TyœžCÆ}Œ†âÁ——ÅV ³Ÿ´›–Ö{Ù _Ì&B|%‚ÓYNÀ®L#�ÑÖk!Å: øßz :Í}Ö-s0¨:û·@Û†´ÖÛD½—_t6,�1/¥[q[3řޛm<é‰\ÁQŽ\¥~|fîYùj¬xJ Ÿ­„c¿Ì¹“(ãìîpÑr½ðxàƒ ?P�ìjG€“Y3�<‰+ǵֲœ�Gêç4-%ðÇvŽsmï8›Y�?û5<(´%P7žq˧Q�bÅŽ “d´Ìð'}ïJ¶¾cVp£`8jÔÝ- ­ªËÝ4gçCVšËîž8�ŒÖ¸ð†,$ ¥—Ø¥ª/Á¼'F½»ÀÚýw`Q8w„_ÛðE@s3äÎÁº < @À™§bܦŠë½˜, Gw�ŸN†ó•Lê÷BÄ uþšå¬³ýÄk]÷<Þ’ðÌ"[&®«%ì í0” (¬E’@àÒ°v‘‹„wõ­úÿ7ZyÜýÐrãï�;€çC¬þÎ�—¯ö$^öõ‰ðßZ:gm'å°4%6¼n«PéÌö8°ž†ÕŒ°W:Ð;U6»‹í»÷ k·c¶É¡ÙVÛ÷ZfÀÂ.*Ìdƒuñá"bbأ﫦t€ÙØÁ_šàXe§Ó®‰Ì&0“ëÚR�¬ «l(¤ªMÚþ׸’[åjÖ*|IÌŽSÍÎCe$r[¿Ù¹øû /†wðÙ±Ä$¯º\›§Êjx¢Ç–ßM¬�@‚ø¼,ÍÞ|ë1>}–ýOVÞç‘Qn{- Üà¯:”�Üm$=Òz‹˜,¡Å×°£Õ&¼…ОâYxÓµ×ky½·7Æ ÷2뽨SÜø³Ò¸dyÈâ0©Ôå–è;iœÜ�|gëÏJs–U�…7Ë�’»ŒLk„`2C‘h\>7šÕšÏ7÷& ;�í§`>Œ"çfBmÒÖ­·Çº>d>ÖªQì€ û¿}¸¥¬ ˜Ó;ÃÍÁ5¾ß׆nX>#²Xè#]·‹”«k’³o„Slbƒ¿P¬c:'ÛÓÊ®°W-Kg}å‡&²ÿ”Û2‚ó»½™+1jaë>öjoäç1²žc¼Ýý#ûö�[ÖÃhn¤¨e¡ ç4?O޹¾îü/º?W¾jÕ·Ù~óGÜÎöøž­ƒj!µygöŠ0KsݘÃKJ¯>aUÝ+oÝË'nð‚²•Ç˲�_„é$À† òˆ]P䥸 ¹KÜ·rk‹µIáê3nÕ„Õx�¬c˜aBPÅîiI.”qC}SN5÷ºÖö«Ù÷½é®¨- 3zÛ¶® ºÆï€Mh@‹d䬜Cõ‚Çq�Çä}ÂÉ8«T¸mdÔZI¹YüA¾ov5„›¾¸è·ø¬!‡ˆ,8ïQJa«ÃìÿhÅ=„ =šèƒÓ½‹›v± S,ežlŠ7ReN_!ÅÑüüɳg›¶ÝGåîÆšÂ©�±›9~¾qí›Xv*Rˆ«;’R�̪>S_¸›I(¯¹zSŸÚ¢¨Š¹È‡½Î Ë,›_}œíûàfžÍ«M^™¿+©L„ãÝûÆ×ÞýæqJÔ�Œâìá€ìÅÔñ�«$E<³+}7RæÖˆ!n{ck­Ù±)aÝ ‘‚~¥äÜ5ª´)ïR³'´ÈÌ5ˆU¯‹J-¾áBòs®Û› †zM’‚<ûÑÌ¡7×Ô *­v8d#r¹Xº^‡pŒ’­ò±�Àº{ˆ�AÅŸ±.a°YÊýfÝ»äK_àF_¦­âĬÖ~Dn_쩨¡ ì{Éyªå«}P}ÌTd€éªW¹ŒUÕpÛêÖÔ|‘âßZ·V«‹×Bm5´=]Ó}ꮡ#´ÞŸ;¿\uxuc#l¦pÍ ÈÅuc%­×1¥Ý�5„*ܹ™ò·’z«r­õ‚¦ÇË1“•TmO£–Ë—À­°®}«Ø÷w„1_ˆ1â­ñFº·u|ñ¾ýŒ[5`Óvr¹ÜÒ<<Óë ÆLH m áØÄü½SúÅÌí»*áü2«®w¢aü>ZÏ=nÞ4Kò}1SÁÞ‹LcEwÄ=ÊÁ�¨H@hwŒ *Ú�½Ê¹‹_‹~à±åáëC~EJrw¡œ b‰”=íop¤û…ªÂ§vLÎ�°`: 4ä¸ Y|ez/D#N º�SLráüw&çÅ6h~Ãq_¸Î·ÛRƒaÚËkÁAšIÚ»8ß§¼\ëA‡÷· @ÅþÞÛÔÅ& C�ðÅç’oX£Ý¢SxƯƒ…¯m¿Ål—ͱÔ(̾×ù‚7k24›†¹a®ÃVŸ÷x€ÃMþÔÑÚ4Aã!„¦ {ï'ü|ÜjƒÙ†Uµ´„�Ø/©k7½Ù5EdfïâȤßjÝ |~+ÿUªìÍ«FÉŠÅA$d£ä7ö!×b܎קæÈ|ž«ðD°‚ìüäåcfkÉÞïÍìÏ5vwêM…ÝÚéÔÜž§8Îü²¸5,ïaÂ;@ãaËvyéÁ¿Q£¸q—Ç©nÑ LÓ²ÞÃ]²Ø.<4d’øÐ ìäÂ&Uk M¥Úª÷EDÌ«Õî„×zª'q ä[# vÝ»«¢n]}5^p[œ)Ù1K)Ú=¨þPËíJ¤->>t~ƒTžÑwOÉöÓhº™•·KÐlSog:µè#0ýf�MÖÍ•Q,ØÏy¼Æ_~ˆW¶Ü¹ƒÓ$Ã(^ /°Ï^•aË; 9sïv[ƒ‰àNtø¤^—ÙÃïZ|>â&åÞR[ƒ[žg ÁÎÍ�÷|Zž¶ š•©ßoœRÍ»i­qŽÕ^Üg¨±ÍàTb)ÇÌæ[u£x¨%/žM!—|\ÒÌx,�pX1ÀP[•¶©¤@kIi›yi ó—GžÍCöÊq¡Ç@GÒ„�LFÚ%çeDÁ 7�ß’�Ù{‡¨%OnŸÚe #w¼Ú§7.k˜´áòšTÛÓ žÕÇÙ’�ÒD?°ôëQ¼Â—>LæOÓþ)÷HÁ¾L�~‹…r ·nqËš‘Æý±Øß+{™v÷ Šåá@ç:eÖÃzSû—²·C5àØŒ> ïËdè�l—D8qXxØAoÇܵAeµüjLíè»SlúÙ,ÖmzÍUžyšÎ}blÖâ†ÜÅb.¾-TžD ¬®“æ¤6À…ÄRâ¨zæ,!˜zÕ\9Í‘B|5¢4ÌD¯&êµw×H´ºw”ì4Òw‡É¾ÜcÅ™ÚæÕ%”´Zîl ªF©§ù¬mq͈W·!%™€ï)«Vój2A9¼øLµstŽnnô«0ŸE›Û£uìù«‰{ÌïSC¯GUm/Ƹßt‚x¡Žó½‘3Lˆo6=á/ΪÀrÅ©¨ß•l¼¯ªEýÜ¿¸áÕÀp€×ZUá¦<È„ZË@ .ÇØ ¬PœÑEki1pǃrµho\í®ä«œZ5ûW‹�³Š Ávcü„lÖ­•Ÿ%­ûÍúÆëÍÌ:ÝE›%çlo]3\ŸW¹ëï·@Ä B]O�”Qj®Í\unø„®˜X¾“ùÑÄ®¬ó!£wȬéËcç½%k,‘<´ÛM}ß^9ž[h.–v|¶°\ú®Y9á%hØ·áÅ:Ü^+,Sju¬é­}ï�ŽºuϵÐwIëc ?¤VÞ&÷êtâhÁ´‡j`µ`ƒtí^¢*&áL$Bkg6m¥ªþÑŽS“ø ˆáò•Õ “´ˆ6t_lôW'Ï3gEé)ãaaÀ1õN禞B˪'öl „ 8AîjÊnàXÕæ“RÙ ›ìYmMCʼàUIƒ±«ý«Û2øÝ(�)9£¦­¨Nœš4ÛÕjü¾¼Ý =ù—*ºw0=áî4v§yK§ÅàJ²?J»Ø‚ž´Ã¶ƒ¼öþ»/ êƒ×µf!ñî�êÁ‰w Üã¾yöêgf~ÛÝ>ZÕWdæiÄ‹f9öB4=€Ð4ä0·Ô ËÞ¥=®Å¡ã ÛUëÆÈ¡B�ZoÕpN ͘Èü_P: çTA‚ã-¤°e—ÊU§xº‘B%o¦Z™ãcŒK=[µ1‰¿§WM})…¼¾´i�4s^zð¹-{­P©” §ÁÇvéÙ÷y“ð2?W@™æÄÆÓ7 Y÷‚¤´ Ÿ­ÓÜìN+A(+[ê­õoÞ�3Ÿ9_—vî†x(ø„Ùk®§ÆŽÍ�|\R¾Ü1�ΤóTú˳[»Öú¯lÐâ ·÷þè€$ Aü¾yãÛ.6/ž˜ðéïŠp:�#r-È: µ…ŸEœ�aL­+l¹,ï t¬îS_ío9–SGÚn)l§Ÿô #ó�{¥à”2@¹Y�ŠÍïÈu´Iá0 c·ÓÌXˆ;ªFn]Hc”˜ÀØéÎËI„D±@ �9õâ¹nµ‹ŽgÕ)VD®àï;®C†ÜÇUDM£·ô«ñêPDˆ4ÍwÅór{—‰¯pÑÑË5 …r›xMy·…é>±ÖnQÚö¹)%‡Ëx¾�iG©Ðê–gAÉÅÞŒ)žíV$»VVùÆ E,2Ò½%1Mè–‡dLj‡àg§.Uµ/;ƒ³á­vƒE¼¢p‰ãZ/pWn½gµ¯‰)ŽT*kΰYæÀ+ aØ×KŽò,�Åm"‡’”My¦euËA¢QA‚tVÀŒøCó­ èF&³ Ó>‰¯€½§¯û]d-¸×, jsðedvàqJÃã–]p&ýµ�Iïg8ñEÍÛ�›PrD5»žY“™a†¥2ˆ¸ì›¹-¯Ãs¦ \0�·�ŒÜ^MˆÁñ ´è;í(ì{Ñã|6ä¹—¹†zTÏ NÚC»0 \Á9ĉºâÌ3¶±˜6gUY|zµºA®gfË4-Œ=äî’t!0·Ýî7v£Ž�mìî"i µŸH1²­ïg8¨y–ÛáÁDî×kz´= âV{tÑÈkzuæúŠm¢*"³ †SšÖ }±Sçc]´à$iX…åh‚9$8&ÐfÐʆ›]$=šÉ¿°ªø1:\Å… ¨/am2ß+‰iËYQæbÉ4fÛ SKA6ëµ–ã ¦;ˆÛ³0 s€ªÉ»·°ùâïŠ-‹¨óÛœ`ª£ƒ¥úÍ¥¾|öWÛð@Û¹°zÍI�¹âë$ö¤øW�1 £×+™˜µÆÔ »¢VJl”’DR)\[cT‹›«µ*ÙŸw„�L¯Ver†WË ÛX½(Œ1äƒé-~Žõžô»„îÉu=, ã/oÕ·G<`]? �€"C½Z�kqñÚWįi¼NÛfïºgß?"BêÛÙðÈx”pÇБ}†•6aÁ²ã'4{ auG¾ï“Éj,÷Ÿâ–67©Õ7ÓžÜÇV�N†JD'\ƒ]ŒÆbÕøp�?t)è%"ãu2Ô†¹½E�.ØôZ2ÌæÐ�@ÝYâ#kn©¯NÖ�¼ØšN†I\AæµõÍE^ùFvÍ;Y»g ÝÚ³ºE˜#|Xv>ìD:Y7Žj=5rÆ%ç ÷DˆYÈü<­jÛ›Înt®AŽG’_]Ó/Î��và tfÁã–Ñu½··7š¢ >HßçõE¸«-Ü|Aq|}X«àj(pîÒº™ Ùö*ÿ“Ϭ1šBŒf\¬Óšú—ªš@Ó(LZ¹d°W(lÁÛ'ióÕÆ,£iš[ã|6}myÌ�@EUUõ·î�«, ¹®m›lWÚÜõµaêîw´’q=ߪÓeŠÒUµÀ�hÚR,ŒØ·2TÑ}ûd¿d/;Õ…m>È2ÓêÕ@QÛ‰öü7 Qyé�”OÇöImNŽä"XÜ@|ÆŽvºôÐi� lèÙ:ÛHgÚ®ñt`š‰\ÞÀÝzôdêJïˆ÷–�'�±PÒ‡V€tèôæÖ¬=[FZÔ�ÈÕo3àñ¨axÛÚ˜Sâr ØÌ—>×ëf…ÐÁ0�wÇG6¿È`àŒ×£6HÑ*õñÚ`=ã*Pr_cäÏÅjBˆI¶öa\¨OU.ñù v5ì=¨!ævóõá&žŒCÙ+öí�·0Ûã\•mq0H·cƒÔJ¶ßî+A"À�ò߇…¦¼hèãã}[ »šðUì Î]þƒ (ÖßQË¡,ƒ œ½z/‰Ì†‹GvµÃ#Í“$ÈÛ÷Ý„l‘cÈdì xûu–õ[!ìpÚrŸŒ¨€£làA¯kphäæÐ¡�·|�°ZtIö^Û#IÞ«K¥Œ`þ įPDR‚Jd‰‰2·_[¿‚4üò+å¦ÂèºD]tKq–aÆo‚è,�Ù~}:5Ÿ¾ó›šÍgK­:›/榻ì2?nÆQW?$Ö"ƒ$3žXDÂÍÔƒ€P» FéJŒþûVýG”ÆsrÎ{· mXN™´`OÚÑ‘ÞGÄ~k ø�~ß¾Ð{�ßnØû€{Q•œót.‡EŒ÷àlÙ Âò»Œ•^áÏßF>«p‘”^S2gè Ùí.$;l8õ5ÑÒÑGÇ[Z-$Ô�š ¦4ÝÄ´-ÇW3ÇÌo6°šwâ g³œ-êd” Ó÷s‹Ê»ÞrKÕŒ¾%7‚ ‘‡º•¡‹7¡ÜznÆž»èÑ‘]à [¹¬Î}§ðîÝgµ¼xÛ¹í±B2¼ÅJTUûvÕ�€\8d¶cO��M~ãC^¦ù#¿ óìõ;œA#ÞáùÛ¶5?{™‰˜l ëÞ‚“•¥ ~Ÿ x@ØïCOñ+bg|GÍ—Ùn¥äB— ºS!M;à >„y6õæì­jõ¹Ôn’Vö¾�jiÃítÄÖÇT3:ÓaÞ8«tê_`-¸ã uWNÑO� ¢ge§dá+ß)¿³_[ƒß¸˜Ï•0(ƒu³Ç•é[ðÛŽEص–žòÒw›Ê,MÑä¾zù/‹¦+‘4̼2Y¬ü\mŠë†n`–¯'¤~QÄ'4Ísž®tɼd®klƒ¦Ó•¹‚]su˜ü!kÍhÃWÊ8à!º¶\Ùèæi*DrM�A”M< TU&¥†•Úù稸ÀCÇÁö`~£qså�i›w’­Ø’ö*�oÇü¶ÝhÈ£_cHóâ¢xº°5cÏ$­)ý<^2çvæåÓ Û  t'.CZsüŽw›*î(-òi±FLŽ`I³ÁŸ‹èR'í”uÒéêÄ0ÑÀEQÀ­û¤ÙÍ’>†OwĽÞñµ®ú€(uvã�® Â'F >]9vt7=îmÜ»bÆlìcT¦X ÀO�]âË„‚çn�6Çå´Aù"`¼Ý.ïó�}°m¨xÏ�³¿h;›òmM�OTMÛ•‡QÍé·­99³—Œ—¾Tƒviþ‘°ÛÖV*ŒháÇš[ê ¶cÞTÇܽ¨b\À8)éBÌïEºz-4©#�OmÎØAIýÍuqü jsG0Ýzk�`­–Ñk¶8ƒÍ–ug).]#ò”#ŒŠ·Ãm,ºŽq&ÐàV`#M#wu¸Ñæ‚ÊŸ)„І»3ŒÂ�z#f}hý� ìãX}ôÀÇ#Ñærn{É>^ p$®ã+É\DÅÃüiŒˆ$t͉2@ˆ˜Ë`IŽ€ûi `è<¾d*ô­úpTÃêÈ Y ¾–«Î îqÛ²ì‹ád˜ã…† Ž½ùeÙ³ rÔÏ•ôÀž9ÈÔÚÒ·Å.…7'­«ó)¦Ò¢ttj�½;ÿV§À¨¨véC^îG}ãTüjs[CcéÓ{ñNBÏØú>*ZOߟ‚ÆpØq[Ç~–ŠÆ‚ËjSÎ#¡m… �»cëÖEXà »} c²]Ñø)d�RÀdì͉qÊM�çrœg0wC.ÎJÂÁ fÀ–J8Ï ›Y5c³�;-ºs‰  F—DÀ'£š÷Êg 1霂D¢âƒ`«ð"×ob²ë€4`‘®àvÅô›‡ûð~üƒ«²æ9±{'S¹ÅT‹+cµ1­ƒÀ­Å­œ~l‡X‰+WÓ²üšãWìÓ—ó@ÿxŒÃÁ´d¡ßñ[#Ï/ÜÝ™î¶[éHç¦\©§à6;HTÈÖêw%v‡út7Öygw³øo¼“VtÊŽV_ÚÝþô)^Ïõ‹(³ù‰Ë,BEn' ¤î£”Y ŒHšÃ öìõ¦ûi{¢¤â>¢^O7dXÔómNµ>*{lj/Íe2Ï‘±•¢Â¡ëm¼™Y ¤)Úý¬Ô>°wÊK»étŒ×kýYÙdª·o¨:” ½kP;\sô–šÁÍ0b3‡m¯C j[LÒ,t6S‚¶5ï¯xŽy¸;°5W5 Ÿ~¯¾ô`|üp‡é†^Î×°;ǺN¥ª®šsª^£—ÚÈðç ò“ŸUú<$ö‡ ¶^�¸¸—^ìn{Ùœ•ޝö¹ûÜf_£nÃù§©ãOìM¦áç\ÝQÜßõòGÒ¡0wOC ¦É|îý1Q‡Ñ2ß:§S®²¡È¶ÁýáßÙ×® ¥3íô*[0|üHœ4 ÷>bXÆõƒmß4ÿ¨ˆÙ4Ô³²Û¶!{BWäÎ8c‡Ì«à�Ì–«P”[­ƒÎËA�Hû0÷�Dæƒä3Ìg¨ž7Ï© ˜*Ì&;78iÕ6ª/§¡EŽ¥¯‡àà-‡‰¿>Cˆ†–LŸˆÅÆUlA"mŠ C7›váqa³ÜcÄýŸoEšdž.º3’M!g±¹Öe VèœHMá}9º�Ìn�wÜÚ¬ÄÖf2Ò?>kß7}\¹A˜€Ø… ‹¥ :.Ñ»æ,qÈMÐyñR|àngøûítz<;Äzù­ÝñǹßëòuuvˆL ƒ¤ KaœŠ!ñtLSö†×'‹ª >™†;µÎެ5šõ§qšìP­Æ;W¼¢bÿQr-º¦½Êž8ŹÎ`-y8,uNÜ{hiä¸#ýñ&@¶X¿¤*g’j{ë`ý)àÆ7Ìš·¿hà*µ»þyÏÌa —Z±Ðààë ›˜¤ôÝ�õ�榵§›"@_…Ç�+gã¥\Q AfKú×|&u݃CC=‡×�P½ÄÝA^mÒoˆOÜû@#6rÐIÖtéñ–£Vµrm\ô—_²}¯V¶}]-Öxy8ƒÈ:›7Â8Áãu'g–{+´¾œFr3¦CÎÉkE°@|ü÷úó[/¹ÂÙ MÈ%ø B)‡“ŽP;ÊÓÈó{Л_Ü„Þ=”qm\îLb‹6›‚9À–Å�³ ;ÏÜ6Èj‹´�Àhñ9·zc圗ͼY“Þžô¹à’Üç%øÞç»aõÌUcÕ™G`5+®Ýp¬B��Œï/–n­0^ìUݵ’':+ž‰…W±×X èI­-pkÕç]ü&—.¸ñ.—µöÀ�"¬��ˆ”ÿGÎUâÎ[ö®Ã< 9íó!3½¾âÄÙŠÕ[Ø:l_ï¶­¢-“Mâ·>m#\¾$�^R„ad'&ý?kv[ôl ¶Õæ‡2ªD„@a´>ü×A.˜=@¸kîA‰ïX¶ö¢÷2ï©}›T×LÓ¾ö—·�~ì‡ Xi58_,9e&á=Åmâähq¦×Ð΢Ö^ãÜQæ†ÎÜGÍ—jy® †5•øÝ<¾T TÖ®Œ±5�U¿Y´èûQmg¬vÕõ¬]¬ÏÂÅŒCc4 1fpgÍk�€âØãRnZO‡ay"˪…GÁ¶9&>7ì¿`ñHêÿ“Æt¹ÎC•i¹¦2 5Ëà Ýf…ª h‰ �…ü‚óDgȶÕû­¬·È9ÚXÊøAMï(jS 8pëŽÁNI˜4™0¸ÂÝPÝ!jÏbˆSç—T%¹r·µWôrgÂ$V.À}KÌo6“iʉqÁÿL �fdQ–„Svm–©(¬Á5®&¢�Ê˰7¢€Ù+ZÌ?Ö=üVl„Í‹�B\Û4g+Œyç©I6HK¥"=ŠI«4 Þ µ�û^\zhDùúÌ·÷I(ôÞ:0l]ð6¥x Eò@63âs>±4`í<.Szo�ïŠW¼’ý ÓŒ•‡x†{+ãÏmt8Û@y «>ì´MØlµãîÅìÈíh}F‰L˜A�ñqûÅÁÁVŒÀƒ¢YqðÍÞj ßYÇŒïáûæôR;p´:u ”ëC :bI¼&dƒû¡|æÿVMxºû0ˆƒþE~¾X^¿ÅçìêbK‰q-CŒ£àºÚC›Æý"o®×ÚV®[(þÈ�®ˆÈNï›6‹O² Ôï$¸`†ÖææÍ$}.õ±œÔMºO]ZÚÅmîŒà™½Áö;JÕ�} ïSXöQÛ+�â_&öõÿ”á!ß@ýÈÙ—ÂÝ.ÖÞI|>e@¨¾º‘¨+¾ô¿@‘qZö¸á`¯Ï&[Ì_Ã8cõ1�·|°+n,ú\ª¨;¾FòNª“‰�~LÂͲpÈ8 i mc½>LXѽìC×—pçØ KÏü ©ÃQd–òævôµ*„À5˜èó…p©öŠuƒ­ïh¸”žŒìAý-ãägç`á燺/ÄF$‡ aƒæÿOñ`^Ÿh÷þŠ-›´ù�ƒGjM¾%æÅmÚ–¾µ•ßAØ=åv¾7y^ ™Þ½˜P|«仾ž?îè¢ó>‡Ê)oÏ+_<Šz­tðâîó{›°ü÷6CÎU€bÕõ€DP¦Åpï5ÐæSS`F±¹ü×;gvb Ã~{¯¾e�,؆ñ RQÀ ¬ó³Æá-O0³Å±­xTA –F?®¤»0.óu›�£/\·($|ín•áˆA62ÌÕÞæDeœ¨YHû+ú’ P>ö“{8a7Oi¾ !¾épÖÎÄÏp›½�…~Zߣ8¹ø²ä<ÉÈÚ˜ëM(Vœ”S’Ñ•1k¦ë3å‚h-'Ô„ãûiù‰láûò{Œ “¸¬MôÖr ±íþrI-*øo1P²›k‹�u’µÂ÷X�øˆÆ=nÚï6êLn¹\DÇÔyß�z~qöö‰è]âwØfÕ|{HáZ\ªP—.yi1{’µµ”ÂÛÒ©yžMXtVÑS0xª¥¡IÂu“ˆ\ XKˆ@24• ï%x†ƒ;Ì,iHFš×-X˜5¬‚¸"ˆ7[R¤Ñ7= SGtµÑ‚ çY©z„aÉÐ+¿ì¯ì-�ŠÏNÖ'ŠçÀkŒÞ_ŽÕj'‡O·Cõj~ßËñp6IÑW9j!Ê| Ûúæ7¹—� xÍⵦi¾ÜŒ%P'[«dY&ÎYæØÒ5}p„L[i aކ¶ƒµ­$‚–Ÿí[tr,Þ�ú3|A[ôðŽ#WÖ²ß£ÚæÁ¬ˆ¶I÷wŠìXYp˜Ó£Þõ¹ª¦F«‰Þ„C; mmöÕ<Õ´¯½,›�{æ]Ó/{Llç%¿‘¦ÌŠJBUT¡•5Á aicÅ�A+ëó™›!{‘«™árƉ0õ%ž;´ Ø¢I˜0 XKMù�†jÀ|ÛP b¤Î×BàÒÍgTe/h¤e pá×3`¢œpr/óæ‹paµ”µ¦NÉ=ÙöIÁØ7Xí=<,ÖªÛ€½±K+e‹�VÔˆý¼ß+h¶êËœ(­DjwXrÄÊ„±†Z¯‘øÝøc«ÃÕ%¤öºF¾ä3”lQ*ïu‹\ÑçÎÄ’…"#:åïÞæ&ĹæAÎ`ÏŒnü�{z…¾ú£$G,W+�(?¤¯XVCÇ}Ô E mñ8 ñ¬ÊeI½ÝÖ]5ô¸ñYgÆä ¯ÛÈáFºð^ls –úØÖ êÀštˆgÖ¤ÙþÁsšä亢ö·7Ð>Ž7 �« úÀÁ™1�‡xÆ«G�Žê­Ud~|MÕèkc­|f³ÛþUÄëÔ+d8¶£ÇŠ‘VŽ?r¹§Íþ%«rê/5…C| 0ÔJ h½¥)F‘žò÷V_ÂybÎŒ�á!(Á²;?Þ‹²ñ£ w¿=æz ŸÜÓF¯-wõÒT©¸yDïô”¾”kô5X/<ª=ì`>4â}õu±É“6ûtu) žg¡j矴�ñm_SX'“ÕÏÉ· =ìÖú½“�ÙN�©Ê;Áeì‚í¸HýW(û9ÊŠ†¤ßñ`MX¤)»TK.“,¯ÛÀ&:~ç!¹©`�û£‹ß½6"Õ€@_‚Ä;z,}ÌP¤6ÄÈ�v_¡« .½ã°%wGÇnjÛ,dˆÁà<–ùívØdêçì°€M û|ùø ÔœIþøŽ«¼2B¼ôjÇû©È{t —p¾Z“⾩Ý Í%®�›_jÿwɘ’>üY¾r×]säa: 8}’½sﵪ"檵*øžöÖF6"óØNX˜}ùý7ñ èHõxÈEµ,–Adg„0¾0zNâEä_œ…rnLTkTŸƒè®�°ûÇÓÃ0´Z êL"øD´!¡�)‡=HSŽïªä xB& |I…ò&ì±j<ùˆÁof 0sr¾öMìÌÓ%ã)Ù“ ‚«”!úæT—v­´jÿ 'ÝÐgžÉºéÂagÐoy>§^£Ê˜q1vbÆ;§�pžµ^ ·â( !Þa@6Œœ}ó/qŽhׯÓÖMʈ4 ãÚ$­#㫳±¨TE^â¸Ò�cFõ˲=̧ *¥¬œlÃ_oì§ òÌêܰ†ï†‡ñ¨á€¤o«=œÌª , ”몽8‘FʱgÐËXlÇ`ªùær¼Ó-1€Ò\`F s¦Ú¥ë%Ìĵó–B½_|+ðþ; T°vbâ–?Ï©+¦áéGv7@Wé‚ßzFLÜÏ<¶�¯Ü·c,ß ù3µ®]Ñ=5Ä4=$(Ô Û8ö97æ¿ÿšµÐ`eã-4‰—!œ9}lµ‹áUDô,e¨×TX§ƒsúeò´w÷ËÅz5¡ÜrÐmF›ïŸ+GĈ¶«‡¡<@£ÜõF�ë›ðïö†Ót"¦:Ö¯u(ÀbÆ]ð˸c0ñ§èƒï²Ìù©á’úääºÅVmv,cA•"±5Ñ’¸&ò£VŽßÌœDź΂‚�Ü4ÄŒÇAyo§8íꤾte?R_BÒ,¼ —-³~x@2qÇ�ωom� rE|¶&R×-R¸Ú[í'~yö—[�àáN9ˆ;*BI×ÏØ�›” �R©m ,€£1ØùM]Œ$ˆjë�xL�øÛ%]Oòß×®ähjÉÊr]F:\‚¶ ²mv °êpãI§Y„þø~—´J‘mÏcñ¨¶%-ÌsS±ßNµçɵ«ƒ$úù“ ÒÚ¦?Ù޳�ëÖîÛ¾¸ý eš³XyºxãTòK;Â…ƒ‰§( ™‡[§wÚâ6ÃO{&Âæ“…ËÌ8 ûwË­~@¬.­ÅÍ MßÅ,Y˜¤Ñíä -81ÎP�iudðk.,6llÿU¨î'\°¤f‘÷†T*–}}wŠjkÏ×Wy¾ì „‚ŸÆa…ä¼väðWÄÖíq ¡Ìl’%µj7Û¸1®rçM8Uð¿Õ«V®óØs+·Ÿd¹=U]Æ ’*%©g“aÄ—| œûx©ÈüãMÜÇ,§¾l&; qv¶¹Ðˆ3käô£ixÔ…!ç…†‘ëºXV‘V™p¨j¤ÚMge„LOl,è¸å�ŸYMêHnErV Œ¬\ ¦Ñ“xzÐ]_˜7x‚÷48`ˆØDæÖƒä î¿¶k^’ã<óáòÛ:¯BÕœžý~°óAÙýË.Ø1¼�’ëÏ1bøÈÛíó ëOrîîG’ÛL& [Ñ’ìcJGÍ³×Æg?üÇËe¸Ý «ŽÕÞ„>° možK¼”½ÎtX✛%é–AåV‡A-±}a <¦V‘~ZÔ•üΣÖÑÝ6‰D·ABgÑÝegtœ÷+òÈèû+)ËFoSZ3Ÿñ™¹=#Ü7°·Â×G\ñç˜@Þ�ºßÄŸ®{�›2V#ÁÞʼdéô^jñ… †Êb0©µèÙáÏ›ÒeþÔ(“PdyÀJ4´:>°Êr%õ@Èb?1j²´a¦p 2†ÊÁ¯3§ùJ>„Ù‡#„àç:0(PE»0ÃÙÖ«$VöE=C :,ߣíàWjUapÎDo�‚FŸ^°‰F·Zµè)_p�’<Ü€ãõYÈY-ÃÆº5جв1@¼&¤ê#7‹\ì«^Rl–QÆ–ûçQ›FI›o‘"x¢MeTv¡ë+h<‚Ç…-ÇÖ–ÞSÒIcõ~’ȉ™äì²¾ßy…ÿÆÂ` «°Ù[y—àû%‹LIkî.Lï_2©7{¶M‰á3’,â{l�¹§¶œ†ýwRÇ�¡òûyg­µÓ‚S²p˜hÏÌÓÁ¬:¶±Œ½î[HpžÆ ~tU5ý×Á2HlÅ2«©ýPÄ`®Î×>gAè ãâi½3ÆBqHã´½—ô_R^Ø•LO�(–Z<ª�ï¹N'Ïnëë;•×÷‘~s �üçÑÆn­0Z·Æ·J$ÇÀJd@‰—ÊØq ¬µÄø<“´¾¾¿ðð�‘¹ #õ|Ñ!}¸0ù±e8Õ—ë&®y{wQñ5Þ{ úÞYnv®0 i^-rµ ôb2_•¨“E×ù.—–öíò²c«ÚvüÍõu‘áAºÃßXlÃÝ­…ï ±�5¬%‰åmæøÄJbH’2aGºŒ©_êlR¶÷µ³–†äM#cÛ]úéé­ÁžAý*an¸–Q]çÝ=G¦¢¡È ÕÆžwR~ ‘í'GSª,3ëT[m­!n0õ]3 “Ý69ƒÝ­Ó¡!ÑÝ®¢mf7äÝ£ EÜK§VY°={”>»Ñ�w6GÓÝ>ð,Ýfô Þ|Ä[�.¸(�¶í×.ß»¤»Nv×îïuøÀƒ4©ÌüDߖ⊦ÂȺ{�u6>›6€ÈfÉ«ýÇ>Ý`_!È}™‰$4Çr¬·àÚ~¼;ïïA‘ˆwaã‡/¿Ws[ƒ@îöÃq/&€c]&Û}õͽœÐ¹ñÃÄ5{£\¤la‡Çá1Ü/ŸíÞ|ç‹f¦ê,½nr1HI‰| ûU„µâ‘ü€»NéÇ?gÙ‚­¸GB«,ç$…ñžîñ¼5kÙ.ÄòlZ{ç&*÷¡à:Èä±ô×è}Uç%×B_Ù u�-ËÍ…­7FÉ$¢Xývo-q¯3Ëß r-ê¨A‰Ý—¼ñÓac¬¬ß#qâ†5¹øxÁ¡è†•Ž¢{r¡­|Sù õ°Ÿ$¥¬LŸG¶&sçùè¾3wP~š¬µÅs¦s(ÞÕDX+…ƒZÂ7pæeµfäÖ/m÷íZ¹ÏÍÊSUÔ#õn �?¾óØüGLE÷� ìÐÙmÛ<»1fà€;„µ|îåÈçØ%Ãc‹Nº+} ­½™J²�—Â#�™jå»Õnb1œŒ<ç.Ó¬¶)…ÆÊÿa�ôŽL òÑþb®ÎvÓñ:aØ$»Ìë¶! ÄçXÂ)£ â;´|h¢Ø'd'†;jùv/‹Ÿž8Ú]`Ö°5›5aB¯?3ºâß9~d ‘Tßôz­¯IÝc»«ÍƒxP]1>*§Z,„–fniå±Þì<&{Ò¦Ø(ofQŒ%  ß&øPÍªÕÆ©‰âë«Ëf ,²•£ÂÇ®ýzÅ-²Ø¦cÏ—C3�kæÏ�8Chë~æ(Fè¦bœß¯ÅÃàïjåôÖÆyu¨q `~Ë­²ú�“Îú”ž“žš1¤×.åÚ6gŒ4âù¢Ð­Ž¢¨uVCNºfl¨=É^*îo�‹Pc÷ÎM–ßï<¶ÈoòVá¹Çøx›5�ÈsmŠ^¾šZó ¹ªÁéºÖFqùT‘m´Çë½Þ³€©´‘mò¯’|j»+Œ^ØÃ›Ø� ¢Ó,ìb€£:¼R�ªB{¨5Že/wMŸ.Á"Ò'œ:` ›½“k—–¹ j‰5Vnb56úãÇzÆÏ22 r‰É…ü“@1}s“eàÁQî­’”&eÌ¥[×§¸d<'‰ ¤Û\š X`*�6æÁ%4Э»^»u¡ÆúˆsÖº¡í8Ð1ÊNcfÃë'»àÚ¦žbòÜ$×ô7yÐÎÉÂJì ¼÷N¨ò¼ãªën^Û¹lHϤƒåÉ�N< ÉILŠ„&ƾ9P¹z/¦—îLÁY !ݰ ­/iKkÚËúçV¾\* L®…ŽÚÓ(K`¼¾mŠ®û vÛèw×…:UL¯<¯ÆÖp-áéñOÛÆõœ8Æ€cs£P]mTzIÈ|c˨¹îKmŠUžŸUÖ,Ê){µ°HVòz¤Æjø·îfÛq9ʸ&.˜Ó�ÀÑ[,l·Ú”Þn´8«+=ý’~²EGìn‹Dç‹] †4r ltE‘ã¤ÂdÅ@ØÌÉõ7²'vÍó��Y°˜K­#ÎLDö=lj¢[æ ½­ØÓx—¾¦î÷Œ–&Ö¬[Z`Wéc¶B‰¤ 2…IéÍÎof %�‹ Éuº)d¾,ÑöÛG³(ذÅÒ¼™¨È`Ñ3fÙ=[—°bàÁô½¼)¤’�£4Í.7áÉÊqˆùcÖ�ßH`Xùf΢f™=;÷bÄœ»¸j¹ß“š'»àD¹•¶ëœÕ»¿_¥¥Ê‡=¹I}Öœ°}]àÅ>er¯ —Gn½„ pål©F�ð8Bå*1¬"+pvØ:`ä¶Ê•OEh­B.´�v‚ŒKŽƒ1ˆ&5w=lcÖïwÀÖ$\#ÄYhÑÒ42Ü>»NÞÁ"ø´@ó°�wvÏUÑ{ÕwÍø™—r¨h} ?�Ú ç&‰(¹áˆ¦G}­¥Ò\f Å*êóªå€ò3ëñl<ì™ÍPbŒl«§‹6Ý…ƒ^F -°uórS³,·Øß „—²ÌÅØÄh$â`Gµ'ζqµN*¹Æ#‚;»ÊÕ1¤ˆ]uÓVx‘ûjÓ³¿ï´SDWÐ@�;5×¾† g·èÙ†|ö§Gì-á©™û�½Z^ c–C!iÔ8G< amã!gÀ¾1fG”ÈÒe�Q}&¬qdK¡Ž³ŽhòÍØ‰ã¾ê7rìËá÷ð«iøÅš.oi{Jqd»Õ³ lMÌgkYxЋh ÒœP”‡5‡M‚Ô*� ÏWf­Õšï{¨ QÉéˆ%�5¸b—N-óÛ„~5‹O1MpR–l®noÛ’áÉpÚ—°…^ äoG€K :ãUùª²§›Îx’4¨væ�§dÇj¶LB­ÕÈAo“`"5RI%ÐàG%Æ¥ `�…I≖ە1ã!½¥ŒAí©6ÖxM¹¤�µý¼<K�`;&mq mkHÊè)ùkÆ#I‚ ½„ü6NŒ¶|â©m5r^B<‹˜­�à->�*pôlîÌKto#XLS-Ü�(nºÈë¢ùŠ·VAÇÆÕ¦£…C­³åº”º½™ ÉæÁø t D�Öþo«Êy|~ÆÛC^n©@DD,/¯sj×À\Á �qŒÆ!t¬|ssŒöP'•€èæob4#† €Sb±£¸„á˜q':e~÷õï•óXzçΚw½âˆ€ "¶§Æ䃖˜pbf-o²H¼™¬K¨OY3ݦº… à¡|‘öžÙ_Fõ go;„�ëð¢HN�t½Ap79Œ\^‘›tLžJå¡.-Ù"MÍïÁ~™Ls@ÄAC˜¬ê/R¼=äv‡‚j×¹œ¸eÑo�”¸ à 5=¸‡H¦æáf¥Ñ‹x«ŽÈECgË�^“°@¹fë{®gך}™ÇFÓßJ|\’ûZzç®Ýá÷�6WÆÃ&0�è€Qódç¤Þ ˜Ø¢²ÖË�Q†  Á8!AìÜÝN+�ù�[läèé÷Åa!—;Õ#™&†ÁÐH>0Éo–1êÊ¢€°©!Þ¯In÷å=xíÌ9´ä?|!i¥§Ðú ÈÊÙßB¤&>O´Ú-c\ù£mhÊ "×C\ÕšùÃ1;Ð_È\kä*Á×ß[^å1û 2¡€®Ø/©)î<Åì@AöùIˆÈʽ«ìžg¬,ý6vó“ÙÁ@l<ó %§îo[†Ò¸Üv§Þ[² ÂûM碖)tEÑäÆ+ ¹ø4~Äž„ÇE(›j[…¶«cGLþ×q“VB*.Qžj”ö<ŒGO4¡6²”ã ª·hF[†d±GYõ‘Õô=ß½Rs؈JÛ²âkí¡½‰>5 ‡UÈ^{²¾7:¬MÜKO·Ž>Ý)vÃWŽü«¿8lô{ïCVAêÄ6Oêbƒ›R\Ê®yƒ\o¹À΂U“¸®Â× ì\øI‚ÿ¶²ñ‡²Mà³ Ïb&ž ÔEõ¤‚b‰YгÙûk¨áÊî§%0L_­BG”k(eæ*¢Ó?„ùÈÓÎ�íÔ# ‘€é`Ž×�õuæÏÙpùü©äó‡É7ÏŽ÷ÙAyßÇ„-:|Á?Fw@ç`@’Ÿí­²§«p¶}Mô[D¹£idåo¼ÚÛ`HZŸ Fˆ_ïqÅðB÷ê�òâeö‘‚ªØ«ÅÐo‹w­~Ú˜™%@ópøq61ÎרAó¼‰9> ˆp~™Eùûš™k½Á®éÁ«^vfÞ¶‘�^ðk!^:ˆ�¾B�S ¡z ÐÈ™ûîwgÖÁ´¾³…ƒ×Å�²ÙO²_‹`ŸDOZ~ìÆÏ:¨'ë¸üå!Y˜üF°†»‚¥|ÒüÁ¦�OÁ«ó|Í£ >±×Žp~M³žX…)¬—bÇWw�¶ƒ‡&û_)·5˜¶¹·¾º�VfÏ, 2¬h~nÌ-º÷i¸Þw•¸eÞˆ»‘3¿šº½(É­#9ݨr–£…ºû�ýÌÂLå@ã� ŒH„¾,&ïŽÓùŠáìud”P‡sºæ¯ÛôÕÈFþTrPèÒï^f�׆½ãìeÚéDBÉl bJàˆ\vó§½d döDõ]哯Û\+ÚÄÎùUA½Ðï‘L>·‹=¬�f™bmR…/;Žbx5˜Žw#pøÛ¾ Þ~’‹d#;ö–ô;‚úù¹î3büúÖ¶aœýÙÂÙô¯×²p ÖêäH—7wœ9ŠR¹Ù�‘^áF`6Ý厀ƒ6­^­QH)dY@»�6»šàT:çÛ”ÈjEù†_p¹u2ºcnÖ0ÄG2úÕ½»x þ»þwmµ pAnôŸîÍ—ÞŠ ”HóÚ•ˆß/|ûÜìÀˆ56øxïÑ9·Oiãî±iî~e—ªƒ6Vu8uûÊä¾rçž¼Ö¸ô&Ùû5ù'°ùDZš@ZuñèJÁŒÚÒ ëÈ%î=}˜nnx`àÃVQ“¶eDðöÄŽ<&�”nÏ;}i:›;º÷a}àú[ö¯[¡o£rsÍx]âX5¿ˆ¤þweˆÆß äq%‚*|ÁHû,º™ñÍk¬ï~æ!ÃGËP�牃±þŸmöï!šÀ™Žž˜z{8#L­�ጬ „dhNB¬Gc#pùÞ„[,AVmʶ¬Ç€Ó¦3æ£ SŒå©">òוî±Ù³‡op;+1 p8ü¾ ¿€®pŒÃ÷ÞRœîQC÷xž^fºóÌm~ˆ¨PüIkZI~‘1bǽœ#_.|Â\‡i_E€=Ü"$Ó7ª²7˜¸©Îl í[ÕmKK”Ђä68³MM ŸJÎmåB¯B‘)�ô°z‰° ÜÏ—M^�§!:�u±“ 4ÅjW²¬;]˜Üªc wÝ(è,³ô´�E�/ÃÖéñ¶®#qãsç/² �[a1»Ç»®âë°C·¤j=TWø« Ÿ_‡½"¬Aü÷ͽg�rúúû_…êŒ�ñ¦� \XNÎB.=åÖq±Ay =V»këŠçã¦ÜµÔ›‹ìæ²—�lXRíQϘ6[v¯d8€j¬Wngukm}Ä�ÉsÕ~Õ�Õ›¶o(µzr‘"¿‡˜>ò¤@ˆšßìå¼î㣟Áµ¯/ªhL^8Ì´m“ÖŽmƒS­e+ãñõ”íbáG¤B)ì†ÆÿÛgó ÂÞw4ûð\ì@€§­[ï;éà§•¸1Ü[ÍtUh46·úaQÀe‘X¤?)°ó°ºŸ×Äñsñ#à°_ä­òýïIû¿cš‚þNž¦ô©‰š×Gû΀§¦Ö=4¯¤Î�´ç±‚~ØõP3Åy³í0ãᵋC�6î‘î¢á³NÊ,%Ù¾HªíZØ Œépª·Lç·d²�Pˆ,eÒ­Šc­{x}fÎJ1Wh”�¨’”+ ¨w€ët$;ÎÄZ1`¨¦/<Ç }IÛ{‹°çñùíæÇšq΂ÆkL½ßoì‚ Z½6ÎBð zpA‹k³bf¶<í�¼úx\ø.¬3¢¥Íóª¬?Ž›ègô×ïœ ¬¶Â[L»m¬�bT9JûUVÐ$!¶¸\S·Ö·‡²½X,ë˜> bøJ”ÞŸm-LŒgÕk8È>$ÌXÙÛw†Ã±À•לÚs“c÷º0¶A ¾Û^p¤PÀzÙÎù¶^ê~žYÎQ×Z*OV®hÑS•\ZƸ„fo¹ùþܲ"á²�<+þ¯9ÀþÌv¦µ@s;ÝöXҤ缽£rËÛÕ­¶�uÃòØç1jq áÎ Pz2j3ËàzºêÉ[u£n“æáw\-–¾Ëëˤ.Ì„z&Î-õé´Ú÷+·pûfÂ-XoéM8OY‹dÉØS·2˜�²ÐÓ`TÒÚ±çU(4aƒm‘8&Qx* �ÝÄ#Ú[åÚnŽ9_³’3¬ï›§Ÿ,¦r$/ä…$<÷¤` Å«æÊQ=|ÝÇ�ÆãÙÈsLÑ��ÀJ'?½Â$¨$Ú|ƒó;Ùi{²ƒæp«lVãss1å——s}óZŒ—7¯Ò’ š§ñì`ÌaYt»ô wF³Yéç~ûÁ¦êª‚âò÷Mö:yÒjTdž›ò'iÂúUwšü®åÄ8(ŸëUþ.Ä;ÙÌù�ƒc‡g]tap!v‹ü7E[æK3¾þÀ¶U_ØÀe!@be>OÒ)•S÷Œ`r[éjÎ=N¶¡ý\\8�‘\MC¨»�ˆ*X$«‰ ™_bØõû¯v±Üé 99™8æèXÇâªß~%æX”¶›“cÛ‡ÇR% ÃðL�>Îv¸ °ƒ¤\}{2²G£µOnõÂ4ò6v9º†Ô°!~ö[–½& §¼Ò¤äûmæÌî gÕè¬"¡ªe…î£ lCX“÷3#÷zÒ'}ÄC^ÓÏ6c:«„g›ÖÓõuydÂ`Ûf ”­æpU^8#Ù­A ‚Õˆ/~ì–ÁBÉŸ˜:™”àVK¥Ëó쮓b1œzt¥sÅ›`Gn'k½Ÿ½Ä\=Í%å;9€”Fåùg´_»Ç°P˜ÛžQ•~×Ð@’gðf—+%�«€×Ùŵ6‰–jâf|øãÝׂsça»LÎWGæRzÌ”Rñù¬TØì½–ª® `ব´õlSD � ¹ô O e|aëÄÆÒ®ÊÇ×Tð€ä{f®u8«S>îŸf‚‡Y`°²«LiB4ØÍõhPÚ¨"ìãyÚŸ·�°Ä/ Úzh|0VðÓY2 p6:Çž÷¿Êm±¢"NÆëQep≰,o溺lÿ7³�(Î)p ÀmìpŒï<ÛÐüÉ{ñƒ8«)Ýø©ô‰„ÝùÄ…k=lùÍ#‰’]¦%ÖÀ˜jK1¡…tŽ ñ\Iúï¼ê0‰×C£u¾Z­¡°g¼u§æËÁgÔ\hU!Ÿð�ŸÝóÕ|Œä'ˆÝ¨Þ�Ç5N˧lù±»°áS6 YG#)oÁ9#q»�¿X’ü9®îS<ú‚·‰"ÎmËcÆËkNß鯊Ô.=Œ2™|�Ò¾ 7@|(Ì’§³TVŠC÷íb®¥‹‡ÖŸ…& Okhå8€Þ½ïÑù'ºÞ'°™­{r h@�’é…¦´x³t™K ¨5ÆÖ>gëÚKe /šg¨}>QYi (lÉ·jÜk'9á®lsgNˆ�£ê³¹(«¸7|‰7+:Ž<•š‘œÒ'ãp,²Ž•§}k{¨Äj¾.þ_Ú|øv¡M–.C�áDhg¡7 E‚3µî¬³”bRú�\I• µkZÿ[1Mù4 uö¤o�“Jodz*Šø¢Ñ8=Í9'·—ƈŒè"ÄrìÖ(¨¿Öâ«´· H Ï=PÜöÈUgž °E.Þ͸2-~xm9/ê¹/' _f =ƒ�ãm“fá�YØ@ôxWí>XÎü+­BhÃß#kFzú˜:!y;0ŸÆ²OŸã”o«oB †šß·‚Â_]¬9o–p�δÒ+T6ÖͲ„ϹlØz›>Ñëyç&5Ö´³|ï٠ʈ…¯$ëJrrã°U¨xÚÀÚðîºò6Gwv,?kk:I’4f]]�$JÞsp,V ”ñå°Ò$Ö™{c¡Gi‘ƒ`¿íFQ°ÿ®› ª …„P�ÒD‚u\ñtsjÇVâ÷W;Iø”ó¢4g•¨Ã²†dþ›Ub§Êü‰šã?Å#ªß3m]Õ:[5Ö~^YÜ€±ô|»Y@\„«éhȧ³�eßÁk|»7Cpõ�¸_Ç 9ç¹ÅEswåäYÃ!¨‚ |$&Ûæ²–÷4|SÉã>wLpƒ¾s͵é|=i§8»)ˆð CWvËP^s•±ƒF)®åØç9Œ—9E!Z$žCÊW/ï&…I¬�alž‡— ˈ.m¨Sh“.¿ƒRwÊ{&Ê}dÃøWȮ߫óŸ$ŠïíŽë8>¼Å„˃½]˜^{¡gòF�õ«[˜#}MÀÂ[« Úœ_«§�Ï+w~³è÷!ª«„—YÃ{+¼£^žo™´&„‹ó˜e\¬:/9h°§ ú7¢n w¦——kÑðþLT7"D8´Ã{€™.m½Hhf^Ïjéj¦¾À ƒ…fUÛjw§Ã‡w=ïC!¼n†<ºñ~¡½Fýe¨L\NÅÔÀŽx­ù :áK^xîÕËs “Ý6¹ÚÊÀ4<´ì;›]2áªüÛ¾EÈ\*�7Mz7æ˜#AïÆEz�¼·øTìé“(Wêî‰ÃšŒõ°ú#)€åÙ¤Is|-×XÒvÑ  ½!éZ©Q†l(9Ôû›Þsl[n,YÊñÚÎ`�,‹2©»0©NVeã ÀŽeºî1wÔ<¹û ʽëNZæ;Íg7F­#$âf„XkvGÈ p ‡Ã¹.G[ãC†õ?'k{ie¬²WŽÀ1`éés¾ St¹3ÛÀôéÉEp«Òe4»ƒ]<ÀTb¿P—l•€Å¥rG±.ÈÌ4.·(`á§jT*$�>¹¦P`5Å#þœ� Úõ$NŠmYiH^¶é±åŒ@O��«…1c0hvº„:Ä0–™BÖ(\/™khè7{ˆï!Ýå©Z0¨�ÔPRmu!è´x…S±œTTƒ¸ ¼–;†-[M탬cž´¥í¦1 V;tD°!Z�}ß{x hN1¦·&Ö÷¸É(Iëè63h5äkÖzb(=§4X³%›ò«é õ%Û�Š^r51CÌžG<¶W½:�°98�LÆl-@¶<±ƒ–l§³í­õî,j˃{ãqk,eÕÙ‡Ô“ÂÁ¼c3N ¶KáøÂA^wéÝ*nü(]ð4S3mëWn´™áøÙ•µ¢J+`¯©Ã%§€gén�#Zý÷ˆ(`pz0¡è†;å’Á™khú£ÊÆ û¶0ŒÀäu¤³�È!íqE /Â\ÆA'Lí]ƒ­~Œë+ç< f㌭øûâÂa� ʽ¥7DLç|å~¶U–Ç5,³- —"¼[én]ú9 àL¬ \%ìÀ¢06[÷ºs½ ¿)Il”Š`ØGºèB}�9w‰¶io�3Ö«—/nêç<äsiêGÐí}tÖƒǨAßElJyUñžWÕ¶ó42 Ž<DoÒw 8¶ç¤;á¹¶;GJùQbpÊj1*Yã#j<-öŠqÙ}ô/C?*z?ws�Kš ð.ãÀìÔŠÐâf&Ê`ö?O¥n¹¸Ûç¼PIJmJöµõëâç¾evÔm#›D'"°næ÷µÜ+ZÓÎ*“²9=¾O‹DˤŽm9ö2õ»b;»ñPc ±+^õªv®\´º)!@f›SXkd‚uŠ,a�·˜æôéQöuÄ#Ø–R 4Lù3’|"Ñ‘Ÿæ¼ªnõ¥aD¶ÌM˜íq�PºµÊ—¿Û÷VÝÉE% ´2á—< ëå¼eŽ^ãW'ú]AÉÃî”b�Íý”µ¸a7NKw3”Ÿ;˜f§1ª&,�JØÕ‚á#fûèÕåVðº³Ë­´Æ´ª·×Jh-Ó´$�Œ õƒò¬Èˆ�{‰»Qv{ß+]ePxë ÂSâ¶Š› jfÆ"²ŠËÎ÷v0·6mÍ’úW~1yܽ®lz#`¾_6=Ü ‰`4+•F}IáèI¶_ =e¼€/4ygá#�`=ÊÒ ˆ]5NY·c ¨8}[Êi«[ÎÙ–kµO©iyƒŒ¿CÅèìþüªhl®�)Ð}­¼Xîß4Xªd³¨Xq�Ð�½šfpisœìO]éZÞ=ŠýŽ^kÅÖßùw P œ 1°ŒGÀ¡1Daå%\ù>홵ôP0u€|œ Q÷ŠçÎÙ9¢W$ “¹f>.ŽÑ¢”,7�3š^6b‡E‚àefÄ"äì@ñ˱þ¾Z öU;º.ó-|ñÆ ôF#=šVÁgûâíué3n; 09¶ÈĨŠòá6ÏW ä²k|� N 4 ä/õv�´°ÈdYÆö{¶�³´ýá¿ëì “Pqž÷k«Æüú/ì#ž›“K`á�pÆ 9/‹—á—`²7`}έ¢Ç4â›èz‚Öß—oÚH£�Áì ÐÅð>‰—!îå´ÊðÏ9Äœø'Á£]ñn*ðç� è;è4ýfC�Ð¥–=†‘¨„AÆòë¹å6n½ídPQ›!AÊ ÍlòµÄ·�âˆò5!ò©UfΡ+íStΜ­ŽëËŸH.xÄ;mŸ?iX…HÈ:·†žRÓ–åQÜÌ>Å’Ò!ÑAðPmÈbÅò/ ¬= huÂìcÏ7*[Æ#lW ~~R¯F×”ëžLsWŽVÎÙ¾qû:>ÙšÒÄj”a©¸"X̧!ô9ørÉ—Ù]‡€è¦üÝRÔÆ·®3rkà>I�D:€í¢èÊÙæµ´k°[z¼šM€eK»F I @ Œ0¼bqx kÍx-÷°opÁw¿!±\[<ì�Åú=½mÂÍFˆ5R!–†×ÈÜåÑt÷�a&!óÑ©å^ÕZ'˜µ¶øÎ¶™nÙ˜>uÆu֧Ž«ÅZng°2"g� ½Œì\[NÖ"èPò’�n:µdç[ Àçå8R0#°³\·ßgì_±÷bœÕõ¦—.òÕ”Ä?ÓFBÙM«­ÄÖö›neyó¥cQ·ÉÃŒÃ-žÇ™$tMA…ËQRB0;F³„ö‰/t7¬Ký„Ût%»›k$_˜;3Ê¢Ê)P«³0\M61 Ù?ÖÒéx;jiÁ#"×õE«ÉÞs_-¯Þî Åš]ÃÈ-XÓpðô^L‹šg’ZÆOhó§ØL·{b8ó5 þW/ŽÃ÷³´®~Q^€ý8Úzç*~¯•«C¶Žy@þÞ»÷ˆ­Àz `çÑiÁéËOh­õ{|ÚeÊÌ�p^z_RÜÀ’wt(ày“mÕ¨ïc&~’'-Ow iÔBœÎÓtzÊ.äÊP�+F!ˆÅ#™ mx/§T‚Àî… ‡Ák|® pÝ kB¡Ùçž'õlկ꿹̨ûBéѳ²É62ZÛDŠ�¼“Ž0aª…K2§¼>÷Û¯ÖS¯{@fÑ‚ùÌu5s?'Ë�Ðz”Û MY´Ÿ _,bÒ½ÓÔgí]Ÿé 5Çë5{�û,…_O–89 ý]ÖóÉWô”ÑæÖmiuÙ†n˜¦MTVøï»Ó¡~Yw}‡<™hLó-÷1}”jÊU¼âæÏC]zÀ°}4'~‡Âe§ËQYð£âqy•�ÍìƒÚïÓ´ûÍWîÊBî$1ȽÞ~Šûòcìß?G]2ï¤ÝóC(ó˜Âˆa�£åc"ã)~r¶­t³0Џɺ*ëfÊìWu§P ƒE\œV¥IOáaïm›ÙÒ‰’øÎÆX=­r ¤¸Å¶ÑX!�ÆèHíå( �ñI5À²�çU`jqœ‰Ý– Ä–1¤žfªÆ€ªaNù¤¹ißÎ>ž\šKÄ<C¨Û9ú ¿56à5�E¸}J.®Áõþr$vÁñº9ž¾¤asd&Þjí¢Øçâ ‡KLêܬ>,79È8Q*æ “2Ö|Qð¸”1ûöpËpu´§Ø9}®½*ãwmˆ]ïL|²ãÂèt ]ç­A²bçîïãÕúÔ;Ý`/ Ä>±‡u†Ü0&ÖÀaú<ÓVØß-ž±e¬ õýÖ^ 6O%®Ví¼?>lí÷bÚ*¿?C¹sAxç�IŸœÀäâö|¸NXϿʛ²À*¦>1»óF9³5ù' ô—ÍBÒv+'P0Ù«–Âþ�·aXÎû¥�ë)�¦%–ÉŸ(Ö¹™uäø÷;nsøûD[ܬñ{ké+.îÓòúBP/@[&^g$ �@«€Aú129It1?­ÍØî™ǎÀR_ßHUoj!ZFÔRÒC|©ð¾Ý7„’ÍXpQ¯`½ös§ß£¥Óußz`¼ìϾŽNáß‘òÆcºX—N[ލËõºOœûm|Ý·<=¨ßþ÷àýÈU/7ů¯â^N~£ºžZÚÝÙd“äÀ®�ш oéÃʯÎ$•¸Ý€Ã¥xú§ÞÃó¥MmÂG¬›¼6Êá¦Òü½��»åðÅ�«c:¢¾zv…|[ÕëðXRù†xÉ€ÜF¤¿mŒÉ•ukÖýG\okI…««6ˆn½|Íöó¹ˆ ^Í º…q^ÞêŠC£&¿àÁåÛð‰ê¬ &µÕÐ#Ês ]ÊnK9$”Vr<„oV°áÚÒso|rÁEÑPwèUÅY&ÛhN¾@%'0n�|€öhF–þæâ÷¦ÍÛÚå§ÄþVªðm¼ò7\rapD_,è¦wMG×­J‰†N´~¡ßNƒ–-˜KY­ô¤Þ4'¸CuKÝU˜lW7Ù<_1¸ÝÐÔe¾Y©×¢T9�c(ÜR´Öz0Ïè5Nw õÜ!E‘“„G%¯Bê³æ×x&‰â vU([®ÑÅݸš:+ñ*\÷nµá_Åw|╞Ûé„ó\±™x®Óèp͇,(mÕ'ü¼/SÌö�¹½ÒóÐde«.ôÀv FªpÄxrx_^-\7¨û‡�…vÅíÛâ'^ØWò�бå:F±¡_&«vÃ89mòÉÔVI±Aê |]c:yDµi»TIlãÝêõA[P,Ï‹|ƒfù–µT"DFÛ7˜äó;,V$uôÊV¡®#k¨ŽÁõøÂÜ ˜¦_d'*Îî†:¸¢¿I/Ù‰ŽU›¯Ãk»‰jŸ_­3ûï5£Ñ­ÎÜ€¿m{@ÀѾ01dØ*Åj†M¢‹Ô'8Ýa ¼AžÞ#M‡ˆ·¸–“Û$�ƒW7d ›­Í·!.[{Dp.¬2Ũć$ >·ú­XçSÍ–ˆw(çÖ®`>‹�zÕöù÷`Ó$F¨q—‹™Y¯¬õæïw½Yœ&»®ŠÈlÔfIq ö’t)ä;�áÁ8yeÒH?”4ÏÌu•Xo¶9Ñ+^üõ£`!Á¸sRüÎsr-�!­#òÓˆö@¹u6Œƒh YÄo’<µ³’¾f]_É>~Ð3’�îD>shî!™žýFHÆï;l%�È£7ݲù?¶\_+¨®‰Bá­o$ ÒE…¸%”ÔôçIŠ{Þú¿Ý]Sg5²Tóp¬¸™Þ2Ä!Q&A­ëÏC!æøÍÁ€=Qî ºKc�Z6Ä¥‡�•÷ÈW€ö2ˆsÞæ±~/98׸XÓô ‹�®FtZ¥'Ìz\¬egË+¶(¾�[S ˆ�'�ó«bÇæwšŒÁƒ]³éëÔBÉç5s_ëÌ‘tµ¦x™€Ózú$/‡�ZÓ�–� Ww±Iåò6e c!´ñu+Ãâ¿Zñu€b(×¹g‹ª‡|d9h­3@…î£ `+Ààjšá߈ <ØÑR*Ï>xe�ðg’à’÷[?HwߺÛKè3HàK,ÖÑ�»[&0| ÌÝQÉ]7A?kZÝä"-Xh•>À7\@ŒwDËÓß{äç-z4+‰b\Ø0Öº(8“¸#£ÐVC=Ý&�̸²K¶Ê  Ö¤õ¼•§¶âÛZœïðgŸ!ýæ pm¤@N^f‹–½µGÙ©ÞÎSÅ­®¬Òëœr+F�$ýX×X=ÙÆÖÿRñç�ÖØ( +ZßmÌ?ºÇ;ö¾ç¬3¸2‡ò£!p2³Êø JËÕ=õp¯ëy»�5"‹±ý�<½t})¼îÑ^G\ÖŠþ|»î3…áÞ!B6àèü<Üü?»ñmî–Öš“Û`þʤî×�ýÝôÕ£¥&Œ{°/ÌNØLL9…ï¶Ý�ˆBË.÷ÜâghÁƒ¢ hÜQ×;€²H›" áã˜eŸëoˆgæ«�‘—¦jÌ4¤:ÉZ&à:Õ¢¬?«á,jý.1Sß´à®°%ÛØã+�’v[ÄÐø(}íX`!F¦–µd}Ð#Þ qóÆ´ ·ðæþ¼Šéæu@zìÞ ÷ýF�ƨ0x÷“æfU�|¿ƒÌÒ²¡9x8ç2 qjùØå Y°kp¹%‡}ëc?±XÒ04›×7ó0ó‚„lµë§ÖYéý{x@ÃËvœCÒQöÀŽêSøŸUlgð•¼Ü@;ÎéûÇ�ih”+n7,¶ßÌ/'\Žr `ñ¶óÅôäÇÈë`#`ÄðîÛ’€ðj�ÅîâJïr” œJÆÆ ŒüB•²ßô³î¥?E-›U��vÛÞð·¶fâÈq w)ô¼Ð�Bu{ÐS‚Œ<–ê5¯í^6­¢ó,]&â@7 ¼æøQ&TñÏ1®^h=Œü$7{:wNåv›€!ü.×ÅoZ£l°4·7î‹ú˜vdXMíP¼’ùŽY@Jcƒšâ8ж:¡·¤ª¤F’üÍöiiÒîR"Ù�æÓÁæH&žë* +ļXÏßrÞ«D9d;˜“>� ç”eJGúæQà ½`ûÔrìÜÕƒÒM�³Q¹ É+bh£Ø¶P#床ßsl"4ØÊý—òȆì*R´%àéÎ(r¡p' &°Í0g¼v”ŽbZB>OÏp:½¶ à—è,üVQçŸÙÊvÇ?‘‡Jº0©�†ò»)ÅêùS NŸVF ‡!”oœt«Ú¹�XøD«¢Ð3¶‡˜/ÙˆË-}äUïÀ;ûGmNNJí 6Úç~×b*ß ËgèËU9î±Å|úu¿*•ëë|Cã AÊ/5©Ú€ØÚú¹EcÏÊAç]DìâŽ+bö5<µR4œ³Í«i-Îóìfû o“Z%ß÷É6"Ü÷¢ÄÖ;YntS£Lì“Ø‚¯�$ (âÍ ì*hËVÅÙÖ÷Ùòa-¦E Ÿµ¯=šær^õ¬�Ñ*еóU¨°hkQ$†k¨ëN²tö@Òékt±$¿¬ºìnUðËÅßßz¸L¾zÙ\¹�Ñ�h0�á­Ýò/3ègrüáÏ­´~Ë&ŒIt‰yºÁÝëQe71;Þóm4ÚÖQÍu¤ÊÄNVÝ}É‚ÝÙL˜-Ÿã ¥Jëãö/M½‡¾žFÔcC£÷>É k&ÔõA~vÁå ·£ eóCM&bùÅèì)2üY9Ô—êÃ’§5 LÞÃ+P…ì.[\$…ƒEZf�:j»](µ–Ärü�·“ŸZXûAÓ¿¸¼§ lu�ÓÚl¥ RãÚäH[:Fî˜ìŘ—µ'V°ýlµÅQïp°š5F v µ¤€’ظO>¼TYëÝ;‹ã +åAú1®ô-°LÍÌ%1AÐו?,ÛÂ}}©öcAñþ=òlH@˜€fOeˆöý“¨[ Øî:?£•Ã×ϱ Õ‚ÄnÓ€Õ²žíÖ[ˆÖ4,a‘á¦Ãù�#»ƒÞáHÿy‡†ë”̃Þùˆ€ä³S£~îÿbÍÊåˆ_ØóÃh <´û!&™ "�°uUÝ0°v7馺‹ž¾qÛÝ&ÏW·Wöa�oØ} Ž�ÚÆl!ÖE{ô¶”¡½Ð*5hù¼ñ1‘똕ç±ÝwøÃí¿êèñ¶T@"ª+m“ù…—ó�iñv§ (¹”ã–ží'##í®q›¤mУ î3ô+¥ö(hmóá䀓êw } `XC¤y3#œ˜¼ÅCÅO™�ÜfìÂÀ•l-Åð­`¤6ëhólB',q0F v=íOÉ-]‰_UÖ×»]¹q‚ºƒìk®\>áãº~X9Ô”„mÌøYÂëý–‘`Ûzü‰Ð+o þòhNÐè¦7Ñð¹ÄPLctØob<‡Ñ›pBa:WTê“»!À‡/ÌÈ)þ•òfú°¡Èï~(tõ¥+ÚJV�n/M=ò^U+6ØK0–·»°W—’˜lTY´\dm`~ÞCè™Ù¢€®&ùU_‘´D“÷/ƒ«â£¿”öýKP®ƒÝ´[£Š¬z�1»žËKhÖ0w~H/xغçJ妨÷hCÊc¼b¸ù8B+yŸìs?¯Xã@6üúA½ˆ;4¶5ö¦1j£$^—…”ßA;&Ü1‚ÖÙ× áánÎ4ð;mͼ«ÙB”{d9vÏ«‰–zÍ×·\Tà‡ÚÀ›ß`LŒbÝc¥¼®|½ú¹¾Ýr¼ôÑÔÐK{×�·Iƒ�™Uðaívâ 2w[,nÐdWÎ:ý%×Á�Fzmqâ·5࣮'馘,(\§Xkm^¨%¢/®oÚŸ",ùÃÁ�@äWt!6](2{`Î4»–€îÍ+HÌ—Á3ãí^/�ž7½¿xˆVŠÞb%2¹’!`˜CNÉ‚€W7&iÅÉ}ØW t™Í•§ "a¸Ë••DG+÷ØëîÛ[ž·tÿ ^×/2‚ï€è"÷Ô6Ÿ3i}¾ñouÔ÷@‡à£)D#î˨À+Ö¬²ÿkF‡�­° ·¨¬G íQºa EÞt ¨ñãC˜J«V­º”l+«È°6Š ›H:ÒÃNMÂÛØ:&E¬gu• J¤þü%¶Q!»F¨7°zµã8·®Jº±5à«ÉÙvKÓ6(Èk*á“]æÀRÛS†­Ñ©ë"wG”nbRj6ˆ³.ÑÅ3Ð�MŒ´ÈóÁÄQúø@à̆q†A™ÆPÈKvžòVsQÙâh+y;O%•¹¼ãÖ!/i,^Õf�ÀÎþöRÎ hµsLe„C—åw�XïsC÷¬8¶6D’s¦R›éØ­™y�È‘€Òd\‚©±öàB ‰ý[Æù¬’‚Û²ÓÜ^‘œ=;7]·ÃÚê4ZÒyH×Eyî&þ-Zî’º´tvŠð`æþû'<*ë7öÇ€— ê¶•ŽpÅÝÖñÉ‚Æüç2!nï¼f°GÛl†‡vÊ[0�Ì—ŽëÒ­Ë¢‚¢‘]>´‡²Â£°}ˆýÄMkl®mÖy[*EcjD:*}Ö4óŸ™_6ÝÄ�ƒ7t‹?ÀžÖ¨Û :{ã@2»„ëç?:éû¨ò…'”£4^M‚\“Ñy ÝQ5åUPÁ ûzp“âÃGŠCÖѪÛZÍzw‰<¥ù/ù?!/‹›=mÈPA# õNo;Ï8Î ù6¼Þn|õ =ÉË C¶ûâ�ÜYÈœB†õ!”…ýë›Ëã˜è ï_µ{®¾=Ëà[�99ÌÜ`—#£ O¨z¼}kî7ZÿßhpÖjPÐWå"÷|�REâ“è˜á¾5«|#¸·Éñ7 ¨ÒjÕ­ýsO¤4„ºK ßVdTUVØäˆÁ¿¬{%9"ïpaž†Ï7Ãy_=Ñt%Wn"w¢6áÐZ¥p=¾³dŒräuªÖ6Cá6 ) ª\a—\ˆYR¼©ÕLæNpY}Ýx°½¥³ªÚås–ŸD†?Ÿocµ%‡€±ÎUìR§ŒPÃ~Ì�?pöCkàr€R¤ÍÔ肾“�1o ¥¹Q Ü�ŠN²QˆÐE®ôDzªA3€¶ÎÖ„Õ ÷�‘ãáˆõÉ6#Ï‚º°fÂKH”xxz�÷‚‚·]ˆÆó:KØo›Zl‚[=~YŠŽ(nc®J”.¤¦âÌÈZ�$gpÅIÄtËxÇ”A~C\zŸÞÞ ™yÙ…8]ŒÌ�è€ÖzB‡aÆì› ÀÀ_*±×zy©T¾€£3�€™8FµËSìïBOšñ sÎÑÁ›#ø×Q@#Žg“¤¾¸£ÖÝÄàJ;p#ð««2e³R;çŒä6éLÃÚ½Ãé%�Só¨�@uX×0 -œ×®=²Ò>6ÆãqÞÐö1­ŦrÐ|s2‹«8ó.|n¡ª�ÖT&Žqp)ë'Öèa'x«a FûúMÅ\;€æÄ5˜dP Étxê3"²79›^î>ÆÕxÔgç[¡›¦y×}[‚¾_†vPúcçº^òÁÉÀ)<&ÂC }¦�¦¼|UGžw"›×_ˆ¸FbÀœe¸n™RI6°²ÖÒž�TÓøñRpßJ¯Â¤ûÇÎà¹#no6ù�jç}Ø“Ð"OÎEatÜ»m<äqÜ¥_[i°“¾0®”õQ¯~¶�ÎP½{¤.¤R+°d%ŽÐê°¢àZh©Qñ‹Ã©)2áa#"¶[vK¾�»š´‹CÆG¼Ùv ijrAkÆT�S§W°ýAPE¹‘Ûq†w’ÂØ8€Òª=è�N k ñâ° _gfÊ!¦Üý äWõx`:Au«xsß@«Ð�/Å’T)G-„Zc~G Wµë²ðnŒÑâjÁîËÞÁÎÖg!0%o1 p0¶ fϺ…JD葃૜)dˆµî�t�/Îî–³;ß q‡À€Ò·R`��0�S u+±ç]É ¤,-5 ¦¨%máßjwԠؤ;D)ÀÖã–è[ÉÁâ§2kÛ]  íkÝåça"c»Y"˜¡{sÆ"Ó2æÝ¡+ƒèOO…jìo· @ÏL¯Ìö÷ }°�ÄÏ—^LÚ�>)Ÿ×]8î6ä0—mw›àBÈ{–<¡KûÞ ûwnrãœûy_iNw¹Jí¦mwº´dôD ðç˜øK²õ\êÉd6øµAªäÕ¹viN8'‰ÁÒÕGK$²Þá­`˜†p°ÇZ(RÔ>²ÆbÅ,aRþ¿ˆâ’ÊdíJ»,^tð|:áíµ`•½Áw[D–gû¶¿­O}ûÕpaµ€ò|"UýÒ•ÀrçèÔ>í9›qÃÊB;®‘·{Õ†ß3Ìà H }bã&§‡Š8ëà��ÿ+òu©’I=Â?�Ô¯8`´Äš¿¶‚šß~ ±í„4Pw �Ü�_••]9f/Äǰñ��à¬CΙö(íyp|ÞmçNbõÍ››“SøBŒ¾ÝÛR/îÚzøÍö½+I|£M@N÷Ÿê D@&�µµ[;»¸¯Éþ„#~\‘÷°ÀAO^Sø©r—!Š‚×RꞘÏü}ÏÃüÊŒéY¼ÿÂöˆÿûù׎)†#ŽSâ%º¥.5‡�>ÿ­ÿ× Øn Ã…s^�?ù8®Âìl.´Ž¢‚# cø�õû¦9û).êÿ·€¸èí%ÑŠ�Ζ•-¼³Ú~<£ž°ËƒÇò´ýšàT6¢=LnÑb5U¡ù(W ½ïn'ÜÐÛ²¦ÑÎQ‰5‚¦oQ¦N o¡QkúärÖÓÌÄМ3pšµ¥›!@W)C£³, »teAp˜†EB �Õª±}ÀÇçÉ®Ž Ë)K(²~�Õ-»�xtÙ?:IÅ,Á|L§þÀÀüožÒ-çÊœ¢Àv½b…ý€åñX"Å}£}_‚Æ<Špô«¬äõR¹ÿ&ª6¡¤Ó|À¹b:ܾôÃZâ‰!ÈÇVØg¾kœ%E·BoÐ|ùêÂíŒÄü˜º{L.%„ès”ÖÃÓãm5ø[†Å@|mjÞ‡/°_ϱJœþmp&%gMºKÜBé6«M«¹-¡üÔØq ˆP•ÚªþµOñ}SE�àaˆì¥‡/Y{­X§û6í˜òKÈ·?´|æk¬Î +œÀ7*NŽ­ÝT#[$Èh^ª�ªÈ Å÷þ"ßn÷Ï5ÆëÄéµÎÂy!™¯|Ö4ŽÂ O„®]õðšBI#�÷ŸÝ áE&¨Õµ.Úu‹êÀ½š9+©j¿ªÚŸçEÞ¯Ðߎ?R½ç~‡?»�=Ý%j*¿ô×–'‘ª¯ëÍÜ6 ù bc8‹¸,Aƒ·ë³Ø~XùÀ*ð/Êø~&tuðÃæFNÎâñý.m9¼I6›úý³ð/-iÓQ½ò uX³�óiJ6/0Œú 2jº¡=�õ?¦.yª#X¿›+7}J!ìš%6º²=œŒ0ØdAK±h?�¬X 5ÿ¦œ½™>„´ÚÿÛ1ÿ`ÿ.???˜ëòƒÙÌŒ(ùùßsÓdÉu¦GðçÙN­ÿäoÆ$9´ ´R¬úiI¹‘|ì*§&§FÑ5‘ÀHâ‡k T)[ÞÓšûÎÿV�d¤?'åŸ {îl…¬ o$ã®ûÛ¤°L.bHUž�=…zÕð=;F(„i þÿK[Öf¶9¾üMŸ‹«iZÖ»tù™ºq%Ä_h°•6àd:0mÙVU�ݦ%BØZªN(ÛcŽÙᔂßË“§â'_§K6Õ� µ[wÐÈþîÿmãP zÿonè¡Ë(7§ýŒëÁæ«bÿú�D¡FHýWz�F£IlÏïãj¥wü«G.Ø,gJŒX^”2TöLíB#"�ˆ>èà,¨?Ì‚x W¾fÄ=ož ,_K�н(’Žh�åJÀµ¶¤ÇÐÏë0¨Çñ´6�löæ#%D…R…ƪÀ[£sH¡H,û½ï®_$�!Úí“Ñ“êùUGf¹œã¥Gðyå8¢˜@¼^Ùþïw�ˆë -'m+fS�YtŸ^0HnÑËýa![ÓFYÏh.<ñû�]³Cj ­æ<)•îz¡ÿ?ëeE9¨A­¦HNl_æÀà†Wý€îàÉ€Ýã_öV\q½ ÄݱÔìYffmí3®¸+³_X®šK{<øÌR\ƒY"ø[í¿ü§»¯ßxþýŸ…ßâ�9Xaj�c%_7ÖKµŽÑÕ9-Ùhñ+P,Éj’[Åeʲü×`µ‚¡÷ØÎ¶Òp œNÏA ‰D8® û-h {:ïõŸ7%lt+Ÿr¡àü›¿ÉÛ”"…´RM"³ë¾ô«LÏʼnûÿ‘¾wQkOJ$¦rD´^÷j )/¥&›®ŽÙ[ ’\nX±;ät‰�¢ë¼E¤¸Z-4«û¦¬Ë-B2–½Q•)Þ.Iç¡ÀŠQ“dAë­«=%/@³ÍúôP\8ŸÒsE€ :V_ݵ…ᩨZ‚�.û’wpýL»1°5hy .eë¤(ªÀ®%RÆ*{J …÷ŸíiŒ{šÝ©\r÷Pj~Ë�!÷ÃÒ bŸéÁ¾OA¦÷]&¯¸•[aܯyÂ4#ecMWdwD„À tïÒUŒ%+u·±çÄW\q8t„rHÚ©äÌ4m,øð¯jÙ*¯UÀ‡îÃ/{³ Ce¿æGâFù‹÷‹©p�w3Ë¿¬Ò I�Mú«ã`Û`ê…]F…B‹’¢ÍQ\–ó¤ <¨3 ÝQÚÕ%=Å„® Vͼ×ísÙµ›f^µA²ÿT!òÁª#ð‡·ïì•‚?2½3íuPøý›„*!ZâCŒ5îNÎŃ:mq²šý¨àÎec?•P� ¯É�£TÛ›PÝhq Já�Ö€ÊÉd »¡)³­�2Õ”×´ëSfåW Ίüscˬʾ÷wÅlQ,NJ¦¿b[�uaoÌh‘Áô0Û¤¨‰[ÖÍŠE—k#œI³†®Jugˆkë§öX�&¹>ûç·DÎ�‘�g‡‰·ŽÄè7‹g'#V=ä7,÷ç½~î“yáI‘SÃ9bTãÞRà8ô¯¢à¸mg·F,ˆv[‡FdÓ+Îp›öôn§GÛt•{Ô›Nùiµ¨7amßÍm在MÄ´hna}²K§*…¼Ô°[�Bž´&ä´u›pä7¬ÒñP+Ç…ã~Ä*"eè‰.a#[R¢Ç)Ù! Zö'›CwÚaLÎ4ŒKaÛU‹:Å� Qî·”¶éX„öж´Ü J=­p¹Î±¦ˆ9)Í¢ó!vþò‘¾ð広ջx=5–ÉÝãvŒµ8ËîM×ñüÿ_]ÖŠØó'9‚ê §‹±é�mL$œ|‹¥^¯‰Â“6‡däóD?¹mJ¾Þ3‚7¸ùK8Úµods|ÄjjÄj³BõZƒ7#‹@ÙnÖ„[û*Ý[Åj%´o·=Z”²8íì�Õ?° p"8LBq; Ìérö9ÄÏWP÷ç ½rn@ípÞ»ÙŸ°æ}­3¤@ˆÒ<Ô¯-å6½îbÞ¶Rö«î†´C)`äÖ `sjd˪pÍ£rõOxgÀGÊüTÇNý\ÑE„k! ÈŽí÷zô«ŠN¥ŸòÃZøás®Žü)»…âÓyà®Eu[Ôïëë‹Ï°ê&Ñùd” æ4ÔŽÊÂMÒèmDÈLY+AÉÕ‰ìym‚ÊP.m7#¾Ÿå %=Žm\hš4Š�LfXTOª=a»ýJT9ü~öå°À==úË”è‰ò/û·Ûv×2Ôç¿›unôð Oz§²Îs'´‹z6f‰<Î<QE‘œgj³�û8ìÏ!F‚\œlV¶oÜ®‚»•MývÛ2zác ô™øSf~T�Ä’&9º-³±N(”�ù§ê¹ØÈÔO}?‰¯¦ �}™¾Ý}„@¹gÜ»}W ÖÏÞbä�Ø.t ™Ù0(îù 3æï<½ˆ·Ðýt¾ •…ò{§äÓ^7ãŒ÷zõ¦w\¦Gºµ¨¨©² ^fEàyûšÝ��è<�FT:«rÚB¹ÊnFÝ ÐÜ"=ÅôéCͺ¸ÅñÎÞ:÷9``£;oÓöí’�.ÞCu©Aæ-.m´…ó)/êhüÜAs;°6lÜ:FÞyl‹<íx)^Ýã_6g—Çvª”ÉÍ ?¹æ,Ú”´ >NÄØ>ñY±úP*æ¶<ùcde¨)Ku†7t.Ú•w9è0±.jc=Œ)ßva]Ù“VgÑgdD ˜dB@k(’¤ýe‘Çæ>4vª@WÖpmúß]î—nóY�—‘ûík1ÙlÆïò4õõ ã{—­‡ËÍýs@S(éè“Ú�»e‘áï�TÁM"5>]X‰^Õ8Çcà�ñrÿÚàüÚf§g#£,•ÓéEŠõ«JÑâ·nâlxb•~4³ät á,¸�üT0±í Q]´ÈÄúÃO�§á4›Öi"6)n)5äiÏ£Øá?ðg=ÉÁ?º%4¾u¸*÷Vå+/N =Æ}q²\­FC—WB,àþhëÛ°Fƒo�!y-KÝ”^�°EP½¢)SQð¶„µbT/‡í2 îüº©¤ ަÊ0|a1²!Âz6)ÜEɨºïe»˜ÖÚàcÏ� 51,V·ã6„îña„‡b øÂz OpsW#!Û­²«[¹ëÞ/Òjî¿ÙÞ2¿¥Ò;÷›-#ég¤ú �Rš´Õ‰€ŸžbyÌ7pGn�º[��´7 Ï…Ù­¬6W¨ÕùØIý¢),ÕŒlÎ>«0Û‰UuIš4áÎõuŒlüp�Ù¿.¬ˆ|sk4Þë™ûKƒ×P£”Sš8 ·C¢ýÞœ¾`Ìêú�Vww_]f¯xþ})„ýÅpfø>é»wòé/î™ €uåñRÖåè<¯$¸Ýië`>}HZÄã Ãä ¬�vSZ俇T¼¿+í˜6[ÉQáqë¿]âøË]Q BÝåÿFC¸DÇ�:z5.ãZ…¾maÍÊ«_®F{h€dg˜ ­º*ïÁ¬Æ+%b$k§ ­p¿Øsf£ê0®ÏàÐXEÖ"Æ ¡/lÙýÕéjž-uy%/Ÿ•¡/s]-�¯Ó'_™ è"''SyÒö_¦s7Ç�˜ƒäYööæwi l&Â5“¾#ŒÉhP™¢”Ãç†R¯\¤LÿQ΂Á¨­`N© qã•£àÒNÇ Ñ¾º‰Vk¥Þã„ìêœE(‘KÓèm1z B›À‹(×xZ�»Ë©Óó?<ƒØ 瀀GöÃ#eòXïj—ñx\(¶F& ‹;�òÔ€JC™åùnvʶ7lÚä1Ç®~­ïbÑ©xÍ:”#c¸p¬»n‘ ĵ6.¦­K…¦†æò¹î e›b$ o¤væ¸÷Ý01`¼>E��� _k°ÕIE)À ô“AÁ>#WX&¾ÃÍh+îáP .þÅÏÅÃÚµtßa•öþ-¯I÷TwÙþ©Á¥/^MÎÖœ$îËòZé[G¾fÁƸk~êߚЙ©ò™w M˜Ü(¥�– ¬×ôa«ð âÈ.;Z¿¬ 4¤¢$2´×Y,ä \;#óõ|º™‡±¨$%›Ÿ]ÃÓcÚ‡Né(äí¦„ëÀͦø¹N;fŠ5¨·ŠÛн5�Rû0PißvpLþë Þ üˆn°äªõW¸ß–ÜYžÜaÞ¾Æ { °]AݯJ£wºg’¶áÚïÍ'¼—'.H*‘δËÊ”$K¬$X–·kš!wÚ[9ÍA8 *lŸ¿¡%�‹þ© jsÕþby­M¹– ¹ðêÛîÀÞ®èO8lp—2× ÃḚfÄÿÖ“#ïçÀ¸�ôh+dñ!’±ÅA*nZ³{½z é¥:�(Îú {ïn}}I¨ëpúA¹ � .ô’úDÆâÚ6@ÿ_ï¯Ñjò<ˆyoÄØÈŽhÍ6u¼•°ê+­0;xK%*_•Êk¦b™�’i) p¡yðFûMóÚ®l®®_× xÞGzˆ°A�|þuF<[vœk#›ºóŠÊµ¢å¤ øïåŽþ®’^Ÿ&Ÿ¸]. ZKö/¶� ‚Yí‘íc�‘%Öh’÷*ºd‹ãŒ .uæn”WÍÇœ¤&…-„�D«A&ƒÖÍ’èìKË>5Pàê‡H œ>[ò[R凡ÃX¾"†…Ý¢v.¿"† 0O��²sO§�Ôñ5¼V[™Ö§S« æé,•·å¹;ú÷MŽH˜û÷‚ïÏMàÅ5xsØX¼°ñÔ{¢‚”=ý�eQC9«ü¤ÌjΠgëïðv5¾ÊH«Mq‡=Ÿµ1›–cçêîC!OÐhqîâ4l•vòºŠ8<Åcï¯R­žYþ¸/2Zµš7eNee§/¬nçkwPÕè WÃÉm7ˆƒdØ›’ M�¯wÌå8³Þ8nÚL|;™{ /ÂîÝñvúÅ”¤ö»ó ‚P@t·ÁèTï@mEý‹T”MÚRc)¼¾læ àV3´éÎææáeÛçýÇÆ—ÐfSÎ#€ò $|Ý�Â0ÕÌs'ˆkj= Ð�Ÿƒf;òVÜWC&¢‡’Ÿâq“~[�Ï þöc5µ²(Ü·‡¶~÷pÀÜJêãwU—–k–'èbÚòù› §œ~­>c�oµh`ù¾»<ê÷ 8ÈÕÐé/(Š+S+tûÑ•e¹i ¢d1¨Ë}H'.ÉŒVg>³À¾tŠöw™¿ºèƹW´× Ç£¯ú<Ù<Î6Ñ[òejG=]µkn[Àµ¡DŽŽ1o-ŽG¾}jøìí­Îhe qÈïÊ 赋Ȝ0�@vA< ~Z1®=Œ@è>H[¡¬Ü¡ÝúÆ™²]Œ¢t7íŠöÝJ!1Q Fõ±9 n“Ž„Ëa¦Ù09žóƒÚJèÃh¾-¼&ÚMÈ~g–#’{»|Y{ØSNE¹ �”Gbºè„#Ñ­£&6­z¨¢~æö0£#ô«¡Ÿ�›{å»á‡#Môn-ÅSäq‰17+}ji¸t_PvÈ9‚ì¥n¢TÕW\ŸÄXß²Á ~ÈÜ>S_jë\=È-@‚Ir÷³ÈF+„/š {Êr§’ùÆÍËñ:A«Ú/¾hB†Dtu‘ïæX¨”N[P —éÁàô Šû©-�„²Èì)ó¤KQ¦ˆK—3áay&É(F×ÚÙaŠ¿’ –<š«ûžÃ~—¦UNŽã§íF�o­pžÒ¢8‹µoX‹Å`Å/ÍAªÂ‰ï}ô¨÷¼86©5Vjrs9jTÖÉWMõ.$ VpÊ~a u°6àÙc\¾lz!„3™b¸|ªîÐ�Ao]!ùF½²Ø80¿ñàþÚPZ µÕœË_‡ÑdkNNìPÙ8;74Ë.Ì»$XÙã¦A=ÜMnêõ×Jê9Ƴ•‡Ä†ÑÂjNäBjCÓñêm)že‚ƒ2°8ܦÊXaÏ›Â×FéívöÆîÚÕi™V�1(p§ÇÞˆ ‡@W#y/šÐÙÎWlŸpv÷-ç�Þ£€ZM¿Ód,ãv~"GÁígÎ^åÕëaØý¹uÛ‡ƒ>€ûÚ¬·ï_�¾ôܱ’Îø—ŽÁ—Úž8ã*y�ÖÙBÛ QËÖî£cÀZ<]öCɪŸ6Ü{è²Ùý=l=ˆ„5OÀÅ…ßûâ�«~œ>>)À£8Kâìô&‰ß²¼üŸnê”ùù§ËÙ–ŒþaÏȑݚˆWÉË@ñg™ÍÄ|W¸Eˆ'Â_m“oRÇVYÂt©ÇÒ‰)¶'[5óýÝ3‹_˜ì©2ä—Á6›nÿƒF 1?xü™�ã§‹þ«KW+ez²›)"¤q*±<Ö­ºŒ\@‚R'b[NÛ2M÷z^èê¶Â@06B‡�½ì¥ç¡0êæzßšç’~`£CùÏò¥Jƒâç,Ydîi®8& ¥Ñ·; GÁô¶‰¨qï§ÅyÛBm|ØŠoùßW&[ÎáqoB["õÌ$M&Ø$m Âà—^4+ë¤DV<MEÜÁ«ÚÙ¯I~(ÃZ1æh, ¢LùÂ,õ† b,’¤h)°<*we�» Òl•j84ì/-î5o8D-ðhŸ·5 æòÐàc^憊ÝPAm[SU)�æ¦Á¶C(Ž®Fp,l¤}f€uH£uÝ�+…è�«™á1G½�Þ9>úƒÚÕ[Ã�ß–Û9�^÷H[ã!ùÍSìÉô3Á#¾‰Î…Mwî´È>šàúqm}V‰kùÜwî¤"`1òs„·½ÝS|°w&é}8FÔ¡oÆ¿|óï0½EÕ�ƒ,õq:X·-Ç’•ÒÝÍ:× ëd®‡ìwIÖ+n� ¶#*ƒ3^Æöö@PßmÄ÷ T*SáÊè4�’Õx¤‰þ)·8n걃 K¦¹–ö­É0¾‚õDøPtÕ¾¸)Mƨ$zÿ˜v:52ž,òÎ`ËÛÁ›ˆIŽKzÄË€žµnP¢ê† wOO »¿¬®‘ôS1áUcNœO5­ËŸ¸"¶ž|WîÌ\›1é!1w_1Ìj?×Ï•vîëm(›éwUw㜚Ó>8i~X9ŽmñrAŠ;üýþõzÕ›žnŠ.‡Z¨‚Á)²ŒE[¬Û®éí¹rAƒèʸ>.`¬Š#Z¿ö­}Þl«›w«¨%Å‚7âfðÁwzâYÓ[›‹PdRpx1Äå�L�CÈ�»hÎVÃJ i}o\vÁ�ä@Ã2qδ‡BбÌ=a'¶Ë»W@1ËóxŒd2âpƒ}k_¦)óÕî�ùÓ 7›9…uP�ïÚT× �ÝΑbó#gÔn’Ðe¾$Í­.88C& ˆ:“@j±÷2•ìêÔt¾U‹ÐI€ú,�ìí` „6Z²œ´àú7_Ö,¾þ©qð…ï¿9Æ»ÚíÛ±OÝíÛRžøë±öc€ÜDéT£™ÁBý8ïÁ¹9ùk“Ñs½ô^æèÓ­Ö¡ZØÜVÖÆ]~¾9ƒIíÛŒÚ÷H! Ç˜’D˜FÙòÝòXQ8>úF‰„Yš.'æÔW Ð*—¢M¶°‘ËÝ=›ƒÚûÕ…4†Àåˆj¦»3÷?�HÊÔŒ]®J�ÙÁjŸ¿ŸÆÇ�ŒÁ"Voß±ùlѧ„o�~ô\yú&žþ÷ �úø… È’ë…–7æ•ù @¨¿ñHCï/r|íÉöaŽ+Ë@tøíu˜Æv»½ˆY5VfSÌwÖ±í~óóJ ×™†“ÍÖùߊ«!ÍûkgVp,éruw�-Í«ò“ÇŠÂ(/AA c]ûNœæ¯p©Á ¼LÖ]Yš,œÀ+Eãþ|Qï´¶#Ç·Þm‰ö95醸\«ëÞÙ`Ùl:ÝÂ{ÊÏë:à5€!N{±A"ÊÏ^´ð“s-ŸëŸžÞf,½Í!A».|•;­äÝ<Ì XxWº¦'�U÷wè×�|J çm®#…ósÃ/$÷bé(*ûíÙŒ`í#_]Ê5òîœaËÏ›w„ÇÁôì9“ªú=E¤ãY¯÷Yðá’éeÍzÛ÷ÅáQÜÐx÷r”á[�9­kžÞYcQË[¯©ÉädM<µ�Ášë5>ÛÇ«rŠëø±Ý2‡R¼–‡åÔ{¿sB@·âµÝ9 €ÏÁ ’‘ÐbÐÅ.cYé·ƒ'†¡Z@èCDŹ8Bµ¾e '`ê^)\‡<=\ðõ@m£,ï–y½¬),êî"Öl ¹B£|ÛD«ê_–L&÷N=(LÆ56ƒÒÍ_w4–Å-Ã7ðO¦£u(掞G_îëZ=g< ŽÖšé=^Á^Ò"eÝc¶ä'†×œdëZ!Œ™Ì,†žòÐáðëÁÞùÈúç‹4¯CÞÁá…­h?ÄÎG\¶TIĨi‘ÌÓ–¦Õî…m±HV2kzlÊžæôyûš{ËFOXO¢ù¢æ*­vx„­„·ã¡\ëg k ã¡æ‚ùhÍMÀ£ˆËž�Ñ@xtrv»p-f6ÖVlÓUa¹j±˜íßãÏõˆq‡eñØeû®­ã�Êd8r³ûzÎÒÖ©d«S� Ï0<#¬ òþ(FHíܩ~·12Xçl߯ÎýÚ ·ÚíúðfG²¿S‹½}·q X^áj¶šo¬¾+"É Ë\m<¿?57Ö°âK#´´¨'« l¶ü{Ù€Û½Bï¹êYbN¨…¸ôÓòÕç4=Õ‡�» @ ùPJÄ�uôùA±{†¤ò€À�­€A4Âðæ¹ yåa7®3�‚N•¹'?[=Vœ„Å€óF™Š¾Ó@dä“~¹À…ó2‚–fŸœŽàR¿›ÕÚ¹íñ3­,ÛÀ^ñÈ·(ÉA¹g¶ÁeÞjÄL˶d ŠºBï%Sâf·’Òö±8Z›îàGX$½\™MAvŠß üuÅ®wv<° ÃÝ Æù×^ëa‡¿,ð°œXºãHõe5â]8”¶_ШqsºoÍ�±šÞB×h™”$iêZ쨸=ó|¬‹™:š:›ãZÂ9:L$Ù“eí_di¡^��·®{‘­î€Ãi%K ßØ'AŒ¨M°õ³õßÜÚŸk¬¿U;9ÀŠÜ}‹ÐaæFœ×vƒñí‹È�0Ọ-”�“+´¢J–-ÞÂ{Î-zT hȨÌ)@„§IR£±È†´')ÓõÖÃlò*XÈÔ#Þ®oÛ-‡-2öX÷k¶Ä´÷Òþ] ,¹hUÞK“öSšgçlÚVKVé×RT×VFo/ÁÁ åͨ€ùm&‘µÜï–éÒ†€wÐŒ·Æå¶µpÏu�,šÄ§_7{ÎÖ(nu…J×â$“ö"¢—O:¾–zîdZæU/�žõ…D=RaÅ7¶ "ŽuŒ=‰Ê) ‡´�‘}æÑ¥1ŠEºæ�‘Lnu•È�äëŽ)JìBšÉbMÜ «« ]ùNQü¥\·—¼‡òݼ SÍMyMz€–™#´ÙƒPæcaB@8.Ño}3z ½^6æœ ¼�ç%a7­¼´<å(ÊàX~=wEzÒ¤+µ°‘u9£eÉZµó�ÊÄçs’zq/H…ÅDjêþç ºÜØË+‹,°µ(B©XG…8¥•€–”ñ†WÂ+ 5ç ;igóÔ4ƾ¦­a-£Œ$…jHòm(”ºSúCª íËurˆ¡«::^ Y„Ú�>‹@ ¶©ngyŒ›BR‡›æøgrýY0<ŠîO1p_ò¢ß¬\–§äŸaÝ¡�sçÔ�–ŒtZ‘6JÚ�¡àÅÍ AÖ?´IãÓPhëìµíŒ�(Ѓ‰eÞÇÛ7¡ Rh²ˆ]lªqšm¸‰Lmï›×�ÕŒ‡ßs”Ô>³¾¹ÌÐ¥ÂL=ˆ ŽÊœCœdÛðYyWJ´$&±E32¥Š³Ð¾€x�jVB‚à_„ŽÊEpùfãnþ­ÝŒ<ÓÎ?!/ÞÇ% ÖSmº©tÎü•ŒÕ WŒb:—×èz(ãõ–o¯²M“`KìPbë¼@o1*ü:dŒ×„ô,zÃÎŒ)HÝŸ¡»!ØÉf“Ø›7›YÚh¢ä¨Ä.œ)‚D dž”hR̆Ϩ+�Æ9qì¹=¯1fwÚû�@òÛ²v+286ï^i™ÍïZ˸³ 9¼1�XÈ�½¡Ý‚ÕleÞÕXŒÚœ¥ƒtF´wúò3A›Ê§9¸ê¹ñddiv*NȳkMö‚âÁ—Kè§Ï™ÁÍÍ~;Ò³ãÖ¶ÝÆXBFӕפ–à“±q0^[“q9RkÙ·ü@‰qŽ[¹ñW-€øñ­3¡88½?žÚ£N/}¸¾e“N¼ÀaßÒKK£Ã]“g`–qL%0KÙ‰ÿ·Ï€/¿9+Q¬.-qºÇÕÁC¡6£p¤éíS•­w1yùryLÚ`õ`úÁ†™M…ŒƒìÇ_]T#7æ1}�¼Gýæ«Ø>,HßñïkÉ�–ä,Gž�)-ñ—ÈY #ë±o¥‚¸ý#¢u·MÌèŒÉG-çÆœù×¶õ؈-ªä|x·wë@r$aKN{Ûø(fW¤y-�;ŸÐ|øŒR"ÖOçD†½®sÔ³9ñ/ô\·Ù�÷H×€h”ØYJ×+ÅJ¶m2^ú-—Ó�vL¢¨ø!JŽ6¬ì�&£ò•^⌠'2Ÿç£ÇÆ;ç[,¥ožUÕø%�D(Î|ó:MüÝè�‘¤Š«£Ègòú�ž9ódÂ5ëofy ïÚΛ߈8"8ÚúÍÃOè¦Ö¯Éƾ}_Æ–_v`“Ãå~!*£]*ð’ñôõ‰¶é::Š2€k¡žÄé’lDy5¹=§ž2ÖÊÜÅ“cQ‹`[sà)¡@g&'ǘÖ·ï­n.)dê\¤‘\ñ©Gƒ%¯2ÖxŽh¸Þ4½¥ñÛ2m²©—Ž ¼¥Nëì{MŸBÛ/ ÇÐ]H+†½úˆ¯ò×S(÷ØLl¦dŸ!½¦ä�æ(7éû¶ŸNÂܨ¾®;L�ýÊqÚMÓVòúÿˆ Ø¿vÝ‹u«³»wS"´Ø^$‰XÃÚôTH.ä›"¨oZôá}ÂHöýˆØ"SUb'^±a(·rTÍJzC�~�Ê‹ŽÍ«àd(}õ‰¥ZãòÙý�]̾áí²%x÷q‹œòÀx«M)ᆿY÷f­ËÈ'‡Hí7JŒ4j:Ù“É»:ô}êF`²üŒÜÇ Iï˜H�‰³3³¾¾}šë¶qh{ÐCÛQÚ,‚Z¨ \rÏÊ{‹Žž8sN°¶�¿�²Æì–-ÎA·äkš÷ÂÈ-¾:m-Z­Æ<žà'C¬N°ÁƒšJq®ŸÈü ël–kÞ]>—Ê% E ûÖƒj35êýrÛ�àŠÏ�VY6VÊkºEë¶‚�™¢T íî>iÖ³U8¸Lÿd<,�Ìd– *­Ì¦"ÀâC¹ œŽéÀ³_º5¸ð£\òi®ówÆË�sº‰É×váטIÞl‚ ¼]q.c#­j²,Ÿ‘±Ww›W�ˆ£�&o˜ Ã’ F3• -=ÞmÑ46¢0|ùÎÁµŠ‰íG™îò;ÊÔq¶Ñ[ØýîòÖÁwÒ‡ÎõMèêÏ4T¹z ap· ¨µ©ì#tj/Çn뇛IÚ휯d´ºËæ*Ölýùy|å'$×u{YÕ0éq�7bá"’v:gÁš÷g¿‹î[çÅ�r>ÈpqÑ\o%ú;?Wg(-ì È ý8·Ãb»315Êî"Qk”_XQ5l:Þd¤éa-[ß.ÚÊd é¥ë¾O2aЬ!I[®Q�Ïv<òîïÉ#Ekž­íŸMž%®Q|Ç�:,ióXVް@pÍæu-©©Õ³�A¹6´ÈJ¡Lî”·Ø|ø¨/Hưø=ö1®{¼'´O»M%ýŽú³” PnÙ3:~q©§*v"ò}ÝÁ¥ÇÄ*zÇøx¡öuMç2Ãð§˜/Œ7è8uÞ¹ÏÕÏPU¨‹¤z"Pg1@û2ZŒ, ™ ÏÞk �>¬s„‡žÅ£B)†¤àS§™ïõÏåì‡Òñ/ØÐ7!Ï™ ‚‡hbü†öñ�ÅÈ×HQ=k¦Ý€}šñK©¸ÚÜHÍí;ï<õ³ïOô÷® Ÿ 3÷ï�w¡§‚.ÛƒÐ}dÚf÷µ¶+Ò. Åe~®qwcê&×ûXÒö¹µ,¢o%ÔŒi™é0tïˆö³°=IѨ-ëDášFlSülí É�¥Þ­ÒV±}¼FQ2kºAÛ×Ê„ 3ò0¸v{Ñw4Á«ë¹Ow¢Óarñá/ßla·Òì,fiÐVn¶µ‘Q�žÚÍâ#Rk¯(m©_¤yÇ "©áb|•kî¶)7¸&‚šØ. ÷=¦Žn2ž¼®7ÈÇ_C9'r,’ªƒí¬œ²–Öd8Ha`†E•¡xjyRp‹UªÌ€–‘õµö‡Œš�²HUªÆï�Òk´B+Æý‹Î^0’`¼èuUï ;jÙXzZäf‚ÞäE2ùqu°Ý©ÔyùÌ/‡ ½®Ï¢RÑÜ‚%Gƒ„7À£ ˆä”i*ˆº�Ð6�—I­@Cå¿TÊsei:ñ¥š3êèv0:ΨY‹Ññùèqùb/Ó¸ Ù $Ý[õªcC½©Õë’`Á·OA¤;ÌÔ°)aÕXø¬üh©–Ž\ x PF¼Fš± 7›’{ZÂ…o·žª‹KYPS°W�· ò ö�A®îˆj»�Ó‰ß8¼6…˜rÑ…F…Ûaî¼î§êõíéÒFwVSq K«B÷+�7w¶-9ž£W<˜Í%7G›&a�yÓ”1ZaÈ P²•�A´4üÇ<™×—�_Ë×òÒMmù gÛO�ÏÆý–¦sû«lV–Í«í5¤@€­š|p݉‹gdÈ^ÚŽl]Þ@žâ½ ŘK,=FÇTÅ2„ÖI|úœÞÁªxŠaJBÅ›ZǮ鉿«X�@íí¸Çkñ°ì£; ,e�ƒ¥ª™m¶‹ )–T ª°ªR" Ú -°’h Óøê_7÷}õ“æ|‚lfÛ¶x¢£›¡Ÿ² �K=;a˜#óœk>™„Ô…ÔË×…#²~�Ó�(ûo>×›ÜÁë›ço´[ëªÅÒ|ZÅÀ…aî¦v˜ü'«Útu‘ÐmÑ ¯CÝ–±ØæNxF{<=_etŶ1S²x· Ã…ñ�àœ-, wìþÑ T,-¨ÆMã;űxÝ›EÆF,½ÒÍ»òøÕ„ÁµA¢R!�r3@êÓÀ ªäº8žÖ` Þ?`Ž-Êž^é9½ô-É*¬|ÏÚàÏ5}aÖu†Â_ÁO´öh!N%ºøà�‚cNø Ɔ¹!»9ï8£mßV|¯T¨·Pb굊ֺ쬱}¹ˆÐ>]{rpª)¥uËGrׇ䤭cDÚ·Ü�=ó�½½Ã—ÚB6¹´ÄX¦� �~–òµkMX^†â ù¯†‚‡y� ›yå³³Ãó(çÁ&ep¡3zÀClÄ¥7XE1b”«»g!’Nç÷.ÁšžíÔâG²™˜ múÀkMfâØ—÷'…]íô¯íTÑø_Æú¯¯(w5ϤÑð!�Y£�=†®>Jî˜Z­9bí_K¹Ö/ù±�¦^†ÈY‘»`¥tÛiÌŸ5�ºˆr‹ b¦ÔÖÇYM¦XÁ“ZEĶLŽÙg˜°iá¤u™êó¼Uqßëlǵ—0Sm†Ô'„ ™í߬4èù`I7 Ì�$Õ ™Ýò(„ú–ÇÜt¶z<‰ —m¾upeÇ çi#hV úÞ0Њ»Êœ†A¼xìjÇÆž—•ë}ÀƱ¥¶\¢˜XvíLø~ p½mDÅð¹40gÓh1'$ÆvÛióçÔX2ô\1žeãUgÀ°/Èzë`ϺíbŒ#i{-0–¦Ž D\¹‘N39%í܈º¶|ôª8Ã;׶dˆÖfæÎºúÁ>Ûµ±3=Ú�ƒ7.ÖåP6ÂÊj ÝcÈw@WXëËιݢ?èÐQ^Ü‹v¨w5®Œ#Øj1ÜÀèø¢”ó­ìÜHg¹ Zóbw)d«kGyÍjbŸnóa¢ ó�¨{>B¯–ã³qü<•ÂiÝ VæJÙð'UÏÑ jâxy‹@ꯉÀˆ6¹ÉÏìZ7©ßA깤NìåK4:¤ªïÚ)`õýl±=lˆ¡Æ\L 2æˆ>rE°ÜA¶>úAµÒ³n¸þ³j±wíú!Ù #mcƒ³—|ïs†ëa½pà÷z€,^ž:XÜtÙÜó‰�§S^;ô”cò«|§p¸®÷æfÝ@¥Ñ1Î?Ù´ð¸Û}öш²kº SCÚÈ¡€þûÚ{õ÷Z¹–ñß&BäÚšMpÐ0?H'P ÷_Æé=+£@œ3í7ªŠÜ™i°Ž©~“o3Ñ¿o¬«%gÀf tÓ�åPxNFÚœs±!8¬F4kˆ ó0¤L±kê“æm;Ê3eìÌÎ�Òñ%¼²åÚ±ÎDiNx±62Ȥu>@²'ãe(-SmÿÝg�ö¹<Áu·:° %´}Åï= N c|Ò @¾®g¼E9èÜ'\Õ9=5±ž?{㫽!M1#2¢¤¼ÎaøxÁ½Ùð¸ëWÕ''ìÎm.ò,Ðo»B6PºèÝ;xÖ%ööÝ�µ�i™É‡€ôæU\nÙ^yQR†Q8²Ýfõ;ÈûÙ­l¸6�Ãû(ËKy ë‡e+o÷7¹ƒ? Ìï!…–:\ ‚¬éÈq¤Zb�Ö Ž(õ$‡½& @R·á¿™ÂÓnLˆË?9kûºj=xsFIe‘x<ÓZÊI`Q'7SWÞØ�´º'tºaì�éðwÌPv“C·aÝŸÁ•Ò°à€† ‡¯ð'åv’·Ýt¯5Wi7·6öf¶-‚±+µ‰ìž½Uº«Ý]·Ð·†|J“:2�=�÷·×6‚™údîËmþóìíȈÍ÷óa³X®ŒJÜ0‹Ò+›ÅÕíô2ê†ö ÜsX ¿­µ_b“$Ø^ÞE£ÄÜ­4yŸŸBé|ø�ز…ËB–;¹n%]û¬ ìʈàÙ6hJ¡Ñßö2±Ãj¬‚=î×âØexָʡ[‰Ý7Þ•“¯cÓ,`h(8Ê¢tÎ0­ L‘|–Ô6«U,Õº8‡6ØPaUCˆÁûßz¹ñµ?éåw ÏÜûz©­5¦uƒ‚†?‹]èoŽR¨à˜ÿT�Žñg¡SH ã‚ìQˆ‚B´¤åÅ¥C±®iß·Ÿ°·ÕböÓK–P-S°ºžJäƒcoQ¥óÃÃZE‡�+qŒó)<öôš§SÀ!oV(ÜÕžˆ\{–¯ÂÆÊjÌô!ù”ǾæX0c1”‚‹f/!ÈÒÓTù5AƳWVfÙ@G‘]ýR†ûñ“@)`¯Êó›kJ �´53Á“è=Æ Ä¹ïK±v.�°ˆ9ŸJ¦u”ýÖ #OÓ§â£ã(ÝL9åÏ$p´Üì$–6·ÌëáI�½ŸR¥�MÙ±¾nv Y‚z�ÑaÍЄƒâÝð™H«ïo§Éìt"0|&¼·^+­È)Òu¡–zVU1WL'î²¡êÆŒ“T,†|�òð¡Äòchs³)5qS¶…ÞøÓŽò‘§v|.0ªÙ¾ƒË·Wou «jbªGåõëº,ð°Ó²I£º—aEvSB³B„¯±©Ü_#Î~u;ÙL¾cŸ�ÙœîÅë”Û3nUõS>iYG«“Æs Ž$Œùcœnj^­sÌfìj¾«-@²wŠ�GÝ㤶Nųw¬s�V¿L7Ÿ9�g]îç4 ¯ŒÕ×/-óHz ì࣒óE÷-žgÛö‚ÅIJ§y÷ï €ê¯êKúì�_,Þ’iÆ/ùãºRjÍ)…á̼¼6R»:$É�š8‡>]Y�ÕÛÆâ5Ï{lÜn¾e1W¯ÁB¡ôÅÞõO2žÆÍdv<òk½¡5eO¶".î@eWì¶ òæ¯iÊüÓ�l^0Za/¯ëÁ�Ï]Ò¸ïîH&9,KÛ-Ç{×%BöÙäq6vfð…,¯ªQÎõ ªüÅïÓ»×5³ötÖSœ¡»Ê§ug‰¿í½ÃâD]´rDy€ R«’* bo³¨—üç „í]Äs¼¥<( ­¬jâO·½Áâ-§K±\ÌF³5E¹Ó2¾’ÏÉêÀ Mk¼†¸Ø‚n�–ì­„IšË»Ä €=ÿ†ÕX4a­�X®óŽ_ÝO-&¤í4-u:ëq¸ŽðLßœ’‚\Šm[ðh9 JÑøá„úûžyy�à„wu�õC~å\˜•ùß>›zÞ_Õ“5#ÚŠß�ï.ZÏ=t#;`)î­“ÁÝåM@ÏÎw2-q8º{êÝbš!õÄÁ¾¬Àß¹Äm¶nQ)b‰óA{ƶKo�·ë}ÕÖè`Á¸[ ¯-ã…s|¼ŽP¿ …ìäœ.ƒuüMÂZàSväetUÒYÅù}:´vž±¿H„ËN(¿oÚùJ-o„‰°û'Ò¯¾ýÃãO ]M®tó÷(æ¹re�ufb5Ÿ9u@…�SZ xÓÍÂA­„Ç‘Aó‰×Ä*˜ þ í1ô� H &ÉÍ…amõ´Šwu.G–س¬uH êõh¹XÜxIn›žl³¥ÍŠp¨6›µŽ^”ÌÝÊù– ®X`Eca޾m  Ò0B/É+ÞÀOìÉ™úyZq¼\·sçžtlã�n”#+Ùð®BáÑù üfcgÁèù©ÑÖ(M)¨»gT¨€Ó‚ï�­×Õ9ˆÌí‚ø?¹á Ê€  ¥õc8 è²äw‘ø™_A{ªõ7mžÝ"sõ•Ìákb˜ËêTyƒ�Ùýû€Œsw³>k �ceñ–˜µ¹ÏÒô×">ÛWîÁèƒ9IŒð/pâãòôqŽ…ÀâéiIwR¨ö‹�Ý ½�J3ÅLÖHf \"2Á�\ïûðB” Ø}vØ*óea™Â>áàÒ•å’€sc>:’›w¥€Á‰+“o@;¡ T)ö5æêç£2µ¯ŽgÙ@‹~æ/µùÀ y”eª2×Ȇ<ݦ´ÔÓœâA™#NwÜa{¤î²ƒ±æ%Oj 7'˜Rb}OÂ{brmâÁÛ´­Uš÷0¸›pîFïÛ¶1é Ð{o:£�ΦØàÛDæA�å¹G«r /ß"åk£n!ò™Úãzîn0 ÉlX`1޵âñŸ:~ªRݼR}°`1•áë‹ùR›:Võ9X²Ñ—ŽéD ;µb»×1χŸ™‰fe½!^5rVIÒ\Œ¬WD¼­B¯œ¢‚ì…Köi loò­ûP'ÄÒEì›`a³.¾Б-rŽÆï½Èˆ°å“ô)�Qó½ NAÞÓAŽ” /†ô‰•ì—냦á¬/싌c}NÈÑ èÙº©ø^¯¬Ë‰Y]�⟱˜ÉWTÃ¥cXB •ƒ‰ÂÓÒ‡~=ÈGÚL¥ˆS¨ýžÜ4µ!(˜øZE° É“�Ã)5ú *Y€ã«Qª%Ucy¤¹'ãWrþB2(,ãNÑŠáÏ–3¾@Cù@@�.J�ùó€Ó8$Œ±öZàŸßs~L¨ÖwÎ"W ³;JJzz·W�›6~«Ù·EÔ´…¬¾Æ–÷ÇŠmVûE,ôâ¤`_Mt…Êôoô‚çåä7»sJÆÜ_l‡@Òf¥ •‹8 �±5‰ù!¼½~ÆŠƒZÐgdT ÄtíE¥ Kž»‚,u°·$ '©”~ðÛ4q1mŽYÎ×÷·|pûsÕ^j„Õý®ž)bÓ^’ÜË…6f Mï6;çÚÅnl Dç°u7ô#ßa× Eî¸õ[8åc$¶N_H—¬[/wªÔÔ�ÙiWº¨'âõ�v�‚ÆÛ`ýí“›Öö¯Ü%.µ:ngãWM4Ñ}N ldŽjƒé4rk˜�ª× &3¼еÚ8ré¼;ÅÄ™<à[›¦vÓÝbnrÉxõîjNL—» ð½õô&"kªZ#¢©‡lÇ2kÒšeC«ÓNᆫ¬cÙ›%�2V¾@_•÷y|7êÀH‰zY1ƒdLò(°�áèéê>›¼Þáh¦Õâ�^Tº Qªd¼;Í2‹â*6¾Œ=Pr”ކúìÚ­Úþ\ÍJã `øAt/)í)È–Œ:>ëlWÒ…YÛÚ[ÅQé´{§”¨&¼h¥¹�J¾poºÈÍ� ­åk-ÐúXA’é¯É+±´bƒ6 «HȼâøO%÷ˆµH}°ŠâYŽšKC¥,þÒ‘Ç#¨è±qsš‡k¹Ì†],y«€Â²™àU”µá`ʉ…¯HGX‹F=¸"d0—­‚ƒæèÉùl>øàjÄyϱž$æ‚2?š¬Ð¦î¼{…·ŸK¶«›Êœ/íÓ³Ô>å�O�vKíBçø€‚—]rû#$\4 �4¦•�‚ÿwà`Erøñ�†=ÑRýžúZþ<®MÑ1Ü催º"¹åÞ=ŽÑh™þ`Ó¢ �߸ّ‡& `=héglù«³=Û+½iœKW²ÙWŽÆÃÕÂ[‘DKèÁ­jÛò—' ð£åÙ‚ãܵ¥q=Œ£ÄÞð×®Èñlú ¯ßu&즨 åTn|c..ád Ó®dÿgyO ;”žg)z d Šm¤Ö㺨=^¬{îsg¾´J̆§ºäcrÍV*ÍŸ¢pI¹9/LB% �,Ì@J.R¹ï(Ñnx´~‘e´_Sµh4Ç8¨Ï4á˜1Ú¯ Ån)hy�£çL�8Q�DÙL÷{D(”2f\ Œ˜1?ÀÙ~†,ׇç1 |mHCz'"†ºÙr�Æ0�U ÒÎó{¨ 넟XéBFСxcM;†ÀvÆF ”Í^zbŘý&î* ¯«"Y÷ö¿Aãº�øz,éˆ@h Ùr¬~ú‚2rÒ59ÚFCÒкêDøyší0¶±Fg™ ©ôkZ ìD!/%ÂÛ‡Ç#ß!�ø%9HÉèûçMþ IMÜW– âFݬ"ªêkõ‹)µ�“Å1/žÍmowÂßÍ™е¨÷‚1üµXót5Xì‡o�6s5žwÛ» g"G\Âlé/ùk�Ä:ÀÌISyò {ir ´ Û¬}ÀÓ÷K,:Ô씦1Ýj8ÿoG,06tqaæqÖ§Ôã ¤Üä/úok³ JqèÑJ«ö–ðÒjÇÝ\ ¯{Öq$8o±4‡ÐÝ«æ=MæVÚ]�ƒ÷ë(H#I–Sk×ö´: 4Ê9ʲ¤ß+c`¸zÖ¶,uóæ• î:,Pâ~Õp�IŠ—{ñM’Ú/s@�G“aÜ4ÆÝÌ-6¢‚ÀÚК-‚¤ÇáÓ�û— æÖsgÜiœ@›H±Oµ¼ g‘Z�œ¡/óÂ{æŸ2k»Mí"ä�’ü~vÁq“Þ¯«ÃW� ¶gìð$³§ÿ»4`#g­SÝ�—A�½;rî¤Y2“K|°j×zŸ”fs' ¦Æp²“‹¹çfO[CiÆïÁ§Ç•ƒ9¢ærÊÀÁ�m>¦Z–…6,ÂË.q\o5+ºÑÅßWÐM�ò¸�g20×cÛ¤ÒÒTº"+Ê"„ k•Ëßì¨ól®×‘ %·x¥Õ³U}§D $�t¯�bJ1PCñ@îzÈ�£ARØìޱ†òèÂcÝavÕÌ?ï¡ÏGoˆïЧSïmÄE1äßlÕ—3³`ÍL"ý§‹'+¨S¶øÒÏ„MqR›8ÉzK[F°Ò‹p ½@ÁÍë3»$Ãvqÿw<¼û»õ[M²¾ Äl[sDð…«3e®ðÞw°™\&²~tOb�yI˜|�=ÖøJ±÷ƒgaÙ-,äëSg/K•4�áØF0D±<éaãp *‡™v´É ™5²Ìç8¡7Œ…¢Ôõb–[F» Ó}i”có\[ʱg]9LÒƒÒ==µÊšnâùA¯Ú-Ð*_£Üqm¸#'VVŠPÓýñ�‰ýõÃQ‘­‹ùÐŽx" ¾M‚Y ÄM�ãÇÑäIösÝw2Þ ,-ûYe‚æh2¥ÂlÒg`²dÝ(_¯'çÃÞ:Y±qc÷ ²BÜ·¡Œ8S¡’Çá�/ƒÃÏ\d:QÕËùâÈÒ;Å û²PÂn‰½Ö÷O;ÆË¶Â?@‹ð^¦r Rù[Ú”PFr }˜é“L« BØ Hw˜P  ŒÓ¦Óúàù–ÆŠ­aá†F•õßҿ̇,é~H½€�@g˜ñ8^BëÞE·<猀@aÓ ÔabÑ?'d/Á*ËñÔž ýEz ‚f—?±OÎæp–ÖiKÖ½[³¬ë%\/€ŒwCÅ\½'Ö–¯®ÚÙÏdy‰€}ÿ/W¼ìàw‰2Ø| yñÃÝ\-îšµ*»ü¯<ð“Ü3Õb=y^éâ­%˜Á0 NHø<Ë|KßfD7GäÌí­|:)t’½zÞäÇ6Ð¥¬ÕB‰/b™Šœ‡ÉœV2 y—©äk^F¯FfÉ X(n‹ýgô÷Ñ_b.�tưüøz÷îJu€ñr7@D¹-Xê€jÌwq¾e°Jå`@^ÇW×α6çÁ™¦Çï¹NIŸ~–DµÇ"±ð˜‡”‘õl5ü€›±ƒŽ•�ÀñFÝ»ï*ùs9~@ƒ$kõÌ-a­ùj™ãÊ'z”+qÉ _±…âjE®á÷s/ cTÙ“Uš�P²>½c9 ¬XÕ q«&P+„²þÎBt&¸eÍT—–ó‘0ïCšøøàíäæƒ°ö,Pý(9u<¨Âlx"n( ¤» ®›‚e‚ñ(j—j€/‡ðÍG ÓÝ@ܼ¡ð—Ò KN²ÿrhí’ð/eP-“Àõp$!Á7ùQ5jË-Ü…ëËêÈòR––ðŸ(s@¡ëõ­¾Ï—gÀñd™ ¶ÑrñÀx÷IòÝËÚ0ùô&F¹ŠWݯíÖ²Ð\•K›I!/ÍdàµÓ|B¹ÁçÓ®âÀx€ÙAbõ±9pÜ(Íï\ÑoyÐ:oN·HYk�”Òr ìÚö×´šGæù>°f—+Îy@µð¿¢R‰p7d³‡w}A¹O´¾]3Â=Ï ª9t0¤Á�§®Mw§V%È�Ï6ÎÝð�ÆðÝ ÝÁHשóá^Œ®aÌ^½Œü;i_‚~mÛ¾ƒ�ÕyÂ�0_÷�R¾.Ao˜6ïöâK\Ì�´Àe§—² „‚Ž@ðJLV[¨FU�¢ßa´ECÆS=’ç!|ÒØ##“e4iË�À»‚ÆòRgMVme®ë$}ñá£.HoZœ\D¼Q BDKÎ-‚Ó‡a$´Y¨BÃÍ É¶ûùóTYÚž`0“<;¢u²`åi/Eæê¢e#4h¸î2 +7ù°˜ûü5Äž…«9L8„j§ójëNì©M9oÕbìF·}˜o)�Ðæ^sS±ÝÁBº�6]¹XÌÛL Ï…»»«}¹+¢p‘Â,°€d¹ vOý»»‹·óß�ÁÐÄ��@~;ݸî6Öö‹oþñgÑ+v‰EÐþëäü5ìÒr,$äwŽ+ú�Å}’°cÜÕ©%Ü�®a}])d×´ ro´ÓJ1Ìà/~W¢s…²•„7eèÉ�ƒ`Ê6aƒh>ñHüƵˆ½ÔûÎqs ©õÎjÁ…«¢3½Ÿo€5Ç]S„|cT¤ßvé\CLÛáCŽíØVï—I qCܨè`Õ­oØû…?Š|ÏÝ"ãYNγÎo¸Q7U‹v›JÊvB+7åñg,ì_Áî4~kûÀ»~Œ'œWò_�…f>.4Ãϗת"n±ž6‚Ålfp`³Eä[!auòÖ¦z>ߘ¦¶}g�A8ÝR„M¾ ›¹±f�àz`í‚<9yó•²,̬rvçU5Ž�íÐéP<„ä§HBϼ¸Ùr²VKïRŒK ƒ {×¾iËèpÃH²òqÕØ.[hð÷¶2fÄl=],žå]ýáóµK옇N¹ß·JG¯›üüí2Rýlؘ‰¸oß½:‘ù­ãlÞK>’ì:þ± z«Vh†¸òÉž]zvK�P³ÙÌtQ@™ˆ\õ‘®!Ø0j¿cCǾ a&óË6ÞÀ0þ~J7.€Ñm(ûe³yu¿_*—°*Eï3õÒÒ³¿Çwåžg·UHx5Ì…�W 9› …º-»¾7·vÇ[Ab’F",ÜãU­ }Óf¾£v Ù/‡j°˜a«ËLBô7“G“uŸ®mèÖ‡b ׂIÈ‚'oè7ƒÌAMš¸Jý$¶µjÀ�žÐú g®m¦;‘R`™½Ü/°Ÿëq*–8ÆÕ:=Ó©¢ch½h83·SŸÕz‘˧äÅ•HlªN͵ˆm5áLùO$êÜËöád>›�høû”Š�§•þ ¹Iß&@·?Óõ®†ø@󦹴Ù,6ƒ|u€Cù¡ˆ;*mÇ'¨÷ÂØò¬‡úí–@mdZku‡ájÎ[ êÐNû`%TUJXìJåGWÏH.:&2®ã\Zê�“2×?†°ÜžkÇè�ÖnÝôË^Ý�×Õï„=u íT-o(­$t<Ü{°3*’£Y4û8 é�ÀèaéJÞ%IÙŽâ™_=ò2qJìÞjà&™¾qØzúGlÞ²Å5_æ[ßå¶–"æä\ÁLÑ�£² ÿ™ÃF9+rrÜŒø#À¦LîW=Ehs}źƒ€¼] ,�pU{ùKx릑&ÿÙXó¡•³¾µžì.ì�QŒÚÍ´•"ïRßžÆã”úÙ…ó/a‡¼â‡óÉërød2`•¢htIü@BÞº–¯»x ˆ�w?áãiXoÂ%„@ºj’Æ.ÌÉwGpçÏlÞá0ÛB®¥0}Hþ\†,S$n }‚Aý™¨yOrøú¸²ºƒ*K�}£X±ø§zÞ!A¡ jŦ¾Ve´qúYä®°A±ònGZ‡?|±8¬b²J‡ï´Z»$$›Zæà~Ï>dóÒ†�™,˦\¹ì¸œ@R#×Äyl¼B5ë�xÎËúqâ´³–·sÉ.Óå³Ç“0œÃ"%‘¯rµŸ;ß‚&Ã3towÌŸ›�2Þíd 3’�‡`8Óú8K©~õ߯bš™wÇÎgÇšVó¾X™ÇgÛåþæC—.9xK�Û#þ¡ê™qµ©¬²«×Òð¤×ã Îøêî,[[¿Î–âWÎë„DŸw�»ÇЇ�,ýÜ!Õ׉BSŸ@·¥°åèŽ>´ÒÞ}~Ìà ýžN¬z|§‰KB :/BF�f¶�ýoÎèy騅6Ã65¸}i4±ÛaõO+�0…Ae“|÷ãêÎ;újÒ¸|Vx³ ó��èïk² .I—^oܧå]‚Õvå`/¬<بîíœ5ÿîmr›�¹‡!gD·íÇ–°K¹?ý§JÆPM–I2ÅÁÐÞ—¥h½Ý0Û†‹hÚîAtÍšQuÆü¬¶bYPòã+oÖÆ�g¶ìÁ÷£¤¢]’3‡ :¦+˜&¹Ú´Ùµ#¼¼Û¯…{Ñþ?e¹˜]9aŽ8Ô´‚±øzeM©Ù†¸V ÃÚ?.¬N¤�˜GÇÞ¹oÏoÂòe÷‹þ%°cýõû3¹ƒa’évG«ñRª°’�’²¡ºè0,"ø¢ DÈ MÒ"}�û.s½ßeÔ˜2‹ç£ü\�ˆdÈË!oUióD $:?F60öt‘�†ÔŸ†Ùe¾£+b¸nžüÑš$¹"?(™ÂŽ| ô{6H+oƒ�z_=àFynzk}Ö@dú&nÞ÷€�°$„ cy±ovšâX DJáë„Òî‚Ùº÷¨Û¾x½üÖAl¤:)A% U¤Ó~¶©R(nêv|¬L�袋«`åá3¢ÇpU‹‹"•ÉX÷é¾íŒ�¢d@>,qz¦À�ÓÇ äªúÇ ßŒ£Ä¢l’•å ÀÔ‚Õ°¢»5·âf¿ ÏC�Ë+=e$ȶ:q°·¯Yê�éžs»�¢å¼†4\xºLiÑè¢O©¸æ.I÷CAïG;3¯_g‚ ˜ƒôNÐcÀŰÛŹ7»S|€û¸.Vš«'?)ݬìS›”TF"ópyrJÕ}¸ ú¹¼úµÞ@'º†�(,9w¡e¢ý[�ã8QÛ»´ÖL=E® (€‹Öë­LX_iãZç¨Oß3ýç#ƒå­½Ý@i‚ýlkàÁr׆VO v*®‘ËÝÒm¶x%ŒˆKd9ûš–•ŠÐÁßo³ÒéC—äÓ¡ßâmð,åÖæŽ/ÀY½h"-õßx+Ù4ÇgÅá¤CR™Ix‚µ5MÜ®š ¸I&Ï?]ùû›Ð^å5ñµ$Ir*_GYî;1ÀL„Ë�=V`=öh“ºZ,ð;µñwoq\ZÍéùß•W¥Ùо2ž�DÊ%™Á/”¾m>xJÊvtÚ}vß³gr×0£§ !†ä]•µ24XôÔ¼Dá/®L"¢PåáÌŒvó5?`(êŸ|bä5]kbª®\ú.y*ºêÏzbpÐynv º„² ­€²„‰Žö úò Bñ¹bé�Ü[.|3ÖŠ£TR6ÕØvÙk(á�ù[n´g¶¿ëíGkR¹åäÖIÕuÞ-öW,7�‰W3Ôô“Õ)ïka9`�tk><‹)Ë6fÁÎkÈŽ¹úˆCâö“®àý˜m"Õ¼ÆÖë¯Oê»�å`½dÐC6co,{ƒÝ}Ý”.ƒæd ‰�\;Mû¢÷Ëͤf×Ü‘r'¡òø 5|]Žù.º)kx´8D¶1 0Œ †wêS:ä¡aezÎcÙ mEK=)¬Ü$5Å RÞÁrv…(t¹ü ²~ø°>‡t ®`Ø€j+àlÈ3Oט¸“'讦0—Â"M݉�Q»b8"DºKåìW«>$ë¬Í`¸ýÙ'œšÚq•o‡Ã+úи_ß�¿SZ »ÞS‚j%<»J´¸X¢€”a™·`g4e½])\¨=ÆüÀjÔ¬¾!Ä ›Ð½(Œ°).UY#³ùï˜*ó$ 80êoÂ83š (nÖ@À�9 nY­¦»OÝLïËDt547˜²0„ÑVØ«ž`¦ –pKö}¦ûD™AM@¢0š ÿxb?uÊuT+C Ð6ÒNo}uEûXPœ}œƒÈUh/uX;ˆ~ý=Úûœ¼K~Ù†ˆÍÂïŽåB¬ºuÅî¡vPÉô\Sn-Ú.\³-ª0 JØ_$Áæ”~�¨\ª$nXDšzç# ]*µ´€Ýùs‹ùOä+.Ó² a?}`uÆz+?Ùg•ç”à1sUˆyÕÌŒ=àDzã“Sï6ÌU”‘hcÍ¡îÉ-5ÀT…B²$‚ðÁfCzÄS0R@� ä–å| <·Õ¾Ú´;¼‰¹Ù‘d1ùZN@¸„¿˜Wü"²¹¡5Á|ÞÌÉTQPKè¦ÁH*aØæ{ÁƒSÈY+ߟ|¶A#Ù�67¦Ì�ívØÞuÅ )‘HìÖUcX] M\/gÃ�€˜(æmè9Å»lc#)ãѳÆÓ§„ù¯G¼Ø6ƒîàÈžÓ‚BñرXõo"åÆL¸eX§¸ÃXñáýYáë¼+�øŒ?~°Z€~"é¹dÃõ”Ï2eoò³F£°nc–ë,ñ·mgqõ¿©áÆ 3«ƒ¹a6â±�þ®Í×ÜïUßÈ[‹m€Îi <}\(Ì/ #!0Ìg0ìè]Œ¡ë»Æ{�2‹‹�è'ˆ|t³zÂ^t’@·É:m¼ ßÌ�©fÙŸŒÎ/æéŸ×æÇgª#˜’oÙ:ô,êà›£Ê`Ûì«Á4´½3+׿ŽEX©oÖŒ ï&qJ2QÈë•wÏ[®Ú_8ŠÑ·åñÊ_Ý„?sE…ݺ·ÚöH²û{vÑàôFLIè§Æè O³"Üq\37Lc¸;pß°½é¶³,J·�¤ñ‚Üu 61þWtèàgQ²ÏöOÞºtç˜]˜lö„?X$Ø´G°`&è_cЦ Ø¸,†pTsŽ ·¶ø·òõ‰ØMFö¦D2LNï¼ãâ¹Ñ�E�j s¿EÑѼ�¢‡5Ø~‹f4š"X´ºƒ/À%é(CÓ‹FÞ$;XÂóìœô ÅÞú©ÒÆÁ£•½ÞÀÆå¦ âÛÕáG]L‘“7gš¾®NÅd9/ÙŸœÝËIP6�½îã¥M\µÉ³ÚÌçWx>3¶G¬ÿ¿|œ6‰æß¸̶fËe§ÉÈãÖH7殦¨:’²"%¯ª*}Äc#–WïmÖ ÕE²Ûè#òŽvH1CÔ‘3�³`¬v~¢ï]ætÓ±?p}ÝÓ�ó:?(Ç‹…?b ¤�2*ž!ë{­ÖÈëÉoEðc&±1xÞ~ÉÏÞ0«Mk]YA~áT“!À\8¡¦òyc Îi,¸{O‡9j!ÒáY a³±¦ØÎ†Éœ+A¾öÕ-¥žT�<+% ”Ú‹„|³3�èA5™µ½Ô¼Ï0¦P,Š@¸Ì¨uò©< Bl¤‹}È\F´Ÿ’3Á=<ó_Ö™0å’C:ó¶K ­ú—|ÖQØ·„ûóp¾ÊCž�oŽÒÝã.(-ú?>[*ß^)WÕ‹ç7åX3ƶ<®Gû§ø«Ó^ø˜Æi+™ñx!wÒ—1ZQÐØí_Ë ø¦™ ¼§ñœƒdvÁkópÞñŒ²Ÿ>í»¿fÁvøw*ðº|jžQ5}Æ8I¤²}ˤ3L®0yãjhº0;mZ�Ü“xm§ëm‰³Ê°?³»DH,^ìAŽÉÏÙ¶ë (}{ƒPŸàý[ÛQÐtwÌ׆óK•ì–&£#�˜¸ùV‹Yáå¿ßF@¿5ä_;ôо¥Ó=+س_vOÓV…-´�ZaxD`D7+ÅÚ&ˆ>ù™9ÜÑË(�Z,�nyÄv·1ÜÕÍ´¢î9b·0”úô;j÷vâ@ôyËЂ¦lHbûkJ¬¬5¡ËØGbRîChО5»u€_¨‰c•]ŽEè‹-ÚÞ¢¡½ÞÒÞ÷\‚Ù¢@��ÕoMÁº½øov ;ÝðPY{‰šÂ¥‚"âæ›PÓ:¯�1梇®É>W W;§NvG™º6Ü�Àiê]0O¤1ti>›h‘¶7+—líÇ'§¸[aƒ=Î3%¼Û )¶99§œ�%à?,ŽýypqJSË:MU�óKUk`¦®[¥Æyj”ÜÃÉ]±·ç´½¶À8`Šs]z/Ž5´L¨éîp7³±l(ù�{W³®xßC¢Þ™²‘ffÏdë…)†T�‹¬ÎfÈA,Dµ­´1’æ ·ÈRi.h�¡y ¨ÁZ纞²wb’xàKV(1¡ ¾[VÉA•Ì®-8ÉæÿiÓmŒIvŒñ„zn6Zö*˜°ºæ¯°Æ"çp=„˜R,U%ZݽµNÓÍÎø-IÏ›:lkº×EÄlƒ×´êBž, 3„ šÎˆp;ôp"û0Z›’4­Â<]¸ܶº�ÖÆ 0õݧ0±ºø½Ú—XfPC>ŒÍ{EOìiWM«í•àèݺ¿PY©¢kX�g¯Ž66�µøÔd«á�S÷¾Iõ.C[Úû|÷‚gÚ’ô/q¨ý;×| �D5ÏjhJ�¼¬”ËEÜln$Ôꜞ Ó{9:c0øyµô¥&»ÁO󾟴Ól±L½„2éàéæIï3 ›ŸnƒèEîñ¢ïËŒXrmªål9)š?FÆöÍùåx� Òà îÓ®°ù´sG͵$Ž0¸‹.ÌÚBmÙg¸^ÓÕ¬=ßíÙ’'F9½Àħc@!¼‚›#¿»�_Ó›áÚòŒYx×ÚcGØ‚á`¹T« !Iߟ^[æöRb> t×!Ö^·+?´åyA;qy­õùˆ �>(µ%²a6‘y¼ydsäsÖæm«/:ú µ|ƒ3B1”››ÆWg Ë!·Œ¥JêªvBXÇ0ý.åø[¿ë Ðç^ås^IR�·yÏò$ÙršÝw?t£ )öÈz8×hºŠ�î$çÝ\úæ¸û”|ø2¼Î²Åf ¸!@vU°^X]ì²ókÉm[.mÀcÎqG²¬ù0`:Ö2q±NpÏ…±íS6÷¶¼“Qè'Nu´›7^]©˜Èåz㥣–[åtF(èÙÕCRý�Å-@ü¹t“ïd8›‘s~| €Ø¢Eý�f>·ÀÀ)µì‹á×£½äo‰; eáô*œ3NÒ/Ëèœ{žšKÂÓ“Èû!‘À>¸·f,“|Y†7ƒ³)ÚÁWÞñ|À¨„_’Œ-à……Å‚žµ½ˆt*ë°wé_øm'õûí0ZeØ 0‹Ç÷~'Þ¹¨²`{l†¾hùV—eº ãÛ�éò>q áû¿<\P³p†½u*ÉsZAG‘æ³m¥2Nõ¾c.ß’/n†jq@œ˜BÙ5)»9ëÜM¹cÞÉó‰]¼u¦è»¸÷ÑóŽó’…#ÊLï øÔðï••9ËË܃É[‘z:ìý&} CýÅ ¤yKw¡:rÆ'�¦­~›]¦ø Ž2Ï¿|]޵ ¾%0Öüí®ÀX2øÈ—KjÄXÌî˜ûï¡C¶müä@!pÜ·Ð}æã’³hi€ŒLµ¬ï ñ�™H»ÐiTPt áˆõÖÍ b>Š!÷ÇÇ 8íá¦,V\¤WU §ý}‚R-úÀöõ§à¶’mÜfÛég€aÂ0àŒOê ¬´‹òÇ3õ�Æôp¾¥t¶Êc¨ˆ>³ÕDáÈ(wÃÊpºÇ±íÜs)†lžˆèt×ßwB+¶Åù½«ž�l#<+xùXß7|s°¸ÈK^˜–h{š¡dð è¦c¼[õe<Õõœ4;ûxVPmš^‘uƪÆ5N¦H»v³s¹»[ï�´5¾¡BÛé–ƒ‚ñô4ŸP”ëÒmó}²Ü¿}z=‰ó¢+‹ZªWÏ!6í[;u-äü’Ý7Âì°ê•õÖξ°k‘–!÷äŽ 1?˜òD!93øþ=È ã˜{5öRRvx¹_wí´g­ âä}øìÝ“¤y |ÉŒ²æ§ôàí¼È}BAƒ°! îë­Ô¹ñgòX‰I#êÍ&²bie‡›~qW¦6™@6í÷t¡ÛoÉú¯âžAc0•¾2|ÖÝ”µ.5„±Q¢{œÓ™Ãe!ñqw¤ ìј­¯“­ñó_}\d-䙬BàW¼­û…¥@=£·õŒàóº4qàQ·C�-ÁÐ�QÌʈ¥2v5Wa˜_\�²^µ‚­|—ß¾u ‚Ùt¹öìýàš_'û¿¥ ñmÛ‘ß y9O¡v´²÷åq3‰ ¬¢”}NŠ:—ZÉù‡—¿/ÀG'¦/ÅUwÈK7>+B†òð…rŠ+5Ly:¥ÑÓŠ‘Ã8ìÂue4ÛÅ{³ì-ƒ-î3Â2­äZ0%�z²Úë�׎NE0®~µ‹H¾„n B®[6l–*ƒ1€ÙäYšª>Ü5bÜð "Òë„�Às±kRËkjYÂ5‚K¹ë=€ }Ïj"ø_ºFß«zš,�Ê WÁ»o­E¥NúÖØep+…¨igaz+žŽ:$’ƒØ){ˆká|&W£À-äxäl§Hù÷CõmVΊS½æ«ÚËŽÍ[ɨÛ�¤¥X3ô0"L­5Ò‹3Å‚³ NÙ ¦Aí6ˆ ›D‰±Èî^/8›ÔH€Äñ%ÍÍ‹Ž’ü°/ɱ¼Ä2Vv�yÏç‰ë¦,b’ÚA´Fd$f6ùŠñ\Ý«Ë}(rÏ'¿XÎÖbØ××û~0ç%Á__žJ¡c¡Ùùú>ÄßÊð'][� TΑ+gy³(x Ö Š@±©A±«Þðmë„5­ió\5»ÇÜ�$]ÀkÞÚÜ{¦pµ—&`í�+!¾Ðð…P´d¾«°å¯¥kdö{Y!M°é,Zż߈VÛÒølk˜û¦×ÛúŠ@pçNXæÅï`>¦¦R¾k:îªÂ7¢ð›Ä—ÞË€Ö‹Bø&zpLÄÚþ¾ú®mÄ3S�ó=;�îÈùÖ_±üxÀÛ÷C›[ƒL ¾N‹;p X:^Av2c*ïaïÝ�6"²Ü»'4-çpŒÓmåOùêòA£”º…ƒŠZIné1³à(±‘s¡žï›‡é¬­œxof[k›á�¯—–Á<áT ‡1†Y=»À=­îaü2q=r䪥êí×_ÆwÀþ® dw¡ßÑt,‘[¨aÎÍør«=f�ÙÃïL Zl*�ܰ2`G§À©ru¹“¦çæß$zæaÉ1æÜOÙÚdØûŒ!Ë�ۦ˙Q;ñò)Ͱ-ol«1KKÌ…Y�ºN!blä¤&yËgzÈò�XÏ{DOx²lý²^–Ötˆ÷Ë:øFªú}¾m/xûõ^õ¹€"¾¬ïÕž� ºl<Ê¥ùvlâ½ËØ 5“,|*e"*Oíz(VÛµ°³`BŠv ù—Éʬ2X2XÈ|¾ ê¯o�Å“é ùõ‡³�Iô¤¼þ4{_(æÀaußßò96Fí[éös,ÍFKŠúšeøÑkx9å+yÆUØëJƒTKìy‚à+X÷u}d;qnÀRù j²PÄ]S¶­â�\âŠÂa#Óz‰?7llÑÜ£ùw_Á�'ýUŽm;’>î£î|)s¶W3œ_¿t§OÏscÀ¯›´·'>:zmÖ3bÌÝ»°Ýά¦h‰tî¹äqp[Ç8)ûòYài/§Z— sJÒEbº 6zhm×-ÿgo Ñ»`º 3D@‰ßjúÜ1p8zèÅE�X?Œiì*ÝvQ, MùB>0/¯¾’0{Ót]›»ðžñ?á¶ú�t–Åè1Ëågˆ“‘+© ª}à¶·¸A‚qâ%4'$$s€¢žØéxd Vü\›ñåÕ³•€0îsœæÚ¢ƒv.š ¼–ùghuÜ÷ã†!�î5pH7%E-e´Dü¤A&© Bd%�ƒ?Ñ$ž›ihè!¬/0M¡}¿SO*’JQ9¹¸Ä÷eU·Á¾4ÓÔš¯�Ïü7¬80?Þ•ØÞ‡µÒ° q›k” ˆˆö~víÞŒunRnŽs£“¸Ø7 ä]ÛËwáŒbcfEá&”± ÏN×Q;;“,ZòŸ_ëGî@u=ÒÞ»�sÓrÙ½ˆHF‘™ƒd´—<ÇvBô<»ÕpÊMûŽ]à-¯Kƒò- c~Ù„… 8ý>4yÄ;{[’yÕã ‰S·oB­÷ŒÕ¾ñ(&HÕ¤¬!¨UúÕÑúþK;*�]- êiri‘�§Þ¯§WÜvŒ¤ES›ç0Ï } eå®D3îÁÃ(íq×)àåÓ«­#ÐëA Z½û4·ÛŸÕÐïÛàr5ýj˜¸ØÈT®×[áùhwºSìÛ´º{,¿&‚¾èA‚gïvÞÄ{–™®�Âó›êB sâÙh@¸Öæ1Õe ¼Pó�‚Û ƒ³�â¬ã™¾4¡˜›E®´V¨”C7» ,YfW7WP©oL3Z^É,2[Àn7¹vçíi º_qkò…‰Ò-n·U¡�$ÜÞðÎ0D©£Ð§°­ WÎó&E„¦³tÅÙ’®ž6̯aۢ̆ Rˬ¾Ò¸œ•lÄŽqª²TßQwö6*Ϧ¿vÙ}�¦Îö¬žbȃK(ö¨í®�Àd3iTÞÁ”í¸ž*Xæ#<É àr-;NHÄZ´ÚÃÔÏU-ñvX,ç "»16)S“ë¢ÄìrýS-N�,âØ]™NwÊóh9«Nʧ¢0 Jx4t•±xc˜G—ëy}¬7Ë’óºb–tXl¨»BÙßÎ'é óo%2ù3©Çß õDÀ]ÆÃ„7®IAAA6æ<¹è ƒ¿)µõµûì5½¬o{â:JãTL¾ÑdA~ÌñJS¦L‚¦<Üökx)i±­ÙÛ @W‰J€“µ`iæiL��ÈHÓ¡½;oz †‚õ2¬3^Ÿ)eq •Aô:ò¶ÌŒ dŽ;kÑGŸÊ¸.Šg ›”HË»×BרÉ5!š‘Ú¿ŠÿÛ!å鈤ÐB6Ñ¥{grA’�¥rçߥ‘ÌìÏ $Ù<Õ¶¤/ÞUÙ^�‰!Œ1wšÑ&ˆ„¶Hµk�n˜³ðÞËÂÙžçxËVºµV‚·9œ¡Na3ýŠÝÓXºe .†q;&Ê[‡5Çp[pq¨¼¨ì75ÚAÅÛÆ¢Àö$¹±àu «Çæ°pËi2ðç¤lÔà¬äÕŠÕY¼»Â�Þ WØŸŸîW}ÏÂùÓ?€²›Æ}ìi4=‚‡¡¤#¸¦„A&6Ÿ�jaj#•�d™I%µä\¡9ðHVü ˆu“V]?-ÍØÀIÊÙíH)*›žAsnbΕ½:ž-qpÞ¨­…Úðw·ž³ 3wëc6­Á1÷¯:‰>Ú�é±åCrºÆæ/d&¿>SOÚ˜7ñ•Ó ?‰ŠNÁCã ÅÀÀ(—äÂ÷v“áÍ®˜íp÷u›\EªÒÍåc†GÄX›ë×ùM%JùöFèn%‚1ø;±ûnáèI ƒ×¤¿'w�¹7·³µ AëgY1ÅcÕÓùcK¦'ÔuáG™écWuÔnÏsN od¨�âÏÆÜô¸\cô«Ì‚cŸnÖÚ¾(&èû6YF³_�;QZ×a|2>.³s�xWZØa¾®aÁŒy¶#ÛÊm³±è9Ÿ{¸ 9Ϻ†>²aakæ]ÃßÞÆ££œÐ]ç�fÂÂ�Æ^ôÇ·îâ_>ôêü¦õ1[ÀòÏ�G5{{ÚB«DbèûÌ�^WëvzßQò oî3s6PªöAój> íÂô™†#©Ä˜hñÇàmQÀuµ1lg/3õN¤ðâ,u+@fùÓŠ“74Ç4vE<Ç-ªXPk@³ ñï‰)®TÈñ�!P45CY+öPë“æ€ˆ\²¸îÈò¹/uzò¾BK/eõû‹ä™¡öýthO;u-Ç_qáít‚Šœt‹±�%F÷‹@áX3sÃEŽú -’½;ÄôBíPv´‡bÓI’-Çc¼PØi”ÞÊUuv±_xr¢ù_;Qâ+ŽEp¡‚æWI‹¿åõßvµ�Ù Ál¸-/ìŠ(ÿÌ€0¥¼åƒ‡®¨ó‹8š7H_Â8€EÅÚÒ}”Ía®)�¦Ë ž-ß—P/ül¶ÑÒ߈�DÈÀvvc�-€Q}´Šh3q0báSNk¤–ÃàkXAž�|¼R蟄z·™èa÷/ŒçŒ�Ø+oZeüœ›ûŒ�t1æðÔù¯%_4à bKòÔ—e“…S¹ké/ÇwºÄ�QÙ:˜¡oÊ´±UópS‚COŽò7ÜûÙ“uü<®ÅmÅí¬1SƲLñ‚ýüø> *F 9vÅ(m@Ç¥çª6¥=y¥ýÓÔ\½ï”²Ü�ÜKÐÅÜÔ8hIOUú4¡ÓIãêò«6m®ß/[­´ž£Špej¶ÞôºÜÂÒ…æð3XÏm¢Íá°µ.ão,œX0‚2 ¼ÓžÙ]hê}ñcm‚zÍ�D>­Àiìè_– ØåÑ/n.ám·+9hìG{-žÜ0Énµ¦Ìe�Á.¥}{0£ ÐM¦°_¾³!p]¹€‹w/†b!11tÕ‰w_`%@Ÿ¸À Vœ}Å>Nž >ä\{AÇòn˜ÖÌWyTeQEi"É%…¤CðÈ��W–ï1ê¾ZÜ}öVsy/ gkÅž÷1ï�*eLY¥r¢ëñ Z�à¥Âr*m™‚ÛBÎëÛ¼È>ø¾À\} íÈ”v•¬–ñbL¹LTÚ}Ù»~[­¥C¿tÛ°š0^צ b‚l$HaA¼>œ×_^ðßß‘nãÙà¸Å›¼�”žÄ5ú×…ï�×Ãìkd}ªÌ¬ç»d ˜ónÒT‚„xZú]‹<¬Ž·Šl ƒŽÞØU}E�ßšqìÜC Þ@&®$þÝKg¡>¿èYàM(rÖÈm×õüž¾Ô-bîò¦mÏÜÕ ^7æV1í)“ZꔕMß^W#F_I˜%ö—�dŒ”Œì©ƒàµ(u"ôHü>(Q)˨®Ø†zŸ€0évÝULc¡SeÕ¶?^4TÑGXà!füE¦äæ×¿}Í7ã‘Þs÷m¿*ä2Ù-“¡*ô×^ïèa:åòwž»îeýXü_$¼ œêÆn”yü¤u¬ßTsÁ3™¥®­Ã£5¡ÈR·:l¬‡Å­Ž…³%‘êblY/Ý6_>^w v”˜Œ¼C8'?wçLƒjÔÌD}=ÖUвdµc¤j´ðýøBÏŽœ€�z2Y*yž)èü—o|œåÀâs´Zç×+p¾PI#�gà:kI0Mω÷CÂó­°òñÜýzº±é «žÞ½÷[aÏG¾õãL…}uœµ¶¢ì=½<•/Ùú|Þ$ýruó»&€#¬»{àäþ5ÃU*$ð¢â†ß¿.mßéõÝrV¶� Š 7-ýø?;åK9ÉFû65Äë“n-/R¶2֛Ȱ99mZÖʽ³Ò’P]<�iâÎ]¬W6ëmÄ\*®Ÿ��ã~[¶³¾Íè™så[,VÈ0[ ci¨CÍ Må•›$†}2ÏÊÿÇ[M�R§£�B*úÄ9…Ê”7p;*fgÍnÛóôÖŠz«}òh.) *ÌÊ›]‰Û*—:¼ýóô+Ô9³ô1!Æ‚‰ÇèkÃvþþááVçÜ¿£Jññ]/ã& å‚ÒñƒÌ7‚È�NR Þ™ÓÍd&‡>ϾZ`粺�›k½ÀqdrÆtÅÅÈ`0×B{ÚÉãQ)gÝû£¢Ä˜yXÌámõ¤ůƒ®%ø`KŽc¨Ó[&ªZoÚgºÌÒü}Nt<ÚSKÉÌcpœšªD˜Þí ïyb'W Dª"šá(9�:YoÂ<°@_ä÷ßÖu©¾¹}<ïHu,tA1¥p¯ì=uÆ‚E>\Ðs,}„c&¹QXUhj`ò+7õ³‰kÚÁS»3nÀ˜9Ñ>öù^pÂ!k «’ãœ3¹ºoi6tçÅÅt4/t|Ýšª:çFϲºN'Y©�§Ã¸^fè %æl%†0K-†é5ËÞm^µ›¼ƒ¶nAÞïÔÁ¶]k~ÓdL+ÝÕÚòÖjÎØÞPCL¼ÈÁ>/$PeÐÇP2“œ�¬šT‹ˆ»ˆ}çÄik^›£°ìîÉ®X ®{ó\\I™3¶ƒûE�iµ“¹ƒ\+ª42Îg‚ŒX”01Y…K¯g;¼* Z+R…E¢X•ÃÞ’ÖS±]L°X¾;]§ñõ^ ƒ!é'¾VD‚ ²¥ÕF¤º |&º©ÇCÜ+}ª;+0}K9µl0Lľ=x§Åp¨+Í2êeG´ìÌ )�UÇÊ´¨›Oˆ}?+ZÚgcbH�’Ø€7LŒüV´ÑG3ó¢Ô1ŸCMgõ6¶Ú~µ¾áE²ú4d]Pe» }²}n²³!ÙÁàÉ¥t[z¸Ù�%­¸†>-Ï58Ï�¬o´­L›Yÿ»º„‚€”NTdþ)B‰b‰ XŒß,8CC$åÔ Í7­lø#ª}ˆ,áM¿t‡ÑÉꇤ¯Æôµ‡çƒÙÜ |ÒvÀjl7é'бÎÄËͪ-Û’ÌÙZ2ä˜>†Î]Ö‚ÆeÕö¬·¸\+1!ïjtÀâÂá±Ð†ÁÁm îl~ëÚáž›ùûûUÀÔ,äòÝé$1"†²ÐœS‰[¦ßщ•Ÿº||j Éœñ�ã?oZèuP¾¼X(W$žÎkÊc!¯`AyꦼüIg©ê üX·´ö˃ëÜìL³ å¯hw–Œ74¿Z‡ç+�çæruÃd´np.ÌZÞ­Sž‹?ì"ê2›}]Ãî~PïÒùKèa.¨àÔÈ~ðjŽ,ˆ€c#ñØv÷H€2úmg 5“¿n«…JÏɘCû ‡cØ´qŽ>r�¬ÕCANã€v =É•‘—0Ü•d¡-ˆV¾Ä;�³epÀjPIíVÃ_¶ C_�vÆœ~›<,„®-^ôø}v8Ǿ˜Æ¼ÊñÁQ!j|ëhÙµtÝ(ýz²ES¹7ëW*d-Bî/ÀÌ—ÝY̤í�haHá«�B3™¶•lèDÑ–ÁûA1Ûótü“õ½ ±È{ÄjÏéS,’"þ_[ÖÏUó½dз|6Hð¹°f0\»bJ5ÏÕ©äéÄ6@çêºf›±œÌ:“ Á îv¡L÷»¦²;–MâÞ‰¹‘ÓY¼¡ÈéøRƒ¶¾Ok¢bÒuU•yÝ[¬"€½ŒÏVéÞå·Ù,-dªðrZ¯¦-âû« LánHl÷òoí\1p.Hßb$Û?n?XaÀí�†Cm&-꩸ÜçÓ4ÆdؚŃžÑÕµ½äy¶É`_ÖÙ_IÀ˜ŠÝÀÁéÈ©„Är½’ë¼µª:¢‹£ˆÖ)—~ÛU€€\7�æo‰Ç”;i¡‡�¢â7·u âb^É ÆU2åÒz;¯ÏKÑKi±¨Ýïeò´Ù©ôße®û’£jç.ù£ìl_|¾ù�b”:JЮsƸœ¾ïŽà¬å]°JüÍËG²ySb:��n‰Œ 0(¿öÍ lv;EXZ €!Qœ¿ )¹É™,²ŽW‘3¿žz¡ŒZ‡¶��‡å ­)ïÄèáó\]Ôßð~Í{©Eõþ aæÉ&“F“ŸCž%¶y#©ûhW@¸�GU­,“‰KisxÃSÉÙêëô#*sOu¹�äíˬ1C™”-Ç2ZBcºml@ÈVxEAM:ƒzy¢L¯1u»‰ÁÂ[ NÜäï¹ ¯ ±Ý‘idIr¶¨ä45Ë€¹Y¬cŠV G‡H‚Ól™Î`;ȺæCÚ^܇½^%˜×Hââ×ÛhMKk{NöR�!™Âp6Ó–y"Ü�Fj†ÖÊÕʶR@Jn¸F¿[«§°€‹loµÖÃLĦ¥'|.| ¡"í ,6- ÜY$㌷¨Žq5|4…÷C« ms…Ô$K+* ¶Ñ‘_¿²¬x%êÓ ’åJ2·NKxÚ˜Q‘ÞA†¥Îƒx²’F,½Ö3®ÚhdžÅfPœÑ¦Qæå^WÚÉßAYç¬Ûí§«O‚[.Wƒ¼º¾Ã´fX øÃu" ÐêÂa±ü˜2(vÅiç¥ r‹‘%c)=µ*®ÔIAfÇ0M¼VÆõŠLXZÇÆxçy£ß_¶¨Ò6N0«Û=ÿõþüè–ŠƒÎ^1HâëÜU™ƒó–å¶ÛÄìZoyä à(ábŠ9ʂ٣Ä’�b[½ð]ÃJ�1Øfú峫^§7zÐFí±g8 ë\ ßP5ø1e2èªê9)í«­x,C¦‡Knt¦W#v}Êèt/Cx:B·§,ÒÓ.÷åÖ�ýøè“ÎGRÐfº7yyÀzuö”ɺCX¤]â0[Žeb�é-Œ Ó©q�HoËpƒ^fFÆøÎs°AV+P ÄR>Ib@.Öc_Äø–wSË2]±¤7ÙóyØ&š.T{íÑÎâhP$ ºHK:§7mµð;Lj,± ×) ^ÞÞw�‚½­Eé�8ó{Ž:~0zx)cCx®ôñ‹�Z™ïwÖ0÷a×ò@_«U]k¨¤ó+C˜Oæî!ðav+Ý®ÝC2€‰@mźÐw™¸>IL p|³›Ö�Õ|ÆlÓD9è‰~>°Âm”±¸9Ðo4ت’9‘Ø`ñ¬6ôßJTãyKŽ‹�P’«)úõ FŒe®boIyЇk!¿¶úÜÂØ»©ŒÏárË£úl¶·<À³õIIKþA¾1NowÖ§Ò¯¡s‰Ûl߸ìß–8ùæùçoÓ~¯Óe],(]ënmƒ¸œ~J¯ d¹@†bs€ž÷+ÇUT~(Ë+>Ð Egy�¢ËÝð‚z›íîœÑ_²M`¶"*»ƒa (%•È%Ѭ%“oI©Å˜f£‹S*‡ƒáç×I8â–¾wéjÇo½ÒÀ5TC[€yû¸³-�œäBÚÖaA•/ºÏ›p«®{§Þk@*>’½6ëŒ|Äœ–!öbb¾·�†Áx*M—änk9]ø£�­»¨,+@w8€Š†�ýâ¹Ê-§—lµ/‚òœ-1° “Gjœ…À×Âo͵âәȱ�áoìaR�\-©›¥’ñáN6�Rè¢YWÒÝ-ËY)¡&�Ó¯~·Ì‡·ÌÒßd~ïzIœQîºü8â|\qÁ‡ÈÔ])‹�µ¾¶Ø½Ýòpúúãö¶8jø p3z¼óOŒPŒ2Nq§Ð’øœq±Ì³dWÊÀÔ¿ÕÄÔ¤ì`LÛ¨š/m>ÙºêŽêF{SflSÙŸI6fxJ’-õ:»Öé:|}¸ í3hµÇ›4ù5˜ðãw¯FÒ ûNj¯„�Ô¾Š±õ¸(9î DCõÚ­ÍãmÉ+Zê< –¨nï�}žbøSÝï× ßlojÖóì‡fÖï±# ÖKƒÜuˆ^{jÀ2päÔŸ­w u]•3¤l¾P›É‹ê1¢h/Ò,RŸr­vÞ�?,�ñb>öüçp&YˆÏ "s OÙ=:Žã/kº&æôá,Ѐt97߱­”>�ÛsykòZ`²öà O þ›p¡jÖªr3Múaˆ›ÓŸ”PX\Œ6 §îVÝÇÚãXÍå¤íÉ÷÷æ-2+8Ì�xúØ™„öOy2ã¸b²5p£ËWŽ…•—‘�> s¸+I]sp„-,Ww‚!úTÎÇČڥ†È÷æ3uAàS\¬ì �éñ³`Ï•ËX½ññÓÖò¥Òø¾4dh�OW¶Z›ïÏŠ­{`š ŸÉ6ö2›M�ï‚A]GãAͺ¥ÖF1FƃeŽ·¯l ` ª„�‰Nغ%·ÔƒÏ²¯>‹.ø«nn½y�Èó¸L“µó‡ž2~uT·C*:KËÄ$?{�?´�UAÐêWº=!!Jvé„ç˜<|×â‚i:mF ,9P¼”qÕq†~C )‚=>»Pydûƒæ ´:z…TVÂqÑÖJ¨·p¡ CÙ–E°Mª¶´€Kñ}ó)â´ ‹�“¯šÉîø>\$Uð¼e³Ñ#Èá÷Ë•¤5~ŽŸ…¾ÛØY‹Öí:ð-TZäÂvuª¸< @±�rn#I¬-ui\ùOÚ`E!v>ù�“ê÷§÷½ôŸÎß|+ís¢�?¦‹©¾Y]\·!8ŒZÉ.FVèÅè>gMÈw ˜è$ýݯo™¿Ì¦àWgÎO‰µ¹EÌÔwÍ.^oÊÎã�”ø1½jÜ�ì¼ã 6­H\p·0…•b mËo%Ÿ! IöÞ?—Å[~r²ã�ˆIðÆñoÐ8éÂtÕOíín ,@�Jâ„ ÅR(_âÅ#²�XD0C ‹Ôm¯¯Áv÷0Y‹U«ý•}=Ž"+]0Þ?€’†îÁîÏö뀰±˜or-VõâÖÜÀµ¼»G õEï{ar Š`[æ¬né^Àª‹…|m…ü{qUqR-à5~U¡ZÇ€O#`5[ á˜Uš"©cžqN컎Sìw3Á-Nu®¦‹œAƒáá±Ò­�h¤òͲ˜›ÚÍnNcîðÑ—­³Â ðœ L•xéà_³¦U“¢wXÃÞ:__qm7µ iî‹õGØpa0å.›Ÿ>Gìõ [‰ë'»à^› 誤Vùèß{€ÞŒcD±/½!�;k¢8mmð�ÚÀM¸‘¾ÎEõüþÝŠîâ�ù¯ùˆ …x.Д¹aä0á€Íµud] ³Îù× Þ°)µsö-v�FÕ®=_¯=UÉPíè›·1»,ª ä£(¾öéøv\3‚¯$ô¶-gç.!¥e‰Tóâ6±ÁÏD]ÓBï9@écÀØ­-…|(ñb6¶ ákRaϰ÷\f5mŸÛï:Ò—ªKá~êa:A»C…­b›JYÎ~΀›.¾jŸ`-ÀG_8a1Õƒãb&ú-6G£!»qJŸCê ñ�žCŽâwd!(À@ Öq0÷!éËø—ñoN ¡­ÿS^1ߺý®FŽý¶î3f.MðU ±$ìÌÅ WÑ1w ¼`XMáäBû‘<Õ3�hväœ,íË„ÞíÚzãŹ„ذ0�HÃò2òãý®×Öù¾çá‚-óPÎ^›¥WÛ¹b¡àpjê¦áœÀbþØL l/Àlº¢|L¹ ŽI6Óº¼‚· êÌQDVJ|ŒÁâ…ñXWw®: ‡\İEûêròaÒ¿­%ÜRš�àÌ2§äø�N†Ü YË 2) m+Q0w V1ÑÉ*^.Â6£0í˜3St¯ÕýL¹0^M¡fS'R¸qfk°ûŒc°€Är.¤¸ÚÕ«àvó5ÐÑ<.�|Õ}Ëi«o.qK±™DëÉó,!·§Ét€OuÊú.!¯«×2ék¾N¶§èÛóó=_vº:” ˜ëÖ¸?�‘”~ ºœieþìŽ;Ž‹ZZ²ûÖëm]t"“}¶`œ{ñá:;¡ŠJ5ZÙ486æ·c±ö;ÕÃH65y¾²8ärã%ÑM0# —Ìÿpœam´nJ`ˆÁÏâÝ­ã9ÜJ¢’­ö½ñÙø#VéHP3á>L-À*ÓãP/çù.N{¢±ëbŒ_9“ýbÆ¡Wx9+h{?Íz/£r¬–N»Sý Z°Y|¨ ï`VðÏÖ|wæÜ©Ëθ¶�¢ë�Ï^3¹ÄîýѰj“Ò¼Û�ÞÛ,¼¿ŽŠ÷'¥¤D¥ÃëGÕ´ê´\…UÍë:…{:&\¦ÆKp^`÷~œ±Ïðj¸W|6Ò� ëzâÔik2µO¸+šæ qZë¦@m�ǘ9^�3)Ò±ï¹hÕÁ²¥KäÒ»¡´ì=#MƉ;Ô¿ËoÌXÉI `º·ìŽÜ–¥a§JÔØÓÊm°ý¾SuÊû°>›S™(«�Þpúƒëû\kß$$ÝØbê½u 1ó$×[\Ù^Ý¢12LØÎ7Æý‰w̶’¹�ÏjÚ£°àŸŽ|»bþ^èU0/5¥Œæ›g•Ç Õzå�¬™OvÌуL¸§¡´ðxß[æ¹ï÷—qÀŸ·âµ@qW,w{=‹V0ÎÏ· /3¾sºóŽ®æa<XºN1å¸=øR«ÒËÇÀ|›è9¤™ª rŸµõÄ-š„:Z¿•2åЦj9î©ò�‹‰Ç¥�6€»áÖ`ÞÍÓCÛK}lÉ5ó乿¶œðwYW'P·e�^¼gê¦zýKvÈdôw�û­oo力ž~qÅ—;ä“kž¶‰›–Zm 'ů®^aö«k�ºˆ{*ƒ%*kKÖbØ{�Õ¾�j·†ZÁlè¿n8u¾Ûè°:¶­åo]„7–ç{)y�!’®8¦qD³‹h Ã:»fÝ ‡-Ü�œÉ[µf¸sd$ÔÍpŒ+!%~©ÍƒaŒsXEz΀Á…ÝÃd,T×âj×€‰|»ŸÖ >3ïG 1å«DŽì÷ècFnÆeE­ ¯Å’UBªkkDTžxÏFZ–ë‡ÆÏM ‚›ñ†BÁi�½0¢Ö=}=Ï÷@ˆ-Ž×«Ýo¯'¿·C üñÒß¿¥5�€?±?(§Uåmg0Eî²™þu;pÁ]®Ê´éߣP�c݃.vUÊÈ0z<À™Žuö‹·ž6Îêhr@Ç✱h%Ï2ö%o£¼úÖ€ÊéåÀÅ›ž3Å«íÄÑ©ëd KÒ/†P›6«[÷Ïsv°ˆÜ³”‹º;éÅÄçZUU}`ÏæP\äK’GkS§ ;�ƒŽ�@#wîƒ Dsá¾âoãëûR¶U_�\vGg¼aÔ S…ò Ú6¸› šS¥ÞŠæ„ÒXêi,bQbe‚c»›Ž÷ §a1–á×{ ɽՎGl|ݾ鬙ÍXÌ05܇1¦—1Ý (äËO®T·À†s1°kŒ�«*Góï– ­,íϬöõ Žz->l‡*€eÉ;ju|‚&êM˜Ë@Ï›˜UZÕe„ l€Íy÷Ý¿im¤ Ñ„ÏG­VHMVF¨Ü£$fgUÂìLMuù9‡yL*–ÑåÂÓn2!1ˆ­‘Ñ{˘+áÑüLF ÐÍCš ™{@3«,ïW·¸Kl�R‘$õ7JU¢'THÅ‹¸ÍæÆjv�™"€S{‹8HB’Bv$ÎÛmÞDJ°y”ø4YP9îñÕ©•aMh*ïCÁn™ê¨1Á¾AóÛ„¤ê�Å+³Â 4Ícy°lÁ³DŽ¥öמg’YùQ´n&oÛW>ñÆ�29dÝi]ÚEnTÔN `û£ ÂyÊU¥û®ÄÏ>݃¾‘v·ÃìùñCêa÷ÈŒÛS°åå¤nØ -,c×–·X6p;æêH�nIh§2PMf.+o˜Emgq½¦ÄeŠçVȰJ#…sÂÖl2]ôpg–Î7i0gFá–rJ³ÐãÑÖYŸ3Ìß9Œ—â1©Þt0¼‘W´ƒ_¸=%ËhéÄŽÐ?'®V]éÌ`­ü«úRqÃYå áBßÜ]Úþ¦6sô)Ëöè)¸�sM‚P»Ý®{\ïzJ¾×¹¤%N O&~—._ÇŽ0Û¿tŒÒë;õæ±¼3ÿ1Žç×'ù€º‹c;UáÚÁ´:Ÿ†ú»Ü-y ‚C·Â€ìÀ~^¥rá2³mFÖm öÄŽÄÂ’QW90Û Ùñœv·7νQòW×Pº­x3í‰ÑÍ¿U>4Y‹ÖU&äú�³6¿(Ÿ& ™Š+J7‹ƒ´d©2/cɪüèsìÒ/t°L\ê@Ì]ÜÃØ¿ÃVÆefþŸÏÀuFRÒŒ4D‰“–\ìôêÐjnA!,Ù7M¶Ûgˆ¨›Å÷ßñ¦Kf1Z‹óléÎÍÊû ÁWj»Õàš{ôš-ÌÕDçŸîצý²±Þ©-Õ»VÊ póžç6]µ«˜ê~r-]3 dKV¯¦7L[�âÁRR›_Sï“l3iowÕµ¹Ç$k@oÓrÖÅDw ƒ²ÐZ¹ÃNñɬ)kxRU9rÝ^‘B‹rNä&É)! ¯?UpE'MÒNó¤ë!0•”Z~(2„®0Õ4ÓÊ] à‡*ÜÀÝ7Bã„b±�kØ]À§©s=e;¤ô,b“`t¿Û[Ån¹`–*ÔëxÊH€àü©jbœ­™>`s=|[—xMП8ã–ÍwXö ß½’%j‘×X,7KÏ®ÝÉ–ÌaŽüĽúU%tëiiK«XA�5Ãwì•9ªÖ“S£Ë¸¾Ï�mÃi§!€`Ø.Ù¨)bˆ¶u­þƯ*ÛŽhxÇȽÅ/Fj ªÖíð;BŒll?T¥½ƒ;]ÊáãD·Èb=Ü¡l‚/…SL2j°àv†Ó:ZýN ‰ŽeE‚׌O¿AÙRM�2ˆÉ—Ä­¤ûÃn͉±"†GjÛð)hàéhj�h¸œ .0!heØwL·›VC±Ò ˆ”mÖgGkUå<œ®à8O}Ì­:t$ãAÞ�ë Ê³90M–žG¹<Ì›­0ÿ¯#i—Â…{xò³†nOm¶ÕØ8üh�H_WŒ}|ûeæë%þœ¢7� y¶ˆÒÝ$�a&£pØô ãVR¥GZú= ¯¶<ݽiZ\qfØ¢`»B�¸õÑIr-œÀaì ôÍ‘\êϦliˆ‡^3�8Ö’á{Y‹g¤‘Y…0øÛ|G¡"&(,Mº´­X?™-²¦,tøcŒ)äâ�ŠÒüÇ7®5º½ ’åî2=³°’ˆ¦�µòÚƃ8¯µ£¢a0Ös0b2Áx¢”_¬á´ä€Ãq%?c?o[Õ&[�–+}!œàêÊëà§,hF¢c¤œÉ_sº ã×fš‚¨¼Ï5?‹¥bÎgºL&¥r�âhÖµ5äò?cÜköAõ»X3£üób5޾ü�±MQ…¾¼¢Ø¾žžPÄ_¤2 *y^>ømf;WJÒîkÞÍ2ŸË6^1nR9Ss&H:$ˆo–.:½`ñõâÓ�w³˜0ÔrxUíMdok½¢?;/åO**DåóoM»À Pî¬ç†�yd UΖÖw©³í2Ðj —Ъ¹¿~Mö§:+KR‚gƒÐ1·;Ö…\3ñ¥ê‘EÈ:,µ! ‡ÖÆ2Ðf=OÛÞ¸|O�ŒF òº++qÒÛNù`©Ìƒè‡ãl—ï0Éû/eD/d¤ ˆùJÕ}†x´5&ÄB‚woE�Ëâº"¸i¶b×€fÑ>, `ýà. Ò;NyÊxˆ¢%dyȦé*6Ç÷ÈͼÁÙ˜{¾¢óĹˆZÚEÚ‹sjèYÔZ)Ž ›_‘b;85öEV“, bK¹•ëH¸V’$€”­„ª¸Òz§8 Mî1É8[�ßSI²—{„åƒ{ ög„å@C‚,wàâZ¼TÑÁž°3éñ }Ž0‘`úœR_ù¶vÙõüw×ã°O×/zyæØy-ce&‘ÚП—ªRÈX~̬ANíRÕ"Gò« Çf3Ÿ5Pe—‚Ø/›ƒÔÜê“)I/öÇ̦94Á(üÆ¥aqVžDp²ß:/Ô×õJNúb:‘ =ß5†Ô4•‡âèóRM„G&ØÕ·Tm>·bÇú.¼t O…»¶W&e ]Ùf[7$D¶FI,äS뎼D[Uæ¢Eë°úô=³³ð^ BwÒ ZÓ/£ÔÚ&Þ ÏÖûÉ`w»%Œ5!&f•�åG€ÅªÍžÎê\¹¸Ú½í|ç!ÜшÖÉg'wŒ�æïƒ•��¾åÄœK®ûç~%ÈÛŒgÜÖni�“hZ‡¸ëŒèJÓŒ¿b.†ÎHP`Ê#Æ;�Í ö0h 娏<†$ã¯Æ#˜sôòÉmþÊîS?1mŽžB´vÇуÛ:YΓj÷V‡®»œM¸¢"ŽÇ„Þ®DaŒôÝŽôÕ}WQ\ËÎ&XZ*Õl­Âª? ÝÅqʵ} ‡Rû¶ÂŸÚp­Ìbùs`£ Ñ# ÚëÈ´BòD…3:P-›@|æé)‘ \L,´d/¬Í3·í1šh¥�í@æ0YI)>Ž)þ9w0ßÙANWPêÄIóë»4÷s™ÐI|²­U }z¦d:a½œt5€k\ v�¾j‹“7ã V_’5F»¹ÊöÇb«£¾›oR‚é¯åY¥èß{›™¤‡›× NcéQ²IeEjÝ·^úey>ð0YÁºÉé~>Œ…븿xç � ñš–äÌ©lÀ}w|²vÆYª$¸ß(Ùí S(]@—#<�Î6²Ù‹ÑëE©†Ñ<êËhoï�ï û,à 5$ÎÜc/ ¤“ª-«‰Š�îþk‡;î;zìÎJѸ>öç6ƸÜUas­†ÎöR¢sÃÈAÚY3¶ÀÊ×Äñg¶”ž�ÞÏ,] 1J°‘òŸsìè{4|ñÝ81{ŽwDŠ–M7Íp£ê¦0ÓêtmaËž ¢×«Ûöf �Ÿ»ÇKU§ v9}î›ìë`Û¢Œ^˜ˆG3ƒB­S2HïÁÍ'7Ç<èqú‘Ή`PÀ‚å¿Ì ¨¡„-à…©æËrú U{\9BŸ_Z´ú…×éÎld”ñK½h5¿Yº×5 UŠÿnàµÖéÏÃÕ?t’¦%ý�FeF¨æJÏ,iס›‰ûÛ4ª†N‰R`� LZ6Øh�åã *Œ3ôèÃMê «jàÚÃ0�Øh$*Ou@° al®qZ9™È‡)¿ÊË}6n>‰¡‰¤Ø¯ÜÖÇjÉ@ôÌ_’­Zч3²f¾ѱà‡’¸Õ¾™Cãä)|éaó>ÊlÅpo‰� {ä§-åëãhYow./( %ÏhÔSgª�±±a�àâ�Øn»p!Ñ�ÁBJvÊ’|'ñº÷÷p¹¨r4βø\†fņtѹîЭ ò¦?¬›‹gûÚ·v•QÁÐOл+ ‚ u-o;ŽAs8¯‹×�J×OföEu »¼õ væ6×´]»Ìç¡bÀ¶N»æ 4‚ÃYzÝáÏqd�Þu¬ê=´í¾pôf÷ e¼˜VÚÆRÑE°`@›Òò[Ö�ØÕÝ—íÍuø0ä#¡†z³Ÿë áÁ é†5sp' Øt³Tึdƒ‘Chij¶¶R ®'sFa: àX€ê'QH¬YÜtò¤7~‰wIKª¾åKŠjGùÁÒûÊ©¨´Ÿ’é•Iˆµ·ü¦ÅORùùpd!U@F�-~¤²u—6d5° •ïa[ ›ÈØ3D[ñ1Êû«OÕ€}Ï]1íF¿{Ú´§/”ªË×`Åpyî³w?ÆÌz·^l.™@:´à-ú.P…s´>/Ô�5Pä×Lg$ìP×FÉ*hç±Ûl›âÇȇ,YTnö\ì$ã ü´w±ôä/gl—v�1켞+…ñ¨·aL;nÝüÅÈ£l+\TÈQÖó‚Ý308ìïh¸jÒ¢šyõÛ9 !O ¶ËÄŒÒýAѯÜ×�²|Ð]>z° ­!£EôÆ~ÕW¬õOKÆ>¨^>66×+-ÁAÁŠÆ¡sÎ}¸·¥·6“pg—6°'UL<7WÖ¤LØwêÞƒ iƒ‰éµ’,çÀ…..ëSÅQ·D‡AÕ-[E˜æ‰0Å�‚íŸSÞf§¯öÀöŸ^ýï%|âVŽßÍ6TÆ‚±OÌ{È_|ðñ{¦½‚��b×\l5ÊÁå¾u«ÔâmxŸ°�ìZ¿k­º Õ‚ \¹“Õ°¦ê¤¦€a5'™ì6õr´™!aŠŒ@X…­–+E¥ó»Ì U"†Qò5»Hw˜ÖóWð»Æåoï.FPÛ6¤[­Mñíܤ"Š„KÁS¨µ]ÖØÂñ„-tb+ysãe|'Ì¢‘ö‘¼z�&–‡#"«&ße)¡z*›lKíºÄøs°Ý³±�«+Þ‡Ëü°,>Ò6 7Wz_@0}wý7ð»ŸL‘>Ž€@è÷RÑ´ü¶î胀™˜\¥¼Bƒ�¢r§`YOq'ÝûÖØã?jÛ7;ÃŒ@›»‚û:fù´ô#b�ˆtÖ–]‚BL ûOX¯Ë\m Ø´ _ÂLHk—>×RW3%¡93’>¢& )_ Ë`G7ðƒÅ)¤³Ù6š¤ÊVq»I¹¸™Û™ ‰ÀæEHìª\3�‡Œ€Fzë*…ÝØ7×Õûƒi~¡êJ�ÍxšrÅ9 nˇþo‰ÊÚ›?€"ùâüBŽô‚²ñ�ÌUw>@&Ç�+�¯Ç×-èYƒžå·Ï1àZÒ£¨„:4`ãÀƒz¼–ônØ—I¿ ¡ìûNvÚ¨]*0kÎâv%OÌ*sÌ2aU¬þøå½}ξ¬–ökóq~Ü}œýî³H]iÆÞÿQ fêðõ,-U�’iS”ÖNµ¾’Èt§Ýô4ë�Üð˵ÙÿB8.l®‚:MŽv̘æ õ‚D|Ì„�Øp }ÚØxM6HuÇèJãåqÛ4`-TÈv0`QšOGÙ¬aϹ2�Ò2!"öÙWM­2HØY­©rù3•¸ÈCÜ qwA»›6ú~„æñ@®^3¹kê°:Ÿ¦Mú¯=q¤úó|™êÙÓ…·µ«ÀÛ\öëœi©�†~EK(d¡°=½í¬zbÙ¥­U¥†¨æqø8¨�] ‹Û¥ehÎÅU)í¥ÚØ�긧LØ ¹T5ÇÆÞ7«é’Õ¦pCxå”,½sôZ lÖÖ­¿F3ÜC¦ÜHþFåÇ=§2h4.e çáTíÁ•ì8ÒÒEÇÔÛ@÷ëͦñ‚›¯ ¾´®x=Ä%ƒˆ7ˆgPÖÆ ¦›"ªýº jàùW¤‚ñßrkÀj&ðÁ†ôíEÞ1�¦9¬JI:ýrøC3ÉÒ·wX\ð lp‚õä/‰y)æW$YË~ð'^ømynë~'3æ2qâoï±wtWd èÀý†û§–ÁZÉ´vÒ2ßlì¿’{`³£¡ýµÕ.R$ÁÃLì¶!�0íl½á“ýÀìþâu°ê&®I‹üÚ÷–TÇ7®ǃ‡Õ9.…,©õ²ž½ëSŒxÉ�ç7ËÚFͺ(µ\0kˆ*.˜?{Ã@°Ø»rCîuÕ•³�6bSˆ—$'ííQÙ­m²¶ì“v?Ov×Aæ"ªjÜ'Äl¶Ê2f±«tó¼4jNU†.º,¢d÷»éK¸Ñ6ÇØN<¾͹·6½¹`cdåFzùÝfH,ðźrCiÆãƒ·KJHÚKkpòŸLm�F’¬nÈb%ž(-¢hö‹øYxv2&‹itßMÂÎ=lWí´©ÆÊâck!&tOè 2 D^‹=€6+½þjµzp½Zù½¡GÍ †#Äø$#]ÖqÞ‡¯ z,]stNw¬|Ã; e÷èx�²lÇ:É4©ì‚a¿ 3Íå÷}¸ æ´W˜p¡3c’‡Ì h1;EˆêV�•óWµ;\¬÷3¥3H:¾w("ÐJ›~O9–sÛm2ä˜]Õ—º��žjCt2² ãTŠ,cÜÂÝô*å�¶{&'½ô.,|“¶«·Ä‘wj·£2´8T`ά˜±oÌŸ%¢°³±ï.ùðm+«ÇÚð“³Üg 9î?ïÀúD')Å#€k>¸34#Á²äÜtëv‡í:PDؘ.×$Ù=±jkù­aöëøùX½«§ Î&`Òa|X;ƒÉ ë÷§ Æ{4e�ò§Ï/�UÝ;�rXj¶«ˆ¼~iÏ Æ…¡1Bƒ {ŽsºôÖò‘ó�„‘Œ1RÌ]VØè nv ì—Ûí,‚õf§âÁf€¿\6h‰\\w›çƒµš–CÎr}FlµCñ»Á,‰F¯¤;¨Ùø‰¡R·w7ûÁ¶xÒÆRQ…«^€!{ÒÇ»¹st#n?¿5¼ôûk•™rT!–á4Ñåך w"áØ0‡{,ãcRÂ-e[Š>á©ë˜ýzÀ„2l$ó£Èå(MÒ%t„DˆÍå™Îו¿gÑk˜ž@KL•Ës{‰ÅݬëõmVýÔmT€Öê!µ})â÷éj"‰ÎƒB�jøòÀV‡åFÎÇ ÷”\P2-˜`¶ ˜±Tš¥ý‚Û/—RÇfÕ5„ Ъ@¦ ×Û…pz€Ä"5ÑÀÜ� érÆ3ŽÆ#ßb…ãÍ�£�ޥ߼‘¹fWÛØÖ«“.2;Ï5ŠÕÓöˆä�ÄC#›Î«’1æ v¸7ØÚ¨ï ‚Œ 3 ¸ÀeOs©a?1žÌ€Ú›qÁð˜Mp«Eš”÷õ‚¶�­¥]¥_¸jÜ‘¢/Zè›\Ô¨®˜sGo û§c�øJ³âÆýÀô—Lgïɺ%}Ülq)]ÆjÎû+»¾1?¿A­¤ Œ0$÷Y´ÏSÀ¹ß8ofJhs¹nèVä¸<ÈÔK¶"Ú»Ì"M¦Çîͳ—•Æ!‡8'xD fŽQÔ¶‡Kv‡ó߯D¢|>Þg>N�[œGw¥‘(7œÑxÌšûŽ7ì–Æ¯Õ2—ç}+(PUZ Âtö$#Â!×­5–3bþÕTtôíÀLó)ºÆ8ÃU:Nw¯�²}%Úìo�²ï»~-­‚²Wx(s|ËlÚ¿N¹S‡=þ�sMbÌÚï_%í»> Õ«¡–k›:¦kbð#ó, 8–Ð Áó›SC£guž—#u¼r˜9m„rô~[5—>\Ú‚`«ÛuŒ“9}Þñ�Ls ˆôIõˆ6�ž×¬LÏÈ@¤µ�nyèHÝ‚!�x0ÐD�ààwFR°¼);¡.‰nU™1«4ß`‡a>2ì–¶àá@úÍ}6Âq:q™XøÀ{[Ùü�TÁ `ìr„Bèë=0|W•@]ƒ^÷;ߨ¢ô°ªQlÙ•y;éÖ°£Ðo±¸Ãþ­O“O`É€‡rödÂà7F_�«Ç)v Å_U­~ÑoÇ@Î?`ó¤�iØUE73™ìó‚Kw¾ámµA˶,7a—7Ρú„¦wd9e©¼”оêY/U‹(w0Á]²‘¶âqý Š€Þõ™* âŸX à„¶Ï(B 'ê#èŸö“[°þÐð˜Kµ–¶Êg0,®cÈ}fnVe:ÍÇö+Å߻쒞×ä‹ó…‡c?D±~øÔ•�´Z»,>š»jôËÁX¾z¿, F¹Ü\® +_pç,üÊ£6_Œë|RÛÀ€À�1>4úÕÊ3Ý4÷h-áðªÊN—M(\@b ³q#3¼Cã-–~æÜº‹¿b™Ñf ³ÇÈ4¦#x€0œ� úOÜÍNŸœâ64‰›nãÆÎ¢âkR,Ø-N5—‹äÒ ÔQ'oq9Þqò� •„&ölÍì°ä‡ �MÔFR�Eñ*�È�º?³<žµ±[lßk3š©œ'‡æï6Öš ¨Š$¸Ü‹ÁïØá­äœ:³û››AšöæfT~HºqÃx¡mÞMr-uºZ/ž°ñ�B¿˜¤¶7š'ð+î“Ï:¾ŸËÐG-ñ”É™ƒ*6[;6 O Ý•;¥_^*sÌYhÙ ‚ ]ÑRÙ�¥ÃùvÀ¾Ø‘Œ#…k_[ÌÛÀ I‰þ  ù OòD@ˆŸ�N×ý‰àî=¿ºJƒîˆ¡âœþ:TŒÁ?õïÌ‘ŠÆh'9ŒЪHò¯ãþµÿÓrŽ3ïK¤Àºhmyè¼~•çòÀB¢Ô\Óí‘L{´ûS¨¼W†— ÃH¶E4[¡ hèŽsǼ=U°ˆNö†�Îbϼ`ÀªgJD®àyç×n-©‚V¡&ÃŽrÆ÷K(¯Ö³´O™¼UVªN ·t°–OÞ‹dp§•â‰)ܯU8RñR1AX=µûÀU'ŒkuÝIÆ¿5y÷M3eÃ#ñ¡�0>]˨y™2:_7Eó£9^û­Ä$‡¶`E×ò:ާ<}+ÒJlýÊ»3vå1žôÏÜåà�2GZ±J_œh§ÙŒJµ²Lfu<çšÔƒZÚ^rÆo»yå•><>ráqv ú‹òp¶O¿ÒGläe‚ª«U¨§Añú˜Ê×m}‹‡3�ïa^™Ñ§:1ŸG¸V ˜O•§CŸÖ>ô‚-+¢çû]ÆÛ)ˆò,šä/mo;Ž…XÖ„LC—>CC¦ŠüÌùÒèÎþM¹È5È0aiOÙªã½Ë ÈzÄܫխ.­€ù z/5¢´üÙ×i©RÆ}³½ì¸!Þ@±^ œ×.¶áí)Ø¥¬ø® Rš¾øak}Ò„ÛjÁÇè¶:+ýº�°ðF‡‹lH/žJѯ?Vk(—¿OÁÄž´,ao}>§­ÛÛ«ÃÝOÁW £„ݾÛóÏÞØ;W‰¼ Î>Ùú1Ä9ÝÕ‚—œäGöZJqÜÛY«Ï[ªÕÃ×Jõ¿-7!¤ Vg`Ûb­ *É-ЩPŒ -‚DD :»<âÆøX´�É÷Üò©tøÒð�;u¿l‚-Ïx÷¢DýAYÔæ ‹iŒ„ÚÓ¾&ª46B·&hãK`Í3ïSX›lñ(÷�¢¨(ÃmbˆãqW ¹0#û0Àuˆ³úYí„�&µ•Xl+çÙË  ´+\{Ð…Ó!«üd’%C£ ›Á�âw`;îhv•~׿l0EMÉ$™Y7Ë`©Ó›ZÚH?ãv2¹vóδDñˆô&h¡îbx:"Ó$ GêÂ)nˆcSmÇ­X«üR¿ˆgvÞèN«í&>9•Õ`Úeà[×ÇÛ“–'”Ä‹‚X àÈèO»× 0ˉ”½q�ï2µùlqWvl‚N²ÁÅž„ª2ÖÅ‘8MpÃ�ìv$³c;ÂCØ�¡Qþt"%Ùùa3µÐHœHç8f&">xÁ"½U8„3mžpò ÿfÁŒÓ<æì&+¬Žåj‘ $n;ˆ\‡ƒùéo\ç\"D¾çÇmß¾Ü$pÅ5¿ƒ·]äv³™-š©K›®ö¹òÑ¢øŸ/˜ºXˆ�û£gŠ]kSœs d¦¦º¾«ÕƒïÓí[¯Ì › ì7¢g.(ó¹ÀcOúÖy¼2;~‡äÁ…Ü^ ´î Vàëašû† ,røÕœ>å#‚i±«Âè®Ô‘W�ú¼Èù¥†ÓU/=Jîg{nxÿ{røÉïgÈ+‘Õg0[|ñ8ayl8-ô‰££¶¥ð9‹º�öéc¸]ʧcl ÄÆ¤nÒ!8PÖ郹NØå3“[Y^Þ0¹ª¿&lÀZ%öÆÖÎðÜÊÚëÐÔò­ÇªÊßÀ…kOèËç‹SFÑ{„ñ–æ#¥/gkµ½ÏåBÀõ%)ŽZ|Íl�æ‹ÝÕ\u� «TéèJïm5¹¶û�­i# åì5¶Qö®^oñt÷+ç%чÏôgvÔò ÒÔP’ûÎwÕí=fYÜÅ_{Ž’Ø§2/Ø?ïšm—Ô…?º}î,Ùë;ß×/G¯Ëðã—¯¥ÛFﮢb!Ð(F!6î+¦¾T»eŽ®M:ï›Z)0H2nŽU§,ᆰ¨•l`ÐSm…µdJMü®,âh>»0(`Â¥kèÒ_ï¦FÛ¡ôýÈ�†Ö¼þöyðk×À®h’lè?ŽÔï–òÜÉ(Œ÷ú38ú[L³Þ[Xö"¡?´�Éû÷êµ2$8Eg¤ – L´ Xÿhbîuppr»gOi“jõ]®£­Ëñ­9}�Þl?Ž¡¯_¼Žo”Ú<¦€\Ÿd ÷r�ƒ Œãöpó�¼[`Wø«P^çKuV±SmOù—VÈù€ý€‰Ðh]>ª²È òš�û #ùD e’³~pü|·ˆ³o9³Q'ÑÓDaµŽåC·vú,Ê>·Y/�^"ÊÜbKu´›1~8ˆÂs—ZNžðxµ|;÷]Á9<µ´}neùMˆ‚ñc]ðìõÕef;/#¥�|r®Ë¬?Ci¼eØ|ºŒ¹£Ek2 p³U¸€æiÐ5ȣ㲳ˆ¶„ è6´~¡%ÍZØ9a©t^|êqYF#WvJ°L­Î[Zb$Œ%ìØ'DüNÛ eòWXúe2…�Ýõp°ñáÄ�ŠÞáè$GkSÁw%û§Uzý"UŸ¿|�b³}ß”r¹JlQ>Ê“€ýËÊž_¼›fÁ“µ=‘ƒâ©ËI¼DÒ*…œ\øoÀbŹ­zX),� ­IÛ4´š0õxé—´ï8€œÓº£�ŒŠi™sû¶ 60Š5ŽÐ.Xàóvfà}á‡Ê!ωv4¶ò’o øÍ™Ÿ‹Ìåxm´0æ h.{½ØÉÍâÊ ñû2‚®4¼‘ÿ_Cv¾Uv\S¨¸ªœÇ›Ÿ€¶±RÌQ™ÞËæbld I„¬ªzëâ¨o~žÙ±X¥ˆ�í‘zF·F®¶CB‚äMÑȃqXUòCØÂstÓ†ä(¦Ø;˜îrÿ¿]t<åk rj ¯g»ÿr:1˜Â–0JSŠÜ4ålH–±1Þ™ë’ZaýYu<ýZ_!ÛåYÀš+A•“}™P0¾ ÖÐH‚ ðZQ¶x¼¾Öq-!ó5Û}B®4Ý ©o¯ÜûžÔ?íQ°õ¹"çÆö¾kœ6 Ïí-¿ ˆaå Ѷ×M„îWLëK¾ï‹ØíîÁóp´ÀÜ·MÁ9O­7ìYä2›~6¯·þU2ñ1UfgƒìØ=Îà—"›NûTë›Û\ï?¹WÄq˜ýß·ë ãˆÂpç _²ä~ûî|x³îÕdB¹á¡¾ã��8%沇LüVR,MmA‹Ò¤ãÿ4€³]6M0Ýí¸ðÑà}Èêå< b¨”QwçsXÂb¤��ïØÞJÉ«aŸLÂ.ñ°jKª lg|H Û[°+CÎ^É��,m§Íµ’Ì耜¬•2VØ&w©ݘù‰þ�P�)‚—÷í¸aV®¤WÄ¡÷Z€œcc�s TdÒ|Üh÷3�Ì»Åý—‡ˆ·È?¶]ízÜ�æùF°ë§àåW­W°1§ -£àÝMð!Œ¥4‘7Àüç> V•Ÿ@ß½®÷·ó¿T� Gf Í‚‰ûôÜÓw‘Ê꽫Ùî1f  �!�ß‹'(ÓúwJ3 |Ø#â=ˆ±3ßë3Lá7¹ 3,bq–¶l×Êzy˜c®SºXXBýÚb²Ú±æ�éùje³^Ñy¤r[ͬӕ8&¶œNh4¡C�*Øò$‚á„}YÛ¨q_~Î…ô} M[|;�ž-ʽi�¼{f Ù¼Õ½l¯¾}‡~\W Ë ß’Ñn{zVºç ˜AQéìjç’WIŠÓ4®}4Ç| ØB^ˆ³LÅš�r ègU؈öAó´à„äsö Ú�ÀpµAO0îήw[ë¾F%™ºZ£»í×tÔ¹Ï7|úÇ—Pl_eWm£Ó|Rž“² ŠÛ-NÀeYP³q/Jú*=E™´½¼žq¤�µ«M>ÆnÏ’4ãòÕ*™_ÚìªÕ\XLÊês«ò ˆ4gÛ’Þ-`, '!Ê—ì@ÌLXδ2Ø@“‡»Ä8I&ˆ[¡š±}Ž=æ4 ,±ÜëŒCiOûæ��ÍP"]ÚçÁ8àüì?þ¸{ç�·yÓì7�+Bít¸ŽIµ–þØTÔêNïCwA9º¶MeÀX¦84dÆÑrSaês�“Œ°P qlŹý}êŸyéo½2Õ]Éûßrõ:mW¶æ>–Õ9&=±ºý�µw ün=e´îjV!³yCØ&¯Ô2ïÑÕ×a8`½rµk*ǨÇRÎì˜eÛ3›`—5´÷À ;ÑëoNËA£G´Q6�ì[J¯B¢‰´à)Ëz bW6…]µº†i%¾;J4,{Læ÷s+Š ׃å[á{tj·­.Ø–Ê>£^X*¢±â²§.û+\œp@Á"î�F³ƒõF@‚Õ�TBû‰{Úã�^èè.Yä¶,Ò�°~‡”ÑÂü݈�s´H¸‚ü1ÆÀ-ì…eõÍo}&Q«pËBnj{|B^\ˆjcñNÛ!Ûùέ;ž rìÍ42tC7“Òx,»Ì Õ‘t¶Ò�Àw‰½Þx A ö»ð®%x…}¤ W@s;¢#Á_@dY+ì%ÛŽ%"&f”$VÛp³ÂþCl�€nd`h=+=`4/i�¢à’É‹7³|_õñFtÍè NtŸ¦sk!«mzd2saW”¯ŠtÉs£�B¥'- tÖ++î±�3Ñol+Wãþ6šÿ•öÂÍ ÙgBR\nïìÈñž‡_à’Vcëð%î{z&ùÎõ±6ã¦â¢íf´(±ý�FºÐ}+䫯àræ4#.vgº6Çm›cÙí™ö¥)æ¡\�Ëi[ T¦p´j»´=«“jríúpŽïnIògš&Á��ó'ó�þêHw9,ìóX^¦�£·•ü²œ˜-;aαa˜Ï3`˜Ë©)6p(³û�T½ŒÖcX·Å¹º,ËÖ§ïÚ[m {tå«7â]-žk´©{½.úÏí´Ù¯@É1X·q <"lÔ2¢¬rY;›þ¿g3¯4vé–ç×<ÙAE„i¸êûÖo¯¡±ôE´›¨æ|‡Šœ`F _mµð˜ÏíÈÄ 6UÁ•{X:–:~é rA½?8Éòes8ÌŸ<«ðñ:¼{s{ƒsÃ}õatÒûwЊH`ß÷¤wÌÀ?DÛ…–üt2±� ¹[6;SSØ�r-›¦K⺠£9ÝÆrú“WOrpúª’~¦îFú în6U¶>>Ì·–‘Æ,Ó'ÝÈÙt.`¯¡û.Ƽuü@‘!¶dü¸ BZÉtle`Œëe݆®©Ëç]œƒÈœ¥Þí’„´ÆØÛ”'ŸnÊC[7¡%æ£ – •$[Z¬Öcü¶¥bQ8ì¿J×L4ø\Î3¯Z÷A­]Sô¸rh”·W¡µ¶F!8ÇÛf Ó£s6º7p^Ôd+¤‘Ž sIf¬²ëçF�5½ÚÒ LÎ àJ~}rþÆ«ZÐãUâ9£šœÓ7;Œ‚[9¬¢éGºgÕTYmúeßæŒ�‡aì&�kš2÷€PZ’[«èÎ4¶¨òeH„³’å<…®õkõäƒ(AÓ nNÒLp¡�c—(Âj +01ËÇå&ÍÖÇÙb¾]Ï“‹¶÷_›â$Ç0icýÌIv Åõ4ì¹W¿<]´ò'æiø_â]—Æ[·;J> @¼ÚS•õ’h¾d�Äø0 hgŽè%BÍh¡ÄÓ…–WóQ„‰"ÔÌ Kµ¼o!Mç°„VG3§ÚäWqÅ‘›ó9Ýî@/b� Ò}Xp€w¯ovº @}HÚ\+©. WÕc0!Òøu²Ä` °k`¨†ú�´îþaê© kXËêêÓÊï›%Î2å‘Áïf²wzKé&K¡˜ ¯ÒØo=Ò1ɳlž�;]C·«S'»)k—»ÁñWò³Æo¬ØYU�2l‹Ccf¨ÆØuëoε°dTü»Ì›ƒ®Ï>?¯¾_žþ€îüU3²IØb`^Ügg^f…Ü ûolOW7°˜\t„ µÈl( '6À™à¬W1«KbóôP<å¶kw+8™†�l[)@Ë®ȯi­šZÎII®¿X&D%ˆøn(ÐÐëtŠÌãŸØ°Eî`®½ž®5›üÇŠÒ¨uN,ú }ÙãÐjè-¢pÏ‚lÄ‘ý¦gô½“ !²+ÌSÙÓ^{þÑ ûîð4Aë«1ž:£„� jAù�«90w$À¨Ø¶Â'Ö&�κ -°„²·ˆ®IÑ&’ ^Þu¦ª¼¯«+àBSËe„ï$.ÅóbÒõõµÝ×dgÌ5ŠüÒ�V$¦?¤Íƒí¥å%Rú)N­]-¶õN… ؇„»éf¡ÅÌg"@Áö®ãvú|»Ë�ÙÔ?©¬Ç·½ñyœûxÒb£.Ó®—b:Ìí_6zÊ?jî›XfŒ,û(-œPs…è[W¶„èB5§´)vay Ü/ÙcdÌ5÷_YlÌ>ˆ·š-=RßkÙÕ¹±®ãî.RrŽ«õ‡ë:j�PŒ[),h¢ácåÒ”'9¯l¬O@E·3ø8³‡æÝÇlVŸ‰t »tø¾Ok|ÝjÇ‘|ë{¶c:ó½r ÁKź£{¤Þ)A-RXÔ½Ëߨ7Ño63 ÜÈË÷míxÈô¾[n]æ.�ºCœµŒ ý›è[È Ú#{½5ivyT†,&ªûØÑ©}ü{c¶-|(®¬I–ê1u_’¿,éxÖ|aɉVG™ÚÜ!U°UˆÁL;¶ëܻ۟e"Ÿø´+f�·c•"’Ä+ÇD1…N¯íÕóŽ_š™ö¯é“yKæ:ªÝü½¶ûB.)(â#·îEHSTá ÎÚZåqÊ[/�ͤ¤z[ 7í­±8�ÖÂÛ–®cË_¹l1ƒÈW`èWÕ€ ³’’•ŽÃ@ÜÏlX¾EŸHHó’B Í÷61=/™:ßèÆšëýºî{€¡¦&�ñgŒca·©þîx!yÇÓ-¨Ñ‰Ëò¶‰÷\†áÖB aG;kñב¿~0Æ€5�ZgiõP/{ÝiŸ�ð?+²9‚¾[ã× C·úM øp@î‘©FÅKï"ß$Yç”÷GÏ.¢Ÿ£´ª{_rA©Œ¬½ëñ$ïÚÙÁîæ´8ÙPZØÅ›qfSŒNö”†Ø@æZÍíë`†Ýyiž$jjÎH¸æ‚ò"6y\ÜÃ’¡Ká“w1%ó½Ôo]ÂãÅw±ð¹,˜6<šcÓ�KG,jÔ D€4¨ãU`K°¤^±ÀYÄQ€8,ƒ…šI±W.ô¦?hñ‡l ªrؼ‚Š8qµ‘îÏ£|CØFE±™½�«²˜DÍ«&íR9+ŽN%\õ;§Ô:Rèé”÷p"~þÊ3¿Ý.I6–n´ëã~¤PÐ1~,r°ofÐiaíYèÛW%íåni^yrˆ»æsjïØ“WüŠó/êV¿ÐnŸ}²ââ¶ßáâL¦Î°úò\ ®óø˜ÊZ6» †ùÁ;æ�zçkZ.­ïîý1ö²!ðÕx h-Øvî=É!øg:“è^~W�V ê´Ø”%Š˜„ºl7&÷µ�¾¬'4Y¬81C}_mëµ@†%J߉”3Ί4À)Îc/òáBxÊ7¹©`VîZo+Ù÷tçhˆ{¤!ûV b9úíº~ V~*ê˜#Ð/³à½`…ËÝ ÜØ(vGëMà‰Â}o£o �~¾yˆE!/»™€²: 4càD¯dY5G Á¿Áp=æXÖ iŽçó/wI¯CåÆá ŠwN�>‘ êÃIYÆO´€râÏM'~ òo‹¼-¢j–Âv3j­"Êþ ƒ‰.g~faý· v R”Î"ýÌØ‹$ ú‹Í…•øš¤ÁüÑ>‡ G‘ Àö7n¹x„øØ’ÇÈ0/y¶êèAËhø%ÕBÚÏÖ÷®ï¹(W�ÈqÉ ših%Úšµvˆ ädâŽÓ{¥¹Xê3½­v�Å=÷ˆg†8i¹ñ³9è„é~ö;†’6ÀX;™¼KteªK·nÇÂBr’ÚK ݆!L³I‘¸ú‚4‚œËh¾u¶=Sz0!Ž',ïxÝl)�`™Uà AÙ�8áÌ=ƒå¿û�óô}¾Ýä;Éy)³Û²ÝiÑv”}|žC(ŒU3 ÅåížCbNè)¹ïP±@º/eßt¼‹£¦´sË‹\Óy ØDy¡4†¹2ÄŸ&þˆœuûö#æIdË0mN’Œüo¾Y{à~„{JgÓ¤;ÈÕÝ´šuÁ5·ªÅý›?mÌ}taE–�±ýçÃ3n]ƒ÷)ä'gÜÂÊ÷-f°s©J[Œïx{€ä>=|UXî½Þeý8{þÙQÓ7‰™ÓÑÁ¯Jéì.8üL¥yÚý­s ÝiZÞj™ø±¸›ë‰³²FXõ¿mûæs¿B»V7ÌÖÉg踃æ@–'Ø!‹êÑå²óç7ôCLûelÚ;%–<‡>`'…,©…@¸Úº¥CÖ"%LZ4ׯ=Љ2žÄj¼¡&ÌXYóCàÜcgªîIž[S“L†dÑÁ�}–uÔø÷Ñ{ÃÕr‘.B4;Ó˜%Úß VËÒA®áŒà÷ÆþÒ°ƒ8ǺYq VMg©ÐP£ÅìàoÏ› Ý¡$¢wš‡ èÇUuá™®?åú«JÊ· Î~ïŽdkí£ý1X²?sìC€ô˜¾;9é«öËC(…Q@¸°eó|‡‡áÍÅþÍÂUò›È] #¿KÐ�ü4•“sôAëu ‚ÀúQn®ž¦m.ŸÀ‡ðö!·Ö‹…˜n u@$c§EÄ]DD[û —í ˜�Yl™™±¸ … ‚nÐ?\-s�ì,¶àY•ˆCâ–"Ö­k››v¾B¢ e®FˆyC¶³VÄ¢=”î_Ù0o”Á¹ÒWÏ{Àa wÖS„¢Bªéì/`Åtâ¾¾ß=ÜfAä�@9sšlùf” 5k†Xþ÷êpq’ºGk*ƒŸbA­õ‚‡ªÁHNwr¦'⌠þ¸€’6ÅFŸDÇ)W®«g)zH}â+Ï4ë“Ô^>zo—½ïÏ$OµŠ2Mª-’SÏ6# â:·Ñ½µ…1(ÇâÖTtfˆ,ã°4«¦‰†�°…ô.È`£uM�û�3Å Âü/ÑuïJ‹oò›6Ÿ†Ë þð¼èóµrÏL[ì´w»Éþåa­Ú”Šç<—`�·§)œªÀòæ+„ö‚ž(3i7º d�Ù¯ë®o`? `äL =«1ÍwnysÄñ;zµ° �€¦ÀÍ�7R‘p¿rÈœ¾yN’uŠ^×.3“»ú>×í~ª¶’¾7€ ÙqkºÒÇCñïä ¥„T2—W$< šñ7²4ÛØÔ(«ílÐ/X"‚ø|{ñVë«­J …«�œts`wMä>ûÁ†‹`�5œÅ�—"uS–W5W ×u͇ϞóXï=l,¬ y ÃbŒ»eñgºó4Üýxotµe@¢¾Y·â¾90ÉA”AÀ¼¼eînÒÁ¢âî‚:E?S ÃgåÖ  5y›7}åéR˜ú6=°‰:MG�YaæoÏàÝÂßR+Mð¡žK'lD9’/î¼83p-£e>9ýÎU°/ s——æ5ŠÜ–yöZ‚CT\SñÖüÇ~ï¯ô^/f^®ùdkíG®aL&znüMN=„Þ³X9¥ƒçîÑ“pÈækÎ-»jU‰Ï+‡(h>~ÛH¢uU¼Úã›A¡úà��%³‡Lsç»9ä/8 —‚o7µq ûIéÑðÚA.B¾Í¤-&§-^KÜ+[ÈIàΑ–0$a L4erÂû0H«/ƒó¾¥Ó�%ÇÆÏ%®èž€uÍÎë+�î|ÐšÞ ž‹5¯}Q—§ÝVXÀ ÛX…ŸåÛ¦à”‹#»ÄÍc1‹©ÕõA» ›!µ°ü*µ¾aW½åÑÀtUØ7ï)ù¶õræwQÈÅèÔCWµç›F´ G‹ °*f%ïè}q·»¿M'šùyÜl ›ÔqüW¬ú9ßgí FZ˜ÚǬoäûÍZæù�¶[�vôæõT’Åè î…kM˜Ñú@€L·ÎÎü?Çg™· Y6³—žŠdXËŸ¸ÑˆÑ‹G^£´<uSh•î"1fv#ÆÖƒ£žh€È€‰ÿu^ý7Üå`»³ˆl6,g,ÔA'©MzÉÕ€Î#Œ[²ýžâ÷ ñ�a“nïRyH7…ò ãÄyäNyÄ*O8g¹'§Y’üjy�E¬€-�Å[Ö¸FP ÍÁ*f`8‰pϬã>î²¶wÃnÝÔ\ä¾2"4W”d’ˆ@Ï ï/¡º…0þ^m£ý+~„ºq Ç4KpÍG#"÷@†Í‘±hõŽãpo·ã ×NŒœMžµ÷·Ÿ@bÙpgžŸƒ8–5kÊ,X“pµšÞ8zº8UË‚€dC!áSe²‡| "·,ym§±ç†ôÇ”èo„�Þ~$†X?¹ s?CNv�èÔnk‹¤`Y»ÐÖqtBÃ…ÍÏ�™cE÷V„Iú>À ›ci’ͨ]»~ዪ.ª Žƒ¾4I¢Ð­”·\\¶E5WT,¡ö1:‡šÎ‰uXæU¦øÀP°EÕi®{ÔÝŸ%Vb¯y:¾IIàÑ]ËI³“É[�ÙB]ÃLd–Çê4üÿq9ªñ‡yC‚TíÀ>ÕûR'"{=0òM‰¿Yʆ-Y[OL¤ð¨çö €/%¤|å4tecûºØ¾¢s`°üýL³7&ü‡ ®£Â÷/º¯ßoÐpÙk¡÷�6Ïàu|cUΕ·¯8^Ì¥éócY,XjýôìÈ{.1—Œs3-³ÖÀÔ4B•²?óøo9!N¸Ör -y(cK€®X–Bý§ìSƒX7¨ÔžhÍö…cl•§ËŒêw éÛ¿.=½óKWZóû“wn™è‡(~ëm�LÍ µ´}1àŸËz=sgؘƒ€äӼ¤Y%øÚŒC_‰ó%} rÁñ�^È`ƒ$uq‹žÅ®AUï,.„€Ä�~Æ»pÅÒo�-8TütgíFòdñ>Ò³¯âPª¿X)œ]'3xm±"|M–« æëÌL>¼Ö­ˆº Ïz>Ý‹Žr$ Î#…N�7­†ª&Låc˜)ú¨û!$ Ž?˜mÓc±_U<÷+ 3ôg›?oiñžÖÓ–×9ߥô ªuB"=gÆÀaðsi #<û«žl7¿Šfùhh9NÅzUlGs/ËÆg?"š’j՛󫚇˛㯟/·Û˜PxÆ1ÉŸ˜ûõpv€–ÙÕÐ Ö úÅþs£½�9ŽÄ;\�U¸Ø@L£²¹,^…è±°Âêh1J}ñe$(¢’é�îž%ÏH°~`ÎÝ7.ªM¤ÌæS"{sÏÓ±òš+û1°Å1x´S¥@80ÃòÀ«ó)áN+ 0Í`wú@ä;šW´ˆö0 Z‹ºç Œ¨Aø5®·±ÎÜÏFÝ}†'ò•ÝoÞ‹ô3&›%;÷ ­¥öN\åg ¸½%\,ôœ’‚�g`"ØÚü�EŸ×6ƒI­n¦Ö¹Xo§<+ ÅðŠþ_Ö=�GnJ( ç¤ïòíWa`3Æ…Ñ_Åð¶Ð;gúÖ[×_άø/S7%K ac<´Ç¼x»Ks'«ã�~‹ŒÝ϶=jB^ìÌ7Œï¼ÍÀNŽŸäå—Œ&ØÖJI2ùl@s3Œw�ÁVæ~-;èÜÙùíó�•2Ö¿E`&sã’]wäù‚^µ?>o¬îÚ]�Ñ,tǰG›MvÉw>ôZöÀ XCÖl±)ó:†î¡éqßw8¬¦ûÀH/�ÞKvÔkàugÖ~+¿b'�Ú©nÕk]î!߱¾÷G §µŒÐSÎããsºªð`º¦»ÊÒ‰Øêp#c{z›Gca¾N `Y\îÅ%óºà|2WÔ¹ým‘Ôcâ7Ù£Ð|›ú~ �Û­×*øÜ «ªöíõ7Õ[«hᬛdz3¾'iŒ[]ÇÛ�öÃO‚{ÆÉo¨U/FsÉ‹ÿQå¥GÕ†sÈd¿¾Xk|'1 ¨3#—LxͯҬœø[À W@Z¢|ž»àÜ>·­nìÊU,R›ºrଠh³�p$r4ô——~ét':h«� C_•0x -Š!º²ïõ´®*£±!3F…¹]YQÝ>œpyMWUK¬dZ1vOƒŸ·¾Â®ƒÞ¦c»Û‹Xc¸Ý¤v0]kKôã�Í›”µ…ÂÖ š.w$‹—lšgWèNª�º†Oº¤Eª³ eYŠwøv¡’l=Å`ìÜê:ɘuù{…át÷€žNAÊ ÷ß¼_•äzžîÄ^êñ‚ߺ e�n2ú{mòÓÀ¨¹n¼Âù-ƒ^UNèZv“;ƒ^Ua÷Aubt¡´ó ä˜�zŽ/zã ½�ù$'p­¢ê¥_¨VÖÙï¨Mån7#ÁX÷(šš(ðÕÛ8í2‡o2Û‡¬œõ[#ÈÖôêdb�£«UÐÒíhfá”l'$‹¡hžEKå?d‰Í¨€´ ø€ßit;ê–P,æâá9Rƒµ­täƒô¿á k®¯žaà/ñó{½P삇´%§Ìow.œˆÝ+*w¼¿tÁ—Œ…1Æa¤0Žó½œ¡M™ÎÅv²Ü½­âîUg:.Z¸lîÉ|\Aä�Dlæ"‘°]“åâG#‰µÉÜßåáóÏ�Sâm®Ûƒ Î6ýÀè©ÇeiOPö! „æïîÀöûég;¥9ˆ3®,²XC{^­�׿µÎTÁŒs8­�~·ÖOZéŸrŽžÖÏNß)û?œj/;Å÷�t‚xÃU„î°™ e˜ÿP%ñ _Ó­­èÏP-!•å½ m75 u„-±V–ÚÔ4oH¤A? °åÄ3óVáãJVâqMoZç‰ÃŽHCle¨Nv.¤wÜ3-ò�®ñú#8­©Ái¤Ì�­±Vm�¹WâFɧ ¡d.ºgî'mkЏ†*†>¥ÄŠê|ìoÐT:Ô°j…e&f·Ôx÷Ç9ÆŽ‘±� ¿‚ï7¹Ëf© »Íò¡ðI°ÈÌÞ3pJÝóçÏÑ�í¥£òy-Ï; ªÔÕó ö�ïô�®ÖÐpnmœä €K ¢ºêÈ 'Ò˜³HéïLMØàg—Œµ`‰ŠÈ’b+¦�DÕškÀ©ó{`ϱ�»þuÑÝu§rdÛP:°Ò–Nþvyöwø:?ƒc0yl"0\ où£‘ÈŹìEûíÚ}Jáó_]×¥o6O8`…<8Á[)=¾v4öòà ˜Ñ!¼h(‡µ–;&õºp+HUÕ=²®m m�/0ÃúÅìJWRÛæø»­æóA°�[y°Ç·õ˜÷zÅ£�bn’ºò³¼” ã]{:G6£—±‹€ã\ÿja;(©^ú«ô–=u@ÍœæKM¼ÇÊ÷Ò§çZüï¾Å·K(¨o–6KŸè\©fð´Ænáµtk©ŸÇõí­Œ�±¶Œs©†0mk!Îþ‘žÛâƒRÃ[f ³löoCÌ_rÄ¢½y ;Vêd˳� œY+�r �¶€ Ø³AökÝ«’Ø>ˆòK^Á0;±k„`¿&B³Õ­u”FÄþ³´\ß}ëØ#›�h9“œ(iru¸@]Ù¹uµaä‰LIÀç÷Œ3Ø!áN uvê\'�îH5º½ÇµTŠՕ†CEÆHñÕ€©tª yLòÏHá&ÃÖ)�îówØ—ìŽg<ê¿Þo~û¥¶*؇bB‰ŠÔ~£(%¨ƒênÊ�‰ÉÜ€�kÑöí)¯^[sÂ�z·æ"%÷­¼n«nvÁÎ盈43—iR0µöeí1�áú‹×ˆuÓ½—h$CŽ!ûpâ*ÿÙ3pn-¸ø[£õ 2QIM—¶\’;-”DšúËë˳`�”ê›ÂæÔ©4³‘¶@ª¯Ý¾ Þs@]"x!q»ŒÜýk�ó½VÛͳb0RÜŽ¤.bŽà ²Ty°sà€WÛ.WÝŒ6JBBÀý°Xï#}ÖZp*[)·¸þ|#àW–)+sVny‡ ` A7>ù8– �RaítÈ%èòÕ¡Š'øçlßG:‚}à¡Ih\.¥[‰NîwàNwEJ X{›M¼FR>³Ø®&Âi>kÚªz/"R¯ÇÈ:j ‘ó}µŠŠäTªÉ”ÃïôÜ ƒ]Ùêý¿„9ÜXOÝÍÖ‡™/;ŒêI$Q;“Ejs[(íæì\dÍ·ÓØ«¯ ÀoxÇh÷Œ²óOvÞçcHw5|™n‰õfÂ2#¿yª SË�ÎÑmÛ_ˆ n�!Á7Ä ›Å&×$˜ Ý]½ ˆÙ®ë��Þ”;ð¡@zG$úKdC�8±Ÿ@êøk†áUo�M�Rw½AJÅbɵÂNZ-y(–g�p7E j8]ÁVdPŒ*Óö†´ÍAtè¦Qµ­ù5êrO�FQÜE=ò^äRÜPTZº®)P Þ-Z½ß`,!ºr7¦á–ËóŒ®Av;“?«Üæ$¸˜¥h¬½M­»€-è$ô\eÖ.[G3wÚqþ¥òµ²Jâ®8Ù%Šº0úÓC 9t,½KçŸVõ¡îO¿Sä^ºÃAI2&nÆÔîu!6(Z2À Ÿ$ŠØ£M7êO‡rË[¿Ø0�@c6gcâL ŒûôrôkÜ`ÃURƒÝìŸzN�b•�rI{,=±ú­)lì7„†A‚g`K¶‘§ávªB"£š,ãf6ùµpág®£žqóì\§ç~Ù¯žÒ¶A“Ë$2okQ ÞŒ¥ÀÆÀßf%^_0“ ú4TjËúN“2»ù÷’M{©Ý[s…håÑ7½³å!_p WjÙiYÑàNî§%èΜ…GNòœàÇ$�ÉA°)9ִ౩±X÷èÈÕs¹~ÆÆ‘­z0Dek>o=´Á0âû,s¬üár´·mñطͨ#¥ÊXTaÖ#¶õ>êciÓF7³‡6<æ «žŒ|àÏácý�”ˆ \v\sg8K.ÌaèÒf}éõøVØ­g[»8½‡¾{¶'‡šÖP8¾Lzë䙺  Å¢}jÁÇÜ#æuwOVvÉ]¾{³òº Æ!üùUÝ©¹ïA3¢³uiÚý [› õ³µÛøb¬rì�Tˆ˜Ÿ«î¦*®BVPDæöéÌ»c¯Î†Ö±ºÛjr’®¸òy|&Äæ³÷Þ?£ÏîYà'ÙófÚy{×o7B âe-=­wi.õ)7Z‚K¯ì:ô)»µµçšÈ ñÝZÃmÇ×uph¹ŒŒ²éw�⦠F2òž"œ˜R‡N¾ܼ1{¬-B¢_1¨ñÁÒÛ‚oV”¨ïšûù‚ñi”º`ÂÓˆç÷;¾ÈVî?Ö%+PAè…²^b³­vôÔUú¬È¢©¯5®ˇÅ�ZP¾7â½ö? #´Þ1Ìs.·ä7|\Q'wÌf•Imvm´h|%þmS™‡«z=u6Ù�}¸ºä¹ŠcJ¯ƒëÚz©mÏÍ�¨ì€œýMmd2¬x´’hÈ/¬AZàëb…¢½¸ÚýBÏ ç,$ÈL»&¾Þ¨(¨ÿ±63µ+‚\³ˆò0«^}›í­îkÞèÙLÊl2v&BåʤFÆOG¿HË.­¾ëÊ4&oÌ…Ãc$iR¯ ¶û•^ôh(ø‹·n`å}Üûb[ˆ? ÍGvcxµ¶ÊÛ’Ñ�º•ìYP:hbMöÔ×çÁ·Šgè[­±yoÕ¾†'¬ˆI\úµ´¬ÙÐìÙ—!Þ¿yø¡B±e¹^KÛ*¤ên­²BˆïÈ Ç”TÖP�¥éôf¥ìÂ:¹&ÈeÆ‘w#̽‘ÝðZ{}ºLÎaÇ<äØ�GíÔrØ\6/ZCÏÜͦ‹+�‰ �åh/c&Ò{¦0W²>í”»x›QªdZ j½<²Þ&sæEàUòí(™m‰l´XFQ{ñÑn0u|X?Sø&ü‚¦ûŒ;ërH¥-�ÍRñ žB:R+DPØQ†ðc¾ Ëo—¨Ôýž„¨ØKòØr¢“¸eKÙïèC �œZábE}^Þ·Ènùj2ü#î…Ó3·Õ�6ßÉe7ä6ñߥ °¥?6A!i¯äS‘Á…Žy|Ñ|�ÝJ{³?[u^Þj¬…éÖLÙ|H$Í_�$ 5¡Ãæ {`³0FÉ¡{¤¦QŒµô¦È+ëžÙ©ª"åx¦h¿{ÇœÄDäDmx–Úç˜Oµ¨`ÅY©“X!äæ›Ì‹úû«AÚeN…è)[™ì0Y#¦aÏÀ­w ç< w€«ÊÊk ò�¸TÝÃîàêœ6ù6B -L?²iÌ[-=Ú7ìÖ7… ¥æ¾ U”²ï§1t V‹ƒkÅÜÞvÍ~ˆi™«Ð‘д‘!žù‰zËfÇ`Ã2«J×¥³žo°#š§þ£Ðd0¡C`4º89Õ}^ËŒî>§olÑñ³-D¶ò‘ì]y°µÊÔƒÌü¤=«·P 5)}ƒ"?~Üd€�ý/on}{\/‡8\.Ì—<ɲ¦gšåMއf[Ø a¸Ž¯`$J\^¯{¥LÑ(bû#ŽÆ‹fk åÞýå@Y¨ò©,}©‚$5n¥eOø_š·‹}Å5ܲ†Ó½0áÁ‡�Ë~›¶A´‰[·¬Ëlg‹«§éãÕÀ·ºßžób-É›M @!ø`È Ew^0ܾêä/vVLEï€q‘!’|tíÝýô÷DçZCà¿eü,cØE/:Í�l)âlJÈAŠÖÕê {¾8´ÈO*GdÓñ0 öÌ€¸›æ1�Š˜+]µ�Áà×ê-ûß\)± ë‡ÚÞïç†.m©qÔÅ¥�IsƆè�`!MÙ�˜/Œ§[zβ,VK”ÉÞÔtZ¦0IÌ1ˆú“¬¶v£L¥û¶†—ÙBÙàöß—™}µ«Ó]Ay#N`µkþ½�ìJÍ¥�ÅX†¸^ŸèãÍþVŒ®Ð;úD=í½d {8Ð2ð4Wö‡û z1Ÿ2VŸ§Œ—ÑôZ›:ÐRžËA¨Ê1îJþ=WçT¡v=æ˜p�;æ`=¦è¦ÉçœÊ8JmKØ×^ãaÈ[˜¸Qù„ù×~€;Ò8R΂ŠGxÒŸŠÏðö7|›…ÏÉtáóœEùkHÞf»٠ڧ'¦ÀÚC=RÅÝCǼ%ò@쵕0<˾íjü »›%ü8൯_«¿µ—w§ùÁÌ3»ßaº›�&á/ÍÊ[¨à6ës­Ó\±áôûR¶>chÍðKÑ„¬’Ü×LsU‡ºM¼ù§¾³Ó/¹ñ°~tqKäläåv½˜{Yã[²b< #Šk0“nÙ ×턵aj ÜBÇ^�g· wkð‹`‹nHõÛ­Y�ÏwÈ#<\-�©ÎWÛ“œÞìÃ#ïL{Q@ùô¬Hò�¹(ƒ‹ä/l‡’Ç’1ç=ÓŸ[#Ñ~iœ®èAÁ„MvYÏ"Û;ÍMºÜ­ƒIZ9™­ãažîǼ/[iž*n××A¤žœ¸âD!¦0É”­ Ôá>ü‰Û^‚Sf…¾ÍÁ6™õÎÆRÖÃß3MzÍØ¬=ª#% Jþ½¯ˆ}ïöáªÍÓC¬ãI¢Û2 Wò ×AsÚú „‘÷é:Pmj{.^ÙzÄ72¸·é,ùÎú5+6^ËUZ³ÌÈ1jóƒÛM¹`^TÈ׫÷ìE!ºgÎúèÖ×.�½ID¢Äê–8OÊ�¤šP\åVÁ_¶À7Ö¨-i|ų~L½1d+�»ä5=æ´ßä#±ª£9Ôo~EÆöÏoP+rqíGp×eâçmÌZIc–æ¯w·p/é‚ÛÆÛ3èÅÚ'ÂŒ.’Vm8ÎèÄ�3Ô Ú‚”÷¶0ÅÏ �áh§ºˆÖ�HËhØ»D�½~ÞJàd´z^€º(ñ¤ðýmõLí}þ¬äw2Ð'+ÕòÛÖ)%÷ ƒ2Ž5�e\ê”’7 ×¼Ü5¿Ç�Íû]"6Æó EËH|jˆxut¿Iø$0 ,œÐ…š^ò :¼D1©_äÖg jJê‘ÜjCŽU.L¼å`ŒñÒä•nMzu¹p“kJZø‚Û9>§{ÚÁý×ü–HØj·ÄìÙÛ_ ´ÓPVš÷.ÞþLœå1ÅŒw ½®a ÛT5º§÷ �ªÌ¶ÀááE1²àq‚¾Ä$Æn­Ã,”�0÷Sy­wX>°�fT�Ô. (šµó³Óž*Àb: ˜VÔùÀ°ÌÇ^»X+~ícnª²Cc¢»£ÿ�Å1ñóZÁí„ã0Ã�–Ýx°&‰°>ŽÏõî K£X\s2²öA €}[9�–gw q ¸F·æ1*c8ŒÇxµÛ¯)t1Öï]”çr-›\@cŒ8Új5ä‚ ýyÝ\n²ø1É{VþSb½ËóµµÍú‚ÒÇCPc‘C;Ý‹Hß3É ‡{_é³NÀ¦ºÆ·#ß%ù°Ê­Û`&"Ì~°ÆGÉwø/P}X‰l�?>Ξ”݉°7ЫÁYl"DÿÚâáv°f5["ÍÂ,‚w$û6¾Æps‹óèäæ2¶}�Å·¶v9�-ùÚ�õ¬.سr¡í†û›`YÌ/u zgš&Ú†µt=NÄøb޶9c;W÷«$¨kwN0b`.šWA»¾2œ:`¼Ã–�/k-ô–\+(®° •­Ú¸0d<´ÕÄ늒˜ïB�ô)�Í:e9KJ7é®r©ÙØ“Vœfïn †i­®Ák7@{_Z‘M‘•¡ú2Áîú cÞŠ¹¨ðã¾�ÛK€j—ôÀ}™ï´ãì[\7©ìIDâÕOŒü¼Ñ{ =J0Ü`o$¹ëwT£=ËÕÚr$±Óå›GÄK»h—0âi=ì$`6XJÎ2ñÝì85϶M– we;¡«Áñ1›ár5ðï;[·®F£°A½ø y.ä;ƒ÷Q’¾p;#qŸ#s›[[vN‡^Ø4Š/¶ôÖÂ?S™Û7š™ STé5V¤ÀÈ‘ãÅïÎTZÆ>+‹ÝµÀZ»¯Ã\i°+ÛïÞ¶–ñ[ýbPôÙFð[ÚÌ”«˜^Áн‡Þ­ûÙü¶7 KX…yæ½Ô&Åc&±ŸŸ.éó»gêÖ¾: ÆìíR‰óǾì_*Â� ZE„“+ét]~Ô`ØÙɾSÙ1¶³ë\.²7ó}ß>øìú„}¨y {aË/I{7�°•ÝO­æ¦'…ÓÜ"‚`<×k³Œ5YžD¾Ä C#µEñ*^´÷òçýðsÛm�v·ñéADöOð·Ü_KÇòÀ£�CÏ×vÕ\@ë›!MR[.`Çõ‰„yÞ ñmZMf?žJtb¶¡eN¶“” Ùç¥nQoš‡Æ á6ÝMõàƒfBtt,ãðdßï;D_QÓ'‹ùÅtÚ´ö.Ý”üöõ­;§Ö,dº’©èåàKrÁËAE>@áÄ>Öõ=µ°Ó³ìËY½mO¶^ÿ\¹!ÆØ£7!›8ÊÎ8RmVª!Ü"Û]�>Îq Kž%v0°?Eƒæ&ívÄ�ì69E¶CìTÖï6 TqkPƒ:Í;¬Ð (x‚<]‚ÓôÄN�¦Í±*m¾˜3IÒÊ÷ÌrØ<ãƒôC;eÈE/ ÷/oÔÁ"ÄŠVæ±Úûrk“öÞ—[ÓÖ1×Ö¸‚Ö®´�ꉄZ)ÓYŽÞÄ "Ýg<"ò�`‰¹¡¢Ìô&[p:æ.q³�Ró´¨Åä3ÄMÚÍ9jž×x�€þÛۡ싈x€å5ÀÏ»¸ÔuÿóžVMónm»·ŸÙ—=Ý�%ñjßË¢Û` !›ÐyГëë.d´È�u~~ü ©¹¾c€Ë^°s”��3.ñì-i¶Ä9TUô…(Å6ÞpéÉ'¯ïÙñµXE°W%жy0Ë[ˆ:8l3H[ùç ¹žˆñBž„)ãEÀ„ˆeÞQ_ÛGß¾Ö¢l@Ê–o-Îtû”æ³·()ɵ¡ß$Æ5Oj´\´Ì›Ë–(Ä3ÙJoÌ3¬ê®m¥C\ð3„&l]§ç–RùèV°÷á]šÂK À’@·®~�Iwš Ìžpf47?svo¸qÃB‰©Ò�w¶Y.¯MØëB¸¨kñ×P˜^w¬ù&㓬ØDñŒÀ5ügÄ…ƒ€Ù•·Á×d'uŠ¢|mÁçV€)V»›ÀX¦1G^|áÀ6¡UI�?y†Ï[ô½Š¯ê¸¢=3�Dþ!‡ôx¬8ð¹|‚AÄŠ¹—:U³¶Ü-6kš†5%Á€ôf8Q�_g]iª&ŒkI ! öiùßÝæb…jïpGÕæÐ–;7eÿdQ>B(õüZæøÑz[8\:Cù�·JÐÏSÙá”ø‘ÇGX4„ÖÅÃëž 'jX%‡ûœû4ÓäÙaÈA$¿_ÀIöäϧçw ëàÝ?V‹%˨¥¥#Viƒ¹¡ƒd.…« ¾YÌÑú~�À³€èìËØv�ÑSheA0ûTÛ}ä1ïëÉ-¡‡½µS.p JÏ`C Ü³R±ð§Ü”bǽ­ŸÃóךÿˆ@D8£*èå>#øBl ünlÛý_êÛûŸæ�1K!2-U·ù·û0i_hº> âŠ*1Ö@RP¢JDþ;ž�Ý_‡ióBàLo«ˆÆ=,×i­ãõ¼®B$7Û½éßå{ž5ñôˆ™‰/A�Ç®Ï/å!ð&½ÀAã·jo…ñíJbµ�Ì"~_î0<Þ¬ˆ…y­w\¹á‚°¬/¼æ#ôò]‹Þ uªÝW ·ù=zÑ«gîcõxÚ@—æ©Ú\<Õg7uì4EüŠþ ÄÏíÙÍyÍ>DAüÃox³_ô}3Æú~›è’ȨT§j½l!àn‡V>µUŽålÖ�™�á^ÓŠØM&AÜÑÆÓ›ÁØY TethÙh½Ñ¯?:_˜hû„èeÐÜœ*0àWë Ön×�ò ”‚Åj 7îÌ 8­Âe�.¯œN›-U+£$•³ˆ:‘’MÍR°_îŽ:¶ãž0nm}84õ“ äF³ óäŠԑ'n—Kt£€³p d÷„ >î_ê0h�#b#uó¼dÎÌ,¼2ž h—›z¶{ËL uí�ÊÃæþˆÔïdÉ�m^ü~"n÷�,ž\Šò£ÅËNÅP(Õ²#¦¹Éhá­‡µX\.Ká°ulÖlÍ”Ã5ó`><µ˜ŸMf ƃ4eNZ™}/¯o ¶ó¼»äL‡éÚ®åå$ÍÙS¤xUžŽÉ¯G¢³v1Â]$¶¨Õœärg®6Ý’¦Uvfé°Ož|F5žu�ÕÓ²ZçÙ� [îä5iJ›í|­RÍÑ 2ÔŸ7 TLËI²Àiél]ûçy�iÍœls�•}o!:žt_�œ¥ªŽ`v¿CDÈàT±~–U8ar"ýrWöÓNú4Ä‘¾ñôŽº¼–® õóU™uawÜÙì§¥ “ª- Ï+�ä¸QfNåÁÕƒéÒ&�o/ËI­‡\�!‰�’C�=^m õúÏß~]b;�2û7\”…Ò?ñµ2ñ¹�ǦçîÙ\¡ŒGß¿I;�vh·¾«³nÚg¼ÂI´?ë@7u#"'Ü9ëÐUˆõÚ�ãj¥l´©Mäéùð d´Û¦'-è­—FœÜñ6å]Û [ß5À]~²|s>àbh5®@�‘[¶7â�•Z_¢À˜u÷«[¢opåâ4–|Ù÷Ø÷=Y"òÂnÝö�ï'ͺuËpW>zö[wWTîûËòy§Ö{Õ a fÈV¶0Ñþ–ùƒ“ â?ƒ ¤L¿ßsîû[#‡aÞ0ÕÛqLj yñVïª ^íŠÕ¾(Vç œw}žHl :z -É(=¤Kãgo«Ïï`3¿lÞ1>ï9+pëæ¡�»ý…ãêûê¢î¦�)ú¾«Œ'–åõFG§4Ù!@ †Vó:ÓD,';eï#ï.eL)õωþÆ7³kɲÙMµ%‡í iiÔN@­ !h7¹ð຅M€´—°ž>ÁÚßR57Ø~éßÍ— ΠЈá~À.lœnD1kŒ§móÖÝcv·Àüõ$Е€ùkÙ[\™Ç6Y÷9ʳƒãˆAÚ,&õ7¸_C}~Z#ü¶&7÷ËCMá¼¾Y·q£´D›–˜¥÷ÆQqö‘zÕ¼3 ê|Q9Ù4h±Ï^UMõ‘]†¤Áßröu›5·+cQ?Ví†öÔGZÙ8Üqœöƒ˜Î9Q8Ó[ã©VkDÜ…ÃϽ–‡ê?ßMsJ¡6‘(Ìk[c"ɬ¼O¥à¤Dl×( ¯·Šf H?ÜMX»ÑXÛOÏ9º�G¢ÃȽ³ÚÓ¡¾Û÷h“iéƒ*›ä”j¸… µ|Ü‚Í[4‹$àÃ�@B­ƒ’Wé¯`²’4ÑèÅÑx£9ž{°clï ø$-/ö48BÙÄ> AËQÏÒ�‚Ús_öVù¬$Cæþ¸cù‡ßšÍÒÏ#ؼ}ë½ÿ1Ïâ†B= ënÁË®ï±&æIŧßzM½'ÒÔ½ ,Z|GÛhcÏLÄß03b¶0yÙòáEŽ+g@è^DWu@ÿ*XCW°ëV-¦f µk»4‡ ]Ï÷åêo@ qpË­�t¿Pò¨I/‹© jÒÿ¦`TÛùEYQ3r »vÞÆ …†(µLîÜ©·‰ƒ…¿ˆF k.§ ™ }Cà6'b�º ~�øÎA�CúcØÝðÿU7Í3µB˜4ÙÓ=¦ÆZð17 ü_=´”ÝŒK…S~ÐŒ›¸bÚ$2b#ŒÿyxóHÌ2ä’«4z劓)þé# çÚBN]´VÙðtÈàì*³i Êú¸Òqºe&Õ£K“�Aª@§^-Y±½ddë�Ój£x�&#_¡…¹Ð|pö¸\úÇœä î§WƒéÝè¦9QoB~Å8Fç }f7ß<ÛªÈV["\«1unçR>·›K—è­÷£:X`妉xOöt:³Íôò*½ÑTàÑ„À·°›Y]ùëòÛ=Ä]sÜ£¦bƒc$Eä]ð0b;ÄͱÂGúdoó-µÙ‹%È5è=òÏtA�?ê b 8Ã�Lµz`6,2Ê„`Ç-®Ð³¼^Õˆv{‚kMB&ѹNË tí…9b´à1F¼•� Òô`3°l&ÏYY°; ù•xqÊ;ß Ç^˜0!v¯ÐTÞ â‰åï]×4üç-éÒNi3tú�;âl<¿¹tê2¢ Õø7Nжh€ÆÁ¸ñêÚ„ýªÄd‚„C ûr7FZÓ—&Ý’tÞ²FGE…pÚf`ƒ1õ›�Òo.5ŽW†üÁï}«rf³×�È Ö q»¶-ó‚Yb&w˱gŸi°2eôœ\ ÝÃ]{¹Ð¦y¦ý ÁJg=¬ß]gÌá/ê=yÓõÖ#‚Ü‚ÀN!Ú3D¸ÓýVôᇙì¿Cè/N7°kÕMÄ6U×½ýŸ}‰Mü‡6Âìþ÷t2³¿wË| ϸSr½Z¾°!p&Kõž_ó™©Ò}~ãÆÂ�t°³ü¦Â]rÆøöPY>vó ÊrÌÑaÑ8ôæî~úÚ€jÖ¸Oót5Gù·ð‚KéU�AøÝ&ÛîP¡ ä4“Û`1õ| k8ÇËos[t¸eL¸w3УÞÇU.ñ‚øP{µ}M¦œ8ñ|Sw«�V¯Ÿ©X¡Ì™½m¢¾)+ÂÖ·¢Å6E—öœ6fšÎì�Æb"ºöÎ »/@'¶à<ƒºO7W éI<Žë ½·ÒçÒ-‚gÅPâ&û¨¿sßj×aâ$6½÷Œ´¥=@RGe;=j�Ý\ð\ŸÐÙdó�YÛÌÈ`kC®ÌÜm[¾�Òàö¿„Ú0’á“Úiw‹o’ÛWÖ%™É»=¶ø³µÞžoq¡ƒíT=e²Øj± ÞÍ…¥Á8sÓÕÕ*K„÷X]8}R· 5b#ß#qëwÓì�A’1k_sQžO™ŒoZE|{íòµ9ñÁLÂÛ›n{÷1@vÎRKé®åž éLŽL5kÉõ=sí6Ë?‡'cgH ¼ï�p6X dʃPRRì+&8N™÷&D÷…Ú§+VÛE¾ë‚�5(l��FÛé.Õ;õ¯�Á’Ès+>ŸÐf{lzÐú • …µ•ïSÅp˜|™–Õ$vSõ²ÕQ¹ÀãfÔ½l«_¶€¨ ôÔ¶(M‡ Fˆ‹ázU,Ž@[ MÓû:mÕ/Øàõ >X‹x6‰Ž_“ä¦�ƒ³±f ¬6Bè~dÂËž[‘ͦj¶ã¯€mžÊ�à§™°–ÓVd‚qvè# ÎUz+Ɖ¤ÁÇWÓI_ʬ5·w­ñz3ò0ãá1ÖsË_¡ÕZö1¤­=VŸ(á4Ô*Wç3Z'ÕÍg�oÓ ®¯÷NÅöp1‡0ÎÉ œ¡–s΋uZ°X©‡ÎCœ'Nž9­cƒ-Á>j½òãS-5mÍn¸¦¸™  Yò½ÃÓ�{OcÊm´G«1¯¼¹ö¾ãoâð-‡Få† îøjuwSð´æàn Óî´N|WN=róV\뮯K{ìV0ÉmߪѻhÿZbz|Öêw¼X�ìµÃµ†d­`¨Q©°& :¤ÎVº-dTs…Éð> ¿Ûû?s{ |îv Ó °?›A�åÍï_3¨X-›-vfƒfˆ j…ª”zñ4О:4*üÚz¿¨0a÷ç/в\òÅÛì·Ð’ HçŸf15¶ àÌs¼{!–Mø'|~þËù‚X»m8¬_ fƒ�†lóì¾kXËÄZêB¹€8C*‡¤kwÞ&�pö†P©µ­k ±‰‰ãò«l Õè�ȯO=«>�^I7LC­ìœý±5çÚë}à&ˆç8f9Þ–3ÀÖ#r)«r×ìì>æ&J(Û’?‡®]·¸›J]øóî\/á˜âŒøÞ)�Âè^F›L›­F„_>-g¸gÍKÜ�O¯�¶c÷Ó3Ø7ºþFü½ý®)Õ�ݾ·&ê‘C:$Œ*ëJD`Ö3ñ€B[ ;hˆáq­|×gßs9h‘º‘tk麇h×�¤¡8bæzÒ0è0Ä�·±V7ny3Aö/U¢½›ë–òä^7$ LASÒ†ÙÞ¾ŸÓHÁ1‹àèDuܲã–ñ10¢¸�OS¶jl2¼²›‰_.:¢+¹?œÀµ5ßÌ%;´g�›âv´òÑlB,˜€¾ª¿(Z×”¬ùYWKÁ~tÈØ›®IâmkyíòØhg–Æ‚yÎÙ±R�úˆ šÏvNlI”î�Û§Ûò~‡žYÉ—vJÊo‹0±ÍŰ³ü\ñ¾n…­ËG7½íãM!s]‰±EÆÝ‹/\Ô ½Iî}¾% [æ�уÍlVT‡-Âök�¢RU-„0.nO2RËä—RÀÃ.Ä.ðàŸ[ Ò%‹¤uèx{°¤ýzíWõÂÆ|òb‚jK©»ni¨d{×Úc7D„å„…ò€g¿au³‹†gi5ã8®ñBe.¥F+ ­¯9íK­‰¨¨Q²æ6ãŸ�Áz.È(|ÜÝ#A°q}voÊñ�"¨Ñt ¡œêõ„VŒç^vO.8¬æ:­oØÙ¦Ë$õ‹z߯|É8P}ÖA¨)µ­kФ†ˆƒ @*o¶Ž«Áùž„çbòw³áòCè>ßwÎЫ#wL‡¡GÌ‹þ­6±Oc|ŽœjözÂ;\*­ ªA { (ÌØ>úE¯“ÐÓe¯LÔ"]>;z; „,ÌS»Ü£3³e Òù�È”^á ”ã‡\ñ}Ö^nS�ì4Sä˜_…bÀ(oDÿm3²U®äÛ.Wx»~-KKýÜ�ãFÔyõpúnùPê�/â£éQyD,]%¤hIÎKƒ­;'rZ&èŸ_ÝÚ9œÛªÊ¹[ÁÞc´¸™$oǃyUFÞªª–¿ó­ªÿÊ­«­«zÚ–›[J¬­Z•[Wý-«ÿùŠ É2šÌai†ð++†ðÿÂÿÿ�ÿÿÿEð ¾¼Ìù³®¸•e«­Üwnn�Ú•ÎæN²wnNî:jìÐP�Õ¾½É=4°P÷Àè(€ @(/WÜ|à€@ ) )‚„E @óÕôÒ}Øê”¥;dG]‡vè5}ÝCÅ ­ìnÕ£V+(•uZºÍPZ¥5)IR.ÊiCFÖ"I!®á™�B©vWuinq�%LÍ*¨„¢”R¨û±]{dDª”%VÃC¯\Š$Q÷o€±³P|̤)*-Ý]ïzç•J§M4ÉÖF´SCJí¶çhª¦ÊGeµR�wm»5:¨ »ÐÅUT$ŽZ ¨ª$“£8ÔjÉ�S*•TR@©R@ Òƒ�T A·® »�±ªJ‚a�ÁœÕ€;�vT¤TÊK£J¥IªhY*:ÕUdÓ;mdå¶¶4ʬÚSZ1n�Û@¢bE*ACníœÜé]iRœÛLu¢Š¨”¤ªíT³QJ¢]™Ð È( )!Øb…  ‰DªŠˆ¨„EtuYeJ †ÌvÒNA”ƒ¶”‰IÐÔïyǦ€ÓEí¸ V²£,,�¢¡TM¶°]Ú»we*‘T"l¦Q6j÷7TÒÙ 2Ô‰H UµãhUË-m;Žã" %Û [-”UD�DTRŠí‚îpîÖ딵X…�Ì:T|=ÜUU¬¤¥U¥‘µjŠ(Mš$5ª)"ÛvÑ­BÙQE°ÓA¤Š""¨¤Ž‹5VšEJIÛ«³ΑѪÈi±6µ‰(”Uv¶QUH�E)E»�tPRU›�†šÙŠ]µ©B’f$Ý�!NØ$%:5U@»+ kJ#™F¥B¤P”‚vÕ¦T[dæ³rÚvaÐÅI$J¶À¡E* Ö�R×N$´j‚… IÈ(ª‹–ÛRRP€Š"’¢ÐÐËWZ*ŠŠ¨$•ašƒYD‘A±Š )I¢¨U*¨(“±‘SJÉT—vkªt+E×\¡J eS*CAª”� JBB­©ÐáE%Û*ªªU²A„¡TUP ¦Æ’‰ U:Ý™#sã@ë^Ú…íèw»n£nosÝ×½‡»D–ÀUišw*uUöÑQÓv›)ª‹D B‚ÕZ€È(®± h"€UÆÛ5P§\v骄¡-¶ºëFŠ®Û]t‹�[u6b�T¢Ö’¢¦‘4¥tefÕ .fEP($$ Yvë «¶-5Nî÷½==Y[HZÚeR”RŠ¡AC£UHQ% Dí¢èÒ�&©;˜ÑUÖ†·m;eV²’ $‚©EuY²ZsZÖ•ÚÝt�MÆë5%©¶ÚÌ4£­]Š!ÛEhÔRÖ¢T…]2U–ÐXÑ–ÛvéÐiJ¡ L�ÓN­„–¬Ôm;œ]š‘]4rÑ*U�ªBÑ̓‘m¢èÒGmu•ÛAJ‰+mÝœ€.š£®gv³B$(’\ä]š\±UN•¤…QJH"”Ûuµ¤‚Ž˜¨Gi®°ê%iæ4ª.›KY—Z+N�H)ÓHªæfuÔtJRVûLÚ £l)S–Mw`@ª ª¡U!v³Nîy)vÊTôÂ¥"’””©"ƒ±¤.ñçy{kÞU"B¥*¦ØôÕÛl ®Ú»IF«eµKc&6RRî»UÖÖÉRŠ ­BD:2HR�‘)Q +a’% rè²4Ò›u-Ϊu©$!:  ¶TN®îªJ�ÜqTDJ)!UR´Ð¤@•:¥+ Õ­u‚UR�FíÝ–F‚í…*T”*ª¡(RR ªSL«¶ ¨‘Èj@çÓÓÓÍT$TWX ’6ºî¨+¦¤­¶ºäHUÖR¡6®Š 4‘U/ª„ ‰(~¨1?dÁ¥"PÚDÓ  b*~@ UU?ÿRU?ÔÑOÕ<  EOÀ$Ñ#ÔDcM@2`i�@ IH¨õ54bÕ �$õI%DF“I´™¢Ÿª(dÚ†&G£ÿðÿÄÿú?þÏýçþHÿÁaÿ ‰ÿÌ�Cº²ÿ’×#ÿ( 6ÿÊ¿þŒÚY›È’buÿŸÿõr �¥¼jØY„� kL…Ôo•7Pÿÿî±9@?\Xt9²ÀÒa�ˆºtš\ý1•BÖ³ƒ"Æå‹´Ô'š¼éù„ÒbÊÖ¾qU3‰†¸”.FÀkÍæîÒH¢"*Æ)=B4¯6¥›T<¡$Mè0c‚M@Oa0iSªU`ÀP5§ ]üû»ú}õköþ½«Þí_-wÞ»ÛmÍrÕWýÿ÷·þ“ÿü^ºï^¾ë·wrà_÷¾!ÝÎ\ã¸ww:½ëß{÷ož$o7qî/sÊw¼¥Î»¯—{vç;»»8á“fs¹ÁÎsç{¢:éëÏyËï»ßwwtƒ™ÝuÛ»«£ÎcwvóÝ|øßN»µÌï»ÛÇ9™w^õÏtêwÞà¡÷]ó�ïx‰æôûîùóǸ˻;†ë‡]IÛ®ë¥ÎÜ‹Ðð¸^½ÞÂñ>÷AO;™ß_wÑ_>î÷+¼î{ÜKÞíÞû×Íäo¯^�#E÷{å÷»®»ºç^{ÓŽû¹<.×w\.)®ºùïK†'�¹Òôîõë×Ý÷»»�×w;©w\‹7}éÝx›ÝÈ=.к{Úîï(òwy·¤yssïtû¡ßx=ïz;§zõï=Ý»·+½»ÝÝç¯pÜÒ[ºîºº‹Üï�Î])Î\½Ýwzå¼ å;‹Þô^�®ïvõ0½�=®÷§®—tã¥stË�Þvö\ï}×¾å×›ÍéÛ®ê믽uÞïrïw¼ŽèéØîº'ºó{<îíÙ»Þõ×>êõ»$»ë‹Ó¹ß< Ë›»tSºw$ùÞLÜés_w2ûî›×Ý÷»Î_=×xöt“åמ£Ež]ó·‰×]îóçÏŸA�.tB=z®ï¯\žº»»¥Îû¯½öñŽ\ŽóÛ»½{®ó®÷uäë§wºèõÜîæîû×±î—ÝÏ3º>:ç¸:ï½ïF}÷»î__}ö÷yw§L¸\º�÷½{¾öäÞ|öôܹ}ç¯EËÅèã»ïp ‡¸v]|éâîŠn»¼åîÝ×uÝpùÞ»»»ºt}î=˧]¹\ùsÜÜï½ÀR÷_{’ó§}Üžïut÷EÛ—bë‡])Ýs¹K�ÔîéÞõï9Ý»ºæ\é=îÞo.Þàëß{Òû®sttà˺.»«²ožôv>o{²î¹Ü릾»™Ç^õȹ½ïyMï{×fŽˆ½ç×wÜéÇÝÝ÷¯xuwn‘÷½=Óºás„÷½ânî¼â’Oîíã¥Ï]Òæ÷žï^î7O9{›Þó�™÷^•Üß/½öß}á�yžt\’ó½;“§»ï\xúÞÞvîí܇st—�}ö»ë�Ô}î¢=ë¼óvïzðõÓŽ$ ÷rw·zî8É×kÏK×^{Ý{±yâòëÍï»}óqIêùÝ×=œœï;θîÝšëÝéÍtÇK§{¼\8¹r¾î\>û¾Mî÷»»�Âusszë¯<Óºzî]»´�w»ÞçWžÇ¦çºîæ‡yïïW»Þ½Üîƒ�î»Þõì½÷p=}ÞywEÞ÷¯Üî÷¼®}ï½qÎܾ÷'�s®l\îã—;‹½×—Ý>ï]¹÷{ÝÇL½Ýæ¼åwÝðû¸ï»¯uáÍ×:™ÊûÝéÞíç¹§Eλ»�;“]Ͻï^÷™ 7®Y¾î½|vï(]ÍË _:_}z{Ïeîx÷¯9‹ºòóݽݹÏç/w»£x»®^½ï.]zn•Âg�ÝÝïoûÝçròé0ô{ï¯>w]ËÏo7ºëÍ{®Ž÷g¹3:ë¹�7^óÙçL¼ï/½Àh‹ÎùÓzâ;î¾_/»¹óÏß1rË×y½ã¹vy½w½o=îùy{}ïxÞ:º.s®»ŽÎÝ{®wt³×yíî»rèŸuÞç\ÈO½èóš{Þ{œîçzzå÷Þúì$¾î�u×μçiò½r÷�˧9Çw2%îá'�ÝÜâíÃ×½½{ׯsç)ë®N¸¹‡n—'t�îé{ç¼.pù{ÉÞWzëïyåÞ]åݺw'%úÛwWœH¾ï'¥ûºW®\ûº]ó×½×}ݺ�Ýwsçß|æ»�»·owEóåyÏžcÊ;î¼½ÜîOuÒ¹Þçg=w·�Ý]®îf]Ÿ7<žzù÷{¼÷­ÛÞî¼ï{³Ïz¸eî»»ww|»yÐ×q\îrŒWwÞ÷qÑËt»îöù»ææ½ÕËÞï{¹{î÷º;œ¹Ï»_}Õòwt3çž¹ÒóÞèÜ軣‰{ÝèwuË£»;®u×ÞÝäÝÎWvç\\‡]wÝÒñv'gow¯(¹×rîÞ^^»§uy÷Ý÷ÎÏ9Ë¥{´n}Ýó½×_g6iðžñçœÙ“½Ýâ./½uî‹�Útîîí×;¹Êû»Î¾õï ÅÝÞíè=ÝÜ÷¯}÷zèw½éîæM›Ý{Ñ×=×G±F{®¯(îݽív ˕ݻ»³Ý÷Ýó�Ó‹»šâÇGs§.»»£®íß^žõë»ƒÝæö÷^öëÝëÞsÝ]Ç}똾»ïEÎ÷¼¤žîwn]wGž÷Þ¾mésït÷:÷¢º=îðî»Ï{¹v÷®3�žƒ¦]Ýt½Þöòûß}õ{ÞëÃÜN“¤²÷ny×»Þì]Ü$’�˼žì^s{»ÓçŠ^»¾ìïyGp]p�Ý×v�»ÝËŸ}÷·7G]ÉP\w7ÝÈÏ9îò½{½n}Ýξº¹wsïuëÒäI篽މíOºïk§§|÷ºùº]ÞzóÎ[É9Òîëî®�ï.Η»¯Þ¸—ï»Ç‘Ç5Òó½Ý_»�ž÷^»¾hëï¯<û½ßz¾øÆùxûÝy”¹z»{¼{®tî®gw—¯9Ï=ˆåéå÷yâLä�Ý}íï.¸Os×®ûÞó»í绎î½ß=ó’æ½î»îûíÝ]ºç=ÕÃË·=ν{®ÞN¾ó»îúõ×»¡w;½ÜQ;¯Ÿ}ï¾õ>r9ÒçëîåîäÎ믮z/k»¾;ïP ÷k»·Ï#Îû«¾ëÒ¼¡'Ý»¹‡�:÷[¼žïzçrÎît™x÷"w];¾û«ëìáï{yÜ\éwÇ]rù×›“›§› ÷Qwuæïu;«¸÷w»¹Ýîâ综ôÎÇS½{Þí&ºéÙ{¼÷»Ýí»ß{žï»Þ¼óÝÄî¾_\ïwY!Ço½s»“^îéû�;Ý×uÞî—Î{îÛ—£Þï^÷z’÷]ë»ç=w+¾ëܼzN.‘]÷pézñÕ÷uàC-ç;Ýé=Ý=Óºrï{Ï]Ë¥ÝÞíÃ{ºwvŽW�ço{׋”—f�ÜçuÛ§Þñëº|»ÑwÎ÷w}׃»‰y�çžé.éÓÝ{¹‹§wAsœï{לtéÝ\ɾîiwni¦½8*+»ïwœMîöï]ë»2Þö�ï×»z½Îéæä—:î»ÝîÝr5ËÞëßwžs™1}îs�;»îñïw§ßvïqï—÷;ç_;ÎË’ç;®n\¹(åôô¼¹îÝ{w\§uÓwuÉ®KÞÜß}{ÎïÚªZÛZ¯úmi­­¯Õ[*ÚÚ¿jÛJ¶¶·ý6Û[-µ[¢L¥EQ±2�šl¦5"T„’A„… †I"i ±’2™"Cc hƤ !„i4”Â!™B@4e…m¬ËZ›j›V›[Sm´¶Û-me¬ÚµMµµ¥�˜Ñ$(h‰$ˆ‰"1¢C3DĈ’„% Œ1š,R$Ð…�˜1µ¶Òµ*ÚËkT¶µ–­køµµ6ªºÛjÓ-¶­+lÚÕ-»mÖÖ­u›m­–¶ßUµ·VÛÿÝm–«[Ûj©UTÕ_m¶¶Z­][mYm¶¦­lÕ¶š«WÖÕ]Í­c…Uå%�¨¤ÆŒcAHbÖ61ˆÆ¢ŒÈ±¶É‚�­i¶µÖÚmmRµ[Õu¶›mzÕº«oUVY­^ÕÕ«mëm{m]­«oVÙmUë…QP˜¨°HXѲD‘0Tš’ ED€ÒTÂ(ØCRF"ŒAb"1†dÖ" ÔF%(’J�&Ñh‚¢"(´–ˆ64XÆ�Il@`Ñk"’*MQ£^Û[n¶jÖß­m^øÊŒX¶)š€ 4…+£&HÂl ¨¨¥¶µNÂ�$��&P`„CfP!DÃ)2a)0ÂM"‘@ˆÐIÉ©ÌÐÉfQ¥26J«jÞÚÛs»»»�wwt¢„‹»™b—1\ÝÓ©ÎÁçw\³¹Ü† ™s;\Ü·M΅ʸ\Û§LŽë»·w\�ÝѸ“ºCc¦ÝÛ·#s¥]w9Ý']4·Nw&¹h£»Ή®].tˆÔšæáré×uŠ»—nwn�Ë»§qk—9‰Ý`Žs»‚éÎ]Ý£s'gMʹ§;s–w2»»¦ç3º9±ÌVîî‡8WLëªæ1Œ]—ÆNsœÃ�W5ÝuËw;›¥ Ír.H]Ýwvnî¹uADWKºã\�ÝÜ\Œ¦áuË�Æ3»¤twF';�ÎàË®îjç.båÍ]κ¶ÕJ“úqÂFnu$ÝÛ±ÝuݱÜ;—c»›»wuvNîçwÜwnÈ5Û»R®dnî¹Î¹…vèn™Ýt™�¸œ�ÇNÜ Æ"]Êuº%Ý\¢¥�wc—MÜÎrí;¹1ÎîºWvèîë®®N]w2.uÑÄåÉ”ç[Uw J˜HL‰&dR,£ 0gm¶«¹sHÂMí×DŒ\ºL‹»¯w0ݽÝ^ž^÷iîs·ž=×zNÎï9o*æ=ÝwqvW@{®/qº�ÝÎhœíîמÞ{À7Ž8×wsu.b¡Ýæ/+ÞuÅîà‡½w¯:îÜ »®ëÍÑë§uéäf÷^rìsºF÷»o=ï{”ºîã¡Ý®sîä9Èçr7]ÛÏç…ã½Þîë³s$ î¸ç^둎[½Ó»wu$^÷ywwº½í]Ñåç®tÐîóÕ˰¹Ð¯7w•Ï1$<÷®Dš‰<弸÷{½æn›¢!Ew¤ÀWNÌfF7Žâ�Mî¼^ó‰b=ï{—#˼ë<î�ywŽóÝÜ{¸œï9s]7šèÄ%Ýsàë¸yGGZÖßÏÐeˆÓ$J„“Rf…’&‰4i! "1&J4É 0Li„h�P„D¥�ÌE˜�›‚È”0!#$˜˜¡1™„�ăL¦E"` ‚4’)$L$¾{å¹Âwo5Ï/s¬nX¹=Û«»®›—{Þ.î{‹Ì^h×JñÝÎ=Úïtîòˆ×—u×LkˆÛÏw§±®÷QÓng»:ïNZ+ËyÞëÌ\׳zrðï{½«Þw/Hî·<¡î9swº‰ç{—QçCnî�æåž½ë¯tG{Ï^îÕV[[*Ú·… 1¢ a ‰"/¥ÎÊåóîëì¾—L}ÞõÏ7{®yÒ‘7<ò5ç˾ºÇÎ[ÞëÊîžõÈß)/KîëîëÏyßKå÷¾õ}Æë}Üïz½}Ú¼¯¾ê#tç˜é}ÝNêù^î®/ ·»‰ï{åò×”wÝ]çowù«—ÝÕ{®.ïw·/x÷º^�Ež÷}õy«ÝÑ£œî»çŸ+…ï»}õËîù^ûµõîß/œÞnSŸzußw½Çw^{º¼¹õç^÷Q_5ó|ùçßuó®|Þˆæï]rîºç7ÞëÝÕÃ_}ëÄwºðæÜ·Òù^œ­å—Þï7(×wW˽˺D×Kîé{·ÝÞ9оï{ïuò¼¾_]Û¥óÞè‹d‚›Ü}îôÞ{»såÉ –.ûÞ÷ºó|ûÓ¾ñÁ_.'Õ÷^ bùv_7s«žû¾Nu÷y{XÆñzï/+Þ¾½_ _4ûž;rå›|¸y]÷½»Û±¹_>\·½Ûá¼Ý 1z{Ý^ë¼åÏ—<½÷\¼¾ŸMåŸu󻼺÷E}÷Þå=ÞAÈD HJ  æ€èC¸p 8×ÒÞûÞò½îï}ÞÏwÞâó|�xnë¾—5ÍÏwI¾vûï>ïºî¾÷½;Ýsyž÷{û¼óçNîU÷ÜW˜=ݾsåÈÉEÛºu·óµªõ­}UzÛUÈØÕ)ª—.eÝ®bJ6(4î±\µÌQQ¸B"Ý*æ9nWwrNW S»n.TYÚ9‹I­Ê9[»±e6$Ärëš-ÝÕÊân;¢˜ëŽb¢6 f+œ«œØŒ;·6ŽmΗ5ƒåÌk–ûDb³1¶ årL\+¥Šnus˜·*å�»»F s´uÖânwt—.k»£�®nk—é&¹Ë››‘ \ˆåräTQ¹·,ˆƒåÍEs‘£s�E$,›(d¥Ý¸k‘“…ÝÚîít«�×lRDn[®mµ®Ö«*Û]¶Û\­¢ª‹E¨¶+`ŠJLÌ™D,™4� ”’‘“ÙÜhÄîÜ1¸‹†‡qÛ»”F»»uÜnnîṉÝ;¹D¹ØJ.ms"åÙ¹Í˧ »�pºkœç9r»:_ݵ[m_ú[kY¶ÖÕeµSmYªÖ©µµ-mKmkT­[V«ÿJµ¶¢Ø©-cQQ¢ÄbÆ�Sm­*¶j¶•¶­›ZºÖÔÛ[VÝVÚÙm¶–Öª›kR­k-ª¦Õª»m¶ÖÒÚÛYZÛVmµ¶ÖÍVµM­¯õÿçÿžwD;­Å3®º�érçD¹Ü‹œ®æ¹É.Ü]×uÌîâ—K�".î»;,\:s�Øëºrî»tsœws“wv¹a¹9¸îwuÌÍ;Ž9ÝwIÙ��qtîîŽgv;§w;�JãM×\»§tçqíÀ'S³»¹Ôîëþ?ïÿ?öÿÇýÿúÿ§ü/׊ð~ü)ÅNeÒë\Àçý jÞ•G2¬ ×ñò573ÿ·aÜ.8æ¯ÂÿÂñÀ!R² J×�{�'9.Š“ÿñ6a*ÅGþ”ô…j_ùjêL§üý:½êÏ{hE—u$…¦º#%d�6"—¸àÿßg?ßl¥ºö¥\ûu6_ž²Wnÿ¶—ž*O“\]æâØûƒ!ÿª;ŒFU÷Œ >‹pèÍos€Àay,¿Ü+º�ësú¶>~Jûº^¸B¼™”LàãÌiÉÛ³TC„ÿÛþÓzþ>>ÿ¾»Ô9¯ó¨ñ{ÆÇhÍݲ֕~øz'³S�éèåéŽ9Ø-½õ ê%+žƒ«äÚ}]Æ…[Á©Ö¥ã‘/ZMR-È)l®Ç¨[r  fÐ&©â®‹™C®öØÒ²Nذ„/ŒJÞùd­•í‘S¡”»eËC$(& hZmeqíÛLa€ÖV*ÜÔÔ�áÏùAL‡¶ÿ¿¨ºÃ—²§@þ|”S·@b $Ä$’5p°íÕ†h¯{c%Ÿoš«ÆœwÕÚ¶Íé·m‹�S‚—fëW~Jèæî¨…hGij(Ôn�ï(7±„ÀÈ¡I¹}¶.ÔL€u‚[¬¸ìÛQpé{VæM"’Þ¬*èÊŠÑV:-�¦ðÄQ9¿3�hí£ÓÔÍdÓ™ÌÊ 8Œy­|f!0À®7¢± ©�¶XßýH¡­5ŠÊÇaV„¹¾= ìxøMÓ-}› ê[O-3[ÆóþŽæƒB‘koøQi°ü© äÅró¸™g§ïçñËÉÎSת¹cEë–NÂiÀºBY4®*É=ÖEZ]ç¿íû$Æ­ 5RŸáÎè,ZÞ·âÙÊà„ÚbtU"F��Q‡åZò¢äç»øü¶R—ðB0Êv… ˜L°êßâÛë};lïý ýâÛzr´íæOXÎìhV¯Þ©ÚãE'&ÃX‹iFÑjB¬·HA¨=Õ¦ÆÛ"wf Œ-Á´gµ�¯ßí‚W¿:ÕñuuyQz{¶ÎœÄ'Ÿç<��Äö,Ìùç/²oPކîVçp B9m.}†µ½Ú¥‹&´‹ÿ-,÷o!\H�kGk¬,¯H+ç<`æ, Yf¸ÿ�T|Ýáõ»´ÆœµºÌ…–®jr H’Ò.öµ¡ì[ÎÐÀÕ_ÆÔÂå�üäÞíó”þÄÅVÞ¤)ÎÞ›ô[�žø7dºá2GÅÊv}PHíkÒuÄÞǹ¯a Xtè[ÎÎõ…Ÿ»…‚ü\$Ž8OMD¨sl½úS�›Æ?‘0ù¥Q»“¥ÆàçeÖ3“‡"þÝ|ø4¬…F ÔqA É@„’ºz6u`ÿœ] ,Ñi×íÏÖ‹êjn÷'Œö×q¹üäê9ßý,Mhß#7ÿžQèÞ3#ºåµ7§s¾ÊøM!÷’ÔÁàG. ë”_q”›‰’ T15Ôv<Šèÿ•b”š?"w“64XoóKP¸u"‡ÃŸ�æ¾Õ³m3i½3ØŽÍ¿kƒJ?ûSHÑÛüVZ:VéÁ€×£=|WŠe1ç$·<…Ì.¹¡{Ù’›ÜÈ[�¢H{ÑÙ[•“„NfTõ¶»'°ÙáNöNpKŒÇ%ƒa9Ùº_vÿ¸>¹d´b9 ~3âàRçFÍJND5¡û˜ÿ0‚WQÓí%I«‘R7{ ÁäZââ· £Å³‰}÷9}vyßÜÜp|º%ã]Í+â1»ÙÚª†ÂîÛ`,ع™¾B­@£þbr܋ӟ_xâF»{B–ÓF ‚¶[MQàšÅ`q÷ù¦øw¤6aAÙgˆíè&ù¬áƒ<Ò4ÔP¥ÏweŽø|$=í¡,RTíç1$Û´å-[¬fà¹ÖÖh›ç²ðF5³ÂMiŠpßîsm�Ô)‚î\ýY‚ñ›-ht‰k·. ¿U’Oô OµÍˆ4â¡ÍÏ¢÷x¶ÈC(Ð_Ûÿ\M½[ò¢œñ¼ù %ùfš>k4�$ìlä9ØÓ„.mEnCXvêÁðêlšrà´Æ3ÿ�v=;øçþsÓ¬óIz:¿|G_’›Ïh”¯ƒXQoXKT‰Ù�0T°.Pü›�oä&¨ñ¶Â²ÜcŠho Ì•\‘^–Yç_¤vÃ¥>ÅäÅœ_{2¿�QK04æßfÆ8`Ñ5´b$P`³i™0¶5ÅÀ_ž$ã{›°ÝQíw‹V=Æ®´Üˆ•ß–N캺Ý{xbùƒFóñ¶õÿmÃ.ñ9fü¦z€�nž¨¥j²~]9þªp�Z­ÛYÅŠÛùxUi–£Ð¦«‚®ÃŠ˜52”�NZ�‚²d6e ¿“ZҦ!:Ñ[œ'Ý=ùàÃ))íë£2=âY„Aº»{N4õ´âa@î »eù'v¤y£í¹Á}<&PMS`à¼om«k‘›¸xU½*©‹pTý—mö£‘Zÿ>ò� -F«‹z5ÿ±…5;<9ØÙ…Wû–þ-�nÊW¶r8ûÕ0e™Ï.’é¾V‹\*ÊâŽüà1Ñyâ-Īì�@.Ã[“Om Ê¡cbENC_T“’øiOâØÊQ³\�·N¯1ÍøYï9Ý%—u_ƒ™ÏÐ0¿&þ¾Dc’˜ÁgNw6‹O¿˜Þ ³t±Œ<†ðÑ5z$FÂms™U—¾”hØ« ¿�Ä~‘ÕR†9C91½ßÅG)Š!ЈnÝê(@„è�½ûMœ}v�FÏ“\>G{iÝXÅÇis~•žkœW;e¶è¯Öýv)9©û�j»µîÄ Ö6ëRÉpˬÁhç ô„XBTûÓ vâçÁ€çvÊÕ£Òè“pD-I…Ôk$–(D†$Žœž°Éf0ÅçMlyK9ÿ�Îql»4Êë÷Ï3Çä0 ï˜Õb”›-Á:R§³,*`ZHïÿUlÿÁ®wŠ™J/¿»DÊ®¡üÏ­›L®-\ Å1âŸ{ÖÅ:¢ÝÖëÌ)iÍ�¿uŽú@ù`}¤�[4<»o�ÐŽFTŒ Ùls�Sä�x²L›±-UYjvë߬ö SŸ2ñZž+MÍ÷š« ¢‹H?cè¿A*2—ø¦ÔcÕWǵ=DÓ64¼ÕmM G²y''�è=�Ë0wVP³ÛDW„?™„â¾êK£ê”IHÔÀ‹+é;K5çV|.cyÄzg©8.¨„Ñl2P+ö¡Ö‚B³nA÷kww$ز² ×eñˆº&ÈyjÉ™î4[ùàÒØªÁ-ŽËjÿU4á1'm1/\U$sóý<Â.ŒÒ9M Ò: ¼­Ø�Ûž“|7­y½ÉR2N¬u;Œ8æŸý ¦§ìÿ¥(çý}_ewçØ±ç|Á·_!Õhß×�¡@gŸ5™¿u!–¸‚zf‹Ñã½N­ýÙ¹ª[ªðä¥)M¢šÚoøWk§nU:eͼÁ—Úg+©Œ‚©FSŒÅ$M*ÎiK†¯áªÑ¼î±žRäI×0Àlźf@û®ÿôÅ¿«ó–$�œ� vòø5`ÚI8E„:yINímµF„-ý:ýôé8Ïc|£ìL`Ñæ­XÍ+ìÉ­Ìœü•Lcì/1 Ó`Û½k”Ö‹fÙó-Ýd2M`ØŠRßÔi–>Â2Ã[§¯~ñ|¿cmzÖ«ÆøfçžÙ°%Óú³\[Š´Ä[ý3PÃI|”…wƒg%[yTØõ¿�ëkgh(dÖ4xd¥šÏÇ ÛÃ���X­Vÿ‚-ôÖ¹^p.È­FæCñHÅ…PpWÀ¾kÆw­â˜YFTh,ìBsTÞ¦Ü÷œÛ5$²ÑÚŽ´ÛÒ¾Kµdç*Dp/6>/XÎt�éÆVSØ¥�ˆkpY§¡^!=g,W‘XǦ14Sq=šÎÅ]½­Šw¥…„ÉüþC:·–ˆxïÒ2Dz�ºÌ°Vº"Ðè@Sê‹`î³)9”;üeW8R{O iú1”´”pÖ½½Ø<]‡ŒO2½×ù(:�®$„@w´ª¸ŠI‡³)Z2LI½‡üŒ÷üö×NFbÝÚUgÙ±ÊÈÞý*”A«;v—1ræú’Ö3hÍh£%JæÅªòÓÅÚøáÿ%Oeï=c)uFjmä§ô'…i8cßëV]^ˆŠ+úogìÃñV„‡«bvDœ¿ŒJ» „ÙˆFÏ‘P)+©‰�¤Ë¡-JõÇe,7� Ç€¤“b íþrZÁI·ûÊKX*á·Ì(o…8W¶œ¥ 4]F5ïÙµ³è8›¼§g;$§”a…$BDÐIòÙ£¹²Ëê%Ðcî¶Ê°çU“Ø¹Ï œÐ6"/5·]ÙµµÈ´»³¶ŒÄ¨ñŒ¿6‹ … mR´7¹ÄÖ ™Eiä)±-œXíj£ÂªAŒ`œêÍãYý7ëCÕÖåœ Æp¾ÌÛÉ<>5ƒ”ñgEO¬×ENÇEÛ®Z¬’è}pŸ7ýq9t…¢©óòJS&Ù…(ÕímEÆRG59Ÿß긶­ÿÕl³]ª¦>^4OÝ7û°Wc·Çq»øo¦§¦?´4¯½nÝ7Û•e÷%WJI,e"¦ }o„•¯·£@¹k5jàQgäýW‹ÁäííÇ2Ú’†\/,oWQ‚&›Ôþ¬[�TŸßâ0“'È•å¦ÉéñcXyÜÛÙìíÖûìÓ�W|›‰Î! V«ŽgÒÞ?™F$dâA5M7ñvs€ë¼£cý“ .Q5IÜì-äÿïþÑ„Sÿ?û7ø.qKþƒ?ù(1^š»úO½;ÿç ýY¾­”è¯þoÚK¢ƒ…¿ÑéDv#_ü²ø*e?ö¸)Ïà»D�¾«Õσ8xÚ’;¢ª¡-E+^ú@T&é6›9/óD©õïc;¨ HD‰v/Î%?‰Û%ƒa5q^pZ7+s…¿õ `ºS±süŸP�iË2*pýÀ½b,°µÑve'‹ÕØÉú’†§OI¡lLt hÎ�> r„�æ³T–wF/÷Kë,éõŠÄZ½•’zaƼ¬�]À²Œ­Ú9NÜ0¦¯:@•n†ëHĿť`Q…öq}Û’d¦äÍÍh#Ç] &"Ò=2\–—­1\&qçMs5Vë]·j¸‘ºþe��h[�fŸ�wKf�©–MGh¨ÅO*dÔ£ Þ’àÉ\¢ã!â,+§€�…ÖH2$Ÿ)ÿZ/N:IA_³�ÊmÀÈ^oX¿EÛw.ü£ßU*{ƒf×âÀîqPz•:!˜:‘uxmšö»/!”¶>[™cñÛ(/9µTÇ*ÝÇnu=­EÈÔ+^äã…[fŠ”½»© �±¦/7(*Ƶ¬›=^ØÌ<@ ©]wíó‹ÁLù÷åÚüCf�Œ€ú66Ÿa\w,QKÅDhÀJ{ñÑUÐÜú=Üúÿ��¶‘Þ§ê¾7ÖY�xæ2¤D&ëï 7Q—Á@u[Z€õaÙÞöüÁ!ÿ©ó1ð:7QñÄÏ¥óM ûx·%³ÉD¤`Sý­ä^lóÇïβÇIN6õ 'ãUÈ<Œz(½nzŸIp‹kj>>Uh šù4ž%Ù<Ú4E²v¡Øv˜I{ÿÞiþv˜ÈúÎÐ5†š§ÖnLWÍõ⚺c %÷r§Ï’I41É•©º…�Ö¾©›Ã*°¬åªªTÄÖ“,¨Þ„°5E›ê5`R¨Ì‘y©ÅÜW°ŒO6ÊBZCtÎl›2s;ßíôÅÉ$h\S¨BS <1Ƹ–ã_å3_ÿzó$L«vÔeרûW3Ò}µ8Ÿð›Ëpéð–l.l_ħÖ1ââÛDG4/T@æàñêõë_O_²^Ñl*…nØ9ƒ­õ¦Cr ó„úãY|„")¬›Çé–w®f ΋ò W)·¹î!¾ºXX6+n~éG–JMHçöLÒ£÷s†ñØ3ØÄC%yŠu™ußš}Ÿõ#ÁíÄ¿‘)°»ÑGנаZ__M� U™¤eFï¥Á¼_•s|ð�Béaj U¥æŠk.ÁqÉýR•€ŽìS¢t§¾Q°�57…¢êàî™=—}:¿!cf˜ÚÃèû5Þ$èôËvÆÇRã!Ê"¥U­»œ´^¦ZS )k.ÝYTìç+8Xs"æbжY·ì‹%¾§—(ÿ~Ruu$܇ÊO˜»åêÇÉsw!Z×¾Úƒüö‡Êƒ¸Ð7/ñø¸úŽ�¾‰nn¿ÎÔû0- >˜t€t�0ŒÍn2^ÛAoQô R-gŸ°1\¿h§«bær�E4Soã W¨ü}‘¯káã[Pt× ï�½¶N€ ß©ãÁSîf–/äé*)¤ô'+lY-„*�BÙîø¿ïßcÔ�ÂmXÔVøÜåïAÛõª[#¦Óá%;Œ:E¡~Õ·œ'FëÙý!L{òb¯™Aà»øXÌ}–×Â!Pþ9°a¯JÏœ"|6v6ªrÂ:‹¨êPr[(k;Ñ�”šþ˜×W1ùÚVw\Pÿñtqk!dÝn¿�[1Bügµ„Ù³bà.Ù|ÑA©Gé›iƒôK·ÆµýíwRK7»!¸»�PØ1‘R§JêgjNwÄ[¿1Ô1ú‚@…Ï›«ÅÑ©‰,úÔ�´jEêÂv·ŠŽO‹y…ø�Ìò¤.©%È8‹E%àÖ6±ËÛ—Æ6•ç)´-dšÉŒ6š6ÖÏÝ÷ÈýN…å&Ní̦ìÑCýÎXÀlÎÑS&þ�û*X].·>/ç#˜¹½Ùk”.ž…¼©K]5HzÄ?ŠIÙ²i×{_< Ñçw³+êM¨Õ-¿â™¯âtå/rç¯[ܺWV«œnØ«„ 2qÈí¹�ŒÃFÖø¬›…¹35ŸP9ZÜJÙ5C¸ Ô¢cp–ñ›Wcë=÷ ZÝ Ï‹êÿói€8ä]Ʋ¿(‰ʆ±6~cÆW¯Oí²ÅuP Q¿\ÖÆí¸MO4Ï'M~vç}yòðlŠUK6Ôm¶VcŸs#ûl�•Ƀ‡×݉-�Ri�¾®'öÄÝ cÔnwÕÞÝá·‰Õ¸0û%º�ÙëÃÃfD²¿3�“áu¦GðMñ@GH¤¸j*�…g¡\izº>¨¶O:dÊÒ�õ„‡ää`u/B�ãy§w&þdÝ ¼õ§ŠPk&õuÜbÛz¯/Í«+ó·©c¯}îëÀ³È.b‡ï@»¤ò,{„Dª+ćnwLïÆïº]“œü�C ­PÚ�mêyvüª¾~Â/WEjéa"ã8Ú÷9‹9ÔÜò½:kBLnЈœD õz¾"~£çòŸ³Se¤[�³P¨+Ä5˜¦õeŸVèÓ0ÛŽ# ”Š?¸AT §ýdÀC¹B~Qð¾Àö·Å°O rŒf*Ͱ´ÄA¦<7 Ù¸å„ «‹óú$ øÄS3cht×^¬.4#Âh³)¸\ÏN½v­¯{ÈÕ%wèÅë²&Âj›¹¯~к̣¯ºhs¬-)ü›[¢gtkž1븞ñoMF5u£¯�_Ož‹­ŒîØë©Ì7àb½)›¦Àð/ª mž¯ˆÛ˜åUî×�,·ñ}×ïžµ›áUÍrL6$>GFQŸ5…‡Öž³háëëËNœü²ÝCëëãjFöR¢Lh�¿ ñ{ÅLs‹â8`+hÁbð#îI©_¼| :�A¥gVG•¿zÄqËø9A)…Ê2ÊP¡Ró•2‹¯ôBΧœ·K¥`ú`‰õ‡GìÊΩFžíz¥E�ོ]ˆ}ÅsXa“ºm¿TýGkNl<¸mR%Ø)Ï>«ÑaòòÕ&!¡—d¹&7úâ¸:Ñ¢çÅA“câÅGó©Æ-R;jµ•iLË9LP´·äÃeB¡OtªäϹƒÓžü�‰(?³•^ü¹ýÆTñ_Ð|w¼¿Ðw¨ÕAwÊ·Ýœ9~‰jUe ³SŽ�?]Ú¡Õ¿Mð�À�Wa5½ÔªN&m�DlÂ_•®¿œÔj¹�ñöFÆÚ0”FãÎŽh$öÀ_eÁß‚¥¹Ô4içgÛ‹w3\Ñ ‘“–6“Â*3vsZ3óSP*¹¿ŠÈ5̀؉d¨<Þ-7·³puZosèùo¢�·Eh6,üsA–ƒÖÝmþŒð-?·Ý2�&ö-*ñ6NQG³3Òž?—Y¸cBóøÝWɹ»®Yq±ðŒ{ ÷0WÉ¥$.ørŒù2“]«|0‘ùÔûÝoE… œs˜¥ïË迌MÜ€Ä`–KLñê x|éxTóÿ$�ÏKÇ1|瘺1ò40þm~ûamòöe* �ܸ�õB 3‘:ü}/k=ýîèJfÚ^ë~VçÈѼòzø]ôøýŒõ³ÒÆÿh¦k]z·Š£âIôgMÓD �ѳÑj É"âª-Äj¶5bVk„çð¢Ò¼¿ã¨µ´]Þæ \�|ÊÞÃ�f Å٫ϹƒG¤²àØSÙ3í�÷¤ûûvQYöòÜ{ó¤»5ùŽ2p‚Ÿçöl‡ð18:t¬Y'Y U­7PæD sdŒG›a¤^ûÆõ}ò³x3ÇõkèhѤéf+ŶÑÀê#sõ# ŽÅ7Ód[´¤k&«(¹�máW@º!j`רî°6do¿¯Oo0:‡ù©Úìï×Råó“<ÌîqµFí}æc”}[û¬#ر‹TOb÷ïýECoRj¯%¸q¬gÃ>»¦³‘´·»Ñt N °›K|f¥ Ãßd°€¹r˜ôØ/köíöušõ@`–ž’˜)•ºÃË¿’ËØXpe&¹IN…ŠíWY?§E¥v�£§ëhèö^“è-QÁÞbÞNHÛ—š3òÒÃÞº 3Nà­7ºÌŽŠ ¬‹lù–F ».«z2 ¹Élà“S%ë}‹½ÜTÙ{ÿM)ןõâµëëý÷ã �H$’À‚,lS2ŒTÊB˜(1L†É!e2 ¦B†I°Äš†)¡�d0ÀD#¥#!¡&h0‰‚a‹‘%"@¦Œ$²E#!R’L€DÅ š$QCHS4ˆ$R‚ŒÄ$Ä hˆ1 Y,L‚É ÀŠI0Í’)Œ¢0“$à 0fŒ˜HM�–DQHÐÈ$¦)‘%)”# ¨d©š(²£bHi�£‚”h³H$%1 bdQ`�!%%"�I&‰‘™,L$$ȉ)aKš�Ø´•Á�"F¦2MBFŒ"A@™)6&#& 2¢dH£I“RQ 4‘‰$š¢”ÁeF�”@ÒˆÊHd"3!RL€¢@‘(1�i˜#&RC  „I`˜€If˜4ÊQ€�,DÓ2B#12d“Ca2Š „!ˆÉ3!)£&$¤T2DBHØl‘`F‚ˆ@›¤c fdˆ�&$f"�(f‘¥$R$£0C#L’&bL£eˆb1&Ó (I¢Ä¤1& ÌÈÅ&" ŒH’ŒÉFF!2ˆÐ„’"A™1†$I”˜²Jfb£RÑ2LQ121²Œ±cF4¡‘¤À%’(HÁ0a†M0ƒJ1I”6M�2D… D”’!`b#Fc)‚Pe±2I¬HÈ(c‰¦@–L–H‘ È€$2"$Bĉ(ÄÒ`H’FLˆŠ¤Œ lÀ@‰  2 „d*!A61�¨©"Rl�D6L› ,Ì„"š0cH±SB´Ì’Q4¨D"D‘MDÄ”jɉŒš`±DÄRM& “"I H˜"HPŒÆDdŒˆ”c$BdFŠPf%CBe(Ä Ñ$ÆH”c0)˜R"24$š%2b�bD‰¢aBÄ€$˜�i††c$ЈI’i1DÈ(6LÄÉ ‘C(…2F$ÆÌPD™˜ ”[" ” 0ƒ"™2É6iHÍ”d‘Sa †PÆ‚$‘�©H¤Ì¤bYØ�Š@f¤Bi’ !©™¤"H°™4QI’›�R‘�Š(Ì6&Q¦¥41A"Œˆ$KlÃ&“J$#f2‚ÃJ„@ŠI‰!!†ÊIb’0(aŠD¤Ã4Cf1ÌLÒbFd€¤‚HÀÆId(’ ,A(DS )%&„ˆdˆH͉š” ˜e e&"&�š “) SDP˜‘#D‰š`†Iˆ2dH 61’FFD‘&C%*4 ŒÅ†!�%&d„̉‰1�…d@b¢‚™ 4Í‘”¥%(&lÆLd„BRÀ‘I4�)L2RRL¦)&  L“a# A’alHƒ$á�ˆ‚dÄ3‰"2”’ˆI˜I3H¢*¢™"f` ©¢lcI%3RaL0DM%33,Ɔ!d²$ÒdÂÄEI23PP•� ýßÜð[ÓpUaŽÒ×´TÈÛRÖ›lf×lšÞ��W¼ÚÁ$àxx1˜Ê‡ [Q®*GµŸñÓ´¶5‘÷–-výŠ5šidõ9E@iwUcVz0>Åïiªßªj‰K¥Gl.‘0×÷›¬.!×Û�Qgê† þdê'û?/ˆKñ„°ë²œÆFËÕÛÕ&Hu(+¥ �i:ØéTÙx0y†?x’´åfJK‰Îóéñ˜Ì§�<1•[W!ˆí³ü”� áõÓàñÄ n*-8»4š£(¡”\µ/òw;A¡'Û¦†cSÖ‹ñs¥{¸Òg'Fµœ"šS¬ž6q_bÿp·µ¡&+öØñwÊ‹I�ˆ<ùÑh逼äæq/ `2¾TÄ.ø‹³—Êq/ÇzÝM°¤Å‘>¯ZsFJ ÙgOt ìIhOKQw(/& ±)dø7øP®%\Yße4:±hVaÑÆàGy¼7Ì|³%iNã%Jf°‰«Æ0G´¡ÓcWC _Éݺ‹Âž…•û™wc«µñá��|ûú6«Ë~J”6¸—úË$ýPýfHä0ûî¯isg²ž›27¡ƒˆñÊ‚áÇ:sEB3×ìŽ_ºV/Fo¦Jr/J†‰Œ‘)‰doë^è›Cœº1#lɵ¦  vwÕÓ:¨º°‡Ù Rj*¦�:Y<Ü ,gåœYø{m8Û¯]ÒXþ;ŒÔ.2R¢­³“ÔŒ;²ù–§­ÚÜü¹S˜k~Ð 52)Ê:ž–õ-Ê!î¡vi-Ûö•ămÐ Óß8…m°ªÛ¦´.S¢–ă¾p㟠óÑŠVÔÐPK)Sý~=5š–߇£ü¬V?,jv×ê 6G&ô2z:ãPbÆœGçºö-|[0­ôû«°-·Æ£±kÅq¢ò�ó3Â* �¼Ž2:…QIE.Ñnøˆ°èÍL\ܳƒ«+«c_yx9T–¡ë.éS¯eaøøÍó&vɇ�[Û¹NI°´Øé Ê Ìh¼³U·®å‚*±†C\ë3|õe¼ªgûóW![õ*dS§÷Uæêéž´ü™Qñt«ÎãWgIg ¾Ø¸+ÖØû—©z öÝ»§²T\›©ƒöŸ-àK©hE öÖe¬‡ cÊ4[Y�LÙÂàKEnjµÂéùõ5ŸÛÒ %në¢ ÍªØþxå*w�ï sÁ"³tάÀSŠ?­ú·²cVŒ~;ÖTà˜ª¶'ÓÔ ªg…Eþøï«Ÿ3^¨Ä 'Ç5nóÓ*Iý^_5¸BëëO-µƒüO[@ˆ;uGÈxÔ€��YˆšŠÑ@РiKVvŒž+ÁGÓS`¡º×W@&×Ò‹{˜¾ }¨Ö^jmuoßn„8eHÙ¥:ò”k¡qÒA³vàåÏ)�9^-;‘\;Ð>õ ^_Ä$Àüò%o3sõöµ7‰¶ý…ã ‘“¨—|…aŸŒþþ«ÓMEÞµOI„íöL·Ü‚]J³­nÚ8&õ ûL ^4@tpóYå<žÆ´ölŠò؇[Ä(«º5�_¨¶±§AÊ—vx¤Ú–ÜÚt6²Æ£tÓÖß.„ßÖ|È>6ÿŽÝ�öÅÇòúþ-CÚ›¾ßð{¿VZ›5+µ¹³”Úo0O¤ö­�%å« ¢8q­Ï%ƒ-Ù½1”;¯íi·6ª�Å$ý¼ ¬¦ß ud4ä`Í®AôÅêæìáΩÆ/^¯Ü'kQ;@dCâƒ*hÂ`J9]�D»J³ßUçò¹¼Yü÷oïÝA~²MQÚïèkE®M£U Fèúq 8NO(Å€ožß�&4ÏŽ¦dl åéI …»ïløÞÑËÈŸô¤¨Ÿz±Ä¤õ‹–«°I¼é‡QŠØ|äÂR\I�V`£lÆ*,ÊDÆœ¯?z�XºÍS/ÅjîôþíÇ_(áÎrm�a©,ªŠOìØ¡W�µ$ÅuùßkT]ðâ.Ð? TÝSß„7éî´ •R:L«Ð/^�@€ jVWOÍ óBøª}�9ˆOS㘃¥_·øÀJîüéTbñqùéÅŒÏá¨/i@%ŠQl{¨j él$wómüh°AÛ%;ýçpýþAÞ;GŠ — ‰Œ¼ŠË‰‡Â„›:3Þs¡É`ÎXO;J}�ôÓ¾ŠN¢2Pp·;Ð¥GqÆ´/;pn©ó„ºý¨)¡ eógR#„4]Eüs”-Õa1º‘GPSXU@{½—j Ó aô *?Phï7 Ã4 ¹U­¯ä¯H»¶l½9³ÃŒØ´¤gq®§æÇÚªº]­%LWéÎÒlÛ_hJFL]Áï¢gv`6P›³^’eG‡í¸Ö¶€yÚ˜ ¬h—|)áÌTw˜º¥pAÕÞäoOTæèÉö™MúÝ+À´ì«ràó¹î/£-˜�Šà²ÊUuu€Eózg~@Ü.š>¢±x“¨ {ñÜšöNºu p°±º‹¨‹×¦TSåªCvæ³U¶Õæ¥"Ýû¤Gš±+ÕZ¾�ÜåS©}wlƒ¦Åò[ û°¬aV=P�G½RïPRä±nm„íA'õ”é°Ìá˜oÌiò¡åç6Ã஢Qžˆ"¾Ù‡Ùv-Æš¡ðú+‹J´'u+9™Ä‚/üÿײ»œpÓ¤"Ȧ–¡øÍÃüå�ã¥÷Š·Ú¨T‹[[ä[Wü»f#Hž½žŸŽöú}G%ýòC½…Üàó±¨çe}rÈ’ÈB­dn²ÃŠ* É‹p “¨O_ö_\ôÇUÌ#2ϼ,:Þ|ðW±œœ-�þ­rùûçùõQ‹¥ ßÚÜŠsNâÕ»¤yüÊåØq*Ôïé÷.ÏùVú¥‡ò9wjï°Ž<ÝÃïÏ)¿²Äðy[ïfÆÆùœS¶=íâÝjÖc¿«(ªÈOruï@<‘¡9}5ü\~Rµ´›¨¥…6©­º£rºvëÈRKÄED¶Bõ Zq°øád‰ë—°\^û�¢% _ýí?ãŸö§+·|5®=$·a3×Å;¥‡{?ÙGÙQc2ÙwK-„[-D4>eèêSn´� ÷ÊÄñ´`…ˆÁ¿Çxfª™G@î¼+É„ÃlÁz5\Vq%âê8gãj%¯;ÿÐ\©öÀˆa„buæY/{Ò üóæ“ïe©:Wj·Y'ª&q]¼&յ߮@Ó50ÓϗѱÌÊÁŽu-Õ�Ì®ˆþkQ"-{o®wŠÜëkªÊ¢,m i£»JâxFw­Õ°vo†¥Ö—%dŽ=j9Äsé^7¢_Ê>�«,ø‘@¹^ºö«j¿&’"ª‚½Ö.ØÚ ì¦ñrëÜ}馺ª>·FÈ7¤ºk¶¹³'öÞ£dYöä5~tðãÚ«(‘‘F¹EÄo 1$æsE²Ë)Ç…­Xù«Ëcoå·%|iQL0㙨úñ¾Dpì;Y4¨<ä×ÒÆ�Áoå''¿ÖÍHr¥Tÿ{ÆÕá#*�ÏÈûèzQeÀKNŠ*£¸Æ»Êú)ƒ_ÞÙÚ�/ ã ”„`ÂÙôàÌðUËu5Ç0â鱫$W»›Ú–æ+â¯@Nó´‘p¯œ¢ÓŠHávÊf‘p#�r%¢ƒËfÎ`'FèÊÒ2²è›TÛÖ8lä”܃í.§F/¾gNTˆ B´¹½1Ì ›n⟹÷é@γ#«~¢—‡ýßÅñ·mUøñÉbâ? &JI’ðb½‡C5d)¥*<ÕŽbÙüt.æ'eëÉv|Ÿ�™¯‰çk5.ƒá}âðS\"Pd‡äc¼p ½ÿDFR´€§E½Ù\¼“Ʊ¡v~®+Wóté²ä³F�8ˆ ÿ>_ωÈN³ƒ:K)\ÖʼnõÃaiJlŸ ÿ×slìñ�Ùw:׊ ü5qú,ݲ‚ÙÆZÁ3ˆ«0-•oò&æpŒkþø¼áÙ¿�į¡ùóÖ·8ç7~ëaõSõ¡Ï9W󰆉�‡ñØ}2Φðñì°Ѻn„ïŠljŸVK½#|>õÀ/··Ç�Ë ùþ¦[’“Çó«>ö]F^Ý�œ|ÇÙèaÕÛÕ/i4ÜÔøª›�ä¹{ý °þ^Ö R…ŒÂ‚šIÉ“xpK�û” Œ�Ô–qf´±!/ôöFD#ýý¦¶Ú’NÈSŽôë€ý®˜é7G¯ú�Ù²„Å\8³•ÒâR_<‡ìÝ/U·[MÏþ|5‹û¾<8»L gvL–£ò:鲄K®‘îIÝx_7¦z`®½t%ÏA [½ÿoóûWÍH•:å0¯S«ŒA³—®†¡<¦½¹çÃù’s2±¢´ ‚Àhäv®õüô±*03QUטOBdQ˜H>)Ú@gšcb©=¸®•ûg9­)R_ÞØÖ”ÿ�xõ¸YÒM.Ì]e¶0\]Æÿ4Kr›æp§�ê’uÂiÅ5–yJ)V ‘=}Q+Êx2H ÂácvÐÚˆF)¶Øüv¿›W=êg¦g×A6o0”V¡ÑqWh/Š�Fq·5-äI0ȼDT¦êÕÝ¥Õjîig±ýù\³“Œ1»«?||ÖűUîÿþûýkÆþËLÙŸã×ø§å!÷´þ5ÒèG š?=wh•ÿߪOëS-ÕÙüc9'9‘Ï@Ÿ­h£ÖŸŸ߉!�ßüíÿ3G__Ó³&*@ód¸ÏmÄ `ü¿“UU.ó¡ª1ñ‹O*È1НgÇæŽ´«Wû�q«Pq IÊ€[Í:•/×=Åó´¬û¶ �Ù/aã:P/])î^jÑì‘£žýãþ¯ôR«Ë®‘/^>¨°^Ÿêc}üÓ§ ¸üǵ"ååB U'úÖèº ¸�åÜÈ3ïGícAØÉ'vŽK®Ôß,ùZkv”Ï÷ýþªîëŽR°± ,=ë=ç+ûŠk¡•Oûììõƒ×ª~Û)Ø–Ua°t’JòÏoöåfÇø<,~¥cÏ*�]ó››(?²K¨�¤C4£÷fþówT¢ å±Vþ»³åvæMU_4:~ EâNåUQá)\ü½™d°’¯:ZíÒÃý¢®ï±º}K‡uÔp§s‡úÕÆB©x§Š0ä¼”lÖ£¨ó(¥Ë}Ϻõü‹j2›i6g‘‹ÓN[n '+ª7í£Ó“ûênXÃK'™˜‡Ã €�EçÚ,âÒˆ Eli§RöOTß¼«ƒù”$ôBv_«�<3¶ðlü•²z£\<^¯Wº~»Í…ü'f'4ú-²Td&·~ÀÒÆÛÿ>1pd³ ×nWåÙáÏ›»M®{1æ±!‹¨øû»/×ÄÙ(hŸ¨ÿo$Ïèáe[6tÌgí:‹"]tQ|FÃ� vÖt0ÐòI=«ãH„êÆE™€èB±ê‡]N°’šM„Í –¥2¨Î†ÿ[U‡S÷¼{ãf,¼¥¥�·JN‡”Ø}£_sÑ/¨Lï5Ó�ÐR9NŸ)»’M·Û–@Ø;ž&˜­R9I F-HÊ©Ås�–œ¥ŒèWÌvµK¢EyÆà« ‹øt¾~\æV Q±SÑoufìÞP�°Ž‰ÈÔÞT ¦J´mè·ÿ+*éaÁBûçìÁ°dûÿ%:Kâ*jø¹±‘>踖},‡×¢–ÈÍX|B‰œ‹Y8´ o÷þîªÝ¿îŸ%\ˆwÆ¾ê ¹Šý6btð[\ðVÿ(¯¿ ºÿ/{¨iàè3ýN�¼ÆÝ™V^SŒ’ø¨âŽ›á)ÀP°®N³Vç�?\ù|Þ±T´·ÃeX3+ó®ë•ÑqÛ ÖR{³lµà€9qíôYCZ¼«Z”ò¯®¯ÈÐa4Ñ×ð¨'*Ÿr�vRðk1 î~eŽËhÿ¡Þ§3ñëhƒÅq˜sjjw�Ÿhw`¬añèµ2LéEvme!m ¹ãÈèænÞ-Ú…D2yvÇ&*e„!¶ì�-ÅqÏÝ(¾†/Ð1Å ˜ Ÿ+6b_¦Î‹ý>zTºv{Ÿ+©¡»á5¶kßÏgL�ý ¡~SþÚÐÎ#µy&PçMƒ›ÆtxÙâû^M‹dÙ÷ÌýYO¬¢ÍImZµuG Ðnäìo×¢ž³°\B!R+“¨c]÷ϲI}­^Ñ^<ØPU(é‰�ø×ôïÇþŠ2í}CÅj.Q0ÿ¨í¬l3àlíZàû–°!Ó�U™|ÞæÐ@Õ¯>e¼Àe—šwTtÌGQ4ÎZ¥¹²²¡N² �kÓ¡ÿ—à]ŠÒ3 esñ<ÁZq¥óO°Ù­½‚ÇRY¿²ŒÁ¶ìÝJÿ°æØ¨×I?ä×I/¬ä [DTd�Ÿïãn¶‹p6Mº,Ó¼c¾û6öfÈW™:ÙxÉò—¥ÛœßÕ'ʶ”.´KW ÎÆø6Î=xd£(IEuðeÞ9Ûï^Êû H`D´F—Bnf·e?å|Ïòm°»–Ìå�[ÈçÙL!ԩʤƒ´RuFÿžÛ¹H»ÒÕ ¦ ©T¨&úå³0˜L;‹Ô2#ùÐz׋Ze·ëƒ8}uñ«7,”&Šy-&í¾‹E�À–zÔîï20É|ø-ÇóìäéfìƒåBk–¹C6[ƒc±wÉÙê³þŠYÒý2ù5¯ß³ÂçøÙ�<—uߪûÜŽ ’„˜uzÆúÚŠ'oìqyýµJííÛ0zlžœí놘ÁtƒÛ\ëËÇ~†ê“†{ p1h>––×d°rS¥µ@•ÊÍ}y96äL)ã»�ÚSó z‰8¤Ô{!¥]Ôþ¶ó!%ÝpàÞðg8¹¡ó ¿MݧóÍâ£M;Géö¬SgêÊøÆ#&ž-ì»�×Ï‘«-ÚÜùÖ‡ó8Ãï…E³älZ‘WòšŒª¾G»hYà»l^ç’ûïÅí³ñ¨ ÿ«�…Ÿ§çÕi_f¿dÁ’,¶¡a˜ˆt"‘wÅý„rÿwV—jl—H–bV&¹K»+Ì�'#.¼-ŒêjéýùeRgD4…€J»´¬ëÆt$ÑmÀ‘qõ¨r¬®¨åâ_�¦$�Œ½]ÓLšlvU Aní雲4ÁîZ7Êd÷uqàÖ\+¤m3tÏEB]p›·IA¾‰ ù7“s™aü˜åeKAÑÂÄÛ5Ô¥NKzäE„•÷ wÃë¼ÃBÕ½ÍO�ÝTÙËÄ'© ˆyN|âßÂZ-�Ác|º¼îxéÅ"öYíQÄ9Â%>ÿ-o|¬¼þ¡ —²Ø“T&,¼µæäL]ßjâ�E»¿TÜyRº(~ŸHâÆmTíçEú¹Šá.â¹}c7elž½ý›8ÜÖ×WÆÊEݬ¨yΜ; c¯á5X5ÊÌ(Jª[Â’�XY)ñe.ýÓßÓå™0j�”!x*¨YèåaÞ¾™âIa¤i çSáá<ú—#™W�Jš’ë�c€¥ŽŸf"�øfÈ ïtüõg¬d˜¨Åòŵˆº‚ößãž+êç©rcÝœíõ…*š‹ä ïÞ,W.B÷ñŽ5àôþè¨òÙT¯ñTä«ÖLï°�fPhÙ 1û9Ší+Ï`Íç,Ô™-îšlÚkw"¤§Óoè4¯�ð<ü`D#£ìïw°S…j[¤¤m¼zÏP0¹UCU3ž1.ΰ]éÑ–‹kþ|t³NgF€^:ûοr‹Ãï¾IL] Žïˆ°$³ä´àѵÉD ¾0#﮸ì9לaÆÑ%]P¾¸tïÌQú@Üoní^zÅñåLäP„«h£>­4*±@âÿŸU‘ÕýÍ*ëþÔ– ê¤Áù÷ Ö ÍâóÊ_ìœûR>/,R�/kô–ê.9Pº@ÅJBÚ²jú=~ɯzí£w¸ºR£Ï­ƒ8ÖNYÚŠšéÒ’Äí è�DÉ÷s‹î�l¨È¶Ÿɲÿ®Ñß÷ DÅ µßDAKØ]ô[Ë~È(é}¿·�o¾•`ç–·¤züÿ”RTXÇÆ$ª|ÖŒ{‰^×[ºþ¶ô½k—G³BÁÈ4X £T‚Î…n3ù‹œØ�Tìò—SAr\ÕüUîÛÇÉ<æî÷BzÙcv;ÊK13»äéþôн:™É¾TóšHœ _ƒ>æ½Cùü›]æ)hšÚMƼ³"²¿ XÇ› F¶úulù,t.­%Ý E!‰õÕ dôæcH´*Ö56ôM-ŽP�7#Àg®K·ó/<€øHæü²R*’\åv¼ÍRœ<ÜbŒõsˆÒ®ÖÕ˜-N zêYWõŒ6Kvúô ©™Kv­J1ó*¹wORúíù” BÕ[Ñí¾Ë!¬/Û—³ ‚î�>‹ð4Ò8&>|¯ÒË7ß²ßÙ1´›cNàl÷°i©p¯ÁŸŸ:í îF4(ë;Am‰1+ÉÛüÌÚ…zš�é_ímðdV‹Sößið&“õ�w²ƒnZ�0°_&Ï?{}æÛ?Ò'JûGà2¬»†¸J¦ÿ˜‹ jg_!ž8ɪæR|Ó²USºtÊò®µN²Hq»ºQ::æxÝûˆWEЮ6܃B¿Ï¿5†·c+øMöu‹0±eHzíñ¿ƒvZ¢"_¨i´K®Pyj–á òWŽÄcèÊÚ«SË›5-“{ØÆ|¾m˜ûj@(ªÊÇ4ë/5›ö“k°õU›3I;‰2¹Tàê|’�´î7Ò¾2®’ÁJÁ¿ ×Á®­œ$õëå8OgÜ¿$꣺*d¦ÿEŸ�‹Vl«å}«Úºð w 2ª±ð` \Kà]¢˜ž-—3OinYF‘»¢•#S£òÞM¹\ ¸ôw�Œ=ÇD¯I,ñòMYÚ;¼ÅDRŒÁC·ÎùHR±. Ö×Q¤ì›ijÿìÒYm¥òi:lU�ÿÓì oÌ’I«’¨ªm1© ÈôÀoàÙ¹‹\>4ŸoÀ1⣬ҲV关Ş4Vz¿*³TUJ×´k¬¿ dð‹PÿMj�ZE¦Ï�å'ÃC˜çlíE¡ k©Ü¿¹YOÅO²uËrM»B'KÿŽžòëårˆØ‚“6us Nw x�8­ò í4øÎJ˜†v]² IA:×"âÅÏõ$ñ�bÉð.Û«vŒ×BX–]køÆ0èR wBWÿ½fÁfæ“*EßÈïæqúRªÃìâ�=î@¦a�ð&ÍŠC9ùŠû¬£µKûýé‰÷�š>²¹jƒ’M\ø ·s ³ìˆôN óöþ~ÉøÌ/ 8Àû{VJsª/Ö]Æ’„Ùò<Š Í˜$“f1whæÖ?æ utüvf+Y³üÍ‘M€ ÔÞÏ,B_¢ÒqòÍ7)XCLÏÆ¾Io^ÚÀrSׯµÔð.í Ú<ï ‡K¿“S¬år¿YÕ'¹=¶Œ« Ÿm¼¶¦ÔÑç ‹+E}y¶œ ñ)íF�é|÷Ý9™ þú¶ÆöÛò½šfãhÕf�# ’¢�wüh-B�!•J„̨”±yÙ(£m3êåeü#ÉB°0bìÉÝÍ9B7II°lö�;7_.îãÈWQmÕ=Îtø¯Â L‘iü½‘b ˆ«ôäÌzæð• ƒŸÂâ/íW 'm�‚žGRâ®ÐŠ«=Kûó›™'­2�›âéø.l�¸Üþ˜àÜWØ‹;�cã}6̆ÈV·ÛUMa>ÝѤñ Izó’ïuë?ê|Ãp .ÌnýTëõMmk²ýñ:M¢Î%ÐsK�ÈVõ¿º�[’±$ñ6 •_ù)ÑüžÈñŽ luT$b:Âz›>C2(2B.ŽÞ·.%c�Äï?áöÅÀÁü—K‚÷[ÈS1²OJ˜HwÛ-(|ñâÿn¸Ïb4±•¬–¼¶Ž,jo‡re)AÊT‹äí›…võrSýĄ߬³y¤5êóåhÅ]g@z…#…ê,•|ÇU\š!Y_˜ 3ºwƒÿ/IÈ‚Ÿþ?Ô.A8ƒH}ÙÝiìÜFø—Æ^Ÿ�T( 'ç¢6H¾täÊuÛ•ÆÃGÕ(òÂÁ­JõÆÄ’KuŠuõ[3¶�ô…ÿuA3eº,Ò²#·Y×à³s›÷×Ô”MÏwÔïº;Öþ2 wlwìŠøÖ;FJ™8ˆÃûzI§íï7„D'»^ª‚äf´z{úR[ºz¹–KKXyðMÄúüÇ×mMß\]…-5öA7Dߎ-Ð�ã1*«¢‚Ny½}3ß�<ÿkœëЖ«©C�Ú-h3DëW§·ª¹LÑ Ñ`ÿÎÆc‰F:ù‚‚ö&ËR»Ÿ˜SŽàóÈ»¨S»¹Ë "»†qüwÞ÷gÿ7›_ï[y¸&p}ÿûéýÕfeÚ¦%ÉOèïo¦h)™E¬_+n–­ -@s¥Äª~®ôTgðôϦßè+³ÌµˆÛnw¡“Ÿâ’]ßò=÷BB ר÷NõÔâltVè÷EOR!i¯�ç}: (ΨÍPêÏÜÕ<§”¡»I¢!Øc”cþ|ø¡hz3fƒÊ¤ÊŒcsyøŠ¦Ât®Ô±rå¡/Ï;ìÔR±-ˆQ�ÉꟊPÄC�å€Â­d8!·ŒûÂPC· .wV P3ãôæ.ÃÕÙ›Â;lB˜éNðžú�>ŠÙÍn+ÌÑô�©)ôïs–H›[Õ2u=Mv¤²ê>€¡žþ¢iœùøß öRÂ5ýÕæ½Ý|î÷½Çož¯—w½ïÍ×ú¶Ö­¬üöþEïq;¯/{º\ºNíü.öî¼åzK®8Î]>ýñÇÞïQ÷|÷Ý·ëîùï¾ïmt(ßrëÞºŸO7¾ß{ï»Ù{ß¾ç×D}ݨ˜;º×¸ºçî÷§]û¼ýõÏ?;ë·gÝÜw.®¾ûÝìî™öéÎÛ®ˆ %&$""]äZ“Áž(%ÊK “»Ýï¾ìÞî ûºzë™ò÷¦ìyséw߻דwÞ7õÖµÿum·øV¶¯ü¶ÔÚªkZÿmm¿ÒÛ_ëµµ;V›kjÛýuZ¿ëU[ÿ{UW«Z¶ímZþêÛZ¿ç¶ª¾ÛZ¯çü¡)’$*HÆÄF4l[c $�¨Å¦m0‰"FDj��A!ŒcDldÒcL”‘-“b�¤¬I‘d²P•”°Y1Ta šb*HÚ5±“@B"`2V{[oUZ­êý5&¢f˜ÊÑ�µ"Òh±­-°l…™&ŒZ¢±·ª¶ÿ¶Ûëj«ûmj¿ŠÛ;U¯mZ«ûöÕ•­kímm­þÊÛ5­mþU»[_ßmJÛzÛk«[6ªÞ²Ö¶Ûm�¿úªçwü¦þ;¥H(’â ™‚æÑAÍA$R˜AÁƒg¥ ¦A—/]„‡‹‡„�Ò ¯3S…Põ7AÈ)‰uAê‘+©T"ÐòL'¸!É%'ˆ fŒ…ê!Ô\+^Ò,2‚JSÄXÓ D•$^ï3@”¡Ð.„«€ÌͶff ßû ­m_ëÕµ¿ÕVÕ¾µ·øÖ¯ñµU²Ûí[[mþv¶¥j­¯[þ͵¯jÚßkj×ú[[~µZ¿¿m[jþ5ke¶¶Ù[ZlÚ­+me¶©µmf¶­-U«†ÚÚ¶VµYU©j`Á€ìùõtQöœ€JxuìáÞ@„;îuéO}÷^ùÝ=íç¡‘{ç�¾¯uî޽Ȼ…{®zï{¯:ž÷ßwÆùïwK¹×w.íÜ]¯]¸î’ï/{�ݺq÷W×�ÜùÝç®'w^QÓ‰;«Íss‘ÜO8wC»uî÷�È×wuî÷;B !9t'p¡Ñ‚R„áˆÊ–weÞž£uéÓ½woU½µ«úZÚ¿µ³ZµëUW[¶­U,«j¶öÚ¯ðª­ÚµµWõ¶­oðÛTÚÕ¶U¶–Öš¶¥Z«ý6¶¿šÖ­ºÛmUzÖ͵[+R¸’2$A¶5‹F™šJˆÄS%0‹l`2D‘Š,ÊL�cQŒRU(ÅDlŠXŠ1¢+�Ôdˆ‚£:ÕUöªª¿µ¿çµZí¿ÏZ¿ŠÛu«j²«Wªµuµ¿[ÝjµvÛ_mª¯æÚª²µ,ßêlVŨÖÅ£lmFÚ Š5oÚµ¶¥šª³m®­ZêªÊª¶¿¿Z¾ÖÛj¾þßÛµ/Ô;�Ýð-ïòï7Ò¼·?ws_O={«ô-òÜ¢û?}ûž¾Wîì[š÷îµ=Ö¾|¯/Ÿ¿^ý¿~Øó~îòMÏ/š¯+ôóGåSîÆ—sºð7— y¯Ýú÷î÷·ïÝïvï{½ó•îóóóìýrèûïo™-Í_~ïÞêåà¢I’0‚JbaÞ\ Œ8`´4Êõ>ë›ôŸ{ׯ/¿_Væ{¯Ó§777Ë��îí|¾÷ï\«Ó|Ôî¶$B ”œ:3!ðð��Ág—gr &!ù;¼®o»óÅ|ºmï»÷º÷×}ݽ÷·/Ï{¿+æïw~ý×ï»Ë ƒ|åø±‰t‘2Cº`™H—PÅ$Ê\@Dñ $P@„åĘ„)If‚Áà‚¥vä^îù^÷mß¼ïß¿^~W+•ówîÞ[î9'×pöýÝî<¾û¹_7Ÿ/>{î‹ÎEúýÕ}Úóuö÷çÕõ÷\½žE¯~ï=Ý'¶Ú×ôµZú«RÚ­üm­Êßµ¶õmWó¶ÚÙµµ·µ«ø¿°ÛWòÕËj6 Qªæ(æÜÚÜÚ+E²mk›mͪ‹mËXÚ¯âªÛ­µë[jþ»mkÚ¶·õÖ¯ÖÕ_mUzÚÖjÚݶªÝVÚë-mMVÕMµ©[eZÖíkm__éíÝïdÏw'u‚åÑ{¹<»ìÇ»ª{¯{¬l“¹Óyºë·DårÞíÆH¯Ks%3œyÄ=Þ÷Jb‡w½Æ yºHo+Äó˜îã{ºô�{¨çJ,A^sÎwvž.^^¼ÎºêˆîÆç;—NõxÜÛœ4b]ݹu¢^ëŽtÝ×]×(æé:{·bþvªßͲµ•Uo[m½jµ]Vµ]V¿ªÕ�±VÅZKF¢´[_ŶªºÛkúVµ­¿ìµªãûuýþrç¯='tGww{½{»uÔ˜ÝÜ»«¥;žë¦†šòÉ9åÞN»¶åŠ‹ÉÓÓ½½(‡—òæ7I×IsY1rît:s»»¹ËwuÙw9{ÝÊõç]vwô.¯:à½wyǽëG®î=Õåî9s�Ùž»žw7yïq2éqç<ºó³ÑÖÞï{�K®îï{nöívèc“»›ÎçŠç�Ñ仹çw»‘Ï=×½ès×—@º;v÷º½{¹»´Þ÷{¼ó½z‘ u5ãº7ºëÝÓ+Í×:{»�w¯{2'»Ïs¸yÎö÷ºN]Þryw.wd¥;’çqtË&S�sÏ#Òõ×/]ݹÎ÷{˛޼ÁÞÞŠïw9=Þõ¼Â÷w7A.—\¹ÝKºwbï{Þs“®Æs¹Opîó°¼åì8»Ü’kÝïwžç½Îº\]Ôãí­WÕU¿�­®¶µ·¶ªÊªßÓm¯«míª·­­–Úmµ«müÛ[k+mý6µ_ݯJ¢¢ØÔZö«Ò@1F Æ-£X¤¢ÆLb(LhÑl*#hÑ¢B#&�‹Dí«ÎÖÕöÚ×ZÕzDŒF’&LÒI“ÂEDl¥ ,Y˜fJM˜XHM!ˆÄ• ×Ö¶·õÛ[[um­üÚ­e³mUzÖ[mv¶ËU¥¶¿�µz­k^Õ^Ûk]k_ZÚš«¶ßᵫoæÖÛú˜ÔI&“F+–‹LD ’†±É‘iHd›FÌÕÁŒˆcQL �´†ŒcQÆ5}mUÛUmý6µ~ÛUý5«þ[m­¿ãVµ{jµú¶ßݶÚÙm[+Ukú�Ÿêïìò›“úýß}>÷·³ßÞñæûθuÝáë¡ß{o»ïO;/»{Ýóæò|åwÞó¡ "&‚äIѹvƒtÄ” ’îåôíéîï_wß.wÞ÷½ä÷uî¹Ý¼Ž÷r?�¼÷Ùn?u|ûî÷<õ¹åÄ7…ïuw¹îw\ýï{>ç^öîç—ïnû®I‡r_7wo{Ýïw½{¿}ß ‚é2wre$\Ñhyt\’î'eçq?8÷Þº\wpLˆ)ÚR€ ¢¥ðE'Ê—N‚AÒE‚)"¤�Bpœ¦$�éÝœ’„D#!ÝT:PrJ!JLˆ’„šJè—ÄôN½Ï:�Çî¼çœ»ÅÛ£s§ºóÝÛÝw®ê;·¯R€¤è$‰D§Bœ&„iÜ\©pï ýÔ—Ï Çw£·»ï}>�#ÒííÞ^^yÝÄîèþ:¹zû½¹×»w»¢¹Fïv]võÎÆé뺾ëëÔóß}ùsyò¹×q~ºï;½Éw.÷s£¿.�×Þçu÷¼×½ï'¯7½;º‚ÈÂdZ"!ÑPItÑNè8IÈCÃ?CÏ�÷×w�¯{»Ýî‘\ç½Þåïw7G¹Î绹ÞõǸ»�î{×�ÅÝÝçÏŸ®û¼wx—»‹®î9ÞpŽza/šçÅ9‡½Þ¸’�Ú] tŠv%'!AÊpJ)9ˆh$¥ ¦  1F‡dÊ—‘D˼À‚é"AwÁ‡S¹wI$G½ÞGï®Ñ÷Þó»y¼òçäî¼pîÏ»·—L=×�ÓÞž/O\·;ËÞÞw{·±{º:y»»½óÛÝwMÝß^E,QA;»—,K�é]Ò§‡ÅÓËÃý¸iï=ééíóÏWw_zw¥ßÇ\¿??‡Óø\û÷½_wd¾oOí^ºï»žû®sæïFêïžëÑ\ܤÈ»„AÓ— îé !Átî�tˆ‚˜ã½Ç½Ýüu×îý~q|þž¹¾ï')îöçÞíçnîÛ�œ¼r^o{Ýîï{’tä$‹¹v.‚H¤‹¡YtÒIh'ïzÝw]w;¢ó½tUï]ëÜ÷»Ñç—ßr1í×;îïuåÍçï»>ùÏéµoçUj[J­»mmÖ«K[6µKm6ÕºÚÛ­¶êÔ¶Z«u«u[iµªënªªëZ–«W[j×kZíµ[uUjê¶ÓZÒݵªÝmUÕ5µiVÖßÍ­©mmÛm°a’‚ɤ¢“$,bQ‚ I‘C I‘­µ¿µm–ÝZÓŠM±)†2VÑ+o¶­ÛZ¦Õªíµ©¶¯µµioãU-½µZþ6«_ÖÛmum­ü[zÖÕ}¶ú­­¾¶Õ}¶×µ}km^ÚÕ{VÖûmµ·Õ¶ýjµ–Û]jµõZÔµ³[V½µ«Öªö­mümjúÚÖþ-½kmz‹!¡õ«6¶«ëm}U·V­íª·ôÚ«{kiU[øÉ‹23 #K1 Š,cA)ˆÆ2j(Œí­køÚÒÚµ*¶ý­·óµµí«{mSVÖú¶ßÓmµ·ê­oë[omU»mBùw`¹v#®»·wsÑÝË®»¶.ݸݺg\ÝÎ�Û¢èÉÁÇWuî“t“w.ºw.uÎwNÓ+·;%Ýp¹tçqήîåÓ·N»®îÇÍwtäq­kW[kÂ÷\i‚®k¥Ë¡sr;»“» J»·C—K•ÈNJ㳸œ‘ Í.îÄ™»¹n\Dwr3îæC#2ˆÄTÌd% 'wfa¹Ù�ÊS»‘&dç1„% ÎL¢‹ºè’E--ЦlÊîÝ9w;6çdÌ¡&Lîìîì2ç1c1&"çÝÐ8c´h…ÍË—MÝÌÉ–Es·MЂG.” ;»,#wI×\—ws•ݹwq—wH“rã:p‹»©Š$ȹ®tìÉrº•«úYoµWÖÛY¶Ö•m¯­UýùÌþ½ëÝy]ݸI뿆áåÛ»w»pdz\¿ŽÜ…�Ÿ{®÷·™ysÝÉE îÑ~o ëÝ¢÷}íèóåß¾üû+œûºDåùì<¹¨{Ýy9pŒkºèÞíÑ÷t½×Îû·ÙIg\îÅÈw;æ¼ÏwP»®A™‰s‘/wžd¾îÝÝî¸�w}÷½ÇÝožÍwº»»ô¼ÆI÷wï=ë÷»Q^ï»ÄÌcîëﻕæ`yÓ|ù÷Ý÷v îwD?7wïy»�tÂî�ÆÛœ¸^íû×½sæýëŸ9ÝÝ÷k÷Ü÷ÜõóçÝûß/½ÝLWÎrìçE»‚”É’Lä'HˆJiA�tÆ\hI˜¼æë�½ÆóÞÜI"Wèp›î滞í÷º—ß½�>}çnˆývás°÷îûëÏ|»ï½{ßw½Ýž\%å÷®W»—Þõ÷Û½ÇæôüîëÞ¹Ÿ¾¿×Ú÷rCÓ\‰ûî½wî¹éÙ|Ü]uËÎý×qwîüð°¾÷½&\ºzo½Ãï½ípÝ+ÝÔæéÝr÷Þ¼Ÿ�Ã;suÝ’ÏÝ\¹º~œFïz÷ww\˜�:î¾»òô{¯¿wÈy»yÈ7Ý|öIóï}ã´ gÞ÷¹×ß½=ò<~t(WÝÌ?;ݾzü®.c\ÃÝÏÝn{¸çC2å{ï¯9ÃËÞºni÷n÷|¹>EÁ$|¾î÷wzï¾ëíÝÒwt2nï<=î9ß8ùsÎ÷]eÎûîïpB¾vM÷wÝÆïz¼{»^}}ßEç`Å¡GuÞnˆÊO»;¼¸Ÿ;s·îû×7u÷�s?u{½ä˜få×uûÞ½]û·1wsótWË“îïvé�ÝÝçßqw†õÝÆîëËï¾ø_>WQ½×½Ò}Ýœìçn½ïßwÎ�Ïšò»ïríïnû®,  ùrן}v_»»ÞóÝÞlOÞö3(dŽëžj÷�s0s¯^^ù÷}õ÷çRåÉîçäïÏ]÷|ú¾ww!ééx¾swp½×žM~ï!_»±û·L~[½Ñ÷·og‘âO½ï$ÁO<‡ºèîÝòíD~šèýÛåìw½zåØgîå{¶ïÏ=ô¯?7À¾÷ ½: —ï»í÷~_¾û÷ÎõÞ¸cç$ù\î×_—"HãÝy±!øno»žpDxîùÈù®û;O»ÈÏ\wt}ݳÝÄ»ï{ÍËs‘Ò»îùá_s�ÄÃîÝ åpå»ÝÌÜ|¯{½Ü~ï½ûÝJ÷½ã÷q‹½Þ#›¾íËÉ÷w»Ë»ºû»êæ_8£7ݽÝ^¥ÝïwÞïòèouÕÊà#�o¾õéuÝõÞ„¥Î“å秺뺾÷½q3}w~tƽûÛÊeå×U­Rµ¶þk]nÖµeªÕüm«ujëkT«m¶®ÚªímJµ­ýmV®ÛT¶Ûn¶ýZµí«-´ªºµm5«ÛjþµVÛÛZ»[V¿�ªÚ¿­½µ¶ÕßÓQu¹Ç]wuˆÎvç(+»¦c&ê.;¹»¸»ºë�™w8!sp3’äwRsœÓœéÔÄ®tîîÜnºæ';«ŒÒî¹wu;� ä¤mÇnºí×w;®]§2î�›¥ØííÈ];tèÀºë¸k�Ú‹¹É)Çpî—Næî—q î]×.‰w9wEÌŽîn;ŽèÌ•ÎãIvç ¹ÇDD£Pl(ŸÎ­·”‘E¢Òj2P¡£AŒY› Z·W†þ­Ørë�`#œÁ‚ÉÉ×h ¹Ž›DL£›˜±‹œ°;¸‘d�„œ»p·#cI0$‘ ë€S+—;«‰E’›ÍvhÒ]ÜÍŒ%@cwpš“wn�w3Rlçd‘‘�L;¬k–BAs•–0–B7uÙ" ØÑ æ8WwhB¤Å¢Çwwv,RBl¢�Ü�UmûZÒß«lª¾ÕüýÕÌhÑ$‘�¢ç6 Ãp¢Ñh·9“Q£lFŒš4XÜ5Ã`Ú,mAFÆ ¢¨ÔQk•Ê‹KºŽmˆÚ-±Š�‹F�©,[njæÑ£rÅrŒcÝd5%F¹cW6æŽbÆÜîv¢·:mƒmÆ1·$ÚæœêæÛ•¨±X4E¨¨¨·5ÂÆ‚5j Š.nccF¤ÆKÑ`ÓºµÔبµŽî¤£r®–.\�‚¥ÝmpܹmÍËrÕÍINîQ6¶¯çlÕµ«ê«*ÚÛëjÕöÛZUmêµS[ekª¶UMkJÕ¥[k¶¶•«OÙcbCA@f™@‘Q’,l¦Å#&C0ˆ( &‹DAE”+T%C34“(Q Í4[F„¤M¢˜ÒÁ’1jÕ_k[–Ñ£mWª¶í«mfÖ¿­­Z½mku­©mª›m­ºÖßß¶¯íUm­ƒóþãÿÍ»â+¯õ?‰þø¿üýÖbòüÿÊâhdÓÿµÄ@ß(Õãÿgþ0`­Žú‰©d.Nsjº(r/käð-ú w»�ãÒD¡’0u!gÆW\\¯þV“±ÉIw#G²§�´÷‡7ßV|w½Âf²©ÚÓ`±ªÒ•-€Ÿg£k¦1µ‚É´ijÍ­15,Õ¼Ãl–¤q¨‚µ {6 Ò´Ö�ÑÊD)oNC€†Í8`±k�IÒî/N ¸T<¥´azÿ×H0ù¾ñU9AµƒÖßùƒë£êYN DØ +Ö.`]`mâçŒ�-ó8³¥±^?štàÑaÚƒ"ǹÖ% Mͦ¡Ø*î6š•´�¦N-›•ES¶Z¾ l¬á§Û�œ5mšVn°!à/§Å�-¡¦@»ÁÇþÉÆ±ZxôŒƒƒ�Î8¸{Е…/‘UÍÕøjðæÔű‡##6ÛèŒÙ2¹ÑoOy�œ…^wd÷hœuG8 žñ¥Lº9Ýè’¾€ÊÖ½YbâBzïd¹žËç²J¨8¦×QŒ’=wü¹ˆ6«A±_Fs‘ˆæX'Õ¡Åb뛂åU#C‚�G0G~>*,‚"ŸlΫNˆwéôí9“ÛÝd ì€ä‡—±·BÆ6îdÂJÅtEëbt{né†&TEu—·¹ˆBž LÖ†ë„ÊœHR(èæÉÓp>á:ûìšã•8À]%{¼c½Ä .È78WÈC”‚�aìÓÝÑ 1,ˆˆ(Ѹ7�Í O9Á9�¥ 4¤vš\°(SºZܧî9cÒ¿�ì´jhƒlu›HìK@Ýq¨�e þáIÍ`*ô™ÍûFgäaÈ̘úÓÇH�V,nçî�_=³£¿9L; Ö„·ëþ^.KƒÏR÷Ÿ‡¼\n2ËHÀ4ßLÑà×; –r(äÎø½°.T–fó5ú´¹ÝUk Õ=„éÈݸv� 5‘ƒ«]2Å­À]bT…21NáVÖîõ`¬®´úºøÁ²ÄÊW (�XÕåÙèy™çÙrü³3 e™™ƒ6Y˜Ýo¬+µ±æ®¯Œ#6cd·­‚Ò¡h6Fl€�à'ºÑU¦á„/ÒW¢@mÙM„<¿Õ›1Âßæ8÷â~ÒQ¿\Šø×Äš§G ‹S�*C:˜ƒ—(âÌ¿#\¡ ¶)¯ß¿<«gF2¸Ã�q óŸý�AãCÐ ˆ -˜ÂdœTLo e°kº‘wGÊ!\2ýóœVhÏÖÕÚ’¯‚4¸Ë5!ŒBl -¢âÁ“v¬ÙÔ\èà±`ÊK¦'Êǃ˯†¬¬ƒƒh•2'0.¿çöAm¹4úÚ› õñé͹†²Ñùà§ÍŠâJÕ¿J�ý]5[dyì.‹æqæË=ÿô¾ºÓ`àZ–ÚŠœÂ¨¯o„åt ú`–¥MX¾ÒÑeˆÃŠ Ny†´ÞÙü„¹+?ê�VFðb…°%Ãl ¦ÉfÚø§`ú)7SNeš×ì;/äS–Ë4¨­*©‡õ¯¡Gáz£.kÔe³›/ü²ÜƳ¿È/åâ.½rFVœ‚|¼ÂR# »ù‚sî¾Iß~Þ¯ˆ-�s÷y¢r‚Êù«õwfK㣭â°dDÖøÙð8û“ë9ÝÏïkÞ¿�ÖKÑøÖ†‡ó÷šûq7ÒòÓêmÒá1Ðî3´Y?MŠûù\2ÂiyÖåžEC ±¦|:ZàMÜÞ¡Žá#i†Ó‰WÕj[šcñ_dBóû† ã^Ê}{rZà#ðgl·?w+±Î¹ì÷ÛŸ.ÇB=U¥5Ô Ž»ûß—~pÊõûö¥Ìy †Rf ”w~)¶•âµ�]Á×ë!ÇÝ_«>ú¬(|ZÀ¦G�¦æ¥óÔ"°qój_“…Ý'A¡$ôVéFîÑx®'zm�„äÈ©U’Yñ8±�tÐÙ1ÜW÷V¼"ãêý¨Ô™À3Ëc £Âß,Ag{¢ëVÎJTˆJëÌ㢑ò;wkqr/£æº”ºâ‹Í„ŒdžP!;¬™Ú€q,bFD£ÆÄI#Þµ>Zºå�.¥¼¯#êðöoSH-›woljÀÖ† ˜L$àQh%ìMìu&ä³jÇtˆšËˆ µiâ…þ)2›“æ–¤Vàp|'r‘+68CÄx›`9øhf=D L%€]6"|:?�ŽIß.DÊ�Ão¾!ž™…ƒà~àq°ø�-ݿʢÅ`S°/3ƒ«°æHÚN§†¦»€Sšð]2byÑ‹]2hJì¾¢ ˆì£©kUûcËâï ‡a_b‘d=`Dâ¶/»`7D —;¯ˆ3Ì7‡ßxsà…§ð –$<¾ãz� ç»)Ããøù�žùAä»ÖB[‰”=*¸­•9$d"↪ý’BÊe“uüüo>þ,†K0’›¢E€€_Þ­·ômýËWðÕþMÍ«ÊÛûÛZù´÷ØÜ˜ñ %{à>ç_]ÿG­×|]CŽÀè¡•r¥9Ç‹!Ö€Ú¹ÚöLßF�e V÷ æ >N÷¤›Ó–;7©ÊY²®Œ¢Ü+;s|M0tgEà[YW}…œ“/yÄM#í°y ¾3g ,\¾&øÇ¨p ø{d}l×ÖÏÐ�É<åM÷­é›é¾|JDâ“6Π²;”À8ãLa[1hæNDw½à�,÷‹†,ÙP»sG�vöæ÷€›e¡²;{¶ÈA~Pz„Å+\ð'º`ÑP`°m-�É àí…˶oN †Ö³ª»qÑ(ŒiÖ‘Û9­ß2°€ŽW5Õ¿½’ U^m�””ÃJ…ÝéÔ8V@LçĈgÉ÷‰Qˆ¥õ”Í6#˃Lh 0ÕýEöQ+Æ~ƒhµÝåá¢åºÐù"ÌaË}8Wd½¹ðF i}é »ó[£·§£ YÉ@éËÓÖZ(ÀÌ% 0GªáBwS2ÖsD±%[ŒýãÙzÞŽk^Ön~žZÆ›åK#2ì¦2l " Þ[ë-#ÅòÒ¹× ¾ïÞd:>¾rõ¥Œ5"Hx…rÁÔÏ%6 ©ŠïÔÂŽ_Uæ3 Ë›%w eQmµ�WKV;M0h½Ã1-Ç ‹1L2êck8à!YœÖ' è†v+ñ0(€èH½8 ¼74t�Vc.)ç—hÙëåA÷n‚*ß8&[& œÐ÷¼SÒx­žNbJ¿ÝÑø1dD,‚õ8NwóWCæÈ…Wì´*ØÈUÑØ2FfÄTk%O§X¿aoæ_Ö¢ÅÔb–¦Û¾n’u…/ÜÃSì4µ™¯­®ùĺóp< GœåÅ¡Mª�ÈÇr/È—^¾Øí‚çç î7í�+s‡Û:Õî})½ZÝÖÛd8·fí‹zçj½-Ðë¹�ÞÜöµÑ”¹ZI†\ ¸k”±ôymæ`ì¥mßKT…Ïf81`çMøíɾêÍg¥™ƒðqýïÚ§ÀØm¢Þ»}¯Ú�sÜœòù^} ñ¨·÷óÜ<µ» .Ñùµ5‰;e� ž�‡@ò9°S¾biK.JO71 3­Œ-ð/Ó}Ù -\ ¶ß›ý]j2¡4ÆfØÍõ*š6«&®êFÐAµ\D1—�mðdopÖ�ñ�ÂЂUB`0&¡K†üÙá�£™æ“k÷TÑ@í`Í"s÷Q¥Ò#Ò‚ì ÃýQÍçùU~[‚aœÚ±WjSeޤzæ2X¶¶ €°Ž�åAw&_OÁwy.û!„s:J»Zˆ\¢È¤ÎF¯;[¶/k¤vΑ{#Ây’È�æçŸoC»¯}悯¾m€h‡^g·]¸yG]SѯX�‚ÒÁ@ö¿8 h¶Yl\¤‰[1vÑ­W™$þGooY_lfÀHüã¥ø~ …ì_/LÄ(ú¢¹%VF7‡4epRùõyöÕP…úBDÀzƉTD©Øyõ -‘=9°Ñ(z$ãI Uð?ž9„½ -üé~Ù\CXÃyƒ+ïA¦§Š> Á ç: 0SÎ2`‘g"ñ.Ÿñ„†PK†ŠwØw[T0 Uèù\æéY©w‹Ài æœ$Ȭrœ?yë)[¦a8F{imU˜É®aA½þ�Xè¸ó=ïØ'€¤ôÅš¸ë3u û– mý6 |8¤ O´LôW¾omìY=‘õ³i ‹þ2#¼·ŠÐE™xõ_­U. ûÔ¼JøÀÒP Œ@\{$ H˜éDút©žSÕ¢˜8¯>˜2ùÆ’|÷„3°dÉ Ç©L¸ÜPŃ>3€µÃ�0A¼ªfÍu_xÃìJµ’|º}ŠºZ^Ë\±<}»’jèT†Öj^|\œc1{†…ªŠI%’ºü�!CH`U@„<ïËbÇ¢Íw—gúÐ:†iÈ–öS’Iá}4þóìyœ{Ï óyðI°UBËû+p8Û� :ßaŠÞÁÛMw~ÝKPBî3´{$¬÷``Ú!wG[ýs=+âšír›B¿]È´oö—-Úû�!¥×#%×Up;FùÍi’�i™˜¼,:K¶$…#/ŒÐa3eû£ ÎÕN\±ö(pçY*K÷j¶ '£¡ù!Ýop¡M¾P// [aÍáÃxøt<ÏÝ„½îK^!çfGÛW ÕZdÝë¨'òB*W@ååaу"OèÀ"es‹Êجe2ˆxtœ%=Ì,t0½‘Ìaè\=_ºÞkØz¹ú5"LqrèkÝ|ýê3À4Ê›CÒ�ؾ¼µ@Á’ðá†(ÂÌixŽÙ=usÍeøÌáÓ¡Ú ó�ÐV ݱ@®–;$’‰ˆ6òèœuE¢‹Óì$¥­.¬|(5ì;8=E4ÉýÝX7ÎfÑ‚ÀÇáȃI�*05ñð„�š8מå!•�ö ?ë²Y›eÅ݉B [ùîˆPoÁµˆ™Ì±›^ïošÒš;%‡ê¼²FÝçZ¸_a/{'^ ¡°ïÈˉµœà…~›Îs„•ϵ”{š Wg.ǤÝä¼5tT-©ñÈèç+ÕÅ ðQ³Qxxu8ü;9Æ…kàÍzë–DxªÃDÑÎVìTø±Š¨ÅDnÏÙqê \Gè!—¨€…°õ¯æœ&[Y;»%lR`ΠÞüðŒlw„Î Ö�,|À«Y^É›±­�.*Ê{$˜�Ò�ÀÖî‚ÞmìïŽF‚ŽÐˆP7ã,%zàÊæ¸’i a�gï³U«ípÁ1òÜ«°PÁn=[³d·£©¹·JÝIg“ú�…+¯*÷úL-ìe]�bl¾™>löiÐOëïö«@©áíGTòÕ€;àÀwS¼pà7+?ŒVYXîñcôÞÓaS", Ë¡ º‚ê/ª—À>è™,'ëDË?⛀øF±ÅaÇJµ¾lñ’q@`!Žgs–Ö�\ž5,År5ý£`‹^1KŸ�†c˜Ls–‘AÉa’„Ð6¥q®I'²±B |F¥f#s,·Zó‡€P­‹kXÌŽ(…y •uædÙÚRå�·êí¸‰|�í9¯4–v·Ž¡ß`/€!š°õø–Éb5àMÎÅÀÑ�6nѺêÀÚ1Ê©)[�Ãá ¢ÑÛÕ‹„žÁôi W]�ÇACƒßq·Q~#ãX;•†/ñÚ5¸Nxݹ–ýt°.,cí¸�×°«diÇ„!-<ÜѼæÌ<¿Aõë$=ë�½yó¬KXIt>y¬àJ´rº­ šL(2hˆ„rí‡�Û=¯›æÔƒùì”�ò1Ø šëkd 20¥ž^¬+²“Ñ…¥ñq�Ñ‚OÍãËaÁ~¶®Ã�ÃÕ¨:yM¢bñÌ-ÆÉâA6Ü–�JlZKXl rB,£ µb²Ë’ÉÒ L©eUæsvÐ^Q¯¢»rðL"¬Â�¤ÎåÕ™¤¦+-ĵ’ò|ÙcG•’ÌkНwô§Ãî¹A{fcCmfÕsΔœ!5–Þ»XØ¥f²¶vßSäjá.7ÙåL„O1}:_&ÛVj;sÐÓG±6Õ±,GÌó’’qEAËr[j¡÷ëo·âשédõæFíU$�[ɽ=*įrG¡¾ª‡4QzªÖNÓq¾.)ͽ à “•¹ý)¿{;Aú¹¯`¶oÔ(¸æöâ!È祘cжÒ­C=ºÄ=­;9mrš»Npíp€…îQÛíZ¿w�‹r<BB„ÝÛ:JÐåïæ�µ±µ¹ÏÊ7ÍÔ"ìãsÉÕ}a‚ˆÈ1‹ËH͸¨:j‹ºÜ_/ÒNÒÞyÝïˆPúS´¼HN†z»i ¾<>]›¿mû¶ñ¯¼›õ'³u/´¦0>8ý›öÂñsò¼Ýhߥ^|<ûĤà[§å5€ï<í±ŒZßZZ…'ÐêCI½ qûzµ¬û¿Û|öÚ5”Öc‡áú¯×ÆRá]}ªžz ÷uÒµ87›9tͲr÷šöf<•}\ÉãWè@0M­±ñ�4¾×ì�bjµw¸á>§Ž=‹DuI®È ½ÒßEeÑüÚº À$�ÇÂå8Ÿ{-WÛuÛèÍ Q²^°:çªB™4Ú†¨¹êa²¢¶lÂ�Z˜rBÀmöö æ‡9ð¤âûM¨•¸|<°6ñúë¢ùeªºÂaAK»g›6ŠÂùh4J™­Qõ¬1gžèäp5„ã'd}ÉÓÒuWUŒÓDÝ–Ö)Êñq(-$뛂ª[5ø~ƒ«ÖYr½YÜ'~ã$º~4— w ö¶ ô!NqQA[° ª®yÉã¢Ö~Ÿo€y¶ÐÓ-öN+¼/)¬È… &çÆ“j� “ U·kîjS[Ê Ž‘vÔ–ö)[ÛÉ1cfÁ­U ZÝ9×~;Nnð[G¤ƒÌ —ÒënSÃ`ʤÜÑþ Ÿ“âCy r±µ ‘�î\ãÌVë÷-Ü«¾ôÓ„.?ç'a«Ì!†‡)ƒ`nû“P9±Ã$Ô³zÑÏl°7 œ+�£Ó’Õ#…€ùL0c‰½.n®1‚0ÖNÒ%Œ-=–e˜³ ÖIåxØ{º­ˆP½×¤wúì6­:ún{w>sÛ´ãÈ5|€¥ å® 5øB5Øe©ø¯ö¢�ÓÕŽUqØàïÐ;fÆ�‹B=;Éç \ÙsÕÐê §^+}µI¨•9�)\1Úˆd«èv· d: ÒU#q8‚dóÕÈ9½µyúUØY)« ‰óèmÕ&8�°±Ub·i[~¯‚ÎÚͬ湿ïÇR‘·9šÑ.-2ÉmNª€Ý9u å(v 0Sa÷èr"ëó³k[ÝʃF %{×;x® : üÛ_:¼ÜAs‘5-/9o×UY½¥Þ Ù¥45 róoV´[ǦÕ#‘L±çð,CTe"ãÄvà,‹8ÂŒè�[£P¤ÐæX$ ÓÚnÜ‘¨=jµNrâ9™aúoÜ%»)‡ÍÓB¸.˜&j0ÄIùeÞDæ‡ãçÀcô`X:c­ˆóÀhxŒó©mp_#b³«Q–!&‰{†ñ:¦qg¥ÉÕ.Šúu@‚mä…OúNÙ�—Q×6#µêlïæ wåO'³l41¥™1C¶(Üã/Ø7 *šÎ›blº¬X g¡¼Ï÷\/`Vû¶7S ÿ¯“ãœæuž`E´\ª\’/žÁùíœ_¢WÎôœ§jƒT+k-°'ñ4Þ~"O5z¾�Á ™JD,©š¶âÜ=\Ý×ø›‰6,ÓY¼WªÍfo€]_й®�É[°à*ÍmîB.ŠS!C`ðûu/«@ý âÌÔç*×vmæÐXÙÚ`-5YpUÇleÜÆ‡æ\þªCÄV†Õ%í—kçUf÷V3³2ºñ;›OèµßØ,GîšX†üÚš3@âåe££Ô‘y''°À ?‹ú¦:6ijSVo‘ðž·Ï‹ºb‚#²Õ0%Ÿi Çé6~,ÃÈÕr>U°tZyàÉäo;}æåÎ!}U°Ð¶v/ÓˆÜËÌáE_Û5Ö‰à_5»â‚âˆóÙSã¶V.g�E1Km¸g,lu:cÀ²¶}Áè=š¥ÄÃ';—ãg‹�’wR6\¨ZTïz;çnöa²ññB@¾ñ8GB©#Këb¨Ñ  ±ÞdÍÿ^ág‡.P…}¥�³ßÈ@1{ ÍÖ÷ñ¸®VjífhvnXFÏç.Û�ô!þ\ë¹ÑMqµ— IÒ#QîKìNS}œF¿"w·DŸ€‚)K¤Lîö°¤/|ù`¤/ß`.Ök[.$àÈBÃÁèm–$¤|”.Ô¶YÁ`õÂ7L"cëÞ¥‡lÁ�²U7PW]Í} owÉ{ññë›PA×Ày©#»ëï®Y‘Œ—dï%Ýøb›¸l—�½û½ZÏÇÛ¨1Ó��uÇ|ÎñǘÊc±(!¢\¸qÃpäð @¼GÒ@èª[eOB›¼¦µ£1(:±ê;¾/Ã5øŸ:Þµ,õª†“‘ í‰ö¡Á´l’€bõ±(PqDMöꪃ ûHÃ8ÝS.Îò3tz¸¤~j3­JËàö“¨Ã^Ë(ØÝÜì)©8%+Z¹T+ƒ·¿}öC©'Â47æv·Ï5®-1d(Õdâø: ÑpÖªêL`ÏÄÛÙ‹#ï>oŒ,¾Þ3«®cvÑ]•íÃÀUºœÕ�9@`q�oaÉ’yrâ¡ Ú4cËßÐÁª ‡Šß+ÚÜï-“fßRÐ8ËK¨ E•qi8‹™•6•šfõ~ïô¸ ï'À£‚µ¨%ƒ�®�ÐNn.£¶ �V‚Ú’cük¬ÅîÆé¢CT{‡ªÁKø¬œw;"jÄ „œQ¾\xŠ� oÉvšüö�ä†HÀ@oçwp¾âìA—Ýý„iâÔŠ²…ÀÅGo€ÀV`€°ª¦ÕÀLÜ£\}/0Ä+/k‡»z-†§0Î,¡pÅžFU ŒGV@ô€‹ò+ÒÊ>9K¨l–mšX¶ùgÕäX´Q1È9Ý›¸ÔÃÇ% /w±ƒR¡7$”j0tûsX¿³e;発zÍ/g�”�±/7Øz®÷o‚Ûóôo4×È`(@Ãwâ?ºOnkDDéG´TYei!…<&/ƒá<’š—åfÍ}ï /x (^~Ø:Â�䂹ÅÊ›âÜûêA`ó2´Ü@Óð5—ˆm®("ž¶ª×Á¾ñRø¬a›¸ |r„¾Ÿ_ø»ÎËjÞ>[óF4�ÊvnÉþ&+§¿ u-�=µºúgå„ÈAG§ØôÙšl²ƒBR¯�¾‚Å·áØ«"ŠaQ9öR˜3øMÅ\Àüʼ¹;Œ½ìüë„ØÃ$7µØ@XÈ`aE�27M¼`†àBéVɳœ¦þyÐܾvÑv4‹(%¶á>ï…¹ZÎĬó¥€`#ˆ`³±fª´xî‚fQS=`寭B—9†ÒþCVúÀŠ�"TgƒTk˜¿Eðma«K³]¾Ç 6Á|’Æ(! Qjà92AÄAû×´ÜK ûf;»ÙÞùb²>5ê•¶:b_¬ŒaþbÌÑËÛ˜À|dÄ·[&y”��PÐ%«·Œ~q5ÈI»b¼ã1@Hj¼80/>“ö/ŸE;‰Š0¬áqáRE†”}›ƒÍºg%kVÄfk�£œLªá„8Ÿ 0™güñqm…SËeôÝã`¤¢1€Ð�®Š¹Âç—J¸¸bPZAØò7Èwpš¦��À¥ÿdO|å² ôÛ}n)o¸}Ž"ví4¡±Ų¢Ì-{Šcݽ†(&dõ]lwrü°A–(Ù/�«ÛqÝ”`GPAc"fr]_ʡօw›á "�‹tÁNÚ <¹¤Îð{ÝÑ?0»±:áI3õ¾ßQ˜´\³éÿ;±ÜnjåeZ?Òùᢰ1° ÁY266éñ±š)ìió�Ðè¾³n鲫YQyŸ-LÈ—Y[N!žúƒ#RòØ/®©�‘Ï5jAö�ÒæBêEb+×®}RmÜd¾=ž/šÛÝ%¤[œãk€ÑD>ÕØnZ‚Æf,ÂKÎÈv±˜ÀqKì H%¶P;ïL!h@¹¦óœ¾øáê1qð�7CÔµ ˆ²h/Z ¼í{í÷+Á{}i9:YIï~±dC äŒ)7í¼s�‡tˆ¸_oùov)!ñ;Ca4«þ…ðé.Î× 4Ú°§�êl”á/p݆‘Ï¥£SQ¹^Ê (gWåW–P‘ C²½Ð5²Vȫ췥,¤{‚‹»íw;50{÷—¢ è_·ê I\i+ŸLÙÏAÌ‹˵ȶŽTê ÆYuã4ÅÄ�I’û�èטSÒý bã?(ýÉ‹ãÛ+ ¼½(„þÉß!Ø*Hd PÌ>gåÂÆF$ñ´4wMÆ's„Q]bP‚l}9SÚgnjl`WT£ ‰‡2½gëÃ±Ú iÀ¦�J\4bî¬Û¢ !%”Ü«,(g6ª9˃°’3Ñì’¬¨Ñ Ü”R�;b ;Ð Ì“– î¡°½I§ßpš,1È©ÙëB4–.Èå Ö×÷8“,üžýÎäd®µÊ”õp]WhêñK©dÚL*LåU¿1¿‘ëø–Ê”»°�ƵV‚[âb=%Ík-�°áažŸ"º›ßî}¶ IZBÂì«“¢3JøïkAZ¸Ò*C٣ȦÂ�‘A2Jb;O•ÞT­Œ"‹œ’þB6ÛL%ìcò9b”©�Ô‰Fu‡d¿X#O/�­ÓM†e3”¶JÔB‹Ú3qtP2K¤=&U•-ãYeðœ H÷~Ò>ìVt\>k«-UºŸ°ÞÙ÷}`x;¨WåÛj)jÊv²Ôh$aáªÔAÂ_Ï +B~Ä+% ]²þõ]î5ê†9ñ01òÈèÚðïÀI™,óf€¿¸Kºò»”Ù¼Wfzݹ�…ó”gõðý‡ÐE)ßXÉ((4[AnÅÛaë2¯s²Ð5sÐv‹Á® '¬«ŠRyryŸvåËg1‚­´yÛqÉ�-6|/Zß6F†F¶ÈvrÖ(è.÷AÛ�¸ý{S³!,‘oª.¢ ÁÎr•ìÊ{šk¤mµ!Ÿ³G�ˆQ®À@÷PäxÚ�ŒÕ*Çœ¦™ð§‰§|Cx4†Ã†ze­Z c®i ƒBg!^½ð¹6•z½Ø¡�ÑÚR—!oZ#ÊÜĨÜ6xÝš;�®®±Î2C�ÛVfõ~ÝL^‹™^dS5Ý5a ‡\Í%ÒNCÚÞ½({žA#rkn¤×ýê 1¬[­ŒÞ`c¹Lqd³W‹Â6ƒN¼j«e&øH%Ä£^ÊË—fv/�’0žz˜¤œ‰²·NÇû¶×§p¤;–lóÍdÂé—æ`¾°:Uø¼“üî]ªbÏ7Ü LWìp‚Õ�I§DqÎ嘽žªðGÏé2 Æ—u¦Õ_b£6ë…|GÉ:Þ¨lãXC È Ä”Ä7-ŸWÕCt&% Y€°–¢o’–¾@Å‹_zÝ¢Ô6’EƒµÞ«@®ô�·Â¸V1~nêé׿/ÊçžžMì `Ã[¾»÷Òv²öÂŬ}Tjß¿~üûôêÄ*-’M_¡1ìÛf·„{Ev|¡“‘E3ÎJ³oÅö£vë")Ñ@í?Rík¡Æ î—4…¦¶«´½{_„©1°¾#e` 08ä¯dåƒq“º O&ƒÖŒÄ+˜•Ûµ;Í­V�D´Y›+ŒCiʽ‡œDp×£rIRÏžvœ[Џþ‚d¥TsÚŽEõìàïÅ'.?ä´ÐXÏLAI©Ó˜Î,×>,àyœY§P …VZpCQ`;íÉcÝŒ«söïØÕY€fa±õ²oÏÝÙÄ«ª^Å%h ø´œ�ª½n9¢›–únŠ9É>4ÙT±ÁUÙÝÙ Ö �C ÎéÅdªõŠ0Ø "„ù}i ?Æ&i�ÛÚÌ-c¤}Ùá’â%T�`»UÀÕŸ<*›U^«G»•‚I¸ívÈÝ É7sž¼/»�íu¡g­ã’ ¢XŸël”¯‘›ÜðXbI%$w,�qy%¨ ol®w’M™M;xç›)»Ûùýá£Û¶Á²ˆX�²¯Œ÷öRwï8„\@^òvÎÙÓ1Ö+=®È¨fꦜ×Õ±YÚ2è5‡´“®v´²ØCá}:GÌúßÛK‚ôÍ­|ᆵ�ã•;x6S ØÙïH‚�u@ÆÜÀKãŒdñ9¦&8åbÈ¥Çþ=CþµìaýË7·øé�íî¤?ذ4bÅV&^ùÛÒÁQàôÎ'GZ¡“‰Þ×î iTÀ²I{ÚÀåX:.‚á‘«(wøÁ5xìfzÂi,–hIõ½‹lH^p|ۃȹ†œuñÍNª“Èy­í€HG©uÛ-óÅ>Û½²|ìLs’{}ì1Ž™`�¤ FÄ Glª%W[NÛ¥Åâ“Õ¬*^2‰”üÕžò5ÇÒ°XŽò2zr‘²éèèÔ0WâÖæQ—E¯Ž½»Ž5¯&0INñ çg*8JMÜ-As+R°±5þàÛLÔ¿kŠ3Æ=dòjÀýaéíÑf\Nµ˜›òðô¿�ÂX7‚zõ4ûÎôH¢”’-Ìô]¹1í¸·ºh¶!ÛKosƒ¬‡­¶ªýÙoB¬F‚Ä�E‘?Ã\;Vܾ¶Õ×û¼A²ìÂ!| Ó&}ª†¨!bjVðLݶv¤9–½_a|.Kµé>d6¸nNT¶òY8½`‰èÐÔ”ñì§¿+†)ÚcmAæ‘‘帻}qym-þæÂÝÒIØ0Ü+�ºq‘„wR%0`ƒ%yÏó€®èß<õÛ }Êû/žGqf<³í‘}•ˆ UëZ²±¨‹ðþ@—ÞZ´?�ÙÇ:T–ÈÅ~Ã&�Ãþ?kZÚß嵪ÿf¯ó­·ü6­«ëm[V¿)HsZ+/ ¥ š¶#¶óæ‹(nd2À\ ¹"¿ŒvåJÊÛàJøÇ©²s„`xÜ2”¾òM»{Û‹/:#Bçý Ó¶L½2E‰-’ÿâìŒÏ®3eÂ,ÙWME¹Òô¢:-'öS|¦ø€7â` ¶ö€D�$Ñ$—Cñp³d†#6»�>ö –ì‡ÊbEˆ‹xEˆlXl‹2,b?’±ì°ì²=‘'Ñ¢˜9å&õ �òðiØl�“š ž‹Ê5丹o5/WBˆáÁi,Pè�IÚ'g=Z`\°úP%‡·BH’ä :‹‚É ²8Ch‰-%ƒídèô²+^Z¥†ÈOâ4èç§føþ-¿ƒ‡,ÞuÓð³qÈþü€wËà�Ù/.×-×óøfe¶Bõ /\ ×ÌÀ7LÀ Ñ÷Þù{Iýßõ{2B®wkÁôê;ÓÕÅ;,añ­ung (Ñp®9¸(+Ý]›€÷q�6ƒÈý Ý¿/ — {ï ­Ò ·ÓK e„LÚ1W6“úUÄù<�J—á¢ià!øþ~`1!Êe@Aäãšyã~òRbá[¢ŸA©—¶È›Âö=žc¨çŒÀ>Ù�—ñûwyPóþýû¬DWÊMãÜ.�6½F3#�ÍRd´˜±kõš‚î!˜DnøÁ/J­Â¾u'°Ðd͇,A?è÷á÷ÛŽæýü˼ïº~¼=‰®R;·Ç“FCÔס˜[c"’�ua¬¾s†ÀóƒÎ×?ázÂ˾˧ !CzÈ/=Áûp ÀZô(öë~¦©K Ü"ÝAÁ ÛÄ?5Š�ÊYa€P ÛœVµªm*—ÇDò·JMõ~hilG;�îWVâ”=ýÃð&RðN}�X. Äåc›¤þ„›óÆ :[ø\Q³¹<ç”4·Î=¦.n‚,–NíÍz¾Âê ßçïÁûðUÜßí÷Ãošuí£Öø«ì…šëV¿Ðx�W£ÚV÷†Œ «Ñ�3ô6]6Ð\ùâ-»b,CPx¸4ñ.íémü^îŸÕ† ‡9î舻T{ó‹Ú£6 }üÔÕA$ÜYú7¹tkæPF5ØüñòÂÎoŽ¿Ÿ[òž—$ZµŸ-„¥På­¦�+èÕ…/#'ÖVp¨³øÑKÁ) ¦Œ¿¯ù6Öœæ“Õƒf „WÃ…úÄ=·«ž¸N.ùå0„»^«Ùã–t�o­8Ñžj¾"Û_žæ1›ôþH%ÀQ m9º¹¬DS>„D>�Uj•à¿4?Z°0HïåQ«õžÌ¿˜RÈûß2‡J+Õ}™|&R¿^7Ðà â`ž³í‰kj�É%3~òº{ü±pYi£³5Ý7Ç®G´* ­i Ö­Ã/ÖøfÜÍ}‘K¾ê±ê�õGÄWðÄbìo @¶¢Û”Ë jy¹€.gêªÂh¡õiö޽Zøy‚øbhÖ¦ð}_J( ê”bÉ�Ü=\�q+ÛÚ¸æ5†�ò¯)Ê4j?¿ëÓ?å0ÞÄÆ<7âÌŒ²Œš‡{µªuìåe‚ƒ¹ÈåñÖ~ºÖ‹°÷=âžzŽ«à£\ÖÕ4¬ž’ÃwÈÎÖ´nÑYÌ~<-‘¯Wúçñm\~ò/Š”¿Î�� »{´,+à# à¶^�Ä[pMD§Ò>µ0cWŒ·×54”-|úp»•ÏТ4 "œæ)ZG2ÅÂø|<‚lÐ ú b´æ�G£{:UŽ­—Ã=ѽ¡·VŽ#w3áðâóîz<.�Ät@®…´]‚lÔí_F7•íYŒAˤ£%1gù ònùr„ÔéG s2zU5S#ÀVƒì^ø :É0Dòë¤�LßåËÄ4ËA¡ä/€½ÐΫ)tæH£OÒ[Ü bàY’ UæWUu�+eÖß‹šðËŒÎëìN�qÕÄQ°Èvrݾ-óÛ˜v�‡2=Ôp%»š¹ž†0¾Vç¶¼Ï5Y\je-r–ì©7¾*¦éH‚ó ë÷³²‹=Ê­pmoHÆ7„‘Õ.–©ˆâ6;R·qà6p\d ò ï¾EÞ@@Â@\ˆÄ;bZ/»?k6É÷3ñƒVF� Ø@›êCø¶¯Ã÷ØkؤqïdÔïDâß–rPýUÒg—ЕWê|èùÍúOû `?†ób+©¬l~¿/_/#mŸÌX·è;–K™~ï¼MaY �ðs4éÌÑq�¯+'=híãþ@feÞõÅCÇñ×ûßøý}ÙÈ‹ð÷<4âÚY‡»¯øÆù>J^‹B„�D’.ªîÒ?Œ±<Ì `±ý.¥Ž|D•<�…�¾íeÙ j=šao|Û’<ÈÓ1‹:üüüˆ>S %„$mÌKIvP@ÝRDØ�yï*¼dDÐ{”šË(|/·8çö÷Ísý† Ì̸×Vê÷^Çð‘o>ú)Z®<ÜGg9ß�@ÿȳەX)çOw¼ã¥ðæƒ\ÝôÝ[ÜÏê�8—‡©Œ”ó&¶Ý#„é <¡XG ÊCyö� ¨gyä}9t>ãí5ù)Ú×=¼¿V<%Š&QÝlp»ÊV“®6’W 5L-­!a¶ð…ŠÖ¤‡íE“pÍ %ú{`Ãl&ŒïÀ)èÑnR_äï �ZðœùrÔƒ�¦²!öA!ès°úLæSÝ�¾>ùi±¦‹ÓÂ>qæIGœ‰1Í4]?Yëè�«bÌkèí ÝR¾Á@ðÞ^=¾I�zá¶Ÿwï®3S±ôyS~öo¶ÎÆXï„]Äf- Ó +¸T€lx¾hܵ݌&töß�™³¤ú’Ðkä càm·Æc€eq‹¥íôk͹Õ;p@ðŠ%õ®æ\,£q4K¸”œöµ³O±�\4¤Ï“uå ú§LÁÈ„‚„FÉ‚çà¤û1b´ÁúÄLÂGºU4ÃüPݧÙ|Ý+^`3y(·8˜lš�­Ü²€¿{òtÛZ^úi1¼Úk Syr0#{ú Ûý¹7%àz¨gQf®¼W{ªª‚G/a¸à‰‰'eŒÉ…`‚ïgìjÆ¥§��ñ$ÙwÛ]¢ 1gÝæÌlqèÛÚº'rãÏW¦´˜­„,[Ú­�,Y¡š)ט»g¤9¼Þ�Ÿ$Õ“Ðéiƒ½^2!ÞÊ·Ë—‡ÜRFÆrîœv(Œ\‘/²B¥C¼Ò]ŠÃ¶ ê•⼄τœœQ° šçN} Ì3q3�ض«½FÞÌEJTtK㓚юÞõ‰ÉdðÔJ p:V´BÃÏ™z2‰^¾ðÌ�´ÅøÖ6Ƕz·~t -í+ñ™0‘ôFajR©XÖjÈ&vú�ApA�é_ŸìŠ)ñÌFu”æ.�ºùª‘! ¹äúÈœPÀ^gAMSbÕ· Ÿo(º=šh+âz/J(?Ì–÷uþó¤` ?~÷Ó;G˜fÖkëÒ/BoïKQÆãÞÕ‡8Ÿ1#¸¾êë9ÝbÍËrezè.̡츗…Õȉï-�LÕâŒé_ mjrM´°­[äBÄð#uCk £¨Ö4ç‘ZL�Â!�ÓØïU„œðVاK}Þl¬=?{0²‰{±n¹]Æ:•pp¾-4ÎJµ&¹¸Ðyý¿óîØŸ¬õÆ>Åcbú0÷Ý»á@lÎ/ìEY~Ûåe6véNŸ€Sºë}ÎrÒVÔqÏ‹Íð,í Ûé�Û•ˆZ¸w:Å—ŽK±ˆý­lóTu�ƒ CÈsÌöw -ZH"‚.ÉQ‡‚ânBÚ®3B_ë âÜŹ¯ÈÝ^KŽ»0ýŒ§ÝÊ¢L ¶fÓ Gá€roˆ&Á¨{^R9dãÊ3›ªÆ€r<”üÑ'Æk!œ6ÑÈ4”¡d� Ä�qÑ:¥bÙ_¸%Ú*䊨nU69ÁO5V­52díunjOn§* ,V,šd°Ñg^#Z0zÂO·WXµ&šìWÓí®ê¢ ⪌ڞøÙ¯ªu’Nƒ°¿mÞOï߀L›àfv ãÄãëÅålŒÉë÷}×á¿_2,6î ýµæîÁŒl�‚¤ò›Q‰dH=[º•Ù {þbåv«Q(«[ÅÞf¿“UCp{Zã`®|{Na%wí^Ò¬Ârˆ·",mKG]ê½ïWM’@°wï Ñ6l �?›k¸Šáiàl?®ö)¥ñ8å÷0Í9¦hÉ¢Cíך:ö�¬ñ8õ`p=s�kC¬G"�ô@L®•+pØ¥m�G,¹Ðë©^¦ fÞîtÚ9œ\Ú½b# Ps“~м§Y;‘´‹ §;S'D1·vV+&ºu>›sÌ&ÒL0ªQûö«^ Â}Úõ]dk;ý½ÿª:nÒµd…êåÓ+šµþh‹ýTo’Pÿ�*‡¤-ñÍ%NDî÷›�˜çóAOûô§Í¾E‚‡k£?œÙC�@…Ûœ¯4ž¡Ž¶G½ú{=¸gÛ“E‡½Á‹%¨‰º¹û,šK÷ Œ2X|�‘´o2ö‘‰Öäé*‰Ç&+\C±¡« ËlÑ/ÄÑ!^*8À9l5q–œ-ƒ!óãëLf@Þö¬)3&Ví]’T#ˆþ�¯W¶Š±ÝÄ£(ûgÒ#¹Ð/qQÊšJͺŽbk¿_ˆóAÞæ“#\�Ш•—"$c �¡Ègz}ÂÎfP“ÊÄ×¾6€jv�"6—F+\¢×¦|ØfïÑÎ.ÃÝ5„c‚~_'†À+(}|à`]pìYl@ø,¨>ÆÌ÷nL'ÌÖý¾žüA9|¥Ú¸‡{âæ¼íZ»øEP½Zï /ÃóŠ�¬uï/ü[|#¼"óAF½·}‰»Íé< š�=G鶦tZ]è°ö¤²â™ðÝU7½‰òò˜{*Âc„&VÐÆ{¦ñu:÷|»óôç¿NqøöA2Ö+ãœO§œÐw3VÁ­ |ôC² PAÊò÷��)?›¬„„ ƒïsTk Grâ(°sÁ�C‹3Ž-%í}³L›d8î9â Öè7°Á»­?_‡ ¢ O"C3e�`\uW™ü*HðiCc\ÛÇÓ`y?Õv) 1»ç\–YÙ–Çò‚cØØo±¯/¾.õ±ø/h¯·S;;Ó/¬*dDŸþUÏD1ó�Ÿà_­‰ÊÖœ·¢íŽs„•ûˆ¤ÚÖú·³ øY±ã®è9�2ÙTÉîœ Ý) úðQ›ùý$ÚxêðF¡±ó¾´&ƒßÍ�ÕmÕ¥ø ³ý2çLÛ”€-ãì}²Ë»‚f A&ÀºPDÃç~kúl:Ƨ—W΋Ë8: _±~ýû÷àªÔžð‡ÇZ¼Øq\~´¯zÎÇ\[âdö<#‡Õ� AîÐóõâ}Ó¼x ì=�ŸÕÞöQoFÎâr\�ëW´0 ˆ˜+ç$#¥Ò¸ÍÕ ²VÎ  ¢,›ÅÇ꺞+¯+ü{9e(!‹ÖEˆAo‰Mg‹œ4å¬Êfi!ж�““¸Ë�å”6ïÒ¤HdÌÇ5ƒ³ƒ»MïI¤>“)ù+ø*òú¼±u¦·m�ýF žK[ï¨õt^Ûš¶˜cÐý^uÝGùþ[z˜ÜGü3ºlòÌÆ¯²“®�:¦—Mæ!0N~y— T;†ëÅà4]Ü�xÙ/‹€Í‹':à94êX­]ƾ™d£ È]7¡lÇÌ— Áð­a¬ v\v ¼”¡ uÊ[ öI2A1ƒBµ‰2׸ |Jƒ‰òYåüàÒ1�:»ä)ª%NpEñî!ÜêN[ÍÕŽU&0q’½Ôt-O¹Íûtpö½î#yƒª²ƒ9ð÷ßS(¬yx€Z�õµÓµÈcÀxã×-“uKd›�ˆ¦gEiãÜrØx0¢Ô²ä&f›Ä²Uçm ÀYÚ¨¡xXt½Ý®!¬=´Îôð¡•|Ö“–óÙ›t5yÜéۼػͯlÝ6Ç�‹æ•Úú‹ò—ÛÜZélé)Uœ˜0ºQSjø¼Sƒ>-mq¤ªX2èI7P+>¡À4 Íž$€ô-h¹³y‰´8î±T¤ É@"õÁ G‹ºQdék%;ë¢ç{­ÁÇ2Unmö?¯$‘�3°ç(_œßk8|8OÏ ìáWêØi=–Ιv.}Æ%2Ž®f"Þ]d]mó¼ƒfÓI�Œ]"(/fHüÑ€ú̇hâü…Ô´ÆL¿¤€+Æú ] dJˆQó‚�³©0»ƒÑ[ëÛœÛÄ«¡Ýjï±Ý…Ú>,t, éу¨†RÉà”>°%:/*ºê‰+Áb7fÒ3Ž[%—>ðó8,¡]Ê„úx³JêžÜÃxëUº+:XÚx9Ë‹!K‹êÕ#dy(,ŠßC/:Ñà) ¸ß®w |¼¾—6”¤@P¼gëë²#CšhI 4"€†²F ø 1Pe‘ ðšR¬/N· ?Úú P%¶# šÇë3‹çay>ëÞ�zŒ>à¿ ø„ÄS&à ÷GÔ…7«a_x �œ#Ñ·Å•[–"ÄáL˜!VàxÖú/[³ƒ@è#4V‰=ÓÅëÞ ÈÓ�>pW²A›ì›¿ÿº�ÐÑÛû0�¦8µ´E&~źկ�\û“Îð•…€ª›¯Š¹’Œü÷Lz1‰dbÃ<5E´@››Ÿ(wq>ѦjGùCQkëV¦ÈÓnòç—š«EíN¶s0 HK[“Œ§–£•l«å� ®€¦ß™Õ<װƬË~T2â�gmÆJËv}8îz6Õê–rœÙÑOï¨çÙ"�LOc ?O7*.ˆýk(ql&0æ_�ÈLcG!»MÚD‚Vë¸~dÄÔ>B·Û«’ñçŒn¸†=ýÉð‡µã,¦˜j]m¯„ÃápvC)üú+ƒ�ÇÍ*Avââ �»ºº6Ï¥�#´>îÚxÒpƒ eJq W=ãŠ4ÖμíÜ)ªêⱓª÷‹Ëíeü—šõ.™vÑĆÁ¥ÑüY|}Õûc×ð0Õ@Ý«ÃnêÝO”Ð�­1�1+9Ù‹L>¸Ø[–¯b ¯VItâÖÖÓ„àØ±ó”I<¼& \1ÎôÍƳcçÏX|ÛÎ6µ§­•îc)—-ØVÊÏq 5¶Ä,+sôsœ ôKA²ØÂqi‰ÒyzÉWMÊõ°Õ: ‰ß¶°nòü&Ñnÿ7·U«[Èu4Y+ï® û¹¢ìv1L©­Á©[#Ð&ß,/õážs§Kþu*FØmþ©¶b+>d:Æ~€»êÏ{x;i|Ö¬VdP^C×Å��nóÏs® Ϋ7Θ³pÈ‘Ž¯ß(Gþ²ß—¥ ¬º—Ëðƒ¸'vàP+’!1å¦e¨îà]Í Ìøàô ÈÜïÕÞxI+ÆâœaÔÆÿ5¤¾öçÄZHùí¢²o±u±ç~l(¾Òjéa°u;lnŠŽ½ÕÌ÷ýn ªŽwõÄVà‚ŸYŽÛϯWtš,qÆÕû# ¦HfÏ«=ƒ3v„|ê~¢¨fÖ,ÑÕ±`kÞµvÖà „Ô0i¯�ÚŸTïDwz§g#à.Æ)X° ÙChL§Î¶>¨tÅÎ`œ§*ç  â¬QH�@L·àBòÔÔæ0hñ bû/™ã•È2ž¾ß k8à#OI�šoHEÂîø¸ Þ ºu<Ó²*Þ€U˜>…~ªþ]Ë]t¹dßwíï|]>&D07¶Ýº¿S•¶L{Ü];' ÄU{LÁ±3|ý €¡TÆë)óy50ú°IŸsW\pºJJÖ«ˆ‡*ÁúšèÚÕý¤E*I3ßÒ =x’Ãõ/æÏ.1nEú/�*%~îQP6�N›¼¦á™daô —0Àx£™K IMn-�º“|Öu|L«'�C El›¤ÛÙ¾ùÜò‘ˆå2ãîÁyÖ> ÃØóI“¯Igœk˜ö‡~Úòo»–Ð/™!¹Þ �éC8Võ–¹a£;Ù†\›D8ƒå|& aßd ŽKí­ÑÀükóãÆ+9Åü¬< °˜a·­øïQcJ±éª2èüE9ž±¤û‰µ„XœO¤i‰:'°–;jåïõ—õbŠVí‰éÅ%-BµN®¥¶R’ÎÍ&?Aðx™´\p-'¶0øü"š³YŒƒ=N*¤-7R<ãº3vnÙJvV?YP¸ú•¾ªÀðËX’_/aaâ°h~ç2�¶ ä,ü“L_#Î×%&ÚÒ}͉Sýy›Š?¼¼f-zè9dÑê6Ê—+Á\bA¢ M¯§Q„ü3BÛ°â`•‰6‡3-�Ó/ê)ȶSű‘ÄAìõ?Ç'|ÙspÕ!^ùðó µÔì7˜,ž§áUB·‡6ÆÞad~ÉÒüã›]xz¢çSëËï�.·m¾ ÁZ]3ºLÈHv8· �ºFûuËQ^×zÜĬ+ý{1SžoSÅ™Ÿ§«ƒ¡i^Ëy1X½!mðxLV”�F„ }ž¢…i£Vâ@=ççyyÈ^Ðç}}’ÔE¬¦Æ#6ºV8úÝ!7÷ÁWûy©îã ¡ÍŸ^}÷³Dlö2‹êâ\ý c9÷×}XÛ;z€DÐj—ð“£@=”å a 8ãÞ¨n»¦#ŠDI[á47Ñfä�ª)ëtm¾çg¿»QY“°áì¨Ûû9 ¿)ëÆñ¹ÃP‚Æ�²f³™ަ6É(†cê_”/ÆÈpnñõÃf¯œ2òÇhµL>sˆAæï)òÉL'{ÃŽ¡Á³/c¬Yoë|μnÞ!20B¼K­Y? \”lØåæ©$¤œ‹GmÂíwÜë4”í+&ˆ· }o«swKen­V³E­Ržò¤ªÝ�òš2­Ï‹÷�ÂQ8i 6ÁÐÅ’ÞÆ4uâWYZµ’õìts$uKg�Ýh4ë¤Èµáõ¡|»…Z¾"«©†P.¶}m%oL}çš1‚—:´ýŸ6ÁîØH#wß{ïHr¹ô<>ݯu]d:$Ê¿ ßÐÕnnð!Qˆ�qâw9ùÕ9ž×§�鿺¤zE^UM< gÈõÓ HŬeº¼ x™²ï4ؼ Œ1¼ž.9Ï·÷1œ«òƒ;ÕWÏa×\ÃÜÐ\^“¥“£Å�QÈšAÝ "ñ*ódû„`2Ÿhf�âà+}çÄpŽ<5Æœ³~ “‰díO´Á}½�h€·.À=7?ëètŸm(AQ�‹QîûïÃV½LD…οd/¯¸0×fÜâC•fbÜ6iÃ)L&�gø±�˜Ï=ѳ›‚:Õ�Ö º¾Vê�‹�G¸÷gßá…¦zv_çñ171xfi‚±‰M“uW�œ üüÈo‡û3Ó¬øë"±”ÁëîœöPs,HI(\T¼rJUí•´U�Y�uF §(´Ðد^À/y·Š>R“­æo“RErÞ+] õY{k'L¾¹o¾‰·\)¸y½Û³¾Í=O,.|§ è±¹\í¨®*ùá)Àr¿Á§ÇRUöÿ¸s?oß*ãr‹xn"À:óàèÏ ~°O£ŽY†±Þ«ðTx<·D˜ÁeAã¦&¨øÜ†pÞ”¯&Û¸ î$!JÖ!ÒªÊ*wj„�Ž|ž\W Ÿ‡z·¢þ¬=¸PBveø¯›Ö¾Ø¦6? lCà¿Ë‹Ã¦1_jÜ89}÷‹D¯fÇ[,á¯0>c ö=Èt�ƒn( þÙ óàÑÌ´õ¥çm•}Ç {·�6zÏ»û¢¡(d±F4,Œid ÙGn,º[WÙX»rüŸ¹—¬Ïúiöž-ñÙ ‘ÄWX×eÙÌ–ã˜Òù÷ÑCÛ(aô gvÒ)· >Øv’ƒ-#SÙnkz,®�½ÙòV¯¿}‹„’Y› ìFm¹o”~å¬f¾úÏuè�…·ð ë ùXmÕmNTa7mÙ‰›1B%ÚÕh.û‚2c>”÷í«”·©»¼•¥ûA½aÒƒaòdz€ûí¡´Á�²Î±&ÞÆ‘1q7›•%ùÍVe&[lFèÙNþ³éŽ«¦no‘=LVg‡â5òÕœÊHûÌ–êîú†R°¤Žfí¶šé®Z×¹6>´T+ëó[Z,'Õ0a„Å;P�±R)Å*CÍ<Ó �Äë6êOlV®u ò¥»áÁwî8i§?GGœýð}bZù½ž@�Šç“vÚ‡Ôl §2VüŽg1:Ë®­‚Kì3O%|1>*¥¦�\5½ÂqãŠk¸:…V•”ΰñp`Á¡Ü]:!ÕÁ·ÅÄR1z²Éão«¨êsœžWTÍOŠá’D9û!EÑ'vdÈqo¡æ©Q£œº1bnáí’í.S·Æo0ä/ÂØÝú`=³h,�ÐÉaÖcQgˆWD£9l#"üìáõ³}™këô7Æä(�Ý mZŒ¤ošã„k�GÙ~�hÅHÒƒZ÷W©i¬|ÖõLg¶ ð�…L†5¬èƒç{ðEÔËÜ=4õ×Q9ûvƒ fƒ‡[¥±±›ï‚鬸Ò�Ѫß3 òv/(Hœº[{È äÍNœm‰éa ƒ¡v�=¯Î€¢H dr/ùxv8egSÙÙ=4háÇGÅ ïçu{vý`(Ùî¢Uq{mÌ>øÏœañ«pS¤rKì…Ý ­-NŒ2åG<°6È¥îmZLge€ú×ç6T̯íÍD3ðJÝ>ågeaÛÕ½¨WùmÚ-£ÖH;tŽÔÛ*“KÌsRàCbKl¼òò8áTÝÃuŒî4äôì˜+ú;†¹’”>¿wAq¥ËN5û¦ØÙ4tB¸ëe“سÜH„XqŸÓeÞ÷x�%ïØt�7íÆÛÑak|cc»™otƒ�IÊØ‚+$ÄýF’‚Yå@Á]x/ÛŽ2&€—Ô`†ÝQñà Z*~ÅÕÌ8©W$mnÛ¥ŒÎŠê“ÛMã.âcuýÖÅ •¸‡¬åâ³dmâ©kœJe]O%KÔ¢vbÏYrr ½‘Åez¶ÉsKmâ§Ÿ·¢5+÷÷eƒA³¯¢ô‚Áâ‘f÷½�©¸oSã>–§—`hʱ@¶I%~>QZü‰GñöƒPÂΣ9Éü;ÆØ¯¡aÀaø‡îªç ½ý>%üäWÅ�Â7mfÉXo0R‡àM4ýžT!§–³ô¥ñ›úîE1ÏY¦á͸M~oÖêÂŽª�(9]5®P:Ô,�ªY‡XÂ顇� ÍêÇë¹Ie¸b‹¢Êú£W<†ò¿š6�èññHÊïÅÆºM4*¢¤zÅu ÔAK%àb¤Sx¶DU€Ï¿†ùdÜ6oد¤�èvHAÇÜëÎ"¨‚È^kk¡å»:,ïì{vá{¨Ýv· ½× ôODA÷ÌRzèxuõ‚ àk|5ïL×ÍÕÔÛ1n[C¡çLÉœ£(l¥˜a%η„…ááqVè®C=r‘mWäõT›)ƒæÀ½™àGD¤ ÉãÁ¸Ñ65âa[M'kz×m€…tý8èu]FÎ㸠¯—HHšnPNsª öq2ÍÍ™‡~’…oA~¾u”£k¦$n�†ô‘X\d¾Ü@\;5VL*7uoÝ$…çÎÕ³ùüM™Û›4~ÄXÚPÃZ+‹Qf�Wüß.9ö³ Í L{Z:Iè놧A|:‚/`2² ƒ8Û-ýiµ ÔPĶ)‚áYºxdo·hëßóÈfédhÉgPùݚ˜tÉ/†ë±æÖ°ùN|IžÙ $M‚î»e»äçÈrÅ;®ÞùMm•„Ó^RWÀgí«–C£8›�ãM6fìÜ<�©†zÁñ+jƒ¾,­í| †òÃÇõìÀÒð ìU‚[àZ©áð�•�î=XH·×ù¥¿Xï“)èSüïå_×H»0O§Å”çæ·ÜÖkÄV×SÅËât›<@(ñ‘Ã�]q(ã²m7j¦ËBæÉúÌFu{JÔnC—áâ íÁk®xâí�ãZ ón£ç&®×¶z©Ë-g»6�ÒsùÔw½ð‘XÉdÊdK¶ÂÂìɳͭ“ëîmõfŸ’1ÎmÚI2k}‡=n$¸wä ’†a™G$`0/| º ú^Jľ®Or�!ñüƒÒí:T†L>ƼàLΈ|?”™þ¿µµ¬dSºÝöâïÙ×wm|éÛ€�ßšñ!áéà·p~M¦]kÝiégd¡¸›æEWaeá‰'>üüŽšUã9¿‹>™~UÚw`޶‹çí6.F kl€vÍùȳ·r·d–þP±ƒ³ƒýX]»ùd ŸÎ¹cÅæc»@møß�+ñ¸~$p]9e¬Ø ‡Õcô—2zaP<ãgsÐ#¸a‰ÞýØeÊöDZ�<€�eZþ¯ãÖß� ë=°o�³ÏÎí`¾˜(YŸqeá}¡«(M×'9èýÌr/ØØ>cºk XZý�Ã#;5U“p=¿ê©#ÓÒåEcê£0�Øî]È/°ÍÍ``ÉÌp»‘]Ëõ¦,\+ój ¼¢�X'\Ñ E�pŠæH:$Oョܥ;î¼ïÆÈ›�™æqM`²©‡‹ò²­q@Ͱ ßeWÌ�qd¹ž8/ÓÈî˜+ë,Žƒ•�¯xÖç:'¹ÞF±‹Y­gBC¯Î;|`¬GMø[S»¦¶Ï Øl!„É.,øPº²»-¸êÁ»Æ�ºŸO†"z3d÷Buë‹|*X¢„$�'=<�Pob¯¿¡uÊÙ$+&þx´F~8é|Ñç0°x»æŽÍ鯱qh3ñ™côžžuŠ” ø1z¦å—<®RÚî•(U°�} i6@Nûo‘gmÍvû�’c £~»yƒ‚C"mV‚¹Ëœ,rš¼e™˜‡fÖ8¾´×0 Ëó(&$‰Rã}9ˆ 5 8ÈùW ¯3áÈl:?Æå ÿå�AßÂw~Æ÷§ÊÄ–µyo]A“!œOw#›SæçL�8ð*Ê’’ ` ¯ö*|m‹åØ©_e-²¾ì0RúÜÕ�\§X Ã0Ï åp²‰ù@œ‡/Öå÷AÍüÝm/]vŽé®ÙE-ÝõDcœ!2„¤½œ�H„ëLi+Û¹íO.SøÊl“’‡ªÎz5s áÛcM¦xÁ5Åu£µh—LŒYR�� ƒÌX*ùДT æ†ÖíÖŠϬèA‚6Z¨¢–ï`žÓrúÓà }scÅ&ʘ ˜_m)Š×3½;(”Á~Æâ— ÷›†—W›Àfs{šÓʤ¼´`’Òl.Dœ—½CZ3dÇžS1`D»õVØÂØÍA«fƒús� l:Ã=‚å’@l¸MŠÙ�ÔXz¸2Î_¥7 àéÚböåo›Û.ž¡9žU'–¤`¹@pñ D‡Q›®ðp“~éàB‘p"Ó1 –ÊJ7Ù?jÁ^fé9¶É/<¤L]ƒ#õý+‹€- en S^ß%ƒn’™:°=ÕlŒïÙ|{np*µ1µþ¥×ÿ�ˆ¢Íáå®Cc‰Ÿ ÒÌ‹ Êë%3¤ŽA')�­Ÿë÷ Â8@Ùì‰ÒÙ!Õ�­þE‰†è³2!†Kã¬/Ç÷31sÚ^�,ðã ,@,Þe|BÂrÀU”RsÑFä •²9³�í.ˆ³® ˆ…å—F‹ †¼& CPíûŸªµOßä.\�8M�2€”pXXÜ�ņL–T´Y‰DXˆ,ÈÉa]ñ ×h“²;.GgÜvýz™¤°g"K"ÌÏÕ Wî&P€±y¥r‹y¤?Âì ¦Câðk+‡D`�@M$>�½#Ÿ»ˆÉ„;²ûäîĸEË9áj°X#ÒÒ@`�'%‡„l†$?ž;Z…±”Ák® ßär$à†Ñña‹&#­âÉ\ E“ �0C#+×Fç«ÿ8kÇ}ÁñAaÞ²mEÍ…û@IGñlËxX û/s’7K{³õdHʵׄ\��;ü@¶uoÓc©]–?"³ÓŽÏίY!¼$³�éà s­Pœ”ç÷«GTº„G³ï|u�6ƒ{ Ý—$°ô†±«ìTvëô&j#Eö™ÝvI\úBß/Üóy~û@��×-¬xýñ5ô‡ooH;Éþºi uò»&aÅlC : kì(ÍqØu˜¨çzvðè³z](#ûHŸâÍÂ5”ÁÌc·Gø�DjÈ6Ý`†ô�ÇYó迈þ”Þ7/ê*‹ ¬¾�r„ºž¡Ê•„™£A0QÓ‹RÃÙa“’Ãã‹8]õ0I?Ñg¬þ@l°r=Ê8#³c½#ï[9ꤒ�õ­$Xûh|·CÎ,㯠7ñ…‡„'÷³OE‰ÎÇ &ì‰�? l×E$غ쎋 ÷6à ,0‚í!öpã~%Œ½^ƒŠ?ˆ?ˆ`Œ%A!º96K…YçÒà úG—†}MÑfø€:,$¢á¢?¿,�b[øicÝ8Švë´4[…ôš%p†röÒüŒxö-øÑoÅšº ……ˆabŽáöPð¿i¹+².G“{¡B戾Õtƒ2é \þêv�­Ã>Êt¡Ö°1{ûy$ˆ®gúçƒÂ9÷¾Rû>óëu‘“æÜ?‰_´Nü(‹ƒÂìECºË�_6~5£· 2¦�aaó’çùe<Ê•…ñXIÓ;Ã_1dJ²è.©Ý†X,Z0¼É€Êj—&@Ì¢(xåuÛG¼A@Äv»£i¶&*Aeàö¿8Ð|›Ë$oØð§*q É;¡6†±ICh銭aB÷°bD‚Í5¸oWÔ+¨Ü¿#G,P3„.¼%ü“�-néiËÕu¿E w‡îh 5ŽQĈ§X×#h�ÓJž;9®H¯Ø™Õ~�ñÛñV/u”åƄé ÷³ÂÐA"\–¾æ.54€V?¬hAð$P†n…ä'ßÔ�# {QÊ‹®ÈÍF*µåØÂHTmQ[ë.>±^Yr&ŒZQ§íÒS %ïå)L`KnÖk–˜*øËgIúªß;‘`zf<=ØòꑺØ=i’Uˆ"«»ZG�âäu¾V—’‚:l6r £pK½||@- µœêÁg{^p ãp¥šht‹¤…n/‡Á9&ó€âú{·úµ¦ç vÏøÖŒ>¬8Ìtä4Ã8â±À¥¯¸øþûèªÆÁ'$RY‚‡qhc¶Ú³öë%)¶#Ïáõ4²Évx¯LX*Òg]ÈÈJàwrÉ�ˆ u ˆw©1{jÚ§±kB–›ÜstaŒ¢lOŽâçº`vÖñ%‚ðʹ£ç[;ÖK ¢ßw•ÜE�â½ ò˜B'l1UUZ:°�w¼õ‡Ö‘X?r!Ë!Æâë¶0�àü�¿XysçW%bÝFö[Ù6�Œ'á²6H .¼;£Ë˜ï)*WIuìÌÒìØ Ø”“[\f½m�Þ� ÆsLŒâY:ÜèPíj±ã).ØSÉŸ—4عî éX,ò•òž6Õ¶� ¿„z¼Œ[Ó[]gWw²–þIì 這%€4mÐú|Øß-öˆ±�ÛäÛõo¾rqõi޶k« p€A°V©H€úÄÔ°].�¼ü¶¬I1zçõ¼bS™8)ëYopø3‡-ßÉ­ÜÈê!Á³k°}bXl´k Kð‡]ïÃû›<(ôn”3›”’° ç|£ŽþNmh4V–¸K‘-çY Âmº~ż30]AÉÐt¤BüšõêÄã’ÝšÅìó¥Àãâ1:Ñf˜‡8)r™=�kVmÊCïÕÆê8†m��ùŒp‘¶ ­SÆ�E9_¸=î¡¡ûã]¶¨Ãàå{²Ö¸>üãÐ|`n:›±G¢8˜®ë€ŠÔ`ùáJ?LäŽä› ¦yÒ�µÏ†8Í«O8‘ÔzŸX ‡¾Êv­ ƒø?IAÛzÒúM sâ²¹°¶RnOžú„¿¬ãÇÑÚìõsR«Á×ã".—wF‡›B�ÅC >S>ÛLÃ|@-e6;é$Ëúg±›âok'äðu¾>SÂB!õQP�~we–ä½,ãàtùk2•l¯8jvƵÒ·k?0B«§ÇkÀ8H>̾X-�x$]¿2ÃúÅb:„ø¾TÐØ'OßZÛC}­7¾ó°KG©édC„ {¢z#„JW±hó0W |Bè›·½á‡öe´6f|Z”IHÄzâ‘@H›Ck“ ϱ^éÇ5ÇÄn4z—wO‹-¯xžµ/1ÓrÖU�Š%d+„ÿ �§ cy³­œÄ2ôÎÍ£'#P@˜Ê7Ú[Í¡HD•Ð!dïiÂC"ú¹-�D{+!*2­™îZ%G�"�Ú%™¸Qˆ3dðŸ‘Ò8 °©Á¬hðé4[s[òúÖ À?f�–'&cÁÁuáí�–¯ ç€Á(_yþvãà¹3ß±õ­Tó�î“áXío½çÕ{µÌ&‚Ï#£ÕÕPOÒ{@„¹ †ý9?ß'ÕŠôhñ «`r<5@ð쓨èŠÓd�¨ÅWðƒ¤¦þâþ> ȷ禢ô@r’KkcëV΀½qoµz åÒ6R?Z•,}Eš¼u$tÉ8º­´S#”û[ݰ _Cgɧt÷=žÓÑ_ŽI`øº»rÒBOÆ7|`§¹ ÄâÉ„DcìoRÏ ke¤˜kekêN¥©t7"à­A`ŠîÜ…e–˜ $«+›éò—Õ“f4ØÚûïš»5$Ú�Øv—~ÜþgGàô| yé`Çç÷ TdGÖàtÿróž=Û`¾Àû�bɽrP$n¶ Æá$†ŠôË€¹I÷5J(¦&°¬›¥Xn/{Þº+¾æõ½¸ÇØóÈn°‘,¨í�馰»•¤°Š…œc¶ònnä’¦ƒ�ņ۾Ä�nFFiœMYIA9È4[ÙÚ-cmÖöʃ»ò’ø�g`ºÅz­¾º¬âŠcû$K¬ÝðS²ÞI hHÒí�ioR¬µ¼3< ßY /란ðjW7y0b,D[V}n…°ö��âIX>üóSD xÀøÛ·/¼ý´‡Ú°O7`°MÃïœ7:IÍ’É,Ÿ¼åR¯Ý{É{ÐîÑûÎ�¢O$þZ¶’(P¡zÇ”vØR}}0�ˆÊYÊîWØ)‚·¿e±Jý¶·�îÞð@ÀAGw’gÙÙ³yVÅ£ÙY.QdIá-Ø?¸¿QI�ãB/“¾•Éþ²å Ôwδu$&Ô#‘%å®AY›zØ g�&ªhðh%‚ʧœ×S½¸!ÄÎÌ›¶³aŸóÜ‘õzî2ý—ML¸0›z'-¾ÎÝcÇ‚ÀûMÙTÚŽù3A›élHYp0®} 5êŒbsà”L˜º0誢�9¥Ö£Av/ÆüÅ—6;Ú¼íãÍõ}rÞûf’Áà#¼*öÜQvG¿Äã ]¿ùÊ!-ˆ.@³I&±ñ¤³]�ý„i˜CÒúj™I@„ŽáÌQzmÐÅŽˆ„vŸP]‹€L#P†|ZRÓ(Ùl!¼Ë|uÑGå6ûÆ´;œI¢_È®}½{`ºÝXq‹†2ÊUÜ)MLø×·R×G'�É¢Mœ­?ü»Ñ�-u®[K^œTסtÏìED“Ó©qËd0Tmdo�@šßu…Ñæ¿1{OÜµß „éÒÄíN¸�Šºß µÝ1ÁÀ¡Ç„C�–2Œ'<Ò“½.©HAžê¢Wö*}¨S¸X%•F ˜(Tzãà|®X+X,Ì cÉðùøwy×Àßwκ:O~?U>¤jX6Veû¼æñÏh£4\«8ô9Óm§=Â[sJˆ/ÁÇ,Ò%¸9vÑÎ\/cT9nÒš Oš]o -²ÆMð%l?‡9½ ú7Th mõœÄgïXög¹˜rÞ}ð'#t(‹1w bû#X³›ú¶ÛtVö¡}Œ†@f„¨uâ ø6ÜpÀ‰çt�œoƒ�“÷Ö»O€ƒß]ÉXû eüL�빿]·’üÿhôÀÿc’àŒ9·¯j’Þ�¹š‰Lé­™yüÈØiÒs7Õh.–Öq”Á}|'˜¤ˆCpº”F˜j"­o6pûw¾5J5z¼ééyLác­,"kѧæC-V¡Ý³ó¡’Èî‚õ’›¨¦ÕxuVdRî¸ÎèZÁô {^~"Úå§"Ç�/VKµðaŠýÖûà‰sðÈ»¹>Ä®¶%{J[dìnü-MôKNoº+ Üü”ûYî>Æ4nA-Ašb|qRÔ9¹Gvoµçr:¤ŒðMAû´5]Á�‰^±‡­ØS䔕­“…^BÈØÉqå;/i¿l Ç�'| Žn*ÊvtpÔI�"‹ØõÅ+œ:¯Í]GÀ@ŒÞǺg;ÅrATøö3|à8ŽjQ{”*P0=ôo5‘ŒÏqÊý¾r{69RzêJgcž»`ë±–îðq¤Ûä’ ñARL·lç¶üHöé9 :È5ÿ2-_Tœåa€¹W”»(Vöa¶Riq‰‡‹„ Íävštd¶ \¨ó›¬-±¢7°¥YchðBá‘¥4w´µc÷²�®O=à.d9�óŒ…Ýwó‡b¤—÷=ÊìõÔpè­ÔÃÇßÕŽk¬Ü`¾¯¾t§KŒQðšøöŸ+¥'²ê>`·}8%óa6ÔPÝ=Gï¨ ¡ÔÓÏ}sÅ“ñwdŠâ΢í¦:3¹ï‚Y}"ÛÅÌè”Ñ%y ±µÍü§áü±gB7TWbã7GlÛoK�` ®M&í€dÐ,ú@PÙÝÃ�ìÚû23ó¹þ�ã¶ý=ß9uèP¥¡´ìp²ÙÞØMô…8¼•äCxŒ†Óiîe*Ï©‡Fæj!‰�¤Ç)w$•¡×ÛîkÝ]Ôž£–x/“oñ„²¦~ØõmN零�Hyƒ¿+ñHƒá½vÅØ­GQËYÀ�¼š¸«qËT›+¾‡1‹ûñ ëÄW ôË Ëž^( ¼�Y6LŒåÂ3�S¯1ö‚ücPPæMºùƒêi7†2j×"ú\µòjpoõ·ooÍlD?ñ[Ûþá¼^tã ÌÌÇGUí_ƒ ™Åò»e‘É‚!g3:8yã0(@à€êÁ>Ñêj/ï±=`F+ò�ù†Öfµˆ;Ï®�sva6’_µ6 žCk;=ý’òH7Æ–K†;ØMƒ£L�`|~à.—y¹6UÖðÆ”ÙÈÓ=„íŠ\Q|æšÞ'x3Æ;r7£Ô©Øiü×]Çì�5É, J¡ØÇŒWóQ_t\Ëê:ö5Ô fJDqå:0ë9ŽL9%«*¸\)±ö¾9îêi"ín¶'a Žë¹Ä¤_�Lñ§Û|é´§W†Î¸ð q놶 Š6VÞÔC]ò›6Ð#(Ný Ç>n.ˆéŒ…`ãìÛq.3Õyõ*Î?¡æ.¨ÞRãá ‘ÏvþíB=c��Ä�¾þ{rôœªû`N]EèØ >}ŸGñ5ÿCùRD.`S öHQ\þ¦0ÇÇ©çÉή¤�Ò&Âçnk�Iºà›a´Á²Ô(E·R—Æo‹OÉàqgº¨6.  `Ç`"œƒ"º-�e8qh€Ä�ùbý„!q½ÏnÒLœHÞŽ g5r:Àêy(ÅzvK޲Œ=‚>©É\F[[ÑmyBÅ+úoT½=ä­/(/6X´R„eÌ ‹Þ­49ºó$‚ñå‹§ ¼À×Ýà3µœ™ò˜1²Ø~`Í?ÉgƒÓG®òÕýƵ¾Í`ÍwF»þÉß‘ÏÜÖõ0H Í‹‡Oé¾gé€WáM –719òNt˜Ø‡›‰}ì²c;dçˆTã69¾i0w—ò–¸ÙÖ‹Ó«Ínì*s3|�€ïHÅ—”Nb¤H®ZpÙ2³asp;Ö(è´'n ºÏ7×�d¹e£Ó¶{ôùR ð€5� `™Ž7!φp*^¹µùžç¯<§¹è å>Æ‹tú 03¾l·`u÷ÉÊÑŒm™PÒÖ_>pƒC5q¯°jÑÞ°` $YDZˆqÚ¿'›ÈÉçKp'¨m$�Mƒ0se˜ŸŠ)žHÏzˆ;: �ˆ]˜/mü�yx3î9 oî-âã�sÐæûtüX÷”¯˜ �þqÔ¿þ¥á çZYH�yѸö#òoq¾üÏ\èP3ôú.Üv1kîóà#È+hj2ì;…¶ [³ÎŽ>ÍÞH‚*±œ`§9Òk!Ëp«Ì\h£Îø#i™P:¨·Y­u­~ŒãǽŒøW,°:Ìùã�”¸€å¬� wº@0¦N9S//Þ¹ÛðÙ2+«¬<ÈÁO>ð-œiðŸqNt\ø=^ÐÚ\~f5÷ã Oðܱ™‰Â¤ÜS4©“!º<è:±‡(LBH® 2c¾?'{Æ“ÕÃçéw~ÒâoõÜá³Ù¨·¢//ˆ’ŠÒdN_®M´¡ë³ÅÔ.¼ê¸&Âþ8³‡%Lkz %šß›fÚãÓÝóª(E~øHç$N,�~ðf>¾m=!Â-Oä¥z2ãm¥Aâ¥L9O*|^ÖÉäw¹�3¦å²ðg§Éþ¿.RÅ|YÅ0ØÊÜUOÔÏ“½¸°uÉl vëÉÅeÂBè<¸t­ïu=ÜŒ¸@ ª£ç†Xò=ž˜ký#cc¯3ã#{‰U˜dÕªîYòÛ±RZE íè##€q,8DLDû˜ô¸>а:Ïf¯P{ªC»¤×!b®_{œë1ùÞUp¢÷ë8rvAU²yËœZ‰ £º+2àÏ ¥úÇß+ )ÂKõt;"<ÛÂp§¸å‡HxŒÖÆèn¬³Æ™ƒ4×î½Ìuì`úá+Z;èmìjþ(Y îú|Vf¶»ÇÁv?\lÏî딩ýð—%žPgÉCÁH�˜Q×m3L'�ߣ4Äô*/5ùýËlO‚×F+9Ö* Á¶Ðž=þ þáݸš¿hc–à<ÙˆjXyg4nròM‘¶fc*ãb8®9;‰F(pR²îŽp¾8ÐÐ ÆrF@h‘›šÎ°=€¹RFrâ#x#ßœÍ #%Þî9¸ÐSêuDÒ¸Žd¨Ÿï.@Ù® |>2©¶Q£' ¹ð¼æ¤3OpÇžûÁ[Þk5û µÊsw¼}>O\v¾ûý%˜’¢ØV‹u(YuKІ~¸Oô¹ûìáÔ+‘p0îtøÞŽßD;@e¤˜,þ¿ße%k ²dÌJ,Ä#ð2Eà�ûhE‡qÃÌ]值ÑÇG+ÊœHOµ­%™opO/¿ jŒ ï‘/²Î£bÈЂlË9ØU`Ѓ+wJ"Ñã <@.bm{ ‚Ó�%ܱÐmúÁ°nÄ]º÷LÀŽfßpƒ |1—>YUÁâ0SÔlH}ðáÓ˃!íDt›ξ^“*€µ©GNÑþLÖT"REq=Ûjâ‘!Œl”;.&Þ!�Ô¦úBO$¯<ês åßÏé!î!f¸ žýô®ž×M'=ƒsT/˜Ÿ–‰ê ,dR¬â"÷³kb¨ãa eí—q´–s½§n˜Ò9îý´fÞµéd2ïk›�l/bšè݈‘©ð ý‚wÕ±¡Ð³`®ì›ÄÈ+X×H˜ÅY·.@äAm‘£F}² ÌÆ?Ö_Q�™ˆ…Ö5z_†ïmþj0@{oÙ¥ˆ¼VkÏGzƒ«pôzê>Ôëa GÌ-4†Uƒ…ç»ÞãY޳ ûнý‚´žGzp96¿™švÃ`E>‚“€Ê³‰YH�;ªKò,EKÝ•CPø¾gs[J ¹›Ð.[æÎÔ]Àµ¡ÞwÍ­ˆ…ÙE”�FB2Á¹d÷[ ã�›æØD‘æT¶¼€’½@�BóhË€ƒž¨Ú�_¤Ì¢Ã}Í`y r—ã§gŽcC9®1)RtÀû–¸%§OOj¶ð÷ü‹”ÚÖ7rvØBÒÁdMò�TÕÀCU³¥9Á +¸Ì$…Œ³m<Á6±‘�ÑQÙ¥!%ñl.n É%)“·³oMby°wr¢qÏ�ýêã#­BI™™€9÷¿±Ð²ÅÚ ù`fnñÅu7uÐj½ãaEº*®[9åÑ:K´!¿á>Šà®Ÿ¨®[”�JæsæÙ|2UÂ>¢Ÿ¦.?­j5ÉóÜcÜ­8WÛÆëå·­M´÷”7,Ž"¾'¬Î>ìuƒ†ÂíY9 nhMn^–¹Y®Aï .°ú°ð‚�-lf4ùA€`“§Ð.\X‚ô á¾ÈF–¢�.ö/Ö7�.Bµ¯Âã@×Û79Ig,\VÑÒ°õÝÔ5r�Ì™_ °)fx�Ó§®¡ æ2 +&›!íUn=TžM’å¤{Hg¥\㼓jÛ‚Mà- ¬;­"_8µº!$¸+²Þg>úïùô~7Þè­ÃIŠ!ʈTp©³{Mp ™óž þÓUä¨0‹b/¬³Êw°É] *ÝV…¿pT#Æø°kžûuÍpý'}±~G(Ç~–<ìíå»@§ìþK„ðšÂ^M˜1’ï¿GGŸ$ OcÅ�êÔ#¶ýk±:þ6NŠÂþVáÊ9›ž»d¸l_W̶œõ©m¾eªãçØ S¯ØwûGÝI +d@“†s¾g p×GÉo§;c鮸ŒŠ@3 _1a’ûîoy(=.ßK3Y€Õ³0Þf±¹âPh�Ì\ ‹¸€©ªµ‡¶CsÀ3Y” âÄÐ'xƦr7d¡L9vÜãi–MÕsÍ’ŠJ^¸ÈlÝìC=„Dzöß�@¢¤ ‚ÞlAÜÇxzP6ýÎaл.¡·„—– Á…¼ÓÏPèsƒå…�IdpNcPÔÖi4³�ú€¾“TPÖ3QXÀ°…)î(D×3ÔÍ\2"Ù§C2ÆÍ¹ùÃ\óE‘Œ8²€ãp¢— Æ(Ÿì®édÁÃgñmM»!'‰ÚÌ$F@mÅDäô°ãã!¾G˜AcÐì`0G[ó¤Ì|±Yµ¦ÊÙ¥#|þüõ‚Ýž%ØäºÔ®ËçÂãu¥¤QD9ÑûºÕm]ÌWyS,Nã�c¾•þ¬îq;íëm‹–nÊÕ¸ŽÓ}³eQ*æqähÎÔ´�úØK©t‹ño|ê÷a÷0a¤ì/v!aõ �xC FýÉŽ!¥ Ìk :ÐUù–$€BÛ­³Þb`[‡`R¹7Áª\ƒÁ@[*Ô‚Ì25¦&¬&A½31 \´+”—„&=Ôœê}ˆ t Óš"7Põ.ÊïF}d±6&1~0U¦Ë‰j]"¿z|Øp %âyÍ£Eç½À… {4È �Ì‹ÃdG§¾|'U%�ówm˜‹Xï�&{_‘äÝåãÊ7¾â}�¿Ñ Xa| ¢g�¡x�2,;¥¶t6æh&;‰;ÄëR΃tãqÞâ"~¬(Plÿ,�¶Ky¶L& 8±¶ÍË8ꂸÇq›GØ `pÃ]hˆÓÆWhê߆âŠÚÐs¼‰uÕôY =H…I®4£ÕK™ ¨u¼ŒcËm“¤óbpI«·láßC¨’ àŸP¥"Y¹;òå-’üX9ý‘Ü(mÒ323bQ ñˆ-Rã`6@¶ÌŒBÞ#Ö1Zpƒ»ˆeÅŽ(§–1GµÝVª�¹|c¸�Ãk5š3vÆ zò‚³«âœ*!I�'¼Ÿº´…°Îq•6ÄnÕ9ÅA\ÀÍ4N¬3�AœÉÈûÏúE{Á Ì*Ǹæ@„ùfÎt¬“mÍ÷Þ©æG*P¬ûó{Ûpb&‰ÁZÎý½§,YY«šiÎXíÓö¨w.’/q¥h(Á0Tª•Í:É …!FÝS¸V2jøÈ�ÛÇGûQwuºXAñ•‹­£OÏÎY´Ë+ön%}&Õºø!$˜zU¸Ì`àäXJ ÁK׸Ö[8ÈÌÄ$…îƒõóH:ƒ¬öƒ¨†ïƒ$È«­Ç±Þ6=â«KµO°·žÜ±*™ÖVÿˆØx²„ƒC¥Ïж¡«,cÌù"¦ïD"÷ $Ë)³B茹ƒJGèN=BÝ/4>ÔWCùW_�ç8‹ª ¬At2a:ß_9ݹ¡/98¢ÚÙnAáœ)¿ cãh‡¶xïÍ’g ×Ô6›ÖÖì\qlî‰Ð`HcBLaôqxéŸÛ�Øìô»2ˆîu$ª&>¾8èÚ€ùk}yÄ�.¯± j"¸š*èBÖ�’°îÁA„f‡!9w„’ºH(«Šj T›w¸ Z �h€i,dç)²d Âa¦ž=v#ÏÍ©µÊ_‚¹G€dÞ©¯tL�â‘ ¯Œ2�›¦xçé¡@cfùXð,Ÿ’Ú«…ø#¸,ýô§Ik l‹™ó@èCÒ͹O(¿Y¸ÀãNˆÍµε@1Ÿ}åà•>ŒÄpÕûÉ€{e¸™ú» ‡ƒ±)2Wµs¿ÐV|�† ìÒÏËlVÂ'ʵø¢Ö*aûˆ�ë‘Z•}Ôê”r䎠-“ 8¤‹(¹i{-<Ïê:5²ið�^ýï0(oGw«µ»!X13s²“%ñc A+Ê£Ñ6|%µŸrÆÊ¢…!|{8‘¬xá¤Eƒ;Ç'�@³ì†ÌV�Ci»½îÌá&J‡lÍàÌoWøÜkØ F}�âòl2^è]y±²aCHDš Âèlä}ˆaÉs-:áÊV8Wé¡.hÒ¯}_µjŒkAÍ»’…÷�Ÿ·‚0[{‰îxüæޝ©ª/íIêÜ<±|ò«²ØM®|Vwò†í�0B\)pÞE@âó³Î1´ T~7YZù ¶ßokI­»«· Š=ˆ÷·4«Ñæ~¶ f`À›!ÚÖ09OD}ì{á$©ôíÒ†|×gÎ6ÈÉiÖ3’¢±_9·vП«ë²´X.Ï‚lßÏWÅõ¾³¬lŒˆ®U"Yô1²‹†\Å ÂT9Az[*‘›åô\Ì�Ærð !m*â™»@ñ/‹` FþîÃKkÖqó_UêПպöN% O&KÒÙcë†öÔi »#Ø\ß•VPe@¸1uzª×µ„oÛî¾¼1‰½e‹ë6MQ·Š ý‹iKêÆÂûŠ,+*”epˆ½��˘ZRçÜ9a—¸©i——PJý^G|y0e¿ Ôv¼3 =šèؤ<敯� CC~óa¹bBD›±¸‹ÝЂ�Œ9_,È …pë³{…Ã$´A¥ g˜ÅÖF­M¥aÀâ €\P|«Úô…”ãCõg~N숪XæÁÝv·³Å_”!Ü��üúåo” Ñ•ø¡·k)·1kí©A}H�¢›½ðÛ¯uñ’›füUaÇdZëZÉĦ›åÀC¶ –¯J#Ç�žzçÛÁøß¹SÇÑUrW wƒ˜1öØ›òÃjœz·L¥ÍŒ:(³¯ K|vúå‹ÅY%eQE+£ Q!T25,Ø !ã ðEÈTZÜv7¤*¸ 0aY/Í) ÃŒìÆã*w<=õw Ÿ®bl�!{•_ì)Vp.Ží�[™¿Æ«î[^ÕžÄX¥¦öâ¾S � ¤/ÇE"ß6‰µ÷a€dˆ?®_:éK6ø² Jܽî 0÷Ò¸bÌêµpùT>€›†+ÙÜÍíê`=°´–Åã{V‡¥cJÊMf"ºz¹Ñ'HY­üad8è“Þ/ÇF "…õÔbéJ)7¿Ä¯ö7*éñøP V.{™ä«ê€eãëÞIƒáÎsØòéÈ ì~ÃÅî�œ�šÑS–’|(\ýœ#\Hº(y/ÝpÓ�¨ähb,O ¿Ødk™„8™Iª²âÃÝÏ­uÏ2,àC¡ÄN¦Xæt»<$Ú�†l'ZIV£ñ„Ûl®6}8m�Ð2DX@ؾnuÙ¶Å;cïŒ`e~šcF} î~¹"gkˆ³b{¹ ëÔÆW5µ§`Ó{óÄÃÜü^ç )M�E«¥´Ö¾ÇwadpÈkæãý9ˬ[˜~Ï˾ øa1š'¢Á½³Ô‘°¢}kš>Ž›õÉïœê1±§×hܼ¬ÈÕ»(ùvë.Øx âp}\ßzÕÆ™˜›ÓBZC”Ä|ì`µ…ñ)ò´8d0�é¿$lé»yØÓWª­ ?°AjZ8ù3•v­—G7‡‰‰¸-~5=ªøPGvÂzísSÃÝìPz»¼³c~퀮™{tE-T°Ç¿[A†«‡†á1ŽWà†o»“µõAÆ»G šÇbÂîv¿Ì.bãlÅ­›Î\Œ®z_¢¦Lè9ú/=,3P®�¥”/®Ùs£št!,[·ðb–¼@GæÞÂ#z-�ÍðÚ°Ù“ÇhsÂ܉µ®‘5ÒPßC-û©©"Ñ=¦FC­€¶¢�è°—*è=]�¤¶O‹2VßU–÷M€sfMoju¾�“Ãf @½ÙB3<ƒÄ¸e¯k–>¥¯\6�‹"VsÕ.Šä¢òæ«Ñ+=†³¤¯—×lÑæ¾â,é¯>nli³*E æSTjmšЧCÍVÊ6-u@Û!•{¿OÏ+u¸¦Q{ÃÉ�#uÏÜ´ÞŸ�ÂÉ9ê©naf·ÔÁ}üž¬•ó¾èÏ„ˆZ¼à¯ó´@X°óÏjóޓլÔÅ�Ì6ŠØ��kzîgš‘`ºÝáúƒ—ðX°äÙIÓr¸û]�Dåyí%9®þ“kQ’?ÀÉÔåÏœÒê—€©Õ‹ü—ï™Â:®þ©4V!B§,ªž!”‡&9’ †­³Ò±ÅeA[ŒÇtûg^£M]É-ÅV&»C^ 4Œÿ¬GžÆ[XÞèÖ®V, ªôÙµ\T· öŸDíG|á?4¡s¾GÞlgµ‰nMÙ?E‰¡-…|‹\;R¹2ÚÕZÜ^AÅú‰£Ö7ýëÌdŒ%'ö•Û¾¼ø^íÏ=CùÊlô³äU5³èlke‚'ûöÓ-OØ¿™FþÏ’L1!4Sj�C@YŽÉ h3�.5ô·äÓ½ Jµ±`}’_ì‡oßoA¸Ÿ¿Ó³r-aRظhÌ1ôg| }ã{¼Å_ƒŽRTÃf·1f×W Kp9 o°È9îqžç)kIB®£(!ùbœÖt9ª°ÝY<ÄÁ“"„ 4&! [pïl¸Ÿ)t§\}„ŠúL*.Œ‘Ü`³cö®#fl�Ê8,BI)¦+tMaŠøøûÆ€‡¡ãZÒÉÝ3ƒ9ÁýeÂ%A„4ç'VÓÒ;Z-‹—‘WiÊÕ³q;Ç }i?"naAŶAdG,›y@]pö±g Õ8.êÁ:`žÓØ2¶€�+ÙdÕæîÀÒÛjQ–Û°'u£YìÛ6t¶�¨b27¸m,›5d:›w£NKú÷�‰Ä^(–& `>RòæûáØÛÐvÔäNçÀN¥ÁYL© 4à©Ì;Ì}ê_oGVÇt¦š¨½4¤}rú|kÌýãË;ÛÁÞŠÁÑ-Ñô,­l0Æ6¡ºÍûlœ"EŠþ³޼Óljõƒs,dÇÿ 0â™Gíô·ðÌJÇ>‡§³r¦øÄÂ7/ ûªí0,ïóÔáýÒf#йܕwÑý—¡j��¶78„&®âøª²…=º)öW­—E8+!÷¡Óï:úhv (¤C-®Ka´j5x9z°\Ç-L1�Ñ]¸VED%ÎÏöfÞ‹kC(þŽ"È—¥É#ç„u鹇¥ÔêÕ”lþ°ii¿f0è[:Íä‚oat¦jU³Š nÀ~¢qåæç[Î�s ±¸„Û»#²… £"šÆCÍžÅÔ«£"«r´÷-ÎÕ¨ˊøB*€Y—Dff(³,‰6_.Ie-FZö³±TÙ¯xÉõÖúËF¯ÎY9}X…R„5¸S…7$S4�Ðtîu-Ë�qxÚß*$¡Ç7©a²°™Ùû¤ºjŒÅí{¤^íÔáÈžò«jCHœ¼)j�,¢K(�»hp—iÂÈ:#³Üû o»o&ozE«dÒT#®l÷£ – p°�ƒä)èC··ØFîOˆ—ôßvUrÌÑöQ %ĘðݶåXn�X�ªþsaðŽP¼ËxÒz¹6Š×�̽m„-4~¬‡ò~Q7ÓEœ,�ë²s,žP²�NG$ 9¿ìêý•óß®U€ô٤ٹ€µ™Û$ûhÊçbºDYa￯“Õ¦ËÐ=×WÚ1.òM|ÍÑ2«iNuÀ>~sbcì¬ÔoôiôfE<ð¤¤ê„|Ôï/ÐÒètîßå `“½¬çÌC8Ëv$Â!£žŸŸ[50`?nD8²º@µ�-!A€úHA'ñµ¹ÚÝ9Üß¹_³†KåÆBÊ�¨-ïbWŸÐr›$Ž÷Ÿ€âà™ýõ[a†F5Ô÷µw³ðÈ€ýXì‹ ´Š÷Go‡,�"øBú]K£žŠ,¼^¶ýªtGsæ›hxÈîÿ‡k®íÖ±úçãà©¿žùû{87Ç‹'òOmü=‚°&ÁÄqýæl×ΑàBµ¨'GàöY¶ƒ÷×mXç³; ƒÖªŽb¾¸}ï—ׄ¿fwÁŒ–ÇyÏÖú|U-»=ªÁÓ5ÿ_+©ôùc€é¹„^®Û⾄JÓ^؆˜~Ên«aÐ@àßpqGȼd>íG1ýܨڬ«b=½ËÎ9îPñ·Xæõ{6 FRÖ6ÂÚ^ÜK3aŽÅ*id¼H TŸg4ŸMs¸_wÂÏ]ROwä¶±åØ9[08îµhzŠÁ¦#Î3&6ÉÜzRÛÝ&Óø±dÌ@ÁÓôçVE2ë`e ej�‡-IÝa¯š8ÀMŠ ê;kÛZ’tØÅ%$‰>£Ð}L3i“�~Nœñh-vÎß?ÕÑ(…¹)o’ïØd/’6þc6ªoKìö\Õ,™Ã´fÖë�PE¦NOZT{ã!W“‘ ú";Ä}h‚Æ]�ÈØy©%ÆÖ/ìÓ `Ø« 'ä�?� �39ÃmÎÃñ[ew¬ÈoE£¢­Ke­qoß{¬)9w†Ä% U¹d•¢C�£Ët• môG–í„‚?b놲櫪�òÒ¶3¶ÂèiiT`Ã휗÷ß4–oá;vÑë�]OœaÕk<ÕhO@äˆ8æ3½ìïޠʵT81<[É$e2v‘ÛÛµÔ.êêȘ,}Ù ø­æ·>¶üÆPÜLž£Õ,Ã@+[¹[�ç¿ «([8$ë_¹]ƒ“®Ú˜Ïenð+='ØÈ/oš&Eñ6I/b«‘,ýÕ�þ°+Û+…í›`8pŠë90k ZßÛžþÞ®i9ÍÝ…øù¤«o–5z�}$’hf7 à%ÜØ{dUÐۯijQÛ�Î'ÖèÈ"ß0 qYÄûA½3¨f;šÄuOÉ‚ .Ðý�bIÕ1õñ½¬ÚWôÈØú¹€ê¿êÁB´s¿sÚcøÕBA- àñ…r;C†²ºXò"y³çÆ}ö‹�jš;kJöÃVP.ñÎ’ý]³ÜÃÁ³mÑØKGlbh݆�U¯cí3†ö5Q«À[FcCG§õ]Cñ½5eg÷ îÝ/5¶³Ñ°àÜAc-ÛZ:Ÿ[ zÊu‡Ôtgk§¦²ýÉÍk"YÏøYkÀiþ�(}Ó(Ï}±¶§/1ˆ»>Þ¬lûtÛû˜Ô�þN‚Y‹�‘!ÞTKž©°s•ü�M·å¿c qÊWÝÓˆØõ¹:sˆ|!f‹˜D×,QøJ6EwŸ�vEeTS7 ¥Ý³­Õ°Ø¡h[ñØuô#/í7;™e:rÆÇç ²ç»2 pg/œgꟷ€h4 TÏÄOÕ'tÅî{­û¶#}0àBÛÄ |UÎ�DÒûK4…â D:_ÃëlÃùŠ[Dà�`­èæsTŸ*Á|4k[»Ëa¼¸ÝnÉi>Á;¹± ‰Â6/ùß‘.€=Á+� ’e{nýsçòG:â:@\ôÌÛ’ rBEÙ[‹0Tâú±°!¿ß½u³Êý)$BUwé ctðB?ˆâ>yˆ,»;ìLBúèF׋B´A…Ê„VÎ4ÍoE37Ú]†îc3ù&ÕMcr<"o2è-#�I¤:S©s¨—s¬Xp$¥‘‡-Ó °<6·°Ð©Ež,¹±(¶‚DZ­ A»$ExÂyw±ÍýOô m÷6È­�"J3Õ°] Í3AÇ©ÐØOÏŽ6®]²³Gßmí·'ã6éØ+7ÖA{ ØìP ¹€Ï)Ý2Öï�ÄÕXêåWní*V1ÌØWš}êþ¿Ö¦’�±6J�Œ ìÞ.à·qÐ�õèiÜÈìÝbQŒSNßÁ±Ë¥¡í+jÔbă²¬}¥¥iÆð(Ðxž}Ô�Gƒœà…ǘä)(ù=„Ûïõ$7üþü€ø³ÆŠÖõû—›<�›wzB…qJ1ËÏ’+zß" 瞉.�’g€,rärɘï¢aц=昌ÚP+W–ÖëQ«OIù½ÓÌPqÛzpÏš%{§An1cÉ܇pô °éÙ�•vXÓ�8w9È?Tní¾z®$ì:Õû‚�Õ™×E·ºæ�2P’‚cgE¿®à�cV»Í¦tË6ÍíÕÌÖ@Qí—Æ”«¶‹•#t·K¶PmÖu²Ú#"QÍMvêŽ[AËp¶¥=dm¦&NÅxDÔ_�¢vYM,ƒسÜiÙ�f+n]-õ&T@ž@{xž‘æ’}jÉ[&KÕÙ/ç¨Ïcd\Ñ«·¸W¦<ä3…ßLs�4Ôzç¾ïøÇµ{2†ñøL :�ð�…‹$ï’Ö“`#Ç(Ÿ«loVÖ³“rÈn‡ª}Ý-z�¢ Mÿ-§Uö!Ð.;#‹ˆÑ]ªG/k©o˜oÀøÄI¹{ñeAw yèJŽÄ³¸Ÿ`ýåj~\—ŸÚ °†g"—¸6wGÖ+¹$Û]v;`19ZÁ­žÚÙ­°ßJéšû×åÑ@i”Tîiù8¥‘í²ŒÙ¯Ö+½qmL½]áÀí}ÒB¹[¡u YÜ7°Ç15r¶þ?œÉ^Ûs‹5Sû¥%‡ž}È÷T/"õ»Ì�{Yõ3øV>^í7dlmDؤÈ%‰†…G�“íÄ/Q¨GSÖ ¾Xàn| õú_äQzÀY)˜JÎWÖNoø{aÈ]§FÓo¯QN­>&µâáÖ¯WL|𰔬No±ëý{»ùŒ#î €¶Á… iÝ[Ǿ‹„ä,wä]Õy:ОÃèÀX¹-®È +”N¯ÝÚ7Í©œ´ó–¶`fûGù8[…œ-¹;²’MØ ô”6IÀ[í2#ºr5Üûfú¤ÜòÁkõ¥/wžûXà`! Òµá ãË­æá2`°«ã\Ì3u¾Ýöûaab°=~šK·êȲ™¦4ó—ú/¡I\o TäÛ<ˆXÃ[,H_Fîw[‰>O¹Ì~wVí�;¨bU ¤:W’ô—�îõöÁñ$gläzb0±§nª9aùõŽÊöÓžãºÜúÄ×|:$âÓ:ðºìï�¹Ž®ìo îë1nßö‹£Ön­¢®(™~ó}Ô†@`ú ?˜èÐ;ø»ÝÒð£q«Ø HjÞ:(SæìÄ¿¨fü¹2ïD Û›i†•Ïq6ç$Á%‹*Ö9„¢��ïÒ¤+ãÆ†’ÒAYø÷PÐÁøl=Ë¥¼Q‘¹¾‡„ã Wt.˜PŒ2e€ÏÉõ¤òQWºd†æß¥æ­q6K¸ô,ÉÜWQ±oUT sÉÞu« Ú-_�Áþïß¿~ì0Ìríu ² ƒ¼9wÇ«À�Y~Ø…6·�šó†<7Ÿ¥ÃLÁËß·É´Iƒ'b®ÏÇ–U»}zèKälâø5Á'WOÚ—Õß&ÝGÛg+›W µª ñMjÔ&-Wæ‡öÁ`�á}EðÎ4Ôo”K*²6½Í϶-*;®^ ï\Ý[ZÝ�ôîÛ‡fs¼rCôÅß;-åÙ}Ïê ¤ßt7 ïA¯1õCA}óÂÁ~êgåj.6#@¦¹…Í衵^–’›�‡„ÛNæ#¶êÖCކîwŽ„@”ø—]U!‡¯ÌŠvîy&û&ϳ:ÇgÎÕz§6°pMn¸Üò2h·™¿óõt°¸°1Ž´_W„Ú”™Èøîn8ì-‡µ˜äܬ€Ùwã\J^¥ÎÈô…­–Dh%eöÉ=¤\7ûIJçFBÖêHcv‡íÒG„_c�ú^Ç2‡Î~æÝ×ÞÏ+F»ÞuÖb²3q;[ —Vr‚gùÁ¸„|p·¾¨=�Ÿ%q;x£ut…I¥ƒeÜ©N|2­¨ê¤ZºVkž=ÍvrQI‹Õ#˜ŒæBW6c«b²Œƒq^ñ„Ñ Äa@´ÿqmªÉDS›ÒJš$ëÛjÞù.ÿ;7%ã`in€¶ì¾G™þÍÄ7;Ljþ"Fö/зjrš}c;ö5yÚZ'^à>=ü°"¡' Ðb/;“™R¤{‚eËÄM�²-Û‡¤*5òèɸÙo[O{Vk‚öMpd2Ý“ê°ø:lð )¬‘ïš§M3ÀÈÓ�®œ9œx]Êý}µ¶Ò&&m‘ã Ð݃ˆí仿ÑÓ³+¶ƒ–WuPðmà¾� Ô—Gì|©lý�çÜ‹‚»ï }¹H}X›ö»ÜÎúZž›åÓ�ïÝ ‰ƒðrK“Wm)ŠÂ9s…¤v±z×¾¯�íØ´q-cƒ@ OñÞáñÖ"èš|ø/¼»-}� ¯ŒdmŒU‘Ც½`$ó-½d n-xOžóóo_™‚5ñ¿�NCæüô—6�ºL âÀgÝ” [º (y’rÁÍÕ2‘ƒãÍÕ'c)îÉù§øÓ�äý‡¾;ò"äa œ´Úéûjw¿4ÕÄßí¦#~Q0ü†„û•Åô‡NñúïÊ®ça€bÖô&Þ|g^í•/Æ…‚h';æÒ‚LrƒàŠoE/V¤â<ÑûBa± N‡cSÙ¤b^©u›î[y£k •[ÝšiFøK©Á[t=2 œ$” (-Y¬šœ)gðÝÛkb&T{…à¬tåº�u4þ€Úb­o(g˜ö6 f xŸ¯÷ìä5 ÖÌm-\/\Tˆ~ïÆôÙel pAmr0YµŒ î{?+Ž×¡¾‚Ù¯éuí]Eµ×ìïDà‹`“M|H{r4p°xdžÌãÊ@¶¢”ŽÀˆ¬eucr§ ÙºMl­Ü¢bûÅ¢FxKçÊc"(¡ŒÃs ¡âÏ”s'…+Bs %¡ÅäÿWBÌMM¼à¥Ó ,6¾8•‡!kèÕ¢Q3ó\Ž)>ÌŵõxG4Ër:vöG„7ÒûãÃ$ÞÖ¹-ª`X1¥z~Ò�²ñÞoRÛIÃç¬V£ÍŸ!ωç-­¯•4Ö2ÕÉí¤£hXežc¡c”¿/Ùçʆv}ýŠœšºÐfw~§çàUx[âPkÞ#+[¹rr’&<¡ŸÚ@£�%«¬û¶—9g^Åê¢PÖ¶\e3éó;¬ÄŒà¤ Þ›þÅwÌ_|ø ñ*¼B–çv×|?­ð>ðÙ MÛ²±So:}h¯Œ#ƒhÝG}…ä‚›§£\a Ÿ.ü‘z²ý>[Ù…¬�áÀò+)÷dµ®AT÷oSl÷"—¾[‘µKI¨}HÁÀ9À[@çˆÛåM¾V›p½Eúê�øX×Ô5ç¥öoH Ù­ïxX¼fî9u’ÇLûçKå’ùK›ð8ItÎ)Ôv±«'‚r¼�‘=.CP¶¤Dî £§_Då®”öþnnàH _Þ,ÊòÍØôË»_ÜÈ|×ÚæÞop8øêxËãÀµV¾~èèøZñýÜÖrÉűuYÛwÙÜzA÷ÖÞî‡�{Í{w Èå5FFÔÅlBŒt ¸Õõ¡bá#•©�»ÜT®!±l5Uä4ë<ðnƒ�a(æÖÛPò¨ïn M`Çôû\Ü}Ìcµ&ÓVBë µ@èÃ5bé`|^ð¶çrþÕ4ÄÁ»5:Ë·v}Þè°nÓÝW3¢@´gòì:�µûÀ%ì™¶±¹¡ÈDB%.‡HÚ¼½�9Mœf~g~àßÊy;¼ä&ƒÇcÚ¦î²G÷×�дmR‹_t§ku�Fëxս쇑$t&Òùì�[ÔÙÉxY½][– XbíärîÖiúurÏ¢t@óKlëe÷¡#"Ï÷`6"ºá†Å>oUÍæÐ…ÿS·héyŽõ¦áÄm6 ëô^Ö"!)&G Ÿ£kÒùquµ Š×éi7“ÚX7Ì]XÚîŽxNOI»u;±úÎ�óÜïNÄ—Åö\Çß];1bn~) ËzÈÜ2X™9 ´(ps²EO‹.´¹!�ésèDºÀz‹º¾Eì»í·8coq¬ûß‚�ÕIÞ9åïÅúÙÆq¾}¨úøŸ”ÎüçÁ Á¿åƒóóð˜Ói²6i„FZ@²¥¢jSRcgAɪ9”$¼3^)=±~¶g9…¹`N¥F~¢¨^…΄,i”qDò��‹ñ]‹ç*Þ°«‡�àM^yÒ»’Ü÷rººÍº‹nz¸�ê\%d«M�s8u ôÃvâä’ÂH…³i¥Ç`­YcÅao)ˆáD<£¾Ç ’^̦�Ä{°öyr ®uHÈ(¶÷13ÑgP�ÃV7'K]{è3ÇH¶øRưç|`¯‰e3U.sº?l%‘2PÕ{]2½~˲�Ži;Á¤¢ÑÅô»«]$/Ùž# b5e`UqÒþÒºFuð‡Ö$ƒ66]ˆ'?)þ�C' Eª ªb;VŒÉg“DŒ4=Jô¯u¹ä)w“*êªY~²~Øáònh`cl(Þu¶¼Yë²³y~‹ëNŽ¥S,‚�íÉCEÓÃDûg}Z *ÞïŒ~K †Ð@»® †L÷òc<ê$³`8Wgáƒáe×…@Â�í{Ó ±Ôä8p¢‹\QË^ËVS “ßvE†j‡b2°ÇÆ�jŽñròhl.Dc¦Ñ\1MÒ%ΘÍ=Ðu¾R³+öwtî `ä™{?¤oÇÑ—~=Œ5g Ù1›6É.ú'—ì'€n�¸©Ë'-z¡äðvk2ë&©µ<�"†wï'E®®±a ÷‹dë­©€BÓ»/*l€ Œ«nñzŽ#Kµ«Ž„bbùάþD�ƒYÎʾ�=;Àlå“'�®í åaØ¿Äq*ñk5�=“2u‡™{t:iš$p¥�aÚß )5r釓’Ñ?­2n®tÊÒÇû®ó9‹‡NÓ‹crPÆ{8>5µ{�½Uaq3ˆÈ^}›¢×3½†ÖkØNýIZ<€ôé>E›§¿nÍW…âpLFÓÝ}r $¦Ý¬¶#kÉuº¶x¶âXOG3÷º�óp¤Ï×tê÷ùc¿<Â6H<Ò|#EkèœðsuÁ*À Å@^èm¬¶Ù.º šÚîñkÁjI¡P°2™°<:Ø(ðHgÍ辁 J©Mè$ß6+›^–J¯Zb›;Eˆ àÝéQ°HÊ_´ÄÍA}©¢0¤‡FŤ>DÆ4ü Û9å³—�a_›á뇫,Û„·¢çZã€?ñ…Õx ØZ-vÝô]Aì?}Qg‘Ýa0"v‰aÃv¸5ÿ.dø©‰|Åã$fÇæÀ2WSkMX-H€ŒåÎ0¡l«üWµ _«~ Š»Ô¼q^�þÑ>nÇ�É`+Œ2™~Ä’Ö€«HŽ+ñî y¶ï‹n¸ªha|�—'£T¸O¼%®›™�.ã0¸†Uaõ/ Ún�õ‰0V+‡†d:~Á9ŠBÞãjEûdôEý–n÷Ùé×'¶’I¸y?ZBÁÞµýŠX;U[c@+°ƒ 1ÞÔPb0ÖÚñT¯  °o§. â�AŒ‚_£íOF0´ù®?–�´]È%i}Ã+nkÌ`!C½º�Îs�1�èhÃ~ e¾ÍéðÎòÆ ¦7Î'ÚSÙAfæŠö`J!¡ôÜ{ñL>¬5Akl/Ûl÷¤ÍÚ2};Xˆ9ñú>ka Jìϰߠ’'´�ó»t\ï™ :>`à z˜ kªëY¡ø©ºU��¶~¿5ó4¥}שúž™³g—±–3’�ã|Öí¾Ø8»t�Ö76o|£ê^IAà‹ï‡<}¶D9×çÏ3ÜíV™6WØQL�¢ûÖÃuK?ßï߀¹îñú£©@×ÇçqêOÈvÍxgB Þr°‚™f@-Øæå°ØÌ"™˜ýjªå¦ËÌ žE&tX1îÒµ6Õ/^øu2á_XuÕÒbô#Ž•DÝ¿°íâ¥-=…H’àb?p�/’«Dâ¿)oŠmß¶‹æ Ú,�s7ÐÏÃZßÊw§Â´�·!´&r 3>fmÁ–|…¾Üô‚çsdsLeéu±Õ&‹öÚ´½ã6±âÞ:Í{3"¦ùbÿ}mßé½lößI&³62h°‡ÕÑ~U¡Ôi·ô¸_îò.B¸ ‡×óE�HŽœøNÚù ^myg(’öRü?Ø͈ r1ªê7œ0Û´^$´õ®±0âTvúÀx7ö÷æ~V)Ì®ëc¾ópy€k:ðÒú™L‚ÂöíB$¤½Ù(ã»t@­bÕt¾Í ,ˆ?g�ü…V!̯'@3,"@Ž£·ù®£Ïº·îêT Jk�ë—Ÿ¥1*¡Éú“ ¢¬q| Òb˜SÅül ù . x-ï«(?°A˶ƒQ“¼U’Üé—£¬›§üÌ<²Ï ÃÊs h2úïru{^Rñƒw�ìáövk=ÅÔ–÷¤ò Eó&¸³öÓž|åÛÖéJ‚š.ziðåf§õøï²�³›vÛT<̬lžã|Y0áS¾†§‚ 6.×-­)sç¶ÚW Ý ÂZ…X üH��ñ¨‹[«öÂ>äo¸ŽY¤³[3*†ÁP¿\ù mE~™Ï97l *W‚�giÛãm¥‘‡’ë&¾.y=n¢3¢$2`2Ùº¶ÿõ»´ªß¯šÐ‚¾²Ó¹×.1uÐ÷•´ ñzÌå¶×�¼‹Ýù¬Ü$2YÉ“³ú‡§„ý¿÷©‰ö®ÔಞŒak b" \/C-ÉcY–N–pE€o« Íœ‡“`¼¾¼I�>LË0Éß§ÁË &fz6÷ƒÜ3a¶æ*Öº±ì<¢·lQ’ÞΙô‚¾¿%Ý(¿« *ÕÜ?oÜ/lîÏŸ¼  ÞœeyÂÚôÝ|‹NAuéYsFag·¾ïÜÍ«zr®ë"椌sŠ ‡§¹À"^.H`ûë³è7H¶1s9­:Nµ�†˜1ø–øÎ²ûre‡z0IÆ?g èSµ? ‡Œ¸8Ɖ×]Þ&Ì 1õ³~ ñì¦ê!è>kmwëé7³AdX,˜cάjikä,Òèô)WÝ•«xFFèX#’Ùò*L÷†…ɰÛVëPYïÐNòíÔ$=4̼VãÙöà˜œ7( +6¼›I2õbîhmn …OÞÔHL¦9”¤^4VBÒÔ³>ÞëÎjáAÞ5¹Û®ØÑ3s0zU{‹3áæ9}Í ú­t Ž‚$Ô”€Y}ó±{ÒûöÖ2ϪO!³Å=9›Ë\{íá—p–"sr^á1"Bpæ"+¸Kç®ï SG]@/‹7Û0e\ÀÄ9ñ)ç¸Î»hMùúý¿™óYSææísÒñf›(ƒˆgARä &¦É‰G(’yÂZ^%ˆmä:|fd9 Î `*Ä6�P§w\{q;vbéXËПQÉu‹åJà¤âÚg‚K(b(ÜÈ;MLøû±¶4= hæÑ Œk‡Å˜…b¶ÚÔ¯nIPbaì Á;Ív¢>F4‚z¥+@º¾XãdR·”«cnZÏ*°¡ŽÝO¢ìÁ«‡k�§ÏRÜÃÔófdyËÅÕWîZÌÁqˆ ‰›JAœ›fHÍ‘Âeaáð 2SèöŒu·ÈOÊéÍZDZ孳ëﵨÏ}qØ]Z™·y.à.“À»ß€Ù Òyëºï¯l8p4ªc"\0Ë鼓M �suÜMFz‰àƒwÆã¦°�éÓÌì 5E¤ER(û7ãlÖhØ* &Ýã �c÷7—¼b±Í7‚%’ç¬á9yÇ)î[´ Ò.*¦9øuË´Þ4o3+â Ãó *b8÷PãðÊ~~YY멘Ç`mcȸ=@YC }i«WÏZ&çLÏÚ<”`ƒ[–Ú=v#VßdÀ ÖìÛ[yñ9®á™S"ÚnpèÛgõ»¸,çáÆÌ̾\QqËÇ¢mĸ¾¹òdÿo7¾‘ƒáïO¢D`éZn�T¦¸s$!Cê¹Ûxu5ÅÀÁüê¯l6 .ÀE¡ÜX£[­&~ s-–ëZÜÚ¶žyÒâyϲ ƆôÙ›Eù†jb¶MÜ'æÖ&ÑÁ`õÑE‹XG×­e?aQ~d�Ræ2¹¥`j¤Bïo®b¬9 œ$ÇFõš/c]VB›ì}±=Ö5 �Q×Lƒë£"™aAÒéÏ Ü¼•æð!š’{ï²Ýç>Œð5À¿¹�É&~9nwÄ‹{%ß´`‘Ìá L�hA!{º¹–ë!Ñ'¬l•Ý!¾³¬ ¹ÁX²ÂÒ¶¸ÍÈÜ[œšíë:¿ZkÛ¨ÀÕ§=ÉÛgÖË^ƒ2–O])»å>å€åÀ¬W,Ô>©£9AÛ-#›Þ 4ø¹{Vé˜#À¿„‡Ÿq®d_oÉF¿Y¬… »»MYü¹�qRÇëû�ÔwÕ“j•�Ûqã>üxNNø©œ@mïÙÁÒÞ3†ä•+BÎéË]Þ1xZj”®ßº‰`×7‡Cè�<�9Š;o8¾ÓT‹˜od:Ö,¯ �� ¢Ø!�:v;-"‘�@â Ž®§¬hB4ê^;f&¶ÃøZe‚ÌM�9¶òÕ«²ïì¢x[¶ƒTè¾ÝÁû²ÆËÜÀ©.·õ{a­{¨ÍM±W~j*2sgîèÆÂ±ïÖçt×Ö\Whžu‹˜MÌUv#$ æ1$ä»qµ”¾¼æw}‚&öm�EbøîAN2qð¯fÙ]—„ bÁÞUA#­ˆs¿ žÔ¡Œ9.ä3ˆO³—åÇëñï´läºi:P Ø7æ°6-?7tPæÃª)!îrfÓB¦‘›Á Þ'À\m‡Äñ`�ç�ð/Ë7%8›Øž¡âŠA”›%ëðq•!Õ¶­«xlb‡‹¢ï‚‚"�âI…$kÐÙýÛw7zÚn*ÐZ(¹CìNÃ…cý?kïó ¼ÁôBVî®;Kš õ,ˆÝ;¥†Ã9ñê ÕP×*‘¿JX†Û@´Ž¥–Y’õ§ðqqg{"efÕ+vÞîß1geT÷¶�˜�ÅÙXDØnõ´# ,Ü'·à!~Î;»C=‚ã ­êt3ÕV\lNG‹°D¾ £ºàj{ô,ïËž°»v"€#‰ ïÅc«’YU–®Ý1.2sVbÒå÷²œfŸ/66K�)k w ù¸ZÛŽ h n&ÚY€‹Úd‚7!ø�ÿ…tbtàà!š=~æ•W#­ðìäºbz|³¦' GѰŸ[­Í!òDVس Àzƒ§+;`ï~&ò k�Ãwà‰˜-d0¾ŸÚ\öÝEÂ2À«s]È®Vy³ »*¦ °Ã(†Îw5+ßØçæºZê Ÿ†¢]Ž ´îФ&ì¯Ö¾¶ '1Mè‰ü7óªÝ:=A@â ã¨dA7Mïï´Án&Ñ´K#@ÔF™è0ÅFÚ¸tÐɋޗN2Á_¡ÔKÍÞÃóI°%'¿7ÓÝ¢3â0ED?ƒæùw×ùw«×ˆ‹¤ Þù:1`ÎA;Ô……û{¯ØADÌs¿PBíÚv»X=i²Ýk…|W•ڬ_‘™Nà2¨‹‹ù/8àRbé _8Ô‰{i怀«¡Zž#žÀNUO-qóžDCµqBA}^®û�¬…5•ùs�R�…z™Ž>ã ‚Wi÷Ûº �Û&DX¥™ˆ¬F[i ûLc¾·ÅÛdW;™­Ñ‚ îµ±Õ?À-Kb�'Îø‘ùË8}~à®_½²Ý?\cä­ü¹ Š˜áÙ%ÂeòaO–nœ@'Án™D¿Áö ]IžçÙìHc—„ûàªíþëßÜÌ[˜?gŸËû €çƒµ÷ßIyNɪ}”Æ4?¯,]³YÔ/òF_s}!Z“§S�KþñþÎEàn¶ãD (YSÌj{™<^~»ñˆ? ¤c‚�S–øò9û±ë@ü«85„Š­F–ƒ+FEJAQò%¢þ_„ @b–Îc#K çÞÅTÀ/QÌÙSâåé<=M{$RùbrŸyºmOR'NÏ4€9fý§‘½#ëÏT ©R­LÁ,Á{ˆË¬ÔÉXÛ¬ Ã­=�]Ë c½Êe6Øbåë_ 4¥��“§F­Vèî8æ{p�Áƒ)k‰*’6½›~8Õ5W@ú üÌh>âç¨Q–èZˆåoÑÑõ{-q‚ÕvL=±Ù�%úä§"ÂÝgE™=ÇÓ*�q�|ÔÁ)�üɽÉj0AÜ>1è·®AëÝi„z(#ùy(Ǫ*`ÈgG•uµò(V;Ö×�Ž[Ût,h[ÍÀBϴꯇ€›ò<ª ÞQÆÛ‹n©“˜�/Ï�Öé)âÆÖÛ É%0Ÿfu�neì™`l½æ‹Á}Þé†fŠÀäY=o™ëÐ(Ó{žêí‘ îy!ûg'»×/»ÜÉ5¿Õ|Ø�뜀[÷; 1Ýl ½Üa¾‡‹ßωÀ_ UÚNîܰħ¯nÒnáÀƒ jI’Dă'%:( 㘻$WuaÉHµv¯ùoÝï]2®Ó~ùOHj� ÑB_Üî«û§àrûšN�;Þ��“c+ÅLRåºS„Uªa^_ŸÄo†_¹÷`¾NÏs—7¸˜œÀåùqó!û«]·p!4;óíÏÀ#ê`°õɰ…Å‘ÞìïrñÖvŸTÂÙO~eòQ±‡ì,qÈìA³ßWy(‚{f²ìuõâB:æM�»£É|Ø©‚°BÄf€ø™æ."ûWÈ)‚`|[æû¹5Êæ�=>Ö<ê¶ÌÝ•…ÍÚƒX`Õ`’ 2ok±úÕ¬¸IXZqRßx¿º²Ú·NÑ�Õ²õϺØQ+âHñÍ[*ì!V5?”[8çšï ²ƒºðpÊ ï»®„[øähT¹Þ ã©>å,Re¼û¼Qd2šîô_/)€Áðk@�ÛƒóB#�S·Ê�¬g¿{~ Í;Ð6o¸h<±pTý8çëÎ3(Hà@µb8¯xêk+y=m Íÿ&¢�kɧkM6ÉÆs£7âùí,ÜT!„3dÈ ‹Í¿p�=ù5ëGï"¤qp– — îªü›z`à6¥°ÇÃ|HF!ç°²13ªýòB›>u\?ŠóCã‚äã˜7µ€tzušªTO°Ð�7n 6/E¸m†9t<ÑAQšTg%¸²US ˆ¼˜À�‡>•®2¾×}B÷L¯æUG{k:ó¢HLfBƒ‰ptò§ëcêÁ¹)Å[U„Ð0ŽŠ:s‰±¨àoHòȃ™t1¥ì,X±mXf¬hå•K*MÄøõ¤`{þôãÌú#µÍêFã«&s¡×¹§Ë 68_Ie¸…‚½íÂg PŸüÜEÎPP]”®µˆËû�"ù±�þW9$ž1ôžÄ”(댨P½c{ÃÙ fõö6 SÕNñÀ¿ŠÁTßËzãý™ÇÚ Xïp‰‹’(u1W?ãCÉã" P€ò¿z¼à\ #¹tLm!Gñ„(¦n�Øq ­OY@™^ó&ÙCëÆÓüAHŸ&[j 6?[Í1Žƒ0Niï»<<#>G狇h/íd.”3�µœ"{I·Ô �ßJø´D%Ï$ÈX¢É�طĶîWd5?ï*xÓ´¼L¾xbº¶rÀ@pÊ Ö*F1¯®Áécî¾�Æ(Rè=Öq/!Ú`~„$U�ÛïF¦ÖòÍìo€Ösô!í ýŸÛŽXjœw曳ÒÎn±ž~ÛÄ"«Šò° ›®Šs¡ŠJžu&åù€–[è_™Å«šá‚Á¶¤Ñ°6$In=�D3³�Ù²øäôpï\�mÜ‚ö@ùQfÎ Ý+"Ý´»Ë¾êöBnf/x¸XÂ-³ã¤o4w¹<9_r¬µ™nQ±;›š‰¥„3ŽX$êÚÖ]�$Ù1†Ü{„½kŠvÞ0%ó–Õ|?Œ=¼WH¸¾vî~¦åæ4WRØ_Š\é')/ØÇÇ�5xpaëjÜHÇZ‰-ûbÜ/Þpœu³$XÖMìd¨uïv=l�j»¯Â­bŒ,ۙܮê›9K°Íe…¤ Foø"†ý°ý?ßɨi+}Ð〥üû®Üûä–µT,ß™Š-f4Ø?Ùº‡2FŒËËz�,S˜E¶AÉ¡ïÔÉ©æ4[¸‹Î«F—BîïImw*Þu^ëxY†6naÚŒnÍý�.àë p æiü07â$V<·î%ž­˜Ë „§5H¦`jL½À¹ýK z ¶)ŸÊV|…•²ç8x0Ž�}|ß2Åáž}ÝwÕ@ÊCð´×&Ûŧû$ŸÈ€#Ý–ª”|Qq¤ODdƒ°Æ?%ýŽƒñL»NÞQï@çûn¬'³ Å�3@Ø.šò/%¦åéÂ3¢‹Ënî'¯®ñb_ÅsC°¯I0§`Ú¼%±J%‘¾µÖŠ¿%?'Ḷ4|4gvkkæ‘`,¯Ó’mÅŽÞÄߌl¼nŸÙO«g×›éÍ¿»¶.ktŪ"€ç Uñ~èÃAß+c°{©(ø@óÏs¥\Ôè ב܃5“á8[jâÅcÔ°=å¬%�C¶»m³$È[ÖU›c™¿‚üv¼ÝŽø"Á>ª9VQë„¥£5žýµ~AêëÌymyÕe°ÝÀU>Þ»ÆkÑæ@× |~Q¥ âB~RÎî÷ºûëuy=‡M~}Ã]~Êkǽ@‡î±þ7£Î:ºæ ŠÇï:>ÐêÝyW 0ùUv§�N&oSÑ3¡Uê–†5Ò—;QÍ76ìÛ´iÌ�Â,¯dY¾^ṳ̀Ç/@!Ü*6 o`ͱÖjž9xz´X¢^ ÖB-דɴ1æ@¶"ÁB%ÈóÌøÞùúÌ�çYë>$�mIüσ_ß\> c^ðzä£~løíh™åœqÞê Dþbœ±#ÜŒFñõo`ž ~K÷hð #שÕÄ«ÃáË.Û»Kz9¼ï_vÕðF$”±P�~7ŽÀx§µbàWêp‡¡Á¶:Z(Uïo¨Ëóµ“2ì�éÔ«Ÿ0kï&§D_?€uñÃóŒ�cü}k÷§V†Û[Oní|.ÚÜ1ß=)‚¬ÛB¿ªl_ááȲõóëê*à^´Ú™v!ü �@9�©EŸL¨‚ÆOoɪÇ3øL?<·Q©°ÝâhÛ�ågúðÚ£óΛu“·ìã ¨4É40�·ÃÜÜ<øƒ`úÖiýáz“ékP:}Ö‘`%ÔYKGR:—šÈ¨�³Òµ„¢¸zèyC?cÏïªÿˆ…7¸=sÎ÷ÑbHá#çLº3"ë©5}�õBû gcaAkPÿs=‚”à+ÅÁEÇ ½ÖÎÛ €ôÊoZ>©D§?­Í b'êÛ§‡ 2—|S¬m’\;´×i´€=kzèéÄìöT6qÚÍ…’м㳈×!$ñÍ+FD@¢Œ��2×d‹fXÏöG~Om6ÐBTSE˜âcÿÂn1$Á`êÚðhÏ5îkôƒ•È~‚û%½©8�÷¤5zšÿ_؆¡@Å2\/†Ú仪$I›ŽÄ?Єÿbño󑈎."Û´a-°é€Ž³«u“(øÖÍÒ�O¢³nä­»ýsÁê£íø.T—*÷2‹¸hA™òîå=ÙªÚ=ø4Ç0!È› ˆØ¡˜ì‡ŸÞ»õkûƒãÅñ›1áYSP\#è�ãÌÂùõÁLµÊ†­„¹$l,Šæ<Öc²=�ÆÑ]ÀìÓ<]賚ˆ¿Ç—Äœ—ÞôsdâD-ï‡Çu²eoÉ~ßa�ð%›—f=NmˆwAÖöPKa ž² ÖœÛdûÉA³a/lå“ ùX[E4oÅu±Ä žÓÓⲇ[ªEÛc¼pµxvt™UyèêÈÄÌò(¦Œ!qÅlÝq›(öÏ-•ήvW9@˜�d’á±/ Ç31‘„ŽO*·øð‹zÊ`ïÇÑY§yÀF¯˜t ¨íM3®M»±Ò«oÛýÈÄõ³#øÆÉƒµ�¬}´d³½,é1è¬.? JÀ ?©šÍÁ€ž×ÍU0*µæõóUL2!‚1/Á�±ƒ¢Äh~©¼jçuµÁ"C Rqï¤ù¶ûòµß„odš‚Ãk=²d¶rÀ|àu¹¸”G»5-V ¾è´º�ÑÁ]3ëõ¾Qy‡}–F™0|èh‰8Äáð®)xUÌ™ž`óšÜÎDpÃo(Y—%òe4or)F�è¡Æq}}kNðô*Ì `lܦ'¤r&ˆ:®ÐRÇ"òêbC‰õðžß¤;‹üëú‹õtu «ë}FR²±š±ê¤wvª ô$Yn7ÚpˆœÆövB\áXÈʹ4¥Q�³|³—hû†â‚•(ðw‹ÝyW”‚) ië ú±æ¾‡”¨FÈ´jÛ­òŽºŒ·ÕYfû}Ò�Œ¥Ó¯¼ ðx$½Ãí“ÖúO:6팶È3…Êâ%ïQ® c¢¸PºF,¼ôÂ$MB~ë›ÑJ8Ø7ÒÁÙâL[Ô�AÃi6äzoM›KÀ¨\[Ùä'\ß«J0$$ƒcxKk¨¥nU¶L¶.H†ÀsZ6 qºkÜoœgR;ýÅí7FükkÍ!îo™x�F,ý]Pc§ƒµïwĹæœî2Õ:÷³žfàݳï,Ž¥[K ëtõs<¨Ó[¼Cùx*:íNvV²æ×K %NÒrØàK<õàA«zeýÌ3|l|¸ )àz½ Âò¸ûH•ä"£T g‡jT%l×èÆL{öé3 ‚à ´» ±Ü¶ Í/ |ÚáJ=䓯³½_¢›aRèvU°D#ûrøwΘžëðµÅYØú•sȧd.À�Å—L*(Ùl*\÷ïÉ~–@L_ÐD‰BŠ â»_ ý@>†³»®vâÒ4¾Ü�¼„�b«\³nä¹È4#Y 6¯âCÅ”áJÛÜ!­ ³YÓîO‡¢ÏyË„.¿·‚nåÇS»la#¢‡cǯ»R7äz”v0ì¾ù4s¾.7yrrk.­nEV¡PC²Ã$®.ivi×Ùå·/±‡fžÖ_GAK׉‹óE—û±®0÷4qª²ŠHÙ�0ª¹æ·r c5ÌÙ�»u åØk'%l¬UÖð l·¼¨³k«:ê«÷ãæqf~¾EÑu†­+Ð}3E¤ £Â‚?@ÝÅ~DC%ÑfKr¸g÷Ü®í!À†æý]`µ)ƒ´fÁ�hµP¦ ­iuµ¯Ì7ȶi·sT•ð|ÒÖÝúë8ò¸°õ€7p¡)?ovozN>”xÄG÷ ˆG.ópùÊÇ¢ýµ¦«µ‰•y:}sßy³ Xš¾ð-ûŽÞ»DßVÀ�53Z<_¿ ·Ò�|ÜDz¬ºY $<Œ~onଠf"ð·9åï �P í½÷aü˜>4g‡`‹ý�B)QWNùÚw’ö®Ãß]ÊýzÕ-5£}À*�a 3Aëàn˜ ´eûR½ ™}=Q\lIe+&Ù,e3Mò=ù%L9*Ò&nÔ“¹Ïd |“|w$¿ÖÌñ—�aø°k(Ap¬›&ƒdŒ> °|ŒìyåóRdÛ^<+NÑ }nNõ÷™¶©Íâ‰Ccs,ƒ!÷WƒaÛS¿sžã‚V‰§=y˹Ö† �lz\TGÄÈmui\u±´�y)x·'#0Zª½“â‡/ Ä’,±8ò£ïÀÖõ9|6€%¼uƒ ÷˯'š[ia›_¦€K¸Ù½…é_4 ä1�htɬ¨«NôVÑ®êvø™$(C4öt—„3Y;¯Öà’/“Ý÷ïÁûó3ј`5<3×VÓ«F?·xy¿CY„E«¨Ÿõº·%NÔ«¾{�ßÞHg< spî;Ê S¥}Y΂/øÕÇA”°Zè\g£åÚhàGà�Ò]¼È; £Ý2Ë'ÃÕAÃ`‡7Èy�^ñað$ÑÑTŒ¢íŸ© Ýá8°öý£â[kB7ɽ‰e Ã^¬x°Új‹Ýâ •¦åoÃÏ{ÊREÍ@½%àWÒ<ÖÒØ�p:Üç!—‘¾®ÚïtÎc|PµåW3žäDCî3&6Ÿ3<|«^Šî­ã0 ‰{øï_ðÌiâ·Ð¯>‹‰ïÖqæq à”‚/&ÃÁk1ûFšÈ Ú}õãXou\3ÍŒÃîså7÷ Ôã¼áf÷wüB·õÙ­C_Lq°|/ó�—æ¬CQ!môÒ8m�ûÒðŸžGÀadj¶bH9|v®·'N— ‘@ê‡1v{—14)×i›tm±S –ØNU5òp[ê\†»E ‹è,aôĉÓ*ãØŠþ~Y�{Ž$Þs ¨!öüU:k§‹º“3nùƒ7_†r̼�¾ãPF¹oÉh=?bÚÌ05š{Ê5Ï¿bŠB Yp"Bºå»;±õðÉW•ï‚Ým-N>KüÆK‚û Š¢Ö›7`¯Y·Zà=z0aj0µÕ~ñ;�žææ8sTóÙ"Š’ô³«@j"0P‰Cb·ï=,Þù>2•ê‡dêã‡ü€ ¤ãµ{ÞGÁûð~ýéOë‰Dë šñÆ£Yç*1�ô…öã?ææ63àÄaÐ2I7N¦­ñMù=¿Å¸‹!ì›×Ô΂4Á/ß¿~ýø6¦œÔ/o4Š´aú`d4û LKaûÁ´¹ˆ; ²ö˾Z©îÆ}˜LPK/\ÇìfÊFcÉûså¦`Ÿºï±ÏîØ¹Ž¿ÏÑAúR~†§Ü�‹æ“[¬¸#>_×82 Åo ‡"¡¿n„25Ò×íËIÞ³N6Ãñcb¦x%€?„'Y-î¼·æßi7…¶ÑÌH‹ˆì^ÍMúDÂÔó!÷¬H~Œeþ|v-µœZ˶�ŒÝ'â5ã}õ®�=û–`ã�|ê»`hºqËÆóíq¯—;E"9VcÀê=ÃÔ`g�Ö®Óûi_ˆ²p¹fgª‹òÚU¸@O)¯ð*çò—]®€ÛÒdœgB)~ÚÆßtNÄZ6»ásò'o¦ÙÖÁ.îô“®U¹²ø¹}}õ›<bˆ·R[È×aJQ—ŒÄPßXNSëfD(öæ/fpCl«PÙçc— χ˜Ü[}öØsÙ.‰2­šZÅ–Õn†;jõîtù­æi¯`ÒÍúò¹ÏÜYáA¸ÆH>§î�±tPªÛÏÓ8úýAä°îl?-žfÖû§³QŽ}éŒ÷ºÇBBAo¹vç¹v î÷$á8ÌKU�ºýª½¯wë…ä±u±ÝÔÐ2{"þÍ||<ÏÆjŒ`]XÝ@g@‹c;l�'Žã|(nΜx›µZé¾?ØŽspùû8&š&ÀBô—bÝ/¾�YŸ|ÀX-2g‘ä4â#ñ"{¶PYX¿ºcÙ}äpÓ‚ׂ̎ºÀÂ3·rŸkWܬ|.$ÓÚûÃ50^º.øÇ1õÌ!ÆŒHöƒ‘°¶^¡�—Ž«B³V« IYóy^¥r¶¬7Z£_÷mU¿Ëý_Çû¿·øÿ•mµUÿ¾Õ›Vš«RÚÕ¶kZÍ«*¥¶m«im¶Ù­jmZ­šÛZ[[f¶Ù¶©ªÖš¶Ò«Z´¶µšµš˜333™c£Òw×ßSÕ¿¢ôþØõe;®³X˜Z¿Œÿbrøÿ+Mýn}j2Å $HTŸ¼yæ>®h²¿Òa&úaqÃêÈófe-⮡H¦’* u‚xg;[Þûpø÷�>êܬ賀îzÈä:ù¦Ží�õ¬¹$ýà®� rx {nÍŒ—]s¦×»?nÿT?¾BVßÜW!Q£ h5¬YñøL<€åm>ði•?-AHƒ�Z²¼Š#�¹lª”,,~0 Ãûµ×�ŽqœÊ‡ ¨­1Cg öÍú]Ž}�²Q ½� ò_Ö ô¿e;ÅL½øQ|][�Ð[Ú8è)6[Ú²ï Ï~IÇWˆ!ðå?eÈÀKwK�ïNMañª¡Ú­oéʰ=‹r�·Ë³£·ž±¥ZÑaÎjÂáÃ`ªé:˜µñ1íVÆm^åÁƒá<)ò Ò�fÁ)HçCZ¦ç³êã]ö H³_òêØ…m½œ†rNHÉÎë�Ô’·ê;Æ´ïë¢oO¤¾º£ØÔ|†—€;lÞëðö¡'<ÇßýˆS?F.øÎïÅs G}‹±ZØøjS%¶¹å-š·ï=YI¶@øþW™çq¿/{œÌCv𦆻Uîx$¥®¡€æÀõ7R Üer¶&[«ð ß°¸õޝLðÈXÆwÞëO°¦WÙŒ§½R´¼?Ýîøx�êØ@Š#jìy}lì„Ãt@¸Ùx.è¾��Lœs8Ý‘JÌßïõª¦‰wk/™[ÂV¡‚×+³¼>¤î¶Úvýø.ÖÏb hÑ·2ö}v–§àùí�Î# /{~='ȦÀº¬1ž(ý£ê‘XÈ9χ[ŸØ¼ºˆ bñׯòh¼NÉi ×™�p|íô.;ØùþM"~ËŸ×|\å‰Üçk¤`äµÃíùíóÆ<@».1‡Õ¬)) <é—4 `ɼ"¾àV’ÎE¡Åµ¥­aÜKa›L p0‹†ã¥m^êPÛû&?·ƒq‘�| \àXý‡G 0£óahÀ†³ŽD…ø“oƒ·:pÖ`³€áÕfàã‚ÎÌ&u�Ù.Æ2‰[YÐmímKò(�òÖq$8-9_1M²V¸s,ÑÖGR•VAó™´ZG¶‡ ¸Jž4P|,ãA‡] `qŒö£Äá0_=¶\®ÜÒðAGRûŽ.aŽÕIžnÀ”¤ØÍ¼]j¡[Íú&¼ºÇ/ÇÐBeù‹jõÁU[]€i;Å¿Rß5å:H?�‡;é«yÔ9vÈ0’€í}åðñ`eM¥ÞÎæ›ÍêÚ»òÒ–P$t(W«(å렒Ćkz¯·°;i9Òwsð†šè¡6ŠtŽì •5øþÆÇ±jèí «ØÂ¯á\ÉvÊ ‹Øv>lÀh= û³öxLÃü`m`,­£nÓ†,hûU¢[‡“h”#`L~½\×îkÌÖ�Sð—CòÛ! ±mýŽ@¦Á¥® �ÌßC¤öž24-t[^�‰É¶I–ÈG}«(Ë};CÚ 1†‹eÀ°™V�­<_…âÄ:Ù¹†Mìwa†�­HÄ�¢’ Ó".‚ÓΠ! *Íw¸LØ6´Ï]TÛ\³‚�ƒûGZÝØ›8P ¸#±úo1Þö;™-�Ü�2•Ú5²áÐFíG–v[Ò…œî ‹l}·äeÚÐA›sOËY_¸6=6þt«ù9jòT.ÙƒJXõ8b1�Xí?‘Hõ(iRX‘e¹.Ç3–8#«5›v˜úÿr„‚ã÷̳œm>õÕk`jš¶k/ƒvÆR#ç+1[˜‡5û`¶â h"––Өݦ'µƒ/ÚüÐK{Ô3\´¼±ójÂl‚²H̹rRlTÝ©C‹bí@´PW‰Ð˜'à=MÓ•ëkTMi {¿v{½u—}£l”ଠ¡¾ 7‘öé4jö!;k „öÂ’VXo`ÖÕÎôÁªö¡“#”þd}æ“{ÌžŒ áÌ$p¥-¦�næãeÆ8iŠ{�îèÕ‹Ü»<õ�›Ðv³¿ì{=ð]SLø4 'Ê÷áI®BMöñ J/3O^\ΜŠÁ�w%‰b_™¼Š°˜iõÚ Pý�.­µtÓf²Þo §i”]œîã Ågˤ$ê/´°ºaÆpx.àä³”Oˆª&Âa A²™êK‹ØKÑ9Ó©·R$%u»Ëøûk?§Sö4µ�§iyˆ¨½ï´~Ö]â)õ·Õ¾3¼ÞnhlXAHó€c80ЇR|ìIXZDÉ‹°€·´¿7Ú£ÅN$pÄÎ &“äÌ�m´—;(£t¸!¸ݼÉÛíÄoXQ1XRæ/¼x¹S<Õœ#­¬Êû}‚¯ŸD‰&yº$®ëºÿRl¥-¼ñ›PŒ È"s&†ÜAJ¢< ë1qÏ´(NÆžèï^~o|¶4îñbÓ¬Áž“[Ôo0¶=«)ÜO|>Ã[q€ÇÎEb¿0 ÖDà³�®²dšËÚÄ@ã�¥éÕî™Fîú—á�„8Ûo–Dã^Ö<@\ùØß³ŸÛ>“y÷*¬�ùo”¢Í~†40¸„׃ƒ¶àa FäE–½p¯õŸ‘߉1²Þ~êd«Ö}Óû°‡Pm”YRùmÅ?ÊàðT–:½_K1lÞ�.¶[a“+�u§©?»Ã¹²Ü)Ý!Ú«TÊÊê^°¸Û­´Tkn¨… M~«á®meê 'tÚ,öÕ¼¶ î—ààF–¸œ ðµg¯X}ãHb/p-±Ls[�ÛÈsØ­õ.®{?mw¼9o084Ü6Ÿ[Ȇ+HDŸÂ2ïío�8xŒ°/kçÇcËCï IN—½ë“ŸÃÙåGìz8tcÝÝ@`[\,ô\4ŽD‰U7ÚdÚlÁœEÔ«B…‹å•d�ÛM2]¯r±Õö »Ø³:Û8œŸ{ÜSƒ÷bu ‹�ä‚îûln`ïnÛ£:\(o¿p"Øò\«ÏÊm—|ÐÖ{2MÞädvã³¼NG¥kx¯ÚÚÚ¬F^M´Õ±cèþ_»Ì¯v.’Mw6uìÅ�ŒâÌ�½-…\»Ë»+�eå:*ò¹µÛpZÐclRÂlI½ÎYšëÓ‹šO«¥~J¾¸ùÃrQ6®¡ 7PSR*¹t·+ŽÏDF¶w»ÖŽPir§k- íc«=ni°ÀmÖ;·O"¥KÏ6:eå1±ë.—¹-Ð\¯<-æy—*:‘Sç WzÄ8m6� µ‹&ñËbúTOES1AIô¯Y¥‘‹PL‘ˆàtjw¹oB-œ¬¸3”7ªØXV$FٹÓ½ ¢ø‚±vöX0ü£ è5‰½[Ë¨ÕæòàpÈ®k�Nšëê(|Yo)~â›JÉ~L3…°rEd�j|Ò-Ô«¿¿îàýø`{Û·[\x´½vTG=U¼jk:´�r|›ìÎé2k}C&¯míŸAö†…ÓaE}ò6x’MlÔnC|Òº�^£YsMä O¿m­ø/²ï—´÷Û)í¬üWŠéÀ†´†8Ûm)iÐÎW/ÏÝmß·°ó;ƒŽ®¬'RPCtµõÉí/Õ ¾ x!|Ùf˜>ŸÆ�x"Ä,�º¦|L Ãa“ëa.åÒÓóæIÔ(=ç˜Å±±Ê ‡Ú¹»Ð"�2\K¨¶pº?&D4æ*¿m¢ÊNyBUß9¾«[ôñE €S8Äñ‹y¾x�a:Øc#k8ehT›•·˜ÙZ°(8¹>)n EW¼r]BÄf·üæôÒk(QØÂîwo9=Ÿ(Ú» =q/ T¯TĆ{©öÝј¾4—̾¬:ó–ÞßÑ #5›³Ô÷±â~M‰q Œô½öwÊ·À'ûûúyØÈ¨øóæ 7—0 ‰k-c ÍZ…?>uP¸�Bß,ûW¦% æÎÛ‰Lœ´Ad±2‹UŸ<¶C¼1ÙðÍïžpZ*v߃ð$ê�¤ rêO»�0�Î^üáþÑ0èck„ Ï2_1âŠÂßN �¶×ôIÍ©|ýfgà æêî²&ÆJ°]~ù„·×¶òýP/bÖù2y^s®ÙŠQ[J:­{~ÔÐ�<)ÞµSe "ÓÎtØCïØŽà9`ï6k¶Tš,/a¶׎ö[�L1Ѱ™-$ñ�8"}Zë·›é4ÁËͲõ^Q&·T˯žømrÇq‹JΧ¯‚»‡FŒ~]ãáXãñt†Ew8§,ÌÌ^¬yzŸ…ÿ�kÝ÷Tðâù+ô `ǯa«ÖTäþ—žE—K ŽKJƒ¤êêê�ã)QÁX#NYÌX竸ð¼ Íœu›5оg9=íR¬n áL)ž’6õÒÑݽ•ÝÙˇû½-®w¢‰5ƒ‡Xé1’>Ýô‰‹íÇ~2XàF‡þ‚GIOk ÿ%!º—øP7wL�ÿgK;ÅI¼¿ÍŒ.ßÖÁò7ò¨  m�ïµk>“RL äz‘RýjÑÌ'Iù÷åÖ¼ožñîRÎ<šäÐ¥„06¸±nÇ�AÊy#ŽÞ��Ç�³•¤ÐlCxÄi>ÍÄ�ùÝ•WWÃÌß[ö‘ �z[¾"BÆÐ¶4ñy ] 06[ :Ì?f¦¯Ç‚èŠ60Š_˜W¹|T·3|¦¯ÃÑ7)àï½þ@Z§Ñ�HfÃ8ë\ûùG£leZ°ñ’á©ÉvŸ»]ˆÕ5B7Ø[g¤üµåCÂ÷0ž 4åŸPº`Ê®IáêSh;Ó'JûX·×|Ïrÿsç]Î(±ìY¹´ v"ÍtnîåP ¤¢Ê‡uhî¸t¬(,¡úáè~¯`1ÞfÄëŠæâÖÝýuÙa°l᫩䮉k6Gó]›7`¬ä;‚�q@�yÂ9 ­k•o<Ä;ä2RÁ›jÊ'\>ä¬`ŒÚÚâŠÅ³Ý1 }mføÚpÕüá|ö�Hô§\YöâAÖì6Ü)ÙM_&hjŽöý€ÔZ—ž¤·)Zx-ä�ÌnJÊoÜî+Óž;Òãíáx-¡öœ&Æñu=Z�îÿA³´mÞÎ8Ý�â¬@ÿ¾åt/\ÆíŠ6—ÁY9Ð1Ï<sÞº-ìçÇó…0çQ/hº &ògÄœÀ… mÑäQlÅ™_¿N¿dÅΣRÇýóp®äȇj0¸MÑj¨ø›V6ñC å´º+6®¼ë¸4"râ×Ò. §… f”+Ì ,0Yx2’q€'åCà»�{ƒ�å‹ÐC�F…ù§g8ˆÉ׊“¸ÝÛQ<°sM©vÃ�§‡Û=²ªµ½o_Íì}�Âû; å0Žp·¤˜«Z|¾)žK!\Õ6(Ý£k»øî ©Ç¡+L1Ó0PgÔ «ÖÕŸk8Î`ñ­ µ âýî÷¡îÆôA­ Ç ~¬´0Lþ‹lî×ä-úñX¶kX@‹ÖAD®bË0ñLÒ…€n$ÃOnŽípªL�Lì Üì 2™ôñt_%{€z;–¾Æî¯B£Aë Ï>ŽÜÚÛel÷1j€äsxר µ^Õ๥ :îbl$ñ Ôþt0ÌnŸ¼½œ2 6uxÚ;2±$îmÉꟚò¨‹ÞÝ 7õµŸ¤/Jýçà“±5{nÈ;ˆ›ê¢ `AF8jÍß· ÂkZïWj �—É¡Ÿu­ØÁJ�Ø@rªÎf—àB0ÞQÖÃqTñoÒ›Á ¥[NëZÅrùIa‚dÕ±MWýø?~ÀÍ…^ÓM±#iþŒ½äÏaœð0e™0¶ÂnD¢aÍ¿ørÈKÄ¥d(—ˆ2Ni;VfÉÝÚtZÚÕ:ý€6vû¶)ëˆDX.YXrøtWí9,ö7Ç“g¨…0â‹N gæƒ�±àÖ3‹7¤/ÖÞªÊiI¯0ÖvøÞ$·­Jb«Â³H”„ND"ÜÉåùȵi‡déº[eãÍååÀÁ½ –Ûúû¾“)¦FáE¼È }+Ôï™YpͦrnÓ�p <+S,��• Ë€Q›”‡Ô¡÷ª«8ÄÎðe$ŠÞ²pšà¶¹UyÁþÉîCG®\X.¥�½Š¯ [©Ëúæã\Æ;@±nEÖ_fMÛIƒâÛ-©h­\*ÓÙÊâNêßî1ñqòDl0�øoQc”d žty¿Çt¸ ߸·~¨šÙÐÀÕì äÕÚ‡ÈæÅaÀ=–¸ßq4‰ÀËVºõ™{ÏšfåQܹ“ãó‹>@"³n¹QÈhwZõæáƒåÒö¶SgÕð !zñëmàÕ‹]@ÚVÒ4±ÙÛ­Q¯ »¦Aüi žÜ9c0È “©eh²¯zÊ[é`jÞHlÌ«‹ œ~ŽW ú•Þ¿>€ºÒ 2}Kºpm f˜m¼º˜jW×”²þõÑÓµ–Õ3þ¶‰#:ùAÃ'_�D¦¾‹1î@¨�œpCì ‡fóž‘|�m6�}¼ªécç¶¾ñTé­9UØ[Ú¨y ôcavènØÑ½DmÖ^§Ö„ ‹Xç·÷s­[Hª)Üx® …â±à*^b¾Ù)›²‹Re°§ÁhåíYÅ*9ʵÃmW] X •h̼tƒ{ØJº cÕØzáÄ9)°¶Êt[ñc–¦‹6C"xÁ˜W™4µ&'ºæéÑ�O!¡µØžõ¤7ÈÎËAäõèùÍ&Çzý̳þPÔ³þZ9Ò–­á�Šº¯9í•Û^~Æ ßZÉ2.úCÞ<ìøŸŸ�¥k)~ØžüzÚ°…oK ú÷†E,Dq.ìÖóˆËÅø2„#“++W*OmdÕÿ/Æ€ �0G‘Ï"‹8Zç‹ÞnO ·«ŒSÙÝûÒà2V±aו´�=¼@…�®»ô£›qòáSe¥¼vØrû2ü¤=Ý~GËÚ1–õ$d¡ Ëa{@<ËÐöUbxãÍ” ºP LÛÃëb ‡Òc”«ƒ¢ ±£eÝækšZ)æxŒàÀ�N–qPͯ¼j'}zï3®¬Ç]í<‘0°|}Û{yM=Ô¸ž¿Q-í˜F>ÅN#WÁ&aº;�´g@»õAù°šø.dn`wôž¨«µFNEÕuXÄ¿`î"8¾§¼ïåç:nm Tj¹3ò»Û±�+¸:ð{®œjÑ•½4Ú�±Áü6Á™¿à°“9ÒÎl Æmž‘ï¹ñ۳ج²Åï«�Á]ùþK�_èØ ß?‡ž³‹¿¦û±ä—)¸wÂ�}vÆ>WçHv!íÈÏ}m=ú6 >¯Oõ4h'æ{™ ÅYG¬Kq…e"÷.]è[ùRˆ¬îBRÌ/LðI«˜Ð!QdîªÒ`šûu’Í•,Y›?·|^JB"!mÞ3F A5‹~ZÝk8„¸É\žÚ›Ç抨¸Üã_å¿M~íÁ§q)÷KÜ$Áˆƒ‹«¬k¢™ f¥ðs[ôCkuŒ�ï�Éq žOÑS²Ç¯Zó{B�„[m«ù:W ü£Z_¬Ã2¦óÁׅЀGÛ¨ËYLÙûÄ2" ÖÄiÂÒœÖì¥zøû{¦F_“½hà8‰ß˜O�ãž[æƒÖò^Ð5Æê}ÄKŽÎpmÇUÞ/~z/¦ÅmC$” ÝÌ”aõ#,u>Ñj&²]˜ÈZhEêÚ8Ü]®ùŒ�IøÚÍ`U·±•ß#‘u«…q,’ä€(æ"‰Äø²:TW¶ˆ6º;¸^—Xðñ´¹|îß@[H¡VãQ€Ebßs²VHÝ#,Š@¯óÒ¦·;­k*¿R}·6\!õTµãzÉÏ¡¦Kl?�ŸÜ(Ö¿sÊ(/ýÔÂØ>öúkgqh�O?•ñø¸,[×Ïöo°”óµ>$ª*ÍiX±Ýâü˜ ʵà“S’h=ÑŽ0ü‰þÒaÎs�x0ar«ßCqÌq ဘ’mbžþÖ£‡(…ü�wÏŸVÓGHA�ìïx‡—�:­Êã�†:¬ c´‹¼i=nBÆÐ°PÏô×am}�Zâ¢�­+Œ†d/ÌZ¥îƒµ,åþŠ»ï‡]�ÑX3ûÎÞqí±¥MZs_æ)IÚ>wÒPwÏ̸î†ÇïWìVS³>¦ÚJú§ºÇI­S�÷Ý…bñH©�ؾigËÛ2ß_j‡Ðа ¨ ˜y¼ÆÒŸM|[ó¾ŽN¥uT:§ô¬OÖ5° 0]ud÷JÝ úÑ>"y(GÀ;¹.O@ºÅ”¹ZÄ=¼­±x¬ôywË/Ý éè¼%À Nî–\%¬ªõ”²\éèAZQEŠ 7óœoEôÜ÷àÒr‚4�™|ûQsœ|-F@-jÁVë�ØÞì 3bHßm $DÞ‚®w¤ÃÊDþitª_+Y¨¦wü¶"fAC•÷í7$5Gl¾7¸¬å[Zb©rÎOQÃÀ5^]70�çÛëÔë]ºTý€¶ žö= cÑeznýtDP§½ÀÒJP[Öº0Èd-P{º­)f,»{À5÷æ¹ðU¥´-ŽH?Ûï-ûg5*ƒ<•'ô[ñÅ4�bî]M…Ÿ­ŽUÆÌH5ÜÈó@ç�úЯñÎµÂØ¿%—�ªu¬é7qAârú´(iº ËbùmžIp_.Ûbš`êéœï“í�SXÁ]‚ò á­(«5w�²mm¶ÜJrŒ;¯ÓÛS[œ“¼–Ãa¦µTÜX¾a2埰\¡ì`5‡uâ­!0L "1èSî\³-Ik~°ìÆÇg×çazîE„CòúªÑZVúÉ=$éð+•$»Râ™Y¿t̽ láo^Ù5Y}ÛzÚD<þtÃbÕ”¢©é½�%0<¬t;°¸t_iª¾´NØÊ¸UÓÔà8'ÆüÈùRäk|Þ!-Ð]ô^×�~e"‹†›yÙë~>h7“eÆé#3WŒ>LÓ Co·ËÃ}(¬{»sǃBÏ·¸Uð 7yïˆ×Çv(ìëi«ˆ iã ëĘïa­�Ýs´.§»¾Xi@‰Yg±j;¼ÍbIŸ[xãµPEñL¬6Û'Þ ¶íò>¥~ð,Îoæ0ÖmÙéx™*}¾")=C3‡æê3zjÔ^ûnÚËa÷1Â1{SEµ Ÿ|Ö~@ß–ÙÂqOQ’ !ý|ÏGéßt¼Þò?, E˜j£sòÜÔ¯'°÷“ÆT—Iºw6ežBð;-¨bn^‡vM9oÜÍÓI�¶‹XR;Îð<’ñr‘ñx'U£Æˆ'5 v]áÃó—&KeÖÕ}W!+¹B¿îþM©|µÿZGÚ ÌÁ™…¹ŸÚôÇ\ý{â4÷�ý=E[òo‹\@ZlÍÇ“\ ¿ÄøÁFSq{ç�¾¡nUd2ÕˆåYR*ßžkͧö4.¦GϬf>Ûçö絨Çp)ÀWÆÝ®F¹‚ìã³ñêD¤™Ž’-ôî>nLèžëûÂØ±2~¿Ë$^Þ-ˆ$Avñ¢lêW8Œ—“@, /hü7Ëï!0±ÝëÝÞ •_…ZÃWÙÍÜ1Œs†"xsï¶Í¤PCå6Åç Ì(ï*âÛŽp±«¤vW,eñ`i7÷Ao½z™�aÁ /b½·ópB1ˆúø7¾æqJ¡‚ÜŠâ àÂêql(z­ó xâ–ç‚I9t•Æ Ã$àÿ_) âö›‹EµÅßpÉÍ«ñ\x€áâ¿RÖÝc²NÔC¶¦·3¨ŒÔ� aÎÙ²ˆ^1…\jkaS ~>ÁË£VèrŸcÔÑ8¦ 8œðŸAOŽ]ÔgV ±¶ŽËŒ+ƒ(°(LŠ•€â¾7ˆ[ì<Õ]Ç·®SÃyÀÞsåW&ÊŘÙTnŸ Å·ö8oõ\6Z8|˜Â¥‰y ý2ñˆ7VˆñBµX¸MÀ€èt�tÝû Î;ÜD¡ì¥öe·¥lq­]F8ƹf]ÂcV ƒ"ÚI9iGᎈß ÔoVoSO:·ÛÎ��\ï‰À6êù·½;©¢¬÷!—­�çDR³©ÏµÔ°fü` ç®Ô¶�ZÕ@z’ ‹Bõß5°ò›´ËÒmÊLÒ6ä†Ä�m rE‚„¦¶¤5÷ Ñ^SÏçmÄò¿x}šÚYàjôP�V|O/ð(× X„¥5ÃÀÓ3|È…¡Û�µ»NœXÕK(¸Ûͤ·®Ó9Úq%¾m1�Þ:B؈æ3ÂeiŒÊ'/°eÓ5ZÌ…_\®jYš­ÄÅ>@íu+kR#êË’ †CÇ}f³™æó lÛ ³0fÖb5ms×äE’|Ét©/g× µ‹]_Jú¾u$ýÔ…*Cœª’.Võ}Æ-ð¥)�Z[j�pÐD@Î÷A[›‹�šRu(`iµæS3c›Ý�×¹RùÃP¹^Ô\Õ¹lvŒå¨2.㎥â–,*G|‰¤î³ $зk9ò×YX¡ÔðÆí™…¼£p ²MTPöîú¶ìĶ£û0y”6�2†ä”—ßIÐ,+ƒåsùÚõfÀ…í¯:¦/¬` ª­©«{\ö09«žC¸õ¶Õí!) 7ã>\» Ç=•ḻ„ÍÁPcÞò¸îŽ¥xÓËf�´Õi©!¸h–”%Ö¶}njC;éà&x†8ŠÂðåàvôë¢E½ílzí#‡^ål*áʹv«ÄjNn›µ¬Åœ¾ˆœœ¸ÙFReÖWdÄbô¼[�ð3Á ¢éÜ=–P©gc¶Þ´öR¼…¶K3\0‹fÛ•±X±©Úzú˜7£¦á�/D®ù‡Ùí})¢¯9[ç¬S\m]dƒAwt¹l(ô†W;Ú÷A[Üí²Wè&îË�R]ˆjúÜ?ò=ó´¯ÄçØ¶È/Þž¾ð_S†ÄYú&Ðp7„<Óp%v~f*Àä¯k†Œ"¦ƒ5ÃL¶ã<‹Œœý»÷#5k"9rЫ8ÆR‘ïh%ÚhÌÝÈ¡g˜ÁÁNo[+Ûç~ÑÎ ì†ù(a~w¿Æ�¿}cRe°½ÉT÷¥õcXÀ‡¾“Žää/åêqØ~¥aØ…44�^"듺R¾£ë壌õŸ2{÷Èæ=ú:ƒ®lx‹ŒÁ…ƒ0fŠZÔT^—ë/¥ß¾±×™öÏÄ.PÓÕÉÞžkŽá‚¡1‡R*=…´[%LíEw�¸Ïe€çº©ÁÓDI7};F_ú¸}m~è•w³šnxe·?[¶‘±\ˆ~©2„¼ xÙ©9à; ¬Ô>佸leRé�›‚B–%מ8öéL;Ôß¿¬p|¥}n!wjÙwóK‰§éØ´J­½nL&F½‹K{Sà ²39Eý��‹L†çz² ˆí»Xî¦H÷½É q/ú®§Þ4xk¼(>Yñ9Í”ý_÷tf)æð+±ÁÄ _„ÈÂø®×·¼„âLmvðc¬ì¼X—¤¿¿ ²뉤½ô¹µ4QC[¶·‘Ðs�¢D? Ìص¬íš±Rš8½²?*6Sí¾’ÑLÖ¬":dk;.XwäDäO FZœº °G£˜‰Ô”?)wÊ£Á§ÊªáÎ Ã’Ò8«CŽ»—Ãè<†�ÜWàœ–DèýLØ#bçÙž¶''LVE.¬ ?mÒìvdÖ¾h7›eD-@~¶•-Ö´Üny&�Y†ê¡Z:�¡}ž÷ì|Ýš_Ã�fç0"šÌïï+Ýìw$¢ã'ÚÁº#ñ+í\_#êÍÎ6‚è �·°y�7¢y~€ñø\~Z³±!±óé5cÒ ëfB—£çâ_[¨Î8õîãK„+È�âZÄ9k²xB‚C;ß\Êä·r9„no{êÅba¨0I©Üè±kÍ0ýÏÐ ¬.J°usë>2OçÆÓO pº€úÊ9 U?>3¥Îo®¦n“Ä}¢µ¥š'b\FG*.¬Þ;{¤;uU@AçSŒîÃùÅÈ�ƒC„´ ò¢ì'é<ï}�ö•U÷´5L†môxk¿ì;�ƒíãKÈ6Á:™Þ7A°`Üzц-ö…ÈÓÉã$‘ß�“RüiIJÙ 5†)Bcy$ÆcF`¥*d”ÍŸ‰íc,ûýI=Ñ�Y5NäA +ö³ë¤ $nÄÝxHM$IŠÚƒ_iu£èjš‹«BÏ(ás·Ãf1 ÉRÂ_´žëι¬œjwñá³\K[á}è´q×à2Ñ�öÕb¬™|²FEMZ(ÊVm%§)ô(µIC¦�^¹4[Øl‘ãG‹B'º}V «¥{¶nl€Û^;Ž;�¨f; lûÖ´ñ­UílUõÚÍrÎ[Þ0 åÎ,³½-¼ßôèoƒ[ëFÀÒØ/Ög}$g®ÁVàïs÷;§¨ÛøŒÃ2Ñs�ÀçõîÜ–>½l²î=9Ç~KùK!ž°z*ÿ c&—SüÁ<®wsÞ$ßRelKy*8ÆíŠõ[”ÝbL{:½Fybå¦�kÍ0ð5+Ö×ùf²Zˆ7Q¥à«l’7¬Å`f8Ú�îc³á�én�"83¨éº¾3›†ŸK’î£C§ÚÖ“”AQ¯ÖÝ)óÍv4‚0 bÔr7w,¾ÏLÓõa0êK‰x«(ª}á$N®pö¿NÑÌÏ•¬K­Òs7,^—kg¬¶³yh⪶¦T–® Y"F®ö¯§Æ¡Ö.û´]œšÜžKï^§®i¯<†ë^oz²åªT9Z4¿cݦº§­X²1W‚ÓçËñøn¥€Hà27uÖÊ öÚNqg9rAõµgmP,äK0nw‘EÁ»ÞÇsí×MåYv\dÑKWTì¶ÁßJE›:�º³÷˜|kÃ!Žaç;òï‚éK+ïsdtÌêdž‡ÁƒÀ9¨Î›9»`SrÒAyÂÝ׆ÌýÃΈ�î¥k4»¹qü²Bß&H?‰7NA[É3Ö¯�,y2 x«G�즑">/®J«`>@�­—8o¶Ié|b�à¿Äâf‹Xѳæå¦°W¿ÆE@®ÛµG¤õìžøÉ¶G§Ž#¦i¿ËÀ¨¼ÚÍmê¯p�@l,ÒØ2+R<ñ’Î9ݦHžÐv¼1ñhÒ.¼ÆIŒ0È”ùGá8˜ÌJìV¶Æ…dòd·Ð–40Zqj.eHî;û€p *ìi÷[nŒHž‡ ¸Z N}mÜB2Ã.�ÄéÀû^¡"ëŸ5ˆ€¾aúž²ÒŸÖ`;Ë¡íOÙªŒ—ÞæÑ„ S}òo›)‚sXSðèë>"Ò_€cq¾‡¤$œ\ò¯9k!z›¤á�¤+Úe ý©]ºo¤²�âx[ ¼@‚5ê·šàÊ˼í`b¤.; ³žˆ"©¡ÙÛk{wFáÀ©Ž7¹ «—7㆚§ mé[2ô™g�ÕØÒ§]MOÜ/F‘aµü€¬ÔûòíT°™¾‡jçîxað}é mùûCÇ@:hŽÁ!«½’±ÄjÞ1û±–GÄÍæËp§×g8Ö4æÆÊ„›âP #äÞf³Ú›—lï$Þ)ÓÇT=9~5¶ߣ֣S˜„NŽT¾µW€ìn¤Ù¿šÁUêiv/ ^Gíá]²B/ƒ]uχ&¢¯ˆ±¥íeØØ¸‘HË–!kè™\]l��ܴų À4ùûóˆà:•< ‰t²Ÿ±û7ç_èvü¯{bчíÉ·Xì–BDBŸ*¼º†Ô4fø¤ÙÅ–â¹ÒäÛ!°òÃ⟞ÝÊpCe†0b £¨ÒÆù úv›-„s�g»ÞÒ—‡K›çó®!ýþ˜33{HþÌÖnò.M¬ºÞOëG§pyå¨<÷AFYúÍpù+G•�wæ~† †É4¼&!Ùwv’¶–ØCŠçA^ÂìYN6�…u¢Ú@#A‘ÖkîhYŒŠEÏ#ùuhu 4½£Í{ä Íœö}»u+L™$÷ì{¢ìi¤~Ý¿ um¶RF |ç»ú‘®­ÇìXùkè6‹ƒ6žq~î#¨µ<ÁHûg»©øòœlkgà“K±ìKt7wh,Êʘ¥†õ±µegež>ë7hÇ-#ªïCÉ”mÖ¼¤-ïÇXâ`êÓƒSÒóUÎ…²8¸ááO8“Éd±Ô£CìBÇêÌŸ”•$Dz‚-…mâðL(ƒ:(vS%'³ /¬aŠ×ZÖlÖtªÚÚ†ß,èÀ4ì|ç,ÀöÕ²¹ ?‡Ѳþú‡.9pXDçÛ×Jý@7ÃþÇÉ'°‹þ�•½ê°ô­§_aô…8-â68TùI›‰‘"æ*Ô�ñÆ¥_2z2 êl|IÙ÷d»+ìØî„áoE¢üWK_k8q থaœÍÁq�o[õ€¡S'êÑÇD,!u|Äî.B4 ®·9QH0¢#�:|.Réøe¬ÐpkÀ|×÷µÄA‘â‘à$0CuzOÂ;r͘Ì&ÊáY*F%)Ñö÷ßp!6ÀÉc½è¸ Ô_¶ülI‘ÛA ¼ÊkNßèØ¦Õô /ž£­rڳõâ¾ìu3aú¡ë#ø rD¾6͆5IßjXÄ„¤,_±+¥¹Øˆ‹Us͸Œ-'PÖ-ÌÍ­5&š‹QOãðÄà� ôÃubGɱ,ŸëçÓXúœË„æS|Ê^û0¬­áGÁŽL�ZS÷àNÛùƒ“Ï¢ÐB·ø4Ýb KYu@[À¶Ýê qì}:Dù¢÷+§=®f÷‘eÑËïK³%äÔ^(¸Ûú·èˆr#¾E�$ñ§Ãáü¢�rûknF| Å~cæbrPcv%ë�7Æ:ÊNƒÏX >l�JÄÅ5ãï‘_¼°gÜÒ`¤*†Ý/[ˆ•PHÞ9µ¾õwN©ˆBà˃D·ƒ.ˆÌBÍ·<¢C3úk¹¤¸øv¥˜Û͚᯺½ç�ðKª<½ŠØ\ï”üS^1â…Þ|ÒÛît¶DR™m¡á° é«DœçL¯•b�Ñ0ê™S�˜qDzã8{{ƒ k!¸ª;¨gÖÞÁ§R—Ñϸ¸ eMê<³–½ìœ�µn0ªPOzDi‚+¹FÜ_ÖWÚ U÷—ŽÝˆ ï° À£ÙeŒ5�k]xÈÊq0?5ý>o8°O~J­ŠÊóyT>¥Áí2¯·¥Þ³�Åâ3Ü a×8l[PëÞäâÊ®ò ,+ºÀüp26ú`ŒS5»=ÏÝžvU©~÷;|c»>s÷®R€´ûæÎÌ!œa{o[ƒCFL>`8Tú‡)Ð]2¨…†Dp*ðáµ~OM˜é‘“ðÖ�Y…³P ”|*™œ2Ë"jÈçFñ DVaJ@ºæïxÏ%.óŒù¾>>éH솪õ·~èíµì=ûÅüÆ*R36ý‹>‹™…L™ƒ “÷¿×F&ÖL€ti’�*ç•êóÄQÝøíùm®²Vi3PØÁå”ðùü”q7áÃi“–]caÜm¦òÞ{^?-›,�oJ{­öWÓ‰±Á/O�ä”]Mm·?­}TÙñ´º“LžQ‡ó\vÒÜH�Ÿ±ŠÇV 1rƒd<ƒ¹Bõ�ã{V¡‰{],ÀX²L®7cìwf«Äk«¨ƒÐ�~ÛoÕÂãH&³ûQ&1» ¬43™`èçàºÆ£?eþ`x|oyºNFÇÄN0yyb]0 ‹"Tn&YyÅf˜?� ð¾­·p yEÆŠ’‰!«À~y\ÌZfØ÷rÊ??ø‘y»GáñÖÆD�-^MÍØ©ÓïNH(߃†ûöøPž½y®×k{}pú$é †Kí° n¦c’wC¾Jõ—׊(¢,ðksGʰÞ9>+ÌV¥Æ¦Í×vÂÐ-ÓDm ÅÄàk…–Êá Myš=™š>8ñoßgM&QÍñœOW £†9ô‡{˜ Ê6s�S¨„d•�1WJ wÛÊáÌO8P=XXMßd¨-sqÌ(KÒ¶êo…X(“ >õeZÒYPnök\r!?€0¸>YRà윴”‘«oÖ˳-nŽŠ0–´ö.0PÖ6ÐTfv¾d€µ§’tlÑ£Åú@!Ž7 šàA¥#WÔ³QÞðÏ7ÕLÉrŽüÞr…!u5ÁT(`·;ŨÖô=ìrí`¢|•¨É¦»”\�äiŠ…v‚kzÏê’¨ÍÄ> `9¿#ûUÇÀί^ïI‘3öJVPû¼j":"£¾^Œð¯îˆl”~E²VJ¿7omY☕²Fà7 *ø8Rå½bZŠ"‡§z×ö˜³_a6¯m¾+Zü½¦X1.-ø!„„jµ-óµy�7Ó9xf[f4ÈΦ$%[ñÝG¶>�ë%~ƒIóB8˳…�>¿7ÍL°.Ä­ÐôŒg`§g_¤3«ºÂ<†Ô=þ…M@xo“öNnþw‚ÌÕ…oU€¾I¼-Í=?+Оϓ늈7Qî™loï\7Ö„°ÛtyÞ=m€Å{âTÎý|ÚúÕšà”F~Ed(æ=ç è_=÷«\¡‰´ Ü=Q˸‹>,Háùpу éÐ*�B¸²0EÕ[ð‰Yìb"u¢Î_.° â)×Z+6rW8¶µ¬ñMæàÙ{¦v1rQ²ÒðAøÐ?~Ö „«�ZÈésl˜qŸŠ³à¼­aP¸@ÄS‡®t2D¡ òf_6‘#(^p=ŒpCá°}ØÖƒ‡6›¶ðz´Ò“¼µañW¼V7ôˆg„\£E ;š fÎ…æÖŸA ø‰"­Vž¬÷8`°uü€PH†$ ¢3_ÁÙu‹ Ép×Cû–wd£}¸}:�u%o¤#KÖ*ÊSì÷NÙõª èð„V€¯F.½c\È~kÁ ?Fð—|Xþ¸o1I©c¡’¶Kv¬Î% ¯š‘¹VÄ¡zp${”懂´h™’²°_)Ë ÌÆBü´^Í6W‡ ªÃâ0ˆù±ÇpÛŠƒWÞØ)têGˆÞžù·`. ðm¿Ò�“‚ýl„%BìWôÚxݬßĘ Y�Ä#»£ >YH”ó4oÄýd‘}X"ëq~IV¡ï“á<û„e9Lç¯?�7”<Â._B̓+]•OW,ùëNðÁ‚YnL@} na0ö½JZ¹b.¹õÀÛB®( ÀwÁ;˜Ï¥;&'Šøã[¶‘khж^ݲ�$Õ†˜}7Ï2¾Š�"O'~-9cq©¼×„[Euñ>úĶø  ޝÃdß[¨�ÐvJ݆´Ÿ3ÎyÈÓ”Ì�\Já°Cc†)LÇqÄ"Ùy¸1·¢­ËcÂÇ’*´ ÓÈ'쉆6Z^�G…>mï8О»ì1í+«­O}‘‡ØÙ…¡:Vë´}– Í=�µ‡–Èl8�Á%@ö“Êû è† [åÚË{]„†ÇÇÚ}Àwç›óqA;`…iŸ(qúýw¿¦ƒ‘kæ'‘ågË�×ßwùkë”ü RlfÆöi7c>€Æ4XfÝ ¥/ÁââðhV_̘å %2Ôr�ª×¿¶ü5Ø̶1&ïP3m*ûhå''&î\¹ø:ùXï.må3±Ëo³»£�Î8ÃÔ¤sØ!ýrÔ¶Ñ0] á t3ØÀÆÆ5mCÔšÍ8Ƹöù×ÛJ[ÀÛ{¾5f€«ÄŸv<ç:i{E÷Ía9”ÆŒÖD¡€O^‹YY÷^ò½ÊBs´;À9Ú±m1˜zŒ€M]®�zó>ü‹‹è-�ÐâöæmHþ‚ÕÝÇé`[k3‡ú“ŠW »ßÂÑ*'ò»¦v­X‹ŠÐoŸ[/{/äõ±¿=>ÏG¶ AÞnÛnÉÄ>‰–o§®ÁÉâãg¼ÀI‚\Eh ÅõaÄ€èG ÐÒd'„»7ØGC½²£®»|CðŸØûêmßèB™ùßsUX,ü5ͼmÛžB }¦—:ßLcê1Ñó–zî1­Tó!èlni~ûÏ9òÚÚx”ð£ì0ýZÖ¦ÝôÜ‹Lu1Ž&ðØkIu 5g(tlÜ¢®œT° |Æõw�â‘…–gD:0@ªÊÀÜTýGpV-îË]5dIŸCƽ;§’ÐüÓÕ¿Ñ"ß1ê•õ:øS¾$¶m£ÅÒß o �ž¡2¹oçê‰�ûóÞý¯rkBzúTM|P¬@Ðg�÷Ï3\�$°lÖJ÷ÜÀAÁ|õTqF…Æa6Ïí$S P™€¯ß½7÷Á,DÁŽ[¥õêBˆÂôL…:$ö0¹6sÍ `6+pˆö½Žs`8}>P}š@¸æÏ°BÄÕ¾ÙO#˜\ÖêÓN\ÃÚ6 iÎÛLR޹²™ѵ͠H‡[]­ Ú«ô… °ëИ…ÌÎÓUs¸Î1ƒãê»Z8ðcc;ÎsfÖ]A/… ¶×9ÞÐ<º5ñ8îÕ¡Ÿ'!«ºÒw � <ÑéÐ/®{ãZyÈ(§ONŸ”Dy{žÃsKQî¤Cå|þöái¼2ºîW¤9·/›,ý¼zµÃíÉÀµfrØë�‡²ÀDŒ�´v®}¢´‡'FøüC&;Á}w¸oæìýŒ2ÄE"&MF‘ÂðçBtׂ çÜûŸ$Ÿ3‹Ž,À®xê1&ùna0 ÃxD·à#ìl[M Þ<£•.ŒÛ³XªÚ$æid…h# †Ë*êIT5ò<ôQpåOæú"Á÷,3Jº«êd]~­.ß&.¿x'ë½8Û!\7ð»Î æ_™òÌâUz¡ºÏ,n'h›ô„ãdˆ©xœvAËn0ò—Œû¦ÀaAîA5V�Žb¿{ÔôA=i³ÎPƒ,<½¯ˆñÞ‡¶MÓSååO‘Říó•Ý�šcK´ŒªÐ¤ÛÎÝ¿ÙèÈŽ.Ø9FÌémÇð_.:6„óÛÀjæÚwðç<;šƒZ|’̲Q»_.Í_×ס�¸Rñìaºþ‚Èþ ŠÔù²ÂùkÉ)�´owmʹ†"Á¼Za€}TË-ë˜óÿôð›�Cl±dùùJV°{«îÑêïà¼a�Æ<ôù’Ê”“ÞÛ_»³˜ª SRÄY`A³~q3rŽ„àÃ"½¬Ob® ©¼†g|‹”¾µùpQÂ{>ìVOÍV]ëÆÈ;P�‹@v d'J€ (¾}î1….Hr™ö¾ÛÕO, Š[y Õ“Çg¶PÇ£•¾ì•J!—Än¼âYL/DoÅ`�q6&4'RD[ÜÛzÔ26 ‰ïdQ‘Sü1Û¦49TzŸÆML$¶�ù®ê˜»Ìgg†pAŒ}uûb+PâjËÌßÜ¡´vdáB»ùèïcÌ.-f&fºx4œ¸Dâ¾æð,Îá˜.ØzQGª= ~ñ„"Å®À¶Ú(ê~gÙ(Åòd7–‰Û­¾¹�gU߆”Œ”„¸j |q#õ¯¼ç»ãÉK`cä…†¿.LÇá}Ó¹ý ¥Ú8Øt%Ÿ( 5¡;Æ¡ÂE˜ÚÆv®„>àé&å…茶P ‹ƒµ ª¼•ßœúuv5µ€HþËBæýPOº�8ï+:%¬žWõÝeÀ÷ÐK©%©"ûW\ñau[CÕ€½LVTá¤Û'¦M1f`pí¥­Ë)XcÕ1âW-‹8ÚKöUEǯY9ÈÖd�f“3§«§ª¯^nZŸ`þÒ4ß‚*¼í}êËÛy†FpV®xÿ×Ëôäo»Þu“¡æYm]k¯­eóÄäÂÃMÎrš7ÒDUÿ�%T¾-wû·a4ì[ ×= �R{«�È·„Âv1‚¦�lr«sÁVúüz&‚ÿ¸rŸ4�ˆ}`Œ�A‚HŘbF ™ßá nõfªîØ Å Œ)c—ÁÜZ‚Ü#¨6WÐÄ C„§2š×uS:,"* æit Ñ>òð“jÛX�·¸z™ÁΙÄécF UΫºèDçÎ!¢MÐÑŲõžOœ7qžüÖÛ‰Šç^KÄqõ^Ûéâ~ß ®œä©,‹„XÓPŸO~Ó§PwX¸ “sËć}+Û…ž�ÕdãC¬<' .½©¥×Ç_+à}»�BÜɾ™ž!ý-5!lUÏj½| ðýd‘•ÈmØîáq‘ÅtöÈÐbì`;2Ž×>È^©�O �Ûå&E˜MÛì[áˆÌ�å´«øë˜êå,‘ñÍÿHÇÕiàç±*MÄë€úÎöü·ëËïß¶»s¨ŸAþµÜ5縙AÕ……3³RbSsÓ $Ô óvG¶[zÙdUp�f)ŸŒeë½æ¶w´ 9†ÄíŽjü`ãlÅ ðâ¡BÆ[4Ïi头¢ööwK4÷ap6OÈ]9;Øä Ñ_Sô$[Y×N¸«Q—›'©ò5`á § î ´ð·{ÅÕõÁs>­Š†ƒäІ/Þ(¹·7bdâ ,éý;[°âÄÊp$�w7š÷1"l%�CwöA> ×ÓÈÒ7 îÁëŠP¤Úo-*õ» œAÜõ�q¶ èá¸dªr ïíÊÐ šÕ5í¤®PÄeÃà¶­™ `Û[kŒFÀ÷¶°–F*c0 °cÇ')<¨4<;ˆäm\µ�¾ùÉŸ@ùÇ]ý;=]Dvâ¼Û“žîÎ=pT!(ò-ŒÌ¡@÷ª pG°Ä4£HdùbÑj¨=§mz­?žà!|Óṉn �ñ � DYÁ¥xm‘­'—:,™´«z‡P÷=þ�Óæcè/$Û)ÇF'ß;F0®”F»}NYHEP‚{k}—ÔX Ïå;ƒVòÁ—äk¤ˆ"óÙÓàô £!g#LbÖ¸õ:—DîT=` Ç4V[kŒ¬)AÜÌÅnòÐRkaÎCuËÙÚäD€š{‰îõÇAàñ(µ‡ÙÄÞR: :ô6Æ\:†'J;/Á -hÎõ€>“vù”ÖzTiWTAÉ>„œlíÖ“:HØáŸç \žuWfn­l�LýR»ªB@Êi9¬¿™qBЦ´MÃé ,¯ÅÙ—à�Ú¶¬¥2�U|¶æÇm9Ñ/�c¸’¾-µlG(ÃfdØ÷’±|ÙÞ;§;à·¿/{<"1�Ý] ¬&mƒ¾ÝñküàLÎ� ÷Êp¹—Ї�Pýu· V‹StóIßm,çŒÖ-4ïÚ™dbÁ{eˆUÞØ|Ø'ðÜYçg…tÓ³´êÉÅ �å:…ªÉ¥½5T�Ãã L»=;y1¥cý²‰É.g4àô9 ›æ€÷·ÊÚÎCÐê&z3aÇ/®S–$d­ Ÿàƒ@‰èPI§Ìin2Ujô³­NÏ­–«¡Øð9ŽªÐm>­v‰4†“Œ[W.Þ~¹í|ãÀenûßD…´Å–�ùáÏwcu'Ñ¥E¤$ŒXŽž3”mˆL’dŽÎUË´ÛÖÆ›œkcZ‹vQüõÎõÒ³m¿†ñˆMâŽâJä½öòÝ ÀI�ZÜ�ÐäÑ-Õl:ëB¿[�73NgÖ/Æ P�†švàzø`ò' j½º²¶êb×èa÷— ô’ç›ÓÌ�$†U’ÜKáRÛìØŸÊd¦á öËõA÷šàß´ã÷:oN6(”»aÆá²LèÈ_Ð÷°âlHTµ„øðß:Í¿G–b’¢Ö É|b”?}N €FkgvJæ [É0è‘y~„Çv•môrïÖ.øS~e¢Ýdãõoë âí¼¹î ÙŸ+gæÏô}pÒ�¹³9÷ùî¾²p’N 7º6¢àؘƒDyÆBx�ÙÏÄ, d°!pï¹rû¹}ÏâxHö§Ê¶ÖâÉu€ø ú+y‚‹'X4síG‰•›Ôœû•wϬ›À³çã€òðÒvH®|vQ<„Úœy¹ÁÖ±Ë 6@¸S»—G ’¸( ’bo£á7Â!çÓGD§tøùid°lñ€Þ3#:²‹I¸ýqͱЯ|Ìvsx¶Aý?¶‰gk®�í\¿kšïÁ§Ðlû]r\Î÷™ºåb,Ãû÷à ]uò n{ÙxÐðà¬]{ÒuKóÁ … 4Á ´Ï´D1½XJ‡xf­Ø2YȶF>>TêÒWÊ­ù0Q{k¬œd€�Ë+Þ7}ÞQAÄoÞpÊJ™ÏIMJ|Ú~siö­^Ý"½ÁwM:ºÍŽHÏÐ…}â_Ѫõ@÷�#;×fâ½ÖŽ›3fCy ÈèÂøSå�‰jf�Á+u‘Фà‡^qD[Н›¹ï³ Wª¡rk{j"jýÁWë7µ+îä®õѰíoZ{>—§fî=4×G>´õEo®ÕŠjͱ¶1ÏeòïŽîo3iÀ€³2ƒd�®ù0o[ *üªº]##¥ÄYsh :§úæ{åÿ8£ºÂO'p­];�‹-jÔc/)Û� •StJobÚr­6˜–HzÞbAwžu™JîF•$¡‡KžMnE³Tº†t‰Œb`áõ.Í4N(M‹YmUXXµ6�„Eún’LØx©©˜E&ù'»˜A”иݵÙã©^ëU›_}¼Å#Ý&Ñ[[sA Ü[U!Ðô‚l™4#lmû—4G™Û(ƒiB†5fñ"¨ïÇ©zN5¦m8¼]³pU�@ëÕ›ìè©¥sâ¼Ïv#BùÞŽ› 7í*cŒ ?¸ ¬2ÀFmaI'œ<ÀNNâ�­L.e6” ƒ×hÙìðläì÷r`™ÆðÑ)l…}½m‚í�µ&E­’'@j¤{;Ú»µÂl¦òAkµñ–õÚþ\=ºŽÑ¬ —Öò[ ï[‡ÚSÕ¶æ¥c¹6c‘a­ Þå>!ZŒ!V¬ùyØ/úîgÉÂ�ƒ¦…1Œ`²×ä w/¯Ê·AÒ’-³Þ&n\æd\¬»ÀFpÐqu'í*ò²¡w€Ü 5Éòf´&öÊ›ÍIè¡ÒL­q¢:—²¯eeƒ´�®»‚pZÍ¡ïWM-‘Ø5m÷ òâ�Ü�ŒË÷æCR÷% ¡B‹ê´+¦i^�4LÇ–ößr$Sñ kSk²EÜÈîj‹?�I w ÑâùÆd`ºO`u M^‚Aу«ÅßKån¥ÑOÂ.¥6K‡‘�†ÖO16Ðj(Õ¦q 9¾¨ì9·™×SŠÁ È…ßMmDÄoMQ[¤-o ‘(ŠÁ µÅšG¸ÌpY2ù  opp]F›?èò¯†ôÍëBéi#%b;z‹{»Vd©Æ™-žNp©Rɪ^Ú'Œ¦ øUÒÕ"EY—Æ�FG«1«8(¿;:©å\ù<ð"³Þú=ÃÎ�Ñ€t˨èUI7ˆ8 ÞÒÕ×=ÑïDlí Ót•C<]܃œÛïEÁk­ýØfLdAæ­‹”#¾éøP±õ•ÝØ&¸ q)Ë×;[¦÷ëÃ.³ÂÀ¨®I&n6gNÜ;À²‚”1¬Ê•!›Õs‰ Š8 fÖ@Kix’QNI¯œiaJäÓ^Ì×râ8ý¼.$@Ø3wsÒd•�Aî0“›˜ÉuœW C~ õ.Ñ!…ËvÈê#h÷ƒTDv›\»]¸Y Ðn+º|4c¹wEË Ž‡KCPÎsJåWA‰Â@AL!†Büx\–aCm`Êý'U(ÌFÄ1‘ɽZ"Ü&‚7 "M‘J×´IR„ô0bÎÕÒ±åøöÅð”WW²kti[õzüÞk€\ýîg½†Rß1Ûš6…ü0w½=œDq¨ÕʹkêÚÐ9£©˜»< =ö¼>p�èÖ½½S®lÄCƲÂl‰Øa…B–8L÷¹¾°Öø�~c°í%¥Qd÷¬%øVîCv¶ô 9CŒ¶%�`Ñg«ª‚: UÔc,Ôš e1kFÚX}d,:£4G1È{Ñ…È Ð(PsL›~b¤ òÄkÓŸŸ¯}×EGN7JšvÄ3ƒäkȪ@™Â*áE7Å5¥’ŒÝæêçú�’ÇÎèº>÷qëm¶·¯‘tG¼L0z\@V'èzÙâ¼á‡©ÉT/o÷f¡éIÖl›šÂ[�å"wìÃnÁ°\{èÆCTZ¯§V>Ö€ÐØyZÈ�Å{¥úAg´ïre» üvè=š-ؼ¹VÙµE™ÿQ®Ê³&°IHœjt¦0+úÛPß¶¹vʾ–46ßâ^ ƒ%jÍŽ/‰¬4!Ë ÜæãÕ^1('9Á²­OIÂùôõŸ¤Ïjñ¶}œá•K|ðõ7¬9÷†øáwŽOæ8OÍœ¸ä®sÎk’Ž gBÉ©UÙë[Î~×|¤ÎgQ�¼4Âøê̹p:q¬/›aõAýk#v´|T>gëáz›#£Høm_ãæžP|a@xfàòV<·†â檒a¬Ø3¦@NÖ.¡¦û¶p©Êo¼{e‘4Ë«Eåºy½ø‚öJú×Úé‘Â’yc^\Y·Æ…Iû‚‡ì^ƒv[xÆeKuún [WI.#ÑÓ‘éŠyÔõt�oÝ"ZüËîËÅ´¢ùuE½í”â\_±äýê¹í©ÀŠ”'ˆi¸ZÁ÷A¯ðÉô¾ù ý¬ýÞÿnÁì•_ëżñ´äÍXÎ8È:Db”p£›5‘o—ˆÂœ{?ÍÇØXi7ù+m§­ipßâo þ¨‚àgYEÙo\SÝ$=c.“~žâF­&œ$>ZY�CCxŸ¸ïd+f”Øï šo%„OfB|™=•lr!:ÙæcXážÕ:â�½2ð|“=aà0?ãç¤`€£0`½‚YD¸è°ºçLºÆ áËLù –‘³ 5Ek>ZGãÞ,¾�+ ý¿›»à¾Ä3N@žÝš»ç]Ï“œ™eáƯVU€PÑc åTâàÓë�5tn%’LÓqw¾MÒÚ …F¶vâöZ°b#Xãé†Ë¶+Sü5ËœäCo.÷¹Õaá¡w5e ³àG)û±l…M¥5?¢�=îÓeËk�%Z7ý÷q.þ›š\éг8IÊ?‘yìØ÷™½¤øk�¢€œ´?íÞƒº27z¶„ÎÛDè>ú×ÎoVíUQdº{0îŸ8‚> fMˬ�£wÅ‘v—’íl‰ó%¡®Û?=¢ÖÌ¡nÖ72û&¶Â6óÆøZ1ô�á¾ (=a5ò¥ôƒBâÒ…Ÿ_;çÊÔ4nõÚÀèeáF°ö¬ã£z0ß1-Ÿ¡½™�ø½øC|º‚Aró9Ìj Ôö^[á¿·vøsDCiãs˜.¶{M”w N„tdÒkËü(}!lg¬žÖÒð!¾BÝ„3lz…eYCG.Ïõï÷¼RÑ€ÌòÇÚ¬�—í÷ðÛ|eÕkâZ‹»°öŸÀ^žkº?²ÝÃóØgÕ›§°óà­aÂ/LU#iä=ŸG‘°ö ð bž…ºóiŸ¼�Ž1ÌïîgŒ�Ô×£V¦kÊj-òÁRi8—ÎX“á"§µúºCÓS¾BV8±û ù=šd5­•Ê=Àääx‰0lä~ù´X‹ÇM¤–81ƒ£8WgŃrYâØ¼7 £çgœÉ7�ðñ~]aAæ3éHæ}ÖÞ•iyÞ_kÖ´–Ž�‹» VÇÚ~ E-xü…AÆÅ§¥¼ø¨dÛ¾ü¼¿ÅWžˆim c ˜¦Câ µcŒö¤íYsâ3γ#§ƒÞÃ7mo¾Û5È…¤TÞ_b¼Ç”?0úûóÁ£ŽÖ3 ga„çu YÜ{i’»½þ÷˜ï×n}ÏjØÀL ¹ƒG˜…¾)вu$fäY Qг øîÖ—¹¹HaùÂ^+ÌnýÔEƒ96¤'¨ zöúÞÕ¢Ä@ߺv1*rÔ‚ØS³¸´ÌZ[Ÿg]®­¶#Cv.FyêÕú‘£hð\‘­y2°C‰I®Nr Ú·äɦ4˜ñEo>)iÚV¹ÞwBPyŸAN®öX^š^¬*Ì�:£œH2Š]á�®YN�ÃNê¹]-ó)òòxñ7“}ÞÐ4ïÅn0_pwu¹[Gf-ðü‡ÂâêÞÜJ]½ÒªìÈ·&�ÖlÈ'‘kŽ ÷èö£a{ µ+ òx`òëò£?™ob¯Ö^ð{Ü`ø­_tÎÂIîî$&¨ÄpÃ'BÓG:³u}B.”�“ëöà÷›ƒ-8è|aDn §‡ó—¬^ÛÉ7ݳc V„ÇóÙ5h ”Ô�ÁúÖKpš4Ä'_[s@û…�O°îÀÔ…Ë*‚;B]š¯ÊŠ#êúj'šÇE#ÁÅöÑJ�½Ý)6&ºÍO£•‚«íŒâ‡ƒ°Ÿ†ÐNüœ±H4ÛÕHí¾n7lnzo� o=?½¦µp2Yö+WóíÆ‹bÐäìâvËGU»²Ì•�ðÑÜí of@³=CjRGqôâr.ó*4šT¿vʈE|Û}¯Ê�K®^ûP¨�í;º¼’’ÕI­Ü¶5ìªw]|¥¢(74¸Óå™SWíMtÆÑíæG÷´X‡×Þûó(#Øp­•~ŒFHÄö‰NÌ|P2^¿0?ž­±QðA±n 7.æÁ7ò‘¿6X°xY2ß$›Á¦=߯S¼’f-¥€´|ò¼vß1Â5×ZÔ¯ô:ò‹2¸×ZB2–_K¶Oàø¢ÂëÍô¨ð Æê¥¹íiË»0Þµ»}R{sÀÿpù›‹*8F ‰Tr„HiÔUø2muýÍ$†’’IÝÞ~‡ ·Ä ·`‡å›/}ÞκyŒÕ’/wMl°•÷æfQÊo–¶ºm¢áŠ·X5¡æª£7ˆkáä 2Ü0ç"¬âL[‘cÇÇV¾DVqÊÊàÎí\ _Y÷7¹@ÌiÄW|質-6[-Ïï÷ïß¿y§¶§ eO¤”Û4‚&Kpx~]£ ©®0øOg‹ëã�¢à÷+‹)�pä�ùÌY5Zþlˆéž¤±an¶ ñ4ßÃWs€Q8¾›I¬ñÝO¹|ƒÍÝ�BÞø;–ò3?‚À—M†Wv¯+^„2 ŽçÉÛS“ O$Í:IJ׽ãDuì×Lšzˆ¬:•<èg¹b3;—¶N1lþ‡l„×%wç5R?yýµ£¡j=ýÇ�³-¼cÆ‚: }…ÅÝÅtŽŸwF_KÞ0¶ryƒî"\‚õ¨…FþC©[&ß7²]ЬÚÚ Ð)üßNÔ·Å*ŒH?Ã9ƒø ˶R�Ž4_ëÀ+è®)zOv-ê:õÇvhfïC?KÖ⧈ÜhÝx´èSl9žß3÷LËV¸äÃØŠ_®Ê <=êX. rpJmx<’½F`¾ÏvNK¿°6àųg–‡Ïåú!K5fO×�¿6†ï»»�Tˆj *'ͺw©ôFV2c[\£|�ïž¹4Ù•®÷b®Ð;HÜC‡ÊCíˆÃ€7} €­Üw4M›�þ¾È9}wN˜¾O!ôŸí:’ëéwLó *›Åúý2½ZÊ_=�|jM5�ÚµÚ|´ýòh¿ �§ª±Iì³N{“+ƒÈ}HåïÆ£�/8EáW(uEÓÖ–lf ß>€�,j¾#}áªy ½÷{¶묊laÒ䨷ç=@WçzõÌzÍÌòØ`.lîmï|¶­CgúÕz [|âñg¼Ê–P5öWîWf–XœÛÖ×›)nà ®÷(É=\Ùøø™¬Q–oÎàE+‡w'ç,@ÿWF�6y(Ìã ï�¼óëÁÀ­”� q=�Ø×"™Ú´-›ƒÄåïL Ù*d`B9mñ5* .ƒ„Û_B$ ~G+_‚H2mí×�)+Ö{Z½nàæçIï3€ð>Ó/O…õÖb:r/�Ò™„ÎÇêVЮw§œY­+!¯/(½Añn\zĈf{²p{Üq_º‰�Œ¿·°P…RbMØh]ÓS2ó 6ä¶6XoxcߟX £<+àà�:�ÐÒA¨vè€ý?£å_Ÿˆêé~/KÛ\>ü²|=–.?œm³Í‡Å•)¨.ÇÌ;gC/¯+›[ËIÚ€´H.­ˆ6a[²-¬"ƒdx ¿AÕl¿#Ë—bû eŒ¼mK�D˜Ë&†Ò¦…̪h.…À¨&À¯³aJßÚÎ+’NÞDÃôŽèjvÆâq ÌžÂÐ�ÇI¬4-¸$Á5œøÔwµOW™º·X°�W!´RL»¾1w Cèç Ü•Ž%ûQ:ü!Û�¸`γm±!V³J²BLm*™]뇅p½*röµ$…ò)Äh¾ß§PÑÇáTþLi\›¥`áÜM÷K¾;¾±|Ë�µP³dáí´ëCË ž…ç²#g;‹Ì’ÚÀ^AÖµ¼¼+ Õýå^üþß¶£­ùúÍ�HsÑ-Î��Uz™ªè´º¤Ë0’Ó•ÂEŠC×Ái#�÷»HÑì膿yÏuLH¹�årÌ]ÝËš"Óƒ7Ö,@Ñjœ8X-øís®Éž CàÒ–—pŽöxøÝ¿xüd°³ép¶ûÈÉÊK¸£—­sý>óìÖͶXéï㩸K¹�Üúl7R¹ö=ìsUâ £ëc€÷/Ön;í²XÓÒ„ñ>Kapÿ„œÚºXšÛÑV¯N~&äqÚÃ]eHõ`õœ¯`m3žª+1Qœ(< ïLºW1¨^¯ž‡ƒB®öPFçå¯É’¶ hö&òD)='–€º¯o¦/o\8ˆÂ‡I¶øÜˆû�6/n×åh,5öïXŸ±ŸÝŽé®ô"l1¨P1@h,¸Tæäá[! ¢Å†±Ü!%ŸœågY{�k“åbcœ½@ Ïwû›Í:RÎ}‡ ä£^T|Û£¥>²§Q`€ØÉ`â¥�ý›÷È€nýpu6pÜJ.l ¬8æõ™ Ûwc¹&mYÈc¨­\šÈ6›è-u±ßL�}î$™x¦xzMƒu°äqùB÷Àó‘sPÓ(b²nûØÞ(8¸À²}N(Bž1–Áé6Zª „Æ¢à gœíK–�†ë©ˆ3|k=Òë®î¨Í%ƒC»ýhÞŒM÷Ç;Ä–r-Ó tk9ÃZÂ;6qS%­UöLk™9¾·EìõpOŸVîÇ2é.×SÂI�BKÄ!�÷ÖÃnØÎ­Œ}½kîe°N¶³FøåDY§ûZ~Zíip‡ö½ÓÆæ¬c[zÛ~á[%~  9 ¦„1HŠýܼŠV”×É£ì4™ÔŸpF{¾Il5uÏ̪¡„æ1F ˜”ï‹0\ i1`¹¤qàÑõñ}‡ø>žã¡€-5œ¼¨¶6ßk£l8+‹è“–ÏsŠëÄÛ赑Oagžµkrê ÊCg®P7{VM¥¸‰ÔÅ ö²’c¸ð1°¿”×°;ë$€éˆkF¶C¡;]­¾Y³¾æ�Ü�•0£äϧQ*…åsßg샴=j…ÙZüùôb¯ÛV2z�ûHÙ¿™¤Õ~$f -t²•ö â~Îîø»£)oKÒ+L§n[¸pœVŽ‘ �ím�ˆ1ÑÝ2 ˆûã~#vÙLçjWözÍ­ä,fÅ©Üð[?¸5ye·ÃYÛrGààjLF-@Jc~qm`¨B¬Õ�LÕÝ»ˆ‚ó�ÈÂ@ì-¡ …úÎÙî·¾7e9pˆÀ­!Wqµ’ï·ý}=Š^G¡Ié!g~ «è·Øö@­Çí·ã´‹´yÙÆó¦s--�g�šd�X2Ö칯v£¨HÊi_Ú¼ñö"<¸,¨šI´ßR,å^âÀ Æ5B6àx!€Ì÷Vó'/Wõv¯lv^ W£¹/Ž©Ô:Q¥A›–5L®Ç3vŒAf ’ÑSk´·rä{»û7�¢Ø(ãïœäw}Ù�£ì'vϰ¿\µÌ SÉs�ö³oŠ÷ s„¶ž^á+ªOF7t×…ù£yfC ÐY(èŸëreøI£kçX«ü ¹ÀùÞÈZ)Ò*k½Ä�ö/X—Ê Šé4zEbôwÊ ~ƒ6ÿ¾;ïnîíjÇ€�E›´Üè 5öEO�½BÇ6¼õ#¦y°í>-­ÙÝÇ' ãØnöíó/çÝÂÁmç¡„G@壶ޫnHçÙØßrH�Œß0” ‚g´°šDkêP÷w¦QgA<×RÃZeÞÒ—*gr& éÞâåè[˜maålù{k"&å"Ü7Öƒ �ªo"uí¥öÖ%Õ\Bä; Eém}s÷‹W&}nû,Yˆ�û›êŽEê eد¶³ÆìòWrZqî^óNh_µ‹Ø«�±¹:Pdv˜Z\'tB¨4v#׸âÃySöÐßÙºù ºì}ÀÎ}Ã…ÒµW,´:îWn¼F=© i"0�:ŸMÈ‘nr¸KêgJ¨l§»²Eh #—´�“¬ï…©{�#Éíõ¥±?ÈûÅ–L0»(Ûݼv vhB‚’5_¢§KÏk"¡‚ÆŸò4^ä`뢲¶ô““ÁB“†Ÿ…×»;ÛêåK�–Á’û!ÇBß#¹E±(÷ÖTöN�å¶·?u™,�Å™M k¨:«]ºÈƒZîÞ®ú›b;gH,à/ÕÎ ¥2ø€‡µÃˆÄMwJ³�­ ?“Â9ógo�ÛÂûašæ™çÓê<éûÔÔÊ?æduWù^ü¥&Yòì;ŒCdÁðéZꢢyT÷ücoˆ!unãÅõþî"ÓÚ*ùõOèìZâÞøä­¯lì¹Þ=ö‰}Hs$«üÿ}FJ Ýþ£Ï_oâ×àrð�æ:ç9é䱑>›\°›5N™Ûz<ÔX‹hbÆCäÚ{¹®%ã ®v”WD¡Œz™ a�¢%¬Ûºº�`wlçc|Hr]Yq{I‡ãäÂý£`Ò @uQ Cë_ ®rÔ°qñ¶Íë¹åX*œ* Eoµ¶�fÎ!†øÿ_x¬ï]sr´´¸‚ñí)ù‰ðûS�ÜŽYP/™«Ôde=yÑn¡Þüo,Üñ2K�ŒßNSc6¾78Ö9Œt´ÍŠ-ý”g ƒoBúL3ùQG}­U¾ Ïãót  ­XÄð ±QKDq�rˆrY�–ù»ô.‹£tûbú³è}.‚¿Æµ oXã¡N °u±nFê´ª‰qp¾Ë^ߪZ»."),KIá1K€ÏÄŒ¼¶78ÇÒYœáéi}‡²²P£„fu¢É8æ1{öË3ùKŒ(öµÐ6ÐaS"¬�W% Ÿ¾áû»^”ˆïƒV=ï)œ (lú–IìR2ÖalÌëF‘¢UßRõìí2x�†½5ÛZ顤DÜ"ðQã%gopƒÝßi°ßUeB¯Á;Ð[á¦*·XÎx^ícË'Wö�5€6ãu§¸¹ Xʒ܆ìлÀEmTG�C¼?šŸFÙ;öµáÊçîß¡¶dÁV_îxC[VŒ'1Ñön—f_i7zµýM�³¬†Ž òÛ]`®JorP/“ÜÝ©ž·G¬ZL/˜CFœ1‡ÇóZÚï³ù“÷ïÀ2½‘§kÏ�¢Ã c–J\ÌJ<ΡS ¥��¢¡²O|,O3“’Ò:™±»¼ýñ�IúNøº8ÝÜ0Ù�?CUŒ›«"�„ŒjZmLõÑÖL¥/«ï7@ÚãI§‚oŒ€ú7Ó߇Q‡Á—wÀÄXRý»͉Œ„]):$Ž8³\Õ‹Š”ò9ÃÆ”Ëë”tÝ›'@V¾}JXltnƒ.åú”ø‘‡DÞÊ�C¢/zL3pºE¡ ôØ[×ï߀˜s{©6Í“õV’ ,gD{y޵û ãù‚€AQL,v æëg­ÓØ_˳}ßÅ 6‰éŒÄ\Å /‡|‹frÒ`Ç›M)€QÙr fH=×19u]X/á^Úù-‰r-ûEÄèdä(s§¥PÑ© ªs‚‡ŸîÍè7»Ùéª2g] |V¹ `lƒ­–nÁ›µ#h÷*íÉÄ] S·3*¾¢`Ó bæ´ôXøZ­‹'Šû®ÜÃ+Sœ6�Š•õ„w«ú+÷™´v³ ã—óPFŽNâ»ÆžˆC+¥sÃμC@\Ùoˆ©½«sQqßûPmÓYRw[AΔJ+äÉ�ð.Ü]Yc…ƒ ÙB`ðÀBuª-Qpò÷âpÏS¶5bÎÏ-¡º·Ï¬¬„ß¹7Ãñ:…ÍÞgËPÒJçfªDéN"‰ÆtûëÈön–Øï!�×üùe;wšä[®�’ÑSѲ°@ƒy5ÔÒ¾ÈÖäeìÜ,Úီp ì¸iÏRôŒ-˜ëìB»HÂÄæ7y£-T3Óx.l0g“,Wõ‡šÛeùìüÞ y ׂÈ<ç»3}ïÑ�Þ¢ÅO "r~–€ú 8‡Â“ñ_$�ë@åß«ä�íýßkw'½^ÐÖÐ=.‘¥È)í[U†·œ—ø.iy]ÆââYÞ…7�˜{Nf!Ìžý­&à67²ÞA›OŒWL°‹SÑÒÉCÙ¬šQ°N™¾JãíøàpÁqè½"Ï£Ìö&<;BFõeÙ½«q¬’ãW¦AÓ¢ÁĆà=¹XÁ’ºñÄ”XmàƒAèSÒ¿3çØbE‘3Ý‘Œ>óº­°P$ü«n±yËoÕ j:…àõs�.>ÛÆõ¢¡ÕGßR¨fµ»% † dË� ÈkÉjâûµ[ÏŠaÂŽAŸY˜eÍ8¡²ÀñE1ÀoØ ¼Þf¬_!ê¥^�±ÏÖ„é¦2jÇ~ëÅS‘|IX¥CL�3ôª´G�)ô{h¸•Ò}t°®"˱A4:s�ø‰Bk|o+ª„ )+)×umaq§a— Âò5м@kºÉXÜ0³8©±s£î¶êϳ¾ñúšÝ{z®Ì\�/q.ŸUd }ò×F¢tÁy«ì–²þͤ»÷5ÙÐ&êCJÚ—;?“¦]íjˬÚɃ‡A8q®vÚÓOØX”ÐæÖ¬™¤*ZyJ@KbÈ04)ñÇÖyìQ²³tnj‰9Í}=úp7ǽkmËÑ��ñ7@û áä6„wgv öeÆ<3óNÔ-É_�&nOì}…ׇz‚Ç£¡R} ºµ×s¾‘!ov&«Ìgº°0‚j†r~•Øæ1—Ãûæ7+i ûRõiü{næªà7 ¡RÎÔŸ¨Oâ>w£bAK*ª”&ÝÆ%ŸäÓÞ^ É�ÃŒŽ©ü°ÆL�oÁùWÍXr6bÏK ¶8I…Ý�¤¤<0Þg·Q=«ô=yx+«…zó�þúÎú¸¯vìX#Ø Efæ ùOö–·ðw·âñÂ+Z½¯g³¶1ga ]à”IÜ·e\>pÛ þZN£º†ÓA�<½¡¹Kš¶_I<PûpÐ=×W#T`é¡âË~ à\¹éˆ ë6 n]›è±ÊÅIP'"Àö ï*mÜ·“Ü�|ør»ƒ¡Ëumq¡¢#¡C´wmŸ‰1»á„1‹�ÕXòÙlšk•î ÁU¬èI¾Ç餎h~ËÁØ×àÖ�oËq# l{ßHSRã×"~­[®�ò#ÞÎøÎu5Ì�ËB"û#‘cW’àý�ÉIˆäðSqzo� ŠÕÃíxxØïOŒ±÷Ý&ÒlßÏp`8é3`XgzMý¯ªÙòsÝ“qý�Êêœp«»ƒñ<ŸO–õXÎh¥œðwDŽæµÅ`°}½sY}Âmh‹qæ$<~ÚåÍ÷׹Î{w}5�-`nk˜6ˆb iû_�œÀ¹ ô¼?Ïà߃õxÐ;sÝa>M‡qžCZ�åy5a½ê�ƒ<,nüºD.Þ~ÿ3úy¬k8ñòŽ[&òÁj‹Ï‰”«‰?Kb$´œ; "ıö#™éÂ&“º„¢…v¢U�mY3Ø`�¼„4-¥ì2�ñ1˜ËqØ‘gúæ†a¢“b5º½Ûáㆱ<ÝH94eô�ÉwIBî&ÎŽÞ<�TP~h>Ö×Ay¶pyQdæŠë¼[èU€ƒ¬˜gMÁoçqµé�Ø OoÚ UHæ±!Åö{åQJ…ðQF6'´3T7šø.ô3ÇëñI™«CÒPxh‚(Ààâw¯•*Wúk×Y| ¸] ý½Í¡iü±‰Œ+a‹”i•íÜu=ºy.Ãj¹Œ–—¾¯2ɦèM[_– ýÄhÔ6ˆ‚ç åÖιÑß8:ͨ÷�u²DùÄÐ5t<ÿa](çlÂ¥ÎS+™º|äÃêü'°Àc8ѵ…‚‚âLŸy†"óØ1¥Ç“ª«ãÖ÷ÍÜx[ñqA®†Q&˜„w±8§ 6x>;Ó.õ]̰wSÎÙÍÂÕ�ñï³B{xÕÝ ȼËÄÁëJí‚ÀXCZV²9³gÖY,œÆg×»®ÝJÜZvºRkã}°§rŃmp”6ñ,c­4˜z§³�·u¦ Äj%­ÒTÕy´Dµ¡Êœ3Ym–ŽIOÊ'€Ác Ïéª.Äi. Ë£=“~†B Ù\ntú¼-'5Äo³+/-\*ÎJ­ �{ð÷?|CG�n4û•D xlk÷Ø.-|îù€ìž–îF?^t™C~GÊÝëk8æµ qˆa÷¶f¿'È §Jî⾿Ç}ôêýßÌaÂûOÔ\dù¦�xw(4eÖmœy»VÖÌçEŸ„³™7ºš1±¥&.ã”÷z!?­z:h°Aß;�‘¨X¿:Ϭ‘ `��(»òE?ònØKwœ<ºêªbuŒ~­êýÈ,â­��†èF9ì„89ô{i"²÷± \ËÛ,­Ë(FÁQ³YS#÷{°iNâi'9Ão|Œ!§Î¿UßRW»ö•ÊfUª=Bš;ˆº6C › hA*¡e*ó!ž°öÔœÉN Ìê�”ýeÓoÒe¯Be®T¦EÇÃ5ò¦ÿ˜C‚ŒQ]îlõ@ÔÏøG¸˜±”-1 Ò?š(�Ã!ˆ«ø±H+r欮»`‘žq¯£[ZÃ*††0\އ/œ3÷©°æ«[¤|ñ” ¹‡ ú[î•~zá“ÁÉ–ì9ŸÛVî#]œ¸CœŽ«lk‡Ö³¢Ä gø"ü@¹ÀN7HáŽç½û¡ªÊUèþ]îGZ¼¾vév€5†À¬‡}/Vžz]âéi„˜Ý"ˆm7Ìbj.e¢É¾?¸, €e$›¿€Ž–gXe\1! öÁH¬qD ™X‰hÍa‡½<²iic²'1€@‹f�~bcÞˆýÌý*úòÎïÌ»\"b÷ö|/:�~H¹A‚tœ’P­S÷žÖt© zòƒ]µ¥„(ÙcM¥Þî¿GT;K°ãPQ[ÄÁ Š.ßå—z` Àëk‘ÎbÇ€»Ô!0À·Ö¨­^Ï“ñ�ãÙ{„·tŽƒœôíi£Jæ{¦ê^¨›5Ô�g` w8`åci8›òÞ9’‡^ @°ãjjDß ƒ‰ Nô¸­ñê´Ðú/Cøu6É.V­Ì{vCPÿOĶùî ’ZJ½`¾¤ ¤ôdÇ'ÊrŽýÛÖðñ^a£%¸ÍÊÎ3(Er�”NåЇDJÖ~ÝPÙw³+Ž-€&gqÉõO%�í�fèd&•!êÔÏáâÈZÇד~wœÌiqøGfzŸìm#Úq¶·}Wlj {"ÑD§-'‚´Šg Ä–ü�58×9uÞ>µÛô_†»!÷xÖ'­|þSM妯ÜY]•wÏQ“kÁÄí—L+#ƒÇl7ô…(Yî}•±4Fu°š•-�ß _7u?g_6«R¥±ü¦koUÇ�ç²™ùzGðÆaÇ¥´ñú˜]‡>ͼ›³w÷0Ñf‚òÌnn«�ÓéE40·Õ Y­«è„e>¶Œ—J ˆ!ÚÚ†h/›Aˆ?HY3Í«d.’„oþÃuBçaßî8�Þ¡7lI™Ùμ€Ó¹Å,ÙéU�Ä‘éã?^òs äy(Éíßo=Â’&nb­©x,,8Zƒæ?)å¯Ïr<ŠUì{j-¹sù— À“-†ú¹R;mŠ-1Ímh·Ú¸*D)e[˺ ²¡~4Õ“KÅ=f ¾¦-|wQП .¥�¶>¸^OæQŸFÓ醷ßFÈm¿†LÇ2Ff,:QÉçB£ŒpÙÉDúÍöãêë\]’ UŸòáó¢,c#h[0d/Ó]ʵš3‘ΓL¬Á©Þädj”B¬yú?(L™„å¿6ãÆ°qˆ^Eh…» ¡,©ý©ÆßÃ’s]p²îSχù‚Y—u*—±dÞú„Ë|»—é<6ÑØŸ×ƒ'9“º½È÷,·'Z”ÖëW(o�2Yðñç& ôpc>á�ºv�ÐÖœ ‘é±Ü[Òý`/}s>ƒÂ†‡ˆ×¾æ"}ç¶ÆcŨýY­E‡*��ïäD9£4q¸ÌÌ3åÞjœ6ä@›§Öä†}P·Èà/FhH®T¡0^8×8ã8+o±‰øú«VÎ É X¬+©Õ­Šç>ít�âh(˜}œ¼]”Òd:öͪáp7Ý­2·nUµžb¡íÃÏB™ry»‡=îÏèV½ü­³Lùv÷çÍÕuìâØ†VÍÕ(�¸kŽA‘\�X¬·N§ÅˆµÛetÁèhŽ`ï}d,´deF�5ðÝIrÀ�ªüã6à¥e!}-Íxsû<°gml³ 3$%¨:¾T½6Nö–Áv@‡,(—´e0âûÎ:Ø5uQÍç+�!¨dÇ ëNŠvTï`‘Ggj «Zê7ZËáœ�òUq�úÝeRîN4ÙÓƜ˱=CKs¶œá±ßÐ�Žéâ÷+­ë†ùÃgžD-£Z,.ŠÜ5Ö‹M)0²‡¬e;½Ý°·NÕ.ñ*âÚÙƒ[Bˆ:;°%�ÃgÍ— ÜàÛX€¯ñ½³=ËqÅL¼¯¤ì !}n÷ˆàò—ûDÞŒàÀ¶Z�¼˜w gòʈ }és�ÓÔTZu[ͨy,HN7#yÚ”MÑÔË#ã‘ë~çx5Áõ?¯;7l)›.z öwTåö(ú ™lÚÚƒw õNxÓUàŸÌnY/t¬÷±üy}çú'OÑìn nX.¶r,Ÿs«ÎÅŠüïog´µÖÎ(+]_†)=öU{˜ ÙOP®ž\ÀHý_rjÚL�G†tËI3«rÛÏA›ÞC"üǶ-°^�6S!w]›Ø®§W¸k±\Õu¿±:bÂ#`¹ 4xÊ[WRæ•«•luV´ãvå&V,m‰¹R`Ü,,°ý™goÉpè‘ß,’fm“‚Þ¦8`ÙÏãv#îÛ8ŒNzM¡æ 6: ˆ Ø8¬§Úp0h�¾nàb*K˜8ØÖpf³Éž¬´¥dÇ¡.·ŒkZ²˜ÎqºÁ¾½¦¦i€kvüDÏ^oP1ÞÄC#ô¸'²Û)Êû8¶nùå [Ôîõðc®»Î-ê^L–ÁöoO@Fªõ?³�Ö o ÷¢ÓíC›º±¦Š8¬MÜVS[=% ¢ÚøÞ$tHs|çD²¸âå~êî–)ϯ¬‘>hÅñš^`:ÍeÞÎêÃ}môP@ã¾iE,8y|˜iÎ’�·�Ö¡¦§S8ÞÍØo•Í€‰}_`>¡ éý~ËXŽ[`§»Ç}PONÕ6¹²{x2ú¯es·=!†úªùá}5;@@îüúÁlÖ2BôØs²sî'žâ<+»|ð¶ñ"7°½BÙ\oÆ]ߟ?ë¸OàÑ,‰è Ýbµrõà:¸EÁêË 6{ „èÔ©ãq(r�½ž�†\²šA^ DÑ[.ðêDÏp¾› Ÿcë‡ÓM»–ˆ2âJ¯zð¦è561?#]‡.C\b�ZÒHoö€åqD‹Ë=6×Ã6XíÆÝDT]2ÿ/ɺ“^; CÆl€]“©,tù�CHÀÚÖL�„¬¿ÉŽë¹…Ð÷¹Gÿ¿‚«bK€ÚòÇ`x¯“C)÷0?{ÊÚq &™17z¸æÇß]_UÚ»‹\S„}§µa9é~1ëŽ�ÀŒ6ðg¸}ë²�äMiB7Œ`+Ïmëøu‡á¢7}Õéqlà\±b5óS’¶¸�W{�åCÚ}-ÓLïÁDÇB9Ù” ¾¨ú«ÝÒ"!õÖø¯b\7¦Umbô ¤òK\2ú7¤âgDPœ,þb; ;g>Y�y+ˆ6×›"Y �wXknÁ¸º]€^9v àÿ7׺íRÂzµ¢l5E‚†]ñžè8SJHŸ'ÓFû¸�?`v¡Â÷×i‚1NsÖÌŠ/¾×k ù<ÿZÁ gˆN …µ÷e©ƒ.ˆ|h9ý\W@ež;ŽTà¥ÈÆÔHÑVü¾4ÒÊY›HX¯¶„iÑç–-Nó— ›Ïœ1Ðâ½fœ¢ÜxÅ>úBü%Îlá|¦íSÀ—Ÿ“{¬Ìõ£�¤÷¯uû?t¨k¯ óÏÌ·âÆ†7’ VNºÓ:|~UŸjÁkî"yTÍ­Å~ÀÒìKW¼9@´uRãxti�С¦ô0cù�ŸP�R­ž|}ç58,‘`Q'|rz,®2-û:Çp¿&J=æØšñ0ý°0é)~±ªƒÉvËy«m€ÅÚ²bù°M>¥r _]#g«5b£ °³ôÀ^;Ù¹•‹Qßu=:KE0Áú×’&-Ë™Ûo&Ó«¥Çr½FT"ì¼ ŠÛÑ ÁÆ&¢–�óR¨¸ ùêã`‹�V À£)”È— »RhÛÊ�LýÀúnCŒL èÈ kí×7V ²m¬ß«íÈgY2ý»—�÷Ÿëì7_a¬›”•d•Ñùªù™í|¾M÷øÿYx•®«0€yu6ÚŽ õÌ$e5†´Ø Kå`Ãb‚£|µœ‚X7¹fæ0¥€�¤•gf…§ Л’s�[ëÞ›-~%Î Y²QOr‡Žkf3µÀ>¸�¢^#ÖaÓœ²i»gæ{d(-¿«¸È"ÐØ$‚#ï–ÄWß}»b1‹­Í@OM ×"¤Upºä÷5ÉŽWÉ£êõÜ‚8ËE÷B|Ö8œ#)]°£¹ºaÙ£9ߣ1Ó\†ª†pÁ¬RþŒ„�›@U&¢ÇÖ¤1øÀ®YÞsfDè80»RU7G}•{Í�Xn‡:§>o?îhߘ:G~}Z׊ Gì,‰5Ø\Ô†Öé'[^Yz-jÂw¨ÃrN ˆ²+͘ÃK¢—Ëë~%sÏxá…g6ÂÏðŸ²�é³½fUŸÎ´p¶ üø¸ï lâW)¿IÕlš¾÷·]¼]·Ãº'•Δãåÿ+k¿]’¿ ~ü²ï�Žçä\ïÝus¹°ffoàÀÚ4š·Ùíë„ÃâÌŽe0 òr,XQj=-ÿ …øñTÿôH—~Õj3ÞÃý»FMm,ÐAIsçéy¦_õËJ8^*=0� V¶Aͧ»¹¶§d¥êÊ„ÏÂb”ÁŠñN÷P~¼¨VÜcÄPH7ûc ª>Ô3†Øzh­útM¡ûh8oÖÃ0Íýù‚mòÓ(ºvÖ£γ%ÕLl/éç¸@Ö€��ò+¨|Êo(h^wÍqX7}Ÿí­Œ]ð„F™3\CÒ˜é)­ă* ÿû4³ƒè«˜Tõ~Fš[DJd3¼üÍ >¯†�Ùn ÓlÊËÐ%_:¬_kÛN­ÆM¶þ~~~~´’±6¨ŸmH­7!´0.ææA@wm K……飙0â�ýH6"p�=nbi K‘yHÞ8öb/ ?†ØîkšÚÁ" gšG½,¸€ÑO#¶ÿóóòËse)«Æ (gUB¢z¥ÛQìÙ_U·šùxj隷�«þ?PX|ÿœºú(ù—¶ ÄúÖˆ *ò7úZüªh�˜FiQñ”0dh ¤œj‹„ìÑ>Ð~¦DæÉÒ{5H¡ÒñϺ¸°Ây唿�b·¾R._ñ^£Të·‰§‘$û!TAö6€G¸,à“»œàˆU"™(ÉgG:¯Í'@áý�TÚÉFgÜÜ+Ù¨-?ßi}L7ÒŸ#ðJÓ/¡Y/ýó¾-b2n×# Û¶kåÞÒ½Y8c,ki·· ›òØSorŠB²m5¼�D�¶ª µE¼ÿ’üI×-–j<â°ÙY®íôü…ÿ.Î%Ý«'o„æ$ÊW~žhÉDß)ɦþÿªÈôÛJ(²; ìÒT�æÖLœ—ƒw߸ ÍØ�2©‰—'�Zrx�6ݰ*ä÷ë{Ÿû@f âÌÀ«¾¹÷z]�¸âÂ=Ùubêëhx¼X%*vó VªeàÂÒ\d¤·R“”Å;ÙÙ2ÐRagCظ?JšébfÀjÉ0?á™YZÊ6û¨dAl±Î5‡ø ¡eÙªxâÏ>¹¶xqçø«ªû¯”êî/ÆL×…öÑ50r“�nŒƒƒh.}Ë›î¸#tù^,O˜yÒH]Úþ~1“ÕsFß T§¶‚\èˆUÌéRJä¸å»\\ç¬ÚÎ r@†ñ»�UGÀÕ·üピ8sß×Äpît¦XªAUk§"©¾B±T/É�ÛLÞ¬«låšCÚòHÓþšæãýž÷[E+ÆAå8ôrʉ+ó÷ôDm¬‡�-Ï™_+OÇ”U/¸K£Lð0ewÇøñ>É;Ík7ô¾ßß|‡ïKÿ]iVé�`ù¾Ôs"ô|¬òö´/iÔSæB“™€Ö¿pýáâê¬!£¢¦)`Ë›Ô3m3¨K…+n”uØT߆¿&Ñp䮪íœ#7¿§Cu9Îë5"’8µ­'u¬=D9Üè¶Jv´’åKêæÜ†Ý£c¯äÀQвœ+�h [€þb åßh®‡ R9|kÏà÷ öÇ»ÅòžòÉà(4GÄwä7N[”FøªSm’´©®»ƒZÅ[Np²ébßqYLí§Fò/ßõr=MƒÍ¯Ê�M|ïÕó�CLÿ/ÖØ¡5FÊè²Àüü¥V.žEDþ lðâ½äÄ9°>å•0X 1 6aºÔö° ÀÎ+W@~X|¡@àxiÙ\©¦Åá�ZÖM`t­C'¦/ÊTBÔ³å‘ëG½|PlXõ2·šÞ9Ѩ ¬žãxCã-P:N«_×�Ô×0š˜3ú¬›|Ç„à«no¨ø€ÿ•½QÃ%üïy鄹Soý'3l‡ö{âò¤N¯W¡ëÏøákä’qB#ÀöšÁ[˜Ùš†L,©w�bßçH4M©Vˆk°ƒ†ýÄÌ4:у÷ÚþÏÂÎ}àà81jA�]ÀÇ›Çâl)Æ6�ý÷·þæcþ‹¿øÛhÑ;µl{µxñº!½ñ¬mê=ƒÁ_Øø§.×iò~·kâ¡§1üoåk˜æm‰ Ð/õ_Yã[?‹Nû>¤Ę̀Æ/Z4Šë”¢îYˆ)Æ),ËålöBÇ ÉüTàjÀÿƒtÅå�Œdû‡Båc6ýÿ|nÜ©pçD²Érn€&6ƒ›bª4GÇKvz[@WYõø_Ó ýí¼‚ÎD°*¸ï¾ž†—Š©ý»�îPœƒ»;† /:Èlg7»¥6®`úZÖšËö¦.ûÁzO¼{Ç[¨9êʰ¶}ÜñU¯ù–’q¯¨è.-ªï¶Ý{?V;½ÌN’À2× &ƒ(…@ b³x‚Õ¹Ù§+G —L3m•Jæ1ŠÔ,óqþnYúVšÓ[½h`!Ò°r"kVéE_QÏõp~OŸ·\=q õ!€¸+eþ²ü-ÝZÕsþðé›rÀˆJ¤dbFíÎp X òí!§VÂa¶R&aŒ‹®Çpstÿ³2<Û |¸EZM—þƒüi‰5G®îó'z$iÓC;ÆE§«këúþ‰ÿàƒ¡¯t4¦ûؑݿ]ê<ÊPA¾‡ÖDñ—³ ü»åOýÞ–¯±ü{ïSåóFÜU>Ú#�Óü3±WTù9P·9…‰ÝÇtoüìÙú½ò¦u·…WÜVA£¸’0m‹LT©. ?Ì>àågPtßî‹ ›zyþ qp™p£:Ô�Ünî‘t°ä>8âa–Ô Ê‹4 <7Vq¬ê­¨µtžvÑÞ§3Wl‚ÄßÔ*/€áï�{âRø}‰_dèÌ’ a±!|^¿Pt[p“ A;…µyS €:Ý.:¹®‹WØ2ã8¹¦ÆŒ O�›cáæø€.Nš©º‚èçÚÒr]—ÛÓLJ¸kˆK¶4˜H#üöÒh¤±ŽïŸ7Û¾ìE=îJGæÿµnÈo¾[¦ßá“»w,9¼-.~øù¿¹œ¢]ÇUnk)/ä¡€°åŸ2ªáA-×¼(=Qnp5Žj¨Ó™;q° .sAj}çÈúÞ�œ¨ñ ¹4bÓB~+ wÏ�Êh)i�“ÙXÉHDKáN+•” �ö×N d§ÏW! =D‡¸•B8„Á,•-†Qs�éXÆ¥P'25©ïwÙ®4gNåpÞ ˜°³H\s¾’çD5Î5C’?ð(E±k¢ n#‚û*3rÍ™`�kÜ©0?jר  h·ÁÊd;›/;KN£õ R¦PbŒú:À‘˜ýÔ'm#Z®ÑöE&ËœTÚÚç:�0øäüRéàeЬpxCRc]S Ú9ŠÎë¯hS‰È"—Óýán«œkù¼¨/CqÝÅX0¬·8F Yí€í&ê†d~AO`Äáˬî• 5ȳ˯Ná�<õ ë�{[=òÌ qùÕn¡çº\iy¾ÏŠÈùc Ö¼ÏÎ\‚ýê»z6É-ƒ~—’B~A#ž�y¸ £7ÎuYWy\¬ œGjøqÒ±v¯vwP÷ÚÄŸüsgñWƒùêê.áÒµ (gWmÏô£c»U’ˆDäú6yÛœ¶N­È2Q?ðÕ6p‚Ò�‰ÈÃ.Ú`O³³BÝxÍFa¤xl_B$5†$!SÃû¶p_ßÓJÖÑ%¾mkpÿôù�ó}WdÅÀð½dÅ'¤€¼ §-Þ ÿž>Cç+UýÿcÇ-–>Uü® yŽá�á8l|Q#Î�ÓÈ.¿¼烇"ßr�H÷�e' 4�Ô Af)JPõºAŠþa js ³%ý‹EXªÙª”ìÉ´œ/ªP y C5``Ûf|vóuj£«`Ü9¾µ�nßáàVœ¿Ôž=ñölÿÃÞŒSäÍOñ“ÐÃ*&^9ÑY€úÒ†�q‰0À ¢·F#¶FT¼&¸�“´ÒôÑxV+XlÔš¥RwZð8ÿwAË•-À®¡xÂesvZüaµ½å¶&×ÜÃí^ø;¤c.l eâqUÿQç7·°_ïPÞ8Ïõ¶ô½±`·¬tò€Ù ¬ž [¼�2ÀìÖÔ×7Íàˆ¯£þþwúTïÈ"Ðkýß�¹)ÇM:»{—¦³ÕÞ#±f\ k'oðìöIΚMz…[3Nmqóÿ»¢t Œ}Ó<@ÍÑãü;�ø&‘÷ö¹uFFÑ*ÃXåZ|A€×ó.¿€�‚¦Ûåùi½ÛE‚Ç Í€´2nÅ¡pk}å¤qˆ…»{<Ñð´�‹Å»ÚZ€†élò=6.‹^ÙÞZ>¶^`sF÷-뇄Ü×x[™”ûÌ…¬º¨Y®ÇÌáô3M¿«/®#¾Oy»ã*�•KƒØsyÅløPÁÄæ$Ó!Z;W&8Ëíöذ¤̲Y9½Nœø”|<à3pÏ¢=ÊÒ@Vü´q¡ŸUg3b=‡¸‡`Hîä"sC{>ù”š4‚x÷†c§8«Ó‡¹M#8m1ÅzªÎ¦=#TÀ"©/Q±h¬Ô”(ÇÎåÆ9©¶ôÏmvRóæI]Œ½.AÈì͒Έ¢CBu;0kCå ¯ŠÕö9eJê¤`›Ò•—G0ÒâÁÏbyw¿vב f ‚ÔÝ}ÀñËsh!e®/‡¬¦\ŽD£Á¡{)@ƒÌ^¯E¶3Ôù¡vL¬ìÌû9.—˜–(¼.£l�Èl±v·v棛¬ ›Â¯Ýæ45?F_I™™€Ì˯Úíâ‹bÖD]�ÁtìXÝŽblcº°u0ü+| Ú—ðXËŽÁM4±†|0h>sn„_¸P3ž­/ÇN{ÁYƒlpªVèaóͺ)6D%N×-ÕµA•ö;`«yS ’å!ƒÈÇ2D†“{ÅÀÇ"ÀÖL?ºAqz²H¦ÅIi¶�‡³(éM¶íO¨+• �ýzKoZ•í[¾\Û%g´]ßu Zê…óùân3KP!Ö§ßÙÂ$[†Fúü¾žÖ6Jðè#„úç™›pM~Ûo`¼œèœîÚ±1'4 K¦|j�f.Z[ëP¸ÆbÌ`ðº+êÉÛáo-=Šå¿kL)º´_J¶·&| ‹�rvT¸t· ¶ÛI�%‚µ‚‚¬Ï—¿5÷MUµºßvÈï ¼){ Ç9D%än¹¯ž§¸“×-Ù3< †U`�Tû §H/Ÿ?3Ÿ¼3§‹õí¯–ùˆ¥·ª ­ôŸà†Ìp·“²\>ˆÈTvß`wVä�bÂÐJG½­6swï+vóíq‚#“öH>ZTá[ïµîüÍ„ð3óÞãRÒŸzÅëa+vÞq¸¿�è¸/Á­&»¾<Ë¿nNÜ{ã·‡‚µ i©~™Þgd"¯m�ËQ]õ�ù˜C,7/ë½q)ì€Swµá ôˆÝ#,úX†11$©ó³_ž´«˜³WF)€ê9rJ[8"h~ Å Ž©2C¥}Ú3ö|¥ÃW;¬aöq“­é²múßn²[óÂüA ‡ŽŽî)éûp£Nä`<$:\6Ef�pnä$zÀÞ×-‰ ú<ìÞy÷¢L!hlÖúvàÓ8Ö|%÷Û‹ƒ-e#m�6)¨Æ_%å½ÝÃÃÇä×&r}d+çp‹/I`Œd†ÿYÛõ,#<ö|ž¶jskdª‹:XÀõ;Y½Z‰ä+¢4Ƴy•`XƒŸ~øI §ê @f¯±Š?³JuR˜=¤ûAàbA~âÑþ¿·<÷‹kar[|·0ë9l ·�Žõ9&×M>áVS&[_Â=ü¸iNÜn;Ó­Ã1ĆrÙn}¸å™z'Ï·ù v XHìcØDý·ðZÔc…f´PoZËÕä^ó�M±1%6Y;ªv[¥7BÍoF7ϦØÂÞCÎD¨ëX9!K¯›²Þå·mØm½>õ(8ˆ|Öà7½ŽÙë¯3[bÙ’ûëãØÕÕCÂàBSI¸Ó´š5l¶PïDÀîxMZ›·nަdîÛbJl3xñÚ”è« ‘°Z¨§�ȆÁÑÆCéÙXŒP ]-r�ºýbÎØ{âd¸Ðº¨ŒÖÊÃáx åÙ5 ¶ˆb@:t×Nó{,ãZfÔä/�Ñšøu=Çj6•uB xY‡åÝÿg;+�{ „΃¦•ªb«q´.²—Ì&ùÀ›†¸NoÞ£±ÁG,’ xôý²>®‘¿K³Õ-A¶ŽÙv+‘Bäë`uÕ¾&ÏÁ£Ü"‹ ìrýÔd½D/‚0èц‘uMÖp¹Ñ »ð�޳Y(ÓʯØ²Ö _Y¹,m¢ÙBRs©YCî僃så�> �ò4¨ÜŒŽm6³Ù±¶mç‰x¨]üxPiŠƒ6ó_ug!•±éùDº n·éËŒ$چפ[VïY›\•­/Ø[tT¢r&áÌ¥�lz:bì¸þ¿NG�f£Cà�á[wj�‚ Ìy›Â}�õÃtíµ…O?âÖóÈ�¾Œòt)Š?�°[m/JcA6fܨÓ`¼ë0rÙÀü§¾x·&àÑÄ¨ß ñ†|^ýÞä­¹¶ËürøŠŒoMñIG•¹ô:–ºXÜ�e~H`$´0¿Ïuú«Ìc÷ùþeu½)¿>-iœáϹˆ­2z«Ýk« ”¥¥9Ìô:D*[âø†ê>sv,£w;pß“8a‘BÏ'8gt!± Ñmp¯­‚C=·%oe&@=ÏYn„øEz×ÁÚNQàcDøë—Ž>Nô'lþÅ« M«âíæí!€(çug[kµ‘øãÛ†çžÕêOX¥K©Œ{Uî†F#{ج(„ôqú¼ÎšÂ=«שÜÊö~:4‚RË�ÇÜÜag`³�¤ óðЂ+Á¿œ/x÷_÷®¾S�l[x¤˜;ÑïÙ.Œo#ÏÒ"œe³ëKÙóµ¨ò8^ú�ò=Ò±àÞÂŽû‡-ð•uH‡‰=¹ª ÂúC«€[_½ÓV,[PÑÁ¸ÌÌkäքž¨]m€l ¡ oOUd­¾‚æùN"(‚G<^%¦' À -°¦R¸N=Ðæ5�‘ü<.Y. 9¨ÓÏ ¬º«fqGÙ�«ÛV&< �W­T]Ec¹¦tltvӛހæ…;'–,)_›2²a¡*¶ŸAuç'Å<ÄœˆvÔÍ7°l‰n~ëÜMoÛ¹½ŽÐŒô·Ÿg_>#cÑÜÉ,Ò²XfÀ‰iÉm½=þ%Ààq¸Ų̈vи¼XœŒ€Kq~Âß>ã‡X�CàöfpÚºWL¨°7ÎQØíZÐÉU?wm;öĆéfI ”É®!Ýg¿*ôv8+˜äo”ûíºŽö™&·ƒkBÅ,[/¼Ï^“P±‹ññ½OÊ3°¼µû�§>Eû¹Å' ¯±nÕg1€ÇبÓvˆG†?²WRÖI­¦,ÓBáÌØGÓ0©ß8T\Šq¬=¾íøÁ`›pSÑ`èm�¢7§qG5Í_Š`hÀiIĽg"�DŒ†?ö„·¤ËY%#'¢î­NöuÝ�Äçf-�cñ [°÷£RFÁÈ®?j0nésùTšñãÀÐ?Z®+ÍåÑgÇ/!>D�3OKH•®ƒIj´xWÉM‡÷‹R³ñê©§™úù~#~Ö‰­Z®ÚeñÏv~]›vúsí)ö¾Œ~ÌûË[1}ó­Õ�ôëï­°åÛºÅ4ß­Ü$il×:{—ÈÑõbpûƒ+ZÛ\õ Œµ„{pS¬›Î�L÷ ÷0 è·¬L¸H¿YxtI¡Íd³ªš>�ÀVôÐ6 ‰�›šâ–>°“ô÷oˆ½¡Þƒˆ4 é¼¾Vìù�ï³v‘~¿£ƒDvv§¬”†z( g˜ër]FÓõ�4U¦¯_C P Y6%®çu¾¯Ÿ¬uÆ~³%|ðªöÛÅßí£Hdï”F%øôø#” Û~à&�‰K™RÊ^ ;XEVÀßvÓ£Ñ5i×8YÐX‚+xeņ„Çjºä÷ ÜÅñ…”Ìâ¬Ö"¯õ;ä/òר)üî² ²fV„Fk9ªä_ŒàÏϱ�0Ý%n U!æ„>Ì™B„ø`ð¾/Ü£nQ3B–ÕšéÝ(oªý™ÖÃt %³Ù 8LÚé EÖƒR¼Ÿbõ1­ôÞ>Œx­O› Ê᣻Cfåå9³Uñh +�Cö1d–>ÀsÛ?1N;öÄ;K®òIÓGp }ôˆ¡Ám_ØÑ’¼lV³Š2ôŠ›“ö�ÚtY,›\\uo¯±û$ÿL{5¤ìdîøûYr]¬y‡Ãú€ùÜ»uØúM(½”;wEøŠÑˆñ…2_/‚MÓÓþ²¨Wg|k— ™ÒeŠ‘¾H£¹ß/Ú…Vs÷º-¨°6!¦æa‰vQÊhüÈl¹3éMcyÀqBè¨#kSçä1Õç¼N_jµ�±(×-°±›Ä@­–úÐ7æ§ë#ãÆñ%®fÜÑu´«ªeã°òá{ð(wÓåópyÒšÊÔK¹dŸ=•ícu°µ‡díõ†ëöá$yÃ|ác:YFE‚¶2®–7ôË�/%9ýñ·Ðžg;C´SÆsö›�Å>Æ,]Åiæ¼JÂL6H�ªÅk=Œà\ Ài%ý‡‰fOÎYœ{D""%Å ÅkÜF¾€¬ä%š©cªˆ†®h+±¼Õõå,†<)ø÷Rús�»½Øœò-jåAk�«•»ñ­‘´ó@ °f=Uí06•è==„ ã¸ïÅ÷ô”œt–áWb<ëØ¼Fð;;å–9•ðfèäßµ´Ê¸lNY?hGÜ$|DÞº›ÄÕÚCwÃX˜^Eò¿“QºÉjóRDûÄš6Íy¯’ïŠÖx�¯�³²ñFéêBüÍhÞó{'ì%’I�ã/¾X wq#y?® |{I×ຽÆ`.Qe("Æö'¿t®ëšêÒñXìÄV™[ÕŒgA§ÎgÖ¶W¬¥qïºÑ†ÞÌ÷ò+šÞ̈ûË[¢úðx1#={¨€Ê²J­Í0Õ6ÁH±iKh‚жû�¾GW´_¡C¦ ¬X&Úcïº š»º6¡KUzuYÔ1íÂô«lmóŽÎ9‚Ž}�}Ú«‰ð 9H�ÈZPå‹ç]‚Š�¸æþëûWÑöýÐÞÐhŠº!oŒ�¾ùä¯êú¶@Uk0%` w‹¶�ù¾¯›-íÄ’­Ö×Yç|ö˜.’· Ü+çX á¶Ó {šJö�€»A%�*0]�¿žšè]Û zÊKŸÃ—©öDXÚþΆö¸óöL¨ú /…ùS›À.«Ÿ!}è›�:I]œþʬÕÇF_=iaCa cAÇ#‘O’Ž›z‹#âçi®µ³ hk“âÜØ:&tÙüi°ŠÍ(û3{_o‰_õ8+O0�·¼ìšl†ÉY͆wd•m{·Å[Äýi°Ïr˜’•o�¢V e铚z¼}Ξ '¿ììÙåÕ1Ì!"@4ëJ\ÖšÊËðQcªi™ÐIÀ’‰ ð–¸.àMÊJ׋ÆB(øi±Ûˆg‡ ËåíCŒ_±¸ŽžT$ úœùÐL¬Ÿ �ð„kÄ}}Ùß—”0‚SóÝr»ú+xΩ´ò¼;|Q‘´ÊUañè œû™Î ·‰]̤EZ… œ±pÉžñéî.%ܰoÚDXN†ÎíÆ;é{wAˆX‹*�s0�Й°ò',g>"0|Nš�©•Hébì7gI{—èD3�¹»ðí›@pN�ž[ÎL?¤-ÚÅ~Æ3àsŸîð¹B@†öÖô^@ÍÆ:m6î€?]$­’,œÛa{‘ ¿�´ém[÷>Á¹"ðÿµ‹µpy CF»/Ü!äübØX|‹xáëª%½êò·|`p3q{¨iÄíucîwöQ1¦.¥s«šýÎòöFÓv.â“Wìoú5záF�âÕu wI«¥Ÿ·nÛþ~Û(¯”³ô¦µ#ßO=ÁAM5éø£ eóóxæ6üîxÑέ0!µ"7Ø©›y^/˜²Á‡¯Â® d&ìË«n?³TÞ9î1áš%ÊðèAXî1ÃPÐc¢¯·ð³QO€ó'p ³¢ï*[¤^qз˜yjÑkÞÃÖÂû™Bñkº�˜ßaAœ:i¶�çë(G@pïyt>õi·ÇA±³=Œø¥% œX`/N… k¯ÑϹ&Ô8ß!{²æ1µîÃÞƒè å!àî�-gåû±1‹ÓKãÖÀ…\غ¤w2KIõ£¥YùÌ3’ù>AÍ®‹™ÌðmUž „HsÑ¥¾.¤6:5ßãÏ :JóÜ9ryW~�E=Ç®·iè™Ë¿o#æƒl•�{§Gæò@ØëX©•ä�o¥éÏyÏÉÑq² ï€YÞE˜wb‹›èOƒoPcU¬çŸ!þ*Ì–Nmiën, O™Èóú^ȶÈc8­3ÃÉl8WUœ,8.˜óX$b‡k÷'–‰×”ÃßW£üŸNÔÅÒ¾Û€¸˜E¶üz˜)€f�Æ„­÷Ñ·¶aÅà … ]Ól�õ–h¥BT¯�Šå´R†™w–Q}ên¡f,.8%ÐëA‡¼Ï0¡ ™u ©ßÏDªà÷3¤7¸™*’ÛkÝ`,Lãíïùîˆù´GÝô,×x/Í•÷ןm¼ù¸™ö΀†,ÅB™bÎ.wÃÉ7ê>4‡-'­ü¹P±õ®Z¹<`bëÁsè^Ë× ƒFÃ23¤€ªÂß%÷jQ³älý98òñ¼gzzà¬Òž ÝÇ5¯ÔHçíÃDß y‹fodrËñ*ûQòã±ÇqËO/rmª9ÁY·Øž\oX|°0ý|Žè~’ï9<µm¬×uæ½7kn¹øX|>Ï· ÌÇíu™'|¶OüÎí;ù0Å5Ä3W­¸ô=ã”Ãù{Ù#q6ë\ª*ÀDÛùߥ(X|�Ã6NÇYgW}÷(G¼bûÝb ‹›U>5!ä0ÙäÛÚý½x£/›Yȹџ ÄÅO@…�“©y#Æ�¾.8µ¶�¹èºd]ªÙÿK³1Ùõç'Y3÷öºØ­ñ–‹ÀÑ?|M_OðÖ=¡vK™ûÁ‡VK~]ꉗ-Š6c98ï­ _ÍÈñ {ÌZvÍ}y󘜭ómÉ9oËX÷$'zxç�âSa}þ´H­¥ñ<²sON¢Kk¤Mî™ÓR=ÓÐÙG-õÜp2;�F˜3kÙÎ÷Ü}„óOKO k*‰NàÄÊ«·P{Ä¡Â-=¤ûŸ�`Tr|Ol:ðšMlŠÛ»rË6yPÕ-€œÕ±íy£³³Ëáf,”xÓÞm¤xvV5°üÿfº…Û­9%ﺾIB(»6m<D(Yíów‚!­Û±l¶–�I¤÷5ðµS›¸ØZ9ÎÅÜ}œYokˆiS6&‡��zÞ0£h°­àÒx¤¸ò’Atê\aŸGzf؈ٮ·nÞ‡nÒݼ–Iìù¶FhÿŒ@óÊ�;å„ÿ.J�É%}Xs¸‘ª°âLñömkŸ­… ²HŽ‘¢Þ@«H'oÏcöS¿ÇéQï&ѱ„ÑÖ ªCŸ¼£,~È‘Û-7³ª„Çᣪ ù¯çµýÿŸRÕv\ßÃäøöŸeýÎwÝú`ÌÌxÀ1û÷ïÀ™¢)øuwgE<´lpPÝ„ëÖbÓZœ“ÆÜÜo²J#‹C,lÀÀÝôniGçìµM.—À$¬ C_35zÚŸBº[ï9:Œññ~øPYÇ-Ø*ºÆ—£T‹·7D7)ÔE“1 †r©{¤Ùk0}h6ÊdV ‘È(Ú,‡Ý>b¯®U@kzÈôxùœqX�ä+®·ön<‘Ù—-²ÝôŒÍ˜×ãcKàÕm˜uÇ¥,•“Mªsôüz¸DŠW ¤6‚‰cëèk7 Ú[{:^kšÚŸ×ºÕ kK‡ýœ’-7xJŽô€�•çV�úëëͦ ¼%Ǧã‘>XM wÝ«÷XxGÚ6'^Ñç‚øo½ò¡í¹p(ùg¥ÊCæ²×Kמ2œî/álfy6�ÜÉ鮕V«XM¢nOµ™º7äá|Ú6|Ëc‹… ´–^þãÂ7†4Û|èA¹­-ð°M‚_^BŶ×(,x€aiÔu ó.1õ†Œ¡±’k®mm"lûøµÑÙ;#Ù…5×Ä“aK P¸¼�Åñ¤�ãàWÓ=:î7X?“Úáôz“õZT2m¨Qº‚åÎõÁÄ÷ëÅÔîÝÈPŒÔÈpE¾ë¬™àozÄs ?$<ÎÖ‚¿ ™B ¨]PÜÚ±Œ»ùd Ew:%öÞo{BF·Ö¤dsQèýÅíØAT•†ñpÏ�`„-BœnXÚáÖ`<:Ý·égJ¶œíàëC•ý<�u˸¾l·úÚZŠóŸ´×bØ8ÈÐ,ˆšÆÁ~_II«ób)ÛÑ67À¶œ×£l#.‰ãŸQs:.±Æ§({bÃ�@³-ˆc˜LP§AÆÙÜo …`‰# }›"7§³Ÿ•œ­G   `ðå°oÞze>ÞcNž®]Ë£«®ð¥�ѤTc©8\oÕdÉŽ®(n›•°ìwüˆoËKÐEàd¦2�‘ 'qûל°?¹ÉBmp|A•ÚB@gS¡ ½£SÇj¥ý´È¶¹­îE½3ß°k7V‡Ëá†@ñQj!âÝ/«d/¤ �Q–!Zxáy»Ê°– V*4æëa–ÐmLwâƒ`1Æ•võ¼êªšø+.o»r£zQ[•j“DT¾Rt5 3N/3¸ üÊþ¶±xOˆê‰ÛQ‰o sYNH•ìè�âúXûWÀE]9¿=X�À>_5”9# %³  ýqtNTÇuɰTÍg—Ñ ýÛU’pÐ.W°D…ÒwBí¦íÝ¡›!Í·R˜ŸÚ †¶Áy—>+[:¤ض¿X¢£9¿˜ÁîÆ· f7™yBë,d.+_ñ]YoéYà mùQš¸\.¤©Ÿ†-›ww† ‚´!ï6¥ö&ÿB ¹Å‚¡|È_Rw>6�¬4Ï–1vJhÇ‚ÙÔas· ²ÖÂòw Tqµ^ óÚ^Ö›7‹0DÖcÑUW°¡â3-“†v}åï:ý“ÑŸª9ô/Ùk‡$MÈ炉Åb½ËDá<ùzºöWìŸ..»Ðå@A×[&wý�‹a÷,Agt�jÑö–9­û�ëÉã�l_OdÝbw¨Ï—†ïcö:¿¼éì-œÑš7µ:ÑßEØÏ/º™tãòóú@“ 3oŸKe‰ÐsÄn:½c½€¬Ùn�iRf¿É‰Ïû u!5ù†mÏæãϸçSòNñ½f ÇRœ\çêÃóû,^tc°€ôx› $ M—i[Ýúÿ¼Í®çó4É·¡lÜ9”Ǧ–ÂÞø&œµ­›®Âw.Óû˜áº†$Ì}6»ˆ“ÐfÔÚ¬¹sî³¥ñYH“%µ×Ý©x ‹°è>pˆÆXƒg‹'î”øiQ÷§Î¬pkÔ1óÕ¥¶)Œð!®MrLhØBý9벓x8¿¸%Àåk‚œ„l@»9ù_ܹ„زŸJÝCZo€ˆ¿cì·™êÓÍNF÷½�PcÞpMÖ/>T˦DƒóÁv -¨ è²qÞ¥ñ›´ü^êÝx7t>,µ™Jÿ§Rž5ì? „ÜפÀftÀRñ!ÇœL­Æ�†5!‡Bø“M`‹ú'¾¨ÜËVÐÑó�È>Ü þÙÂåüVQóãÐ] �”õ(UaK….àŸÅ§S,¦õV j^ÿ®ºîÌ ¸ü_¾å¥×J¶²î1õ±4š_«6›‰<�ñqVG·ç�¦5âŠ9R˜AH«‘�|„‹ûÖîâRí„‹k“:ÌÍ-š´,¹H (´òض°M£EÀî ®|\‘”䬎-àÌu9XJ1ß41yLÒƒà®Ågv›E‚`›7Ú]þâ†ñ$Â.7 ;œ��Üú7¿‡˜±cÎ!Kù%,ÐÌ)ƒñèLÄh¹¼3}̦e +‰µý £WùT9Þ@}R9GýÙ>¡jÝøbp`M]¨Œë#ô>HiÓ�@˜5º'‡+ÅwÝ›Fé’ cò‚Œ7P2·2»wA|“å‘P"EVeéÎ÷$_O†aõaÄ� �91j`­®«zçºÁY¾¼ñUíû¸ªÙ—j(w]5³†Ý“`OSX±»Ø@,¹<Iiz—ÆáLÒC#P©i�ráiIÆÎ¿]" J•¨”/¬â€:»�‚  ¹o+) ÈX�(]¦àY.L=øø;- ¾i¼öÀ}võïcÏpÞ÷Qñ÷CÏ £°Ðó=¼ýI¨(›y¹[w?ÚáË“j‚t(1©±ÐA@¨9¢äø‹Ä[_Dà¢JZõìû™ˆb¸[ ÔêÍ{øŽöȶ­kec‹ŸŸ>ìg~Ÿº½ÿŽÐ`ÌÌÆæ «ª÷ÃôÚö®�êÿFzÂ|åFzY.ß—æffaJüÐþûÍ öß¶.´ëê4˜‡†;ÅÈ&®†ÐrÙËéK!]è#^MW:é¾vgìgH±ÇšoúŠ7kŠ o8ïLƆOÍçÛß§‹&s•\+ˆ)KÜ,Á±ýÃëÄ\¶ÙODz‚$Z ôsc…‘ÍÔÓPø48À]=‘BÖ„ |&ݦõ“MTºl„‹”P Á–qе¹¬9sÊžjpÎ2µÎü¶°õ·Ê>?WÚ%†�µŽ}oÏFæqV,§Xmz‡o€œ�öˆpä «sVæmabs¥pÇß=Âm®X»�åªq4Ö³ðt©×Ö�UŽRÍn~ÔÎéß`m»æãÒ÷¹„ŽÎœqÞQ+¦lŒ[qÇ‹Êbœí 矹Ê•3ò`¨ÃIžÅ[–¶Ž\‡£! Taimú"Û°3Z(½e¨š‹à 2g€±Ûç¸ÚFª)±Ò‘¼6è@ë¿ö|Ÿ¶8GÀͯŠÖ¸TkϨ»�ç žg}½GÑ5šûB3í[Þz˜”ÃãŽ'81Ó§8¨ß¹aÀ‡“áÓŒa¬Ÿ$Aœüàï! ̬ƒa�åÈøŒúËHsuSÂŒßHÄ^¿Yÿ Oßw½–ˆj£”7}]&ÊD¸s®êÉÆaU€×n³"«°L?&Ê{ý÷yÎkÞ_¹ÜÑ£oq³ó±|Ë�ƒ­–¾9ÎòbÀKqÖ;ûuïQÅ)±çÖ¡#¾ä,©ãø/àæ�´ÕŒ'ty7z è6¤ oºr J}ذiP]=¯â-~(¨/ÃÃæ¸”Ńáé�ðb¡WèߘL@°è ¥�y¾@DF&ø ±õÕ˜1BgŽUåá]l .®ƒ¡ËY²3ÁlÓVø‹¡¬)7‚™¤ŒZÁeÄŽ�ï%FVd{G,òUÁ÷�¼:þ%äY(öáî¥ T™ཬ罎(UdwYZGg¬´åÍšp%$Û§É"ì¾Gùtúà pyšISißÑ~3û^ñºO”n¢2��§m4½¹µ2VÈy1àO;‹$GÑÖ,šÚò–Ï«÷«@vDse>“†[)Ë„3O ™–@RÓ~9Æ):°�‹„É«•AyÃàk˜Ù"…†Fj·ÈËz㬴*™—ulºŽ+Y§µ^νb‘/¥¤áH…¢‰/™s«å¦Šq‹°10ÙG&þÈ?ÚG ù÷S{Û7®”È-׉�C,”Ó—›òVQ£gÆ€\šï�% J¾Çq}cõ\³‡<¥²ÛM*ýh«<îWèø´8Œ¡Qæß�¼+Ź\ÛŸ8J�Û+~ @pÁ‚™hM,Іñéë˜W\‡†áÛ²z¬¦×XjÈF}Û^ãÔ"‡¥}ä6Рûœë«•¶¥pòaœ–ÆJZŠã–=êÙ“¨®5*$â@”bòkØ OH1!ûmÉóïªÆÀ2±d.ÜÙl¬· Í´?¼6ne¨Š-ã$œ\y�hI`ʆà1e[JRLhpH0-SØl/eSUÔìY§@»ß­÷,“ÇPQöÌHBٿϪEµC¹Ťz‘$õRvx`Ã.xË�ÚkÓù~|6ê˜ÝgŒ;æS«¾Nð ÄeT|üš�_Ю+> àg¨g¨ãáCÛ¸ëkT.}«¸oÂ6t¯víœå¼ëBP %uê�XeòJZúAë½�ÆÕØ(Ñð—;r¾ûï¨d�Åd4�ÎñÆõsáÃÆ±o�±}‹š”} ɵ²šºâñö&t+rGÀ$Ò.Õ4!ößž�ݲ£< Ô~ùN‚Ë#ÞÜDBïœDk¹.¬koŸ ®�¯-°`²_ªîÞ’|Äë FÖI‚•¦Ë«ÿÕQ1¼=ý±·Ë¶+œÕ·fÄY´Ä€Éåv·-bÚ ~cÝ;7#ÊÁ#!« h­}¼_@!¶Ó˜p¡mÕËîn‹•ÇJ£©It#Îa¦ Ù“¹%7¨*œƒÒ Ö=öøÍp(Æéåô¡I)ö? @8fƒÜâ-Ú3µÓ`œí…ë» ©ÅÃõ~uû�šØÔøïâ·?w ŒÁ˜ ûÍúuX©ûÎôYrBwÀ<ü× ÄÙB²bF&dd+t:Ý_dú¸R`Ç;\õ¸"”áfà>Òɇ\}g�9P…Ù©éhH27vKZ�z:drå¯å�“-—8omD“'�†åtÉŒtZ½ÀlPH5` ×þ’‹L#r�¼³Ýb•NÂ`;Á/O"~ûÔ6:w½áÌÁ.Þãëçpç­Ü ›ªsÝU,‡ y R݆Å¿_tÆGömš{äº0•‰í*�¢EœG±5E¯(½Á¢„W×~)êÓ™Þ¬áJ¡Î§´-¨uë Zò–%†v”_ˆ8©VJŒ³QןÊíˆ÷§·ã(¶…¸¹¿’BõSûS‹ ¼«RøqpC¿¯�E,ŽW?±Œ½í² D‹X#[“«æ¯¥xîo{€¿¬Á¾MœXÖ)™9“ §ÚðíÁ:Ï-rvL¶°‡lå j¬ <:ƒ�ÙßãèR¶.¶� F—KÂ[MÍçJÎFvr–¦Êc�ÂÛaÃNšíª¬+Þ¤CÆÕòŸc@Ý÷zUÝ“—oV¶ý¿žµ�¬”Ó-º[·,¯“í‰ÇºU·�.fã�ˆä>‹,íßÄíBvMD²pJûíû¬vñˆ� bJMßðÂȪ=§Ø 0m`Kª÷%Ö„áK!’…€?Œ.îJã0sL˜ƒ©Œ¤+¸²†tYSK÷8‘ - ‚Êqó,ôS…†Ùc5–çÛÐW-D˜Ž¢6û71}ûSá!ÐCœ´Ä]OÕʳ50XÔ®ËuØz»îs0^Æd ·wî3hH`ûv:á®dÜámÙ¼ –pôº“…©ÚE´°†LΤ{¹Øš-›Uh³v¼ä_,‡æ3yE ᲇ@Ö*AËÑìðJ —#03ÖÖìB¸•IÁã�u¼Å¿&—3Dòó×3Jã€è3õLÐhû€¿nÐYBÓ6A¹w[¬� þ2ge‹àöyùåQÒ@“›rõ «Oè3�Äßq¹A‰äFÓ'UªÉbFñŒ^ú 4Ç·4,�i Ì…øÉ&Hjà Czû¾°Ñ{ Wo\¨Í0•³*¥KÓF' M éŒ'Þó%w: ÆÞ]5³É\Ù¶”2ìnL9~—ç …ŽaÆ‚ƒ3;JQýÖ ì70– lÈݸ¿û]°hm„Ö$˜ËNnŠì÷Ý}÷¸q½ŸÏn¦à3ñߢPpdg¿ ˜ây7´$ú´¡g¹°~€àjîô=Xüpµf½©Nì·Ü=çlŽ1Ä€Bx¤pláÓ 6Ïk©¬�Ôö7³Z°ùò„ È–¬›bQˆ·«x#vÞ¯ÎxÊ„Nm�×ÛŠÑõ±Žå§�wØäº}¬Rá©ò_}~w>®0z¡ûºª|·È‡kß×âç�ܹnùC䛬‡â1ª_¾«Vwnî=Â�¹l¾ý#�å·Öœ g³º;c kuzME¸¯�í'59 6Ƭðç" ÷C-À=ˆ»|YNsƒ34Àû6xë€ê„|7±&Q4˜ÇAC{åP@›…£r?Nq5ÌÍC\‚Eí¦£EU[al‘„‡‘0÷�c-q{Y·»æå{Æ�nÆú±b|ɼùo”BzÍNuÖÜi#XìYûî/”›Ì¶Ê»ñr)Þã{Æ·ó…6·š ×áÙû ‘ŽˆéÒµbé<…s¡{‰Âè·tx­÷qÀ+¡ï `Pt¨‡ÂnéASÐ\ó|²ÞksÛ e×è#æ¹›1¶¾@)(^pbR†²aC° }\G¤/°Ð'­1KÏ.­A M•Þ}Ýv'0™�qÅàF5]¾ºžB=Ùc#ˆ ôÚ<ááYîÚbvRòÂS×k…uq…@t=…”Ö‹58À¥¡Faí0Ϧ¹P˜ï<È"2YÂ/YhÁsXë2(NPMLÜ8W|˜„7'w‚®fn )¾ ¾0cˆ›³­ºí¢à˜ç“f%ÅûŠ€¢-J[ƒñ-Ź®ƒ"Ww‰ï$#œ[4’0ÙtZÂ]')%*…¯Et –xS4%mBØJûÊÚKºUïi¢Éæd°q1¦ýò—Ü‹÷j’¼ †}“q£‚m¤²d˰$ +TuS±×¿zضö%×!ÖÓ­Xž&n�l@Y_òè¸ö3,� ãY ²j›â»Ž×[ä:¼qôR®öÌ® KÅÖ8ÜÞ�2Jy]u¨V—|D8þîRxœ'õèY >Çg‹§÷··× èãKj¾ŠÈü ºÓ¸3˜y§ÂA$Øœ½ÇM ¾ü”iÅçÕãÃácªíniý}K°M³¸ÃÇd]%ƒ@9ž½ÔôºårPwžJ¦eœ+õo"˲x2<îÂŒdñ)lâ�½EaÌOB(ÜÚÅKBþè«´=w‘— çëò܆=7´®OÊ8¹úþ•ßÄ�Û4Ý`@§ðaØod"‘í)NÐOÕKÒº¶')U¥Ú6�g”ICÏ›œµ¶î#1ž™î‰kg£¾¨õª&‹Ðc·[ä&²Žcx‚~j« JÝœ4ÅK¾<Ð[‚³C{i&Tnhúc»ûŸ±áÙr.Òàà©pð;jÎ̉ð—w´nëõ‹íá$õ³}�ˆµäu§pHª€˜ù£#úÆ.ÔCÑøWI�@Üè¿)

�±ƒáÚSNèT"†±!½%i]|ç’¼bª�P"DV÷-�ÆæÖ¶%\(Òµ"Â�˜–Ó%žÊZ•p«6NÖÉ1å÷röŒ3s,Z³n˜(û¤ Mka'¿…mb`Í)ˆ/<¦œcX;œßJR{B&ðí�3'7t¹ÍˆŸšKÔ_+½¾¼!5 ú7C5a[”ÚŽl„û9Ô=²Oz±¨"Í­€s{h@ök.|ôÕ%¸Â|Â3éÝéÄc gD.‰z˜Úæãå�c,âÅ” dwz,á¶•g¹÷8 €­•Ç›¼ÓÈ<·©E2‘‘:fp³¦¸¢‰ÕÐ`.ÃaµO-r�ëJyJs/¼M@ZÆï½[ ‹#úÇSòmd{$(ù Ù ˜•E4Ò“€k”Kõ ð4Ž^±ë…\»‡#rñ!s²˜&ëš”¦À¾qc¿mhÙ�’V$,!gY§.(-¥6�@о‰[ßoZb¤<À�ƒHý÷ͺ&{ß¿m÷éýÀZì88}§”)vEÒ�µêÁ vÑ)³êMâö+˜9ˆheí™à+ÑÊ sÏRæ�Tm‡2ÍŒÁê­–¹ñ³/¨aìÕÆöfÞxÚç[^9>¹‘šKBg¥Ýa:¡Wƌ߃™jIÔ¼ n©j¢~pGižÀkO†¶®Þ¦5 4j[Ô!F–î‚g¼e³®yvDÖ3¿äÞP(G_?£�c;{ª?sì(j+zt\uѱö8D·\Ìi÷s1…An�3â0 ¥Ù–òO ü9�ÖôgDYØT¥§½yš›žú‰ìp¿˜óSª4ñÜi Yõ‹ÑÖìBîõyOÛgØP!x¶ÜDݧ “�!àD*S{7kÀ›g^ëÏ£Vãs‹àÎt_l�‹ï& §ìoŽG¼Ö2©ž+>QÜx0ઞ¾˜¼^¤Ù”k{M\7 U¢²|O*&¶�uïâ1L—Ñã½›‹¦Væ®;(�Ò€Óìü]è­2ilp×ǘ÷ ÐÌ´;æÜ¾¥Å~�aè»e®¥{§¨¯YÌC…ÑÇ H´™#r˜ât½‘ºØá‡b®‘Tïõý�ªX1À%‹\sºf ìŸo�ºâ:�ÁãðF_±¸>/(Ç#Býž_¸[3­ãèûÞH„jàWï{äð9ß–¾î®åÅl´u9…· ±D³ŒÚû¶9AÇ\¥±‘#Z­ii�_ Ö¹Öåÿi[Ô}wEÛùc…ò,!ħye× õ¨�”�ìÒZ¬ÁD(«æL¿×I²�pÚ¨Á gâÇ1Œ|aš´Pwñ,&&ÀP -½úä óÁsŸº²Ï‘�ðéÝ�÷E ¬|wÙÆ�Ñ™¨%¯gRféB ¾Õº5E~v `Ö±”¦?ìN¯OóZÂ6`` ~<ÎDÁ]£Ã~àbÑÜ�߀ãžù‹>U|�Cøeñ¾ÌZñÕ¶øh¹Çó™MìL ©!wp@ÇYtëq3ió¼êÖ¯® °Þ  …8X˜P%ðX]Iª"²Ø/änÌáÀ ÒKY)ùUâ=0áH›O’ñ£¤û†¤F!®©¿È¿<’cTÌl 1Ó­áßó1"xÎ8ª=:lü°°*äÖ¶ÑFÃPç›ãÒ’‰³3dÏš3k0®–Pp�Àûk¬Ðwä¿‹C‘»Cƒª‡V÷‘32åçFù‘×å]ïV€q�T�nUÐÎ2ÛÕ–…OÌ¢˜é‚ÖÐ"¢Æœo¸Y¸þtRû�Ùµçæ|£ÝMÎ$'?±mt‡ÛêáÃ�%±«$ ,@BŽ:Ú% Ö­¹d×ιݦ[]¾8Òß<�˜Ü°AΟä‚*k¬ÎÑ¥VÅm²xx±‘Œûà­ZfÛ~ñ8K—À\„z-¯m,œçª/K�ÜÅùÁ¯U¬:Ñ[dŽ��*˜vm ü¶�_*‚¾7z󻘕¿SRïÅŸ¿!�½vßšæ”0’ ·/ÍÕý-t‚ ¢&Áa«T@ Ò¬z#º‰dnwwÅ—jBJ<Ãäj–ùVb–8×c)‚¸ZþÜÒn²oEz=½ÐÙ±ö÷Z>_¡ëfµ°{®®Z|!£�ù”j±Dä..£—² w pX7hxB�n¿R³ƒ†¸&óëÌf�¸[gÖ;[¨�z^·\�ñYE›j¢ 4­çls9‹ÞµWÖ?MwqMq[¦L;Ä×$gÚ)P{?HÛ/T9`| ¤°K¥u q€Œ„ËEò…{l,ÖÑ;ÞLNƒm¤�²{Vž{w Ç€À€² A"˦/E6Hw�«åQ†s«æ4_UýȾl7ø�6l$ Ðúª¨Gî5ăÛ0ŸËjòm蘃È%’¶€¾ðnöê­·ÈÒîñ$BfOàמرåâÑ9Ýš°šêÖ`P{bȼ‰Ê®VÝâî£w—ÄËÖ19•`Øž¼=y æÝœ»° Ás¡êNvø_8o¼ë;ïHkž½Þ¢:<“AŸÝÓxúRÏèžßl‹4'té›[1ÉÃ\dO•�NŸVdöŸêïL€~ \b §³ª— |´ÞÊ�Øeçë«}ÌÍîÔ¯·²“ý2Ÿ#„ ¯ õj—òKÞ{X)æ�6‡÷¶6Ø[ƒ‡æ×’a� ÃòíáìõÌ"�o­‹NdzÔ'W°<�ìnÇ­Á˜ræŸì÷!ÙÛîE1ÖŒJl{Ó)÷T?¹«Ö�ù¡„Í— UKa’ËòÝ>î29kÒkçÐôîî³Záfèt¿[fB#¡³sžòmY“:Rµ¦�Ú-�m‡µ•INç÷ê¯6Á’ÔÉùÑ�rPfqòðï׳ڵ\<òmzˆ5C*ËáR¬fñšª'ˆ88ù¦Œûz€ÛB דe1|àÎòx$Ĺè5Y>;O®ÀoM•@Û†Gu ÅŸ“Šp{„‹[‰ó�¡ Vþå.-�®ÕêùI×Û ¦I»ypS°†íڛඓ¢—•ý½'E íyÂ(ñqaÅè¹)œÛ“|©_XfÀåí[mè7�º Mì ª}ñ7Ø„ùü˜äãl,iÓM—y ÂçOðæÛµƒ|bû K Šç‰ôqÄ/×ã<˜f`—:sîÊé&fÙ›žõ^ô �7aBFN¾ž‘0܇&“· ¡Ó{R�õ¼ ï�‹|êípï­«åï¬�þì[¸WúV8øOÊþ�Þê1)Û~Ä¿c]�^³Ð Q�k%óC�ÒU�õóÛ�³Œ~·°P7Þz‰F‰‘Xû5èàêåélá|YgÛp¹uJ§û¹ÅÙÝÙq•Hs �„·Û›áYý|ç¡Õ‘ö÷G~ŽG�úbŒè_p7w�XìNõõeçf_ Ë]‹¨/A»Î©âpáØGqΨ]ft°ÎgœcéÆR‹ìs\†xS èåO.@äfœ}ØWíÓ5�dj6…€Ìw�{…®KŒ¬`>÷8£¤··i÷µ…×ISŸi}s/!nÞá:�ƒôBo`ÅJ €±__`L1ÒXØú𤬮¨åÁoˆÇxÝèW×Ïí‘0›ˆÎétL .¤rá pH™5ÂB’M”¶ŸÊ5ªµ>˜¬¥ó›³l©öýžezòàáÕìeqï^h9…âvú´3l&<- Kg£êÕ¯Ôk�ßYA/P¸‡É†^çK2`´�± @€çñæÜ¼F·cÿ_FÀkRuëY¶Ô‡›Õ`ÀÞˆðý% %÷˦¢ îCìyò®'=¥:[qN²éø«(DÑ¥vëK]_�{ßVÒ¬]¾´šc^„^çOAÔž ¬ K•’¶g’UÅ‚yf¥ l¿¡0qÝ—°£üööúÚ,ü_vµ)¹÷�û¯‡��à_dÞË–Â4Ø`Œõaýk”½çõˆ¡+Ý®@Û rþAˆÎË ó Î'„�òÑêÁöèmÒsXÏw»†ûY˜NÝò¨æ!„=‹€ZqõzÁmšö¦óؘ0õ‹Ale•0†��¡q;9ØPˆ¡Éóp& `°=¥O9È/qmºf’GMr¶Èî_Bš„WåÕ)jè £l“0 vÊyKß»mÚÿ­ÐçC>ÒÏ«ÇÉY®¶NÔŽWôsPîì˜dÜ>kÈo÷×â �€�¹ö¹(¡m-�8DBîk1ˆ–ðê¸e7S¼57l„W¾›äO¬k”LRl% ˆ0 o},®çð�è:¹/]ëZÇwœè¦;²M±sûWLÿ�ˆ“aÜØè}ÈÀES8¯86V7AŸqì|ÞÉ�Á0Å&2ݰùÑ9‹qS6æ"�u%ô¨Ð¤R|áBö{ªª•€ü†€#ª½>»³äM "›]8;�¬â¥TF)’ñ—v_d¯e¶ ¢ïÏáOjÃý®Zɽå(wéÅ*ˆ�ž¯k½ü½µt€I¿$¤^Øxý—[!¬óLã]]›{ÚHàpfãrP¶²CÌ’ŒeÖD5hL°Á*à/lóB7Ÿ°ýeÃÖ•WF¿)TébP‚~¥Ò¯«}L5´QfgÛ Oí­áeìÃ–ŽÆõ¹7°.“ w:A7<µZ/Ûè®õ‚2P1Êð‚Ô·Hî%^®‰-.—R̓Rãýk;Oç,§7i>ß=ÙçÜÉþÌû(‰}‡ì¯¿ T ûÅádšÐ(×]ø, ùTà®oI…Ë$aòï`Y­–|¸0ؤÀâšÉqy«háøï9ˆÁZªµA|@8´Ä�¨]¶ëOy:T¶ C­i·3˜È>r)F�Ž´?aóÉå°1v“Õèj¾óˆ =®gI$#b3Œ˜³5‰TɽÙÈÛ«Å’}²6�á%fÁ+€.ôè�!óK¦ …‘Ùºí¸ÊÙšG%Wˆ<�–Hrö³µëWý ..˜/ÏŠ®£ÛÌ÷ÌêÈè82ÆjvWiÉ1Àœ£Þ§®¸É Ù‚ÅÊÁШ%Ž8Gw6¾� /m¤Ëwˆo%LS) Ï&¡}KFw%�ámuž!eÙ± ¦Ö×,¼¦Ûâã~kMjÑ…£ZŸ¨¤"ÏÍ»X)ŠúZ¬þåð³1Ô¸ÉPøÀ ê¶R" ð c"‹´3• ,„ªLœHms»`1ò„T>’ ðoû‹§LN¢Ÿ(¬^qùÉÏ^‡8F�`¾w ¥‘µàǃ±>ˆÝOYÙ.9䏨Ò3|‰Ð|[ÙêlÀ¥l]vÖ�M4H:µ‚Ī˜»bÿRÍò“5˜¬J‰O3Œ†4“½ösÊ7)¡¢Kxí•flŠ´íKWŒbä“�è¥Ö,OM@©tu".‰…}�Ðñ¼,§æ?jŸ|šòp&D]ÊÛ£c` ;i†À6@=[ 7ªŒ4Jyi_½�´.%9¬.îº ¿cµ€áliÃúœ$pv$h'íªl‡›uL;öBÖ5ŠÓø~kûÇôjßs*¾À哌ÜJdÔk uŸÔ.l�Ë^hÛò83»=“¼m»ž&(/fÔ’ªŸK‘Îûç×µ–†\ÖÓ'¤Ç þhˆa@ÙØ³•í‡SOcпӟo#³ä„Ò6$ø/ž=ÂvÑvŽnüR¡ºesñM±·)Î�§`!Ìš8[Ò©`òGo»- a9{®5Ú¸·)±1uº2[ö;:åûöÕ¹†·ßk}ÓfiƒÞÒ<{Þ.0`l/ã$ gœ¾†±Î *T~g±ÁˆÁuÜÖ0u@ÞbØm” ò+éÉ¡7ˆñƒæ0ë³vĽîk*ì¿�$L•©?…�¦,8…+n¦’ …ãØ±.�&$@x§¡Q, äsf¾93…À猵Ÿ.í~ úû˜ ÝlÆ[™›4Ó™ȘBôµ1òÎ5+š±ƒ/¢ö=?#óXœjis9Å(‚X¿œäZ|XðY­Ñþ›{u-ãÆ%T>Ö+pHàG¾™ï)À ¨×BøÌga*;ÁVÿ7Þ].!ͺTæ¹ô·©ê]jÄýõèjnˆPB%úSÏ´¡-Æà# |m0AMa_›ÝY©ó‚€‡žtÒК� ÔÁ]ï¸ ~¿JLO»Ÿªq‰±Á )]–ݽ…ËzÏ“5]0~çfëV0TÛ kj—þbðŸ×ΙX¨ƒµš<ó`\æ<éXH‰ÅiÈãÄðh²²ŠX1¤Ø¥®ÚÔï3¿,%” ßê”î]|0ùýÛ(§^�WÆAraÍ\a ÒGgQFç€{),®ZTøŽ+8øm²W“`œR0þ:5 (("0Žæò¢Ä1ãeÝ|#€ Ž'Î^–‰�¨BáÎ4cx9ÁW=wè\îb‡{Ð2 BÉÔ¨{ӳʈ›êh‹WtÆ©Ç*çy< IO¢X¤ Áà r³ªìµò«iìg Å\¶ç ã“ÑB6¬l$ø}tW¼ˆvÿÑÑÈÅéH·yb¹'(ÄT”ôÑkjÈbÇW e,Vˆ+[—Iªš'¨1.ý?Ê7cš¬d¶\&€ÇLäc|˜Æ lÁÄ@¢dq¾‘ð.‚}©û*šômRÇeH†fnoo„öñ@NÎ3àŒ† ?=ÃBœ}sF_çM¡ú@l™¿ûHÚÑ‚]¢Þ&¿ô‡?x†l9+†qéôe¾m‹Ý¥f ºX*gd†Á•¾²xC®-"ù¶$|!¦l.„zŠ[TŽãqïú GN~ùì_¯l^¤L¡äÏìÞúæ‚@ÃsZ‹·¼2S)’ÝÁ¾õ웎OGÚAŽD`8�÷‘wfäHgÁŽ! ’1Õ4óëÆÂFÙå¾X>0&xfš{a.ß6—i¦5áúõ‰åð™_X;„îHßĺ5!€£§ÙGwÌ„7c…w¿­–r×Ða¦ÍäYߺ¾þ ŠžÔwvñú×�vp¸hGÕ�…üG^‹¬“|wÓµ~�‘S[/ÅN€™î€íÐíð8Ûç*JÓÝ:Giö^1ùA‹%œ ÷h`À€9UíZjPv1�ºEû Ïkf»’ïKë6r›“²�ï ŠhåVì8È›˜¶7*çàb˜ïgI óÊ °^q¼–€â6¶OK×ýÔø9ö{Ò$?·ƒ°–ßÌüDç7et±ŽˆÔÀ]’oî“„ õ%64 ùŸ6M³³-„­ËgUÀrœúÒë„B¥,ÖÞÂ9Ýx²'%y^�ìR¾Ê®:áÆüUû ƒ¸7³ö ÚU—‹SàJäÖúEA¢[4téjX&g*ëM,—Ív²Ok¨Ç•un…¢âæxÈ�ñjÒ*³p Þz§ãÎ��ˆç¤© Öv'ò±ô^¥_G¢:­ìdjø›~¦YFŸƒ㔂Ü+rË‹ñQJ•Æþ½_€Ê ^Íb\,'$Ai×{3¢<.9ÝjäÞáÈ ÅÁ•p_r‿$……v;¡?Ò¶ÛSõjÂCwl{¶è.L}š_†8ñ¾hÞVà–/ã÷�2�Âh·~Z¶'wa‡··–téÌ`Œ#átíÁL c>s\ìËÂ\ÖSñæ�‹``7Mèù=ïˆä«x)βöBl�¥OѼ0P º-Š1¹ä#§çXÆ/÷±‡ÄÑH™O/¼ˆ'&“f»ÏœÛØ)Ã’o¬«™3%¡Åö>‹¬™e‹!½ž8ñ"Ãã²–!¸*SH„­‹ë…’žL%ìÞçë@¡nûÖaj9í¾qÍß `aÞµ½Kó@4qÕ¨Á‘оîãì¡�bm0CCÜ—”»Èt8xH\BP–Ä0·FÙ’œÙ Q½y§ÀÛf|RØAÛ'¨RËü›:ëÃõދដmÓQ) Û/%Éø<œzFâ¶ó­ xû¶?kˆÊeÍ {y¼�+·»=k¼$[½'øÒcžV–Á‘¢ÑÉÊû\ËbpÍ—WŸhcó ëÔ;¥a¶:øC~Ñf(»„ÕèŽÑZ©ë§¸.ý�óPÉHd#´ r*ÁŒ¹�d*:83ˆ³Õ¢dçpR{õ´ÓŽ¢cñräñJZËp€Òà{]ËÕVôÖÆÃƒ;ŸÁn‰˜K\ûëÞ'ÃÆD.pV«Š�€Ï±´%¢r³˜ _JìË  xÉ‹»çXÕÜþ|v¨wv�s5®æZÐïW ZOƵÎÀMnaS€'×,d´ñdQ€¯Šsimg;¥Wn)Wç™ÄuÕ)‘)ºÑ6‹ÚÍ,%=ïæÜÉø…ìéN¹~Ÿ£Q¼&Bl€¨XZµ:®„su¾«ã´¬R]•tªÆ,{'z¸$ÓM'Ò·SëÔ tA$ËpÎRcõº·æTÙñapŒ“cØìyp T^vú²~�üëšUø ‹;{=(=¼G#ã³wÀžë‡ltþ®•oö¤\IÕ{ÛAª<‡*ülšÝ®·Í5¦OÖƒÉÌ�÷qÖ7ŠFÍ/»bNЇ½yÃVÑæ’ÆmÌl•’ß S×=.ö v6´ï ×ø‘›oÜÇÙù¼ÙìÚ‹íZü-áx5Dgçî™�¯8âQ�òEp9— £1ãwÊëíͱaCÈž°P”êÔ†7&”>žß-qº‹ÜŒ”ÏbµJŽ1ª2Éù0{'¾å t8·åž•øý2´ÒH¨íªFKáÿHè }*�Ú‹(ƒo!ÎF¸©GÏa–!‹š~æ\4x¨ Ù_ÞܸæµuÛ8æbÚrÉ8>…`ŒpMœ5ƒÏâ<_‡ÇÚ† Ú,Y£WG@DK¤¸üü]¶hl#öø ¢á¶ú/}¼JðA!-%#lÈ/sWË(xË0Cøv±.Øf=ç;“ÉD@„‹;¾È�¨Þ�"e'c8ì a8ÚkkVõòéO„uZÀ0ÜÑ:‹ªýƒ˜XÓ5›xàäKñSk2H7“È?Ÿ,ZÌÜž—›Tøüàðô™„p8 )m£Š�mj±Û0LÂ5·ÁËò¡ô�èð샔NÍZÙb„óY· ²û¼÷†´Üå�øq6�y.ãYÉ@ÖdçH7îo¾ÖóQ‹d¬Èà8�«£Jœ~áµL¸ápêöâX i�}Yz•±&¨äd Á¦®;µ¹é[2PV�ÏïMùš‚ð‰X5B|8r ƒ¢-4é™$éáÖ˜²0¬37L­ƒFC¼K,¢y ò!ØàYä_(g2ªVñº^ñ/ýÅÕÔ3×}åÔç2fî¯Dò5¬TwÉt ,ÚŒ£¼{S"„~GGLM§€Z’f¿¿ÌpoÏm6¶A–ÑÆ^¥˜‹q•íO.ÐÖ°6\µ`tMÔRO8×eò2Ír¥S%%ˆDÃ4Û{…ÊÄ�jÑŒqb$Ø Lv"\’Äp­#…’ÐÁÔ�ˆî¸�û¶€feŸ¦ÉµMAÍÀŸ"y‡ga8„ž}hºÏ\ÈLô M±m3Â�kCOb bpcÿ£•½WM*mXt·à XÐ/�†oI%ÿè³Ë­ ƒáA.Ñ;Ywã¨zIš'¶EODÃÝ&¥|½–0™ú@Ô¯«YHñãÔ¨aÓK®ì”»ËeÈ;’H.ý�1>,AëŤYZòó J&”À² „›½£ÜmýAôcÎZ‘³Á¥v” ŠúÇëõ´#j ^Þ˽ÞéVMŒ"¨fBäG7λ$wÖJDÅEx ·|ͯ»Là �å?>™óŽ9¶„� |!—4¨0<ý ‰Uo5-L©݇ùwŒ’‹oW¼„úŸL�l?ËŒ1µ\í„Å�®�Œ³„y,¸^iàÚ]Ì [°Jµìr.:¥Úå–ÔÒð䌦~' ƒjAŪÉ)´åZ .©îcxéê¹ q>^y®šéVË]·*«4tl]Žy¼ÍŠç¡\SíãTéi5É´ØXߨ²S¨tú£¨jÚ–qí-¥ìù‹JòAš¾ö‹Õ­kçøçw^ 2FÇ\`¶ÉÛb¾D@Œýóò«v»uXTˆŠ…Ì¢‹Ù…Ϊ«ÖœàÁfÿ€?~ýø Ù�[„Õ׌ÈÇ�oRj0õ7¹jt˜õóž¶Ÿ7 _Ræi„KßKè™ê3þ©ÞâÒŒï:|ûÆ›þýû÷ïÁûö«z®“©OhØ?Ö»œDÞÔòj˜|&*žnpò^/·»¢F˜µø¸6Vþ X´€ˆ X©ïù=º}p=ÊëÓ 8x-ó:Ÿaæüv-}1¯ñÒ™ßr8¼m~@ XDH[(±¯ó…¬KeFãMê+6y¾ñºˆ)±/ätjTŒN¦+îNïœê;®ŒªÜù•g+óøiÈâÓªÿDçCª�*#¾ˆÉãq‡alq*Ù¼‚¯*"^)¥\rípÐ5³<¯H4Å{–NÀT_�š¯pÌ­ åìå{£¬b9z%¤­Ê­ó–WÅaL¶ˆšnE˜+©ñO‰é`Šk%“VȧP{Ž+ð¥ 2KnÒx(°]¹R}Q®S£G@ñ“àÔŽU¹°×ß{7ÝðVàQoô¬èW$Ê,`Ùì¬òÀ„^bÎÎ�ÀBU?l VͼºÖ_‘¦>¡ÕËÖ˜)ð‰¹7Nw—y“a�ß Ál ¤y$jŽagi”t¦×ªYjw� 3ZΧÒF�5ú^àÁ]t=²£zÞ¿(Ì&ÛI‘ë�Þʃv‹‚p"¢´Ã"=¶?†p�Ú�>ãòwŒø»OÐ�±9>Î*æsàÊÙϪ ·]P¤h8{½fØpa>ÀDNž�rú‹õƒMœÃ¸óq6q &ÝM­8kˆV²Œ&Á›,’T@ =€¸†�q¤%¨}ŸBtž>¡É§õ©ð@w@â­€OPÔ§°§´�¢9ëÒ�¬¶  Ø“æÍo}ö̳Ýôê>nÿHz[ç¥u²ús”Ö&öR®2|E“‹zÐÁíyfnùÐØ› Hjþ ÒW|ä£Ð S_ G²Pnd@—�¨²tv!–VCãHãºp�ü>JVéó‹t•Ë·¦³'{6±¯w7ÛàBÀÆapNÎÜâ|üò'7%›Ô”lA¡« m7kÜ-€Muÿ’ˆ4¨cqhDÀÈTë´ÝóFš¶f ð0 B‰¡ïKžßlÕa«ÔÜùÃ,DºI611ÃìŽúXMÝ7 ÕN�™lȘí-cY-.A�0öìáFO{%Ê_ ²í…“fÛ©Ã!‹Þß7>�º›ô�ÃodÍW-p¾Œ©þ„NéÔÅ—j§qüå� ðU¨¸k땎 ¨Æ×™"ýÅÙ‚×x�z]›‰ŠÖøKÀ7Öš-–B¯ì«Ã«ë‘„nè;äÒÕù¬�ûq¤Ì÷ëV §Ìc†T:@Ç㇠½�‹œõëß—GÓ“g%ßÑ@Ñ"�­­·ÇúË"Qq˜»ó8ÉqÂ/u§s ‚ëMÙ7HíÍXµ‚#�~ø«“&g~ç–¼ "Çâò‚xü.MÏÍD˜„°±@z€xn^s¯2K^¯ÙºÄC“Ò¶s®Ý)â›*ô0¿T רÜ/£'ncgY©ˆ&û�6ú-ýäI`Ílñ³!ZáZW$„€]�Dš~÷�H™í lcÙÜñòöÜŽ¦ÛëÎRù ù�&sA’ êLDŠ4þ+(NusݾJQ~âÈ4pÞ1¬Ãп�5’#ëD¸vç^Õ½ >§×ÞjÞãñi<lieûèG˜4¤�:š‚Ny¯žfÔj¦¢ãw‹á˜5„ý»¿oö«7sç’ó'±Ã¢î˜«²=/�™a}WÎtüWç¨=±¬ql�O›˜ÞE-G8|Û¤XøÖE´mÊ·êzú¥ÒNâwvS±›ˆ2h“?4Úè”y$ÚÇt´0+U; 5Å�ºpAáâŽUI€×âýá‚G ä°Eiɘ ›âåWï7Ìo‰�pCÏ<”vÜuBŽr5m¨«íqu#dýÄ)ž¤I4�«×.Ɇõ â¢]Ð?`Ž ‰ƒ.ÞäÎvù];ôIóç;Sܽå¿`^O!­øØYõg¾íæ ÙþóÊO½žk.ë,e‘AÅ’y2Œ™®¤ üW¬A¨ÔîÒš÷oB ðB¬¢f /ДŒý’B½í¯b0Øj§v4Col˜3˜Ø "òÁ*±W{Ó¬�üÇD}˜#�Œsš¸2ë‚n9Du2p`4¶$ Úp:éiEßÖï$`¹8¡kf>Ç>n/ 6.�Wé{º´ýÓ•l@sà{Í€îÏÜü¼Æø‚r|91÷Pe)¢ Ól1Ž÷höÈRžB^s20Wc—† V2å­y±Z+ï°ƒo·jkFŒ TžØû½œßÅ�"d‰pÙƒ…©bKÏÜf��õôã"ZðiINo‚HàI³œ’ä,¡¥ïÁh6¾* ßPÍ5UQŒ 0•}o΢¾,qÌ-6ÌO*Î<;ÂBœö"N#ñ=¼ëJ9p+“Lª^4¡§%v­éU2{ùz—ÃŒ¦ñ«åæ<ÕÔ›˜*V¸FØø+oÕ‘½¡–è‹mIð¹u®>h¨~ùáMùk\,mÍŠŽ|/Ž ¾2A ¿•]Píã·HÖ+5øËæ—äܾF BÛÈ$hÛ„{~Nýˆ ²Î£8tÞq¨Ê¡ Né1X›pNR“‘Ôÿ÷éþhÃcݵ˜Byìo·JîÆö ¤ L¨ïê€a²3Z,ÙñáìQmçD»²“Ç>@Oa1°ªvÂ=•[�Oöo‰õO Fݳ%…/ c™Ãøº\#+Ä÷hQL…nÑ®›ú± €„pûuRèϘÛgË%wV¸wFþ—¬Ä˜C¨°‡·AQ>¶º †K¬·rûÆ›òtó\~ÏŠ•{#»W—ŽbuÄ%‹ïô �®GLLyŸß "i{z.êG_2^×R-‚¦ƒ¾3�¥î?W9Æõ‘¼ù¤{ üYéG(}“¬%û×RýÖðæ÷¾ÁK„ pø[p¿RÖµJ�þÓ=-f DêÑÆ³Þð´5†Í�ÑJU_àiê.)³Á�÷+æ‚ç­o'f;ŒªŠ6I^(V{ˆ¥+¦Øåþ·Yµà >÷ÓšëÄYßo8 äÌrŸÕ§Š;iŒ¸Vx7¹ßGUô& »e&ßp‰x¼fH�lœžú1íì=|ñü'˜³Ðh»„~¿ÍÚ³Ù¼ ðÐ „#„Í¿0F/Qß×Àž+e8ê4M…ÞóãFfË]¾ì4E—–B@v+’µýÇv­(l+ôÛuÃîò¼&nÉýyÍ\‰*¶óÖ%Âé@y×RÁ-þ©h Œ~ÚèPqÄÙ¤Êâ÷k_‡€po˜+ÉÚBèý:rù+H�·?±!ã ”¯[9&Í-Ûäͱ¤øl’«¬¨þÏ×[)´-*f–óGÃv N–ŽsºUÏéÓßÃÁûÏ—«÷/¹¡0—Éåk†®Jê&¢#8”¨›fH¯ô\ÙH á‚Õ4ãzÊõbb'¯`ëjãìì°o÷lËÖ}/N² #Õw�‘óxž^\2 ážàðÓvv§Þ¦{´^³);ÏQ&IÜAŧª!•æNØ'¼&¸«N鸞 “Ü2°ù�Ÿo3#0çN›†·bÇ „ôTAÀp'*`ªnÌ_¸9 D�ÓþxñVª7"/·,ü=z—pÎYx ã1Ï¢-–åëíþ)(”Öq`Ä#®Öqd÷œE¸ïŠü»DŽ 6¶MA�v4Yly2Ã& X³/óI!*u9¸‡�^UªcÙËð«@³’!¸ØljvE÷É6û­Ü–=å´¿�“¼�€ÄIƒ¼TÒ²:!…wô^*ÕCÚgr[t¹Æ¾òÁ‰b-¡Æ®]ƒ«¢ËNBmï±Õ¤ç:9�ãïÉêúVxk6TãÞ�Ýcæ/�ðO]z+@9Ý€ŒýwL±#�­fAò? ›{䦀ÙptÎì9&¸zºÌâžaú~wúáŽ'Ѥæ2©/ª]òø<”øÑ~%Òq†¾m©yoB¤¬F¾GÆšez¸8*zcÈÛ,FÊŒ^Ôeré�U¶l¦‡†Å(q$ú6[ZÛSæOJZ­ã¦¸MSb¼�Ñ$²núïZ3ŠÐÚ\¤DØ cp/•7pÈ¡òÌü1UP¶Õéò˜\?†ø :¬ä2WÙDx"n®î(…|ÆÂû%Ó@¬„žnØz<ÖñA�ûŽ…ñ¨—Zs¿ë÷‘Ïó‡ŸR06'e;XD›‹ë!7°ž0Ð@ÉH|ÌìæJý} §'—à…âpŸ  ™Û]‚:½LwÈR5ÄY©¿.ÂÎ Ž:4„;ÓD/«âÆ#á�*æ«" �ìz…•õïµõýϹ´UyÙ3ÊšK/ƒ-T¸\c‹'°H0]ní§õ§MëZðÞŒ…•|½d$�(SL7 ?/6r¥Äãà“€ò³Äf輻Àñ)ÝçA‚)_§bBÈw½2ÅÈrV,ß!áÊ¥ŒËÆÎÄî‹Ì¾»Ž$&�HnÃË�óp“âS@Ç4§$“„xîˆ1qÚóQ êLi›Õl7 ‘B†:´|ŽÑ ú7–l¯Æ—™,µXHÚØ497Ø+ðª�BB¾+µÃ5&d.ë}€ GIîü¶çy“LÇeðþÞšÃç»ÉÚyô´,<«t-1·_th=¨*ï+¥[¼(þæ÷Þù‰^v•±my«½äÖŒ…œí�G;À} �Û¦r½<…Šþ˜B�.Ù¾‚»Æ¹êwÏš[vÎ1É›ƒòÐä8;™G­C–ÚqD¤§ÞbÖYÍñ9~žˆú�ÒŠ ¼åˆäC @šñÀét.¼³Ê³ÀóL3UoQž :õë î>vÁYló/u8öITuWÆfª²wdòàyJ|M_�4Ê�Ç5ËÈúûN5¦±‘ëá’·Íáq³ÒÃý¿°ÓéÅúu©Ëlh�oÍG�™n¯{‡¯*VÂÄ™’Þù95(Nrqñ†ðÁ9&5âFýY»F_~èiÕ²LãÅx6�Á¾$àŸ�ç{_ï^ >_²ÚÍAd�¨ ‡þZÀ‚0R3§±žË–jæÚ3ÑÑqðy¹xÜØâzᡬ´"Y¾ØFad—yÕÉ&,_ ˆ¸Žö:Ë N¬¸[Ø)ý®^‹FV(Æ0xÐ4°cYÒ0�ƒV&�0„_ªä,¼rÑÎ[•è Šmð];éRÖYCˆ`–Æ›†�h3d%V奰Dk2ýyòä)÷à}ß�UQ¤>—®ðµ!jrQìÊøÊÎð¢4âÁ˜ÈŒÙÄ=p:¼C§à�«s=Ç@~Æ€Âýõ¬8ö�üDtÂAß·¶_¿ZºØ†s�¦Ï—ÅÂxZŸ‘tægÆv|í”5݉ý_uº§Ìþ�ÏÊL |‘i0,l™ £Ï‹ŠËºÀ~߀7Ð2P¡/æ~ÿ{tž ï·vrZøô¼TÚ=�sçÝ¢^úRºÒ¨ˆdØD;•p,ƒº¨ÆUеïEË|öÊÙ¸,irsEž…Ý#Gj¤ Æ�šÜ«.¿hhyp�(¶á úÓ‹b€~•"F‡cè�]SmccÂ,Õ¨Ò?3¹œoÛüÀ¢�6à+¦Qºš=-ËWa‘Æ,JU®y]&ÈÖ ³De /ç|$þ–ôŒ|¸JiNâ3˜ ÙÔ/¦$6ÖG U·oH‡ž'Ø]8˜„™‹a§Û×– ÇÅ»÷%ÌH^t|PØšÉ@§¹’_>ç>…tNÍ™ÔÁüGQjOÁYk“€ˆJ¥'Ež`³Qï*ïaûöÚ÷âzœ8ËpгfðX›™1ÈrÀ„£ð^¯*2á ‘ñh< ‹Oㆢ®=ì’ß/T=ެN&Á§–E“R„P´oõ•‚ÆzÅ—zi}@ ÍŠ“ƒsÖD€vô¥Y8Í󴜇"Ù�‰íL2$~Þ�^ÅéW-!ªô‡€}”îHÞs¬”p¸›p·Þë V‚‡aðˆ¥8ŸÓíuÏœ©>Î÷£^_W-Î¥¤%\€vÙÔK¼‚¿ƒ­þ *¡ÇqAˆWÁvÒòÖ>Ú£È%¾Ï�å`Ì &¸÷ôŸømáçë• )—(ÿV›¶DÖ(+×÷��Rí³+D›²ªæpV2¡ÝØRŽá΂s›g¶¨Fp¶˜A Ä´9‹~El¶‘¶Ãxeþˆ;ï 4¢-üs\³ÙƒÞýs^,kóÎUíLuiêÛâk¸9ÕΈå_¨”´]^¶{“áÞæFŸœNa Ì{Ý-Èèn礵ޕ¨O|�/w´"�Ýbû!3Ø]‘>{ç<¹[šs‰nn>l¹Z`iÜÙ%nà³€ò÷¿*ìm^ö/µ¤Wû­Û©³|ùk ãñànÄuÐp$0‹^{êxÊÞùf¢$ÄVÁ>ëV<'pçŒLç˜>BÉq÷m."aß¶³Â†›]!Ñ9?“ë;bžën%-lÞö©}ùð]-I}?TÕn ó´~¿¹oCvó@ÀÓw½v™—eR Éÿ{–ߘÞ0:p¼žfw/˘°¾ÎЖ}Šª]®! 6V»¶T6€ú†ÙjSÝÁBùc ÏW—âÁ<ñG c³%`m™0 š‘àÑ NwñÛ…êK‰»ìж1zòST_éÍ åMï.\g=€<·Ûd­vÑ߀œã�Îa­c®ªLаWÀ£0E‡±Qn�M4àZ*¶íþœ ©EÇ’Â|m¥Ñl2T¼ÑïâäMä»;îâf4†£ù7±æøõ¼'øÉŪƒÝ iÚ郰>l-Ç—”ÛKµ‹q*Ûs H�¦”ÿXÀ?[OÙKÇ <ž•ÛøêÚÁð2žõ™-»&·´ ß/3Pf�¶3øW¬vE~·w}�ˆ>ƒw&-Ã'_ƒ[›7+á Ø>S�WJð.ïøþ ë÷º�?Ó}è03³@2ï8 *9düÝ$�1è…B�­ÇC¬s�¹èlíA›¾P6*-¨^Ö—uY™M$Úφ³¢Å… ¦ÛÁfѪŒ/h¤Ì×[㮦5õ(žÃ“¹Ð\ã¥'O±&ßÁb7d1±ÛëÖ:›µÇ9Ài1A‚3˜tÍÈ­)»zâļX Â7£¨—}vàñ‹Æ©Î¨O×f-†Ý3åçX[>.ƒr„�Õçvz!”>8™¸AÛ8{«ãˆŒãö+×y>[Àú;ˆQù6–ͨô7ÀmϹ鍿zô5õèçݳ½@ÇfŒ¥ù’â×)_‰…àÛMÜF«‡ƒúÓ©{ñ·õvï~—½Î…Ø–¬˜Ètœú8?Áh:.go’;Í61€¼bÉ¡Yc· Ö�oåD  ï5ã µŠ€·½ÙÏ�ÓáÚxä r[8P˜.J‚Esðz í œäàùszˆ+œh=u¼½2˜¼ /ëÚãÈñÆ‘|Aý5§€~­ä4õž¬÷äH˜v�~Àèsò@;n2 $¾êö‹FC�Ë[iNqÀ†ô>3À«Mäy�íVj MmÅ5 ¤Û5pAsÔœ¬Ù|£}.Ñs¤�T„õ4×½‡Í²{ͽ»r�­Ž&Ócc 6[ƒ0 _6-¤%|•‰?6P#Þʦ�Áì½±ŒimlŸÉÃW뇜¡; ûR¿ä˜sµ‰pîàÁD�JáÎT®¥ÍÖ.½[:_és;õÜÈt*:Ûç1'ø`¥÷öàu·M�…"ÓiÈf% ¥úH&Ò Fº�âáÖ½ºÜE¯Ã¾Z¹·ÉIiÚãjq|T·w¬ém¬÷‹×Ö·®'Ԩ #ä½ðöÐ øn¸0LÔWvá%ýߥ¤·3k�Hç&2­^|JW¿Öhßšzš¼á¿à?H&lšä\Œ‘ÙôñI²Z�ç·÷2��2,Kä¿UÐV�­¸5o3±c@W0ò%ˆˆ9Qð¾’ø>»N®áÎŒxnÛ7gw ?Av^?¹¶ï¸º²¤nÒ²èáÅá"Šú¹õË>ìµc\)Ðê]«/JÛK3h’†„€é¶a§×G‡€¬)k^´~p—>T{¢ò=[¥'H�–7ŽbÛç¦[”w’`ÏU¡Œ0ƒP¸\Z5Ì…0e‰0' /„j‚�@dXï”›i&A•l+«¨j9¼’é –È‡YkÔ�Û·€i+fô¿³;Q×E%ýµÁ|+Úý9èƒí¾¡}ö³ÅÝÅKdgcG`MÀ3b=´Qßj †®è,ùÓ¿ë}„ÎèÚåS놑c1O‰ûy>oc:*%Qö¾q›—°Bì>5K®ê¥u±HÔ{âü›Õ¸–w4‡£“Ä&9dÛÄÀAj$Ð8XÜ£,â~6]ßM¸…²Ý‘ŠÃÂ�M’·k© ÉNC‰ž‘Ú%›^¢#ÐoÛòçÎc”õï eÆßl7sÑ?ûÆîÛ4ûÜä©zbšóËX­°méCŒø†Ï]ÂÚ8å´´Ú+`s!OjûzTÉåÛg­Fõ�™`�Aþèðñ$ ‹A{óñ·¡¹Éàð™ohrŒÚ˜´€á5”�K~ä~ô]AçcàŠÚ†k¤D Žkñ óJ‡³× ®W¼·È—Sš5Ü�¯{›¡‰‡�™#º²¹cuìȘÀ=®–ê/ã€Þ¾Ëê“o*¿)– 1°ö°nJÂAŒ«²˜è¯ê`‚3ñå @U�r8ëòØ>cÄã9{µ¦Šqõ:1ƒÆp”�&Àú9­P_0?‹áÇÜûYè—:×Ö¨úIÍøÇ.Lâ8°–0gâ,û´cŠ~®ˆJ»«rÝo 8oÛ¡ÖïÔ"GLçoló°Ö+6€â'3¾ OƒQ`$;ÍN„K K\%R›ØA±j¹ÒbR’=|Kc'zlÐïV�­o ¤H6UÓAÃtûKúScÒËŠÝ ÖVµ¡ÇRïÑŒ‚‚¿ÌX'ž}ù'Þ0ɦ¼•q°Z—ÌýÌ{Aƒ…kºõ¬ÕúáD€+ÇÏRmK �=ùÙíÒú“M,m³$Ú_Ú» ó–Ž i‹tøØçÐA�Òœ¯|µÕõ0šev2mú9YpȈÑWëÕBß×— C’âÂP5{³²a@g“ÍX–ô{®½âp PVR‚â½êÔ#-}Øí�—åûQRæÓ70ù™,¢ú;íÞã{JÉÐÛÓ‚¸?Q�=ø¯ëÙ*ï°Ìd›ì…ŒÒgHx#½r^÷2À³¯ãÕ·¸5ƒ[*êój¥ÍAnáw Kg®¾µcàc„îð™ ¦£O1ÀèyÔoˆ�~r­‡‡÷e O–#èê1»|ˈ|û {]N(ˆzÐ$mCú½Æø*ÉL7:åý§ÀÚÄz×Ö<üƒóJœ'U­3“BƉ �p±rq¨aÞTjö=µ×7b¨¢%8šÉœ£[-76„Χãå7�|}²<ÞúÇA¹™Kq[K�KǬ÷4XImü¦Éë]XÈ`�{‚�ª<Û'—mñç¯Úƒ ÷ÖšÌ|ɽæ%Y=’*ù°ø šÜ>„ÞcEa]²9K\"ÈZ™™ ا÷UŽšôÚÈwâA¶¯Ëï�e!& ž‰hD3n¼j4T·½>/Ô -ð®&3Ýà(nê½D? +:C~o°PÄYÚ3›O/Ý ·Ý™Ûoa¾¦Iå-­;&aF˜lá¹}œâtÌuÛ¨‡\ÀnW>Ü)˜àG/Nz;ɦ¦ABT·SçAa®a ¢×T¶ú»s®Ýî�pgŒaÊFâOLng û ÂŠÔ�U€hj&.¨弘Ð-mÕÓ‚†—ŠëfW™,¶y‹ç0GŽ¼Ù½§ÇèGùT•¯~m&î,È}®û„ö^�£wÞ³ÉeÍì½áFRˆ�……¦U”ùÎuhS8: Š€˜#©N*ñ“™24\Ýqj-ºfk5ÛÙLó1G™‹ICŠ_ÝT–è=ZüÆp§ r ˜Á81¦оÆÙË"]ºôŽcƒºAvá‘­IÖtª9˜õùy¶‡¨nèutLËtNýáØ]|<¶ze¶eÛX—¼ÜŠÚä§,†�—fÎ�!ÙÃ#QA1p�ñ þ+ßà =VÖÏ)åAúžB.öÐÍÝgâ»í©MZÉ�‹]€³1Å·»Ö.Öõ/±�H�`¢/žãŒ´ìV¤qú[…IßxlQ‹‡ Cof쬭ŸQa°jIû �‘í²º¬³6h´©%'º£NZÅîÖ•¡AZs<źBTBD¤Æ�­å9B-!TŒ‹n¶š…×·¨$ï¯ù±ÖÎ)³8= ª†tøqÕ¯bG¦2ÒP¥PZñƲ°ŽwÉáHðÛ±Vr¬êX2úQDÞT àÓa×*· whµ¢MPoî¨>}"R̉Ŭڈ’wœÁ ÒßFø´r—ïy|êÛ÷ �^ð™›lßÜû8¿Ë¡öË‘ö5¯½tù>‰Š2Rû€ààZBýõ¡Óp–ò¨ØÑuçyÚk¶swŒ^qÍ‹niŠ2�”:Î['w`« ·o 2±¨È˜A?ùùF� ÀÅï½ÔNÚÏÐU`Ò_Ê ïã²–d�vªpÁuà/c¢ýbû%l<’o.Ïl‚ɨŒˆ>ìkâçX¾¾¢·ë¥jn>Š‹‡[¾ã™åô ÅDt@@½ú‰XÉá­VMü��î‹<¿�}u¨ùs ÙF4W[}^‹H{Ìé:¾ò±a%ú6™Äl€0™mRº;> q'OüêaD5eÌPeY#Wg‹(ʃ—C -™ÙÝvlº<ƒß.ÅDX”Îh �áÂûýíw'²9ÇrÝÜzÌ

¸Ó£eî&®¾ª¶‘>£IžTµðh,Wû  ½ÒJ'YÇ�lFQÕ¬À "¼˜,¦°`y`§�±Ô1Á2Ä)9ÕjCæYÉà4æm›Í‡$aâ½6QBˆ5ø�Eêó¯}`ig§ßmŒc4¦u‰eϵ�½Fé;|BýÒnáÇäÇͰ<î¼V.žçŸ,rÿ@9U–:Ó�½¹§`Òý;od~9Ž£èWåøƒ”É\%  q·Z{[±Û3oÒq F Íüa]ñ_ŠºÎy¤;¯6פ`óô‰ÛïZ¡â�éo*-¯Å”&B`Ǩ9i}\žn‰,Vã ¨"Ãføuý©4kžá+…[ºÓ~Ôhñpç/K©9ÃŽÁä5còôÕ›\­§Ûñ¿×ûàB›§ƒ×éã9ó;<Ã(c"6Idzžž†%ã6v;÷ß[ë/¹‹ð:›‰Jì½­Ü0zcç MþÛÆAþ“ußnd5<šuv’Õ°¶~,-Ñçæ!îD*óóñ[ˆçÂ:®tE“*çXþŸ‡6µ‘ã[2hë,¶ƒ®¢�<›*!¡„–1@cÞ-�„óº�zä%å 'Sn-ûˆË�äflÀÐÿµ—sRí ÂÄæÒž%1«·!ö(DÞ(¸ÛWØYù#5}<Üη‚/Œ™¬‹«*æ1�>[À~Àk“#ŠbÊQÚ³­ãŠô�! V ° F=pœžÉ‡¬÷–³…)4œg%›§6r¸%¼Vrî*[&Á4¤ E|ÐŽ�®ÔŸ õð(€éÐ! ñˆ.>§e¼Gݼ¾q»�0؃çøêo÷6å¿1…ј�ÎÌÆ0 yè­¹u =M¹å¼.Š[§¨¯Œl,7Í÷ V`Œ³¹wž=Èã—“$Ó¸šÙ‡°\Ù&. +Œ{¶BàL ê“h<ßÈMÈçë¯oi,©&:v-äñ³o0»ÞÁ+™�ÚÌ÷ý�DÉ?tŽúÚ{g÷“ösêÞW‹jš©@è o½÷i‰f/aŠsN‡UìùñØÈâ-ÿ ˜©ða²3¼ÿEŸ—ögw¬õ˜•šFÖv¾Ò0›ˆo®êš-a¥ØÜdÇ «z; Žæ¬Dmc-XìyçŒ:b…×`)¤9PÜ®Yƒ¹òý­l)Bµ<Õ¶7&¬ŽB8§Î÷Ž-ÌÉòôÔvMhD¥¹Šº{ SóϘ\£Öa‹íæ‹öì>sÍ`{¢Àü³vS‰Ø-R?ÆYe¡½Ã6 ÏÞs›ós÷uîabFÚ±pŸŒ¬�þ:\¶–õ½�-Ø\Ü#×1¾'8^›mò�<ÙÐÍ(UwÌÇJpO�øå@¸.©´À(g„wÅ�°^ˆ �+­wÌ_ˆÓ¨Úæ{ÞF =�ÒO¼°¦35W/¸Ây؀ܣÂe¤.•H{+¦.¿™�¾P~=ü[_Ødi52²åùó{n™¬7¶Mn7ZùGò‘v¾µ°Øí[jŸ]åN×D°rI _ žÃ£ŶóÛ4`�½Ý¥4QÒFÁa.i@†˽_Š¢'¡´N�у& Mn?,Ö ð¬o`âJ§ �ªU mYy�GëbfXÅvÞ¬žì A»;ÇUþZ{¸&T†N >ÛbÝ–׺å°0¦ –ëè{ ¼1�·�E#ÄÛpjÉ ‘ëÒÑ»¡´œïÜ5÷c@’n’¦mk¡hÝ{”šÞŽa‘i&ÐÓU08R Ñ�ßR ‰,MÚ~ºâc0 8¾‡Q8œ�Rº_Ž/:¨öÒU.öZˆÍk[½Ïž�©í.nd°'ë8Ww ß^Õ¶øÎÅn»‘áwa÷”ϸÇÌGÇùUÚÑV’]~Æ~"±]â0ø�ô�§�E„j=i5p(Ä_äü‡~w<ÉJvÝ™ £!Ücw¾ÎÛ!´mÁ…—[¹A^ºäX.Öñnò4³·ÈÚIEÂyÜùwk{�´]¼8#?È\Ôíጠï°Á#LΚDvݛؓ4hiź–®¸›rÌp)»æÒNþŒµd2úsÌÝì³}sAeă-ÜPz(½‡Ë` ÅB ">ì’ÛmŸ™Y]-¼ Wp’²ªúŸ@]éHÞ =VÝø�nžÀ·£…Úz%5åÑV,ŠWÙ/8`!—Hƒ¡Šs¥œÙÉô¡XÐ\€m‹:\]–†®�½Ù“õÁ_jÝšK„èÄy«+ ¤•,jZ{5q jÏa¾&eËQFîi…ñ’a«?ß3c üÚ´nþ Z€¼nZêPòKV»(t jº x'ÛsTvºå¨[`�ðï\Nhêõ‹¿h—Â#éŠÔü©mÞÊeÀÅYâ(K7µák žaw[�ö¦8¨ÝÀ†”g[O Á,µ­² ý:åyÖ´aÓê½Í9ÂDátÝ+65]M_³ÌHOy¢ºŠeŸ‰óÍëÉ~öÏ‚+ì5;„œuDú|¶Ó �9ÉÚj[÷r#0hЙ3ñ‚±ñ³UX¼< 6ší#ÙÇ,×FÕ.ôçÊ^uùw0äMïɱp@‘Ë•¥ÀYÁ_Óq¡e’C1œ…ÞçñŠm:é5vÒýDÏ„ÞU9ùñä&rö_®×“óR€2Ä^tfÁŒ;7¬ /©ðZWªX3A�"þžc�£doÁÄ}_{j£¥gˆ €+ä}òúÚíÆrnÚ<û…휫wó?°«½:?²7‘ºPÚ[™;ÌÚÛ[7˜Ôbòùî@ûjî/Û þïPh`7 9¹\–î¼ÞßæÇ[üWpN¸�ôñíÓ; wÌ:¹ô­Éñt+fη«’ª”Г™g@A„ÔÆÀCÞ =d k5‘…:f1¥”^¾°‰ÂX¬Ï s3äеâ×2ÉÖì� „ äÁ˜t¢-E°öÑý¼NB�²KÁ�²#ãËØuû ô¿Áˡڶd­õV)íû~<5ÝPÍ!$ÕZÛʰ6J»ŒKUýÚ­€ü2„¬ˆWè}mL‹9Ñà^Дr]'wÙc`Îßà”X°÷ßÛ»S…À¶Pìífkyhšåº”˜ùÇ¥–æÜ!ÏŠ–,½0aŒ9}ÚÊzú 9Ì[ ~±ï˜ _Ìf�Çïı§ð^H`OúS‘¾ˆ‰¸uý�ïj+ƒVóý] NßÙ»{QÀo€wˆ—eãe…El¬°¼†ÉZ³£‹‘ÙäØÌ�¥-k©Ô]±´7Ó¡`«`÷`…ÎtšÈT AÈ]¿¹™^¦ÇKE~æS¸ç>õ¤DëØEožU5‰ÏKw /“»â‰c4¡Ë°r9|Ðo6P‘ÏHä Ø4z†fQ¨7m ‘I�MwKåóôìÍï�%:xÓ+—]Áq軑T˜¤²®6v`÷t¯Ëpäý�œk[°¬P–©«oÀK$¨¨ =€�qq$öË2ZL ym÷·:Ï´í…q:•pG/g9,–øí€ÜÐͬä2ϬrGk^iÞèqÌhÝϵIéGôè÷úvÄZêçÜWáÊŠ½�mW…oÝPs²#]"­Øëm¤º£ÈHbÇL-åzß²ò6³YqV[óœÜöÊ–0Ýhþè<ƒ�ü•!zûj?Rxð'�6}Mñ«Ù~EûmY[É2"ºñžÈq7@�¶6¨Ò¹:—9Ðóׂ²|^˜(ZÁH­ƒ+„÷_Š£ª=yPOf›�Ñ1Ú°&<ç5ne%ë$úØ$ZQ¤vŠ£ÊFëã¬îA‹:äSD‚¹çÄA]yM“møýúvÏŽ£ôq±îø¿w‡õYë¦ÔWÇ·:¼]Ãêk«çš¸_2·Ç³[äØê£[ðÈ‚ ˜©mÒIó¼ô/ Ëtª¯·OÌ–ûÝØo.ÖüøÊêÃ~6ÁÑ­; yýq”í,Ðq“c„1[q�Ö��}¦µrÏV{až¯o~sëPwi�½ ÖSŠ. á' èú0ØÂU±ÊëâíyuîXÕ+s Ú—ÆPÞJHí‹�g¹p&çÔxFÑØ|Uõ¢‹ÐuîÇwàS¨}êÈyà[bÚ¼Z`[h@þ�ß�ðökgM�Ä[!?Ý'KÁe²îÑ[ÀÖÅV .ófP¡ÒIíkªüBÁfØwœÎ©'o™KH\³ZÔ#ôÉÏkÁçü*îŠBÂb@PÞMS ÐB®ržê}-\D4NA߈°Œµ‹o8À-}á][�_Ö�k=ûÄÉñ¯^Þ¬ø§ðùIxv�Ú¹F%Ò! åíCLÙÁ ¦Ï^¡°Ætôr@ BìŸ2(qo(bÅ �]ðS|¯ßƒð#KÖo÷™Ã2ëeö¸� “ýH †¶§qª­¼ªF4˜Ñ„9úñ€²ïê7ïÑð†·úàNoe�Ά›‡mn|ßQûžRXA—nž­£çyÅTgi*½Å.>gÍõÃ.�™ v‹~½É/€‚ê_üJ ú @S– €ú¹p =†ø(ûŽ�ké"= RÑg²�¥ï†®¨x1‡á*b Áuñód:ã8ßõªòÝrÜýÔ^1.ØT !Sß_)Þç‚7¸ «6œÆøz“­áE ¸PA] ÌÁ…¯§ÐÐ÷•œbÝÛ«}zÕçTP¶ù/{óõ”Ú(+Têu ¢¶®_- °5€±Ž�q`f¯™µ–çpµ ™ëÐõù„xiw‚QmkƒßíQ¸]Þ«sjÙc�CkˆÍç™®¦6®uÏ�·=·×—9=lŸHRœb5Žz˜aÆ<Ž=½†ý$zP¿BÁÛh/~Ž ²L»%¾‡IÓ~ûËyA6zÓ\�>D¤Øã!V�-úq—�kô/Îvû]Äq*` ø13iL,b­É¬�û÷“Óïl�O‹§¿Ÿk�òaäèo”ö»ºXKOt¿ ¿ï÷~¾[®­‹Ò�MÏ‚®Où—ô¦�Zs5ôÚ÷k9eÕ\\WB5Œ ŧ€ü‰Æ„Éq ¼eûzIŽ‹Òy׃nd %År7ß F%Œ’·56á‹}]Ï�Ív—¥£XÚZãÁŠ ê¥yB·âöv—Yëëý« æªm½85¸T¾¸vê&­Ï>t {'“»«C'ÅÛê‰Gñ¸&Þfˆ|hÈð»<~Ú‹ºéå ™l¥FÖæòΩ°}pêªæqœ*öþ tÎ,²mª­+‘�DF8¸˜þU·Þªÿ¼5žû$o³äu††¾‰ÁÇ7¶0h¤;ÂûݫʗŰ%�­Ô|ÚÖ|`i�s)ÊñŸiöUPy�ôy‚zÉöt6>1�XoJjØÍô$¥Z7ÑeèÒ¢¶�*l”†™ÔÙ/e”´^fí˜H2›Y.TÎkc—1HêÖ†ï'2„<Ê3mô'4Ø«û)V¨Ú¦ÈÃ5ûYf¢çÈ íîh8«BI”YæÑAKëwD |#í7sUåîÔà^ ÅärÀFhð«F† €>¦�(ÀS§‡­ë�\ÀÆÓ}>X#½ò¿ê” ¯¬WA=ë›CßfÎkP!;ÚC€ˆàÊ&@Ì)ŒrÛÀ±ŸÅÔø>wßþ>�íõÄz[N_ ÉskË>Œ®R}Ñ.¼¤ñuGóf�Ã=ûh—´—Wz� �I†Ùýgd.á?N=íÿiLöí×ä›Î—¹ ËñyËA•4®�7²@çKrià-ùù$ 6Ð+rì­«Ò“Ïáh©GQ?{ )=�jÖ‡žÀr|Ò:ƒÜOËpdÀ~�àÀ ‘ó|ÝÂìgs á�*Bmô ì±22GŒˆòð#(Zႊ¡QÝAÂyUUÍE¯Î!ÃþTë0“�†×øn¸Œ‹Þq¼H£¬¦A×3".q#\ú­?æðË|ŸS8"Ù>ìy[|ê=$àÛõCõG î9"…³ç!ܤdôÝñ#ƒÿ„(°}1új×<°®ÜÎ'~[àrC‹f)欻ŲºËQƒF§ê§­>ð´tÇpyœXM½õx— eíB#›P¯ªÄá±Ôú܇ÙÚ÷úà“´ý¶AkOë]�:N(Z:ÅŸ ­X´®yÊ|Š^ðn�¯šÆ¶/1*}] 4@ú{=WT;8¬Ù³  áŒ9òùˆŸ‹æÓƒkz:´ óöö^R¼‚Ç0 9¨bœ”sðd�A®àïGž 9±øáÜ­ˆ(µ÷Ua ‹¢{E¨©î r°!Π9æijÙ�&m¾ÙÐ`˜Äw ßU#|Z˜ÙñL2>¹ûö8¦ÅnË&a˜¶GóãT:©¹t[ìzÁíRTfŒˆe·2<ð|^geâ6ß;6ËŽ¢==ÕHÕ¥GHŒÃ^l3yÅ{}3/KDa˜*!$DzDäƒ\¢B[vuQ²öÃâ­rÑfÆ¼Š©¦Íìî-•É’Ü~ŽVõìG˜µ6/·�‰3 æú] [°Y4ùÆñòÆœ,æÔíàNçÒö¢@ó ^ê/5§¿¯B ZÞŒ1LÖ-If.e›Šg[=úÝy”^+RÚÌ¢^•ÕtÛ¹#V®­17ÎíéÞ•J$‡òîFœü“u3.Ž\C3» /fæší`S¥­È‹e—–òdVÁ׿ÅÁ]X½B†èÕëQã^úä�d(ºáÌ­ ƒs­¡>“ñ——lÕËvaO¥røO ð0áö`VujÉ0è€ù]�£ß)�îá¶_“ź4š5+¿€ë·nàªXãê.+ë&7Ðo³â†‘ëÁµóÖ+€z¯­óñí²€xæ'�0,öùý’ÅP'7ÌÍùŒyüÚ‡OŠ3A;65èç;¸íµ¼ÉîÂFcîJÈ>�Û�¦�æ÷Ñ+e•WO�žÔki+ðÚ¦Ád¶Í§-— F±ßáĽÐË5¡×mP„[>£í¬aô²…°™V—Kë®æ;ÎÎ[Ì‚d +bG@„�lÝiìj{+ЧKA‚pÌÆ=w–˜Xz¦±æÌy¨u�'êíFço´|´QOýÓïzÃü®»êãmoÏšl'›�Á|o“¯r?-®ÉÁÔ\Ü‹õnV2‡=Ök‚b¸é°ƒáý€ò(º%ôëO%t|ˆÝ;€Dm‹vÁIh­ï¨êƒ¸¼ãc^²á2/ŠV"¬^¨Ò®­ŸêeÖ32Í~«"º<ЧPJ»õdöi·Ú±ÈÀl°Št Í66y_VOÆlU+ŒÉ…šÃÝ„rî{­Ãë9ljí®íT/# Mp joˆ|0>³@“µëñˆfËAFܳ_y@¶Å[ÆnÌùi* ãÕCÓpCÒw/+Bû‘«Ëòœ™íëð¨$w—"Ó ‘°¼ßJøp��Z"œ¹7D·še��ÈE<@R¨æÁÙÜp©�ϲÙ�'!wæVüË0}T—øMª(ÀÎÈvÙ~ÂânB àÐ×Ïfç„?›á缞¼QðEl1Üõ�âÂnÌ95N>1ËŠI“7„�AO8‡ÆF‘À>d›CVo¸õa`' Ø6Ä̸uD\ნ/vR\l)q #À—ˆ¯2ùëÖ—ïè—ž…FÈwë‚s$®ò<е¼~k£Ïòy~$ï/†á4Óo-÷‚ÔLbcF[.l1îç^ÑÛõÄís´ÝŸÒÂ[é�YéùN˜S‡±†r¡ÏÈ `íù_™dÆM_ëN Ïû“…·|Bµëï¼­3V…ƒ,"`ÑTÔǧ†£ð&;®ÓôH’6Û­ˆë´âĘÎ'¸WV ]¨ º„Ø$|må¢m…œÀ�.i„T§t1}e˜ÃÆ�Ã#wcÓgw"àŽÙçËö.“ÌXºµþoƒ²{b Q—€á º¹§´¨ >²/Å|Ô�†Î¿-��R>´wl›ÅÙ©ú¶º2óy2îØòØã,GMÚJ½\ó’ÃÁëÎ2œ  › ‡¼i"aZºêo{Xù�¼ä<Æ<$VX@¨'Ý”SŠK“¶­uÁæÜ{r�l~â:bsúsEWñrEä�ë!c,w„œÕûwn‡Fè»Ì诺~g·fÊŸc¹à£0â˜;ù7L]@€Ù<³6*)M¯ÁÛ¦òOPÔGû3(¡Œ µ(¬k0Ö°uœ r !qŽk Œ¥°wº–Øå•¬‡Aõ\Ð�­i>òÔÎ^}F8•¸^Õ$Þ� s¶Á•—@çÐQL 7ø¥œcà5¼AT‚8ì5š/ÊeÌ£i"êQµZêne­!¥Å#±äa•Ãh§#~­5A}DØ[HïyJ¾>B6^}æ›'g7*Úú ÃGŒyŠéf—c`Ý6ðL/íx¸ÆÓPHv0³¡¤Ç㊣ ’!$áGl™OÞ�¹ö�‹ì<ÞÃ¥I­úϲ²|ìæP³U²ý© ê˜��¿5vqgF§y»XIüD¿0ºªj§Æ/ÆÎ$Ë^--«Aƒ ו\‚Þ"깎ç�0˜ 5%&c@¦;…ÈÇ'¹—VÀä7ÀÒÛ¥;pÇ_>rtePî]”Z0½žy¥påÃÜÝü]YÇ, }.¯CŒ«AchÒI— rA7b6s” ÿÓ#0[1ƒ)¯�e_pT1;vEv »‚aö{•Ö¶¼îÀó¼è};܈‹6Šh nÏ­–ùgE&Á'¬8]ƒ¹\®S²{¾™ssU4&ã䮤õĺ oÜ ‡sðs¾yàÆP Ü9k"ïj¸…¢_Þl䜻-‹„ÚXÈit²NÍ„ùÌçÐ…v}Q^ jç�I²TT SïÅÖ<-.âÙÆl¿Þ[ÝÉr æÍ¼!xIít¤kg|‡ªÈ-UL™¡ Á‚.² þµ�:�…mTzdw±›(þçpÖäÍ2˜EPkªl^—¯ÓmêÅ™âq…ƒ1×î3ßÈÞkѼ\7K5œ„]¤eÜûŠô¾wëí¸;Ç‹niAº¢¶z�œ-µdeÓ �íu³wºé¬Žìb�Ž{«m\DLûÊdj‘Œx-‘ ÔFIî‰Ñù›Ð:ß·p×>¶^E=ßé—TjË�vÍîwëÖ¥‘ŒÕžý¨Y2åT¥ w¬�Œüzl\.ÌûÄõö`>åÖ¾ØÏÊÔ¸ß)u^Ài]ò²¤{Xâ’Þqu{Û:¿[˜›p;ÕûFߟr©#¹àäømR/Nâ ›÷£7cËäÒll3¹‹C^g÷{y™­…Åì¢ù2ŽE@œ0‡EpÚMà/· Ì|k˜_ÎS´^*¢hÐ7Ï�"e¢.Á}ù(Ì)XÌHdÏp:ËĦP1µ»&…•ø î½�C1µƒdAµ=Ã]üáãÞ½Ž–Q,6á¡â½¯H rýê×0³û Û±•æ´d°!Gv½Š›sWÊ?ÄùÎ�G–ã~Áù¹/¶HÁ}¥o­Vœ¸`Öøìª”}Šd%*N…ûGÑ•<¤ºXéd[&Zûr##bûººn×Ù0ÝIÔ\ jþÁ�þò„E¦1l Ö†ö\Í:Bh]:¸Ë™aF%,-×#Û0‰m¬¶p›å:¿QC„ëæ¶YÁý{m0hösÆÔ‚°_l�–¸0,áCå+�5œ#ª»‘«IÕÊs-imtHº3ÎÎÕå(`Dé›Ý5Žl2$Êc–¸=«÷j�iÎl¬…L“¾ÑólÿN˼'V¢ÙcH¼]ÑG Ž·I4yy£§.CP}2=m�ñjÖ¹tÁ/ø»ÖKНgëõ(ÍÈ�¼Àr&;ç½wÌ ^Ž5)ÅÄ·£ yäã;±§ø@¹õelùH%ˆÚ÷ŸŠ¼Yç…e‰Ýî²ìùÆýWãDÌšˆû<ýÓ˜©ßÞå[Ì·scØÕP_Û /‚qONö/% ŒâDæo4êVÃhÛ{g,—é¢B³¹JdJ÷^g8ûµZ ¨‰ÝN«_'Y€xæC¡ÛW~‚¸ì2dâÆD—¹)Ð\›_�ljº— ¬„æÁ�1½²È�VÛ¶n’¯iý™½Æ¶:Qª°�ï7Šm9É÷/w¢w×£µUHµNJýGdÄ¢Ê~‘‰TˆU|K†Ð bÞÜÐ`1‘©Ù=&üR·ègVàEú®6k­þ~wuû: C˜~;l­Bšr¥â¬aÝ*ÀašSâåñµŬoeS_Ði9w<¡ª*v÷‹Æ8hmàÅ¿;Ϙ¸å+ò~­¢ºÎÔœ3aço°j2ÅøÃ Î8.,-·­QJSÛ ŠÐJyí>\﫤ݟð �o—ÕŠ‘íó:î`7›h"É»_àÒÇg³@ð;Õí�6Þ[š›áFô=°ÙuÜTI.ƒ�;dBÃ?l,Œ»Û4MоÒéëò³�ó ƒ’ϯN—1.ý¨hü‚3Sý¯}±º÷HãqO¾õÈx!žgûdê}ñ[«·¸4#Ó(tØÁ ­Í¢· =u‘z¢½Âêf‡øÆÇ¨ìºï™¯�ó…àÆ`ì‹Üªõ£¹Åcˆª2ê�Næµk™`p!#5à—4"ˆ°ÃV�q,ˆø»õÔg6[—ƒ}c(m |hÁQŽŠô‘r�Äjž^VmÁ¾lÎ÷6;Úl„ã7·¥ýï]…FÕ©"°x…)¦ãAOàü¿½umû<õ©RÛˆøÝúÏ¿Åq“ѵÑ-ÍbšFT�Ãv Ýê™2ö †¡’�¬,UG)‘áU=9åA­vôÞ Èè§ïk·ßX’ö÷îòßߟ͕ Õ >Ÿ«¿oyWÅÄ%!€ó¨•lÈÎFmh �&1¯ŠP¸¿_Y¹g(z®p%}†Ë\Û(´¤úPÄ£\Øw¨�)ï]K…ø 9Ú§Ìe u |äÈ� ©ªÆfy£Yˆ?jj)¶ {ÃÙ¶fYQºÊûJÓ¤)¶ÕV#ãj³‘Ðd4$Ï5�^±Iö'¶ÉÛX1¯Ç¡DÈÐj)%1y�Æ·˜µm¾xðàq?¥È0ûKš£YI/ x‰Ìeó¨øóB™ƒ3ym�ò›®ý7%ú$>µYžR³xšÅ i1Ç vreÕ°@ÊéÄÊ")/Ý �€©>¾·(2“~Þî†; ð$4°ú"é¦GõâK8Jô"?ÊZòñ‰ÙQuê€T-_a8½õX1ùÕñm¥I~Ô\þ±OÎ}%m—+’): èo2 MÚ}à¹ëâ‡ÅÈ!4ô|GxõZ”èî¶Ç˃©oNÅDnïÁ°’·El/²¶¢×ä\DjØ /˜~ïE¸?‹+÷ …Ýó6>ý½Kü*È !ï»·‰"}9AâSn^~å»ë#\¦ 6 m›×U·Â!‹°V9\Nx”9 ˆ±&îãëíÎl— áÓáËà*®¸’ç†Ý¸’;( C h•4Ì}¾ÿpñoFhEž üF詳J1WUÚÜ/lœT>ŽìäÙkâ.lÇsø!ó^-Nô7�ö;R‰6• Â>@ÖýÞˆñ‹éïo£“‘q- �Úô·ü§e¢•~.*+Üönó�µÔc±¾/ +}C ´§êw†‡°Å•u®勨1tݱ¾˜—‘Ïv‹Stö=ùnI+ަO ¦ÓÜþ@OÆ(oû_MSýtï_]˜ÊÙüt†³ÖÞÖÛ»Ô-³Cm>ºfPÌÂ�šÑõþ®jé䦣�å5~iÛá¥Õ‰?y>µœ‹±ŒöÉÅ�@X rúH@ž]¥¨ªBÙ >;Nb/žt’<,¤#}{ ÛSøRö`Ô�y(@­akŸÓ“K‚lu:õt„�bpèêÝÜæ÷�#nïiX”,ã¥U?-Ý—ªšÍ ¨¯xFi¸îŒ sÌÊûó~M¢Ø–à±£_×Ä7‘ï¨nù‡ gpSºQ1"·á&m€èíÂÊ Þáåy¸à3[æ<gÚJ!k7äúÓ=š#�N³<ѵ„š„4Ç"箪©F$Ÿƒ³q¸fáiÕ�]ù/nBrS{0ÑZ�õr½¬LÁ!_,Ï”Ãh‡–g> ܈£xó;¨kxÅAS¯DgÛo—8nÙ½ýÝ|è‚ ¤±t ŸÉ„ aÑùës¶å¶Âšö﯎m ÷0}>Õª2b,}íÃ>·Ê·+Ž8�”X '-´íüî7bùÃ…hשãzA˜ºw3§Ì’¸cî+&ŠÜÖÝ_/Z¾ÈåÊÞ@Âo¹pkÈ îL°>jkEÃú�¢ŠUgO|»ò¿5�åkާ¹ÇQGe›VE�°PÆÙooyzõ‚â m #4È©©¦"sK8äËÃ4DÔŽˆR²t4×Å"ÞÂ]ÒMìîž<Šð#–,ŠÞõ8"ÖyFv̧6ú6ŸjýÍÏÆö[ɨ?$òö+¢¨8ŸÜáûø6Ms§M7+;–v:2EÓŸ£î$Õ‹ë8¬:rgàÖ¾„ï*üt^µ7ÖúÊ›ùÃAña9�n‡Œ]ÝíF€bÜ`hº–Õ Cf!±ÝÅúFž¬k‡:ËÏ Ó\¼cÍÊbÜoÈ®àœ@‘½˜$ø7Ëu-öäáX·‘x¹GÌ•ÝÃYçq/ß"SŽöo«Ûfù£ak±Á1�å~x~¦FÜNófO‹ê,6¼&ç»ûäCoÙM¥˜ùiÌÜ6ýä­¦ûî ß9Š+¾�u¡·Ö‰¼8mGäK]FÄË"Ý;Î’CáöQJß@[<ª¯M¥'s�nYÕ�)"Ü.-VRCÕˆç�¡@›<�šq};€‚°�cá85gÖù¬Ói aÅpˆøË`‡µ³5Âbñ¸Êj2 LÕmJKµÙŸÅ€µZÎÔ5g³¹N�á¯ZÄÇ m´ªÐIÅd·�#9¹“ž†¯“ 6ÖÑœD`E¡$CJ{.ƒg{î¯�‹ ؆Tä­A,�ÜÓ �ÁÛî±~F:oÁ;ÉËœ*AœÎîV€¹Ôcgî6ôú6\t1Æÿ®€Ò0dô>²ˆY8…äà ëì“6ùZËL=Åy'|oª]>&?ÖÈ>ÛÍ›'h–ɨøJÄ­Ô6~'#ç? ü=Ñ¥ûÜUàVá!7.o ðÂ8äQÅh]M¶x³Ž¯Ìà•ç8¿8‡�Û†õ9 ŸaÛi­±×á."> óhÔ>7®NM蓪jM{®t²„ŠvȽ1Y[ç^£IÎÄ–] …¬XÝ/ÅÄ`ýZ¦öÉjÓÈ܉fPÙ2çÍÜ…W·=>Õ kM7·6Qy2U2^7nعÍ9“¥y�º‚¾Ï �ÆÞzW­Çc®=SÌž)G*&Û¦ë=Z2«ÃòŒ9|È0.ëµØ†3”µ`/.2½Æ³OeÙÜ.¤ïffÔ“ËM©N�¿mдØ[9r°¸ ù^D˜Þ>¢ÅÿtúIʸ¦ÌÉc+œ=åBö1•õZ:³�@؄Ȳd…öeR¸È~sò\Ë,'›jïšÁ8�4må•yÑ`ƒx˜ÏçàçàùùùùüÀü�6ë 6ô·0ËŽõo<ˆQ„f ÖÃIY'è.Ó�X)V6º¨iHƒ'êœ�5Š,"å±k½zÚ­‹´a?TCœ÷\°òñe(�Ay§Ü£c¸ÿ(U_Ÿ‹Iõñ�(iI¢Pg»Å_!zk6 Õ-ëŸÜÅ ý<”t»Ì¡j›kb¶õxî%‚ÌÖäòsæ¶õcŒ<Þ×RÊèl$ÆÓyõÍH'õ¨Þu«6>S3N½þ«Ü8;}‹œÍúJ³÷œ_)éôxÍå x2¨!� X¥Ï ;/dSS; $½Û(T=¢šSïR?í¬b¨;�0k¸ÎÜW€æº�=pO{¬uD+è¡cÜ>¾ÕPÍ„›Íhñó$Ã�D­0Âè]H.^V#Õlz–士=ì¤õÇh+QËÍ®ãÛ�o5ØI V”¥ ¯@É'šÖñ‚SÊùmµCƒ(5îèÞUb áÈÒs›ôÅF’²²×m%lZóJ¸2DÚÓº�ˆ;„¬üz¢�ëÏU:<²&íî]à {pg�Žè0-rdÂ`—.=�ŒR�§í(Y›jë�¶‰ïÊ×ôV­f I#PnÍb:Ðó s4µüiHèÊ3ÔpíÜ÷Ü\¬Ã^­Ù ©…@ŪœY㎅Ӵƒ›¥øå„ÊÊ¢âÝVjåŠq‘ xêë—¼¥["– *€zq$› ã¡Ì4dû­�¹ÒX£„ ŠE€Çp €�{Óñ¡²c#^Ò^ÎÕ?³!òÛoâHÉk£»Æö{æÜ0o\”hŸ“ µoxd;X¾ÕJ�põ !ÐÑ$xÐ6¯qb!ñêý段^ñ8fnãX¸zöG@\´vÝÏd±³BäAùÊé~ãĤ\ÿÆà;g»ü¶¾·’yðY™µîs4]õè¬2ûœØ�þœ§fÔ¯¸š|]°!˜ÅÍ Ñ\G^æ©ý¾}^Õ×~\Ï>É�Ïx�Ä7Û<t_¯ÐèN0‡âI:§aõƒˆlL†´‹n<|‹·Õ°mà¦:þ¿ÜàwQlzÿÓ±ßÁqŽY[š?H—ho—,§³ß0­«œY…Î J°"”>‰e¶êQªyú£`l‹ö§{¤ò BuzD}lý,’*úØÇÝ Íuå›È}.f=üx°´Ý-÷"sšW¢_zö—�)žïkŒª ý–_ ˶¤=žßF!Ø Ü¤¦�e€lg}’Ñ;q‹]5xŽá/Lɽ_æR=ƒ(½ýÉ<žmû$ua¡„«[�æ(.SM ™¹Ãf®°ÍòYÇzµ¡ÅµÚÒë@�tý¬:—Ë–~‹i4e¦¸Þ°žKà¬Ë›Pâ×R/Y%¾Å"b_«;ög!�~"lEsoµÖ6Æ<®¡ØyÀ¹)wh�q'ñ¡èü�)oݸ8‡¾oa7•1ìÓ"º?¼(\ âèß ÿná¤6až o;ÇÉ‹‹�9 ä¡ð#år� C^ åüy„ß·áÇ`|ï ›;J2e«/7¶>`1ˆ_x¡mÆÎ‚ “ï²á|\¿YÛ bî …’Ýó”>�$X˜/—Ø‚A°Údáe‚Ñ_¯“k{‹$ èÃsº“r®§­Üo Lq®LgC»–ÄhS 7X† +7.>�Ih“�zp�ûŸ§wµùeœâìWä´]y‹>m›:×)nÏ–ÇoA/Õ«ZƒHçaÑŠkÆói”8nVã5rtL–:ƒÌwWh¾l¹f¥E6IžMbêi>Ý$h!tísoÎÒ·'Ó¹G"á ùrèÕÎÓh_­7Ç ›Â?-h„ÿÇ0ø¼î‰AKn\Íuíµkd:ÜL¾+ܯÛt³[Ó�¸|ŒÖªØÄä<‚ßÃÍ8‘h±„¼³jTû¤I‚d›v¢~›ûÅç–í™´ý Å·MˆÝ’¯+—\.¦gPÅ»M›�Ÿ`>ÖÙhºy5¹{£� elª7j\ɇ+eŸ—Ö÷)(÷VÜp˜¥Ëw¾ Xн•a ;‰N7�öîïÎç…Fµs¹zóØsÃÒã—Õðâyå�׸B¯‘òºÞz?˜@uÅv.RÃQ§‹¦=ö³`LQV �¯ß·Ê|Vª9ˆqµì Ëë{èŒ$�DšæC›¢!Ó"*¡š}~ªNc({¡æQúžáp+n]gÆ€Úð:Uø@äYüœ²Ÿ.s 1ÿeZ·(go-{°&´ÒÕ‰ ™WÓž© j†ìåm’«ø<®íó®ˆ~ ãFùÏ~Ë“é'““fñÙÔk¸uºk9'ÖGž×éÖ)ÁÓ³•ŠÝÃ;îÖ°U+\ÌÕà‘pºJ×>µ©zCÈl\µÉÓ@fšÏÚ½‚À3©>«Ó±6”:¢K›¡ga|<õ5dÙf‚w™-6Ú gŸ¯ÝLßÿ‚³�XßÓÚÞ ÞdeSŒ¤{Î’Â5ÌNV·ý¼¹7¶¼=ýž)6•w)šÎ:ì›Uk–µø‹ŠËhÂÔŸ žº¿ ˆB‰:I\Üd —“uÎÕ”XKqjG®ø§6SCçáÍó¿ØØ¬¬²jA–çÈÛ!ß–{Y¨B”&[yÙÖ„åèD[¢®xú/×ÒÆ†Ç’?„ �í_gYûÞùß3Ô®þ (Ìwb#®l¾ÄòNþ�4»Ž;h�.Úqùlù¢‹_cu©Æ:•@¦TÈ#�ïÎÚ6 ÆV½S-’øJLh™„oë1{ÍCøÁ@`“[å§ë¨Ð®“æü¿ Vâmxª– vé¢�QýsáhHí¬µÈ¦Æƒæ¡Ï:–œøTöbžˆo•˜Q¨Kû‰�æÃ…qÃ-a¿¿ß€½·«Ñ’T¿—xÎ^îB7)[v΄~¶ZÓ"ÔßP]”¨ã qYýƒ<À�ü~(–ŸÄQQ lŽð`«8DpÇìª}ÓTWK‡A|v[Ï‚ë¸Ú½ò?+Lì<Ý gxù¹þ[º‹MˆNQ¾r1o@üË‚Ó åa"„G ‹¢Š´IÞ.J‘ŠÚýÖh-™\g£¬sí1ˆkV¤-åÏùsú=ºÒ`÷$ÃaÊv0Á £ªÓ=»ý°¥ùØ$¥å ÛšãïOb¬¢‡$¬|t¡rGCùþp¶î’ žÛˆ�½ÌÉ0õ]…µfš¤I-¾I4¢|Ê>²AöôUw ±ïÏìðGæ³qáA§ ’ÏW K‹-hÂûHiÒ“[NAüƒ÷àüO™Q±G«NXð‰“ù}V«Ã-ùu 3dyñ©4PîË¿é}à0N'ÉúÒ6)òE.úϽÞd±é ]ó2—"^Dµ³¨Z�NÝÞ®ÓkBº]í·<�á¸ÊOæ¬aðÎ÷Ç;®­ÄÞ-͵`¦S È#´´(jxÒÂ�Lž+âþl¯Õ& ÝÿÀ?~ýø?~ü ~4Õ`Ïû�k(’YzZžm÷m@þùž‚ãáà$4øÄëŸÕoMt祑Û.~¦ß–e º·³¯:òòSkærárŠ•»…0¾zD;ÁV­rñÆ^# š&!`ß{ ú)¹µþž@R‡º¿¸Ø3åÏ‹|I[WL}ðk¾ùÐv“ˆ ¥ÈóâüÀÅ+lãä�Òè±ñÎ Ö�ûë1ö†Ò¶É4ðêiHNÎL¢Ü5Õ\‚ïL¹áàü™výya º*‚åÛ@“N‹K×Õ¡°HË„¯§ü€©îˆÞL |åœ4 ¤?ŽFæ.ÝgøÞE³þu¿�í‘Ü8 =.î÷�:¿>ñPʾÃ-Šgw?�°ô"M¸7ù/úqÃZÕh> :¸…ÁâÀ΀`Rš#ààÜy²`šr¶'C˜„+1Òþ›1tðîC‡�åÝroZÈSºÏ6ù¬l3ŒæÜ.î@L:°œŽò©ZÑ1E«\7eÎak„’oãÚÓó…Ö@ëB\é[i‹–µ“­;&Ú~PeâÉy·™º ®ÊÖÇÛÛsž·wÄÄE jpŠl[H1�áÀäZ‹–§ jÂ÷S¬¦í®;e ¸¥' ‡°âÞt*1�×ÏjØv|߬ºð¶?jèCŸ\~]ùk'½äê~_¢_ÓOW„²f¤î8üвl—ƒmKÈô×íÌÇbá—½ó�ræ@…Œmß‚Ôjy"¾ã:ÆÐç.W>êmÈÐS0æÌLû¾ºíT!WÃ�Zæ3ݵç³7FTZ,%d²Ë03½ƒ0ûÕPdŒþñ¹Ë-|Ùº)…À¥î µ~"ç9¾‰{åЄEŒùµ%øÂ>*�mò»}Ãuô ),�Ë5²Í³·tû‰Zæ(¡g�F. öÊ[Ûxó.½À᜙D)¾( åië”é/P�ö òƒ <ÞÍòœß«g›è„c/*Î׈¥¿=på·6§sæöò%Ÿ–8‰¥mõr‰¿{°æE$¢„iTpâ4ñ”Ð1LÃÊÅí$Þ9Ëø$.õ>oÜu� oOÍmÑÚô™„w¼çñ}}�ìÁ»`¾¸[" U½båt 73.À? {; @øøç¸œ¸üÍT~‡Ùfؾb:ál~Â$06Á­óÉâŸç«ë|ªŽ‘·é±sŽÄÁ~däxìöä&p—Øqéb]ñ…I”’úuÒ^¸AvÝn¾ÐÓ~½jQˆýÞkY…YÐÖæ½>ÏÍwJ kÑtX…¸tº¨Ê­ \Ôäðøˆæ �³4`½bl_®’nÖL =ìD÷žþúë7ÍÑG}ò´9c«¯E9¾5Ä<ÀÈùs‘€2•ÄÑÝá²»iliáˆwÅÀ�®Þ`Iml�ÖŒ3u„Ž]*,ÌŒ;Üãâ;Ù°$£·£ÓDálrr뻘•ÖŠË ° µJ°ÎèzfÌDZÈð¬�skìr!ÑëÜùÅß}ÕÛÜ<™féicBÜtœ’Ö¿Y«” L) ž—7}×@²/[+9µ‚?W—$ß4d3_wš|ð¥Á ²Vå¹|ÊM~/Öè;“ß�› =}A„ ë:ãH[n‰¡ÎWqë->žXC‡Å«Ý¨´Ã Õ5à€†º__® Æ©µÖä]Œ îfÄXPÀFîˆQsç. `NÂQ{œL_eœ~ÝãžmþÎp©`ºAvg1a±¯*ý@K6Úšzm@Úa�ã!£eò–�äÏ¿?uõ1îáŠMÙ AJu¸/fwrÙÒ}W«[‰† ?ŸCQ-R¿VõvŒˆ‘׉á Z�Òåì§RßaõûÒ´ÅŒç`¬IŒnÉSs~™ÂÜêÀ5µ |¿$nñÛòÖ*7ô¶G)ôÖ1†„*'^ÑNç@àBä\–°-ÌgDŸ‹™Lôø¢é`­ì©œÂ lx’?‰�;L"k¡Ð¼|áƒqëv t’Aë¼õ;üáèì׿ó~°i«ãÑ1!™¹…’>ö¿zKn@愽c2>½Ô'�ƒèY®cžñ§ÞDbaÐÊ…“l~ܰ[€ù{›èÜs?k–ÏE>G¨\ªìñ`LôÙ­3 Ð"¡ÇyöOª÷@++,Û„�Éøvuó~zžë‰Ci,†‚Ei·v²�€ÝéHü ¶Ü6Œ©¾#€5�þ½Ó‡xߣ¾'ç½Ýë‘Xöwuèøg¥8Éì%Ó^¹ 1[vùÔarÃÚáÚŽÓEHYÉâÕèÑÎÆÞ€8‡ÜÃ7¹a÷4 |˜ �LŃîÇõ;'îm@œ„SžYµßñ— ý† Ð¶ª–˜Æç?mÁ ‚=Þþ浉öP½�™Àñû»ÂO†ë(¤úùo»ý®d‰î!Ÿ¥ç¾©Túè¢ZfßM ÍÔAÚ¦÷é’ÅœÓã¬MÞ)4ÕI§[ç%ån´S‚îkùs]¾/bèû½�ìEÏE¯/k¥´n�V”¯Ò^âŽt-J`“¤™%ŠAû{×Ó£x㈵™B§«ÛÝ­ð¤Ðq*I¥òc¤"(�î¶3ú!ÕÂÕöÖŒP`8V®´½×pxQ~Ù°rÛó•Ê}g}œcäýÍØ„G°ç¾i{ÚÖ5UÃeVWÓˆµûöù‡ð ¤- "ü7¹”atR­ëM“%>>ðåñEÍߟc[Ç(`o\ýް§¢ôÇ¿ÙG+õÛ=±>cÖedÉ­ûÍpŸQ¡ صÎ2P+�‘2]»¦6jØçëÅpËjãôW.é¿8È ýö~Žk,b§\xqÞ†>RÀPÕº õXW’V1’ÍÀ\¸À¨yEfØØ}3Ì•Û[;¶Øv¾·ž›:ã IséìC{ ÅnD\„hgU’�ÜeŠ›€¸¡Wz’–ÎøÍ€8ÆX®�¿„ƒA²ÕË*OÀ\Ýøþ¹et�€=ï¬LÀxLˆm氭º(«Â2!nšZ5›ýpQýqî[Œ„MH>$æÖGÞr¶q\Úßš3¼e‘MŠ˜1°õnÈD6ïWcÖëyÚJ«œÉF, œå‘ßd¹xf&nƒÑ�LQ�fÂ@8ë ƒÓ„€Z+’²ÈQAA0«™éHÃŘ„‘°>s¿ogê³YZÐø@èAu7>¿Ò“ðâî£Pä¡·E†|ë a§W±rÊ&/¹|_( ²èÍÐÄ<�¹l ¸…é×/·¨(@IqWö1 ¼!Þòäa{¸LY87`7r4ˆÄì«c•²V�ƒØY+hWˆCç1[ªà°"”l VÄŽÙÖ Uךƒ´2^¥,I›ÅM0ôIS+Ãz±�yG<+crm69–ÊÏz5ÞÃ��jå¬ééúéî«A…ÚÛ9G&c‘+zTnOšdPËß”™È�½bÕW˜úg»Ï†åŸÒÜBËwØÝ¸áÓ}‡ƒK.þC’kÑFö7Çjé¼Q†ö‘ ¶Û†ðC`Ù> \H“suçÁ†Þ˜hÐ仟\\Ì pgW.ñ^ÍÀ½[]v0œ çÒIqqÁ‰É˜ש±ÍÒjb)ƒky¶pÇ£[Û³¾×äFàçËmlªv+Ó-©¤(wW)ÇÂÌYðµ–Ý‹é¿4…¨ó§r÷$¼¹]ˆ¬JwùjÐË›O�’úðÜ”gÇ{wtc{5ÆÅT<|OLè 8»ã·Fç“-�-ÆæÍØZ«�#p�.¸‹wÁfØmô¡,FO¼ìû ¥ ¤è�´¦´Ù²Ž�gáÑ£{-•—Øs½ß7kg¹!EÆ8ï6Ä@-K�’}%€¼ªØ‘£ÖÄ èyHŽÕ¬D•XzÍ—>·¦ÞÕtXæ"H«†°@Ô3Ö ë…ÝÝm›æ¥ÿ"q î'„²„×ya6 кØ;¤ì·ˆ®Å4  jÁȰ¦ã³è²ÅžO7aDÇ¢Àöp¨BW֋й‰06�<§DÏ€Çá³·ƒ4Þ×�úË20ú‰Î‘ÛQì}šß¿1 o`†áöz"4�¼Š}Ù‰t|â>GK’{™½ì­®OØa²¡�CaG6ƒ©"ÕפKÜ ƒRú0Ä+ùâž²·y«*d·#Ý~=טxåÌ-‚4Ð…¢]ç:`Þ÷W&cC<Ùµ_B£`y|›�iÇüÍ*+)ͬÇ˾¸0 >Ž=´æ�u¸Û”,¨�¦¬q“Z–:Ùì-¥³îÆÅtÎnXfOÕáõ˜Š<€ì£øùäðñõ“âxܾˆ©ÀÕ‚9p¿·([`•ÐýÕO±vDT2à3Ìà•ì³%£bµvÃ]xøÏИ«o�fúúK—e/¦ ö–Y<×Þ³Yô<ÙCÍk½ïyTRr/�§D{à �ÍýX8z–ÚPa±òcBd0Άýç‚´’“š‡os&½,#· ÎBʶ®b1ÜÍ¡ô&鬞�óÛ„8UÔ.è2<£¢¸‰ÙXÔD ï’Œyä+_"{/©†tù†Jˆ�õõ}Ñê?,þor¹*ø¶²pÄ |تh®BŽ[aõ#z8"ü¿8ø€˜”çQ,¾Éì…þßQÔ%ƒÝN|É\œ»g—ä'8!Ùí¬º >õ”û˜�1•HÜÅ¥Bš¨U‰ÀE ­››Ê:kofÄçÊa÷[dZÝÍ�ó ndîÈ MÄ|_ŽXÊÙ£¼l/Ák(r�?1ïgw#ûë }™gÈö½Žä#3jêf´pQU+�b¤2"}³qi-MÄÆÚ9ì`U‚ŸÜ{§½ôÞ¾‰kSoej–vq.­>pzχp÷r¾®±¼Ažú`Fø rœ­\«@�žsu…ÞÅö5)Ž‚77Á£´‰ž$ì�k¿YÓ* ¬Ñ-åBÏ!œã\ÀĬ¶=µò`ßcÄFªz ÞÙéýëÈ«ÿ`kKЇœJІŒÕÝó"ÝÇļÿàèá 3òcjAº÷S_<÷”Øß@W¶*ç}è×—!¶@ÐïQ`SªŸWšÏ´ðé7ƒ*O¤å‚bǺöÓU™Þ´È5îaÆÁ›m¤Ô·ÖZê@8n+_ AÎz§vÙJã&Ý:íl|g‹pîÑÈ�Êðqâ ö´üÜ©”|–Ò÷“Ìç¸n%ûnß|¿�\LryŽ® +T-�—ÒAz–¿É"î¶¢&Gr2ŒD¨\Ã_l*¬P~8ŒÐ‡·½9°³–ïñòÃqw3§•Êöëµ8]ôÊßlÆ/›…Ìu ŒzÛÛ}œ ±thMý§%ˆíV°Ù„…òZíÍ»2Ùç Í:9ÞrB¯’ºZG¹‹�Í­e‘$�6±n‰Û­UÜ2ÖN¹×Ýd\W†ô÷ÌUPg#ÁMµ)÷I¬ÎO½º� àšrÀ3­†/’`ÂS|û-6Z"sƒ‹u<±6`Õ°c9lÖ¾¶Â»LVR~�qñ®ò¥Äĵçi:›ß„\Mü–¶.ë¶Žaû Œñi(Ûp EsÄ"@pˆ½»ÞE%¯Ĺ¾�,;ÛçN\Ë+üÀVŒ`\Švg@Û;í|³"dá”<* $¯e³ðñgÔòtÀ/”D@d( dK?K‡§p7•·ËÖ+©®ñvf`¿Øf 30faãxTÿ•{X*úf‡Š,–®fõ/3å—qîAA—>¿šèº0f̙ЭÄõódx2"#)q²…n@𬈺Á؃RS×µÙä\95¢´ ­8ʦzzu-ê~³S'/»tîzí'=;Ó«>ï6âØ{»ßaED³й¢÷‚|ÄkWl¢ê³Ï5{^Ë݃STÃÎzÖ·¶uì—j±^Í\9ƒ>B¯‰Ó„©f5ZefzUÞyý¹Å·‚0xN½å¹¯«QtMŒv}8âQÓê›nìã]ú¨öíò‡\1[•Îì7‚Œ•mu´óâ:=›ó¾TÝß^pöŸàéø+˜òd;ÆM šU’ÏO7€'ŠHke|[—ê$U§Ó 5"Åæjb‡OSò\šTÌhŠoÖ°–“9÷Tß«“Ø`²L‰‚ Íì­O.Œ*¸ÑU\™¸ )îß+Óùœß;Á*Ž76å\áoöеô»¹½9ƒsÊpïJv1²ÁžJé&È;d|‹ðª”*x‹Uu6ã¥Ñ³‚ Ë|óíìºègœŒÑò[Þ1‚cT¾š¤AFvÛ¸¦Kí%£ÝÈ1TÕgÎæ±¦C77|b‹c—à*–ê̸$*m[ÊçÛ5mpÑ H.u¾ØŒõLo* *ä ðÚŸAFìÊצ^öÀ� Å͛‰a½ö¡.õç5«„3 ëP—ûßb� uç¥ê…·îì9CÀÞÖ­A%ÎÕÙ™'hµ[—~?_Ê–{ O+Ë�PoáPsÄÙ’ëCZQ\Y]úئx{gWéd�­³,ˆ˜jý€ÆŠVž2æMK°fe[*Þ]YL•AlŽð'H™›\žª=â´^Žû˜¶n€rò‹–Éà+™T•ÑkÕÅØrAP–e—»s9 D`Ãc…šõµ»ÖcÌňÌwfÜð!Ù4*>Ë9“Û]¡„2gQL¢€9¾2gv* µyÏwE;;NJ0Ø4FCƒÞiƒ²v¬Ô´ŸTÄ”A`jvÒš{Óã¥$–´!~y�÷Ïq_x¿ÿ AéGdTù 'Çõ¢ªlÃrÙºckÒ:¾ž©óª‹nV›2yCxõïھÑ/È ÕÈ—9›•bEHÀnBx"{žµßô<àí¨H§Q|µÏÓw� >/šëˆòÿbÇMNðZ ­²�ì·<©­÷‰^uFþ`3ÔíœÎCÀÕÔÆãæ€ÙÃSE•Wìk[ ‡7ÄY}}�¬òÒÜe3#²•”žß…½1üä[Ò}@yÅCÎñº½×¤Ó¦ßÍÐjóéÂów˜ÄâºÄÿ�Ú8yÐÛ¦dR¶�ÛÒóFüÉÊèøÊÅ�)ÙÇkÓ‹oÊ:l,’0Ñ´¸~K“…à‘“ya‘ês¸&Ù*¾æÄz—FAÌ>á�÷çßÔ2’¯»uõŽ ˜÷Ž>ÛÂoÊàò‹Néð=ÚãDA¸®f�:ÐÎlÐåžÀßJ3{L¾?ú®ÓÕö Ü¢0ªBZ>å‚8G§b¶±—»:ÆþæñvΠsP.™øÚ̾.ÆDß@?ܰËYD´sèIgP�gÀ‰a�W~ ì�Õ`XtÉgÛÝ…¥^º…À—­C´#gG³³G]xÕør}‡™À‡�lszEžÌØ,É«Ðñ}[ݨ=¤Ã꟢�ƒ“0&¹ÖÁå–lI�½`Le�Œ«öW kTŸ4/Ñ_P“ ƒFÖž*ºÖ³(Ü?TmÜ09:·Ï±PôCÚ ­º�j%«Š¹hà£óLgƱ3ÙdúþE?Ït4êHl¶)‚Ñó8´¹oS7gè|�†‹@gúóŸkêPf,’¾ 4‰½öAa­=´±Õž4Á“½Ä ´FHveÕŽ g¹–ò{ÏŸrül‚ûŸm[PÆú±«Isƒ¼"Zæ)� <Ÿ�=÷Q¤>™z·¨!kN1Åw"iݜ肢Ö^ÖÂ>Zøgdú76q¾£ä® Ê׫s7nbO…Џä_ã~\P.} ^Snf–&ÝBUÔtð¶<�O7Ä`ÖýÍwÍ‚S‚¤‚ÍÚÑír¾J,ûa(À©±œO?µæD­Ž·#…±v¹;èb²6q‚ß<Û¤ç‹ g1ðcí�88.³gEn] vÈjáñ¥¤ˆ´ÓXÏ|‹<¾GRü°¨¢ŽL|á�Øb”kÖ¶¦¹ëšÙø<»[FÛän¢ØâQâûÐ’´z„ŸÂÙMéÁ|� hØkœ…µÏØõì·/ÓÃ¥ Ë^Šk|ö0 °8†ÃdÏ×·�˜jat런¤7ÔeËYìïxðð2œê÷›¶ùm5Ð^°v™âŒ˜/žkì‘Ò–ÝÞ!ÙVJülb–Kzíöö§ùu3´Ðã+«Ï¨R�þŸÞ­l2 ñ«ä¼*³‹ÔûÝ>]B<Þ[jW)ßaKM‰¿åmÞßN‡}Ÿ½áÛe˜[ÝÉ9…Ÿ¡³-un¡&Üäšv€Æõ›2âœB�úZ†Vî*F~ öxM‰6E Mì0cÒwzpÉ @jWëX¤¶·Öºb yœ„"Kà)EKW„çÌö²Á»žÁúÉdü�`)"{6„,ïŒK³ÅüüŽ àwÑ×g”íÄ•9Æ7ØzuÛC}Àª,‘ìïsú•ua dgÔ†˦T)„ÎÚ3Ö+{¥Rܰ%⬶Ç2t+Ô+f ©×V4YîmÀ=t;Wd¶Û¾ãžyÛÎý|�-ú>Á=q�ÚD“&ý“¶šöT xGü!«øÛŒ�:Ý.Ì8¼ÃRše ÙýÇ ñŸ],„»  "œ’àsˆJ œ#„Ë»yTsíÔÚ,Aò’FÑä ú+Vk«×N›µ":×ÕNÛÌŒºKH ƒº6æ.vº×k >àX˾Mòãlq±�ô^j£±=Ë`¯z€� Ý@…æä)BSÚÛ{³Ï¿»iض—Ž ï•Cç6Ö«sú³ +ãs‰!)S¤T ñT=ë2‘ß»ú07P#��hø× d!\2°:à —*êíŒVÕ¡ I—ö¶4¶™Ì†Ypl-!�*|3÷Õ®Ÿgwߨ×ÊHTQ¶iïà߿䂖ãunÀP{̌ף*åSåµ²0Ù�¹0]CQ‘<)3öìÕÀc„ò¶ CFQ²„?r%7OƒÓ ¡º9صn»c_^í½ôli�Яë�õ øÕ¦¹iòùHºLóN�€zù‚°<ž(†ºôÂG{ˆ>_0�bˆ°¤›šÏ,SÀøÊ-¶e./ªðزªT]‡!ÏŒ>t„“óp»»26³]"|€äâéñýÙ¾ÚpÛÒË`K8Ý9¿Ú ��—˜ÙŽ^ÃA5ŶùEáÅN¹]ùä]¡{Î!°j/»šÉl-‹¿Kµ5œYïÞ‚¯uƒú„è ÄŸ}Þ•Ê´*®¿x Ü¿CÈÎÏJÕXhÐþ 1bÍgNÖ^Ãëp|ôm'2 yàXèxÛ$6ö|ÃcmK‡oîb#]èZ‘ûd*s3äôÙD븬`&f Ü¹Æ ÖÅ…�†u5²r¶3«cÕ\JÈ0lêíDU|lŸ ;îsØû“§æ\û|µƒòüjù=)?@QL‡<Ç`=g 5ùJê¡ ÌÜÂüoƵ£È7XÌ–ð¹ïL!–û¬×Tzó\ÇÕnf%�ßÙm«:†‡Óè×Â�>æuv¸>¢Ò¾Îö8Æú-±*EKœZ¹°—Žpx*T‹¥1!OC :^¼gYÄ––o ®cQ½Å}Mµ’(%?gñåŸaM á�aör—e¾Wçˬڔ-Iš(2BºÍìTK‘ßÇ!ïl)ײd=kpre·0@‘�h±güg@a�Ʋ1lñ»SLÊ^vÝ‚nšëK+qm©ÞŸÎ4�s�¤#¾v²0eâw&í6>˜ysp0š¶ ÿ±ãþj`F "FÙ›fÉ?\�’Çù,ãt¥\¦Úè)´ù´ÚVÑe8u¿åÎÁÔ÷›¾ýÐWH@Y|7›{LZm�ÏkÛ¾b$°)eÓìäÿ40jë»DˆØ–x¬4—0QZ�µ6Zkãž>¥`Áøtƒ½UËXRÞYX*£fWÓk%˜Ã6ÉD9˜ÜC^ô0*æC£ŒY‡ç'É]„™nûhá`Õäv<‡Ž÷ ogæ¹{ˆ’9øá+½?W•19\QK(†w¾?_rmr^‘ΟÆ(HvÝoޏ ¶k‹‡ /‡`s³�ÌV‚®Ÿƒ<]Ž~;->ìíÍØ ²„ÀÜS¯ÝY¾÷꡸kë¢~–öÇn×ùÏ>Ã]`ÚÈAÄNךÍÊ!9+�¶…´å›_"¼šq$+µû ÈJý´ÅFš¶�À.2›¥‡]Š”Þ³‘ë_Ãù!kA±çÚ<±W‹$ Àß²?{"ÚLü !Ôݹ�Mµ¸ý@ö:¢N&…®î¤,?øâ-rÈKò-±òY»«3âècÁÙܽÁı£0{Qå \]K=Æ=Kw½Žs�rà&Ÿ7¿7­"ÕºÊiÐÙI‡Óæ«°â7æÄ×_ÃùdFoGó·z6;×|óí …³¡nÚÈ ¢ÃäÈ׬j~�Ý�‹¡ÅÐÜv�£¹ &÷Üo¥6N!Ô¯Æþæykb� 4¥z"s÷Å®Ù×mÈ]î”…€=|ÀÕ�¹F(¶Qµ7º¿Ò–.“îqÉá¾ 7HåmFib‹5¿gi­è[³o¡Qu]>eùq.�j°Y?4‰¨jÒµ×û¨Ü>¥zCUî_!ÄÓÁØ©¸ó‚ +ãèyÖA ‰áƒYEò-ìK›…¾*p×-”ëkbÙWѱM49�š/E=0ÓBÛ+¨Vcºn7!ÜQ€«Ÿšî…Z2_1[46 TØš� +d¾WÜ··R„þg‹§´·=ɧ-ˆ&߉3�jÊe`I`Í É*SžT6c·õrPêí¡?ŒÕÜNÂÚl�çY>ÞÐ7Êȵ%rÂZNÚSU6ƒRÚ|[\gÖØ *¼¾S‰ ûŒG$™Ë³ yƒƒ9ý~g ×w[¥óê""oŽŠ-.[¹ŠXaÑ1Ôd?ˆ¥bºÀÄ޵ ¤Ço5«�@Úkz‚+0n÷oIÕŒqOkVø“2›µ÷iº",`cçÅc:@¡õ»JpÐvå^w,$;R*­Ê³Qä„í»ŒüÕîíÆËønIŽÛo�tË=Å™µàÊ·KÎâ¯oœw†ÇZÔ÷ÊéWºiBæ-›[Í`ÝŽ 6éóÉ$_r.ÞéÙ,¾á{\w^ת"6×Ã#¥ç³×˜|ÀínT¼{f`‡eÞ’$G{4PÌ3Ú„DOE좧`WÛm;fá„ÖåòÁm©ºì‹d F‘.`«'ñaá.§™Ÿ4�§–JÕ³¤¹ ¤5†·œ® ­[¿ì»{)ÙÖð­Xv7ÞÝ_ 65ÆîP…XÛ£ýéW+ÇM£˜-‚·âŸ6™|×YÛ¦K‘z;n„ÇͳO‰ÓoˆÞBZ3jâø•K¿'1nþ'ã†ñŽðsÖÓåR;¶åØ Aœí³€�(¿¾ÙÙxV—ð{Η&Ï oCß`Éââ0‡î�d],›Lr½æ5Q„Œý]Ä¡il­ËŽ{eu ³77n–aáÇ…I¥Ä-¥»­YÏ$Ô» ÊeZêã7›¶BQ\w&^ ÄØGµ;òçÍ¢vó[�ns¡©L„5¶wV|�±‚E^Œ}¶kþ›{³ Ùž':�œvO”DÜé8ø£v:£,àæ¹p…¬�~û(Ø c'B²o¿#=ò�ÔV¡­YC “5ŸjÙdÂÐŽaÜÿ[ï‘™²Ð÷3ÞÕì»`£ÏΊ"£Y[îqŽfƒÚaËaæ-¤Î›EÇiikjö½÷êó¹åKφ°îýôSk·agß³S¥ˆ³[Bz~A†›öé ÇðÚð¹ˆÅ†H­slnÉAÌ4éø:ƒ¾X½~j`2cLo- ±‘𨘣+, føLJ®�ü\˜ç‘7Îbæ�ÍÚe¹ú+/ðêoeŒ0:OåjMÒYF¨«4“Îó{-�¶Ž¡éÆÄ7æÍœ<%óÐ0kâøXÐ^Ø<×\µ»à!$0�¾['e¿ƒY}–<_³ÕTZÁ) D‹w¬^j>ÛZ:HmÄ%ÇyÐÛ‚ÀÜœŒ†ç›–Eíp\¦¶t²VE[ Xe\1”¬ 0[ :no!�»U“[8™GU@^3 !j÷—% \ÐØ÷Ëv¥l­]{Æe»¨ÉSîañŸ·v¹Gk§{oãÆ ›k/õeÐ'U¡ú¾¶ùÂølݶ’ÑßÝxÀðL€êlUüŸ¯ ß'!WämÃm ÄVê¾XÖ©rÚEúý½È¢•†Lµ ƒÙ,×ã^εÁá‰+ˆs~ÐWC„"¾1 õ6IîÇß®êi|ŠØuÞsŸ‚_%á¶ÞÆÛ\·§5¢�|Ră€ÔsS3í—é�Ø…6¶™sî×’Ùª½Ø.æMŠÂÁÓ1’ ùöÞ½mýåL°ˆ�Š‘o?hS¿–Ô�fÙ0ÜbGö£N^f~ŽpåÔZ\î>ÈóÕÌ—ïkœh1 ÐDÂëèJÀŽAAS!«MˆïÉJN®¥µ‘ؘêz¦N/ÿÙÐåî7Ó=ÁÏ‘|µÉ€`¡×ÍîÉg¯z°"‚˜±Zµbg¯f!ð ŠI/Ö`ÆäY±„ãHžÔ_%á9e]”!v%�óÚ�¥3 •p.áðUžìêAA¿qÃjjö+êî¦aå�+c%sÑ;8w�õl ‰M»A8Ñù4¹ oæðcÜ·†º÷¤–÷7ûCº3 <5gûSÜHGÔ4Qøî­~B«+j®]»é{Ëm‡0ï q�=QɉnÉùZüáT@ÀBÝkÛ®Oï͆{p¥äMÏ’¼àSfÞ{¥ËTI¢$01 tË�à&(Z=òÔ Çž=×-æù½;еx>pU/f§¶á q/€p€Aµ£ËªUpæB݇×Õ�ŽÞ#»Ò tù�øl&Ð@Ñ>wê˜åàÊoÉ:Á<}g?Zþ€ëà9h¤g±ßEœAŒ™õÊQMlJvÁ¨·iËoñ–<ñÔÞ»{òì!GJ�Å!kŽ›Ñ4ùÃðhjlÔ9vE¨Fr¡Gë6ñzLqCFû·fb&±ùW3O¯&xë{Њ¤ƒ¹€ð�öÃ!÷¯›é—w,wˆOõPÌèš¾í‚L @õWî2,¢¯©84™è]‚ut+êv¤ßzÝ h„à»N—j&­mðiÌíg¾´ð^•§É Â•aXP²ß"‚n‡é×ÁžócõªJ‡uÅGà˜U‹ ÃHzF@ã-Ž à‰ïÜÞ(ÍK¦ý²ý‹d ³SÔ°voú©oÓp­^?{õ�Ó@î««_zêZM¾"†õ·¾XÐl,v$Až^ù¿Pt+è³výŽ+ùE!ÓGùA^qœ¯ÞɃ)¯Aœ;»ü¸RÒ¬=¾OÊ÷̤]m(ÄÄúÚàŸ$ÍH·#g n,|T±S{f|kß»RÇSŽa½ŽuæS¿� ó§!ës¡îF9šé—ɾHœw ºA0XNÝÇQ}=où;Lä ÄôÙWpÇØRq¿-º*®û—ÒoKé”°O.u–|óŠF�Œüjb˜hùlTÑÆTk�B4Ý^Ö_è1Æ2ÃdæD‹î_:^“ŒÐ‚ 'Ö¬(d+Z~X� ncèúƒÌÚûjÄ:ÑÛhçÂ@Æ@¸¶”: eݲѽ{é|äàõlÕ¢ù-H9Y>º[ �Öe¤Vd—;X¢Âúú²"çk?.ÕM`Ü\›a²cK¶Þ¾;Or�=o­®«»Æ1WAêhŸµ©uJ ÆL@îÒ÷>î§ìÉ·ÁÙ¸3ÖN†”¬=Rö> t\„{1Ôy®=Ÿ ,?½Ÿ°•×à`%¸§BLÔXëxµáDuô,ûßçý»¿óË4°%ÈÎ2éËøêÿÊa9ËØüư ìC�¿•ÎsDÕ€ùûsfüšÍ^e�¿œçÉ w åA[\ gȆ_t J.)ÙðgkˆÄ§òËòÖ î ‚ù@]áù@Ok_ NádZD”ÚR�Î?Q þÄYc䱃Y,\-RíF=;Û&yøóW^×NúVJÖo‹S�;qæ“xÑ|øàožåk‡Ç {“̘4–ó�ŽønÀ.¡ª Sàµig«‹˜V¦Ùç/®ŸÉ‹ÅžðUÑÝF@"·;<¯ 7ìóºòçÍp]‘õè¡ äËò#AÚýä&½uPöX¡@×�´Z‘-c ᦇék`V¨yÕ{¾¹lRf¬%xo\ ”›ÍÎ5{™Mh:Ä ÌeÔªû.C$–xC,8xð%aëBH)z¸P¯ÛQ¨j ö@"`÷ë_žÅê3‹Íd)ݱÉc ±×%¾"þ¼÷¥»ÜO\ßyRDÖÑIüoqv¾ð—°‡{g�ê„8`šy…{Œh}uÈý$Ë®þºÎ°3{€ÎíÚËŽ'{¦+‡R ÊÃZ†‰¿ ´ŽMöŸ.x ÙqV®ç}¾ÒôR/gl¨5Ëy€`-ìfs®³ ß®Ç{çΠ¡ºE+Ñæ€æˆÒüíØcvÖiŸKÈâqS�>—ëð#mbQml¬´�q�Ô…IxÃÈÕxØMŒnYµð…TÊ»òX;Sš^ & Úq…õè»Ñý»àv½ŽðãڎÝÏí¶ó4^œ{Í$歷k#KoU¾Ä/¦–%p“å§…fÈk”1àë岸)Ù±v'žW%H¼' p¹¦.>ÝU©Þp‹a°£?>»k` ˆH2l¸:úJ M2Kuˆ‹v�0làtƒà ±?y4¦°]3[AàH±Žª�Û­ö³xÒ28åRÄx§‰O(ho“¬m²*5õdøš˜ñ×—d|7²ÝÀ[C�•žR€ë:nO'ÑŸ¤r )†6î÷!€j=óe‚Ü¡áø6ÒÞ„LönhTÊ[çÏ`«Ø0VXköùdøœ¶A<Ý­æ˜;#*&~¢º³¤`‚µ±NE‡)é´òüëq ܳò†¯Àg¦Œ±â+ß»ùŽÛhε¾^Híù5Ÿ²Ê�pW˜»88f¤-¯yÇ|ëm4u½¦ö†B?„=ÉäæóÛq€}›ó™¶ã‚\œ¨iaàñ¨ÏÉ} x~FÇÆŽ€»ƒ¦—¢¿‡5š ]&ÍùǰWhOÛDMu'ç4‚?€ÃÄ@îþ@ÝHÀÑÜõƒ× ½Çɮ܊ë|R-kIÔ²µ'l aŠ}¦ÌmÖý©¦U«bóD.ªî#Y0Cо“ò]úˆÝÉÛ�sANsGȶšØí| Î~ñœ^–WòÞ†¼Åròý éQæ­`¼°ôà^V^ ãÎ8ȇÍG@J5Lò*ÆòÑJ.�]î#ZÙæmJWý7Þ΢˜ó–›Ë ñ!>’uY°^pD¥nZ¦Ke¼ÏªÃ•å#ŽÊâbß™+çñ©šnnkò2«£ä�nv|¸:ÞMß *øJ§ÚÙ3§–Ý€Ü7…Ð[ä ïTûK’†ñ(ÉòsJ›h×âŽ7C»˜Çv·^W+À&”W˜è!�#+|�çCötwNÓ]Ÿ˜n®my×(FÛ(¿Ä•bæåBwŒ§L½n]^üÇÊ\hYÔá ŸÞ�A×Î ò<æ'~™cÕË.q¦³¢3¶y´þÒÙq?\/ ¿¿WìZLþ¿Þofh_™´TU=¥Ãi,e*}ϲS–¿Ñ ŽôŸ^‹WDüaz¹t�-aYØÝúý,òPNß6­!ñ ÞëÍÁäzmrn ¸9iÿ}ŽÎÈŸ·�¶W5T’®|œ–õ …½utõ‹¦R[j‹÷ÊÕÇ“Ëfo%)^yw¸è›@ÅaIèé˪N l#oŸl×søXÎ#׺µ|Šk§0ÛjuwÓž&Ñ.™� _�s– Äø Ó"î:õ’IAÁŒÞ�¼N~˜‘C°,?oÊe†žX£ñ@ة߭¨lgg’TŽ>ô'[1 œ|d!^5ܬž×Ó™õvo¾áQ²×o 5Ñx “Dƒ¹€^ªçÄ[' $DSm®_áZ‡¸‹KuûZúÜFv\(N�ñ‹Cí)¾Q¾+@FFb$¦4j–ÎwÉà ÁýHËÔÖqp£6eÂYòoppõõ¥šxHÏýt—hU?pÁØ\‡6Ðä(oú¢†6¸bó”eºEc¿“¼)J«ÍÈ ñhç¬[µ£ØØ| ]<¿4{žµSýuLo6FÇ ­ãäå£ÕóP vÚįö”.ƒ‰¼£A8Ó~C=Ć;22‘žÎ2�¬”õrÑ1gd·NøÐF�ñÚ=±î¹)CWn�ãWň%/Z¡›±Í†)0°sºŒ½Ü ¹Rc:Dê9¿2&}vò5,69Œý�ð¾dEÑüD]èKf©‚ÈY —ß[Jýi‚²2ø®ý‚æ‚‘¼m`GSçÙ<Äý¶€ŽïU<�:6”MÍ>s¾~vÖ8bŸ‚0K"«~T‰S»þ ÏªÕøŸDke[h"…únêÍeÔrȵ_a‰Un­LÜCÌ}G�âÕÐË›ò7�ç*Mƒ�óÜdçìZl: £â÷Hç”8R&¶}FOÛÉÅ~½§M¶?V•!·{)#Úyv}ä”Vnî>¸S …8 RË p®©®?‘{|3�Ùõµ>{ à�íÙ+è‡Ò¹”IÚû~2Ì|þ¸gwv�yMÄ^õ€ÆaoxH‚3„•I%û G÷º<Þ%?m»n{Îyn®�:"©â¸[˜Ž`Ôl!›÷»<›ð)g“F{mö¶™»–ªëÄZýxž³Ž-âmÕœqÄ'Ð\6³fAÅì'ÊgC(inXÂöì#`Ée\l Ò2R]¼Èv°. ÐZý$©Ï°¼˜[G[Ò�¸,ÉœUÌGܨ‰Yôª´Ù&ù&Q(H@›6¨µÞgçГ�xº|ŽÐô*Xð„ ý(3Ò¬yAj¢ˆÒ� ˆÙVö�-Ö öç’Í{¿Ä�ˆÎîÊZ-N‡êÎYÜ)[ õ$ƒ‡ŠøuB{…šæ•oTô¿eB_}Q@VÍ㲟¹‡†XŸDWAbKì7Øûa‹gBŽE–ù¾n(H? A.³w¾ÁªÁ ú·ÑÑU(t*¤¯· 4œÉ�ÝxI]î1|à ­…;ÜèÒ´-/6�#sœn‰ö/[wÚ�ƒ�ä²Yü�»Qøä¿[6ŠÒk�ýkn,]ˆm—¡E[–zYÁ0p:¸ùqBÿh"cµûzØå>¾=f+¾�6°¤¶²@M`bˆ9õu0®œ'ÈUµ�·�>Ãà2%8G?´þé±è<Þd2ìnÀ™“�™;?Q÷õ2ƒÉuK\É}˜¬v'w'Û¾{!œ¤ž›¨¹Àr+ZÙfúìŽkyKºQ~”Ê™–�ö év A…™-hó¹{P/6|B=�÷]1Ìù[9Z™fdD:nîu•‹0)!†G[AWÐ3¢ …‚,À(xUÅÞ˜î÷ŸÞ«‰aC8‘ŠN¢„íò+³¶ØœUu¿¤°üÝ^pªîù,ÆoŠÎ$6«Ü%¶Ê‰©n�MÍp4çsé�ÕAܤ�œ¯¸¿Ù0X£øÀ¸\ÁbÎC}¿ŠÁ¾½ê©&]Î~»hÃdV�¨«ÈÀ=ž#òÕf¨G§R\6öú�<ˆ”oìŒëíÈå.ge å‡*¶?Á§Nþ£)ÝÖ:’ΰöÁ»¶Ð4}åÏ@˜²g–mñœm>MC ¢éI…zPy¹ÕUÌ¿>òŽE¸Ç¾ÎÏ Ðìèjv¥|NCl†‚·„ûìÕÇo&†j/„+Ím0d ôŽ:À,ÄÝu[>‹¾«{K©Ìò¹Ayí<™ƒ–�q1˜OŸçÁègÓä¶S@¯Fq”__G�ùï÷­ÈÏš‘Åp9íl)³d,”Œ”ƒ�Ö†2æAb‰YMHê:¶~<¥ß§©+…`‰+¬¯kÕ`µþúvësn�ÛÓcï¼~r-/Ý=weæ?‡ �|�Y "„ýº‰4æ+®¿* 26óñ3RÄ jú@Šf�†2(Íè¿pI¸^³Õ·ØnãQn[Š0ËAnt­¨Ö#,À?® Íøç9®Ã ¹¯¸á©�ÓåLÛÌ<Œ.›¿ë¾¹ñáZ~aŒYø¦ŸºJA˜Uüó:A •ë"×±?µóÕl¹´þ~¹ß}X"'`£jÄ L;–ø-cfðú= LŽTý®öïáƒwµÞöán›¦úæì NäòúBû�hÃΧ-ÛwáR‹( I+ñóÌ0m&í=•ËÌ›ÑÜK+”e�îoάî±Åõذû�ÂÐ2ÚÂ.bã …ãè ±ño‹ƒ0E±^>^i9Í€j./ Þ…¾>¶ïlW˜öÛ¼�Cç±â” Ù/Œ¢çEóõÛ‚©³¶ô‹¹@}ŒŽÖ5 @_¼¬í½·¯šÏâïáeø‰6«|ºlmHÃz MOÖÍ›Žo_�—ï´[ä�˜Q5:)€Þ¡$Íq–.}ëÍžö†°¾³‹Äx m»õ”–@û™§[DÀÏw[¯…r¶†'õ­³â³*m9Ù£íã»>;¥‚øÁþ#ê]@�3ú}^í92‹Nc½ÊY€„©“mU1,ÇÐ|“K¨ècQn;¸°¹4"}¼uÚRû)@SŽ”Ý[·Vêebøãèûõbê8æG]Ú@8<_Cò¤²�¨ .=—Q•Åb ûñÏÂ6¡0soŸž¶'kj\šñGF°Ìê…TíŒ|a£äùî@>odPVç¶ ¢~-¥,Z¦þ}«x±Ýx|�ùkÓY‚ÈæËL³3»>ñ8ê!ŽV»ñfKÂ[¸Nà£x\rÞmnœ5ö¤Oh× ßMá�ZÄÒb¾Öå_.ÃH©1`ò<@¯ƒÝvôë¤ ñ?W9ä†í°åói½Õœ>À{¾Zr’|Þ‚cZ¬ý½Rh ú¶wÙ÷u’K�®¦¾(�Þó¸EÍÂöâ`›A‰$ öGaÈ!öãykGºCîËô>ð&˜½�†%ŽCY~êÅŽ|ÛÔwÌCI“C¦ØAº-÷ nÔÛŸ=›šòòöáQ�ŸÔwAÁ¬¢�2²œ+^ÁóDnÑɳ¦†® $øí˜–Ùuá1¿rC/‡‡œïŠ›Kçc„|ïëpc�²¹U›¿°¬é*±§D-[³£ÂWB(_YäR9À›Ç-®‘.,âf®Ó•;Ð{µŒó�¸±¥Ð'B{MM“v¿–pb‘[ˆP=eË”{ƒ5uø)ö~OMN±e£ÖµäuûÛ«nß \XUþ‡n‡mëò¡òˆ¡Ï�ä%±ó%¡ˆ‡qŠ´ßY·Oƒ‚¹©RVΚbTmj¼öõ±Ê2 ‡¸_²¿Å3]Ç—ÖX°l#Á¼ÀI2Ï£$‹9=Ž�ÇÁ½i4WcÕ•€r‹ËÔE[æÞ}då ¥‘¯~&ÛFÖ]É Ûá¬lüK›†}z ¯Ï!E㲄 4öukÞ¸ÌÝŒlÀààC$ü3¶þ§?§×Ýí á�‹H|ŸYøä™ �êPÚÇâ¿‹ì’ñÁ§ràC»vÚàl*ùOLûPm‘&ñ7 zÁy:ÛsIÕgÈ+gG*ðWöm­|•{»â)çWì»èF;%nžÏ«[½C·W~òíQžöõ´ä+s}V»óöÉ×[ïÜjŸßièÏwþ|ÿMþÿ¹˜ Ý–��ÈÉð¶‹ –Ñ ÑaƒñX �À’X±ˆ˜„VHÕkoñþÛïõ¯ì¿Åý?×Þmt`Á?ïù9±ºì¹–$±ˆ$’ $ �H Á›Z64Bãõçú1ìÎ:ØÀž;Ø> çÚøo÷™ü¦Ÿ7­ØÑAc�º—Åló1^«Vº^á.¹ä¼!~35”._=w£ÿU¹{¾ƒ0ß±ç~uÑ1×Ðq?×}0uy+ÃþÿeÂ=:P~ý¿.é1’Ê�WàK\º¸û*mÊ—N¦T¯ø­ÊûÞ8Ù,çH¸`/¬ß><[üÕwúóC›f­î�¯Ûô:Uh¼`sêGÖ�Ü¿ÝMºúÐÎÇõ® xv‚kyçÞ–'¶ÕŽö,‚ƒ ŒŠ†Å'±Xh¶[—ªõè)°˜hožg½ÉÆ£6•m�õ˜<µ ÑÇÅÆp�Dàmw°ô鎹Šl†+„ôýTƒ~lDh6SÇÍŰä5t°¤…Ÿ2}Ö‹œ$º‘Þž½µt|>C»KdïÓ†Ði/Y¹z“()¾vArL¾pyãYõ–æèÎêæ›¼q/pˆF;Þ˜r:²¨éo/MÀ³Lp§¹å>ÈÚSüŒw›Ù{×õ$´@õšê»U§ [r’FÕákÑ•Ýð6 Ý£ÆOþ·òòö¢Ð%a,èžs”ÄkÔùxI$Àq#�Ò˜þ°ÌàIu¬^Gf`6 ¼Ô¿¨]CSÈÃ\¶TpÄ[Gœ$Ev¹Ò¼°5±8ÎC0< lmÔ—†ÆK™LqjÍi#h‘æÙ• o¥½¿™Îaó ­¢Ø_3G@DF“½ú"Ëvk½ûû÷àMg ¥:hQ :&d ÎÿÌúÁ#*¸&ïÒôîcŠOEF.Æúì5t -„ÑtÛ&#žo©ÛòK[†î«‹>“î8FØÃ‚yR¦“:Ús(ÉãÜ7Úþa®áƒ‚¾u·Ì�êùîjN×ó6 ³õ¥¶ÌŽ?gT˜crÅ Âx |æ~þM/�ù‘€�Ò-¾W^AW"­�@w„¡kíp†ò;¡‰ÞñïVz&…=7éh1‡î¢ ‡CÀºâ“äk¦Ê�n¤ßV¹'Ê{²è�Ýå«·}ïYé°ê&ÙCØûVr¶×Hyõ‰¬$wŒ&`Iª»°í-ÚYl•d žW{ÐPü§!�;3ñ»n_B�[ÍÖ‚d÷ §}H,dt+}#ƒ—<—Æp€|ñ'íU@ŒI)ž!,.…Yð¦µöCÑ‘CäbxÂ|Ôñ3Ž2a."^,r!È®&Ä4¯#Mm¼ !2#èªOæCx¶ýldÐsrƒÑÚ�«Yœ ¾Í2CðÉ»›Wäkb>Ü”w ¯Àak�wý¢ÄèUoð™9~(×,áo�†.aÝë£íß›å“jÖÍ;dfcà wã°g£"ÖùÏu-Ÿ;vvn%li[ÁAi}fÙê~ ùtʨ™”@Òg»ËE©ŠÚ°\ñ¿Vw‹€¿’o™ÞÄ 8€U£G±þ ïyÃbˆLˆHäC\È|ÿ?_á»Í¿b_¹�kíÆÚÑ£Ú-J±|ûY{‡Ò¶õo¬˜spT©j~þ�×( ¸Õ‘U+PŽ.üÃYÉô}Õù¬Ñfª…—ö€¶mkÇ í°S�P�ˆŸ¶½¼8‘®¢VòŸnSœ›^7Ô®p´,vì‰ÆÛÇ�-é5Ÿ§cÞó»íZî¶=là(¥éyÑÎ Ä-û×± ·ˆ@µ¥™�ÙµD´ÊÛOi8P§‰ÂÀ°ä&û¦äÓjÑ–ÀXÕÏ…é«U›· …üÇåÅj'™Ê~_¾ûp:d™G4¼ýi Ä,>¾o™SQcb€«Ø9ï í¸9²o©æedÈö ×Ú LQÄÒµ}óY‘n-¾'ÛÃ�[º ÞÿPgޯмüë¶äµBOHްxïÄ JnÁ–'ßH7FË2!h†›i’jmÙË.tv=Î>¢—ÄK*�ŸS× ý8Y™—EkóWðôÞµ?¤CI|â|è|Ïïª Æ €"ÜOtö%—é²ßÏÍú÷ßò™Ýè­>Á)ÿ]ÿÂû5 •·„ö ƒ(j yV÷}4Pó1õW«ÉëaeÁ ñ¬z¼�ËÍø¢KOK¹è�½±löWqÏ�:õm/Æ2_]…Žœ_�¦~½²Co)oÍ{Þ½VÏ‚ZÅÂYÒD¬åÕày•WÅQ©ècLò›ÌqÈï^v´ 1°HÅrzÄ¢/<] þe\ tÕ5V–˜l’w …šÀªv䉊³X!Q×üÉÝ}C«gG(wwºè }J÷{SÇÉ�|°66RðF=še´�09§­o4�1Ty{±ž¯³Zç}ŠŒmÛ5ÂËöŽ¿qvÝ$�ù·ƒ¿U™ƒÏyJ™ì…(ì*‚äµ¢<ö˜ ,çZÆ—«WñáidéGm\yRñ?±F°Az$ë­E!³&9jÆ ˜+©\S+ÊÇ8Gy Á´MTËÌ£ SQ{Æ#7”Ôzûù´,PA ãN |Ÿ•WÙ³Ë0ø}á)/úo]­qMsÓöÃJ±ÁJ>§l$&Žåî~чþƼ*líQ^vç:´y—#îQ©uÝOGÚ©Hì AÃ-ŸõNJò«Ë0]ìsKéÌÜY0½*éb˜Ú¦ ù�R) >•’NhV�Ìb0O¢YTŒpFrˆ€¶,wàŠÌTœ[¹Ïf÷L]z¨eÛ·Øêš­85ù;“´Ëô$ƒ_YGåVTæCC/d·@ÒñÞå$:‹ÖNñ òž{ìeRÁ­;™.CTwj¶® æF¤�É'Ìcª%÷åÐfõ¯ƒ�ÖÞ¦z_Iõ4 X?ÏqÕ’™•ûÕ7Š·h¯p¾CUŠ{¿Ø´‡Éë‹wÍŸ«ñ(—œæó„$Íú^îr&�lØn©�ê:hÌàæYqnsh‘gRAÀ&�}­ˆ„m{¶Vµòúq�O»ãÛíAPÜÞb‰õê;ª¸©GJ—:§räy½ˆŸk˜3¿/Ídn]æœë¼·w›Kë‚Ë;=ú)`xÒe ¯Æ»†Fæ>ʦK°tºÀì…¥ûàjyæüŸ;¹Ç�/S{‰yÝÄÍl6¦ûbÕÜ¢Æwðªt”¶÷“W(bÔ£+6Ä ZRL�º–ƒÄ÷ÛŸƒœï!¬?O?¶º�D<–zšB´eÒKÏw¾å _K‘L¿4Ùf±·Ãö+Mõ>!�lì.]ïh�1uŒƒ|óp¾Fû�?ëÛr(;4!b.7ÂWˆüi�ô¤ç¦<ÙÛç}ØZ’ù_?­BðJ» HÎ~©ÙµçÂ�_Ýøñžºé¿XÒPð¤Dùp¾ »2žœæóĨÚÙRäCÄ’aܬxª âöõÐÂo,÷œ;»9srÑ`1Ç#}Ë4¥ìÒW0ßSÆÆp˜Ìã§fO ¤%ޝ{rú{÷‘8Éé…rÏÌ´Y[ƒÊSîŠq‘Ô—Lê¤>'ʩζç3†5^4·¿Ýo'ÿ‹»¬Ï+˜¥·oo°(ü@Fܹ×›Ž`0ÙI¯½ž ö$D°ø¯0F¼²àÜ�)úúF!‡™Cçˆ÷µ °¶ŠÂÁ…cë¿ ;ÒôpŒÌ}¶H¾-8JÝÜv•Ûßç>Gµ?}Â\Г»bÝùß|Ò¸ð‚M‘κ¹¥óãæÌrª>LG5—̼¢U¨C—«jÆyŒ[¸›=õ�ê�ZþR [°UsÓ﵉C�€vlå£,–>÷÷À}V÷‡šE/…‡Z´ #jC| YìÐ}QÒíV‘¸@Qùò�ÕÇ�õäÊIÙšùÄX22¼ê³9ár`ìÙ!úù’¥”émÙ­²ûE¾ÞH<ô_”ôUÍc†¡Ä÷tz[ƒ^xm·NÌ0ä#²;ë=>s.Äyñ.žÿ\ÞÐË`��S-Aræ rÝÈzAu‹eˆ¯ïÙsÆäù‰js+Ðßcøh6ô;‹¥Yå&æ«k ±ˆ1£K»„ãh˜!\×fÌЭCR–S�¹ÒšéfÓù÷BåCádçáïwf¿kÑ+ŸVèËpGÐo§lް)q̾S�ÂÊÚ«Ó¼ø½}ðÇçWKoû̹=>.�?œ1ÉŽ€ê ‰8fÛÇs`ÍÑiu=ÄîmSc¾“rvìªm²ù… kÉRÞ~³3lî˲�…YÀ Ô?|�˜3AÕ¹íØ wK»–[ß]CÏ�÷Î]´ÍÊYà+޽ɾûõqé zÅb+sèóŸ_ZQ¹Îë º[©vúÏŸÊ­îÂÇ_[ÁnÞçt¹Cï ‹ºMr°.±3¸-µu׎7î3à9ßk,çÊ0AG[ï|ˆÃÔq>5Î×<_3MÁCo‰Wâ*~Øâ™Léb Cƒ€ªÈÚ¨ž¿jßÁõw~>?½Ô_#ëlüûŽºž•·ùâÙŸ€\ÄmQ»Cãvð„ ,k2¡4±wívéˆÂïÕ3™}êÁ¾ `«MÖþçE3“>®Hj¸µuæn³¢Qú<®Ósý\Wá–wdlAüçRì#:ñÔw¥,¡ Ȉ.³ìZLÅÐÐWίÝjòѼµ›h…–ßsR#ŠºebytÆ,¨‘ä¿!]ÂÆe˜)^ Å}ÄFk¶;<®S5¨¼Pº ¸‡“Ï ½·ÂðȨuÌO ¹oØäw»XM�ý‡ f.�..¶.ÛK.¹{\8 ´¦673†iˆÄL-¿ËŸ+-u¨ý�ØÚ.F¾[YJZjš%“óCÍ«†”Q“;M0G³‰]ÑŽ|ö„ÉyCÊ‘…c°nƒKYå`GQÖò×Ã�\«òÊký·Â>7+]æ4øãjÕ[« QE�Ž ÓÜkîc쾸Aãõÿ5n ¸Z84,˜c0¾z<]4VÆÕåa©+º»o\æQ¬ÛÊ qóv=—lPãÖq§qûr)½‰Ïmçã“ÌÅ�"w»¨Û £èý}6ôýÞqyB±}Ðõ]ëEbÂ@ҺńD;§*Öb÷÷{€A†·½Âó•,}ÄëþÄPx}f0>žË¦S–|àõ”œEÖ߯áS|]£{%² ëLAFÞ’õ21ÝM­hŠ$³3“­Ýõ­|õ¾“o˧ �ßµ• ¾zé3¼5³ÑÐbÕ˜õ7l¢±÷�‚- ¨×Ýmg‡¹Þad6h~úþfÒäÈ›ro»å Å_Ó©hÕy;EΈ�˜}.×°oB­,!h»M ?ÇÍwÚÐÜRz2z�¬3NE½[¯¢' žTuA,‹…¬J^z6Ϝ܎P«¼@¶„_ß³†œÒLýƒ×€L|ËÕ^?0KÛ)}„n/ó·K¸ÇÅ÷׸YwÍŸ—j™7$9=µ,!ÊRá;+k”º£uà\SåÔ',%,­¸Xñ;¶,« Å·¥¤Öìh;«elö—#X4OŸÎc¼ý1p ÷ Ê9T|æ: ª>1Ù…?�û‡³¨§ë´=0$÷·5²¬ZÆá-…·Ó„/ïµU}_ôªÕÿ†Õk«[{Z–ͪËVm[SjÕå­_ü ¬“)¬¹Ôž6ƒS/?ü ÿøÿÿðqÅÏø¹ïºéÛ-»«·[¶�[}æ¹½ÛŒw;¹Û�Ü®NFÚ%Û :îÕÓ [NØ(€  €=Æ| D€*   P qäˆ$GÖå`�m£n�»Ö÷^n�×û×Ý÷¾±$÷Þ÷ß{¥îw½Ñßw—Ë–._<Þöë½»N®ù;ËÝÇiÝ‹»»º®Dï¥ë½ÅîÞï=×—{¸Mvëw{Þ¼ô§»Þî÷^œb÷ww[ïwÏ·º7s¯Gß{^õî^§Ó©çn{Ünsvî®Ývî÷½êr;ÝÞ‡nwNèÜîv{¼¯=ï{žûß}×7'uÓ}Þ¯dñw[›ÞíÜu=î{·§]í⽌“Þëȃ;Ó«¦÷;žÍ:tóÞ»ïwßrO½÷ÛŸs¼¸Ü¹0•Ð÷qrñõÜy»ÝïvQÝy’ów½ëݺtîî.sæíî¾G=×v;¾÷×Ý󮎞ëǹ˗wDî듹»·|÷�|½wºö.îÅÎ^]î.»ç½Û�ï}îøï=ÞéîÙóáÞ»î7Ýï&ç.;·½×·:nîDîárw‹ÍÔîº]"î�Ýt÷Ýï¯wÞùyÉÝ÷xõÛËÄÞw{סåÎî»§^»·™×!�'3yîöñîÆá@¾sI…ï{ÛÎ;ïW{¤Ë®»ºëÝç»»Ýåç½×¥!®÷¹êã¸îèÆÝî½#3Μ�¯}÷Îû”Óï½=ƇÝåê"W_zÛ¼z÷¯nîr=ÙÞéÛžÀïºõò{®ö�õÝŠô,.»¢î¹ÝÒ÷½{çyÈqîö÷W½t]qyóÕòëîùîù׈Ä\Ý›ºuï]�óïvA}ãsÉ×\;»Nêõî—»Œ^÷»ºI#){¹½ÚóÑ<åäg®zï]wvíó�=ëÒôÝ.g»{×\»;ºûÜ;¼|ïuÚ.çÜïxó»‹ïzûï[Ý;=î{wK»Î‘çn绽ryÅíÝ‹Þ÷{]w¯{�ßw�\vܺ;Ž‚wÞèòÞ÷ËïwÞé/w½wuæûîKí'W;¯7^å÷rQÞ{Êô_;/¾÷½Þï^;Þy@¹yrïrg»•Ýß>{'Î.÷yw½ëÞ÷„€éƒžz¾ûɳß{©&¼ëÞ½ozïw„éåÞ÷=îïuÉ:ç¾õóç)óžîàRrHº¹Âr»»»›îž{|÷Ýî×^îë»»;Þ¾|¯™ó…îã§½yyÅÙÝË®nùÝ{«—ÎyÏ»®k»„çuÜé'9×Në»�r÷¹z÷qìºíï!×uÉw{ÎâôùÞ�ïqáátœænp|èW»ˆëº½×yw»¼//½ÉóŽ]ܯ�]áq0]Ü7]÷ëkê÷ÏÞÞðîôï.Ë÷¸yß^ëï¾|ùs™‡^÷%ìWžÃÎÒôùì_wsºÎœï»ß_{ºð^î>›ØÝÞ{—ÞóÒíÜûÞùö_}Þ½\žíóÏs·½ºó£�ÝÔ3\ãÎó¤ó¨wo7¦î�åÏf:î7wrNîJèçN;%ÞëνÙ`��`û·':^\ôºãïw·g¯sÝíÞ÷ƒÜ»�Îê+�îäs{½=d�wNï/bûº Ͼuñ|Ýîòå듼ïw8ÝÜ—.'Þ÷“㋾ï}Ç×tóÙã‘s¤yïe×4Üwwr÷½§º»uîòîÞz÷¼ôܹßw±Fy÷¼½Ä\ç\¸P]#�_w½uÈîëºéÎ’‡p=ï^—=ïy}ÜÛï;çß{½¼Þ—½ëÛ½ëÝ>o7»ïvçzDç[Þ÷¸Ëœº^çwºí×½îï=ï{<îG;ï½å}÷_/¹|ôÝܼ¯.z{�^÷®ï�é\ºòâû¾÷½ïK¸c»;“�½ïNî½uÞkÝw^�#$ÞxÞs×µÜ÷§ÞëËîë2Ožñ½ï½Ë¾ë½;ç©{ïwº_{ß/½z^<‹—œÏDr{½o;½íåÜá§wyÏ7t‡uÝÐBç2÷Þ«ï®ún÷|ñ{�{]yr Ýw;>ï{˺w�ë»×q“{—rõï=ÈïuãκîˆJwtç—ž“¹×x^ÍyÙwww9ï®úúîî:]Ý÷·¼]»¹Á{Ýww—>uϽ»îîó½]NKÛ¹ñÆ÷¸žíÙ×w»½Ç½Ø^=Øôˆ€{§n®\åïwºîã¾î¸÷ž»îàžC®ïußw ê Þí×ÝØ—ÝÜíÎÎz^÷w˼âwÝêñÝ;»Ý¡Ü¼îîÍ.¤pôé0’'žõï<¹Ý÷Þ÷î9÷n%îóžÓ¾ë‹ÝÔ}÷½î»�u绽ÝsÊïn<»Ë¼¤ÝÎ÷s½Ûçß6qu>îçî¹u×u×:éu×wwžkÍ;½÷¾÷w»rùó²æî÷Ž÷9».]ç—DxîAqù>{ÛÏoN»»s§.ë�»9Å;®:âçw{¹ã§|ê^±ÒûÝ÷n;ï{œ¢û­ï»—Ò!.íÍó†/&÷o{§Ü÷cÎ÷·=×MÝóÓÙ×Ýt¼÷Ž7�]÷|Úû»ãÝÝÎîNŽã¹ÆíÎÅÎ;®w[“�×u×o}÷¾»‘œÝò½{‘Ý;¹:wrïuïnIÜõëÏ ßwz}ãÛÎwºéw½{Þ÷·w{º½×K¾ï\»{ªuÁN»Üû‹z|óçÈ�ÍÞ÷§¼½uØ�{×µëÞö÷)ÛÜ÷‹¾ûÍ|s»r;îûîúnçºûÞûäŸ|êðÒ/ÝÞ÷�ïGºƒ¸éwsvåï_zóÑ—ÃÞíåÞçv÷s;ºÎ\ç9Ê÷·y×»ï·>ï½Ð”½ëÏ{Ý¢¸‡½ÞÞë“Ýt‹�{ÞW)]ÝtíĸûÝëë½xëÞó4åÞž{Ó²Nïw¯]î绸îÞõÏ{ÞEÞ÷©wsœÝθs¡Ë¼÷�Ñws<ûݾûÛß«[ýMz¶Õªÿƶ–ÚµýjÛ-µ«_ªÖš«ZßøÛU²«h«mºÆ�"Ø ±@ €Ù((BE)’&f!&F(ÈÍ“DÌÀÂF™&Œ%I”¢“F)’1I›0Â4lMªØÛjV©µ´«ZVÖmm–ÛYµ5µ©µªÒD# ##4‚ ‘F™¡&Œl$P‰I˜ED‰dI‚KfH%˜…‚HÑ­µ¥ªkVË[T¶«5[kûUm-Uu­[FÛjÓm²¶Ôªí®¶ÕµÛKj¶j­öÛm·Z·þV¬ÕjÞµV•­SV¾¶«fÚªímjʶ´Õ­•­KVÕõVÝZæ¢Å$Máh¬j‹dÆ,VƒfbшÆ*KXÚkTª×UJÖ´Ûm^»[5«Ûjí[o[mck^ÕÚ¶­ê«ÖÛ¶¶¶öÛeVÞ»1£F‘4PX4”¬”QPYL¤Å´h"e) Ôb±±´k†FÑ‚ˆKE+¢,QcI‚�€"-X5€Ñ6-’¤*$$ŠF�Ñ¢4$‹&’‚(¯Vµ]TÕ­¿Um{ä$mÄEƒc`ØHQ�&ÅhÙ%kj»’JaR™4$Dbˆ™ÄÉ0$b%Œ‹Hšc0‘6h�I•4I2�(T¡ ±IAªªÞÖÖ÷NÜwuÌë· ‡eÈå\»ºŒ†Ç\vK¦ÎèÇwEÅÝ®;Š.î�wv�Ó§:W4Žîsd룮—4îÝÓ»�t¸n\¡™ÜÎÝÜ­Ñ9®;«ŽêéÕÌî"îîk¡®r»®Æás ã¹¹3W)ÝÑ,‘sœî릱t7»\(Ý×[˜ÜÑp Ü—8ÜæwsQ¹»»”㙢.î1:êÆ¹Ç]rëµÜ;ºèç]RNí]3º iuÝÚä.îå]ÝÓŽêç8î.çiÝÝÜÅÙ®î»�‰Ýshë»îáÊæÛ—wN�ÍÍ;«œ‹qÝ�ÄiÝ;´ë¹Îs©Ý»Ž….nçl›»®Ž¹Û•ÒåÂæîœNwD¢áv­¶Í¦y]ݺ‰Š9Ê .ë¤ÌHéÓ§2’îÜ×rv»·wçwt‹•ÝÛ»Ž$Ó»„—íwc™iw\€¹Üã²ìwN®étÁ$B¸G.êé9Ôîî�tîsœ3››¤îÜ \îî:\‰ÝMÎ]Å €ä@.k»­Î»¦�ÝU·]‰6‚Lb)ˆ Œ™v¶Ûî¹ÝÚç^uï{ÛºëÝÔ¹×{ÕïvéyÏyíèÙ�Ç\*]Ô7»ÝëÅ&ó^r÷½Þ÷rI{ºïzô'�s¹wž÷;·˽ۤîÑkÞ{ÛÉ×b绯]Øe9ÔQráG�’W»¦÷vOc®ó¤ïuy<®´Ä½×pݺ黮t¯7›Ü÷^«Ó^sïwK{Î(ÏtõïnWw\�C–u×']sÞé{¼ºWºë²—w½×»vÇ+¹\ç¯tÞîÄ8«“�Г{Þžò¼÷v½ï{ré.NëžéuååÜí×w!ÝË®hÓ½Û×”îËÞ÷±Ê“{®^pÇtî×.në«»¤E.s¨JL\é3NîÂܹ ^v÷p¡Ü\Æ+�{Çœ÷^W¢—]Í=ª­ý}‘@E!f�!l‚$¥† e)$˜B¥)$É4!RŒŒ¤$LJ&ˆƒ1#4ÐB˜ÌbÄ¡‰¡34’&ÌÌSHE1*a%$f2JI‰4SŠc¾W»­¾×O;¦.÷n÷w¥ÛÍyŒîØ®mæç­p½Î¼«Ów»—{Þ;»÷y­ïw½Ææé½×n÷z\«Íyé¹ÍÙ{�çwWž›w»Uïw”m¹s¦ŒWœÝî3Ýmyï=;ÝÝn[»»ºå̼컫—.îÜé×:¼®[mokm›j­ÆÉ$¢ˆ£á/w7>•ÎÞûÆå½Ó´y\ówuؘ¹ËΚJ/.w½è/]ÓÓ«¾]o2^÷½s§ÍΛn].:ë½Ý1‡;¹Ü1wuï½×¯œ¯M;¼¹=Üó½ïk·{ï£ç+�;îãËróÙ{œ>wͼ¯ y}ï{ÏN\Š>]1¾|ÇÊð/›Ÿs¼×šùyo�ï=�¯»y}}ß}÷¼>—¯·}×ß}»íÑ{¹s£ËÞí'×»Ìgݼ÷uç…ëºå|·•÷t\Ò|ô\}Ùî1ßu_O»¯—*/»ïPû¼.÷×Ýôîù|÷Þ÷ž] Þvç/s©åØ<ûº{·Ì÷zîŠûîÛÎ[¾íO.·Î%ç+鯚úîòúîÝ>†ûîø\ùcçÛîÐóªóïußwŸgwyñîòùæùsGÝÚ}×—×[›Â½î“.wÞâù©×w{×_u¢Šç˾ët‹åòy×>sÏ/šùº>{¹ëš.¢}Ýîù¾wÜÝ×wQ&0'§/1�½îxÉbeæâc{Þ÷½Þ÷sËEȈ)òës�q|ÛÐåÝ×P\®Mßz÷Þõãî¸}×Þß<Ä}×}Üœïw'Þ½s_=÷½§º÷wžm"çÞæI/u\¯ž�:÷®Åæû»ÈÛ›¾ìößÕkW¶«íZöÚÕËHl�–JjÒw\Knn%l\¢¢»»mÜvCW+ ­ËråÌQwtnrˆŒAŒV¹Ø9Ú¢ˆ„æÅ¹Ib“L‘‰77K »»pƄƃ%*æ£W5Ýwwn…Ww\‹JK"wuD!DQsš‚Æ®¹Íp£—)5r76æÜ·9®SºØ+®;«œŠ �ÕË¡Fªîâ+›’dŠKœ±·5ÌsnF\ºHbé\¹uÝËbL\®š-tÔî¹kºêw\Û™ ‘ºTRnksSm¶š¶ÓU[­¶«–°i$†¤’ m"™ 3–40©‚LIÉÝÇws¤;£q×AÊQÝÕ˺în\¹]ݹÊéΡÜ;¹ÂMr;wW7`—#9ÎŽî6áÍýíµm«þU³mjÕ•[*ÖU­jkV•[M­«TÚÕV«ÿÝmU¤ª ElUKkiZÙm¶–«[-­umSjÕmÚ¶­–ªËkj¦­©mVÍV²ÚÚ®Ûm[iµªÙ¶Ú«-VÖ¶k[j–¶¿óÿÌOót+·s‘\âëºs“æä]'7E&s9’»’éºåÚèwctŽè‚â¹]%Ý“»réºì—wçW]$åÑÌrṺçve¹Î¹ÜÝ‘ÕÜ›‹Œrévq98àÂs»ºîãtë±;«®îŽÂ!"-g?û—»ÿýÿ¾ÿ¯×Ãä¿iû>‰9ý©i¿ÔJ;¬^%»¥¦¶õÿ„ ÀWþ4þEÜ­Ä8PoDb™D|·W¤õýBï¡ñ••߰觘ŸR+Žë�´áÿrX5ÿM_£‡×<ø=äpCPĘcVÚG šgÚó2@ƒÿÚÌö¿½¯¢À(�…"€Œnà5CNXBÃvùEIØ Î®IZóÿ“áxfee‹å>&ÉæsÒ¤‹¡c×りL�Q¨­/kQê,’Z.USžDºZÕƒ¼‚oÔÞe}.¥­›eøUÛ}.iÕªWh܉K¨œn%cX�+ÿ–µŸûRZÁ°†ˆ˜÷x¶–¢nø °ûX‹ɾj—U²ˆC¢ÿå�æÆ?£o½¤Íóºµ@…Àµ²âH\z¤vyi÷–#ˆÚÒc…±áat8­ÿí‰IÝLß^¶¬ÆûÕ”�ëúû„1o·ÿÏG�¸>ËàN‰çysûݱW©w~ír´—�Ÿ‰+ ¹U"ªÍ†ˆôáM@¸9Y'‘€Q ZP î/{âNÈ '¸ýúáî÷£²)©œ‚§ø‹H –2òÅKVÅI†G5t+CtÒ.É7䤮ˆ×(>ZÑäÑ*GÔVê Š¹EÙ]3ÿ–¶qxŸô éw_uR¬&‚„]ßc ) YͲ;`É‘žX l,›‹'ýÕ�§/»O3ŸÖ+îßÇ ä¬Q~*Écå-6LÓ„$³–@nØœ4j…À°ÍÒ\^‚z“º±2[1=ÂP»”pxQ£ï(J4Þa0ƒH,Þ$¤îö‰:EŒŒ³\IZ“T”Ž Wÿ±§MÝ\2ZóuuFlÛaˆa–­~¤bé8Þh¶€PÞωoA†hÀŽÎk�ÿS ’³gzc@¿¥Ÿ7UW\ÉtKf[Õ,«ËŠ?Ê“z$©0di¢æP¾÷Çg90¶–|�øLCe`›ŒkŠˆ›æJp"ÜF Ú÷sË´9 BW¼Ã„@¶ŒÑNÍþÆK8CÄ’5ñòµ—úV>++ÅâˆÐA�Óˆç4{«þ©åª_x Xטþ6nê…@6Ñ!5¡äT• Jþ>dÿ�oÎ «Y/y³)Š�Â=$bÝ!«*äÕÔ¥§H tòÙ°Ïöþ•Ñôš‘í?êNùþ_öAˆñÈë4´ OòY®ßb¹gþÛ+ò¬¶Q;-ZòyùÕÕD�ŒðÁ‚4¦¾ÈøŒ\IÍQ*Ê ¦+7/-*‰›X&7[*5÷q�ìVdÎü‚¸T¶!eäýà_¼²ú ƒ+°»’Ú&"8v"ÍrL^È<[2è˜ù®áwqÀ&øØaÛÁÞaVÜЫŒÝ£y¼ž §\I¨œ¨Su©Çü¢øØ…aÍÔ[›À&ܶ74z• �zÁfÞ$ƒÚfL¶¥%ÿÓM3¤£æÞø¯ø·õhL¿ÒÝ?T�á'V7#FævaÆNô3Xb×ÿLŸ÷úiãñ³ÿRŽ«že«/_õ?ù­Ý¼ñ]íòâ³ £Þ�îÛª�º+ÄŠ³6V=Yj=SHhä"Åœf¬B©Q‡òHñ|‚QY)„äådªúXÅLKÏ`l!Kò£ lVjâ„MD~;-ÿŠ總g¸‘gläTÃFÍPè;x9^9Pð{øñtßBf.aö•ï­OýÕä¶:™ ‰ÀßÓE»üÆ$jupû7„þù %l?'ah�ËAØžÌZ¨Yõº-|•nl…/¦È,�” ø ·¼“¿/PÌÍ XEc¢ŠÛèšGHH‹%Ì_†lñr/ 0Û®Ú‹zÜš^P¿Ê¿ÍgßÅ]]åѓت@ŠxœŸöê©ßZmª%GÂ�ßqXû9 ¶?ǹ¸‹,\1Ù,Ñ)Cy±Ÿ1Äd?í÷­·-óf‹€7e½¹cWwdbø5f²öÏeÊÚ;ùG�tïjZ“A·�݃—ÒwdñFÃ4¢Ø€ž¬*Mïlù 2!7ü­°Ë@2|‚§‰/÷«é¿Ò$§‡»xDAl�>`ÞßÄ©Ë=~ÿ]©ˆÞðø,CúZûëP„´Ü«,…—ð¡¿0‚;îÉr±Ä\àš`¶úÆ…Ð36ÙyÈOûq¸6É£Ff©_B$<+î5D=Ž&n’øÐovÿ1ç$'û> ö,/3wÜv€�Ò$+…÷0vaq,øµvÊÂk ¤Î—[Ì+3잊4É :P£4ÜäÙ t ’Î,2×,vcgLü] žÎZ略ºm¬m¡ò.öCïHGêáCæJîÿË׳•c*—3ÿ�sXo…Ûv·Л5Åãk¶ãë¤ãvÔ>[œøªÆ%›tÒpR+NY)¦F€v“ØÙë‡5ÑŠÝQú¢Èáè¹Ê²M�®@ýq+Jê›–Ÿð6Õ}±ñjʸ-©ò´£¯£ž™^ÎÀ^À=>¬±ñ¨ˆl]€Š‚?è+{¹sŸHóÞûåK¹îzNboöm,Û‰[.ùï÷‰� N�¡‹çmv*|�;Õåh¢’n‡~ÞTyœOÓCnøš)±c¾óWc>}ÕDãSžCNÖ¬Kýý·úgl{ºUÅCïûïpºàÅsâ:çFd¬Sræotýic^× …V’M7v{š[Ô¢mT�\'zn´ˆÙ­¾p”E‡z‘ìfJ~RygŠ>á0š"ü-+KpDúæÐ¡:�x—Z¸Ðâ?Ó� xêê—8–^VÇQÄ<¼RÌ ¬&%Ã^•p++Dâg`ŸM¼+yÅõ‹n_bË­_å2eú¤.˜±a—Ýî¢ÀÝ_æûRY ! Þèî0–œç:gt|‰ÍHWˆ¼Ã/{öT„éÖl›å׊'�Ç8(?R°Ï�AuؤËâ0â5¼)‡•ü´éÐû—¹Ã¬ÅÐ `ÿÆ-+1Mž4·9Ò:b¿æì‹û¬³N çÀÙøo¥gƒ+1lÙ‡Ê.Œf^¾…’�'ÀFn7ä‰9¶�×Y,ö̹‰0�Q¯�ã‚Æ@íþ"ßý(s šÛAœ¼á‡/¡ ¦Ý`ÑJ%â"%—ý[ÂŒ·X;7´  v÷íŽn3anCûvÂO]_œ¶v.ZQÆ RdƇößÉɘ­"ùµ‡˜sßöª ~�®­â¥ì¾‰Žc¬¿©ªY²„£¤¡Øì/�Ac@Ìû«TäNš§á¥5ÁÂ8ý+ïŠ ÑöÂ&E’VüUò�4âO)¾wa8w‘£âÓ�2(oO5GÇ‚I’•ê,G¹%Ž,LqÑ®ÄÜ‹Ïó¨¾às��Id¥×–㣛ޞ_7_Õav�õ°×ÑÒ¡Õq…ãŒ}lœŽ¨œÎú.òç¡Ü ŘªZé¤2¿�˜„wJŽ@*–Kpè…\Cê<ïçLGÛ`2fCq�D�¥W³Y¶$†ŽCþÿÏ�â:“ÿ�ò3®CNÚä·±ëF¤gÜ«cD§$n%$lf¤æAIòßE#d3‚ÄÐZŸXG\ÖJF”�ägýV†¬Œ±V·´‘‚Ûàõ[*g3» ¨¥x,–Å,êþYü­Ü¯3Ž>SVþ¡ �0°J"ñJšWl÷{doAŒßëj½ÂìEÇø$áÝ~’ùnoÓÌ66 ˆC½dá.§ÝõWø»5¶Ø›Wô[”£gR{çp»ÍŒvø¯ ˆWòº¬Ÿº¦ˆ²ƒçÎÒr�^);ÙÇ¡cëxydÙû®M4›z½Fòk9µEa˜“Âì1›B-�ÖOëÈYÁ.Æ{reP-›+ƪÃÌa‘ж5P’‹Û†þq?<éûeÉÚ¬ñ¾¡JÑchiFÙN@ÃÀÍ™‰Ü�º†µÕ˜ýŸ�Å¿ Oàs¬8�ªŽGYŽ[. dZ5 .Œï-{½”YËÜUçåZ0»érÄc¸;{ë»HÆí{‚V[e£„®6å+¡‹…!0Ø×®¼Œtñ(É–|Ýx·†GÞXñµÆŽJ‰øZÀ ös@¯Ì´[)`©Ú—˜ºàmYZaûâÀžmÇ+ïr܈ZÐx½%0^®LÏçl®ä®Õí`¶dÔ¿]«”_Þ0Á7á]“¿ô°äíñAtôÅz’9‚¦jL^¥®?õòÌ*y‹­t®æŸUÿ0ö‘ìµwÇù­Tµè�30F]ŽëMCù0gÒótUæ:}i—±ëo“`²©¬rçƒÚä¸o6*1ðý»ü·]“'‹`³|ÜŽØ»°‘GŠê¬J¶µª›ÄËÂwâ[ÔÎ5¨½&Wº´½Å\@eÎù~N’‹?c`�Žya¿‚)Èù�A÷Õ!8ƒáÔ75Ö|Êüßò’P¬+ò€SGìAtzùΜ¥A3h³©“�¿ˆ3àá¦æ8��"VÐ!“7åÏ�°ír;ZÍÚ¥8}Óìѵ.ãæg_ÓŽ§ì¤�J|êõž] ¡ï£ßÌTé¼¥éŽe¥�7#Ɖ:¹ÂÖÝcïÀuW! <† qd2Ö$0ë¯HÇ<âFµ}�”˜Û9«pQA0ÊÝgˆ1ÅS\ð#XD…¨@íŸ6çûî«&Tv�ó=é¹É“üÊYF¦ZQÏ2²†4z¥¤¿0ï€áwR¸Fâ2¹ÿ®�æð#œäÌF‘åK“fÂ/(�/˜–¯ƒ›.b“«¸mñ…ZÌ~:·{ Ò³À£Éí÷²@m kʳŒ7–@w®'7³©Ýè‰Baßdb4hcñ˜¹–àÎæ[AÕÍÏËã1ý¾Vöv'@â×òäÐTíXtÁk˜ÔYB„òrÁŠxlñŽr ÇoêÙ§u:Gö?†œ]"N†XÎŽ0ƒ8›ã>޾d´H®böG‡3€XÒ�ƒ9žé]˜“ÞŽt„¥�©Oi;²‘�­ußZ¡qìï=Ã=·åç(ðéR§™m&<*0�§mÖLéö�êõåœ:ñ�nÝÏÌøæ�OR‹çµÏvƯ�½—QМÂäß`ó�[<ÑÆƒˆÛÛ\x"FÆ›RÙ¶gmÃSŠ-•Ãäë,µ¿¬¬ºžm›œ¦ÕM&µ[DÝ™¿J”‰Ñô.0 Óå½­b/‘]?Ûô?øÿ–üœÑ0/£³Ì®µ_°)ÿàycöЄéÁZZfídìA¦‘:¨s¯ýÀ Ç÷ _E\=�ÿM‚Íü^Œ õ&x.\¬â)E`-·-�+ÿt [—‘w�&N—™É\ˆRðãäeÈÀ8Öº´f¥°ß#•l·ËªØáó}¦PjÀ+ÿ¤ÅÜm“òZ2V¼Œ�G_úÂkçT’]ðÛîÁ™ô¼ø�d;Œ�1ÔÈA*`!b–"겊òaÆ#ܶ™Nù�%ÈJ›aFŸ“a²â*] 9;n‰ð¡ºQ¨ÿÞy„t.#� -ô¨èóCˆ9+—h]Ê{Û<àdïŽ, \Y ¤#�cê¾è‘2NnßM°†£ó'i©Ÿ0|É“Ç4¢íå Ûh~Jˆˆ§Q7òïAÊ­äƒ�ɲËùd9Ôx¸eó±ß±kÇ¡¼ÍˆVx$Âü£XdÕYaÌÙÞŒWAÎPË›]š˜ƒ²Mf¬è÷ûÙtM㫟e¤ûÜ�“`tî¦äc÷'L5ñ—ð$® Þo÷yEQýŸ]´k½­\Á| {‡7—z®-[Õ‘¶¤Ž$µp⯃hSÍV³�n-S3£åÐ^ø°ÍuN Ö¤Þ»æ.¸Fì{*}«»Ñ7>içx=�¿7qå$ VgÈL“0ccö-]+xÏkK—€zkŠ HC0f=£S)â[îJ9Ü^7Åì“õŒ�Sùÿ˜:{â_Ï‹}CQßœùìÆžpÂ¥ƒã�¼ÔÛýÀ|�ßÐw+:ó¿ÇGò,ÃÁcœK44EŸÐ�Éèíó 4³Í^öÇmµ0’Ò ÜšVÒY›mkgÆ/½² ”OÙæÑ¨ËQ´ëjþ•Y»Îwª^P [‰éþy«üŽ%‚ª6–Ç݇qëù v§�Oß±ë™fîæÚ}‰V�°ÈΑ$#¦õÓ¢ õw¿€Õg1l@³6é•‘!œ�l™i"±²Ût/¨ÒÛ…‹77·Œèôüû¤þÒL'ÓÈt žùf V˜»çz�7™<> Æù.úçþ?ã:¥þ<åz�‹„Qûe‹i x¬Á(—#aBúí Ã/ÃÍNhúÇ©�‘þͬgÛþ‡ì->Mðÿñ¬V|‹¦ßëVm«À�ýÇ“^Î 7ëoþF¿—“o$í·Û“ÜÁ\q’7çá4U1X°Q7¨€úÚòªÓàŒm oñ×�Ö=ûn"ưÃÊš&Š Nß ˜Ç'÷�‰<"$š–Τ۷“Û¯/is™S�òZDºÝ‚û1ä6�ÑÍ\4fäùD–xY‹-ÌdøÙ�Nî€À¦! õÒEƒ«G{m�DZ{\ÅÏ÷ö1¯öíü�ò�ºðlJ:”½e3®ñOœ úŸ ópÒd¬�ðr¢D›éÚr63ЊPRü6Oßeø¼¼L>^Ló-ÂÜ©Co;Ÿ{>u+ý’ç&õªM8‡}òÝî�ýìàžq2û‹JÓÜe‘÷x?eßQ±©I3Ó™2m|G°–hÜmѳ¦Ú�÷”bÛå^Ûm©—ÈßÒ­°HKߥË6ƒLm?ôlÐG«û¤àT–ÍÑŠÁºFòjìÕïºÔÈýÏ­ê¶ZÏ™_�hhõZ >ˆCCè½u�èŸÓeËA�:ÜbXærÚxÙ½¯‹D>òK²óšF 6%ä`ðkX×´«l�bºŸç¹~5~eÇÇO #xKR²ˆ›ý²×:�–› r[UôÓtn'!öqê-ÝV>L…£ÊKiyJgÜUîûÒ÷{éqÛÛ*Äú—ñ¤Ð]k_#å¾vœÒ…ØèÕØ…¼¼ÛäÎ S¯Ø¥�›ò|=´ö¼ÓÆÃ6m2DµþC.ôZŒ,gûÕc7öcÖ9:'uÜŸ‡ _”ù%lÿìbçdÝÍd-˜)„;Ökà™ Š}*_üƒŇ4~»Æ¹¼¡Ð¡KùÊ=åÍân¬å˜Ê³á\`îHÆXœ)å>Š-´®þLZ êȶ ùä0Íá¿ÉysŸ743{r;²¹XA¼¿ÜˆÕš„ãK§ÂpžH7ÃD5nFM~ćˆXAùR;35›B�µÞE±¶¿®Á¼²øòÓù/SŒ. p¯‹x÷ëØúI;—´ñ'Ñm—Ç5ŸÆpp¤n“ÉÝB¬OÂ…û7ØmFåìVr-ÄwÒå±t �ÚÑS¢ÂE¸AÅ�‰³ì±V2íFFòø–‰b¼ÏñEä×B?²� R!ccÎXÕÓ…‘­û ! ñŽn7†Åð`‹«×uËÛ�wV±ÅRÓt™gï+Û­ÛO‹o¶~‹›¸«™I,Àct+‹*PýÿIW9¿tcFÑ·NÏm>| 'Yž­»[g5™â”MÅp%`쩺ÜÍv¡mÆF§Z¶P§à‚t?"éïd£–)TÆ›2yò1Ã-î�V­yO>süFkøÝI|Ça¨9a#Ðé±Ǥ}(V<�}Á«/JÐÀšy€ðþünzé�dh<`¸øÃ�H0_ýÙýz¾:µ!O®/|L>wÇóS?±«ïË]ˆ�Üžùÿ® •õѳþ«KžG6[Ç÷Æ9…6UŽó\>©õ1Mѧú†#üdN{»9RÃm*ù?ÏçÙ3Në¹Wº�«¾qã*`Ê—ú}{ı�hÑ&Ëö 1±zòã‡y{ÛTùpÂ+ÛÓ¿È%<ÎrÅò]µ�Á°åoeÀ_P794hJ‰)êq%ªxÅr¨‰‚Sû³Ísެª)‘}*èF­k Z#ã%(íߣx8=ó¹°(#Ïß¹—šû*‰�÷*_ËŸhÉ<ÌC€± ¶aOÍü)s‡=î>>¹yŸmÞ8"û=”ç=ã^L¸taÜ1äùøGÃËgwg’’j}šjñ—äÁ#¸ú凖)… ö^•›@Êÿ3ùQ”îæ„Iÿ‡ÃË|ÁÙ/À� aë!ì›9ôÜ�aÿVûñ¯÷XÙ1�ù=úϨX&‘gë+¬-'Ñ6�\ø»3™7Ë`!¾ˆ%æäÄfÂïÑR,Iù¶¹�‹S<ÑpÜüMu’â3»h6ò@Õ+ Xz»’Kᆸ« àÀ¹’î]GæaH0ú÷­Ù½V¿;§E–mN'vKù>…Óg6Gç–á¹¾ahD8ò ÛÚàªÙ#vKfüu*{×kåÓ)êíLô7s?¯hÕ/Á]\È»ÀîÚu‹`YP7ÖSÖÙñl»wÔ?.ùض.êíüY‚±—FŒ˜¡Ä]çK°&´ò~jÜŠB~B“œ/åk·¸Î8@ݨÅË,siíŽN”~ØöI-m„£Oè¦�óÖP-"¡6Ãô•þQ^¬P±²Ãƒ+ëc]¨Ð­]ƒ€¦Ü‡#¡º9 xk4EºQ¬öx2q2†FV¼(!ÍÒ(úD뺜ÄáãCná‹Ë‰Â»b7š¥A´®U‘ *|Ÿ¨Œi ƒ9Ÿv‹:hÓÖ’¿=¿ó|øÚrßÖqñ-õŸÛ¥›„)ý¬`³ùkCä§_ß…+1ˆºf½•ö]“äûR_O`„q6V—…~;˜W³e}™‡ò¬Ô4ot>¦D5f˜ƒL¸ˆ=¦ëºXüãÊP·Å¥Ç�èkxeÓ¥žW1Ò€y~ �ç�½¿/‹ËØž.ðc+ÉpÍé_&°Ð„zê²6ÿ#ˆÇžƒ/ÖޱµwJØ×˜ hÇ᯻ÚlÅBÜ0�Sª_žÜ9›/·qÎiĩ܂s�ÅY’+¬žÍôÎ\Œ×Ⱥrn릗“K®ÝoŸXïõ‹¼.¼�íÞùªç¸¸$W̽³GÅ(æ$‰6#%tøÞ†?¼ûÇ«œK….3Åü‰VÂYþ�Xø45;ô×"˜ŸÇÝq)±Aá¾;0« ™S´kŠ F4–?iÓB=,Óµ0¤ºôç�ߥzfg¬}þw_ÙG1Áz{ýs!&©.ÙñÉþ•ÞîŠÚ–¿¼õ+Ä8g1M;ç]}“~§=¤ÿc¯¸Y“¸þÃGØišúŠðþ÷XiÍ÷ÈâƒiÑÆlï{ýsÑv¸d.~�¹³€Àž2Þ}p0zÏsF›qo½¯ g‹GúÌî,l _‘è¾!qàð?/ÿJé×ÊiØËìïÇb¿1/O«³ÖãÖHúa•{(ëGªÈØÜx×x³Z|· /™rB Á6Íæ,†,Âäc{­X¹x%&‹Òs֯˯Âu»)¶]$}Ýqxש™„»q#"Êéì<m�î½\sˆ<.zÔ8zä©¥,êúó Ÿ<�o‡@µœ³zâ`vv¸›šèSloO’¡;ôøëŒˆß, ŸZvÔàadFÁ›U½tÞÃ0^Ö o�I$Hé© Žî ¡¹lÆ*Ä?ˆæßx ¯†›-šP½¢×²¾!Ú»"4e�•Ëq£{7Ð~=CˆQ¹s ¤á·“d›j \ÍÓÈ^uGº/7Š _êÞO&Â=mš¹Ì�²#íÙü£ó;Õ~Q lJ7,Gqm\±Ð½¤B•´Ó@ºŸ7*4¤Í؃~[–BBµ¢;œìʼ _nN.W¦K„k×V©‚“0ØÛ(Vœ*nTœòç)sDÊÈ­¹z(ÂÑXù¼­êE”jãtü¼x‚9"éT�¡VÎfo”/eš®g‡ÛLbÜ ›Y­*ÌZ˜.ñ¨ìȰ¿¾çâ™Å3o|y{ÙZù6=eöÎa+7_)ÿã1‡ó „¼®þ#ÂùHŸƇÎ"øð¡Ù&Q§d绔ƺ™„`pǿ³ã­Àýo |½´­_ª¿}@Y—»å§˜J¬,3"™:ˆfùc�á4ƒe!%`â¤ÉNzÝ__ŽžÊ�qFÕÂ10Ìò“U6áË~Â;¬�E[ ÏO’ܳ&qËÙqÀygèçÕÜI­„ø¿hð¹!qˆb­O�z¤gÇoUŒºó u tv�$qï1‡­Í=|WŸ,ƒpäúݤèŸÃÓåm ôí>”êìí˜~ÜR%çN¼6yc–ú_ÇÐBäO‡‰y$÷±V¨�P§Nº›Jÿo,t1o] Ê4* 9d|ͯ8>%ö4TXÅ1©ª—éMΧã�Ȱ^Úq3èšhò»¼¢µ5@rmNX±•èÌrú D¿oh� ³6£O{õÛ‰ 7í6ÖäòlâÏ@_¹~#Œ×�2-öÃ*: ÕºQc‹*U]’zøõ”~QÒNt©îñå×ROwšOªe ¤ÇÀÍÏu×a1}e± ó˜ÿ?øÿÏßßý·¥F”„QŠ$¤d„€"Q“!�FH„‘‰"@a"bˆPÈF(Ù™4³˜")£,Ê”¦‘1L!DHÈ((Pf4ÂH¦ c%&˜¡Œ™6@Â26R$�!I‘"LÆŒBfÌ„!”iLIL¦™(¥ˆˆJC)3 …%1�ÉŒÊ"ÀÈ”£Cd1&’ e†Ã( ÍY„��‘‰†)Œ™hÐF¡JhÁKI ¤IŒDa)’@ÂC@ÀTE”"A“LLÂIA²D‘”l@XLaf `°™d(¤2M&P¡‚!M €PQ˜&F’&-L¢$ÈÑ–X(cD©�Lb(Å¡)I‰Š1”d°šf†C$YŒˆfPƈI$BŒb ²˜FD“F¤‘F ˆhÆ ÍI )(ŠdFL‘¦ ÊfHd”ˆ�$3A£”"HÙIˆ  ÍCBf€‘Df$H¦ˆ e$Rˆ†,ɘ6C@##QJD…D²†BF„�¤@(k(Ó#I£c0²Eƒ!`„b4ÀF“C0eM�D2…›FÈ̆“$Š£MLшdd Š2D‰DÊRd“¤ÈL±’II È�†iFQ²4&F�2c`³L ŠF""L*QÃ&€I!Ĉ$È0Å4’‘$`¦cH¦TB1 ,š$ÄØb‰� ˆÃ$Œ#&EH™JPÐŒ ,’LÆ,J6m ‘@ÂI#$Ù…(&‚0bÅ!3HŠ*M@’@ŒÄÁ‘±#H$™%…"iŒÈ„¦S" Ƥ ˜&HÒd¡€d"@ˆhi(‚b)”„,(Š1” &FRh´¡+%2R̈ÐÑ È1(„™™l�Q2E460Å(#$‰4Ìi"R6D‘FŒ� IJLšR ¢DÌ„˜ 4!%Ófi$$‚ R(Í É`†�ŒÉ4™!˜± 3@¤i´6$  M„¤�0„¦ÌŒD#Fh ‚PÊH„Á)"Œ™1(A`� �‰!dÆfD!$cFL�B$–J1ƒ,ÊPh ¤ d&ˆ²L¤S$Ã!#� &0`1� É‰L@Àa€XiŒL“&"ˆH‘¡ Œ‰ƒ�F¢0¬†H62`‘˜ÈDi¡( ™(RR$�”Å%6I,ˆL¦1 ‰hÁ�HÊ�4‰Š$4‰(RÅÉ2‰Q*QLdÆ“IÂ#F”d”M%0‰¡$Q¦C%ŠÄHÉ™˜�DIˆ¡%Ë$HÂlCDbh1 bÁ“!‘�ÊJ(£)%#&‘’ˆ3,I ¤À¡F2ÐLQše$A‰ ™2CЙ&fXÍ#%2Êš2‚ÔP d‚("(’Æ( RD$B"&&‰Ñ„MA$RÈÀC! �¡X)�LĤHE0™6&�LŠÄ”`L�Í(%ˆ”ÌS$ÌŒÉJf 3 ¢10'û×ïðÿõ÷ûËþ?Ûþqë]²°`k@ƒ1ä=‹O­O¶yZá¾�íÁ¿×Vp Õ‹ÌÙ!ÄBbKâ¦T¸ÿX̺Pà~T óiÍǸ¬rú2þ! ›-•�ãC/Öþ´¨´€Ü6$ÃTX•"÷”åÇmü§µãì¥"wæ ‡*%þúQìªÕ›¦¤lߣ“†Ÿ#NHù¦1[irlÿ|nõ5Œzý âSƒøû½ûÃb `ú6U ´�~[~_j½)_çÜqE Ø:Žƒvn\¾qÑ$êOÝpò'äšßœU�Fr(þ8©]åÍ&S2JN‹êáú;×7O–9»öõ›bEº£)ë~ÌýFó貤ٮ«ý�QÑ—¹›–¹é_;¸]|¸øéÚ¿ÂÕ½;¼2}*ª>#[?Xò[/'ßT·øÀ=W³¼$àì³tZ6”]bUÂ�ÿ# ¶=Ö>H¾bá6´º ›ãÉfÿ3‰²•ŽÃh†U–¾E´:�ávòi^‹žÚÊ<ï/áAÐ|«+HúÖMôõ°ì>yu”¼¤'ª&ñÃ\«´|Ð_ ððYäÎ6�A—I2<=£ã›çaq«´‘“$ #uK¸Îž ñËÑ”)‘{4æ\ùÙwáV �JrŒ?O¡ ÷Ös›Øú{NX˜ÚòÇv×�îœzå²§œË_Ï\~ï4ÊË®á -Ç8K"aÍG¤ìg&•ñ&Ø¡;€»s¿7¢$é:R÷ *ùº­îØ l†Y¡‰÷ÖMŒV¥u—ƒ6ÞJ�éoh� ç<ÏžõN:è#µƒzÙeWc“ F7Ž˜c’hE�­�â ÛÇÓ•8£¤ä²².·O9þüÙÎÏ–/9$P…ùw1€þÎb­ÞÁW�,#ðZ ™:NùÌ�@�8pÏ&±Ð·ïH) Mö,EÌk׳­*¼JžÑv3ç¸>ÉL3Àѹ_Œü– ×�J¤ù‚Ý;Ü:ŒéäžÉqX¿)áù8f96ð-÷ªµ�rò¹ßLâo×-½ì‹ÉÊž˜w¯‚±¡ÿ+ Uމ (QLy¶„ÇTz2âmjÖñióg¯˜ÿ0š*õML¡„® ÊAÛí·¢ˆì›ög¡W許¯VÁ#`ÉÓ3ŠOdÚîs«ü]JÙSkiÃxkò³Si�u�Î[ô·ážkÉ4!×@S�”4L•ë!†ŽuÎÌ�Ã6œ³Æ�ËÏŠr»óŽZXîµÀ¬Ø¿T¸ã—S-´£B€ÆÔé(�ÖæoÓ¹JºÚ~·�p¯H[˳7¼Fû@aüùÒn�lpÖÏ™æ-h§Òt× íÒÝof7ÞZ;øØ[TÍ~º�» ‰´�û=ÙÁZûê@ˆþL¬”jj–y_7‡�Um ®çQ”!Óçˆv�—ÂËÜ´FKÞRPËÄ�o¤Š”aÄ[êêÁ½/�‰Õ0Ÿ�· ù¸É© 1ºç “„<¾ìSs›¯R™ÞéÕÌ% å�œ¶´Ã?ËôÀƒH9†úu,îFà_¶$GbïÞ[��„øã d”¨é~ý»s³Œ9{~¯)Ëæn·NbP›œ�ÿî/µZÉØOµåõçhȼ|ˆ¨[ípV¢R‘“¾(J™X0϶ìÄ Ÿ>yÀ&}”°u¨xx<ÃŽ7ÖËù``ζ8L„œAmÄÝ‘+@ Qþ EÚ+Y‹Ó¥Ì§ øW†a7*D¯hN_ßÚúÚ¬$d§ÎoËTÕwž"éª5Ì:kÔÏØòª&…þG=PÄyî-é¬s8Ö†#Õw·ÿ&8³==öÀú>ôEkøïÑmí‹WÒïß! Лn–‰«Eͽ?qŤè|v§¥pµx7Æ”íüï‚æ*üë�0‚rÜK‡Kmd`ë1¬gï&æT'’7f§l·÷ìä¯&§Îæ×ĆÊD¯L‹ž^$ýMÆ\~¨p6|íÍcŽ1»`$%KsƒWxéÿã {båV¤±ß7¤t‡wÔþ÷`;…dÒžN색ƒ¿€?e#/†ý(pðj´™ÃÑ‹9¯)‹û·~|£\�|ÙÒIMß��‘|ê Üžžû *;�œXÐO¤k'nGÈIÏ¢˜ïÒÞVÕ§æ3N�Ï‹ÆêöB‡Æ9SuükÝ\d¨¤Ó°ø"ãƒZ„°ù|5¾9¹ËäÎÙ&{¹·~�ÏŒ’>e“îš…Ô! {„1㨭��Œ�ŸåüM]ú@©‹k§•,Fh«Ô²�1)­›ö8èâ•ðüþ@ñŒÅþÖ÷¯,‡KÀÏ —í:tÌÉþ� wƒûiY�5ü£¢Î�ˆHÍÇìY}yO_íË–è€â…Jæ¶nÙNç{«‚@YuäÉu~2Èò7œá8œå0å9sÞÙ‹sò‰ºÂý#çÀÂiV°üsIµŽd²êîÙRQëÀþU½Î™g AØgᜠ“ükúM�Ìàuþ ØÄÔæËŽù0çm•õHr1{8`„øOëht@U¹°[óöËæ«j[½þ«3Çbì£YŸÏ�¯1Ps£ÊCu'=²œŒ–”o¿³l'*± ©?Œ: žº§YùJ¿9º$ìËSëÌ ²#ž’q¿MãÆ„ââ_% ²~{ý°3ã=ëÑú¹UÈeÙ«»êô÷/�x(¾«ØÚ»²ûóÀ“õœ=ñ%Ñ6’ÎBMêe ¿TÆx{ÊLb1$F±ýng>ë/È~•"�ÃWêEd)Šb�£Žµ/ÉK»À™ï\ÎY*C'ÄíÏå¨Hvà°èÖ¬dËçeicó¦[¾­Õ+{º»´æE±iößçéF>ð4Ã$iFÝ옥lÉ%$®hø­öü%šM¾m–õ“élÐÕb„ •iñvÇéM3�玢ñ2ÕàêaeäN=èû«Çù¨9ø%ó«³s»±)jôX^nlõ0´Ð tüoÎa‹¯~³�•xÔ±�=†ÙúDò’×ûž÷&—54‹º»ñWʾá™C·I,;–èâË®²GC­C'_x ›#¨uõdÑÞ5Ü˽Éxê¸mñÛný•5^�~~õ„Ä—)xFì�‡ «ÚÃ�‰4,j'¼ši%�¸-9_õ+/\>*åàeíIžUaøò ;q•Ç×»ôIÕ¯ï~6ްž„¿6\Àë{.Ø9å½ =ýgAÜ è’ýRÏQ4à É=‹©oß�Í,þáÍ€_ Å NQa×ncØÚ~ŽSdFÑ„Ÿè»ÂN$2XPñø|æmšO)&: �±6»+IÊœj×›ôs¾z„ŠyTÆ+ eDÜï7‹•tåj”`ï ì·±"9£+hW0w†_×'ø,œõ8üfúéßÿ?­�ˆ:õË_åoFò©¿sdĽ»a6ýä P�”_Ò/¹kŸ%O¯€4µßqzµ¿ˆþ'&³ÖC8‡&ãæ¬ô‚ÙâÕ/çÉåšâ»^RycĹçÈñü½ºä¢;dÔþ.­L­}"A®wƒ ¾éŒð² 8¯ìt6dæþ4·¤Õœ’ååü Ç®ÝFV‰”ŒB¯×V~ÛžoùÊw�ÝX±µŸ¨º?³öÌãŽÃãq5¢ÅþEæ´Ó§�~¬/–�ÊÏti5«²¶Üò-òG(¯h·Nݯx[ˆIûIyÑ@ +ðùã�L²«*…‚{E½ ˜H¡‘Ÿ wžR<òÑ»#xØ›V-¸k$,£äF$Íi€¾}ÝŽF®}åcHqçÄ”1ì ’ŠáxfúË=ÓÄžúó€�Âà*ÔHü‡S'XÚ°5·Úß%YW®mªƒ Û?›ðå†:æòÆ¥WgG²z„›uâp¡Å¦4¤éËåŒùë"%™°pÈñLBÄ÷„ܳOKÖþf›Ï°_G�ºÐêvœòáA–a›ª‚Óä˜UØÂAÝÅáûé³iyÏ[é�Û†/<z@ˆúë¢rûØ å_!}:æì÷Œ¢>á¨Y-ÅËOp>КÎwªß2r?Nêßêî=é1 â°U‘#îdÁ°ZíòÎbÎeYï²øú~uö Ì=Hpï6ɘW�n¡~`¢gJz—^h¬}ø8v=çc-¹ØÊ…÷oÊÏC‘î…'A¢ÿÍp a81ztYù‰-D«c`¹Î/Z•$[ÃRÐ5|uź̚٤yÁH†mß„X³�7j†zÿ|3(ae×9ÖÖNB b8×ÄÜɈj/•7(¾s Ó6Œ¿¾gˆÎðäuV}@Ý~0ï-·CRŸší�ß3mÙ¯Žìs<Ÿ¸µ­ªÆF mÁñ‡9�åzÝ<¬F}™ç|E®;ÆÏ¥GÒ*_!øÁR4×R`ÍÎ{+¸G5Vó¹HøÞîÞr”•Ñ¥^ñAÍówîÝi®(3%|Jᘫ›RNìšrïLÅè¬h=¾1Á¨COº¢5ü"f’Ô*¬ ;<ñ§=¡·_ôYöSŽÝKôª ³À³ÔÑz•R\’:‘â"DE@T´â‹!9m.Þ÷ój!Q±­)ã«H÷·~pÝŽ%…x¿$iÏV¼é\1Ñ�¼ '$ÌŒŸb’æ=2Ï•£Â÷Te&ÙsÔUZ 9 oµÑàPoÖY‰Nn‰§?…?ËþÛWûZQ”º\¹/÷Ù§®yGXÀè×S>4䟎aq±äó%c¾Añ”*Ê…,É w[YßG|×gNÌ ¹è!´scU‹LìÝÎtxs›¿©9ÿxWé8Íé[p7Z9„ß9}y…ª©+j\´¯Â‰ñ)£<—Œ§^q½é£\ï0[^\SQj886X³_bvsÙD#•W‡ÙžJ¼òÜ ÔQãšroÝ í–¨49d¿Ó¡{Ïä€l³Ç�ëÔãQl‰Nê&{½3ß<ÿ¡es ¡²±cûýæ–ŒãF7l—+ëS ÃlêÈ=ãü6â·GâíB†ÅŸX\åâpOjÊšð§вõó®*®vÂZíýíõPbWDz;§Z;›üuœB,¾jɯ s­¢)UÔPƒái5£„‡“öo|eXŒ “ºEZ…?Ó6ܼ¤íò�ÿ¾A±¿óö+BdíŒôE2mL­+ݲ1ª¶àîšÛN|'‘J-€íbÕ0¶vÉm�ÂÂÇ…šT¯6¥Æ²òJï¬óªÇ}ã›3·ê÷u@/OWN»N'e œ + y:ó}a+0w©¿ âz±žaÃê㳩Óbô:JòøòtàO°Û…Õ8ú­A$ÅDÜäy�Ð2�ä,>ììÚ¼K4’W—.4äG´0ˆšêŠzcÐÜÁÊV$3|c\n´ß2³‰Xh‚dâ? ÀÈ¿sîþ°¿êwû„Z¥ö¦Ðg´ƒÆP °|y¸�ÿ/4ÛeÒO‰(M9˜(#8Rêo—ºÔû �Ôo<2ì½M¦þ]qSæšú3™ÂlÉmî„ùÿKó-åÅ㎥~—p�÷ý¡BÙ÷øéÒç 0¡^ùšñYûëýÿSÔ+Îû¢7Œ‹†×3�‘Ô­ v¸þ·ÏK Þ; \—+ߨöõ‰öÿœ{DÆøÚGg>²Š‡¡“ º�~#7h%~ÞÈT¹?”t ÃcŽyïoøçô c÷Ñm²Í° �âî_‰HÝñ¹�Áx�ÒoàØí´æIN÷îf2žÆ“»Ãùà”·ûˆ�ó§&’]< é“KS{�Îè|M:“ÃA—¨pæE qû;¹’z²ƒVܹ|ʆr&½¶«êõŠN½`%–A�Åfþ«ö#Î Þiĸ‡Ÿ.ÓÌ0åÑïÎÝú‰~oÇ“¶Ï{™nþ#ë4ƒq üîÅÐÂŒa+Òå7 ¶údÉuW‹C~»‹¶¥'y[9¢èΩ(]ºe“\hYŽít…$ÐJs©‚¯5›ó}ž<²X;|-7 „á“–ø^6èC›¹Ò½’´}ײýc{íÝL©¸rø ÝÑDÂíÖqM›VÁí1³Åï Zß0Ï\ÃmO’ß6xCÆùv¢c»Åy}_"ÓXß?QÇmòu1L¦þ!~Ð#¶ÈK<‚£9óT¬ø‹øêx)­©Ô˜Ûd{»:,zz¹Æ™ö¯Šº®H€À85àñ®”iEè'r*JÎS¥Ô"ö3m§r!a EÓë²bãˆEowÁUƒÍ°Å£Ó_ŽÀ8éÅ:ÍîÀûÏ9÷H%€:gD [ ›�×ÑÙ¸ÁªïQkñôúßm_¾'Ú9¡³4€LwßͬWÜ=óO²ûu0w�>†l�Ex8?:k‡,\©½ÐÝ­ÑÞW�;Î5õ¡\Ä:Ñì@àµVÏO”l±ƒ]xdàÞ�Pá8Ž1}3‰±O^vc[Lß·;qæ\]¿.Á‹!hQáËÁj3»[ÔÍ �ˆ1¹1‰œX1Ù…Ã[¾îìžØ”£ä�)VÏõÁPô\½wÔøëÕD‹œ›žu‚§~Òd%S‡Wmü”�ý`:5ÆÎzÿ­Ó¸üÙ[ŠEÇŠîvåßœž1çÎù˜”ÎþáñÜËâ ã›Â�]ofhÀKÝvÈä Qá¼bg°ß'@ðòó4€¤jQÖ•uªŸwë…… ü°&à¼M‘—3µGt�úÉÅ’%ê_XtèõÖþýé±²ÕŽšøN’´¬ØZ$Жä"öþ=¦ºÚ»±ÿn3tÍEÓ fJ_{œZÞ½‡ÇaZ¢ü ·=`.¯ç]¼b?‚ÍÇIÜ‚×Ÿè” Ûxé°Nsúµõ„µ¿‘ OüÀšsÎ�Ñ æ®�|²…/d€_6… X~Peœ8áatr²ïácþ�È̵qed×€U$½yé<Ëxò ‹ßÈæúþ¶O¿O{¼îsk72ò°ï¿Ø"÷¬¬Þ¥Ã Äí_‘:1ê7r½µâT?#N‘ÃÒ6Z�:^è¿–m_æ;í¬•à ‡ú­yÌbÃtïGÅùGLÅ…Y>ü¹Þ±�É­øŽø°Ô_�s€Ë—=É“�aÞ‘gš¿e3ðŒ³�ž¼>u‡ ƒ=�KnÀI]#S”y¼ùÉ!WLA¶/s:-Þ§}O„ð‹/¿ñ¬ŸÝ%õçÉ3�ûÌ™‡ÓŒU»�“ïþ#“SÀŒ‰Žýîþ86ð‰üŽNâ<Ïêgºq:}|±›z>-pÞ?fØ»˜õúÞêÙ6{lVâ”ãˆ1¥‹÷³ì™bøÜÊ”Ø-o"¼üt«·´{—Nhÿ ³æÙT-Ö,ÇE½ZÏ% uKÖòŠò_ÉØ<&Â8ÎâƒÔEðû·ž‚ÙàmwOâêüV/vZ½³‹îŽß™ñEõîÉsÇÐN—õÕ¡æ§�Ƙ˜øý0/.Ú>F›_ãQdØí¨•d�äÑ@€|=0‘j#Ó“oÜKW[2¸ÄKÄg}Ûð¢ïö„òˆ/“ø›dY›^�¯Q}à@#ãêõ&ºŽ¡Nóíj· õtî¿V )�:;F±&l;*�/±œÜ㸠cÑŸÄõªŠq1\Ÿ‚Áã½ð2µaÄþC§s¨HzQlK‰î­ÛíÈMݯ›ŸªŽ”‘õ,0[n˜]÷7'ñ:ÙïèàR¿üÇ$ÌÀoë6ÉǨÿŠ£Ì|‡ Æx÷fbîn#Ú^wÉÚ«¨Z8¾¿¬Ì=ÝnÄ·ø,Ô) æ?Zvýîþ{€O‹‹Ï³Í6?Ê•»©ƒSn«'º}â $ÒˆÂÐþb ×ç½)Žœþáj 8�åÓÍÔ¥VÆhfêŒØ-ëº6TæŸÎÓ‹Õf5 7²×Ê럭å�Ž3Zwß¶g2t<õoqß1¢ñÏ8b„b,øÀ·Kܧ Œ�ÃÆ ÎÙÇ‘š¥šÑãiGΚGœ$×ìzIa ^>>ÁYS9d0žEŒo�iæäÏ?ôgOxÅ¡ǘ�õ¹gfçèÓý8qúÂ&Åÿ*W•gþ‹i}í̇MÅ1J_±ÎUÚÜfàÈo?ÅÄ23£¦ó»ÿ!©d¯Ãò=?ÇàáÔÍõ™Q,¿ØÓ4Ýß6µ¹m¯WXûà‹}7�Fn‚΋%§j?`pâ_+©"“Éù±ÌŠŒÂ²I?µ‘¸eqçO•!ý(kP–s§yøà§òÊ{Ø=›ˆö¯Þd¦úlôשÿ¿*Õ�¼”BµÍÂnÅÌ @þ»ê 98í¢ÖN®ù�>�‡qÖ?ÂÔÿÃZYÊ5ÔóB‡©3<É�;êrñ²ÿýc+¼¬Ÿ(ðL¬vÔ±a÷U�òâÚ�Š«tS†zÁõ•Hü’¾„öÏÏùíα¥ÛgÍ.� '±ºŒ8‚ǺÚ+vó?šu œÅak“DÏ’a�sËQƒžÉ5a9(Úáõ Ï�”°½3`µnÂgÑ\1þÌùæSO>îÜ®¢ÉÍÚ£1Áî㻩{L‚’&½Ç½ñŸkÜ´ç>­Áþ8€ºk¼-JÎ c´Sê¼¢4§g~`7þ¹lпZá¯fö°äò½œ¤\ñ'`¹¾éZ³ˆ»Þ©ˆ±A®¥M*«ô1ѽEŸÛB›®Áш½øp3‰ŸZ7R”øßÍÙ:Ê©=Š(6ýÝ�Kýaž"Ä™ÅqG¸}F*Ûµe5òH³þ}Õ&bñg´Ë4ç’Ií�ŒJ=p̦aûgþ}‘>ó ²[ÍÇaûØgæX^0é.Vôê , bá÷æ´?Œ¢�ìQÄ[![ˆlä÷\œè�N|Ê-¿0d'iwyBn…Kp-è’q¹Ç j»®d°|ë oniôz¹ÌÃäPa7ýÛH¬–5@N ¡’2� ŸIÈÚ”æÎeÍ©†¤jjä(Õ¾óá€�˜ÄÉk «›kÚ”Ð#,Uþ9ÛÿËÐÙ6nî)ÔÌÆÌ»ãü8xòj]™_dFIWÄ»ýL…X|_ýM¿ÂYÚŽ€žÅŸ!8%~õ zQª;?òÙ›®g¢×íÔã›5O3mr-ëû�•í…`Ý¡¬çOÑ×ÞCÒ“ ZŽ–y§£ý…3 sÍUœX�åB"ò�Á¡~ÉPÿ;³ðƒ«8©Úf =ù`PóQcÚpFo­%Å Ú“ÌCa~"ÆXšB1çT­vytCÌ6N»êfÿo>o&ââÙrtžAž@I ;³_%¬ç»5â^‰‡ΔØó¶BÆ^1{qÇòÚÎÛ|¶‡I…î3ȼ*çÿ",cy5@ïAT`Víñt1 k�]B’ùÊJgzuߺÂy“îÕ)m[ñ O\ÁP0”8gÊ,!É=ÿ)R‘Íg`*ŠC#ÖÇY¥çAÁs®NÁìÂÒtsÔ/GVuÚ»ç.ä2·P^óÍ8XÉ ˆöjaþYÕJoþ©ß*¤ûO%ƒ~¿)˜™âῦֽ¯ØYœîp¦ui¹§×»œmÕ‰a‰Ÿ?ÖVð-F–ŸÔp†)g]ŸCøLü‰r¤…óõÑE2Æ6•ë%° šqù†ÐHiËŒBÙÑýz@Ì�óŽÊXh¢°ß#&! C0<1ΚDM;ŸÞæãìf•úÙ͉4tcTdoú·«C°‡ XŒ«—X7 9íg/N1ÇM!« öî\‹�™œéLüm"Ç:�ÖDµIÇ̹ÉiC îë&¾�{ór3õ³Ã¹c.k¡å"a#·ªMµÚ|qC¤¦­'hø´:I…zo/žï½öÅ7¶P¤i>9{%Ž&çäÇ];{ÌwŽ4Ž6ž2@`âü.xTI>IÀ‚mhîU[n�z™âޤÄNqÏ2¬º‹~Ÿôu¹âþm¥ô[x‚-ÆèÌ—dà6&Xzøü',º´£§gë8VFÕ…â=2íç3ˆï^«�8É—U�êùa…)Â!2Im;Æ"¨t^«¹Yœ4‡´rtƒü´wÓ.xèe>ä =—M („�D¥Òpà÷.w|8ËÉ)Ͼa5'Q�ŠWcC3T°JH†]"]B/~IŸÂ«˜ö›tÔOð·–µY yÀpüm[¸î�-ÎX�÷KaXÄü¯?:Ìèà›ž qæèÛ§ÏhòýeÇ%¬G…1‡Ú3Ö÷Õθ…‚´ï‹)·¯wÔÞ?8r|êQÃý,s[5žŽØ@õèè¬�F@0„çr�•hUmä%›ÆA\¾æ]ñ³I Q‘;VqE½héÌ¥]¦ÔUâ÷yißž47Ü"\© ‘à|“#×,´Î““Ö4 «òo†ºO_£Ø¸"¿*§JIöHR(À`ClÒ$#Éb§†×ëbÛý›löá¶<9N¤Û®ý¢øàîÐçRw#dXf8š&ÁÁ"ä�±ë¦Ã–tŽ‹ès}š¬z0Ù�Xª¬.Š}‡NÏEM,8w½5¼”�r'e–„i&1—ý3Îzî\ûª\œB ÆÒÚÛšÚ“f:e[Ï�µíùõ»Š¤û5 $\C ”°mºÕgÅY ¿ë§Ohøwï]ÑËmtÀ79_þWÙcÞ/|m¥¬×,¿zà©[ímÃ+ Ÿì7<•,©Û¨mˆk½ #"¤>Ð^½‚¹(?(‡cóâYÄð¢ Åâ’ˆ…L5ds6Í“÷“U ”Íߨä ÕãµaŽ<ýù6kËòÄä)HázióÐã©Çø‹P§ÊR]Æ+ã_n·F™ƒ¯0»ƒ,•{z>œCÇVÀ:äR§V•ƒâ(n–K´‘dÂÜ·ñ •ÙX�J…úû.ÛŽSvý¨™É{þ|0WS·8ãë¼5áÚ8œ‡ùHÁ¡;Ë3>ÁÑhÑîX›ï âv+"mh³ÇBùJ÷Õ˜!Ë™°ì/Bp¯eë5Á”1<’7ŠµÑŽ\ËÒW&Žz‡ÊNŽsãÊ>ýþ¢  þ…Ù[Ï+°Ž,êpy›…FËÜÁE¶¿™.�Þµ…íÞÚ"§J#Ô¸gù¢gWjJuߌçoÛ V *Fˆu§ä—þ_3sù€š7ºòŒ%‹Áþe·B&4~L»—­pVßA´Ì þD£(ˆK¹”Á ó­{ã›ýJmsy ò––~ò�Cçmašš-;·_’ν3×úry&KL/ÜJm“�Àìu$üdïõÛê€u]xPá¸{â<ûçÇvì,Øó¡¢xÞ­*£˜Qú�1çž»_xæù§Ì2))Á-ï,.ÈШ(�ñÇKkÐk—“Ä-PTŒþ]Œ–x“@Ùïך‚µÎùWwãónß©„w L0ôã¨5<p÷ ç×âüÙ½¾zðò!¯+’3nÑiçÏÜ06N9r,|›�ÑsHÀa3®�1(–9.>F”H©¹XöÉ]@pµªª)½iGºÜµÂËoÊÆ7þeEß-`ÍpéþÌ™4^±P¾x=s�¼�ç5þ¹Å•�qR!÷®Ì4ÁQ.Pïk¦•\)è~e¼ºòù@ÈÝÎ:fÁ„ 'ý¤Aܘ¬PÇ‹ø;¯œÅ^ß+R|2º9¡$ž^ÏÃ"œ£sø@ÁýµQ…ëN„¾ç ÅÐÄ[ÇìôšXÙñv¢é�³°«ì÷AF€æèeæ#¾$¸D8{žåˆ§‰}¶FBSã{þ'NVë„ë Œ¥·ú[™õû¥ßî\²Ëº 9o¥‡P‡¸bpáý÷(G`µóÎ`æÅѶ�ìá1À-R@¨ó1Ý-AWÏ$Û૨#·‚¸ˆ<¿ ÀsåòâÍHxŒ¨ô­’�¥ hÔØ“»tÀ±×˜ÙXVf€Òxú¼TQ\Ó›ò…¦cL�Œ4cLÙT{e@áÒ8ü©Ä3Ñ|èÓ·=–ΪÕYÎþ÷µÇ (jæ:âjšX c„³¼¦¸¤kÁÕ¯B�¤’Å×%&a›²Ñ€&˜í3ëh6�ʤ†ø0L=o>÷IÜ<|àÞèÆü ëèÝ(d2 FLØ�à 2…I Ai#ÔF�ùV¶í«M¶Úkj›m¿ã­m·öÿqC(1¤"ÑIQ„)ƒ)³) Ó!"1A²“LÒ(ÈB1š†ÌH �5 L¥ýµ¶Õ¿ÓU¶U¯óÕ[êÛ«U_òÛWþµ«e¶¯ðÕUZ­®­¿j·ûoû/÷ôì¿ßö÷ýK½;éˆ Î3ª�¤–dPå™ÁHù™ƒ@hYd ®\¸�²Ñ*ެX+iR]ƒ‚ ”2¡Xª©PVKˆ—±$¸–ªòÑ ³*â—“*¡fY„»Q ]à —,Òò\¨Ì¬Y�RK”b¥UA!�Ø<ÊÌÒ؈Y–"]‡(Lª«+hgs f`HgS L4u ea–]•I†ve ®ŠLvP° (W*I—’ÐBË2¼:ˆ¦K.Š¡Ë8YYxh)2¢eaÖ #••*C¨fg˜‡vUf¡Ý˜4)Y‰–tb%¥�… êÎÐe¤´Ã2ÆV"^V\¢�î!¡•ˉ‡—fX™w1 2³8&!¢8ee$Ç Õâ¡d2)$%THUb`2WfuUž CIRÆ`…*¢ e’¬¬D9*¥‹Ax1 Á%ÌI †"KB˜T’%Ë,´ª¸™"!å�•T;±$"ª˜fƒ+/$a‹ i™Ä�î¡aƒáÝ–²Ã,*°$$IuwI2C²‚¥HsY]ÕA‡P&!ÝU^‰e‰˜rÊÌÒÌÂD” I”*KL3±wrV%¤‚Ê%@"RUfd‚¤¨RKÉY• åà0ye(êЪbe¡B…$¬¬0y ÉU0á ª³Á*ì¢ÙË"B³:•W.a኉0êË.Ë12³+1"\ªºÉIsž!œ;0Y VY!س«I™•+ÊÁh…f!X$‰Pî¬XÈ!PaŒ†�ê°°D¸-%‹,+³‚Í*Y˜C«²¨X—V\<”gUTQd@…sÌϦ‰Pä‚\ùU†H�.;ùüúï_¾ïÇó÷rÿüf‘MD 0 #$fL‹û[moÖ­«ú¶ÕýöÕmýê­¯÷V¯ÿ»m¶ÛfÛmýöõ¶U[é­j¯ýu¶µµkùÔ†™E)IDÍ@0„Ih†PB!$šd‹!�#I‘)HÛmÿ¥¶«m{jÛmm×k[¶­«ZíkjÕ+kmYm«mÕ­ºÛV­ÚÛV®µj»VÚÛµ«jíjëkU·«mKmjµzÕ»V¶ê¶ÛeVß綯õUm[mµ»VÙª­_ÍUj«kUJÛUµ]ÿOü?¯ûz÷ºëÞ.^s…çöûwÊîíÏÚ÷î¾ Ð^û¹§‹„¼»Ýïn÷«››¥»îŸ{Öüß›½ç¾^ýÔ^õÇ—}ÕÃ|ºy|÷î¼¼ãë«ß»\Þu×wuÓžùùƒBª³#Z8"Y•UQ‰,.ªJ°ôxó Ø“rM×]»¿vô¥ïݼ«Â¹}÷o»ç­ù¾}úq/wÞëžnkóås_–ù_^ý×¼üÞêçºòûÝ&ß—¾¿{iÝ{¸Ñ_»³»Ów»Gï»nWéõû÷¢�÷vç•z ç}+ïwwW¾÷žª­ýª­}[Zm¶·óZ×ÕJߪ«Ûj¯ëmVÊÕ[Õ·óküZ«úmËZ#ZÆÅ­£j�¶æÕ\Õ�¶Ûù¶ÚÞÖÞÚÚ×÷Ûm¯ZÚßßk_ª¶úÕW­ªÍVÛ­­kµU»iU´¶­TÕµ-YmVÝ­[SË»ò{§s=ÞõÙîé#›sPË$›EŠ ��×(¼Ž\ާ»¨çw3 îÝ�Þí;¯Þr÷nŠ7;œÄ¼æ÷nT„DeurGv¸n\„éÄ»®ÀYs›µïzKAMwºô×=îFæãËŒ`˜é§qržêå7wN‘wuÍýmV¿ª¥ªÿKm­íZ¯mª¯ï­mªëû¶‹bØÚ-¨­b­±ü«U]µkú¶µ[ÑkUßâíÛ¹_áÔéqÝË®÷tón»ºîås»!λÞä#×:..wqÆîᷠ—Hæ¹ÇuÝÜõÝ{¹ÝIš7^ëÞn+—^ïC^¹×wnõÝî¼×zòï9Üë©×9ï'^ÍÊ]Þ^öíÝ½ÛØ×�Ü�îò½uK›ÞëÝuï{yÞ»½ïsÞ¬F/MŠáw\]×6wNÞžæ÷/3zqÝ7½{Þ÷{·\:v®n�’&Js®Ü»¢—8½ÎÝýïyÎäsIÝÉÒuï^\ïwHÞÞ;%ׯz›ÝÏåÅ×a΢$ Ýä<˽ޔ÷rçNôò÷`Êîäòíx§.äÜ�×tŽuÏ':÷½ê7{zò&{rît»�ÒîëœØ¼÷{»»Îëž÷{ºït½Ýï^ëž÷�sǽzçuÝvw¦ï7½ÓÙÇÕ¶¯­¶·õkk­m­íªÒÛkmjúÕ½µZö¶ÙU5mVÛúÚÕlµoíZÕþ­^[[Õyµ€4ˆŠ„¤¨"fɲ3d±(ecQ ¤Å’D±j*Ú6 ݶ¯ûª¶¾ÖµÖµ_Q1KRdÉ%ˆ1”ÊH ‰(D„L˜™‰ &ŒQ¤#¤£&D£Q[moï­VÛµ¶ÛúÕjËRÕZöÔÚµÕTÕVkoêÛ{Uµ¯j×¶ÛkµµõVÓV»küµZÛú­Uýí 4©‘3Hª+D(¢¡•LšÄÊÒ‘I!¢™¨±%fmD¦Qi6€¦†4l˜­õVݶַö¶Õúµ_Ú¶ÿ·mVßñµm^Ûm_¶ÛªÚ­•kMkm_éüþù?Ã×cÃ�=êô¸\»ùÛï»rùë»üþç�¯½Ñ»Þö½ÜJÿ|ç»Þ"Žî¥ 啊€ wvvB]Ø1.•vrYY”²« J³3*«+1ER‰†‚©!Ô,Ý›»´}û«Ïºìs¯wêï¾÷›½ïU …UYgˆ„!Ê;;¸…På …Y,ð°‰õï{^në®o{�×îíüo’÷ïo{·¼÷yéuÝÞ÷y¢ç¿}ùÏ«Ÿ¾ýÓññž}÷}Ÿw¦8ó­ÞïÝÓ×wÏ\ïo<=ë¯â¹ñ÷G{‘뮽ÝݸWt¥T3C"£Ë+B«ªA*B†(¡��™T¯F_½×�ÝÝܸnî×Þñàäh3Ýâïx½•Üò=ßϾûŽêN%ËÏ7™ßuzåìòîçó×§Ý]gËÌïz.÷{Ýßu|‡Ýîï9»½Ïä»’uÝ¢w;�/zsº?�ïn=Öñçwî¿}ïn}ï½¹Êåò7—víåäyw½ÝëËν×Cçßw6û�Ý×zîynó½ïzžëз9½Þ{!y.Þ{ËÝù¾÷\¯>yw:›î¯w^÷º÷¯vëÝsÏ»ß>÷Ÿ{áŸuñíÏ9ïnž7žõÉr»�îë}ï?wÓ÷_{s÷½îw¸òðÎu:ïÞóçwwÎnßœù_,Wšwn\æó›Ù×yÞóÏ~ï<îëç=ÞîôœÞ÷»×žiÎ.¸îºéÞéÞ¼¾î`|\¸¾zîÜäî÷8âõÄ{ºò÷tîôtêyÝF]{¼¼ç7ß>»Ý™÷o•ïßzüßyuüî½Ó¾^n{žó¹»¯{Þ÷zô㮽Þïw;Î#Þ÷ó¾÷.ûÝîNíÐÇ»ù}Ó>'O½Þýï7wjùwÜ ÷o{¾»«Òé¥Ý½Ó½Îs§ïz^úõ/w™ÝçóëÓçw}xW*òåîâã¹ÝÞîî«ÝÞW»Ïß|^Ÿ\{ßÏy^û{×N®è.o7ãRî¹uïz�ܹíuÌù=÷®ã¯{ï_zë÷Ýz—Îoœ^»ºîNç/Þþ7¾:îþ{¹Õá×ï{ù>÷t;ݺyî»wuÜ÷{wNÜåÒw©Ow$Ý.÷WÍ÷ÞóÞïOßy}óÝî÷ºó{žwºîü¹¾îû½Ï^W»»uÉÏÏ?~î…Ë—z»\Ýîò/{«¦ËÜNï:þÛjþ­­³oíZÛ­¶Ýª¬­²¶ÔÖʵ»[mÛmºÕ*›kk¶ÕÚªÊÖ®µuVÛµªmª®Ûm«µªê«UÖÛZº­RÛf×UZÝU·KVÔÛm¶þª¶šÛnÚÛ$†‘•’‚#Fe0(™‚J d‘�¡ fÕmþ;m•]µ´Ñ’€Cl�laLDQ1dµ}¶®­jkkWU¶–ÛëVÔÚþµijöÛjþm¶¯ïµ¶»[m¿–¯VÚ¯¶¾Ûm¶úÕ·ÚÕí_mmkÕ¶¯j¶ß[U·Ö­ûU«6­vª·Ö­©[e«jõ¶¯m¶ö­mü¶ÕõjÛù·ªÖ½!¥“Cíµ+Z×ÚÛí[n­kÛU¯ïµZõ­¦Ûk ‘,&ÌÆ�L¤´Z(·mm_Ê´ÕZš¶ßª«úµµíµzµMVÛõ«kj¶ýmµ¿½«{jµÖØøç]Û·.îÈ‹»»IÜî¹as»s§S»uÂquÄhéÉÝr8îä]]ÝâÎ×Wwî.»‘ÜQÊbuË®ÝÎ�qÝw9qtѹÖb�×wwIÛ¡j¶¥Uìžww"ƒ#n8é®rI2ç@„CH¹]Î)äI$¹ºPç)„s\î¹,¢s“s¢îáݺ dràiäÎî˜\¹Nîf';&A©’QÎb"’L\â‘ÆWuÙ%Ö.„$¨»·.ëŒ@†RÒ3BL‡N˜A"1D‚3ºç9GwBXårBŒ.¦‹º8nîW7a�'ww!bQÍÎq%F3dFI.u4Iˆw8É¡’B‚bÇ1Â2�˹ww4îµ_Ùµö­zµY¶ÛMUo¶Öïoî¾ßϼù×ÞûÞO3¾öwI¾y^{¹ù¿/Ͼ®åq9pÞîûºÎ÷¯/.ü÷®yŽ|¾_}Û>ëªiwsÍåïvæîÝ}Ý ç_.f~î�ûÉïw_›¾]ríî¯wo¾ºHL¿79¹Ý|¿>{®û�Ñ�ã½Ý}õÄ"¼¯ÍsÃòä‘>ï—¯®ïÝïqó›îâO�/Ÿ7Íò2`’H7ÞëžåÙŽïß{×Èæå»®‰?uÃ�|7wwœšå×½×¾~÷`Â�;I~ó^{§qD¾û¯9u>p®^ïzìr77¹ß<ŸuË÷]~~{îêé®2)%úíÓ{¸ç}ѹ߽äû®å¿{q{½×·¥yß»¿wï»îõÝë¿wwpHæ.�`o:}ÜÁWwÎ^rH‚óšû¹žîîá Ó÷·HÉï½ëåÕéÊdr:@]÷¹ëÝù﮹¢s¥ç½Ï»»®‰#&ç+�=ïy�ȹ/=ë½ÜB=ç}÷A½×f÷ww%÷_?w_—á~ë¾WKÎË×sç û»Ý{ç}ÝÊRGž½v3;±Óîíîºù{Ýåб^îלÅïÞ¾úü¼òä½ïoÇÝb‹òãOuÙ÷w�½×çÞï—ºébòì7»åëÎæâ¼»ëïy˽uÉ”Cžö¯/{¯{¼×Fk¾íç<úúäæºkï{Ï»_=ÝéåÃ}Þô{ÝÞ¸ç7;Ýp?uÓË—îâýÜEû¯Ò½œ»çEû·í×Þò¼`[ÞëËî×}uÍÝÂî“î»wtÅ÷Nèüà}ÜÙ"ùÂ=ò÷æû.ý÷Úï»Þí;Þ�ËÏwïk×wÛÏcÏ/y¿eéyÞû»ß½ïmï¾{³ï{Ø2{¹ws¹ÛÞë¸îsκíËçI¯»óÒ>íùãw~ôïÞ¹ï½é9Ãsƒ×]/:ýÜ^íuû·.ïÝÞ™$~"Ý�uûºÝn|í}ÝyÏ]Äßž{Ý\¯+ŒîÎëÛ®÷tçgw'{·;×ϾóÆc_w|ºèî"yG'ÍÏ-Ï�éÜŸzðO<öB|ï~ýöúóÏÝ£ßqá/»¤ýÝ_wÜ“M|äë»ÎÅîû×_7IŒÓîêù^Ï.ûÜõåïuwvç2UÉû½îý/åÞùÙíÓ�#ÝÏœWåqî¹û®®S÷¼’Üçtovå÷yû÷Ey¯ÜßzãÝ~÷ç±sïu$Ÿºû×$îèûŠû»téùÙ]Þzùtž{Üûï^¾]½×ï¹{¯½û½¼>îç]##ÝçÏ”WÝÝ÷^Ÿ½ÕÃs¾k�"úu¯uÈPÌ…Ï<q 寞ŸvùÞÅ÷º";º+�÷n—§;¼Ý뤾îÊøpHwnüûó÷ëéCáv=ÞzÆ8ëÚµUê¶ÛúµwVªÍµUú­nµ]kjšªßÊ­®µUÕZm­mýöÕWV©UjëWëkoZ²ªj×Vµ¦Ö½m¿¾¶Ûo[jëVÕüÚÚµýö½ªÖ¯ï^þü»…Ó;®]†:¹tîÜ"æuÛ�иÙÇUÎ9Ñã¸k…˺ã�qÆ1ƒ¦Ž—;¸ºNë�w‡npá¹€iÍÝÎæcqÎà»8B&IÝŽîCs¡&.»·1�Á;·9:§GD¸îr¤;®7wu×Ó‹»»¸»vî9Å×9ºçA¹Îîã�tŒå×wS®Ni.΄(&dÄR6þµ¶ÞT”bDØ€¢MÑFBÁ‹ Bj D†Õ[¯LÅ”S#b±f›,_ß¹Qݺ·wcF�ÜÉÝ»I»»[›¤T”ns»®[†˜Ì–4î¹RRE’�ˆÑ4 IF5.ë–�ÊwTHWwX£›tÆ6nî×%(�¹]›‘G9G6éÎLBJ ,I]Ý$œ¹ç)Á»º9vh�wrQ\¸‘d6îê"¢Êë¶Žb,uÝÝË„îî»r¤Áç«[~Ö©ûm³V»õýRc»W6¹WJˆ©.Xå-Ecb¨Ñ®UÍ9®sbºkDj4åÛÑ®[j*æÆ1\ÕqÝ· AdƱ¹sss€-Æ’ŒZ�±­‹hÚw\‹ºîV+tÕF6¹®kšæ2\Ú-Ò¤Ôî®W.hÅEˆ°kšÜÖ*�¢± ¸®0c£A�¤ÖQÊ [r¹’ÁQµ1§w"ÔXج§uÈÕwlh¨7+:íEcbÆîë•®lUýUm[Mµj¾ÛTÛm¶ûUjûm¶š¶ÞµV•Tµukf­5ª[[5UºÖÒÚٯ͂*šÌ4k!E3$†ÁDa�‚h�‹aÊa `�”¥�¤2`Æ"�¢4b‰¤QHŒ–(HɬX¬dÔ�±�6µ¶úÕnm­í[nµªÙ[_ßVÚ¯Z­º«imj›j¶P@ˆüýç?·ùÿ—øþ¢ÿ�þ?ØiþæÉÍ ?ÖßóÝÎÍ2ÐiþØ/ßó.�°Ž)çdvœbežxleÿ}ÝþTv õû‚ 0ñnë½w¾pý³ZÈ0Ìè‘ ó)dÉ>Z\¢D÷ÈÐ¥Ä h+NéN¨°·5Ì5œB2ô0�|a(¬«¼d6ö4L$koš³‘{2­Ct«Ég9ÝžRÉ!='}V Ï +Œ�Á_´Ë¿_6a|‡$¥t‰e¬�|­¸Þ×RíËáÆ´¼LU¶îÕïSïW¹%öhѬTOêºs Ùª·;HîX-'ŠàYÁ\õ%Ò= ®snH•6¥Øý\Å –ÕŒï‰/VÄö�O¬T`Kc‰fQ×0"´úpñËTø¬üz€Óå0†qŶgGa”Æwû¬üLÝêS­øb¤k§}ª³¸å—¶¢ÄêËÜè,°)!‰ ÓAÈتl 3"è$#jÖ¥³Ë¤HHn묔švˇˆÖ@ŧJCf0–èÍlˆo7n%—bý:* È5… 5 ÕÁÂâ Uïª0Eäð#ÿ fkK‚’„ö}Â$8Òèƒ>A±øÅ³wMÖ;ÂÕ,p 6…€Yq­ ®·kï”UdŒIÐ)Cà4ë¦z̃»Õa¢7µ¾sʰlG·HÎ�³1¤ÒH^S[ÕÙs˜mj¶Tª6°;›"Ñãiš¾øðƒ"+¶½mö4€&ZGØ—RXL¥øÜMj×G(B.’As�°ümN-±<†�§×o¾íÁÁŒˆÜjÊí+‡Nâ ɲÐá=»ÇŸ«Å£KõƒŒ'­çRÏDJcY´‡pYR«Zº§L{ÿÇâât¹å¨[‹Šº�•y£¡ ±Ü�øÂõñä1åÞ„00„æ|±–pd ó™Ôq–Bˆï“ÍM©¿&!·ÂLˆ`q<‘Y§Pêã]ÐWÀ_ˆª½$8¿£&¶Ád%qZ³X]ɲ©P£áÇ!!9Ь÷—,˜ïTd´™’ð:úƘíNAà¬*i¥[áC®&{rÊM™4ÚŒÝÚæ¹½Â €Y,aMáÅ>55 ñ¶ð+kZymÏ,™¥S°6Ño0ƒ`·;H%„µóQæ³X¶w&3Ë‘‚0ˆ€J€VÎm×4ͪwÅ‹ÂÐÔhÀ€wo>~ű“y}®«±·¡4èÎèæ®^8à5çâ²~ÆÙ,ÕLâ¬z- �˜~Û+ê°�—ÜÕ¥|2åpËcÚ]­ìrdx·©ÁÛË[öe•­©‘o ªß“ÿ‹D?¶<Ý2±^…‘©ÌÖcý.î† 2oƒ“‹KÔEhO.A¢¨ýìé®…®•®AzìÚn§}—.̸d\nꬎ�—)Mñ ¢ç¬1ظ…ðË!n~p/`{ÂÖ,L$»Í7 �õ’ƒtGž“ tT¥Nÿz1»fÖñåšÜÁ\,:FÚW¡{òJÙ@1ÉÒI¸|±ENÀAó-¥Üx�;5Tù5£ %ï:Èd.!$¿%Ú´_F€LpòF¸Gk$ë^Ù¬-Oh:e$ ®‚¤yV!¤MââOÂ�h:ßBÈ= iË[Ù!6ØÇEÉr�ZvWÈ+…ÈòÛJ?Ö¶Ä£‰WãøÖµ¤RjÌÉì‡@åöìè~|\QÐ)ÑfUD0öð·àVRåÁGrk@×´. £&ý~#Á½t¯»¹,üæœ"âSÇ…›Î Œ¯ÅÇnǬµ²|[¹³À ‚HYðä£Ê‘uqÆ6ÄÝ>5ÇÚsœXü(—$+^Ƙ6ÝÎp5ˆ;¢»IÕ $ÚÈü¾>Ô@C¶0~PbQœ¦ë+@¡a¡œÛŠH¦²á¹¨ò äiŽ¡ía�zMã_Șˆ1¦ õ[XÇ)L åÇ:×5d }MX€¸`믕ß*ZǹCô2ÆãZ‡ŽÚ±¼XNû³UÜj® ~îäævâ²)ÊEŠÚÉ톳"±qË`ýd._9núuÎÚpì—ª3Úö³üô¤Aš!ŸjÅÏŠ~´R{0B ‹\¤àíð,*XÜ“l?#©ƒ…N^y« ¨±1røCÜzJþLõã¹n<}owdÁT!N%¥Àˆéʶ6.™¥ó¦û”Ï¢ªìšFŽ+Õ8xoëÎOͰ Ï{ç¹Ô°[Ö÷Ö²ŽÞ5]Œg'øÍÏ1k�ÙÊ€‡Í8“yaŽÂ`cn{›%€ØÍO�{R¾>¥Tü%§€Ìì¾ó‡AÜ î:™zäÒS‘&mY&œµ¡6¿Kb¢³²9¸oPjyl“U¯ ÄJÑ‹­o‰i4"lÓª¥m-#pœÛIÉnðX‚×7‘Cº�k2hü¾®ƒL†­€ÞN7}8–D+SšÝ+ò%7ö›éÐ秤�xÜî‡�–òÙßoI(  á×¶$ÀrFoŒE;û³ЉÒ‚€ �ƒ%&ˆD Vÿ¡­þmµ|µý•Wô«ü¿ém«›ø@*áD0QÀsÎgÖ×ñª#Æô¨ãþºùán²Â5`D²°[‡ôǠʯ±ŠÅ#ëój‚�æ“ácÉå„È cúÙª’-ÛÂ�–D359àÌïˆ!ÅLÛDQ-6ÕóˆŸkŠç{‡3ØØž\¼ú„õç©BjþwdN ð/ìäSºÒzÈEl5Æ'¿4à Û|ÎÀç¯ÂÚ›w†Š'Þ¬Y‡/öV‡›æ"Lzg –‘Ð •Éïû1ûî Ÿ« s7x.ß�æן�Ø\F©„L!ùÓ(¸AëT k–Â~”@�îÊ,äN`náŠüLß×HAt%CÞQí!YÎ"† 2ÛYÏ­CNÜÇiµEÍè‘WÙadÒÐXÅJäL`ØË“4XQשџ‡qMë÷�ÕÀzš«Z‰d°½Nû¤˜wº2Cè&F ÞôLè˜âí$––ndú·N±·ì;°ªäH(�iK0 ¾J bÔ’Cóg»+•Ä5AYÃÜÀH[‘0ÍŒ¦ó‹ÌtLS(èB¾ xÁÊ;¶æºÚ$Ù´ƒX›�4"swI�÷×�ã�|¸o›–ön¶eÎ9Ó­—ðÊbÝ7p¸ØÂ8%9)Έ#Y¼â¥º}Jã댚“|­Ö«~Ö × òÁIÄÝÒ�æËnO8¾ßO9‡½w1i•ʆ3ÚE­Jçag-@ñZ·mQ\9¹4…L—7› ÝÀʼn¦¥öžO_vÎ?W°¥'„„ãâr�³¢ fÑ¥DŸ˜—ýçJãË7ñH ѽMQçš 6?¹¾ bïÀ7ðS[–/qÞÿONÿÎ ÚÐZ`ª­,KÓ)ù.; n]'Á¥¶WU¶B:Œµ)ýëT­þÞ¬ÓÚZSñb¾Eù/�ôl(½øN ´,ÑEÌɶvÂQëV|Ÿb}y£?È_„þÌ�óy­± *ÇG.—|ÈûŸn&Ž™˜ ¾“3Q–5YÃãÜ™¿qì&¥ŽÛá¡¡âN-À'ãâÄæn,#dÀõ_Pg¨ô£^ÂÂ1jD ò€†PÃ'Èk©Ë‘ˆKÑO1ˆî»Vv+Õ߸6pOðW³þ”ÓÅÏA~¤}“d‘¡6÷îSùË]ZÛ³ «Z?`Á�ŠaQ{”÷A×3uVš=IŸåúøCš�Ïà6?k0½Ü‹4)ÅÌ(Ñvöª]Ö÷¨ö< aT �-žF@ƒ„Wvø]¾tÆì†Õ­¤j.!‰Ép©‡?bÔseg`>½¥VÆö:iÕÄÆlw:d‘ê’"� ä�ž¸uZ½À ˜ „¼©¹d‚Ìd‹&,:)4tù}m–¥~«¯{îWJvù•A0 •‹çë©}…�ñ¡�!dv‡ñ£9o Ö ;Ž�Ô�.N>8ÅŸÍ‚7°˜‚ ÄÙ¯)¢dõ�AK|'éÐ=gC€P~r½¬‚0NÑ­Y& /®«@»ÞzM%ÝZØ´Ü¥ÉþlÝßZ9ÓÀF|[4ÛÏêÖ–ßf˹~•.ú|å‡ �™ØµÃBÙ7j^\ˆ3à kCÖ÷¼ä¢û{§nI¡*7ÊîÖím‘@Î% ¹@hÎ6MkM.´¤5®ñn2ˆÞ˜‘Š˜ �SüœËïw$ð3…»³ÜGuËϧ-.¥sWðqª˜ñî!Ð[ËxÓ¤)7á(”œTÄÑïùw\s™'³�d6à"³5Ö.=ï6tíwåÿìè�’–:¸Xz8i04›�� ðÉNÞX29ж5m`Ý&––%†ã‹šU žRíf%¸m%Ÿ ?Ì%C°³Qcî\t™uÚâéוÉHñPy€<µÙ ˆß –ªÌß uáju7ô€ƒ%±³jÿ|¨š)í³ˆ¶Ÿ%ðCÑðQ;ZŸR1ô#òÏ4úåo6Lð‘€k6òèu{YË ›m6ö OÓ¼A»ð‹#Ñ·ÈÝp¸W1áüXW«MË ¸@< üðþnBK6±è*QÒïÄ®\ ò#+½irûÕD´¦JGÍëÆ ’îÊ_ë=¾¶3ñü7{;_² "ÎG© xÛO¿éÖïgõUNg}óÞK…ì^üVüÆuu]®…;@ Ø"JÕ&¾“èV’oõN�îWÍg(g¦¸WŒÒÎäêÌŠª†ç®Qø\1®ƒ‚ÙÆcFçÀ@¬Ÿd OgDK3'Þî/ `´ï:]KH‚ÆÏ@‘HI‹îí7¦0ª5ð§æ±l–L©]búÀõ¿<Sð*®äRÐ>Ý�ýEÊc¶Ë`ˆ&EL\ŽÎ~Rù Š ;ŸS»¨'ÄVà–m²’l#óŠèãy±›kå9—x>f&ÛÍ;„Eñ6#¸,j¡y’¤åÁ ›3AqY¾�p0õWÉŠR(çÝ]�NÊe’`X,\f‚Û\ÝR ð¯böÄÛg�­‘Äæèh w´6'— |˜'¹¿µÙËI¹{á°ž¾Ðnûâr0 ÇIg&!Wh&ÀT˜`1•'ëØr‚¢µ]¢k=H–‰rFvý I… `ø¬)å®Ü# 8yìîP‘q‹F²)ƒ$lA7²Ãô¸!CÊ À1xÉ��ô4kÅÊâwt­T7Óóàp1–;&õùúaçµØ �FÛn`´y÷´-cˆðâö*Xæ¾]üÔÀœÐ0¹&ù˜UZc@�gs²À�4mÇ~ZÕÁÞX(œo�ŽÅõ³5ùûnᯪ‹Ø/Zjû3¾‡ƒ£'rÀ['�^¥*ßnj¡Ø Ž(×Ì�É\¼ù€`¶ŽÔÌ�…ûvÆtÚB�\»ÀV cb‹’ôÎĺ¹Âl±hÄ2úè5*wY&6þ‘È[dŸæ›kæ.ÛñÝ<™ô³_\w˽¶·Y¾¶Ð,TîìK[ñÖB±Šìú]v­€ó‡¸³Å÷ÀÜà˜óß–ûâ1%�9ml ¬¹ 럭ü¬ÂõTËr‚D¤YldD”»¾ä—V|Ñ]=œå4H4lzŦ¨pãõƒ¶†Õ*¨¶lÁçnuH«ÕkFq)@#¶%* K/eGÕ )†“S# _¥<[ £%íf‚ƒÞ Ü%&¾[¼¶Êeóž–ì'Ží¾c¥O¦Í(åÚõé¯Ïåžú eâ3ºžÀúG+EÆÚ��5Ьö‘ÁóM Ï<±l†l•yo^g4%ÎYî8̪N‘`aMHAô�Õ•é Ü~Ë-M‹!Hk�§ìÝmÞVÖí9*ú¸e@\Y€PÃÓŨ¸3û?=·ÓÆ‚®ñžÕ@޳‰$ßÇî]þË^Ü2M�� 40q�Åß„;%“\‚Ò›ô‚ä#– ò\]ïûŒé·¤Ñà¢ìÜjWkšTÐ`SÃû$AŸaK”ÎÍöÃÏ¥;8Õ'Ç·ºýËz1s<}:ׄQÙðð»ŒÉθÊÝÆd5šcP? ì¾ði~Ýj~‘ÞA{¸`gŸ°5�`îg_|Cö7i–½d¾&ý™„Ì2\Õ*¼fvýk^ÎùiO>ÞÄŽ£aózõ cÅÖ3ò»±ÆºY/+:Åø›j6M>�ö |Ùmúcx¶i &èS`�Œ±a´fÛ'p!ÊØ?ÍŒìtƒü™ˆ¯«ù

L d ”8a)Ý2m؂ֶ·Úe;4¢âX߬·Ö/âB PE«ÿaðþ„Ãe ä[®§Ü÷Lr^궬bŽçð>RÄHŒ‰œÉªî”ùX¶oZ¢JÌd³µ«à¸MÏ(ÉÆ’î;Lð)Sme@Uà€Å¸™*:p­G Á_¿Ò.}pèØPìÃ%Ðãù# ˆld0þæ÷Þ?ŸØÕ—_ôü ZgÉ÷â¿GêT‰mÎëCö~¼ìóàWò‡+÷l)Ï¢šST„ Þèf{l‚ź6Y`CB†Bk¹H&âý�WÄžWРø,|•°|ð›Ü¿ c –tÍ…÷¿uÊ:<'E�•_@†E1óÓrdˆ/² ?Mçï$¼(ü¡I¾jËqK«Ò/`Ä@È1}¸ŽT¨»Âç @Qgu Ym„yÀFWКGÍ«c�ÚI}a¿�RKí߬‡•#ÌŸ“º¶G =Œçd]»jОù¶`9H=&(‘•v ½#Åpí%yóÜÀOÄâḏюFlŠÇ ^¡bcì{Á˜#¢Iâ é×´Û׆Z<Ž(pØ,`~>PÐZ ö‚cšO Œ‡³Wb’”¶ÝQ+'náÞ .Zúò%G'ˆfŃ,]¥“b¼s‰5­�‹ACÎtm³ÍklѤ“Lä½èn…ç&ÏR�«:A±UÙ�ï,Æ2êÄV´É¼‰þà ÍH\;¿'<·;'Ë»¶+W ”]Žá’„]ݾ �;¿«{|FÐø<7ΤgFùÝJ¶ãc–ÍÎqc¾FÂyúMÐ'–SÚk;!0iì»èõÚ¾Ë8ÕìÁ¬zíÝæM*Qå¾êοL 7-Ý NÕÄ_À”o�)„ѦEœ×È@` ‡µ#Â!û˜ÁOÑü*}Çœ=aj˜K.Š€ æ6¢-K|ºN„sÌ|ad_丿ê"ÔyÖJñ¦U‡.§ŽŒ³„�¼}лÈ1ÌÍ›¯à²ü ŸâB+/F·#¿Ú~Ùƒð¦ÚpâÈcòF6Áëwɸ©ÖtlfH„FÁÒ Á¶ü#²¦Š¹òŒÊ‰?±ÿ´ÈJÎQX´ZCJm÷+›‰Ø,í¡2'§Úb~#2<+‡¯‘"Êà%Zïùç£`h¤ªßΣˆA_ Îlª% B£uÍõíöˆßéø@+="x؃ ˜g„çÖ3çѯ{0ÃÈÒwL9´X¹¸2ÓšÆò0[‰¾æ˜Ø¹â&¢†ùU·¦2ޢŤ©ÎÓ3².‚­E_�XrŸ€luÈ+ Ì �¯Tßøƒ">ªáVÌ%g[çcEç û’MÇÌ4{1ÀH¡Fñ£8ÆddúG–|»#”Ø}‡’-€Y!ßA Щ¯C‡{›ß@ȃ¬ä7žw†fÈ6ó Õ.¿­Lu‹Tg—cÆjûÙ†L�†ïZõ:þˆ|!û¶ãȰŒYÚ�QøÏ…Îß»;:eQs!%ˆÎÈÌ4˜¥ñLÃÆ\ë¼Þ˜qã@Å{`â=€Î0© ar?›ñGjn)ÿ‰|äºïjÚ q2©çðÀý²ûà™Í\ÖÛºx ölÙJ�—äEÆú–+CwT…ÇÓ ,E½ŸÜ ˜wdÙ–q—-ƒß‚™çýѶ|߬6N�¬ÜsÎ)-ù~ é,¥¡ˆ�pç¬n¨š�ý6ç¬<ÿ¡‚-óRïA#vpý™X£ÑifDP00,ËÓ@ÜÝZn`a‡&ã[æä¸2sæ?Ù1ÔçB©G¶ƒŒs¢IÀðM‚�»�¡;º5qG«xä0ö6 a‘”C™¼%€cÂõ<£¢E@’+YÌ@d½X–ñÏ“¿™ÛÀ)ÝgÞ<‰Haï\•Ö»cþù‰f4ð÷·,ÿ þ¥ì¼)8̳=”©Í¹Y™­_S¸»*÷²|ÊëÚ¯k(ùÒôiÃeàlrŽ °JW“D�‰„‹jÄbà6Š—[Û£í&©MÔHƒq A_R¥¦ÎÕ”çPñiìƒçM 3UnµÀ{Q.çx;iaMƒN -ßñ�µ…)dRŸî?¡ƒ�/�&št¬„Ð9Ÿå@ì!H,3.˜Ý�"Øo-nžÚ?“€GgúÕ´`ɾL˺šÄe{ÿtånÆðf_îU4B¿ÚÿœäÇï2J–›Ž�zË›a>\ÕÇÜÊ% .-¯&)~ÍfE*B¥J÷#Jñ&Ëln4�ôk–ú!±•Òl³‡ï7Å¥Ý�•5h!Mâè5‘ÛlÓc‰–J1ÓG"¹RRýô>çÒ©'Î<øÉùŒõ[ùOߨgÛ�w[|œíÖy^Š%MOá@ÿYâ³æ2ž¤ºþžé>UU÷D£û2î½TÉ×7å¬sBÊ„ßPÿ‚ã8àÂ}±NÈNSM˜7±¬ý˜½séÒÇ ƒ¼î=~ _èï¤Áü6kâCð-çl¿{|�G™§Þ›V|w¹ÜÁß¶¦aó‘ÏiĬùû¿ °eÃ,„ͦqr:ZoåS>…/‹ÅP`~0Qëy:uÄEÅ„ŽÔ¢ð_ÀÆNæ‚¿aÁ õ–ŠÊè¡ÁÂ#•r¤c…䯅� ŸnHF»l(bN9ˆBMø€îŒÊr\ |xÀj6S xÐdŒÌã†Ä÷§™ xð®káA5NÐ @x`a ¤ª¾sØ5£!è“ɶ=_¹::œì+�Q%ÒtÀö @™a©¾…:)È�P‚“èÃG=.ê ¤ ,lyŽ€n¤ŽÈ6…ÅòTÓ‘Äqào¹˜@H&$·x!¾ZÚµ®&'k�d ó¹áƒlî8<Ê($Š@Œ %ûæ­Ûø‡.=}µ·}ÃY Á|˜-=~Î1Á˜ûõ;càíFIªËPè¿XD‰MźU0®ùŒÊÌšñ‰wPŽ )¿çã/iëï3̹‹"súþñ!ï™ÐÁóiŸ¹Ï`aæe¯÷Žþ93E7eR;þ22¿¤9oO¢š'¹:Õ›Þ“µpö:çÚÖ±>禙û>ÆsY�’Çg‡ï ±öh*~lùé ÌèÐ�yä¹"Dv;k$`‹G‘�xòoU1Ù €^'À7žRÁ uÞgåÏRß…ŽT1öMœj{j—^C�HjQY6O¢;è Ÿ}‰ž!eÝ™öã]‰J1”·E›MWßv›øuàž�D¿ïý%aÛñLù^ÞÈ7"öƒ>k¼f†rÝ®Û<(»Lê5ò4ˆ^RT×$Ž©Q:?;�Ç·ë¼™9XrŸ.ó¤öËßnEQ¨Ó¡}½ýÞ-íýAÐ�—¨�ºfÔ [X8™Îr2kb%8ñÂE3çÇÙ¼™èÕË*Ù?<^{܆›IÊŸ…fÅ>öá· Ð^Û 0Ï–¤Iˆ÷\a¼½J,+ù݃Ü"íÒ"*q�c:½Ü�JLš$4—:w#U“0ÿþmõfy9˦VâVnrÏ/¯O¦Ud.ÆPÖÙõ4sòHenñ^g5—4“×ËÅ˜Ó $É“¤{f¶Ï1¶º³0åF‡ÅÔö)QàÆ¢W�Pgq ¼»�¤ŽžyAXÉŸ÷“oúSžf EºÖü~­ wkÓKÙ䳿ç'@ìÊM»¤ÐYF†¢ä¹3£ºÎLàØ˜|¶î±¿% †Zíy­pâiÕë³çÆ{‰‘Bö£W5±ª"]æ(»µ ;ç¸9È}á#·|Üø=Ê�zƒÀ÷EâMÐ-ÛW$LÈ ä~O¿ Br2ÈdB*5¨ÈE¤�E-5óç_zx˜——$—·Ž^5?²é63¾€‰¼ó±ù°F Ã=§—Ÿß�¹à¿¼â뵆�õXÑb¥Ì‚Z`… )‚U *ž�xgÓŸ…[ç3"ŠØNàäî°0ˆH0�‡Ÿ�U^ù0)Cïã»§|¾§$é¶ 8¿·_«fdý’Ÿó§wÑmÇ÷ÓÊ3Ri‘æ7�Tù!ð”~¬Œß¡e,…ìk´øÞ‡¼�`xh6{) ÈDDO!3­6=!ÝPÚËCf麒·í€‹ ‰– }ÒS `¶M"ñ \¤þ—b"zÖ�Ãey(hn\‡–ºH²z&´š\BjÅ#’Áú]`ŸA¥ B «GOi9¼pV„žë ɸØâ2»*ðµÇŸ ™ør7 ŒÚ×pÏX©ðpŸ¨WxÇ Ó?z5ß¹"ƒŒùÀÔBÇ>À÷ô‹ýÍ‘^`(¢¡C &8 ôŠÐ…‚űÈɹÙDLº!F¸Èjq{òÃÌ4˜‡iÌ�bаDËZãHŒñ(µ·4•3~$®˜Š«ß¾ÝºáæTÅ4%�ŒàYÑÉ�õ¬�ÕMÝ""™2œÊ0:P0MÂaÈØà†÷쇩¨;2¢^·e ÙûRß$ëÃGd“4é�Hnv4²£Ñû¿×P0èþfYFe‰ÅßfÃÀëÂaGüñ€w”±àœ&Ì1ˉÿàOÂ7 Vø¦Å|£`±zYAù§a¶Ø ˜1Æ¢’äÑ0î,¯6o{øí[`½ÁúË~ E$ÐÛNؕՆ#c¿8áŒc”ómP‰Â^!BÖâÔ AdXã£{Þ§�ÐÀº�š,›¬0 ¿Ï=@^K…À�Ψö:iœM„ûáÄ‹]ÖGñÃc•qyŠbË®þ B~?€£ Áφd>þHZ@ž…ˆF31¶«Õÿ•u€þ¿ÌU.`ÂOY'Èßi}dƒ�å÷;¾†oœ,9D X¸Ô½O[4nõ‹! ÜÿŸâ¤Îí² Âÿ‘¦4÷~®¾o÷×÷ÂîÓ ]3U9ÏÏD„K04h)“é„:¯.”ÑY´-ßW0`‚ L"» *Ž)jX€½ÕÒÂC>0gæ ³`ÊDoOÂoO®Þˆ“¯"¢nEÂ/ä½ks+¥ög %u ´`¦èd«IÎ)a4#ÅnÆrÞ9x'ÒXáp#>uÑXÅQh£÷Ó�h˜k›7Bz]lÉ~´ŽAn©´¸m‰Ù—Œ#î³–.Êþ˜¹Þ.yg3V6’ÛJÿaƒ.Û¹n÷�Îëx‹ã�Ñ$ôƒà²9d‚K™›oQË7ßÊZ‡ã¾ï¦®)|bâ 1Ë@hs/YõQð”Àx»È?àô}€. Žä‹�jgTn÷ËYË¥ “ñQÀ{Ï�eØA�ªbX ˜ô˜Gþç)Š šÃ#¼¾îd>álZ·½HÆÓÆ9†ín¶][É$#øo#ª]¿xˆ T#/N‹xás»Å�€¹Ê� ��Xг~`WìÆÅ—Ø%…x RÄ3q�<„‘™Ìw33Ä›a‰†-€ç¶Ãÿ �òYÉh¸°¢îëÅêmx×_·_j Hpø È6¿k%Èx)axêãØÛ‹Ó¹ž=(PvÌðsU÷”Ò·XíõÃY2çñÌÊÏänê2¼Vsõ ¡Eì^± ¸‡8y |w2ƒ[ @ÙdnQôØE— €gZ.™-˜Ã"´u¦ù¹¼¼aRÎFòÑK“NçÊÌÕ>œVÛ¤º>ô‘~üE=‰Ò`†Ë©9¤·× ŽèûÿË.M�è×¥Á/µó½äìö }øR©t±+‹Ì©AøyžÉ×\—ež›,)­š™/‹©½'¤K[÷:>}9ùî*zHäGTì²§Ò')�ÕÝyRÁéé.þô\‚ý�êr9Ì•-ó}UX†ü;Ùp"#"/B¼¥êu>1ƒèO‡ÉPô×ÐýF²ž·˜¤:A™á‰Äºç©ìŒsMàÓ–¹­ª5ÈlàÀ¹ÀR@ÚÊÐr¹î$Gòݲ0@Gô¯pÇ|7êÅ}ÁüñšCã÷ïøù¹ó©žÙ=¯ ;õà†‰çåïÞoí=wõ±í‰çÇ?(çø�âê‘Cÿa²À„.J¡��Ú6I�pOs¾|ÿ—ßÖŽóïÀ¿÷3€‡�_2;·Î!{ŸP=3È–Ë"ÇÝËØÙÞs� ^Ýj#6×н¤£˺ʛûzá÷ǼÄñ‡Y¤= 2cµÍ~hvìïC\¯×¤gz¸HªAWHAK�¡íþ\j£¶Ë??\Ñm¤  A"m±gúi­sub¥7é ÕkXMÑÚ”mœ`0Ñ«¯ þòÊWÿâîH§ ÆÑH mhcflurry-2.3.6/test/data/processing_matching_seeded_replay.json000066400000000000000000001672531525677230600252660ustar00rootroot00000000000000{"source_commit":"2c0736d6169cec0d4ed07afa457b159ab85b46f5","cases":[{"seed":0,"targets":[0.029901652442301918,0.04118075878949368,0.044173026835209295,0.06079409730251861,0.1135856432057436,0.1412411459427294,0.17783134233757503,0.24155704460539473,0.27194011576511323,0.3575145244711404,0.3699925701773613,0.37424281390330727,0.44684771606470797,0.5014912656207656,0.5267328998917891,0.5269204416481492,0.5511640176260774,0.5734966492493654,0.646834143679138,0.6639199713794128,0.785363880872498,0.8496885166998682,0.9087575881281439,0.9196788472683246],"proteins":[4,5,0,5,3,4,0,2,5,1,3,5,5,4,5,1,2,3,0,2,3,1,4,0],"values":[0.02058309499293133,0.022558341354612703,0.028406750004122683,0.03236787274697607,0.03934975803887878,0.04242496967678181,0.04719109936984534,0.05121272448736927,0.059011458262727245,0.06998980320368063,0.07045456978449065,0.07135445358825274,0.10481121014554502,0.11132104622584728,0.12751873079355402,0.13086255899647875,0.14534286449792921,0.14685448725987302,0.1772251434784447,0.19070750328310723,0.19695492452781377,0.22500079033344872,0.23032012713050098,0.25439433811685985,0.2612835960094714,0.27264144732037987,0.2831939811704947,0.3568739350201868,0.36595614427548595,0.3711311996389659,0.3719452829010459,0.3732012469063205,0.3751002101913331,0.3770523126746059,0.382272446750406,0.3936248084780785,0.4389286672329638,0.4470420019515871,0.44842195852548505,0.48644904235808745,0.5130480478273619,0.5139944330665934,0.5152355392408878,0.5183675362910491,0.5201127919727234,0.5293425643690962,0.5319173048545084,0.5336505499672541,0.5358154736700547,0.5412550250286378,0.5455906076367537,0.5626826052120596,0.5708026189238409,0.5853913855363254,0.6301346346430087,0.6432437214014627,0.6446857217821085,0.6448567889891611,0.6585835826756848,0.6795386017446746,0.7758774849701653,0.7879712256473724,0.7996829921132731,0.8334801378127936,0.8573913358790078,0.8607593198938888,0.90349242088491,0.9050985106520701,0.9230011434366957,0.9272472336552494,0.92764814229589,0.930160008181479],"negative_proteins":[1,5,0,2,5,3,1,5,2,5,5,5,0,2,0,5,4,4,0,3,2,2,0,3,0,0,0,2,1,2,3,2,4,5,1,0,5,5,0,5,4,4,2,1,2,1,2,0,0,2,1,2,0,5,0,1,2,3,0,4,1,3,1,4,5,2,4,1,1,5,4,4],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[6,0,16],[9,15,7],[18,3,14],[1,4,11],[2,24,5],[12,13,10],[25,26,22],[27,29,8],[43,31,44],[50,28,21],[19,48,23],[17,37,33],[38,20,35],[40,41,32],[39,53,36],[45,30,34],[49,42,51],[54,55,57],[52,58,63],[65,46,47],[56,69,62],[60,68,67],[66,70,71],[64,61,59]],"next_random":[526952372,1229255782,4010506930,1273085065,2937974303,1509293453,3538113993,2514054908],"repair_calls":2},{"seed":1,"targets":[0.0025980201873563313,0.05533667111019225,0.0902377248823103,0.15138787673324017,0.15484460838700143,0.18784977944925352,0.21215600585889505,0.2327792288148096,0.2541540724494067,0.4283283767426276,0.488341348685831,0.5063197755260279,0.5066793844791299,0.519704181427148,0.5366333278673542,0.5427954899259857,0.5589271493654191,0.5919743934121233,0.6840734264943017,0.7833738163774715,0.8046091702664873,0.8889032900133069,0.9576451081402921,0.9907337448791518],"proteins":[1,2,2,2,2,5,3,0,4,2,0,2,5,2,5,1,4,2,1,2,0,5,5,0],"values":[-0.004488866856774938,0.005480903623900612,0.019538730887082224,0.035483301724452965,0.05642413904373178,0.0663519696817925,0.07128720932237889,0.07950602875909914,0.09459902682547272,0.14304636409850596,0.14611496007341115,0.15091158916435682,0.15425657048058,0.15670125997042905,0.1647808819183165,0.1748329265027691,0.186185597081017,0.19714053684479851,0.20727485276539642,0.21400400368229303,0.21641614350732133,0.22381576016017024,0.2239073824347473,0.2313597257878232,0.24284266118323825,0.25801272398289543,0.259011469073175,0.40996722773836225,0.4180746933110741,0.42368749081107726,0.4702374066962676,0.4946870047823652,0.4954155260116343,0.5011125290798905,0.5013063080975917,0.5019009410323021,0.5051072360437037,0.5066294780985797,0.5078600343066844,0.5105406175038647,0.5142849853660325,0.5185919729895622,0.5255670301500873,0.5261303160970543,0.5307725191716584,0.5402089812293586,0.5408764247904791,0.5424159045861038,0.5434331449491961,0.5530184778374857,0.5773115446605475,0.5973848242459066,0.6036157375413285,0.6054141741933052,0.6666257172052398,0.6826477302533411,0.6990884103356415,0.7656334133604595,0.7736668045075218,0.7791776095310899,0.8130573744204775,0.8152154928522954,0.8195986162218785,0.8745167050151574,0.8916393164626844,0.895897083327319,0.9514953135676836,0.9598681789625892,0.9633398537596017,0.9788568279826134,0.9790161536263395,0.9813523492289413],"negative_proteins":[5,1,5,1,5,4,1,0,1,1,3,2,5,5,5,3,2,1,1,3,3,2,5,0,3,0,1,3,4,3,4,1,1,0,3,5,2,1,5,0,5,4,2,2,0,4,5,3,1,5,0,5,1,4,1,2,2,4,3,3,5,0,5,5,2,5,4,5,4,3,3,3],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[6,3,9],[16,23,13],[21,18,12],[10,1,26],[19,22,11],[14,4,0],[8,24,15],[2,25,7],[28,5,20],[36,47,17],[33,39,50],[42,44,43],[38,35,49],[55,57,37],[40,51,46],[31,34,48],[30,41,45],[29,27,59],[52,32,54],[69,64,56],[58,53,61],[60,63,65],[62,70,67],[68,71,66]],"next_random":[879897654,3754518128,588468045,222024350,1763171454,350590421,2231280358,2565326908],"repair_calls":2},{"seed":2,"targets":[0.11995237785491086,0.1524714507792745,0.2123988054077447,0.30042599121099556,0.31540445328100175,0.3462874999237423,0.3489167128946181,0.44014173776833065,0.443655907974409,0.44748254053693426,0.48586633346308306,0.4949398323613621,0.5247419459408266,0.557303561462073,0.5635108182432734,0.6581790789559127,0.6874916807834863,0.6993877122197518,0.7014607669463622,0.7782568094004593,0.815755133576451,0.8367388142376376,0.914502769923609,0.9278430129623557],"proteins":[5,4,4,2,4,0,4,4,4,5,0,3,0,2,2,2,5,4,3,1,0,1,0,1],"values":[0.1011284106393742,0.111246117684944,0.12212514555862204,0.14768332111251709,0.1485743866383457,0.15417979736774154,0.19929743192538676,0.2298993007241179,0.23016138582095677,0.2903008882000868,0.3002937867389268,0.30266548095558554,0.31893280295914805,0.3198052069186015,0.3229195395877875,0.32632868479550653,0.32801400259616964,0.329705832971749,0.332485188732841,0.34839860823100566,0.3490511068138241,0.42154634298496085,0.42400844277790667,0.4322758855197055,0.43475922706409287,0.4411081332481567,0.4448076259924799,0.4489560756821962,0.4530795403211877,0.46025918652020287,0.47374007303916743,0.47406640792601573,0.4852010884376075,0.49083041543694217,0.4976011372961195,0.5084842330863879,0.5116730098532453,0.5135674976235832,0.5242570787816224,0.543481574986587,0.5531174556981417,0.5650984975079574,0.5684977112224421,0.5700767320248702,0.5704141739339196,0.6469019625230809,0.6487734030371762,0.6510444716440884,0.6790995985191782,0.6918312013785578,0.6950469299331306,0.6970935882590223,0.7007193562925736,0.7012468602611676,0.7045312473873875,0.706227652100325,0.7116689714701909,0.7630242684962782,0.7782180940907171,0.7857139499496717,0.8161350663668673,0.8238700350077661,0.8249643755600921,0.8319185387779584,0.8377013611377162,0.8520102912789697,0.8946475118165743,0.8998643706589728,0.912060837015613,0.9142342226111142,0.9276710550675598,0.9411510211471816],"negative_proteins":[4,5,3,4,5,5,5,5,0,3,4,1,1,3,5,5,3,5,4,0,1,5,2,2,3,1,2,1,3,5,1,1,2,2,4,0,4,2,2,3,3,2,0,1,5,3,4,2,3,2,3,1,1,2,3,2,3,5,3,1,2,5,5,4,0,4,4,5,4,1,5,5],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[5,11,15],[1,12,3],[2,18,29],[23,33,26],[0,20,36],[8,44,9],[10,7,4],[39,14,16],[6,34,25],[21,17,37],[43,24,19],[45,28,13],[35,31,42],[49,22,38],[47,41,53],[32,55,60],[30,57,27],[46,65,66],[58,40,48],[70,51,69],[54,64,68],[56,62,67],[61,52,71],[50,63,59]],"next_random":[2628268405,3553943458,2171908609,474025199,3537692390,246768113,2190833248,4217156847],"repair_calls":0},{"seed":3,"targets":[0.026280037207678908,0.08744487235742626,0.11990318620998264,0.18746188817203713,0.19238828759164206,0.20490150860303624,0.23097923943847576,0.31700699488172157,0.3443080286828606,0.43934758703507504,0.4878849974563889,0.6182494391315174,0.685561871238156,0.7145155121419247,0.7176248059147878,0.7206210450159003,0.7375015449550485,0.7438351014496313,0.7448402576591734,0.7809430494247661,0.8476643182199425,0.8621268426179837,0.8842052907729119,0.9598438600237148],"proteins":[1,4,0,3,5,0,0,0,1,2,0,0,1,1,2,5,5,4,1,4,1,4,3,5],"values":[0.01584868628159995,0.01728258535141968,0.02259605873807718,0.0678309554057372,0.08723737017276123,0.10674396679962296,0.12021210788160168,0.13198631426255922,0.13691941867188798,0.18117314902429066,0.1831868154927956,0.1834349513016747,0.18698103664860694,0.19020452516717679,0.1949327570473592,0.2023771442392087,0.2230077039939031,0.22330757699075943,0.23543757212466876,0.23932613174446402,0.24672293482302166,0.32770536581754267,0.33332834729000355,0.3340305333654237,0.344853775519765,0.3496563799827758,0.3522413464219208,0.421251813555525,0.42993942807144897,0.4366424673161029,0.4796080235879198,0.4846178660217885,0.5025083605199959,0.5984716597107687,0.6281133513263958,0.6346516696067516,0.6685082817398034,0.6771058894815133,0.6952555012790967,0.6972481463360299,0.6984733530114445,0.7096450644757824,0.7104019366210804,0.7110137095615715,0.7136210484343802,0.7192080694913262,0.7208286001705966,0.7252085877264237,0.7257735581046342,0.7353975115357788,0.7371952921825145,0.7385978509710246,0.738908507800547,0.7390636436280781,0.7409465946925934,0.754181288520525,0.7567786766662925,0.7735802490878705,0.7860529204788781,0.8002678090107982,0.8452317086616442,0.8454703292321749,0.8463847909139937,0.849456361392336,0.8524526279405646,0.8698568108917465,0.8774533333901573,0.8780753983717622,0.8789019433908519,0.9412578345762294,0.9522504687213444,0.9571140372246344],"negative_proteins":[0,0,5,3,5,1,1,4,0,2,4,5,5,0,4,4,5,4,1,1,4,1,0,5,4,0,1,5,0,5,4,2,1,1,2,1,0,2,3,5,0,3,5,4,0,3,2,2,1,3,3,4,2,3,1,4,5,4,3,3,4,3,4,4,0,0,0,0,2,2,5,1],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[5,11,6],[14,7,20],[21,4,1],[15,18,3],[23,2,16],[0,10,8],[25,17,24],[12,22,13],[19,26,9],[31,34,27],[36,30,45],[44,50,28],[29,32,48],[54,67,33],[46,37,47],[52,39,58],[56,42,65],[57,62,63],[66,60,35],[38,51,64],[68,40,71],[43,55,53],[59,61,41],[70,69,49]],"next_random":[918551730,2692126860,3687839017,2127148929,544408492,286165299,1274564910,1771288488],"repair_calls":0},{"seed":4,"targets":[0.010344310074812957,0.05231371462388801,0.05884285768333375,0.10898178321386176,0.16614218600036812,0.1760610135200893,0.201697595768344,0.202387131744317,0.20548386523647477,0.20955242095968785,0.22468753079974413,0.272135718360648,0.4281212335625417,0.48756725478470186,0.5350008578328536,0.5364350927391828,0.5453934237377135,0.5799673369994334,0.6185953810840853,0.674707784945922,0.7319965277522458,0.7635376850713563,0.8119751079697658,0.9709603408735215],"proteins":[5,4,3,4,5,1,5,3,2,1,1,5,2,0,0,2,5,4,1,4,2,0,0,3],"values":[0.007218001984473737,0.0074432649184900685,0.023487668420870227,0.050824369344526055,0.05143232707050022,0.059520029751497526,0.0597399927938664,0.061999976696312464,0.07791881113974974,0.10589077841012941,0.11427561511520473,0.12875465193709165,0.16100208282516132,0.1626162794503585,0.1691111432161777,0.1705842006776824,0.1804851132892403,0.1829001242992838,0.1939320833888615,0.1955313840452912,0.19713490413315984,0.19890304439794484,0.20294246426928436,0.20730209720127232,0.2091835720059614,0.21060631338707111,0.21203122718950462,0.21233134781692156,0.21898999596846425,0.22001491729836145,0.22228373505286225,0.22787444689403907,0.22891867552686948,0.2593298933216739,0.26619469732651063,0.26938359054893257,0.4085820393332088,0.44178518350760193,0.4439550992538147,0.48288364381674165,0.483166164091701,0.5035804837268478,0.5164610080938178,0.5194614297882263,0.5235147540958875,0.5404365362200532,0.5420181946147539,0.5501427887598608,0.5528835543152397,0.5548008716814016,0.5632115279652136,0.5834615298610875,0.5857522314598935,0.5982420572772856,0.6036272653061339,0.6108208162324106,0.6384711022473601,0.6680116771429142,0.6703149924131686,0.6714728172565569,0.7287053443604113,0.7392306845333488,0.7454835150769155,0.7464697720453535,0.7649986622478033,0.7668114197965147,0.7976175759948315,0.8016766295469527,0.8060222575148749,0.9665986386777976,0.9788978155827759,0.9792314637998633],"negative_proteins":[5,0,3,0,3,3,0,5,5,0,3,5,5,4,0,4,2,1,0,1,4,5,0,2,2,5,5,0,2,2,0,5,2,0,5,2,5,0,4,0,4,1,5,5,5,3,2,2,5,2,0,0,3,4,3,5,5,4,2,2,2,5,1,3,2,2,0,1,2,4,3,1],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[0,25,21],[20,32,14],[6,5,10],[1,15,13],[8,34,7],[30,17,27],[12,31,18],[2,3,4],[24,23,35],[19,16,9],[29,28,33],[36,26,11],[22,46,45],[37,50,54],[39,52,56],[60,49,58],[61,44,55],[67,38,48],[65,62,41],[40,53,57],[68,64,47],[42,43,51],[66,71,59],[63,70,69]],"next_random":[2786752828,84993276,3399679764,3913929995,2430989732,2423754824,3036196154,3422118150],"repair_calls":1},{"seed":5,"targets":[0.09416762357326658,0.13521806600135755,0.17930570021462588,0.1903906985834154,0.22806029406617967,0.24851427524998027,0.300358572894184,0.3812629385968932,0.3849937429671455,0.41880620575210636,0.43972134121201645,0.45036335665163063,0.46259014245400387,0.47930453705962983,0.6076961747648488,0.6436960812211812,0.8230848762711646,0.8564519629435836,0.8570022938120648,0.8979814742069474,0.8998015261974212,0.9081856150969637,0.9402776607483813,0.96750770362492],"proteins":[4,0,1,0,2,0,4,4,3,1,5,3,1,4,5,0,4,0,0,4,1,3,4,0],"values":[0.09282077187541342,0.10423218864584309,0.11402167369647366,0.1159545143313872,0.13034573287702297,0.1530322336810108,0.16075266723979256,0.17242091501372944,0.1890562461544054,0.1979164157103954,0.198751302835427,0.20729731041780944,0.21163669423401868,0.225807469174347,0.23115707666338906,0.2338615682543139,0.24759987152133767,0.26764758438774167,0.28291296712897807,0.29388002264957264,0.3162792665285368,0.3618771960406598,0.3772368162278832,0.3854354693262198,0.3861376779486081,0.40028665990725165,0.40387347973995946,0.4046584571651707,0.4130728314469452,0.41957620624275127,0.43341433824850434,0.4403288474776139,0.4431776722131904,0.4438719314644335,0.45102015332523276,0.45558955154142977,0.4633519003449757,0.4673848591677243,0.469438114725001,0.47556968940140204,0.4808594558241228,0.49488874441660613,0.59631531491019,0.5980479507970912,0.6241767288709188,0.636978951432629,0.6458470209365929,0.6622453403892893,0.8039647630543443,0.8183064107410136,0.8235871829139672,0.8549707215667132,0.8553524525157772,0.861723971268393,0.864851665425384,0.8700471999481105,0.8751755302263472,0.888726466449804,0.889427740886433,0.8901912266418632,0.8916334961098922,0.9007852317421369,0.9032750968961443,0.904647466238699,0.9132509553867462,0.920105083250269,0.9264293582679987,0.9296496994300041,0.9474152117449249,0.9481919280732002,0.9581129270415397,0.9735767020014745],"negative_proteins":[0,1,2,1,3,3,2,5,0,2,2,1,4,0,1,0,4,4,2,0,2,1,5,2,3,3,3,0,0,0,0,3,5,4,4,3,5,5,5,5,3,1,4,0,5,3,4,3,4,1,4,0,1,0,1,4,1,4,2,5,3,0,5,4,2,2,4,2,5,4,2,5],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[6,2,16],[13,0,7],[11,3,1],[8,27,15],[9,18,20],[28,29,19],[5,4,12],[10,34,38],[25,31,24],[41,35,14],[39,22,32],[23,40,26],[37,17,21],[46,33,42],[44,45,36],[58,30,43],[62,57,71],[51,68,65],[69,59,47],[50,66,63],[56,49,54],[67,60,52],[55,48,70],[53,64,61]],"next_random":[107839496,3924920133,669667465,3320132018,3945818208,1389958940,573829411,2978958106],"repair_calls":3},{"seed":6,"targets":[0.08362117264223967,0.10692510536758626,0.16518894280484553,0.261117110990968,0.28310923263652665,0.3218525024234009,0.38843712622736637,0.41654313554283684,0.5616525244805006,0.5839491653071632,0.6054547568256302,0.6242562757179458,0.6274257311505319,0.7888097624088496,0.8162063226158885,0.8292479667387311,0.8480532844909383,0.8604788528960651,0.8620094090084607,0.8694403348051343,0.8914218046276053,0.8920527557781166,0.952483509824758,0.9970794003896368],"proteins":[0,1,5,5,4,2,2,1,5,5,5,2,0,1,1,0,5,4,1,2,1,2,3,0],"values":[0.08078918450555522,0.09314473702151958,0.10008023049350477,0.10461655750602793,0.10682543783078503,0.11443060386235075,0.15854501703418053,0.1725864577986701,0.18006453083217044,0.24520424500321672,0.24931292442891786,0.26059930022082506,0.2743069676928375,0.2908931460778213,0.2978561076399043,0.3091874742828321,0.3118093413665018,0.330238274873648,0.37979709878476164,0.38910595967571343,0.40484245222273946,0.41710640891744666,0.4188224721943096,0.4268415337804709,0.5435614430971313,0.5725670659882506,0.5743356386564016,0.5841032003657465,0.5861493967249558,0.5941458714277117,0.6064737733271622,0.6080108904101598,0.6109293551901344,0.6162190306781412,0.6166819210663985,0.619965426310932,0.6425153942438946,0.6432396024156938,0.6462516649532333,0.7763144659319405,0.7996561998852989,0.8071962069212556,0.8082904721638525,0.8132405023765247,0.8140279506156322,0.8162737999831913,0.8222944607382001,0.827946786066799,0.8291283927620933,0.840896778245999,0.8470251581848388,0.8554339494156209,0.8561728792720088,0.8588958657388409,0.8689995857007996,0.8709992289067808,0.8716810761618686,0.8736606532698507,0.87914358789055,0.8833491058136383,0.8839790639653167,0.8894352930624526,0.8992700773414002,0.8997956887642455,0.9029818122957025,0.9099394757478655,0.9395817819195832,0.9447380839609304,0.9448487753752501,0.9863855416365296,0.9885885242595229,1.0008840675678654],"negative_proteins":[2,3,4,0,3,1,5,2,1,1,0,2,0,5,2,3,4,1,5,3,1,1,5,2,2,3,2,0,1,1,1,1,4,5,2,5,4,2,4,2,3,0,5,1,5,1,2,1,3,0,4,3,3,5,3,5,2,2,2,4,3,2,0,1,4,0,0,5,4,1,3,2],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[12,3,10],[9,8,5],[6,4,1],[22,18,13],[16,0,2],[23,11,7],[14,24,15],[32,17,28],[19,29,33],[35,21,34],[36,20,25],[37,46,39],[30,26,27],[52,31,54],[60,48,69],[49,62,65],[42,44,67],[59,50,68],[47,43,63],[61,57,58],[53,64,45],[38,71,56],[51,40,70],[55,41,66]],"next_random":[3586182237,918448421,254534197,2458186873,3110955095,1643553134,3471104534,1329745155],"repair_calls":0},{"seed":7,"targets":[0.000790632671646696,0.06318813737757756,0.0676445249361105,0.12129598984512757,0.27625660041965994,0.28600905984188785,0.33421980399733153,0.3389997345066277,0.4531003885819499,0.4795159230367627,0.48440555991644774,0.49007058392969594,0.4948236551729138,0.5291386075253889,0.5373400603085289,0.5754378204739157,0.5861813554054556,0.6019428743396198,0.6626367750775092,0.7252071792104856,0.8111951383058414,0.8418266592931316,0.8838750880203406,0.9987836806475691],"proteins":[5,5,2,1,1,3,2,2,2,4,1,0,3,0,5,1,5,0,1,3,3,2,1,5],"values":[-0.0005114317225653631,0.0022902011557759264,0.01815659652219061,0.045127345923592355,0.048839392359357935,0.05083020797206937,0.05277580224323972,0.07238562159675374,0.08009415572798821,0.1302820551851748,0.13723406459106133,0.13761824796568153,0.2692144404452928,0.2694731851518413,0.2739938390858829,0.27715763751087086,0.2835713513352901,0.29277773145286906,0.32321784440644297,0.32795017563760603,0.33100248572096846,0.3497576265733137,0.351957065168362,0.3573486085057511,0.43554995753970066,0.44212456156137653,0.46379945575118486,0.4685367257507149,0.4719041252078418,0.47538264560187543,0.4789706345354868,0.4831512969065223,0.4835001590489726,0.4867675661303628,0.4893367368743127,0.4899987246563061,0.49842325019289935,0.5082707107645412,0.5091422239353913,0.5166612368094817,0.5305431841009102,0.5320280440740143,0.5462260621915314,0.5483119972297126,0.5487144081527501,0.5781448278092512,0.582670410873337,0.5865259232343144,0.5882192791157919,0.591383067463468,0.5969028602749026,0.5988390744077187,0.5990335304424236,0.6155800040106697,0.6591445784549427,0.672808373303767,0.6779649651232544,0.7264499391041079,0.7389876930529925,0.7417999402626135,0.8089302068661521,0.8177702065958613,0.8300433191001955,0.8316491717363879,0.8344865495943584,0.8451990933999022,0.8671561315056707,0.8844043874170295,0.902705506860938,0.9905292797603822,0.9973663411300441,1.0110084628793332],"negative_proteins":[5,5,5,1,5,0,1,5,5,0,1,4,2,5,2,2,5,2,4,3,4,2,1,1,3,1,3,4,4,5,5,2,4,0,0,0,1,3,3,3,3,1,3,5,0,2,2,0,3,3,2,5,2,5,1,1,1,2,3,4,3,3,4,2,1,2,4,5,4,2,1,3],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[8,7,0],[4,2,5],[1,13,11],[3,6,9],[23,10,22],[32,26,24],[14,21,15],[16,31,48],[12,50,17],[20,28,18],[45,19,41],[52,46,35],[40,38,37],[47,44,59],[51,39,29],[25,54,36],[53,43,30],[34,62,33],[56,55,27],[42,61,49],[60,71,58],[63,57,65],[69,68,70],[67,64,66]],"next_random":[3882293043,4125678354,2446925107,1206255999,624745744,2417414900,826624416,3222164789],"repair_calls":0},{"seed":8,"targets":[0.04042192683396051,0.04761337361638274,0.09279640507363274,0.14855566057132719,0.20762028031407442,0.21074325317287002,0.24861554962916776,0.2713148298014262,0.5477303175769397,0.5990280937772936,0.619755423062617,0.6389799285854755,0.6819333787652652,0.7368787880146836,0.7895105974684273,0.7900106361733638,0.8489570325894037,0.9107359957257065,0.9265738101308827,0.943670373118402,0.9457603147220145,0.9470697115426338,0.9542221664197219,0.9573492294496116],"proteins":[3,3,5,5,1,3,4,2,5,4,5,3,5,0,1,1,3,2,0,3,0,2,4,3],"values":[0.031056428488424714,0.05036283787188294,0.05299230529258208,0.05315558271605612,0.05445427269819006,0.05524151989404434,0.10051311825758961,0.10689902285039055,0.11158140843718205,0.15439324876116967,0.156391021997997,0.16763921359372747,0.19374615741490608,0.19540018258881647,0.19980990648181765,0.21210251687526327,0.22059579678607477,0.2273959074903865,0.2518812905337939,0.2569612419048026,0.257107306058797,0.25755498417350947,0.26269049257394494,0.2883106871029607,0.5503617390600559,0.5532762962912122,0.5621225217002753,0.6004139805360867,0.6123925725832305,0.6163281094526101,0.6180699423315962,0.6215663931135015,0.6280154709779655,0.6306215997728933,0.6411062077299152,0.6543433662760213,0.6624754446434971,0.6652489750857256,0.6729091085274798,0.721048771159662,0.728141065157971,0.7553060189153633,0.7722012933251703,0.7727864886026575,0.782740112666144,0.7847377592690724,0.8041279642434965,0.8087105178362577,0.842842446465026,0.8471267287484338,0.8610601750329738,0.9015823934267737,0.9049194631078128,0.9157483230181613,0.9221260677049308,0.9258845134632229,0.9288720775688835,0.9302104109826519,0.9367849969963897,0.9406818864745649,0.9446889081396387,0.9476785637691592,0.9480190906035519,0.9482054668771975,0.9503904744567703,0.954674101008596,0.9566372567458066,0.9575962906887323,0.9637317661144937,0.9668416749379172,0.9695941280299192,0.9772671593700444],"negative_proteins":[3,0,1,3,5,4,5,5,0,5,5,3,0,4,2,0,5,4,4,0,1,2,4,5,4,4,5,3,3,0,5,3,2,1,3,3,5,5,3,3,0,0,1,4,5,0,3,2,0,5,1,3,4,2,1,4,2,5,0,1,0,1,5,3,3,1,5,0,0,5,0,5],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[14,11,8],[10,3,13],[23,9,1],[6,7,4],[2,20,16],[0,22,12],[5,18,15],[21,19,17],[26,30,27],[39,25,24],[37,44,32],[28,38,31],[49,34,36],[29,41,71],[54,57,62],[42,33,50],[51,35,70],[47,48,61],[45,40,58],[63,59,66],[67,60,68],[53,65,56],[55,52,43],[64,69,46]],"next_random":[3958757414,1335488257,4110299379,1316221367,229954988,3359152704,1041607896,4185394002],"repair_calls":0},{"seed":9,"targets":[0.01088800534756651,0.031548132611093016,0.04644155034582187,0.10092637944805838,0.11027210877569471,0.1256338375139111,0.1387807034803612,0.21825560940093536,0.28504499832668295,0.3115075821881895,0.34603335432472815,0.44482177474837126,0.5227289508073603,0.5233618867759147,0.5838333411615808,0.686538602781112,0.6969063260031639,0.7099485526035427,0.7409520176413038,0.7587619288347501,0.7731400331865244,0.8444145375010905,0.9261725286197109,0.9440410823848817],"proteins":[1,1,0,2,1,2,4,0,5,3,3,2,2,2,3,4,4,4,0,4,3,1,2,3],"values":[0.019874503726591955,0.021652435346458904,0.028079934593722863,0.036103751211637385,0.04043509338054393,0.04415112994599726,0.04494203307644385,0.05558218943603468,0.06465423482846543,0.09297417668073121,0.10580449934047097,0.10639753329305124,0.10641909302101746,0.10919928845425289,0.11698644202810835,0.1182965407365323,0.11993376431428815,0.12511094180399096,0.1347616957489149,0.14883709782996812,0.15747304430120307,0.22045991877590498,0.22633897441682416,0.23285641977572738,0.27478296263177215,0.2791840298472466,0.2917611798263007,0.2948468361264297,0.32560646870943794,0.3284673459495331,0.34248713382500034,0.34423451967068297,0.35529328249033193,0.4304604354223274,0.44111087017537925,0.45697982958740435,0.5061925546984178,0.5137272876541605,0.5219217027474792,0.5275967783663732,0.5364543451005083,0.5384680954240143,0.5892308056819484,0.5943364617743826,0.6025652697970728,0.6710736110376223,0.676182704252165,0.6870037159342105,0.6904275172828848,0.6907204646499738,0.6947023309678041,0.7030936775783189,0.7051683555339607,0.72669453815473,0.7415688492867177,0.7429995015730497,0.7557759434354331,0.7560106966012665,0.7566486444088306,0.7705267992694858,0.7729951397802733,0.7748861090017187,0.7803747306625001,0.8274411950491296,0.8497796302287459,0.8595811174141901,0.9112879165483331,0.9241996661676453,0.9287448106424954,0.9360602424209663,0.9432097511606681,0.94581147821755],"negative_proteins":[5,5,1,1,2,3,5,0,5,4,0,3,2,0,2,0,1,5,4,4,4,2,0,2,0,4,0,2,0,2,1,3,5,1,4,0,5,4,4,4,3,4,1,5,4,2,1,1,5,3,2,1,0,3,3,0,5,3,2,5,2,0,5,4,4,5,3,4,0,2,3,2],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[5,3,15],[1,2,25],[22,7,0],[14,23,12],[24,16,6],[4,27,21],[18,19,20],[10,13,11],[9,17,26],[8,36,31],[32,40,38],[48,42,29],[34,30,50],[33,45,28],[58,54,59],[62,35,44],[47,64,37],[41,39,63],[55,52,61],[56,67,68],[53,49,43],[46,51,65],[69,60,71],[70,66,57]],"next_random":[1016157094,3004486994,2120488547,3295326737,3288503176,2543159842,3617428306,1106198936],"repair_calls":2},{"seed":10,"targets":[0.015554432061231305,0.0472862303102376,0.09147505181064464,0.16961662702870572,0.30354701364630154,0.38545825056747285,0.41154058603711197,0.4149705440722774,0.4613337143915649,0.47909970886783104,0.5661748783299518,0.6167556158842169,0.624007124884257,0.6837395261123326,0.7056369469970638,0.7218790546221029,0.735391516022675,0.809723018338809,0.8392309078472585,0.8709828328938795,0.92177792686551,0.9379718189797549,0.9541811504283402,0.9820410201035216],"proteins":[0,4,1,2,2,5,4,4,5,3,3,4,4,2,5,4,4,3,1,1,2,4,1,2],"values":[0.004273004806309997,0.029917577141016644,0.03030046321991994,0.030813713953908882,0.06321028481481052,0.06539417105901768,0.07757768547237512,0.08061842941803161,0.08429591706629865,0.15367242004538859,0.16138827986234283,0.16910960398241534,0.2892015486459259,0.31233846785697306,0.31599458957064885,0.366400114617159,0.3686160814480375,0.39817147898428956,0.399952209781053,0.4008017860214545,0.40473213840174116,0.40657856473996007,0.4191532020038178,0.4238543914850711,0.4573141036871397,0.4629621179646112,0.4812672281502896,0.4846079305608102,0.49164874153927046,0.4943857731609219,0.550768246916202,0.5551586540322636,0.5656622598451401,0.6016064083661118,0.6142709959591718,0.6179185543732517,0.6330533519355696,0.6352849873023946,0.6431320951269488,0.6772660758086498,0.6912143107124439,0.6976741358537193,0.7016602064402266,0.7119531157064043,0.7169157745846734,0.7179722618965552,0.7183415954325691,0.7245633933106831,0.7339488898335749,0.7365174201420464,0.7408094706363192,0.7992544362144522,0.8073012377449891,0.8180439965590479,0.8198998749420405,0.8252402319104823,0.8488871246245171,0.8622761558922133,0.8636616800493371,0.888581012282058,0.9186521787900338,0.9193018960317387,0.9221820770310191,0.9378905590673733,0.9416775578685552,0.9465213111294102,0.9490098783223583,0.9523064183103083,0.9692436765239992,0.9698547359955821,0.9828123607227547,0.9869958893613165],"negative_proteins":[0,0,2,1,5,0,4,5,5,5,2,3,1,1,2,5,1,3,0,5,0,1,4,2,3,5,0,1,1,2,0,5,0,1,2,1,2,2,5,3,0,1,5,5,0,0,2,2,4,4,5,2,2,2,3,5,0,1,4,0,1,4,0,4,4,0,3,5,4,1,5,3],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[1,4,5],[0,12,6],[11,3,9],[14,2,8],[23,10,7],[25,32,15],[20,27,16],[28,35,18],[13,26,19],[24,17,38],[39,30,42],[22,21,36],[31,48,33],[29,37,34],[50,55,43],[61,49,56],[70,65,58],[44,54,66],[41,64,46],[57,40,60],[53,51,47],[63,45,68],[67,62,71],[52,69,59]],"next_random":[1769399947,3272232204,2136592038,2652901982,3636559710,2265193878,331300787,3344906459],"repair_calls":1},{"seed":11,"targets":[0.07924702300171127,0.10579715175799642,0.13269320914074922,0.15684891412375912,0.20971234626220603,0.2288426457613384,0.26720322583718725,0.32450643776249954,0.3776197906290435,0.43693134692092306,0.4467108550385872,0.5060521557377566,0.5258075169522135,0.564332752720906,0.633623205321962,0.6428831505315914,0.669859409083352,0.6781323821980121,0.7658463905754777,0.9295734960554346,0.9562710167707863,0.9709307268505621,0.9925682584821116,0.9952068953773553],"proteins":[3,5,5,2,5,5,2,2,5,3,4,3,5,2,4,0,0,2,5,1,5,4,0,2],"values":[0.06594728292682386,0.08216017361822699,0.09057757796990132,0.09121531158356147,0.11801923841015854,0.12342354005136495,0.12383000619062746,0.14385010730362152,0.14825381678403693,0.16782444966435445,0.17604535286938489,0.1764932887709402,0.20642290396315033,0.21503033754538387,0.21765429886402218,0.2180269164975344,0.22905664835000478,0.23191527127810163,0.2636171453525411,0.2646446832848673,0.28368105423985607,0.3177646453697804,0.3220901211367553,0.3393037365101744,0.35863410041932564,0.3742696027306933,0.39369990683071576,0.42850431695643804,0.43183636448548973,0.43463191293621567,0.4394086529003311,0.4546351602053306,0.4568647013966422,0.4891863939442901,0.5005282393686291,0.5011596877832927,0.5263062446472032,0.5326569258936862,0.5383422454077923,0.5605222794187125,0.5643735132512575,0.5738114140291369,0.6287765960950094,0.6322983479100834,0.6324050737736229,0.6328675591371113,0.6475112104158128,0.6588681988984132,0.6641647825603915,0.6670065971050861,0.6759316955403453,0.6820373172637062,0.6886672027241865,0.6960791402725041,0.7525509027199743,0.766774276543063,0.7802968192927554,0.9138743829211842,0.9222685008734518,0.9320888973247544,0.9420609122303312,0.9451532267996605,0.9539676240052093,0.9713381059081285,0.9753445657966356,0.975899460797865,0.9761824630582832,0.9762203433363679,0.9799553413996295,0.9818373917102685,0.9892603856852481,0.9934203076075839],"negative_proteins":[4,5,2,1,2,0,2,1,1,3,0,1,1,4,0,0,5,3,2,3,1,2,4,2,3,2,5,4,5,5,2,5,2,2,2,4,5,1,3,3,3,4,0,2,2,1,5,1,5,4,2,5,2,3,5,4,3,1,0,1,4,0,3,2,2,0,2,0,2,4,3,1],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[17,9,13],[12,16,3],[1,22,4],[18,11,6],[8,0,24],[26,27,25],[2,23,15],[21,5,30],[10,7,29],[14,20,19],[38,44,41],[53,40,39],[31,28,36],[33,32,50],[49,55,35],[51,56,42],[45,37,52],[34,43,47],[48,62,46],[57,71,66],[58,67,70],[60,54,69],[59,65,61],[64,68,63]],"next_random":[817056825,880075236,4056110025,2309659182,1078377934,2447517627,2194963679,1214959893],"repair_calls":1},{"seed":12,"targets":[0.13988705088392062,0.17335266167466057,0.17624535892767046,0.23091677362185314,0.23822085167947937,0.294989547412011,0.3078660685787258,0.31326356477321815,0.39926794827345247,0.4336578942047583,0.4822933853843562,0.5134250118434759,0.5534479724751638,0.5725559075375647,0.5916878224503272,0.6347629810412317,0.7473969092506264,0.7864192775469916,0.791531489715911,0.8037994110874096,0.8184718923094839,0.9752262584424846,0.9949935583676626,0.9964378307929227],"proteins":[4,1,5,2,2,2,5,4,1,0,0,5,2,4,5,5,4,5,0,5,5,4,5,1],"values":[0.1262959131188561,0.12700086612014938,0.1489382147366598,0.15876459504559312,0.16599665734563704,0.1662923636000677,0.17211157904345942,0.1749487392647421,0.1827939732454372,0.2185408379659224,0.21901550456602675,0.22114450054877208,0.22624796630963195,0.23317541901589756,0.23402733683736887,0.27830657605968445,0.2888232246626788,0.2902246419284519,0.2943505594553413,0.3057572990620475,0.31544994131905335,0.3164774981110093,0.31756043118282634,0.31916383797284514,0.396565380652467,0.41348263258709395,0.4135842984673909,0.4355006399333156,0.44240048850645464,0.4442638351398447,0.46550278614401225,0.47778157280939393,0.4875852073195401,0.5070095267843049,0.5077652158853947,0.5186329802742963,0.5360155157137206,0.5364778693955676,0.564484741313133,0.5806093549834958,0.5895757528577896,0.5898155208401052,0.5923930830217073,0.5953680556360352,0.6049003114898672,0.6187498662605266,0.6248777031298568,0.6430828169811965,0.7310787742808302,0.7364836775981165,0.7510559532599783,0.7752673920399319,0.7897473252858814,0.7906880188914386,0.792880934968323,0.7950836074281225,0.7955935711296158,0.7978329279598065,0.7980986092531481,0.8061271834282177,0.806386471780542,0.8197363307750732,0.8362358646660005,0.9584064607263617,0.964311778604196,0.9849818348575625,0.9900997108278543,0.9927161989940801,0.9927209309891055,0.9992398456358723,1.0095353819785884,1.0095360172467658],"negative_proteins":[1,2,5,4,0,3,1,2,4,1,5,5,0,2,2,3,0,1,3,3,2,3,1,1,5,0,4,2,2,1,2,5,4,3,3,2,5,3,4,5,4,3,3,5,0,4,5,3,1,4,0,2,0,4,4,1,0,1,1,3,1,2,3,1,2,0,3,1,1,3,0,5],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[21,8,3],[6,17,0],[11,10,19],[20,18,13],[1,14,7],[28,4,27],[5,12,2],[26,33,32],[9,29,23],[41,22,16],[48,15,25],[24,37,31],[30,35,55],[38,59,45],[58,36,34],[39,46,61],[49,67,54],[47,43,70],[50,42,44],[56,40,69],[71,64,63],[57,62,53],[66,65,52],[60,68,51]],"next_random":[2330504981,3359279995,3358892614,1455303840,1574713513,228314117,1623951028,4225078402],"repair_calls":2},{"seed":13,"targets":[0.049766841677613805,0.08596453648099067,0.2332179653200701,0.2645642011722267,0.29520487831277886,0.2958312054058232,0.3109768061617687,0.3564154940202525,0.3788220225780692,0.39609475799943794,0.3964637161949417,0.4045101542081371,0.42003955392373404,0.6508606786779423,0.7055333576699013,0.802216163374636,0.8353426087069606,0.8463574039049854,0.8836992216401099,0.9103125464499028,0.9180389295407051,0.9225839975128972,0.9820734061655126,0.9929956684635021],"proteins":[5,1,3,0,1,1,2,4,4,4,1,2,3,1,4,5,0,1,4,3,4,0,0,3],"values":[0.03871033190341349,0.06083445931549387,0.06795567052153846,0.07556261996468872,0.08204452407629131,0.09088297389670516,0.22550537956443475,0.23397556171803835,0.25230950884216996,0.26697133931022676,0.26882313056856827,0.27551460790458493,0.27900833582339074,0.28307343326333084,0.28895123025786695,0.29162464860560217,0.2921302795236265,0.30255907152276296,0.3086219339285685,0.32076095158382273,0.32279146835271944,0.33769461819553354,0.3544016325059948,0.3664799464719005,0.36721405853405625,0.3860438994328521,0.3866579408588002,0.38849160631773594,0.3970522274292718,0.4028880620669875,0.4054343780392329,0.40700286532081137,0.4097946497508278,0.4105242033098265,0.41118456846564677,0.41146422853560777,0.41627017015938755,0.41909875787409817,0.4211894270301768,0.6365647490563384,0.6476997041884032,0.6668492700320785,0.6895811301792503,0.68959396796243,0.7203888009070936,0.7967913291147442,0.8163022917862544,0.8164965138627728,0.8165879836983164,0.8289476728623065,0.8323199190702598,0.8396657288451631,0.8413081375282427,0.8549720659771062,0.8726484730207826,0.8951660828767297,0.895876949532693,0.8993688569101829,0.9079486067697312,0.9091340369836061,0.9094984374269824,0.9141945645645697,0.915305048959781,0.9250793375737845,0.9319407093916219,0.9371202852831401,0.9650746549061542,0.9753220042995312,0.9756533954499922,0.9870345215344528,1.0093065862854553,1.0096844710008377],"negative_proteins":[0,4,2,5,0,2,1,4,0,5,3,2,4,5,2,2,3,2,3,1,4,3,4,0,2,5,5,3,2,4,1,2,3,1,2,0,3,5,0,3,4,4,5,3,3,0,2,4,2,4,1,4,1,2,5,0,4,3,1,5,5,1,1,1,1,2,2,4,1,4,5,4],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[11,3,0],[5,1,2],[36,10,32],[21,4,23],[38,30,25],[9,6,33],[14,15,28],[13,22,12],[8,29,26],[7,20,39],[19,35,31],[17,24,34],[18,16,27],[37,42,52],[41,49,40],[60,54,59],[56,45,51],[62,61,68],[67,66,46],[43,44,48],[50,71,58],[55,69,47],[70,53,63],[65,57,64]],"next_random":[2409590278,3137252159,3695779175,3870454508,93314372,3989391429,2990154047,793596520],"repair_calls":1},{"seed":14,"targets":[0.019885953512107424,0.048560743713278565,0.09450557385615987,0.12399533704445376,0.21635316741328325,0.3236797930013797,0.4211616791723173,0.4540157783359595,0.4685042074835978,0.4753017998178304,0.5578007393499018,0.559215479239959,0.5803781207980238,0.6708042021074156,0.6943759405765414,0.7069286052978808,0.7692328748367668,0.7793391150390931,0.7884381480938095,0.8265974108879939,0.8374694618547079,0.9029894937944597,0.921326350226233,0.9633667646237928],"proteins":[4,4,3,5,1,2,0,1,0,3,5,5,1,5,3,0,4,2,5,3,0,1,2,2],"values":[0.001619561996471515,0.006509802598955873,0.03016019931326685,0.03996876222730918,0.06389588610269833,0.06614021832116193,0.10566255940744898,0.1058229547057355,0.10755331307797623,0.10938198878477147,0.11037339321503163,0.14177124493517224,0.19968626821201324,0.21628569065203038,0.22294588777585556,0.3077479372629169,0.31958889590753214,0.3207377192623545,0.41702162441428736,0.42232536258971903,0.43367125785943894,0.43907115152467996,0.4515871154251273,0.45600149599053025,0.45874048314488924,0.4638376776133459,0.4753741820690406,0.48577932278583574,0.4871529415985928,0.49236078690983986,0.5426670178928907,0.5478014539033591,0.549189542829004,0.5510802994583058,0.5651181914239608,0.566858481587096,0.5757064811392831,0.5932094791963859,0.5976271841468003,0.6549851246138173,0.6708633755127568,0.6852042351027106,0.6901710434913273,0.6933589134707163,0.6956524120407991,0.6990637899044712,0.7033048232132489,0.7099050360089249,0.7503477107451663,0.760209115967976,0.7777233749868006,0.780328828275807,0.78462909043908,0.7879423756106291,0.7899426224394481,0.7900232626367637,0.7927123983367735,0.8193343185725187,0.8247718872215694,0.8255485580601956,0.8451937435395882,0.8541061244349988,0.8544250074444132,0.8842942255848686,0.891354567681125,0.8923489490610504,0.9038078563786062,0.9229083986942066,0.9350875673419489,0.9526377950408265,0.957102620899288,0.9794604873926448],"negative_proteins":[1,1,5,2,0,4,1,0,4,1,3,1,3,4,5,1,2,2,2,5,0,3,2,5,1,4,4,1,4,4,1,1,5,2,1,4,4,4,0,1,0,5,2,4,2,4,1,2,5,2,5,3,4,5,3,2,3,5,0,0,0,2,0,2,0,4,2,5,1,4,2,4],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[1,0,13],[4,8,5],[9,10,12],[14,2,3],[15,11,6],[7,17,16],[18,37,38],[31,30,27],[28,43,20],[35,24,21],[23,29,25],[19,33,41],[34,39,36],[57,50,32],[26,22,49],[40,58,60],[65,45,52],[69,63,47],[48,53,67],[51,56,54],[64,59,62],[44,68,46],[70,71,42],[66,61,55]],"next_random":[3414806706,381055689,2873175459,1772373917,2003163557,2781232553,1137153133,1873068872],"repair_calls":2},{"seed":15,"targets":[0.011177153568663667,0.03336200765311692,0.04594512917235738,0.07768822655543117,0.09652353206380304,0.2186369773998671,0.22960123322434478,0.32209063569141894,0.33283576207033017,0.4551024210528767,0.5235990046815657,0.5370041491411522,0.5796720746328037,0.6294933411859924,0.6536001189558013,0.7491075629956732,0.7886788695234715,0.835009769948461,0.8524668521653077,0.8759415186013412,0.9109586649264262,0.9521588164123893,0.9843842381319922,0.994450240993661],"proteins":[5,4,1,5,2,3,4,0,0,2,2,4,2,4,0,0,3,0,3,1,4,2,2,3],"values":[-0.004527268044363503,0.004717719929779056,0.012367980610399548,0.02296356395162347,0.02819777059747223,0.0354768044148574,0.04741831204471028,0.05772122498836528,0.06182010397584388,0.06496464561769424,0.0676850683402028,0.08419181528884574,0.08460076444639128,0.08872969961163733,0.10507876672439592,0.21493926909023553,0.21963498762095024,0.22037592305601986,0.2351628126832939,0.2383794132028759,0.24575652717168486,0.31140744639145734,0.3144038979467453,0.32290224958524305,0.32424333384296555,0.32488715224966325,0.3295120958007921,0.4483847941390109,0.45978459117624615,0.4732017213696053,0.5075998432636856,0.5261281569640736,0.5324637313515231,0.5325138494270554,0.5377818163219208,0.5458903362641182,0.5766234078803129,0.5876889308947825,0.5962889372475866,0.6327976844439113,0.6334371978080523,0.636165362282905,0.6493597546350705,0.6612503488006983,0.6691754788572228,0.7423955377459265,0.7534180619124872,0.7566750221510832,0.7708387706572253,0.780032718013372,0.7923629028315106,0.8354937679827784,0.838276593148799,0.8423601009761448,0.8444563681458308,0.8464443005213088,0.852509356848984,0.8575110054794157,0.8789793542305027,0.890216392574832,0.8984377186146383,0.9014499321463268,0.9281839397162748,0.9374744274012673,0.9509359817550851,0.9535374022952455,0.9671094412731424,0.9877320375103265,0.991490057585548,0.9933189601188428,0.996836724651491,1.0043196159026344],"negative_proteins":[0,1,1,2,2,0,0,5,4,4,3,2,3,0,5,1,4,4,5,2,3,1,0,3,2,3,3,4,3,3,0,0,1,5,4,4,4,3,1,0,5,1,0,4,0,4,4,4,4,5,2,4,3,4,5,2,0,0,2,3,3,0,2,3,1,4,0,5,4,1,3,3],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[14,12,7],[13,17,16],[2,1,15],[0,5,18],[4,11,6],[23,20,10],[8,9,3],[34,22,21],[29,26,30],[43,41,19],[25,32,24],[38,36,27],[28,45,31],[35,46,53],[40,42,56],[33,57,39],[37,67,63],[49,44,61],[59,70,71],[64,69,65],[47,48,68],[62,50,55],[54,58,51],[66,60,52]],"next_random":[3648788168,2308747267,1407378306,3457044454,980419076,1368873085,2463173259,930706085],"repair_calls":2},{"seed":16,"targets":[0.03191262374489279,0.1017327564806878,0.140563968427724,0.1844127490374906,0.2716530882491828,0.35147366310570227,0.3538365079968553,0.38026857224625377,0.43034351620551925,0.44284098028581576,0.46461621560313926,0.5107942779474403,0.5495336328372488,0.5560331598532932,0.5957985944437688,0.6131262148322684,0.6699499425509075,0.6749648778221113,0.6869508777474435,0.7301056248189057,0.9197372063016404,0.9304995804832804,0.9467648081460016,0.9693924719235237],"proteins":[1,3,4,5,4,3,4,4,5,2,2,3,1,3,0,0,1,5,5,0,4,2,3,5],"values":[0.017632162829259765,0.019054186827485813,0.02781548997328219,0.08243095510805656,0.10761967491873692,0.1102042139555475,0.12449344132437482,0.1323831417973567,0.13533818408431136,0.17913214459217974,0.19316445344857097,0.20261755945953577,0.26236196681535645,0.26385089143510815,0.2858716193688432,0.3323337281844705,0.3354214641946133,0.33877711400318417,0.34767475972928363,0.35858506742800883,0.3708639112296879,0.37338060415015095,0.38242783593904167,0.3931712604865134,0.41659971801679047,0.43750027213893705,0.4392946331922766,0.44433949349046425,0.44657270242143243,0.4580445505322563,0.4591701126280606,0.4792731634128572,0.4808190489178592,0.494074185902184,0.5051482592883235,0.5204229718638859,0.5426875824983842,0.5449691952834982,0.5520489793699511,0.5523128485145614,0.56550922190193,0.5671122813909156,0.5759333233659842,0.5825558288265448,0.5970341258918194,0.6138922869185252,0.6193964483630469,0.6258094060888879,0.6600616157047836,0.6621762784892703,0.6708810068019377,0.6744910796026827,0.680989791723613,0.6871846038756193,0.6948036463831125,0.695989814590506,0.6969570455961408,0.7163520590813398,0.7207844476066722,0.7496310131540673,0.8998138258068222,0.9149548576518413,0.9238114151614298,0.9268910787530401,0.9270221408813413,0.9320023235684436,0.9367880093520228,0.9474096172260399,0.961193720603276,0.9642725958774023,0.9733052435915761,0.9857069860035659],"negative_proteins":[0,0,0,2,0,1,1,1,3,0,5,4,4,3,3,5,3,0,2,1,2,1,1,3,1,5,0,3,1,5,1,2,4,1,5,2,3,3,0,1,4,3,4,0,0,0,4,3,5,5,0,0,3,4,0,1,4,1,3,1,2,2,5,2,1,1,1,0,3,3,0,0],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[1,7,5],[2,8,17],[12,11,4],[22,0,15],[3,6,25],[13,16,14],[37,24,32],[42,40,9],[34,10,30],[18,21,35],[20,31,26],[41,47,23],[33,28,19],[52,36,27],[53,43,56],[45,46,50],[59,57,55],[49,44,29],[48,39,64],[51,54,38],[58,65,67],[61,63,60],[66,69,68],[71,62,70]],"next_random":[2306414391,1890149892,4084116996,355260846,2278632573,736333455,1672063595,920297675],"repair_calls":1},{"seed":17,"targets":[0.003527135933630521,0.020007964926095023,0.02627545270605902,0.12534158896293013,0.16123463014577954,0.34170914422226717,0.49449012053902397,0.5057551449740927,0.5992518196772939,0.6564523101809772,0.6734720415515807,0.689670301774578,0.7127979232761436,0.7158164546624474,0.7250662320269895,0.7310439080290717,0.7470991392021183,0.798872284245988,0.8585783542923838,0.8614927049620373,0.9059609303728724,0.9065977031498844,0.9408292886153033,0.9506138843013693],"proteins":[0,3,0,1,0,4,4,0,0,2,1,1,4,0,4,4,3,4,3,1,4,4,5,5],"values":[-0.014315139116611565,0.0052217784060147165,0.00816650806785193,0.009383745423178057,0.012601244480255614,0.02853128816788835,0.028942152231824867,0.03932905316123637,0.04511714241757951,0.11418412217686862,0.13262630652429566,0.1375886281936467,0.16493925715672222,0.1692676191718095,0.17157603139024208,0.36068475364929065,0.3610159538645867,0.36105616593083023,0.49238766088842567,0.49425907110545597,0.49794014637568035,0.5102088155961539,0.5123229910865102,0.5139593772277269,0.5907199906790613,0.5998195489802525,0.605693632134638,0.6371065708672824,0.6518321882442918,0.654125308394389,0.6656883241152866,0.6703327719819482,0.6732357658992679,0.6744025160447897,0.6925602192733623,0.6926986612285452,0.6989129702311515,0.7028991050633563,0.7048262584989515,0.7072210559124846,0.7078240800870431,0.7121901585243379,0.721115562092414,0.7252723837720617,0.7293231720026065,0.731651126427288,0.7320371633164688,0.7340648632536801,0.7356648664598382,0.7416598085025781,0.7556963469403939,0.7799423163200999,0.7905085841170026,0.8078721122473403,0.8467557757978504,0.8594684821782383,0.8637204744732351,0.8670560746111067,0.868103227478669,0.8682292296087024,0.8907071682587737,0.8914896570852583,0.8984415078454471,0.9011091286547933,0.9058890863775917,0.9060603804035232,0.9282570726522253,0.9313179038144876,0.9358433441981642,0.9435033479782987,0.947811531948592,0.9683079672882802],"negative_proteins":[0,2,1,1,5,1,1,2,4,1,2,0,5,3,2,0,5,1,0,5,2,0,0,5,4,4,5,5,2,0,3,5,2,4,3,4,3,5,1,3,4,5,4,1,4,1,2,5,5,2,3,0,2,4,3,1,3,5,4,5,3,5,4,2,2,1,4,4,3,3,1,3],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[7,8,6],[5,1,13],[10,9,4],[3,12,2],[17,0,11],[16,18,14],[24,25,35],[46,21,15],[52,22,51],[20,32,41],[60,19,45],[26,38,43],[48,56,58],[36,29,23],[44,28,27],[66,62,31],[39,34,30],[33,67,42],[68,71,50],[55,70,49],[64,53,69],[40,37,63],[54,65,57],[47,59,61]],"next_random":[44411538,1852446190,2414490610,2857447057,2357518652,1269356595,384329081,2482278728],"repair_calls":0},{"seed":18,"targets":[0.030775758907301443,0.12140883886540121,0.15416656530324568,0.159662916784584,0.17372848172359268,0.2082434135774447,0.2145815411203752,0.2596796975021789,0.3658228383598333,0.40227265992103955,0.42456226010376397,0.4667400595680721,0.48982884098230195,0.5981476276417128,0.6372753407155609,0.675732623374837,0.7289294462666878,0.7316771455697028,0.798966007899965,0.8104069664705711,0.8361946938487499,0.890658997042388,0.9540051082072799,0.9804939195942202],"proteins":[1,0,5,2,3,4,1,0,3,2,4,5,1,0,2,1,0,5,1,0,2,1,4,3],"values":[0.015868342738563787,0.017771926424838172,0.02307342954396569,0.11345579823371518,0.12048967838063476,0.12218669940055221,0.14804507727363186,0.1623608269518626,0.16266268302675707,0.16454600691259758,0.16473085471887378,0.1657230379171076,0.16687964801850907,0.17726266481508113,0.19205173905376163,0.2024047223162675,0.20481478524592156,0.20682656519456485,0.20735732123898298,0.22332155301880682,0.22386227378500437,0.25701697639931215,0.26203858963023374,0.2736703748711341,0.3579405716982939,0.3602738217741327,0.3608149283311915,0.38259667125893054,0.3974475888881778,0.41702356191771384,0.4199972245278546,0.4391082024387802,0.4393931070637055,0.46074271374953607,0.4634291318144991,0.47142276198551786,0.47180411124883415,0.4794265620638611,0.4962788716326294,0.5853541591602786,0.6031996783792464,0.6123789580384378,0.6241118356890614,0.6388659766395552,0.63944559105537,0.6590291919281872,0.664678489305653,0.6865557761864447,0.7169593487265573,0.7271742583999862,0.7320917348615871,0.7329466380565572,0.737640448839463,0.7434128952234917,0.7831676837535428,0.786784122941628,0.7905054527889993,0.7935386952753405,0.8163799359104624,0.8166970112629205,0.8250726034602703,0.8357188296740748,0.8404931841530416,0.8883520960242122,0.8906850257265129,0.9025985342472195,0.9598080073225032,0.9655097611980737,0.9656924692175253,0.9660877671672925,0.9879748534685246,0.992450392843741],"negative_proteins":[1,2,0,1,0,4,3,5,5,2,3,2,1,0,3,5,5,4,5,4,0,3,2,4,4,4,4,5,3,1,2,0,3,3,3,4,5,3,2,1,3,5,0,3,2,4,2,3,3,2,4,5,2,3,2,1,4,1,3,0,4,5,3,2,4,0,5,5,3,3,5,5],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[0,3,6],[4,2,15],[8,18,7],[16,1,11],[14,21,17],[25,26,19],[12,10,9],[5,20,13],[33,28,34],[30,22,38],[24,37,35],[43,41,23],[29,27,36],[40,31,52],[53,32,49],[48,39,47],[65,69,42],[51,63,61],[46,55,66],[71,59,70],[44,54,45],[67,50,57],[60,56,64],[62,58,68]],"next_random":[1344520919,1699748994,3291816196,1616566372,1498511375,198216998,363844859,1238251135],"repair_calls":2},{"seed":19,"targets":[0.01669456807940828,0.02408170188416381,0.04084859540744823,0.04962379804047301,0.06153072893453704,0.1443586529966122,0.17153505368274202,0.1923429892784544,0.22052641054236166,0.22405618661658366,0.25645363660201015,0.29347027528052994,0.44429653766622423,0.47048057382463715,0.4867542877746892,0.641863483303046,0.6880931712568382,0.7200762915419581,0.8017962858181884,0.81237146404999,0.8160533954084087,0.8451179331950402,0.9254641755824978,0.9874701454477823],"proteins":[2,0,0,1,4,1,0,5,5,3,5,3,4,3,4,1,0,4,2,1,2,5,1,2],"values":[0.0011057259085748856,0.004361010070429137,0.007954720081600242,0.013818843231858096,0.026290867846484458,0.031797877446975306,0.03490379022297467,0.045653007438785094,0.0472926318123923,0.0531030425824408,0.054656121360744284,0.05696962656429383,0.06093939168266411,0.06697195342927921,0.06882313593606705,0.1358696992490628,0.14425418822301406,0.15370368950298327,0.15567746772977126,0.1648363939525522,0.17776785997393846,0.2007883784777533,0.20733374408270536,0.20974061996888319,0.2097679988525583,0.21905530378365987,0.2239573138776954,0.2250867223851185,0.22629313460310033,0.2342668643939566,0.2380946159954322,0.24126471249461126,0.24168712426896663,0.277028314151988,0.2984267465573257,0.3081142592727893,0.4338233544523852,0.4440172127913967,0.45687981198629046,0.45987807437669853,0.477110854592321,0.480880188094372,0.48598231924852675,0.49581059114124265,0.49992287920018846,0.6429383681032078,0.6443227630476429,0.6612501324502273,0.6723126318823919,0.6928119478092911,0.6938275222233435,0.7010126543518332,0.7251837805120138,0.7318377498311924,0.7973215448695301,0.8020312389374042,0.8043113505437983,0.80742087898434,0.8157352049853245,0.816744823774603,0.8174950076128188,0.8203990534477906,0.8270982843516568,0.8328818123064923,0.8334872545239956,0.8413594173667958,0.9179540944887911,0.941670820258042,0.9449386742170113,0.970677848043235,0.9712697244009978,0.9910990969229058],"negative_proteins":[0,5,2,3,4,1,3,3,4,3,5,4,3,4,5,2,2,4,0,0,2,4,1,2,2,3,3,0,5,5,1,1,4,4,2,1,2,4,2,5,3,3,1,5,3,0,1,5,2,0,5,5,5,0,0,0,1,4,4,5,2,4,3,1,4,4,5,0,4,5,0,5],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[20,15,3],[0,19,2],[27,18,8],[4,5,12],[17,13,11],[31,22,30],[23,35,24],[1,16,36],[28,26,10],[9,6,7],[14,21,29],[38,25,41],[33,37,50],[39,44,47],[34,43,32],[57,42,40],[53,55,45],[64,58,61],[70,68,48],[49,51,65],[62,46,71],[69,52,59],[56,67,63],[60,54,66]],"next_random":[2446307449,1077451964,1917957612,2417624435,1320292247,2840880596,2138535738,2260976346],"repair_calls":0},{"seed":20,"targets":[0.15979059294376752,0.18053017732751087,0.2267099152162818,0.24937581215028803,0.2644221765285175,0.31077035260824115,0.31160677596182973,0.3303567198418996,0.5021180788116437,0.5862276799295966,0.602559487536797,0.6271193112588196,0.7247866700300071,0.7601618911935512,0.7779444568580337,0.8350847210306495,0.8354574436660988,0.8496883010243049,0.8510307138991563,0.8603522057887947,0.8906422005476196,0.8962646627882012,0.9172178112668548,0.9765535528174883],"proteins":[4,3,0,2,2,5,4,0,5,3,5,0,5,5,5,1,1,5,1,3,2,3,5,4],"values":[0.1514553614862776,0.15435041934279287,0.16860528885152504,0.1768517099084511,0.17721748240096732,0.18750514251051978,0.2070162361849584,0.21736230195532572,0.23313467849483308,0.23410272465434667,0.23752063024574604,0.25142556643487524,0.26527861343038156,0.26720368652420107,0.27181648800291053,0.2924731310167579,0.29499468889423763,0.2950348496324474,0.2987508386056235,0.302396732217736,0.3270803960228618,0.33624818151078084,0.3407484778635219,0.34948279416563466,0.49410243220999783,0.513557018056951,0.5142707273247951,0.5819646586326458,0.5894184016303146,0.6050433570918293,0.6058037514368199,0.6081234224112807,0.6150492352309257,0.6218376902146363,0.6357998123422604,0.6414025090442211,0.7179335984080931,0.7303598371616618,0.7332004281079219,0.7483286458230394,0.7583032498604236,0.766256960079783,0.7667304917848361,0.771443997764991,0.7919695666721974,0.8191931400659772,0.8301198694576833,0.8316441276051886,0.832281294694054,0.8334092138396906,0.8369453551243359,0.8386728059967028,0.8423490614827606,0.8426520900147831,0.8509054876339186,0.8544347657446549,0.8576924924513261,0.8609740195913896,0.866053983765127,0.8668002941971559,0.8771722579806861,0.8823376922805732,0.8858140622443911,0.9003455671467776,0.908303727471177,0.909198305217075,0.9101836853217522,0.9244888907518637,0.9267483188315876,0.9604414941376301,0.9790303974486115,0.9876877522201661],"negative_proteins":[5,5,5,0,1,0,3,3,4,1,4,2,4,0,2,5,0,2,4,1,5,5,3,2,3,3,3,0,1,1,2,4,3,3,0,0,2,4,1,4,4,3,0,0,1,2,5,5,5,4,4,3,1,2,1,4,5,3,0,0,0,4,3,4,5,1,5,1,2,5,0,1],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[12,4,10],[22,6,7],[0,5,3],[17,9,23],[19,14,11],[15,2,1],[25,8,18],[13,16,24],[27,21,20],[41,26,33],[49,29,39],[34,35,43],[28,48,32],[64,60,30],[47,66,70],[52,71,67],[54,44,42],[59,65,45],[40,38,31],[62,57,46],[68,53,36],[58,51,50],[37,56,69],[55,61,63]],"next_random":[21924858,2833008334,407284797,1369307475,3646558696,118460766,2600689358,3574662973],"repair_calls":2},{"seed":21,"targets":[0.04233652411076139,0.05791706715301881,0.10071976105203972,0.20014429377213272,0.2204238191027036,0.2625865972339685,0.2879484916677135,0.2993888956819114,0.29963876393610966,0.30484668894074374,0.3183129157547223,0.33914187785517014,0.39908774718413764,0.4549393312442257,0.48518249718187567,0.5483045724138607,0.6346519417128307,0.6491366093556775,0.6706790610146987,0.8418855695448523,0.8695661603490892,0.8780163164359079,0.9025709729759137,0.9183543016245298],"proteins":[1,4,1,0,0,3,2,0,3,5,0,3,2,4,3,3,3,0,5,5,2,1,5,3],"values":[0.03627148392376908,0.03975494822557315,0.048614201601375,0.05051647121860891,0.062177057221676366,0.0643924405050839,0.10503916680389698,0.11190639780762268,0.1144277069281377,0.1812489008576452,0.19270457159152585,0.20137798976549193,0.20240806313569248,0.2110860383054799,0.2319337550496397,0.24900014191155076,0.2624553770328905,0.27949519433568176,0.2828277142642761,0.285239218530129,0.28701781664235615,0.290349689794137,0.2917803951386634,0.29570436556669655,0.2970307362603949,0.2975621827900926,0.3047080586413187,0.3047393194903387,0.30507724055157914,0.30678954649810697,0.3091320107544492,0.31932135764387454,0.31959299209623904,0.3273516849875717,0.32951038795537474,0.3319918056121789,0.38123377833602584,0.4080172974711452,0.41157419484404456,0.4572472261851589,0.4694641045601252,0.47161522236143855,0.47371018882743,0.48364922760199236,0.4860522523413229,0.528332439306568,0.5516093560061566,0.5568034730117551,0.6152138468510585,0.6249376221842325,0.6409441353997842,0.6511702749508801,0.6546792936934775,0.6576200351027022,0.6673845495729511,0.6823961963384828,0.6838666342581794,0.843032176141862,0.85463011232627,0.8555602802957292,0.8606317208324157,0.8650343438049196,0.8771418755662831,0.8814963563352672,0.885350193767445,0.886871599634548,0.8885682355785052,0.8928082065931733,0.906779559146704,0.9070879541906861,0.9203590382138487,0.9351178049718436],"negative_proteins":[1,5,0,4,4,4,1,3,5,5,3,5,5,4,2,3,2,5,5,1,3,3,5,3,4,3,5,2,4,3,1,4,0,1,2,1,4,1,3,3,2,2,5,4,5,0,1,3,5,0,1,5,1,2,4,0,3,4,5,3,5,4,0,5,0,4,4,0,2,0,5,4],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[6,9,0],[22,3,13],[25,19,1],[2,38,12],[36,4,5],[30,10,37],[16,14,27],[32,29,18],[15,7,20],[17,8,26],[33,24,42],[21,11,45],[41,40,34],[43,31,28],[46,55,23],[54,50,35],[39,56,47],[49,67,52],[48,51,44],[71,60,64],[65,57,68],[53,66,63],[69,58,70],[59,61,62]],"next_random":[4084156803,2698663129,197334371,3159382416,210791508,511618226,3666767290,166453244],"repair_calls":2},{"seed":22,"targets":[0.08002311765114112,0.08662255104424377,0.09397212539020505,0.24881905066086907,0.31237185302920534,0.36786468856251586,0.3772089598719719,0.38974497597888635,0.4738359806641427,0.4787690354350065,0.4823720807181765,0.5320456402893082,0.5552967602031578,0.5554001632322785,0.6002618243036382,0.6514451524989088,0.6893554225489635,0.7036425120535994,0.7221986055410214,0.7334903472037941,0.7357900657326534,0.7408466962751425,0.8664706819293384,0.8955427549080812],"proteins":[2,3,2,4,2,2,1,0,0,3,5,2,0,2,3,4,1,1,3,1,5,4,4,3],"values":[0.07000701115346551,0.07588405146868712,0.07950493278582701,0.08756194194714659,0.0895187668582933,0.09017676225519002,0.09220908984362856,0.0950851005616383,0.09854109693707203,0.2505269947895871,0.26619229865383814,0.2687395643452651,0.2939984413293644,0.3156366531725881,0.32034746603917486,0.3499740914091264,0.35183915659911663,0.35755083717845115,0.36194019990331183,0.38250354923976015,0.39024355384443177,0.39074989222826434,0.39909697045036285,0.40578976491331487,0.4554098997928008,0.4610664064509924,0.4698480330217225,0.47016642566916145,0.4764014699467208,0.47885325487678376,0.49040427830759253,0.4913871811852062,0.4963900640345061,0.5255106977254236,0.5353140791866774,0.5374584417075249,0.541705363875861,0.55123288897576,0.5557944551137957,0.5588842139527443,0.5611160145527788,0.5688548655939852,0.6005600706608482,0.6116386618845431,0.6201084614689949,0.6338047937500043,0.661445299600158,0.6689080798451232,0.6910546080372949,0.6937587321090269,0.6944519200338221,0.6966520604829054,0.7024550492222599,0.7083618275528258,0.714917205397668,0.7169832539609879,0.7203058354590773,0.7295563358912155,0.7311172459443707,0.7315850493016656,0.7460411833006709,0.7474449670896436,0.7484101834757905,0.7492436317228686,0.7496533271590108,0.7513073377817148,0.8508451208032897,0.8622644335824521,0.8792580799300436,0.9016030515590503,0.9058633496682233,0.9099696034437555],"negative_proteins":[4,4,1,4,0,4,3,3,2,2,2,1,5,0,5,3,5,5,4,3,3,3,3,1,2,2,2,3,1,0,2,4,3,5,0,2,5,3,5,2,5,5,5,0,3,4,1,4,3,1,1,3,4,0,5,5,0,2,3,3,2,2,1,1,2,4,5,2,3,3,0,2],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[8,9,10],[7,6,0],[4,5,2],[1,18,3],[26,24,32],[16,41,25],[23,11,28],[12,21,34],[13,29,53],[37,27,22],[36,14,33],[30,19,35],[15,43,56],[64,39,57],[17,20,44],[61,52,31],[50,63,48],[46,62,54],[51,69,68],[67,38,49],[66,40,42],[60,59,45],[55,47,65],[70,71,58]],"next_random":[3537255873,3471826744,1516221455,2144763728,819266110,1043784473,2472041399,1035648433],"repair_calls":1},{"seed":23,"targets":[0.0159341009756111,0.03644056451575772,0.05161656933078962,0.06490289727276388,0.09023744277316459,0.1945249093530499,0.20365005917160095,0.31184615394369686,0.33092359558133055,0.3968155008812798,0.4098148598621605,0.44303183258650247,0.4996285334805255,0.5253326261430883,0.6015200037622813,0.6481484670874691,0.6684397217178002,0.6753856459937088,0.6985062494470636,0.7780371138707344,0.8489308434132335,0.8867374785107758,0.9180025736194027,0.968017018215578],"proteins":[0,4,2,0,5,5,1,2,1,0,4,2,5,0,1,3,0,0,2,0,4,2,3,2],"values":[0.005348702957364008,0.013385306764123505,0.03326035726890973,0.036202379534901824,0.03642946421517254,0.039120591995924395,0.04366921955179766,0.04754898663152402,0.04885434189624442,0.05115663990689372,0.07432900062445047,0.07896931481118298,0.08189538831354297,0.10138055203305095,0.10940204044609789,0.1752286311997601,0.17760534423101387,0.18459593428614118,0.18776259637708365,0.204712133698832,0.2145626551211858,0.3054385111028638,0.30879438179981533,0.3134399788638031,0.3177271601150634,0.3213309059988356,0.33016187068551106,0.39044414544314476,0.39059673129871064,0.39220583516253876,0.40537167238867855,0.41031254522314375,0.4185881105397467,0.4408797058971581,0.44565318212552485,0.459426261187197,0.4877949976183927,0.49214636206474516,0.5170569532445637,0.5177122747101657,0.5198322867571505,0.5334172115894013,0.5836877823099303,0.597235147742434,0.6062662949817085,0.6390991347223671,0.6533096889998455,0.6552610009757714,0.6590951887554806,0.6655810760389951,0.6732514723506698,0.6822679629067158,0.6928313331716432,0.6952997854188153,0.696684736853235,0.7060343137509535,0.71560996919658,0.7681620883166838,0.7694808296810299,0.7865490044790826,0.840137643679349,0.8664792170403912,0.8683071396794028,0.8896488014983089,0.8995187472082183,0.9026457744726374,0.9037448642157567,0.9244894815620004,0.9292051947701436,0.9629483402147526,0.9668880295593331,0.9769399135284405],"negative_proteins":[1,2,4,5,0,4,3,5,3,0,0,0,2,5,4,3,3,5,3,1,5,1,3,1,4,3,0,2,2,2,4,0,5,3,3,2,2,5,3,1,0,3,1,5,0,3,5,0,4,4,5,0,0,0,1,0,4,3,2,3,5,0,2,1,5,1,1,3,4,0,0,2],"count":3,"caliper":0.25,"protein_caliper":0.2,"expected":[[10,4,9],[14,6,15],[12,1,18],[2,11,5],[20,13,3],[17,7,25],[21,8,0],[35,28,29],[19,16,23],[26,31,40],[30,24,33],[36,49,27],[32,37,46],[55,22,39],[54,50,42],[45,38,43],[61,51,34],[53,44,47],[68,58,41],[52,70,69],[65,48,56],[64,62,60],[63,67,57],[59,66,71]],"next_random":[377798774,3069322748,2286840078,2593604606,325649675,471419633,2948412797,3002152723],"repair_calls":1}]} mhcflurry-2.3.6/test/data/selected-peptides.csv000066400000000000000000000365411525677230600215730ustar00rootroot00000000000000,gene,rnav8_len,k,start_1based,end_1based,peptide,is_mut,is_ref,is_linker,is_leader,is_mitd,is_chimeric,is_CTA,mhcflurry_peptide,mhcflurry_peptide_num,mhcflurry_sample_name,mhcflurry_affinity,mhcflurry_best_allele,mhcflurry_processing_score,mhcflurry_presentation_score,mhcflurry_presentation_percentile,netmhcpan_best_allele_by_pr,netmhcpan_pr,netmhcpan_aff 18,ABI3BP,25,9,1,9,IPPKTSRTL,False,True,False,False,False,False,False,IPPKTSRTL,18,sample1,76.63097212525604,C*01:02,0.4595130290836096,0.8500543950692536,0.1993750000000034,HLA-C*01:02,0.158,445.76 25,ABI3BP,25,9,8,16,TLEQPMATL,True,False,False,False,False,False,False,TLEQPMATL,25,sample1,59.405680603234636,C*01:02,0.0902106249704957,0.6627795863965235,0.5019293478260352,HLA-C*01:02,0.864,3313.63 33,ABI3BP,25,9,16,24,LAPSETPFV,False,True,False,False,False,False,False,LAPSETPFV,33,sample1,87.78069923706266,C*01:02,0.06101071718148887,0.548132005488575,0.7210054347824979,HLA-C*01:02,0.124,346.21 41,ABI3BP,25,10,7,16,RTLEQPMATL,True,False,False,False,False,False,False,RTLEQPMATL,41,sample1,342.70824393676776,C*01:02,0.6008451171219349,0.6857038580738146,0.46138586956517713,HLA-C*01:02,1.876,7023.27 82,BMP1,25,8,17,24,YRSRLCWY,False,True,False,False,False,False,False,YRSRLCWY,82,sample1,2061.1929952131527,C*07:01,0.009316287454566918,0.04497807155051911,5.671874999999957,HLA-C*07:01,0.499,1556.12 84,BMP1,25,9,1,9,VTPGEKIIL,False,True,False,False,False,False,False,VTPGEKIIL,84,sample1,32.455146232051455,C*01:02,0.07126966048963368,0.7677951702843354,0.3283152173912782,HLA-C*01:02,0.107,283.16 89,BMP1,25,9,6,14,KIILNFTTL,True,False,False,False,False,False,False,KIILNFTTL,89,sample1,62.82330105310425,C*01:02,0.24402968399226665,0.762349438982255,0.3385597826086837,HLA-C*01:02,0.437,1648.2 108,BMP1,25,10,8,17,ILNFTTLDLY,True,False,False,False,False,False,False,ILNFTTLDLY,108,sample1,397.25588353695406,A*01:01,0.0590585444442695,0.2175041276152879,1.731739130434704,HLA-A*01:01,0.139,185.87 138,CDC40,25,8,7,14,LSPNGKSL,True,False,False,False,False,False,False,LSPNGKSL,138,sample1,37.06839713891176,C*01:02,0.3020476885139942,0.867992830469506,0.17184782608696025,HLA-C*01:02,0.106,281.61 155,CDC40,25,9,6,14,TLSPNGKSL,True,False,False,False,False,False,False,TLSPNGKSL,155,sample1,30.381092671526748,C*01:02,0.118210882646963,0.8062982348254204,0.2683967391303952,HLA-C*01:02,0.31,1129.8 223,MAP2,46,8,26,33,VVPFTKAL,True,False,False,False,False,False,False,VVPFTKAL,223,sample1,106.3602561235778,C*01:02,0.17740425933152437,0.6031125399380882,0.6095380434781958,HLA-C*01:02,0.102,267.69 224,MAP2,46,8,27,34,VPFTKALM,True,False,False,False,False,False,False,VPFTKALM,224,sample1,152.8754085041204,B*08:01,0.42134576104581356,0.7169026364612648,0.4095652173913038,HLA-B*08:01,2.026,1969.94 255,MAP2,46,9,19,27,VRIYQGRVV,True,False,False,False,False,False,False,VRIYQGRVV,255,sample1,142.73052529543338,C*07:01,0.4826787058264017,0.7708029911722674,0.32350543478260363,HLA-C*07:01,0.18,558.28 257,MAP2,46,9,21,29,IYQGRVVPF,True,False,False,False,False,False,False,IYQGRVVPF,257,sample1,137.68788910889734,C*07:01,0.7557790763676167,0.9015044767998036,0.11961956521740547,HLA-C*07:01,0.856,2492.27 260,MAP2,46,9,24,32,GRVVPFTKA,True,False,False,False,False,False,False,GRVVPFTKA,260,sample1,131.33533925153966,B*27:05,0.46765692345798016,0.7756550111986702,0.3167663043477944,HLA-B*27:05,2.503,1572.45 261,MAP2,46,9,25,33,RVVPFTKAL,True,False,False,False,False,False,False,RVVPFTKAL,261,sample1,53.399215987370674,C*01:02,0.5948334485292435,0.9285526860313993,0.07940217391303861,HLA-C*01:02,0.272,955.25 262,MAP2,46,9,26,34,VVPFTKALM,True,False,False,False,False,False,False,VVPFTKALM,262,sample1,70.3866518862408,C*01:02,0.08792760979849845,0.6231343104279621,0.5722554347825621,HLA-C*01:02,0.087,206.1 263,MAP2,46,9,27,35,VPFTKALMI,True,False,False,False,False,False,False,VPFTKALMI,263,sample1,89.80587587212494,B*08:01,0.7832967713475227,0.9385730624865474,0.0643206521739188,HLA-B*08:01,1.4,1323.8 268,MAP2,46,9,32,40,ALMIKFEEI,True,False,False,False,False,False,False,ALMIKFEEI,268,sample1,158.95257022421424,B*08:01,0.661398708820343,0.8507660148330426,0.1993750000000034,HLA-B*08:01,0.262,181.28 294,MAP2,46,10,20,29,RIYQGRVVPF,True,False,False,False,False,False,False,RIYQGRVVPF,294,sample1,407.29741110701156,C*01:02,0.7349352389574051,0.7477825234902032,0.36095108695650424,HLA-B*08:01,0.999,879.81 355,PIP5K1A,28,8,8,15,APVATPAL,True,False,False,False,False,False,False,APVATPAL,355,sample1,1177.232444282441,C*01:02,0.305454570800066,0.18790045504598077,1.9201630434781833,HLA-C*01:02,0.439,1656.38 362,PIP5K1A,28,8,15,22,LLTSHRSL,True,False,False,False,False,False,False,LLTSHRSL,362,sample1,1231.6157879369582,B*08:01,0.0777759711490944,0.09004104244184576,3.1588586956520857,HLA-B*08:01,0.377,275.73 375,PIP5K1A,28,9,7,15,AAPVATPAL,True,False,False,False,False,False,False,AAPVATPAL,375,sample1,22.01541646935366,C*01:02,0.7341283150017262,0.9805101777868475,0.007255434782621251,HLA-C*01:02,0.007,11.59 394,PIP5K1A,28,10,6,15,RAAPVATPAL,True,False,False,False,False,False,False,RAAPVATPAL,394,sample1,49.96962487883811,C*01:02,0.24621670693159103,0.8014998310015791,0.27603260869564394,HLA-C*01:02,0.069,151.89 395,PIP5K1A,28,10,7,16,AAPVATPALL,True,False,False,False,False,False,False,AAPVATPALL,395,sample1,33.21428884149478,C*01:02,0.397992642596364,0.9112854698647911,0.10394021739132597,HLA-C*01:02,0.068,149.04 412,PIP5K1A,28,11,5,15,RRAAPVATPAL,True,False,False,False,False,False,False,RRAAPVATPAL,412,sample1,59.01946907449498,C*07:01,0.1422674390487373,0.7039596136958644,0.4310869565217246,HLA-C*01:02,0.212,689.74 454,SMC5,25,9,11,19,RQKRIGNTR,True,False,False,False,False,False,False,RQKRIGNTR,454,sample1,121.07188531463042,B*27:05,0.15974517143331468,0.5572798494670976,0.7013858695651152,HLA-B*27:05,1.4,599.19 456,SMC5,25,9,13,21,KRIGNTRKM,True,False,False,False,False,False,False,KRIGNTRKM,456,sample1,36.80007240208899,C*07:01,0.06430770861334167,0.7406268657670435,0.37358695652172,HLA-C*07:01,0.066,195.03 516,SPG11,25,9,7,15,LIDDQDVSI,True,False,False,False,False,False,False,LIDDQDVSI,516,sample1,125.86779456002365,C*01:02,0.3316497001796961,0.6901060990474238,0.4548369565217172,HLA-A*01:01,2.355,7932.71 526,SPG11,25,9,17,25,LLSLRILSF,False,True,False,False,False,False,False,LLSLRILSF,526,sample1,77.4165613453536,B*08:01,0.4522215351462364,0.8454462000328207,0.20706521739127481,HLA-B*08:01,0.09,58.22 532,SPG11,25,10,6,15,KLIDDQDVSI,True,False,False,False,False,False,False,KLIDDQDVSI,532,sample1,239.8657978219368,C*01:02,0.7258778959512711,0.8276511400361685,0.23519021739130608,HLA-C*01:02,9.911,22746.92 542,SPG11,25,10,16,25,SLLSLRILSF,False,True,False,False,False,False,False,SLLSLRILSF,542,sample1,627.5234729046349,B*27:05,0.31914879381656647,0.309140415987372,1.3343749999999233,HLA-B*08:01,0.333,237.23 660,TECPR1,83,9,27,35,EVPGPSWSL,True,False,False,False,False,False,False,EVPGPSWSL,660,sample1,59.34389753447961,C*01:02,0.46677792351692915,0.8817450760131815,0.1514402173913254,HLA-C*01:02,0.268,935.86 678,TECPR1,83,9,45,53,SRWESAWSG,True,False,False,False,False,False,False,SRWESAWSG,678,sample1,340.03976756247806,B*27:05,0.1498977376613766,0.3083579983400033,1.3343749999999233,HLA-B*27:05,0.443,136.67 703,TECPR1,83,9,70,78,TIPAAPVGL,True,False,False,False,False,False,False,TIPAAPVGL,703,sample1,26.28428712804486,C*01:02,0.3070325553417206,0.9033408626298494,0.11682065217391369,HLA-C*01:02,0.041,83.92 706,TECPR1,83,9,73,81,AAPVGLRWL,True,False,False,False,False,False,False,AAPVGLRWL,706,sample1,38.28177943121105,C*01:02,0.15587826329283416,0.7916457568902094,0.2912499999999625,HLA-C*01:02,0.081,193.21 734,TECPR1,83,10,26,35,KEVPGPSWSL,True,False,False,False,False,False,False,KEVPGPSWSL,734,sample1,2248.742127250853,B*27:05,0.4546149540692568,0.17298381313137473,2.027690217391225,HLA-C*01:02,0.373,1381.6 753,TECPR1,83,10,45,54,SRWESAWSGL,True,False,False,False,False,False,False,SRWESAWSGL,753,sample1,63.243425369373774,C*07:01,0.19101055013015866,0.7254265272158179,0.3973641304347808,HLA-B*27:05,0.01,11.57 777,TECPR1,83,10,69,78,LTIPAAPVGL,True,False,False,False,False,False,False,LTIPAAPVGL,777,sample1,111.42488810790788,C*01:02,0.2800327483564615,0.6762032728784696,0.4788586956521357,HLA-C*01:02,0.367,1356.26 868,VPS72,25,8,13,20,RALLPLEL,True,False,False,False,False,False,False,RALLPLEL,868,sample1,170.84081118912832,C*01:02,0.38518839702010155,0.6666992275701744,0.49510869565216353,HLA-C*07:01,4.065,9095.19 885,VPS72,25,9,12,20,ERALLPLEL,True,False,False,False,False,False,False,ERALLPLEL,885,sample1,47.50778208829167,C*07:01,0.2833710527047515,0.8286693910953119,0.23345108695652073,HLA-C*07:01,0.188,590.32 933,WWC1,24,8,12,19,MGHLQHEL,True,False,False,False,False,False,False,MGHLQHEL,933,sample1,115.99551643229341,C*01:02,0.3307158090174198,0.7061279167746464,0.42766304347823336,HLA-B*08:01,0.717,594.01 951,WWC1,24,9,13,21,GHLQHELQF,True,False,False,False,False,False,False,GHLQHELQF,951,sample1,113.42506890264815,C*07:01,0.259261479601264,0.6560192228648354,0.5143749999999585,HLA-C*07:01,4.486,9796.8 1002,MAGEA10p1,25,9,1,9,SSPSVVASL,False,True,False,False,False,False,True,SSPSVVASL,1002,sample1,21.110055920581388,C*01:02,0.16465385956689715,0.8748015269207916,0.16249999999999432,HLA-C*01:02,0.008,12.33 1019,MAGEA10p1,25,10,1,10,SSPSVVASLP,False,True,False,False,False,False,True,SSPSVVASLP,1019,sample1,13090.572570329334,C*01:02,0.008235680041252635,0.007728873015256679,31.643179347826077,HLA-C*01:02,0.494,1899.73 1035,MAGEA10p1,25,11,1,11,SSPSVVASLPL,False,True,False,False,False,False,True,SSPSVVASLPL,1035,sample1,418.57842279669956,C*01:02,0.02461180041427724,0.18955046992904015,1.905543478260796,HLA-C*01:02,0.121,334.2 1051,MAGEA10p2,25,8,2,9,VTDLVQFL,False,True,False,False,False,False,True,VTDLVQFL,1051,sample1,218.4621970498831,A*01:01,0.7729858718812466,0.8613483409926228,0.1821467391304452,HLA-A*01:01,0.941,2721.01 1057,MAGEA10p2,25,8,8,15,FLLFKYQM,False,True,False,False,False,False,True,FLLFKYQM,1057,sample1,410.1786929319161,B*08:01,0.13465335359796882,0.2603978337209331,1.5202989130434048,HLA-B*08:01,0.128,87.63 1068,MAGEA10p2,25,9,1,9,KVTDLVQFL,False,True,False,False,False,False,True,KVTDLVQFL,1068,sample1,81.34874039241913,C*01:02,0.8616118803620338,0.9568792538563173,0.038315217391314604,HLA-C*07:01,0.45,1412.77 1069,MAGEA10p2,25,9,2,10,VTDLVQFLL,False,True,False,False,False,False,True,VTDLVQFLL,1069,sample1,108.78437810075624,A*01:01,0.4036145284771919,0.7679767844030344,0.3283152173912782,HLA-A*01:01,0.126,168.04 1080,MAGEA10p2,25,9,13,21,YQMKEPITK,False,True,False,False,False,False,True,YQMKEPITK,1080,sample1,86.88238876593987,B*27:05,0.5966939721256495,0.8907509152335247,0.13692934782609711,HLA-B*27:05,2.747,1821.31 1084,MAGEA10p2,25,9,17,25,EPITKAEIL,False,True,False,False,False,False,True,EPITKAEIL,1084,sample1,88.03372181871534,B*08:01,0.29368303483352065,0.7337152898998892,0.38508152173912436,HLA-B*08:01,1.689,1621.96 1086,MAGEA10p2,25,10,2,11,VTDLVQFLLF,False,True,False,False,False,False,True,VTDLVQFLLF,1086,sample1,105.83716241662344,A*01:01,0.5764349922537804,0.8623637058673023,0.1807065217391255,HLA-A*01:01,0.08,91.16 1205,MAGEC1p1,25,9,6,14,MPTAGMPSL,False,True,False,False,False,False,True,MPTAGMPSL,1205,sample1,77.11967414544304,B*08:01,0.8355902284383774,0.9551892991765902,0.03964673913044692,HLA-C*01:02,2.124,7816.58 1221,MAGEC1p1,25,10,5,14,DMPTAGMPSL,False,True,False,False,False,False,True,DMPTAGMPSL,1221,sample1,119.73642462637594,C*01:02,0.30586328147910535,0.6808950908421842,0.4698369565216751,HLA-C*01:02,0.584,2261.99 1282,MAGEC1p2,25,9,17,25,SSPEGKDSL,False,True,False,False,False,False,True,SSPEGKDSL,1282,sample1,26.62843195242034,C*01:02,0.23959087580442429,0.8790703829859254,0.15467391304348155,HLA-C*01:02,0.036,74.21 1314,MAGEC1p3,25,8,1,8,FAQSPLQI,False,True,False,False,False,False,True,FAQSPLQI,1314,sample1,162.1616093286923,C*01:02,0.4001904344186187,0.6893362454365073,0.4563315217391022,HLA-C*01:02,4.517,14042.74 1324,MAGEC1p3,25,8,11,18,SPSSSSTL,False,True,False,False,False,False,True,SPSSSSTL,1324,sample1,2396.182609115678,C*01:02,0.10404993500560522,0.05382663961091608,4.807092391304323,HLA-C*01:02,0.264,916.83 1341,MAGEC1p3,25,9,10,18,VSPSSSSTL,False,True,False,False,False,False,True,VSPSSSSTL,1341,sample1,26.7171004845041,C*01:02,0.2750385506078601,0.8914700477888546,0.13535326086957866,HLA-C*01:02,0.007,9.22 1344,MAGEC1p3,25,9,13,21,SSSSTLLSL,False,True,False,False,False,False,True,SSSSTLLSL,1344,sample1,43.6080517726507,C*01:02,0.05253881262615323,0.6990356519876642,0.4397010869565037,HLA-C*01:02,0.352,1290.55 1357,MAGEC1p3,25,10,9,18,PVSPSSSSTL,False,True,False,False,False,False,True,PVSPSSSSTL,1357,sample1,270.5527050478048,C*01:02,0.005632098502246663,0.25045437521980246,1.5659510869564457,HLA-C*01:02,0.189,581.05 1358,MAGEC1p3,25,10,10,19,VSPSSSSTLL,False,True,False,False,False,False,True,VSPSSSSTLL,1358,sample1,46.67597607663383,C*01:02,0.06457851023878902,0.6940808873475162,0.4474999999999767,HLA-C*01:02,0.052,107.3 1372,MAGEC1p3,25,11,8,18,IPVSPSSSSTL,False,True,False,False,False,False,True,IPVSPSSSSTL,1372,sample1,224.04407533977502,B*08:01,0.14942678052466363,0.4003023274794277,1.0576086956520356,HLA-C*01:02,0.102,266.27 1395,PAGE2,25,8,16,23,TFDLTKVL,False,True,False,False,False,False,True,TFDLTKVL,1395,sample1,192.2698234992499,C*01:02,0.4834165219217539,0.7162742705527396,0.4113315217391147,HLA-C*01:02,6.084,17134.66 1406,PAGE2,25,9,9,17,VREGIMPTF,False,True,False,False,False,False,True,VREGIMPTF,1406,sample1,52.82333005903476,C*07:01,0.09807718684896827,0.6937290619275586,0.4474999999999767,HLA-C*07:01,0.277,878.36 1427,PAGE2,25,10,13,22,IMPTFDLTKV,False,True,False,False,False,False,True,IMPTFDLTKV,1427,sample1,482.5819436701458,C*01:02,0.3368768533691764,0.3807632213974432,1.1085597826085376,HLA-C*01:02,0.407,1532.39 1443,PAGE2,25,11,13,23,IMPTFDLTKVL,False,True,False,False,False,False,True,IMPTFDLTKVL,1443,sample1,1917.037898539047,C*01:02,0.15068084315862507,0.07691883261218202,3.5626902173912214,HLA-C*01:02,0.196,620.72 1465,PAGE5,24,9,3,11,VREGTLPTF,False,True,False,False,False,False,True,VREGTLPTF,1465,sample1,52.2543355162559,C*07:01,0.05408053379505873,0.6620549703835366,0.5038043478260334,HLA-C*07:01,0.411,1309.76 1485,PAGE5,24,10,7,16,TLPTFDPTKV,False,True,False,False,False,False,True,TLPTFDPTKV,1485,sample1,220.1699502138865,C*01:02,0.4927303232252598,0.6958028106023945,0.44383152173911355,HLA-C*01:02,1.026,3936.55 1500,PAGE5,24,11,7,17,TLPTFDPTKVL,False,True,False,False,False,False,True,TLPTFDPTKVL,1500,sample1,213.15764776188504,C*01:02,0.19725923147052526,0.45348878030270307,0.9252717391303236,HLA-C*01:02,0.22,721.1 1530,XAGE1Ap1,25,9,5,13,QLKVGILHL,False,True,False,False,False,False,True,QLKVGILHL,1530,sample1,77.25077298009815,B*08:01,0.17316756071522832,0.671301090626941,0.4883152173912748,HLA-B*08:01,0.792,665.99 1541,XAGE1Ap1,25,9,16,24,RQKKIRIQL,False,True,False,False,False,False,True,RQKKIRIQL,1541,sample1,49.26971587709329,C*07:01,0.6224369034171104,0.9393752719126912,0.06312499999999943,HLA-B*08:01,1.2,1118.37 1558,XAGE1Ap1,25,10,16,25,RQKKIRIQLR,False,True,False,False,False,False,True,RQKKIRIQLR,1558,sample1,211.91169822956056,B*27:05,0.6150255762040615,0.7853669958109232,0.3009239130434338,HLA-B*27:05,1.751,863.35 1592,XAGE1Ap2,25,9,1,9,ISQTPGINL,False,True,False,False,False,False,True,ISQTPGINL,1592,sample1,48.26454439433474,C*01:02,0.26859587989747524,0.8188534498605134,0.24815217391304145,HLA-C*01:02,0.613,2378.74 1594,XAGE1Ap2,25,9,3,11,QTPGINLDL,False,True,False,False,False,False,True,QTPGINLDL,1594,sample1,72.94023535305432,C*01:02,0.19312988221645355,0.698565580401679,0.4409239130434628,HLA-C*01:02,0.201,648.84 mhcflurry-2.3.6/test/data/torch_baseline_predictions.json000066400000000000000000000027671525677230600237350ustar00rootroot00000000000000{ "peptides": [ "SIINFEKL", "LLFGYPVYV", "GILGFVFTL", "NLVPMVATV", "KLGGALQAK", "AAAWYLWEV", "SLYNTVATLY", "RAKFKQLL" ], "alleles": [ "HLA-A*02:01", "HLA-B*07:02" ], "n_flanks": [ "AAGK", "QWER", "MNVP", "GGGG", "RKRK", "TTTT", "YYYY", "LLLL" ], "c_flanks": [ "GGTM", "PLKD", "SSSS", "AAAA", "MMMM", "VVVV", "QQQQ", "RRRR" ], "affinity_allele_specific": { "HLA-A*02:01": [ 4571.98354961, 5.35128948, 30.93136646, 181.95671634, 8245.85061199, 28.37918116, 630.94935445, 21399.57059625 ], "HLA-B*07:02": [ 16704.05848721, 21981.0941133, 14330.46273507, 15891.18939632, 19294.36050175, 7458.32570347, 21968.81819324, 3198.58685814 ] }, "affinity_pan": { "HLA-A*02:01": [ 11927.15634551, 10.12754554, 19.95512691, 16.5709662, 6167.33484003, 18.88690048, 1351.83181977, 28767.275539 ], "HLA-B*07:02": [ 29061.95564042, 22434.24465034, 19620.19011293, 20404.34935181, 24842.76256414, 22004.5496814, 29535.17831144, 3551.12976287 ] }, "processing_with_flanks": [ 0.91958499, 0.9725005, 0.3213616, 0.71226603, 0.57858998, 0.73405558, 0.87977874, 0.80612707 ], "processing_no_flanks": [ 0.26470965, 0.95577502, 0.21353348, 0.53300786, 0.05477003, 0.35591495, 0.31072277, 0.14174996 ], "presentation_score": [ 0.18712367, 0.99638058, 0.92283482, 0.98446251, 0.1068614, 0.98376657, 0.62244677, 0.32727786 ] }mhcflurry-2.3.6/test/expensive_verify_pretrain_optimizable.py000066400000000000000000000100531525677230600247770ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Expensive test - not run by pytest. from mhcflurry import train_pan_allele_models_command from mhcflurry.downloads import get_path from mhcflurry.allele_encoding import AlleleEncoding from mhcflurry.pseudosequences import LEGACY_ALLELE_SEQUENCES_FILENAME import pandas import numpy PRETRAIN_DATA_PATH = get_path( "random_peptide_predictions", "predictions.csv.bz2") FULL_TRAIN_DF = pandas.read_csv( get_path( "data_curated", "curated_training_data.no_mass_spec.csv.bz2")) TRAIN_DF = FULL_TRAIN_DF.loc[ (FULL_TRAIN_DF.peptide.str.len() >= 8) & (FULL_TRAIN_DF.peptide.str.len() <= 15) ] ALLELE_SEQUENCES = pandas.read_csv( get_path("allele_sequences", LEGACY_ALLELE_SEQUENCES_FILENAME), index_col=0).sequence ALLELE_SEQUENCES = ALLELE_SEQUENCES.loc[ ALLELE_SEQUENCES.index.isin(TRAIN_DF.allele) ] TRAIN_DF = TRAIN_DF.loc[ TRAIN_DF.allele.isin(ALLELE_SEQUENCES.index) ] FOLDS_DF = pandas.DataFrame(index=TRAIN_DF.index) FOLDS_DF["fold_0"] = True HYPERPARAMTERS = { 'activation': 'tanh', 'allele_dense_layer_sizes': [], 'batch_normalization': False, 'dense_layer_l1_regularization': 0.0, 'dense_layer_l2_regularization': 0.0, 'dropout_probability': 0.5, 'early_stopping': True, 'init': 'glorot_uniform', 'layer_sizes': [1024, 512], 'learning_rate': None, 'locally_connected_layers': [], 'loss': 'custom:mse_with_inequalities', 'max_epochs': 0, 'min_delta': 0.0, 'minibatch_size': 128, 'optimizer': 'rmsprop', 'output_activation': 'sigmoid', 'patience': 20, 'peptide_allele_merge_activation': '', 'peptide_allele_merge_method': 'concatenate', 'peptide_amino_acid_encoding': 'BLOSUM62', 'peptide_dense_layer_sizes': [], 'peptide_encoding': {'alignment_method': 'left_pad_centered_right_pad', 'max_length': 15, 'vector_encoding_name': 'BLOSUM62'}, 'random_negative_affinity_max': 50000.0, 'random_negative_affinity_min': 20000.0, 'random_negative_constant': 25, 'random_negative_distribution_smoothing': 0.0, 'random_negative_match_distribution': True, 'random_negative_rate': 0.2, 'train_data': {'pretrain': True, 'pretrain_max_epochs': 30, 'pretrain_min_epochs': 5, 'pretrain_patience': 3, 'pretrain_peptides_per_step': 8, 'pretrain_steps_per_epoch': 256}, 'validation_split': 0.1, 'data_dependent_initialization_method': "lsuv", } def verify_optimizable(): predictor = train_pan_allele_models_command.train_model( work_item_name="work-item0", work_item_num=0, num_work_items=1, architecture_num=0, num_architectures=1, fold_num=0, num_folds=1, replicate_num=0, num_replicates=1, hyperparameters=HYPERPARAMTERS, pretrain_data_filename=PRETRAIN_DATA_PATH, verbose=1, progress_print_interval=5.0, predictor=None, save_to=None, constant_data={ 'train_data': TRAIN_DF, 'folds_df': FOLDS_DF, 'allele_encoding': AlleleEncoding( alleles=ALLELE_SEQUENCES.index.values, allele_to_sequence=ALLELE_SEQUENCES.to_dict()), }, ) (network,) = predictor.neural_networks print(predictor, network) print(network.fit_info) pretrain_val_loss = network.fit_info[0]["val_loss"][-1] print(pretrain_val_loss) numpy.testing.assert_array_less(pretrain_val_loss, 0.1) if __name__ == "__main__": verify_optimizable() mhcflurry-2.3.6/test/pytest_helpers.py000066400000000000000000000055451525677230600201660ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Test helper functions providing assertion utilities. """ import sys _MHCFLURRY_COMMANDS = { "mhcflurry-calibrate-percentile-ranks": "mhcflurry.cli.calibrate_percentile_ranks_command", "mhcflurry-class1-train-allele-specific-models": "mhcflurry.cli.train_allele_specific_models_command", "mhcflurry-class1-select-allele-specific-models": "mhcflurry.cli.select_allele_specific_models_command", "mhcflurry-class1-train-pan-allele-models": "mhcflurry.cli.train_pan_allele_models_command", "mhcflurry-class1-select-pan-allele-models": "mhcflurry.cli.select_pan_allele_models_command", "mhcflurry-class1-train-processing-models": "mhcflurry.cli.train_processing_models_command", "mhcflurry-class1-select-processing-models": "mhcflurry.cli.select_processing_models_command", } def mhcflurry_cli(command): """ Return argv prefix to run a mhcflurry command using the current interpreter. This avoids picking up a system-installed mhcflurry that may rely on TensorFlow. """ module = _MHCFLURRY_COMMANDS.get(command) if module is None: raise ValueError(f"Unknown mhcflurry command: {command}") return [sys.executable, "-c", f"from {module} import run; run()"] def eq_(a, b, msg=None): """Assert that a equals b.""" if msg: assert a == b, msg else: assert a == b, f"{a!r} != {b!r}" def assert_less(a, b, msg=None): """Assert that a < b.""" if msg: assert a < b, msg else: assert a < b, f"{a!r} is not less than {b!r}" def assert_greater(a, b, msg=None): """Assert that a > b.""" if msg: assert a > b, msg else: assert a > b, f"{a!r} is not greater than {b!r}" def assert_almost_equal(a, b, places=7, msg=None): """Assert that a and b are equal up to `places` decimal places.""" diff = abs(a - b) threshold = 10 ** (-places) if msg: assert diff < threshold, msg else: assert diff < threshold, ( f"{a!r} != {b!r} within {places} places (diff={diff})" ) def assert_raises(exc_class, func=None, *args, **kwargs): """ Assert that calling func raises exc_class. Can also be used as a context manager. """ import pytest if func is None: return pytest.raises(exc_class) with pytest.raises(exc_class): func(*args, **kwargs) mhcflurry-2.3.6/test/test_affinity_candidate_figures.py000066400000000000000000000253061525677230600235010ustar00rootroot00000000000000"""Tests for common-cohort affinity candidate figure inputs.""" import json import numpy import pandas import pytest from mhcflurry.cli import affinity_candidate_figures from mhcflurry.cli import merge_external_predictions from mhcflurry.cli import paper_figures def _write_comparison(root, condition, baseline, identity, offset): if condition == baseline: comparison = root / "baseline-vs-public-no-additional-ms" else: comparison = ( root / condition / "comparison-vs-public-no-additional-ms") affinity = comparison / "affinity" affinity.mkdir(parents=True) rows = 40 hit = numpy.arange(rows) % 2 public_score = numpy.where(hit, 0.8, 0.2) frame = pandas.DataFrame({ "source_file": "benchmark.csv", "protein_accession": "P12345", "sample_id": "sample-1", "hla": "HLA-A*02:01", "peptide": ["PEPTIDE%02d" % index for index in range(rows)], "n_flank": "NNNNN", "c_flank": "CCCCC", "hit": hit, "peptide_len": 9, "a_score": public_score + offset, "b_score": public_score, "netmhcpan4.ba": numpy.where(hit, 50.0, 5000.0), "netmhcpan4.el": numpy.where(hit, 0.9, 0.1), }) frame.to_csv(affinity / "predictions.csv.bz2", index=False) (affinity / "summary.json").write_text(json.dumps({ "n_rows": rows, "n_hits": int(hit.sum()), "benchmark_identity": identity, })) def test_candidate_figure_inputs_include_public_and_external_predictions( tmp_path): factorial = tmp_path / "factorial" factorial.mkdir() baseline = "keras_128" candidate = "native_1024" (factorial / "manifest.json").write_text(json.dumps({ "baseline_condition": baseline, "records": [ {"condition": baseline}, {"condition": candidate}, ], })) identity = { "algorithm": "test", "columns": ["source_file", "hla", "peptide", "hit"], "ordered_rows": True, "row_count": 40, "sha256": "a" * 64, } _write_comparison(factorial, baseline, baseline, identity, 0.01) _write_comparison(factorial, candidate, baseline, identity, 0.02) out = tmp_path / "figures" provenance = affinity_candidate_figures.build_candidate_figure_inputs( factorial, out, [baseline, candidate], "public_2_2", ) predictions = pandas.read_csv(out / "benchmark.monoallelic.csv.bz2") assert { baseline, candidate, "public_2_2", "netmhcpan4.ba", "netmhcpan4.el", }.issubset(predictions.columns) numpy.testing.assert_allclose( predictions.public_2_2, numpy.where(predictions.hit, 0.8, 0.2), ) info = pandas.read_csv(out / "predictor_info.csv") assert set(info.predictor) == { baseline, candidate, "public_2_2", "netmhcpan4.ba", "netmhcpan4.el", } scores = pandas.read_csv(out / "accuracy_scores.monoallelic.csv") assert set(scores.predictor) == set(info.predictor) assert provenance["benchmark_identity"]["sha256"] == "a" * 64 assert provenance["external_predictors_included"] == [ "netmhcpan4.ba", "netmhcpan4.el"] def test_candidate_figure_inputs_reject_reordered_prediction_rows(tmp_path): factorial = tmp_path / "factorial" factorial.mkdir() baseline = "keras_128" candidate = "native_1024" (factorial / "manifest.json").write_text(json.dumps({ "baseline_condition": baseline, "records": [ {"condition": baseline}, {"condition": candidate}, ], })) identity = { "algorithm": "test", "columns": list(affinity_candidate_figures.IDENTITY_COLUMNS), "ordered_rows": True, "row_count": 40, "sha256": "c" * 64, } _write_comparison(factorial, baseline, baseline, identity, 0.01) _write_comparison(factorial, candidate, baseline, identity, 0.02) predictions_path = ( factorial / candidate / "comparison-vs-public-no-additional-ms" / "affinity" / "predictions.csv.bz2") predictions = pandas.read_csv(predictions_path) # Rows 0 and 2 have identical public scores and labels, so the previous # consistency checks could not detect this positional corruption. predictions.iloc[[0, 2]] = predictions.iloc[[2, 0]].to_numpy() predictions.to_csv(predictions_path, index=False) with pytest.raises(ValueError, match="row identity or order changed"): affinity_candidate_figures.build_candidate_figure_inputs( factorial, tmp_path / "figures", [baseline, candidate], "public_2_2", ) def test_candidate_figure_inputs_join_external_prediction_table(tmp_path): factorial = tmp_path / "factorial" factorial.mkdir() baseline = "keras_128" (factorial / "manifest.json").write_text(json.dumps({ "baseline_condition": baseline, "records": [{"condition": baseline}], })) identity = { "algorithm": "test", "columns": ["source_file", "hla", "peptide", "hit"], "ordered_rows": True, "row_count": 40, "sha256": "b" * 64, } _write_comparison(factorial, baseline, baseline, identity, 0.01) source = pandas.read_csv( factorial / "baseline-vs-public-no-additional-ms" / "affinity" / "predictions.csv.bz2") external = tmp_path / "external.csv.bz2" source[[ "protein_accession", "sample_id", "hla", "peptide", "n_flank", "c_flank", "hit", ]].assign( mixmhcpred=numpy.where(source.hit, 0.9, 0.1), ).to_csv(external, index=False) out = tmp_path / "figures" provenance = affinity_candidate_figures.build_candidate_figure_inputs( factorial, out, [baseline], "public_2_2", [external], ) predictions = pandas.read_csv(out / "benchmark.monoallelic.csv.bz2") assert "mixmhcpred" in predictions assert predictions.mixmhcpred.notnull().all() assert provenance["external_predictors_included"] == [ "netmhcpan4.ba", "netmhcpan4.el", "mixmhcpred"] record = provenance["external_prediction_sources"][0] assert record["matched_candidate_rows"] == 40 assert record["finite_prediction_rows"] == {"mixmhcpred": 40} source.iloc[:-1][[ "protein_accession", "sample_id", "hla", "peptide", "n_flank", "c_flank", "hit", ]].assign(mixmhcpred=0.5).to_csv(external, index=False) with pytest.raises(ValueError, match="failed to cover 1 of 40"): affinity_candidate_figures.build_candidate_figure_inputs( factorial, tmp_path / "incomplete", [baseline], "public_2_2", [external], ) def test_candidate_figure_inputs_join_repeated_external_identities(tmp_path): combined = pandas.DataFrame({ "protein_accession": ["P1", "P1", "P2"], "sample_id": ["sample-1"] * 3, "hla": ["HLA-A*02:01"] * 3, "peptide": ["AAAAAAAA", "AAAAAAAA", "BBBBBBBB"], "n_flank": ["NNNNN"] * 3, "c_flank": ["CCCCC"] * 3, "hit": [0, 0, 1], }) external = tmp_path / "external.csv.bz2" pandas.concat([ combined.assign(mixmhcpred=[0.1, 0.1, 0.9]), combined.iloc[[0]].assign(mixmhcpred=0.1), ], ignore_index=True).to_csv(external, index=False) merged, records = affinity_candidate_figures._merge_external_predictions( combined.copy(), [external], {"mixmhcpred"}) assert len(merged) == len(combined) numpy.testing.assert_allclose(merged.mixmhcpred, [0.1, 0.1, 0.9]) assert records[0]["duplicate_candidate_rows"] == 2 assert records[0]["duplicate_candidate_keys"] == 1 assert records[0]["duplicate_source_rows"] == 3 assert records[0]["duplicate_source_keys"] == 1 assert records[0]["unique_join_rows"] == 2 inconsistent = pandas.read_csv(external) inconsistent.loc[3, "mixmhcpred"] = 0.2 inconsistent.to_csv(external, index=False) with pytest.raises(ValueError, match="different scores"): affinity_candidate_figures._merge_external_predictions( combined.copy(), [external], {"mixmhcpred"}) def test_candidate_figure_render_includes_every_candidate_row( tmp_path, monkeypatch): conditions = ["keras_128", "native_1024"] captured = {} monkeypatch.setattr( affinity_candidate_figures, "build_candidate_figure_inputs", lambda *_args, **_kwargs: { "outputs": {"predictions": str(tmp_path / "predictions.csv")}, "external_predictors_included": ["netmhcpan4.ba"], }, ) def fake_render(args): captured["args"] = args return 0 monkeypatch.setattr(paper_figures, "run", fake_render) args = affinity_candidate_figures.make_parser().parse_args([ "--factorial-dir", str(tmp_path / "factorial"), "--out", str(tmp_path / "figures"), "--condition", conditions[0], "--condition", conditions[1], ]) assert affinity_candidate_figures.run(args) == 0 rendered = captured["args"] assert rendered.candidate_predictor == conditions[0] assert rendered.monoallelic_panel_predictors == ",".join(conditions) assert rendered.external_baselines == ( "mhcflurry_public_2_2,netmhcpan4.ba") def test_merge_external_prediction_groups(tmp_path): metadata = pandas.DataFrame({ "protein_accession": ["P1", "P2"], "peptide": ["AAAAAAAA", "BBBBBBBB"], "sample_id": ["sample-1", "sample-1"], "n_flank": ["NNNNN", "NNNNN"], "c_flank": ["CCCCC", "CCCCC"], "hit": [1, 0], "hla": ["HLA-A*02:01", "HLA-A*02:01"], }) specs = [] for predictor, values in [ ("netmhcpan4.ba", [20.0, 2000.0]), ("netmhcpan4.el", [0.9, 0.1]), ("mixmhcpred", [0.8, 0.2])]: member_name = ( "benchmark.monoallelic.%s.train_excluded.sample-1.csv.bz2" % predictor) member = tmp_path / member_name metadata.assign(**{ predictor: values, "%s_best_allele" % predictor: "HLA-A*02:01", }).to_csv(member, index=False) manifest = tmp_path / ("group.%s.csv" % predictor) pandas.DataFrame({"filename": [member_name]}).to_csv( manifest, index=False) specs.append("%s=%s" % (predictor, manifest)) out = tmp_path / "external.csv.bz2" provenance = merge_external_predictions.merge_external_prediction_groups( specs, out) result = pandas.read_csv(out) assert list(result.columns) == list(metadata.columns) + [ "netmhcpan4.ba", "netmhcpan4.el", "mixmhcpred"] assert provenance["member_count"] == 1 assert provenance["row_count"] == 2 assert provenance["output"]["sha256"] assert (tmp_path / "external.csv.bz2.provenance.json").is_file() mhcflurry-2.3.6/test/test_affinity_factorial.py000066400000000000000000000622571525677230600220130ustar00rootroot00000000000000"""Tests for the controlled affinity recipe sweep.""" import csv from copy import deepcopy import importlib.util import json from pathlib import Path import subprocess import numpy import pandas import pytest import yaml from mhcflurry.class1_neural_network import Class1NeuralNetworkModel REPO = Path(__file__).resolve().parents[1] RUNNER = REPO / "scripts" / "training" / "run_affinity_factorial.sh" ARCHITECTURE_RUNNER = ( REPO / "scripts" / "training" / "run_affinity_factorial_architecture_evaluation.sh" ) PUBLIC_EVALUATOR = ( REPO / "scripts" / "training" / "evaluate_affinity_factorial_public.sh" ) PROCESSING_REGULARIZATION_RUNNER = ( REPO / "scripts" / "training" / "run_processing_regularization_activation.sh" ) def load_script(name): """Load a training script as a module.""" path = REPO / "scripts" / "training" / (name + ".py") spec = importlib.util.spec_from_file_location(name, path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module def test_affinity_factorial_runner_exposes_explicit_cli(): result = subprocess.run( ["bash", str(RUNNER), "--help"], check=True, capture_output=True, text=True, ) for flag in ( "--out", "--train-data", "--allele-sequences", "--pretrain-data", "--data-eval-dir", "--release-holdout-dir", "--public-affinity-dir", "--source-commit", "--mode", "--design", "--regularization-base-recipe", "--condition", "--random-seed", "--evaluation", "--gpus", "--max-workers-per-gpu", "--dataloader-num-workers", "--max-tasks-per-worker", "--torch-compile", "--torch-compile-loss", "--matmul-precision"): assert flag in result.stdout def test_affinity_public_evaluator_exposes_explicit_cli(): result = subprocess.run( ["bash", str(PUBLIC_EVALUATOR), "--help"], check=True, capture_output=True, text=True, ) for flag in ( "--factorial-dir", "--public-affinity-dir", "--data-eval-dir", "--release-holdout-dir", "--analysis-source-commit", "--public-label", "--gpus", "--max-workers-per-gpu"): assert flag in result.stdout script = PUBLIC_EVALUATOR.read_text() assert "--affinity-source no_additional_ms" in script assert "--affinity-training-overlap-policy exclude" in script assert "--skip-affinity-predictions" not in script assert "mhcflurry train plot-loss-curves" in script assert "mhcflurry plot-model-comparison" in script assert "mhcflurry eval affinity-candidate-figures" in script def test_processing_regularization_runner_exposes_explicit_cli(): result = subprocess.run( ["bash", str(PROCESSING_REGULARIZATION_RUNNER), "--help"], check=True, capture_output=True, text=True, ) for flag in ( "--out", "--train-data", "--data-eval-dir", "--release-holdout-dir", "--source-commit", "--random-seed", "--evaluation", "--experiments-dir", "--experiment-name", "--source-archive", "--gpus", "--num-jobs", "--max-workers-per-gpu", "--dataloader-num-workers", "--max-tasks-per-worker"): assert flag in result.stdout def test_affinity_architecture_runner_exposes_explicit_cli(): result = subprocess.run( ["bash", str(ARCHITECTURE_RUNNER), "--help"], check=True, capture_output=True, text=True, ) for flag in ( "--factorial-dir", "--data-eval-dir", "--release-holdout-dir", "--training-source-commit", "--analysis-source-commit", "--gpus", "--max-workers-per-gpu", "--max-tasks-per-worker", "--torch-compile", "--matmul-precision"): assert flag in result.stdout def test_affinity_factorial_runner_does_not_accept_env_only_configuration( monkeypatch, ): for name in ( "MHCFLURRY_OUT", "TRAIN_DATA", "ALLELE_SEQUENCES", "PRETRAIN_DATA", "DATA_EVAL_DIR", "RELEASE_HOLDOUT_DIR", "SOURCE_COMMIT", "GPUS"): monkeypatch.setenv(name, "/ignored") result = subprocess.run( ["bash", str(RUNNER)], capture_output=True, text=True, ) assert result.returncode == 2 assert "Missing required argument for MHCFLURRY_OUT" in result.stderr def test_affinity_factorial_runner_validates_cli_values(): result = subprocess.run( [ "bash", str(RUNNER), "--out", "/unused", "--train-data", "/unused", "--allele-sequences", "/unused", "--pretrain-data", "/unused", "--data-eval-dir", "/unused", "--release-holdout-dir", "/unused", "--public-affinity-dir", "/unused", "--source-commit", "deadbeef", "--mode", "invalid", ], capture_output=True, text=True, ) assert result.returncode == 2 assert "Invalid --mode: invalid" in result.stderr def test_orthogonal_affinity_initializer(): model = Class1NeuralNetworkModel( peptide_encoding_shape=(2, 3), layer_sizes=[4], init="orthogonal", ) for layer in (model.dense_layers[0], model.output_layer): weights = layer.weight.detach().numpy() numpy.testing.assert_allclose( weights @ weights.T, numpy.eye(weights.shape[0]), rtol=1e-5, atol=1e-6, ) def test_affinity_factorial_has_only_effective_initialization_axes(tmp_path): module = load_script("generate_affinity_factorial") records = module.build_conditions() assert len(records) == 40 assert len({condition for condition, _, _ in records}) == 40 assert {len(grid) for _, grid, _ in records} == {2} assert sum( axes["data_dependent_initialization_method"] == "lsuv" for _, _, axes in records ) == 16 assert sum( axes["data_dependent_initialization_method"] is None for _, _, axes in records ) == 24 for _, grid, axes in records: assert {item["minibatch_size"] for item in grid} == { axes["minibatch_size"] } assert {item["optimizer_implementation"] for item in grid} == { axes["optimizer_implementation"] } assert {item["init"] for item in grid} == {axes["init"]} assert { item["data_dependent_initialization_method"] for item in grid } == {axes["data_dependent_initialization_method"]} if axes["data_dependent_initialization_method"] == "lsuv": assert axes["init"] == "glorot_uniform" assert axes["effective_hidden_initializer"] == ( "orthogonal_then_lsuv" ) else: assert axes["lsuv_target"] == "not_applicable" assert axes["effective_hidden_initializer"] == axes["init"] manifest = module.write_conditions(tmp_path) assert len(manifest["records"]) == 40 assert manifest["fixed_controls"][ "lsuv_replaces_eligible_weights_with_orthogonal" ] is True for record in manifest["records"]: values = yaml.safe_load( (tmp_path / record["hyperparameters_path"]).read_text() ) assert len(values) == 2 @pytest.mark.parametrize( "base_recipe,optimizer,lsuv_target,lsuv_method", [ ("native-pre-1024", "pytorch", "pre_activation", "lsuv"), ("native-post-1024", "pytorch", "post_activation", "lsuv"), ("keras-no-lsuv-1024", "keras", "not_applicable", None), ], ) def test_affinity_regularization_activation_design( tmp_path, base_recipe, optimizer, lsuv_target, lsuv_method): module = load_script("generate_affinity_factorial") records = module.build_regularization_activation_conditions(base_recipe) assert len(records) == 10 assert {len(grid) for _, grid, _ in records} == {2} assert {axes["activation"] for _, _, axes in records} == { "tanh", "relu", "silu", "gelu"} assert {axes["normalization"] for _, _, axes in records} == { "none", "batch", "layer"} assert {axes["dropout_keep_probability"] for _, _, axes in records} == { 0.5, 0.75, 1.0} assert {axes["restore_best_weights"] for _, _, axes in records} == { False, True} assert {axes["patience"] for _, _, axes in records} == {20, 40} for _, grid, axes in records: assert {item["optimizer_implementation"] for item in grid} == { optimizer} assert {item["data_dependent_initialization_method"] for item in grid} == { lsuv_method} assert axes["lsuv_target"] == lsuv_target out = tmp_path / base_recipe manifest = module.write_conditions( out, design="regularization-activation", regularization_base_recipe=base_recipe, ) assert manifest["baseline_condition"] == "%s__control" % base_recipe assert len(manifest["records"]) == 10 def test_processing_regularization_activation_design(tmp_path): module = load_script("generate_processing_regularization_activation") records = module.build_conditions() assert len(records) == 20 for architecture in ("small", "large"): architecture_records = [ record for record in records if record[2]["architecture"] == architecture ] assert len(architecture_records) == 10 assert {axes["activation"] for _, _, axes in architecture_records} == { "tanh", "relu", "silu", "gelu"} assert {axes["normalization"] for _, _, axes in architecture_records} == { "none", "batch", "layer"} assert {axes["restore_best_weights"] for _, _, axes in ( architecture_records )} == {False, True} assert {axes["patience"] for _, _, axes in architecture_records} == { 20, 40} for _, grid, axes in architecture_records: assert len(grid) == 1 item = grid[0] assert item["n_flank_length"] == 5 assert item["c_flank_length"] == 5 assert item["minibatch_size"] == 512 assert item["optimizer_implementation"] == "keras" assert axes["baseline_condition"] == "%s__control" % architecture manifest = module.write_conditions(tmp_path / "processing") assert len(manifest["records"]) == 20 assert manifest["fixed_controls"]["flank_length_each_side"] == 5 def test_training_stop_summary_tracks_updates_and_validation_tail(tmp_path): module = load_script("summarize_training_stops") history = pandas.DataFrame({ "manifest_path": ["condition/models/manifest.csv"] * 4, "model_name": ["model"] * 4, "fit_index": [0] * 4, "phase": ["finetune"] * 4, "fold": [0] * 4, "architecture": [1] * 4, "replicate": [0] * 4, "epoch": [1, 2, 3, 4], "val_loss": [0.4, 0.2, 0.21, 0.22], "epoch_num_train_batches": [10] * 4, "epoch_num_train_rows": [100] * 4, "epoch_train_time": [1.5] * 4, "epoch_total_time": [2.0] * 4, }) path = tmp_path / "training_history.csv" history.to_csv(path, index=False) details, summary = module.summarize(path) assert details.best_epoch.tolist() == [2] assert details.final_epoch.tolist() == [4] assert details.epochs_after_best.tolist() == [2] assert details.optimizer_steps.tolist() == [40.0] assert details.training_rows_seen.tolist() == [400.0] assert summary.total_epochs.tolist() == [4] assert summary.total_optimizer_steps.tolist() == [40.0] def test_affinity_factorial_full_mode_retains_all_architectures(): module = load_script("generate_affinity_factorial") records = module.build_conditions( mode="full", minibatch_sizes=(128,), optimizer_implementations=("keras",), lsuv_targets=("post_activation",), initializers=("glorot_uniform",), ) assert len(records) == 2 assert {len(grid) for _, grid, _ in records} == {35} def metric_summary(a, b): """Return a minimal compare-models affinity summary.""" macro = { metric: {"a": a[index], "b": b[index]} for index, metric in enumerate(("roc_auc", "pr_auc", "ppv_at_n")) } micro_a = { metric: a[index] for index, metric in enumerate(("roc_auc", "pr_auc", "ppv_at_n")) } micro_b = { metric: b[index] for index, metric in enumerate(("roc_auc", "pr_auc", "ppv_at_n")) } return { "macro_mean_over_alleles": macro, "micro_pooled": {"a": micro_a, "b": micro_b}, "allele_count": {}, "n_rows": 10, "n_hits": 2, "n_alleles_reported": 1, } def test_affinity_factorial_summary_keeps_comparison_sides_separate(tmp_path): module = load_script("summarize_affinity_factorial") baseline = "baseline" candidate = "candidate" manifest = { "baseline_condition": baseline, "records": [ {"condition": baseline, "minibatch_size": 128}, {"condition": candidate, "minibatch_size": 256}, ], } (tmp_path / "manifest.json").write_text(json.dumps(manifest)) baseline_dir = ( tmp_path / "baseline-vs-public-no-additional-ms" / "affinity" ) baseline_dir.mkdir(parents=True) baseline_public = metric_summary((0.9, 0.6, 0.5), (0.8, 0.4, 0.3)) baseline_public["benchmark_identity"] = { "algorithm": "test", "columns": ["source_file", "hla", "peptide", "hit"], "ordered_rows": True, "row_count": 10, "sha256": "a" * 64, } (baseline_dir / "summary.json").write_text(json.dumps(baseline_public)) candidate_dir = ( tmp_path / candidate / "comparison-vs-baseline" / "affinity" ) candidate_dir.mkdir(parents=True) (candidate_dir / "summary.json").write_text( json.dumps(metric_summary((0.91, 0.63, 0.52), (0.9, 0.6, 0.5))) ) candidate_public_dir = ( tmp_path / candidate / "comparison-vs-public-no-additional-ms" / "affinity" ) candidate_public_dir.mkdir(parents=True) candidate_public = metric_summary( (0.905, 0.625, 0.515), (0.8, 0.4, 0.3)) candidate_public["benchmark_identity"] = baseline_public[ "benchmark_identity"] (candidate_public_dir / "summary.json").write_text( json.dumps(candidate_public)) records = module.summarize(tmp_path) by_condition = {record["condition"]: record for record in records} assert by_condition[candidate]["macro_pr_auc"] == 0.63 assert by_condition[candidate]["macro_pr_auc_baseline"] == 0.6 assert by_condition[candidate]["macro_pr_auc_delta"] == pytest.approx(0.03) assert by_condition[baseline]["macro_pr_auc_public"] == 0.4 assert by_condition[candidate]["macro_pr_auc_public"] == 0.4 assert by_condition[candidate][ "macro_pr_auc_vs_public_candidate"] == 0.625 assert by_condition[candidate]["macro_pr_auc_vs_public_delta"] == ( pytest.approx(0.225)) assert by_condition[candidate][ "public_benchmark_identity_sha256"] == "a" * 64 assert (tmp_path / "summary.csv").exists() candidate_public["benchmark_identity"] = { **baseline_public["benchmark_identity"], "sha256": "b" * 64} (candidate_public_dir / "summary.json").write_text( json.dumps(candidate_public)) with pytest.raises(ValueError, match="different benchmark rows"): module.summarize(tmp_path) def test_affinity_architecture_summary_classifies_strict_dominance(tmp_path): module = load_script("summarize_affinity_factorial_architectures") baseline = "baseline" candidate = "candidate" manifest = { "baseline_condition": baseline, "records": [ {"condition": baseline, "minibatch_size": 128}, {"condition": candidate, "minibatch_size": 256}, ], } (tmp_path / "manifest.json").write_text(json.dumps(manifest)) architecture_dir = tmp_path / "architecture_evaluation" provenance = { "architecture_num": 0, "architecture": { "topology": "feedforward", "layer_sizes": [512, 512], "dense_layer_l1_regularization": 1e-8, }, } for condition in (baseline, candidate): subset = ( architecture_dir / "subsets" / condition / "architecture_0" ) subset.mkdir(parents=True) (subset / "subset_provenance.json").write_text(json.dumps(provenance)) baseline_summary = ( architecture_dir / "baseline-vs-public" / "architecture_0" / "affinity" ) baseline_summary.mkdir(parents=True) (baseline_summary / "summary.json").write_text( json.dumps(metric_summary((0.9, 0.6, 0.5), (0.8, 0.4, 0.3))) ) candidate_summary = ( architecture_dir / "comparisons" / candidate / "architecture_0-vs-baseline" / "affinity" ) candidate_summary.mkdir(parents=True) (candidate_summary / "summary.json").write_text( json.dumps(metric_summary((0.91, 0.63, 0.52), (0.9, 0.6, 0.5))) ) records = module.summarize(tmp_path) by_condition = {record["condition"]: record for record in records} assert by_condition[baseline]["metric_dominance"] == "reference" assert by_condition[candidate]["metric_dominance"] == ( "strictly_dominates_baseline" ) assert by_condition[candidate]["macro_pr_auc_delta"] == pytest.approx(0.03) assert (architecture_dir / "summary.csv").exists() def test_affinity_factorial_model_verifier_checks_folds_and_batch(tmp_path): generator = load_script("generate_affinity_factorial") verifier = load_script("verify_affinity_factorial_models") _, grid, _ = generator.build_conditions( minibatch_sizes=(128,), optimizer_implementations=("keras",), lsuv_targets=("post_activation",), initializers=(), )[0] hyperparameters_path = tmp_path / "hyperparameters.yaml" hyperparameters_path.write_text(yaml.safe_dump(grid)) models_dir = tmp_path / "models" models_dir.mkdir() rows = [] for architecture_num, hyperparameters in enumerate(grid): for fold in range(4): model_name = "model-%d-%d" % (architecture_num, fold) numpy.savez(models_dir / ("weights_%s.npz" % model_name), value=[1]) fitted_hyperparameters = deepcopy(hyperparameters) fitted_hyperparameters["learning_rate"] /= 10 rows.append({ "model_name": model_name, "allele": "pan-class1", "config_json": json.dumps({ "hyperparameters": fitted_hyperparameters, "fit_info": [{ "effective_minibatch_size": 128, "training_info": { "fold_num": fold, "num_folds": 4, "train_peptide_hash": "fold-%d" % fold, }, }], }), }) with (models_dir / "manifest.csv").open("w", newline="") as fd: writer = csv.DictWriter( fd, fieldnames=("model_name", "allele", "config_json") ) writer.writeheader() writer.writerows(rows) report = verifier.verify(models_dir, hyperparameters_path) assert report["model_count"] == 8 wrong_learning_rate = json.loads(rows[0]["config_json"]) wrong_learning_rate["hyperparameters"]["learning_rate"] = 0.001 rows[0]["config_json"] = json.dumps(wrong_learning_rate) with (models_dir / "manifest.csv").open("w", newline="") as fd: writer = csv.DictWriter( fd, fieldnames=("model_name", "allele", "config_json") ) writer.writeheader() writer.writerows(rows) with pytest.raises(ValueError, match="learning_rate mismatch"): verifier.verify(models_dir, hyperparameters_path) fitted_hyperparameters = deepcopy(grid[0]) fitted_hyperparameters["learning_rate"] /= 10 rows[0]["config_json"] = json.dumps({ "hyperparameters": fitted_hyperparameters, "fit_info": [{ "effective_minibatch_size": 64, "training_info": { "fold_num": 0, "num_folds": 4, "train_peptide_hash": "fold-0", }, }], }) with (models_dir / "manifest.csv").open("w", newline="") as fd: writer = csv.DictWriter( fd, fieldnames=("model_name", "allele", "config_json") ) writer.writeheader() writer.writerows(rows) with pytest.raises(ValueError, match="Training minibatch shrank"): verifier.verify(models_dir, hyperparameters_path) def test_split_affinity_architectures_writes_fold_complete_subsets(tmp_path): module = load_script("split_affinity_architectures") models_dir = tmp_path / "models" models_dir.mkdir() rows = [] for architecture_num, topology in enumerate(( "feedforward", "with-skip-connections")): for fold_num in range(4): name = "model-%d-%d" % (architecture_num, fold_num) numpy.savez(models_dir / ("weights_%s.npz" % name), value=[1]) checkpoint = "checkpoints/best/weights_%s.npz" % name (models_dir / checkpoint).parent.mkdir(parents=True, exist_ok=True) numpy.savez(models_dir / checkpoint, value=[fold_num]) rows.append({ "model_name": name, "allele": "pan-class1", "checkpoint_best_weights": checkpoint, "checkpoint_terminal_weights": None, "config_json": json.dumps({ "hyperparameters": { "topology": topology, "layer_sizes": [512, 512], "dense_layer_l1_regularization": 1e-8, }, "fit_info": [{ "training_info": { "architecture_num": architecture_num, "fold_num": fold_num, }, }], }), }) pandas = pytest.importorskip("pandas") pandas.DataFrame(rows).to_csv(models_dir / "manifest.csv", index=False) (models_dir / "train_data.csv.bz2").write_bytes(b"training") (models_dir / "percent_ranks.csv").write_text("ensemble calibration\n") (models_dir / "allele_sequences.csv").write_text( "allele,sequence\nHLA-A*02:01," + "A" * 39 + "\n" ) result = module.split_models(models_dir, tmp_path / "subsets") assert len(result) == 2 for architecture_num in range(2): target = tmp_path / "subsets" / ("architecture_%d" % architecture_num) subset = pandas.read_csv(target / "manifest.csv") assert len(subset) == 4 assert set(subset.model_name) == { "model-%d-%d" % (architecture_num, fold) for fold in range(4) } assert (target / "train_data.csv.bz2").read_bytes() == b"training" assert not (target / "percent_ranks.csv").exists() for filename in subset.checkpoint_best_weights: assert (target / filename).read_bytes() == (models_dir / filename).read_bytes() provenance = json.loads((target / "subset_provenance.json").read_text()) assert provenance["folds"] == [0, 1, 2, 3] assert provenance["architecture_num"] == architecture_num repeated = module.split_models(models_dir, tmp_path / "subsets") assert [item["models_dir"] for item in repeated] == [ str(tmp_path / "subsets" / "architecture_0"), str(tmp_path / "subsets" / "architecture_1"), ] def test_split_retained_checkpoint_predictor_loads(tmp_path): from mhcflurry import Class1AffinityPredictor, Class1NeuralNetwork model = Class1NeuralNetwork( max_epochs=1, validation_split=0.5, layer_sizes=[4], random_negative_rate=0.0, random_negative_constant=0) model.fit( ["SIINFEKLM", "ARTLAVELS", "GILGFVFTL", "RTLNAWVKV"], numpy.array([50.0, 30.0, 100.0, 5000.0]), save_all_checkpoints=True) model.fit_info[-1]["training_info"] = {"architecture_num": 0, "fold_num": 0} predictor = Class1AffinityPredictor( class1_pan_allele_models=[model], allele_to_sequence={"HLA-A*02:01": "A" * 39}) source = tmp_path / "source" predictor.save(str(source)) subsets = load_script("split_affinity_architectures").split_models( source, tmp_path / "subsets", expected_folds=1) loaded = Class1AffinityPredictor.load(subsets[0]["models_dir"], optimization_level=0) assert loaded.neural_networks[0].available_checkpoint_policies() == ["terminal", "best"] for policy in ("terminal", "best"): for actual, expected in zip( loaded.neural_networks[0].get_checkpoint_weights(policy), model.get_checkpoint_weights(policy)): numpy.testing.assert_array_equal(actual, expected) mhcflurry-2.3.6/test/test_allele_canonicalization.py000066400000000000000000000153451525677230600230150ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Integration tests for allele-name canonicalization shared by prediction and training ingestion. These exercise the helpers in ``mhcflurry.common`` against the *real* ``allele_sequences`` key set (not synthetic keys), so they catch regressions in the no-alias-first resolution that unit tests with hand-made key sets can miss. """ import pandas import pytest from mhcflurry.common import ( normalize_allele_name, build_allele_alias_map, AlleleKeyResolver, canonicalize_allele_series, ) from mhcflurry.class1_affinity_predictor import Class1AffinityPredictor from mhcflurry.downloads import get_path from mhcflurry.pseudosequences import LEGACY_ALLELE_SEQUENCES_FILENAME from mhcflurry.testing_utils import cleanup, startup @pytest.fixture(autouse=True, scope="module") def setup_module(): startup() yield cleanup() def _allele_sequence_keys(): seqs = pandas.read_csv( get_path("allele_sequences", LEGACY_ALLELE_SEQUENCES_FILENAME), index_col=0) return list(seqs.index) def test_canonicalize_allele_series_against_real_allele_sequences(): keys = _allele_sequence_keys() key_set = set(keys) assert "HLA-A*02:01" in key_set, "test assumes A*02:01 is a known key" inputs = [ "HLA-A*02:01", # already canonical -> itself "HLA-A0201", # alternative spelling -> canonical key "A*02:01", # missing HLA- prefix -> canonical key "HLA-A2", # serotype -> not an allele -> dropped "NONSENSE", # junk -> dropped ] out = canonicalize_allele_series(inputs, keys, log_label="test alleles") assert out[0] == "HLA-A*02:01" assert out[1] == "HLA-A*02:01" assert out[2] == "HLA-A*02:01" assert out[3] is None, "serotype must not resolve to an allele key" assert out[4] is None, "junk must be dropped" # Every non-None result is guaranteed to be a real pseudosequence key. assert all(x in key_set for x in out if x is not None) def test_canonicalize_allele_series_resolves_a_real_retired_alias(): # Find a real retired/aliased name in the key set: a key whose alias-applied # normalization differs from the key itself. Then confirm a request for that # alias routes back to the original key (no-alias-first preserves the key's # own pseudosequence), rather than being lost. keys = _allele_sequence_keys() key_set = set(keys) alias_map = build_allele_alias_map(keys) if not alias_map: pytest.skip("no aliased alleles in this allele_sequences table") alias_name, original_key = next(iter(alias_map.items())) resolved = AlleleKeyResolver(key_set, alias_map).resolve(alias_name) assert resolved == original_key assert resolved in key_set def test_predictor_canonicalize_matches_resolver(): # Single source of truth: the predictor canonicalizes via an AlleleKeyResolver # over its own maps, so canonicalize_allele_name matches a resolver built the # same way. keys = _allele_sequence_keys() subset = {k: "X" for k in keys[:200]} predictor = Class1AffinityPredictor(allele_to_sequence=subset) resolver = AlleleKeyResolver( predictor.allele_to_sequence, predictor.allele_to_canonical) for name in ["HLA-A*02:01", "HLA-A0201"] + list(keys[:3]): if normalize_allele_name(name, raise_on_error=False) is None: continue assert predictor.canonicalize_allele_name(name) == resolver.resolve( name, raise_on_error=True) def test_predictor_reuses_cached_resolver(): # The per-row calls in predict_to_dataframe must reuse one resolver, not # reconstruct it each time. predictor = Class1AffinityPredictor( allele_to_sequence={"HLA-A*02:01": "AAAA"}) predictor.canonicalize_allele_name("HLA-A*02:01") first = predictor._cache["allele_key_resolver"] predictor.canonicalize_allele_name("HLA-A*02:01") assert predictor._cache["allele_key_resolver"] is first def test_predictor_clear_cache_invalidates_cached_resolver(): # clear_cache() must drop the cached resolver (it lives in self._cache), so # a resolver built before the allele maps change can't go stale. predictor = Class1AffinityPredictor( allele_to_sequence={"HLA-A*02:01": "AAAA"}) predictor.canonicalize_allele_name("HLA-A*02:01") assert "allele_key_resolver" in predictor._cache predictor.clear_cache() assert "allele_key_resolver" not in predictor._cache # Still resolves afterward (a fresh resolver is built on demand). assert predictor.canonicalize_allele_name("HLA-A*02:01") == "HLA-A*02:01" def test_canonicalize_allele_series_builds_reverse_map_lazily(monkeypatch): # The ~O(keys) reverse alias map must be built only when a name actually # needs it (a current-name request for a retired key), never for data that # resolves via the two cheap per-name paths. import mhcflurry.common as common calls = [] real = common.build_allele_alias_map monkeypatch.setattr( common, "build_allele_alias_map", lambda keys: calls.append(1) or real(keys)) keys = ["HLA-A*02:01", "HLA-B*44:01"] # Canonical / alternative-spelling / junk inputs: no reverse map needed. out = common.canonicalize_allele_series( ["HLA-A*02:01", "HLA-A0201", "NONSENSE"], keys) assert out == ["HLA-A*02:01", "HLA-A*02:01", None] assert calls == [], "reverse map built for already-resolvable input" # A retired key requested by its current name forces a single lazy build. out2 = common.canonicalize_allele_series(["HLA-B*44:02"], keys) assert out2 == ["HLA-B*44:01"] assert len(calls) == 1, "reverse map should build exactly once, on demand" def test_allele_specific_normalization_merges_spellings(): # The allele-specific ingestion path canonicalizes with plain normalization # (aliases applied) so different spellings of one allele collapse to a # single training allele instead of fragmenting into separate models. spellings = ["HLA-A*02:01", "HLA-A0201", "A*02:01", "HLA-A02:01"] canonical = {normalize_allele_name(s) for s in spellings} assert canonical == {"HLA-A*02:01"}, canonical # Unparseable names resolve to None (dropped at ingestion). assert normalize_allele_name("NONSENSE", raise_on_error=False) is None mhcflurry-2.3.6/test/test_allele_encoding.py000066400000000000000000000031601525677230600212460ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import time from mhcflurry.allele_encoding import AlleleEncoding from mhcflurry.amino_acid import BLOSUM62_MATRIX from numpy.testing import assert_equal def test_allele_encoding_speed(): encoding = AlleleEncoding( ["A*02:01", "A*02:03", "A*02:01"], { "A*02:01": "AC", "A*02:03": "AE", } ) start = time.time() encoding1 = encoding.fixed_length_vector_encoded_sequences("BLOSUM62") assert_equal( [ [BLOSUM62_MATRIX["A"], BLOSUM62_MATRIX["C"]], [BLOSUM62_MATRIX["A"], BLOSUM62_MATRIX["E"]], [BLOSUM62_MATRIX["A"], BLOSUM62_MATRIX["C"]], ], encoding1) print("Simple encoding in %0.2f sec." % (time.time() - start)) print(encoding1) encoding = AlleleEncoding( ["A*02:01", "A*02:03", "A*02:01"] * int(1e5), { "A*02:01": "AC" * 16, "A*02:03": "AE" * 16, } ) start = time.time() encoding1 = encoding.fixed_length_vector_encoded_sequences("BLOSUM62") print("Long encoding in %0.2f sec." % (time.time() - start)) mhcflurry-2.3.6/test/test_amino_acid.py000066400000000000000000000207461525677230600202360ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Tests for amino acid encoding.""" from mhcflurry import amino_acid from numpy.testing import assert_equal import numpy import pandas import warnings letter_to_index_dict = { 'A': 0, 'B': 1, 'C': 2, } def test_index_and_one_hot_encoding(): letter_to_vector_df = pandas.DataFrame( [ [1, 0, 0,], [0, 1, 0,], [0, 0, 1,] ], columns=[0, 1, 2] ) index_encoding = amino_acid.index_encoding( ["AAAA", "ABCA"], letter_to_index_dict) assert_equal( index_encoding, [ [0, 0, 0, 0], [0, 1, 2, 0], ]) one_hot = amino_acid.fixed_vectors_encoding( index_encoding, letter_to_vector_df) assert one_hot.shape == (2, 4, 3) assert_equal( one_hot[0], [ [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], ]) assert_equal( one_hot[1], [ [1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 0, 0], ]) def test_fixed_vectors_encoding_allows_non_square_vector_tables(): letter_to_vector_df = pandas.DataFrame( [ [1, 10], [2, 20], [3, 30], ], columns=["small", "large"], ) index_encoding = amino_acid.index_encoding( ["ABCA"], letter_to_index_dict) encoded = amino_acid.fixed_vectors_encoding( index_encoding, letter_to_vector_df) assert encoded.shape == (1, 4, 2) assert_equal(encoded[0], [[1, 10], [2, 20], [3, 30], [1, 10]]) def test_physchem_and_composite_vector_encodings(): physchem = amino_acid.get_vector_encoding_df("physchem") assert physchem.shape == (21, 14) assert physchem.loc["X"].tolist() == [0.0] * 14 assert list(physchem.columns[:4]) == [ "z_kd_hydropathy", "z_grantham_composition", "z_grantham_polarity", "z_grantham_volume", ] assert physchem.loc["D", "side_chain_charge"] == -1.0 assert physchem.loc["K", "side_chain_charge"] == 1.0 assert physchem.loc["Y", "aromatic"] == 1.0 assert physchem.loc["S", "hydroxyl"] == 1.0 atchley = amino_acid.get_vector_encoding_df("atchley") assert atchley.shape == (21, 5) assert list(atchley.columns) != list(physchem.columns) composite = amino_acid.get_vector_encoding_df("BLOSUM62+physchem") assert composite.shape == (21, 35) assert amino_acid.vector_encoding_length("BLOSUM62+physchem") == 35 assert_equal( composite.loc["A"].values[:21], amino_acid.get_vector_encoding_df("BLOSUM62").loc["A"].values, ) assert_equal( composite.loc["A"].values[21:], physchem.loc["A"].values, ) def test_substitution_matrix_encodings_extend_unknown(): pmbec = amino_acid.get_vector_encoding_df("PMBEC") assert pmbec.shape == (21, 21) assert_equal(pmbec.loc["X"].values, [0.0] * 21) assert_equal(pmbec["X"].values, [0.0] * 21) assert_equal(pmbec.values, pmbec.values.T) assert pmbec.loc["A", "A"] == numpy.float32(0.322860152036) assert pmbec.loc["E", "R"] == numpy.float32(-0.0697402405064) assert amino_acid.get_vector_encoding_df("pmbec") is pmbec contact = amino_acid.get_vector_encoding_df("contact") assert contact.shape == (21, 21) assert_equal(contact.loc["X"].values, [0.0] * 21) assert_equal(contact["X"].values, [0.0] * 21) assert_equal(contact.values, contact.values.T) assert contact.loc["A", "A"] == numpy.float32(-0.06711) assert contact.loc["V", "Y"] == numpy.float32(0.03319) assert amino_acid.get_vector_encoding_df("simons1999-contact") is contact assert amino_acid.get_vector_encoding_df("SIMK990103") is contact composite = amino_acid.get_vector_encoding_df("PMBEC+contact") assert composite.shape == (21, 42) assert amino_acid.vector_encoding_length("PMBEC+contact") == 42 pmbec_minmax = amino_acid.get_vector_encoding_df("PMBEC:minmax") common = list(amino_acid.COMMON_AMINO_ACIDS) pmbec_minmax_common = pmbec_minmax.loc[common, common].values assert pmbec_minmax.shape == pmbec.shape assert pmbec_minmax_common.min() == numpy.float32(-1.0) assert pmbec_minmax_common.max() == numpy.float32(1.0) assert_equal(pmbec_minmax.loc["X"].values, [0.0] * 21) assert_equal(pmbec_minmax["X"].values, [0.0] * 21) normalized_composite = amino_acid.get_vector_encoding_df( "PMBEC:minmax+contact:minmax") assert normalized_composite.shape == (21, 42) assert amino_acid.vector_encoding_length( "PMBEC:minmax+contact:minmax") == 42 def test_index_encoding_no_downcast_futurewarning(): with warnings.catch_warnings(): warnings.simplefilter("error", FutureWarning) index_encoding = amino_acid.index_encoding( ["AAAA", "ABCA"], letter_to_index_dict) assert index_encoding.dtype.kind in ("i", "u") def test_peptide_index_round_trip_preserves_string(): """Single-source-of-truth round-trip: peptide → indices → peptide.""" for peptide in ["SIINFEKL", "ACDEFGHIKLMNPQRSTVWY", "XAXAAA", ""]: indices = amino_acid.peptide_to_indices(peptide) assert indices.dtype == numpy.dtype("int8") recovered = amino_acid.indices_to_peptide(indices) assert recovered == peptide.upper() def test_blosum62_reference_values(): """Pin canonical NCBI BLOSUM62 entries so silent matrix drift is caught.""" m = amino_acid.BLOSUM62_MATRIX expected_diagonal = { "A": 4, "R": 5, "N": 6, "D": 6, "C": 9, "Q": 5, "E": 5, "G": 6, "H": 8, "I": 4, "L": 4, "K": 5, "M": 5, "F": 6, "P": 7, "S": 4, "T": 5, "W": 11, "Y": 7, "V": 4, } for aa, value in expected_diagonal.items(): assert m.loc[aa, aa] == value, (aa, m.loc[aa, aa]) # A few well-known off-diagonals. assert m.loc["W", "Y"] == 2 assert m.loc["F", "Y"] == 3 assert m.loc["I", "L"] == 2 assert m.loc["K", "R"] == 2 # Local X convention (self-similarity 1, all others 0). assert m.loc["X", "X"] == 1 assert (m.loc["X"].drop("X") == 0).all() # Symmetry. assert (m.values == m.values.T).all() def test_atchley_reference_rows(): """Pin Atchley et al. (2005, PNAS) factor-1..5 values for spot rows.""" a = amino_acid.ATCHLEY_FACTORS references = { "A": [-0.591, -1.302, -0.733, 1.570, -0.146], "R": [1.538, -0.055, 1.502, 0.440, 2.897], "W": [-0.595, 0.009, 0.672, -2.128, -0.184], "V": [-1.337, -0.279, -0.544, 1.242, -1.262], } for aa, ref in references.items(): numpy.testing.assert_allclose(a.loc[aa].values, ref, atol=1e-6) # X is the neutral row. assert (a.loc["X"].values == 0.0).all() def test_vector_encoding_index_table_matches_fixed_vectors_encoding(): """int8 indices + embedding-table lookup must equal the legacy widening.""" table = amino_acid.vector_encoding_index_table("BLOSUM62") assert table.dtype == numpy.float32 indices = amino_acid.peptide_to_indices("SIINFEKL") assert indices.dtype == numpy.dtype("int8") via_embedding = table[indices.astype(numpy.int64)] via_legacy = amino_acid.fixed_vectors_encoding( indices.reshape(1, -1), amino_acid.BLOSUM62_MATRIX)[0].astype(numpy.float32) numpy.testing.assert_array_equal(via_embedding, via_legacy) def test_peptide_index_alphabet_anchors(): """Position of letters in AMINO_ACIDS is the contract device-resident code relies on. Pin the well-known anchors so a future reorder breaks the test, not silently the encoded tensor layout.""" assert amino_acid.AMINO_ACIDS[0] == "A" assert amino_acid.AMINO_ACIDS[amino_acid.X_INDEX] == "X" assert amino_acid.X_INDEX == 20 assert amino_acid.NUM_COMMON_AMINO_ACIDS == 20 assert amino_acid.AMINO_ACID_INDEX["A"] == 0 assert amino_acid.AMINO_ACID_INDEX["X"] == 20 # Sorted alphabetically over the 20 common AAs. common = sorted(amino_acid.COMMON_AMINO_ACIDS) for i, letter in enumerate(common): assert amino_acid.AMINO_ACID_INDEX[letter] == i mhcflurry-2.3.6/test/test_api_compat_shims.py000066400000000000000000000075041525677230600214670ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import inspect import pytest from mhcflurry.class1_neural_network import Class1NeuralNetwork from mhcflurry.common import configure_tensorflow from mhcflurry.custom_loss import MSEWithInequalities, get_loss from mhcflurry.data_dependent_weights_initialization import get_activations from mhcflurry.local_parallelism import worker_init def test_old_local_parallelism_import_matches_new_parallelism_package(): import mhcflurry.local_parallelism as old_module import mhcflurry.parallelism as new_package from mhcflurry.parallelism import ( cli_args, planning, torch_compile, worker_pool, worker_runtime, ) assert old_module.worker_init is worker_runtime.worker_init assert old_module.add_local_parallelism_args is cli_args.add_local_parallelism_args assert old_module.resolve_local_parallelism_args is planning.resolve_local_parallelism_args assert ( old_module.worker_pool_with_gpu_assignments is worker_pool.worker_pool_with_gpu_assignments ) assert ( old_module.resolve_torchinductor_compile_threads_env is torch_compile.resolve_torchinductor_compile_threads_env ) assert old_module.__all__ == new_package.__all__ def test_class1_neural_network_public_helpers_remain_importable(): import mhcflurry.class1_encoding as encoding import mhcflurry.class1_neural_network as old_module import mhcflurry.pytorch_sizing as sizing assert ( old_module.compute_prediction_batch_size is sizing.compute_prediction_batch_size ) assert ( old_module.resolve_prediction_batch_size is sizing.resolve_prediction_batch_size ) assert old_module.check_training_batch_fits is sizing.check_training_batch_fits assert ( old_module.peptide_sequences_to_network_input is encoding.peptide_sequences_to_network_input ) def test_legacy_configure_tensorflow_entry_point(): with pytest.warns(FutureWarning, match="configure_tensorflow"): configure_tensorflow(backend="tensorflow", gpu_device_nums=None, num_threads=1) def test_legacy_worker_init_signature_kept(): params = inspect.signature(worker_init).parameters assert "keras_backend" in params def test_worker_init_preserves_empty_gpu_assignment(monkeypatch): calls = [] def fake_configure_pytorch(**kwargs): calls.append(kwargs) monkeypatch.setattr( "mhcflurry.parallelism.worker_runtime.configure_pytorch", fake_configure_pytorch, ) worker_init(backend="auto", gpu_device_nums=[]) assert calls == [{"backend": "auto", "gpu_device_nums": []}] def test_legacy_cache_key_alias(): network_json = ( '{"dense_layer_l1_regularization": 0.1, ' '"dense_layer_l2_regularization": 0.2, "layer_sizes": [8]}' ) assert ( Class1NeuralNetwork.keras_network_cache_key(network_json) == Class1NeuralNetwork.model_cache_key(network_json) ) def test_legacy_get_keras_loss_accessor(): standard = get_loss("mse") assert standard.get_keras_loss() == standard.loss custom = MSEWithInequalities() assert callable(custom.get_keras_loss()) def test_legacy_get_activations_symbol_kept(): params = inspect.signature(get_activations).parameters assert tuple(params) == ("model", "layer", "X_batch") mhcflurry-2.3.6/test/test_calibrate_percentile_ranks_command.py000066400000000000000000000214131525677230600251770ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Tests for calibrate percentile ranks command """ import os import shutil import tempfile import subprocess import pytest import sys from types import SimpleNamespace import numpy from mhcflurry import Class1AffinityPredictor from mhcflurry.class1_presentation_predictor import Class1PresentationPredictor from mhcflurry.downloads import get_path from mhcflurry.percent_rank_transform import PercentRankTransform from .pytest_helpers import mhcflurry_cli os.environ["CUDA_VISIBLE_DEVICES"] = "" os.environ["MHCFLURRY_CLUSTER_WORKER_COMMAND"] = ( f"{sys.executable} -m mhcflurry.cluster_worker_entry_point" ) from mhcflurry.testing_utils import cleanup, startup pytest.fixture(autouse=True, scope="module") def setup_module(): startup() yield cleanup() def run_and_check(n_jobs=0, delete=True, additional_args=None): if additional_args is None: additional_args = [] source_models_dir = get_path("models_class1_pan", "models.combined") dest_models_dir = tempfile.mkdtemp(prefix="mhcflurry-test-models") # Save a new predictor that has no percent rank calibration data. original_predictor = Class1AffinityPredictor.load(source_models_dir) print("Loaded predictor", source_models_dir) new_predictor = Class1AffinityPredictor( class1_pan_allele_models=original_predictor.class1_pan_allele_models, allele_to_sequence=original_predictor.allele_to_sequence, ) new_predictor.save(dest_models_dir) print("Saved predictor to", dest_models_dir) new_predictor = Class1AffinityPredictor.load(dest_models_dir) assert len(new_predictor.allele_to_percent_rank_transform) == 0 args = mhcflurry_cli("mhcflurry-calibrate-percentile-ranks") + [ "--models-dir", dest_models_dir, "--match-amino-acid-distribution-data", get_path( "data_curated", "curated_training_data.affinity.csv.bz2"), "--motif-summary", "--num-peptides-per-length", "1000", "--allele", "HLA-A*02:01", "HLA-B*07:02", "--verbosity", "1", "--num-jobs", str(n_jobs), ] + additional_args print("Running with args: %s" % args) subprocess.check_call(args) new_predictor = Class1AffinityPredictor.load(dest_models_dir) assert len(new_predictor.allele_to_percent_rank_transform) == 2 if delete: print("Deleting: %s" % dest_models_dir) shutil.rmtree(dest_models_dir) else: print("Not deleting: %s" % dest_models_dir) @pytest.mark.slow @pytest.mark.integration def test_run_serial(): run_and_check(n_jobs=0) @pytest.mark.slow @pytest.mark.integration def test_run_parallel(): run_and_check(n_jobs=2) @pytest.mark.slow @pytest.mark.integration def test_run_cluster_parallelism(delete=True): run_and_check(n_jobs=0, additional_args=[ '--cluster-parallelism', '--cluster-results-workdir', '/tmp/', '--cluster-max-retries', '0', ], delete=delete) def test_filter_canonicalizable_alleles_drops_pseudogene(): """Pseudogene / null / questionable annotations are dropped, valid kept.""" from mhcflurry.common import filter_canonicalizable_alleles raw = [ "HLA-A*02:01", "Caja-B5*01:01ps", # pseudogene — mhcgnomes annotation_pseudogene "HLA-B*07:02", ] kept = filter_canonicalizable_alleles(raw) assert "Caja-B5*01:01ps" not in kept assert "HLA-A*02:01" in kept assert "HLA-B*07:02" in kept def test_filter_canonicalizable_alleles_passthrough_when_all_valid(): from mhcflurry.common import filter_canonicalizable_alleles raw = ["HLA-A*02:01", "HLA-B*07:02", "HLA-C*04:01"] kept = filter_canonicalizable_alleles(raw) assert kept == raw def test_percent_rank_status_helpers_count_sequence_equivalent_calibration(): from mhcflurry.calibrate_percentile_ranks_command import ( missing_percent_rank_alleles, percent_rank_status_df, ) transform = PercentRankTransform() transform.fit(numpy.array([10.0, 20.0, 30.0]), bins=3) predictor = Class1AffinityPredictor( allele_to_sequence={ "HLA-A*02:01": "SEQUENCE1", "HLA-A*02:02": "SEQUENCE1", "HLA-B*07:02": "SEQUENCE2", }, allele_to_percent_rank_transform={"HLA-A*02:01": transform}, ) alleles = ["HLA-A*02:01", "HLA-A*02:02", "HLA-B*07:02"] assert missing_percent_rank_alleles(predictor, alleles) == ["HLA-B*07:02"] status = percent_rank_status_df(predictor, alleles) assert status.to_dict("records") == [ { "allele": "HLA-A*02:01", "normalized_allele": "HLA-A*02:01", "supported": True, "has_affinity_percent_rank": True, "affinity_percent_rank_source_allele": "HLA-A*02:01", }, { "allele": "HLA-A*02:02", "normalized_allele": "HLA-A*02:02", "supported": True, "has_affinity_percent_rank": True, "affinity_percent_rank_source_allele": "HLA-A*02:01", }, { "allele": "HLA-B*07:02", "normalized_allele": "HLA-B*07:02", "supported": True, "has_affinity_percent_rank": False, "affinity_percent_rank_source_allele": "", }, ] def test_list_percent_rank_status_stdout_starts_with_csv_header( monkeypatch, tmp_path, capsys): import mhcflurry.cli.calibrate_percentile_ranks_command as mod def fake_status(args): print("allele,normalized_allele") print("HLA-A*02:01,HLA-A*02:01") return 0 monkeypatch.setattr( mod, "run_class1_affinity_percent_rank_status", fake_status) assert mod.run([ "--models-dir", str(tmp_path), "--list-percent-rank-status", ]) == 0 stdout = capsys.readouterr().out assert stdout.startswith("allele,normalized_allele\n") assert "random seed" not in stdout class FakeAffinityPredictorForAlleleSelection(object): supported_alleles = ["HLA-A*02:01", "HLA-B*07:02"] def __init__(self): self.canonicalized = [] def canonicalize_allele_name(self, allele): self.canonicalized.append(allele) return "canonical-%s" % allele def test_requested_calibration_alleles_uses_presentation_affinity_predictor(): from mhcflurry.calibrate_percentile_ranks_command import ( requested_calibration_alleles, ) affinity_predictor = FakeAffinityPredictorForAlleleSelection() predictor = Class1PresentationPredictor( affinity_predictor=affinity_predictor) args = SimpleNamespace( allele=["HLA-A*02:01", "HLA-B*07:02"], alleles_file=None, ) assert not hasattr(predictor, "canonicalize_allele_name") assert requested_calibration_alleles(args, predictor) == [ "canonical-HLA-A*02:01", "canonical-HLA-B*07:02", ] assert affinity_predictor.canonicalized == [ "HLA-A*02:01", "HLA-B*07:02", ] def test_requested_calibration_alleles_file_uses_presentation_affinity_predictor( tmp_path): from mhcflurry.calibrate_percentile_ranks_command import ( requested_calibration_alleles, ) alleles_file = tmp_path / "alleles.csv" alleles_file.write_text( "allele\nHLA-A*02:01\nCaja-B5*01:01ps\nHLA-B*07:02\n") affinity_predictor = FakeAffinityPredictorForAlleleSelection() predictor = Class1PresentationPredictor( affinity_predictor=affinity_predictor) args = SimpleNamespace(allele=None, alleles_file=str(alleles_file)) assert requested_calibration_alleles(args, predictor) == [ "canonical-HLA-A*02:01", "canonical-HLA-B*07:02", ] assert affinity_predictor.canonicalized == [ "HLA-A*02:01", "HLA-B*07:02", ] def test_filter_canonicalizable_alleles_memoizes_repeats(): """Duplicate alleles in the input each get evaluated once.""" from mhcflurry.common import filter_canonicalizable_alleles raw = ["HLA-A*02:01"] * 5 + ["Caja-B5*01:01ps"] * 5 + ["HLA-B*07:02"] kept = filter_canonicalizable_alleles(raw) assert kept.count("HLA-A*02:01") == 5 # all kept assert kept.count("HLA-B*07:02") == 1 assert "Caja-B5*01:01ps" not in kept if __name__ == "__main__": # run_and_check(n_jobs=0, delete=False) # run_and_check(n_jobs=2, delete=False) test_run_cluster_parallelism(delete=False) mhcflurry-2.3.6/test/test_calibrate_percentile_ranks_fast.py000066400000000000000000001211711525677230600245200ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Parity + perf tests for ``Class1AffinityPredictor.calibrate_percentile_ranks_fast``. The fast path batches many alleles into a single forward after caching the peptide-side activations per network. The parity test anchors that the alternative schedule produces the same ``PercentRankTransform`` as the slow legacy path; the smoke test anchors that it actually runs end to end against a downloaded pan-allele release. """ import torch import numpy import pandas import pytest from mhcflurry import Class1AffinityPredictor from mhcflurry import common from mhcflurry.affinity import calibration_sizing from mhcflurry.common import positional_frequency_matrix, random_peptides from mhcflurry.class1_neural_network import cartesian_output_log_ic50_sum from mhcflurry.motif_summary import ( prepare_motif_summary_state_gpu, motif_summary_chunk_gpu, ) from mhcflurry.downloads import get_path from mhcflurry.encodable_sequences import EncodableSequences from mhcflurry.regression_target import to_ic50 from . import available_torch_accelerators def _load_downloaded_pan_allele(): try: models_dir = get_path("models_class1_pan", "models.combined") except Exception as exc: pytest.skip(f"public pan-allele models not available: {exc}") return Class1AffinityPredictor.load(models_dir, optimization_level=0) def _pick_alleles(predictor, n): # Deterministic, and prefer alleles with clearly different motifs so # end-to-end motif-summary tests don't depend on near-identical A*01 # variants being separated by random peptide sampling noise. available = set(predictor.allele_to_sequence) preferred = [ "HLA-A*02:01", "HLA-B*07:02", "HLA-C*07:02", "HLA-A*01:01", "HLA-B*08:01", "HLA-C*04:01", ] candidates = [allele for allele in preferred if allele in available] candidates.extend( allele for allele in sorted(available) if allele not in candidates ) assert len(candidates) >= 2, "Need at least 2 HLA alleles for parity" return candidates[:n] def _legacy_motif_summary_from_predictions( peptides, predictions, alleles, summary_top_peptide_fractions): frequency_matrices = [] length_distributions = [] for allele_i, allele in enumerate(alleles): df = pandas.DataFrame({ "peptide": peptides, "prediction": predictions[allele_i], }).drop_duplicates("peptide").set_index("peptide") df["length"] = df.index.str.len() for (length, sub_df) in df.groupby("length"): for cutoff_fraction in summary_top_peptide_fractions: selected = sub_df.prediction.nsmallest( max(int(len(sub_df) * cutoff_fraction), 1), ).index.values matrix = positional_frequency_matrix(selected).reset_index() original_columns = list(matrix.columns) matrix["allele"] = allele matrix["length"] = length matrix["cutoff_fraction"] = cutoff_fraction matrix["cutoff_count"] = len(selected) matrix = matrix[ ["allele", "length", "cutoff_fraction", "cutoff_count"] + original_columns ] frequency_matrices.append(matrix) for cutoff_fraction in summary_top_peptide_fractions: cutoff_count = max(int(len(df) * cutoff_fraction), 1) length_distribution = df.prediction.nsmallest( cutoff_count, ).index.str.len().value_counts() length_distribution.index.name = "length" length_distribution /= length_distribution.sum() length_distribution = length_distribution.to_frame("fraction") length_distribution = length_distribution.reset_index() length_distribution["allele"] = allele length_distribution["cutoff_fraction"] = cutoff_fraction length_distribution["cutoff_count"] = cutoff_count length_distribution = length_distribution[[ "allele", "cutoff_fraction", "cutoff_count", "length", "fraction", ]].sort_values(["cutoff_fraction", "length"]) length_distributions.append(length_distribution) return { "frequency_matrices": pandas.concat( frequency_matrices, ignore_index=True, ), "length_distributions": pandas.concat( length_distributions, ignore_index=True, ), } def test_motif_summary_gpu_helper_matches_legacy_edge_cases(): peptides = [ "AA", "CC", "DD", "EE", "FF", "AZ", # Z should be treated like X: dropped from the 20 AA columns. "GGG", "HHH", "GGG", # Duplicate should keep the first prediction, not this one. "ACDEFGHIKLMNPQRS", # Observed length outside the default 8-15 range. "AZDEFGHIKLMNPQRS", ] alleles = ["allele-a", "allele-b"] predictions = numpy.asarray([ [1.0, 1.0, 1.0, 1.0, 0.0, 2.0, 9.0, 1.0, 0.0, 2.0, 3.0], [7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 0.0, 5.0, 0.0, 1.0, 1.0], ]) cutoff_fractions = (0.4, 1.0) state = prepare_motif_summary_state_gpu( EncodableSequences.create(peptides), torch.device("cpu"), ) fast_freq, fast_ld = motif_summary_chunk_gpu( torch.from_numpy(predictions), state, cutoff_fractions, alleles, ) fast_summary = { "frequency_matrices": pandas.concat(fast_freq, ignore_index=True), "length_distributions": pandas.concat(fast_ld, ignore_index=True), } legacy_summary = _legacy_motif_summary_from_predictions( peptides, predictions, alleles, cutoff_fractions, ) freq_sort = ["allele", "length", "cutoff_fraction", "position"] pandas.testing.assert_frame_equal( legacy_summary["frequency_matrices"].sort_values( freq_sort, ).reset_index(drop=True), fast_summary["frequency_matrices"].sort_values( freq_sort, ).reset_index(drop=True), check_exact=False, rtol=0, atol=0, ) ld_sort = ["allele", "cutoff_fraction", "length"] pandas.testing.assert_frame_equal( legacy_summary["length_distributions"].sort_values( ld_sort, ).reset_index(drop=True), fast_summary["length_distributions"].sort_values( ld_sort, ).reset_index(drop=True), check_exact=False, rtol=0, atol=0, ) def test_fast_calibration_output_aggregation_handles_merged_concatenate(): class MergedConcatenate: merge_method = "concatenate" networks = [object(), object()] output = torch.tensor( [ [[0.2, 0.4], [0.6, 0.8]], [[0.1, 0.3], [0.5, 0.7]], ], dtype=torch.float32, ) log50000 = float(numpy.log(50000.0)) contribution, count = ( cartesian_output_log_ic50_sum( output, MergedConcatenate(), log50000, torch.float64, ) ) expected = ((1.0 - output).to(torch.float64) * log50000).sum(dim=-1) assert count == 2 torch.testing.assert_close(contribution, expected, rtol=0, atol=0) def test_fast_calibration_output_aggregation_uses_first_normal_output(): class NormalModel: pass output = torch.tensor( [[[0.2, 0.4], [0.6, 0.8]]], dtype=torch.float32, ) log50000 = float(numpy.log(50000.0)) contribution, count = ( cartesian_output_log_ic50_sum( output, NormalModel(), log50000, torch.float64, ) ) expected = (1.0 - output[..., 0]).to(torch.float64) * log50000 assert count == 1 torch.testing.assert_close(contribution, expected, rtol=0, atol=0) @pytest.mark.slow @pytest.mark.integration def test_calibrate_fast_optimized_merged_matches_unoptimized_fast(): unoptimized = _load_downloaded_pan_allele() optimized = _load_downloaded_pan_allele() assert optimized.optimize() alleles = _pick_alleles(unoptimized, 2) peptides = random_peptides(250, length=9) bins = to_ic50(numpy.linspace(1, 0, 51)) for predictor in (unoptimized, optimized): predictor.allele_to_percent_rank_transform = {} predictor.calibrate_percentile_ranks_fast( peptides=peptides, alleles=alleles, bins=bins, motif_summary=False, allele_batch_size=2, peptide_batch_size=100, device=torch.device("cpu"), ) for allele in alleles: a = unoptimized.allele_to_percent_rank_transform[allele] b = optimized.allele_to_percent_rank_transform[allele] numpy.testing.assert_allclose(a.bin_edges, b.bin_edges, rtol=0, atol=0) numpy.testing.assert_allclose(a.cdf, b.cdf, rtol=0, atol=1e-12) @pytest.mark.slow @pytest.mark.integration @pytest.mark.parametrize("method", ["histogram", "compact"]) def test_calibrate_fast_parity_with_legacy_path(method): predictor = _load_downloaded_pan_allele() alleles = _pick_alleles(predictor, 4) peptides = random_peptides(2000, length=9) # Run legacy path legacy = Class1AffinityPredictor.load( get_path("models_class1_pan", "models.combined"), optimization_level=0, ) # Drop any existing transforms so we compare a fresh fit legacy.allele_to_percent_rank_transform = {} legacy.calibrate_percentile_ranks( peptides=peptides, alleles=alleles, motif_summary=False, method=method, ) # Run fast path. Pin to CPU so legacy (CPU/float64) and fast paths # produce bit-identical results — without this, MPS on macOS ends # up as the auto-picked device, which uses float32 and drifts. predictor.allele_to_percent_rank_transform = {} predictor.calibrate_percentile_ranks_fast( peptides=peptides, alleles=alleles, motif_summary=False, method=method, allele_batch_size=2, # exercise the batching boundary peptide_batch_size=500, device=torch.device("cpu"), ) for allele in alleles: a = legacy.allele_to_percent_rank_transform[allele] b = predictor.allele_to_percent_rank_transform[allele] if method == "compact": # Compare mapped scores, not knot locations: tiny inference # differences may change the greedy selection of adjacent knots. probes = numpy.geomspace(10, 10000, 100) numpy.testing.assert_allclose( a.transform(probes), b.transform(probes), rtol=0, atol=.1) assert a.selection["selected_knots"] in (64, 128) assert b.selection["selected_knots"] in (64, 128) continue # CDFs should match to within one peptide's contribution. The fast # path preserves the legacy semantics, but it uses torch kernels for # the batched schedule; a prediction that lands numerically on a bin # edge can fall on the other side on one Python / dependency stack. # # Tolerance is calibrated to this test's peptide count (one peptide # shift = 100/N percentile points). If you change ``peptides`` above, # the tolerance scales with it automatically — but the relative # tolerance per peptide should stay constant. Bin edges remain exact # because they're computed in float64 and not subject to bin-boundary # rounding. one_peptide_percent = 100.0 / len(peptides) numpy.testing.assert_allclose( a.cdf, b.cdf, rtol=0, atol=one_peptide_percent + 1e-9, err_msg=f"CDF mismatch for {allele}", ) numpy.testing.assert_allclose( a.bin_edges, b.bin_edges, rtol=0, atol=1e-12, err_msg=f"bin edges mismatch for {allele}", ) @pytest.mark.slow @pytest.mark.integration def test_calibrate_fast_parity_with_motif_summary(): predictor = _load_downloaded_pan_allele() alleles = _pick_alleles(predictor, 3) # Multi-length peptides so length_distributions is non-trivial rng = numpy.random.default_rng(123) peptides = ( random_peptides(800, length=9, rng=rng) + random_peptides(400, length=10, rng=rng) + random_peptides(200, length=11, rng=rng) ) legacy = Class1AffinityPredictor.load( get_path("models_class1_pan", "models.combined"), optimization_level=0, ) legacy.allele_to_percent_rank_transform = {} legacy_summary = legacy.calibrate_percentile_ranks( peptides=peptides, alleles=alleles, motif_summary=True, summary_top_peptide_fractions=[0.01], ) predictor.allele_to_percent_rank_transform = {} fast_summary = predictor.calibrate_percentile_ranks_fast( peptides=peptides, alleles=alleles, motif_summary=True, summary_top_peptide_fractions=(0.01,), allele_batch_size=3, peptide_batch_size=500, device=torch.device("cpu"), ) def _sort_key(df): return df.sort_values( [c for c in ["allele", "length", "cutoff_fraction"] if c in df.columns] ).reset_index(drop=True) # length_distributions should match exactly pandas.testing.assert_frame_equal( _sort_key(legacy_summary["length_distributions"]), _sort_key(fast_summary["length_distributions"]), check_exact=False, rtol=1e-10, atol=1e-12, ) # frequency_matrices: per-allele content must match the legacy slow # path. A separate synthetic test covers exact top-k tie behavior; # this end-to-end test keeps a small tolerance for numerical drift # near a real model's cutoff boundary. lf = legacy_summary["frequency_matrices"] ff = fast_summary["frequency_matrices"] assert set(lf.allele.unique()) == set(ff.allele.unique()) aa_columns = [c for c in lf.columns if len(c) == 1 and c.isalpha()] assert "A" in aa_columns and "Y" in aa_columns # Sanity: rows must sum close to 1 within each position (no X in # random_peptides, so should be exactly 1.0 modulo float rounding). fast_row_sums = ff[aa_columns].sum(axis=1) numpy.testing.assert_allclose(fast_row_sums, 1.0, rtol=0, atol=1e-9) # Sanity: different alleles must produce different motif matrices. fast_allele_signatures = ff.groupby("allele")[aa_columns].mean() assert fast_allele_signatures.nunique(axis=0).max() > 1, ( "all alleles produced identical motif matrices — per-allele " "topk is not selecting different peptide sets per row" ) for (allele, length, cutoff), sub_l in lf.groupby( ["allele", "length", "cutoff_fraction"] ): sub_f = ff[ (ff.allele == allele) & (ff.length == length) & (ff.cutoff_fraction == cutoff) ] assert len(sub_l) == len(sub_f) sub_l_sorted = sub_l.sort_values("position").reset_index(drop=True) sub_f_sorted = sub_f.sort_values("position").reset_index(drop=True) k = int(sub_l_sorted["cutoff_count"].iloc[0]) # Per-cell drift above one peptide's contribution would mean # the per-allele top-k selection diverged materially. diff = ( sub_l_sorted[aa_columns].to_numpy() - sub_f_sorted[aa_columns].to_numpy() ) max_abs = numpy.abs(diff).max() assert max_abs <= 1.0 / k + 1e-9, ( f"frequency-matrix drift {max_abs:.4g} exceeds 1/k = " f"{1.0 / k:.4g} for ({allele}, length={length}, " f"cutoff={cutoff}) — per-allele top-k diverged beyond ties" ) def test_check_training_batch_fits_shrinks_loudly_on_oom(caplog): """``check_training_batch_fits`` shrinks an oversized batch and logs a loud warning explaining the training-dynamics drift.""" import logging from mhcflurry.pytorch_sizing import ( check_training_batch_fits, TRAINING_PEAK_MULTIPLIER, estimate_peak_bytes_per_row, ) class FakeCUDA: """Pretend we're on CUDA with 8 GB free, 2 workers per GPU.""" def __init__(self): self.type = "cuda" def __str__(self): return "cuda:0" # Swap out free_device_memory_bytes for the duration of this test. from mhcflurry import pytorch_sizing saved = pytorch_sizing.free_device_memory_bytes try: pytorch_sizing.free_device_memory_bytes = lambda device: 8 * (1 << 30) class TinyModel: # Pretend peak row = 1 KB; 8 GB / 2 workers / 2 (0.5 fraction) # / (1024 * 4) = 1 M rows max — so 500k fits, 4M doesn't. peptide_encoding_shape = (15, 21) lc_layers = [] peptide_dense_layers = [] allele_embedding = None allele_dense_layers = [] class _Layer: out_features = 128 dense_layers = [_Layer] model = TinyModel() peak = estimate_peak_bytes_per_row(model) * TRAINING_PEAK_MULTIPLIER assert peak > 0 device = FakeCUDA() # Small batch — fits easily, no shrink, no warning. with caplog.at_level(logging.WARNING, logger="root"): fits, shrunk = check_training_batch_fits( 128, device, model, num_workers_per_gpu=2, ) assert not shrunk assert fits == 128 # Huge batch — definitely exceeds budget, must shrink + warn. caplog.clear() with caplog.at_level(logging.WARNING, logger="root"): fits, shrunk = check_training_batch_fits( 10_000_000, device, model, num_workers_per_gpu=2, ) assert shrunk assert 64 <= fits < 10_000_000 # Power-of-two floor. assert fits & (fits - 1) == 0 joined = " ".join(r.message for r in caplog.records) assert "TRAINING BATCH WILL NOT FIT" in joined assert "CHANGES TRAINING DYNAMICS" in joined finally: pytorch_sizing.free_device_memory_bytes = saved def test_check_training_batch_fits_can_forbid_release_shrink(monkeypatch): """Release provenance fails instead of accepting changed dynamics.""" from mhcflurry import pytorch_sizing class FakeCUDA: type = "cuda" def __str__(self): return "cuda:0" monkeypatch.setenv("MHCFLURRY_FAIL_ON_TRAINING_BATCH_SHRINK", "1") monkeypatch.setattr( pytorch_sizing, "device_memory_budget", lambda *args, **kwargs: pytorch_sizing.DeviceMemoryBudget( free_bytes=1 << 30, total_bytes=1 << 30, reserve_bytes=0, worker_entitlement_bytes=1, process_bytes=0, available_bytes=1, ), ) with pytest.raises(RuntimeError, match="forbidden"): pytorch_sizing.check_training_batch_fits( 128, FakeCUDA(), model=None) def test_check_training_batch_fits_does_not_force_unsafe_floor(monkeypatch): from mhcflurry import pytorch_sizing class FakeCUDA: type = "cuda" def __str__(self): return "cuda:0" monkeypatch.setattr( pytorch_sizing, "free_device_memory_bytes", lambda device: 0) effective, shrunk = pytorch_sizing.check_training_batch_fits( 64, FakeCUDA(), model=None, min_batch=64, ) assert shrunk assert effective == 1 @pytest.mark.parametrize( "backend,device_type", available_torch_accelerators(), ids=lambda value: value, ) def test_fit_end_to_end_shrinks_minibatch_when_vram_too_small( caplog, backend, device_type): """End-to-end: a tiny fit() on a mocked small-VRAM device should invoke ``check_training_batch_fits``, shrink the configured minibatch, record it in fit_info, and *not* mutate the predictor's saved hyperparameters dict. Exercises each available non-CPU backend. Ordinary tests default to CPU; accelerator coverage opts in explicitly. """ import logging from mhcflurry import pytorch_sizing from mhcflurry.class1_neural_network import Class1NeuralNetwork from mhcflurry.common import random_peptides # Override accelerator free-memory to be tiny so the shrink fires. saved_free = pytorch_sizing.free_device_memory_bytes old_backend = common._pytorch_backend try: common.configure_pytorch(backend=backend) pytorch_sizing.free_device_memory_bytes = lambda device: ( 128 * (1 << 20) if device.type == device_type else saved_free(device) ) hyperparameters = dict( activation="tanh", layer_sizes=[16], max_epochs=1, early_stopping=False, validation_split=0.0, locally_connected_layers=[], dense_layer_l1_regularization=0.0, dropout_probability=0.0, minibatch_size=524288, # absurdly big for 128MB — must shrink ) peptides = random_peptides(128, length=9) affinities = numpy.random.uniform(10, 50000, 128) predictor = Class1NeuralNetwork(**hyperparameters) with caplog.at_level(logging.WARNING, logger="root"): try: predictor.fit(peptides, affinities, verbose=0) except Exception: # Downstream eagerness may fail on the tiny harness; # the guard runs BEFORE any training work so fit_info # captures it regardless. pass joined = " ".join(r.message for r in caplog.records) assert "TRAINING BATCH WILL NOT FIT" in joined, ( "expected the loud shrink warning in the log. Captured: " + joined[:400] ) assert predictor.fit_info, "fit_info should be populated even on early failure" info = predictor.fit_info[-1] assert info.get("minibatch_size_shrunk_from") == 524288 effective = info.get("minibatch_size_shrunk_to") assert effective is not None and 1 <= effective < 524288, ( "shrunk minibatch must be positive and below the requested " "size, got %r" % effective ) assert info.get("effective_minibatch_size") == effective # Hyperparameters dict must NOT be mutated — the saved config # preserves the user's original intent. This is the fix for # the code/comment mismatch called out in the code review. assert predictor.hyperparameters["minibatch_size"] == 524288, ( "hyperparameters were mutated during fit(); the saved model " "config would no longer reflect the user's configured value" ) finally: pytorch_sizing.free_device_memory_bytes = saved_free common.configure_pytorch(backend=old_backend) def test_processing_nn_auto_batch_matches_explicit_size(): """``Class1ProcessingNeuralNetwork.predict_encoded`` with ``batch_size="auto"`` must produce bit-identical predictions to a pinned integer batch. The auto-size resolves device+model at call time; the only thing that should change is how many rows go through each forward, not the output. """ try: from mhcflurry.downloads import get_path from mhcflurry import Class1ProcessingPredictor except Exception as exc: pytest.skip(f"mhcflurry processing predictor imports unavailable: {exc}") # Public release ships multiple flank-mode variants under # models_class1_processing/; pick the with-flanks flavor since # the test passes explicit flanks. try: models_dir = get_path( "models_class1_processing", "models.selected.with_flanks", ) except Exception as exc: pytest.skip(f"public processing predictor not available: {exc}") processing = Class1ProcessingPredictor.load(models_dir) # Small dataset — correctness check, not perf. peptides = [ "SIINFEKL", "GILGFVFTL", "SLYNTVATL", "NLVPMVATV", "ELAGIGILTV", "KVAELVHFL", "TLDSQVMSL", "YVDPVITSI", ] n_flanks = ["" for _ in peptides] c_flanks = ["" for _ in peptides] # Pinned batch pinned = processing.predict( peptides=peptides, n_flanks=n_flanks, c_flanks=c_flanks, batch_size=2, ) # Auto batch auto = processing.predict( peptides=peptides, n_flanks=n_flanks, c_flanks=c_flanks, batch_size="auto", ) numpy.testing.assert_allclose( pinned, auto, rtol=0, atol=1e-6, err_msg="auto-sized processing predict must match pinned-size output", ) def test_compute_prediction_batch_size_scales_with_memory_and_workers(): """``compute_prediction_batch_size`` respects free VRAM and the workers-per-GPU partition.""" from mhcflurry.pytorch_sizing import ( compute_prediction_batch_size, AUTO_BATCH_CPU_FALLBACK, AUTO_BATCH_MAX_ROWS, AUTO_BATCH_MIN_ROWS, ) cpu = torch.device("cpu") # CPU short-circuit: fixed fallback regardless of workers / memory. # Large batches on CPU thrash L3 and don't help the small networks # mhcflurry trains. assert compute_prediction_batch_size(cpu) == AUTO_BATCH_CPU_FALLBACK assert compute_prediction_batch_size( cpu, num_workers_per_gpu=16, ) == AUTO_BATCH_CPU_FALLBACK # Model=None (fallback estimate) still produces a within-bounds # batch on MPS/CUDA if either is available locally. if torch.backends.mps.is_available() or torch.cuda.is_available(): dev = ( torch.device("cuda") if torch.cuda.is_available() else torch.device("mps") ) single = compute_prediction_batch_size(dev) shared = compute_prediction_batch_size(dev, num_workers_per_gpu=8) assert AUTO_BATCH_MIN_ROWS <= single <= AUTO_BATCH_MAX_ROWS assert AUTO_BATCH_MIN_ROWS <= shared <= AUTO_BATCH_MAX_ROWS # Sharing the GPU with 8 workers partitions the budget — each # worker's batch is no larger than the unshared case. Equality # is allowed because the min_rows floor clamps both cases # when free memory is tight. assert shared <= single def test_compute_prediction_batch_size_drops_below_floor_when_memory_is_tight( monkeypatch): """The performance floor must not force an unsafe CUDA batch.""" from mhcflurry import pytorch_sizing class FakeCUDA: type = "cuda" monkeypatch.setattr( pytorch_sizing, "free_device_memory_bytes", lambda device: 16 * (1 << 20), ) monkeypatch.setattr( pytorch_sizing, "estimate_peak_bytes_per_row", lambda model: 1 << 20, ) batch_size = pytorch_sizing.compute_prediction_batch_size( FakeCUDA(), num_workers_per_gpu=4, ) assert 1 <= batch_size < pytorch_sizing.AUTO_BATCH_MIN_ROWS def test_calibrate_auto_size_uses_reserved_headroom_not_cache_safety(monkeypatch): """A production-like A100-40GB calibration should not collapse to the minimum batch just because the exact peptide-stage cache is large. Regression for a 4xA100 run where the previous formula used only 60% of free memory and multiplied the entire fixed cache by 1.3, forcing ``peptide_batch=2000, allele_batch=1`` despite ~28 GB free. """ from mhcflurry import pytorch_sizing class FakeCUDA: type = "cuda" class Dense: out_features = 7560 class SubNet: peptide_encoding_shape = (15, 21) lc_layers = [] peptide_dense_layers = [Dense()] allele_embedding = None allele_dense_layers = [] dense_layers = [Dense()] class Merged: networks = [SubNet() for _ in range(8)] monkeypatch.delenv( "MHCFLURRY_CALIBRATE_AUTO_FREE_MEMORY_FRACTION", raising=False) monkeypatch.delenv( "MHCFLURRY_CALIBRATE_AUTO_RESERVE_FRACTION", raising=False) monkeypatch.delenv("MHCFLURRY_CALIBRATE_AUTO_RESERVE_GB", raising=False) monkeypatch.delenv( "MHCFLURRY_CALIBRATE_AUTO_FIXED_SAFETY_MULTIPLIER", raising=False) monkeypatch.setattr( pytorch_sizing, "free_device_memory_bytes", lambda device: int(28.63 * (1 << 30)), ) peptide_batch, allele_batch = ( calibration_sizing.auto_size_calibration_batches( Merged(), FakeCUDA(), n_peptides=50_000, n_alleles=30, num_workers_per_gpu=1, num_cached_networks=8, peptide_feature_dim=7560, num_sub_networks=8, ) ) assert allele_batch >= 10 assert peptide_batch > 2500 assert allele_batch * peptide_batch > 40_000 assert ( numpy.ceil(30 / allele_batch) * numpy.ceil(50_000 / peptide_batch) ) <= 40 def test_calibrate_auto_size_still_floors_when_cache_does_not_fit( monkeypatch, caplog): """The looser headroom budget still keeps the minimum-batch fallback when the exact cache plus scratch genuinely exceeds available VRAM.""" import logging from mhcflurry import pytorch_sizing class FakeCUDA: type = "cuda" class Dense: out_features = 7560 class SubNet: peptide_encoding_shape = (15, 21) lc_layers = [] peptide_dense_layers = [Dense()] allele_embedding = None allele_dense_layers = [] dense_layers = [Dense()] class Merged: networks = [SubNet() for _ in range(8)] monkeypatch.setattr( pytorch_sizing, "free_device_memory_bytes", lambda device: int(16 * (1 << 30)), ) with caplog.at_level(logging.WARNING, logger="root"): peptide_batch, allele_batch = ( calibration_sizing.auto_size_calibration_batches( Merged(), FakeCUDA(), n_peptides=50_000, n_alleles=30, num_workers_per_gpu=1, num_cached_networks=8, peptide_feature_dim=7560, num_sub_networks=8, ) ) assert (peptide_batch, allele_batch) == (2000, 1) assert "Falling back to minimum batch" in " ".join( record.message for record in caplog.records) def test_calibrate_auto_size_honors_lower_fraction_budget(monkeypatch): """When the free-memory fraction is lower than reserved headroom, calibration auto-sizing must use the lower budget.""" from mhcflurry import pytorch_sizing class FakeCUDA: type = "cuda" class Dense: out_features = 1024 class Model: peptide_encoding_shape = (15, 21) lc_layers = [] peptide_dense_layers = [Dense()] allele_embedding = None allele_dense_layers = [] dense_layers = [Dense()] monkeypatch.setenv("MHCFLURRY_CALIBRATE_AUTO_FREE_MEMORY_FRACTION", "0.25") monkeypatch.setenv("MHCFLURRY_CALIBRATE_AUTO_RESERVE_FRACTION", "0.10") monkeypatch.setenv("MHCFLURRY_CALIBRATE_AUTO_RESERVE_GB", "1.0") monkeypatch.setattr( pytorch_sizing, "free_device_memory_bytes", lambda device: int(40 * (1 << 30)), ) low_fraction_batch = ( calibration_sizing.auto_size_calibration_batches( Model(), FakeCUDA(), n_peptides=50_000, n_alleles=100, num_workers_per_gpu=1, num_cached_networks=0, peptide_feature_dim=1024, num_sub_networks=1, ) ) monkeypatch.setenv("MHCFLURRY_CALIBRATE_AUTO_FREE_MEMORY_FRACTION", "0.85") default_fraction_batch = ( calibration_sizing.auto_size_calibration_batches( Model(), FakeCUDA(), n_peptides=50_000, n_alleles=100, num_workers_per_gpu=1, num_cached_networks=0, peptide_feature_dim=1024, num_sub_networks=1, ) ) assert ( low_fraction_batch[0] * low_fraction_batch[1] < default_fraction_batch[0] * default_fraction_batch[1] ) def test_calibrate_auto_size_honors_lower_reserved_headroom(monkeypatch): """When reserved headroom is lower than the fraction budget, calibration auto-sizing must use the lower budget.""" from mhcflurry import pytorch_sizing class FakeCUDA: type = "cuda" class Dense: out_features = 1024 class Model: peptide_encoding_shape = (15, 21) lc_layers = [] peptide_dense_layers = [Dense()] allele_embedding = None allele_dense_layers = [] dense_layers = [Dense()] monkeypatch.setenv("MHCFLURRY_CALIBRATE_AUTO_FREE_MEMORY_FRACTION", "0.95") monkeypatch.setenv("MHCFLURRY_CALIBRATE_AUTO_RESERVE_GB", "20.0") monkeypatch.setattr( pytorch_sizing, "free_device_memory_bytes", lambda device: int(40 * (1 << 30)), ) high_reserve_batch = ( calibration_sizing.auto_size_calibration_batches( Model(), FakeCUDA(), n_peptides=50_000, n_alleles=100, num_workers_per_gpu=1, num_cached_networks=0, peptide_feature_dim=1024, num_sub_networks=1, ) ) monkeypatch.setenv("MHCFLURRY_CALIBRATE_AUTO_RESERVE_GB", "1.0") low_reserve_batch = ( calibration_sizing.auto_size_calibration_batches( Model(), FakeCUDA(), n_peptides=50_000, n_alleles=100, num_workers_per_gpu=1, num_cached_networks=0, peptide_feature_dim=1024, num_sub_networks=1, ) ) assert ( high_reserve_batch[0] * high_reserve_batch[1] < low_reserve_batch[0] * low_reserve_batch[1] ) def test_calibrate_auto_size_reused_cache_uses_current_free_memory( monkeypatch, caplog): """A resident peptide-stage cache should not be counted twice. Production calibration reuses the same peptide-stage cache across many allele shards in each worker. After the first shard, CUDA free memory already excludes the cache, so auto-sizing should reserve only scratch and cartesian-forward memory instead of falling back to ``2000 x 1``. """ import logging from mhcflurry import pytorch_sizing class FakeCUDA: type = "cuda" class Dense: out_features = 8505 class SubNet: peptide_encoding_shape = (15, 21) lc_layers = [] peptide_dense_layers = [Dense()] allele_embedding = None allele_dense_layers = [] dense_layers = [Dense()] class Merged: networks = [SubNet() for _ in range(9)] monkeypatch.setattr( pytorch_sizing, "free_device_memory_bytes", lambda device: int(18.79 * (1 << 30)), ) with caplog.at_level(logging.WARNING, logger="root"): peptide_batch, allele_batch = ( calibration_sizing.auto_size_calibration_batches( Merged(), FakeCUDA(), n_peptides=400_000, n_alleles=30, num_workers_per_gpu=1, num_cached_networks=0, peptide_feature_dim=8505, num_sub_networks=9, ) ) assert allele_batch > 1 assert peptide_batch > 2000 assert allele_batch * peptide_batch > 40_000 assert "Falling back to minimum batch" not in " ".join( record.message for record in caplog.records) def test_peptide_sequences_fingerprint_distinguishes_middle_changes(): """Same length, first, last → different middle must yield different keys. Regression for the legacy ``(count, first, last)`` cache_signature which collided whenever the middle peptides differed but the boundary peptides matched. Reusing a stale peptide-stage cache in that case silently produced wrong PercentRankTransforms. """ a = calibration_sizing.peptide_sequences_fingerprint(["AAAA", "BBBB", "CCCC"]) b = calibration_sizing.peptide_sequences_fingerprint(["AAAA", "XXXX", "CCCC"]) assert a != b def test_peptide_sequences_fingerprint_length_prefix_prevents_concat_collision(): """Length prefixing prevents the trivial concatenation collision.""" assert ( calibration_sizing.peptide_sequences_fingerprint(["AB", "C"]) != calibration_sizing.peptide_sequences_fingerprint(["A", "BC"]) ) def test_peptide_sequences_fingerprint_order_sensitive(): """Reordering the same peptides must change the fingerprint.""" assert ( calibration_sizing.peptide_sequences_fingerprint(["A", "B"]) != calibration_sizing.peptide_sequences_fingerprint(["B", "A"]) ) def test_calibration_stage_cache_signature_omits_build_batch_size(): """The peptide-stage cache is independent of the fill chunk size.""" encoded = EncodableSequences.create(["AAAA", "CCCC"]) networks = [object()] first = calibration_sizing.calibration_stage_cache_signature( encoded, networks, torch.device("cpu"), ) second = calibration_sizing.calibration_stage_cache_signature( encoded, networks, torch.device("cpu"), ) assert first == second assert len(first) == 3 def test_calibration_fast_cache_state_lifecycle(): """The fast-calibration cache is lazy and ``clear`` releases it.""" predictor = Class1AffinityPredictor() assert getattr(predictor, "_calibration_fast_cache_state", None) is None cache = calibration_sizing.calibration_fast_cache(predictor) assert isinstance(cache, calibration_sizing.CalibrationFastCache) assert calibration_sizing.calibration_fast_cache(predictor) is cache cache.cached_stages = ["sentinel"] cache.stage_signature = ("sig",) predictor.clear_calibration_fast_cache() assert getattr(predictor, "_calibration_fast_cache_state", None) is None # clearing again is a no-op predictor.clear_calibration_fast_cache() def test_calibrate_fast_rejects_scalar_bins_before_model_work(): predictor = Class1AffinityPredictor( class1_pan_allele_models=[object()], allele_to_sequence={"A": "AAAAAAAA"}, ) with pytest.raises(ValueError, match="requires explicit IC50 bin edges"): predictor.calibrate_percentile_ranks_fast( peptides=["AAAA"], alleles=["A"], bins=3, peptide_batch_size=1, allele_batch_size=1, device="cpu", ) @pytest.mark.parametrize( ("keyword", "value"), [ ("peptide_batch_size", 0), ("peptide_batch_size", -1), ("allele_batch_size", 0), ("allele_batch_size", -1), ], ) def test_calibrate_fast_rejects_nonpositive_batches_before_model_work( keyword, value): predictor = Class1AffinityPredictor( class1_pan_allele_models=[object()], allele_to_sequence={"A": "AAAAAAAA"}, ) kwargs = { "peptides": ["AAAA"], "alleles": ["A"], "bins": [1.0, 2.0], "peptide_batch_size": "auto", "allele_batch_size": "auto", "device": "cpu", } kwargs[keyword] = value with pytest.raises(ValueError, match="%s must be at least 1" % keyword): predictor.calibrate_percentile_ranks_fast(**kwargs) def test_calibrate_fast_cache_signature_cleared_if_rebuild_fails(): class FailingModel: def to(self, device): return self def eval(self): return self class FailingNetwork: def allele_encoding_to_network_input(self, allele_encoding): return None, object() def set_allele_representations(self, allele_representations): pass def network(self, borrow=True): return FailingModel() def peptides_to_network_input(self, encoded_peptides): raise RuntimeError("intentional cache rebuild failure") def uses_peptide_torch_encoding(self): return True predictor = Class1AffinityPredictor( class1_pan_allele_models=[FailingNetwork()], allele_to_sequence={"A": "AAAAAAAA"}, ) cache = calibration_sizing.calibration_fast_cache(predictor) cache.stage_signature = ("old-signature",) cache.cached_stages = ["old-cache"] with pytest.raises(RuntimeError, match="intentional cache rebuild failure"): predictor.calibrate_percentile_ranks_fast( peptides=["AAAA"], alleles=["A"], bins=numpy.array([0.0, 1.0, 2.0]), peptide_batch_size=1, allele_batch_size=1, device="cpu", ) assert cache.stage_signature is None assert cache.cached_stages is None mhcflurry-2.3.6/test/test_changing_allele_representations.py000066400000000000000000000072201525677230600245440ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import pandas import pytest from mhcflurry.class1_affinity_predictor import Class1AffinityPredictor from mhcflurry.downloads import get_path from mhcflurry.pseudosequences import LEGACY_ALLELE_SEQUENCES_FILENAME from mhcflurry.testing_utils import cleanup, startup pytest.fixture(autouse=True, scope="module") def setup_module(): startup() yield cleanup() ALLELE_TO_SEQUENCE = pandas.read_csv( get_path( "allele_sequences", LEGACY_ALLELE_SEQUENCES_FILENAME), index_col=0).sequence.to_dict() HYPERPARAMETERS = { 'activation': 'tanh', 'allele_dense_layer_sizes': [], 'batch_normalization': False, 'dense_layer_l1_regularization': 0.0, 'dense_layer_l2_regularization': 0.0, 'dropout_probability': 0.5, 'early_stopping': True, 'init': 'glorot_uniform', 'layer_sizes': [4], 'learning_rate': None, 'locally_connected_layers': [], 'loss': 'custom:mse_with_inequalities', 'max_epochs': 40, 'minibatch_size': 128, 'optimizer': 'rmsprop', 'output_activation': 'sigmoid', 'patience': 2, 'peptide_allele_merge_activation': '', 'peptide_allele_merge_method': 'concatenate', 'peptide_amino_acid_encoding': 'BLOSUM62', 'peptide_dense_layer_sizes': [], 'peptide_encoding': { 'alignment_method': 'left_pad_centered_right_pad', 'max_length': 15, 'vector_encoding_name': 'BLOSUM62', }, 'random_negative_affinity_max': 50000.0, 'random_negative_affinity_min': 20000.0, 'random_negative_constant': 0, 'random_negative_distribution_smoothing': 0.0, 'random_negative_match_distribution': True, 'random_negative_rate': 0.0, 'train_data': {}, 'validation_split': 0.1, } @pytest.mark.slow @pytest.mark.integration def test_changing_allele_representations(): allele1 = "HLA-A*02:01" allele2 = "HLA-C*03:04" allele3 = "HLA-B*07:02" peptide = "SIINFEKL" allele_to_sequence = {} for allele in [allele1, allele2]: allele_to_sequence[allele] = ALLELE_TO_SEQUENCE[allele] data1 = [] for i in range(5000): data1.append((allele1, peptide, 0, "=")) data1.append((allele2, peptide, 50000, "=")) data1 = pandas.DataFrame( data1, columns=["allele", "peptide", "affinity", "inequality"]) predictor = Class1AffinityPredictor(allele_to_sequence=allele_to_sequence) predictor.fit_class1_pan_allele_models( n_models=1, architecture_hyperparameters=HYPERPARAMETERS, alleles=data1.allele.values, peptides=data1.peptide.values, affinities=data1.affinity.values, inequalities=data1.inequality.values, seed=1) (value1, value2) = predictor.predict([peptide, peptide], alleles=[allele1, allele2]) assert value1 < 100, value1 assert value2 > 4000, value2 allele_to_sequence[allele3] = ALLELE_TO_SEQUENCE[allele3] predictor.allele_to_sequence = allele_to_sequence predictor.clear_cache() (value1, value2, value3) = predictor.predict( [peptide, peptide, peptide], alleles=[allele1, allele2, allele3]) assert value1 < 100, value1 assert value2 > 4000, value2 mhcflurry-2.3.6/test/test_class1_affinity_predictor.py000066400000000000000000000554341525677230600233070ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Tests for Class1AffinityPredictor.""" import pytest import tempfile import shutil import logging import shlex import warnings import traceback import sys import numpy import pandas from mhcflurry import Class1AffinityPredictor, Class1NeuralNetwork from mhcflurry.common import derive_seed from numpy import testing from mhcflurry.downloads import get_path from mhcflurry.percent_rank_transform import PercentRankTransform from mhcflurry.pseudosequences import ( LEGACY_ALLELE_SEQUENCES_FILENAME, LEGACY_CLASS1_PSEUDOSEQUENCES_FILENAME, PSEUDOSEQUENCE_FILENAMES_BY_LENGTH, ) from mhcflurry.testing_utils import cleanup, startup DOWNLOADED_PREDICTOR = None @pytest.fixture(autouse=True, scope="module") def setup_teardown(): """Load the downloaded predictor once for this module.""" global DOWNLOADED_PREDICTOR startup() try: DOWNLOADED_PREDICTOR = Class1AffinityPredictor.load() except Exception: DOWNLOADED_PREDICTOR = None logging.basicConfig(level=logging.DEBUG) yield DOWNLOADED_PREDICTOR = None cleanup() # To hunt down a weird warning we were seeing in pandas. def warn_with_traceback(message, category, filename, lineno, file=None, line=None): log = file if hasattr(file, "write") else sys.stderr traceback.print_stack(file=log) log.write(warnings.formatwarning(message, category, filename, lineno, line)) warnings.showwarning = warn_with_traceback def test_fit_class1_pan_allele_models_derives_member_seeds(monkeypatch): allele = "HLA-A*02:01" allele_to_sequence = pandas.read_csv( get_path("allele_sequences", LEGACY_ALLELE_SEQUENCES_FILENAME), index_col=0, ).sequence.to_dict() observed_seeds = [] def record_seed(_model, *_args, **kwargs): observed_seeds.append(kwargs["seed"]) monkeypatch.setattr(Class1NeuralNetwork, "fit", record_seed) predictor = Class1AffinityPredictor( allele_to_sequence={allele: allele_to_sequence[allele]}, ) predictor.fit_class1_pan_allele_models( n_models=2, architecture_hyperparameters={}, alleles=[allele], peptides=["SIINFEKL"], affinities=[50.0], inequalities=["="], seed=17, verbose=0, ) assert observed_seeds == [derive_seed(17, 0), derive_seed(17, 1)] def test_save_calibration_only_preserves_model_artifacts(tmp_path): manifest_path = tmp_path / "manifest.csv" info_path = tmp_path / "info.txt" allele_sequences_path = tmp_path / LEGACY_ALLELE_SEQUENCES_FILENAME optimization_info_path = tmp_path / "optimization_info.json" motif_summary_path = tmp_path / "motif_summary.csv.bz2" manifest_text = ( "model_name,allele,config_json\n" "PAN-CLASS1-0,pan-class1,\"{}\"\n" "PAN-CLASS1-1,pan-class1,\"{}\"\n" ) info_text = "trained on\toriginal release\n" allele_sequences_text = "allele,sequence\nHLA-A*02:01,ORIGINAL\n" manifest_path.write_text(manifest_text) info_path.write_text(info_text) allele_sequences_path.write_text(allele_sequences_text) transform = PercentRankTransform() transform.fit(numpy.array([10.0, 20.0, 30.0]), bins=3) predictor = Class1AffinityPredictor( allele_to_sequence={"HLA-A*02:01": "REWRITTEN"}, allele_to_percent_rank_transform={"HLA-A*02:01": transform}, metadata_dataframes={ "motif_summary": pandas.DataFrame({ "allele": ["HLA-A*02:01"], "value": [1.0], }), }, optimization_info={ "pan_models_merged": True, "num_pan_models_merged": 2, }, ) predictor.save(str(tmp_path), model_names_to_write=[]) assert manifest_path.read_text() == manifest_text assert info_path.read_text() == info_text assert allele_sequences_path.read_text() == allele_sequences_text assert not (tmp_path / PSEUDOSEQUENCE_FILENAMES_BY_LENGTH[37]).exists() assert not optimization_info_path.exists() motif_summary = pandas.read_csv(motif_summary_path) assert motif_summary.to_dict("list") == { "allele": ["HLA-A*02:01"], "value": [1.0], } percent_ranks = pandas.read_csv(tmp_path / "percent_ranks.csv") assert "HLA-A*02:01" in percent_ranks.columns def test_load_accepts_legacy_class1_pseudosequences_file(tmp_path): (tmp_path / "manifest.csv").write_text("model_name,allele,config_json\n") (tmp_path / LEGACY_CLASS1_PSEUDOSEQUENCES_FILENAME).write_text( "allele,pseudosequence\n" "HLA-A*02:01,YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY\n" ) predictor = Class1AffinityPredictor.load( str(tmp_path), optimization_level=0, ) assert predictor.allele_to_sequence == { "HLA-A*02:01": "YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY", } def test_load_skips_incomplete_non_class1_pseudosequences_with_mhcgnomes( tmp_path): (tmp_path / "manifest.csv").write_text("model_name,allele,config_json\n") (tmp_path / LEGACY_ALLELE_SEQUENCES_FILENAME).write_text( "allele,sequence\n" "HLA-A*02:01,COMPLETE\n" "HLA-DQB1*06:02,COMPLETECLASSII\n" "HLA-DQA1*01:01,XXCLASSII\n" "TAP1,XXTAP\n" "SLA-TAP*1*01:01,XXLEGACYTAP\n" "SLA-TAP0,XXNEARBYTAP\n" "Caja-PS*02:01,XXLEGACYPS\n" "Caja-PS0*02:01,XXNEARBYPS\n" "Caja-DAA*01:01,XXLEGACYDAA\n" "Caja-DAB*01:01,XXLEGACYDAB\n" "Caja-DRA*01:01,XXLENIENTDRA\n" "Caja-BLB*01:01,XXLENIENTBLB\n" "Geja-F10*01:01,XXLENIENTCLASSI\n" "Caja-B5*01:01ps,XXPSEUDOGENE\n" "HLA-H*02:01,XXHLAPSEUDOGENE\n" "Mamu-G*01:01,XXINHERITEDPSEUDOGENE\n" "Popy-Ap*01:01,XXINHERITEDPSEUDOGENE\n" "Poab-Ap*01:01,XXSCOPEDNONPSEUDOGENE\n" "NONSENSE,XXUNKNOWN\n" ) predictor = Class1AffinityPredictor.load( str(tmp_path), optimization_level=0, ) assert predictor.allele_to_sequence == { "HLA-A*02:01": "COMPLETE", # Inherited gene properties remain scoped to the exact species/locus # ontology entry. "Poab-Ap*01:01": "XXSCOPEDNONPSEUDOGENE", } assert "NONSENSE" not in predictor.supported_alleles def test_invalid_alleles_raise_or_return_row_aligned_nans(caplog): class ConstantModel: supported_peptide_lengths = (8, 15) def predict(self, peptides, **kwargs): return numpy.full(len(peptides), 123.0) predictor = Class1AffinityPredictor( allele_to_allele_specific_models={ "HLA-A*02:01": [ConstantModel()], }, ) invalid = [ "HLA-DQA1*01:01", "HLA-A2", "Caja-B5*01:01ps", "HLA-H*02:01", "HLA-A*02:01N", "HLA-A*02:01Q", "NONSENSE", ] with pytest.raises(ValueError, match="MHC class II allele"): predictor.predict( peptides=["SIINFEKL"], alleles=[invalid[0]], ) with caplog.at_level(logging.WARNING): result = predictor.predict_to_dataframe( peptides=["SIINFEKL"] * (len(invalid) + 1), alleles=["HLA-A0201"] + invalid, throw=False, include_percentile_ranks=False, include_confidence_intervals=False, ) assert result.allele.tolist() == ["HLA-A*02:01"] + invalid assert result.prediction.iloc[0] == pytest.approx(123.0) assert result.prediction.iloc[1:].isna().all() for expected in [ "MHC class II allele", "serotype is not a specific allele", "pseudogene MHC allele", "null-expression MHC allele", "questionable-expression MHC allele", "Invalid MHC allele name"]: assert expected in caplog.text assert predictor.canonicalize_allele_name( invalid[0], raise_on_error=False) is None ranks = predictor.percentile_ranks( [123.0], allele=invalid[0], throw=False) assert numpy.isnan(ranks).all() def test_tolerant_prediction_handles_nan_normalized_allele(monkeypatch): """Pandas may coerce the internal None sentinel to floating NaN.""" class ConstantModel: supported_peptide_lengths = (8, 15) def predict(self, peptides, **kwargs): return numpy.full(len(peptides), 123.0) predictor = Class1AffinityPredictor( allele_to_allele_specific_models={ "HLA-A*02:01": [ConstantModel()], }, ) monkeypatch.setattr( predictor, "_canonicalize_prediction_alleles", lambda alleles, throw: ["HLA-A*02:01", numpy.nan], ) result = predictor.predict_to_dataframe( peptides=["SIINFEKL", "SIINFEKL"], alleles=["HLA-A0201", "invalid"], throw=False, include_percentile_ranks=False, include_confidence_intervals=False, ) assert result.allele.tolist() == ["HLA-A*02:01", "invalid"] assert result.prediction.iloc[0] == pytest.approx(123.0) assert numpy.isnan(result.prediction.iloc[1]) @pytest.mark.parametrize("filename,sequence", [ ( PSEUDOSEQUENCE_FILENAMES_BY_LENGTH[34], "YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY", ), ( PSEUDOSEQUENCE_FILENAMES_BY_LENGTH[37], "YFAMYGEKVAHTHVDTLYGVRYDHYYTWAVLAYTWYA", ), ( PSEUDOSEQUENCE_FILENAMES_BY_LENGTH[39], "YFGERAMPYGEKVAHTHVDTLYGVRYHYYTWAVLAYTWY", ), ]) def test_load_accepts_named_pseudosequence_files(tmp_path, filename, sequence): (tmp_path / "manifest.csv").write_text("model_name,allele,config_json\n") (tmp_path / filename).write_text( "allele,pseudosequence\n" "HLA-A*02:01,%s\n" % sequence ) predictor = Class1AffinityPredictor.load( str(tmp_path), optimization_level=0, ) assert predictor.allele_to_sequence == {"HLA-A*02:01": sequence} @pytest.mark.parametrize("sequence,expected_filename", [ ( "YFAMYQENMAHTDANTLYIIYRDYTWVARVYRGY", PSEUDOSEQUENCE_FILENAMES_BY_LENGTH[34], ), ( "YFAMYGEKVAHTHVDTLYGVRYDHYYTWAVLAYTWYA", PSEUDOSEQUENCE_FILENAMES_BY_LENGTH[37], ), ( "YFGERAMPYGEKVAHTHVDTLYGVRYHYYTWAVLAYTWY", PSEUDOSEQUENCE_FILENAMES_BY_LENGTH[39], ), ]) def test_save_writes_named_pseudosequence_alias( tmp_path, sequence, expected_filename): predictor = Class1AffinityPredictor( allele_to_sequence={"HLA-A*02:01": sequence}, ) predictor.save(str(tmp_path)) legacy_df = pandas.read_csv( tmp_path / LEGACY_ALLELE_SEQUENCES_FILENAME) assert legacy_df.to_dict("list") == { "allele": ["HLA-A*02:01"], "sequence": [sequence], } named_df = pandas.read_csv(tmp_path / expected_filename) assert named_df.to_dict("list") == { "allele": ["HLA-A*02:01"], "pseudosequence": [sequence], } def test_merge_rejects_incompatible_pan_allele_pseudosequences(): first = Class1AffinityPredictor( class1_pan_allele_models=[Class1NeuralNetwork()], allele_to_sequence={"HLA-A*02:01": "SEQUENCE1"}, ) second = Class1AffinityPredictor( class1_pan_allele_models=[Class1NeuralNetwork()], allele_to_sequence={"HLA-A*02:01": "SEQUENCE2"}, ) with pytest.raises(ValueError, match="incompatible.*HLA-A\\*02:01"): Class1AffinityPredictor.merge([first, second]) def test_merge_in_place_rejects_incompatible_pseudosequences_atomically(): first_network = Class1NeuralNetwork() first = Class1AffinityPredictor( class1_pan_allele_models=[first_network], allele_to_sequence={"HLA-A*02:01": "SEQUENCE1"}, ) second = Class1AffinityPredictor( class1_pan_allele_models=[Class1NeuralNetwork()], allele_to_sequence={"HLA-A*02:01": "SEQUENCE2"}, ) with pytest.raises(ValueError, match="incompatible.*HLA-A\\*02:01"): first.merge_in_place([second]) assert first.class1_pan_allele_models == [first_network] assert first.allele_to_sequence == {"HLA-A*02:01": "SEQUENCE1"} def test_percent_rank_calibrated_allele_direct_equivalent_missing(): transform = PercentRankTransform() transform.fit(numpy.array([10.0, 20.0, 30.0]), bins=3) predictor = Class1AffinityPredictor( allele_to_sequence={ "HLA-A*02:01": "SEQUENCE1", "HLA-A*02:02": "SEQUENCE1", "HLA-B*07:02": "SEQUENCE2", }, allele_to_percent_rank_transform={"HLA-A*02:01": transform}, ) assert ( predictor.percent_rank_calibrated_allele("HLA-A*02:01") == "HLA-A*02:01" ) assert ( predictor.percent_rank_calibrated_allele("HLA-A*02:02") == "HLA-A*02:01" ) assert predictor.percent_rank_calibrated_allele("HLA-B*07:02") is None assert predictor.percent_rank_calibrated_allele("HLA-C*03:04") is None def test_missing_percent_rank_error_reports_calibration_command(tmp_path): models_dir = str(tmp_path / "models with spaces") predictor = Class1AffinityPredictor( allele_to_sequence={"HLA-A*02:01": "SEQUENCE1"}, provenance_string="generated on test date", models_dir=models_dir, ) with pytest.raises(ValueError) as err: predictor.percentile_ranks([50.0], allele="HLA-A*02:01") message = str(err.value) assert "Missing percentile-rank calibration for HLA-A*02:01" in message assert ( "Affinity predictions are available; percentile ranks are not." in message ) assert "generated on test date" not in message assert "0 model(s)" not in message assert "0 percent-rank calibration(s)" not in message assert "Calibrate with:" in message assert ( "mhcflurry-calibrate-percentile-ranks --models-dir %s " "--allele %s ..." % ( shlex.quote(models_dir), shlex.quote("HLA-A*02:01"), ) ) in message def test_missing_percent_rank_error_infers_models_dir_from_loaded_models(tmp_path): models_dir = str(tmp_path / "loaded models") network = Class1NeuralNetwork.from_config( {"hyperparameters": {}}, weight_paths=str(tmp_path / "loaded models" / "weights_PAN-CLASS1-0.npz"), ) assert "network_weight_paths" not in network.get_config() predictor = Class1AffinityPredictor( class1_pan_allele_models=[network], allele_to_sequence={"HLA-A*02:01": "SEQUENCE1"}, ) assert predictor.models_dir is None assert predictor.models_dir_for_diagnostics() == models_dir with pytest.raises(ValueError) as err: predictor.percentile_ranks([50.0], allele="HLA-A*02:01") message = str(err.value) assert "Calibrate with:" in message assert ( "mhcflurry-calibrate-percentile-ranks --models-dir %s " "--allele %s ..." % ( shlex.quote(models_dir), shlex.quote("HLA-A*02:01"), ) ) in message def predict_and_check( allele, peptide, predictor=DOWNLOADED_PREDICTOR, expected_range=(0, 500) ): def debug(): print( "\n%s" % ( predictor.predict_to_dataframe( peptides=[peptide], allele=allele, include_individual_model_predictions=True, ) ) ) (prediction,) = predictor.predict(allele=allele, peptides=[peptide]) assert prediction >= expected_range[0], (predictor, prediction, debug()) assert prediction <= expected_range[1], (predictor, prediction, debug()) @pytest.mark.slow @pytest.mark.integration def test_a1_known_epitopes_in_newly_trained_model(): allele = "HLA-A*01:01" df = pandas.read_csv( get_path("data_curated", "curated_training_data.affinity.csv.bz2") ) df = df.loc[ (df.allele == allele) & (df.peptide.str.len() >= 8) & (df.peptide.str.len() <= 15) ] hyperparameters = { "max_epochs": 100, "patience": 10, "early_stopping": True, "validation_split": 0.2, "random_negative_rate": 0.0, "random_negative_constant": 25, "peptide_amino_acid_encoding": "BLOSUM62", "use_embedding": False, "kmer_size": 15, "batch_normalization": False, "locally_connected_layers": [ {"filters": 8, "activation": "tanh", "kernel_size": 3} ], "activation": "relu", "output_activation": "sigmoid", "layer_sizes": [32], "random_negative_affinity_min": 20000.0, "random_negative_affinity_max": 50000.0, "dense_layer_l1_regularization": 0.001, "dropout_probability": 0.0, } predictor = Class1AffinityPredictor() predictor.fit_allele_specific_predictors( n_models=2, architecture_hyperparameters_list=[hyperparameters], allele=allele, peptides=df.peptide.values, affinities=df.measurement_value.values, verbose=0, ) predict_and_check("HLA-A*01:01", "EVDPIGHLY", predictor=predictor) models_dir = tempfile.mkdtemp("_models") print(models_dir) predictor.save(models_dir) predictor2 = Class1AffinityPredictor.load(models_dir) predict_and_check("HLA-A*01:01", "EVDPIGHLY", predictor=predictor2) shutil.rmtree(models_dir) predictor3 = Class1AffinityPredictor( allele_to_allele_specific_models={ allele: [predictor.allele_to_allele_specific_models[allele][0]] } ) predict_and_check("HLA-A*01:01", "EVDPIGHLY", predictor=predictor3) models_dir = tempfile.mkdtemp("_models") print(models_dir) predictor3.save(models_dir) predictor4 = Class1AffinityPredictor.load(models_dir) predict_and_check("HLA-A*01:01", "EVDPIGHLY", predictor=predictor4) shutil.rmtree(models_dir) @pytest.mark.slow @pytest.mark.integration def test_class1_affinity_predictor_a0205_memorize_training_data(): # Memorize the dataset. hyperparameters = dict( activation="tanh", layer_sizes=[64], max_epochs=100, early_stopping=False, validation_split=0.0, locally_connected_layers=[], dense_layer_l1_regularization=0.0, dropout_probability=0.0, ) allele = "HLA-A*02:05" df = pandas.read_csv( get_path("data_curated", "curated_training_data.affinity.csv.bz2") ) df = df.loc[df.allele == allele] df = df.loc[df.peptide.str.len() == 9] df = df.loc[df.measurement_type == "quantitative"] df = df.loc[df.measurement_source == "kim2014"] predictor = Class1AffinityPredictor() predictor.fit_allele_specific_predictors( n_models=2, architecture_hyperparameters_list=[hyperparameters], allele=allele, peptides=df.peptide.values, affinities=df.measurement_value.values, verbose=0, ) predictor.calibrate_percentile_ranks(num_peptides_per_length=1000) ic50_pred = predictor.predict(df.peptide.values, allele=allele) ic50_true = df.measurement_value.values assert len(ic50_pred) == len(ic50_true) testing.assert_allclose( numpy.log(ic50_pred), numpy.log(ic50_true), rtol=0.2, atol=0.2 ) ic50_pred_df = predictor.predict_to_dataframe(df.peptide.values, allele=allele) print(ic50_pred_df) assert "prediction_percentile" in ic50_pred_df.columns assert ic50_pred_df.prediction_percentile.isnull().sum() == 0 ic50_pred_df2 = predictor.predict_to_dataframe( df.peptide.values, allele=allele, include_individual_model_predictions=True ) print(ic50_pred_df2) # Test an unknown allele print("Starting unknown allele check") assert predictor.supported_alleles == [allele] ic50_pred = predictor.predict(df.peptide.values, allele="HLA-A*02:01", throw=False) assert numpy.isnan(ic50_pred).all() testing.assert_raises( ValueError, predictor.predict, df.peptide.values, allele="HLA-A*02:01" ) assert predictor.supported_alleles == [allele] testing.assert_raises(ValueError, predictor.predict, ["AAAAA"], allele=allele) # too short testing.assert_raises( ValueError, predictor.predict, ["AAAAAAAAAAAAAAAAAAAA"], # too long allele=allele, ) ic50_pred = predictor.predict( ["AAAAA", "AAAAAAAAA", "AAAAAAAAAAAAAAAAAAAA"], allele=allele, throw=False ) assert numpy.isnan(ic50_pred[0]) assert not numpy.isnan(ic50_pred[1]) assert numpy.isnan(ic50_pred[2]) def test_no_nans(): df = DOWNLOADED_PREDICTOR.predict_to_dataframe( alleles=["A02:01", "A02:02"], peptides=["SIINFEKL", "SIINFEKLL"] ) print(df) assert not df.isnull().any().any() def test_predict_implementations_equivalent(): for allele in ["HLA-A02:01", "A02:02"]: for centrality_measure in ["mean", "robust_mean"]: peptides = ["SIINFEKL", "SYYNFIIIKL", "SIINKFELQY"] pred1 = DOWNLOADED_PREDICTOR.predict( allele=allele, peptides=peptides + ["SSSN"], throw=False, centrality_measure=centrality_measure, ) pred2 = DOWNLOADED_PREDICTOR.predict_to_dataframe( allele=allele, peptides=peptides + ["SSSN"], throw=False, centrality_measure=centrality_measure, ).prediction.values testing.assert_almost_equal(pred1, pred2, decimal=2) pred1 = DOWNLOADED_PREDICTOR.predict( allele=allele, peptides=peptides, centrality_measure=centrality_measure ) pred2 = DOWNLOADED_PREDICTOR.predict_to_dataframe( allele=allele, peptides=peptides, centrality_measure=centrality_measure ).prediction.values testing.assert_almost_equal(pred1, pred2, decimal=2) def test_no_runtime_warnings_for_unsupported_rows(): with warnings.catch_warnings(): warnings.simplefilter("error", RuntimeWarning) df = DOWNLOADED_PREDICTOR.predict_to_dataframe( allele="HLA-A*02:01", peptides=["SIINFEKL", "SSSN"], throw=False, include_confidence_intervals=True, centrality_measure="mean", ) df2 = DOWNLOADED_PREDICTOR.predict_to_dataframe( allele="HLA-A*02:01", peptides=["SSSN"], throw=False, include_confidence_intervals=True, centrality_measure="robust_mean", ) assert not numpy.isnan(df.loc[df.peptide == "SIINFEKL", "prediction"].iloc[0]) assert numpy.isnan(df.loc[df.peptide == "SSSN", "prediction"].iloc[0]) assert numpy.isnan(df2["prediction"].iloc[0]) mhcflurry-2.3.6/test/test_class1_affinity_training_data.py000066400000000000000000000205531525677230600241120ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Tests for affinity-model device-resident training data.""" import warnings import numpy import torch from mhcflurry import amino_acid from mhcflurry.class1_affinity_training_data import AffinityDeviceTrainingData def test_affinity_device_training_data_combined_buffer_layout(): num_rn = 5 num_real = 7 encoded_length = 3 * 15 x_peptide = numpy.arange(num_real * encoded_length, dtype=numpy.int8).reshape( num_real, encoded_length ) rn_template = numpy.zeros((num_rn, encoded_length), dtype=numpy.int8) x_allele = numpy.ones((num_real, 39), dtype=numpy.float32) * 2.0 rn_allele = numpy.ones((num_rn, 39), dtype=numpy.float32) * 3.0 y_encoded = numpy.linspace(0.0, 1.0, num_rn + num_real, dtype=numpy.float32) weights = numpy.ones(num_rn + num_real, dtype=numpy.float32) data = AffinityDeviceTrainingData.from_arrays( x_peptide=x_peptide, x_allele=x_allele, y_encoded=y_encoded, sample_weights=weights, random_negative_x_peptide_template=rn_template, random_negative_x_allele=rn_allele, device="cpu", ) assert isinstance(data.combined_peptide, torch.Tensor) assert data.combined_peptide.shape == (num_rn + num_real, encoded_length) assert data.row_count == num_rn + num_real assert data.random_negative_count == num_rn assert data.device.type == "cpu" numpy.testing.assert_array_equal( data.combined_peptide[num_rn:].numpy(), x_peptide ) numpy.testing.assert_array_equal(data.x_peptide.numpy(), x_peptide) # The random-negative slice is pre-filled with the X (pad) index, not # zero, so a forward pass before the first refill sees padding rather than # real amino-acid index 0. It is overwritten by refill before training. assert (data.combined_peptide[:num_rn] == amino_acid.X_INDEX).all() data.refill_random_negative_peptides( torch.full((num_rn, encoded_length), 17, dtype=torch.int8) ) assert (data.combined_peptide[:num_rn] == 17).all() numpy.testing.assert_array_equal( data.combined_peptide[num_rn:].numpy(), x_peptide ) assert data.combined_allele.shape == (num_rn + num_real, 39) assert (data.combined_allele[:num_rn] == 3.0).all() assert (data.combined_allele[num_rn:] == 2.0).all() def test_affinity_device_training_data_no_random_negatives(): x_peptide = numpy.arange(7 * 45, dtype=numpy.int8).reshape(7, 45) data = AffinityDeviceTrainingData.from_arrays( x_peptide=x_peptide, x_allele=None, y_encoded=numpy.zeros(7, dtype=numpy.float32), sample_weights=None, random_negative_x_peptide_template=None, random_negative_x_allele=None, device="cpu", ) assert data.combined_peptide is None assert data.random_negative_x_peptide is None assert data.random_negative_count == 0 numpy.testing.assert_array_equal(data.x_peptide.numpy(), x_peptide) def test_affinity_device_training_data_accepts_readonly_numpy_arrays(): x_peptide = numpy.arange(4 * 3, dtype=numpy.int8).reshape(4, 3) x_allele = numpy.arange(4 * 2, dtype=numpy.int64).reshape(4, 2) rn_template = numpy.zeros((2, 3), dtype=numpy.int8) rn_allele = numpy.array([[10, 11], [12, 13]], dtype=numpy.int64) y_encoded = numpy.arange(6, dtype=numpy.float32) weights = numpy.ones(6, dtype=numpy.float32) for array in (x_peptide, x_allele, rn_template, rn_allele, y_encoded, weights): array.setflags(write=False) with warnings.catch_warnings(): warnings.simplefilter("error", UserWarning) data = AffinityDeviceTrainingData.from_arrays( x_peptide=x_peptide, x_allele=x_allele, y_encoded=y_encoded, sample_weights=weights, random_negative_x_peptide_template=rn_template, random_negative_x_allele=rn_allele, device="cpu", ) assert data.row_count == 6 numpy.testing.assert_array_equal(data.combined_allele[:2].numpy(), rn_allele) numpy.testing.assert_array_equal(data.combined_allele[2:].numpy(), x_allele) def test_affinity_device_training_data_batch_for_indices(): data = AffinityDeviceTrainingData.from_arrays( x_peptide=numpy.arange(5 * 3, dtype=numpy.int8).reshape(5, 3), x_allele=None, y_encoded=numpy.arange(5, dtype=numpy.float32), sample_weights=numpy.ones(5, dtype=numpy.float32) * 2.0, random_negative_x_peptide_template=None, random_negative_x_allele=None, device="cpu", ) inputs, y_batch, weights_batch = data.batch_for_indices( torch.tensor([3, 1], dtype=torch.long) ) numpy.testing.assert_array_equal( inputs["peptide"].numpy(), [[9, 10, 11], [3, 4, 5]] ) numpy.testing.assert_array_equal(y_batch.numpy(), [3.0, 1.0]) numpy.testing.assert_array_equal(weights_batch.numpy(), [2.0, 2.0]) def test_affinity_device_training_data_validates_row_counts(): x_peptide = numpy.arange(5 * 3, dtype=numpy.int8).reshape(5, 3) try: AffinityDeviceTrainingData.from_arrays( x_peptide=x_peptide, x_allele=None, y_encoded=numpy.zeros(4, dtype=numpy.float32), sample_weights=None, random_negative_x_peptide_template=None, random_negative_x_allele=None, device="cpu", ) except ValueError as e: assert "y_encoded has 4 rows" in str(e) else: raise AssertionError("expected y_encoded row-count mismatch") try: AffinityDeviceTrainingData.from_arrays( x_peptide=x_peptide, x_allele=None, y_encoded=numpy.zeros(5, dtype=numpy.float32), sample_weights=numpy.zeros(4, dtype=numpy.float32), random_negative_x_peptide_template=None, random_negative_x_allele=None, device="cpu", ) except ValueError as e: assert "sample_weights has 4 rows" in str(e) else: raise AssertionError("expected sample_weights row-count mismatch") def test_affinity_device_training_data_validates_allele_row_space(): x_peptide = numpy.arange(5 * 3, dtype=numpy.int8).reshape(5, 3) try: AffinityDeviceTrainingData.from_arrays( x_peptide=x_peptide, x_allele=numpy.zeros((4, 2), dtype=numpy.float32), y_encoded=numpy.zeros(5, dtype=numpy.float32), sample_weights=None, random_negative_x_peptide_template=None, random_negative_x_allele=None, device="cpu", ) except ValueError as e: assert "x_allele has 4 rows" in str(e) else: raise AssertionError("expected x_allele row-count mismatch") try: AffinityDeviceTrainingData.from_arrays( x_peptide=x_peptide, x_allele=numpy.zeros((5, 2), dtype=numpy.float32), y_encoded=numpy.zeros(7, dtype=numpy.float32), sample_weights=None, random_negative_x_peptide_template=numpy.zeros((2, 3), dtype=numpy.int8), random_negative_x_allele=None, device="cpu", ) except ValueError as e: assert "allele tensors must either both be present" in str(e) else: raise AssertionError("expected missing random-negative allele mismatch") try: AffinityDeviceTrainingData.from_arrays( x_peptide=x_peptide, x_allele=numpy.zeros((5, 2), dtype=numpy.float32), y_encoded=numpy.zeros(7, dtype=numpy.float32), sample_weights=None, random_negative_x_peptide_template=numpy.zeros((2, 3), dtype=numpy.int8), random_negative_x_allele=numpy.zeros((3, 2), dtype=numpy.float32), device="cpu", ) except ValueError as e: assert "random_negative_x_allele has 3 rows" in str(e) else: raise AssertionError("expected random-negative allele row-count mismatch") mhcflurry-2.3.6/test/test_class1_neural_network.py000066400000000000000000000500121525677230600224450ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Tests for Class1NeuralNetwork. """ import pytest import numpy from numpy import testing import pandas from mhcflurry.class1_neural_network import Class1NeuralNetwork from mhcflurry.downloads import get_path from mhcflurry.common import random_peptides from mhcflurry.testing_utils import cleanup, startup @pytest.fixture(autouse=True) def setup_teardown(): """Setup and teardown for each test.""" startup() yield cleanup() @pytest.mark.slow def test_class1_neural_network_a0205_training_accuracy(): """Test that the network can memorize a small dataset.""" # Memorize the dataset. hyperparameters = dict( activation="tanh", layer_sizes=[16], max_epochs=500, early_stopping=False, validation_split=0.0, locally_connected_layers=[ {"filters": 8, "activation": "tanh", "kernel_size": 3} ], dense_layer_l1_regularization=0.0, dropout_probability=0.0, ) # First test a Class1NeuralNetwork, then a Class1AffinityPredictor. allele = "HLA-A*02:05" df = pandas.read_csv( get_path("data_curated", "curated_training_data.affinity.csv.bz2") ) df = df.loc[df.allele == allele] df = df.loc[df.peptide.str.len() == 9] df = df.loc[df.measurement_type == "quantitative"] df = df.loc[df.measurement_source == "kim2014"] predictor = Class1NeuralNetwork(**hyperparameters) predictor.fit(df.peptide.values, df.measurement_value.values) ic50_pred = predictor.predict(df.peptide.values) ic50_true = df.measurement_value.values assert len(ic50_pred) == len(ic50_true) testing.assert_allclose( numpy.log(ic50_pred), numpy.log(ic50_true), rtol=0.2, atol=0.2 ) # Test that a second predictor has the same architecture json. # This is important for an optimization we use to re-use predictors of the # same architecture at prediction time. hyperparameters2 = dict( activation="tanh", layer_sizes=[16], max_epochs=1, early_stopping=False, validation_split=0.0, locally_connected_layers=[ {"filters": 8, "activation": "tanh", "kernel_size": 3} ], dense_layer_l1_regularization=0.0, dropout_probability=0.0, ) predictor2 = Class1NeuralNetwork(**hyperparameters2) predictor2.fit(df.peptide.values, df.measurement_value.values, verbose=0) assert predictor.network().to_json() == predictor2.network().to_json() @pytest.mark.slow @pytest.mark.integration def test_inequalities(): """Test that inequality constraints are properly handled.""" # Memorize the dataset. hyperparameters = dict( peptide_amino_acid_encoding="one-hot", activation="tanh", layer_sizes=[4], max_epochs=200, minibatch_size=32, random_negative_rate=0.0, random_negative_constant=0, early_stopping=False, validation_split=0.0, locally_connected_layers=[], dense_layer_l1_regularization=0.0, dropout_probability=0.0, loss="custom:mse_with_inequalities_and_multiple_outputs", ) dfs = [] # Weak binders df = pandas.DataFrame() df["peptide"] = random_peptides(500, length=9) df["value"] = 400.0 df["inequality1"] = "=" df["inequality2"] = "<" dfs.append(df) # Strong binders - same peptides as above but more measurement values df = pandas.DataFrame() df["peptide"] = dfs[-1].peptide.values df["value"] = 1.0 df["inequality1"] = "=" df["inequality2"] = "=" dfs.append(df) # Non-binders df = pandas.DataFrame() df["peptide"] = random_peptides(500, length=10) df["value"] = 1000 df["inequality1"] = ">" df["inequality2"] = ">" dfs.append(df) df = pandas.concat(dfs, ignore_index=True) fit_kwargs = {"verbose": 0} predictor = Class1NeuralNetwork(**hyperparameters) predictor.fit( df.peptide.values, df.value.values, inequalities=df.inequality1.values, **fit_kwargs ) df["prediction1"] = predictor.predict(df.peptide.values) predictor = Class1NeuralNetwork(**hyperparameters) predictor.fit( df.peptide.values, df.value.values, inequalities=df.inequality2.values, **fit_kwargs ) df["prediction2"] = predictor.predict(df.peptide.values) # Binders should be stronger for pred in ["prediction1", "prediction2"]: assert df.loc[df.value < 1000, pred].mean() < 500 assert df.loc[df.value >= 1000, pred].mean() > 500 # For the binders, the (=) on the weak-binding measurement (100) in # inequality1 should make the prediction weaker, whereas for inequality2 # this measurement is a "<" so it should allow the strong-binder measurement # to dominate. numpy.testing.assert_array_less(5.0, df.loc[df.value == 1].prediction1.values) numpy.testing.assert_array_less(df.loc[df.value == 1].prediction2.values, 2.0) numpy.testing.assert_allclose(df.loc[df.value == 1].prediction2.values, 1.0, atol=0.5) print(df.groupby("value")[["prediction1", "prediction2"]].mean()) @pytest.mark.slow @pytest.mark.integration def test_basic_training(): """Test basic network training with synthetic data.""" hyperparameters = dict( activation="tanh", layer_sizes=[16], max_epochs=50, early_stopping=False, validation_split=0.0, locally_connected_layers=[ {"filters": 8, "activation": "tanh", "kernel_size": 3} ], dense_layer_l1_regularization=0.0, dropout_probability=0.0, ) # Generate synthetic data peptides = random_peptides(100, length=9) affinities = numpy.random.uniform(10, 50000, 100) predictor = Class1NeuralNetwork(**hyperparameters) predictor.fit(peptides, affinities, verbose=0) predictions = predictor.predict(peptides) assert len(predictions) == len(peptides) assert predictions.min() > 0 assert predictions.max() < 100000 def test_split_forward_matches_full_forward(): """forward_peptide_stage + forward_from_peptide_stage = forward (bit-identical). The calibration fast path precomputes peptide-side activations once and reuses them across many alleles. For it to be a valid speedup (not a silent behavior change) the split must compose to the same numerical output as the monolithic ``forward``. """ import torch base_hparams = dict( activation="tanh", layer_sizes=[16, 8], validation_split=0.0, early_stopping=False, locally_connected_layers=[ {"filters": 4, "activation": "tanh", "kernel_size": 3} ], peptide_allele_merge_method="concatenate", dense_layer_l1_regularization=0.0, dropout_probability=0.0, ) predictor = Class1NeuralNetwork(**base_hparams) # Fake allele_representations so has_allele=True alle_reps = numpy.random.rand(3, 37, 21).astype(numpy.float32) predictor._network = predictor.make_network( allele_representations=alle_reps, **predictor.network_hyperparameter_defaults.subselect( predictor.hyperparameters), ) predictor._network.eval() peptides = random_peptides(12, length=9) peptide_encoded = predictor.peptides_to_network_input(peptides) peptide_tensor = torch.from_numpy(peptide_encoded.astype(numpy.float32)) allele_idx = torch.tensor([0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2], dtype=torch.long) with torch.no_grad(): full_out = predictor._network({ "peptide": peptide_tensor, "allele": allele_idx, }) stage = predictor._network.forward_peptide_stage(peptide_tensor) split_out = predictor._network.forward_from_peptide_stage( stage, allele_idx, ) testing.assert_allclose( full_out.numpy(), split_out.numpy(), rtol=0, atol=1e-6, err_msg="split-forward must match monolithic forward bit-identically", ) def test_peptide_amino_acid_encoding_torch_default_and_legacy_alias(): encoding = { "vector_encoding_name": "BLOSUM62", "alignment_method": "pad_middle", "left_edge": 4, "right_edge": 4, "max_length": 15, } default = Class1NeuralNetwork(peptide_encoding=encoding) assert default.uses_peptide_torch_encoding() assert default.peptides_to_network_input(["SIINFEKL"]).shape == (1, 15) explicit_cpu_torch = Class1NeuralNetwork( peptide_encoding=encoding, peptide_amino_acid_encoding_torch="cpu", ) assert explicit_cpu_torch.uses_peptide_torch_encoding() assert explicit_cpu_torch.peptides_to_network_input(["SIINFEKL"]).shape == ( 1, 15, ) # The legacy dense-vector path is gone: a falsy value (and the old # ``_gpu`` alias) is accepted but coerced to index encoding, not (N, L, V). legacy_false = Class1NeuralNetwork( peptide_encoding=encoding, peptide_amino_acid_encoding_torch=False, ) assert legacy_false.uses_peptide_torch_encoding() assert legacy_false.peptides_to_network_input(["SIINFEKL"]).shape == (1, 15) legacy_alias = Class1NeuralNetwork( peptide_encoding=encoding, peptide_amino_acid_encoding_gpu=False, ) assert legacy_alias.uses_peptide_torch_encoding() assert "peptide_amino_acid_encoding_gpu" not in legacy_alias.hyperparameters assert legacy_alias.peptides_to_network_input( ["SIINFEKL"]).shape == (1, 15) @pytest.mark.parametrize( "encoding_name", [ "BLOSUM62", "one-hot", "physchem", "PMBEC", "contact", "BLOSUM62+physchem", "PMBEC+contact", "PMBEC:minmax+contact:minmax", ], ) def test_index_embedding_matches_dense_vector_forward(encoding_name): """The production index-embedding peptide path is bit-identical to the (retained, test-only) dense ``(N, L, V)`` vector path. This pins the fidelity of the index-encoding migration end-to-end — the guarantee that loading and predicting saved models is numerically unchanged — using the retained ``variable_length_to_fixed_length_vector_encoding`` and the model's dense-input branch. (Replaces the old vector-vs-index forward parity test, which built the two models through the now-coerced high-level encoding flag.) """ import torch from mhcflurry.class1_neural_network import Class1NeuralNetworkModel from mhcflurry.encodable_sequences import EncodableSequences from mhcflurry.amino_acid import vector_encoding_length align = dict( alignment_method="pad_middle", left_edge=4, right_edge=4, max_length=15) width = vector_encoding_length(encoding_name) arch = dict( peptide_encoding_shape=(15, width), layer_sizes=[8], activation="tanh", dropout_probability=0.0) index_model = Class1NeuralNetworkModel( peptide_input_is_indices=True, peptide_input_vector_encoding_name=encoding_name, **arch).eval() vector_model = Class1NeuralNetworkModel( peptide_input_is_indices=False, **arch).eval() # Identical downstream weights; only the peptide encoding (index-embed vs # dense vector) differs. vector_model.load_state_dict(index_model.state_dict(), strict=False) peptides = random_peptides(16, length=9) encoder = EncodableSequences.create(peptides) index_input = encoder.variable_length_to_fixed_length_categorical( **align).astype("int8") vector_input = encoder.variable_length_to_fixed_length_vector_encoding( vector_encoding_name=encoding_name, **align).astype("float32") with torch.no_grad(): index_out = index_model( {"peptide": torch.from_numpy(index_input)}).numpy() vector_out = vector_model( {"peptide": torch.from_numpy(vector_input)}).numpy() testing.assert_allclose( index_out, vector_out, rtol=0, atol=1e-6, err_msg="index-embedding peptide forward must equal the dense " "vector-encoded forward for %s" % encoding_name) def test_unsupported_device_random_negative_alignment_falls_back_to_host(): peptides = random_peptides(12, length=9) affinities = numpy.random.uniform(10, 50000, len(peptides)) predictor = Class1NeuralNetwork( peptide_encoding={ "vector_encoding_name": "BLOSUM62", "alignment_method": "left_pad_right_pad", "max_length": 15, }, activation="tanh", layer_sizes=[4], locally_connected_layers=[], peptide_dense_layer_sizes=[], allele_dense_layer_sizes=[], dropout_probability=0.0, batch_normalization=False, dense_layer_l1_regularization=0.0, dense_layer_l2_regularization=0.0, max_epochs=1, early_stopping=False, validation_split=0.0, minibatch_size=4, random_negative_rate=1.0, random_negative_constant=0, random_negative_pool_epochs=1, ) predictor.fit(peptides, affinities, verbose=0) fit_info = predictor.fit_info[-1] assert fit_info["random_negative_pool_residency"] == "host" assert fit_info["fit_tensor_residency"] == "device" @pytest.mark.slow @pytest.mark.integration def test_serialization(): """Test that network weights can be serialized and deserialized.""" hyperparameters = dict( activation="tanh", layer_sizes=[16], max_epochs=10, early_stopping=False, validation_split=0.0, locally_connected_layers=[ {"filters": 8, "activation": "tanh", "kernel_size": 3} ], ) peptides = random_peptides(50, length=9) affinities = numpy.random.uniform(10, 50000, 50) # Train a network predictor = Class1NeuralNetwork(**hyperparameters) predictor.fit(peptides, affinities, verbose=0) # Get predictions before serialization preds_before = predictor.predict(peptides) # Serialize and deserialize config = predictor.get_config() weights = predictor.get_weights() predictor2 = Class1NeuralNetwork.from_config(config, weights=weights) preds_after = predictor2.predict(peptides) # Predictions should be identical numpy.testing.assert_allclose(preds_before, preds_after, rtol=1e-5) @pytest.mark.slow @pytest.mark.integration def test_different_peptide_lengths(): """Test that the network handles different peptide lengths correctly.""" hyperparameters = dict( activation="tanh", layer_sizes=[16], max_epochs=20, validation_split=0.0, ) # Mix of different length peptides peptides = ( random_peptides(30, length=8) + random_peptides(30, length=9) + random_peptides(30, length=10) + random_peptides(10, length=11) ) affinities = numpy.random.uniform(10, 50000, 100) predictor = Class1NeuralNetwork(**hyperparameters) predictor.fit(peptides, affinities, verbose=0) predictions = predictor.predict(peptides) assert len(predictions) == len(peptides) @pytest.mark.slow @pytest.mark.integration def test_early_stopping(): """Test that early stopping works correctly.""" hyperparameters = dict( activation="tanh", layer_sizes=[16], max_epochs=1000, early_stopping=True, patience=5, validation_split=0.2, ) peptides = random_peptides(200, length=9) affinities = numpy.random.uniform(10, 50000, 200) predictor = Class1NeuralNetwork(**hyperparameters) predictor.fit(peptides, affinities, verbose=0) # Should stop well before 1000 epochs # (We can't easily check this without modifying the class to expose the final epoch) predictions = predictor.predict(peptides) assert len(predictions) == len(peptides) @pytest.mark.slow @pytest.mark.integration def test_batch_normalization(): """Test training with batch normalization.""" hyperparameters = dict( activation="relu", layer_sizes=[16], max_epochs=20, validation_split=0.0, batch_normalization=True, ) peptides = random_peptides(100, length=9) affinities = numpy.random.uniform(10, 50000, 100) predictor = Class1NeuralNetwork(**hyperparameters) predictor.fit(peptides, affinities, verbose=0) predictions = predictor.predict(peptides) assert len(predictions) == len(peptides) @pytest.mark.slow @pytest.mark.integration def test_dropout(): """Test training with dropout.""" hyperparameters = dict( activation="relu", layer_sizes=[32, 16], max_epochs=20, validation_split=0.0, dropout_probability=0.5, ) peptides = random_peptides(100, length=9) affinities = numpy.random.uniform(10, 50000, 100) predictor = Class1NeuralNetwork(**hyperparameters) predictor.fit(peptides, affinities, verbose=0) predictions = predictor.predict(peptides) assert len(predictions) == len(peptides) @pytest.mark.slow @pytest.mark.integration def test_multiple_outputs(): """Test network with multiple outputs.""" hyperparameters = dict( activation="tanh", layer_sizes=[16], max_epochs=50, validation_split=0.0, num_outputs=2, loss="custom:mse_with_inequalities_and_multiple_outputs", locally_connected_layers=[], ) peptides = random_peptides(100, length=9) affinities = numpy.random.uniform(0.0, 1.0, 100) output_indices = numpy.random.choice([0, 1], 100) predictor = Class1NeuralNetwork(**hyperparameters) predictor.fit( peptides, affinities, output_indices=output_indices, verbose=0 ) # Predict for each output predictions0 = predictor.predict(peptides, output_index=0) predictions1 = predictor.predict(peptides, output_index=1) assert len(predictions0) == len(peptides) assert len(predictions1) == len(peptides) @pytest.mark.parametrize("inequality,bound", [ ("<", 100), (">", 1000), ("=", 100), ("<", 1000), (">", 100), ]) def test_streaming_validation_affinity_bounds(monkeypatch, inequality, bound): """Streaming validation must assess bounds in the original nM direction.""" import torch from mhcflurry.encodable_sequences import EncodableSequences from mhcflurry.cli.select_pan_allele_models_command import mse monkeypatch.setattr( Class1NeuralNetwork, "get_device", staticmethod(lambda: torch.device("cpu"))) model = Class1NeuralNetwork( layer_sizes=[4], locally_connected_layers=[], dropout_probability=0, learning_rate=0, optimizer="sgd", data_dependent_initialization_method=None, dense_layer_l1_regularization=0, dense_layer_l2_regularization=0, validation_batch_size=2) model._network = model.make_network( allele_representations=None, **model.network_hyperparameter_defaults.subselect(model.hyperparameters)) with torch.no_grad(): for parameter in model.network().parameters(): parameter.zero_() peptides = EncodableSequences.create(["SIINFEKL", "SIINFEKL"]) batch = ( {"peptide": model.peptides_to_network_input(peptides)}, numpy.array([0.5, 0.5], dtype=numpy.float32)) bounds = numpy.array([bound, bound]) inequalities = numpy.array([inequality, inequality]) model.fit_streaming_batches( generator=iter([batch]), generator_batches_are_encoded=True, validation_peptide_encoding=peptides, validation_affinities=bounds, validation_allele_encoding=None, validation_inequalities=inequalities, steps_per_epoch=1, epochs=1, verbose=0, seed=42) expected = mse(model.predict(peptides), bounds, inequalities) assert model.fit_info[-1]["val_loss"][-1] == pytest.approx(expected, abs=1e-7) mhcflurry-2.3.6/test/test_class1_pan.py000066400000000000000000000110301525677230600201610ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Tests for training and predicting using Class1 pan-allele models. """ from sklearn.metrics import roc_auc_score import pandas import pytest from numpy.testing import assert_ from mhcflurry import Class1NeuralNetwork from mhcflurry.allele_encoding import AlleleEncoding from mhcflurry.downloads import get_path from mhcflurry.pseudosequences import LEGACY_ALLELE_SEQUENCES_FILENAME from mhcflurry.testing_utils import cleanup, startup pytest.fixture(autouse=True, scope="module") def setup_module(): startup() yield cleanup() HYPERPARAMETERS = { 'activation': 'tanh', 'allele_dense_layer_sizes': [], 'batch_normalization': False, 'dense_layer_l1_regularization': 0.0, 'dense_layer_l2_regularization': 0.0, 'dropout_probability': 0.5, 'early_stopping': True, 'init': 'glorot_uniform', 'layer_sizes': [64], 'learning_rate': None, 'locally_connected_layers': [], 'loss': 'custom:mse_with_inequalities', 'max_epochs': 5000, 'minibatch_size': 256, 'optimizer': 'rmsprop', 'output_activation': 'sigmoid', 'patience': 5, 'peptide_allele_merge_activation': '', 'peptide_allele_merge_method': 'concatenate', 'peptide_amino_acid_encoding': 'BLOSUM62', 'peptide_dense_layer_sizes': [], 'peptide_encoding': { 'alignment_method': 'left_pad_centered_right_pad', 'max_length': 15, 'vector_encoding_name': 'BLOSUM62', }, 'random_negative_affinity_max': 50000.0, 'random_negative_affinity_min': 20000.0, 'random_negative_constant': 25, 'random_negative_distribution_smoothing': 0.0, 'random_negative_match_distribution': True, 'random_negative_rate': 0.2, 'random_negative_method': 'by_allele', 'train_data': {}, 'validation_split': 0.1, } ALLELE_TO_SEQUENCE = pandas.read_csv( get_path( "allele_sequences", LEGACY_ALLELE_SEQUENCES_FILENAME), index_col=0).sequence.to_dict() TRAIN_DF = pandas.read_csv( get_path( "data_curated", "curated_training_data.affinity.csv.bz2")) TRAIN_DF = TRAIN_DF.loc[TRAIN_DF.allele.isin(ALLELE_TO_SEQUENCE)] TRAIN_DF = TRAIN_DF.loc[TRAIN_DF.peptide.str.len() >= 8] TRAIN_DF = TRAIN_DF.loc[TRAIN_DF.peptide.str.len() <= 15] TRAIN_DF = TRAIN_DF.loc[ TRAIN_DF.allele.isin(TRAIN_DF.allele.value_counts().iloc[:3].index) ] MS_HITS_DF = pandas.read_csv( get_path( "data_curated", "curated_training_data.csv.bz2")) MS_HITS_DF = MS_HITS_DF.loc[MS_HITS_DF.allele.isin(TRAIN_DF.allele.unique())] MS_HITS_DF = MS_HITS_DF.loc[MS_HITS_DF.peptide.str.len() >= 8] MS_HITS_DF = MS_HITS_DF.loc[MS_HITS_DF.peptide.str.len() <= 15] MS_HITS_DF = MS_HITS_DF.loc[~MS_HITS_DF.peptide.isin(TRAIN_DF.peptide)] print("Loaded %d training and %d ms hits" % ( len(TRAIN_DF), len(MS_HITS_DF))) @pytest.mark.slow @pytest.mark.integration def test_train_simple(): # Reset random seeds to ensure reproducibility regardless of test order import numpy import random import torch numpy.random.seed(1) random.seed(1) torch.manual_seed(1) network = Class1NeuralNetwork(**HYPERPARAMETERS) allele_encoding = AlleleEncoding( TRAIN_DF.allele.values, allele_to_sequence=ALLELE_TO_SEQUENCE) network.fit( TRAIN_DF.peptide.values, affinities=TRAIN_DF.measurement_value.values, allele_encoding=allele_encoding, inequalities=TRAIN_DF.measurement_inequality.values) validation_df = MS_HITS_DF.copy() validation_df["hit"] = 1 decoys_df = MS_HITS_DF.copy() decoys_df["hit"] = 0 decoys_df["allele"] = decoys_df.allele.sample(frac=1.0).values validation_df = pandas.concat([validation_df, decoys_df], ignore_index=True) predictions = network.predict( peptides=validation_df.peptide.values, allele_encoding=AlleleEncoding( validation_df.allele.values, borrow_from=allele_encoding)) print(pandas.Series(predictions).describe()) score = roc_auc_score(validation_df.hit, -1 * predictions) print("AUC", score) assert_(score > 0.6) mhcflurry-2.3.6/test/test_class1_presentation_predictor.py000066400000000000000000000357711525677230600242130ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import pandas import tempfile import pickle import numpy import pytest from sklearn.metrics import roc_auc_score from mhcflurry import Class1AffinityPredictor, Class1ProcessingPredictor from mhcflurry.class1_presentation_predictor import Class1PresentationPredictor from mhcflurry.downloads import get_path from mhcflurry.testing_utils import cleanup, startup import mhcflurry.class1_presentation_predictor from . import data_path pytestmark = [pytest.mark.slow, pytest.mark.integration, pytest.mark.downloads] mhcflurry.class1_presentation_predictor.PREDICT_CHUNK_SIZE = 15 def setup_module(): global AFFINITY_PREDICTOR global CLEAVAGE_PREDICTOR global CLEAVAGE_PREDICTOR_NO_FLANKING global PRESENTATION_PREDICTOR startup() AFFINITY_PREDICTOR = Class1AffinityPredictor.load( get_path("models_class1_pan", "models.combined"), optimization_level=0, max_models=1) CLEAVAGE_PREDICTOR = Class1ProcessingPredictor.load( get_path("models_class1_processing", "models.selected.with_flanks"), max_models=1) CLEAVAGE_PREDICTOR_NO_FLANKING = Class1ProcessingPredictor.load( get_path("models_class1_processing", "models.selected.no_flank"), max_models=1) PRESENTATION_PREDICTOR = Class1PresentationPredictor.load() def teardown_module(): global AFFINITY_PREDICTOR global CLEAVAGE_PREDICTOR global CLEAVAGE_PREDICTOR_NO_FLANKING global PRESENTATION_PREDICTOR AFFINITY_PREDICTOR = None CLEAVAGE_PREDICTOR = None CLEAVAGE_PREDICTOR_NO_FLANKING = None PRESENTATION_PREDICTOR = None cleanup() @pytest.fixture(scope="module") def predictors(): return { "affinity_predictor": AFFINITY_PREDICTOR, "cleavage_predictor": CLEAVAGE_PREDICTOR, "cleavage_predictor_no_flanking": CLEAVAGE_PREDICTOR_NO_FLANKING, "presentation_predictor": PRESENTATION_PREDICTOR, } def test_basic(predictors): df = pandas.read_csv(data_path("multiallelic.benchmark.small.csv.bz2")) train_df = df.loc[ df.sample_id.isin(sorted(df.sample_id.unique())[:3]) ] test_df = df.loc[ ~df.sample_id.isin(train_df.sample_id.unique()) ] test_df = test_df.sample(frac=0.01, weights=test_df.hit + 0.01) experiment_to_alleles = ( df.drop_duplicates("sample_id").set_index("sample_id").hla.str.split().to_dict()) predictor = Class1PresentationPredictor( affinity_predictor=predictors["affinity_predictor"], processing_predictor_without_flanks=predictors['cleavage_predictor_no_flanking'], processing_predictor_with_flanks=predictors['cleavage_predictor']) predictor.fit( targets=train_df.hit.values, peptides=train_df.peptide.values, sample_names=train_df.sample_id.values, alleles=experiment_to_alleles, n_flanks=train_df.n_flank.values, c_flanks=train_df.c_flank.values, verbose=2) # Calibrate with fake data. predictor.calibrate_percentile_ranks(numpy.random.rand(100)**2) def add_prediction_cols(test_df, predictor): prediction1_df = predictor.predict( peptides=test_df.peptide.values, sample_names=test_df.sample_id.values, alleles=experiment_to_alleles, n_flanks=test_df.n_flank.values, c_flanks=test_df.c_flank.values, verbose=2) print(prediction1_df) prediction2_df = predictor.predict( peptides=test_df.peptide.values, sample_names=test_df.sample_id.values, alleles=experiment_to_alleles, verbose=2) print(prediction2_df) test_df["prediction1"] = prediction1_df.presentation_score.values test_df["prediction2"] = prediction2_df.presentation_score.values test_df["prediction1_percentile"] = prediction1_df.presentation_percentile.values test_df["prediction2_percentile"] = prediction2_df.presentation_percentile.values test_df["processing_score1"] = prediction1_df.processing_score.values test_df["processing_score2"] = prediction2_df.processing_score.values test_df["affinity1"] = prediction1_df.affinity.values test_df["affinity2"] = prediction2_df.affinity.values add_prediction_cols(test_df, predictor) score1 = roc_auc_score(test_df.hit.values, test_df.prediction1.values) score2 = roc_auc_score(test_df.hit.values, test_df.prediction2.values) print("AUC", score1, score2) assert score1 > 0.8 assert score2 > 0.8 score1 = roc_auc_score( test_df.hit.values, -test_df.prediction1_percentile.values) score2 = roc_auc_score( test_df.hit.values, -test_df.prediction2_percentile.values) print("AUC (using percentiles)", score1, score2) assert score1 > 0.8 assert score2 > 0.8 # Test saving, loading, pickling models_dir = tempfile.mkdtemp("_models") print(models_dir) predictor.save(models_dir) predictor2 = Class1PresentationPredictor.load(models_dir) predictor3 = pickle.loads( pickle.dumps(predictor, protocol=pickle.HIGHEST_PROTOCOL)) predictor4 = pickle.loads( pickle.dumps(predictor2, protocol=pickle.HIGHEST_PROTOCOL)) for (i, other_predictor) in enumerate([predictor2, predictor3, predictor4]): print("Testing identity", i + 1) other_test_df = test_df.copy() del other_test_df["prediction1"] del other_test_df["prediction2"] add_prediction_cols(other_test_df, other_predictor) numpy.testing.assert_array_almost_equal( test_df["prediction1"], other_test_df["prediction1"], decimal=6) numpy.testing.assert_array_almost_equal( test_df["prediction2"], other_test_df["prediction2"], decimal=6) def test_downloaded_predictor_small(predictors): presentation_predictor = predictors['presentation_predictor'] # Test sequence scanning scan_results = presentation_predictor.predict_sequences( sequences=[ "MESLVPGFN", "QPYVFIKRS", "AGGHSYGAD", ], alleles={ "HLA-A*02:01": ["HLA-A*02:01"], "HLA-C*02:01": ["HLA-C*02:01"], }, peptide_lengths=[9], result="best") print(scan_results) assert len(scan_results) == 6 scan_results = presentation_predictor.predict_sequences( sequences=[ "MESLVPGFN", "QPYVFIKRS", "AGGHSYGAD", ], alleles={ "HLA-A*02:01": ["HLA-A*02:01"], "HLA-C*02:01": ["HLA-C*02:01"], }, peptide_lengths=[8, 9], result="best") print(scan_results) assert len(scan_results) == 6 scan_results = presentation_predictor.predict_sequences( sequences=[ "MESLVPGFN", "QPYVFIKRS", "AGGHSYGAD", ], alleles={ "HLA-A*02:01": ["HLA-A*02:01"], "HLA-C*02:01": ["HLA-C*02:01"], }, peptide_lengths=[9], result="all") print(scan_results) assert len(scan_results) == 6 scan_results = presentation_predictor.predict_sequences( sequences=[ "MESLVPGFN", "QPYVFIKRS", "AGGHSYGAD", ], alleles={ "HLA-A*02:01": ["HLA-A*02:01"], "HLA-C*02:01": ["HLA-C*02:01"], }, peptide_lengths=[8, 9], result="all") print(scan_results) assert len(scan_results) == 18 scan_results = presentation_predictor.predict_sequences( sequences=[ "MESLVPGFN", "QPYVFIKRS", "AGGHSYGAD", ], alleles={ "HLA-A*02:01": ["HLA-A*02:01"], "HLA-C*02:01": ["HLA-C*02:01"], }, peptide_lengths=[10], result="all") print(scan_results) assert len(scan_results) == 0 def test_downloaded_predictor(predictors): presentation_predictor = predictors['presentation_predictor'] # Test sequence scanning scan_results1 = presentation_predictor.predict_sequences( sequences=[ "MESLVPGFNEKTHVQLSLPVLQVRDVLVRGFGDSVEEVLSEARQHLKDGTCGLVEVEKGVLPQLE", "QPYVFIKRSDARTAPHGHVMVELVAELEGIQYGRSGETLGVLVPHVGEIPVAYRKVLLRKNGNKG", "AGGHSYGADLKSFDLGDELGTDPYEDFQENWNTKHSSGVTRELMRELNGGAYTRYVDNNFCGPDG", ], alleles=[ "HLA-A*02:01", "HLA-A*03:01", "HLA-B*57:01", "HLA-B*44:02", "HLA-C*02:01", "HLA-C*07:01", ]) print(scan_results1) assert len(scan_results1) == 3, str(scan_results1) assert (scan_results1.affinity < 200).all(), str(scan_results1) assert (scan_results1.presentation_score > 0.7).all(), str(scan_results1) scan_results2 = presentation_predictor.predict_sequences( result="filtered", filter_value=500, comparison_quantity="affinity", sequences={ "seq1": "MESLVPGFNEKTHVQLSLPVLQVRDVLVRGFGDSVEEVLSEARQHLKDGTCGLVEVEKGVLPQLE", "seq2": "QPYVFIKRSDARTAPHGHVMVELVAELEGIQYGRSGETLGVLVPHVGEIPVAYRKVLLRKNGNKG", "seq3": "AGGHSYGADLKSFDLGDELGTDPYEDFQENWNTKHSSGVTRELMRELNGGAYTRYVDNNFCGPDG", }, alleles=[ "HLA-A*02:01", "HLA-A*03:01", "HLA-B*57:01", "HLA-B*44:02", "HLA-C*02:01", "HLA-C*07:01", ]) print(scan_results2) assert len(scan_results2) > 10 assert (scan_results2.affinity <= 500).all() scan_results3 = presentation_predictor.predict_sequences( result="filtered", filter_value=0.9, comparison_quantity="presentation_score", sequences={ "seq1": "MESLVPGFNEKTHVQLSLPVLQVRDVLVRGFGDSVEEVLSEARQHLKDGTCGLVEVEKGVLPQLE", "seq2": "QPYVFIKRSDARTAPHGHVMVELVAELEGIQYGRSGETLGVLVPHVGEIPVAYRKVLLRKNGNKG", "seq3": "AGGHSYGADLKSFDLGDELGTDPYEDFQENWNTKHSSGVTRELMRELNGGAYTRYVDNNFCGPDG", }, alleles=[ "HLA-A*02:01", "HLA-A*03:01", "HLA-B*57:01", "HLA-B*44:02", "HLA-C*02:01", "HLA-C*07:01", ]) print(scan_results3) assert len(scan_results3) >= 5, len(scan_results3) assert (scan_results3.presentation_score >= 0.9).all() scan_results4 = presentation_predictor.predict_sequences( result="all", comparison_quantity="affinity", sequences={ "seq1": "MESLVPGFNEKTHVQLSLPVLQVRDVLVRGFGDSVEEVLSEARQHLKDGTCGLVEVEKGVLPQLE", "seq2": "QPYVFIKRSDARTAPHGHVMVELVAELEGIQYGRSGETLGVLVPHVGEIPVAYRKVLLRKNGNKG", "seq3": "AGGHSYGADLKSFDLGDELGTDPYEDFQENWNTKHSSGVTRELMRELNGGAYTRYVDNNFCGPDG", }, alleles=[ "HLA-A*02:01", "HLA-A*03:01", "HLA-B*57:01", "HLA-B*44:02", "HLA-C*02:01", "HLA-C*07:01", ]) print(scan_results4) assert len(scan_results4) > 200, len(scan_results4) assert scan_results4.iloc[0].affinity < 100 sequences = { "seq1": "MESLVPGFNEKTHVQLSLPVLQVRDVLVRGFGDSVEEVLSEARQHLKDGTCGLVEVEKGVLPQLE", "seq2": "QPYVFIKRSDARTAPHGHVMVELVAELEGIQYGRSGETLGVLVPHVGEIPVAYRKVLLRKNGNKG", "seq3": "AGGHSYGADLKSFDLGDELGTDPYEDFQENWNTKHSSGVTRELMRELNGGAYTRYVDNNFCGPDG", } scan_results5 = presentation_predictor.predict_sequences( result="all", comparison_quantity="affinity", sequences=sequences, alleles={ "sample1": [ "HLA-A*02:01", "HLA-A*03:01", "HLA-B*57:01", "HLA-B*44:02", "HLA-C*02:01", "HLA-C*07:01", ], "sample2": [ "HLA-A*01:01", "HLA-A*02:06", "HLA-B*07:02", "HLA-B*44:02", "HLA-C*03:01", "HLA-C*07:02", ], }) print(scan_results5) assert len(scan_results5) == len(scan_results4) * 2 # Test case-insensitive. scan_results6 = presentation_predictor.predict_sequences( result="all", comparison_quantity="affinity", sequences=dict((k, v.lower()) for (k, v) in sequences.items()), alleles={ "sample1": [ "HLA-A*02:01", "HLA-A*03:01", "HLA-B*57:01", "HLA-B*44:02", "HLA-C*02:01", "HLA-C*07:01", ], "sample2": [ "HLA-A*01:01", "HLA-A*02:06", "HLA-B*07:02", "HLA-B*44:02", "HLA-C*03:01", "HLA-C*07:02", ], }) numpy.testing.assert_array_equal( scan_results6.peptide.to_numpy(), scan_results5.peptide.str.lower().to_numpy(), ) numpy.testing.assert_almost_equal( scan_results6.affinity.values, scan_results5.affinity.values) numpy.testing.assert_almost_equal( scan_results6.processing_score.values, scan_results5.processing_score.values) numpy.testing.assert_almost_equal( scan_results6.presentation_score.values, scan_results5.presentation_score.values) scan_results7 = presentation_predictor.predict_sequences( result="all", comparison_quantity="affinity", sequences={ "seq1": "LVEVEKgVLPQLE", "seq2": "MRELNGGAYTRYVDNNFCGPdg", }, alleles={ "sample1": [ "HLA-A*02:01", "HLA-A*03:01", "HLA-B*57:01", "HLA-B*44:02", "HLA-C*02:01", "HLA-C*07:01", ] }) print(scan_results7) # Check that c-terminus peptide is included and with the same case as input. assert "DNNFCGPdg" in scan_results7.peptide.values, scan_results7.peptide def test_downloaded_predictor_invalid_peptides(predictors): presentation_predictor = predictors['presentation_predictor'] peptides = [ "SIINFEKL", "REALLYLNGPEPTIDESSSSS", "SIINFEKLQ", ] alleles = [ "HLA-A*02:01", "HLA-A*03:01", "HLA-B*57:01", "HLA-B*44:02", "HLA-C*02:01", "HLA-C*07:01", ] numpy.testing.assert_raises( ValueError, presentation_predictor.predict, peptides=peptides, alleles=alleles) results1 = presentation_predictor.predict( peptides=peptides, alleles=alleles, throw=False).presentation_score.values numpy.testing.assert_equal(numpy.isnan(results1), [False, True, False]) mhcflurry-2.3.6/test/test_class1_presentation_predictor_unit.py000066400000000000000000000503051525677230600252400ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import warnings from argparse import Namespace import numpy import pandas import pytest import torch from sklearn.metrics import average_precision_score, roc_auc_score import mhcflurry.class1_presentation_predictor as presentation_module import mhcflurry.cli.train_presentation_models_command as train_presentation from mhcflurry.class1_presentation_predictor import Class1PresentationPredictor class FakeAffinityPredictor: def __init__(self, scores): self.scores = scores self.call_sizes = [] def predict(self, peptides, alleles, model_kwargs=None, throw=True): seqs = list(peptides.sequences) alleles = list(alleles) self.call_sizes.append(len(seqs)) return numpy.asarray([ self.scores[(allele, peptide)] for allele, peptide in zip(alleles, seqs) ], dtype=float) def percentile_ranks(self, affinities, alleles=None, throw=False): return numpy.zeros(len(affinities), dtype=float) class FakeCartesianAffinityPredictor(FakeAffinityPredictor): def __init__(self, scores): super().__init__(scores) self.cartesian_call_shapes = [] def predict_cartesian_pan_allele( self, peptides, alleles, throw=True, model_kwargs=None): del throw, model_kwargs seqs = list(peptides.sequences) alleles = list(alleles) self.cartesian_call_shapes.append((len(seqs), len(alleles))) return numpy.asarray([ [self.scores[(allele, peptide)] for allele in alleles] for peptide in seqs ], dtype=float) def test_predict_affinity_sample_names_none_streams_best_by_sample(monkeypatch): monkeypatch.setattr( presentation_module, "_PRESENTATION_PREDICT_TARGET_ROWS", 4, ) scores = { ("A", "P0"): 5.0, ("A", "P1"): 10.0, ("A", "P2"): numpy.nan, ("B", "P0"): 5.0, ("B", "P1"): 1.0, ("B", "P2"): numpy.nan, ("C", "P0"): 2.0, ("C", "P1"): 9.0, ("C", "P2"): numpy.nan, } affinity_predictor = FakeAffinityPredictor(scores) predictor = Class1PresentationPredictor( affinity_predictor=affinity_predictor, ) result = predictor.predict_affinity( peptides=["P0", "P1", "P2"], alleles={ "s1": ["B", "A"], "s2": ["C", "A"], }, include_affinity_percentile=False, verbose=0, ) expected = pandas.DataFrame({ "peptide": ["P0", "P1", "P2", "P0", "P1", "P2"], "peptide_num": [0, 1, 2, 0, 1, 2], "sample_name": ["s1", "s1", "s1", "s2", "s2", "s2"], "affinity": [5.0, 1.0, numpy.nan, 2.0, 9.0, numpy.nan], "best_allele": ["B", "B", None, "C", "C", None], }) pandas.testing.assert_frame_equal(result, expected) assert affinity_predictor.call_sizes assert max(affinity_predictor.call_sizes) <= 4 def test_predict_affinity_uses_cartesian_fast_path(monkeypatch): monkeypatch.setattr( presentation_module, "_PRESENTATION_PREDICT_TARGET_ROWS", 4, ) scores = { ("A", "P0"): 3.0, ("A", "P1"): 10.0, ("B", "P0"): 5.0, ("B", "P1"): 1.0, ("C", "P0"): 2.0, ("C", "P1"): 9.0, } affinity_predictor = FakeCartesianAffinityPredictor(scores) predictor = Class1PresentationPredictor( affinity_predictor=affinity_predictor, ) result = predictor.predict_affinity( peptides=["P0", "P1"], alleles={ "s1": ["B", "A"], "s2": ["C", "A"], }, include_affinity_percentile=False, verbose=0, ) assert result.affinity.tolist() == [3.0, 1.0, 2.0, 9.0] assert result.best_allele.tolist() == ["A", "B", "C", "C"] assert affinity_predictor.cartesian_call_shapes assert affinity_predictor.call_sizes == [] def test_predict_affinity_sample_names_none_handles_no_peptides(): affinity_predictor = FakeAffinityPredictor({}) predictor = Class1PresentationPredictor( affinity_predictor=affinity_predictor, ) result = predictor.predict_affinity( peptides=[], alleles={"s1": ["A"], "s2": ["B"]}, include_affinity_percentile=False, verbose=0, ) assert list(result.columns) == [ "peptide", "peptide_num", "sample_name", "affinity", "best_allele", ] assert result.empty assert affinity_predictor.call_sizes == [] def test_fit_from_scores_trains_expected_variants(): predictor = Class1PresentationPredictor() with warnings.catch_warnings(): warnings.simplefilter("error", DeprecationWarning) predictor.fit_from_scores( targets=[0, 1, 0, 1, 0, 1], affinities=[50000, 50, 30000, 100, 40000, 75], processing_scores_by_model={ "without_flanks": [0.1, 0.9, 0.2, 0.7, 0.1, 0.8], "with_flanks": [0.2, 0.8, 0.3, 0.6, 0.2, 0.7], }, verbose=0, ) assert set(predictor.weights_dataframe.index) == { "without_flanks", "with_flanks", } assert set(predictor.weights_dataframe.columns) == { "intercept", "affinity_score", "processing_score", } def test_new_presentation_models_use_published_logistic_recipe(): model = Class1PresentationPredictor().get_model() assert model.solver == "lbfgs" assert model.max_iter == 100 def test_percentile_calibration_preserves_compressed_score_ranking(): """Low presentation scores must not collapse into one percentile bin.""" rng = numpy.random.default_rng(42) score_logits = rng.normal(loc=-9.5, scale=2.0, size=50000) scores = 1.0 / (1.0 + numpy.exp(-score_logits)) hit_probability = 1.0 / ( 1.0 + numpy.exp(-(numpy.log10(scores) + 4.0) * 1.5) ) hits = rng.random(scores.size) < hit_probability predictor = Class1PresentationPredictor() predictor.calibrate_percentile_ranks(scores) percentiles = predictor.percentile_ranks(scores) raw_auc = roc_auc_score(hits, scores) percentile_auc = roc_auc_score(hits, -percentiles) assert abs(raw_auc - percentile_auc) < 0.001 assert numpy.unique(percentiles).size > 9000 assert (percentiles == 100.0).mean() < 0.001 def test_percentile_calibration_rejects_constant_scores(): predictor = Class1PresentationPredictor() with pytest.raises(ValueError, match="constant score distribution"): predictor.calibrate_percentile_ranks(numpy.ones(100)) def test_percentile_calibration_preserves_independent_upper_tail_ranking(): """Uniform quantiles merge the rare high-score region that matters for AP.""" # Calibration is an independent, label-free reference distribution. calibration = (numpy.arange(1000000) + 0.5) / 1000000 rng = numpy.random.default_rng(402) scores = rng.uniform(0.999902, 0.999998, 4000) probability = 1.0 / (1.0 + numpy.exp(-(scores - 0.99995) * 100000)) hits = rng.random(scores.size) < probability previous = Class1PresentationPredictor() previous.calibrate_percentile_ranks( calibration, bins=numpy.quantile( calibration, numpy.linspace(0, 1, 10001))) predictor = Class1PresentationPredictor() predictor.calibrate_percentile_ranks(calibration) raw_ap = average_precision_score(hits, scores) previous_percentiles = previous.percentile_ranks(scores) percentiles = predictor.percentile_ranks(scores) assert numpy.unique(previous_percentiles).size == 1 assert raw_ap - average_precision_score(hits, -previous_percentiles) > 0.3 assert abs(raw_ap - average_precision_score(hits, -percentiles)) < 0.003 assert numpy.unique(percentiles).size > 90 @pytest.mark.parametrize("num_bins", [1, 10, 100, 1000, 10000]) def test_presentation_bins_retain_base_grid_and_bound_tail_budget(num_bins): scores = numpy.linspace(0, 1, 100000) previous = numpy.quantile(scores, numpy.linspace(0, 1, num_bins + 1)) edges = presentation_module.presentation_percent_rank_bins(scores, num_bins) assert numpy.isin(previous, edges).all() assert len(edges) <= num_bins + min(num_bins, 1000) + 1 assert numpy.isfinite(edges).all() assert (numpy.diff(edges) > 0).all() assert edges[0] == scores[0] assert edges[-1] == scores[-1] if num_bins > 1: extra = edges[~numpy.isin(edges, previous)] assert len(extra) > 0 assert (extra >= numpy.quantile(scores, 0.99)).all() # More resolution near the maximum, not merely more uniform bins. assert (edges > 0.999).sum() > (previous > 0.999).sum() @pytest.mark.parametrize("size", [2, 10, 100, 10000]) def test_presentation_bins_small_calibration_sets(size): scores = numpy.linspace(0, 1, size) expected = numpy.quantile(scores, numpy.linspace(0, 1, size + 1)) numpy.testing.assert_array_equal( presentation_module.presentation_percent_rank_bins(scores), expected) def test_presentation_bins_handle_repeated_and_nonfinite_scores(): scores = numpy.repeat([0.0, 0.1, 0.2, 0.99, 1.0], 3000) with_nonfinite = numpy.r_[scores, numpy.nan, numpy.inf, -numpy.inf] edges = presentation_module.presentation_percent_rank_bins(with_nonfinite) numpy.testing.assert_array_equal( edges, presentation_module.presentation_percent_rank_bins(scores)) assert numpy.isfinite(edges).all() assert (numpy.diff(edges) > 0).all() predictor = Class1PresentationPredictor() predictor.calibrate_percentile_ranks(with_nonfinite, method="histogram") probes = numpy.r_[-numpy.inf, numpy.linspace(0, 1, 1001), numpy.inf] percentiles = predictor.percentile_ranks(probes) assert (numpy.diff(percentiles) <= 0).all() assert ((percentiles >= 0) & (percentiles <= 100)).all() assert percentiles[0] == 100 assert percentiles[-1] == 0 assert numpy.isnan(predictor.percentile_ranks([numpy.nan])[0]) @pytest.mark.parametrize("scores", [[], [numpy.nan, numpy.inf, -numpy.inf]]) def test_presentation_bins_reject_empty_finite_distribution(scores): with pytest.raises(ValueError, match="without scores"): presentation_module.presentation_percent_rank_bins(scores) @pytest.mark.parametrize("num_bins", [0, -1]) def test_presentation_bins_reject_nonpositive_budget(num_bins): with pytest.raises(ValueError, match="at least 1"): presentation_module.presentation_percent_rank_bins([0.0, 1.0], num_bins) @pytest.mark.parametrize("bins", [None, 20, [0.0, 0.5, 0.9, 1.0]]) def test_presentation_calibration_round_trip_preserves_saved_transform( tmp_path, monkeypatch, bins): scores = numpy.linspace(0, 1, 20000) predictor = Class1PresentationPredictor( weights_dataframe=pandas.DataFrame({ "intercept": [-1.0], "affinity_score": [1.0], "processing_score": [1.0]}, index=["without_flanks"])) predictor.calibrate_percentile_ranks(scores, bins=bins) predictor.save( str(tmp_path), write_affinity_predictor=False, write_processing_predictor=False, write_info=False) def unexpected_recalibration(*args, **kwargs): raise AssertionError("Loading must not rebuild an existing calibration") monkeypatch.setattr( presentation_module, "presentation_percent_rank_bins", unexpected_recalibration) monkeypatch.setattr( presentation_module.Class1AffinityPredictor, "load", lambda *args, **kwargs: None) loaded = Class1PresentationPredictor.load(str(tmp_path)) probes = numpy.random.default_rng(402).uniform(0, 1, 10000) numpy.testing.assert_allclose( loaded.percentile_ranks(probes), predictor.percentile_ranks(probes), rtol=0, atol=1e-12) if bins is not None: from mhcflurry import HistogramPercentRankTransform expected = HistogramPercentRankTransform() expected.fit(scores, bins=bins) numpy.testing.assert_array_equal( predictor.percent_rank_transform.bin_edges, expected.bin_edges) numpy.testing.assert_array_equal( predictor.percent_rank_transform.cdf, expected.cdf) def test_save_write_metadata_false_skips_metadata(tmp_path): predictor = Class1PresentationPredictor( metadata_dataframes={"extra": pandas.DataFrame({"x": [1]})}) predictor.save( str(tmp_path), write_affinity_predictor=False, write_processing_predictor=False, write_weights=False, write_percent_ranks=False, write_info=False, write_metadata=False, ) assert not (tmp_path / "extra.csv.bz2").exists() def test_save_info_embeds_release_provenance(tmp_path, monkeypatch): monkeypatch.setenv("MHCFLURRY_RELEASE_GIT_COMMIT", "abc123") monkeypatch.setenv("MHCFLURRY_RELEASE_WORKFLOW_ID", "run-123") predictor = Class1PresentationPredictor() predictor.save( str(tmp_path), write_affinity_predictor=False, write_processing_predictor=False, write_weights=False, write_percent_ranks=False, write_info=True, write_metadata=False, ) info = (tmp_path / "info.txt").read_text() assert "git commit\tabc123" in info assert "workflow id\trun-123" in info class FakePresentationPredictor: def predict_affinity( self, peptides, alleles, sample_names=None, include_affinity_percentile=False, verbose=0, model_kwargs=None): del alleles, sample_names, include_affinity_percentile, verbose assert model_kwargs == {"batch_size": "auto"} return pandas.DataFrame({ "affinity": numpy.arange(len(peptides), dtype=float) + 10.0, }) def predict_processing( self, peptides, n_flanks=None, c_flanks=None, verbose=0, batch_size="auto"): del c_flanks, verbose assert batch_size == "auto" offset = 100.0 if n_flanks is None else 200.0 return numpy.arange(len(peptides), dtype=float) + offset def test_presentation_feature_chunks_use_global_data(): df = pandas.DataFrame({ "experiment_id": ["s1", "s1", "s1", "s2", "s2"], "peptide": ["A", "B", "C", "D", "E"], "n_flank": ["N"] * 5, "c_flank": ["C"] * 5, }) work_items = train_presentation.make_feature_work_items(df, chunk_size=2) assert [ (item["start"], item["end"], item["sample_name"]) for item in work_items ] == [ (0, 2, "s1"), (2, 3, "s1"), (3, 5, "s2"), ] train_presentation.WORKER_CONTEXT.clear() train_presentation.WORKER_CONTEXT.update({ "predictor": FakePresentationPredictor(), "data": df, "experiment_to_alleles": { "s1": ["A*01:01"], "s2": ["A*02:01"], }, }) result = train_presentation.predict_feature_chunk( chunk_num=0, start=0, end=2, sample_name="s1", include_without_flanks=True, include_with_flanks=True, ) numpy.testing.assert_equal(result["affinity"], [10.0, 11.0]) numpy.testing.assert_equal( result["processing_scores"]["without_flanks"], [100.0, 101.0]) numpy.testing.assert_equal( result["processing_scores"]["with_flanks"], [200.0, 201.0]) def test_presentation_feature_prediction_supports_serial_fallback(monkeypatch): df = pandas.DataFrame({ "experiment_id": ["s1", "s1", "s1"], "peptide": ["A", "B", "C"], }) predictor = FakePresentationPredictor() predictor.processing_predictor_without_flanks = None predictor.processing_predictor_with_flanks = None monkeypatch.setattr( train_presentation, "refine_local_parallelism_from_worker_context", lambda args, context: args, ) monkeypatch.setattr( train_presentation, "worker_pool_with_gpu_assignments_from_args", lambda *args, **kwargs: None, ) result = train_presentation.predict_features_parallel( Namespace( feature_chunk_size=2, num_jobs=0, gpus=0, max_workers_per_gpu=1, ), predictor, df, {"s1": ["A*01:01"]}, ) numpy.testing.assert_equal(result["affinity"], [10.0, 11.0, 10.0]) assert result["processing_scores_by_model"] == {} def test_presentation_training_rejects_nonpositive_feature_chunk_size(): with pytest.raises(SystemExit): train_presentation.parser.parse_args([ "--out-models-dir", "out", "--affinity-predictor", "affinity", "--processing-predictor-with-flanks", "with", "--processing-predictor-without-flanks", "without", "--feature-chunk-size", "0", ]) class FakeNetwork(torch.nn.Module): def __init__(self): super().__init__() self.weight = torch.nn.Parameter(torch.zeros(4)) class FakeNetworkModel: def __init__(self, network): self._network = network def network(self, borrow=False): del borrow return self._network def test_estimate_presentation_feature_worker_gb_uses_model_shape(monkeypatch): class FakeAffinity: allele_to_allele_specific_models = {} def __init__(self, network): self.class1_pan_allele_models = [FakeNetworkModel(network)] class FakeProcessingPredictor: def __init__(self, network): self.models = [FakeNetworkModel(network)] class FakePresentation: def __init__(self, affinity_network, processing_network): self.affinity_predictor = FakeAffinity(affinity_network) self.processing_predictor_without_flanks = FakeProcessingPredictor( processing_network) self.processing_predictor_with_flanks = None affinity_network = FakeNetwork() processing_network = FakeNetwork() monkeypatch.setenv("MHCFLURRY_PRESENTATION_WORKER_RUNTIME_FLOOR_GB", "1") monkeypatch.setenv("MHCFLURRY_PRESENTATION_WORKER_SAFETY_FACTOR", "1") estimate = train_presentation.estimate_presentation_feature_worker_gb( type("Args", (), {"feature_chunk_size": 20})(), FakePresentation(affinity_network, processing_network), ) # The launch-time estimate contains persistent model/runtime state only; # transient inference activations consume the shared live-memory budget. assert estimate == 4.0 @pytest.mark.parametrize( ("name", "value"), [ ("MHCFLURRY_PRESENTATION_WORKER_RUNTIME_FLOOR_GB", "nan"), ("MHCFLURRY_PRESENTATION_WORKER_SAFETY_FACTOR", "inf"), ("MHCFLURRY_PRESENTATION_WORKER_SAFETY_FACTOR", "-1"), ], ) def test_presentation_worker_estimator_rejects_unsafe_env( monkeypatch, name, value): monkeypatch.setenv(name, value) with pytest.raises(ValueError, match=name): train_presentation.estimate_presentation_feature_worker_gb( type("Args", (), {"feature_chunk_size": 20})(), type("FakePresentation", (), { "affinity_predictor": type("FakeAffinity", (), { "class1_pan_allele_models": [], "allele_to_allele_specific_models": {}, })(), "processing_predictor_without_flanks": None, "processing_predictor_with_flanks": None, })(), ) def test_presentation_worker_estimator_uses_cartesian_merged_peak(monkeypatch): merged_network = FakeNetwork() merged_network.networks = [FakeNetwork(), FakeNetwork()] monkeypatch.setattr( train_presentation, "estimate_calibration_peak_bytes_per_row", lambda network: 123 if network is merged_network else 0, ) monkeypatch.setattr( train_presentation, "estimate_peak_bytes_per_row", lambda network: 999, ) assert ( train_presentation.presentation_network_peak_bytes_per_row( merged_network) == 123 ) mhcflurry-2.3.6/test/test_class1_processing_neural_network.py000066400000000000000000001400151525677230600247040ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Tests for Class1ProcessingNeuralNetwork. """ import gc import pytest import re import numpy import torch from sklearn.metrics import roc_auc_score import pandas from mhcflurry.class1_processing_neural_network import ( Class1ProcessingModel, Class1ProcessingNeuralNetwork, ) from mhcflurry.common import random_peptides from mhcflurry.amino_acid import AMINO_ACIDS, BLOSUM62_MATRIX from mhcflurry.flanking_encoding import FlankingEncoding from mhcflurry.testing_utils import cleanup, startup numpy.random.seed(0) @pytest.fixture(autouse=True) def setup_teardown(): """Setup and teardown for each test.""" startup() yield cleanup() table = dict([ (tuple(encoding), amino_acid) for amino_acid, encoding in BLOSUM62_MATRIX.iterrows() ]) N_CLEAVAGE_REGEX = "[AILQSV][SINFEKLH][MNPQYK]" N_CLEAVAGE_FIRST = "AILQSV" N_CLEAVAGE_SECOND = "SINFEKLH" N_CLEAVAGE_THIRD = "MNPQYK" INDEX_FIRST_HITS = "SIQVL" INDEX_LAST_HITS = "YIPASD" def _cycle(letters, offset): """Return a deterministic residue from ``letters``.""" return letters[offset % len(letters)] def decode_matrix(array): """ Convert BLOSSUM62-encoded sequences to amino acid strings. Parameters ---------- array : shape (num, length, dim) where num is number of sequences, length is the length of the sequences, and dim is the BLOSUM62 dimensions (i.e. 21). Returns ------- list of strings """ (num, length, dim) = array.shape assert dim == 21 results = [] for row in array: item = "".join([ table[tuple(x)] for x in row ]) results.append(item) return results def decode_sequence_array(array): """Decode either vector-encoded or index-encoded sequence arrays.""" if array.ndim == 3: return decode_matrix(array) return [ "".join(AMINO_ACIDS[int(value)] for value in row) for row in array ] def test_neural_network_input(): """Test that input encoding produces expected sequences.""" model = Class1ProcessingNeuralNetwork( peptide_max_length=12, n_flank_length=8, c_flank_length=5) tests = [ { # Input "peptide": "SIINFEKL", "n_flank": "QWERTYIPSDFG", "c_flank": "FGHKLCVNMQWE", # Expected results "sequence": "TYIPSDFGSIINFEKLFGHKLXXXX", }, { # Input "peptide": "QCV", "n_flank": "QWERTYIPSDFG", "c_flank": "FGHKLCVNMQWE", # Expected results "sequence": "TYIPSDFGQCVFGHKLXXXXXXXXX", }, { # Input "peptide": "QCVSQCVSQCVS", "n_flank": "QWE", "c_flank": "MNV", # Expected results "sequence": "XXXXXQWEQCVSQCVSQCVSMNVXX", }, { # Input "peptide": "QCVSQCVSQCVS", "n_flank": "", "c_flank": "MNV", # Expected results "sequence": "XXXXXXXXQCVSQCVSQCVSMNVXX", }, { # Input "peptide": "QCVSQCVSQCVS", "n_flank": "", "c_flank": "", # Expected results "sequence": "XXXXXXXXQCVSQCVSQCVSXXXXX", }, ] for (i, d) in enumerate(tests): encoding = FlankingEncoding( peptides=[d['peptide']], n_flanks=[d['n_flank']], c_flanks=[d['c_flank']]) results = model.network_input(encoding) (decoded,) = decode_sequence_array(results['sequence']) numpy.testing.assert_equal(decoded, d['sequence']) numpy.testing.assert_equal(results['peptide_length'], len(d['peptide'])) # Test all at once df = pandas.DataFrame(tests) encoding = FlankingEncoding(df.peptide, df.n_flank, df.c_flank) results = model.network_input(encoding) df["decoded"] = decode_sequence_array(results['sequence']) numpy.testing.assert_array_equal(df.decoded.to_numpy(), df.sequence.to_numpy()) numpy.testing.assert_equal( results['peptide_length'], df.peptide.str.len().values) assert results["sequence"].ndim == 2 assert results["sequence"].dtype == numpy.int8 tensor_results = model.network_input_tensors(encoding, device="cpu") numpy.testing.assert_array_equal( tensor_results["sequence"].numpy(), results["sequence"]) numpy.testing.assert_array_equal( tensor_results["peptide_length"].numpy(), results["peptide_length"]) assert tensor_results["sequence"].dtype == torch.int8 tensor_results2 = model.network_input_tensors(encoding, device="cpu") assert tensor_results2["sequence"] is tensor_results["sequence"] encoding.clear_tensor_cache() tensor_results3 = model.network_input_tensors(encoding, device="cpu") assert tensor_results3["sequence"] is not tensor_results["sequence"] def _boundary_network(peptide_context=2, context_dropout=0.0): model = Class1ProcessingNeuralNetwork( peptide_max_length=15, n_flank_length=5, c_flank_length=5, flanking_averages=False, convolutional_filters=8, convolutional_kernel_size=3, post_convolutional_dense_layer_sizes=[], dropout_rate=0.0, cleavage_boundary_flank_length=5, cleavage_boundary_peptide_length=peptide_context, cleavage_boundary_hidden_size=4, cleavage_boundary_context_dropout=context_dropout, ) network = model.make_network( **model.network_hyperparameter_defaults.subselect(model.hyperparameters) ) return model, network def _boundary_windows(model, network, peptide, n_flank, c_flank): inputs = model.network_input_tensors( FlankingEncoding([peptide], [n_flank], [c_flank]), device="cpu") sequence = torch.nn.functional.embedding( inputs["sequence"].long(), network.sequence_embedding_table) return network._extract_boundary_windows( sequence, inputs["peptide_length"]) @pytest.mark.parametrize("peptide_context,expected_n,expected_c", [ (2, "FGHIKSI", "KLLMNPQ"), (5, "FGHIKSIINF", "NFEKLLMNPQ"), (10, "FGHIKSIINFEKLXX", "XXSIINFEKLLMNPQ"), (15, "FGHIKSIINFEKLXXXXXXX", "XXXXXXXSIINFEKLLMNPQ"), ]) def test_cleavage_boundary_windows_cross_both_sides( peptide_context, expected_n, expected_c): model, network = _boundary_network(peptide_context=peptide_context) n_window, c_window = _boundary_windows( model, network, "SIINFEKL", "ACDEFGHIK", "LMNPQRST") assert decode_matrix(n_window.detach().numpy()) == [expected_n] assert decode_matrix(c_window.detach().numpy()) == [expected_c] def test_oversized_boundary_windows_predict_mixed_peptide_lengths(): model, network = _boundary_network(peptide_context=15) model._network = network result = model.predict( peptides=["SIINFEKL", "SIINFEKLSIINFEK"], n_flanks=["FGHIK", ""], c_flanks=["LMNPQ", ""], batch_size=2) assert result.shape == (2,) assert numpy.isfinite(result).all() def test_cleavage_boundary_missing_context_uses_unknown_token(): model, network = _boundary_network(peptide_context=2) n_window, c_window = _boundary_windows( model, network, "SIINFEKL", "", "") assert decode_matrix(n_window.detach().numpy()) == ["XXXXXSI"] assert decode_matrix(c_window.detach().numpy()) == ["KLXXXXX"] def test_cleavage_boundary_context_dropout_preserves_peptide_side(): model, network = _boundary_network( peptide_context=2, context_dropout=1.0) n_window, c_window = _boundary_windows( model, network, "SIINFEKL", "FGHIK", "LMNPQ") network.train() n_window, c_window = network._apply_context_dropout(n_window, c_window) assert decode_matrix(n_window.detach().numpy()) == ["XXXXXSI"] assert decode_matrix(c_window.detach().numpy()) == ["KLXXXXX"] def test_cleavage_boundary_starts_as_peptide_only_model(): model, network = _boundary_network(peptide_context=2) model._network = network network.eval() scores = model.predict( peptides=["SIINFEKL", "SIINFEKL"], n_flanks=["AAAAA", "RRRRR"], c_flanks=["CCCCC", "YYYYY"], batch_size=2, ) numpy.testing.assert_allclose(scores[0], scores[1], rtol=0, atol=1e-7) numpy.testing.assert_array_equal( network.output_layer.weight.detach().numpy()[0, -2:], [0, 0]) def test_cleavage_boundary_base_is_exact_no_flank_function(): boundary_model, boundary = _boundary_network(peptide_context=2) no_flank_model = Class1ProcessingNeuralNetwork( peptide_max_length=15, n_flank_length=0, c_flank_length=0, flanking_averages=False, convolutional_filters=8, convolutional_kernel_size=3, post_convolutional_dense_layer_sizes=[], dropout_rate=0.0, ) no_flank = no_flank_model.make_network( **no_flank_model.network_hyperparameter_defaults.subselect( no_flank_model.hyperparameters) ) no_flank.conv1.load_state_dict(boundary.conv1.state_dict()) no_flank.n_flank_post_convs.load_state_dict( boundary.n_flank_post_convs.state_dict()) no_flank.c_flank_post_convs.load_state_dict( boundary.c_flank_post_convs.state_dict()) with torch.no_grad(): no_flank.output_layer.weight.copy_( boundary.output_layer.weight[:, :4]) no_flank.output_layer.bias.copy_(boundary.output_layer.bias) flanking = FlankingEncoding( ["SIINFEKL", "GILGFVFTL"], ["FGHIK", "AAAAA"], ["LMNPQ", "CCCCC"], ) boundary_inputs = boundary_model.network_input_tensors( flanking, device="cpu") no_flank_inputs = no_flank_model.network_input_tensors( flanking, device="cpu") boundary.eval() no_flank.eval() torch.testing.assert_close( boundary(boundary_inputs), no_flank(no_flank_inputs)) def test_cleavage_boundary_weight_roundtrip(): model, network = _boundary_network( peptide_context=5, context_dropout=0.25) inputs = model.network_input_tensors( FlankingEncoding( ["SIINFEKL", "GILGFVFTL"], ["FGHIK", "AAAAA"], ["LMNPQ", "CCCCC"], ), device="cpu", ) network.eval() observed = network(inputs) clone = model.make_network( **model.network_hyperparameter_defaults.subselect(model.hyperparameters) ) clone.set_weights_list(network.get_weights_list(), auto_convert_keras=False) clone.eval() torch.testing.assert_close(observed, clone(inputs)) @pytest.mark.parametrize("width", [5, 7, 9, 11, 13, 15]) @pytest.mark.parametrize("boundary", [False, True]) @pytest.mark.parametrize("length", [8, 9, 10, 11, 15]) @pytest.mark.parametrize("flanks", [("FGHIK", "LMNPQ"), ("IK", "LM"), ("", "")]) def test_processing_unknown_padding_actual_convolution_windows(width, boundary, length, flanks): """Inspect the windows actually reaching Conv1d, not just the encoder.""" peptide = "SIINFEKLGILGFVF"[:length] model = Class1ProcessingNeuralNetwork( n_flank_length=5, c_flank_length=5, convolutional_filters=4, convolutional_kernel_size=width, convolutional_padding_mode="unknown", dropout_rate=0, cleavage_boundary_flank_length=5 if boundary else 0, cleavage_boundary_peptide_length=5 if boundary else 0) network = model.make_network( **model.network_hyperparameter_defaults.subselect(model.hyperparameters)) inputs = model.network_input_tensors( FlankingEncoding([peptide], [flanks[0]], [flanks[1]]), device="cpu") captured = [] hook = network.conv1.register_forward_pre_hook( lambda module, args: captured.append(args[0].detach().clone())) network.eval() with torch.no_grad(): prediction = network(inputs) hook.remove() assert torch.isfinite(prediction).all() encoded = decode_matrix(captured[0].permute(0, 2, 1).numpy())[0] radius = width // 2 if boundary: expected = peptide.ljust(15, "X") peptide_start = 0 else: expected = (flanks[0].rjust(5, "X") + peptide + flanks[1].ljust(5, "X")).ljust(25, "X") peptide_start = 5 assert encoded == "X" * radius + expected + "X" * radius # Full output retains the coordinates consumed by peptide-end pooling. assert network.conv1(captured[0]).shape[-1] == len(expected) for center in (peptide_start, peptide_start + length - 1): observed = encoded[center:center + width] oracle = "".join(expected[i] if 0 <= i < len(expected) else "X" for i in range(center - radius, center + radius + 1)) assert observed == oracle @pytest.mark.parametrize("width", [1, 5, 8, 15]) def test_processing_padding_roundtrip_and_legacy_default(width): """Opt-in padding survives config/weight loading; absent config means zeros.""" from mhcflurry import Class1ProcessingPredictor import tempfile old = Class1ProcessingNeuralNetwork( convolutional_kernel_size=width, convolutional_filters=4, dropout_rate=0) assert old.hyperparameters["convolutional_padding_mode"] == "zeros" old_network = old.make_network( **old.network_hyperparameter_defaults.subselect(old.hyperparameters)) assert old_network.conv1.padding == "same" sequence = torch.randn(2, 15, 21) assert old_network._pad_convolution_context(sequence) is sequence model = Class1ProcessingNeuralNetwork( convolutional_kernel_size=width, convolutional_filters=4, dropout_rate=0, convolutional_padding_mode="unknown") model._network = model.make_network( **model.network_hyperparameter_defaults.subselect(model.hyperparameters)) scores = model.predict(["SIINFEKL"], ["FGHIK"], ["LMNPQ"]) with tempfile.TemporaryDirectory() as directory: Class1ProcessingPredictor([model]).save(directory) clone = Class1ProcessingPredictor.load(directory) assert clone.models[0].hyperparameters["convolutional_padding_mode"] == "unknown" numpy.testing.assert_allclose( scores, clone.predict(["SIINFEKL"], ["FGHIK"], ["LMNPQ"]), atol=1e-7) def test_fit_uses_eager_network_for_validation_by_default(monkeypatch): """Avoid torch.compile recompiles from train/eval grad-mode changes.""" import mhcflurry.class1_processing_neural_network as processing_module class CompiledWrapper(torch.nn.Module): def __init__(self, module): super().__init__() self._orig_mod = module self.train_forwards = 0 self.eval_forwards = 0 def forward(self, inputs): if self.training: self.train_forwards += 1 else: self.eval_forwards += 1 return self._orig_mod(inputs) compiled_wrappers = [] def fake_compile(network, device): del device wrapper = CompiledWrapper(network) compiled_wrappers.append(wrapper) return wrapper captured_regularization_parameters = [] original_regularization_penalty = ( processing_module.Class1ProcessingNeuralNetwork._regularization_penalty ) def fake_regularization_penalty(parameters, l1=0.0, l2=0.0): captured_regularization_parameters.append(tuple(parameters)) return original_regularization_penalty(parameters, l1=l1, l2=l2) monkeypatch.setattr(processing_module, "maybe_compile_network", fake_compile) monkeypatch.setattr( processing_module.Class1ProcessingNeuralNetwork, "_regularization_penalty", staticmethod(fake_regularization_penalty), ) monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE_VALIDATION", raising=False) model = Class1ProcessingNeuralNetwork( max_epochs=1, validation_split=0.5, early_stopping=False, minibatch_size=2, peptide_max_length=9, n_flank_length=4, c_flank_length=4, convolutional_filters=4, convolutional_kernel_size=3, convolutional_kernel_l1_l2=[0.01, 0.0], post_convolutional_dense_layer_sizes=[], ) model.fit( sequences=FlankingEncoding( peptides=["SIINFEKL", "SIINFEKA", "SIINFEKY", "SIINFEKF"], n_flanks=["AAAA", "CCCC", "DDDD", "EEEE"], c_flanks=["FFFF", "GGGG", "HHHH", "IIII"], ), targets=numpy.array([1, 0, 1, 0], dtype=numpy.float32), verbose=-1, progress_print_interval=None, ) assert len(compiled_wrappers) == 1 assert compiled_wrappers[0].train_forwards > 0 assert compiled_wrappers[0].eval_forwards == 0 conv1_weight = model.network().conv1.weight assert any( any(param is conv1_weight for param in params) for params in captured_regularization_parameters ) def test_fit_uses_effective_validation_batch_size(monkeypatch): """Processing validation uses the larger forward-only batch heuristic.""" import mhcflurry.class1_processing_neural_network as processing_module validation_batch_sizes = [] class RecordingValidationNetwork(torch.nn.Module): def __init__(self, network): super().__init__() self.network = network def forward(self, inputs): validation_batch_sizes.append(len(inputs["sequence"])) return self.network(inputs) monkeypatch.setattr( processing_module, "maybe_compile_network", lambda network, device: network, ) monkeypatch.setattr( processing_module, "validation_forward_network", lambda network, eager_network: RecordingValidationNetwork(eager_network), ) num_examples = 20 model = Class1ProcessingNeuralNetwork( max_epochs=1, validation_split=0.5, early_stopping=False, minibatch_size=2, peptide_max_length=9, n_flank_length=4, c_flank_length=4, convolutional_filters=4, convolutional_kernel_size=3, post_convolutional_dense_layer_sizes=[], ) model.fit( sequences=FlankingEncoding( peptides=["SIINFEKL"] * num_examples, n_flanks=["AAAA"] * num_examples, c_flanks=["FFFF"] * num_examples, ), targets=numpy.arange(num_examples, dtype=numpy.float32) % 2, verbose=-1, progress_print_interval=None, ) assert model.fit_info[-1]["effective_validation_batch_size"] == 8 assert validation_batch_sizes == [8, 2] @pytest.mark.parametrize("mask", [[False, True, False, True], [False] * 4]) def test_explicit_validation_mask_survives_input_shuffle(monkeypatch, mask): import mhcflurry.class1_processing_neural_network as module inputs_seen = [] original = Class1ProcessingModel.forward def recording_forward(self, inputs): if not self.training: inputs_seen.append(inputs["sequence"].detach().cpu().numpy()) return original(self, inputs) monkeypatch.setattr(Class1ProcessingModel, "forward", recording_forward) monkeypatch.setattr(module, "maybe_compile_network", lambda network, device: network) model = Class1ProcessingNeuralNetwork( max_epochs=1, validation_split=0.75, early_stopping=False, minibatch_size=4, validation_batch_size=4, peptide_max_length=9, n_flank_length=2, c_flank_length=2, convolutional_filters=4, convolutional_kernel_size=3, post_convolutional_dense_layer_sizes=[]) sequences = FlankingEncoding( peptides=["SIINFEKL", "SIINFEKA", "SIINFEKY", "SIINFEKF"], n_flanks=["AA"] * 4, c_flanks=["CC"] * 4) encoded = model.network_input(sequences)["sequence"] permutation = numpy.array([3, 0, 1, 2]) model.fit(sequences, [1, 0, 1, 0], validation_mask=mask, shuffle_permutation=permutation, verbose=-1) info = model.fit_info[-1] assert info["validation_policy"] == "explicit-mask" assert info["validation_rows"] == sum(mask) assert info["training_rows"] == 4 - sum(mask) if any(mask): expected = encoded[permutation][numpy.array(mask)[permutation]] numpy.testing.assert_array_equal(numpy.concatenate(inputs_seen), expected) else: assert not inputs_seen @pytest.mark.parametrize("mask", [[True] * 4, [0, 1, 0, 1], [True, False]]) def test_invalid_explicit_validation_masks_rejected(mask): model = Class1ProcessingNeuralNetwork(max_epochs=1) sequences = FlankingEncoding(["SIINFEKL"] * 4, ["AA"] * 4, ["CC"] * 4) with pytest.raises(ValueError, match="validation_mask"): model.fit(sequences, [1, 0, 1, 0], validation_mask=mask, verbose=-1) def test_processing_fit_can_restore_best_validation_checkpoint(monkeypatch): import mhcflurry.class1_processing_neural_network as processing_module calls = [] def zero_checkpoint(module): calls.append(True) return { name: torch.zeros_like(value, device="cpu") for name, value in module.state_dict().items() } monkeypatch.setattr( processing_module, "copy_module_state_dict_to_cpu", zero_checkpoint) model = Class1ProcessingNeuralNetwork( max_epochs=2, validation_split=0.5, early_stopping=False, restore_best_weights=True, minibatch_size=2, peptide_max_length=9, n_flank_length=4, c_flank_length=4, convolutional_filters=4, convolutional_kernel_size=3, post_convolutional_dense_layer_sizes=[], ) model.fit( sequences=FlankingEncoding( peptides=["SIINFEKL"] * 4, n_flanks=["AAAA"] * 4, c_flanks=["FFFF"] * 4, ), targets=numpy.array([0, 1, 0, 1], dtype=numpy.float32), verbose=-1, progress_print_interval=None, ) assert calls assert model.fit_info[-1]["restored_best_weights"] is True assert model.fit_info[-1]["best_epoch"] is not None for value in model.network().state_dict().values(): assert torch.count_nonzero(value) == 0 def test_fit_does_not_force_full_gc_each_epoch(monkeypatch): """Worker-level model cleanup owns GC; fit must not collect per epoch.""" import mhcflurry.class1_processing_neural_network as processing_module collect_calls = [] monkeypatch.setattr(gc, "collect", lambda: collect_calls.append(True)) monkeypatch.setattr( processing_module, "maybe_compile_network", lambda network, device: network, ) model = Class1ProcessingNeuralNetwork( max_epochs=3, validation_split=0.0, early_stopping=False, minibatch_size=2, peptide_max_length=9, n_flank_length=4, c_flank_length=4, convolutional_filters=4, convolutional_kernel_size=3, post_convolutional_dense_layer_sizes=[], ) model.fit( sequences=FlankingEncoding( peptides=["SIINFEKL"] * 4, n_flanks=["AAAA"] * 4, c_flanks=["FFFF"] * 4, ), targets=numpy.array([0, 1, 0, 1], dtype=numpy.float32), verbose=-1, progress_print_interval=None, ) assert collect_calls == [] def test_processing_peak_estimate_scales_with_conv_shape(): """Processing prediction autosizing should see Conv1d activation width.""" from mhcflurry.pytorch_sizing import estimate_peak_bytes_per_row small = Class1ProcessingNeuralNetwork( peptide_max_length=15, n_flank_length=0, c_flank_length=0, convolutional_filters=16, ) small_network = small.make_network( **small.network_hyperparameter_defaults.subselect(small.hyperparameters) ) large = Class1ProcessingNeuralNetwork( peptide_max_length=15, n_flank_length=5, c_flank_length=5, convolutional_filters=512, ) large_network = large.make_network( **large.network_hyperparameter_defaults.subselect(large.hyperparameters) ) small_estimate = estimate_peak_bytes_per_row(small_network) large_estimate = estimate_peak_bytes_per_row(large_network) assert small_estimate == 15 * 21 * 4 * 2 * 4 assert large_estimate == 25 * 512 * 4 * 2 * 4 assert large_estimate > small_estimate * 40 def test_processing_predict_auto_batch_uses_worker_env(monkeypatch): """Pool workers expose co-resident workers/GPU through the env.""" from mhcflurry import pytorch_sizing captured = {} def fake_resolve( value, device, model=None, num_workers_per_gpu=1, total_rows=None): del value, device, model, total_rows captured["num_workers_per_gpu"] = num_workers_per_gpu return 2 monkeypatch.setenv("MHCFLURRY_MAX_WORKERS_PER_GPU", "4") monkeypatch.setattr(pytorch_sizing, "resolve_prediction_batch_size", fake_resolve) def fake_calibrate( batch_size, device, network, inputs, num_workers_per_gpu=1, total_rows=None, **_kwargs): captured.update({ "calibration_batch_size": batch_size, "calibration_device": device.type, "calibration_workers_per_gpu": num_workers_per_gpu, "calibration_total_rows": total_rows, "calibration_sequence_shape": tuple(inputs["sequence"].shape), "calibration_kernel_size": tuple(network.conv1.kernel_size), }) return batch_size monkeypatch.setattr( pytorch_sizing, "calibrate_prediction_batch_size", fake_calibrate, ) model = Class1ProcessingNeuralNetwork( peptide_max_length=12, n_flank_length=2, c_flank_length=2, convolutional_filters=8, convolutional_kernel_size=5, ) model._network = model.make_network( **model.network_hyperparameter_defaults.subselect(model.hyperparameters) ) peptides = ["SIINFEKL", "GILGFVFTL", "NLVPMVATV"] predictions = model.predict( peptides=peptides, n_flanks=["AA"] * len(peptides), c_flanks=["GG"] * len(peptides), batch_size="auto", ) assert len(predictions) == len(peptides) assert captured["num_workers_per_gpu"] == 4 assert captured["calibration_batch_size"] == 2 assert captured["calibration_device"] == "cpu" assert captured["calibration_workers_per_gpu"] == 4 assert captured["calibration_total_rows"] == 3 assert captured["calibration_sequence_shape"] == (3, 16) assert captured["calibration_kernel_size"] == (5,) def test_processing_predict_auto_batch_retries_device_oom(monkeypatch): """Only auto batches halve and retry after an allocator OOM.""" from mhcflurry import pytorch_sizing class OOMOnce(torch.nn.Module): def __init__(self, network): super().__init__() self.network = network self.raised = False def forward(self, inputs): if not self.raised and len(inputs["sequence"]) > 1: self.raised = True raise RuntimeError("CUDA out of memory in test allocator") return self.network(inputs) monkeypatch.setattr( pytorch_sizing, "resolve_prediction_batch_size", lambda *args, **kwargs: 2, ) model = Class1ProcessingNeuralNetwork( peptide_max_length=12, n_flank_length=2, c_flank_length=2, convolutional_filters=8, ) network = model.make_network( **model.network_hyperparameter_defaults.subselect(model.hyperparameters) ) model._network = OOMOnce(network) peptides = ["SIINFEKL", "GILGFVFTL", "NLVPMVATV"] predictions = model.predict( peptides=peptides, n_flanks=["AA"] * len(peptides), c_flanks=["GG"] * len(peptides), batch_size="auto", ) assert len(predictions) == len(peptides) assert model._network.raised def test_processing_predict_auto_batch_retries_deferred_device_oom(monkeypatch): """A deferred accelerator OOM is synchronized inside the retry loop.""" from mhcflurry import pytorch_sizing synchronize_calls = [] def oom_once(_device): synchronize_calls.append(True) if len(synchronize_calls) == 1: raise RuntimeError("CUDA out of memory in deferred test kernel") monkeypatch.setattr( pytorch_sizing, "resolve_prediction_batch_size", lambda *args, **kwargs: 2, ) monkeypatch.setattr(pytorch_sizing, "synchronize_device", oom_once) model = Class1ProcessingNeuralNetwork( peptide_max_length=12, n_flank_length=2, c_flank_length=2, convolutional_filters=8, ) model._network = model.make_network( **model.network_hyperparameter_defaults.subselect(model.hyperparameters) ) peptides = ["SIINFEKL", "GILGFVFTL", "NLVPMVATV"] predictions = model.predict( peptides=peptides, n_flanks=["AA"] * len(peptides), c_flanks=["GG"] * len(peptides), batch_size="auto", ) assert len(predictions) == len(peptides) assert len(synchronize_calls) == 2 def test_processing_validation_is_batched(monkeypatch): """An explicit validation cap still prevents a whole-fold forward.""" monkeypatch.setenv("MHCFLURRY_TORCH_COMPILE", "0") monkeypatch.setenv("MHCFLURRY_TORCH_COMPILE_LOSS", "0") batch_sizes = [] original_forward = Class1ProcessingModel.forward def recording_forward(self, inputs): batch_sizes.append(int(inputs["sequence"].shape[0])) return original_forward(self, inputs) monkeypatch.setattr(Class1ProcessingModel, "forward", recording_forward) model = Class1ProcessingNeuralNetwork( peptide_max_length=9, n_flank_length=2, c_flank_length=2, convolutional_filters=8, minibatch_size=2, validation_batch_size=3, max_epochs=1, validation_split=0.5, early_stopping=False, ) peptides = [ "SIINFEKL", "GILGFVFTL", "NLVPMVATV", "LLFGYPVYV", "GLCTLVAML", "KLGGALQAK", "VYFLQSINF", "YVLDHLIVV", ] model.fit( sequences=FlankingEncoding( peptides=peptides, n_flanks=["AA"] * len(peptides), c_flanks=["GG"] * len(peptides), ), targets=[1, 0, 1, 0, 1, 0, 1, 0], verbose=-1, ) assert batch_sizes assert max(batch_sizes) == 3 def test_processing_predict_encoded_tensor_public_numpy_wrapper(): """Public numpy predictions delegate through the tensor path.""" model = Class1ProcessingNeuralNetwork( peptide_max_length=12, n_flank_length=2, c_flank_length=2, convolutional_filters=8, ) model._network = model.make_network( **model.network_hyperparameter_defaults.subselect(model.hyperparameters) ) flanking = FlankingEncoding( peptides=["SIINFEKL", "GILGFVFTL", "NLVPMVATV"], n_flanks=["AA", "CC", "DD"], c_flanks=["GG", "HH", "II"]) device = model.get_device() tensor_predictions = model.predict_encoded_tensor( flanking, batch_size=2, device=device) numpy_predictions = model.predict_encoded(flanking, batch_size=2) assert isinstance(tensor_predictions, torch.Tensor) assert tensor_predictions.device.type == device.type numpy.testing.assert_allclose( numpy_predictions, tensor_predictions.detach().cpu().numpy(), rtol=1e-6, atol=1e-7) def test_processing_tensor_path_preserves_nan_for_unsupported_peptides(): model = Class1ProcessingNeuralNetwork( amino_acid_encoding_torch=True, peptide_max_length=9, n_flank_length=2, c_flank_length=2, convolutional_filters=8, ) model._network = model.make_network( **model.network_hyperparameter_defaults.subselect(model.hyperparameters) ) flanking = FlankingEncoding( peptides=["SIINFEKL", "AAAAAAAAAA", "GILGFVFTL"], n_flanks=["AA", "CC", "DD"], c_flanks=["GG", "HH", "II"]) tensor_predictions = model.predict_encoded_tensor( flanking, throw=False, batch_size=2, device="cpu") numpy_predictions = model.predict_encoded( flanking, throw=False, batch_size=2) assert torch.isfinite(tensor_predictions[0]) assert torch.isnan(tensor_predictions[1]) assert torch.isfinite(tensor_predictions[2]) assert numpy.isfinite(numpy_predictions[0]) assert numpy.isnan(numpy_predictions[1]) assert numpy.isfinite(numpy_predictions[2]) @pytest.mark.slow @pytest.mark.integration def test_small(): """Test basic network training with small dataset.""" train_basic_network( num=512, dataset_factory=make_cleavage_motif_dataset, max_epochs=12, minibatch_size=128, validation_split=0.0, dropout_rate=0.0, convolutional_kernel_l1_l2=[0.0, 0.0], learning_rate=0.01) @pytest.mark.parametrize("normalization", ["batch", "layer"]) def test_processing_normalization_roundtrip(normalization): """Normalization is shape-safe and serialized in the PyTorch weight order.""" kwargs = dict( sequence_dims=(9, 21), n_flank_length=0, c_flank_length=0, peptide_max_length=9, flanking_averages=False, convolutional_filters=4, convolutional_kernel_size=3, convolutional_activation="tanh", convolutional_kernel_l1_l2=(0.0, 0.0), dropout_rate=0.0, post_convolutional_dense_layer_sizes=[2], normalization=normalization, ) model = Class1ProcessingModel(**kwargs) model.eval() inputs = { "sequence": torch.randn(3, 9, 21), "peptide_length": torch.full((3, 1), 9), } observed = model(inputs) assert observed.shape == (3,) assert torch.isfinite(observed).all() clone = Class1ProcessingModel(**kwargs) clone.set_weights_list(model.get_weights_list(), auto_convert_keras=False) clone.eval() torch.testing.assert_close(observed, clone(inputs)) @pytest.mark.parametrize("activation", ["relu", "silu", "swish", "gelu"]) def test_processing_modern_activations(activation): model = Class1ProcessingModel( sequence_dims=(9, 21), n_flank_length=0, c_flank_length=0, peptide_max_length=9, flanking_averages=False, convolutional_filters=4, convolutional_kernel_size=3, convolutional_activation=activation, convolutional_kernel_l1_l2=(0.0, 0.0), dropout_rate=0.0, post_convolutional_dense_layer_sizes=[2], ) observed = model({ "sequence": torch.randn(3, 9, 21), "peptide_length": torch.full((3, 1), 9), }) assert observed.shape == (3,) assert torch.isfinite(observed).all() @pytest.mark.slow @pytest.mark.integration def test_more(): """Test network with different hyperparameters.""" train_basic_network( num=512, dataset_factory=make_cleavage_motif_dataset, max_epochs=12, minibatch_size=128, validation_split=0.0, dropout_rate=0.0, convolutional_kernel_l1_l2=[0.0, 0.0], learning_rate=0.01, flanking_averages=False, convolutional_kernel_size=3, c_flank_length=0, n_flank_length=3, post_convolutional_dense_layer_sizes=[8]) @pytest.mark.slow @pytest.mark.integration def test_basic_indexing(): """Test that basic indexing patterns are learned.""" def is_hit(n_flank, c_flank, peptide): return peptide[0] in INDEX_FIRST_HITS and peptide[-1] in INDEX_LAST_HITS def is_hit1(n_flank, c_flank, peptide): return peptide[0] in INDEX_FIRST_HITS def is_hit2(n_flank, c_flank, peptide): return peptide[-1] in INDEX_LAST_HITS hypers = { "convolutional_kernel_size": 1, "flanking_averages": False, "max_epochs": 12, "minibatch_size": 128, "validation_split": 0.0, "dropout_rate": 0.0, "convolutional_kernel_l1_l2": [0.0, 0.0], "learning_rate": 0.01, } train_basic_network( num=512, is_hit=is_hit1, dataset_factory=make_indexing_dataset_factory(first=True, last=False), **hypers) train_basic_network( num=512, is_hit=is_hit2, dataset_factory=make_indexing_dataset_factory(first=False, last=True), **hypers) train_basic_network( num=512, is_hit=is_hit, dataset_factory=make_indexing_dataset_factory(first=True, last=True), **hypers) def make_cleavage_motif_dataset(num, hyperparameters): """Return balanced examples for the N-flank cleavage motif task.""" peptide_length = min(9, hyperparameters["peptide_max_length"]) n_flank_length = max(1, hyperparameters["n_flank_length"]) c_flank_length = hyperparameters["c_flank_length"] rows = [] for i in range(num): hit = i < num // 2 peptide = list("G" * peptide_length) n_flank = list("G" * n_flank_length) if hit: n_flank[-1] = _cycle(N_CLEAVAGE_FIRST, i) peptide[0] = _cycle(N_CLEAVAGE_SECOND, i) peptide[1] = _cycle(N_CLEAVAGE_THIRD, i) else: negative_case = i % 3 n_flank[-1] = ( "D" if negative_case == 0 else _cycle(N_CLEAVAGE_FIRST, i) ) peptide[0] = ( "D" if negative_case == 1 else _cycle(N_CLEAVAGE_SECOND, i) ) peptide[1] = ( "D" if negative_case == 2 else _cycle(N_CLEAVAGE_THIRD, i) ) rows.append({ "n_flank": "".join(n_flank), "c_flank": "G" * c_flank_length, "peptide": "".join(peptide), "hit": hit, }) return pandas.DataFrame(rows).sample(frac=1.0, random_state=0) def make_indexing_dataset_factory(first, last): """Return a dataset factory for first/last peptide indexing tasks.""" def make_indexing_dataset(num, hyperparameters): peptide_length = min(9, hyperparameters["peptide_max_length"]) rows = [] for i in range(num): hit = i < num // 2 peptide = list("G" * peptide_length) if hit or first: peptide[0] = _cycle(INDEX_FIRST_HITS, i) if hit or last: peptide[-1] = _cycle(INDEX_LAST_HITS, i) if not hit: if first and last: negative_case = i % 3 if negative_case in (0, 2): peptide[0] = "G" if negative_case in (1, 2): peptide[-1] = "G" elif first: peptide[0] = "G" elif last: peptide[-1] = "G" rows.append({ "n_flank": "G" * hyperparameters["n_flank_length"], "c_flank": "G" * hyperparameters["c_flank_length"], "peptide": "".join(peptide), "hit": hit, }) return pandas.DataFrame(rows).sample(frac=1.0, random_state=0) return make_indexing_dataset def train_basic_network( num, do_assertions=True, is_hit=None, dataset_factory=None, seed=1, **hyperparameters): """Train a processing network and check performance.""" use_hyperparameters = { "max_epochs": 100, "peptide_max_length": 12, "n_flank_length": 8, "c_flank_length": 8, "convolutional_kernel_size": 3, "flanking_averages": False, # Use False for reliable convergence "min_delta": 0.01, } use_hyperparameters.update(hyperparameters) if dataset_factory is None: df = pandas.DataFrame({ "n_flank": ( random_peptides(int(num / 2), 10) + random_peptides(int(num / 2), 1) ), "c_flank": random_peptides(num, 10), "peptide": ( random_peptides(int(num / 2), 11) + random_peptides(int(num / 2), 8) ), }).sample(frac=1.0) if is_hit is None: def is_hit(n_flank, c_flank, peptide): if re.search(N_CLEAVAGE_REGEX, peptide): return False # peptide is cleaved return bool(re.match(N_CLEAVAGE_REGEX, n_flank[-1:] + peptide)) df["hit"] = [ is_hit(row.n_flank, row.c_flank, row.peptide) for (_, row) in df.iterrows() ] else: df = dataset_factory(num, use_hyperparameters) if is_hit is not None: numpy.testing.assert_array_equal( df.hit.values, [ is_hit(row.n_flank, row.c_flank, row.peptide) for (_, row) in df.iterrows() ]) train_df = df.sample(frac=0.9, random_state=1).copy() test_df = df.loc[~df.index.isin(train_df.index)].copy() print( "Generated dataset", len(df), "hits: ", df.hit.sum(), "frac:", df.hit.mean()) network = Class1ProcessingNeuralNetwork(**use_hyperparameters) network.fit( sequences=FlankingEncoding( peptides=train_df.peptide.values, n_flanks=train_df.n_flank.values, c_flanks=train_df.c_flank.values), targets=train_df.hit.values, seed=seed, verbose=0) print(network.network()) for df_subset in [train_df, test_df]: df_subset["predictions"] = network.predict( df_subset.peptide.values, df_subset.n_flank.values, df_subset.c_flank.values) if do_assertions: train_auc = roc_auc_score(train_df.hit.values, train_df.predictions.values) test_auc = roc_auc_score(test_df.hit.values, test_df.predictions.values) print("Train auc", train_auc) print("Test auc", test_auc) assert train_auc > 0.9 assert test_auc > 0.85 return network def test_serialization(): """Test that network weights can be serialized and deserialized.""" hyperparameters = { "max_epochs": 1, "minibatch_size": 100000, "peptide_max_length": 12, "n_flank_length": 5, "c_flank_length": 5, } # Generate training data peptides = random_peptides(100, length=9) n_flanks = random_peptides(100, length=10) c_flanks = random_peptides(100, length=10) targets = numpy.random.choice([0.0, 1.0], 100) # Train a network network = Class1ProcessingNeuralNetwork(**hyperparameters) flanking = FlankingEncoding(peptides, n_flanks, c_flanks) network.fit(flanking, targets, verbose=0) # Get predictions before serialization preds_before = network.predict_encoded(flanking) # Serialize and deserialize config = network.get_config() weights = network.get_weights() network2 = Class1ProcessingNeuralNetwork.from_config(config, weights=weights) preds_after = network2.predict_encoded(flanking) # Predictions should be close (some small differences may occur due to dropout eval mode) numpy.testing.assert_allclose(preds_before, preds_after, rtol=1e-4) def test_different_peptide_lengths(): """Test that different peptide lengths are handled correctly.""" hyperparameters = { "max_epochs": 1, "minibatch_size": 100000, "peptide_max_length": 15, "n_flank_length": 5, "c_flank_length": 5, } # Mix of peptide lengths peptides = ( random_peptides(30, length=8) + random_peptides(30, length=9) + random_peptides(30, length=10) + random_peptides(10, length=11) ) n_flanks = random_peptides(100, length=10) c_flanks = random_peptides(100, length=10) targets = numpy.random.choice([0.0, 1.0], 100) network = Class1ProcessingNeuralNetwork(**hyperparameters) flanking = FlankingEncoding(peptides, n_flanks, c_flanks) network.fit(flanking, targets, verbose=0) predictions = network.predict_encoded(flanking) assert len(predictions) == len(peptides) def test_empty_flanks(): """Test that empty flanking sequences are handled correctly.""" hyperparameters = { "max_epochs": 1, "minibatch_size": 100000, "peptide_max_length": 12, "n_flank_length": 5, "c_flank_length": 5, } peptides = random_peptides(50, length=9) n_flanks = [""] * 50 c_flanks = [""] * 50 targets = numpy.random.choice([0.0, 1.0], 50) network = Class1ProcessingNeuralNetwork(**hyperparameters) flanking = FlankingEncoding(peptides, n_flanks, c_flanks) network.fit(flanking, targets, verbose=0) predictions = network.predict_encoded(flanking) assert len(predictions) == len(peptides) assert numpy.isfinite(predictions).all() def test_prediction_range(): """Test that predictions are in the expected range [0, 1].""" hyperparameters = { "max_epochs": 1, "minibatch_size": 100000, "peptide_max_length": 12, "n_flank_length": 5, "c_flank_length": 5, } peptides = random_peptides(100, length=9) n_flanks = random_peptides(100, length=10) c_flanks = random_peptides(100, length=10) targets = numpy.random.choice([0.0, 1.0], 100) network = Class1ProcessingNeuralNetwork(**hyperparameters) flanking = FlankingEncoding(peptides, n_flanks, c_flanks) network.fit(flanking, targets, verbose=0) predictions = network.predict_encoded(flanking) # Predictions should be between 0 and 1 (sigmoid output) assert predictions.min() >= 0 assert predictions.max() <= 1 def _processing_model_with_network(): """Build a tiny processing network without paying for a fit.""" model = Class1ProcessingNeuralNetwork( convolutional_filters=4, convolutional_kernel_size=3, n_flank_length=2, c_flank_length=2, dropout_rate=0) model._network = model.make_network( **model.network_hyperparameter_defaults.subselect(model.hyperparameters)) return model def test_dropped_processing_checkpoints_delete_their_sidecars(tmp_path): """Clearing a retained checkpoint reference also removes the file it named.""" from mhcflurry import Class1ProcessingPredictor model = _processing_model_with_network() model.checkpoint_weights = { "terminal": model.get_weights(), "best": model.get_weights()} predictor = Class1ProcessingPredictor([model]) predictor.save(str(tmp_path)) assert len(list(tmp_path.glob("*.terminal.npz"))) == 1 assert len(list(tmp_path.glob("*.best.npz"))) == 1 # Re-saving with the same policies retained keeps the sidecars. predictor.save(str(tmp_path)) assert len(list(tmp_path.glob("*.terminal.npz"))) == 1 assert len(list(tmp_path.glob("*.best.npz"))) == 1 # A refit that retained nothing must leave nothing behind. loaded = Class1ProcessingPredictor.load(str(tmp_path)) loaded.models[0].checkpoint_weights = {} loaded.save(str(tmp_path)) assert not list(tmp_path.glob("*.terminal.npz")) assert not list(tmp_path.glob("*.best.npz")) reloaded = Class1ProcessingPredictor.load(str(tmp_path)) assert reloaded.models[0].checkpoint_weights == {} def test_calibration_only_processing_save_leaves_manifest_alone(tmp_path): """An explicit empty model list persists calibration and nothing else.""" from mhcflurry import Class1ProcessingPredictor predictor = Class1ProcessingPredictor([_processing_model_with_network()]) predictor.save(str(tmp_path)) manifest_path = tmp_path / "manifest.csv" original = manifest_path.read_bytes() loaded = Class1ProcessingPredictor.load(str(tmp_path)) loaded.calibrate_percentile_ranks(numpy.linspace(0.01, 0.99, 500)) manifest_path.write_bytes(b"sentinel") loaded.save(str(tmp_path), model_names_to_write=[], write_metadata=False) assert manifest_path.read_bytes() == b"sentinel" assert list(tmp_path.glob("percent_ranks.*")) manifest_path.write_bytes(original) assert Class1ProcessingPredictor.load( str(tmp_path)).percent_rank_transform is not None # Saving models still rewrites the manifest. manifest_path.write_bytes(b"sentinel") loaded.save(str(tmp_path)) assert manifest_path.read_bytes() != b"sentinel" mhcflurry-2.3.6/test/test_class1_processing_predictor.py000066400000000000000000000055241525677230600236450ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import pandas import tempfile import pickle import pytest from numpy.testing import assert_array_equal from mhcflurry.class1_processing_predictor import Class1ProcessingPredictor from mhcflurry.common import random_peptides from .test_class1_processing_neural_network import train_basic_network AFFINITY_PREDICTOR = None def setup(): pass def teardown(): pass def test_empty_prediction_returns_empty_array_and_dataframe(): predictor = Class1ProcessingPredictor(models=[]) assert_array_equal(predictor.predict([]), []) df = predictor.predict_to_dataframe([]) assert list(df.columns) == ["peptide", "n_flank", "c_flank", "score"] assert len(df) == 0 def test_predict_rejects_string_peptides(): predictor = Class1ProcessingPredictor(models=[]) with pytest.raises(TypeError, match="peptides must be a list"): predictor.predict_to_dataframe("SIINFEKL") def test_basic(): network = train_basic_network( num=200, do_assertions=False, max_epochs=1, minibatch_size=100000) predictor = Class1ProcessingPredictor(models=[network]) num = 200 df = pandas.DataFrame({ "n_flank": random_peptides(num, 10), "c_flank": random_peptides(num, 10), "peptide": random_peptides(num, 9), }) df["score"] = predictor.predict(df.peptide, df.n_flank, df.c_flank) # Test predictions are deterministic df1b = predictor.predict_to_dataframe( peptides=df.peptide.values, n_flanks=df.n_flank.values, c_flanks=df.c_flank.values) assert_array_equal(df.score.values, df1b.score.values) # Test saving and loading models_dir = tempfile.mkdtemp("_models") print(models_dir) predictor.save(models_dir) predictor2 = Class1ProcessingPredictor.load(models_dir) df2 = predictor2.predict_to_dataframe( peptides=df.peptide.values, n_flanks=df.n_flank.values, c_flanks=df.c_flank.values) assert_array_equal(df.score.values, df2.score.values) # Test pickling predictor3 = pickle.loads( pickle.dumps(predictor, protocol=pickle.HIGHEST_PROTOCOL)) df3 = predictor3.predict_to_dataframe( peptides=df.peptide.values, n_flanks=df.n_flank.values, c_flanks=df.c_flank.values) assert_array_equal(df.score.values, df3.score.values) mhcflurry-2.3.6/test/test_cli.py000066400000000000000000006350511525677230600167230ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Tests for the unified ``mhcflurry`` CLI. Covers dispatch, side resolution, training_stats end-to-end on synthetic manifests, and presence of help text. Predict-running paths (affinity + presentation) need real models on disk and live in integration suites, not here. """ import argparse import hashlib import importlib import json import os import pathlib import subprocess import sys import tarfile import time import types import numpy import pandas import pytest import yaml from mhcflurry.cli import compare_models, main as cli_main from mhcflurry.cli import eval_command from mhcflurry.cli import paper_figures from mhcflurry.cli import plot_model_comparison from mhcflurry.cli import train_command from mhcflurry.cli import materialize_affinity_checkpoint from mhcflurry.version import __version__ def test_top_level_parser_lists_subcommands(): parser = cli_main.build_parser() help_text = parser.format_help() assert "train" in help_text assert "eval" in help_text assert "compare-models" in help_text assert "plot-model-comparison" in help_text assert "paper-figures" in help_text def test_allele_specific_training_count_threshold_is_inclusive(): from mhcflurry.cli import train_allele_specific_models_command as command counts = pandas.Series({"HLA-A*02:01": 50, "HLA-B*07:02": 49}) assert command._alleles_with_minimum_measurements(counts, 50) == [ "HLA-A*02:01" ] required = [ "--data", "train.csv", "--out-models-dir", "models", "--hyperparameters", "hyperparameters.yaml", ] for option, value in ( ("--min-measurements-per-allele", "0"), ("--held-out-fraction-reciprocal", "1"), ("--n-models", "0"), ("--save-interval", "nan")): with pytest.raises(SystemExit): command.parser.parse_args(required + [option, value]) def test_training_and_selection_commands_reject_invalid_sizes_early(): from mhcflurry.cli import calibrate_percentile_ranks_command as calibrate from mhcflurry.cli import select_allele_specific_models_command as select_allele from mhcflurry.cli import select_pan_allele_models_command as select_pan from mhcflurry.cli import select_processing_models_command as select_processing from mhcflurry.cli import train_pan_allele_models_command as train_pan with pytest.raises(SystemExit): calibrate.parser.parse_args([ "--models-dir", "models", "--num-peptides-per-length", "0", ]) with pytest.raises(SystemExit): calibrate.run([ "--models-dir", "models", "--length-range", "15", "8", ]) train_base = ["--out-models-dir", "models"] with pytest.raises(SystemExit): train_pan.parser.parse_args(train_base + ["--num-folds", "0"]) for values in (("nan", "100"), ("1.1", "100"), ("0.25", "1.5")): with pytest.raises(SystemExit): train_pan.run(train_base + [ "--held-out-measurements-per-allele-fraction-and-max", *values, ]) selection_commands = ( (select_pan, "--min-models-per-fold", "--max-models-per-fold"), (select_processing, "--min-models-per-fold", "--max-models-per-fold"), (select_allele, "--combined-min-models", "--combined-max-models"), ) for command, minimum_option, maximum_option in selection_commands: base = ["--models-dir", "models", "--out-models-dir", "selected"] with pytest.raises(SystemExit): command.parser.parse_args(base + [minimum_option, "0"]) with pytest.raises(SystemExit): command.run(base + [minimum_option, "3", maximum_option, "2"]) def test_train_help_runs(capsys): assert cli_main.main(["train", "--help"]) == 0 captured = capsys.readouterr().out assert "pan-allele-release" in captured assert "plot-loss-curves" in captured assert "snapshot-experiment" in captured assert "benchmark-processing-preparation" in captured assert "Deployment is opt-in" in captured def test_compare_models_accepts_train_excluded_affinity_source(): parser = compare_models.make_parser() args = parser.parse_args([ "--a", "candidate", "--b", "baseline", "--out", "comparison", "--affinity-source", "no_additional_ms", ]) assert args.affinity_source == "no_additional_ms" def test_release_affinity_excludes_union_of_both_sides_training(tmp_path): dirs = [tmp_path / "a", tmp_path / "b"] for directory, rows in zip(dirs, [ [("HLA-A0201", "SIINFEKL")], [("HLA-A*03:01", "KLGGALQAK")], ]): directory.mkdir() pandas.DataFrame(rows, columns=["allele", "peptide"]).to_csv( directory / "train_data.csv", index=False) side_a = { "letter": "a", "label": "candidate", "paths": {"affinity": str(dirs[0])}, } side_b = { "letter": "b", "label": "baseline", "paths": {"affinity": str(dirs[1])}, } benchmark = pandas.DataFrame({ "hla": ["HLA-A*02:01", "HLA-A*03:01", "HLA-B*07:02"], "peptide": ["SIINFEKL", "KLGGALQAK", "RPHERNGFTV"], "hit": [1, 1, 0], }) filtered, report = compare_models._exclude_affinity_training_overlap( benchmark, side_a, side_b) assert filtered.peptide.tolist() == ["RPHERNGFTV"] assert report["union_overlap_rows"] == 2 assert report["union_overlap_hits"] == 2 assert report["sides"]["a"]["overlap_unique_pmhcs"] == 1 assert report["sides"]["b"]["overlap_unique_pmhcs"] == 1 def test_release_affinity_can_audit_overlap_without_excluding(tmp_path): dirs = [tmp_path / "a", tmp_path / "b"] for directory, rows in zip(dirs, [ [("HLA-A0201", "SIINFEKL")], [("HLA-A*03:01", "KLGGALQAK")], ]): directory.mkdir() pandas.DataFrame(rows, columns=["allele", "peptide"]).to_csv( directory / "train_data.csv", index=False) side_a = { "letter": "a", "label": "candidate", "paths": {"affinity": str(dirs[0])}, } side_b = { "letter": "b", "label": "baseline", "paths": {"affinity": str(dirs[1])}, } benchmark = pandas.DataFrame({ "hla": ["HLA-A*02:01", "HLA-A*03:01", "HLA-B*07:02"], "peptide": ["SIINFEKL", "KLGGALQAK", "RPHERNGFTV"], "hit": [1, 1, 0], }) filtered, report = compare_models._exclude_affinity_training_overlap( benchmark, side_a, side_b, policy="audit") assert filtered.equals(benchmark) assert report["policy"] == "audit" assert report["exclusion_applied"] is False assert report["union_overlap_rows"] == 2 assert report["rows_after"] == 3 assert report["hits_after"] == 2 def test_train_pan_allele_release_delegates(monkeypatch, tmp_path): script = tmp_path / "retrain_evaluate_deploy.sh" script.write_text("#!/usr/bin/env bash\n") calls = [] def fake_call(argv): calls.append(argv) return 17 monkeypatch.setattr(train_command, "_workflow_script_path", lambda: script) monkeypatch.setattr(train_command.subprocess, "call", fake_call) status = cli_main.main([ "train", "pan-allele-release", "--run-dir", "runs/2.3.0", "--release", "2.3.0", ]) assert status == 17 assert calls == [[ "bash", str(script), "--run-dir", "runs/2.3.0", "--release", "2.3.0", ]] def test_train_materialize_affinity_checkpoint_delegates(monkeypatch): calls = [] def fake_run(argv, prog): calls.append((argv, prog)) return 19 monkeypatch.setattr(materialize_affinity_checkpoint, "run_argv", fake_run) status = train_command.run_argv([ "materialize-affinity-checkpoint", "--models-dir", "source", "--policy", "best", "--out-models-dir", "best", ]) assert status == 19 assert calls == [( [ "--models-dir", "source", "--policy", "best", "--out-models-dir", "best", ], "mhcflurry train materialize-affinity-checkpoint", )] def test_train_compose_processing_ensemble_delegates(monkeypatch, tmp_path): script = tmp_path / "compose_processing_ensemble.py" script.write_text("") calls = [] monkeypatch.setattr( train_command, "_training_script_path", lambda _subcommand: script) def fake_call(argv, env): calls.append((argv, env["MHCFLURRY_CLI_PROG"])) return 23 monkeypatch.setattr(train_command.subprocess, "call", fake_call) status = train_command.run_argv([ "compose-processing-ensemble", "--out-models-dir", "combined", ]) assert status == 23 assert calls == [([ sys.executable, str(script), "--out-models-dir", "combined", ], "mhcflurry train compose-processing-ensemble")] def test_release_workflow_deploy_is_opt_in_by_default(tmp_path): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "local", "--skip-train", "--skip-eval", "--skip-plots", "--dry-run", ], capture_output=True, text=True, check=True, ) output = result.stdout + result.stderr assert "Skipping deploy step" in output assert "deploy_trained_models" not in output def _write_minimal_deployable_run(run_dir): model_directories = ( "affinity/models.combined", "processing/models.selected.no_flank", "processing/models.selected.with_flanks", "processing/models.selected.short_flanks", "presentation/models") for relative in model_directories: (run_dir / relative).mkdir(parents=True, exist_ok=True) source_commit = subprocess.check_output( ["git", "rev-parse", "HEAD"], text=True).strip() info = ( "package\tmhcflurry %s\n" "git commit\t%s\n" "workflow id\ttest-training-workflow\n" % ( __version__, source_commit) ) for relative in model_directories: (run_dir / relative / "info.txt").write_text(info) if relative != "presentation/models": (run_dir / relative / "weights_model.npz").write_bytes(b"selected test weights") (run_dir / "affinity/models.combined/manifest.csv").write_text( "model_name\nmodel\n") (run_dir / "affinity/models.combined/percent_ranks.csv").write_text( "allele\nHLA-A*02:01\n") for variant in ("no_flank", "with_flanks", "short_flanks"): (run_dir / ( "processing/models.selected.%s/manifest.csv" % variant )).write_text("model_name\nmodel\n") (run_dir / "presentation/models/weights.csv").write_text( "model_name\nmodel\n") (run_dir / "presentation/models/percent_ranks.csv").write_text( "allele\nHLA-A*02:01\n") holdout_dir = run_dir / "release_holdout" holdout_dir.mkdir() manifest_records = {} for filename, header in ( ("affinity_pmhcs.csv", "allele,peptide\n"), ("affinity_samples.csv", "sample_id\n"), ("processing_samples.csv", "sample_id\n"), ("presentation_samples.csv", "sample_id\n")): path = holdout_dir / filename path.write_text(header) manifest_records[filename] = { "rows": 0, "sha256": hashlib.sha256(path.read_bytes()).hexdigest(), } policy_path = holdout_dir / "policy.json" policy_path.write_text(json.dumps({ "schema_version": 1, "holdout_files": manifest_records, })) (holdout_dir / "validation.json").write_text(json.dumps({ "schema_version": 1, "policy_sha256": hashlib.sha256( policy_path.read_bytes()).hexdigest(), "holdout_files": manifest_records, "affinity_overlap_rows": 0, "processing_overlap_rows": 0, "presentation_overlap_rows": 0, })) def test_deploy_packages_only_requested_processing_variants(tmp_path): run_dir = tmp_path / "release-run" _write_minimal_deployable_run(run_dir) base_command = [ "bash", "scripts/release/deploy_trained_models.sh", "--run-dir", str(run_dir), "--release", __version__, "--github-release", __version__, "--repo", ".", "--allow-dirty-repo", "--dry-run", ] default = subprocess.run( base_command, capture_output=True, text=True, check=True) default_tar = next( line for line in (default.stdout + default.stderr).splitlines() if "models_class1_processing" in line and "tar " in line ) assert "models.selected.no_flank" in default_tar assert "models.selected.with_flanks" in default_tar assert "models.selected.short_flanks" not in default_tar all_variants = subprocess.run( base_command[:-1] + [ "--processing-variants", "no_flank with_flanks short_flanks", "--dry-run", ], capture_output=True, text=True, check=True, ) all_tar = next( line for line in (all_variants.stdout + all_variants.stderr).splitlines() if "models_class1_processing" in line and "tar " in line ) assert "models.selected.short_flanks" in all_tar def test_deploy_creates_draft_noninteractively_with_release_notes(tmp_path): run_dir = tmp_path / "release-run" assets_dir = tmp_path / "assets" _write_minimal_deployable_run(run_dir) fake_bin = tmp_path / "bin" fake_bin.mkdir() gh_log = tmp_path / "gh.log" fake_gh = fake_bin / "gh" fake_gh.write_text( "#!/usr/bin/env bash\n" "printf '%s\\n' \"$*\" >> \"$GH_LOG\"\n" "if [ \"$1 $2\" = \"release view\" ]; then exit 1; fi\n" ) fake_gh.chmod(0o755) env = os.environ.copy() env["PATH"] = "%s:%s" % (fake_bin, env["PATH"]) env["GH_LOG"] = str(gh_log) subprocess.run( [ "bash", "scripts/release/deploy_trained_models.sh", "--run-dir", str(run_dir), "--release", __version__, "--github-release", __version__, "--repo", ".", "--assets-dir", str(assets_dir), "--date", "20260825", "--allow-dirty-repo", "--draft", ], capture_output=True, text=True, check=True, env=env, ) calls = gh_log.read_text().splitlines() create = next(line for line in calls if line.startswith("release create ")) assert "--notes-file " in create assert "RELEASE_NOTES_%s.md" % __version__ in create assert create.startswith("release create %s --draft --title " % __version__) assert any(line.startswith("release upload %s " % __version__) for line in calls) def test_deploy_rejects_artifacts_from_a_different_commit(tmp_path): run_dir = tmp_path / "release-run" _write_minimal_deployable_run(run_dir) (run_dir / "affinity/models.combined/info.txt").write_text( "package\tmhcflurry %s\n" "git commit\tdeadbeef\n" % __version__ ) result = subprocess.run( [ "bash", "scripts/release/deploy_trained_models.sh", "--run-dir", str(run_dir), "--release", __version__, "--repo", ".", "--allow-dirty-repo", "--dry-run", ], capture_output=True, text=True, ) assert result.returncode != 0 assert "artifact git commit 'deadbeef'" in result.stdout + result.stderr assert "tar -C" not in result.stdout + result.stderr def test_release_workflow_forwards_processing_variants_to_deploy(tmp_path): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "local", "--processing-variants", "with_flanks no_flank", "--skip-train", "--skip-eval", "--skip-plots", "--deploy-mode", "dry-run", "--dry-run", ], capture_output=True, text=True, check=True, ) output = result.stdout + result.stderr assert "deploy_trained_models.sh" in output assert "--processing-variants with_flanks\\ no_flank" in output assert "--allow-artifact-source-mismatch" in output assert ( "variants=with_flanks no_flank; eval_modes=with_flanks,no_flank" ) in output def test_release_workflow_rejects_processing_mode_not_trained(tmp_path): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "local", "--processing-variants", "with_flanks no_flank", "--processing-modes", "with_flanks,no_flank,short_flanks", "--dry-run", ], capture_output=True, text=True, ) output = result.stdout + result.stderr assert result.returncode != 0 assert "--processing-modes requests 'short_flanks'" in output assert "pan_allele_release_full.sh" not in output def test_release_workflow_rejects_undeployable_processing_subset_before_train( tmp_path): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "local", "--processing-variants", "no_flank short_flanks", "--presentation-processing-with-flanks-kind", "short_flanks", "--deploy-mode", "dry-run", "--dry-run", ], capture_output=True, text=True, ) output = result.stdout + result.stderr assert result.returncode == 2 assert "requires the canonical with_flanks processing artifact" in output assert "pan_allele_release_full.sh" not in output @pytest.mark.parametrize( ("extra_args", "expected_error"), [ ( ["--processing-variants", "with_flanks no_flank no_flank"], "Duplicate --processing-variants entry: no_flank", ), ( ["--processing-modes", "with_flanks,with_flanks"], "Duplicate --processing-modes entry: with_flanks", ), ( ["--processing-variants", "with_flanks short_flanks"], "must include no_flank for presentation training", ), ( [ "--processing-variants", "with_flanks no_flank", "--presentation-processing-with-flanks-kind", "no_flank", ], "must be with_flanks or short_flanks", ), ], ) def test_release_workflow_rejects_invalid_processing_configuration_before_train( tmp_path, extra_args, expected_error): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "local", "--dry-run", ] + extra_args, capture_output=True, text=True, ) output = result.stdout + result.stderr assert result.returncode == 2 assert expected_error in output assert "pan_allele_release_full.sh" not in output @pytest.mark.parametrize( ("extra_args", "expected_error"), [ ( ["--random-seed", "-1"], "--random-seed must be a non-negative integer", ), ( ["--processing-minibatch-size", "0"], "--processing-minibatch-size must be a positive integer", ), ( ["--processing-held-out-samples", "-1"], "--processing-held-out-samples must be a positive integer", ), ( ["--presentation-decoys-per-hit", "nan"], "--presentation-decoys-per-hit must be a finite positive number", ), ( ["--presentation-feature-chunk-size", "0"], "--presentation-feature-chunk-size must be a positive integer", ), ], ) def test_release_workflow_rejects_invalid_training_sizes_before_train( tmp_path, extra_args, expected_error): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "local", "--dry-run", ] + extra_args, capture_output=True, text=True, ) output = result.stdout + result.stderr assert result.returncode == 2 assert expected_error in output assert "pan_allele_release_full.sh" not in output def test_release_workflow_prepare_command_is_dry_run_visible(tmp_path): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "local", "--skip-train", "--skip-eval", "--paper-figures-scores-dir", str(tmp_path / "paper-inputs"), "--paper-figures-prepare-command", "echo prepare-external-preds", "--dry-run", ], capture_output=True, text=True, check=True, ) output = result.stdout + result.stderr assert "Paper inputs: local prepare command configured" in output assert "bash -lc echo\\ prepare-external-preds" in output assert "mhcflurry eval plot-comparison" in output def test_release_workflow_eval_max_benchmark_files_is_forwarded(tmp_path): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "local", "--skip-train", "--skip-plots", "--compare-include", "affinity", "--eval-max-benchmark-files", "1", "--dry-run", ], capture_output=True, text=True, check=True, ) output = result.stdout + result.stderr assert "mhcflurry eval compare-models" in output assert "--include affinity" in output assert "--affinity-source no_additional_ms" in output assert "--affinity-training-overlap-policy audit" in output assert "--affinity-training-overlap-policy exclude" in output assert "eval_comparison_train_excluded_affinity" in output assert "--limit-files 1" in output def test_release_workflow_plots_include_paper_figures_by_default(tmp_path): run_dir = tmp_path / "release-run" result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(run_dir), "--release", "2.3.0", "--backend", "local", "--skip-train", "--skip-eval", "--dry-run", ], capture_output=True, text=True, check=True, ) output = result.stdout + result.stderr assert "mhcflurry eval plot-comparison" in output assert "--paper-figures-out %s" % ( run_dir / "eval_comparison/plots/paper_figures" ) in output assert "--paper-figures-scores-dir %s" % ( run_dir / "eval_comparison" ) in output assert "--include-paper-figures-in-summary-pdf" in output def test_release_workflow_honors_repo_env_override(tmp_path): env = dict(os.environ) env["REPO"] = str(tmp_path / "source-tree") result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "local", "--skip-eval", "--skip-plots", "--dry-run", ], capture_output=True, text=True, env=env, check=True, ) output = result.stdout + result.stderr assert "REPO=%s" % (tmp_path / "source-tree") in output def test_release_workflow_ssh_preflight_is_dry_run_visible(tmp_path): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "ssh", "--remote", "training-host", "--remote-repo", "/remote/mhcflurry", "--remote-run-dir", "/remote/run", "--no-sync-remote-output", "--skip-eval", "--skip-plots", "--dry-run", ], capture_output=True, text=True, check=True, ) output = result.stdout + result.stderr assert "actual_commit=$(git -C" in output assert "status --porcelain --untracked-files=no" in output assert output.index("actual_commit=$(git -C") < output.index( "pan_allele_release_full.sh") assert "MHCFLURRY_RELEASE_GIT_COMMIT=\\$\\(git" in output @pytest.mark.parametrize( ("remote_commit_matches", "remote_dirty", "expected_error"), [ (False, False, "remote checkout commit deadbeef does not match"), (True, True, "remote checkout has tracked changes"), ], ) def test_release_workflow_ssh_rejects_unverified_source( tmp_path, remote_commit_matches, remote_dirty, expected_error): source_repo = tmp_path / "source-repo" (source_repo / "mhcflurry").mkdir(parents=True) (source_repo / "mhcflurry" / "version.py").write_text( '__version__ = "2.3.0rc14"\n') subprocess.run(["git", "init", str(source_repo)], check=True) subprocess.run( ["git", "-C", str(source_repo), "add", "mhcflurry/version.py"], check=True, ) subprocess.run( [ "git", "-C", str(source_repo), "-c", "user.name=Test", "-c", "user.email=test@example.com", "commit", "-m", "test source", ], capture_output=True, check=True, ) control_bin = tmp_path / "control-bin" remote_bin = tmp_path / "remote-bin" control_bin.mkdir() remote_bin.mkdir() ssh_log = tmp_path / "ssh.log" ssh = control_bin / "ssh" ssh.write_text( "#!/bin/sh\n" "printf '%s\\n' \"$2\" >> \"$SSH_LOG\"\n" "PATH=\"$REMOTE_BIN:$PATH\" sh -c \"$2\"\n" ) ssh.chmod(0o755) remote_git = remote_bin / "git" remote_git.write_text( "#!/bin/sh\n" "case \"$3\" in\n" " rev-parse) printf '%s\\n' \"$REMOTE_COMMIT\" ;;\n" " status)\n" " if [ \"$REMOTE_DIRTY\" = 1 ]; then\n" " printf ' M mhcflurry/version.py\\n'\n" " fi\n" " ;;\n" " *) exit 2 ;;\n" "esac\n" ) remote_git.chmod(0o755) local_commit = subprocess.check_output( ["git", "-C", str(source_repo), "rev-parse", "HEAD"], text=True, ).strip() env = dict(os.environ) env.update({ "PATH": "%s:%s" % (control_bin, env["PATH"]), "REPO": str(source_repo), "SSH_LOG": str(ssh_log), "REMOTE_BIN": str(remote_bin), "REMOTE_COMMIT": local_commit if remote_commit_matches else "deadbeef", "REMOTE_DIRTY": "1" if remote_dirty else "0", }) result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "ssh", "--remote", "training-host", "--remote-repo", "/remote/mhcflurry", "--remote-run-dir", "/remote/run", "--no-sync-remote-output", "--skip-eval", "--skip-plots", ], capture_output=True, text=True, env=env, ) assert result.returncode != 0 assert expected_error in result.stdout + result.stderr commands = ssh_log.read_text() assert commands.count("bash -c") == 1 assert "pan_allele_release_full.sh" not in commands def test_release_workflow_ssh_no_sync_validates_models_remotely(tmp_path): source_repo = tmp_path / "source-repo" (source_repo / "mhcflurry").mkdir(parents=True) (source_repo / "mhcflurry" / "version.py").write_text( '__version__ = "2.3.0rc14"\n') subprocess.run(["git", "init", str(source_repo)], check=True) subprocess.run( ["git", "-C", str(source_repo), "add", "mhcflurry/version.py"], check=True, ) subprocess.run( [ "git", "-C", str(source_repo), "-c", "user.name=Test", "-c", "user.email=test@example.com", "commit", "-m", "test source", ], capture_output=True, check=True, ) ssh_log = tmp_path / "ssh.log" fake_bin = tmp_path / "bin" fake_bin.mkdir() ssh = fake_bin / "ssh" ssh.write_text( "#!/bin/sh\n" "printf '%s\\n' \"$2\" >> \"$SSH_LOG\"\n" "case \"$2\" in\n" " *ssh_source_provenance*) exit 2 ;;\n" " *'actual_commit=$(git -C'*)\n" " printf '%s\\n' 'Verified remote source provenance' ;;\n" "esac\n" ) ssh.chmod(0o755) env = dict(os.environ) env.update({ "PATH": "%s:%s" % (fake_bin, env["PATH"]), "REPO": str(source_repo), "SSH_LOG": str(ssh_log), }) result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "ssh", "--remote", "training-host", "--remote-repo", "/remote/mhcflurry", "--remote-run-dir", "/remote/run", "--no-sync-remote-output", "--skip-eval", "--skip-plots", ], capture_output=True, text=True, env=env, check=True, ) commands = ssh_log.read_text() assert "pan_allele_release_full.sh" in commands assert "validate_release_provenance.py" in commands assert "--run-dir' '/remote/run" in commands local_provenance = json.loads( (tmp_path / "release-run" / "release_provenance.json").read_text()) assert local_provenance["artifacts"] == {} assert "step=model_provenance " not in result.stdout + result.stderr @pytest.mark.parametrize( ("extra_args", "expected_error"), [ ([], "requires --skip-eval"), (["--skip-eval"], "requires --skip-plots"), ( ["--skip-eval", "--skip-plots", "--deploy-mode", "dry-run"], "requires --deploy-mode none", ), ], ) def test_release_workflow_no_sync_rejects_local_stages_before_training( tmp_path, extra_args, expected_error): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "ssh", "--no-sync-remote-output", ] + extra_args, capture_output=True, text=True, ) assert result.returncode == 2 assert expected_error in result.stdout + result.stderr assert "pan_allele_release_full.sh" not in result.stdout + result.stderr @pytest.mark.parametrize( ("cleanup_args", "expected_error"), [ ( ["--brev-on-finish", "delete"], "cannot be combined with --brev-on-finish delete", ), ( ["--brev-stop-failure-action", "delete"], "cannot be combined with --brev-stop-failure-action delete", ), ], ) def test_release_workflow_no_sync_preserves_only_brev_artifact_copy( tmp_path, cleanup_args, expected_error): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "brev-provision", "--brev-instance", "test-no-sync", "--no-sync-remote-output", "--skip-eval", "--skip-plots", ] + cleanup_args, capture_output=True, text=True, ) assert result.returncode == 2 assert expected_error in result.stdout + result.stderr def test_release_workflow_forwards_processing_parallelism(tmp_path): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "local", "--skip-eval", "--skip-plots", "--processing-num-jobs", "4", "--processing-max-workers-per-gpu", "1", "--dry-run", ], capture_output=True, text=True, check=True, ) output = result.stdout + result.stderr assert "PROCESSING_NUM_JOBS=4" in output assert "PROCESSING_MAX_WORKERS_PER_GPU=1" in output assert "jobs=4; workers/gpu=1" in output def test_release_workflow_forwards_presentation_recipe_controls(tmp_path): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "local", "--skip-eval", "--skip-plots", "--random-seed", "271", "--processing-held-out-samples", "17", "--presentation-decoys-per-hit", "7", "--presentation-sample-fraction", "0.25", "--presentation-feature-chunk-size", "12345", "--presentation-num-jobs", "8", "--presentation-max-workers-per-gpu", "2", "--presentation-calibration-num-jobs", "3", "--presentation-calibration-max-workers-per-gpu", "4", "--presentation-calibration-prediction-batch-size", "4096", "--dry-run", ], capture_output=True, text=True, check=True, ) output = result.stdout + result.stderr for expected in ( "RELEASE_RANDOM_SEED=271", "PROCESSING_HELD_OUT_SAMPLES=17", "PRESENTATION_DECOYS_PER_HIT=7", "PRESENTATION_SAMPLE_FRACTION=0.25", "PRESENTATION_FEATURE_CHUNK_SIZE=12345", "PRESENTATION_NUM_JOBS=8", "PRESENTATION_MAX_WORKERS_PER_GPU=2", "PRESENTATION_CALIBRATION_NUM_JOBS=3", "PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU=4", "PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE=4096"): assert expected in output def test_release_workflow_defaults_to_validated_published_recipe(tmp_path, monkeypatch): for name in ("MHCFLURRY_TORCH_COMPILE", "MHCFLURRY_TORCH_COMPILE_LOSS", "MHCFLURRY_MATMUL_PRECISION"): monkeypatch.delenv(name, raising=False) result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "local", "--skip-eval", "--skip-plots", "--dry-run", ], capture_output=True, text=True, check=True, ) output = result.stdout + result.stderr for expected in ( "RELEASE_RANDOM_SEED=42", "AFFINITY_MINIBATCH_SIZE=128", "PROCESSING_MINIBATCH_SIZE=512", "PROCESSING_HELD_OUT_SAMPLES=10", "PRESENTATION_PROCESSING_WITH_FLANKS_KIND=short_flanks", "PRESENTATION_DECOYS_PER_HIT=2", "PRESENTATION_SAMPLE_FRACTION=0.1", "MHCFLURRY_TORCH_COMPILE=0", "MHCFLURRY_TORCH_COMPILE_LOSS=0", "MHCFLURRY_MATMUL_PRECISION=highest"): assert expected in output affinity_workflow = pathlib.Path( "scripts/training/pan_allele_release_affinity.sh").read_text() assert "--random-negative-pool-epochs 1" in affinity_workflow assert 'CALIBRATE_PEPTIDES_PER_LENGTH:-100000' in affinity_workflow full_workflow = pathlib.Path( "scripts/training/pan_allele_release_full.sh").read_text() assert '--exclude-pmid 31844290 31495665 31154438' in full_workflow assert '--sample-fraction "$PRESENTATION_SAMPLE_FRACTION"' in full_workflow assert "PRESENTATION_CALIBRATION_PEPTIDES_PER_LENGTH:-10000" in full_workflow assert '--num-peptides-per-length "$PRESENTATION_CALIBRATION_PEPTIDES_PER_LENGTH"' in full_workflow assert "--continue-incomplete" in full_workflow assert "PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS" in full_workflow def test_final_230_candidate_v2_profile_uses_confirmed_short_flanks(tmp_path): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "candidate"), "--release", "2.3.0", "--backend", "local", "--release-profile", "final-2.3.0-candidate-v2", "--skip-train", "--skip-eval", "--skip-plots", "--dry-run", ], capture_output=True, text=True, check=True, ) output = result.stdout + result.stderr assert "Profile: final-2.3.0-candidate-v2" in output assert "Batch sizes: affinity=1024 processing=512" in output assert "optimizer=pytorch; lsuv=pre_activation; init=glorot_uniform" in output def test_final_230_candidate_profile_freezes_decision_set(tmp_path): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "candidate"), "--release", "2.3.0", "--backend", "local", "--release-profile", "final-2.3.0-candidate", "--skip-train", "--skip-eval", "--skip-plots", "--dry-run", ], capture_output=True, text=True, check=True, ) output = result.stdout + result.stderr assert "Profile: final-2.3.0-candidate" in output assert "Batch sizes: affinity=1024 processing=512" in output assert "optimizer=pytorch; lsuv=pre_activation; init=glorot_uniform" in output assert "variants=with_flanks no_flank short_flanks" in output assert "boundary_radius=5" in output def test_release_workflow_sync_is_workflow_id_scoped(): script = pathlib.Path( "scripts/release/retrain_evaluate_deploy.sh").read_text() assert 'RUNPLZ_REQUIRED_VERSION="3.24.31"' in script assert "require_clean_runplz" in script assert "run_dir_matches_workflow || return 1" in script assert "remote_workflow_id" in script assert "Refusing to sync Brev output for workflow" in script assert "add_path .runplz/mhcflurry_release_workflow_id" in script assert "add_path .runplz/mhcflurry_release_workflow_exit_code" in script def test_release_workflow_validates_selected_runplz_interpreter(tmp_path): fake_checkout = tmp_path / "mhcflurry-checkout" selected_environment = fake_checkout / ".venv" subprocess.run( [sys.executable, "-m", "venv", str(selected_environment)], check=True, ) selected_python = selected_environment / "bin" / "python" site_packages = ( selected_environment / "lib" / ("python%d.%d" % sys.version_info[:2]) / "site-packages" ) package_dir = site_packages / "runplz" distribution_dir = site_packages / "runplz-3.24.31.dist-info" package_dir.mkdir(parents=True) distribution_dir.mkdir() (fake_checkout / ".git").mkdir() (package_dir / "__init__.py").write_text( '__version__ = "3.24.31"\n' ) (distribution_dir / "METADATA").write_text( "Metadata-Version: 2.1\nName: runplz\nVersion: 3.24.31\n" ) fake_bin = tmp_path / "bin" fake_bin.mkdir() runplz = fake_bin / "runplz" runplz.write_text( "#!%s\nimport sys\nsys.exit(23)\n" % selected_python ) runplz.chmod(0o755) brev = fake_bin / "brev" brev.write_text( "#!/bin/sh\n" "if [ \"$1\" = ls ]; then printf '[]\\n'; fi\n" ) brev.chmod(0o755) env = dict(os.environ) env["PATH"] = "%s:%s" % (fake_bin, env["PATH"]) result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", __version__, "--backend", "brev-existing", "--brev-instance", "missing-test-instance", "--no-sync-remote-output", "--skip-eval", "--skip-plots", "--allow-dirty-repo", ], capture_output=True, text=True, env=env, ) output = result.stdout + result.stderr assert result.returncode == 23, output assert "runplz provenance:" in output assert "executable=%s" % runplz in output assert "module=%s" % (package_dir / "__init__.py") in output assert "from PyPI or a clean checkout is required" not in output def test_runplz_provenance_rejects_stale_distribution_version(tmp_path): selected_environment = tmp_path / ".venv" subprocess.run( [sys.executable, "-m", "venv", str(selected_environment)], check=True, ) selected_python = selected_environment / "bin" / "python" site_packages = ( selected_environment / "lib" / ("python%d.%d" % sys.version_info[:2]) / "site-packages" ) package_dir = site_packages / "runplz" distribution_dir = site_packages / "runplz-3.17.0.dist-info" package_dir.mkdir(parents=True) distribution_dir.mkdir() (package_dir / "__init__.py").write_text( '__version__ = "3.20.0"\n' ) (distribution_dir / "METADATA").write_text( "Metadata-Version: 2.1\nName: runplz\nVersion: 3.17.0\n" ) result = subprocess.run( [ str(selected_python), "scripts/release/validate_runplz_provenance.py", "--executable", str(selected_environment / "bin" / "runplz"), "--required-version", "3.17.0", ], capture_output=True, text=True, ) output = result.stdout + result.stderr assert result.returncode == 2, output assert "source/distribution version mismatch" in output assert "source reports 3.20.0" in output assert "metadata reports 3.17.0" in output def test_brev_postprocess_archive_includes_release_holdout(tmp_path): run_dir = tmp_path / "release-run" _write_minimal_deployable_run(run_dir) unselected = run_dir / "affinity/models.unselected.combined" unselected.mkdir() (unselected / "manifest.csv").write_text("model_name\nmodel\n") fake_bin = tmp_path / "bin" fake_bin.mkdir() brev = fake_bin / "brev" brev.write_text( "#!/bin/sh\n" "if [ \"$1\" = ls ]; then printf '[]\\n'; fi\n" ) brev.chmod(0o755) env = dict(os.environ) env["PATH"] = "%s:%s" % (fake_bin, env["PATH"]) result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(run_dir), "--release", __version__, "--backend", "brev-existing", "--brev-instance", "missing-test-instance", "--skip-train", "--allow-dirty-repo", ], capture_output=True, text=True, env=env, ) assert result.returncode != 0 archive = run_dir / ".brev-postprocess" / "model_artifacts.tar.bz2" assert archive.is_file() with tarfile.open(archive, "r:bz2") as tar: archived_paths = set(tar.getnames()) assert { "release_holdout/policy.json", "release_holdout/validation.json", "release_holdout/affinity_pmhcs.csv", "release_holdout/affinity_samples.csv", "release_holdout/processing_samples.csv", "release_holdout/presentation_samples.csv", "affinity/models.unselected.combined/manifest.csv", }.issubset(archived_paths) def test_release_sync_archive_preserves_comparison_predictions(tmp_path): workflow = pathlib.Path( "scripts/release/retrain_evaluate_deploy.sh").read_text() marker = "cat > \"$sync_script\" <<'EOF'\n" archive_script = workflow.split(marker, 1)[1].split("\nEOF", 1)[0] out_dir = tmp_path / "runplz-latest" / "out" expected = [ "eval_comparison/affinity/predictions.csv.bz2", "eval_comparison/processing/predictions_with_flanks.csv.bz2", "eval_comparison/presentation/predictions_without_flanks.csv.bz2", ( "eval_comparison_train_excluded_affinity/affinity/" "predictions.csv.bz2" ), ] for relative in expected: path = out_dir / relative path.parent.mkdir(parents=True, exist_ok=True) path.write_bytes(b"comparison predictions") env = dict(os.environ) env["HOME"] = str(tmp_path) subprocess.run( ["bash"], input=archive_script, text=True, env=env, capture_output=True, check=True, ) manifest = ( out_dir / ".runplz" / "release_sync_paths.txt" ).read_text().splitlines() assert set(expected).issubset(manifest) assert workflow.count( "add_glob eval_comparison/*/predictions*.csv.bz2" ) == 2 def test_release_workflow_brev_prepare_uses_remote_postprocess(tmp_path): env = dict(os.environ) env["PATH"] = "/usr/bin:/bin" result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run"), "--release", "2.3.0", "--backend", "brev-provision", "--brev-instance", "mhcflurry-dry-run-test", "--paper-figures-scores-dir", str(tmp_path / "paper-inputs"), "--paper-figures-prepare-command", "echo prepare-external-preds", "--dry-run", ], capture_output=True, text=True, env=env, check=True, ) output = result.stdout + result.stderr assert "plotting will run in a Brev postprocess after sync" in output assert "Would run Brev postprocess-only eval/plot" in output assert "Using plots produced on the Brev instance" in output def test_brev_postprocess_reuses_training_python_without_compile_fanout(): workflow = pathlib.Path( "scripts/release/retrain_evaluate_deploy.sh").read_text() assert "if [ -x /opt/conda/bin/python ]; then" in workflow assert 'export PATH="/opt/conda/bin:$PATH"' in workflow assert ( 'export MHCFLURRY_TORCH_COMPILE="${MHCFLURRY_TORCH_COMPILE:-0}"' in workflow ) assert ( 'export COMPARE_TORCH_COMPILE=%q\\n' in workflow ) assert workflow.count( "--include-paper-figures-in-summary-pdf" ) == 2 @pytest.mark.parametrize("body_status", [0, 23]) def test_brev_postprocess_replay_guard_runs_body_once(tmp_path, body_status): """A replay waits for and returns the original invocation's status.""" workflow = pathlib.Path( "scripts/release/retrain_evaluate_deploy.sh").read_text() guard = workflow.split( "# BEGIN BREV POSTPROCESS REPLAY GUARD\n", 1)[1].split( "# END BREV POSTPROCESS REPLAY GUARD\n", 1)[0] remote_root = tmp_path / "remote" remote_root.mkdir() script = tmp_path / "remote-postprocess.sh" script.write_text( "#!/usr/bin/env bash\n" "set -euo pipefail\n" f"remote_root={str(remote_root)!r}\n" f"{guard}\n" 'printf "run\\n" >> "$remote_root/body_runs"\n' "sleep 0.5\n" f"exit {body_status}\n" ) script.chmod(0o755) original = subprocess.Popen( ["bash", str(script)], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, ) for _ in range(100): if (remote_root / "postprocess_state").is_dir(): break time.sleep(0.01) else: original.kill() pytest.fail("original invocation did not claim replay guard") replay = subprocess.run( ["bash", str(script)], capture_output=True, text=True, timeout=5, ) original_stdout, original_stderr = original.communicate(timeout=5) assert original.returncode == body_status, (original_stdout, original_stderr) assert replay.returncode == body_status, (replay.stdout, replay.stderr) assert (remote_root / "body_runs").read_text() == "run\n" assert "Detected replay" in replay.stderr assert f"returning original status {body_status}" in replay.stderr def test_release_workflow_brev_provider_aliases(tmp_path): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run-default"), "--release", "2.3.0", "--backend", "brev-provision", "--brev-instance", "mhcflurry-dry-run-default", "--skip-train", "--skip-eval", "--skip-plots", "--dry-run", ], capture_output=True, text=True, check=True, ) default_output = result.stdout + result.stderr assert "Brev provider: auto" in default_output assert "Brev type: runplz auto-select" in default_output cases = [ ("auto", "Brev type: runplz auto-select"), ("gcp", "Brev type: a2-highgpu-4g:nvidia-tesla-a100:4"), ("denvr", "Brev type: denvr_A100_sxm4x8"), ] for provider, expected_type in cases: result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / ("release-run-" + provider)), "--release", "2.3.0", "--backend", "brev-provision", "--brev-instance", "mhcflurry-dry-run-" + provider, "--brev-provider", provider, "--skip-train", "--skip-eval", "--skip-plots", "--dry-run", ], capture_output=True, text=True, check=True, ) output = result.stdout + result.stderr assert "Brev provider: %s" % provider in output assert expected_type in output def test_release_workflow_exact_brev_type_overrides_implicit_provider(tmp_path): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run-exact-type"), "--release", "2.3.0", "--backend", "brev-provision", "--brev-instance", "mhcflurry-dry-run-exact-type", "--brev-instance-type", "test.gpu", "--skip-train", "--skip-eval", "--skip-plots", "--dry-run", ], capture_output=True, text=True, check=True, ) output = result.stdout + result.stderr assert "Brev provider: auto" in output assert "Brev type: test.gpu" in output def test_release_workflow_rejects_conflicting_explicit_brev_selection(tmp_path): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run-conflicting-type"), "--release", "2.3.0", "--backend", "brev-provision", "--brev-provider", "gcp", "--brev-instance-type", "test.gpu", "--skip-train", "--skip-eval", "--skip-plots", "--dry-run", ], capture_output=True, text=True, ) assert result.returncode != 0 assert "non-auto --brev-provider cannot be combined" in ( result.stdout + result.stderr ) def test_release_workflow_fast_gpu_profile(tmp_path): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run-fast"), "--release", "2.3.0", "--backend", "brev-provision", "--release-profile", "fast-8xa100", "--brev-instance", "mhcflurry-dry-run-fast", "--skip-train", "--skip-eval", "--skip-plots", "--dry-run", ], capture_output=True, text=True, check=True, ) output = result.stdout + result.stderr assert "Profile: fast-8xa100" in output assert "Affinity MWPG: auto" in output assert "Brev provider: denvr-80gb" in output assert "Brev type: denvr_A100_sxm4_80Gx8" in output def test_release_workflow_profiles_respect_explicit_overrides(tmp_path): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run-fast-explicit"), "--release", "2.3.0", "--backend", "brev-provision", "--release-profile", "fast-8xa100", "--brev-instance", "mhcflurry-dry-run-fast-explicit", "--brev-provider", "gcp", "--affinity-max-workers-per-gpu", "auto", "--skip-train", "--skip-eval", "--skip-plots", "--dry-run", ], capture_output=True, text=True, check=True, ) output = result.stdout + result.stderr assert "Profile: fast-8xa100" in output assert "Affinity MWPG: auto" in output assert "Brev provider: gcp" in output assert "Brev type: a2-highgpu-4g:nvidia-tesla-a100:4" in output def test_release_workflow_minimal_processing_profile(tmp_path): result = subprocess.run( [ "bash", "scripts/release/retrain_evaluate_deploy.sh", "--run-dir", str(tmp_path / "release-run-minimal"), "--release", "2.3.0", "--backend", "local", "--release-profile", "minimal-processing", "--skip-train", "--skip-eval", "--skip-plots", "--dry-run", ], capture_output=True, text=True, check=True, ) output = result.stdout + result.stderr assert "Profile: minimal-processing" in output assert ( "Processing: variants=with_flanks no_flank; " "eval_modes=with_flanks,no_flank" ) in output def test_eval_help_runs(capsys): cli_main.main(["eval", "--help"]) captured = capsys.readouterr().out assert "paper-figures score-predictions" in captured assert "paper-figures external-predictors" in captured assert "paper-figures run" in captured assert "affinity-candidate-figures" in captured assert "Compatibility:" in captured def test_eval_affinity_candidate_figures_help_runs(capsys): with pytest.raises(SystemExit): cli_main.main(["eval", "affinity-candidate-figures", "--help"]) captured = capsys.readouterr().out assert "usage: mhcflurry eval affinity-candidate-figures" in captured assert "--condition" in captured assert "--external-predictions" in captured def test_eval_merge_external_predictions_help_runs(capsys): with pytest.raises(SystemExit): cli_main.main(["eval", "merge-external-predictions", "--help"]) captured = capsys.readouterr().out assert "usage: mhcflurry eval merge-external-predictions" in captured assert "--group" in captured def test_eval_compare_models_help_runs(capsys): with pytest.raises(SystemExit): cli_main.main(["eval", "compare-models", "--help"]) captured = capsys.readouterr().out assert "usage: mhcflurry eval compare-models" in captured assert "--data-dir" in captured def test_eval_plot_comparison_help_runs(capsys): with pytest.raises(SystemExit): cli_main.main(["eval", "plot-comparison", "--help"]) captured = capsys.readouterr().out assert "usage: mhcflurry eval plot-comparison" in captured assert "--paper-figures-scores-dir" in captured def test_eval_paper_figures_render_help_runs(capsys): with pytest.raises(SystemExit): cli_main.main(["eval", "paper-figures", "render", "--help"]) captured = capsys.readouterr().out assert "usage: mhcflurry eval paper-figures render" in captured assert "--scores-dir" in captured @pytest.mark.parametrize("subcommand", [ "processing-ensemble", "processing-ensemble-subsets", "presentation-affinity-ensemble", "release-experiment-figures", "processing-recipe-analysis", "processing-confirmation-analysis", "presentation-external-predictors", "processing-fold-ensembles", ]) def test_eval_experiment_script_commands_delegate( monkeypatch, tmp_path, subcommand): script = tmp_path / (subcommand + ".py") script.write_text("") calls = [] monkeypatch.setitem(eval_command.EVALUATION_SCRIPTS, subcommand, script) def fake_call(argv, env): calls.append((argv, env["MHCFLURRY_CLI_PROG"])) return 29 monkeypatch.setattr(eval_command.subprocess, "call", fake_call) status = eval_command.run_argv([subcommand, "--input", "saved.csv"]) assert status == 29 assert calls == [([ sys.executable, str(script), "--input", "saved.csv", ], "mhcflurry eval %s" % subcommand)] def test_eval_paper_figures_score_predictions_writes_cache(tmp_path): pytest.importorskip("sklearn") predictions = tmp_path / "benchmark.multiallelic.csv" pandas.DataFrame([ { "sample_id": "sample1", "peptide": "AAAAAAAAK", "hit": 1, "netmhcpan4.ba": 20.0, "mhcflurry_production": 20.0, }, { "sample_id": "sample1", "peptide": "AAAAAAAAL", "hit": 1, "netmhcpan4.ba": 30.0, "mhcflurry_production": 30.0, }, { "sample_id": "sample1", "peptide": "AAAAAAAAM", "hit": 0, "netmhcpan4.ba": 900.0, "mhcflurry_production": 900.0, }, { "sample_id": "sample1", "peptide": "AAAAAAAAN", "hit": 0, "netmhcpan4.ba": 1000.0, "mhcflurry_production": 1000.0, }, ]).to_csv(predictions, index=False) out = tmp_path / "accuracy_scores.multiallelic.csv" status = eval_command.run_argv([ "paper-figures", "score-predictions", "--kind", "multiallelic", "--input", str(predictions), "--out", str(out), "--external-baselines", "netmhcpan4.ba:ba", ]) assert status == 0 scores = pandas.read_csv(out) assert set(scores["predictor"]) == { "netmhcpan4.ba", "mhcflurry_production", } assert set(scores["length_label"]) == {"All", "9-mer"} assert "percent_change_auc_ba" in scores.columns def test_eval_paper_figures_external_predictors_adds_columns(tmp_path): benchmark = tmp_path / "benchmark.csv" pandas.DataFrame([ { "sample_id": "s1", "peptide": "PEPTIDEA", "hit": 1, "hla": "HLA-A*02:01 HLA-B*07:02", }, { "sample_id": "s1", "peptide": "PEPTIDEB", "hit": 0, "hla": "HLA-A*02:01 HLA-B*07:02", }, ]).to_csv(benchmark, index=False) fake_mhctools = tmp_path / "fake_mhctools.py" fake_mhctools.write_text("""#!/usr/bin/env python3 import sys import pandas out = sys.argv[sys.argv.index("--output-csv") + 1] pandas.DataFrame([ {"peptide": "PEPTIDEA", "allele": "HLA-A*02:01", "affinity": 50.0, "score": 0.9, "percentile_rank": 0.1}, {"peptide": "PEPTIDEA", "allele": "HLA-B*07:02", "affinity": 500.0, "score": 0.1, "percentile_rank": 5.0}, {"peptide": "PEPTIDEB", "allele": "HLA-A*02:01", "affinity": 1000.0, "score": 0.2, "percentile_rank": 10.0}, {"peptide": "PEPTIDEB", "allele": "HLA-B*07:02", "affinity": 30.0, "score": 0.8, "percentile_rank": 0.2}, ]).to_csv(out, index=False) """) fake_mhctools.chmod(0o755) out = tmp_path / "benchmark.with_external.csv" status = eval_command.run_argv([ "paper-figures", "external-predictors", "--input", str(benchmark), "--out", str(out), "--mhctools-command", str(fake_mhctools), "--predictor", "fake:netmhcpan4.2.ba:affinity", ]) assert status == 0 result = pandas.read_csv(out) assert result["netmhcpan4.2.ba"].tolist() == [50.0, 30.0] assert result["netmhcpan4.2.ba_best_allele"].tolist() == [ "HLA-A*02:01", "HLA-B*07:02"] @pytest.mark.parametrize("invalid", ["HLA-A2", "NONSENSE"]) def test_external_predictors_reject_unnormalized_alleles(invalid): with pytest.raises(ValueError, match="Invalid, ambiguous, or unsupported"): eval_command._split_benchmark_alleles( "HLA-A*02:01 %s" % invalid) @pytest.mark.parametrize("invalid", ["", " "]) def test_external_predictors_reject_empty_genotypes(invalid): with pytest.raises(ValueError, match="contains no class-I alleles"): eval_command._split_benchmark_alleles(invalid) @pytest.mark.parametrize( "predictor_specs", [ ["one:score_a:score", "two:score_a:score"], ["one:score_a:score", "two:score_a_best_allele:score"], ["one:peptide:score"], ["one:hit:score"], ], ) def test_external_predictors_rejects_output_column_collisions( tmp_path, predictor_specs): benchmark = tmp_path / "benchmark.csv" pandas.DataFrame([{ "peptide": "SIINFEKL", "hla": "HLA-A*02:01", "hit": 1, }]).to_csv(benchmark, index=False) argv = [ "--input", str(benchmark), "--out", str(tmp_path / "out.csv"), ] for spec in predictor_specs: argv.extend(["--predictor", spec]) args = eval_command._make_external_predictors_parser( "external-predictors").parse_args(argv) with pytest.raises(ValueError, match="output column"): eval_command._run_external_predictors(args) def test_external_predictor_raw_filenames_do_not_use_output_column( tmp_path, monkeypatch): benchmark = tmp_path / "benchmark.csv" pandas.DataFrame([{ "peptide": "SIINFEKL", "hla": "HLA-A*02:01", "hit": 1, }]).to_csv(benchmark, index=False) raw_dir = tmp_path / "raw" captured = [] def fake_runner(_command, _predictor, _alleles, peptides, out_csv): captured.append(pathlib.Path(out_csv)) pandas.DataFrame([{ "peptide": peptides[0], "allele": "HLA-A*02:01", "score": 0.5, }]).to_csv(out_csv, index=False) monkeypatch.setattr(eval_command, "_run_mhctools_for_group", fake_runner) args = eval_command._make_external_predictors_parser( "external-predictors").parse_args([ "--input", str(benchmark), "--out", str(tmp_path / "out.csv"), "--keep-raw-dir", str(raw_dir), "--predictor", "fake:../../unsafe-name:score", ]) assert eval_command._run_external_predictors(args) == 0 assert captured == [raw_dir / "predictor.0000.group.0000.csv"] assert not (tmp_path / "unsafe-name.0000.csv").exists() def test_eval_paper_figures_run_dispatches_pipeline(tmp_path, monkeypatch): calls = [] def fake_compare(args): calls.append(("compare", args.a, args.b, args.out, args.include)) return 0 def fake_paper(args): calls.append(( "paper", args.comparison_dir, args.out, args.formats, args.scores_dir, args.external_baselines, )) return 0 def fake_plot(args): calls.append(( "plot", args.input, args.summary_pdf, args.paper_figures_out, args.include_paper_figures_in_summary_pdf, )) return 0 monkeypatch.setattr(compare_models, "run", fake_compare) monkeypatch.setattr(paper_figures, "run", fake_paper) monkeypatch.setattr(plot_model_comparison, "run", fake_plot) out = tmp_path / "eval" status = eval_command.run_argv([ "paper-figures", "run", "--a", "new-run", "--b", "public:2.0.0", "--out", str(out), "--include", "affinity", "--scores-dir", str(tmp_path / "scores"), "--external-baselines", "netmhcpan4.ba:ba", "--formats", "svg,pdf", ]) assert status == 0 assert calls == [ ("compare", "new-run", "public:2.0.0", str(out), "affinity"), ( "paper", str(out), str(out / "plots" / "paper_figures"), "svg,pdf", str(tmp_path / "scores"), "netmhcpan4.ba:ba", ), ( "plot", str(out), str(out / "plots" / "model_comparison_figures.pdf"), str(out / "plots" / "paper_figures"), True, ), ] def test_eval_paper_figures_run_preserves_rendered_paper_suite( tmp_path, monkeypatch): out = tmp_path / "eval" combined = out / "plots" / "paper_figures" / "paper_figures.pdf" summary = out / "plots" / "model_comparison_figures.pdf" def fake_compare(args): pathlib.Path(args.out).mkdir(parents=True, exist_ok=True) return 0 def fake_paper(args): pathlib.Path(args.out).mkdir(parents=True, exist_ok=True) combined.write_bytes(b"rendered paper figures") return 0 def fake_summary( plot_dir, out_path, include_paper_figures=False, paper_figures_dir=None): assert include_paper_figures assert pathlib.Path(paper_figures_dir) == combined.parent assert combined.read_bytes() == b"rendered paper figures" pathlib.Path(out_path).write_bytes(b"summary") monkeypatch.setattr(compare_models, "run", fake_compare) monkeypatch.setattr(paper_figures, "run", fake_paper) monkeypatch.setattr(plot_model_comparison, "_apply_paper_style", lambda: None) monkeypatch.setattr( plot_model_comparison, "_plot_release_summary", lambda *args: None) monkeypatch.setattr( plot_model_comparison, "_write_summary_pdf", fake_summary) status = eval_command.run_argv([ "paper-figures", "run", "--a", "new-run", "--out", str(out), ]) assert status == 0 assert combined.read_bytes() == b"rendered paper figures" assert summary.read_bytes() == b"summary" @pytest.mark.parametrize( "extra_args", [ ["--paper-figures-out", "{out}/plots"], [ "--summary-pdf", "{out}/plots/paper_figures/paper_figures.pdf", ], ], ) def test_eval_paper_figures_run_rejects_output_collisions_before_work( tmp_path, monkeypatch, extra_args): calls = [] out = tmp_path / "eval" rendered = out / "plots" / "paper_figures.pdf" rendered.parent.mkdir(parents=True) rendered.write_bytes(b"existing output") monkeypatch.setattr( compare_models, "run", lambda args: calls.append("compare")) monkeypatch.setattr( paper_figures, "run", lambda args: calls.append("paper")) monkeypatch.setattr( plot_model_comparison, "run", lambda args: calls.append("plot")) argv = [ "paper-figures", "run", "--a", "new-run", "--out", str(out), ] + [value.format(out=out) for value in extra_args] with pytest.raises(SystemExit, match="command-owned|dedicated directory"): eval_command.run_argv(argv) assert calls == [] assert rendered.read_bytes() == b"existing output" @pytest.mark.parametrize( ("option", "relative"), [ ("--scores-dir", "plots/saved-scores"), ("--multiallelic-predictions", "affinity/saved-predictions.csv"), ("--monoallelic-predictions", "worker_logs/saved-predictions.csv"), ], ) def test_eval_paper_figures_run_preserves_inputs_during_compare_reset( tmp_path, monkeypatch, option, relative): calls = [] out = tmp_path / "eval" source = out / relative if source.suffix: source.parent.mkdir(parents=True) source.write_text("saved input") else: source.mkdir(parents=True) (source / "saved.csv").write_text("saved input") monkeypatch.setattr( compare_models, "run", lambda args: calls.append("compare")) monkeypatch.setattr( paper_figures, "run", lambda args: calls.append("paper")) monkeypatch.setattr( plot_model_comparison, "run", lambda args: calls.append("plot")) with pytest.raises(SystemExit, match="would be deleted"): eval_command.run_argv([ "paper-figures", "run", "--a", "new-run", "--out", str(out), option, str(source), ]) assert calls == [] assert source.exists() def test_compare_models_help_runs(capsys): """The compare-models help text exposes the documented flags. Goes through ``main()`` rather than ``build_parser`` because subparsers are name-only (lazy import); per-subcommand args are only built when the legacy module is actually invoked. """ with pytest.raises(SystemExit): cli_main.main(["compare-models", "--help"]) captured = capsys.readouterr().out for flag in ["--a", "--b", "--include", "--out", "--data-dir", "--num-jobs", "--gpus", "--max-workers-per-gpu", "--processing-modes", "--presentation-modes", "--skip-affinity-predictions", "--presentation-num-jobs", "--presentation-max-workers-per-gpu", "--presentation-torch-compile"]: assert flag in captured, "missing flag in help: %s" % flag def test_compare_models_can_skip_large_affinity_prediction_artifact( tmp_path, monkeypatch): rows = [] for index in range(40): rows.append({ "peptide": "AAAAAAAAA" if index % 2 else "CCCCCCCCC", "hla": "HLA-A*02:01", "hit": index % 2, "sample_id": "sample", "source_file": "benchmark.csv", }) benchmark = pandas.DataFrame(rows) prediction_calls = [] monkeypatch.setattr( compare_models, "_load_affinity_benchmark", lambda *args, **kwargs: benchmark.copy(), ) monkeypatch.setattr( compare_models, "_read_supported_alleles", lambda path: {"HLA-A*02:01"}, ) monkeypatch.setattr( compare_models, "_parallelism_args_for_component", lambda *args, **kwargs: None, ) monkeypatch.setattr( compare_models, "model_artifact_size_bytes", lambda path: 1, ) def predict(*args, **kwargs): prediction_calls.append(args) return numpy.where(benchmark.hit.values, 50.0, 5000.0) monkeypatch.setattr(compare_models, "_parallel_affinity_predict", predict) out = tmp_path / "comparison" args = compare_models.make_parser().parse_args([ "--a", "a", "--b", "b", "--out", str(out), "--skip-affinity-predictions", ]) side_a = {"label": "a", "paths": {"affinity": "a"}} side_b = {"label": "b", "paths": {"affinity": "b"}} summary = compare_models._run_affinity(side_a, side_b, args) assert len(prediction_calls) == 2 assert summary["n_rows"] == 40 identity = summary["benchmark_identity"] assert identity["row_count"] == 40 assert identity["columns"] == ["source_file", "hla", "peptide", "hit"] assert len(identity["sha256"]) == 64 assert compare_models._affinity_benchmark_identity( benchmark.copy()) == identity assert compare_models._affinity_benchmark_identity( benchmark.iloc[::-1].copy())["sha256"] != identity["sha256"] assert not (out / "affinity" / "predictions.csv.bz2").exists() assert (out / "affinity" / "summary.json").exists() assert (out / "affinity" / "per_allele.csv").exists() def test_compare_models_reuses_only_row_identical_affinity_predictions( tmp_path, monkeypatch): benchmark = pandas.DataFrame({ "source_file": "benchmark.csv", "peptide": ["AAAAAAAAA", "CCCCCCCCC"] * 20, "hla": "HLA-A*02:01", "hit": [1, 0] * 20, }) saved = benchmark.copy() saved["b_pred"] = numpy.where(saved.hit, 50.0, 5000.0) saved_path = tmp_path / "public-predictions.csv.bz2" saved.to_csv(saved_path, index=False) prediction_calls = [] monkeypatch.setattr( compare_models, "_load_affinity_benchmark", lambda *args, **kwargs: benchmark.copy()) monkeypatch.setattr( compare_models, "_read_supported_alleles", lambda path: {"HLA-A*02:01"}) monkeypatch.setattr( compare_models, "_parallelism_args_for_component", lambda *args, **kwargs: None) monkeypatch.setattr( compare_models, "model_artifact_size_bytes", lambda path: 1) def predict(*args, **kwargs): prediction_calls.append(args) return numpy.where(benchmark.hit.values, 40.0, 6000.0) monkeypatch.setattr(compare_models, "_parallel_affinity_predict", predict) args = compare_models.make_parser().parse_args([ "--a", "a", "--b", "b", "--out", str(tmp_path / "comparison"), "--b-affinity-predictions", str(saved_path), "--skip-affinity-predictions", ]) summary = compare_models._run_affinity( {"label": "a", "paths": {"affinity": "a"}}, {"label": "b", "paths": {"affinity": "b"}}, args, ) assert len(prediction_calls) == 1 assert summary["prediction_sources"]["a"]["mode"] == "computed" assert summary["prediction_sources"]["b"]["mode"] == "reused" assert summary["prediction_sources"]["b"]["sha256"] == ( compare_models._sha256_file(saved_path)) mismatched = saved.iloc[::-1] mismatch_path = tmp_path / "mismatch.csv.bz2" mismatched.to_csv(mismatch_path, index=False) mismatch_args = compare_models.make_parser().parse_args([ "--a", "a", "--b", "b", "--out", str(tmp_path / "mismatch-comparison"), "--b-affinity-predictions", str(mismatch_path), ]) with pytest.raises(ValueError, match="different benchmark rows"): compare_models._run_affinity( {"label": "a", "paths": {"affinity": "a"}}, {"label": "b", "paths": {"affinity": "b"}}, mismatch_args, ) def test_compare_models_presentation_parallelism_overrides(): parser = compare_models.make_parser() args = parser.parse_args([ "--a", "public", "--out", "unused", "--num-jobs", "4", "--max-workers-per-gpu", "4", "--presentation-num-jobs", "1", "--presentation-max-workers-per-gpu", "1", "--presentation-max-tasks-per-worker", "1", "--presentation-torch-compile", "0", ]) args._local_parallelism_args_resolved = True args.workload_plan = object() affinity_args = compare_models._parallelism_args_for_component( args, "affinity") processing_args = compare_models._parallelism_args_for_component( args, "processing") presentation_args = compare_models._parallelism_args_for_component( args, "presentation") assert affinity_args is not args assert affinity_args.num_jobs == 4 assert not affinity_args._local_parallelism_args_resolved assert not hasattr(affinity_args, "workload_plan") assert processing_args is not args assert processing_args.num_jobs == 4 assert not processing_args._local_parallelism_args_resolved assert not hasattr(processing_args, "workload_plan") assert presentation_args is not args assert presentation_args.num_jobs == 1 assert presentation_args.max_workers_per_gpu == 1 assert presentation_args.max_tasks_per_worker == 1 assert presentation_args.torch_compile == "0" assert not presentation_args._local_parallelism_args_resolved assert not hasattr(presentation_args, "workload_plan") assert args.num_jobs == 4 assert args.max_workers_per_gpu == 4 assert args._local_parallelism_args_resolved def test_plot_help_runs(capsys): with pytest.raises(SystemExit): cli_main.main(["plot-model-comparison", "--help"]) captured = capsys.readouterr().out assert "--input" in captured assert "--a-label" in captured assert "--paper-figures-scores-dir" in captured assert "--paper-figures-artifacts-dir" in captured assert "--paper-figures-multiallelic-predictions" in captured assert "--paper-figures-candidate-predictor" in captured assert "--include-paper-figures-in-summary-pdf" in captured def test_plot_model_comparison_dispatches_paper_figures(tmp_path, monkeypatch): captured = {} def fake_run(args): captured["scores_dir"] = args.scores_dir captured["comparison_dir"] = args.comparison_dir captured["out"] = args.out captured["formats"] = args.formats captured["candidate_predictor"] = args.candidate_predictor captured["external_baselines"] = args.external_baselines captured["multiallelic_predictions"] = args.multiallelic_predictions return 0 monkeypatch.setattr(paper_figures, "run", fake_run) args = plot_model_comparison.make_parser().parse_args([ "--input", str(tmp_path / "comparison"), "--paper-figures-scores-dir", str(tmp_path / "scores"), "--paper-figures-out", str(tmp_path / "paper"), "--paper-figures-formats", "svg,pdf", "--paper-figures-candidate-predictor", "candidate", "--paper-figures-external-baselines", "baseline:ba", "--paper-figures-multiallelic-predictions", str(tmp_path / "predictions.csv"), ]) assert plot_model_comparison.run(args) == 0 assert captured == { "scores_dir": str(tmp_path / "scores"), "comparison_dir": str(tmp_path / "comparison"), "out": str(tmp_path / "paper"), "formats": "svg,pdf", "candidate_predictor": "candidate", "external_baselines": "baseline:ba", "multiallelic_predictions": str(tmp_path / "predictions.csv"), } def test_paper_figures_help_runs(capsys): with pytest.raises(SystemExit): cli_main.main(["paper-figures", "--help"]) captured = capsys.readouterr().out assert "--scores-dir" in captured assert "--artifacts-dir" in captured assert "--comparison-dir" in captured assert "--multiallelic-predictions" in captured assert "--formats" in captured assert "--candidate-predictor" in captured assert "--external-baselines" in captured def test_unknown_subcommand_errors(): parser = cli_main.build_parser() with pytest.raises(SystemExit): parser.parse_args(["does-not-exist"]) def test_all_legacy_commands_registered(): """All 12 legacy mhcflurry-* commands are reachable as subcommands.""" expected = { "predict", "predict-scan", "downloads", "calibrate-percentile-ranks", "class1-train-allele-specific-models", "class1-select-allele-specific-models", "class1-train-pan-allele-models", "class1-select-pan-allele-models", "class1-train-processing-models", "class1-select-processing-models", "class1-train-presentation-models", "pseudosequences", } assert expected.issubset(set(cli_main._SUBCOMMANDS)) def _load_script_module(path, module_name): spec = importlib.util.spec_from_file_location(module_name, path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module def test_affinity_hyperparameter_generator_is_importable(): path = os.path.join( os.path.dirname(os.path.dirname(__file__)), "scripts/training/release_exact/generate_hyperparameters.py", ) module = _load_script_module(path, "affinity_hyperparameters_under_test") grid = module.build_grid(minibatch_size=2048) assert len(grid) == 35 assert {item["minibatch_size"] for item in grid} == {2048} published_recipe_grid = module.build_grid() assert {item["minibatch_size"] for item in published_recipe_grid} == {128} assert {item["max_epochs"] for item in published_recipe_grid} == {5000} assert {item["min_delta"] for item in published_recipe_grid} == {0.0} assert {item["validation_interval"] for item in published_recipe_grid} == {1} assert { item["optimizer_implementation"] for item in published_recipe_grid } == {"keras"} assert { item["random_negative_pool_epochs"] for item in published_recipe_grid } == {1} def test_processing_hyperparameter_generator_is_importable(): path = os.path.join( os.path.dirname(os.path.dirname(__file__)), "scripts/training/release_exact/generate_hyperparameters.base.py", ) module = _load_script_module(path, "processing_hyperparameters_under_test") grid = module.build_grid(minibatch_size=2048) assert len(grid) == 128 assert {item["minibatch_size"] for item in grid} == {2048} assert {item["minibatch_size"] for item in module.build_grid()} == {512} assert { item["optimizer_implementation"] for item in module.build_grid() } == {"keras"} def test_training_hyperparameter_cli_generates_processing_variant(tmp_path, capsys): cli_main.main([ "class1-generate-training-hyperparameters", "processing-base", "--minibatch-size", "2048", ]) base_text = capsys.readouterr().out base = yaml.safe_load(base_text) assert len(base) == 128 assert {item["minibatch_size"] for item in base} == {2048} assert {item["optimizer_implementation"] for item in base} == {"keras"} base_path = tmp_path / "hyperparameters.base.yaml" base_path.write_text(base_text) cli_main.main([ "class1-generate-training-hyperparameters", "processing-variant", str(base_path), "short_flanks", ]) variant = yaml.safe_load(capsys.readouterr().out) assert len(variant) == 128 assert {item["n_flank_length"] for item in variant} == {5} assert {item["c_flank_length"] for item in variant} == {5} assert {item["optimizer_implementation"] for item in variant} == {"keras"} assert {item["init"] for item in variant} == {"glorot_uniform"} cli_main.main([ "class1-generate-training-hyperparameters", "processing-variant", str(base_path), "with_flanks", "--optimizer-implementation", "pytorch", "--init", "kaiming_uniform_fan_in", ]) with_flanks = yaml.safe_load(capsys.readouterr().out) assert len(with_flanks) == 128 assert {item["n_flank_length"] for item in with_flanks} == {15} assert {item["c_flank_length"] for item in with_flanks} == {15} assert { item["optimizer_implementation"] for item in with_flanks } == {"pytorch"} assert {item["init"] for item in with_flanks} == { "kaiming_uniform_fan_in" } def test_training_hyperparameter_helpers_reject_invalid_configuration(): from mhcflurry.cli import generate_training_hyperparameters as generator with pytest.raises(ValueError, match="Unknown processing variant"): generator.transform_processing_hyperparameters( "typo", {"n_flank_length": 15, "c_flank_length": 15}) with pytest.raises(SystemExit): generator.make_parser().parse_args([ "affinity", "--minibatch-size", "0", ]) with pytest.raises(ValueError, match="Unknown optimizer implementation"): generator.transform_processing_hyperparameters( "with_flanks", {"n_flank_length": 15, "c_flank_length": 15}, optimizer_implementation="typo", ) with pytest.raises(ValueError, match="Unknown processing initializer"): generator.transform_processing_hyperparameters( "with_flanks", {"n_flank_length": 15, "c_flank_length": 15}, init="typo", ) def test_training_hyperparameter_generator_tracks_ablation_switches(): from mhcflurry.cli import generate_training_hyperparameters as generator affinity = generator.build_affinity_grid( optimizer_implementation="pytorch", data_dependent_initialization_target="pre_activation", init="he_uniform", ) assert {item["optimizer_implementation"] for item in affinity} == {"pytorch"} assert { item["data_dependent_initialization_target"] for item in affinity } == {"pre_activation"} assert {item["init"] for item in affinity} == {"he_uniform"} with pytest.raises(ValueError, match="Unknown affinity initializer"): generator.build_affinity_grid(init="typo") processing = generator.build_processing_base_grid( optimizer_implementation="pytorch", init="kaiming_uniform_fan_in", ) assert {item["optimizer_implementation"] for item in processing} == {"pytorch"} assert {item["init"] for item in processing} == {"kaiming_uniform_fan_in"} def test_release_hyperparameter_ablation_panels_are_paired(): from mhcflurry.cli import generate_training_hyperparameters as generator affinity = generator.build_affinity_ablation_panels() assert set(affinity) == { "published_parity", "proposed_release", "pre_activation_lsuv", "no_lsuv", "pytorch_rmsprop", "pytorch_rmsprop_batch128", } assert {len(values) for values in affinity.values()} == {2} affinity_architectures = { condition: [ (item["topology"], item["layer_sizes"], item["dense_layer_l1_regularization"]) for item in values ] for condition, values in affinity.items() } assert len({repr(value) for value in affinity_architectures.values()}) == 1 assert { item["data_dependent_initialization_method"] for item in affinity["no_lsuv"] } == {None} assert { item["minibatch_size"] for item in affinity["pytorch_rmsprop_batch128"] } == {128} assert { item["optimizer_implementation"] for item in affinity["pytorch_rmsprop_batch128"] } == {"pytorch"} processing = generator.build_processing_ablation_panels() assert set(processing) == { "glorot_keras_adam", "kaiming_keras_adam", "glorot_pytorch_adam", "kaiming_pytorch_adam", } assert {len(values) for values in processing.values()} == {2} def test_processing_batch_sweep_panels_are_focused_and_paired(): from mhcflurry.cli import generate_training_hyperparameters as generator panels = generator.build_processing_batch_sweep_panels() assert set(panels) == { "batch%d.%s" % (batch, variant) for batch in (128, 256, 512, 1024) for variant in ("short_flanks", "no_flank") } for batch in (128, 256, 512, 1024): short = panels["batch%d.short_flanks" % batch] no_flank = panels["batch%d.no_flank" % batch] assert len(short) == 4 assert len(no_flank) == 3 assert {item["minibatch_size"] for item in short + no_flank} == { batch } assert { (item["n_flank_length"], item["c_flank_length"]) for item in short } == {(5, 5)} assert { (item["n_flank_length"], item["c_flank_length"]) for item in no_flank } == {(0, 0)} short_small = [ item for item in short if item["convolutional_activation"] == "tanh" ] assert len(short_small) == 1 assert { (item["init"], item["optimizer_implementation"]) for item in short_small } == {("glorot_uniform", "keras")} short_large = [ item for item in short if item["convolutional_activation"] == "relu" ] assert { (item["init"], item["optimizer_implementation"]) for item in short_large } == { ("glorot_uniform", "keras"), ("glorot_uniform", "pytorch"), ("kaiming_uniform_fan_in", "pytorch"), } no_flank_large = [ item for item in no_flank if item["convolutional_activation"] == "relu" ] assert len(no_flank_large) == 1 assert ( no_flank_large[0]["init"], no_flank_large[0]["optimizer_implementation"], ) == ("glorot_uniform", "keras") @pytest.mark.parametrize("sizes", [(), (0,), (128, 128), (True,)]) def test_processing_batch_sweep_rejects_invalid_sizes(sizes): from mhcflurry.cli import generate_training_hyperparameters as generator with pytest.raises(ValueError): generator.build_processing_batch_sweep_panels(sizes) def test_release_ablation_generator_writes_all_processing_flank_variants( tmp_path): path = pathlib.Path( "scripts/training/generate_release_hyperparameter_ablations.py" ) generator = _load_script_module(path, "release_ablations_under_test") manifest = generator.write_panels(tmp_path) processing_paths = { record["path"] for record in manifest["records"] if record["path"].startswith("processing.") } assert len(processing_paths) == 12 for condition in ( "glorot_keras_adam", "kaiming_keras_adam", "glorot_pytorch_adam", "kaiming_pytorch_adam"): for variant in ("with_flanks", "no_flank", "short_flanks"): assert "processing.%s.%s.yaml" % ( condition, variant) in processing_paths batch_paths = { record["path"] for record in manifest["records"] if record["path"].startswith("processing_batch_sweep.") } assert batch_paths == { "processing_batch_sweep.batch%d.%s.yaml" % (batch, variant) for batch in (128, 256, 512, 1024) for variant in ("short_flanks", "no_flank") } assert manifest["processing_batch_sweep"] == { "minibatch_sizes": [128, 256, 512, 1024], "priority": ["short_flanks", "no_flank"], "with_flanks_policy": "excluded_except_targeted_8mer_diagnostic", } def test_processing_ablation_runner_includes_focused_batch_sweep(): runner = pathlib.Path( "scripts/training/run_release_processing_ablations.sh" ).read_text() assert "batch_sweep_variants=(short_flanks no_flank)" in runner assert "for minibatch_size in 128 256 512 1024" in runner assert "processing_batch_sweep.batch$minibatch_size.$variant.yaml" in runner assert "--processing-modes short_flanks,no_flank" in runner focused_runner = pathlib.Path( "scripts/training/run_processing_batch_sweep.sh" ).read_text() for option in ( "--out", "--train-data", "--data-eval-dir", "--release-holdout-dir", "--source-commit", "--gpus", "--max-workers-per-gpu", "--dataloader-num-workers", ): assert option in focused_runner assert "MHCFLURRY_OUT" not in focused_runner assert "train_panel \"$minibatch_size\" short_flanks" in focused_runner assert "train_panel \"$minibatch_size\" no_flank" in focused_runner def test_affinity_release_script_accepts_tracked_ablation_yaml(): affinity_script = pathlib.Path( "scripts/training/pan_allele_release_affinity.sh" ).read_text() runner = pathlib.Path( "scripts/training/run_release_affinity_ablations.sh" ).read_text() assert "AFFINITY_HYPERPARAMETERS_FILE" in affinity_script assert "SKIP_CALIBRATE" in affinity_script for condition in ( "published_parity", "proposed_release", "pre_activation_lsuv", "no_lsuv", "pytorch_rmsprop", "pytorch_rmsprop_batch128", ): assert condition in runner assert "release-holdout build" in runner assert "--release-holdout-dir" in runner assert "--affinity-training-overlap-policy audit" in runner assert "published_parity/models.combined" in runner assert "AFFINITY_ABLATION_CONDITIONS" in runner assert "AFFINITY_ABLATION_BASELINE_DIR" in runner assert "SKIP_CALIBRATE=1" in runner assert "SKIP_EVAL=1" in runner def test_processing_release_script_runs_paired_seeded_ablations(): runner = pathlib.Path( "scripts/training/run_release_processing_ablations.sh" ).read_text() for condition in ( "glorot_keras_adam", "kaiming_keras_adam", "glorot_pytorch_adam", "kaiming_pytorch_adam", ): assert condition in runner assert "--random-seed \"$RELEASE_RANDOM_SEED\"" in runner assert "--exclude-samples-file \"$HOLDOUT_DIR/processing_samples.csv\"" in runner assert "PROCESSING_ABLATION_VARIANTS" in runner assert "PROCESSING_ABLATION_COMPARE_MODES" in runner assert "with_flanks|no_flank|short_flanks" in runner assert "vs-glorot_keras_adam" in runner assert "glorot_keras_adam-vs-public" in runner assert runner.count('"${TRAINING_PARALLELISM_ARGS[@]}"') == 4 assert runner.count('"${COMMON_PARALLELISM_ARGS[@]}"') == 5 comparison_block = runner[runner.index("DATA_EVAL_DIR="):] assert "--dataloader-num-workers" not in comparison_block assert '"${COMMON_PARALLELISM_ARGS[@]}"' in comparison_block def test_reassign_mass_spec_training_data_cli(tmp_path): input_path = tmp_path / "train.csv" output_path = tmp_path / "out.csv" pandas.DataFrame({ "measurement_kind": ["mass_spec", "binding"], "measurement_inequality": ["=", "="], "measurement_value": [123.0, 456.0], }).to_csv(input_path, index=False) cli_main.main([ "class1-reassign-mass-spec-training-data", str(input_path), "--set-measurement-value", "100", "--out-csv", str(output_path), ]) result = pandas.read_csv(output_path) assert result.measurement_value.tolist() == [100.0, 456.0] def test_remote_launcher_preserves_shared_minibatch_override( monkeypatch, tmp_path): """Family-specific minibatch env vars should only be set when provided.""" monkeypatch.setenv("RUNPLZ_MIN_DISK", "none") monkeypatch.setenv("RUNPLZ_OUTPUT_VOLUME", "test-output-volume") monkeypatch.delenv("RUNPLZ_TIMEOUT_SECONDS", raising=False) fake_runplz = types.ModuleType("runplz") fake_config = types.ModuleType("runplz.config") pip_packages = [] class FakeImage: @classmethod def from_registry(cls, *_args, **_kwargs): return cls() def apt_install(self, *_args, **_kwargs): return self def pip_install(self, *args, **_kwargs): pip_packages.extend(args) return self def pip_install_local_dir(self, *_args, **_kwargs): return self class FakeApp: def __init__(self, *_args, **_kwargs): pass def function(self, *_args, **_kwargs): return lambda fn: fn def local_entrypoint(self, *_args, **_kwargs): return lambda fn: fn fake_runplz.App = FakeApp fake_runplz.Image = FakeImage fake_config.BrevConfig = lambda **kwargs: kwargs monkeypatch.setitem(sys.modules, "runplz", fake_runplz) monkeypatch.setitem(sys.modules, "runplz.config", fake_config) path = os.path.join( os.path.dirname(os.path.dirname(__file__)), "scripts/training/launch_pan_allele_training_remote.py", ) module = _load_script_module(path, "remote_launcher_under_test") assert module.MIN_DISK is None assert module.OUTPUT_VOLUMES == {"/out": "test-output-volume"} assert module.FUNCTION_TIMEOUT_SECONDS == 86400 assert "runplz==4.4.2" in pip_packages assert module.remote_training_env({})["TRAINING_MINIBATCH_SIZE"] == "128" env = module.remote_training_env({"TRAINING_MINIBATCH_SIZE": "2048"}) assert env["TRAINING_MINIBATCH_SIZE"] == "2048" assert env["COMPARE_BASELINE"] == "public:2.2.0" assert env["COMPARE_BASELINE_LABEL"] == "MHCflurry 2.2" assert env["COMPARE_BACKEND"] == "auto" assert env["EVAL_MAX_BENCHMARK_FILES"] == "" assert env["COMPARE_GPUS"] == "auto" assert env["COMPARE_TORCH_COMPILE"] == "0" assert env["COMPARE_MATMUL_PRECISION"] == "highest" assert env["MHCFLURRY_RELEASE_WORKFLOW_ID"] == "" assert env["MHCFLURRY_RELEASE_GIT_COMMIT"] == "" assert env["MHCFLURRY_RELEASE_VERSION"] == "" assert env["MHCFLURRY_RELEASE_RECIPE"] == "" assert env["MHCFLURRY_RELEASE_OUT"] == "" assert env["MHCFLURRY_RELEASE_DATA_VINTAGE"] == "" assert env["MHCFLURRY_REMOTE_WORKFLOW"] == "full" assert env["BOUNDARY_RADIUS_ARCHITECTURE"] == "large_relu" assert env["BOUNDARY_RADIUS_AFFINITY_CONTROL"] == "none" assert env["BOUNDARY_RADIUS_BASE_RUN"] == "" assert env["BOUNDARY_RADIUS_HOLDOUT_DIR"] == "" assert env["BOUNDARY_RADIUS_OUT"] == "" assert env["BOUNDARY_RADIUS_PARALLEL_CONDITIONS"] == "1" assert env["BOUNDARY_RADIUS_TRAIN_DATA"] == "" assert env["RELEASE_RANDOM_SEED"] == "42" assert env["MHCFLURRY_GPU_TELEMETRY"] == "1" assert env["MHCFLURRY_GPU_TELEMETRY_SECONDS"] == "30" assert env["NUM_JOBS"] == "auto" assert env["AFFINITY_ABLATION_CONDITIONS"] == "" assert env["AFFINITY_ABLATION_BASELINE_DIR"] == "" assert env["AFFINITY_OPTIMIZER_IMPLEMENTATION"] == "keras" assert env["AFFINITY_LSUV_TARGET"] == "post_activation" assert env["AFFINITY_INIT"] == "glorot_uniform" assert env["MKL_THREADING_LAYER"] == "GNU" assert env["COMPARE_PRESENTATION_NUM_JOBS"] == "auto" assert env["COMPARE_PRESENTATION_MAX_WORKERS_PER_GPU"] == "auto" assert env["COMPARE_PRESENTATION_MAX_TASKS_PER_WORKER"] == "1" assert env["COMPARE_PRESENTATION_TORCH_COMPILE"] == "0" assert "AFFINITY_MINIBATCH_SIZE" not in env assert "AFFINITY_MAX_WORKERS_PER_GPU" not in env assert "PROCESSING_MINIBATCH_SIZE" not in env assert env["PROCESSING_NUM_JOBS"] == "auto" assert env["PROCESSING_MAX_WORKERS_PER_GPU"] == "auto" assert env["PROCESSING_HELD_OUT_SAMPLES"] == "10" assert env["PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS"] == "0" assert env["PRESENTATION_DECOYS_PER_HIT"] == "2" assert env["PRESENTATION_SAMPLE_FRACTION"] == "0.1" assert env["PRESENTATION_PROCESSING_WITH_FLANKS_KIND"] == "short_flanks" assert env["MHCFLURRY_TORCH_COMPILE"] == "0" assert env["MHCFLURRY_TORCH_COMPILE_LOSS"] == "0" assert env["MHCFLURRY_MATMUL_PRECISION"] == "highest" assert env["PRESENTATION_FEATURE_CHUNK_SIZE"] == "250000" assert env["PRESENTATION_NUM_JOBS"] == "auto" assert env["PRESENTATION_MAX_WORKERS_PER_GPU"] == "auto" assert env["PRESENTATION_CALIBRATION_NUM_JOBS"] == "auto" assert env["PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU"] == "auto" assert env["PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE"] == "auto" env = module.remote_training_env({ "TRAINING_MINIBATCH_SIZE": "2048", "AFFINITY_MINIBATCH_SIZE": "512", "AFFINITY_MAX_WORKERS_PER_GPU": "3", "PROCESSING_NUM_JOBS": "4", "PROCESSING_MAX_WORKERS_PER_GPU": "1", "PROCESSING_HELD_OUT_SAMPLES": "17", "PRESENTATION_DECOYS_PER_HIT": "7", "PRESENTATION_SAMPLE_FRACTION": "0.25", "PRESENTATION_FEATURE_CHUNK_SIZE": "12345", "PRESENTATION_NUM_JOBS": "8", "PRESENTATION_MAX_WORKERS_PER_GPU": "2", "PRESENTATION_CALIBRATION_NUM_JOBS": "3", "PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU": "4", "PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE": "4096", "COMPARE_BASELINE": "public:2.2.0", "COMPARE_BASELINE_LABEL": "MHCflurry 2.2", "COMPARE_BACKEND": "cpu", "EVAL_MAX_BENCHMARK_FILES": "1", "COMPARE_GPUS": "1", "COMPARE_TORCH_COMPILE": "off", "COMPARE_MATMUL_PRECISION": "medium", "MHCFLURRY_RELEASE_WORKFLOW_ID": "run-123", "MHCFLURRY_RELEASE_GIT_COMMIT": "abc123", "MHCFLURRY_RELEASE_VERSION": "2.3.0", "MHCFLURRY_RELEASE_RECIPE": "final-2.3.0-candidate", "RUNPLZ_OUT": "/out/candidate", "MHCFLURRY_REMOTE_WORKFLOW": "processing-ablations", "RELEASE_RANDOM_SEED": "271", "MHCFLURRY_GPU_TELEMETRY": "0", "MHCFLURRY_GPU_TELEMETRY_SECONDS": "5", "NUM_JOBS": "6", "AFFINITY_ABLATION_CONDITIONS": "pytorch_rmsprop_batch128", "AFFINITY_ABLATION_BASELINE_DIR": "/remote/baseline", "AFFINITY_OPTIMIZER_IMPLEMENTATION": "pytorch", "AFFINITY_LSUV_TARGET": "pre_activation", "AFFINITY_INIT": "he_uniform", "PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS": "5", "PROCESSING_SHORT_FLANKS_HYPERPARAMETERS": "confirmed-ranking-candidate", "MHCFLURRY_RELEASE_SMOKE": "1", "MKL_THREADING_LAYER": "TBB", }) assert env["AFFINITY_MINIBATCH_SIZE"] == "512" assert env["AFFINITY_MAX_WORKERS_PER_GPU"] == "3" assert env["PROCESSING_NUM_JOBS"] == "4" assert env["PROCESSING_MAX_WORKERS_PER_GPU"] == "1" assert env["PROCESSING_HELD_OUT_SAMPLES"] == "17" assert env["PRESENTATION_DECOYS_PER_HIT"] == "7" assert env["PRESENTATION_SAMPLE_FRACTION"] == "0.25" assert env["PRESENTATION_FEATURE_CHUNK_SIZE"] == "12345" assert env["PRESENTATION_NUM_JOBS"] == "8" assert env["PRESENTATION_MAX_WORKERS_PER_GPU"] == "2" assert env["PRESENTATION_CALIBRATION_NUM_JOBS"] == "3" assert env["PRESENTATION_CALIBRATION_MAX_WORKERS_PER_GPU"] == "4" assert env["PRESENTATION_CALIBRATION_PREDICTION_BATCH_SIZE"] == "4096" assert env["COMPARE_BASELINE"] == "public:2.2.0" assert env["COMPARE_BASELINE_LABEL"] == "MHCflurry 2.2" assert env["COMPARE_BACKEND"] == "cpu" assert env["EVAL_MAX_BENCHMARK_FILES"] == "1" assert env["COMPARE_GPUS"] == "1" assert env["COMPARE_TORCH_COMPILE"] == "off" assert env["COMPARE_MATMUL_PRECISION"] == "medium" assert env["MHCFLURRY_RELEASE_WORKFLOW_ID"] == "run-123" assert env["MHCFLURRY_RELEASE_GIT_COMMIT"] == "abc123" assert env["MHCFLURRY_RELEASE_VERSION"] == "2.3.0" assert env["MHCFLURRY_RELEASE_RECIPE"] == "final-2.3.0-candidate" assert env["RUNPLZ_OUT"] == "/out/candidate" assert env["MHCFLURRY_REMOTE_WORKFLOW"] == "processing-ablations" assert env["RELEASE_RANDOM_SEED"] == "271" assert env["MHCFLURRY_GPU_TELEMETRY"] == "0" assert env["MHCFLURRY_GPU_TELEMETRY_SECONDS"] == "5" assert env["NUM_JOBS"] == "6" assert env["AFFINITY_ABLATION_CONDITIONS"] == "pytorch_rmsprop_batch128" assert env["AFFINITY_ABLATION_BASELINE_DIR"] == "/remote/baseline" assert env["PROCESSING_SHORT_FLANKS_HYPERPARAMETERS"] == "confirmed-ranking-candidate" assert module.remote_training_env({})["PROCESSING_SHORT_FLANKS_HYPERPARAMETERS"] == "grid" assert env["MHCFLURRY_RELEASE_SMOKE"] == "1" # runplz refuses detached Modal runs whose function env has any RUNPLZ_OUT key. assert "RUNPLZ_OUT" not in module.remote_training_env({}) detached = module.remote_training_env({"MHCFLURRY_RELEASE_OUT": "/out/runs/v2"}) assert "RUNPLZ_OUT" not in detached and detached["MHCFLURRY_RELEASE_OUT"] == "/out/runs/v2" module.validate_smoke_output({"MHCFLURRY_RELEASE_SMOKE": "1", "MHCFLURRY_RELEASE_OUT": "/out/runs/v2-smoke", "RUNPLZ_OUT": "/out/runplz/0123456789abcdef"}) runplz_out = tmp_path / "runplz" / "0123456789abcdef" pointer = module.write_runplz_output_pointer( "/out/runs/v2", {"RUNPLZ_OUT": str(runplz_out)}) assert pointer.read_text() == "/out/runs/v2\n" assert module.write_runplz_output_pointer(str(runplz_out), {"RUNPLZ_OUT": str(runplz_out)}) is None assert module.write_runplz_output_pointer("/out/runs/v2", {}) is None assert module.remote_training_env({})["MHCFLURRY_RELEASE_SMOKE"] == "0" module.validate_smoke_output({"MHCFLURRY_RELEASE_SMOKE": "0", "RUNPLZ_OUT": "/out/runs/release"}) module.validate_smoke_output({"MHCFLURRY_RELEASE_SMOKE": "1", "RUNPLZ_OUT": "/out/runs/v2-smoke"}) with pytest.raises(ValueError, match="smoke"): module.validate_smoke_output({"MHCFLURRY_RELEASE_SMOKE": "1", "RUNPLZ_OUT": "/out/runs/final"}) assert env["AFFINITY_OPTIMIZER_IMPLEMENTATION"] == "pytorch" assert env["AFFINITY_LSUV_TARGET"] == "pre_activation" assert env["AFFINITY_INIT"] == "he_uniform" assert env["PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS"] == "5" assert env["MKL_THREADING_LAYER"] == "TBB" assert module.remote_workflow_script({}) == ( "full", "scripts/training/pan_allele_release_full.sh") assert module.remote_workflow_script({ "MHCFLURRY_REMOTE_WORKFLOW": "affinity-ablations", }) == ( "affinity-ablations", "scripts/training/run_release_affinity_ablations.sh", ) assert module.remote_workflow_script({ "MHCFLURRY_REMOTE_WORKFLOW": "processing-cleavage-boundaries", }) == ( "processing-cleavage-boundaries", "scripts/training/run_processing_cleavage_boundaries_remote.sh", ) assert module.remote_workflow_script({ "MHCFLURRY_REMOTE_WORKFLOW": "processing-cleavage-boundary-radius", }) == ( "processing-cleavage-boundary-radius", "scripts/training/run_processing_cleavage_boundary_radius_remote.sh", ) with pytest.raises(ValueError, match="MHCFLURRY_REMOTE_WORKFLOW"): module.remote_workflow_script({ "MHCFLURRY_REMOTE_WORKFLOW": "typo", }) brev_config = module.brev_config_from_env({ "RUNPLZ_BREV_AUTO_CREATE": "1", "RUNPLZ_BREV_INSTANCE_TYPE": "test.gpu", "RUNPLZ_BREV_ON_FINISH": "stop", "RUNPLZ_BREV_MAX_RUNTIME_SECONDS": "3600", "RUNPLZ_BREV_INSTANCE_TYPE_FALLBACK_COUNT": "5", "RUNPLZ_BREV_EXCLUDE_PROVIDERS": "oci,broken", }) assert brev_config["auto_create_instances"] is True assert brev_config["instance_type"] == "test.gpu" assert brev_config["on_finish"] == "stop" assert brev_config["max_runtime_seconds"] == 3600 assert brev_config["instance_type_fallback_count"] == 5 assert brev_config["exclude_providers"] == ("oci", "broken") assert module.compare_torch_compile_value({ "MHCFLURRY_TORCH_COMPILE": "yes", }) == "1" assert module.compare_torch_compile_value({ "COMPARE_TORCH_COMPILE": "off", }) == "0" assert module.compare_torch_compile_value({}) == "auto" assert module.compare_matmul_precision_value({ "COMPARE_MATMUL_PRECISION": "HIGH", }) == "high" with pytest.raises(ValueError): module.compare_torch_compile_value({"COMPARE_TORCH_COMPILE": "maybe"}) plot_commands = [] def capture_plot_command(command, **_kwargs): plot_commands.append(command) monkeypatch.setattr(module.subprocess, "run", capture_plot_command) module.run_release_plots(tmp_path, tmp_path / "release-run", env) assert len(plot_commands) == 1 assert "--include-paper-figures-in-summary-pdf" in plot_commands[0] eval_commands = [] monkeypatch.setattr( module.subprocess, "run", lambda command, **kwargs: eval_commands.append(command)) monkeypatch.setattr( module.subprocess, "check_output", lambda command, **kwargs: str(tmp_path / command[-1])) eval_env = dict(env, DATA_DIR=str(tmp_path), COMPARE_INCLUDE="affinity,processing,presentation") run_dir = tmp_path / "evaluation-run" module.run_release_evaluation(tmp_path, run_dir, eval_env) comparisons = [cmd for cmd in eval_commands if cmd[:3] == ["mhcflurry", "eval", "compare-models"]] assert len(comparisons) == 2 for cmd in comparisons: assert cmd[cmd.index("--release-holdout-dir") + 1] == str(run_dir / "release_holdout") assert cmd[cmd.index("--limit-files") + 1] == "1" assert cmd[cmd.index("--gpus") + 1] == "1" public, fair = comparisons assert public[public.index("--affinity-training-overlap-policy") + 1] == "audit" assert fair[fair.index("--affinity-training-overlap-policy") + 1] == "exclude" assert fair[fair.index("--affinity-source") + 1] == "no_additional_ms" assert fair[fair.index("--include") + 1] == "affinity" assert fair[fair.index("--b-affinity-dir") + 1] == str( tmp_path / "models_class1_pan_variants/models.no_additional_ms") assert "models_class1_pan_variants" in eval_commands[0] eval_commands.clear() module.run_release_evaluation(tmp_path, run_dir, dict(eval_env, COMPARE_INCLUDE="processing")) assert len([cmd for cmd in eval_commands if "compare-models" in cmd]) == 1 assert "models_class1_pan_variants" not in eval_commands[0] with pytest.raises(ValueError): module.compare_matmul_precision_value({ "COMPARE_MATMUL_PRECISION": "fast", }) def test_remote_launcher_rejects_dirty_or_mislabeled_release_source( monkeypatch, tmp_path): monkeypatch.setenv("RUNPLZ_MIN_DISK", "none") fake_runplz = types.ModuleType("runplz") fake_config = types.ModuleType("runplz.config") class FakeImage: @classmethod def from_registry(cls, *_args, **_kwargs): return cls() def apt_install(self, *_args, **_kwargs): return self def pip_install(self, *_args, **_kwargs): return self def pip_install_local_dir(self, *_args, **_kwargs): return self class FakeApp: def __init__(self, *_args, **_kwargs): pass def function(self, *_args, **_kwargs): return lambda fn: fn def local_entrypoint(self, *_args, **_kwargs): return lambda fn: fn fake_runplz.App = FakeApp fake_runplz.Image = FakeImage fake_config.BrevConfig = lambda **kwargs: kwargs monkeypatch.setitem(sys.modules, "runplz", fake_runplz) monkeypatch.setitem(sys.modules, "runplz.config", fake_config) path = os.path.join( os.path.dirname(os.path.dirname(__file__)), "scripts/training/launch_pan_allele_training_remote.py", ) module = _load_script_module(path, "remote_launcher_provenance_test") repo = tmp_path / "source" (repo / "mhcflurry").mkdir(parents=True) source = repo / "mhcflurry" / "example.py" source.write_text("VALUE = 1\n") subprocess.run(["git", "init", str(repo)], check=True) subprocess.run(["git", "-C", str(repo), "add", "."], check=True) subprocess.run([ "git", "-C", str(repo), "-c", "user.name=Test", "-c", "user.email=test@example.com", "commit", "-m", "source", ], check=True, capture_output=True) commit = subprocess.check_output( ["git", "-C", str(repo), "rev-parse", "HEAD"], text=True).strip() module.validate_local_release_source( repo, {"MHCFLURRY_RELEASE_GIT_COMMIT": commit}) with pytest.raises(ValueError, match="does not match local HEAD"): module.validate_local_release_source( repo, {"MHCFLURRY_RELEASE_GIT_COMMIT": "deadbeef"}) source.write_text("VALUE = 2\n") with pytest.raises(ValueError, match="modified or untracked executable"): module.validate_local_release_source( repo, {"MHCFLURRY_RELEASE_GIT_COMMIT": commit}) def test_main_help_does_not_import_predict_command(): """``mhcflurry --help`` must not pay the cost of importing every legacy command module. Lazy-import is the whole reason build_parser only registers subcommand names.""" import subprocess import sys as _sys result = subprocess.run( [_sys.executable, "-c", "import sys; from mhcflurry.cli.main import build_parser; " "build_parser(); " "print('\\n'.join(name for name in (" "'mhcflurry.predict_command', " "'mhcflurry.cli.predict_command') if name in sys.modules))"], capture_output=True, text=True, check=True, ) assert result.stdout.strip() == "", ( "predict_command was imported by build_parser(); should be lazy: %s" % result.stdout ) def test_legacy_command_module_shims_reexport_cli_modules(): command_modules = [ "calibrate_percentile_ranks_command", "downloads_command", "predict_command", "predict_scan_command", "select_allele_specific_models_command", "select_pan_allele_models_command", "select_processing_models_command", "train_allele_specific_models_command", "train_pan_allele_models_command", "train_processing_models_command", "train_presentation_models_command", ] for module_name in command_modules: legacy = importlib.import_module("mhcflurry.%s" % module_name) canonical = importlib.import_module("mhcflurry.cli.%s" % module_name) assert legacy.run is canonical.run assert legacy.parser is canonical.parser from mhcflurry import predict_command from mhcflurry.cli import predict_command as cli_predict_command assert ( predict_command._predict_dataframe_chunk is cli_predict_command._predict_dataframe_chunk ) def test_main_dispatches_pseudosequences_list(capsys): """End-to-end: ``mhcflurry pseudosequences list`` runs the legacy module's main(argv) and prints the registry rows.""" cli_main.main(["pseudosequences", "list"]) out = capsys.readouterr().out assert "netmhcpan" in out assert "pseudosequences.mhcflurry.39aa.csv" in out def test_main_unknown_subcommand_exits(): with pytest.raises(SystemExit): cli_main.main(["does-not-exist"]) def test_version_flag(capsys): """``mhcflurry --version`` and ``-V`` print the package version + exit 0.""" from mhcflurry.version import __version__ for flag in ("--version", "-V"): assert cli_main.main([flag]) == 0 out = capsys.readouterr().out assert out.strip() == "mhcflurry %s" % __version__ def test_bare_invocation_shows_grouped_help(capsys): """Bare ``mhcflurry`` prints the grouped help screen to stdout + exits 0 (treats no-args as 'user asked for help').""" assert cli_main.main([]) == 0 out = capsys.readouterr().out assert "MHCflurry " in out # version banner for group in ( "Prediction:", "Calibration:", "Class I training:", "Class I selection:", "Evaluation and figures", ): assert group in out, "missing group header: %s" % group # The example block should also surface. assert "Examples:" in out assert "mhcflurry eval compare-models" in out def test_subsubcommand_help_shows_full_prog(capsys): """``mhcflurry pseudosequences filename --help`` must show the full ``mhcflurry pseudosequences filename`` prog, not the inherited ``sys.argv[0]`` from the parent. Regression for sub-subparsers inheriting prog at parser-build time.""" with pytest.raises(SystemExit): cli_main.main(["pseudosequences", "filename", "--help"]) captured = capsys.readouterr().out assert "usage: mhcflurry pseudosequences filename" in captured, captured def test_artifact_subcommand_preserves_recorded_argv(monkeypatch, tmp_path): """Artifact commands dispatched through ``mhcflurry`` must record a split executable + subcommand in GENERATE.sh, not a single argv[0] containing a space.""" from mhcflurry.common import write_generate_sh out_dir = tmp_path / "models" module = types.ModuleType("test_cli_fake_artifact_command") def run(argv): assert argv == ["--out-dir", str(out_dir)] os.makedirs(str(out_dir)) write_generate_sh(str(out_dir), mhcflurry_version="9.9.9-test") return 0 module.run = run monkeypatch.setitem(sys.modules, module.__name__, module) monkeypatch.setitem( cli_main._SUBCOMMANDS, "fake-artifact", (module.__name__, "run", "Fake artifact-producing command."), ) monkeypatch.setattr( sys, "argv", ["mhcflurry", "fake-artifact", "--out-dir", str(out_dir)]) assert cli_main.main(sys.argv[1:]) == 0 contents = (out_dir / "GENERATE.sh").read_text() assert "'mhcflurry fake-artifact'" not in contents assert "mhcflurry \\\n fake-artifact" in contents def test_rewrite_parser_prog_restores_on_exit(capsys): """Two consecutive dispatches must each see their own prog — i.e. the saved/restore cycle in _rewrite_parser_prog actually undoes the rewrite. Catches a regression where the second call would leak the first call's prog.""" with pytest.raises(SystemExit): cli_main.main(["pseudosequences", "filename", "--help"]) first = capsys.readouterr().out with pytest.raises(SystemExit): cli_main.main(["pseudosequences", "filename", "--help"]) second = capsys.readouterr().out assert "usage: mhcflurry pseudosequences filename" in first assert "usage: mhcflurry pseudosequences filename" in second # --------------------------------------------------------------------------- # Side resolution # --------------------------------------------------------------------------- def _make_args(**overrides): defaults = dict( a=None, b=None, a_label=None, b_label=None, out=None, include="auto", data_dir=None, limit_files=None, affinity_source="mixmhcpred", processing_modes="with_flanks,no_flank,short_flanks", presentation_modes="with_flanks,without_flanks", ) for letter in ("a", "b"): for role in ("affinity", "processing", "presentation", "training"): defaults["%s_%s_dir" % (letter, role)] = None defaults.update(overrides) return argparse.Namespace(**defaults) def test_resolve_side_label_defaults_to_basename(tmp_path): run_dir = tmp_path / "my_run" run_dir.mkdir() side = compare_models._resolve_side( "a", str(run_dir), label=None, args=_make_args()) assert side["label"] == "my_run" assert side["spec"] == str(run_dir) def test_resolve_side_public_label(): side = compare_models._resolve_side( "b", "public", label=None, args=_make_args()) assert side["label"] == "public" def test_resolve_side_public_pinned_release_label(): side = compare_models._resolve_side( "b", "public:4-pre-2.2.0", label=None, args=_make_args()) assert side["label"] == "public:4-pre-2.2.0" def test_resolve_side_public_pin_does_not_leak(monkeypatch): from mhcflurry import downloads release_env = "MHCFLURRY_DOWNLOADS_CURRENT_RELEASE" monkeypatch.delenv(release_env, raising=False) def fake_configure(): pass def fake_get_path(download_name, sub): release = os.environ.get(release_env, "current") return "/downloads/%s/%s/%s" % (release, download_name, sub) monkeypatch.setattr(downloads, "configure", fake_configure) monkeypatch.setattr(downloads, "get_path", fake_get_path) side_a = compare_models._resolve_side( "a", "public:pinned-release", label=None, args=_make_args()) side_b = compare_models._resolve_side( "b", "public", label=None, args=_make_args()) assert side_a["paths"]["affinity"].startswith( "/downloads/pinned-release/") assert side_b["paths"]["affinity"].startswith("/downloads/current/") assert release_env not in os.environ def test_resolve_side_explicit_label_overrides_default(): side = compare_models._resolve_side( "a", "public", label="baseline", args=_make_args()) assert side["label"] == "baseline" def test_resolve_side_publicy_path_is_not_public_sentinel(tmp_path): """A user-named directory like ``public_data/`` must not be mistaken for the public-install sentinel.""" run_dir = tmp_path / "public_data" run_dir.mkdir() side = compare_models._resolve_side( "a", str(run_dir), label=None, args=_make_args()) # Label derives from basename, not the literal "public" sentinel. assert side["label"] == "public_data" # And no role paths were resolved through the public-download lookup. for role, path in side["paths"].items(): if path is not None: assert path.startswith(str(tmp_path)), (role, path) def test_resolve_side_override_paths_win(tmp_path): override = tmp_path / "overridden_affinity" override.mkdir() args = _make_args(a_affinity_dir=str(override)) side = compare_models._resolve_side("a", "public", None, args) assert side["paths"]["affinity"] == str(override) def test_probe_run_dir_finds_training_via_manifest(tmp_path): """A run dir with manifest.csv inside models.unselected.combined is picked up for the training role even when nested under affinity/.""" target = tmp_path / "run" / "affinity" / "models.unselected.combined" target.mkdir(parents=True) (target / "manifest.csv").write_text( "model_name,config_json\nmodel_a,\"{}\"\n") resolved = compare_models._probe_run_dir( str(tmp_path / "run"), "training") assert resolved == str(target) def test_probe_run_dir_finds_affinity_via_allele_sequences(tmp_path): target = tmp_path / "run" / "affinity" / "models.combined" target.mkdir(parents=True) # The presence of allele_sequences.csv is one of the affinity probes. (target / "allele_sequences.csv").write_text("allele,sequence\n") resolved = compare_models._probe_run_dir( str(tmp_path / "run"), "affinity") assert resolved == str(target) def test_probe_run_dir_finds_presentation_via_weights_csv(tmp_path): target = tmp_path / "run" / "presentation" / "models" target.mkdir(parents=True) # Class1PresentationPredictor.save() writes weights.csv at the top level. (target / "weights.csv").write_text(",kind\npresentation_score,affinity\n") resolved = compare_models._probe_run_dir( str(tmp_path / "run"), "presentation") assert resolved == str(target) def test_probe_run_dir_finds_processing_root(tmp_path): target = tmp_path / "run" / "processing" / "models.selected.with_flanks" target.mkdir(parents=True) resolved = compare_models._probe_run_dir( str(tmp_path / "run"), "processing") assert resolved == str(tmp_path / "run" / "processing") def test_probe_run_dir_still_finds_legacy_presentation_models_combined(tmp_path): target = tmp_path / "run" / "presentation" / "models.combined" target.mkdir(parents=True) (target / "weights.csv").write_text(",kind\npresentation_score,affinity\n") resolved = compare_models._probe_run_dir( str(tmp_path / "run"), "presentation") assert resolved == str(target) def test_resolve_components_auto_picks_available(tmp_path): a_train = tmp_path / "a_train" a_train.mkdir() b_train = tmp_path / "b_train" b_train.mkdir() side_a = { "label": "a", "letter": "a", "spec": "a", "paths": {"training": str(a_train), "affinity": None, "presentation": None, "processing": None}, } side_b = { "label": "b", "letter": "b", "spec": "b", "paths": {"training": str(b_train), "affinity": None, "presentation": None, "processing": None}, } components = compare_models._resolve_components("auto", side_a, side_b) assert components == ["training_stats"] def test_resolve_components_auto_includes_processing(): side = { "label": "a", "letter": "a", "spec": "a", "paths": {"training": None, "affinity": None, "presentation": None, "processing": "/tmp/processing"}, } assert compare_models._resolve_components("auto", side, side) == ["processing"] def test_resolve_components_explicit_rejects_unavailable(): side_a = { "label": "a", "letter": "a", "spec": "a", "paths": {"training": "/tmp/x", "affinity": None, "presentation": None, "processing": None}, } side_b = { "label": "b", "letter": "b", "spec": "b", "paths": {"training": "/tmp/y", "affinity": None, "presentation": None, "processing": None}, } with pytest.raises(SystemExit, match="affinity"): compare_models._resolve_components( "affinity,training_stats", side_a, side_b) def test_resolve_components_bad_name_raises(): side = {"label": "a", "letter": "a", "spec": "a", "paths": {k: None for k in ("training", "affinity", "processing", "presentation")}} with pytest.raises(SystemExit): compare_models._resolve_components("nope", side, side) @pytest.mark.parametrize("include", ["affinity,affinity", "affinity,"]) def test_resolve_components_rejects_duplicate_or_empty_entries(include): side = { "label": "a", "letter": "a", "spec": "a", "paths": {"training": None, "affinity": "/tmp/affinity", "processing": None, "presentation": None}, } with pytest.raises(SystemExit): compare_models._resolve_components(include, side, side) # --------------------------------------------------------------------------- # Metric helpers # --------------------------------------------------------------------------- def test_metrics_handles_only_positives_or_only_negatives(): only_pos = compare_models._metrics([1, 1, 1], [0.1, 0.2, 0.3]) assert pandas.isna(only_pos["roc_auc"]) only_neg = compare_models._metrics([0, 0, 0], [0.1, 0.2, 0.3]) assert pandas.isna(only_neg["roc_auc"]) def test_metrics_ppv_at_n_basic(): # 4 hits, 4 misses. Scores rank hits first → PPV@4 = 1.0 y = [1, 1, 1, 1, 0, 0, 0, 0] s = [0.9, 0.8, 0.7, 0.6, 0.1, 0.2, 0.3, 0.4] m = compare_models._metrics(y, s) assert m["ppv_at_n"] == 1.0 assert m["roc_auc"] == 1.0 def test_metrics_ignores_nans_in_scores(): import numpy as np y = [1, 1, 0, 0] s = [0.9, np.nan, 0.1, np.nan] m = compare_models._metrics(y, s) assert m["n"] == 2 @pytest.mark.parametrize( "hits", [[], [1, 1], [0, 0]], ) def test_comparison_requires_positive_and_negative_rows(hits): with pytest.raises(ValueError, match="no valid binary comparison set"): compare_models._require_binary_comparison_rows( pandas.DataFrame({"hit": hits}), "test comparison") @pytest.mark.parametrize("hits", [[numpy.nan], [0, 1, 2]]) def test_comparison_rejects_invalid_hit_values(hits): with pytest.raises(ValueError, match="non-binary or missing hit"): compare_models._require_binary_comparison_rows( pandas.DataFrame({"hit": hits}), "test comparison") def test_comparison_rejects_incomplete_benchmark_rows(): frame = pandas.DataFrame({ "peptide": pandas.Series(["SIINFEKL", ""], dtype="string"), "hla": pandas.Series(["HLA-A*02:01", None], dtype="string"), "hit": [1, 0], }) with pytest.raises( ValueError, match=r"missing or blank required values.*peptide=1.*hla=1"): compare_models._require_complete_benchmark_rows( frame, ("peptide", "hla", "hit"), "Affinity benchmark") def test_affinity_supported_alleles_are_normalized_and_required(tmp_path): model_dir = tmp_path / "models" model_dir.mkdir() with pytest.raises(ValueError, match="missing its allele sequence registry"): compare_models._read_supported_alleles(str(model_dir)) pandas.DataFrame({ "allele": ["A0201", "HLA-B*07:02", "BoLA-NC*01:01"], "sequence": ["A" * 34, "B" * 34, "C" * 34], }).to_csv(model_dir / "allele_sequences.csv", index=False) assert compare_models._read_supported_alleles(str(model_dir)) == { "HLA-A*02:01", "HLA-B*07:02", } def test_affinity_per_allele_excludes_single_class_groups(): frame = pandas.DataFrame({ "hla": ["HLA-A*02:01"] * 30 + ["HLA-B*07:02"] * 30, "hit": [1] * 30 + [0, 1] * 15, "a_score": numpy.linspace(0, 1, 60), "b_score": numpy.linspace(1, 0, 60), }) result = compare_models._affinity_per_allele(frame) assert result.allele.tolist() == ["HLA-B*07:02"] @pytest.mark.parametrize( "modes", ["with_flanks,with_flanks", "with_flanks,"], ) def test_requested_modes_rejects_duplicate_or_empty_entries(modes): with pytest.raises(SystemExit): compare_models._requested_modes( modes, compare_models.PROCESSING_MODES, "--processing-modes", ) def test_compare_models_pct_change_is_numeric(): assert compare_models._pct_change(0.75, 0.50) == 50.0 assert numpy.isclose(compare_models._pct_change(0.25, 0.20), 25.0) assert pandas.isna(compare_models._pct_change(0.25, 0.0)) assert pandas.isna(compare_models._pct_change(0.25, numpy.nan)) def test_processing_metrics_use_shared_non_nan_rows(): scored = pandas.DataFrame({ "sample_id": ["s1"] * 6, "hla": ["HLA-A*02:01"] * 6, "peptide_len": [8, 8, 9, 9, 10, 10], "hit": [1, 0, 1, 0, 1, 0], "a_processing_score": [0.9, 0.1, 0.8, 0.2, 0.7, 0.3], "b_processing_score": [0.8, 0.2, 0.7, 0.3, numpy.nan, numpy.nan], }) shared_scored = compare_models._shared_score_rows(scored, "processing_score") per_sample = compare_models._presentation_per_sample( shared_scored, "processing_score") per_length, _per_length_per_sample = compare_models._presentation_per_length( shared_scored, "processing_score") summary = compare_models._presentation_mode_summary( shared_scored, per_sample, per_length, "with_flanks", "processing_score") assert per_sample.iloc[0]["n"] == 4 assert per_sample.iloc[0]["n_pos"] == 2 assert summary["n_rows"] == 4 assert summary["n_hits"] == 2 def test_processing_comparison_rejects_non_finite_scores(): scored = pandas.DataFrame({ "peptide": ["SIINFEKL", "AAAAAAAAA"], "a_processing_score": [0.9, numpy.nan], "b_processing_score": [0.8, 0.2], }) with pytest.raises( ValueError, match=( r"requires every benchmark peptide.*A \(candidate\): 1 " r"non-finite score" )): compare_models._require_finite_processing_scores( scored, mode="with_flanks", labels=("candidate", "baseline"), ) def test_affinity_comparison_rejects_invalid_predictions(): scored = pandas.DataFrame({ "peptide": ["SIINFEKL", "AAAAAAAAA", "SLYNTVATL"], "hla": ["HLA-A*02:01"] * 3, "a_pred": [20.0, numpy.nan, 0.0], "b_pred": [30.0, 40.0, 50.0], }) with pytest.raises( ValueError, match=( r"finite, positive IC50.*A \(candidate\): 2 invalid IC50" )): compare_models._require_valid_affinity_predictions( scored, labels=("candidate", "baseline")) def test_presentation_comparison_rejects_non_finite_scores(): scored = pandas.DataFrame({ "peptide": ["SIINFEKL", "AAAAAAAAA"], "a_presentation_score": [0.9, numpy.nan], "b_presentation_score": [0.8, 0.2], "a_presentation_percentile": [1.0, 2.0], "b_presentation_percentile": [1.5, 2.5], }) with pytest.raises( ValueError, match=( r"requires every benchmark row.*A \(candidate\) " r"presentation_score: 1 non-finite score" )): compare_models._require_finite_presentation_scores( scored, mode="with_flanks", labels=("candidate", "baseline"), ) def test_comparison_elastic_hints_follow_effective_batch_default( monkeypatch): captured = [] def fake_worker_pool( args, workload_name, workload_hints, start_method=None): del args assert start_method == "spawn" captured.append((workload_name, dict(workload_hints))) return None args = argparse.Namespace( backend="cpu", gpus=0, max_workers_per_gpu=1, num_jobs=1, ) benchmark = pandas.DataFrame({ "peptide": ["SIINFEKL"], "sample_id": ["sample"], "hla": ["HLA-A*02:01"], "hit": [1], "peptide_len": [8], "n_flank": ["NNN"], "c_flank": ["CCC"], }) monkeypatch.setattr( compare_models, "worker_pool_with_gpu_assignments_from_args", fake_worker_pool, ) monkeypatch.setattr( compare_models, "default_prediction_batch_is_auto", lambda: False) monkeypatch.setattr( compare_models, "_predict_affinity_chunk", lambda *_args, **_kwargs: (0, numpy.asarray([1.0])), ) monkeypatch.setattr( compare_models, "_predict_processing_chunk", lambda *_args, **_kwargs: (0, numpy.asarray([0.5])), ) monkeypatch.setattr( compare_models, "_predict_presentation_chunk", lambda *_args, **_kwargs: (0, pandas.DataFrame(index=[0])), ) compare_models._parallel_affinity_predict( args, "models", ["SIINFEKL"], ["HLA-A*02:01"], model_bytes=1) compare_models._parallel_processing_predict( args, "models", benchmark, "with_flanks", "candidate", model_bytes=1) compare_models._parallel_presentation_predict( args, "models", benchmark, "with_flanks", "candidate", model_bytes=1) assert [ (workload_name, hints["elastic_batch"]) for workload_name, hints in captured ] == [ (compare_models.WORKLOAD_AFFINITY_INFERENCE, False), (compare_models.WORKLOAD_PROCESSING_INFERENCE, True), (compare_models.WORKLOAD_PRESENTATION_INFERENCE, False), ] def test_processing_comparison_rejects_missing_requested_mode( monkeypatch, tmp_path): side_a_root = tmp_path / "side-a-processing" side_b_root = tmp_path / "side-b-processing" for mode in compare_models.PROCESSING_MODES: (side_a_root / ("models.selected.%s" % mode)).mkdir(parents=True) for mode in ("with_flanks", "no_flank"): (side_b_root / ("models.selected.%s" % mode)).mkdir(parents=True) side_a = { "label": "candidate", "paths": {"processing": str(side_a_root)}, } side_b = { "label": "baseline", "paths": {"processing": str(side_b_root)}, } args = _make_args(out=str(tmp_path / "comparison")) monkeypatch.setattr( compare_models, "_load_presentation_benchmark", lambda *_args: pytest.fail("benchmark must not load"), ) with pytest.raises( SystemExit, match=r"short_flanks: side B \(baseline\)"): compare_models._run_processing(side_a, side_b, args) assert not (tmp_path / "comparison" / "processing").exists() @pytest.mark.parametrize( ("hits", "hlas", "expected_error"), [ ([1, 0.5], ["HLA-A*02:01"] * 2, "non-binary or missing hit"), ( [1, 0], ["HLA-A*02:01", "HLA-B*07:02"], "sample_id.*multiple HLA genotypes", ), ], ) def test_presentation_benchmark_rejects_invalid_evaluation_rows( tmp_path, hits, hlas, expected_error): pandas.DataFrame({ "peptide": ["SIINFEKL", "SLYNTVATL"], "sample_id": ["sample"] * 2, "hla": hlas, "hit": hits, }).to_csv( tmp_path / "benchmark.multiallelic.train_excluded.test.csv.bz2", index=False, ) with pytest.raises(ValueError, match=expected_error): compare_models._load_presentation_benchmark(str(tmp_path), None) def test_presentation_benchmark_normalizes_equivalent_genotypes(tmp_path): pandas.DataFrame({ "peptide": ["SIINFEKL", "SLYNTVATL"], "sample_id": ["sample"] * 2, "hla": ["B0702 A0201", "HLA-A*02:01 HLA-B*07:02"], "hit": [1, 0], }).to_csv( tmp_path / "benchmark.multiallelic.train_excluded.test.csv.bz2", index=False, ) result = compare_models._load_presentation_benchmark(str(tmp_path), None) assert result.hla.unique().tolist() == ["HLA-A*02:01 HLA-B*07:02"] def test_presentation_benchmark_rechecks_classes_after_length_filter(tmp_path): pandas.DataFrame({ "peptide": ["SIINFEKL", "TOO-LONG-AND-INVALID"], "sample_id": ["sample"] * 2, "hla": ["HLA-A*02:01"] * 2, "hit": [1, 0], }).to_csv( tmp_path / "benchmark.multiallelic.train_excluded.test.csv.bz2", index=False, ) with pytest.raises(ValueError, match="after peptide-length filtering"): compare_models._load_presentation_benchmark(str(tmp_path), None) def test_affinity_metrics_handle_no_reportable_alleles(): """Sparse smoke-test inputs may leave every allele below reporting filters. The component should still write schema-valid empty tables. """ test = pandas.DataFrame({ "hla": ["HLA-A*02:01", "HLA-A*02:01"], "peptide": ["SIINFEKL", "SLYNTVATL"], "peptide_len": [8, 9], "hit": [1, 0], "a_score": [0.9, 0.1], "b_score": [0.8, 0.2], }) per_allele = compare_models._affinity_per_allele(test) assert per_allele.empty assert {"allele", "n", "n_pos", "roc_auc_diff"}.issubset( per_allele.columns) per_length, per_length_per_allele = compare_models._affinity_per_length(test) assert list(per_length["length"]) == [8, 9] assert list(per_length["n_alleles_reported"]) == [0, 0] assert per_length_per_allele.empty assert {"length", "allele", "n", "n_pos", "roc_auc_diff"}.issubset( per_length_per_allele.columns) summary = compare_models._affinity_summary(test, per_allele, per_length) assert summary["n_rows"] == 2 assert summary["n_alleles_reported"] == 0 assert summary["allele_count"]["a_better_roc_auc"] == 0 assert summary["allele_count"]["b_better_roc_auc"] == 0 def test_processing_summary_uses_processing_score(): scored = pandas.DataFrame({ "peptide": ["AAAAAAAA", "BBBBBBBB", "CCCCCCCC", "DDDDDDDD"], "sample_id": ["s1", "s1", "s2", "s2"], "hla": ["HLA-A*02:01"] * 4, "hit": [1, 0, 1, 0], "peptide_len": [8, 8, 8, 8], "a_processing_score": [0.9, 0.1, 0.8, 0.2], "b_processing_score": [0.6, 0.4, 0.7, 0.3], }) per_sample = compare_models._presentation_per_sample( scored, "processing_score") per_length, _ = compare_models._presentation_per_length( scored, "processing_score") summary = compare_models._presentation_mode_summary( scored, per_sample, per_length, "no_flank", "processing_score") row = compare_models._presentation_summary_row(summary) assert row["mode"] == "no_flank" assert row["a_macro_roc_auc"] == pytest.approx(1.0) assert row["b_macro_roc_auc"] == pytest.approx(1.0) def test_release_summary_rows_include_affinity_processing_presentation(): metric_summary = { "n_rows": 4, "n_hits": 2, "n_samples_reported": 2, "micro_pooled": { "a": {"roc_auc": 0.9, "pr_auc": 0.8, "ppv_at_n": 0.7}, "b": {"roc_auc": 0.8, "pr_auc": 0.7, "ppv_at_n": 0.6}, }, "macro_mean_over_samples": { "roc_auc": {"a": 0.91, "b": 0.81}, "pr_auc": {"a": 0.82, "b": 0.72}, "ppv_at_n": {"a": 0.73, "b": 0.63}, }, } headline = { "affinity": { "micro_pooled": { "a": {"roc_auc": 0.98, "pr_auc": 0.68, "ppv_at_n": 0.66}, "b": {"roc_auc": 0.97, "pr_auc": 0.65, "ppv_at_n": 0.64}, }, "macro_mean_over_alleles": { "roc_auc": {"a": 0.981, "b": 0.973}, "pr_auc": {"a": 0.683, "b": 0.657}, "ppv_at_n": {"a": 0.669, "b": 0.645}, }, }, "processing": { "modes": ["no_flank"], "summaries": {"no_flank": {"processing_score": metric_summary}}, }, "presentation": { "modes": ["with_flanks"], "summaries": {"with_flanks": {"presentation_score": metric_summary}}, }, } rows = compare_models._release_summary_rows( headline, ["affinity", "processing", "presentation"]) assert {row["component"] for row in rows} == { "affinity", "processing", "presentation"} assert any(row["metric"] == "AUROC" and row["average"] == "Macro" for row in rows) # --------------------------------------------------------------------------- # training_stats end-to-end # --------------------------------------------------------------------------- def _write_synthetic_manifest(target_dir, model_name, wall_time_sec, n_finetune_epochs): target_dir.mkdir(parents=True, exist_ok=True) fit_info = [{ "training_info": {"phase": "finetune", "fold_num": 0}, "time": wall_time_sec, "loss": [0.5] * n_finetune_epochs, "val_loss": [0.6] * n_finetune_epochs, }] config_json = json.dumps({ "hyperparameters": {"layer_sizes": [32]}, "fit_info": fit_info, }) df = pandas.DataFrame([{ "model_name": model_name, "config_json": config_json, }]) df.to_csv(target_dir / "manifest.csv", index=False) def test_training_stats_component_end_to_end(tmp_path): a_dir = tmp_path / "run_a" / "models.unselected.combined" _write_synthetic_manifest(a_dir, "model_a", wall_time_sec=120.0, n_finetune_epochs=10) b_dir = tmp_path / "run_b" / "models.unselected.combined" _write_synthetic_manifest(b_dir, "model_b", wall_time_sec=60.0, n_finetune_epochs=20) out_dir = tmp_path / "out" out_dir.mkdir() side_a = compare_models._resolve_side( "a", str(tmp_path / "run_a"), "a", _make_args()) side_b = compare_models._resolve_side( "b", str(tmp_path / "run_b"), "b", _make_args()) assert side_a["paths"]["training"].endswith("models.unselected.combined") headline = compare_models._run_training_stats( side_a, side_b, str(out_dir)) per_task = pandas.read_csv(out_dir / "training_stats" / "per_task.csv") summary = pandas.read_csv(out_dir / "training_stats" / "summary.csv") assert set(per_task["side"]) == {"a", "b"} assert set(summary["side"]) == {"a", "b"} # Side A wall-time was double B's. assert headline["side_a_finetune_total_wall_min"] == pytest.approx(2.0) assert headline["side_b_finetune_total_wall_min"] == pytest.approx(1.0) def test_training_stats_handles_colliding_labels(tmp_path): """If --a-label and --b-label collide, positional indexing keeps the headline pointing at the correct side.""" a_dir = tmp_path / "run_a" / "models.unselected.combined" _write_synthetic_manifest(a_dir, "model_a", wall_time_sec=120.0, n_finetune_epochs=10) b_dir = tmp_path / "run_b" / "models.unselected.combined" _write_synthetic_manifest(b_dir, "model_b", wall_time_sec=60.0, n_finetune_epochs=20) out_dir = tmp_path / "out" out_dir.mkdir() side_a = compare_models._resolve_side( "a", str(tmp_path / "run_a"), "collision", _make_args()) side_b = compare_models._resolve_side( "b", str(tmp_path / "run_b"), "collision", _make_args()) headline = compare_models._run_training_stats( side_a, side_b, str(out_dir)) # 2.0 vs 1.0 must map to A vs B by position, not by label lookup. assert headline["side_a_finetune_total_wall_min"] == pytest.approx(2.0) assert headline["side_b_finetune_total_wall_min"] == pytest.approx(1.0) def test_load_training_summary_rejects_bad_manifest_schema(tmp_path): """A manifest missing required columns should fail loudly with the missing column names + the manifest path, not AttributeError.""" bad_dir = tmp_path / "run" bad_dir.mkdir() # Manifest is missing 'config_json'. (bad_dir / "manifest.csv").write_text("model_name,something_else\nx,1\n") with pytest.raises(ValueError, match="config_json"): compare_models._load_training_summary(str(bad_dir)) def test_run_orchestrator_training_stats_only(tmp_path): """End-to-end smoke for run(): training_stats only, both sides synthetic. Catches regressions in is_public, _stamp, and the headline-by-label bugs all at once.""" for letter in ("a", "b"): target = tmp_path / ("run_" + letter) / "models.unselected.combined" _write_synthetic_manifest( target, "model_" + letter, wall_time_sec=180.0 if letter == "a" else 90.0, n_finetune_epochs=10, ) out_dir = tmp_path / "out" args = _make_args( a=str(tmp_path / "run_a"), b=str(tmp_path / "run_b"), a_label="candidate", b_label="baseline", out=str(out_dir), include="training_stats", ) assert compare_models.run(args) == 0 # Side files written. assert json.loads((out_dir / "side_a.json").read_text())["label"] == "candidate" assert json.loads((out_dir / "side_b.json").read_text())["label"] == "baseline" # Top-level summary mentions both labels. summary_md = (out_dir / "summary.md").read_text() assert "candidate" in summary_md assert "baseline" in summary_md assert "training_stats" in summary_md # Component CSVs landed. per_task = pandas.read_csv(out_dir / "training_stats" / "per_task.csv") assert set(per_task["side"]) == {"candidate", "baseline"} # --------------------------------------------------------------------------- # plot_model_comparison detection # --------------------------------------------------------------------------- def test_detect_available_components_empty(tmp_path): assert plot_model_comparison._detect_available_components(str(tmp_path)) == [] def test_compare_models_reset_removes_only_owned_outputs(tmp_path): for name in ("affinity", "processing", "plots", "worker_logs"): path = tmp_path / name path.mkdir() (path / "stale.txt").write_text("stale") (tmp_path / "release_summary.csv").write_text("stale") (tmp_path / "summary.pdf").write_bytes(b"stale") (tmp_path / "keep.txt").write_text("user-owned") compare_models._reset_comparison_outputs(str(tmp_path)) assert not (tmp_path / "affinity").exists() assert not (tmp_path / "processing").exists() assert not (tmp_path / "plots").exists() assert not (tmp_path / "worker_logs").exists() assert not (tmp_path / "release_summary.csv").exists() assert not (tmp_path / "summary.pdf").exists() assert (tmp_path / "keep.txt").read_text() == "user-owned" def test_compare_models_invalid_component_preserves_previous_outputs(tmp_path): for letter in ("a", "b"): target = tmp_path / ("run_" + letter) / "models.unselected.combined" _write_synthetic_manifest( target, "model_" + letter, wall_time_sec=10.0, n_finetune_epochs=1) out_dir = tmp_path / "out" stale = out_dir / "affinity" / "predictions.csv.bz2" stale.parent.mkdir(parents=True) stale.write_bytes(b"previous comparison") args = _make_args( a=str(tmp_path / "run_a"), b=str(tmp_path / "run_b"), out=str(out_dir), include="training_stats,affinity", ) with pytest.raises(SystemExit, match="affinity"): compare_models.run(args) assert stale.read_bytes() == b"previous comparison" def test_compare_models_rejects_output_that_contains_model_input(tmp_path): args = compare_models.make_parser().parse_args([ "--a", str(tmp_path), "--b", "public:2.2.0", "--out", str(tmp_path), ]) with pytest.raises(ValueError, match="cannot contain an input path"): compare_models._validate_comparison_output_location(args) def test_compare_models_rejects_output_that_contains_benchmark_input(tmp_path): data_dir = tmp_path / "processing" / "benchmarks" data_dir.mkdir(parents=True) args = compare_models.make_parser().parse_args([ "--a", "public:2.3.0", "--b", "public:2.2.0", "--data-dir", str(data_dir), "--out", str(tmp_path), ]) with pytest.raises(ValueError, match="--data-dir"): compare_models._validate_comparison_output_location(args) def test_compare_models_side_json_records_model_provenance(tmp_path): paths = {} for role, subdir in ( ("affinity", "affinity/models.combined"), ("presentation", "presentation/models")): path = tmp_path / subdir path.mkdir(parents=True) (path / "info.txt").write_text("package\tmhcflurry 2.3.0rc14\n") paths[role] = str(path) processing = tmp_path / "processing" / "models.selected.with_flanks" processing.mkdir(parents=True) (processing / "info.txt").write_text("package mhcflurry 2.3.0rc14\n") paths["processing"] = str(tmp_path / "processing") paths["training"] = None provenance = {"release": "2.3.0", "workflow_id": "run-123"} (tmp_path / "release_provenance.json").write_text(json.dumps(provenance)) result = compare_models._side_to_json({ "letter": "a", "spec": str(tmp_path), "label": "candidate", "paths": paths, }) assert result["model_package_versions"] == { "affinity": ["2.3.0rc14"], "presentation": ["2.3.0rc14"], "processing": ["2.3.0rc14"], } assert result["release_provenance"] == provenance def test_plot_model_comparison_rejects_missing_component_without_cleanup( tmp_path): plot_dir = tmp_path / "plots" paper_dir = plot_dir / "paper_figures" paper_dir.mkdir(parents=True) (plot_dir / "stale.pdf").write_bytes(b"stale") (paper_dir / "paper_figures.pdf").write_bytes(b"paper") summary = plot_dir / "summary.pdf" summary.write_bytes(b"summary") args = plot_model_comparison.make_parser().parse_args([ "--input", str(tmp_path), "--components", "affinity", "--summary-pdf", str(summary), ]) with pytest.raises(SystemExit, match="affinity"): plot_model_comparison.run(args) assert (plot_dir / "stale.pdf").read_bytes() == b"stale" assert (paper_dir / "paper_figures.pdf").read_bytes() == b"paper" assert summary.read_bytes() == b"summary" @pytest.mark.parametrize(("option", "relative_path", "is_directory"), [ ("--paper-figures-scores-dir", "saved_scores", True), ( "--paper-figures-multiallelic-predictions", "saved_predictions/multiallelic.csv", False, ), ( "--paper-figures-monoallelic-predictions", "saved_predictions/monoallelic.csv", False, ), ]) def test_plot_model_comparison_rejects_inputs_under_cleanup_tree( tmp_path, monkeypatch, option, relative_path, is_directory): plot_dir = tmp_path / "plots" input_path = plot_dir / relative_path if is_directory: input_path.mkdir(parents=True) sentinel = input_path / "input.csv" else: input_path.parent.mkdir(parents=True) sentinel = input_path sentinel.write_bytes(b"paper input") stale_plot = plot_dir / "stale.pdf" stale_plot.write_bytes(b"stale plot") monkeypatch.setattr( plot_model_comparison, "_apply_paper_style", lambda: None) args = plot_model_comparison.make_parser().parse_args([ "--input", str(tmp_path), option, str(input_path), ]) with pytest.raises(SystemExit, match="Refusing to delete input"): plot_model_comparison.run(args) assert sentinel.read_bytes() == b"paper input" assert stale_plot.read_bytes() == b"stale plot" def test_plot_model_comparison_rejects_symlink_to_input_under_cleanup_tree( tmp_path, monkeypatch): scores_dir = tmp_path / "plots" / "saved_scores" scores_dir.mkdir(parents=True) sentinel = scores_dir / "input.csv" sentinel.write_bytes(b"paper input") scores_link = tmp_path / "scores-link" try: scores_link.symlink_to(scores_dir, target_is_directory=True) except OSError as error: pytest.skip("symlinks unavailable: %s" % error) monkeypatch.setattr( plot_model_comparison, "_apply_paper_style", lambda: None) args = plot_model_comparison.make_parser().parse_args([ "--input", str(tmp_path), "--paper-figures-scores-dir", str(scores_link), ]) with pytest.raises(SystemExit, match="Refusing to delete input"): plot_model_comparison.run(args) assert sentinel.read_bytes() == b"paper input" def test_plot_model_comparison_rejects_paper_output_equal_to_plot_directory( tmp_path, monkeypatch): plot_dir = tmp_path / "plots" combined = plot_dir / "paper_figures.pdf" panel = plot_dir / "pdf" / "panel.pdf" panel.parent.mkdir(parents=True) combined.write_bytes(b"combined paper figures") panel.write_bytes(b"paper panel") monkeypatch.setattr( plot_model_comparison, "_apply_paper_style", lambda: None) args = plot_model_comparison.make_parser().parse_args([ "--input", str(tmp_path), "--paper-figures-out", str(plot_dir), ]) with pytest.raises(SystemExit, match="dedicated directory"): plot_model_comparison.run(args) assert combined.read_bytes() == b"combined paper figures" assert panel.read_bytes() == b"paper panel" @pytest.mark.parametrize( ("option", "relative_path"), [ ("--summary-pdf", "release_summary.csv"), ("--paper-figures-out", "affinity"), ], ) def test_plot_model_comparison_rejects_outputs_inside_comparison_inputs( tmp_path, monkeypatch, option, relative_path): comparison_dir = tmp_path / "comparison" target = comparison_dir / relative_path if option == "--summary-pdf": target.parent.mkdir(parents=True) target.write_bytes(b"comparison input") else: target.mkdir(parents=True) (target / "predictions.csv.bz2").write_bytes(b"comparison input") monkeypatch.setattr( plot_model_comparison, "_apply_paper_style", lambda: None) args = plot_model_comparison.make_parser().parse_args([ "--input", str(comparison_dir), option, str(target), ]) with pytest.raises(SystemExit, match="comparison input tree"): plot_model_comparison.run(args) if target.is_file(): assert target.read_bytes() == b"comparison input" else: assert (target / "predictions.csv.bz2").read_bytes() == b"comparison input" @pytest.mark.parametrize(("owner", "relative_path"), [ ("paper", "paper_figures.pdf"), ("plots", "affinity/roc.pdf"), ("plots", "paper/release_summary_macro.pdf"), ]) def test_plot_model_comparison_rejects_summary_pdf_output_collisions( tmp_path, monkeypatch, owner, relative_path): comparison_dir = tmp_path / "comparison" plot_dir = comparison_dir / "plots" paper_dir = tmp_path / "external-paper" summary = ( paper_dir if owner == "paper" else plot_dir ) / relative_path summary.parent.mkdir(parents=True) summary.write_bytes(b"generated figure") stale_plot = plot_dir / "stale.pdf" stale_plot.parent.mkdir(parents=True, exist_ok=True) stale_plot.write_bytes(b"stale plot") monkeypatch.setattr( plot_model_comparison, "_apply_paper_style", lambda: None) args = plot_model_comparison.make_parser().parse_args([ "--input", str(comparison_dir), "--paper-figures-out", str(paper_dir), "--summary-pdf", str(summary), ]) with pytest.raises(SystemExit, match="collides with command-owned"): plot_model_comparison.run(args) assert summary.read_bytes() == b"generated figure" assert stale_plot.read_bytes() == b"stale plot" def test_detect_available_components_finds_affinity(tmp_path): aff = tmp_path / "affinity" aff.mkdir() (aff / "predictions.csv.bz2").write_text("hit,a_score,b_score\n") assert "affinity" in plot_model_comparison._detect_available_components( str(tmp_path)) def test_detect_available_components_finds_processing(tmp_path): (tmp_path / "processing").mkdir() assert "processing" in plot_model_comparison._detect_available_components( str(tmp_path)) def test_read_optional_csv_tolerates_empty_summary(tmp_path): path = tmp_path / "summary_table.csv" path.write_text("\n") summary = plot_model_comparison._read_optional_csv(str(path)) assert summary.empty def test_detect_available_components_finds_presentation(tmp_path): (tmp_path / "presentation").mkdir() assert "presentation" in plot_model_comparison._detect_available_components( str(tmp_path)) @pytest.mark.parametrize("components", ["affinity,affinity", "affinity,"]) def test_plot_model_comparison_rejects_duplicate_or_empty_components( tmp_path, monkeypatch, components): affinity = tmp_path / "affinity" affinity.mkdir() (affinity / "summary.json").write_text("{}") monkeypatch.setattr( plot_model_comparison, "_apply_paper_style", lambda: None) args = plot_model_comparison.make_parser().parse_args([ "--input", str(tmp_path), "--components", components, ]) with pytest.raises(SystemExit): plot_model_comparison.run(args) def test_load_side_labels_falls_back_when_missing(tmp_path): labels = plot_model_comparison._load_side_labels(str(tmp_path)) assert labels == {"a": "Side A", "b": "Side B"} def test_load_side_labels_reads_json(tmp_path): (tmp_path / "side_a.json").write_text(json.dumps({"label": "candidate"})) (tmp_path / "side_b.json").write_text(json.dumps({"label": "baseline"})) labels = plot_model_comparison._load_side_labels(str(tmp_path)) assert labels == {"a": "candidate", "b": "baseline"} def test_roc_pr_plots_skip_single_class_slices(tmp_path): matplotlib = pytest.importorskip("matplotlib") matplotlib.use("Agg") import matplotlib.pyplot as plt from sklearn.metrics import ( average_precision_score, precision_recall_curve, roc_auc_score, roc_curve, ) y = numpy.asarray([1, 1, 1]) a_score = numpy.asarray([0.1, 0.2, 0.3]) b_score = numpy.asarray([numpy.nan, numpy.nan, numpy.nan]) roc_path = tmp_path / "roc.png" pr_path = tmp_path / "pr.png" plot_model_comparison._save_roc( plt, roc_curve, roc_auc_score, y, a_score, b_score, "a", "b", str(roc_path), "ROC") plot_model_comparison._save_pr( plt, precision_recall_curve, average_precision_score, y, a_score, b_score, "a", "b", str(pr_path), "PR") assert roc_path.is_file() assert pr_path.is_file() def test_comparison_curves_use_shared_finite_rows(): y, a_score, b_score = plot_model_comparison._shared_finite_curve_values( y=[1, 0, 1, 0], a_score=[0.9, numpy.nan, 0.8, 0.1], b_score=[numpy.nan, 0.2, 0.7, 0.3], ) assert y.tolist() == [1, 0] assert a_score.tolist() == [0.8, 0.1] assert b_score.tolist() == [0.7, 0.3] def test_comparison_curves_move_long_legends_below_axes(): figsize, kwargs = plot_model_comparison._curve_legend_layout( "MHCflurry 2.3.0", "MHCflurry no-additional-MS (train-excluded)", ) assert figsize == (4.2, 3.6) assert kwargs["loc"] == "upper center" assert kwargs["bbox_to_anchor"][1] < 0 def test_comparison_curves_keep_short_legends_inside_axes(): figsize, kwargs = plot_model_comparison._curve_legend_layout( "MHCflurry 2.3.0", "MHCflurry 2.2.0") assert figsize == (3.2, 3.0) assert kwargs == {} def test_release_summary_keeps_long_labels_clear_of_panels( tmp_path, monkeypatch): matplotlib = pytest.importorskip("matplotlib") matplotlib.use("Agg") import matplotlib.pyplot as plt pandas.DataFrame([ { "component": "affinity", "eval": "affinity", "metric": metric, "average": "Macro", "side_a": 0.8, "side_b": 0.7, "diff": 0.1, } for metric in ("AUROC", "AUPRC", "PPV@N") ]).to_csv(tmp_path / "release_summary.csv", index=False) saved = [] monkeypatch.setattr( plot_model_comparison, "_save_figure", lambda fig, path: saved.append((path, fig)), ) labels = { "a": "MHCflurry 2.3.0", "b": "MHCflurry no-additional-MS (train-excluded)", } plot_model_comparison._plot_release_summary( str(tmp_path), str(tmp_path / "paper"), labels) assert len(saved) == 2 accuracy_fig = saved[0][1] assert len(accuracy_fig.legends) == 1 assert all(ax.get_legend() is None for ax in accuracy_fig.axes) delta_fig = saved[1][1] assert [ax.get_ylabel() for ax in delta_fig.axes] == [ "Macro difference", "", ""] assert any(labels["b"] in text.get_text() for text in delta_fig.texts) for _, fig in saved: plt.close(fig) def test_plot_model_comparison_writes_paper_plots_from_summaries(tmp_path): pytest.importorskip("matplotlib") (tmp_path / "affinity").mkdir() (tmp_path / "processing").mkdir() (tmp_path / "processing" / "cohort.json").write_text(json.dumps({"policy": "matched"})) (tmp_path / "presentation").mkdir() (tmp_path / "side_a.json").write_text(json.dumps({"label": "new"})) (tmp_path / "side_b.json").write_text(json.dumps({"label": "public"})) pandas.DataFrame([ { "component": "affinity", "eval": "affinity", "metric": metric, "average": "Macro", "side_a": 0.8, "side_b": 0.7, "diff": 0.1, "pct_change": 10.0, "flank_mode": "", } for metric in ("AUROC", "AUPRC", "PPV@N") ]).to_csv(tmp_path / "release_summary.csv", index=False) pandas.DataFrame([ { "allele": "HLA-A*02:01", "n": 10, "n_pos": 2, "a_roc_auc": 0.90, "b_roc_auc": 0.85, "roc_auc_diff": 0.05, "a_pr_auc": 0.50, "b_pr_auc": 0.45, "pr_auc_diff": 0.05, "a_ppv_at_n": 0.40, "b_ppv_at_n": 0.30, "ppv_at_n_diff": 0.10, }, { "allele": "HLA-B*07:02", "n": 10, "n_pos": 2, "a_roc_auc": 0.80, "b_roc_auc": 0.75, "roc_auc_diff": 0.05, "a_pr_auc": 0.40, "b_pr_auc": 0.35, "pr_auc_diff": 0.05, "a_ppv_at_n": 0.30, "b_ppv_at_n": 0.20, "ppv_at_n_diff": 0.10, }, ]).to_csv(tmp_path / "affinity" / "per_allele.csv", index=False) pandas.DataFrame([ { "length": 8, "a_macro_roc_auc": 0.90, "b_macro_roc_auc": 0.80, "a_macro_pr_auc": 0.50, "b_macro_pr_auc": 0.40, "a_macro_ppv_at_n": 0.30, "b_macro_ppv_at_n": 0.20, }, { "length": 9, "a_macro_roc_auc": 0.91, "b_macro_roc_auc": 0.81, "a_macro_pr_auc": 0.51, "b_macro_pr_auc": 0.41, "a_macro_ppv_at_n": 0.31, "b_macro_ppv_at_n": 0.21, }, ]).to_csv(tmp_path / "affinity" / "per_length.csv", index=False) component_rows = [ { "sample_id": sample_id, "a_roc_auc": 0.90 + offset, "b_roc_auc": 0.85, "a_pr_auc": 0.50 + offset, "b_pr_auc": 0.45, "a_ppv_at_n": 0.40 + offset, "b_ppv_at_n": 0.35, } for sample_id, offset in (("s1", 0.00), ("s2", 0.01)) ] length_rows = [ { "length": length, "a_macro_roc_auc": 0.90, "b_macro_roc_auc": 0.85, "a_macro_pr_auc": 0.50, "b_macro_pr_auc": 0.45, "a_macro_ppv_at_n": 0.40, "b_macro_ppv_at_n": 0.35, } for length in (8, 9) ] for component, mode, score_kind in ( ("processing", "no_flank", "processing_score"), ("presentation", "with_flanks", "presentation_score")): pandas.DataFrame(component_rows).to_csv( tmp_path / component / ( "per_sample_%s_%s.csv" % (mode, score_kind)), index=False, ) pandas.DataFrame(length_rows).to_csv( tmp_path / component / ( "per_length_%s_%s.csv" % (mode, score_kind)), index=False, ) args = plot_model_comparison.make_parser().parse_args([ "--input", str(tmp_path), "--a-label", "MHCflurry 2.3.0", "--b-label", "MHCflurry 2.2.0", "--summary-pdf", str(tmp_path / "plots" / "figures.pdf"), ]) assert plot_model_comparison.run(args) == 0 for path in [ tmp_path / "plots" / "paper" / "release_summary_macro.png", tmp_path / "plots" / "paper" / "affinity_per_allele_scatter.png", tmp_path / "plots" / "paper" / "affinity_per_length_macro.png", tmp_path / "plots" / "paper" / "processing_per_sample_scatter.png", tmp_path / "plots" / "paper" / "presentation_per_length_macro.png", tmp_path / "plots" / "paper" / "presentation_per_length_macro.pdf", tmp_path / "plots" / "figures.pdf", ]: assert path.is_file() def test_summary_pdf_falls_back_from_corrupt_pdf(tmp_path): matplotlib = pytest.importorskip("matplotlib") matplotlib.use("Agg") import matplotlib.pyplot as plt plot_dir = tmp_path / "plots" paper_dir = plot_dir / "paper" paper_dir.mkdir(parents=True) (paper_dir / "bad.pdf").write_bytes(b"not a pdf") fig, ax = plt.subplots() ax.plot([0, 1], [0, 1]) fig.savefig(paper_dir / "fallback.png") plt.close(fig) out = plot_dir / "summary.pdf" plot_model_comparison._write_summary_pdf(plot_dir, out) assert out.is_file() def test_summary_pdf_png_fallback_excludes_paper_figures_by_default(tmp_path): plot_dir = tmp_path / "plots" paper_png = plot_dir / "paper_figures" / "panel.png" diagnostic_png = plot_dir / "affinity" / "panel.png" paper_png.parent.mkdir(parents=True) diagnostic_png.parent.mkdir(parents=True) paper_png.write_bytes(b"unused") diagnostic_png.write_bytes(b"unused") out = plot_dir / "summary.pdf" assert not plot_model_comparison._include_png_in_summary( paper_png, plot_dir, out, include_paper_figures=False) assert plot_model_comparison._include_png_in_summary( paper_png, plot_dir, out, include_paper_figures=True) assert plot_model_comparison._include_png_in_summary( diagnostic_png, plot_dir, out, include_paper_figures=False) def test_summary_pdf_uses_actual_paper_figures_dir(tmp_path): plot_dir = tmp_path / "plots" custom_dir = plot_dir / "custom_paper" combined = custom_dir / "paper_figures.pdf" individual = custom_dir / "pdf" / "panel.pdf" legacy_individual = plot_dir / "paper_2023" / "pdf" / "panel.pdf" diagnostic = plot_dir / "aaa" / "diagnostic.pdf" for path in [combined, individual, legacy_individual, diagnostic]: path.parent.mkdir(parents=True, exist_ok=True) path.write_bytes(b"unused") out = plot_dir / "summary.pdf" paths = plot_model_comparison._summary_pdf_paths( plot_dir, out, include_paper_figures=True, paper_figures_dir=custom_dir, ) assert paths == [combined, diagnostic] assert not plot_model_comparison._include_pdf_in_summary( individual, plot_dir, out, include_paper_figures=True, paper_figures_dir=custom_dir, ) assert not plot_model_comparison._include_pdf_in_summary( legacy_individual, plot_dir, out, include_paper_figures=True, paper_figures_dir=custom_dir, ) assert not plot_model_comparison._include_pdf_in_summary( combined, plot_dir, out, include_paper_figures=False, paper_figures_dir=custom_dir, ) def test_summary_pdf_can_include_external_paper_figures_dir(tmp_path): plot_dir = tmp_path / "plots" external_dir = tmp_path / "external_paper" combined = external_dir / "paper_figures.pdf" diagnostic = plot_dir / "paper" / "diagnostic.pdf" combined.parent.mkdir(parents=True) diagnostic.parent.mkdir(parents=True) combined.write_bytes(b"unused") diagnostic.write_bytes(b"unused") out = plot_dir / "summary.pdf" paths = plot_model_comparison._summary_pdf_paths( plot_dir, out, include_paper_figures=True, paper_figures_dir=external_dir, ) assert paths == [combined, diagnostic] def test_paper_figures_orients_configured_scores(): score = numpy.array([0.1, 2.0, 50.0]) for predictor in [ "mhcflurry_production", "mhcflurry_production_affinity", "netmhcpan4.ba_affinity", "netmhcpan4.el_rank"]: assert numpy.allclose( paper_figures._orient_prediction_score(predictor, score), -score) assert numpy.allclose( paper_figures._orient_prediction_score("mixmhcpred", score), score) for predictor in ["netmhcpan4.el", "netmhcpan4.2.el"]: assert numpy.allclose( paper_figures._orient_prediction_score(predictor, score), score) assert numpy.allclose( paper_figures._orient_prediction_score( "custom_rank", score, {"custom_rank": True}), score) with pytest.raises(ValueError, match="No score orientation configured"): paper_figures._orient_prediction_score("custom_rank", score) def test_paper_figures_score_predictions_uses_explicit_orientation(tmp_path): predictions = tmp_path / "predictions.csv" pandas.DataFrame([ { "sample_id": "sample1", "peptide": "AAAAAAAAK", "hit": 1, "mhcflurry_production": 20.0, "netmhcpan4.ba_affinity": 40.0, "netmhcpan4.2.el": 0.9, }, { "sample_id": "sample1", "peptide": "AAAAAAAAL", "hit": 0, "mhcflurry_production": 2000.0, "netmhcpan4.ba_affinity": 4000.0, "netmhcpan4.2.el": 0.1, }, ]).to_csv(predictions, index=False) scores = paper_figures.score_saved_prediction_table( predictions, kind="multiallelic", external_baselines=(("netmhcpan4.ba", "ba"),), ) all_scores = scores.loc[scores["length_label"] == "All"] assert all_scores.set_index("predictor").loc[ "mhcflurry_production", "auc"] == 1.0 assert all_scores.set_index("predictor").loc[ "netmhcpan4.ba", "auc"] == 1.0 assert all_scores.set_index("predictor").loc[ "netmhcpan4.2.el", "auc"] == 1.0 assert "percent_change_auc_ba" in scores.columns assert "pr_auc" in scores.columns assert "percent_change_pr_auc_ba" in scores.columns def test_paper_figures_score_predictions_uses_schema_not_numeric_dtype(tmp_path): predictions = tmp_path / "predictions.csv" pandas.DataFrame([ { "sample_id": "sample1", "peptide": "AAAAAAAAK", "peptide_num": 0, "hit": 1, "presentation_score": 0.9, }, { "sample_id": "sample1", "peptide": "AAAAAAAAL", "peptide_num": 1, "hit": 0, "presentation_score": 0.1, }, ]).to_csv(predictions, index=False) scores = paper_figures.score_saved_prediction_table( predictions, kind="multiallelic", external_baselines=(), ) assert set(scores["predictor"]) == {"presentation_score"} assert scores.loc[scores["length_label"] == "All", "auc"].iloc[0] == 1.0 def test_paper_figures_score_predictions_requires_recognized_or_explicit_score( tmp_path): predictions = tmp_path / "predictions.csv" pandas.DataFrame({ "sample_id": ["sample1", "sample1"], "hit": [1, 0], "peptide_num": [0, 1], }).to_csv(predictions, index=False) with pytest.raises(ValueError, match="no recognized predictor score columns"): paper_figures.score_saved_prediction_table( predictions, kind="multiallelic", external_baselines=(), ) def test_paper_figures_score_predictions_rejects_nonbinary_labels(tmp_path): predictions = tmp_path / "predictions.csv" pandas.DataFrame({ "sample_id": ["sample1", "sample1"], "hit": [1, 0.5], "presentation_score": [0.9, 0.1], }).to_csv(predictions, index=False) with pytest.raises(ValueError, match="non-binary or missing hit"): paper_figures.score_saved_prediction_table( predictions, kind="multiallelic", external_baselines=(), ) def test_paper_figures_score_predictions_uses_range_index_predictor_info( tmp_path): predictions = tmp_path / "predictions.csv" pandas.DataFrame([ { "sample_id": "sample1", "peptide": "AAAAAAAAK", "hit": 1, "custom_model": 0.9, }, { "sample_id": "sample1", "peptide": "AAAAAAAAL", "hit": 0, "custom_model": 0.1, }, ]).to_csv(predictions, index=False) predictor_info = pandas.DataFrame([{ "predictor": "custom_model", "higher_is_better": True, }]) scores = paper_figures.score_saved_prediction_table( predictions, kind="multiallelic", predictor_info=predictor_info, ) all_scores = scores.loc[scores["length_label"] == "All"] assert all_scores.set_index("predictor").loc["custom_model", "auc"] == 1.0 def test_paper_figures_percent_change_columns_are_numeric(): scores = pandas.DataFrame([ { "sample_id": "s1", "length_label": "All", "predictor": "candidate", "auc": 0.75, "ppv": 0.25, }, { "sample_id": "s1", "length_label": "All", "predictor": "baseline", "auc": 0.50, "ppv": 0.20, }, ]) result = paper_figures._add_percent_change_columns( scores, external_baselines=(("baseline", "base"),)) candidate = result.loc[result["predictor"] == "candidate"].iloc[0] assert candidate["percent_change_auc_base"] == 50.0 assert numpy.isclose(candidate["percent_change_ppv_base"], 25.0) def test_paper_figures_mean_ppv_small_uses_with_flanks_and_weighted_external(): matplotlib = pytest.importorskip("matplotlib") matplotlib.use("Agg") import matplotlib.pyplot as plt class CaptureWriter: def __init__(self): self.fig = None self.skipped = False def save(self, fig, _name, _family, note=""): self.fig = fig def skip(self, *_args, **_kwargs): self.skipped = True predictor_info = pandas.DataFrame([ {"predictor": "mhcflurry_production", "short": "BA", "color": "(0.1, 0.2, 0.3)"}, { "predictor": "presentation_with_flanks_processing_score", "short": "AP +flanks", "color": "(0.2, 0.3, 0.4)", }, { "predictor": "presentation_with_flanks_presentation_score", "short": "PS +flanks", "color": "(0.3, 0.4, 0.5)", }, { "predictor": "presentation_without_flanks_processing_score", "short": "AP -flanks", "color": "(0.8, 0.1, 0.1)", }, {"predictor": "netmhcpan4.ba", "short": "BA ext", "color": "(0.4, 0.4, 0.4)"}, {"predictor": "netmhcpan4.el", "short": "EL ext", "color": "(0.5, 0.5, 0.5)"}, ]).set_index("predictor") scores = pandas.DataFrame([ {"sample_id": "s1", "length": numpy.nan, "length_label": "All", "predictor": "mhcflurry_production", "ppv": 0.60}, {"sample_id": "s1", "length": numpy.nan, "length_label": "All", "predictor": "presentation_with_flanks_processing_score", "ppv": 0.50}, {"sample_id": "s1", "length": numpy.nan, "length_label": "All", "predictor": "presentation_with_flanks_presentation_score", "ppv": 0.80}, {"sample_id": "s1", "length": numpy.nan, "length_label": "All", "predictor": "presentation_without_flanks_processing_score", "ppv": 0.99}, {"sample_id": "s1", "length": numpy.nan, "length_label": "All", "predictor": "netmhcpan4.ba", "ppv": 0.10}, {"sample_id": "s2", "length": numpy.nan, "length_label": "All", "predictor": "netmhcpan4.ba", "ppv": 0.30}, {"sample_id": "s1", "length": numpy.nan, "length_label": "All", "predictor": "netmhcpan4.el", "ppv": 0.90}, ]) writer = CaptureWriter() predictors = paper_figures.PredictorConfig( candidate="mhcflurry_production", external_baselines=( ("netmhcpan4.ba", "ba"), ("netmhcpan4.el", "el"), ), preferred_predictors=(), monoallelic_panel_predictors=(), presentation_panel_predictors=(), presentation_panel_baselines=(), ) paper_figures._plot_mean_ppv_small( scores, predictor_info, recent_sample_ids=None, note="", name="test", writer=writer, predictors=predictors, ) assert not writer.skipped ax = writer.fig.axes[0] labels = [tick.get_text() for tick in ax.get_xticklabels()] heights = [patch.get_height() for patch in ax.patches] plt.close(writer.fig) assert labels == ["BA", "AP +flanks", "PS +flanks", "External tools"] assert numpy.allclose(heights, [0.60, 0.50, 0.80, 0.55]) def test_summary_pdf_png_fallback_handles_external_paper_dir(tmp_path): matplotlib = pytest.importorskip("matplotlib") matplotlib.use("Agg") import matplotlib.pyplot as plt plot_dir = tmp_path / "plots" external_dir = tmp_path / "external_paper" diagnostic_dir = plot_dir / "paper" for path in [external_dir, diagnostic_dir]: path.mkdir(parents=True) for path in [ external_dir / "external_panel.png", diagnostic_dir / "diagnostic_panel.png"]: fig, ax = plt.subplots() ax.plot([0, 1], [0, 1]) fig.savefig(path) plt.close(fig) out = plot_dir / "summary.pdf" plot_model_comparison._write_summary_pdf_from_pngs( plot_dir, out, include_paper_figures=True, paper_figures_dir=external_dir, ) assert out.is_file() def test_paper_figures_writes_available_2023_style_panels(tmp_path): artifacts = tmp_path / "artifacts" artifacts.mkdir() pandas.DataFrame([ { "predictor": "netmhcpan4.ba", "description": "NetMHCpan BA", "primary": True, "color": "(0.8, 0.2, 0.1)", "short": "NetMHCpan BA", "detail": "-", }, { "predictor": "netmhcpan4.el", "description": "NetMHCpan EL", "primary": True, "color": "(1.0, 0.6, 0.6)", "short": "NetMHCpan EL", "detail": "-", }, { "predictor": "mixmhcpred", "description": "MixMHCpred", "primary": True, "color": "(0.2, 0.5, 0.8)", "short": "MixMHCpred", "detail": "-", }, { "predictor": "mhcflurry_production", "description": "MHCflurry BA", "primary": True, "color": "(0.5, 0.4, 0.8)", "short": "MHCflurry BA", "detail": "-", }, { "predictor": "presentation_without_flanks_presentation_score", "description": "MHCflurry PS -flanks", "primary": True, "color": "(0.9, 0.6, 0.2)", "short": "PS -flanks", "detail": "-", }, { "predictor": "presentation_with_flanks_presentation_score", "description": "MHCflurry PS +flanks", "primary": True, "color": "(0.3, 0.7, 0.2)", "short": "PS +flanks", "detail": "-", }, { "predictor": "presentation_without_flanks_processing_score", "description": "MHCflurry AP -flanks", "primary": False, "color": "(0.1, 0.4, 0.2)", "short": "AP -flanks", "detail": "-", }, { "predictor": "presentation_with_flanks_processing_score", "description": "MHCflurry AP +flanks", "primary": False, "color": "(0.8, 0.5, 0.7)", "short": "AP +flanks", "detail": "-", }, ]).to_csv(artifacts / "predictor_info.csv", index=False) predictors = [ "netmhcpan4.ba", "netmhcpan4.el", "mixmhcpred", "mhcflurry_production_affinity", "presentation_without_flanks_presentation_score", "presentation_with_flanks_presentation_score", "presentation_without_flanks_processing_score", "presentation_with_flanks_processing_score", ] rows = [] for sample_index, sample_id in enumerate(["sample1", "sample2", "sample3"]): for length_label, length in [("All", numpy.nan), ("8-mer", 8), ("9-mer", 9)]: for predictor_index, predictor in enumerate(predictors): base = 0.55 + sample_index * 0.02 + predictor_index * 0.01 if length_label != "All": base -= 0.03 rows.append({ "sample_id": sample_id, "length": length, "length_label": length_label, "predictor": predictor, "ppv": min(0.95, base), "auc": min(0.99, base + 0.15), "percent_change_auc_ba": predictor_index + 1.0, "percent_change_ppv_ba": predictor_index + 2.0, "percent_change_auc_el": predictor_index + 3.0, "percent_change_ppv_el": predictor_index + 4.0, "percent_change_auc_mixmhcpred": predictor_index + 5.0, "percent_change_ppv_mixmhcpred": predictor_index + 6.0, }) pandas.DataFrame(rows).to_csv( artifacts / "accuracy_scores.multiallelic.csv", index=False) args = paper_figures.make_parser().parse_args([ "--scores-dir", str(artifacts), "--out", str(tmp_path / "paper"), "--formats", "svg,pdf,png", ]) assert paper_figures.run(args) == 0 for path in [ tmp_path / "paper" / "svg" / "fig.3_scores_plots_multiallelic.scatter.auc.ba.svg", tmp_path / "paper" / "pdf" / "fig.3_scores_plots_multiallelic.scatter.ppv.presentation.pdf", tmp_path / "paper" / "png" / "fig.3_scores_plots_multiallelic.bar.auc.presentation.png", tmp_path / "paper" / "paper_figures.pdf", tmp_path / "paper" / "manifest.csv", tmp_path / "paper" / "missing_inputs.md", ]: assert path.is_file() manifest = pandas.read_csv(tmp_path / "paper" / "manifest.csv") assert ( manifest["figure"] == "fig.3_scores_plots_multiallelic.scatter.auc.ba" ).any() assert ( manifest["figure"] == "fig.3_scores_plots_monoallelic.scatter.auc.monoallelic.ba" ).any() assert "skipped" in set(manifest["status"]) assert "failed" not in set(manifest["status"]) def test_paper_figures_derives_scores_from_saved_predictions(tmp_path): pytest.importorskip("matplotlib") scores_dir = tmp_path / "scores" scores_dir.mkdir() rows = [] peptides = { 8: ("AAAAAAAK", "AAAAAAAL", "AAAAAAAM", "AAAAAAAN"), 9: ("AAAAAAAAK", "AAAAAAAAL", "AAAAAAAAM", "AAAAAAAAN"), } for sample_id, sample_offset in (("s1", 0), ("s2", 5)): for length, peptide_values in peptides.items(): for row_index, peptide in enumerate(peptide_values): hit = 1 if row_index < 2 else 0 good = 0.90 - sample_offset * 0.01 - row_index * 0.02 bad = 0.20 + row_index * 0.02 rows.append({ "sample_id": sample_id, "sample_group": "MULTIALLELIC-RECENT", "peptide": peptide, "length": length, "hit": hit, "netmhcpan4.ba": 20.0 if hit else 2000.0, "netmhcpan4.el": 0.10 if hit else 10.0, "mixmhcpred": good - 0.05 if hit else bad + 0.05, "mhcflurry_production": 30.0 if hit else 3000.0, "presentation_without_flanks_presentation_score": ( good if hit else bad), "presentation_with_flanks_presentation_score": ( good + 0.01 if hit else bad), "presentation_without_flanks_processing_score": ( good - 0.03 if hit else bad), "presentation_with_flanks_processing_score": ( good - 0.02 if hit else bad), }) predictions = scores_dir / "benchmark.multiallelic.csv" pandas.DataFrame(rows).to_csv(predictions, index=False) args = paper_figures.make_parser().parse_args([ "--scores-dir", str(scores_dir), "--multiallelic-predictions", str(predictions), "--out", str(tmp_path / "paper"), "--formats", "png", "--combined-pdf", "none", ]) assert paper_figures.run(args) == 0 manifest = pandas.read_csv(tmp_path / "paper" / "manifest.csv") assert ( manifest["figure"] == "fig.3_scores_plots_multiallelic.scatter.auc.ba" ).any() assert ( tmp_path / "paper" / "png" / "fig.3_scores_plots_multiallelic.scatter.auc.ba.png" ).is_file() def test_paper_figures_sample_groups_use_explicit_predictions(tmp_path): class CaptureWriter: def __init__(self): self.rows = [] def fail(self, family, figure, note): self.rows.append({ "family": family, "figure": figure, "status": "failed", "note": note, }) def skip(self, family, figure, missing, note): self.rows.append({ "family": family, "figure": figure, "status": "skipped", "missing": missing, "note": note, }) scores_dir = tmp_path / "scores" predictions_dir = tmp_path / "predictions" scores_dir.mkdir() predictions_dir.mkdir() predictions = predictions_dir / "benchmark.multiallelic.csv" pandas.DataFrame([ { "sample_id": "recent", "sample_group": "MULTIALLELIC-RECENT", "peptide": "SIINFEKL", "hit": 1, "mhcflurry_production": 0.9, }, { "sample_id": "old", "sample_group": "MULTIALLELIC-OLD", "peptide": "SLYNTVATL", "hit": 0, "mhcflurry_production": 0.1, }, ]).to_csv(predictions, index=False) writer = CaptureWriter() args = paper_figures.make_parser().parse_args([ "--scores-dir", str(scores_dir), "--multiallelic-predictions", str(predictions), "--out", str(tmp_path / "paper"), ]) inputs = paper_figures._resolve_figure_inputs(args, writer) sample_ids = paper_figures._read_sample_group_ids(args, inputs, writer) assert sample_ids == {"recent"} assert writer.rows == [] def test_paper_figures_uses_current_comparison_when_scores_absent(tmp_path): pytest.importorskip("matplotlib") comparison = tmp_path / "comparison" (comparison / "affinity").mkdir(parents=True) (comparison / "side_a.json").write_text(json.dumps({"label": "current"})) (comparison / "side_b.json").write_text(json.dumps({"label": "public"})) pandas.DataFrame([ { "allele": "HLA-A*02:01", "n": 40, "n_pos": 10, "a_roc_auc": 0.95, "b_roc_auc": 0.90, "a_ppv_at_n": 0.80, "b_ppv_at_n": 0.70, }, { "allele": "HLA-B*07:02", "n": 40, "n_pos": 10, "a_roc_auc": 0.91, "b_roc_auc": 0.88, "a_ppv_at_n": 0.76, "b_ppv_at_n": 0.72, }, ]).to_csv(comparison / "affinity" / "per_allele.csv", index=False) args = paper_figures.make_parser().parse_args([ "--comparison-dir", str(comparison), "--out", str(tmp_path / "paper"), "--formats", "png", "--combined-pdf", "none", ]) assert paper_figures.run(args) == 0 manifest = pandas.read_csv(tmp_path / "paper" / "manifest.csv") assert ( manifest["figure"] == "fig.1_model_selection_predictor_accuracy.scores.hla_a" ).any() assert ( manifest["figure"] == "fig.3_scores_plots_monoallelic.scatter.auc.monoallelic.ba" ).any() def test_current_comparison_labels_counts_as_evaluation_peptides( tmp_path): pytest.importorskip("matplotlib") import matplotlib.pyplot as plt comparison = tmp_path / "comparison" (comparison / "affinity").mkdir(parents=True) pandas.DataFrame([{ "allele": "HLA-A*02:01", "n": 40, "n_pos": 10, "a_roc_auc": 0.95, "b_roc_auc": 0.90, "a_ppv_at_n": 0.80, "b_ppv_at_n": 0.70, }]).to_csv(comparison / "affinity" / "per_allele.csv", index=False) class CaptureWriter: def __init__(self): self.xlabels = {} self.figure_legend_counts = {} self.axes_legend_counts = {} self.minor_formatter_names = {} def save(self, fig, name, _family, note=""): self.xlabels[name] = [ax.get_xlabel() for ax in fig.axes] self.figure_legend_counts[name] = len(fig.legends) self.axes_legend_counts[name] = sum( ax.get_legend() is not None for ax in fig.axes) self.minor_formatter_names[name] = [ type(ax.xaxis.get_minor_formatter()).__name__ for ax in fig.axes ] plt.close(fig) def skip(self, *_args, **_kwargs): pass writer = CaptureWriter() inputs = paper_figures.FigureInputs( scores_dir=tmp_path / "scores", comparison_dir=comparison, run_dir=None, multiallelic_predictions=None, monoallelic_predictions=None, ) paper_figures._generate_model_selection_figures(inputs, writer) xlabels = writer.xlabels[ "fig.1_model_selection_predictor_accuracy.scores.hla_a"] assert "Evaluation peptides" in xlabels assert "Training peptides" not in xlabels figure_name = "fig.1_model_selection_predictor_accuracy.scores.hla_a" assert writer.figure_legend_counts[figure_name] == 1 assert writer.axes_legend_counts[figure_name] == 0 assert "NullFormatter" in writer.minor_formatter_names[figure_name] def test_current_model_information_uses_only_final_manifests(tmp_path): run_dir = tmp_path / "run" final_paths = [ run_dir / "affinity" / "models.combined" / "manifest.csv", run_dir / "processing" / "models.selected.with_flanks" / "manifest.csv", run_dir / "processing" / "models.selected.no_flank" / "manifest.csv", ] stale_paths = [ run_dir / "affinity" / "models.unselected.combined" / "manifest.csv", run_dir / "processing" / "models.unselected.with_flanks" / "manifest.csv", run_dir / "presentation" / "models" / "affinity_predictor" / "manifest.csv", run_dir / "scratch" / "manifest.csv", ] for path in final_paths + stale_paths: path.parent.mkdir(parents=True, exist_ok=True) path.write_text("model_name\nmodel_1\n") presentation_weights = run_dir / "presentation" / "models" / "weights.csv" presentation_weights.parent.mkdir(parents=True, exist_ok=True) presentation_weights.write_text( ",intercept\nwith_flanks,1.0\nwithout_flanks,2.0\n") assert set(paper_figures._final_model_manifest_paths(run_dir)) == set( final_paths) counts = paper_figures._current_model_counts(run_dir).set_index( "component")["models"].to_dict() assert counts == { "Affinity": 1, "Presentation": 2, "Processing no flank": 1, "Processing with flanks": 1, } def test_paper_figures_rerender_clears_command_owned_outputs(tmp_path): pytest.importorskip("matplotlib") artifacts = tmp_path / "artifacts" artifacts.mkdir() out = tmp_path / "paper" for path in [ out / "svg" / "old.svg", out / "pdf" / "old.pdf", out / "png" / "old.png", out / "assets" / "old.svg"]: path.parent.mkdir(parents=True, exist_ok=True) path.write_bytes(b"stale") for path in [ out / "paper_figures.pdf", out / "old_custom_combined.pdf", out / "manifest.csv", out / "missing_inputs.md"]: path.parent.mkdir(parents=True, exist_ok=True) path.write_bytes(b"stale") unrelated = out / "README.keep" unrelated.write_text("user file") args = paper_figures.make_parser().parse_args([ "--artifacts-dir", str(artifacts), "--out", str(out), "--formats", "png", "--combined-pdf", "none", ]) assert paper_figures.run(args) == 0 assert not (out / "svg").exists() assert not (out / "pdf").exists() assert not (out / "png" / "old.png").exists() assert not (out / "assets").exists() assert not (out / "paper_figures.pdf").exists() assert not (out / "old_custom_combined.pdf").exists() assert pandas.read_csv(out / "manifest.csv").shape[0] > 0 assert unrelated.read_text() == "user file" def test_paper_figures_rejects_scores_output_overlap_without_cleanup(tmp_path): out = tmp_path / "paper" source_asset = out / "assets" / "source.svg" source_pdf = out / "source.pdf" source_asset.parent.mkdir(parents=True) source_asset.write_bytes(b"source asset") source_pdf.write_bytes(b"source pdf") args = paper_figures.make_parser().parse_args([ "--scores-dir", str(out), "--out", str(out), ]) with pytest.raises(SystemExit, match="would delete input path"): paper_figures.run(args) assert source_asset.read_bytes() == b"source asset" assert source_pdf.read_bytes() == b"source pdf" assert not (out / "manifest.csv").exists() def test_paper_figures_rejects_prediction_in_cleanup_tree(tmp_path): scores = tmp_path / "scores" scores.mkdir() out = tmp_path / "paper" prediction = out / "assets" / "predictions.csv" prediction.parent.mkdir(parents=True) prediction.write_text("sample_id,hit,score\ns1,1,0.9\n") args = paper_figures.make_parser().parse_args([ "--scores-dir", str(scores), "--multiallelic-predictions", str(prediction), "--out", str(out), ]) with pytest.raises(SystemExit, match="would delete input path"): paper_figures.run(args) assert prediction.is_file() assert not (out / "manifest.csv").exists() def test_paper_figures_monoallelic_scatter_uses_all_length_rows(monkeypatch): captured = {} def fake_scatter(pivot, *_args, **_kwargs): captured["pivot"] = pivot monkeypatch.setattr( paper_figures, "_plot_scatter_grid_from_pivot", fake_scatter) scores = pandas.DataFrame([ { "allele": "HLA-A*02:01", "length": numpy.nan, "length_label": "All", "predictor": "candidate", "auc": 0.90, }, { "allele": "HLA-A*02:01", "length": numpy.nan, "length_label": "All", "predictor": "baseline", "auc": 0.80, }, { "allele": "HLA-A*02:01", "length": 8, "length_label": "8-mer", "predictor": "candidate", "auc": 0.10, }, { "allele": "HLA-A*02:01", "length": 8, "length_label": "8-mer", "predictor": "baseline", "auc": 0.20, }, ]) predictors = paper_figures.PredictorConfig( candidate="candidate", external_baselines=(("baseline", "baseline"),), preferred_predictors=("candidate", "baseline"), monoallelic_panel_predictors=(), presentation_panel_predictors=("candidate",), presentation_panel_baselines=("baseline",), ) class Writer: def skip(self, *args): raise AssertionError("unexpected skip: %r" % (args,)) paper_figures._plot_monoallelic_scatter( scores, pandas.DataFrame(), "auc", "AUC", 100, "mono", Writer(), predictors, preferred_candidate="candidate", ) pivot = captured["pivot"] assert pivot.loc["HLA-A*02:01", "candidate"] == 0.90 assert pivot.loc["HLA-A*02:01", "baseline"] == 0.80 assert len(pivot) == 1 def test_paper_figures_monoallelic_scatter_paginates_all_candidates( monkeypatch): captured = [] def fake_scatter( _pivot, _predictor_info, candidates, _metric_label, _max_points, name, _family, _writer, _predictors, baselines=None): captured.append((tuple(candidates), name, baselines)) monkeypatch.setattr( paper_figures, "_plot_scatter_grid_from_pivot", fake_scatter) candidates = tuple("candidate_%d" % index for index in range(5)) rows = [] for predictor in candidates + ("public",): rows.append({ "allele": "HLA-A*02:01", "length": numpy.nan, "length_label": "All", "predictor": predictor, "auc": 0.8, }) predictors = paper_figures.PredictorConfig( candidate=candidates[0], external_baselines=(("public", "public"),), preferred_predictors=candidates + ("public",), monoallelic_panel_predictors=candidates, presentation_panel_predictors=(), presentation_panel_baselines=(), ) paper_figures._plot_monoallelic_scatter( pandas.DataFrame(rows), pandas.DataFrame(), "auc", "AUC", 100, "mono", object(), predictors) assert [item[0] for item in captured] == [candidates[:4], candidates[4:]] assert [item[1] for item in captured] == [ "mono.page_01", "mono.page_02"] def test_paper_figures_prediction_scoring_drops_invalid_hit_rows(): group = pandas.DataFrame({ "sample_id": ["s1", "s1", "s1", "s1"], "peptide": ["AAAA", "BBBB", "CCCC", "DDDD"], "hit": [1, 0, numpy.nan, "bad"], "candidate": [0.9, 0.1, 1.0, 1.0], }) rows = paper_figures._scores_for_prediction_group( group, index_column="sample_id", group_value="s1", length=None, length_label="All", predictor_columns=["candidate"], predictor_orientations={"candidate": True}, ) assert rows[0]["auc"] == 1.0 assert rows[0]["ppv"] == 1.0 def test_paper_figures_prediction_scoring_uses_shared_finite_rows(): group = pandas.DataFrame({ "sample_id": ["s1"] * 4, "peptide": ["AAAA", "BBBB", "CCCC", "DDDD"], "hit": [1, 1, 0, 0], # On all rows candidate has AUC=.75 and PPV=.5. The row baseline # cannot score is a difficult positive; both predictors must use the # resulting shared three-row subset, where both metrics are 1. "candidate": [0.9, 0.1, 0.8, 0.0], "baseline": [0.9, numpy.nan, 0.2, 0.1], }) rows = paper_figures._scores_for_prediction_group( group, index_column="sample_id", group_value="s1", length=None, length_label="All", predictor_columns=["candidate", "baseline"], predictor_orientations={"candidate": True, "baseline": True}, ) assert {row["predictor"] for row in rows} == {"candidate", "baseline"} assert {row["n"] for row in rows} == {3} assert {row["n_pos"] for row in rows} == {1} assert {row["auc"] for row in rows} == {1.0} assert {row["ppv"] for row in rows} == {1.0} def test_paper_figures_monoallelic_scoring_prefers_allele(tmp_path): predictions = tmp_path / "predictions.csv" pandas.DataFrame([ { "sample_id": "shared", "allele": "HLA-A*02:01", "peptide": "AAAAAAAAA", "hit": 1, "candidate": 0.9, }, { "sample_id": "shared", "allele": "HLA-A*02:01", "peptide": "AAAAAAAAB", "hit": 0, "candidate": 0.1, }, { "sample_id": "shared", "allele": "HLA-B*07:02", "peptide": "BBBBBBBBB", "hit": 1, "candidate": 0.8, }, { "sample_id": "shared", "allele": "HLA-B*07:02", "peptide": "BBBBBBBBA", "hit": 0, "candidate": 0.2, }, ]).to_csv(predictions, index=False) predictor_info = pandas.DataFrame([{ "predictor": "candidate", "higher_is_better": True, }]).set_index("predictor", drop=False) scores = paper_figures.score_saved_prediction_table( predictions, kind="monoallelic", predictor_info=predictor_info) all_scores = scores.loc[ (scores["length_label"] == "All") & (scores["predictor"] == "candidate") ] assert set(all_scores["allele"]) == {"HLA-A*02:01", "HLA-B*07:02"} assert set(all_scores["auc"]) == {1.0} assert len(all_scores) == 2 def test_paper_figures_ppv_uses_tie_breaker(): # File-order-stable sorting would pick the two hit rows first. The explicit # tie breaker randomizes equal-score ordering deterministically. ppv = paper_figures._ppv_at_n( numpy.array([1, 1, 0, 0]), numpy.array([0.5, 0.5, 0.5, 0.5]), 2, tie_breaker=numpy.array([0.8, 0.9, 0.1, 0.2]), ) assert ppv == 0.0 def test_paper_figures_resolves_run_dir_for_named_comparison_dir(tmp_path): run_dir = tmp_path / "run" comparison_dir = run_dir / "comparison" comparison_dir.mkdir(parents=True) (run_dir / "processing").mkdir() assert paper_figures._resolve_run_dir(comparison_dir) == run_dir def test_paper_figures_external_baseline_geometry_is_configurable(tmp_path): matplotlib = pytest.importorskip("matplotlib") matplotlib.use("Agg") import matplotlib.pyplot as plt predictor_info = pandas.DataFrame([ { "predictor": predictor, "short": predictor.replace("_", " "), "description": predictor, "color": "(0.5, 0.4, 0.8)", } for predictor in ("candidate", "baseline_a", "baseline_b", "baseline_c") ]).set_index("predictor") scores = pandas.DataFrame([ { "sample_id": sample_id, "length_label": "All", "predictor": predictor, "auc": value, "ppv": value - 0.1, "percent_change_auc_a": 1.0, "percent_change_auc_b": 2.0, } for sample_id, offset in (("s1", 0.0), ("s2", 0.02)) for predictor, value in ( ("candidate", 0.75 + offset), ("baseline_a", 0.70 + offset), ("baseline_b", 0.72 + offset), ) ]) predictors = paper_figures.PredictorConfig( candidate="candidate", external_baselines=( ("baseline_a", "a"), ("baseline_b", "b"), ("baseline_c", "c"), ), preferred_predictors=( "candidate", "baseline_a", "baseline_b", "baseline_c"), monoallelic_panel_predictors=(), presentation_panel_predictors=("candidate",), presentation_panel_baselines=("baseline_a", "baseline_b", "baseline_c"), ) saved_axes = {} class CaptureWriter: def save(self, fig, name, _family, note=""): saved_axes[name] = len(fig.axes) plt.close(fig) def skip(self, _family, name, _missing, _note): saved_axes[name] = "skipped" writer = CaptureWriter() paper_figures._apply_paper_style() paper_figures._plot_external_scatter_triptych( scores, predictor_info, "auc", "AUC", "external", 100, writer, predictors) paper_figures._plot_percent_change_by_length( scores, predictor_info, "auc", "AUC", "by_length", writer, predictors) paper_figures._plot_percent_change_bars( scores, predictor_info, "auc", "AUC", "bars", writer, predictors) paper_figures._plot_scatter_triptych_from_pivot( paper_figures._pivot_all_lengths(scores, "auc"), predictor_info, "candidate", "AUC", 100, "pivot", "test", writer, predictors, ) assert saved_axes == { "external": 2, "by_length": 2, "bars": 2, "pivot": 2, } def test_paper_figures_render_failure_returns_nonzero( tmp_path, monkeypatch): scores_dir = tmp_path / "scores" scores_dir.mkdir() def fail_render(*_args, **_kwargs): raise RuntimeError("render exploded") monkeypatch.setattr( paper_figures, "_generate_multiallelic_figures", fail_render) args = paper_figures.make_parser().parse_args([ "--scores-dir", str(scores_dir), "--out", str(tmp_path / "paper"), "--formats", "png", "--combined-pdf", "none", ]) assert paper_figures.run(args) == 2 manifest = pandas.read_csv(tmp_path / "paper" / "manifest.csv") failed = manifest.loc[manifest.status == "failed"] assert len(failed) == 1 assert failed.iloc[0]["family"] == "multiallelic" assert "render exploded" in failed.iloc[0]["note"] def test_paper_figures_bad_predictor_config_writes_manifest(tmp_path): artifacts = tmp_path / "artifacts" artifacts.mkdir() args = paper_figures.make_parser().parse_args([ "--artifacts-dir", str(artifacts), "--out", str(tmp_path / "paper"), "--external-baselines", "", ]) assert paper_figures.run(args) == 2 manifest = pandas.read_csv(tmp_path / "paper" / "manifest.csv") assert manifest.iloc[0]["family"] == "configuration" assert manifest.iloc[0]["figure"] == "predictor_config" assert manifest.iloc[0]["status"] == "failed" def test_paper_figures_bad_predictor_config_preserves_existing_suite(tmp_path): artifacts = tmp_path / "artifacts" artifacts.mkdir() out_dir = tmp_path / "paper" out_dir.mkdir() combined = out_dir / "paper_figures.pdf" manifest = out_dir / "manifest.csv" combined.write_bytes(b"existing suite") manifest.write_text("existing manifest\n") args = paper_figures.make_parser().parse_args([ "--artifacts-dir", str(artifacts), "--out", str(out_dir), "--external-baselines", "", ]) assert paper_figures.run(args) == 2 assert combined.read_bytes() == b"existing suite" assert manifest.read_text() == "existing manifest\n" @pytest.mark.parametrize("formats", ["pdf,pdf", "pdf,"]) def test_paper_figures_rejects_duplicate_or_empty_formats(formats): with pytest.raises(ValueError): paper_figures._parse_formats(formats) @pytest.mark.parametrize("reserved_name", [ "manifest.csv", "missing_inputs.md", "pdf", "assets", "pdf/figure.pdf", ]) def test_paper_figures_rejects_combined_pdf_metadata_collisions( tmp_path, reserved_name): with pytest.raises(SystemExit, match="collides"): paper_figures._validate_paper_output_paths( tmp_path, tmp_path / reserved_name) def test_paper_figures_predictor_config_parser(): args = paper_figures.make_parser().parse_args([ "--artifacts-dir", "artifacts", "--out", "out", "--candidate-predictor", "candidate", "--external-baselines", "baseline_a:ba,baseline_b", "--preferred-predictors", "candidate,baseline_a", "--monoallelic-panel-predictors", "candidate,candidate_b", "--presentation-panel-predictors", "candidate_ps", "--presentation-panel-baselines", "baseline_a,baseline_b", ]) config = paper_figures._parse_predictor_config(args) assert config.candidate == "candidate" assert config.external_baselines == ( ("baseline_a", "ba"), ("baseline_b", "baseline_b"), ) assert config.preferred_predictors == ("candidate", "baseline_a") assert config.monoallelic_panel_predictors == ( "candidate", "candidate_b") assert config.presentation_panel_predictors == ("candidate_ps",) assert config.presentation_panel_baselines == ("baseline_a", "baseline_b") mhcflurry-2.3.6/test/test_cli_help.py000066400000000000000000000065761525677230600177370ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Terminal help remains readable without contaminating machine output.""" import io import re import pytest from mhcflurry.cli import main, predict_command, predict_scan_command from mhcflurry.cli.help import style_help class Terminal(io.StringIO): def isatty(self): return True @pytest.mark.parametrize("module", [predict_command, predict_scan_command]) @pytest.mark.parametrize("columns", [80, 240]) def test_prediction_help_is_compact_and_lists_every_flag(monkeypatch, module, columns): monkeypatch.setenv("COLUMNS", str(columns)) text = module.parser.format_help() assert len(text.splitlines()[0]) < 80 assert "[OPTIONS]" in text.splitlines()[0] assert "Examples:" in text assert text.index("Input") < text.index("Help:") assert "\x1b[" not in text assert "``" not in text assert max(map(len, text.splitlines())) <= min(columns, 100) for action in module.parser._actions: for flag in action.option_strings: assert flag in text @pytest.mark.parametrize("module", [predict_command, predict_scan_command]) def test_printed_help_color_depends_on_destination(monkeypatch, module): monkeypatch.delenv("NO_COLOR", raising=False) monkeypatch.setenv("TERM", "xterm-256color") plain = io.StringIO() terminal = Terminal() module.parser.print_help(plain) module.parser.print_help(terminal) assert "\x1b[" not in plain.getvalue() assert "\x1b[36m--alleles\x1b[0m" in terminal.getvalue() assert re.sub(r"\x1b\[[0-9;]*m", "", terminal.getvalue()) == plain.getvalue() # Programmatic consumers (including generated docs) never get ANSI escapes. assert module.parser.format_help() == plain.getvalue() @pytest.mark.parametrize("environment", [{"NO_COLOR": "1"}, {"TERM": "dumb"}]) def test_help_respects_disabled_color(monkeypatch, environment): for key, value in environment.items(): monkeypatch.setenv(key, value) text = predict_command.parser.format_help() assert style_help(text, Terminal()) == text @pytest.mark.parametrize("command", ["predict", "predict-scan"]) @pytest.mark.parametrize("arguments,status", [([], 1), (["--help"], 0)]) def test_bare_and_explicit_help_preserve_exit_behavior(capsys, command, arguments, status): with pytest.raises(SystemExit) as exc: main.main([command, *arguments]) assert exc.value.code == status captured = capsys.readouterr() assert captured.out.startswith("usage: mhcflurry " + command + " [OPTIONS]") assert "\x1b[" not in captured.out assert captured.err == "" def test_argument_errors_still_go_to_stderr(capsys): with pytest.raises(SystemExit) as exc: main.main(["predict", "--not-an-option"]) assert exc.value.code == 2 captured = capsys.readouterr() assert captured.out == "" assert "unrecognized arguments" in captured.err assert "\x1b[" not in captured.err mhcflurry-2.3.6/test/test_cli_startup.py000066400000000000000000000056711525677230600205040ustar00rootroot00000000000000"""Keep discovery commands independent of numerical-library imports.""" import importlib import json import os from pathlib import Path import pickle import subprocess import sys import pytest @pytest.mark.parametrize('argv,code', [ ([], 0), (['--help'], 0), (['--version'], 0), (['predict'], 1), (['predict', '--help'], 0), (['predict-scan', '--help'], 0), (['predict-scan'], 1), (['downloads', 'info'], 0), (['downloads', 'list', '--json'], 0), (['downloads', 'releases', 'models_class1_presentation', '--json'], 0), (['downloads', 'info', 'models_class1_presentation'], 0), (['predict', '--model-release', 'not-a-release'], 2), ]) def test_discovery_does_not_import_numerical_stack(argv, code): env = {key: value for key, value in os.environ.items() if not key.startswith('MHCFLURRY_')} root = str(Path(__file__).resolve().parents[1]) env['PYTHONPATH'] = root script = ''' import sys from mhcflurry.cli.main import main try: code = main(%r) or 0 except SystemExit as error: code = error.code assert code == %r, code unexpected = set(sys.modules).intersection(['torch', 'numpy', 'pandas', 'sklearn', 'mhcgnomes']) assert not unexpected, unexpected ''' % (argv, code) result = subprocess.run([sys.executable, '-c', script], env=env, cwd=root, capture_output=True, text=True) assert result.returncode == 0, result.stdout + result.stderr def test_public_classes_keep_identity_and_pickle_paths(): import mhcflurry for name, module in mhcflurry._PUBLIC_CLASSES.items(): value = getattr(mhcflurry, name) assert value is getattr(importlib.import_module('mhcflurry.' + module), name) assert pickle.loads(pickle.dumps(value)) is value assert name in dir(mhcflurry) with pytest.raises(AttributeError): getattr(mhcflurry, 'missing_public_class') def test_parallelism_exports_keep_identity_and_legacy_imports(): from mhcflurry import parallelism, local_parallelism for name, module in parallelism._EXPORTS.items(): value = getattr(parallelism, name) assert value is getattr(importlib.import_module('mhcflurry.parallelism.' + module), name) assert getattr(local_parallelism, name) is value assert name in dir(parallelism) with pytest.raises(AttributeError): getattr(parallelism, 'missing_worker_helper') def test_catalogue_discovery_with_unknown_environment_release(): env = dict(os.environ, MHCFLURRY_DOWNLOADS_CURRENT_RELEASE='unknown-release') env.pop('MHCFLURRY_DOWNLOADS_DIR', None) env['PYTHONPATH'] = str(Path(__file__).resolve().parents[1]) script = 'from mhcflurry.cli.main import main; main(["downloads", "releases", "--json"])' result = subprocess.run([sys.executable, '-c', script], env=env, capture_output=True, text=True) assert result.returncode == 0, result.stderr assert json.loads(result.stdout)['default_release'] == '2.3.0' mhcflurry-2.3.6/test/test_common.py000066400000000000000000000176641525677230600174500ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Tests for common helpers.""" import argparse import logging import pytest from mhcflurry.common import ( allele_locus_name, filter_canonicalizable_alleles, AlleleKeyResolver, canonicalize_allele_series, fraction_arg, normalize_allele_name, normalize_class1_genotype, normalize_sequence_resolved_allele_name, positive_float_arg, positive_int_arg, ) @pytest.mark.parametrize( "value", ["0", "-1", "1.5", "junk", 1.5, True] ) def test_positive_int_arg_rejects_invalid_values(value): with pytest.raises(argparse.ArgumentTypeError): positive_int_arg(value) @pytest.mark.parametrize("value", ["0", "-1", "nan", "inf", "junk"]) def test_positive_float_arg_rejects_invalid_values(value): with pytest.raises(argparse.ArgumentTypeError): positive_float_arg(value) def test_positive_arg_helpers_accept_values(): assert positive_int_arg("12") == 12 assert positive_float_arg("1e-3") == 1e-3 @pytest.mark.parametrize("value", ["0", "-0.1", "1.1", "nan", "junk"]) def test_fraction_arg_rejects_invalid_values(value): with pytest.raises(argparse.ArgumentTypeError): fraction_arg(value) def test_fraction_arg_accepts_fraction_and_one(): assert fraction_arg("0.25") == 0.25 assert fraction_arg("1") == 1.0 def test_filter_canonicalizable_alleles_logs_instead_of_stdout( caplog, capsys): with caplog.at_level(logging.WARNING): result = filter_canonicalizable_alleles( ["HLA-A*02:01", "HLA-A*02:01N"], log_label="test alleles", ) captured = capsys.readouterr() assert captured.out == "" assert result == ["HLA-A*02:01"] assert "Skipping 1 test alleles" in caplog.text def test_filter_canonicalizable_alleles_returns_names_verbatim(): # Survivors must be returned unchanged — NOT alias-remapped — so a retired # name stored as its own pseudosequence key is not collapsed onto its alias # target (which would silently drop it on the default calibrate path). assert filter_canonicalizable_alleles(["HLA-B*44:01", "JUNK"]) == \ ["HLA-B*44:01"] def test_allele_locus_name_uses_mhcgnomes(): assert allele_locus_name("HLA-A0201") == "HLA-A" assert allele_locus_name("HLA-B*07:02") == "HLA-B" assert allele_locus_name("HLA-C*03:04") == "HLA-C" assert allele_locus_name("HLA-A2") == "HLA-A" assert allele_locus_name("HLA-B15") == "HLA-B" assert allele_locus_name("A2") == "HLA-A" assert allele_locus_name("H-2-Kb") == "H2" assert allele_locus_name("NONSENSE") == "other" def test_normalize_allele_name_uses_exact_gene_classification(): with pytest.raises(ValueError, match="MIC-family"): normalize_allele_name("HLA-MICA*001") with pytest.raises(ValueError, match="HFE-family"): normalize_allele_name("HLA-HFE*01:01") # A forbidden token appearing only as part of an unrelated gene name must # not trigger legacy substring inference. assert normalize_allele_name( "HLA-A*02:01", forbidden_substrings=("A0",) ) == "HLA-A*02:01" def test_sequence_resolved_allele_and_genotype_normalization(): assert normalize_sequence_resolved_allele_name("A0201") == "HLA-A*02:01" assert normalize_sequence_resolved_allele_name("H-2-Kb") == "H2-K*b" assert ( normalize_sequence_resolved_allele_name("DLA-88*01:01") == "DLA-88*001:01" ) assert normalize_class1_genotype("B0702 A0201 A0201") == ( "HLA-B*07:02", "HLA-A*02:01") for value in ("HLA-A2", "A*02", "HLA-DQA1*01:01", "NONSENSE"): with pytest.raises(ValueError): normalize_sequence_resolved_allele_name(value) for value in (None, float("nan"), ""): with pytest.raises(ValueError, match="non-empty"): normalize_class1_genotype(value) def test_allele_key_resolver_priority(): resolver = AlleleKeyResolver({"HLA-B*44:01", "HLA-A*02:01"}) # An allele with its own key keeps that key (not remapped to B*44:02). assert resolver.resolve("HLA-B*44:01") == "HLA-B*44:01" # An alternative spelling normalizes to the key. assert resolver.resolve("HLA-A0201") == "HLA-A*02:01" # The modern alias of a retired key routes back to the key in the set. assert resolver.resolve("HLA-B*44:02") == "HLA-B*44:01" def test_allele_key_resolver_raises_on_junk(): with pytest.raises(ValueError): AlleleKeyResolver(set()).resolve("NONSENSE", raise_on_error=True) assert AlleleKeyResolver(set()).resolve( "NONSENSE", raise_on_error=False) is None def test_allele_key_resolver_best_effort_vs_strict(): resolver = AlleleKeyResolver({"HLA-A*02:01"}) # Supported allele: both modes return the key. assert resolver.resolve("HLA-A0201") == "HLA-A*02:01" assert resolver.resolve_to_key("HLA-A0201") == "HLA-A*02:01" # A valid allele that is NOT a key: best-effort returns the normalized name # (so the caller can flag it as unsupported); strict returns None (drop it). assert resolver.resolve("HLA-B*07:02") == "HLA-B*07:02" assert resolver.resolve_to_key("HLA-B*07:02") is None # Unparseable: both return None (strict never raises). assert resolver.resolve("NONSENSE") is None assert resolver.resolve_to_key("NONSENSE") is None def test_allele_key_resolver_empty_keys_skip_membership_steps(): # With no keys, steps 1-2 are skipped; best-effort returns the normalized # name and strict returns None (nothing can match an empty key set). resolver = AlleleKeyResolver(set()) assert resolver.resolve("HLA-A*02:01") == "HLA-A*02:01" assert resolver.resolve_to_key("HLA-A*02:01") is None def test_canonicalize_allele_series_resolves_aliases_and_drops_junk(caplog): keys = ["HLA-B*44:01", "HLA-A*02:01"] with caplog.at_level(logging.WARNING): out = canonicalize_allele_series( ["HLA-B*44:01", "HLA-A0201", "HLA-B*44:02", "NONSENSE"], keys, log_label="training alleles") # Aliases / spellings resolve to keys; unparseable -> None (dropped). assert out == ["HLA-B*44:01", "HLA-A*02:01", "HLA-B*44:01", None] # Every non-None result is a member of the key set. assert all(x in set(keys) for x in out if x is not None) assert "Dropping 1 training alleles" in caplog.text @pytest.mark.parametrize(("raw_name", "message"), [ ("HLA-DQA1*01:01", "MHC class II allele"), ("HLA-A2", "serotype is not a specific allele"), ("Caja-B5*01:01ps", "pseudogene MHC allele"), ("HLA-H*02:01", "pseudogene MHC allele"), ("Mamu-G*01:01", "pseudogene MHC allele"), ("Popy-Ap*01:01", "pseudogene MHC allele"), ("HLA-A*02:01N", "null-expression MHC allele"), ("HLA-A*02:01Q", "questionable-expression MHC allele"), ("MICA*001:01", "Unsupported gene in MHC allele name"), ("HFE*01:01", "Unsupported gene in MHC allele name"), ("MIC-NONSENSE", "Invalid MHC allele name"), ("NONSENSE", "Invalid MHC allele name"), ]) def test_normalize_allele_name_reports_specific_failure(raw_name, message): with pytest.raises(ValueError, match=message): normalize_allele_name(raw_name) assert normalize_allele_name( raw_name, raise_on_error=False, default_value="invalid") == "invalid" def test_normalize_allele_name_scopes_inherited_pseudogene_status(): # mhcgnomes marks Popy-Ap as a pseudogene but does not leak that property # to the similarly named Poab-Ap locus in a sibling orangutan species. assert normalize_allele_name("Poab-Ap*01:01") == "Poab-Ap*01:01" mhcflurry-2.3.6/test/test_compact_percent_rank_transform.py000066400000000000000000000161611525677230600244230ustar00rootroot00000000000000"""Regression tests for the label-free compact percentile approximation.""" import importlib.util import json from pathlib import Path import numpy as np import pandas as pd import pytest from numpy.testing import assert_allclose, assert_array_equal from scipy.special import expit from sklearn.metrics import average_precision_score from mhcflurry.compact_percent_rank_transform import ( CompactPresentationPercentiles, probability_logits, select_monotonic_knots) def experiment_module(): path = Path(__file__).resolve().parents[1] / "scripts/training/compare_presentation_percentiles.py" spec = importlib.util.spec_from_file_location("compare_presentation_percentiles", path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module @pytest.mark.parametrize("budget", [2, 8, 64, 128, 256]) def test_budget_monotonicity_extrapolation_and_roundtrip(budget): rng = np.random.default_rng(15) reference = expit(rng.normal(-5, 2, 10000)) model = CompactPresentationPercentiles.from_scores(reference, budget) assert 2 <= len(model.x) <= budget assert np.all(model.tail_slopes < 0) assert_allclose(model.reference_bounds, [reference.min(), reference.max()]) # Include points on both sides of the observed reference, not only knots. probes = expit(np.linspace(-16, 13, 20000)) mapped = model.transform(probes) assert np.all(np.diff(mapped) < 0) assert np.all((mapped > 0) & (mapped < 100)) restored = CompactPresentationPercentiles.from_dict(json.loads(json.dumps(model.to_dict()))) assert_array_equal(mapped, restored.transform(probes)) assert_allclose(np.log(mapped), model.log_percentiles(probes), atol=1e-14) def test_duplicates_use_weighted_midrank_survival(): model = CompactPresentationPercentiles.from_scores([.1, .1, .2, .9], 20) assert_allclose(model.transform([.1, .2, .9]), [75, 37.5, 12.5]) assert len(model.x) == 3 def test_two_distinct_scores_and_nan_endpoints(): model = CompactPresentationPercentiles.from_scores([0, 1], 128) result = model.transform([0, .25, .75, 1, np.nan]) assert_allclose(result[[0, 3]], [75, 25]) assert np.all(np.diff(result[:4]) < 0) assert np.isnan(result[-1]) assert np.isfinite(probability_logits([0, 1])).all() assert model.transform(np.array([])).shape == (0,) assert np.isscalar(model.transform(.5)) @pytest.mark.parametrize("scores", [[], [.5], [.5, .5], [.1, np.nan], [.1, np.inf], [-.1, .1], [.1, 1.1], [[.1, .2]]]) def test_invalid_reference_is_rejected(scores): with pytest.raises(ValueError): CompactPresentationPercentiles.from_scores(scores) @pytest.mark.parametrize("budget", [0, 1, -3, 3.5, True]) def test_invalid_budget_is_rejected(budget): with pytest.raises(ValueError, match="budget"): CompactPresentationPercentiles.from_scores([.1, .2, .5], budget) def test_invalid_serialized_models_are_rejected(): original = CompactPresentationPercentiles.from_scores([.1, .2, .5]).to_dict() for key, value in [("format", "v999"), ("tail_slopes", [0, -1]), ("y", [0, 0, 0]), ("x", [1, 1, 2]), ("reference_bounds", [.2, .5])]: broken = dict(original, **{key: value}) with pytest.raises(ValueError): CompactPresentationPercentiles.from_dict(broken) def test_greedy_knots_are_deterministic_and_preserve_endpoints(): x = np.linspace(-4, 4, 1000) y = -np.exp(x) for budget in [3, 10, 40]: indices = select_monotonic_knots(x, y, budget) assert len(indices) == budget assert_array_equal(indices[[0, -1]], [0, len(x) - 1]) assert_array_equal(indices, select_monotonic_knots(x, y, budget)) assert_array_equal(select_monotonic_knots(x, -x, 128), [0, len(x) - 1]) def test_independent_rare_tail_ranking_is_preserved(): rng = np.random.default_rng(402) reference = expit(rng.normal(-6, 1.3, 100000)) model = CompactPresentationPercentiles.from_scores(reference, 64) # Independent evaluation scores in and above the reference's sparse tail. raw = expit(rng.normal(0, 1.5, 6000)) labels = rng.random(len(raw)) < expit((probability_logits(raw) - .2) * 2) percentile_scores = -model.transform(raw) assert_allclose(average_precision_score(labels, percentile_scores), average_precision_score(labels, raw), rtol=0, atol=1e-14) assert np.unique(percentile_scores).size == np.unique(raw).size def test_background_split_keeps_repeated_peptides_together(): module = experiment_module() peptides = np.tile(np.array(["P%d" % index for index in range(100)]), 3) split = module.grouped_reference_split(peptides, 403) assert_array_equal(np.bincount(split), [180, 60, 60]) assert_array_equal(split[:100], split[100:200]) assert_array_equal(split, module.grouped_reference_split(peptides, 403)) # Tiling this split for every allele cannot put a peptide in different folds. assert_array_equal(np.tile(split, 8).reshape(8, -1), np.broadcast_to(split, (8, len(split)))) def test_calibration_accuracy_reports_raw_counts_and_smoothing(): module = experiment_module() table = module.calibration_accuracy(np.array([.02, .1, 1, 20]), [.01, .1, 1]) assert_array_equal(table["count"], [0, 2, 3]) assert_allclose(table.observed_percent, [0, 50, 75]) assert_allclose(table.smoothed_percent, [10, 50, 70]) assert np.isfinite(table.log10_error).all() def test_selection_ignores_test_split_and_prefers_smaller_near_tie(): module = experiment_module() records = [] for method, error in [("compact_64", .108), ("compact_128", .10), ("compact_256", .099)]: for cutoff in module.SELECTION_CUTOFFS: records.extend([dict(method=method, cutoff=cutoff, split="validation", log10_error=error), dict(method=method, cutoff=cutoff, split="test", log10_error=100)]) result = module.select_compact_method(pd.DataFrame(records)) assert result["selected"] == "compact_64" assert_allclose(result["best"], .099) def test_ppv_is_invariant_to_input_order_with_cutoff_ties(): module = experiment_module() labels = np.array([1, 1, 0, 0]) for order in [np.arange(4), np.arange(4)[::-1]]: metrics = module.ranking_metrics(labels[order], np.zeros(4)) assert metrics["ppv_expected_random_ties"] == .5 assert metrics["auprc"] == .5 assert metrics["auroc"] == .5 def test_saved_step_and_compact_methods_roundtrip(tmp_path): module = experiment_module() scores = expit(np.random.default_rng(25).normal(size=1000)) methods = module.fit_methods(scores, [8, 16]) module.save_methods(methods, tmp_path / "models") loaded = module.load_methods(tmp_path / "models") for name in methods: assert_array_equal(module.percentiles(methods[name], scores), module.percentiles(loaded[name], scores)) def test_adapter_fit_refits_the_receiver_in_place(): model = CompactPresentationPercentiles.from_scores([.1, .2, .3, .4, .5], 64) same = model.fit([index / 2000 for index in range(1, 2000)], 128) assert same is model assert len(model.x) > 5 mhcflurry-2.3.6/test/test_compare_presentation_percentiles_paths.py000066400000000000000000000014131525677230600261560ustar00rootroot00000000000000"""Presentation-percentile provenance does not depend on the working directory.""" import importlib.util from pathlib import Path REPO_ROOT = Path(__file__).resolve().parents[1] SCRIPT = REPO_ROOT / "scripts/training/compare_presentation_percentiles.py" def test_compact_transform_source_resolves_outside_repo_root(tmp_path, monkeypatch): monkeypatch.chdir(tmp_path) spec = importlib.util.spec_from_file_location("compare_presentation_percentiles", SCRIPT) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) source = module.COMPACT_TRANSFORM_SOURCE assert source.is_absolute() and source.is_file() assert source == REPO_ROOT / "mhcflurry/compact_percent_rank_transform.py" assert len(module.sha256(source)) == 64 mhcflurry-2.3.6/test/test_custom_loss.py000066400000000000000000000224561525677230600205250ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Tests for custom loss functions. """ import pytest from .pytest_helpers import assert_greater, assert_almost_equal import numpy import torch from mhcflurry.custom_loss import CUSTOM_LOSSES, MultiallelicMassSpecLoss from mhcflurry.testing_utils import cleanup, startup pytest.fixture(autouse=True, scope="module") def setup_module(): startup() yield cleanup() @pytest.fixture(autouse=True) def setup_teardown(): """Setup and teardown for each test.""" startup() yield cleanup() def evaluate_loss(loss_obj, y_true, y_pred): """Evaluate a loss function with PyTorch tensors.""" y_true = torch.tensor(y_true, dtype=torch.float32) y_pred = torch.tensor(y_pred, dtype=torch.float32) if y_pred.ndim == 1: y_pred = y_pred.reshape(len(y_pred), 1) if y_true.ndim == 1: y_true = y_true.reshape(len(y_true), 1) print("y_pred, y_true:", y_pred, y_true) assert y_true.ndim == 2 assert y_pred.ndim == 2 result = loss_obj.loss(y_pred, y_true) return result.item() def test_mse_with_inequalities(loss_obj=None): """Test MSE with inequalities loss function.""" if loss_obj is None: loss_obj = CUSTOM_LOSSES['mse_with_inequalities'] y_values = [0.0, 0.5, 0.8, 1.0] adjusted_y = loss_obj.encode_y(y_values) print(adjusted_y) loss0 = evaluate_loss(loss_obj, adjusted_y, y_values) print(loss0) assert abs(loss0) < 1e-6, f"Expected 0, got {loss0}" adjusted_y = loss_obj.encode_y(y_values, [">", ">", ">", ">"]) loss0 = evaluate_loss(loss_obj, adjusted_y, y_values) assert abs(loss0) < 1e-6, f"Expected 0, got {loss0}" adjusted_y = loss_obj.encode_y(y_values, ["<", "<", "<", "<"]) loss0 = evaluate_loss(loss_obj, adjusted_y, y_values) assert abs(loss0) < 1e-6, f"Expected 0, got {loss0}" adjusted_y = loss_obj.encode_y(y_values, ["=", "<", "=", ">"]) loss0 = evaluate_loss(loss_obj, adjusted_y, y_values) assert abs(loss0) < 1e-6, f"Expected 0, got {loss0}" adjusted_y = loss_obj.encode_y(y_values, ["=", "<", "=", ">"]) loss0 = evaluate_loss(loss_obj, adjusted_y, [0.0, 0.4, 0.8, 1.0]) assert abs(loss0) < 1e-6, f"Expected 0, got {loss0}" adjusted_y = loss_obj.encode_y(y_values, [">", "<", ">", ">"]) loss0 = evaluate_loss(loss_obj, adjusted_y, [0.1, 0.4, 0.9, 1.0]) assert abs(loss0) < 1e-6, f"Expected 0, got {loss0}" adjusted_y = loss_obj.encode_y(y_values, [">", "<", ">", ">"]) loss0 = evaluate_loss(loss_obj, adjusted_y, [0.1, 0.6, 0.9, 1.0]) assert_greater(loss0, 0.0) adjusted_y = loss_obj.encode_y(y_values, ["=", "<", ">", ">"]) loss0 = evaluate_loss(loss_obj, adjusted_y, [0.1, 0.6, 0.9, 1.0]) assert_almost_equal(loss0, 0.02 / 4, places=5) adjusted_y = loss_obj.encode_y(y_values, ["=", "<", "=", ">"]) loss0 = evaluate_loss(loss_obj, adjusted_y, [0.1, 0.6, 0.9, 1.0]) assert_almost_equal(loss0, 0.03 / 4, places=5) def test_mse_with_inequalities_and_multiple_outputs(): """Test MSE with inequalities and multiple outputs loss function.""" loss_obj = CUSTOM_LOSSES['mse_with_inequalities_and_multiple_outputs'] test_mse_with_inequalities(loss_obj) y_values = [0.0, 0.5, 0.8, 1.0] adjusted_y = loss_obj.encode_y( y_values, output_indices=[0, 1, 1, 1]) loss0 = evaluate_loss( loss_obj, adjusted_y, [ [0.0, 1000], [2000, 0.5], [3000, 0.8], [4000, 1.0], ]) assert_almost_equal(loss0, 0.0, places=5) y_values = [0.0, 0.5, 0.8, 1.0] adjusted_y = loss_obj.encode_y( y_values, output_indices=[0, 1, 1, 0]) loss0 = evaluate_loss( loss_obj, adjusted_y, [ [0.1, 1000], [2000, 0.6], [3000, 0.8], [1.0, 4000], ]) assert_almost_equal(loss0, 0.02 / 4, places=5) y_values = [0.0, 0.5, 0.8, 1.0] adjusted_y = loss_obj.encode_y( y_values, output_indices=[0, 1, 1, 0], inequalities=["=", ">", "<", "<"]) loss0 = evaluate_loss( loss_obj, adjusted_y, [ [0.1, 1000], [2000, 0.6], [3000, 0.8], [1.0, 4000], ]) assert_almost_equal(loss0, 0.01 / 4, places=5) y_values = [0.0, 0.5, 0.8, 1.0] adjusted_y = loss_obj.encode_y( y_values, output_indices=[0, 1, 1, 0], inequalities=["=", "<", "<", "<"]) loss0 = evaluate_loss( loss_obj, adjusted_y, [ [0.1, 1000], [2000, 0.6], [3000, 0.8], [1.0, 4000], ]) assert_almost_equal(loss0, 0.02 / 4, places=5) def test_multiallelic_mass_spec_loss(): """Test multiallelic mass spec loss function.""" for delta in [0.0, 0.3]: print("delta", delta) # Hit labels y_true = [ 1.0, 0.0, 1.0, -1.0, # ignored 1.0, 0.0, 1.0, ] y_true = numpy.array(y_true) y_pred = [ [0.3, 0.7, 0.5], [0.2, 0.4, 0.6], [0.1, 0.5, 0.3], [0.9, 0.1, 0.2], [0.1, 0.7, 0.1], [0.8, 0.2, 0.4], [0.1, 0.2, 0.4], ] y_pred = numpy.array(y_pred) # reference implementation 1 def smooth_max(x, alpha): x = numpy.array(x) alpha = numpy.array([alpha]) return (x * numpy.exp(x * alpha)).sum() / ( numpy.exp(x * alpha)).sum() contributions = [] for i in range(len(y_true)): if y_true[i] == 1.0: for j in range(len(y_true)): if y_true[j] == 0.0: tightest_i = max(y_pred[i]) for k in range(y_pred.shape[1]): contribution = max( 0, y_pred[j, k] - tightest_i + delta)**2 contributions.append(contribution) contributions = numpy.array(contributions) expected1 = contributions.sum() / len(contributions) # reference implementation 2: numpy pos = numpy.array([ max(y_pred[i]) for i in range(len(y_pred)) if y_true[i] == 1.0 ]) neg = y_pred[(y_true == 0.0).astype(bool)] term = neg.reshape((-1, 1)) - pos + delta expected2 = ( numpy.maximum(0, term)**2).sum() / ( len(pos) * neg.shape[0] * neg.shape[1]) numpy.testing.assert_almost_equal(expected1, expected2) loss_obj = MultiallelicMassSpecLoss(delta=delta) computed = evaluate_loss( loss_obj, y_true, y_pred.reshape(y_pred.shape)) numpy.testing.assert_almost_equal(computed, expected1, 4) def test_encode_y_basic(): """Test basic y encoding functionality.""" from mhcflurry.pytorch_losses import MSEWithInequalities # Test equality encoding y = [0.0, 0.5, 1.0] encoded = MSEWithInequalities.encode_y(y) numpy.testing.assert_array_equal(encoded, y) # Test greater than encoding (should add 2) encoded_gt = MSEWithInequalities.encode_y(y, [">", ">", ">"]) numpy.testing.assert_array_equal(encoded_gt, [2.0, 2.5, 3.0]) # Test less than encoding (should add 4) encoded_lt = MSEWithInequalities.encode_y(y, ["<", "<", "<"]) numpy.testing.assert_array_equal(encoded_lt, [4.0, 4.5, 5.0]) def test_loss_gradient_flow(): """Test that gradients flow correctly through the loss.""" from mhcflurry.pytorch_losses import MSEWithInequalities loss_fn = MSEWithInequalities() # Create predictions that require gradients y_pred = torch.tensor([[0.5]], requires_grad=True) y_true = torch.tensor([[0.3]]) # equality loss = loss_fn(y_pred, y_true) loss.backward() # Gradient should exist and be non-zero assert y_pred.grad is not None assert y_pred.grad.abs().item() > 0 def test_inequality_gradient_respects_constraint(): """Test that gradients respect inequality constraints.""" from mhcflurry.pytorch_losses import MSEWithInequalities loss_fn = MSEWithInequalities() # Test greater-than constraint (y_true encoded as 2 + value) # When pred > threshold, gradient should be 0 y_pred = torch.tensor([[0.7]], requires_grad=True) y_true = torch.tensor([[2.5]]) # > 0.5 loss = loss_fn(y_pred, y_true) loss.backward() # Gradient should be 0 since pred (0.7) > threshold (0.5) assert abs(y_pred.grad.item()) < 1e-6 # When pred < threshold, gradient should be non-zero y_pred2 = torch.tensor([[0.3]], requires_grad=True) y_true2 = torch.tensor([[2.5]]) # > 0.5 loss2 = loss_fn(y_pred2, y_true2) loss2.backward() # Gradient should be non-zero since pred (0.3) < threshold (0.5) assert abs(y_pred2.grad.item()) > 0 mhcflurry-2.3.6/test/test_data_mass_spec_annotation.py000066400000000000000000000132121525677230600233410ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Tests for data_mass_spec_annotated generation helpers.""" import importlib.util from pathlib import Path import pandas import pytest from mhcflurry import peptide_reference ANNOTATE_PATH = ( Path(__file__).resolve().parents[1] / "downloads-generation" / "data_mass_spec_annotated" / "annotate.py" ) def load_annotate_module(): spec = importlib.util.spec_from_file_location( "data_mass_spec_annotated_annotate", ANNOTATE_PATH) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module def sorted_annotation_rows(data): df = pandas.read_csv(data) if isinstance(data, Path) else data cols = [ "hit_id", "peptide", "protein_accession", "start_position", "num_proteins", "num_occurrences_in_protein", "n_flank", "c_flank", "sample_id", ] return df[cols].sort_values(cols).reset_index(drop=True) def write_inputs(tmp_path): peptides = tmp_path / "peptides.csv" pandas.DataFrame({ "peptide": ["AAA", "AAA", "CDE"], "sample_id": ["s1", "s2", "s3"], }).to_csv(peptides, index=False) reference = tmp_path / "reference.csv" pandas.DataFrame({ "accession": ["P1", "P2", "P3"], "name": ["protein1", "protein2", "protein3"], "description": ["first", "second", "overlap"], "seq": ["MMAAAKAAAQCDE", "CDEAAA", "AAAAA"], "db": ["sp", "tr", "tr"], "gene_name": ["G1", "G2", "G3"], }).to_csv(reference) return peptides, reference def read_reference_dataframe(reference): return pandas.read_csv(reference, index_col=0) def annotate_with_backend(peptides, reference, backend, flanking_length=2): peptide_df = pandas.read_csv(peptides) peptide_df["hit_id"] = "hit." + peptide_df.index.map("{0:07d}".format) peptide_df = peptide_df.set_index("hit_id") reference_df = read_reference_dataframe(reference) return peptide_reference._annotate_peptide_references( peptide_df, reference_df, flanking_length=flanking_length, backend=backend) def test_annotation_script_uses_library_default(tmp_path): annotate = load_annotate_module() peptides, reference = write_inputs(tmp_path) out = tmp_path / "annotated.csv" annotate.run([ str(peptides), str(reference), "--flanking-length", "2", "--out", str(out), ]) result = sorted_annotation_rows(out) assert len(result) == 10 aaa_rows = result.loc[result.peptide == "AAA"] assert set(aaa_rows.num_proteins) == {3} p1_rows = aaa_rows.loc[aaa_rows.protein_accession == "P1"] assert set(p1_rows.num_occurrences_in_protein) == {2} assert set(p1_rows.start_position) == {2, 6} # Preserve legacy re.finditer-style non-overlapping occurrence semantics. p3_rows = aaa_rows.loc[aaa_rows.protein_accession == "P3"] assert set(p3_rows.start_position) == {0} assert set(p3_rows.num_occurrences_in_protein) == {1} def test_annotation_cli_does_not_expose_backend(tmp_path): annotate = load_annotate_module() peptides, reference = write_inputs(tmp_path) with pytest.raises(SystemExit): annotate.run([ str(peptides), str(reference), "--backend", "sliding", "--flanking-length", "2", "--out", str(tmp_path / "out.csv"), ]) def test_annotation_helper_default_matches_sliding(tmp_path): peptides, reference = write_inputs(tmp_path) peptide_df = pandas.read_csv(peptides) peptide_df["hit_id"] = "hit." + peptide_df.index.map("{0:07d}".format) peptide_df = peptide_df.set_index("hit_id") reference_df = read_reference_dataframe(reference) sliding = annotate_with_backend(peptides, reference, "sliding") auto = peptide_reference.annotate_peptide_references( peptide_df, reference_df, flanking_length=2) pandas.testing.assert_frame_equal( sorted_annotation_rows(sliding), sorted_annotation_rows(auto), check_dtype=False) def test_annotation_helper_default_matches_ahocorasick(tmp_path): peptides, reference = write_inputs(tmp_path) peptide_df = pandas.read_csv(peptides) peptide_df["hit_id"] = "hit." + peptide_df.index.map("{0:07d}".format) peptide_df = peptide_df.set_index("hit_id") reference_df = read_reference_dataframe(reference) ahocorasick = annotate_with_backend(peptides, reference, "ahocorasick") auto = peptide_reference.annotate_peptide_references( peptide_df, reference_df, flanking_length=2) pandas.testing.assert_frame_equal( sorted_annotation_rows(ahocorasick), sorted_annotation_rows(auto), check_dtype=False) def test_annotation_ahocorasick_matches_sliding(tmp_path): peptides, reference = write_inputs(tmp_path) sliding = annotate_with_backend(peptides, reference, "sliding") ahocorasick = annotate_with_backend(peptides, reference, "ahocorasick") pandas.testing.assert_frame_equal( sorted_annotation_rows(sliding), sorted_annotation_rows(ahocorasick), check_dtype=False) mhcflurry-2.3.6/test/test_deploy_percent_ranks.py000066400000000000000000000141521525677230600223570ustar00rootroot00000000000000"""Model deployment accepts and packages compact JSON percentile calibrations.""" import hashlib import json import os from pathlib import Path import subprocess import tarfile import pytest from mhcflurry.version import __version__ REPO_ROOT = Path(__file__).resolve().parents[1] DEPLOY_SCRIPT = REPO_ROOT / "scripts/release/deploy_trained_models.sh" CALIBRATED_DIRS = ("affinity/models.combined", "presentation/models") COMPACT_PERCENT_RANKS = json.dumps( {"format": "mhcflurry-percent-ranks-v1", "transforms": {}}, indent=2) + "\n" def _sha256(path): return hashlib.sha256(Path(path).read_bytes()).hexdigest() def _write_json_calibrated_run(run_dir): """Write a minimal run calibrated with the default compact method.""" model_dirs = ( "affinity/models.combined", "processing/models.selected.no_flank", "processing/models.selected.with_flanks", "presentation/models", ) commit = subprocess.check_output( ["git", "rev-parse", "HEAD"], cwd=REPO_ROOT, text=True).strip() for relative in model_dirs: (run_dir / relative).mkdir(parents=True) (run_dir / relative / "info.txt").write_text( "package\tmhcflurry %s\ngit commit\t%s\nworkflow id\ttest-workflow\n" % ( __version__, commit)) for relative in model_dirs[:3]: (run_dir / relative / "manifest.csv").write_text("model_name\nmodel\n") (run_dir / relative / "weights_model.npz").write_bytes(b"selected test weights") (run_dir / "presentation/models/weights.csv").write_text("model_name\nmodel\n") for relative in CALIBRATED_DIRS: (run_dir / relative / "percent_ranks.json").write_text(COMPACT_PERCENT_RANKS) holdout = run_dir / "release_holdout" holdout.mkdir() records = {} for name in ("affinity_pmhcs.csv", "affinity_samples.csv", "processing_samples.csv", "presentation_samples.csv"): (holdout / name).write_text("sample_id\n") records[name] = {"rows": 0, "sha256": _sha256(holdout / name)} (holdout / "policy.json").write_text( json.dumps({"schema_version": 1, "holdout_files": records})) (holdout / "validation.json").write_text(json.dumps({ "schema_version": 1, "policy_sha256": _sha256(holdout / "policy.json"), "holdout_files": records, "affinity_overlap_rows": 0, "processing_overlap_rows": 0, "presentation_overlap_rows": 0, })) def _run_deploy(run_dir, *args, env=None): return subprocess.run( ["bash", str(DEPLOY_SCRIPT), "--run-dir", str(run_dir), "--release", __version__, "--repo", str(REPO_ROOT), "--allow-dirty-repo", *args], capture_output=True, text=True, env=env, cwd=run_dir.parent) def test_deploy_archives_json_only_percent_ranks_unchanged(tmp_path): run_dir = tmp_path / "release-run" _write_json_calibrated_run(run_dir) fake_bin = tmp_path / "bin" fake_bin.mkdir() (fake_bin / "gh").write_text("#!/usr/bin/env bash\nexit 0\n") (fake_bin / "gh").chmod(0o755) env = dict(os.environ, PATH=str(fake_bin) + os.pathsep + os.environ["PATH"]) assets = tmp_path / "assets" result = _run_deploy( run_dir, "--assets-dir", str(assets), "--date", "20260911", "--draft", env=env) assert result.returncode == 0, result.stderr for asset, member in ( ("models_class1_pan.selected.20260911.tar.bz2", "models.combined/percent_ranks.json"), ("models_class1_presentation.20260911.tar.bz2", "models/percent_ranks.json")): with tarfile.open(assets / asset, "r:bz2") as archive: assert archive.extractfile(member).read().decode() == COMPACT_PERCENT_RANKS assert asset in (assets / "SHA256SUMS").read_text() @pytest.mark.parametrize("calibrated_dir", CALIBRATED_DIRS) def test_deploy_still_requires_a_percent_rank_calibration(tmp_path, calibrated_dir): run_dir = tmp_path / "release-run" _write_json_calibrated_run(run_dir) (run_dir / calibrated_dir / "percent_ranks.json").unlink() result = _run_deploy(run_dir, "--dry-run") assert result.returncode != 0 assert str(run_dir.resolve() / calibrated_dir / "percent_ranks.json") in result.stderr assert "tar -C" not in result.stdout + result.stderr def test_export_selected_weights_without_checkpoint_sidecars(tmp_path): import importlib.util import pandas spec = importlib.util.spec_from_file_location( "export_inference_models", REPO_ROOT / "scripts/release/export_inference_models.py") module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) source = tmp_path / "source" source.mkdir() manifest = pandas.DataFrame({ "model_name": ["selected"], "config_json": ["x" * 200000], "checkpoint_best_weights": ["checkpoints/best.npz"], }) manifest.to_csv(source / "manifest.csv", index=False) (source / "weights_selected.npz").write_bytes(b"selected") (source / "weights_orphan.npz").write_bytes(b"orphan") (source / "checkpoints").mkdir() (source / "checkpoints/best.npz").write_bytes(b"best") (source / "train_data.csv").write_text("peptide\nSIINFEKL\n") before = _sha256(source / "manifest.csv") dest = tmp_path / "export" module.export_models(source, dest) assert _sha256(source / "manifest.csv") == before assert (dest / "weights_selected.npz").read_bytes() == b"selected" assert not (dest / "weights_orphan.npz").exists() assert not (dest / "checkpoints").exists() assert (dest / "train_data.csv").read_bytes() == (source / "train_data.csv").read_bytes() pandas.testing.assert_frame_equal( pandas.read_csv(dest / "manifest.csv"), manifest.drop(columns="checkpoint_best_weights")) assert json.loads((dest / "inference_export.json").read_text())["manifests"][0]["source_sha256"] == before with pytest.raises(ValueError, match="already exists"): module.export_models(source, dest) (source / "weights_selected.npz").unlink() with pytest.raises(ValueError, match="Missing selected weights"): module.export_models(source, tmp_path / "missing") assert not (tmp_path / "missing").exists() mhcflurry-2.3.6/test/test_device_footprint.py000066400000000000000000000177751525677230600215260ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Tests for measurement-driven per-worker GPU memory estimates. The two ``assert`` blocks marked SANITY ANCHOR pin the estimators to values measured on the release pan-allele config; if you change the formulas, update these against fresh measurements rather than loosening them blindly. """ import json import pandas from mhcflurry.device_footprint import ( estimate_affinity_calibration_device_worker_gb as calibration_gb, estimate_affinity_training_device_worker_gb as training_gb, estimate_device_worker_gb, ) # Release pan-allele architecture: 10 networks, BLOSUM62 (21-wide), max_length # 15, post-merge dense [1024, 512], no peptide dense layers, minibatch 128. RELEASE_HYPERPARAMETERS = { "peptide_dense_layer_sizes": [], "layer_sizes": [1024, 512], "loss": "custom:mse_with_inequalities", "minibatch_size": 128, "peptide_encoding": {"max_length": 15, "vector_encoding_name": "BLOSUM62"}, } NO_LEGACY_VALIDATION_HYPERPARAMETERS = dict( RELEASE_HYPERPARAMETERS, loss="mse", ) RELEASE_NUM_NETWORKS = 10 RELEASE_TRAINING_ROWS = 249802 # curated affinity rows RELEASE_CALIBRATION_ROWS = 800000 # 1e5/length x 8 lengths RC14_TRAINING_ROWS = 994948 # raw rows before train command filters def _write_manifest(tmp_path, n_networks, hyperparameters): config = json.dumps({"hyperparameters": hyperparameters}) pandas.DataFrame({ "model_name": ["model_%d" % i for i in range(n_networks)], "config_json": [config] * n_networks, }).to_csv(tmp_path / "manifest.csv", index=False) # -------------------------------------------------------------------------- # Affinity calibration # -------------------------------------------------------------------------- def test_calibration_sanity_anchor(tmp_path): # SANITY ANCHOR: 800k-row universe x 10-net ensemble. The selected # release ensemble uses the merged fast path, whose cached peptide-stage # tensor is wider than the raw BLOSUM62 peptide vector in manifest.csv. _write_manifest(tmp_path, RELEASE_NUM_NETWORKS, RELEASE_HYPERPARAMETERS) gb = calibration_gb(str(tmp_path), RELEASE_CALIBRATION_ROWS) assert 30.0 < gb < 33.0, gb def test_calibration_scales_and_falls_back(tmp_path): _write_manifest(tmp_path, RELEASE_NUM_NETWORKS, RELEASE_HYPERPARAMETERS) small = calibration_gb(str(tmp_path), 8000) prod = calibration_gb(str(tmp_path), RELEASE_CALIBRATION_ROWS) huge = calibration_gb(str(tmp_path), 8000000) assert small < prod < huge assert small == 4.0 # tiny jobs floor at the minimum assert huge > 24.0 # huge jobs dwarf the old static 24 GB # Explicit peptide-stage layer overrides the encoding-derived width. _write_manifest(tmp_path, RELEASE_NUM_NETWORKS, { "peptide_dense_layer_sizes": [64, 32], "peptide_encoding": { "max_length": 15, "vector_encoding_name": "BLOSUM62"}, }) assert calibration_gb(str(tmp_path), RELEASE_CALIBRATION_ROWS) < prod # Unreadable model / empty job -> None (planner uses the profile default). assert calibration_gb(str(tmp_path / "missing"), 800000) is None assert calibration_gb(str(tmp_path), 0) is None def test_calibration_rc14_a100_40gb_worker_capacity(tmp_path, monkeypatch): """Calibration packs complete caches inside the shared VRAM reserve.""" from mhcflurry.parallelism import auto_max_workers_per_gpu _write_manifest(tmp_path, RELEASE_NUM_NETWORKS, RELEASE_HYPERPARAMETERS) worker_gb = calibration_gb(str(tmp_path), 400000) assert 14.0 < worker_gb < 18.0, worker_gb monkeypatch.setenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "40") assert auto_max_workers_per_gpu( num_jobs="auto", num_gpus=4, per_worker_gb=worker_gb, ) == 2 # -------------------------------------------------------------------------- # Affinity training # -------------------------------------------------------------------------- def test_training_sanity_anchor(): # Validation now accumulates exact numerator/denominator terms in elastic # batches, so it no longer contributes a full-fold launch-time peak. gb = training_gb(RELEASE_HYPERPARAMETERS, RELEASE_TRAINING_ROWS) assert gb == 2.5 def test_training_is_base_dominated_for_index_encoded_peptides(): # Peptides are int8 indices device-resident (the default), so the dataset # barely affects the minibatch-only footprint at normal scale: it is # base-dominated unless the legacy inequality validation path is active. release = training_gb( NO_LEGACY_VALIDATION_HYPERPARAMETERS, RELEASE_TRAINING_ROWS) five_million = training_gb( NO_LEGACY_VALIDATION_HYPERPARAMETERS, 5000000) assert abs(five_million - release) < 1.0 # ~flat with dataset size # Only an extreme row count materially raises the resident int8 term. assert training_gb( NO_LEGACY_VALIDATION_HYPERPARAMETERS, 50000000) > release + 1.0 # Batch size scales the (per-batch) activation term. assert (training_gb( NO_LEGACY_VALIDATION_HYPERPARAMETERS, RELEASE_TRAINING_ROWS, minibatch_size=32768) > release) # Missing hyperparameters / rows -> None. assert training_gb(None, RELEASE_TRAINING_ROWS) is None assert training_gb(RELEASE_HYPERPARAMETERS, 0) is None def test_training_rc14_worker_density_defaults(monkeypatch): """The rc14 release recipe has no obsolete full-validation VRAM peak.""" from mhcflurry.parallelism import auto_max_workers_per_gpu rc14_wide = dict( RELEASE_HYPERPARAMETERS, layer_sizes=[1024, 1024], minibatch_size=1024, ) # The old pre-fix benchmark peaked at 24.4 GiB because validation ran the # entire fold at once. Exact batched reduction removes that peak. benchmark_worker_gb = training_gb(rc14_wide, 943228) assert benchmark_worker_gb == 2.5 worker_gb = training_gb(rc14_wide, RC14_TRAINING_ROWS) assert worker_gb == 2.5 monkeypatch.setenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "40") assert auto_max_workers_per_gpu( num_jobs="auto", num_gpus=4, per_worker_gb=worker_gb, ) == 14 monkeypatch.setenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") assert auto_max_workers_per_gpu( num_jobs="auto", num_gpus=4, per_worker_gb=worker_gb, ) == 28 # -------------------------------------------------------------------------- # Unified dispatcher # -------------------------------------------------------------------------- def test_dispatcher_routes_by_workload(tmp_path): from mhcflurry.workload_planning import ( WORKLOAD_AFFINITY_CALIBRATION, WORKLOAD_AFFINITY_TRAINING, WORKLOAD_AFFINITY_SELECTION, ) _write_manifest(tmp_path, RELEASE_NUM_NETWORKS, RELEASE_HYPERPARAMETERS) assert estimate_device_worker_gb( WORKLOAD_AFFINITY_CALIBRATION, {"prediction_rows": RELEASE_CALIBRATION_ROWS}, models_dir=str(tmp_path)) == calibration_gb( str(tmp_path), RELEASE_CALIBRATION_ROWS) assert estimate_device_worker_gb( WORKLOAD_AFFINITY_TRAINING, {"training_rows": RELEASE_TRAINING_ROWS, "hyperparameters": RELEASE_HYPERPARAMETERS}) == training_gb( RELEASE_HYPERPARAMETERS, RELEASE_TRAINING_ROWS) # Workloads without an estimator fall through to the static profile default. assert estimate_device_worker_gb( WORKLOAD_AFFINITY_SELECTION, {}, models_dir=str(tmp_path)) is None mhcflurry-2.3.6/test/test_doctest.py000066400000000000000000000021601525677230600176060ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Run doctests. """ import os import doctest import pandas import pytest import mhcflurry import mhcflurry.class1_presentation_predictor os.environ["CUDA_VISIBLE_DEVICES"] = "" from mhcflurry.testing_utils import cleanup, startup @pytest.fixture(autouse=True, scope="module") def setup_doctests(): startup() yield cleanup() def test_doctests(): with pandas.option_context("display.precision", 3): for module in (mhcflurry, mhcflurry.class1_presentation_predictor): result = doctest.testmod(module) assert result.failed == 0, result mhcflurry-2.3.6/test/test_download_models_class1.py000066400000000000000000000106671525677230600225740ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import numpy import pickle import tempfile import pytest from mhcflurry import Class1AffinityPredictor, Class1NeuralNetwork from mhcflurry.testing_utils import cleanup, startup pytestmark = [pytest.mark.slow, pytest.mark.downloads] numpy.random.seed(0) SERIALIZATION_RTOL = 1e-6 DOWNLOADED_PREDICTOR = None def setup_module(): global DOWNLOADED_PREDICTOR startup() DOWNLOADED_PREDICTOR = Class1AffinityPredictor.load() def teardown_module(): global DOWNLOADED_PREDICTOR DOWNLOADED_PREDICTOR = None cleanup() @pytest.fixture(scope="module") def downloaded_predictor(): return DOWNLOADED_PREDICTOR def predict_and_check( downloaded_predictor, allele, peptide, expected_range=(0, 500)): print("\n%s" % ( downloaded_predictor.predict_to_dataframe( peptides=[peptide], allele=allele, include_individual_model_predictions=True))) (prediction,) = downloaded_predictor.predict(allele=allele, peptides=[peptide]) assert prediction >= expected_range[0], (downloaded_predictor, prediction) assert prediction <= expected_range[1], (downloaded_predictor, prediction) def test_a1_titin_epitope_downloaded_models(downloaded_predictor): # Test the A1 Titin epitope ESDPIVAQY from # Identification of a Titin-Derived HLA-A1-Presented Peptide # as a Cross-Reactive Target for Engineered MAGE A3-Directed # T Cells predict_and_check(downloaded_predictor, "HLA-A*01:01", "ESDPIVAQY") def test_a1_mage_epitope_downloaded_models(downloaded_predictor): # Test the A1 MAGE epitope EVDPIGHLY from # Identification of a Titin-Derived HLA-A1-Presented Peptide # as a Cross-Reactive Target for Engineered MAGE A3-Directed # T Cells predict_and_check(downloaded_predictor, "HLA-A*01:01", "EVDPIGHLY") def test_a2_hiv_epitope_downloaded_models(downloaded_predictor): # Test the A2 HIV epitope SLYNTVATL from # The HIV-1 HLA-A2-SLYNTVATL Is a Help-Independent CTL Epitope predict_and_check(downloaded_predictor, "HLA-A*02:01", "SLYNTVATL") def test_caching(downloaded_predictor): if not downloaded_predictor.allele_to_sequence: # Only run this test on allele-specific predictors. Class1NeuralNetwork.KERAS_MODELS_CACHE.clear() downloaded_predictor.predict( peptides=["SIINFEKL"], allele="HLA-A*02:01") num_cached = len(Class1NeuralNetwork.KERAS_MODELS_CACHE) assert num_cached > 0 def test_downloaded_predictor_is_serializable(downloaded_predictor): predictor_copy = pickle.loads(pickle.dumps(downloaded_predictor)) # Optimized pan-model round-trips can differ at float-noise level across # platforms, so require a tight numerical match rather than bitwise # equality. numpy.testing.assert_allclose( downloaded_predictor.predict( ["RSKERAVVVAW"], allele="HLA-A*01:01")[0], predictor_copy.predict( ["RSKERAVVVAW"], allele="HLA-A*01:01")[0], rtol=SERIALIZATION_RTOL, atol=0.0, ) def test_downloaded_predictor_is_savable(downloaded_predictor): models_dir = tempfile.mkdtemp("_models") print(models_dir) downloaded_predictor.save(models_dir) predictor_copy = Class1AffinityPredictor.load(models_dir) numpy.testing.assert_allclose( downloaded_predictor.predict( ["RSKERAVVVAW"], allele="HLA-A*01:01")[0], predictor_copy.predict( ["RSKERAVVVAW"], allele="HLA-A*01:01")[0], rtol=SERIALIZATION_RTOL, atol=0.0, ) def test_downloaded_predictor_gives_percentile_ranks(downloaded_predictor): predictions = downloaded_predictor.predict_to_dataframe( peptides=["SAQGQFSAV", "SAQGQFSAV"], alleles=["HLA-A*03:01", "HLA-C*01:02"]) print(predictions) assert not predictions.prediction.isnull().any() assert not predictions.prediction_percentile.isnull().any() mhcflurry-2.3.6/test/test_downloads_command.py000066400000000000000000000112151525677230600216320ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Tests for ``mhcflurry.downloads_command``.""" from argparse import Namespace from collections import OrderedDict import io import tarfile import pytest from mhcflurry import downloads from mhcflurry.cli import downloads_command from mhcflurry.downloads_command import suspicious_tar_member def _tar_info(name, type_=tarfile.REGTYPE, linkname=""): info = tarfile.TarInfo(name) info.type = type_ info.linkname = linkname return info def test_suspicious_tar_member_rejects_path_traversal_and_links(): assert not suspicious_tar_member(_tar_info("models/file.txt")) assert suspicious_tar_member(_tar_info("/tmp/file.txt")) assert suspicious_tar_member(_tar_info("../file.txt")) assert suspicious_tar_member(_tar_info("models/..")) assert suspicious_tar_member(_tar_info("models/../../file.txt")) assert suspicious_tar_member(_tar_info("models/link", tarfile.SYMTYPE, "../x")) assert suspicious_tar_member(_tar_info("models/hard", tarfile.LNKTYPE, "../x")) def test_explicit_release_with_custom_downloads_dir(tmp_path, monkeypatch): """An explicit release must work when the custom-dir override is active.""" release = "test-release" monkeypatch.setattr(downloads, "_DOWNLOADS_DIR", str(tmp_path)) monkeypatch.setattr(downloads, "_CURRENT_RELEASE", None) monkeypatch.setattr(downloads, "_METADATA", { "releases": { release: { "downloads": [{ "name": "models", "default": False, "url": "https://example.invalid/models.tar.bz2", }], }, }, }) available = downloads.get_release_downloads(release) assert list(available) == ["models"] assert not available["models"]["downloaded"] def test_fetch_uses_explicit_release(tmp_path, monkeypatch): seen_releases = [] def fake_downloads(release): seen_releases.append(release) return OrderedDict() monkeypatch.setattr( downloads_command, "get_release_downloads", fake_downloads) monkeypatch.setattr( downloads_command, "get_downloads_dir", lambda release=None: str(tmp_path)) downloads_command.fetch_subcommand(Namespace( quiet=True, release="test-release", download_name=[], already_downloaded_dir=None, keep=False, )) assert seen_releases == ["test-release"] @pytest.mark.parametrize("custom_dir", [False, True]) def test_fetch_requested_release_uses_its_own_status_and_destination( tmp_path, monkeypatch, capsys, custom_dir): current_dir = tmp_path / "current" (current_dir / "models").mkdir(parents=True) (current_dir / "models" / "sentinel").write_text("current weights") destination = tmp_path / ("custom" if custom_dir else "older") monkeypatch.setattr(downloads, "_DOWNLOADS_DIR", str( destination if custom_dir else current_dir)) monkeypatch.setattr(downloads, "_CURRENT_RELEASE", None if custom_dir else "current") monkeypatch.setattr(downloads, "_METADATA", {"releases": {"older": { "downloads": [{"name": "models", "default": True, "url": "https://example.invalid/models.tar.bz2"}], }}}) archives = tmp_path / "archives" archives.mkdir() with tarfile.open(archives / "models.tar.bz2", "w:bz2") as archive: member = tarfile.TarInfo("weights.txt") member.size = len(b"older weights") archive.addfile(member, io.BytesIO(b"older weights")) args = Namespace(quiet=True, release="older", download_name=["models"], already_downloaded_dir=str(archives), keep=False) assert not downloads.get_release_downloads("older")["models"]["downloaded"] downloads_command.fetch_subcommand(args) assert (destination / "models/weights.txt").read_text() == "older weights" assert (current_dir / "models/sentinel").read_text() == "current weights" assert not (current_dir / "models/weights.txt").exists() assert downloads.get_release_downloads("older")["models"]["up_to_date"] downloads_command.fetch_subcommand(args) assert str(destination / "models") in capsys.readouterr().out mhcflurry-2.3.6/test/test_encoding_cache_training_integration.py000066400000000000000000000763051525677230600253640ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """End-to-end integration tests for device-resident affinity training.""" from __future__ import annotations import pickle import random import numpy import pandas import pytest import torch from mhcflurry.allele_encoding import AlleleEncoding from mhcflurry.class1_neural_network import Class1NeuralNetwork from mhcflurry.class1_training import ( _StreamingBatchIterableDataset, ) from mhcflurry.common import configure_pytorch from mhcflurry.encodable_sequences import EncodableSequences # Tiny but real: enough rows for a minibatch, enough length variety to # exercise the encoder, small enough that 2 epochs finish in under a second. TRAIN_PEPTIDES = [ "SIINFEKL", "GILGFVFTL", "NLVPMVATV", "YLQPRTFLL", "KLVALGINAV", "FLRGRAYGL", "ELAGIGILTV", "RMFPNAPYL", "AAAAAAAAA", "KLIETYFSKK", "YVNVNMGLK", "ILKEPVHGV", "VLFRGGPRGSL", "FEDLRVLSF", "TPGPGVRYPL", "QYDPVAALF", "RMPEAAPPV", "IMDQVPFSV", "LLDFVRFMGV", "VQMENKLTL", "FVLELEPEWTV", "ELAGIGILT", "GLQDCTMLV", "WLSLLVPFV", "FLPSDFFPSV", "KAFSPEVIPMF", "FLYGKLILAS", "VLSPFPPKV", "SLYNTVATL", "GPGHKARVL", ] TRAIN_ALLELES_CYCLE = ["HLA-A*02:01", "HLA-B*07:02", "HLA-A*01:01"] ALLELE_TO_SEQUENCE = { "HLA-A*02:01": "YFAMYQENMAHTDANTLYLNYHDYTWAVLAYTWYG", "HLA-B*07:02": "YFSTSVSRPGRGEPRFIAVGYVDDTQFVRFDSDAA", "HLA-A*01:01": "YFSTSISRPGRGEPRFIAVGYIDDTQFVRFDSDAA", } DEFAULT_PEPTIDE_ENCODING = { "alignment_method": "left_pad_centered_right_pad", "max_length": 15, "vector_encoding_name": "BLOSUM62", } _PREENCODED_BATCHES = [ ( { "peptide": EncodableSequences(TRAIN_PEPTIDES[:4]) .variable_length_to_fixed_length_vector_encoding( **DEFAULT_PEPTIDE_ENCODING ), "allele": numpy.array([0, 1, 2, 0], dtype=numpy.int64), }, numpy.array([0.05, 0.25, 0.75, 0.95], dtype=numpy.float32), ), ( { "peptide": EncodableSequences(TRAIN_PEPTIDES[4:8]) .variable_length_to_fixed_length_vector_encoding( **DEFAULT_PEPTIDE_ENCODING ), "allele": numpy.array([1, 2, 0, 1], dtype=numpy.int64), }, numpy.array([0.15, 0.35, 0.65, 0.85], dtype=numpy.float32), ), ] def _make_preencoded_fit_generator(worker_id=0, num_workers=1): for idx, (x_dict, y) in enumerate(_PREENCODED_BATCHES): if idx % num_workers != worker_id: continue yield ( {key: value.copy() for key, value in x_dict.items()}, y.copy(), ) def _seed_everything(seed=12345): """Seed every RNG the training code touches.""" random.seed(seed) numpy.random.seed(seed) torch.manual_seed(seed) # Force deterministic algorithms on CPU paths. torch.use_deterministic_algorithms # raises on ops that have no deterministic impl — we don't use any such ops # here, so the flag is safe. torch.use_deterministic_algorithms(True) def _build_training_data(): """Return a DataFrame with peptide, allele, measurement_value columns.""" rng = numpy.random.default_rng(0) rows = [] for i, peptide in enumerate(TRAIN_PEPTIDES): allele = TRAIN_ALLELES_CYCLE[i % len(TRAIN_ALLELES_CYCLE)] # Affinities in nM; mix of binders and non-binders. measurement = float(rng.choice([50.0, 500.0, 10000.0])) rows.append( {"peptide": peptide, "allele": allele, "measurement_value": measurement} ) return pandas.DataFrame(rows) def _tiny_hyperparameters(): """Hyperparameters sized so 2 epochs run in <1 second. Shaped to match the pan-allele defaults produced by downloads-generation/models_class1_pan/generate_hyperparameters.py — specifically peptide/allele merge via concatenate, small layer sizes, dropout off (determinism), early stopping off (epoch count fixed). """ return { "peptide_encoding": DEFAULT_PEPTIDE_ENCODING, "max_epochs": 2, "minibatch_size": 8, # Architecture — sized tiny for test speed. "layer_sizes": [16], "peptide_dense_layer_sizes": [], "allele_dense_layer_sizes": [], "locally_connected_layers": [], "peptide_allele_merge_method": "concatenate", "peptide_allele_merge_activation": "", "peptide_amino_acid_encoding": "BLOSUM62", "topology": "feedforward", # Regularization off for determinism across runs. "dropout_probability": 0.0, "batch_normalization": False, "dense_layer_l1_regularization": 0.0, "dense_layer_l2_regularization": 0.0, # Training control. "validation_split": 0.2, "early_stopping": False, "patience": 100, "min_delta": 0.0, "learning_rate": 0.001, "loss": "custom:mse_with_inequalities", "optimizer": "rmsprop", "activation": "tanh", "output_activation": "sigmoid", "init": "glorot_uniform", "data_dependent_initialization_method": "lsuv", # Random negatives — pan-allele path. "random_negative_rate": 1.0, "random_negative_method": "by_allele_equalize_nonbinders", "random_negative_affinity_min": 30000.0, "random_negative_affinity_max": 50000.0, "random_negative_binder_threshold": 500.0, "random_negative_constant": 1, "random_negative_distribution_smoothing": 0.0, "random_negative_match_distribution": True, } def _train_one_run(peptides_arg, training_df, allele_encoding): """Build + train a Class1NeuralNetwork once, return (fit_info, state_dict). ``peptides_arg`` is either a plain EncodableSequences (old path) or a prepopulated one (new path). Downstream code in ``fit()`` doesn't know which it got — and that's the point. """ network = Class1NeuralNetwork(**_tiny_hyperparameters()) network.fit( peptides=peptides_arg, affinities=training_df.measurement_value.values, allele_encoding=allele_encoding, verbose=0, progress_print_interval=None, ) fit_info = network.fit_info[-1] # .state_dict() returns tensors on whatever device they're on; we force # CPU above, so these are CPU tensors ready to compare. state_dict = {k: v.detach().cpu().clone() for k, v in network.network().state_dict().items()} return fit_info, state_dict @pytest.fixture(autouse=True) def force_cpu_backend(): """Ensure all training in this file runs on CPU for determinism.""" configure_pytorch(backend="cpu") yield # Leave backend as-is for any follow-on tests; they'll reconfigure as needed. @pytest.fixture def training_df(): return _build_training_data() @pytest.fixture def allele_encoding(training_df): return AlleleEncoding( alleles=training_df.allele.values, allele_to_sequence=ALLELE_TO_SEQUENCE, ) def test_training_weights_differ_with_different_seeds( training_df, allele_encoding ): """Sanity: with different seeds, weights should differ. Guards against the above test passing trivially — e.g. if the ``_seed_everything`` calls were accidentally no-ops or the model always converged to a fixed point regardless of seed. If this test fails (weights identical under different seeds), the bit-identical test above proves nothing. """ _seed_everything(seed=12345) peptides1 = EncodableSequences(training_df.peptide.values) _, weights1 = _train_one_run(peptides1, training_df, allele_encoding) _seed_everything(seed=67890) peptides2 = EncodableSequences(training_df.peptide.values) _, weights2 = _train_one_run(peptides2, training_df, allele_encoding) # At least one parameter should differ between the two seeds. any_diff = any( not torch.equal(weights1[k], weights2[k]) for k in weights1 ) assert any_diff, ( "weights identical across different seeds — seeding is broken, " "which would make the bit-identical test above a tautology" ) def test_training_loss_decreases(training_df, allele_encoding): """Sanity: training should actually make the loss go down. Not strictly required by the bit-identical test but useful as a basic sanity check that the tiny model + data set up above is actually training, not just producing noise. """ _seed_everything() peptides = EncodableSequences(training_df.peptide.values) fit_info, _ = _train_one_run(peptides, training_df, allele_encoding) losses = fit_info["loss"] # 2 epochs, last should be lower than first (or at least not exploding). assert len(losses) >= 2 assert losses[-1] < losses[0] * 2.0, ( f"loss didn't improve: {losses} — training sanity check failed" ) # ---- Affinity fit ignores streaming DataLoader worker setting ---- def _train_with_workers( peptides_arg, training_df, allele_encoding, num_workers, ): """Train with the streaming-pretrain worker knob set to a chosen value.""" hp = _tiny_hyperparameters() hp["dataloader_num_workers"] = num_workers network = Class1NeuralNetwork(**hp) network.fit( peptides=peptides_arg, affinities=training_df.measurement_value.values, allele_encoding=allele_encoding, verbose=0, progress_print_interval=None, ) fit_info = network.fit_info[-1] state_dict = { k: v.detach().cpu().clone() for k, v in network.network().state_dict().items() } return fit_info, state_dict def test_dataloader_num_workers_0_matches_baseline( training_df, allele_encoding ): """Affinity fit is self-reproducible when the worker knob is 0. Affinity fit is device-resident and no longer uses a DataLoader for minibatches. This pins the baseline contract before comparing that the streaming-pretrain worker knob has no effect on affinity fit. """ # The main integration test above already exercises num_workers=0 as # the default, so if this test passes we know the default path is # bit-identical. We explicitly set num_workers=0 to pin the test to # that contract rather than relying on a default value. _seed_everything() peptides_a = EncodableSequences(training_df.peptide.values) fit_a, weights_a = _train_with_workers( peptides_a, training_df, allele_encoding, num_workers=0 ) _seed_everything() peptides_b = EncodableSequences(training_df.peptide.values) fit_b, weights_b = _train_with_workers( peptides_b, training_df, allele_encoding, num_workers=0 ) numpy.testing.assert_array_equal(fit_a["loss"], fit_b["loss"]) numpy.testing.assert_array_equal(fit_a["val_loss"], fit_b["val_loss"]) for k in weights_a: assert torch.equal(weights_a[k], weights_b[k]), ( f"num_workers=0 training is not self-reproducible at key {k!r}" ) def test_dataloader_num_workers_2_matches_num_workers_0( training_df, allele_encoding ): """The streaming-pretrain worker knob must not alter affinity fit. `dataloader_num_workers` controls the streaming pretraining path. Affinity fine-tuning forms batches from device-resident tensors, so setting this hyperparameter must not change losses or weights. """ _seed_everything() peptides_baseline = EncodableSequences(training_df.peptide.values) fit_baseline, weights_baseline = _train_with_workers( peptides_baseline, training_df, allele_encoding, num_workers=0 ) _seed_everything() peptides_prefetch = EncodableSequences(training_df.peptide.values) fit_prefetch, weights_prefetch = _train_with_workers( peptides_prefetch, training_df, allele_encoding, num_workers=2 ) numpy.testing.assert_array_equal(fit_baseline["loss"], fit_prefetch["loss"]) numpy.testing.assert_array_equal( fit_baseline["val_loss"], fit_prefetch["val_loss"] ) for k in weights_baseline: assert torch.equal(weights_baseline[k], weights_prefetch[k]), ( f"num_workers=2 diverges from num_workers=0 at key {k!r} — " f"prefetching path introduced nondeterminism" ) def test_fit_generator_self_reproducible(training_df, allele_encoding): """fit_generator with the val-tensor hoist must be self-reproducible. Regression lock for the val-tensor hoist: - val_peptide_device / val_allele_device / val_y_device are allocated once before the epoch loop instead of re-materialized per epoch. - Validation uses those device tensors directly. Running the same seeded fit_generator twice must produce bit-identical loss and val_loss trajectories. If the hoist accidentally reuses the tensor in a way that leaks state across epochs (e.g. in-place modification, gradient accumulation on a frozen graph), this test will catch it. """ _seed_everything(seed=24680) peptides = EncodableSequences(TRAIN_PEPTIDES[:16]) affinities = numpy.linspace(50.0, 50000.0, 16) allele_list = [TRAIN_ALLELES_CYCLE[i % 3] for i in range(16)] alleles = AlleleEncoding( alleles=allele_list, allele_to_sequence=ALLELE_TO_SEQUENCE, ) hp = _tiny_hyperparameters() def make_generator(): # Two chunks; first 8 peptides then next 8. for start in (0, 8): chunk_peptides = EncodableSequences(TRAIN_PEPTIDES[start:start + 8]) chunk_alleles = AlleleEncoding( alleles=allele_list[start:start + 8], allele_to_sequence=ALLELE_TO_SEQUENCE, ) yield (chunk_alleles, chunk_peptides, affinities[start:start + 8]) def run_once(): _seed_everything(seed=24680) net = Class1NeuralNetwork(**hp) # Create the network via a dummy call to fit() first; or let # fit_generator build it. net.fit_generator( generator=make_generator(), validation_peptide_encoding=peptides, validation_affinities=affinities, validation_allele_encoding=alleles, steps_per_epoch=2, epochs=3, min_epochs=3, patience=100, verbose=0, progress_print_interval=None, ) info = net.fit_info[-1] return list(info["loss"]), list(info["val_loss"]) loss_a, val_a = run_once() loss_b, val_b = run_once() numpy.testing.assert_array_equal(loss_a, loss_b) numpy.testing.assert_array_equal(val_a, val_b) def test_fit_generator_validation_tensors_hoisted_once( training_df, allele_encoding ): """The val-tensor H2D happens ONCE, not per epoch. Spy on torch.from_numpy to count calls during fit_generator. Before the hoist: 3 calls (peptide, allele, y) × N epochs. After: 3 calls up front, zero inside the epoch loop for validation. This is a perf-regression guard — if someone refactors fit_generator and moves the val H2D back inside the epoch loop, this test fires. """ import torch as _torch _seed_everything(seed=24680) peptides = EncodableSequences(TRAIN_PEPTIDES[:8]) affinities = numpy.linspace(50.0, 50000.0, 8) allele_list = [TRAIN_ALLELES_CYCLE[i % 3] for i in range(8)] alleles = AlleleEncoding( alleles=allele_list, allele_to_sequence=ALLELE_TO_SEQUENCE, ) def make_generator(): yield (alleles, peptides, affinities) hp = _tiny_hyperparameters() net = Class1NeuralNetwork(**hp) # Count all torch.from_numpy calls under fit_generator. The # per-step training loop calls it 3× (peptide/allele/y). The val # side should call it 3× TOTAL (hoisted), not 3× per epoch. call_count = [0] orig = _torch.from_numpy def spy(a): call_count[0] += 1 return orig(a) _torch.from_numpy = spy try: net.fit_generator( generator=make_generator(), validation_peptide_encoding=peptides, validation_affinities=affinities, validation_allele_encoding=alleles, steps_per_epoch=1, epochs=5, min_epochs=5, patience=100, verbose=0, progress_print_interval=None, ) finally: _torch.from_numpy = orig # Expected calls: 3 val-hoist up front + 3 per training step × 5 epochs # × 1 step = 15. Total = 18. Budget it loosely (±5) to tolerate other # numpy→torch conversions (e.g. loss internals) without hardcoding # an exact number. expected_max = 3 + (3 * 5) + 5 # hoist + step + slack assert call_count[0] <= expected_max, ( f"torch.from_numpy called {call_count[0]} times in a 5-epoch run. " f"Expected ~{expected_max}. If this ballooned, the val-tensor " f"hoist regressed — H2D is running per-epoch again." ) def test_fit_generator_supports_allele_specific_mode(): """Regression test: fit_generator must work with ``alleles=None``. ``fit()`` already supports allele-specific models via ``allele_encoding=None``. ``fit_generator`` should support the same mode; otherwise any caller that pretrains or streams data into an allele-specific model crashes on ``None.indices`` before the first epoch. """ _seed_everything(seed=13579) peptides = EncodableSequences(TRAIN_PEPTIDES[:16]) affinities = numpy.linspace(50.0, 50000.0, 16) hp = _tiny_hyperparameters() def make_generator(): for start in (0, 8): yield ( None, EncodableSequences(TRAIN_PEPTIDES[start:start + 8]), affinities[start:start + 8], ) net = Class1NeuralNetwork(**hp) net.fit_generator( generator=make_generator(), validation_peptide_encoding=peptides, validation_affinities=affinities, validation_allele_encoding=None, steps_per_epoch=2, epochs=2, min_epochs=2, patience=100, verbose=0, progress_print_interval=None, ) info = net.fit_info[-1] assert len(info["loss"]) == 2 assert len(info["val_loss"]) == 2 def test_fit_generator_supports_variable_tail_batches(): """Short final generator batches must run instead of being rejected.""" _seed_everything(seed=97531) peptides = EncodableSequences(TRAIN_PEPTIDES[:13]) affinities = numpy.linspace(50.0, 50000.0, 13) allele_list = [TRAIN_ALLELES_CYCLE[i % 3] for i in range(13)] alleles = AlleleEncoding( alleles=allele_list, allele_to_sequence=ALLELE_TO_SEQUENCE, ) hp = _tiny_hyperparameters() def make_generator(): first = AlleleEncoding( alleles=allele_list[:8], allele_to_sequence=ALLELE_TO_SEQUENCE, ) second = AlleleEncoding( alleles=allele_list[8:], allele_to_sequence=ALLELE_TO_SEQUENCE, ) yield ( first, EncodableSequences(TRAIN_PEPTIDES[:8]), affinities[:8], ) yield ( second, EncodableSequences(TRAIN_PEPTIDES[8:13]), affinities[8:13], ) net = Class1NeuralNetwork(**hp) net.fit_generator( generator=make_generator(), validation_peptide_encoding=peptides, validation_affinities=affinities, validation_allele_encoding=alleles, steps_per_epoch=2, epochs=2, min_epochs=2, patience=100, verbose=0, progress_print_interval=None, ) info = net.fit_info[-1] assert len(info["loss"]) == 2 assert len(info["val_loss"]) == 2 def test_fit_generator_preencoded_batches_support_dataloader_workers(): """Pre-encoded generator batches must work through a worker DataLoader.""" _seed_everything(seed=86420) peptides = EncodableSequences(TRAIN_PEPTIDES[:8]) affinities = numpy.linspace(50.0, 50000.0, 8) allele_list = [TRAIN_ALLELES_CYCLE[i % 3] for i in range(8)] alleles = AlleleEncoding( alleles=allele_list, allele_to_sequence=ALLELE_TO_SEQUENCE, ) hp = _tiny_hyperparameters() hp["dataloader_num_workers"] = 1 net = Class1NeuralNetwork(**hp) net.fit_generator( generator=(), generator_factory=_make_preencoded_fit_generator, generator_batches_are_encoded=True, validation_peptide_encoding=peptides, validation_affinities=affinities, validation_allele_encoding=alleles, steps_per_epoch=2, epochs=1, min_epochs=1, patience=100, verbose=0, progress_print_interval=None, ) info = net.fit_info[-1] assert len(info["loss"]) == 1 assert len(info["val_loss"]) == 1 assert info["num_points"] == 8 def test_fit_generator_restarts_factory_after_exhaustion(): """Finite factory sources must restart instead of producing empty epochs.""" _seed_everything(seed=75319) peptides = EncodableSequences(TRAIN_PEPTIDES[:8]) affinities = numpy.linspace(50.0, 50000.0, 8) allele_list = [TRAIN_ALLELES_CYCLE[i % 3] for i in range(8)] alleles = AlleleEncoding( alleles=allele_list, allele_to_sequence=ALLELE_TO_SEQUENCE, ) hp = _tiny_hyperparameters() def one_batch_factory(worker_id=0, num_workers=1): assert worker_id == 0 assert num_workers == 1 x_dict, y = _PREENCODED_BATCHES[0] yield ( {key: value.copy() for key, value in x_dict.items()}, y.copy(), ) net = Class1NeuralNetwork(**hp) net.fit_generator( generator=(), generator_factory=one_batch_factory, generator_batches_are_encoded=True, validation_peptide_encoding=peptides, validation_affinities=affinities, validation_allele_encoding=alleles, steps_per_epoch=2, epochs=2, min_epochs=2, patience=100, verbose=0, progress_print_interval=None, ) info = net.fit_info[-1] assert len(info["loss"]) == 2 assert numpy.isfinite(info["loss"]).all() assert info["num_points"] == 16 assert info["iterator_restarts"] >= 3 def test_fit_generator_validation_interval_skips_off_interval_epochs(): """Streaming training should share fit() validation cadence semantics.""" _seed_everything(seed=19840) peptides = EncodableSequences(TRAIN_PEPTIDES[:8]) affinities = numpy.linspace(50.0, 50000.0, 8) allele_list = [TRAIN_ALLELES_CYCLE[i % 3] for i in range(8)] alleles = AlleleEncoding( alleles=allele_list, allele_to_sequence=ALLELE_TO_SEQUENCE, ) hp = _tiny_hyperparameters() hp["validation_interval"] = 3 net = Class1NeuralNetwork(**hp) net.fit_generator( generator=(), generator_factory=_make_preencoded_fit_generator, generator_batches_are_encoded=True, validation_peptide_encoding=peptides, validation_affinities=affinities, validation_allele_encoding=alleles, steps_per_epoch=1, epochs=5, min_epochs=5, patience=100, verbose=0, progress_print_interval=None, ) val_loss = net.fit_info[-1]["val_loss"] assert len(val_loss) == 5 assert val_loss[1] == val_loss[0] assert val_loss[2] == val_loss[0] def test_fit_generator_dataset_is_picklable_with_live_generator(): """Dataset must pickle cleanly even when caller passes a live generator. Regression for the 2026-04-23 8×A100 training crash: the pretrain caller builds ``generator=make_pretrain_generator()`` (a live generator object) alongside ``generator_factory=make_pretrain_generator``. Under ``dataloader_num_workers>0``, PyTorch spawns workers via ``ForkingPickler``, which chokes on the live generator with ``TypeError: cannot pickle 'generator' object``. The dataset must drop the live generator when a factory is present so pickling goes through the factory only. """ live_generator = _make_preencoded_fit_generator() assert isinstance(live_generator, type((x for x in ()))), \ "test premise: _make_preencoded_fit_generator returns a generator" dataset = _StreamingBatchIterableDataset( generator=live_generator, generator_factory=_make_preencoded_fit_generator, source_batches_are_encoded=True, ) # Pickle round-trip must succeed. This is what DataLoader does to # ship the dataset to spawned workers. payload = pickle.dumps(dataset) restored = pickle.loads(payload) assert restored.generator is None assert restored.generator_factory is _make_preencoded_fit_generator assert restored.source_batches_are_encoded is True def test_fit_generator_dataset_drops_bound_methods_on_encoded_path(): """Pre-encoded path must not retain bound methods of the network. Even after the live-generator fix, if the dataset held ``self.peptides_to_network_input = net.peptides_to_network_input`` (a bound method), pickling would drag the whole ``Class1NeuralNetwork`` into every spawned worker — both heavy and sometimes outright unpicklable. The encoded-batch path never reads those callbacks, so the dataset must drop them at construction. """ net = Class1NeuralNetwork(**_tiny_hyperparameters()) dataset = _StreamingBatchIterableDataset( generator=(), generator_factory=_make_preencoded_fit_generator, source_batches_are_encoded=True, allele_encoding_to_input=net.allele_encoding_to_network_input, peptides_to_network_input=net.peptides_to_network_input, ) assert dataset.allele_encoding_to_input is None assert dataset.peptides_to_network_input is None # And the dataset pickles cleanly — without a bound-method # reference, there's no path for the network to tag along. pickle.dumps(dataset) def test_fit_generator_dataset_keeps_callbacks_on_raw_path(): """Raw-tuple path must retain the encoding callbacks — they're used.""" net = Class1NeuralNetwork(**_tiny_hyperparameters()) dataset = _StreamingBatchIterableDataset( generator=iter(()), # empty, but live-generator-shaped generator_factory=None, source_batches_are_encoded=False, allele_encoding_to_input=net.allele_encoding_to_network_input, peptides_to_network_input=net.peptides_to_network_input, ) assert dataset.allele_encoding_to_input is not None assert dataset.peptides_to_network_input is not None def test_fit_generator_downgrades_num_workers_without_factory(caplog): """No factory → must downgrade to num_workers=0 with a warning. Worker-prefetch needs a picklable per-worker source. Without ``generator_factory``, the dataset can only iterate the single main-process generator — which can't be sharded and can't be pickled. fit_generator must detect this and downgrade rather than letting the DataLoader crash at worker spawn. """ _seed_everything(seed=13579) peptides = EncodableSequences(TRAIN_PEPTIDES[:8]) affinities = numpy.linspace(50.0, 50000.0, 8) allele_list = [TRAIN_ALLELES_CYCLE[i % 3] for i in range(8)] alleles = AlleleEncoding( alleles=allele_list, allele_to_sequence=ALLELE_TO_SEQUENCE, ) hp = _tiny_hyperparameters() hp["dataloader_num_workers"] = 2 net = Class1NeuralNetwork(**hp) with caplog.at_level("WARNING", logger="root"): net.fit_generator( generator=_make_preencoded_fit_generator(), generator_factory=None, # the load-bearing omission generator_batches_are_encoded=True, validation_peptide_encoding=peptides, validation_affinities=affinities, validation_allele_encoding=alleles, steps_per_epoch=2, epochs=1, min_epochs=1, patience=100, verbose=0, progress_print_interval=None, ) info = net.fit_info[-1] assert info["dataloader_num_workers"] == 2, \ "recorded value reflects the request, not the downgrade" assert any( "downgrading to 0" in rec.message for rec in caplog.records ), "expected a downgrade warning in the log" def test_fit_generator_downgrades_num_workers_on_raw_batches(caplog): """Raw-batch (non-encoded) source + factory → must still downgrade. Second downgrade trigger (the ``generator_batches_are_encoded=False`` side). The dataset on the raw path stores bound methods of the ``Class1NeuralNetwork`` instance (``peptides_to_network_input``, ``allele_encoding_to_network_input``), and pickling those drags the whole network into every worker — which is wrong. Worker- prefetch must only activate when batches are pre-encoded AND a factory is present. See a286d51 (``_StreamingBatchIterableDataset`` downgrade check). """ _seed_everything(seed=13580) peptides = EncodableSequences(TRAIN_PEPTIDES[:8]) affinities = numpy.linspace(50.0, 50000.0, 8) allele_list = [TRAIN_ALLELES_CYCLE[i % 3] for i in range(8)] alleles = AlleleEncoding( alleles=allele_list, allele_to_sequence=ALLELE_TO_SEQUENCE, ) hp = _tiny_hyperparameters() hp["dataloader_num_workers"] = 2 # Build a raw-batch generator + factory. The factory is picklable, # but the source says "batches arrive unencoded" — so the dataset # would store network bound-method references that the worker # pickler couldn't ship safely. The downgrade must fire BEFORE # that pickle would be attempted. def raw_batch_factory(worker_id=0, num_workers=1): del worker_id, num_workers # shard-agnostic for this tiny test for _ in range(2): yield { "peptide": list(TRAIN_PEPTIDES[:4]), "allele": [TRAIN_ALLELES_CYCLE[i % 3] for i in range(4)], "affinity": numpy.linspace(50.0, 50000.0, 4), } net = Class1NeuralNetwork(**hp) # The downgrade happens BEFORE any actual training work — we only # care that the log is emitted. The raw-batch path can legitimately # fail downstream in this minimal scaffolding (the test peptide / # allele shapes aren't the raw decoder's expected format), but # that's orthogonal to the assertion here. with caplog.at_level("WARNING", logger="root"): try: net.fit_generator( generator=raw_batch_factory(), generator_factory=raw_batch_factory, generator_batches_are_encoded=False, # the trigger validation_peptide_encoding=peptides, validation_affinities=affinities, validation_allele_encoding=alleles, steps_per_epoch=2, epochs=1, min_epochs=1, patience=100, verbose=0, progress_print_interval=None, ) except Exception: # Downstream raw-path failure is acceptable — we're # asserting the downgrade fires, not that the raw path # works end-to-end in this tiny harness. pass assert any( "downgrading to 0" in rec.message for rec in caplog.records ), "expected a downgrade warning for raw-batch path" mhcflurry-2.3.6/test/test_ensemble_centrality.py000066400000000000000000000035651525677230600222030ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import numpy import warnings from numpy.testing import assert_equal from mhcflurry import ensemble_centrality def test_robust_mean(): arr1 = numpy.array([ [1, 2, 3, 4, 5], [-10000, 2, 3, 4, 100], ]) results = ensemble_centrality.robust_mean(arr1) assert_equal(results, [3, 3]) # Should ignore nans. arr2 = numpy.array([ [1, 2, 3, 4, 5], [numpy.nan, 1, 2, 3, numpy.nan], [numpy.nan, numpy.nan, numpy.nan, numpy.nan, numpy.nan], ]) results = ensemble_centrality.CENTRALITY_MEASURES["robust_mean"](arr2) assert_equal(results, [3, 2, numpy.nan]) results = ensemble_centrality.CENTRALITY_MEASURES["mean"](arr2) assert_equal(results, [3, 2, numpy.nan]) def test_no_runtime_warnings_for_all_nan_rows(): arr = numpy.array([ [numpy.nan, numpy.nan, numpy.nan], [1.0, 2.0, numpy.nan], ]) with warnings.catch_warnings(): warnings.simplefilter("error", RuntimeWarning) mean = ensemble_centrality.CENTRALITY_MEASURES["mean"](arr) median = ensemble_centrality.CENTRALITY_MEASURES["median"](arr) robust = ensemble_centrality.CENTRALITY_MEASURES["robust_mean"](arr) assert numpy.isnan(mean[0]) and mean[1] == 1.5 assert numpy.isnan(median[0]) and median[1] == 1.5 assert numpy.isnan(robust[0]) and robust[1] == 1.5 mhcflurry-2.3.6/test/test_exact_public_processing.py000066400000000000000000000136041525677230600230440ustar00rootroot00000000000000import importlib.util from pathlib import Path import numpy import pandas import pytest @pytest.fixture def driver_module(monkeypatch): directory = Path(__file__).resolve().parents[1] / "scripts/training" monkeypatch.syspath_prepend(str(directory)) spec = importlib.util.spec_from_file_location("exact_public", directory / "run_exact_public_processing.py") module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module def test_exact_public_design_is_eight_matched_networks(driver_module): records = [record for record in driver_module.build_conditions( architectures=["large_relu"], peptide_context_lengths=[5]) if record[0] in driver_module.CONDITIONS] assert len(records) == 2 assert all(len(record[1]) == 1 for record in records) legacy, boundary = (record[1][0] for record in records) changes = {key for key in set(legacy) | set(boundary) if legacy.get(key) != boundary.get(key)} assert changes == {"flanking_averages", "cleavage_boundary_flank_length", "cleavage_boundary_peptide_length", "cleavage_boundary_hidden_size", "cleavage_boundary_context_dropout"} assert boundary["cleavage_boundary_peptide_length"] == 5 assert legacy["minibatch_size"] == boundary["minibatch_size"] == 512 def test_score_cache_rejects_changed_inputs_weights_and_corruption(tmp_path, driver_module): model = tmp_path / "model" model.mkdir() weights = model / "weights.bin" weights.write_bytes(b"initial") data = pandas.DataFrame({"peptide": ["A", "B"]}) calls = [] def calculate(): calls.append(True) return [0.1, 0.2] def cached(digest="input1"): return driver_module.cached_scores(tmp_path, "test", data, digest, model, calculate) numpy.testing.assert_array_equal(cached(), cached()) assert len(calls) == 1 cached("input2") assert len(calls) == 2 weights.write_bytes(b"changed") cached("input2") assert len(calls) == 3 (tmp_path / "component_scores/test.npy").write_bytes(b"corrupt") cached("input2") assert len(calls) == 4 def test_public_input_gate_checks_hashes_and_holdout(tmp_path, driver_module, monkeypatch): processing = tmp_path / "processing.csv" presentation = tmp_path / "presentation.csv" holdout = tmp_path / "holdout" holdout.mkdir() pandas.DataFrame({"sample_id": ["heldout"]}).to_csv(holdout / "processing_samples.csv", index=False) pandas.DataFrame({"sample_id": ["heldout"]}).to_csv(holdout / "presentation_samples.csv", index=False) data = pandas.DataFrame({"sample_id": ["a", "b"], **{ "fold_%d" % i: [True, False] for i in range(4)}}) data.to_csv(processing, index=False) data.to_csv(presentation, index=False) for name, path in (("PROCESSING", processing), ("PRESENTATION", presentation)): monkeypatch.setattr(driver_module, "PUBLIC_%s_SHA256" % name, driver_module.sha256_file(path)) result = driver_module.verify_public_inputs(processing, presentation, holdout) assert result["processing"]["rows"] == 2 pandas.DataFrame({"sample_id": ["a"]}).to_csv(holdout / "processing_samples.csv", index=False) with pytest.raises(ValueError, match="overlaps"): driver_module.verify_public_inputs(processing, presentation, holdout) monkeypatch.setattr(driver_module, "PUBLIC_PROCESSING_SHA256", "bad") with pytest.raises(ValueError, match="Not the archived"): driver_module.verify_public_inputs(processing, presentation, holdout) def test_completed_stages_refuse_changed_commands(tmp_path, driver_module): stage = tmp_path / "stages/test.json" driver_module.write_json(stage, {"command": ["same"]}) runner = driver_module.Driver(tmp_path) runner.run("test", ["same"]) with pytest.raises(ValueError, match="changed command"): runner.run("test", ["different"]) def test_composition_creates_nested_parent(tmp_path, driver_module): from compose_processing_ensemble import main from mhcflurry import Class1ProcessingPredictor from .test_class1_processing_neural_network import train_basic_network network = train_basic_network(num=20, do_assertions=False, max_epochs=1) source = tmp_path / "source" Class1ProcessingPredictor(models=[network]).save(str(source)) destination = tmp_path / "hybrid/processing/models.selected.short_flanks" assert main(["--predictor", "a=" + str(source), "--predictor", "b=" + str(source), "--require-equal-counts", "--out", str(destination)]) == 0 result = Class1ProcessingPredictor.load(str(destination)) assert len(result.models) == 2 numpy.testing.assert_array_equal( result.predict(["SIINFEKL"]), Class1ProcessingPredictor.load(str(source)).predict(["SIINFEKL"])) def test_fit_combiners_creates_presentation_parent(tmp_path, driver_module, monkeypatch): from mhcflurry import Class1AffinityPredictor, Class1PresentationPredictor, Class1ProcessingPredictor data = tmp_path / "data.csv" pandas.DataFrame({"peptide": ["SIINFEKL", "SIINFEKL"], "hla": ["HLA-A*02:01"] * 2, "hit": [0, 1], "n_flank": ["AAA"] * 2, "c_flank": ["AAA"] * 2}).to_csv(data, index=False) monkeypatch.setattr(Class1AffinityPredictor, "load", lambda *a, **k: object()) monkeypatch.setattr(Class1ProcessingPredictor, "load", lambda *a, **k: object()) monkeypatch.setattr(driver_module, "cached_scores", lambda *a, **k: numpy.array([0.1, 0.2])) monkeypatch.setattr(Class1PresentationPredictor, "fit_from_scores", lambda *a, **k: None) saved = [] def save(self, path, **kwargs): # Match the real save contract: mkdir, not makedirs. Path(path).mkdir() saved.append(path) monkeypatch.setattr(Class1PresentationPredictor, "save", save) driver_module.fit_combiners(tmp_path, data, tmp_path, tmp_path, {"new": tmp_path}) assert saved == [str(tmp_path / "new/presentation/models")] mhcflurry-2.3.6/test/test_experiment_archive.py000066400000000000000000000275401525677230600220330ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from datetime import datetime, timezone import json import pandas from mhcflurry.experiment_archive import sha256_file, snapshot_experiment def test_snapshot_experiment_exports_reconstructable_tables(tmp_path): source = tmp_path / "run" models = source / "condition-a" / "models.unselected.combined" comparison = source / "condition-a" / "comparison-vs-baseline" / "affinity" conditions = source / "conditions" models.mkdir(parents=True) comparison.mkdir(parents=True) conditions.mkdir() training_info = { "phase": "finetune", "fold_num": 2, "architecture_num": 7, "replicate_num": 0, "work_item_name": "work-123", } fit_info = { "training_info": training_info, "loss": [0.4, 0.2], "val_loss": [0.5, 0.3], "epoch_train_time": [4.0, 3.5], "effective_minibatch_size": 256, "time": 12.5, "ranking_validation_input_rows": list(range(50)), "ranking_validation_samples": ["a", "b", "c"], "retained_checkpoints": ["best", "best_ap", "terminal"], "saved_checkpoint_policies": ["best", "terminal"], "val_macro_ap": [0.6, 0.7], } config = { "hyperparameters": { "topology": "feedforward", "layer_sizes": [512, 512], "activation": "tanh", "normalization": "layer", "dropout_probability": 0.75, "restore_best_weights": True, "patience": 40, "minibatch_size": 256, "optimizer": "rmsprop", "optimizer_implementation": "keras", "init": "glorot_uniform", "data_dependent_initialization_method": "lsuv", "data_dependent_initialization_target": "post_activation", }, "fit_info": [fit_info], "network_json": "intentionally omitted from normalized export", } pandas.DataFrame([{ "model_name": "PAN-CLASS1-0-test", "allele": "pan-class1", "config_json": json.dumps(config), }]).to_csv(models / "manifest.csv", index=False) weight = models / "weights_PAN-CLASS1-0-test.npz" weight.write_bytes(b"weight payload") (models / "train_data.csv.bz2").write_bytes(b"training payload") pandas.DataFrame([{ "allele": "HLA-A*02:01", "a_roc_auc": 0.9, "b_roc_auc": 0.8, }]).to_csv(comparison / "per_allele.csv", index=False) predictions = comparison / "predictions.csv.bz2" predictions.write_bytes( b"held-out predictions larger than test limit" * 10) combined_predictions = source / "candidate_figures" / ( "benchmark.monoallelic.csv.bz2") combined_predictions.parent.mkdir() combined_predictions.write_bytes(b"combined predictions" * 10) named_predictions = source / "predictions_with_flanks.csv.bz2" named_predictions.write_bytes(b"named predictions" * 10) feature_cache = source / "training_feature_cache" / "processing.npy" feature_cache.parent.mkdir() feature_cache.write_bytes(b"cached component scores" * 10) (source / "factorial_release_summary.csv").write_text( "condition,auprc\nnew_new,0.4\n") (source / "factorial_manifest.json").write_text( json.dumps({"conditions": ["new_new"]})) (source / "new_new.weights.csv").write_text( "feature,weight\naffinity,1.0\n") runplz_driver = source / ".runplz" / "evaluation_driver.sh" runplz_driver.parent.mkdir() runplz_driver.write_text("mhcflurry eval processing-ensemble --help\n") (combined_predictions.parent / "predictor_info.csv").write_text( "predictor,description\ncandidate,test\n") (combined_predictions.parent / "accuracy_scores.monoallelic.csv").write_text( "predictor,metric,value\ncandidate,pr_auc,0.9\n") figure = comparison / "plots" / "model_comparison_figures.pdf" figure.parent.mkdir() figure.write_bytes(b"pdf") (conditions / "condition-a.yaml").write_text("minibatch_size: 256\n") (source / "gpu_occupancy.csv").write_text("timestamp,gpu_util\n1,99\n") command = source / "command.sh" command.write_text("run-affinity --condition condition-a\n") input_data = tmp_path / "input.csv" input_data.write_text("peptide,allele\nSIINFEKL,HLA-A*02:01\n") (source / "provenance.txt").write_text( "source_commit=abcdef1234567890\n%s %s\n" % ( sha256_file(input_data), input_data)) source_archive = tmp_path / "source.tar.gz" source_archive.write_bytes(b"source archive") destination = snapshot_experiment( source, tmp_path / "experiments", "affinity frontier", collector_commit="fedcba0987654321", source_archive=source_archive, command_files=[command], input_files=[input_data], max_copy_bytes=64, captured_at=datetime(2026, 9, 2, 12, 34, 56, tzinfo=timezone.utc), ) assert destination.name == ( "20260902T123456Z-affinity-frontier-abcdef123456") experiment = json.loads((destination / "experiment.json").read_text()) assert experiment["source_commit"] == "abcdef1234567890" assert experiment["collector_commit"] == "fedcba0987654321" assert experiment["training_tables"] == { "model_manifest_count": 1, "model_count": 1, "fit_count": 1, "epoch_count": 2, } history = pandas.read_csv(destination / "data" / "training_history.csv") assert history.epoch.tolist() == [1, 2] assert history.loss.tolist() == [0.4, 0.2] assert history.val_loss.tolist() == [0.5, 0.3] assert history.epoch_train_time.tolist() == [4.0, 3.5] assert history.val_macro_ap.tolist() == [0.6, 0.7] assert "ranking_validation_input_rows" not in history assert "retained_checkpoints" not in history assert history.fold.tolist() == [2, 2] models_table = pandas.read_csv(destination / "data" / "models.csv") assert models_table.minibatch_size.tolist() == [256] assert models_table.optimizer_implementation.tolist() == ["keras"] assert models_table.activation.tolist() == ["tanh"] assert models_table.normalization.tolist() == ["layer"] assert models_table.dropout_keep_probability.tolist() == [0.75] assert models_table.restore_best_weights.tolist() == [True] assert models_table.patience.tolist() == [40] configs = [ json.loads(line) for line in (destination / "data" / "model_configs.jsonl") .read_text().splitlines() ] assert "network_json" not in configs[0]["config"] assert configs[0]["config"]["fit_info"][0]["loss"] == [0.4, 0.2] inventory = pandas.read_csv(destination / "source_files.csv") weight_row = inventory.loc[ inventory.relative_path.str.endswith(weight.name)].iloc[0] assert weight_row.sha256 == sha256_file(weight) assert bool(weight_row.copied) assert weight_row.storage == "copy" assert ( destination / "artifacts" / "condition-a" / "models.unselected.combined" / weight.name ).read_bytes() == weight.read_bytes() metric_row = inventory.loc[ inventory.relative_path.str.endswith("per_allele.csv")].iloc[0] assert bool(metric_row.copied) assert ( destination / "artifacts" / "condition-a" / "comparison-vs-baseline" / "affinity" / "per_allele.csv" ).exists() assert ( destination / "artifacts" / "condition-a" / "comparison-vs-baseline" / "affinity" / "predictions.csv.bz2" ).read_bytes() == predictions.read_bytes() assert ( destination / "artifacts" / "candidate_figures" / combined_predictions.name ).read_bytes() == combined_predictions.read_bytes() assert ( destination / "artifacts" / named_predictions.name ).read_bytes() == named_predictions.read_bytes() assert ( destination / "artifacts" / "training_feature_cache" / feature_cache.name ).read_bytes() == feature_cache.read_bytes() assert ( destination / "artifacts" / "factorial_release_summary.csv" ).is_file() assert ( destination / "artifacts" / "factorial_manifest.json" ).is_file() assert ( destination / "artifacts" / "new_new.weights.csv" ).is_file() assert ( destination / "artifacts" / ".runplz" / runplz_driver.name ).read_bytes() == runplz_driver.read_bytes() assert ( destination / "artifacts" / "candidate_figures" / "accuracy_scores.monoallelic.csv" ).is_file() prediction_row = inventory.loc[ inventory.relative_path.str.endswith("predictions.csv.bz2")].iloc[0] prediction_snapshot = ( destination / "artifacts" / "condition-a" / "comparison-vs-baseline" / "affinity" / "predictions.csv.bz2" ) original_prediction_bytes = predictions.read_bytes() assert prediction_row.storage == "copy" assert prediction_snapshot.stat().st_ino != predictions.stat().st_ino predictions.write_bytes(b"mutated live prediction table") assert prediction_snapshot.read_bytes() == original_prediction_bytes assert ( destination / "artifacts" / "condition-a" / "comparison-vs-baseline" / "affinity" / "plots" / "model_comparison_figures.pdf" ).exists() assert (destination / "source" / source_archive.name).exists() assert (destination / "supplemental" / "command" / command.name).exists() external = pandas.read_csv(destination / "external_inputs.csv") assert external.recorded_sha256.tolist() == [sha256_file(input_data)] assert "training_history.csv" in (destination / "README.md").read_text() def test_snapshot_rejects_naive_capture_time(tmp_path): source = tmp_path / "run" source.mkdir() (source / "provenance.txt").write_text("source_commit=abc1234\n") try: snapshot_experiment( source, tmp_path / "experiments", "test", captured_at=datetime(2026, 9, 2), ) except ValueError as error: assert "timezone-aware" in str(error) else: raise AssertionError("Expected a timezone-aware timestamp error") def test_snapshot_preserves_same_basename_supplemental_inputs(tmp_path): source = tmp_path / "run" source.mkdir() (source / "provenance.txt").write_text("source_commit=abc1234\n") first = tmp_path / "candidate" / "train_data.csv.bz2" second = tmp_path / "public" / "train_data.csv.bz2" first.parent.mkdir() second.parent.mkdir() first.write_bytes(b"candidate training data") second.write_bytes(b"public training data") destination = snapshot_experiment( source, tmp_path / "experiments", "same basename inputs", input_files=[first, second], captured_at=datetime(2026, 9, 2, tzinfo=timezone.utc), ) experiment = json.loads((destination / "experiment.json").read_text()) inputs = experiment["supplemental_files"] assert [record["snapshot_path"] for record in inputs] == [ "supplemental/input/000-train_data.csv.bz2", "supplemental/input/001-train_data.csv.bz2", ] for record in inputs: copied = destination / record["snapshot_path"] assert copied.is_file() assert sha256_file(copied) == record["sha256"] def test_preserve_bootstrap_draws_and_component_score_cache(): from mhcflurry.experiment_archive import _artifact_role assert _artifact_role("presentation/bootstrap_deltas.npz") == "metric" assert _artifact_role("component_scores/public_affinity.npy") == "prediction" mhcflurry-2.3.6/test/test_generate_sh.py000066400000000000000000000117561525677230600204400ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Tests for ``mhcflurry.common.write_generate_sh``. The helper drops a snapshot script next to every artifact directory written by a train/select/calibrate command. The script's default action is to tar.gz the directory; ``regenerate`` re-runs the original mhcflurry invocation first. """ import os import subprocess import tempfile import mhcflurry.common as common def test_writes_executable_generate_sh(): with tempfile.TemporaryDirectory() as tmp: out_dir = os.path.join(tmp, "models.combined") os.makedirs(out_dir) path = common.write_generate_sh( out_dir, argv=["mhcflurry-class1-train-pan-allele-models", "--data", "/in path/data.csv", "--out-models-dir", out_dir, "--num-jobs", "0"], mhcflurry_version="9.9.9-test", ) assert path == os.path.join(out_dir, "GENERATE.sh") assert os.path.exists(path) assert os.access(path, os.X_OK) contents = open(path).read() assert "mhcflurry-class1-train-pan-allele-models" in contents # Spaces in args must round-trip correctly via shlex.quote. assert "/in path/data.csv" in contents assert "9.9.9-test" in contents def test_default_run_produces_tar_gz_snapshot(): with tempfile.TemporaryDirectory() as tmp: out_dir = os.path.join(tmp, "models.combined") os.makedirs(out_dir) with open(os.path.join(out_dir, "manifest.csv"), "w") as f: f.write("model_name,fold\nNet0,0\n") common.write_generate_sh(out_dir, argv=["echo", "noop"]) result = subprocess.run( ["bash", os.path.join(out_dir, "GENERATE.sh")], capture_output=True, text=True, check=True) tarball = os.path.join(tmp, "models.combined.tar.gz") assert os.path.exists(tarball), result.stdout + "\n" + result.stderr listing = subprocess.run( ["tar", "tzf", tarball], capture_output=True, text=True, check=True) assert "models.combined/manifest.csv" in listing.stdout def test_regenerate_reruns_command_then_snapshots(): with tempfile.TemporaryDirectory() as tmp: out_dir = os.path.join(tmp, "models.combined") os.makedirs(out_dir) # The "regenerate" path will rm -rf the dir first, so put the # marker file outside the dir to confirm the recorded command # actually ran. marker = os.path.join(tmp, "regenerated_marker.txt") # Use `bash -c` to embed both the dir recreate and the marker # write in one command, so the recorded ORIGINAL_COMMAND # restores out_dir (otherwise the trailing tarball step fails # because the dir was rm -rf'd). argv = ["bash", "-c", f"mkdir -p {out_dir} && touch {marker}"] common.write_generate_sh(out_dir, argv=argv) result = subprocess.run( ["bash", os.path.join(out_dir, "GENERATE.sh"), "regenerate"], capture_output=True, text=True, check=True) assert os.path.exists(marker), result.stdout + "\n" + result.stderr assert os.path.exists(os.path.join(tmp, "models.combined.tar.gz")) def test_regenerate_refuses_when_generate_sh_marker_missing(): """Safety check: if a user removes GENERATE.sh from the artifact dir before re-running it (e.g. they mounted something else on top), regenerate must refuse rather than rm -rf an unrelated tree.""" with tempfile.TemporaryDirectory() as tmp: out_dir = os.path.join(tmp, "models.combined") os.makedirs(out_dir) common.write_generate_sh(out_dir, argv=["echo", "noop"]) # Save the script content, then delete GENERATE.sh from the dir # but keep a copy elsewhere so we can still invoke it. script_path = os.path.join(out_dir, "GENERATE.sh") copied = os.path.join(tmp, "GENERATE_copy.sh") os.rename(script_path, copied) os.chmod(copied, 0o755) result = subprocess.run( ["bash", copied, "regenerate"], capture_output=True, text=True) assert result.returncode != 0 assert "GENERATE.sh missing" in result.stderr, result.stderr # Original dir must be intact (not rm -rf'd). assert os.path.isdir(out_dir) if __name__ == "__main__": test_writes_executable_generate_sh() test_default_run_produces_tar_gz_snapshot() test_regenerate_reruns_command_then_snapshots() test_regenerate_refuses_when_generate_sh_marker_missing() print("PASS") mhcflurry-2.3.6/test/test_hardware_autosizing_matrix.py000066400000000000000000000304241525677230600236020ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Characteristic-driven hardware matrix for automatic worker sizing.""" from argparse import Namespace import pytest from mhcflurry.memory_budget import GIB, usable_memory_bytes from mhcflurry.parallelism import ( refine_local_parallelism_from_warmup, resolve_local_parallelism_args, ) from mhcflurry.parallelism import planning from mhcflurry.parallelism import worker_runtime from mhcflurry.workload_planning import ( WORKLOAD_AFFINITY_INFERENCE, WORKLOAD_AFFINITY_TRAINING, WORKLOAD_PRESENTATION_INFERENCE, WORKLOAD_PROCESSING_INFERENCE, ) # Maximums observed by the seven-architecture full-residency affinity probe on # the 4xA100-40GB release host. CUDA's process-level estimate is intentionally # larger than the allocator counters because it includes the CUDA context and # non-PyTorch allocations. AFFINITY_A100_PROBE_REPORT = { "cuda_process_peak_estimate_bytes": 38_003_998_720, "cuda_peak_allocated_bytes": 35_649_949_184, "cuda_peak_reserved_bytes": 37_459_329_024, "host_peak_rss_bytes": 12_021_784_576, } HARDWARE_CASES = ( pytest.param( { "gpus": 0, "free_vram_gb": None, "cpus": 8, "total_ram_gb": 16.0, "available_ram_gb": 12.0, "initial": (0, 1, 0, 6), "final": None, }, id="cpu-only-8cpu-16gb", ), pytest.param( { "backend": "cpu", "gpus": 4, "free_vram_gb": 80.0, "cpus": 8, "total_ram_gb": 16.0, "available_ram_gb": 12.0, "initial": (0, 1, 0, 6), "final": None, }, id="cpu-selected-with-4-gpus-visible", ), pytest.param( { "gpus": 1, "free_vram_gb": 32.0, "cpus": 32, "total_ram_gb": 64.0, "available_ram_gb": 60.0, "initial": (11, 11, 1, 1), "final": (1, 1, 1, 29), "undersized": True, }, id="rtx-5090-32gb-workstation", ), pytest.param( { "gpus": 1, "free_vram_gb": 40_442 / 1024.0, "cpus": 12, "total_ram_gb": 85.0, "available_ram_gb": 80.0, "initial": (12, 12, 0, 1), "final": (1, 1, 0, 10), }, id="a100-40gb-single", ), pytest.param( { "gpus": 4, "free_vram_gb": 40_442 / 1024.0, "cpus": 48, "total_ram_gb": 340.0, "available_ram_gb": 329.3, "initial": (48, 12, 0, 1), "final": (4, 1, 0, 11), "golden": True, }, id="a100-40gb-4x-gcp-observed", ), pytest.param( { "gpus": 4, "free_vram_gb": 80.0, "cpus": 96, "total_ram_gb": 640.0, "available_ram_gb": 600.0, "initial": (96, 24, 0, 1), "final": (4, 1, 0, 23), }, id="h100-80gb-4x", ), pytest.param( { "gpus": 8, "free_vram_gb": 141.0, "cpus": 112, "total_ram_gb": 2048.0, "available_ram_gb": 1900.0, "initial": (112, 14, 0, 1), "final": (24, 3, 0, 4), }, id="h200-141gb-8x", ), pytest.param( { "gpus": 8, "free_vram_gb": 141.0, "cpus": 16, "total_ram_gb": 2048.0, "available_ram_gb": 1900.0, "initial": (16, 2, 0, 1), "final": (16, 2, 0, 1), }, id="h200-141gb-8x-cpu-constrained", ), pytest.param( { "gpus": 4, "free_vram_gb": 80.0, "cpus": 96, "total_ram_gb": 40.0, "available_ram_gb": 32.0, "initial": (6, 2, 3, 12), "final": (2, 1, 3, 44), }, id="h100-80gb-4x-ram-constrained", ), ) def _resolve_case(monkeypatch, case): """Resolve one matrix row without depending on the test runner's host.""" for name in ( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_HARD_CAP", "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB", "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_VRAM_FRACTION", "MHCFLURRY_AUTO_HOST_MEMORY_SAFETY_FRACTION", "MHCFLURRY_AUTO_DATALOADER_HARD_CAP", "MHCFLURRY_TORCH_COMPILE", "TORCHINDUCTOR_COMPILE_THREADS", "MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_AUTO", "OMP_NUM_THREADS", "MKL_NUM_THREADS", "OPENBLAS_NUM_THREADS", "MHCFLURRY_OMP_NUM_THREADS_AUTO", "MHCFLURRY_MKL_NUM_THREADS_AUTO", "MHCFLURRY_OPENBLAS_NUM_THREADS_AUTO"): monkeypatch.delenv(name, raising=False) monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", str(case["total_ram_gb"])) monkeypatch.setenv( "MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", str(case["available_ram_gb"]), ) if case["free_vram_gb"] is None: monkeypatch.delenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", raising=False, ) else: monkeypatch.setenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", str(case["free_vram_gb"]), ) monkeypatch.setattr(planning.os, "cpu_count", lambda: case["cpus"]) monkeypatch.setattr(planning, "configure_pytorch", lambda **_kwargs: None) monkeypatch.setattr( worker_runtime, "configure_worker_cpu_threads", lambda num_threads, auto_owned=True: num_threads, ) args = Namespace( backend=case.get("backend", "auto"), gpus=case["gpus"], max_workers_per_gpu="auto", num_jobs="auto", dataloader_num_workers="auto", random_negative_pool_epochs="auto", torch_compile="auto", torch_compile_loss="auto", matmul_precision="none", enable_timing=False, cluster_parallelism=False, ) resolve_local_parallelism_args( args, workload_name=WORKLOAD_AFFINITY_TRAINING, per_worker_gb=2.5, ) return args def _plan_shape(plan): return ( plan.num_jobs, plan.max_workers_per_gpu, plan.dataloader_num_workers, plan.cpu_threads_per_worker, ) @pytest.mark.parametrize("case", HARDWARE_CASES) def test_affinity_autosizer_hardware_matrix(monkeypatch, case): """Capacity follows resource facts and a measured workload envelope. Accelerator labels document representative machines; the autosizer sees only GPU count/free memory, CPUs, RAM, and the workload measurements. Only the 4xA100 row is an empirical golden result. Other accelerator rows test how the same measured envelope maps onto published memory capacities. """ args = _resolve_case(monkeypatch, case) initial = args.workload_plan assert _plan_shape(initial) == case["initial"] if initial.gpus: assert initial.capacity <= ( initial.gpus * initial.max_workers_per_gpu ) else: assert initial.capacity == 0 assert initial.num_jobs <= case["cpus"] if initial.host_memory_num_jobs_cap is not None and initial.num_jobs: assert initial.num_jobs <= initial.host_memory_num_jobs_cap if case["final"] is None: assert initial.backend == "cpu" or initial.gpus == 0 assert args.device_memory_budget_bytes is None return refine_local_parallelism_from_warmup( args, [AFFINITY_A100_PROBE_REPORT], ) final = args.workload_plan assert _plan_shape(final) == case["final"] assert final.num_jobs <= initial.num_jobs assert final.max_workers_per_gpu <= initial.max_workers_per_gpu assert final.capacity <= final.gpus * final.max_workers_per_gpu assert final.num_jobs <= case["cpus"] if final.host_memory_num_jobs_cap is not None and final.num_jobs: assert final.num_jobs <= final.host_memory_num_jobs_cap usable_device_gb = usable_memory_bytes( case["free_vram_gb"] * GIB, ) / GIB assert ( final.device_memory_budget_gb * final.max_workers_per_gpu <= usable_device_gb + 1e-9 ) if case.get("undersized"): assert final.device_worker_gb > final.device_memory_budget_gb assert any( "observed device peak" in warning for warning in final.warnings ) else: assert final.warmup_device_peak_gb <= final.device_memory_budget_gb if case.get("golden"): assert initial.device_memory_budget_gb == pytest.approx(2.9621, abs=1e-4) assert final.warmup_device_peak_gb == pytest.approx(35.3940, abs=1e-4) assert final.device_worker_gb == pytest.approx(40.7031, abs=1e-4) assert final.warmup_host_peak_gb == pytest.approx(11.1962, abs=1e-4) assert final.host_worker_gb == pytest.approx(12.3158, abs=1e-4) assert final.device_memory_budget_gb == pytest.approx(35.5447, abs=1e-4) INFERENCE_HARDWARE_CASES = ( pytest.param(1, 32.0, 64, 512.0, (7, 2, 1), id="rtx-5090-32gb"), pytest.param( 1, 40_442 / 1024.0, 64, 512.0, (8, 3, 2), id="a100-40gb"), pytest.param( 4, 40_442 / 1024.0, 48, 340.0, (32, 12, 8), id="4x-a100-40gb"), pytest.param(4, 80.0, 96, 640.0, (72, 28, 16), id="4x-h100-80gb"), pytest.param(8, 141.0, 112, 2048.0, (112, 96, 56), id="8x-h200-141gb"), ) @pytest.mark.parametrize( ("gpus", "free_vram_gb", "cpus", "ram_gb", "expected_jobs"), INFERENCE_HARDWARE_CASES, ) def test_inference_autosizer_hardware_matrix( monkeypatch, gpus, free_vram_gb, cpus, ram_gb, expected_jobs): """Elastic batches never erase complete resident-workload capacity.""" monkeypatch.setenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", str(free_vram_gb), ) monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", str(ram_gb)) monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", str(ram_gb)) monkeypatch.setattr(planning.os, "cpu_count", lambda: cpus) monkeypatch.setattr(planning, "configure_pytorch", lambda **_kwargs: None) monkeypatch.setattr( worker_runtime, "configure_worker_cpu_threads", lambda num_threads, auto_owned=True: num_threads, ) for name in ( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_HARD_CAP", "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB", "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_VRAM_FRACTION", "MHCFLURRY_AUTO_HOST_MEMORY_SAFETY_FRACTION"): monkeypatch.delenv(name, raising=False) workloads = ( WORKLOAD_AFFINITY_INFERENCE, WORKLOAD_PROCESSING_INFERENCE, WORKLOAD_PRESENTATION_INFERENCE, ) for workload, expected in zip(workloads, expected_jobs): args = Namespace( backend="auto", gpus=gpus, max_workers_per_gpu="auto", num_jobs="auto", dataloader_num_workers="auto", random_negative_pool_epochs="auto", torch_compile="auto", torch_compile_loss="auto", matmul_precision="none", enable_timing=False, cluster_parallelism=False, ) resolve_local_parallelism_args( args, workload_name=workload, workload_hints={ # Matches the order of magnitude of the 2.3 release archives; # it must not replace the complete resident-workload floor. "model_bytes": 200 * (1 << 20), "elastic_batch": True, "prediction_rows": 2_054_263, }, ) assert args.num_jobs == expected assert args.workload_plan.device_worker_gb == { WORKLOAD_AFFINITY_INFERENCE: 4.0, WORKLOAD_PROCESSING_INFERENCE: 10.0, WORKLOAD_PRESENTATION_INFERENCE: 16.0, }[workload] mhcflurry-2.3.6/test/test_holdout_streaming.py000066400000000000000000000062611525677230600216760ustar00rootroot00000000000000from types import SimpleNamespace import pandas import pytest from mhcflurry.cli import compare_models def write_benchmark(path, sample, hits=(1, 0)): pandas.DataFrame({"peptide": ["SIINFEKL", "SLYNTVATL"], "sample_id": [sample] * 2, "hla": ["HLA-A*02:01"] * 2, "hit": hits, "n_flank": ["AAA", "CCC"], "c_flank": ["GGG", "TTT"]}).to_csv(path, index=False) @pytest.mark.parametrize("limit", [None, 1]) def test_streaming_preserves_holdout_rows_and_order(tmp_path, limit): data = tmp_path / "data" data.mkdir() for name, sample in (("a", "discard"), ("b", "keep"), ("c", "keep2")): write_benchmark(data / ("benchmark.multiallelic.train_excluded.%s.csv.bz2" % name), sample) holdout = tmp_path / "holdout" holdout.mkdir() pandas.DataFrame({"sample_id": ["keep", "keep2"]}).to_csv(holdout / "presentation_samples.csv", index=False) args = SimpleNamespace(release_holdout_dir=str(holdout), limit_files=limit) original = compare_models._load_presentation_benchmark(str(data), None) expected = compare_models._filter_release_holdout_samples(original, args, "presentation").reset_index(drop=True) actual = compare_models._load_presentation_benchmark_for_component(str(data), args, "presentation") pandas.testing.assert_frame_equal(expected, actual) @pytest.mark.parametrize("bad_column,bad_value", [("hit", 0.5), ("peptide", ""), ("hla", None)]) def test_streaming_still_rejects_invalid_discarded_rows(tmp_path, bad_column, bad_value): path = tmp_path / "data.csv" write_benchmark(path, "discard") data = pandas.read_csv(path) data[bad_column] = data[bad_column].astype(object) data.loc[0, bad_column] = bad_value data.to_csv(path, index=False) with pytest.raises(ValueError, match="non-binary|missing or blank"): compare_models._read_holdout_benchmark_files([str(path)], {"keep"}, "test") def test_streaming_allows_single_class_chunks_and_keeps_file_order(tmp_path, monkeypatch): paths = [tmp_path / "positive.csv", tmp_path / "negative.csv"] for path, hits in zip(paths, [(1, 1), (0, 0)]): write_benchmark(path, "keep", hits) original_read = pandas.read_csv seen = [] def read(*args, **kwargs): seen.append(kwargs.get("chunksize")) kwargs["chunksize"] = 1 return original_read(*args, **kwargs) monkeypatch.setattr(pandas, "read_csv", read) actual = compare_models._read_holdout_benchmark_files(list(map(str, paths)), {"keep"}, "test") assert seen == [100000, 100000] assert actual.hit.tolist() == [1, 1, 0, 0] assert actual.source_file.tolist() == ["positive.csv"] * 2 + ["negative.csv"] * 2 def test_streaming_affinity_matches_full_loader(tmp_path): for name, sample in (("a", "discard"), ("b", "keep")): write_benchmark(tmp_path / ("benchmark.monoallelic.mixmhcpred.train_excluded.%s.csv.bz2" % name), sample) all_rows = compare_models._load_affinity_benchmark(str(tmp_path), "mixmhcpred", None) actual = compare_models._load_affinity_benchmark(str(tmp_path), "mixmhcpred", None, samples={"keep"}) pandas.testing.assert_frame_equal(all_rows.loc[all_rows.sample_id == "keep"].reset_index(drop=True), actual) mhcflurry-2.3.6/test/test_hyperparameters.py000066400000000000000000000017431525677230600213620ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from mhcflurry.class1_neural_network import Class1NeuralNetwork def test_all_combinations_of_hyperparameters(): combinations_dict = dict( activation=["tanh", "sigmoid"], random_negative_constant=[0, 20]) results = ( Class1NeuralNetwork .hyperparameter_defaults .models_grid(**combinations_dict)) assert len(results) == 4 if __name__ == "__main__": test_all_combinations_of_hyperparameters() mhcflurry-2.3.6/test/test_local_parallelism.py000066400000000000000000001736161525677230600216370ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from argparse import ArgumentParser, ArgumentTypeError, Namespace import multiprocessing import builtins import os import pytest import subprocess import sys from mhcflurry.parallelism import ( NonDaemonPool, NonDaemonProcess, add_local_parallelism_args, add_prediction_parallelism_args, auto_max_workers_per_gpu, chunk_ranges_for_local_parallelism, estimate_worker_context_bytes, free_vram_per_gpu_from_nvidia_smi_gb, non_daemon_context, num_workers_per_gpu_from_args, refine_local_parallelism_from_spawn_context, resolve_local_parallelism_args, refine_local_parallelism_from_warmup, resolve_cpu_thread_budget, resolve_cpu_threads_per_worker, resolve_max_workers_per_gpu, validate_worker_pool_args, worker_pool_with_gpu_assignments, worker_pool_with_gpu_assignments_from_args, worker_init_kwargs_for_scheduler, ) from mhcflurry.parallelism import cli_args, planning from mhcflurry.parallelism import worker_pool as worker_pool_module from mhcflurry.parallelism import worker_runtime as worker_runtime_module from mhcflurry.workload_planning import ( GIB, HOST_RAM_PER_DATALOADER_CHILD_GB, WORKLOAD_PRESENTATION_CALIBRATION, WORKLOAD_PROCESSING_TRAINING, estimate_workload_memory, host_memory_num_jobs_cap, system_memory_info_gb, ) _SHARED_INITIALIZER_STATE = None def _set_shared_initializer_state(shared_value, per_process_value): global _SHARED_INITIALIZER_STATE _SHARED_INITIALIZER_STATE = (shared_value, per_process_value) def _read_shared_initializer_state(_): return _SHARED_INITIALIZER_STATE def _record_initializer_slot(seen_slots, slot): seen_slots.put(slot) @pytest.fixture(autouse=True) def clear_cuda_visible_devices(monkeypatch): monkeypatch.delenv("CUDA_VISIBLE_DEVICES", raising=False) def test_worker_init_kwargs_round_robin_across_gpus(): assert worker_init_kwargs_for_scheduler( num_jobs=5, num_gpus=2, backend="auto", max_workers_per_gpu=2, ) == [ {"backend": "gpu", "gpu_device_nums": [0], "max_workers_per_gpu": 2}, {"backend": "gpu", "gpu_device_nums": [1], "max_workers_per_gpu": 2}, {"backend": "gpu", "gpu_device_nums": [0], "max_workers_per_gpu": 2}, {"backend": "gpu", "gpu_device_nums": [1], "max_workers_per_gpu": 2}, {"backend": "cpu", "gpu_device_nums": [], "max_workers_per_gpu": 2}, ] def test_worker_init_kwargs_honors_cuda_visible_devices(monkeypatch): monkeypatch.setenv("CUDA_VISIBLE_DEVICES", "2,3") assert worker_init_kwargs_for_scheduler( num_jobs=5, num_gpus=2, backend="auto", max_workers_per_gpu=2, ) == [ {"backend": "gpu", "gpu_device_nums": ["2"], "max_workers_per_gpu": 2}, {"backend": "gpu", "gpu_device_nums": ["3"], "max_workers_per_gpu": 2}, {"backend": "gpu", "gpu_device_nums": ["2"], "max_workers_per_gpu": 2}, {"backend": "gpu", "gpu_device_nums": ["3"], "max_workers_per_gpu": 2}, {"backend": "cpu", "gpu_device_nums": [], "max_workers_per_gpu": 2}, ] def test_worker_init_kwargs_propagates_budget_only_to_gpu_workers(): assert worker_init_kwargs_for_scheduler( num_jobs=3, num_gpus=1, backend="auto", max_workers_per_gpu=2, device_memory_budget_bytes=1234, ) == [ { "backend": "gpu", "gpu_device_nums": [0], "max_workers_per_gpu": 2, "device_memory_budget_bytes": 1234, }, { "backend": "gpu", "gpu_device_nums": [0], "max_workers_per_gpu": 2, "device_memory_budget_bytes": 1234, }, {"backend": "cpu", "gpu_device_nums": [], "max_workers_per_gpu": 2}, ] def test_worker_init_exports_fixed_device_budget(monkeypatch): # Register the key with monkeypatch before worker_init mutates os.environ # directly, so the process-level value cannot leak into later sizing tests. monkeypatch.setenv("MHCFLURRY_DEVICE_MEMORY_BUDGET_BYTES", "") monkeypatch.setenv( "MHCFLURRY_CUDA_FREE_BEFORE_CONTEXT_BYTES", "") monkeypatch.setattr( worker_runtime_module, "configure_pytorch", lambda **kwargs: None) monkeypatch.setattr( worker_runtime_module, "cuda_free_memory_before_context_bytes", lambda device_id: 8 * (1 << 30), ) worker_runtime_module.worker_init( backend="gpu", gpu_device_nums=[0], max_workers_per_gpu=2, device_memory_budget_bytes=1234, ) assert os.environ["MHCFLURRY_DEVICE_MEMORY_BUDGET_BYTES"] == "1234" assert ( os.environ["MHCFLURRY_CUDA_FREE_BEFORE_CONTEXT_BYTES"] == str(8 * (1 << 30)) ) def test_worker_init_kwargs_without_gpu_scheduling_uses_backend(): assert worker_init_kwargs_for_scheduler( num_jobs=3, num_gpus=0, backend="mps", max_workers_per_gpu=2, ) == [ {"backend": "mps", "max_workers_per_gpu": 2}, {"backend": "mps", "max_workers_per_gpu": 2}, {"backend": "mps", "max_workers_per_gpu": 2}, ] def test_worker_init_kwargs_include_resolved_cpu_thread_budget(): assert worker_init_kwargs_for_scheduler( num_jobs=2, num_gpus=0, backend="cpu", max_workers_per_gpu=1, cpu_threads_per_worker=3, ) == [ { "backend": "cpu", "max_workers_per_gpu": 1, "cpu_threads_per_worker": 3, "cpu_threads_per_worker_was_auto": True, }, { "backend": "cpu", "max_workers_per_gpu": 1, "cpu_threads_per_worker": 3, "cpu_threads_per_worker_was_auto": True, }, ] def test_worker_init_kwargs_normalizes_default_backend_alias(): assert worker_init_kwargs_for_scheduler( num_jobs=2, num_gpus=0, backend="default", max_workers_per_gpu=2, ) == [ {"backend": "auto", "max_workers_per_gpu": 2}, {"backend": "auto", "max_workers_per_gpu": 2}, ] def test_worker_init_kwargs_with_gpus_normalizes_default_backend_alias(): assert worker_init_kwargs_for_scheduler( num_jobs=3, num_gpus=1, backend="default", max_workers_per_gpu=2, ) == [ {"backend": "gpu", "gpu_device_nums": [0], "max_workers_per_gpu": 2}, {"backend": "gpu", "gpu_device_nums": [0], "max_workers_per_gpu": 2}, {"backend": "cpu", "gpu_device_nums": [], "max_workers_per_gpu": 2}, ] def test_backend_default_alias_parses(): parser = ArgumentParser() add_local_parallelism_args(parser) args = parser.parse_args(["--backend", "default"]) assert args.backend == "default" def test_validate_worker_pool_args_allows_serial_mode_with_gpus(): validate_worker_pool_args( num_jobs=0, num_gpus=1, backend="auto", max_workers_per_gpu=1, ) def test_validate_worker_pool_args_rejects_non_cuda_backends_for_gpus(): with pytest.raises(ValueError, match="backend 'auto' or 'gpu'"): validate_worker_pool_args( num_jobs=2, num_gpus=1, backend="mps", max_workers_per_gpu=1, ) def test_validate_worker_pool_args_rejects_invalid_backend(): with pytest.raises(ValueError, match="Invalid backend"): validate_worker_pool_args( num_jobs=2, num_gpus=0, backend="gpuu", max_workers_per_gpu=1, ) # ---- Non-daemonic pool regression tests ---------------------------------- # # Pool workers must be non-daemonic so the PyTorch DataLoader inside a # training worker can spawn its own prefetch children. The default # multiprocessing.Pool ships daemon workers, which makes # DataLoader(num_workers>0) raise AssertionError. These tests lock down # the NonDaemonPool / NonDaemonProcess behavior. def _is_daemon_in_pool_worker(_): """Run inside a pool worker; returns whether the current process is a daemon.""" return multiprocessing.current_process().daemon def _runtime_thread_counts(_): """Return PyTorch and native thread-pool sizes inside a pool worker.""" import torch from threadpoolctl import threadpool_info native = [ item["num_threads"] for item in threadpool_info() if item["user_api"] in ("blas", "openmp") ] return torch.get_num_threads(), native def _runtime_thread_state(_): """Return thread settings that must survive worker initialization.""" import torch names = ("OMP_NUM_THREADS", "MKL_NUM_THREADS", "OPENBLAS_NUM_THREADS") return torch.get_num_threads(), { name: os.environ.get(name) for name in names } @pytest.mark.skipif( "fork" not in multiprocessing.get_all_start_methods(), reason="fork start method unavailable", ) def test_forked_worker_applies_runtime_cpu_thread_budget(): """Forked workers resize thread pools initialized in the parent.""" import torch original_threads = torch.get_num_threads() torch.set_num_threads(min(max(os.cpu_count() or 2, 2), 4)) pool = worker_pool_with_gpu_assignments( num_jobs=1, num_gpus=0, backend="cpu", max_workers_per_gpu=1, cpu_threads_per_worker=1, start_method="fork", ) try: torch_threads, native_threads = pool.apply( _runtime_thread_counts, (None,)) finally: pool.close() pool.join() torch.set_num_threads(original_threads) assert torch_threads == 1 assert all(value == 1 for value in native_threads) @pytest.mark.skipif( "fork" not in multiprocessing.get_all_start_methods(), reason="fork start method unavailable", ) def test_forked_worker_preserves_explicit_cpu_thread_settings(monkeypatch): """An auto estimate must not overwrite caller-owned thread settings.""" import torch expected_env = { "OMP_NUM_THREADS": "7", "MKL_NUM_THREADS": "5", "OPENBLAS_NUM_THREADS": "3", } for name, value in expected_env.items(): monkeypatch.setenv(name, value) monkeypatch.delenv("MHCFLURRY_%s_AUTO" % name, raising=False) original_threads = torch.get_num_threads() torch.set_num_threads(2) pool = worker_pool_with_gpu_assignments( num_jobs=1, num_gpus=0, backend="cpu", max_workers_per_gpu=1, cpu_threads_per_worker=1, cpu_threads_per_worker_was_auto=False, start_method="fork", ) try: torch_threads, worker_env = pool.apply( _runtime_thread_state, (None,)) finally: pool.close() pool.join() torch.set_num_threads(original_threads) # PyTorch may re-read OMP_NUM_THREADS in the child or retain the parent's # already-loaded runtime value, depending on its platform runtime. Either # is valid; the auto-derived 1 must not replace either expert setting. assert torch_threads in (2, int(expected_env["OMP_NUM_THREADS"])) assert torch_threads != 1 assert worker_env == expected_env def test_nondaemonprocess_reports_not_daemon(): """NonDaemonProcess.daemon must always read as False regardless of writes.""" p = NonDaemonProcess(target=lambda: None) assert p.daemon is False # The Pool internals WILL assign .daemon = True on every fresh worker — # tolerate the assignment silently without raising or flipping the flag. p.daemon = True assert p.daemon is False, "daemon setter should have been a no-op" def test_explicit_spawn_context_keeps_workers_non_daemonic(): context = non_daemon_context("spawn") process = context.Process(target=_grandchild_entry) assert context.get_start_method() == "spawn" assert process.daemon is False process.daemon = True assert process.daemon is False @pytest.mark.slow @pytest.mark.integration def test_nondaemonpool_workers_are_not_daemonic(): """The whole point: Pool workers must report daemon=False.""" with NonDaemonPool(processes=2) as pool: results = pool.map(_is_daemon_in_pool_worker, [None, None, None, None]) assert all(r is False for r in results), ( f"expected all workers daemon=False, got {results}. If True values " f"appear, the custom NonDaemonContext isn't threading through to " f"Pool._repopulate_pool, so DataLoader(num_workers>0) will still " f"detonate inside mhcflurry Pool workers." ) def _grandchild_entry(): """Minimal module-level child entry (pickle-able across spawn).""" return None def _spawn_child_from_pool_worker(_): """Spawn a grandchild process from within a Pool worker. If the Pool worker is daemonic, the inner multiprocessing.Process .start() call raises "daemonic processes are not allowed to have children". With a non-daemonic worker this succeeds. """ child = multiprocessing.Process(target=_grandchild_entry) child.start() child.join(timeout=60) if child.exitcode is None: child.terminate() child.join(timeout=10) return child.exitcode def test_max_workers_per_gpu_arg_parses_auto_and_int(): assert cli_args._max_workers_per_gpu_arg("auto") == "auto" assert cli_args._max_workers_per_gpu_arg("AUTO") == "auto" assert cli_args._max_workers_per_gpu_arg("3") == 3 assert cli_args._max_workers_per_gpu_arg(5) == 5 def test_max_workers_per_gpu_arg_rejects_garbage(): with pytest.raises(ArgumentTypeError): cli_args._max_workers_per_gpu_arg("hello") with pytest.raises(ArgumentTypeError): cli_args._max_workers_per_gpu_arg("0") with pytest.raises(ArgumentTypeError): cli_args._max_workers_per_gpu_arg("-1") def test_add_local_parallelism_args_default_is_auto(): parser = ArgumentParser() add_local_parallelism_args(parser) args = parser.parse_args([]) assert args.max_workers_per_gpu == "auto" args = parser.parse_args(["--max-workers-per-gpu", "3"]) assert args.max_workers_per_gpu == 3 def test_add_prediction_parallelism_args_omits_training_only_flags(): parser = ArgumentParser() add_prediction_parallelism_args(parser) args = parser.parse_args([]) assert args.num_jobs == "auto" assert args.max_workers_per_gpu == "auto" assert not hasattr(args, "dataloader_num_workers") assert not hasattr(args, "random_negative_pool_epochs") def test_chunk_ranges_for_local_parallelism_are_contiguous(): ranges = chunk_ranges_for_local_parallelism( num_items=10, num_jobs=2, chunks_per_worker=2) assert ranges == [ (0, 0, 3), (1, 3, 6), (2, 6, 9), (3, 9, 10), ] def test_chunk_ranges_for_local_parallelism_handles_empty(): assert chunk_ranges_for_local_parallelism(0, num_jobs=4) == [] def test_auto_max_workers_per_gpu_cpu_only_returns_one(): """No GPUs → 1 worker (CPU).""" assert auto_max_workers_per_gpu(num_jobs=8, num_gpus=0) == 1 assert auto_max_workers_per_gpu(num_jobs=8, num_gpus=4, backend="cpu") == 1 def test_auto_max_workers_per_gpu_caps_at_jobs_per_gpu(monkeypatch): """``num_jobs // num_gpus`` is the natural ceiling per GPU.""" # 16 jobs, 8 GPUs, abundant VRAM → 2 (jobs/gpus, not VRAM-bound). monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB", "1") monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") assert auto_max_workers_per_gpu(num_jobs=16, num_gpus=8) == 2 # 32 jobs, 8 GPUs → 4 (hits the hard cap, not jobs/gpus). assert auto_max_workers_per_gpu(num_jobs=32, num_gpus=8) == 4 def test_auto_max_workers_per_gpu_caps_at_vram(monkeypatch): """Per-worker VRAM upper bound caps when jobs/gpus would oversubscribe.""" # 32 jobs, 8 GPUs, large per-worker VRAM, low free-VRAM fallback (16 GB) # → by_jobs=4, by_vram=floor(16*0.65/16)=0 → max(1,...) = 1. monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB", "16") monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "16") assert auto_max_workers_per_gpu(num_jobs=32, num_gpus=8) == 1 def test_auto_max_workers_per_gpu_uses_vram_fraction(monkeypatch): """The VRAM fraction is configurable for hardware re-benchmarking.""" monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB", "25") monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_HARD_CAP", "4") # Default 65% budget: floor(80 * 0.65 / 25) = 2. monkeypatch.delenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_VRAM_FRACTION", raising=False) assert auto_max_workers_per_gpu(num_jobs="auto", num_gpus=4) == 2 # Conservative override: floor(80 * 0.50 / 25) = 1. monkeypatch.setenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_VRAM_FRACTION", "0.50") assert auto_max_workers_per_gpu(num_jobs="auto", num_gpus=4) == 1 def test_auto_max_workers_per_gpu_respects_hard_cap(monkeypatch): """Hard cap clamps even when jobs/gpus and VRAM allow more.""" monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB", "0.1") monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_HARD_CAP", "3") monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") # 32 jobs/8 gpus = 4 by_jobs, vram unbounded → hard_cap clamps to 3. assert auto_max_workers_per_gpu(num_jobs=32, num_gpus=8) == 3 def test_auto_max_workers_per_gpu_does_not_import_torch(monkeypatch): """Resolving local Pool size must not initialize CUDA in the parent.""" monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") original_import = builtins.__import__ def guarded_import(name, *args, **kwargs): if name == "torch" or name.startswith("torch."): raise AssertionError("auto_max_workers_per_gpu imported torch") return original_import(name, *args, **kwargs) monkeypatch.setattr(builtins, "__import__", guarded_import) assert auto_max_workers_per_gpu(num_jobs=16, num_gpus=8) == 2 def test_resolve_max_workers_per_gpu_passes_through_int(): args = Namespace(max_workers_per_gpu=4, num_jobs=16, gpus=8, backend="auto") assert resolve_max_workers_per_gpu(args) == 4 assert args.max_workers_per_gpu == 4 def test_resolve_max_workers_per_gpu_resolves_auto(monkeypatch): monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB", "1") monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") args = Namespace( max_workers_per_gpu="auto", num_jobs=16, gpus=8, backend="auto" ) resolved = resolve_max_workers_per_gpu(args) assert isinstance(resolved, int) assert resolved >= 1 assert args.max_workers_per_gpu == resolved def test_resolve_max_workers_per_gpu_is_idempotent(monkeypatch): monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB", "1") monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") args = Namespace( max_workers_per_gpu="auto", num_jobs=16, gpus=8, backend="auto" ) first = resolve_max_workers_per_gpu(args) second = resolve_max_workers_per_gpu(args) assert first == second def test_num_workers_per_gpu_from_args_requires_resolved_value(): args = Namespace(max_workers_per_gpu="auto") with pytest.raises(ValueError, match="resolve_local_parallelism_args"): num_workers_per_gpu_from_args(args) args.max_workers_per_gpu = 3 assert num_workers_per_gpu_from_args(args) == 3 def test_warmup_measurement_can_only_tighten_an_auto_plan(monkeypatch): monkeypatch.setenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "512") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "512") monkeypatch.setattr(planning.os, "cpu_count", lambda: 256) args = Namespace( max_workers_per_gpu="auto", num_jobs="auto", gpus=1, backend="auto", ) resolve_local_parallelism_args(args) initial_workers = args.max_workers_per_gpu initial_budget = args.device_memory_budget_bytes # Refinement must use the launch snapshot, not a later live-free reading # that may temporarily include allocations from the probe or peers. monkeypatch.setenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "10") refine_local_parallelism_from_warmup(args, [{ "cuda_peak_reserved_bytes": 20 * (1 << 30), "host_peak_rss_bytes": 4 * (1 << 30), }]) assert args.max_workers_per_gpu < initial_workers assert args.max_workers_per_gpu == 3 assert args.device_memory_budget_bytes > initial_budget assert args.workload_plan.device_memory_budget_gb == pytest.approx(24.0) assert args.workload_plan.warmup_device_peak_gb == 20.0 assert args.workload_plan.warmup_host_peak_gb == 4.0 def test_warmup_host_measurement_retains_dataloader_child_allowance( monkeypatch): monkeypatch.setenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "40") monkeypatch.setenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB", "24") monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "32") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "32") monkeypatch.setattr(planning.os, "cpu_count", lambda: 256) args = Namespace( max_workers_per_gpu="auto", num_jobs="auto", gpus=8, backend="auto", dataloader_num_workers=2, ) resolve_local_parallelism_args(args) refine_local_parallelism_from_warmup(args, [{ "host_peak_rss_bytes": 4 * (1 << 30), }]) expected_worker_gb = 4.0 * 1.10 + 2 * HOST_RAM_PER_DATALOADER_CHILD_GB assert args.workload_plan.host_worker_gb == pytest.approx(expected_worker_gb) assert args.workload_plan.host_memory_num_jobs_cap == 5 assert args.num_jobs == 5 def test_warmup_measurement_never_changes_explicit_concurrency(monkeypatch): monkeypatch.setenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "512") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "512") args = Namespace( max_workers_per_gpu=2, num_jobs=2, gpus=1, backend="auto", ) resolve_local_parallelism_args(args) refine_local_parallelism_from_warmup(args, [{ "cuda_peak_reserved_bytes": 70 * (1 << 30), "host_peak_rss_bytes": 100 * (1 << 30), }]) assert args.max_workers_per_gpu == 2 assert args.num_jobs == 2 def test_spawn_context_memory_tightens_auto_worker_count(monkeypatch): monkeypatch.setenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "64") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "64") monkeypatch.setattr(planning.os, "cpu_count", lambda: 64) args = Namespace( max_workers_per_gpu="auto", num_jobs="auto", gpus=4, backend="auto", ) resolve_local_parallelism_args(args) assert args.num_jobs > 4 refine_local_parallelism_from_spawn_context( args, context_bytes=8 * (1 << 30), memory={ "total_gb": 64.0, "available_gb": 60.0, "source": "test", }, ) assert args.num_jobs == 4 assert args.max_workers_per_gpu == 1 assert args.workload_plan.host_worker_gb == pytest.approx(13.0) assert any( "loaded spawn context" in warning for warning in args.workload_plan.warnings ) def test_spawn_context_memory_preserves_explicit_worker_count(monkeypatch): monkeypatch.setattr(planning.os, "cpu_count", lambda: 64) args = Namespace( max_workers_per_gpu=4, num_jobs=8, gpus=2, backend="auto", ) resolve_local_parallelism_args(args) refine_local_parallelism_from_spawn_context( args, context_bytes=8 * (1 << 30), memory={ "total_gb": 32.0, "available_gb": 20.0, "source": "test", }, ) assert args.num_jobs == 8 assert args.max_workers_per_gpu == 4 assert any( "explicit num_jobs=8" in warning for warning in args.workload_plan.warnings ) def test_spawn_context_memory_falls_back_to_loaded_parent(monkeypatch): monkeypatch.setenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "64") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "64") monkeypatch.setattr(planning.os, "cpu_count", lambda: 64) args = Namespace( max_workers_per_gpu="auto", num_jobs="auto", gpus=1, backend="auto", ) resolve_local_parallelism_args(args) assert args.num_jobs > 0 refine_local_parallelism_from_spawn_context( args, context_bytes=8 * (1 << 30), memory={ "total_gb": 64.0, "available_gb": 10.0, "source": "test", }, ) assert args.num_jobs == 0 assert args.workload_plan.capacity == 0 assert args.workload_plan.host_memory_num_jobs_cap == 0 assert any( "capped" in warning and "to 0" in warning for warning in args.workload_plan.warnings ) def test_worker_context_size_counts_shared_payload_once(): payload = bytearray(1024) single = estimate_worker_context_bytes({"payload": payload}) shared = estimate_worker_context_bytes({"a": payload, "b": payload}) assert shared < single + len(payload) assert shared >= len(payload) def test_cpu_thread_budget_uses_final_worker_and_dataloader_counts(monkeypatch): for name in ( "OMP_NUM_THREADS", "MKL_NUM_THREADS", "OPENBLAS_NUM_THREADS"): monkeypatch.delenv(name, raising=False) monkeypatch.delenv("MHCFLURRY_%s_AUTO" % name, raising=False) plan = Namespace(num_jobs=8, dataloader_num_workers=1) # 34 CPUs - 2 orchestrator - 8 DataLoader children = 24; / 8 = 3. assert resolve_cpu_threads_per_worker(plan, cpu_count=34) == 3 assert os.environ["OMP_NUM_THREADS"] == "3" assert os.environ["MKL_NUM_THREADS"] == "3" assert os.environ["OPENBLAS_NUM_THREADS"] == "3" def test_explicit_cpu_thread_env_is_preserved_and_propagated(monkeypatch): expected_env = { "OMP_NUM_THREADS": "7", "MKL_NUM_THREADS": "5", "OPENBLAS_NUM_THREADS": "3", } for name, value in expected_env.items(): monkeypatch.setenv(name, value) monkeypatch.delenv("MHCFLURRY_%s_AUTO" % name, raising=False) captured = {} def fake_make_worker_pool(**kwargs): captured.update(kwargs) return "pool" monkeypatch.setattr( worker_pool_module, "make_worker_pool", fake_make_worker_pool) args = Namespace( max_workers_per_gpu=1, num_jobs=1, gpus=0, backend="cpu", max_tasks_per_worker=None, worker_log_dir=None, ) assert worker_pool_with_gpu_assignments_from_args(args) == "pool" assert args.cpu_threads_per_worker_was_auto is False assert { name: os.environ[name] for name in expected_env } == expected_env assert captured["initializer_kwargs_per_process"] == [{ "backend": "cpu", "max_workers_per_gpu": 1, "cpu_threads_per_worker": args.cpu_threads_per_worker, "cpu_threads_per_worker_was_auto": False, }] def test_stale_auto_thread_marker_does_not_override_new_explicit_value( monkeypatch): for name in ( "OMP_NUM_THREADS", "MKL_NUM_THREADS", "OPENBLAS_NUM_THREADS"): monkeypatch.delenv(name, raising=False) monkeypatch.delenv("MHCFLURRY_%s_AUTO" % name, raising=False) plan = Namespace(num_jobs=2, dataloader_num_workers=0) assert resolve_cpu_threads_per_worker(plan, cpu_count=10) == 4 assert os.environ["MHCFLURRY_OMP_NUM_THREADS_AUTO"] == "4" # Simulate a caller overriding one inherited setting between commands # without knowing about MHCflurry's private ownership marker. monkeypatch.setenv("OMP_NUM_THREADS", "7") threads, auto_owned = resolve_cpu_thread_budget( plan, cpu_count=6) assert threads == 2 assert auto_owned is False assert os.environ["OMP_NUM_THREADS"] == "7" assert os.environ["MHCFLURRY_OMP_NUM_THREADS_AUTO"] == "4" assert os.environ["MKL_NUM_THREADS"] == "2" assert os.environ["MHCFLURRY_MKL_NUM_THREADS_AUTO"] == "2" def test_serial_resolution_applies_auto_cpu_thread_budget(monkeypatch): for name in ( "OMP_NUM_THREADS", "MKL_NUM_THREADS", "OPENBLAS_NUM_THREADS"): monkeypatch.delenv(name, raising=False) monkeypatch.delenv("MHCFLURRY_%s_AUTO" % name, raising=False) native_calls = [] pytorch_calls = [] def fake_configure_worker_cpu_threads(num_threads, auto_owned=True): native_calls.append((num_threads, auto_owned)) return num_threads monkeypatch.setattr( worker_runtime_module, "configure_worker_cpu_threads", fake_configure_worker_cpu_threads, ) monkeypatch.setattr( planning, "configure_pytorch", lambda **kwargs: pytorch_calls.append(kwargs), ) args = Namespace( max_workers_per_gpu=1, num_jobs=0, gpus=0, backend="cpu", ) resolve_local_parallelism_args(args) assert args.cpu_threads_per_worker_was_auto is True assert native_calls == [(args.cpu_threads_per_worker, True)] assert pytorch_calls == [{"num_threads": args.cpu_threads_per_worker}] def test_resolve_local_parallelism_args_caps_auto_num_jobs(monkeypatch): # Force a VRAM cap by pinning per-worker GB high so by_vram=1 and the # auto MWPG resolves to 1; auto num_jobs follows GPU capacity. monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "40") monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "512") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "512") monkeypatch.setattr(planning.os, "cpu_count", lambda: 256) monkeypatch.setenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB", "24" ) monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE", raising=False) args = Namespace( max_workers_per_gpu="auto", num_jobs="auto", gpus=8, backend="auto" ) resolve_local_parallelism_args(args) assert args.max_workers_per_gpu == 1 assert args.num_jobs == 8 assert args.max_workers_per_gpu_was_auto is True def test_resolve_local_parallelism_args_has_no_default_worker_hard_cap( monkeypatch, ): # 80 GB free minus the shared 10% reserve fits 18 complete 4 GB workers. monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") monkeypatch.delenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB", raising=False ) monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE", raising=False) args = Namespace( max_workers_per_gpu="auto", num_jobs=0, # auto -> by_jobs clamp skipped gpus=8, backend="auto", ) resolve_local_parallelism_args(args) assert args.max_workers_per_gpu == 18 assert args.num_jobs == 0 assert args.max_workers_per_gpu_was_auto is True def test_auto_max_workers_per_gpu_pins_to_by_jobs_when_num_jobs_explicit( monkeypatch, ): # Production today passes --num-jobs 16. With 8 GPUs and the new # 4 GB/worker default + 80 GB free, by_vram=13 and hard_cap=4 — but # by_jobs=16//8=2 still wins. This is intentional: explicit num_jobs # is a user contract. monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") monkeypatch.delenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB", raising=False ) chosen = auto_max_workers_per_gpu(num_jobs=16, num_gpus=8, backend="auto") assert chosen == 2 def test_resolve_local_parallelism_args_honors_explicit_num_jobs_override( monkeypatch, ): monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "512") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "512") monkeypatch.setattr(planning.os, "cpu_count", lambda: 256) monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE", raising=False) args = Namespace( max_workers_per_gpu=1, num_jobs=16, gpus=8, backend="auto" ) resolve_local_parallelism_args(args) assert args.max_workers_per_gpu == 1 assert args.num_jobs == 16 assert args.max_workers_per_gpu_was_auto is False assert "num_jobs" in args.workload_plan.cli_overrides assert any("honoring CLI override" in w for w in args.workload_plan.warnings) def test_resolve_local_parallelism_args_num_jobs_auto_resolves_to_capacity( monkeypatch, ): # ``num_jobs="auto"`` (the new default) resolves to gpus × MWPG so # production no longer has to hand-pick a value that may not match # the resolver's MWPG choice. monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "512") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "512") monkeypatch.setattr(planning.os, "cpu_count", lambda: 256) monkeypatch.delenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB", raising=False ) monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE", raising=False) args = Namespace( max_workers_per_gpu="auto", num_jobs="auto", gpus=8, backend="auto", ) resolve_local_parallelism_args(args) assert args.max_workers_per_gpu == 18 assert args.num_jobs == 144 # 8 × 18 assert args.num_jobs_was_auto is True def test_resolve_local_parallelism_args_keeps_stdout_clean(monkeypatch, capsys): monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "512") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "512") monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE", raising=False) args = Namespace( max_workers_per_gpu="auto", num_jobs="auto", gpus=1, backend="auto", ) resolve_local_parallelism_args(args) captured = capsys.readouterr() assert captured.out == "" assert "Local workload plan:" in captured.err def test_resolve_local_parallelism_args_uses_workload_profile(monkeypatch): # Presentation calibration keeps a full presentation predictor stack # resident, so its auto plan should be much more conservative than the # generic training fallback on 40 GB GPUs. monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "40") monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "256") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "256") monkeypatch.delenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB", raising=False ) monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE", raising=False) args = Namespace( max_workers_per_gpu="auto", num_jobs="auto", gpus=4, backend="auto", ) resolve_local_parallelism_args( args, workload_name=WORKLOAD_PRESENTATION_CALIBRATION, workload_hints={"prediction_rows": 40_000_000}, ) assert args.max_workers_per_gpu == 1 assert args.num_jobs == 4 assert args.workload_plan.workload_name == WORKLOAD_PRESENTATION_CALIBRATION assert args.workload_plan.device_worker_gb == 24.0 def test_resolve_local_parallelism_args_caps_auto_jobs_by_available_host_memory( monkeypatch, ): monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "32") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "10") monkeypatch.setenv("MHCFLURRY_AUTO_HOST_MEMORY_SAFETY_FRACTION", "0.70") monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE", raising=False) args = Namespace( max_workers_per_gpu="auto", num_jobs="auto", gpus=4, backend="auto", ) resolve_local_parallelism_args( args, workload_name=WORKLOAD_PRESENTATION_CALIBRATION, ) assert args.num_jobs == 1 assert args.workload_plan.host_memory_available_gb == 10.0 assert args.workload_plan.host_memory_num_jobs_cap == 1 assert args.workload_plan.host_worker_gb == ( 6.0 + args.dataloader_num_workers * HOST_RAM_PER_DATALOADER_CHILD_GB ) def test_system_memory_info_uses_env_override(monkeypatch): monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "32") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "9.5") info = system_memory_info_gb() assert info["total_gb"] == 32.0 assert info["available_gb"] == 9.5 assert info["source"] == "env" def test_host_memory_num_jobs_cap_uses_available_memory(monkeypatch): monkeypatch.setenv("MHCFLURRY_AUTO_HOST_MEMORY_SAFETY_FRACTION", "0.50") sizing = estimate_workload_memory(WORKLOAD_PRESENTATION_CALIBRATION) cap = host_memory_num_jobs_cap( {"total_gb": 32.0, "available_gb": 10.0, "source": "test"}, sizing["host_worker_gb"], ) assert cap == 1 def test_workload_memory_accepts_plain_hint_dict(): small = estimate_workload_memory( WORKLOAD_PROCESSING_TRAINING, {"data_bytes": int(1 * GIB)}, ) large = estimate_workload_memory( WORKLOAD_PROCESSING_TRAINING, {"data_bytes": int(20 * GIB)}, ) assert small["device_worker_gb"] == 8.0 assert large["device_worker_gb"] > small["device_worker_gb"] assert large["data_pressure_gb"] > 0 def test_explicit_cli_flags_flow_through_workload_plan(monkeypatch): monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "512") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "512") monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE", raising=False) monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE_LOSS", raising=False) monkeypatch.delenv("MHCFLURRY_MATMUL_PRECISION", raising=False) args = Namespace( max_workers_per_gpu=2, num_jobs=8, gpus=4, backend="auto", dataloader_num_workers=3, random_negative_pool_epochs=5, torch_compile="1", torch_compile_loss="0", matmul_precision="high", enable_timing=True, ) resolve_local_parallelism_args(args) assert args.num_jobs == 8 assert args.max_workers_per_gpu == 2 assert args.dataloader_num_workers == 3 assert args.random_negative_pool_epochs == 5 for name in ( "num_jobs", "max_workers_per_gpu", "dataloader_num_workers", "random_negative_pool_epochs", "torch_compile", "torch_compile_loss", "matmul_precision", "enable_timing", ): assert name in args.workload_plan.cli_overrides assert os.environ["MHCFLURRY_TORCH_COMPILE"] == "1" assert os.environ["MHCFLURRY_TORCH_COMPILE_LOSS"] == "0" assert os.environ["MHCFLURRY_MATMUL_PRECISION"] == "high" def test_resolve_local_parallelism_args_num_jobs_auto_cpu_only( monkeypatch, ): # CPU-only / no GPUs: num_jobs="auto" resolves to 0 (serial) — caller # decides whether to spawn an explicit CPU pool. monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE", raising=False) args = Namespace( max_workers_per_gpu="auto", num_jobs="auto", gpus=0, backend="cpu", ) resolve_local_parallelism_args(args) assert args.num_jobs == 0 assert args.num_jobs_was_auto is True def test_resolve_local_parallelism_args_auto_detects_gpus(monkeypatch): """When --gpus is unset and backend allows GPU, the resolver auto-detects the visible CUDA device count via nvidia-smi -L (no torch import in the parent). Without this, parallel prediction with --num-jobs N and no --gpus piles every worker onto GPU 0.""" monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "512") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "512") monkeypatch.delenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB", raising=False ) monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_HARD_CAP", "4") monkeypatch.setattr( planning, "detect_num_cuda_devices_no_torch", lambda: 4) monkeypatch.setattr(planning.os, "cpu_count", lambda: 64) args = Namespace( max_workers_per_gpu="auto", num_jobs="auto", gpus=None, # unset — should be auto-filled backend="auto", ) resolve_local_parallelism_args(args) assert args.gpus == 4 assert args.gpus_was_auto is True assert args.max_workers_per_gpu == 4 assert args.num_jobs == 16 def test_resolve_local_parallelism_args_counts_cuda_visible_devices(monkeypatch): """Scheduler CUDA masks are authoritative for GPU auto-detection.""" def boom(*args, **kwargs): raise AssertionError("nvidia-smi should not be called when masked") monkeypatch.setenv("CUDA_VISIBLE_DEVICES", "2,3") monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "512") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "512") monkeypatch.setattr(planning.subprocess, "check_output", boom) monkeypatch.setattr(planning.os, "cpu_count", lambda: 256) args = Namespace( max_workers_per_gpu="auto", num_jobs="auto", gpus=None, backend="auto", ) resolve_local_parallelism_args(args) assert args.gpus == 2 assert args.gpus_was_auto is True assert args.num_jobs == 36 def test_resolve_local_parallelism_args_detects_gpus_before_explicit_jobs( monkeypatch): """Auto MWPG must see auto-detected GPUs before explicit num_jobs is capacity-checked; otherwise 16 jobs on 8 GPUs is under-capped to 8.""" monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "80") monkeypatch.delenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_PER_WORKER_GB", raising=False ) monkeypatch.setenv("MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_HARD_CAP", "4") monkeypatch.setattr( planning, "detect_num_cuda_devices_no_torch", lambda: 8) args = Namespace( max_workers_per_gpu="auto", num_jobs=16, gpus=None, backend="auto", ) resolve_local_parallelism_args(args) assert args.gpus == 8 assert args.max_workers_per_gpu == 2 assert args.num_jobs == 16 def test_worker_pool_from_args_preserves_serial_mode_with_auto_gpus( monkeypatch): """Explicit ``--num-jobs 0`` must not become invalid after GPU detect.""" monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE", raising=False) for name in ( "OMP_NUM_THREADS", "MKL_NUM_THREADS", "OPENBLAS_NUM_THREADS"): monkeypatch.delenv(name, raising=False) monkeypatch.delenv("MHCFLURRY_%s_AUTO" % name, raising=False) monkeypatch.setattr( planning, "detect_num_cuda_devices_no_torch", lambda: 2) configured = [] native_calls = [] def fake_configure_worker_cpu_threads(num_threads, auto_owned=True): native_calls.append((num_threads, auto_owned)) return num_threads monkeypatch.setattr( worker_runtime_module, "configure_worker_cpu_threads", fake_configure_worker_cpu_threads, ) monkeypatch.setattr( worker_pool_module, "configure_worker_cpu_threads", fake_configure_worker_cpu_threads, ) monkeypatch.setattr(planning, "configure_pytorch", lambda **kwargs: None) monkeypatch.setattr( worker_pool_module, "configure_pytorch", lambda **kwargs: configured.append(kwargs)) args = Namespace( max_workers_per_gpu="auto", num_jobs=0, gpus=None, backend="auto", max_tasks_per_worker=None, worker_log_dir=None, ) worker_pool = worker_pool_with_gpu_assignments_from_args(args) assert worker_pool is None assert args.gpus == 2 assert args.num_jobs == 0 assert native_calls == [ (args.cpu_threads_per_worker, True), (args.cpu_threads_per_worker, True), ] assert configured == [{ "backend": "auto", "num_threads": args.cpu_threads_per_worker, }] def test_worker_pool_creates_worker_log_dir(tmp_path, monkeypatch): captured = {} def fake_make_worker_pool(**kwargs): captured.update(kwargs) return "pool" monkeypatch.setattr(worker_pool_module, "make_worker_pool", fake_make_worker_pool) worker_log_dir = tmp_path / "missing" / "worker-logs" worker_pool = worker_pool_with_gpu_assignments( num_jobs=1, num_gpus=0, backend="cpu", max_workers_per_gpu=1, worker_log_dir=str(worker_log_dir), ) assert worker_pool == "pool" assert worker_log_dir.is_dir() assert ( captured["initializer_kwargs_per_process"][0]["worker_log_dir"] == str(worker_log_dir) ) def test_worker_pool_passes_constant_context_once_per_worker(monkeypatch): captured = {} def fake_make_worker_pool(**kwargs): captured.update(kwargs) return "pool" monkeypatch.setattr( worker_pool_module, "make_worker_pool", fake_make_worker_pool) context = {"large": object()} worker_pool = worker_pool_with_gpu_assignments( num_jobs=2, num_gpus=0, backend="cpu", max_workers_per_gpu=1, worker_context_module="mhcflurry.cli.example", worker_context_data=context, ) assert worker_pool == "pool" assert captured["initializer_shared_kwargs"] == { "worker_context_module": "mhcflurry.cli.example", "worker_context_data": context, } def test_spawn_pool_refines_loaded_context_before_worker_start(monkeypatch): calls = [] monkeypatch.setattr( worker_pool_module, "refine_local_parallelism_from_spawn_context", lambda args, size: calls.append((args, size)), ) monkeypatch.setattr( worker_pool_module, "make_worker_pool", lambda **_kwargs: "pool") args = Namespace( max_workers_per_gpu=1, num_jobs=1, gpus=0, backend="cpu", max_tasks_per_worker=None, worker_log_dir=None, ) context = {"payload": bytearray(1024)} result = worker_pool_with_gpu_assignments_from_args( args, start_method="spawn", worker_context_module="mhcflurry.cli.example", worker_context_data=context, ) assert result == "pool" assert len(calls) == 1 assert calls[0][0] is args assert calls[0][1] >= 1024 def test_install_worker_context_updates_existing_mapping(monkeypatch): target = {"stale": True} module = Namespace(WORKER_CONTEXT=target) monkeypatch.setattr( worker_runtime_module.importlib, "import_module", lambda name: module, ) installed = worker_runtime_module.install_worker_context( "example.module", {"fresh": 1}) assert installed is target assert target == {"fresh": 1} def test_worker_initializer_finalizer_keeps_only_slot_identity(monkeypatch): finalized = [] slots = multiprocessing.Array("q", 1) sequence = multiprocessing.Value("q", 0, lock=False) monkeypatch.setattr( worker_runtime_module, "Finalize", lambda _obj, _callback, args, **kwargs: finalized.append(args), ) received = {} worker_runtime_module.worker_init_entry_point( lambda **kwargs: received.update(kwargs), kwargs_per_process=[{"per_process": 1}], slots=slots, sequence=sequence, shared_kwargs={"worker_context_data": {"large": object()}}, ) assert finalized == [(slots, 0, 1)] assert set(received) == {"per_process", "worker_context_data"} def test_worker_initializer_reuses_released_slot_and_ignores_old_finalizer(monkeypatch): finalized = [] slots = multiprocessing.Array("q", 2) sequence = multiprocessing.Value("q", 0, lock=False) monkeypatch.setattr( worker_runtime_module, "Finalize", lambda _obj, _callback, args, **kwargs: finalized.append(args), ) received = [] def initialize(): worker_runtime_module.worker_init_entry_point( lambda slot: received.append(slot), kwargs_per_process=[{"slot": 0}, {"slot": 1}], slots=slots, sequence=sequence) initialize() initialize() worker_runtime_module.release_initializer_slot(*finalized[1]) initialize() assert received == [0, 1, 1] worker_runtime_module.release_initializer_slot(*finalized[1]) assert list(slots) == [1, 3] @pytest.mark.parametrize("start_method", [ method for method in ("fork", "spawn") if method in multiprocessing.get_all_start_methods() ]) def test_large_initializer_payload_starts_recycles_and_joins(start_method): # A subprocess deadline makes startup/shutdown deadlocks fail instead of # hanging pytest. Reuse importable functions for the spawn start method. code = """ from mhcflurry.parallelism.worker_pool import make_worker_pool from test.test_local_parallelism import ( _set_shared_initializer_state, _read_shared_initializer_state) if __name__ == '__main__': payload = 'x' * 100_000 pool = make_worker_pool( processes=2, initializer=_set_shared_initializer_state, initializer_kwargs_per_process=[ {'per_process_value': payload + str(i)} for i in range(2)], initializer_shared_kwargs={'shared_value': 'shared'}, start_method=START_METHOD, max_tasks_per_worker=1) result = pool.map(_read_shared_initializer_state, range(6), chunksize=1) pool.close() pool.join() assert len(result) == 6 assert {v[1] for v in result} == {payload + '0', payload + '1'} """.replace("START_METHOD", repr(start_method)) subprocess.run([sys.executable, "-c", code], check=True, timeout=120, capture_output=True, text=True) @pytest.mark.skipif( "fork" not in multiprocessing.get_all_start_methods(), reason="fork start method unavailable", ) def test_fork_pool_assigns_every_initializer_slot_once_and_joins(): num_workers = 16 seen_slots = multiprocessing.get_context("fork").SimpleQueue() pool = worker_pool_module.make_worker_pool( processes=num_workers, initializer=_record_initializer_slot, initializer_kwargs_per_process=[ {"slot": slot} for slot in range(num_workers) ], initializer_shared_kwargs={"seen_slots": seen_slots}, start_method="fork", ) try: pool.close() pool.join() except BaseException: pool.terminate() pool.join() raise assert sorted(seen_slots.get() for _ in range(num_workers)) == list( range(num_workers)) @pytest.mark.skipif( "fork" not in multiprocessing.get_all_start_methods(), reason="fork start method unavailable", ) def test_fork_pool_reuses_initializer_slots_after_worker_restart(): pool = worker_pool_module.make_worker_pool( processes=2, initializer=_set_shared_initializer_state, initializer_kwargs_per_process=[ {"per_process_value": "worker-0"}, {"per_process_value": "worker-1"}, ], initializer_shared_kwargs={"shared_value": "shared"}, max_tasks_per_worker=1, start_method="fork", ) try: results = pool.map(_read_shared_initializer_state, range(6), chunksize=1) pool.close() pool.join() except BaseException: pool.terminate() pool.join() raise assert {result[0] for result in results} == {"shared"} assert {result[1] for result in results} == {"worker-0", "worker-1"} def test_spawn_pool_installs_shared_initializer_data_once_per_worker(): pool = worker_pool_module.make_worker_pool( processes=1, initializer=_set_shared_initializer_state, initializer_kwargs_per_process=[{"per_process_value": "worker"}], initializer_shared_kwargs={"shared_value": "shared"}, start_method="spawn", ) try: assert pool.apply(_read_shared_initializer_state, (None,)) == ( "shared", "worker") finally: pool.close() pool.join() @pytest.mark.parametrize("kwargs", [ {"initializer_shared_kwargs": {"shared": 1}}, {"initializer_kwargs_per_process": [{}]}, ]) def test_initializer_arguments_require_initializer(kwargs): with pytest.raises(ValueError, match="requires an initializer"): worker_pool_module.make_worker_pool(processes=1, **kwargs) def test_per_process_initializer_arguments_validate_worker_count(): with pytest.raises(ValueError, match="one mapping per worker"): worker_pool_module.make_worker_pool( processes=2, initializer=_set_shared_initializer_state, initializer_kwargs_per_process=[{}], ) @pytest.mark.parametrize("processes", [0, -1]) def test_make_worker_pool_rejects_nonpositive_process_count(processes): with pytest.raises(ValueError, match="positive integer"): worker_pool_module.make_worker_pool(processes=processes) def test_make_worker_pool_rejects_nonpositive_task_lifetime(): with pytest.raises(ValueError, match="max_tasks_per_worker"): worker_pool_module.make_worker_pool( processes=1, max_tasks_per_worker=0, ) def test_make_worker_pool_rejects_initializer_argument_overlap(): with pytest.raises(ValueError, match="both shared and per-process"): worker_pool_module.make_worker_pool( processes=1, initializer=_set_shared_initializer_state, initializer_kwargs_per_process=[{"shared_value": "worker"}], initializer_shared_kwargs={"shared_value": "shared"}, ) @pytest.mark.parametrize( ("module", "data"), [("test.module", None), (None, {})], ) def test_worker_pool_requires_complete_context_pair(module, data): with pytest.raises(ValueError, match="must be supplied together"): worker_pool_with_gpu_assignments( num_jobs=1, backend="cpu", worker_context_module=module, worker_context_data=data, ) @pytest.mark.parametrize("builder", [ add_local_parallelism_args, add_prediction_parallelism_args, ]) def test_parallelism_parser_rejects_nonpositive_worker_lifetime(builder): parser = ArgumentParser() builder(parser) with pytest.raises(SystemExit): parser.parse_args(["--max-tasks-per-worker", "0"]) def test_resolve_local_parallelism_args_skips_auto_detect_with_explicit_gpus( monkeypatch): """An explicit --gpus value isn't overridden by auto-detect.""" monkeypatch.setattr( planning, "detect_num_cuda_devices_no_torch", lambda: 8) # would lie if called args = Namespace( max_workers_per_gpu="auto", num_jobs="auto", gpus=2, # explicit backend="auto", ) resolve_local_parallelism_args(args) assert args.gpus == 2 assert args.gpus_was_auto is False def test_resolve_local_parallelism_args_no_auto_detect_for_cpu_backend( monkeypatch): """backend=cpu must not auto-detect GPUs (we don't want CUDA-pinned workers when the user explicitly asked for CPU inference).""" monkeypatch.setattr( planning, "detect_num_cuda_devices_no_torch", lambda: 8) args = Namespace( max_workers_per_gpu="auto", num_jobs="auto", gpus=None, backend="cpu", ) resolve_local_parallelism_args(args) assert (args.gpus or 0) == 0 assert args.gpus_was_auto is False def test_detect_num_cuda_devices_uses_empty_cuda_visible_devices(monkeypatch): """An empty CUDA mask means no visible GPUs, even if nvidia-smi exists.""" def boom(*args, **kwargs): raise AssertionError("nvidia-smi should not be called when masked") monkeypatch.setenv("CUDA_VISIBLE_DEVICES", "") monkeypatch.setattr(planning.subprocess, "check_output", boom) assert planning.detect_num_cuda_devices_no_torch() == 0 def test_free_vram_from_nvidia_smi_uses_cuda_visible_devices(monkeypatch): """Free-VRAM sizing should query scheduler-visible physical GPUs.""" calls = [] def fake_check_output(args, **kwargs): calls.append(args) return b"1024\n2048\n" monkeypatch.setenv("CUDA_VISIBLE_DEVICES", "2,3") monkeypatch.setattr( planning.subprocess, "check_output", fake_check_output) assert planning.free_vram_from_nvidia_smi_gb(2) == 1.0 assert calls == [[ "nvidia-smi", "-i", "2,3", "--query-gpu=memory.free", "--format=csv,noheader,nounits", ]] def test_detect_free_vram_per_gpu_preserves_heterogeneity(monkeypatch): """Per-GPU detection returns the vector; the scalar helper still mins it.""" monkeypatch.delenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", raising=False) monkeypatch.setattr( planning.subprocess, "check_output", lambda args, **kw: b"8192\n71680\n") # 8 GB, 70 GB assert free_vram_per_gpu_from_nvidia_smi_gb(2) == [8.0, 70.0] assert planning.detect_free_vram_per_gpu_gb(2) == [8.0, 70.0] assert planning.free_vram_from_nvidia_smi_gb(2) == 8.0 def test_free_vram_env_override_single_value_broadcasts(monkeypatch): monkeypatch.setenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", "12") assert planning.free_vram_per_gpu_override_gb(4) == [12.0] * 4 assert planning.free_vram_override_gb(4) == 12.0 @pytest.mark.parametrize("value", ["nan", "inf", "-1"]) def test_free_vram_env_override_rejects_unsafe_values(monkeypatch, value): monkeypatch.setenv( "MHCFLURRY_AUTO_MAX_WORKERS_PER_GPU_FREE_VRAM_GB", value) with pytest.raises(ValueError, match="finite non-negative"): planning.free_vram_per_gpu_override_gb(1) def test_capacity_warnings_flags_below_safe_range(): from mhcflurry.workload_planning import capacity_warnings common = dict(host_worker_gb=4.0, cpu_count=32) # Small GPU vs a heavy per-worker estimate. small = capacity_warnings( workload_name="affinity_calibration", backend="gpu", gpus=1, num_jobs=1, per_gpu_free_vram_gb=[8.0], device_worker_gb=24.0, available_ram_gb=64.0, **common) assert any("below the per-worker estimate" in m for m in small) # Uneven GPUs. hetero = capacity_warnings( workload_name="affinity_training", backend="gpu", gpus=2, num_jobs=2, per_gpu_free_vram_gb=[8.0, 70.0], device_worker_gb=4.0, available_ram_gb=256.0, **common) assert any("uneven across GPUs" in m for m in hetero) # Undetectable VRAM. blind = capacity_warnings( workload_name="affinity_training", backend="gpu", gpus=1, num_jobs=1, per_gpu_free_vram_gb=None, device_worker_gb=4.0, available_ram_gb=64.0, **common) assert any("could not detect free GPU VRAM" in m for m in blind) # Host RAM below the per-worker estimate (4 workers x 4 GB > 8 GB). low_ram = capacity_warnings( workload_name="affinity_training", backend="gpu", gpus=2, num_jobs=4, per_gpu_free_vram_gb=[80.0, 80.0], device_worker_gb=4.0, available_ram_gb=8.0, **common) assert any("available host RAM" in m for m in low_ram) # More workers than CPUs. cpu_short = capacity_warnings( workload_name="affinity_training", backend="gpu", gpus=8, num_jobs=8, per_gpu_free_vram_gb=[80.0] * 8, device_worker_gb=4.0, available_ram_gb=512.0, host_worker_gb=3.0, cpu_count=4) assert any("exceed detected CPUs" in m for m in cpu_short) def test_capacity_warnings_silent_on_healthy_machine(): from mhcflurry.workload_planning import capacity_warnings # Ample 8x80GB box: nothing below safe range. assert capacity_warnings( workload_name="affinity_calibration", backend="gpu", gpus=8, num_jobs=16, per_gpu_free_vram_gb=[78.0] * 8, device_worker_gb=24.0, available_ram_gb=900.0, host_worker_gb=4.0, cpu_count=176) == [] # CPU backend skips all GPU checks. assert capacity_warnings( workload_name="affinity_training", backend="cpu", gpus=0, num_jobs=0, per_gpu_free_vram_gb=None, device_worker_gb=4.0, available_ram_gb=8.0, host_worker_gb=3.0, cpu_count=2) == [] def test_detect_num_cuda_devices_parses_nvidia_smi_l(monkeypatch): """Counts only ``GPU N:``-prefixed lines, not MIG sub-devices or any diagnostic lines that happen to start with ``GPU ``.""" sample = ( b"GPU 0: NVIDIA A100-SXM4-80GB (UUID: GPU-aaa)\n" b" MIG 1g.10gb Device 0: (UUID: MIG-bbb)\n" b"GPU 1: NVIDIA A100-SXM4-80GB (UUID: GPU-ccc)\n" b"GPU debug: this should not be counted\n" ) monkeypatch.setattr( planning.subprocess, "check_output", lambda *a, **kw: sample) assert planning.detect_num_cuda_devices_no_torch() == 2 def test_detect_num_cuda_devices_returns_zero_when_smi_missing(monkeypatch): """OSError (e.g. nvidia-smi not on PATH) must be swallowed and return 0.""" def boom(*a, **kw): raise OSError("nvidia-smi: not found") monkeypatch.setattr(planning.subprocess, "check_output", boom) assert planning.detect_num_cuda_devices_no_torch() == 0 @pytest.mark.slow @pytest.mark.integration def test_nondaemonpool_worker_can_spawn_children(): """Non-daemon pool workers must be able to spawn multiprocessing children. Regression test for the case where DataLoader(num_workers>0) called from a mhcflurry Pool worker raised AssertionError("daemonic processes are not allowed to have children"). With NonDaemonPool the Pool workers are not daemonic, so spawning a child succeeds. """ with NonDaemonPool(processes=2) as pool: # Without the fix, this would raise from deep in the worker's # own multiprocessing machinery with the AssertionError above. exit_codes = pool.map(_spawn_child_from_pool_worker, [None, None]) assert all(code == 0 for code in exit_codes), ( f"children spawned from pool workers did not exit cleanly: " f"{exit_codes}. If this fails, Pool workers have regressed to " f"daemonic and the DataLoader prefetch optimization is broken " f"in production." ) mhcflurry-2.3.6/test/test_master_compat_predictions.py000066400000000000000000000071301525677230600234040ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Regression tests for individual neural network architectures. Each test case bundles a small model config, weights, and expected predictions under test/data/. These expected values were generated by the TF/Keras implementation and verify that the PyTorch code produces equivalent outputs for each supported architecture variant (affinity, pan-allele multiply/concat, densenet, multi-output). """ import json import os import numpy as np import pytest from mhcflurry.allele_encoding import AlleleEncoding from mhcflurry.class1_neural_network import Class1NeuralNetwork from mhcflurry.common import configure_pytorch, load_weights from mhcflurry.testing_utils import startup, cleanup from . import available_torch_accelerators MODEL_NAMES = [ "master_affinity", "master_pan_multiply", "master_pan_concat", "master_densenet", "master_multi_output", ] DATA_DIR = os.path.join(os.path.dirname(__file__), "data") def setup_module(): startup() def teardown_module(): cleanup() def _load_model_and_expected(name): prefix = name + "_fixture" with open(os.path.join(DATA_DIR, f"{prefix}_config.json"), "r") as f: config = json.load(f) weights = load_weights(os.path.join(DATA_DIR, f"{prefix}_weights.npz")) with open(os.path.join(DATA_DIR, f"{prefix}_predictions.json"), "r") as f: expected = json.load(f) return config, weights, expected def _predict(config, weights, expected, backend=None): if backend is not None: configure_pytorch(backend=backend) Class1NeuralNetwork.clear_model_cache() model = Class1NeuralNetwork.from_config(config, weights=weights) peptides = expected["peptides"] if "alleles" in expected: allele_encoding = AlleleEncoding( alleles=expected["alleles"], allele_to_sequence=expected["allele_to_sequence"], ) else: allele_encoding = None return model.predict(peptides, allele_encoding=allele_encoding) @pytest.mark.parametrize("model_name", MODEL_NAMES) def test_predictions_match_expected(model_name): config, weights, expected = _load_model_and_expected(model_name) predicted = _predict(config, weights, expected) np.testing.assert_allclose( predicted, np.array(expected["predictions"], dtype=np.float64), rtol=0.01, atol=0.0, ) @pytest.mark.parametrize("model_name", MODEL_NAMES) @pytest.mark.parametrize( "backend,device_type", available_torch_accelerators(), ids=lambda value: value, ) def test_accelerator_matches_cpu(model_name, backend, device_type): config, weights, expected = _load_model_and_expected(model_name) predicted_cpu = np.asarray( _predict(config, weights, expected, backend="cpu"), dtype=np.float64, ) predicted_accelerator = np.asarray( _predict(config, weights, expected, backend=backend), dtype=np.float64, ) np.testing.assert_allclose( predicted_accelerator, predicted_cpu, rtol=1e-5, atol=1e-2, err_msg=f"{device_type} predictions differ from CPU", ) mhcflurry-2.3.6/test/test_memory_budget.py000066400000000000000000000025601525677230600210070ustar00rootroot00000000000000import pytest import torch from mhcflurry.memory_budget import ( GIB, memory_reserve_bytes, memory_worker_capacity, module_tensor_bytes, per_worker_memory_budget_bytes, training_module_bytes, ) def test_shared_memory_reserve_scales_but_has_a_floor(): assert memory_reserve_bytes(40 * GIB) == 4 * GIB assert memory_reserve_bytes(4 * GIB) == 1 * GIB assert per_worker_memory_budget_bytes(40 * GIB, 2) == 18 * GIB def test_memory_worker_capacity_has_no_default_performance_cap(): assert memory_worker_capacity(80, 4) == 18 assert memory_worker_capacity(40, 17) == 2 for available, per_worker in ((float("nan"), 4), (80, float("inf"))): with pytest.raises(ValueError, match="must be finite"): memory_worker_capacity(available, per_worker) def test_module_and_training_state_bytes_are_shape_derived(): module = torch.nn.Sequential(torch.nn.Linear(3, 2, bias=True)) module.register_buffer("extra", torch.zeros(5, dtype=torch.float32)) parameter_bytes = sum( p.nelement() * p.element_size() for p in module.parameters()) buffer_bytes = sum( b.nelement() * b.element_size() for b in module.buffers()) assert module_tensor_bytes(module) == parameter_bytes + buffer_bytes assert training_module_bytes( module, optimizer_state_copies=2 ) == parameter_bytes * 4 + buffer_bytes mhcflurry-2.3.6/test/test_model_catalogue.py000066400000000000000000000251711525677230600212740ustar00rootroot00000000000000"""Discovery and explicit release selection must agree about paths and sources.""" import csv import io import json import re import sys from pathlib import Path import pytest from mhcflurry import downloads from mhcflurry.cli import downloads_command, predict_command, predict_scan_command BUNDLE = 'models_class1_presentation' @pytest.fixture def versioned_cache(tmp_path, monkeypatch): monkeypatch.setattr(downloads, '_CURRENT_RELEASE', '2.3.0') monkeypatch.setattr(downloads, '_DOWNLOADS_DIR', str(tmp_path / '2.3.0')) return tmp_path def record_source(path, release): path.mkdir(parents=True, exist_ok=True) metadata = downloads.get_release_downloads(release)[BUNDLE]['metadata'] with (path / 'DOWNLOAD_INFO.csv').open('w', newline='') as fd: writer = csv.writer(fd) writer.writerow(['url']) writer.writerows([url] for url in downloads.get_download_urls(metadata)) def test_all_bundles_have_descriptions(): metadata = downloads.get_downloads_metadata() names = {item['name'] for release in metadata['releases'].values() for item in release['downloads']} assert names == set(metadata['bundles']) for name in names: info = downloads.get_bundle_description(name) assert info['kind'] in ('models', 'data') assert info['description'] and info['group'] def test_shared_archive_versions_are_grouped(): groups = downloads.get_bundle_versions(BUNDLE) assert any(item['releases'] == ['2.2.0', '2.0.0'] for item in groups) assert len({tuple(item['urls']) for item in groups}) == len(groups) def test_list_json_and_historical_source(versioned_cache, capsys): downloads_command.run(['list', '--kind', 'models', '--release', '2.2.0', '--json']) result = json.loads(capsys.readouterr().out) assert result['release'] == '2.2.0' assert all(item['kind'] == 'models' for item in result['downloads']) presentation = next(item for item in result['downloads'] if item['name'] == BUNDLE) assert presentation['path'] == str(versioned_cache / '2.2.0' / BUNDLE) assert '/pre-2.0/' in presentation['urls'][0] assert presentation['status'] == 'not installed' def test_info_resolves_defaults_and_source_status(versioned_cache, capsys): target = versioned_cache / '2.3.0' / BUNDLE target.mkdir(parents=True) downloads_command.run(['info', BUNDLE, '--json']) assert json.loads(capsys.readouterr().out)['source_matches'] is None record_source(target, '2.3.0') downloads_command.run(['info', BUNDLE, '--json']) assert json.loads(capsys.readouterr().out)['source_matches'] is True record_source(target, '2.2.0') downloads_command.run(['info', BUNDLE, '--json']) assert json.loads(capsys.readouterr().out)['source_matches'] is False downloads_command.run(['--verbose', 'info']) text = capsys.readouterr().out assert text.index('Resolved configuration') < text.index('Environment variables') assert 'optional overrides' in text assert 'not file integrity' in text def test_info_puts_weight_versions_before_history_and_configuration(versioned_cache, capsys): record_source(versioned_cache / '2.3.0' / BUNDLE, '2.3.0') record_source(versioned_cache / '2.2.0' / BUNDLE, '2.2.0') downloads_command.run(['info']) text = capsys.readouterr().out assert text.index('LATEST') < text.index('Historical models') assert text.index('Historical models') < text.index('Resolved configuration') assert 'OTHER VERSIONS' in text and 'INSTALLED' in text assert 'Recommended: models_class1_presentation (includes affinity and processing).' in text model_rows = [line for line in text.splitlines() if line.startswith('models_class1_')] assert model_rows[0].startswith(BUNDLE + ' ') assert 'Full presentation predictor, including' not in text assert 'Default prediction paths' not in text assert 'mhcflurry downloads --verbose info' in text row = next(line for line in text.splitlines() if line.startswith(BUNDLE + ' ')) assert row.index('2.3.0') < row.index('2.2.0') # The actual installed catalogue directories remain selectable, including # aliases; availability groups shared archive URLs only once. cache = {} latest, other, installed = downloads_command._model_versions(BUNDLE, cache) assert latest == '2.3.0' assert other == '2.2.0, 1.7.0, 1.6.0' assert installed == '2.3.0, 2.2.0' def test_model_table_marks_unverified_sources_and_custom_roots(tmp_path, monkeypatch): monkeypatch.setattr(downloads, '_CURRENT_RELEASE', None) monkeypatch.setattr(downloads, '_DOWNLOADS_DIR', str(tmp_path)) path = tmp_path / BUNDLE path.mkdir() assert downloads_command._model_versions(BUNDLE, {})[2] == 'custom?' record_source(path, '2.2.0') assert downloads_command._model_versions(BUNDLE, {})[2] == 'custom: 2.2.0' (path / 'DOWNLOAD_INFO.csv').write_text('url\nhttps://example.org/custom-models\n') assert downloads_command._model_versions(BUNDLE, {})[2] == 'custom!' @pytest.mark.parametrize('environment', [{}, {'NO_COLOR': '1'}, {'TERM': 'dumb'}]) def test_table_color_preserves_alignment_and_plain_output(monkeypatch, environment): class Terminal(io.StringIO): def isatty(self): return True monkeypatch.delenv('NO_COLOR', raising=False) monkeypatch.setenv('TERM', 'xterm-256color') monkeypatch.setenv('COLUMNS', '80') for key, value in environment.items(): monkeypatch.setenv(key, value) plain = io.StringIO() terminal = Terminal() rows = [(BUNDLE, '2.3.0', '2.2.0, 1.7.0, 1.6.0', '2.3.0, 2.2.0'), ('models_class1_pan', '2.3.0', '2.2.0, 1.7.0', '—')] for stream in (plain, terminal): monkeypatch.setattr(sys, 'stdout', stream) downloads_command._print_table( ('MODEL', 'LATEST', 'OTHER VERSIONS', 'INSTALLED'), rows, colors={1: '36', 3: downloads_command._status_color}, wrap_columns=(2, 3)) assert '\x1b[' not in plain.getvalue() assert ('\x1b[' in terminal.getvalue()) == (not environment) assert re.sub(r'\x1b\[[0-9;]*m', '', terminal.getvalue()) == plain.getvalue() assert max(map(len, plain.getvalue().splitlines())) <= 80 def test_json_remains_uncolored_on_a_terminal(monkeypatch, capsys): monkeypatch.setattr(sys.stdout, 'isatty', lambda: True) monkeypatch.delenv('NO_COLOR', raising=False) monkeypatch.setenv('TERM', 'xterm-256color') downloads_command.run(['info', '--json']) text = capsys.readouterr().out assert '\x1b[' not in text result = json.loads(text) assert 'default_model_paths' in result and 'environment_overrides' in result def test_releases_filter_and_compatibility(capsys): downloads_command.run(['releases', BUNDLE, '--json']) records = json.loads(capsys.readouterr().out)['releases'] assert [item['release'] for item in records] == ['2.3.0', '2.2.0', '2.0.0', '1.7.0', '1.6.0'] downloads_command.run(['releases', '--json']) records = json.loads(capsys.readouterr().out)['releases'] assert not next(item for item in records if item['release'] == '0.2.0')['compatible'] @pytest.mark.parametrize('argv,message', [ (['list', '--release', '2.1.5'], 'Unknown download release'), (['info', 'missing'], 'not in release'), (['url', 'missing'], 'not in release'), (['path', 'missing'], 'not in release'), (['releases', 'missing'], 'Unknown download'), (['url'], 'required'), ]) def test_actionable_errors_without_traceback(argv, message, capsys): with pytest.raises(SystemExit) as error: downloads_command.run(argv) assert error.value.code == 2 text = capsys.readouterr().err assert message in text assert 'Traceback' not in text def test_explicit_release_overrides_active_and_model_defaults(versioned_cache, monkeypatch): old_models = versioned_cache / '2.2.0' / BUNDLE / 'models' old_models.mkdir(parents=True) monkeypatch.setattr(downloads, '_MHCFLURRY_DEFAULT_CLASS1_PRESENTATION_MODELS_DIR', '/other/models') assert downloads.get_model_release_dir('2.2.0') == str(old_models) assert downloads.get_default_class1_presentation_models_dir(False) == '/other/models' def test_missing_release_download_suggests_exact_command(versioned_cache): with pytest.raises(RuntimeError, match='fetch models_class1_presentation --release 2.2.0'): downloads.get_model_release_dir('2.2.0') with pytest.raises(ValueError, match='no presentation bundle'): downloads.get_model_release_dir('1.5.0') with pytest.raises(ValueError, match='incompatible'): downloads.get_model_release_dir('0.2.0') def test_custom_root_requires_matching_source(tmp_path, monkeypatch): monkeypatch.setattr(downloads, '_CURRENT_RELEASE', None) monkeypatch.setattr(downloads, '_DOWNLOADS_DIR', str(tmp_path)) models = tmp_path / BUNDLE / 'models' models.mkdir(parents=True) with pytest.raises(ValueError, match='Cannot confirm'): downloads.get_model_release_dir('2.2.0') record_source(models.parent, '2.3.0') with pytest.raises(ValueError, match='Cannot confirm'): downloads.get_model_release_dir('2.2.0') record_source(models.parent, '2.2.0') assert downloads.get_model_release_dir('2.2.0') == str(models) def test_path_and_url_select_requested_release(versioned_cache, capsys): path = versioned_cache / '2.2.0' / BUNDLE path.mkdir(parents=True) downloads_command.run(['path', BUNDLE, '--release', '2.2.0']) assert Path(capsys.readouterr().out.strip()) == path downloads_command.run(['url', BUNDLE, '--release', '2.2.0']) assert '/pre-2.0/' in capsys.readouterr().out @pytest.mark.parametrize('module', [predict_command, predict_scan_command]) def test_model_selection_flags_are_exclusive(module): with pytest.raises(SystemExit): module.parser.parse_args(['--models', '/models', '--model-release', '2.2.0']) args = module.parser.parse_args(['--model-release', '2.2.0']) assert args.model_release == '2.2.0' and args.models is None @pytest.mark.parametrize('module', [predict_command, predict_scan_command]) def test_prediction_loads_selected_release(module, versioned_cache, monkeypatch, capsys): path = versioned_cache / '2.2.0' / BUNDLE / 'models' path.mkdir(parents=True) (path / 'weights.csv').touch() seen = [] class Predictor: supported_alleles = ['test-allele'] def load(directory): seen.append(directory) if module is predict_command: return Predictor(), False return Predictor() monkeypatch.setattr(module, '_load_predictor_for_command', load) module.run(['--model-release', '2.2.0', '--list-supported-alleles']) assert seen == [str(path)] assert capsys.readouterr().out.strip() == 'test-allele' mhcflurry-2.3.6/test/test_multi_output.py000066400000000000000000000063001525677230600207130ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import numpy import pandas import pytest from mhcflurry.class1_neural_network import Class1NeuralNetwork from mhcflurry.common import random_peptides from mhcflurry.testing_utils import cleanup, startup numpy.random.seed(0) @pytest.fixture(scope="module") def setup_module(): startup() yield cleanup() @pytest.mark.slow @pytest.mark.integration def test_multi_output(setup_module): hyperparameters = dict( loss="custom:mse_with_inequalities_and_multiple_outputs", activation="tanh", layer_sizes=[16], max_epochs=50, minibatch_size=250, random_negative_rate=0.0, random_negative_constant=0.0, early_stopping=False, validation_split=0.0, locally_connected_layers=[ ], dense_layer_l1_regularization=0.0, dropout_probability=0.0, optimizer="adam", num_outputs=3) df = pandas.DataFrame() df["peptide"] = random_peptides(10000, length=9) df["output1"] = df.peptide.map(lambda s: s[4] == 'K').astype(int) * 49000 + 1 df["output2"] = df.peptide.map(lambda s: s[3] == 'Q').astype(int) * 49000 + 1 df["output3"] = df.peptide.map(lambda s: s[4] == 'K' or s[3] == 'Q').astype(int) * 49000 + 1 print("output1 mean", df.output1.mean()) print("output2 mean", df.output2.mean()) stacked = df.set_index("peptide").stack().reset_index() stacked.columns = ['peptide', 'output_name', 'value'] stacked["output_index"] = stacked.output_name.map({ "output1": 0, "output2": 1, "output3": 2, }) assert not stacked.output_index.isnull().any(), stacked fit_kwargs = { 'verbose': 1, } predictor = Class1NeuralNetwork(**hyperparameters) stacked_train = stacked predictor.fit( stacked_train.peptide.values, stacked_train.value.values, output_indices=stacked_train.output_index.values, **fit_kwargs) result = predictor.predict(df.peptide.values, output_index=None) print(df.shape, result.shape) print(result) df["prediction1"] = result[:,0] df["prediction2"] = result[:,1] df["prediction3"] = result[:,2] df_by_peptide = df.set_index("peptide") correlation = pandas.DataFrame( numpy.corrcoef(df_by_peptide.T), columns=df_by_peptide.columns, index=df_by_peptide.columns) print(correlation) sub_correlation = correlation.loc[ ["output1", "output2", "output3"], ["prediction1", "prediction2", "prediction3"], ] assert sub_correlation.iloc[0, 0] > 0.99, correlation assert sub_correlation.iloc[1, 1] > 0.99, correlation assert sub_correlation.iloc[2, 2] > 0.99, correlation mhcflurry-2.3.6/test/test_network_merging.py000066400000000000000000000041471525677230600213510ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import numpy import pandas import pytest from mhcflurry import Class1AffinityPredictor, Class1NeuralNetwork from mhcflurry.common import random_peptides from mhcflurry.downloads import get_path from mhcflurry.testing_utils import cleanup, startup def setup_module(): global PAN_ALLELE_PREDICTOR startup() PAN_ALLELE_PREDICTOR = Class1AffinityPredictor.load( get_path("models_class1_pan", "models.combined"), optimization_level=0,) def teardown_module(): global PAN_ALLELE_PREDICTOR PAN_ALLELE_PREDICTOR = None cleanup() @pytest.fixture(scope="module") def predictors(): return {"pan-allele": PAN_ALLELE_PREDICTOR} def test_merge(predictors): pan_allele_predictor = predictors['pan-allele'] assert len(pan_allele_predictor.class1_pan_allele_models) > 1 peptides = random_peptides(100, length=9) peptides.extend(random_peptides(100, length=10)) peptides = pandas.Series(peptides).sample(frac=1.0) alleles = pandas.Series( ["HLA-A*03:01", "HLA-B*57:01", "HLA-C*02:01"] ).sample(n=len(peptides), replace=True) predictions1 = pan_allele_predictor.predict( peptides=peptides, alleles=alleles) merged = Class1NeuralNetwork.merge( pan_allele_predictor.class1_pan_allele_models) merged_predictor = Class1AffinityPredictor( allele_to_sequence=pan_allele_predictor.allele_to_sequence, class1_pan_allele_models=[merged], ) predictions2 = merged_predictor.predict(peptides=peptides, alleles=alleles) numpy.testing.assert_allclose(predictions1, predictions2, atol=0.1) mhcflurry-2.3.6/test/test_numeric_sequences.py000066400000000000000000000224721525677230600216660ustar00rootroot00000000000000"""Numeric/string class-I encoding parity on CPU and available accelerators.""" import numpy as np import pytest import torch from mhcflurry.encodable_sequences import EncodableSequences, EncodingError from mhcflurry.amino_acid import AMINO_ACID_INDEX from mhcflurry.numeric_sequences import NumericSequences from mhcflurry.numeric_proteome import ProcessingProteome, ProteinWindows, NumericCandidatePool from mhcflurry.proteome_decoys import sample_peptide_frame_for_accessions DEVICES = ["cpu"] + (["cuda"] if torch.cuda.is_available() else []) + ( ["mps"] if torch.backends.mps.is_available() else []) @pytest.mark.parametrize("device", DEVICES) @pytest.mark.parametrize("method", ["pad_middle", "left_pad", "right_pad", "left_pad_right_pad", "left_pad_centered_right_pad"]) @pytest.mark.parametrize("width", [11, 15]) def test_numeric_alignment_is_exactly_string_alignment(device, method, width): peptides = ["ACDEFGHI", "CDEFGHIKL", "DEFGHIKLMN", "EFGHIKLMNPQ"] options = dict(alignment_method=method, max_length=width, left_edge=3, right_edge=3) expected = EncodableSequences(peptides).variable_length_to_fixed_length_categorical(**options) numeric = NumericSequences.from_strings(peptides) actual = numeric.aligned_tensor(options, device) assert actual.dtype == torch.int8 np.testing.assert_array_equal(actual.cpu().numpy(), expected) assert numeric.to_strings().tolist() == peptides @pytest.mark.parametrize("method", ["left_pad", "right_pad"]) def test_numeric_trim_and_unknown_padding_match_strings(method): peptides = ["ACDEXGHIKLMNPQ", "XXACDX"] options = dict(alignment_method=method, max_length=8, trim=True) actual = NumericSequences.from_strings(peptides).aligned_tensor(options) expected = EncodableSequences(peptides).variable_length_to_fixed_length_categorical(**options) np.testing.assert_array_equal(actual.numpy(), expected) def test_invalid_numeric_inputs_and_alignment_fail_explicitly(): for indices, lengths in [([[21]], [1]), ([[1.0]], [1]), ([[1]], [1.5]), ([[1]], [2]), ([[1]], [-1])]: with pytest.raises(ValueError): NumericSequences(indices, lengths) with pytest.raises(ValueError): NumericSequences.from_strings(["ABCD"]) with pytest.raises(EncodingError): NumericSequences.from_strings(["AAA"]).aligned_tensor({}) with pytest.raises(NotImplementedError): NumericSequences.from_strings(["ACDEFGHI"]).aligned_tensor({"trim": True}) assert NumericSequences.from_strings([]).aligned_tensor({}).shape == (0, 15) def test_numeric_row_selection_preserves_order_and_supports_masks(): peptides = NumericSequences.from_strings(["ACDEFGHI", "CDEFGHIKL", "DEFGHIKLMN"]) assert peptides.take([2, 0, 2]).to_strings().tolist() == ["DEFGHIKLMN", "ACDEFGHI", "DEFGHIKLMN"] assert peptides.take([True, False, True]).to_strings().tolist() == ["ACDEFGHI", "DEFGHIKLMN"] assert len(peptides.take([])) == 0 for rows in ([1.5], [True], [[0]]): with pytest.raises(ValueError): peptides.take(rows) @pytest.mark.parametrize("proteins,starts,lengths", [ ([0], [0.5], [8]), ([0], [-1], [8]), ([0], [1], [8]), ([1], [0], [8]), ([-1], [0], [8]), ([0], [0], [12]), ([0], [0], [0]), ([0, 0], [0], [8]), ([[0]], [0], [8]), ]) def test_protein_windows_reject_invalid_positions(proteins, starts, lengths): index = ProcessingProteome({"p": "ACDEFGHI"}) with pytest.raises(ValueError): ProteinWindows(index, proteins, starts, lengths) def test_protein_windows_validate_ownership_and_export_edges(): index = ProcessingProteome({"p": "ACDEFGHI"}) windows = ProteinWindows(index, [0], [0], [8]) assert index.gather(windows).to_strings().tolist() == ["ACDEFGHI"] assert windows.to_frame(5).iloc[0].n_flank == "XXXXX" assert windows.to_frame(5).iloc[0].c_flank == "XXXXX" assert windows.to_frame(0).iloc[0].n_flank == "" assert len(ProteinWindows(index, [], [], [])) == 0 with pytest.raises(ValueError, match="different encoded"): ProcessingProteome({"p": "YYYYYYYY"}).gather(windows) with pytest.raises(ValueError, match="Flank length"): windows.to_frame(-1) @pytest.mark.parametrize("length", [2, 8, 9, 10, 11]) @pytest.mark.parametrize("seed", [1, 42]) def test_numeric_proteome_matches_previous_draws_exactly(length, seed): sequences = {"p1": "ACDEFGHIKLMNPQRSTVWY" * 3, "p2": "ACDEXGHIKLMNPQRSTVWY" * 2, "short": "AC"} accessions = ["p1", "p2", "p1", "short", None] excluded = {sequences["p1"][:length]} np.random.seed(seed) expected = sample_peptide_frame_for_accessions(accessions, sequences, [length], 5, excluded, n=75, allow_smaller=True).drop_duplicates("peptide").reset_index(drop=True) index = ProcessingProteome(sequences) batch = index.sample(accessions, length, 75, excluded, np.random.RandomState(seed)) import pandas as pd pd.testing.assert_frame_equal(batch.to_frame(5), expected) for device in DEVICES: actual = index.gather(batch, device) assert actual.to_strings().tolist() == expected.peptide.tolist() np.testing.assert_array_equal(actual.indices.cpu().numpy(), index.raw_rows(batch.proteins, batch.starts, batch.lengths)) def test_candidate_pool_deduplicates_numeric_inputs_and_exports_original_rows(monkeypatch): import pandas as pd hits = pd.DataFrame(dict(peptide=["ACDEFGHI"] * 2, hit=[1, 1], protein_accession="p", n_flank="XXXXX", c_flank="KLMNP", hit_id=[1, 2])) index = ProcessingProteome({"p": "ACDEFGHIKLMNPQRSTVWY"}) windows = index.sample(["p"], 8, 10, set(hits.peptide), np.random.RandomState(1)) pool = NumericCandidatePool(hits, windows, "s", 5) def forbidden(*args): raise AssertionError("Scoring materialized strings") monkeypatch.setattr(NumericSequences, "to_strings", forbidden) inputs = pool.prediction_input("cpu") assert len(inputs) == len(windows) + 1 values = np.arange(len(inputs), dtype=float) + 10 frame = pool.with_scores(values) assert len(frame) == len(windows) + 2 assert frame.affinity_prediction.iloc[:2].tolist() == [10, 10] assert frame.sample_id.eq("s").all() @pytest.mark.parametrize("family,merged", [("pan", False), ("pan", True), ("specific", False), ("mixed", True)]) @pytest.mark.parametrize("device", DEVICES) def test_actual_affinity_ensemble_numeric_predictions_match_string_path(family, merged, device, monkeypatch): from mhcflurry import Class1AffinityPredictor from mhcflurry.class1_neural_network import Class1NeuralNetwork from mhcflurry.allele_encoding import AlleleEncoding from mhcflurry.common import configure_pytorch configure_pytorch(backend="gpu" if device == "cuda" else device) peptides = ["ACDEFGHI", "CDEFGHIKL", "DEFGHIKLMN", "EFGHIKLMNPQ"] allele = "HLA-A*02:01" sequences = {allele: "ACDEFGHIKLMNPQRSTVWYACDEFGHIKLMNPQRS"} encoding = AlleleEncoding([allele] * len(peptides), allele_to_sequence=sequences) models = [] specific_models = [] for seed in ((5, 6) if family == "pan" else (5, 6, 7)): model = Class1NeuralNetwork(max_epochs=1, validation_split=0, random_negative_rate=0, layer_sizes=[8], locally_connected_layers=[], dropout_probability=0, peptide_allele_merge_method="concatenate", peptide_encoding=dict(alignment_method="left_pad_centered_right_pad", max_length=15)) specific = family == "specific" or (family == "mixed" and seed == 7) model.fit(peptides, [50, 100, 150, 200], allele_encoding=None if specific else encoding, seed=seed, verbose=0) (specific_models if specific else models).append(model) predictor = Class1AffinityPredictor(class1_pan_allele_models=models, allele_to_sequence=sequences, allele_to_allele_specific_models={allele: specific_models} if specific_models else {}) if merged: assert predictor.optimize() numeric = NumericSequences.from_strings(peptides) def forbidden(*args, **kwargs): raise AssertionError("Numeric prediction converted peptides to strings") monkeypatch.setattr(NumericSequences, "to_strings", forbidden) for centrality in ("mean", "median", "robust_mean"): expected = predictor.predict(peptides, allele=allele, centrality_measure=centrality, model_kwargs={"batch_size": 2}) actual = predictor.predict_numeric(numeric, allele, centrality_measure=centrality, model_kwargs={"batch_size": 2}) np.testing.assert_allclose(actual, expected, rtol=1e-6, atol=1e-6) for bad in [NumericSequences.from_strings(["XXXAAAAA"]), NumericSequences.from_strings(["AAA"])]: with pytest.raises(ValueError): predictor.predict_numeric(bad, allele) with pytest.raises(ValueError): predictor.predict_numeric(numeric, "HLA-A*03:01") assert predictor.predict_numeric(NumericSequences.from_strings([]), allele).shape == (0,) def test_decode_alphabet_covers_exactly_the_valid_index_range(): """The decode table is sized by index range, not by the case-folded key count.""" letters = "ACDEFGHIKLMNPQRSTVWYX" assert NumericSequences.from_strings([letters]).to_strings().tolist() == [letters] corrupted = NumericSequences.from_strings(["ACDEFGHI"]) corrupted.indices[0, 0] = len(AMINO_ACID_INDEX) - 1 with pytest.raises(IndexError): corrupted.to_strings() mhcflurry-2.3.6/test/test_orchestrator_helpers.py000066400000000000000000000646161525677230600224200ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Unit tests for orchestrator-side helpers added in 2.3.0. Covers: * ``mhcflurry.common.filter_canonicalizable_alleles``. * ``mhcflurry.parallelism.hoist_torchinductor_compile_threads``. * Confirmation that the select commands' source actually invokes the shared filter (cheap regression for the same class of bug as the calibrate pseudogene crash). All tests are pure-Python; no GPU, no subprocess, no models on disk. """ import argparse import inspect import os import pathlib import subprocess import pytest def test_filter_select_call_sites(): """Both select commands that iterate predictor.supported_alleles must invoke the canonicalization filter. Without coverage at these sites, a pseudogene allele in the input predictor would crash the parallel selection mid-fold the same way calibrate used to.""" from mhcflurry import select_pan_allele_models_command as pan_mod from mhcflurry import select_allele_specific_models_command as as_mod pan_src = inspect.getsource(pan_mod.run) as_src = inspect.getsource(as_mod.run) assert "filter_canonicalizable_alleles" in pan_src, ( "select_pan_allele must filter supported_alleles" ) assert "filter_canonicalizable_alleles" in as_src, ( "select_allele_specific must filter supported_alleles" ) def test_hoist_torchinductor_no_op_when_compile_disabled(monkeypatch): """If MHCFLURRY_TORCH_COMPILE!=1 the hoist must not touch the env.""" from mhcflurry.parallelism import ( hoist_torchinductor_compile_threads as _hoist_torchinductor_compile_threads, ) monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE", raising=False) monkeypatch.delenv("TORCHINDUCTOR_COMPILE_THREADS", raising=False) monkeypatch.delenv("MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_AUTO", raising=False) args = argparse.Namespace(num_jobs=8) _hoist_torchinductor_compile_threads(args) assert "TORCHINDUCTOR_COMPILE_THREADS" not in os.environ def test_hoist_torchinductor_respects_user_pin(monkeypatch): from mhcflurry.parallelism import ( hoist_torchinductor_compile_threads as _hoist_torchinductor_compile_threads, ) monkeypatch.setenv("MHCFLURRY_TORCH_COMPILE", "1") monkeypatch.setenv("TORCHINDUCTOR_COMPILE_THREADS", "12") monkeypatch.delenv("MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_AUTO", raising=False) args = argparse.Namespace(num_jobs=8) _hoist_torchinductor_compile_threads(args) # User-pinned value must survive. assert os.environ["TORCHINDUCTOR_COMPILE_THREADS"] == "12" def test_hoist_torchinductor_sizes_against_num_jobs(monkeypatch): from mhcflurry.parallelism import ( hoist_torchinductor_compile_threads as _hoist_torchinductor_compile_threads, ) monkeypatch.setenv("MHCFLURRY_TORCH_COMPILE", "1") monkeypatch.delenv("TORCHINDUCTOR_COMPILE_THREADS", raising=False) monkeypatch.delenv("MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_AUTO", raising=False) # 8 jobs on a 64-core box → 64/8=8. monkeypatch.setattr(os, "cpu_count", lambda: 64) args = argparse.Namespace(num_jobs=8) _hoist_torchinductor_compile_threads(args) assert os.environ["TORCHINDUCTOR_COMPILE_THREADS"] == "8" # 1 job on 4-core box → 4/1=4, hits cap. monkeypatch.delenv("TORCHINDUCTOR_COMPILE_THREADS", raising=False) monkeypatch.delenv("MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_AUTO", raising=False) monkeypatch.setattr(os, "cpu_count", lambda: 4) args = argparse.Namespace(num_jobs=1) _hoist_torchinductor_compile_threads(args) assert os.environ["TORCHINDUCTOR_COMPILE_THREADS"] == "4" # 16 jobs on 32-core box → 32/16=2. monkeypatch.delenv("TORCHINDUCTOR_COMPILE_THREADS", raising=False) monkeypatch.delenv("MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_AUTO", raising=False) monkeypatch.setattr(os, "cpu_count", lambda: 32) args = argparse.Namespace(num_jobs=16) _hoist_torchinductor_compile_threads(args) assert os.environ["TORCHINDUCTOR_COMPILE_THREADS"] == "2" # Always at least 1 thread even with absurd over-subscription. monkeypatch.delenv("TORCHINDUCTOR_COMPILE_THREADS", raising=False) monkeypatch.delenv("MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_AUTO", raising=False) monkeypatch.setattr(os, "cpu_count", lambda: 4) args = argparse.Namespace(num_jobs=64) _hoist_torchinductor_compile_threads(args) assert os.environ["TORCHINDUCTOR_COMPILE_THREADS"] == "1" def test_hoist_torchinductor_recomputes_auto_owned_value(monkeypatch): from mhcflurry.parallelism import ( hoist_torchinductor_compile_threads as _hoist_torchinductor_compile_threads, ) monkeypatch.setenv("MHCFLURRY_TORCH_COMPILE", "1") monkeypatch.setenv("MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_AUTO", "1") monkeypatch.setenv("TORCHINDUCTOR_COMPILE_THREADS", "1") monkeypatch.setattr(os, "cpu_count", lambda: 16) args = argparse.Namespace(num_jobs=4) _hoist_torchinductor_compile_threads(args) assert os.environ["TORCHINDUCTOR_COMPILE_THREADS"] == "4" def test_hoist_torchinductor_accepts_auto_env(monkeypatch): from mhcflurry.parallelism import ( hoist_torchinductor_compile_threads as _hoist_torchinductor_compile_threads, ) monkeypatch.setenv("MHCFLURRY_TORCH_COMPILE", "1") monkeypatch.setenv("TORCHINDUCTOR_COMPILE_THREADS", "auto") monkeypatch.delenv("MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_AUTO", raising=False) monkeypatch.setattr(os, "cpu_count", lambda: 64) args = argparse.Namespace(num_jobs=4) _hoist_torchinductor_compile_threads(args) assert os.environ["TORCHINDUCTOR_COMPILE_THREADS"] == "16" assert os.environ["MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_AUTO"] == "1" def test_resolve_torchinductor_env_accepts_auto_when_compile_disabled(monkeypatch): from mhcflurry.parallelism import resolve_torchinductor_compile_threads_env monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE", raising=False) monkeypatch.setenv("TORCHINDUCTOR_COMPILE_THREADS", "auto") monkeypatch.delenv("MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_AUTO", raising=False) monkeypatch.setattr(os, "cpu_count", lambda: 64) threads = resolve_torchinductor_compile_threads_env(num_jobs=8) assert threads == 8 assert os.environ["TORCHINDUCTOR_COMPILE_THREADS"] == "8" assert os.environ["MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_AUTO"] == "1" def test_resolve_torchinductor_env_rejects_invalid_user_pin(monkeypatch): from mhcflurry.parallelism import resolve_torchinductor_compile_threads_env monkeypatch.setenv("TORCHINDUCTOR_COMPILE_THREADS", "autoish") monkeypatch.delenv("MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_AUTO", raising=False) with pytest.raises(ValueError, match="TORCHINDUCTOR_COMPILE_THREADS"): resolve_torchinductor_compile_threads_env(num_jobs=8) def test_hoist_torchinductor_warmup_uses_larger_single_worker_budget(monkeypatch): from mhcflurry.parallelism import ( hoist_torchinductor_compile_threads as _hoist_torchinductor_compile_threads, ) monkeypatch.setenv("MHCFLURRY_TORCH_COMPILE", "1") monkeypatch.setenv("TORCHINDUCTOR_COMPILE_THREADS", "auto") monkeypatch.setattr(os, "cpu_count", lambda: 64) args = argparse.Namespace(num_jobs=1) _hoist_torchinductor_compile_threads(args, phase="warmup") assert os.environ["TORCHINDUCTOR_COMPILE_THREADS"] == "64" @pytest.mark.parametrize("compile_value", ["0", "1"]) def test_resource_probe_preserves_numeric_return_contract( monkeypatch, compile_value): from mhcflurry.parallelism import torch_compile reports = [] applied_items = [] pool_kwargs = {} class FakePool: def apply(self, function, args): del function applied_items.append(args[1]) report = {"worker_peak_rss_gb": len(reports) + 1.0} reports.append(report) return report def close(self): pass def join(self): pass def terminate(self): raise AssertionError("successful warmup should not terminate") refined = [] monkeypatch.setenv("MHCFLURRY_TORCH_COMPILE", compile_value) monkeypatch.setenv("TORCHINDUCTOR_COMPILE_THREADS", "1") monkeypatch.delenv( "MHCFLURRY_TORCHINDUCTOR_COMPILE_THREADS_AUTO", raising=False) monkeypatch.setattr( torch_compile, "resolve_local_parallelism_args", lambda args: None) def fake_worker_pool(**kwargs): pool_kwargs.update(kwargs) return FakePool() monkeypatch.setattr( torch_compile, "worker_pool_with_gpu_assignments", fake_worker_pool) monkeypatch.setattr( torch_compile, "refine_local_parallelism_from_warmup", lambda args, measurements: refined.extend(measurements), ) monkeypatch.setattr( torch_compile, "hoist_torchinductor_compile_threads", lambda args, phase: None) args = argparse.Namespace( _device_memory_available_bytes_at_launch=40 * (1 << 30), backend="gpu", cluster_parallelism=False, cpu_threads_per_worker=1, cpu_threads_per_worker_was_auto=False, gpus=1, max_workers_per_gpu=1, num_jobs=2, worker_log_dir=None, ) work_items = [ {"hyperparameters": {"layer_sizes": [16]}}, {"hyperparameters": {"layer_sizes": [32]}}, {"hyperparameters": {"layer_sizes": [16]}}, ] constant_data = {"large": object()} warmed = torch_compile.run_single_worker_resource_probe( args=args, work_items=work_items, work_function=lambda **kwargs: None, constant_data=constant_data, ) assert warmed == 2 assert isinstance(warmed, int) assert refined == reports assert pool_kwargs["worker_context_module"] == torch_compile.__name__ assert pool_kwargs["worker_context_data"] == { "constant_data": constant_data, } assert pool_kwargs["max_workers_per_gpu"] == 1 assert pool_kwargs["device_memory_budget_bytes"] == 36 * (1 << 30) assert all("constant_data" not in item for item in applied_items) assert all(item["resource_probe_only"] for item in applied_items) def test_resource_probe_key_includes_memory_shaping_hyperparameters(): from mhcflurry.parallelism import torch_compile base = {"layer_sizes": [16], "minibatch_size": 128} larger_batch = {"layer_sizes": [16], "minibatch_size": 1024} assert ( torch_compile._arch_compile_key(base) == torch_compile._arch_compile_key(larger_batch) ) assert ( torch_compile._resource_probe_key(base) != torch_compile._resource_probe_key(larger_batch) ) def test_cluster_worker_compile_threads_auto(monkeypatch): from mhcflurry.parallelism import configure_cluster_worker_torch_compile_threads monkeypatch.setenv("MHCFLURRY_TORCH_COMPILE", "1") monkeypatch.setenv("TORCHINDUCTOR_COMPILE_THREADS", "auto") monkeypatch.setenv("MHCFLURRY_CLUSTER_WORKERS_PER_NODE", "4") monkeypatch.setattr(os, "cpu_count", lambda: 64) configure_cluster_worker_torch_compile_threads() # Production cap=16, 64/4=16. assert os.environ["TORCHINDUCTOR_COMPILE_THREADS"] == "16" def test_attach_constant_data_skips_fork_pool(): from mhcflurry.parallelism import attach_constant_data_to_work_items_if_needed class Ctx: def get_start_method(self): return "fork" pool = argparse.Namespace(_ctx=Ctx()) work_items = [{"a": 1}, {"b": 2}] constant_data = {"large": object()} logs = [] attached = attach_constant_data_to_work_items_if_needed( work_items, constant_data, pool, log=logs.append ) assert attached is False assert all("constant_data" not in item for item in work_items) assert any("inherit WORKER_CONTEXT" in line for line in logs) def test_attach_constant_data_attaches_for_non_fork_pool(): from mhcflurry.parallelism import attach_constant_data_to_work_items_if_needed class Ctx: def get_start_method(self): return "spawn" pool = argparse.Namespace(_ctx=Ctx()) work_items = [{"a": 1}, {"b": 2}] constant_data = {"large": object()} attached = attach_constant_data_to_work_items_if_needed( work_items, constant_data, pool, log=lambda _: None ) assert attached is True assert [item["constant_data"] for item in work_items] == [ constant_data, constant_data, ] def test_set_cpu_threads_accepts_auto_when_num_jobs_is_provided(): script = pathlib.Path(__file__).resolve().parents[1] / ( "scripts/training/set_cpu_threads.sh" ) command = ( "source %s; " "NUM_JOBS=16 GPUS=8 MAX_WORKERS_PER_GPU=auto " "DATALOADER_NUM_WORKERS=1 set_cpu_threads" ) % script result = subprocess.run( ["bash", "-lc", command], check=False, capture_output=True, text=True, ) assert result.returncode == 0, result.stderr assert "total_workers=16" in result.stderr def test_auto_dataloader_num_workers_hardware_tiers(): """Cross-check the heuristic against the production hardware tiers. These are the configs the recipe currently runs on or has been measured against. Regressions here will silently change runtime parallelism on the next run, so the table is fixed. """ from mhcflurry.parallelism import auto_dataloader_num_workers cases = [ # (label, vcpus, ram_gb, num_fit_workers, expected) ("Verda 8xA100-80GB", 176, 400, 16, 4), ("8xA100-40GB (1 worker/GPU)", 176, 400, 8, 4), ("8xL40S sweep box (96v)", 96, 200, 16, 3), ("Single A100-80G Lambda (30v)", 30, 200, 2, 4), ("Single A100-80G tight (16v)", 16, 64, 2, 4), ("Single T4 / RTX (8v / 16G)", 8, 16, 1, 4), ("Tight cluster node (32v / 16fit)", 32, 64, 16, 1), # Edge cases that exercise the floors / caps: ("Tiny cluster node (8v / 4fit)", 8, 16, 4, 1), ("Very tight (8v / 8fit)", 8, 16, 8, 0), # cpu_per_fit=1, cpu_cap=0 → 0 ("Serial run (no fit workers)", 64, 200, 0, 0), ("Single-fit / generous", 64, 200, 1, 4), ] for label, vcpus, ram, fit, want in cases: got = auto_dataloader_num_workers( num_fit_workers=fit, vcpus=vcpus, ram_gb=ram ) assert got == want, ( "%s: vcpus=%d ram_gb=%s fit=%d → got %d, want %d" % (label, vcpus, ram, fit, got, want) ) def test_auto_dataloader_num_workers_ram_constrained(): """RAM-tight boxes step the dataloader count down or to zero. Each DL child is ~500 MB RSS over the main fit-worker baseline (~2 GB). When ram_per_fit < 2 GB, no children should be spawned (in-process). """ from mhcflurry.parallelism import auto_dataloader_num_workers cases = [ # (label, vcpus, ram_gb, num_fit_workers, expected) ("Generous CPU + tight RAM (32G/16fit)", 176, 32, 16, 0), # ram_per_fit=2 → 0 dl ("Verda CPU + adequate RAM (64G/16fit)", 176, 64, 16, 4), # ram_per_fit=4 → cap=4 ("Verda CPU + very tight RAM (16G/16fit)", 176, 16, 16, 0), # baseline alone exhausts ("Generous RAM + few fit (200G/2fit)", 30, 200, 2, 4), # ram_per_fit=100 → no constraint ] for label, vcpus, ram, fit, want in cases: got = auto_dataloader_num_workers( num_fit_workers=fit, vcpus=vcpus, ram_gb=ram ) assert got == want, ( "%s: vcpus=%d ram_gb=%s fit=%d → got %d, want %d" % (label, vcpus, ram, fit, got, want) ) def test_auto_dataloader_num_workers_no_ram_input_means_cpu_only_decision(): """When ram_gb is None, only CPU/fit-worker math drives the choice.""" from mhcflurry.parallelism import auto_dataloader_num_workers # 176v / 16fit → cpu_per_fit=11, cpu_cap=5, hard_cap=4 → 4 regardless of RAM. assert auto_dataloader_num_workers(num_fit_workers=16, vcpus=176) == 4 # 8v / 8fit → cpu_per_fit=1, cpu_cap=0 → 0 regardless of RAM. assert auto_dataloader_num_workers(num_fit_workers=8, vcpus=8) == 0 def test_auto_dataloader_num_workers_hard_cap_env_override(monkeypatch): """``MHCFLURRY_AUTO_DATALOADER_HARD_CAP`` shifts the ceiling.""" from mhcflurry.parallelism import auto_dataloader_num_workers # Default cap = 4; with 176v/16fit we'd get 4. monkeypatch.setenv("MHCFLURRY_AUTO_DATALOADER_HARD_CAP", "2") assert auto_dataloader_num_workers( num_fit_workers=16, vcpus=176, ram_gb=400) == 2 monkeypatch.setenv("MHCFLURRY_AUTO_DATALOADER_HARD_CAP", "0") assert auto_dataloader_num_workers( num_fit_workers=16, vcpus=176, ram_gb=400) == 0 # Increasing cap above default — picks min(cpu_cap, hard_cap). monkeypatch.setenv("MHCFLURRY_AUTO_DATALOADER_HARD_CAP", "8") # 176/16 = 11 cpu_per_fit, cpu_cap=5, hard_cap=8 → min(5,8) = 5. assert auto_dataloader_num_workers( num_fit_workers=16, vcpus=176, ram_gb=400) == 5 def test_auto_random_negative_pool_epochs_hardware_tiers(): """Cross-check the RN-pool-epoch heuristic across production hardware tiers. The default shares the host reserve with the rest of the planner and uses 1 GB per pool epoch/worker. The throughput cap of 10 prevents marginal-return startup work from running away. """ from mhcflurry.parallelism import auto_random_negative_pool_epochs cases = [ # (label, ram_gb, num_workers, expected) # Shared reserve leaves 90% on large hosts; the throughput cap binds. ("Verda 8xA100-80GB (32 workers / 400G)", 400, 32, 10), ("8xA100-40GB (16 workers / 400G)", 400, 16, 10), ("8xL40S (16 workers / 200G)", 200, 16, 10), ("Single A100-80G Lambda (2/200G)", 200, 2, 10), ("Tight cluster (16/64G)", 64, 16, 3), ("RAM-starved (16/32G)", 32, 16, 1), ("Single T4 (1/16G)", 16, 1, 10), ] for label, ram, workers, want in cases: got = auto_random_negative_pool_epochs( num_random_negatives=1_500_000, peptide_max_length=15, num_workers=workers, ram_gb=ram, ) assert got == want, ( "%s: ram_gb=%s workers=%d → got %d, want %d" % (label, ram, workers, got, want) ) def test_auto_random_negative_pool_epochs_serial_or_no_ram_returns_one(): """Serial run or unknown-RAM box → conservative pool_epochs=1.""" from mhcflurry.parallelism import auto_random_negative_pool_epochs # No fit-workers: serial run, no need to amortize. assert auto_random_negative_pool_epochs( num_random_negatives=1_500_000, peptide_max_length=15, num_workers=0, ram_gb=400, ) == 1 # Unknown RAM (e.g. macOS dev machine with no /proc/meminfo): keep # legacy regen-every-epoch behavior since we don't know the budget. assert auto_random_negative_pool_epochs( num_random_negatives=1_500_000, peptide_max_length=15, num_workers=8, ram_gb=None, ) == 1 def test_auto_random_negative_pool_epochs_env_overrides(monkeypatch): """Env knobs let operators tighten or loosen the heuristic.""" from mhcflurry.parallelism import auto_random_negative_pool_epochs # The shared reserve reaches the throughput cap on this large box. assert auto_random_negative_pool_epochs( num_random_negatives=1_500_000, peptide_max_length=15, num_workers=32, ram_gb=400) == 10 # Halve the safety fraction → halves the budget. monkeypatch.setenv("MHCFLURRY_AUTO_RN_POOL_SAFETY_FRACTION", "0.25") assert auto_random_negative_pool_epochs( num_random_negatives=1_500_000, peptide_max_length=15, num_workers=32, ram_gb=400) == 3 monkeypatch.delenv("MHCFLURRY_AUTO_RN_POOL_SAFETY_FRACTION") # Lower the per-pool cost estimate still stops at the throughput cap. monkeypatch.setenv("MHCFLURRY_AUTO_RN_POOL_PER_EPOCH_PER_WORKER_GB", "0.25") # Shared budget / 0.25 GB exceeds the cap. assert auto_random_negative_pool_epochs( num_random_negatives=1_500_000, peptide_max_length=15, num_workers=32, ram_gb=400) == 10 monkeypatch.delenv("MHCFLURRY_AUTO_RN_POOL_PER_EPOCH_PER_WORKER_GB") # Lower the hard cap. monkeypatch.setenv("MHCFLURRY_AUTO_RN_POOL_HARD_CAP", "3") # The explicit cap wins. assert auto_random_negative_pool_epochs( num_random_negatives=1_500_000, peptide_max_length=15, num_workers=32, ram_gb=400) == 3 def test_auto_dataloader_num_workers_handles_none_and_zero_fit_workers(): """Serial / no-fit-worker case should return 0 (in-process).""" from mhcflurry.parallelism import auto_dataloader_num_workers assert auto_dataloader_num_workers(num_fit_workers=None) == 0 assert auto_dataloader_num_workers(num_fit_workers=0) == 0 assert auto_dataloader_num_workers(num_fit_workers=-1) == 0 def test_resolve_dataloader_num_workers_passthrough_int(): """Pinned int is a passthrough; only "auto" or None invokes the heuristic.""" from mhcflurry.parallelism import resolve_dataloader_num_workers assert resolve_dataloader_num_workers(0, num_fit_workers=16) == 0 assert resolve_dataloader_num_workers(2, num_fit_workers=16) == 2 assert resolve_dataloader_num_workers("3", num_fit_workers=16) == 3 def test_resolve_dataloader_num_workers_auto_calls_heuristic(): from mhcflurry.parallelism import resolve_dataloader_num_workers # Verda-like config; "auto" → 4. got = resolve_dataloader_num_workers( "auto", num_fit_workers=16, vcpus=176, ram_gb=400 ) assert got == 4 # None is the same as "auto". got = resolve_dataloader_num_workers( None, num_fit_workers=16, vcpus=176, ram_gb=400 ) assert got == 4 def test_resolve_dataloader_num_workers_rejects_negative(): from mhcflurry.parallelism import resolve_dataloader_num_workers with pytest.raises(ValueError, match=">= 0"): resolve_dataloader_num_workers(-1, num_fit_workers=16) with pytest.raises(ValueError, match="non-negative"): resolve_dataloader_num_workers("not-a-number", num_fit_workers=16) def test_auto_num_jobs_basic(): from mhcflurry.parallelism import auto_num_jobs assert auto_num_jobs(num_gpus=8, max_workers_per_gpu=2) == 16 assert auto_num_jobs(num_gpus=1, max_workers_per_gpu=2) == 2 assert auto_num_jobs(num_gpus=0, max_workers_per_gpu=2) == 0 assert auto_num_jobs(num_gpus=None, max_workers_per_gpu=2) == 0 def test_auto_num_jobs_rejects_unresolved_auto(): """Caller must resolve max_workers_per_gpu first.""" from mhcflurry.parallelism import auto_num_jobs with pytest.raises(ValueError, match="must be resolved"): auto_num_jobs(num_gpus=8, max_workers_per_gpu="auto") def test_apply_dataloader_num_workers_to_work_items_overrides_existing(): """Applies the resolved value uniformly; counts overrides for the log.""" from mhcflurry.parallelism import apply_dataloader_num_workers_to_work_items work_items = [ {"hyperparameters": {"dataloader_num_workers": 1, "minibatch_size": 4096}}, {"hyperparameters": {"dataloader_num_workers": 0}}, {"hyperparameters": {}}, # missing key → set fresh {"hyperparameters": {"dataloader_num_workers": 4}}, # already correct ] log_lines = [] apply_dataloader_num_workers_to_work_items( work_items, num_workers=4, log=log_lines.append ) for item in work_items: assert item["hyperparameters"]["dataloader_num_workers"] == 4 # 3 items had a non-4 / missing value before; the 4th was already 4. msg = log_lines[0] assert "4/4 items" in msg assert "dataloader_num_workers=4" in msg assert "overridden=3" in msg def test_apply_dataloader_num_workers_skips_items_without_hyperparameters(): """Defensive: items lacking the 'hyperparameters' key are left alone.""" from mhcflurry.parallelism import apply_dataloader_num_workers_to_work_items work_items = [{"work_item_name": "no-hp"}, {"hyperparameters": {}}] apply_dataloader_num_workers_to_work_items( work_items, num_workers=2, log=lambda *a: None ) assert "hyperparameters" not in work_items[0] assert work_items[1]["hyperparameters"]["dataloader_num_workers"] == 2 def test_apply_resolved_training_hyperparameters_to_work_items(): from mhcflurry.parallelism import ( apply_resolved_training_hyperparameters_to_work_items, ) work_items = [ {"hyperparameters": {"dataloader_num_workers": 1}}, {"hyperparameters": {"random_negative_pool_epochs": 2}}, ] args = argparse.Namespace( dataloader_num_workers=4, random_negative_pool_epochs=6, ) apply_resolved_training_hyperparameters_to_work_items( work_items, args, log=lambda _: None, ) for item in work_items: assert item["hyperparameters"]["dataloader_num_workers"] == 4 assert item["hyperparameters"]["random_negative_pool_epochs"] == 6 def test_affinity_trainers_use_shared_resolved_hyperparameter_helper(): import inspect from mhcflurry import train_pan_allele_models_command as pan_mod from mhcflurry import train_allele_specific_models_command as as_mod assert "apply_resolved_training_hyperparameters_to_work_items" in ( inspect.getsource(pan_mod.train_models) ) assert "apply_resolved_training_hyperparameters_to_work_items" in ( inspect.getsource(as_mod.run) ) def test_data_size_growth_does_not_change_dataloader_count(): """Dataset growth does not change the pretrain DataLoader worker count. The auto resolver is intentionally hardware-only — total dataset rows do not enter the per-fit-worker prefetch count. Per-batch CPU work is bounded by minibatch_size / pretrain chunk size. This regression test pins that independence: for the same Verda-like box, the resolver should pick the same value whether train_rows is 700K (today) or 7M (10x growth). """ from mhcflurry.parallelism import auto_dataloader_num_workers big_box = dict(num_fit_workers=16, vcpus=176, ram_gb=400) chosen = auto_dataloader_num_workers(**big_box) assert chosen == 4 # Heuristic doesn't accept train_rows — explicit by design, not omission. mhcflurry-2.3.6/test/test_package_init.py000066400000000000000000000030761525677230600205660ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Tests for package-import initialization.""" import os import pathlib import subprocess import sys PACKAGE_INIT = pathlib.Path(__file__).parents[1] / "mhcflurry" / "__init__.py" def _mkl_threading_layer_after_startup(platform_name, initial=None): env = dict(os.environ) if initial is None: env.pop("MKL_THREADING_LAYER", None) else: env["MKL_THREADING_LAYER"] = initial code = """ import os import runpy import sys sys.platform = %r try: runpy.run_path(%r) except ImportError: pass print(os.environ.get("MKL_THREADING_LAYER", "")) """ % (platform_name, str(PACKAGE_INIT)) return subprocess.check_output( [sys.executable, "-c", code], env=env, text=True).strip() def test_default_mkl_threading_layer_is_linux_only(): assert _mkl_threading_layer_after_startup("win32") == "" assert _mkl_threading_layer_after_startup("darwin") == "" assert _mkl_threading_layer_after_startup("linux") == "GNU" assert _mkl_threading_layer_after_startup("linux", "TBB") == "TBB" mhcflurry-2.3.6/test/test_packaging.py000066400000000000000000000066761525677230600201050ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Packaging metadata tests.""" import json import re import runpy from pathlib import Path import setuptools from packaging.requirements import Requirement from packaging.version import Version from mhcflurry.version import __version__ def test_install_guidance_targets_current_stable_series(): repo_dir = Path(__file__).resolve().parents[1] prerelease = re.compile(r"\b\d+\.\d+\.\d+(?:a|b|rc)\d+\b") version = Version(__version__) series = '%d.%d' % (version.major, version.minor) def check_installation(text): requirements = re.findall(r'%?pip install --upgrade "(mhcflurry[^\"]+)"', text) assert requirements for requirement in requirements: specifier = Requirement(requirement).specifier assert specifier.contains(version, prereleases=False) assert specifier.contains('%s.%d' % (series, version.micro + 1), prereleases=False) assert not specifier.contains('%d.%d.0' % (version.major, version.minor + 1)) if version.minor: assert not specifier.contains('%d.%d.0' % (version.major, version.minor - 1)) # Check the introduction too: a correct command can still sit beneath # prose advertising a different patch, as happened in README/Colab. for line in text.splitlines(): if 'install' in line.lower(): advertised = re.search(r'\bMHCflurry (\d+(?:\.\d+)*)', line) if advertised: assert advertised.group(1) == series assert '--pre ' not in text assert not prerelease.search(text) for relative_path in ("README.md", "docs/intro.md"): text = (repo_dir / relative_path).read_text() check_installation(text) notebook = json.loads( (repo_dir / "notebooks/mhcflurry-colab.ipynb").read_text()) setup_cell = next( cell for cell in notebook["cells"] if cell["cell_type"] == "code") source = "".join(setup_cell["source"]) check_installation('\n'.join(''.join(cell['source']) for cell in notebook['cells'])) assert "mhcflurry-downloads --quiet fetch models_class1_presentation" in source def test_setup_packages_cli_subpackage(monkeypatch): captured = {} repo_dir = Path(__file__).resolve().parents[1] def fake_setup(**kwargs): captured.update(kwargs) monkeypatch.chdir(repo_dir) monkeypatch.setattr(setuptools, "setup", fake_setup) runpy.run_path(str(repo_dir / "setup.py"), run_name="__main__") packages = captured["packages"] assert "mhcflurry" in packages assert "mhcflurry.cli" in packages # Guard against ``find_packages()`` picking up the repo's ``test`` dir # (it has an ``__init__.py``) and shipping it as a top-level package. assert not any( p == "test" or p.startswith("test.") for p in packages ), "setup.py must not ship the test package: %r" % packages assert "matplotlib" in captured["install_requires"] mhcflurry-2.3.6/test/test_paired_sample_metrics.py000066400000000000000000000037071525677230600225040ustar00rootroot00000000000000import importlib.util from pathlib import Path import numpy import pandas import pytest def module(): path = Path(__file__).resolve().parents[1] / "scripts/training/paired_sample_metrics.py" spec = importlib.util.spec_from_file_location("paired_sample_metrics", path) result = importlib.util.module_from_spec(spec) spec.loader.exec_module(result) return result def example(): return pandas.DataFrame({ "sample": ["a", "b", "c"] * 2, "condition": ["old"] * 3 + ["new"] * 3, "metric": [0.1, 0.3, 0.4, 0.3, 0.5, 0.6], "n": [10] * 6}) def summarize(frame): return module().paired_summary( frame, units=["sample"], condition="condition", metrics=["metric"], baseline="old", replicates=100, seed=3) def test_paired_samples_preserve_constant_difference_and_row_order_independence(): summary, differences, draws = summarize(example().sample(frac=1, random_state=4)) numpy.testing.assert_allclose(summary[["delta", "ci_low", "ci_high"]], 0.2) assert summary.samples_improved.item() == 3 assert len(differences) == 3 numpy.testing.assert_allclose(draws["new:metric"], 0.2) @pytest.mark.parametrize("problem", ["missing", "duplicate", "nonfinite", "counts"]) def test_paired_samples_reject_invalid_comparisons(problem): frame = example() if problem == "missing": frame = frame.iloc[1:] elif problem == "duplicate": frame = pandas.concat([frame, frame.iloc[:1]]) elif problem == "nonfinite": frame.loc[0, "metric"] = numpy.nan else: frame.loc[0, "n"] = 11 with pytest.raises(ValueError): summarize(frame) def test_select_conditions_requires_present_baseline_and_names(): frame = example() assert len(module().select_conditions(frame, "condition", ["old"], "old")) == 3 for names in (["new"], ["old", "missing"]): with pytest.raises(ValueError): module().select_conditions(frame, "condition", names, "old") mhcflurry-2.3.6/test/test_percent_rank_transform.py000066400000000000000000000262501525677230600227150ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import numpy import pytest import torch from mhcflurry.percent_rank_transform import PercentRankTransform from numpy.testing import assert_allclose, assert_equal from . import available_torch_accelerators def test_percent_rank_transform(): model = PercentRankTransform() model.fit(numpy.arange(1000), bins=100) assert_allclose( model.transform([-2, 0, 50, 100, 2000]), [0.0, 0.0, 5.0, 10.0, 100.0], err_msg=str(model.__dict__)) model2 = PercentRankTransform.from_series(model.to_series()) assert_allclose( model2.transform([-2, 0, 50, 100, 2000]), [0.0, 0.0, 5.0, 10.0, 100.0], err_msg=str(model.__dict__)) assert_equal(model.cdf, model2.cdf) assert_equal(model.bin_edges, model2.bin_edges) def test_fit_batch_torch_matches_per_row_numpy(): rng = numpy.random.default_rng(seed=42) n_alleles, n_values = 12, 8000 bin_edges = numpy.linspace(0, 50000, 1001) values = rng.uniform(1.0, 49999.0, size=(n_alleles, n_values)) transforms_torch = PercentRankTransform.fit_batch_torch( torch.as_tensor(values, dtype=torch.float64), torch.as_tensor(bin_edges, dtype=torch.float64), ) assert len(transforms_torch) == n_alleles for i in range(n_alleles): legacy = PercentRankTransform() legacy.fit(values[i], bins=bin_edges) torch_t = transforms_torch[i] assert_allclose(torch_t.cdf, legacy.cdf, rtol=0, atol=1e-9) assert_equal(torch_t.bin_edges, legacy.bin_edges) # Spot-check transform parity end-to-end probes = numpy.array([-1.0, 1.0, 100.0, 25000.0, 50001.0]) assert_allclose(torch_t.transform(probes), legacy.transform(probes)) def test_fit_batch_torch_handles_out_of_range_values(): bin_edges = numpy.array([10.0, 20.0, 30.0, 40.0]) # Row 0: all in-range. Row 1: half above the last edge, half in first bin. values = numpy.array([ [12.0, 22.0, 32.0, 38.0], [11.0, 12.0, 50.0, 60.0], ]) transforms = PercentRankTransform.fit_batch_torch( torch.as_tensor(values, dtype=torch.float64), torch.as_tensor(bin_edges, dtype=torch.float64), ) # Row 0: hist [1, 1, 2] (12->bin0, 22->bin1, 32->bin2, 38->bin2) # -> cdf cumulative = 25, 50, 100 assert_allclose(transforms[0].cdf[2:-1], [25.0, 50.0, 100.0], atol=1e-9) # Row 1: 2 in bin 0 (11, 12 -> [10,20)). 50 and 60 are strictly # above the last edge (40) and are *dropped* by numpy.histogram — # the fast path matches that semantics. hist=[2,0,0], cdf=[100,100,100]. assert_allclose(transforms[1].cdf[2:-1], [100.0, 100.0, 100.0], atol=1e-9) def test_fit_batch_torch_rejects_all_out_of_range_rows(): bin_edges = numpy.array([10.0, 20.0, 30.0, 40.0]) values = numpy.array([ [12.0, 22.0, 32.0, 38.0], [1.0, 2.0, 3.0, 4.0], ]) with pytest.raises(ValueError, match="no values inside the bin range"): PercentRankTransform.fit_batch_torch( torch.as_tensor(values, dtype=torch.float64), torch.as_tensor(bin_edges, dtype=torch.float64), ) @pytest.mark.parametrize( "_backend,device_type", available_torch_accelerators(), ids=lambda value: value, ) def test_fit_batch_torch_runs_on_accelerator_without_float64( _backend, device_type): values = torch.as_tensor( [[12.0, 22.0, 32.0, 38.0]], dtype=torch.float32, device=device_type, ) bin_edges = torch.as_tensor( [10.0, 20.0, 30.0, 40.0], dtype=torch.float32, device=device_type, ) transforms = PercentRankTransform.fit_batch_torch(values, bin_edges) assert_allclose(transforms[0].cdf[2:-1], [25.0, 50.0, 100.0], atol=1e-5) def test_fit_batch_torch_includes_value_at_last_edge(): # numpy.histogram closes the LAST bin: a value exactly equal to # edges[-1] is counted in the last bin (not dropped). The torch # port uses ``torch.bucketize(..., right=True)``, which returns # n_edges for values == edges[-1], so we recover the closed-bin # semantics with an explicit equality mask. This test pins that # behavior. bin_edges = numpy.array([0.0, 1.0, 2.0, 3.0]) values = numpy.array([[0.5, 1.5, 2.5, 3.0]]) # last value == edges[-1] transforms = PercentRankTransform.fit_batch_torch( torch.as_tensor(values, dtype=torch.float64), torch.as_tensor(bin_edges, dtype=torch.float64), ) legacy = PercentRankTransform() legacy.fit(values[0], bins=bin_edges) assert_allclose(transforms[0].cdf, legacy.cdf, rtol=0, atol=1e-12) # hist = [1, 1, 2] (0.5->bin0, 1.5->bin1, 2.5->bin2, 3.0->closed bin2), # total=4, cumulative cdf [25, 50, 100]. assert_allclose( transforms[0].cdf[2:-1], [25.0, 50.0, 100.0], atol=1e-9) def test_fit_batch_torch_handles_values_exactly_at_intermediate_edges(): # numpy.histogram puts values *equal to an intermediate edge* into # the higher bin (right-open: edges[k] is the left edge of bin k). # torch.bucketize(right=True) returns indices[value=edges[k]] = k+1, # which after the (indices-1) adjustment puts the value into bin k # — matching numpy. bin_edges = numpy.array([0.0, 1.0, 2.0, 3.0]) values = numpy.array([[1.0, 2.0]]) # exactly at intermediate edges transforms = PercentRankTransform.fit_batch_torch( torch.as_tensor(values, dtype=torch.float64), torch.as_tensor(bin_edges, dtype=torch.float64), ) legacy = PercentRankTransform() legacy.fit(values[0], bins=bin_edges) assert_allclose(transforms[0].cdf, legacy.cdf, rtol=0, atol=1e-12) def test_fit_batch_torch_strict_above_last_edge_is_dropped(): # Values strictly greater than the last edge are dropped (matches # numpy.histogram). Confirms in_range_interior gating doesn't # accidentally count overflow values. bin_edges = numpy.array([0.0, 1.0, 2.0]) # Row: 1 in-range value, 1 strictly above last edge values = numpy.array([[0.5, 5.0]]) transforms = PercentRankTransform.fit_batch_torch( torch.as_tensor(values, dtype=torch.float64), torch.as_tensor(bin_edges, dtype=torch.float64), ) legacy = PercentRankTransform() legacy.fit(values[0], bins=bin_edges) assert_allclose(transforms[0].cdf, legacy.cdf, rtol=0, atol=1e-12) def test_fit_batch_torch_strict_below_first_edge_is_dropped(): bin_edges = numpy.array([0.0, 1.0, 2.0]) values = numpy.array([[-0.5, 0.5]]) transforms = PercentRankTransform.fit_batch_torch( torch.as_tensor(values, dtype=torch.float64), torch.as_tensor(bin_edges, dtype=torch.float64), ) legacy = PercentRankTransform() legacy.fit(values[0], bins=bin_edges) assert_allclose(transforms[0].cdf, legacy.cdf, rtol=0, atol=1e-12) def test_fit_batch_torch_includes_value_at_first_edge(): # value == edges[0] is included in bin 0 (half-open [edges[0], edges[1])). bin_edges = numpy.array([0.0, 1.0, 2.0]) values = numpy.array([[0.0, 0.5, 1.5]]) transforms = PercentRankTransform.fit_batch_torch( torch.as_tensor(values, dtype=torch.float64), torch.as_tensor(bin_edges, dtype=torch.float64), ) legacy = PercentRankTransform() legacy.fit(values[0], bins=bin_edges) assert_allclose(transforms[0].cdf, legacy.cdf, rtol=0, atol=1e-12) def test_fit_batch_torch_single_bin(): # n_bins == 1: ensure the cumsum/cdf bookkeeping handles the # smallest possible histogram. bin_edges = numpy.array([0.0, 10.0]) values = numpy.array([[1.0, 2.0, 9.0, 10.0]]) # 10.0 hits closed last bin transforms = PercentRankTransform.fit_batch_torch( torch.as_tensor(values, dtype=torch.float64), torch.as_tensor(bin_edges, dtype=torch.float64), ) legacy = PercentRankTransform() legacy.fit(values[0], bins=bin_edges) assert_allclose(transforms[0].cdf, legacy.cdf, rtol=0, atol=1e-12) assert transforms[0].cdf[2] == pytest.approx(100.0) def test_fit_batch_torch_all_values_in_one_bin(): bin_edges = numpy.array([0.0, 1.0, 2.0, 3.0]) values = numpy.array([[1.5, 1.5, 1.5, 1.6, 1.6]]) # all in middle bin transforms = PercentRankTransform.fit_batch_torch( torch.as_tensor(values, dtype=torch.float64), torch.as_tensor(bin_edges, dtype=torch.float64), ) legacy = PercentRankTransform() legacy.fit(values[0], bins=bin_edges) assert_allclose(transforms[0].cdf, legacy.cdf, rtol=0, atol=1e-12) # bin 0 empty, bin 1 has all, bin 2 empty -> cdf cumulative 0,100,100 assert_allclose(transforms[0].cdf[2:-1], [0.0, 100.0, 100.0], atol=1e-12) def test_fit_batch_torch_nan_inputs_dropped_like_numpy(): # numpy.histogram silently drops NaN inputs (they don't go into any # bin). torch.bucketize on float64 also returns ``n_edges`` for NaN, # so the in_range gating already drops them. This test pins it. bin_edges = numpy.array([0.0, 1.0, 2.0]) values = numpy.array([[0.5, float("nan"), 1.5]]) transforms = PercentRankTransform.fit_batch_torch( torch.as_tensor(values, dtype=torch.float64), torch.as_tensor(bin_edges, dtype=torch.float64), ) legacy = PercentRankTransform() legacy.fit(values[0], bins=bin_edges) assert_allclose(transforms[0].cdf, legacy.cdf, rtol=0, atol=1e-12) def test_fit_batch_torch_positive_inf_dropped(): # +inf falls strictly above the last edge → dropped (matches numpy). bin_edges = numpy.array([0.0, 1.0, 2.0]) values = numpy.array([[0.5, float("inf"), 1.5]]) transforms = PercentRankTransform.fit_batch_torch( torch.as_tensor(values, dtype=torch.float64), torch.as_tensor(bin_edges, dtype=torch.float64), ) legacy = PercentRankTransform() legacy.fit(values[0], bins=bin_edges) assert_allclose(transforms[0].cdf, legacy.cdf, rtol=0, atol=1e-12) def test_fit_batch_torch_transform_at_exact_bin_edges_matches_legacy(): # Beyond cdf parity, exercise transform() at exact edge values to # detect off-by-one in searchsorted vs the cdf layout. rng = numpy.random.default_rng(seed=1) bin_edges = numpy.linspace(0, 100, 11) # 10 bins values = rng.uniform(1.0, 99.0, size=(1, 1000)) transforms = PercentRankTransform.fit_batch_torch( torch.as_tensor(values, dtype=torch.float64), torch.as_tensor(bin_edges, dtype=torch.float64), ) legacy = PercentRankTransform() legacy.fit(values[0], bins=bin_edges) probe_values = numpy.concatenate([ bin_edges, # every exact edge bin_edges + 1e-12, # just above bin_edges - 1e-12, # just below numpy.array([numpy.nan, -1.0, 1000.0]), ]) assert_allclose( transforms[0].transform(probe_values), legacy.transform(probe_values), rtol=0, atol=1e-9, ) mhcflurry-2.3.6/test/test_percentile_documentation.py000066400000000000000000000061301525677230600232250ustar00rootroot00000000000000"""Keep the shared percentile guide's executable examples tied to the APIs.""" import doctest import importlib.util from pathlib import Path import re import shlex from types import SimpleNamespace import pytest from mhcflurry.cli.calibrate_percentile_ranks_command import parser GUIDE = Path(__file__).resolve().parents[1] / "docs" / "shared_percent_rank_transforms.md" def test_shared_percentile_guide_doctests(): source = GUIDE.read_text() examples = re.findall(r"```\{doctest\}\n(.*?)```", source, re.DOTALL) assert examples, "The shared guide must contain executable API examples" runner = doctest.DocTestRunner() for index, text in enumerate(examples): example = doctest.DocTestParser().get_doctest( text, {}, "shared-percentiles-%d" % index, str(GUIDE), 0) runner.run(example) results = runner.summarize() assert results.attempted >= 10 assert results.failed == 0 def test_shared_percentile_cli_templates_match_parser(): source = GUIDE.read_text() blocks = re.findall(r"```shell\n(.*?)```", source, re.DOTALL) kinds = set() for block in blocks: for command in block.strip().split("\n\n"): words = shlex.split(command.replace("\\\n", "")) assert words[:2] == ["mhcflurry", "calibrate-percentile-ranks"] args = parser.parse_args(words[2:]) kinds.add(args.predictor_kind) assert args.percentile_method == "compact" assert args.max_percentile_knots == 128 assert args.num_jobs == 0 if args.predictor_kind == "class1_processing": assert args.processing_reference_data assert kinds == {"class1_affinity", "class1_processing", "class1_presentation"} def load_api_coverage_extension(): path = GUIDE.parent / "api_coverage.py" spec = importlib.util.spec_from_file_location("api_coverage", path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module @pytest.mark.parametrize("complete", [True, False]) def test_documentation_build_requires_actual_api_objects(complete): extension = load_api_coverage_extension() names = extension.REQUIRED_API_OBJECTS if complete else () domain = SimpleNamespace(get_objects=lambda: [(name,) for name in names]) app = SimpleNamespace(env=SimpleNamespace(get_domain=lambda name: domain)) if complete: extension.check_public_api(app, None) else: with pytest.raises(RuntimeError, match="Public API documentation is missing"): extension.check_public_api(app, None) # Preserve an original builder failure, rather than masking it with this check. extension.check_public_api(app, RuntimeError("earlier failure")) def test_api_reference_parses_generated_rst_and_covers_subpackages(): source = (GUIDE.parent / "api.md").read_text() assert "```{eval-rst}\n.. include:: _build/mhcflurry.rst" in source for name in ("affinity", "cli", "parallelism"): wrapper = GUIDE.parent / ("mhcflurry.%s.rst" % name) assert ".. include:: _build/mhcflurry.%s.rst" % name in wrapper.read_text() mhcflurry-2.3.6/test/test_plot_loss_curves.py000066400000000000000000000177661525677230600215700ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import json import pandas import pytest from mhcflurry.cli import main as cli_main from mhcflurry.cli import plot_loss_curves def write_manifest(path, model_name, *, fold, architecture, work_item): config = { "hyperparameters": { "layer_sizes": [32], "dense_layer_l1_regularization": 0.0, }, "fit_info": [ { "loss": [0.2, 0.1], "val_loss": [0.3, 0.2], "training_info": { "phase": "finetune", "fold_num": fold, "architecture_num": architecture, "replicate_num": 0, "work_item_name": work_item, }, } ], } pandas.DataFrame( [{ "model_name": model_name, "allele": "pan-class1", "config_json": json.dumps(config), }] ).to_csv(path, index=False) def test_selection_identity_survives_model_rename(tmp_path): selected_path = tmp_path / "selected.csv" candidate_path = tmp_path / "candidate.csv" write_manifest( selected_path, "PAN-CLASS1-1-selected-copy", fold=2, architecture=17, work_item="same-work-item", ) write_manifest( candidate_path, "PAN-CLASS1-91-original-candidate", fold=2, architecture=17, work_item="same-work-item", ) selected = plot_loss_curves._load_manifest_curves(selected_path) candidates = plot_loss_curves._load_manifest_curves(candidate_path) assert selected[0]["model_name"] != candidates[0]["model_name"] assert ( plot_loss_curves._selection_key(selected[0]) == plot_loss_curves._selection_key(candidates[0]) == ("work_item_name", "same-work-item") ) def test_selection_identity_falls_back_to_training_coordinates(): left = { "model_name": "selected-copy", "work_item_name": None, "fold": 3, "arch_num": 4, "replicate": 1, } right = {**left, "model_name": "original-candidate"} assert ( plot_loss_curves._selection_key(left) == plot_loss_curves._selection_key(right) == ("training_coordinates", 3, 4, 1) ) def test_train_plot_loss_curves_cli_marks_renamed_selection( monkeypatch, tmp_path): selected_dir = tmp_path / "models.combined" candidates_dir = tmp_path / "models.unselected.combined" out_dir = tmp_path / "plots" selected_dir.mkdir() candidates_dir.mkdir() write_manifest( selected_dir / "manifest.csv", "PAN-CLASS1-1-selected-copy", fold=2, architecture=17, work_item="same-work-item", ) write_manifest( candidates_dir / "manifest.csv", "PAN-CLASS1-91-original-candidate", fold=2, architecture=17, work_item="same-work-item", ) monkeypatch.setattr(plot_loss_curves, "_matplotlib_available", lambda: False) status = cli_main.main([ "train", "plot-loss-curves", "--selected-dir", str(selected_dir), "--unselected-dir", str(candidates_dir), "--out", str(out_dir), ]) assert status == 0 summary = pandas.read_csv(out_dir / "summary.csv") assert summary.selected.tolist() == [True] def test_processing_architecture_identity_and_checkpoint_summary(monkeypatch, tmp_path): models = tmp_path / "models" models.mkdir() rows = [] for width, boundary in ((11, 0), (13, 0), (13, 5)): config = { "hyperparameters": {"convolutional_kernel_size": width, "convolutional_filters": 512, "n_flank_length": 5, "c_flank_length": 5, "cleavage_boundary_flank_length": boundary, "cleavage_boundary_peptide_length": boundary, "convolutional_kernel_l1_l2": [0.000001, 0.000002]}, "fit_info": [{"loss": [0.5, 0.4, 0.3], "val_loss": [0.5, 0.4, 0.6], "best_epoch": 2, "best_val_loss": 0.4, "restored_best_weights": True, "training_info": {"fold_num": 0}}], } rows.append({"model_name": "k%d-boundary%d" % (width, boundary), "config_json": json.dumps(config)}) pandas.DataFrame(rows).to_csv(models / "manifest.csv", index=False) loaded = plot_loss_curves._load_manifest_curves(models / "manifest.csv") assert len({row["architecture_key"] for row in loaded}) == 3 assert all(row["model_type"] == "processing" for row in loaded) assert "boundary 5x5" in loaded[-1]["architecture"] assert plot_loss_curves._epoch_label(loaded) == "Epoch" assert all(row["l1"] == 0.000001 and row["l2"] == 0.000002 for row in loaded) monkeypatch.setattr(plot_loss_curves, "_matplotlib_available", lambda: False) out = tmp_path / "plots" assert plot_loss_curves.run_argv(["--selected-dir", str(models), "--out", str(out)]) == 0 summary = pandas.read_csv(out / "summary.csv") assert summary.final_val_loss.tolist() == [0.6] * 3 assert summary.best_val_loss.tolist() == [0.4] * 3 assert summary.checkpoint_policy.tolist() == ["best"] * 3 def test_historical_checkpoint_policy_not_inferred(tmp_path): path = tmp_path / "manifest.csv" write_manifest(path, "old", fold=0, architecture=0, work_item="old") model = plot_loss_curves._load_manifest_curves(path)[0] assert model["phase_curves"][0]["checkpoint_policy"] == "unknown" assert model["architecture"] == "(32,)" model["phase_curves"].append(model["phase_curves"][0]) assert plot_loss_curves._epoch_label([model]) == "Epoch (fit calls concatenated)" def test_processing_plot_labels_show_real_architectures(monkeypatch, tmp_path): pytest.importorskip("matplotlib") import matplotlib matplotlib.use("Agg") from matplotlib import pyplot saved = [] original_close = pyplot.close monkeypatch.setattr(pyplot, "close", lambda fig=None: saved.append(fig) if hasattr(fig, "axes") else None) base = {"model_name": "processing", "work_item_name": None, "fold": 0, "arch_num": 0, "replicate": 0, "layer_sizes": (), **plot_loss_curves._architecture_metadata({"convolutional_kernel_size": 13, "convolutional_filters": 512}), "phase_curves": [{"loss": [0.5, 0.4], "val_loss": [0.6, 0.5]}]} keys = {plot_loss_curves._selection_key(base)} plot_loss_curves._plot_all_curves(keys, [base], tmp_path / "all.png") assert all(axis.get_xlabel() == "Epoch" for axis in saved[-1].axes) assert "CNN k13/f512" in saved[-1].axes[1].get_legend().get_texts()[0].get_text() plot_loss_curves._plot_by_arch([base], tmp_path / "arch.png") assert "CNN k13/f512" in saved[-1].axes[0].get_legend().get_texts()[0].get_text() for fig in saved: original_close(fig) @pytest.mark.parametrize("value", [0.0001, [0.0001], [0.0, 1e-6, 1e-6], "0.0001", None, []]) def test_architecture_metadata_tolerates_malformed_regularization(value): metadata = plot_loss_curves._architecture_metadata( {"convolutional_kernel_size": 11, "convolutional_kernel_l1_l2": value}) assert metadata["l1"] is None and metadata["l2"] is None def test_architecture_metadata_reports_a_well_formed_regularization_pair(): metadata = plot_loss_curves._architecture_metadata( {"convolutional_kernel_size": 11, "convolutional_kernel_l1_l2": [0.0, 1e-6]}) assert metadata["l1"] == 0.0 and metadata["l2"] == 1e-6 mhcflurry-2.3.6/test/test_predict_command.py000066400000000000000000000276241525677230600213050ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Tests for the predict command.""" import pytest import tempfile import os import pandas from mhcflurry import parallelism, pytorch_sizing import torch import mhcflurry.cli.predict_command as predict_command from mhcflurry.testing_utils import cleanup, startup torch.manual_seed(1) @pytest.fixture(autouse=True) def setup_teardown(): """Setup and teardown for each test.""" startup() yield cleanup() TEST_CSV = ''' Allele,Peptide,Experiment HLA-A0201,SYNFEKKL,17 HLA-B4403,AAAAAAAAA,17 HLA-B4403,PPPPPPPP,18 '''.strip() def test_predict_dataframe_chunk_preserves_global_peptide_num(): class FakePredictor: def predict_affinity( self, peptides, alleles, sample_names, throw, include_affinity_percentile, model_kwargs): return pandas.DataFrame({ "peptide": list(peptides), "peptide_num": list(range(len(peptides))), "sample_name": list(sample_names), "affinity": [1.0] * len(peptides), }) df = pandas.DataFrame({ "allele": ["HLA-A*02:01", "HLA-A*02:01"], "peptide": ["SIINFEKL", "GILGFVFTL"], }, index=[4, 5]) predictions = predict_command._predict_dataframe_chunk( FakePredictor(), df, { "affinity_only": True, "allele_column": "allele", "peptide_column": "peptide", "throw": True, "include_affinity_percentile": False, "affinity_model_kwargs": {}, }, ) assert list(predictions.index) == [4, 5] assert list(predictions.peptide_num) == [4, 5] def test_predict_dataframe_chunk_passes_flanks_positionally(): class FakePredictor: def predict( self, peptides, n_flanks, c_flanks, alleles, sample_names, throw, include_affinity_percentile, affinity_model_kwargs, processing_batch_size): peptide_nums = pandas.Series(range(len(peptides))) return pandas.DataFrame({ "peptide": list(peptides), "peptide_num": peptide_nums, "sample_name": list(sample_names), "n_flank": peptide_nums.map(pandas.Series(n_flanks)), "c_flank": peptide_nums.map(pandas.Series(c_flanks)), "processing_score": [0.1] * len(peptides), }) df = pandas.DataFrame({ "allele": ["HLA-A*02:01", "HLA-A*02:01"], "peptide": ["SIINFEKL", "GILGFVFTL"], "n_flank": ["NNN", "AAA"], "c_flank": ["CCC", "TTT"], }, index=[4, 5]) predictions = predict_command._predict_dataframe_chunk( FakePredictor(), df, { "affinity_only": False, "allele_column": "allele", "peptide_column": "peptide", "n_flank_column": "n_flank", "c_flank_column": "c_flank", "use_flanking": True, "throw": True, "include_affinity_percentile": False, "affinity_model_kwargs": {}, "processing_batch_size": "auto", }, ) assert list(predictions.index) == [4, 5] assert list(predictions.peptide_num) == [4, 5] assert list(predictions.n_flank) == ["NNN", "AAA"] assert list(predictions.c_flank) == ["CCC", "TTT"] def test_detect_affinity_only_models_uses_file_presence(tmp_path): # Presentation bundle: has weights.csv pres = tmp_path / "pres" pres.mkdir() (pres / "weights.csv").write_text("") assert predict_command._detect_affinity_only_models(str(pres)) is False # Affinity-only bundle: no weights.csv aff = tmp_path / "aff" aff.mkdir() assert predict_command._detect_affinity_only_models(str(aff)) is True def test_default_auto_workers_are_resolved_before_prediction_kwargs( tmp_path, monkeypatch): """Default --max-workers-per-gpu=auto must not reach int(...) directly.""" captured = {} class FakePredictor: def predict_affinity( self, peptides, alleles, sample_names, throw, include_affinity_percentile, model_kwargs): del alleles, throw, include_affinity_percentile captured["model_kwargs"] = dict(model_kwargs) return pandas.DataFrame({ "peptide": list(peptides), "peptide_num": list(range(len(peptides))), "sample_name": list(sample_names), "best_allele": ["HLA-A*02:01"] * len(peptides), "affinity": [1.0] * len(peptides), }) models_dir = tmp_path / "affinity-models" models_dir.mkdir() out = tmp_path / "predictions.csv" monkeypatch.setattr( predict_command, "_load_predictor_for_command", lambda models_dir: (FakePredictor(), True), ) original_worker_pool = ( parallelism.worker_pool_with_gpu_assignments_from_args) def capture_worker_pool( args, workload_name, workload_hints, start_method=None): captured["workload_hints"] = dict(workload_hints) return original_worker_pool( args, workload_name=workload_name, workload_hints=workload_hints, start_method=start_method, ) monkeypatch.setattr( parallelism, "worker_pool_with_gpu_assignments_from_args", capture_worker_pool, ) monkeypatch.setattr( pytorch_sizing, "default_prediction_batch_is_auto", lambda: False) predict_command.run([ "--models", str(models_dir), "--alleles", "HLA-A0201", "--peptides", "SIINFEKL", "--backend", "cpu", "--out", str(out), ]) assert captured["model_kwargs"]["num_workers_per_gpu"] == 1 assert captured["workload_hints"]["elastic_batch"] is False def test_predict_columns_schema_parity_for_affinity_only(): """Empty-input schema must enumerate every prediction column the populated path would emit, so downstream readers see a stable schema.""" class FakePredictor: @property def supports_processing_prediction(self): return False @property def supports_presentation_prediction(self): return False cols = type(FakePredictor()).__bases__ # noqa: F841 (sanity probe) # Import the live class for the real method under test. from mhcflurry.class1_presentation_predictor import ( Class1PresentationPredictor, ) class NoPresentationPredictor(Class1PresentationPredictor): def __init__(self): pass @property def supports_processing_prediction(self): return False @property def supports_presentation_prediction(self): return False p = NoPresentationPredictor() affinity_cols = p.predict_columns( affinity_only=True, use_flanking=False, include_affinity_percentile=False) assert "affinity" in affinity_cols assert "best_allele" in affinity_cols assert "peptide_num" in affinity_cols assert "affinity_percentile" not in affinity_cols assert "processing_score" not in affinity_cols affinity_cols_with_pct = p.predict_columns( affinity_only=True, include_affinity_percentile=True) assert "affinity_percentile" in affinity_cols_with_pct def test_predict_columns_schema_parity_for_presentation(): from mhcflurry.class1_presentation_predictor import ( Class1PresentationPredictor, ) class FullPredictor(Class1PresentationPredictor): def __init__(self): pass @property def supports_processing_prediction(self): return True @property def supports_presentation_prediction(self): return True cols = FullPredictor().predict_columns( affinity_only=False, use_flanking=True, include_affinity_percentile=True) for col in ( "peptide", "peptide_num", "sample_name", "affinity", "best_allele", "affinity_percentile", "n_flank", "c_flank", "processing_score", "presentation_score", "presentation_percentile"): assert col in cols, "Missing column: %s" % col no_flank_cols = FullPredictor().predict_columns( affinity_only=False, use_flanking=False) assert "n_flank" not in no_flank_cols assert "c_flank" not in no_flank_cols assert "processing_score" in no_flank_cols def test_allele_string_to_alleles_accepts_semicolon_separated_csv_cells(): df = pandas.DataFrame({ "allele": [ "HLA-A*02:01;HLA-B*44:03", "H-2-Kb, H-2-Db", "HLA-C*07:02 HLA-A*01:01", "HLA-A*02:01;HLA-B*44:03", ], }) assert predict_command._allele_string_to_alleles(df, "allele") == { "HLA-A*02:01;HLA-B*44:03": ["HLA-A*02:01", "HLA-B*44:03"], "H-2-Kb, H-2-Db": ["H-2-Kb", "H-2-Db"], "HLA-C*07:02 HLA-A*01:01": ["HLA-C*07:02", "HLA-A*01:01"], } @pytest.mark.slow def test_csv(): args = ["--allele-column", "Allele", "--peptide-column", "Peptide"] deletes = [] try: with tempfile.NamedTemporaryFile(delete=False, suffix=".csv") as fd: fd.write(TEST_CSV.encode()) deletes.append(fd.name) fd_out = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") deletes.append(fd_out.name) full_args = [fd.name] + args + ["--out", fd_out.name] print("Running with args: %s" % full_args) predict_command.run(full_args) result = pandas.read_csv(fd_out.name) print(result) assert not result.isnull().any().any() finally: for delete in deletes: os.unlink(delete) assert result.shape == (3, 8) @pytest.mark.slow def test_no_csv(): args = [ "--alleles", "HLA-A0201", "H-2-Kb", "--peptides", "SIINFEKL", "DENDREKLLL", "PICKLEEE", "--prediction-column-prefix", "mhcflurry1_", "--affinity-only", ] deletes = [] try: fd_out = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") deletes.append(fd_out.name) full_args = args + ["--out", fd_out.name] print("Running with args: %s" % full_args) predict_command.run(full_args) result = pandas.read_csv(fd_out.name) print(result) finally: for delete in deletes: os.unlink(delete) print(result) assert len(result) == 6 sub_result1 = result.loc[result.peptide == "SIINFEKL"].set_index("allele") print(sub_result1) assert ( sub_result1.loc["H-2-Kb"].mhcflurry1_affinity < sub_result1.loc["HLA-A0201"].mhcflurry1_affinity) @pytest.mark.parametrize("affinity_only", [False, True]) def test_stdout_contains_only_parseable_csv(capsys, affinity_only): import io args = ["--alleles", "HLA-A0201", "--peptides", "SIINFEKL", "NLVPMVATV"] if affinity_only: args.append("--affinity-only") predict_command.run(args) output = capsys.readouterr() frame = pandas.read_csv(io.StringIO(output.out)) assert frame.peptide.tolist() == ["SIINFEKL", "NLVPMVATV"] assert frame.mhcflurry_affinity.notna().all() assert "Predicting" not in output.out assert "Predicting affinities." in output.err mhcflurry-2.3.6/test/test_predict_scan_command.py000066400000000000000000000412501525677230600223000ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import tempfile import os import pandas from mhcflurry import parallelism, pytorch_sizing import pytest from numpy.testing import assert_array_less import mhcflurry.cli.predict_scan_command as predict_scan_command from . import data_path from mhcflurry.testing_utils import cleanup, startup pytest.fixture(autouse=True, scope="module") def setup_module(): startup() yield cleanup() def read_output_csv(filename): return pandas.read_csv( filename, converters={"n_flank": str, "c_flank": str}) def test_fasta(): args = [ data_path("example.fasta"), "--alleles", "HLA-A*02:01,HLA-A*03:01,HLA-B*57:01,HLA-B*45:01,HLA-C*02:03,HLA-C*07:02", ] deletes = [] try: fd_out = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") deletes.append(fd_out.name) full_args = args + ["--out", fd_out.name] print("Running with args: %s" % full_args) predict_scan_command.run(full_args) result = read_output_csv(fd_out.name) print(result) assert not result.isnull().any().any() finally: for delete in deletes: os.unlink(delete) assert ( result.best_allele.nunique() == 6), str(list(result.best_allele.unique())) assert result.sequence_name.nunique() == 3 assert_array_less(result.affinity_percentile, 2.0) def test_fasta_50nm(): args = [ data_path("example.fasta"), "--alleles", "HLA-A*02:01,HLA-A*03:01,HLA-B*57:01,HLA-B*45:01,HLA-C*02:02,HLA-C*07:02", "--threshold-affinity", "50", ] deletes = [] try: fd_out = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") deletes.append(fd_out.name) full_args = args + ["--out", fd_out.name] print("Running with args: %s" % full_args) predict_scan_command.run(full_args) result = read_output_csv(fd_out.name) print(result) assert not result.isnull().any().any() finally: for delete in deletes: os.unlink(delete) assert len(result) > 0 assert_array_less(result.affinity, 50.0001) def test_fasta_percentile(): args = [ data_path("example.fasta"), "--alleles", "HLA-A*02:01,HLA-A*03:01,HLA-B*57:01,HLA-B*45:01,HLA-C*02:02,HLA-C*07:02", "--threshold-affinity-percentile", "5.0", ] deletes = [] try: fd_out = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") deletes.append(fd_out.name) full_args = args + ["--out", fd_out.name] print("Running with args: %s" % full_args) predict_scan_command.run(full_args) result = read_output_csv(fd_out.name) print(result) assert not result.isnull().any().any() finally: for delete in deletes: os.unlink(delete) assert len(result) > 0 assert_array_less(result.affinity_percentile, 5.0001) def test_commandline_sequences(): args = [ "--sequences", "ASDFGHKL", "QWERTYIPCVNM", "--alleles", "HLA-A0201;HLA-A0301", "H-2-Kb", "--peptide-lengths", "8", "--results-all", ] deletes = [] try: fd_out = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") deletes.append(fd_out.name) full_args = args + ["--out", fd_out.name] print("Running with args: %s" % full_args) predict_scan_command.run(full_args) result = read_output_csv(fd_out.name) print(result) finally: for delete in deletes: os.unlink(delete) print(result) assert result.sequence_name.nunique() == 2 assert result.best_allele.nunique() == 3 assert result.sample_name.nunique() == 2 assert (result.peptide == "ASDFGHKL").sum() == 2 assert (result.peptide != "ASDFGHKL").sum() == 10 def test_no_affinity_percentile_does_not_crash_with_default_threshold(): """Regression: default-threshold path filters by affinity_percentile, but --no-affinity-percentile leaves that column out, so the filter used to KeyError. We now skip filters whose column is missing.""" args = [ "--sequences", "ASDFGHKL", "QWERTYIPCVNM", "--alleles", "HLA-A0201,HLA-A0301", "--peptide-lengths", "8", "--no-affinity-percentile", ] deletes = [] try: fd_out = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") deletes.append(fd_out.name) full_args = args + ["--out", fd_out.name] predict_scan_command.run(full_args) result = read_output_csv(fd_out.name) finally: for delete in deletes: os.unlink(delete) assert "affinity_percentile" not in result.columns assert len(result) > 0 def test_empty_input_csv_does_not_crash(): """Regression: empty input used to produce a schema-less DataFrame, then any threshold filter on a missing column raised AttributeError. We now seed the empty result with the expected schema.""" deletes = [] try: fd_in = tempfile.NamedTemporaryFile( delete=False, suffix=".csv", mode="w") fd_in.write("sequence\n") fd_in.close() deletes.append(fd_in.name) fd_out = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") deletes.append(fd_out.name) args = [ fd_in.name, "--alleles", "HLA-A0201", "--peptide-lengths", "8", "--out", fd_out.name, ] predict_scan_command.run(args) result = read_output_csv(fd_out.name) finally: for delete in deletes: os.unlink(delete) assert len(result) == 0 def test_empty_and_populated_schemas_match(): """Empty-input fast-path must emit the same column set as the populated path. If the predictor's output schema gains a column, we want CI to flag the empty path before users see drift.""" common = [ "--alleles", "HLA-A0201", "--peptide-lengths", "9", "--results-all", ] deletes = [] try: # Empty input. empty_in = tempfile.NamedTemporaryFile( delete=False, suffix=".csv", mode="w") empty_in.write("sequence\n") empty_in.close() empty_out = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") deletes.extend([empty_in.name, empty_out.name]) predict_scan_command.run( [empty_in.name, "--out", empty_out.name] + common) empty_df = read_output_csv(empty_out.name) # Populated input. full_out = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") deletes.append(full_out.name) predict_scan_command.run( ["--sequences", "MKVAVLAVALLVCLLI", "--out", full_out.name] + common) full_df = read_output_csv(full_out.name) finally: for d in deletes: os.unlink(d) assert len(empty_df) == 0 assert len(full_df) > 0 assert list(empty_df.columns) == list(full_df.columns), ( f"empty schema {list(empty_df.columns)} " f"!= populated schema {list(full_df.columns)}") def test_parallel_path_does_not_load_predictor_before_pool(monkeypatch): """Parallel pools must be created before PyTorch predictor state loads.""" captured = {} class FakePool: def __init__(self): self.closed = False self.joined = False def imap_unordered(self, fn, work_items, chunksize=1): del fn, chunksize return [ predict_scan_command.ChunkResult( chunk_num=item["chunk_num"], predictions=pandas.DataFrame({ "sequence_name": ["sequence_0"], "pos": [0], "peptide": ["ASDFGHKL"], "sample_name": ["genotype_00"], "presentation_score": [0.5], }), comparison_quantity="presentation_score", ) for item in work_items ] def close(self): self.closed = True def join(self): self.joined = True def fail_parent_predictor_load(models_dir): raise AssertionError( "parallel scan should not load predictor in parent") def fake_worker_pool( args, workload_name, workload_hints, start_method=None): del workload_name captured["workload_hints"] = dict(workload_hints) assert start_method == "spawn" args.num_jobs = 2 args.max_workers_per_gpu = 1 return FakePool() monkeypatch.setattr( predict_scan_command, "_load_predictor_for_command", fail_parent_predictor_load) monkeypatch.setattr( parallelism, "worker_pool_with_gpu_assignments_from_args", fake_worker_pool) monkeypatch.setattr( pytorch_sizing, "default_prediction_batch_is_auto", lambda: False, ) deletes = [] try: fd_out = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") deletes.append(fd_out.name) predict_scan_command.run([ "--sequences", "ASDFGHKL", "--alleles", "HLA-A0201", "--peptide-lengths", "8", "--results-all", "--num-jobs", "2", "--backend", "cpu", "--out", fd_out.name, ]) result = read_output_csv(fd_out.name) finally: for delete in deletes: os.unlink(delete) assert result.peptide.tolist() == ["ASDFGHKL"] assert captured["workload_hints"]["elastic_batch"] is False def test_parallel_affinity_only_output_globally_sorted(monkeypatch): """Parallel affinity-only output must be sorted strongest-first globally.""" class FakePool: def imap_unordered(self, fn, work_items, chunksize=1): del fn, work_items, chunksize return [ predict_scan_command.ChunkResult( chunk_num=1, predictions=pandas.DataFrame({ "sequence_name": ["sequence_1"], "pos": [0], "peptide": ["BEST"], "sample_name": ["genotype_00"], "best_allele": ["HLA-A*02:01"], "affinity": [10.0], }), comparison_quantity="affinity", ), predict_scan_command.ChunkResult( chunk_num=0, predictions=pandas.DataFrame({ "sequence_name": ["sequence_0"], "pos": [0], "peptide": ["WORST"], "sample_name": ["genotype_00"], "best_allele": ["HLA-A*02:01"], "affinity": [500.0], }), comparison_quantity="affinity", ), ] def close(self): pass def join(self): pass def fail_parent_predictor_load(models_dir): raise AssertionError( "parallel scan should not load predictor in parent") def fake_worker_pool( args, workload_name, workload_hints, start_method=None): del workload_name, workload_hints assert start_method == "spawn" args.num_jobs = 2 args.max_workers_per_gpu = 1 return FakePool() monkeypatch.setattr( predict_scan_command, "_load_predictor_for_command", fail_parent_predictor_load) monkeypatch.setattr( parallelism, "worker_pool_with_gpu_assignments_from_args", fake_worker_pool) deletes = [] try: fd_out = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") deletes.append(fd_out.name) predict_scan_command.run([ "--sequences", "AAAAAAAA", "CCCCCCCC", "--alleles", "HLA-A0201", "--peptide-lengths", "8", "--results-all", "--num-jobs", "2", "--backend", "cpu", "--out", fd_out.name, ]) result = read_output_csv(fd_out.name) finally: for delete in deletes: os.unlink(delete) assert result.peptide.tolist() == ["BEST", "WORST"] assert result.affinity.tolist() == [10.0, 500.0] @pytest.mark.slow @pytest.mark.integration def test_parallel_output_globally_sorted(): """Regression: parallel scan used to concat per-chunk sorted outputs without re-sorting globally, so output ranking diverged from serial. We now re-sort by presentation_score after concat to match serial.""" seqs = [ "ASDFGHKLPLPLPLPL", "QWERTYIPCVNMLLLM", "MKVAVLAVALLVCLLI", "GVRDDQYRSPVDPAPL", ] alleles = "HLA-A0201,HLA-A0301" common = [ "--sequences"] + seqs + [ "--alleles", alleles, "--peptide-lengths", "9", "--results-all", ] deletes = [] try: fd_serial = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") deletes.append(fd_serial.name) predict_scan_command.run(common + ["--out", fd_serial.name]) serial_df = read_output_csv(fd_serial.name) fd_parallel = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") deletes.append(fd_parallel.name) predict_scan_command.run(common + [ "--num-jobs", "2", "--backend", "cpu", "--out", fd_parallel.name]) parallel_df = read_output_csv(fd_parallel.name) finally: for delete in deletes: os.unlink(delete) assert len(serial_df) == len(parallel_df) # Both should be sorted descending by presentation_score globally. score_col = "presentation_score" if score_col in serial_df.columns: serial_scores = serial_df[score_col].values parallel_scores = parallel_df[score_col].values assert (serial_scores[:-1] >= serial_scores[1:]).all(), ( "serial output not globally sorted") assert (parallel_scores[:-1] >= parallel_scores[1:]).all(), ( "parallel output not globally sorted") @pytest.mark.slow @pytest.mark.integration def test_parallel_output_tie_break_is_deterministic(): """Parallel output sorts ties by ``peptide`` ascending, so two runs with the same input produce identical row order even when several peptides share the same presentation_score.""" seqs = ["ASDFGHKLPLPLPLPL", "QWERTYIPCVNMLLLM", "MKVAVLAVALLVCLLI", "GVRDDQYRSPVDPAPL"] common = [ "--sequences"] + seqs + [ "--alleles", "HLA-A0201,HLA-A0301", "--peptide-lengths", "9", "--results-all", "--num-jobs", "2", "--backend", "cpu", ] deletes = [] try: out_a = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") out_b = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") deletes.extend([out_a.name, out_b.name]) predict_scan_command.run(common + ["--out", out_a.name]) predict_scan_command.run(common + ["--out", out_b.name]) df_a = read_output_csv(out_a.name) df_b = read_output_csv(out_b.name) finally: for d in deletes: os.unlink(d) assert df_a["peptide"].tolist() == df_b["peptide"].tolist(), ( "parallel output row order differs between runs") if "presentation_score" in df_a.columns: score = df_a["presentation_score"].values peptide = df_a["peptide"].values # On ties, peptide must be ascending. for i in range(len(score) - 1): if score[i] == score[i + 1]: assert peptide[i] <= peptide[i + 1], ( f"tie not sorted by peptide at row {i}: " f"{peptide[i]!r} > {peptide[i + 1]!r}") def test_stdout_contains_only_parseable_csv(capsys): import io predict_scan_command.run([ "--sequences", "MGYINVFAFPFTIYSLLLCRMNSRNYIAQVDVVNFNLT", "--alleles", "HLA-A*02:01", "--threshold-affinity", "50000"]) output = capsys.readouterr() frame = pandas.read_csv(io.StringIO(output.out)) assert len(frame) > 0 assert frame.affinity.notna().all() assert "Predicting" not in output.out assert "Predicting affinities." in output.err mhcflurry-2.3.6/test/test_presentation_external_predictors.py000066400000000000000000000360611525677230600250230ustar00rootroot00000000000000"""External predictor comparisons join exact benchmark rows and orient scores.""" import importlib.util import json from pathlib import Path import numpy import pandas import pytest from mhcflurry.cli.compare_models import _metrics KEYS = ["protein_accession", "peptide", "sample_id", "n_flank", "c_flank", "hit", "hla"] PRECOMPUTED = ("netmhcpan4.el", "netmhcpan4.ba", "mixmhcpred") LOCAL = ("netmhcpan4.1.el", "netmhcpan4.1.ba", "netmhcpan4.2.el", "netmhcpan4.2.ba") @pytest.fixture def module(): path = (Path(__file__).resolve().parents[1] / "scripts/training/compare_presentation_external_predictors.py") spec = importlib.util.spec_from_file_location("presentation_external_predictors", path) loaded = importlib.util.module_from_spec(spec) spec.loader.exec_module(loaded) return loaded @pytest.mark.parametrize("cohort,candidate,reference", [ ("monoallelic", "a_affinity", "b_affinity"), ("multiallelic", "a_with_flanks", "b_with_flanks")]) def test_every_external_version_gets_paired_intervals(module, cohort, candidate, reference): conditions = dict.fromkeys([candidate, reference] + list(PRECOMPUTED + LOCAL)) pairs = module.comparison_pairs(cohort, conditions) assert {(candidate, name) for name in PRECOMPUTED + LOCAL} <= set(pairs) assert {(reference, name) for name in PRECOMPUTED + LOCAL} <= set(pairs) assert len(pairs) == len(set(pairs)) def test_common_coverage_uses_one_row_set_and_never_drops_a_sample(module): frame = pandas.DataFrame({"sample_id": ["a", "a", "b"], "first": [1., 2., 3.], "second": [numpy.nan, 2., 3.]}) conditions = {name: module.Condition(name, True, name) for name in ("first", "second")} result = module.common_coverage(frame, conditions) assert result.index.tolist() == [1, 2] frame.loc[2, "second"] = numpy.nan with pytest.raises(ValueError, match="entire evaluation sample"): module.common_coverage(frame, conditions) def benchmark_rows(sample, seed, n=300, n_hits=30): rng = numpy.random.default_rng(seed) hit = numpy.r_[numpy.ones(n_hits, dtype=int), numpy.zeros(n - n_hits, dtype=int)] peptides = ["PEPTIDE%04d" % index for index in range(n)] peptides[1] = peptides[0] # identical identities must keep their file order frame = pandas.DataFrame({ "protein_accession": "P1", "peptide": peptides, "sample_id": sample, "n_flank": "NA", "c_flank": "AC", "hit": hit, "hla": "HLA-B*07:02 HLA-A*02:01 HLA-A*02:01"}) for name, weight in (("netmhcpan4.el", 0.3), ("mixmhcpred", 0.2), ("netmhcpan4.1.el", 0.32), ("netmhcpan4.2.el", 0.35)): frame[name] = numpy.round(weight * hit + rng.uniform(0, 1, n), 6) for name in ("netmhcpan4.ba", "netmhcpan4.1.ba", "netmhcpan4.2.ba"): frame[name] = numpy.round(numpy.where( hit == 1, rng.uniform(5, 800, n), rng.uniform(50, 50000, n)), 3) return frame def write_multiallelic(tmp_path, drop_external_row=False): data = tmp_path / "data_evaluation" data.mkdir() extra = tmp_path / "local_scores" extra.mkdir() presentation = tmp_path / "comparison" / "presentation" presentation.mkdir(parents=True) saved = [] for index, sample in enumerate(["S1", "S/2"]): rows = benchmark_rows(sample, index) suffix = "%s.0.csv.bz2" % sample.replace("/", "") base = "benchmark.multiallelic.train_excluded." + suffix rows[KEYS].to_csv(data / base, index=False) if index == 0: rows.loc[[3, 50], "netmhcpan4.el"] = numpy.nan # a hit and a decoy left unscored for predictor in PRECOMPUTED: external = rows[KEYS + [predictor]].assign(**{predictor + "_best_allele": "HLA-A*02:01"}) if drop_external_row and predictor == "netmhcpan4.el" and index == 0: external = external.drop(index=10) external.to_csv(data / ("benchmark.multiallelic.%s.train_excluded.%s" % (predictor, suffix)), index=False) for predictor in LOCAL: # Locally generated scores: plain CSV in a directory of their own. rows[KEYS + [predictor]].to_csv( extra / ("benchmark.multiallelic.%s.train_excluded.%s" % ( predictor, suffix[:-len(".bz2")])), index=False) kept = rows.drop(index=5) # a length-filtered row # compare-models saves the canonical genotype, not the raw benchmark string. saved.append(kept.assign(source_file=base, peptide_len=kept.peptide.str.len(), hla="HLA-A*02:01 HLA-B*07:02")) saved = pandas.concat(saved[::-1], ignore_index=True) # not sorted by file name rng = numpy.random.default_rng(7) for side, weight in (("a", 0.6), ("b", 0.4)): score = numpy.clip(weight * saved.hit + rng.uniform(0, 0.6, len(saved)), 0, 1) saved[side + "_presentation_score"] = score saved[side + "_presentation_percentile"] = 100 * (1 - score) columns = list(PRECOMPUTED) + list(LOCAL) saved.drop(columns=columns).to_csv(presentation / "predictions_with_flanks.csv.bz2", index=False) without = saved.drop(columns=columns) without["a_presentation_score"] = numpy.clip(0.5 * saved.hit + rng.uniform(0, 0.6, len(saved)), 0, 1) without.to_csv(presentation / "predictions_without_flanks.csv.bz2", index=False) return data, extra, tmp_path / "comparison", saved def arguments(data, extra, comparison, out, *rest): return ["--comparison-dir", str(comparison), "--data-dir", str(data), "--external-dir", str(extra), "--out", str(out), "--replicates", "100", *rest] def test_joins_exact_rows_orients_scores_and_writes_figures(tmp_path, module): data, extra, comparison, saved = write_multiallelic(tmp_path) out = tmp_path / "out" assert module.main(arguments(data, extra, comparison, out, "--a-label", "Candidate")) == 0 joined = pandas.read_csv(out / "joined_scores.csv.gz") assert joined.prediction_row.tolist() == list(range(len(saved))) for predictor in PRECOMPUTED + LOCAL: numpy.testing.assert_allclose(joined[predictor], saved[predictor], equal_nan=True) per_sample = pandas.read_csv(out / "per_sample_metrics.csv") s1 = saved.loc[saved.sample_id == "S1"] def row(condition): return per_sample.loc[(per_sample.sample_id == "S1") & (per_sample.condition == condition)].iloc[0] for predictor in ("netmhcpan4.ba", "netmhcpan4.2.ba"): expected = _metrics(s1.hit.to_numpy(), -s1[predictor].to_numpy()) assert row(predictor).roc_auc == pytest.approx(expected["roc_auc"]) and expected["roc_auc"] > 0.5 # MHCflurry keeps every row even where an external tool lacks a score. candidate = _metrics(s1.hit.to_numpy(), s1.a_presentation_score.to_numpy()) assert row("a_with_flanks").n == len(s1) and row("netmhcpan4.el").n == len(s1) - 2 assert row("netmhcpan4.2.el").n == len(s1) assert row("a_with_flanks").pr_auc == pytest.approx(candidate["pr_auc"]) assert row("a_with_flanks").ppv_at_n == pytest.approx(candidate["ppv_at_n"]) percentile = _metrics(s1.hit.to_numpy(), -s1.a_presentation_percentile.to_numpy()) assert row("a_with_flanks_percentile").roc_auc == pytest.approx(percentile["roc_auc"]) paired = pandas.read_csv(out / "paired_differences.csv") assert {("a_with_flanks", "b_with_flanks"), ("a_with_flanks", "netmhcpan4.el"), ("a_with_flanks", "netmhcpan4.2.el"), ("a_with_flanks", "netmhcpan4.2.ba"), ("a_with_flanks", "netmhcpan4.ba")} <= set(zip(paired.candidate, paired.reference)) excluded = paired.groupby(["candidate", "reference"]).rows_excluded.first() assert excluded[("a_with_flanks", "b_with_flanks")] == 0 assert excluded[("a_with_flanks", "netmhcpan4.el")] == 2 assert excluded[("a_with_flanks", "netmhcpan4.2.el")] == 0 joint = s1.loc[s1["netmhcpan4.el"].notna()] expected = _metrics(joint.hit.to_numpy(), joint.a_presentation_score.to_numpy())["pr_auc"] - \ _metrics(joint.hit.to_numpy(), joint["netmhcpan4.el"].to_numpy())["pr_auc"] differences = pandas.read_csv(out / "sample_differences.csv", dtype={"sample_id": str}) got = differences.loc[(differences.sample_id == "S1") & (differences.candidate == "a_with_flanks") & (differences.reference == "netmhcpan4.el") & (differences.metric == "pr_auc"), "delta"] assert got.item() == pytest.approx(expected) assert (out / "external_comparison.pdf").stat().st_size > 1000 for name in ("macro_metrics.png", "paired_differences_mhcflurry.png", "paired_differences_external.png", "precision_recall.png", "summary.md", "coverage.csv", "analysis_source.py"): assert (out / name).is_file() coverage = pandas.read_csv(out / "coverage.csv") assert coverage["netmhcpan4.el_unscored"].sum() == 2 and coverage["a_with_flanks_unscored"].sum() == 0 assert coverage["netmhcpan4.2.el_unscored"].sum() == 0 provenance = json.loads((out / "provenance.json").read_text()) paths = [item["path"] for item in provenance["inputs"]] assert any(path.endswith("benchmark.multiallelic.netmhcpan4.ba.train_excluded.S2.0.csv.bz2") for path in paths) assert any(path.endswith("benchmark.multiallelic.netmhcpan4.2.el.train_excluded.S2.0.csv") for path in paths) with pytest.raises(ValueError, match="new or empty"): module.main(arguments(data, extra, comparison, out)) def test_unmatched_saved_row_fails(tmp_path, module): data, extra, comparison, _ = write_multiallelic(tmp_path, drop_external_row=True) with pytest.raises(ValueError, match="lack a matching netmhcpan4.el row"): module.main(arguments(data, extra, comparison, tmp_path / "out")) def test_common_coverage_cli_reports_identical_denominators(tmp_path, module): data, extra, comparison, saved = write_multiallelic(tmp_path) out = tmp_path / "out" assert module.main(arguments(data, extra, comparison, out, "--coverage", "common", "--baselines", "none")) == 0 summary = pandas.read_csv(out / "summary.csv") assert summary.rows.nunique() == 1 and summary.hits.nunique() == 1 assert summary.rows.iloc[0] == len(saved) - 2 provenance = json.loads((out / "provenance.json").read_text()) assert provenance["coverage"]["excluded_rows"] == 2 coverage = pandas.read_csv(out / "coverage.csv") assert coverage.common_excluded.sum() == coverage["netmhcpan4.el_unscored"].sum() == 2 assert pandas.read_csv(out / "paired_differences.csv").rows_excluded.eq(0).all() def test_missing_external_file_names_the_searched_directories(tmp_path, module): data, extra, comparison, _ = write_multiallelic(tmp_path) for path in extra.glob("*netmhcpan4.2.el*"): path.rename(path.with_suffix(".moved")) with pytest.raises(FileNotFoundError, match="netmhcpan4.2.el"): module.main(arguments(data, extra, comparison, tmp_path / "out")) def test_flank_modes_must_share_rows(tmp_path, module): data, extra, comparison, _ = write_multiallelic(tmp_path) path = comparison / "presentation" / "predictions_without_flanks.csv.bz2" pandas.read_csv(path).iloc[::-1].to_csv(path, index=False) with pytest.raises(ValueError, match="identical rows"): module.main(arguments(data, extra, comparison, tmp_path / "out")) def test_monoallelic_affinity_verifies_saved_external_column(tmp_path, module): data = tmp_path / "data_evaluation" data.mkdir() extra = tmp_path / "local_scores" extra.mkdir() affinity = tmp_path / "comparison" / "affinity" affinity.mkdir(parents=True) saved = [] for index, sample in enumerate(["A0201", "B0702"]): rows = benchmark_rows(sample, index + 3).assign(hla="HLA-A*02:01") suffix = sample + ".0.csv.bz2" for predictor in PRECOMPUTED + LOCAL: rows[KEYS + [predictor]].to_csv( data / ("benchmark.monoallelic.%s.train_excluded.%s" % (predictor, suffix)), index=False) saved.append(rows.assign(source_file="benchmark.monoallelic.mixmhcpred.train_excluded." + suffix)) saved = pandas.concat(saved, ignore_index=True) rng = numpy.random.default_rng(11) saved["a_pred"] = numpy.where(saved.hit == 1, rng.uniform(5, 500, len(saved)), rng.uniform(100, 40000, len(saved))) saved["b_pred"] = numpy.where(saved.hit == 1, rng.uniform(10, 2000, len(saved)), rng.uniform(100, 40000, len(saved))) columns = KEYS + ["source_file", "mixmhcpred", "a_pred", "b_pred"] saved[columns].to_csv(affinity / "predictions.csv.bz2", index=False) out = tmp_path / "out" assert module.main(arguments(data, extra, tmp_path / "comparison", out, "--cohort", "monoallelic", "--skip-joined-table")) == 0 summary = pandas.read_csv(out / "summary.csv") assert set(summary.condition) == {"a_affinity", "b_affinity", *PRECOMPUTED, *LOCAL, "random", "terminal_logistic"} assert not (out / "joined_scores.csv.gz").exists() bad = saved[columns].copy() bad.loc[3, "mixmhcpred"] += 1 bad.to_csv(affinity / "predictions.csv.bz2", index=False) with pytest.raises(ValueError, match="disagree"): module.main(arguments(data, extra, tmp_path / "comparison", tmp_path / "out2", "--cohort", "monoallelic")) def test_reference_baselines_are_scored_without_leaking_labels(tmp_path, module): data, extra, comparison, _ = write_multiallelic(tmp_path) out = tmp_path / "out" assert module.main(arguments(data, extra, comparison, out)) == 0 summary = pandas.read_csv(out / "summary.csv").set_index("condition") assert 0.3 < summary.loc["random", "macro_roc_auc"] < 0.7 assert "terminal_logistic" in summary.index paired = pandas.read_csv(out / "paired_differences.csv") assert ("a_with_flanks", "terminal_logistic") in set(zip(paired.candidate, paired.reference)) frame = pandas.DataFrame({ "peptide": ["SIINFEKL", "GILGFVFT", "NLVPMVAT", "AAAAAAAA"] * 30, "hit": [1, 0, 0, 0] * 30, "sample_id": ["A"] * 60 + ["B"] * 60}) before = module.leave_one_sample_out_logistic(frame) flipped = frame.copy() flipped.loc[flipped.sample_id == "A", "hit"] = [0, 1, 0, 0] * 15 after = module.leave_one_sample_out_logistic(flipped) in_a = (frame.sample_id == "A").to_numpy() numpy.testing.assert_allclose(after[in_a], before[in_a]) assert not numpy.allclose(after[~in_a], before[~in_a]) def test_terminal_features_encode_both_ends_and_unknown_residues(module): features = module.terminal_residue_features(["ACDEFGHIK", "AC"]).toarray() assert features.shape == (2, 8 * 21) and (features.sum(axis=1) == 8).all() assert features[0, 0 * 21 + 0] == 1 and features[0, 7 * 21 + module.AMINO_ACIDS.index("K")] == 1 assert features[1, 2 * 21 + 20] == 1 # short peptide padded with the unknown symbol def test_reference_baselines_can_be_disabled(tmp_path, module): data, extra, comparison, _ = write_multiallelic(tmp_path) out = tmp_path / "out" assert module.main(arguments(data, extra, comparison, out, "--baselines", "none")) == 0 assert not {"random", "terminal_logistic"} & set(pandas.read_csv(out / "summary.csv").condition) mhcflurry-2.3.6/test/test_presentation_score_only_comparison.py000066400000000000000000000062611525677230600253500ustar00rootroot00000000000000import numpy import pandas import pytest from mhcflurry.cli import compare_models def test_uncalibrated_combiner_requires_explicit_score_only_mode(): frame = pandas.DataFrame({"peptide": ["SIINFEKL"], "a_presentation_score": [0.2], "b_presentation_score": [0.3], "a_presentation_percentile": [numpy.nan], "b_presentation_percentile": [1.0]}) with pytest.raises(ValueError, match="presentation_percentile"): compare_models._require_finite_presentation_scores(frame, "with_flanks", ("new", "public")) compare_models._require_finite_presentation_scores( frame, "with_flanks", ("new", "public"), score_kinds=("presentation_score",)) frame.loc[0, "a_presentation_score"] = numpy.nan with pytest.raises(ValueError, match="a_presentation_score|presentation_score"): compare_models._require_finite_presentation_scores( frame, "with_flanks", ("new", "public"), score_kinds=("presentation_score",)) def test_default_comparison_still_requires_scores_and_percentiles(): args = compare_models.make_parser().parse_args(["--a", "new", "--out", "eval"]) assert args.presentation_score_kinds == "presentation_score,presentation_percentile" def test_summary_markdown_accepts_explicit_score_only_comparison(tmp_path): headline = {"presentation": {"modes": ["with_flanks"], "summaries": { "with_flanks": {"presentation_score": {"micro_pooled": { "a": {"roc_auc": 0.9}, "b": {"roc_auc": 0.8}}, "n_samples_reported": 1}}}}} compare_models._write_summary_markdown( headline, {"label": "new", "spec": "new"}, {"label": "public", "spec": "public"}, str(tmp_path), ["presentation"]) result = (tmp_path / "summary.md").read_text() assert "with_flanks / presentation_score" in result assert "with_flanks / presentation_percentile" not in result def test_score_only_component_persists_predictions_without_fabricated_percentiles(tmp_path, monkeypatch): benchmark = pandas.DataFrame({"peptide": ["SIINFEKL", "SLYNTVATL"], "hit": [0, 1], "sample_id": ["sample"] * 2, "hla": ["HLA-A*02:01"] * 2, "peptide_len": [8, 9]}) monkeypatch.setattr(compare_models, "_load_presentation_benchmark_for_component", lambda *a: benchmark) monkeypatch.setattr(compare_models, "model_artifact_size_bytes", lambda *a: 1) prediction = pandas.DataFrame({"presentation_score": [0.1, 0.9], "presentation_percentile": [numpy.nan] * 2, "affinity": [1000, 10], "processing_score": [0.1, 0.9]}) monkeypatch.setattr(compare_models, "_parallel_presentation_predict", lambda *a, **k: prediction) args = compare_models.make_parser().parse_args([ "--a", "new", "--out", str(tmp_path), "--data-dir", str(tmp_path), "--presentation-modes", "with_flanks", "--presentation-score-kinds", "presentation_score"]) side = {"label": "uncalibrated", "paths": {"presentation": str(tmp_path)}} result = compare_models._run_presentation(side, side, args) assert result["score_kinds"] == ["presentation_score"] saved = pandas.read_csv(tmp_path / "presentation/predictions_with_flanks.csv.bz2") assert saved.a_presentation_percentile.isna().all() assert saved.a_presentation_score.tolist() == [0.1, 0.9] mhcflurry-2.3.6/test/test_processing_affinity_control.py000066400000000000000000000132141525677230600237500ustar00rootroot00000000000000"""Tests for affinity-controlled processing evaluation.""" import json import pandas import pytest from mhcflurry.cli import processing_affinity_control as command def _cohort(): return pandas.DataFrame({ "sample_id": ["sample"] * 6, "peptide": [ "AAAAAAAA", "BBBBBBBB", "CCCCCCCC", "DDDDDDDD", "EEEEEEEE", "FFFFFFFF", ], "hit": [1, 0, 0, 1, 0, 0], "n_flank": ["NNNNN"] * 6, "c_flank": ["CCCCC"] * 6, "protein_accession": ["p1", "p1", "p2", "p2", "p2", "p3"], "mhcflurry_production_affinity": [10, 11, 12, 100, 101, 102], "log10_affinity": [ 1.0, 1.0413927, 1.0791812, 2.0, 2.0043214, 2.0086002, ], "peptide_len": [8] * 6, "candidate": [.9, .8, .1, .7, .6, .2], "baseline": [.8, .7, .2, .6, .5, .3], }) def test_affinity_risk_sets_prefer_same_protein(): matched, diagnostics = command.make_affinity_controlled_risk_sets( _cohort(), decoys_per_hit=2) assert len(matched) == 6 assert matched.groupby("risk_set_id").hit.agg(["sum", "count"]).values.tolist() == [ [1, 3], [1, 3], ] first = matched.loc[matched.risk_set_id == 0] assert first.loc[first.match_rank == 1, "protein_accession"].item() == "p1" assert diagnostics["risk_sets"] == 2 assert diagnostics["fallback_decoys"] == 2 def test_score_risk_sets_reports_paired_summary(): matched, _ = command.make_affinity_controlled_risk_sets( _cohort(), decoys_per_hit=2) metrics = command.score_risk_sets( matched, ["candidate", "baseline"]) summary, comparisons = command.summarize_metrics(metrics, "baseline") assert set(metrics.scope) == {"overall", "sample", "length"} assert set(summary.score) == {"candidate", "baseline"} baseline = comparisons.set_index("score").loc["baseline"] assert baseline.macro_pr_auc_diff == 0 assert baseline.macro_ppv_at_n_diff == 0 def test_processing_affinity_control_end_to_end(tmp_path): cohort = _cohort() identity = list(command.IDENTITY_COLUMNS) predictions = cohort[identity].copy() predictions["a_processing_score"] = cohort.candidate predictions["b_processing_score"] = cohort.baseline prediction_path = tmp_path / "predictions.csv.bz2" predictions.to_csv(prediction_path, index=False) production = cohort[identity + [ "protein_accession", "mhcflurry_production_affinity", ]] # The command keys files by their contents, not sanitized filename text. production_path = tmp_path / ( "benchmark.multiallelic.production.train_excluded.not-the-id.0.csv.bz2") production.to_csv(production_path, index=False) out = tmp_path / "out" result = command.run_argv([ "--score", "candidate=%s:a_processing_score" % prediction_path, "--score", "baseline=%s:b_processing_score" % prediction_path, "--baseline", "baseline", "--data-dir", str(tmp_path), "--decoys-per-hit", "2", "--out", str(out), ]) assert result == 0 heldout = pandas.read_csv(out / "heldout_predictions.csv.bz2") assert len(heldout) == len(cohort) assert {"candidate", "baseline", "protein_accession", "mhcflurry_production_affinity"}.issubset(heldout.columns) assert (out / "matched_predictions.csv.bz2").exists() assert set(pandas.read_csv(out / "summary.csv").score) == { "candidate", "baseline", } experiment = json.loads((out / "experiment.json").read_text()) assert experiment["diagnostics"]["risk_sets"] == 2 added = predictions[identity].copy() added["radius3"] = [0.95, 0.7, 0.1, 0.8, 0.4, 0.2] added["radius4"] = [0.9, 0.6, 0.2, 0.75, 0.5, 0.1] added_path = tmp_path / "added.csv.bz2" added.to_csv(added_path, index=False) extended_out = tmp_path / "extended" result = command.run_argv([ "--score", "radius3=%s:radius3" % added_path, "--score", "radius4=%s:radius4" % added_path, "--baseline", "baseline", "--data-dir", str(tmp_path), "--existing", str(out), "--out", str(extended_out), ]) assert result == 0 extended = pandas.read_csv( extended_out / "heldout_predictions.csv.bz2") assert extended.radius3.tolist() == added.radius3.tolist() matched = pandas.read_csv( extended_out / "matched_predictions.csv.bz2") assert matched.radius4.tolist() == extended.radius4.iloc[ matched.source_row].tolist() assert set(pandas.read_csv(extended_out / "summary.csv").score) == { "candidate", "baseline", "radius3", "radius4", } extended_experiment = json.loads( (extended_out / "experiment.json").read_text()) assert extended_experiment["extended_from"].endswith( "out/experiment.json") # An archived ordered affinity table gives exactly the same assignments. cached_out = tmp_path / "cached" assert command.run_argv([ "--score", "candidate=%s:a_processing_score" % prediction_path, "--baseline", "candidate", "--affinity-cache", str(out / "heldout_predictions.csv.bz2"), "--decoys-per-hit", "2", "--out", str(cached_out)]) == 0 assert pandas.read_csv(cached_out / "matched_predictions.csv.bz2").source_row.tolist() == matched.source_row.tolist() # Do not trust saved distances when a reused artifact has been changed. corrupt = pandas.read_csv(out / "matched_predictions.csv.bz2") corrupt.loc[1, "mhcflurry_production_affinity"] = 50000 corrupt.to_csv(out / "matched_predictions.csv.bz2", index=False) with pytest.raises(ValueError, match="affinities disagree"): command._extend_existing(out, added.rename(columns={"radius3": "new"}), [{"name": "new"}]) mhcflurry-2.3.6/test/test_processing_checkpoints.py000066400000000000000000000103621525677230600227120ustar00rootroot00000000000000"""Best/terminal processing states stay independent and survive serialization.""" import json import numpy import pandas import pytest import torch from mhcflurry import Class1ProcessingNeuralNetwork, Class1ProcessingPredictor from mhcflurry.flanking_encoding import FlankingEncoding @pytest.fixture def retained_model(monkeypatch): import mhcflurry.class1_processing_neural_network as module # Make the best state unmistakably different from the terminal optimizer state. monkeypatch.setattr(module, "copy_module_state_dict_to_cpu", lambda model: { name: torch.zeros_like(value, device="cpu") for name, value in model.state_dict().items()}) model = Class1ProcessingNeuralNetwork( max_epochs=2, early_stopping=False, validation_split=0.5, minibatch_size=2, convolutional_filters=4, convolutional_kernel_size=3, n_flank_length=2, c_flank_length=2, dropout_rate=0, save_all_checkpoints=True, restore_best_weights=True) model.fit(FlankingEncoding(["SIINFEKL"] * 4, ["AA"] * 4, ["CC"] * 4), [0, 1, 0, 1], seed=42, verbose=-1, progress_print_interval=None) return model def test_retention_is_independent_and_has_epoch_steps(retained_model): model = retained_model assert set(model.checkpoint_weights) == {"best", "terminal"} assert all(not w.any() for w in model.checkpoint_weights["best"]) assert any(w.any() for w in model.checkpoint_weights["terminal"]) assert all(not w.any() for w in model.get_weights()) before = [w.copy() for w in model.checkpoint_weights["terminal"]] with torch.no_grad(): next(model.network().parameters()).add_(1) for expected, actual in zip(before, model.checkpoint_weights["terminal"]): numpy.testing.assert_array_equal(actual, expected) info = model.fit_info[-1] assert info["optimizer_steps"] == [1, 2] assert len(info["epoch_seconds"]) == len(info["loss"]) == 2 assert info["stop_reason"] == "max_epochs" assert json.loads(json.dumps(model.get_config()))["checkpoint_weights"] == {} def test_processing_checkpoint_save_load_and_refit_clear(tmp_path, retained_model): predictor = Class1ProcessingPredictor([retained_model]) source = tmp_path / "source" predictor.save(str(source)) loaded = Class1ProcessingPredictor.load(str(source)) for policy in ("best", "terminal"): for expected, actual in zip(retained_model.checkpoint_weights[policy], loaded.models[0].checkpoint_weights[policy]): numpy.testing.assert_array_equal(actual, expected) # Refit the loaded model without checkpoint retention. model = loaded.models[0] model.hyperparameters.update(save_all_checkpoints=False, max_epochs=1) model.fit(FlankingEncoding(["SIINFEKL"] * 4, ["AA"] * 4, ["CC"] * 4), [0, 1, 0, 1], seed=43, verbose=-1, progress_print_interval=None) assert model.checkpoint_weights == {} destination = tmp_path / "refit" loaded.save(str(destination)) manifest = pandas.read_csv(destination / "manifest.csv") assert manifest.checkpoint_best_weights.isna().all() assert manifest.checkpoint_terminal_weights.isna().all() assert Class1ProcessingPredictor.load(str(destination)).models[0].checkpoint_weights == {} # Saving in place must clear old references too, not expose stale states. loaded.save(str(source)) assert Class1ProcessingPredictor.load(str(source)).models[0].checkpoint_weights == {} def test_missing_checkpoint_fails_closed(tmp_path, retained_model): predictor = Class1ProcessingPredictor([retained_model]) predictor.save(str(tmp_path)) manifest = pandas.read_csv(tmp_path / "manifest.csv") (tmp_path / manifest.checkpoint_terminal_weights.iloc[0]).unlink() with pytest.raises(ValueError, match="Missing retained terminal"): Class1ProcessingPredictor.load(str(tmp_path)) def test_cpu_weight_snapshots_do_not_alias_parameters(): model = Class1ProcessingNeuralNetwork(convolutional_filters=4) network = model.make_network(**model.network_hyperparameter_defaults.subselect(model.hyperparameters)) before = network.get_weights_list() with torch.no_grad(): next(network.parameters()).add_(1) assert not numpy.array_equal(before[0], network.get_weights_list()[0]) mhcflurry-2.3.6/test/test_processing_cleavage_boundaries.py000066400000000000000000000121041525677230600243560ustar00rootroot00000000000000"""Tests for the cleavage-boundary processing experiment design.""" import importlib.util from pathlib import Path import yaml SCRIPT = ( Path(__file__).parents[1] / "scripts" / "training" / "generate_processing_cleavage_boundaries.py" ) def _module(): spec = importlib.util.spec_from_file_location( "generate_processing_cleavage_boundaries", SCRIPT) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module def test_kernel_sweep_has_six_paired_widths_and_fixed_controls(): conditions = _module().build_kernel_conditions() assert len(conditions) == 12 assert sum(axes["network_count"] for _, _, axes in conditions) == 48 families = {} for name, grid, axes in conditions: config = dict(grid[0]) width = config.pop("convolutional_kernel_size") assert width == axes["kernel_width"] assert axes["fold_count"] == 4 assert config["convolutional_padding_mode"] == "unknown" assert config["restore_best_weights"] is True assert config["minibatch_size"] == 512 assert config["convolutional_filters"] == 512 assert config["optimizer_implementation"] == "keras" assert config["convolutional_activation"] == "relu" assert config["dropout_rate"] == 0.5 families.setdefault(axes["family"], []).append((width, config)) assert set(families) == {"legacy_5aa", "boundary_5x5"} for records in families.values(): assert [width for width, _ in records] == [5, 7, 9, 11, 13, 15] assert all(config == records[0][1] for _, config in records) def test_cleavage_boundary_design_is_paired_and_minimal(tmp_path): module = _module() conditions = module.build_conditions() assert len(conditions) == 8 assert {axes["architecture"] for _, _, axes in conditions} == { "small_tanh", "large_relu", } assert {axes["model_kind"] for _, _, axes in conditions} == { "legacy_5aa", "legacy_no_flank", "cleavage_boundary", } boundary_conditions = [ record for record in conditions if record[2]["model_kind"] == "cleavage_boundary" ] assert {axes["peptide_context_length"] for _, _, axes in boundary_conditions} == {2, 5} for condition, grid, axes in conditions: assert len(grid) == 1 item = grid[0] assert item["minibatch_size"] == 512 assert item["optimizer_implementation"] == "keras" assert item["init"] == "glorot_uniform" assert axes["baseline_5aa_condition"].endswith("__legacy_5aa") assert axes["baseline_no_flank_condition"].endswith( "__legacy_no_flank") if axes["model_kind"] == "cleavage_boundary": assert item["n_flank_length"] == 5 assert item["c_flank_length"] == 5 assert item["flanking_averages"] is False assert item["cleavage_boundary_flank_length"] == 5 assert item["cleavage_boundary_peptide_length"] == axes[ "peptide_context_length"] assert item["cleavage_boundary_context_dropout"] == 0.25 elif axes["model_kind"] == "legacy_5aa": assert condition.endswith("__legacy_5aa") assert item["n_flank_length"] == 5 assert item["c_flank_length"] == 5 assert item["flanking_averages"] is True assert "cleavage_boundary_flank_length" not in item else: assert condition.endswith("__legacy_no_flank") assert item["n_flank_length"] == 0 assert item["c_flank_length"] == 0 assert "cleavage_boundary_flank_length" not in item manifest = module.write_conditions(tmp_path) assert manifest["design"] == "processing-cleavage-boundaries" assert len(manifest["records"]) == 8 assert manifest["network_budget"]["total_networks"] == 32 for record in manifest["records"]: path = tmp_path / record["hyperparameters_path"] assert len(yaml.safe_load(path.read_text())) == 1 def test_cleavage_boundary_followup_is_two_paired_large_conditions(tmp_path): module = _module() manifest = module.write_conditions( tmp_path, architectures=["large_relu"], peptide_context_lengths=[3, 4], include_controls=False, design="processing-cleavage-boundary-radius", ) assert manifest["design"] == "processing-cleavage-boundary-radius" assert manifest["network_budget"] == { "boundary_networks": 8, "legacy_control_networks": 0, "total_networks": 8, } assert [record["condition"] for record in manifest["records"]] == [ "large_relu__intermediate_5x3", "large_relu__intermediate_5x4", ] assert { record["peptide_context_length"] for record in manifest["records"] } == {3, 4} for record in manifest["records"]: grid = yaml.safe_load( (tmp_path / record["hyperparameters_path"]).read_text()) assert len(grid) == 1 assert grid[0]["cleavage_boundary_flank_length"] == 5 assert grid[0]["cleavage_boundary_context_dropout"] == 0.25 mhcflurry-2.3.6/test/test_processing_confirmation_analysis.py000066400000000000000000000165351525677230600250030ustar00rootroot00000000000000"""The recipe promotion gate is paired, complete and micro-safe.""" import importlib.util import json from pathlib import Path import numpy import pandas import pytest import yaml @pytest.fixture def analysis_module(monkeypatch): directory = Path(__file__).resolve().parents[1] / "scripts/training" monkeypatch.syspath_prepend(str(directory)) spec = importlib.util.spec_from_file_location("confirmation_analysis", directory / "analyze_processing_confirmation.py") module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module def fixture_experiment(tmp_path): from generate_processing_recipe import build_processing_confirmation_conditions records = [dict(condition=name, hyperparameters=hp, **axes) for name, hp, axes in build_processing_confirmation_conditions()] (tmp_path / "experiment.json").write_text(json.dumps({"design": "processing-ranking-confirmation-v1", "records": records})) for record in records: rows, pooled = [], [] for policy in ("best", "best_ap", "terminal"): gain = 0 if policy == "best" else 0.02 if record["optimizer"] == "rmsprop" and record["kernel_width"] == 13: gain += 0.01 for fold in range(4): common = dict(condition=record["condition"], checkpoint_policy=policy, fold_num=fold, roc_auc=0.7 + gain, pr_auc=0.6 + gain, ppv_at_n=0.55 + gain) pooled.append(dict(common, n=200, n_pos=100)) for sample in ("a", "b"): rows.append(dict(common, sample_id=sample, n=100, n_pos=50)) destination = tmp_path / record["condition"] destination.mkdir() pandas.DataFrame(rows).to_csv(destination / "checkpoint_per_sample.csv", index=False) pandas.DataFrame(pooled).to_csv(destination / "checkpoint_micro_by_fold.csv", index=False) return records def test_complete_paired_gate_writes_reusable_candidate(tmp_path, analysis_module): fixture_experiment(tmp_path) out = tmp_path / "analysis" assert analysis_module.main(["--experiment", str(tmp_path), "--out", str(out), "--replicates", "100"]) == 0 decision = json.loads((out / "decision.json").read_text()) assert decision["candidate_condition"] == "legacy_5aa__rmsprop_pytorch__k13" assert not decision["release_accepted"] from generate_processing_recipe import CONFIRMED_PROCESSING_CANDIDATE, confirmed_processing_candidate_hyperparameters assert decision["candidate_condition"] == CONFIRMED_PROCESSING_CANDIDATE["condition"] exported = yaml.safe_load((out / "candidate_hyperparameters.yaml").read_text()) assert exported == [confirmed_processing_candidate_hyperparameters()] assert (out / "confirmation.pdf").stat().st_size > 1000 assert (out / "analysis_source.py").is_file() with pytest.raises(ValueError, match="new output"): analysis_module.main(["--experiment", str(tmp_path), "--out", str(out)]) def test_optional_epoch_diagnostics_and_manifest_hash(tmp_path, analysis_module): records = fixture_experiment(tmp_path) name = records[0]["condition"] model_dir = tmp_path / name / "processing/models.unselected.short_flanks" model_dir.mkdir(parents=True) configs = [{"fit_info": [{"training_info": {"fold_num": fold}, "loss": [0.6, 0.5], "val_loss": [0.6, 0.62], "val_macro_ap": [0.7, 0.8], "val_macro_ppv_at_n": [0.6, 0.7], "best_epoch": 1, "best_ranking_epoch": 2, "ranking_validation_samples": ["inner"]}]} for fold in range(4)] pandas.DataFrame({"config_json": list(map(json.dumps, configs))}).to_csv(model_dir / "manifest.csv", index=False) out = tmp_path / "epoch-analysis" assert analysis_module.main(["--experiment", str(tmp_path), "--out", str(out), "--replicates", "100"]) == 0 assert (out / (name + ".epochs.png")).is_file() manifest = json.loads((out / "provenance.json").read_text()) assert any(item["path"].endswith("manifest.csv") for item in manifest["inputs"]) def test_incomplete_panel_cannot_promote(tmp_path, analysis_module): records = fixture_experiment(tmp_path) for filename in ("checkpoint_per_sample.csv", "checkpoint_micro_by_fold.csv"): (tmp_path / records[-1]["condition"] / filename).unlink() design, samples, micro, pending, _ = analysis_module.collect_metrics(tmp_path) result = analysis_module.compare_and_choose(design, samples, micro, pending, 100)[-1] assert result["status"] == "incomplete" and result["candidate_condition"] is None @pytest.mark.parametrize("written", ["checkpoint_per_sample.csv", "checkpoint_micro_by_fold.csv"]) def test_half_written_condition_is_pending(tmp_path, analysis_module, written): records = fixture_experiment(tmp_path) name = records[-1]["condition"] assert name != analysis_module.BASELINE for filename in ("checkpoint_per_sample.csv", "checkpoint_micro_by_fold.csv"): if filename != written: (tmp_path / name / filename).unlink() design, samples, micro, pending, inputs = analysis_module.collect_metrics(tmp_path) assert pending == [name] assert name not in set(samples.condition) | set(micro.condition) assert tmp_path / name / written not in inputs result = analysis_module.compare_and_choose(design, samples, micro, pending, 100)[-1] assert result["status"] == "incomplete" and result["candidate_condition"] is None def test_pending_baseline_fails_closed(tmp_path, analysis_module): fixture_experiment(tmp_path) for filename in ("checkpoint_per_sample.csv", "checkpoint_micro_by_fold.csv"): (tmp_path / analysis_module.BASELINE / filename).unlink() out = tmp_path / "analysis" with pytest.raises(ValueError, match="Baseline condition is not complete: " + analysis_module.BASELINE): analysis_module.main(["--experiment", str(tmp_path), "--out", str(out), "--replicates", "100"]) assert not out.exists() def test_micro_regression_disqualifies_ap_leader(tmp_path, analysis_module): fixture_experiment(tmp_path) design, samples, micro, pending, _ = analysis_module.collect_metrics(tmp_path) target = "legacy_5aa__rmsprop_pytorch__k13" micro.loc[(micro.condition == target) & (micro.checkpoint_policy == "best_ap") & (micro.fold_num == 2), "ppv_at_n"] = 0.50 decision = analysis_module.compare_and_choose(design, samples, micro, pending, 100)[-1] assert decision["candidate_condition"] != target @pytest.mark.parametrize("change", ["duplicate", "missing_sample", "nonfinite", "unbalanced", "micro_count", "missing_policy"]) def test_bad_metrics_fail_closed(tmp_path, analysis_module, change): records = fixture_experiment(tmp_path) name = records[-1]["condition"] path = tmp_path / name / ("checkpoint_micro_by_fold.csv" if change == "micro_count" else "checkpoint_per_sample.csv") frame = pandas.read_csv(path) if change == "duplicate": frame = pandas.concat([frame, frame.iloc[:1]]) elif change == "missing_sample": frame = frame.loc[frame.sample_id != "a"] elif change == "nonfinite": frame.loc[0, "pr_auc"] = numpy.nan elif change in ("unbalanced", "micro_count"): frame.loc[0, "n"] += 1 else: frame = frame.loc[frame.checkpoint_policy != "terminal"] frame.to_csv(path, index=False) with pytest.raises((ValueError, AssertionError)): analysis_module.collect_metrics(tmp_path) mhcflurry-2.3.6/test/test_processing_ensemble_subsets.py000066400000000000000000000131441525677230600237430ustar00rootroot00000000000000"""Regression tests for count-matched processing ensemble evaluation.""" import importlib.util import json from pathlib import Path from types import SimpleNamespace import numpy import pandas import pytest from .test_processing_affinity_control import _cohort from mhcflurry.processing_matching import make_affinity_controlled_risk_sets def module(): path = Path(__file__).resolve().parents[1] / "scripts/training/evaluate_processing_subsets.py" spec = importlib.util.spec_from_file_location("evaluate_processing_subsets", path) result = importlib.util.module_from_spec(spec) spec.loader.exec_module(result) return result def test_subsets_exhaustive_not_selected(): result = module().subsets(8, 4) assert len(result) == len(set(result)) == 70 assert result[0] == (0, 1, 2, 3) assert result[-1] == (4, 5, 6, 7) assert all(sum(i in subset for subset in result) == 35 for i in range(8)) @pytest.mark.parametrize("count,size,limit", [(0, 4, 100), (8, 0, 100), (8, 9, 100), (8, 4, 69)]) def test_invalid_subset_requests(count, size, limit): with pytest.raises(ValueError): module().subsets(count, size, limit) def test_unique_rows_validate_reused_decoy_identity(): frame = _cohort().assign(source_row=numpy.arange(6)) frame = pandas.concat([frame, frame.iloc[[1]]], ignore_index=True) assert len(module().unique_inputs(frame)) == 6 frame.loc[6, "peptide"] = "YYYYYYYY" with pytest.raises(ValueError, match="Inconsistent"): module().unique_inputs(frame) @pytest.mark.parametrize("value", [-1, 0.5, numpy.inf, numpy.nan]) def test_invalid_source_rows(value): frame = _cohort().assign(source_row=numpy.arange(6, dtype=float)) frame.loc[0, "source_row"] = value with pytest.raises(ValueError): module().unique_inputs(frame) def setup_run(tmp_path, monkeypatch, mismatch=False): import mhcflurry command = module() frame, _ = make_affinity_controlled_risk_sets(_cohort(), decoys_per_hit=2) # Four genuinely different prediction vectors; the mean must agree exactly. predictions = numpy.array([[.9, .6, .2, .7, .5, .1], [.8, .5, .1, .9, .6, .2], [.7, .4, .3, .8, .7, .2], [.9, .3, .2, .6, .4, .3]]).T frame["reference"] = predictions.mean(axis=1)[frame.source_row] if mismatch: frame["reference"] += .01 path = tmp_path / "input.csv.bz2" frame.to_csv(path, index=False) models = tmp_path / "models" models.mkdir() pandas.DataFrame({"model_name": ["model%d" % i for i in range(4)], "config_json": ["{}"] * 4}).to_csv(models / "manifest.csv", index=False) for i in range(4): (models / ("weights_model%d.npz" % i)).write_bytes(bytes([i])) loaded = SimpleNamespace(models=[SimpleNamespace( predict_encoded=lambda sequences, batch_size, i=i: predictions[:, i]) for i in range(4)]) monkeypatch.setattr(mhcflurry.Class1ProcessingPredictor, "load", lambda *a: loaded) monkeypatch.setattr(command, "configure_pytorch", lambda **kwargs: None) args = command.make_parser().parse_args([ "--input", str(path), "--models-dir", str(models), "--subset-size", "2", "--reference-score", "reference", "--comparison-score", "candidate", "--out", str(tmp_path / "result")]) return command, args, predictions def test_end_to_end_preserves_all_predictions_and_membership(tmp_path, monkeypatch): command, args, matrix = setup_run(tmp_path, monkeypatch) assert command.run(args) == 0 saved = pandas.read_csv(args.out / "matched_predictions.csv.bz2") membership = json.loads((args.out / "subset_membership.json").read_text()) assert len(membership) == 6 for member in membership: expected = matrix[:, member["indices"]].mean(axis=1)[saved.source_row] numpy.testing.assert_allclose(saved[member["score"]], expected) numpy.testing.assert_allclose(numpy.load(args.out / "member_predictions.npz")["predictions"], matrix) assert len(list(args.out.glob("member_*_predictions.csv.bz2"))) == 4 distribution = pandas.read_csv(args.out / "subset_distribution.csv") assert distribution.subsets.eq(6).all() assert (distribution["min"] <= distribution["median"]).all() assert (distribution["median"] <= distribution["max"]).all() assert (args.out / "completed.json").exists() with pytest.raises(ValueError, match="fresh"): command.run(args) def test_mismatched_full_reference_fails_before_reporting_subsets(tmp_path, monkeypatch): command, args, _ = setup_run(tmp_path, monkeypatch, mismatch=True) with pytest.raises(ValueError, match="Reconstructed"): command.run(args) assert (args.out / "verification.json").exists() assert not (args.out / "completed.json").exists() assert not (args.out / "summary.csv").exists() def test_cache_reuse_and_identity_guards(tmp_path, monkeypatch): command, args, _ = setup_run(tmp_path, monkeypatch) assert command.run(args) == 0 args.member_cache_dir = args.out args.out = tmp_path / "reused" assert command.run(args) == 0 original = pandas.read_csv(args.member_cache_dir / "summary.csv") pandas.testing.assert_frame_equal(original, pandas.read_csv(args.out / "summary.csv")) args.out = tmp_path / "changed" args.backend = "mps" with pytest.raises(ValueError, match="execution mismatch"): command.run(args) args.out = tmp_path / "weights-changed" args.backend = "cpu" (args.models_dir / "weights_model0.npz").write_bytes(b"changed") with pytest.raises(ValueError, match="identity mismatch"): command.run(args) mhcflurry-2.3.6/test/test_processing_evaluation.py000066400000000000000000000141161525677230600225500ustar00rootroot00000000000000"""Expanded processing evaluation preserves all hits and one shared cohort.""" import argparse import importlib.util import json from pathlib import Path import numpy import pandas import pytest from mhcflurry.processing_evaluation import load_processing_cohort, verify_hits from mhcflurry.processing_matching import IncompleteProcessingMatches, validate_matched_training_data @pytest.fixture def module(): path = Path(__file__).resolve().parents[1] / "scripts/training/prepare_processing_evaluation.py" spec = importlib.util.spec_from_file_location("prepare_processing_evaluation", path) loaded = importlib.util.module_from_spec(spec) spec.loader.exec_module(loaded) return loaded def pool(length=8): return pandas.DataFrame({ "sample_id": "s", "peptide": [letter * length for letter in "ACDE"], "protein_accession": "p", "hit": [1, 1, 0, 0], "n_flank": "NNN", "c_flank": "CCC", "hla": "HLA-A*02:01", "affinity_prediction": 100.0}) def arguments(tmp_path): args = argparse.Namespace(out=tmp_path / "matched.csv", random_seed=42, matching_reference={"sha256": "a" * 64}, decoys_per_hit=10, max_affinity_distance=.25, max_expansion_rounds=3, expansion_candidates_per_length=100, resume_matching_dir=None) Path(str(args.out) + ".matching").mkdir() return args @pytest.mark.parametrize("length", [8, 13, 15]) def test_expand_real_proteome_windows_keeps_all_hits_and_unique_decoys(tmp_path, module, length): args, original = arguments(tmp_path), pool(length) scored = [] def score(peptides): scored.extend(peptides) return numpy.full(len(peptides), 100.0) sequences = {"p": "ACDEFGHIKLMNPQRSTVWY" * 9} result = module.expand_sample(args, original, sequences, score) verify_hits(original, result) validate_matched_training_data(result) assert result.hit.sum() == 2 and len(result) == 22 assert not result.loc[result.hit.eq(0), "peptide"].duplicated().any() assert set(scored).isdisjoint(original.peptide) assert result.peptide.str.len().eq(length).all() assert result.hla.eq("HLA-A*02:01").all() scored.clear() resumed = module.expand_sample(args, original, sequences, score) assert not scored pandas.testing.assert_frame_equal(result, resumed, check_dtype=False) def test_exhaustion_preserves_failure_instead_of_reusing_negatives(tmp_path, module): args = arguments(tmp_path) with pytest.raises(IncompleteProcessingMatches, match="No unscored candidates"): module.expand_sample(args, pool(), {"p": "AAAAAAAA"}, lambda peptides: numpy.full(len(peptides), 100.0)) assert list(Path(str(args.out) + ".matching").glob("*.failure.json")) def test_cli_writes_checked_cohort_and_rejects_corruption(tmp_path, module, monkeypatch): import mhcflurry original = pool() source = tmp_path / "cached.csv" original.to_csv(source, index=False) reference = tmp_path / "reference.csv" pandas.DataFrame({"accession": ["p"], "seq": ["ACDEFGHIKLMNPQRSTVWY" * 9]}).to_csv(reference, index=False) holdout = tmp_path / "holdout" holdout.mkdir() pandas.DataFrame({"sample_id": ["s"]}).to_csv(holdout / "processing_samples.csv", index=False) monkeypatch.setattr(module, "affinity_reference_fingerprint", lambda path: {"sha256": "a" * 64}) monkeypatch.setattr(module, "_load_presentation_benchmark_for_component", lambda *args: original.assign(source_file=source.name)) monkeypatch.setattr(module, "_attach_affinity", lambda frame, data_dir: ( frame.assign(**{module.AFFINITY_COLUMN: 100.0}), [{"path": str(source), "sha256": module.sha256_file(source)}])) monkeypatch.setattr(mhcflurry.Class1AffinityPredictor, "load", lambda path: None) class Predictor: def __init__(self, **kwargs): pass def predict_affinity(self, peptides, **kwargs): return pandas.DataFrame({"affinity": numpy.full(len(peptides), 100.0)}) monkeypatch.setattr(mhcflurry, "Class1PresentationPredictor", Predictor) out = tmp_path / "out" argv = ["--data-dir", str(tmp_path), "--release-holdout-dir", str(holdout), "--proteome-reference-csv", str(reference), "--affinity-predictor", "public", "--expansion-candidates-per-length", "100", "--out", str(out)] assert module.main(argv) == 0 frame, metadata = load_processing_cohort(out, original) assert len(frame) == 22 and metadata["hits"] == 2 # Exercise the maintained comparison consumer too: both models must see # exactly these ordered rows, without rematching the original short pool. from mhcflurry.cli import compare_models compare_args = compare_models.make_parser().parse_args([ "--a", "candidate", "--b", "baseline", "--out", str(tmp_path / "comparison"), "--data-dir", str(tmp_path), "--processing-modes", "no_flank", "--processing-matched-cohort", str(out)]) monkeypatch.setattr(compare_models, "_processing_model_dirs", lambda *args: {"no_flank": ("a", "b")}) monkeypatch.setattr(compare_models, "_load_presentation_benchmark_for_component", lambda *args: original.copy()) seen = [] def predict(args, path, rows, mode, label, model_bytes=None): seen.append(rows.peptide.tolist()) return rows.hit.to_numpy() * .8 + .1 monkeypatch.setattr(compare_models, "_parallel_processing_predict", predict) summary = compare_models._run_processing({"label": "a"}, {"label": "b"}, compare_args) assert summary["negative_policy"] == "matched" assert seen == [frame.peptide.tolist(), frame.peptide.tolist()] assert module.main(argv + ["--resume"]) == 0 with pytest.raises(ValueError, match="changed held-out hits"): load_processing_cohort(out, original.iloc[1:].copy()) metadata["seed"] += 1 (out / "cohort.json").write_text(json.dumps(metadata)) with pytest.raises(ValueError, match="metadata disagrees"): load_processing_cohort(out, original) (out / "matched.csv.bz2").write_bytes(b"corrupt") with pytest.raises(ValueError, match="checksum"): load_processing_cohort(out, original) mhcflurry-2.3.6/test/test_processing_flank_ablation.py000066400000000000000000000050371525677230600233470ustar00rootroot00000000000000import importlib.util from pathlib import Path import pandas import pytest def module(): path = Path(__file__).resolve().parents[1] / "scripts/training/processing_flank_ablation.py" spec = importlib.util.spec_from_file_location("processing_flank_ablation", path) result = importlib.util.module_from_spec(spec) spec.loader.exec_module(result) return result def example(): return pandas.DataFrame({ "source_row": [10, 11, 12, 13, 14, 15, 11], "sample_id": ["a"] * 4 + ["b"] * 2 + ["a"], "peptide": ["AAAAAAAA", "CCCCCCCC", "DDDDDDDD", "EEEEEEEEE", "FFFFFFFF", "GGGGGGGG", "CCCCCCCC"], "hit": [1, 0, 0, 1, 1, 0, 0], "n_flank": ["AAAAA", "CCCCC", "DDDDD", "EEEEE", "FFFFF", "GGGGG", "CCCCC"], "c_flank": ["HHHHH", "IIIII", "KKKKK", "LLLLL", "MMMMM", "NNNNN", "IIIII"]}) def test_flank_shuffle_preserves_strata_pairs_and_duplicate_identity(): result = module().perturbation_table(example(), 42) assert len(result) == 6 donors = result.set_index("source_row").loc[result.donor_source_row].reset_index(drop=True) pandas.testing.assert_series_equal(result.sample_id, donors.sample_id) pandas.testing.assert_series_equal(result.peptide_len, donors.peptide_len) for flank in ("n_flank", "c_flank"): assert result["shuffled_" + flank].tolist() == donors[flank].tolist() again = module().perturbation_table(example().sample(frac=1, random_state=5), 42) pandas.testing.assert_frame_equal(result, again) def test_flank_shuffle_does_not_condition_on_labels(): original = module().perturbation_table(example(), 42) changed = example() changed["hit"] = 1 - changed.hit result = module().perturbation_table(changed, 42) pandas.testing.assert_series_equal(original.donor_source_row, result.donor_source_row) @pytest.mark.parametrize("column,value", [("peptide", "YYYYYYYY"), ("hit", 1), ("n_flank", "VVVVV")]) def test_flank_shuffle_rejects_conflicting_repeated_rows(column, value): frame = example() frame.loc[6, column] = value with pytest.raises(ValueError, match="inconsistent"): module().perturbation_table(frame, 42) def test_flank_audit_uses_local_context_and_counts_unknowns(): frame = example().iloc[:1].copy() frame["n_flank"] = "XXXXXAAAAA" frame["c_flank"] = "AAAAXAAAAA" audit = module().flank_audit(frame).iloc[0] assert audit.n_complete_fraction == 1 assert audit.c_complete_fraction == 0 frame["n_flank"] = None assert module().flank_audit(frame).iloc[0].n_empty_fraction == 1 mhcflurry-2.3.6/test/test_processing_fold_ensembles.py000066400000000000000000000134111525677230600233570ustar00rootroot00000000000000"""Cached ensembles must never average models across incompatible folds.""" import importlib.util import json from pathlib import Path import numpy import pandas import pytest from mhcflurry.experiment_archive import sha256_file def module(): path = Path(__file__).resolve().parents[1] / "scripts/training/evaluate_processing_fold_ensembles.py" spec = importlib.util.spec_from_file_location("fold_ensembles", path) result = importlib.util.module_from_spec(spec) spec.loader.exec_module(result) return result def write_cache(directory, condition, frame=None, training_hash="frozen", scope=None): command = module() if frame is None: rows = [] for policy, offset in (("best", 0), ("terminal", 0.05)): for fold, samples in ((0, ("a", "b")), (1, ("a", "c"))): for sample_index, sample in enumerate(samples): for j in range(4): score = [0.8, 0.4, 0.7, 0.1][j] + offset if condition == "second": score = [0.6, 0.5, 0.4, 0.3][j] + offset rows.append(dict(condition=condition, model_name=condition + "-f%d" % fold, checkpoint_policy=policy, fold_num=fold, validation_row_index=sample_index * 4 + j, sample_id=sample, hit=int(j % 2 == 0), peptide="AAAAAAAA", n_flank="NN", c_flank="CC", risk_set_id="%s-%d" % (sample, j // 2), processing_score=score)) frame = pandas.DataFrame(rows) path = directory / (condition + ".csv.bz2") frame.to_csv(path, index=False) marker = {"identity": {"scope": scope or command.SCOPE, "condition": condition, "training_data_sha256": training_hash}, "prediction_sha256": sha256_file(path)} path.with_name(path.name + ".json").write_text(json.dumps(marker)) return path, frame def test_fold_ensemble_arithmetic_identity_and_macro_weighting(tmp_path): command = module() first, _ = write_cache(tmp_path, "first") second, _ = write_cache(tmp_path, "second") result, members, metrics, sample_means, micro, summary, _ = command.score_ensembles( {"two": [first.name, second.name]}, tmp_path, ["best", "terminal"]) expected = (numpy.array([0.8, 0.4, 0.7, 0.1], dtype="float32") + numpy.array([0.6, 0.5, 0.4, 0.3], dtype="float32")) / numpy.float32(2) numpy.testing.assert_array_equal(result.two__best, numpy.tile(expected, 4)) assert len(members) == 4 assert members.groupby("fold_num").size().tolist() == [2, 2] assert len(metrics) == 8 and len(sample_means) == 6 and len(micro) == 4 assert summary.macro_pr_auc.eq(1).all() assert not result.duplicated(command.KEYS).any() @pytest.mark.parametrize("problem", ["sample", "label", "flank", "row", "fold", "hash", "duplicate", "two_models", "model_two_folds", "nan", "missing_policy", "scope"]) def test_fold_guards_reject_invalid_caches(tmp_path, problem): command = module() first, _ = write_cache(tmp_path, "first") second, frame = write_cache(tmp_path, "second") if problem == "sample": frame.loc[0, "sample_id"] = "changed" elif problem == "label": frame.loc[0, "hit"] = 0 elif problem == "flank": frame.loc[0, "n_flank"] = "YY" elif problem == "row": frame = frame.drop(index=[0, 16]) elif problem == "fold": frame.loc[frame.fold_num.eq(1), "fold_num"] = 2 elif problem == "duplicate": frame = pandas.concat([frame, frame.iloc[:1]]) elif problem == "two_models": frame.loc[0, "model_name"] = "unexpected" elif problem == "model_two_folds": frame.model_name = "shared-model" elif problem == "nan": frame.loc[0, "processing_score"] = numpy.nan elif problem == "missing_policy": frame = frame.loc[frame.checkpoint_policy.eq("best")] second, _ = write_cache(tmp_path, "second", frame, training_hash="different" if problem == "hash" else "frozen", scope="in-sample" if problem == "scope" else None) with pytest.raises(ValueError): command.score_ensembles({"two": [first.name, second.name]}, tmp_path, ["best", "terminal"]) def test_corrupt_and_duplicate_members_are_rejected(tmp_path): command = module() path, _ = write_cache(tmp_path, "first") with pytest.raises(ValueError, match="Duplicate ensemble member"): command.score_ensembles({"bad": [path.name, path.name]}, tmp_path, ["best"]) path.write_bytes(path.read_bytes() + b"changed") with pytest.raises(ValueError, match="Changed checkpoint cache"): command.load_predictions(path, ["best"]) def test_command_preserves_scores_and_provenance_without_overwrite(tmp_path): command = module() first, _ = write_cache(tmp_path, "first") second, _ = write_cache(tmp_path, "second") definition = tmp_path / "ensembles.json" definition.write_text(json.dumps({"two": [first.name, second.name]})) out = tmp_path / "out" args = ["--ensembles", str(definition), "--out", str(out)] assert command.main(args) == 0 saved = pandas.read_csv(out / "fold_ensemble_predictions.csv.gz") assert {"two__best", "two__terminal", "fold_num", "validation_row_index", "n_flank", "c_flank"} <= set(saved) provenance = json.loads((out / "provenance.json").read_text()) assert not provenance["training"] and not provenance["inference"] and not provenance["release_accepted"] assert len(provenance["inputs"]) == 2 assert not (out / "fold_ensemble_predictions.tmp.gz").exists() for record in provenance["outputs"]: assert sha256_file(out / record["path"]) == record["sha256"] with pytest.raises(ValueError, match="fresh"): command.main(args) mhcflurry-2.3.6/test/test_processing_initialization.py000066400000000000000000000141321525677230600234260ustar00rootroot00000000000000"""Processing LSUV uses real activation semantics and protects scalar heads.""" import numpy import pytest import torch from mhcflurry import Class1ProcessingNeuralNetwork from mhcflurry.flanking_encoding import FlankingEncoding from mhcflurry.processing_initialization import ( initialize_processing_network, processing_activation_variance, processing_hidden_layers) def make_model(boundary=True): numpy.random.seed(42) torch.manual_seed(42) hp = dict(convolutional_filters=16, convolutional_kernel_size=5, n_flank_length=5, c_flank_length=5, convolutional_activation="relu", convolutional_padding_mode="unknown", post_convolutional_dense_layer_sizes=[8], dropout_rate=0.5) if boundary: hp.update(cleavage_boundary_flank_length=5, cleavage_boundary_peptide_length=5, cleavage_boundary_hidden_size=8, cleavage_boundary_context_dropout=0.25) wrapper = Class1ProcessingNeuralNetwork(**hp) model = wrapper.make_network(**wrapper.network_hyperparameter_defaults.subselect(wrapper.hyperparameters)) peptides = ["SIINFEKL", "GILGFVFTL", "NLVPMVATV", "AAAAAAAA"] * 8 sequences = FlankingEncoding(peptides, ["ARNDC"] * 32, ["QEGHI"] * 32) inputs = {name: torch.as_tensor(value.copy()) for name, value in wrapper.network_input(sequences).items()} return model, inputs @pytest.mark.parametrize("boundary", [False, True]) @pytest.mark.parametrize("method", ["orthogonal", "lsuv_pre", "lsuv_post"]) def test_initialization_variance_and_protected_parameters(boundary, method): model, inputs = make_model(boundary) before = {name: value.clone() for name, value in model.named_parameters()} eligible = {name + ".weight" for name, _ in processing_hidden_layers(model)} report = initialize_processing_network(model, inputs, method) assert model.training for name, value in model.named_parameters(): if name not in eligible: torch.testing.assert_close(value, before[name], rtol=0, atol=0) assert len(report["layers"]) == (5 if boundary else 3) if method.startswith("lsuv"): model.eval() for name, layer in processing_hidden_layers(model): variance = processing_activation_variance(model, layer, inputs, method == "lsuv_post") assert abs(variance - 1) <= 0.05, (name, variance) def test_none_is_exact_noop_and_pre_post_are_different(): model, inputs = make_model() before = {name: value.clone() for name, value in model.state_dict().items()} rng = torch.get_rng_state().clone() initialize_processing_network(model, inputs, "none") assert torch.equal(rng, torch.get_rng_state()) for name, value in model.state_dict().items(): assert torch.equal(value, before[name]) initialize_processing_network(model, inputs, "lsuv_pre") pre = model.conv1.weight.detach().clone() other, other_inputs = make_model() initialize_processing_network(other, other_inputs, "lsuv_post") assert not torch.allclose(pre, other.conv1.weight) def test_failure_rolls_back_weights_and_removes_hooks(monkeypatch): import mhcflurry.processing_initialization as module model, inputs = make_model() before = {name: value.clone() for name, value in model.state_dict().items()} monkeypatch.setattr(module, "processing_activation_variance", lambda *a, **k: 0.0) with pytest.raises(ValueError, match="Degenerate"): initialize_processing_network(model, inputs, "lsuv_pre") assert model.training for name, value in model.state_dict().items(): assert torch.equal(value, before[name]) def fail(*args): raise RuntimeError("forward failed") monkeypatch.setattr(model, "forward", fail) with pytest.raises(RuntimeError, match="forward failed"): processing_activation_variance(model, model.conv1, inputs) assert not model.conv1._forward_hooks def test_fit_calibration_excludes_validation_rows_and_survives_save(tmp_path): from mhcflurry import Class1ProcessingPredictor model = Class1ProcessingNeuralNetwork( initialization_method="lsuv_pre", initialization_batch_size=3, convolutional_filters=8, convolutional_kernel_size=3, convolutional_activation="relu", n_flank_length=2, c_flank_length=2, max_epochs=1, minibatch_size=2, save_all_checkpoints=True, restore_best_weights=True) inputs = FlankingEncoding(["SIINFEKL", "GILGFVFTL", "NLVPMVATV", "AAAAAAAA"] * 2, ["AR"] * 8, ["DC"] * 8) mask = numpy.array([True, False, True, False, True, False, True, False]) model.fit(inputs, [1, 0] * 4, validation_mask=mask, seed=42, verbose=-1, progress_print_interval=None) info = model.fit_info[-1]["initialization"] assert info["applied"] and info["method"] == "lsuv_pre" assert len(info["calibration_fit_input_rows"]) == 3 assert not mask[info["calibration_fit_input_rows"]].any() predictor = Class1ProcessingPredictor([model]) predictor.save(str(tmp_path)) loaded = Class1ProcessingPredictor.load(str(tmp_path)) assert loaded.models[0].fit_info[-1]["initialization"] == info numpy.testing.assert_allclose(model.predict_encoded(inputs), loaded.models[0].predict_encoded(inputs)) def test_fit_does_not_reinitialize_a_network_built_before_fit(): model = Class1ProcessingNeuralNetwork( initialization_method="lsuv_pre", initialization_batch_size=3, convolutional_filters=8, convolutional_kernel_size=3, convolutional_activation="relu", n_flank_length=2, c_flank_length=2, max_epochs=1, minibatch_size=2) model._network = model.make_network( **model.network_hyperparameter_defaults.subselect(model.hyperparameters)) inputs = FlankingEncoding(["SIINFEKL", "GILGFVFTL", "NLVPMVATV", "AAAAAAAA"] * 2, ["AR"] * 8, ["DC"] * 8) mask = numpy.array([True, False, True, False, True, False, True, False]) model.fit(inputs, [1, 0] * 4, validation_mask=mask, seed=42, verbose=-1, progress_print_interval=None) assert model.fit_info[-1]["initialization"] == { "method": "lsuv_pre", "applied": False, "reason": "existing_network"} mhcflurry-2.3.6/test/test_processing_kernel_sweep.py000066400000000000000000000170651525677230600230720ustar00rootroot00000000000000"""Fail-closed orchestration and metric tests for the paired width experiment.""" import importlib.util import json from pathlib import Path import pandas import pytest from .test_processing_matching import training_frame @pytest.fixture def sweep_module(monkeypatch): directory = Path(__file__).resolve().parents[1] / "scripts/training" monkeypatch.syspath_prepend(str(directory)) spec = importlib.util.spec_from_file_location("kernel_sweep", directory / "run_processing_kernel_sweep.py") module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module def test_kernel_sweep_preparation_is_matched_and_immutable(tmp_path, sweep_module): table = tmp_path / "train.csv" training_frame().assign(matching_affinity_reference_sha256="a" * 64).to_csv(table, index=False) holdout = tmp_path / "holdout" holdout.mkdir() pandas.DataFrame({"sample_id": ["held-out"]}).to_csv(holdout / "processing_samples.csv", index=False) args = ["--out", str(tmp_path / "experiment"), "--train-data", str(table), "--public-root", str(tmp_path), "--release-holdout-dir", str(holdout), "--source-commit", "source", "--prepare-only"] assert sweep_module.main(args) == 0 assert sweep_module.main(args) == 0 config = json.loads((tmp_path / "experiment/experiment.json").read_text()) assert config["networks"] == 48 assert len(config["records"]) == 12 with pytest.raises(ValueError, match="change inputs"): sweep_module.main(args + ["--random-seed", "99"]) training_frame().drop(columns="processing_matching_policy").to_csv(table, index=False) with pytest.raises(ValueError, match="requires matched"): sweep_module.main(args) def test_kernel_sweep_validation_metrics_keep_folds_and_samples(tmp_path, sweep_module): path = tmp_path / "predictions.csv.bz2" pandas.DataFrame({"sample_id": ["a"] * 4, "fold_num": [0, 0, 1, 1], "hit": [1, 0, 1, 0], "processing_score": [0.9, 0.1, 0.1, 0.9]}).to_csv(path, index=False) result = sweep_module.validation_metrics(path, "test") assert result.fold_num.tolist() == [0, 1] assert result.roc_auc.tolist() == [1.0, 0.0] assert result.pr_auc.tolist() == [1.0, 0.5] def test_kernel_sweep_renderer_and_member_evaluation(tmp_path, sweep_module): """Preserve member identities and exercise both plot panels on toy data.""" from mhcflurry import Class1ProcessingNeuralNetwork, Class1ProcessingPredictor from .test_processing_affinity_control import _cohort from mhcflurry.processing_matching import make_affinity_controlled_risk_sets matched, _ = make_affinity_controlled_risk_sets(_cohort(), decoys_per_hit=1) matched["peptide"] = matched.peptide.str.replace("B", "R") model = Class1ProcessingNeuralNetwork(convolutional_filters=4, convolutional_kernel_size=5, convolutional_padding_mode="unknown", dropout_rate=0) model._network = model.make_network( **model.network_hyperparameter_defaults.subselect(model.hyperparameters)) models = tmp_path / "models" Class1ProcessingPredictor([model, model]).save(str(models)) evaluation = tmp_path / "evaluation" evaluation.mkdir() matched.to_csv(evaluation / "matching_assignments.csv.bz2", index=False) records = sweep_module.build_kernel_conditions()[:2] for name in ["public_2_1_x"] + [r[0] for r in records]: sweep_module.evaluate_predictor(tmp_path, name, models, matched) scores = pandas.read_csv(evaluation / (name + ".predictions.csv.bz2")) assert {"member_00", "member_01", "source_row", name} <= set(scores) assert (scores.member_00 == scores.member_01).all() if name != "public_2_1_x": directory = tmp_path / name directory.mkdir() pandas.DataFrame({"condition": [name], "sample_id": ["toy"], "fold_num": [0], "roc_auc": [0.5], "pr_auc": [0.5], "ppv_at_n": [0.5]}).to_csv( directory / "validation_metrics.csv", index=False) sweep_module.render_summary(tmp_path, records) assert (evaluation / "kernel_width.pdf").stat().st_size > 1000 assert (tmp_path / "validation_kernel_width.pdf").stat().st_size > 1000 def test_kernel_sweep_tiny_end_to_end_and_resume(tmp_path, sweep_module, monkeypatch): """Exercise real command initialization, fold reuse, fits, selection and plots.""" conditions = sweep_module.build_kernel_conditions()[:2] for _, grid, _ in conditions: grid[0].update(convolutional_filters=4, post_convolutional_dense_layer_sizes=[], max_epochs=1, cleavage_boundary_hidden_size=4) monkeypatch.setattr(sweep_module, "build_kernel_conditions", lambda: conditions) table = tmp_path / "train.csv" frames = [] for sample in range(20): frame = training_frame().assign( matching_affinity_reference_sha256="a" * 64, sample_id="sample_%d" % sample) # Default pandas parsing loses one ULP on the second CSV round trip. # Additional metadata must remain identical too, not only model inputs. frame["audit_float"] = 182.06260894694452 frame["peptide"] = frame.peptide.str.replace("B", "R") frames.append(frame) pandas.concat(frames, ignore_index=True).to_csv(table, index=False) holdout = tmp_path / "holdout" holdout.mkdir() pandas.DataFrame({"sample_id": ["held-out"]}).to_csv(holdout / "processing_samples.csv", index=False) out = tmp_path / "experiment" args = ["--out", str(out), "--train-data", str(table), "--public-root", str(tmp_path), "--release-holdout-dir", str(holdout), "--source-commit", "test", "--gpus", "0", "--num-jobs", "0", "--evaluation", "none", "--save-all-checkpoints"] assert sweep_module.main(args) == 0 assert (out / "completed.json").exists() assert len(pandas.read_csv(out / "validation_summary.csv")) == 2 assert (out / "validation_kernel_width.pdf").stat().st_size > 1000 assert sweep_module.main(args) == 0 for name, _, _ in conditions: manifest = pandas.read_csv(out / name / "processing/models.selected.short_flanks/manifest.csv") assert len(manifest) == 4 predictions = pandas.read_csv(out / "checkpoint_predictions" / (name + ".validation_predictions.csv.bz2")) assert set(predictions.checkpoint_policy) == {"best", "terminal"} assert predictions.model_name.nunique() == 4 assert set(predictions.fold_num) == {0, 1, 2, 3} assert {"sample_id", "peptide", "n_flank", "c_flank", "validation_row_index"} <= set(predictions) # Recovery imports only complete fits without invoking any training command. recovery = tmp_path / "recovery" recovery_args = list(args) recovery_args[recovery_args.index("--out") + 1] = str(recovery) recovery_args += ["--resume-from", str(out), "--save-all-checkpoints"] def unexpected_command(*args, **kwargs): raise AssertionError("Recovery of complete conditions must not retrain") monkeypatch.setattr(sweep_module.Driver, "run", unexpected_command) assert sweep_module.main(recovery_args) == 0 assert sweep_module.main(recovery_args) == 0 record = json.loads((recovery / "recovery.json").read_text()) assert set(record["completed_conditions"]) == {r[0] for r in conditions} # A changed artifact cannot silently be accepted on resume. altered = recovery / conditions[0][0] / "validation_metrics.csv" altered.write_text(altered.read_text() + "\n") with pytest.raises(ValueError, match="Recovered artifact changed"): sweep_module.main(recovery_args) mhcflurry-2.3.6/test/test_processing_matching.py000066400000000000000000000175441525677230600222030ustar00rootroot00000000000000"""Shared processing training/evaluation matching contract.""" import json from types import SimpleNamespace import numpy import pandas import pytest from mhcflurry.processing_matching import ( make_affinity_controlled_risk_sets, matched_training_data, validate_matched_training_data, sample_validation_mask) from .test_processing_affinity_control import _cohort def training_frame(): frame = _cohort().rename(columns={"mhcflurry_production_affinity": "affinity_prediction"}) return matched_training_data(frame, {"sha256": "0" * 64})[0] def test_training_and_evaluation_share_assignments(): frame = training_frame() expected, _ = make_affinity_controlled_risk_sets(_cohort(), decoys_per_hit=1) assert frame.source_row.tolist() == expected.source_row.tolist() validate_matched_training_data(frame) assert frame.hit.sum() == 2 assert len(frame) == 4 @pytest.mark.parametrize("problem", ["length", "affinity", "ratio", "metadata", "fold"]) def test_matched_training_rejects_corrupted_or_unmatched_data(problem): frame = training_frame() if problem == "length": frame.loc[1, "peptide"] += "A" elif problem == "affinity": frame.loc[1, "affinity_prediction"] = 50000 elif problem == "ratio": frame = frame.iloc[1:] elif problem == "metadata": frame = frame.drop(columns="processing_matching_policy") else: frame["fold_0"] = [True, False, True, False] with pytest.raises(ValueError): validate_matched_training_data(frame) def test_unmatched_data_requires_explicit_legacy_policy(): with pytest.raises(ValueError, match="requires matched"): validate_matched_training_data(_cohort()) validate_matched_training_data(_cohort(), policy="legacy") def test_global_fallback_cannot_violate_affinity_or_length_caliper(): frame = _cohort() frame.loc[1:2, "log10_affinity"] = 4 with pytest.raises(ValueError, match="no unmatched fallback"): make_affinity_controlled_risk_sets(frame, decoys_per_hit=1) frame = _cohort() frame.loc[1:2, "peptide"] += "A" frame.loc[1:2, "peptide_len"] = 9 with pytest.raises(ValueError, match="no unmatched fallback"): make_affinity_controlled_risk_sets(frame, decoys_per_hit=1) def test_same_sequence_cannot_supply_multiple_decoys_in_one_risk_set(): frame = _cohort().iloc[:3].copy() frame.loc[2, "peptide"] = frame.loc[1, "peptide"] with pytest.raises(ValueError, match="no unmatched fallback"): make_affinity_controlled_risk_sets(frame, decoys_per_hit=2) def test_validation_groups_keep_reused_rows_and_samples_together(): frame = pandas.concat([training_frame().assign(sample_id=str(i)) for i in range(5)], ignore_index=True) mask = sample_validation_mask(frame, 0.2, seed=42) assert mask.sum() == 4 assert frame.loc[mask].sample_id.nunique() == 1 assert not set(frame.loc[mask].sample_id) & set(frame.loc[~mask].sample_id) numpy.testing.assert_array_equal(mask, sample_validation_mask(frame, 0.2, seed=42)) def test_validation_requires_two_samples_unless_disabled(): with pytest.raises(ValueError, match="at least two"): sample_validation_mask(training_frame(), 0.1, 42) assert not sample_validation_mask(training_frame(), 0, 42).any() def test_validate_cached_training_command(tmp_path): from mhcflurry.cli.train_command import run_argv path = tmp_path / "training.csv.bz2" frame = training_frame().assign(matching_affinity_reference_sha256="a" * 64) frame.to_csv(path, index=False) assert run_argv(["validate-processing-data", "--data", str(path)]) == 0 frame.loc[1, "affinity_prediction"] = 50000 frame.to_csv(path, index=False) with pytest.raises(ValueError, match="caliper"): run_argv(["validate-processing-data", "--data", str(path)]) def test_default_processing_comparison_scores_only_matched_risk_sets(tmp_path, monkeypatch): from mhcflurry.cli import compare_models as command from mhcflurry.cli.processing_affinity_control import AFFINITY_COLUMN frame = pandas.DataFrame({ "peptide": ["A" * 8, "Y" * 9] + [c + "A" * 7 for c in "CDEFGHIKLM"] + [c + "Y" * 8 for c in "CDEFGHIKLM"] + ["F" * 10, "W" * 8], "hit": [1, 1] + [0] * 22, AFFINITY_COLUMN: [10, 100] + [11] * 10 + [101] * 10 + [10, 50000], "sample_id": "sample", "hla": "HLA-A*02:01", "n_flank": "N" * 5, "c_flank": "C" * 5, "protein_accession": "p1"}) frame["peptide_len"] = frame.peptide.str.len() frame.to_csv(tmp_path / "benchmark.multiallelic.production.train_excluded.sample.0.csv.bz2", index=False) monkeypatch.setattr(command, "_processing_model_dirs", lambda *a: {"short_flanks": ("a", "b")}) monkeypatch.setattr(command, "_load_presentation_benchmark_for_component", lambda *a: frame) monkeypatch.setattr(command, "_parallelism_args_for_component", lambda *a: None) monkeypatch.setattr(command, "model_artifact_size_bytes", lambda *a: 1) monkeypatch.setattr(command, "_parallel_processing_predict", lambda *a, **k: numpy.arange(len(frame)) / len(frame)) args = command.make_parser().parse_args([ "--a", "a", "--out", str(tmp_path / "out"), "--data-dir", str(tmp_path), "--processing-modes", "short_flanks"]) result = command._run_processing({"label": "a"}, {"label": "b"}, args) assert result["negative_policy"] == "matched" out = tmp_path / "out" / "processing" matched = pandas.read_csv(out / "predictions_short_flanks.csv.bz2") assert len(matched) == 22 assert matched.groupby("risk_set_id").peptide_len.nunique().eq(1).all() assert matched.log10_affinity_distance.max() < .25 assert len(pandas.read_csv(out / "heldout_predictions_short_flanks.csv.bz2")) == len(frame) info = json.loads((out / "cohort.json").read_text()) assert info["processing_release_eligible"] is True assert len(info["affinity_sources"][0]["sha256"]) == 64 def fail_prediction(*a, **kw): raise RuntimeError("prediction failed") monkeypatch.setattr(command, "_parallel_processing_predict", fail_prediction) with pytest.raises(RuntimeError, match="prediction failed"): command._run_processing({"label": "a"}, {"label": "b"}, args) info = json.loads((out / "cohort.json").read_text()) assert info["policy"] == "incomplete" assert info["processing_release_eligible"] is False def test_unmatched_plot_guard_preserves_existing_figures(tmp_path): from mhcflurry.cli import plot_model_comparison as command (tmp_path / "processing").mkdir() (tmp_path / "processing" / "summary_table.csv").write_text("mode,a_macro_pr_auc\nshort_flanks,0.3\n") (tmp_path / "plots").mkdir() existing = tmp_path / "plots" / "keep.txt" existing.write_text("historical figure") args = command.make_parser().parse_args(["--input", str(tmp_path), "--components", "processing"]) with pytest.raises(ValueError, match="matched evaluation"): command.run(args) assert existing.read_text() == "historical figure" def test_paper_processing_plot_does_not_mix_presentation_cohort(tmp_path): from mhcflurry.cli.paper_figures import _plot_current_ap_vs_summary import matplotlib.pyplot as plt for name in ("processing", "presentation"): (tmp_path / name).mkdir() pandas.DataFrame([dict(mode="short_flanks", a_macro_roc_auc=.8, a_macro_pr_auc=.4, a_macro_ppv_at_n=.43)]).to_csv( tmp_path / name / "summary_table.csv", index=False) inputs = SimpleNamespace(comparison_dir=str(tmp_path)) figures = [] writer = SimpleNamespace(save=lambda fig, *a, **kw: figures.append(fig)) assert _plot_current_ap_vs_summary(inputs, writer) is False (tmp_path / "processing" / "cohort.json").write_text(json.dumps({"policy": "matched"})) assert _plot_current_ap_vs_summary(inputs, writer) is True assert all(len(ax.patches) == 1 for ax in figures[0].axes) plt.close(figures[0]) mhcflurry-2.3.6/test/test_processing_matching_without_replacement.py000066400000000000000000000172111525677230600263340ustar00rootroot00000000000000"""Scientific matching invariants and an independent feasibility oracle.""" import json from pathlib import Path import numpy as np import pandas as pd import pytest from scipy.sparse import csr_matrix from scipy.sparse.csgraph import maximum_bipartite_matching from mhcflurry.processing_matching import ( IncompleteProcessingMatches, _random_unique_assignments, make_affinity_controlled_risk_sets, matched_training_data, validate_matched_training_data) def test_dense_repair_preserves_released_assignments_and_rng_state(): # Frozen outputs from 2c0736d61, including 28 augmenting-path repairs. # A faster traversal must not change any seeded scientific assignment. fixture = json.loads((Path(__file__).parent / "data" / "processing_matching_seeded_replay.json").read_text()) for case in fixture["cases"]: rng = np.random.default_rng(case["seed"]) result = _random_unique_assignments( np.array(case["targets"]), np.array(case["proteins"], dtype=object), np.array(case["values"]), np.array(case["negative_proteins"], dtype=object), case["count"], case["caliper"], case["protein_caliper"], rng) np.testing.assert_array_equal(result, case["expected"]) np.testing.assert_array_equal(rng.integers(0, 2**32, size=8), case["next_random"]) def pool(hits, negatives, proteins=None): values = np.r_[hits, negatives].astype(float) return pd.DataFrame(dict( sample_id="sample", peptide=[format(i, "08d") for i in range(len(values))], peptide_len=8, hit=[1] * len(hits) + [0] * len(negatives), protein_accession="p" if proteins is None else proteins, log10_affinity=values, affinity_prediction=10 ** values)) def test_competing_hits_never_reuse_a_negative(): frame = pool([1, 1, 1], [1, 1.1, 1.2]) for seed in range(10): result, diagnostics = make_affinity_controlled_risk_sets(frame, 1, random_seed=seed) assert result.loc[result.hit.eq(0), "peptide"].nunique() == 3 assert diagnostics["replacement"] is False assert diagnostics["max_negative_reuse"] == 1 def test_random_draws_are_seeded_and_not_always_nearest(): frame = pool([1], [1, 1.1, 1.2]) choices = [] for seed in range(60): first, _ = make_affinity_controlled_risk_sets(frame, 1, random_seed=seed) repeat, _ = make_affinity_controlled_risk_sets(frame, 1, random_seed=seed) pd.testing.assert_frame_equal(first, repeat) choices.append(first.loc[first.hit.eq(0), "source_row"].item()) assert set(choices) == {1, 2, 3} def test_augmenting_paths_repair_random_greedy_traps(): # First hit can use either negative; second can use only the shared one. # Giving that negative to the first hit must be repaired, not reused. frame = pool([1, 1.3], [1.1, .8]) for seed in range(30): result, _ = make_affinity_controlled_risk_sets(frame, 1, random_seed=seed) assert result.source_row.tolist() == [0, 3, 1, 2] def test_duplicate_protein_mappings_do_not_create_extra_negatives(): frame = pool([1, 1], [1, 1], proteins=["p", "q", "p", "q"]) frame.loc[3, "peptide"] = frame.loc[2, "peptide"] with pytest.raises(IncompleteProcessingMatches, match="without replacement"): make_affinity_controlled_risk_sets(frame, 1) def test_samples_are_independent_and_can_share_negative_sequences(): frame = pool([1, 1], [1, 1.1, .9]) combined = pd.concat([frame.assign(sample_id="a"), frame.assign(sample_id="b")], ignore_index=True) together, _ = make_affinity_controlled_risk_sets(combined, 1, random_seed=13) parts = [] for sample, group in combined.groupby("sample_id"): result, _ = make_affinity_controlled_risk_sets(group.reset_index(drop=True), 1, random_seed=13) parts.append(result.drop(columns="source_row")) expected = pd.concat(parts, ignore_index=True) # risk IDs are local numbering; peptide assignments are sample-stable. pd.testing.assert_frame_equal(together.drop(columns=["source_row", "risk_set_id"]), expected.drop(columns="risk_set_id")) assert not together[together.hit.eq(0)].duplicated(["sample_id", "peptide"]).any() @pytest.mark.parametrize("seed", range(40)) @pytest.mark.parametrize("count", [1, 2, 3]) def test_feasibility_agrees_with_independent_maximum_matching(seed, count): rng = np.random.default_rng(seed) hits = rng.integers(0, 9, size=8) / 8 negatives = rng.integers(0, 9, size=20) / 8 frame = pool(hits, negatives, proteins=rng.choice(["p", "q"], len(hits) + len(negatives))) # Separate oracle: explicitly construct the small bipartite graph. edges = np.abs(np.repeat(hits, count)[:, None] - negatives[None, :]) <= .25 oracle = maximum_bipartite_matching(csr_matrix(edges), perm_type="column") if np.any(oracle < 0): with pytest.raises(IncompleteProcessingMatches): make_affinity_controlled_risk_sets(frame, count, random_seed=seed) else: result, _ = make_affinity_controlled_risk_sets(frame, count, random_seed=seed) assert result.hit.sum() == len(hits) assert result.loc[result.hit.eq(0), "peptide"].nunique() == len(hits) * count assert result.log10_affinity_distance.max() <= .25 @pytest.mark.parametrize("missing", [None, np.nan, pd.NA]) @pytest.mark.parametrize("dtype", [object, "str", "string"]) def test_missing_protein_is_not_a_preferred_shared_protein(missing, dtype): frame = pool([1], [1, 1.1]) frame["protein_accession"] = pd.Series([missing, missing, "p"], dtype=dtype) result, _ = make_affinity_controlled_risk_sets(frame, 1) assert not result.loc[result.hit.eq(0), "same_protein_match"].any() def test_saved_assignments_reject_reuse_across_pairs(): frame = pool([1, 1], [1, 1.1]) result, _ = matched_training_data(frame, {"sha256": "0" * 64}) result.loc[3, "peptide"] = result.loc[1, "peptide"] with pytest.raises(ValueError, match="repeats a negative"): validate_matched_training_data(result) def test_old_nearest_matching_policy_is_not_silently_relabelled(): result, _ = matched_training_data(pool([1], [1]), {"sha256": "0" * 64}) result["processing_matching_policy"] = "sample-length-affinity-v1" with pytest.raises(ValueError, match="matching metadata"): validate_matched_training_data(result) def test_saved_seed_must_be_an_integer(): result, _ = matched_training_data(pool([1], [1]), {"sha256": "0" * 64}) result["matching_random_seed"] = "unrecorded" with pytest.raises(ValueError, match="random seed"): validate_matched_training_data(result) def test_inclusive_caliper_boundary_and_no_match_outside(): result, _ = make_affinity_controlled_risk_sets(pool([1], [.75]), 1) assert result.log10_affinity_distance.max() == .25 with pytest.raises(IncompleteProcessingMatches): make_affinity_controlled_risk_sets(pool([1], [np.nextafter(.75, -np.inf)]), 1) @pytest.mark.parametrize("seed", range(20)) def test_feasibility_near_float_boundaries(seed): rng = np.random.default_rng(seed) hits = rng.uniform(.1, 3, 8) negatives = np.r_[hits - .25, hits + .25, np.nextafter(hits - .25, -np.inf), np.nextafter(hits + .25, np.inf)] edges = np.abs(hits[:, None] - negatives[None, :]) <= .25 oracle = maximum_bipartite_matching(csr_matrix(edges), perm_type="column") if np.any(oracle < 0): with pytest.raises(IncompleteProcessingMatches): make_affinity_controlled_risk_sets(pool(hits, negatives), 1, random_seed=seed) else: result, _ = make_affinity_controlled_risk_sets(pool(hits, negatives), 1, random_seed=seed) assert result.log10_affinity_distance.max() <= .25 mhcflurry-2.3.6/test/test_processing_prep_scripts.py000066400000000000000000000566221525677230600231260ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import importlib.util import os import subprocess import sys from pathlib import Path import pandas import pytest from mhcflurry.proteome_decoys import ( infer_flanking_length, iter_protein_peptide_records, load_reference_sequences, make_peptide_frame_for_accessions, sample_peptide_frame_for_accessions, ) REPO_ROOT = Path(__file__).resolve().parents[1] def load_script(path): spec = importlib.util.spec_from_file_location(path.stem, path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module def test_preparation_benchmark_alternates_comparison_order(): module = load_script(REPO_ROOT / "scripts/training/benchmark_processing_preparation.py") calls = [] def first(): calls.append("first") return "a" def second(): calls.append("second") return "b" results, timings, orders = module.timed_pair(first, second, 2) assert results == ["a", "b"] assert calls == ["first", "second", "second", "first"] assert orders == [[0, 1], [1, 0]] for measured in timings: assert len(measured["seconds"]) == len(measured["cpu_seconds"]) == 2 def test_preparation_benchmark_saves_parity_timings_and_refuses_overwrite(tmp_path): import json from mhcflurry.cli import main as cli_main path = tmp_path / "nested" / "benchmark.json" arguments = ["train", "benchmark-processing-preparation", "--out", str(path), "--proteins", "2", "--protein-length", "30", "--draws", "10", "--repeats", "1"] assert cli_main.main(arguments) == 0 result = json.loads(path.read_text()) assert result["sampler"]["exact_export_parity"] is True assert len(result["sampler"]["export_strings_seconds"]["seconds"]) == 1 assert all(len(digest) == 64 for digest in result["source_hashes"].values()) assert any(key.endswith("numeric_sequences.py") for key in result["source_hashes"]) before = path.read_bytes() assert cli_main.main(arguments) != 0 assert path.read_bytes() == before @pytest.mark.parametrize("relative_path", [ "scripts/training/release_exact/make_train_data.processing.py", "downloads-generation/models_class1_processing/make_train_data.py", ]) def test_processing_generation_matches_and_preserves_scored_pool(relative_path, tmp_path, monkeypatch): import numpy import mhcflurry from mhcflurry.processing_matching import validate_matched_training_data module = load_script(REPO_ROOT / relative_path) args = module.parser.parse_args([ "--hits", "unused", "--affinity-predictor", "frozen-public", "--proteome-peptides", "unused", "--ppv-multiplier", "3", "--out", str(tmp_path / "training.csv")]) assert args.negative_policy == "matched" args.matching_reference = {"sha256": "a" * 64} directory = tmp_path / "training.csv.matching" directory.mkdir() hits = pandas.DataFrame({"peptide": ["SIINFEKL", "SIINFEKA"], "sample_id": "s", "allele": "HLA-A*02:01", "hit_id": [1, 2], "protein_accession": "p1", "n_flank": "AAAAA", "c_flank": "CCCCC"}) pool = pandas.DataFrame({"peptide": [c + "IINFEKL" for c in "CDEFGH"], "protein_accession": "p1", "n_flank": "AAAAA", "c_flank": "CCCCC"}) class Predictor: supported_alleles = ["HLA-A*02:01"] def canonicalize_allele_name(self, allele): return allele def predict(self, peptides, allele): assert allele == "HLA-A*02:01" return numpy.repeat(100.0, len(peptides)) monkeypatch.setattr(mhcflurry.Class1AffinityPredictor, "load", lambda path: Predictor()) result = module.do_process_samples(["s"], seed=42, constant_data={ "args": args, "lengths": [8], "all_peptides_by_length": {8: pool}, "sample_table": hits.drop_duplicates("sample_id").set_index("sample_id"), "hit_df": hits}) validate_matched_training_data(result) assert result.hit.sum() == len(hits) assert len(result) == 4 assert len(pandas.read_csv(next(directory.glob("*.candidate_pool.csv.bz2")))) == 8 assert len(list(directory.glob("*.matching.json"))) == 1 def test_generate_scripts_keep_packaged_proteome_peptide_artifacts(): """Guard download-generation artifact contracts. These GENERATE.sh scripts package their working directory into download bundles. The compressed proteome peptide CSVs are part of those bundles and must not disappear just because newer training paths can avoid reading them. """ processing_generate = ( REPO_ROOT / "downloads-generation/models_class1_processing/GENERATE.sh" ).read_text() assert "write_proteome_peptides.py" in processing_generate assert "--out \"$(pwd)/proteome_peptides.csv\"" in processing_generate assert "bzip2 -f proteome_peptides.csv" in processing_generate assert "--proteome-peptides \"$(pwd)/proteome_peptides.csv.bz2\"" in ( processing_generate ) predictions_generate = ( REPO_ROOT / "downloads-generation/data_predictions/GENERATE.sh" ).read_text() assert "write_proteome_peptides.py" in predictions_generate assert "--out proteome_peptides.$subset.csv" in predictions_generate assert "bzip2 proteome_peptides.$subset.csv" in predictions_generate assert "proteome_peptides.$subset.csv.bz2" in predictions_generate def test_processing_preparation_keeps_predictor_in_worker_and_resumes_without_loading(tmp_path, monkeypatch): import numpy import mhcflurry module = load_script(REPO_ROOT / "scripts/training/release_exact/make_train_data.processing.py") args = module.parser.parse_args([ "--hits", "unused", "--affinity-predictor", "reference", "--proteome-peptides", "unused", "--ppv-multiplier", "3", "--out", str(tmp_path / "training.csv")]) args.matching_reference = {"sha256": "a" * 64} (tmp_path / "training.csv.matching").mkdir() hits = pandas.DataFrame({"peptide": ["SIINFEKL", "SIINFEKA"] * 2, "sample_id": ["s1", "s1", "s2", "s2"], "allele": "HLA-A*02:01", "hit_id": [1, 2, 3, 4], "protein_accession": "p1", "n_flank": "AAAAA", "c_flank": "CCCCC"}) pool = pandas.DataFrame({"peptide": [c + "IINFEKL" for c in "CDEFGH"], "protein_accession": "p1", "n_flank": "AAAAA", "c_flank": "CCCCC"}) loads = [] predictions = [] class Predictor: supported_alleles = ["HLA-A*02:01"] def canonicalize_allele_name(self, allele): return allele def predict(self, peptides, allele): predictions.append(list(peptides)) return numpy.repeat(100.0, len(peptides)) def load(path): loads.append(path) return Predictor() monkeypatch.setattr(mhcflurry.Class1AffinityPredictor, "load", load) context = {"args": args, "lengths": [8], "all_peptides_by_length": {8: pool}, "sample_table": hits.drop_duplicates("sample_id").set_index("sample_id"), "hit_df": hits} first = [module.do_process_samples([sample], seed=42, constant_data=context) for sample in ["s1", "s2"]] assert len(loads) == 1 assert len(predictions) == 2 del context["processing_affinity_predictor"] for index, sample in enumerate(["s1", "s2"]): second = module.do_process_samples([sample], seed=42, constant_data=context) pandas.testing.assert_frame_equal(first[index], second, check_dtype=False) assert len(loads) == 1 assert len(predictions) == 2 def test_numeric_pipeline_is_schedule_independent_and_resume_skips_scoring(tmp_path, monkeypatch): import threading from types import SimpleNamespace import mhcflurry from mhcflurry.common import derive_seed from mhcflurry.numeric_sequences import NumericSequences from mhcflurry.processing_matching import validate_matched_training_data module = load_script(REPO_ROOT / "scripts/training/release_exact/make_train_data.processing.py") caller = threading.get_ident() calls = [] class Predictor: supported_alleles = ["HLA-A*02:01"] class1_pan_allele_models = [SimpleNamespace(get_device=lambda: "cpu")] def canonicalize_allele_name(self, allele): return allele def predict_numeric(self, peptides, allele): assert threading.get_ident() == caller assert isinstance(peptides, NumericSequences) calls.append(len(peptides)) return 100 + peptides.indices[:, :2].numpy().sum(axis=1).astype(float) loads = [] def load(path): loads.append(path) return Predictor() monkeypatch.setattr(mhcflurry.Class1AffinityPredictor, "load", load) hits = pandas.DataFrame([dict(peptide=p, sample_id=s, hit_id=i * 2 + j, protein_accession="p", n_flank="XXXXX", c_flank="YYYYY") for i, s in enumerate(["s1", "s2", "s3", "s4"]) for j, p in enumerate(["ACDEFGHI", "CDEFGHIKL"])]) results = [] for depth in (1, 3): out = tmp_path / str(depth) out.mkdir() args = module.parser.parse_args([ "--hits", "unused", "--affinity-predictor", "reference", "--proteome-reference-csv", "unused", "--ppv-multiplier", "20", "--preparation-pipeline-depth", str(depth), "--out", str(out / "train.csv")]) args.matching_reference = {"sha256": "a" * 64} (out / "train.csv.matching").mkdir() context = dict(args=args, lengths=[8, 9, 10, 11], hit_df=hits, proteome_sequences={"p": "ACDEFGHIKLMNPQRSTVWY" * 10}, flanking_length=5, sample_table=hits.drop_duplicates("sample_id").set_index("sample_id").assign(allele="HLA-A*02:01"), sample_seeds={s: derive_seed(42, "sample", s) for s in hits.sample_id.unique()}) result = module.do_process_samples(hits.sample_id.unique(), constant_data=context) validate_matched_training_data(result) results.append(result) old_calls = list(calls) del context["processing_affinity_predictor"] resumed = module.do_process_samples(hits.sample_id.unique(), constant_data=context) pandas.testing.assert_frame_equal(result, resumed, check_dtype=False) assert calls == old_calls pandas.testing.assert_frame_equal(*results) assert len(loads) == 2 # One per worker context, no reload for any resumed sample. def test_model_selection_decoys_do_not_require_unused_proteome_peptides(): module = load_script( REPO_ROOT / "downloads-generation/analysis_predictor_info" / "generate_model_selection_with_decoys.py" ) args = module.parser.parse_args([ "model_selection.csv", "--protein-data", "proteins.csv", "--out", "with_decoys.csv", ]) assert args.data == "model_selection.csv" assert args.protein_data == "proteins.csv" assert args.out == "with_decoys.csv" assert not hasattr(args, "proteome_peptides") generate = ( REPO_ROOT / "downloads-generation/analysis_predictor_info/GENERATE.sh" ).read_text() assert "--proteome-peptides" not in generate @pytest.mark.parametrize("relative_path", [ "scripts/training/release_exact/make_train_data.processing.py", "downloads-generation/models_class1_processing/make_train_data.py", ]) def test_processing_train_data_canonicalizes_alleles_before_prediction( relative_path): module = load_script(REPO_ROOT / relative_path) assert module.canonicalize_processing_allele("HLA-A0201") == ( "HLA-A*02:01" ) assert module.canonicalize_processing_allele("B0702") == "HLA-B*07:02" assert module.canonicalize_processing_allele("HLA-C*03:04") == ( "HLA-C*03:04" ) assert module.canonicalize_processing_allele("HLA-B*44:01") == ( "HLA-B*44:01" ) assert module.canonicalize_processing_allele("H-2-Kb") is None assert module.canonicalize_processing_allele("NONSENSE") is None for ambiguous in ("A2", "HLA-A2", "A*02", "HLA-B15"): with pytest.raises(ValueError, match="sequence-resolved"): module.canonicalize_processing_allele(ambiguous) class FakePredictor: supported_alleles = ("HLA-A*02:01",) def __init__(self): self.seen = [] def canonicalize_allele_name(self, allele): self.seen.append(allele) return allele predictor = FakePredictor() canonical = module.canonicalize_processing_allele("HLA-A0201") assert module.predictor_allele_for_processing(predictor, canonical) == ( "HLA-A*02:01" ) assert predictor.seen == ["HLA-A*02:01"] with pytest.raises(ValueError, match="does not support"): module.predictor_allele_for_processing( predictor, "HLA-B*07:02" ) required = [ "--hits", "hits.csv", "--affinity-predictor", "models", "--proteome-peptides", "proteome.csv", "--out", "out.csv", ] for option in ("--hit-multiplier-to-take", "--ppv-multiplier"): with pytest.raises(SystemExit): module.parser.parse_args(required + [option, "0"]) def test_presentation_train_data_canonicalizes_genotype_tokens(): module = load_script( REPO_ROOT / "scripts/training/release_exact" / "make_train_data.presentation.py" ) assert module.split_hla_genotype("A*02:01 HLA-B0702 H-2-Kb") == ( "HLA-A*02:01", "HLA-B*07:02", "H2-K*b", ) for invalid in ("HLA-A2", "A*02", "NONSENSE", float("nan"), ""): with pytest.raises(ValueError): module.split_hla_genotype(invalid) with pytest.raises(SystemExit): module.parser.parse_args([ "--hits", "hits.csv", "--proteome-peptides", "proteome.csv", "--out", "out.csv", "--decoys-per-hit", "0", ]) for fraction in ("0", "1.1"): with pytest.raises(SystemExit): module.parser.parse_args([ "--hits", "hits.csv", "--proteome-peptides", "proteome.csv", "--out", "out.csv", "--sample-fraction", fraction, ]) def test_annotate_tpm_matches_rowwise_expression_sum(): module = load_script( REPO_ROOT / "downloads-generation/models_class1_processing" / "annotate_hits_with_expression.py" ) hit_df = pandas.DataFrame( { "protein_ensembl": ["gene1 gene2", "gene3", "missing gene2"], "expression_dataset": ["sample_a", "sample_b", "sample_a"], }, index=[10, 20, 30], ) expression_df = pandas.DataFrame( { "sample_a": [1.5, 2.0, 3.0], "sample_b": [10.0, 20.0, 30.0], }, index=["gene1", "gene2", "gene3"], ) result = module.annotate_tpm(hit_df, expression_df) pandas.testing.assert_series_equal( result, pandas.Series([3.5, 30.0, 2.0], index=[10, 20, 30]), ) def test_write_proteome_peptides_streams_expected_rows(tmp_path): input_csv = tmp_path / "annotated_ms.csv" reference_csv = tmp_path / "proteins.csv" out_csv = tmp_path / "proteome_peptides.csv" pandas.DataFrame( { "mhc_class": ["I", "I"], "protein_ensembl_primary": ["ENSG1", "ENSG2"], "n_flank": ["XX", "XX"], "protein_accession": ["P1", "P2"], } ).to_csv(input_csv, index=False) pandas.DataFrame( { "name": ["protein1", "protein2"], "accession": ["P1", "P2"], "seq": ["ACDEFGHIK", "ACDEFGHI"], } ).to_csv(reference_csv, index=False) subprocess.run( [ sys.executable, str( REPO_ROOT / "downloads-generation/models_class1_processing" / "write_proteome_peptides.py" ), str(input_csv), str(reference_csv), "--out", str(out_csv), "--lengths", "8", "9", ], check=True, ) result = pandas.read_csv(out_csv) assert result.to_dict("records") == [ { "protein_accession": "P1", "peptide": "ACDEFGHI", "n_flank": "XX", "c_flank": "KX", "start_position": 0, }, { "protein_accession": "P1", "peptide": "ACDEFGHIK", "n_flank": "XX", "c_flank": "XX", "start_position": 0, }, ] sequences = load_reference_sequences(reference_csv, ["P1", "P2"]) helper_result = make_peptide_frame_for_accessions( ["P1", "P2"], sequences, lengths=[8, 9], flanking_length=2, ) pandas.testing.assert_frame_equal(result, helper_result) def test_infer_flanking_length_rejects_mixed_lengths(): hit_df = pandas.DataFrame({ "n_flank": ["XX", "YYY"], "c_flank": ["XX", "YYY"], }) try: infer_flanking_length(hit_df) except ValueError as e: assert "Expected one flank length" in str(e) else: raise AssertionError("Expected mixed flank lengths to fail") def test_iter_protein_peptide_records_drops_cterminal_min_length_mer(): # Pins the DELIBERATE off-by-one parity with the historical # write_proteome_peptides.py: range(0, len(seq) - min_length) has an # exclusive upper bound, so the min_length-mer starting at # len(seq) - min_length (the C-terminal min_length-mer) is NOT emitted. # This test exists so that behavior can't drift silently. seq = "ACDEFGHIKL" # length 10 records = list(iter_protein_peptide_records( "P1", seq, lengths=[8], flanking_length=2)) starts = [start for (_, _, _, _, start) in records] peptides = [pep for (_, pep, _, _, _) in records] # Starts 0 and 1 only; start 2 (== len - min_length) is dropped. assert starts == [0, 1] assert peptides == ["ACDEFGHI", "CDEFGHIK"] assert "DEFGHIKL" not in peptides # the dropped C-terminal 8-mer def test_iter_protein_peptide_records_multi_length_counts(): # With multiple lengths the only systematically dropped peptide is the # C-terminal min_length-mer; longer k-mers are bounded by the # end_pos > len(sequence) break, not the start range. seq = "ACDEFGHIKLMNPQR" # length 15, min_length 8 -> starts 0..6 records = list(iter_protein_peptide_records( "P1", seq, lengths=[8, 9], flanking_length=3)) starts8 = [s for (_, pep, _, _, s) in records if len(pep) == 8] starts9 = [s for (_, pep, _, _, s) in records if len(pep) == 9] assert starts8 == list(range(0, 7)) assert starts9 == list(range(0, 7)) assert len(records) == 14 # The 8-mer at start 7 (== len - min_length) is the dropped one. assert "IKLMNPQR" not in [pep for (_, pep, _, _, _) in records] def test_sample_peptide_frame_for_accessions_excludes_peptides(): sampled = sample_peptide_frame_for_accessions( ["P1"], {"P1": "ACDEFGHIKLMNPQRSTVWY"}, lengths=[8], flanking_length=2, exclude_peptides={"ACDEFGHI"}, n=3, ) assert len(sampled) == 3 assert "ACDEFGHI" not in set(sampled.peptide) assert set(sampled.columns) == { "protein_accession", "peptide", "n_flank", "c_flank", "start_position", } def write_presentation_like_inputs(tmp_path): hits_csv = tmp_path / "hits.csv" reference_csv = tmp_path / "proteins.csv" pandas.DataFrame( { "hit_id": ["hit1"], "pmid": ["123"], "mhc_class": ["I"], "peptide": ["ACDEFGHI"], "protein_ensembl": ["ENSG1"], "hla": ["HLA-A*02:01 HLA-B*07:02"], "sample_id": ["sample1"], "format": ["MULTIALLELIC"], "protein_accession": ["P1"], "n_flank": ["XX"], "c_flank": ["XX"], } ).to_csv(hits_csv, index=False) pandas.DataFrame( { "name": ["protein1"], "accession": ["P1"], "seq": ["ACDEFGHIKLMNPQRSTVWY"], } ).to_csv(reference_csv, index=False) return hits_csv, reference_csv def run_reference_decoy_script(script_path, tmp_path, random_seed=None): tmp_path.mkdir(parents=True, exist_ok=True) hits_csv, reference_csv = write_presentation_like_inputs(tmp_path) out_csv = tmp_path / "train_data.csv" env = os.environ.copy() env["PYTHONPATH"] = os.pathsep.join( [str(REPO_ROOT)] + ([env["PYTHONPATH"]] if env.get("PYTHONPATH") else []) ) command = [ sys.executable, str(script_path), "--hits", str(hits_csv), "--proteome-reference-csv", str(reference_csv), "--decoys-per-hit", "4", "--only-format", "MULTIALLELIC", "--out", str(out_csv), ] if random_seed is not None: command.extend(["--random-seed", str(random_seed)]) subprocess.run( command, env=env, check=True, ) return pandas.read_csv(out_csv) def assert_reference_decoy_output(result): assert len(result) == 5 assert result.hit.value_counts().to_dict() == {0: 4, 1: 1} assert set(result.protein_accession) == {"P1"} assert set(result.hla) == {"HLA-A*02:01 HLA-B*07:02"} def test_release_presentation_train_data_uses_reference_csv_decoys(tmp_path): result = run_reference_decoy_script( REPO_ROOT / "scripts/training/release_exact" / "make_train_data.presentation.py", tmp_path, ) assert_reference_decoy_output(result) def test_release_presentation_decoys_are_reproducible_from_seed(tmp_path): script = ( REPO_ROOT / "scripts/training/release_exact" / "make_train_data.presentation.py" ) first = run_reference_decoy_script(script, tmp_path / "first", 271) second = run_reference_decoy_script(script, tmp_path / "second", 271) pandas.testing.assert_frame_equal(first, second) def test_download_presentation_train_data_uses_reference_csv_decoys(tmp_path): result = run_reference_decoy_script( REPO_ROOT / "downloads-generation/models_class1_presentation" / "make_train_data.py", tmp_path, ) assert_reference_decoy_output(result) def test_data_evaluation_benchmark_uses_reference_csv_decoys(tmp_path): result = run_reference_decoy_script( REPO_ROOT / "downloads-generation/data_evaluation" / "make_benchmark.py", tmp_path, ) assert_reference_decoy_output(result) def test_release_data_scripts_pin_historical_decoy_sampler(): import ast for name in ("make_train_data.processing.py", "make_train_data.presentation.py"): tree = ast.parse((REPO_ROOT / "scripts/training/release_exact" / name).read_text()) calls = [node for node in ast.walk(tree) if isinstance(node, ast.Call) and getattr(node.func, "id", None) == "sample_peptide_frame_for_accessions"] assert calls, name for call in calls: methods = [kw.value.value for kw in call.keywords if kw.arg == "sampling_method"] assert methods == ["reservoir"], name mhcflurry-2.3.6/test/test_processing_preparation.py000066400000000000000000000513271525677230600227320ustar00rootroot00000000000000"""Adaptive matching, cache integrity and numeric-position sampling contracts.""" import hashlib import json import pickle from types import SimpleNamespace import numpy import pandas import pytest from mhcflurry.processing_matching import ( IncompleteProcessingMatches, initialize_matching_artifacts, validate_preparation_provenance, validate_matched_training_data) from mhcflurry.processing_preparation import SamplePreparation, prepare_sample from mhcflurry.proteome_decoys import ( make_peptide_frame_for_accessions, sample_peptide_frame_for_accessions) def inputs(tmp_path, sample="s"): args = SimpleNamespace(out=str(tmp_path / "train.csv"), matching_reference={"sha256": "a" * 64}, decoys_per_hit=1, max_affinity_distance=.25, max_expansion_rounds=2, expansion_candidates_per_length=10, resume_matching_dir=None) (tmp_path / "train.csv.matching").mkdir(parents=True) hits = pandas.DataFrame({"sample_id": sample, "peptide": ["A" * 8, "C" * 9], "protein_accession": "p", "n_flank": "NN", "c_flank": "CC", "hit": 1}) pool = pandas.concat([hits, hits.assign(peptide=["D" * 8, "E" * 9], hit=0)], ignore_index=True) return args, hits, pool def no_call(*args, **kwargs): raise AssertionError("A cached sample must not be sampled or scored again") def score(peptides): return numpy.array([500.0 if p == "D" * 8 else 50.0 for p in peptides]) def additional(length, excluded, seed): assert length == 8 assert {"A" * 8, "D" * 8} <= excluded assert isinstance(seed, int) return pandas.DataFrame({"sample_id": ["s"], "peptide": ["F" * 8], "hit": [0], "protein_accession": ["p"], "n_flank": ["NN"], "c_flank": ["CC"]}) def test_expansion_only_scores_new_unresolved_length_and_resumes(tmp_path): args, hits, pool = inputs(tmp_path) calls = [] def predict(peptides): calls.append(list(peptides)) return score(peptides) first = prepare_sample(args, "s", hits, 42, lambda: pool.copy(), additional, predict) assert calls == [pool.peptide.tolist(), ["F" * 8]] validate_matched_training_data(first) assert set(first.loc[first.hit == 0, "peptide"]) == {"E" * 9, "F" * 8} second = prepare_sample(args, "s", hits, 42, no_call, no_call, no_call) pandas.testing.assert_frame_equal(first, second, check_dtype=False) rounds = sorted((tmp_path / "train.csv.matching").glob("*.round-*.json")) assert len(rounds) == 2 record = json.loads(rounds[1].read_text()) assert record["lengths"] == [8] assert record["rows"] == 1 assert "8" in record["seeds_by_length"] assert len(record["sha256"]) == 64 def test_expansion_supplies_distinct_negatives_for_competing_hits(tmp_path): args, _, _ = inputs(tmp_path) hits = pandas.DataFrame(dict(sample_id="s", peptide=["A" * 8, "C" * 8], protein_accession="p", n_flank="NN", c_flank="CC", hit=1)) pool = pandas.concat([hits, hits.iloc[:1].assign(peptide="D" * 8, hit=0)], ignore_index=True) draws = [] def expand(length, excluded, seed): draws.append(length) assert {"A" * 8, "C" * 8, "D" * 8} <= excluded return hits.iloc[:1].assign(peptide="E" * 8, hit=0) result = prepare_sample(args, "s", hits, 42, lambda: pool, expand, lambda peptides: numpy.full(len(peptides), 100.0)) assert draws == [8] assert set(result.loc[result.hit.eq(0), "peptide"]) == {"D" * 8, "E" * 8} cached = prepare_sample(args, "s", hits, 42, no_call, no_call, no_call) pandas.testing.assert_frame_equal(result, cached, check_dtype=False) @pytest.mark.parametrize("interrupt_expansion", [False, True]) def test_numeric_expansion_filters_committed_peptides_and_resumes(tmp_path, interrupt_expansion): from mhcflurry.numeric_proteome import ProcessingProteome, ProteinWindows, NumericCandidatePool args, hits, _ = inputs(tmp_path) index = ProcessingProteome({"p": "D" * 9 + "E" * 10 + "F" * 9}) initial = NumericCandidatePool(hits, ProteinWindows(index, [0, 0], [0, 9], [8, 9]), "s", 2) calls = [] def expand(length, excluded, seed): assert length == 8 assert {"A" * 8, "D" * 8} <= excluded # Even a sampler returning a previously committed peptide must not # cause repeat inference; the workflow enforces numeric exclusions. return NumericCandidatePool(hits.iloc[:0], ProteinWindows(index, [0, 0], [0, 19], [8, 8]), "s", 2) def predict(request): assert isinstance(request, NumericCandidatePool) peptides = request.prediction_input("cpu").to_strings().tolist() calls.append(peptides) if interrupt_expansion and len(calls) == 2: raise RuntimeError("interrupt expansion scoring") return score(peptides) if interrupt_expansion: with pytest.raises(RuntimeError, match="interrupt expansion"): prepare_sample(args, "s", hits, 42, lambda: initial, expand, predict) assert not list((tmp_path / "train.csv.matching").glob("*.complete.json")) result = prepare_sample(args, "s", hits, 42, no_call, expand, predict) assert calls == [["A" * 8, "C" * 9, "D" * 8, "E" * 9], ["F" * 8], ["F" * 8]] else: result = prepare_sample(args, "s", hits, 42, lambda: initial, expand, predict) assert calls == [["A" * 8, "C" * 9, "D" * 8, "E" * 9], ["F" * 8]] validate_matched_training_data(result) assert set(result.loc[result.hit == 0, "peptide"]) == {"E" * 9, "F" * 8} cached = prepare_sample(args, "s", hits, 42, no_call, no_call, no_call) pandas.testing.assert_frame_equal(result, cached, check_dtype=False) def test_expansion_failure_is_pickleable_and_bounded(tmp_path): args, hits, pool = inputs(tmp_path) args.max_expansion_rounds = 1 def bad_additional(*a): return additional(*a).assign(peptide="G" * 8) with pytest.raises(IncompleteProcessingMatches, match="budget exhausted") as failure: prepare_sample(args, "s", hits, 42, lambda: pool.copy(), bad_additional, lambda peptides: [50 if p[0] in "ACE" else 500 for p in peptides]) cloned = pickle.loads(pickle.dumps(failure.value)) assert cloned.failures == failure.value.failures assert cloned.failures[0]["peptide_length"] == 8 assert not list((tmp_path / "train.csv.matching").glob("*.complete.json")) def test_interrupted_after_scoring_reuses_committed_round(tmp_path, monkeypatch): args, hits, pool = inputs(tmp_path) original = SamplePreparation.finish def interrupt(*a): raise RuntimeError("interrupted after scored rounds") monkeypatch.setattr(SamplePreparation, "finish", interrupt) with pytest.raises(RuntimeError, match="interrupted"): prepare_sample(args, "s", hits, 42, lambda: pool.copy(), additional, score) monkeypatch.setattr(SamplePreparation, "finish", original) result = prepare_sample(args, "s", hits, 42, no_call, no_call, no_call) validate_matched_training_data(result) def test_pipeline_error_drains_inflight_checkpoint_and_resume_reuses_it(tmp_path, monkeypatch): import threading from mhcflurry.processing_preparation import sample_preparation_steps, ScoredValues from mhcflurry.scoring_pipeline import scoring_pipeline args, hits, pool = inputs(tmp_path, "first") writing = threading.Event() release_write = threading.Event() original = SamplePreparation.save_round def save(self, frame, record, source=None): if self.sample == "first": writing.set() assert release_write.wait(3) return original(self, frame, record, source) monkeypatch.setattr(SamplePreparation, "save_round", save) def second_pool(): assert writing.wait(3) return pool.assign(sample_id="second") first = sample_preparation_steps(args, "first", hits, 42, lambda: pool.copy(), no_call) second = sample_preparation_steps(args, "second", hits.assign(sample_id="second"), 43, second_pool, no_call) def predict(key, peptides): if key == "second": release_write.set() raise RuntimeError("scoring interrupted") return ScoredValues(numpy.repeat(50.0, len(peptides)), .01) with pytest.raises(RuntimeError, match="scoring interrupted"): list(scoring_pipeline([("first", first), ("second", second)], predict, 2, 2)) assert len(list((tmp_path / "train.csv.matching").glob("*.complete.json"))) == 1 result = prepare_sample(args, "first", hits, 42, no_call, no_call, no_call) validate_matched_training_data(result) @pytest.mark.parametrize("corrupt", ["pool", "result", "hits"]) def test_resume_rejects_changed_saved_data(tmp_path, corrupt): args, hits, pool = inputs(tmp_path) prepare_sample(args, "s", hits, 42, lambda: pool.copy(), additional, score) directory = tmp_path / "train.csv.matching" if corrupt == "pool": next(directory.glob("*.round-00.csv.bz2")).write_bytes(b"corrupt") elif corrupt == "result": next(directory.glob("*.matched.csv.bz2")).write_bytes(b"corrupt") else: hits.loc[0, "n_flank"] = "YY" with pytest.raises(ValueError, match="Corrupt|different observed"): prepare_sample(args, "s", hits, 42, no_call, no_call, no_call) def test_import_legacy_pool_avoids_scoring_and_preserves_source(tmp_path): args, hits, pool = inputs(tmp_path / "new") prior = tmp_path / "old" prior.mkdir() args.resume_matching_dir = str(prior) name = hashlib.sha256(b"s").hexdigest()[:24] source = prior / (name + ".candidate_pool.csv.bz2") pool.assign(affinity_prediction=50).to_csv(source, index=False) before = source.read_bytes() result = prepare_sample(args, "s", hits, 42, no_call, no_call, no_call) validate_matched_training_data(result) assert source.read_bytes() == before record = json.loads(next((tmp_path / "new/train.csv.matching").glob("*.round-00.json")).read_text()) assert record["origin_sha256"] == hashlib.sha256(before).hexdigest() assert record["origin_had_round_checksums"] is False def test_import_expanded_pool_keeps_all_scored_rounds(tmp_path): old, hits, pool = inputs(tmp_path / "old") first = prepare_sample(old, "s", hits, 42, lambda: pool.copy(), additional, score) new, _, _ = inputs(tmp_path / "new") new.resume_matching_dir = old.out + ".matching" second = prepare_sample(new, "s", hits, 42, no_call, no_call, no_call) pandas.testing.assert_frame_equal(first, second, check_dtype=False) assert len(list((tmp_path / "new/train.csv.matching").glob("*.round-*.json"))) == 2 @pytest.mark.parametrize("lengths", [[8], [8, 9, 11], [2, 3]]) @pytest.mark.parametrize("seed", [1, 42]) def test_numeric_sampler_preserves_exact_population(lengths, seed): sequences = {"p1": "ACDEFGHIKLMNPQRSTVWY", "p2": "ACDEXGHIKLMNPQRSTVWY", "short": "AC"} reference = make_peptide_frame_for_accessions(sequences, sequences, lengths, 3) excluded = {reference.peptide.iloc[0]} reference = reference.loc[~reference.peptide.isin(excluded)] numpy.random.seed(seed) sampled = sample_peptide_frame_for_accessions(sequences, sequences, lengths, 3, excluded, len(reference)) order = ["protein_accession", "start_position", "peptide"] pandas.testing.assert_frame_equal(reference.sort_values(order).reset_index(drop=True), sampled.sort_values(order).reset_index(drop=True)) with pytest.raises(ValueError, match="larger sample"): sample_peptide_frame_for_accessions(sequences, sequences, lengths, 3, excluded, len(reference) + 1) assert len(sample_peptide_frame_for_accessions(sequences, sequences, lengths, 3, excluded, len(reference) + 1, allow_smaller=True)) == len(reference) def test_numeric_sampler_is_seeded_and_does_not_call_string_iterator(monkeypatch): import mhcflurry.proteome_decoys as module monkeypatch.setattr(module, "iter_protein_peptide_records", no_call) numpy.random.seed(42) first = sample_peptide_frame_for_accessions(["p"], {"p": "ACDEFGHIKLMNPQRSTVWY" * 10}, n=10) numpy.random.seed(42) second = sample_peptide_frame_for_accessions(["p"], {"p": "ACDEFGHIKLMNPQRSTVWY" * 10}, n=10) pandas.testing.assert_frame_equal(first, second) assert not first.duplicated(["protein_accession", "start_position", "peptide"]).any() def window_population(frame): """The eligible (accession, start, length) windows a peptide frame covers.""" return {(row.protein_accession, int(row.start_position), len(row.peptide)) for row in frame.itertuples()} @pytest.mark.parametrize("lengths", [[8], [9], [8, 9], [8, 9, 10, 11]]) def test_both_candidate_helpers_match_the_reservoir_window_population(lengths): """Enumerate every eligible window for both samplers against the reservoir. The historical reservoir (``iter_protein_peptide_records``) drops only the C-terminal *minimum*-length-mer, so its eligible set depends on the minimum length of the requesting call. ``sample_peptide_frame_for_accessions`` is pinned against the reservoir for the same length set; ``ProcessingProteome`` exposes a single-length API, so it is pinned against ``lengths=[length]``, which is how make_train_data.processing.py draws both its initial pool and its expansion rounds. Protein lengths cover L == the requested length (an empty population), L one longer, and beyond. """ from mhcflurry.numeric_proteome import ProcessingProteome alphabet = "ACDEFGHIKLMNPQRSTVWY" for size in range(min(lengths), min(lengths) + 5): sequences = {"p": alphabet[:size]} positions = window_population(sample_peptide_frame_for_accessions( sequences, sequences, lengths, 0, (), n=10 ** 6, allow_smaller=True)) assert positions == window_population(make_peptide_frame_for_accessions( sequences, sequences, lengths, 0)), (size, lengths) index = ProcessingProteome(sequences) for length in lengths: per_length = window_population(index.sample( ["p"], length, 10 ** 6, [], numpy.random.RandomState(0)).to_frame(0)) assert per_length == window_population(make_peptide_frame_for_accessions( sequences, sequences, [length], 0)), (size, length) def test_multi_length_position_call_keeps_longer_terminal_windows(): """Pin the one documented divergence between the two candidate helpers. A multi-length ``positions`` call keeps each longer length's C-terminal window, because the window the reservoir drops is the *minimum*-length one. The per-length numeric sampler drops it because for its own call the requested length is the minimum. Both therefore reproduce the reservoir for the call shape they are given, and production only ever draws one length per call, so no window is reachable by one path and not the other. """ from mhcflurry.numeric_proteome import ProcessingProteome sequences = {"p": "ACDEFGHIKLMNPQRSTVWY"[:12]} multi = window_population(sample_peptide_frame_for_accessions( sequences, sequences, [8, 9], 0, (), n=10 ** 6, allow_smaller=True)) index = ProcessingProteome(sequences) per_length = set() for length in (8, 9): per_length |= window_population(index.sample( ["p"], length, 10 ** 6, [], numpy.random.RandomState(0)).to_frame(0)) assert multi - per_length == {("p", 3, 9)} assert per_length - multi == set() def test_expansion_draw_sequence_is_pinned_for_a_fixed_seed(tmp_path): """Pin the exact fixed-seed expansion draws, their order, and the result. Guards the per-round exclusion set in ``sample_preparation_steps``: every length in a round must still see the whole committed pool, and the drawn windows and peptides must stay identical for a given seed. """ from mhcflurry.numeric_proteome import ( ProcessingProteome, ProteinWindows, NumericCandidatePool) setup = numpy.random.RandomState(20260913) alphabet = list("ACDEFGHIKLMNPQRSTVWY") sequences = {"p%d" % i: "".join(setup.choice(alphabet, size=160)) for i in range(4)} proteome = ProcessingProteome(sequences) accessions = ["p0", "p1", "p2", "p3"] hits = pandas.DataFrame({ "sample_id": "s", "hit": 1, "protein_accession": "p0", "peptide": [sequences["p0"][10:18], sequences["p0"][30:39]], "n_flank": "NNNNN", "c_flank": "CCCCC"}) args = SimpleNamespace(out=str(tmp_path / "train.csv"), matching_reference={"sha256": "a" * 64}, decoys_per_hit=1, max_affinity_distance=.25, max_expansion_rounds=4, expansion_candidates_per_length=12, resume_matching_dir=None) (tmp_path / "train.csv.matching").mkdir(parents=True) draws, requests = [], [] def initial_pool(): parts = [proteome.sample(accessions, length, 3, set(hits.peptide), numpy.random.RandomState(4242)) for length in (8, 9)] return NumericCandidatePool(hits, ProteinWindows.concatenate(parts), "s", 5) def additional_candidates(length, excluded, round_seed): # Each length must see the complete committed pool, not a subset of it. assert excluded == set(requests[0]) windows = proteome.sample(accessions, length, 12, excluded, numpy.random.RandomState(int(round_seed) % (2 ** 32))) draws.append([[int(p), int(s), int(w)] for p, s, w in zip(windows.proteins, windows.starts, windows.lengths)]) return NumericCandidatePool(hits.iloc[:0], windows, "s", 5) def score(request): peptides = request.prediction_input("cpu").to_strings().tolist() requests.append(peptides) # Initial decoys land outside the caliper; expansion decoys match. return numpy.array([100.0 if p in set(hits.peptide) else (10000.0 if len(requests) == 1 else 100.0) for p in peptides]) result = prepare_sample(args, "s", hits, 4242, initial_pool, additional_candidates, score) assert draws == [ [[2, 71, 8], [1, 47, 8], [0, 147, 8], [0, 9, 8], [2, 24, 8], [0, 143, 8], [2, 70, 8], [3, 100, 8], [3, 139, 8], [3, 111, 8], [3, 61, 8], [3, 38, 8]], [[1, 138, 9], [2, 134, 9], [3, 118, 9], [0, 97, 9], [1, 27, 9], [0, 125, 9], [1, 30, 9], [0, 76, 9], [2, 83, 9], [3, 71, 9], [2, 42, 9], [2, 44, 9]]] assert requests == [ ["MEFSAPTH", "PYPWELVWL", "WDVSNLKD", "EHKELLGY", "LGYYDHKA", "TSVYSTYWL", "IDVENMREQ", "CLQRHDSPF"], ["VIPKCDFF", "QCPNVAHR", "CPFILRTM", "IMEFSAPT", "TKEPDERI", "CLVYCPFI", "AVIPKCDF", "TYSGPMVS", "CTYANYFV", "IGWMCQDI", "LTLQHLEE", "MIHSSWSV", "VHHREHVDH", "RPNKTKSPF", "ITQCYQDDR", "CGWDVSNLK", "GASGRFTSV", "MSTQQYFYS", "GRFTSVYST", "ANCFWDIHH", "HEERPRPNH", "SDEPCQREA", "DNCWIDAWW", "CWIDAWWVM"]] validate_matched_training_data(result) assert result.peptide.tolist() == [ "MEFSAPTH", "CPFILRTM", "PYPWELVWL", "ANCFWDIHH"] def test_matching_provenance_rejects_changed_inputs(): identity = dict(policy="policy", decoys_per_hit=1, max_log10_affinity_distance=.25, candidate_pool_multiplier=100, seed=42, affinity_reference={"sha256": "a"}, inputs={"/old/hits.csv": "h", "/old/proteins.csv": "p"}) relocated = {**identity, "inputs": {"/new/hits.csv": "h", "/new/proteins.csv": "p"}} validate_preparation_provenance(identity, relocated) for change in ({"seed": 1}, {"max_log10_affinity_distance": .3}, {"affinity_reference": {"sha256": "b"}}, {"inputs": {"/new/hits.csv": "changed", "/new/proteins.csv": "p"}}): with pytest.raises(ValueError, match="Changed"): validate_preparation_provenance(identity, {**relocated, **change}) def test_initialize_resume_is_explicit_and_verifies_source(tmp_path, monkeypatch): import mhcflurry.processing_matching as module hits = tmp_path / "hits.csv" proteins = tmp_path / "proteins.csv" hits.write_text("hits") proteins.write_text("proteins") args = SimpleNamespace(out=str(tmp_path / "train.csv"), negative_policy="matched", max_affinity_distance=.25, decoys_per_hit=1, ppv_multiplier=100, random_seed=42, hits=str(hits), proteome_peptides=None, proteome_reference_csv=str(proteins), affinity_predictor="reference", resume=False, resume_matching_dir=None) monkeypatch.setattr(module, "affinity_reference_fingerprint", lambda p: {"sha256": "a"}) initialize_matching_artifacts(args) with pytest.raises(ValueError, match="fresh"): initialize_matching_artifacts(args) args.resume = True initialize_matching_artifacts(args) hits.write_text("changed hits") with pytest.raises(ValueError, match="Changed"): initialize_matching_artifacts(args) mhcflurry-2.3.6/test/test_processing_ranking.py000066400000000000000000000123601525677230600220310ustar00rootroot00000000000000"""Inner-sample ranking checkpoints are deterministic, isolated and optional.""" import numpy import pandas import pytest import torch from mhcflurry import Class1ProcessingNeuralNetwork, Class1ProcessingPredictor from mhcflurry.flanking_encoding import FlankingEncoding from mhcflurry.processing_ranking import SampleRankingMonitor def test_ranking_macro_and_stable_ties(): monitor = SampleRankingMonitor([1, 0, 0, 1, 0, 0], ["a", "a", "b", "b", "b", "b"]) result = monitor([0.5] * 6) assert result["val_macro_ap"] == pytest.approx((0.5 + 0.25) / 2) assert result["val_macro_ppv_at_n"] == 0.5 assert monitor([1, 0, 0, 1, 0, 0]) == {"val_macro_ap": 1.0, "val_macro_ppv_at_n": 1.0} @pytest.mark.parametrize("labels,samples", [([], []), ([1, 0], ["a"]), ([1, 0], ["a", "b"]), ([1, 2], ["a", "a"]), ([1, 0], [None, "a"]), ([1, 0], ["", ""]), ([1, 0], [1, 1])]) def test_ranking_invalid_cohort_fails(labels, samples): with pytest.raises(ValueError): SampleRankingMonitor(labels, samples) @pytest.mark.parametrize("values", [[numpy.nan, 0], [1.1, 0], [-0.1, 0], [0.5]]) def test_ranking_invalid_scores_fail(values): with pytest.raises(ValueError): SampleRankingMonitor([0, 1], ["a", "a"])(values) def tiny_model(**kwargs): hp = dict(max_epochs=3, early_stopping=False, minibatch_size=2, convolutional_filters=4, convolutional_kernel_size=3, n_flank_length=2, c_flank_length=2, dropout_rate=0, convolutional_kernel_l1_l2=[0, 0], save_all_checkpoints=True, restore_best_weights=True) hp.update(kwargs) return Class1ProcessingNeuralNetwork(**hp) def fit_tiny(model, **kwargs): args = dict(sample_ids=numpy.array(["train"] * 4 + ["validation"] * 4), validation_mask=numpy.array([False] * 4 + [True] * 4), seed=42, verbose=-1, progress_print_interval=None) args.update(kwargs) model.fit(FlankingEncoding(["SIINFEKL", "AAAAAAAA"] * 4, ["AA"] * 8, ["CC"] * 8), [0, 1] * 4, **args) return model def test_monitoring_does_not_change_training_or_legacy_weights(): plain = fit_tiny(tiny_model()) monitored = fit_tiny(tiny_model(monitor_validation_ranking=True)) for policy in ("best", "terminal"): for left, right in zip(plain.checkpoint_weights[policy], monitored.checkpoint_weights[policy]): numpy.testing.assert_array_equal(left, right) assert monitored.fit_info[-1]["ranking_validation_input_rows"] == [4, 5, 6, 7] assert monitored.fit_info[-1]["ranking_validation_samples"] == ["validation"] assert len(monitored.fit_info[-1]["val_macro_ap"]) == 3 assert plain.fit_info[-1]["restored_checkpoint_policy"] == "best" def test_best_ap_earliest_tie_is_independent_and_serialized(tmp_path, monkeypatch): observed = [] def metrics(self, predictions): observed.append(self.sample_ids) return {"val_macro_ap": [0.2, 0.9, 0.9][len(observed) - 1], "val_macro_ppv_at_n": 0.5} monkeypatch.setattr(SampleRankingMonitor, "__call__", metrics) model = fit_tiny(tiny_model(checkpoint_metric="val_macro_ap")) assert observed == [["validation"]] * 3 assert set(model.checkpoint_weights) == {"best", "best_ap", "terminal"} info = model.fit_info[-1] assert info["best_ranking_epoch"] == 2 and info["best_macro_ap"] == 0.9 assert info["restored_checkpoint_policy"] == "best_ap" assert info["stopping_metric"] == "val_loss" for left, right in zip(model.get_weights(), model.checkpoint_weights["best_ap"]): numpy.testing.assert_array_equal(left, right) assert any(not numpy.array_equal(left, right) for left, right in zip(model.checkpoint_weights["best_ap"], model.checkpoint_weights["terminal"])) snapshot = [value.copy() for value in model.checkpoint_weights["best_ap"]] with torch.no_grad(): next(model.network().parameters()).add_(1) for left, right in zip(snapshot, model.checkpoint_weights["best_ap"]): numpy.testing.assert_array_equal(left, right) predictor = Class1ProcessingPredictor([model]) predictor.save(str(tmp_path)) loaded = Class1ProcessingPredictor.load(str(tmp_path)) for left, right in zip(snapshot, loaded.models[0].checkpoint_weights["best_ap"]): numpy.testing.assert_array_equal(left, right) loaded.models[0].hyperparameters.update(checkpoint_metric="val_loss", monitor_validation_ranking=False, save_all_checkpoints=False) fit_tiny(loaded.models[0]) loaded.save(str(tmp_path)) assert pandas.read_csv(tmp_path / "manifest.csv").checkpoint_best_ap_weights.isna().all() assert Class1ProcessingPredictor.load(str(tmp_path)).models[0].checkpoint_weights == {} @pytest.mark.parametrize("kwargs", [dict(sample_ids=None), dict(validation_mask=None), dict(sample_ids=["same"] * 8), dict(validation_mask=numpy.ones(8, dtype=bool)), dict(validation_mask=numpy.zeros(8, dtype=bool))]) def test_ranking_requires_disjoint_explicit_samples(kwargs): with pytest.raises(ValueError): fit_tiny(tiny_model(checkpoint_metric="val_macro_ap"), **kwargs) def test_unknown_checkpoint_metric_rejected(): with pytest.raises(ValueError, match="checkpoint_metric"): fit_tiny(tiny_model(checkpoint_metric="outer_test_ap")) mhcflurry-2.3.6/test/test_processing_recipe_analysis.py000066400000000000000000000146411525677230600235560ustar00rootroot00000000000000"""Paired factorial analysis must expose interactions and reject cohort drift.""" from copy import deepcopy import json from pathlib import Path import numpy import pandas import pytest @pytest.fixture def inputs(monkeypatch): monkeypatch.syspath_prepend(str(Path(__file__).resolve().parents[1] / "scripts/training")) import analyze_processing_recipe as module from generate_processing_recipe import build_processing_recipe_conditions records = [dict(condition=name, hyperparameters=grid, **axes) for name, grid, axes in build_processing_recipe_conditions()] experiment = {"design": "processing-training-recipe-v1", "train_data_sha256": "frozen", "records": records} rows = [] for rec in records[:8]: for fold, samples in ((0, ("a", "b")), (1, ("a", "c"))): batch_effect = 0 if rec["batch_size"] == 512 else (0.02 if rec["initialization"] == "none" else -0.01) value = 0.7 + batch_effect + (0.03 if rec["family"] == "legacy_5aa" else 0) rows.append({"condition": rec["condition"], "fold_num": fold, "sample_id": samples[0], "n": 20, "n_pos": 10, **{key: value for key in module.METRICS}}) rows.append({"condition": rec["condition"], "fold_num": fold, "sample_id": samples[1], "n": 40, "n_pos": 20, **{key: value for key in module.METRICS}}) return module, experiment, pandas.DataFrame(rows) def test_one_factor_contrasts_preserve_interaction_and_missing_cells(inputs): module, experiment, metrics = inputs status, samples, means, contrasts, delta = module.analyze(experiment, metrics, replicates=100) assert status.status.value_counts().to_dict() == {"pending": 24, "evaluated": 8} assert len(means) == 8 and len(samples) == 24 batch = contrasts.loc[(contrasts.factor == "batch_size") & (contrasts.metric == "pr_auc")] assert len(batch) == 4 for row in batch.itertuples(): expected = 0.02 if json.loads(row.fixed_settings)["initialization"] == "none" else -0.01 numpy.testing.assert_allclose([row.delta, row.ci_low, row.ci_high], expected) assert row.samples == 3 assert row.joint_samples_improved == (3 if expected > 0 else 0) assert not contrasts.factor.eq("optimizer_recipe").any() assert set(delta.sample_id) == {"a", "b", "c"} def test_repeated_samples_do_not_count_as_independent_units(inputs): module, experiment, metrics = inputs names = [record["condition"] for record in experiment["records"] if record["family"] == "legacy_5aa" and record["initialization"] == "none"][:2] metrics = metrics.loc[metrics.condition.isin(names)].copy() metrics[module.METRICS] = 0.5 metrics.loc[metrics.condition.eq(names[1]) & metrics.sample_id.eq("a"), module.METRICS] = 0.8 _, _, means, contrasts, _ = module.analyze(experiment, metrics, replicates=50) numpy.testing.assert_allclose(contrasts.delta, 0.1) # not 0.15 from row averaging assert means.samples.tolist() == [3, 3] @pytest.mark.parametrize("problem", ["missing_sample", "missing_fold", "duplicate", "count", "ratio", "nonfinite", "range", "unknown", "policy"]) def test_invalid_metric_tables_fail_closed(inputs, problem): module, experiment, metrics = inputs if problem == "missing_sample": metrics = metrics.iloc[1:] elif problem == "missing_fold": metrics = metrics.drop(index=[2, 3]) elif problem == "duplicate": metrics = pandas.concat([metrics, metrics.iloc[:1]]) elif problem == "count": metrics.loc[0, ["n", "n_pos"]] = [22, 11] elif problem == "ratio": metrics.loc[0, "n"] = 21 elif problem == "nonfinite": metrics.loc[0, "pr_auc"] = numpy.inf elif problem == "range": metrics.loc[0, "pr_auc"] = 1.1 elif problem == "unknown": metrics.loc[0, "condition"] = "unknown" else: metrics["checkpoint_policy"] = "terminal" with pytest.raises(ValueError): module.analyze(experiment, metrics, replicates=10) @pytest.mark.parametrize("problem", ["axes", "hidden_change", "coordinates", "policy", "folds"]) def test_invalid_designs_fail_closed(inputs, problem): module, experiment, metrics = inputs experiment = deepcopy(experiment) rec = experiment["records"][0] if problem == "axes": rec["hyperparameters"][0]["minibatch_size"] = 128 elif problem == "hidden_change": rec["hyperparameters"][0]["dropout_rate"] = 0.25 elif problem == "coordinates": duplicate = deepcopy(rec) duplicate["condition"] = "duplicate-coordinates" experiment["records"].append(duplicate) elif problem == "policy": rec["checkpoint_policy"] = "terminal" else: rec["fold_count"] = 4 with pytest.raises(ValueError): module.analyze(experiment, metrics, replicates=10) def test_report_is_reproducible_and_refuses_snapshot_overwrite(inputs, tmp_path): module, experiment, metrics = inputs design = tmp_path / "experiment.json" table = tmp_path / "metrics.csv" design.write_text(json.dumps(experiment)) metrics.to_csv(table, index=False) out = tmp_path / "analysis" args = ["--experiment", str(design), "--metrics", str(table), "--out", str(out), "--replicates", "30"] assert module.main(args) == 0 assert (out / "recipe-analysis.pdf").stat().st_size > 1000 provenance = json.loads((out / "provenance.json").read_text()) assert provenance["evaluated_conditions"] == 8 and provenance["planned_conditions"] == 32 assert len(provenance["inputs"]) == 4 assert (out / "analysis_source/analyze_processing_recipe.py").is_file() assert any(row["path"] == "recipe-analysis.pdf" for row in provenance["outputs"]) with pytest.raises(ValueError, match="new output directory"): module.main(args) shuffled = metrics.sample(frac=1, random_state=4) expected = module.analyze(experiment, metrics, replicates=30)[3] actual = module.analyze(experiment, shuffled, replicates=30)[3] pandas.testing.assert_frame_equal(expected, actual) def test_single_completed_condition_has_maps_but_no_invented_contrasts(inputs, tmp_path): module, experiment, metrics = inputs metrics = metrics.loc[metrics.condition.eq(metrics.condition.iloc[0])] records, _, means, contrasts, _ = module.analyze(experiment, metrics, replicates=10) assert contrasts.empty module.render_report(records, means, contrasts, tmp_path) assert (tmp_path / "recipe-analysis.pdf").stat().st_size > 1000 mhcflurry-2.3.6/test/test_processing_recipe_sweep.py000066400000000000000000000257301525677230600230570ustar00rootroot00000000000000"""The maintained processing factorial is paired, explicit and reproducible.""" import importlib.util import json from pathlib import Path import subprocess import sys import time import pandas import pytest from .test_processing_matching import training_frame @pytest.fixture def recipe_modules(monkeypatch): directory = Path(__file__).resolve().parents[1] / "scripts/training" monkeypatch.syspath_prepend(str(directory)) import generate_processing_recipe import run_exact_public_processing spec = importlib.util.spec_from_file_location("recipe_sweep", directory / "run_processing_kernel_sweep.py") sweep = importlib.util.module_from_spec(spec) spec.loader.exec_module(sweep) return generate_processing_recipe, sweep, run_exact_public_processing def test_recipe_factorial_has_all_joint_combinations(recipe_modules): generator, _, _ = recipe_modules records = generator.build_processing_recipe_conditions() assert len(records) == 32 assert sum(axes["network_count"] for _, _, axes in records) == 64 assert len({name for name, _, _ in records}) == 32 combinations = set() for _, grid, axes in records: hp = grid[0] combinations.add((axes["family"], hp["optimizer"], hp["initialization_method"], hp["minibatch_size"])) assert hp["restore_best_weights"] and hp["save_all_checkpoints"] assert hp["convolutional_kernel_size"] == 11 assert hp["convolutional_kernel_l1_l2"] == [0, 0] assert axes["fold_count"] == 2 assert len(combinations) == 32 def test_ranking_confirmation_design(recipe_modules): generator, _, _ = recipe_modules records = generator.build_processing_confirmation_conditions() assert len(records) == 6 assert sum(axes["network_count"] for _, _, axes in records) == 24 assert {(hp[0]["optimizer"], axes["kernel_width"]) for _, hp, axes in records} == { (optimizer, width) for optimizer in ("adam", "rmsprop") for width in (11, 13, 15)} for _, grid, axes in records: hp = grid[0] assert hp["checkpoint_metric"] == "val_macro_ap" assert hp["monitor_validation_ranking"] and hp["restore_best_weights"] and hp["save_all_checkpoints"] assert hp["minibatch_size"] == 512 and hp["initialization_method"] == "none" assert hp["convolutional_kernel_l1_l2"] == [0, 0] assert axes["fold_count"] == 4 def test_confirmed_candidate_is_one_confirmation_condition(recipe_modules): generator, _, _ = recipe_modules named = generator.CONFIRMED_PROCESSING_CANDIDATE records = {name: (grid, axes) for name, grid, axes in generator.build_processing_confirmation_conditions()} grid, axes = records[named["condition"]] assert grid == [generator.confirmed_processing_candidate_hyperparameters()] assert (axes["kernel_width"], axes["optimizer"], axes["checkpoint_policy"]) == ( named["kernel_width"], named["optimizer"], named["checkpoint_policy"]) assert grid[0]["convolutional_kernel_size"] == 13 and grid[0]["optimizer_implementation"] == "pytorch" assert not named["release_accepted"] def test_confirmed_candidate_yaml_emitter_matches_named_recipe(recipe_modules): import yaml generator, _, _ = recipe_modules script = Path(__file__).resolve().parents[1] / "scripts/training/generate_processing_recipe.py" result = subprocess.run([sys.executable, str(script), "--confirmed-candidate"], capture_output=True, text=True, check=True) assert yaml.safe_load(result.stdout) == [generator.confirmed_processing_candidate_hyperparameters()] assert subprocess.run([sys.executable, str(script)], capture_output=True).returncode != 0 def test_final_230_candidate_v2_preset_uses_confirmed_short_flanks(): repo = Path(__file__).resolve().parents[1] script = ("source scripts/training/release_recipes.sh; apply_final_230_candidate_v2_recipe; " 'echo "$MHCFLURRY_RELEASE_RECIPE|$PROCESSING_SHORT_FLANKS_HYPERPARAMETERS|$PROCESSING_VARIANTS|' '$PROCESSING_MODES|$AFFINITY_MINIBATCH_SIZE|$PROCESSING_SHORT_FLANK_BOUNDARY_RADIUS"') result = subprocess.run(["bash", "-c", script], cwd=repo, capture_output=True, text=True, check=True) assert result.stdout.strip() == ("final-2.3.0-candidate-v2|confirmed-ranking-candidate|" "with_flanks no_flank short_flanks|with_flanks,no_flank,short_flanks|1024|5") decision = json.loads((repo / "scripts/training/final_230_candidate_v2_recipe.json").read_text()) v1 = json.loads((repo / "scripts/training/final_230_candidate_recipe.json").read_text()) assert decision["name"] == "final-2.3.0-candidate-v2" assert decision["processing"]["legacy_architectures_per_variant"] == { "with_flanks": 128, "no_flank": 128, "short_flanks": 1} assert decision["processing"]["variants"] == v1["processing"]["variants"] assert decision["affinity"] == v1["affinity"] and decision["presentation"] == v1["presentation"] workflow = (repo / "scripts/training/pan_allele_release_full.sh").read_text() assert "final_230_candidate_v2_recipe.json" in workflow and "--confirmed-candidate" in workflow def test_ranking_confirmation_tiny_workflow(tmp_path, recipe_modules, monkeypatch): generator, sweep, _ = recipe_modules records = generator.build_processing_confirmation_conditions()[:2] for _, grid, _ in records: grid[0].update(max_epochs=2, convolutional_filters=4, post_convolutional_dense_layer_sizes=[4]) monkeypatch.setattr(generator, "build_processing_confirmation_conditions", lambda: records) frames = [] for index in range(20): frame = training_frame().assign(sample_id="sample_%d" % index) frame["peptide"] = frame.peptide.str.replace("B", "R") for fold in range(4): frame["fold_%d" % fold] = (index + fold) % 4 != 0 frames.append(frame) table = tmp_path / "frozen.csv.bz2" pandas.concat(frames, ignore_index=True).to_csv(table, index=False) holdout = tmp_path / "holdout" holdout.mkdir() pandas.DataFrame({"sample_id": ["unseen"]}).to_csv(holdout / "processing_samples.csv", index=False) out = tmp_path / "confirmation" args = ["--design", "ranking-confirmation", "--out", str(out), "--train-data", str(table), "--folds-from", str(table), "--public-root", str(tmp_path), "--release-holdout-dir", str(holdout), "--source-commit", "test", "--gpus", "0", "--num-jobs", "0", "--evaluation", "none"] assert sweep.main(args) == 0 assert sweep.main(args) == 0 assert (out / "validation_ranking_confirmation.pdf").stat().st_size > 1000 for name, _, _ in records: predictions = pandas.read_csv(out / "checkpoint_predictions" / (name + ".validation_predictions.csv.gz")) assert set(predictions.checkpoint_policy) == {"best", "best_ap", "terminal"} assert set(predictions.fold_num) == {0, 1, 2, 3} configs = pandas.read_csv(out / name / "processing/models.unselected.short_flanks/manifest.csv").config_json for config in configs.map(json.loads): info = config["fit_info"][-1] fold = info["training_info"]["fold_num"] outer = set(predictions.loc[predictions.fold_num == fold, "sample_id"]) assert not outer & set(info["ranking_validation_samples"]) assert info["restored_checkpoint_policy"] == "best_ap" assert len(info["val_macro_ap"]) == 2 metrics = pandas.read_csv(out / name / "checkpoint_per_sample.csv") assert set(metrics.checkpoint_policy) == {"best", "best_ap", "terminal"} def test_recipe_sweep_real_tiny_fit_and_frozen_folds(tmp_path, recipe_modules, monkeypatch): generator, sweep, _ = recipe_modules records = generator.build_processing_recipe_conditions()[8:10] # pre-LSUV, both families assert all(grid[0]["initialization_method"] == "lsuv_pre" for _, grid, _ in records) for _, grid, _ in records: grid[0].update(max_epochs=1, convolutional_filters=8, cleavage_boundary_hidden_size=4, post_convolutional_dense_layer_sizes=[4]) monkeypatch.setattr(generator, "build_processing_recipe_conditions", lambda: records) frames = [] for index in range(20): frame = training_frame().assign(sample_id="sample_%d" % index) frame["peptide"] = frame.peptide.str.replace("B", "R") for fold in range(4): frame["fold_%d" % fold] = (index + fold) % 4 != 0 frames.append(frame) table = tmp_path / "frozen.csv.bz2" pandas.concat(frames, ignore_index=True).to_csv(table, index=False) holdout = tmp_path / "holdout" holdout.mkdir() pandas.DataFrame({"sample_id": ["unseen"]}).to_csv(holdout / "processing_samples.csv", index=False) out = tmp_path / "experiment" args = ["--design", "training-recipe", "--out", str(out), "--train-data", str(table), "--folds-from", str(table), "--public-root", str(tmp_path), "--release-holdout-dir", str(holdout), "--source-commit", "test", "--gpus", "0", "--num-jobs", "0", "--evaluation", "none"] assert sweep.main(args) == 0 assert sweep.main(args) == 0 assert (out / "validation_training_recipe.pdf").stat().st_size > 1000 assert not (out / "evaluation/cohort.json").exists() for name, _, _ in records: log = (out / "logs" / (name + "-train.log")).read_text() assert "Trained processing predictor with 2 networks" in log assert "Trained affinity predictor" not in log manifest = pandas.read_csv(out / name / "processing/models.selected.short_flanks/manifest.csv") assert len(manifest) == 2 configs = [json.loads(value) for value in manifest.config_json] assert all(config["fit_info"][-1]["initialization"]["applied"] for config in configs) predictions = pandas.read_csv(out / "checkpoint_predictions" / (name + ".validation_predictions.csv.bz2")) assert set(predictions.checkpoint_policy) == {"best", "terminal"} assert set(predictions.fold_num) == {0, 1} corrupted = out / "checkpoint_predictions" / (records[0][0] + ".validation_predictions.csv.bz2") corrupted.write_bytes(corrupted.read_bytes() + b"changed") with pytest.raises(ValueError, match="Changed checkpoint prediction cache"): sweep.main(args) def test_budget_deadline_stops_command_and_never_marks_complete(tmp_path, recipe_modules): _, _, driver_module = recipe_modules driver = driver_module.Driver(tmp_path, deadline=time.time() + 0.25) with pytest.raises(subprocess.CalledProcessError) as error: driver.run("bounded", [sys.executable, "-c", "import time; time.sleep(60)"]) assert error.value.returncode == 124 record = json.loads((tmp_path / "commands/bounded.json").read_text()) assert record["budget_deadline_exceeded"] assert not (tmp_path / "stages/bounded.json").exists() driver = driver_module.Driver(tmp_path, deadline=time.time() - 1) with pytest.raises(TimeoutError, match="budget deadline"): driver.run("expired", [sys.executable, "-c", "raise AssertionError('must not launch')"]) mhcflurry-2.3.6/test/test_processing_training_csv.py000066400000000000000000000022261525677230600230660ustar00rootroot00000000000000"""Lossless processing CSV replay, including reference-score provenance.""" import io import numpy import pandas from mhcflurry.training_folds import read_processing_training_data def test_frozen_float_and_sample_identity_survive_repeated_roundtrips(): text = "sample_id,affinity_prediction,fold_0\n001,182.06260894694452,True\n" expected = numpy.float64("182.06260894694452") for _ in range(5): frame = read_processing_training_data(io.StringIO(text)) assert frame.sample_id.iloc[0] == "001" assert frame.affinity_prediction.iloc[0] == expected text = frame.to_csv(index=False) original = pandas.read_csv(io.StringIO(text), dtype=str, keep_default_na=False) changed = text.replace("94694452", "9469445") observed = pandas.read_csv(io.StringIO(changed), dtype=str, keep_default_na=False) assert not original.equals(observed) def test_numeric_only_fingerprint_is_not_inferred_as_an_integer(): text = "sample_id,matching_affinity_reference_sha256\n001," + "0" * 64 + "\n" frame = read_processing_training_data(io.StringIO(text)) assert frame.matching_affinity_reference_sha256.iloc[0] == "0" * 64 mhcflurry-2.3.6/test/test_pseudosequences.py000066400000000000000000000041531525677230600213600ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Tests for pseudosequence filename registry.""" from mhcflurry.pseudosequences import ( LEGACY_ALLELE_SEQUENCES_FILENAME, main, pseudosequence_filename_for_length, pseudosequence_filename_for_mapping, pseudosequence_path, ) def test_pseudosequence_filename_for_length(): assert ( pseudosequence_filename_for_length(34) == "pseudosequences.netmhcpan.34aa.csv" ) assert ( pseudosequence_filename_for_length(37) == "pseudosequences.mhcflurry.37aa.csv" ) assert ( pseudosequence_filename_for_length(39) == "pseudosequences.mhcflurry.39aa.csv" ) assert pseudosequence_filename_for_length(None) is None def test_pseudosequence_filename_for_ambiguous_mapping(): assert pseudosequence_filename_for_mapping({}) is None assert pseudosequence_filename_for_mapping({"HLA-A*02:01": None}) is None assert pseudosequence_filename_for_mapping({ "HLA-A*02:01": "A" * 34, "HLA-A*03:01": "A" * 39, }) is None def test_pseudosequence_path_prefers_canonical(tmp_path): canonical = tmp_path / "pseudosequences.mhcflurry.39aa.csv" canonical.write_text("allele,pseudosequence\n") assert pseudosequence_path(str(tmp_path), 39) == str(canonical) def test_pseudosequence_path_falls_back_to_legacy(tmp_path): assert pseudosequence_path(str(tmp_path), 39) == str( tmp_path / LEGACY_ALLELE_SEQUENCES_FILENAME) def test_pseudosequence_cli_filename(capsys): main(["filename", "--length", "39"]) assert capsys.readouterr().out == "pseudosequences.mhcflurry.39aa.csv\n" mhcflurry-2.3.6/test/test_pytorch_coverage.py000066400000000000000000000547771525677230600215310ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Unit tests to increase coverage of PyTorch migration code. Covers: - pytorch_losses: get_pytorch_loss registry, StandardLoss, sample weights - pytorch_layers: get_activation, LocallyConnected1D numerics - ensemble_centrality: edge cases (<=3 cols, all-NaN, median) - class1_neural_network: weight init variants, MergedClass1NeuralNetwork, skip-connections topology - class1_affinity_predictor: canonicalize_allele_name round-trip """ import warnings import numpy as np import pytest import torch from mhcflurry.testing_utils import startup, cleanup @pytest.fixture(autouse=True) def setup_teardown(): startup() yield cleanup() # ── pytorch_losses ────────────────────────────────────────────────────────── class TestGetPytorchLoss: def test_standard_mse(self): from mhcflurry.pytorch_losses import get_pytorch_loss loss = get_pytorch_loss("mse") assert not loss.supports_inequalities pred = torch.tensor([0.5]) target = torch.tensor([0.3]) val = loss(pred, target).item() assert abs(val - 0.04) < 1e-6 def test_standard_mae(self): from mhcflurry.pytorch_losses import get_pytorch_loss loss = get_pytorch_loss("mae") pred = torch.tensor([0.5]) target = torch.tensor([0.3]) val = loss(pred, target).item() assert abs(val - 0.2) < 1e-6 def test_custom_loss_lookup(self): from mhcflurry.pytorch_losses import get_pytorch_loss loss = get_pytorch_loss("custom:mse_with_inequalities") assert loss.supports_inequalities assert not loss.supports_multiple_outputs def test_custom_multi_output_lookup(self): from mhcflurry.pytorch_losses import get_pytorch_loss loss = get_pytorch_loss("custom:mse_with_inequalities_and_multiple_outputs") assert loss.supports_inequalities assert loss.supports_multiple_outputs def test_custom_mass_spec_lookup(self): from mhcflurry.pytorch_losses import get_pytorch_loss loss = get_pytorch_loss("custom:multiallelic_mass_spec_loss") assert loss.supports_inequalities def test_unknown_standard_loss_raises(self): from mhcflurry.pytorch_losses import get_pytorch_loss with pytest.raises(ValueError, match="Unknown standard loss"): get_pytorch_loss("huber") def test_unknown_custom_loss_raises(self): from mhcflurry.pytorch_losses import get_pytorch_loss with pytest.raises(ValueError, match="No such custom loss"): get_pytorch_loss("custom:nonexistent") class TestStandardLossWeighted: def test_mse_with_sample_weights(self): from mhcflurry.pytorch_losses import StandardLoss loss = StandardLoss("mse") pred = torch.tensor([0.5, 0.3]) target = torch.tensor([0.5, 0.0]) weights = torch.tensor([0.0, 1.0]) val = loss(pred, target, sample_weights=weights).item() # Only second sample contributes: 0.3^2 * 1.0 / 1.0 assert abs(val - 0.09) < 1e-6 def test_mae_with_sample_weights(self): from mhcflurry.pytorch_losses import StandardLoss loss = StandardLoss("mae") pred = torch.tensor([0.5, 0.3]) target = torch.tensor([0.5, 0.0]) weights = torch.tensor([0.0, 1.0]) val = loss(pred, target, sample_weights=weights).item() assert abs(val - 0.3) < 1e-6 def test_mse_column_vector_predictions_do_not_warn(self): from mhcflurry.pytorch_losses import StandardLoss loss = StandardLoss("mse") pred = torch.tensor([[0.5], [0.3]]) target = torch.tensor([0.5, 0.0]) with warnings.catch_warnings(record=True) as caught: warnings.simplefilter("always") val = loss(pred, target).item() assert abs(val - 0.045) < 1e-6 assert not caught class TestMSEWithInequalitiesSampleWeights: def test_weighted_equality_loss(self): from mhcflurry.pytorch_losses import MSEWithInequalities loss_fn = MSEWithInequalities() # Two equality targets, weight only the first encoded = MSEWithInequalities.encode_y([0.5, 0.5], ["=", "="]) y_pred = torch.tensor([0.7, 0.9]) y_true = torch.tensor(encoded) weights = torch.tensor([1.0, 0.0]) val = loss_fn(y_pred, y_true, sample_weights=weights).item() # Only first sample: (0.7 - 0.5)^2 * 1.0 / 1.0 = 0.04 assert abs(val - 0.04) < 1e-6 def test_encode_y_nan_raises(self): from mhcflurry.pytorch_losses import MSEWithInequalities with pytest.raises(ValueError, match="NaN"): MSEWithInequalities.encode_y([float("nan")]) def test_encode_y_length_mismatch_raises(self): from mhcflurry.pytorch_losses import MSEWithInequalities with pytest.raises(ValueError, match="same length"): MSEWithInequalities.encode_y([0.5, 0.5], ["="]) class TestMSEMultiOutputSampleWeights: def test_weighted_multi_output(self): from mhcflurry.pytorch_losses import MSEWithInequalitiesAndMultipleOutputs loss_fn = MSEWithInequalitiesAndMultipleOutputs() encoded = loss_fn.encode_y([0.5, 0.5], output_indices=[0, 1]) y_pred = torch.tensor([[0.7, 999.0], [999.0, 0.5]]) y_true = torch.tensor(encoded) weights = torch.tensor([1.0, 0.0]) val = loss_fn(y_pred, y_true, sample_weights=weights).item() # Only first sample, output 0: (0.7 - 0.5)^2 = 0.04 assert abs(val - 0.04) < 1e-6 def test_encode_y_negative_output_indices_raises(self): from mhcflurry.pytorch_losses import MSEWithInequalitiesAndMultipleOutputs with pytest.raises(ValueError, match="Invalid output indices"): MSEWithInequalitiesAndMultipleOutputs.encode_y( [0.5], output_indices=[-1]) def test_encode_y_output_indices_shape_mismatch_raises(self): from mhcflurry.pytorch_losses import MSEWithInequalitiesAndMultipleOutputs with pytest.raises(ValueError, match="Expected output_indices"): MSEWithInequalitiesAndMultipleOutputs.encode_y( [0.5, 0.5], output_indices=[0]) class TestMultiallelicMassSpecEdgeCases: def test_no_hits_returns_zero(self): from mhcflurry.pytorch_losses import MultiallelicMassSpecLoss loss_fn = MultiallelicMassSpecLoss(delta=0.2) y_pred = torch.tensor([[0.5, 0.3]], requires_grad=True) y_true = torch.tensor([0.0]) # only decoys val = loss_fn(y_pred, y_true) assert val.item() == 0.0 val.backward() # should not error def test_no_decoys_returns_zero(self): from mhcflurry.pytorch_losses import MultiallelicMassSpecLoss loss_fn = MultiallelicMassSpecLoss(delta=0.2) y_pred = torch.tensor([[0.5, 0.3]], requires_grad=True) y_true = torch.tensor([1.0]) # only hits val = loss_fn(y_pred, y_true) assert val.item() == 0.0 val.backward() # ── pytorch_layers ────────────────────────────────────────────────────────── class TestGetActivation: def test_tanh(self): from mhcflurry.pytorch_layers import get_activation act = get_activation("tanh") x = torch.tensor([0.0]) assert act(x).item() == 0.0 def test_sigmoid(self): from mhcflurry.pytorch_layers import get_activation act = get_activation("sigmoid") assert abs(act(torch.tensor([0.0])).item() - 0.5) < 1e-6 def test_relu(self): from mhcflurry.pytorch_layers import get_activation act = get_activation("relu") assert act(torch.tensor([-1.0])).item() == 0.0 assert act(torch.tensor([1.0])).item() == 1.0 def test_linear_returns_none(self): from mhcflurry.pytorch_layers import get_activation assert get_activation("linear") is None assert get_activation("") is None def test_unknown_raises(self): from mhcflurry.pytorch_layers import get_activation with pytest.raises(ValueError, match="Unknown activation"): get_activation("mish") class TestLocallyConnected1D: def test_output_shape(self): from mhcflurry.pytorch_layers import LocallyConnected1D lc = LocallyConnected1D( in_channels=3, out_channels=5, input_length=10, kernel_size=3 ) x = torch.randn(2, 10, 3) out = lc(x) assert out.shape == (2, 8, 5) def test_deterministic_forward(self): from mhcflurry.pytorch_layers import LocallyConnected1D torch.manual_seed(42) lc = LocallyConnected1D( in_channels=2, out_channels=1, input_length=4, kernel_size=2, activation="linear", ) x = torch.ones(1, 4, 2) out = lc(x) # With linear activation, output = einsum + bias, should be deterministic out2 = lc(x) assert torch.allclose(out, out2) # ── ensemble_centrality ───────────────────────────────────────────────────── class TestEnsembleCentralityEdgeCases: def test_robust_mean_falls_back_to_nanmean_for_few_columns(self): from mhcflurry.ensemble_centrality import robust_mean, _nanmean_no_warnings arr = np.array([[1.0, 2.0, 3.0]]) # 3 columns => fallback result = robust_mean(arr) expected = _nanmean_no_warnings(arr) np.testing.assert_array_equal(result, expected) def test_robust_mean_two_columns(self): from mhcflurry.ensemble_centrality import robust_mean arr = np.array([[10.0, 20.0]]) result = robust_mean(arr) assert result[0] == 15.0 def test_robust_mean_all_nan_many_columns(self): from mhcflurry.ensemble_centrality import robust_mean arr = np.array([[np.nan, np.nan, np.nan, np.nan, np.nan]]) result = robust_mean(arr) assert np.isnan(result[0]) def test_nanmedian_mixed_nans(self): from mhcflurry.ensemble_centrality import _nanmedian_no_warnings arr = np.array([ [1.0, 3.0, np.nan], [np.nan, np.nan, np.nan], [5.0, 5.0, 5.0], ]) result = _nanmedian_no_warnings(arr) assert result[0] == 2.0 assert np.isnan(result[1]) assert result[2] == 5.0 def test_nanmean_single_value_per_row(self): from mhcflurry.ensemble_centrality import _nanmean_no_warnings arr = np.array([ [np.nan, 7.0, np.nan], ]) result = _nanmean_no_warnings(arr) assert result[0] == 7.0 def test_centrality_measures_dict(self): from mhcflurry.ensemble_centrality import CENTRALITY_MEASURES assert set(CENTRALITY_MEASURES.keys()) == {"mean", "median", "robust_mean"} # ── class1_neural_network: weight initialization ──────────────────────────── class TestWeightInitialization: def _make_model(self, init): from mhcflurry.class1_neural_network import Class1NeuralNetworkModel # Topology/init coverage builds the model from a pre-encoded (L, V) # peptide shape directly (the peptide encoding path is index-only now). peptide_shape = (15, 21) return Class1NeuralNetworkModel( peptide_encoding_shape=peptide_shape, layer_sizes=[16], init=init, ) def test_glorot_uniform(self): model = self._make_model("glorot_uniform") assert model.output_layer.weight.shape[0] == 1 def test_glorot_normal(self): model = self._make_model("glorot_normal") assert model.output_layer.weight.shape[0] == 1 def test_he_uniform(self): model = self._make_model("he_uniform") assert model.output_layer.weight.shape[0] == 1 def test_he_normal(self): model = self._make_model("he_normal") assert model.output_layer.weight.shape[0] == 1 def test_biases_are_zero(self): model = self._make_model("glorot_uniform") for name, param in model.named_parameters(): if "bias" in name: assert torch.all(param == 0), f"Non-zero bias in {name}" # ── class1_neural_network: MergedClass1NeuralNetwork ──────────────────────── class TestMergedClass1NeuralNetwork: def _make_merged(self, merge_method, n_networks=2): from mhcflurry.class1_neural_network import ( Class1NeuralNetworkModel, MergedClass1NeuralNetwork, ) # Topology/init coverage builds the model from a pre-encoded (L, V) # peptide shape directly (the peptide encoding path is index-only now). peptide_shape = (15, 21) torch.manual_seed(0) networks = [] for _ in range(n_networks): net = Class1NeuralNetworkModel( peptide_encoding_shape=peptide_shape, layer_sizes=[4], ) networks.append(net) return MergedClass1NeuralNetwork(networks, merge_method=merge_method) def test_average(self): merged = self._make_merged("average") inp = {"peptide": torch.randn(3, *merged.networks[0].peptide_encoding_shape)} out = merged(inp) # Average of 2 networks individual = [net(inp) for net in merged.networks] expected = torch.stack(individual, dim=-1).mean(dim=-1) assert torch.allclose(out, expected, atol=1e-6) def test_sum(self): merged = self._make_merged("sum") inp = {"peptide": torch.randn(3, *merged.networks[0].peptide_encoding_shape)} out = merged(inp) individual = [net(inp) for net in merged.networks] expected = torch.stack(individual, dim=-1).sum(dim=-1) assert torch.allclose(out, expected, atol=1e-6) def test_concatenate(self): merged = self._make_merged("concatenate") inp = {"peptide": torch.randn(3, *merged.networks[0].peptide_encoding_shape)} out = merged(inp) individual = [net(inp) for net in merged.networks] expected = torch.cat(individual, dim=-1) assert torch.allclose(out, expected, atol=1e-6) def test_unknown_merge_method_raises(self): merged = self._make_merged("average") merged.merge_method = "bad" inp = {"peptide": torch.randn(1, *merged.networks[0].peptide_encoding_shape)} with pytest.raises(ValueError, match="Unknown merge method"): merged(inp) def test_get_set_weights_roundtrip(self): merged = self._make_merged("average") weights = merged.get_weights_list() assert len(weights) > 0 # Setting the same weights back should not change outputs inp = {"peptide": torch.randn(2, *merged.networks[0].peptide_encoding_shape)} out_before = merged(inp).detach().clone() merged.set_weights_list(weights) out_after = merged(inp) assert torch.allclose(out_before, out_after, atol=1e-6) # ── class1_neural_network: skip-connections topology ──────────────────────── class TestSkipConnectionsTopology: def test_forward_pass(self): from mhcflurry.class1_neural_network import Class1NeuralNetworkModel # Topology/init coverage builds the model from a pre-encoded (L, V) # peptide shape directly (the peptide encoding path is index-only now). peptide_shape = (15, 21) torch.manual_seed(7) model = Class1NeuralNetworkModel( peptide_encoding_shape=peptide_shape, layer_sizes=[8, 8, 4], topology="with-skip-connections", ) inp = {"peptide": torch.randn(2, *peptide_shape)} out = model(inp) assert out.shape == (2, 1) def test_different_from_feedforward(self): from mhcflurry.class1_neural_network import Class1NeuralNetworkModel # Topology/init coverage builds the model from a pre-encoded (L, V) # peptide shape directly (the peptide encoding path is index-only now). peptide_shape = (15, 21) torch.manual_seed(99) skip_model = Class1NeuralNetworkModel( peptide_encoding_shape=peptide_shape, layer_sizes=[8, 8], topology="with-skip-connections", ) torch.manual_seed(99) ff_model = Class1NeuralNetworkModel( peptide_encoding_shape=peptide_shape, layer_sizes=[8, 8], topology="feedforward", ) inp = {"peptide": torch.randn(2, *peptide_shape)} out_skip = skip_model(inp) out_ff = ff_model(inp) # Different topologies should give different outputs (skip model has # different second-layer input dim so weights differ) assert not torch.allclose(out_skip, out_ff, atol=1e-4) # ── class1_affinity_predictor: canonicalize_allele_name ───────────────────── class TestCanonicalizeAlleleName: def test_common_alleles_roundtrip(self): """Known HLA alleles should round-trip through canonicalize_allele_name.""" from mhcflurry.common import normalize_allele_name alleles = [ "HLA-A*02:01", "HLA-A*01:01", "HLA-B*07:02", "HLA-B*44:02", "HLA-C*07:01", ] for allele in alleles: result = normalize_allele_name(allele, use_allele_aliases=False) assert result == allele, f"{allele} -> {result}" def test_aliases_false_avoids_remapping(self): """With aliases=False, HLA-C*01:01 should not remap to C*01:02.""" from mhcflurry.common import normalize_allele_name result = normalize_allele_name( "HLA-C*01:01", use_allele_aliases=False) assert result == "HLA-C*01:01" def test_normalize_raises_on_invalid(self): from mhcflurry.common import normalize_allele_name with pytest.raises(ValueError, match="Invalid MHC allele name"): normalize_allele_name("INVALID_ALLELE_NAME") def test_normalize_returns_default_on_invalid(self): from mhcflurry.common import normalize_allele_name result = normalize_allele_name( "INVALID_ALLELE_NAME", raise_on_error=False, default_value="NONE") assert result == "NONE" def test_forbidden_substring_raises(self): from mhcflurry.common import normalize_allele_name with pytest.raises(ValueError, match="Unsupported gene"): normalize_allele_name("HLA-MIC-A") def test_forbidden_substring_returns_default(self): from mhcflurry.common import normalize_allele_name result = normalize_allele_name( "HLA-MIC-A", raise_on_error=False, default_value="SKIP") assert result == "SKIP" # ── common.py: configure_pytorch ──────────────────────────────────────────── class TestConfigurePyTorch: def test_reconfigure_backend(self): from mhcflurry import common old_backend = common._pytorch_backend common.configure_pytorch(backend="cpu") assert common._pytorch_backend == "cpu" common.configure_pytorch(backend="auto") assert common._pytorch_backend == "auto" common._pytorch_backend = old_backend def test_invalid_backend_raises(self): from mhcflurry import common with pytest.raises(ValueError, match="Invalid backend"): common.configure_pytorch(backend="gpuu") def test_gpu_visibility_does_not_import_torch(self, monkeypatch): import builtins from mhcflurry import common monkeypatch.delenv("CUDA_VISIBLE_DEVICES", raising=False) original_import = builtins.__import__ def guarded_import(name, *args, **kwargs): if name == "torch" or name.startswith("torch."): raise AssertionError("configure_pytorch imported torch") return original_import(name, *args, **kwargs) monkeypatch.setattr(builtins, "__import__", guarded_import) common.configure_pytorch(gpu_device_nums=[2]) assert common.os.environ["CUDA_VISIBLE_DEVICES"] == "2" def test_default_backend_alias_maps_to_auto(self): from mhcflurry import common old_backend = common._pytorch_backend try: common.configure_pytorch(backend="default") assert common._pytorch_backend == "auto" finally: common._pytorch_backend = old_backend def test_configure_tensorflow_cpu_backend_maps_to_cpu(self): from mhcflurry import common old_backend = common._pytorch_backend try: with pytest.warns(FutureWarning, match="configure_tensorflow"): common.configure_tensorflow(backend="tensorflow-cpu") assert common._pytorch_backend == "cpu" assert str(common.get_pytorch_device()) == "cpu" finally: common._pytorch_backend = old_backend def test_configure_tensorflow_default_alias_maps_to_auto(self): from mhcflurry import common old_backend = common._pytorch_backend try: common.configure_pytorch(backend="cpu") with pytest.warns(FutureWarning, match="configure_tensorflow"): common.configure_tensorflow(backend="tensorflow-default") assert common._pytorch_backend == "auto" finally: common._pytorch_backend = old_backend def test_configure_tensorflow_gpu_backend_maps_to_gpu(self): from mhcflurry import common old_backend = common._pytorch_backend try: with pytest.warns(FutureWarning, match="configure_tensorflow"): common.configure_tensorflow(backend="tensorflow-gpu") assert common._pytorch_backend == "gpu" if not torch.cuda.is_available(): with pytest.raises(RuntimeError, match="CUDA is not available"): common.get_pytorch_device() finally: common._pytorch_backend = old_backend mhcflurry-2.3.6/test/test_pytorch_regressions.py000066400000000000000000002556431525677230600222740ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Regression tests for PyTorch conversion gaps vs master behavior. """ import json import os import random import sys import types import pytest import numpy as np import pandas import torch from mhcflurry.class1_affinity_predictor import Class1AffinityPredictor from mhcflurry.allele_encoding import AlleleEncoding from mhcflurry.class1_neural_network import ( Class1NeuralNetwork, Class1NeuralNetworkModel, MergedClass1NeuralNetwork, ) from mhcflurry.class1_training import ( _batched_validation_loss, validation_split_counts, ) from mhcflurry.data_dependent_weights_initialization import ( get_activations_pytorch, ) from mhcflurry.class1_processing_neural_network import ( Class1ProcessingModel, Class1ProcessingNeuralNetwork, ) from mhcflurry.common import load_weights from mhcflurry.cli.materialize_affinity_checkpoint import materialize from mhcflurry.flanking_encoding import FlankingEncoding from mhcflurry.keras_optimizers import KerasAdam, KerasRMSprop from mhcflurry.pytorch_losses import ( MSEWithInequalities, MultiallelicMassSpecLoss, get_pytorch_loss, ) from mhcflurry.pytorch_layers import ( KerasBatchNorm1d, LocallyConnected1D, get_activation, ) from mhcflurry.pytorch_training import ( copy_module_state_dict_to_cpu, effective_validation_batch_size, maybe_compile_loss, validation_forward_network, ) from mhcflurry import pytorch_sizing from mhcflurry.testing_utils import startup, cleanup @pytest.fixture(autouse=True) def setup_teardown(): startup() yield cleanup() def _make_simple_affinity_model(**overrides): hyperparameters = dict( activation="tanh", layer_sizes=[4], locally_connected_layers=[], peptide_dense_layer_sizes=[], allele_dense_layer_sizes=[], dropout_probability=0.0, batch_normalization=False, dense_layer_l1_regularization=0.0, dense_layer_l2_regularization=0.0, max_epochs=5, early_stopping=False, validation_split=0.0, minibatch_size=2, optimizer="sgd", learning_rate=0.1, random_negative_rate=0.0, random_negative_constant=0, ) hyperparameters.update(overrides) return Class1NeuralNetwork(**hyperparameters) def _make_allele_representations(num_alleles=2): return np.arange(num_alleles * 6, dtype=np.float32).reshape(num_alleles, 2, 3) def _seed_all(seed=1): np.random.seed(seed) random.seed(seed) torch.manual_seed(seed) def _plain_or_shared_tensor(value): """Convenience: produce a plain tensor (legacy SHM path is gone).""" return torch.from_numpy(np.ascontiguousarray(value)).clone() def test_validation_split_counts_match_keras_rounding(): assert validation_split_counts(11, 0.1) == (9, 2) assert validation_split_counts(10, 0.1) == (9, 1) assert validation_split_counts(11, 0.0) == (11, 0) with pytest.raises(ValueError, match="leaves 0 training rows"): validation_split_counts(1, 0.1) def test_affinity_lsuv_observes_post_activation_dense_output(): model = Class1NeuralNetworkModel( peptide_encoding_shape=(2, 2), layer_sizes=[3], activation="tanh", output_activation="sigmoid", peptide_input_is_indices=False, ) peptide = np.array( [ [[2.0, -1.0], [0.5, 3.0]], [[-2.0, 1.0], [1.5, -3.0]], ], dtype=np.float32, ) inputs = {"peptide": peptide} with torch.no_grad(): flattened = torch.from_numpy(peptide).reshape(2, -1) raw = model.dense_layers[0](flattened) expected = torch.tanh(raw).numpy() observed = get_activations_pytorch(model, "dense_layers.0", inputs) pre_activation = get_activations_pytorch( model, "dense_layers.0", inputs, target="pre_activation", ) np.testing.assert_allclose(observed, expected, rtol=0, atol=0) assert not np.array_equal(observed, raw.numpy()) np.testing.assert_allclose(pre_activation, raw.numpy(), rtol=0, atol=0) def test_mps_free_memory_preserves_zero_headroom(monkeypatch): monkeypatch.setattr(torch.mps, "recommended_max_memory", lambda: 8 << 30) monkeypatch.setattr(torch.mps, "driver_allocated_memory", lambda: 8 << 30) monkeypatch.setitem( sys.modules, "psutil", types.SimpleNamespace( virtual_memory=lambda: types.SimpleNamespace(available=0)), ) free = pytorch_sizing.free_device_memory_bytes(torch.device("mps")) assert free == 0 assert pytorch_sizing.compute_prediction_batch_size( torch.device("mps"), total_rows=10000) == 1 assert pytorch_sizing.compute_prediction_batch_size( torch.device("cpu"), total_rows=0) == 1 def test_explicit_batch_size_helpers_reject_nonpositive_values(): device = torch.device("cpu") with pytest.raises(ValueError, match="prediction batch size"): pytorch_sizing.resolve_prediction_batch_size(0, device) with pytest.raises(ValueError, match="training batch size"): pytorch_sizing.check_training_batch_fits(0, device, model=None) @pytest.mark.parametrize("device_type", ["cpu", "mps"]) def test_prediction_batch_calibration_uses_analytic_fallback_off_cuda( device_type): """CPU/MPS have no CUDA peak probe and keep the analytic batch.""" class MustNotRun: def __call__(self, inputs): raise AssertionError("non-CUDA calibration ran a forward probe") result = pytorch_sizing.calibrate_prediction_batch_size( 123, torch.device(device_type), MustNotRun(), {"sequence": torch.zeros((10, 5))}, total_rows=10, ) assert result == 123 def test_prediction_batch_calibration_measures_real_cuda_forward(monkeypatch): """A measured peak can only tighten the analytic CUDA batch.""" from types import SimpleNamespace calls = [] class RecordingModel: def __call__(self, inputs): calls.append(tuple(inputs["sequence"].shape)) return inputs["sequence"].sum(dim=1) budget = SimpleNamespace(available_bytes=10_000) monkeypatch.setattr( pytorch_sizing, "estimate_peak_bytes_per_row", lambda model: 10) monkeypatch.setattr( pytorch_sizing, "device_memory_budget", lambda *args, **kwargs: budget) monkeypatch.setattr(torch.cuda, "synchronize", lambda device: None) monkeypatch.setattr(torch.cuda, "memory_allocated", lambda device: 100) monkeypatch.setattr(torch.cuda, "memory_reserved", lambda device: 200) monkeypatch.setattr( torch.cuda, "reset_peak_memory_stats", lambda device: None) monkeypatch.setattr( torch.cuda, "max_memory_allocated", lambda device: 20_100) monkeypatch.setattr( torch.cuda, "max_memory_reserved", lambda device: 10_200) result = pytorch_sizing.calibrate_prediction_batch_size( 1000, torch.device("cuda"), RecordingModel(), {"sequence": torch.ones((1000, 7))}, total_rows=1000, probe_rows=100, ) # 20,000-byte incremental peak / 100 rows * 2x extrapolation safety; # 10,000-byte remaining entitlement therefore fits 25 rows. assert result == 25 assert calls == [(1, 7), (100, 7)] def test_prediction_batch_calibration_measures_streamed_input_transfer( monkeypatch): """Host-resident probe slices move inside the protected CUDA attempt.""" from types import SimpleNamespace transfers = [] calls = [] class HostInput: def __init__(self, rows): self.rows = rows def __len__(self): return self.rows def __getitem__(self, item): start, stop, step = item.indices(self.rows) assert step == 1 return HostInput(max(stop - start, 0)) def to(self, device): transfers.append((self.rows, device.type)) return torch.ones((self.rows, 7)) class RecordingModel: def __call__(self, inputs): calls.append(tuple(inputs["sequence"].shape)) return inputs["sequence"].sum(dim=1) budget = SimpleNamespace(available_bytes=100_000) released = [] monkeypatch.setattr( pytorch_sizing, "estimate_peak_bytes_per_row", lambda model: 10) monkeypatch.setattr( pytorch_sizing, "device_memory_budget", lambda *args, **kwargs: budget) monkeypatch.setattr( pytorch_sizing, "release_cached_device_memory", lambda device: released.append(device.type), ) monkeypatch.setattr(torch.cuda, "synchronize", lambda device: None) monkeypatch.setattr(torch.cuda, "memory_allocated", lambda device: 100) monkeypatch.setattr(torch.cuda, "memory_reserved", lambda device: 200) monkeypatch.setattr( torch.cuda, "reset_peak_memory_stats", lambda device: None) monkeypatch.setattr( torch.cuda, "max_memory_allocated", lambda device: 20_100) monkeypatch.setattr( torch.cuda, "max_memory_reserved", lambda device: 10_200) result = pytorch_sizing.calibrate_prediction_batch_size( 1000, torch.device("cuda"), RecordingModel(), {"sequence": HostInput(1000)}, total_rows=1000, probe_rows=100, transfer_inputs_to_device=True, ) assert result == 100 assert transfers == [(1, "cuda"), (100, "cuda")] assert calls == [(1, 7), (100, 7)] assert released == ["cuda"] def test_prediction_batch_calibration_does_not_extrapolate_past_probe( monkeypatch): """A successful small CUDA forward is not proof that a larger one fits.""" from types import SimpleNamespace calls = [] class RecordingModel: def __call__(self, inputs): calls.append(tuple(inputs["sequence"].shape)) return inputs["sequence"].sum(dim=1) budget = SimpleNamespace(available_bytes=100_000) monkeypatch.setattr( pytorch_sizing, "estimate_peak_bytes_per_row", lambda model: 10) monkeypatch.setattr( pytorch_sizing, "device_memory_budget", lambda *args, **kwargs: budget) monkeypatch.setattr(torch.cuda, "synchronize", lambda device: None) monkeypatch.setattr(torch.cuda, "memory_allocated", lambda device: 100) monkeypatch.setattr(torch.cuda, "memory_reserved", lambda device: 200) monkeypatch.setattr( torch.cuda, "reset_peak_memory_stats", lambda device: None) monkeypatch.setattr( torch.cuda, "max_memory_allocated", lambda device: 20_100) monkeypatch.setattr( torch.cuda, "max_memory_reserved", lambda device: 10_200) result = pytorch_sizing.calibrate_prediction_batch_size( 1000, torch.device("cuda"), RecordingModel(), {"sequence": torch.ones((1000, 7))}, total_rows=1000, probe_rows=100, ) # The measured arithmetic would allow 250 rows, but only 100 actually ran. assert result == 100 assert calls == [(1, 7), (100, 7)] def test_prediction_batch_calibration_halves_an_oom_probe(monkeypatch): """A failed probe must find a verified smaller batch, not guess upward.""" from types import SimpleNamespace calls = [] class ThresholdModel: def __call__(self, inputs): rows = len(inputs["sequence"]) calls.append(rows) if rows > 50: raise RuntimeError("CUDA out of memory") return inputs["sequence"].sum(dim=1) budget = SimpleNamespace(available_bytes=100_000) monkeypatch.setattr( pytorch_sizing, "estimate_peak_bytes_per_row", lambda model: 10) monkeypatch.setattr( pytorch_sizing, "device_memory_budget", lambda *args, **kwargs: budget) monkeypatch.setattr( pytorch_sizing, "release_device_memory_after_oom", lambda device: None) monkeypatch.setattr(torch.cuda, "synchronize", lambda device: None) monkeypatch.setattr(torch.cuda, "memory_allocated", lambda device: 100) monkeypatch.setattr(torch.cuda, "memory_reserved", lambda device: 200) monkeypatch.setattr( torch.cuda, "reset_peak_memory_stats", lambda device: None) monkeypatch.setattr( torch.cuda, "max_memory_allocated", lambda device: 20_100) monkeypatch.setattr( torch.cuda, "max_memory_reserved", lambda device: 10_200) result = pytorch_sizing.calibrate_prediction_batch_size( 1000, torch.device("cuda"), ThresholdModel(), {"sequence": torch.ones((1000, 7))}, total_rows=1000, probe_rows=100, ) assert result == 50 assert calls == [1, 100, 50] def test_prediction_batch_calibration_uses_probe_when_counters_fail( monkeypatch): """Missing allocator telemetry cannot restore an unverified large batch.""" from types import SimpleNamespace calls = [] class RecordingModel: def __call__(self, inputs): calls.append(len(inputs["sequence"])) return inputs["sequence"].sum(dim=1) budget = SimpleNamespace(available_bytes=100_000) monkeypatch.setattr( pytorch_sizing, "estimate_peak_bytes_per_row", lambda model: 10) monkeypatch.setattr( pytorch_sizing, "device_memory_budget", lambda *args, **kwargs: budget) monkeypatch.setattr(torch.cuda, "synchronize", lambda device: None) monkeypatch.setattr( torch.cuda, "memory_allocated", lambda device: (_ for _ in ()).throw(RuntimeError("no counter")), ) result = pytorch_sizing.calibrate_prediction_batch_size( 1000, torch.device("cuda"), RecordingModel(), {"sequence": torch.ones((1000, 7))}, total_rows=1000, probe_rows=100, ) assert result == 100 assert calls == [1, 100] @pytest.mark.parametrize( ("keyword", "value", "message"), [ ("num_workers_per_gpu", 0, "num_workers_per_gpu"), ("max_rows", 0, "max_rows"), ("total_rows", -1, "total_rows"), ("cpu_fallback", 0, "cpu_fallback"), ("free_memory_fraction", 0, "free_memory_fraction"), ("free_memory_fraction", 1.1, "free_memory_fraction"), ("free_memory_fraction", float("nan"), "free_memory_fraction"), ], ) def test_prediction_batch_sizing_rejects_unsafe_inputs( keyword, value, message): kwargs = {keyword: value} with pytest.raises(ValueError, match=message): pytorch_sizing.compute_prediction_batch_size( torch.device("cpu"), **kwargs) def test_cuda_worker_budget_uses_total_entitlement_not_free_divided_twice( monkeypatch): gib = 1 << 30 monkeypatch.delenv( "MHCFLURRY_DEVICE_MEMORY_BUDGET_BYTES", raising=False) monkeypatch.delenv( pytorch_sizing.CUDA_FREE_BEFORE_CONTEXT_ENV, raising=False) live_free = {"bytes": 28 * gib} monkeypatch.setattr( pytorch_sizing, "free_device_memory_bytes", lambda device: live_free["bytes"], ) monkeypatch.setattr( torch.cuda, "mem_get_info", lambda device: (live_free["bytes"], 40 * gib), ) monkeypatch.setattr( pytorch_sizing, "cuda_process_memory_bytes", lambda pid=None: 3 * gib, ) first = pytorch_sizing.device_memory_budget( torch.device("cuda"), num_workers_per_gpu=4) assert first.worker_entitlement_bytes == 9 * gib assert first.available_bytes == 6 * gib # Allocations made by earlier-starting peer workers reduce global free # memory, but do not divide this worker's fixed entitlement a second time. live_free["bytes"] = 10 * gib later = pytorch_sizing.device_memory_budget( torch.device("cuda"), num_workers_per_gpu=4) assert later.worker_entitlement_bytes == first.worker_entitlement_bytes assert later.available_bytes == first.available_bytes monkeypatch.setenv( "MHCFLURRY_DEVICE_MEMORY_BUDGET_BYTES", str(5 * gib)) occupied_at_launch = pytorch_sizing.device_memory_budget( torch.device("cuda"), num_workers_per_gpu=4) assert occupied_at_launch.worker_entitlement_bytes == 5 * gib assert occupied_at_launch.available_bytes == 2 * gib monkeypatch.delenv( "MHCFLURRY_DEVICE_MEMORY_BUDGET_BYTES", raising=False) monkeypatch.setenv( pytorch_sizing.CUDA_FREE_BEFORE_CONTEXT_ENV, str(32 * gib)) monkeypatch.setattr( pytorch_sizing, "cuda_process_memory_bytes", lambda pid=None: None) monkeypatch.setattr(torch.cuda, "memory_reserved", lambda device: 0) co_resident = pytorch_sizing.device_memory_budget( torch.device("cuda"), num_workers_per_gpu=4) assert co_resident.process_bytes == 0 assert co_resident.available_bytes == 9 * gib baseline_fallback = pytorch_sizing.device_memory_budget( torch.device("cuda"), num_workers_per_gpu=1) assert baseline_fallback.process_bytes == 22 * gib assert baseline_fallback.available_bytes == 10 * gib def test_cuda_process_memory_includes_all_rows_for_pid(monkeypatch): monkeypatch.setattr( pytorch_sizing.subprocess, "check_output", lambda *args, **kwargs: b"10, 512\n11, 2048\n10, 256\n", ) assert pytorch_sizing.cuda_process_memory_bytes(10) == 768 * (1 << 20) def test_cuda_process_memory_matches_pid_namespace_alias(monkeypatch): monkeypatch.setattr( pytorch_sizing, "_process_namespace_pids", lambda: {10, 10010}) monkeypatch.setattr( pytorch_sizing.subprocess, "check_output", lambda *args, **kwargs: b"10010, 640\n11, 2048\n", ) assert pytorch_sizing.cuda_process_memory_bytes() == 640 * (1 << 20) def test_cuda_free_memory_before_context_uses_physical_device(monkeypatch): calls = [] def fake_check_output(command, **kwargs): calls.append(command) return b"32768\n" monkeypatch.setattr( pytorch_sizing.subprocess, "check_output", fake_check_output) assert ( pytorch_sizing.cuda_free_memory_before_context_bytes("GPU-abc") == 32 * (1 << 30) ) assert "--id=GPU-abc" in calls[0] def test_maybe_compile_loss_defaults_on_with_network_compile_cuda(monkeypatch): from mhcflurry import pytorch_training as training monkeypatch.setenv("MHCFLURRY_TORCH_COMPILE", "1") monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE_LOSS", raising=False) monkeypatch.setattr( training, "_warm_cuda_autograd_for_triton", lambda device: None ) calls = [] def fake_compile(obj, mode=None, dynamic=None): calls.append((obj, mode, dynamic)) return "compiled-loss" monkeypatch.setattr(torch, "compile", fake_compile) loss = MSEWithInequalities() result = maybe_compile_loss(loss, torch.device("cuda")) assert result == "compiled-loss" assert calls == [(loss, "default", True)] def test_maybe_compile_loss_can_be_disabled(monkeypatch): monkeypatch.setenv("MHCFLURRY_TORCH_COMPILE", "1") monkeypatch.setenv("MHCFLURRY_TORCH_COMPILE_LOSS", "0") calls = [] monkeypatch.setattr(torch, "compile", lambda *a, **k: calls.append((a, k))) loss = MSEWithInequalities() result = maybe_compile_loss(loss, torch.device("cuda")) assert result is loss assert calls == [] def test_maybe_compile_loss_requires_network_compile(monkeypatch): monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE", raising=False) monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE_LOSS", raising=False) calls = [] monkeypatch.setattr(torch, "compile", lambda *a, **k: calls.append((a, k))) loss = MSEWithInequalities() result = maybe_compile_loss(loss, torch.device("cuda")) assert result is loss assert calls == [] def test_copy_module_state_dict_to_cpu_is_independent(): layer = torch.nn.Linear(2, 1) checkpoint = copy_module_state_dict_to_cpu(layer) expected = {name: value.clone() for name, value in checkpoint.items()} with torch.no_grad(): for value in layer.state_dict().values(): value.add_(1.0) for name, value in checkpoint.items(): assert value.device.type == "cpu" torch.testing.assert_close(value, expected[name]) def test_fit_validation_interval_skips_off_interval_epochs(): """validation_interval > 1 measures only on-interval + final epoch.""" peptides = ["SIINFEKLM", "ARTLAVELS", "GILGFVFTL", "RTLNAWVKV"] affinities = np.array([50.0, 30.0, 100.0, 5000.0]) _seed_all(13) model = _make_simple_affinity_model( max_epochs=10, validation_split=0.5, early_stopping=False, validation_interval=3, ) model.fit(peptides, affinities) val_loss = model.fit_info[-1]["val_loss"] assert len(val_loss) == 10 # Epochs measured: 0, 3, 6, 9 (last epoch always measured). # Off-interval epochs carry forward the previous measurement, so # consecutive equal triples appear at (1, 2) repeating epoch 0's # loss, (4, 5) repeating epoch 3, (7, 8) repeating epoch 6. assert val_loss[1] == val_loss[0] assert val_loss[2] == val_loss[0] assert val_loss[4] == val_loss[3] assert val_loss[5] == val_loss[3] assert val_loss[7] == val_loss[6] assert val_loss[8] == val_loss[6] def test_fit_validation_interval_default_runs_every_epoch(): """Default validation_interval=1 measures every epoch (legacy).""" peptides = ["SIINFEKLM", "ARTLAVELS", "GILGFVFTL", "RTLNAWVKV"] affinities = np.array([50.0, 30.0, 100.0, 5000.0]) _seed_all(17) model = _make_simple_affinity_model( max_epochs=4, validation_split=0.5, early_stopping=False, ) model.fit(peptides, affinities) val_loss = model.fit_info[-1]["val_loss"] assert len(val_loss) == 4 # With per-epoch validation under the simple training data here, at # least some epochs differ from epoch 0; this is the most we can # assert without depending on exact per-step numerics. assert any(v != val_loss[0] for v in val_loss[1:]) def test_affinity_fit_can_restore_best_validation_checkpoint(monkeypatch): import mhcflurry.class1_neural_network as affinity_module calls = [] def zero_checkpoint(module): calls.append(True) return { name: torch.zeros_like(value, device="cpu") for name, value in module.state_dict().items() } monkeypatch.setattr( affinity_module, "copy_module_state_dict_to_cpu", zero_checkpoint) model = _make_simple_affinity_model( max_epochs=2, validation_split=0.5, early_stopping=False, restore_best_weights=True, ) model.fit( ["SIINFEKLM", "ARTLAVELS", "GILGFVFTL", "RTLNAWVKV"], np.array([50.0, 30.0, 100.0, 5000.0]), ) assert calls assert model.fit_info[-1]["restored_best_weights"] is True assert model.fit_info[-1]["best_epoch"] is not None for value in model.network().state_dict().values(): assert torch.count_nonzero(value) == 0 def test_affinity_zero_epoch_fit_can_retain_terminal_checkpoint(): model = _make_simple_affinity_model( max_epochs=0, validation_split=0.0, early_stopping=False, restore_best_weights=False, ) model.fit( ["SIINFEKLM", "ARTLAVELS"], np.array([50.0, 5000.0]), save_all_checkpoints=True, ) assert model.available_checkpoint_policies() == ["terminal"] assert model.fit_info[-1]["best_epoch"] is None assert model.fit_info[-1]["saved_checkpoint_policies"] == ["terminal"] for actual, expected in zip( model.get_weights(), model.get_checkpoint_weights("terminal")): np.testing.assert_array_equal(actual, expected) @pytest.mark.parametrize("save_in_place", [False, True]) def test_affinity_refit_discards_persisted_checkpoint_references(tmp_path, save_in_place): model = _make_simple_affinity_model( max_epochs=1, validation_split=0.5, early_stopping=False) peptides = ["SIINFEKLM", "ARTLAVELS", "GILGFVFTL", "RTLNAWVKV"] affinities = np.array([50.0, 30.0, 100.0, 5000.0]) model.fit(peptides, affinities, save_all_checkpoints=True) source = tmp_path / "source" predictor = Class1AffinityPredictor( allele_to_allele_specific_models={"HLA-A*02:01": [model]}) predictor.save(str(source)) loaded = Class1AffinityPredictor.load(str(source), optimization_level=0) loaded.neural_networks[0].fit(peptides, affinities, save_all_checkpoints=False) destination = source if save_in_place else tmp_path / "resaved" loaded.save(str(destination)) manifest = pandas.read_csv(destination / "manifest.csv") assert manifest[["checkpoint_terminal_weights", "checkpoint_best_weights"]].isna().all().all() reloaded = Class1AffinityPredictor.load(str(destination), optimization_level=0) assert reloaded.neural_networks[0].available_checkpoint_policies() == [] np.testing.assert_array_equal( reloaded.predict(peptides, allele="HLA-A*02:01"), loaded.predict(peptides, allele="HLA-A*02:01")) def test_affinity_fit_retains_distinct_terminal_and_best_checkpoints( monkeypatch, tmp_path): import mhcflurry.class1_neural_network as affinity_module def zero_checkpoint(module): return { name: torch.zeros_like(value, device="cpu") for name, value in module.state_dict().items() } monkeypatch.setattr( affinity_module, "copy_module_state_dict_to_cpu", zero_checkpoint) model = _make_simple_affinity_model( max_epochs=2, validation_split=0.5, early_stopping=False, restore_best_weights=False, ) peptides = ["SIINFEKLM", "ARTLAVELS", "GILGFVFTL", "RTLNAWVKV"] affinities = np.array([50.0, 30.0, 100.0, 5000.0]) model.fit(peptides, affinities, save_all_checkpoints=True) assert model.available_checkpoint_policies() == ["terminal", "best"] terminal = model.get_checkpoint_weights("terminal") best = model.get_checkpoint_weights("best") assert any(np.count_nonzero(value) for value in terminal) assert all(np.count_nonzero(value) == 0 for value in best) assert all( not np.shares_memory(terminal_value, best_value) for terminal_value, best_value in zip(terminal, best) ) for actual, expected in zip(model.get_weights(), terminal): np.testing.assert_array_equal(actual, expected) source = tmp_path / "source" predictor = Class1AffinityPredictor( allele_to_allele_specific_models={"HLA-A*02:01": [model]}, ) predictor.save(str(source)) manifest = pandas.read_csv(source / "manifest.csv") assert set(manifest[[ "checkpoint_terminal_weights", "checkpoint_best_weights", ]].columns) == { "checkpoint_terminal_weights", "checkpoint_best_weights", } loaded = Class1AffinityPredictor.load( str(source), optimization_level=0) loaded_model = loaded.neural_networks[0] assert loaded_model.available_checkpoint_policies() == ["terminal", "best"] for policy, expected in (("terminal", terminal), ("best", best)): for actual, expected_value in zip( loaded_model.get_checkpoint_weights(policy), expected): np.testing.assert_array_equal(actual, expected_value) # Cluster workers serialize their result as a predictor directory, then # the parent loads and saves it into the combined run directory. Exercise # that second persistence hop so lazy sidecar paths cannot be dropped. resaved = tmp_path / "resaved" loaded.save(str(resaved)) reloaded = Class1AffinityPredictor.load( str(resaved), optimization_level=0) assert reloaded.neural_networks[0].available_checkpoint_policies() == [ "terminal", "best"] (source / "percent_ranks.csv").write_text("stale\n") (source / "optimization_info.json").write_text("{}\n") best_dir = materialize(source, "best", tmp_path / "best") best_predictor = Class1AffinityPredictor.load( str(best_dir), optimization_level=0) assert all( np.count_nonzero(value) == 0 for value in best_predictor.neural_networks[0].get_weights() ) provenance = json.loads( (best_dir / "checkpoint_selection.json").read_text()) assert provenance["checkpoint_policy"] == "best" assert provenance["models"][0]["checkpoint_sha256"] == ( provenance["models"][0]["primary_weights_sha256"]) assert provenance["removed_stale_metadata"] == [ "percent_ranks.csv", "optimization_info.json", ] assert not (best_dir / "percent_ranks.csv").exists() assert not (best_dir / "optimization_info.json").exists() with pytest.raises(ValueError, match="Output already exists"): materialize(source, "best", best_dir) def test_effective_validation_batch_size_uses_larger_cuda_default(): assert effective_validation_batch_size(torch.device("cuda"), None, 512) == 4096 assert effective_validation_batch_size("cuda", None, 512) == 4096 assert effective_validation_batch_size(torch.device("cuda"), None, 2048) == 8192 assert effective_validation_batch_size(torch.device("cpu"), None, 512) == 2048 assert effective_validation_batch_size(torch.device("cuda"), 123, 512) == 123 with pytest.raises(ValueError, match="validation batch size"): effective_validation_batch_size(torch.device("cuda"), -1, 512) def test_batched_inequality_validation_preserves_heldout_training_result(): """Small and single-shot validation produce the same trained predictor.""" peptides = [ "AAAAAAAAA", "CCCCCCCCC", "DDDDDDDDD", "EEEEEEEEE", "FFFFFFFFF", "GGGGGGGGG", "HHHHHHHHH", "IIIIIIIII", ] affinities = np.array( [50.0, 100.0, 250.0, 500.0, 1000.0, 2500.0, 5000.0, 10000.0]) inequalities = np.array(["=", ">", "<", "=", ">", "<", "=", ">"]) fit_kwargs = dict( peptides=peptides, affinities=affinities, inequalities=inequalities, shuffle_permutation=np.arange(len(peptides)), ) model_kwargs = dict( loss="custom:mse_with_inequalities", max_epochs=4, validation_split=0.5, early_stopping=False, ) _seed_all(101) single_shot = _make_simple_affinity_model( validation_batch_size=10_000, **model_kwargs) single_shot.fit(**fit_kwargs) _seed_all(101) batched = _make_simple_affinity_model( validation_batch_size=2, **model_kwargs) batched.fit(**fit_kwargs) np.testing.assert_allclose( batched.fit_info[-1]["val_loss"], single_shot.fit_info[-1]["val_loss"], rtol=1e-6, atol=1e-7, ) np.testing.assert_allclose( batched.predict(peptides), single_shot.predict(peptides), rtol=0, atol=0, ) @pytest.mark.slow @pytest.mark.integration def test_sample_weights_affect_training(): peptides = ["AAAAAAAAA", "CCCCCCCCC"] affinities = np.array([50.0, 50000.0]) weights = np.array([1000.0, 1.0]) _seed_all(7) model_unweighted = _make_simple_affinity_model(max_epochs=25) model_unweighted.fit( peptides, affinities, shuffle_permutation=[0, 1], ) pred_unweighted = model_unweighted.predict(peptides) _seed_all(7) model_weighted = _make_simple_affinity_model(max_epochs=25) model_weighted.fit( peptides, affinities, sample_weights=weights, shuffle_permutation=[0, 1], ) pred_weighted = model_weighted.predict(peptides) # With sample weights, training should diverge from the unweighted case. assert not np.allclose(pred_unweighted, pred_weighted, rtol=0.01, atol=0.0) def test_fit_seed_makes_training_reproducible(): """A single ``seed`` controls every stochastic step of fit() — weight initialization, the example shuffle, and random-negative sampling — so two fits with the same seed produce identical weights even when the ambient RNG state differs, and different seeds diverge.""" peptides = ["SIINFEKL", "LLFGYPVYV", "KLGGALQAK", "GILGFVFTL", "NLVPMVATV", "GLCTLVAML"] affinities = np.array([10.0, 50000.0, 500.0, 25000.0, 100.0, 40000.0]) def train(seed, ambient): # Deliberately vary ambient RNG state across calls: only ``seed`` # should determine the trained weights. If anything stochastic # leaks past the seed (e.g. an unseeded shuffle), same-seed runs # would differ and this test fails. _seed_all(ambient) model = _make_simple_affinity_model( max_epochs=3, random_negative_rate=1.0) model.fit(peptides, affinities, seed=seed, verbose=0) return torch.cat( [p.detach().reshape(-1) for p in model.network().parameters()]) same_a = train(seed=123, ambient=1) same_b = train(seed=123, ambient=98765) # different ambient, same seed different = train(seed=456, ambient=1) assert torch.equal(same_a, same_b), ( "fit(seed=S) must be reproducible regardless of ambient RNG state") assert not torch.equal(same_a, different), ( "fit() with a different seed must produce different weights") def test_validation_split_is_fixed_when_lr_zero(): peptides = ["AAAAAAAAA", "CCCCCCCCC", "DDDDDDDDD", "EEEEEEEEE"] affinities = np.array([50.0, 50000.0, 50000.0, 50.0]) _seed_all(3) model = _make_simple_affinity_model( learning_rate=0.0, max_epochs=3, validation_split=0.5, early_stopping=False, ) model.fit( peptides, affinities, shuffle_permutation=[0, 1, 2, 3], ) val_losses = model.fit_info[-1]["val_loss"] assert len(val_losses) >= 2 # With fixed validation split and zero learning rate, val loss should be constant. assert np.allclose(val_losses, val_losses[0], rtol=0.0, atol=1e-6) def test_dropout_probability_is_keep_prob(): # Pre-encoded (L, V) peptide shape directly (encoding path is index-only). peptide_shape = (15, 21) model = Class1NeuralNetworkModel( peptide_encoding_shape=peptide_shape, dropout_probability=0.8, ) assert model.dropouts[0] is not None # In master, dropout_probability is a keep probability, so p should be 0.2. assert model.dropouts[0].p == pytest.approx(0.2, abs=1e-6) def test_batch_norm_uses_keras_defaults(): # Pre-encoded (L, V) peptide shape directly (encoding path is index-only). peptide_shape = (15, 21) model = Class1NeuralNetworkModel( peptide_encoding_shape=peptide_shape, batch_normalization=True, layer_sizes=[4], ) assert model.batch_norm_early is not None assert model.batch_norm_early.eps == pytest.approx(1e-3, abs=1e-12) assert model.batch_norm_early.momentum == pytest.approx(0.01, abs=1e-12) assert model.batch_norms[0] is not None assert model.batch_norms[0].eps == pytest.approx(1e-3, abs=1e-12) assert model.batch_norms[0].momentum == pytest.approx(0.01, abs=1e-12) def test_batch_norm_updates_keras_population_variance(): layer = KerasBatchNorm1d(1, eps=1e-3, momentum=0.01) inputs = torch.tensor([[0.0], [2.0]]) observed = layer(inputs) np.testing.assert_allclose( observed.detach().numpy(), np.array([[-1.0], [1.0]]) / np.sqrt(1.001), rtol=1e-6, ) # Population variance is 1.0, so the Keras 0.99/0.01 moving update # leaves the initial running variance of 1.0 unchanged. PyTorch's native # BatchNorm would use unbiased variance=2.0 and update it to 1.01. assert layer.running_var.item() == pytest.approx(1.0) def test_batch_norm_sequence_updates_keras_population_variance(): layer = KerasBatchNorm1d(1, eps=1e-3, momentum=0.01) inputs = torch.tensor([[[0.0, 2.0]], [[2.0, 4.0]]]) observed = layer(inputs) expected = (inputs.numpy() - 2.0) / np.sqrt(2.001) np.testing.assert_allclose(observed.detach().numpy(), expected, rtol=1e-6) assert layer.running_mean.item() == pytest.approx(0.02) assert layer.running_var.item() == pytest.approx(1.01) @pytest.mark.parametrize("activation", ["relu", "silu", "swish", "gelu"]) def test_modern_activations_are_supported(activation): observed = get_activation(activation)(torch.tensor([-1.0, 0.0, 1.0])) assert observed.shape == (3,) assert torch.isfinite(observed).all() def test_affinity_layer_normalization_is_batch_composition_invariant(): model = Class1NeuralNetworkModel( peptide_encoding_shape=(3, 2), layer_sizes=[4], normalization="layer", ) model.eval() assert model.batch_norm_early is None assert model.layer_norm_early is not None assert model.layer_norms[0] is not None inputs = torch.randn(3, 3, 2) single = model({"peptide": inputs[:1]}) batched = model({"peptide": inputs})[:1] torch.testing.assert_close(single, batched) clone = Class1NeuralNetworkModel( peptide_encoding_shape=(3, 2), layer_sizes=[4], normalization="layer", ) clone.set_weights_list(model.get_weights_list(), auto_convert_keras=False) clone.eval() torch.testing.assert_close(single, clone({"peptide": inputs[:1]})) def test_affinity_normalization_rejects_conflicting_legacy_flag(): with pytest.raises(ValueError, match="conflicts"): Class1NeuralNetworkModel( peptide_encoding_shape=(3, 2), batch_normalization=True, normalization="layer", ) def test_locally_connected_initializer_uses_keras_fans(monkeypatch): calls = [] def record_uniform(tensor, lower, upper): calls.append((tuple(tensor.shape), lower, upper)) return tensor monkeypatch.setattr(torch.nn.init, "uniform_", record_uniform) LocallyConnected1D( in_channels=21, out_channels=8, input_length=15, kernel_size=3, ) expected_bound = np.sqrt(6.0 / (13 * 63 + 13 * 8)) assert calls == [ ((13, 8, 63), -expected_bound, expected_bound), ] def test_network_forward_requires_allele_key_to_match_model_type(): peptide_input = torch.ones((2, 9, 21), dtype=torch.float32) pan_model = Class1NeuralNetworkModel( peptide_encoding_shape=(9, 21), allele_representations=np.zeros((2, 1, 3), dtype=np.float32), layer_sizes=[4], peptide_dense_layer_sizes=[], allele_dense_layer_sizes=[], locally_connected_layers=[], batch_normalization=False, dropout_probability=0.0, ) with pytest.raises(ValueError, match="has_allele=True"): pan_model({"peptide": peptide_input}) allele_specific_model = Class1NeuralNetworkModel( peptide_encoding_shape=(9, 21), allele_representations=None, layer_sizes=[4], peptide_dense_layer_sizes=[], allele_dense_layer_sizes=[], locally_connected_layers=[], batch_normalization=False, dropout_probability=0.0, ) with pytest.raises(ValueError, match="has_allele=False"): allele_specific_model( {"peptide": peptide_input, "allele": torch.zeros(2, dtype=torch.long)} ) def test_processing_dropout_is_spatial(): model = Class1ProcessingModel( sequence_dims=(10, 3), n_flank_length=1, c_flank_length=1, peptide_max_length=8, flanking_averages=False, convolutional_filters=3, convolutional_kernel_size=1, convolutional_activation="tanh", convolutional_kernel_l1_l2=[0.0, 0.0], dropout_rate=0.5, post_convolutional_dense_layer_sizes=[], ) assert model.dropout is not None model.train() _seed_all(11) x = torch.ones((1, 3, 10)) dropped = model.dropout(x) mask = (dropped != 0) # Spatial dropout should use one mask per channel across all positions. for c in range(mask.shape[1]): assert torch.all(mask[0, c, :] == mask[0, c, 0]) def test_processing_flank_averages_use_tf_masked_mean_semantics(): model = Class1ProcessingModel( sequence_dims=(7, 1), n_flank_length=2, c_flank_length=2, peptide_max_length=3, flanking_averages=True, convolutional_filters=1, convolutional_kernel_size=1, convolutional_activation="tanh", convolutional_kernel_l1_l2=[0.0, 0.0], dropout_rate=0.0, post_convolutional_dense_layer_sizes=[], ) # With TF semantics, masked averaging is computed via: # mean((x + 1) * mask, axis=sequence_axis) - 1 # i.e., denominator is full sequence length, not number of masked positions. conv_result = torch.ones((1, 7, 1)) peptide_length = torch.tensor([[3]]) n_avg = model._extract_n_flank_avg(conv_result) c_avg = model._extract_c_flank_avg(conv_result, peptide_length) expected = (2 * (1.0 + 1.0) / 7.0) - 1.0 assert n_avg.item() == pytest.approx(expected, abs=1e-7) assert c_avg.item() == pytest.approx(expected, abs=1e-7) def test_mse_with_inequalities_rejects_out_of_range_targets(): with pytest.raises(ValueError): MSEWithInequalities.encode_y([1.1], inequalities=["="]) with pytest.raises(ValueError): MSEWithInequalities.encode_y([-0.1], inequalities=["="]) def test_mse_with_inequalities_rejects_invalid_inequality(): with pytest.raises(ValueError): MSEWithInequalities.encode_y([0.5], inequalities=["?"]) def test_multiallelic_mass_spec_encode_y_validates_values(): with pytest.raises(AssertionError): MultiallelicMassSpecLoss.encode_y([0.5]) @pytest.mark.parametrize("merge_method", ["concatenate", "multiply"]) def test_forward_cartesian_from_peptide_stage_matches_expanded_path(merge_method): _seed_all(270) model = Class1NeuralNetwork( activation="tanh", layer_sizes=[4], allele_dense_layer_sizes=[6], peptide_dense_layer_sizes=[6], locally_connected_layers=[], peptide_allele_merge_method=merge_method, peptide_allele_merge_activation="", batch_normalization=False, dropout_probability=0.0, dense_layer_l1_regularization=0.0, dense_layer_l2_regularization=0.0, ) network = model.make_network( allele_representations=_make_allele_representations(num_alleles=4), **model.network_hyperparameter_defaults.subselect(model.hyperparameters), ) network.eval() peptide = torch.randn(3, *network.peptide_encoding_shape) allele_idx = torch.tensor([1, 3]) with torch.no_grad(): peptide_stage = network.forward_peptide_stage(peptide) compact = network.forward_cartesian_from_peptide_stage( peptide_stage, allele_idx, ) expanded_peptide_stage = peptide_stage.unsqueeze(0).expand( len(allele_idx), peptide_stage.shape[0], peptide_stage.shape[-1], ).reshape(len(allele_idx) * peptide_stage.shape[0], peptide_stage.shape[-1]) expanded_alleles = allele_idx.unsqueeze(1).expand( len(allele_idx), peptide_stage.shape[0], ).reshape(-1) expanded = network.forward_from_peptide_stage( expanded_peptide_stage, expanded_alleles, ).reshape(len(allele_idx), peptide_stage.shape[0], -1) np.testing.assert_allclose( compact.detach().cpu().numpy(), expanded.detach().cpu().numpy(), rtol=0, atol=1e-6, ) def test_predict_cartesian_pan_allele_matches_repeated_predict(monkeypatch): _seed_all(7) allele_to_sequence = { "HLA-A*02:01": "ACDEFG", "HLA-B*07:02": "HIKLMN", } master = Class1AffinityPredictor( allele_to_sequence=allele_to_sequence, ).master_allele_encoding allele_encoding = AlleleEncoding( list(allele_to_sequence), borrow_from=master, ) models = [] for _ in range(2): model = _make_simple_affinity_model( peptide_allele_merge_method="concatenate", peptide_dense_layer_sizes=[3], allele_dense_layer_sizes=[3], layer_sizes=[4], peptide_amino_acid_encoding_torch=True, ) _, allele_representations = model.allele_encoding_to_network_input( allele_encoding ) model._network = model.make_network( allele_representations=allele_representations, **model.network_hyperparameter_defaults.subselect( model.hyperparameters ), ) models.append(model) predictor = Class1AffinityPredictor( class1_pan_allele_models=models, allele_to_sequence=allele_to_sequence, ) assert predictor.optimize() peptides = np.asarray(["SIINFEKL", "PEPTIDES"]) alleles = np.asarray(["HLA-A*02:01", "HLA-B*07:02"]) actual = predictor.predict_cartesian_pan_allele( peptides=peptides, alleles=alleles, model_kwargs={"batch_size": 2}, ) expected_flat = predictor.predict( peptides=np.tile(peptides, len(alleles)), alleles=np.repeat(alleles, len(peptides)), model_kwargs={"batch_size": 2}, ) expected = expected_flat.reshape(len(alleles), len(peptides)).T np.testing.assert_allclose(actual, expected, rtol=1e-6, atol=1e-6) sizing_calls = [] def fixed_cartesian_row_budget( requested, device, model=None, num_workers_per_gpu=1, total_rows=None): sizing_calls.append(total_rows) return 2 monkeypatch.setattr( pytorch_sizing, "resolve_prediction_batch_size", fixed_cartesian_row_budget, ) network = predictor.class1_pan_allele_models[0].network(borrow=True) original_forward_peptide_stage = network.forward_peptide_stage peptide_batch_lengths = [] def record_peptide_batch(peptide_batch): peptide_batch_lengths.append(len(peptide_batch)) return original_forward_peptide_stage(peptide_batch) monkeypatch.setattr( network, "forward_peptide_stage", record_peptide_batch) auto_actual = predictor.predict_cartesian_pan_allele( peptides=peptides, alleles=alleles, model_kwargs={"batch_size": "auto"}, ) assert sizing_calls == [len(peptides) * len(alleles)] assert peptide_batch_lengths == [1, 1] np.testing.assert_allclose(auto_actual, expected, rtol=1e-6, atol=1e-6) tolerant = predictor.predict_cartesian_pan_allele( peptides=peptides, alleles=np.asarray([ "HLA-A*02:01", "HLA-DQA1*01:01", "HLA-B*07:02", ]), throw=False, model_kwargs={"batch_size": 2}, ) assert tolerant.shape == (len(peptides), 3) np.testing.assert_allclose( tolerant[:, 0], expected[:, 0], rtol=1e-6, atol=1e-6) assert np.isnan(tolerant[:, 1]).all() np.testing.assert_allclose( tolerant[:, 2], expected[:, 1], rtol=1e-6, atol=1e-6) with pytest.raises(ValueError, match="MHC class II allele"): predictor.predict_cartesian_pan_allele( peptides=peptides, alleles=["HLA-DQA1*01:01"], model_kwargs={"batch_size": 2}, ) @pytest.mark.parametrize("layer_sizes", [ [4, 4], # 2 dense layers — exercises layer-1 factorization [4, 4, 4], # 3 dense layers — exercises layer-2+ factorization [4, 6, 8, 10], # 4 dense layers — exercises a deeper skip stack ]) def test_forward_cartesian_skip_connections_matches_expanded(layer_sizes): """Skip-connections topology, factorized cartesian forward must match the explicit (a*p, peptide_width + allele_width) expansion. The factorization avoids materializing the merged_input expansion at layer 1 by splitting each post-layer-0 weight column-wise into peptide / allele / prev-output pieces. This test pins parity vs the non-factorized path for 2, 3, and 4 dense layers.""" _seed_all(271) model = Class1NeuralNetwork( activation="tanh", topology="with-skip-connections", layer_sizes=layer_sizes, allele_dense_layer_sizes=[6], peptide_dense_layer_sizes=[6], locally_connected_layers=[], peptide_allele_merge_method="concatenate", peptide_allele_merge_activation="", batch_normalization=False, dropout_probability=0.0, dense_layer_l1_regularization=0.0, dense_layer_l2_regularization=0.0, ) network = model.make_network( allele_representations=_make_allele_representations(num_alleles=4), **model.network_hyperparameter_defaults.subselect(model.hyperparameters), ) network.eval() peptide = torch.randn(3, *network.peptide_encoding_shape) allele_idx = torch.tensor([1, 3]) with torch.no_grad(): peptide_stage = network.forward_peptide_stage(peptide) compact = network.forward_cartesian_from_peptide_stage( peptide_stage, allele_idx, ) # Build the explicit expansion as the reference, calling the # canonical ``forward_from_peptide_stage`` path which always # uses the merged-input cat for skip-connections. expanded_peptide_stage = peptide_stage.unsqueeze(0).expand( len(allele_idx), peptide_stage.shape[0], peptide_stage.shape[-1], ).reshape(len(allele_idx) * peptide_stage.shape[0], peptide_stage.shape[-1]) expanded_alleles = allele_idx.unsqueeze(1).expand( len(allele_idx), peptide_stage.shape[0], ).reshape(-1) expanded = network.forward_from_peptide_stage( expanded_peptide_stage, expanded_alleles, ).reshape(len(allele_idx), peptide_stage.shape[0], -1) np.testing.assert_allclose( compact.detach().cpu().numpy(), expanded.detach().cpu().numpy(), rtol=0, atol=1e-5, ) def test_merge_allele_specific_raises_not_implemented(): _seed_all(5) model_a = _make_simple_affinity_model(max_epochs=1) model_b = _make_simple_affinity_model(max_epochs=1) # Ensure networks exist, matching master expectations for merge(). model_a._network = model_a.make_network( allele_representations=None, **model_a.network_hyperparameter_defaults.subselect(model_a.hyperparameters) ) model_b._network = model_b.make_network( allele_representations=None, **model_b.network_hyperparameter_defaults.subselect(model_b.hyperparameters) ) with pytest.raises(NotImplementedError): Class1NeuralNetwork.merge([model_a, model_b]) def test_merged_network_serialization_preserves_dropout_keep_probability(): _seed_all(23) allele_representations = np.zeros((2, 3, 4), dtype=np.float32) models = [] for _ in range(2): model = Class1NeuralNetwork( dropout_probability=0.8, layer_sizes=[4], allele_dense_layer_sizes=[], peptide_dense_layer_sizes=[], locally_connected_layers=[], batch_normalization=False, dense_layer_l1_regularization=0.0, dense_layer_l2_regularization=0.0, ) model._network = model.make_network( allele_representations=allele_representations, **model.network_hyperparameter_defaults.subselect(model.hyperparameters) ) models.append(model) merged = Class1NeuralNetwork.merge(models) config = merged.get_config() roundtripped = Class1NeuralNetwork.from_config( config, weights=merged.get_weights(), ) network = roundtripped.network() assert isinstance(network, MergedClass1NeuralNetwork) for subnet in network.networks: assert subnet.dropout_probability == pytest.approx(0.8, abs=1e-12) assert subnet.dropouts[0] is not None assert subnet.dropouts[0].p == pytest.approx(0.2, abs=1e-12) def _serialized_merged_pan_network_with_allele_length( sequence_length, peptide_encoding=None): if peptide_encoding is None: peptide_encoding = { "vector_encoding_name": "BLOSUM62", "alignment_method": "pad_middle", "left_edge": 4, "right_edge": 4, "max_length": 15, } allele_representations = np.zeros((2, sequence_length, 21), dtype=np.float32) models = [] for seed in (101, 202): _seed_all(seed) model = Class1NeuralNetwork( allele_amino_acid_encoding="BLOSUM62", peptide_encoding=peptide_encoding, allele_dense_layer_sizes=[3], peptide_dense_layer_sizes=[3], peptide_allele_merge_method="concatenate", peptide_allele_merge_activation="", layer_sizes=[5], locally_connected_layers=[], batch_normalization=False, dense_layer_l1_regularization=0.0, dense_layer_l2_regularization=0.0, dropout_probability=0.0, ) model._network = model.make_network( allele_representations=allele_representations, **model.network_hyperparameter_defaults.subselect(model.hyperparameters) ) model.clear_allele_representations() models.append(model) merged = Class1NeuralNetwork.merge(models, merge_method="concatenate") return merged.get_config(), merged.get_weights() @pytest.mark.parametrize("sequence_length", [34, 37, 39]) def test_merged_network_deserialization_preserves_saved_allele_width( sequence_length): config, weights = _serialized_merged_pan_network_with_allele_length( sequence_length) restored = Class1NeuralNetwork.from_config(config, weights=weights) network = restored.network() assert isinstance(network, MergedClass1NeuralNetwork) for subnet in network.networks: assert tuple(subnet.allele_embedding.weight.shape) == ( 1, sequence_length * 21) def test_cached_merged_networks_include_saved_allele_width_in_key(): Class1NeuralNetwork.clear_model_cache() for sequence_length in (34, 39): config, weights = _serialized_merged_pan_network_with_allele_length( sequence_length) restored = Class1NeuralNetwork.from_config(config, weights=weights) network = restored.network(borrow=True) assert isinstance(network, MergedClass1NeuralNetwork) for subnet in network.networks: assert tuple(subnet.allele_embedding.weight.shape) == ( 1, sequence_length * 21) def test_merged_network_deserialization_ignores_left_pad_peptide_dense_width(): config, weights = _serialized_merged_pan_network_with_allele_length( 39, peptide_encoding={ "vector_encoding_name": "BLOSUM62", "alignment_method": "left_pad_centered_right_pad", "max_length": 15, }, ) restored = Class1NeuralNetwork.from_config(config, weights=weights) network = restored.network() assert isinstance(network, MergedClass1NeuralNetwork) for subnet in network.networks: assert tuple(subnet.allele_embedding.weight.shape) == (1, 39 * 21) def test_pan_network_deserialization_ignores_left_pad_peptide_dense_width(): allele_representations = np.zeros((2, 39, 21), dtype=np.float32) model = Class1NeuralNetwork( allele_amino_acid_encoding="BLOSUM62", peptide_encoding={ "vector_encoding_name": "BLOSUM62", "alignment_method": "left_pad_centered_right_pad", "max_length": 15, }, allele_dense_layer_sizes=[3], peptide_dense_layer_sizes=[3], peptide_allele_merge_method="concatenate", peptide_allele_merge_activation="", layer_sizes=[5], locally_connected_layers=[], batch_normalization=False, dense_layer_l1_regularization=0.0, dense_layer_l2_regularization=0.0, dropout_probability=0.0, ) model._network = model.make_network( allele_representations=allele_representations, **model.network_hyperparameter_defaults.subselect(model.hyperparameters) ) model.clear_allele_representations() config = model.get_config() weights = model.get_weights() network_config = json.loads(config["network_json"]) network_config.pop("allele_representations", None) config["network_json"] = json.dumps(network_config) restored = Class1NeuralNetwork.from_config(config, weights=weights) network = restored.network() assert tuple(network.allele_embedding.weight.shape) == (1, 39 * 21) def test_infer_allele_width_via_position_lookup(): # encoding_dim = 21 for BLOSUM62. With no peptide-stage layers # and no allele_dense layers, weights[0] = allele_embedding. weights = [ np.zeros((1, 39 * 21), dtype=np.float32), # allele_embedding ] hp = {"allele_amino_acid_encoding": "BLOSUM62"} config = {"hyperparameters": {}} assert ( Class1NeuralNetwork._infer_allele_representation_dim_from_weights( weights, hp, network_config=config) == 39 * 21 ) def test_infer_allele_width_real_layout(): # Mirror the real named_parameter order observed at runtime: # peptide_dense (W, b) → allele_dense (W, b) → allele_embedding (W) # → dense_layers (W, b) → output (W, b) weights = [ np.zeros((3, 15 * 21), dtype=np.float32), # peptide_dense W np.zeros((3,), dtype=np.float32), # peptide_dense b np.zeros((3, 39 * 21), dtype=np.float32), # allele_dense W np.zeros((3,), dtype=np.float32), # allele_dense b np.zeros((1, 39 * 21), dtype=np.float32), # allele_embedding W np.zeros((5, 6), dtype=np.float32), # dense_layers W np.zeros((5,), dtype=np.float32), # dense_layers b np.zeros((1, 5), dtype=np.float32), # output W np.zeros((1,), dtype=np.float32), # output b ] hp = {"allele_amino_acid_encoding": "BLOSUM62"} config = {"hyperparameters": { "peptide_dense_layer_sizes": [3], "allele_dense_layer_sizes": [3], }} assert ( Class1NeuralNetwork._infer_allele_representation_dim_from_weights( weights, hp, network_config=config) == 39 * 21 ) def test_infer_allele_width_duplicate_scan_handles_layer_drift(): # An unexpected extra peptide-stage layer slips into the weights # without being counted in the config. The position-based primary # lookup lands on the wrong slot, but the duplicate-shape[1] scan # still finds the allele block (allele_dense + allele_embedding # are the only pair with matching shape[1]). weights = [ np.zeros((3, 15 * 21), dtype=np.float32), # counted peptide_dense W np.zeros((3,), dtype=np.float32), # counted peptide_dense b # Unaccounted extra peptide-stage 2D weight np.zeros((4, 45 * 21), dtype=np.float32), np.zeros((4,), dtype=np.float32), # allele block — shape[1] = 39*21 appears twice np.zeros((3, 39 * 21), dtype=np.float32), # allele_dense W np.zeros((3,), dtype=np.float32), np.zeros((1, 39 * 21), dtype=np.float32), # allele_embedding W np.zeros((5, 6), dtype=np.float32), np.zeros((5,), dtype=np.float32), ] hp = {"allele_amino_acid_encoding": "BLOSUM62"} config = {"hyperparameters": { "peptide_dense_layer_sizes": [3], "allele_dense_layer_sizes": [3], }} assert ( Class1NeuralNetwork._infer_allele_representation_dim_from_weights( weights, hp, network_config=config) == 39 * 21 ) def test_infer_allele_width_ignores_lone_peptide_stage_match(): # With allele_dense present but no embedding weight in the right # place, the duplicate-shape[1] scan should NOT mistake a lone # peptide-stage 2D weight for the allele block. weights = [ np.zeros((3, 45 * 21), dtype=np.float32), # lone peptide_dense W np.zeros((3,), dtype=np.float32), np.zeros((1, 5), dtype=np.float32), # output W ] hp = {"allele_amino_acid_encoding": "BLOSUM62"} config = {"hyperparameters": { "peptide_dense_layer_sizes": [3], "allele_dense_layer_sizes": [3], }} assert ( Class1NeuralNetwork._infer_allele_representation_dim_from_weights( weights, hp, network_config=config) is None ) def test_infer_allele_width_returns_none_for_empty_inputs(): assert ( Class1NeuralNetwork._infer_allele_representation_dim_from_weights( [], {"allele_amino_acid_encoding": "BLOSUM62"}) is None ) assert ( Class1NeuralNetwork._infer_allele_representation_dim_from_weights( [np.zeros((1, 39 * 21), dtype=np.float32)], {}) is None ) def test_dense_regularization_excludes_output_layer(): peptides = ["AAAAAAAAA", "CCCCCCCCC"] _seed_all(17) model = _make_simple_affinity_model( layer_sizes=[], dense_layer_l1_regularization=0.1, dense_layer_l2_regularization=0.2, max_epochs=1, validation_split=0.0, early_stopping=False, ) model._network = model.make_network( allele_representations=None, **model.network_hyperparameter_defaults.subselect(model.hyperparameters) ) affinities = model.predict(peptides) weights_before = [p.detach().cpu().clone() for p in model.network().parameters()] model.fit( peptides, affinities, shuffle_permutation=[0, 1], ) weights_after = [p.detach().cpu().clone() for p in model.network().parameters()] for before, after in zip(weights_before, weights_after): assert torch.allclose(before, after, rtol=0.0, atol=1e-7) def test_processing_validation_uses_last_fraction_and_sample_weights(): _seed_all(19) model = Class1ProcessingNeuralNetwork( max_epochs=1, validation_split=0.5, early_stopping=False, learning_rate=0.0, minibatch_size=2, dropout_rate=0.0, flanking_averages=False, convolutional_kernel_l1_l2=[0.0, 0.0], convolutional_filters=2, convolutional_kernel_size=1, n_flank_length=1, c_flank_length=1, peptide_max_length=8, ) sequences = FlankingEncoding( peptides=["AAAAAAAA", "CCCCCCCC", "DDDDDDDD", "EEEEEEEE"], n_flanks=["Q", "R", "S", "T"], c_flanks=["V", "W", "Y", "A"], ) targets = np.array([1.0, 0.0, 1.0, 0.0], dtype=np.float32) sample_weights = np.array([1.0, 2.0, 3.0, 4.0], dtype=np.float32) shuffle_permutation = np.array([2, 0, 3, 1]) model._network = model.make_network( **model.network_hyperparameter_defaults.subselect(model.hyperparameters) ) network = model.network() network.eval() x_dict = model.network_input(sequences) x_dict = { key: value[shuffle_permutation] for key, value in x_dict.items() } shuffled_targets = targets[shuffle_permutation] shuffled_weights = sample_weights[shuffle_permutation] val_indices = np.arange(len(targets))[2:] with torch.no_grad(): val_inputs = { "sequence": torch.from_numpy(x_dict["sequence"][val_indices]).float(), "peptide_length": torch.from_numpy(x_dict["peptide_length"][val_indices]), } predictions = network(val_inputs) expected = torch.nn.functional.binary_cross_entropy( predictions, torch.from_numpy(shuffled_targets[val_indices]), reduction="none", ) expected = ( expected * torch.from_numpy(shuffled_weights[val_indices]) ).mean().item() model.fit( sequences=sequences, targets=targets, sample_weights=sample_weights, shuffle_permutation=shuffle_permutation, verbose=0, ) assert model.fit_info[-1]["val_loss"][0] == pytest.approx(expected, abs=1e-7) def test_batched_validation_loss_weighted_falls_back_to_single_shot(): class SliceNet(torch.nn.Module): def forward(self, inputs): return inputs["peptide"][:, 0, 0] network = SliceNet() val_peptide = torch.tensor( [[[-0.5]], [[0.0]], [[0.5]], [[1.0]]], dtype=torch.float32 ) val_y = torch.tensor([0.0, 0.1, 0.9, 1.0], dtype=torch.float32) val_weights = torch.tensor([1.0, 10.0, 100.0, 1000.0], dtype=torch.float32) loss_obj = get_pytorch_loss("mse") expected = loss_obj( network({"peptide": val_peptide}), val_y, sample_weights=val_weights, ).item() actual = _batched_validation_loss( network=network, eager_network=network, val_peptide=val_peptide, val_allele=None, val_y=val_y, val_weights=val_weights, loss_obj=loss_obj, batch_size=2, ) assert actual == pytest.approx(expected, abs=1e-7) def test_batched_validation_loss_multiallelic_falls_back_to_single_shot(): class TwoOutputNet(torch.nn.Module): def forward(self, inputs): return inputs["peptide"][:, 0, :2] network = TwoOutputNet() val_peptide = torch.tensor( [ [[0.8, 0.2]], [[0.7, 0.1]], [[0.3, 0.9]], [[0.2, 0.6]], ], dtype=torch.float32, ) val_y = torch.tensor([1.0, 0.0, 1.0, 0.0], dtype=torch.float32) loss_obj = get_pytorch_loss("custom:multiallelic_mass_spec_loss") expected = loss_obj(network({"peptide": val_peptide}), val_y).item() actual = _batched_validation_loss( network=network, eager_network=network, val_peptide=val_peptide, val_allele=None, val_y=val_y, val_weights=None, loss_obj=loss_obj, batch_size=2, ) assert actual == pytest.approx(expected, abs=1e-7) @pytest.mark.parametrize( "loss_name,val_y", [ ( "custom:mse_with_inequalities", torch.tensor([0.0, 2.0, 0.0, 0.0], dtype=torch.float32), ), ( "custom:mse_with_inequalities_and_multiple_outputs", torch.tensor([10.0, 12.0, 10.0, 10.0], dtype=torch.float32), ), ], ) def test_batched_validation_loss_inequality_denominator_matches_single_shot( loss_name, val_y): class TwoOutputNet(torch.nn.Module): def forward(self, inputs): base = inputs["peptide"][:, 0, 0] if "multiple_outputs" not in loss_name: return base return torch.stack([base, base], dim=1) network = TwoOutputNet() val_peptide = torch.tensor( [[[-1.0]], [[0.0]], [[0.0]], [[0.0]]], dtype=torch.float32 ) loss_obj = get_pytorch_loss(loss_name) expected = loss_obj(network({"peptide": val_peptide}), val_y).item() actual = _batched_validation_loss( network=network, eager_network=network, val_peptide=val_peptide, val_allele=None, val_y=val_y, val_weights=None, loss_obj=loss_obj, batch_size=2, ) assert actual == pytest.approx(expected, abs=1e-7) def test_batched_validation_loss_matches_single_shot_with_tail_batch(): class SliceNet(torch.nn.Module): def forward(self, inputs): return inputs["peptide"][:, 0, 0] network = SliceNet() val_peptide = torch.tensor( [[[-0.5]], [[0.0]], [[0.5]], [[1.0]], [[1.5]]], dtype=torch.float32 ) val_y = torch.tensor([0.0, 0.1, 0.9, 1.0, 0.8], dtype=torch.float32) loss_obj = get_pytorch_loss("mse") expected = loss_obj(network({"peptide": val_peptide}), val_y).item() actual = _batched_validation_loss( network=network, eager_network=network, val_peptide=val_peptide, val_allele=None, val_y=val_y, val_weights=None, loss_obj=loss_obj, batch_size=2, ) assert actual == pytest.approx(expected, abs=1e-7) @pytest.mark.parametrize( "loss_name,val_y_factory,description", [ ( "custom:mse_with_inequalities", lambda: torch.tensor( [2.0, 2.0, 0.0, 0.0, 0.0, 0.0], dtype=torch.float32), "inequality rows clustered in first batch", ), ( "custom:mse_with_inequalities", lambda: torch.tensor( [0.0, 0.0, 0.0, 0.0, 2.0, 2.0], dtype=torch.float32), "inequality rows clustered in last batch", ), ( "custom:mse_with_inequalities", lambda: torch.tensor( [0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0], dtype=torch.float32), "single inequality at non-aligned batch boundary", ), ( "custom:mse_with_inequalities", lambda: torch.tensor( [2.0, 2.0, 2.0, 2.0], dtype=torch.float32), "all rows are inequalities", ), ( "custom:mse_with_inequalities_and_multiple_outputs", lambda: torch.tensor( [12.0, 10.0, 22.0, 20.0, 10.0, 20.0], dtype=torch.float32), "inequalities in mixed output indices", ), ], ) def test_batched_validation_loss_inequality_imbalanced_distribution( loss_name, val_y_factory, description): """When ``2.0`` (encoded ``>``) rows are unevenly distributed across batches, naive batch means diverge from the legacy denominator. Verify additive numerator/denominator accumulation stays equal to single-shot.""" val_y = val_y_factory() class StubNet(torch.nn.Module): def __init__(self, multi): super().__init__() self.multi = multi def forward(self, inputs): base = inputs["peptide"][:, 0, 0] if not self.multi: return base return torch.stack([base, base], dim=1) multi = "multiple_outputs" in loss_name network = StubNet(multi=multi) val_peptide = torch.tensor( [[[0.0]]] * len(val_y), dtype=torch.float32) loss_obj = get_pytorch_loss(loss_name) expected = loss_obj(network({"peptide": val_peptide}), val_y).item() actual = _batched_validation_loss( network=network, eager_network=network, val_peptide=val_peptide, val_allele=None, val_y=val_y, val_weights=None, loss_obj=loss_obj, batch_size=2, ) assert actual == pytest.approx(expected, abs=1e-6), ( "batched and single-shot diverge for %s" % description) def test_inequality_loss_exposes_additive_validation_reduction(): """Inequality validation can batch without changing its denominator.""" loss_obj = get_pytorch_loss("custom:mse_with_inequalities") y_true = torch.tensor([0.0, 2.0, 0.5, 0.9], dtype=torch.float32) y_pred = torch.tensor([0.2, 0.1, 0.4, 0.8], dtype=torch.float32) numerator, denominator = loss_obj.loss_numerator_and_denominator( y_pred, y_true) assert numerator / torch.clamp(denominator, min=1.0) == pytest.approx( loss_obj(y_pred, y_true).item()) def test_batched_validation_loss_multi_output_inequality_only_in_one_output(): """Inequality markers in one output index only — batched must still match single-shot. Tests the decoding logic that splits the encoded ``y / 10`` index from the residual target value.""" val_y = torch.tensor([12.0, 10.0, 21.0, 20.0], dtype=torch.float32) class TwoOutputNet(torch.nn.Module): def forward(self, inputs): base = inputs["peptide"][:, 0, 0] return torch.stack([base, base], dim=1) network = TwoOutputNet() val_peptide = torch.tensor( [[[0.4]], [[0.5]], [[0.6]], [[0.7]]], dtype=torch.float32) loss_obj = get_pytorch_loss( "custom:mse_with_inequalities_and_multiple_outputs") expected = loss_obj(network({"peptide": val_peptide}), val_y).item() actual = _batched_validation_loss( network=network, eager_network=network, val_peptide=val_peptide, val_allele=None, val_y=val_y, val_weights=None, loss_obj=loss_obj, batch_size=2, ) assert actual == pytest.approx(expected, abs=1e-6) def test_validation_forward_network_uses_eager_by_default(monkeypatch): compiled = object() eager = object() monkeypatch.delenv("MHCFLURRY_TORCH_COMPILE_VALIDATION", raising=False) assert validation_forward_network(compiled, eager) is eager monkeypatch.setenv("MHCFLURRY_TORCH_COMPILE_VALIDATION", "1") assert validation_forward_network(compiled, eager) is compiled def test_optimizer_defaults_match_keras(): affinity_model = _make_simple_affinity_model(optimizer="rmsprop") affinity_model._network = affinity_model.make_network( allele_representations=None, **affinity_model.network_hyperparameter_defaults.subselect( affinity_model.hyperparameters ) ) affinity_optimizer = affinity_model._create_optimizer(affinity_model.network()) assert isinstance(affinity_optimizer, KerasRMSprop) assert affinity_optimizer.defaults["rho"] == pytest.approx(0.9) assert affinity_optimizer.defaults["epsilon"] == pytest.approx(1e-7) processing_model = Class1ProcessingNeuralNetwork( optimizer="adam", learning_rate=0.001, ) processing_model._network = processing_model.make_network( **processing_model.network_hyperparameter_defaults.subselect( processing_model.hyperparameters ) ) processing_optimizer = processing_model._create_optimizer( processing_model.network() ) assert isinstance(processing_optimizer, KerasAdam) assert processing_optimizer.defaults["beta_1"] == pytest.approx(0.9) assert processing_optimizer.defaults["beta_2"] == pytest.approx(0.999) assert processing_optimizer.defaults["epsilon"] == pytest.approx(1e-7) native_affinity = _make_simple_affinity_model( optimizer="rmsprop", optimizer_implementation="pytorch", ) native_affinity._network = native_affinity.make_network( allele_representations=None, **native_affinity.network_hyperparameter_defaults.subselect( native_affinity.hyperparameters ), ) native_optimizer = native_affinity._create_optimizer(native_affinity.network()) assert isinstance(native_optimizer, torch.optim.RMSprop) def test_keras_rmsprop_matches_historical_update_equation(): parameter = torch.nn.Parameter(torch.tensor([1.0, -2.0], dtype=torch.float64)) optimizer = KerasRMSprop([parameter], lr=0.001, rho=0.9, epsilon=1e-7) velocity = np.zeros(2) expected = parameter.detach().numpy().copy() for gradient in (np.array([0.25, -0.5]), np.array([-0.1, 0.2])): velocity = 0.9 * velocity + 0.1 * gradient ** 2 expected -= 0.001 * gradient / np.sqrt(velocity + 1e-7) parameter.grad = torch.from_numpy(gradient) optimizer.step() np.testing.assert_allclose(parameter.detach().numpy(), expected, rtol=0, atol=1e-15) def test_keras_adam_matches_historical_update_equation(): parameter = torch.nn.Parameter(torch.tensor([1.0, -2.0], dtype=torch.float64)) optimizer = KerasAdam( [parameter], lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-7, ) momentum = np.zeros(2) velocity = np.zeros(2) expected = parameter.detach().numpy().copy() for step, gradient in enumerate( (np.array([0.25, -0.5]), np.array([-0.1, 0.2])), start=1, ): momentum = 0.9 * momentum + 0.1 * gradient velocity = 0.999 * velocity + 0.001 * gradient ** 2 alpha = 0.001 * np.sqrt(1.0 - 0.999 ** step) / (1.0 - 0.9 ** step) expected -= alpha * momentum / (np.sqrt(velocity) + 1e-7) parameter.grad = torch.from_numpy(gradient) optimizer.step() np.testing.assert_allclose(parameter.detach().numpy(), expected, rtol=0, atol=1e-15) def test_processing_initializers_match_keras(monkeypatch): initialized_shapes = [] def record_xavier(tensor): initialized_shapes.append(tuple(tensor.shape)) return torch.nn.init.constant_(tensor, 0.125) monkeypatch.setattr(torch.nn.init, "xavier_uniform_", record_xavier) model = Class1ProcessingModel( sequence_dims=(41, 21), peptide_max_length=15, n_flank_length=15, c_flank_length=15, flanking_averages=True, convolutional_filters=8, convolutional_kernel_size=11, convolutional_activation="tanh", convolutional_kernel_l1_l2=(0.0, 0.0), dropout_rate=0.3, post_convolutional_dense_layer_sizes=[4], ) trainable_layers = [ module for module in model.modules() if isinstance(module, (torch.nn.Conv1d, torch.nn.Linear)) ] assert len(initialized_shapes) == len(trainable_layers) assert all(torch.count_nonzero(layer.bias) == 0 for layer in trainable_layers) assert torch.all(model.output_layer.weight == 1) assert all( torch.all(layer.weight == 0.125) for layer in trainable_layers if layer is not model.output_layer ) def test_weight_and_embedding_updates_preserve_device(): device = torch.device("cuda" if torch.cuda.is_available() else "cpu") affinity_model = _make_simple_affinity_model(batch_normalization=True) affinity_model._network = affinity_model.make_network( allele_representations=_make_allele_representations(), **affinity_model.network_hyperparameter_defaults.subselect( affinity_model.hyperparameters ) ) affinity_network = affinity_model.network() affinity_network.to(device) affinity_network.set_weights_list( affinity_network.get_weights_list(), auto_convert_keras=False, ) assert all(param.device == device for param in affinity_network.parameters()) assert all(buffer.device == device for buffer in affinity_network.buffers()) affinity_model.set_allele_representations(_make_allele_representations(3)) assert affinity_network.allele_embedding.weight.device == device affinity_model.clear_allele_representations() assert affinity_network.allele_embedding.weight.device == device processing_model = Class1ProcessingNeuralNetwork( dropout_rate=0.0, flanking_averages=False, convolutional_kernel_l1_l2=[0.0, 0.0], convolutional_filters=2, convolutional_kernel_size=1, n_flank_length=1, c_flank_length=1, peptide_max_length=8, ) processing_model._network = processing_model.make_network( **processing_model.network_hyperparameter_defaults.subselect( processing_model.hyperparameters ) ) processing_network = processing_model.network() processing_network.to(device) processing_network.set_weights_list( processing_network.get_weights_list(), auto_convert_keras=False, ) assert all(param.device == device for param in processing_network.parameters()) assert all(buffer.device == device for buffer in processing_network.buffers()) def test_cached_keras_weight_reload_preserves_device(): data_dir = os.path.join(os.path.dirname(__file__), "data") config_path = os.path.join(data_dir, "master_affinity_fixture_config.json") weights_path = os.path.join(data_dir, "master_affinity_fixture_weights.npz") with open(config_path, "r") as inp: config = json.load(inp) weights = load_weights(weights_path) reloaded_weights = [w.copy() for w in weights] device = torch.device("cuda" if torch.cuda.is_available() else "cpu") Class1NeuralNetwork.clear_model_cache() first_model = Class1NeuralNetwork.from_config(config, weights=weights) first_network = first_model.network(borrow=True) first_network.to(device) second_model = Class1NeuralNetwork.from_config(config, weights=reloaded_weights) second_network = second_model.network(borrow=True) assert second_network is first_network assert all(param.device == device for param in second_network.parameters()) assert all(buffer.device == device for buffer in second_network.buffers()) def test_l1_regularization_changes_weights_even_with_zero_data_loss(): peptides = ["AAAAAAAAA", "CCCCCCCCC"] _seed_all(13) model = _make_simple_affinity_model( dense_layer_l1_regularization=0.1, dense_layer_l2_regularization=0.0, max_epochs=1, validation_split=0.0, early_stopping=False, ) # Build network explicitly so we can read weights before fitting. model._network = model.make_network( allele_representations=None, **model.network_hyperparameter_defaults.subselect(model.hyperparameters) ) affinities = model.predict(peptides) weights_before = [p.detach().cpu().clone() for p in model.network().parameters()] model.fit( peptides, affinities, shuffle_permutation=[0, 1], ) weights_after = [p.detach().cpu().clone() for p in model.network().parameters()] changed = any( not torch.allclose(before, after, rtol=0.0, atol=1e-7) for before, after in zip(weights_before, weights_after) ) assert changed def test_fit_validation_cache_rejects_unsorted_val_indices_with_straddling_values(): """The val_cache_safe check must inspect ALL val_indices, not just the first. Regression test: an earlier version of the code only checked ``val_indices[0] >= num_random_negatives``. That's unsafe if val_indices is unsorted — sklearn's ``train_test_split`` can produce ``[400, 3, 500, ...]`` where 400 passes the first-element check but 3 indexes into the random-negative portion (which mutates per epoch). Caching tensors slice from a mixed range would produce stale validation data. We don't reach into the training loop — just call the standalone predicate the code uses. The invariant we assert: the check must return False when ANY val index is below num_random_negatives. """ # Simulate the exact check in class1_neural_network.fit() # (see comment near ``_val_cache_safe``). Using bool(numpy.all(...)) # because numpy.bool is not the same as Python bool. num_random_negatives = 100 good = np.array([500, 600, 700], dtype=np.int64) mixed = np.array([500, 3, 700], dtype=np.int64) # UNSORTED + straddles bad = np.array([3, 4, 5], dtype=np.int64) def cache_safe(val_indices, nrn): return ( val_indices is not None and len(val_indices) > 0 and bool(np.all(val_indices >= nrn)) ) assert cache_safe(good, num_random_negatives) is True assert cache_safe(mixed, num_random_negatives) is False, ( "cache_safe must be False when ANY val index is below " "num_random_negatives, regardless of ordering" ) assert cache_safe(bad, num_random_negatives) is False def test_old_model_config_loads_with_new_features_added(): """Regression: adding new hyperparameters must not break old-model load. Simulates a 2.2.0-vintage model config that does NOT carry any of the post-2.2.0 additions (``validation_batch_size``, ``dataloader_num_workers``, ``fit_dataloader_backing``) and uses the atomic ``"BLOSUM62"`` encoding. Loading must succeed and produce a network whose hyperparameters populate the new fields from defaults. If this test ever fails, something broke the ``HyperparameterDefaults.with_defaults`` fallback chain OR a newly- added hyperparameter was declared without a default — both would silently break loading of all public mhcflurry models in the wild. """ # Minimal legacy-style config — only the fields that existed in the # public 2.2.0 training hyperparameters. No validation_batch_size, # no dataloader_num_workers, no fit_dataloader_backing, no compile flags. legacy_config = { "hyperparameters": { "layer_sizes": [4], "peptide_dense_layer_sizes": [], "allele_dense_layer_sizes": [], "locally_connected_layers": [], "peptide_allele_merge_method": "concatenate", "peptide_allele_merge_activation": "", "topology": "feedforward", "peptide_encoding": { "vector_encoding_name": "BLOSUM62", "alignment_method": "pad_middle", "max_length": 15, }, "peptide_amino_acid_encoding": "BLOSUM62", # legacy-renamed key "max_epochs": 5, "minibatch_size": 128, # old default, not 512 "optimizer": "rmsprop", "activation": "tanh", "output_activation": "sigmoid", "loss": "custom:mse_with_inequalities", "init": "glorot_uniform", "batch_normalization": False, "dropout_probability": 0.0, "dense_layer_l1_regularization": 0.0, "dense_layer_l2_regularization": 0.0, "validation_split": 0.1, "early_stopping": False, "learning_rate": 0.001, }, } # Must not raise — new fields get defaults, legacy-renamed key gets dropped. net = Class1NeuralNetwork.from_config(legacy_config) # New fields populated by defaults: assert "validation_batch_size" in net.hyperparameters assert "dataloader_num_workers" in net.hyperparameters # ``fit_dataloader_backing`` is no longer a live hyperparameter; # legacy configs that set it must still load — the rename table # drops the key silently. assert "fit_dataloader_backing" not in net.hyperparameters # Legacy-renamed key dropped, not raised: assert "peptide_amino_acid_encoding" not in net.hyperparameters # Atomic encoding now uses the torch-side lookup by default, so peptide # network input is compact integer indices while the network itself still # expands to BLOSUM62 vectors internally. assert net.uses_peptide_torch_encoding() peptide_shape = net.peptides_to_network_input(["SIINFEKL"]).shape assert peptide_shape == (1, 15), f"got {peptide_shape}" def test_min_delta_not_silently_dropped_on_load(): """Regression: loading a config with explicit min_delta must preserve it. An old version of the rename table had ``min_delta → None`` which would silently drop the value before HyperparameterDefaults applied its default. This broke early-stopping behavior for any saved model that didn't use the default min_delta=0.0. """ config = { "hyperparameters": { "layer_sizes": [4], "peptide_dense_layer_sizes": [], "allele_dense_layer_sizes": [], "locally_connected_layers": [], "peptide_encoding": { "vector_encoding_name": "BLOSUM62", "alignment_method": "pad_middle", "max_length": 15, }, "peptide_allele_merge_method": "concatenate", "peptide_allele_merge_activation": "", "topology": "feedforward", "max_epochs": 10, "patience": 5, "min_delta": 0.01, # <-- explicit non-default value "minibatch_size": 128, "optimizer": "adam", "activation": "tanh", "output_activation": "sigmoid", "loss": "custom:mse_with_inequalities", "init": "glorot_uniform", "batch_normalization": False, "dropout_probability": 0.0, "dense_layer_l1_regularization": 0.0, "dense_layer_l2_regularization": 0.0, "validation_split": 0.1, "early_stopping": True, "learning_rate": 0.001, }, } net = Class1NeuralNetwork.from_config(config) assert net.hyperparameters["min_delta"] == 0.01, ( f"min_delta was silently dropped: got {net.hyperparameters['min_delta']}" ) mhcflurry-2.3.6/test/test_random_negative_peptides.py000066400000000000000000000651551525677230600232150ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Tests for random negative peptide generation.""" import numpy import pandas import math import pytest from mhcflurry.common import random_peptides from mhcflurry.random_negative_peptides import ( RandomNegativePeptides, RandomNegativesPool, ) def test_random_negative_peptides_by_allele_equalize_nonbinders(): planner = RandomNegativePeptides( random_negative_method="by_allele", random_negative_binder_threshold=500, random_negative_rate=1.0, random_negative_constant=2) data_rows = [ ("HLA-A*02:01", "SIINFEKL", 400, "="), ("HLA-A*02:01", "SIINFEKLL", 300, "="), ("HLA-A*02:01", "SIINFEKLL", 300, "="), ("HLA-A*02:01", "SIINFEKLQ", 1000, "="), ("HLA-A*02:01", "SIINFEKLZZ", 12000, ">"), ] for peptide in random_peptides(1000, length=9): data_rows.append(("HLA-B*44:02", peptide, 100, "=")) for peptide in random_peptides(1000, length=9): data_rows.append(("HLA-B*44:02", peptide, 1000, "=")) for peptide in random_peptides(5, length=10): data_rows.append(("HLA-B*44:02", peptide, 100, "=")) data = pandas.DataFrame( data_rows, columns=["allele", "peptide", "affinity", "inequality"]) data["length"] = data.peptide.str.len() planner.plan( peptides=data.peptide.values, affinities=data.affinity.values, alleles=data.allele.values, inequalities=data.inequality.values) result_df = pandas.DataFrame({ "allele": planner.get_alleles(), "peptide": planner.get_peptides(), }) result_df["length"] = result_df.peptide.str.len() random_negatives = result_df.groupby(["allele", "length"]).peptide.count().unstack() data.groupby(["allele", "length"]).peptide.count().unstack().fillna(0) data.loc[ data.affinity <= 500 ].groupby(["allele", "length"]).peptide.count().unstack().fillna(0) real_nonbinders = data.loc[ data.affinity > 500 ].groupby(["allele", "length"]).peptide.count().unstack().fillna(0) random_negatives + real_nonbinders assert (random_negatives.loc["HLA-A*02:01"] == 1.0).all() assert (random_negatives.loc["HLA-B*44:02"] == math.ceil(1007 / 8)).all(), ( random_negatives.loc["HLA-B*44:02"], math.ceil(1007 / 8)) def test_random_negative_peptides_by_allele(): planner = RandomNegativePeptides( random_negative_method="by_allele_equalize_nonbinders", random_negative_binder_threshold=500, random_negative_rate=1.0, random_negative_constant=2) data_rows = [ ("HLA-A*02:01", "SIINFEKL", 400, "="), ("HLA-A*02:01", "SIINFEKLL", 300, "="), ("HLA-A*02:01", "SIINFEKLL", 300, "="), ("HLA-A*02:01", "SIINFEKLQ", 1000, "="), ("HLA-A*02:01", "SIINFEKLZZ", 12000, ">"), ("HLA-C*01:02", "SIINFEKLQ", 100, "="), # only binders ("HLA-C*07:02", "SIINFEKLL", 1000, "=") # only non-binders ] for peptide in random_peptides(1000, length=9): data_rows.append(("HLA-B*44:02", peptide, 100, "=")) for peptide in random_peptides(1000, length=9): data_rows.append(("HLA-B*44:02", peptide, 1000, "=")) for peptide in random_peptides(5, length=10): data_rows.append(("HLA-B*44:02", peptide, 100, "=")) data = pandas.DataFrame( data_rows, columns=["allele", "peptide", "affinity", "inequality"]) data["length"] = data.peptide.str.len() planner.plan( peptides=data.peptide.values, affinities=data.affinity.values, alleles=data.allele.values, inequalities=data.inequality.values) result_df = pandas.DataFrame({ "allele": planner.get_alleles(), "peptide": planner.get_peptides(), }) result_df["length"] = result_df.peptide.str.len() random_negatives = result_df.groupby(["allele", "length"]).peptide.count().unstack() real_data = data.groupby(["allele", "length"]).peptide.count().unstack().fillna(0) data.loc[ data.affinity <= 500 ].groupby(["allele", "length"]).peptide.count().unstack().fillna(0) real_nonbinders = data.loc[ data.affinity > 500 ].groupby(["allele", "length"]).peptide.count().unstack().fillna(0) for length in random_negatives.columns: if length not in real_nonbinders.columns: real_nonbinders[length] = 0 total_nonbinders = ( random_negatives.reindex(real_data.index).fillna(0) + real_nonbinders.reindex(real_data.index).fillna(0)) assert (total_nonbinders.loc["HLA-A*02:01"] == 2.0).all(), total_nonbinders assert (total_nonbinders.loc["HLA-B*44:02"] == 1126).all(), total_nonbinders assert not total_nonbinders.isnull().any().any() def _planner_for_pool_tests(): planner = RandomNegativePeptides( random_negative_rate=1.0, random_negative_constant=0, random_negative_method="by_length", random_negative_lengths=[9], ) planner.plan( peptides=[ "SIINFEKLA", "GILGFVFTL", "SLYNTVATL", "NLVPMVATV", ], affinities=[10.0, 100.0, 1000.0, 5000.0], ) return planner def _tag_encoder(encodable_sequences): # Trivial encoder for the pool tests — we care about slicing/determinism, # not the actual encoding. Treat each peptide string as one row. return numpy.array(list(encodable_sequences.sequences), dtype=object) def test_random_negatives_pool_pool_epochs_one_is_per_epoch(): # With pool_epochs=1 every epoch triggers a rebuild, so the slice # returned for each consecutive epoch is a fresh draw (different # peptides on every call). planner = _planner_for_pool_tests() pool = RandomNegativesPool(planner, _tag_encoder, pool_epochs=1, seed=None) epoch0 = pool.get_epoch_inputs(0)[1] epoch1 = pool.get_epoch_inputs(1)[1] assert len(epoch0) == planner.get_total_count() assert len(epoch1) == planner.get_total_count() # Not a strict guarantee across RNG states, but extremely likely # for 4 9-mers drawn independently. assert not numpy.array_equal(epoch0, epoch1), ( "pool_epochs=1 must regenerate every epoch" ) def test_random_negatives_pool_within_cycle_slices_are_distinct(): planner = _planner_for_pool_tests() pool = RandomNegativesPool(planner, _tag_encoder, pool_epochs=3, seed=1234) total = planner.get_total_count() e0 = pool.get_epoch_inputs(0)[1] e1 = pool.get_epoch_inputs(1)[1] e2 = pool.get_epoch_inputs(2)[1] assert len(e0) == total and len(e1) == total and len(e2) == total # Three slices inside a single cycle must be disjoint sections of the # pool — not duplicates of each other. assert not numpy.array_equal(e0, e1) assert not numpy.array_equal(e1, e2) assert not numpy.array_equal(e0, e2) def test_random_negatives_pool_cycle_boundary_triggers_rebuild(): planner = _planner_for_pool_tests() pool = RandomNegativesPool(planner, _tag_encoder, pool_epochs=3, seed=1234) e0 = pool.get_epoch_inputs(0)[1] # Epoch 3 is the first epoch of cycle 1 → new seed → new peptides. e3 = pool.get_epoch_inputs(3)[1] assert not numpy.array_equal(e0, e3) def test_random_negatives_pool_deterministic_with_seed(): planner = _planner_for_pool_tests() pool_a = RandomNegativesPool(planner, _tag_encoder, pool_epochs=5, seed=7) pool_b = RandomNegativesPool(planner, _tag_encoder, pool_epochs=5, seed=7) for epoch in [0, 2, 9, 12]: numpy.testing.assert_array_equal( pool_a.get_epoch_inputs(epoch)[1], pool_b.get_epoch_inputs(epoch)[1], ) def test_random_negatives_pool_different_seeds_diverge(): planner = _planner_for_pool_tests() pool_a = RandomNegativesPool(planner, _tag_encoder, pool_epochs=5, seed=7) pool_b = RandomNegativesPool(planner, _tag_encoder, pool_epochs=5, seed=8) # Two workers with different seeds must see different random-negative # content — preserves cross-worker diversity when the pool is shared # across epochs within a worker. assert not numpy.array_equal( pool_a.get_epoch_inputs(0)[1], pool_b.get_epoch_inputs(0)[1], ) def test_fit_end_to_end_pool_epochs_one_draws_from_global_rng(monkeypatch): """End-to-end behavioral: calling ``Class1NeuralNetwork.fit`` with ``random_negative_pool_epochs=1`` must draw random negatives from numpy's global state regardless of the ``random_negative_seed`` kwarg. Without this guarantee the training driver's SHA1-mixed seed would silently flip default training to deterministic-per-work-item. """ import numpy as np from mhcflurry.class1_neural_network import Class1NeuralNetwork from mhcflurry.common import random_peptides as random_peptides_fn # Spy on the planner's get_peptides to capture the ``rng`` kwarg. captured_rngs = [] from mhcflurry.random_negative_peptides import RandomNegativePeptides real_get_peptides = RandomNegativePeptides.get_peptides def spy_get_peptides(self, rng=None): captured_rngs.append(rng) return real_get_peptides(self, rng=rng) monkeypatch.setattr( RandomNegativePeptides, "get_peptides", spy_get_peptides, ) hp = dict( activation="tanh", layer_sizes=[8], max_epochs=1, early_stopping=False, validation_split=0.0, locally_connected_layers=[], dense_layer_l1_regularization=0.0, dropout_probability=0.0, random_negative_rate=1.0, random_negative_constant=0, random_negative_method="by_length", random_negative_lengths=[9], # Default path. random_negative_pool_epochs=1, # Pin host backing: the device-resident pool path samples # via torch.multinomial directly (skipping # planner.get_peptides), which would defeat the spy. The # rng=None contract on the device path is covered separately # by test_random_negatives_pool_device_mode_seeded_reproducible. fit_tensor_residency="host", ) peptides = random_peptides_fn(16, length=9) affinities = np.random.uniform(10, 50000, 16) predictor = Class1NeuralNetwork(**hp) try: predictor.fit( peptides, affinities, seed=424242, # driver passed a master seed verbose=0, ) except Exception: # Downstream may hiccup on this tiny harness — the seed # bypass happens BEFORE training, so the planner call we're # spying on has already fired. pass # At least one get_peptides call must have happened. assert captured_rngs, "spy never saw a planner.get_peptides call" # Every rng must be None — at pool_epochs=1 the pool routes through # numpy's global RNG (which fit() seeds from the master seed up front), # rather than building a per-cycle seeded default_rng. If any is a # default_rng instance, the global-RNG contract is broken. non_none = [r for r in captured_rngs if r is not None] assert not non_none, ( "fit() with pool_epochs=1 must call planner.get_peptides(rng=None) " "to preserve global-RNG semantics, but saw " f"{len(non_none)} seeded calls: {non_none[:2]}" ) def test_fit_ignores_random_negative_seed_when_pool_epochs_is_one(): """When ``random_negative_pool_epochs=1`` the default-path pool must stay on numpy's global RNG stream regardless of any ``random_negative_seed`` the training driver passes through. Otherwise the pool primitive would silently make default-path training deterministic-per-work-item, which is a prediction-affecting change not a speed optimization. """ # Simulate what fit() does internally at pool_epochs=1. The # ``fit()`` bypass is the single line ``pool_seed = seed if # pool_epochs > 1 else None`` — we pin the bypass math here # directly so any regression to unconditional seeding fails the # test instead of silently leaking into training. pool_epochs = 1 random_negative_seed = 12345 # training driver derived bypass_seed = random_negative_seed if pool_epochs > 1 else None assert bypass_seed is None, ( "fit() should ignore random_negative_seed when pool_epochs=1; " "otherwise the default path silently becomes deterministic" ) # And the seeded path only activates when pool_epochs > 1. pool_epochs = 100 bypass_seed = random_negative_seed if pool_epochs > 1 else None assert bypass_seed == random_negative_seed # --- Device-resident RN encoder --------------------------------------- def _placement_planner(): planner = RandomNegativePeptides( random_negative_method="by_allele", random_negative_rate=1.0, random_negative_constant=2, ) data_rows = [("HLA-A*02:01", "SIINFEKL", 400, "=")] for peptide in random_peptides(20, length=9): data_rows.append(("HLA-A*02:01", peptide, 100, "=")) for peptide in random_peptides(20, length=10): data_rows.append(("HLA-B*07:02", peptide, 1000, "=")) data = pandas.DataFrame( data_rows, columns=["allele", "peptide", "affinity", "inequality"]) planner.plan( peptides=data.peptide.values, affinities=data.affinity.values, alleles=data.allele.values, inequalities=data.inequality.values) return planner def test_alignment_left_pad_centered_right_pad_matches_host(): """The device alignment helper must produce row-for-row output equal to ``EncodableSequences.sequences_to_fixed_length_index_encoded_array`` when fed the same per-length index blocks. Bypass the RNG by handing pre-chosen indices to both paths.""" import torch from mhcflurry.encodable_sequences import EncodableSequences from mhcflurry.random_negative_peptides import _place_indices_with_alignment from mhcflurry import amino_acid max_length = 15 encoded_length = 3 * max_length rng = numpy.random.default_rng(42) for length in [5, 9, 12, 15]: count = 7 # Sample integer indices in [0, 19] (skip X) directly — this is # what the device path will do post-multinomial. indices = rng.integers(0, 20, size=(count, length), dtype=numpy.int8) peptides = [amino_acid.indices_to_peptide(row) for row in indices] host = EncodableSequences.create( peptides ).variable_length_to_fixed_length_categorical( alignment_method="left_pad_centered_right_pad", max_length=max_length, ) device = torch.full( (count, encoded_length), int(amino_acid.X_INDEX), dtype=torch.int8, ) block = torch.from_numpy(indices) _place_indices_with_alignment( device, block, length=length, alignment="left_pad_centered_right_pad", max_length=max_length, ) numpy.testing.assert_array_equal(device.numpy(), host) def test_alignment_left_pad_centered_right_pad_rejects_short_lengths(): """Device path must reject lengths < 5 for left_pad_centered_right_pad, matching the reference encoder's arbitrary min_length=5, so host and device agree on which lengths are supported instead of the device silently encoding lengths 1..4.""" import torch from mhcflurry.random_negative_peptides import _place_indices_with_alignment from mhcflurry import amino_acid max_length = 15 encoded_length = 3 * max_length for length in [1, 2, 3, 4]: out = torch.full( (2, encoded_length), int(amino_acid.X_INDEX), dtype=torch.int8) block = torch.zeros((2, length), dtype=torch.int8) with pytest.raises(ValueError, match="left_pad_centered_right_pad"): _place_indices_with_alignment( out, block, length=length, alignment="left_pad_centered_right_pad", max_length=max_length, ) def test_random_negative_match_distribution_excludes_x(): """The aa_distribution used for random negatives must exclude X (and any letter mapping to the X/unknown index) and renormalize, so the host sampler (random_peptides) and the device sampler (aa_distribution_to_index_weights, which already drops X) agree. Without this, training peptides containing X would let the host path emit X in negatives while the device path never would.""" planner = RandomNegativePeptides( random_negative_method="by_allele", random_negative_binder_threshold=500, random_negative_rate=1.0, random_negative_constant=2, random_negative_match_distribution=True) data_rows = [ ("HLA-A*02:01", "SIINFEKLX", 1000, "="), ("HLA-A*02:01", "XIINFEKL", 1000, "="), ("HLA-A*02:01", "SIINFEKL", 100, "="), ] for peptide in random_peptides(50, length=9): data_rows.append(("HLA-A*02:01", peptide, 100, "=")) data = pandas.DataFrame( data_rows, columns=["allele", "peptide", "affinity", "inequality"]) planner.plan( peptides=data.peptide.values, affinities=data.affinity.values, alleles=data.allele.values, inequalities=data.inequality.values) assert planner.aa_distribution is not None assert "X" not in planner.aa_distribution.index numpy.testing.assert_allclose(planner.aa_distribution.sum(), 1.0) # End to end: generated negatives never contain X. assert not any("X" in peptide for peptide in planner.get_peptides()) def test_random_negative_match_distribution_all_x_raises(): """If every residue maps to X there are no common amino acids left to sample from after the X-drop; plan() should raise a clear error rather than divide by zero when normalizing the (empty) distribution.""" planner = RandomNegativePeptides( random_negative_method="by_allele", random_negative_binder_threshold=500, random_negative_rate=1.0, random_negative_constant=2, random_negative_match_distribution=True) data = pandas.DataFrame( [ ("HLA-A*02:01", "XXXXXXXX", 1000, "="), ("HLA-A*02:01", "XXXXXXXXX", 1000, "="), ], columns=["allele", "peptide", "affinity", "inequality"]) with pytest.raises(ValueError, match="no common amino acids"): planner.plan( peptides=data.peptide.values, affinities=data.affinity.values, alleles=data.allele.values, inequalities=data.inequality.values) def test_alignment_pad_middle_matches_host(): import torch from mhcflurry.encodable_sequences import EncodableSequences from mhcflurry.random_negative_peptides import _place_indices_with_alignment from mhcflurry import amino_acid max_length = 15 left_edge = 4 right_edge = 4 rng = numpy.random.default_rng(7) for length in [8, 9, 11, 15]: count = 5 indices = rng.integers(0, 20, size=(count, length), dtype=numpy.int8) peptides = [amino_acid.indices_to_peptide(row) for row in indices] host = EncodableSequences.create( peptides ).variable_length_to_fixed_length_categorical( alignment_method="pad_middle", max_length=max_length, left_edge=left_edge, right_edge=right_edge, ) device = torch.full( (count, max_length), int(amino_acid.X_INDEX), dtype=torch.int8, ) block = torch.from_numpy(indices) _place_indices_with_alignment( device, block, length=length, alignment="pad_middle", max_length=max_length, left_edge=left_edge, right_edge=right_edge, ) numpy.testing.assert_array_equal(device.numpy(), host) def test_encode_random_negatives_on_device_shape_and_dtype(): """Layout/shape contract for the device encoder. Doesn't compare RNG streams (numpy vs torch generators); checks that shape, dtype, and the per-(allele, length) row layout match what the host path produces row-for-row when given the same index source via ``_place_indices_with_alignment``. """ import torch from mhcflurry.random_negative_peptides import ( encode_random_negatives_on_device, ) planner = _placement_planner() pool_epochs = 3 encoding = {"alignment_method": "left_pad_centered_right_pad", "max_length": 15} gen = torch.Generator(device="cpu") gen.manual_seed(123) out = encode_random_negatives_on_device( planner=planner, pool_epochs=pool_epochs, peptide_encoding=encoding, device="cpu", generator=gen, ) total = planner.get_total_count() assert out.shape == (pool_epochs * total, 3 * 15) assert out.dtype == torch.int8 # All sampled indices must be in the 20-AA range, never X (= 20). common_max = len(_amino_acid_module().COMMON_AMINO_ACIDS) - 1 sampled_mask = out != int(_amino_acid_module().X_INDEX) assert (out[sampled_mask] >= 0).all() assert (out[sampled_mask] <= common_max).all() def test_encode_random_negatives_on_device_reuses_out_buffer(): """Device-resident fit allocates the RN buffer once and refills it per cycle. The encoder must accept the buffer and overwrite it cleanly (no leftover values from the previous cycle).""" import torch from mhcflurry.random_negative_peptides import ( encode_random_negatives_on_device, ) planner = _placement_planner() pool_epochs = 2 encoding = {"alignment_method": "left_pad_centered_right_pad", "max_length": 15} total = planner.get_total_count() out = torch.zeros( (pool_epochs * total, 3 * 15), dtype=torch.int8, device="cpu", ) out_id = id(out) out.fill_(99) # sentinel gen = torch.Generator(device="cpu") gen.manual_seed(0) encode_random_negatives_on_device( planner=planner, pool_epochs=pool_epochs, peptide_encoding=encoding, device="cpu", generator=gen, out=out, ) assert id(out) == out_id # in-place # No leftover sentinel values. assert (out != 99).any() # Re-encoding into the same buffer with a different seed produces # different content (no stale carry-over), and the buffer identity # is preserved. snapshot = out.clone() gen2 = torch.Generator(device="cpu") gen2.manual_seed(99) encode_random_negatives_on_device( planner=planner, pool_epochs=pool_epochs, peptide_encoding=encoding, device="cpu", generator=gen2, out=out, ) assert id(out) == out_id assert not torch.equal(out, snapshot) def test_encode_random_negatives_on_device_unsupported_alignment(): import pytest from mhcflurry.random_negative_peptides import ( encode_random_negatives_on_device, supports_device_random_negative_encoding, ) planner = _placement_planner() unsupported = {"alignment_method": "left_pad_right_pad", "max_length": 15} assert supports_device_random_negative_encoding({ "alignment_method": "left_pad_centered_right_pad", "max_length": 15, }) assert not supports_device_random_negative_encoding(unsupported) with pytest.raises(NotImplementedError, match="alignment_method"): encode_random_negatives_on_device( planner=planner, pool_epochs=1, peptide_encoding=unsupported, device="cpu", ) def _amino_acid_module(): from mhcflurry import amino_acid as aa return aa def test_random_negatives_pool_device_mode_returns_tensor(): """Device-mode pool stores a torch.Tensor and returns torch slices from get_epoch_inputs. Peptide strings are not materialized.""" import torch planner = _placement_planner() encoding = {"alignment_method": "left_pad_centered_right_pad", "max_length": 15} pool = RandomNegativesPool( planner=planner, peptide_encoder=None, pool_epochs=2, seed=7, device="cpu", peptide_encoding=encoding, ) peptides, encoded = pool.get_epoch_inputs(0) assert peptides is None assert isinstance(encoded, torch.Tensor) assert encoded.shape == (planner.get_total_count(), 3 * 15) assert encoded.dtype == torch.int8 # Epoch 1 reads a different slice of the same pool (no rebuild). cycle_before = pool._current_cycle _, encoded_e1 = pool.get_epoch_inputs(1) assert pool._current_cycle == cycle_before assert encoded_e1.shape == encoded.shape def test_random_negatives_pool_device_mode_seeded_reproducible(): """Seeded device-mode pool produces byte-identical content across fresh instances. This is the contract that lets two workers running the same seed see the same RN pool.""" import torch planner = _placement_planner() encoding = {"alignment_method": "left_pad_centered_right_pad", "max_length": 15} pool_a = RandomNegativesPool( planner=planner, peptide_encoder=None, pool_epochs=2, seed=42, device="cpu", peptide_encoding=encoding, ) pool_b = RandomNegativesPool( planner=planner, peptide_encoder=None, pool_epochs=2, seed=42, device="cpu", peptide_encoding=encoding, ) _, e_a = pool_a.get_epoch_inputs(0) _, e_b = pool_b.get_epoch_inputs(0) assert torch.equal(e_a, e_b) # Different seed must produce different content. pool_c = RandomNegativesPool( planner=planner, peptide_encoder=None, pool_epochs=2, seed=99, device="cpu", peptide_encoding=encoding, ) _, e_c = pool_c.get_epoch_inputs(0) assert not torch.equal(e_a, e_c) def test_random_negatives_pool_device_mode_buffer_reused(): """Cycle rebuilds reuse the device buffer (allocate-once-refill).""" planner = _placement_planner() encoding = {"alignment_method": "left_pad_centered_right_pad", "max_length": 15} pool = RandomNegativesPool( planner=planner, peptide_encoder=None, pool_epochs=1, seed=1, device="cpu", peptide_encoding=encoding, ) pool.get_epoch_inputs(0) buf_id = id(pool._device_buffer) pool.get_epoch_inputs(1) # cycle 1 → rebuild assert id(pool._device_buffer) == buf_id def test_random_negatives_pool_device_requires_peptide_encoding(): import pytest planner = _placement_planner() with pytest.raises(ValueError, match="peptide_encoding"): RandomNegativesPool( planner=planner, peptide_encoder=None, pool_epochs=1, device="cpu", ) mhcflurry-2.3.6/test/test_random_seed_helpers.py000066400000000000000000000115301525677230600221440ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Tests for the CLI-level random-seed reproducibility helpers. Covers the helper surface that makes mhcflurry runs reproducible out of the box: ``DEFAULT_RANDOM_SEED``, ``add_random_seed_arg``, ``configure_random_seed``, and ``derive_seed`` (all in ``mhcflurry.common``). These are unit-level checks on the helpers themselves — the slow end-to-end "same seed -> same model" training path is exercised in the integration suites, not here. """ import argparse import os import random import subprocess import sys import numpy from mhcflurry.common import ( DEFAULT_RANDOM_SEED, add_random_seed_arg, configure_random_seed, derive_seed, ) def test_default_random_seed_is_42(): assert DEFAULT_RANDOM_SEED == 42 def test_add_random_seed_arg_default(): parser = argparse.ArgumentParser() add_random_seed_arg(parser) args = parser.parse_args([]) assert args.random_seed == DEFAULT_RANDOM_SEED # And an explicit value is honored / parsed as an int. args = parser.parse_args(["--random-seed", "123"]) assert args.random_seed == 123 def _draw_sequence(): """Draw from each global RNG that configure_random_seed seeds.""" import torch return ( [random.random() for _ in range(5)], numpy.random.rand(5).tolist(), torch.rand(5).tolist(), ) def test_configure_random_seed_is_deterministic(): resolved_a = configure_random_seed(7) py_a, np_a, torch_a = _draw_sequence() resolved_b = configure_random_seed(7) py_b, np_b, torch_b = _draw_sequence() # configure_random_seed returns the resolved seed. assert resolved_a == 7 assert resolved_b == 7 # Same seed -> identical draws across all three RNGs. assert py_a == py_b assert np_a == np_b assert torch_a == torch_b def test_configure_random_seed_differs_across_seeds(): configure_random_seed(7) py_a, np_a, torch_a = _draw_sequence() configure_random_seed(8) py_b, np_b, torch_b = _draw_sequence() assert py_a != py_b assert np_a != np_b assert torch_a != torch_b def test_configure_random_seed_none_draws_usable_seed(): # None means "draw from entropy": no determinism, but a usable int seed # must be returned (callers derive sub-seeds from it). resolved = configure_random_seed(None) assert isinstance(resolved, int) assert 0 <= resolved < 2 ** 32 # Two entropy draws should (with overwhelming probability) differ. other = configure_random_seed(None) assert resolved != other def test_derive_seed_is_deterministic(): a = derive_seed(42, "fit", 0, 0, 0) b = derive_seed(42, "fit", 0, 0, 0) assert a == b def test_derive_seed_distinct_for_distinct_coords(): coords = [ ("fit", 0, 0, 0), ("fit", 0, 0, 1), ("fit", 0, 1, 0), ("fit", 1, 0, 0), ("fit", 0, 0), ("calibrate", 0, 0, 0), ] seeds = [derive_seed(42, *c) for c in coords] assert len(set(seeds)) == len(seeds), "sub-seeds collided: %r" % seeds # A different master seed also changes the derived value. assert derive_seed(42, "fit", 0, 0, 0) != derive_seed(43, "fit", 0, 0, 0) def test_derive_seed_is_non_negative_int(): # Downstream truncates with `% (2**32)` for numpy; the raw value must be a # non-negative int so that truncation is well-defined. for coords in [("fit", 0, 0, 0), ("calibrate", 5, 9), ("x",)]: seed = derive_seed(42, *coords) assert isinstance(seed, int) assert seed >= 0 assert seed % (2 ** 32) >= 0 def test_derive_seed_handles_none_master(): # A legacy run with no recorded master seed still derives stably. a = derive_seed(None, "fit", 0) b = derive_seed(None, "fit", 0) assert a == b assert isinstance(a, int) and a >= 0 def test_derive_seed_stable_across_processes(): # derive_seed must use stable hashing (hashlib), NOT Python's salted # builtin hash(), so a sub-seed is identical across separate process # invocations (e.g. --only-initialize / --continue-incomplete split). expected = derive_seed(42, "fit", 0, 0, 0) code = ( "from mhcflurry.common import derive_seed; " "print(derive_seed(42, 'fit', 0, 0, 0))") env = dict(os.environ, PYTHONHASHSEED="random") out = subprocess.check_output([sys.executable, "-c", code], env=env) assert int(out.strip()) == expected mhcflurry-2.3.6/test/test_regression_target.py000066400000000000000000000016431525677230600216740ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Tests for regression target conversion.""" from mhcflurry.regression_target import ( from_ic50, to_ic50, ) def test_regression_target_to_ic50(): assert to_ic50(0, max_ic50=500.0) == 500 assert to_ic50(1, max_ic50=500.0) == 1.0 def test_ic50_to_regression_target(): assert from_ic50(5000, max_ic50=5000.0) == 0 assert from_ic50(0, max_ic50=5000.0) == 1.0 mhcflurry-2.3.6/test/test_release_holdout.py000066400000000000000000000227701525677230600213300ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. import json from types import SimpleNamespace import pandas import pytest from mhcflurry.cli.reassign_mass_spec_training_data import ( reassign_mass_spec_training_data, ) from mhcflurry.cli.compare_models import ( _filter_release_holdout_samples, _load_presentation_benchmark_for_component, ) from mhcflurry.release_holdout import ( AFFINITY_PMHCS_FILE, AFFINITY_SAMPLES_FILE, PRESENTATION_SAMPLES_FILE, PROCESSING_SAMPLES_FILE, build_release_holdout, exclude_samples, validate_release_holdout, ) def _write_benchmark(path, rows): pandas.DataFrame(rows).to_csv(path, index=False) def test_build_apply_and_validate_release_holdout(tmp_path, monkeypatch): data_dir = tmp_path / "data_evaluation" data_dir.mkdir() _write_benchmark( data_dir / "benchmark.monoallelic.train_excluded.csv.bz2", [ { "peptide": "SIINFEKL", "sample_id": "mono-test", "hit": 1, "hla": "HLA-A*02:01", }, { "peptide": "AAAAAAAAA", "sample_id": "mono-test", "hit": 0, "hla": "HLA-A*02:01", }, ], ) _write_benchmark( data_dir / "benchmark.multiallelic.train_excluded.csv.bz2", [ { "peptide": "GILGFVFTL", "sample_id": "multi-test", "hit": 1, "hla": "HLA-A*02:01 HLA-B*07:02", }, ], ) affinity_input = tmp_path / "affinity.csv" pandas.DataFrame([ { "allele": "HLA-A0201", "peptide": "SIINFEKL", "measurement_value": 100.0, "measurement_inequality": "<", "measurement_type": "qualitative", "measurement_kind": "mass_spec", }, { "allele": "HLA-A*02:01", "peptide": "AAAAAAAAA", "measurement_value": 50000.0, "measurement_inequality": ">", "measurement_type": "qualitative", "measurement_kind": "mass_spec", }, { "allele": "HLA-B*07:02", "peptide": "GILGFVFTL", "measurement_value": 100.0, "measurement_inequality": "<", "measurement_type": "qualitative", "measurement_kind": "mass_spec", }, { "allele": "HLA-A*03:01", "peptide": "KLGGALQAK", "measurement_value": 50.0, "measurement_inequality": "=", "measurement_type": "quantitative", "measurement_kind": "affinity", }, ]).to_csv(affinity_input, index=False) mass_spec_input = tmp_path / "annotated_ms.csv" pandas.DataFrame([ { "sample_id": "mono-test", "pmid": "31844290", "format": "MONOALLELIC", "mhc_class": "I", }, { "sample_id": "multi-test", "pmid": "31154438", "format": "MULTIALLELIC", "mhc_class": "I", }, ]).to_csv(mass_spec_input, index=False) holdout_dir = tmp_path / "holdout" policy = build_release_holdout( data_dir, affinity_input, mass_spec_input, holdout_dir, chunksize=1, ) assert policy["evaluation_hit_counts"] == { "monoallelic": 1, "multiallelic": 1, } assert policy["affinity_pmhc_count"] == 3 assert policy["policy"]["affinity"].startswith( "Evaluate affinity metrics on all monoallelic samples.") assert "presentation evaluation cannot leak" in ( policy["policy"]["affinity"]) assert set(map(tuple, pandas.read_csv( holdout_dir / AFFINITY_PMHCS_FILE).to_numpy())) == { ("HLA-A*02:01", "SIINFEKL"), ("HLA-A*02:01", "AAAAAAAAA"), ("HLA-B*07:02", "GILGFVFTL"), } assert pandas.read_csv( holdout_dir / AFFINITY_SAMPLES_FILE).sample_id.tolist() == [ "mono-test", ] affinity_output = tmp_path / "affinity.filtered.csv" filtered = reassign_mass_spec_training_data( affinity_input, exclude_pmhcs=holdout_dir / AFFINITY_PMHCS_FILE, out_csv=affinity_output, ) assert list(map(tuple, filtered[["allele", "peptide"]].to_numpy())) == [ ("HLA-A*03:01", "KLGGALQAK"), ] processing = pandas.DataFrame([ {"sample_id": "multi-test", "peptide": "SIINFEKL", "hit": 1}, {"sample_id": "mono-train", "peptide": "KLGGALQAK", "hit": 1}, ]) processing = exclude_samples( processing, holdout_dir / PROCESSING_SAMPLES_FILE, "processing", ) processing_path = tmp_path / "processing.csv" processing.to_csv(processing_path, index=False) presentation = pandas.DataFrame([ {"sample_id": "multi-test", "peptide": "GILGFVFTL", "hit": 1}, {"sample_id": "multi-train", "peptide": "KLGGALQAK", "hit": 1}, # Production presentation data mixes numeric-looking and textual IDs. {"sample_id": "24616531", "peptide": "AAAAAAAAA", "hit": 0}, ]) presentation = exclude_samples( presentation, holdout_dir / PRESENTATION_SAMPLES_FILE, "presentation", ) presentation_path = tmp_path / "presentation.csv" presentation.to_csv(presentation_path, index=False) sample_read_options = [] read_csv = pandas.read_csv def read_csv_spy(path, *args, **kwargs): if ( path in (processing_path, presentation_path) and kwargs.get("usecols") == ["sample_id"]): sample_read_options.append(kwargs.copy()) return read_csv(path, *args, **kwargs) monkeypatch.setattr(pandas, "read_csv", read_csv_spy) validation_path = tmp_path / "validation.json" result = validate_release_holdout( holdout_dir, affinity_output, processing_path, presentation_path, out=validation_path, ) assert len(sample_read_options) == 2 assert all( options["dtype"] == {"sample_id": str} for options in sample_read_options ) assert all(options["chunksize"] for options in sample_read_options) assert result["schema_version"] == 1 assert result["affinity_overlap_rows"] == 0 assert result["processing_overlap_rows"] == 0 assert result["presentation_overlap_rows"] == 0 assert result["policy_sha256"] assert set(result["holdout_files"]) == { "affinity_pmhcs.csv", "affinity_samples.csv", "processing_samples.csv", "presentation_samples.csv", } assert json.loads(validation_path.read_text()) == result processing.loc[len(processing)] = ["multi-test", "SIINFEKL", 1] processing.to_csv(processing_path, index=False) with pytest.raises(ValueError, match="processing_overlap_rows.*1"): validate_release_holdout( holdout_dir, affinity_output, processing_path, presentation_path, ) benchmark = pandas.DataFrame({ "sample_id": ["mono-test", "multi-test", "multi-train"], "peptide": ["SIINFEKL", "GILGFVFTL", "KLGGALQAK"], }) args = SimpleNamespace( release_holdout_dir=str(holdout_dir), limit_files=None, ) affinity_eval = _filter_release_holdout_samples( benchmark, args, "affinity") processing_eval = _filter_release_holdout_samples( benchmark, args, "processing") assert affinity_eval.sample_id.tolist() == ["mono-test"] assert processing_eval.sample_id.tolist() == ["multi-test"] def test_release_holdout_file_limit_applies_before_genotype_normalization( tmp_path, monkeypatch): holdout_dir = tmp_path / "holdout" holdout_dir.mkdir() pandas.DataFrame({ "sample_id": ["held-out"], }).to_csv(holdout_dir / PROCESSING_SAMPLES_FILE, index=False) data_dir = tmp_path / "data" data_dir.mkdir() for filename, sample_id, peptides, genotype in ( ( "a", "training", ["AAAAAAAA", "AAAAAAAK"], "excluded genotype must not be normalized", ), ( "z", "held-out", ["BBBBBBBB", "BBBBBBBK"], "HLA-A*02:01", )): pandas.DataFrame({ "sample_id": [sample_id, sample_id], "peptide": peptides, "hla": [genotype, genotype], "hit": [1, 0], }).to_csv( data_dir / ( "benchmark.multiallelic.train_excluded.%s.csv.bz2" % filename ), index=False, ) args = SimpleNamespace( release_holdout_dir=str(holdout_dir), limit_files=1, ) normalized = [] def normalize_selected_genotype(value): normalized.append(value) if value != "HLA-A*02:01": raise AssertionError("normalized a non-holdout genotype") return value monkeypatch.setattr( "mhcflurry.cli.compare_models._normalize_benchmark_genotype", normalize_selected_genotype, ) result = _load_presentation_benchmark_for_component( str(data_dir), args, "processing", ) assert result.sample_id.tolist() == ["held-out", "held-out"] assert result.source_file.unique().tolist() == [ "benchmark.multiallelic.train_excluded.z.csv.bz2", ] assert normalized == ["HLA-A*02:01"] mhcflurry-2.3.6/test/test_release_provenance.py000066400000000000000000000300441525677230600220030ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import importlib.util import hashlib import json import pathlib import re import subprocess import pytest from mhcflurry.version import __version__ as PACKAGE_VERSION REPO = pathlib.Path(__file__).resolve().parents[1] SCRIPT = REPO / "scripts" / "release" / "validate_release_provenance.py" RELEASE_VERSION = re.match(r"\d+\.\d+\.\d+", PACKAGE_VERSION).group() def load_module(): spec = importlib.util.spec_from_file_location( "validate_release_provenance_under_test", SCRIPT) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module def write_model_info(run_dir, version, commit=None, workflow_id="run-123"): if commit is None: commit = subprocess.check_output( ["git", "-C", str(REPO), "rev-parse", "HEAD"], text=True, ).strip() paths = [ run_dir / "affinity" / "models.combined" / "info.txt", run_dir / "presentation" / "models" / "info.txt", run_dir / "processing" / "models.selected.with_flanks" / "info.txt", ] for path in paths: path.parent.mkdir(parents=True, exist_ok=True) path.write_text( "package\tmhcflurry %s\n" "git commit\t%s\n" "workflow id\t%s\n" % (version, commit, workflow_id) ) def sha256(path): digest = hashlib.sha256() digest.update(path.read_bytes()) return digest.hexdigest() def write_holdout_proof(run_dir, overlap=0): holdout_dir = run_dir / "release_holdout" holdout_dir.mkdir(parents=True, exist_ok=True) records = {} for filename in ( "affinity_pmhcs.csv", "affinity_samples.csv", "processing_samples.csv", "presentation_samples.csv"): path = holdout_dir / filename path.write_text("value\n") records[filename] = {"rows": 0, "sha256": sha256(path)} policy_path = holdout_dir / "policy.json" policy_path.write_text(json.dumps({ "schema_version": 1, "evaluation_hit_counts": {"monoallelic": 1, "multiallelic": 1}, "holdout_files": records, })) (holdout_dir / "validation.json").write_text(json.dumps({ "schema_version": 1, "policy_sha256": sha256(policy_path), "holdout_files": records, "affinity_overlap_rows": overlap, "processing_overlap_rows": 0, "presentation_overlap_rows": 0, })) def test_collect_provenance_accepts_matching_release_candidate(tmp_path): module = load_module() write_model_info(tmp_path, PACKAGE_VERSION) write_holdout_proof(tmp_path) result = module.collect_provenance( repo=REPO, run_dir=tmp_path, release=RELEASE_VERSION, workflow_id="run-123", processing_variants=["with_flanks"], require_artifacts=True, allow_dirty_repo=True, expected_artifact_workflow_id="run-123", ) assert result["release_base_version"] == RELEASE_VERSION assert result["source"]["package_version"] == PACKAGE_VERSION assert result["workflow_id"] == "run-123" assert { item["package_version"] for item in result["artifacts"].values() } == {PACKAGE_VERSION} def test_collect_provenance_rejects_mislabeled_model(tmp_path): module = load_module() other_version = "999.0.0" if RELEASE_VERSION != "999.0.0" else "998.0.0" write_model_info(tmp_path, other_version) write_holdout_proof(tmp_path) with pytest.raises(ValueError, match=re.escape( "%s, not release %s" % (other_version, RELEASE_VERSION))): module.collect_provenance( repo=REPO, run_dir=tmp_path, release=RELEASE_VERSION, processing_variants=["with_flanks"], require_artifacts=True, allow_dirty_repo=True, expected_artifact_workflow_id="run-123", ) def test_collect_provenance_rejects_missing_model_info(tmp_path): module = load_module() with pytest.raises(ValueError, match="Missing required model provenance"): module.collect_provenance( repo=REPO, run_dir=tmp_path, release=RELEASE_VERSION, processing_variants=["with_flanks"], require_artifacts=True, allow_dirty_repo=True, expected_artifact_workflow_id="run-123", ) @pytest.mark.parametrize( ("variants", "message"), [ (["with_flanks", "../../outside"], "Unknown processing variant"), (["with_flanks", "with_flanks"], "Duplicate processing variant"), ], ) def test_artifact_paths_reject_invalid_processing_variants( tmp_path, variants, message): module = load_module() with pytest.raises(ValueError, match=message): module.artifact_info_paths(tmp_path, variants) def test_collect_provenance_rejects_model_from_another_commit(tmp_path): module = load_module() write_model_info(tmp_path, PACKAGE_VERSION, commit="deadbeef") write_holdout_proof(tmp_path) with pytest.raises(ValueError, match="does not match source commit"): module.collect_provenance( repo=REPO, run_dir=tmp_path, release=RELEASE_VERSION, workflow_id="run-123", processing_variants=["with_flanks"], require_artifacts=True, allow_dirty_repo=True, expected_artifact_workflow_id="run-123", ) def test_collect_provenance_records_separate_postprocess_source(tmp_path): module = load_module() write_model_info( tmp_path, PACKAGE_VERSION, commit="training-commit", workflow_id="training-run", ) write_holdout_proof(tmp_path) result = module.collect_provenance( repo=REPO, run_dir=tmp_path, release=RELEASE_VERSION, workflow_id="evaluation-run", processing_variants=["with_flanks"], require_artifacts=True, allow_dirty_repo=True, allow_artifact_source_mismatch=True, ) assert result["artifact_training"] == { "git_commit": "training-commit", "workflow_id": "training-run", "matches_evaluation_source": False, } assert result["source"]["git_commit"] != "training-commit" def test_cli_records_separate_postprocess_source(tmp_path, capsys): module = load_module() write_model_info( tmp_path, PACKAGE_VERSION, commit="training-commit", workflow_id="training-run", ) write_holdout_proof(tmp_path) assert module.main([ "--repo", str(REPO), "--run-dir", str(tmp_path), "--release", RELEASE_VERSION, "--workflow-id", "evaluation-run", "--processing-variants", "with_flanks", "--require-artifacts", "--allow-dirty-repo", "--allow-artifact-source-mismatch", ]) == 0 result = json.loads(capsys.readouterr().out) assert result["artifact_training"]["git_commit"] == "training-commit" assert result["artifact_training"]["matches_evaluation_source"] is False def test_collect_provenance_rejects_inconsistent_artifact_commits(tmp_path): module = load_module() write_model_info( tmp_path, PACKAGE_VERSION, commit="training-commit", workflow_id="training-run", ) affinity_info = tmp_path / "affinity" / "models.combined" / "info.txt" affinity_info.write_text( affinity_info.read_text().replace( "git commit\ttraining-commit", "git commit\tanother-commit", ) ) write_holdout_proof(tmp_path) with pytest.raises(ValueError, match="do not agree on git commit"): module.collect_provenance( repo=REPO, run_dir=tmp_path, release=RELEASE_VERSION, workflow_id="evaluation-run", processing_variants=["with_flanks"], require_artifacts=True, allow_dirty_repo=True, allow_artifact_source_mismatch=True, ) def test_collect_provenance_allows_later_evaluation_workflow(tmp_path): module = load_module() write_model_info(tmp_path, PACKAGE_VERSION, workflow_id="training-run") write_holdout_proof(tmp_path) result = module.collect_provenance( repo=REPO, run_dir=tmp_path, release=RELEASE_VERSION, workflow_id="evaluation-run", processing_variants=["with_flanks"], require_artifacts=True, allow_dirty_repo=True, ) assert result["workflow_id"] == "evaluation-run" assert result["artifacts"]["affinity"]["workflow_id"] == "training-run" def test_collect_artifact_provenance_without_git_checkout(tmp_path): module = load_module() write_model_info( tmp_path, PACKAGE_VERSION, commit="remote-commit", workflow_id="remote-run", ) result = module.collect_artifact_provenance( run_dir=tmp_path, release=RELEASE_VERSION, processing_variants=["with_flanks"], require_artifacts=True, expected_artifact_git_commit="remote-commit", expected_artifact_workflow_id="remote-run", ) assert result["affinity"]["git_commit"] == "remote-commit" def test_artifact_only_cli_requires_expected_identity(tmp_path): module = load_module() write_model_info(tmp_path, PACKAGE_VERSION) write_holdout_proof(tmp_path) with pytest.raises(SystemExit, match="expected-artifact-git-commit"): module.main([ "--artifact-only", "--run-dir", str(tmp_path), "--release", RELEASE_VERSION, "--require-artifacts", ]) def test_collect_provenance_requires_holdout_proof(tmp_path): module = load_module() write_model_info(tmp_path, PACKAGE_VERSION) with pytest.raises(ValueError, match="Missing required release holdout"): module.collect_provenance( repo=REPO, run_dir=tmp_path, release=RELEASE_VERSION, processing_variants=["with_flanks"], require_artifacts=True, allow_dirty_repo=True, ) def test_collect_provenance_rejects_holdout_overlap(tmp_path): module = load_module() write_model_info(tmp_path, PACKAGE_VERSION) write_holdout_proof(tmp_path, overlap=1) with pytest.raises(ValueError, match="contains overlap"): module.collect_provenance( repo=REPO, run_dir=tmp_path, release=RELEASE_VERSION, processing_variants=["with_flanks"], require_artifacts=True, allow_dirty_repo=True, ) def test_packaging_preserves_explicit_original_training_version(tmp_path): module = load_module() # Keep this fixture outside the release family as package versions advance. other_major = int(RELEASE_VERSION.split(".")[0]) + 1 trained_version = f"{other_major}.0.0rc3" write_model_info(tmp_path, trained_version) write_holdout_proof(tmp_path) kwargs = dict( repo=REPO, run_dir=tmp_path, release=RELEASE_VERSION, processing_variants=["with_flanks"], require_artifacts=True, allow_dirty_repo=True) with pytest.raises(ValueError, match="not release"): module.collect_provenance(**kwargs) result = module.collect_provenance( **kwargs, training_package_version=trained_version) assert result["release"] == RELEASE_VERSION assert result["artifacts"]["affinity"]["package_version"] == trained_version assert result["expected_training_package_version"] == trained_version with pytest.raises(ValueError, match="does not match explicit"): module.collect_provenance( **kwargs, training_package_version=f"{other_major}.0.0rc2") mhcflurry-2.3.6/test/test_release_smoke.py000066400000000000000000000323471525677230600207710ustar00rootroot00000000000000"""Release smoke mode shrinks scale without changing stages, and only when asked.""" import importlib.util import hashlib import json from pathlib import Path import re import shlex import subprocess import sys import pandas import pytest import yaml REPO = Path(__file__).resolve().parents[1] SCRIPTS = [REPO / "scripts/training/pan_allele_release_full.sh", REPO / "scripts/training/pan_allele_release_affinity.sh"] GUARD = 'if [ "${MHCFLURRY_RELEASE_SMOKE:-0}" = "1" ]; then' @pytest.fixture def smoke(): spec = importlib.util.spec_from_file_location("release_smoke", REPO / "scripts/training/release_smoke.py") module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module def test_cap_hyperparameters_truncates_and_caps_every_epoch_count(smoke): affinity = {"max_epochs": 5000, "patience": 20, "train_data": { "pretrain": True, "pretrain_max_epochs": 50, "pretrain_min_epochs": 5, "pretrain_steps_per_epoch": 256, "pretrain_peptides_per_epoch": 64}} processing = {"convolutional_kernel_size": 13} # no max_epochs key at all capped = smoke.cap_hyperparameters([affinity, processing, dict(affinity)], 2, 2) assert len(capped) == 2 assert capped[0]["max_epochs"] == 2 and capped[0]["patience"] == 20 assert capped[0]["train_data"] == { "pretrain": True, "pretrain_max_epochs": 2, "pretrain_min_epochs": 2, "pretrain_steps_per_epoch": 16, "pretrain_peptides_per_epoch": 64} assert capped[1] == {"convolutional_kernel_size": 13, "max_epochs": 2} assert affinity["max_epochs"] == 5000 # inputs are not mutated with pytest.raises(ValueError): smoke.cap_hyperparameters([], 2, 2) def test_cap_hyperparameters_cli_rewrites_file_in_place(smoke, tmp_path): path = tmp_path / "hyperparameters.yaml" path.write_text(yaml.safe_dump([{"max_epochs": 500}] * 5)) assert smoke.main(["cap-hyperparameters", str(path), "--max-architectures", "2", "--max-epochs", "2"]) == 0 assert yaml.safe_load(path.read_text()) == [{"max_epochs": 2}, {"max_epochs": 2}] def test_sample_exclusions_keep_a_seeded_subset_and_always_exclude_holdout(smoke, tmp_path): hits = ["big%d" % index for index in range(30) for _ in range(250)] + ["tiny"] * 10 + ["held"] * 500 excluded, kept = smoke.smoke_sample_exclusions(hits, ["held"], keep=20, seed=42) assert len(kept) == 20 and "held" in excluded and "held" not in kept and "tiny" not in kept assert set(excluded) | set(kept) == set(hits) and not set(excluded) & set(kept) assert smoke.smoke_sample_exclusions(hits, ["held"], keep=20, seed=42) == (excluded, kept) with pytest.raises(ValueError, match="need 31"): smoke.smoke_sample_exclusions(hits, ["held"], keep=31, seed=42) # The CLI reads the eligibility columns too, so write a full hit table. pandas.DataFrame({ "sample_id": hits, "mhc_class": "I", "peptide": "SIINFEKL", "protein_ensembl": "ENSP1", "format": "MONOALLELIC", "hla": "HLA-A*02:01"}).to_csv(tmp_path / "hits.csv", index=False) pandas.DataFrame({"sample_id": ["held"]}).to_csv(tmp_path / "holdout.csv", index=False) out = tmp_path / "excluded.csv" assert smoke.main(["sample-exclusions", "--hits", str(tmp_path / "hits.csv"), "--holdout", str(tmp_path / "holdout.csv"), "--keep", "20", "--seed", "42", "--out", str(out)]) == 0 assert sorted(pandas.read_csv(out).sample_id) == excluded @pytest.mark.parametrize("script", SCRIPTS, ids=lambda path: path.name) def test_release_scripts_parse_and_only_call_the_helper_in_smoke_mode(script): subprocess.run(["bash", "-n", str(script)], check=True) lines = script.read_text().splitlines() calls = [index for index, line in enumerate(lines) if '"$SMOKE_HELPER"' in line] assert calls, "smoke hooks missing from %s" % script.name for index in calls: previous = next(line.strip() for line in reversed(lines[:index]) if line.strip()) assert previous == GUARD, (script.name, index + 1, lines[index]) def test_unset_smoke_defaults_reproduce_the_previous_literals(): full = SCRIPTS[0].read_text() assert 'PRESENTATION_CALIBRATION_PEPTIDES_PER_LENGTH="${PRESENTATION_CALIBRATION_PEPTIDES_PER_LENGTH:-10000}"' in full assert 'PRESENTATION_CALIBRATION_GENOTYPES="${PRESENTATION_CALIBRATION_GENOTYPES:-50}"' in full assert 'PROCESSING_EXCLUDE_SAMPLES="$RELEASE_HOLDOUT_DIR/processing_samples.csv"' in full affinity = SCRIPTS[1].read_text() assert re.search(r'^AFFINITY_EVAL_LIMIT_ARGS=\(\)$', affinity, re.M) # Every smoke-only assignment sits inside the guard. for text in (full, affinity): body = text.split(GUARD) assert len(body) > 1 def test_processing_data_is_reused_on_relaunch_only_after_validation(): full = SCRIPTS[0].read_text() guard = full.index('mhcflurry train validate-processing-data --data "$(pwd)/train_data.csv.bz2"; then') generate = full.index("mhcflurry train processing-data \\") assert guard < generate between = full[guard:generate] assert "Reusing validated processing training data" in between and "\nelse\n" in between def bash_block(text, start, end="fi\n"): """One top-level shell block from the release script, verbatim.""" begin = text.index(start) stop = text.index("\n" + end, begin) + 1 + len(end) return text[begin:stop] def run_block(block, cwd, prelude=""): script = "set -euo pipefail\n" + prelude + block return subprocess.run(["bash", "-c", script], cwd=cwd, capture_output=True, text=True, check=True).stdout def test_annotated_hits_are_reused_so_relaunch_keeps_the_recorded_hash(tmp_path): block = bash_block(SCRIPTS[0].read_text(), 'if [ -s "$(pwd)/hits_with_tpm.csv.bz2" ]') prelude = ('python() { echo "ANNOTATED"; }\n' 'compress_csv_bzip2() { echo "COMPRESSED"; }\n' 'mhcflurry-downloads() { echo /stub; }\n') assert "ANNOTATED" in run_block(block, tmp_path, prelude) subprocess.run(["bzip2", "-c"], input=b"sample_id,peptide\nS,SIINFEKL\n", stdout=(tmp_path / "hits_with_tpm.csv.bz2").open("wb"), check=True) reused = run_block(block, tmp_path, prelude) assert "Reusing annotated hits" in reused and "ANNOTATED" not in reused (tmp_path / "hits_with_tpm.csv.bz2").write_bytes(b"truncated garbage") assert "ANNOTATED" in run_block(block, tmp_path, prelude) def test_matched_preparation_resumes_from_saved_pools_and_clears_empty_artifacts(tmp_path): block = bash_block(SCRIPTS[0].read_text(), "PROCESSING_DATA_RESUME_ARGS=()", " fi\n") report = 'echo "args=${PROCESSING_DATA_RESUME_ARGS[*]:-none}"\n' assert "args=none" in run_block(block + report, tmp_path) matching = tmp_path / "train_data.csv.matching" matching.mkdir() assert "args=none" in run_block(block + report, tmp_path) assert not matching.exists() # nothing scored yet, so nothing is preserved matching.mkdir() (matching / "experiment.json").write_text("{}") (matching / "abc.candidate_pool.csv.bz2").write_bytes(b"pool") assert "args=--resume" in run_block(block + report, tmp_path) assert (matching / "abc.candidate_pool.csv.bz2").is_file() @pytest.mark.parametrize("script", SCRIPTS) def test_optional_argument_arrays_expand_when_empty_under_nounset(script): """`set -u` with an empty array aborts on bash 3.2 without the +alternate form.""" text = script.read_text() for name in re.findall(r"^\s*([A-Z_]+)=\(\)\s*$", text, flags=re.MULTILINE): safe = '${%s[@]+"${%s[@]}"}' % (name, name) assert text.count('"${%s[@]}"' % name) == text.count(safe), name if safe in text: run_block('%s=()\nprintf "arg=%%s\\n" %s\n' % (name, safe), script.parent) def test_data_vintage_selects_a_download_label_and_rejects_other_values(tmp_path, monkeypatch): """Only the release pipeline's two vintages are accepted, and only one exports.""" monkeypatch.delenv("MHCFLURRY_DOWNLOADS_CURRENT_RELEASE", raising=False) block = bash_block(SCRIPTS[0].read_text(), 'MHCFLURRY_RELEASE_DATA_VINTAGE="${MHCFLURRY_RELEASE_DATA_VINTAGE:-current}"', "esac\n") report = 'echo "label=${MHCFLURRY_DOWNLOADS_CURRENT_RELEASE:-unset}"\n' assert "label=unset" in run_block(block + report, tmp_path) assert "label=unset" in run_block( block + report, tmp_path, 'MHCFLURRY_RELEASE_DATA_VINTAGE=current\n') assert "label=custom" in run_block( block + report, tmp_path, 'MHCFLURRY_DOWNLOADS_CURRENT_RELEASE=custom\n') assert "label=2.0.0" in run_block( block + report, tmp_path, 'MHCFLURRY_RELEASE_DATA_VINTAGE=public-2020\n') rejected = subprocess.run( ["bash", "-c", "set -euo pipefail\nMHCFLURRY_RELEASE_DATA_VINTAGE=2019\n" + block], cwd=tmp_path, capture_output=True, text=True) assert rejected.returncode == 2 and "must be current or public-2020" in rejected.stderr def test_data_vintage_is_recorded_before_any_training(): """The run keeps the resolved training inputs, hashed, next to its config.""" full = SCRIPTS[0].read_text() record = full.index("config/data_vintage.json") for later in ("=== STAGE 1: AFFINITY", "release-holdout build"): assert record < full.index(later), later assert "curated_training_data" in full and "annotated_ms" in full def test_fresh_cache_vintage_records_actual_allele_csv(tmp_path): full = SCRIPTS[0].read_text() start = full.index("mhcflurry-downloads fetch data_evaluation data_curated data_mass_spec_annotated") stop = full.index("\nPYVINTAGE", start) + len("\nPYVINTAGE\n") (tmp_path / "curated_training_data.csv.bz2").write_bytes(b"curated") (tmp_path / "annotated_ms.csv.bz2").write_bytes(b"mass spec") prelude = '''BASE_OUT="$PWD" MHCFLURRY_RELEASE_DATA_VINTAGE=current mhcflurry-downloads() { if [ "$1" = fetch ]; then for item in "$@"; do if [ "$item" = allele_sequences ]; then echo 'allele,sequence' > "$PWD/allele.csv" fi done else if [ "$2" = allele_sequences ]; then test -s "$PWD/allele.csv" || return 1; fi echo "$PWD" fi } mhcflurry() { echo "$PWD/allele.csv"; } ''' prelude += "python() { " + shlex.quote(sys.executable) + ' "$@"; }\n' run_block(full[start:stop], tmp_path, prelude) record = json.loads((tmp_path / "config/data_vintage.json").read_text()) assert record["allele_sequences_dir"] == str(tmp_path) assert record["allele_sequences"] == { "path": str(tmp_path / "allele.csv"), "sha256": hashlib.sha256(b"allele,sequence\n").hexdigest()} def ineligible_and_eligible_hits(): """One eligible sample plus one row of every reason the real command drops.""" rows = [ # sample_id, mhc_class, peptide, protein_ensembl, format, hla ("keep", "I", "SIINFEKL", "ENSP1", "MONOALLELIC", "HLA-A*02:01"), ("class_ii", "II", "SIINFEKL", "ENSP1", "MONOALLELIC", "HLA-A*02:01"), ("too_long", "I", "SIINFEKLSIIN", "ENSP1", "MONOALLELIC", "HLA-A*02:01"), ("no_protein", "I", "SIINFEKL", None, "MONOALLELIC", "HLA-A*02:01"), ("odd_residue", "I", "SIINFEKX", "ENSP1", "MONOALLELIC", "HLA-A*02:01"), ("multiallelic", "I", "SIINFEKL", "ENSP1", "MULTIALLELIC", "HLA-A*02:01"), ("not_abc", "I", "SIINFEKL", "ENSP1", "MONOALLELIC", "HLA-E*01:01"), ("serotype", "I", "SIINFEKL", "ENSP1", "MONOALLELIC", "A2"), ] return pandas.DataFrame(rows, columns=[ "sample_id", "mhc_class", "peptide", "protein_ensembl", "format", "hla"]) def test_eligible_hits_mirror_the_processing_commands_own_filters(smoke): """Smoke samples must survive to training; picking from raw hits did not.""" frame = ineligible_and_eligible_hits() canonicalize = smoke.load_canonicalize_allele() eligible = smoke.eligible_processing_hits(frame, canonicalize) assert sorted(eligible.sample_id.unique()) == ["keep"] # A serotype is fatal in the real command, so it must not be selectable. with pytest.raises(ValueError): canonicalize("A2") def test_sample_exclusions_keep_only_samples_that_reach_training(smoke, tmp_path): frame = pandas.concat([ineligible_and_eligible_hits()] * 250, ignore_index=True) extra = frame.loc[frame.sample_id == "keep"].copy() for name in ("keep2", "keep3", "holdout_sample"): extra["sample_id"] = name frame = pandas.concat([frame, extra], ignore_index=True) eligible = smoke.eligible_processing_hits(frame, smoke.load_canonicalize_allele()) excluded, kept = smoke.smoke_sample_exclusions( eligible.sample_id, ["holdout_sample"], keep=2, seed=42, min_hits=200) assert len(kept) == 2 and "holdout_sample" not in kept assert set(kept) <= {"keep", "keep2", "keep3"} assert "holdout_sample" in excluded and "class_ii" not in kept def test_smoke_reduces_the_processing_held_out_sample_count(tmp_path): """Holding out ten of twenty samples is what broke the first smoke run.""" block = bash_block(SCRIPTS[0].read_text(), 'if [ "${MHCFLURRY_RELEASE_SMOKE:-0}" = "1" ]; then\n PRESENTATION_SAMPLE_FRACTION=0.01') report = ('echo "kept=$SMOKE_PROCESSING_SAMPLES held_out=$PROCESSING_HELD_OUT_SAMPLES"\n') out = run_block(block + report, tmp_path, 'MHCFLURRY_RELEASE_SMOKE=1\n') assert "kept=20 held_out=4" in out mhcflurry-2.3.6/test/test_released_master_predictions.py000066400000000000000000000043241525677230600237070ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Regression tests for released model predictions. Expected values were generated from the TF/Keras implementation on the published model weights and are stored under test/data/. These tests verify that the current (PyTorch) code reproduces the same predictions. """ import json import os import numpy as np import pytest from mhcflurry.testing_utils import startup, cleanup pytestmark = pytest.mark.downloads def setup_module(): startup() def teardown_module(): cleanup() def _load_expected(name): data_dir = os.path.join(os.path.dirname(__file__), "data") with open(os.path.join(data_dir, name), "r") as f: return json.load(f) def test_allele_specific_affinity_predictions(released_affinity_predictors): expected = _load_expected( "master_released_class1_affinity_predictions.json")["allele_specific"] predictor = released_affinity_predictors["allele-specific"] predictions = predictor.predict( peptides=expected["peptides"], alleles=expected["alleles"], ) np.testing.assert_allclose( predictions, np.array(expected["predictions"], dtype=np.float64), rtol=0.01, atol=0.0, ) def test_pan_allele_affinity_predictions(released_affinity_predictors): expected = _load_expected( "master_released_class1_affinity_predictions.json")["pan_allele"] predictor = released_affinity_predictors["pan-allele"] predictions = predictor.predict( peptides=expected["peptides"], alleles=expected["alleles"], ) np.testing.assert_allclose( predictions, np.array(expected["predictions"], dtype=np.float64), rtol=0.01, atol=0.0, ) mhcflurry-2.3.6/test/test_released_predictors_on_hpv_dataset.py000066400000000000000000000042301525677230600252410ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Test accuracy on HPV benchmark used in MHCflurry Cell Systems 2018 paper. The study that generated this dataset has now been published (Bonsack et al 2019, DOI: 10.1158/2326-6066.CIR-18-0584), and the authors request that any work based on the HPV dataset cite this paper. """ import os import pandas import pytest from sklearn.metrics import roc_auc_score pytestmark = [pytest.mark.slow, pytest.mark.downloads] def data_path(name): ''' Return the absolute path to a file in the test/data directory. The name specified should be relative to test/data. ''' return os.path.join(os.path.dirname(__file__), "data", name) DF = pandas.read_csv(data_path("hpv_predictions.csv")) def test_on_hpv(released_affinity_predictors, df=DF): scores_df = [] for (name, predictor) in released_affinity_predictors.items(): print("Running", name) df[name] = predictor.predict(df.peptide, alleles=df.allele) for name in df.columns[8:]: for nm_cutoff in [2000, 5000, 50000]: labels = df["affinity"] < nm_cutoff auc = roc_auc_score(labels.values, -1 * df[name].values) scores_df.append((name, "auc-%dnM" % nm_cutoff, auc)) scores_df = pandas.DataFrame( scores_df, columns=["predictor", "metric", "score"]) scores_df = scores_df.pivot( index="metric", columns="predictor", values="score") print("Predictions") print(df) print("Scores") print(scores_df) mean_scores = scores_df.mean() assert mean_scores["allele-specific"] > mean_scores["netmhcpan4"] assert mean_scores["pan-allele"] > mean_scores["netmhcpan4"] mhcflurry-2.3.6/test/test_released_predictors_well_correlated.py000066400000000000000000000073331525677230600254210ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Test that pan-allele and allele-specific predictors are highly correlated. """ from __future__ import print_function import argparse import logging import sys import numpy import pandas import pytest from mhcflurry import Class1AffinityPredictor from mhcflurry.encodable_sequences import EncodableSequences from mhcflurry.downloads import get_path from mhcflurry.common import random_peptides from mhcflurry.testing_utils import startup logger = logging.getLogger("matplotlib") logger.disabled = True pytestmark = [pytest.mark.slow, pytest.mark.downloads] PREDICTORS = None def setup(): """Setup for running script directly (not via pytest).""" global PREDICTORS startup() PREDICTORS = { 'allele-specific': Class1AffinityPredictor.load(get_path("models_class1", "models")), 'pan-allele': Class1AffinityPredictor.load(get_path("models_class1_pan", "models.combined")), } def _correlation( predictors, alleles=None, num_peptides_per_length=1000, lengths=None, debug=False, return_result=False): if lengths is None: lengths = [8, 9, 10] peptides = [] for length in lengths: peptides.extend(random_peptides(num_peptides_per_length, length)) # Cache encodings peptides = EncodableSequences.create(list(set(peptides))) if alleles is None: alleles = set.intersection(*[ set(predictor.supported_alleles) for predictor in predictors.values() ]) alleles = sorted(set(alleles)) df = pandas.DataFrame(index=peptides.sequences) results_df = [] for allele in alleles: for (name, predictor) in predictors.items(): df[name] = predictor.predict(peptides, allele=allele) correlation = numpy.corrcoef( numpy.log10(df["allele-specific"]), numpy.log10(df["pan-allele"]))[0, 1] results_df.append((allele, correlation)) print(len(results_df), len(alleles), *results_df[-1]) if correlation < 0.6: print("Warning: low correlation", allele) df["tightest"] = df.min(axis=1) print(df.sort_values("tightest").iloc[:, :-1]) if debug: import ipdb # pylint: disable=import-error ipdb.set_trace() del df["tightest"] results_df = pandas.DataFrame(results_df, columns=["allele", "correlation"]) print(results_df) print("Mean correlation", results_df.correlation.mean()) assert results_df.correlation.mean() > 0.65 if return_result: return results_df def test_correlation(released_affinity_predictors_two_pan_models): _correlation(released_affinity_predictors_two_pan_models) parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "--alleles", nargs="+", default=None, help="Which alleles to test") if __name__ == '__main__': # If run directly from python, leave the user in a shell to explore results. startup() args = parser.parse_args(sys.argv[1:]) setup() result = _correlation( PREDICTORS, alleles=args.alleles, debug=True, return_result=True) # Leave in ipython import ipdb # pylint: disable=import-error ipdb.set_trace() mhcflurry-2.3.6/test/test_released_presentation_highscore_rows.py000066400000000000000000000170541525677230600256350ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Regression tests for released presentation model predictions. Expected values cover peptide+flank contexts where at least one allele has a high presentation score (>0.9), including low-scoring alleles for the same contexts. Values were generated from the TF/Keras implementation and are stored under test/data/. """ import os import warnings import mhcgnomes import numpy as np import pandas as pd from mhcflurry import Class1AffinityPredictor, Class1PresentationPredictor from mhcflurry.common import normalize_sequence_resolved_allele_name from mhcflurry.testing_utils import startup, cleanup warnings.filterwarnings( "ignore", message=r".*Downcasting behavior in `replace` is deprecated.*", category=FutureWarning, ) EXPECTED_CSV = "master_released_class1_presentation_highscore_rows.csv.gz" BASE_COLUMNS = ["row_id", "peptide", "allele", "n_flank", "c_flank"] STRING_COLUMNS = ["pres_with_best_allele", "pres_without_best_allele"] HIGH_SCORE_COLUMNS = [ "pres_with_presentation_score", "pres_without_presentation_score", ] def setup_module(): startup() def teardown_module(): cleanup() def _load_expected(): data_dir = os.path.join(os.path.dirname(__file__), "data") expected = pd.read_csv( os.path.join(data_dir, EXPECTED_CSV), keep_default_na=False) # Historical TF output uses allele spellings that can differ from current # canonical names (for example, DLA-88*01:01 versus DLA-88*001:01). for column in ["allele"] + STRING_COLUMNS: expected[column] = expected[column].map( lambda value: mhcgnomes.parse(value).to_string()) return expected def _atol_for_output(column): if "percentile" in column: return 1e-5 if "affinity" in column: return 0.1 return 1e-5 def _normalized_alleles(values): """Return predictor-API canonical spellings for allele identifiers.""" return np.array([ normalize_sequence_resolved_allele_name(value) for value in values ]) def test_expected_data_has_high_and_low_contexts(): """Sanity-check that the expected data spans a wide score range.""" expected_df = _load_expected() by_context = expected_df.groupby( ["peptide", "n_flank", "c_flank"], observed=True) context_max = by_context[HIGH_SCORE_COLUMNS].max() context_min = by_context[HIGH_SCORE_COLUMNS].min() assert ( (context_max["pres_with_presentation_score"] > 0.9) | (context_max["pres_without_presentation_score"] > 0.9) ).all() assert (context_min["pres_with_presentation_score"] < 0.2).all() assert (context_min["pres_without_presentation_score"] < 0.2).all() def test_presentation_predictions(): expected_df = _load_expected() affinity_predictor = Class1AffinityPredictor.load() presentation_predictor = Class1PresentationPredictor.load() peptides = expected_df["peptide"].tolist() alleles = expected_df["allele"].tolist() n_flanks = expected_df["n_flank"].tolist() c_flanks = expected_df["c_flank"].tolist() with warnings.catch_warnings(): warnings.filterwarnings( "ignore", message=r".*Downcasting behavior in `replace` is deprecated.*", category=FutureWarning, ) aff_df = affinity_predictor.predict_to_dataframe( peptides=peptides, alleles=alleles, throw=False, include_percentile_ranks=True, include_confidence_intervals=True, centrality_measure="mean", model_kwargs={"batch_size": 4096}, ) np.testing.assert_array_equal( aff_df["peptide"].to_numpy(), expected_df["peptide"].to_numpy()) np.testing.assert_array_equal( aff_df["allele"].to_numpy(), _normalized_alleles(expected_df["allele"]), ) sample_names = alleles allele_map = {allele: [allele] for allele in sorted(set(alleles))} with warnings.catch_warnings(): warnings.filterwarnings( "ignore", message=r".*Downcasting behavior in `replace` is deprecated.*", category=FutureWarning, ) pres_with_df = presentation_predictor.predict( peptides=peptides, alleles=allele_map, sample_names=sample_names, n_flanks=n_flanks, c_flanks=c_flanks, include_affinity_percentile=True, verbose=0, throw=True, ).sort_values("peptide_num") pres_without_df = presentation_predictor.predict( peptides=peptides, alleles=allele_map, sample_names=sample_names, n_flanks=None, c_flanks=None, include_affinity_percentile=True, verbose=0, throw=True, ).sort_values("peptide_num") predicted = expected_df[BASE_COLUMNS].copy() predicted["affinity_prediction"] = aff_df["prediction"].values predicted["affinity_prediction_low"] = aff_df.get("prediction_low", np.nan) predicted["affinity_prediction_high"] = aff_df.get("prediction_high", np.nan) predicted["affinity_prediction_percentile"] = aff_df.get( "prediction_percentile", np.nan) predicted["pres_with_affinity"] = pres_with_df["affinity"].values predicted["pres_with_best_allele"] = ( pres_with_df["best_allele"].astype(str).values) predicted["pres_with_affinity_percentile"] = ( pres_with_df["affinity_percentile"].values) predicted["processing_with_score"] = pres_with_df["processing_score"].values predicted["pres_with_processing_score"] = ( pres_with_df["processing_score"].values) predicted["pres_with_presentation_score"] = ( pres_with_df["presentation_score"].values) predicted["pres_with_presentation_percentile"] = ( pres_with_df["presentation_percentile"].values) predicted["pres_without_affinity"] = pres_without_df["affinity"].values predicted["pres_without_best_allele"] = ( pres_without_df["best_allele"].astype(str).values) predicted["pres_without_affinity_percentile"] = ( pres_without_df["affinity_percentile"].values) predicted["processing_without_score"] = ( pres_without_df["processing_score"].values) predicted["pres_without_processing_score"] = ( pres_without_df["processing_score"].values) predicted["pres_without_presentation_score"] = ( pres_without_df["presentation_score"].values) predicted["pres_without_presentation_percentile"] = ( pres_without_df["presentation_percentile"].values) for col in STRING_COLUMNS: np.testing.assert_array_equal( _normalized_alleles(predicted[col].astype(str)), _normalized_alleles(expected_df[col].astype(str)), ) numeric_columns = [ c for c in expected_df.columns if c not in BASE_COLUMNS + STRING_COLUMNS ] for col in numeric_columns: np.testing.assert_allclose( predicted[col].to_numpy(dtype=np.float64), expected_df[col].to_numpy(dtype=np.float64), rtol=0.0, atol=_atol_for_output(col), ) mhcflurry-2.3.6/test/test_saved_candidate_evaluation.py000066400000000000000000000070011525677230600234650ustar00rootroot00000000000000import csv import importlib.util from pathlib import Path from types import SimpleNamespace import pytest @pytest.fixture def module(monkeypatch): directory = Path(__file__).resolve().parents[1] / "scripts/training" monkeypatch.syspath_prepend(str(directory)) spec = importlib.util.spec_from_file_location("saved_candidate", directory / "evaluate_saved_candidate.py") result = importlib.util.module_from_spec(spec) spec.loader.exec_module(result) return result def test_inventory_requires_actual_weights(module, tmp_path): with (tmp_path / "manifest.csv").open("w") as fd: writer = csv.DictWriter(fd, fieldnames=["model_name"]) writer.writeheader() writer.writerow({"model_name": "test"}) with pytest.raises(ValueError, match="Missing"): module.model_inventory(tmp_path) (tmp_path / "weights_test.npz").write_bytes(b"weights") assert module.model_inventory(tmp_path)["models"] == 1 def test_copy_is_portable_and_rejects_changed_weights(module, tmp_path): source = tmp_path / "source" source.mkdir() (source / "weights.npz").write_bytes(b"weights") destination = tmp_path / "new/nested/model" module.copy_predictor(source, destination) module.copy_predictor(source, destination) assert (destination / "weights.npz").read_bytes() == b"weights" (destination / "weights.npz").write_bytes(b"changed") with pytest.raises(ValueError, match="Changed"): module.copy_predictor(source, destination) def test_comparison_always_has_frozen_holdout_and_predictions(module, tmp_path): args = SimpleNamespace(public_root=tmp_path / "public", release_holdout_dir=tmp_path / "holdout", backend="gpu", gpus=1) command = module.comparison_command(args, tmp_path / "candidate", tmp_path / "eval", "presentation") assert command[command.index("--release-holdout-dir") + 1] == str(args.release_holdout_dir) assert "--skip-affinity-predictions" not in command assert "--limit-files" not in command assert command[:3] == ["mhcflurry", "eval", "compare-models"] def test_output_cannot_overlap_source(module, tmp_path): with pytest.raises(ValueError, match="separate"): module.main(["--candidate", str(tmp_path / "run"), "--out", str(tmp_path / "run/eval"), "--public-root", str(tmp_path / "public"), "--release-holdout-dir", str(tmp_path / "holdout"), "--source-commit", "test"]) def test_exact_phase_requires_saved_processing_run(module, tmp_path): with pytest.raises(ValueError, match="requires --exact-processing-run"): module.main(["--candidate", str(tmp_path / "run"), "--out", str(tmp_path / "eval"), "--public-root", str(tmp_path / "public"), "--release-holdout-dir", str(tmp_path / "holdout"), "--source-commit", "test", "--phase", "exact"]) def test_paired_comparison_adapter_preserves_both_sides(module): import pandas from paired_sample_metrics import comparison_long_frame data = pandas.DataFrame({"sample": ["one", "two"], "n": [100, 200], "n_pos": [10, 20], "a_pr_auc": [0.3, 0.4], "b_pr_auc": [0.2, 0.3]}) result = comparison_long_frame(data, units=["sample"], condition="model", metrics=["pr_auc"], labels=["candidate", "public"]) assert result.pr_auc.tolist() == [0.3, 0.4, 0.2, 0.3] assert result.n.tolist() == [100, 200, 100, 200] assert result.model.tolist() == ["candidate", "candidate", "public", "public"] mhcflurry-2.3.6/test/test_scoring_pipeline.py000066400000000000000000000075641525677230600215070ustar00rootroot00000000000000"""Concurrency contracts tested with events, not timing-dependent sleeps.""" import threading import pytest from mhcflurry.scoring_pipeline import scoring_pipeline def test_next_preparation_and_previous_write_overlap_scoring(): caller = threading.get_ident() second_prepared = threading.Event() first_writing = threading.Event() second_scoring = threading.Event() def first(): assert threading.get_ident() != caller value = yield 1 first_writing.set() assert second_scoring.wait(3), "Previous write did not overlap next score" return value def second(): second_prepared.set() value = yield 2 return value def score(key, request): assert threading.get_ident() == caller assert second_prepared.wait(3), "Next preparation did not overlap score" if key == "second": assert first_writing.wait(3), "Previous sample was not writing during score" second_scoring.set() return request * 10 results = dict(scoring_pipeline([("first", first()), ("second", second())], score, 2, 2)) assert first_writing.is_set() assert results == {"first": 10, "second": 20} def test_multiple_rounds_cached_samples_and_bounded_submission(): created = [] completed = [] calls = [] def workflow(i): if i % 2: value = yield i value += yield i + 100 else: value = i completed.append(i) return value def items(): for i in range(20): created.append(i) assert len(created) - len(completed) <= 3 yield i, workflow(i) def score(key, value): calls.append((key, value)) return value results = dict(scoring_pipeline(items(), score)) assert results == {i: (i if not i % 2 else i * 2 + 100) for i in range(20)} assert sorted(calls) == [(i, j) for i in range(1, 20, 2) for j in (i, i + 100)] @pytest.mark.parametrize("stage", ["prepare", "score", "write"]) def test_stage_errors_propagate_and_close_workflows(stage): closed = [] def workflow(): try: if stage == "prepare": raise RuntimeError(stage) yield 1 if stage == "write": raise RuntimeError(stage) finally: closed.append(True) def score(*args): if stage == "score": raise RuntimeError(stage) return 1 with pytest.raises(RuntimeError, match=stage): list(scoring_pipeline([(1, workflow())], score)) assert closed == [True] def test_consumer_close_drains_started_writes(): persisted = threading.Event() def workflow(i): yield i persisted.set() return i pipeline = scoring_pipeline([(i, workflow(i)) for i in range(3)], lambda key, value: value) next(pipeline) pipeline.close() assert persisted.is_set() assert not any(thread.name.startswith("processing-cpu") for thread in threading.enumerate()) def test_invalid_capacity_and_duplicate_keys_fail(): with pytest.raises(ValueError, match="capacities"): list(scoring_pipeline([], lambda *a: None, 0)) def workflow(): yield 1 with pytest.raises(ValueError, match="Duplicate"): list(scoring_pipeline([(1, workflow()), (1, workflow())], lambda *a: 1)) def test_finished_result_is_yielded_before_refilling(): """A failure pulling the next workflow must not discard a computed result.""" def workflow(value): return value yield # pragma: no cover - only makes this a generator def items(): yield "a", workflow(1) yield "a", workflow(2) results = [] with pytest.raises(ValueError, match="Duplicate"): for item in scoring_pipeline(items(), lambda key, value: value, max_in_flight=1): results.append(item) assert results == [("a", 1)] mhcflurry-2.3.6/test/test_select_pan_allele_models_command.py000066400000000000000000000104241525677230600246370ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Unit tests for ``mhcflurry.select_pan_allele_models_command``.""" import inspect import numpy import pandas def test_fold_col_parser_rejects_pandas_merge_suffixes(): """Regression: when train_data has been pandas-merged with stale fold_* columns still attached, the saved metadata DataFrame can carry ``fold_0_x``/``fold_0_y`` etc. The select fold-col parser must surface that as a clean error rather than crashing later in ``int(col.split("_")[-1])``.""" from mhcflurry import select_pan_allele_models_command as mod src = inspect.getsource(mod.run) assert r'r"^fold_\d+$"' in src or r"r'^fold_\d+$'" in src, ( "fold col parser must use ^fold_$ regex; otherwise " "fold_0_x slips through and crashes int() later" ) def test_train_peptide_hash_computed_before_allele_filter(): """Regression: the per-fold train_peptide_hash must be computed on the raw saved ``train_data.csv.bz2`` *before* the canonicalizable- allele filter is applied. The saved file is exactly the data ``train_pan_allele_models_command`` trained on; if select hashes a strictly narrower subset (because ``filter_canonicalizable_alleles`` drops a pseudogene/null annotation that train kept), the ``numpy.testing.assert_equal`` against ``training_info['train_peptide_hash']`` fires a false-positive and aborts model selection. Verifies (via source inspection) that the hash is built over ``df.loc[df[col] == 1]`` while ``df`` is still the raw read, i.e. before the ``df = df.loc[df.allele.isin(alleles)]`` reassignment.""" from mhcflurry import select_pan_allele_models_command as mod src = inspect.getsource(mod.run) hash_idx = src.index("make_train_peptide_hash(df.loc[df[col] == 1])") allele_filter_idx = src.index("df = df.loc[df.allele.isin(alleles)]") assert hash_idx < allele_filter_idx, ( "train_peptide_hash must be computed before the canonicalizable-" "allele filter narrows df; otherwise hashes mismatch when any " "training allele is non-canonicalizable" ) def test_model_select_can_return_row_level_validation_predictions(): from mhcflurry import Class1AffinityPredictor from mhcflurry import select_pan_allele_models_command as mod from mhcflurry.regression_target import to_ic50 class FakeModel: def predict(self, peptides, alleles): assert len(peptides) == 4 assert len(alleles.indices) == 4 return numpy.array([50000.0, 10000.0, 100.0, 10.0]) def clear_allele_representations(self): pass data = pandas.DataFrame({ "allele": ["HLA-A*02:01"] * 4, "peptide": ["AAAAAAAAA", "AAAAAAAAC", "AAAAAAAAD", "AAAAAAAAE"], "measurement_value": [50000.0, 10000.0, 100.0, 10.0], "measurement_source": ["binding"] * 4, "fold_0": [0] * 4, }) predictor = Class1AffinityPredictor( allele_to_sequence={"HLA-A*02:01": "A" * 34}) result = mod.model_select( fold_num=0, models=[FakeModel()], min_models=1, max_models=1, save_validation_predictions=True, constant_data={"data": data, "input_predictor": predictor}, ) predictions = result["validation_predictions"] assert predictions["validation_row_index"].tolist() == [0, 1, 2, 3] assert predictions["fold_num"].tolist() == [0] * 4 assert predictions["selected_model_indices"].tolist() == ["0"] * 4 expected_01 = mod.from_ic50( numpy.array([50000.0, 10000.0, 100.0, 10.0])) numpy.testing.assert_allclose( predictions["affinity_prediction_01"], expected_01) numpy.testing.assert_allclose( predictions["affinity_prediction"], to_ic50(expected_01), ) assert "fold_0" not in predictions mhcflurry-2.3.6/test/test_select_processing_models_command.py000066400000000000000000000054011525677230600247160ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Unit tests for ``mhcflurry.select_processing_models_command``.""" import inspect import numpy import pandas def test_fold_col_parser_rejects_pandas_merge_suffixes(): """Regression: ``fold_0_x`` must not be parsed as a real fold column.""" from mhcflurry import select_processing_models_command as mod src = inspect.getsource(mod.run) assert r'r"^fold_\d+$"' in src or r"r'^fold_\d+$'" in src, ( "fold col parser must use ^fold_$ regex; otherwise " "fold_0_x slips through and crashes int() later" ) def test_model_select_uses_numpy_prediction_matrix(): """Greedy processing selection should not depend on pandas model columns.""" from mhcflurry import select_processing_models_command as mod class FakeModel: def __init__(self, predictions): self.predictions = numpy.asarray(predictions) def predict_encoded(self, sequences): assert len(sequences) == len(self.predictions) return self.predictions data = pandas.DataFrame({ "peptide": ["AAAA"] * 6, "n_flank": [""] * 6, "c_flank": [""] * 6, "hit": [0, 0, 0, 1, 1, 1], "fold_0": [0] * 6, }) models = [ FakeModel([0.1, 0.2, 0.9, 0.4, 0.8, 0.7]), FakeModel([0.1, 0.8, 0.2, 0.9, 0.4, 0.7]), FakeModel([0.9, 0.8, 0.7, 0.3, 0.2, 0.1]), ] result = mod.model_select( fold_num=0, models=models, min_models=1, max_models=3, save_validation_predictions=True, constant_data={"data": data}) assert result["selected_indices"] == [1, 0] summary = result["summary"] assert summary.loc[0, "selected_in_round"] == 2 assert summary.loc[1, "selected_in_round"] == 1 assert pandas.isna(summary.loc[2, "selected_in_round"]) predictions = result["validation_predictions"] assert predictions["validation_row_index"].tolist() == list(range(6)) assert predictions["fold_num"].tolist() == [0] * 6 assert predictions["selected_model_indices"].tolist() == ["1,0"] * 6 numpy.testing.assert_allclose( predictions["processing_score"], numpy.mean([models[1].predictions, models[0].predictions], axis=0), ) assert "fold_0" not in predictions mhcflurry-2.3.6/test/test_selected_peptides_csv.py000066400000000000000000000107061525677230600225060ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Regression checks against selected-peptides.csv. Compares current MHCflurry predictions to values recorded from the previous public release, and checks NetMHCpan affinity is reasonably close. """ import os import numpy as np import pandas as pd import pytest from mhcflurry import Class1AffinityPredictor, Class1PresentationPredictor from mhcflurry.common import allele_locus_name, normalize_allele_name from mhcflurry.downloads import get_path from mhcflurry.testing_utils import startup, cleanup DATA_PATH = os.path.join( os.path.dirname(__file__), "data", "selected-peptides.csv", ) def _normalize_allele(allele): if allele is None or (isinstance(allele, float) and np.isnan(allele)): return allele allele = str(allele).strip() return normalize_allele_name( allele, raise_on_error=False, default_value=allele, ) def _is_human_hla_ab(allele): return allele_locus_name(allele) in ("HLA-A", "HLA-B") @pytest.fixture(scope="module") def selected_peptides_predictions(): startup() try: df = pd.read_csv(DATA_PATH) peptides = df["mhcflurry_peptide"].fillna(df["peptide"]).tolist() alleles = [_normalize_allele(a) for a in df["mhcflurry_best_allele"].tolist()] sample_names = [f"row_{i}" for i in range(len(peptides))] alleles_dict = {name: [allele] for name, allele in zip(sample_names, alleles)} predictor = Class1PresentationPredictor.load( get_path("models_class1_presentation", "models") ) pred_df = predictor.predict( peptides=peptides, alleles=alleles_dict, sample_names=sample_names, n_flanks=None, c_flanks=None, verbose=0, ) pred_df = pred_df.sort_values("peptide_num").reset_index(drop=True) df = df.reset_index(drop=True) return df, pred_df finally: cleanup() def test_selected_peptides_mhcflurry_matches_csv(selected_peptides_predictions): df, pred_df = selected_peptides_predictions np.testing.assert_allclose( pred_df["affinity"].values, df["mhcflurry_affinity"].values.astype(float), rtol=0.01, atol=1e-6, ) np.testing.assert_allclose( pred_df["processing_score"].values, df["mhcflurry_processing_score"].values.astype(float), rtol=0.01, atol=1e-6, ) np.testing.assert_allclose( pred_df["presentation_score"].values, df["mhcflurry_presentation_score"].values.astype(float), rtol=0.01, atol=1e-6, ) np.testing.assert_allclose( pred_df["presentation_percentile"].values, df["mhcflurry_presentation_percentile"].values.astype(float), rtol=0.01, atol=0.1, ) def test_selected_peptides_netmhcpan_affinity_close(selected_peptides_predictions): df, _ = selected_peptides_predictions net_alleles = [_normalize_allele(a) for a in df["netmhcpan_best_allele_by_pr"].tolist()] mhc_alleles = [_normalize_allele(a) for a in df["mhcflurry_best_allele"].tolist()] mask = [ _is_human_hla_ab(net) and _is_human_hla_ab(mhc) for net, mhc in zip(net_alleles, mhc_alleles) ] df = df.loc[mask].reset_index(drop=True) peptides = df["mhcflurry_peptide"].fillna(df["peptide"]).tolist() alleles = [net for net, keep in zip(net_alleles, mask) if keep] startup() try: predictor = Class1AffinityPredictor.load( get_path("models_class1", "models") ) mhc_aff = predictor.predict(peptides=peptides, alleles=alleles).astype(float) finally: cleanup() net_aff = df["netmhcpan_aff"].values.astype(float) mhc_aff = np.clip(mhc_aff, 1e-6, None) net_aff = np.clip(net_aff, 1e-6, None) log_diff = np.abs(np.log10(mhc_aff) - np.log10(net_aff)) # Within 10x for HLA-A/B when comparing to NetMHCpan's best allele. assert (log_diff <= np.log10(10)).all() mhcflurry-2.3.6/test/test_shared_percent_rank_transforms.py000066400000000000000000000356121525677230600244300ustar00rootroot00000000000000"""Shared calibration APIs, historical persistence, and numerical direction.""" import json import pickle import numpy as np import pandas as pd import pytest from numpy.testing import assert_allclose, assert_array_equal from scipy.special import expit from sklearn.metrics import average_precision_score from mhcflurry import ( Class1AffinityPredictor, Class1PresentationPredictor, Class1ProcessingPredictor, CompactPercentRankTransform, HistogramPercentRankTransform) from mhcflurry.percent_rank_transform import PercentRankTransform from mhcflurry.percentile_calibration import ( fit_percent_rank_transform, load_percent_rank_transforms, save_percent_rank_transforms) def test_historical_import_pickle_and_cdf_are_unchanged(): assert PercentRankTransform is HistogramPercentRankTransform transform = PercentRankTransform().fit([1, 2, 3], [0, 1, 2, 3, 4]) probes = np.array([0., 1., 2., 3., 4., np.nan]) expected = transform.transform(probes) assert_array_equal(expected[:-1], [0, 0, 0, 100 / 3, 200 / 3]) # A pickle referring to the old module/class still resolves the alias. old_global = pickle.loads(b"cmhcflurry.percent_rank_transform\nPercentRankTransform\n.") assert old_global is HistogramPercentRankTransform restored = HistogramPercentRankTransform.from_dict(json.loads(json.dumps(transform.to_dict()))) assert_array_equal(restored.transform(probes), expected) assert_array_equal(transform.transform(probes, survival=True), 100 - expected) @pytest.mark.parametrize("coordinate", ["log", "logit"]) def test_generic_compact_directions_roundtrip_and_ranking(coordinate): rng = np.random.default_rng(27) convert = np.exp if coordinate == "log" else expit reference = convert(rng.normal(-3, 1.5, 5000)) scores = convert(rng.normal(-2, 1.5, 10000)) labels = rng.random(len(scores)) < .2 transform = CompactPercentRankTransform(coordinate).fit(reference) assert len(transform.x) <= 64 restored = CompactPercentRankTransform.from_dict(json.loads(json.dumps(transform.to_dict()))) for survival in (False, True): ranks = transform.transform(scores, survival=survival) assert_array_equal(ranks, restored.transform(scores, survival=survival)) signed_raw = -scores if survival else scores assert average_precision_score(labels, ranks) == average_precision_score(labels, signed_raw) assert_allclose(transform.transform(scores) + transform.transform(scores, survival=True), 100) assert np.isnan(transform.transform([np.nan])[0]) assert transform.transform([]).size == 0 def test_survival_does_not_subtract_rounded_cdf(): transform = CompactPercentRankTransform("log").fit(np.exp(np.linspace(-2, 2, 10000))) probes = np.exp(np.linspace(2.2, 2.3, 20)) survival = transform.transform(probes, survival=True) assert np.all(survival > 0) assert np.all(np.diff(survival) < 0) assert np.all(transform.transform(probes) > 99.999) @pytest.mark.parametrize("predictor_class", [Class1PresentationPredictor, Class1ProcessingPredictor]) def test_probability_predictors_share_api_and_save_load(tmp_path, monkeypatch, predictor_class): if predictor_class is Class1ProcessingPredictor: predictor = predictor_class(models=[]) save_kwargs = {} else: predictor = predictor_class(weights_dataframe=pd.DataFrame({"intercept": [0.]}, index=["without_flanks"])) save_kwargs = dict(write_affinity_predictor=False, write_processing_predictor=False) monkeypatch.setattr(Class1AffinityPredictor, "load", lambda *args, **kwargs: None) scores = expit(np.linspace(-8, 4, 1000)) predictor.calibrate_percentile_ranks(scores) assert type(predictor.percent_rank_transform) is CompactPercentRankTransform assert predictor.percent_rank_transform.selection["selected_knots"] == 64 expected = predictor.percentile_ranks(scores) assert np.all(np.diff(expected) < 0) predictor.save(str(tmp_path), **save_kwargs) restored = predictor_class.load(str(tmp_path)) assert_array_equal(restored.percentile_ranks(scores), expected) assert (tmp_path / "percent_ranks.json").exists() assert not (tmp_path / "percent_ranks.csv").exists() # An explicit histogram recalibration replaces the compact file, not its weights. predictor.calibrate_percentile_ranks(scores, bins=30) predictor.save(str(tmp_path), **save_kwargs) restored = predictor_class.load(str(tmp_path)) assert type(restored.percent_rank_transform) is HistogramPercentRankTransform assert_allclose(restored.percentile_ranks(scores), predictor.percentile_ranks(scores), rtol=0, atol=1e-12) assert not (tmp_path / "percent_ranks.json").exists() assert (tmp_path / "percent_ranks.csv").exists() def test_affinity_compact_api_and_mixed_legacy_persistence(tmp_path, monkeypatch): predictor = Class1AffinityPredictor() monkeypatch.setattr(predictor, "predict", lambda *args, **kwargs: np.geomspace(1, 50000, 1000)) predictor.calibrate_percentile_ranks(peptides=["SIINFEKL"] * 1000, alleles=["HLA-A*02:01"]) compact = predictor.allele_to_percent_rank_transform["HLA-A*02:01"] assert compact.score_transform == "log" assert compact.selection["group_count"] == 1 predictor.allele_to_percent_rank_transform["HLA-B*07:02"] = ( HistogramPercentRankTransform().fit([1., 100, 50000], [1., 100, 50000])) expected = predictor.percentile_ranks([10., 1000.], allele="HLA-A*02:01") assert expected[0] < expected[1] predictor.save(str(tmp_path)) restored = Class1AffinityPredictor.load(str(tmp_path), optimization_level=0) assert_array_equal(restored.percentile_ranks([10., 1000.], allele="HLA-A*02:01"), expected) assert type(restored.allele_to_percent_rank_transform["HLA-B*07:02"]) is HistogramPercentRankTransform def test_reference_budget_decision_is_deterministic_and_persisted(): values = expit(np.random.default_rng(42).normal(size=30000)) groups = np.arange(len(values)) // 3 first = fit_percent_rank_transform(values, groups=groups, survival=True) second = fit_percent_rank_transform(values, groups=groups, survival=True) assert first.to_dict() == second.to_dict() decision = first.selection assert decision["selected_knots"] in (64, 128) errors = decision["rms_log10_error"] needs_128 = errors[64] > errors[128] + decision["tolerance"] assert (decision["selected_knots"] == 128) == needs_128 assert decision["validation_count"] == 6000 fixed = fit_percent_rank_transform(values, max_knots=64) assert fixed.selection["selected_knots"] == 64 assert len(fixed.x) <= 64 def test_escalation_to_128_requires_validation_evidence(monkeypatch): """Exercise the gate without relying on a lucky random sample.""" import mhcflurry.percentile_calibration as module original_fit = module.CompactPercentRankTransform.fit def fit_with_budget(self, values, num_knots=64): self._test_budget = num_knots return original_fit(self, values, num_knots) def validation_ranks(self, values, survival=False): ranks = (np.arange(len(values)) + .5) * 100 / len(values) return ranks if self._test_budget == 128 else ranks / 2 monkeypatch.setattr(module.CompactPercentRankTransform, "fit", fit_with_budget) monkeypatch.setattr(module.CompactPercentRankTransform, "transform", validation_ranks) model = module.fit_percent_rank_transform(expit(np.linspace(-4, 4, 30000))) assert model.selection["selected_knots"] == 128 assert len(model.x) <= 128 assert model.selection["rms_log10_error"][64] > model.selection["rms_log10_error"][128] + .01 def test_processing_cli_uses_explicit_context_and_retains_scores(tmp_path, monkeypatch): from types import SimpleNamespace from mhcflurry.cli import calibrate_percentile_ranks_command as command class FakePredictor(Class1ProcessingPredictor): @property def sequence_lengths(self): return dict(peptide=15, n_flank=5, c_flank=5) def predict(self, peptides, n_flanks=None, c_flanks=None, **kwargs): assert list(n_flanks) == ["AAAAA", "CCCCC", ""] assert list(c_flanks) == ["DDDDD", "EEEEE", ""] return np.array([.1, .2, .3]) predictor = FakePredictor([]) monkeypatch.setattr(command.Class1ProcessingPredictor, "load", lambda *args, **kwargs: predictor) monkeypatch.setattr(command, "write_generate_sh", lambda *args: None) reference = tmp_path / "reference.csv" reference.write_text("peptide,n_flank,c_flank\nSIINFEKL,AAAAA,DDDDD\nSIINFEKA,CCCCC,EEEEE\nSIINFEKC,,\n") args = SimpleNamespace(models_dir=str(tmp_path), processing_reference_data=str(reference), prediction_batch_size=10, percentile_method="compact", max_percentile_knots=128) command.run_class1_processing_predictor(args) with np.load(tmp_path / "percent_rank_reference.npz", allow_pickle=False) as saved: assert_array_equal(saved["scores"], [.1, .2, .3]) assert_array_equal(saved["n_flank"], ["AAAAA", "CCCCC", ""]) reference.write_text("peptide\nSIINFEKL\nSIINFEKA\n") with pytest.raises(ValueError, match="requires columns"): command.run_class1_processing_predictor(args) def test_generic_tail_underflow_has_log_percentile_escape_hatch(): transform = CompactPercentRankTransform("log").fit(np.exp(np.linspace(-2, 2, 10000))) probes = np.exp(np.linspace(10, 11, 20)) # Floating-point exponentiation eventually underflows; do not claim that # ordinary percentiles preserve every distinguishable score indefinitely. assert np.all(transform.transform(probes, survival=True) == 0) logarithms = transform.log_percentiles(probes, survival=True) assert np.isfinite(logarithms).all() assert np.all(np.diff(logarithms) < 0) def test_bad_methods_and_domains_fail_before_save(tmp_path): for kwargs in [dict(method="unknown"), dict(method="compact", bins=10), dict(max_knots=256)]: with pytest.raises(ValueError): fit_percent_rank_transform([.1, .2], **kwargs) for values in ([0, 1], [-1, 2], [1, np.inf]): with pytest.raises(ValueError): CompactPercentRankTransform("log").fit(values) with pytest.raises(ValueError, match="align"): fit_percent_rank_transform([.1, .2], groups=["one"]) with pytest.raises(ValueError, match="not been fitted"): CompactPercentRankTransform().transform([.5]) (tmp_path / "percent_ranks.json").write_text('{"format": "future-v999"}') with pytest.raises(ValueError, match="Unsupported"): load_percent_rank_transforms(tmp_path) def test_processing_missing_calibration_and_old_directory(tmp_path): predictor = Class1ProcessingPredictor([]) with pytest.raises(ValueError, match="No processing"): predictor.percentile_ranks([.1]) with pytest.warns(UserWarning): assert np.isnan(predictor.percentile_ranks([.1], throw=False)[0]) predictor.save(str(tmp_path)) assert not (tmp_path / "percent_ranks.json").exists() assert Class1ProcessingPredictor.load(str(tmp_path)).percent_rank_transform is None def test_atomic_calibration_write_failure_preserves_previous(tmp_path, monkeypatch): import mhcflurry.percentile_calibration as module old = HistogramPercentRankTransform().fit([.1, .2, .5], 3) save_percent_rank_transforms(tmp_path, {"score": old}) before = (tmp_path / "percent_ranks.csv").read_bytes() def fail(*args, **kwargs): raise OSError("simulated failed replacement") monkeypatch.setattr(module.os, "replace", fail) with pytest.raises(OSError, match="simulated"): save_percent_rank_transforms(tmp_path, {"score": CompactPercentRankTransform().fit([.1, .2])}) assert (tmp_path / "percent_ranks.csv").read_bytes() == before assert not list(tmp_path.glob(".percent-ranks-*")) def test_reused_group_codes_match_per_fit_grouping(): import json from mhcflurry.percentile_calibration import factorize_calibration_groups rng = np.random.default_rng(1) peptides = np.array(["P%d" % i for i in rng.integers(0, 3000, size=6000)]) values = np.exp(rng.normal(8, 2, size=len(peptides))) codes = factorize_calibration_groups(peptides) per_fit = fit_percent_rank_transform(values, score_transform="log", groups=peptides) reused = fit_percent_rank_transform(values, score_transform="log", group_codes=codes) assert "validation_count" in per_fit.selection assert json.dumps(per_fit.to_dict(), sort_keys=True) == json.dumps(reused.to_dict(), sort_keys=True) with pytest.raises(ValueError, match="not both"): fit_percent_rank_transform(values, groups=peptides, group_codes=codes) with pytest.raises(ValueError, match="align"): fit_percent_rank_transform(values[:10], score_transform="log", group_codes=codes) def test_empty_save_preserves_calibration_with_umask_permissions(tmp_path): import os import stat save_percent_rank_transforms(tmp_path, {"score": CompactPercentRankTransform().fit([.1, .2, .7])}) path = tmp_path / "percent_ranks.json" before = path.read_bytes() save_percent_rank_transforms(tmp_path, {}) assert path.read_bytes() == before umask = os.umask(0) os.umask(umask) assert stat.S_IMODE(path.stat().st_mode) == 0o666 & ~umask def test_interrupted_dual_format_calibration_loads_the_newer_file(tmp_path): import os import shutil import time histogram = tmp_path / "histogram" histogram.mkdir() save_percent_rank_transforms(histogram, {"score": HistogramPercentRankTransform().fit([.1, .2, .5], 3)}) save_percent_rank_transforms(tmp_path, {"score": CompactPercentRankTransform().fit([.1, .2, .7])}) assert (tmp_path / "percent_ranks.json").exists() and not (tmp_path / "percent_ranks.csv").exists() # An interrupted save leaves the replaced target beside the older format. shutil.copyfile(histogram / "percent_ranks.csv", tmp_path / "percent_ranks.csv") stale = time.time() - 60 os.utime(tmp_path / "percent_ranks.csv", (stale, stale)) with pytest.warns(UserWarning, match="interrupted calibration save"): loaded = load_percent_rank_transforms(tmp_path) assert type(loaded["score"]) is CompactPercentRankTransform os.utime(tmp_path / "percent_ranks.csv", None) with pytest.warns(UserWarning, match="interrupted calibration save"): loaded = load_percent_rank_transforms(tmp_path) assert type(loaded["score"]) is HistogramPercentRankTransform def test_percentile_ranks_honor_throw_for_unsupported_affinities(monkeypatch): predictor = Class1AffinityPredictor() monkeypatch.setattr(predictor, "predict", lambda *args, **kwargs: np.geomspace(1, 50000, 1000)) predictor.calibrate_percentile_ranks(peptides=["SIINFEKL"] * 1000, alleles=["HLA-A*02:01"]) with pytest.warns(UserWarning, match="positive finite"): ranks = predictor.percentile_ranks([0.0, float("inf")], allele="HLA-A*02:01", throw=False) assert np.isnan(ranks).all() with pytest.raises(ValueError, match="positive finite"): predictor.percentile_ranks([0.0], allele="HLA-A*02:01") mhcflurry-2.3.6/test/test_speed.py000066400000000000000000000145651525677230600172550ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Profile prediction speed """ import time import cProfile import pstats import collections import argparse import sys import pytest import pandas from mhcflurry import Class1AffinityPredictor from mhcflurry.encodable_sequences import EncodableSequences from mhcflurry.common import random_peptides from mhcflurry.downloads import get_path from mhcflurry.testing_utils import cleanup, startup pytestmark = [pytest.mark.slow, pytest.mark.downloads] ALLELE_SPECIFIC_PREDICTOR = None PAN_ALLELE_PREDICTOR = None def setup_module(): global ALLELE_SPECIFIC_PREDICTOR, PAN_ALLELE_PREDICTOR startup() ALLELE_SPECIFIC_PREDICTOR = Class1AffinityPredictor.load( get_path("models_class1", "models")) PAN_ALLELE_PREDICTOR = Class1AffinityPredictor.load( get_path("models_class1_pan", "models.combined")) def teardown_module(): global ALLELE_SPECIFIC_PREDICTOR, PAN_ALLELE_PREDICTOR ALLELE_SPECIFIC_PREDICTOR = None PAN_ALLELE_PREDICTOR = None cleanup() DEFAULT_NUM_PREDICTIONS = 10000 def load_predictors(): return { 'allele_specific': Class1AffinityPredictor.load(get_path("models_class1", "models")), 'pan_allele': Class1AffinityPredictor.load(get_path("models_class1_pan", "models.combined")), } # Define a fixture to initialize and clean up predictors @pytest.fixture(scope="module") def predictors(): startup() predictors_dict = load_predictors() yield predictors_dict cleanup() @pytest.fixture(autouse=True) def init(): from . import initialize initialize() def test_speed_allele_specific(predictors, profile=False, num=DEFAULT_NUM_PREDICTIONS): starts = collections.OrderedDict() timings = collections.OrderedDict() profilers = collections.OrderedDict() predictor = predictors['allele_specific'] def start(name): starts[name] = time.time() if profile: profilers[name] = cProfile.Profile() profilers[name].enable() def end(name): timings[name] = time.time() - starts[name] if profile: profilers[name].disable() start("first") predictor.predict(["SIINFEKL"], allele="HLA-A*02:01") end("first") peptides = random_peptides(num) start("pred_%d" % num) predictor.predict(peptides, allele="HLA-A*02:01") end("pred_%d" % num) NUM2 = 10000 peptides = EncodableSequences.create(random_peptides(NUM2, length=13)) start("encode_blosum_%d" % NUM2) peptides.variable_length_to_fixed_length_vector_encoding("BLOSUM62") end("encode_blosum_%d" % NUM2) start("pred_already_encoded_%d" % NUM2) predictor.predict(peptides, allele="HLA-A*02:01") end("pred_already_encoded_%d" % NUM2) NUM_REPEATS = 100 start("pred_already_encoded_%d_%d_times" % (NUM2, NUM_REPEATS)) for _ in range(NUM_REPEATS): predictor.predict(peptides, allele="HLA-A*02:01") end("pred_already_encoded_%d_%d_times" % (NUM2, NUM_REPEATS)) print("SPEED BENCHMARK") print("Results:\n%s" % str(pandas.Series(timings))) if __name__ == '__main__': # Only return values if run directly from Python, since pytest complains # about return values from tests. return dict( (key, pstats.Stats(value)) for (key, value) in profilers.items()) def test_speed_pan_allele(predictors, profile=False, num=DEFAULT_NUM_PREDICTIONS): starts = collections.OrderedDict() timings = collections.OrderedDict() profilers = collections.OrderedDict() predictor = predictors['pan_allele'] def start(name): starts[name] = time.time() if profile: profilers[name] = cProfile.Profile() profilers[name].enable() def end(name): timings[name] = time.time() - starts[name] if profile: profilers[name].disable() start("first") predictor.predict(["SIINFEKL"], allele="HLA-A*02:01") end("first") peptides = random_peptides(num) start("pred_%d" % num) predictor.predict(peptides, allele="HLA-A*02:01") end("pred_%d" % num) print("SPEED BENCHMARK") print("Results:\n%s" % str(pandas.Series(timings))) if __name__ == '__main__': # Only return values if run directly from Python, since pytest complains # about return values from tests. return dict( (key, pstats.Stats(value)) for (key, value) in profilers.items()) parser = argparse.ArgumentParser(usage=__doc__) parser.add_argument( "--predictor", nargs="+", choices=["allele-specific", "pan-allele"], default=["allele-specific", "pan-allele"], help="Which predictors to run") parser.add_argument( "--num-predictions", type=int, default=DEFAULT_NUM_PREDICTIONS, help="Number of predictions to run") if __name__ == '__main__': # If run directly from python, do profiling and leave the user in a shell # to explore results. args = parser.parse_args(sys.argv[1:]) setup_module() predictors_dict = { "allele_specific": ALLELE_SPECIFIC_PREDICTOR, "pan_allele": PAN_ALLELE_PREDICTOR, } if "allele-specific" in args.predictor: print("Running allele-specific test") result = test_speed_allele_specific( predictors=predictors_dict, profile=True, num=args.num_predictions) result[ "pred_%d" % args.num_predictions ].sort_stats("cumtime").reverse_order().print_stats() if "pan-allele" in args.predictor: print("Running pan-allele test") result = test_speed_pan_allele( predictors=predictors_dict, profile=True, num=args.num_predictions) result[ "pred_%d" % args.num_predictions ].sort_stats("cumtime").reverse_order().print_stats() # Leave in ipython locals().update(result) import ipdb # pylint: disable=import-error ipdb.set_trace() mhcflurry-2.3.6/test/test_torch_baseline_regression.py000066400000000000000000000076111525677230600233700ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Tight torch-baseline regression guard. Unlike the master (Keras/TF) compatibility fixtures — which compare against a pre-migration baseline at a loose 1% tolerance that absorbs the TF->torch framework switch — this test freezes the predictions of the *released* models as computed by the current torch code and asserts agreement within 1e-6 on CPU. Any future change (encoding, loading, a refactor) that perturbs a prediction fails loudly here. It also covers the standalone processing predictor. Regenerate ``test/data/torch_baseline_predictions.json`` only deliberately, when a numerics change is intended and reviewed. """ import json import os import numpy as np import pytest from mhcflurry import Class1AffinityPredictor, Class1PresentationPredictor from mhcflurry.common import configure_pytorch from mhcflurry.downloads import get_path from mhcflurry.testing_utils import cleanup, startup pytestmark = pytest.mark.downloads BASELINE_PATH = os.path.join( os.path.dirname(__file__), "data", "torch_baseline_predictions.json") # CPU is deterministic; the baseline was frozen on CPU. Match tightly. RTOL = 1e-6 ATOL = 1e-6 def setup_module(): startup() configure_pytorch(backend="cpu") def teardown_module(): cleanup() def _baseline(): with open(BASELINE_PATH) as f: return json.load(f) def _assert_close(actual, expected, label): np.testing.assert_allclose( np.asarray(actual, dtype=np.float64), np.asarray(expected, dtype=np.float64), rtol=RTOL, atol=ATOL, err_msg="torch-baseline regression: %s predictions changed. If this is " "an intended numerics change, regenerate " "test/data/torch_baseline_predictions.json." % label, ) def test_affinity_allele_specific_predictions_match_baseline(): b = _baseline() predictor = Class1AffinityPredictor.load(get_path("models_class1", "models")) for allele, expected in b["affinity_allele_specific"].items(): _assert_close( predictor.predict(b["peptides"], allele=allele), expected, "affinity allele-specific %s" % allele) def test_affinity_pan_predictions_match_baseline(): b = _baseline() predictor = Class1AffinityPredictor.load( get_path("models_class1_pan", "models.combined")) for allele, expected in b["affinity_pan"].items(): _assert_close( predictor.predict(b["peptides"], allele=allele), expected, "affinity pan %s" % allele) def test_processing_predictions_match_baseline(): b = _baseline() pres = Class1PresentationPredictor.load() _assert_close( pres.processing_predictor_with_flanks.predict( b["peptides"], b["n_flanks"], b["c_flanks"]), b["processing_with_flanks"], "processing with flanks") empty = [""] * len(b["peptides"]) _assert_close( pres.processing_predictor_without_flanks.predict( b["peptides"], empty, empty), b["processing_no_flanks"], "processing without flanks") def test_presentation_predictions_match_baseline(): b = _baseline() pres = Class1PresentationPredictor.load() df = pres.predict( peptides=b["peptides"], alleles={"sample": b["alleles"]}, n_flanks=b["n_flanks"], c_flanks=b["c_flanks"], verbose=0) _assert_close( df["presentation_score"].values, b["presentation_score"], "presentation score") mhcflurry-2.3.6/test/test_train_and_related_commands.py000066400000000000000000000223361525677230600234700ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Test train, calibrate percentile ranks, and model selection commands. """ import json import os import shutil import tempfile from copy import deepcopy import pytest import numpy import pandas from mhcflurry import Class1AffinityPredictor from mhcflurry import calibrate_percentile_ranks_command from mhcflurry import common from mhcflurry import select_allele_specific_models_command from mhcflurry import train_allele_specific_models_command from mhcflurry.testing_utils import cleanup, startup @pytest.fixture(autouse=True, scope="module") def setup_module(): startup() yield cleanup() os.environ["CUDA_VISIBLE_DEVICES"] = "" HYPERPARAMETERS = [ { "n_models": 1, "max_epochs": 2, "patience": 1, "minibatch_size": 8, "early_stopping": False, "validation_split": 0.0, "random_negative_rate": 0.0, "random_negative_constant": 0, "peptide_amino_acid_encoding": "BLOSUM62", "use_embedding": False, "kmer_size": 15, "batch_normalization": False, "locally_connected_layers": [], "activation": "tanh", "output_activation": "sigmoid", "layer_sizes": [ 4 ], "random_negative_affinity_min": 20000.0, "random_negative_affinity_max": 50000.0, "dense_layer_l1_regularization": 0.001, "dropout_probability": 0.0 } ] TINY_AFFINITY_DATA = [ ("HLA-A*02:01", "SLYNTVATL", 40.0), ("HLA-A*02:01", "GILGFVFTL", 55.0), ("HLA-A*02:01", "NLVPMVATV", 80.0), ("HLA-A*02:01", "YLQPRTFLL", 120.0), ("HLA-A*02:01", "KLVALGINAV", 9000.0), ("HLA-A*02:01", "FLRGRAYGL", 12000.0), ("HLA-A*02:01", "ELAGIGILTV", 18000.0), ("HLA-A*02:01", "RMFPNAPYL", 26000.0), ("HLA-A*03:01", "KLGGALQAK", 45.0), ("HLA-A*03:01", "ILRGSVAHK", 70.0), ("HLA-A*03:01", "RLRPGGKKK", 110.0), ("HLA-A*03:01", "ALWGFFPVL", 140.0), ("HLA-A*03:01", "SIINFEKL", 10000.0), ("HLA-A*03:01", "GILGFVFTL", 13000.0), ("HLA-A*03:01", "NLVPMVATV", 19000.0), ("HLA-A*03:01", "YLQPRTFLL", 30000.0), ] def write_tiny_affinity_data(filename): pandas.DataFrame( [ { "allele": allele, "peptide": peptide, "measurement_value": measurement_value, "measurement_type": "quantitative", "measurement_source": "synthetic unit test", } for allele, peptide, measurement_value in TINY_AFFINITY_DATA ] ).to_csv(filename, index=False) def run_command(command_module, args): command_module.WORKER_CONTEXT.clear() try: command_module.run(args) finally: command_module.WORKER_CONTEXT.clear() def test_train_calibrate_and_select_commands(): models_dir1 = tempfile.mkdtemp(prefix="mhcflurry-test-models") models_dir2 = tempfile.mkdtemp(prefix="mhcflurry-test-models") old_backend = common._pytorch_backend try: hyperparameters_filename = os.path.join( models_dir1, "hyperparameters.yaml") # Include one architecture that has max_epochs = 0. We check that it never # gets selected in model selection. hyperparameters = [ deepcopy(HYPERPARAMETERS[0]), deepcopy(HYPERPARAMETERS[0]), ] hyperparameters[-1]["max_epochs"] = 0 with open(hyperparameters_filename, "w") as fd: json.dump(hyperparameters, fd) train_data_filename = os.path.join(models_dir1, "train_data_input.csv") write_tiny_affinity_data(train_data_filename) run_command( train_allele_specific_models_command, [ "--data", train_data_filename, "--hyperparameters", hyperparameters_filename, "--allele", "HLA-A*02:01", "HLA-A*03:01", "--out-models-dir", models_dir1, "--num-jobs", "0", "--backend", "cpu", "--held-out-fraction-reciprocal", "2", "--n-models", "1", ], ) assert common._pytorch_backend == "cpu" result = Class1AffinityPredictor.load(models_dir1) assert len(result.neural_networks) == 4 run_command( calibrate_percentile_ranks_command, [ "--models-dir", models_dir1, "--num-peptides-per-length", "20", "--length-range", "8", "9", "--allele", "HLA-A*02:01", "HLA-A*03:01", "--num-jobs", "0", ], ) result = Class1AffinityPredictor.load(models_dir1) predictions = result.predict( peptides=["SLYNTVATL"], alleles=["HLA-A*02:01"]) assert predictions.shape == (1,) assert numpy.isfinite(predictions).all() df = result.predict_to_dataframe( peptides=["SLYNTVATL"], alleles=["HLA-A*02:01"]) print(df) assert "prediction_percentile" in df.columns run_command( select_allele_specific_models_command, [ "--data", train_data_filename, "--exclude-data", models_dir1 + "/train_data.csv.bz2", "--out-models-dir", models_dir2, "--models-dir", models_dir1, "--num-jobs", "0", "--allele", "HLA-A*02:01", "HLA-A*03:01", "--scoring", "mse", "--mse-max-models", "1", "--mse-min-models", "1", "--unselected-accuracy-scorer", "", ], ) result = Class1AffinityPredictor.load(models_dir2) assert len(result.neural_networks) == 2 assert ( len(result.allele_to_allele_specific_models["HLA-A*02:01"]) == 1) assert ( len(result.allele_to_allele_specific_models["HLA-A*03:01"]) == 1) assert ( result.allele_to_allele_specific_models[ "HLA-A*02:01"][0].hyperparameters["max_epochs"] == 2) assert ( result.allele_to_allele_specific_models[ "HLA-A*03:01"][0].hyperparameters["max_epochs"] == 2) finally: common.configure_pytorch(backend=old_backend) print("Deleting: %s" % models_dir1) print("Deleting: %s" % models_dir2) shutil.rmtree(models_dir1, ignore_errors=True) shutil.rmtree(models_dir2, ignore_errors=True) def _allele_specific_weights_by_allele(models_dir): predictor = Class1AffinityPredictor.load(models_dir) out = {} for allele, networks in predictor.allele_to_allele_specific_models.items(): out[allele] = numpy.concatenate([ value.detach().cpu().numpy().ravel() for nn in networks for value in nn.network().state_dict().values()]) return out def test_train_allele_specific_reproducible_from_seed(): """Same --random-seed -> bit-identical allele-specific models; a different seed -> different. Exercises the per-fit seed threading (weight init, shuffles) end-to-end through the train command.""" workdir = tempfile.mkdtemp(prefix="mhcflurry-test-seed-as") old_backend = common._pytorch_backend try: hp_filename = os.path.join(workdir, "hp.yaml") with open(hp_filename, "w") as fd: json.dump([deepcopy(HYPERPARAMETERS[0])], fd) data_filename = os.path.join(workdir, "data.csv") write_tiny_affinity_data(data_filename) def train(run_name, seed): out_dir = os.path.join(workdir, run_name) os.makedirs(out_dir) run_command( train_allele_specific_models_command, [ "--data", data_filename, "--hyperparameters", hp_filename, "--allele", "HLA-A*02:01", "HLA-A*03:01", "--out-models-dir", out_dir, "--num-jobs", "0", "--backend", "cpu", "--n-models", "1", "--random-seed", str(seed), ], ) return _allele_specific_weights_by_allele(out_dir) same_a = train("a", 7) same_b = train("b", 7) different = train("c", 8) assert same_a and set(same_a) == set(same_b) == set(different) for allele in same_a: assert numpy.array_equal(same_a[allele], same_b[allele]), ( "same --random-seed must reproduce identical weights for %s" % allele) assert any( not numpy.array_equal(same_a[a], different[a]) for a in same_a), ( "a different --random-seed must change the trained weights") finally: common.configure_pytorch(backend=old_backend) shutil.rmtree(workdir, ignore_errors=True) mhcflurry-2.3.6/test/test_train_command_design.py000066400000000000000000000036411525677230600223120ustar00rootroot00000000000000"""The generic processing sweep alias never inherits the kernel-width design.""" import sys import pytest from mhcflurry.cli import train_command SWEEP = "processing-hyperparameter-sweep" ARGS = ["--out", "sweep", "--train-data", "train.csv.bz2"] @pytest.fixture def launches(monkeypatch): """Record training-script launches instead of running them.""" calls = [] def fake_call(argv, env): calls.append((argv, env["MHCFLURRY_CLI_PROG"])) return 0 monkeypatch.setattr(train_command.subprocess, "call", fake_call) return calls def test_hyperparameter_sweep_without_design_errors_before_launch(launches, capsys): with pytest.raises(SystemExit) as error: train_command.run_argv([SWEEP, *ARGS]) assert error.value.code == 2 stderr = capsys.readouterr().err assert "mhcflurry train %s: error: --design is required" % SWEEP in stderr assert launches == [] @pytest.mark.parametrize("design", [ ["--design", "training-recipe"], ["--design=ranking-confirmation"], ]) def test_hyperparameter_sweep_with_explicit_design_dispatches(launches, design): assert train_command.run_argv([SWEEP, *ARGS, *design]) == 0 script = str(train_command._training_script_path(SWEEP)) assert launches == [ ([sys.executable, script, *ARGS, *design], "mhcflurry train " + SWEEP)] @pytest.mark.parametrize("help_flag", ["-h", "--help"]) def test_hyperparameter_sweep_help_does_not_require_design(launches, help_flag): assert train_command.run_argv([SWEEP, help_flag]) == 0 assert [argv[2:] for argv, _ in launches] == [[help_flag]] def test_kernel_sweep_alias_keeps_kernel_width_default(launches): assert train_command.run_argv(["processing-kernel-sweep", *ARGS]) == 0 script = str(train_command._training_script_path("processing-kernel-sweep")) assert launches == [ ([sys.executable, script, *ARGS], "mhcflurry train processing-kernel-sweep")] mhcflurry-2.3.6/test/test_train_pan_allele_models_command.py000066400000000000000000000445361525677230600245100ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Tests for training and predicting using Class1 pan-allele models. """ import json import os import shutil import tempfile import subprocess import sys from types import SimpleNamespace import numpy import pandas import pytest from mhcflurry import Class1AffinityPredictor from mhcflurry.cli import train_pan_allele_models_command as train_command from mhcflurry.allele_encoding import AlleleEncoding from mhcflurry.downloads import get_path from mhcflurry.pseudosequences import LEGACY_ALLELE_SEQUENCES_FILENAME from mhcflurry.train_pan_allele_models_command import ( _pop_train_param, pretrain_data_iterator, pretrain_network_input_iterator, ) from .pytest_helpers import mhcflurry_cli from mhcflurry.testing_utils import cleanup, startup pytest.fixture(autouse=True, scope="module") def setup_module(): startup() yield cleanup() os.environ["CUDA_VISIBLE_DEVICES"] = "" os.environ["MHCFLURRY_CLUSTER_WORKER_COMMAND"] = ( f"{sys.executable} -m mhcflurry.cluster_worker_entry_point" ) HYPERPARAMETERS_LIST = [ { 'activation': 'tanh', 'allele_dense_layer_sizes': [], 'batch_normalization': False, 'dense_layer_l1_regularization': 0.0, 'dense_layer_l2_regularization': 0.0, 'dropout_probability': 0.0, 'early_stopping': False, 'init': 'glorot_uniform', 'layer_sizes': [4], 'learning_rate': None, 'locally_connected_layers': [], 'loss': 'custom:mse_with_inequalities', 'max_epochs': 1, 'minibatch_size': 100000, 'optimizer': 'rmsprop', 'output_activation': 'sigmoid', 'patience': 1, 'peptide_allele_merge_activation': '', 'peptide_allele_merge_method': 'concatenate', 'peptide_amino_acid_encoding': 'BLOSUM62', 'peptide_dense_layer_sizes': [], 'peptide_encoding': { 'alignment_method': 'left_pad_centered_right_pad', 'max_length': 15, 'vector_encoding_name': 'BLOSUM62', }, 'random_negative_affinity_max': 50000.0, 'random_negative_affinity_min': 20000.0, 'random_negative_constant': 0, 'random_negative_distribution_smoothing': 0.0, 'random_negative_match_distribution': True, 'random_negative_rate': 0.0, 'train_data': { "pretrain": True, 'pretrain_peptides_per_step': 4, 'pretrain_steps_per_epoch': 1, 'pretrain_max_epochs': 1, }, 'validation_split': 0.0, }, ] PRETRAIN_DATA = """ ,HLA-A*01:01,HLA-A*02:01 SIINFEKL,100.0,200.0 LLFGYPVYV,150.0,250.0 KLGGALQAK,300.0,350.0 """.strip() def test_train_parser_accepts_save_all_checkpoints(): args = train_command.parser.parse_args([ "--out-models-dir", "models", "--continue-incomplete", "--save-all-checkpoints", ]) assert args.save_all_checkpoints is True def test_resource_probe_releases_model_between_architectures(monkeypatch): """Sequential probe tasks must not inherit the prior model's VRAM.""" created = [] cleanup_calls = [] class FakeNetwork: hyperparameter_defaults = SimpleNamespace( subselect=lambda values: dict(values)) def __init__(self, **_kwargs): self._network = object() self.alleles_cleared = False created.append(self) def fit(self, **_kwargs): return None def clear_allele_representations(self): self.alleles_cleared = True monkeypatch.setattr(train_command, "Class1NeuralNetwork", FakeNetwork) monkeypatch.setattr( train_command, "_build_train_peptides", lambda _values: object()) monkeypatch.setattr( train_command, "AlleleEncoding", lambda *_args, **_kwargs: object()) monkeypatch.setattr( train_command, "begin_peak_memory_measurement", lambda: object()) monkeypatch.setattr( train_command, "end_peak_memory_measurement", lambda _token: {}) monkeypatch.setattr( train_command, "release_unused_torch_memory", lambda: cleanup_calls.append("cleanup"), ) constant_data = { "train_data": pandas.DataFrame({ "peptide": ["SIINFEKL"], "allele": ["HLA-A*02:01"], "measurement_value": [100.0], "measurement_inequality": ["="], }), "folds_df": pandas.DataFrame({"fold_0": [True]}), "allele_encoding": object(), } hyperparameters = { "minibatch_size": 1, "validation_split": 0.1, "train_data": {}, } for _ in range(2): train_command._run_resource_probe( hyperparameters, fold_num=0, constant_data=constant_data) assert cleanup_calls == ["cleanup", "cleanup"] assert all(model.alleles_cleared for model in created) assert all(model._network is None for model in created) @pytest.mark.parametrize("reuse", [False, True]) def test_train_data_metadata_drops_preexisting_fold_columns(tmp_path, monkeypatch, reuse): """Regression: when ``--data`` already has ``fold_*`` columns (public 2.2.0 train_data ships with fold_0..3), the train command's metadata-DataFrame join used to produce ``fold_0_x``/``fold_0_y`` after merging in the freshly-computed ``folds_df``. That left the select command parsing ``int("x")`` and crashing. The fix drops the stale fold columns before the merge, so the saved metadata has clean ``fold_`` columns regardless of input shape.""" data = pandas.DataFrame({ "allele": ["HLA-A*02:01"] * 2, "peptide": ["SIINFEKL", "GILGFVFTL"], "measurement_value": [100.0, 200.0], "measurement_inequality": ["=", "="], "fold_0": [True, False], "fold_1": [False, True]}) data.to_csv(tmp_path / "data.csv", index=False) pandas.Series({"HLA-A*02:01": "A" * 34}, name="sequence").to_csv( tmp_path / "alleles.csv") (tmp_path / "hp.yaml").write_text("- max_epochs: 1\n") folds = data[["fold_0", "fold_1"]] def assign(**kwargs): assert not reuse, "Reused folds must not be reassigned" assert not set(folds).intersection(kwargs["df"]) return ~folds monkeypatch.setattr(train_command, "assign_folds", assign) argv = [ "--data", str(tmp_path / "data.csv"), "--allele-sequences", str(tmp_path / "alleles.csv"), "--hyperparameters", str(tmp_path / "hp.yaml"), "--out-models-dir", str(tmp_path / "models"), "--num-folds", "2"] if reuse: argv.append("--reuse-folds") train_command.initialize_training(train_command.parser.parse_args(argv)) saved = pandas.read_csv(tmp_path / "models/train_data.csv.bz2") pandas.testing.assert_frame_equal(saved[list(folds)], folds if reuse else ~folds) assert not any(name.endswith(("_x", "_y")) for name in saved) def test_pop_train_param_supports_pretrain_peptides_per_epoch_alias(): train_params = {"pretrain_peptides_per_epoch": 64} actual = _pop_train_param( train_params, names=("pretrain_peptides_per_step", "pretrain_peptides_per_epoch"), default=1024, verbose=0, ) assert actual == 64 assert train_params == {} def test_pretrain_data_iterator_keeps_short_final_chunk(tmp_path): df = pandas.DataFrame( { "HLA-A*01:01": [100.0, 200.0, 300.0], "HLA-A*02:01": [150.0, 250.0, 350.0], }, index=["SIINFEKL", "LLFGYPVYV", "KLGGALQAK"], ) filename = tmp_path / "pretrain.csv" df.to_csv(filename) master_allele_encoding = AlleleEncoding( ["HLA-A*01:01", "HLA-A*02:01"], allele_to_sequence={ "HLA-A*01:01": "A" * 34, "HLA-A*02:01": "C" * 34, }, ) iterator = pretrain_data_iterator( str(filename), master_allele_encoding, peptides_per_chunk=2, ) first = next(iterator) second = next(iterator) assert len(first[1]) == 4 assert len(first[2]) == 4 assert len(second[1]) == 2 assert len(second[2]) == 2 def test_pretrain_network_input_iterator_compact_torch_indices(tmp_path): df = pandas.DataFrame( { "HLA-A*01:01": [100.0, 200.0, 300.0], "HLA-A*02:01": [150.0, 250.0, 350.0], }, index=["SIINFEKL", "LLFGYPVYV", "KLGGALQAK"], ) filename = tmp_path / "pretrain.csv" df.to_csv(filename) master_allele_encoding = AlleleEncoding( ["HLA-A*01:01", "HLA-A*02:01"], allele_to_sequence={ "HLA-A*01:01": "A" * 34, "HLA-A*02:01": "C" * 34, }, ) iterator = pretrain_network_input_iterator( str(filename), master_allele_encoding, peptide_encoding={ "alignment_method": "left_pad_centered_right_pad", "max_length": 15, "vector_encoding_name": "BLOSUM62", }, peptides_per_chunk=2, compact_peptide_repeats=True, peptide_amino_acid_encoding_torch=True, ) x_dict, y = next(iterator) assert x_dict["peptide"].shape == (2, 45) assert x_dict["peptide"].dtype == "int8" assert x_dict["allele"].shape == (4,) assert x_dict["peptide_repeat_count"] == 2 assert y.shape == (4,) def run_and_check(n_jobs=0, delete=True, additional_args=None): if additional_args is None: additional_args = [] models_dir = tempfile.mkdtemp(prefix="mhcflurry-test-models") hyperparameters_filename = os.path.join( models_dir, "hyperparameters.yaml") with open(hyperparameters_filename, "w") as fd: json.dump(HYPERPARAMETERS_LIST, fd) pretrain_data_filename = os.path.join( models_dir, "pretrain_data.csv") with open(pretrain_data_filename, "w") as fd: fd.write(PRETRAIN_DATA) fd.write("\n") data_df = pandas.read_csv( get_path("data_curated", "curated_training_data.affinity.csv.bz2")) selected_data_df = data_df.sample(n=50, random_state=0) selected_data_df.to_csv( os.path.join(models_dir, "_train_data.csv"), index=False) args = mhcflurry_cli("mhcflurry-class1-train-pan-allele-models") + [ "--data", os.path.join(models_dir, "_train_data.csv"), "--allele-sequences", get_path( "allele_sequences", LEGACY_ALLELE_SEQUENCES_FILENAME), "--pretrain-data", pretrain_data_filename, "--hyperparameters", hyperparameters_filename, "--out-models-dir", models_dir, "--num-jobs", str(n_jobs), "--num-folds", "2", "--verbosity", "1", ] + additional_args print("Running with args: %s" % args) subprocess.check_call(args) # Run model selection models_dir_selected = tempfile.mkdtemp( prefix="mhcflurry-test-models-selected") args = mhcflurry_cli("mhcflurry-class1-select-pan-allele-models") + [ "--data", os.path.join(models_dir, "train_data.csv.bz2"), "--models-dir", models_dir, "--out-models-dir", models_dir_selected, "--max-models", "1", "--num-jobs", str(n_jobs), ] + additional_args print("Running with args: %s" % args) subprocess.check_call(args) result = Class1AffinityPredictor.load( models_dir_selected, optimization_level=0) assert len(result.neural_networks) == 2 predictions = result.predict(peptides=["SLYNTVATL"], alleles=["HLA-A*02:01"]) assert predictions.shape == (1,) assert numpy.isfinite(predictions).all() if delete: print("Deleting: %s" % models_dir) shutil.rmtree(models_dir) shutil.rmtree(models_dir_selected) @pytest.mark.slow @pytest.mark.integration def test_run_parallel(): run_and_check(n_jobs=2) @pytest.mark.slow @pytest.mark.integration def test_run_serial(): run_and_check(n_jobs=0) @pytest.mark.slow @pytest.mark.integration def test_run_cluster_parallelism(): run_and_check(n_jobs=0, additional_args=[ '--cluster-parallelism', '--cluster-results-workdir', '/tmp/' ]) @pytest.mark.slow @pytest.mark.integration def test_training_retains_noncanonical_allele_names(): """End-to-end: a training row whose allele is spelled non-canonically (e.g. ``HLA-A0201``) is canonicalized to its pseudosequence key (``HLA-A*02:01``) and retained, rather than being silently dropped by the old exact-string ``isin`` filter.""" from mhcflurry.common import AlleleKeyResolver allele_sequences_path = get_path( "allele_sequences", LEGACY_ALLELE_SEQUENCES_FILENAME) keys = set(pandas.read_csv(allele_sequences_path, index_col=0).index) resolver = AlleleKeyResolver(keys) data_df = pandas.read_csv( get_path("data_curated", "curated_training_data.affinity.csv.bz2")) sample = data_df.sample(n=50, random_state=0).copy() # Find a canonical allele in the sample whose de-punctuated spelling # round-trips back to it, so the rewrite is a genuine non-canonical alias # of a key (robust to which alleles the random sample happened to draw). target = noncanon = None for allele in sample.allele.unique(): candidate = str(allele).replace("*", "").replace(":", "") if candidate == allele: continue if resolver.resolve(candidate) == allele: target, noncanon = allele, candidate break if target is None: pytest.skip("no round-trippable allele in the sampled training rows") n_target_rows = int((sample.allele == target).sum()) sample.loc[sample.allele == target, "allele"] = noncanon models_dir = tempfile.mkdtemp(prefix="mhcflurry-test-canon") try: hyperparameters_filename = os.path.join( models_dir, "hyperparameters.yaml") with open(hyperparameters_filename, "w") as fd: json.dump(HYPERPARAMETERS_LIST, fd) pretrain_data_filename = os.path.join(models_dir, "pretrain_data.csv") with open(pretrain_data_filename, "w") as fd: fd.write(PRETRAIN_DATA) fd.write("\n") sample.to_csv(os.path.join(models_dir, "_train_data.csv"), index=False) args = mhcflurry_cli("mhcflurry-class1-train-pan-allele-models") + [ "--data", os.path.join(models_dir, "_train_data.csv"), "--allele-sequences", allele_sequences_path, "--pretrain-data", pretrain_data_filename, "--hyperparameters", hyperparameters_filename, "--out-models-dir", models_dir, "--num-jobs", "0", "--num-folds", "2", "--verbosity", "1", ] subprocess.check_call(args) written = pandas.read_csv( os.path.join(models_dir, "train_data.csv.bz2")) # The non-canonical spelling must not survive; its rows are retained # under the canonical key instead of being dropped. assert noncanon not in set(written.allele), ( "non-canonical spelling %r leaked into training data" % noncanon) assert int((written.allele == target).sum()) >= n_target_rows, ( "rows spelled %r were dropped instead of canonicalized to %r" % (noncanon, target)) finally: shutil.rmtree(models_dir, ignore_errors=True) def _network_weights_by_identity(predictor): """Map each trained network's (architecture, fold, replicate) identity to a flat vector of all its weights.""" out = {} for nn in predictor.neural_networks: info = nn.fit_info[-1]["training_info"] key = ( info["architecture_num"], info["fold_num"], info["replicate_num"]) state = nn.network().state_dict() out[key] = numpy.concatenate( [v.detach().cpu().numpy().ravel() for v in state.values()]) return out @pytest.mark.slow @pytest.mark.integration def test_training_is_reproducible_from_seed(): """End-to-end: --seed pins every stochastic step (fold assignment, weight init, shuffles, random negatives), so two full training runs with the same seed produce bit-identical models, and a different seed diverges.""" workdir = tempfile.mkdtemp(prefix="mhcflurry-test-seed") hyperparameters_filename = os.path.join(workdir, "hyperparameters.yaml") with open(hyperparameters_filename, "w") as fd: json.dump(HYPERPARAMETERS_LIST, fd) pretrain_data_filename = os.path.join(workdir, "pretrain_data.csv") with open(pretrain_data_filename, "w") as fd: fd.write(PRETRAIN_DATA + "\n") data_csv = os.path.join(workdir, "_train_data.csv") pandas.read_csv( get_path("data_curated", "curated_training_data.affinity.csv.bz2") ).sample(n=50, random_state=0).to_csv(data_csv, index=False) def train(run_name, seed): out_dir = os.path.join(workdir, run_name) os.makedirs(out_dir) subprocess.check_call( mhcflurry_cli("mhcflurry-class1-train-pan-allele-models") + [ "--data", data_csv, "--allele-sequences", get_path( "allele_sequences", LEGACY_ALLELE_SEQUENCES_FILENAME), "--pretrain-data", pretrain_data_filename, "--hyperparameters", hyperparameters_filename, "--out-models-dir", out_dir, "--num-jobs", "0", "--num-folds", "2", "--random-seed", str(seed), "--verbosity", "1", ]) return _network_weights_by_identity( Class1AffinityPredictor.load(out_dir, optimization_level=0)) same_a = train("run_a", seed=42) same_b = train("run_b", seed=42) different = train("run_c", seed=43) assert same_a and set(same_a) == set(same_b) == set(different) for key in same_a: assert numpy.array_equal(same_a[key], same_b[key]), ( "same --seed must reproduce identical weights for %r" % (key,)) assert any( not numpy.array_equal(same_a[key], different[key]) for key in same_a), ( "a different --seed must change the trained weights") shutil.rmtree(workdir) if __name__ == "__main__": # run_and_check(n_jobs=0, delete=False) test_run_cluster_parallelism() mhcflurry-2.3.6/test/test_train_processing_models_command.py000066400000000000000000000252121525677230600245560ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Test processing train and model selection commands. """ import json import os import shutil import tempfile import subprocess import re import pytest import torch from types import SimpleNamespace from sklearn.metrics import roc_auc_score import pandas from mhcflurry.class1_processing_predictor import Class1ProcessingPredictor from mhcflurry.common import random_peptides from mhcflurry import pytorch_sizing from mhcflurry.cli import train_processing_models_command as processing_command from mhcflurry.train_processing_models_command import estimate_processing_worker_gb from mhcflurry.testing_utils import cleanup, startup from .pytest_helpers import mhcflurry_cli pytest.fixture(autouse=True, scope="module") def setup_module(): startup() yield cleanup() os.environ["CUDA_VISIBLE_DEVICES"] = "" HYPERPARAMETERS = [ { "max_epochs": 1, "minibatch_size": 100000, "n_flank_length": 5, "c_flank_length": 5, "convolutional_kernel_size": 3, }, { "max_epochs": 1, "minibatch_size": 100000, "n_flank_length": 5, "c_flank_length": 5, "convolutional_kernel_size": 3, } ] def make_dataset(num=500): df = pandas.DataFrame({ "n_flank": random_peptides(num / 2, 10) + random_peptides(num / 2, 1), "c_flank": random_peptides(num, 10), "peptide": random_peptides(num / 2, 11) + random_peptides(num / 2, 8), }).sample(frac=1.0) df["sample_id"] = pandas.Series( ["sample_%d" % (i + 1) for i in range(5)]).sample( n=len(df), replace=True).values n_regex = "[AILQSVWEN].[MNPQYKV]" def is_hit(n_flank, c_flank, peptide): if re.search(n_regex, peptide): return False # peptide is cleaved return bool(re.match(n_regex, n_flank[-1:] + peptide)) df["hit"] = [ is_hit(row.n_flank, row.c_flank, row.peptide) for (_, row) in df.iterrows() ] train_df = df.sample(frac=0.9) test_df = df.loc[~df.index.isin(train_df.index)].copy() print( "Generated dataset", len(df), "hits: ", df.hit.sum(), "frac:", df.hit.mean()) return (train_df, test_df) def run_and_check(n_jobs=0, additional_args=None, delete=False): if additional_args is None: additional_args = [] (train_df, test_df) = make_dataset() models_dir = tempfile.mkdtemp(prefix="mhcflurry-test-models") hyperparameters_filename = os.path.join( models_dir, "hyperparameters.yaml") with open(hyperparameters_filename, "w") as fd: json.dump(HYPERPARAMETERS, fd) train_filename = os.path.join(models_dir, "training.csv") train_df.to_csv(train_filename, index=False) args = mhcflurry_cli("mhcflurry-class1-train-processing-models") + [ "--processing-data-policy", "legacy", # synthetic non-MHC fixture "--data", train_filename, "--hyperparameters", hyperparameters_filename, "--out-models-dir", models_dir, "--held-out-samples", "2", "--num-folds", "2", "--num-jobs", str(n_jobs), ] print("Running with args: %s" % args) subprocess.check_call(args) full_predictor = Class1ProcessingPredictor.load(models_dir) print("Loaded models", len(full_predictor.models)) assert len(full_predictor.models) == 4 test_df["full_predictor"] = full_predictor.predict( test_df.peptide.values, test_df.n_flank.values, test_df.c_flank.values) test_auc = roc_auc_score(test_df.hit.values, test_df.full_predictor.values) print("Full predictor auc", test_auc) print("Performing model selection.") # Run model selection models_dir_selected = tempfile.mkdtemp( prefix="mhcflurry-test-models-selected") args = mhcflurry_cli("mhcflurry-class1-select-processing-models") + [ "--processing-data-policy", "legacy", "--data", os.path.join(models_dir, "train_data.csv.bz2"), "--models-dir", models_dir, "--out-models-dir", models_dir_selected, "--max-models", "1", "--num-jobs", str(n_jobs), ] + additional_args print("Running with args: %s" % args) subprocess.check_call(args) selected_predictor = Class1ProcessingPredictor.load(models_dir_selected) assert len(selected_predictor.models) == 2 test_df["selected_predictor"] = selected_predictor.predict( test_df.peptide.values, test_df.n_flank.values, test_df.c_flank.values) test_auc = roc_auc_score(test_df.hit.values, test_df.selected_predictor.values) print("Selected predictor auc", test_auc) if delete: print("Deleting: %s" % models_dir) shutil.rmtree(models_dir) shutil.rmtree(models_dir_selected) def test_processing_worker_estimate_uses_data_and_architecture(tmp_path): df = pandas.DataFrame({ "n_flank": ["A" * 15, "C" * 15, "D" * 15], "c_flank": ["E" * 15, "F" * 15, "G" * 15], "peptide": ["SIINFEKL", "GILGFVFTL", "NLVPMVATV"], "sample_id": ["s1", "s2", "s3"], "hit": [1, 0, 1], }) data = tmp_path / "training.csv" df.to_csv(data, index=False) hyperparameters = tmp_path / "hyperparameters.yaml" hyperparameters.write_text(json.dumps([ { "minibatch_size": 512, "n_flank_length": 0, "c_flank_length": 0, "convolutional_filters": 16, }, { "minibatch_size": 512, "n_flank_length": 5, "c_flank_length": 5, "convolutional_filters": 512, }, ])) estimate = estimate_processing_worker_gb(SimpleNamespace( data=str(data), hyperparameters=str(hyperparameters), )) assert estimate is not None assert estimate >= 4.0 def test_processing_worker_estimate_leaves_validation_to_live_budget( tmp_path, monkeypatch): """Launch packing does not hardwire an independent validation batch.""" data = tmp_path / "training.csv" pandas.DataFrame({ "peptide": ["SIINFEKL", "GILGFVFTL", "NLVPMVATV"], }).to_csv(data, index=False) hyperparameters = tmp_path / "hyperparameters.yaml" monkeypatch.setattr( processing_command, "estimate_peak_bytes_per_row", lambda network: 1 << 20, ) base = { "minibatch_size": 512, "validation_split": 0.1, "n_flank_length": 5, "c_flank_length": 5, "convolutional_filters": 16, } hyperparameters.write_text(json.dumps([base])) automatic = estimate_processing_worker_gb(SimpleNamespace( data=str(data), hyperparameters=str(hyperparameters), )) hyperparameters.write_text(json.dumps([{ **base, "validation_batch_size": 1024, }])) explicitly_capped = estimate_processing_worker_gb(SimpleNamespace( data=str(data), hyperparameters=str(hyperparameters), )) # Both plans contain the exact training state and 2 GiB training batch. # Auto validation sizes itself later from live free VRAM, so an explicit # validation batch no longer changes launch-time worker concurrency. assert automatic == explicitly_capped assert 5.2 <= automatic < 5.21 def test_release_unused_torch_memory_collects_before_empty_cache(monkeypatch): """Boundary cleanup exposes dead tensors before purging CUDA's cache.""" events = [] monkeypatch.setattr( pytorch_sizing.gc, "collect", lambda: events.append("gc.collect"), ) monkeypatch.setattr( torch.cuda, "is_available", lambda: True, ) monkeypatch.setattr( torch.cuda, "empty_cache", lambda: events.append("torch.cuda.empty_cache"), ) processing_command.release_unused_torch_memory() assert events == ["gc.collect", "torch.cuda.empty_cache"] def test_release_unused_torch_memory_uses_mps_without_cuda(monkeypatch): """The same task-boundary cleanup supports Apple accelerators.""" events = [] monkeypatch.setattr( pytorch_sizing.gc, "collect", lambda: events.append("gc.collect"), ) monkeypatch.setattr(torch.cuda, "is_available", lambda: False) monkeypatch.setattr(torch.backends.mps, "is_available", lambda: True) monkeypatch.setattr( torch.mps, "empty_cache", lambda: events.append("torch.mps.empty_cache"), ) processing_command.release_unused_torch_memory() assert events == ["gc.collect", "torch.mps.empty_cache"] def test_resource_probe_releases_model_between_architectures(monkeypatch): """Processing probes share the same explicit task-boundary cleanup.""" created = [] cleanup_calls = [] class FakeNetwork: hyperparameter_defaults = SimpleNamespace( subselect=lambda values: dict(values)) def __init__(self, **_kwargs): self._network = object() created.append(self) def fit(self, **_kwargs): return None monkeypatch.setattr( processing_command, "Class1ProcessingNeuralNetwork", FakeNetwork) monkeypatch.setattr( processing_command, "begin_peak_memory_measurement", lambda: object(), ) monkeypatch.setattr( processing_command, "end_peak_memory_measurement", lambda _token: {}, ) monkeypatch.setattr( processing_command, "release_unused_torch_memory", lambda: cleanup_calls.append("cleanup"), ) constant_data = { "train_data": pandas.DataFrame({ "peptide": ["SIINFEKL"], "n_flank": ["A"], "c_flank": ["C"], "hit": [1], }), "folds_df": pandas.DataFrame({"fold_0": [True]}), } hyperparameters = { "minibatch_size": 1, "validation_split": 0.1, } for _ in range(2): processing_command._run_resource_probe( hyperparameters, fold_num=0, constant_data=constant_data) assert cleanup_calls == ["cleanup", "cleanup"] assert all(model._network is None for model in created) def Xtest_run_parallel(): run_and_check(n_jobs=2) @pytest.mark.slow @pytest.mark.integration def test_run_serial(): run_and_check(n_jobs=0) mhcflurry-2.3.6/test/test_training_benchmark.py000066400000000000000000000113541525677230600217730ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import json import pandas from mhcflurry.training_benchmark import analyze_training_run def test_analyze_training_run_summarizes_phases_and_logs(tmp_path): models_dir = tmp_path / "models" models_dir.mkdir() fit_info = [ { "training_info": {"phase": "pretrain"}, "time": 30.0, "loss": [0.4, 0.3], "epoch_fetch_time": [1.0, 1.5], "epoch_h2d_time": [0.5, 0.4], "epoch_train_time": [6.0, 5.0], "epoch_loss_sync_time": [0.05, 0.03], "epoch_validation_time": [2.0, 2.5], "epoch_total_time": [10.0, 10.5], "epoch_num_train_batches": [2, 2], "epoch_num_train_rows": [64, 64], "epoch_num_validation_batches": [2, 2], "validation_rows": 32, "effective_validation_batch_size": 16, "dataloader_num_workers": 2, "first_batch_time": 4.0, }, { "training_info": {"phase": "finetune"}, "time": 12.0, "loss": [0.2], "epoch_input_build_time": [1.0], "epoch_dataloader_setup_time": [0.25], "epoch_train_time": [3.0], "epoch_validation_materialize_time": [0.75], "epoch_validation_time": [1.25], "epoch_total_time": [6.5], "epoch_num_train_batches": [3], "epoch_num_train_rows": [96], "epoch_tail_train_rows": [4], "epoch_num_validation_batches": [4], "validation_rows": 48, "validation_cache_reused": True, "effective_validation_batch_size": 16, "dataloader_num_workers": 0, "first_batch_time": 1.5, }, ] manifest_df = pandas.DataFrame( [ { "model_name": "pan-class1-0", "allele": "pan-class1", "config_json": json.dumps({"fit_info": fit_info}), } ] ) manifest_df.to_csv(models_dir / "manifest.csv", index=False) train_log = tmp_path / "train.log" train_log.write_text( "\n".join( [ "TIMING_MARKER start 100.0", "TIMING_MARKER data_loaded 115.0", "TIMING_MARKER setup_done 130.0", "TIMING_MARKER training_done 190.0", "PROCESS_TELEMETRY pid=11 marker=START rss_mb=100.0 num_fds=20", "PROCESS_TELEMETRY pid=11 marker=END rss_mb=140.0 num_fds=26", "GPU_MEMORY_TELEMETRY pid=11 task=1/2 marker=START allocated_gb=1.0 reserved_gb=2.0 max_allocated_gb=3.0", ] ) + "\n" ) selection_log = tmp_path / "select.log" selection_log.write_text( "\n".join( [ "TIMING_MARKER selection_start 200.0", "TIMING_MARKER selection_done 214.5", ] ) + "\n" ) result = analyze_training_run( models_dir, train_log=train_log, selection_log=selection_log, ) assert result["top_level_wall_times_s"]["data_load_s"] == 15.0 assert result["top_level_wall_times_s"]["setup_s"] == 15.0 assert result["top_level_wall_times_s"]["training_s"] == 60.0 assert result["top_level_wall_times_s"]["selection_s"] == 14.5 pretrain = result["phase_summaries"]["pretrain"] assert pretrain["num_fits"] == 1 assert pretrain["train_time_s"] == 11.0 assert pretrain["fetch_time_s"] == 2.5 assert pretrain["h2d_time_s"] == 0.9 assert pretrain["loss_sync_time_s"] == 0.08 assert pretrain["validation_total_time_s"] == 4.5 assert pretrain["total_train_batches"] == 4 assert pretrain["validation_rows_seen"] == 64 finetune = result["phase_summaries"]["finetune"] assert finetune["input_build_time_s"] == 1.0 assert finetune["dataloader_setup_time_s"] == 0.25 assert finetune["validation_total_time_s"] == 2.0 assert finetune["validation_cache_reused_fit_count"] == 1 assert finetune["total_tail_train_rows"] == 4 telemetry = result["telemetry"]["train"] assert telemetry["max_rss_mb"] == 140.0 assert telemetry["max_gpu_reserved_gb"] == 2.0 assert telemetry["rss_growth_by_pid"] == [{"pid": 11, "rss_mb_delta": 40.0}] mhcflurry-2.3.6/test/test_training_data_identity.py000066400000000000000000000021231525677230600226550ustar00rootroot00000000000000import importlib.util from pathlib import Path import pandas def test_identity_preserves_duplicates_and_reports_order_separately(): path = Path(__file__).resolve().parents[1] / "scripts/training/audit_training_data_identity.py" spec = importlib.util.spec_from_file_location("training_identity", path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) old = pandas.DataFrame({"peptide": ["A", "A", "B"], "hit": [1, 1, 0]}) same = old.iloc[::-1] summary, differences = module.compare_rows(old, same, ["peptide", "hit"]) assert summary["same_row_multiset"] assert not summary["same_ordered_rows"] assert differences.empty new = pandas.DataFrame({"peptide": ["A", "B", "B"], "hit": [1, 0, 1]}) summary, differences = module.compare_rows(old, new, ["peptide", "hit"]) assert not summary["same_row_multiset"] assert summary["shared_rows_with_multiplicity"] == 2 assert summary["reference_only_rows_with_multiplicity"] == 1 assert summary["candidate_only_rows_with_multiplicity"] == 1 assert len(differences) == 2 mhcflurry-2.3.6/test/test_training_folds.py000066400000000000000000000101641525677230600211460ustar00rootroot00000000000000import pandas import pytest from mhcflurry.training_folds import extract_training_folds def test_reuse_preserves_original_fold_identity_and_index(): data = pandas.DataFrame({"peptide": ["A", "B"], "fold_0": [False, True], "fold_1": [True, False]}, index=[4, 9]) clean, folds = extract_training_folds(data, 2, reuse=True) assert list(clean) == ["peptide"] pandas.testing.assert_frame_equal(folds, data[["fold_0", "fold_1"]]) clean, folds = extract_training_folds(data, 2, reuse=False) assert list(clean) == ["peptide"] assert folds is None @pytest.mark.parametrize("values", [[True, None], [True, "typo"], [True, True], [False, False]]) def test_reuse_rejects_invalid_or_empty_partitions(values): with pytest.raises(ValueError): extract_training_folds(pandas.DataFrame({"fold_0": values}), 1, reuse=True) def test_reuse_requires_all_and_only_requested_folds(): with pytest.raises(ValueError, match="exactly"): extract_training_folds(pandas.DataFrame({"fold_0": [True, False]}), 2, reuse=True) def test_malformed_old_fold_columns_are_removed_or_rejected(): data = pandas.DataFrame({"peptide": ["A", "B"], "fold_0_x": [True, False]}) cleaned, folds = extract_training_folds(data, 1) assert list(cleaned) == ["peptide"] assert folds is None with pytest.raises(ValueError, match="exactly"): extract_training_folds(data, 1, reuse=True) @pytest.mark.parametrize("policy", ["legacy", "matched"]) def test_processing_initialization_reuses_folds_without_suffixes(tmp_path, monkeypatch, policy): from mhcflurry.cli import train_processing_models_command as command data = pandas.DataFrame({ "peptide": ["SIINFEKL", "GILGFVFTL"], "n_flank": ["AAAAA"] * 2, "c_flank": ["CCCCC"] * 2, "hit": [1, 0], "sample_id": ["a", "b"], "fold_0": [True, False], "fold_1": [False, True]}) if policy == "matched": from mhcflurry.processing_matching import matched_training_data data = pandas.DataFrame({ "peptide": ["SIINFEKL", "SIINFEKA", "GILGFVFTL", "GILGFVFTA"], "n_flank": ["AAAAA"] * 4, "c_flank": ["CCCCC"] * 4, "hit": [1, 0, 1, 0], "sample_id": ["a", "a", "b", "b"], "protein_accession": "p1", "affinity_prediction": [100, 110, 200, 210], "fold_0": [True, True, False, False], "fold_1": [False, False, True, True]}) data, _ = matched_training_data(data, {"sha256": "a" * 64}) data_path = tmp_path / "data.csv" data.to_csv(data_path, index=False) hp = tmp_path / "hp.yaml" hp.write_text("- max_epochs: 1\n convolutional_filters: 4\n") out = tmp_path / "models" args = command.parser.parse_args([ "--processing-data-policy", policy, "--data", str(data_path), "--hyperparameters", str(hp), "--out-models-dir", str(out), "--num-folds", "2", "--reuse-folds"]) def unexpected_assignment(**kwargs): raise AssertionError("Existing folds must not be reassigned") monkeypatch.setattr(command, "assign_folds", unexpected_assignment) command.initialize_training(args) saved = pandas.read_csv(out / "train_data.csv.bz2") pandas.testing.assert_frame_equal(saved[["fold_0", "fold_1"]], data[["fold_0", "fold_1"]]) assert not any(name.endswith(("_x", "_y")) for name in saved) def test_fold_assignment_rejects_more_held_out_samples_than_it_has(): """The smoke run died inside numpy.random.choice; say what is wrong instead.""" from mhcflurry.cli.train_processing_models_command import assign_folds frame = pandas.DataFrame({ "sample_id": ["s%d" % (row // 4) for row in range(32)], "hit": [row % 2 for row in range(32)]}) assert frame.sample_id.nunique() == 8 with pytest.raises(ValueError, match="needs at least 12 training samples"): assign_folds(frame, num_folds=4, held_out_samples=10, seed=42) assigned = assign_folds(frame, num_folds=4, held_out_samples=4, seed=42) assert list(assigned.columns) == ["fold_%d" % fold for fold in range(4)] for fold in range(4): trained = frame.sample_id[assigned["fold_%d" % fold]].nunique() assert trained == 4 mhcflurry-2.3.6/test/test_training_variants.py000066400000000000000000000326021525677230600216670ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Training variant tests for PyTorch migration. Tests training with different hyperparameter combinations that are valid but not exercised by the existing test suite, plus a functional test that trains a single network on synthetic A*02:01-motif data and verifies that a known epitope is predicted as a strong binder. """ import random import numpy as np import pytest import torch from mhcflurry.class1_neural_network import Class1NeuralNetwork from mhcflurry.common import random_peptides from mhcflurry.testing_utils import startup, cleanup pytestmark = pytest.mark.slow @pytest.fixture(autouse=True) def setup_teardown(): startup() yield cleanup() def _seed(s=42): np.random.seed(s) random.seed(s) torch.manual_seed(s) def _make_model(**overrides): defaults = dict( activation="tanh", layer_sizes=[16], locally_connected_layers=[], peptide_dense_layer_sizes=[], allele_dense_layer_sizes=[], dropout_probability=0.0, batch_normalization=False, dense_layer_l1_regularization=0.0, dense_layer_l2_regularization=0.0, max_epochs=30, early_stopping=False, validation_split=0.0, minibatch_size=32, random_negative_rate=0.0, random_negative_constant=0, ) defaults.update(overrides) return Class1NeuralNetwork(**defaults) # --------------------------------------------------------------------------- # Training with locally connected layers # --------------------------------------------------------------------------- def test_train_with_locally_connected(): _seed(1) peptides = random_peptides(80, length=9) affinities = np.random.uniform(10, 50000, 80) model = _make_model( locally_connected_layers=[ {"filters": 4, "activation": "tanh", "kernel_size": 3}, ], layer_sizes=[8], max_epochs=10, ) model.fit(peptides, affinities, verbose=0) preds = model.predict(peptides) assert len(preds) == 80 assert preds.min() > 0 # --------------------------------------------------------------------------- # Training with dropout # --------------------------------------------------------------------------- def test_train_with_dropout(): _seed(2) peptides = random_peptides(80, length=9) affinities = np.random.uniform(10, 50000, 80) model = _make_model( dropout_probability=0.5, # keep probability layer_sizes=[16, 8], max_epochs=10, ) model.fit(peptides, affinities, verbose=0) preds = model.predict(peptides) assert len(preds) == 80 # --------------------------------------------------------------------------- # Training with batch normalization # --------------------------------------------------------------------------- def test_train_with_batch_normalization(): _seed(3) peptides = random_peptides(80, length=9) affinities = np.random.uniform(10, 50000, 80) model = _make_model( batch_normalization=True, activation="relu", layer_sizes=[16], max_epochs=10, ) model.fit(peptides, affinities, verbose=0) preds = model.predict(peptides) assert len(preds) == 80 # --------------------------------------------------------------------------- # Training with combined options: LC + dropout + batch norm # --------------------------------------------------------------------------- def test_train_lc_dropout_batchnorm(): _seed(4) peptides = random_peptides(80, length=9) affinities = np.random.uniform(10, 50000, 80) model = _make_model( locally_connected_layers=[ {"filters": 4, "activation": "tanh", "kernel_size": 3}, ], dropout_probability=0.8, batch_normalization=True, layer_sizes=[16, 8], max_epochs=10, ) model.fit(peptides, affinities, verbose=0) preds = model.predict(peptides) assert len(preds) == 80 # --------------------------------------------------------------------------- # Training with skip-connections (DenseNet) topology # --------------------------------------------------------------------------- def test_train_with_skip_connections(): _seed(5) peptides = random_peptides(80, length=9) affinities = np.random.uniform(10, 50000, 80) model = _make_model( topology="with-skip-connections", layer_sizes=[8, 8, 4], max_epochs=10, ) model.fit(peptides, affinities, verbose=0) preds = model.predict(peptides) assert len(preds) == 80 # --------------------------------------------------------------------------- # Training with peptide dense layers # --------------------------------------------------------------------------- def test_train_with_peptide_dense_layers(): _seed(6) peptides = random_peptides(80, length=9) affinities = np.random.uniform(10, 50000, 80) model = _make_model( peptide_dense_layer_sizes=[16], layer_sizes=[8], max_epochs=10, ) model.fit(peptides, affinities, verbose=0) preds = model.predict(peptides) assert len(preds) == 80 # --------------------------------------------------------------------------- # Training with different optimizers # --------------------------------------------------------------------------- @pytest.mark.parametrize("optimizer", ["adam", "sgd", "rmsprop"]) def test_train_with_optimizer(optimizer): _seed(7) peptides = random_peptides(60, length=9) affinities = np.random.uniform(10, 50000, 60) model = _make_model( optimizer=optimizer, learning_rate=0.01, layer_sizes=[8], max_epochs=5, ) model.fit(peptides, affinities, verbose=0) preds = model.predict(peptides) assert len(preds) == 60 # --------------------------------------------------------------------------- # Training with L2 regularization # --------------------------------------------------------------------------- def test_train_with_l2_regularization(): _seed(8) peptides = random_peptides(80, length=9) affinities = np.random.uniform(10, 50000, 80) model = _make_model( dense_layer_l2_regularization=0.01, layer_sizes=[8], max_epochs=10, ) model.fit(peptides, affinities, verbose=0) preds = model.predict(peptides) assert len(preds) == 80 # --------------------------------------------------------------------------- # Training with L1 + L2 regularization combined # --------------------------------------------------------------------------- def test_train_with_l1_l2_regularization(): _seed(9) peptides = random_peptides(80, length=9) affinities = np.random.uniform(10, 50000, 80) model = _make_model( dense_layer_l1_regularization=0.01, dense_layer_l2_regularization=0.01, layer_sizes=[8], max_epochs=10, ) model.fit(peptides, affinities, verbose=0) preds = model.predict(peptides) assert len(preds) == 80 # --------------------------------------------------------------------------- # Training with random negatives # --------------------------------------------------------------------------- def test_train_with_random_negatives(): _seed(10) peptides = random_peptides(80, length=9) affinities = np.random.uniform(10, 50000, 80) model = _make_model( random_negative_rate=1.0, random_negative_constant=10, layer_sizes=[8], max_epochs=5, ) model.fit(peptides, affinities, verbose=0) preds = model.predict(peptides) assert len(preds) == 80 # --------------------------------------------------------------------------- # Training with validation split + early stopping # --------------------------------------------------------------------------- def test_train_with_early_stopping(): _seed(11) peptides = random_peptides(100, length=9) affinities = np.random.uniform(10, 50000, 100) model = _make_model( validation_split=0.2, early_stopping=True, patience=3, max_epochs=200, layer_sizes=[8], ) model.fit(peptides, affinities, verbose=0) preds = model.predict(peptides) assert len(preds) == 100 # Should have stopped early (well before 200) n_epochs = len(model.fit_info[-1]["loss"]) assert n_epochs < 200 # --------------------------------------------------------------------------- # Serialization round-trip preserves predictions after combined-option training # --------------------------------------------------------------------------- def test_serialization_with_lc_dropout_batchnorm(): _seed(12) peptides = random_peptides(60, length=9) affinities = np.random.uniform(10, 50000, 60) model = _make_model( locally_connected_layers=[ {"filters": 4, "activation": "tanh", "kernel_size": 3}, ], dropout_probability=0.8, batch_normalization=True, layer_sizes=[8], max_epochs=5, ) model.fit(peptides, affinities, verbose=0) preds_before = model.predict(peptides) config = model.get_config() weights = model.get_weights() restored = Class1NeuralNetwork.from_config(config, weights=weights) preds_after = restored.predict(peptides) np.testing.assert_allclose(preds_before, preds_after, rtol=1e-5) # --------------------------------------------------------------------------- # Training with mixed-length peptides # --------------------------------------------------------------------------- def test_train_mixed_lengths_with_lc(): _seed(13) peptides = ( random_peptides(30, length=8) + random_peptides(30, length=9) + random_peptides(20, length=10) + random_peptides(10, length=11) ) affinities = np.random.uniform(10, 50000, 90) model = _make_model( locally_connected_layers=[ {"filters": 4, "activation": "tanh", "kernel_size": 3}, ], layer_sizes=[8], max_epochs=5, ) model.fit(peptides, affinities, verbose=0) preds = model.predict(peptides) assert len(preds) == 90 # --------------------------------------------------------------------------- # Functional test: learn A*02:01 motif from synthetic data # --------------------------------------------------------------------------- _A0201_P2 = list("LM") # anchor at position 2 _A0201_P9 = list("LVI") # anchor at C-terminal position _OTHER_AA = list("ACDEFGHIKNPQRSTVWY") # non-anchor residues def _random_aa(choices, rng): return choices[rng.randint(0, len(choices) - 1)] def _generate_a0201_binder(rng, length=9): """Generate a peptide with canonical A*02:01 P2+P9 motifs.""" pep = [_random_aa(_OTHER_AA, rng) for _ in range(length)] pep[1] = _random_aa(_A0201_P2, rng) # P2 anchor pep[length - 1] = _random_aa(_A0201_P9, rng) # Pend anchor return "".join(pep) def _generate_non_binder(rng, length=9): """Generate a peptide that avoids A*02:01 anchors at P2 and Pend.""" non_p2 = [aa for aa in _OTHER_AA if aa not in _A0201_P2] non_p9 = [aa for aa in _OTHER_AA if aa not in _A0201_P9] pep = [_random_aa(_OTHER_AA, rng) for _ in range(length)] pep[1] = _random_aa(non_p2, rng) pep[length - 1] = _random_aa(non_p9, rng) return "".join(pep) def test_learn_a0201_motif(): """ Train a single Class1NeuralNetwork on 200 synthetic peptides (100 binders with A*02:01-like P2/Pend motifs at 1 nM, 100 non-binders at 50000 nM) and verify that SLLQHLIGL (a canonical A*02:01 epitope with P2=L, P9=L) is predicted as a strong binder (<= 500 nM). """ rng = np.random.RandomState(314) binders = [_generate_a0201_binder(rng) for _ in range(100)] non_binders = [_generate_non_binder(rng) for _ in range(100)] peptides = binders + non_binders affinities = np.concatenate([ np.full(100, 1.0), # strong binders np.full(100, 50000.0), # non-binders ]) _seed(271) model = _make_model( locally_connected_layers=[ {"filters": 8, "activation": "tanh", "kernel_size": 3}, ], layer_sizes=[32], max_epochs=200, early_stopping=False, validation_split=0.0, learning_rate=0.001, optimizer="adam", minibatch_size=32, dense_layer_l1_regularization=0.0, ) model.fit(peptides, affinities, verbose=0) # SLLQHLIGL — HLA-A*02:01 Tax epitope # P2 = L (canonical A*02:01 anchor), P9 = L (canonical A*02:01 anchor) test_pred = model.predict(["SLLQHLIGL"])[0] print(f"SLLQHLIGL predicted affinity: {test_pred:.1f} nM") assert test_pred <= 500, ( f"SLLQHLIGL should be predicted as strong binder, got {test_pred:.1f} nM" ) # A peptide with wrong anchors should be predicted as weak binder weak_pred = model.predict(["SAAQHQIGA"])[0] print(f"SAAQHQIGA predicted affinity: {weak_pred:.1f} nM") assert weak_pred > 1000, ( f"Non-motif peptide should be predicted weak, got {weak_pred:.1f} nM" ) mhcflurry-2.3.6/test/test_workload_planning.py000066400000000000000000001050001525677230600216460ustar00rootroot00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Unit tests for the workload-planning auto-tuner. ``mhcflurry.workload_planning`` decides num_jobs / max_workers_per_gpu / dataloader_num_workers from hardware facts and CLI overrides. These tests inject fakes for the hardware/heuristic callbacks so the orchestrator's own arithmetic is exercised without touching real GPUs. """ import argparse import os import numpy import pytest from mhcflurry import pytorch_sizing, workload_planning as wp def test_default_prediction_batch_elasticity_follows_effective_default( monkeypatch): monkeypatch.setattr( pytorch_sizing, "DEFAULT_PREDICT_BATCH_SIZE", "auto") assert pytorch_sizing.default_prediction_batch_is_auto() monkeypatch.setattr( pytorch_sizing, "DEFAULT_PREDICT_BATCH_SIZE", 8192) assert not pytorch_sizing.default_prediction_batch_is_auto() def test_model_artifact_size_uses_uncompressed_npz_members(tmp_path): weights = tmp_path / "weights.npz" numpy.savez_compressed(weights, values=numpy.zeros(10000, dtype="float32")) assert wp.model_artifact_size_bytes(tmp_path) > os.path.getsize(weights) def test_elastic_inference_keeps_resident_workload_floor(): estimate = wp.estimate_workload_memory( wp.WORKLOAD_PRESENTATION_INFERENCE, {"model_bytes": 10 * wp.GIB, "elastic_batch": True}, ) assert estimate["device_worker_gb"] == 16.0 assert "profile default" in estimate["notes"] assert "elastic batches retain resident workload floor" in estimate["notes"] def test_elastic_inference_raises_floor_for_larger_model_artifacts(): estimate = wp.estimate_workload_memory( wp.WORKLOAD_PRESENTATION_INFERENCE, {"model_bytes": 20 * wp.GIB, "elastic_batch": True}, ) assert estimate["device_worker_gb"] == pytest.approx(25.5) assert "uncompressed model artifact floor" in estimate["notes"] def test_elastic_inference_preserves_explicit_worker_memory(monkeypatch): env_name = "MHCFLURRY_WORKLOAD_AFFINITY_INFERENCE_PER_WORKER_GB" monkeypatch.setenv(env_name, "12.0") estimate = wp.estimate_workload_memory( wp.WORKLOAD_AFFINITY_INFERENCE, {"model_bytes": wp.GIB, "elastic_batch": True}, ) assert estimate["device_worker_gb"] == 12.0 assert "env override" in estimate["notes"] monkeypatch.delenv(env_name) estimate = wp.estimate_workload_memory( wp.WORKLOAD_AFFINITY_INFERENCE, { "model_bytes": wp.GIB, "elastic_batch": True, "per_worker_gb": 11.0, }, ) assert estimate["device_worker_gb"] == 11.0 assert "command estimate" in estimate["notes"] @pytest.mark.parametrize( ("name", "value"), [ ("per_worker_gb", float("nan")), ("model_bytes", float("inf")), ("data_bytes", -1), ], ) def test_workload_estimator_rejects_invalid_programmatic_hints(name, value): with pytest.raises(ValueError, match="finite non-negative"): wp.estimate_workload_memory( wp.WORKLOAD_AFFINITY_INFERENCE, {name: value}) def test_elastic_inference_applies_artifact_floor_to_small_override( monkeypatch): env_name = "MHCFLURRY_WORKLOAD_AFFINITY_INFERENCE_PER_WORKER_GB" monkeypatch.setenv(env_name, "1.0") estimate = wp.estimate_workload_memory( wp.WORKLOAD_AFFINITY_INFERENCE, {"model_bytes": wp.GIB, "elastic_batch": True}, ) assert estimate["device_worker_gb"] == pytest.approx(2.7) assert "uncompressed model artifact floor" in estimate["notes"] # --------------------------------------------------------------------------- # env_float / env_int # --------------------------------------------------------------------------- def test_env_float_default_when_unset(monkeypatch): monkeypatch.delenv("MHCFLURRY_TEST_X", raising=False) assert wp.env_float("MHCFLURRY_TEST_X", 0.5) == 0.5 def test_env_float_default_when_empty_string(monkeypatch): monkeypatch.setenv("MHCFLURRY_TEST_X", "") assert wp.env_float("MHCFLURRY_TEST_X", 0.5) == 0.5 def test_env_float_reads_string_value(monkeypatch): monkeypatch.setenv("MHCFLURRY_TEST_X", "2.5") assert wp.env_float("MHCFLURRY_TEST_X", 0.0) == 2.5 def test_env_float_bad_value_names_variable(monkeypatch): monkeypatch.setenv("MHCFLURRY_TEST_X", "nope") with pytest.raises(ValueError) as exc_info: wp.env_float("MHCFLURRY_TEST_X", 0.0) assert "MHCFLURRY_TEST_X" in str(exc_info.value) assert "nope" in str(exc_info.value) @pytest.mark.parametrize("value", ["nan", "inf", "-inf"]) def test_env_float_rejects_nonfinite_values(monkeypatch, value): monkeypatch.setenv("MHCFLURRY_TEST_X", value) with pytest.raises(ValueError, match="MHCFLURRY_TEST_X.*finite"): wp.env_float("MHCFLURRY_TEST_X", 0.0) def test_env_float_bounds_lower(monkeypatch): monkeypatch.setenv("MHCFLURRY_TEST_X", "-1.0") with pytest.raises(ValueError): wp.env_float("MHCFLURRY_TEST_X", 0.5, bounds=(0.0, 1.0)) def test_env_float_bounds_upper(monkeypatch): monkeypatch.setenv("MHCFLURRY_TEST_X", "5.0") with pytest.raises(ValueError): wp.env_float("MHCFLURRY_TEST_X", 0.5, bounds=(0.0, 1.0)) def test_env_float_bounds_endpoints_inclusive(monkeypatch): monkeypatch.setenv("MHCFLURRY_TEST_X", "1.0") assert wp.env_float("MHCFLURRY_TEST_X", 0.0, bounds=(0.0, 1.0)) == 1.0 monkeypatch.setenv("MHCFLURRY_TEST_X", "0.0") assert wp.env_float("MHCFLURRY_TEST_X", 0.0, bounds=(0.0, 1.0)) == 0.0 def test_env_int_default_when_unset(monkeypatch): monkeypatch.delenv("MHCFLURRY_TEST_X", raising=False) assert wp.env_int("MHCFLURRY_TEST_X", 7) == 7 def test_env_int_reads_string_value(monkeypatch): monkeypatch.setenv("MHCFLURRY_TEST_X", "12") assert wp.env_int("MHCFLURRY_TEST_X", 0) == 12 def test_env_int_rejects_floats(monkeypatch): monkeypatch.setenv("MHCFLURRY_TEST_X", "3.5") with pytest.raises(ValueError) as exc_info: wp.env_int("MHCFLURRY_TEST_X", 0) assert "MHCFLURRY_TEST_X" in str(exc_info.value) def test_env_int_bounds(monkeypatch): monkeypatch.setenv("MHCFLURRY_TEST_X", "0") with pytest.raises(ValueError): wp.env_int("MHCFLURRY_TEST_X", 1, bounds=(1, None)) # --------------------------------------------------------------------------- # get_workload_profile # --------------------------------------------------------------------------- def test_get_workload_profile_known_name(): profile = wp.get_workload_profile(wp.WORKLOAD_AFFINITY_INFERENCE) assert profile.name == wp.WORKLOAD_AFFINITY_INFERENCE assert profile.device_worker_gb == 4.0 def test_get_workload_profile_unknown_falls_back_to_generic(): profile = wp.get_workload_profile("does-not-exist") assert profile.name == wp.WORKLOAD_GENERIC def test_get_workload_profile_all_workload_constants_have_profiles(): """Every WORKLOAD_* constant must map to a real profile, not generic fallback.""" constants = [ getattr(wp, name) for name in dir(wp) if name.startswith("WORKLOAD_") and isinstance(getattr(wp, name), str) ] for workload in constants: profile = wp.get_workload_profile(workload) assert profile.name == workload, (workload, profile.name) # --------------------------------------------------------------------------- # path_size_bytes # --------------------------------------------------------------------------- def test_path_size_bytes_none_for_empty(tmp_path): assert wp.path_size_bytes(None) is None assert wp.path_size_bytes("") is None def test_path_size_bytes_returns_size(tmp_path): p = tmp_path / "x.bin" p.write_bytes(b"hello world") assert wp.path_size_bytes(str(p)) == 11 def test_path_size_bytes_returns_none_for_missing(tmp_path): assert wp.path_size_bytes(str(tmp_path / "absent.bin")) is None # --------------------------------------------------------------------------- # Memory probes # --------------------------------------------------------------------------- def test_memory_env_override_neither_set(monkeypatch): monkeypatch.delenv("MHCFLURRY_SYSTEM_RAM_GB", raising=False) monkeypatch.delenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", raising=False) assert wp._memory_env_override() is None def test_memory_env_override_both_set(monkeypatch): monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "128.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "100.0") info = wp._memory_env_override() assert info == { "total_gb": 128.0, "available_gb": 100.0, "source": "env", } def test_memory_env_override_only_total(monkeypatch): monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "64.0") monkeypatch.delenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", raising=False) info = wp._memory_env_override() assert info["total_gb"] == 64.0 assert info["available_gb"] is None assert info["source"] == "env" def test_memory_env_override_bad_value_names_var(monkeypatch): monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "xx") with pytest.raises(ValueError) as exc_info: wp._memory_env_override() assert "MHCFLURRY_SYSTEM_RAM_GB" in str(exc_info.value) def test_system_memory_info_gb_env_takes_precedence(monkeypatch): monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "200.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "150.0") info = wp.system_memory_info_gb() assert info["source"] == "env" assert info["total_gb"] == 200.0 def test_system_memory_info_gb_falls_through_to_platform(monkeypatch): """When env override is absent, return whatever the OS probe yields.""" monkeypatch.delenv("MHCFLURRY_SYSTEM_RAM_GB", raising=False) monkeypatch.delenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", raising=False) info = wp.system_memory_info_gb() # Will be /proc/meminfo on linux, vm_stat on mac, or the empty dict on # platforms with neither — all three are valid shapes here. assert info["source"] in ( "/proc/meminfo", "cgroup", "vm_stat", "unknown") def test_linux_cgroup_memory_info_uses_limit_and_current(monkeypatch): values = iter([16 * wp.GIB, 10 * wp.GIB]) monkeypatch.setattr( wp, "_read_cgroup_memory_value", lambda paths: next(values)) info = wp._linux_cgroup_memory_info_gb() assert info == { "total_gb": 16.0, "available_gb": 6.0, "source": "cgroup", } def test_linux_cgroup_memory_info_ignores_unlimited_v1_sentinel(monkeypatch): monkeypatch.setattr( wp, "_read_cgroup_memory_value", lambda paths: 2 ** 62, ) assert wp._linux_cgroup_memory_info_gb() is None def test_macos_memory_info_preserves_zero_available_pages(monkeypatch): def fake_check_output(command, **kwargs): del kwargs if command[0] == "sysctl": return str(int(16 * wp.GIB)).encode() return ( b"Mach Virtual Memory Statistics: (page size of 4096 bytes)\n" b"Pages free: 0.\n" b"Pages inactive: 0.\n" b"Pages speculative: 0.\n" ) monkeypatch.setattr(wp.subprocess, "check_output", fake_check_output) info = wp._macos_memory_info_gb() assert info["total_gb"] == 16.0 assert info["available_gb"] == 0.0 # --------------------------------------------------------------------------- # normalize_workload_hints # --------------------------------------------------------------------------- def test_normalize_hints_empty(): assert wp.normalize_workload_hints() == {} def test_normalize_hints_dict_only(): assert wp.normalize_workload_hints( {"foo": 1, "bar": 2}, ) == {"foo": 1, "bar": 2} def test_normalize_hints_kwargs_drop_none(): result = wp.normalize_workload_hints( {"foo": 1}, per_worker_gb=4.0, missing=None, ) assert result == {"foo": 1, "per_worker_gb": 4.0} def test_normalize_hints_kwargs_override_dict(): result = wp.normalize_workload_hints({"foo": 1}, foo=99) assert result == {"foo": 99} # --------------------------------------------------------------------------- # estimate_workload_memory # --------------------------------------------------------------------------- def test_estimate_workload_memory_uses_profile_default(monkeypatch): monkeypatch.delenv( "MHCFLURRY_WORKLOAD_AFFINITY_INFERENCE_PER_WORKER_GB", raising=False) result = wp.estimate_workload_memory(wp.WORKLOAD_AFFINITY_INFERENCE) assert result["device_worker_gb"] == 4.0 assert "profile default" in result["notes"] def test_estimate_workload_memory_env_override_wins(monkeypatch): monkeypatch.setenv( "MHCFLURRY_WORKLOAD_AFFINITY_INFERENCE_PER_WORKER_GB", "12.0") result = wp.estimate_workload_memory( wp.WORKLOAD_AFFINITY_INFERENCE, hints={"per_worker_gb": 8.0}, ) assert result["device_worker_gb"] == 12.0 assert "env override" in result["notes"] def test_estimate_workload_memory_command_hint_used_when_no_env(monkeypatch): monkeypatch.delenv( "MHCFLURRY_WORKLOAD_AFFINITY_INFERENCE_PER_WORKER_GB", raising=False) result = wp.estimate_workload_memory( wp.WORKLOAD_AFFINITY_INFERENCE, hints={"per_worker_gb": 7.5}, ) assert result["device_worker_gb"] == 7.5 assert "command estimate" in result["notes"] def test_estimate_workload_memory_data_pressure_below_start_is_zero(monkeypatch): """data_bytes under start_gb should not add pressure.""" monkeypatch.delenv( "MHCFLURRY_WORKLOAD_AFFINITY_INFERENCE_PER_WORKER_GB", raising=False) result = wp.estimate_workload_memory( wp.WORKLOAD_AFFINITY_INFERENCE, hints={"data_bytes": int(1.0 * wp.GIB)}, # under 2 GB start ) assert result["data_pressure_gb"] == 0.0 def test_estimate_workload_memory_data_pressure_scales_then_caps(monkeypatch): monkeypatch.delenv( "MHCFLURRY_WORKLOAD_AFFINITY_INFERENCE_PER_WORKER_GB", raising=False) profile = wp.get_workload_profile(wp.WORKLOAD_AFFINITY_INFERENCE) # Below cap: 50 GB data → (50 - 2) * 0.02 = 0.96 GB pressure. moderate = wp.estimate_workload_memory( wp.WORKLOAD_AFFINITY_INFERENCE, hints={"data_bytes": int(50.0 * wp.GIB)}, ) assert moderate["data_pressure_gb"] == pytest.approx(0.96, abs=1e-6) # Above cap: 10 TB data → would be huge, clamps to data_pressure_cap_gb. huge = wp.estimate_workload_memory( wp.WORKLOAD_AFFINITY_INFERENCE, hints={"data_bytes": int(10000.0 * wp.GIB)}, ) assert huge["data_pressure_gb"] == profile.data_pressure_cap_gb def test_estimate_workload_memory_no_data_pressure_when_device_gb_unknown( monkeypatch): """Profiles with device_worker_gb=None don't accumulate data pressure.""" monkeypatch.delenv( "MHCFLURRY_WORKLOAD_GENERIC_PER_WORKER_GB", raising=False) result = wp.estimate_workload_memory( wp.WORKLOAD_GENERIC, hints={"data_bytes": int(50.0 * wp.GIB)}, ) assert result["device_worker_gb"] is None assert result["data_pressure_gb"] == 0.0 def test_estimate_workload_memory_host_pressure_caps(monkeypatch): """host_data_cap_gb bounds the host-memory adder.""" monkeypatch.delenv( "MHCFLURRY_WORKLOAD_PROCESSING_TRAINING_PER_WORKER_GB", raising=False) profile = wp.get_workload_profile(wp.WORKLOAD_PROCESSING_TRAINING) result = wp.estimate_workload_memory( wp.WORKLOAD_PROCESSING_TRAINING, hints={"data_bytes": int(10000.0 * wp.GIB)}, ) # Without cap this would be 10000 * 0.15 = 1500 GB. assert result["host_worker_gb"] == ( profile.host_worker_gb + profile.host_data_cap_gb ) # --------------------------------------------------------------------------- # host_memory_num_jobs_cap # --------------------------------------------------------------------------- def test_host_memory_num_jobs_cap_returns_none_when_memory_unknown(): cap = wp.host_memory_num_jobs_cap( memory={"total_gb": None, "available_gb": None}, host_worker_gb=4.0, ) assert cap is None def test_host_memory_num_jobs_cap_uses_available_over_total(): cap = wp.host_memory_num_jobs_cap( memory={"available_gb": 50.0, "total_gb": 128.0, "source": "env"}, host_worker_gb=4.0, safety_fraction=1.0, ) assert cap == 12 # 50 / 4 = 12.5 → 12 def test_host_memory_num_jobs_cap_does_not_replace_zero_available_with_total(): cap = wp.host_memory_num_jobs_cap( memory={"available_gb": 0.0, "total_gb": 128.0, "source": "env"}, host_worker_gb=4.0, safety_fraction=1.0, ) assert cap == 1 def test_host_memory_num_jobs_cap_falls_back_to_total(): cap = wp.host_memory_num_jobs_cap( memory={"available_gb": None, "total_gb": 50.0, "source": "env"}, host_worker_gb=4.0, safety_fraction=1.0, ) assert cap == 12 def test_host_memory_num_jobs_cap_applies_safety_fraction(): cap = wp.host_memory_num_jobs_cap( memory={"available_gb": 100.0, "source": "env"}, host_worker_gb=4.0, safety_fraction=0.5, ) assert cap == 12 # 100 * 0.5 / 4 = 12.5 → 12 def test_host_memory_num_jobs_cap_includes_dataloader_overhead(): """Each dataloader child adds HOST_RAM_PER_DATALOADER_CHILD_GB to the cost.""" cap = wp.host_memory_num_jobs_cap( memory={"available_gb": 100.0, "source": "env"}, host_worker_gb=4.0, dataloader_num_workers=4, safety_fraction=1.0, ) # 4 + 4*0.5 = 6 GB/worker → 100/6 = 16 assert cap == 16 def test_host_memory_num_jobs_cap_min_floor_is_one(): """Even RAM-starved boxes get at least 1 worker.""" cap = wp.host_memory_num_jobs_cap( memory={"available_gb": 1.0, "source": "env"}, host_worker_gb=100.0, safety_fraction=0.01, ) assert cap == 1 def test_host_memory_num_jobs_cap_reads_safety_env(monkeypatch): monkeypatch.setenv("MHCFLURRY_AUTO_HOST_MEMORY_SAFETY_FRACTION", "0.50") cap = wp.host_memory_num_jobs_cap( memory={"available_gb": 100.0, "source": "env"}, host_worker_gb=4.0, ) assert cap == 12 # 100 * 0.5 / 4 = 12 def test_host_memory_num_jobs_cap_rejects_bad_safety_env(monkeypatch): monkeypatch.setenv("MHCFLURRY_AUTO_HOST_MEMORY_SAFETY_FRACTION", "2.0") with pytest.raises(ValueError): wp.host_memory_num_jobs_cap( memory={"available_gb": 100.0, "source": "env"}, host_worker_gb=4.0, ) # --------------------------------------------------------------------------- # is_auto_value # --------------------------------------------------------------------------- def test_is_auto_none(): assert wp.is_auto_value(None) def test_is_auto_string(): assert wp.is_auto_value("auto") assert wp.is_auto_value("AUTO") assert wp.is_auto_value("Auto") def test_is_auto_int_is_not_auto(): assert not wp.is_auto_value(0) assert not wp.is_auto_value(8) def test_is_auto_other_string_not_auto(): assert not wp.is_auto_value("manual") assert not wp.is_auto_value("") # --------------------------------------------------------------------------- # plan_local_parallelism # --------------------------------------------------------------------------- def _identity_normalize_backend(b): return b or "auto" def _planner_fakes( *, num_gpus=1, mwpg_value=2, num_jobs_capacity=lambda gpus, mwpg: gpus * mwpg, dataloader_workers=0, rn_pool_epochs=1): """Build a kwargs dict of injected callables for plan_local_parallelism.""" def auto_max_workers_per_gpu(num_jobs, num_gpus, backend, per_worker_gb): return mwpg_value def auto_num_jobs(gpus, mwpg): return num_jobs_capacity(gpus, mwpg) def resolve_dataloader_num_workers(raw, num_fit_workers, ram_gb): return dataloader_workers def auto_random_negative_pool_epochs( num_random_negatives, peptide_max_length, num_workers, ram_gb, base_worker_gb=0.0): del base_worker_gb return rn_pool_epochs return { "normalize_backend": _identity_normalize_backend, "detect_num_cuda_devices": lambda: num_gpus, "auto_max_workers_per_gpu": auto_max_workers_per_gpu, "auto_num_jobs": auto_num_jobs, "resolve_dataloader_num_workers": resolve_dataloader_num_workers, "auto_random_negative_pool_epochs": auto_random_negative_pool_epochs, } def _args(**overrides): """Build an argparse.Namespace with auto defaults that match the CLI.""" defaults = dict( backend="auto", gpus=None, max_workers_per_gpu="auto", num_jobs="auto", dataloader_num_workers="auto", random_negative_pool_epochs="auto", torch_compile="auto", torch_compile_loss="auto", matmul_precision="none", enable_timing=False, ) defaults.update(overrides) return argparse.Namespace(**defaults) def test_plan_cpu_only_box(monkeypatch): """0 GPUs → num_jobs=0, capacity=0, no cli overrides.""" monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "32.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "16.0") plan = wp.plan_local_parallelism( _args(), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, **_planner_fakes(num_gpus=0, mwpg_value=1, num_jobs_capacity=lambda g, m: 0), ) assert plan.gpus == 0 assert plan.gpus_was_auto assert plan.num_jobs == 0 assert plan.capacity == 0 assert plan.cli_overrides == () def test_plan_single_gpu_resolved(monkeypatch): """1 GPU, MWPG=2 → capacity=2, num_jobs=2 under auto.""" monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "256.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "200.0") plan = wp.plan_local_parallelism( _args(), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, **_planner_fakes(num_gpus=1, mwpg_value=2), ) assert plan.gpus == 1 assert plan.max_workers_per_gpu == 2 assert plan.num_jobs == 2 assert plan.capacity == 2 assert plan.num_jobs_was_auto def test_plan_8x_a100_resolved(monkeypatch): """8×A100-style box with MWPG=2 → 16 workers.""" monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "1024.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "900.0") monkeypatch.setattr(wp.os, "cpu_count", lambda: 176) plan = wp.plan_local_parallelism( _args(), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, **_planner_fakes(num_gpus=8, mwpg_value=2), ) assert plan.num_jobs == 16 assert plan.capacity == 16 def test_auto_plan_never_starts_more_workers_than_work_items(monkeypatch): monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "1024.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "900.0") monkeypatch.setattr(wp.os, "cpu_count", lambda: 176) plan = wp.plan_local_parallelism( _args(), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, workload_hints={"prediction_rows": 3}, **_planner_fakes(num_gpus=8, mwpg_value=2), ) assert plan.num_jobs == 3 assert plan.max_workers_per_gpu == 1 assert plan.capacity == 3 assert any("available work items" in warning for warning in plan.warnings) def test_plan_host_memory_clamp_keeps_capacity_consistent(monkeypatch): """When host RAM clamps auto num_jobs to a count that doesn't divide evenly across GPUs, the reported capacity must equal the clamped num_jobs — not gpus * ceil(num_jobs / gpus), which would over-report. GPU capacity here is 2 * 4 = 8, but 22 GB available RAM minus the shared reserve fits 6 workers on 2 GPUs. Capacity must remain the clamped job count, not a separately rounded value.""" monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "32.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "22.0") monkeypatch.setattr(wp.os, "cpu_count", lambda: 256) plan = wp.plan_local_parallelism( _args(), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, **_planner_fakes(num_gpus=2, mwpg_value=4), ) assert plan.num_jobs == 6 assert plan.max_workers_per_gpu == 3 assert plan.capacity == plan.num_jobs == 6 assert plan.capacity <= plan.gpus * plan.max_workers_per_gpu assert any("capped" in w for w in plan.warnings) def test_plan_explicit_num_jobs_records_override(monkeypatch): monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "256.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "200.0") plan = wp.plan_local_parallelism( _args(num_jobs=4), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, **_planner_fakes(num_gpus=1, mwpg_value=2), ) assert plan.num_jobs == 4 assert not plan.num_jobs_was_auto assert "num_jobs" in plan.cli_overrides def test_plan_explicit_num_jobs_above_capacity_warns(monkeypatch): monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "256.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "200.0") plan = wp.plan_local_parallelism( _args(num_jobs=99), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, **_planner_fakes(num_gpus=1, mwpg_value=2), ) assert plan.num_jobs == 99 assert any("exceeds GPU capacity" in w for w in plan.warnings), plan.warnings def test_plan_auto_num_jobs_clipped_by_host_memory(monkeypatch): """8 GPUs × MWPG 2 = 16 capacity, but only 8 GB RAM forces fewer workers.""" monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "8.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "8.0") plan = wp.plan_local_parallelism( _args(), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, # host_worker_gb=3.0 **_planner_fakes(num_gpus=8, mwpg_value=2), ) # 8 GB minus the 2 GB host reserve leaves 6 GB → 2 workers. assert plan.num_jobs == 2 assert plan.host_memory_num_jobs_cap == 2 assert any("capped from" in w for w in plan.warnings), plan.warnings def test_plan_auto_num_jobs_reclipped_after_dataloader_sizing(monkeypatch): """Auto jobs must include per-DataLoader-child RAM in the final cap.""" monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "16.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "16.0") monkeypatch.setenv("MHCFLURRY_AUTO_HOST_MEMORY_SAFETY_FRACTION", "1.0") monkeypatch.setattr(wp.os, "cpu_count", lambda: 256) plan = wp.plan_local_parallelism( _args(), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, **_planner_fakes(num_gpus=8, mwpg_value=2, dataloader_workers=4), ) assert plan.dataloader_num_workers == 4 assert plan.host_worker_gb == 5.0 assert plan.host_memory_num_jobs_cap == 3 assert plan.num_jobs == 3 assert plan.num_jobs <= plan.host_memory_num_jobs_cap assert any("capped from 5 to 3" in w for w in plan.warnings), plan.warnings def test_plan_explicit_num_jobs_above_host_memory_warns_but_honors(monkeypatch): """User CLI override is respected; the planner just records a warning.""" monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "8.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "8.0") plan = wp.plan_local_parallelism( _args(num_jobs=8), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, **_planner_fakes(num_gpus=8, mwpg_value=2), ) assert plan.num_jobs == 8 # CLI override respected assert any("host-memory estimate" in w for w in plan.warnings), plan.warnings def test_plan_explicit_num_jobs_warning_uses_dataloader_inflated_cap(monkeypatch): """Explicit-num_jobs warning cap must include per-DataLoader-child RAM. Without the in-loop reclip the explicit path would compare against the raw host_worker_gb cap and silently undercount memory pressure from DataLoader children. The cap reported in the warning must match the one returned in the plan (both inflated by dataloader_num_workers). """ monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "16.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "16.0") monkeypatch.setenv("MHCFLURRY_AUTO_HOST_MEMORY_SAFETY_FRACTION", "1.0") plan = wp.plan_local_parallelism( _args(num_jobs=8), # explicit, above the inflated cap workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, # host_worker_gb=3.0 **_planner_fakes(num_gpus=8, mwpg_value=2, dataloader_workers=4), ) # 16 GB * 1.0 / (3.0 + 4*0.5) = 16/5 = 3.2 → cap=3. # Without the dataloader inflation it would be 16/3 = 5.33 → cap=5, # so the cap reported in the warning must be 3, not 5. assert plan.num_jobs == 8 # CLI override honored assert plan.host_memory_num_jobs_cap == 3 assert plan.host_worker_gb == 5.0 cap_warnings = [w for w in plan.warnings if "host-memory estimate" in w] assert len(cap_warnings) == 1, plan.warnings assert "exceeds host-memory estimate 3" in cap_warnings[0], cap_warnings[0] assert "exceeds host-memory estimate 5" not in cap_warnings[0], ( cap_warnings[0]) def test_plan_cap_auto_num_jobs_false_disables_clip(monkeypatch): monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "8.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "8.0") plan = wp.plan_local_parallelism( _args(), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, cap_auto_num_jobs=False, **_planner_fakes(num_gpus=8, mwpg_value=2), ) assert plan.num_jobs == 16 # unclipped capacity assert not any("capped from" in w for w in plan.warnings) def test_plan_clip_rebalances_mwpg_when_mwpg_was_auto(monkeypatch): """Clipping num_jobs while MWPG was auto should redistribute workers.""" monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "16.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "16.0") plan = wp.plan_local_parallelism( _args(), # MWPG="auto", num_jobs="auto" workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, # host_worker_gb=3 **_planner_fakes(num_gpus=8, mwpg_value=2), ) # 16 GB minus the 2 GB host reserve fits 4 workers across 8 GPUs. assert plan.num_jobs == 4 assert plan.max_workers_per_gpu == 1 assert plan.max_workers_per_gpu_was_auto def test_plan_clip_leaves_mwpg_when_explicit(monkeypatch): """An explicit MWPG should survive a clip — only auto MWPG gets rebalanced.""" monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "16.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "16.0") plan = wp.plan_local_parallelism( _args(max_workers_per_gpu=4), # explicit MWPG workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, **_planner_fakes(num_gpus=8, mwpg_value=4), ) assert plan.max_workers_per_gpu == 4 assert "max_workers_per_gpu" in plan.cli_overrides def test_plan_explicit_gpus_recorded(monkeypatch): monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "256.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "200.0") plan = wp.plan_local_parallelism( _args(gpus=2), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, **_planner_fakes(num_gpus=8, mwpg_value=2), # detector says 8 ) assert plan.gpus == 2 # CLI wins assert not plan.gpus_was_auto assert "gpus" in plan.cli_overrides def test_plan_torch_compile_override_recorded(monkeypatch): monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "32.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "16.0") plan = wp.plan_local_parallelism( _args(torch_compile="on", torch_compile_loss="on", matmul_precision="high"), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, **_planner_fakes(num_gpus=1, mwpg_value=1), ) assert plan.torch_compile == "on" assert plan.torch_compile_loss == "on" assert plan.matmul_precision == "high" assert "torch_compile" in plan.cli_overrides assert "torch_compile_loss" in plan.cli_overrides assert "matmul_precision" in plan.cli_overrides def test_plan_cpu_backend_zero_capacity(monkeypatch): """backend=cpu → capacity=0 regardless of detected GPUs.""" monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "256.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "200.0") plan = wp.plan_local_parallelism( _args(backend="cpu"), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, **_planner_fakes(num_gpus=4, mwpg_value=2), ) assert plan.backend == "cpu" assert plan.capacity == 0 assert "backend" in plan.cli_overrides def test_plan_records_memory_provenance(monkeypatch): monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "256.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "200.0") plan = wp.plan_local_parallelism( _args(), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, **_planner_fakes(num_gpus=1, mwpg_value=1), ) assert plan.host_memory_total_gb == 256.0 assert plan.host_memory_available_gb == 200.0 assert plan.host_memory_source == "env" def test_plan_dataloader_workers_added_to_host_worker_gb(monkeypatch): monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "256.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "200.0") plan = wp.plan_local_parallelism( _args(), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, # host_worker_gb=3.0 **_planner_fakes(num_gpus=1, mwpg_value=1, dataloader_workers=4), ) # 3 + 4 * 0.5 = 5 assert plan.host_worker_gb == 5.0 def test_plan_str_renders_summary(monkeypatch): """LocalParallelismPlan.__str__ surfaces all the orchestration knobs.""" monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "32.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "16.0") plan = wp.plan_local_parallelism( _args(), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, **_planner_fakes(num_gpus=1, mwpg_value=2), ) rendered = str(plan) assert "workload=affinity_inference" in rendered assert "gpus=1" in rendered assert "workers/gpu=2" in rendered def test_plan_hints_pass_through_to_estimator(monkeypatch): monkeypatch.setenv("MHCFLURRY_SYSTEM_RAM_GB", "256.0") monkeypatch.setenv("MHCFLURRY_SYSTEM_AVAILABLE_RAM_GB", "200.0") plan = wp.plan_local_parallelism( _args(), workload_name=wp.WORKLOAD_AFFINITY_INFERENCE, workload_hints={"data_bytes": int(50.0 * wp.GIB)}, **_planner_fakes(num_gpus=1, mwpg_value=1), ) # data_pressure_gb computed from the hint assert plan.data_pressure_gb > 0 assert ("data_bytes", int(50.0 * wp.GIB)) in plan.hints

QèÏ“�’>€àË2ŸÇÂûŠ)ùšrh“3Ùöß«”íí��qjìÙÚÈá©LzÐØ“ÃÚ÷ñZ’^m¹À�º@À’бµ)›à_æh–„UÏèÝ"^Àî#M" Bêuìê§�g¶Ÿì_›7ÐHiÄ%v™1¸¯t�¦�ËD£Û¶‚"¼¿±{Y»R-'¾%%v�Ûuüµ'Ë‚h�ºõ·à­jW8†z ¾x÷ Î�#bÏÍSö´�žÁpɽ.%,…Ú Cz‰Ùd·�°f_YÒ5¯….ÒIy[¢:ž F¿Zéù*øÒÝ€�^3,÷šö¬j|KvVŽrï�ˇ÷ó÷ö5¬Nöá¼Q¬`ÕÁö‘ÄbÎ œ•¢–‘ƒ6C’\�¹5IA«ë-§ ü]Ë#ù&{#ù¡‰9ÀåÚ¤]¢³õþŽ[§ÃÀ*�—³ÖÅÅT}�,U±;‘A%ú×ñ°»Ú±¼®H�¦ÚõáôXóÇyL6k_JFhN² @ZÕæázîn¥!¨6yµ`Í£s {]Á/ØG„Û4®-t¿_;jÖ›¯•ß{Q»(-÷o„2ñ÷n>pòd,õ@hÌìÄa�&Ø?ÍNW {:– iöAÃ+z„ P^ƒaÜÙ ck ps�¾­8@æÁÕŒ…ü‚ÇŽæ�¬B-¯w-l¿Ç<³«ÚÙîYÁR—š2Ûg’r¸Ü®hrN"Ø Ÿé¿;çžõµµâ5¹‹ûƒPÍ„Ï�WtŸmÖ"~͆nB›¢ÐãvÞs3øYp£ÆQl£ÆÈÝkk³T_z¸[ñ'lvøB6åhB Üí'q ÜžëoôH-‡ {Š ¿­ñËoT>;¯ yˆÞí…ò¹Ó±„3Ý•¡}¼‘�ÒÐX"ð>/Vã;J¬IÒèl)ê[¿Æõ”ÒÇ:«E"2“·õÐ^�Ü;C’¾>ÃÆFÔ£D Ì­¸ª  ‘-†a‚ÉJ%§-¼¨' ˆª¸FJ Tu»DIYëà·5Âf%â.ð» ­©ksË2@`e`V¸ÀìÃÆë\;\ËT×%L:1¤©˜Ê#î *4öÁ¥¬‰j=ZÙ[F«“à‚ lÍ•¥ÛÛƒ¤"Tľ;)Cxeqîc–P›†X ±Î;¥G¿_½ ÌÂjÍÐG\P=;býó~G˰zÖ³¡Y8ˇQÀ�zd5Ïj¶ÞEûŒ$œöˆ’êõ8Ó-ì¢ÃNTBí3¢Xµ¯k=]WAÛ¡«ª;žu#‰^ ƒ¨á ƒW¦Vž}\ LCÖ;šýÛÞu@{zƒC Mó3u™ü°ºŽÂÆgËfß<ÀyÔi’ô ›·¿g¢:· “Õz·o!½èOõ@ÒË™�m‰ó3X+&ü[ >ùMóUçæRÚæ�õ£ÌR€Á�×Üë µ— » á{7N埚+ÁÆA!†&\fšAYÿdIKv*8˲Zk.’ÐÄg£Âú­ŒgyÔܰï&8Ë %óŠ5†t15$ˆÏÑH.')%7Ã…†ûÄ àD ’-¼»ÏŸ±ež�ZyÞÓÄ“Di(n†äDë`l\°Åó_º9{9¶�p ÈÊx9E_�‡%’©PB2„`:qä?˜Š­¬ÂZ×låGÿ(�_o†Æ‡NûÕ3Ž*³ª?ËpÝí½aƒ½µµ!ƒâ–rÄÚ…T³4ò7„S¸Ðó÷íaÈ?…½#&ýn?³4l*¯c <û›^5˜æÚÐû˲4FŽ¢Ü jžÁ�ˆÎò¨‹$FHN38óe· 2à˜—KœŒ‘7 —hGB–Û*ž½Í^úÉnÏ"š->5ѪHwIbžB™re쬈>à(*æ³f´G¢üþ½o_@vxC³ó#�Rœ±Ž*ñÌÒ8@¥�iɲwEös GjËyT™~·&ßPdMï(±Cv¸�ýñ¦ÜU®›Þ¬žãržo-;êæF}Ýþ ý¡&…Øps·O9Óu�HTý€gqêkðîv0‚¹;…dÆÀrôÙ…OXÃЭbãôj{Ç¢ç ÎÇ}—Ò­¡‚•‡¼¬µëŸ¾G+¯ètYÍñ�ànEÅßbÉô`ïì‡#ž\ë\atTÌ9›ž/h¶ î¿·BÅÅWÄkä¿]ÁùE.d-´Ø_·Gµã ;À(5Ár•[s€ÅÎ�x9Ó^A*¸Šq\C~Q²œýÊèÆ°ÁÒ“±öØ´ºST‚”PÆ. iCqY#ûžQr¯Ü¨»Z÷cEÃÊœ=þÜ*è­`ÆÚ"ƒ9kä^”¯r…ŠŽ®ÆÙïpuf'Je*Å«5dÔaöoØ_¼pcÜÀp>ßÏoÝûx}””ä³°}ñaP²0æŒ�<°ŠçörŠ1XÑY›­pYù0YVQPÛs8í J®ñ`=(Ï‚XTòž÷ÒR_/òëI‡ÿ+�‰ ÔÕÁØ¿`E's—Re±�Ì-›Ž7€vùò•wð%˜çNÈòn¤%¶ )h|hAp¡gËæ6˜l€¨F�<>*†ËQtׄM�«R–¾éZ¯_`ÆÅFÝvšý ´è>¤<ù ޱ7k?l 9…7L˜®V ‰ðÐÿzddÍâ㩈p¬ð²6é¦3Õm½:ÍaÎ ‚Ù?ª­ú-ÀA®S§uk»Ž Dþ³f_ˆC_ÜAý£ø$Áá’Šœþ†#(h`ÏaζÀA�K3Ñ{sVPn%�h¿ç½ímÅèÅð ×Þècè\Í~LWÂ:ù\76c)̇1OKZp#X:í‚­w|Æ#–Àÿ5$ª5´ ˜â�ìc©nÖf’!Z÷ÆYh YAqdð/—ôiµâ�ñ ŠÜÜ«Üc/ {Ý;Ê—©TNXÆ€­­0tàMz�“’ö<8b¬qž­1ä‡v—?Õ/²7ìM˜ÿ ÊùwqaŸfÚ'p$Bº}Ãêcs€Âœ&X9³úè·R-ï�œ6Í0ýp-x^Œý[¿ÛäÚ~&ÒI—Û©ÊÍÒøõÇot¤Ü%UÂpßB dz¾„ îáu{`ðy@=†�p‰ý2Ðz°Ûvý|¿&Œæ¨ß$›Ö–v¸:1dÏÛö^DJ«M{6Ÿq¦¬˜Y�Áwyu!‹ú©æ¡(7b5Æ�Xqs@?¯™ƒ” ²å»W/Æ‚àz�Xv¦”YÞªËÛCžŽänÙw™–ÍÆy…Pwll1�Š‹Q>|ÇdŸcgSô‘éÆA^¸wŒ°`}ôðl}·Ñ–{a�o÷T \Œ0 •‰zÝ>‘‰t‚þk,%Ûä�°¦Éüûœâ·½î‚¶Ÿ¡ ,� ZÞ!í[¶-Í ^Œ°ÅÎT¼¦6º]²ÑTl_¯6ÿoH.{­†ÍlŒÝp¢D ßAÜ”lé» SaÓ¯‚RñŸ£ØF��ÓÒ;ê-n°X�-“ÊoYÚTŽo%ºxƒhmÞ�¯³,�‰ñmÆ€ÌÆçöïðØ:€Ãx³ñþj%Á…åùrµ÷Y›wN3̽oP(¿Í4lˆxñbÜñ¨´�R�lÑãP“ùù}æÖq¸è„ôå¹hk�?Ð×Óù°µ &ÕcM€Ý¯«ÆÂôCròWâyÂÁØXϲd*l~Uà–×_#cÜèöÙ½¨¨ 9²8' \Œ—(V ¿,Øèð)ÖÃ�d§Ð-cLü�¸y)OdT�^Øö2rÈcËé|¡Fq8»Ø&ÿ.óµ%ò„ ‡‰Ä× éO”4”…3‰‚ñ9…ì„Ø!I-o3|ž»ÝL/eµË÷¸‹,ÈÌFC £Õ«†]'±b]©ØÀ®iV¦Á>3„zŬ—g¸s?8N3”øU‹'™ú½Ë µnfMBÜ_± på¾…Ð ×sdx4ºíoÏj.•gŽÛg y¾gzØS°KîsMrÁ„îÊB&¸ßèvr6Z5 ØÆ¬O¼”ï~ëë˜}*º?�^&‘ŒW•´éšár*”È'€j,Fo ¸],Ø2+´í ÷lææólX8‰› ˆöf a[Po‹:<ÇîµÓ-é³´Pà'íkÑ­†÷�¾t$\��;ç$ì ?G›¶oÌ“g!5Ïc“n&�#!g!>{=œÜúö帽7z+ÒŒâðö W`Œ†(.�|qj¤{imÎ^Ç-¬ ž­îÙ×÷*bx-;»»™Ü€àšˆ AÇ[øÛ" ·­¨œláÏhõ@7€í@޵09té‘Y¤�­–ªT Ñ…µad¥˜ådGÎy tË‹åy`˜ÖRè12gzDƒÉ-î§—¼øƒ]Š¡¡@¾Ñ€Ä#oÌV¾´ŒV3Ö ÅˆÀŒB×ÂXU÷¨`´Úlä0?c�™xhÎU¶” Ñ{Ï*oíÆ¯0Y¸ôôd³ýóÆø»Õ¥{ ô„(ˆ]€ƒû‚ ‡Ôã›P)g ß`r‚v€Þåt§½³³‘™?–P¢L/—9{•pµž7Ë�ó–Œ.a¾ì¸†+”JÃÓ|¬Ó’ !é±Í²¼£Î/fQ.Ð46<¦¸rCN3?N­¢Pyë.tÖÚ�ˆl¾1i ç"…Ãî~þJ‚ÐIŸ­ßš~UPɈxw¿1?À�ä[út+lÞwJøfqä}ke5ãeÞæÃM‡õº(ã:¡•äz& �­£Øê·s£«$Yh¹”M.j0X¤ 7ÖR17•—J![ÖÚ‡\w}µÈtHì -ó÷Ϭ7&Y†Âf>xîò;©¿/Ø9-Žó'ó9QÉF£¹�}§øºîyë ß’\Œ©¾Þ¹¯¸dq€CEì.-‰âÜÁÞØêîÝÉÀ¼Á©}<&%!S-8"ƒ§‚°îI°Ú±NŒ�äaY�ð+�1é{V@�¼mnàùä <ït’â†æ(!b)H[wCM§#’xd AÀ£[`ˆä�âí%gDaˆSîë|h Iù±Ô°+¶âVÕd*–Ûq]<¦,ù™f]Fä&’ß•tõÈ‘ŽžÕ\´i�}ʺ³VSÁÇwav¤»jÕ�”é‚Ye qŸ€©�ŸAõYúýÊõ“·^XùráDÑ/²=ý¡xekgöüý«ru‘Jïwø–Š\_6•„e,U32/~]+˜Sê¹óE�ܸÈ+ƒˆ½9CÏ×›½‹¯z{3µ× b2?åAÍÃì–—Û5½Ãcd”6lª¦„©¸t«¹+î7¦™9Újÿ¤ÂïŠÓ”\C'çe�¿Í¦Ô7C‘lÆ Ž® V´?Ü;ÆëÞg+œˆ?S •–ÕlcËP—ÔÞ´áfC £±»c´yùY¡4�c‡ÎuåRáà¶öMÞ—[‘$úÞ+ò˜Ú_=hÔ pyÐ} @¼=µ¨¶#ƒåù÷�µߊÖLÊX›%Õ†ù±ÂÎì`(±žø¼ã«�Yt€ø¤Bœùq˜ ª•¿�|6uŸ…•«×E­Þ¯dáè'À£�btT: …ç,ɘ¡ÕëöĈ?ÊÞŽœY«Aîß:.¶«øZå½|2 ÚǯÇÐÁVH.¤ôþŸT†²Ï­?ìµ_67±z[ás�²-½K¾¼6ÑîõÙ@èóÿã‘è2‚% ˃½_N /Á‰·Ëäx~ãÞ]ðecó½ÝRì‰=æc2¡]Ò]­½´ðÍEWuODLs‡¬noÚè­tÓy ÷î„?6ô¸<ã~á[Û?\m‡¨O³Ÿf’äQ^ðâü¨üh f¥(| “౯9°É¦½¾òNÛËnmHôÓ®AZÌZ“ŒXjvÝïc’ÀM›h¶L ŽÏx¢S¤[‡]�VSÏóúXaƒLÎÙÃ>{,æÜ ’Þôt5³V�·þ‡L Þ§ Î×±‘÷5zþG¼AžTõ´sµâð dx¸Úñ6M˜Z\¦Ð‹»/uî�Ø%|ØÏk~À¤W¶“&'6Y¶)¹/»;0vú1Élê éûšαUç[;ã Û4U¼ëªŒŸ{ ÷åsˆ®cx�AùÎõ†Ý�²Ê+ͳ€c<ídšÂ˜=ÆÝ§¨æ{Žè~4Y:+—}u踌`�´†¨‰òœ® %q>¾ßT€žYEkv›ñÖfß±¬¬ axö‹Ö¯ŠÓ'éOS%šr Ϭ˜3Ë ¾ÑsR(Ùœ±Žw—Æa•Ð×Xíñ}mn*Uãßb…1“2ØIÒŸQôá F’«‚«—">Ž`,;`<„…V±Øââè²Ï' :½P#° lA0ï§j^dÃ9lwÈJy”Îjg|;h*qÌ[�ÎBUÜŸ »¬ÖGxA ϳÄê¾wŒ^_�Ó:Åï>Ã+bš~î€ GÈúÑý¨�Aì" ù¼^Á¿§þ�õý/1f¯¿Û|ã�€p&ÞgyÉl‘h1[”p U bˆb!±NlÚ\êH×e§[Á g5—wé œ÷HÁömŸcU÷ßàîoò„7Wu…z¨7à^²÷a£b�HHU) ë‹Y힤 x³¤îì ¹«© ™<Ú�8]æÄñÇG ”¹¼°É(ä {¿C áI P„k(!(F,«âŒ¹l8ô’ Ð�¸[x tÜÙ‚£¢f§„6׃‘B�ˆár,E� ˆ† Sº*®~|hm’ÄYi.‚¥}`ž&¹a£Ý¨ùk*/;`ž2¬þw/…%<#„"Îß�ä@•ýâ¹åTøþ÷ÆD:P ÙN�‰%(@rÄ&HÙD¹J¥©J�=8ÒØ¥Í8¨7e8~Ú¤È.Àh€4xFÍÈxTbOJ|„?@ˆàû‹¾Ax´ícéŒ÷¶¾g¿iÙ±Þ.±oàlg!;ÔuélÃãWp²6=½5F{‹¿FYMŸ;±Ç}ߌ±DÝ¿½Ž‚” gÞ£g³‡›.à…ør`éŠ.-íX ²=ÚØß/ÓŽZ–ÄO^ý2/$Èf'x&ŧr{«KÎÇV\$Éì÷Jn¨]FýÛï�êÜ@Ÿy©›ùÓ9&ÆþÎ/nå¿~ü¿.§piÛv×tû 6TÖßç´óŸ[ !HU÷iöùmÞâ—·3˜ÛÕ·Áð�› ]æì¾|öšó¼SôŽëÃ÷Ø1á7±•Æ{Ÿ-( GB”»°¡¾Là`!»E´*vlý}†­C^ã_ø’'ÆÜê ²HÚ5é-œöwpŽ%Èñ%†žœg�ÍéU{ ¸Õ>¡;˼à{·µc°£{tïÇõð¬F±Š<.´„'w*HÎísä‚"HE°†mÇ<“FA�Èu‹LÞé ŽjN¯æÞ6™Iö_™ë6R-lvŒ3�ØbÄý¸ s‘&}CUÓ¥-/37 Ÿr×ɲæy_Ãà¹_sʼ ·spß-?Ò" íIîwjûÀlk�}T�ª’4 X É—ÖHú;xÞC†J®µ¸YçÍŨÂ7¨j‘«¯üQµÏè{‘¤ÄlÄ-öw[>ü‰${Äݰ†ü:¹GçÍp¤-#à ò,¶ãR� çQPÁ½-­¤ÃÝÈÜfmõÁ_iû8AãÍvö~8mÐT=ãŸÙ÷ È ù7ižxøƒïà~ýø8m +Î}n�Ó=¸FÝãA…X’ÅÆÿqX3zÊ ¦€Ã)ÐÎ×Éß ëÜÞ?”þÈ""N[ê_« ü®,9áÜçöqPßÊh@E(µÆP[÷~¾ Æiãs›¸|¡ µi ºäâåî_ðè»PßÕÙ‡•£¾j¾×Z¾fA¤ïžˆ �˵Yóõéå×O1'�2Ô]ú¯îñ£ñîwkMÐ÷™U:œ…Gt[˼öêý0FÁç­-�Ò¬È=}A©@6t0«â]Ê·.r˜ToBæ9Î¥Åb€ýã¼¾øÏ�ûÛ\oiõgÁ` üÄØîý¼.5óô¶0¹¤Gß_·›Û�=)QF ,&Ø7ñ‰Ì:Çœîþë¹ÕHýd2t+ø zLa£Å¾nêˆêjã"ª8f2Yþå¿5ƒMPç<;§�“V§¹ÀòÄt›€$ m¬vXT—ŒØIYá¬À×>p7¨J$Ñ„¢E8!,”>„‘‡uÚíØ½ž Œ[ÖÑå¦Í½n›Èàš#Ø”2zœIhUîY)¨‘Hézj½Ók[­Ÿ*hó„ë‰Y#Åí6DqšºrÔ �{}eÐü–4¿1ÖÔÆ«¦å«4x¯›/Îüa­ø!/ËBçèÓü ŒH,ÔVðm…aâ}ËÕPÅ÷46ÔC={Ã`¼–'�Ð_=§2Ç¥û+|†6kDfHƒÚ;‰œ™ˆ›[›ÞC™—ÅA¢}ì#zžG™"ÈOŸ¡¦ÛâÀô3)|iF=Ò}¶oW|ƒª›4{|Ø^ðk–±”’… h]*‡ùKmÕ ‡ïß«PVîh·Š&ýÝ€Û€öËôc…<^w �^¦&\J·a¾Ò«W|ЇoÍç{.=D½G›_ˆAĆÛ�ì×�FîA¶Ö6ä…íéL'›å3ÍûíÒqäz¹pI¶Ù„|aºŸÞ3”Lé‚öa¯Ÿfš‚C¶`(ð¬ú xÏvl²âèeiûçjÁ±é+Yž¤ÁáÐx-d5ÍÝûà/±_eâ¶?m!?0éAÇ‹qË’rÇl}«G r£ï¨Z¡0ežõýÒ ïãÀÃ[8“«3}ÀvqÆÒ„¥Ãk…íïØepöä7cèõøÉ]ž¶D3ºè, šnþ/غ{›Àt²Ô;ôq¿=„‰”æ»û£¿Ü`{`Å\̘¡ÚíáÔ7ˆðòç6a¶›uÑ»è˜%Ö›-^(ø`}z·Œ%ùëǹŠÄBg¤ *ÔφBü½¹€Pv¿Ä¥_60äÁ©}õæxðŽãš´‡­ž<~ü;(å×ΠÍÕëã¬ä!Ëêu­]‹…$»aï)1º8Ûîþ‹ºÔ¥f9—0¾Å¸¹ß±ÎU©<€ÁK;,>p�´,ß.ªjd†U–M®M¹jQK;3Ä …ðX{•Œé[äŒ0³®æñ-Ç¡4Ö%R˜O"š–,s‹‹e“{Ë6 {Pˆ<-¼ÎpeÖ­§ÙÓºÜC·d;¹ox¼FRÚ)!xRŒµVwΪuì6_62êiî N´Ä ÈêÀ‚ˆžpW˜q"HZn“ª¹Ý�aî!V"­Ÿ$1Ú9ÒÑ#ÂëÆ|ëà/²@‰4¤$6àÞF«™ç0Aái¬4"—ÉŽ–ÁN[õìoöÙòó‹80^h¬T2Â)…s�Yœ²ž‰8Ñ4ÆÛc-¶ÕËróÞFôê8í`= PzK=Œe-<;,BAL¢ô ’èB؃éOE³šž6“‘;àbªîF¿ô:A²ÈªEУÌ�]ÍfÄäõ¶’æya²4…°ÚD/àõy⺞E†æÍ®Þ_àEf9F?\“Ö¹hÞR+ÎæÄ^v&÷Óãî—!mn¾y@º ¡¾çr÷ÆëG|Õ¬<ÿü @�Š|B D *ô®|mÜó¯Ûa±¶ÿŒ óÈ:>,õó®rŠ9½AÎh`âaú±Ìaë–~%sÀ"›…n ñ;Îydá>¼6c=½(„ÛÛFà¦[¢Íl޾ �d xRs£ždó‚ÚYó°½ÊP«Îúɶú„àyX…‚Œ¾Ú�x*E�£á2=�,?ŽÕ!>j÷µ6µöá·=§¨I¶o…AFžc ˜²Hb[@à£ÐÛíšr´}n2à:a�Hk³%gè[Zíìì Ú®/7¿Š9ÉYË_�rµ]é‡B;Æ:\ÂY1ƒ=´åW‘*¶ÉØV;¥~ó6m�N-x˜4¶> eB»Ê ·áÛ‡·Xß{í*Ü5Þ¨§-*"áW0½•J�íΨ~+E[„ _ºÏŽ�!—Ž|™cÞ˜=KUºÙêQ7 ò!5ñIãa�ÝžÁ%ûûôº;D§}a9v$—ï?[ø¥–mžöß]g‘LÚÎÇŒÅNõ �¢~ÚY÷ñî�Æa¦ÑóêúÈlË„J›–ïNŸ æÛ‹2Rznc…Àr¯]û¹°c+q{fdä) *ƒyð3øJþ¸ÃªÅå~�¿VãM£@ˆ”ÀåUÂÛ4 6—éÓu–V+–¿_ бTT�‰�àåŒÇë�þ¿±·•åhÿ2NºÚ÷>wê#WD\Ï£“ !ÿQ~ºÞÔ'ùŽî‚~z=¡ï ÉöGGĺËÞåM)o6ã»-'´_¿!±éme€r ߺ±ýR„ ÏO¹ÔŽê�¥}îïŒK (íî‘Ö2[XÑK™e݉ä#Ìâ€FÂtL�o Ó(M†6–Ù·ÄÙàSÆ1_«Õ¥;=Þ*Ìq¬„¿,‘Xîœ`4àí϶ÿãâŠòä!U÷�wNÍ£ÓÐî0cñZqÿ3³söÆÏo¶ësúõ�ç£Ñá@A;#~Û –l¶wc½A[‚’}Æs-k¾ŽÇ¼ ;ÓcÐß@šâq•´ì!½`TPá–3��«é4Kàƒíµå›y½�]·ÞÀЂ ÊzŒ‹sÎc»pÌ¥heýÔåÛ„Ž*ˆdÖÎÅ›?‹_^‡ÞÝX twPµ2àY8ôô ¢©,©mð@0Jl{'ræi¤:Ùœ”&�_¾ ,£3cgï¾ø†‡™ É]�Àæ”@bÕ ([93Ý©&2„ý#�žh /�p_1õ¥»¸r:ÇŸ aÙo ?hïóùö áÍÔ$[€Øaµ¾H Lw÷U‚Êpëðt�×ã²…Jæ-ñTh5�½Ûþ”¡.îÕÂaÊ”¦Ì½—f/nß)ú«Ôû€D×=׫$}‘¾Â�pcÿé×®ÿÄ÷I‘ÙHîøo½•qñþšîn;Â]ZR£ÚÅ\ð€™>rc­Ö†úS˜�Ò’¨YµEð8‰Ê ¾K’ _âùÊ©Ïn¹Bï+ÓA°uÏoѧÜ[¿Ë—C¢A(ù»ú-:bßtÚ'NeÙJí7_ÌCΣ7L’ùWÞ:cfeÍJ�fÈPÄ~ŠF'ýaùMMgÀaæuR}æÂ‚à”3j´'ÒHV2ÀŽ>= ýösÔö*KµeGÇqî_bÓ}¶´Q'lŒ¦÷ýyhØÌœ7ÒÚúEéQ熤Ù9Žp3»o3;–-P"ŠeÚN0=cÔ»’r+xÇ}Þ˜ûcm,ˆZfæ×<€Á„ï­D`%ð2”èáŒàv�€l5ˆãV{ã&dLz¦xΤ F/e(wÝskU5¼ s­é/p:zu=Óç 9ˆè¥98uBl5"VÀtj{%¼dÎ2T[¥ß w0"!¢æNœS±‘!I%ÅT1»ÎK#µÁŸ"ÑŽZ ï0°² 0Õ&sÕå/Õ|ЫîœÁU`øãàfo•YÀ$ã–²ºD3nRðsiÚÏ'üþý:ˆ7ãÆŒ Èk¬ÿ]öý˜?)ønEÑ IÅóµ¡và§Ðò?Ϙ’·Ä Üú¡°–ÖHÁʉ=ª&»'|ÁmuŒ×³èÞãsð[Ójhuh—EÛÊ2b6¯ó« wÌö ^2 ¥—8‰žöÎ5äºðë›S>᯸€Û—±Í•âxÙŒ4Xí©o ‘;’K�ï›_nΟ˜~[ùÏÌœJ±q¸e-ÊeHW‘`ŒÉ‰3áu—‘ĈOŽ¡)öWTàã¡ônÙà Eã ‡¥éžj¥-`vzw­éL7ã« :œ нï�$ý-7¬Ç�CI�Eª÷ZÇsó[Ñ9}p¬“ÀEÆÔ¤mˆAdÁŦ½‚ÙôqaàH` œ•rw’ÞYE¯p§Äph+6•0e8‚‰çÇ S¢k¢â»‰œiµÛ> } €\='Xlp@ýíÞ—LÌ-x>â·s"»ÊKˆû)†Œû ¤.Õ!$ /Ä#læä¬½Ü_ë|êg3N’ljCoÊd±ŒÈ‡aŒW•nz1s¹­ÞÃo)Q˜L®�j•Ä·‘í«Mä_;’¨4¦u1€¼_ã�¾ï1‡ÒõˆÊA{p*1°‚žäÎT1b°¹n“#ÀHÝœ1§“{—˜ VeNÂÀmƒÆ_p´!�B Þªh‘ýâ°âhœWÐk¼ ¬q{ÚHKÜ뚸@*+ÚË&eÁÂԵȜKoeI‚ð2€8Šb±%o<ëVãØ¹*7Í'0„ŒQŒ¯Bí¿?u0¦‚¼6íjŒ·ÎLªrNlÍß#Y¶{—i¾w��@Ë�Qȶ¬º!©®¾H_½ÜaéV­¾§6û L …Ï¿ZbHŸcª�dŒÏ?3…Ùó {y'Sñ˜£|)Ðß>-ãEy<%·Y!v‰Ý�Éqi¹;þÃÎížyÕŒ0vp>¡uH`¹;Y˜ô.”{”ãc÷wÓû�Ÿ½Ñ«U2E¨;M¦¨2Mª)ÞׯŠÚàß»¾oýô§Ø¨×Èïn´Täñ0Ÿ¾‹Î7±FÖ #x÷÷V›Éz»ô_óù˜”4 ËŸÇß]Æwż£Ø„ó§/ tÊ�Á±›e2�hùïOº0¨8a¬ãrâ¸+^rèV¢{˜æ¼¬­5r½ï1Ÿ†n¿VùÇ`åå±|6ñ“¡Å�‚ ët²@s¥9}PÞ‡´Ûײ÷é69-vß!ª@98ã6)[ïsží)ïZ«s°]µXýÛFOU6ÏK¼JÉ–Êû<:µÛÙ!�ü–ãœ[d¸+D¾ñÐ1b“5ÄÆ|CÒçëH#Ëœ.C8^ÉЃ ¦ñˆ·í‘�z·Ü{”£_O6¹Åþdzñ2˜*ÏgKH¡é _ÔïÛTE5 F­Èço†ù ®µüçôØ(pñYuI“öHípûaPZ`_ƒ/WÒ¿„÷[nºla­ü¿Þ÷êŒè7­[1Ñ”®R§«j¼ÖNo-a¾:R‰Ë¿A¼¬çIŸ3 ϶{ ñî(U€,0�îÛ$|l° bI”õ޼FšÄ�Ý2°c`KÀwO}£’S¡âq— ˆ #l<ÃéüÌ?sTW=q7¢d »|„^Þ°Š1Êf á‹^fWÈÀ3_p[zl<Ïvëî°ÀM½˜=ƒðsŽv:e{L"±©F:’íâ{�‰÷Ç��` ûÆÿ Ÿ~‹PLoÚØf:ûÊ kåĆaˆ÷Lþn¸ºrfÕ…¸ln`ÙòEj„ÆÖ9R¹kŠÞHUáÜ}k¬0‚5zßÏÞÈå�#ë– òŒ`aJs…ZØ>6½è¸®C{„·š"pM›Uv0*d†ýÆRÿnq÷—?‰‡fvŽ;c¶ÐW ¨©ƒ-¯µæiå§ìiäEˆŽåöõŒcl"‘f Ÿé‹‚�Y \²Ò#xôù¼—Yؤ4ɃƧvÐpvù_kR·• sP ‘ã‡Æà4ßf©Ùœ 9G>tžà\.4,1â–ÛüSȺíèŒÉfò–5°É�ñ´Î�é±£`h×5m4ÖÆzîB¥ñcœÔ+û("ó>×0‹�hÍ9>¦îÑá�ªØ1ûvá‡pVén­¿³õßní�…žx9¾ ¥6ûîÉ!cíE¶9Â-bëð©ŠaL/ˆ¼ßƒ®ÍÞ]k»pÊó[¸2·[ÝñŒöŽì<Â×ÚÝ9ï·•fµñÚqßQQ¬alp¥}oE­—J×›3ézîõ�­„mAÇDÁÎµŠš™‰FÑ­÷…ÈÍ !Xq¦‡"ø¯JçûÅA‰²Í]ºµrËB¢Ã¦_8B|R‰â/u±Zç­^ê-”…¼Ò¢~梿KBl¾Jl5kÞŽ`—'× £º‚ŸJ¶Œ§”ÌÈ…±ŒÚbÎ>ÅŠŒ$š Þü»l.‚=’ÇG›NïÏÕ$½Ò€&rjí‚\qU�kmšš —T²ôÚ¬‹Ñå»®TÊcĨWЇ| ^·Œ(.‰Õ XÏâ Dà÷MÀhZóŽß]΃r{°šÛ0áчuxý@ ]¦îê´ºk¢Ý–[½†­hUC,‰-Œ®é”mq‡4£$¤T–9K”Éf³pK–l6yáa&¤žŠà–­f@\´—Ãr—XÊõå»Ð¸ÎˆµÃº!”×uskHÍ%¼†úWZš7˜–ÑG"úžÖ[TkX“,ÉU¤T»k]EBøÀ¦Ê€hS‰’>Ç×´ö£ ¨î<ñÍYj�‡[á?�š v>äÈÆ°2?ríëÐBí[¾XYžÒü�¸8’Ñän˜¶Aƒ2MÒ°=“üð¤V�»{ #‹­&°gÛôü¢0Óf*[y O“ÅÁËxÖ¦ýöíÇ0òoÅú^xõž�žß9Ç·"˜s{=¶«Vå²ÇÛã@4t&`à\8<¨£Ò+™Œ2Ó†_‘è¼Wpqîƒj[`kvx�¶}&ÓDÖ€ôÍøší "¾¥°§Óš�à¶€ºjß®¦ušßu3™|íâ÷‹ ¹aT;ÃL“]K¿èß~矓Á…^ðî¡Ã}›¦uEÇ»0Fb/¦z¿Wyû× Ç)ÔS]%†ÆúëÙÊé©’COªÑš`ÑçÖ"œÇ¾e€Øq®47 “”—w½‚æì¡ ³y-3ÓCj¯°^3¢Sá¤s*Hz±rpÐ_&:yÕåìj{8ô„'3Ÿ¬Ëd8Ïž%xÃ_Mg±í÷ö…Âç¦y…E!Fyòw*Ñçë|žë³ÏF5›Á+ù9‹ŒMScœç�Y[vy@·ÄÔÐíØ3NËeÊ£» büö½g Íä×f2Ò–4Ü Ùy­É»¿—ØË`ØiJÃf¢}±Ë‡4.gzæhÖ %˜ l"úî´æ¸œEfû¡æL6ÔÅØ‘˜.÷õ®·Ž¥(kI‘…æD�ä…ů«h¢�éjêàÊ{|Ö.ê`‡nk.€©8Å‘p¹xn³3+¸KÝ‘Ãßk’úÕõ1IWÀ-_w_`[ €Œ§LL[8éo˜p×Tè…¼µ¿ {*a.\¸¨yIk$^÷ÂQÅwQ#Š«ý÷×”Çt¨G�¢½‚–â”|ÂÀjOÖ³J�;Ýb-�Ú•òKòq—ŒTÝs .º#»Ð6v†qb± B6C7ç¾S^›ç"§ë©$F=®Q@B¶ªþ9É"Ðçž:{ _y€T»µÝø—½`Eà“W\ ÷�ZË[8l²*ÞÕñ3!f$šÐRªXØõ³‰‡6 · ÷q:¿ÊôYl»Ì²Á6êšUä÷׿§:°Úö(f©7|üìaÏ¢šå߃ >[0 €G%íÌ¥`~SöjzDº¥²³-lJwfź�]¶Í]àÅ©Åg;Áp0ì{ì0é7‘k©ú›8$Ó0šó*‡ÕÀ˜â^EètBžãW†ø^q`}‘a:¬â-´‡ëµ(W‰á¤2˜Ùæ*:èü|ëúoÍhvAÊŽÍÐYûìòïY ¡óe‰î¬/Í{K}š šÿzëÓŠkºÁ{.s0ún£Ž�åÿ| ä º½ |1ÖÝýïR×¼j«[<ø!#ð6Ó ò|†EÂëd0›hÏjý•K=,­M®øµ/§)Ýîä Ãå‹ ù·–`cÐPì<«$;1"à’|ÒÊØÏÔ]Ò¨lÌÕ²×oÑ\‹Ý0`帿-Ÿ(@GnÓr%ÎYîij]lËev&o’û|B®P]�{Òuî&Y²“„)a½Ó·åâ·äÒ9Ë¥•÷žð’�¹Ä¢É…ép –Ö™�ì›é-,àõê,Ë5y>ÅM²�C|’°X/2¦ŒY +õ®ù%` î>×ݰí–|±»™¤$èÙÀEù):[¬PîöíU¯>¡�üßiïzß¼#'ô ¤åXñ—:Â!ÐQ{Î�Î7B›b µi¶fçöí4�Æc)®ZUH/‚��ܦ[ŒX<Þœiïx WÐöñíñÆÀU)r(=‚ã¶ãzvGž—ßÁkꆷJT�¦Ò‚eÀïÑíh…Åä™ åMË·Æð,ïö x o²Ž¦À2ãÖ¶hÁ5¡übð‡xx%HY‘íŠHžÞ½'ÕT¡H €º}•s僿^üÜCôe›38•Y–¸�‹xÍì!Òõè|8Âs[jÉt@Õñw£¬Ã‰éëàM¿ »ä;6xÖ|uºÂb¿žË�G\ ëÙIjÉgÅiŽ£ ¶Ë>oKwç cã” ñ¢O"ç°A–¹«kØÑÅLñã„Kd6 ztd9æÈ(Û߆V¬¸ûémÄãA“·�=8ÂÒvü”˜”bÝMÏ»—äO' §…BA�ÁV%”üW¶ã e˜ ‡ª;îF¨BµìJ©µŒ¯`n°n�Œ2¥Ñ1®C æ?œ.0tO�Uj«­Ç¨¾CKžEs·ÑµzÃcqÔ-ô‹bè\ÝvÔçSª¾\¾¾§¸ªÅAÓ¦J‚Æa¶wÔ}—±‡s¥[Ÿ«"»LDçáÒ ºU¶Ÿˆ^ bö`²¥6LÖI ¥¾ñ’žkŸ~xã ÐäÖ4 ‰�mi͵zNL}Ñ®)èÀƒw¿6­¾8&¯®ý7§ë«5š;çÛU‹í�Œâ‘Œ´Âéû†x™îmDoåÍtÄßYè\ae-È Û‰ÖYívŒYúÖâ¨íˆ}&=wÃ.éæó &d’;´¨ @Âåœô($ýƒµ‚^2à!7FY2|ì�ÚnVøw GÂY«¥Ë˜YùýÛ)CÖàø·kÚ"A¥†AgÕ¬=°�„ÖZA9§MaŽà ‰ô˜f³ÂÕ.£.U¾b=¡æÓuuã¸WÛNg9 ÉÃì•”ô­`ÜxC"Ý"÷OAUØ«ïÏ{@y� = #cÆö×YðOÛšÒf$º‘têXÐEÏ „OÚ§·*BžÔ ð«îŽp÷NóÊ�VTâTeÜÁ˜²>ãB±Ì- ±±Ô ½î…nÛsö¯W°ÞÔ&Ô,wDD¸×t�r„‚*=g„2ÐRŸsuåvñ€±Ë˜}Û+�õu&>YŽs]wázlfK_¦vZ²�ƒ:ìåV·¹¸cË=ùêvæA—¶³‡S?¡·ÀXDÖj[AÈíþà@ð~GÙØ*Ù^^óÞ#»CäâVéÛ#bÐIÃÀÍ“§¶¶ø”Ýà Ò6¢Ï)]ö¯4ô;Œ. O±­uzî!�Xrµã. %©CaAZÈ©›ŸX¶µ‹ñ²UíJ k¤¶ØúïÈ—Û©Ìç×<Ðwô»5¡ÔÔÄ ‰dArÇâö1�×ì1åc¡95ì±¶aYÑW'ynæ(ÔU_‡Æ÷KXÖTmkËÞ>ã]:Õ‚³S¸Â-ioCðï Ë —€¹CòoéÎûÝÝ/ßÓCŽ´‹nþœ‹ ùÖ±qþ�ß�ϰ¬©ó"Îäí]×qŒ?¨�¯Iÿ}jØA†òîè;ΕɎFæKòj‰çÀžI/”pEÝžÒ¦û©W_Ø—+_&úµÄÍ;‘›»ëfÁÂ'¬AÏ“/C­SçØsBÝ/ʯö5yÖöJÜñEyæU¿±�Ðì{�íðq[cª{þ½Óë�¦µ+vHåÀ¾ˆiÜŸß)fâö×§º nåœ/=�³4Ý"€‚×L¶ÿr–�:× yŸ1öºà -¡8s¡Œcñ>�M˜¥Þætö~‰r#“Sà¨,¶,DDŠRÝí0ß~¶±1婼ä1ƒjx7©<òîÖF+aÔ5;ý›_Ú£Å@ÃyagZdg“iù…ý‹w^ÝoZŸwšrË'ålçB-ß™W£÷ÎaÒl—™ñþW[Nûl”‡™~ÆËà€I¨±û’»0_$òÒ©µÁ°¸³‘'É™!×µ,{êØ0@¦qÐÝì'îP|LŸfº�,¬% ?ÀE²©G�‰ìfCx«™PÍ܃sg €‡�‹¸òµZÙ †[æ1¨£ã)½ñ´9v<:ÜÒÂ}âDççߔDžÓ$ÛH^H…¼)�ÒHÑÎh»pfE¹îÂÈ·�Ñ2ì¢2%º ¦ù ·Î{|Xr 3/0@Ó[ÙÌüo}�0•ŽDq‹•àë–÷âsßÚP·"¨ö¶ÚøÊáŸ+Z úÜÇy¤¨Pb ¿Ða¥“ëøÄ�Œ/ŽU5e]*•8m_Cœ ¯Rk¡gK˜™«8ž\nFÞqDµk8wëª÷vòhßÊÏ{zÀ÷ˆfrûÝýž6~ú"ö¾7»èTP<âçÍw@‡ÓïÂq„ ³Zrsí½Yá#ä~üG~óWƒàh 5 4Æ| £Ò£ZÅF°z vź¹ÞåÑn-ÊÄÕZæEP˜²ï”»úî Üäç´ýÁ3š°èBÛ–ÖRÆN�DhŸ9†dâ¶Fè‚Ríñkä¬L–À v\å²×&EDQ¢ÊÈ—?½Ð”-œ§5`°ÒÎÚ®˜YrñlȰºÁV@ë¹Ý×|>Gz†Ì˜™žÒ†;”‹¼c›�7£IÚ)¹9¶ÐŽäÖÄëÓ‹½b!5æ0v6ʹ¶s¬Ù_@Ø|¹p8¶›Ud…Ò.exų‹r̦OIh’†·4t¥Å£oãöÌl•h¶ò�\{ÚLtŸfö".žæIÄš'*¸ù!.×FÙß4ïø¼?iÛHêã’,Gñݾî±Xåëº#aímBt”a &ZüJÅÏ [nÐ`m!ôí=É|Æ4yEÄi[€—;·Åo7rK„“Ù1,p ·hëuA+o.בÆ÷�6Ƈb —4ªÝsZ=0¼#¡÷"é­e±{ñ„§%Ö&n“v‰¥ÄgÏqèzp¥ n=ÏC7ÏAþ¹Y×ü®äK%Y“‡;êùË0±"Hn =¾¬%s:zÍÕÎ6îõ�®-s~’½jmOs 1ráÎ5¸)+ጔâ]ìG“ô4'w ‚­] ­Là±_5†8U^òLo4±ÖËån«ÍÑÌvñÒ´þ¬ÝqVj@º˜Äb8ÑMâë•ìfw«íe�ï…ÿóûòè‚¥ÈjÙû4¢I CÛmäÇëjôD¢å‚~u±K‘�e±Eñøä�áÁI;Ú‡#,£oó1±ÑáÙ#Â,Eýv[2Ér(Q:d„roâ�ªcÞ{#¶]Ó-á!0S‡ñø¦q†¥ˆûåÙE)á¹E(ˆÂ€2y•²„Áø�b6Sd`�B‰Öf ÌÀ^ÎÈ„ãÓ¥;¶µô¬„“r”,’¸4/µê‚A7(*«ScCó©‰Ó€ô%P^ð?Úã#÷Œ*pPxxBQ÷¿ }Ž·W¶öTŒÑEˆ•AB‚ä Ñ…Ù@ß* !Å‚�ˆ÷ �l·$£‘H*UxîŒG§%ôŽñâ‚òl¹`ßK’ƒ…Š-”hÔ€ÄF€"HüG§Ò›4Ò ‚˜ñP'%^Tt€<â܉ 9þËñt¢AÛ.kÆøùe£Ã%ˆ ¥I wÊáÂ9+ã'ž*GzÁ� þPŸÏ⦜(½•2yu޼2I‚úc+³E¹âРúŠò¨œ($úFŠšWl0GmF �KbÚdÁ»ÃáO�>PÄsØ �wuAç]˜£®¡œl©r|ï®¶¾‘ñ§U“ò É ¢PŠ�ú~§¬• A±)½-()•7$‰(&T`§Ä tÅÔ_fßv*Øt9?’0SùùGú«ƒá@ÕPƒ¾?{ÈÝFöÌ6ª18Û�m-½Wñ x@ì*‘ø…Ów¹`Œ”RÙ@ (H â£3j Í *žb­¶X[~Ã9 G.ìçöˆÝ¢qÖ±áBTÜô¦9Ã% ÙD:¤x¢˜+%®T²~",¨ á§ Ãe±CëûxóŒ†|2ù �ÄeP‚Ç%ˆøŒx0Âä'ÄT£ÇÑúÁBSÒì¶1Ò£&†JÒet`2 )£¥ É ËñZݨ@á½Ô (2@ÉT1‰°drÕS’¤WÅÙ 1G T�‘B‡Ò:xtrPÙT ˜'ªðùû¬„-î™n¡ÖX” ¹fðªIÅXŒ”õ”)˜²úQ(BP†(ŠZ*­–rÈŽo.È‚J'!kN‡X£$æni¼qÆŠzêHO1 hÛ…$­”tBd€¥Jzê¢%ÍÏEŠHRĉi¡S>¼rd|T<72{•@å,QA4(­–³t‡ñG fŠ:Ûˆ²„µ”IÉrÙ ‰#>Yóª*l·H'eÆ2’ˆ ÂÐfŸ�|3ùú¯Ð¢ Ìc‹0\–TT ]YñÂV}…ZŽô¼�cNVwýnGß(XÊC5;+Ÿ %àƒYµrP>¶mLxº²ˆìç¡wA£ø jÓY¦U÷C]~['k9_;´'pÝÜÚûU­1çür %ÕÂç6´™†©,û…^”·ŸÝï&·¯'�G@äfõàÄóM8¿ƒ‘ôÝÊ8É{^0ÑYm¥ÖÇ®®9�lrU¯>¾Øw[6‹jC×sž>¼¥*)fÏl«ôgV®³ê»- ÜüOåÕí궯­Y�C‘ÙwÀý¨]úÔ êtÉ�×ÂÞƒ®÷af0Æï L kÂ!&rv� ^�YC.d€YÃó *Ný{#Åæãiýc±ˆ9šÞ·U¡â©ê<–³C«&0ñfªË„Ön~Š©TÎ©Ž´K©¶OÀ¹€½&·‡™>‡‰»ã·„ìµ�”†�+‹F·ÃWwQsóê?,g +ÐI¢ÅÖØ¼äetó‰Ë ®i**Îñ›g—2SAé饫O…—>ïýÆèüPK¸rúSO�ê@ôÊ¥ ˆÎoúüìCs@uq£.Œ„¶E®J/2Ï–Çš¯œdêÓa†óœGâ­rž0Ê–òôᘥ/#²[†XüÐNbŠ÷EEfÄû7M›i)t€+b7l²n\Xrbâ ‘8ûT¨ék-ž7A³ÊTn©Ù‚èOl‰ýÂ% jNò 8uÝÅ NâØ{¨2ÂÛˆl͉cÖ¯'lˆéË*wƒ UF£ÔÚ—YÖ.Î&ò³éã>áÐS{=Õ¥®ª´BEÌO'Ž™¨5ðÝ?{Äx®‰gìT0ë ³[ÚööçS ˆ4v^úml„}¼¨Zîu•g.±þïhŽ  í6rc�yY¤–èÍ ›Ýz‰ps i�ø—øqÖ@´3ù ³žÑ`?Óäí g�„#�) ²8i�–7Ò}�£„j·bµ06C¶Åž’×…³qy¥³½–j6‡ËÛm¦Ý°!9o~û¯Ý´’* ßd —û‰bå¡aeqJw‡´¼“bÐ92x€úsãG[8õx W=¤È˜É—Ž[;|Ðø‹w1�Þ«ðùAn^ Ö7¤Ï8Š„d;_oÃÀ‚\ƒŒˆ¤¡búÌäègÎè^ˆd cÍQ°ò㞬„\Á‰/³ë_9Õ*ã‹ ®VJL±ö+ À”ÊNI~d5-ß \«¦’¡nb¼]7Z�¢Óî5‰<…‡á™¹ù \” (‚ãk¿+'ß_¯ *'¨@Õ‡z Ç_®T¢—$�†Éæñ¾­ñ V�º$p†�»�Vº`/ jéÚ´“)zÊÊÆ‘~Öy‡Ä¨4m— —úÈѾž‡8¾©²íøûîF–Yk⮡Ÿ>¥Ù}Ù@Èl„&Á�ù#ÛÃÃÆqˆh1 Dò¬b€åX8¡eÇqò/4ap\Õ‚(y¬/Ì–Ô€n%k* _w�œKRW¨¶×ÁWœæzðÅ'Y!íî¯B²f�çÃÈœ…‚ïRÔœo­Îõ€˜Þðïlµ-’ÆmâkGç¾¾Ü4!Γºß;í$;ºÀù#ú*Ò¶à¢�n\hÀî�ÙÛK­òÀä!5ý J øÊçGƒ¥µ•Ô»­qŠ´alIËß�ÃY°¤ënx%âv«©å°³¬3Dó²Në× £ay^‚bÑÚÚ…J.jÊ¥ƒ ¤åWFæTMq8ó0`¤.$‚Œ–ª:é�ûçiì>Qø6Ò q* ÷>ûÀ-íM'�›IJip­Ü7ã˺tåZøºrÛÌ9j¾ŽÙV ÷¶Ð’¹d�'B�c¹GùøQÝ]ÙçkêoJUMv.ÅZ¯­•ý“õêõg$‡Ú/>v•›ð=ºïJ &s‰Ä¢" Âè(íL½{­ZŒÍËÖªjñ ׬³XyÁ’MÁ Í繚vY±ŽD·‡@YtvS"c`�9á§dƒv)jðl�` ËS¥&GZ³£Ý¯zgÎv¸’I<Ù)sU>l¦3ú˜4B³‹’ž°Õ/ÑåZ‰¹ª¼ÓY(ð)³¶×WS V›ç]Å^·�б1°Œ ôñÄæ#â»Ñ2vÈbèE¿·¾¦ØC9£ œW®âÅ;2³<ñq;Í[`—ÀJ–-_–1½ÙRºl3†‡I=©¢k˽&1¸Û£Žª’v¹Ø'C[J�%MÿVô;"‹­Ü½T#––È› ·szß0`ËÇ.¡a:‹‚¹Fñ Ý6ÚCøü7ÉH¨`ïÛ°S F”&cµ�ë#ÄZdË4OX“ o“¶µî“Ñ?[0ÛˆÞÇ–Åj£a8B•7þïú*`]ŽñÌî ¬#Ð@ËŽ3Âùû�I5ï?iá [šÀö-ÆgÕ†CQÌyø1/È-ã{�ð7Íü-’¿½à´U`S>ïéá•Øz"<Á°©ƒÃMMC>ýå‚îb 08'žºJ+±YŒO °¸ì$òÖÝðèi‘ÕÚÆ]¾KRäºü«,ÒNðVê½YîÄõœF!rï÷ŠØaŽPÙõ ­iA&ïÛ ‘Û$jWqÍüæŽ.Tq FM4~U±lïi*žîuQ@Rr ªN]8óJ“L¯W#b‚pKòí̽4"ÀçÒÆWRº™6ãT/�¬²yÈE5®³[m`<{(ìÝ–öw\ÊKï‡kÌ?gy/îB$´‰ImìNÊ:g.ez+è° ^ÍpQ±‡ÒOb|<,~…U±Ê²Ò…­�îò.v&Z[\U×{{3n&)Â÷tPÕ¡Ñ€ÌCÑÞY°W ɃÒéöÔ››ÊcD×<6Žì·ŠW5ØÞ·–˜|év—»�ãá8Ùˆ¹íÎR8�uWž r”6M–Œ.C[y€#à\}aÅ´n 7p-Ú�V¯k;vÈé„á¢>ã_TŽš@ÃdÆ–!Ø¥\³>;ÛãYd¢K9‘(pŸ�W�$Ýv’²Éé³%òà±óÑk-%Þ,Ô{ £À$À'ß}žóèë è´§ÖQ‚‚cÛgckA0¹|V:²¾ôùŠgÿ×rʨt”úšÄÈ©ï ÏÅóp3•Ê_ŒF¹57ÀÞ²£I­3R ¦3Ë›ÕîóÝè‰Q”Æ®†Bf9Mm™ÖñYê°ÒÁÎß´­bU 6æ�h3‚±WÓ"Î ×�™éáòàï ƒLÚ�B|0‘vë„�O”8]ÖæW†8Ò쳉*9Ù“Ìͤ&ô–õTxÎï Å`»=�.{¯´é�–¾�èxàô ¡ø{>f¶Ç¹Älæy ²¤I�Ø–±ÀDšÃ[/v|®×Òò¢Ú²ƒX8O{ÏtÁÊ+kË%óZHÌå7|¸#Ø{ê2ˆ.·”ŸÀQŒ4~$··{Þ8iKæNezñ7uPoÉÄëÖ–KÉè¶4A÷­ª‹…èã3k¢y×öjø011­&Ætú”+m5+/K<»npÑ£�½Ø ®ÔÇÅþ7¦ ÕlùͶt×6ÖiôÐGzúNÙu[ˆ ú7D-sù_šrŸ—EÂ’QW£ïÌ„G�”@fùʱ‹çYŒÅR`¨Ù@ÊÝt'üE˜ªßìM¤Í÷¦ä$ �îf[bìi8Ect§Æ Å¤-µÔ„û¶¸DíASÆ*äx²hqÙ�x70ûŸ<_"Ò`Ú°f$Á)LíÆ;ð�¹à}Ì1äðþsÛ} œ´ûî¼Ì&«§å¡Û�×Wv£^Ï‘tÑ®µ†PB(ì`­�/9b(žÙÀP­Ôžd†k�|—[+\X‚*�ࣹùHÂ× êþ¤% �૆|ùþœí­éi!¿9ч~rT@íøµSCÄóo�x²A_A+)‚R*‘Ù>>Ïa÷„˜y=«:}IäH‚êSñ�§ÜJÏêÉ,t*Õœe“cjo¸jú7>%*BêØ×— \̇-†@ÇÔt!®Úwôé]CÝ–KÛžÆMé `¹ö·dÛ�‹Î Lñœ²L=á�Ùäß¡·‡P ÍáÆ÷�ê,+×*ÒDÖ}§Ö×xFOpÏ^cäÕ±Z�ÐÇËçÙ¡ûX¦±¢Û6ï7í°Ìö €Nt5G¦'ZÞšÕi'áC¶v^™a÷b1{Ö¹„ºYû£JwÈPYF…’&MMÄø9H,VlΆY€0Œ w½§` ¦ÁÁêfüY';wL'<(rp£I‹™îÇ-ÜÔ¹téô—É?æà!èÓ¡S©�¾™ÍIjÔé[:Ý}xµ ™-Œ•õkQe–òC‘ïCvpÂ*¯x‘àÍ¦ï «Ì¢QAnüZˆêëô#‹¢_ÛÖJŠ4#ÝË�ÛIÄŸ‡«°@Ås”×0e” pðú–@zo종)Z«xSÕ¨<×È“0�¹q-t;P¥à¬mBl�&z‹´àvz¼ß ß_„ÿ‹º`š±JxS‚`û ‰÷,~­o_±‡åî;[<¼úÌÝ âã’&³ÃdZZŠ‘BU½¬Œµ$b�R£m0+fòjßß�ƒ€½öK&ºLÄIõ€»‡œ‰„^:¦`ÀKeñ­ê»FÂaÚ¿§Úêù-¢±þúô'€Ùý:ÅH^Ñžw‘›'\¥–îIãr où>a§ƒ»Ùyœà:ؼxš(Œ2¼0V#1^í+dçÕôÑ�/Ìz04[†v\ÞŸ. 4!¤ù§UNøöâ0�¶Çèï{÷ÅÞ)š}Í DD¶­[Zæ!¤SQ¤ò l?5¼s‚Ì$@ñÅ»##�È‡Æ &xFø—Ü_šg±û¸O£9ô5lEvÕiÕöɺÑÙ¹fAšùUòîi¯=Œub¶ñWÖ»K=Ôß¾²OqlzÖÁìNP%D.mÙ'd–‰­JMÃâ&±nE@ÞÇé±ÈH‘Šå]2.d.‡�lÊø¤`2bé’Vìke_“n[ ¥j ªÞ3~~Ÿx6Ù0e¯ž x¶‹NÊU­qlož~£‡.¶J°9îTCXáɾ–ugì�$Ô‹¦,]Úzz Ù§Á].¨b»‹ø4;¡×7€Ì©}»;ÛÀë% Xh;¾­Ÿº»¡öK7ÜÜ‘£c½r޽P‡d®E{­½ b¦ÑèUü:•¶d[4¼‚‡Õ·Ã:…p-†‹XÏï¾€ºõ½ç©JêÜš°1™d�§ã+`Z)’dèp‹òôâä *‡ÄV¢Ä“7Ÿ�ÃÃT�t­pÚ[ˆ»g ¢†Èåa¾ÏǦ± Ù�UöÝo›+ô.PýZè0üÁ<×±Õ¿D¹Ë„©ºr|d-ØÅŒmÒ Êß"¬éõp…°AÍ~ï¯ÊU†4pÝ´ê€!gãïnd9hVT³ï:Ó‚]‡YÍ�§Øê*þÓ‘Ùì€CL†—ÁÜoÀ0ØVì‘LÖžÆ�‹€*xÃð@@£r½ù˜²A“á3mééüç�ƒŽœNäûñumøv½Î;“óÛ¢TÐÀÅNߘ�ës¥ÔSžSé¾§@ëÏÌJ\'dáw7‰¤û¸mЂ?¸�±¿;ŒÃZc§  úò,Jpº`mðØX½�Ç·öSž~´€¸í½{[~qiïe ”=Ò,·ŒB†ÕLµ‰B ÃYž;`¥Ëh–.ol= â•´y9ÜXðÂjª±ÛÏšƒ²pã6„+Ü ©&gp•� 2†-bÌôAŽ­5K"#“’™apÁáù¦ä2dä/xq®¡ƒ¯ãXÇk†8FU•U{5Ÿë¿},ޏ+!HŽfúÃð•jíÃù‚¢!€·PI¤Û–îWè%z»§Çù–”Å„ZÚëÕ§¡UÃ…ºÂÆñZÆûJ Ö�$Ù˜]Å7glÕ³òÍ‚�—KZðÌï¸Ò2 ›5 C9ÆÄ¦‰a�šÉ¢Sf’ŸIÓiÉÚÑÑMSÝŽ*Ú‘QÁ.\x!Q 3''ZŸag¸_‚ )¶Šw¡ls!úë#¬~×ů»w9¦R =°]±ö?5JÌ_d8Q%>NþÉØÁÁ{tQIÉ�¸:ðÞËY¯©�ìAž”.œüLŽ; ]CŠøüŽFÇ­,ì �‡ìëc4Ε7³šòׯãô´nI-ÍÂS=â—\%lUÖùv„;Bàv’ ›C�<ø'àÝØŠUHàjÀæöE@9hTN}ä�Õ)ÛpÞ9©É8çDyÚÝÖE¢�¯9Ý�`Â(èKä~O%˜B´áµñtñ›æ÷šš€Ùˆ“ø$7±YÆ&hsæÅ¼®ËÙÖ‘é™í£Þþ Dðô¢(ˆƒ8æ™rÙIvYØYÙœ.|ݰžÄÎ3Ë{WvÝÈtפ6X-@l�‘¡Å˜:ãråŽ¬Þ ÏLæ'9`éc¥$ c›'ëyÆÝºß�$B؃z~û* ¼eÃ.Τ‡©]°( ÝŒà}‹iº×ä� ¨÷–Çæ9//·‡eúœ~_Ïâ…Ù’Í?�#° Ê7w9EõÌÃ4fÂëmR9zŠ~Îq}>è4·¬@Ù‘`CÌÛxZ \£Œ‰ Ø� 0ä ³Ë{Ô—‚‘ã\ Þ–œßók~ØÞ·`ö½ Yæ[`¢NÛ4˜Âïk�I¶FXîÐb?=k¿ ?'WÛrÞb"ý}ÿÊ\#&Äx${/ŸÞY_Çi[ÌX9ô:gñÀ{oª° æx;~ø™HO0î-i­ÈfÇk[ûZÆJÏ5îVØ­Iô‘¶FÜR^½óË|îÙ ;…Ÿck`«„ˆ`ÆY8û¨4¡Ëq»ƒúí{r!÷dørvNý¿eÜlæ)¸ô>þzžYu£ö ±j볺ÞÞ¸<0œn49ÊF§£%Þ¼ÝRqIIÂ^ S^êÔ«úJðS”2|˜3À9à4™Dr )f ¯Ìv˜XŸ�ÖQ€†‡8²�K~°œ‚£eQ”�…+‘ÄAÅæfJþ �h Ä/[Ï0F4v*­4²*8Jç+E*IŽMUÃc®µƶMyxÀš1&dƒ Ÿ­_I (“f-à*�ŽNX/h„ŧñØžJ�àqc°ÊÞ² 2ZI0Û}›ÌhØj]™P÷ÔUÇ9òzµ{l$\ü&¢±áA z&×=ç�!ÒU; 4!¶�ÏíÒwrlär¯çÊ>ßœ0µ˜ p\¡I¥Ã>0)ùnÿjM¸÷n‘i7)½t6ý»¸ŸÒ£�c Zsà‚oñ¶ø.å“sf+y~Hº¿.®$ØÚ'š07éCÚ6VÆÜ=û„-zkó–ÞüÊ­WÕ´Q›€Ù¯lÑ2¦ë…{§,¼|¡Îl¶¢ým�Ñïø·v:˜k¬÷L€Ô^SQ™I$ÕòMp+áóY<ÎÃÈv •Ç]…xd97kd#i‹„>lJ0ž§6ïëØõÑ|0wÞÓwYSÐÔ&wëwuL-dü'·Ete,Ë@@,�ÆC<„-gÑtQO°bBÄ]øúž¬�³ðäU.U>˜eη²[³sºl;Ÿ2Ðs®É|ä„@ȪSS[$=H4¾ãcYœíPëK©p&`Áq˜©¶ää½§äjljÆ,#@qÇÆ€ÏÐÛârÒö«6B1v.È0ªÎÇ0Ïw%~`…~¾ºxç�ý4Ÿ!Ûx�‰¸¸§‚Fô3ô¯D~†ë3Ìäþ(ù\÷œ�Gbè**a:ÉœkFF&–KZÀ’ÜÊŸîØ�nÖ|�–sI [¹ú‘AÚ£µéŸJÄ;~\%n¤:ÝêÜ B×rò³~2“#°wÏùDò¦Ïe‘ìmR/ÏÞ¼5×Ä?¨€‡{¶Í2õYF®Šºhé- rJ9jÂ0ä»þ–DÙF:xGkf°mæÆô°¢#ЬþVÏ¡Þßc�Þh~À$¯KÀà›³*Çï…z ìÈ JÊŽ�¶¿GŒ€‘¼sEÛ¡˜÷/'2ö¸¢Œ�ô†L8„XCû Ú=_S#p›(t“`(Æk(¢úÜš¢e.‘º^w°ÉܚÔ؂bа AdÑÞña(zz&ùrÞöþáŒ}¹ €‚n¿jÙy«¶Úï3ŠÖƒUÕÛ õŸæmùj¿¹¼ÎB2ÒCúZEÄ=©¬]zÆ#w@±ÀÌ 6æf -¬ßI8Œ�Ù¹`ÂFMÅ¡®y^˜.æÑŒVåÔìÊö03,§æ¾~¬3جšaæ‰Áó…øƒQDBÖˆ22!ÅIͧl\ùa¿^Cë˜-´Ø¾ÇÑ£óÞþ¢ƒU< ܨ´î(¥ó óßo©‘|5×|ëW²‘m�0w¦Í…Ø£VeóÂê铃:M/’IÛ�à¶÷k'QDW'ËZl ~¢iw r ÀÛØ³p žs9²ä .°ã‡ Åí’7£¤+pÞãv0|½qAv�“Ù9õédN§Së½xs0¡W[kÝøn A¦;Î_h^ÒzÄíùaº0`Új GïϤ^¾öxÒÒ(&áp2¸3ÐV.â kî6zK_­Ô^™NÈò™UEtû{#lÌýkY¢ß [�‚ï4@R;–Qˆ›¯q.¾ö«Š×³u¾‚£5¢¼UÊáBSælf¥ÔùœC„^Bÿf¯,K ­ðó•æó­¯û+ã´ŒRžöšµS¸­w,6?>+#òvÁª+,dófÏÊ×såŒÜó‡$ÿLOŒZÊ3Õk�O–^Ê7Û“k¦#‹'8k¹³²4 sÁ¦q±§Ìc0(9°¾±wËÞ%íäÐ_O4,ŠT€ží²9ð[J”¶¾‰ÆíÍýÆe”æ§ÈŠF,ŠP‘¶û…Ú¶2¦?¾Þ­k3B‡»¿[éòkŸ¹>B –l„F%÷’F‡Ä‹>êß—Û—¢Ê²×PÃ2“ÃmïÚL™{$�šòÅ>á—lߪƒŒŸ†%4!UmE·ê:«�¸'Yø@ÃÐQÚšPR (ª4¨¹9pKÊ-d{µŸ†ˆVÀŠêU…4±|Ê.X|Mö�@kÆóÜDcwõ �{mƒdN;â7‚j´…�—õ+Àcà#"%ÐæÍHhMÖ:ÐK c­ç‹¥N»¶µeëéHHPÛœ—sì©d sË¢îƒÔ•!vÊR�î~Û$°dRr˜Â¼ª©iØj=Ž«a¬n+"uîæL >JÝšVÒpzé$B_5°éO•Èrë¹ ¿XG=Þ��×B?†Â¤Ç̬¤Æy GŠÊüØÒhèÕÚê#}8Ž[üÊJï}_Œ±�1*¶lŠÀ(Þ(<óoäsªnK¯0&;kx ËýWÞ·}ç~Ãm{Ý%¯|×®:’º„«‰`ˆÍ¿Çßq< æ7¿0¼ÄUè5’0f-Ú2ö‹.‚=o}ôü uا ãÑváäÐ-g+èh:XüŒ}*ãÛ",k*‡è”s%qO"W­ I%«ôá7,Ðå-à›‰ÝrÜV`%›º"ù"ví¨\±l éÍ­†«}¨Ç�X’¸¦�¬ê5«·9úèˆ� b‘ëÛKOŽ¡í^jqííøAVHø{lßÌÚW? †¹C<›h.DX¿8àzsp±]�”vØ1áÅE==¸ï[õê±C·"º]ÂèðÂõ�|ÓŒcÆÞÈ&âç¸ÍØfŒŽë‘Ðæä^µ"0iGãâpºÅ&´[ Œ¦YЕ¿opôDiÖPËÆ'¨²ÛËgS iÌÃmq·´>N  NìŠ!­vwBß4QÖ?8o¯ÒßÉ=‹èÀÚš-ûã¾ã­°óèv,°¯ÆYâ¯Êƒma Â/7òF§µž‹óO…Ä8s×ð³'b/0h®†æ7¯Ó$vº‚£‚Æ>ñ]‚A¶»gó:dܰ®x1¡g²'=ª1Ö¼¶€G.÷ Xƒ{Êr]çŒõa0V³½•PPýwÉ;ÆÙæAÄ[± ¼bçbSèœjp \GºÎ ôŸI™�ÅVcd>H ‰Uòî C¼ATê5gO°ìw9ÎUõ~¡žZøÝ¥A3J@Ò•¬ÔÞ÷‘½þ…2Þ´›³r“KA¤¿e1ø_$ùmÊÔß¼TCUá[˜Ï,rt§ƒ%Ù]ŠÂ�ñn²Çb¿Ëñ–L`+¬ÚSBX"PÄ–£¹pŒNE9†Âm%·€ã‚Øj'†¡–šžD<„àØ L6IÆÉ�/ #�}öKäw!Íì3:Â/O¾8/–ÙB_q´ê”`–µ“"ê„ã™nÀ€6•gçÛ6Á7°eÎö gU;ºÞ6Â"€ÆW>K}¡“••–¥.zט.§;NES°°›{Ör(…�­}ÎnØÇæ*¸îC§ÑÚG3¸J,Ùá¬h 5Œ÷XÎmWû›ôþs�à½C­«´²›³¢áˆb‹Lߣœê´}|•¨Èˆgîê‰&–q޳aFÓ<-E=Ô˸ծ=ûºö3Pf»ÑÖqñ9»gÞª�c! 7‹"V69¿à5K@ù'°ó‹S-8[Øäa¾#Å�¨ËôEø» 0@¦Éu¢ºÖ2P ö wVܲ[õÍ›téËÆW ªqD ™˜_ #jhŒìÖd}]Ö+X>)êÚ`¿�=ŽÃa§»[LK¢PÞ7+˜øý·¾Œë”«ˆ]Þêí‘ q/A9Úw{¨‰s†I/(jA¯`NUV4 5k¼ ÊóL!ò|�yôæ@mÙ’�_/:¬�?Nˆ�ÉÐn.džJKç$^‚«{qÀûC\¶ó�Æ÷6m&ñAjêyÈÝ‹›Ž�$ùB 3êÅóÎãÃnÖž !¿=¶›96ŒÕ¡AÊ[qÓÛ‚©‹$ÛG\ŽË¸°{¡šÄíJdÞǵqÌî1Æ<Ý}ÅÀÕn®Éòk5RŒ\ñšz à»n'Øt#¶ãÛÅš0‡«1) g ‡ªù‰וŸrÄ55CÜÏãÚóFZ(Tˆ¼½7mœ¹ËdW8È�& /…¾D:‚_åêegÜ[ÕÅ_2Me—=²�êHZ\-—Z,ãZ@1³=á.3’%ÄCFBI§´«õís{5ZŽqÕÒùìù�×lE}æ®l%Z�ÒuFÁ}l[ ˆ‚1½�‰Á BDUZÝY±}’ä0@ú�³5¾×ê‰×3»3Ál’òÈ4,×qo¯3Ë @T½wwñž÷×8¸+g`ç®+™Õf¹‡¢i¾7p_”“’¦‰­fPîu)2PàlQ•2>_#QÝ�ôm�³¡OcãêmzNê5Òrœš$�ÄÙó5¡aa� I�Ô5´oY¦¢*ÐÊFy-‚FñÛA™ �BW`¡²¶sˆ5Êí^Îú±-\œÓG…­Iãuµ¼~c^°í›þü�ªÛ éhûùÆõÅ�«í áyð/—ïxÂ&_Ê®‹½ îÃd¶uöñ„#µ€ '+”ñjlçI|�oÙØj¶j’†t)`ÊÚ8kç�¶WÙ�Þ0oq§W— „�\8ý[„k*µk }×[Û @¼²¦ä‡ÛYNóÞdÔ¶G7‚æ½ì^Ð…ÖÍ÷p^=¶l„�0‡½ˆ_x@=µ¡·r  �+CŠ)Í ¨ °7pä[(Y�Öm{ð:ë:Ð�k,«ÑX…Ç›`©‹ÓfMÁëq0ÑNÄá®èÓÞã€Ã‡,çYék|Ÿ“>2¹ˆÜ�ê¶àxu´x°ûËÕµŒóøcø³ÈÖfoö\À½€éƳñäʲ©¶>›-ZH#ø@y=ƒ�c Ði#U¨äur»C-ƒ’]¯Ä”¼8_ºRµ2¼%¹øò¤\f�¥3)÷V·×õõ߇ýFpœZû]šÃ `@:y�ËPvÝ7མþR«ösâòE¦`³e vö7³î5×àkË»Š¼±Í‚çÎ'JDI&šØ Q>U†ŽöN{ž=d:¾>ꯠ¤=à"|Ÿ8»íjêL Á ÒäïÚa0ö�,®ã{H¥ò:§ß3ç™}±Ó«šG‘ûÍ|çHîúD ZíN‡¿ttá°M^ègŽÒPÁ-�òââýð}‹2ýèìÓ[WE.hüÌ ­ùÈokYi¬ñ&Zš¼ð.?xã[„–=;ÑÌ» Ú‘¤3²¾9›üž' ëô8ê…½ü“c VCsOƒ›�â†È/p𾺅¤FyߨÉ\7#¢¶Ìï#sã¸>x²¦–ÞàäU„(…þÁ3~K<'Ù¯qÑO1>ñU4Ï^ t}øµ}j»w f¸§ÂdWO©ô(æuö|Ìêtc‹Ö sÑgú÷ªq%ë]a^È8\gdP««xSÐl›‡nuc�)�9ƒÓëëV@_:k=�ûÓÑvßcdá½o) ås9¾a>p0‰øY dSsÆÂ íÂÈŸæöîfF:C·S×M�Ÿî¡Þ[‰¤‰¹ë\Ö}^åšÆkjºkÖ`�0FXèû<ÓR�9VÚÚét¼�Âw¾,}Ã0ä B—>„Ųyð6yý÷=†‚Å&X;ãÈò§ÙŘt¤F+)êßÙ'×ÔVÄAHH²ÚÐÖÕîû+»Ø(wR´_f 6N}`µ>àê°k˜Â„·ì:[ÞÜpu{óa>˜râTüNÝ„‘åð/B›îõsää0ƒô*}üWöWHdÐXNüDzËG1£Ï9”µL·Ï¦`gÁõ9\޼žæT;¤à �Ào…º©SŠ\Ÿör8´ó-�ÔÂfïŒ7D°M~¥i®R¼ûï�ƒ³Ëärt“Ÿb“N ¿bæç— Çá�¹õaïÈXa³¼ó›Žkëf]ø´ß�³ñP\#3â>XÀ|D"÷ÅØ‚ˆPþØxõ·øÏNÿjGÔBZj$q±%ýã"¶û…[ÝOw04E^£\u÷´í«÷lçÚ]O)ÌÈ‚?¯—y?æ‹WmVknŽ*ÿÕýœ†Çv„ÕÕg ØšäJT Y ÛFï»Q·hYç†xO¤Œ²ÝÔÄÐG~ìÌlúü[^õÐ!t„îÛÀ'Íö¹@]?tÓ¿­ÞE9†9±ùœ Bu ›]­¬ÚPqÅlÒìÕ—zÅh�›6 Ê~[ìBãûc°#.{8L=´˜Ýͽ9@i@0èÀ„qùéèî´ök¡tjö{-й×û¯Øh9¬”w©ƒ^úIf_�>½¢OÃ!îEV›sŒ—–š“ I}{?CmÚDà²wÔI‘º¦,ÙtºÏ–…ÖÛI×*ß|(‹9Á£%Q´Žtd>Æ®ÏkŒ®Šfå´Mh§éññOk}ÀK%�€u¶´Bî‚%}v; †ºÿ mýžÀ d�ÖDŽb“îïÍB£lxkòŽ�úK�Ã9Ùö jÄÔt,v—´ rž/—qåË Ô¡âÎ=lž±Ç;/�°ÍŒ9êÁq'þy‹T‡M82nl:ËrON«r L 8Ð}ƒÜýÜ5¶ÿÑh¾UR¦¤%¢îñ‰’ Rg> £_~ƒÌÆ�Ί8ï›ï÷ß+Ì Ïþ  @/|ý›á‚ÈøkS›˜ ò’¸Ûø¤/NÔãx�ÛvZÍÓfô6�´²Ö˜%Q@_¹fÆ]±£pÒ ÊEJ2 ŒEùXsoµÆ>-[VjïªÅœ\ô¾»ä‚uXì>õžÇÝÁ0Åá<^Þ¡¬xMµñ1 ÊÍ[`6޽fiµ“¸H¬�Ï” J `€¦Úl¯-\kyØù¾ûÙ`’µü¦úødÛèÑýŽ—1_$ÙãBšþùý«êh§ì#ê|šã­´ pùÕˆ n|Ñ[¸ جô%ƒb1~Ò$­?Ž^õøÌªûÅÚ{g’Ãl1yÃédå´[¡‡ã:$Þ®\¶`7©=ý݈d˜�~ÏRÇ�O­$$nÖû‘eµƒüÒa¬Ü ë»G}^ÏÍ'Œ}³<‘.õ5öƒ‹‘(àÈ1k y—|±ˆçòs~n¬ñ~ßÜßí¤Þ8“øz^›>ÐoŸ#hmu€·»ÐxıJ:þV-Né›Î¯h˜ Fלò·Ûp."´}!Ôüî¿È0Öæº Ÿ¾àM¬âöNê×Rú>úÙ$)FHS¹Â*‡­r²ìa}Ãô5;ƒÖ/Œ¸YAé( Ô ÝC“|#¦)�ÚÏj|=N3Ȥ»åÉb³-òFzñèBîÅ8ÎdïÉïƒzöÊ+”û:omˆ¾ÿÏï¶_–Z[MöH;êÌ `!®`ø9’ É-±~1p‡â!ã|5{©™‡onØ4 ïF…]üXúâ9—�Ï`vw¥ud!ø–�ù‹8`¬KY‘èKäñP3iþÔcû-ö{HK�´ ‚•œAtBÓ…Ù¢ÆIpŸ´åùîg�^ ûæAº-ÝfŒP²hÍcˆñ�pØ xgñ¾Þ­°õº•ê}K-ʾ�Ê®_ øÇWåá§ÎÏ:¾kë°'FQj�\ç™Æ¨«®å_VÄ%Ü×FÁºÞ_¾T%³N@‹e/¹üa9 7ä xžõžŠ„¶7or>ŒB_ÙÓ¶ph£÷\ô< Žt°Œ;¾ÝÖoZˆ¾á{­z¢@£{[¶ãß\xz�+aü~Žógã)‡ Ôÿ:P g.\ºHýø/¾ts{ñšò•#žµr�úÏÆyê—´ài>=&·Ý …YÞÈÖr’ rÞOÅÆ°o°rÙÃ,öÐô ³{ òÍl¦œ>ҥƢèÈîM‰k‹q¸ÛÇÛ§±Ùôxøl Ÿ ƒ¹¶‘¹w—²¶Ô…”ôÞÄW½•y-‡t å¨>ÖyÆ #÷Ñ Æà�ì‘ÈnK*Q¼˜J'CYÅÚø²‘íÂ>‰¬Ð"Fá÷À(ç˜^IœÖµ.è'^Ëïã5XƒÄ¸^sˆ6�ø,hÔ–0ß¾E÷å{]†|¦©§áìûî,gú@�†"Ôæ£—Ó'vÂ^ë�Õñí†ÏGõQ1ò A^¤žH³OÉÖŠ¹‡ÈßX ¸«u£ò‚ó?6êõ Žjçù@¤-Ñ¿ÅxP°êÃo�Aªü¨Â+;€îBÆéë® ÎK ¸çfYN8•:-"]AªÀ53kIÄ)ŽáúÆ©½�Ââ× ½Ä™ñ~U`迈­slnÿ[ì�8ÆîXà~íN f¢Õ½¦V€$�×I:¹ �pCKŸNB¾Ø=T7ì÷ZÀb-ŸU¢�Ë‹¢p›mO-‘ÖÁéÞã Üz¹Œ­·ºFëÝîýÄþóËP>½Ý$w3Kn„q2›œ.yëus]$å±°ÎßPrýOÀ´aêÓz} [Yœ¦Â+I® ïÄ|m@íTŒ´�ÕÏXX³^ß?=®Í‘Ã�GÝÛìt« '´êÀ+{Ž —zá[ÇmsÉÖÎÉæO æÍ\UFa¢¬órq¹¾ÜL}°ìo&?_C%§á½% äþ¤à8%æþº#el”ƒ�1´ì´s³H&ûS~ogsÆo¯Ê¢Ü�H|±[8ú÷/¼/²„ïùëjˆ"Mmù GÖèáƒ�‘b[Õ)j­y·{°¶³’ܼ} ujŠûÀB˜S”í͆î^I½ÓÕŠ«X*ãûË·¹ž{{a™˜ß±{dŠß¨ ¢=hÎimª7ÕÅ8påû¯"Rm›C¶ÝÒ¥¼.y­†/;¿É‘3¼Ž´½cü‚¸0=»¼tÆ1|˜ˆ4bI¼„¡»eˆµ…«‡˜¸åÔHûË!lÈ3c ûÅN/Áº!ÖŒ³µkèaÀç9 �(§ÅexTÀl6žä‚ÚÄÕ!pÛ‰¢2Hpaò�9Kôæ’Á=ðüvÆì@1.¯X{R��a [ÿµK¼™kø’‰5ÝÆƒ¤ÇѼŠâ�¸ý¤ò™²�m']Ô¦©²c×^ð§=±@"É)Z»a ޽ˆ.×<¨K¼öm¶þ€?E|1÷ÈÀ6MwxЧˆ¬Æº-ø¹µT<Dp¯ˆa‡ð7Ú÷úB#Á…ÖºìðÞ_ë[?‰€¯gצø�÷»ÏCo6Ì Š\Ôk|î‹î8“”Öy€ ¹¿ÝmØ*Š{0ϰŒÞsÄG}a{@qš‹5°Éèwh¹ÈÊë{ÙJÛêæŽŽ±¿qr~¡wú9­cÙ!¹þ‘u`/7îÛù2ùëÙ¾©Ép“]¼Ùü2êZáýëuÑÞÀ�Ì¿1µÆÑ°¼¨Íb¾)Î ­E¬í¸t² +ÇfŠo&oï•ñÅzÁ hrGõf¶Ùal ÷~ã/‹ý‡fQ*{ þ„³—ûÆûÇâÏŠAÉó´Ä•BæpêõÄF;'(èVø1J¬½ âbÇÊç(´ tP£óRk6àÞѦÙצ¬ÖΜ œ2Heí^6óÞUôLС@Ï Q GŠqÌ"@°°²šÅQçrñ3·‘]§¿k˜ØU¦œõjÖ«;³É$þ�ìrRJI0×Á�5‡ž�J–`[¦S{Gƒ2äš-…_— é€^SJé8C°ín3žHЇSX.â­\møüOYÚÝJûÈ‚@wö“ïa?ɉò«ÞJ8Yúà^Ó¨\“cx·×Ôoî†e#YÑÒì~»j+7—¾¼1Ë}ë+Ú®¾ÐÑ’_𢇢jJ½[0+ƒ¼ÁC6J‹´@*wFû®»¤¿µû[¨ç8™£•EÍ胎ÿiVï{¦38å>{�ºÙ)ˆ÷Ö{½¡=­3Å¢îWäxSrk‚˜¦3øÁ£-I[í±†{¶`3\Âi/{6�ߊ> ÁèE,â»1&$[Rm�{Þ‘":3läl‡´¾dæ­Â=Žù²Š»†ÏY½ÒDZ‡(Ôü™žj¾¿¯:PÓa�J¹†ënÈÿ« �Én8 àmo_PZù½èjBÂ;¤wÞ÷NæÒQ7RcHDT˜�Ì7&áæT“F·ÁÞs¹kÛØq{ì˜Z´ùÅ�þ|z#(¸Õ„ T À»thuYÛ ß«áhåh0ÊÞ.m¢t2Å�có:KW‘YßZÕâ¨æ—Ìγiu)…?0è–¿ÕÀ#�ÈÕ3:^¹S¢ÏäïD­�%ž@îX1×·¦"ɯ•¬Ú1ÖuCS¹ûSl}wî˜åúQæø¸ÕâËOSè�”^…æwºè#ßY<ØŒaÁWcE]ÊÃà”`rÕ‹ú³åb†ˆëWËsµ ½&¯wmŸ[Ï#T�dÈ�‡\ôöcñØ…�îdˆC¯³B’V‹@™´ ºÈâÏ8dý=(s½N6óÔï|nÍþ†?2=µ'ÇÏ—H(w¶ec«ú©0~vB˜Aø{î¾ö˜ñc~«Ç|e‘ÛÃgÚ‘åçjVÄ6H}°�==Æ’ýÑò»lG C|ÍÞÐ�åk(c…<èïQ¥{‚-L»À Mu7îÖƒ4ܤ‚/L ›}:Üó–J¿¤ž›�v‹.®îܽЗ”6a½‘Ÿž¢$-°Ÿx1€¢«Z˜É†èùGÐHƒ[�b\*ÛxWÌ<�–)q¬uáÏP~è‚·jóÖ­g¿(bì ø3Ǭq’¤�xOxÃmfÖ‰à5�¾IøGá¾ÅľáÓzBù£ �˜ýAÆwr‰5ã¾?RÓ¾Ú�/ºßBWŸÛKd s’Ž‚[9‚5·ú´µ›ý·¸…Ü(mÖ5°QF@„7x¼ƒùÞ¶›g,ªZÖÑ5«p &‚ô[œ’rÁ´èFw™ƒ�ÙÄcA­Ö6"µ™ª±�ÈL9óOQZ³}»=®»ën—œÉùö–‚²ˆt0¿#ÌX[˜gÇ'Ìóö×Y`÷Ã"ÿ�âž_ñó“Ù¡#kÎÒw·Žø¶AÄ…#¯+,ó­7IŒ÷±±L‰ÅFÒù¤ûhù,–†“¾Zè[¹¦xWKÈfý€•CÅ?}Ct4Ìê[ÏN"¯b‚¿.KMÝçÏí‘Õ°¤3>”šqn_1q|{¡G IG}Ïñ‰Ór�…Ów³Åó8æŽ×Ä£Àà˜3U‚VAà "Ãk!‹v¸aÙ@�g«²½£ÌëKÉ¿o˯�+m5¹u„b×9}©îó×T¶M-²Ws-˸1~AðÂUK÷®»å쫺îIpYq¬àGźÓáïf‡¦PEéMc%ƒ ‚g.뎪öF%¹–Ë|ö²82Ÿ‡žèÓ[¯kÝévŠQ:B©ñÕzù{ظ¤â°¬ÍëœMaœ˜€lsÞUEx|öµôçz4œBü8ì ½÷|Ì*=j– è1s=äoϲ FŸ ìrÚbѧ·Ž;äqÔ‘Aϱò%<,7àÍäí�üç÷32ÒY?�`œx ˜l[ðš@‰ÁáA�¨Ë¬æ:ç\Áì‚øZéÚÏRb‚8òvÝÏÌ·ï:t2U£el™½ì]Ã>žLq (Ãä0�ƒaÝ?Pµ¬t²¥G~¼ÀÔÄÀH Ïùî›]E¾Ù=ôyõ¢Öæ@Ë`Ü­^¦Ì6 `$’PnH´#¯…™˜ 8Xb¦³àjn�¹žfÕúÑ jÁû]øU<¢d¢1ÓÛðRˆÿ—�ë(÷ö•]Jgzõ¹ßdØuu`2~&-"²ïgl!XÅ>¦U¡L˘¥+§Ú¾î`d%MÛQŠì¥ÿ—M�•¯¾ÞÁ›ó’ð4/¥x¾Ù£=øB›“’òùn_Ž1wú—{�¥¹ƒØÂÄþ—‚K‰éﵫ‡Ì`ÿlþ¶›”ƒïr—T0*žïØeà{o#°-ÝjÁöÐÛœ-M’ÈmÑúPÝ"¦ÓÒ‡�QxZl¶­ÇxÖ0ÏCƒK³3Â~aŽÎÛdž6AŒ*ad�CÉÖ]· ùQr%÷ëzúܼk«<"•‘Ç,ÚBKÀmõën�ŠØÆ¶?½~d¨¨Ð87°'8˜rÚoÑî©Ç«a¿e“ÝÏ�Žë†Öº/–%Ô<´ö»ŸÔ[ÈšSb÷Ä®-·HxéY=¹¢ ÚËbüáƒßM»â(¦ä?~ «/f0=uÎ;/ö„&É\a’pø¼>MVÖçö�W‰+¹T÷£7°{·àš�]AN"g ¯L âà .D=3æ¶ŒfÁÆR‚èâx�~AÑE=÷»Çµ@øB¶{„ ɶ–üÅð}âƒnŽSO b^ òñEwL/çƒÕøÛBeB@þööÓ–“xêEªË£ q|›óŒ®„¼0¤¡Í‡5 -†qòÅ0Çé/Ap­{Ù¸.ãàŠïDúî¹ JgRï†  ʦÁíî*=¶Ä\˜rýÃÞ ½7øAµ:#—ÁÝøc3Þí�W:©ØJk¹ÎTDó€�æÄšú}|}{sP†]ƒu`ì¡È•}"0Ó>A[á7]ÇâOŒõ™Å�U7yŨN¬ŠrÚv·mȤµ.lÜÕŽJGá,ªuC3õŒjí›(í4¹ÎÍÎÉ4üÆDW�;~ÞrW2ËëöÕoº†)…P¼ýÑ%ƒ³èè^�wdå—óv<¥Â��§¸Ù;áâs;ð g³y�»§fÛAÝ¢+¶­6/X·ÀW¢™Ü¼ On]md‡&:†¹\>ÄãÑiTÞLDÊçpƲ~MYÖ˜\ð^¬#l¬Ó•¼�%«S�EùY//i×Ï ¹tüê>¶ O™iqEÔ_VÕ‰¾ îw=ßË@Q#s=§ãšÛm ŽÙ`t)ë3Á/MÙ@ÎK·Õ_§f2Ô‘XJú¨¸¨R3í•îé�=#kΤSê-ÊΈ Ôúä†ôÛ2’ ÒDÌ;5¡]½ï¤RXÞ¼ ]Ûn¡‹¢ð[évÚoÜ#áÚ9Óm×¼n n÷Ö _Dq)Ž'S""߳ů÷»¬´ñ–¹ÁSï7—»„áWƒ­'Ï“k/ÁŸ)g‘c²#ï(Ð[|¼å›œCo:NÓ˜7Ü¥SŒ¡ÓÆ7]Æh--{Š’Ø´ø¶ „6%ÞÞÁ]‘ݲ1!FÅk·ÇaÌ;yêÁñ.pµœç½7j¨qk�ÑbÜ0�ï�Ê KtVW{D°ãòWT;n%±€ÄÞzØ=¼GÒ®õ�^µm�n Aªˆù�"hÚÊ#(#e³aI%=Ã4º`£ÿËæ~}.à7•ð/µø#vN{˜ÔØ œùöÑGíÜ|ç$Ü!(ǰæXCf íœx‚�ýkÃÖ9Š6ïB·Ç´Ö²&p>moÁ‰ ¢ä49ÜlÁqµÐ0%\ßr`úuKÚ÷RúîÂÓ¡1ó©ñrÚÏ]�pÛ®`µAŽàMçЊ.9K‰¬\¨a|Õ‘–×�vÄ€|«YÆwz§‰ܵ¼.sŒ\hÛ5?s» ¦Ò_„7ó„+¡=µ®QL{VýÝh ùëxÏ]Ûr–Ð(<¦¾ôŒíñÛOe8âMü³#çquká4{^l�òùº_£ší¯}gò¯eø;IJáñ2U#Ük0ø«ÚõÅmÀÐáñÎe  üùÎ_nØýøî¢ÕØ ¹ì®Wk Ñj�w®ÊEgk®l/gª jÔ»°îƒYkñ9§Óéïlðˆ$½r¶ìq¿oË…{ùUKù}ºggŒ„ÓÈ.’¶0{§FÈîdºâÓH ë}Å{?ƒìní‰�óÌNŠÅÏÖú;ôMÜ‚Ý]•߆©o¥¢à»GM N‚|LñÆÂMOÌ'—Šüû½�)_h­8kW¼³œýÛ�†£|˜ÛÀ]”¦Ùß,ʼìÜÜì’Œ3*ˆ�7šŽþÖ­j>—À²>·mK²æ}j>/ìñ ƒ ±zað:Ó¾ÈU¬!m†�:7NÚСj²]‚�€šˆ¾á>a@päòÿ—ªÑà.XÂÞDyfía{ÙùÛåÃæÛçµq£ýº‰KìK¾PQämÄg"”Ø–×Óc8ÞJ¶Œ¯k'jäíæÛÈ]1· ¥õôçÝØ½ÆG¡>à—¸KÐ:ùC²z ’ É@EhÝ;Í{íGé84½dÙ)v%Î^3èêÐî§‹ï ÍÏ“dók¯&›½Â æ‡[Ð î ×^(ûRg<®ÅC"7%Út„Ú„`|œþYŒ‘záŸ$aƒV§éFãñöfß^8ñÎÐ+³[âbç´ÛËãž_0�·Y¸1i±`rɃ°5\,!"±‹É¥SJÞ‚Q#*¦B—Ñ‹à7¥•¹uër˜Å$z¸3Á£¼­C8ÜÉ›)‡ƒˆÐ¶¬F.Ó9ïySØ�EÕp7\irzè†ÁŒ‰ÁOµÜ`™ñÛ&4À°k†ÄظS=±`’‚b`ÆjÙM9¦½��Å»Qut×Th$Z Y²4—•ÒAÃ7.¾Ã›ýu˜Â²8Œ…yÁ­Hn¤Ã›Ê2`DŠÛÁ­û¹5¬ …äú�Œ�’®–­Òpç¥Á‘iújùÍ¥v“Â"`Ôfx¤Kìjãù2™§cŸƒ2äÝÆêêÚ¹N Ä¢lë¯Ï¿o¤áñ×ÎnnáÝÖí„WîÅÜÀ¸$áUäF@êïb`¾q›~¤ÿky‡M~½}©Ýw'�ܹle±�œÅ·7ö·èÈ ü€a�äðGË3xPÐà¹|xJ¬0ÆŒn›qÑúkLµ·ßØÙ]ôç)p¤e («�×`ù½rLjݸdÛÚcífc”³à¯Ýè>™5�¶•¨êk�Ý’ãóË£Øô#½Û.aBwîèÂÞµ®O­,Ô«gåœJÛî㠌ɆŒPÎ`˜·†wŒh˜E¼¸øs¨ÓŠÏQO“)·µJec9rü%… cµ(8tæO„–ý©†¤jñÀ„jéÞ¦ÛÇþ�,6ěÐfrä¸ãÝ=€Þò©mtÇ$XÊ¥œf¢“о 2Ã:jNupL†SÀŸ°­ÚÅ‹47øKa®=5‚F)ÐîüŠžnvt‹}vÐ/>¾®>¤‚0`î£-‡2%Žfô]Aæv5€@Aq¹È` 'jqvȔííd‘Ó$tãµòì8|o�`—~£}$·†ŸeØ>9ŒëâP7E@C ØÈ‹%÷›£,.S.£9o‡E B”ÔPÄÖ»Ô`oÙ[L8ƒöŠ€î`À+òL�ÕžB<”_”iZm_&-|—À-žŽ÷¤/„\â°§µ²Ù‡ñ}5×tçC ¸sÕÏZqÁ3Ž´Cf/Ø�“4ø7Ú[Ø÷ï0&oöGïgWuÁ 5îx΃”¤|w‹oÝç~4À‡‡ÇÃ=Ö>^Ƴwƃ·çž¹‰;™ƒ(6ÃM'Åï�,·ç·ëÌÍ6A^a};òü¶=‰n{»”~ìxüv Æn¥³T-©Ñx]àùój7ŒxÀï$ò„&›ÏÜ %·«MØv[ʺ( fÖE7¨>Ï- n€sŒÖ6–ÀgèÉ×òaE7ù1mT(y@D˜9ß+‰?°‡ö­^ªƒèýËùqHÝõ 1¡=ÚÞ¢+ϼvÁîŽÔÌ:q#=x N†¸o°É¢¡Þy{-]ï~g1x= ´? ¬\8kðŽ(”³¶ñ¯¾ùÂâ c~°*Z{pö­}i‡àøíÆmuR_Ì"cÇøÙ­üBE†‡¡àcÀŽj¶/‘Œ§Bõ7æp�»¸YIIum]øwé70/5ªÜ-:3#Ü 9­»"sÝGž)3XW8L uÈ/[[6ò&ÏúˆR­P¶ åᎢò«$Âu‹wÙ`]ýZxs{›B¶1‰PÝªŠ˜Ã‚ÆnÆ0ê;›"Žm´f¦Â"ÚQYÚê.3›GG¼ªµAñr›æ¿HAnKš¦ý0»±f 6\ü!ÃLŒF­t»±oe©ÀÉU3dÌ�M DºøªÇ’"�²1™º˜øª¼ù-0FB#©qûg{GŽwÁßS'L!83ÐCÁú.±?Rì^Ú˜>©Ü'Õ‰vóðßÞéUÂníÓüxMòOÓ ‡Hn‡ÖM–øýý’ÝËMÙ‘ðé1ÄB´m^–ø+6Ó÷w+øB \BzÅ|úhh˜»ÜáýžsdKѰߩ™¸z?çÔ÷“Ju•lÚAûÁ’§4ÄÝMn€â? â·È?_Z�˜úÕ'Çó¿†u†èZ?[»/›Åü©dOëÙ Ê}.Jcß9]�F“3„ ³cAy-$N3s¾§¿)GweË>r½û ©fÀ!b®ò˜ŸV[H)4„l ê h“,¶y€8øáVJל]Ày˨IÛnÜ}³ð.Ò�‰ éÙljÜ7¾QR&‘A°)×ÛÙÁ5¶H��`nXƒ{ª½DIÞF=+é éOC�ïI€Á){×g[õÂÕÆäÀÅÑv}½ãKM�Vñ§Ss½Ö%¿‰ÚçžÏã¾ïÇ�š¡_ÉKŽøû)¿ì‹zºï³DŸR€L}zÏ—Pi2âq&þãû{y »¶óó&¡þ�û=oq,,*ôñ-3>i¢¬S®òV™Ýäñ_ˆ�)És ÐÝp²x\þjÕ¤¼°†þ¶öΦTd·¨°äoX¾•Ñ £�óÌbàc»–D�îÌ´es%�7ÎÁghW»]Ø‹ìYQe,šý¿Ô74ÎHß})Xá±àówèÝ]Œ{ô;º¢6À˜é­¦õû›Ácq›tò]œœcšî>” ‡QŸ_ c“®‹²J©l<¨Àc\;ǵ!«¦IúÖûæG)S.ûíe®ÿTMp3¡7Gkî×`>3Ö,#–ÏIëüâ Ì›ÇPïZÒÍs� ,axß%Ò†Á ac�†­ÙÖ{ëP¼wµ·ØÇ“g!ð[®Àkб-Wµ¬EµÆ�”ù ¾­|ý¼ :0ç�cn÷káK° Íx Ü18FecÀ»>}tà�§ºp·«eWŒC‚›¡&4CšÃîŸ$D[MéÌúu¿¦`ÛËóêIÏzÚ�˜¬ï›bࣈ½>`�~ºCK_'Ðøþ«�|Òw%™³ˆÐ:i<ÜÝŽÿ/9*9#ë®Òàùv[àµt?XÓ\¤Þ0¸ˆÂ’^sºòELæäL-T0`(@ÀÙ +kTO~jãh�¾†‡Vå˜Ðux ƒyKÖ}í# ÝÍ�¯œà:Û5ö¶+„öX€>põ«œýмj>E ¹²|G)âd[Ñü%¦Â&ÊÕŠ¨¾h%ȶížüÖ�)‹ý±†”¯ Ìíp^èÏ+} ]>¬À-àëO�ÁM‡êKp^r p²‹µè.‡ßa+;Bµ›ìõ³ëMñtÕÂ::™\û´•lËì§�çß×cW¿ÍÁÂ%ˆý ¸Ûv(Bµ~iûô8u$÷>ÆL¬êOÎg;ã5C!`§ö€£6ã…wBÛÑkîOàuèUEPìM�£9¬f”­qÁÇMZ”ùG‹#�}i½§.w÷ÏU€ÞËí\…í5KËàíƒhœª€�xLÆ @-tì,+ê �Û<""ÚØŒÑ …�ÆCÝOò[�Ú²„0˜¶£.ܶ‘t¤¹A9ñcÀ²!wTÄ�`÷zE[‚VJ¨\ ñ;�Y"•¬×!h€-FØm WU±û´¹±Ý(+f„} … Ñp¯ç§)ºM¿qƒ, iجgG˜©£Å´l_¿NOêÉéS÷­×LiÄ6ù|Sá‹“#2¡rÓ6ñR”Ïhm\ò!gˆÅ`ŒË€TD,³²ÒwMz)�h'®VO»ÓK|ÓAA}“¶œè¾¶YTÙIvØ_¢Æç?2ê«"–À�X0?f•ü;[â· ëÛè%Å0ëG?Çañ*'ï�ÅE¿¶Ã�«Žó=´ÌŽ»Ô¯iFÕbm®<Š$/d}R•? øa—ß –}_óñJûXül@Òq£ÙÿcÚûaðX7-y.pÉ9Ô–ì ¤,ļߣðŽl×s:ƒ¦Û7 ¬¿É«À¶‡0XÐíþ Ϩ{{¶Çî²#oìgæúñgù®}ù®j7À¬’ë¯4Ö{íÓG"_Sh€±×›*ó‹afrœYuɘ[«õwÄ:ÈI…6‘nÀ5q4&‹½‰ð&bç„Ó¸b³ù¨7¬Þ£]SâqB°;ãô{7Åú8’6Œò¡Vf75XFéÁß©È\OÛÒZí§¯(#úÿ·1 o.»tÞ] Ùɬ<¡è·†þ¶sÚ½9�N[QkûÆ�˜GЛSyƒ’4Z˜<¬›‚鉾ON%<-§€—Qk[»¹åÌ.�Òè2Ö%H‹*ؔ͢A@.Fzä�RlÄ95‹Ê'e2vÉ—1Ÿ¼ùS Iq¹ˆ±Öø}â~ðÓA›²P×’öcD— eò=_¸¾ØZw¨,ïtÜ…Ü,#œY˜glª‹Ø×d4z,ü¸ùfW¿2¿îî b3Ì�\LAâÛ€ nÊsf·> -Îø¡®ê¨yàì/zI›�”‰ÅKu^³FT‹¢@Ön ßÍUYã2@€:a 1RYímá8þ[K-jvXÙÎÉÛlâ½nuW$<u€\U¥#!™º ›@¶Õô=§éŽ`ìîN ¹C½³aM}qµü¸Üf y7¸/›êiZ– ( €�íZÑð’¢ (ߊö/|gxNÂÍ‚ow:¶+ÏëÎ ¶ãSôcûa½¡ÅªíÕë‚g8é—>f×qÁ¯ºìÀ$Q„–}¾X«­½ü»Ìèòª·DDéoÂN‹•ëêk'$5ÀréñšAã%Hn;úÔøD›GŠ[—ÇZM Œ¤wÍ­gU…S:ã[ÅWisM# Ð#�ò'*Îõ„ Z9k~Tݸx0Ï.@I<½Ÿ2fA¶+ŽEiiP¾>ûEà7 S->É˵ŒZÖ ½Ÿ©ôËäª:Å ûøÛ®p£Êtwˆ‰~ð° :µùàELE„§›ú÷8Ü; òÃk'5‚ÏÈöã9˜ÞàZíÚœæÑrÍ–´Wˆ-²|�¦ê°‚–M–tW»'�I`Ûú¯\×k=+â�qúÚŽXH:Ä 7 áYh�2Ö’úÒ5PŸ XVx}síÇ,OŽÇƒqÀ6—`þȸ“¡À×ÎwÇ[oÝáÈóF»èîOT|}•;×îHlÃk$ßׯ5¤úϽ#‘[rসwGÀ'åA$5�+4ÕÂ5Ü&ôët|Ü#NöìhÉûJustÃRÏ¢tZ5–ý¹ê"XT :øç»­ ~ì³Þ‹‚JÜ�jÙÆL2)4Û+pÝpd—¹±U,q£Iꂸ 3òúì諉üÛ³:÷UÚ²Q‡7y´ê�h…®9g›œ IMÕ9e»lØqvï}óý‘ë¶°á)ks]�êݲ:» G4šøCú¹üE¯}MS�‰ qÚŠÙÁÐÜ4o¨ g}ß»zºÕP²§À‹Y¦Æ{Mf’îÐØÑØ›ìû[ONL³gÓÇùÍÃî ŒQÎBaqÒruú†<ö{ÌÇø³,{χúÀM´ÄwLäÆCµÞ¶ û’5.dçV§ÆÇA‹�¹¥kQe†ÕŽä�?]¥gs�oWã�°)»ƒg¸‹@ݰ–íí‡V�?¢ Å–þªér¬Ex òvŒnØIª.ÀxZãåò¸ 'ŒFÅŸÔoÍÌjBÕÜÃ?ÙÆ=Ä[+ÚBΘøÝcŸ\6/Q°¶Ÿ¦µ­_z½Aò- ¼. ¾‘«­7À¨s~mÌrÕ°åX�¡î|½ Àg«9À[ìMŒô2פ³*iU µ‡·ßZ*\òå½²öàÃEm¹å]ÔqÃ�Þj¹ÓQÌ,ÉÒí¯X÷ :>CH�ÒY€{mEªS¥L¯FÄÝÀ÷�™ÚýîB•Rc`FÜ cØþ:ö• ÀÛ\ mMòéF{(u©è1Œ¡ˆûdÊ¡”ÖE™mG¶‡š�Î!Ñî¥vVaUÑi"Pgª�»›r²ây8MókÞò‡ÛޱkiöŠœ-ŒFôõÓÙ¼á‘j}ÂKƒ£áš³s¶Èm,‹ÃÃ^oíô’D-2÷ûékøfÞÁãºëý«Â¹�…\ïÄ8g^|e:¯×Ñ ¼;Ò!D_¥êè\¼†AôˆæèˆWy7Ø\P5OÖ´\E8ÄPÅÅý�ñãè&ø]¤ß|`1‘°ù’J^0X¢!ÑPuøï­ÚíЧ‚RUMÔËÂö_1B/ó Ùpõó|™áãìAÏæ84úlÖPšoŽûfÛ²`ÖYD´uŒ Á\éK».Ûé\%®RR;ôÍb-zX˜æçŠidrgЉ:Y%­@¹n¬ã½ƒã^c™é¦¹v!EºðgÙÔ0`±«a°Ã7×'˜Ø‡ª«Ž–¤™árŠìñ¨Û±Ù[½]õÚaeÈ@_‘ħŽ7w|“ŸâÕµzPZöÓL.”Ô.™;ÙÝcÍ�µœ¶_Ž·\áÓj»Õ�1Z=¬±xæÀvå é2øƒ3Ý›EiÉ8!™à^rûUoDPµ®ñí׌‹   *:ao1zAz)uëùàDˆŸá  Ž 7ÕÈŠpΨF¯©&E»Ëßņ‰ ¨Ë³Èð�\2ÂV¾»´˜Ìãã•N�ƒÊuÆõ=â‡O’,?µle÷èdªÜ‘>é6õ”Ñ‚ÿƒYsòt&µXÆà"Þì0Â7W[9…û©±.g ná„®íüHô\Nͬì…ϽçÕùín Uò °ð�&y¸ *c¯swÐ ŠdÈKœËísÈÔOyDwp‡èŽzvµ¤˜½ûÌ…[Ç*üùšÖóÖK¤q€Ã1! ò,<…MíïüŸ¢ÀýæàªË/°Þ·•O¥‰JÓáðÆ __ x–Û.¶<êß×8#¨€%½šïÿXD ù^+ä�Áv¤«�È–óçE—o ÔŽÉ}œÛ7M?<ð h º–‡# ÌûUÅbÇìÓré±}ùø?~Íßvå»—BnLlå-¸^öKÆùKÓÌP9‰ïx~ÈéZàno1ð”õ>Ÿ1Lꯧ“”5/‡$~ JÌí>‹ã'�ý³5†å£RüðYJc;‹ëëïÍ0NËà,è(ì \`w[˜éæ#ó¨YñwÚ€%"Ÿ6¡ÞÑ$«±ôváŽn²fÛá7Ýì¡îa ~¥ÿ\§‹ã•Úkró÷œÛ�~Tk7韎�ƒ36ï¸'ŽOj—‡n ³ÑÖœÛëí?~Ú}Íý®2ÿ–ÚîgÍ÷0„ ÀFÂFà’q¦å|]¡û¯Å¦¨#O±$k‹ûì"à+¯ÄûuÌ\fÁïÔR‘‡zÓ¿ /z÷ŠI>‹ÿHßXÁËŽMäQèo¶¿¹7ÔØŸ6 “ij¶»Ì&wôV˜¹¿x fJ¡^ê)RÛO1ÇI[s9‰ŽD>®woÈ�žhö�Ûák—ŽË:ãsLåWþê`dð£r©Br'Á¿½Ð?9ëãn&sÖ¤‰øI”ˆ—,5 o·5‰,[ä\óDrŸ-å5òpöcH„¥| Y­¾ çZ¶“Æàu»}NcºN:�eÊ;ÇS ;†5À�(»Ñ$ŸÃ§ìÉðJY�àÉkÍÐe€É¦»�}“ô=e } þ½’Íj_®SnñÉͬ¬/ºÁ½Ú ææ-ñkƒ|¦Ú$%ßN·zÉÐÄå·¹ )»u9yRæ»»Gí…«¼±ý•¸Î0$Ïm–w¢£u�bº3OŒx };ýß°v¾ÉWX…“VˆãÐr £ñWdÌ„ªLƒÖ’ÛœNmeuJ =‹¼ˆHîèœ_f6Ü)NæÛŒ‡<Ï0™^¼í\I<Ú•MÎ}!Œ�C ÑŠOø å1yë/wÛkn„�w–h~¨Ãkww Ãó‚ÊÉ›wiZòÈÅ“  �•†Ôýœz·€†¾Yý«{ÚDßËÑ�ZƒÍwGâ½ÐŽ)©W‡Æ Ýž‰}ŒjY²RS1%I‘ å¦ÃÛ�´¼MxÀǃ”DQ ¼h‡kpbç/iA¾£¬ÍL"\€DÜÐÜ;'[¡Ø¯àå°ÖnCï¾MŸvê©'~[’Þ†[‘M{ŸH»Ï.Ëá>&2ïè¾ïtu¹¸r=ã)Ž·¼á…Ì‘Gø Í üQ²•B5zßmSÈþùn€×xo½Ü c;¥ÿ/½ q˜Ïœ±Â¦+¾¢õÀ²ô€lbu?œt—Â=«H\ªˆù7Ó³¾K˜ó¶ü('® ”ßY¨>#†Å…ô. ðE4q'¾°y©³¯—½ï3$�BáÁctGenÙz4Î9³ zõ`¶E"› Í`u¨†¹-E Mjéd集®Üèw{.´Ú̦`È'kÚ?%eö`³ioŒ¶ UìE…�Èï !M!Ü¥ê7k±@a5­ª Œ_ÜÅŠÃ.DH<Ȥ“äÙíÉ„­éMg¨úùýÙÑ…²Š4)'F–H.ÉÝxÎô–dÚ`µžç:6jQyú>æW¼°f»Š�³¼-î-r¾CÎ «uŽLXî[“\Û8ðc4C?MqµÎ4i;K#pb¾5×ÚGu:úÁ.Þј½œ°ïjމ̌[ÖÝÁšXF1tì�‹°«–¢Ë·loµµÙ ÷qâåp¨À¤y0¬vhõl4ÁwI”¶²JʉµG?z~iAö ù`Í›÷§ºågŸ7a‹à¶¹“èÆd§Æ[¿œ1^ñË8+÷t•Øžo!­‰‡Oʃ™»ÈZC.™ô[¸ãìGO®Ëµ�Ĺýw°yA£ïE÷Q ËZÚN^¹:œmªa¤-�½†ôÑW¯Á‡•Qn\uýûõZÿoõþ¯çý6«j¯ý¶ÔÛj[[e«mlªÖZ³V–ÚjÚ²ÚÕMj¥«m¬ÖÚÒÛU6ÚÊÕ6Õ´«Zm[U¥ªÙµ´Õ¬„D@�DâøGõ ZEñ¶h/‡ûÓ¹Ÿé±…¸]álQìbámNdÑ@2N‹á1¨‰[„=G¯!µiZ±2.bcéÌr§,3ÛRð¯`G+gž"_W‡½ò6�õ÷ËÝ$íe8ÕdåZZ¾WšAâ ¶Ü´A¨1í“\ð­zŒª#æÊ¹[§”ð±ÙLr²½ïkw\ïˆex§ü‚öš‡zM·!´‚€l`7Ð�ã`¿k\ß,qX ï•U¥Ì‘7jpê•’g‚-³ñ¬G'{D�º^‚É‘´Ò‹È÷ ð"¨ü±Td²QELê ܺ€:aV…âïlܧ‡É¶‘ÔPI(VÀ¹•ÑÍÔ‘ dûéÑÇC©‚Fr¬†ïÃ’3ŽqÂ…qË®àR·) °�KËöå›Âî§kôß–‡òç»Cààøn*1�¾¯¥íGéíP8£Æí—»$Kw~ÎA²z‚NÖá/Å_ÖR|gÏ)y:|zÚ’‹l§ÊŒ™�g¤©Û³‡0„œ#×2{¬æ^ÏÀAôú}}uŒ]gƒµÁ(†C¨Ê— ae:×v¨DrKŸµ‹MÁ[\Èdòª[é­²ûiî_+Åkot|Ÿô|ø§^²YÄ·wnÄ;á©ÔÎC9¬ Ǹ4/cÚÚóBýº4Ý$EÍ>cm­mÔÓúéëÜ5lÑq�9:X)6ŒØœñç[jMö>�miK<×Ýc öÚq¶eA‡U ûÏ‹4lÔ@ -·Ê2éžDɉ¡ÔX�MoæKƒ:Yq,�àæ.¯NßQbß ¾æO.w;aÝo øï9žIßaø3×¥ÏI�úìA©¹ÜuÌNëa‚¿G¸Ž§i5Å[¢ëMí*ù¥OHBî|~Öm f yYrÛ¤¬C·éRS fù¬ú|‚–:{ßkb¨J,Ø3‘ˆ0¾’,*vëGÿj;A/*µûå<>›dàÑ®þÏÊÄRK&·|�ñ´>x>ëXúëx³d‰iuoÖø´ébV[rÄÏX½0“§AÉ·’E"ÓI–VÖ%sRÅcQ×­º³ýºL\rTDì[Þ�/\ÄŠ˜Ø;—pAÞ®mÌè8â‘—iéƒ÷#ܾê³K ð¨(p844ÀóÌÀléÎÉ+¥©8¼¿�_�Ç¥€XÓzDµ²ÕÍ4{ ÝÊÇ!² ­]G­«ææ-iÊz�Öf¢ªçö0› ÎÁé!`óZI\:_ Ä3œ„íèsGԣͩ»Ëu–Âýº?¶ y(3Å`Û-4eò:tß?&¨nSÄ%ö Þ�Û%ŸH2‚ýòìÉ“"Þ9õ÷Ô©”—GõP32}/a½˜é~?�B…é¦O^Žë$˜=eÂòØAg;fŽWØé- fåÌ<-པÓÆÆ»¸ÏJ�÷F#e]‡u™Ñ-bs-“IÞƒÌW`,êòÁ€€_÷ÍJVÛÏJ6`¡ýÍñê‰AÀZáG,ìùåÄ#ðòlˆpGðQýËÞL ²t�ã'Ù®JZRó$QŒæÕ4Ža­qOr)Ÿ$ñ`Ú(û%´5²¼Ú›@}‡U9<�É»7K壧Ä?KJ™¯DO`[ðÐ9˜Ù%7Y,v•&ħއ¸øÚqˆ`¶r<Éžëm½_ˆk���>® z�ÖuŽiQŸïlët½J�èÚÅ<ævöÆbÍçÖ\ZâlžCFq˜²Ï6Ɇ¥:z°síâ¾æ#EԴ܃¹-’Þ»Mw�H,ÂSuâÕ„÷~¶/êîÇ\/©ì×áìe³q î«V:ž¦Ž“¼šøntr ¡¾Mñ»“½rq¤°äæu*ÈYÐý¹?Ç7fYvDð� îA}'*®!G¾fyØýïÎç~ÈMKü^é÷û¾-ñèniY”—3IŠVWâ½42û–PH@h�ƒèØôîM¨_‰#½Káq}Ù=š¯Ùžå2+H4õÁ(ZPîï3a?»Œs·”Q#Ê�Yï7$L¾PRÜ¿_•l‘)ÃÛ”+LŽ„æÙ¬Î%�YP$)„>Ná›Wøµ–|ˆ÷›ùw}{sÎÆÜ¢ÛËÇ—Kìq¿L”‡(éÅåî«y4b«]d.û‹ÆÌ*“é^Tõ¼#±I<5l��ó�J�Y™`ËšP9›‡Ü¥RßO�‰ÉAÄlx^4ªÚ<‡j!mO‡ øÕ½ \|#�×k Já�¨[~ì>Ýã�áÐÉ™[o`ÉsÔ*[ #n 8=�„Z…- %k™5R¨Îˆ9>Æ^Ö€Zq;I8_‹vç¬rÞ퉑2/äådìÞ²6×­d�á{ú°°u�¹×§(?z1 ýNçsÍO ‡_¸!�‹uEÚ„ð‚Ök¦]¬w7÷Jׄ_òÓà+ñ™Otélyª±]«m§`_æ÷²?‹»«Ž]žäáÕø/|ß{îW vCŽrQ6æg ÑŠRð.Y-ºzK…Z¯Í�õ,¶Š‹§PŸ+‚så ´øÀeJ_³ ¦Tþ ز°‚Væ�»Uú[zaÖ >MÂy"ÖÅkãÆ(ËÞ¢•åÄ×g@ÌË-ö¯�̧º—Gú¥o|çVM‘ëÄFE'öw@ÁÞ« Å¹¥Qê¾v‘ñò¶©Oâ–­ˆ§jCéfü®­‰Úd.Å.�LºŒÚÂb–"Ö®ú]xROÅÀá+äC;F&Åì©\ò71¥lº[’S=üÚÉm%nŒä§¹¶×o©$Ì«\Ï‚Ïãˆ�ÚØ.õ³»#Ø¥µ¡²FäãW‚©�‰¹W4+öâWTI¾G2GÕ°\C¸ë´ë·ã–L¹qàåŠjqš³Œí![ó%MÀI�Gݺ"ÛÚØe¯ÔÞ’°õæâuÿ[ÒÜ_bžË´ß¼™¶í`+Éz�Úl?D2§Ø¡<'¯|Ä¢½@ë‹´¼Þ¦8sµuεœ~À;úç3›­\]“Úu,»°ÌɽèÐdÓr‡Þg±n½›±V�â3C†ª_ZYƒ3¼èÛ'�ô±ä“G‹,~Õ»¦$Ï^8�Êy ³Æ=–\Íjõ7\ëyw¼¸Iˆâ,P6 ¤;+(¤R¥sÃ�ƎЗ¾µ¦Å ÝØ–�Z›Ë•Ôg]™Z‡‹5ÙÄÄ%J»RŽ©úÜb ŸýBÃŒ&öõ;:u ãsnX³i%°¡™@Š1ß„öÃ3 W,Ú¶ªÁ–fU¥² y­é3µ|oxÞ—Iº S¡‰,<ò•ù£bÀh8MÛƒµ ûvºÝs‚ÕïkÌ—ðJ× m„$ÈïsÓkÖW®Ü´µî&%3jcMÙ}Æ’­WC4â†MáÁoÌ˦“°ï]r1¯¨DM£FÚí�¯‹;„¨üVÄtsÀÈm"Ø7 Ò¸f¤9Ûï*£U¼ œ)kYÃ"ÎwëM·KxF †p®ö� 6^”T$©×ŸÆD¢câ>^í‹q¸ü\m©‚-ë;ï.—Ù?]ï"õX:׎…¯_Nv³»öTÐú47Πuˆå¶¯¦P{!0Ãc ÿY¾Eô+´¨Úß$Œ-§•^ã8�õ³©üóâ�Ïöó�ç`dO‹'Úñ(™˜ \·!¡Ó“êú‰ÊcáPiÄ…áöUµ|lõ8dD(ú/x}ó(œÛµ–NïIÌ iâ)ˆ¼(7^f¾ñ_aëÂ9øèjɾ–ùkôi*9³;ñ‡å• nüÆÓÆ ñYzI½Ë÷מqámF<„$A£YíÞÎw™Ìð7SiÜ—$©�¤yk¦!÷޲h¦öAq6nlƒ)Ŷ:Û·ï!.U×A sìTr'‰Ç/ TÙÛâmfu ëmÔp›_ááŒ=É<™ç,_|k)¢û l$S �º{€�N†1¾å:E§ú}Ü8 w¢¼‚ßêš…ÅÛOj&Î8?U¿2"{w(jøèK­|«{&t웯/ÆÜoEr;7�ÊÙ‚RØ<’ƒ7[A2¼eú'µ9ç‚~j…iÂmAH_‹µÇ(ð£;«> €ÿêÜdY_4bˆZîºa[@«÷¬{ %îÚ <»" «Ð ¦ÏU®jØÕ‚SVÛüŠÕÑ\_¸[§4ó¢ã»w’�½n&©¡ˆ~ê.°2)k,`TjñvHhW AüÔ @}¿(8ïhë9O?¾·\gš42[yo"NqÊüšÔÌJÎÚ–UŒÖ@1Œ<âÎ/7–ý­ —x]Çãë˜C %BÓå �÷Z©¬4¢c>†r%€¥>híé‚Ýw¼Ær?X˜D̦K_Œ@ëîÞïØ$ŽÊ¯›c›Ä‹Uà 󖖭® ¯ ¸+ìò �Âõöý£ÝƒÒêBÛÞÁ[”LêóêN07e¡7Ë)Èë³±^zž—ôøúæÖs/+"5‹=ÍË!3§Š»YõØ]nñµÃ—pµ¹ Jµ+5y{t›vì°Ëè¹³æ™öjMûœGàh™Ó—­vÂ)ð3œŽñéæEŠë¸ÀNàý!èœýµ¶›ÏÚ=òT\O;Ö­ç`éä̃-je/¥þ¸<,1ªÈe‰- â{Š/Çf+kïY—¸`õægXݤ¾ÙñtêÀM÷AŸ-|>�$«îþÆÏö,ìð½Éû—Få+c¬»±;ú$òú˜|ž‚oÁøkÙö½†z,üUé1Ýñî⊥œ—%dk�ÕŒ1‹/= òÚ:z27µû8?�Ï�c5Xøm`ù¥4¯]»qwJ[m4þ,;Ž-­­§ÖÂÊëFÔ¹3ý×O©3…V�ÌÜšmÌ´Ðû›{1âuùk¼%¯žætЇǡ�M ågŸ­?%C}¾™ †cfÉjÐÍÑŠ˜VMâ[ò xÃ{Hß0è\ù « 3­�P7»ª”ó4;.�‹Tx�rÍUÙrl˜U�Ó´÷'8é�ªópx¨MÐŒ–Ö¶Wš¡>Þj€ÂÀ¾;FzãèIsÙÊ·�£µ´ag�¼If 8øþ½2†JÉP¯Ë\9ݺé>Æ ¥ J4f�ô^W{Ú%sHBc·@»ä^Í:@Wë@^&ñ±+X‘_Ê;!ñÝ‘@RAkÑÓ3d÷YÅàÞNœ¹nß½¹û�^c_�y‰ßÍ·—ÎQ ©ŠµÙ‘<>=� Z;ÞAƒ˜ÍÊ.Áz"³¶I*þƒ•·À ößšnXè 0ªí ç ñb G; H{¨rôwŸcõ Þ¸÷]pÒÂÛÀ<˜¾‚R»X Ù ˆ’öž’Ø ã%ô™>nº!†\5xcBô0·6ñí¶ �­-Ý\/ÓAò}o–v×K#¤=1ö™§'‘HΛ1Šã•JííïI„ô‚çíïîôm1+œ…À@ èü� S33¹�‹nn6Óò]E@ §™¶Ø�Ã?Š÷u–<Ü´Jq€mo e7r¼+EÖ‡eèYÓI¤ÑÛ7×lAêÍ=rÍhª’ßPõk\&1+›žï¾Q`¬àì==µ�-¸½—*p ²´jÛ�ÝÊKdÚöC(r{õÖA,µÛCÈÙ:Õ›ïï€+ ߨnËun0Î¥~úí6T=z¨�_ }NB¥²È©˜\Ú1òu»tnÆ“kß�z¤q“£³wM¦sb{›ÕÇ�½ÔÖ·•“±g͹*ÆêàòM-g;¦#1»å¤7lý½ßy¶¸Àè |»P–Já�lyudž¯XB­”FÐ{;½=�-£Ñ7Ìjÿc¶î§\"ÝlpS4ÀW÷¾Ê鈰'pzÌ* XØ›á|Ç´Þô:«§0oR&¶OFL›'¹¥‚Ä6KG‡v®êÙ½�ÅË1üJ1A¶a8Uèj>­ùv*m¹| Ðe5Vß�� üøoêhùÀ…�-¡#N¦\‡‹š ¥–€|.E×7F¾wØ÷vpëÜXÜ®n¼©ô’*«n_Õ» ï�¶é±8òc2#NyÌûWݰ$aæÒ=·‚4ˆÙ)lŸ›3bÕc/A×Q¿ ¼Ž¸TÝ�”™“ëzgFžvÛÉêX$5ÒÇd•ŸäLì”%sIÈúÜŽLY¯Üé9žëLèÐe~"<%ñÞÒ.%~ª×œË^Íqvóº5ò'›^ ð„œ»ñëoÜ1'…ÜÖzInÁ/bºï¤¡¤=sPÖZs¦kVqü$„Zv«¾ýí[VæÌ8‰ARcsÍ0ï~üÙ^ˆPàN.Á‘Cv[:Æ«#�[‡(€žNí}²K½Ô„CKO‡×ÙÈö4 S�Ø›¥�SÑx›£Î–¡Âu(AjÎìO ‚”‘(¹Kd¦Òá2ŠóHL°~ztÌ‘{ìÞ–’\>|ü%³�º%ñ•F¯ï¾u«QŸºûÛ�H3!rÀÅeÐ×TÌuŠP°ÑŽ ›uOÏHñ|ÀL¬âTsWUײ‡‡•ºG£a÷Iº1{PBŒ`-�Áï®cʭ®$6s–¸.Ö™+x¶�TEtXÃë¸ÈKÞǽV�§¦[€A AƒÈvzgÛÙr±Æy~^Œ²#³ÌÁ ‰ð�c@Á}N0#¤4ƼÆÏŽÂ®‹5Æ'¶b§R„%ѼÁ7óÒ\dõ#:S!’› úªá¨ fŽo˜Á  `|ºˆºÂ ŽyËÚ(œB›m_ÙòNag8…,=÷ö>ûïè ìV*Np @40a‹àÁâSúsHÖy^rd "Ày ðjúÛ…»hó0Í[˶�>ˆm&" 0i¬/tIocÉ9Âït³%ˆõІ%³QjõùŒßb ª:P$òàœ[Ý[?åà6n(<µYþ7.„“Û‡57ê}šî.n+ƒq¹ò}iåw¯èóÀahÏŽ~sØîìÜŒgâõõõÚšÊ?žÜø¾�ÜÙ»fýÍeŸ(q…VpS’gðÛ›*j>X‘Gƽ¬xQR§,âIt{Ù Ôw“}h%]×8B7¶8õ±Ô–ÑÝÄÍm¬!>¹�¤™´*ÚÇ’u µ� sÓÊñCËíú= [V¸úpèäØ%îq•„îÀLBO°ÕmRvpsÕ.ñGâÍ÷¢3z àáM™IœeVn4Y9ô�oǜٿF�€ðev8cʉ¶û„‹óöW9„ø0Hå»IÈ»g9É3Kn½¯e y ¡àLkÕÐens×'ò¥Ñ´ßÜz¨¸8OËQß².Ö0Ø5ÀÁï ük ú‚Öè>ù…1œø ,4nî? |L~ùFðè <'�ÅÃ6$ÛH#m¯ í¸Í*æ²í¤o«2CŒ—Ÿh1ÍZÑrDL0íÖP2ë�€,ÈVз•[‡& øváÞí½‘Ôç!_¶)\}Ó÷0n“®”†&2e‡íž>÷;QÀÀœô¤µ®1}F×›Ï6«ˆ_4G�æÔó ŽFFøûX¤¡Ý³d v胊gmDÊyZ]i{VüF;ž(XIlù†ÌŽ%|.=]N2 ·žD;÷—ëû#-õ.6{ŸËAغ™{2gÈqz AN[£š„Žcß�ѱÕóäÛ*Às,¥ê{MN½ID�wP»ÚÖ¾³(mk´âMîï‹GCÄ¿4äӮѰZ‘œñk‚Þ2…º.rŽž-rÚb†öëæ ïbi®Ò õ‡‚>¾grZaD&ØH÷}ŇÃ_eR†Þ�­–+ö¢Ç™š·pòÈÔÀˆ ‹òBprµÀg>‘:uþÜ9­ F-g8ÝÂR'Q¥ÝñÒ倯\ �+9P‘Ø:-dL7hœmP-’WƒÉ¿ÅxéÅ2djÀfúx 0ÙÖ3Ú‘y’ê)¡-hÂ-§ÂòÚióÙb&ÐÛŒä_:®ñÖƒjÊĸu¶n¢Æ—ñÄvÆ‚5öAøJÙ0l×^A<`úªïæ¼o; “E³Ö¿tK~bNóxßÐ�ãÙzí#¾rvÌÚÂýP¶ïçxW󈊟ÂßoT_mµt4¶�ÏUµ_ ”ÕóÛ¬#òæHüMá�–„Û—;ÄçÊ…Ç8Ø{`?ªþk¡_~<·ŸjA/‹²e`åZìqb /Yóºl&3ø©“&(%¶0h5��ý²ùË}œ@‹ˆË@sicqÔ¯ÒCäT}Û8ò¦-ÓÈþ«6^^Ë­«�ðº=`”üÿ>£EzC8�cJ@•®ýš—Æ©’þÜ‚z-V}¸¢?¦ªø%ïC4¥HŸb”óÆÉïÀÆR´¶«!“(üß «MŒ{€¡êS÷Jý”t)½|q×7ŒÓx«Ô( ”6G>*€v›kPæµÀ»§ƒÜ�¢†áŠ®�}öšV|åi§}÷Ö£˜B§‡Yo°w¯‚‡°§›*ÔJ‡2Å�>\Zµý)ð”Ìß6¬EÀL+#K»nŽöp,ˆ>fnIÖ"ÃTçND’Åh4Ú½ú“»j�ÎØkÞ�‘O‡£¦ìn§v£{Âä×û©›^ÂTã¾Â£L˜lxÀYË-¨‚ʽ‚q®ªß8é–ZGî…­ˆ‰ º-X[ˆ ßh#�¥ý¢kŒT´ZešÀfÊœà#à`^Š%µº¹å² =á³tÔì^w‡œ×QFóÑ-²\0ús�/J¹ªOÚ1Ì^"Æà''Ã,nÿYßd¬^ù Z´|æ×ìBˆt U¶#sn.4ƒÔxËd5g–¤ÕQéÚx@»Ûâê�¢¥ð‚h#}‹u¸t2XèYr‡wM>´gÂc¹í%©lR_Q)YX)†ÖbS€1íH�×®_yö‘p)ÎgVP Šã{ag¡ö´ÏÂK®8Êl¸sáåþ˜G¶Ç¿tâÜ™$x�Ѐ�Ud ÷xí&¿?› $ˆ=P¡«k$Wõ^ÑA„H³ÚòûsÞq`+?äŠ]Pý¸ýe_GŒðb…PÁãìçW‹òÓ¤#(¨”¦è'BNèf;8ýŒ�’üŠ}XtÞ¡IœíhKö‰M^ÄjR¡ø? D@ü’´ÉýëèÒÅm|e|ñÙ…ßqFwû¶›òñˆMÇ=¼É€�©l8ö ÐxÚišömS†œ'6£ NuŠ|�Óo¸�)µœÐ±¦�?§á~[©îíܼö½÷EW;N±líìÀÝÞIŸYÕýw`1C°ÖµµVÄ2ÜÒá5A{&X“…ذnR&Z×Úlµý[Þc\³¾À–‰Ç\“µûßgz­~�]q…š±¡ï°'M÷ÌüŠT.0`ùÚï¡é³u Ý™•Ø.ð.é´KèqT<ê£9«VZòDf>•†~OšªµÉgºåml¦Í°AúßNN¡ä óê˜ÐV"Ͳ¶±ù“í«bW0ʸú rñ"þ3Ã]uðòf?’«'úbqÒ7^ bw™=Û±oQ.ªâ¸áឤW(ÇšÀÛR�’­†Ï:9Åõg]Ýã1" Ž^Çkå·‡4Ó� j•,Æ °ázúϱÑO‡O@];2Î׃W[¶Ò¹�ˈÑ/p¶‡½9K»ëlÙЈ+\}�æ¦w_K.CF3›m®,Y¸BYwòó>:[¾>5–øÉìª/ˆ‡©m`[wÔƒý .éÀïZ }Í»,MQüá—ΫâÕ1ÚvÝo¦å›‰ßì{á oF/lÉÊè ¯‰èìG¾h³Móiq‰DÃ…}’–5ûWÀ¹›~"}¨KNæqðø¡',ïc¸bvÖ}õVÜéeK͈üÀI•æe’ƒž,{v wîgmÝÙ_Á°òHýtL I’‰Z rœsÛ„BƒG~ÅÕš¶ÏCňtCR;c0ËŸ·¾CûcÎåÔ¼¹C}À®5èÀcRÉ—Ç­®{5ÅÍ]ò¯ÌÖ-¾&Ù@‹�TFÄwœŽÎÄÊ\D#ƒ«`¬ßT•”îÀ¸Â…%¶GÔ‚G°j‹3ñ ÿÑAøž¾ö:ïü ^~‰›ZïI­¨v¥Emñ¶ñ~äൡ}IÉ‘9r…ÿÑ\# ó«1µ¿ÃþqÚð™Pµ†ÞÊ¥ä¨äWÞs/sž…°—¿rø-]ܰ!~¢�à»Õ‚®Ñï¼v¾¯î]ëÍ¿dÙ[@³,„FE-cBKÉWb9je�òïÕ:|.ý|,¶Ôx«=e°7‡¨udŸ]«V[OvX–~ ,ÝPñàYNºÈqì±î^ÕOqu/kÆgZ 5E͎ý?qäYà Ì0fm¥|&ñ…¸©aÑò4^f%e]lxwÉÚÞ`ͬW{Z³!î0xQ ¤z¥_¶:×:P‚£‚� Ø‘uÔÌv Xó0·u¾Ú cAâ%ÜŠìEáyu4â¬Ëí]÷‰½îKTj˜Îðà~.c‚”ö•´ag/pb%Bdç5ÐÛ¦‹ªÎn®-eåã±f|‹So ¨Ur¾1Y%H"*,Ž1§iY²µÒðŠàWߦÅÇÆ0th$j¼óóƒ Xw�®æRÙèw1k»·,ü•íV/Ô!EÇNdpùÆch·#¦9`<ðñ`e)‡P|Ðpó†YMg¹“²;Õ[¢æ^ºÂ¡ë+%`/ ¤=™F Zn%o,É»Fë@†Œ ­W¬Î¤q"KZ *ó¬évÛma%l$§6„i±äqÎ4Yº›uØ �ЦÏWÌ›/JØ–æÏr@Àx½éù!â³6òÚW IÆF4ªëÍgãÿƒë5~9ñy¯ÔÜgÝß(üžOÎøÂbòŽ("Éœ¶µt V Su ʺB ’2ËøC3‰ŸLâ#zÐÍŒÎöÖ)TI þóÜ)pï¸X,xKyF»l/ ‹ IÃkŽýxÙlÛ=älñ6枬ÙI CÜÆ8|MÉ_�©v1…›6¤Ç ŒW{\ØñfºRö†Æä$¢pÙe¥ ÌÞ„1½‘ÞfˆOc§g¨~ÙiœXNÙ®ÖkkÅ …ºn| µû±žðow^ÚZË›`A Ñ$ãóÚnïÃH½èB‹u¼S=‰ Í—�ͺÑüãl‚È#�Ó©|Ê £ŠAš¢Ô:@ä¨âÚ«Þ“1G» ÂçTËܪ¹!¸–eðï´ßŽY¸‘aó“PÿŒ£¶IP]®b´beh[Xi¬1¤›ŠÈ¨+]X®Í!ëô]Û‘R­;7p ~nò$Ö<°H?¿C´r|w·ßVþÞ;(Ó-™ñ¹ÐoÙk,ðt!­Y"›)8zx„=Ø Y0_a¯^™4G0D£LŽÜ”µ£aKµÔ>ëâûÕB�[â^ Í» „Øhý!Ͳҵ§JÅÙ™`µw[þ›Ïôõ“‘•$ÇA5/ÎìëCÛXî{íÂÈLÎ�4<‚ÝtÁ­÷Lá:Û‚”Äõ+6ÜÙ¦åôÈÓ?w\¶6˜ï‰GæÙ ÜÐ} ÙÒ? TI,?œ0÷Än�Ýu«ä¿%ÕÁß.Ž`Y(ÇyG­4˜7Ô7>ü%aZʾ7�aSš†qB-Õ2�ƒ E¨;›tÿK°y7n�á.Ã%¾í ’YŽ™ýŠ ª�¼=Z‡·%LçÕµ,òâåz6uó“¨`nËÿ:F@Žó1ÈKŠRò:5ÞÛ¼Ÿ`Ý–û»çëù¢^¶ÐÉaÈËíë ù‰ó=ï�ó¦fÜ«X­»ÈÛ úêçjÚá8Î;úA^·›�„—(ë¾Ê Ží{&ö¯NFÐ@r`š7O�¯;âˆ4¤]BÏ6²pæÿ[œê5F¥Eµ'`æy»Ì§ïÙòw}‘EåùËê–Ø çvm‚øp x·íõÑy‹8³iÑÕ´??�–î‘#½9&\þÃnñÚrïZÔÂOêäNï_"õ7°DÎAZ1Ë7½Û=[±�ö<~@Ð ØmvzÁØÃY,™d{ikØP ð‹D—dW�B-úª¢œç„I4LvØA k[nh“‘‰OûMÆÛý}}ƒÌ¥d xj ›Ê‘�E‡Û˜ƒhìÎ%Ýü°)8iç‰å÷mÖÌ4 Á?5ØÂä‘0¿Œã!Æ B­Ú?Å×~Û÷ ’Џ r0ÕS"øù�€Þü/-0¿i¶ £I«Õ†°íHân…0À¨—0†¾ˆc5O tÓ')ï`ÃËg‘å®wG�øPÅsõbúËâ\*úM Óû{È(�Ьñëº,°//êûÄ“&~ÜË}òøqgõÂ÷á¾gΧ5 ö&o“)Y8ñ“…ˆ¤a±l¦ñ.¥œ>›šµh´cº0Øc¤Ùbz®è{“­cm¾>Æ$3Ò8 nR…ú«x¬•DUm’»Õ»bŽÈ4€Ê®[åÒÓSþÈ2öúèi.4ô$g}Câ>úçªÔË_â™9̯ Ü)P‚°ëfìÁ¡F‚'ˆ˜{Ø£]ÃûN’®[¥N\b1ï¢ú+©g+X DŸ¼ÁߘKI‡[¸¾€E¾_ªZKç÷|p}Gñï`°Ô8LT"î`d“#¼ã%üöÐ>�Ÿ» 5¨mRâKǼÞù�Ãl]»nRCm4âøm�Y³�îU³´€s¤¡®# K¤…© ú í«ö5©—F"ˆ`‘P±&zvïÒV·×’©%Ø¢U:F<.ÉGdŸ*'ÛŸAžø5ZÚ‹¶Á”<ò8ÃÑ"¬åp)a—�-B²‹lßÜ"yvˆ*Ãçá¾u˜Å&Ρˆ©CÉû �­óQ½Ï–{#uÁšãÈ ^ ç wSŸšlu•ñëшpMÐ)0ÇÝ3žY,©%[úCpr<›yäø#¼1Þ['´ÂèXp»TŸW/kü\M\0�•üèh:ŽÆó¼`òÁc”…\ :d„RJÉžíL,Å»XÌ–JôVØ®ð'Áá�dÝ˃¤))tqºÑÛö_Cyp3á3/-ãPײKÌûˆgVAäëë³ €¯c;~eY,�ýø>Õ�ò˜ò§›„ܤó#xrùØ`Šò(â8÷ÊoKý‘É�Çaî$BWî:íSØ5 &¢LŠŽ›\~Ê?lgRv@�ƒ€|k³@jLJ0G×K=¢Ðþ€cÈØBó\âäMõxÕ øÉ¤—^nÍdq¸µgaËØ0¾Ë†séÜଓ—Âù¨ôæôõÏ%)°{Ánäc©Lgê–�HĨêØ > }ñÀãu÷�‡§¢^‰Þþ=´ÇówˆBò†+`½<ó{bf½‘öI+ùoäÂnObq«_ÌRä“ÍÙV4 ¾ã_‹åüÑŒ Ÿ6[y f¥aV¹îBÀG¼†r›™ «Hž}©¡óÌvÂøp&]«âÁPqõaø¯pâseûÔ&‹âHþÒ"[t½`°‚X—õ»’ä93añW¹`¼sWåó¦u‡O%h6 Me’b(ê͈t—îìýÑ�†'w©p*7=·„© ïo|›–`°Ã…Ô‰ï‡1‚súùbÞ‹®UBq%¬�‚- ¤@šì²‡z.fZ2AáŽ2ÛA7@3»Lµk3a8ïf�åç¿Çû/¤P†þÎÆîÁ ã’}u#ýHˆ�âáç•g¶¹j¿á÷oûÏëòû~o¼þjáBS’át.ßÁü¨pq¬¥ìWB+h=Czf�*¯íi‚=�®\Ù¾ ±“>Sî©v±�Þcq­Ûs§ê Ö5k ¥q�€ÝOsëá¡ÇÓ0 �ué©;ƒH)cÆ·¹Åà§�›Ž!jC¦”ÌX‡ÄÁVÙÀM‹›“Û€”�ËF*yÚù�ØmýyÉ'Ó D×åË™-@\/›�Í‚"]eß"Åð~6««û,�Œ°ˆªqCØÍsÛ<àƒvu½oE´)üT[’4¬¶6¥ÂwSãÐ÷yÐÖZÐV$E_Ão®3Bˆcú �,}0ÅQÊÖ>+ih5]Å…U�i�+úû}~õ·F}Á‹\ÁGTö�!%¦<¾hoiV=‡)%óyö\Mï Õ­A‹ù•”êü;úÎ" · Å?F}3‹sS pºG&3�ˆ€0¼´swÒa�ïx¤«y×ZÛ¹w7§}ëx½‚÷æáñ6VAã„K˜‘­Í׋%3ŒNsªï$Ð"uO;}BHDë…·hÁc´å`¿6czñ¦kµ¦-!p°dßE]<´©½Æên&½¡ù‘=äg»Í…À”¦Ëí÷ ·Ë_·58ýp?]œÙŸ<Øç Iª9ø]O$ô «!p(VÎz¿ˆ-¬S R'ë†54m|–k\ –hˆUÃe}íxa¶aA$cÒ)ÌïoDÖ1Ö¹/¸hÓõì 9s´Ã»ñÕ<:=d‚sÞ¸"yþåªî@á�.ê›Z0ø‹½;[ÊM5ÏÍ‹9™EìzÛØP O³cB—ùÚQrÞÄýpã XÙÌìRÏŒÜÚïQ•Þ6ž‘$îòê!„0‘¯ø¾XßAE�®ÜCo­µË7×›*½ñcXû¸Ýˆ2©Þ3³ìhIK…æ e.ê!ÛÇgCŸØ€ð '8ß}óç~Þ\ü×´ø :>îŠ ˆ[tþD„†08‘É^1¼}ÝØ¯X¢ðyþ-óß…rýºc:²áµ{+ºÒ�C07Ø� ]–¬÷²Î_Ÿé }ó*ï"vÑlJòÑ T{ þ!¿ʤð¦DíŒé3}–¯),«"wË÷Îë‚æ(Ãö—EƉhõË!þÉŒa«e•%XûWˆ‘ï—ƒCÀœFÖoçPMk!rÚOµ® k¨qOhõß9¾ö›³˜¥B.¸E�éÔZ‹¼A}aºþßÚc)°¼'q¿&ãí¸('Bÿ/é¶‹±e4æ}û›ã/׿292Âa;V}/-:ù.ŽþÝÕ–‚ûq¨ˆÑ3Ü�óF …ð�ç"P a‡dõãLKFáÿTb(űñ¡ëª5g_q&Þ÷¯°Ê´íçê%!VöÌœ .pþrÖÛ†¢Ä%ƒæ1ÍS>7uÈû=-àŠ6þk´�âß»~©9î]µ—g›ÖÙ&0žÒo› éY´OÙáå7®üGtËvY½’‰Tuò=$ÖPw‹¤ìéÎ3í7Ì}3ã‚ÇÖ@ÁZ÷îd}h¬ÊßÌDwÜMj4€Å;yÒi8ƒz$ùØ‚k[„Ášý‘fÎ|hj›'ÌvÆï…¦¡ãÝŸ[eËt:ª‰�AÖ× ¹ Òѯ ÷_ºõ#AÜ€†2dUÆVa¬õºP»›ì`¸­nÛ-·¹g£¿D0M[d¼@˜8ØP^ 8DÈÐ…×UŠÓn•cP`8b½­ QDøíÛ-Þ�‚rÙ„ÀÄ6“E]B[ &�+Øpâ8씈q—ÏBû Ëu<ᤳÛ#©üCîù¡àÂ" @�฼bþZMƒó~ý·ö+LTBθÀ½^®Z'*W«Þbõ’¢Í) Q²Š�»¸Rì“®–uZ¼>›$öEb[Ðn$6µ© ­hæ±I-æ>ëA‰ÍX�a{°¥Bê‘›lZrA» iBohj-),]% JDY*ê�£‹Ž"i ›!ºlV- Á1GZ‹K÷ï +x͉�­ICdÇ:–ËíkpýD ƒôÛÚ=«ÈK¾Iì;ÇœjÌ*-Ö)�æÕò™�®54Ӭ͈ïyb Qy8‰­ß£6U°\õå˜Õx6 ûìÞ{OVŽÇÖØ;¥Ž™¨®ÙµâŠðÆÉâù‹ tœã?¸¦hükp=ñöG/ÊVU mvâA|qBpc ÜÄ}ïd‹Uñ*›Ôæ†e`òc°úw‰p{ ÍfØ'Át�„ã8à‡$U�nZáÆ.m°+êX”OÔTÑKŽJ(ê÷ÂrîÌÀBAmSÛ–0âôðÿ.!s[·0b¸¶¿&F3Yh_Í–cÖìÚôàÑEW9�6;b§rÛ•ýïK� ¶m¤%BYßËÖvßl¢Ä<LJ'¾Ë{u VÞ¼æð}ÁV^N¡pÎØï�´jèÞ;a†�,Äöv– Ÿy4Óüy•# iú•°@À0¥ávif ÙGÚ˜ÁŸ÷ VF43«è¼F$Ï ÕðQ f) äÐMÂÔáØ|ìÊÆz’{Ím’4yGèèo¦aáMЯ�¾eî7…EåBÉÛ€sDŠCÌ×7‘0Þ™í–a¾ÊSy�_•ù¼ØÔ²ãeÖÖ®ÜM—žh¡2  ÉÞI@#õÓxt{æë7ãÚ%¤t%ÚwPx?×!þ5U8w[ç÷O!›ó?’�b·Ø]ÇOCOoh$“KÒàZûÂSªmø×_ËQŒk�Ì?aD!ï™ýZWê"mä륔ÞÙwºæò„„ìb÷‚,Ž˜0Cn¸|6ñæÏì&£<íÑ-O±Äã» ÕÌT@iKI˽7‡N²‘êaz•ö½VÞTss¡B;(u‰>C NÖ]̹§Çm¦»ßÝ[i"8EÖLB7­Ò‘Õ¸²?� ÷°%àõä%uõ�:R+·µ´¸¼9ÜÙóK\¹z9ãarÒ\Û:SW Ðj)™åû?Î_CášZÇà’Øâ>Znáì R3ç·ë.5ÙæÿÙôÉw�:ŘöŠÛŽ=øœ‚–É \~¸±X²�Ülg5º¹s£ôï¸Rì�°Ö{SXKm¹uÏ¥föðHAUÖ9n݆d½¢‹aóŽb(&åp1ñ–„ëa»¹Ø®¹‡ŸGHq•IêþGÕ]êñâÞïö´!@�n~”Âxƒsóé&êoÊ$Ê7hb`<2U3@~'>À.YKU«·$Eznà  ²\ ZlñÁGCk2•lt6ýêç7˜—­Ü —ÆŒÅöÀµOÎ €Ž-nÚÍѾ Éš¸™qó1ò³eºä‚BÌÉÐi§àʵ;Zëbu$\”´ó<î’.æ›ÅÃéá„#¾ÊjT4u¶qd¶�nR^mªùN@ZiïžØ�¸äT(÷³�æ-„·5@©Ýî>ûàèà6+8Õ3¼x¾Ðmè}OD@5-MÇ[YzÚË`>­õµJ‚@^Ú3‘Ÿ’®‹¡(ßñÅwµHW�¢¯�^‚Íêƒ|û—AЂyƒÅ ˜è}êû+ï !]6-)YéÈÒ:R|²Ø®êõ4­kZFã~а¦ x’9 ŒgMS#|ØÌ' çF¥èZ 1·a»µ3B§#zõÛR$ø¶ïsäh[2ÈW9ìêò[DËú¶ÑËwK†ç!}f€À°¦Z�Œù�,Û‹Ý›¶%ðo9´‚Ñ•ŽÝe„õº×>ûRtïAdi²š Dzq¾o¥Î X7 Á�géWÚou"Ô%÷ÐŽ=7íƒ"r[õƒ£u®dï~dªøëè[4{n„{·+ý„j)²ëã'—¬ÎK1�¬n�l!lûˆ˜û¥Þwôô §´ÃÖ|Ì–¤§œ¨Jef^_ïšìÙ€© ¾Ø+Es²Ìá©þlDæñ�¥š¥yÂÛ§¾&êô/Ú~êgòûè  mìç�…yûq€›1?Ôó`2¼�”Öç îÎlÐ:¼®Ö2ÿ 7G�ÐÅNçX?rT�°{UêB�¥ÜÃÛèRA�¿Ý)¬d�ù‡•in¤¯ÜÝÌho¤U[E¦ãõZ�ÌÏ1Aåhð/7K¢þ�‹ÑëJ¡ÕD¼¹N ¹cë& vxÙäÍ#L½YÏN¿SÝÞk´ xªŒ™Ÿ-Òðùå£6ž¦ò Ç«cI¡4uÈ]xf†¸…ÒØ~`=¾µtæ(�¾ÛuÂÛ{Œ÷ö-±«‰Ï~ÈÕ" ØÄŠoy¿?}”Ó~^Aw�àû¤& WÍëL—˜›r7>}c€;\¸§XÚ?<ýL¹ÒÉ'72ü-¶¼ ™¡bvº` µÝËp)Òi<ïjÿ»«N–Ì,€c®Ió4÷@fVû«œ® *;tÅï¡o¤\Îc!atB¶Mñi݂ΠºüÑÓD@k‰{IiwŠIרö=, yëX5X !€Œyž¾ÛŸrȆ÷r[r¨ö‚Ñ5Îâ în}»xí ‡ÔŽæ[3erêÕA� ŠJºÎ¯v«(õ8S[úk^哇"ÃYÏŽþáâÅØ×[èQRÅçe)yÞxÁ 6–°iY—¾#pNÍ2hÒÌ2‘�¥kÝÀˆïçúÁ�£LšÚ¸º�y€0p´‰ÞâÀÛžZÖî…“d’ß‘ÀT Æï¼VCÒl¸Å£[ÉœÈÎÔö(q‘L C'ÃõÃ5æWSîtÛ9ì Ç�Ë—ÌÀÙ½HãfnzJÁc‰ó¢( ¤½)?�B éÔ˜]À®ÐãÒ¸�Èž©C ls¸¿ÌkŒúööÄ ²;ŽËf˜IÁ”3 p¤1ÊÐYþH â‚ÀÂW 馠mÇ*°ÛEÏÌ¢Õ94»5sßp>Ä_ÑôÏaXE+’מW–›UöÛg(>õs¸jpWŸ¥P–þ®ñÚFÂoF"Q¸ýÍÑje'%ð¨õmd`‹NEÅ��úâ¬�/b Ÿ3"Ž{!uLÃ-þ$Ó osmòD2—q–IímFÓ ¸¿G¬7…–mo\³9ËÀ䇆:n=ÙÐ/×g±½¡í/ñ¾¸g#¦0^gœ_o=„¾{u~ ûiaîàþÁœG2GÇÀñ¸³·[ƒ Å5°i›7EkÛ‹‡ËwÛ"ÂóÛ&Ë®vD—;èÜ“#^Eß6W$&K -> mEÝ’«1—±º’w­¤ªƒÊIBT[<!À ßYÁKv¦QþTÖ‡ÆaS²T ½Šß‘‚8Ò<\÷¯¶”Ì û.l„z�ØÝ´Ä5¿¤/û å<¨/oíŽ#?4O¨ƒÖöX²&š`S [FƒJ÷æˆt±G–´E¬î¬7L�òòž%XÜ…³ìL–�™†%57Ø‹†¬)¶}ï6½×d:¢Fd s-ì'#c´üÚÖ,Z\²¦ 8KŸ»kýv·};4àé‹çä2dEµ.G´v�75¶4ª±ø·t—Êë7G¾Ïn•C ±—&”üŽÐXµ¬6 '8�›ZåÃk%GYÆá@·žË°v[kœ‡nù–ÃXË¿®Ó�4ò=™Ÿ¼â%GDõö¼!W^Ägs!€m,ˆJø™¶sû"F3ÜYÔþ»ðUöŽìfæðco�«|㢹” —³ðy§\ëmÆO™†îÎ N7² QX’¯9Ì‚(¾@wÍ·se‘mJiÚ°!Öù·,ôõp65îVðq¢mÓØ ˜Ž.?_SÞbŒgy¿íîî[º=01&R …ÃÉ#ZÇÀ&¢­LØ ó¤øyëé Æïƒ;OÆ™~ùmNC›k«Ÿµ‡%_w_žü�1—˽–¦0P¨'‹¦sëæÃÀ�ŽSª‹†bÊ–/ifdÌ‚› r…Pî™Å %•¾²åð¦†ý/’wàM͈Â0æ9«io÷uqÕ«› ª½Ø¹¶6Dc>ï¸ÕyBaÁÚÝß�(Å{: ˆÌ š¬é\G“糫á.ÍA¡ñ‰|:V¬�®³[÷›ènÝ—>Ôke¸VÕ�öïŸBo0Åýâ�q%ŠðÊF²èº”PŽ{î.|iEû¾ï,ˆO´ê\„ñV¹.o‹% ᧯H·—bˆ­:ÛCwŒUæ„ôú‚í‹ebÙ—H:¨å�ç2ìø{Z‹YN>$·ë‡g§$<Œà/W}–Ü(#gO{¶Ä[y¨œb¯™L|K‰ÒI¬6®ø‡´jeÚ�>Ì&¶íVlØÉ‚æ`^%Â:žµ}3óÅ×ZëêëÌ%û{õM 6â¯<-=N$x±.¼¥¢4Î9'­êu8üÙé^¥28†Á+*·û¾_N«+;óiƒ(À©¢Q×èá’欋’v@0ýóðÁjZšÄX+Š˜ÅEÎ7j6ô·º{HèZ'”Æ÷£PàV–Üa©�XUÿdp^’§ÀÖ�B¶‚0C(äñC9 ­ákw;úŠ"^‰€'�ìÀeët„¥dñ¶u#ÇÌ�ù�Jè¥üm\«ˆ8¶r¾ótc*‡÷õ¹%Œ®/,UÃXµÖ¾ÍOÂË`-(cÝU—'îÚÊ*«ð`(\þ·|ôåôÊm)™»d›ÜO ?\ö°',PîâŽo¢p<ÀLe¹ŒÍÃiÈå©m¶$`µ‚£R°2"{YåÑL]"G0Ñ¿[’v d½É·l™e—N¨Ö–n˺śîÚî®°ÖRÃ�ã̼ ½´«åsg�,°yŸí Q¦1&vAÙ4Ö¨3Å»d4™•O�7 –x-}Ón5ïÇ+9.(€­ª£à¼¨ˆ'Ì&üTø®­¾ê§-Ó²�ó¼M3Ew»T °A«~?²! `”OÏ2#³ê+¶…[«–+a™µ]*äÑù†H½`®X1šÄû(âóË6`‚Š ÍÕ°·?këR”l*‚Þ9�·'Üub] MýÓ�¼žcô¨á®aô Ÿr‡´Ò2¼Špi±¬v ŒKo6n»#· “¦j¿9pΗ’íÒ-77CÆ1ÛÞ]†ÊÒË|â"Ôøzœ¤œŽw֢ůc7È3Uû0ÂG×òÙX�òØ€æ]äàc�pçòý fö#â^šõdu#}]ç,{ ‘­]u¢2wfó£WkÍh­DSoÚ�Ð7ÞÖ·Å/KÒ(ði™ A?GGÝ(aE_vˆãÏ0ªc=Gí`íE»·­lù_F®7�d¹xi0psÃc¢�ºrÂKÓƒKuZ.Ü„æ3Hñر䎢̚µRÑJDÚrAš½ cˆ÷Í®YlO0Ì?T5ž‡¥[L[�ñrϰõ²Ž7|Y@èÂaq`R¬ Ê•ƒzàÌV–4 lŽªÉ¾olÓŠz¦«|Þ.ÁÌd›¦š5;ÈÈÑ7wY5ÍßN'ºV•v›àuÖ2ù¨‚0]�ŒxÐ}�8ªéèÕƒJø‘#Å3Ê=ÜôŽ×š%ˆºj`Hbù UDˆ�õ«u˦�÷H: ߇™Êe„”ñ{ÛŠkÈ�$ñHùt{… ]èϘœïf»ÜF³ª†¢È°ŒCµÞDñˆÉ>W[ßU[·K}žô_.¸Œ{¨ØUê7 ´Uµ°üÖÊ9û0/`~Õףʺ6C£ŒÌ(´�ž%¹/5D§œ=àôۦĄî®ö;&óšÚ+¡ÞrªÙ|Gõ;Œòî,6ØO ´ßœZ-vJr@® ÁI�·s[è/Ìo sÚ3�Æ/é Æ1Wº˜†'ˆú ï‘G:‹b ÒÅžçV+�ƒSSZˆ2JœÕoò”´† ©Ý®f[.—[­Ú 7*õO.z7š¼l[ªÀl«a­Ýp¸MýÅàìü�s̱ڱ•„\ÅÑê~çuéÞl(û²æ\R`µ5—,Z°.P•¼‰< òoWÏW æn ôž°«Çëö<Ò½t¬ÇM ­rmc–ì'Žˆm/WZBüŒÛ%JÞ±—¬Ú´‡ûkUÅ;añ‰¸Gef‚bZ6D5Þ�.šÔPWØÛ†±í/K7ECæCâ#T*ë!‚žF§+ÆvÉ9S×ʬӱo"½ÁË7N{[8€Å„ê[ÞKÁL¸>’9¹ë»­×™Wž5™^‘?ã&D²ØI§}é-�`µj$Åp{«ÂÌ_= ̽§#¶¸äº;<w­Rçd›_³IG} åþtº?£ÎξDWxA”¿(¥¦S×%jDäG •G|fydÖÛaþ€C·Ö“q!|Œ‚Ù„åõÌ¢¸£½€íµ¹ì¢D úQÜí5šbÄ‘+­õ —PÞ^è<í#�†ÏyMⰮěvP>²r×¢ŸÍÉMr�w½ªè�‰PȾÏZ *Œœ´è‹K¼:à l˜÷G´´ Ukç1·q|ëDäƒcÅ0xéd|e-_ z�%Ø-»JݨIü@ø¬LòŸ$�x[-�C»r¿åt#L±3‚ýJ¢ÛPw§xg+pe¤w• Ä1b±ß·e�<Фx¯8*G2`|ܨ/£æ1]p¬Æë÷-å©Ã¸ï<×�Ý^ˆ@™D (Á&ÏÔ÷ FžwÊÛ_yå˜k¦�Ójr¸ÕÚFKj©™ê^Ëe :N›žDAs`­™ß Bˆ‡r;Ð0››%ïÊáÕl–7·\ˆ7Þš—óØò!�½7ž³ûCÏs#Ò"Ë|Ê’Ã…5ôF)¿¯Ò2ô5?Xd3CÓÐC{ûkÅÖî¼Õ›E]·':Ò¦‹š0¼âlN>üÿ­Î �¦�Å…Ï(P 1—3[˜€¸N˺±°/iÎÄW³~$Ì a-�Ç?&èø1Dm¸Í/ºP5{â»ÁMӿŰ,Tz3žµ±A»mÅa}¢¸H°3…À±“¢åý8mäÿf°ª»ð²ó`ϰæA‚êo&½HßqW’�M"~@ë¾à÷ DuÕ93Ä\1w)ûâjMVµ‡KxšxfZ(°«µ`°{ü•«]ÏËÔ…B´ì9�©)«¤ÈÜ ³eÇsè³3¾mÖAE!¹Ì_pŠ�^“´n×ÑØ$®Ü¾&6½ßÝwݬ‰Ò©+³MÏM4⥤H¶Ä2æÃ÷µî,ƒ‹ÖSÞÏí„^ó × ]ªóv)† %¡Ù�•Tþz†‡Ÿ¨3ô¬ö¸€€V²Ì(åø C�hótø+ë“H7…Ç£,ø³Ñ‚ÅyÇç´°¹X2SÜj)-Þ€Ô’KØÀq#Žo4ú%WæÖ[™T¡ó·Î:-r,mÐ,Y¡oú»jºíg)«Ö“¨O–gJ÷œyÈÄ5«'Ý¿4‘xJh¾àÓlOšÕµçÅÁŒ‚;'ù0R/Ÿ.c§kX­¢!Øë�Û>bÏLïöŽ¨Ä—Ý†I3à‹ï= ·”L î”À`çÐæ9Æ{ ï„e‹ùn5í;¯ë¶××â=ÅbÁVÀQxpø§™¸ö÷‘¢æø\È!뇋¶Ñ¡~ùË}„ݧ=ûá'>t¦w tgÁ�q˜5sÞã;×½ùíÙ&·‚çâÜœAÛAÀ;ßísAƶhÍÕO8Êi…Sl?5Ú¦e:œñ1_yQ"ª‘*ù0ÄŠ’ø$©qP›#`\j÷4Lf- C@)XîEð99…B,•ÞQ/1’¬ˆWC[Õã�wÍï˜ 2DiÏÒø0ÅÃ-Û_ŠÚ`'¡ …‹ãöëAX¦\Ù¶úÏŠÝ÷Oб 4Ëëqs¿fÁýQ¿±˜ëåÓŸ¾Ëÿr”< š4á,ÿR‘šÙæ˜Ð¸EaÄjË Ò‡ÍŒ¿Þ¥ILæGï8Ü€XãþTª”ݵ—±:«ÙAÆÜ”²C;À‚/S·o^öÅ 7Ã7�dNcÅd¼÷:Ä�í¤ª£µw7Ò‹.X!?W1’’§µ¸ße5ÎÚÇé÷£ ©Ã{hÜ›çW=†Ö·0TaÜèº]mªà£´å¶#êYÖð>¸k«gys-²‚m£ ×à!‚]57AµP¢¸ÉÌ~Ô¯‡p5� ~Ò\>;¥•¶WgÍe rg7k_ õÅ;æW,­‚=ègv¬ØYn™h´Ô¢¶�ýÅMåH¹<ôÀüí \ÒWßE¦ÝØý-l{Lª^ñÆlÖ+­o+¼hh�ñÄÎÂ[Vç€ßICOÅ+4Ö}|…ó`+XO¿0s‹eëk�»³,�$�ú+*âÙÜå��/z žßv›ByŒ;¥é�Éc ¿rþ®õm÷ËHàñïù�VÕípf™;¥W!2EŸg0W�{­…n Üïv‰dÅ�ðÃaR‡«2ü`“'Õ%æ)eS|z.Üû>œÉ0Od‘ 3—ŽTLѶ­D/6ÜNÑ…‹ç.Ðý%l†¯{ü/Æ0 #ž½ñ›¶“f«®²¥"žZâ¹`?ÒúŒa¬1Jðws:'<P]~«ï-Èx_ÂpRÒÝHvLÀ³è’KäƒËP TÅC¾E7’g5Ag9 nÀöžw5§.ncrê<�ØÂ>˜ÕÍõŽø¦Å�Æß™a<ïyzÆHëSÍ�Æ:ˆ:|�|ü¥üe¯b…«q'·h«±.ê-W²OÚŒ{I!_· „ïôpó‹}“´Ÿ TÁ±—r�Lù Žâ•¶gl¬_œ˜Á0WŒ Ç;é6oÆ^SaEþñM¼¶áNŒªî6C¡¼ç|…-êQ5{37 ZëÅ*¦†!Íù3Ò‡¶U^zWf9* _K€W±š5Ç6$JBRÅ”S¾ƒÃ=vÕlD]xyÞÝ»¤uÈÈù;‹X#fLUð¦1ª‹:ìCt#P¹Mb$æR©†5­ç%9|z/ïE,èk%'z6¹èöìEi6?³ÊÊ5)Ú÷‰&¶6-|1¢˜<ÐTÖÓ¢½±±vmÀ,h4Œxè&Ô8í†`¸=59àã.Is`z¾è@7)W-¹@+hòµ…ßtp7Q²1ÐU#PÖ}Íâƒ&×ê<ÑÂØC˜´ ^ÖÚÕiÜñ‡Ãß’ö^ÀÎBÿmñ 0L°/s° ö¨ËqÞ•ý67¡ŒR>Ôh-ÈÚb“”01ål [x�ÀÆõ’·ƒ“'É]ÁõØr³¬"×xsp:ìö¼ëäCŸÜ¿h�¦-—Áëºq C}µòxQŠÖƒX²fõl˜6JîÊ ÎÕÜ)¨-ÑX•ã„W‹µ…wafÄø·zFÈ.1ûaÎV�Ínæmš4q0ÉG‰Ñ&{üÔÛgØþÞ²l�Ùô‹? öWíÙYÖ�…€�Œ³½î›"×â}”óŸ>öÈ�0ð_q‘ | Êèm‚ð¶~ËÝ"á?±ç/˳'X3ɇ¡Ñ´ÒÅwTÙçºÉjå|WpÁÃ~-ìªÔomô¯Kž¢6lØMædÕ–x)!0ûsºz@Éâ"÷Û%ë„Â?ˆVÄ®ÓÓØ¬'doG¡µ‰Þ›O\»Ó\ö+?ˆÂ5ò>�ÆB –ºŸ¬i�Šå hÒç<#öE¯*tŸîˆ ‹vêÛƒ¦ÒäçµÍÿGK–Êù™óŽ3øq’ÄAú�÷>c~˜7á=»=!ø‰iT­Û^éì&ð†‚Ôî¶Í .i°Úúó¯Á8óÒC·»Íê¹ËjC:E‹Úü"~m ã�ÄËÙ:°–YèßM÷ V Q("/Üûí \àF=Æå®Âãs)btµ¨²ð9U»Îõb-ÔPŽð °PÛ®LÒ å_&O„™úaeíQïeŒ\/l= èTÞ*øÓ§8=Æ_`Å‹né[JGíÑH›}¹‹G4�¹µ£Yê¯0ë,'•7YöB­YŒeâÄ0§4 �³r ‘5 S¦µ�›Ö_­U쵉€¼çíÂòÝu±�ž0]k;ˆ¯}ÎÇ™"`ÂÓiG—‘Í/Ò[¸ iÆ\/©q‘Ø�¦[�hpÄpˆX`.ªàiQ �tßðœO†Ã¿[½^O�ç`s)ܶ±ŒZZËÁ¾‚±”i ìÇ�žÎŽž¡£#pe:÷³‡H¹¢Š+ïj ˜kÖœŸÌúºƒÕƒM;;�=ÍÞMne­mï“A;†‰«…7]Ь­aãÐ!©ŽzÑĹŒÑ¾óÖæ ôšô!Ž@ÑB50ÛÛ:^O7È./§ñãUY»›Ý³ÚgA3f‡ u¡ÀW8Ê©à­;jOW[!Zw{3<ÓgŒêƒPûÔCÐ,2¬r«ð†¶ Q§^.´T_-(iùÇêv~æE-ã³FÁ3�hqgpîÁÖÔàa¹ñ= £hgŒ ›HrËÎ71À }(­5HCAY ¬Y« òëY¶Ì yp`ùÄߌ õxjæ�‹(¨5Í||ôû7/’ľâ±Ñ²ªÂé°'3>¡&ÁVÙË�0[ßg‹ÝY‰.¸÷0ÿQ÷‚—8¼¢�ÄaÃLXQŠS›ý�QÜüÛZ íΘ½¾*pÑ �Ô‚ëщ„A:¸Zá|}(ŒÞÙ…WNÝWÑ.—ÐXRÓ‡t>ÃGT %°dŠ˜¤ó¤Æ·Õ¯]ÀÍœ!´ëàYax4€\.\¦C°`O~Ô7uÝ�×j�J†�‹G\Ö}Î�r�+s�úÆœ•$eìŸwÏ@-„{Ô�q§UoBá0°"34s�݆´q¬?ÕTÔØ‰T¿_ö‡b¬T;…4Q X€�Óð�Õs“ñ2AõE#¥Hþ•1ꀰ°B;øÃfHå)üÜFÖ¥ø4È$òŠ!ïŒÄuP&þÁþN*Û÷_I/àS‹g#WxOí×/üÇšé9qßTÕa�±ç�Eh`•„lý“ÒQ28Ùî’ŸEÕaì�Bù‚øp¤Z a(³á¨‚vZ|ú-ø6G'ê£Õòúu ‰VÎ1{d²¾ oæÙ‘–BšÃ|çƒ •f3¡~ Øúñ5X�šÒ-MȰ^™\ œDÍv©êŠ@’GcÝÞ9ÚxrÖe¡Böî*„GÈ£6 ^à�,"&(—OÎÔƒsǽjïï–î#ǽ”8u}s=o¾¶®Öª‘ƒgêJ)é”þ^ 8\m€â7£¾ò›«ÚþªNã…}×É„†Âš¬ƒÑ ­ið…¸²¿[w!T"ÔÆhl…Qx¶´Bšk0ʇíì—Ñ=àN&‘ 9”œïq^$ü@˜|Ò�'Jüæ™ÕT¢‚TVÍ8™%®ñ-Ž{[ˆâm¹{e±AÛåg‹g¶ºdt«ôœJ*Ö-†#»‚áL?a•>ÊZ&2CÝ2ÂL lÀÎ![2ËgîA"R×Úlw¶­ìŠ{sf–�¬‘}´ sØâÞ^úx>ÐÐ Æë�cû/öaôü‡à¸™;`él ¡¾¡‘2 _†ÙßÕ¡k ïÚÓÛ:bÂCš%¥ ê'ÁŠÝú³X»EÝ},¸ôç ÞÞᜱ÷€.M)øà¦Ù2v‹ÂÅžt!³l&4äsª×7‘¶ï.V ‡žéïƒóaqsâC@»–gØ1$æq€QåËô€å£T®ávfƒ'2áëIYbùÊÖª¬uA9 )Ñô `ЀèX¹ÞоóÚGó 7JáwÎ6÷HWƒ€¼Dõ†’¬3س7SÀ¯#™›Ö¨v¼IÈ+0àÜŸë²J|MB{býÑÞse®|ækE Æ×ògH˜P»÷ª ˆ�[ozãýóv‹�¶¨,YùÏJß› êV,«ÖCÎ �¾¸},Mo†[ǧ¹{™0 -u@×åü�Wó$kp{=ÏvCßê—¯T¯½Qhi²b!é§Á9p|Dg8f ½G¬ƒ+å!¤Õà›e¼òȇÐɪ¡û 7ËÁD=Ó ÎÖ§ø5Èœí7Ý2ëÝapê„\+¨zµY[²–œ›þÃcNOyž¨ˆíâ9qk,²ôP5kõE­ˆ;$õØ‹bA».øq…Š¦Ý”AèD‹º欒"{UìåþÐ3ï>+ý~WW‚¥:6S,37s?Gˆ³«p¨þ—µòd�½íwˆÄ`EÌèo;«-ÝuÆ|4ö¢ï�<¸ˆpS³�¼XÈä =ôçÁÞÃÖuÈy¸÷»W½�ä” ÔIÊD£b›˜—L²Àr™Í‘QRÂëó# rœz ™¶gËÍÁD`®ÓŠÝÛ‚´Xäì[µXâê5·ïl7¸ˆä±`金¸íŠæhÂ:ºÊÈu´o¯j'¸kwTz¼"ª–lâϱ¾ûåèËu´�Ý­[Þ´,ó±±öÄÒ‚¸[=«¶³ z¹E ¥™t©.ûºo*¸ÞÕ÷„ìU�·? gÜÓ×-I¹Ò!¼ØzWÙr¨±fÒX“ŸŒÍðXÛ €n®{ªÀ¤Q59ì÷’–Ê-Ö�0ñ  ZÈLJK¹®D½Šü— ùÅž&—T%Ðýä®ýDlâ¡-ª$¼ú…’,Ø à Îä¥C!…Û7·q´K£®L€€»ÁEÙr8Qj€æ‚˜)f,!qS!âÚ° ‡ñŽÐõ�ÊN4¡•ÎÕß²Ooœ¹!ÄŽRÄ”Ž'®³×¹'0è…ˆ ãXõ†ÕÀÅìù.¸s;»�¿7G¯mµt7»ê²µokômÄSvSÌöݪ·H÷pólC�‘B?†´yÙWSmÝ郇U«­Øl–5M±ýak4e.v@†ì/„}.ÃÙÚÝ ðÙ¹)пÃiV´v~ÓðlQ'K%“|–þo·<׸ö¯�KàìÚ‘mËN't¢ý%¦ÙÕòBºÄöeDØ5MVWÛ×Áe­ûÄây|Sg:ŠçÒ¸Û—ìxÀ.`~H¸¯Ø½õÚíC–; åÓd LS|ë±k¥ÝÚðlÔÆ/g,¼#cÁºn­òâÙ¡à#r8 õ®NpfÓHLlà˜+ƒI 5öØ–ÊÃZ/¬ƒŸ)° ºÆ p2§ß>ÐCWÇóxlèôª2úãõ+éh~îÁܨ¤ãö0¬"}çSBY#.þkÁ Ѳ¡ü¼wÕ™Tø1UƒPÐÆEó ÔsΆ,Þä†Ê­ÍÏ&sg=•`ouö“Î 8yuêžuxÖ&š³ ä'µðMÓ.ªÈ�ä1F¶º>i\\þÊbÓTP– ÕW @tÌ¢([ªß²mŠÓ‘ ã03c)ÛÍ‚Žú"ÓéÞÅ©’ÃÎ@˜0!œäI{«H¥M�(àÆOém;.OñSÖ¬?‡ç®˜�:Ñô•eš¼ÁNý/§œžÒM×Rè…ìñ¾ž ×Å ‹¼×\³òä�¨ë AF€°–—§¬ŠgëÌÖD/Né…b#±ƒ ‘Û•!pTÕï°D?çˆÙq-™ì^ˆ°½;.™Ð75 âÌi±÷_WØ$F°7W¡l \�Á„24?˜ùVèãùÅ�¶Ü�Qõ×)ÖÊ“7ʽ_®~·Ùݯ›�êâ€h°N©Ì¯æX1­¼á�:Û»òæ|�19É6„‚èÊYh40PµNGœ|ÄŒz|¢!¿_wÍ�ç‰Ê œá�Ã4�™EföÇ5wL3îôÁñ¶ŽŸ™ÖÅø R:Ø[°–JAΔ[ÉCC™DîÕ@&ôD [8âUÅ\lDf ë6-Ì¿ ú&w\1¦1Íj°Ü!`ÜÇí皺®æÊG·èeÍ/d©·|;X@ú÷š»iæ5|J‚®C¯” qÚ$ÑTrÁ��ë©÷Pv+ÁxФq‘g‰ÊÙ}­·eï@ª´#§ÒÝuÉ ”ÀÂ3Sü¼ÞMêBÝûÈíS¬É£ûÄm�™[V~ºW«œ¼¦ï÷¼iÐ~¦;õfÍåT´Û¶³¼w žÂcZÛjà^~H&ƒØìXÅoÎïIn=�Ãjc‹¾w.qp‡ Ëh@éå”nû6§ÅÑþÆzÀ¥_Žg§Æs…pÜÞA0?ž)èOŲðOØ`® äNÑ�.¯C¯-zV'uG›�’Ì–É2¸íSœß/ôë{Xp+œpÆÛ0ŠÚ.ÖÑAÑÙ'rY3:÷=ë[‰¦æEÕlÕsßwQX™¾Ÿ!Ží,ZÙˆY�²žYI¬ôÙ:llnzt† V¬Ž ]|Éô>·HÒÐg}P~`�ãØ³„Çdå½ÛMi`“Ø%ÁÏØ·à¨g ¹.­ ›(†† SÇ0íià=}85cèû»ÆöïZ6Ù!(LXÔšÌr½T~ŒÒÐÀfÈ�ÿ jÅwžß Ë{bÁÖöj5!mDÔð‘†e¶äŽöjùÁ‚ÛÝ—EŠá×cášY'!Jß`œ÷Ýsø/sÒuþí¸Xôuä1K{¦c’§V•0¢µ«ÝÃkäôyWáfß°þ:`‡K{˜©ªéQ"v€bvÚ³ËæË ×€«Ê·Î 4\ز¦pTÏ›0I3F¸šÈ4ræ|tá¤fK3›äG"|k¹©U­<4œ/IR¹0ì3È'Ì $LñïžØ‡?Ó`ñvƈ9¿.JÎg‹ÒR>>�Óg(·.‚ÐÚì·�»Q„û?@õ Á—W|5C‚øóßflß;óY¶uz%�гñ#`Êx7²ä]W‹Ó øæ]XA¸Ü:¾ìZ‚ól»‘KmÛ”5­§Ðc²j¬Ó¼-YX ,!‹y™mœ'ŧïÍŒó&®xˆÕðàbý‚ðæþ³tI7¹Çü²t‡&›k ~¾…+°ï¬=Z‰‘Tª){«ñv5±�"åŽ?&�š±ø;Žïc'._]Ä@R¶’",k!±¾8¦½¹mí³0á&ZjÀ¶�×Wå¾î$Cñ�Œ+Ç6köìò|ùø¹e—XëÕ„¡6•vØéñ~ó` W°„9¢TR&û¤1À#íñúÿU$«{[ÇîüEy¥­t›¦ÏE¦1Âò®ö/U‰{ Œ¥Ls½¨JMÎ&Ù3Ÿa 4Ìð¹ö;¯ÇñùîOŽÏz||*v;m ‘C'Æ÷Ý!ûoqqô¾Üåx\@h¯ªø¿ueÙû—VÀ†÷ÞÙí$öAÁy¨£@\+W@êAFWKVAç’;Vî¡öý>Ý ÀlDO#}ÒuuŠ]P­¾_!w¬Œ™Éó4°x^R{–3_>H÷7¸ú¥Êµ›7�-áYT’t^¸¼ïH©Äknd•Ús²1…ÎÊöÀèB؉+7)‰œLpBßt¼üÑ& µsîî$¶/“Ê X»Å”4n¼*•N†`°“\bÇé–àD ÛäÁñöºÃY¢§ RXqŠ\H LsšI¤!1ýÕLªýé <èLD|eò¯ âÓ�Ç28ç­{¯¬†åAWm'’­µ39;íX2ºWø1®˜òl\ûKÒ |ؽ šÍèÌ̤’Ø(ú²½Ù²)’¹Kq˜ùŸcO¬è )WÞ=hA¡t¨ ®AWXÖà#ÛqÛ]kM¼A‡?Hk©q;¼åU�‡ù{‚çøo 4)œg‹‰¥ÖÕoŽ™sé<»‚p�wvlØk]yâåmm?Viœ±&�Þ¦¹Ö>j;Ó¹Ú]2ðî†Àå;ŠqÎmXœ…ì'4t ”ò¼ Ü2RsÆ3¢åO¡zœ— ZâGõg;¬e}Üîy³v!¶qòEò§‹ŒY�2|î-PÑ#’17`–ZVxƒ[±¯^ñ_mOÌÕ=kÅý`Á’ ¶5tÈ�‡ZI¹]ƒMªLKD%Û9„õi£5&ŃÇ*Zß!ËF`/].o~y^ÊŽ/œâm8)R‹Ò^ ?v©£Å¤7ïÛª"@ã ³ˆ8TмVäǾÖcÕ:ë]ðL1>Ò$Hû†·2òâǯ’² =¾iˆŒGw,„ÜõVÇCíCÙzµµE³]¹°æ�²ÙûV]\·2ª ÷žpÆá)ZC,li(=¿„Œà÷ÌÅÆž.iÒ\°¥wWYÜ.g¸a¾`£÷mìáíô©�òåÑ$B‹Ý07Gž›X¶ÑÕ¹ý}†ÒwIp–0ðºbò)M&!¦+»Þõg¨2”ؕ҅¤OŠøYs¾ »p�÷'±ÎôvµU‹¬òžu ¦3—‚–ÆCC’¤P¹uƒ¡?’7ÌXù�”Q ¨±&ÅWI†Â”EÎ ÙäzðþUbx潬�¤ÈŽM‚�â­„í´k=zû'LÏ™§§ç*Òn=ÊßmaìÞ€~0ÍóÂH¾úQÙŒÊÎ׌ÂC!Ûœ\üæ¼Þâú^žƒšÆw `!–¿íÕ¡!+I8-¹—’¿zwB÷² ÓÃ*‡‘0¼0÷1sök&‘ž˜qfÁ2ÉšNÏ©¾éëíd¼—öÆõE÷ ØK±•85om½ö­áç” GzÑÏ›L1­ã! K‰0Ù˜s ”Ê‚¬› (¿L+Of» Èô&Bo{&à>â1f7ÆNÉàí,1‡QìnÅ�K� ×bŸŒa@èJŠæÞ×£8½r ªmáïW¿Œ=Ó ®ñ�õîñ‘¶|[zf,Ö¸1OÄ¿c]Zš³s¨­¶½ÿ=þµ«Öx¯¯zùæsT§Ö¦Dú núf¸íþ绽–U-!Óóvõ÷~.n1Ü®Ï~í‚72‚�0ôÑżlxòä•íeõ–êiÈßG¾�‘tÄþ ðÃCÖçìvùs‚ Ϻ_Y¡¬3{z˜[}5òc¯RxÄ% oðôÔYX®©µóܬþL¶4½è5ˆDxÙö=W�¡}ì²dl¿*Ü�·z6r\Žß P7(þ3>Q“4ú»×S+ü�$ÍZœ@=ˆ!/,» >OÙγÊ4©>þ «q1<žì©°VÞP›åЩßÂΩ!âW%Z]Ü,žD iŒ’Ar%®s½/3ixxó6%ÉÙ\yb!“1@«LâYæ7¿ UrÉ&%°�tÝÕ§1š‹þ}X„kNíÎbÏUòHcò!w°›~FA[Ër»Ìí»<é¼€†1êŠòÎJWÖ=×Hã4šcÃ,ÖjýW×…ë#Ðpãlí½ÅPóŸ�Ç¢] $uM)ÓWÐ=FÝœ}xÇ꧆¶S‡½Ý ½Œþm™„/°»õ‚Dg¯–ÑbqŒØØ‚! ñ¿K×x›!PžQCAÒJøÖ± _¯sìºáèsÈÌ»b9Ä#ès’¤ŸÌ)½~ã‰õ—ïœO:œ ÷šÈˆ@ÇP‚¢Á'G2à0‡Oõô"±ä]J[ñâßQÙÛe&×–ÝÌzÉk“•}#qlú¢Î=dÆ/´ž\¤Æ(¸E\æV7&š]Ê8> g6ì²>-™'†¶Â61\z¬"ìf&ϨN|HùŠá+H(œ†g~žP‚¿Ý‹;_GŠ›6ø|z„ëS‡†ÝÐaò:9bÅ�9ÛÕÅH!¾eâq穌߿*ë–ás¹–Ýí‹=]¨ŽUKó$0‰ŸE¤�5Úçôt1€•1œ<(òÒØ’ã^%IÇô½�ñ XÁ3†´[ àm’¹å’^jº‘^¨°X0»i@–"•`:ž¾ª°\Ã4-¬ypú`>³{¡K³J¶ þŒã”?- m·:…õo™ÍA•} Ú1_6˜QøÏécÆ6ƒ¥ê`]˜—Rá–`ÊòQ‡>ðÖœH¬X9M�V£öÏ4Wîï)N“CŠ.œ¾Õ�×(;¹ÝÆH!ÁYXhöߟu”z® p¢UòŸ|öÖwt“×ï¡ó¾éµ"o¥³ò“�9ÖÚË¿|ôdÀ‡Eé¦õÓ�›XÉíøu;Þñ„[ÙVáO:B‹¼º]ߌáqèìçÂõ [™ÓDeP´Žñr@]FHªg¬RÓX.ú[()q½¼.çD‚á3Å;ØÓ ˜¹˜»{³ zûa©×ƒnX¦¸y æöL”d Õ Þ¤¡??v§2Ïn-vQ+îÞ/„¡sÈ>¢¾]$ͤÇ¿¢“>Õð»é&5iʶ”ùoœEêÊ!ì^{ñÀ€�ì™]<Õ±l¤sÛšNv9º½KÈ6MdO¼?aÕD]©šÎ¿Y‡@¾¼(ÿUO7�¬iñ@}õF‚ûZY |câJìß8w¦¤·ŒÛ ’ø@ºÈ°�Ùqå­J%6°ê#ÇÈÚ (kV¢[QµTŒÎ)šÊBò†, ëj&¡q×êÝeÔOp`DO¥Ê‹?ÀWÒŽ"÷=äe"×O”ñß5FIcîók-ù”Œ”]•� _¸2XW»Jl¡1‡9Œýu ¹Y’ùVåh' ÔAž™BwRʉ’'­ì÷tÞú!Lÿ[wgõíŒhï0pP˜´ÞŽ �¨T¿­­ö´¡¸Ÿ£Z( ‡»,òÑÛqíÁ}p÷YžDz«æ«k��ˆg‰=vÍ¡k=T_DíÕ`ÒÁ–ÍfuMtA?gœK‹^Æ®$ÏÆÏ„úÂ3‹ZèÂÌT0¾ös˜æ›Ê–­}½nµ%^�oÚœSN‚æ…­¡5: @kQ??{6$°GoÜ«ò}Ï‘œ(Wãèô[B»º‘éØUß«íÞúR<�%e£q„л†Mí«ÊÜ\¯�º0ÛX·«M¡D_ѯE&¹@¶.xœË¤!˜©ÛÛè™-†°ŒWÈÂýhü¹.2ù!ÿ_à`«ï2:Ô¶T.µ�¹®çò±ZÍ·?‡‘š,ìà·`päIîŒâ%Å(ØÍ`8É ƒ ž]ôà‡ÇŒyn¸î‡ˆ—N–Ÿ|ÇÌ*iA�ÖÁ²qÄX"°¯¨µM±ÂœXÓÛ¬† _Ú!ŒåîÃú\ p–”J†AH•”*òⲫ…Œ°�Ë$³´Å½Ÿ°òà’’Í[x[Û\ÛàT3ô¢bÂåQÔOëzáÔV®s_…£±=�Å…Haè�»»¹6?ÂûÜXç8$o™ûó‡$™†ãIÅúã¶]§{€ TF4Ë�} ä·2¥È“›†5¶ØÙqû,4 2?Í�f+O„Bf9z½ÉÙ¾ àe­XÓ:ÜVÛ‚Î1ÒÅÔ(j�_2•m�gW‹€·¸¢ûT¹a¾ÙY;ïk»Üô;h’�¹�-¸ëmH jbÝ¡³B¹¥r“I'n°EÒ둸+c9kè®jœ"Y, pÆÿ=ú»îðöß j熞á/Ñ埂Ÿ©2Þ ä§¡Æ1³p9³ûä„Q—É+m5mìC0ß(ηøsYÍî­Ernã ½rÕ,Ód4 ™Õ�KM^Ÿ~†ˆ^N^1eØ™Ïx � �±"5è®°¢ò¡8zq?Õh›@È–ÞEQCä% ¸�¦ÍïGmz)´÷¡×€ó“Çž§Ý^ ¬æOV†\¶rZP1ÄŽ¹j6ÑGW˜‹ñµ®M±º+ü¼•½�4‚ØTöc�ù±p—†%úÉZ'œ‚ª¯\³ÂŠ©ëgÞÖ^ôzú3ÄÎÃÕ¡ºQ;×"ù�ú¬ÃÌTZC ð$Q}X»Á@ �x‚™ZkŽk8¢b\¶—GÝŠ¦pÛ×£ëfju0�-w=Jí '÷ÊËb¢+‹å/ó– /2eüááÈÈÀu“EŠ+l•ÆžÚ¦Ký<£�ìû­pˉ|­·k� Ñ~Þ.`*‹pÀ •ܢХÁ ©Ô­äŸ%Ï>DmÎEŠW•ñüÁÜžßÕÇÙ‘›Ç…âà®J�CˆhÏž;†<+GÂ6¼ûSQ™?/³u¿Â¾ÒŽ»æžÁÉ‹< Û{�bÝXªs˜äö!lp¼0`»‡1ù%ù‡æ\BPBý¤SÝ_:Þš¨E�ùV¹í7ö(1ƒtí&�;y}Ï5Gx䬄šôc²8åSH…ö”—L[JϪ½~K†spw?—v=GÑ.½àkçõ±oÚ·Ôu)&µÇšè1ì ~eMŸó*ÚýÞÄ-õµ¶´,"„u¨.=[Äù3M�¯¤=ω£Ø ôÿ ³¯Ò¢Àî‰ ™×¯Ø:~jÇQ˜á‰DӗÛƒ3µº÷;ÃÚê餬}÷*½–Ò”qp¤xM’"4c€¹íø7´´hE¡0±ªÈ .ðm'âÞFñÒ™ö’»†uÝÆðšájïF†T\¤{ëFªû8¦öc•<êèðgyvž!“#ä„ý5¶Y¨žÖ 1ËÔVµá›gÎAÙ€jÝíbzû)£ÆòùWÇé�Ì˱'ªÁ•Nè¬Ö3Á Ÿ¯»ÏM¶�ÅS#»k;¶4%¸§¾Ÿ? cñ¸ÙqÐã*¶;b:ïu…Hû³óvü¸0®ëîñŠxÀœY üú¨A�ø�s…°áSõóó–R—l +V€¶þvÞñ»(nÚHݼՖ–ûài~×=+òªw–õºŠ÷/4j­Ëžz ƽ‹@}Ü\ZI£œa_œDßéßLB¥‚̪Sæ'ÒbÒÌfÓG’WX?f»lï9>)°±€„§lÁ±šqècTï’÷8 úe¯Ün-¾�ÁL1v¼ÚŠh~ó«Âh¯'×ú+G;3î ÂSÎ6õÆ-‡ÏЈèM½?Î4j6Ðç50‰5¿Š_KmÆ•Zæ°¿Q‰½‡Ô7wž¾÷^ jëÕÆ«C³XO±bb¿?w’1=t�.±Õo³�—}^çºñßC{6ö›w #K¥KÇ]SiqUKQˆvãÒn´V Õiߺ°¤ÒŒwÒá}£|�ôÎFÚÉ¡–ÒÙÂØ̲ƒò�&°AÆùu¿wÇÒ¼ój�YœZ�®C>º¸»-Ý?ºþß§@ødƒ˜Ø[ÍÌ_‹l²E’PŒò S ¯7è°¸?®We]¿½‡¡�Õßmmª÷-žÀ¦7þcÚLAÛ©˜%oñx†æ¨lµþ,f3‰Öhàiÿ¨P�å$r/sÜ(Î ÈT¢J2+í¶ QµÊ—*‚ãSV錞ïO„‹ÉÀîÕã0R0©½¤¬ædyúÍã1·çß·µÞãU)øÎøÑ5ë.8™8…]$vÛB$X Ó¥r÷9‹?Å›�¢OYaì|æ�©ÿ*ö8ã·�¶(,–L•˜wʲ.œõF,`Fk�{ý\GœŒ—¼ñLþîÞÒ æ¤fUþ×ÃÃÙ+Ñpç ‡£¶R›·ÔÜõ†4˜²´ÿc|ñ¸ó�lßáêìrê~[†*ÅL�^5{ 9ÌQél ?ÎÕ¿cÌQéÏä¾8y^�f�ÿO÷€åq¿“‡cÁ�¨Y­ÚÓ)Àe«�‡ÈÉ$g,wàxÜY¸¤öjÐYHq�Ïj7Ôÿysí0Îz9ˆqë(éžráqI×1M«M—Ëc®H݃uÔîHkJoŠ ô2s™í�ÆKr«Ðl#F½˜æVù'£g0—F÷Le°]6TâìB©¹Ôc_Ÿ€�²=Á»zŸ9z22³ÈŠõ‘Èô^çîÂâq?1 Ÿ?;gã uÉæ‘’@¹DÃÿØœ…í!pïå¶—¨±Eå3Ö?Г§A8B›ƒ,èGƒSºPû¦´V6®—ßãë�Ï�«¬^Ä÷òFtK¨M'´´t.�Ehã°�[¸Àuá…{ΈZ‹+v¶öþ8Œa)£P³ p|RµøYֱȞ:�B�n©Ðß\ë¦ñ=ÊÑ€<’ô¶’Aü='å®V´Æƒ ·êQ–¤ù€o"‹&-G¾ \*± Ãæ ‰‘|0/Ûù >j�6n¸Ó¥wg‹�¦­¿æ<…e`(ò—�ûËÙ“þB�~�Ö·u€op>�w�áåõä‰5\÷ •{ñ³#½ÿ…MtAŲÕqž¿´øÃ ?uu@žV#n>ª8!K•ú­öõ�¸ÿŒîСÊÕzp?§ís�àygœXH�Wõ»©òË/亶ÚWý6F·K]%ÈAhƒø[�ú3PÆûðgßÅ9ªÞ?Ÿ æÍ9ŒßÄܬӂ͹psÍü Ñ¡–]�;/h‰È˜¨-U­|�ª¦´Yà-FŸgúèéÿ�ÖgcM=»Ôm®Ö“ßôu�Ê'¿ÞÚʧ]·Û`²#ðS–ìÎÛò«�µ±¼‘(j.¶wúh,,â¦Tž¹ìÏø þDguGf° ‚kð¿hºÃ&Û åu­£DÝ’SÓ_£ Ôxåï›d›‹£ó6 Á,ÂàŽ ^ÕÚ`Ž•S q·�Îè›ÏòÁÉí™§g®g†¼Å¦Á<þÚ[·òƒå�=”Þ�O!Y”ۺƆÅCòféIw˜×«Eï\TÂ�FW¼NLâöjxÒÚ·!ÂÖ1çR�j�̵…»<DW¯;·eàOXœ¶ç‘¢×Èï6@¸K,×—_9&wÁµqñþEq_~ÝÞ¼ Áï4ç—°ý�L†™kW“¥t´©Û(ý2êåÍ�Kl‡¦9šžÓ¦`Íý G0Øùƒ W¹4RÎÛs6£b�U_ð;Æ¡iÄÁ£ý^ƒpóÞ}‡q|§ï LAF6ç­Áσ”两ƒèÃÇbŠtñ»d3T<vÜ®{šc-ƒ™E&´B¢²¾(3k<'ï:®pÛUý5±�pæ>¸‡á�Åå¸U�†¢µx/Ó“òÕ¥fŽxY¬^1u1,Y�à p{`Ê÷ µÛgZå+%íIJoŸ•Æ®·Á"ËhÐ!uj�Aw$ÉØ(z g;ÓÃâéý¾º×4ÖÜ�«û,Õ-ªÉžç³Ó͈O¸£§{bÁöiŽäàîߌVŒÏI‹ì¢LÌ(Þ ‘¾EÒѦè ö¼A£? kjQ …Ï:qùŒâÀØþ†bÉ=dÚeëÎh«íèâ¾üxZO¼Q·µ/¯îìÙ”[93r µ¦ç™e½S‡�ƒ\(–e£—%§sP2=§ëOörDUçmgö7Ã-sJ“ ûņCýÞ‚m®ÌJ^Ý?Å:MiϘFÔsýæÊU7}ôÏòž#ÇM[Éß'��ï½ï…|R–� Cü}u£þšþzÓ¯hÛÑlϽh8Z.P[!íÁZú®Ý‹‰›@þÅÁ©Šÿð±?n‹G†o™aò¯•Þ¿ÇøÉ7 '•,›÷Ÿì‡õ‘%6·\OžMÊjá†i¾åñÿñã÷Ã\ë½õ¿²üÙõþ_| ü¬5¿ Y;öôÉ0º(�çû¥ŒüßÉj; ³á> gKxù<ªN9¸~šæiPðíSŒ^í°HÅîbÁú¢F¡^$œ {Ïéùd&˜Á6„S>1ú:1yÙ:X¤G�±Ý„&Ü«“^Œ-cK«ÚË�¥k°ˆ¼ºrß4X†Ç$ƒb=\µ¨�´žðï!sqB’cÝÒ­X¥�ºðl?Ý[ÚiÊrf:àâS…T7t<î­m¾ÎCl˜0].#5eðã 6.Íbìù—Á“7,”°¬šLò¹b"–•‘áž+/7Ëû— Þ8;Z~ùß�@ÎpCdè�ƒ†w—‡[ŒÅ¨ZiÛüã2…8PÝ?FØ�ä:5åÚu@B·m¸(œ^Ê`wM7Y홲h ÷Ù<Ðì]¸ežÂD³4'3»Fû_c¼JËFr%ŽX·¼6AÇ"ªC•xÛ¹CL5v‹l»0+¹òr‡¶'ú’»¨„¬W½‰ÄëMµ¶¸ãeÝá€\s$wQ âµy„„ë‚ ò:5‘˜\�÷r2fãqS3ìl7‡On«ûM½¹\v+ˆAÄsûïëÆ}]÷/Èà/ó[°Ê¿IœEpãŠ`uñ—¹ æ­çc]s»YS"x²½¼fÃ^i{ù÷¿DÓJˆ [I£}¿qç™^V�JENyÚÆcÄ¦ÔØ3kù)Mä˜ÿJ¸�Üèªò™fäuŒCaØàû—šŒ.Bá�`rñ~êÞoÉö¼.y¸O ~ðϪ2̵‰Y]çAͦN æÅ”§{N9%çq[ä»ÃU~$³%¿9Våæ~+Ü4.gË[Ë-?,F*à¹Pm )‹M‰ï£@ùŽ•yÃTäsºu+Ï[Žlë© ÇŠ×éÃkîò¼½Àv1&÷½ŒãC`Õ§È ˆÒ9?›¬±7ã]>! À3Þ{ø !‘áÉ„­ÈQKÝÛzĆ`ê`³M½pJÙ ¡¨1í?¶8RšS´~%€-o“{˜P=ªæð¡š¸/ïj%†MaÜF÷½,g°/vÆ-�äšq{%è,ÖÏ¥lCA¾‚À&Pa Ñêx¥brö<‰P1ŒWíówDÚjQ48àxÌjŸj!£,Ý>HT^M¨–€H3µ”$ð:…âRä³fƒ}Ä `º¬=:åÞ1«v5�·= F9Åä_ž’êÊPØNÌ›·wXF¡¹LVÉ@Ò(¦6Ü}PJf0o¡LsïX%WyŒ"tU—“ÐÛĽ‚ó«ò'žúrß!ˆ+l9vâ1»Œgî BÁöåè,UßJ2ID“ë’'³œ¯å¢Òä3ú+}jà–M®â? 9Ùz¸ˆ0Œ‰V¿5–=ʼåÁÀ_]ÒÚ7ªx¦³¾·VyònŠìåx¶ \˜wŸ¦ö¦ìø�®°4#dH\4û ‡&zƒ®îÕ–ô<j^«uͨ‡­»¡vÿŒ#¥¿{i!¶Ô·ó.š¬{É,·&(¦&³\±ß‡,Å[$÷»ËåÁ•‡ÁqU ^1Ý$AÊvF‰eÌÒôÃ8”^žÃòÁèüß†Ñ ›~ÅŸ[•ŒdwÆâˆæëd‹¡ù0˜û'õ]@o8ÙzP]/{]�/â ö+›=+7•2Òç_…C_YM'N…ËáD„u——)Km±æn…ÃèFå-ÒëÞyï>Â`PÃJKš|¯^s°X5_}kÊëH¹¸øöƒÝ™éÜÅÔ!ªïPvÛÞ£(<˜ñ8Ý-K쬀µìOedLéoä³ÙBo”ˆYÜãw]élGŵlw2K…¢8/ Zó¤Û£iKUv `þr M¾ÛWA€ÐžÓõá=ŠÁwãmŠç<Í7X¸O›ƒË0ç3” õþÉ'(,�\å‘ƪ²Í zo˜÷ÈJ•‰OÉærå˜Ý²æqVeûïÞŸÙû»k˜}ŠßˆæèSÔt÷3º3­�ÊG’Z+ #�½Þè9�ý4y¾ÀÖ¾½gµV ¸s¡,�Y°p~\Ôò”«Ÿ{”A›æ!þK\aÄQ2&p`ÌîúU]Ä_µ «ð3c‹sí+¯Ü l1w¾Þw³~zŠ^Ó‡Æ6·òÐ7ç,~Ì×lýE”�';˜kœ�±GÊ2âØùÜu¹¼Ù_ôsêãow-•~$´f!m,ºâ\çån·¯òØ$DŸõ›ãdß®&ÛZ+*ñ˜‡ïu ‚n� Þ­An‡g¾à{�FŒ�z°Ä×sBé‚çì‘‚1�ø‘!f{ý£ ¨°õãnéìÚèFë34‰ó5õ½ròbÁ³»:£¢™9×øi ª-’4ö¸v½ 4Ú#w#bžG[µê Ãè4.àÇ/mØŒdMJáJÌeÏDœ §KÒúq2~k6åÂsæ¿¶ Éë¿w­½ Xæë?37ë$nðD–0kÝ’ÚÛ�-ʧë5»´y¹2üY2~Œ°…_3Í P´”U¼ØîW下d-}g M§�fí‘-`ç°¥«nÅÌx™ø·w:SÕkYòƶ¹´œÀxÄàpÖGD7úó?½˜ymië>[ïá”Vð]ò}eqÅÛ�Bg7xw¾†LA€ÇGE�S¤ÀO%­¬ŒÃaTuœÅ$‰4³j}8ºð~­h3šÚ‡ŸÞÝ_Nd >ö*͇5/tõ”œ?úÔ]Å¡W¬(`†ÇÏWÐ["‚ZƔƜ ¹À­ýÉ;¿BÖ.–¶M1fd{=`Ö–ŒÒô|ÞbЮàó‡D³qBÛ›&{%ݽ´Và+� Å÷¾ß=À®vû[¦ß+‘6$@^R5¦)Oz�0Ûâ)è=5÷›§Õ‰.‡[/`¨?´jQ…çÃ|¾™fŸë«”êÊ ¢U¸z'4ohB8lì›�òF¢Ëæ[c5é©O²È^Ö1Æ�t‡$ewäq¨dRŸ-Xš£ÍžòsiYLéí 6nø²ÈTjl7w@—½H¾}ú©}0ÿ»³°8ݳWjÄûDÅ<å¥Xïäµ(+¡L°*悦Üêä­+ƒÖ5ÖÚhG°X³žÓYΚ¼ä¤ܨÜ}È9"��^f¥_Ýã&ÏZõß»œ?Ú`óÝ÷\´Ó½_8åÛ¤ár¯ºäL$‹ó©Ãd)(·P<¶X!§ž[•Žùm;KBæÈÛfÑmßMÜ*çW@k‚±�2°_•”H@åÀMtBÄnÒC‚$Gdñ XL¹›ßq®_­ž ­5¥L 7wÜî#ŠÚN QØH–ÖG±7zV-ÙssºÃû!‚�µ´ýÈ4‹y··=¶Zü3ï#5-©ëæÎñ‘Å_"€¶•ÊÀ¾î9Ö%„;"7Û "±(Ý'*K6?s;±oa‘ô•‘i.çn;&EL^.Þæ‘ó RBŒ<žnÜàÃ/2ïì"ðRÀŠW *Í­9'åIªœ‚ï){ÏG�À°¢ã‹X„K[hyÖÝBÀùE`ÊÙù�¸Ò“ƒpë2K=—·‡ÁdY8yÏç�^g³vùß×´Q�O&TÀxDSGû^€t@O˜#õ�NÐü\…1%Äû�e¹8Œ_w¤à YwÄ|ÞùFÂ�Š¥)îÁð¾¥Åšye`cx㶨º×E \>ÁXͧ|õËr«(†ñâ<¢î':./1ÇC”€Iaż( è²ÀQ˧”p†?›]uBsæÒ³£ºe·j’^üİ4”�ù¬¶Ÿµ”ièDäWË%¬óê­ ¸·ÀÙ°><û!Bˆw‡z ÜÃV Sfb(_^Oîsa,óŠ…[VË@Å÷yŒä-º›{Iº‡Uê™]îCW_†ïn<¾ûkvBV&E‚æ²�~£ú]®ÔPAp°ã¬>Û:·Þ\P˜�Ë»¯•Wås#Œžù}½º!¶•zÐdz­F0” ¢ëõÞ®iæ`Tçœ:€ýƲ¡‚Ô¡9…YkRÑ£Ýé…è ¯'‚T(¾”˘� ÖÃvÞ&·ÆÏ4ôœ>¹2°b µöjAÏ3Ìdo/×NóC ¤ÃÌÕXÆùÒòö3e_¾×án=¬€È ë[Ã1�<¬¯ÞbÑùØi1! ÀîYÍïW‰ÈŽ>1fÀ•¨bD4ê`¬y3Y`Î7”;è¬#¥R�Üí-ê< ß?n–³ß¢Ò×ßS Ö j¬ïHêÒ)äxÁ!,-¥„RÒjËËu�æï‡Ç/9Ÿ0+cyØ25ó´Æ:j2¦Z;âŽ0;þ{NÛ lQªÕh»HmÊ¢_YÕPkJãdݱ±œ#�â™)FÞMÐ1^(¶ìZR<%ÔSjà ׶dýY@€¯xfЧ�‘-ÎëœéÀ#žACž4½´\}i­A>6ʵ‰3 ÜBE%̇ÄC²mlÔ�N¯[°zúg‚�Öþ.Gf}®Õ—�Dé{79.åà˜µ­µ³| e{`ÄvÈ}—œV룖ÁØ—Á.[õp ®9è…Ї Ùæ`Šgm ³‚‘{”H\�V‚#ŠáUál$c~ÁÝÌzò“k~·m¹Ð,˜zs«üAj£ö¡l ½DUÃÌêibø‰QC—VÍZNË Ë)¹°|lèDJ¼ÁÆÅ¦)û]†Àk7ñ{{Ì3 ñr¬xÈyƒÐÞþ<­¸}‹ÞÖ:¦�›³6GºaýcæMnòé·„dŽØAÌ)-×½Q9(èÃЅý‹-»û×.üð;Õ¨^Is�y�Ií;óL}"bn›;ÜDR̽»e£ë}[ðQ{Íáª%O�¸‡`]{¨-P(®Å«Õ")6íÞž–ýyu–‡aŸwuR@ÔóË~¹½0åÚp/Ô¦´‘�~ϯì~Î*Ôž9ïΠAË÷,èÝ‚ã°ÏÝÓ oÈ»ƒ_uÞò¢ty…Ëq½v1ÃÄÛ ÷ b»(-ñ›nX‡f‚ÍV÷³Ò¿V´ùÝÀR“î7|sž{µ.I*z]ä]«€;¥|Å€Ö¯¯rmB“Àž�j,µÝwT‚&0¿l;ŸÖòü·Æ]­%‘¡M§ÌŸ%:vÞ ÷Ó=º £†²ÐKÝô`$îË5¢X¾óñ^MÛt;¶¥ügå«Õ×’åV¨D2Mi€n»7ÞÌí~d]ÄwËF":ûéY3'ÀTÙ,í çAî|�Ú7× ‡�aa~ûZØ^µ+=øWõâçâ7†Òàá5²y 5]‚kìWØ%…Øàs'H–ŽimBŸË¢:ïV½þ�†g~ü¬Ø\Xryº¿ÉZŸA1eF<&�¿³kU­-­¸È|ëAîÝS5n9¾ïäL�ÆšÌ}luëšc}ã–Ú´s„ÏÁ¬oë™J¾ð²Àl•vtÄÀØK\tŒá’†¹«<-¨Vë™ Ïßzh_ ßCì(Ä Vïúý€çq:Ö†çQq6R÷@{¸:®Æ+20KWTªîý­œjªÖø®‰kzC‚‘ÿ€ÙvùÎ'¿ƒ1rÝÅc%,¥—tkHT+k ʲ‡Þ²‹Ú¼–Ní5ºžnôë?gËxXÙj}º¶YåÌ?‹º^¬Àƒ··é~ˆayñø£îK%À]T–€¬¥~A�uΤ°3Fù1½úì�ZšU¦l_eK4ÉnÙ±wÆ)²G+¡ ¹Ò6¹ Á«Uç"™pɔόD®}Ù±Gfh¦â?¦ºÞoß\2™ÄÆÂû&µ\0ËXøåíñènÚ8­y|ì3†KQ*¶f¡ce­RVfçݸ;îx_/ 5øqàOÏg=§Êvû \ì@škîvÀ»làAs¤²‡™Â÷Pú¬þvûäºE„$¢æž_ßA]ÍWt`NÝtFXìè¯5¬é–b§’P.——?nTADƒˆ©<à2ÇÚ‘{câ&1¥GrÛâ¼'¸cØ=¡Í2-€��½ˆ¯zy ãc~øC­Ø"É�·ó2 Ø Žá)‘–Õî͵lþœÜM/„n6c¬aÜº0Ö’ÚØ½d Ð[…T° ¿Ñχ¦n”@;Ž5ñ\ÃGd:Ó�d/iáÔjé>O׆œ¯¨ÏUa/�ÄÝóz3\æ’GJ).bÏÓü \¥Ê1ÉJ‘iZ‘b¨DMÐëùqè�dð1íè16¿…ž óÍÙKE毀Á°Ž4û „æN>ºÔ²îÃe¾…m��Ú~PÐKý¿¼7½o½}‡dYInYî+Zô½ŽáÒWñöè;×CÞ§tJÖ Ä¢EÒ^)øpâ:e¼³9½[‘‡�…XE\ ‡pD›¨ÛÔ„’Ž2]~ßöå|ú§‘(“‹#âó£Þ‚Ù ¿s*@ÿxo°„lË–;Æê•två‰Aœ‚²”6¼¬¼Rw=£�ŠMî±øÎàX`¤¤SšsUÍfÙ8"ñ�qð[ݦ„ˆb Ù“{�Âö@‹I0¾@—ÉtYò„3³;ÖLZ9$V[Ê[¶HÄnÐl„%,‡CÏó1Ì…þ¯ƒ�Ä$;EձĹTþaà_PE¦ºšØAþ+\w.Â%‚iLËÎÓ9ðβÔ!Ùo±³9}ßê¥{�">¡›ë…”½†‘‡¡MÚ�r•Z…¸µ'%E¨ŠÅí�²ö`ý§éN‰ÚpßcÝJîšZP¹äíÃσƒ@Ø êQ÷蟀³EH 6õ©�„­Ú£ñhÅâÀEsnÜ9r†ÖÀ2jiì|ÆB-Ð…øQ¥¹ÄûÜC%ý›ZÙSû§æÂ((A+¨¡ÊR^_ʾàó23„,$©*n»–æ£m±½Û–sÀF·¡l]AÛÙ&\iì qôn|v? +¼’/ • L»³{ÛÝpŠû«zúÝŽ`°�hɨ{­m §e ³ËÀ5º%@ÈÚ”¥dÓV%/Öã…gQ2aJk®¸Êi6þ»­�¶Ûnó2áÜ­¡ü‰q?�Mœ^ëe•r\­¢üQÔ©Ê¥Ù&fŸ{Ù’>ÌÑ[±Ö#§t�¯y¹wJ,xÙ –ØŸ�G9ïwÍ÷ªY@"��–£ËûîM-¼K:ì«\:2ï:᳋ì9ôs¦¾ŸV ëìÞëL3Éüdø‹÷”Ñ;•:ÓI«+N¤ò6HðOöÅb¯v?$s6¶”†•'2 '`0ãêKJÌŸnO4+ Î-®@aæ0åwzÅIž&ÊÁª€.ÉU®«]PÝØ]B|+±Ó9©�_Й¯`}|”÷Úä£ð¼|Õ•Røù™ÆÜÏ–DD~@q üËOO/šX}Væ½àüMŽ{ñnïÖÛ;ïP © œ¬#Ün»|Ÿ‰9ܬQ�füGPaXl…ì@jÈÎ`™_«ºdz‰ò#¶ù~Õ`oã¾ñ€g5<Ù!(` º!«Ÿ Nî÷"[Z‚^—xzw M¸»s ¾ÁÚ`]ˆíŽK¸¿eïW�´;ó¦Ë �ÔÔÚ4=ž]ý,|u¶R _7¶v)1u+ Ùü–@¹ó {:¬½óçÃ[5‹ÈFÚ}J�ÙYáo0${U4‚ ·ŠµGwÖqH@ÄE~$"˜^Ø@ä]Ö¨˜P¯®ë:‹qêüãÌØç¶±ê ’5}ÚÑy|Þ�ަ•ì&$f�Q´WÕÌbéÛž0Rd"y‹z¡ÍñŠîÉUøxjet#ÝLÝ�åHöɉ- C{É«X®ê{Š¿®a·A}.ì’Æ*—0vX(0Ày®Î\ÅmMœ^È¶ŠšL\)H¥Ò5íÇK+îËšPYˆ8ïy3. ð7<-˜¡kbAe¶ü­Œ"Òæ%Ö€ÕåX­‡GMM«{ Üù» fÙñéû!¥}Õ…'­ŽÛ6ºBæZÁ‘È�:Ù†îær¸Dp¸’îk˜I PNnîýdF´�‘¡ÂøÊ„ö�ø¶*Ÿ kd:1,jÃÜ G»¢|ÍaùtôB÷K'w» Þml=á .¹Ž~ÚBÈDA¼½|a•Ýð¿MÕtÔ R%Žöö'x‚g¾Õ#z C·×¾äkµë§·ƒDwœS'@P¹>$Eµñ±ÌO`î ³}ÍO,2{Ém`(›êZNvÛ—¿\’9bÞðÿaªÇv–>·Aqs“¦@­Á2:¡XóhÐãÛ“…â¨jCÖÞàlÅFy€“1Ö•¹Ìûy~7j|á]6h…Hˆ)!bÃ�ˆ^µ{sV=‚ž�„ `rm¿Êr—µÞÐ�ávy½‡¸ë\„@ÓRÙPss›pÇ`øJ°hsÊdñ$ç׸ԓ`é.·-!d�iïÄ }’jLà'¹1¢ ¸�VÓŠ©FH82Ô´F�-�N ç%±6i /ŽR>µ`)½Œ®JÄè;´®³hË’‰l7I‘õ{,ˆúµÒâûÂÝ€�à¹òJ¨V 0RÝR‘!ÝÁ@…’àc³Œâ›÷„9Í_ƒˆ­{%ÀØšµ³¨®\ä¬V6?ÕX��6A’¬]e^/âmxö:\Ù·Í’ 8�(¸pÀ€‡œ°DÙrÔ@íý@Bh!hþÙ¡‹ã{aSaÖ B5$œ�@l¿²Ðå(#hÈ,“jªŸÆlŽšžÈ.LÕiµœ��g†„MEAz#‰AM""5ò³x­�ÒÇŸÌ¥³«³P6,b£�Ûñ�&~–c§½ _Z2—î-yÅopÑ �<çJ9Ø´[ÂÏîVŠØß E›ra %ìm¡÷ ^�€�Ùß ¨&­ga+ã ãÓ}‘v<ê�›íKñpO,*ݶ¦|ì˜ÒŠŸ´õZöÃ8¦ï�JÎ÷òˆ!¤85‘G�6ü:c‡õ|Q+®¼òùÄw‡…Óý RÛ†ï9ØãØrv³*²}ÊC�ƒöm£ êëRÀÌ«íÞ×ox1–bÿóð_4d|ȺÊG·�rÑuI*‡þv W%¾£7Öí ß/2Ú8ÖðR,€]å‚ì_‚X¾§}é4¿pFµ“·ñ­hßä`æ‹Ëè†mZ™AÉfÇÅÌ߈-²êid ÷Á‘~—Î|ýŽt¬œ¨NÎÖnYg(ůµ9Ésh½ÖRû)y}:BfýO�BЧµ´® ¤!=Úñ8J¨;/Âþõ­ÍÝø8Qus0dß›êS_„Þ9�J6ò¯#<&™/'o¯ƒÇK;5¿gŒU´¾p1]ôXÎ…á݈î긋¥{‹ bÐ2™¤Ì@X·°h”ãUŠ"Ïᡌï‡8‡`[z?S9:püÖ û3Ëéšú_ËaÈ%0™àvå¨áóAcb½Ô»&B6ŒŸ5².´Íù .»Ñ\ê4öÄâÓ¹Þß…Ë1¦ñq1Ëçf m¾LC§“r“†w«#•»Í9ÙΓœkÇ2T‘ò†³¸Ü—Ò2_© ytЋŒ l-ô%¨¿H9«¾ÜdÈ¡Àöó5®[8Îþá»ò¥~.q# “¨õu,¬.,9e_¥¦ÑM[8âý ;Ù «ì+ýv�d!.ç¡föÁx1uƒÛ¹FAñïÒ2¬¶¯{Þ*K¾k#`,æŒôÏÚ…Ä—G:ZÃÙÏr�|)7EeÆçüú<~-u9«É�ÔÅó›² ɬñ#ÛˆÙ‚’;Áºp�_Y‹8…uŒ£e ÓfmʼnX÷E!¥Ëô¦ï¯Õ°¹trp¼q’2A’®`°¾ÇmXBP.‚ö›påæ­OD÷¦®{°…¢®-Nò År÷vp3Ng¹MkZþ¾Bm#÷¹dáÊ#�ç¹ðÏ³Ñ øl,-˜g!eF;µv0�^kaAæE9M¦].1¨ ;.Æn�>§qcç¡~¯Zž·¿s; ]÷Ÿ3gO @£XÔð÷ÿN®üÌ℘‹?H0ì!¨á@ÌÇ?ƒŒÞ‘º™�ilú[Ëjn( ˜éƒ}ȺqÔÆó­#а�UìÜëc`„ƒæÓ61T»Ïmc”w{OÌfX´ç¼uɼ•ò‰¼³? QªÚu¦cWα´ÀÇcÔ°;�`2õ;VŒ`bðqN¬§äÐØ~Ë´O ¹ù_v2hâ�B¬ÈdFD”õì›ëK»ZA*ΰѲ\Î~ͺõÕ „²Š_Aî»oªç…ðôÕƒë]U­Jt3ï)°å—v ³àÒÏÈ+×¶Zé-Ÿ2'|Þm—ÒT˜Í·ÜsÝA–þvߣj®Þ?íø(î)úÉˌۚԈÖÀ¸OÈ»ŒÈõõ¬æéVÒÊœYµÏÜûÑQ§Ÿ>?8&öÎòYp.†à,›ä¦:‘ÄbëGÍò�®‘�ýåM,uE~@`Ê=°*܃><)¹Oœö¶’' ·p}¸ï«y®‘B¸'­ùX—`ÿf ©)’ôÙg¬Md[_¨t8l:?yAÒ`¶»ClVÛ6èÄX Z÷LvzÍ<Ó@VÙöO€È9~�B\gHF â:• Ö£˜6É#ÞãùW.§$�Î.N`èÀÚ»^B ÌcFøG…¦+Ø,ÁÆ&—¥T¤YŒP⯨öÿ z…Ü÷LÜÏ% §uLkò1'm„½=¸óR³A;EÄC7Âü>®uk6ÅcHKCï\Ð}îé?ìÚçÞ·pö¯e§åך½eø¹ C·…¥ðÐWè!Á1„ç¬6à‡O¡ýV,Sg¨Y§¡k aœO²îåœàÄ̲Žô> V¢Ìf8ÖÖ¨K#¶é Z[Æ0£S½êào0ieèeªš}â”oYšî’ÌÖz¨„´ @pðÖÁVá;«ªçX_†%¹ÊÍÕ?°í*wÒ%�O( ÕÆ34øŒ…)ÇÊoæ>Î9´‹ l‰¶¤P'šL"44ÓRm)œ¸l+[œ†SÛ‹¾9† T r”› iIõ¥Î^¤]®;ÁyèjñÁDÎ"Ð1E:å6Ú�3cbXOßcŽ–Ë -WEOÞtºÐW§ËŽîíËSÞQÀqéºmצV­`ÑmE¨Íu« ….³j¦ášhS)ZK˜<3›©Ó\òŒr&´‚·hâšÞE×ò�¦ Á½›õŒ\hK”>e>ƒ9.ªŸ`¯h³³Ø�P ÛðÓÏfÈ\w>Ööæƒ}WË£ÏÑ"!&ßó¥þw?À £”å’£î~‘Ø^·ærÃâ³,ñ>)‚Ùï´€E¶FN fÜå ´¯a¡,(‡WFmý \ÔîôÝ;Ü.Û+ZwE삹Äq,¯ƒâèÔiбtq§9øûðW®ñ®ÖÓ‹¹ é’ÕÙ²E°-ó]¯f7ÆCÛW@õ¸Š�e¬ T¤¬”>uv,�œqkWB'Æ Ü�ŽÇ‡�qjOÇy¥ª¯<ísÈ7Z“\Z‡RV«ØlO4Á�I7R;cÍÓ‘…ÂJ»g´ñÓ%¿sWMÛvÍ?ɬ±{R^«ƒmÃÙÄvÜ«e2�†í©tþ¥ð�ûäEX�ÏólŽ]µÃ\…˜õ¹ ØË*¢`�ͱû"ÑP^“eT‘4¾þÊzf»)œÐìs5nj,ÂÞú»»cwZ±ˆXÉ,`¶Ñ÷÷a_�²ÑˆËæk$ì)jÑYAw³·wê§r1Ï2ò``ÅäÒûŸÝ”¬„‘b¾ž mÎnNÔ5»F°{}³^n=æåÈ45²ðU÷¯B2XyqÎ.‘ t…³›J[¬.m,Ù‡Î�J…<;¹Ýn—«æL¸·æt†Uô$µ5G›74ÎŒÂÛÀ?»xøÛkœ¿–ˉòpŸ'u¼ñV³ÌÕZføo{™îQâÈâ:>cÂ@ÖP]1“÷•, “º«íêt'¬ÑŸh¬+g¥ŒZœÄËèpuß—"‰°â™‚á<új0LUŸ.æ��-!š©ìS+áÚ³cìÜV¥4l2À–µ�Þ"Àêˆer|f’„T±ˆ5]+C°Â¬(ºnÌ8C]¬ùC@œ Š-Ø] kO‹âŒoót{Tל½SótV½J6hO&&£Y¥ªVú)?ÅÏì+^Ƽ,0™ Ò6x”í±zžrmŠäGвü­ÆZðdÛÖîgxÐ#&ƒèJ{‚NÉÜ£W¾þ¡;9dzÍuL-%+›·ìXž  A´9�JñÝné‰C΀öñqΗñ«ÓG /Ê Ž¯‰|—!ƒ<IŸ•hªãmãô€›¥ñ;ãd{gÈßL \[IÏG Ë—¢Ø¼ŠQî32jÖaoÇÌLcˆÇR˜jgQHQ˜ûÜ–ð7-ÌÏVàÓôêÀû¾Ð¹ð…´�÷¹}²xòŸ8?O{‡¼û¤*þ1úöx4Ϭ/ka¢âë.#&ª1†Y;°?Ü>|WäëÎ\y×hÀWk �WÅ10òW%ÆõÍς ›íÞÑÍ&ºd¸ ÿTrÄ_s„ÕÚ®‹j´ºGN-®°\=‡X^A™c»¶ÆxÆ’³@ à›-ÈÝ3½—Âôù¦ Xo}㽓�Í~լр€ct±Û).·HÆ~Ó+à‹�®±ãMœÑRXn¿ƒ)ÉDOÒe¨è&K¬›úó!mÞÔûò,ãèúÏ6‰òqcÝrþµƒ1óòûÖͰë{å“ì{§Ú @üU¼é\0‡cíNÈ [é•…? Æ&—mß"MáqA#&eåÐð°ãT�`~'ê2Z¨ßAït„Õ¡"F³¹i[½üM†µÅWÕVcý>hÉs�ñN5Ü'ņM¹Ë•)ÙKÃl Ì%Áâúº�/¨~Ç}a·1+´Û�[†_@qByGlÑ×ê\d¬Ž_y¸ÉPU¨z%‚•ɨ’œ]7N6í’¼ nÚ‡F»ó^¾óE<€ `êkÄv„% Y×п1Ö 7u é>ð«§Ô¡‡žÁkAƒ¹F+r‹Á‚ 1C‚=fÅé@� ‚̈Ú+=Æõ6–D-Î0ÈçmV=l‚ÛŸZ�fï>?Øý &|Ø.²za'63]î嘖(Vn9çêºËg¸EÁƒtWtÇ™£a· Ðæuêúõ[ÛY¾ªz¢‹ ØŒ L^ß[SѺ‚è5p9ѹÐì‹4IUKVÎ$[Ÿ´­81·¯²ùÀmû�½œ­zŽ› ¼g/Þ0üè�vò»+F.ëùvòm^ÇÅšA‘€›b¬¨¤£à­¯'߯/F8ph/ÝE°f^›ò�šœeȆ 'ì…—YŠêÌŠ´UÉ4z—òëeZ•R ösC¥šG.SQ•®åœ #¸Ë]š.6NŠž$pádæ2£Ø}0h°€™ò Z¥^t“ –ÆìU¢ÔYÝW0l6aÃÈa¦¢F‡ÓFê&Wáñ¬”ƒãšPI‹Þ´Ñ‚3·\Á5á;ì‰( (›6ÉÚ×–¢¿‚|¡tQ‹|7 GÎù­�ð_l¬Ö¬Ýî™�‘áÚùÍ|–4 h·H³”iÑõj¼ µ>¸õ¹–Êfç™Å ~çªHv¶«>1'°(pFaÅã`ø\½´2>[s_Ž^¡™wŒ²„‡ Zóz¢m%5{à �áòf7h4°ý”Ãók¬ÛH8ž•ŽoNRÙÓÝý0ÿ4«×�ˆ¹A�EI*ž¯ìá[P~VšI;þËTF•¯~ piªHG¦/³Á…•1kä`¬w‹Mˆ €AÄ›qh Cÿ#3âiªÀÎd—¡UŒX±’ ØJÍa§�L �1›žc«s–ƒÜ_9ÐÚ°0f èÒ£Ë^å­”�‡ª´KE“"t¸b Z F½È"Ú[Æ îv±W˜]óG€ãGܯ6£‹í÷¶³ŸÝ{¶ô¢¹wŸr0N¬;é˜pÃ0\ÛÍ´†8™™›ý©WmaÒæcGêuáÒ1À¡Y#óA¥˜EŸlÐÎEm�ïl?ÕõÓ”vi1©3UæQÉPùä&ibuà™•ølÓGúÇ/�¢«6…Úöž�Ëszã"'ïØ5`ÁÛƒ"3àŒ} 1š£"ÙbùtöLUc™©>óºZ±Nw‡ü9H§íÀ�‚‘lü \S[þ=qþ|cµà¶4â%ÑE¾Î¥7DQA)k]Ä~ÏѽjqŽØ½7ýRçL—ìÆÇsÅ•¡ãe^ù¿¯ § ¹Çc²]õ¤Ž!Ý­Àeµbn£Ó‡±brvëìmÅçÍk°V1Œ¶o»ï-!+6¼9ý¼*\ÿB3·æw:<ÐùÖèÊ2ñ%> °¾ùª¾5—?'3÷ië©Ó7¹%Ø}q’'å& ‚#£´»šˆ¨ƒ ÅœÒX øÄ·žµÛ_I#h‘€rµt„ÒÊÝ�…xÉä¶°Öö_¸�ä(.tX(³U]Òõ¥îr›P— pÄŠW#V栙ʫ2Ńe"R `�°,Ãf$ÓZ#Æáâ9PZîjñà¼x¿.9lÆãU;½ÍÍžse7�mqp;åè Z‹kŸŠc훽û“Wo ýT¬S�[‚êTeÉž>wƒòSãz‘�>‹í$„k#ånz‘<ÑÆ|Þ²vÁÃ'4z·W›(i$:ô*†Ú¼¸ØUŠ(ÇQ ÚÕ#ˆ›š¾ÒÑ aöÎô—LólF·+ŒmMyH-¤qæ‰bׯ›µðD°ÀŠÎ67Æ”€ „[÷3ÄÞR.û,œífÝ>?�Xz j;)¿w‚-°îMW ¯¹¥ÏÔ4¨ãf"ú#r@Š`„ ¤àÊ–B„i“ÖÅ8/¼f.×yRü±˜ ›]–ü÷{l‰ó8d›—D‚öæ?snurŸfg7@‡cdÂ_;7xòZ4�>OïÂ~*ÜjѱӖI2Ý”¶U7Íð}@íÙªíÖ»0¾<\ÁçüÚ¬ëw<ÑIæ�±|FÚÎ#8ÄÖÐ;éjÔh#âg…`ÅôÔqÈE¼®M©$¹®ÇÖx³"h« j6ÖTZ€ºj8l¾»¶M(Šd ô×#›´S®tŽÛ ÏãU!"K¬:)�¨®{•s7ñXp“ñØGÛ Ä û›áÀG"EÅÄöÇ€m·,];ð,�~ uÁ€î†z/èò+Q8é›ÌŽEG�pÛ«¯�É;#i�È\*¥GÕ£°xSûxOØ=¥  3/ؘû^åü „�Æ$­ó“[ô¤•lœu7ë”Ý‹õ ¦ú1é¯\•§b0PM¬1!ß7Âmo­KÃe/ºå‚Iá‡�rë1_rÒ‚¼¶*æx€­¬Ï×Ú„mò¤?3¦R¤Pë�_‹¼!‹á\z}¼x³WUÉÉ"é5‘ŒI�u[¾nqøã6ëc|d`°­ÌjvŸ_†¥wú9yÒ�šgìò²Ö ù’a%ÏÞÌ©O*¾K®1¡§DøqopŒ3>¼6CcÝ.öbqAPCKíôòÙW½ß�ZɳìVΗn,W y°›’ÌôÝ_>7׺pY0+kJ�Ìá-“A Wµ¡†÷úò–|Xç—0'B:y s¾‰ iZûdü@ù ÈŽœÉ•æDÓ?»0½}ç,;œÇê*ñÙ¶ßs´›y2×ÛEú¯?g¢º:Èdù~ò‘30¿·8ˆ9Ô%ÃÛ—[ê 9èß2)^‘L0÷1rð_E}Ñî XE>MÙþ®�…·c=hˆýÍuœó~oœÌ�ä*í¿Ó·Ò¸#œ­½˜ï´Y*#nr§Zµ€v†¥‰ ­ã.$, dˆÁN(Â…9G)èC‹^ê`¢<›õwSŠÍ\7“(ç)À±sLø”W‡hâù³q·¦÷Ïæç{g»½æ×r_Å®fÞMrD–E�´C2º®ƒ¯ÐNewºyJ¨l·�)ìåæR½¢ÞxóqÄw›ÝI ¦udp(£Äˆ¼t-Ó¸õÞ™jg/¶>70!_ ðÐ]ð w //Hõ»føL¼Ðæ6Ý �ÀÁ—[¾ÕmùßÖ+(þ`kÙd®™õíéã ñƒ@>Ë|ûy`Ãûkï)e~ѳ/ÓärNfüΑE«##ÄDu‹þ¾Bú„X~Â0£§‘9³î_ÛÒC.ë§{È=…PÃwPÑü‰›®3½Óiút*‘×^­«¨‚|ÒçŽ XO°¿Vmú7N|Peæ.`Qv]‰ïfz=Ý Ýßyc&zÓãðüáZ´å{¼ULŽE°92FÕìÇ> %ã‰-ÏJ#ØòÛŹ²W=‘Ö–ádk  9¹Ï­_Tóãá÷%Ò¾MFD95#¹?“êØ4IæçQN}×?PÚÜdD½éÝ[Va!>bÙ¼™àÑíûD»øŠ&g•–iãŸ7\¼½‹àh�Ib§ÊØ7>‡ Z Ðürj;YÆ>­â,,µ? s:0†4¿RX†âXJ\WiÓÍmIæ^í‹s’jÈEeØ™å²�©ŠuÄß È/ƛߕ¿�S}ð0/®p,tK'¸5¥3hMžI)ʨ߷…A`;ÄKÕ€V% Ý޳T±‹8C Sð0ËWdɯeìò„*V^á× äðVƒ"Þ^;Þ×a›®2ûAÅíV@Ç×a^]"o,8¢¾EùŠR4‡ƒô-gW߈ý­°–ccExoª€Åõ»ú[\ƒQ{¶Òq2ñ&^™¯�Âí�[nÄXAìòǸ ¥Ïé3G?òûF{PªD4þB®ðqCü;W§OiHTAz_¢²ž‰‹{yïÍ›ï:Å?v ûwæxc=b:��šâ�|%Z<&bî[¶ð �Gª\*ê£É›(ä¬~®x×^Ù¢ó¥úT¼èI~ ù¸˜ ða•)b.•ùÙ ví(që2ƒ~“R¦©µú¾WE„ô÷8ݳõ˽ ÆÚW%ªšß[éËÕÎ^—Yœ�f4M¬¬¾k/<¶+$Y·Ás aÛéËi~á°�ËLæ¢0,UÁ˜OWÙîËê蕤•@WA›¦„Ö•6®÷¦ï·žz[AGvᆷ¼…²­Ž^IùA¼*®‹Çóq-K6”+lÇÈ¾æ˜ g §`Ò€À-%ê>Õ‰�=µ¨9ÌØq7@ ~•ë¹RA›Z'.ÅÇ4¼Zä¡¢% 3Pù:Ú¹’¬ ~lB@£\‰©Ýðs¦"~-ÖYuü6Aý*åíøc[�š.(¨/"~ž&À ë= fsB­f…ôLfò˜ð ÁÎcs…–^5<¨ãÙêCg‚BÅïËÏ'ú͹D MçìTKØqr†„À;dÕq¤š‡-#*d:•23|Žï G4y›QÇW–…Ñç†�»Éü–7&Áë'o!6•5CÍÀ߇† Ÿtñ«LÖ uº¦7}WL«Ê¼× ™CÉ]²çØç²{sûj/×øØ>î³Ù¬�‚¹-:Sз›µ¨÷váÂ;HŒß„‘×!³È�`'t@Ì’¦yÚ®Ûd†7$éVŸižFiú›™ÉUñN £i¨V fŠ_³u¢à&Üòjã¹0Q«U“\ Éœ¯_§W”²�sºÜ g�·°‹vŒYTã � “ ƒ�”�>Ñ凥¸0öµn~ìùB6Àˆ§>C¤)øAÎßx9µ¼›Ê龯ðÂ_¤H�!f 5&Hþ‹Z�E† [¢�{3ÒT@x�<Š$~6rFüOèrEÌŠ.® /Vkï¼&fÞ3f½ÌÖc:ÉÀÖ-ŠlM˜âú-«`³J¼*m?¥sO&äfY °È]¤šÀ8Ûjr¶BèôiµŽî¡ÇY‘F‰†¡`«ÓEj}šÞ`ÞÀz¨­wqŠ8’ |þ‚/œ‡n¼¨º½�,ÏwŠÝ–™æòbL½ÀÚ6‘· ÕŸO Èyùd” öOÖa¼SC^©-ïyŠÎ¹‡{/´ZÈîz‡p¦Ãn%¾�-‚‰;7îípX°øè‹Ääƒ#4�ϵšÁnñYFh´íJåÔ= e5ó5[ŸÜH4qÔåÿG�JÑ¡}…À÷M5}$e¸†ò{×\º99�wn D7gF¨Âm]%égWó/5¥)Y¨t<àû³ÏæÏ ŸÌàÈÓö,î!¡A°È½[_èºÄB?¹·5ˆ ……ËÈÛ£PÏ5ó‡|\‘˜s~m?#‘Y¬Á �ˆÃ1êHT Þçé,ŒŸ°ÐØÖØÅ`ÅÆM6ôµ^&.ï'ãƒ}YîØ µ­s²½Mâ¦Tû„3A_N”rMH€î·Œš™]‘¬Ìmò×PMÜqÊœ„—ß¹L6f·k”/V‚@‡ aúÎu ÞߟP;k¦…˜J^f^t›{Œk¶Ã�/¤¾g´ÐˆÌZ˜�N8h–š;"B„'WÚ¿sZ·ÛÄ Q ˜Ã M–ì'4a·ùùgŽ(lœ "d�¡€·¨¢÷+xgþö,6v<3®ŸRz4½Z»^Þ[Å05ù!÷¦‹Ccê& —Ðæß¸YúyB±Ø"û>Ds›wðmk눂DÏ«­V}”�.ç(iä)Äb¬÷ÞJºÁ¤)é€Y$*“úÀ[®ð&šô—>¹—"�Ì "Š=ö'ÝÁ�€¼Hh‡sZmŠ]TÇRO¬7Ö€˜®ððbú¸µû< _KÆnÙy²ø~3ŠO‚°u¶ò}%e.¿3åÅ\⛂‡fîw_wLåú®U?GA°¼‘bÜN°ƒÇNXñ|ª�›šÂÌŒRÒåjh–âÊIFxÝ.à7$';Æ¥Qª>ãÞ5+’ ÇÖ�‡w†Yk¦ýb Âwe÷͸ßÒø‰ÒÐF\ÍîzÇ߈-S[ÞVw¬ ƒ}œùƒï4�‡)0Un_»&—{» ‘oF3 `…ÀãkL$гŒàmÕ¶MuÁãY¡1!` ä%ެúܵÏ©…È™ñù9ͲO¹ƒ¤RØ{ Ž'ñ‚«J —*/ºóÔHÂß`–ôtoõºËá÷Ëf{#>ÁôýKÚ)Ù¥ïÓÍPaÿH[»ú¾¶g]»‡Y’\:m³ÄºK2{Íû¢¼ÓF³¡y¾( %@nR�1Úí�>hÜ }PhžÜ𷞤�¬™2×ç»Ü¼éàöàpÁ�1qXf–µ~±ït¯“]á’w”¶õ�Ù:¿èôœ|í? Ÿ¥93;ÍÍ€ìûíì®Ráf¥Õ;Alpb/, ärsë’ Í�‡4tJ‰«Zp¢å+€ˆH@“Úâƒò9 Bùm¾#‰jF„Âl w)f™Þ.ä'VÈŠ…€[{2ÅuRD ä­GË›Þy«3©©š8qCži¶?–Ì‹@gšvIèk;ÈoÀ…"yÁciÊSû1æB…ƒìÁ“=¾ÇŽ`ï “](*?£sæm°iÆÆ|ŸIºãOOÏ• ñhåühÔÿrò’ ¡½ÞC·%÷uf!$ ùv×ñtÀ¾gúØ’÷’b‚,ô=•›üã]^%Q-þí­k.^ÀÃêkh;è°q¹Ø…ê u6Q\ÛµËÝéé`1�†µÂ/íèv6I`0öÁ~„ÚwÊQµ¼d¯?�4 v†vŒ�o¯Ön_DnáųKcgéG®ö<þp¤¿£d˜ÍQë·‡ &,`é¿éš'3ÈjÔeG-ŽÙC*WrU¥Š’Ö ÕÐÓ˜³^úàe°Syg– hЯ_ wÁ˜yvÓ‡3ƒÖ¡KQŠI¼ý@Nœél]ͽz=: ø‡”ÛÓRµÊq& m}eMäjð`·¨ ÃO òz¬¢î\Ï1ÌD„âAô„~x1Åî.½4 iSRÓXnXQ ÅÄ“SÔdDN•7ùD–v>³éŸÚ'ÓóL)ÇÙ8ØYA³Â7PSMå[‹Þ2R‚¸7k‰\"°�N«B¥Ž”¬¦Ÿb/yÐ>-!‚Ð k û¶vù×äÞfÛ dx »±~) 1WþeYᬙؒ»ZÄËá¬"i(AÜ]ËL Ÿ—¶ÀØ,lÂýžúù¯¡ÈÏD˜ü™*tªŠQ]óááá…B�-™Mþ^Û6—9œ¼7Q²Ïp“³±‘/KínUØù´r/gBÃ8F彆ëä†íö¬Ãgùöäà,â<�怂„ÃCüÅoá-Òëûîgyï¾»†n@y^m/n¤(g2§ qAQÔãEÌ´ôÚ /*¸çí=‚Ú½�ûmc�5ïK�j[Øè®�^žjÅ|�½2? };•y3ª’~[×�Nßgï­4üíϸapç*¿ úÔ_]®¥�B{' (¸dy¯¤¸ÙÖ&ºq�ä‡ _fqµÚoD§.­w³(*Úl:VBwÁžx—ÐŽ mwúÞy¦ZÝçxË®`³j›ÝÖÉ6'6u“ ;U|¹Z6ˆ”��UÙñÓØï¿'u !¤7�mN­c»ä$o})hÂfï¦yfÈ,à“~ðpUåÜ6Þ宸d>¿SÑ“ìm´*ä—ZûIò„2NbÿÉÎ ª†ì \/pÞ·* yr=à/À;)q3d¿¤ ¯ W¸ÏÑ#¼Ò%o`}>‚‘7b ×¶åÎ Õ¡íAZvIÝ<¬ HØ7«P"s]KÄs7m½EøW¸öqƒŽº…Ó÷{ÉGº¤Gae(L;½s`=ÅÍ�©G W,òû–ÕM/ëÝ6Óeò‰´Œf Þ ŽÛnïùÚÐGƒ(7"ÜåycàãèåÈXyeiÍ}¨±Hu¤Û²w¬´9.hUCÞ‘:p�h‚1iÕ�²;�H¬ŠdÇX{¸¿tµß0@v¼m©lë^뿵¨ói©ºÕ îùRÿ«veÆBÈ'´&÷�g †þ‹“Vòà:�Ô)¶úµk^ßKà°5ÙiS›‹"°Êù± 3$qŽr¯7| Rk+€XV6_…;ŒÕ°ÜÎ "^g{çMYYFqÀšÊMè„€Ö¬Án$ÑEÞÀò y›5™ãiä/·SÏ”z}FqÀÐt=fÁ™$Uq+Mà4ò‚w[ÜôÜzµ’_ÔƒsH¹óá/¶·Pà°Í±„V¿rö�½ºûR+Ì.ÎÇQ˜HaëÈFCžÊPÏ~éªøl‘·ùžß*aýê“4«a´QØ_ß2§Uù¢;€Ûèv²òî\¼;·”z¯¶a°-Y „>¤ö7~hÚ| L÷XÅt¨Ø:½H¥´¿uç· ¢dÜUÚ°ó;.ÅËvÝÅz3Æ|N³e™yã£,´hŒ•F„û•Å¥éë{[2‰lï•tÚš9­žÂ¶R\#Æ»«dšF†ÐK‹'™ôªè9N_ß§ãiP¡¿pNWàØ— z_¬}Iq Óai:Nðú´{°!¬ˆqE�> ÷Uªµ¤œ÷Cî° ‰Ÿ)Ý4ñ˜c#ç{ü ©úŸàrâK+j}Jù,¾>š4ûe[i™G[vQlÌ{ïŒ}øªEGè.íÍvÌä©Gî—: ƒ[¯l×9ÄÞÃfÈBn‘7_4ÌÛH4´Î!�)ùoŽ&×§�r2ÛKÒûÜÁYt ›oªŠ8ÜÏÙ‡Y¿Ê¼cýÓfGDä]þ­` Ð?,†B�•r@'øK7»Ý$² ªå˜�Ý%eªLæÕû¯ l*” ›BdR¢¥|g‹”�>â”!�Ù_G"=ŸÇ; MB\ èd¤—V!+,Rhv‹3ýX›÷ï”±“ÕYë¯F£¥pu&âµ£¼TQsˆ?KÊçŸsëÂç�!ÐCRï¥P"Â&¶ £°¢Ò ±Êì .«mvÜ(ïÅB˜ AÇ�°Þ¯¤Þ˜ß iÖé—»ºDƒ,†Ví¼u+àk^Â#ÕU‘¸qu*ZÄ©„>ox·G1“µï2@Èíð)ío=Ñj½B ©ÌHÒOP#³+ïAýÕJ ÏGL[ÌYsïï,8�(°–Þpq*œC7Ò#YkZæ°ý;êw_ð5ƒçì¡Ü¹ {Ø„,ÖÉ· ¿I&Šc#NAa¸¸‹)ôO:u‘Jv>xÖ0|„‰ðH1!Ö¬@Ùæ8< "ýì&nEÖÄår8Z¾w=^ÙÔd7Kêüçz”"å³�ˆk¡A‡BŽ!@ŠÈ ?j’WΫaïò†> Æ’Ù~Šð&�gŽ>¾ ø;7Ï'–ÀlͦZvÍØi‰£@V“í³ÙŽUñþB1UEµ%Ñ�²®›¥œ:(F1¬Õ�¼ãÀhír¬ÁëW‡–7" &^Î*N,¨.£²Ú|þž;š-A5(÷»Í©ÏTðJ©K¢å8.¬Ú»] ¤!cÐ¥‡Óýj–0ÎȨKwʾÚÓEƒ¶w1•HZÈ·|àþ§[7“»¬æ[¼”ˆüZí)ÉV�ÂËê´\Ì<<ùAÜÝ\¦êú”6 çx¿ÎÁèMûJ4e¢ŒÇ¸ ¤F3»8… „;Ú¯‹J5ªß`=6ÜóV¡joݦy—0Ù–®j�—–«ŒÍstã%²SKEÓ<¨¨ä@ËηPÊ(¹‚Vto^õ}¤vÜÄS:�"ø¸}5ß.;,ýÇÓA^m� P€=ㄞŒ�.·�p$(5`ïKí¾ÁÞÀ�€£Ž¿ M½¹�í¯nÞÙ°&ÒòÒ°l]³ms ¦oq}/ÃJïß0åͤ8¢é?OÕšsÀóÑú÷·u bFñÔ¤¦ò‹u}ïQc‡¿9RжÜÛ/ÎL6d•.¥å·tf ûècãÓ³úû_ŒWç %·9C6.}È1‡³¶™…‡oG)º@C½6n¢<Ý–ù¤kiÄã˜ÄNªò�™}L½µ/ ‹5ÒèØúó�’¶5 2N8LaZG÷ÒÀo5­ñv'‹†}�/Þ!ÙtÍP¹VºîÑYˆRì‡âå‹ÛÔÃÒýê…�g¿pºdŸA¡‰†ø¥"ÝÜýõ ?°jGŠö·+ôÆ�¯æ}ƒ²BA7„S Êú±€ˆpØ&aöAñcÁµeöO ¯iŽ"+µÁ-ã;˧Žb76ä;lXyöo{�Íh#.âyø‘—ªVip·IÀmÃà±wç}Çp‚,³Dëhqä·/hƒ5?Y ªÕ¬µíc¹�#›†pN2†m’¾Ý�1ârÁcð¾pñI¯<î‹|€• ³6×€Ý'^;ºU¢0Æž F·T"a¶V0`÷-W.ñk¸°?>šh‡˜váG’C/yÈ…« FåçÖ*ÕûºÙn•:Zç´�Öûq”a;ÃýÃàXv—!mÚÙ“]¾²K (*ê…-cÖ#I®ƒÛÈo½%o;}&Í�¾é&u–@5óÍ˨E¤Ú~ÜFOÃŒÎo?4 3hµ�z˜´yFwÔf�gDÀ[øOÔà cN?{›¦†±:¸a¶å*O¸ñLeßĂŹ!¦Ü'šdÞr9¾þÂXg+O¯u+²#%¾³&”j*g6 Uïe’câæîÎŽš=_*ÂGI3•¶Cèt{ʙؔ†ðÞßè`ÏäKG­áÒ¡¥6x>Vl˜>eéüšb£„ì9ªÇ/os¹Óã´Àæï‘Û”<á—{[žôóc±ï›}3�j]qnNªYZÁ$Ž‘„_i›ád'µeýtݱ»h«ž8MäbÉ|Xç„ý å Y1™„\¹4W„·«U­Y ÞEh(râA�^rõû+¡¼lê\q'¦fLƒl‡ì2ÏÙॉ¶;WL©�þÜÒ§¸€ÁÏñc‹ŽÍŠK EóWÁôÒ¼¼o‚<ûÚ>\5®Ñ^ž$kL`ÍrÁÝÖí#Òʼnûƒ;íꮃ…´¤NW @?U=\_OD\pÀK•Í«>[l4¢áóÀáä—C‘È–a h@‹šùCr •:ùZOÕŸ ›6Âþêݤaƒ›Åø¤s_—5¶÷z'¥Ô0Ân[÷·e�õ £ã%µ�ˆŠÃ0³#\ù¬EMfz³é Å ™*ÊWŽ0´½�æ­š}ÇeŸ/…O_x»1·4 ‰·SÑø}†ÔÍ.ˆK|æl ½ÁsðÐâŸ�šT—¼mmœA&‚Ö–̈|ÉÝ(\KØ$¾²Š™-ZÈï�{£C Š„v=çÜüÁÎážv†)ƒn Çå'l7âF n¹ ¶Ïdé{|«{JkŸuzÙ©d‘Gß ’Kl ´ºîÀQ‘b²êžÓ%O—ÃrÁ¡O)¼ß7Ý�år3»£…q>²ÂPÌ|¶ôE± ª7€Ô†ènHQ-{¸ÇÆŽÔ —vÃÃNµ6<Ö›õºëUߪo†sU@X�cRŒÆšÇ.N\áVel+p×0û…ÇÔvwojÉ+ °ô/[Nä‹ôŸs/Æ�f�–¬|Z‰”Æ´[Èì› “M½F1D± xYrI�>f]âט¯Ä¡~›ƒÃƒþµˆ¼—D®-Œ>Ð*�IÕ}ÃÈÿ[ŽZ‚¶¶ÑwW œ‹m›-âÂfP¯ÛFx9Îè÷iÀ»A¸rDí¬\BLse˜*z æÚ„—î´Í®~×qÀë•êÆ-ƒZëü¿5zß 7Š»F2ó_Vfï²a¡ÝJŠO.Ôž[^Ui�Æà9lÒØs¿'º¶Qž†Â•­Í$üêÀ3¯‡ w Y|cçh8/’è�η<ðW— ýÌ•Œú�7ÁÃH�Wï!f'.ô&ž{`<ÛÆÄÇðÎ&µ,BÇR(C $ûo�Æ6Hó{ÓcŸA˜ÇAÌ“;1Æp[¿ˆô}:>iÙ²û°>Z`_÷Fèù$âÂ:¬*kíø¹‰þNF¬ÜоÏ�nôØÂГœ}u¶ó^.yjžŸ>ÙrÓ×-ÉcC~º<…ÕUÜrÐ~Ú,é]c©6ßËôs÷àÅ]ózD ÎR?ý&X^¬œ„È3ÒqŒ�8€¸r›è)ÿ9¨ü9¿¨\Lú7¶ß¨î«OBÑ8ßšÞÏ9ÏSI•Ž0^O<ˆE°F� ÛÈœb �„3 «(£P¹ØkUõJ]›X°°æNT÷/xtô}�nîØ¿TélƵ–ÉÙØÌ«ËÇoÜÅŽÀ9�¶÷/Ip¾:tÀ�/¢¬ePJ"mmh È7d˜š©MN5¬:_X+ëÂÀ�TkoÇ‹�#aÞ¯’“ølúâÀ­ë=67Éw½NÜ�ëúVå­È�ob=p¼%�Ç–³õÔªÔÓ%´’Ý{*#wÑNÄA/Ä)¬Š|g&Áí÷´¨’ë,÷™<ÔŒèÐy ZèÀGãÉðp]Í•#öü¢nxZ¾0£‚Š…f¥Å¯”B!;<("_:8y #b©Ÿ&w¥Â´M|W@È„«emÂEƒ«çU¯R(Ñ Òöô³ß¡œõ,ì 5ÉßDж)Ü„ªõ:ÎÍ“A-Û OåÕúò?jçÉ1’ͰP³ 36Y@L…AsB’R½2T¥ç;¥ˆ ¡vJû„bÕ¦/mŽ!œo‡¡R îUc­}‹�7;Ã,7°íe9Òúª:¶g)‹*hU�:Z[ýͨ‚û:Ïj׳¾-¶Z~T<Ç8y•º[ê°õ󛊒UmN­‡-|Î,Ò! º°è9÷9¥€š]å››0…µZÅÍÑÁ¨AÕ®`¢‰tUýèûµdÜâï¼d0y†4À½¯Ä�žõ—�‰8Ò&Ô å•£)~·‡\ˆ�KQl8F´3'ч.ÓU•˜Î§ö¨€s;«NpR�SQ”M[txJÄqrxÓ>]®df±f…ìÀNóuêÉLÙ¨( ík¬�»Z.&4±€;(Ïͳ¹�5uOjˆ ó«Prñ¶,FéLÖØ–V-¾^�2š-8މOYl­CmÚoÕfÁ†÷-þÄD"L[rI\¿ÕâŽ/ô봵疊øÞª^Ùd¿ Ýo2W§³xÏrwÿ†÷eù”ÿ8ÑýUæP †{xu`èè øu¿`¯l;Ù±sôdÃBçµ<ˆ%ñr;„#³üxýf.1P—“6wl¤` ]ˆlÂëdß/}ÖYí¹iw²0Þ•ˆøp¥Ëœ]I®wåä<´þl\#Þ«¦‚³²–}‡uæDìDFÙ† õ³Œë©`õÁn¹ÉΤÉ:ÐÞÃVr)|˜hiw}^Asª¬M”6‘AÀò03Vp"-‹çF»°5¯ÊgÕÉëꟽ«�:ªVnã£Ë‘M-¹®ÓÛä¡ÓZ‘¹�“ ov°ØAöàAç¬_,;°pÁò¢kö`¨àmêp²/C:¬¸4äÏJ–pP ‹ª`rS†ÔW°´¸óî’Nü[LŒ¿›ëÛ9äh'³ñŒ®û¶Ú�Dpð[¥Ú»¿Ê+ϸç�Ï©_ îRýÖ¾+ÍX�÷íŽ4¡Q:̵Ÿ²o³È´®xwfƒyÕˆs±ùꇊGSu¾Ž“uFÏírüÄE|phÉ{ˆ®æÓñ_ò—oP�ôˆô¢Ãù,Aôºµ„tÀyµÁÉäaþ[‰K¸À‹ðê ê[•¨Ì{åOÔÛÛOÈšؼ†ÿÊㆠ©ƒä^..Ës�vØÝ–z—Ùã$@ŸZ½§ Ým¸zLUÀ¬:&òæçžˆd×CkÁq€0ô<4õ)E9�2ÿQÆ–¶ïòH=Âd¬!Å»f\¦±#Ï"-‚�)çHhÜœ­nücû· æ¬£F©3É»­XZÚXô¦ok`ËyYô¢nÊ?™'yd _eÄNìn[»ä6 ;œé•£%Ú½Åÿ8ªVœ7DáÏy�yðð‚=ãâxèŠwi$y%sPÞy×ýÌ wºœ8ïtá?l1©ú%l†ßéh7´‚Æ &/]Ô'2Fn>t“Fá[œHƒ`ûªµµŸ“âÍ…þ˜ï¯÷ÃM k®:óVÑ®¿½wŠ”ör’%j¸“~¥£Ýr_ÓGÙµôêá�÷ƒ¦ûí®‡ï¢<öBü|НP*èú"ÀŠÚSä«s^‚OÏÞýnM\qf«rF�<º |£Ø‡ÜÆÿ °h”j\õ™ÔY9öïçœËˆZÌR\!Sï{sÏyˆp¿ã¦DÙMË])i1ôv¥Ú±éŒ¦ýEù9bÖ�æúPC¤{–7÷IáÛƒŒ}h�Tãç�“|Kë-»_(A¯_óKÚ†¦K�|¯9­‚ F.˽q©†Á¾¶vW’D3 µƒÒ¹Íý˜úþ`ú-† 4óÐ[¥(,ü³¼.“åŒQ /2�½ÚÔÑoˆµ~d¾Ö5)Õ›óîÐò›`<~Ç;X€¹@˜�@UlÆüLN>bå§à¬6õ–œÑîçŠZ#|y!Êì8Ñà:ÛÛÁÁr‹SckÝ2×M½¦,$BZê|T 3,n»Þ•žêæ„Jù0�|À÷höÍ–‹ˆ‰¼ìÛˆ¡·­�=QŒÊ¦)qç<Ë—My"¹û±³ë�Z°¢j[-Ì¥˜ÞÐýÇOôå6×i“ƒ.ö&$äÈKF»¶��¼ÌÚP°·§ZS!ÍÁ’U…‚Öd@¯—V÷5³3'öo½è™p𦠼’°f#(Z_Õ;÷ÆŠ,Íœîu%¥ =Ë´$X´º©�iXÆÃÔQ¦‹A´á“©�xxýmçȵ¾ =@å $®¦‘­�X»{gW¿©ÁJ¨˜IÐ&(_¥žEînVǘó ¥Í5«A8½.þQ|(b}…y²€þK¿U�X²%0pÝºÎø¤ [g�Ê î¸a™(¸“"c3~}1a}§BíÞ@éðx šLxÔïàõ?[—.[GØy³�äNJ¾¾ýË|e懋omt‚­yà'´ýA£„WŠÕœÁ|9\“ï…«P‘±oë½ÀŽÍ= ÀööpNÜÈMæüÜbÎC|Œìè`1N[éÔ»;ñöÊ Àéhѧn³b„rh}½fˆZ܇`{]»ƒ{åæ,[+_±ˆÙ„îÌ)ò‚YæP„€ÊrúzV��mHÀó, ÌQ£±¸Ïyôw<ä�` –Ú.‹]£åèö:[2_…5±?¼]°u¯¹·Ñ`¦m#&_]1n=çÀkö­gjÜØ:݂ޤŒB×lÂÇ:SúLÍIw¼pÊz3"¨ Ox­MÏUmÂl@:™É݈]ÃÙE¡ÁÝ¿qÁNê;’7ÐÔuìt>”çãß[ àæînù�km“ÌýÍ\ŒÄ”Æô¸ºûUœå~»œ#~—ó<^y0“‚©‹÷i±_‘¨¶%»þî÷8f¥Åk\ é�Û`Ó§4×ýÇa9r8¹¶ýãkžCQìã”a¬ye{øžxRaÝmRxÒ Í ·™. Ük–.yõxa[äG7Ê>Ý0sb(™Ô1¢ 5š×C?FͪÇWèzù í‘7û}­À:í7K… †ôhà9}“[U5åÚ­ööö¡çÝ:MÔ9�Ã*‡½š?ŠUžh Uòجöçß[Çã×wo$IM€ãXå{‰·ºÀ�Y�;ñ‘ Ëáù{’¢0ÉSâ']¹]šHÁ�›ë�z—gJ£ü„Ä%Lï�•%•½6™ÜÿÉÞhˆq%¼>.ºS’ÐÌì…²-ÔBiƒ˜ÉA僖„·kòè-Fðæ »å“"–ø³ëX.áB@,_x¾�)Gû�´,Õ_›±ªµ*oä�9]Íœ;ç£ ŒhS™G”?q.d…œ;ŽÓî?ìðw¤K9'3ŸÎ`è 3ió}æ>ÑEuŨƒzæ8LÌ Cð­òaº7­ßU€ŽªÑ~µÕì£�a(4û®Éÿo]}Ë_e ÞýY¸\=ƒߊžEZn?µ0è§v£ˆü®¸¡ð^£-,zž5S>¢Ô¬|O+ï/©üö¦ù§DÀ�¸�Y^Ñ|!Ž"Rì‚Ì!Tíö?EËsÓÅ•»2�¡”`tHô` –xg¡Á%Ù©ÎÛT±&Aªlî)W\ €?ªò+ç:ÄéÁŒ`½üéŽí/»Zìß{KŸK|{YcÐÁºEBŠßÅ1•xBÒ©žjDÝÒïGì}s7›qÏ®¯°pµÃƾ„û°(5fNÈvèV=OYç´ 5|,´çd.6¸BÍF÷dž;í�wôXô>Žj�GÕøý_­C›òˆvZó_¬ åÃåqÊÚ¥¥_ωµ½þâKDðC ÐÅ5„ïÓÕI_|lÝÏœö¨²r·G".ùØ�’Ò ym8„¸·¦I¾åö5˜ôÐ-e—ž…%Á$Z¶­1-¶šÉhäu÷Q×*�¦»¶Íà ½ã{‡06Ç?5rþú.ÍàÜ|�Ì*�Õù*‡��B<¤( 8ýlž6~–Ê´f>µÃaG…e¬Ü\m„5ö`î¤X$ ÆL#Dܰh6d»·á‚r2Áb Öµ³�ÌkØœw==Ãá¾ÊM>óÑžžÌ{T© ®u#P" ¡¿µ­�ŠTáP¹ªÓýž"Óõ›dŽT¿_púî?‚æ)¶‚ ì�Àd`Þñr6EÒpÞ=ó-Uª``x0º¾~GÄ3Ui|#Œö/ܧ­¹ø~ÎåÑ/lx†Â†4Éèuõ/ã¤X”.ÆK<Ú+õÌ�5 ÒÅlMrIëTÖ4h´‚&Ë7Ý0\+݃ Ñog+Ö%Òò”‰·`V×h-`ã³dlââ  žÞr§�Ÿ:ÌÚ;v»ùùÛ™fÎg>î+ÆÓÎuEÝe/)à+ø¨8å’Å@HÖçî,X»õdlÿ}žËü5¦­Ç¾S Ýñô%¨ÒŠ!bÙ¹kaß•P¢^²ÿgsž!þ˜åÝ‘×`ãã‚_³+fâ~¸» Þ„)RÝâàëb²ã�ªs3H6¼ƒgíÅ©GÆÒ²ãìØàÎèúÎ�u£º~òêο5¡µ›º—q°D?©¾®cfb(³R´3N‰Ço‚èF5aÉÐ;»ìävv²fúï¾Þ›½,ì5žSËußvÓ \¸G¦ �"F‘{˜&48/|YMÙö@ÛÎG‰'ÌÎB¦£p$Od¹Ü_x>Þ·Ž¾5¤HÜûÞí5.¨ã#‰i+MÂù�¹·$ø´z‰¤_˜ ±¯Û%žXåp‰ˆàá­dqœŒ�/ˆ[ =§…AÄ$bÔéG\ sE×ËîGOJLÏ�?LÅSœ¶11”T´6lÅ·eÈþíïfªY½äs«pþ´·OõÔêÿA{~IÁJ§Ón(xf‚töJÎâE\ˆÁñŽx/jkØl‹? EPÇðtßÍÛ²�h`N$ú½ ã8âa¸Aµ)룔¨yÒ?W¿¹ÂŒ䟸ÃÓóàiÉ+ÞÖf×rãÕ”ÑLzßÙÁ›²’W£ïqµ÷2h%šØ„3¬Ý:¶²ýz'ÂC~'W3Ñ›Ñá2�´F Æuddˆ�}ózÛ &ºéÛñûxÍüQpmc�”nl¡ 4 X¡Å“¸Òç˜C˜ìÚ•ºUÁv~Äý.¨æ-ê˜|d�– Ë’…{=/¤AH·M³¾fö«Z\LV¬ÍûV:ÌÁùXy»œ¾½ì¸.pù鈒Y}+·IƒNì~| gê… 4ÙyŽíH1„»ùȃ6 NêCœi¿ƒ£nh9˜,Q�Ÿeh«îí¶*MönÔÅ;µ˜_�´GT+9,Û�C7a¿@깊rf&2·“VD® ý�[Xj’AǶɼÍ0ütq€(±K†æžcÃ}È^U¨sŒð‡ÛÚÔºzÚ2v$Ù4Ñ&³ÖÛ�­z`Üß»Š;HN¥C"a‘« CíÛZ!¶—||W�êBm¦èÀ;(åŽÑ­@o\YPÆ›,,ÚÄM+%ù÷qO;l.w<ÇĶÆ,ðšXÀqOÉL�U¥ÊE†+ç–óY¡jáwq€Bµ-”6â©çW[P¡RI\@¬@öWWª µ4,×Jú‡¨ �jŽÛöj¯ùëÝ3^W�v?oª zã6€¼[kÛójébà‡èdÚ æön�ƒÏu Ü5쾈ÅÀdø¥³ût4¤m�›Rûç†êC‡ì™*tJn¦¹~h5Ü{á >cyÉ6LXTɤu·1Íp’™ië—6‘‘б™Ã?…ß yR¬ï^ü� B¶=„âÓË«\DÅëñÞê,œúeU@³‡Önâ¿·Õ¸Þ¦zÛû¯#¥qû¦–ÛnLr²&zæ‘�QQ ?ÙMÒçT+îËñM:aÅÞ¢C~³ˆ‡`Ï;Tv·r¶ä¿†Ò“À-.¶—v€VB¤~³Ý³¶Yx[‘“ñº’}i0u½ñ²q#�ðK$ÎÙ¡¤>—_ p&HD#…{2ši‹½VÖeÑ´@>؆ÃYœ…Xþ[!––¢ïy1�²�ùEØÈmJB)îa´ø €O�âp�ïxV>‡Æ•öÄ´”· {à¨ï„¬ ç,–Uq­6³¼«yYQ¯r(,¿¨‹_–ü؇¡‡™y°.£/ͨËgVIÏÂKø#á1åOP{ÍÖ„¢�_�Mƒ/n¶@¶…bÎÎRíµ5 ^Osm»C‹î¯½á¡ —¤ û˜ÔXôcOñÌ3YRí�íŠS1ޮլöüBCò– ‹ó5’o ’è9û¹@±«Þ¼_eojœöTÂÅöØ!W7@L[ågHʆ63åú'`SŒ�hl-T i Ù9öî^^/~¾~y’ŸMe|­ÉEÞš�¦=Êú»m¼s%Ëà}Ù_›ŸItº��úLrÓa Ú÷uŽQÔþ° þ`_xÈgoe'ì^9=ùüøô’†‹4ø”WÒù§çòüÝÎ~ú—?l_ëNòW÷º¨Gw6[NTä¹k½z¬WÂpÝ5b u£Å="*gÊ«Þè=w³Hu¶aü{„H9€ºßð( �ï׫±&˜ñ»}úäe|r„ÔØI.ÀC•³°l�ÉèM2ÄT ÏiÅ€˜À¿Ð±\=WÄA¨µÌ¸mrXKD}¢ÚEî>]tU唞¯Ì’Ñ8ë�-ºd«ö¬;ú#-ð¡Ö­^ŠÛ�\�®\¢,|&6‰ IŒÈ‚†^À³ÐºÃœì3vÙl1ÊLSâÊ+ç,ÏgûD¡“|ºLø…¯<†ÐáâÄè§m¾ÇlpbAáÅƽ)¼¬¶äïÂ_VöòÂü4Ž@.È7‚n²â� $â­2?`£½˜êà‘‹Ü£ÏØßS’â[ú6¢°°Êh+yÊSÄ)pp±m™2oe+¼SïA+7�òV¡².ü%K•mÛ.½7Á nX9¡c,†^~½}и%ø.¸vOcˆü8¤x›�•£íoë—áÔ/¶êfNá€NІwëxÛM-»U·¿±ˆ›ýL74É?Ô÷ )kó\IÃê}Ï2åû‰L«ãÝ—ŽxyE±‹fþµ¬‡iÔ Ðw\7ž»áê�l2#^^ ŠÁ…xÐ+ar¿Þƒyj4]MnoY‘SêßsAæÓS#ŽT†Ì0Uµ™XJ¦ ��yëT¬B5 éMmpÚ_ܵ+Gf�C��¢)š  úæ¡Ò‘0ÈǬn§‡Ã´‚B°ÅþšoC••BjÚ_Ò8(ZÓeö~ µmÙÁ3�W§ÑÊKêïÎz°½šAÑë�]´YA…JnÐŒçy‚ðvNwšý VÎ|h`¹ýð#¹ òìƒ/b^±V¶³*\ˆ+HggbÅÁ~›~ü=liêžèÖ|láBÇT­mb¹7Û•Ãdá´ïG¡Pktv¯H“mÆ.T ws7v¾5d)£-M´æ4U…ÆráÔUº&¸„·P˜;¼<]{­„_¦x(š?Qñ‚\Éì}ù}8¼˜h‚½ý¿�—Zñ§vëÖ½ýñ…»¥Ào§‘ù ìe Û1ŠH:ÎUß›·¸K)Çñ>Ø/ké±¢´‚`jVÞ§À¨ò­×ÞΦ£@!†±Ðû'·++ʾ6*yìpz„Ê…k„0<®RÅW€9Å c¶äßQ¦%ÚõÀ¡„'Kmv9Üï-µÔUêöÍì¸ •{o45€C°Í`²"¾ÚöWQ­æNÄ—#³BånÿÅ*ÉLx¸dà…� ‹ÏßÓÒÂÒ�6DÁJ¤‰àþçKMcú¬¢;VÙªBòA1úwt}Q»ýs‰ÞþŸ+41ÕLù,þyù÷„·A�üÞVÍüö7éÒ çg~fO@|,÷›ÕÆ—¢ÿ¸Ø't¸ j£ÍGiAC ²o<“�6~&�³¢ÒµôÈ XÑ}ŒÒ((æòû ¼­$Q´ë¹=– çG¼í§VŒ7g² ¼áù·Åí�äÚy±(»ûšºáõväýÃÆG\ÉlÞˆ kAJ¡Í‹/ ¼÷»ùÓ_=Ø8ÞÄ�°NâÛSŽxµ�ÒðÔÿ&C4;I3¼äFo¨Ö¶ÛØÁ·Z—*½}ÿdÇS«ÿ;3½†½¾Ÿ~nf¸ø=a'a¨‹Ö¬¼>wí»b+l —ðˆ ;±`,P‹Æ78Ý6¼]7¡Í¹Å&«Ïû[-]²Åñ,í0d©kV8A�Ì!i‰ƒ)Ýkå¡ÖãÔŒÊ _JQŽS„ÉW¸ Ýð.•Ñ'’àôw¡Î}öù¸3Áé zÁkF‹ŸQè\`Hît˜²°m#XøË»W˜>1ñ5?)fâ垣îü`Ükˆº_YWÜÏvPäìw¸‹˜;ü¶a[”Dà“—vÚ¥…o·Ï„ãÅÛË1úÔò�>sõ9û¢Çƒ I#®ò²ínüf}_y$¢zÚ†(¡ xëà~¶bÝ»°¦EóŒ?ê NcZf¼ ‡“³…ŽÀLiÉ„2bf”sÀœó›ü\Ó ô´˜0àlCdh^NeËÚÛ2‡Ûî´×œÝEsªí鬽€D ›;ز õ.XOŸ�`ÉŠŠÇ}r>4…µqÔ…Äõ'¾¾¨/{þu²¯Â¤Ü¦ojý½ÙA…BÓ÷=ZVФž!ŸD€Àxå�\fNH\dare]ù„™€ûÎÇèiëi@¼–1$l[’æ?­¢Dئ ÇÌfR ñ”¿$ÆÄœöd�Xíâá(€× ‹Ã1ÕŒ†áµJ/§èt°¾»«QsA‘ç~âˆ��ˆJ'RâqNæq�pµÖ&˜ ¥!ôpÑÆ¥à»"D×K¯å[ž¾áGÞ³¦¾ì3A}�«�íÈØ žA´¡ÌÊû²U9®TŽƒ!:Á_NÀø-:òø&uÉzp–W_ ‚Ì­m.µà§g=fb~ìƒU«Y]~BK¸ÚÁ7öÓ"ßïcú‡Ÿ””! Hå0QMŽ ‘rš)bLÕC dpd ¸tÞ ”Ú~ÜŸ6AÖÚzÓêO/ÝÏ%P×ËBÈzˆàv�£gÊ1ä7™ ´æq»á¢îYx‹¾KlV\Ó|[fc’Ž®H hü)Ä|û�Ñ-Íâ&Ø�©ÆDw0[­  [ÐÊÆ±Œ�Û€`÷¾ ~Î^kÔ[*Lèú®í"ꌛ[éT DñD{êlž!Πêë�¦ã‡5¸I[5¥ñ3úV.ŠU¨XÀîá©ØbÄ`Ѩ[q}Yƒ¨Ì Jè‹hͶ(~%“²."EëïôƒØy÷[€~Þ£ƒ‹Q²m†õ˜k½ZÏÌ‚3³ñ-YÙE.+V÷'tFï%’Ò ·mû*¬ãÑÇÔÿ¾?p´+#¹ šA) ï eL‡q¸›×Ê¢mf§IZÝÙô—>A)|Û`¸ô.LÉcQÃévyy'’ã ü°{ÎÏ\éÌyxãá·ªm?à'ÚfA6æÃ‘›#?íŽ7 é•–û$ÃgexóµÍú¶Þ�xTîR>)¸²Q±•é¹(dŽ™pB9,Õc[Æ8xªõs„3´Îo‰_ÖZv;pç6Q£Öm˜<…È#gn9Î�àïë%žqÞf÷ñPÌHņ³Ìå¬Ü¤G9Át‹f&•‡�JŽ_Š6à–1ÈŠ1öچá%°Ã6¸ VÞ ¬ï³m×yóóx)ø ÁY|�³¥›JöÀ!B»‹�àWvÏ…�»ºiAÆa±›ßƒ•¾þågR—Q³l�.6Xj—õï@,Û� Rß¡›„uåXD4­!nA.�K\¼= Y…ÐV1hP]#,)Ðæ›Ÿ[Ô]£âã¼ðuÉù;Å¢>?„¹SñoºP�œý߯Š=6CÅ«fDø—m1Ú/³cÓZÿ°K|ú] ,`4ŒcG;2uK/ÛFž\Ûë.uÍðuT·¢CÉ«ÇÖ ®ñ§€n1ôc±ì£ûÙçZUci¬.ÊוÊåÁpÌ xÞíZýGðËT�>l'9åìƒÁct+å¢Ï½¶h�£¤cÆÓÕNŸ˜Ga¼ûhtîäºó˜ž÷oúÓÞ ç¬i=t}ï* t7wˆ/�,Ænø3�d™ËÖ·2þ˜œˆ�ýOŠÜÈÂåXušê. �#ôÇ »Æ�w±˜ þj/5\ÔÌm5ÚͶÖ+2·²3?A˜¦¤áEƒ Û˃/>Í|z½\¿"F1þ éø½ÇóÂÛ�u©Ù>ˆ•‘uŒãÁM; NÇ/�ìÒ Áþ B—/Çp–vÙÖ·¼n�ï90\ó7hÎí ��ªSÎ"T’½+hçÜte³Y¶c;¸íQD#ä¡R§¿¹ ,yøðp|´¿NÖ-}í+PHžJÉ7ž56ÃQ3 øPȧ§„Â2Ñ¥“Þ¨‡ð)>,Z¹^¹äK„}(«7¹±K­&Êc ’‰͸Ʉº=åÒ¶4Œ¶ÒïbWÓc]ô®‡ Ô–×&àœé잉ðve\êtâà­dÍ÷�µ®{8ß¿ʳöëpáåR¶¾Æš2Dz½AGÜ�®Ïå¶’ï$\s‡D¹`¨PªÆŸBš�p‰ÝÇrB¸/5 ëA¤¿cY\›{ËÅ­hÃIΚhgöÔh!7·Êctœl¸[½ ¢=“·SóÆûÌØ*"÷¾Î�ÒfMïD«!ˆÜ^ü²® 4x”³äâ¥Ã5\¡Íò†µÑ¿6Í–>lnÈraÌ�%:özÐ¥�É6=Í J“»ÑŒMd¶²È™«^ ¬Ïf’Yi{@nßWÂÕë¥7Jùßï5Àˆ˜uuLs,÷·ÎAyC¿šÞ¶æßn­nEŽ©²A–^¼yô½ËŽW“ hxŒïËŽø6»ˆÞIÓƒ»Ý¬Y¨¦dÁÀ_q‰Î©IiœÞê6§'_±ÜM"ÎRr#g.‡9DL[¯j1|—nH8]î­u¶×ôŽðÖ©‘ñ_„”–+Ax­×l-¿ nØB4ÞEŃtˆ~N¯½¹Òä!Xn—¦‡ÏšÍ›�ÁÊ.�†Ù_=hQ \¸äÎ8›/£=æ¯Þ^­¤nÁ«¤—L�#ïõvyèîäßG»iÉkj…õ„c·_&Þê÷m¹å™ ÖZíxÕ+€©Syª“ÈKçáýÁ�è-juÒ-nÓ•Ò\Ñ{é'˜ÅŽLÛŸokW.ÈÜlÏïUŽ÷D'à9úx%O#´Áªd Á‘gÒ÷*Z,íB6iÈÏîÄÍæ%ðä,Ñ+’’ CTéYãTÜD¿ƒ˜¾ÁÀ–m›Ù¥èqNÜd^Ëë%ðUüMæ]ðw¡1þ.‡/qªÂll5‹HZõÍÃzF1?|ûA’ÏɳÃp£ÀÓíì#ÃïiCW €FÍàÅH{=ëî± þ„¿Msqˆm¿+Õï�<['¤&ÿ[ lGL*þú¡ÎàμÞw®4vß+ûâßÔ¤ª+u)ð�qqTh¬|„V?$õ [Ÿ·Æ¸F}�¯Ÿ R)^A¬¾©ÂúKëËÎd$u¹ç]ÄCÓùKÏçkRôÜ÷F-€ÆkwËIظñæ”äpÈÁ¯×ØãøöÒØƒ†g|ž2>_`¸ÜÊëð½Ù‚Êš[_�A—&ÀÜøvÐ%‰uw|³Ÿ®öº&Ø€ËP†ÚÊ%ýc|29Acé \Aõe”3ܸ[h²tºý¹&—c’«†æ�L ø£¹¶ŸÂa’ ’'ëÀ˜H¶×œðgj,$˜¶CÖ»Õñ¶i²bt6p~.%¶Ošºò‚[hmwÅå­¦®Æ>Ç�,wãØ“:§ª×»g´,È)Ür™|îå [7[¯Ô ³�ØIRÞƒ 58jœ=ìñ®@ññ¥�› ™Ç»Äes-a!Q+éœkvºòÆY;Á!W7Y‰,%Ÿ÷•ð•yí­Î“¼¸ªã¡eãAðÀ.À¬|‚cùT2åh{pDÃJјU›kÆs˜æù$“û;¹Â}rÛìžÝ­„x³²@¹1`æMÉ1PÕúŸ©mñzÏpÀHß›�ã°)Ëå¶á=Ó­™kœ{‘‡›’óªñºÀIŽÏ(öÕ�@“ÈûÛSÇž0%ËóW¬œEŸV~³'ŒþäÛªc0ì—H ¸ÐCäŒ=¹ˆ ã*ËEGNiB>_ÇIj¸©E ôZ=¥ÕhI ¬¸¤ýí-±‹hÓÛÆP2-Õ”’H•&À‹E'”Fùp˜ÈÁ§”Hʃª¶‰±i[qÄÁ½g(á‘µÝ ¯6ÔSSóò©,t1Ñ;ð�ž- »¨_‡“vùDÉXx{>„û­ŒR ’|(b"Ú†ÝãêÌZ~~·¸ýÂ'6Ï––løa †Ù/cî"¦ufÞ+à~¨¥õƒ…ß60âø×�Ϥ³gIYM:<�„mÔÑnç‡êK·6 cÛl pbì1Ðxë”1í¯6 §ÓÍé·˜¿Ósl^> 65U÷~ÖïcÂl�Gš>}k/ÂÍ}Î�û泬¡§œ,�i*h¸žöé�ŠÒ){]H·wÖµ¾ å{Ê"Zy6iúþSÛºG0Y)šzÉ�'×kÈØÃì'¯¿oNY©½µQLLV…‡”mÛJ#†n äêÍ]>°IΫ †¥iØØÜ+�Šÿªu[ص¨ á¾Tâõ“ìù®\‘¼ «È5‹^•Å…›âº+åGÖK±0E]Œ0ÖÃBÎOǰ¢îôøwÊF7LЏlÓÅnûd[BV?�6ç�¡oÅÀ�ˆM›8¥%׊y^œ[æNE0¹.Ñ(mñLsV 5Ö…/žO)s…6i XަÅ ‰u>âLlw[pùe"ÆG!i&3 Hõíô�/žNý†»èHf^@íVצ“¯,Ô¯/Hê™,¦E4Oª‰ÅK¢oLV/Ò€ûëÚ6b]‡ßE9p$©|Ww¬ÜJÒü+ä(¤`ðÜ%@¾Kìënüåà9Úû`§º^uGp™F ƒ‡ÆÚßU~RÔè=©ì=¶Ù¨Èòó¾887n¸}¿�œÞn6�°µCB;¸;ˆïÌÙµ¨1E̺X/ÅË6FË §huÉ:NÄfåiÕ®åmͬ‰[ÈYòžaö°°ÌïÐòV®>—N\aóÜA¨:C¶øŸ]Dj2>¶ô¿/UìƒËÔ›i Yñå1 ëuòªsOÊœœîä,ØòtDmt|¸-Ññò…òËÓŠWÝ]q6ä?ª›Ã&¸6êßãÚ7+u|Ú8þ�[g½ëaiª¡hîð×@�*§qsû\ßcº9Æ#”(|•ú^(~´SÜ�Ý~Ùóðlî –Pv:¦L0c<ÕÄpÓ©žV÷˜û³÷²yÛ½Š.V÷ŠÍô¥tr1r%|Û­ã…ÑZIèܯ– Çs�†«yÛGwäN8b‡– �Àn÷ÓžWn"’(dÌ´Pƒ32”'l^ÜÎ?X9íe¯s½rÅ;<ùôŬ×G¤·$¾'Ѻ°#F¿BÁÖIÐm]ÖîË»Ð^ñ±K£¶ðñ›‚KuÇÞ²ä`R‘ذšB‘µù»`v¾–Oy¸k2·¢ñN<·­çT·‡]¨|1>‰Gz5¹1ðð‘äiÛÖ;j—´bæk7j£è(Ûê±4jaÃGk¸+Û7•æ…+õëë’º”<°\^óÜw•}ç-a¤ld@àph¾Á,×îAžîï«røn•®Ÿõ}‡lÙ²®dÜ=Ö·ÈÉóyR£�ì"¼{Ì"þhœ‹aÑ„•JõÒþ.Õt5‡Øýoµs&H[@oáéðäpvt¨‹�‰ànnð.6Í®†UJiuï§\dü��0/zýPïhÁlu×¼í««�Ú`õ+KD~€Í¼D`8:�4OCT®À4!)^¹Èb;»¶T¿!b7|�œ¨¼ÑÓOz�ÅÄ9í¤³¤òÝ�†ÁÐÅvÜ~  å?GFËyG�à@;خխ8ZC¾Õ ã)®M*㮳™PÙWÇ í žQ²Âœcóàƒyîð½”TËšnŽV€¤Eh˜8¢}ò{LWr“-'‹½ø3m¾®Ūò¾ÛèOÆB¼^F#ß-ÙBø¸ Ϭ¯:�à˜Ùt"Ó‹3�èè=³«…ߺÇ^k®ò©Ö–ƒÔ*Ž|“¾ÜB¡4:CÅ¡9eôÞßÛ9 �<�âCÌx´DÉ̉£j*;ÆöK¬rßPõyf�úÕû.›†,Ém솱bôìÝÞÃëÖ™CYœ±ÖúF°J †GÄRœ ¾xúXô�HÝ�h™ëó ù‡a�¸Tåi¬�tN]âAÂé5àÅš¾Û�Fw¯�m·ÅÁƒLj–¿L9’& ÁŠnßSOµ#rÊ“7' Aܶ)�Ÿ@ìæ9ˆ=z®À!Š(Æ/+{n™-ƒ·7¼®ºU¨0JF{#Z)Ÿ^öݤñ´É;m B0ü®œ/H°½î$2(#$ßlׇµÛ}Ãh—™°Þ§Gµ¬.©ÞŠZµN{-½4ÂÜÌq鯒]�²Û³2Ž KËÝ»3OÞ[ZPö‚}Nþö³’Jf“Ŭ]©��=÷jv­éµÞfzÚ¨‘^uv\†ørï~Æå¹ø#r˜€.Ü(:µ¿8O �¸TþOȯr¸ÉƒjõÏfj#°Ó­Œçæ‘OKkhò‹»M¾=æwó&¡§Ö¾‡ók´Ý2©×èa3V45`ùQ=¾ù1y³®×gÚBZ~ÅaՀ˱vfäð.û³òrŸ¦Ù¾l@� 6>ç$" �­±Û ;ÉÍü¼bcRhA +˜´âø·6�VÖÓÍ�hÜs—‘I륟ya.ž[X±µ‘ ŽiIJ$Â]‡È#Ë�ƒ:Øå &2€‘äS/Åî¢]/dÝéçîgU¸Þúƒ'P^3šÀ3u[ÙªÐ÷¤5³ @·ËÉä$2·°#þEܿĝ½½'s'Éé¼DøØA؈t¦9½I]º ˆ_–馷¦èK\ð-µ½™ØEw}Þ›`Š[/Ö{b ÑÏÚèE['äN(—8¾J½õ¿+FÚm0DÇK¨"̺A¦’â4‡ô;SÂò7ìhæÃâG׉ÇÃx¡;9H�ªjL :ŽÀyµd¤|HW¡j¢Æó‰ýÀ�Þ¾Õw¢|æDî>¥\Ê“�Ájø((¹€êîæâïuÁãðàg G=t[aáÙ!‡:ucùVÖ™å¾*·3Ú™€Ü.8/¬GAþœí·«w! òyƒAo€c1ÈÑÉâ­Î ß÷a0ÕKâe;ëoŇ1sZfNx"‡—âp¤ÑíàkeÏnBµ“åà}áLgÄâ1ó¹ÞmO§¸êâNÛÝßʘ§E¦7Õ 6@ãeµÆ`nj}�o-‹£÷ÛjÒc¸QeÞ. ¾”¢ëª‚4ªu;ª>²!YqkÎ1`K«¬mѵkÍ=¦eÒogr¶Š8älòR@Ü»ÁùgJDº�x�è¡ŒŽ½†›6 nÖDNƒ$IÕ¾ò¢û<Ÿ-d–΄;T¼<%t8ãäù7¬½6…òóÏ�ø_Vit#�ŽX¶¹ÂüÕNÓn]Y<¸µGqÔÑ’náhå´6ÜÑGuÅî‘ÐÜ㜸L¨ÏcØWØúÓ}~£ 3Œìk·Ê_/¬x'w@„Çãqçíh[{ ïÍî2sJÁâß3|!‚’w9~!N§WÑäãc6�×™•š^¨lž# Pû¼k„DËB_85s¾5<”‰È¡÷^|ü›ÌOœó†Pàάñ–vPTà|†ÌAî.a|�.ޤ¢Ã.�>°æ>Z?k|õ鯮ô�æÁXDBrÅÎ'šé*`ÀùJ–'Ay 7iµÃ¸#ê×¢0ÉeÔ¥ñƒÏÌ¥k¸fÁᑵF}Xf=j—$ïy-Ã‚í­šlÎù¾Øî™4¸RþŽ.~¼¶¦h(!ì%*Iõõõùæ�Ï7!´óV{;Vf€¶tÕ0eÕ× µ”•VÑH#Ü…µ©}MaV×UÒôÑ�ÇV 2uÏ~üÓ¶&õŽáѱ?'™üÁ°óSØß’m»ûÞë‡(îø õwa972ýÎÝ›½ û8o�£“7¡²©`ŽMQ¬G6ÕHU!Û´Û|aÄ2ì„i›•à@£X!9^&8¯‡TÂâ(Ž#ý@ð2ºÆ>/¸Ö]•Å–ÞúŒÝ³‚/yÔF]ý!pÅ3‘.ÿ¨º³¯:acÝ<•ÊqOÎKá’A[svÔΙ¶tŠßŸã„uéÍF ßÁ(¨åI}Žkº=�"}Ȫ| “�Çï…ÑæÃ3«·(hÔÒQf�Ak…$ÇÝ´Àdh Ü52 ¤4|0Xç…ìäh\²Ñ[¨ºÄɈݑ´~ýäxqËÛÑ–Ê|a~º·5IÜÓ?/ŠQ+ãÉ“VòõU"ô�“víerùšš Ì«�ïå¡`Íä㈈� RZnûÓÍŽÕ‘‚ý¡å(r7ŽðV¬Ë«Hµª�ªnÈ`Ù©h°ˆCµ…厅orl|%“ßïysÎH u±~^|³5²¦nróê÷Ϟ߃mÎøZ6W¬¡¯a€à;Û:ŠÐè‰Q–8c°(_ i¢kªúº™!ó5œ­ÅÀÓ”¹^ s`=µœªa—jxÞœ’�/i¶¢æjqka ï…�(l‘»b9/®\?«˜�^‚%¿]Ÿ"‡bt+D©=aÏÛ6æo^Ä>ÊÍ«˜Ñåî©è\‰kg˜¸ŠŠD�Åc ¦ÅX“7žÀ}[ ¡;w—$G<âyÖýH2vFó…^úPTJêÙª¼•OÑ=¨k.•†¥<ÁzÛJÞ¬ Säß`q3C�Hò*óoä ö~rÐØãèºì7†Ö„òW­¢ŸXÂÜÃ¬ÊÆ�Âìá£OC„3§4``|¥üØÖe2çÔ^Øð+‹àX‚ ¾;sÀ@¾Î/%¬†ÔrƒÝ‚–åî˜Ñ’pŽ3‡u¡‰Ú¤UfÛÉ©ÇÜ®Y#�kÀ|]â ^䣀0Æ�… ° —O¬Ý[ kxëií!|úv‹jSb=| |Ë€e‚ˆî GlÚ鞇 ¡Ôáç\^ù­éo°LæãTÆ;”EÛA�Þ¬�{è!LrÚ‡ù=oži÷Rƒ¦ÈÝ3&éŽÐÅd†Y›ø•S�ŠåØ•­µEŒï¸Ö[òß–ú8¾áØ!A¼8í�"¾Í°àNB ×»ç�}1¦Sâ3ÉÀzpäB0f+ê¶sXempH<>� ÷ViéàD5m4ÛíÜ"\áç€Ù–a„:‚‹�RpÝC"Ö�Á´O}¦2T^EÇ,p1 í<;g¢‚– ¸ýìÐY—¼Ùßo²ñÚîöÌ­4_ 6)5 »ýËuz{¾ µ&“�²9¥Ÿc„møË<«²bÛL<Šâ/”'Ò±…:ØÚçòÜAìyÎ]¦.%Ķw ÖicŒ¦�¬Š…bîàn¶ïwUZ†îT4$Šo`L½Áh5v Ãec—.?�tÏ;Yè‚Þ‰ÓVêÎ ˜óÑß2ûÄ«Gpº](†¼"ý°m‘¤µ¼%“Î�4�“=qlár[¸FÄcÃÌö´¼Sœ!ºÔ3ñ @¦+PC:ãÕ®é3Ο�7½îa´£�`öiõt;UEow=5‘œŸU¹hÏ­êeO,&÷r£AëgmP¤ìuߌ(¥g¶o·J¤ïŠäöT‡ƒÖ‚É#à9ø6"wy·¬ ùÉ_º³±¡V±ÓJ��É(ƒXozu 0AGÏÐ/�’Náhx3}i�kXgT1‹@Pš¶XD?es#¬½¸ãÏ2Ã禭ª­2„„@óîîo'ÀŠsœ¬¡ï¼Hež² `T؆È÷µK�3],N1l ¤ÁlÁ|oÛæ?s€I˜s_ïsUýŠGwsyåœ@ur+CišØöËàbŸì¨XËOã0j|Rµú?ƒTü÷¨€?¸‡Í®|.`&°�-&Hu=ý%#¥ÜvBôjÅìþë¬QÍÉð¶lcKÎ_èñʼÉ9kiÝì>åwú«7œƒç43åö0[M!P{n¼;ŸÙ‘kj¡GÇÞׯôlا¶´û»-Fë�sÜókRêïgäà>Bà{CËMó�ò:è@}¾Á¤•ù ¦¶ð|eä0Öoš‹Ýzîù~Ž�xb"ùâ†â8a ìšQÖÅ`sý|š'˜iŒn×$ö×ÉeòðãK�ºlo–TFÒ¥`ŽÃíh%ïÛMð_iL3¹ xân(ck®#c©9Ï!g; ƒÅ*jô(ØUÃrúÕ, E °‘¾¿.ú÷g®½^ÀÞ]"“ÁÅ.Ø2ÄØ›–•JÉ´=ô©OCÊî!L³M¸è›àt³x9¬iÉ4r8¼ÓŠ_�ÈÜŽŠ7vÍ´C>£ÜD%•c©"žkBšü³½ lçØ^‹š @z¼ÿ—Æé3[zÊ£WVí#m“› tÖ)ò£pep�ÕªGÄ로ŸÓî뫬HÃð<=VÖ c²ÏèÍß9É'|Og´evl9Ü{š–;qmS•ಓ5JÜw¡.¶{l)%QšC 5ñžè˜KEÝ£l.^MÄã7G`;VÎ×Z}ƒrÊ£Xrœ†3©&¾ NÁð±˜�È”Xý˜Êë!º�XTw€¸wϲÐàÜ<`f…Bk'#¿³ežó¸ªtãݵz–Ä&ž«¥>„<5¨}@f9*O»Û .bB»µoUøâä`€Ù À{jŸ ùóä‰ÁoÇõC6­“TÇ�©‚B4Y¹Í1)øI ÔË7À8B“º+(c¤”c_Ô²Ñý3h§ðÍßmòý[n†\÷_šýIºâb$QÉøª/Þ“SßÉ[ßDNÆ¥àÑ? Õ­÷; °‘¼S¹Ý/gSÅ©¬ë—JÉuÒ}Èa°^Óä©صS«lnç¬þ]aÈ�=ž3G�`MRÖ‘<:¥Å3ב5qèÎ�~70¼FìÞéòðµ¡C ¿É.$Upûi– MœHT#Ë«Ónð&D¡tï‚qE�¦çq ÊOž2é&-.à¼Sn”âYbä røc;–K`Îöýªì+s:’ÛÌw<ÖÔËi¬,ùñuºØ�â�”à òxp/û£ç»­Ÿ/i½„uu�î LÆë{Ó MxÛ#Õ�D nÆ;Dµfã�I¸ð"ÑÇBbÜáS-j¥Ïmáql â]-í”°9Ví¬†Xo9�#@A¦q‡?s2ØÐuÊYïÛÀ[¾º.¾å„|NÔ),EƹñÃKkš£(Í®J•“ç´d| ÓËX2@òmÛÁ"Ÿ\ÇcwÑûÌv3Ie/Àa¬¢‹e#¹[f?!Ií!ºªÌM˜=XÐÔ .V”®{…ÀhU¼ìù¹» â®—Ê_ lÉ €mŒoô°X9²g7ºTÜSSßËnAÙ·VI \UQÜEy˜tËrãúiÔ‚ã¶{è——…Qå;û~†êзøøÃ%*ÍͰaó‡W¾…c)ùØlÎ)l¨ûñ{Ð÷ä~[f["Ï–P3ÞÄ×ì’ßkãí¯»íÜz&Äá„wv‡Ý î§ÈÔØ3Ÿ‘5.Gu*–´-Oé6�Úè62xÔÇ&áßã?€›]wÖÑ× , XÃ*—‚ØAÐ?E‡§v™ôs÷âLó©¿Düð+:ñò½’¸¾¿ê2s¬ìdòßÛ_è‘RäùѧC¯šà–6uñ�Ýb°ËŒÖÞpöª‹jÀ6ÓÝÃT�glë™�€»Š‹råID5Ç `.Í´û ÇråeðpBD$/¼¸¹©¨çaXVÛá«rŠÿK~jMÉ„5SËp±Ê'î� ƒ§ôëóúÅ`°l,c±¿«:ìü{nšÓMî ;=ò y$må“[)t膕wkxØ{ãs«Ë0\Á0«aðøøÖÑŸEKb-%$§*n,(„ ù;›R¯—6jÓdRøR,¿4ª K£áCë‰5§ùþáyºý?šØò[–Òý,h�ñk,]À€¡!ØCîm-ËB`Z”XQˆJ7˜óýÛ6ÍómÍ“^C"¤Üˆ^×€Û†/áä�q-ÉP’’\È?4ЉØ~¬ón¡‹oœÌ€ä�ƒíÍ6VàNš8ÞvnY€ž$…ldäÔmtK� šý{�ì©6¼½ý˜Õ‡~µnÚ š=çPºîÈ<Éj­µêOo@?›öä ­3ÙI˜OÀáÌO{\¾þ4¶ 1½� v6kwø|À¸áówÕá”ð]ó§ÏÆÅKùþ¾5Ú6§�ꘃX€$û/dûk�ìúÍU :“{—Ù÷ù×é,g‡pµÁCìFǪ{Á›èÃú V~�cB||SÓ`å¥|ì|�p.š Ž6ÅSWBÝÏx«áµÉ}ÏÁ @$"* �KþRõ¦4KE0Üùïk”ݽƵAP¸´?#ØîþNµ ÷A½™<îÌ\Ø%ý•!7æ¡ßé­�¶F‹o!¼ æªüÎJß(«òN:€m†ì,›”ÝNÕ«Ä]H0Èíšî¤îCêÑŰZƒ7âÓ³çö�’Ê·gmǃ’’Ô!·-©5?Iá2Ùk×—¢Ï쟯kÃ^ÀÒèp´†ÈŸÝ›êA÷ßdœÎ�õæ4ct•íÒ×É6uÌÛwAÙlL%…Ÿlw¦‚¢G¿ì�Ë¥÷[dô8ÍÀÖ¥$ÐÏF¨œ{af”s}¿9Û³×íAÜ}6Âw¥û×8tg}>V:t eÄ¥nâ�àÊaK_·°¬€ÀdPÛéÏ­×®LйèI Â]NŒO&�„'Œ”®Æã\ƒ«�ÜQíÕzê€æ)´t:`Ô-=ßL޳Ĺ¥ÿ/P™õÙ÷€šYT ö&DÞõ�=Í3øM¤ƒÛÞ™«k|ì:b"E"£'Ò4Íd²²ã³QÞH7¯àO…zÿc9î׆úøM qêN¥ðª=§+F<" zÕÔ�8ev%`ÞW(t5EûN“À²‚‘l•­²¡N�&»sÔ¾ñâ+õ„몕Ì"æì‡?4zGmŠQdO¨¼Œ{[:麙´d_žÑÒ¨YÑOmjŒìŠ”àõoǪ¬ŠmÚ­üÎë&×QÍ, ÌD§`sÉ‚­ÛWá(Ùøÿ`£ìW1 E`Vzú[Õ�E³m… ¨yZñ]ÛYœŽ”Åóéƒ�i{²YU|u»-€jta‡ðÞ–Ó›—ì,v°à:Zõ¡ªçÞº­¬ÎWèîãvârát,q®«o)Z‹‹S�«¯è,P6 üìḠó)!�s]ß±” 0™äCxÈä5`iØ4KØ´Åj³ æ4[Ô÷s¤ÜYþª’R\‚�ÚsmƒÝvàòù ÛXóÈdïÞwË??¾Ì‚–Û€e1üG¼^ס]Y‡p¬ù~Â…[àòvÓöRÌm´¿çùî¹Ìýkæ ‡“ïž9È}ä\"æ“ë$|-Û¬o'î­găãb% ì1ѵ˜‹¼]�’�Ôåè/«~ž,¦>œ¾õYqrRì»Bs¸o¾”l@ïéÑ襜DŸÖ-Zcò_Ö|Ë‹Æ5Iå�Šö»ÊÁ|AóFÔñ‡N5lÞ#V¾¬Ò?‰˜]1ˆ�6o &D2Xm®ÇbI_³ö 1“Ó‹�m9³Lª9Z­„^ ì] óé2•>…Ž�ñYk�Á<ñ›6j*™+U ­m€BÐÍ}Lúç0¶áÃìi{×;ãI¸�æQàDs³ß¥#'‹t c�¬¬�u¿wŽý±ltF&º¨ìÖèßž"­‡(‡ÎpËkˆÌ"ZÈ™Q ³g|•î…‘·Á³Öò�[më+§í‚ѽ¼¶t±E`Ε|=uFÖƒràêM|¥Éj7©êV©Þ{g(‚;§FF)ÆmšTz¸¥[¤~˜ØNjʹl83ëc_–¶Çúó�ið•xçWÃ<]‘ÁƈEEð¤[Kæa1uímbÀØ&áÓáÂ;À�»Ü‘]çÑcÙ×qå|;zOÓ�¤ÿ x$38þÝÌ@z$¿Ç°í{äÀÏè9;X°øWô³`Ât8zÞÀĶ´ûåië(4—?Œ@Þ÷ˉãŠó®ç‚IÖºôÞF.f,êF‘Í]šÄâXv,¡±hŸ5arJŠÚ¥‚àz>í¯²wÝ€ð6FÅ{6° Ç“C�5 …š D;ý ‘¾'zœ0mbî2`C·í/ǵKØ=­W ´‹�n©�¸ÂÉÏÁ•bï‹aêq,Æí¯ÎÇ=Ð9ž>¹°žƒ#ÒÛBb–IºŸ}µî ­±¾l8yù%-—¨óI¯ÚâÄGÄ À† ®iÔÁíhŒn³IÙª'Pef«�ILJ¯åäSv" U[ËŽ«}6Ë™<Ù_/¼Á ó�“jgÃ×…› 'b^A¸ï½]ÔìmÒ9¿6 j|Z8'H ²\´a,±£òã~ÂoqÔÞhhT&¬Û{³Â&7¯»vv;k:¸.!³cÚ¾Ãç+{ãÅ-d» Ê}iúœn¹sÏ�ð¸j**…¤ªoþo•›ãŸSªÔ ‘C¹¥ W2“ä¤Ë]î�c,q´ˆ9x ¬`\�ÙÑíýy7Çpk,“1{“…7ŒÛÍvŠŠÂlœ£ñÂïA€b qS¯i¼Ë¼ä}Ī ç?(x<ÇC#›4%iæÚ‘}¥¢Ò�MKÕ“G!îÿ&7€�ÒŠ7â=@Ò}�ш §³2òmúÝ6ݰ^O‹v†ªk�l&úøJù6k›�˜É“+’K€éÄö¬Ûvõ£ºZ`ëÙ :È!õ-Nz'y4ˆòPúe@´úç'YOsÉ;{}†sé �¨ÅØE%�X_,ã˨‘”¶s\j¾("w@¯´&.þ-,b±èÍØ �RËò9ñcLG=ßCÃP¥9òî p® -ñך`º’íhÊšãç3gqÐ öu1<°NhVA@*¯ôü³º»Pí0Ñ[›Ý�Dë¹M'ØÓWxÌ©/á‘ekrî ¬cæ×60}kTœ‰x÷a�¸ÎÚîAÓ9ý F�$Ûño &A `\™2[mne j±bPŠ$¿Ò$Ëó¡ÉÛz..{{˜ rVCŒç„ˆ°jØ8µcš8eDIƒpEc nÏ–S�£Ú*Ó¿²Æ…"D¥/¾tÎÚ¹·Ÿ/BnëcóDb2É2Ö�«¿Å2ª·Ä„  #ôªç²Gò`q$6C|²Ù6Õ¹ @‰Pé/áAZêdp ©ßuâyÎ&a=´¹2× ‚±Óh¹©±‡1õó\ {6i½�VéÏYÁßÞsªWÖ9Å»1Þ´õ×âž,-ù�±¾zt¬|(ý×Ë(`6!ÓF¯[V+Nѧi²ÌmT5o^X�ƒ"_¸U’lüåÜïß±¦Ï'®8…,ñ˜%à„bû0OŠÏù4ÛÚæUÐËM’ÈÄB_Âà/Ì„ãzýöõ�Ÿmà:�OƒœmB�¨*O½ P�²ðû <å°¾}rò±£òˆÝëɉÌ B��]KÛd±˜ ¸H„'D ÍHfʸ*ù°÷i�¿.nh˜Àöºè[ˆJ{›”«�ñrBc27†Jä—~…˜”4í�7-Î/‹˜½¶F]nÎþ’ó6m’X»|]§kÞC8ÖïG_`>ß§@·cœ­X�:¤¨o€U[£ÐÄ·ååWìAÀv{[ó…y/‡7OnÁ·)´»ÎCWͶʦB©˜5›Òq÷që¶1p‘.=©þ'TÛäŠ' †1½�8k°`žæ mîÒ´±ôt1“ÖR‚Lô ÷âO¦±¬[ÇžÁ¯ht`{µhÖÛŒÇC¡yƒ�Æ[„k²ÊÝí“ìݨc"ßLj·Q�mí(AE�ð7qW°W)žþÃæÔ–qWÀ! 磠Bk ´ñ1c˨‡ßò‡Ž(#N9!Kn&,\¿óWa²˜8è…°óû »+·IÁ2ÚOd¢9à A`ÈH«`‡Ÿ²S>áXp9ƒ+瀛´ ÛN´´âó7�ß"Ù,Òã-9�«5jïí7Q¾á ­vÁ­ÏkB·íà ™P=._©¯� #qã,:6’²füÝï÷m‡)W¿D’0•kÅÙ5ö€§ÈQUÆü¡¬^íǼ¨ÐlÌ0©)È:ùpÚÇs²Ûj›%Z¾/£˜Š~÷å?z$ó>ߘÏlÄV�/ì#ß­¿l¢wÙŽúÒEx>Õõþ¯™çG¯#Cm¬#©Ç� >pžÌíy™‡Ò´tl郒ƒj/e´)éÔ¨ô"†uÀðÅ/kPÖ¹´„¡e~îBˇæ5zún›Ùó²Ï€¨ `Ü4ªÁq¢wû˜Ì‡!/ÅÓ¡° _@Qñò –.åŽÁKaó&€±9<í´íqÚ�þ Ä+؇ˆ ô#[¶ÒÁ¡÷Ke] ö}7IAåëá©´VâU&Ù›VÂ(oÜ`à·µÙ¬o×åíÅs´’·ïÒ–C®Œi³›ïåWâá$È fCx›,M×Ä h rI“#¬61ëNg뤔‰z‹%†kc(òâàxáÚ"šÃlv“¹>…×AÞYÞÏun.]u›ÂÉ¢¢lÇWF*›Ï÷†<Ú \Ÿ îänZ&¾VÓŸ­¹Bœï}æ³=ï,™¶ÁM²ÕiLÔM+]°á’(ÌîsË *ÍïV ‚„Ð2’Á’:X#à+`l¸�y3µ|‚¶È·€:ÔBúáýÆ»=?4»"w ¿áîošÈÓÛ8LÛöœ-�É­]Þϔưm�HhU«¹[¥j9¦pŽAŒ*FÏgßD‰î[7òmí³öF³¸ÛóŒ.´øŒ$Ö7¸Èk©©¸í»ªáîj0\‹qí²yêg9g96@"i'üƒü‘ûBˆy4º¿ö^Â}5–O¥¥b”;Ê �Ô—ú¼�ÐDÄfZš1õ fIæýX¤ ) t‹þz+rô…Ãÿ… (<®ÛŸ0‘”xï´ìJÁôÂ肹éÛ‚P&ºÆ½¾tJ&„6Ö¾¦(&Õv[à×3 Ø‰Âõ³¼]l°�S¢ï¬V¾ÔdöhœŒbÙ¥©J»_™�ï@Úß(+Lx¢16_œÏ¬�GÃ+]û·�³V ¯ 0¢œò» � [ð+…÷7HÁ�*¥Ð¼r™ ÌHwCj ¯\ºÙmìO2ÃÍÆ!f“®QÅlÚnwÄQei�Þå/!x±¥[ì{kýsûѧՒÏòaÏTì u/Ÿb"›ì�ƒOÀI<]êüªE»;àì·ŸxeÏzg†‹ÀZ×öÏ™>Û’ÙŽë‰'Þ*—œ„£+JMï„åNAª»�h»L&îì›a52€e’2ôiž$ž…HÜY·öq_’°™ÀM€î¢Âû„º¡jWœ5îõg|’½øVO³© †`P¢U0ÜúbÃÁÕ[‚«gØcäÍÛi‡}ûa3åíà [˜ÙN–"ÏV³’Ø\ÔÁá¼,ï·ÈçâÖ$;±íQ—®÷bn·sa™'v)•¿¤–K0,ôCI8×WrÏ”Ýä�íæˆ-·”Þ…Ü:FgcpÛ÷„©Ó',ú�S¿1�¢àœPÌø_ˆ=©,fdõ.Á$£}Yßs­3ˆÜ–Êgœ‡�8éT—èƒe4Ôü§šÃXAô*ÜÈøŠZ™p×f¦ugòe†�y¤{Rzýó…âX± ÛÉ.o¡¡EYLuýÆäÖ4seO‰2Z{} ‰&@ÏÚë¿ÍwlIWÖÓ´Ÿ½<¯h¦-/\`P¿yV·®^/oS!ï›J=«4«[›ÊwfãõÂ#LUûh ÕaÏ{fÅÆi`>³9ï—sØì/¸O>ƒA©æÓ–쾳źñ?^®%œ@ÒioK—�t^\ío8vºº­)„«‡<û ŸBÞyc±‡ûÀv¨iHûEk þ±x—¹ ß<¿ÉI~{GŸsªÚ-gÅ ÌC=e0;.ÂÞÇã=I;cøT™¬ÏZ,réœÑüÓâ ÎË nHÄ*â`lãÓ›ˆI™F7ÕωLÇ ò}NÛ?8IàúÌž™ÒÝ/@²8Áš_Z ä· Æäð_;F׺ølj‹’$㨒Cè_u“Fça{mÎÖè—�ªêÛÜ TÄTvöMÿ>ç-âŽpÒÓ|þ¸{4*ã†Ê%¬ä ìÅaÁ# ~…¶T¯·�f�[\oåbݤ[Õ©˜CÜq¬¶JSrÿ 7æce–h‹‘på).,ôÃe¯˜<Û{»=pCQD6B ;¦œðw'I,ÆäçmñSÎWìn’󼼯qŒüÀš” ˜2by©Ú¦{bÜâ4ïmpÞÁW›òØ®QËYöÇï—–¼+[–ìs¸òBeÚ�&ÎS‡€îÛ7ÎA,Ô�6,(£º×��¦ƒêO „ºšûOr .ú¹v†iÓà�L9YÔ)ÉEŽ¶Ù‘*:çj$e©£S™.–éP²�ÏYš…Å‚Ö]¾tèØ®'‘ûŽ^Ž[º]ð`ö»q™ø½æVÀN }°Ö€o|Î$¶‹(8$è€ìIÝ­kÒãJ Ìsz òb._1èU6ë§Ã�Ø-¼]º“ÌèÇVI+ ïÀá÷âùü û,ÀÂÖ»Û\÷�äèØÅÿ¹‡~P·¦÷UÈ–Â._ (h^ÊQ´E…‚~Ùê‘þµÏÁ½‡Ñü`¢TžˆÛj8}à‘¿õ�xàgîó¾œÛ§Âjh ‹d—e{ңؒ ¿M¬�Möv‰4V¾ÔήûGƒ„´:éˆ>ɬ€à¤gtðC@·œ²šíÊE¡MÚ%À3þƶvswÖl˼bZðú—oÚ)�¸Ò8âNúƒPÞH¡¤-òcn“ƒÅˆHê„ÛåGÆF2ÜSÁGÜ0]Ó×NWÙ°#¦ZŒ÷Å¢Íä-íYžÑ»‡± ]âó%�^ÚÊ“c¼±ƒ-°žéº6 �‡!ËE“Dï;Ù€  ›bhã굈¯æ.c††Hå’öç4é�ö©Üä/jÍ ä×GÄ»SÃù‹äqk1­K�jÒj~$vvSMpïb[ÐîÒÀNtÛç�c›l\BÙNßÐÜñúzgn˜#¤ ,…�Ï8ÔÛÉO¼ü=a&C{u¿å=[Ö§Ç›ƒ ‘Ævp­¦lbP­™êêþ%-‰X¦õú%*¡Ÿeœ÷мZʑǘ¡^õ–%TÌ=ÙÊØ›Aa.§T3›ž„Ä‚P®’­â¶ýÄã»»)Mq½ æÖ¯èÂgºl-õˆÊs¤;' ¤-ó ɬëL.XMÌ["üÅû¢YÚÔõkªlDÒ"GÃ@'žuôóÑ×Õf€Ž/FÍ\¢êx-2”Îäå‘Çáïß�ò¥ÌýŸ²ç­žse¿SšH&˜QM—,¢ë§%ù¥::å†lXóÐÏhÈ{z7±\F�ø/ã ],Øùع~3 ¼Æ¼oúwa/Ý´uõêÃί�à Òì4�46�˜‡¿Àìjqˆ_¿´â;˜@2]@0))÷Y-etÐ…•ˇCíˈeK9ðy¸{Ðof°^êÂO ¹)•�•ã__ÚÏ ZÈP}4·gbî¤+¶7èýk<'¬ÊVЍÃ�þÎ4�Ë‚Þ6£æ ­-¾ÐɧW®û² Œ�¹ýMœ^³áÅ#Õì`9ý jÆkžN~R%2ZúAxŸ3€ëºØHôÁgóúÕ¸ñ’,–Ýmû×Ü(Œ,MÅ_o"hu½¬DÏòãSÜï.\ÊŸ´­‚˜;Ò¾~h¾"9�âûþÀú—ÙÁ�¨„}’jà­¥Ÿ¹¹nÏ×k¾­¢ ©ð³To–]gJ?²'lˆ¤²Î,àS|P%ê™Ç§ûWÚŽ,€¿œvj€R•xÌ�\#i_ÀŽûÔ+Fßõ`0Ó‡Ls|_Â�ùÑ8·.§øIªÖZÈ‚ž%C§ø-‹bȬIv0)Þãßð"DƒmÇaN[êgUv'skÖ¯ÊÙé”肯 vÁùí ;È.ñû�ÍζŠWœ�°Í¹ª†3±Y4z¯ÑmGÆVvG$CÀ}Ž÷¼ðbN¶þã1kÊA g�Q AO sA9¥hSBIKÚe–ËÖЄµ…BôBsÓ}é® YBU ÐVÉØ9¸Pý /!w0²gÛ ØK¯®§5qÙ�ÝžÞøöÌM«_˜‘› ~óë-ÊŒ%3• ÐaÃï†ã“¼[Ó;Ærçî§¹Vqà%NOE8Mdßùñóý:pó.ØlYD,Dwû·æH1ŸQƒTŒC¬r!6m2_l÷VÂm‡´ïÁ6}{%V,ßq›²:Ö²Î+§ 4Påë&· �6¨å�åX� ‚¯r†qÀfÆßÛiá®:ø.\63ìêi$ßÚåÉyÇÒ-UºØä_µ®z"aµ[[,÷³Üîhé�)�×Ûža–úà¾DÝD�&ì«�Òe³!…K?o—‰ =8…Ç•W“ð*Öäò°!"WŽ_!¶)Tݯ”Î�ÐÆ�„k6Ë;Ûe¼ÝèÃëJr9á�p�rÄ?¹§ Sã¦àq 4!YrÆ·÷3Yú›˜Ð÷ïz:�ñ¡Ôq Ë$éž¼U@NÂ>îé•Ñí5°ÛF4<ÙÞòűR— 4)ªT¦g$Ú®*åôæm¥hÉ­0˜‹Jº.ïŽ44.Â9�Ú,sò.ha•,<Óž.èRJ±°'Ö‚* �l4á)—êC¡räqÆMÉ+ìÁé­¹¾-CNž!ÃÞùGlªMß,rbhéì:Ù¬¢Ò}€Æ¹;W£âáíÇç+%sÆn7—zß2£xâÈ O vô¥d—¨õLpN}¬ÉÏrˆeùèoÞÇmõ­9¢Ác2€Ð[Ü ãõó%� Š2®NÓ2Æ@Ú{B¸ò�¹z¾)íef͇”µ¯$&ØF™õ_Z5îç?3ûŒá÷%³ªmï½Vï.÷ëÇ…I×<ôó;DÓʨXÃ(¢`¾ãzÉÉZ¶^ù X°1ʺ�éƒ ³¥ÌÓ ºU*t[â˜8t7dÄþûÔ­Ac<§Ð`óŠ¿Î c¾¹Ó Á?yïn|pbAù¹¶ìÏŸ|Ï„=ñtû/§bWWÒ‹y}\¶_ê”A±H�纯¬¾®šìj¼¬ã¿Qà­Îû׎ƒ””pá]„í¯/p[¨$Y¶ï].ž[Ðß=çK¯Ðf²iàåúh²Ë(—y ú­÷}Ž~÷£«oØ[n€"úmZòÏ÷“²Ä'ÐßG.áš+DÛµ:»ëá°\n5Û 3}ê”Ômpã|À¤$Žn•¦u�é»m±£ÅïòŽ HëÙ*œÜçtÂêé OwkÆÂ8«¦Ïi¿Âì¾ÉnŠ*Hì˜'£hÆ6Yã{$¸�É�Þï´¼}}Äýi ±0Y#[-è¡1>=MøÜº0Åeø¾qÕ-KÏxçùŽ]m÷ØÃ[êmU²AåÅïtL_Ȫåí¨™ÅEŸ¯ÀÑRϧXa”oo×nÖ�ìºüpTwf?œÞsO©«eºªDö@ô¤ß¿ÀØà9Þ@o³iùx ÏÊÊ{<oì¿F«8_ j.Q"§ø^3Oâ¿§´¨7J6Ëä~N«® ª /ÄŸNo oGØ�­tZäôfƒÈEC·%}èto|) ݦFµÓA÷ßå>Ûú«´öN5}go"^•–úε´ŠÔfÌ›EId ²‘”ãef"KÇ óO9Ëõ:±MΆÙùæÃš/Ú¼¸T‘4oËšgVÞýko[´ÆoL\òLÌ=4E®XÈìRÓ%ž„žþr‘ Hœ®”5¥ @:„”ÎQ¡Œñ™ô²›Ígë„?v—ηž d꺰ÈAÔjÌ™m�¶€ö:’îÕ¡r#á©ÚS=.r­fĸîíñŸìdÔhôíGĂǦ7K6W¹Í±‚bqÒ)ÑUÅl^ c:ÂðA®|=÷whÁP¾ƒåGº�}¿ 9®oÆüÁµ›hyäY[±ÀL`·>~`¶,èê©ÈÄs\ 1Á‰EäM7$ô9Ù4>µY¶‹­·uËêå'†ÏD@ä5 �Å´j9Œèëxõ LR’ž4(—ÂL:ŽÓvÝ‚Càܶtnê*¨ÕVñi .MD ¶ ,™•jð{ñ…+nך2Ü Æq�@b!v²vSÙTߢ�47Ô��“fŽûQ’;Ú‘Èìÿ7=ÆÑFaº½ÏÄ�¾YZ¿vÄcn§bôÏï‹¶üœ¯�.|ù0›EPo“\Äæ-Lî>v,Û¹¦I—dQŸ!,!ì°_uó² b� q5k\�T;Û_›mãä?P¼s™Ám5�ü»ºë ÈÏoq#&�oHuöÔVWx¸v/=£(UH¿l5†kôÙ2q±¶Ø|nAnNl³ rdѳgOeÜ"Ç Ú˜#9É„X9Ï\¯,<—¡gømkòk�Ø”tÎ�Åg [�Ä ¶+…½ÃÀ·1Ë_`û4ß®Y’¹ì+¸«À,Ú‹Y*„œND,…�>�ɳY¤éèqeͽƒPƒ_ÙòWj½l$ë>ú¾;â©—¶5.’ªN™!ýõÛÚßÈc™'ÎÕ|Ñ$[Ôõ“wmYLP%>Ìúïk’²øšdðœ‹H\¸Ã¦˜ƒèµÝF¥ì\žwšœ) »žà»Lï÷6He,ž$„é3ñj´Á ¼h4Ú( žG®êP¸³ÐÆáiŒ#‘4�bÚ”À o¶K\÷ȟĸG�qPo{‡ÉÞ~mslZdÒB‘“QóHØÅÚÈ,XñãHï—G¼N2q‚ZC|ð5Ö”·ŒÞ’A ò âߦ÷ÞYÅ×x ÜtúU☠×3T÷Ù}«Ö_*úNÛnÿˆmû8I0ú·Ñs¨(sÐÔmHtƒÃ7ôvÄŒ=GÁmÌrÍõçŽß1½Cáœô8¶�ì�o›Ð<ÛËð—À‹Ì™�“TU9Ä’çã±GËf-óCÜ<ïÁyYWV¯ ,iÜN¸÷;†m£Ý^@ñºKlq‹iO8M� ÈæÜ™ÙVŒ~[ðAéžÄ+â[�O¹N¾7Y0d¹«2˜ììé«�I Úfö¢h˜ßKßx#ŒO­ÐöYøß}_c&i…®{I¡ƒÖ-U9‘K6¡Ý³NtëõN3+ S°Z�"î[Þ°ëi:ÚÞ·À¯Ø•Å?ÁÖX1;FR-” â;yí4¸Åo›º�Ç:ü:?´ÑZú'ËÖ=»õ«d§q¼jÆó{½Ký?©ÈàÂJªoøC7Á´éÂûúƒu–ʯ-:÷7÷yûß¹MRã"oÃh–Ë /ÎAî¶¼H}Î_€˜¢SÍðb¶¾\¹°SJ·¥(‘CWl,†mÄÍE�…EPƒv™$´8…§WBŵV ®�«éßdí~ÆÕGNûë—U´Âç—ö3ãg¥ YÅ0 'µõÿ0«qC#]O‡Ÿy×®c—Æè±Yl¨ÛOV  *Ú¾ ³gªS@U�lÞ³(8QÄ1ZâØÏÓì³åS %&oö,o™ÎbSºk[sú y�ÕU�ˆl1죆 ±« °_bЮ.Cˆï˜(Øq ¼92±·Yo×e) BÖù“¤Õù?w6…%�ØÛ9¬@ûø÷¡•W±Î±2åö÷ZœÏ#FPbè­»Ã�& ½Ã›Õí°�½¯‘»RÍ“8V „Ç m¸u�ئ.k‹Ge~Ñ•\!±s²§e¦Ë[9‡Ý-á2¹õnÄP¤ÅKiÃê‰uFTt¼ïŠ[žÍ|žlû¡ÐÜp÷Hàn]KÛz€Báî á³3›PéÑå&WLã ^wÊfå±z¹)¦CÄvÁÓѤÛN�‹•~„òy8 ¥_ãŸ]ƒq¶fÚéøÀÉ;(fγ­–PËâ\ «ܤM>‘ s]S{4ì#Õ-ÌŸÝ� �Â1]#-ÉcóDZŒ|�]7h˜î5žµ*ÚzÚ{ØêýL>v¥œ$ $#] ;ŽxµékÇßuƒÞÁ �àÛA»x„7«œi<ô­õªÉ-ÒðЉd¦¤:°Š ÜØµQù†r®·:~F‰À{0^ IŽñœêg»êÝ»xs„÷ßp/èñE{%Ú¹ê[UÂè(´Ùƒ‘ÜkãÏínéÒï ‡Ùq{ƒˆ#ìÿ6ÍäW÷Üu"hS}+ˆ^�ãOp¨è´«ÖQ ƒ?¢u¤µlŸx .@ªŽºp’Ïh3Œe ÒBá³XP#ÇìE=�wŠÒèî¥Z¹`«�ù�[ އ×ûXÎSœcãÚËXÒ‚}Þþ}3¿Ô^ŽÆB_Àöøâên‚”°Ÿ(-NrQ’z¨�Ma˜ÂRö–a{6z J>ãG´éöq�)º]n9¡l ©RuT3®ü-„!»;@iÇÞùÍÐ$pCbjÑ£�÷dË(LKíêx·îõAر‚Á Wnèz´*4mcJæ5œZîHS%M[‹®ô+p• 5•_^‡¼ž4ÄcÆ» ÐðÀÑ®p•S$Á^¬ �꿟žžS÷¾‹[¨à‚v5¥ þÊåÏÖ÷9"Í�øá°ÖZø¨Úq?~–›Óõï$J¾çÐ^‡M®ÁTiG ¦¸¿µ=°WóÄ YíÏxÈ2$¸¤zÁeÁé£Xâ­±áÏ-v‚uüýãóÎmÈÒÎ鸶-��ÀŬ-y4±A®7#áPb6 yL ¼|„ÜéÚ>÷³Îf.¼�jýãvÕöj6ÉŒPÙ�L0°üÄ¢§s/h2Ê/ßKË�˜L½•ytÚî`8yß%=SËžw›Òk.X€Ø0Ú±¤Ö[,¸å$·ª¯aR9o¯Š39•ÄáÚMDìyl”P ì˜aI\(YT#¤�å©dŒê6 Šâlë@pM�±g]s@cƒ¨�W“¹e‚@τ £Æ¨Åú›L…ÂÒOjvI[ ¾”à´•m8–²öÏÀÎA-Œìƒ‚•XÆ9vޏsa‚`H°!ÙéñÒnRdGQЧ¡,½ºÿ¿aqÚìþý†{ÍÜ JWÈ[•ØFµ§ ®¼e‘pù2ÅèŸò°ËØ8÷ÌÖ!MXgZœ Àƒ&¸Ü³5�›¤R‹q1íš[4ñš½€«Ø’kio~ëÏå &µºŠ�èãµì#&zÆØdL†FÖ™/ª[¶™ÎÅCšY ’„.Îtl‰ÚNØ~M ÜwÄ[ÛÜPÝè#È`Ï�ükJW¶®šÄ´LhÞᔘ˜ŸR|¸œaCûXpæÖ¬³ELÌÁòO¾'+x2WƒÕ©æ�UY¶5b’�b~ÂNæ`BÖ¾ìbMÛ4,G´º«9í°J%µ»aœèqµ#ËLŽ$8‚ŠŒaV ;1[x¬",¾mð¥*AhüÜ®³&›Ã×–/n„ÀÛ½rÐŒ b!_ZX¶ÎƒbòÍ.´ËWTÓã Îý |"BÅåmW ÁÑìl‹…��¨n±&�Ùò-ûnšîÕ× Îy¡ÏÝm{‘Ã^mLõ-ƦýÛéû±°¿Ë•…v¨œëYK\x@w÷maР—yb~u´}´nv«Â 9ï[‘f,òd‰’zr<‘AžÈþ(¿[#×û �œ¨.)±haɰ$gÕ ‹")UÔÄ]¼ØQàP Ng¹ eZÕøŽ­¤ËÍY·�¡§ÉõvKj°óÂÅ8Ô© sv{8Ñ[¶Ïë’éý‡Ï£›žÅOÏ6öDÔ®k ìrë/S«—G6ÐæA6àÂ’…O‘õØá�ÏyP‰Ú03'¢m“T-ô ;—2ÊY Ä/!û–jæ(ëxÛOZ)àþÂqx}Rܽ/¿&YB‹Ì=ðšï¥=Ë¡ç2ÐТ‘Ùˆ9tÛˆ½5aˆ�mxÈòÇsÊRÃå¶ÓÔ[£¾öó�Ë}ݧK,çÞØ >¥lîØ-¹Ë£ÕÕ¦«˜M|чjmm‚Á âÉ`Õžw\š‡89Ùëœâݼ�#÷¸Ý/¡]Æ ÷Á)ü×Å®äËì‡ÚÅ|Ì‘ÐüÞv`«R|aÎýhÇœBTá£\ ›M{} Ä?kF&,À˜Ï¶áÚë™VÎ�·ÍÓtDT¹gý¨7^ ÛÏLžéšÞ©uø05ë¿3}ðÏ ´"¤æëJ%û0‹Õ®1!�îqŒ^J‡ó¼pÝsVùt·g•Ë|7ûO.^ŒŽüdä.ŒòY3�ìõ7~¿à£Ë‘E±oÝP°3¶X-Ÿ=�$$ΣG½_µÉ¸½ìB˜~2ÂD*:Îìô ’’95plo,Â" ’À]ójW .€ÙÙ�m€­œ¼òg«…ZÅ¡ëW�M�£ QúÕ×Љãè¹ý Öm~Š{úqãýOµæd" ŸÜá DAAø<š‘áMÆÜ,ý�jéœÂóOhÄD½åùieísám¶oóB øjcÜs|µ˜°w| \K°ûÕwvµp¨˜úíµ³ã8±å+9§.Aãs"„.ÙA¾Â܇œ R�Ãq@ö0Öëòl‹®Í.qtÛnûçZÀÙjÉ#Ù‘¯¡†v”±£ÊéÛ;Ä}àr•¼X}ßmtXnÙ´¿®dT¥©ÆßŒüXÌ;Ü;4¤ 4©*¬x‹X.ñº �êqÀÆQy`ÃG9†Î­©á+Öã™g)}I¾·”ÀÆ_YÄLšž[¦pÎØ‚‘ …±‘… ØÙe�¢íM%Ví Ûv:­Ö&HôÉücå;E�–Ú3&½‘ËÛ¿,IHzöhLS -Ü ´¤[(gSë5ÂÆg”z³r¥e-Ãtäj¦‘‘m5GZìÛz� ¹œb-ª�ô¥"§3b¥J‚+µ˜ ÜM,ãÉ›*(J¯0w›Ï+bè �ßl�=ëa�ŒX;Å»’[·­ì nìTd²9Òn²®1 Àmš³¼Áß@ëtÚm0.–#­ÒX«t°âȶGɦ—pv.¨K_m­+9`çq0…­[H9ºðîÁRϵú°lÕåÎHk^¦×ë¹¶d¶’‰ª1wKw]Ëbh91hÌ<#éugªÅŒék——ÇYpà²gÞv„V÷Õ²jµ¥a ÊhZ€¹‚œÑ ¬*!•xcY«‰Øµ ¡F��¸nÉíiÂ@ó(õ*Óh­quef»º–IocdpoD²ÆMT"˜ÆŠãfD1ÍQk6l¥÷ÕÊsÍ1š!ÓþwÅ…¸ÿkÀöÂ']˜¼/yŒÝXh×b}Ýy˜Úã&­Œ[Q,ݶ-"â·(JÇ!ÅðP›DºÄmEÖï/ºƒÂÕY‘­iÀm«H]p}8¸8åœ6D�¸6¾ß“ñ–S’#xo«Ô.ÚØÕz.é@vÃ�ÀD‹jÁÕ©0ªV…ÆT_þà¿@r¥ÇåÛù·¾C+.¸´/W¬e£‘èœËvÆ–t[#9RbûÞt÷ݰM^†Ÿo¥KßÖ�í$ZJµ~”åGYÿ›¾h�b¶²LfI"‚“q5VË9Ø·H½Eý5ع�ÛJ÷Ì¢�~.ÐGáâ ë„c”“k‹`ÙÛ&7I» øA̳îúïr¬ÍJ¶å´luÕúI¼ŸƒE…yÙNï. U°[‰Î·ñ¥k†§üŒàÚÎy¨Œ3é�ßfÿˆzv̱`ê�t üÎò¬ŠâDöGº¯@¹¶žðŸ<Íp7æh¥·ók � &mÔæ{.mµaÀ«‚ì,²½ûÓŽ×`wh{‰m(‹tåž´A¼6̀ݾFÏ6“ÝX]p;�ã쵋<ªboPè�±, XN»Âry«ÔL„ÈHå[>´‚\9-G½‡¦ä¹ÎÍ¡¯g]ûVîUÛ€GííØ§�Uq~005Å�XŸ–.îsýÆõ¨ýã !j}‚з?-­tµ¹×ïÈ÷NEùh „m“"! †7Jèö¡Õˆb­{¼-Vaë0KV„ ,°öÛ_N5‡Y™ 9¼Ð{_“”ëÐv$U8:C˜Õ‡Ñq|íš ·ˆ ¹ZúÛ\+)_·‰ƒ‡5&m =]„s¶7 .Ï7À çL«cÈÏH×f dÐý!ËaïzŃ&Þo­Ä�€žƒP X¾.žœ]r�íÎ-ùÚ‰V³óø;܄Πmî³½úÖ…D]këï\Ñ=ÎÃéÉ=>ôP¥¿µ/QŠãÍb‚ÒÑÃß.ÖêéþúË»�šùj_®©{Oß E�Î䇕�É«ã �0ÏÎñ'ºT5%`àw!�¼G¬Ï*:HÅÙŠÄ|é0±„oÜÛô4^./«£Ä/$tuër…±¥nQßÅ&4s�ëÁµ×.ã-ܪî÷Ç#µG¶áM=ä0 ™Ü0g^`�,�‚P™Pwа×ù›9—¯}ôú/愤Õr× ©#E±ÒÆ“��{Ó“WZ<áÄý’ãJWÏg‚-×Q,Gõ�ÎÆt¥�«©M{�Ÿ­òMJ5Ðs~ðìxS3ócãð(ëëï"Ïé½.×òëßx´Üý8ƒðß×´·|ôUK Š�Õ„|&ƒh5VÊ£yÈ΢3cl¯y�§æÔAlN_6–õÁÊ\œ²‘ÛÛç�ì]’Ö%Å[ m^ß_÷KÜ‹Ïuö:@æ«Äɼèþ˾—ëF›Âà{sÞ[š}uñ-¹œ^C%Ò“÷ÍÙýl<€[^‹ÚÓ£··»‰ ë/ß>»ŒgãÖŒjh¼>ðUÁs<Êý{“‘/1xt«M¸õ!¬eËædÒ÷Œ T˜Û&¹Û€Ñd¹bG;�õp³õxfñ.D‚ n!ËpßZ©dï–öPœºä$°�XTk÷½i•½ªCl|‹�rÇ}`i–U¾Œ®{E] �—wñQ-Kp±âöRŠÒ|¨ú·¨4ôİËþñsñ}Ž]/Hm¯nH#5œ)•¬4{û¦ Î’à×^ì’xÞQç;ìtX%9+â7iutNh;Î`'�W»¾Í>DúÚŠ½Æö¿-{¦Æ–„äæÖŒ¾ô˜’U"z—qâñx3–N+ЫF0%çKÎ1w“mª›Í5¹Â8M¢ ²�V&�2ÌM>§Ì‚<eUÊ8©#+Œ"û �/AyåµAãÆÄß‚ë`Mt¦×¬Üa¶°³!lwÒòQ6²è¯eеþîÔ[�"v¬ÂÊ´/2¦ÃnöƦ úmíÎw(®ŠQg7tµ}Œ‹3•Àµ´'3õ½kƒ¹šö4«Yýw'ÍúE™-dÕðþµyåM™ys÷½øy}ƒðWÕd£é>~óƒöœdÌ*‰~öq30&å–Àƒn€ž[5’ˆ>æPÃ3‚‚�”åiÑдœ7•‹`·'ó~ü‚™t5̵Þ×ó?«™@èàÏŽGršñ¯|‡uà|r„Õ¶`Ú•„„Ù&ô·‰Ùr­—„‚½ò܂ƚP,*ò9ð6}n…#”¦…J/÷3�Ť¤‡ô³+¹nÃ|5“ÓšxJT¨ÅJ•�o8ÎéD2׺WµŽ† á­ˆ=•à¶¥ë™GŒ[ÞîÂô­ãYü‘ˆ*ŸaóêÁ‹Ýð„œ+ˆk,MUN°c³CyOÚs¦C‚–BLcK�*ÛíÚJotj_C1Èx…$æ=o>Û}}îu� žVû³f†/n°?a‚PÊ:°Vªž‰»-«„;ã<ÈM€=ö\Åà&;Qüæw‘•Žt ³Ç% l‚¶@ï¢õ�~„²lX_–¹y‹9¯HP÷ê“ú7b™ ÍV¾Q¹hÅ0«Üþ&Ç�$•M|ô�å’á$jŒy.º…/îe#±µž-crÒqž&ð`·¥e½Øã"cŽæQCuÄŽÌ/å†èHºn™^–LM7_ ùv„µà@œ„‘é<~·-I-ž¶pÓly1; Ø6²&Àü· eRÚº Uj9ÐÄÆÏ�¡$ËïÌB÷s\òæÎZ�™Í‚–�°pó"àŠ¬Ìë}&´] [á)K·@±f6nŠÏž@¡Ú†ÚåÓJ�D {Äu/© /Þ@DÂc•·ÈpMqL¸ÂÛ5HŽ„× •½vâqà!lnW5íX¾ešÄnCÃ>â¡Ê¶(þÆŽm4Í8"9®§®š¾†m޵¶þ¨A-˜&«©x@A>„*¥Êñž£Ì 5âÚå@ZÏ@jneÝ¥½•P¼�e5;bïE�÷y©àZ¬Õtu2úB @èqWU²;pKPiRhÃg~¬}²Ûï<7H rR{ù€@�Åű/CžèﮉP FÃÆyœJþè©û“Ðö’³¬ÙB#Xqïpb�Ÿ´»M<¬ç˜˜H«h(.â{]¯"Ú{`ß Úüq½Þ[Ôûâä=È—�F dNøåd Fé¶Ë«FnzdΛ"t ¶sÓK N©û iý<µÇ<8Ì_ÕfI2á<ë;pÒ=°ËÜjgÈ`OÛÐÏ·YûìFAÌ‹1³u¶�pKYÍ�7êÄ3 h8 ¹õ¯”ŠÃU`½¯�ðËÙ5®"*ø²8 ®cÁY!«ýéâý`šÉm/´<õ}CŒYÎaÛÑѹ$ÝYÞÉi¿ÄrÑANh×ûÝ VV,8¿la±]º¡t÷ŒfCÐí±«9×O ZL*"éØs~O`¶àï}Ú×pአÙû†²oynãDò›) Õ„³¾ ù-|óƒ¤ÚR‘ŽðèTuVvZ'¶ÕR9–fݹžfë>\}œíƒš—3ýÉ£yjïU×ZòS8ßÁœù‚ûÊ8Γ…±×˜ì¢¥KáÉî3\ú[xpÃCÈðÆîÞkó2¸¸ÄlžÌÚ^±-@_C\»�Þ9 ºóÙ‰ �ynz…GȆç·.°-!k�桟+õëüåi¯ÞF©"µ�"¤,·ñpXç)�6øÁö­²yxÖ{ýÝï)~ÎAôÇw'$Í‹Šž*ôSp‹Ú7m©jÁ–¼¸¿7ÔÐkÍßC€‚$ÍøF$giX0<ñ¨›NH‡lÒ_½öÙAæ5ö,ê÷쟛;R8Hƒ¯²˜"Ñ•ñ—мg«�±½?°óã<©åš—$(Ëvæ÷SÐ}oOÍ8óÁSëÀ½9�Ã0!ˆ»Ú¾Œ‚!bï ‚jÙ–Kµ÷LfµÓìm�¿×�Ötsa*¢ãÉ,7Är·ÜØÃÒf<&µc ³•Ìž²Œ‡mÃ^ßŽŽ³d&¥}AÅ Þ�,Öœ¡ Änž†Û?Ù @ÞAk«ú8£™;ÊU׮㇠B8fr2�Š;ó«»)uû.ȶ×Ö=º}ô­ë�ˆŸX»­^‚&ß"-�ím߸v›Ò|ÓÍìfrP#‹Èý.7ARîæëÌG¶Áu¹[ŸÅ�°y „�y°ö�´æºñ‹uVùÝqbŠhÛÛ·{‰ 7bk/Ò4“‚'uÇK éÈ�ÅâéJ]L[ nÁ}êL|‘;ü?Y©[Þ«EçÛs]Źò/ª¾õ†ß1Ù©&Ñ÷ì{�ñBZØó¿cÍ“oAë…`ì%M»û¥ פ¼µˆ(UžZ4îÒ7H=ùÝ‹Qu¬ø²‡x0ï^¢š€=�‰0:ç™Xg·&'×+lNùoŠ÷‚êvyšÓ'¨RJg%òÆ�ñÀÜ…@½½­.n7¶…¼cèô!Šmåz©²…m~ú5\F¯7Ð}¯{ŒšåµÜÛ&ŸZ›VÂáSN¦¶·Ï*}ʃá~ÛeXi;Vˆ!@b®ÞU¯Û ¹ÈÜ=·ka^M�Cw‹"ºéÌo‰æà$S@a¾™…éÑò6=Âì÷¼¶*K×6w@Àç!³ªK1m? ÃL¥‚¹Þä1Í[1ZYo¨~¶_“ÙàzÜk”û ]Í~´qJ›¶ 0úrÀß²µÉ²9y~ ä%ìÆ|«pCIˆ.hÀ`É"HmA³nÖ}e�ã}3 bbŠ9.ßtÓK::Î ¿>;ê&•†ÉŒ¶ð,„–ܶà#¦Õ7å ¸©væ—‘ò�@9—GÔmÛøo®Å%’÷\&ß/A³†ßuT Cy;Y"2©älcò„°í[`Z AmÂv;ÖŽ…ÔI†ÉL™ÙKVs|UY/ ¢�Lsk™ìTƒ`ÌiÓÈÃêÃø. 6RŽI±ŽËÛ€ÎüËB5c¾KÞl lK&Ói+/�†®ÂNŸîUˆ-A^?{MÉö «n†Ï+¤rnt³j¿_¨Ù`ï‹ö²46Ïë�QWfzh°<ØEFsJpz:ö*ƒ¤8ÇÐЬxó\ëÛÖ�Ø5Ê -Õ-÷Ш�XÁ�ƒ™fÖE!,Á0Úþé8Ì&@u±gwd[n�@§ì/ÙVðÚ'½—|m³Ò#¤'‚®Ûü°¯Ý FWXfXÂÒ7‚›8­íi¿Ûû¢7Î�òC¡‹µ´¼¿Æã‰­�õù´Xºj©·�-b6e¶Òyèï:𻕂†«ÂË!ºlÚßÔÞ‘,2=Лú³3 C½Þù:—ÒßL¦âÉçè ©ÑFsœNmíå¡VàªõŒÄü–W‹ìMËoŠêk6írQìæ`HúB•é� ³`-¼…¢†Ûr�Íúí„ ™ýÚÚç?!jL ÁèãFŠùÖT$µµÞâåÚœê=X˜Àú¶¸ƒO"ð•B‚i†nÞ¥ [™ý,”÷½µU@£½ÿ.TOhÅXi_õ™Ú®ƒ5>U—pUœ`Ôþ±Šëxí�‹�ÉwD ˆ¨Éš9îw&Àˇ¸]ÎiÚ&Œn2 ]y¨V–BÞÙË%¿ZBÕO�&^�²¸Á{ÔOe.¾}âP[רA—y—² !,áùõkY`�ýì^1�èØôïËy¥ �ÞEe¿TW A{o·ëÝ{ÙüêŸböÞ×XaÖóGœa#»ìù»Û¢E„§¦Ã�d¾† �µØ6™q¸…ôË‚éh(§—,î¦GÜ€¸Škt”qÝYD%Üoj"@»¥ßV]ZÃk©~TWØ‘¥}”�}R+Iåá5ަ˜¯ÌxJÓ%Ž-悌õK¥<ýœ¡8•[ffDM6XÚUD¾u¾îÖ¼"EÊ;ºÍ°Uré‰6W¼S¡ïW­mo·��ô98'Þ{Ò©�`Û�ŽøL}óþØ4_Xù‘kó¶.sñƒföËÅêG³£çcjÙ ©ŒŠ­j¤±&IŒ«¦Û^¹Í÷�5_^ÞA<¸kTl¶˜…")ù%Wû—¬y·m| œ88_ƒ~®/ç ŸÌ2Ø€Ã+Qá ˜c…n ]~… ФBáÝYΣêÐÍ”³b (CÈ'ìYŒ«@âèóŒŒáv« ÝN�µ™Llx`†-çvÔ_ÕÇýʬÍÚŽ\§�úG¶„ñÝ퉰² q“”íÖ ÅÍ»˜]ÔGYF²U]úöìûc‹•’ÍËl'åÈŠßÕ3àûŸÊ<÷_Šr'§MÔ!*Nuæs‹‚® ¸%ÑÒù濈9‹ÄÊy]%”–õöîu5zåx(¼2¡Ä •5³À„dÂDêðÍÍ®«ó ÜŽ~Š2І÷WvÞÍLQ ˜z›dӔꟊèàƒmØ3“Þs?´'0ôïü¼G%¹  ³µ�Ôð˜�Ü ”s‘^Ää·mÙœ$$!_Ým|±t34X0Á�‰9™ñÙ¡ƒøö>l@€[¼.'pe–„ÜOúœò€Õ�Ïž«A, Ù»Ö(Ê`Á}FÆc‘@a)×1y|¡æ¢Á$­«‰7(ƒX‡Ì54åk—<Õ!oquÛ_‘Ïlë ­’³ ×œ>çµÝ'5Ùòa\½£©Ó‡¾ðŸ¶4Ú UY¡Ž3[W-ŸÂA—í…¶æúL#É73ž�­Ð˜ëΗDôûÞÅ]KͲ  ³:¸äâ2™ã†iÂê ¶ª.Xó8õ½:°EZál‰¶§‰›©#$3í°s\VÏ7pq‰¤O+^qHbšŽÚµõ{ºawŒwÔÚÛrûákö­®á[mbô‚Üeo·÷.¶ªõ”™EžÚõü|¾í³Îž­Ï„Ú�=Ë3h͉õäå÷ôôC;Çиyût$1\ } s‹Ê!lûÜìSìu«å3�±LácdáÙ«ëG” æ,r¦¹¾d™ËoéîÑn%�•9Ìèݵ)¼Õ‡a š4`ÎÌþÂú§‰Ã ü !�‚ßë3oW‡3›‘ÑÖ%'ÛÆØ�¶���p°v}žˆ�³l ×ÄH‘�ûI²~åÚ:¾«ÕHP7Qî ¨wíÝw|UÜ‘­«+Hnsyb[Aºw¤òµ ‰‹aWbÈ(EšðÓ«ºý„âÎ:�RÌ5Æÿ¾¹ž›nÑåôï9â9†D‰½PG é”z¸½UÅn(¬”Ù‹ý LŠu#W�eßPðæåÔ[í¤úÄVé¨Û ÍŒrë�֔ݻËRÕxg÷â[Î Ÿ„ãpAÂz’ãœ}äûµqÕ�Þ¾!ÃŽ÷ 4£šë®<Ã漢 ½œ„ 7]Ð_Á´›IæU¦n ’Mã‹»7‹¸ÚryÙO ÚÔ[2¹eòX3-©qÞŸ!èÏRàÆ]äsA¥+ù+ y�½òQ¹áž3дD¸,•ņÐäâ7êã òc$AžÄÎ^kÙ™šo T«\$q\RÁ6±²Ýãàìc¸çÞAûW"]S·rarÅiÖÜ,©; ˆ�z{Ç׽ϽQÜgÊ÷àŠKª…Z%a© �e`¬Å:žs¼¶YÄSyE·NØUØÀ÷ ì·îþ–=z@PÕàûÂð/Ýyô[A|>…zp|܈‚ñÊ#g�ÄUšh¾7¥Ò}ÍrÎç´Ånúí�‡Æ /'Nì÷ÓÕ|Ìc;cÊœˆ+]¼·o]()^`̉5vïYȆ3‹æ°6q¾›’¸1ŠÈb/û7�Äe·ºÞ¤q¯|>y]ë^Š”“ UÃãZT/ºù²µ’-EŠÎ'ßÁ��ñÃR,×<¡�˜ „äCìP©¢ž„aÕ‡*RJë8å[Ó¸ÑׯÛXlâ6 l7VdI&ë/$S´ÚŸ7§æ�UäPž sÐöìþ-»c–(µ4Ô‹GÀ6m®{î§[ân?‰ñy¹õÍOa Û̪ù7æ#v³Ùè²iš{|¾¾pð *—lÞ¸­�‹ôïeNò\[).^²ßL�+ÝO–µÓp‰Újð5c.r>èh7[ «—=ªá¾¡÷oÊ30½A¤t�§ý+|û³ÁšÉ€4#�ÖC|�‡«ŸëUƒ³.øàÀŽì†µ* ™F+gë=›çGöµÅûóèSx"Pz üDrðõóêÀĻƊínýjpRoDkâMä�mgAÚáÕpÏòhz&6áœ\¡�.¦ºh†,`àd[‹œ×b~™jÃÚûÈÂiŸ3|°¶1«:o­Q*­oYÜeÚN}ß¹Æ-ð»01}°Rl ÷Á]ù¾W¾eó[fËêvųRÂãÆÕgyû;ÂûPù†Fã¿'Ys™ŒÀªX�pcO™ÇÃ-ð6!渗:M<”Ío•8´¿Ô°Î[‹iÞÆñq´§ÖÐа†5‹XWB¦³¸Ó¢cI¨8*Ž\²éýwáE íñõl¬®§i|2~¼Nîå‚�‰6 ¥2¥ð—¯ã)žq/z1’ÁõwÖ:ºÄ¥ß,ÜùÁ>ÐͰ+ öÁ„¯yN];p)|WW9±{3çÀeð«�ê…KGŠÍ]‡ep¨åÆ+ÍO†ÃõmuùÛ¥8 ¢Cù# \P^1GÒuÐϱ½²-¬OpVÑí÷ãëï¿‡Š§Í•º›~>mµÚÜ=³¨‘ÙmgZ¾Hoš ÉŒ/{5Yy 3"|jÀZÝÐYÿq7ê[ óãÇu�C~}Ç aÊáËjåU¹.Ä{y¾­¤Ò+÷I®ÙŸ™0Q‹xØ)^@³HÁ�ѾÌ=lN DárñŒ×J;;‹Ý[›€÷«M£/ñÆž°|Kar¾TÁR€¦y_€=oH®Îes±¨M"«â®gë•E}i”{Çù|ŶcˆŒ_õÆ3#A0_ ì7äã)1h¼!’�Sê丱üqà×éW|äÜò'˜¨»•kÍïdØ65p"d�‹–Šá�³wϘ�ƒ=ú´¹o–×øÿ4Ðã.Él4é×G3¯]ù{BÆ0xl :‚R€ý‹C|p ‰�O¸È{ሠä±\v7Bk&Û¸…¢ÖubÓ:îöü$qÈD&b"ßo×%ø/�²ü¿q«É ÕŸêôÒ†‹«ôÇ|0õv^ÎÁ)MíxÂEµ…ñð{X’’NBƒæ£zò™ ¾_Ðyw®eƒG·¥ ¶ÈÂdh3`˜…Aùy‰âŽ';åÙöF7íK{Xã÷[ ©~wjWˆ]ŠvÑÃ�½ –NÏù7*Ô ¡mo]~¥n¢wÜ}šÐhÚü GW]ºvù Ey£t…ó¬sïÒµ¶3{rá@@FK«wWàñ,öò÷<£Ô•¯Íáë(‰ßzVMÈ&Y‡J¡QGl¨lG4 ò/QI &Ú�D_ÚŽ5[èf�‹kYJ4d’Ê�!îõ¢-“s� Pò(o¡Ñd¬^¿kP¾§Ó–N�i–�RXí· ØÜA–pm;e›6«uqÙZ8—£G& !±+ò îçÛen!YÅ„ü†ÎšóïóêÎS*»™r~ÚÉç°j×Ý„Ä�+ZO…P-âª×iY3m_¢´âuXŠRÚ,ÔI#=Ã=�¨n6ÈMi,™ŠÁl5e˜¾ÜÜpå{Ò®½¬­vÂn4M’ö3p�†M?wïÍ1ºŠiü+'¯a~/gº–³ðŠD ¶Ró÷tøüêø«>2+�ñCF-/{ºÑ�~ÏZݸ@‡Ûa«°íËm-ÄPTŽï s;þåγ@¶8 ª �Ç2¼ÉÒä0Àׇŝ޸õ’­L`æÕö  ÒbÂ�Ñ H2™�céºà»hY¤“º«/Åõ›cª,N°û×­ëÞ97‰ÔKJÇǨÛIüŸwíC‡ç«?†&Õ‘ …òÝ×çê¯rÔèz@Ñdi°Ù“ƒ¾^ùìnBzØR#%ÆAc§3Æî˜ë'S$ hŽ?~^ÄÔì}ˆžËó4&>&qç–Óv�’‚K•º÷^s9k÷�AÕÆ3Ò˜Ðy˜ª^¥ü=•ýÄ…�~$Ô\¬íéÑ©ùЃÏÒ¶×}š³´ÈH Ž癋ˆ©ˆÏÁ¯Ùøe‚™°ƒ±:,v:\ò›"x@Á() þÚ�u09ÅÓòxÃx+V²Å;¤%—3й†DäÊ(È-Io�ç7;#vá¾^a¾gc°'ÖÔ$0˜WÖ~¤îxsÊGé‘‚´'7O€vtØ?ooÐaá‚3¾åPd@ÛE…ÐPÔýÎmÔ¢u�³ ì&í�¤±qxîýwÞ÷Ó­I*\²�=žWëЭ…ßDvË�Yú@:«hy€µ×%sˆC  ‚·!/žÉ÷WB·¸‹…± (¨´¸#íîb j8eØ Ír¤7Bô\Û^â§WÜgõšõ¸Ö§ISËTeÚoOùr¢Þ{6—æål/`û�[¢s�ìU� FÔzÒ�ê)a™¶v�,c,‚=]þÇ3YÏ (ªX*£�i˜bòëŒç1#ЄXFSÙ'9Ç-Èr8sÎGbÙ¢ÒÝ×ÄÓR»w;fX×4_®pSA#œ{„ùÔÎv�9ù…íÊ«I¸˜h²]Gº]Ÿ·gÖ•àl Üø5U;›Î¾‡ÜOiùc íRÙŽ¢'X‚£(ï>C€…cM\²/ç›Ùò6Ì­ÐÕ{†¥ˆííY\ÒXÄ0†É“�©ÆƒíŸ»Nòoaç«§Îo}Ï£áßq[or6À2¿¦.�Ž¢¢?“ÕuÇvt�Ò¶×İ–È8»�­Î–ƒ^)Ÿ‹dñðÔ´(úÕ fö”šhq~l9“2ä}l±­©?Óæ¹ÀÌÉC¥—âH*f/eJœV¶»ÆV˜èk‰Ã‰•ÌØ£_+�û]�¼©¥Ø.– P-ö,*(˜_�zÔ”«†«êh ú »Ù.+Õ€þêCm Þ}àœà퀠­”o®J¾ˆˆéÈc¥Ë}HÚ#n„1Ú¼Rlñm Kk¾l=í£|¿:ÃòåñuËFã}ew3Ú.Å>]e/ó§¥o:Æ8³, EÇn@AìÿG½É$ X¾:å×Nç'Œë³ö¼cÜðúÁ}ñõã�û•ò/›¤ñ§6éé?)�5µdÛ \¯•ÒPχ2º`ÎbcXÚÌ/À„¡¨Ïƒ`¡œ WK�–„—=N~Òk>?S FaN›Ü³D=Ì€|®¿U�ïçn0çvÕîÑš`­x±³ ¦[U^Në¿q*³é‚Î@’QQ~4àe¦ÿIHÛÀyç‡æìujÊž w"W jãÊçÖQÖÁ�ŒÀ¾"¬¦g Õ)ôêm0{UFl/°åòâ¬àö3~†èF/ÕМµg*¼e3›ò—ÞÊyå˜3²<çºM±•!²0͵ �Þàì•níÓ‰yo'Õkö*‰Ò®nntSs´†8›«é©Œaxôª6¶ô/&ÀËi= •¬¿Ž ³�ÜÛ²ù Ô+/)C¼Ü<ÄCÍŒs¡îª»×zë•ÎÏ©ŸG‹ÚÚ�ûô9†y‘-¸s:Å�&{¹Íðø]ÚdôÛ>P¶öˆ7áRGBVÅ€Ì~—€õ�µºÌNgõ«¥ê¼Æ¼–@8 ý•4AˆàýÌ@õ 2’i~–¦ÒŠÖM#ùRÆïg¥{«ØPÒõ<ðaág^Š1Òæ­²´m’6òëôåÄCîýôÞ�nG$¹šû¾Alñ‚SL ɺý �ƒsz6okMó#&†Ñ8ŒjMºgKÈÚܯØaĤw‚¡;¡ÊÖ¾Œ@óg¥ ¤�+7?A˜e×}«¯V„&КݗŸ¿Ûý˶+óo^¹Ã’ñxÃ2Ý^õ�žKº%²/—œµO4–l|‹ˆ�F\#ø.V —îì(wŽ/n6µ¨/Îy€—ÏÀÕÁß*9@p½øq¼©åŸõ¾vKIbu=(¢³ª³ÆµkH¿³ój¡NýÏy¿n¬¸`ÕuÇ_€?ÍFRäÍ’Lnù9kèÑlWo+öRD»qÊl&~ ÔæäɼÛÚaxžú~ÓChš1öB� È…•¨“2Ç‚½½§È�v-\p¹÷<Âò�@lP-,Xzáþi¿‰ïkc!Jh¹l0ßwún +Oë×"s`¢ëíÀQƒV…@!kæØãð{ZRé�2ßNÏ¿˜.>CR¸Czîf{týÉ"¶‹³‚x5xúózc[±¾G´¸V b3÷ÉkÂ%Ÿªÿu€Ó¾½ ™÷ñ¸ë?� žßÍ(º¯£ô0éº-†À_gΧ@%µ‚„Ÿ5ª¶¯:ò³C·k™¬x­íîoÑÝ8$‰ÁúË�9J¡` ~QâÎCnï½tá–Ëžä CÖå…W×í�ÿPw ÖjŠ\»jyk e”l�–¾ÄÔ:‹-Â¥‰2 úMqÒAŒŸn�šã'HɦçOöšSÛöœuˆ D½jÁŠžíïÍGᬎ’%ÝìÙâeLwF¬ø°½âØa„g`W6ÊÆ=w ™0hÜÈpxSÇFαnFGÊx&ÖŽ¸“¿=p„•Šî‰²D#µktª˜²Å£ØÇ¬ßƒÝØ„NÓƒR�ìàÓ6¡Ã…  š¯u¦½›“Ü|®ó“Æm�®qkW³¯ÆÛ²yׯÌëô$åìt0¶¾ˆAbÔSZoS>„Á-eáv@Æÿ�åé8Ç’´ä>"-Åš#y;0}Øç‚ôdž·-s¡|VDd_]á�=Ò±X¹ Q„N™üïõ·ùKJc ™5«[ý¿ÙÞŸï[ø¯é÷vÿbþÈBFR"'á�OíØÛÖ}–ë±Èþ«Âç¶�±õp;<ÃPXb¦Ÿä\ ¹ßMì×.}£êàÎ�™G¸·ïÀí•”Vó-Îsa©ýûöέÅà¹qÈ]ö±Kù8íôܦP UgÏeSÞXJïÁ5^iºm(ô4½ûË[ü» pô€­o\ךÉK¢"qyz78_< ÜhŸ·ä¬Ç+W®›Ýqì6²�MÔò›aÍè±@ô°m”Ì�,{ÐÙD¬ÄC˜ ³í~QÝâo7¾м”⇵Hœ¡îÈ, §:¨[ÂbL†€Š\¢ëÛV„Ç;³Û£D׉ðÎ)Ù6yÕc¨â\\[L™ÿjo…m5°)Ë_²ï¬ðãÇ&ugÀ¥„ÇÄ´óÝNÈ>—‚ÏKK‘/bEqXè í©C³Å0Ùá2–Kâv!¦N‹Gc„ÜYÅv±¡š}¢?´l§®.ó±/»`,%�ÖÇ“mfêày0rj×éFØ�X%” ”w%1+Ú7pÌ<•NÐ�‘zÊdûÍ´b,î‡3¼–G¬Tiºärºªâ%¹‚&Óú‚ܾù@E­Ø(Üxš¸ 1s¹<ŠD8=ÇŒí9áFþƒèÛ)/Æ~ .t‘¡ät»Nvó%>~Pã 9ò‘i-žN‡ä­²¹)—~n Þv,yÆ¡y×1BÈ ´ö€ñ7±- ¤¬± »éæePT„|Ô(¥?_å* =ÄÔ’ex›¼aêŠ*.Ï7ø‘šKÅ8:Y½=ùàž[Q¥ÏlZ‹›‡àÍ–1½½va@Ç:)b•®æb<Ú·†lÿáä±’ûûÆíÎ׸–ô¯C9*k¬ÏoÅ5ÜÐJmcîœUs'öá„:Išk¨Aïµ}åÒo®r[›Û¨ ÈÏ[M¤6ïlZh�›ajZ­-M•o§›8rr/Amj”·ƒ'ÕÛ°˜°¼ŸÅ¸¶aÈ ‘P–¥YâѴ[L¨ ƒN_¶lC~3 ±Íû 7UÎAÈlH–>×”¨6a´µ:M‹ÍÏ\ÓÌdв�Õ'ÔÙl­)Ôk悔zÅ»(û¦õ ݸ ­®ú¡ÞžîYÓ«{¯êp@uJ\«×è�°hhgd囨ßè]Îx8g, Kèq…¸]9%š NAD/ÓÅT_£5U’u*#Eq” �fΞÜ“!\‹PBÁ¯·ì%êü#ß×tRíà¯äWLü^´Þ¬È¢¨;j¨‘qãæÔo˜Óã)ênf§7™<èàsS¾}à^Ï@õkDœÜðo«l&(/–³ÛhÂñ�ï'Üæ*°kObͼky™À­æz+—e"‡¶JŸA&ýÒÖ�}€¼‰Ñ+–…»³F‡\ux½º€àã�mÒƒtÔ'zßFªže⣤EV¶¢ßÁœ™ãÐ(9Ñó’&l2nñ›�³À¡×§Ðé›Ö¹†AŒŠÕñêÞòÃtÝk”#cw-?7@ƒ{´ùU2d÷¶¦!_Cž½YGMvºÙÃ¥H‹¼ƒŸ[%ù8 ©<uŒ™ËZ�`GÑÆ§8Ì.ôý„Ì‘0°�>‹Nô+^ÌÕ§{ªȩ̈¬g:SÜÛ„FõÜ6™ýmÅsGÎs—å·ÜIˆh_»G€‡Ò™ñ˜izª©ÅÛ�ú!býÐÒÜ9ŠôíXØõWð_N§n+8ñ: {ñ.•`êMú!™àc–åUñж£õõĺw’fxšÒ^Õhì�û|f©_Æò” Y .ï)Ù©sAÕÂàzÝ•4ÛXñ]„D¡‹¿,È“&wÐfºåTIl¾wÏi`·^¹ˆûæ9—í‹~jlµSó÷ÈþZˆ‘9"l±Ç­ðbàT]7M ¨.õ[í`4öuä“(4nÿnûmÇÂÉ fç�-è¾Åà‡·“ôvõ“⓬HÍÖÏügÛ«@_]ûÇ™-¼\ž¬É”�9±Zl~óÛÏ‚þJ.6=¶Ù0Ó�?&èNx]iïvê&j2&?YìWä8è�²�«KºE9Q¿±Õ|§’ÊÙs�^ï ²fÜ”Î�Ž)l;×yíÃ! ⡬ñÛžzØÄf·0WƇ +¾¿YÎðƒùߪ'»xßg{’çmpÎÛ»´ß(©ãI»*$¿4î:nÕ{��0¯ìïŠ1¡�ï4ŒÂ1ç�s`úiзp¡H;àßZëï¸ÜMvÛjü®A±KÓ{/úcX÷”ïßk“ìZ,¹¼SÉð %xWð·¿uZU •*áls�á–ÖLT´ áÔ�" ·ÚÚƒÞݽE–Kíþ ¨=’yvÐôñ�-µâ71Âb‘0sÊ¿pzªu[ ¼—M*~‹4XMh“öÜõ (©*‚ܱ,U¶„¾c݈ w_! ¯µÖ÷òº?¨³—UÎ4Œ¯ cX�‹‚ý¤ä=ÉÒ�ß&£|%À±Óøã#lQ jçï²u!œ-¯Èà4º1„?r`�«ô,íÍbíÁ¨É]è8�" ¸Ö÷¹‡Ök¤ƒ½yý� .ü4föq·ŒžÉ ƒ ;I±!NdPBÖùOÉ�ƒÈol¸v2Ä_q¦wީ„4ކ!¨0Ã}>Õ5½il¢› ð;ð®¹orEsQØó‘ó<\0µz¿Y „�Û¯QnoÅf¨Ê&Ý €¥Ëô´XP"R†lpZÓ„@e®ñ[@Œ&é~^§Û�†võÖÙ<@düPΉÁ¬ýiP/|u~¯mÉæ‘KOòé§Á=»fs°Zù?w`˵ìTžc–�eÈ÷žòßv“Tø\…¡é~_Ì”Äí[ÖIîOÌ×h"’µ˜,,UnÛ1�­gm¨xœèÓÜÈuꕬ„ TëœÑ¿{[áîž-f¨�×�×ë[–-�3÷÷+tà®raL02�ß¹úɼ… Q›r:ÖlKöÀb �šÕ"U°»­õz-Û†¢ÆŒ'ß|_kôyTÔ”¸#^Éj#®dÿé>)DàüdàÞXã"ó¥@2]®¶Ÿ‡7òö4†;DÌ�ù÷Á¼B0‡ŸJNSSÇŠÕiúz1„j�4¼Èý°K¯»×Â…�YåYZœnõƒŒ=Þï³öÞͼ(dÉ44ã‘l:�7¶LvdÕu¼òEYz~Ni”¸÷…F`ín×]ØV¯t²Å—ìÍ¡ó=&ËûÑJ îïX©}ÅFN>Ÿ5õ}iÈ�Ðý«Ð{HJ„rì1ÝÆìâVþg [o ¤! BÁ4'+aš™%´ üÆ.šÛ}#¹4ýi}g�íp'Þ¶3Ók}ËãLù5R–Õ—äsøÒ¬ 󥶺tÑí{mBñµv·3Ü!R”f¬j\=ˆa5„:,%¬¶¤KÞ!iµ#B¼†Ønâ�{ºCÊ}Žl‹rýi¬Gù~/jHm|hî7GŒüåwwϪ`ÈÜœ¬bx6°&Œ<Èx _…ä\ä¤ôbHi�”³º±¼F-§Í¯¶0°¼žŠØÕêBG[ ?ÄVÒ±ÓZË5SeÛîaÛ\òɇ£“ûhÈ[cØås8ø‚‘›ùYÃnA­óe[rxê]È¿©[’Ï�l ¼·>µÀKÜyÊznW71®bl Fм9· Záé/9ëòúöJÐ_ŽAÀ¯ºey½ßÜ¥·C,?,d»ÊÇ�uñß…û{Ú�oÍš+pêOF§’5�ø5`ÉI¥þM­£×1Øs§m¾úÑnJ9O,Å^®ÒБx�…àã5Øçú¯SIZ!9•+žà5)vèVod² i ò‰ß�8–Ÿ½ˆ¬¾/Q-ØÈ}qSFÄù<™´,ç7åGÙHñs/‚ Àn1iwTú´û2¤úëδh8+ËøêÒþ|�÷šÖü²¯yI¶í"~|-O8 §ú3•Z/ésƽÎ$&Z¡—•3äõ_~Uõ h;Jß•| !¥û££­ðYNö¨^î±HMC.TÔPßZ®Þ§!¥Øê oóJ¸€²€8z±¹Èd®†ÿòØžª¡ñǬÖ¡öŽ®YŠfNvþ`þè¥eŸJ °+²]>2¶ 5ïµT¸°ráƒg�°9 6ѹöË\Y‘œnN‰¹9æÍ®Í&ˆ�&È5˜»9ªÑÆgšxþLpåáÛpÒâãÞQ¥­[ø+?à]èJQPåMõ{zã×ù‰k»LBê¸=håí}"\áâöÔÜýsÓ‚o¦P! íŸv½ƒöŠ —èJ^�l½@Túè�?–­>*~ù¬yp$–#;e„º›-b‰ÊœÌv&¼–…ðÝ»N=7‚úRÝ-ä¡o¢RÇÃ=ñDì�`+í.Ó«d±©ïWùNw‹Í&I ™?$ófkô�)™ñ Ÿæ´Øì÷D±|êH�SÝZвE\BïÖ¨"}ÆŽFå7$Æ©,Ïö•„Ý2Úü$æE´ûÖîÆ…lSnY1�ŸLÆqNÓiWÇ-vÆ4õóV_ÌAÞÚ.m›ôñ¼Zá2¶Û>Ãôþ‹ç.�Ù d±pIÐÛXÃ|${1“¹½TŽ;–Ü…®K’ì�ÃÅxÍ7�aê”óE¾jU 1„�ËMáõ¸#®þ´Ñ­¤ÀbuÔ`ÔŸBlx|�B«ÆZ¼6¹ì‡`ˆ rˆ ž B[Jì_m¼Qœ6Üß 4(à—m—ï'ÜÇ´þ§DR+ìƒÆÂ;n‡ðÖ|˜¬^Y¥¯�ÙUz–=h‰_‘� Õ¹jpècÓ’•Ä,9H1òu´Ó¨Gɤ �¡¾óÊé¬,2üÐwu1ƒ—ŠC‘—~‡ &"á„¥V/�âl[©Z“qâñCŒ ëlPÄðWÇOôl ›Ñ%äι‚8sßX‡–æ"*Õy©Íí´8‘P'cS� ¿Z.2ŠïçÏM*cŽ_‚x»Ôm?Èý<ö³  •àû× OäìöµÑ„A¸`6êÙmXÓ;°´†Ft,�cùöx‚[Rã¸8‹ª'Ü€ZÛ³ýMÁ˜ð.®‹ßI]9~å²[ñeÁ;f'Û{•*´¡Pîjz­at}{8â$�¶�Ï× 6Pe‘±d'Åb®)íU^Dhwý›âÏ�:j¬þ"…_I\Ž™*Ô žu)L‘vîµV²÷A÷6ëÁIš±È$ÔêÀ°z’ ÇÙÔ–ã☸VŸBä‘ÞUÓ_ÚÞü?)_<Ç£1ŽFQL�ùˆ½P-·«e©ª³mM­ZmmWÿªÛÿ£’e5�ÅäK` )�àÿ„ÿÿÿÿþ8ÃàP  ( (-Ï} ȸV•®g;–ÛMÝO^óW˜úd¢’’©Q¤R–Ú„’¤UJ¤+{ °©v5{dª©VøŠ§ø �¤šQ¦@ EOÂ0A)E!OÒjˆ©ø%$ª¦&žš €2U?ð“R©û)©¤§©§©§”¡†™J&I¨Ì¡â††˜š =RIQ5ÉGŠ~¤ ÄPÑé?Ÿû’#úXŸîЀÁÈÑ“ÿÿUÿÞGùÿ§ÿOþž?Úö�/¼`q(RódÉÔXXÄKŠêª–š$V�Ð0 <>%MÞŽ4åcÔ*b„¹a6@šÑ2˜É?ì)Љ™¦ìà mJ—N©IÆ$sG¬£(£}^*F%¨óaˆšÔ@®ÃP³ ¸ ºzÑøujR¡Ù^ÐÂHbgw¬êÔ¼‚l¡�¤ /4À/³&©TÃ+@ª˜"¤If0n$ˆƒá„Œ&X6Ûï»XªþæŸáÚ¶¿áÿÏÿ¢ÿÀåÞ^Õçtç{½=^rðæ�Üäâç—qN»�=žwuß9ówºù½×vùÞ¸ä¥.Γw]/žg»�;ÆÌ;·K}ï^Ýu÷�=wtÝÓ»Î÷—�\�î÷›½Ç{§wGuéÝ×½ÞËšóÍ÷¾öåó«ºä<»N÷{xë®|¼öNîï<ÃçÞ9;¼ëÝιp#GËzõÝ›Ê÷»]õ×<÷º/+ït{³ÞñÝçœíw;¼½ëœã¾ï=8»ƒ»·2ï½æ½ß=îè�Ýs®#¥×NŽw9ÇW½ç¾÷__]ãºç/<ÃÝÜ]Âçtë»®v\Û‹ºîëåëÝ9Ü;>xš÷%Üç)»‹›¾ïw¯Ý»|åÜ{Ùë“ÖIïw®ÝÍ×nîãr.ŽwsÜë¹që„ÜqL\;˜F—)0 ÈtŠ 'AC¼B Ïx»·½ÍåÝÂë¸î¾÷b÷]}íÞqÂä½ïyÓºg]ÝÉç\ïºóç—ßK®Žæçλ—w˹ÜõÎ÷Þ÷¾îo:븣½ãÞí£“·{½ž5Ý:wn#»î½óé“Ù×9¤‹®ï½ïL:ô‡sŽs®ùëÍÝEÒäû·"õîÝëßz÷Ý×G9îÞß>Ýî{ÝååvÉ÷uÌqÝ»î¼/sÎzMÎ.w;7wrß=ž÷¯_w\ß9Û¹îº`Þwnœº>nõÝÞõî÷·�çÞûÝË•ÝÚ.û¼’yq»·në¾ïw¼=×w½|½÷]{¯äzuÂòðç.<ëÝïw�ŽÎDç½÷¶ôú¾O{{îß äëº]wwpû·<Ç^ëÞ㻋—_{½qÓ®s¾ëÏ>]÷yæ÷]{º/š9®äùï7•ì{§wÏ=uÛ¤í÷«ÛÇvïºñ¯uß{¹u÷ožÂnç.®ã»®Ó»uÝuÎ}Þowvw½ï7vnɹÇ"éžö÷Ëâ^î:qÍÂùÍçvo/{Ýç’÷¯W»«žyæ]w{®onœÜ÷nÍÞîK—Wtïuë×»�uÈ®ê8‹¸w]÷¯f÷.äï½åÞõD÷t¹äs‡†õÝÙ®›•Êàã�•é¸í{Öô=îðnçs¸äéÝÝB}ß}ô½ùï{½ë¸{ïDz_N»‹½Û‡Lˆ„‹¼DI�áÒ‡ÝË;€‚$’wwvî»yç®Ý§Þöò÷^_}Ýwtä{¹^»«Ý÷®£5ãÝ]zu÷v�s½Þ»Î÷wÝÞë·t»ƒîäz9×w;·oÏo }Üû¹}ïxb\îïuÆ.xó—uÝÕÓäêç Þ½Ï^—N®óžï^ïvë¹Ê.G»‡›:ë{ºˆ‹ÜëÝ/^÷vïuèéxî—uÈ“ˆLŠdaù- áÒEÓ¢è\B)ÜwrwwwH—>z=Ô�\Ì÷^öçwo=Jz{Ö=î9Þ»srÝÉÓ»·�¤Ýë�{ޣ͞ñ{ÁŽ;ºêì�»yËÝqqÜ^õï×;ƒ»qðùçÛ»çstW»{Ýóç¾;Þä�uË�Ù¹NîE� Ag(;¸.!Ï»Ä@€\<(IóÒ¾îô“»€|÷ϼ÷»Ó¹Ýo.õÜï.òç½¼ó�¹'.î·v÷¯7¹×;�s�ι=ã×ß]ï�zI£^î<Ýîú÷O¥]9¾r{»ºK¹ïzïxõÝÞ={šðܼyKé\¼.û¯y»Cë�Þï}ëïrw]Ý;¢ã�rìîâ9p#+¾»Ï;ÒáÞïOw^öwxçuÜŸ.{çžÝÃÞ½ï{Ëï¸Þû¹{ºóǽÝë“+Ï{ KÍï]λ¸å}ëç¾÷W#ÅÏ=ÝÅ;™¾ûÓÜŸz÷¯]Ýï=ÛÉîÝκ8íÝÎî�{¹O»Ÿ=÷ß}¹§ñk>ûíÏg//ÊóǾ¯½y÷Ðî$utëî÷§t}Þòû¹ï½{ÜÝÅÆåÞí{Ç3îãÞë§®�È"é§»£Ó®ûÝï§Ÿ9}ÑÝÝ\ºç\ï<=»·Ï�=¹éÎsyÝ{Þ/qt¼=y}ï½õëÝtL(ß|ï6Kï·z�Ü÷Љ" Dºwb`§H§@CÃ’("¡8÷^î{»�ßuïs—tè7;×\Íï½{Ó‚æîpHnë…ÜQ¼åæî}îx�Ó»¸é_9£<÷w´sv|ç»°}7ÝÝÝ®ë®êç1u×w|÷¼Ý/u.º!.w}íò¯¾]rëºè/º÷»·^î÷]ÓÇ\Þì¸òß{¦ûïw{½wtwdÝ' žëļó¼ÜH½ïz“cïs×gw}ÞkÅÝt—W»î½àÞë€ó¯w |ûÝÉ‹½íïusv½Þ/œî\ñïN÷+ÝÛ‡2EŽï{½Üîs®çœ¼®¼çw\½<ë®îWÝÞï{y¯;‹½ïzyw9ìtãÜëÞÝ^\•îîõß:};¦ó¼r]Ò[÷®÷]™?vqï\¯ËžÝÒçI;î»Ý{Þ÷\{Þyw.¹Üw�ò¸¾\û½î;½ÛO¾î »£ž^ó»¾÷žîèS·tø\Ýïzûº¾ûÒ÷%ÝÛ—C»»Ïo;¸å;våtåïw7;Ý)äÝïuéwWwa»®wœ½^÷¼î‹‰Ý×Þ¾÷ôì]�ï]é>|û;—u§}Ü{ºNâîë»ïWn»×Ýñwë¸]×Þº^qòãxEÛÞö½î»n{ÕÇo=é^õï¾ïut®î˺ºùw¸ç»¤Ð¼ë¹*ïzõ{w]ŸuïWwÞ¼®÷÷sÙÖ<½Ýó¾½ï}õËÍîáë’sË«Ûîïw½v2^îùÑî�u7t]Ãs§our1yî÷Žï½Þã]×]Ï�zxó]¼9=ï{—{·rèBr¼ó˼óÛåßu�w9sï]÷tùÌ5ÝÒåÝws¥ÅÝΟ{¯w.òïWO{ëî3§9ß7»½¹{Ï{ÃÝ×½â]ÞA{£ƒ›œîî¼Ü^îzêép{»Ýs»¯wyK±Ëï½ëã‚Ýu×Üï¾ëßuÜ»]ɦ÷�çß{Ç˹s�Ï^»®qòãÞï<\rîè>ï7¸÷]ã½vïî—¦.»Ýå2=uÏ—¾î}Ük�ÝÎ9Ó£»9=ÛË—{®Ÿy÷¾’ûºîÞûîûçuï\”.ww{½ 1Î;Þ½ Ww.éÜùÐ{»`®nî»ç½»ÝÙËÐŽ÷‹ÝÎò÷ƒÎö纺zç_w¯íÞëwo½Ó'¼óÜÝ×¹ÇOyw»»¯=îyÞî½îÞ{·Nâéw½èÉ„œ»¤AAÉ8pîœHÂI,Pó½÷z�3»¸ÜNèæîûÜ4¼§½xû¯¾ï½Û·ºç½ëÑ]×{¼ôÓ›“×vç]÷¯¾¾õÑî÷‘ܽïy¤Ø]×yÅκ{Û¼Ý×qÝt¾]ÞëÇw×Y¾»žëŽyëäW}.EÞ÷>û—9{‰Íî÷—!NÝÜçN�ÜÜ~ÛlÕ­ª¿òµ¥­­ÕM[Z×í¶Úm¶Ú·þU¶¶m[kŠ2b"Â1‘i3›±€Ø3H �A#1@Œ²b10Á‰†)I flf(Òb¤‰-(¤¨–ÛYM[KmKZ•Z•k5µšÛY­šÕ©µjÒÉDÉŒ2eI‚�P �2ÌPRDFl4$#3FPÂ)¤²…jÚm¥m¬¶Ú¦Ûk5V×ñµµ6Õ]«ZÒ–¶­5µ-j•º×mUµÚÍm­›Vßm[mÛVÿíµfÚ­½¶ÛSjÛ+WÚÛ[+Z®ÖÖ¬ÖÛR­TÚµ*Ö¯«ku[˜ÄY™4KW›$dɨ¶ˆ´h£FÑŒc@k"V6(³5›mKm®ÕMµ­5m^«­S[^ÛW[Uz¶¬ÓZ½nÕkoj¯Zݶ«okjVÖö®R`±ˆ³BЕBQŒšƒbÐTlE-2£h¬¢�ÁRRhµ˜É%0EHh¢4XÀQEA Y2 PZ5L¤1bMEI(�¢Œ„XØ‚ÁbŒ—¶ÚÛ«*Õ_¶¶¯oŒ�“EŒccŠ)6Š*f¢ -$K[jœÂl4°€bBÊA¤l™bÆa†H“!2˜cd’`2L&£dÁE™–(“ ØafD)�VÛkÖÚ®�ÝÚç3»—wn¹Æs“¥Œä]EÇus‘©:\®î£rŠåÈéÑww"�uŠåsAÂîä9tŽNã”nc¡Hî×]w Ît›�tMÝÉ×væ‹�r;9ÝÙÝÜ»»±¹ÓNîã‹uÜåÙÝwn:îWwbÎë5ݱ%ÝÙÝ+šŽ&árË»sȹÎW9.Ü»‡K›IÝË�Ýr7.åÐ].S'værNWurйré¹ÝÕË›K»‘—uÎtÔ—Jç'n’çç.Xw%¡×sîîâéÄ·wUʺLèîIœw\íÇu'79]¸ìî.ç.GWLiÝÊîît¹Nì]9®»®’‘¹r¹ºp —t&ÓjÕMdŸÙÐG];븎êus» Á;ºi×9vDœ¹�Öêë�’ë�9Ý×\éÜ]£�˜ÅÇvÝœ.wvMÎ&€Æ#pwc›³ºá,�ƒ¥É�×w.cœËºuÜvéFrárês\Æç1;®wp»®Šn[§9;w`d­­Ü„�Àd¤”„,…Á˜ëmªöÝžíÇ;Þëx{¸¤^vG�¯u×¹Ó·�Üë»®îÔÜ8åÎîî:í;‹®íœîGz{ÕÁ7RòóÈ×w½ïp]æéîã$L{«ÅÝÙîä®î»¯=J÷®ïuw»yÝï^MçEÞíÉîŠ23]{Úó<æ4™"Üè{»;»Î5€K7v8WwEÒç—Ýt¼Ýî½ì;¤{ºî¼ïqy¹¨îë$y^7t“…îë½¹^îÈ®n{·Içwgw˜ò÷wg.îáî鈋»”ŒR'{ÖðåÜãG<ó—/w §w1qï^<åÎs;¤K½×w½]{ÜåÞîÎëºí×v.çF5ïzõÎìì\¸ÀÅwyÞÞ=Õî½ìAäO=íÐ×]Æ;³¹ÝÚär ÁÝÖ½¶µ¿›êDÐÁˆ F@‚ A¤&MDI‘&6fa¤Ñ@̤d£ 0$Dƒ$ʤ0D”QJ4H‘‚lÀi’c2c4H� “LÆFBÈ”Ó4ˆÊ!i˜(! ȉDüÕÍËï{Þn6uï]8î²y×�o{Þò�+Ë»ºmÎ�Ýæíç&¼òôÜÓÝ£nîó½zuí½<Þx‘¼Èõܨ¼®›�-æw^yåã¸Þ;¼’ܺnynF¼Ïw½ÑîêõÇWyÕîé(1�Æò7›È½Ý¼Ý/^êæåEm[¶µ›m¶º`¨HH˜†R�§t|îïœÄ^šw§¯¾î÷P÷½\דÝy¸óºÞû×7Ÿw½[ÓDî©Ý÷º}ß6æå=çµ÷݉#|äçW}ÞgwÜï Žë½×Ïoœß7Ïuïo7—½»"îù¯zë‰Ëß]åÏ}Û‘nšûî÷ݾûç××Îy_.ï7³îèWÏ”^ysLûº}îôgwÌ÷kÎ[ÝÞ÷XÞî7s¯½ÞwÝuî·>÷žæ÷{×5ÃÏ+Ý8ûî÷Ü7N‘y^õÅ÷]{îï]Ï—·Ý÷¹ÝÍî绥�Îê(Ã�^î´^îäîÞî§ÝÏwj1ŠçÏ{Þ׳痃»‘ó‘y¹rî÷·¾ûï·Ç»{�®tw¹Úùr½÷WÍîê{ïo—Lº¹hˆØzë•Íyæ(»ï½y}ÛÝÛ^>éçÏoˆ—�4›•òÞ^îõß{¦.s7>õÛºùåòà]÷½G»¥wn&J+ÎgÎÌ’ùs¾êûî®_gÌL"]Ù¢!Ú" Á…!Ñ!Ë—»o/ž:;{Ö+Ê{ŒbÝ×½y&Ç}×…|Þ÷/<ßB¹—;çÝÆòwo�bùã¾ö¾îû»Î÷nû·ßwÊîºÃ7�$žçv÷\C»¥òá»åâºsœ÷ÝÊ}Ö}v/¾ëÂ0�ûïuïž¾}ç[†/½µüíUz¶ýkzµWaL²Š©¹tÉcbÜÛ¦9g;k–(¹\ÜÝ¹ÝÆwFœìÕ·+n—5Ò®FîíÝÝE¸r‹�sbé¢MŽWLnX´k’h¦IËnE:ujåÈ¢;�]*î»»ˆF4e%£AbÁY"3+š®—.F2Vf×MG"±h¨®k•%»ºéÊ&ÜÔ»º—.E¹’ 6îíÝÔl\(9hÚå;ˆÑ™£9Õ®rŹÒwtܹ®rƒ\.FÝ6Ý4s†îí$c¦åwv*ÄXÎíÃQ)réŽW ˆ\Ý"22¹nKkYU´¶«v«W5¶*¬Z*)�$D‘¢R Š„ÂdS‘a©3&f„2ê]×Q‹»¥Ý:ãœs­Î�Ý »«’]Ý£PîÉs¹×ÜÜMÓWfî¹Ý¹C¸®s‘ræ1þ[k[jÿ­ª¶mjÕemfÖ²ª­J­¦ÖÔ¶ÚÕJÚÕj¿ëkmj"6¢Æ�Z bÔµµ-VZ­5¶­•jêÚ¥m¶¶í­¶³kVZÛU6ÛSZµ–­eµj»mj«5UlÖ­VjµVÙµkkÿÓmjÝj×ýá×a;Žr뫹ÝÒrt]ÝK¶ë»s—3wk�Îu̲crrNìs—\Œ¹Îã¹w'’qquÓ�9:çG9Ë„®�Ü]—]×6îr¹ ]vM×"“®ë»“µÝ)»»�×]¹uÝgD"B$A)"A"Zÿ¯Ÿ½Ïå(ÿ®kû~ß¿ÇùûÿözŠ+mýeŠèâ"HTðÿíäÛ¬‚VŠÐ€äÌ1_ø@µÿðkñ¬®'w]É<ªÙ7§’çy“!fxuM_J¬_PT’ÄNÞÅö„í³‹ä+Wbª2†ÌÏŠ Þ·?uÎýº ¢Ú=ÊvçxUœcM|%±¶ÐÛó¹Ð"\] í±½>š6ï*W_ñ«xÓõóÜF. žýµÍëïˆÛ/% Î6Ò(óŸéæðÿhè\°XÔpÛLWYšõ¥‚hÃìÃ7׈\ãxÛèË2À1˜ÙcM×ì5šä„X.©Z´öÿd­bî‰#NûPÖ‰ÍÁ±?›U謉êjö?ÞpÁƒm¦ -·%¿;u1§ò…Ê-…Žÿ ‘.1Z h·ûtá¶AÜôMõÓ7Soú}ËÖ~©Æ;·N†ÐE#fõn�BZ³� ØÕ×ò›ë~*úWއ|¬i{séØ) 1ylüû[Ô6㔜””´ÿàž‚õ™s‚_ÉS£Uk«0ã is$* ÛYia(I¢`�t �VäºLë!¡ÿ�ý[ëcLü¯×*±MÏ=²ÄßQ½xìûðïü€{•÷Ö=˜ë?õö4 ,ÄОŽîî®;×1}„Ô0$uJßR¥-ñâ�?ÇŒò(ù}©ŠUÚ¤n$ßÜ£ÓiÉ¥…øDËœ‡Ê`-ý^»_%Ì›­Ðè3è¨LQ�µÏøÒõ×Í÷¹_­Ä»¼ v/8kt_a=4‚ó÷îlUZ«ÚÛ.­–kÜñoEZ¤SПŠÎùÞp¨÷u|ØÐûƘ_ó{’ÎÄt8� ±|à}ÄbÇëÙa“ë¡´ˆˆümú –¸å­dêÐŽZ§žCÜ}Ý&ݲ©Ô¢laV“¶6KVu‚÷c|ÓXqç©n ëÊ糙ŷ�lj=«„$ÿ©·KêÀú�}TÉÌÝîû¾î6¬OeCOt ¾’0üX0û4V™ŽAÒ­Ì¥è7%œ@Y n¤:ŠŒ6E/FäÍ–%¨§j2´ðLv“lœaÚ£9v2°Û5h$»S[§_ó;\Æ?mmi¹Ðfý²‚ñ][øp#8ºÁ�"ëŠb–m à/ŒƒûôO[a&pEÿ|Ø_#ÖÃ^9¯1ã6>f�ü5uÖ÷•K“äʃša¥WGÀ z¯o$ü6˜/ uŠ­Ê{¥6yüà5·fùóÞ­.P¶Å¾.—ÃàECy:!_Kĺ=h£‘«("P=˜‹-ÇŽnÓ¯žXÔG!eVA¼!M±˜oâÄû†aá]0tÈ6± #žÛ¶Ë: &TxñÒÖ5! ٜ㣠ý·µûq;Ûenšw4ÄÐHü44äOóÊ·+Þz¿{�Òyçñzqf[—J²\þÛÆ±t|¦/„sÔ%÷v¥5„h6|EX›‹5ïóR ‚ïŠnY©Ú*ÌjQ<‹L$›ZÃ\BŽŒå ²gØ¢‘ ½ÎÍ7Ó_›üuØÿǤk«9Û¼ûYi*.ÎZtÀºän’Abî…ÉV¥%Am‰÷GE"ÞG¦ g8*\ú2"†$ç »4L¹sJ)èÿí}„‰7.%/ȸôg‘³uwј=xZ©A#�¿,Ȅ˓”A´š`ï�Ú –Þ[ûÊ´XÎ1ÄbëZ�Jâ©ÎÔ²<Cl(†u¡ßì\²¿¡ºiCšMœ<ÒQAj”éùò îA~JK—×7N}Âpß#Ì¢8ÂüD-…/*ùŠð·wjºÛ“Ó›KÿÀ°³÷¿«™øÐb³gâGÂË’2q<,:M·ûÑKÑL’ž5É}êÀ-H_, ŠNêmŸÞ#^´' P’l¿Û¶Ç"S�÷­­7ÕÏ¿¦[Üû=ÏÞ„“!î€V¯ZãU‹ 5ž2¸•R›•—5¡+þ^´´'ºn¬Ì>&¡Wá&Ì. `V„á*Ã&÷y½ÂŠ?_Ü¥ÐZ JUë3rYî­R%–VàEŽH^#:¸Ñ*÷Å¥ÌuUQ ÈGSDE´�…¬°@Ø1®»Ç½W—B�A8Õ¡%¬Ëø‰›Þ­Cº¤_NTùÁN9‡Q9«ÄLað¢Ï-dŸ¨E• UÊר(›o¤àéÛÚ1¢¡Ã†(BßÉ$©ì*ƽ­˜-Ÿp}»D¥/L ( ßE.¥; 0¡~ç´Ø 1óAÍ-<Ùæ—eœjª²rV2’Ct¶gtxŠÈª�w‡ômF¶íü?rI©­GŠbhŒhÆëÌ{ 1ào�–à�‘÷àE¼�Fðñ‚T×Ûíj0ú¤œ V” �bÖsþÆMP³‡ ´[l‹}Y+Í=ðQÄGû^›LßÛ.vaG¹ÇŽ™§=µì˜ñ.à“]>sFN Rîis+Vº¥'õÍÕñJ*½åó)Vc *Á\W;Ÿ ¶�³<­Cuÿ�€|xàâVŒÚìT›k$'?¥&2›ÛS^ &áÿtà2�ÁÈUþÞ4 ›"rµô9ýdâÏ5ZShÞÊñNÞñœ¶ù®§Ca8&GOÇ´ á–»jþøs÷'ý…±Oz§õ[ ŽÅ îÔë�9c`�ï ˜”0àFA'cµ�ö‰G’ÚÿFŽ€ÚVÁa³“Ntáþ^¢I>“اV«> |‹'‰—’ËHÉ-Ç�2° Ú°nÜ€V²2HXŒÏ7µVã-*Ç�Àl¸ZkvJ“Xî:L ×æVjÅ#ÿnØE¥w|†A-U‹Ø]46mUîß¹Õãóyݨ^ÛÔ0Ú.7¾+ñóyvÖX{ᬻh›ù Ax�hØäR7®ŽaúUjgJg«œx¨-F›V™ÁÛÙýC�pÐ$îêÆRB�`7þ)pÙ¹ê& væä}ZÐY ŠwL�ê•cN…z0â¼ÆÂ´¹ODSS ½ø"´Jƒü·¡\4ÿ�†qTJÐuWÁ×n!ù;,?“@9öÁp(5†}žâdU?Äi€÷ç©Ý{¹Å»rl^Øsf7°ãÂ<” T7va´"½œ lAÒ‚åíqÁn¼�Sbµ°µ«ÛˆL4ø*àˆH$(Xê%Øç?MM+Hå'+dÿ¹õvé´z|”r@¾ä‚mW%7iR‚B3¼E4Uçî'‚•JÞ« zdÆÉ‘t9×緞݆"ß3‡þ Ç�†I ,ý³„ÚKù-\VÞ­YŒºí[v… ÜàÈGòŽ^OIH?Ò;�Ðçø_\oßQ‹'w¤öÖ?«+K îM´:¸~Y,EÉJ˰{o²ÖÎzç�ì»eøñMÏZÀç‰Là¬û=Ê�=¹µ¬S+�*Î\O¥÷ð}9_å c៭žÁÁ¨´S™µ*‰¶¦ÿ PÐ9¬û£,¤ÐIçÊI”‘9Ó¨Á²ý’TØ=-#X›ŸÞÆ0몄0ܳ[8ƒ:dÏ9;«¸mšç ÑI"团‰û(5=3bá±获µµ”dú2.@Á$¦"¯sá$ú0‘\}�Êr2rVæEU:·(µe�L>›¬c=1+C‡ø»¶¹C¼±Íœø­üd²• mׄ³Ót_l#$ü̱'e)-É{—ŽÙZøœj/�>0{š€¤°wû3›†¬r2Ì`¤)ð»æ“ÀCÌU0½õÇãǧÙÐU®ž !A“]¯Ù‚ÕÙÒT­´Ýöíõ]Zò­“d¹NneÌ&zçt°FN�U–kI±hLyq>p¥œÃÆyË& "ò­^�xÑ’dL|+[>@>Ó«‚u¯Û.ÄjbPú,ƒÁ¬× ŽëyF Z@j’ãˆß¶ó0(Dã2(Œ¡jgÎY_sàÍã—ƒ¬§ ¥ÑZ’±½Îj–x6:HÝøgü‘cÓžÿï }ãž)¾õ7tÀ�.ž�ïÓGûÚßóo£_¬¤`b'îœ_Ï´¶òïÎkóþ¯MßøÕ‹è¼‡ËG,ü~/pÀS—–¾ŒñÿCå[™/™-ÇS�¢ÍáYÖIð¡ƒÒ ëgZ*u¼‡wÓž wŠÍ‘›xUÄ æ ,ò® ÞùÔ4|jå÷æµb6^¦«×Ñy긼Ò¯þËGÿêE·Ë½ì¥ÌVhe^LÒ §ã£,¨R¤n_[ÈH€¿ fלkÎ0°£¤w€oÿÉFÏtˆàÀò¡8ƒL"ñAÚ&K^8ö¤ŸWµË0rü6íyà9…~ö|BÒ[64¬û¸ñºO£Y̤N†GƒËY|Š.*9÷“QÄ1ÊV®�Ug‹AN¡*æWEŸÿÄÉÜä—Gmô©ç'ÞËÏ1uZ”7¹L9t ÓŽ<…8–¤‹›P™¶¼¿ÄàZR0.ÇmŸï]¯`ðVä¬nœ&¥»Kï2?ȧµG‡bÌ£ûNÿ]Ôž¬VÆ‘jÄËöÅûYtÞ°’l T¦ÑŒ‰ÙÍUbÐa¿�úÞif÷ûIÇ8,uŽe÷Gº=¹fzWs;£ |o-ÚSe ÷ó–#, ·1 ¢Ñ–>P2Õ¯n[K»pt¥Ý;ȯ,¾’zénÊËâѵ8;‰Ú’ªxó§=! ®ÀnFZ_Ó¡ #Díètm òðÊYá{÷Ϋ8 ï‡y8ÍöÕò˜_ßž‰­›3z«�Ÿ)ž„%Û Î/‘4}Ì$Ø@r,ó–Ô–¤:ƒ›G:DS"Ç¡Uf%Šó¯B|à'k…Ö–r¸ß|£}8À¾tØ1ÝBîÛ¯o“tZz÷þ¿Ø ¸†”¶//f~.0X}%$Ÿè£A��%xxþÍË­…KH’ùx=õ‚|p͈£Òjƒû§ßì8{·«åx¦[J1Ô矽¾C¸Ïz3þH‘ sLBÍêÏË—q=[BZ7¿³—«¹ï$i2�8tý°° ]åofY‹˹ÚW.öpÊ4-/�{—Ùa8¹[e0.]vJK(ÔMŸ#Ó‰ÙŒq{¨´|c�gÿ�ç»óì=¦g�XiGõÙì¼8‘¿çD£*ð*)á ·ôÛÿ$ãß9lÄN>óþ.¡†2¸ÓV0e0"…�Žn’çèÜ:’ƒ¸ÿñ/6|öÿLømú¬£ÁuUõ>µéwƒÎ¥ Í&Z™–ZÔÒ�ŸI"1î|‡å©xXĹÄ]ðÕ¾Ký&õÞ½Ó°Çj �Ûy°ƒèö¹ù£�­ad ½<¦"˜¼=ßÉ¥=Œ^;í÷êQ`q²läÇq§gçf£ãÁfÐz3' ŠáKCuŠ÷ãªm~G6" à[ÝhÆC‰9ÒŒoa2nÊéJÕÍýƒm‹•z{̮ʟ®{;q‹Oººâ#òîI–®úrAÆŒÙCøÞ9ã\üßP©Vµædy?Y®¡6]D}—¯Š[ ¨¼±‚�?a±jþ€Ìuñ lÃäTuSň©[Ñ5¢‡Ê†s-�Ê#Û^�{UœB¬ƒO=[˜æÒ{-W;ç 0¾t€“O™ëhîÜ„œ'¶/•{øå¼÷nœ úC‘`Z°À�xÉÚÏI NJ¼£¼¹[±já_Û©:F¯ÍãF[áÑ&ú®Eë6ñC]v›O™á·Ö™Ãtàq‚+tòYAç¼°lmhÕ@eöa_¼˜—{ò¡>²ÖEþ B}Ê gLÓùïš?°iw³Aî='…¡lhÓ ¯�`Cy޼X‡‹×O¤Uoч¹ÂÂÞ$Ç5Óª³Êg\pÝž çÏ; ñ¢?˜(éÁUbit¼ÛœJ+n £ÎJg.¼>¾+çO0ÔèÙãmhIá6yз‡CÅ·ÅŠpß%ç=Z¾8àR†4·;Ð|£=¤šª¿Þ3žžæœøùì†L¯i‰¶+FÕ¢pà4šÅ§ó÷ڳΥÒí®*á ¸Œ¼aëžcðüiÆ¿øH£Œ'çHkÞÚÝ\ig^#Áü‹‚ðþtuôL{øØöQñ?0ñp &Q'G~]ä’*ÿÿUd+KþæÇýã|Ú>^�²>'s¦ 5€@¹ Ì&Æ]°o#„ìû@*?ÁñÓOúEQ©«~_DŽøn÷¬Ìþ ?7 +ÿº!×M§qkò1¢„ÁÎà«×Ù>‡4,?˜Œd0+�ïû�,æêz²„s3ôA�æM þJØ ”{ƒ s¶óº�ÒŸïG|ÖH뼿-Γ-¹ÒpXµ’sEuçÜ·d­^Õó›ýŠ�žÃ³ÞqùÕ¦â[î`s'}ƒ©Ê͆Q½ÈÁ¤µ3ÒùJ ¿®‹ïí\5‰w³¬µö{(_"%ÿ.�V9îFŽ„ æo +TØÉѽÇç\ö0Ü�?DîÝOœß,“˜ÿY ÷'ò˜d8üWˤ’´RóFíŒjò$:X˜$Ýè]ÀëÞ_Ë¿èÿ[+¥@æ‹ßĸcJœsüVXDŸNæ—³š;çÙIŒ|ÆcÏnwå"®nÃÿ$Ïߡ՜Ï÷³” "w¬�#açG¢�Ý+VS½¸&»7¢+##/|åØÕÞ?–?8™^!í•%q�®ñ�$& 7fK§½³a5B<²³­lZ‡.N®/\ë�Ã?ŽM¡“ldÉcX§PzŽ(Œ� KfáÊä“Z¶ŒòPí¹'ÜT%ºß0p¡ÔdȆÞ&Ž.‹ØÎò,š¶.VYÿ�Zìþž’ß—ø¶6ºMAß“Oº‰(|dJ~ï‹øú$ùÇ‘¬Ÿøû@`Ûh䢋Ë*�Â!õ?0!Cù#`Œ$oÔásìè-Øcwü�9¡¹Œƒ‘)f]�Ó�JpÍH ñ2Qoõb>F[ö�ž­Ö1µÞ�pÞ�¸f¼Á QÐñlÛ-L5˜ÌƒžwÁb¾Êv`1Û &|s3ôA³zó›;^ç¥×7 4âûfbë°i �¡ˆ† õšh·ÛZƒœ8[pOßs73Ñ0|;m&½ðnkÇ×»›œKcñøä$ZÛ­aWmêmÅ`R·2ñ:†IÆæ‹‹‘³ •:„º¥‘*´•Ûò�ïË&JÅ0íy_'ÎkŒVR—8â½¥ 4¦8øÙ×9*Ñ€ù‰¢‡öòöÐã—;­�iqõ4¬ü“càÂyÌ{êöd{7wºþo €£?î¦'=î©á‚,þ|WIðKÏjØRH˜¿)„øÕ«çêõÒ|m1á–í"×9�.—Tns¾žÇv*1gƒ{÷¬AÅ–=\èæ3Ðwàäó'—X$ÿK ÔøÏCêX;,DóY¬õCÌäÖ“¸¦ÝæÆÔÍ>6“™”c=Q÷ûIÜC¦ÈÙ~ÚŒkq$^Ki‘÷»yó]eÉæœKœ† ^÷aY=²ã&\zP©²6ŒÀ¦½ÁæÆ Ç$ ó ßÄ7óŠ‚<ž¥÷™¶œÁ¢— Ìî„6‰�ˆ!çÊž®òúú@p5dþ]«¿_cdý\í‹C��æZ!\°?çOL å ã‰¼ pŒ ãaúˆ‰ºMŸýäXVy˜bŽxÀcRtôò.mûcR- ‘�Ê0âïî_´×Y”1C/�ù ùöß¹½ rþ Rß-ʤ�÷îY#–ëåÙyK”¼çøiû,[lþ@¿a(Ý*¢)„ûËðü‡pætÿuÖÖŽþ?Í["pJ ݈¯ê2u#›‡Ô¯ #ûkc/–H-wLK>µm'�ÑÏèàMU]/ßk®Ú¯<$8_3Ýê‘�ómb:Öz_‰o’Z² ï©Õ½ýqå6Ï='° ÌÄ’¶Ê£÷æCùí»åMK!_Ìëš1E¥ÁIíj-|ïvcO~Cˆ÷®°Î¢çÞ|XŒ uÔhºz®˜Ù†Þ(|©©..ùóξÎ|“¥Ñ&¡/^þ¯n”!¾x ®.¶#á@?Œ|ª±ø`¡Ñ'ìÚ Ô,._Yû;¦tÏWú`A” gÊÎÍE}, ¨Nâ,W³³yY÷�¬ƒY\^ƒ6D‚ÍCh€�„[Ê E•ýþK4�àïH]>ë–s�ñ¨›ÿlŽ’ñ1\­%=eA¢žùÜØ<Ûj{Ù=êÑ? uæš‹›ªDÿaÌ¿¯�òÁP‡�ŬìMâL?ÑŠF?ÇT¤]Ó~Ù•”v9†Ý˜n¤’“UÌ->7†^8ÐÆäþ+õð¸¬d?;œ/MQñúQåÅÚÓöçÖf=ÌïW C“‘ÑóÈswÖ•Þië›$Ú r„Ây×&e4�¡Nöz†Œí¥Œ‹M‰Qêbw”—†2oBeû=×=Å$ò¾99®ÎH [2-`…._&K@™bêY9í:ÓÎnqOSˆºL‘óü½�ÓÄH`øT3OZ^|ìýò„__KïïXð)vMg´ÿ„z~EÑ@Yì÷¨–�ÛK–ÇêBÁãÿæ:~2üÝÝ“7f çcû2ù{c÷2& Ý7çY„ÿ³Â‡A®ðÀМhFy¯öWN‚ëaRûïžÙóR�q.‡pù¶ÇAöݸx‰�b®ªBz óz©2*�ÿ›Okù»|ä#Ö8§6ÓtçÁM`"×Wæž-H´%9s?F0¤Iƒ�ŒzÑFyplÝç‘N<°5Š�äyb·m­cyßo™* Ó3IÝ¡fÓŽnÁ[aËMÓœpèØüÞx}9^˜ÀI+ã³6Joy (l¡Ë ×:t‡V�(ƼKsPÇub²§‰Vð‡B•u+T\ËPžà*Kžcæk`üs}`½…]7œ3t/æø÷~ÖwnaXyyKG Ôaäåä"Þ%Hs‹^ïxõuÂã"™>ò=ÅŒåÏ‚‚äèJ¦3o¡|ˆ1ñ' y” I!JU£çù ×à4H¨N¦ì;rìfâò ¨�„6îGS¶ºP¹IßÁ.?¹ Àª¤ù®?ë­gF�æÒпēOöCçÏ+„ò/®,Æpä Œ²ÇŒ�suHý«¢ÁË­m§ž¬Ÿ&Ù­<¥›ì†æ‹Äœàfi�Ú$Â5«šæŠ ™{ß]™º³ÈäeA "ñö›w úÿ¦ƒü(G ãã÷Jx9|�ýSCQÝ›œD–bÕ|8Žâ/¨˜/SgªÇô1ÌŸ^n�tŠÜg([ʦè¯ý2PH²šƒ.;Z]ܲû¡ÃRBÁvcçñyù‰k5ø³¶ç·Û멇b¼5ÃöD¦G®Ì†­a° Cx„cbÛÌ.ôéFÁÇtç¬<_&óθpÍ:ƒÓØ –T&q² Vy¤Œ7wG_Z‰U^ú¶˜ëº9«ÓÿÄœ _rü}Є®ÜrçÙ±®Kuã«ÉÜs©`ÍnÜÈèNë�%L î¼q}ØGðcÒ*Áú9Î.³Ÿ–xÐJžœ4Š2›£Ë·\:Siûÿ‹â=/‡Èý¼p>ÕƒN¨½ZLªú¹¥ýýÿ'øWßñ ’Ä 1‰bIbA –f²J&a•¦ÌY(BP1 ”À˜Q%‰,4d34–%,AFPI#!C�±¢FY£0XÓb AA(¢MAE!E˜D Š 0RS2a†¤ M40Š™c$¥%€“1� ²$i,Ä$Šc,@d�°RRLŠDH±2£ L¡†Š "M’¢¥“HFbF„CD“HÈÁ‚dIibHŒ L„#‘R1±B2Fi0JBb�E™3#!„B2e)@h0i°f&ƒb1„‰¤„�„˜°Å€¡Œ!!™00”Jc2 "A ‚fA&Šˆh@€´#2€JL(c4LÃ4„DRD† "¢ÈQHÄ¢šDD#&%†B™Hˆ –$É¥ É0(ˆ‘& H£LM&ÄX‘¦!™†¡ ˜BHÈÆ3ƒ’†4¡IˆI2IIŠF¦#B’ ±Š $H"“$`£J$f„D„ÌaXš3jd‘c „†@¢$H�)31 E¥²DS1È0 "$”̈±’L´Å‚0ZM¤(ÒI)&F(Á21ƒ$`4Ó‚€�¥ „00¤&1¤I",b$c ˜JFŒÑ¤ÒcJY2FaDŒÆK hfa�)‚  ™�˜1E0€ÆD4€1€@цL£ š( )‚l2S‘Q”D3J A¦&%"$B%)&“2`É(ÄCe  $E”Œ‘5 ˆŒ¦P%0 ÍM%‘˜-…Œ#&Œ�@¨É LÂ2 Ñ"e˜i,DÑ%#2bE“I ‘šS£È `i‹“0@Ò4ØLĘˆÉšE †È¤J‹2“$L4 D�Ì#J…30ÑLDÅ%A#š($dS0ÊF FÌQˆL²!”I"¦‘F4˜M˜@–L™I„ŠAŒ4‘2d†A©J”Òf%É& ÃLR)IIT��ÈÈÍ0ɉE5(Ì"Á„¦bÃ0#)’L£I’�4X“I#E L ™ #Æ@¤‰ƒI2€,ŒÑÍ’lY i��É��±C1€ïÙ2, ÐLbS„IdJ0Æ%2H¢"M2FL 2ÈÉA„% R1 )ˆHŒ"A‘%%!¦i1ˆhÓA°ÒLÄ„S%™™ƒ”¤’!J11¤ˆeÒ4± Q"D4‘‚ ˜– Œ‘4L’f4¢d2%!#,¢1†4$XƒRD ŠB‘’€aÈ‚’ÂÌ4ÈE ˜B@"l$¥„eBŒ„‰’&†’�‘0T6&R„°R†R$€&DhÌ”¢!0I„Yˆf$F‰A‚ŒÀ5JfE¥ ‘)$É2šY XÂ4ÂI‰dR),eb4‰C 6b�ÌÉDH°ÓMI)@‰™ È&`fDÉ@‰“ Í&L@Á ÌJdLÌ"" þÒŽÛ#XG”Õ-õ‡'\m©é—1Ñiô[xÁ úmw K„æ§XêúPÊñ 8ÐÛîãiV×i=#ð‡[ŸæÞ&LïÓp“5‡Âc&Ñx¤Äöâ©'Ïê: §S™3ÍJîîN�ÌÚŠJ9ÍN.žœƒ¹¸�B2ÊÞu«‹ŸBò9³åáß{\32mæQ{_dáüÉq9@»Ul.Ö¢ áóeÔK`�øç$6À•H?T`ƒ8ú�{‚ÿt`¡¹P2þ/#àiÅ^Î<þ|ט‘.ÓÖÅ>;“±‡U¼=Ôs 7£N»¿­©!1º�O¶²SÁG´ï?ç´uøÛü« ¹Ÿ]5ŠXÌsCê\"[¤aõó¡7Z&—ó�Ÿ�w=c¹ñ£áB«+Íe¬qvë-…EÜÈrÞwšÔ¯—sÀUãتî#he¬¹õhÎ/Àx:ƒÝÖ[®�LgÌÉ•\¶ÂVÏÁ‚ðBÀn!»h0Pg3ïÚߎVŸÎ)³ðžl>9aZs>»ûàAl˜øÔöØ…¤žXøw�ˆ<Û`оRs BÜm_FÉÛZ¼Ö…@­\èÇ eI[oGž�ã³(iªê�Ž®œž“ʹ>µü=©X£Ã˜x^/lžúçWþ+þÁ5~ŽqµvعOáꎂc{Økn™«-˜Ñ%T)ö–Sm†èôô 9ra·n $š«Zr£ 0`êOÍ•7ÚòGFí}ªàÃbþ¸ðæëga¦MJ>í«u’X^VÙÅO<ÔåÜ‚öä*LÇÒг¢ ˆ gÀ¦[ zDƒåxc¾|•CWÍy¨v„øá¶ù£{¬Þ>¶\þ˜s‘XŒ+½]¿‚ðj¢X;Éî*ÉR/1W­…¾|á?‚·.ør(ûÜ5^n hݧÀ³ÂgqE[j¬+Îáƒ�Õy•YWC¬5φ­–ôÞÛѦk±Zû/NŽÊ3†·)‰k²¯Uí°o2|í§Id%I,¼Úˆ�“ËpÒ˜ÀØÛñyŪ*þ]’¥[MM®‘òŒ�­‰…� £æðE¦àþ&_½0gEã”ÑÓ‰DkFI rfÃãSL²&x¥:h¨$Ò�-ŽÏeV¶tl�×\30s_R.ñÛÓ"5·Ouž®�àmþƒWî¾o6ùùœã½üŽÛŒ×�³~±qF¸JïË%ì{oIA¼lI±Ú•hvç|Øý˜?ë5MÉšæ~[äÉzÛ&”ıȼƒ‰$DÖ”OúW´tq¨¼±[ûÅ®¬g“9Ncù¹-‡ÇÃHÓÕ&8îÉDݬïmFºÚ°×5�´êe D¤[W\c†:]4â ¶*ufÅàÖ±!ùå* &â:�åÑÉ�PKƾ>Uãþ¯°~§�4@êf!Ó‚‡é8KŸWwÀÁc‰T}«Rû,Þ]¸ˆ6W7]ÄÜ¥%ëž4ÕlþÉñ‹~¿é¿„#�š‡QÅã¬{VG�Ò÷�ñœs5Ž509]Ô·‹Ã]‰9«¹¹ü£±ãÏá±”î;áÒÒY�1 å2ûèu̼WõØøË,˜Ñ À³l Íá;ƒ0ÃMÇ6 ‰�2ÜQ´GÒl3By'ã®57C¼be_‘Ê@/òðósÚÁ±²¿ŽŽ‡¦ü„,àgVlÐ7Bw$6åN¦ƒ§uW]Ÿ ¬½°£­X˜ãê£_·îˆW8ua{Ä):= Úê,Û:µ;­¦Ë¸ ![­c²²—1yDpoE"�ÔZ?`_æ:s Ï¥ÊoÀ?~ aiö6‘“Ñeºc×òî·`”ñL;æ’cÎ?ç7¨äß O��Ï4ÏtkHÔI�†Åó„ù�w×.ÇlÿCN7�5Á9ú¹¸k•Cáôî*Ýýí³ëƒwß�u†°ÌÛÄ©ÄݜŦN‰-<êфڊÀ,í�>ø¶%¨]üŠ€Zݤóg¤Ëb $éWõ3ÃJ¼µh\å_×k–„{èþ�ß*n( ËÞº‘©¿DƒÆÀ¹à€F�iñá h½¥šÉüùñõë™[m¢8]yìðÈÎñÁϲ*ÑϪžP¡ëw‡›ü;„ëÄéŠÛyÀ6ëŒÈ$+Bsþêêþ ¶‹ÍËÅtÐuÈ?ê­'YÂŒ±e~+à·NoÍ÷²ø«Jî˜õbùøãÁyWØ‚-à^õªTøã\KQ–x«wA«sæyû#›+³�Ë ’¹´Ý}wyê¹t[:C�9¶,Ökãšù37bÆš¯�‹KˆOµá Òy³àÜúÊ7Röåå¢BÝÇ =S½ÁY†ô’kKàáuzq¶¯Ïß™£½qQ¶®C¾=ˆ6<+û�kã«óŽ’´&ÃT‹«—³¾lŸ8Y7ËK©Ïl§3ã—ç-™ý;O=Mæ"Þ�8(KÉ3e±îŠUlÓšvˆîëÕ×0ã|óÃ` ç1ãì£M"1/FÑ«†•2Ñ%�ˆ±/k"+r¥ eºŸp@I¨rÌÙVw RA½£p®eaê!‹lIÌ-ŠÑZÐ:j#XtÁ”A­ÃŒ0’?!N‘³>)Û:õH_“;D§Ï4Pâ¾bÏ}ÛÔ/ÏÏ[ƒ§I>ƒ!AØ·¡ôr�㉧ ÿ|JŒ0‘Ÿ^/ƒæÃ›0C&ô'IËð¦Éh®ïâñátÄíïøSCºc¬WÌWîY¹u„?½* Æ…Ò&ñƒçUÓEážÿçü¡µß�ÅŠ_€¤ßäb`ïà·èŽ=7*’ÈK†bŸUt¯ÔUKÎ_:bLtÿÑ€á¿�|�zKú0ý¾¿_Çñ$âiœ»â¸ßø|8CQ [�1èÐ9ÛÙ'r©‡ð[hVcËês±þrÞ™Ió¨À^n6›Fÿ$eNFu×õ*®cö¸¦;£Nœëª~ñ*rG­|`ut¯“^‚ÇgN^� ©|#¼øõ�ÃB^+ÖýÂ.¼3Ü~!% y9Ä™&ªÙˆmöQcáÉt("•…·Ò««’¬kN:ÐÚŽ8�òÿt)zˆkB•ÆÒ €AùÏï®ÃŒ1®„µr)¼õËÙ¬CÔø!QŸ{wÞbÖ…6á DïÑfÖDiB.ÃòÈ4¶q”©)¹Åzq ±Îs;ni{ížÅ6 N—fq�‡TmxTˆËÓ §SÃÃ8k>ìmHÿÛü¶–~4ÀóûKMæÜÐ=«>1ÈðJó§D_wøŸì—£Ã>ÊS6/)Ûãú¬ÛÒÜÎ{úÚ亥G3*;›œª,€ËéSºFÎät�¨VØ«Ť€þý»UÛÚó&;=²ú ˾øñº±”?˜°_£xã0°wûÇoóÚÝo$t¹ò>C=ºÎFbsù�ÅÏ$ËŸ?^,vÂ^rÊ2RøŸ2 ß н7kÃ-˺\æo%Ì 0æÇ—ÎÝÛŠltæA�7|a1µ)÷'Ç^ѤÜJ1¬z¼Í6èåêd>S§B2]�ÈÙ˜ƒÎìˆ }å|Ãd,oÑ·²y,IneŽT3IµÜ%«8ÀM[Šo?Žê‘ÖwÓ¹ÙÑ�[@pÛE‡ŽEÈ»|é^á¸Ä2ɺuN´—aj±‹ø§.s$ÿ²«¦Q;, $þÅ“z‰LMd–K³u œŽEçŽã©1ar(Šu»îq@«¯‰Åxt=t…;íXMDdX:ßI®WO>¬09ŽûYº<¾ÑÍYÌêâÙõ˜Úîx•Ç|šHþñ!Ø}G®a!.¸óãßÊú-‡“kG» ²ˆäJÁþWRÀÂtjPrNÁäôà“Hb³¬*"ÎSÄuŸJZc�%±rÀS¬Ðy¼þv�ða˃ϕVh{aSDΊZ{X®ïovfß�Õ x'ùÛ:•²ŽlàöãŒÎ`á~© ^ÇÕÌ ¯?.sc:dK›E±N‰IYÐwˆ7¢ˆè�€Ã®éÓzâÆþhnÆFz“a.=˜²OLZ}¾ÚËÄU²N`pJ”wŒëõ¨èk1¶#D å€/—ggU ïÌ@+œ× ÞsÿiQ8UðTN^Q³ÆwÙ’òV.rS4�ó!{»OùóCœXf%(“íöØ_ÏšgÔ¶ZÜÃï%µS—ÇäC‘PÈôã¬ã%·òh�8Ã|–“ùƒœAÅ2ó…›*2oÞéØr-ßýõH€öÖü}7¹±¡æõÕÜwŘ�=1ü¾ DþäãßÕûN ° æ³gå¸kIÂæ£¾®� ¡A�p«êÏu‘ÁÜÖ-´3®Q$'Ó™úÒ“§ÒrÞÕ�g3gIF"ÂåÐG!š¹÷PKŠñ¹ëÓ¬Ö¥ü0‹KΨعl}ø ß1¦˾jÍ,/á-óEfå»Ï�ÕoQŸÆ.ìu ÉAüW¼<ÔÕ0ÉñMéÙ£ëVº¸:‚hf‘Áqè:4eã‹kr”CmrúÂKb±íò��Û‚³ào…Ëb‚Ž­îÆp?ÍÝ}{gñé&îž²œR�í“pý÷¾ëx«¬ÈR·ñ[ˆàÈzÚ3ÏNJ…{½u)�D içË`ã®åþ{¾q|‰¸g.VÔªî=bR óÒšŒ�\qfEÁ"WU†\ÎzºC�ËoYÆ�GPC­’º4¼æ¹¼¯§J·m¼b´§¯=åØTþDÛC䔳¿–Í•m æ'H)?$¿÷oQÍ×0óXhÚ%ô¡a—Ç?P›vÔ>¾R­söÏwt ÉæÔu‹¢cŸ;ÀÙÕ%T�˜{ëyB�Ðþc‚·Ëöê£aw…ÛÍëÃ?˜Ÿ]rnŸ46‚„ï[¬SW“ÎÕ‰Î�–ߘ±y—RmH2è“þi°BLqœX[¡©”ë© ›?|VñMÍ3šŸçÆt1•].ûXõj+”(G/cÚŒéñD#ç�Gà¶r�Ï’ùo3Mû0 õ¦z�ªÎ?T¶îAaúȺ÷�÷ ÛgÃ'Å7WÄ™"Á5‘éæ±Åå‘ëåòÎ…•ë!)­P5Ìáþq7›µûzÒw*1¾ô_°e¹¬S7�BM´~<Ä|WÒù–Aú …„E…NHMöëÉ×)g+¤,§ÂĬ8¯ÒöÖ_“}ÖtÐ`4ÝÒµ˜6‡} “WVqÀÎ4ä¡}�h×ϤÔ.éc·#ìøA†ëÒukîUm—±Ì”á'¸C‹?ê@Qûƒï9»±g¥œ ì�ÿiÚüe§ÌîoëÞéfüÄX³«Oátô·ïÌs¼›e>îOžÚèÌß{Hi²e:äsÚ{›þÜ’1{ðs›¶06ggêe9õÇ,q¬^Œc/¥ý�qrþKTljØAD¬µ™1×:kP#í¾yÅ*ØNPå·ÂLññØÖ~ÎJHÐûyËÞ›5™–™S¿ïŸ¢Ü¼ ’ù‹©˜´=¿�[k髦ç¨-^�\Ç:z� w„EXFTŠÌuÕA�’»Užy”x€vEyTwû}©#F1;Îí=ÒŒ ©ÀÍ“ßPUa^|V � ’qi ªæÍ„TJX³b�¿MŒ„z‡™©Ü0³ð}›ü�'ÞÝ(D®c^‡9² Hùï¡^O¢5ð‘¯Rò½Ð dtál0}Êi¶Œ¼u|Ãøg4Ü»­Ÿ\æfH;Ë.ž8�'Š#º&u?·À\$J+'òûm� ¼ü¯&4Ž1Ž›j’]ß´oqk™Úa~+’ýšò0ëÙ'k·ŽÌìï-êÜâÛ JeäÒ¹PAÏôŸÅÌ%ÙPÜ)§uÖ'w0'§F ™é_|6ñíùʽñwÄ?áž¿×óùÏ� ]©ù‘›æ-ýÇMÆ®–ëçÆüÁC æÉíî�vYNâ¿zs¡ðð÷ ¡L9¥T™~^Iú·tž £jØü[ɇ®ïTIACúèÐ4Û‡î=é©2™\ú¯!ö’}(½‡·ÐC™/[¼húÖŸx¸§Nmxë‘Üg¾ Þ¿äâì~�ÿ¨ÓùÛÐ$Îóã:ƒa ¹Ä|Í�—¥Žßö¹˜Rlåˆ'Û«ºt…bS$aÒþ5ŽïZ ßšz�Ct®"•X§÷•“u&Í›qdžùá°XœH‘Ñlå'‰¸€ù.•ÇLR…òséÒÒ@„¿˜¤«]8ÁbGü˜jºùÌËûô·‡wðŒOQ�—qE$ís)UÑÑ –‹vÕÏF= j×FR«³»›î LzîS^�[¯¥Ïò�Ó([©æeS’µ‡që¯:ñŸò7zL#Ê]ed'üm“G·çŠO§{g CÙÉýù„ùò¿4β÷Άü=­‰S/†ïþ4-îq,|…[hσÔàà~}™…Ù\á>øÆFVÇKj;4ÃŒc)\>mÀÓLcdÜ32ÄkqÀ7íã›WÞ6 o8­¯¢ßv}^Úþ 3u 9´¢Ð'ÇÙÍò›¾·“&—nkð¾±< i‹Æ^}YÞþÒH½S‡/ª»‘:XŸl3™Š•î|'¾j@¬¹Úk>z˜A]Ç-³TïÔÆµ¬ˆ(ï$0âä÷ÚO�º¯Ê0{h _)Af:dÈ_R“jÞª,Î ïË8­i™Rg´âQù ë Ðƒ—ʼ%4™ÔûRÄi²Ü¡Uvè|›´ÉÕ¸Ö–¶dq!ûL»ã�ÿG– ÏžOͨ͹ÄïJÊŽpU‡pÜí^°­ø1½°"ËWG7ü:ë¸êŽã¦ål«·FuI£ ²IpéÍÍê)?pëQ›êgÄ\=[Ó§M‚²À›ë–~ ·ØÖ�!ñ”¼šðiÿ:-›.˜¯J�rq‰<�íÆÜuå ’Á±°È&§ä£×wŽY¾ C±¶:Êsÿ‰nk³²}XcšMÚ·�üþî= G�Š!=“6„¨)Ź×è¬ë-MÑ6{§Øü6óÂ.aP³úW2ˆAßïñÇð?ô>6oeàpæ_{­ª§–ùʲÓDG§ûÒ§Õ–‘eý($¯D¯FÁ<ÆÔ¤_U ü4èOCŒŸÈÓЈBﺫº§3Ø9”uhá,©3&&æ_o´ŸÌKÛõñãh;í�ÜÉÚ´oˆ‚´×M3— >¿_>Ùï´n£Z¹òÆëæð:ðq¸°¤~„ ÓÜ/}—LM¤¸£?�ŽãºjDœÊÇOî-�˃¦)¹>Å�zUìÚ~™$]D?.f½œ�¦º‹ ¥¶iKbµ«(¨Ö(4Ï©]yÕ4:ìh)à†7¿oüD¹Û⣉è{ 47#cuJ~=÷ƒÞÙ—œ&þN1Cctö )62ÐÁ¥DŸÆ¤�V�´9�J .Bà²`oÌ÷ýîQù�<¨°—~ic¬}£�­ä‰y³-ÜŸ²z¿\¼ïü�Ï_Î1 ¿.QÃÝÏtËj áW=`Yuí1É®Ë'?»‡wŽü»ZbQEÒ¢‡Ãx0G¿8»s¼rÌ,Üø({ý±:c¸ÕÁí¬ºˆ›½ßèñªL°œU¥Æ.æÞ•É·¼f¨6ôž¯Õ÷‰±âYvóÕ¿b_!.ø+Û8©uêÆÞáÀѸ„¶×ï4‹Š¾Ól/¼5Ìfz‡õ�Œ�ûùnú'&?süH[ðJµ�±�±\ê·˜¯ðÜF´nPñãŽ`ï†tÞR ¢úiôt0dä_È_Ÿ$Õ\_Í$ÿ»s¿„˜§Ã/Áîmâ¤tkr¶ÑF‹C†96Ûʘ^–>Þ©K8ÅÚ¼£¯².t‚^CC5²þ¾¬×Ó Y(Ÿú¯»èÚe ïçá°N:àé(µysÌu$h‚'žg(­wï¨IR `tòQàd1~è,µïƒg=y I’3m }ó#Ï�iç�”úÏÞw8!eºåC£–´¶æT»¾¶qu-h'´Û£c1ªG%¦Cw—œ²8‘«æäuxâxÎÙ¹Ö<·¸K†6+ÓCÞ.åJµó†@)¢­Ýoõ…+¸Œ:}ùÄÛiV“Br•Ý{?·vx؇ß¡.'¦×¸Vsõ�CŽ¡'†£ S8þ8ê~éÛMFÜ£¨üq3ºqaý 7¿6Óôs*ÓxË—wjÈí{êÙüåÿÔ·Î €R&­ñ)O"_ϰ¢¬9?^—¥Úòqq~�W¤ø\"uûÃÔ;ðëñˆðåã^ôMôý­›�E`'ç{pT‘ë–ºð…ttâ};É>ÁFœÛÕ-²%_%Ì“‹:ÑsÅdsHVÎI<„û•»]ê(ÄÄ5p ?˜‘ן9µcëÂñ…ÏJŽY×L�ØðÌò/N<£÷`.[•dœ§£äPxâsã·±ý;¡Ô)>(Á pLŽÒ!I°A½®ÿ<(þpN¡–å·óÃѺ�VÓ—œ'G†ëDÓç²Â™ær×G õ§YÔšýñʼ±×YÍVƒlóĩ˦AfLí'·ÆÌŽÇ}Û†»ª ó�éR%(õ}ªé³È\Wó]Ѹ{¢7›Eñã¼U¶�¥ÉÞ$Ywái™xàdÆf;ÍO¥ Ôèû£8O›ëÈ‚Œ%~ªàcYÝÙ¶P­7s2e#Žrl{ý„z® ‹�jL{£qh‚# B�„zéo§ ÷aõl×p¶ka’¥¯yE£¬´>d¼/ÆL|ísìÖƒ,úÑ!Ç"ññð�þ=žÙu3vb�¬/š÷®ÙP¼'ÁX¬m¯.­?¬O?ï=‚ˆî<VåxUlì”×›{—|føÉÒ„'rVTÞÃX­°?±`ÒïæOk (p•ßÛ¬?â[÷r‰žË2›7"�™Çœ`gÿMo±å/á2|·ûÖê 8Ä‹‡§mxðåfy§^–aO•&èË!œWÚ¤ÿÕwjÇÊP gÊæ¼j\È“ô ¡spÒBÀà�ó£ÌõÖÁYö'-Öag»$ø¡F¾F'8’·ú§nÎ÷¯æV¥´ù›lØZ»Ë¥†K“P¢(mf$ÉÿÈuW¼ïBá!(õÇRzeüòYú¿ïØyÞ~Úµ«²ùW¼1’o»#xOcmüú½SÞ­uI‰iÆÍ©J¿¾‰{üŽòn•¶*´Ë~¯·6eG,£pÿaÓ© �ŃoÏÔùëƒe«/ïߺhÃ�ÀàŸïão÷�ߪ0ï[qe­ôãÅé<7 ( ¡ÃÀÕhì–Œ:O�× VŠÜ‹•ZÉòŒ*ñ-ˆÛç^ÙÛ<²@� ¡3IN±ì%û–›ì)aϥرÓí<:L§ }<ôîñ3ï0ª—âƒ&7Tqؽ£Ui(ÂçZEçNÂ(rÏr“¾|\»LÌS¾Þóˆ;wÙÍÙøª–¸ŸMkü¹ú?× ó¢ äµÏlw7þ¯la¦:ÈÄWrÓàéÈDθfgö­ö¢_™EK>f­V‡vÓD`ˆt@s·Ó×�xèq@-¸¦!p÷ëGÃjøpæÿ_ !WýìòÀ&*Ò±Úï¤ —9':ðÞEO2'j¢l ùÄk–Pw‹±ª£!mghA½V™|aC”vâ­M�n˜PÖœ×Ã.¯·�fУS®ußøÞmËeÉë´c›«\£2ŠÓtÁµ�mi ”°Rï‚88±zÈ‚G4sÁ±Å±¶¹ÿ®�b2Û. �[¬]w¿ž-dôæ!`Ë�󊋟Ý%61èÈVEþÍ›,ÊiF^¼möNƒ��„^èËŸÏÀ„!ú.— Þ^íÌP¦rm5kQòþ5}cbCy�íXFRt›Çì#ó>ƒ;c[5ÎI?¥Öw×KÔxò«:Á¸‡’¨<[{Ã+ÚcšeÙ�r¸rÖ/fL‹—³©L+«ÖOÉPQ¥ݰm^ìÏxÓ,ǬÎ¥žŸg"V.á} =ý×¶Jœ6¶î<Ø'œè³Ó‹Tg¼ÙóÔìÁóá-Ú`ÏŸÓxðæ�à §ÁÀød Ú È ÇózÇ¡F=ï Ø´rKœ²ãmþË}è[<]{¥<+­Ûf¶,ÓðÄöŒN�Æ(Õ:�ÏÎQ«µ ç9†ÍätŽX¤(^Ì|cM¤þò!ÔþÛ‹G·ÂÕ=¢a`—õr¬^΃L¸§> Žå}ñþëÜÚû0G…js àí¾{7~ÂAÌ¡“û£Q Ư'î@Ëq‰åà’‡Aj u´B•ÞFôA¡°Á” )vÇ,æ ›#òÙvɇø`ZgdÊ:±2dtö”mѵ1‚™;=KW`÷½ÅD-Á Ãìåß.ìH.GhiÀ¥÷›QCj½¸x:ÌŒñJèù…]5 =Dœ­Ÿ /­ÄÙcgdýصÍbüí/ó×X¤»…ïÂWNýÊgYçäé¢|6¥À�öòëc ÂgÎüºo¨Êïí–û‰i¯hë0¥#WŒ¿ç0‚Î%¾#|ü¢]ä.Šö&Úé´Û¤r»*áƒoÄmÍÊ“§Â—m;¯ë2á±ûÄ#ñì�p×.Õ¥WmîS>úqï>¬Ÿ€�X v¤³(qöÙOOˆŠ÷D½ò;–šï­Ãƒ† ó’ôhïŽNœ-’d£šþd»ykSø>ºN_�qdï"ñŸ/Ǭí~vé*G»X�y›{¯’qF#o§M“¾ó Ýœ?¨+Gv^´!m¶‡²hlÇ BvÕ“,g¤.ï÷·ßéßîÿ�¯øQLÒZ+(‘iŠ6Lš6ÿ�ªÝ¶´¶µ•mMm_÷[m¶ÿ}þZ‚f"%SA´‘¢’Y&1¡iRLʆ””Ø6E”ÀI¤e2ÌRÁ)P4ɲQ$PFVÛjßÕm¬ªß𪷵«­Z¯òª¯ûmkf¶ßë¶µV«_ñªßò0o×ü¿™ýÿ—�§ü„Â�Œ‡ •˜¦—^I¤ÌÊ—‚…)Hbî„J£Ñ;�^^b‰ˆvïH€òîå2A2ˆ€¡LA†$Š$D$æCÑáУ³–)ÁH€áØ��I’!ŒÐDCLI!䂉”îò‚Žæ (v¡‚áR^:ž`@y !Ü¡G&K:0¥â PÎe t(ɉ4ˆ—I&Ò™zDRˆ¤ÑžP¡z<ÌL‘1D„ÊiH”)@ˆ�ÊLDKÉI0"€ÅL (£0d K±"L¤BM%Ì�H—i,)4� ‘Ìy„ò¦ ;ÑJ@P8wy0Hzž…â]˧¢DEZŠ…é4zLÍaž�$ˆ(‚b†&˜3)äÊH0‹¢éD0ôpž’¤ Ôy!ä”IzM)H)ÈD”ƒ‚ò¥áR&Ò]9—”](tE –S”•täɇ,¦aˆ™t…(„¢žL;9B FaÂ,åJi.�FSº¢£‰:”"!àLPÁx¡€i—‡H•G â]<@ŠLå"¢i (ˆi€‰0ô‰yw%9‰q$L»¼èï»ú¶Õÿ}Zßãmm_øÚ͵RÛWúm[ý­Wû«j¿�[JÛmmþêÕ_ö­«é«m½Z¶·m¶ÕýÛVþ+UÓm¶¯¶ÛUüßé„Å“1DIJ رƒ ­ˆÐͱD4(„Ô-d¡˜ÉF5!™¢Æ“  ¦`Ø´AA‹  Lh(¤È’É,HlhÌÆ¢„La4‹ #21A±4£P‘(Êbˆ‹Õ¶öªµoÞ�b´Y$6±±ƒbƨª‚ E!MRcTÑ£o[U·֭oðÚªþ5µ;m«ÖÕªþûm_é¶­}­­µ¿ÓjËk[�m[¶Õýõ³jÞÛZ@ÌX33`Y™€ ÌÌ%ô9ªÚ… <<šB‡ùe4ùsHPé1¬»T̤˜IC (A—IV`D' È&Nè‡AÈŠ3"²õ £„M ]DÌ£d 0�B𧂦PŠK( 6r¡�(Ô—€^ ¸ðê,SH’¡Ü‡%ÜJPwk'2bKÅdš¸@ЄdÀƒhf ßðÌf Àu[k–µµ¾¶×ùí¯óÕ¶ß÷VúÖÚªÿŽÖÔÕ­m{_ï¶ÕêÛ[í¶Ú¿Ûk[öµUýõZ­j¥[VËm©Smµ-jÊÖÊÕlÛm©Z¶­þ5¶ÚÙ¶­YZ©Z­µ_ó×_À9ÒNŸû: ¼9.‹ E‰÷Ý÷׸îOnº=ïwŽs:;ïx÷p²B‚I2“¢á$Å;§rétS÷½î»Ä÷{¼»»<ï7½u½ÑÉròì¯MÎMÞíw½Þ½ï{»¯wž�-Îî÷Ý_e>Üêá¾»té{�½sÓ¼î�ÝËÎöñî”§w“ÝtÐ\Üâ÷s|ó|åóÝÛÏâ¶­ÚÛm­«ü+5µ^Õ¶Ý®«m¶k*µ­½m«ükjÝ«ZÕ[[m�¶¦¶µ²Ú¬Õiª´Õª¿ÚÕ¯æµmnÛkU^¶Ó[V͵Ü�VÆ¢¢"“E *6’“’ ŠÅL¶ÅA¬6f4�HX±¢6 0–"„Š(Àb5;VÛ}kUWøkÓmµu_ñÖ¯ÛVë[m´­UêÕ]k_«ï­j»[_m¶Õüí¶ÕfÚk5¿Ë5F´Zŵµ&µúÚ¶ÔÖZ¶²«vÛmÕµfÛ[ZþýjúÚµ«¾?¿ü;³Èrëý~¿wçæõîéóçåÝqóîí|ók¥{÷w·ÏGæ¼ÇÊç9o>jB¿7åÞíË‘µ;ß¾Ï}ëé¾WŸ¾ëÙ\§Ýç/—ÒóX¹´T~íW…ËÒ�¾û×Íû÷mù~|ùòüß–½Ü匦I „‚ dB.âe@FS¹0¡Ù&K@RƒAi"TBLòéˆ^öö-ßuï.ÝûÝõöù{ïw¨¹^z»÷ï¾~îyWáå}ÝykåEy·wŸŸYî½î÷uûº~ç\÷¯j9~o¾û÷×ß=ëŸ.KÝ7MrîïÈĈ,fÎ\D&Dɺa), È€‘h&BrÁ˃ 1"à„B!Ñy†ˆ\çß�ïz<ÙÝOÝp¹o¦¾_<]àò¡ÙÁ$å™0J!I̦r AÉ(�ˆ»ÌD§q1P)),¢"BFK”YÞ]ÝÁ Ðt 需¡hÛ÷{ן¾ïwž5ó~ûïWÍ~÷pü‹ï[ZßÛ[ZýZ©ªÖþ-µ}Yjý[oZªþkmlÖ¶·µ«øÛƒkªþW5spÛhÕ\¶ÜÚ*«–ѵÝÛlZØÛ[[­Wª­¯êÚÖõªÛúÖ¯Õµ¾ÛU{mµ•¶·[kk­ªÝ¬ÚÚ›Uj›m©µfµku[m_].ê˜hä_ìóÓ/;œÅˆ‹ÊåF ½Ó®I¹Ö÷tŒY›ÝÒð�Èf!”׺í¯=ÕÞ’2c7®œ÷µã]:÷rç<¯{·—wk‰€‰]Þx\Õá¼»®Ëx½evêæ÷gt¼Û®îNç�s^g»rN››ˆwba½ÝG»¤×ó­¶¿šÍµþ•µoZµzµªþ¶µµ]mLZѶ¢Øµ¨ªþ*Ö«¶Ö¿›Vµ·ûõUw»ü'{ {½r�ÝL]ѹ3;œ’eÞëœåë»ÂwRîáÝÜísn=×¢»·šJ'w–ô:\Ó»–½î®n˹uÔŽõç®õÉGNè¹Ýws‹ÝÎ{Üêåç½Æ×(�äíÑtM;:î»wïO^ÏÞ÷w»¯¸ž÷{'k‰Î+½ï+Ò÷{FJéï\÷uîOwz÷pó©çD÷qvãww"yÏ9Üïwg»§wzGÀóÕîÝÑ×]ÝÏ{½Üv®nNëéï=Þw½s×bï1ïsw½w&ãŽ÷�M<º»—c‡ DÓ®z÷=vº:w.{ÝÞôowŽÝºº{Ý<›»½ï9Ùî��:çíÅÝÆí�w¯o{Þ®—§®ï{ÏbI6]ï<è.çgw,pÝç{Î÷\wv÷Q{®»×Kº=zïq.Ï{—³·+¹½ë“ÌÝõ­WÕµoæÕ®¶¶·ím´­«mm}µokm¯mk5RÕk[:ª¶m[ûmUvóZŠ“coZò (‹QŠÆ±°ÒY)¤IRRjŠ(Æ" Ñ±F€f´V6ˆ¢�#d™Ìêªÿ¦ÖÕõ¶®ª«ÙE¤j&$d ³1DhLÓ™ ˜ Âešaˆ£QR"¾ÖÚßÝU­·ZÕ¿�µ[-³m¶¯kfÚ×VÙ[jZ¯æÖöÕk^­^¶µºµ}µµ+WZÿ[[5[S4m”f” `‹EFM Ìb(2[›HÆc)-DZkJÑ”LA¨*&hÉb#IQ†ZßVÖëZÖþÚÛ~¶Õýµ«ÿ…m­¿çkm^Ûm_˜3† ̈™�™™€µ½¶`\‡U?åõßK©~ïu×½s¼.ÞAKžöó½×—:kÝ{Öå{®{¯wžï{7<þ#ßuèõܽ÷nÞìû¿wOtúîdw=ï?uÙ‹çÉ÷]מow½{œùº÷Ó÷®{î󗎸îòîñë§~÷G™_^y{Ýz¹çç{ë¯F{Þ¼<ûºgŸ;ÝîÞïî÷zpE™.à�ˆrNL ð�Ñ!Ë¥EÞ纹^qé× Î½Úäîò¹Ô.ŽïÞ¹îή»#¼õïÏOÝ÷ºîùvo0Kó¿u÷¼ß>¾ã¹»î÷§îû﻽=Ñ)·Þ÷œû½æºtã®Ë¹}îö÷®ÞW%Ü\çÞ»¯{ï½î.û¯MÏ+÷}ì];ó¿> øë·Ü¿uãÝÇ.¹w~z§¹ëŽž{Ýá) å‘"ôIÄ—!É”!CŠJDwuÉ /»¯:[�“ïË× §J`™$D¤ÐIr$‹—v˜‡$�#7»/ÝÐó_½Ä¿<õwž¼“îéŸwÃÎ]îý÷ÞJùÃ$îü»×9sÝ{×_•Û߯yŒWï»{Lîé}=êíÎÅîì&çÝtDk—s÷­ï»>êóœò¿;ßo|Ý’M4ù~÷w;÷^¿8¥Îs /·{·7wyõ×{×6AïoÝó×/Î{ºý÷nn÷;¸ç^]/—7wÏÏ´^t]÷w¹3»ÃÑs�w¯»{Ý_2ù»Ë§æâBýÝÊB÷t‹ÍË$ù|õ|ëçϽÑH'.ï¾ûŸ—íïÞß¾ï®ïwMç}ÝÝÕûÞ¾û„¡>ïžruv{»ÎÙòé2"Jî÷ßy‹÷s»©%ÝûÝwmÏÞ÷°~ýï%/»¦~q×|¼ºé½×ï\£ór帒»»÷w™ïxS•Ú¼»òëyóÍ÷»{��Õïvûî®nz?w^ë�\¾~û¼¹R9£]ÝÉ ½Þ÷~]{· /vÜÇ…týÝ«÷qËî÷“{º|¾÷g9¾îûº_uºr¸¯Ï¾ú¼Á+Ýù_.ûŠ‚÷Þ÷¾ë»ÞûÜ_=÷ܼ¦¯ºâ$žsºá÷{Ýfç@LCÝßu×1óÏ;�÷]t¹È¼ùñ*îºrÑI]�RE'AÀrÁ(ÂPG»›»ˆoºîû«ÔïOyÝïp"ç�{»1|çŸ}÷¯‘¯Oßv÷ºôSß{ï½ôëèÊ`_w4¾îŒ}û×ψáo›Ï{½½×½Æ(™{ÞôXws{¯{òôý÷O~ïoŸ!˯»˜ý×1åß½Þ£»tœºòè9úâîòõwpKÝrº\¤F;ºowsç˜ù×Îd’o—½Ï»ŒÑ\æävguÏÊëîã»’C? uïÞÞ»ïn|ß3/w—ÞûÜ’1_wW»”Óºï{ÞJçFÃç_+žëžûؽ ¡Îæ½ë›ºèîéËÏÕÈNrwn_7S|¸a÷ï^ùÓ6}Ôî‚R#EÝÏv�;‘‘ÎK÷ß}öY¼é K½ïO›�çn÷^{¸¾bç.ûßzúïw«ï½¼Y$ˆ@± 9ƒb€Œ'v’å:0ï²û³®ÓÝ×ÎW<÷º/½Ïw|ÜF^pó|¾øã cÞåZÕ*ÚßÍ[µÖÛm+Z¯ÛZݶºÛj–ÕoãkjíµWkm6«mýVµ]m©¶¶Ý[öÛmê¬ÕK[¶µi­^µ¿­µ¶ÞÖÛ¶Ûjþ5¶Ú¿­ok[jþß×Î軎uÜé×]ÝrqÓ»®Ýwn…®ëwwnîë˜dçw.×tçuÚt�Ó³»®]ÝÅÖîí;¹rãwqÊîsÝÀŽîî×pérâîë‘wuΑ®î¹på3ºær¸ºvwvç;»4*vî‘·]šîNG®¹Ëº]'º\ìwLnÝË¥ÙÎç@‹¸ãŽºwÄ]º;²º�œ]Ý:‹œ�Ü’LÂ�%_Ímo)(Ô›Ƙ)Y,¦"e%S*„Õ­ué¿®à�@Lé¸0ÄÉ6JŒb$´hÐ�@î+”˜æw)´š(™Df9\‹›‡9D§wd‘\®˜×¹nÉ(¨B%Ý]7uÖ‘š ˆ¨0\æJ4QDIÝvQ2Fã»`ƒsvFLîéw]Ýt¸»·âŠEÎRaIKGwE�%bÑ€£;ºNíÐ! ¥›œÆ  ˆ(ØÄÊHÐEA¹Àd(h .ZézÕoÖÚšý­©k?¶‹4û¹F5(æÝ+»ª;º�b±ccs»·LUËrÄdÖLlë®%Eˆ´£†×5Š,ss[X£.cnÊ7+š¹Ó\æ¬î«˜ª ¶#kºëÆØÅ£&űX±¶6M¨ŠÜÝݵ¸hÖNW2lnk‘\Æ®j泺Ʒ.I¤®ræ£\ܪåQ\åWwlFÜ·MʹŒ�Q£Q;ª-Êæ¹ƒJ[Á—uW6å«››–6åbå¹¹µÝÔQEZ‹šå�DwnZ,j9¹rܹ®çZJår�Ìmn§óµµ6•ZÕõZ›VÛ}mZ¾¶µ–Õ^Ûm©[e[­VZËmM¶ÙmVëV›m³_‰X†Œ`YÃ,4`"™A�’‹ HÑXJØ��‘6 Æ5,š‚�hM¥4i#J‚‚0•ƒHj mU}µµËcm�h½mUÚÛme­VÚµzÛVí­©kU+mfA™†@ 4Á˜`Ìÿ×øøÿ‡þŸÓù¿íOëý?ËøÊ?ÃöËaX±¤S%Y2a¸iNÙ9Pÿ{®XËô22ÚêÃÿRì6à{&ÜЩo<Ö­³Mk,?ý,·™��ËÜ�#Gí*æµyk]‰ì#×UL1A$;&êÅŠ#„­Ý¬á•'Ç\+£eÞ eìµ)[#¥ìZÖèÀ¾DÖÚnÀ¢ª2So‹]‹ÙOlÃaÅÌÛU¹lUFäÕ{–¾ø+˜³š»J¨˜jöãx‚ Ε�Dð\I—6å„3—é“ãqQDêA‘‹C'!z,a£ieH´º4³ËñtÃmä'—,MÏ ÂlF#™H~ëЃ€ϊi0|¥fÃ){ÛEs»Hö±›(a‰!#OdÆRžp¹`¸\:èÜ=“ݘYRÀ¯4ÎâÙ�˜Së¡§±©;�m6âä�ášÜ£åФӽØeFœ@inÁÕ姆8À^lƒyVÉöÄu9­°àŸFÖ @pj18e-�©�‚Toé´[õÚ¬‰ÃØ¥?u!!~éߪàJKy È–'ç\e׋zs“ue˜{-ªð©®àç €ëE†±<ꆱ3eàœÚ2¿l’£…@*,·4«1Šuäñ`á§&›°„Á*Ú¯’Öô1m³ÚS7‘ ÀØ‹žØ^Kƒ�ÆP]ÖŽ‡h›;>Έ �ñ©ïo„°©âz9>þ�ÛD÷f6«À¶×Ó“†#[²Tï–œ?q9¹°lfÈ›ãnžmZw nùׇv§±“^ƒXÃ^¨Ùö ÆC~’ñ¤4 ¬»á1•±œ@â/<º•¼e‹¬Ìïçs$s,uB.±³’=ærÙyñCþ&ý‡¸V¿Cݬ!0B9Å®ìya²�*ÇÆš« Ë “þqךޭŒn•·a'æÌ:IÜë9÷‰¬[Úõ¸©ºÍ>8(£ÙðL'F!zWg3’#0D¢Îny—}YRÈ™6Ój!ŒNGF¾6w»-hø°ŒÌÂŽCÒúR¶Ö ®òGˆVÈfñ$ÏXJõÒÓ§®÷Ù‚]—‚@ìÙJÒy;°ìÕL¸=ød§ ÕÝD6­n�áT1|JÊE®Ÿ6=#à\Í•°³,\¿æ8«'äñó�DµÍ�M¡âÈÃŒoxÆ3~kX¾´MÿÈšž¾%á`šêDý3Nј‡],^˜1D»1ÁÞ³Å1ä30`` ÌÁ›� �8ÛU@‚qA‘:‘µü낦$¸&µ Vì .‚TÊÖü $Û+t'$ øSu†ZŠÇ4”õ�Îç[Ãf¸óñ£l»ªã±‘DäºjÀ”¤sÝ�™­Fðù@•|Æò1qS=', wÀÎwˆÇšÊ㎇!ì� ¡uˆ.RWÿÚ®RÑöé­` T/‰P‚ˆ³¢•t‹ê 3#q»`1ŒÙD¤ÞÎæ&È@dåÈs=I‰'Ê#Û†O¡W/�’Ú×7S“+®, Æ@Ôªt¹»© t�Ð�ÚfnŸJ¢³´†ÿ\© ¦á=BP×oi(n¨Ž:<†D�/ùéMƒ §ØÝôËÉä8Ífg˜¢øCv³?ÇÀ©•Prm* x«ºêÿbF©ý˜ºõ—ó£Úž­¯ZuhcŦW)rqâ–|ÚzÕùöÈ)ómXL0A¡ŒŽ›‰ëÁ”/817Qà`˜ ‡$¨®2ˆDm|óVÓ¯IóxÓGç‘F�ÃNÜû2'Ï^Øz£¸ˆ‰•xhõèœÑ[Q¤á~»†ÅnQ.¿> ÃA-³O´¨ë¸±üi`Œ±†™¼ž “¥`*p²ÆÄPÒüY8œŽõ6F´ž_­[|7ÄÇTäõâW0ýEÍ$JÄ"'9 läÏKqËÜRoû9Æ�~ijÜö±c ˜ÃíìÚŠ‚^ ­[Í7«`Îv=‚À‡XC�s%X¹»–ë"'4ÔÕÓÞà‡Õ³Ö³a'4êè�~ˆsA6ÎdP¸(ìE6à¬4@*�^½Ø-zÐßLF‰&;÷-®1SÖùv¿�TŒÖ‰Þ�n-�HÖì"áz{†)˜uiûyugíÖ4ûŽ{º¬æ©Vï{=ÁÆW@y»¸»=â‹ðŸof‰,¸†Îÿ«"Gr{|ŽI ›2L^íuçá|þÚõyõ�ùÊ ª Y`æé¤‹^\BþÝÍ”<³<ÝjÙÔjB 0”�kÄë‚ „_¶ÞÛÄ­SÙíw…Ù©›1æ¦bT°£I¯~pµ7 ˆŒÚŠñ/êí0‹`Š^?öª‡ÏkZêAsM¤\óWCüº2côäÛ?R‡p¶ÎZûcøn¡±;ætSd}“•ì0Ã;mÚÎpR¨!HVŽBºs!ˆ;V¢Ìübe‡ ô»Ø0°K3•RÕšÚ†ý¬AØ!Ë£eˆžp9W¼ZÙºPªs<6‰Øn¿­cÇ2Æ=,pö §C>\Jǰþœ¶*SµÆÙZ§5:<»9e|p1çö­ýœßÔÆœMh^î �¡CH3'ˆã 7Dè•쩲µÖÃiH6æ²³í7JãÎüXÙ|þ 8�ˆ<Ú[@*s•Û¨ýZ·�ïõ­ü5µþj¿ÁZÚÿ&ªÿ%¨Õ¼¬Íé .Y‡õn¢½º®y15q¿Ãø±‰§½wǹ‡¼…AOø©·W¯ÙRJ‡`ÃØÌléa¼VhéÌ0H93`Òjàhb2�×ц„ø:œ ‡õ÷~c%4¤Î�t=xþ"Ñ Ò¦ˆ–úa»}�Ò^Pù�"Çlᇣ^sÐ3¬Òæ£ÇÐ�&ªJ¤FY_†¤$‹[œƒeq-û`²!ȶÇ'lòbÜš‘¶~CNCžþb¬�!ôªÏi:^hî1®’G'³¥Ñ�sê@¯˜Ã�KP_á4{÷T+íd/¡ Lëô2È^òB€—ÐZÁƒ°ƒn €~Eœ´è¾Ão‹ÖÕ¡Auù³ ì˜7PµqÄHl,ÈÐ~Kâ‡õ¿ÅÈ�wCz¹N&—·ìŸãI´^‰iâ,o¹êjÉ<¶Õýž-+"àl½¾5‡Œwb”;ìšÊ.Ï®‹Â«­Ê¾×ÁŸu-s㘚9PHb6žµÙ,,G÷�n¼ÆTñ#u ´�¥5ÂØgµ¹¢Ó\üí‚p ̼ ­äÈ4áMʼn‚˜>¿Œœ$ ¤}ìáÅ´Ñ(¿s�w Üï–0‹_‘¸×Ïhf©†ÇëÀÇѲI�5qm•.ôx¶�¾¾ÃáæÈFú ðû|.Ú>ï%ýåî jO—¯>4Ë<Ц7uËŸo½1ÅQ’-¤·2oÁý/ªO[\ÅX\“ÕŸš‡Ü �MÁ�õ˜žgÙ-Så\bs¤è5œÄ”äÔçÙ¹CÅa.ßy¸È#l©ƒçÝ=³Ð <—8â"Ö��-ò­³Vs‹8FÝmïƒWê–ÆTõÁùgìÊH!œ#ÖB7pÍ&%QD=í¹ SVK0-ŒJ·Ñ‘pÏ ‡P¯ÁV3£�1v¹Y#sÝÌ�È7Ùµ'¢ø¤š`q `¨t¶LÞ ª™^/½í–÷NE‡œ=Î…ÅŠ0�zÑ1‘Ü×Ù]ë4%sÝo•¬h^CßéúŠÁeÕò¢ Uîmðw·=à©ê�a»VYûëª+ñ¾ym‚ˆÑ„@ØxezV 5=®µ°Ùã_|·#'ôÑí¨ÖtÀ¨V(³Á$8®Îìf ¬r©¥8V…ãõ°‚\9q€Ãd5·)°"øŠ,pk*�oüvƼÔM^¾0!8 ¨“yDSËï,Ø jü—S„Ò‚ é#s*!]7Ñý�vÄ6Sn_VÒÀ]€N}$U»�u ÷]24|áÚµ¤‚»fPôâk…¼‚±néúΪ§%ù¹ÍH&ì‹Úë É.!gI³e CÛFÞ­|“ ž4â&áâ—(šzÒJÕHã›áh¿:¶².çr½Ôs„µ(D�åqŒ6 б–I¬T‰0VF¥\œÇ+ùäœõÒ“w·àf“¹ÔX&~WÒ>Ei…�㦴ïôY2‘Œ[ÿo¢°¤ë`œŸ5ÇÞC£Ë¯–ßá ÷(ypÊ;ˆh^Ù�²¨ã<�X¦ïh¶­�¹RÓÊÅåùÀÎÅ‚wü÷AòÚïూW@;+.u8°èÇe3qTWÏê®%If[òÚKPA?0ST˜$ÁNv„È|óœ^ۆʰ¶oÿ(‚<þ„«sPÈ`t‘[æw”»�Y«d�¾Û,›;\²ñýºrøÁî5w˜‡ V¸ýÄ÷½€Ü{„ÙðØjÇA…ã6r.ê EùÛ¾í¯»_yþÈ­]¨íÄe\…\Á@»8Ç 0&×rÚPs3WXê./{ºvéžS¨+? bUú,Ãå¾Þ­Þs7VÍ·¶¶NO^Ü®Y0Ù ðÉß´a¹åû†àðØ>瘋؈c#±¯b^¼ÕnÄ`æ¡y<Ò—º€˜²öoÁŽoV{-�]r4߈7A=úrê_ãÀf¯ës^noƒz ¯X8­rå z¬špœÏB_‰š‰³£V ê2CH�9♓Ej¼H`ØÙX¬eÀAè¢xãÜóÈáü]�æ÷ý{ì9ÊîDC—{XHx~wÐ�\3îm4\Oõ•PPŒËupMÜ8…# “w½ÂSnuvìcsœ4‰8²†‚i÷–rzØêøP�çv’iq–1÷ ]&Û[bÉ›«rptO|"O¯ìNØZ ;@…À¢ Já4¥¯•¾Âq!£xV¾6Õ‚\¢6gb|HàßhMC‡›o[†wÖÇÓ8š¾g±\¸q8Û¾2—7„°þ#{²§<Ú [‹=<­^K±(äæ�‘–g])*ERȤv–…Mé ·åërŒþókY×>�€´s½ê… v9l�|4¥EKe�&±°kI&¢�S‰}ò{<îôAK$\$V¢1.­ùq®… hF[²|×Üê’šAùmqئRX˜p _˜Å ƒoq†Ùó0„õç“R¬Pªü ¶!{Ð2ë)Š�ð¡vQAa�œ¼A¸oè‘2°ËŒ¥=½#¨,\œˆù1M8ÅœPv½°ºk'qƒQØ´½@�í÷l$ÀEŠünÙÎTò·Z-tEä.fôõŒ�¡õ”ñι rï Á(ù¡ï„ÏC�|h}^ 7°¢ýH€›«Ö%îa¨úÿ+ÆáSìÞÿ<ÕÒ·l‰è_XØ/ÈAÐÁØ œx¢@–PïN¾Ëป ÷(ÑÜAâI±‚¨‹ºcqù°¡4|m`Q€q¤7¯· Éè² §¿IùÄ@.Dpœ¦]X(ÒˆÝXq4§°.þŸÕ0Bˆ‹{uÉa¶Q{ �º@ŠGâ0ª5„«Þ¸§.™`ÕÎGÌ’E· ü ½9‰�Ñ�{ÉŒùDQ±UÉ5ÆÒw3eéÏìž·bB'¿5Ãb‚�iƤôÞé9.´ÛåÒà˜u4‰ Vd… ÀþA¬Ý¶t¢°—D…IíV0P²ªTh³ÍMà+ªÒ¸G²+ !2®ˆ±¼f¨ ²ƒ €µÇVq"`éΙáNìHÖËowì0EÞ£A—�¡�ñnn\�Ò•rÊ_œ5”{°Nßû}ÚvLe?}?½¥Åøw#Çû"öúìûÖ>ªê[L@Áéµõæaå2„èZ@¸†çbßfʯǨÎî¿4ýr£é‚°Q„hù1†[.=�ÖgVy‚‰Ñd‡$à >YÃMÆ+(ßNi¬Aòã  >\O®m¹¹S¹G›x—rЬÙvcnöu m²ªÖàƒ á×”ŒâÙä.rëÜ.b"Ùµ òu—áiÀ¦Šn� âæB¼àö‰AŸmH®Š 9â] 4�j Š0ýõ;€º\ Ô4n¶IK zŽýÉ–´íkØÊÙråkÉ^)"SLsã¶·¤GUj0¬Ã%ÿ]h®�ÃéÎ5}/]·‹F¯E\ÞÓ_·=ãauôýy ôÝ·j|D9ÃÉ~ï°0ðß—ß×£ }.ƽ~_éß+5‡Ñ�pd>Üð:@^,/®¦ò)Û͸?¬¡¾F†ç�ð;¯UÁgs1ØÎwêÒé£[Óùñ³MÖzC¸9%| �Ÿm±n'оUóc›§¡ùä_·Y7ò¶ö2Êå�d¿R=ÒÌKÑE-ms­ryæûƒ–Íu�ÞéÁ¬;s²ByËÖ•µªŠú²gé×1}:°2Û^tœu‰Œ©½GëÛÞO4‰žiÞïÝU×�+gñ·³‘q=÷k›µ`ØÁÛ®¾�|›eüÒx/¥IÏ.‚™M.½œ½Eš›Œ¡¶!è'8^�Å»ÒÉkîK�8Á(Ê®KZWlæôhS©†¼®Eî$6.¡�'/)[c‡Ý ¨<ÜZÚ‡ÆQA©ð°f»N¬b8 †B}‰Ö‚ÖÅÑ/7Ìp)Ÿè–��n«¥ŠEÁS³‚ŒG>™ØÖäüÁ�aAß,CBã3ËÊïOpŒÛ1}i®7¥Å癄D@Ž¤ÏµÕÃq>´¨÷;!xJ·^ÂQ ä5‚-ƒ�’ô�L/pUض0[kiŽ%¼øˆô¨3©VJÞKýŠKM{hRºôPë'íÕ¤o=¶jÈ„5ãÖH;|^°Ð͵ÁÌYÞ­$¡Pµ#VÎúƤ0&×ÀÃçs½£\3ÆYx͉Ir±¡ÊÉ”§:Ž:[{¦†QÄÌÈ…û{\ŒÝ¾È也 æÜ  ß�ÙK_¦Ó˜¾Y‰ÉÌέ΅º8QN íöŽG?X™‹àåÏu™ŒCMïŽÔβ¬'[~u¾k=G\:·/\ mjtkªW[Ù yÇ`ùA³)ÐFí[NÛk•¼†½ã�sò¬¾í èmò›j6¸]”tÍdmòóLùÀŽ!LåOŸ,úÜÙ ¹ßø“\ͼœZîDávdˆ –)¹A‡ Éó$½*pœJ×1ò�ùíþn®Ðý›é,õç¿Ä`(WÃÜéMèø�Õãÿ>}×KKõ‡6z|“…Gozë�ÕÊãÌãÕ©¸¸§‘]zº …ú:k' :^êpB;MfÝþ.ÒMmH þ5u‚ì°fw•›=Õƒ.ýÞS0ªO¾De¬…^0GøƒYZÌ÷‹SÍlë´ªf:æÖf(ª�k.[náx¾0à`¯{r2¥Dä@(†—ô�…bœ“ÉÎEᆱ¹»p˜‚wº@'Zæ›;8¹fëjHÈpÛ[Hó´a å™ìèFX¦9]ÇÀtÞ3ÞCÖä�ªýèÁ_aÆúÀÕ×ÞƒÂØCØ?WorÎ2û#:‰»%�BûAª{Åè$x•§{êweÊ᛹òí\qc­ s¶ h`Nwß&ij�×dK]s·:rTÇ>:�J±˜É6&©Z'&æºÓÉõ8`­ª%‡õ3‹$y.®¡ë ‰Ü6Þ‡¼D”†‹Ž@ôgú#š.WØ«ó]ʸ©ÊÛòaåICˆù,2ùï=Å„±g[§ ÝäêMj¾Ýw花¹eÇÆ^OwÆüÍÙÌ40†Ð°“™[ÂHàN#•7äÍÔ-^ #Ø£\B� À—©im¤æBï<™0ì¹®ÃH›“0-&�å€A†~�¸ç˹n¢sšß^1�Z� �³Œ”¨Ùç=0Ø.ELxgºq1äûW©°•52r2ÕÆðÉóç@_”lØîÀw¶®hVÂá�Ì®R9­Æânü�q¥Ñâ–û”¸º²«‹w”ÛÙŠšÎÞšäÕ†‰�í‘ö…ñƱf·kRz¹uÑ7dnáÉ›êŒ ÎnJª»ñlç±§´ ø.7±v°cÃmðºÄñqSàä í½l·žîYT„²›†Ge®\r]Ïq Pîwù³­ÇÅÎýÉOƒX” ’@ðvHöÆÙ%ùF˜Ã„S_%Œ…Ãt¹4¯Ãí.8,-íá(�0Çú-ަ3Ê`S‹ÝgYªRKœQi|i——6ž•xƒYñ·w”1õÉ®c-�»þ|ÍÏCŒV°ž©ƒÉw8¦�A4=ðšQz&6BÚïù£�8,“�çûƒ¿Ùíà á�'pÞã/×t¾Åæ‰ïªøÎö�£=@¨þ·5‚Oä¤@öøZBf ¶Ú2ÅO†¥æF>ç“;÷¨Êø÷x–ð¤zh0³†�:Fv•!d~UÕøÆ0(bW ´=:¤÷Zœ{ôzVT~§Dztüœ¾ø ž˜ @)ÿø|°ŠÙE4ÉÄÛÙš7—áëŸâÔOrÁYá\0àuUk™UÚX²ù$Çø‘tø£üþ4¾5øúV‘ XÙ ?§zÐãn‘¨›]1úAð‚(m‚Kîÿठè“ö(µJ_¢ÛÒ5Y-g«}%ØÐj¾mP‚u�âM§Ámï—ÊM­º í K|á™+Œ¶Ñ{X9¸¶Ìöø—ˆ'ß .âg­,8£–U«otî’ûë^uÊÐÐ’*­1ç‹1®Ù17ïÁ§Õ:ѨAþ¶E†ö+‘;Y�–lHqÀìâøùÞüÙ©Ò&¬1ûÂh­·céŽ�EKGùEÚa ¡YÎF€P!& ;,÷½z×YvÞr¢XzZt8Ð(2Ù4§ß_pDS– °ÒˆØ¥Iô¹]Έ…·Ì¡ž‹†$ µ�0áxÖkÚ«­Iš9=¨—ô*ˆ1ËXß¡,4@Á«â(7› @Ä6#yR±IÆÉ˜µ¼N í—¢l¦¸g±r Ä0¡Óâ�×$Õ~»�´&ÏÐñFR¡¡øXÖJ“†Ä8óÛ �Šàtü�œu&$ZØŽòØ ¯·zÏ“fYȧ\—œBüÇ—ËÇŠ@pfßtJ�ĨÝ%ÎE{±Í*\°·Õô�Ó IX¿fà÷\I~ØÝà¤7@÷òÊ2±ª••ß.åõ!Ùmh96ZœQ^RË®Ù0Ö)—¸5À�ra?•dqXÙYwðïd”;Û•ƒKÄP««\¬¾”oCñ²̹pŠU@AŒ�Vã�… t�¶ ]FrVRfÄù�1Á„E.aò¼7&K”«™Ágzw´Ì”§�‹Kˆ7GF;f{Íßnª'ûRl‘i6jâ)”sÉLýŠý,Š¿¶ð.Ï"º+¦vÒ帿µŽ>®—Mõl4¼_¬vn–é¤\`֬ػƒÚÑÔT{ïFâBåžI*`sš}Û¼‰Š´ �ì–tÙ_\=ÅÑðQ·[‘æ„jK8ÇnŒ uÁžaQ“›=Ãs Aôt.‘Ñ~­^üiÜl'@í¸¼ !ö4¹vKë6l}³n¾WJ‚Û—)¶Ç;"rÂ,Š…ôòùÈ(Äüâ1e¡8ù�/@Ûï)±?JÖÀµ�Žýk™OB,´Ý©(bçñP…As_u”Ýr—N¤Avh2—)ecØ3ý�{Û)¤Ø‹™’O ¥HÌbͱԂ5dÂ9oUæm‘•ÕÌ"ôPiÀ=�”ÅBX CÙa@\1¬º¸ Èvc`7 ¡œ€†~QU›î|®¯yGÙ�´9âwìbxXðŽ%—&`Õá«Y{õç=wB Ït¹¿[É.a\,©-}‰NŸ²¿wbú y ¯ Ã7£f€%D4ȃ 6N¾Ò¬úW" ì$–$” ;ÞÀªí µê�Zg0œü/*»p"6o�žCÐöýÁ—0'-¨%ì4ùÀÞÛ!}΋Ү X z;åçÂøB‚€°{Eô4ùµ`{ÓKê»kEðß«¬O§=¤QÛ^š’=V62�–¾$jdõ:ÍAä…ÅÁÜLJÚû8$OkRi׊õ`­Ô÷ág«عÌO1‘õýÈJµ3sw\/Í5è•ÍûéÆâ>E‡Ó˜Ù�Z$‘Š“™}b/±ªg“ƒÆË¬�ϥʡo;?GF5·‚ÝÇ>‰³s½XÁøÙÛç^( s$¡ Þ­{|$X.÷Ͻµ%œí™Eü�Îk!-cÜ3jí¿2:ÛÐÀDÈnévÖ«lŠ�.šÖ«êž¿‰ú Ñó"áÃ@àÍïB]Q¾äü!¨û2kÈÞ²K¡t ,f­œ®_gdàÝ.†ÑÌÊ96¬ÐØTÜØlÂúK”d ˼Û>Ó0/:L*ù±ÞN[#W>´š™ë¾Ô:†˜³X„.¿}uàç…i„²sö{4s¼óàì áÌWÎ3Ñ}ÀvщXÀ}¦4‰l’ÐÔ^âô¿—?7Õ ˜ÒvÅø€u¨¾x§ß¹Uõ‹*:Ÿ#ëŠ÷Ü(¾ç…~ ˜! 3üám—ÞäÍ@8[/ÚxÚCƒSU|öuRc·Åºýòš6–÷H§FŠ�g›{Ëfâ×tÈ&3\í>û– `@?¥ŠÅuÏ»w›ë#�€ö¿l �ð£ç8 ü}\�×X[O 86f¶hÊ®ƒ<³–…ð©-ˆ?ÓÆÍ4XS�]Å4ï :¶~R°˜wjÀ¹^ò`rÆ^lNb‚�šæ‚ËqzÒqr— ûèLþNs¡�Ó=€_¥Ô“AŸ%$ÚËh$<�™]-i&=É6µä& âæ½Å@"¶•-ìt÷¥w­Õ­-q€³ª((“²(nÆêa= ©üå~ Â]±´1ÃØ ê)ýy¢U�v‘É‹¤zø¿¿3À¾/úÖµ\)eÙd6„XÖÚ�_–Úê!Ëö¥4îƒè=É´sAåý›òf:Ê�©sß ¤>êm°#Y¢ƒræ!£ÓJ"£ ‡ŠÉ¬·šÎ3kÒã<ã�itaUW²¸°_(ïGÈc÷V¾Ô®¨‡ÒÆó¤MŠÌ’Êb(¤ƒ“)æYˆÆ8Ü–Ò4tÏ•#ø6-o‡'!{öÁ±õ×¼€û ´³ò`|ö Ù�UI€ƒ=$¤ÀîÞ÷Ëñ5fiätm…Š!ˆ>Bà Ú欣²2«XLBâM“Ý!´é%“’Ÿ2òJìGq»‹Ü@ÍÐð7Ï}ùB1óàã-–8ùÖÜÒÙ¥íäÍ$=­Ø#͵™Ä¹ÚÈ/3ùÕŽ� î³g0è�×GÚë9ÒCyÔ_–�½VÙð±ðXdm—üÚZZƒOJíª]µ77Æw…æ| E Èg[©1 އåŒn@Sñ‹%Eýœ*æbz…�Jr¨Ö'ZDÉÕÐÿ]¯�\9©ÆÌŽ0®¦?š:ñÂÛ¸U˜ÌûÛ•‹Â¡­¼!/ÔÞóÝ“–µðŒaI œ‹?ØÑÖÌÑË ¹ÅRÊë¼)`Öïz’Î%„•¥*b T½Ì¶a7/š%ç5WÍl)Óä„Éæö+tv‘.§7ê{¸‹-øÒœÅÃl€Ò§+\ä2«º;À/ò’õÀ| �–§ˆf·9Lëì4�Öcy3½íp€5aÊ“p>¥yý?µàø; ä¹�å [P/›�=Þ*ùø…Ï?½’¼ù°�7oêüÿËÀ˜ Ûº>M¾¿44»¹Lø�¬CÞga}Æ-xX{õa$RúÔ�ƒÃ&ÆÞÔ Ìí±�\ð‚\`G= À+¨s&ïÏaÑ‹?Ö -ôWÖhKô“¯h³ÂFu“Û¿‹¡ò¶ßÖÀã/Yh €Þt Š©³‘]Â×µÚÏ3¸S2wÖÑ7<ÔøÜz"?ÈÀ`¯ˆ~"ÐQ¬ñ&ìùä|éåá„ØEÍÿ¯öøŒÈ©Ø `V³° Õž(.ëðç]­AÁ·Öö= QŸ)Ñ¡½=ô¸f¹]ž§viL>²V¶ÕäQ´´ƒ‘ØÀ$xö—wÙ\G{CœfÀàô‹–ñ¸ ô7_‘@Á­:KM=ÊÖ²´ôzÞÄkxHîïm°ía�‡Ã‰ÉʤÌþ_²�{¹ëw-HH¶ƒ;{ñHkÆÕÆb=–«‡G—hJ!ÁØCÚjø‚* 6‘‰…‘þ¹µ¿Š ,Ô/Kð§-öšD·ÜP)jà/ø€í,B– ªžÈuÀÊHÑ;rÎ ø·!6¸çç/ ó>Q›CÔ+ÀF­ª æ)÷e�DêÁi=�"Í«�˜p¤|ž Û½/)1¨L¸v?´Ul^¢a1”.å¹¾Ž_—–ĽêQÇ/€¶8açÑ}°J ÷§˜Ì5ÅHFåµðÍ­Ú�ÖˆÕŽæ›ñímy!öfÂ÷ƒYöÓ¾b: -ªªÂŽŽ¥-Å«ÎVqÚ»\ eœduŒƒ�0øË ²C;ì.ÞŒF.Ûηeí�RˆT×6Ò¡¶ìí(}m çBlzíé`/¼b]â\�?%@ƒþ÷á fDÛ ¾)8®wª ÇNM@ÚN:‰-Ûc¶µÃáŒ{¼2PlŸ& ³;ǯš§‰.ýå¼âû2À _•…GzNl—eY…5—kH&sEÛ0˜£ é1ƒ;•³j€âªT1O°å±JzÙòÄ ìÜò_�|Ëà(Á6@ ¥¶OŒ·Ò,Ác�BX*åc#XG¼²hCA›%ffÀ¤>çéܪKÝ`,ŠZRÐë@~r’HSS+‘Ì�%×¢“‘¸7#‰ž†\>;�|¸ÇÓ°êö.‘jÔæœd]«®ÿžà+Ýiß‚CYÆutE�à��FN�H…¥sJì÷ü7Íê‚K7²eâľÎf8ËG€»ç{]þûˆß7êM…œaP”w¡ñžé¥r7@ñT‚Ø>Ç,ùI ³óîtøÑ›Û_†)¾Ó)' îT½FqïpP™: Å»Öo7±ÈJ“îô¼ã�;>:»õ¤»×ãÞ }Þ/ Ù>jv-®ì$Ý ‚D“IÓß„œj^kMè¡�Ûº;6†¢î¯½Äjô›ÁÕCp~�ú0æ±Ãc2´ 6½é•)'9¯mÕœooi†µÔ¬éX÷Î×RávÐ }{’Á¡zêé—RaÍ$D¶] jDmYåËv\Ò[—�û×–·¯»ù€ã�#€¦¶hÉËŠ{m§ë@·š›öYEíJÄ®9¤ìÖCV•Éâás„fÁ%ÔP �+ÒØ¶?Æÿ9�>D’£.WTd0Ʀ­jyÚµŒ:œM†cd>˜±&CmºÓïÄ®EÄ-PlÒgwñôÊÛ8N‹×ÇÑ ÆLñ±å²&z;G#ÁçØ"»¿îà’Í${}ûìP�êmœX( €Õ�÷|è—øyuˆpå ^ %  k e�2½#[aO{ð/ÛKíRvÈÿ×÷ÿ»ý­µZÚßmU6ÿÙ­«ý¶«WÕ¶`À0o»ãGåš�ŠqGüͳˆ�yŒE¿1o ßiãT'Ðêð,çmZUͪJ4&S7sj%c„êóŠ?•ç¦Â�ºD ð:]ØoNVå MK' ëZÞ3Ÿ¢€ä šž¹r�n¬š§â:²aÅ¿q${]:ñpEánö¼ |†Ènü\œQÝ›’ÍbÁÈ-{?1³ƒªñO$txÚd@¹À«ÙmÙÈ’et›.§Õ’Äè‰"zLˆžÈ„Gh .E‡ˆŽýBxA‘ éFÙG”2ºÚBœ¯RÝÖ(˜–%‘-búåà O9W¢ ‘éÑë¤K¶�g!ô¾ÎZ»�cc9L b)ħîö!ÍÈÔ!'“>*tjºp<:Òì³X°sá¯UèïªÄ8,囓+n\6NÝuDÃ$Iàܳ�‘d& Ëòý t@–Ô&eæ»�ñe8çÇ‘íÔ¯@¹`ÀØãŠo\ömͨyÅï6TýŒ*'b§_y…*Õª>òÅ%@ñîœZçéåm×2n/_†§aÒ7¥› k!�:NÔþLSÏR²d…aq‘&ç, ‡›ns%i05*Àüú¢r¯¸+!Ïï©õ„”� ‡ÑDÚ¾j!Ãꕯñf's¯SãX+bÛTñ?´?%¶Å¤Ÿ1Þ ë… »Û]@þ´¶36–ÐÝ¡‚m=Æy¡&ùËLuw´ÿP| ðt­Ó+wèèöµà׿x~³IÍxû>1ϋٶäH™�Vuoà€þ€ï.™LÕ'�Z†~$š€xà ¦Ké¹xþ §•0`@Æ’w¦PÛ6y¶+^wpÁ¡…ë c,ÒãÆ™Üš>[xΧ”’T©*3Úµ˜Ÿ†ÞE{¿�ˆ=Ó{æÄÔüïéS*C�¹¸p‰¦àåŒ^-V“±>ÝzP‰¬Æïš¼ð˜æûÀ {ËvÎS°ÊÀ2\_î¹ï†b+Ç“c·ý¢nŒÄ,¢«i÷}ê`™Ôìì׳Û5õ±`„oÝ\8QìôzóXžòýÔ0 /§·GÅø:�ŒªÚÅÉó®omdêÇÿU•qºÓˆ0¹�‚/fÀµ(È^œH™c_T·76\YB*J®Pœ.ŠÝç(‡o¢�Òüˆm8“}�_ÖdhŠAk1ƒÙÞŒNÄc¿mÍ-í°¯4�Ñ–á�¿œŠ%ݵg¦¦â DÀS7´ Õ$nµQ˃ ;KUg+t„LE„gœ,N8Ó``ÖQjÔSös™NÌqz6 ð[ÛZ!€’%…õî¤ã€§ßT <ˆ‹Ì–ùPþ_QàºþÚw7½·çö¿Xõ��ºu@ì‡eл©‚eñ³ ÎË-îw›röX„g´«­F—‚ ü©õ2aýý ï^õ`QA¦ :\�6 ÒC#�Ø¡W T›¦Äf›àßCuƒ½ãVò“à»Ë¾ú9®'Ž*íqæñ6/¬”‡_нÁCîú@ ×íÞ]ÓoŽ à¶$úËÉh¦<'èІå¿0UN¬%xÀï˜ízK%žî¬³ÀüyÙd†›«á99ù"·K²˜2„¾UÝȽäMv­N÷L[À–#ræÐÆF²¸µù®¶ú4ôµ‹ß ÀÌB4ò¢šX¹kª(½œ€[,8†l³é-Mpíí¤áL}‰h¶q¨©Ò 6í» «1”'ã?k"Ñt}á,rÐ2­§@»ý70·1ÝÛѯqé ÷.|2½¹tê½ý½u±,ÉGÑ<ý¿U’C‰+”û7 ­iùNn¶{õV¤y®¡SAr›mGÓ}öëÂx‘L�U5£¹ùÑg d.ù®œ‘0ÿ ƒðS^wxÝÿ¡FÃü"VÒ ƒË-÷—ÒRÛ ?Ôõ»ŒHXÐc•‰Csgæ¶~¯ôÔYïý˜3ï�Áo×ÿÔ1Ð9—áP‚wí÷Lþ¿®®Sð»Äák«Þ-™‹çæç ÌÍo³Œ°ÞýJ†²©ÊÌ8¾\L:ÚãJÓ­1¾V˜ ic€m3€¤¥*™áó—_€ø)=ì=É;>÷_ØÌ±WûTØ»ÿ=DÌÑjcׯ÷"ç箳oÏÔ3334‰÷tó\¡úx~þÏrt¯¿�õÜǯ55ÞF�Ïù*‹m¿zZã‹==Á*[�›@`n:�A]fȤb`Ä 9ÒUJþ€;[\cþ\’$ã9›4�7U,sV7Ø¥Ó]ÕRýDÌ55.}Ž=Ì—/k’¤®ŒÉ«ø4&b» Ú †súÓ'+×Ú�ûaÿ•î¦8{îeï6ë¢ì^,Í�Ø>¸?ÉvùþÏöŠøªÄuø†4´Ëb^ŸºôÛxR]úRØU» yf¿Ã§ÊsÒƒ€óEªNjkx „™Ù�eÎÑgŽüYXÎþÞ8“æ|Dc§³ß±kS§ž˜±;7§½ž[3{»²–™‹¤ÎÏ�»UFwå â®VOEäƒFk鲃èÍwÝuqqŒœæáªðxˆ� ;˜æK>}Ï´º§åíQ¹R!1 P,5V ¢‚Ú²áØ%ñ±L¯)ÃÏ ‚ÓuTÉ`Ì›Üðt÷úAm€Ÿàä(}­÷“eÌÌ>åµ:ýÍÅñº7էɱÖ ‡DO;Âê6fK™µ¹l N¨4\{d4öߢÛä+Fkc@·šêç�ÂAz0ßi»‡e»Éo>Ô®sõJ´’Ÿ&)!¸½¸qä7bØ;†U¼Uà�m^�ïá¶ÔêÖLÅ1¥ ‚ñÖr©pæ÷<oCmy�–7Ñóß¡pqô±ñ˜öÕÝtï5‡çYRр‡˜Ä=¯¢ôO{Ï™µå‰E´.Žã×D/µ;Ä�‚çÔ¼u8óbã¤=Î1ªÝ¾ê���Û§ú;ªòðŠá�5ûAŒì%ïiÕžd4õÐ*àHÞG]ßi€Œ½Ÿ1Wsö5§Y%Ýâ؛cº�òÈ‹CÇbKZHñ¶W ƒ‡]93eé”p-ñÈÜ)¹ ÁÒŸ†ÈµKõ²©© #,Óû^ö´X2û98 ƒîS…Üü-™…�Å­ß?Ö/­÷€Ìq%‡ÜMÞ�ËêûîùÂÕÛ«H�ÖÚe€çIC ýðÓ-eÔPûæ¥ÉÌ\ì /ŽwC:Y´×-1ÊÐÍKkÚ|eK¶� ½±Ê†«¹�,—5Ö?´€\OåÞåâ3 D4²ý:·µšn>¬‹bº*÷ºèn5#m ˜AuLn�ÞíA÷¿s!¾ð2Ljó{g*Ä žFZ䤳ˆ\“Œ»©Sôò�Ë;&]]ê;ƒÍïÇÍû`ÖÕ ´xã>Í·+�0”“^/Ô½²ÐŒ˜CÀ` � ®¶+ D[y~ŒÚëÒï)��`­¯g§À03*Ù;Hã»ß\)ã€óX¼�¯8áZWh#•ê±Ç-zÅØÄ^åÄ…ÅèV@[§GZXj¹Ó»„ÁÒ&Ehb�ëº'Q 9é†ÍÌUÆÈKa»5ÄÎÛ€N/Yܰi&³´žÀq8*"‡ÍÊ^ Á‰ç1±£.úõªÇcL*Hñ8¤ÒÁ8·¶>Âþ¶þ,dÆ–‡Ý|î뵯†P”sW×1cKÕ½k+wfdԛņÍk¶aldÚïO[)‡,y�²ìÇهꊩàdøØ'âªJ2µ´”Ë®t¶yK;£+ii£zDP”ÀêÂ$�—Õƒ¢Ð0õt{ŒžnUzÜë{žÂéÙÌ&ni<×r 5²-n1¦¸Ã‘¤ÂÏ™ª Ýû�®M4ÙöüûZkîéå?øÒ¦ÿu„“³33À Íèf¿ƒðÐøúÚ,uöÑë$Ø|—+~Þ‹Fü•\j`îÈÐ+È�sgHQül0‘ª,a ô[e,’;²{ñ{îPµô5ÍùÔG:ÿ†fÈ`Á˜rn]’Sf±$f2*W'–ƒiï1›¼‹tiÝ&wºŸ·{Ù€“oE�w/ØÇ’\&1ùS%L˜+Qá1…-æˆ|\].Håf/{ Ì%’yµ³¤G&uW¾”�39 /’èkÛöòL _Þ.àý#â’^›ä'?>‰f"Ý{^]ë> å‹€U÷Ýæ±ÚiUõþª>CïàoÇô÷—¸·[JßdpKno Ó*j1¹PX¼ˆ8hÏA´�éû<½ÜÕUê«´—å¬vÛ2û˜]¥,J…ËÁ'—Šo}`‘ñ×Ý;¾qA»hA¬øïÅúÃpœ)S^~C[†²R"ÇÛVÐÝÍrÜ€û0��,àç3÷¡ßcñÀùü•¹ÂžjÄ2Zò°îïŠxúà˜“Ø?ÕŽ¬­‡„Ro7ã8sÑa+,êáÐ$#kÍ›f‰0ãšk(I"*“oE—µþ®?× FÄî)Å 3‹fýÅ(ˆ @ÆYó<;G©…‡ôw*éãÑ­F;úwz*ýšËxWÉwŒj%Aõà! eHˆ Ab÷�P•dÀtkëûnîkì&ÏPÉΧذça|³½êËŒVaCîÄìGÕ>çîa¹v-ZÉ\àƒíš/ Ö lg�äÀu²–éë{ç¡é¦Ç¥?d�Vb®dšÐ^¸¬Ï´Ñ6DÍì5ïu¾RUà~žµÙ$ Eñ`6Ù0}’J¶, ~sIåSMäb²t6ˆôàðÁc;7• HVÙëÌüªìÒL>Áû|é88™áÏöØš±µ…Ô©ðŠò˜µaaqôûï\t3EGQC<‡AA±¬tO�øð.— lÆ¿‹ø±—bÑ‚éñPÛ<Ò•ý6«Õl ë÷ÍÔ¹C‹GB¾¸ jhÇ  œÊ«›>ÖürBsÜÆ3·Ðz®ÿ°|{)æÆÄ/†ýxk�ýK "B°¸? ÖÏ3ËcP×7ƒéŽ“ûH£ÉÜñ;n\ᦰ‹ût×6š{h#ñb<ø¬ñ�¥á±| Å¡B€À‡Ãe´�MOÜ ”A'Çòúwj¬o+ËX2/m58N/bÙÞç¹p¬wŸø“ÅÎm<�¶·­ ÉøuϽùÎîeôÍ:¢[ Fý,mV¯—\É¢ùš>ð «|•R6û…wSë ?–œ@´y;u߸M¼þÂ8{“}sµk¢¸µ2JLy›l×J†Ð‚é‘X´7I™ÄܹŠAÕ©ÞålêÉV§-L+X…bÄLÝK�êFÀv®—ž¦sµ „f{6±k‡T�tëÝ3?5åÐ'; µˆdÏ!âd¥üÝ:v6 Ñ(Z‰¡LIïV[Õë¸Wâäân»[„JÜ"Œ­nù \]ߎ¬c“¸»ÊaÁtÊSc  ðVDªš6ã#’Nl³Ñ{,J(£fÝ›1Ô™ý×sWÓ'²Ð9ù¦Ë*ÌeÃx"dXH˜dœ/\RUàØìÏd”µ×# ¶r\ºrãÏ.dÂÑRýt\óß1Ëû9Þ”²T‡ðò寮8áo¬¬Ï>eç�öV„%�ó�‡~m Ih jÀn~Uh4×^Â{�+ŸîÚ4žïæÏ^Pïøk‰×¸oz¶³a=½�[¼Žy«žÉÄ€àÁ7f‡ß@÷ïÀÉå1<ü½Ú9KW"˜y3¤eKvcØ‚%׳D½ªI÷UõÑ”MôúÉF×|ÑïOæOº Zûe·ߎXÐ2otÌD”÷»~ÔÎE�>Ín>rªÑ–ýѯ_6ì}v<šxlç~cÖZoÎΑßEAÊ3§ÅhB͹I§³ î’gAxèã"7-wAÙUGÆZ®ª…m¸é J+M9—(Ç” p4Ç2¼ÈPE}õç’} V쪘<Å�uãØ7ëu¹cç(¹8Ëqç`‡€¸¼\ñR˜×P�á%º·e(§Ws½âc ±Á�ôOK`5@ØÞ Ç‹BA^rÁwgÅÆP`yœÎÈã”M¼¼’ïV¾èÆ*C¢ òkÌn€XQÄãV Éó’½ä휅p0…ϲêÚß1!—Ä¿ûè¹máSVßÓŠO§�놰Oékº Ž1yåÞ©Þ,Dzquð.¿`6îû]¨¤—¯·[ÿo!Œ†ámгs¸�OÛ£Øñ]ÛÃÔ�¥‰ñÈ�¼)ü¿™r¶JÕ.µù©;¯ ¹ ¸ÝŸ�Æ$ÇÊ�ÚR�É|݃å %ò$óhè;a¶3öQ 5°¬‘Gß½Æ7m¼Ðqý£¹�ù>Ÿk—‰ì5]ËhP‰<‡uW$[ úµ6lãÁî­ŒCJjƒs—2‹ˆ*ØÛÞη', ;[98+‹}õâõ7;¥?¡2 æÈçzm q›WbœX­‰÷ƒ­ö45y»#¡B’„“ÅfJŽI´ M[áË0¤³ü”ç Ð[T–0#AÃÖ�È#9ȃt«JÃèt±«”î�Üêþ&ž–,-æpÛ Í`%èÁÂQÊ|0pÊg%ÐJY›Õ¦¦ù+oàÛ„].Ò|S`(�‹vÖ½jXž°!]² ¯ wÜ'—Z(¦ÆWŽ?ioÈT�{Û½‡*Á›=klvÕ–ÂÏCFk›+ŸÝäÜÜÕX¯¼·@FÚ~cÞº”ôL çrº®PRú\Ç‚•�žÚ“ò-Ú/akÕÄhçl æ�Á ¶ß+ôC­ùÜï«�m=+ùšïw.Ç<$H@z¸“~&?]Ô Îõ¿tÊü·”1šlÄï�64Mbbùڛ׬ƒ«=w©okŠÜZ«¾ß]êþû>³N³ÔüyŶ®MmN EZø¸S·}’q îNém?ŸtêIèD�ô 2;›×Kiò©û°Ýí§™Åßñè¡Ñ´l0ƒ²áh[ö§¤¤]ÇCͳ°›ÙòÓ£¨¹¹¤ì#$s_V3Iôd§Œx]GmôECßÄ69áÑUÕu•v& ž‚ø’ÏlPLý¶¹�„ÃÅ»3øJÞÚÙ3”'a4ÈYc 2œd=^±íÛ&]K¢ŒWØ¿H»‹N;zék‰_‚¡M©éQ$:@p ×77À:͉/õN)šá#†ò0pÊ’=U¢ùñõí³3é³ÏÊÊ¥ Z¬oö&1‚D®3Ž�$虣¡††^jƒ•„~«\ W¼´A] þ˘àQŽ Z‡ª¿½z*œWÙ“p×Ê�Ê ¤RøøÍõñ¹ð¦Ù; ™AkÓž]Eß_˜Io\~톆mÛLߎD¦�AíYu`A®�R.oDš£Œ£2bJÿcV¼¢¸Ï…2jŠMbyŽQä$è·|³½g4·#bµhlB6ˆ¢$ÑÕ‰Ñ39K#�³/yæ³ìà':š8U\¨/ÂYV½÷eÔæh>kìò£œuÞ‚åQµwuWòÃrå”ÞÏbE•])˜¦ßÕㄱsgmõœ9÷À^¿~ép›OÏdÕ^¸â§îËwÂ;„(Èa Z¢ –惜Ûú«u,팰5ÜåæÒ—½}¿Þ$è6™l¥Ä0\Ya116»8æ½1×r0³*I$ó† m÷›×¯¢Ãìøfa´­«ìµIVÑî~np`)ôGÛ‡VÆá�nÚl«©Ü&áܯVUqÆ\È#�›@ppˆ²ë  ôg}¶‹K îQ¤( ¿/°š¬FÍF"›ó-‡ÁÔaTîSÄTMˆPˆ!QBÙtikaõòö4 ]½=Íy;ySÝvSQ¿ïzC çæú6¬ó]ïÇ»¡Ù ÀGtÙr±’–zà&«ÜVN‘…’ƒœ«P?Û�þC­¸…Í™eç«òvAm�h}¥òŸ°¿¶žnŹŒ0:ðŒ¨O¾¼ìEW¡²aoš�åõV@ÔÛËòQ­ ØrFãZu¼nù‘!ßDÆ/`ð1ô H´ïkµV½€ƒ‘È<[†VGâJ5Áƒâh™¸Èû>σpÐ9=›)†1<7aOç>2yIí[óï4ärÊåVgDü¦ÖP\ïµhŶ?EbÓwØ:ÃÄ@© t¢?4\6H5”›6ªú­é, ÚšI.RHã¥kó.F/FâymBÛÝÇE¶ E|†]MAÌþ²k àc×É×­¼QDZ³ä˜ÆUÙŒ‹6~d1+¼fuíÝÐ=.ÿ´ú°Û±þ.§žàϡ½H‰Š {îg—åÓC`àqM&Ä÷¤óÍ6êÔ �Û7¨²hE6÷>© ‹|Ì õ§ª‰ŽÒÔMûÞÐ |˧y,-·‹¦¤ ;z§`Kãa_h ”B¸ýƱc׌‡»˜M¢æòÔ_²¡‘ÝÜús²¯@^ø,ï|Z«¯ø*3'ªÅÊÈÛ×BË6!n”íõ£0M“㎠”¿â{9ÉÞ)§¦°ûÑhœ±[²ŒlΜŸmM|ñÐÅ[Å Ïâ†o]úÖ�µ�\¨úí^©”êÐGÛ_’ë•úÐpOô1Lù &ï²Õ¾‚Ko%Y2Nâßc‚*¿B&ƒ\nN'Ö)øô? ­¢Šj×Y/§Áá²VwªÍ§4?©ˆ³j}‹µU3lR‡æqäÅýÁöÐ +oøÓ`ÕÎä�¬D±è>­k Ã�1_GüúM˜+뙾Á°dx$"lm¹cÕ2rÛ�Ê»\E0`Ôs¨Ábj&Þ/�ÏÚöEèéûš6¬H·dgïp9»ó·乿:P8!z·¢çWIæH�¨Äx7î¹?¬ìÚ2Þ“óËï:ÔÔNbA Ø,}~0é'm´NN7#ÜQ†œ1 ?V�¾cH.‹‡Þ®¡<ZRñ�åe¦·ÕärÝí‹Ff3¢´•<³-ïd ons-„ú›�Éè0}žÆ�Uºl5ŠGF`²ŽRèv^8žì(–.±�Õ¬ÓŽ�!ª†Dij$�¼!32o©ûbßjHÁÙÌs*�åÄv �lgmŽi(»·¯Š¥õÎb‘ä0Gœbý5ÐjBïalÿp½u­KË;´Üå`þaÊä Ðdc6PÔ™9ÓŽ-8ÞëTt¹IÆ"p9ƒh�FGZ˜ ÕçÂM¬Í+Aü³?DG1nî uÍÃÆÁèóäe¹¥ý3ËëƒÊq�Ð4¹z`}ý=PPÌ …-�7 �Á¨… §/E¹Å^¸1œó3ô ùéÂ÷+ßÌYå’®›+ùΪ�X6±Œo4^9VZ¨»Æ¤¤o«d9€=BÕa,y˧ã k¹ØFì@Jñ[—€Ë‚�ÝÆ®Ã~Uð#¤9æ9µU+2úm€H“ü]>¼äÈ)H—ù Z›93õgX¼6æ–âãŸcaÍ•v€VÜ®Qꚯ(Ȥ´o…»‡.ýƒF؆wc8�%Þ4#ëHâ»N,[rà̘½o¹ ¯Úà�ÞÃ7(.kxéÛmš Ñ‹‚ ²g­²öÒV·T*€@ÐÛ>Ý/Íp¶#Kž‘þ{áSv¡KsÒ;ÑÄa›XE(}ChÆHxÖ“ö3r"Z¬âš/—5œ]B:NŠŠáÙa¡ ÊjÂM"GéK¥¬êõ|Ægy¤ˆ(†WYlެݾ·Ý%¦©É ¶ 2p˜á&ð·Zß:Ëaæÿp 3ÊÛ‚+A+–žtj$“—Íg” ¹‘H;\.ZF_aj �"¨·Þo‰CK$ú¶PQ­QÛ$v¹Ú¥ž÷Ç^¶W‰Ã�?×xÕØe†åBü’Z¾óD%}4”± œŠ’.‘™ß –é[ªb˜QÈöÙË.²… Ýh›2Òû Ì;÷tÚÐC#½°’&�ï·€OžÒp=CnNiÂÑEk¶‰,@¿ùºb>ÖÄ}oÙq¶Í,S€e€ÝF¬ˆ9€5S3†«÷öÏZÊ Q8bOÝÁ÷r|¥zàŽ9Jx!{–ÃvޱEªv¥‘+«\õTÅGp°CŒrìª8\þ{�SÖz? ê¨Â‚ˬ[öè—Þ'}ãhyg†yÖõZGƒÌPrùÍÒÒʾå#:s0†dbê¡h]:_ o’'Ì-qôäÙ_mfçû$70–{e]n%añ<Ù Ÿ§ƒ±Å ä¨��; ß}ò�•«o⯦Zí zˈ÷𳤠¢ž>ɱmâ”1ñ>K¨¸âìRÖýôÅÆ˜³bFÍHó84'L¢ÞôÆ“­§Ž(0uSqœV0`Y&›õD£�•ÂjzaK¾Æ±ù$rÇÛ—¨Æc=œXøÔé‹ëOw³w‘ØÆ\_ßO¬#«&¾4E½PJ�ZÀïÀ¯ÑÔšl ƒ 0 š'òò› y°±[ñüêkæ€Ö¸†2麩9ʯG^KÝ‘»Ít 7N¦b€n_†Æ¥…e+Y[ÖVJK–C›Ú7€yÃa,ÛËþVVä©Ú °W̨9£aØ-3µœ×$�’œûOy[ÛŽ^0Çʌ͗cÑ1Þ ‘O�af�`¶+ëH„ ÿwÊGBïúç6 ]3B´ž“Ö­¯²¶u]Ìæ§Q„Ù0µ6Xï5‚Zµ&o³~�3£°>©ñ¸f–o£×*cà tØ'æ¶@“Mð„,›rØK^d l= I\žY9x6Ó¬|�àÕ•ûæÜÞÓï°ž0œÓ—²_½ï {x"àó¾Ò9…‹váÕ;ïži±Åä‘_Û=••¾,¢ÓÂ`’+Œy/W\舯RÏïc.o—´"%ýssà4°<"Y–JBÙÃ��J¥ï·¤LoQ’û•¹N�S ÙàuÝì¡“_{maà$éý,hì`ÓÝ{ϧ²ïo†{ZF}¶ÖÙÖt‡Xpëè�ôXwÃMIŒddã¿$†‰'™$ª?[ÔÚóµÊu»ìæø°jªPjPÂd÷…Ðèá!êõŸ.s¸>gœŽ×',Œí~£ÞÇ´­OJ•Ôîor"6Ì5£âØï±èë^Ó÷¼+Õp/¾[>låÎ׺¿Vˆ·GjÑš"w�|[F»cË�ò¬¢9»E¿NKŒùV]jÈâ±Þ3.a´rÀ«ä�SêÞPz�æ&Ãú!‡»Rðè-Ãbƒ|žBñÇݦ°0ø¯žD{®8è±êåcO†;u‚5œÄBQt×rinÝ> «¿7¬W�¶p »jPU°e,oèm!¹�ÍÖ›#™‘{€�ŒÕ¿ŠÖ…’²º­¿Œ8Eq}óœcL9xbí”yÑØ6G>P¦y6à6r‹këU-ôò×ͺLÂÐa¦’e/.ZÙnÜÇÆ‘›[4Ø8�mËwœµ•”÷ÉSö¼½­m6£ã t"x+ÝëùoÚB,2û8Xi ]sÃë8†ê5.WD_Ùøê³xÉiCÙ�7°Çmâ®ä,ÇJ¿ƒ÷ïÒ7¡Ê¿œÝ9{�;õF¢;rìßZÂäxçfvнÕÞqr´QS7Hõk+,©By˜ÎÑ!«dJ!ÏS\‚øê€I o.ºH�s{UÖÅ׺Y7„)Šß™øX4-tº rx-Árîl™½-Á„H2šçÂ3 öVg¨Ÿd‹ûZÃ1*é† XÉf¥Œ&¨-Bq§�¸ð‹à‡-b×CßSŽÈö¨í {zV²ÓD6Qø€ˆÌ¬Æ“ ‘z¦¡;-sÅû¬d�Š�\`ÜðXX††DÎ`¹’ˆDI±C‰MBŽÈÙY‡$I>r…ÈÉÂp›ä›’ #ÁusÉè�Ô„7òmÈð¢Ã“Å�ÉgàL@’Ù ˆÛˆÉlE‹5Û€‹opã$6k–ú¼SÀžÈÜòYœ€Ô8=—:òÏ“å1Öù5m–Å,Ÿe% ˆ/d2[D⪣VqñY¶«áãKËî>·�ï]äGÊ2öQ{‡ÆÎ¸A»×Ê`d¾�Û܉аUËMŒ†;<åÞä¤MÕ�Ó9�R‚‹üêâ’ÈtKà¦7!£.ÔY”îŠÎà¬åHì`­ã!•9; ­e¥[MœhÔéãáÃe¥‹¬ø1˜ G‚@ÀÚá@÷)`Cø~�û¯Í­¸e”¨®ý¼Ü@Ws #Ç]ãó¸kmªäf`‹ì€úPì�c#àÒ(-í)¥6á2¡ ²6už²—çö ¿6D.o?Öîý~®M­<óö¶rî�Ü•Y P°ï€”�&‚ TÉ@›2 |(>fÊcìêò¨¿—�•b« ‹³:g<›bãÉ�kVk ‹9Jl.x¶,‚ÆŒsỳзÑ &dÛ-Xþ°c·\é¨9L›=~ùú`åX"”ƒ�&kIš�^Þœ..l£ÙÃ7Þ÷Ï‘c~³ãàõÞ„EÚí°$†´BóÙoí¬z%ƒÒ mÞÌNa­“¯3›ÅÂ÷ûºm¡fòâñ#‘‹b/�‡+|šW®žú W“ÄÉyûäé �…mt¬B�*æÅP"br«Ò%àq1ÛòlîxÃ<€Œcœ8Ò— Û>Xª?¬Bmd:Æ›®RÁ¡û}h‘–²½‰µ¤==õo�â³IwÛª‡Ï;Íü ‹Õ¬dA0¶’WÙ¡S�Ó†nt­v+fG‘ÝPôñnrZö}òxÓ�þC¯“/Õ¸)̼š~³_ÅÒÓP?Èx.Stíob.ÚÌs ËVèo!8mÐÆ€·Ò¨sv-l®™P«Ùo›2°ˆÓ¨¼Á7˜ø ºÝÖŒ¯Å¥×ÀmÁ÷ ÂÔñ´È&véþÍs…�Í·ƒ8í(Z'‚þ^¬DwÑ58H"ƒâÓYÎÒá©<§´çæKªœ†2\äEÀYM÷ vê­8ÑŽØ‘J+?b!ÎvXÏT�!“bÚµ'¯ û˜‰-fÚèþÀ³T„9x0 =ƒÖ}üQ¹7 ­cK6aÐØ›P_“º XtÙ *Úƒè­i÷o©~ák3çùµ…à(“õÇ­v@=y;Ú…¤äàqOhæm€H9kíÇ€Ÿ‰òJ *[oO­é ÂR³m0\Ü’³ |m1Ùw�“9¥Æá°Ã9ìKå֭߬ç?Åæ· ÿ}á2uº�—±/ÒLQ­Ò¯³{y€R‡èºƒ7:Mô¿œÁÜ3\^j±!‹¨qÙØm“fKIó«žoÁi¬«<Ãï+¸iï/ǬGåÌ0rAI�wV‡} Z|Ü]ô'p€ªß‡m]¨bű®4O·¾^Ž=”-Û…ñ…qFž[V) K¶Wpß!çè%R…RÈlzœfì#·@í�”#(&~Ÿ›p,€]]ŠÙ_ ­pËi¾Qk2y®üƒÂÖMœ±hW aKÏ^'0�Ú†°)¬¿�iªÛÉâ1m‘œ´7m·¬˜‹¼àÛöÒ°B�1OgßD¥-†Pµï& (߉ «ãÙâà…¦¦^M²Ó£÷›Ö›ÃóòåupõÂ’Èüóûð“WÙ3X¤r GÀm �»­(Ãö{ð+×å«ÉS©Å›ÊT&ɤÚÁZ^YVÞÄŠ„³‚ºxï°;gREÌ3!b;‘è‰vAÆÑ†ÇøR½(°v{²PñöÈNv°-lT&ŽÀL\éŠü>°QvÝNö—‚Ùã5>ò_u;Ž%çV�ßI>KPH� œ;Qlà|d?°ûÎÂ)ƾ‡ÄUÉ­ƒJD2WºD5i²ÌØ Ãð7h¬[ÄeûȆž²š¿ Z-+[4ó½î‡eÀ€Åà8v¦yO¸$QÏ0š5‡ûTö\†V Ó,Çß)•cÊoÖ5msM°x¸od¼‚Ó¼@p&''næÞ5øŸcg Xm†U8#â6¶â/Ãn&z{º!;GÈKÊè«ç)VÏð ™nãxk�4y™ôž”·lu·kHrüIp“Ê„ [&mn%g xóV“L!Rø|ÎåÍJø&´‚aIÞ=‹˜2îÐ/fG t¤G¥úÁX��íç0D£¢l…Êø$ÃóožÃ£ãbþr�¡â¾{œoš ÌÙîj “r_àýûô^åh/PÊð&]FçE(¤Â($±3ä\Þö>½Œq„�³8ƒ9 :ç<¬ÓÜëÍV±’(^·dËn¢â(ø–¥Õ#Ž6 ){CžÁþÎR®(›.þÑä*ï¶çHÿ$†xZ6úùò÷DïôÌLëa”ÐÈ2ýúÐHˆá Üç%á§Ë™Û„I$é™·¦-ÓöM[ʤ¶Ö†„†‰ô%‹¬ |Äí\9 2ù¸g!ý& ZO˨µ­i®³`0 1xÚ[ž…4T'ÅÆè6" e­&#›j�û‡«0[zý@g²3«ÔJö†#£É‡�ZO{¾EèÁ™»´àëÚŠL99FòQ¬½ ÕD»ùú¼ž¶¼Ã‰G_µöé:­ '5ˆ«°�ÉF¯s1A%FWè�áÔÄ%/m]žª¹>á'“5Ï “j:&õBý¬Ú­AZ`¬qÁ £Žp3‚Y,å±4î6vkúᨼ¼†‘ì?§óöL¯LÝ Ü;ÝÕ´8"A¥¶7ta*Ĺå{óvbÛÊò¬úƒY&}–†¼Öu?n‚Ù«¸•€Ü�E¾¥[\3 E…¤×›}Î{"ð„Šá„Þ>[‡µ¦ål0˜"ïn0Åê^fD)jìßÃX Á­¼Ap„ÇT(l$AŠfŒ|j‹œWÝg°j­�ÀáÀ•®~yÆÁBƒ\»¯z=2˜Âl1ÅèóZ oõÓoù‰„&w-1€3P§C…µY°z¬ ã!º€óžBJM™7ŒZ­wŒœSÜ1Ñ�4b¾K]=ó/Û‘¿/F�÷èK^2šn6íÁ‡·’Úlð!²ïdåÛvK³ã€¶«�žµvj[P Ó$wKžKõž�‚5.’x—[Õˆaq“zh™K|�ÿ¢<[Ú«�ѽ ÐjoLEüèØ/[u~>ÍÄ. úx)¶dæ2qo=à˜íw»‰ÚÌñiV]©ìÔ²Wk�2á6É&!B Lc?4$²pß”gP>Á®”åp¿/·£ÇÙo!Ž^ØôÖåG~±p£•M©8®y©0¯Qƒ¶ãÛò"F+V ƒèã`µÝ¬�Òù4²¶çRœ_à´* óar· ]“iöV¾íIäu–� Ð Ê®Ž¸ï'æ|†Xf£Òá¤ñîmaÐúü ±q:ÀCµ‰×Bž(9Ô"¿á¸TŸ3’Qó56G7ž›)ÜÅ]‹Ø/xàØ7»8_Âý1HD�4â1™vöGY¹ƒ¯�VhB‡?ö7°gÀô½‰WÕ¦:AÕ·v¸ôÐŽ‘™¼¾Ë/Ùà·;üzþH¡ˆ¸€†tJWâ,-¦�H4ál¡Ø}²ý) Z^´r 6ÎEêÉÅy«H|ÿNâÒ\sR0È=Õ­÷{œê°Ü®Ùà UùØOãÒ �þ¿,6Öê´Êá´dë+dE‹o,úòeâ«DqD6 ¬Ðv6Ö,õ(Ë`u›~�Åu §`É»¨&èÓåaÎüõì_½DJ C9–d`ù±,g�uÏö®fÝ„Íàµ'Ø;DRÈ}MvgÖŽãÈdcìð|ö ™õÒ9_¤+‘=Ê!}©Ô)àEÄ-Ž]üQdM·zI:âëÜL±C{l=¤�˜Ã8”‹ÑFŒÜE”S ‹9Yæn Vs„œZŸ‚uy‘µ›š‘ÔîX(Ȇ@x‚f p‚½;ØJžºc’5ïÉ�êñO`v#ñU“]’Ϋb8<2ž¬3QL!nZe‹Hp#2åÞ.q„±ðìóƒ{ت”àß*î/|cTåukœ„7SbWŒ¦eˆô98GA½\5w\~×é¢fÏ_Sg: :Ë‹Ôà¾�z¯v-¥²û~…lO—@Ã`l¬f+J*‚ï†Å­�È­T‰A5—¢*} S9�²¥!mT–zŒ‹€ÍöÊYÌCG;)àü« ÔiéåïõÙ,¶\c-JÁÙÅÆô�töùa©²�ƒ¼}íö- (Î& Vá�øôçˆñFýªPÅÃĵV µ?ŽêÁ�Kz8ÿR:ÆmuÕïÌàˆmùµPŽ�8kß ðÁr�Ä Ææ˜efÊ—Á¯{k¨4ßž0 º� „ xW^ˆï~ÛyI7ÄŒŸXJAªÏ ¡Ü‘È+÷ŸŽo™¿›;¹m× ~·Ñ~ËÒ¥/i³6Ý.9ëßUØß7>>ÃÕܱ.�38J;ªž㪦ÌÞ%L0šŠ‚lrnÆ3C‚;Ò›ïÓ.ËñÛª0c‰ÎJT :á¤+â`ÆÈgCŸ«-BLØ�¿¢Ø˜¨ýl-°³„“ HvB¬Šg.$RÈ¢[±À;fÊÿ¾“xã%d^²É d¶Š€h=P6œGµ}3×çºòw�جР±ßgšÊ{”`*üꪯ ׯvêý©Ô6Ê5Áò!6ÿFOenL~úÖ ™ñ†�ÅžX¥DfÔŸP$ÝÑkåäR˜7'‹X£Á§‰k!jæbÝå o~$[0ä ö–2Œª¾.d€h±¨©¿Ül8ëëÛãC�AƒèS¹�-öAÁùóž~Ø÷®Ów¥€r?k?d¾¼vpoè a¬³‡‰ÿYên?`î¡Øê~U*¹B.1êÂ;�½pKfœØpÄKëö¤àJÎy³º“`@D#@J§ù·�±º‘D.î퀺áÐÄ`Þúú°/�ß½¶Ö»…@à>¦†#W Ã3i�glJBä ¿7XE-‹þûáb H__ž(ó"§ò³V튫,²õjÏ1‹ƒh ~jB‘¸æ?iV�Ú[ˆÙÖײ¦óôºæÐÑ� ;®xÉ&ëÖ©‘éJný}c³öwˆ½AþÊ‘ °EgVF^—å~ІÉQìhc‡¾ÐËËé(nƒ^IeQï»ØBÞµ¤Jˆô}úAÚ^ó¯Üjç;£-†ß{F¿~žÜ)€ˆšOxÈ„ÜÀ£¿Áܵ¤•,P‚H�5iK�ØÞþoƒÇwýÞã)IãN^÷’ž\3…Ì–õ-ÜáBJãmJã>µÌ”@/Q—½¥éŠo詟YO–µïžJ'ß6láŽt@Oò¸ÜJh}˜]ˆ„eB„>ÕãŠÌ&˜<Ã8 ‹ÁÛ*±“‹c#BýÍ]a@PhA6ÆšM­�¿©Õ²'TÎö¿Ö¾½|¥<¢Ñ€Æ±“ï±Ë€¾:B¶`ÖqìÛù^»™¢¹×ɯ{ÜlpûQXåðJ8ÁïïÞÝ3öIuʸccØ£µ8™ïC¨#”Ö’Üj] VŒï™•+컽³à}„üüp�€¾%‰ñ‘cýÏKvÁÃ[=›e�“Ëyqƒüº+ˆ]·q ™½‘Ÿƒ­,˜F^5)‹bN=n'éâ‡_«?†"ý—£œ”ô ‰pza4!>Åâ Âøq‹+Xlaç2øŠyg5†¹~‘æDÁ“,Ý*Á0�ëyÁêÈæi À‚ˆ0�؃ӑ7e(f÷d x—2ç:  Y—€µ»Ô.ø"õçéÀÐëe»±�e —IÀZn é·Zbl¥U`”!Ž'´ îÞ¬Vwk«¿8K¾X‚IlW½­¸‰Í–s:¶ÏR§¾–q¥¼“ÇlÁƒaÇ7ÕTy1†òÞŒÏW™Äö·t«c—íT‡Çw¦ ¿ËV½&÷``¾¢-‰GwºìØóD/�TžâÓE©»Üé1y¬ɨJý9 ÈjøÂÄxNìâ§�EtÐ|y¿' ½6½•Ø¢>S]°SH¼|¸ñòÒЇqƬ¨(öá"ˆúYEK½Ÿašä �  &È~æµy‘u³¤Ü¸ �¢e(£H¦ÆQ©t=OÑÂ˪°Gå»]uaÓUÿ7=X¸Æïhæm[ÂÓ'‘qÇÊ:Ë2æ¤ÌÊz%Û¡d�”²,H··¬xëßW­"ò£�ÏÉä‡C hÔ`k×;À½èÉ8bO("ÚîJcXl~m:ÕšildÖf¶©ö´nºò‹e`n¬\à[j bY.ŽšzfϽo;R —-CÚ2"`2>“,Žm7Õõ v°2LðȘ4›æ×0± Ä£ŽÃ“i+Ùô.ÿWω«é^vúÖ@þá’„½¡–Õ%BzÓ£€Ø1Jvè›Ü ‡"©&+xF«â•1z$kjúO³¿>/âØžk÷àß¿ x´¤›M€×¯qŸß{|{l±(›žuʯ7.( ‹ð·rÁ�| èù&}m0{PÆ»%Î Ÿ:î±’\,B’˜Ïêä‚É.‚•šœ°Z\sº¼Ð�$ ÉS&|Ïù�ðvaÈy‚ñ M/Á3õ­ªQv<þð¬+7…øŽ•¹8-1UÔ<Ì Ò½‹�ho@¯¦š!„Å=—b¡[ ïc@D‹X8üY†[†è4¶|ZÌ“8¦tô42†B¥™îýÁ¼.çœY<Ù;ÎØü¶ƒ6Pše×I°ŒlÒÛ»§d“JØÃb¯/ïXVZ~Ô ùGÀ7e›²ÝÐC×–_jžW±qµ—pÄïQ¹ç3n´<õsªú Žž¯¯—ɧ™¶ ÜuI~`=e}Ä"½l4–4q[ Ñå-Š{U§ÛQ9,5R±-©UGÆ|k¦20ºó8ƒÆ�gh·’æ!âÚ"΢Ú(Ü1;#©ôyYwõoØ0P1«jX±Š¾S„ y>ɘ/ˆ€4ÄÓÚ�³ØH{=t`-s“¡�<˜ØÏ2‡– FH6q‘Nß{±ƒÜñÔ„÷´µöæÍú` eÁU%оK%9f 5dß®ï.ø·:ï©/�pÀÜf qHâsŒÁ�ó[À2ÇzjÙc|ó‚žu¤­Ç—¬ýÜp‚J–5vÄIQâí€íÌý§nÉ ceæ_S¤k™~p/`¾DH™È×r°VTyÚµ¾†ÕÍ�¸\ÂjÚûˆ(Íáèßobî-@! Œ( ¹)ÅEæ‚éRôðt‹¼É 6ÿYOF<±7>Ã%µ<üàË, xÍ´\'Fq7üZ%�Yàˆ-[9«'˜3f¢a`U°_:uãUgܸò®€Â�™¼ƒˆž8È£°¹¬ºM# ¾¯°‹¯]m,˜nc à gÕâç�uè�;ÇïŽà�Á$b6ÖU1ÐÐ@0†ì�8ÝgöH\ˆÀS¡Ì3ÓîHW5§¬¥®Þ¶KmG+²Ç¬X¦èS-q¡¡¨×ºM¶9p/›:8Å”~Í}•œð�_(¡5é>×5I´kZûûè+Nú%A³ûÙÇ]Ÿ¤¦_.#w�Xârè�0“¹$Ø(û8À൑K pHžfrH6@ʹ%5àÄ�+G�…¦ÅNOû­„D.¤×Ö˜Š&w�µÍ5Wi¯;ô§<èZÜê�Ýä”c<ÏÃEƒ* Ôa5Kš¸XA´«ÆñµzÌĤEÙlw 6•óÂ� ÃÛ0`“¼ƒ!îùÑb[Ž„M�5ºiœêA®�­<âĹÒí‘ϸ’Î=V-, 3mþÒU%wZMú ®�Î*„Ißžp)N ª:W,p"º+lǧ‹úTk*ëQ¾¼nlúlÍpÒ÷¶³Kdìý¾î‹Ènw•AÞ¢MøIÁúÀSj0aRþ–û·£Ÿ¹ÜÏ=Ð&$�rÎ=KsíоfézɸbÅH†c6qT«gç“G«‡—yB L^tǃ®xEö¾N”E{AÎg¨Û/½"‹D l/ß\0ÐãɰSŠßì+¶@rµÕxÞ�{>àØÖ–›j–ÌŠìÌÀ(×¶Z¸Îã[œ{� Y¶ NÝfÑ´·ª�¸i\DýɱˆÖ å.F&ÐSz5@)Œ0�cÇÙÆÚÀ= š±ua¬¢>™Ë^hûÝa*,A’{àžÝOJ;rÛä¦Ã4 sù÷ÖÁó, ¾)÷¶Eh PÞ4žÑ@ Àã¦_Z´?…¾Å× È£Šu r›—‚˜8Dò×_ãÃò‰uiµ7o•7xì§Ïï( Vm}–[o‰ž²Ó^æÖbäEGí\Š­Dÿ¯W¼QY. Dx´6'%¨xû­„¾âßC¶#¡ÄÆ¢—¢‹ Çîì4Ÿ´Ãõ²Ð+äýæD|m.×*£ku×)Èoá·»†ËìWo)£×Ýâ(¨äÒÁSåÏ"°:¢ŽýŒHî̸*ôiÓ²ÂëS¤EBø@Œ;7‚ÜBüŒ]ãh9FºPæùs£Ã~d+ÈIx‡ú朠.³êxÑÍNEäy8åñ˜³cfÅàEîÌ=.;Á2Åd¤TEr.1 ó¥ûV.Ÿè XœÁA��V¾Ž9J Δ€P f2¢gs£ãŒbC)&¦‰‡°nÖlß.¶¶S£¡t`V2ª´åÅEi{1ˆ3µ T7jY„DÓþ±É Î…@Æ—ºÞµ¥²"Úøb#•Nôíúý[õm«4©’—ÖÓÅD)q“6Þ.nð§t±¶CQ—޾̰Elâ3‰Y#¿w˜{Ó[÷ÃF%•Žk`¨¥•·Ó–égâžF×wïºj45lóEfП ³7ÅROi^1{”.G:¸‹\Ûî)˜Ñ“ɺjáe@# ¬ì9›YA-º�ÝFjqùŸB=Ðn7 þãz$à ígráácsp[&kà4È•ñxMz|¦ÔRA…r Tš&=Zåú÷WVø®Ö‚f‚õï‰3]I™Z¿>ëU|‘ðZm¢w+tztè6�1Ÿ¬ m¸3ÎÜЇ£9h�A§5åšâ>¼¯ÄÑ×3œ…›É¤�yäMQë° |�âí»VlØ\ÊÏ0ŠBF2(¹Ÿ«�~Ë­OŃ¢:g^ÙÞ¹ üÛUùˆ—6Ì’’Ý ççAZêûE�úz†Ÿh“×,Kný,¤?/[ïÞº¡ßZÁÙM O–=qìê13cSºæ]ßF:Z›Qý™Vû’ž‹×E–êq�tÒÀÅÑ'Xz¸ýû½ÆlO –tã=±ÛÉÜͤ®M“‚áøØŸ�¸ZÀ†[½Õuêãˆùt}]Y4M7Þ´m S/iÅNÝSã� k‘S¦nÑÇU#mZZMÊY^FÏîT©8ãUó!†™+:¯2ò±ñ–S5³y+¾P’l'%r†ÓZk¨öLŽÆ1bî¿a&0qYv«Á­»[RI6¡ bã�nÛ‰O_è–ã=.wé<ÎòŒnã›[·Ÿ?á�!´�yðS>È#,©E¬lÉŽÝ{ ê~ |ù%»õ˜¨;©ùó§ ð½¾BÔ'Ìån^$`BÚã³a¡¿zï0Þ,ÿ]ÖZ½$›®È&àB­ƒ<N÷cϽ†…Mý¬Ù6wèí#<©¶l uõS�JÄ¿`¬ìóá:»ãå XñÀ.÷¬çî 9{/êËâB~@‰úôЗ~kz1`dc8l}è�bcOY›†»Ó›^Š6ý-³EÖ‡ç`¬ŒŠ®6{�L|y4÷/�æüGVš¿=ï¡÷ËÞ¬»f`ÀÞѵøBå÷•]ýà¹Í£�ðL…˜/å{ †D¶¸Ge›½•�ZÞ}=‡ˆX«,SYÑg0¼_H=¨ØSc&àÇ‚ Btåšg, 1 ‘È`yWJ±Þ"ÓzPêïêà±�>·ìÖ¡œ‡i¶Rã¿Òm#×~JÛ”öÒÁá¡Ó$pÆ·÷ïj¦Z[›�;£ÿ^ª‰Á¿ZRÅ»¶$„–älÎU�˜Ü[ÖÂåIæ‹z Ïóc�žèÌ?·â:$âYu<}aÿš r‘Ùù¯ï½f¸Û€ÆL‚Z� óûiª©P}²ÎÂÀ¥¤dª�M¯wb‡WzÈØ<´D³—ò(ÌÙoY�³3�%‡Wž+N!€ƒ çɰ2,ƒóÖ¢§Ý‡«ŠÍäZ¹¶jE¬f¡-›ªí-à¾÷pµP§l˜šŽH-Š­9ºšßÉþ~üÁÈ÷±¥õö‡H2í�Ú¾šNí2°’ÛL .½âàAh;X£çÞ;ͧçÃ÷!ºÀ¦)~qDË2g¥÷äq9¶ØñB«;ès+Çê䙋5„Û}S0ÁÀh½ [§@Oèd¦+æ²µ£ãL/i’2?l«Õ¡°Õ’P|VåÞá&Mîg¥ù­´¯…ÀX=|þZIǺ  `B+µr–¹ÜþÓ“'®ðcƒV±7ªÏR’Ma@mäÁXùƒÉ“¨z4áxŒº$rˆ1æa¨,`¤AÞ3±¡µ‚¨À_"–´o±‹ ì÷€òß—*éNÀÎÙ Ö1Z…÷ms¡ÍO²B;àú¤ÇžÏ/ÜâÖ~ešcxqè�ZiƒZ‘fI¾›uNNgX �çÊcƒ#Ç/t)â$AÒ_Sé‰îáD3~í-'%B¡ÊèSW¶q=íÁ\�·ž¨òû£œ¦ƒ…€aJxgíN䯛«ž\Ƶ�ºÛž¾òA��tO$¯î‹u4CîZwyOC'ëzï áf½<ÊX>�žþ—9ݨ. =z5WÜŒ°AgÅòC±nuu•iЙç|0]�V8I~Vî»q#bf¡Ç;í‹äC¾å­%û9%ïCã›TóâºÔ±}N4Šî«Ô }ïÙ‘džü‰KôLb„´ 0óÝyË,Á’ÁË’/×'l&d;,^‹¤«ÝÁ[#Òöÿ"�¶Ê±‚‰àÚC+ û4 ›)º•6ñ\>wLJ”¨šÖ“`Ûmüä›ö­k 5øìÃûwõMìQX ÙfõÞã÷�‚­¶\Ú®@#oléà †Ú6³|üla_£›<Ž<5Ê¡ü¼°×ˆô¬8ßž<=N]¢ ½åšS’“ð<¡¹!ݲº;(´Û"2A+¥´A¡D~ñ°þŸt•”ˆ=ĘŽn�‰ +ó~îX?yóú0¼O³+~Ì7¼ þ®Z0¿cæüv½Có5ƒ¸[iƒ¿¦v2¡ÏÔžŒºš,^4‰Ê^PÇß…r¹dž“He+¼l”;:ñ»^Ÿ/—®|}éîˆx0á•LfåJdÅ^]?ݼµÍÒÂɦ|ûÖùkN�"qœÚÁÄïGù„î‚Ah0&¡,Þ·Å^¶gÄçC-¼â†šÐ#)–gZZÚ’`Ãë&ÿLäWÄudõÜj,ªßãꦴÂ4´Ô�/.iÖfw`Õ‘Ü(ÛµÀ'>Y›,sÍðTæl…�4ÙJ8b5BpðXÈ*Š4�×yÎ}n-à^M-“ý¾¼¼vö)”_5ßHS˜¡÷=ÁŒ"_! Ðo1³‹¨\ ËJ±:Rè¡D† ¸ÄUþhú2¨Ø�U Ž Ÿª‡$¹!¦›lèä ò–€3âœpñ7AWaoŠ2,¥ž‘(o,¨ Ü v9KSðV„˜o˜)Þ2}åŠ5—¾HHSXZý¢¾åÑMKJ)Œ(Š(JþŒ@í3ŽÛ�N¾íOuåX…>Zr‘ºÙ÷ iöAïéÏ@lzº¾²EC<¥Våή[±¤˜¸-®‹d!vy´Ö/O|"(Ùd·+“/=ux˼àw±3 œáh>žý~ÐOµiÂ.E >�º…î ÷2ü1¼IFVnÀ$I :"G#?¥û~6¬uùr¦X±ö÷Õýyq .ŽÎëóÊÀX)d÷ ° eÂÛÈôõ5œdCë X}Æt£ø¶˜hÙ7:I¼ßî2*EëžkésÅÓcá·‰Ý ŒÿVÜﻨX:qÐ~égµÛòeÏ®½U·~ȱ“g¡ì;pКêÿ/4^ÔØ¾Û}~ÇÚ 3ÆrÁñc ÅϹ&$ÛÏÓxsÔŽH ƒkªµæö`øWæa—ú÷?V9�":ñ¾ÀJ „öÝt»†ƒ…üNª¥%€ãh$iè¿WÈ`÷:+7 øðêiÑúdªA/«hÁ°­]›3�åö«‘t>I³ b¶‹Tvd[¬ÛMÃ�Ç¡ÀèD—— ŠgŒ} ­^ †6%£+H�÷M+h“Ré„—atα‘ñÕþ7#¾"é¦"?¤$~„3ßLêñ¤ÖnždÆÛcbb2¸&ëvw§€�¯ŒÁÜÈ!oá³vhxöÎ�¾Ùí!aàþÖÁélÀÄ^ï±bJcÛ߀תŒ…ô8±³50è@¬Ð„pv–mÒå6GP2¡¢»“<#`jÆ%½éï)|¾åî&“¦ç÷“|µ߃Á,¸¹]ucD"n\†ÛôOåšè‚Áî©$^1!PŠŒñíñ‹êë¶�ö/]ÉF]%t $ÑŒˆ=d›Aq P[8Îá…� e3¬åËY ÛÛÌ.v�=ýš «}2vŠße¨­DUcßuÆS×H?lÅ«WÍ‹gšƒ�_<©Ì©.ÍU¨r�W@[Èm L–ÃRÂÀ�}Z· Ä”5=¦BøµþEØF¶‘‡Ö°ëJÇl‹cú!ý0 Qûœk³w]:üÓN[»;q缿óî÷ä|Ÿ.Ÿ}NáÝ;£\»^8ÊEZEÿ$Þ+8`KWbt?™Úñ¸%ñõ0é'9ž\¬e¤g°£¨Íž x÷‡ gKæª�Ÿ‰ªŠÐ´c)�’¸àß{†Ë1®!’ÚÏz@ÕT×îioÒÚeº¼ß�'³ ,ïV»ÙX¼íž: :.NP‚anJL’Šec¦â„2­íÃt Z/Ó:÷h4Ë{5òzÎ WI lèÄ’tæn�2P›!�ÂXŽ;ˆžk€bµ/ס\±Ì%§ g…qèÚ±=«[˜½dRÈ¿˜”ÜSM�ØJÜ…™wéDSVÞu:WƇ/Ô¥°ß�§á†l “½ùûU�£ÌÚ.’<%¾Èy5™Òa"ì9#E`É¢¯#‚XâZ‹‹˜èW‹¶á&‘¼5ÙGx!XjŪ«XÝÜ44 îäªÓÈŠðÁ“X­®j…�LQ# }c#Ùl˜î/;Ë·}´ ßFÈb}²"=ñŒ®˜ž¥ô Ë¡Œà¼ÆtâôMbÅîˆ37IGÎ}bzÖS€Gp»àãX%xe|{[è~Îêƒx²q\±x¬jõLc€3â;Ì0#ÅýG–g.ÔLJZÙÇp{ñFÍmÐ,Íôa72­å™ˆÉLAqíÅ{¾j—@�ÜZÇŒ¼Èkžì^2TÁ¤"ì> 5˜ÿ<€»˜òÉ�‰bø?´™ËO6Ig½ƒ«àú�óeí§/QÈ„øËkšýÏ\ ù;NBmŒ� %-s6k;‘%²�qp«'c«1íñª¸YwÊàónYÏAžâ*xtÝ®× ©Iµ«'ëñØ#][…ªØN®ßàfêëªåŽj^ ©º*`A³òçcÞÇìÝʽy>•»ïíâÁ�¥ªPŸ0P¡»}ª8žÈ.¦J¾JÑ{½©gÓ—°¢s´¿spÕWØ*¥>ƒFh[ï½é-n×áÙd7wË=Œ5Éq“ÏÀ™Åè>Æ/É@ηn,-09,<®m˜y;êùl’)ƒÄû¼¦Êåb9o×À–ÌØœ}!IeÕ~5i²ÉŠ 4)g¿Ãך�'¾ñû‡¨zƒ.Ú$7A«Ò÷Ù›fû¿[w;/:ª\õb¥L îD«8¢e°àìOoˆ3ÏF'Ôã†ï˜¢ã1£Ýüï“Êp Aá°üyy–{¥„ìš«ov¹f§KŽó×ÓÒöÞMôÝü:&y'¦ Dy™èÜ y9ù(¯BáGyXÁs}ƒeäÑ6¶_–÷žíít…î~}1(!ÔZÞžjû}ÝÙSÓeñï…Ë…Se¾±ß¦±6¥Ͼõ%ˆ"á»/ãò8à­Êçf–X ”¿ZZî&þŸ¹ÆÃ }­í³°PËîÓ�¡TŽ[ ªºvz |b84º%ûâÈèù%wß=…l°Rñ¯¸ 0*�Ø_a½1ˆNB¿%éƒëYàlß¶šå>ʤs͆¿2„á†sl; Å̤: ÛÅ-À}àgO˜…Ô!�82Yä5Y~›ô°= ËÆC­æÃQw–�¯^ü@ÔØrá¶Tã.ÞÔi· ºøÃ8Nã˜á¼ðþ泊žM«=2'à¹×Û@Åî‘ëç­õû+|»få­îÞÕ’Ð>§À q!‡—ÎÔDs¿5·¥�¼ú3¶"Àk™‰AÞÊØ˜3¢Öð÷Ϧ÷uÑQ7¿öùÉÐ]÷ÅÚ }ÜW¦¥¦­Š)¾2È·cÏ#yå—JˆŸ·’"ܘ's×�w Gð:¢B™5Ÿë`žôµpÞ²L?¤ôòûÁ1ÍäAX;79§ú;umÁÁä�» †n^¬›]Ûe †!0†&&››¤P.ß"}oYk®`Db ¡mùXZ½öy­lùž3Nói :‹i‰—uj´Hu>çuRžàk–Ãí|àªk}£ü÷¨Ìê~ÖÆ B„ÙtÖàü¼ø¦EýufÛäcžø;ÈÇ•ÍÇT‡v¶ =¼HZ!Žc&9Ðü §í%}¸í£+ÜXodì·>¾k¡. È'v×K§IDÚ:„ºu¬YÎ7ÏgìÐHm§só„Sý†ž·‘ŠçÌB¸ov<Ü\§&°b[ºê8lÝÇ-i KEFoÜeáuŠï#€ø£��¡+p£==`¢f¯r2ª"¤¸õûfèF¿U÷Ë j±(obpK`Ï[3T#f$6�» ™%ʪPKìu‹gÎä.u�M,?pDÁd둱û7ËMsŒªÙÃÛ®òCw}sšÕ`ŒàvV� b=Šç~E¹|ÔÏø3î´}×¾f�ð—ž H_<[dÞþèkŠ>*¸0]Hú‹ý53×öiÔà7Õ )žžâQ¨KÚ5% ÞV•3êýkͦʧ ܾ]¾œ5ª*B[l vØo·ÁZ÷Ù¦JRÏË–í, ’ ôç?’bfÔþï½5¨{òÙ1pè=˜OjÕ°ÝüºÁ†«4» C¬¾/dc�)©âO­â‘bIº }âû´Åâ ix滑4®Qñõ�ñ2¹àÄÿ¦Á„⿺co„Pµ7Ì¿™å­²]Ñ1»ÂÙ&Wôaïñ¯tMÈk``’š¹\|�ÓeLÄ"«á8FãwÕÊ5Ü£ÂÇÜÐT¼Z•ÜÒÜ µcFßÝ[Œ¾9d`Ÿ…HLæyß+lcª”…×)äøÿä/Ѐsw;ôºâZ*z)|æñ;oo9å{"òz{·À‹fÛáKWTœo!ƒj+‹çÚCäK÷3Î/5À�ö�}ß2Æä<,Ó‰¹‡x�¦ ;–ôìÑ\Ma-3¬¾ÇÝ<.UUT„;meöulqêjm�³BÉØÂ—Y Ü5o§^smˆgaªNå² �†ç¦½‡ˆDª�÷y¥#Hï…w*­m*†s²@ w½‹Ž×yë6K¢¯/m{ml–ªìPY  @° jÔÞ-s"JûŠÎ© óJÿèÏÙ¯Ñ[q½ç2Áï§aAjæ10Útoš�'r#3 d�² ãa?®®�? )lKh0²j7IÈ÷µ_·)4ßС b  |̮Л³·ìBÉeó: ��v¶Ãþè�̾Šç’àN3iKžr—뚪 7 H´áA�:ý³²°tàø«~u>Nó!ĎûÊÔ*€X:%²Þ]1ÊÈ…3L©$9ÒÖW®µ€¹j®õzÖßGs®ë›à´ŠëWž†¥J�%Š»6¿}7ƒ J½²±w¶†ÿ&,!ep�ùùgñ¾Ì&¹a�ÜNR„2)z/‡ØqXô íYž‚ùÜ�«�©åŒOiÌï3„Ã=×o�WH:•"üæ–{Íi¹[¾ ®’a5Æ6¶N²äì1ƹ4r Áß’ÍÚlwe£PuY²Ku¥îè©—èãwF•8âÅf8µÝ¢±®¢~T"¼ñÁ$ÃÄsÒ¡ÄÐÈÍÍT-Q±Š;Ð:ýf9»Çí(®óZÕµNÄN@S2§œÁ\ÒkìSü³… w€“çŽ['«Î§˜Í“¯1µg~�¹â·{E$Ù¸ ™¥3Sºàô…êBñ’'yTÔpã·Ð^ÊÜœ5Fp}ÞQÝr4ɼaî\–«F0·Ü5ØÓ›\»~ßs°ŠŒ’LìUë:¤�º:‚Ê�c7¯7kBÕcíø‘˜ò+ì¹¢Ÿ8ŠeVÉonUnþɽ¥ÎÿõŸd4¢ÅPsr”öUJÀZü›S3¿°áy‡ìoŽH 'Øo@ݰˆHömݦpÑM¶Õï1¯˜¥¹Ž©fÍ=²nØò«Ý�E œ2oŒ&Bý·y‘â7FzÛe¡Bû'§¢x’ž³ÓÍóÏ»Þèv_gÄñååïÓâò7=øv�¯Í'q(õ`9w~ óv^/“f�H_2û­·£}¨àm»}ˆÅH_ž@ ÑÄâlÝ•µoa,¤ Ζ ž^ìZ¿RøçË/Ow‹®µ‡;�¹PÆÁò›U›“å$‰¨ÄPº uÆnÈ ¾-¶YÐy’Jnô¥ù°›MY¥’:áuA=àè8M.×qÇ9º³ ÇsÛ®òh{8 ‡8R `)Ôt#öÓŽšÉ±¾‘5?jÏÿ� :k¾x5?- 2µ+—vÇ7ô£åñÅ:©â%5³7˜dðåRø¨J?bÚ¨4°XCc|Þ(Œ•$*×6ÜÅç<ôîÝ[DÜ9N³²>^Ò5}ÂOiS�§Æ<8Ñú\‚ïKwÍß20œ9<ÀÂ9ßFÐuåìÐÁ‘ŒÍàR4¨—twpœ·hÝëã÷›YŠÉƺ|±­”Á7tß’úÊ÷1šklªÞK�ìZ�A‘ð–pw%Õ÷Œñ×ÅÙv¼@jzÁƦ›Ç,)¬‹VÕq:0]jZ€2­Š ˜€€ôÄR¬Ü[;úòÐ-{âÕÀGð²òºÀÏ¿ºÚOª:¸Õd77¬¨d"ZMö°™ò�—|·(“û5² A"eu±iÎñŒV‰…ßj¥„·fA$¤ྵßë?ÍE–¾úV…m]Åô›Á�ÿ«ÏTÞR)]Y.f †7¼Å †0__W$JßÀY˜r¿fªg!Þqh"ßë’ Ý3 +cª Š-&=4õ%�]Ä3UfÐ%þÍ­o=œçÏ µû¯ûbúBò^ž�m`(åŒ4n!z0Ø µM¾� l6îÏèÀ]ú×í¿E^zÏŸA·÷QÎ+äûÈŽë2žr·�+R�M!‹{ÛÚc—ö¨—ø0ùÇK»R�âÛ÷â ¡£ë~8™´£%0¾jlXíeàK g$½h�ñÄ=;kqØ:Z¿96±'ShõÝ}?ÒÖ�­´öHÜËi.3Ïèú=ý£¶ždïôb2 ^Õý%bÔ#Ö¿v”�/™Æ›¸×e©ù|­EÃG`µîò?ÀØMoyþÎÅRIÅ{&Â!}ÑÆ÷ TpHÚ¯6Åï¼Ýd§®³ƒÃäÞÎÍ¢qâ6K&Èjã,ž~ïvûmé§ézèûžoï·÷tÈ%AÖù¿WË´>\2—P{?uã›®uU�î"¸ˆyr{™YÕ²*Eò’dC›Ýæ-57Q2^ZÌÎ/Ãqe€KC„Q.˜V”9}*"“�×€+«¹ÁhE/ÅŒêv˜jWæsv–oL"ýý ûŸñôgóó깈¹…nw Ñ:ÕV‡‘E±[üÇ>Ñ�Õê#ÜXñp‹uðÀˆAÙ’âg2ŠðÙû¾¤Ô>ˆƒ]|¶U"Öü�´rh@ˆ‹œ½a¹.\ÞìU'“žÖÎÊB=¡í"÷X͵•¦å‹uXœ$-šºå×Ý#ŪÖAX\ªïbåOkŽ44›‚ ̼¤clöT×�ê“‚ -l×í§Ð1ú dB'´´Rªø.aãóa£{œUµRXò3sz„Ëñ°9¥|¯r!wË.ß8ޱäE¼¾rÐYz-DRxQÇÉ ø:*Ìôñóã‹Ø—†GÜ#)aö=0B„»Ô+)ªÊI‡zß~ArçI[Ò€,;µ½€¨[bÜnW¶ÅŠ\‹Ô¼7o+ÚOkª�“ù¹!C¯«’CAÀný¦�r¢; xy±³!Š‚’ pâdâ&>eRÀ1âÔà Ö¦ìÃø„3my‹€0[{ãQ»Í—SÞjYm×0L›.úõ‘ÑÌ…ªÈ9Už~2á!Ç·R`ËY÷m˜`š@úBì3Ï\: !­ž[K=·g½ñnV¸PÂågØÝ!dóö~8^KÏI(;ÜÎKL"šQ—(á}Ô܇)™Býu´€™wº4Þåón~¬°bcH²µJ²Ì8�âèÙ×füvXÜïv_“åÙ ìýT뇬å ð[žœ ìÀ]ËEËŒ~›ékÂA 8ž2@×>)…µ•e@>Ñ&Wn_‚—¿€BòµAfZaâh�› 8•à³ÑÕ²p¼€t™Ä„F�}ÝVÄ>½ýÐ\YÒrÀåäЯé�C2é…ìa_�¼Žãc¹vçëBa7�F”lÂ>ªÂc clœ�bw¾|%­߀Ç;aèfò!òh"Ѹ~wþÞéA]ý¬úƒ>÷Ìp ‚ÈÇäêˆV¥Õ›4†¡@d"Ⱦä,a9pmÎ3}›~6ØÚodBnRŸêΑ ÂßȬ˜%'@œ�ç&ë8 ¸ÀŸÄüÙ0^-¿Ãu»>³và¥ø$»§Øp¯ŽÈí`’'Œ2Œå�½Ý�'wéžyšìw™Ìw:ª¹mû©^í�·¼AϤ¢E@J5'…Úß!.aVí›Xê*n:|£;Í¥àuœxàçD\˜1ðƒÝÉé±¥¡ úýDaÊY�CSö#µ©×wÛZ‚#vù6(]#:/TË¢‚¬Ÿpik�®á÷z .æ÷Ö.“ùÌØvú‚¨ïWù¢9† Nk €�\¼V·…AQf‚ÂgY_¹äñß BsBb–ú�.Ö]¶s¹÷±.A^ú*©Á^:{¦¯¶Åv _;Ïü²5Xd$ê0¢ŽpNŸ?ÉÓуPNiF¦,é�ÛÄÈØu²5’Œ›ég¸„ÃB±²fïuP§Ë‹ü¿´½ë^è<¼qµ)eW°î�ëljØ£Ká �¼bj‘œLߤ¥vá±ZãŠÜ$VdñÜ]›³c S×’-÷GìkÆ(ê U Æ„lš¦zÞÉ]¸ ËöRunZË…�®½fº¢NßÝë:-•lvL¼P°´—îÈ4"'º÷ô8ño5”D,ò hK§×áµr¤ÖÖyf¡^X²›Ü„Ùу­x`<9^ØÕ_ ¸:!È€&´Â77kyM©s¤-¦Õf=�¯7¨àÄç…ôÚÅòßl§•ñ^Õˆ`4ôh†oÑ!¢µP’,3œ1/àªâúä eÅšù"Ñ_‹€kÐ!£ ˆUÐöåøEüfÒÛ7ö|÷ëͰ=óìòªìõ–܈*箫óNŒDÈ€¬/Ú0£]âÒŽ»’‚«äl$�Þ–rI~]Už·+�ÖMÜêâÑÃXý–é®5|î•$¾`Øõƒ›Æ“-6[©¼*êÁ n»ëˆh+}›m²âSQ"ùˆ�!޶Eêët=ÆQEÛ ^ÍðJ;ŸjZÑŽ_çs{•q5ÜGÙ>²…ÉBöB©ò )’¿.—È D4Æ@vwQ΀SÂ�Å—efÉ êĹ²6™¡ Âðh×&¥1>$ÅøÞÌЦ„Ž±â°·¹3i^!Ü¥<ªœÉíB¤ˆ¸.€’Î{Ʀ&ì”"†¦)s¨kd…�,̶3K•¤Ö  ˆ%M6±t0[M%(FMAðéëUÁFhµ7×5D_B£ÅšÊþUlR“Kìºg8 Æ¯É—ÇvL42 ’â~Hc®¯E®¤ üº6ŠN?sIXÓØ¦|»«UWå)²Ù!Ëhiˆ´s 9- –LCüð¡qü«gâÒŽÝ:cŒ?óexçwN€ž…׃˭Âq@2²É„ Â�UÚÌ,«Œ˜4Ó\òŒä^R±_­�Lï@è·…2aâV= «~b"ŒUiÔ¯¨% ¥°¬†ØàEÌ áÄdÝè]YûƒÇ«d9¯~p.…eE€S«j3¸I+§„î_Í–°Ï¿]¯g‰kVÚ QA`Hâç"¾£úÑOi³OwŒ$GÞ¿w:¤4«ô»~Ì‘Û�,§uHüG"K…šûÔô‹-Ôεyùu‰×6ÍÁã®sIúSÍîªzòp 4�^÷3¤vqÁòù�ÅCè F'ŸšÑÖFy¥Òæ(÷úÖVŒò×½’\ F±6˜Û]�…�/ÂáÕ -õ?p c!¤¹¸æó4õïLF‡Ï±Ñžs‹ï±ÒF䞘赟móØâ5amnÝO-Lwû³33z�›ñùn=ïó}ÐÙýÆq¿Ãeûg;˜=Æà– Œ; ‘�qæ­ÿ1¼dõÜ^%d. Õ†^ .þ®â½½Rµe¯f8Šp®—ÚÔ:èPy¡½Aª:†�¡È ‡Ûœ«àjV¹›©]˜×æ°ÃiT>>úowÛ%B;žNþf*7ö`Í;ªÉ¶³L†1_©m†ý\Ñnö©­Ú~ç¥;¿»Ì‘A&VÞë¡ùdÉO“"¿L�¶Œ8–Ù~\GÎ6úJâ�Ûk+f5n@{–ÂO˜#Õ@›RðĦõG~=ù¯ÇÌp7åEø{Ì„ˆ ¹ö ƒ‹âw¹rŧ;f_Zæ7–�D@*l}.�¢Ä¿OCe"3FÜa[^znpö1ù‹æï †‘ïm{Ù}‘ûÔ#Ü¢É;c=)¨F]pk²‹ßêùÔ¹×sA—»?Ã};ŠHrÍa Äk8�?D_½©·ëýšjØ;­—Õ«ö€Ê/úÔ•˜jz2ZaÎbiH`í¡¦´s‰¾sZªª¸o•ê-N䡳|#“–rCɾ»†»†)ÿ\ªBÜ=säª p÷u·2Ž7™xÖ`¯úO7C܆q"—£._×ã`�ˆúEH´©^‘ahNƒ¹ žŽ}ºL,Ÿ·½f˜t ñ;mHú;²B•Ìm¡¦”2¢%О�ˆ =Ï̹øµÔ£Ÿó½·àVÜ’Z9üµz|°˜: —ûH¯Øä¨Zø|Ïì ǵ9s\*Ûè ¬`_Y¶ )}ž%+o—Ú†"¯9«¶DVû©¬¼.ã~\†¼$“1Ñ-pó&¯½�îh@¢�³n_& ±?ï1Ær]¸‡²¥ÖSr(½¢wVèêÐb£$òìñcr`´>~Ñ|êIë˜+Ž6pv @h´Y .(ÛFÆï!1c[Sqõb¬$ÍÑ¢�À„@DD Ú0=ŽgNG»ų­ðw,jÀVq ººêøÚ\–+a@^*â›Ì›@ZÈ#–l6ëÄ^Ö­Ñ Æ®£©ªé¤û¤朆‚)BÓà øb©ý‡Jµþ$k øq}]ÅõK�S\$¾�äׂŽ&U$º'‹?s#1ž^S‡¢á 0ÐYƒî¬Óž]LïÕŒØÃ–gÄõ¦™1S^ÐÕ¦¤TF펔^ã~¿Fù¹®hkcî”­™Öí°‚]èã|c[D7I_°˜ê:®¼S‹|>�‹Öl�GM�AÉ®}ºôÜM²¹ÜÈN/à…°?Îç÷9!ÞGo£7Êü\{ÚvÔÙüaz˜„WÈaUÅ\A 1 íÂÊÿ»táÆX-'¿†‹O­î”¡š4g¶®-©~[ô›² Ò1_jxÞõ]fhÒõöZâHy.—ôãoÅ:-TZtëJsc,%É6`|çìÜâØjf{À0k°2?®YŒ~HÏqý8´c¢ƒ„ÐÎÐá8pñ3CÁŠºNß5�=ºAÝj8®eºQ`åûÈæš‹ï´^Ƈïv> š}ØŠ¦?e㥆Á/Žè‚|è>PÉo€�𶜨ä&·Ù�VƒÞB~kú~¸T‚ ÝDÅv¢p°àmšc2YðdñëVñBœø~¬H²´ Î`ëg5À‘ŇÍ÷Ý=)SQwìO¿g0% rÞ7ßsðzøã"9®jþbÇÚ»àúlÞÖk’JÅm�jÃ6¤E©X8?Lòpß7…?~¹Jë8·Áê$û^ïµ:9ŠáVfæXj ¦û¬÷Ä’A•ªëqÆP�¬¦Êcks÷L ì©Óäì«UŒC…‚~›ª-f¸Í�Ò ö†šjjÚòß®S‹˜…‰Àìk ¤’ÁBÊCÈ_>CÑøä©íarMJ´µÕ‡ êc—5tÙÛ¡gµ‡ ÀÙ[h²zÉáNÝ(gÙwo©—<^vA¬={jýWÃM0 qߚǙáÏÝTªö³ÒN‡® Øšþò¥°gQ6Q¢»ª0ŠÐ JÈ0“@“lØ{£tÐe \ÙKjÖZêN®²‰væ8lS‚(⢚ý\]¹œ\bdžkí¬’šŠÉDØË“„›µÖƒ0ñŧÜè_r%½}¾€áŽ6>M–ãœZƒ.bO­^@ߌoÝ¡TmàáU¨§ü“Åînð`Ì?bíÞ�A©26 Ç›@ §©á<A- ci�à~+Úëò㶺ØÕÊ y–꨿!ã‚9€¿8½ÄoI}Rå›IÏöþÆjQ~­…´Ãñíf�Úö„,¯Ìܬl*M·¨‹�ÝSVteÜ ùh¢Hßßqâ-k¥Î OëcPdS´ÑN´‘NJ ì­è¾ä2íSyŒ'mŒHQbeÓ&;�Pb'�¾ìï�LÏeTÚ{}õhê‘Û5TÔ`ɾœ×–÷�‘˜[¸‘[±¦ûµ„µ†tØó<©ïÇÏN:Q�P%ÂRð¡1ØF ý­�Í—ÏibÙ‰¡À„Óš¾µ}oÞßY¤*Ä^íUû¯-!Ü™¹‡fmmÑ+߈#âÕ³“À/á@–ò,b¬Íº³ë ãÅé¯þ~íðwEÍž$1�Ø(7Å"·Ö–2ˇJäh+-ýô}fóB5í�ðÚyÏ0%pº!ýŠÕœ:ê? ÑœgÎ[¸šƒ´)Ž:b*ÜðëP®¯dHÏ>}ö:¾ ç>¢4�\4­¨<.¾\Ž: o×ô�± >À.9-ã ‡Ùºˆ„}ó9uYS{0¬(9›®L§à‰·lŠ€Ì©Ò»üºV¦¾ù2]uE#¥„6?^�øZ.†›¯Û[€@ë§‹eÚEHÊæ<2xz€,6̲'1v‚bcLoì¶—“¼èÁ0}2é+ÎÆ¾"[ËÇI?N|`UqÎñ…ÎL¶”Ÿ‹ ¨fW]nÞ³4~àZÖ¶ô `ÜÆ´RG)¥¯Z“é®È»Á.é |m„m*À“¥·¦”º° ™Pª¬ž]æb!|áºG·ŧ|Ê¿éÀð2Ò-õQvE^�Ç0pÕiÄ]7 ×QÁê¸;ÌêH•˜C&˜ØTä„1lŒ…çħ–â¬+�’á;öM;P<�tË××ÅÜ›”1î* PæU5ß+_Ÿuo‰òÖà?BÛ“º žd0ý| ªíµ1Çg†k(ßAJm QŽv÷&A5{p,ÔÑÐ*¹Ž¥¾29sü_ÀP§×mcHÅÒ6�]”ï¬Z´g´Tá�«•tïQ뽎h¯'oƒ�j\Èrýg#lZ˜Ë­0ï0Ã�²ö,§×>'"â›]C@&[ûp½xÓ*Ø3së;?ã=s±%ÜPÛ$Šw( l’`2äMjVbå°¬Ö½JA$Ù�âcëȈª;fÙqt»æ(ç!ª™œÁ ô@DDÝžD5Ûòæn:­î«¼eÁÅ®¢§-±ŒÞ,1ÉÈjáû�§ÇË–çæ|t›1C æôeÄ#™Æ3®îðXw£0ÇçÒ«áW÷+”*Ê~ŠH�çGvl& ƒ"ì¹ö¬ò¦¾½²¥¬½¼! x¸©…Ï¿Œe‡7fÂ�&±´À ”÷ ûß`z°¬Q/Nz�'Oƒ2Îñ^cm‘Z¥h=˜0‚<¹b‘Ä.> gú®XÏéR‡}‚«Úøé"b¾P0ù-õÆ1–9ÄWÔ±?¢ÛÝ•…ØÖ| ÆOŒªOQbfÈ#rË‚[š!|Œ (—V~ÔHÚÜ  Ǹa‰Zß•nn¾ÉPh­dIà…L¼è"SEóf¥lU‘ECs“»s’oA0H]N ô×'à?�+¤}x­Ø0‘‡Ç«Úh*ÙJ¥`ë¿$rÅHèÄêÃe¶>½‚×¥,$ß+G­¥äc²Ä"aœ6m�)³2h°Ù¤Ã´´´‹Žeý»ŸÓ�;T‡Pf:ÞŒÔ�ÙÝfo÷mJ4Ì¢ïEÖ^óïkL}•Uà •wë8^ïEI Ò¥("^n#”»ãPÆ!±L-mŽ&|{a k0s )õŸp|æ©‚ÔŠ88[ï—£K‚)¯¥lÿÄŽVIºÁèXlš}æÈ„E�ºµDi«ÖåT“šæÜŽmŽÚ ˜¯ÖA<ÐYÌ‘Õ-$"�ˆýÊkDŒë?o"âï« ¿ØèȆ Z3uS¿î–ƒCÙŸ‰¿±�XPkòG§ ? eÜÝg%™_“t¼Ê "[Ù±Ž (ˆÀå>Ó\¨[`×BÖäMÏI…€\IpÎ0¬œÊÅ5d´ùʹÝ/Îb07Æ È‘Æ‹ü2 K¢ˆ‚�À°Îy­âœžç4ÎPÁ¾þ ŒDÖv)² llÁï`âh7Ô.æ¾åt�Ñß\¨ŒÖAð$H+ƒf¤+ñ�ž–¸×Ù½þÙœFRÑ~Ϊ“‚v®&Õ�W}„Œä´¿¬`Dcb ½ i‚íd£Óô]áHÐÂìˆÇiø3‘ÎK0Ùáþ+ߜëUô§Ø„ñÉø7»*0z%sS@O×}ÉÆy½¢_>û Qɇ}Á­I¨\ÃZˆpj-�ŠpèNN˜dú¼ÑØ„<ÂÆÀ|zWîp¹q|ƒ?X7ÆŒ®í‹´ZAJMAåZû˜jtý�ä<+!¡óäÓ à|»úráˆt׆Ô"4Ôv©3´&ÔA?6iú°+öIˆ ¡~–i÷¤ ‹>õ7pˆ46†‹_ö‡}¦`À¼ºçìîKL‰|jJÜL�˜0{æí¦ê%è•@`(œŠT£kÖ8ÆKwùgAH bB´zÆ7d´Ia->uy¨O€6~›rš`Ørg´þ@˜ã§eJt 8Uņx l@(jˆ÷°+çü‘­hÿ>ÈÛê.j äÖ(±Æ °\‘@M±°ðï1â1­\NÌ�Q“e6-òIB¡U­LŒ j¾õ¨¤»Ïì�Ö²0_3 �’àzÁÛ·ÒlA¡ç±%©Ö:ìù.ÇŸŽæ7Ú”,dÑß Œ•ƒ´mÍô³ L‘½6׿#ûÇoŒÚà‰ŽÝ};ÂÌ1¦èÒ`5è$ ýZêaÌÇÕ†Þ™Xå�½;òÏ¿Õ'±Àr(o«êÏ|àOùPÖ3²x˜¼ŠV=p)5„¢\Ž…W×´«‰È­ºwN\œÛ\t£Ûœb4¸Æ0ÉƒŽ€†S–Îd¨q‹„�_Vu�ã+™ †½Ø¢m Ðáþ„ #¹Š—ïl‘®´´‘ ‘îÆ§Î_Òvéßô¾Ô¾`Û¡ÚŠÙÀU–uêDð®µß©³åEųàÀu¨ÍC—>�#|µwá;.þ°hWŸî áïD–Çd^y³ÞMTºpamÙÜKbƒI;ÂבÁsUFÆÄÖÀÁjom”ÈÆjëÍÀ�òCÓ…F€­}Ú“ ÷và¾�Õ¼ê°h AÙ+/Jˆµ ÙígM—nM�2 •T�Q©ªA¶QNäS­¥Ž,lŠõ†‚ŽÆPR™ÛI�m6ùk•­ôë|†ž=ú¶E`~Ã8çCÖìõy™�ÉãœÌ(kŸÈQØéöRñÞó˜ ¡û½9Äõ2§�`ÈA’(êB­`N@ºs‡€‰Ñ#�­ƒûDã®Âá·ñ0qpż?qÞY|� ijìpjBK—×pÄük<-ݵôŒ·p¿5ß¾zn§šòjœrF`í7ºÔ†7³å_·yî8an†6ŽÜ‰±žÏb� [Ɖ‘d‹î5–ŒsaråmrŠÕñ»™€ë`o Þ“úõ>éQ® 0Vó„CA}3äk6!Aúð¬×1<1`²eÃàî éw�N¦+¾‘$Lª2ˆ³€Æþxvž/±;‰Å`?“BÄ@]÷AS¤ ¬ÉJë {dS�m°–ºë»Ù jÀ·`îª{vJ˜�ÄRK]bÅ¡�ëˆPŠöŽZÅ,BÕîàætB,@WÛðOxýá9›ý鮡¦P®ØÚÕQyØ®qåª%áæÁºg`š¹YFV¨¾ ¸ þŒÐ×Pïœ,‹Im�¬†éæ±Tû–Œ¡î`1�Í9^&M’ɧ œ ^� ²RШåtµ„¾Î4Ë>õ&¤1ëD©s+ÇÉÜänc²º!­ô«s )71B�™g¦\Ƙyx¾9ËvC§WϦçþn±OeÔg+à·õ‚: 4M} ¸‡`GÝ# pý§ºpLðDF·bk^–>ùÚ‚éGŸÜÖ>‰/Áí›ó‰ZÙMØôam6Ä~Ü'î) > ôþÀ—½É³ @–ó„Ú•…áÕ†0¸h¥=mÑxm³œ_Cã–ÁcÜ‹ßôß0ÉÊ©8} �dþ3Æýï·U0ŠE½Ê¿'cÓ J€o|ß ò}o%›cR\ˆˆÆ™GQSÙõì—nÐ-¶…ÛìL*ÄUZÂëTžmËæu¢Åø|?P kϾù†%ã`’©M{Ç÷ÖÂëZ¢ �,­‹÷E øäsóƒ–¸ûl¸P@±‚#jCB®Z&ŽRÜ(llZ6LL] ª÷¹«²urý_GolQ|ËR6MŽð¤2²6ºs€`Ô¹.%ÂH—•”:µŸ§ö�ÐD‚ÜÑ€ªòüâèCUùn³ìa |XçÂL>k]kr úôªyAèw|½Ùq�s0 ‰s�¼ÔŽ}Q–¸’xu``#ÕÑ69Y¼ƒÖÜ�Š1噹êÖ«?a”[�ÓÐ>A×vWQa%ë§Ø7{ B:ËOoÛ[j¦–9c æèÀå ±ƒÐL¸”GÖîr;ƒ›µÇȨƒnð mÖFY0¨È*6·àë…ê–˜uõ¥†¸áÎ|ìlcwµ&”eL;=»÷eÞÙ>ñb;ñ˜Ny©wöàõĉ_38=g¶ *Y•[˜açµ°JpÓÛ€ÀІ¸\¬`?åyÒò®§ÀÉ÷Nëü=pû±DA›1%òÛU8 Œ^ùSÞ.í§ùú †xVÓVxèùDÒ$í7ê@ru!Õe F;¡¶¶&Ð`íI(¤ÀiêÂó÷=Y°„e°aåLƒlu Ä`Y¦C´š_Ɖ»Ÿ°ð_už‘2·C©âïÌqç#Žðäd7€4i߆Àñ€I÷.S7·¸YTÏ8¼ïekÛ?&­âL˜M1Ÿ¾”±OàI.ŒÖ¹`ÂS½ÐT.Ƥ߾ÈnŠi«k¢C˜&0�jÖP½l„ƆmñGBí�‚/QŠàYñÃn'9�R[/� RFîô{°¥Öó»eì­Ý–²M ø·ÊÝÀàâ'aöÍ@{õU<õ‚BL�ÀoAbÈþ‰àŸKSÜ_Ùœ¡+gõ -—!r¾¬™¸a”Û†Ñ|ß¡4n4�ž½pƒíçìL€þ³·‰Æ3U4mü)�‰´Úà‚Ñã±ÜŒ‡ÐÒ©-Í;6ÆýVÄ- Û°\ž³¡oÙÐ0×;ru�½�@BD êÄÆNv·—Dè)Ž †E´=ÎjŠ …µ�n�Q©Ã¬kÛN|Èúç�“÷yzóÄ guK¥E{0Bò3‡´N Ø� ’.È5áG†T´P‰�]LX™\v!kÓéÉÛ l8Чe4#«ïk©¨³>ÜÇOÛöñ«tÊâü)Ý!}q=ï¨ÀÂüÏ› ‘¦=±-ÊØ‘Ð…Þï>ŠÍ{¿O[KöáYN8‚¦õÝþ¢†ÎìÝ$l�Â5ué;½sè�f¹˜°nnQ+WâoG‚m0˜¿c�¡lV^àÅ«�Ü2R'ÚÄèÇ�ŽUeHQ’oÓç</KiÙæå§kŠ¥›?l@�ñjž†» ¬ M P\z•iù{Éo!„¦ŸøzisĨX\–¯"•ñáÈ:H§‚¶Æp¶Å“¬"Ä¡›ÒÃÀÈ)Îy7@%Êhºb( l`¸0-´y�Ç„ÁÑ3…Š÷Ë<÷}è[$NÞ­xÆÜÑR÷³O‰ålÊŽ9¼²Sá xä=î¹Èƒ�Ë`ÜävÕ㻯h®Ïm=Š Ã*¡þò¾5—ÅPu³Ù�¯«Ø‘ñÔÕâר•ò¶ZVó-[9¼ l{¨d‘°!Î×"å’z&‡D#}üaä .ÍÄÚlG¾e¶Û¦õHaTlÂöC®.øã%$é:k0§Å³¿wvewá·™nFu©§úóö¶tBgºð€©Ö5¹áÏÓA[›VL×Gû¸^*Æá‚0ܘܹ»UoxYpzMé™H_“$Zkˆœƒ6uY³–.±¤FÍ�ZÎ~­m6ëwqÄêQFºw ­vàöy³nNúŽÎš¦tZ™ ¯Ž¾°Í‘Sª°‡k”ܳwb·lƒȪ°<ÁÓCê½�óÇZüÝíßy‚%©|Û$df�†Ë—¼a1“H…´L%·­ ëHú g²i^&Ùem”±ïBðŸ‡2NÁ;}W^³¡&•~øxܸzCª� úuåëœÃ{Þ\Dat�Á~%°vyMñ!}š°\ƒ8‰XI¤Ý{’[ü§iK”ÁQá°œmh´¢bRŸ:Ó�€Ã·¿"vâ’À8v{³!I*`Ž_^Ö}_³6Ñà�¹Z¬fÛ®¾Aô\vT¦lGʲ$7È�p9€ÜñȈ‡R¯�`ªùæÿPk�—³o,³Ï`¬ƒ²^ôÙ1/ÉU–Ë&P¨ñÑakŒ“zü½¤ŽõsÁŽÑû‘[›YAèo¤ñáù‚É/quh$™µ{8Ó¤on±­ãw…<�.¦öZMH"!êâ<=o=ä:Ü̵S–›G…ˆÕzË¡^»Ç)žv N0vdJ]ã|&­N±ä rháZm‡à`ù)œˆöVî…œž¶ûÓãÛC~öú6¹Ñwð1.0–ᩚ™2iñ~q«&Y— Ôò°Rì[”,’�—×’f€á ¸KX7SÝ’Æýîï}ÏGPx‚èvô%òÂyþðëÝäÞDçþ߀ ßï÷çÉûäç~­Åbÿœb·ü™ßôÕÏù=Zj¡åš~†.Ejcî-¢ì0Þ6%ñyù0d•ë¤C_\Î0‘~¯‰Î[<Éí6èºÝà±ñØþÙbsØëbê~+h %î§Ï°˜ļ_‡¿3XaÛl€m �x­ÐðÆô00¬�\ìÀÃ0ïoârØGoZ®Æ³LE¯wYFŸ/ ¹�ü«lé²@”®œÚò¡‚f ‹{¿Yë‰�·_�0îÌ2Ù*Ï¡w®tÅîèæÆR4Žot�Ö ýŠ# BØË}œØ4_¤:áëÕ“/Þ{ä…ˆ9ùv¡ÃJÊ+®øgí!¼…ñŒãÚÐ;H¨)�ÛÁl8X<�äÞŽÛiLJÇ-B‚'q»mpÝéWiŽ÷b·½ì~ݾÝ7y=ߣb),ªÉò  ÞÂZ¯¨«š|xï`nM[¸ñ¼ý¶éA¯9«)íséçë Ãñ˜0l…ç‹Ê™Ö@F‡�©fö<ö;7Àˆø_U³Z�ÃVL•?Ö¸|@Có…Ý8¼½o:àQÒyÊ›Ws›kv‡¤bj“¾ Àsc•³}*ý�O#~uÝwû¾)ž_[WÒþ‹~$lÜžY•¤Ñ>y«”Û® >ø² ÷Ê’ëÁÆw¼^oÓ{_£7Jýô§ë§x3«‚îÆ¿t¾†”_zå_g+ºiàX…yëu€7˜wâãà½÷ñû D©î{(NYmà-k.ð ¤0¦#×%`5€ep@¤Þ�êÝ�pi÷ÈiÒFNõϸðœÇN4* Wݵçõ7¬C3®Ÿl(©/‚jÍò™‰äþ³S5.tõ¥Ð€õq‰QìæÛ9´_4-UÎ`¥“â1+ÛÅ5SwÜ‘Fó«5RaSëû2£lòèv™5¤±Ò0«YC.:–Ldô’†ƒ_‹ ®àrÂÒð玳ÆñÑYQe¯ay¥�åîƒÎzmòÚÓ.¬Ö(rÞ �íùiº{ˆ°Kv†É€…61 ï—~=¯ÄPBvát�˜jtA¥”¬:3ÖjÊlÉ2Êp¾†'q™T… %Û¡ ‘H:ãÎ9š,ܰ�P˜u9A•z…öÕœEî’½$oa¢EÅKZÿ�ZSeŠ~3’OõÜ÷e9­9)Kp�^ $¾+ï¶ý's4�UãéÓ5üPhº&\?Àš}bñ_w¾wܳ@CuäÓ} ×þ§œ~ÄáKÌ¿F´œRFC±d&yªìãWû×5ÓÊXBþëáöH`XoG /± ËwKûµ› LÜIÀ@S„½HòŒY(jáŒòí‚�æSDž”\Bû{³wVè Â|2Iê×ׯ?‰e7ç6:µ6'½ oA8§—.„Xj,~z¾*¸¡²­Ï™£®“íu6±~ÄYŸU\Âf_kr2¶ÝÁñºXµª”ìù8îÖf…aÖ@×Ý,Ÿ0mW>}À�åƒ3�<ížÓlá^xÚ˜eºvhw€±‰*ή ç ÓVxm �Ò %&-Î� -c=q�ß©�‹=#,s'¥»ûíc´çÕ— òÚýïš3ë¾cØdiäûö‰XŽyy�çpŸ¤`ûýÀI±govS­3nc(8u àìŠa†8KR; Zµ–C ‹ÀÚ¬kôìÕ¯ä#+ôÁ»Ü_H{{ËÑÇ®a×Ò¾�ìu!hm²¨õIVyk÷dCSláºÄŸ]‹3„0%ĉ!�k ²ÞiåŸ6Ö�#ÌÑ�ûeø¼”À1½Òì‹z26È*%b`̼¸0æ“v-YŽ/v=ãЍ®±UŽ÷ Ó§z°âж£²%¾ïÁûm{ýÿëkZªÿÒªš¶•­Rª­³km*²ÖmiZÖšÕªkj•­¶²ÛmKVÙml¶ÔÛVÓm¶•kZÒÛVZÚUª€0 0 ÏRÿŠ|Q½çQšû�UEÞÿyÃúd ý°<96’õoè"û¹ÓßðÕ¿ « J¥‹ Ñ’åéQކÙÉ5§¸ŠkK=�¬ö3,áÔ,¬•`ÄYï´z)úË„j^ßJ—© 9†ÖæÁÎ짪RùG×uû�:NzLU àøP`”U&mÁ&ÏšåÑëqÝ_õé«lz,JÖã;º7nê!´ è}cáž…«¸áZփ¸0�?Lô±¶úx´ãËo(8¿cö”²ôž™ .Œh±k“þ›Xáy»I£µ5Ï2ç½DЉ³çðp°ß\9ÆÁÇÎ�ø”ýõÊ÷-9oÔŸÒAײð-#f˜ K�:ÅÀ_l$–`<Ð…öy‹¶¯ÛÛ1cw·cÕ�ó Öêí�lWÙ–Ôgföé-²ã²�¤rÚÈŠÖ!OšŽ seÎAh5ÙˆÑ  œ*šfÑ¡ M+ssVÕÇtkŒë”Ø� n�þé}g?¡“|ì"Àñçè Æv)6·‹ª^ô�ÒÙ®gãe¦û2ÉS|·Çí¿»�–¼Ç"YÁ�ØÛ|¼¡DÛ/WŽES¸?'=`=™c“Äw yû€ó``_fïáÖ!rO-°_ÖúþåY²½øˆ¸}6Ú[7¤A•ð]Ú‚%ˆo-{Ú’}I6ËeŽ<†ï)w¡aúo!ªZl£o‹;nñ¸{s¹u1¢Ø¾óIÎÉÖðc©™ãÕ‰ ÜÂ4¶âçˆüú-Õ‚Ùôv4y¥Ò !Ç/—A«ý_˜=ž²Šìf@©¶e¼ÝUý¶ú΃ÉT#&V¾°Š[Q. , móùãîT7›êú•¿àœW•ï¬ÌçºÐgèÅsŽO¼›õÉÝÛŸ¤íñÚŠh6�[:˜¢u–… Û©Ä]üúµBRgáü½÷³°XAÉcšÕM0jO{("Ùå#Hšgϰà–jŒcVÙÌ 8‚;—Ç•V µk‚†h›œª1÷*mÅl �¨Cxö SBnOš9?!I+mm‚mëRÏQ”¾êŒã¨ß(>¯¤À}Ž5ɯ±º´…ïUÞ…}̃üç<ÆscÕlöþàŸÝ\þú ­ñ�rîÎvSHóï ö«Îädì‰1µx€\»k�ˆ¹›»À•yóvñssÒ.ï¯Hä«ÃÔ¼þ`ŸgkmìÔÿKó¡YÉXäu/ ä66[¯Š)09­§6Ë-Ä‘¯¯™2K†l 0×Ä ·_¶<l35–aV³Û��“9z泤°¢”ÖNwY¹bkäÇÈaÁL[@§×6|Ø%_-òhÅpÔ=n¨žZ•î¡dÆ›{¢C�ý`ô0SºWf6zX›wCçt~.¨ÐI�vožŽîÖì¶6䔋Ø6oûâfx¿bÁxÍÆá�\%cwm€ëgÕ›—v|ödø½é¹Ôø[±ÃºWÏlX2D7Šà‚ïíÓÏ1ಪÜ2Ó„ùÞþ’Y-üúhŒ ™»ßnv<öTTMDú¶k• õÑ óâñxõÞ&é¾Ä/ƒIdU¨Ž½¤Œ¿ï‘+t[Vh ö?´:Ž´\ŒÝqùœŽü|0bÆW¸da–ägúô& ÷}ÜÍ0êêÀEr½…Ì1LÖ”p€ >– ÑgØ6¯É¡<š­x·ÃØæìµÌ¬É4<÷3².óòÛó†PÍ3ºV)C6@—>üŽÛè9àG¡—;-R&¡õVÓ|DÑç43ìZH¬ bÂ8š´áÌuAÔ|’Z›µg]jõ3xžq ¦“ÁwâiOYk笎ÜP°)Ò�X�`ùÁ«7“nþU;ãiñ~k(aÈåty[I;*2óHüäŽù•-ó¼{KŽ5ÑïÙÐZi-Ò°q‚æÿCø5.xM°&&‘ Ó¦XøÏb;m| À½€-ð-|• <@¶/Q‚2Eè�4‹QDnj·Ò]sµVŒeF ,cEt$¶°÷Ñ‚¯Û…>R‡âN‡T%ù~d†Z·9gbÖ�É&u‚Ä6@²&€ÅBH‡�%”C…ÓjÌ`æÙ—Js+\þ¾|5íùà/îk ¢Qß¹´Aßlâs@t¨©Ï`øDv” ò 3…°¦î9 í£“92®Š�3B“‹ Eþ=i…#: ë|}xîÎW(AD8Rв€¥ªjtýÇ×é¾ ö.Îc:dµf›õ§+Ò^NËà};ÇžÃ}§0[=�2@ž„É[<†@õ �K½Æ È-81•„fä<Ю˜ÿ#A@ª€Á‡+ÞŽ~±röZÞ;¾âà–%ê=¨kJ¾@eLî·­—q7L4µƒ— n0h´õwÀ¶,œ`çí,RL ‡q~µJd5Þà–j–úåµ};€R�˜¼ŸÛ•Wh:ó%·ã ßõm!7–¨’è^9F¿Itõtj9Á¿O�Nñƽ±Ìê ð|;2ÆsžZàœ¬¿w³h3ýit‹É÷ƒ|&>Á|m¾è¯×_g’¹:Ûì¨&=ý´XzÁ…Xzª<ãš¿´ûÜ9ÃfP€Œ#Àºýf?:Ï0�zK�èL¯ ‰NÂC?ë¸gZqL¶m;ÙÜòLE0ÐïLQaLÒS8h(1Þ` :++s~pŽˆ `¥‚‚÷ºÈ×·iš¢ Mr{Æí…˜ÖázÝ2r¬ì¸³”Ô6Äx–9ž)zºò´Z ‘£7˜*+žK°P.Š�[¼žNûºÙ\Á�òïÉ45;j e©úÓC€®­á$swý¬…BQ3Ú&ù½Ã°‹ž¢|Ó¿™àaþ>`/ÉÐã…W{ך»¤Ç.À°ÎfêEgk:о9ÕŽ’ã0ºifí_:¸Êø4a—²(Ê­¼Aˆ1WÂ䯕F7p?Ñù0ÉÂá# zzdæˆ.er½�.¡�õlŸû?KþæQ/ Â'##~YoøÝ ›ª`‡åžO 5\Í6oªTÏ· îF¸í6›s#'4:IÎ"‰‰=íÄ�7u$¹z¸ªæ�oŠ Rn6†áw4¯}ÀZÐüF"ÝPÎÓÕ蓻ΠÙíBL%‹eó—kÊ3a„ÌB%0ºªL²¯)‹\ ئ"Ng¶PŠM®VÌ¢ dò•œ#þm1îöbäÏ{×KTGudŽ]¹ózŠ»¿èDæOW¼í—¸Áóxº~3ë{"ïW�³§…;{ÖS¶è+„난Š'h�v¼{)4ñj ±TËã»Ò74ÛÛ5®Mˆ\Êk¾y³¹�qo6ÏÖÌØŸ„²1HhŠ|lŠf×7° ²ZÓÚ{ÈÜÇ’'š4Ï5œ/žÍz÷i¦Ež¨(¬&Í븰øü[™¢Ë�½–)”ëà�¬4{Of¡]æYB ÍG Él·3‚^:·øÊmÒÉ‚}8bŸ‰p»äoŽ�ƒ|™ÌP³ÚÏ«{5±É¡ÔÆXA Tɳ5z™”‹mQΓɾ)›4{5¾‚mGšV_‹†È¾÷’ïA±©�Üf¤8¡® –ØH�B¶Õd”l„qËÔÄúdјâøv{õn`NUžÏÔŽf[¤è8 ¸Uñ'ã ¢i- ·ÇïD�X² “Q°Bµ¸%Çm¹KÐm Ò»´å©ÆØÝ“2fž5Æ'O(Û¡ì%lf»èpüy¤Ã ”óÙæQÿ;Óo×ÒÂîò9IÑ<[SÅÈZ×ýÉ8Âu¹¨éæ[l½ßw§)î@棌¬r›%nK†{RZAÛ ™Ë¯Eñžâ.Z½`6Âqm&ܹcÖXÇ!`¥gÆR΢s|¿�ãÌä\å1†î¡±\oK»ŽïéÞÕ´1lLn5bÜš‚H¶­>ÖB³8ä"¶w~Å}ÞÎÅÉ…B(~zTЇ›ì¶~Ùx¹ö,Z0Áï7[6X>âͽL»Ç5g GØÜýÝmèp�ÃTâ�UÑϛǡzÏR–byô½Òòºf–Ê´XÃÔ|@Å{+eî5;B�B˜Ø½<À=ЇPÚô¨ïX]"—ÇàwžNÛJÙàÏ~FÐh3wf A+9öö0/x“Ý®¶ï—ê#'.0âN¯vêhgkWç*O@['�߀:uãè©Âïb­Ô±_ú±ã AP숣ˆÒÌ3]þEA+ÔÌï u‡àI\R!Ù öß}‰/.‚W{ÐWB-[ƹ1ðo â¹ê§Ge÷»h¥\%yÖ¹vI†ÊËkLóX°s ©ÒéÇ:ê /ÒF £­Þo\D *²d3AqØp©sŠŽeþÇÄRƒ¤ê0®€V²¦s6^.y!ÔOGZÔÈcsLZì°©B«\ƒ¹,¯‚[YǪ¬yؼ/m›“eYí¬E””w Ÿ'k;š´`*¸%ûe{ý5?c=q[ÎÀ Ì‘0�|¦éZ*â&V²5Âr¡[®£…i‚2´Ö»¼&æPq»P6DÌâOÇÝ[ ýŠ!¬§I0µ·FÉWèw»]{ºÀ–±Œ%3Û§Û}3åJ‚ E” {ÅÖìÙu§ï“Ý#áò¹ß6M}÷º=ê‘ÿÑ�r[¶¯™šÿ†»yІ›Úü|9�ï+3Ïô›d'é† íÁ†ãÃL4(²Ûù4ò!ñsB7 ¢=}nÁ†ÛÛ¸;æf4 À¥ë8ùޱõö nÉíœ#Êý&](’iBQôYÿX¬Ûà“V ó{ÚÛiÐpG˜cÞãô³Û zËåa?dk¿+ GÃ4�,ˆÅ¾¸¯´òí`ºF#ÙµöøôXÓ;¼_åŒÄ”H�óƒxa¼@-Ø_Or6Ç{ÇÇM¬™bCÜ´¯Ú?Vέ¾è!-ªrÜGOËAÛâG‚�Ét’R]˜’–ÑR��JµØZÜX8˜þ\ ¨ÕfLåE=ͶÍc\%ž?o@$°8SÞD,à"Ì}{>q<±”+÷¥LX­6å/ká€y¶¡5ÚR9¦‡HÐÊ’´ã°ÉV+¾( ~ªo!Ë2“ÅÊ;ž.pݬ“:ßïctÚ ™±=¬S¡45!Z?pàØæŒŽ푾 QOìòì¯Òåq%,p3Ô.•âFgg*“x îí•õüøˆ©IEil…€A!óý:¦¼À§Á…{…�”õ݇Ã_§#´(²:¬›Þ_v¶ Ô‹d�xN�•ìÖ„5û!ËQõÍ—ÔÜë4ÿsó Ñ´eýݬ~bpÒ|d|@ΤeJñFs•ž! -×¾mð‹x5ãMå}6�,JÖloܧ&‚Eñž¤¶�ï»�m£‹ñ+FðÚͼ ç—7Š¤Ò®o|¨DI5ÑcƒSl*FµCDV4JÒ°×d°uËB¾Õ}1ÛÜ;�hh8Fš—I£Ðï³/#mwÁ°X4i©cÞj§²ÛÆ#-ðY§íe ~ÑPx'û—òñ¿<ÁíLzÚ(„K/”9…âúÕ#,P­§®svçß`'šê}‡z·Û­ÁU¿|èÅ Ü<�Žº=@¯#Ñ|Øb΋�%´ä9o�eI³¥{«°)^5?3ašGZõÉñ‹ß­i bÀ­ùÁH²x´ã"{ï»"×(Sh¼íè:ån°Ò2EÑð_ ³ÿýÞƒço,ûV¯þÏ«êÖ^Á¬X*ð¢×x’�Ä?º/ƒJàˆ~ón"ªfv¿=›ž{Ò…õsõâ+JÁðýήú]gÛé}âCS°fÛ " „SMÚŽÄkY¸ÞID3f­TV±°gÆ6§Ýýéöaôã¢n؎ȘãàÛ[K�»Tß½ÇÞrþ³ŽC³ÖQ2=زø˜d: h÷«¥1E> ¹×ØF-Áƒ[¾«#vaŽ4Är‚,<šMæhp u©�Ö1{3h¬ d¼Å@ˆ>¯ÃÔ_9ÚEˆÍúùšÂŽ0ÀZÈ›®wc\¸âܰÕmé,Χm‹ ±~ªR´g {5�/ÛE;«ìfõUÍç·ë-^–él6±[y ” ÚîžÙìw5Þ_PB’žy�U � 1¢×-®Å½Í³Œv.vÝÏ™ÊT;Ò,ó›¶_0œ9ä{㢄mw˜ïÎîÖb!Õd±æ:A�mÈžá&Lc.°ëD.vý`Pí ÊÖ¦¾O(ç÷BBØ&»ù+#Ýk¿ˆ!ÉÑSt"µ hîúW[Xœ¨½ì!'[åpüéÉŸ¼|¨¶ân�ù{°Wòë!‹ùñÀÏØ�[&Ú=ŽqË0VàäLa¬ï=ÉíP�iG¬ÿ'ÍÙâNœ·˜Ð`rÀ¼‡Ù0s«ò–¶ú±¯­ÀºYt{6÷Ž?"Øã;ÉèE#Uݺ¨É-¬ ðæðƒû9±ÌèMGœ;o«?ã5Ü6³”kWô÷z—»‰¼„ »+mnò=]”…S³¦÷ŸMòµ ùMg#d¸@¦ý³zæ¬o›r·l]“ᾊˆÄ— 1=�½�ÖJÍ1½±ûmÆ@#I>¿cœÀZt|Ãf–PÓÜ(ÁNZŒÜr'–F@jñ%­pìüö]íã¬ïüJ »é×£øK`¼Í+wöÆà”ó’.aufjãÚ—n|H*:^….ð7å|nÊmqûeC‹ùÀ×c¯ýU�ì"„CŒf.âûÒv3zŸµ‘íݧÊS'îë"F†ˆ¾Æ@W¥Ä Õ¹)Û`>{I¼8ð�6Jë3.g±Çιù´µ1�AÏ@ÃÒãÀÖŠ“#€¢ÒÓ/ÚÑã¼+ïD"|ÌuÜÐúœäþfiÝ÷·áM‘£ìuË^í6¼”�= 3‡4ͶÇë_²¯Ã­~Ïse»ÕÇäÀ¢f+@¶Ã¢t?ïÀqí&¤YºÇqÔtÏãìå.åû�I€ÊÉI§·ãÎIm3õÞÚáÓEÅSGZ‚qßÉ» …!dÌTb±`‹J’Úâ U+ônÑlcï½)jçÂ:«�á«cëexÍÍ;D0¤:ÝèC¾Ã�=wF,&íÁ0û™«ó�í[Ä‘`–h׳ƒMs§l¿ˆY+¨»ëh!H÷‡ÛU[/ÙŠ¾`®¶|Öµ�›K½»G>Þ¼ï›S�óÖÚá!M¤¡&¼0í‡?¬¬ ŸïÊúéª1àå0´å�¼¢…“Í`BµbÚN2˜©†Ñý ,‹[åRÀ�‡6½‹V¾±c²Ë‰ªÏxý9NIJ¤w)ƓϕyŽîŸO½º‚ZíÛïò³¢$‰”K\LÒ²"KQbÊà±µ'×+‰çã™”´îB>`­r9­¥e‰3*X»®/黋“—³·~¢› ï*yæÖÙTë 8Ø%[Ê3+¥Bþú§ZmÕ,‡j¼ù>·ÜWÐ�…ó{Ø'.aÖç6.x ¾Êú¸=•ÓØ•è‹â=cŸ/ÙÕÑláDý[ŽA¤r|¥\ §5EQ*qÚ¸Y†ÌcVAKP¦¸Ý®/Sm¶Ê/}qåóàÞŸ[DéDF‡áHûA; “Žƒ@\W¾Üxx˜kJcB.Î:áOÉ[NH›Ð®ì[ë#Ü�ó��‚uªg`^2k�œw¾¦¸Õðd�n°#±9(…3ÊÎ˃sÁ*^Ú»ÈáJŠÔÏ]> GKK{ð æu»ßžfëݵÔ8ì£ï¿ØW†u´]•dXÃêKjrÆrÐ$R>fǪ»‡^»Fv ®0÷£�çA¾‘I“6%½�è_©Þ«ãZÍ�jÒ=�š¤ì[Èa‹ÆŠnÿ]jrúOsæ¤Àé^V¬9­ÄÊÌ!ŸoÌ{™ÍõènøôªÙgY*Ÿ>z¿n­´œ²¾~µÙÅèAþ^cÀ{×ʲ÷›Œ[³:‰KmOîâ~Ü'=è¹ûèbM¿.nš5Uä’á­%ÆÊ„†û›_ç\Re´š·jÙÙ�íU›¸! `ʹË$Es@J沃öŽC»& *¢xq>gdª¸¯ÅðØsmk'lП§v±"úý 5wvl{Ý50žcÙçç¨ä®7óZß1é@øTãöÂཽŽYmsì%ƒ1%>Æ·æ~Ü9ÍøS×½ù­\ÛÁÝä*¥ò‡¦x‡73ÄAu·Øë–ÐfÁ ~lÜÙƒ€í@d„ímdpãðà ØõKLæ‚°Vf]kö„í]âøW§¼É’6aÒ€}¿¸Ò!æ¿ÍåË‚!ûÞ¬|Ý*=Å7gxþéæ±Ô°0a½ êSŸT cs3ÁŒ)ŸKò!¦ Ò¼MÒ_ˆÿ¼¶²æÝ)�÷þ `î,>bìi"ªŽòÌ3æ&�Å.†ëà{¥5MENli› Lj‰¹r’@ݦÌI&ÈÉœåžtó¥“Ð<ýs¿êkcKÒÐjuä‰S"S rIñPÒÏÝ„LöB!Ysq°�Û꽊ÿ0Z»&ÕlB¯—Ù�æBƒqu’A³_hû{ï~›’Fö¼*Ót y9îËàª?·ÚC–÷è ÜÐám,í­7W·}'“(E¢¥U¿Èü ì7;½¨�ËýX×�ZóLЭ÷pCúÉ— ߈Êoí 9ó×>º®ü=…ã8å•Á�LÍ͆µ©ßc[îÄùš�ÂLW`�Áå<aQ(V!s7=¤¯K Ÿ*Ç»–i´¡�Ìø@£ßæ ï�è¾Ù0§P\X†•ùÓ„3lë|Ý�3\÷ù4ѧÓ>ë, _«§¤0q#—¦»Lk¯Á.)˜N-‘?äG ¸Êü‰­ê>_§Ï)÷׎]tÖì}�ÐèHP!-´ê¸¾oåˆ�Ð…B9ÜéÚo7¬bÅ*ŠÂŠQv`¸Ó_´*dÜ­Ú7|�||´b„šg—¸5!ÿnÛ½VÚ! ‚pÜ”©/B‰.§ªÃ FÁôïÞh•<÷Õõ»\esbÝ®¾ÀwW°Ñ&n®…Jq—bÈèæ3 UÁð+O4V!ÎY"8�ÜjL+¢¹'ö“Ž-¼ƒäb ¶±yd Þ_2V~œª¢?mbßBØ,‚k ÁT\P CÿÚNš<4uÏìOË‹¼œl6¶ ãÀO†ú1´Y_šR·‚Ð Ä¡•l P¶$•2½¾fÁ÷\ìN6}Ÿ#™@¿9•ÜKߟ“¯®ë¼þ0+ÙºÏQn÷ŠpÊ®,ŽÙøáo72TÉÀD o¸>ô+.ñº?hÎA‹ [jÕìwl±,.Ç1@¡°�¶ößsy÷Ym³ÁàH‡,‰ç§?ªrÝö0=|¢'Bm�7Ķç1jo`%Ûù�kx™iY¥™5=Åñ¾ð7¥ÅfâšËnöJ›1ïa,;ÏÎÐ[Pé˜ÔÀé±´À‡žn³ºº­ÐÝJ²`ñû7](²íˆ*8“)N)úî'幂 aÚû<’ì™,2„q~k|$`›J€éBGHùúI~Îõz¾iqÄ ƒRöxõš,E1â²¾cÍåì·Q •^¤ßœwfmœX4©jÊ<…ü;õÄ×L¿´Ëš%î¬V„͹-÷½ûòûÉ(s[7�\ºÑ3½çs‹õy1Ø‚·ÓMãyä¯Á!þ^é…¨ 0WÍòš¸EaUÈ_q2ðª®ôZËÂ[Cð$ÐæxÙûG¬8oƒÉèϽv\�é…ÂëNˆIYÀ}z÷ aU>‹ú/9y«6UŽVv 2ò –e@—˜ðjž)"–/8Ù�޵ ™C玹ûŽ.¯hÜrÆ,9mf–æ `ƒ¼Õ&©MÇ,”õEY+Ñ ‰œ)ݧ1)ž†rg‰«¦±;¾KQ£¾1·£ ï3ÇÊ�Œ\îÓ(|·,3tÝ/`)x%BÄyŽ^²× ~¿{¸ᛢzµÜÛ�öÈ2ÐÌð§y[ðÂq›É—Ë›X>ðgV˜ÉÝƒÆØ@m¾pÑ­�¼ðè‘®ƒL\n‹=\Ô_ …ÉÄêq«V‘Y5†ù|Å–[÷k˜ÝòÐ̵bÈ >pè¨Øõâ~VxìeßpÐd$ÄC £àÁ]ÀbÏ ì|9´úûäòÎy_r‰Í —äš®}¢&M×H”ÕÉK6²ÖwÜ(qf|ö:l쀺dtnöë_€…£®à_ÈŒ �:å[õ˜�‰hå,¥ZFc ¡¬úc.|¦ Æ6‡“'÷©Ö“.›9°é‚îU}R­nÏÚ²k!�x�ºBœ˜ƒç—¬yHÃlö·=¢îQÅùc‰ÀXÍÔ(÷máË ¥øo°uPˆ ¬['x¤²<[Ò7Âàra½ÛÉZhJ.ߥW\Ûy½�  È"(ªzSp�äÔÅVŒ¿bQpÆL'L?}–傽¿t8ãßÑ{�œ^Ý»sqPÌ™˜\æÑ¬Ñ>;¶z9ÍŸø OÍX‹›ºâç¹C ·Ï»Ûî½oñv> JË5€¼cqÔ†˜ ¯×Ò?Az(U˜·‚?yàön7G»rάž÷´ê;]mZ—c—ç\ˆã%r¶ؚŲîÓ‹lÂQrùèÄ�u³[5•µ'ãhѺZܺŸ]Ö¯B®ø(ÐôS"Í›KAML@_éâdé…W‡iýºÆÔ­ Ö¸^/yХݷ@‰ÌÞÆq³òu;å1°¬‘kvÍ5“ÒeÊÙh‹ÜiXã>£!²ÑÀáq±'0ƒq\ÍáwÌ]K3ƒß-@óTåg<ßA3ÜÍwï½�3®ÕþÁß‚[Gbð–%Ô>¼÷ W;éÚ¢ ŸSoªÝÞý½×˜Á¯ªÕ?“ÑFñp–Ú ‹sž†¯y ³ldKxñfÿ¾æè–u†Zå ï±ØÔ2t«î™hâqNlÞ�êü,ËvP~ ¿}ázæt©®UFûäPðòìïs¿,´£Š_’Ê<ñ΄�Ê3‰·,%Õdí¾¹˜[z“çš÷IG�u+wch“(¦£ÍiòŸ î}·t s†9-Ù£|�å-nr¢ý4ãb,€¼ÓŒ¢±ç K9°rù±fÓÃ[X/›Ó Í_ˆ»f°RÏ\4wÒïyÛ/ˆÚ¯’DÀ-*ó1!¥Ð±æ]*ÓGÁ)ÏËéËlÈc¶ÄùmÍŽBúm`2>·' º¿Eȯ„"SÞT¡n©°Éj°Ò<*¸„¸|¹#LÆFÄ8ÂN©‰¸ÖÛ¤�ñРK¼±;8Hr ¤ Ä —¼áîè¸/Âp¥¾lÜ½Ô ¹o{µÒù´ÔÜ×F7“],ÆÚ�ëè*ùNz,Œ­Øéê‚¶‚àî9ѵœ 5¯‡³LcW^ÏÛ¼ÞÕ›i~hD|!¡p<Øp³YÎ&»¶Y�h˜«t©ÜÛqbËG õ9‹"p÷Y\  à� ®�uoMÄæ¬›6ë¸uøiC…�áDÅß„<½šBB`#KÖ!¦ù çWvµ�­†ç}‰Üû5]ó–Ç”Z_0'V,yç±eËóè…çJzõˆ,‰WÜ u›áz Tñ÷´Zï F£VUzWy\6Ðy?s®Órl¯dÄI| vPS¢,¬ÕF¢(�hô8pòü`ƒ<=°/{Ÿ9òAsÚýC÷$á»ÿ˜ðÄ30�ÀWÅ×ß{—ÚеxwšRòó”jkÌQømnTÈçú�–(46"A—:³¢Y0IëOŸìZH,Y$ <Ó˜V5ºú>/ù9åðh/®n"×>�#.“,õ”ßûc{Šë­öý:M 6úšâ€Þ'Ý<æ4ø‚ɦ°¼¿ !½1FsM �·ZoV7‡Ä'S�éYjs£�G$ùH"±^â`…ïUd¬3oÊ‹Ë�1ÆÀuAs»¡ûªø¸À�O› ¯Ùpík�» åzÚÛÌØÏÂÔ&YÌ›4nƒÍqì0/1l“¸hÛn¬ù&Å«Ev]q† fXVïØ¶¦Hì¼Im;¡ß~Á$•é,ÍÀpe}·è¹0 š›8—•ŨÌýv!µJj'FJ¦Ñ£†t|ÒO‹cpçšáA7•† ¸_x_¨çF„ݧ±5ÉLS>y—;K²çw >Á:©ŸîEï¦áÃq~½¸ Øû4žÙ�k>ÛÄkNØÆ»HØUâX]QÈù'Ìò·j˜%|u£/c�2á nBŒºýÐ6Ú�fœ &Ü�ôŽ`Yç4Õ=Ãt:i�¾³…Tõúa¹ÅØ-»ÖÂâ2_‚oóî¬÷sø‡Ÿ�cÍ@¢Ý8Qñ3NjÐÖ8llU³ÃxêCÜ~Þ“§jŠrQ6 ‹Ž®Ö ƒϱc¿fÂÊœ·§îvS9å‹o‘taÜ]vUYµûaÖѤ7�ÁVd…øg™¾YÃÌ+æßÛåO“8mœ¯Ûk>ä€ý¿¬Yw†nö±ZÎÚĨýˆ§îèí¼õ�º]|kÉï!\[Òmå¬0ñSv’èý¶VCbT—.œ}‹â—± –M`C�ƒÚ&é+�Æ(åˆÄöZX=º ¶(ä:ø¬UƒØ«¶~F‹ã ÃÂCÉëuYö ¨ñAç UÓ˜±TE¯ra. ùoË•K„‚ao¸;’ø‚Ûß\³M-ѧ ÜGÅ>[')»Rä¶6 <6ÒólÐ×cI§FØ+Ø´¼¢¾[©õáaø” ©†O—½¹ê.dJ0Zö<ߡچÆkðm[èÇÁܸêýÈͶVÊj÷K�¶ÆGäÉ4ïìVÆ„(YÍ)¯h¼u�’Ú=íÒê­ô�Ldz ý?D¶<ÎvÅòð-S‡é#þ‰û¼ä4Yì ö0±”ÖÛ‹kmë¸2,Jgo öWä-™Þ!€•ö}Ï5-»Í¹}Ë�§Éò‚&ïo£}O Í \6^³F¼SÂ{AlÌ ZÂZ—‚Š JÐûl6µ<Ðêãt¶ œsfŒ”G9$áŽÖõ�‹qfŒBíèâûé{ßcðµ`@m×?£üŽÃ¸ÿQûnÙs-¼[¼Ç´¥Êî4/ýQuÝ›ekÍ7ämT-ºxÇ$­ƒëYnÀz,tw0øf×Oü±£{²ß˜0c�ßyÖ¼,ß΀<±Õþb…_?×ÌïÕÌòÁÅXÎÚqÔ Ö¯Æü�gsãí;‹föë£)’ܶ{ã …j>”e®]F>eMHi�B[¤Ž ~À0mÍLR¬ÝPQíìš.1ê‚ÂÌí¸ˆ[ÚMœ¡©~¶0 àQ|ˆyÉ‹IŸsP™VK\¡u±4…¯Ÿ• µÓ§á©_˜.qlà‚5yµÁRàÏïcg’øE|uµ ãA“è7Ö¾Ò_&=ÃçÌ‹›ç·»ÉÃ>ŒêÁ¯„„{-®^龜ösç£sº}•ÄÇ:¡"~@—Æ„ìÍ(ñ'Î�*Àj‹àц-©éi1³ÈÂÐ1Ö@c·�))áø äÏSBã‚`LA³èênƒC\4ÞÀ³•èv~Øk3;)h=F‹kIæcSÞnwWuõ0îéÔhÚÀ¤˜Õ|”f®á·ÖEƒ¶gÈaËHúSõE¾ÊTu4Ž*-5od//„™ëó@'ì" °n�aÐ2Øn˜Ù,…‹Å�ÚFÅ|Å òð¦q#ððh¾€~+^®ïb2 ¹ãΣ໢Ír�§…gZËùH�´arÒ³µ=/=6Å D×j¹VÆôŸŠëò"c|î_W´Å,k�Õ€ƒ ß º/ç8·ðq+[6¿Û|\Þ@¢ô†HÃãàÔö5‘ÐÝÈÅ4&èJ? øúÈZ~>$þjðÉ­ÈTm2×ãÉHk¸É Gžá«eøR�~²ÉP&ÅÇt¸\5\wîT·0²Æ&ËÍïö0®ÝM©v÷ ¬YŠ ÒØb'YüŽýRMs�ÆÀhC§æG.iyßµåO']mÆôràA`Ì"�´ ž½†œØÉœr›Ói·hãL6ïP¡ÍpOȯsOÛ?vœËV1Š:iYÓ-ÃHekr'ÓÛr( ·kûžé§zá)ö@¡…×9HÛŽ›}p�:ࢱ‰Y wì³áyeohÌBÏ£G×eÀ‡p¤µZ&á±YŒì+ß…$-Äw+}"¸XVDV{Æ<·ß¥×SrÇ7~Mê#«_^u!n”à1Þù+f<øÃ ËYwe¬ôY /::ÜÕgJ�‡BÊÁl¯qÚÝ…`PââðF~3ŠZãYn7Ùe¬>ò��¥‚oɰVá�ßSûÐ�# g1ð–¢]hÚÓ»IÃùµ.!µ›ñíç“ …Ñ�ŒÀß±’´ª—5(dƒ™ð¦§±s‘ma{ŽI …ì60xý�-º5 ½* ,(âCX¿ß+0«ŽAm«¶Bd5m?ÕtAÚɦôf›Û0î©Û�—]vF¾Ö ŸšS˜Óšú(kl'qZ†±tp£ÒiÙ2³o?‰P¥A¾¶ùÐŽ½¿6à84ô‹‰@‚v} b±Š5LføØ`*#/zmŒQ/í9ª¡as{áEm‹Õéü–j§º”‡s¾Ûm)]ârÊO‘¾íUvÑ]?ŠGb…Ì–ŒlRÂ×D·g¸)r"¾ÝRjrlþ(µ®×íóÇ<ìp•ópð«(a³Óõ})øCUÍS"Æ,:hÍ~<ö:03ßZö›rçêéö®xùÑ~käð[Üh ¾ëOÅú&B¢÷̦ fñƒc§º~â37–T%€Ã’„7—űœè†UÀO(ølã‰çú(¦9ó…>Aèí�£i¹eÌf‚பÚÇŒU»»X©‡ÛÁÛ€<–_p‡ZïV×–Ø‚õœ_&ÀA�&ÎOõAl¯”=l´Ê4EÙJ\¦”±�³]¬]|º›ZäÒq/wŠ~d3–;ìÁ8`]Pš Øq4‡Ìƺv^ɹt˜Øè=Û¥Z8m†XI­N|œB�Ód“X[^ÖÞ;z]Hø´¥ ŽZ‰P;ëÀ±×v¦üXlôpýjÝêF%Ù/‰87kkŸn¬Á½Œp…2Âüë†àJ_b|až98ç¶Y�kó(µ­4¨„>PuyRmÚ6J֜ƂíùÜÌù™0µSÞs'ëÊ”JŽI,×hB,ÒݤÂÉD¹;»)\ìññ´ýPè_À÷[rÔ «èÓKÏt…÷šËÉðÙÃ2�(ëx&û›ì«æ+®glX@´êDLY@¯ßØ`¹ˆº£Ó³$Ùìdâ>4 ò^¦«7¾®ùȆPþ[5ú}wÓNÊP<Î#î‹É†ìY{ ¹ˆ Y[¶ ¨à øÏŸ(XÊàï+¹kÙá0­ðå˜�ºƒqà"ÈÝSõ¹dg¾çV¿hÊ5�¿ _™sw¿ÌzƒˆN­Œ5¾Fœ0Õ™*i\^ç ÐÁW-Ý�…{.�Š¥`$Ye>�o¦Ñá¶/%\äC�¥á¹Dc2’6(ý¡£ï[õLÀÒÇ—äûËeûz�µ±+yNDVCpŒKÏ ™µÑ²'õºš|_TßF+½lö8…ˆkBiJunz@YnrwÙ>€œÆ_E¿]Crl}P®Þ_5�½á×FaéÍòBâ½/?U;«1zéMâÝ_}¸-.8ôæZócÅ.7 9ìâ!ò—_�"�åMŒøiä0òÆ÷¾úÆÙÆT&öéÒéºÈz'ðàü¦jTÚ7~ƒÖ®ø¢„ë§Pí[ÅÇÌ¡÷rÎL/‹ÂûuR Úß>µR À×[ErjÍõ ÷ªS€SìV¢ä¤ûRÚ¹ÚÈ�ɵì3ÏSÐ1‰¥CùKvƒ!\åëy�SÀÌÚn9¾ÒÔn,¹Á›"Ú«³=õY¦s—œe2^SjäÖpÚãÑ€ÝÙLKÍÉ1hZÅÞ±:6Qg—Ò¹©(›~ü¶~*ªhJBvo�¨äÄ”j¨ÎãÆTZ’NN3Ÿ¦ºŸKÙ�ÄøvæÌ5rÊðO×#žÛ&7~a`rΦ$†–Ú2Ür«¦[«â•HW>�Î~ƒD�=åpO1uWÒ]…‹®óœ„3�0+ÔþO—9ë�>ÇU›!ëîžöî’6É6¿1cyÝ,¥ÊŠP|-æ"ŸÇw�Òëµ?¹­ÑPï\† ns�K!Š}¼3C0wßê:O«)îwi_Ó®2ðpHŸI‹ºùÁFÛ#\l;^Á[¾“°hKå9r±±ý¼Jª}ïD°aH=Cg¿Ê“õsl䝯7<È’òþÃöÐ#É¿uMÌ]ÚÔâïx¹îi¹­ÅDcóìõݳ˜t ÈqŒï½S´˜‹ÀЗ*²]†¤AXu4–�ëVt›`8*j‡‡du B fÈZlþ áhz’óxm~�UjÁ~Ss¿CSŸïÀëN½ÍÈ‹‚C~7ì~Řô C§²Ý-ýõy£B@U©ð23è:2Õ5ÚW“wÂ¥`UÚYà•�3xž b¾fé*]|Ù]`à­Í±nöäŸx¬ÍôÀ ñ¬ÉXÝ—öð¶‡KŠAsv5ÅŒ!· Ž »Pá)ˆ¬ ™Ѱ«\•B:¶Û5oÈØr'ÛÒ�ü+FÐfKY­ëïNŸa‡Ù�ãè'æ|ˆ‰Þæ�?S@Ä�¿¡)Œ-�¿ö©cê¹·ÆœÌ$­"s&L|†�MaÔ�òG¹>[#ÉY„ÙkŒ¿.‘RÙU¹ÁÊL‹ear$¶³³IjÝ™Nqýpé…^ú«+N"²¶½�°`èö>™ÞÊå³µ¨¶d€R¯öænÀ/¿õAãyÁ/BÃXòT”~RÝKà½E)uK¯‘Å}ò7³g>ž…ñhNPÔTF}T~zž+(^cPÆÛ  çÚfìÒ„äÏ-mé:¢=‘Ü×/Á²ôr2ÔÔ =ïÁ'̘›‘§%üÇVÁ†´éoÝ�ì¤8… &à×&8$þÃPj2‡‰þʱo�ÅwüAÍÖˆ÷qËQe¢88AýœôM½´&,NÓNø0…1"Lä´fÞvš55’Su°Ý]«:ÅÿN¦oÙscBŒeo©ûƒ�²6jGk˜ÌêÎPhwX.Ú÷Nv©(™ý±g�d²mÃ�½ØY>k¬Û`tÇG³=þ´=ï†×@´0‰®qÕ%‡ÕϬzÄQO½€æŽk(^rº~Î8ª^ìqÝß'à¦gW¾Uæ/³%ñÁ8|¬Å{áÄUt!0�5k]®ykäHî3hÖÁOñ6£Iq¶ÙÈ)ãÀ)Y:Âij0› )µöZÚf|‚­6]ÖÚ„Öma \Å´ •ëˆìœj[ñºpèÓT—hœiòvÕfAîÆ´ ¤ Õ›\w�\ç¥ÃýÅmÊâU±mÂïÓ0ž,Ÿ@ËADàmÊ€-yCºjµN^ÀM®ä;ÜêØ×Y�‘™Óë­gˆË�ØÉ³hvqk&ä:WÞ"ÀmvÄ~‚Hñ )!/ŒáaØJ˜€[f—`Éö+iq>—œ^oÚ…å…{•8C8ƒØ P(d" »Æüa 85;�à ˆ6`¢%|¹�uóx Ž·©#Ž6pû%Ýkãº4Ɇ›{�¶§ÑÎ0ww_´ÙN;‡ÍÂF²ŸMmy�;š™èil|¸Ë`(šâ¥Œ‚©±»õò¼QnçLÚ,IX-øƒY)ÌøŠ-Àû¨¯ÏœÐ”ÜÕ52]ìŠÖ1el1ƒÍƒKäO#:F{ Ñ«A© At– ?*Ðn§z;ÚµYÂÒ=ôô'úèøE¾™�gz 2$Åä3h4a¡Á°"M ]åÀ½͕3r1¢jÚºYˆßo(ä*˜Ä�Þè›­Ÿdt†Üм¾yŸ®À³síÈQB¤3mjü‡†Æ¬/*˜ œç ˵îS¬ü ½æ]�ç ¡‰ûŒ´½Òæ^cê[§‚rÜÅ¿Ðþ\�XC}»¦ÛtÀ’@Úæ WÁÐà ­†yf£õ�…\È:„1ƒm)9½Ö×Õ¢ü<™I¹}wOÖÝj°4 P+… 1• Ü�LE×�ˆB !G…Ö¯™à$ÝÅw&mF>O6k_вAµúbÑÝ™MÀ¤Â)¨C¹ Çë»YC]~òÀÌú0LIuQ=gØî'Mº’¸Ýdx@ž`¿ì‰02¡®´sœ/ol�0å�ö„Å‚’ÆèçxlyÀõËfß–Wí¹m»Ê7�³q`à{�-ô¬ÇG¯iºëbû›õä$Š }‚‹¸ás0ãšÙßò%L~Bøéý›‡Ñpßöºa}kÙ>Øb \$!Á§pîE×f·xKâq¤ïÜØë½×gÙy*(PÜxãÂ6QB<5vT1óºcëHÜz²É±”,™Yxÿ8àœÀ}½îûc"ˆµ:åLŽVY Õ”UHlîN%¤9!‡´*¼¿å¢^ÝtX9£{`¢¥3Pí½¬ZÛÎ÷k#;JåWã„¶9@‘uá—”9B¥ ðä“ǬÛá8‹Ž+ÈtZ÷˜ç;.tñ©Ý{K}dŽÀöün†M‰yôìÿI¿a@ì*­Q«èB,H$[õX | 7³ÇÍ8r,ÈtNõ-ÛMš4;ßìåÛî(dǨŸŒ0^7?‡_ è'íæÛ ³d�oYÅfÀÜ׺»¥Tá6�V¹b¶mqî":o¶±Áeú2(‹#¥{ØìÅy×�áêëòu¡Çóh¬ÎÈŸ„—Z°b91«V¬i¼‡”·ž'ç¾7yõ�~w„(H"8Wùˆàú(Dë&¨N¼8rõ”_9öo|)B¼y[iˆ�Îm£ªÎ,ÃX´Í´óòóóMކ˜|M~j p}„Ã<Æ:›Ÿ_¯FD{¦0bü4ðaýõÝS;èÎq9Pà‚ò ÓÝ)îôͨ?³újôÇ÷ê–3�B“¹ž¾"–é%Œ½‹Ê!_°_d18 Þx„;Üüþ¿=H¬`u}{~E ³}èK-§¤V�ÁµÉ“«‚"¹+Æ39xÊàƒ’7_ܘ|rNb8’Vêç=z¶ßæ2jô¡,�fËäåú½QõQZáU‘ˆÁ”ÚÀÞŸ^C0¾]øá”\¿ #p2& ã9,œÃì1M€Pµ“Dç»oIš…kH�¹ÜìA¤rU´£´p‘Ü!. MÜ ô9r¥Wϵž@@,¶]Y`è#ù É�"ÀV:ÞÒ‘oMì&À­›äŸc{ŽEò¹Y£®‡»0a�TÂi½q6Ù±Å÷·òûw|$Ç*P $·€'Ô]OÃå;®ójÈ3[¶N²¢¸‡ñ°ë6èúZƒn"¿ž(9Áx�‹,�Ü}™Q¿Ë}þÂ�@ Y˜í=yìëž®9¬•ažß î»cès!Ó>JnöAV.PrfÁ.—¸mö€à,Ooa(”Ž øV†ÛzkÊÀ^Ë_€G�î¾›Ha=Þ#â£,ÐܱªŒë$Ÿ9‡ÎÉ»~&`·õ‰x�Çn£«‰ Ž†áS·Üÿ*_ÝÚƒ ‡/ôæ¡»qr( M­• w³àèJdÏqÖ_©!Õ¹Ap<‡‘üê?gZÐ6§}J¾¼¸âwaé®ábï_Tä"ì,ƒ…‡5ÔÖÁÑoƒB;ê_¨!móâ�¦[Ù«;ÅݼŒ«ÝÅÇx;Ú–„̬RÜp¶*×ÖæÕhuÝB[©°å;¬ÂѱÂÅ4z1—èeñ¸õ ÚÝt0ãnè_�ý��/iù6«”½ñÛ»ŠÅܹu²ŽØT+­³=ÅðÏ«Ùh —ò´Çz캓¾Âà›°fÒÿAe£ޱ#NN㸜àì˜[HlŠÏl$Û8u›`ÜéA æîø•sw|ª]\ÀZi×½;Àqßg)† Ð ÝS'ãü f $ƒ‡‚‹�Ôf)^¹‹ì8Î8P‰oZ`?B\t€›{ƒ½¿cõFòÛ ÜÒùã¤l‹˜ó ÝY¿bù˜ûZKo_eã0+É2IfÇÀŠºRÓ)}lÈ#©næd£d¸Cªô—³€ˆ¼;ëôêJ[OáÎ÷�Xî>Ž~ö «Q򮧣5–Ü (ÂáÉÏ ƒ[•»œsä¢FDÚ�ô }Y¨-5Š5¦ãèô&¯ç`ÄŸ‹;*{‘µ[[<þË¥À­œ4bT•˜Óñ£x­e“Lð\2ZôP[kXXqɸ|Í}£g�RCn§?WBÓR‹ÜÁ¦Ûy‰Î5$³ºÄeÊÓ]ÄΞqåÈÉ ÚSº¡­_R%g²er!EŒígI�g@êÖž.¤1esÓå 2`;Òª&mI™½ü²ùªüt/¾êüõm'w×­)HPdhtÚø¾mó‘é.ré–ºð�¤ßÊ¡pžDª…—lwªÖ3tˆ¾¬›C%Ĺ;_è ³Éñ;ÌN_²â%Êâ|n'œŽßy>NcËb±crŠoÛô,�%·ùζô± X͹„áô–†Ûvqö¦Ÿ=Ù%ž3„}_q$5$Cu;++zÚÀJ¥Ö«Ó¨(ÜçãÈ®¡`äU°ÿ…ÇzK+p«œª±­iúN 4$SŒZ¡ d4sñh7.¶Í¬Bé…Î[ÕÞ­Œ©mäÈ~”4†ëIb/�A¯Ò··“$@B–ú8&刭P;‡›~�pÕQ·¹‘ª §úwÑ‹žÛŸßs!϶8nzÆðo̘o—²õ?±Ÿç�«é;Ì2ë*4Ÿ”óSg[|öóMEŒg"\�ª+¸-< \}ĤÚvÙö*-;L¬¥’PøÆà70µïû ßXjm¸Üñr”ÛÀñKY÷3UPXÒ^›�CͳùŸ­y…–!Œ=§¦\ë —À<ÚM$ÙŠXwUIÏêÛžN²¤ÚøÓ�§]bcŒ®ɆãTƒyQìÄÃs8¶Û aÍä*ÝÊ;d(Ž‚ûÛ%ËÊJ\¦ÏÜLô6¼[ ¡ª½²«ÅИùcËA—kË[ŒÙæ iTØótÓ}y„7J{É™ÖqwøVºPož�.†â†5Îû·NKw ²q�BŠÉû¸â�8:à8°,B†�õ¬šV)`PE!¡SxEý}Eå_‚w½ ^I!„Š �ÉPWj+´Á¹Ó~$—ùtv˜ôŽ5‰xK¯ø\kÀ¡ßu|?ÜÄõɼW†(3Ö*ÑŒ²û ¹tœ¨ MÑô˜¹SµenÙ`å …Ê…÷»ŠúUz•ÇîòY³nîË-¯Õ±#7½°„±©aLôÁ¬etÈ.öà/ãºqxèK½”Ò&«h*@/#¥*;â�}rüš¨âèàÐJlçf¢ö›4f²"MÛÏ(7¹pI7øeŠÀßÑËrß?ozà ëm¶>9)8]�@ë,ò÷ÌX r4�2¥”¯zéîX£Ø@;ÎgÕ,ùw€&”A,—YäºÊÈg©/¯ÊõúåÀÕµs¥§€Ê«}%edÐm¯²Þjæ™`k6æœÙ®£bŠaX‹‚|8|ÜïW\N"c[@|¨Ž ±WJ &qÓ`ؤ…Äf,ö�>Çep@ ¼´´Èlþ™ò^ÊD™1–ȵ�x³. =´Ñ`k‚5›-×è´f¡÷81nCÙvd'·$°†u“]îëô^ú=+ÄþãßAjÀ$“úSÖÍ!0ñ"w~0u§e-¬±l€~lOZe¸+<×O×—‡YH«/éý˜;@[® —ëbvbQû·¤–È#ÃX6ÇMxG› ±6Ô31Š=ÇihcEëèØO$h`Y"µZ#4Q `%ã/u¯²Í±.…ã³¶©`—�wsP" jãгKùò’ÖäÎà �Ñ8¶•ÛúàŠ¥1Ôn'˜æ>�»duñ^uïÄ ¼'ØÕûc|øR”ð{À:?“,JKÍ mþzãë;ÏL_~ìK¢ Õ¨]aÀjY¯ÜL”o_ex0¢øŽu8ÜX伨ÒsÄ0·JF§>+òIL‚ïúïØ!±(ó;µjŽ�™—�9U´pqTïØé™áI‡+6{k^sè`Ïä}È5Æbs†;d±\(­u¸›Ï7óò/¾ñ°ÉŽƒ2+± ðh!»É¶ætÖ[ Êsƒu‘30ÐùÊ­:›sÑ1"Øá ëÄÜ�ö—®á˜ 2*wm¢Û@Ð÷&WcÜV¬Åq#àŒo77Š[l~›bý4bMì‹�ÖÝác)e"û¥J¬¡S±:q—˜þÒ¼7€å-îl¡!ÍVï‘ å¾W§y{”þËœ�àQÕvï/×T¥ÅÚ ­wxOî)k¯´úõõ¾—ÅË3òìÿ#$Q§ªÚÑ8ð ê­s³0žy+߇熔„›¹E ™ˆÌ½rˆ–�CYÆÙ¶M[~δX T•;pa9Í[ÊZá¦.¦¹½L¨”vµmí¬Ý +{<| ]DÓv•â*ä¶›žbº×‘ÐSìŸ tI—E9Bèvö\ë:³ºŒ5º�·ÌóH3wÄîL& ít-Õ£=Ù̬Œ’ïó 2³¸ˆºzq ´e‰ÆÇUXsT"¦m|ØìËÙ€¥¿dž8°=BìJ¤Lb­R°Ñz©ß_qÀÞäËz~_.EÇüà3ÚDèDÚæšle� –Ç0ê¤ZÏíCˆ¶U -ž*j‰ráž¡/,8:#ËvPáEù×jX^…’f›6<¢7Ø+uóyÑíöqv¥n¯…{Ë©Q‘Ä�\™JøHw#?p¶–b/Áï7¢$}±Ø’J ­+réPeƒafÖ–ÐA`>Nïœ/èµ´F‚tì¸G Ks|�°D)-Žœ+=È­«¡©é“EC&îëí_&C…wEä3µ]Y/™¸7f­5ªµØWØ%ÆÅ—€Ò�ZrOxÁ U -š‹„BTC\mDì”Õïpš‰%nTÅüÃ{Lòf†®Í¥Áö勵¼ˆ3½z‘iøìügkí¸,ÍxÀZYÕ¼rÏÝN—ަ><ñ…VÝu–°¨Û÷N(d£"F`° ä럕Žç¢°›Ý±Ë7ãkF²" 'z.bÙh#2p4”ql®Áƒ÷æ Á¨Á™˜  Àah6¿qÎyÊV{ÖZôà֛͛š$,™qáë-î×7¬-×eˆM€àOŠa¿ìË£½ßD·lg�Ù,¢Æð0èÛ" ï5­ïÌñÛ³0`` _Û¸ãÇêš}Ãß�Öª:CP܃XcòþÝÒ³ÊCÀÐtÓ¸fJ;Ô6¸q–öÆM¥Bu¡… ~ág›] ¸T 3DŠ¥ª¿ˆ!@TáØçÜqÞô8øø’ç£ÆIŠÆØÉ�—ž¦bI]3f×z€)çø'™£ÙÛÁR Î1mÊun¶ô´JëŽVdžëoÉ@GAç¦ß*êLö=/�u^¹<ᄇ÷Þ7BKaef»‚‰VcÅ_mÐK`S¶�¾)…¸j»?‚o$a˺{Þ7O‹Z†û¾Ç©Ü9_�wv¹ŽÛ\†u‚8cöQ4%Ù6N%÷›ql6¬ÚÑ›Ê6‚ƒ�N¸è_Ï …±¬”BŒ5ÙÀÈ4µÅCÞ~0Ñ.�ì‡T¼û…aR-¡«î­X¾�ü 9-L‰ZáÜbX(:ÊûÌè TŸ˜�Š_WA@AÃÏbws�as^©¶5{râ4QÚýœ*÷� œ"9ÛdÁï²µq„œ_!-hÎ"v`—ïqËí`ùCHCW¡¶`7ç!¢“^Àî­å`cÓü%­ôßx$Ä ªq3{ðAm¿sùÃwÏ“‰±m±5 …´%¹Wèþ¡»“ŒÇh¿bã›<Šnö+Á Ó¬óF CeEkã­ÐP²^ÒĽؒdÚýÅ÷ hå í;(\,ÈcjvEÍ• à 8 ëzM››'€®¥Ê�8`k€›å �ÆéÜ.ô©ðçÐÚ¹„?¤+Õ ß‘pìöíÚ¶óÎ縚ÜwV«ßÕfïØß\bÉͰÕ÷ >C�i©3÷•‰F:[‡ÄÛ‹Y,^¼]a Ùé±”|\�Ù6½bu¸^ßÀÉz½Y¶ñ( ‡)ÚyòJôG K¼¢ žT-Ží€Grg¸íμ=vÎþíEñÝ|{ïÆ—žUöZ9—ƒ^tÎµŠ :ng[Ô_:ç^¡ÂùôRH§üiwJ>×�6Rv _Ì4·ñcÈ„P)޾m"Ú>ò°ücò îC¹íé�W… \êOŽ›“3Ë ƒu/ÍX?·Ði;EšZþäŽeR‡•h‹ŒË>S¶‚wíeÁ!æ+ xYm’0ÐùÓ—œ+Ke›h{Ì_éL³—†£&½ä_/ÑSïPî^ºÄ'kë¸ö×46ÕÀ/¡4[ üü«´�Y\TcçM‡!¦§¸�÷[ëy‘[9¯l†RCšN� %Ę=ûH{Ñ8bï``�Ûl,:[Ðô½`ä…j}5^»ƒ�C`b�ϽͺͽƒŽ¡øvžßî«‚è/´¶È+lÊ+ð�˜oŧ²oˤÉã©·�T¢‰¶#œ«´X7ûŒåZF«GKsX ûÜaH6*Ö¸s}ºyò �>þè>ô¯@0Cuv/2-éw63è·xtP‚�á|ëúf:½ãŠXɛ岈“moÏøÒr-­ÝŽ º 7­ .žZÖÉ�Œ’‰\lOãvºè[¿£�›¨ÚHü{+Ë ‡ZcÁ~Éèå6’J‡­==!nàìþh;¦ëÖÚ"saA»½øƒ,À,1§Ú€aG¹d<õ­‹WÓ-iÓϘ9ö©¶.;/gµZ³�þMÉH·³ï+/P½\É× ò\®øå¸_nÜ‘§ÃŠ}ÚÍ+•éƒ_7:†´·ŒVfÎÜCm†ó—4{MÂrµ"V¼­­äì³D[;­Ûkçæ÷ª~Í@¶°Ýu¾&—å±vr·- ¦†›CŒóÇÛPo »¢!Ð| ´^÷¶n3‰Z0# ¥—T�òŽ!¤”ýÛ‡²uÒ-áð[l€°â1{‚�¾vKûõ�öd$ˆYÁ®ÅÀäÕ±¾nM6K3~^ù—~‚Ø+¡…­È…� 5Oq9%(Ñv1T“�`h:5jO=ûŒ8ó)g%ÞÓ@*é•0b*LgZíœæ©÷7,àe�nöD‹­Xdžå!Æ íÕÃcó}ŸEä{Õ&,ˆ.)£3úi,d®_qÄ9¦‹ß€ám8ƒîmqzþ3éUΑù“­O¤Lè"ŠJSw8ÔCºµÁ3³»¯ ãeR])hc×*è\“‡�Š(ðéÝN¨}QwK [6Ä{Ëë|ø²ÛÆúÝÇ�DÊåXvÛ®ñR7\:[�H¤ÆŸh�†ÞÛÄZ/µT’\¸%¯@;´ÅTíÈiD{!à§p¶„ÎB"³|k¶£_Bï!‹#ÕþÚiÅïmÔyæ�@¦Í÷a(‡u=’�þ }¯waÛ[†ËêýÐ$? ¬ûŸÁ+6Jiñ?r%麅\áÊ‘œY y§*gpóÈËâöPûs#§�òg~lânÇTÎa “¯G~sHÙÚ{„JWÒ­–ÜŠÅÛ˜ÐèojÊÉ8�…7ù]­ø¹7kƼ®ý¤Hj('ø"E÷ ÙùòAŸ3- ê–¸oDG�ËÒP!jÔrí—ÊÞÓ®kf�ÓÁtPÀîlW¥‰ØÇ xŠ‚‘ucµ¥ÏûŠ #e)×d8:Ð6µwC§)ÎÈQß’bÖõ²Î,¯@‰ÄAž(VdS;²†-…Úï»Õ•ÍQ²¤Æñ×ã[98’è^°�Œ0¼ëN•dè¶åÒßb<ïÁȆ³~�•ÖœI ð7Äuq Î †DBêΤTÊ7çX Šl }±áúøÝ¬ƒ?25o¸<(y¢u¹RÄî–ˆ"wk9Ö<k]bìÙÛáo‚ÍÚ­G{&w`žIôj%«�iÁº�°\¶É¸A"Õ“Ê&K>~˜ñz|Vé1?yî6Ÿ9Ù~ët™ÒÄånÉàz +\YUšóÅ’0[b±1>¼ž¸ÚŒæËm��‡žp_1XÐÅf¤ >Áˆí°héZ*°j©Âö�ßz¯p°®±®éªØ\V¨˜y‰¦+›&]5ʳofîÿ+[vKÜڛIØs“õ\W–ýÙ�F&—+EJî7^ Ï ^›äËö½¦±03¿„‘x7”×$«�«#àÔŒ{Á ‹°NePâ­šîp!‰2¨ÄðÚ"~0µ·kPŸ:;x_œƒX�0¯MÊQ†ŠŠ#X²: ‘HVeéÓ[œøÐ6aìa;Ó>_À´ðœ)³n<aì„Bó•üÀ꺹TLÅ8)ÒÄ�¦êpÝÖ±<«27ë‹ %¯Á^T˯"vpS™¨�ô Êv¢=èZpñþ¥�Q‘ª0!0]þÈw}ëxf/Ý7Ž.Mˆ](«BÖ™"Àg“Š•L%Òî>Ý–þä!Ö∠+rQÑúÿ$pö]ƒ!÷]@><†ŽEÀ½t¼^§]noÄý%Ø5Ý‚×Mp…Ç€å#V½ÿ½]À.Îñ›2ØâÄi¹m*�"ä�(5�)§º™W!†éL®3úçÏôÄX™íe~ND¿D¶ËÞñS|>� uU‡8欖°²»«Cgoœbٴ럷!Çv{Àr ýI²o|ß½2àråL˜è9�…ûóGÞȳ|.Õ2 ‡<¾]…ŠJÍ2¶rÃ�ßçâË©ÇßaKw+¯4´â8µ«ãϺp›f·¹´%âß“ijÈ#x´_»y¸Û>îVÔ¯?©¥›7EÒ«v~•â>Í#$€3�.+–=Òõ׬èdÄZO­Ìô6…®§"Mc‚@™¢¾ô·>6ñ–Ó"Àí« ¢1JgÄwÁ°@hœßZ?­ß�]oa·pž}e›m³>üsŠïá[=á‡&<Ç;Ý]¬ë¨–ˆÉf¤ÃdA…M"‘4#¯• ck�¦É\„XAô@;+ì¤Cƒø"ù÷>+÷×ÚܱMíÎöÃgýd'¯žõ�Àˆa7”xû´«–4;L^ƸT} ö•ZÄÀwB[ÓÕ�Ù÷^¥ (§*àKˆˆá²ùæ™ÔÃ×å°jlµ’Ô­«®X`…Ò ÷xe¯±´o)oBºFΘ$;‹f*%ͯ~ªó$£ÌÞÊå´@Õ3H±Añ;—|hS˜n—C2œmØoÓ(9 Ðí4ˆFUpÝ žAc ›Õ·]ƒÎŒ,¥·’ÓëvïvìÎ$gRÀÎ’ºá�ì¯V e ó@�[ƒ‚vnnta³æë^Óíèö�ÞÒuÈb­î_&~¶¸Þ9_—ë"ÜwÛ|ðÕQûæ«ü½ ©†´E&·büûfsozΙ3ka»¥u’‹±ÖóO Ë×Ý˵P„†clêë�Aë•ÈZd›–|7“À9ÏOâ Í_Õ`°û�͉¿4¢ `Ë`FWëÎø~…1 ^¼ ô!ÃÅNrvñ%é]®È 7¡„7ý–`ƒrŽa•+¦»UÖ0óŽææ«œ²sZû7ùòYN$‘­îýG^€ðZ_ݵí9Ÿ&-òã4«�âNˆ=°òÔêËà¥^ˆ�Ù'LA(¾µó¤auöežÂO|âü+�źVŒUÑ´©–xèÅ|ñ*;$,¨ I™fäêVÉB&´DäS„lcNâ¥v˜JÊobóÄžj°‡�º"ü`ÈXæU¯©Î ñ~˜kx•í®óg«gɳi‹5£ã” Èç5•°.)WuªÝÉ^öÓç ŠT§ý lª¨(ÝÓ²ìë€Â-ºXÅ P¬šÆdÅ„¶ÿšÖ öFáÀy ÓÔ©C뎡îf>thÝá¶Zέ‹u½åÇ´•ø¼hv…¬[`a±$ËdGKÜ8lÆhÖ(|.6{“컥´bs Á‡±fÌØ%½K³J»µ0fÕ†�̤„¥›4–]Õ�aQØ\mmŒ+BÅäÐŒïpó¾òÅŒ±ª]ó«´,zJ9Á‹E£çÀ4¥"M¼�£”Á2èÇ]�d´~7+*ov¤ãuW'?µÇvç5ÙÓ™bÝèqÂ6=2|>¼t½W~ŠÍïÕ=ôå¹–ºq†Û�>£ñL¦/�«€� ÖAëLZ•}fx0;¡Xï#Qñ{Ëe£|·�+lÓ�;£ß*üÁÞÝWô¯+Ó�Ž™gÍœ…C¬ªd7B{A7ÅÀûÞ=w@/!õï!‚~ˆ@¶Á#[j£wÚ—y¸¬o�1�Vj4Ú•³~¾ ¦ì@`Ë®(Pl¤ßl÷½ÙÚ¦tSfz•»(ž£.Š�SÈÏ ‚yùgå:¾`uؾèé´2Ëüàá Jë@@�Tyjw}¨!ï9YÎê÷Ú�žËê<_˜ÕMúR©¿ÚmmØ®Óô³›�†jm¬½n¨_�¼§ÖHÝdÆ4ËHÜM8ò”Æ|OÝ+ßÚ <7“ûšaS ÇÚÇqÏbŠF%Î8[4½"ξ Å»#É)¸dZÃV«*.2ᇠN µk:ó–é…—��€ùÀƒ„ �pÃ³Š‚«eº@ß™KÜÞqu/ã«Ð9ãáL›®³€=Â"û íIFdâ;˻“í¨l:¬µœ{õÌ6Ç•me·{¾ìNëiSÃüŽióâlN)•^)ö/'Å5•ýËÕÛ¤¡q,ÂK饾Õòܧ”ØcÙîeÓ€ �¸£VlÜÕ4ÂEÂï7¼6·!Áu[_öïOGi Ñå—@fhIÊ ؾ"c±3¼#ÞÖ¥§e…¶_SœÓQít ú…M“\Íî(þ=TrëŸ4×7ƒAžõ–h…3-¾U9‹'’j¢(JJÛgÕ‚kÓÏgÖRp„ÀRÓðgìZÎÆˆ­`ÚŸ£J²›jq5ðgéEÚyÅöx¶ °Re¥£ã\2ÎùÁz×Ù^f»@Gðr²ŒÚÈ œþ½†ÄßGx2¤ÍW{âØòbd(g€iàž—&²/O9#­uâöþ¯‹aÉñ!Ž¥¬f§y]Ñl|�MN1~;>½æòýZ×Íptz=«Šo²Ñ ˜s7~ N¿Na’ÜËÒ†œ>+wÜœ&N>·(˃âý[âw/ zî$Ü·f˜sw¡vÚQÇç’»�ç�ìæì øl¸Èü�2néø·÷N¢y�v'œÀ}†¾jNË–Tvâ¶T¼©;%u3öY€çáÙéÓ‘i`PÁRèÉiùÎl"ù…=;ݬv#üE?µ8ë1¸%[絇tUt=©TO5|šÚî:FµòÆ EËåçlÕß]œ›— èäó a?mãì1.Ä{Dâûù6hL_¼þuÆ (fкH¿®äØlònÄqÔ¼A?±¯ 2˜gÆy*}¨WSÏÕO�¥7·kšM®ÑV«Õ¬ÍMòo°Ì5ûŽ[Öâ×g˜y‚|æOM†ÝŸ?yµkÈŠ¡Ƶ7ºœf²lsbm!Õ¶ŒU�7Fk¤s< N»W•}†?eì}‡¿äÜp/Ä ë8HþaSÎâãÓ_…gIœ0`Ç|ÛÌGft['8¶M�¨õ¡ÍxÆ6°˜”f[I‹ÛÓï�íOs»%|Ÿ]Ùç½ Õ™Ã¸Ž¢Hgh’&nO-)îa,;å‚ÅݳT¸ÛK�¦UËœ¼�$ j?9dµ¼ÒÍIý»>o’m?§~i#pëË”úò9Ln†ä5qöõš1œCÞn¼pzÕ•nÜÓã]Æ••a�>p#áÂdüò)èÊÒ;^žÒáÉKFOç •ØÒŠÖVb§Ñô³¶�ÉH 7=ñÞÂ5ï{˜—y �ºu�V0Á~Q'««€Ì�ÐÜôõz7‹ålÁ�E“¢@<³ì2Áö7¸�<ê:×-ñ‰ÑÁ˜æ×|´.k{Mûthæ¡»µhÎnJI2VDåæoi´:½�ä’*ÑüØÄ©7öÏù>œ¸ålÇÄÚrííV:ݽå/¯ Ø¡k3ó´²ÙTß71WÛ[¹8ºÚwÄ6ÀÈðÙIø”¬ÙqánwEV»'n¹(4‚7 Á5Wp̘;àÙËcÞ±j˜vO[¹`žÚ0L—³³¾o“Ч Š„ZìÌáËË©´/÷Fû—}Õå�ôG5¿Rî -cè˜,·l¡L/Ç€›†b¸ †Õ‹”·‚ ¦&onÄ:¶ÌÊz¦² Ùüvªýå1ÊD«ü †nª3a³Y¦"¼ÂÕz•gpsŸmÞc½‡�¡D1ôóee_zvý"б±uÉì¼Æ×”Ni)1VWKlÓÙ¶ªŒZÂà 0_½Å¿8(¯ÄÏÌžY× ò€.ÉM™½ø¹AϬ¶2 ²‘’ØvpÍE Ç‘_�â÷û�Sð�­�Ã/Ø&`@+ןÔ[ÖŒ �(ÄùâÜ|‡ð©Ý…-"ûž[ÓÙx-(d`à�0 Õ­Ó1¥å™Ù{cº|ê¨ö.9‹â:SœÉˆéQCtÎã¾ÏƲ€|<uÆ×ЃAuãW%·ÄMï~ùÃ:`©¨nòyWÀäû]¹v¾²&)êÀnÝÄ'Õ��Ã}0†Åþ Þ÷)3‰ —ÐW‰óms·¸xO±Iã}†tÛ]‚¢'xÞîb_’Òx±ìq9ËgºVÛ‘„9X[ZDO¾ú³Ž{~ëØ øˆ®è¦jREáåzÉšÛ´xÀ3d¯‰#¡(Ï[`h¹¡–wz “•ùoÕ7€ ‚ü 䃭O.³¬Þ¹³]t#}jÝ_s¨0}Ñ�®ÎSqdÅõ‘ì‰&ÈQo^d¹²ÊˆeÊiALÍŸììYf7ñ�³P €`Xíß�®èÍ9|�¥’…}>ôºíl«oš NÖ€j0½gT ™ÂÙ S&MôãCžþýø±fÃ¥xLáŒbŒv*xöd_9`¡"ÆC­b¥¨Ã–é䀒ȶa’KÁDkØÍLïö0_.ä›A´ÝÂî(üBFLSaZ>×$CŒÿÚ†&´¯1ØEkˆ÷¡7f³×‹f]�/â·caâ[UõNP« ô0BŸoƒÍò�p7kljô¼]3gIe…š· üó=Kàµnex¿ÀYQº‹™SÖÖè‚7î�EõO–Ë1Eª‚‘R[LqµI`ÈÂ%û0 …'³Òîtx±‰f;[fr„;²UêÃg±‹‚åüÍ�ws ¡L‰w÷ض…_zÑûi²wsŽT½Ã¸ýòè> ÒYÄКôŠ#p*wÒùßýµŽ“°4^„ËÙ]Ñý9oÀX_ú°eN·Ûá<íâËg£­Fð]-P‰\R�ouÁtŸ¤¡šÍË<þ"`µïGñõ!D×ß�_ jȪ‹“¬ˆOY³³ÝÄÈ<€sL–, 5–d* ß È2ýbêh£¹Ùƒ|¤¯CQ‹6ÉÑ1¥½6xp‚Ùcu w~NCš¢ïž<°ˆi)oªl)¤Aß.C/}tˆtÕmY6êHõ�ïÌ£±öz¸èjÏuËPGPËÌJD"dM-ÍÌ=è�ÑÌ äÊõúpí¥ X­áF]œ÷»RPê‚zAÏ\ª�`4\µAŠó“s-#'I¯8¾xT2I†…×q¸ÆíÄ$¿ËÉi©¸'k[²ûGÓb=#îI%˜¾­ÈKt´íÒ FæÀ†ÓaŒìŠ ñÒÊôPkô:YJËK›s)‡Q ‚bAcE·½9÷u¹/Åú®3 yÔßEöx2zéÛƒ|K“¬HRtï—Â7ô±ê¶££ ±B‚䙯–ßo±°–!ø»³6¬ó§öÐוř¾,½Œ†¡6ÿöÁåØÂ;}™’ŸP.d>ûL�[¹f€†��4ö[aX�i²8BD¨ï×ÒЪ:ñ»‹Ä–dêÇô—oÞ¥¹ðkà¯Ôæ!&@d9çÊ’•ϵïÒ"IÞŒ=ÁÏ÷ç4éÛ’cˆ°š>4Ö>¨g8ñü›Jœèµ…,Ù§¸ûkgV •_­²âîÆï¹ªgm˜ ìÕ”uÊ¿d ý�öt,ÚÄͧ[g´Ü-í)w[_¯ÛìÃÆtÉeîã òt æB’ß±åŒÙpžp³œäÃÚ¯ÓCA ¤»¦@EÉ0æÄÜ2©Úû�êß{ 9ð|l[`NazÇqãm ô.H»¯(%¯‹™i¬ °‘˜•¼1ª¹�P£á´+v[‰HX ‹MÚÝÉ�ߟd1V²}×uwA1?rêäÝÀlù?umi\©Ü ¾¿ª€Éq‹)ûÊ m²c …ý_´:ßÔÐ!8p¼„Þ_7{ßôÐ?¸¾ÈÇ;†…„Ö€·µä?^¾kÄÁð‚g@üŒv<æ9”�9þHÅe3±xP(f‹ÑÖ. G�¤ßo ¯|Š;ÿ@?~ü¾!^û×>‹@ÝxÛú�™g"æÉ£üfâã­ª}‹1ñ"�hžÙŽ„=dn­-mãBavR].šƒ•ëgà5!rD %" ÌÃmýmÝ?áb}ëžÂÓZÆÖâÚDý JÙLZû¦„Ý7ý“w,:áïå‡g÷ùlö¦/¨)?¬…Š´§ÄvýlÿÚÝTi(;ëEç?Ôm¦;�ƒÿ ZVòŸò05›0X¾„®ŠáJ¼wp!äP¥Ü1¼¥çì[I{³÷.{#ð‡ù­ŒòëðÜS]w �ÕÉÅÛG»/žéuæCê–TÍUé¯Îi¦;Ÿ�‡dÁWÐ2›in{hÓ}âƒ\}!Åaõ¡} ô™í° êéåÞJr“JAžÜnÌÆ¢Im7}k6ìmq<´Ñ*�˜\¾e¬Ô"&Ž˜âjîÁ SWœ|áoE±‹æôƒÿüUäbOBMt¢Á5ÿ .R¹fÓpQü/#uô ­Ñq�˜ _œ¸ê¸'êŒÍ‡ABeç À!ØYêë|œ$w½ç,O“âÀ&äÃC1Û¤�YìÏk[À9W瓽úyI³®Ê™ `¸LŒ+^mЩ‰q îÖUËdò¹ÊïréL„ÏýÙ§¾(âÏûÌ}Ï××l ®1È‘èûô»`¡bÑþÞÃ0oíCüê ¬óV÷Ä·ë3|ársÌ­Ôâ9[ñ³Md›Z]Ìß¯Ž ÿbð” ®<{-Žš¼õj2 ó{8])²MúN#cß0ñð§IK¶Z ì�ã� f0Ü»)k›fÆ!7z·¨ý«´õ¢x&"b(xy¢³xãín`¼v¶äÇìÈZïù.€lCxÕÜIp|€ÂàEÒp0ÑË|ÚU=h“÷íå–2½Nn´h…Ã,T\Âün0"Ó`ò»¼b›èõ8n3¼Ü®‘™L2™°oJ:V^™¶I�.¬ Ê6˧åaÜb[/Ží10ã<ÔJÀ營ØÐq–ŒuYÅŒì’Y³"oä�týâ÷K{3Èõ{XhpÎP°p!½lì+bðÞ¨®O  XYè¶Z§ƒû¾¥Æõ�åt¤iûM Êq³*r3|¸²ÂêìoÌ} ꢭÆ.U’[�« 1¥:B’.íKí_:ˆü"[N;}`3€ Ñ%0M ->sn †M]‡ù£^쾇¶¿I«ˆ fm¢faÂa¸Ì¬0nëph¨ lãâ~|VxF¥ÔÛXÝÈ6üº10FòÃRgÛrã·nêÂ(Ž¥»XA�v®ãI®´Þ¦áœþ 3´ÖÜ�êŽãÓ_ï¾ a£¶qM>iAÄ«§¡Y,®¹†±áæ“554A'¬ïhâlC£Àø»…8ž wÖð óC½Ú4€æ³jyà%Æ7—ñvvœÇ qn²W<ÞûØ‘¬;NØ ïåå;F×skÁ€%Å­ÆÜ5F<׿¿x®!ñùêŸ*mSÙ.yzÙÁé-çˆ õ]ÞìpøF"í§qXWÌ.nÁÊù°": 5>¢3iìYdEôÜýrÝ”³–€Yi½­\ é­ÁV|àMFÞžeBÍ„[™Ì ÿ™u½ß§S~Tݹé׃ïÖ¯ïk*åf#ûÙÜ6H^žù¸Ø\U`âÀ…¶˜wC‘0•lŒgN <`¬yÕ³9}—µû‹… ùƒ!¼º;ýdéè2“ž_”ÙÌÒCxH$#Cqöñ••�”_Èy�«¨öNIî 01Er»0\ò,pè%Ù¾s­ ¨ƒiïS©ûl´Ï« –l Šl窞ógÏjM5�!yP<Þ@Žá@æ“·å�[IÛõÁöù‡÷C�­2mu➺�µìÇKNÇt·raÑ€³ynÊ o.”;Zð¶wla9BZ”ócl<µúÞÅ5îÝoF£mràT[€ƒÙÈ_¤èƒL÷!J:±ëã[o‹ÙkÌM¥ÅRrv8H¹æD½)¼Ýò‹åpàe¼[vøb�„‘Ÿaè¡ùxZ^­'å×ÝWÕ—‚¡,¹*6¡½ C-‰Y>‚v¶}Ìò”çvÀ„†D I‡As)ÚÐ’mÐ[”3vˆjÃgyš?Ö&J`ñVÈ#¤ÄE^,M`„%Z]PSÜÇT7;Ñ ðsö5–·§²P¼ óà¯ÕÖSöÛ<¹ƒ°Ô©}ˆùqŠÄÓô!è|Ÿ·›âÏoÕáa°eñ5Í‹€¡Ý°\" /h.¶NbcºÌõu¥ž«äJâßF_�9Yä}ÂßKy> QÌÝ•× Gá­Ü0cˆìa±?C͡܂)"îÌ{¿Þ.0eð)GGA÷L Œèc‰j?¬ëfÞòxO0â \uXV»¸["s‡'WƒÇƒ< ’sĸˆJ2^�.;ö*6& }…œüÅóxæ?7‘šœvaòéæ#t¨æ)ÏåQ€¬‰E2Žð$®%ìáE·�ͽSÌ;nâß–Ÿ©@Ÿ±;½ù’á呃’Pb´Ñ›6þeCB‡Ùʯ¡Ð4Ò§ºèçÙËVz÷µ6Á–‚8Ù|L}oE»Ë­l2=Q"Ù‡Õ|Ûö÷Ü÷æT¹(˜`<Ù ´>¢÷QGíÈbÔœgã‰ÿ“uü{ªvÎä`WÝ”=ŒwTàdIÞ€sÜb› ´‰ãÅ6Á¸ÔT £AŽ%槉gk X¯DY�¹ƒLDt\n`ÞD2ÛJ, ç•”OÅ›rÙt[6‘d>·zµÆxX~æ×„ñ0KjÝ{ä/v.¸xZ`Ë6—ýœ®Ù·N‚ÏÆGFß´íœçJh]õ–¶•q 7-Þ†§{¹Œ¡l¯tm`çë¤n¯‡£Z®nÞ\¯Ñ€?Š™XXyµPéð�Ï·aÝl˦Hl|¼úÄ—R˜­$aH£Ý³ŒKÑ ƒŒZw´ÀkÇÀ3 DÜp ´ šü?VµÎég‹5‡ûñkÙ·ï](¶œ±ºŽzJL M3±å’2BAÁÞ íOØRè ŸÌaÇÍÅ •ÓíçiÐø¹µ,i}‘ˆ´€‹iç[·ä¹WH�–„r‰ð=%¡˜'$…¸Åö]ÔIQn<åyÆy‚ß4±©ê-ùÁ$Ã1˜è]ðA�kæGƒe˜ˆÚºÂ„Tô1„‡†ö�¦õ›è2žù¾íÕ(+¹.Œç3ZÕ*xtñë^æù„Îïê{A”y/k» xÏÛè€4rqÍ>¬‚Oà}¼EÍAøZl›ÝÑÍvG­¯ÖP1+‚‘¢7X³× V°ÀN°{mÎÆb ´Ý;Mà}j„9hMïrâWÇ–ÖççZÃV3~ìR¼…®ì#·aØp�lë˜r…Sšú ÒD–A{š[ DÏØzúÆa?jŸ¹rû{-L• žHtPž{[E¾ZS­Œ:¢·‹òípŒTÂaƒ¢,q}›D¸.[Ö/†œ¸ ›ß¾Kiô ·&ðÝÊnŠï‰ÆIGW C ‰è  b?F® ùTÊ5Ô‰†ŽQpdæÚÏ¢óëu„Gàù7½9¨ëÙÜ‹Jhd�gY0?´MØÆ›ƒv#Þ†ªÅYÖHDÅšýŒ1ÔäBÞ¿ÉíMóî ÈE½uÂ4m°ÎÇn¬Š?d�Íuõ�Õpõ°«Äj·ïey…dªÅ¬‰ p²žD„xTEZÑMUƒ5Óë†_³U,…föã.k·mKU-ú&ìzÔ°q›y¥Pâ<)Ƹ;h 8™om¯5acƒkؘýÑ)†kÛM¨âÉþ•óÏq¬¸hȉ(¾e1›0,Ý™0ŸÔ±GÒ8E"¶jßiËœžªç£……H!ü–'�™L'eãÇ×>–P2wgjE7^�f¤å6»f¯f�ZéÅ@‘#¹A8ð½žj#,%A Ñžhî5;·8­�xIÎu†Á'j2€åcT Ù 8YWyg9Îí¥í2iÂn(‰l�±êæu\ÆÖø½ÊÒk–ð †ÊJ[“(fºÖ‚+9ЇÍK¦ÜÜdÐïoVôþ’G¥ÊÖâ­½ãUÓß8ضöD‚¿RÆhX¶àÎÝ^=Ã΂‰AÀ®ÔÙÐ7²ÀH ÕoÛKé§ng´«6ÊQØqsâ"Æ…8Ae(ÞFuÏ„8ׯO¡�šäTe€¬E~}¸ßd„:�  ë=Jµ4ÿ¤ÝwúÕ�!};Xà_\è1T¶,Æ øU”Šîí!ÜHçu™!ñ�Ò"Œp€�„Y+ÍM]ȧÚ0â´þôõ€“íf7ßy�bru¯¦ã û¥_—Ž£@ùÛ3Žþ/ߢa&ÊsÛ¨@Z££Ø~ ¡§ sÉ*+\[�Uâ ÖœV3–Úä·©TåskT}í¸Ö¯Þs¯†ÃÜLó7{ÇÚø~lØ›b·Ù)÷L� ‘îz¯­Ôé@w3Pá|Ö fÜÕ�T¨A‹ ÷ÆÄ°emft×Jš× ½tæf™ö \#H溦û’kj_ zjÒ?× «‡’D(oª¢W�ž-]èbÆV™ê,÷$J4µüŠ›Ç|^âò ʘus°ûÃûãÊ„@î;îë8Oµvqöœ¡ñ"ç×rŽw<¿‹–LÔNŠw!ž^ë7yšÆ&¨á>‰�CN$ñ�Ô‹w&ô’±†[¨_ýoꦘ‚¶^—ÔH<]!ç6{æá×ÊŸ¦öЦ¹2¶4 9ûή]NŒ†d�e¹Äƒ¿K@Xlhž �8B—›gKî*âêÓÌ',AνtÅY_Hw#õgM×z°§å´Ü¹Ç8rÖ‡\èB+� 8"ÚÊ©¨P8WÊó7„¦©'yHÓ�aҮ̰¾µ»Òyó´‡{:¶ÀbùV×:÷Ú#‚üSSˆJ+Ú3ƒŒFI·»Š…bRñMl,'FäÛF¼Í¶¯Ç�Œ+æ¶á=$i+ÜàD® æÚݼÝNè Í S%ùs^š .1À$umK³U\êí0ƒtHeˆKCqŒ52λgŠ'»@¤©é°¯lõØðºÈ@â�çÇx~ܹäÅ5Ç9á?×Ê9kŸ|‡¨Ë©}&ª!iÎXùkzIT:üßx\ §/HÍp+™¢à¦5™P‹IF´öýr�¢ØT=•Ç)°!Y˯=ÖsÑÎ4~$Þè�±èQ(@)L~ÓÝI‚’ãÍ êõä-ôR7Ç‘Kn.àŸír£\ÇíçN>ªpß)èèMþÁ¯žO‚»ä¶"~Œ•Ò�¯ÝE‡t鍨õó‘�p®$rc(jpõèA”åómà.ÇN– fÓÇ6Ûþ” ëtÙqeMfAld[[‡ñ�†F–tBÏ6Èõš­zÙ?£;LC¶Å*¾)¢×H�B–C¾ïÁ;Ó À:º×^ÞÆ­S!¢ `è!G†aÄÿ6P±èj˶ð¡{‰·Íû €#‚Œâyh¡î'Ć9›…Í�7˸%[,#O�‘Ë±Ž¿˜ æ_cýr‡l_ÉQüÒè¿] 4Ø“˜!Wt-�Í2A§ ½Ü¼Ï<Þ9ƒ«†�gÉ—ÎÆg\[]Bü�eäÜÇá^·3h2¾L‚Eo­yxÛê�›ÈÞØgÁÂE¶È&ÒI±nå&yËÎç·Æîtj|BÇK p1"’› ðò©‚΀«\ýÌÓ1[W@ì÷½¡w¬¸ÃÜ·ãÆúw_È•[ÆŠ¬œ#`ߘÅ[5z&Ê“†=óó–]àÕ­ ²ùkáÛ¶±Lÿ‡ps˃eõðÎz „† f .…½.ÚÈSêÝN6Ò–ìw”ô¤õ>sÖ¸àX^}|@]¿'œÙ”�IÍ|`Ú‰:È¿Yâá?C ¯Å‚Á‚ÕeÅPËKÏQ75;½Ã8+¯ ûæ©Íž,öÇ€›»ãD�Ìœò�jBä�ÚÎÖB‚;þäèáyI.ðï®ä=öà’oÏhY“áli�ß7@u ÖÈÜæ;E~'Á8 "”º%oa×]ÛÎ!¦Ç‡”B7|¶òðË‹76f)ʵ66ÃÌ»Õ>ŒG{ô2`hhÅuƒÈ5¡6ø¶GGò;Ö~æy³ØñÛ¾D»]ö>"*0;QÛ;#) ùaü]©›bò²¤Ýb; K´J¦>ûÂíç0ߊmú8{ÍeòyZ 9Ï4ÿ-Õ) çmzÞEäâpß>ºíˆÛh`öÅäçš²w�C²5­+šß\™0Z¥õ¥AªBÞŒ\Wï ÿdgÝÁ½Qy7°ðN,u>+*K„sNð~ ôdøîhv_©*çÚ@í@„!ãšö< ¥¶ Ý×·~ØÃ‡€ n4n†ë¥ÌEÆ­™å�JF¬;½|þÎnwÉ.(¡@Ü;JôÝÆä2 {~â9æÂƒ™ô7 Ëk†¢¥Ý”:Ý„—‰‹÷UÞ9Ëd`Q¥�XÒ5Îo7‹Þ•Sb1«mí(ðZ¤œÌÉÄ®äl.¨ÅeöÉ÷7¬-°^.ßNΦK {bÔ ¯ŸÖ6�%€®ŠÝ¿+Ûj'çy8ÇìýÞ2bm¸ÚÞ|öAƒ>·�$ÅÅ—à•}{!ö”k1f×A¥ö`�4WâéªÞ¸@N°�ýsy=D£cDf5dØÙ­�ò‹–ã ˆt5_Ž'Z­=jµßs{àïfÈÍ—ðVp:¦Í÷ˆî%œý€å¤S!ňí5¨,»Túäá?iS—V· ­ÿau–„×Ìú�çºïl™\ƒÃDTî;ë„ ñ’x"üͶ‘kÚ…µ'ó¥ŸS”3æŠX—†:À+ANˆõ68 zIÁ—»<–0@G"@õwÞØ}”-õ¼ ±ÈZ�µE A&ò&«×½ á½†C*>}œöËLÁÑØ*Oôvø]F4ä@šV†é´Ñw;²�Ón lp‰~NJh¸ánÕb¶[eØ©5b�ÎþŸùWžù2”è7rå®ä3‹ÈÉsVÆìawôðL¨x7ôûQlD{ÏéÚ—E­¤›3taܨ­UCwC Çt•§ :Kœ6ýÞ~;Íå …¨Ü›aFCg´x¶›·ãî—Œ =Áaiƒr­dËqS0“ªÉt©j3ÞÈÐuűUmÓ áÔ!Þ2%q³<¾Ëá¨?�ì£å¥dUÊ´j.?å:žÿP¸mGÔtÎ ÐV�ó×"õ™ÅŸÜbß0ffè ðyt}>ó©ã£ÿ2*@ιp-ur,màh*?•Ñ1…ÿÿ¡g¾ŧáÿ×ÞªèóÅ! û•©}Ëz û¯Ïä&Ʋ“%ç$0¸:ëüÉe†ÂK–‚!²W�¨ÒnO�ÂqØqÓaÈ„³Õ›ö˜"Óÿ‘† þ;�ëý¤éu1b¡ÿwDy6R1 µÐKóäÊ»¥#\6š‘«ï÷u£!ÁP„dÖ˜¥n�4û„Î>f÷¡±Ú\æ;öˆ á!u·–mÄ7ݹ`@ÀîJk¢ÿµ[!C/AZáhÃìhyÚ¼]àgPEV†€Åª4M”ú*§Êˆú¼æ‹ªÙƒVé²mžl““™E¡Uz×Oá4ìà°ò"a—ȈgÔs¡:êDèßÛìÄjâ�m._O °¹ÁÉJ_9Ÿq©ÞZÓɤ•Ook˶_ y¯!û®Å\ðµ˜ÿÁ²Q¢Ã¸tßzcXšá!Ðr±â¨šY²£߯‰Ø×° ÎS~*’piô†±ZÚÖ¸vsS8õ®ªξ âË6âtJQ/^–ã hüÏ`#>º6Ÿ ÿY +f'ÁÇöýº¨…ø 覡+VÇš0r²¿gnB ¡©Ì �üÂ…>4²+[æéVôö ¹>VfÚsÅ�ò�vضbayDlœí;´-7yõ�¨>”c»ËAp^3€¢îmr1½ö”ä)>‘à7>ÞçÂHªðNìz�éX”µ‚ Âæ;ê�˜EúaGñ¶~*èº�xŠ�Ê,œ£7Ä¿e>siï2Õ ÇѳÁ£(dr´oæ°d,"w²ÛÊrƒ»ßÅ®…ªw–ïùÓõȼüKhm ;Úß±m‰ÏC~kj¥g�éøtÜpjáÿ=“¯5f_>&MÌu»sùêåÏqk4PÖö?²�`¶�&¼¯æCêßY¸nËyóM 8 Ðÿ6†Œ—WLÁ©Œ‘Qಖ'ô0Rsÿ n+(‡“\2¬äÑ£¿fþ¤E!@ Bšk­Ì,ÿ7õ¤áÄ(JÖW„ö×;(·2Ìh7Ò #Ϧ/3X®OaªU¢ü½‡˜Ü(n½~ *@TŽÂY§(Ó Eo¼aþ·®¤Uv¬¥}=×eô�ö×2¾å¢a Li«�^OìøŒgZ0æVËcë"¯ DYÜàðwØnâñ)Ò#‹«�™5OÏ�ƒ…Ë"­CäA]0ôÛ)ß–›¢ÛÆì(�ÿÉçûŒ³ e¸�/PnUþJß îèÂm–|f¶ë÷:œG¶ÁEe›—¯™U@†ÙêœæÏÛ³Òª�d˸èá÷ùhkS'•É�"b³EÉÇ…›+öǨO¬3;ƒ¶€k·É úÓ¾x ñ–ôå)ú-ý©òÇ1TnU­‘O Uâ+ôí{×){þ|sùÐb¹Ý™ai�C�É/HÈ3�ù­ %‹ƒ¡vÕ˜qÄ×-p²8f|=¼˜Ûzaî˜ °®Þ÷&šó¥#²ñ˜gZ”§e3¸¢K\5YÛÝ·D¿Åú_Œ60¤/e_gœöÁCV#ßú¡uhÉI… ì�Ý”ç²|õÙÛ¼vç-1¢Èm_6 öÐa°V5]óú"_»Ì-›“ÌÙñ»®¹PªøÈXÄuŒ‚ùÝÆUWkš½3ð9nýVÀ 2½·¹Ë�&ö£À"±Y*%’>ì½Xø?ƒ"}ËH§L¦5ž\—Hû¡$T´ë&tè·kwK°eON™�ß:“šÞÊsem–§$´¿g<€-[ÑSËËGÌŸRÇN’8—ápB´f¬šö$»ÃM‡Y>Çïä|Þ5Àf´]«UY<Ö7x‡Ë_“–mÂmZŠá'äæ°oÑ*‚ïW«eNŒloM­uÑ xt ÍŒY¥[vlSgphÁ6‘×-o+p1:¶öd‘ß•òö •¯—®üÞxŠÌظ™€çð~ülÉTúØõã°vÏo48«¶ø{ì¾ùŽUä#„Î¿Öø{�±¶7ô’=ŸlÕš¸¬ß>Â|YùBvå­$Ö-¬W=Û–Â;¢ˆ`=Ä jL”Ùÿ\>Ť¬³À=Š˜· BÉ¡Ç\ {æÃlmº**Ñ_A£½�S¯ÂÊ_žôÔ ªä;\´»Ÿl´J9üÙí÷@›€Ñ…Ù°m©§('Úpöë ¢aÛZgÈ!xu& =y å§Pà´�r÷Å0O’àßš0K‡ˆç%ûtïl#ý*ìÐânhÉ«—Í þ Ç®n×î}jØž±éÀw$ë効�[hš=Õ+\‚0ï®e™äªî6ÃJB¬e³™ɵ }Áè¢uôóõŸKp(¬¯Þ£AÑpFß$é�fr”ôeÓºÚXÍÙ]Úð¼Ö§D°×¦SEÅ%­+é„Lã�­s`ŒÜÙ¯Í�kÄÚ ‘ÍmÐ4Íæ›l�{MÛ†�í�QSüÌò{röQ¯�[q¯o³Ø•Ï<¿º¼é‘¹Þa‚âT üa Bì™wÎ ‚gm§”ûNä‰5m[‹!àF"?Diaû5K5È- ZŽ›ãÑà^Ãí¿C—~à:c7‚�>§‹Db &áXƽܬhžÃ†Êȱ›^_ˆ/ZWd38Íÿ� ‡ÈM�õÊÜÌ1# ºG‘*ýáôŽUÉøO•¡ü2ñ{!–ÙeJsm׸«zdàØ=£Èº¿RV#w›‡Uµ�æÈB,0� [šn5ƒšó…®Ä¸�÷JG µ}/ Š"ö]'nšïÒ€Ml­±ê4šj.]¨ ‰¡Û쵄­ ?1%œ­JkÓ¸ònçc¶¬¿%ÝÈ6ÖŒÞPµ[¤ÐÙÄXðèiJM\íÊCº`ƒ®½•î�W®;©…C$Ë_ bÉ+²’î�‘*ßwÉŸìÖ‰�Ñïî91$ñø°î¾Øþ0ײúdQn{]9/³‘ ¦å>»ô’‹ã¶É0¶–—½ct«¸}ö!ì•ÈZÕÞÎS¬ïZ|ØTñË£ÓŒqæÖÀX%ðgû;x¨�xZgu@…,óUÂŒãõõŽ�‚3Dþ<ž¬8™kŸJª7¶e¯…6”±{$Y“ƒ‹» ÐÐÎ(uËYRƒ‹o=¬“ù€»{.töVh¹Ã9D(†q hQme‡±#¦<¾·‚a“`E›;Äê.ÒÚÛºßW¹ÒØ®ŠÙÜcœ=C‰FtEjÒ~Ñ”yxÐ0ðaÚ·p�;âÛyÉPeî” ¿êy`ÇAHõ@zµ=Ýì’6*Í|Ýbqe$7…K`Oâ`†/ÖMU©µþDxp_±.�­�S#ÉÑB©Ù¹O¯ò cͬ«LÖ~¿ôgO`æIìºÉƒHCé"ÌÛü2¶;Q}iÊ?G-;%œT¤r(nA¿×]í¦5h��«ø)o�R™öèŸõq³íl|[Íwö$ÝvØp¦ì¤…ÝüÞL&~ÞªÓ=³MůeÊYû=¥¸óB ¤ :“C,Ucòà,¼¹·K'É‘Ÿ�17œ%Œ2îŠÔ.Ë�:<‚5ýû­~¾Šyˆ…ûe¿åìš¹L{�ô-•™LH<,Ü®1q€¬– kòbý„ì-×ðîP ޏlè·$Wœ¼ 7åmo?žå�+?FünëæÖ7p…�í�² t¤C¯Éõ´þê`¢@`>E³vª'~]óÜãÛQvÐôï{(Öá….;J ýh÷[]N*$&ñ·hU4–±b|9g%aó—WЕµ]‹ºá‘FE!r0÷t`›’60ëëÚç*$­ÊnÜK5Ö¦ïA°uužLaÄ÷¨­7³· ã×½[ÛH˜ØH÷!‚¥LŸx–ʘƙxp5Ø\a�iã¶í÷ï�Åòò�OkGzRáDY¾°÷>è,åÁóŠ«‚¤š‚g²ö+À±ýæ"O]›†9âT–ðò‚aªãN…¿11]\Qí“®G\u xÍç ­Š´çZŒŒaS�O˜Ö¹1?CaJ;÷ÍÕJ#ðä0 }ó}”,×5b€¾Ÿ‚¬VĽ>$±ø0{µyTî„©S@úNõ¨tŠŒXFÌ—‹–н\På¸BuÃzµYdÛUy‚ Ã}8€©4ëëXÀªÊ¦“g”=Z#¥lÜ®Rë/ß­IÃ"ôìϪ,¾ ‹AòqºöüêLb³æÐ²nM—Ú (û7Nï¾HsÃSŒ�¶ÕÂÙìu©Ý’2Uúx϶¿&®‡Ê7r¸iBFÞ].-ÀØ2÷¦°0²· Anb¡b‹–ºA"›#HËH  _£Y2¢Ü;»¦¶&9ÆDD‚}[p´½MøP«@)¶„­ØçË+ßÙ>Ÿ%ãn‹Æ5>lhÓe}Dp zŽ#u`O†ÇCŠÐ!›9{JëäZ•{Å�^Ü‘DJa;"¥&¦žâÐt¡"°aaž�W¥Rsr€üJA±ó‹áyûg„�=\RbàÚu“±/ï"üY["î ¬ß=Õ;í©ñôyj9æÁ§ (/ŠBoœ ¹µÔá-ðÚßNÑuœ.CYy‘†˜meq{5È+¬Z?råê/'Ô¦¦¬«pËÍf öÛÉÚ>¤èP.ËÓ¾ Óü2Œ.ì¢ÛçÔb7›õ�ÔÀho†ù‚Ä¥Þô% rÏW‹×RXC)»B‹uÑk‰œk5’��^ô†TÊøË7å¶@µÍhÑO»à]1Ù/PÏè¾÷ïWmùý~ë¦Ô–Ê]ua¥œ®áhr¥Ÿ;T뵓ŠL=™ §ë+ñ%_‚ÄÙÁxƒ»c¨ÉçÍÏÚ�>¶°¯Ûôâ̦@{µçvÍiÐLÃ7ß ãrNG<1ÁTØl§õ,¬šH‘QžôÉÎ[ˆö„=]:¤ç/^WSØz߇”Äð¨MýïÀš¾ž¾|2]ëSÇw.w©­:äzOb²áôµ�ö§j; YM`Ø Þ‚M�²þ©žoÝ RÉiÂÚo“ž<¥žKkÊÀ¸½�@Ç£qKÛÓÖvì«PW©< œ#á,eÉU”+ŸÝÆB¨ .rR#2Ð~ùÊ2Õ‡åO¤3í®¾øD3etÎ\öÑt¹ßvd¶*çñ�q·½MÌÀO(9šÖÊByÖØ^§ ›Ž»ó§5½ bàë÷Ø¿r9-®‹“áÔ±Tk¥ËNBK(±WËøë Qž§9χ/ @q§11¸Wd·S;¤Ï)ùÌ„Âêú¸&ô!2M ]�/ëJ’X†y‰ãrÔ캪~Û›oÓËw\�*äBù³Þðç›õô+Y›ZûHË*H±~Õ8.vÄR¯ úè=á­ž `�F”×ÜZí~Öaž”›ÛÆÏŒ}fÈhp ��_vfr»«äº:÷sf–ë[žn§Òý�ríïÀöcb+XHõÃ?aNÖQ]Î4Wë'Ú÷G†Ó1À[0S6þ@ê¿L<Ýa=vÉ$d�-¯Õ�þ€8;ÄA×ëŠZ™h-eØ*LŸé½7üŽÏ#(ÀÜ5v²íGeÜ]Z¸Ô¶ÕœñbÎc¡]Ùí䑯T9ÚPLP‚ e) À†åÏ{G:Û"�¶ã�ca·û!{£—ëÁ)"_9±†ï–ÎÒgpOK©t3ª`ouy ·T�}Î6¶'>?’×`ê¯çα§tÜSqÝl?%ÛwØBÜw_43+aD_ù~[õT‘8×ÃíãÕY¢µª¼]Ï+È©æÇ$1k�Ö=½Ã:8ñʘ†ŸÚü†âoVNMý¼â~ÓòC�¾1 §¡“.Ü“?jh>ä�Å/qËMZÉmåƒyŸ¥†×ÆŽ¡Ä½—÷½�ÛSô®ÃsÖœ+[Ö/A†8‘�b#è¬}ÖýÞ:Ý»².­†¼û'ÓˆRúá‹SÏØ=°ñJžuõžT2óîcX7{AÛÛž‡»‹ÈJZY±òŒv±~¢-®7mÇ1í÷“÷ÈN ·øë:‚›®7'a=“ãm2ª—×/µÍ¨ŸéV×{%‚󪔭<Ö0^žÆ5Ch42B= 1™e³Ku\ÙqÍ—‹¡Ó4µr¦¶°Ä÷22g¥¤¸wd¥ÍPÂ-îöW Gêël䃸ʂ-ÆîšÚbÔPPÊeŸ€õ×!Ή.frLN�E�ð–ÐVØã ÞèNåÚþVJ2»EÁËšFññâ… 5ªRÕ6é‘Ââ OQçÿ¯¼Õ­ =^’ °$œÏÏïh#lþ†½~àéß^ж0A[פú§èN@:r„5ˆÏ�;ÌžÀ»ó­°2|ù æA¶Œd׋FîrÒ¢@‹a¢Ø]êQ ºÅ›��܈̛u]„|6Ë1G—ZíôÅYÈz>Ûè èþõngµƒ¼q*®ê÷Þ`�*…Ñ�©òóéßÅÍp¹o3eK§LvˆQ¡$&vk–/Ù±ë@&K´ƒó¤òd°Îÿ©k 0oèê!Ærž<äQã7qRïj x{ÕØ»ŸR™{Žz§ÊbÍO­öx¡NY"<ÃaQ)x#2èî À–¬·Kð÷(',yZœâDôì"¢¡“¹ð‰þ¿»¾d4œ±¿GØ/X)v¤åã˜\^<]ÌuÁª”>Zë…¶A…uŽA/_&ûÎSœïÖéÚ;Ïj7n;†ûG@�Ä­;ROËhθZï±ÍøÛ~ÇRqë¹Ü; ç´aj~ðo¯¾lé3µÉly°£[) •næÃðÈ®:Œ÷ ¡f'9ÎüV ãJ €píayµÎÌ/D1Äe¯v·>ksƒ·öP¬>²ÃÀT«3 ±xö'lžB^‚Ý: ÄÚ9mIòË ·ìëj·ÎøÜ¸™¶túØ÷.àYÈ# «³ü¨Ù!ÇĤYÀ�¼ß Ù^j½#¾Å7?VtÜ\[äp$§V¼¡a°ºÍ–\�qû\ÎuÀŠjÆÈÎÜØxÝõHòküÓ¬@QIàÍДo xM%¶opß¿íd.鉈÷žå¹ÚjóGÏz´äNîÀ*^jn'y!Ší£6t8þ­ä(ÂKYí$[ +Û_ú XVóБÏQížÀ{´ »(¨råz )£�ßâcÐ3‰Ë�¥v@ã…É|›�• ú©XO|,??N¤;f²[Þ¢¬aM†AH®_y¡7œôŠØ”¬ó!kݤ—)ðÉ ÆºˆK…ò°N x³w!ÅÚ€–×û¾Ü4eIG8ɧÒÄ $Å+·H/¨¬ýsí¨�a~]Å×ìi$ÎÃm�'Búé äÔƒpë—ÂâÂs\V»§Åˆ^c˜¬àâWha%ŒV [½ã@D»\ýÒC“b.—±_7ã׃Yö-÷*V>Sû3kCD„ýzku…rið„œ\�LÒ!Ó)ˆŒŸ×MUhCæî-´h•±¶›m�23gÃÁb¯]U±7Ö>Sá-õIƒ >A9'#öV=z];ÈE…á®Ã²Æ�½¸KѦxh[š›IÝÌ*;Gy×é¬ç Ü ×…âü�AdÔ´‡rÑ2ºT‡õN(žP9hx½Øv�­i—�ö>'Hbx Pfxàmq+szÔh(@Y@«ÎŸº·ÆA€ºæƒØ{ë£í̓V Khfd-‘íÎçÇm%²,Ј㣒=r!âÖµ³OÍÇ»º�O–êÅL�aÐäÂZr;, ¦ ƒ|ÓôVË8…ÃõÜsfÅ­4S#kXE_D ᑊEýŽgýzû9�Së[Þ%þþèßÏü,h �Z~!€ο��›øøY`£­ªl+\ƒÏa�B˜5E¾†�úü+êz‹§ž0éˆu]s¯ 0ªbã«o �-2tCh|HsPµOcJƒn™Î7úÒ¡§Zý¶=š »Sx0˜nFv|fAàµêÖö¥BÌ–ó§í…íÓV;Òä(Ó¡|½½¢L’½»µ Ud¹N³iyX ZHCE°F¢ßo““»ç|Îw6 «í%PO¸È¨[Űf+i=Ò Æèxñs¬^ëÎ^gHbí}?/}õ§ºë€ó!ºg�¤/xögMsjÿÜ9m²öÜá÷T½ÙfÙ\ ‹ÌŽ1‰¿#~·n�†iÅ«o7šUvï%€ƒ@`:¿k wŽžRŒW]t¾u$=,VpY}Ä*ÊŽ­yä…} ,ŸL4GšþÓœ|y…g¯âü—{܇óëcü' zvl M›0dçˆ�•†!Ò%¼»¡r³øSLÁÔBô¦Ç§JEúÁŠ@è p&-“ŽÛ�Rïc€Úßs«;òÇ5bB¥œˆîÄÍrP@Œ‡·ÀÀ¸aâè{Hä+³¡ �À©vj .úòÁ¹9Š9€U^Œh‹a£²ò­žnÆ©Alò޳@ìkoÉ ²÷«ZSWÐαi«ßÄÐý»æ§{¬•aÔ œ.Á‘€r¥Sàë„’¼ë¦ÐÈ.AYNx’úX=½ùÛÛ³�Ä2'±&˜Ù�Œì°7ȯ‰)‹‡¬â­¨ww1¤:ŒGJ1¡ýÖÛ:c zF¸Ö_YU‡ÙEäõ+Í™»ñjP™Z@+pBôûsí»Ú; �Q'“8J;~¾Èœ:‰DS{ÚÖþ�|æ¨2trkí.5K¾ÿ¬ÂÔÅ B%)1¢«[ËÐ…q ZDAwwçgS Œ)˜è®„œ­eÕˆF™æ-aýÌCáP}Tµ­gU_m„!@E^;ˆÐ†C¿Æ’›¸vL -Xw—fÒnòÒ·V³/ÔÊŸ¬¶XŒ›,¾ ÐKÄSdZÄ@ÂÝ 0‹eÍè]Íü¨å�»Vâ5VbJd½¿&gÍFÖIÑuO+lêKßv¸uÞ±©±» l­ÜHXù?°ƒ‡~uÇžfÙ±®`cNé|+å_K¹¡™ý¨’,�ÉÐÈ â„½»0Âäõ–þÐEKÒ X8ŠøðšúW«Õ&ä]‚øgpÐÞßÿÁøý1î½ö: . _t m>4%ó &¡pÒ0?1KgZCù> ¥‚à?vªþÎF+Û¹”í_Š ëìe""5³Ž±žÒHz{±·�×%¶�æAüè �ù‹Õéœh¼9¼ä6ÙýŒ¾Ró­²²n¥ÿ¬MYÐÖº©oh\’ˆÇ]zxFŒ2P¨óþü€¶ û›•ù¾™Ý ê]6®q¡¶l™÷žVË@`(lø«ˆ+’å9T¨ŠœM aIƒ�?cj%¼¾0¶±(äÙÂC¼Ñ· m�ý¢ÉG]­l¦î‰ü!¼¢–~ÙÇéé8 ’ÅNŒÀÜ,ÀÈ‘o²ÄWã%ÆŸ¼×Óîs’ ¬YOÍä‡�£M­’ÞH$ÓVÐh°>95•^8ûz½6ÅúÐ[‡oœ3m^Ý.2�kÖð2’ Ó©¹Îܵ‹[ªR“$š q[Q¾�œ¼@ÿ'nÓË—ÂMÇŠaeö#ŠR¾…â-9¼ÙK/`ñ·5󱋩¤ ¾ð~VÌlà I}z·œ0pYU:[»qª‘ž~ Wì•ôÞÐá¨T1{|}qȰ“§“Ÿ…®UÚíF5Ûñ¸Ú´É!‰äØ~�ß6Yœ�Äž±}ðzÎÿ{ ÃŒ�#­q‡|‚"=ÒÂ}¶”Ÿ„Š=wN¦£N8háÂ�ŒðF­tÐwd¸šÝLYÎ(Mk¨ŠŠh™£kãPîJ^OTçkiß]™©Ö5!�Ú†pE fz¿&VÛk=iŸ�y¬˜\Ÿ’4y¿ ×.1Á׺[j¾îå`ŠcÔÁ©ë6? hV ò¹y‰0g"-çy,ω´±wmÌ'îD™ $5æ+J�çÙªdsv«O-·Ë„)_g„Ô«¼¶RÑh‚\¡ÝóÛ>;¡Àb4Ñ+eÞ)C—kjtn]²B`Ê(ˆêeæ„ñùw[¾¼�Þm3¸xö»t•µ�ÃxlÁX� óW°)º'n½pœqWÀû~Τ7o:Sst!û¿9ìJü4òa8×Ô'ìF¨ìËÊ�»W1³«ç2*yå•ÅJKŒYÎÄ.7Ð=¡[H‚Bï½Êþ0]KKkIò…©Æ/l¥á�™Åo( wwL‚:…Å €Ñ2+Úi¶ñŒUŸ·¦â2—r¢#ÚÝÓw2ä©«âéÍGû}¿bævg=GëxýK6Ü\qlÒ^£2Wg(˜Æ1 !.·4ƒ#ÌçW<²Ù«”ü�Wó$ØÔïø/’t"Õ[±:ÞpjŒÐ£}EîÙ áŸæÆÄù|Ý�ŠÃ3t[Fwf6ÍåæÞYéVõ˜‹Í˜°šªa¿" :wèq.¨™rØÚÚ�ÿi !¨ Û>Õ’�J1)|^¨.?˜2"ÛEÇ+ìZX;°ßV­-ÀENÅ—™é-WY@‘ ­ŽBÇJóN/ûÓßËý±õhUñÔ\pn‰Î~TEÀ×—¸Æ*‘ÂJèÐB˜4H]}0`i�úàüçá�}žBÝxx=ü29J„ÝÖvŠÙKÆ,XvCiÔ—^Y;�t‡­ÅÚ–o›é¢UFù „�ê¨&àš5k-¿†Xû¾¿_|þYüå ·-pµwÇŒT³²ù¨ •¾ ”Å BÌN»pÝ»NH‹‡Spšóhe=£�„ÍŒ0—ßÅ�ÝË‚@rŠg8ƒ³¨Ê#Àˆÿ�;2Șœ‚}½‚9¼Óã§l¼û:i�¦XFk÷V]ÑëJô·ÅÂäù}V¥æÃ¹H Ñâû-g1„ŸKFSLûÈ„ÿAþ×!FùæµgÙ&õøs3kü¢�:ç¿ÄÖgqMy?¯ô\‹nv[“!]ÂÖ:–+Ž�mfz4„o« ºŽ�*'X<-±‰°ÂÆÞEm¡¹ÒZÆ¡;ƒ`£v¾.Ѥþ³eÕƒÇlhX÷ɾ2 ½¸¯|ðª!¼Fð[ØÚoyf-iî³9[ÝËÒé5þw™¹™:ÐHgD3e,|µ– 8WŒ™ºöŠLòý}ˆî«˜ó¤¨öœÄ ÃÆ9yœlàöªx^"qn.×CÞ_z›¥`£Ö'»1Ò"e–wj¬`¬Ì/œdò­ýú•i;Ð�‡Dƒî�^Ÿ%V ¦y¹F7¿^ù¬{7¥Ðmþy¶¡aÙ™—XsoíœiÅàñ‰ó8Så;¨Î˜ê阛 ³âøB«ÖÍ»6³Õû—>.̆è!ëÞøÆ/z£ÐÍê_ác……¶íd[†‡Gî�Æ�iÛ2ÝÌzECǹ]$AîJsG®ÇŒhȵÕçs:ÞmWtÆý•ýw pûQ%©¡2+¨øhv-v4곤¤ |¤»w…”6Ñ3�+„Fõ6ÙdˆƒÒ¼ÀhOá�–L\„û n½×ñ¸öU½±>©ž^õ½ãèüž¶äÓYö»ÔOµù/‚z.b·bÊÁPºƒk€�:;´…5/F,¥¾–ïA‡ËoZ p­‘:„ù㮽 �ë}®F*<-�$ü×› ’©­: ›r;ÕíUª"î9SÃnèÁþïrIpÌgÆJjÇoï‰ùR«–ǧœÙPŒ²§ ÄâÔß˹^|¤`”4( H:c ¨yÃâ ¸y ³Œþ)ÝZlƒÂlF?b𥣇Î5Ú“²Øíƒ~$™ó »éï}ø™™›^¹®›Þ;Õ8‹c\M¦åøÝŸ·±¯º f ±ðÒ{êµäŽ|çÜð[ üðu_:ºôz¹ï¸’° §�äA¶£=$Pb |ãE–Ì/éMЈíf��óôÜ@Ëèo¦§¸£¾AÉQò½m¸;„ÊG_<~¬Á™Ø`r$ƒXÊ_2ïpã6Âë÷'|muþ-‡oO›·zd`“9•ëõ­îçhdx½So.ãØß+OÒUs¹¾‘ýˆ×ŽàŠœ턎S'°�¡ÞÖKÝmauo-׺2jË7U.cSâV‚%•y�«¬‡jàЂàʤuØ.]Ôðu}ü¿´ö÷fý!ÇW=ñúBç�^¹ŒÚÔýFHŠYßÜã¸7°ü[Þº¨¼@šHníAM”m›@ágá� bc—¯$ÍH^é„Gñsfr�3Í‚Ø€Ü UïŒvú¨³¢wñoj`y³èÍ1@ø…¹è2ÙeµˆþéÀj– ¨ÜO9«HnQ‰Oë'ií¹ú5v�*�í®[b Â¤<|›[-ì Ÿ¹¾Š”ÎñúÕ~’Ê©n �›žË\‘²™µ mØ Î3áwz6…Xá[$üK~�ø ‡¥7{o��j/3{“·§›2¥³�ƨàUð<†xÚBÝój›©E¢ëÙS³>žê•į¡j¿m”`ÄÍÜp@÷À¿�cî`_X°¨ìI=\ê@Êô¬Ù Õ|È„ž«¢ÔÂÛC�'Ìï·k=o�OŒP§îÚ×�f“’Ö$š•i¶ÿl³)Û·o“ì™à€÷~óúì?©r{W/Üj( t¤œ(‰a÷y½.—|⨀Þá%¬åã ©iÁ\#vCé H¤.Îâ‚N܈ Zö\Ùöï­ÓbS˜ï“‘!Ÿ[�+Ë똶ê5ÔQ!dƒJ#§¥à”*°ônõR…ZÍÜ/Pù¹ ^i*qœº­˜+2̆lˆYŒq–žã™xÍÐÒ£«Ä]m­8I+óEvüh Ö“M²Ñ÷׆¨¼rƒ!ŸRélÊé˜Ðjû•…²oHŸ5w„P¹«0ØßŠÔŽÍwAMõîs‡9Û«»àÇÐ-¥Ë~‰¸âýoGì Þ Œ¦ïÔšAš1²j,ÉÌ)i4µÜ߈ Ÿpê¥ÕKèØ?:šWT߃(H/Z05jÀÖ=‹79•›Ç»TÖ<ä=hÇåÏ­ÃY¹¨=Ø1Ûʬ©–ò¨Þ¯‰- ãöFÀeJw!G´œ•öTž?5ªÎÜ.¯tX{î@êÀwl�ØÃx�„–̃örL*íxÒ‹”XA†mÖՔŠ�«:âá).²#œµ<à©V‚¦|ó©È 5ÃRa:�dzŽp5À"QIÙý—×f2 bl�ííu�01Q'³&o¸ó3�Á¦>žB ã2« ˜åB“ä_¨Kï�·Ä«XT÷«gP¾ pɯ^žy»‰YØ΂Uq‡©yØAüû¹+Wס͇»[¦üƒòû³É^÷@MReÈÏ‚úÕðm¶¸ ‡ˆèmxÅ‚ã4�Ë`D½œ33ï,5‘‰µØú*y¬9æºv«&÷ À+ Ç •‹‹lXC©Ú€zð0�„«VoÎ6à>ˆ5Ïo�Û æ¼8¾:Í=×�«'‘"þ¡å Äaã¹_ÌÀFkÚݧ±_j`vKH2»2ãµ­jÛÁZ­&ªíp¨ÑDðíe±EŸêš.ÑUí,‰ºˆ›HìçÊÒ‰Dúm"B�ê*}À-´döwúÀçuŸ£_så]&±Rw=ˆ�߇å¡ítø£Qß„êý­$l±Ç†b3´+�bMÞïŽÉ¢vÞlèŸãZÕg‰Ž%fjC§ýD oо¯›«Íž½ÇÆAÍ ß~@k?Ö{æ6ú°«9S¤óé22©x®\lvÏ~hÎâhwA¤d¦´'³Ž­¿‘ê2í�÷"–L e‹XZ¾¼—Ùò=@ŸÖºDÓëï¶Ñ"b»3œÃTiÂ?‰ /éçráp}¨æ~Œkjx{íÇcVHÉUÁwQÍg—Ô‚×j_ Ïñ�Ëóí[¹°*L~-.N­‘e Œúð:ÄçÐlø¥A3{êg½x¸«ã³œTU �¼]ùÕ9¼ìã*Q!æÕÆëH?*ë�µ´ÙN8$éH2Ç`BRáÊꓼ¹…ê¬Ñ8šJDÖ½‚›~ö¶ãÀÌa²Ì™ê”,Û+DV·HíWf[ä*¹)íÝ)&õ‡«Èâ݈›ÖßÛã õ9`ÍkiV%ÞyëÙedz;Ø ?~×�:2Ã�Æ`E1‰Ý'B*nÈå ‘$æÎ«~�Í‚€”ÝAš V‡Ö¦ä¢‚·ðÎáó™Î_!þ°ÔËÂ{•Ûç+³ ©.À¿‘ÜtcópÝ|[ÝHäóü'ÎgSŽx_4™ðçV•#`Èè˜Ö¸€ÎSþ‹ècv1=ÙA�_í÷[àT/ªý›0”€÷ÒQÖI?Ï@DdÎ�¹§wQÏfÈ2N^îÃ×cˆ¾|MܘÅðÊpÜÔ½jŒ0õkmòÄ_´ÐËŽ5Ò¸ë¡ÂãY‚eÍlÞ”@̬…ù…Dh¨#œä³ÙlŸ·6`¾qg/꽯b+ÌéþÒ“©[BÉ"û?®MÒ¥G•;øMP4Ë/HtaH §Šb¾“2$ r 9}˜\ÂÀrRÍ¡PòÏÕèt8¡ì�x¾ç�†�s¶ñÛ›\/–ØSÃWÛWâ†Ï™Á„R¢c/�ÞÊ}#ÏÃP¤_ºÄº9e±Ù´ylц"Ào9öpâ-B,']z6’½eÞï Ül/Q�ÆÜ”�2ã�`ƈùs>,Û® , DâÍmã½"C2\‡è�W·›qÄ"HkiîðõpB‘¤ØÜN}hëÛO£€:»wØyœ‡Ç‡+áVÖäƒ#„ñ1Ó#Àñíäµ€½¤hK6_ß�{… „J«!t’L Ó†û®%õ�^"¢o9õ°ŽzÐ'•ÎÓáÏ‹…Ø\ôÐKŒY�Iðf>u»ŒFD(i»˜sVÏpa²?�6†D%¬’®« �ýN6v@ zJpûˆìLú]\­ÈW«›o™Îa­Ç²ï>&`jó­Å58Ñ75’ÔÚs™@�©�†7¯É¼uþ]ª´º�ùi£2._/Ë:·ÏÇ»Ø<ñ£ºüì9°('é�4ÖG³›X‰¢ÑìÚ%|~áHdô;ŸõDé†ÀÕòE<*ô¯×crs~o**—›¹Á»è†=�©Ð®^õä{Ò3îøV”;¨i¤þàX€EFÆæ’dUƒ_åû%±±Ymuš¶õSsƒ÷L9£åž½ÈkB í§=Ý/eò²84CÖݠǦ�íü¹ºFHã#½�>Üè7QM,íƒu¿Z”;su¾T ØE„™ÞA›‰kZÚž:�WÞdݲšÿIÂñfýQœ+%cöDL±“zmô–÷;�ª9O­=P®_„“¦±+æ¢Î¶ÕÈÚÊ ™ã ßW¦ òÅøÙé†. È}uÄ*¤(ðšà¦s`0fk8x7€ËRÄ7‰g�þ³¡û$-\Òv§£|�~oí&‚Á–=ñ«¦"#Ï•ÇAæ>ãJ—>8f:ýÔ¤þµÒ(7Í½Ž°³´’©Yáç‰d¹îpIØ3¥Û`BÚ}Ò©–�ôóœAXà”ç=Œ¤Î& ûðÆÏ�îm}ö4a6,*¶ÂŽÐh“`º'é¿Ã�8y4¸ôÝT$6 IǨLƒŸm\ÈÖKì=>%aOS¹I³™Ííªô³–‡v¦¨š]í±#¼Æ.ÎqXäýóÖŽ-­7G½Â¶;qUÄ¢ZàßI�Љ\Ód¼&}.¯›¼Gå+ Ã3S@Õ«ÚöÐN´�V™¦„g]ØŸE rC`ç²a¢ÇšzX^bzEc»½òÌ‹^)¡b '‡F„ª¿_®y/Ùs$ ·x0`ÕvÔtí‚æYfØ$j7â‚)ŒF™!ž^ö±…iñ¯HØ�H„§ëx"Öìì&÷¡žÐpJ Z¸A �Q^o±SyGE} ôs—aÆTXûˆo‘¬EpE¸¶§zZ Ì‚§Kh X¶CM·ŽÅÐkÙlôϾo[ ÀíÜÁmÒtmcÆá/´ ö¯ÁRš¡qÐ;‹vá¼JG§¸Î­Þúpi‡¸-·Ñh}L÷~¼Önàõ³ÅËVa3¡Äà E›Å¯Ñ‰žNGC#ÁmÕ<ü­Œf3`4^ØAía&£f!6”ŽÊ�{Ñžñ;å]hBñ¯V79�0¡'¶3}éà2åiŽ3wyŸ»»÷!f¹Kæ.‰k,¤S”Ÿ83Jî[]uÖf»òóöårƒÓ„Ѽ,‰£DqÕ�³½½¦àêB/)@¹»gE~c8§G³h¦sK�TÑd2¡gÖ6õ>·y&¶ÂOB èæÝ  =[aºxÀ8ßÏá±Hò?WdÔ�°|µ ¾¨mÑ® È´œ½¼(›bBDoÀ¸üEÇÈ„[å}ñCº˜Ï(x'ÆE†ûÏblo":åìJ!PH±ÑQØêèwëYwÞñ•Ø¼È ûZGÑbÚ*ÎÐcÁp†|>�SÜ-‘�+®T-BX½«ŒôÄʼm6<Á×+üýç�NÇØ©Æ) -`10�q…´Ö— ÆÊš�€¼Z˜Î“Eð–{ËÁü"÷mÑ@îa 5ó-\ÏÈZHLJ_7üntÉÔI}dÀlLi+Ö—Ê€Íd‚§�"ï3‹ÖÓ3÷$S߇B6㛹ð™D�rŽô¬3i:—g;‡nù+„àxÎ êV>Ôjã��Ù†Úr'hµŠ?³­ø•ƒõS&5àÚ�wc2àð;µ[ÁÖ9R{нâ`"ÅÀ‡½[Ø"üi:ø6×ë^Òãmuõê)º²özVH*冞Y ”}ËÄ «º·\@Ö­Æu0þÍUŸK YS$’ö² KàÉâø7Ä£XÆ]êqxš�i Ý~éh"›åbºÂJ/édõù6Yˆî_Í êhk!r¬ïä"q3øø¹ÇÐ2i´B*ó&ˆ|Foi�9bÖnÃFÀ�Üëâ:z?Ń 0É]^ñ_,‹0Èf-¾Ï8�P¥£Yºç;&q¾%¦K�o!ÍpáÚaÍPyªRSÛ�‰d~Æ;«GZ«.l)Òôî+«âÍ!¯š´X2fÒzªÎý³Ü]¨í‘,ð› — #9.Ù°Ê8ã¨�íg`ñíÛ—Ž-ד\\XÍ•~^Iô)ˆßw{ÌîÖˆxlưQ0ÂKŽØß[´=Ï|.´ƒ|¸ã ¹qúÁÚÌ=lï±á–BÓi�,4AÚÑ_R£E~G¯— ÂI±tN�\BãÈDBMÅ÷ÑÒØÚÝŒáÎH?›HÞ†0lðEÙåÔǤ -;º,Ù:\l~·–péá#Ï0xÃÓ¤w8öÀÁTÄ}„45bî´P£™á1mâÏÀˆ{ÞY�áS 1lžV2þÁæWGmrÐ0uE�lÚs†1 (:Ãêè&)û°Zpoää„[|)r)!wЄàl æïqˆ)³Ê:ÃïU’žŠã~Äåd¥p÷[�X2e"9Bâ–º#@=5¥�†õ¾]âüãëA’†@jݸöÈ*@jȰ@Rây]Ò ¦1?š¾ KC ‘%ÄÁqQ½qX´h`@çy[¬„Î6Ãq¾.WZWÍßÃ]i-/�O¦£ƒ?)]wb(Æ/e€�[rn�kŒ�Ìš»��‰ü/Ù‰sAO;TŠ‚DÕÉ’Øù;¾l™Œìÿt>ÖHoM…pq�¶*z×@ ~*øWõñfäŸ0ÓáUßäȶÆažç6ß¡C’½`�€ÏÐiï�ãJƒŠÇigÚàf´¤¨ZÍ¢º /<ñ�¾¸Ö+àð*+êÝ*ô‘â´ß*Ø1Z4ÅŠ"‡¹z=AøtÓQ) µ7øz�lp�@FÁ¬ÂŽ·ÃŽb‹,¬ëk¶×ipPò…à¬âbÇ!¥í*ŒnBC¶*ظÇèã¿= wݧL7,>Ï®x·à[X¤mgŸ4ÍähUÖ�¾•¶ƒqLÔè”Õ§œ½Î&´¢°ÿ±%–‚üAXõ%`çŠùfA>¸ ¼”Îè d­ZDDµ+N-Y¶š›©š–æàzÃØÖ5Õ‹¨’ë#|¯²NÉXß“PæQD|d7ˆ lð)7©Ôî®Æß¯B$»7¸øómž�b“UkT=£Y�[[[Š³Ø Õè@éY©™œïž£ÜqVÔß|¾º»’±õ—h—Vѵo=¡G’ ‘nЫ Œ„Èଧ¡Ù`¥Ùýj|®“*6LpÕDú{Sóp] éÉ ²shîψ˿],„é•wg^YÈFš0OmÖ³XŠí¯%4êi‹£*ZøoÒ?‰,\éÒ=Ï+M×k¥±H;ÛW Ì­Ô®&¦¶qem¹åq‘¾1p/Õ,AEݘ¬>é†ôc©èìú­R«,�Gåc1)—]óŒü>ÙŒH.Ī4‚ãU¥k‚2ZÞÖ'‹-xêÕM÷¶-ùYzK"ŽÀŸ˜…3c¶tÙÎö§xŸZ÷¹YƤI[aÃ×<ÊíÝÎ+¯Š¡Ü‡•ª²Ü(Ë[ñ–x*k°Æl<à Œ”I–ªÌI�å�=.n° ~xÆb_-O–öm±w‰Ãk]Ò�­€æàã“+˜æ:Ús~[š]ªÐEö¸Ø’É ã´̘3‚Î}3f]¸8êW àÛ#ƒ´ÊÆ“MJI\™Í,�1\Ôn\hcRÙ­�ÑÄ$AöÒžÏê|Ýš¾0˜Z#$Rf‡i~ä-Ûc™Tä­ ¹•ŒÐ!¿mÛ!$B´2€™8„ü­ÃÖwïmË-鯰N'›Ÿ’d}¿È[µCt”taªxÚÀx„5fqÂ~æ H·k2[½P3 Mù­Yt)µô² ~#õz5‹OA«:}I|OòyKöëA¶¤ç#9~&�ÏÒ[ýl¦ÀpÛ+“®QÇöç mÉqˆ™OÜ_…³ŒùeÓn½�<`äuNˆÕÌÍSU7¸6ïKuÂ!é7¡AÚ»cØUm“ì3ÃÂpYW×и9žFO}€º±Z½×F,o„™·íè¹r$Ž{…�žTÜS´.A2ûš›ƒ§ÜPB¸ ’í½d¾¦DWÝ*Z£q�’Öõž‹îÐÎã{Ü'5 ¶G�®üÊšÜK¥©˜,�bů%¹íóVóøxó³4ŒUr@"‡Êö@“0²Û–üü¶Úàb‚A0]ß¹àFk´ €�«÷Xb.Älaâ7@¾*ZËR»;«:~—lÍ“ƒž]HgX—foŸ™Êüe‡à…q»-M3œ˜f‘^Ó»]k¹+ªÛRç—Äm p)¥¿EíK}(£Mªßs˜Zb‡–²8›Š c!C5 Õf¤±%†ËWu9l?©¶@8åk›qÄ…úøÆEþ¶!jOÛÉÅ­—«H¶´A�Á{L…ð$U”Ê[m/AQ$ÅébQQ\Q_„Íšà²s5eÑ­Ìn|ºá¯[öFO6Ÿ•ðäzæø»ª²Ý~ûîï=í¶†uœó]§Ìùx^âcŠƒËç[ï8w¯ Zª½{úüÜ\'Û9{lVÑß±µ™mÕ}l æÏž_’˜xëhV§ìùó’)Ó`�dã)>p>ðtwλ¤°¦lW°Ö\6Ù™ê#=a«F }ãE\x‹·Î[âýWŽÄ;­y†5tûß®2Kaë�¬Ù^,ÍÉÅ*{P¨?fmÅ0�þž� ëFBÚg·ÝMîÐVGËA`möwY5Á›(‘ð®Ê0€vNIµ=� ^eóz:]LÈ¡àK¯[¨$Úš¾]19®¡JØ÷Ë÷‡´ÎD¤@–á‰Ög”ôÈOá>òñŸÂ¼ûd×+¶éÍåÙ*pvµÍ­}qp2ç8(ÀþCqéùD!ô�ϸ Îýòç VL±2x>ç .†”3ºh€Wì~ƒ´|·äÀiLáÌ¡ö MÍ£v%韪_ËF e²…ÁéP`Tƒ`Ýû—ŽaÍsÃ'¶ÀÈËÜ­âMãG±ÌŒ»DNŸMñ—pû@Élc(åϽ·GõÎ'œ,WZ`u¶"+I>�žØKßf¶Eº6 ÏÅU c[K$óp¶Wû%ä-Áž×ðŸKón;ŽCØ$Œy¦àC³Àï8Ý,÷Èᧉ¾ºÒHYîÊDO†»óœÐì·Th˜ïÔýŸlHø·ˆ#Þü·¥Ó–¾v· $¤Ô~l� >UX¡÷¬e!�Vá£-&„Ø�Æ â bæÊTšk›0`oð…8X+7=Ò`Ç6?½Š¸òVÈsfŠ�Ê4“ÂñÑg>J‹ÇB”8=Híõ”K¾øùÒ\c<°eãS# )Ð×ËÆu)yyŽ«ó—_Ûž‰ÎÔ´Ô“(¿°�6ž�—ÝŒñßZó–èm|"yÔ„‰" „ÁÄshFŒ¢�+„çÜ`gÁѵWé{¨@a¼ ZÓþ35¦ó\Ùµùµº�¯;<5zõ×ÊÝù³N,ÏTèŸÉåv¿–²Qà “F tºµPåk _AÛ¶gZDüB\Ê1Û} UÍéíÆÑqô˜h„0U9PÝø¨óx³Yxå`®T¯i‡;œ%xB†¼#Oã)ØâˆQ™fOšwaÅPî‡"câ+ß䣂.‚BÊ~û Ë¢$øh–×ùAC¬_0i†~ÄÜXÍ1ô7sÌÛ&z¢&J Ó,x*EåuèeбkÖ~³“ŽC¶‚R{¤!É€£ßrÀæ,Ç}ÍáåƒZB6'A%´m!UVt³ðóù[Rv�¯Š·{d/ÔI½Yg|š9à•o%%ùíÕà$¯tª¶† pH[‚°�;>?÷CZû8 õ×_W”Ü´y{ôVÜ<ôE9d�€‡ÜeÃ!oB0Ðî\Pù<‹$h·²¶3ÍÎùÜœq~Pšìþ½à7j�o¤Úޱ¹U÷ì<ÎÈ«»úé÷ ƒ}0±Ù¹¼° [Úf0ÈFƒ; ’øu2õö‹bºØÊOvóav§”vøp Grâ®L4SXŽ×‚»ò,Z0‡êAÉÙâr‚½ �–ún¼ãÏll¨rÍ5|µþe~2>‰þY;Î75…aœà&äqÕ‡…üµv‚$©ñtðqIíûΡ¦ÐËÛ¦·ãºýîŸK2OL}Üàw|fSÐa}3tŽû&6œQ.°ç<:�O²RÌúl[Å\„+Ä|F)ÖH›òç¶ £Ãd .é—C¾ëŽ„ø?ròhÑñÇ+ÝpùIÜ ×äYðq3É~£Ã²{cˆG‹QTÁë•^ô!ÉYi`××¾û¿ûïìGƒ¶ø=¦ˆ eëw•˜ ØÃfO\êYˆÛx½{o!·pNÙu¹EÑ6p.€Õt‹)â ÄQï;Éž[ ë‘†4+Mcf³ÅËU�Bqvµ¯°(Íí:õHûf@á½Äó Ü&î_WVÅ‘EÂ{ÝJ‰ükå ̋ߓO¼½ÃC}E"@ˆÒµk,£ ˜ž­î„þ‚ í˜+Nè÷ «¥1âQ—ÕdI›.ÈW·d´A°ä¶©?;}\çCÞÏI^³œê2»ƒñ‰ ¢cØ�jóõ¼ÓWõ#ÝÝØÂ:ÙÄI*Tl’}nºŽß�3–b>š(„‰ÀwK¡½à;AW?·„ÄÅÖ’"”§��¡— ÷ÒâÊÙu7¹Ýv8›-ÇèBd„1�hqÉ8 < ©8 Ææ“�LP äpÜB€-è ;â ¶+©–·1‚9v!À‡ ˆp-;渫yÑæPÓÁgš”ͬÂ<à…©ìŒ£ö÷“•òz-l¹Ø[‹-ŽØ<«á)ïÉ‘€ø1@˜· þë¤�[Ç™MqäAù»ÐwE.DßxïdQüó*¸å¶éb¡¨^«“××ÄÀVCµÔ?�\”¸WfVfáå±óüƘ‡�`ó꟧,‹•ÏžÞ[ÚËL� õýx(ºÓ®>ÚlÌ”yw¾•dx¬r;³b×}´mû6`“ç¨ó®ó-ñ[·åó‚û-3ëxÁNŒ &N^[¾“ÅÔØ³6P,ç‹vü-)-ŠÆúbg_ó#_ûÅ;Ù·fú(ÁüƒG•Ç£m{úÏŽiŽ5ãíÚòj“*w$¢>ÄIV:çÕVp‰°‘6hjfàÊxÍúœÄ¶œ¬¤š§1qÙ³b+nA°F€­Ý»tf?½‰rðÃ)j_?»|�ø{|8KƒaFXíÎì˜ÄTJY¯wµ!\ŸòФ¿ÓeögA*e•}¦l&‚ÉBÁsš¸ƒþNÊþõ¶Á‘nŽÊÚ–»VœsG×NÇҼ·#õd;J~uöR¬qZpú�1“€ÞȈx÷–F| L¤×K\qÈMcqZüæ—�†2ÂiâX…áÓ‘Ä�-rÀA†Hu«s%vË òõ#¨qF¦že�üz�Zoj‡Ô³ó�/6³öÿ§†eÀAPX$ОÊáª7ûœÔ²2Š‹|XioÛ3ù Ž\ â¼ÎäAŒm*3§]2Œ¿v_Peõí,� ¸z�úê;ª.vðÜÌ{,ϲ;|a~¥ô¤Ž_”еèÜË0Æ*í=‰…IPõ–Óïi/+K%”šY@û³„í0eH”¯=½í¾w¶É:6Võœô¶ÄÅkö¿:àrt;`÷UYyÖ©ºêÅ. Ê[vÅ!EL«ÃY >ÂS¹ÆMqDÈ+v`•ëï`˵*Üö;ݵ×ÇÑçÕ:ƒ)Ä#á8�ûç��ÇLøf€ò U‘É(H¶El÷B–5Nûacaùð?Ño<¡_ÜØAœ¥�Ѳ¿ñÛ¨#j–d°Ò—BáÔ÷E‡½›(­v2k6ì��ð÷›Î¯hÕrÇ+ýE±H"Â6œ§ÀÏ ±kXé@ÂìÅko½8\ ‰štB›§sVhJßo‹[ÀÊK¨p€›_×Âv&ÀâðâþY»4„ÓÁá­l: ‘V?gÛÿÓ¶�aì¾ì\–JNS‹Âƒo�ÃÁÒÎÿŸËg<˜Ö­xl™ªÈd3­kÔ;A ~ã¶v)P]ky?(<Ô†×\ %á߉½H;Ï÷ÃZÛÍ/9¤—ß�óG7hZ:£È¯±”.mÕ"÷æddSGõ×öóiXFÓ:¬q`@“ôÛ%€±­Ä®ýì6lÄtœ¦œEY9ýþö®_ÚÛBÅÑsòºì‡4ÛkWX„¾.ùì×Ïû ø,ÿsy\€PaÀG' 4;» ®Y÷Óê› ÉÒ0g£LÝÐñ üUoî9üo3É ³Š`JR..ÿ".WK1¯¦ñ{R„¨J$¿o ¸U[T¥°ôAØ΂ëcR¸ÆÝL@X/®G6èîõ‚I¼'òÝ[ˆøñ\›‰y—þß²Ðî“a¿k-ø| %Û[Ý7U à ŠÜ{^(±;ÖÁ`Äã!d$YÆ1![Ù p#aÀï#¬å™�Þ®~Iì:WãÛQcðË]0­„riF±•Èe6Ã\~ThX®M%€XCädç©îÙJ•n¿» ‹—ÌH2¼H›ÞɧV éoé ãLÅŸŸº„¸,bǻٜÊ�m¦‡l Z™$›’B·0¸Ù(^Ðþ[=±¿ÌSªŒŸë—0y pòüÒšìp'¢jIì<êiÊr�#æåÇ!¢OnI@ÕpLßm@þš¼N0 kØ©n¨tÐI E•ð•¨p&éjÌ‚æ·ò­vƒ %k®C¯½6£CЙ‚ ‘|ýêLÜo]4Á^y‘ëEð˜{ë+Ã@ǼOñ+qŽ�(³¨Åƒ^ € ÆO k’(Á[7c·Ü”hÊ9‡(˜dtÙÜzÐÁ)…Ú–â/ÃEåø8ãb73�[UÊÇcÛ®`wò¹Ó…¶$†rFæø7ôÇ.� +ªí°¸CµòÞµô¿šâSNy²¬£¸.4ï¦'†!úcx”iHàèÓçU¼>XéXœv3û\›VnÕ”eUÔå Ì.¿¦¢ƒ ·Ú;¢ã/ôÞ;Wµ@v ¸¾Ë@w~Å8W<ý{pD4×¢?ÀpmÝòô6ÚAç�ÜÆìóöæÇeXæί~t&á¡Ðyn”7V•�Œù’〩"'É\€�]êÁ¼kŸu>Öq�rÀÆ¡J�aÓÛ8™»öãâ÷=Ù{Bƒ1²rîä® ( ;÷8”_¶¨±®kl–0!IËMÔY â½ Q¤Š¦+P„Ñ`2=�4Á)\s’å­¡§% rñ³-ùQÁV£$sµ‡[£É&-ˆ¬sŽt”#CRVÅ›psû`¢Q€Ð<ýn�Ôã&™¹³ÕçËØ PxÙëÑaA¾ù~ÐŽ¦  pPKS93ÍÇxËOæ�ª•³Jà¸/´Ëvêž’çà!Á-ßÅ€tb âF t/A‚wIoœø®p—�Ìi½0ȱqK Ë³qÊ:"ù–¹eš`*l%#OÛq¼`_ †kbåø%þÌГ*CLŒ¾AကlææAÆSÒ€Ps =4Ó4[6#I°?Á¢ú\<‰}3ZœE6ˆ#’Mý’;Ìò·w;Ý ´¿Æ8q mz¶¹`‹†�†ObMƒu‰ÓÒ –-€¹¾.ìh‹–¥9#áÚ�ÍvnÒ½®ÕbT¹ Ù?yƒþ­éí®V;Ç¿ 5nµ5™¿'”Ó&¨<²ÿJ‘Χ篜® þ”kã/•§G�x$ÌQþ²�Ëí}fyàçwê�Ëø?¸³{&%>¢ì}­—ç×À�´¬¹w¸†Ê-üÿÓý!#¤qk,h$;Ë-6í !Á|˜%.hÏŠtWÝ¢¢î?%„KmyÒËqµEëö¨­¡ß €}ŸÄ Ž@Û[¤¯£ñ›ÒšÑ£ª¦CöTq´øl2‹?Ü”q/ì��ÇK]²Ò4/¾Î—¢ª�õ½ÖϬåûË¥¶óÚ”¾7‰˜HQvÏÚU•"Ô47eóœqÉ.ÙÅ:%%_ºïó_7Žõ4ø*p¶®úüÒ÷nXß¹¦´^­TŸ‚ˆ†óæt×mÍò·‹Pݦ‚áÑt»A®C‹"œ¶ëFüº³j&xbL—X†ÏÒ4‚ÀÆ€kò†„1×µ�ˆ éPÊ\6¬.3¾sô�¾X }ÑLnšoóÛ3ÝH>…YTñ ú’ÍÁÛÚ°š`ýçÝwmÃÔ•Ì=|ŒšzÜË$Åo‘K-W¶û'Êpž4’Úù>q…ŒÓ±û"hl 'D7¬GgÜ‹òÒ!f:v[¤6d&}n0fQn;9Ã{ G¾gX\Μ}|Oí,&�±spÆàö2!„×ÎÝöd6e°¹PpÎèÛvÎ]�>± ‹‡6ÿHe½ÃËNÓ‰]ÐèÈv2³7§MT¼ªµç%v›MÔ¹ÚOj ¯™ƒ@€0ÀøëðeúR—ì©è‚B÷`êêÀh*4ñvÛë§°÷z®–ÃDò“O¦À)mËüñÝýÓýuÀP½ó n¸™x mgüüú"=uõþ|D÷[­µaãwVýd¸ÂýT>_£-€ìj.ÈÅõ‹µq¼/ŠNÔ#q&È.„í"œX"ÃigðØWHÃlã W‡Ärü-iëÛ»Q HŽÍ¦BÐiFh5iq1Ý*ÐwLlÑA ¼æÁ×"Õnë�ásÜ íʺµ¹?„‹´Bì*�_t½ÒS.¹†$‹^­ýsz� aïÌU—«Ô¾WjqËáXÚÈÒî‚@�ÑëÞÖ³…j·€ØÛ<¸c:Ga¤üùöC2í"Ý´Ï� ®ÂŽ®T�{�ro� ›ÑYù¨yËdþÁ�³êLÙ Ð(¾¢od»7rœ•Aìðùúï/mg±¿=ó)Z@½Ô b-ŽÃ4ì ô,õ ¦�8kâÑ‚¶1L^ªµ·Ü{Σ��ûÙÂukeáû@ïà ܈nBÀŒÍýoçÕk}±m$8ŒÈO¹�:¦ ÿ¯'kH#•Ë"¼&ÅaÌmˆBZÜΉ2Ãç«LRÓÁQÖ]-|zÆO&_ �¢!^võ½ÞÚFsv-´3¤iƒX‚ /í–o¨0räÖ=/®c"�vE[–?$1‰^"J RÑKÛ´HΦùÕÀzI/!ÞÕÿ^‡nš†@ %<È_ú¯=7ŽÔæïV£ô22�ÍÆ&¡Îÿ(cî[®vgUµ6é-0rT.Fiý«ÉJÊ]ÖÀÝC@±CS•[jñTv¾…µÉOâ/ iB8‹Ä,5°èάA7µÐwín2Ô™��…¹ËÒ�Ãï¿c½ži½\µx8¬"ìåëú(ãŸÕ~²é„C;® >ë;¾îáèèØ$FUT&û QàC©í¦³Î3FÈžcD'Ĉ Ôj¾Z78ŽÞŽ.+­¢_§°�©@~òˆ”žâ²J’cÚ5ßn»óaçÇC•‘Úê$^Úiþ�›‡G8ñç¬ GˆËå[Š»}åoZä2ä©Ý|XØIÖÎ&ñFxšÄ&ƒ¸ž&«7Q_o7“õ.!ÃmŠª)M—cÇÝÀ”4«‹Mg~InrÁÛ²i qéCÑ2·AÒþQçѼð’ öL€Þ." ¿ÚJÝ8]å—ö—`@úÝÛxÅ•ë+ °§œ FCß¼©ùW#ûdqÎ@=Å‹6�´ sºÊͽUÍ�–«¢Ãlõ ¤Íµ`¨#ÇT8W€€(¨¸d3nÆI™rëÄ�âJy.œÏO(7@ÙР¶Í_C¼h²ö:„ÀBsH¡®a«&Èdß_ç‡ÅÈQä¶9»„„ä—>S[ó:©yo®Béq�l;³ ø§Jö åØË|´p7‚ à’gí¸[¸{À™ Á¯0†Öê~õN`L3‡ Óž,<¶= ÍM»Î6¢­=¿w°d#‚[hª¿ä æpä{–uõŧmW>ºæ†é|%ëìnRüø– B¾$ZO‰{%"ÝmþTQkh8åIýƒ2´m‚.} JâšbrpdjÁ5àú`¶¡t¼ÆÂ×ù£–²L+ÎyäÍæñòoŽQ€ö÷½:Ÿî:Ù°‘xi€K)¶~8kç�Gœ&†?7Ú›°ÆúËW�õdí¶‡¤åF®©ÀÝ£a¿®­«Ýÿ¬•Èr°X¸–ž+§ 7e¾üx‰ é´QDÜ=˜MC¸ ¨žfÏêðP±ï—\ŠŠƒšÐjPˆõòìiÖKö�–T‰Ë˜-÷°�¤Ý�ƒ>°Þ¨Š.öæA‚´éì‚ýÕû³ª ‚Ãæ$?¯Î~zßsÕ±hʉ<Ôˆ^u…SBÉ8ãîÇšg¼¶ê 4‰‘[ˆ©�bÍÂö(µά«:»e† ¬œ$ :¡‡Q3Q‚B—jœ³$¹è²c?›~îm|ƒ£si¿±}8摚a+ÝU"+†ÎoÅÊð17Ϋ—¸Kº: Ø×±�eyyÖ·zòª@fq}†¼KÌj[lÿ˜Oâ+e·öˆÅKBºÏ7Ä ¿û"­ù^=Ç€áÕȽ ‡êî8rlÆ/OÕ­¢Û‚¦ðÙû2¡™¸å¯«.Ïæ(nM©ùg5_³ò8_ °t<|ég:]w7ÀcÝîšp¤—!üW?¾3U°§ ]Ü­Ã\Í�6±B£ÙMÀͪ×Í}'-Ë}û0,9 ãÃüpqÜÐÁ© t ¹·¬öz#-ù™¢ã¸K¢m[ìñ‰qA>E=MöWÚèTª~»(Õá(€³¸¾ÜºÖHà^Šq·HâÕ§òÖP‰¾»½ƒ5Ö°–”"Ä~lÐÄÕ¢¸,ïŽ:h ÐDŒž:+órMåµåHƒ=‡}¾€á³…ñ`eG� gTrñ¹ÇM@Z¥ãiEýª›�¡ÙtŽºrc{ÜT\eLÃ-ÂUÝŠÅ¿aµÛÓýçK@ëö ó—êÛ�ý–l¤Q’Øôýmñ{k‰�qü؈ÔZªã2a§Y[6˜±ÃKn`IO@#¿uy%.õ¨V»¤@îU#«œëäú}d�ñk蘉ÑÒiÁoUZå¬a“Þûl¾«f¶Ú«E€QO3Òš%t?š‘[5”Å0µ‡Y-êÙÎ\K|BÒ»m>ó�­IµÑÚøÊpY{ Vøæ{Áµ‰ŸŽ^xÃãÚxa\è¨3(ˆl•8}©Ðe-ùì�­º#26ˆR¬Uxòé7i|ƒÍð/Â@†wlW\sXÜ- ß•¦Pƒ*TεÊçæç±lHɆ~Ö‰Îý¨”m¢ì—}=¦”0âêçÛ¨-»†ÎxÙbr´´~ÐŒ4òô‘) ´{Ñ=8`0´)<€uj¬�N©qT’œfIQÂ2P¾Vp·½?à b"Ý6ÿ{ í;ž„�þàæv‹º$}Ys†¹ðÁ/”N”ÂÓ` lïvl9€Ú“D¬�±[;]dNc_dsìUCÍß‚[ ‰õ‹‡_rªïlx åÍøóp*+¡‹DzY…g(hÓi»%ªê57�ò2\Âc˜M*û'#Ea%LºËi|ÚÌ}Ž|¸Ñ^Á›å€†¸7�üÔ–8˜ãH°xžŽ^ýÁ9k±CC÷Æ«©swŸ¥™WˆÓ£­GˆvæÃ¡ï{$5§Ô’;[…÷‹}zQRkëÔ]k1ÖÇÞ4dã"Ë/oÕ þÃï¡Õ8 ¾®BßLš}L;,öÒ®ìlÞ¦C|ö'+>¾¬~b«�äl?Èõ¨ù›31êßØÌŒqMW^&¥É`\-ö^uÓœ+m,wAÐ%0ê$dØ„r¼ªÌëïmœ�qÛÓ�*[‘ý30`Õ·¯]ó<æÍðœj˜Bƒugl�‹Ê—, n¾BÌœ¿|íøä~^ t±û;Ü÷œmjþ–Þ¿ä÷ïÁûöSVó[ÖÆ7!s³×�2žù;7p-ãåø+ ¹.ÚŠ%ÿ1�Ô7”ÆÚR´mÓûu–6¶,_Ûo‰Ew‚1ºãƒÖaG5“ùÍoÈÈP㋘§DÄìŒj;q‚ºwµ"�¤ý’œ¿ÒÚüôxÊíýUòc¨Í€�´ç±Éš¯ÉdÅ»‹mÛïZlZ8?‹ê D| ¾6Ц? ¯çˆ;X†qÜË FüOa–û† xÏUqŸw³�}OœÙþb ø!Ô/ÓÀ‰A|€ý+ÕµXï†{×½ú BÜÑqTˆ»ÑÊ¢¿$\BÀÑÍã§ÇäDÃb똺ó·sýc[16gÊÚÈø- 0ƒ ÄZˆvŒP_“Ž=†ýèÇ'—®ü?zÖºHék-ôdŒ9ÛTÖáàip…Ö»ˆŸ“ÛˆBô2Wp}gœ­ìEvtl*CÅA}›ï/`(tN$oOŸVozE¸ÒUØ­c]ÞÂ^Ùß.Ê+­.l,³›ºüIy3™Éý†eœÄ2ŸihU¾V9 £~›b­¾;2ñÏ[êmùø|,÷Ð ð/íÛ³\æêÞM ø©tNÆz?9nhH+j�"�”ÉŽ‡.»ý žK:�øÖ¹`p€Õ>©Âm–]7Ä'wOpg�•Ì(ìüŠõÚœxLNíº@ûœÌY{�z½ÕÜPÇkÚ® ÆA×yõpë`' bƒrœÖ3itò¥RÌg$º90NqX¶ÄúÁXÇ5´­U܆ÍãÈwÄa‘Õ®…"â\#öž�™t < ®ê–s¡MÀÀdxÛåa  L5\=ˆ)å÷¼%­Áï%ÀídC†å2àñµ P�ÞÍŒiì¶Š4ˆdÌ]𯂙뱣²[h/î¯}Œ† yUgÈNy!¨·Ô½ÒŒê›{.cÎt=6‡{ï¾æâ'?ûµq€ŽªÇÏ¡4[• t(,Š!¸£V0:Bí‹¿Å�b'ãÞþl2é”óiÊ�àJ¿@äÒqšÓ@.‘1$¬8¯¢iðF…ý|X‚àz ‘�McZ(‚³[ïPõú<ןG÷Ö‰\Nп-?:‰¢·õæ³%à‰®ö| Ü¡ïWnŽßEÕ#åÛ51õsoxÕ“��^ηz¸�ÐÉõýóί%ƒÅ®Ø³ŽuhZP‘>ßl�Gp—ê.ÚÒF3N|³äŸE�õ²¨éðÀ„« ›ú/Ħ+JTHþ-@ky—Hz~ð37ö<7àÓ ³jí’e ÂÖÜ2ë§•�Ѳƒ}< 3µË�«~3)Š~I¶ß¶^Z�¹VC ,#\Šô`ñÅ«\| ‡A‚z9£ÝŒ9[L‚…)sŸ•µ›|Î3‚ ¹Ø·ðCÌÎ)•ÜÛvmÊK�),Gª Moï¿sª©‹@n“¸<“Vu�÷Uli1rà÷íîÀHÁÛ`Îõë$^±'.š0çÒ9wAÔ5 RË ›LR.ç7(xqIǹÂ<J FN_ŠB päEm±;.váy‹¨{Ž´ä3;Èã¥L ¾ãj8;·Æà }Âr ›™[sæ�;ònã¼—ëÜÆ¤»p=¿¡,óö϶üøáÛìB-X3ÇÖC±ñÅš²Œ,‹ OwÅÄãe{^~vP½sŒ�sEÛ5¯™¹£ïZ mÔˆ/r•2v~6;ÍÖ-Ímwab/¥WœÍr Áx @:ø-mvç©®YUúŒ1Ñ(™—ÏCŸq¹Gn×�m»(®§êExü}w�aòùîG9úB§ÛÁozÆL÷¿]Ü.Q"9õZn�ê¼­¬ ŤكΗsƒHc&Þg‡d{»*ÉÜÇØ k?Y-Ÿ¯÷yryLgsHû](CVz{¢io*½ýŸQƒFs‰]»ÝH Y@l21'MLËVÈÔ@Df©X¶÷ü™9*¯‰ÙùYÏnÇ„ÌYŸñ`öÇÎ<˦¼û–̼¼âöSP1¢­ÔT›uBÁJ®€lè'zî^¼�ìbDô™ZT?—àßÍu¿Évèy61½†  4†è¿FêÅz¢#9sç­|óªüüV`›ñAL;’8{�„˹ê°W‡†>Î÷ÈØN/8äW7¹¸˜: ö±,!Äòx5ö9¿i@ýŒsª&G,®ks¦´ÐÂÒ¡jòï1¿f·½w˜vðÍلܘ�jr¯ /Š,-A_ËUŸg²ñ0¸‡L™´ëwÝ^¬¶4‚¸3ùð™ËC§÷4½¸q\Ø5\ýõé÷ÇÂOÚÞoQZ¨RQÃÛ*¡ë^S™‡=!=�=ËV®ÚuÏr’Qkvÿ ”n¡—Fþ¢‰´Çu Ñèvלߋò¿Á•Hìºi6‡n¼ûsE’»š§‹ûÇ~!VÚe�Cw>ÕfÆ[ü%ËJ 5·z˜k¼+x*ê�«¢fYEiýmïe׃Óf†$îT €ŠØX¦æë«|ÐÔ4–¸i8Ȩê ÔùÕ²Ùó�´a�úËl¿óRâ%ÚCf{ÎùÈ @à&lèP ›¯±{Ýø0¾€¬l}3¦v›¦¦z³C;Øï9m û–Ó)“ÜÓyc_E–P(´Ÿý'ýüª—µà»¡*gýͨô5Š DÞ)�åyœŸ–a½Ïgß"㛺 †f’ ‘ªCâ�ÏŠQqè†T�°&áì/–H¹²Þò˜ú¨6Å x¹*/¯–;MÌA_î]$�Å;£˜<ú¹(ø„«°oz7ÑåÆS6÷Á©24oÚ¢=׆82ºÎ–ÀÞdcËAl5*£NbPt3Æšgs�‚¨/Û¾Bâ<ö¯«óu«æõ¢Rí½G Í+Eú=sIeXb%N>‚Ûи´«[z¼dþÝYo€­¯²Ü™ áüø•¼–Ë[È¡ãzùªaëÇÛœi±n‡ªzñÞºJäpUPü:ó!ŇZ{¶ñ…Kçä¼é�6ÖFQ‡Eù÷$®Xh‚~Æ]EojUð˜Ò &TócPûÍöêÌP§Ì£zß{îÑð7–#mö~Õ¨Âz}ýÝ3ým¦>ÍæpÀ¶½üõ`›PZ+¶e‹Q¬ ]û�p'ƒ”±Pµ`4é÷Š Gô�‹më@—J{·¨ Ð�“•k›6¾§5�Šš÷GŠô[„øß´UaÚx-Цs†"ö�x`Ò4`ÛÏíw`Ìá$z‚£"W"¿G—†ÿÕhÊå ÎnNf�¾ü¥Å"fY’lŒnô—|_t£1�ë­(ëÏ×T±&oéQÞD£Wôãª&ºúôÖàÖ ßìvßÏ–TE2v+¹ùTßfî"»ŸÎèv®æî ,®˜ h× 1ëlr”̧͖+§²&he\ØKb,áH¢Ÿ„%UÒNHRþrêv‰mW8®ì‡Îluq¼*ÛY,/eÈ;�WC�ôpO�½Ê2�ʃ`¯•ñíµ4¾“YDòôW&¼U©Îÿ$Uvp&Ã*¯H�ã~Éü4¯PHmúá”{ú™þj7‹q³©êÛlá{Ø`‰ÁcjÚ .äíÔÒk¾Ëcéõ.�i íÖò…€#š3JÓDűÇÚ²'éÁì° ˜A´ >C¯ûˆù¡3’óþ­?[¤À�Ç?® mme%ÃaÑq˜…6“ó[TC¸bjàá�Ûk(ÁA�éŒw¢¸ZlG:Pt» ‡õdþ=¤+àבHíè-Œ …¾srýÏìדxó1vBÉu•eÐÎÓ�ýëPÈonÿŽŠ>��ÆÎܳ¦ù~†tφ/°¢~sme%H@F €ÖHŠA M|†š2¥�¬ aCûcJPjA�A¢´0!ÚÀÎ9ÏÛ æóMpMD]òׯ6½z9±^>òô[\´h·Ôp*.ôš û@LŸs¶gÕ¹iqÞ)®î]0g•Ußm­.3dÀjÈ%TN}g7æ¶CÝ×Á!]»?•+:+¯pe�Îéý²X£Õk+Þ.á®°—øšçŽ5U’: !è:ÜàSqWÖÒ§”«AÎñ‚gq¾,‹P Nùlüa´”M¼ ¿ê §¤Âecp³‹s¤…@µŽ®¬�'"LŒVsŽ®D•êÀ僋�ïð’Êd–­Eåõæ—Ïfœ•,~)œÕìšÅ'¶ã­êDEÃ91 ¹YÉ4# í{3r8«‡(½Çâ1D &�q[Œ’dàÙQ Ž~ê̱ƒ�°×ã&ŒN0¸C²ü,ÌžíóšýÇV¸\©2šbˈº_;!ȺÆ(w�QIúMGÊÿE]µ\9ï/‹\�à´?ÂëcaóiaƒF͘>V,Þ¸ßQ&ôY¯×±æ�ƒ ¯ðtþ¾EñÂ#R̽ÁVw�î…ú‡zGsZ@°Å¯Ý¢ÚËM•�†JEU˜ÇS©z õÈqO�ήÐÔ“¿å �‚÷‰œ|¢ fzªf=‹4æÃv@’.?Ï›&ìË o)›Ç‰¹¶aµõ}KÉ÷W›ã5["°ÜT %´Ð€�­lAö­´¼x_eƒÜZÞñÄ‚|†øúx0 ¬–±E úä8–}Ë~ox±«wQÖ¶YnaÊVFQÅv[[ Èžw'€û‘½’Eì÷Û&B!¾-X4†Lê/”Y°ž»‹_3©¥†¦j fGù(þkð<d³‹£¡`lð¢ཬqaÕ@••Á³"a¨Ûð•€’¤,¨§‹, ŠÔ Âxô]9æç Á¼ÂñÙñÂÓ Ž3øO»�ŸÁ6Ï(¶mŸ}opÚnrW<â…ß5µӿ_æ¢!_¥Qórí!»zȱm ik%ÂFø©a>“­Œøy¿n¦ô{ŽZã]L®ôÕñŠÑé­ƒ³¡Èjô(³ÊL:E¼Óí­|¼^ì7 ÌƱUÌ�0#P/²Î>¾oI|ÂÙû® ͈LFqÆýÖ�Z`þþÜFöK›^¾VÒkÄë1üaß,'¹|/ÜJe§û6�ƒP›ëxsÉÒ¾|žÙ¼pØÈ�Ýþ<Ëü±¹‡ׯ_#éÃ`›ñ(?PëÝ´S}æÇ–ÆËÄtÞn¡1¾†¦x.~PÆnOìY4Üætô÷i‡)r|òd|¹•PÐs‘àMý1{zÛÄ”™³µÍʯ˜‘ü=©Jè…Ì»ƒØ¶ñ߬V-Á—yV>tP‚¾+#X¼¯o·±Î ÌÂ/· Fl ö5ðdŒ°ʲñ™RÛ¢g\¢H2ÜÀ�ìG{f$Üà:¾b„Ðí¾dG¡_MôÕ70úrɼÀ¶13?}Ë)÷(¾¶³±R£‡¾“3pP�âO˜�V�3BóO‘ü-™â†ý`]ïÀI€g~ï]Â÷¶ªž*¸`~æ+õø6:¶­ê ny#+‚ÎKÜÍ!í~s@Ͻ¡i@ØA™›õê¼Låy)ý±Õðš ¥yËqÌÖ÷ê5Þñ“‘”¾/¸Ý‚ƒk©}ýìé+£áàE0É$j…óõº+Oƒ2>=òÕƒCì}÷}•Ròñ¾+þ;‡Ö³5[r½Ï΋&¿+/�S˜ø<ŽÖ8ÎŽ¥—FÎïùw ´u«h•—k03‹bãòã¶6«ee³÷èy³rbú½é„óÀír;›(Ow]%ËýôS4 ¿êÌ€§_y®¸]`²`V0ö8îñ÷zq1{9›[|€ O‡í-ÂQÔ’+ ¡ÎzÛÖñÕû…±È†úl1ž]-uy¾9Ðàb5²üní’*·€¨Íô½9ö:|Âmdð�Éäh@âh ½¦•QÎ×\0$Ù… <¾?A»gnø²âânážL‰; –åÈ‚°šarxæ‹‹W#"äí‘ÉR²ÃX0L\ $JÅ¡:A¨WÖ^n9ü²¦ §ýv)¾BÊ–p¸/èé†]9eýOâÞÿ}Æ´Ígwø4‰Ã´:ÓRøÉJa‡LpRy‚ù#HàM „�¯›_¥ ÿžH�aõ¡vÃKŽÎàÖÚÖ _N¹'ÆÆÃ¶}0l”-¦:µÑ8Ð#*žKg‡hî�Y¤ÐØ s%&^øÔâRïrSëãgꔳü+›„Æñð4´üaË•Šsƒ a“m AÝ>g&ÙÒƒã7°\CN#Dæ@·p”ˆ]<˜Þ_ ¸·ìŽ÷­¿kÉ™yt@àôJS¦zù»ôÇRÌ2(À ‡ò¶ˆŽ~�@çYz@8ñ*ÚS¯xW×É(ùŽ˜6MBØÉË\«ò€‡Í`–ã*ò^Þ.�µ8ò†;ÃÈ…N;fûª´Fý¾¬÷¬�·¬`‚Vû‚¥…N›Ã’\Á=&Mû=ëù)1›]ç6’/hꎭk|I›«dÇäùÅmÖˆžÙ ƒ; ¹|½0¸Ò"•šá=�ñ§eg&8ÕCÌ@6èÚí`Á çÈ’wp2{ç5wµŠ% ñOåÐB®7-åc‡L?~åå´™‡…î/–Å‚aWåFÚ[´Ÿ]ÀO�„Âùþ¡£ºtÞz e²³ 3]xU™`Ø£¡–Îè">ý ¹\·‘&&à‹íû» }Ï ËµÀ!Ý;‹+¯‡3aÞ û]]ö=$BVŸzMPá’üçbë¤îåw*Ø‹#žÒîÎÐ"Üô¦¹­‹gîièw-ÖÚ®ÐPÕ”)EÝ×ÔÞ•b@,ž§+Ý6¶‡TL½›µ�Æ#—çÞ©J‰›´iC ðy¨-m¾9_¾íÓMø”·o¸ÁdÔ‚2óAÀŒ¡…à&ºXH‚�wÝë‰Ï7ž;² o'…±k:ƒ4cƒ#çŒ \:‰E>-jøÐZýšO/*ÒpaLG•õ_Ðîªnta»#W߯Zîçä†xãq‘)À¼‡?Øú Úè›îÖÊâ_ØöËúyù2²95žÞ“¾ Pn; ôX#ÄE¢OzÑ%O{n.îû’ü^¿±Ëˆ°Ï¡ôùlð‘œ5›eëYöȱ»Ç}èQùª7×Çl±>TÕûm;�MˆPá#uÛ�__¦{à*Î ÀvÙm©äîïYýv/]¸œˆ_Y6F�¹d<¹.��ü§¹Kd亟*cY«‹¾ñC,±e†Å7¡¡±ÆàMlö'F3©5 °“åák‹³…Vý¶E»£;(ky¹L§…r7 È;V½Ð< Œow»d£Cn0w˜b+xؽ‹ÙœßîâË¢È�Qb³ž®…ÃEò¶h̾ŽÞÌÓ¿ #œÓ1’Û÷rÀ“Àß‚0ú9ææûF!ÌñS‹Ç|ÀÕI'›½“ß|A²Ëm.�» w·÷ '•|­ìE�a²k)ÎW%�z RÛ™±L �.D„¿[Ü«ØÅž€Â û —Ü*—ü¾µxn¨Žq+4Ù²äMçG³ Ê–¥¹„{à`)ÍÕéðv¥`ÚBH»›Ø@¬6ˆ`ñ�Û‹„úà±óýæ° Ÿ¡:r=hÿfÖ·u{·‹‹1& ¢:ÆúìGA‚­êyoãê[¶¦ü Ý^ìŒ@𛕷nwZìQ_� BrZÛ“bsOk»¢Ì‹�‹·áÏ$,u™3^‚-Rì:•Çí0dDA8Eù@ïw«á9;ßi(©Ê'²'„½žûs·Þ¹éÝ0äYÅ`àZSÁFŠ»öõWha‹áö×{.<¯­î™ËWu°Ý`”çgf߯^íÖËÇ+ˆ°ð¨°„CZ{BÓ„HfÙãæ�Ø5;¥ý"�ú´!'쎟DW%$A�±5¦¹…Q ÁŒüXÖ Í�O�ÃïÄÿ¡Jµ ‰äÅí»e^ˆ•dôFʶE Ÿ6гPá&Œ7섵 .D„4•ž‚ FÉÁ¬l³-îîÙ:[s/²šó¤7ÅÂl%qã0eqöÙ60çÖ¢·Wõ`GË|Hé£n¯ÙØtcÜ·!à<µ=•à¸axyå¦rÓˆçÅï2¶2Œñ5¾ås�‡Mñõ®¿òHY”÷4êâNß>­µ¦ž|s¡}F]l�*Ì@˜—ÚÜ/–¾!„¹ã0`H»}« Õêø×G[†í(0ܰ‡‚€L3;t§"ù"¬[G€½nç']É#âL+|r–—ØÀ:©ƒ4ö0ùså�-ž%b¸Â ˜iûͰ²6ØôÅ�•–üC$€«6Èyß +�ž9÷Û¬€~§}ƒ™°­!îÙq×�xéî1Eøˆ¡î•Ýg~7ïÝÄi@~LMb—?[uº¶KX�¢OÞt1Cü-Ö ÝÒº7w¢šÎ¶Cá…ý)c¬¦òÄ‘‹[00­ )±ñÖ¡¬ÖêžãBÕ¿-[1ùúÂo´Œ;eþ«8~¹£®£ëñ Z€ .Š�V.ý£†�ÏYàuæXgÝîx°K² #N2¯;²èm…5FÙ]¡f÷˜ÌÕUµðr´5£ ªÔéõbâ„ Žôt鬛o3’”ÚÆW„Y:©Ûà9¥Ÿ­$9 Q†×N%¨œìJ혇eÅœ‡Y q6é»�T‰XÜAõRm t3U|.`®ÜäT­¨ãz]Ý ¨Ìˆ¥Ž�Õ˜ð�ƒêÁ•¢º*ÆØ•8:ŲƒIa åÖçUz7I±[b ðn‚§ãÒö-6Î…ÈC`\¾ k#鏨-Ôê/I†‹)\ï¨p7'nQ¤õB¹,ê¬e‹Œ´)Ê­¬Wä ¹?¡½½Ò�x«@ámM÷™²"†ê7lsØv ŽGJT³s.åuvŒß"ÜšãUFï1m »¤š'³¸X&,Y6�„ÛBX/mÓ•¾n•mŽƒ>m†$)º# õeõ™"›çh²¶?Ë…;y2iq‚µØñŸà3ABs$zà ~ʾ‚ê–Ç5VÑ&uÆ–Ž)¾ÃS@è7dî¢:êÍü4ëØÇ½Ò­zxŠ4!¡±”dLÕɇÐSˆlZV×gq  ¢K ? ñ‚ý¸ë™§bh”&Ö†Ù«ôq‚i"ÈÏ„ìšÁ�]m¶ˆü`ÞÑÀ$Ž+6´RnǶˆ¼×³›v=¯júx™ß §^Vdñ(¬²@«™%i' "La~Û/½!È•–4BWìÞ s*Z–ØIvÞv8ÑÐ÷ß?ÏÂèàñÎæ�z ¸Æ8cÿ[ÒöGÌBk±|¨7Bí�¾€zÀ˜XxK‘Âv1£�|V¼rAð¬Îâ!þèÞÏk9ÎXÓÊ« #êÌ>Û±y"ù<éàðØdKrQÅlTœmÿ¥Xo¬»ÝÇP"ÚJ •xAÖ)Òî™+îÑ ¶€awGx¶S;ŽnsxÑÍ“íô VFù¤äòÍ”Ür ‹€°Ðs`F6²A^_¨¡V¬%kLÙ3jcU„ñ• AfAeP¨ä ¤*ÄØ gh®®[|ߜ٠âó·kH½FäS­Öœ œ›758'¾› g(ëDz&E´Í�¸^{§ò£wÜ�&%qX žÎçcÂ2‰ÐTãæI·]` í" «�.?µ›_œŠ5αpr¡óDTs†˜L:œ¿/ïZÏnugMžºsb;”ÔONbîË^nóÞÂj·x¶.X°ñÃYè`2Æ(¦+k"ÆiÎ$ï|ïf›‹ÇÖ¶Ò8Ëröõvú ­¡è�z@Ùƒû(åa—µ¢Ü¨jE[…¨L*b°�qlcSÍ€J›ÅİÒÄ Z7´›ø÷b…o.­·�Æâë}Õñ³¡byOœ°–ÔKǃvØh€øh2#ºceÉÞÄÖÈÓ_ÕÈÖi¯ýÕ&IÖÎD= ï:ìDóëBÜo‚{)ï–€µÄh°raÞ·ªh’“‚¤ ÂA}ý¼ÛŠn@1z-m¸Üù�KÙòb͉åÀø5ÁänKÛ,pöd¦¿‡Þpr"ÁS)—c�¸4}õG þLª%LùEç/ºoŒEw[‰œ ¹ ?rõª¹ o”ðA9B¨ kç“{ߪ°Ö £t àáîU«Ü€CM&Ì^˜±Ö«Û �÷á÷ÍÒHhyi·9P,c_Ûcáh|£œ«»¼dV±|òåpUú囫Ž'}Ü¿éÄ…V_çQ¢¾på|÷® cË#ã\“»ìYÜ�ð8ìv—šY~^õ�§žÌIzp­•k/Ï<Ãêñ°�¤öµ“M=·RøÃ,²Ñ´ž´%Ü ø!ªÃà„Ô©R-¿h<)"]"!b/�¬$BKiô}¼ïVùϵ›±…¯@‘-IÛØÉXÑ•¤«2 ùxÄâHûXIIKÈ€½ô �¢öñíðâ´l·‹?g’s¶XlŸåжµÙ»1Ëd–ˈŽÏ7O„:°ÏÛ¼­ÀC6É©¨êa—5OÍb—²½ä³× k�.=^y‰Á x]=`X$­å5íd‹[7sˆ¶(®ÅàÐÀ™&º6²óW�+P. ¦Ð0Z‹Åݱj�Qbc3âmØ’øÈuâ×ú’iV÷e½Ð:·ærÖlÇÌèl‹Ýh€g0Û„"få¡vü›œáq¶L\ÜôèÍcûXѹ†ö”FFÛ¬dˤ_t“Döœ©‘Y.\=ÕÈ·ý„ÙMÂlr«ð«Ôò|Ùrõ!¶Ù9ýöF½$­À?º2hÛ[ð2¡vÚóEbz{¾0A¼¶úB_9¿>ÚÅâ·Yâ[7 Á¿¾¢CûéI_1ˆ3Fk¸=Ò¸¯ÏeÀF¶¼öÝ^AÀDÁ\O€»Fñs½„™.�g¨”AèÎɾ’úŰ�‹ôŸ#Y„cr3,cÛ~ ¸EÓ!Óº8p™Ä0’[‡¢•…ÊzäpäÌqÐõb6Ã#»:±†ìGEŸ‡ZH¥ÛÀ€ÙþÆUÆ—Žœc{†»|„dínòÀ?‰@ç\x ¶5U\ÅØI¼ê™ÖVÓ~ž+J‘Ì�uÈÇ�z|ç!oL„}Ddî{òçF-X–ÞA•oDuø‘Îzq=S#ã×ÃÕ® hçß¡Ÿø¹ýXÞJg�þ«…¸‹ðØ\ÉKÊ#  ·úéV /n÷ÛÙíµº�vÄ3ºcÕNu»ós§ú‚ÿ¡q¦Ç‹ÄeŒˆ`Ž•ÃpÜ ,ØqŠÝóÉÖÙiC»É´Z߄Ʀ…ÊS6SãÎv1q eÂtò– ùZ_IP|³§c3 0`CzµµÉ�Ôýªdv-Ü3G� t1{ÂÀÅ›µLHT¸“+sn­®Yèßh�§\ˆm³æÇRÔé2†žÅ°œ¥Á>p‡ep¾£€íRy w$) Œâ·\löŒä®�=¶ÇØÞ¡ò¶üpa#²³H};š:x[è-Â� âø7”³‹²ÊwÆXA¥ lžoмÂ?r–á¡ 39 ÇÍ—B‰!'µÁŠé#‰“b’l—âŠÌi{¼Ý*g6@�–Wû&Ìîfï`îžòwüâ*�dÕµcÄ™ZµÔÍeÐz>3@®oe„–UFLgh¨B’…Èš�ô»J&Ú(úŽ4œ`9ƒØ…\¾Óì‹&ç¬2äza¥ÎͬLÊxÏfÈÜÏ­Þzÿí~�Ý�·V…á7&×ß½µ·tŒ�¤9k«“BÜÀc¾oR‚ÑF D .8Þö5ï¾ ßm�p3BØrÑaPÐC €ýN[[“ÝvÞ¶)ËEÅ�‡ÝÜiPñ} ø¤>DûOä-x3[Ϊ¡ªÊºÒN*�B—Ï,³oo /é�×Üñ5mæù¸Ò¯ñböGan qá't/Ú¨œÃÖ·tÞó[*²œ@ž\ª`qa‹Ç/ÔdR ƒóa‡,‚ܸ;Zi9ùˆk%Ó:Ó›ï\á49)6mΠ0�Án6"�ïÊmm/ve–Ýì}‰>/‡—©4ò“ñÙwd­++GÞÌò„[ä£K�¹u롨�2xî’Îç£ûü3 x¢Yg—NMÖæ�Dœ-48ŸIµ¡Ë[©P½~°H–»žC>†ì[lY‡‚dz#˽á·G6«î�:\KÇ\.8EI|è0¿‹Ó¼¥�¼Z!X4Â[ Ø!p=Å“”XðÉ'·³Ü‘dé©·>blœ,zǰ‰À®§Ï*©°~ 9ö>ûy$£×9¯†ÇvÏgfvz‡HT¢k¸×]ðв"0¨,q75Á˜z½ÖÆ&q-Òí�û"Exy™î¢ÛÁƒÞ—ASvµ›OGó?ù.åìMíµó~›Û0oЭ�H/~+Í'újÏ�nQ’1„’¤dš3;åÌ:¶qׇÏ2ƒÍI_Y#û�'£‡vNÇàÌ®¬ÏöG�‡ZÞó¥Yœq±e–øÈ Òá±?˜½†¬x©!N¤øk-ö¸lÂçü_†ÖÕ¾:b¯ÎÜãåú;Z&Ï6V�t  úÕtã#)ž`ÂGéØáòù8Œ’çÈ �³<ÚÛ…rÔä2ä¡£ƒLY‹g]ôÏõªç)̹í­ðFÐ÷ÙG¹¹Óúõ/‚ Ø;»K0êÿ:µNçA�¯´4•©%$Ž}s÷i·4ö™‹º²¤ �m¤HÙj¶Kñ&où@Uýy¦CSÍ`ì°×á£öÉšº0‡zÞ-� ßÔ�(ñr³`ÀX—ÉOBApŽÛ®}77}+ +k„c¶Çh[y»@æˆ"rycS´/äœ Hb‡½@è7k#ÜX®„�>óþ¶ ½]ÐpD/Œ@ÑYàò–XæŽ7 žÄõe¶É U•3"DRÓ/"‘Ò°ºƒè«û„�íjn²må“GA›ÚM0ašË³á�]‹ÄÌáÂã¸Ãq.# › †¤­Ã`OUê¸ÈGZ.no{óÏ 'é5Hê vÞ;ëºWà{¡ ìÿ%™ÛÒ˜6ÍRþœüNoͰ’ÖÏk_In¶o­1ºXvÀD(×D /–§Æa»µµÃÛ¸0U`@ëR~au KG2Ö6Q”-œÊÜ–s«\pïúña€þ„b×,‚Óå=¾£ˆ «k¤d¶Á¶·‘šM‹ôX2D…i••�û°;§_3bµ�ª�(“KÜy9a�ê�Ūv9'”àÈ‹¤vvD¼5æteº o*Q«h¸) wý*Ë–‹ÂÞk�—¾2W<L¢ ôáÜ7È€—âd·|@nÑ��Ãq½õ¢8~Þbz`ù9–¶{8Gkf�F¦æ™õ¢Åj– ç¦sQ´1ïšèt Õ9XfÄ*9ÜO^úºkM„9dÛ„ýiWØþ:·â#ø°Q.¯ÞØ ä´Êë)Ü¥ÖÀâŒø‚ƪ [.{N( ].]!f¾¿£îù_{Ä ,ÃÄŽëö�ÙÉöiŸk`ÆD²Z ol–+:t¬Ò,ã¿ïñbk­CÐ,H¾�ÚŽ¬¶çj¯R2RûZú"ßIÞ8Q|eÅïíep xäúáûØxw¾°!ˆˆúCgG:¯rq¶…“4ŽîΑz ÖEYï¢Q”5Ç1„xv'æºÈ4@&‰³Ú·æ�Ò#ñÌ5¢"´�¼zÝ ½ÏuÎ0pkf)ïwJÙ>î20JŠ�äÄ´ÒB‘AŒ)èÉQ$ã%p.š=¢êâ@5lAõp÷‹|û®{sêòmkÞAæ/eZð¸Ipoj Q©½MâjÙl"}Ó!àôè^äÊ�J cö÷ÔY§–1ﱄ/¬ö?7‚­± µ&# -{ƒaЋ×@Ô ‚,ù?»uùäq0­¦0[¸u@ãëû~´c×Õ'áO¶ûÐJ0Br-Àq¯ž ÏX®_6\b AÃa�›ÐÄ~V•f2§B ZÁ0šc²S.¡2yשg>éo‘lñøuO „Sn{·w»×ÜÕ';çãÎbkqqñk#lý‹'â1`Àͬ9ë;a—~ …ÀÜ^eY´úÍc¡'¼ßD§|gð2‡°+ufŒÉ¿oU1¤â}õ­€<ûX°?ÞN¯w`t`ö+Í^«1ªÆ($ ì«¹Û ±Õ$_x�íIN±AFèY;ÊÍPß#€0¿J·cÄVU«ï*ô[¹¿ …mm¢:p–s²…áÞb{‡NaÀH*ÓV`�(ÄŒêA%t¤ú�/-®üz¸O(>Øj§»°8Å�…ƒx뜭爛£{D–M¶Få:n9ݰº æö‚ ѶÔo·” ‰iA/µÜÒÃ_ïùýw¼›y˜¢”§å4öo7wz÷2)d[¹ Пßs5c ¤á”´¾L­Ê›X{cÛT„º:Q¦K±÷4·ÐüŠËnC,«Œ^–P€oÅÅ¿€\‡Æqþ¾¬PU%m£|˜ xÈÎÎîJå}áb*v™TË!É !¬ìÈX¤ÒYˆ·Š�ͶH>…=§>–ðÅ§Ý±ÓææÈK”™‡@Ç£—¿ŸCûKël%]åá!›‚Ñl¬-f„£hz¼ó9ãÏ#� ·êâ5å�»ËÓ=^¦�€åô¼mÚsËu9ýÕüeXNsŽà6Ôçõ(sU9}ô‡íªÒ¥ï ™Êû®ÇE8Ö­ñv1�23½ÆÃ'o�¥ÆÍšñ·=É»¶ûw ó¸kÞÇ‘øSVøPg­#ßA-ÉsjÈn3G¢mÝrAãÞ~o°ŠqÖí²ÍR ™Ò²æy°Çf·­˜>ßWÎøhÀ{X‘GN>ï^µYÌœ™cOQÉ}@H5ä}K²¾5jy‘ïPä#_®Ë<ç,úðW5ÂÌZnú¦ûWξ„úæf¿|ÇÌüwÈ“öL¶…ð*‹ ¼¶Aóœù¢]ÛqÝîqvz�©NÎîî;º\ø‰ÇòÙ§¨�D |>9ŒK‡VvR<égQÊ«ø�Ý£7no�Û«—bÌ pN̈\ÝkÊÙe r¸d®#²hmV&�!lÛçOŠš鵸 Šd^´¤,•ZfaØ­H/‚~™«,A‚ÔÕàX^ýOn¢X«˜ú÷Í-Óo)æpK‹\vw¿à×+N©´1‘§<,¦:£;ÕUm7ͯÝÜêÁÝnó… ñò±²³âãP,(Eœ+Î5‹.ë9 Ð¢‹äP8ˆecÊv¯¬s" D fw‚¥J¶u*Û6· tn6ŽvÕ¸µÕ€„gj¶Í°Ñ´Ì¼¼ŸNƒÛa”Vöécn¥M¨ešÌ»ý× ^Ü"�¿@|õ¥J0¿_|•†ÞA—8¥Tït̤£cÖ¶O�ªfUƒ½×ÒáÎ)ÒjR˹ÏÏøi‹Ýé#ðï²àcÛâò[6%„-3å,ñ8ø`öM°îD.÷ …ËÄ{¸æ‘Ã}ÚŽàEÍG‘²ãÑ0þ- Tþ¬UÞmëŸ` °¢q˜�½,þsá¼aHM“;ðƒíÃA'ZŠ¦â§ƒ pl‡& 'pL{I½ˆ•ýeh607_[KòMËûg&a Æ­y´CÊ×w5´@J‚€uK÷œø�µn¢²¶Î®�- Ü'å¼]ÛÖÜé˜ F ÁOfš$Žîøk[5b\R¸ñNï#os° Ô8�m-¾HCy‹R\b'G[Ü��4œ^îË G ™é2½@æSÌy_Õ®];»Æñ © ão™Ì/aµÜ2o\|¦ŒŒ~®~æ'»½Œ�£×7#Qžj­Ec½Ðsx–CÛ•Õ;¤ðõÉ-ôÒhdr�Ù¢)×d7ÃÕ—Å} U‘�Â#±¨ùî¿Rž·¯FpD¤}í(°X '¹ÆÀðñX¿,ˆ¡Ñü@bÃ.ñp¾¡›Aš$ЙÃʆZ|×RÂãíæž\äoϰÂÌcâûîå[Ó+öš€�îë~·ïg‡_`=>nmî.Û+|7{õ("†ìض*Ûßo�âÒ�bsmL 2¨Û‡<>ÌT¼Åv›(ÞžðÆÇ\y!¥^ªÍÚä÷~E„Z*FW'Ka/­1NÙ>)&Óºº…+öE�Zù¢O¤»‹˜e ªs:×—U µèY€½œ »ß¤@D ®.©õ(µ�^¥z ÞÒ!ƒ,DÛ’H Dt0jµq%¾ÌÎÈ* nU.qÞåy˜k¯6lÙ$Ê,?ilÎd\íh]°9ÊŸCi`AÊö«-e^éi|0ÈùùÕœ­�÷YØ×|½K£®v6¶”\CÓ‘7²}âO»KU{°›AÜJâ#Îá16·Ò A&±Þ¸V†C\Ò?6iË¥¹[´¨0ûËõ?Ú˜Iúܾ“¶jŸ®Kñöˆ+%Ô0Ö±,@BIßS`¬&‚¹™‰z\ë¤Ã}ù…éÝ’VÖÏ x$ßëf5?½f§êkÆ](ˆÚ‘qw{�íADz:G- ½ÃeT¡Î0MtQÂKÂs�w`œjÙº`⬂R,Bè™=eö1ªàü4-FKŒåSzØ’²ß¡úêä8æ·”�Ëâꮬð…â†ç¡"ØÄ•¶^ÃØB¼f �ø+ƒÞü-zšD6+²`»k7Û»Û®g™i$6ÀgÒM „S‹É]¹¬ƒ \W€óL«n¾3…ž%Õ¬´ ¶ÜV)jÒ°Wã‡1ËÛ�¶;@wùø1hPñµ2ø}Î ´MÌá_­²r›ªq¢%.��²vA%dñè™T#wØùà"âð¦NÝ›íâ‡Víswp¸ä¸ çñô/&Çe~î•fþ k:“$~ ½õ¥Œ¸&T"nb^ÄgA•²9¾ð·xù ;—ÍÀý+ÂL÷Gt,TÍ´ uR<ô߃°÷@¿\‡TªÎé ÚXÄ ¢Z2Ò°{³Pó¦ؽ‡®÷¦pÌ… R/ÐLˇÒèmº-ƒÜ_c_|öZç\\sµ/\)š 3jàstÚ¹‰-‹§ûî|ÀýþŠJ/-JUk�UWŠ}‘T/ I‘õº[A§W4vYTÑ$ùujÎ6‚èh%»ýFzŠÜë ‡¼ÒÆç›É¼lû-ú¥ ø—Öl&5K»€œ þœPÐòÌè� U‰n”s¬íM#ÔIÕÞèÂ[3'&=D6 Hbc´|.ÞÖðzÁþ÷w¬CÍm@ŸK“ >áÖmZŽÞÏ0…z>Q )àhØZØå7†îfG<ŒåÀ#p0Î?…wÝn|[t“Ù·¿N×OA9·/[-ÞÜj=8»Ä nð`æÑkü¹ê½ýQM…¦Âžg B²(K:”³[‰Ø\Z)îÚé²±¿vª¢·³QîVá×k èUáðÂ!Á`b@ðîìY(~¼ÞÝG½üÖ}¸Œ�> Wï-svºs’zµÃ†–­™HdâP>I°µ‡u ½¥ë|JßۇŇFIjD¿‡ €ŠB”ŠÓ¦XŸã#‡T{ûs¼âêù¯Oû™•ô·m<;CQz4z僎³Gºà‚Êã¥7´à¡÷à�«9MYð-uéÔˆlÂáÀ¥25ϵÇîc�ý3D€Ú6åCV+¨YW‡†àä47×Tªø0ïçç`w|Á_;†¼Çf5x2crŒ€î²fÁæ“ubX…¨+…ž‡õN·vê^Œý¢\ ¼é*4^±ìŸ0S !YZ�…=ÔV«÷ÕäKïâÍ˹N?aA�)5²º�=²•7•ù‡1ª‰°Lã³Æà'7Q}½øÙ°ñ÷E†¢sÛÍ·�ªÑ“£Þ&ÃpÃr¶”ƒq@Õ:V�N­ô>=¾d¨”Sl�?pîF­Ó¾ " 1âA†‰ôbH@¶‡"i¢Æ„wß_,ÃpsÅÕŠmj—ß;O½çämž÷‡À_“n}r £'•Ä,h½$Ž64/Ç,ÁDSân9-²%£Ä9,˜”–z-&¹E  |N4 5ú;B¡”ϯܮ¢K~ñÙÜ7›3]#»Wåtù‡KEº�^îK�’#f‘¸~OÇ�þpv-\dËû?ÞßP5™v€Ê¡|¨­Ž— “JáT \z�-¨òˆÏµË�Ý8&e…¨ŠéY˜®cWÒÊ µ[—u)ÉÔ–_³˜šß¹;tX¸„j¸\s¥{C£V1¹¤hÙà KÍCs°Ü#ê§7h5ëðÃ>4€ž’Š9$ëu0X¹Š ò”ÂY8½ÄL¸ú3ØMÞôõåÄñ×pô*†Óµ˜âÌy7éš3£þˆ([8î]íÜ÷M[ƒ¶7@êºO.µŽæ’ĺϨúût 6Æ5,„fi ´i±�®Jj°z¹ áß3ð±ê�¾æX lý(€¤SÀ]½Õut‚°ËžôÖÞ '²Ñ€ƒá÷*291 Š”¾3üžEHÍÂ9j² �Iíҗà1$Á! ¶|úléÝ%ÒhüúvrsVíÒŽ\\”�YÒìË9<^Zß5&F)Ì/ÛÄV§4Ö±¼?ßk?ˆdÿT!òLàE­…í“s%Ö»ÚªÁ…Ùéïà ݮL �þ&�¯ûfÚ°µïܪØÍ¦'¹™4Ö]•Nû?—8y­h5ìeÐ-‘Ð¥¦Yú&´nƒveú,„¥WäÛ’@§÷nànW‚3èßÈBYÎÍdi˜_Öp9áɲŸ) jO(¸tØ^.€Ï±¾VZ ûµ.µ_QfÎ[òê„35!œÑòìÓˆê!–~(AØ ívN)·J§]|hß”GÜ�Q–?1êz1µ ˆH#%jkBçZ­aÏ…îë9ß25Õö= S „¬Xñ(XMôƒxoÙCleÅëmÚ¡ëŠ1Ÿ ´£¹;…±x[�‰Aºó’ ’Oa•”0¥}‹v¥öô`Ø¢Ö5'r°-g™�Dø-OʦÝnëÄ”çm&ìTETCë±¹�W ¢Yщ7ìðrý¼™gY…�r‘ÐL»^é Ó£¡Î†›%|ve-EaS¡­¥®!‹8L6¯)þÙÓ쨘*ªéÝø¬!¸r¢S€‰RXÉ+I€îÎ0f/.Òyq9Ú-cÒ0²}•³ s_fG¹äLèp¸-诊œ²w-x‚ÎŒÿ;S]dÂÛüa�Οˆ¶ƒ[ÎcTAæ,& u¾Sâ…0ô“Ç}Ý{mgÀ8ÄUáMî7w´ã¬»úwî”8ó¦ü/ù‡'ói"ìu;ûïdÿE¼Þ¾ñ±�nðÐGÑV�!Õ:7¯(bõ¼{¯žpë8©æÏ}‘ÎHþ ^.³ºÆÚ¶Cý’¾­x¨V )Â5üËC‹Yˆ>`¹-ñ<Ìr#´v+X4}&ñâ.—–�®_¹¬v}vüæ~JN«´5ë7bþåW‰É"…5ÃïÈþîý•àm2$  Üg¢úÿt²øR1Àt�²zFX%Þ¾KWô)þ¨±…7ÌYgçiúvIËZ„ á¥öò±{„Á¸{}³äÊÌ&BMÚøu+*ìdÜäÝDD¾Î”nNÛÎÃŒÀél4°Õ¿Ž¡äÎØÖl ÚKÖ¸0Õ0å�> |zYq;•¢ÐX$xTúo•ü6$Qc vø½í:èp6s,6 xìø¹Rì ±#`í·r‚øhvQ—P³SIQ°›qöödA Äš !"ŽØÛ‹Ç®ª:‹‹uÖ/)�©Ÿex5KúMaó¼À†ÔÇYÍ?z’á =S:!‡�"ë«"ø®|=å Ëé;rS &GÃ3‹$Q粓o6ìR®#ÉDø(þPƒ ŽÜ,ÀӴª^÷ùáˬOgN.n |$’b±S]U`º`œ 0k†Ã3ú®ï;·Û«N`;…ðó \lÆûp<0¼Þ­ÕEL€ÔšÔ©›ó[wxGR9]zn’x!YüaU¦°¥ ]¯jÇ'—lå�‚ ÆŽ ¾¸c 6wÕäQqžG ïØ…R´tnÿ%âÄ[‰u8«{ˆ�¨‹�éÚÎ!è¤ç¶›~ïð±‡àÀ…GG¡”¢ÙM”S(æÔ™Z¯9õ¢omgG+/·�ÑÏ“tb ›š„Œˆ>oÀbÉqÓòÙ¦jÛE›³�6Ì8·ã˜[•rÎ÷0×$Ù³z† NÃ(½B|XE°äT±v8�üMo�Ÿù©åãlÒ  +‹uwÓòÇ_aîšùÓñ-·g]ME=¥ q ¿-½¶��]¾M@œpù݈K8gv°yx¡­A¾êíW1ÝwF Q å!}»œúW±èpÀ‹æM Ågp¾ã…¹ ‰‚»â.–ÆÁ�ZÐÝ+×ׄs()ßšm~hKÙz6st¦äÈöÖ/'­¥Œ÷mÏ›4}Þ:@So³p½#¡}@�ô2CY5ñyÆÅvüú‹I³C�šïRG{‹˜¾?'�§‚“”Ïîá4 …7 4ùÂmðujhÌ1ÛÃ3@b#ºÃîíynG«|U�åI-FàÌçZ¹r’ÃB¡³[Nœƒvi/Êó^ì]ñ 8©öLNÌz샖Ÿg}œyg1o· å~ÐÕrk‹ËO@õ¬f ·5•;>Çx¡:‰Þr¡sÖäÃQ`²T^CŽ÷À¸Þs S«Äu8ÀàÏU½J,Ì™˜·/Q’2Ì �âxÎ0Ô´Ý`GáÂε<µÿUä€Ó&ÎÁž÷jèF& <œÞ÷¥0çX1…k¦VY-½5¡ï9·Û=ý‹Öž©ÈïºÊ gžõxpwPþÎLÑî¤[„WQ¶‰ºâîMž±‚…ºþ49Þ×R| _µqõû‹µÈq�ô¸Ôx8ïìü²NÓ«�¬T춦�á¢ny‹Ðžy|IkV~0zšõðòg sm¾²ûÖçN– [ƒ¡`„½$îDõ~€õò÷§(ºxyÀ`‘Q™¶-²Àf &³áè¨jäÌ£—låW·%@WöÚ 1G¸éE’ù{Xá±Õf·Îò[}ÖRÊF4_#O€‘Ï=ÅgZ¸'ë"{êDÅ3ÍÚxKžDÙë£Ý? n¶SÏÑJPáÍѸm“‹ã¹ÊŽÁ³¶Ö;…¢�a¹Ð¡Þy'ícÓÈ”Kï2v’+}õÃ$Ƴ¹g¬Ð¦Þ—z«bÕ±/^íF´ø¾£]ì„ø‹ëçw'IØÕu�sÞ‡³ã –"ƒ>Þÿ¨;…óimY�ž¤óŒ-¾nƒåQçÔ+óÚ¥„Q�ð<ÄAB5_@vŒ¸à_6DÜLVRƒç¡ZYÀžSçbCê”^ÖLƒõ‘Zíáê¬ ]Û#†’¯½^Bײ¢ò]vuÕå1—¬\ÔÒ€ì-iPÁY5­8B�­IäêJõ‹çòØ9¼„&×�·±/Y¯¬˜FÄî¸ÄžÝGÜ=Ó�M¦0[+Vµw=ó®„Š+ϧ¾ÔŽŸM¸¦«–ã°aŒÓ»’ 'uãßZqÜ÷À«(I%i„AEíþ¥Ýª–R8…pÎì* «¶Àd‚„h­e3.‚ÙÓ�:«'Õ‹ê¡/G°6qÍàÁy°²2ÐGÆZ òZ™ë³fÏ>5¦=ÝLú$Ú†àR"u×›àgB÷EôÆj»Þß�÷:$ÕóŽ:_VÖûŒc•_±Ç-ZŽ#�c˜330lÌý*/Ä+õø1iµïŸØŒ|œ¾â˜[O„›«‰�tÖG��9óš;æ�ÁËwÇ1¡WK#(Õ�Œ(@΋”¥çLɪÍ]÷чáû&·ŒÒžgfŸ¼2©ˆ¶°›�Ä(^ÖÈC"È3¸P ãt84u§�ç7Û?‹+zÈÓNrY»‹¥½ãNtƒ©á⿞‚A”O>U])†<¶µ“›fqëÅ_Ÿ?)µË€WKRÅÅ�ï¥ÙaÚ�€PɃr@–L|ØÖ_s”•>… õ ŒbH·°kKTäé0>Wè: ÐN½¤ù¤Ã’©ªõI•½ŽÚsoÜM2›²³ÞûqÍîO–¨† ½‘‚{íœÚÙ ü]Çï”ú¯Ù?�nTɨÆ”�îÌÐõg\~_Ï�°ßÀl °Ü]¹lÖܯŦy@dÇëæ­‹�°¿'¶ä^Jý�môßµ<Å}ôt|'EGÔðëN©•Ç\ �(%IÞnõãÑÀë  «ÓÖTƒÖeÉ 2Þ�²!¢—Ó`‹õ}jäIãk)ŒµY–ÔP63�µ2†6ÛGFnem9¶rUË'8Kºä>¬�®]‰FÐJϰ{ø5_�$=̓[Y¥@êr¬ç«}âWAæ²mÀ4åzátMQnæ1²ó^zm•R"ÔfPQ; /%†>’ݵy Ç/Çò?¥Þà9ò±�€^ ¼%78… -E¬�0IžV¼T‹™ê½ïÕÔÕ‚í�¶…pX¸d7ïÃÝŽP4-s š„€K”ð•Ê/§9ØÍµQàK«V1e{¥l@çApšG}&ûG(«}:ÆDÀt½µðh1uô³+–B"#êM˜;€àrKÔƒÆÜ±dË\ñZŸÂ�d$Þ}‡RÎOˆzU¤¢Á¨þ×ôKÈääí$BhTáƒÍÂ¥9½:7¹ÕÍBýÎïT¼üü�w ÅÛïÃO+Ã7Ó½ö~• x°á²2/wÚŽnª0ˆYCÙzÁ+i{žæÕ¼:÷ìnï£uL߯æ3÷ÏÙÖ[WÞïòsœúg•€ÙlËâÞ-ä €â*¯¯VÉxþ«Ì×Ê>ï©=gû»U²]«¸åÎÎ~€_¹…,WÆ^«wé9WܾBËa P$?¾ússîëÁx8îã˜g‘  =æ¶=-> Åf4±0Á/ZDkA1늴X\ï¬ã‹nhæ²'ÈÓjõñ…š¶| ižgµLRÞ›g[å­î|e•ô'ƒ,ŒðŸjõÉû°$�Þ�µ�Ì8+Õúu…óKÉëwР‰�2Šüè^xwªÝݹ�<·ÏvØYºº1ØheÄñ´wƸ™²ÇÇòM®¢‚A2“žºWÆ¿kj_±MB·™²>£X¥b!¶ôª™emÉ„¤¦–Â.$XA ;&"T½Wþì/yíù’è‡Á&hÆ2’w¥U[úç~“^•·QÑpÄáCjï«Å É\.«(ól#‚ˆ‹=‹ÑkUI¥˜ƒ˜/1 lµÍÂÚQnUf¥ pk´±ÞüÌòä#:„sü‚¨¤jìŠæÊ'—ˆ¾7�ˆ5ˆb‹•߯Dév{å÷ÝößnÒ9 (þë¹çxת¹ÊìÀ•P^.Ys:!$Ö$3̈ñG”M°JÞÜÅÞBw¹YHc®;B"ÁJ)ñEFc†FA½ì$Ö#k¦_Ätq]jæh%'n{k ̃U»3kŸä3ù ‘ ß �q 9žv¿·Ë…»³øAD-˜º÷«nVW"�­¯¥…1¾�, ‚n5�œÖÜÈ=v~φ ÕÒ‘`R"CG×õá¹9öZÿ <·×çñ¨ké³ý´/â³B9jä¹%ã)ͱ–Tú5³ÆÄzDúO -®ˆ;MÝû¿“ûÉàEw¡ß¶á±›�žR!S�~G‚Ô[#a(ÑèuO´ ½5ãöKûºyæ v;ªºV0éq[‡33H‘4™Ñïeóÿ‡0kü£å{ ÆùšCìD‘‘)ûóî3 ÐDz1ˆƒfähDKkú A–�€¿Ûç%ûð?´×;Oe¡÷8Xé�ë\]»Ø è,”l¿Í”¼’C�†r`¬Õ§Ç²ÉV4Àð-N·Äµ1 �3Ø ‰­¹d¸½-A…µ“kf¾½f®½•Ä[½@Ûß’+UÀÙDg »ø"•ä\2½Õ5¥>Ã[2ow¯¹mòzUkp�†PtìXùîjW¶úÏqâ,Þ"?.‡÷vB=ÛXÒÖøwL�pè¬V¢£G¦Ü)~àR^®Fz &j¢û?)nA�o¶2#ͯ-˜ o,µÁPœèô Ôd/ñ 4Ë J’泜 Õ Zèð7‰…Í=ã¼2X¹ç†‡±¨êçà;„Tß"•°£Cm*£ƒö[=ý«ð¯ 8+jÄÄ� WëàîÐÚ¿\¯±eÚÏPšƒFó¶–Ä'°—­•%TãŸeîzÅ�uœ¨bÌsA\°±1ß@f°²ëSxŠH/Â.\C‹ß¡…ÜóXN-š=^�|ÌwÌÞŠ>ëHc¡¦§ð_vpí„Ü®K¢ôB|Æ|¶OQ9ü8©¹uöõø(­Ž ÂïMe1  }hTt•ã`|CÀQ ž‡„ºë¥è·Ù ”›rÀFl¹Ê‹>c}4«†Lãyë^V àB½6Mý2hVàÂ2ô ÂôÒëôØîýû (¼ñYU¹Àmg?s™4‡ËYùÓ&çoú›AáçŬ u$ìuÕ¬“óÕ¯m˜T|ƒù[�ˆY™/½±–‚÷,Ní†|u ö�¦ ²#·éã{°…íRÿŽ÷�ãÌßAg�/44l!q8‘Úø´òyEo4XT¸(÷;Þ²yWÁS�U�ÜosyÄd¾Uk%ï&à…t»ªN�+ê7RÚhóa´ªÅ6PHH*4ȸtˆ¿y‚k­ÇòÑ‘l) š’€´´@ «kÅ�ý‰}uêêlë{˜âL`T}ÆÑñ¦ëqö1@'Ð3|¡ùÓ!¢m wóXÿfþ–®‹a³ É5Á‹3“2_м"¸X4GèÚWU3hw°My¯</Ì˽–eÌb ^, ë`䚰ܲÿ!ˆ›eB-JÜÔ0÷�nIO¥—O§°q(]ß¡¹ã¶h1Z_š6E“[c÷³„/£Â|ìåþmõà=Å˸Ý:aŽª]T³�žÒ2{ EHø ^»ëV!ÎNз§Ò6�š8Ñ­ÖcÂCÌö»—�g#&á„0}i¼± ?‹sò“Z~@Oå„>›æÜò ÛëA(k¸[ÌŒ4i<@…ïëLÞ1¨ä8Þá6áoxp¾žm`„öÛX(xÑ@ÞÝÏ>lÞÁ V { Q÷§‡;֪弡$«®À[æ8z9l‘…ô£€Y/_` ñÖ㈾B™ÏtDúc¤t¶c*¤°ÆG¼VáÃ600nö*½d^ÚzHÕ-™×A¨žlÒ�Bo=ÒigyÖ¥«6`÷$a„�óÉìïö¼Àd^-_.E™—í0MÈ–çei„´û¼¾„.Šþ™Žb�:冶5lw|pýøEGkÝô<£ƒá€3r{°Ž» [ße’ Ëè%9R¸�}:åøœ7‰n�÷/-'ŽÈ¨h+¶×}²¶ÊøÅÜN©ó×ÝÝñ¬•=¯™$㳫peŒµ¥‘pN¼„6k[O¬�€¦ä¿kWç÷WÒòóo1ݺ I‹§0ˆ&ººŒµ©î©ÞØŠáQÓʨ&nÂôE¼—ÄѶ‹�>vrƒ ™ì(çûo4‚ýÏç¶-lvøf~%ÿÛ‰‡mrCu¼RÆA‚´FòHû³«çÑP*¶ï!¤¢Æ¯':ÔÁJÙ‡ šNÒñá-M|Ê„sùù¬Ä@)¶ÝÀjÅ ¿ºÛÔÈ0ôß n£ÕXÉLÈè@|É}¨ Œà ïÍ�±”Œ¹@�¯W£# <ÃHßõº®9:]zx·Äzt¬aü¤±têùÌE0Äooo”#lÓÚ=iq°�»ê¡«=Ó Ü¥Æò7 Ú×kãÝñð•�0¦Õƒ;††f ÍzlñÀ0“!.T1ƒo8Ç�ƒã¸1ÐôRmœ fªèÍÛ®�Czù1›¬÷TÏ:_½o½ «ï$û i¥$¼s»{|œì_6ÕPÓ¼wÝ]ø*·ìïõf`Pçð4 ·MÁý<á¨ùud»™dnÄC†æ¯aïϹo �„¡Ò0Ï '£¤€…ö m�>(@ƒÂ“зº�®¡gZRg^¤¡"Ü‹õä(N휇‹¢Õ¿òløØû\8paâDÆ2üÈ1Ãf«®tŒh“œU=g31lý‚^X4Ô“‚Ж(pª.ªx&дŽÞƒ'‡·³nÊÖ0½\sƒk¥FÄŬˆzM©(%S4Ðï&Ò¾©7ÞPï÷³pq9|SMs´ÁY°wLLûZl©6„Ä·åçK²µªF¬Õ¦…§e¹ü�cZR¡J¶ÖlÜ{g}ÆúpùOx×>Øc­–ç‚6' AY°×´üñ†3§ÉU¬ÿƒð~ü ó`›„çu5¢ÇÂÛpο‚JI ×7Pö´xØ –~BápäGf·îÈ@¢ªÂÞ[|J‘¹p±fY>,ÞP">u³‹†¨"s®G'B(3~áéát»d|xPÇ�àÉRÚ :µy·H;né”ùå—(pþÁ˜330å`k=æGË•÷~¶/jã¡~…·yãŽþöÛ÷kñ§�kßù¡<þ(²ÕXB¢ÝK¹ñ­(¢¹Í`“cAÈ®o .»Ýiq!Zw·~Ó U­uJÙtL6** ‚ë³¹t/óI¦³�°+�Šûù"²�‘ZÖë4¿›ìk.¦ÁÜv%�xVYžvŽ’£„hÏ8Þcû›½ÜƒÇ-ñyÕíÁåDi_ ?±k¤OZŠ“ÂúW;ÏJÇ'�Ù÷l1ѳM®~½ç%óNå·^ü ¼²Vq+°Î÷ŸKnö£»z×4NþÃéïÏÖ -’ôÍY¼¸.v‡n¯ºÖK¡¯•÷àh­ìÌ¿â�÷=^Ϻ·ë¬¸ñ'»--k‹ºïcmñ@U�Î —ÃÁü~·öçÑÀ{R†¨ÚÝpl¨ßb0Ò_âžHç­OÌM  ¹°Càe’»…ž¬{¶ÿ1¬©�#îèG:½EÈ|-~Ö>Ô›7¨�ìR�óm`²ýË߀iÜ š� 5[1ÞàBi©µ›ù�ÆÂ寲•}ûYb°%ÎgîÊfinÕ5ó´—‰�­ç¯O$=´Í¦¨x*{ö©´ø·íoyáë¢ú îžÜåXz‰K±ú̶b¸U?WÔþÙe—©Rü n•&GbZãÁKvì™"¾g߃†Þ·ŒµP®ÜÂb9wF�ùË�©V=r§}«µ¬;f­Æl …+Ø® K(%#¨è\ß).™f´ùnæÆÛ…¡çRÌÁ’œƒ‰Ë&Ý´Z÷|Þ5¼}Öà{Æ�M‹A:…¢çÞŠá'îµ›ŒÛQÕ2“ìoÄ;tŸâP—ßÄí°/‘¬I Ü*yYù÷6Ò -v‰ñ]¶3Œj_#bFÞ5 OƒpTm”ºýxNSaö|0Lƒ…æH-mÞA›ÁqÞmnì¢ùû®u˜Ãî_=mö”usëQa:ÒnF1t±Þ¯R éÎ�°[‹Â³ž 0Kœd·øø vZ]Ïr¡�Ã"3[L „6>¨ÃùÒƒº¯œA䨲ƒ´�û%iðH¦Q:( O¯fªýí�! ÉÃIÄùp ¥ «_k4 Š 5e^?h9Í5æçví³·2H¤É'ÒÛ‡ ½­Ö<]O:xŽŽs5úŸ¦=Õ$¶¬åÂýtÀh¡pÃSÆk�;C, Ë´Aã}Sèh³pÙNåXÆk¤œ° éìÚ›©2>o±Ä‡¹aÁ¦A’Yà‡Cj8Y:�ˆh§a¾áãVÙ"Þƒ€7É—qáÙ´ V âÜ—\èIdJþ¼½Õoìu“i�âöÝ<¥t.Òõ:Ñâ£G$tûœ|yß)Éõo@--k06Œ>Ogá ×ø2þrƹ�¦Ç®@¢Ýƒ–Iê`cG–¿Å“¦$¬¼b†ÚÔ„¶×‘øÝ`K¼ y2 ÜЉ•ËÙžÖÈ:÷1X z•nãÇ˃V'Áç†È0–˜ë>3 ˜Ég޲€Ì§ØPë,ÐÁäMáß!€`?ü‰ð6hÆmGJm¤Bãqs~ÜS©gž[ýsx,»ý$ÝÊRáî*˵â`ÖŶxþw [ø2RÅÙ¦b÷ pû ¡‰Û»â%БÜôßaW<ÁñÛ°[GµÞŸÅü{”¶Œ�pµ¦càÝöè–R³ÛügÊ.¬Rý<€lr9ö¿TnŒ7нûv®ó{¼l³°ò#ë¼Ú�±Že§ƒ>zïˆ9ØÇÀ³£W×wÈEÞî …t�ÜÅøO«3taR÷‘.rêy'¡J@ÛžIwÙ# à;«�˜v42àÎÕ¾�°üät†m„„¨¶;Ûvî4Vâ&dAòÔ¡R‚Ò÷§¤ûìšjß}§X ‡ßm¶gm7€¥¿+]uÅ…T»I¤9âë¡Dwì^H-Æj+:fCIæOñ àè&$ˆwÏ8[9Û|ýöìø‹�/ðÖGuHšB”qµÁcLº®’E\eÏú“•÷¹ƒP× ·ò·… @Ì@ÙY#–k7¿ë�ƒvQØ´Šü[håSY¦z�˜#”Äl‚Ë:ßþc:0‹÷‘»gèÊp¡ZõsôÐ�Uô¾^àù‘VÏ}�0E œ/T´N’Dim- B`ÞÌ"•#¤Ã `öl¸ÞV,•j õôÓh;›Ä�.23ýì×A¤”Ò]ÐýÒ =ó.Ë4Ãëèdþ ɱ:Zy²;+Yüñ|[2-уæH }·-ã+ŽÚ�¥³,Ö¸!ðæ/MbqïÓ,þÃq°`mµ ìØ ŸÖïÓA Bí÷%âŽPfg½ø3Š;B0¼”ð00Û m¸Û�íY³5f|à]‰ 9f})çFͬPkÓÍ3Öc%ŒR$ËmôÇ c_^õ]>$¸+vÜU‹N÷Àæ;-{8ë†bµ¡´ ×ëC  ¹Sµ¤ŠožSؾh>®ôžß2pAÕ¤eSŒ2s¥VñÑmBÅŽèÒÉe!9‰Ù}‹„.{ÖÂÙœ:fÁ3‡)ð]' ë+Œ:{cÜ¢sá£s*)ËÔ$ð�ºÒ€Z€Ðœ­9‹Þ°š:b j9½Zù`�â½ I¸_ƒ ëɵÿ_™ÖÃ=OÍ­;)þŸµ$˜’èÖpxß.Ë^¨¿qgúÊþ2¡ §Íîu®Î+K¼ae‚ÿ¦/øL‡å¾õtÒ^…Vûù-H{%­¸Xˆò…áÑpÈ.J Š4LR…ý'é[¤Í6:•ÅjnÐ_¶d1°OŽúkš’þ6wÊuyõŒGhN ¨ïßø6e�Éñnœ(€„4G%sŸο�èÙ&žP#1<êÿ3²ß[À 1ìà€¿™° ¸ E@Ä–`í‹l¸w¬Uà‰õ+–‹¦¬ó0;K£^G…hè2ó5Ou—å€BèˆÕl®:w>–ì*�Ί¬Í™�„‡¶ßÊ€Î`eÙ�¸e� Û�­ƒ:�+¹Õ�HÍSóƒ íêí©y›i /¹=I‚­ çK¿dƒîéC¶æµ«YûܼÉÜ£³–†ÐO *:ã§^oS¼d±öa‰°þÀ,ZÅg&üjE¦P¨ë/8 Ûk¨ÁJÚ'O¨l N,r”n/}C˜¹^S…um›÷Ë®†Ë# .0ZkŠ~±,Ä"Xf^cÆÀ`CN†.«ž³_}=ˆ@K“ $|cÉ š ½|l~ÄBÔÔn±�ÀC‚Ÿ0¶+¢3Å^”„h”mÒ�A.ÎãV�yêÁn¢€æb÷6p}mK=Þ�õ•û§’f–üw¼a+ Ë¡�8âvY€ÑÊ8†…uŒNlï¸LuëÊhÀ5‚sƒ(ûsŧ u0TSè¢�„zЪ<µ³Ãß8ü䬄œµÄ�œ``ÀÑÅ�%ƒ‚¹‹É2ïлœÛ8'by¨›º•2D kX{‹¾ï–6�™À žó7„“ z¦ÊÚ`4_œ0Aç_€ãçQ¦ØšÔ E%“ÉÁkaÏpz×±Ó­*{µno�‘ã‹ÇŠDÚ¼¹ÅGÆ•w¬H‘Ö>ÉÞæµí�îâú�éåžbeÂËô�iºåYÙ¥áupéPB>ö[E˜/dó7Wvn‚óZÈòzL/d?ö+ÎÑœõ élþr‘Pu…Êò52ͼ6-"é’Òs³$ÑHß@°ãn�ŒÂ37_¦¼5½€¤55Ä„+»"X £“Ü®!‹[ƒK¨Zïînw¤¹Õ¸—KЀòU_;…ãŽö[ªÊ¹Û‰d-âsÀVyˆ@TÆBP7p¿êæšlòòÊõç×¹#ÝûÐÕyŒ+Ýñ(©ò£Í¡E¬µš- ®ÏwâÉÒY·:ôXß{'Ö§œŽ¦õWðlŽœO—õ!'š÷F,Óœ©5¡|róc4‹ñ/¤ÒÏÚ èLÔ6‡ì‡o¶Ê[Jî]É5þ—o€ð!žþ�38Œ<êq"w‘÷gVÈ`#€ D ôá3dælÁ7ÅÌ’ì)~éÏŒE‚±luÒq’Q<\•µN÷¡«ÉŠÄîüÈf_}€ê‚ŸœBúÓ3yÚL£^ªÐÒdÀÄì-W$s€©œ{x³Àµ”�»}Y鹦šîn mÍö= &²…ÉÁ…ð0áÞ5Ÿ!Þ³}ÉÎ:'¿ƒágïaŠGqå°d õîÝã Å+·k@!™)¦ppI¥Q·­m¤ÈG–Ù³ëhÉ,&m®ÞŒƒ¦* GÒèŸÙ²è8*8 �sñÒ°Ñ„¶5�a�øòs”eL÷­9!°4ñô–ðèFPù`;ë`ÃZ™‘ät�/ë°ß"œÆë~J³¦)x‡¯£{úñ±¾MYÄmÓ2óÇ 3–“/„gŒZLå¹ÄŽÔΚôMƒAÚ—¯»([ýëÀ OS«>NmW¸ÞÎ×$�Þ Žßg™=Úæ*~�(ÌÕ÷õ¹5H��dÌòÜÁž¿•�ùŽþç†á¶ŒÜ#<­¦Â—­Å§ö»gÆÄEþùÇ�!®æp-Ìs5¬•ôôr Ñw;ß4ÄénûZ§”0`ß»0`Í@Ì™˜h6!Éë1ÏS�ô‘/ºæÀÛ6ê•­î;ü7Åñ„ðúáT+´qøÇªÀgùxˆ5߉jÇÜpÜôÛV M­Òâ¼×ŸNÔÝiÁé3X9>¶øòÖ•Ä+ÛÜ öRö{¹V "¼’¥lì¹w#´8‘­½ XÁÒÐ�ÚÇw cÖo‘n6s%ÌþØóSxHŒôÔ X a�Fü£ý-žœ§êläë¾Âó.å’�1«³UylUÅc½Œ6v{: wiSN´Ù[kó¿¦s«G´È¶™k¢¹"“]Lš o–tm÷Eù6ïtFkxˆ s� RÔ¡ÕÂÏžw)ÖÚb"Û‰1¤Z.Þ¬ìƒl*÷-|÷£�пj•¶„Û+ A2„ðBrë(kp»‚+Í”–â³bäïÅgËÞȈ–†T#Œk£c§<ÙÁí³ÝØ†ÆØD°kÊig4’Ê…˜*(?Ólk¢äŒü³!G/¥öTGo߸@Ýv1ÜlµkII´¬GZ­I1CÙ9th„Þy,Èëåw€¿kzÎ2·|–A{t}naæï¦Úñ£ˆ‰�²SÊÿ ým³kÉÚÙmWôG±`~í¯u+­^V[Ð�B)UË¥ša²Óf€Û¤o8ûì<­p˜hîÂ'iÈmŠòyk'þ€M §×ïÊÁé ÷¬â?B°’.¨Qo­Á DáÅ‹Ÿ‡šP6ñ8¤çª@ﯵcí*b€WªÛ ï¦ú„½þ§UÊŸ%'·¬@…•ëõû{nFÏ1å¸çu}Î+ ŒC‹‡‰ö ‹0™S�z»|{µ¨ $èúë9�=Þ@ºš;å·oÎÃ2…W6î^æ´[RŒól±liÇö3ÞÂËðüÁRBæ/©(·yšÑ ÈmûHë·aÌm:Å�ëÜB?p¨RX¢ÞïD…£P®ò*ˆ(UŸ[€}óÊ’Á!wEÂ&¶¥š& [éâÛØ£=à€å´2™e©#Øí©Ï7{Å“R™ÇT.¤ '§ÑZZw¼ç`{ºInƲŠ)`¬’ Ñ›j™Es­U¶¨ä”?Z½©‹ö×Þé*6À�DެÛÄ| ¤À Œç-u?d ƒªËyÒð'u@�.îïk…x˜ëY0øì7\£ÖæÄ¡;Üs·�\½Î»Yß‹­ì­r�Ï¡ «0Ö�ÄI~Ssc°4ˆHêáˆÂ® 5dLd¶ð¨°mý°,¹” H/‘ ŽÁiè…H¬Á*.VQ’ƒt+æ2âwƒ�{¼°‘ÈPOÇër¤¤b̸é‡{Ñ�71n“[Ñ›£E‰òxµ‹þnêpE‹ÈeQ#cppª�~f7²¥¶SŒJ}•º0w}:ì�ëÔ¤LSr[ƒQç<¾1]ð¦§U{§Û$ ¯tM3ÊY�� ÍAŒ€ƒúK~ðßëí¶8Q˜õÇ}ââMvg’îãK“™û �‹n+Y7lÕ³•IøÞ•ä3\6}ÅÖ2W%—ð‡ÏØ� "ïš!¨Õè�©ï<ØçxçÙ=bˆ³èq@C³)Í3Ã’!8ÏhÈ º²('ËaÖ€äÿ,HhâÑÜ1а»Ým13�‘>IŸ$|ÚÉûÖ·0ê!QÜÅHmYü* !DÆiªâ?-~V° p`!£.Ò†"θt´Ý¡JÕ¨vÇ-7*$˪‹Mo£€Àòú@•¨2Äd%]„3<¹¹Yô®s�Úõ�7ŽC#Äm6öf¾SF[°¯jjÜÁ«)®n–²Q£Mð€è옜$h�·æ°ÀM íœ6ãâ„ï’…çV¿'€BÌ^BŽ,Õº�yuí·.ahP«¦1 ÉPI!7‡›¬cfâwž×´@f€!1;Á{e ´:Sý³k‡d:ú_<(+3é�Dï¸P9~¿­®†×A\sqâƒótC‹K’Çp­Ç óŵGU{5)B ò’Ü?lDSÖîwåЗ!Ép³Ž=[’ ØBMë�C3|7K,¥Æ¼ö�3Ò¸(ØÕ!(ÉÇóæ8Ê–êRxòö.÷‡¾ƒØ€6¢Îl'7ã|úç~Ô»O@—I{D„²ýÁû¹w–o±k¤Ž6Z©6¦¢x�áaèûßLºôó¦åÏšÀ:¨E#Ï­Þgqµ"/„»®ºw–µ�6jü$êh•îFèòLv62}2ÞÄõu½0_û„£›Ô@ï¢X"N|g#×&‘3 0ª‹«oÎJv…-‰)h~íéP–R¤²MêkA®WQ¡¶A_à·€BIw`­H3�ަ%•]/iËþÇL‚á:oÖÑtéè¿1ï6¶7,S9À´µ×ÁhìG\�Tÿ…£ˆe“hñikZü{*u¶ã¼áe5î�0ÉZ\àLk©¥ �ç$�°§ýÌë5`2Ïì­nîûÐÝÑrÄŠÞÜnÛ ¡lK©3Øvm² Äd@­Ö^bð®Z±÷Û�ó;üvS.ôÑ €÷>MÓXˆE1ê`µék/.°|8:Äðå[\o7Ÿ‹¢ÛêüþkðÓ–øù˘ }kÏq»\碩Ø�IZ¯¯®×öCôO‘Û÷•´¯ÊÀœ âØœ€¶»¿j` BõÐ锫G{ÙxÒü5·l€M É(æV®°8ô¸_{Äý¢èê>7°¤A0ôC>©Úéàο Òè,øù�ݬ Zúk ¤õÒKƒ\ò8_\.Ö×`2€ç,lÌÀ¤rêÊÆà)Y¿ÉJÇÃÝú¾ è_íE-Ü�c…ܺ³ÞG~Ò¤ƒ�N}qÇ4? ÷“ó›ïù!'º¼Bå<Ÿupº'S»½4;gdSD4ûRøNx¬¸ðoñi6žÀ¯ÃµÆëAâ§õ°©°AÚM l=,#{@€€È›!0È(È®Ãâ {<¢¿jȈ˜B°Œ¹–$š¨šKØ”¾7ñb� <›A 醴}U‰Ûe˜áÁƒî2³�؈dkåš�×VŸfñˆ¥œX_‰d_§® ”,6¯�Nk®?ÎÊ79ó5Yào1͉Ø*G$]Ña`îtT}Ýn7p£Õó«F‹Ù*a.î&5Ý�vÓ¬¤Ì0H�éBsòxì\ížÜÐ.€à£Õ}„Áöä�ì,.TDÁš0‚ ï…Ëû<ÌÞø<_F… Y7…¼¦8�«C°­êÙîšuhÞA—Û…*š¿ö¾‹à(3÷B÷‘»s5`^Ŷ„¼P`3Ì8SbÚ׊³ ƒÇ«[YLA'¤n÷·ºª°#—ç-Œ»ÒéRè4¦‹¶âTbÅvð¾·ìkóÝ,λ†ß.ÚkOÇÖ±Pû99Èï1#_†ô°2ot&,pŠÙÌ.Î+—…œ?2$±GYÎïW�+†áí×ldXØv`pì=¡zÞñ�ÁãÄk¡EDáŒh&ºñ›Sñr®ö\•�ÀR°Äv†Æ˜îº·¬LÞ¹»õŽÖtÁ,Ó{r3ºnâW™Z0¨ÕÛ�ˆé°Ž;FÔPì3Sì‡;…�ý´ts¼¥õéUo?Ÿ=�ÎN1Ìê6¡µ†õ�ØŽ¨@ÐøÓúc»òâŒí’—[h­Œ—ÏI¡§(ª/ Ýo‹¦,Nj¶}{JbT^ç†](› Än²Ÿx(7™ó;eRkºÈß}ß»ÜmIj7K´œþÌïyB¸ÞVò¢|5Í—�>á·–î•qÂR4$�™ÝºŸ¶Ðªµ­4(öä¾a1C–´€ï�]eË‘j B¶Á‡¥_rüŠBN㑞’•nF´šèŒ¥Âþ–SúK ì¸bñÐÇÈhY#r–ÅéÍnÅ•hyròþß—|=ÇÁvV?¥õžö~-�›ò¿Å‘µÈ_+´ ©Ë'.¶ÎµI†ž…1bpåíÀr8³’<â�W3_p�á9{&|© "Ï»ˆe²n_|a „l�.f�Q>O”…E['­ƒu銺ñnÒ€wÝ÷gŒÙ·zæç Š "Ö—Ød7)Gʪ]a˜ S�«;ƒŠê]w—^XOFŒ€ÅŠªî鱜Äîí�©@X”uØcaÁyäÚ(‰ì×0'’Ë›¿rnk2DNPäÈ@Ç̰“ï™ö‚�Ú³ï;‰*· �Tð±ŠÉ?>ÅùÄ¿1·ç‘åȧoý>ííw³}÷rS1E˜l¥jÕîêÀð!+~²ä½P&1—nd,¹ˆ�m"ϪÇÙãÿTnž¥E¢V÷Áîm΢³ÕêcÆgoØP·>°gA Á�K_<�Í�z—ãq�ŸØ ìqËliô,*@�OGXSþ[ЛZ l[ääSê�†Ã÷,p¹¾—=&r}žö vˆ,$àCI^]YäE©62žÆ¼æþÛåZÃL‚$?¼+ˆúQž%yhT1UlßÕÍ!ˆý½�ÃK¤îŠ03c°wÁĬ½Ra± �¯¨@öŠZÞ…~>þŸ¤lHÄ�~bŸ�-âë†pI(Ý{§ªy±9¿r,$ëžÁ`­$×�zê¢Ð/V‚Y|/sDy“éKê %Ÿ3Ó0sÆø'z±6 3¯•6AÏ B|÷?tÙÌB>çOà²r;Ð5ìHj0­#E Xƒk{ã1¡ ‹¬§Å>áÎÓ-Â<¹ëÆur¤9Y™±tZ—r=ÍÀX�/‡Ø³í‚)+X±­ûùy#kòž>OJ[Ãðê¸[ᨠ‘²ó°-"Ö€óÛ½]‰ng h¢P±E¼³\œ2àuįtØ)vÛÆïÉ\4 •�lSŒÂ® ʇC¾ñèb }¾Ü@˜<õ)^ºÍý[Bå®Pœ¾ñ¾Ž{gdÏx²; Ûu*YÅ÷NS¨�`ßiÛ\\Áq5`b•>çí_î÷ÙìáüÔ �LnjB;7Âá�öG7�ÉDH6ö®î >ð×âÆo2ʘ›ÅN2çd’ø…¿X h7|ó¬[Öè¨6 øa%äé¹cuÏ“Î^NÜÍDú ,™3fº°Â¬ &š�Û 7–°ù{Â7\)hG÷ìß•Ó} ïsLµs€¤VN4ì*çüO³î¾}‡Fgùð"'éžÎÖ}ΧÓÇçW�A½´X1OÉ`�_rüœN.Q»c¿C‹Ò>P -¾PCæÙP9 ÑØÏnþÅg…¼ÎÞ/L»éÀ�—oÐ>–qO|øV¡Ü´�Fwî˜am� 63 ã~J¨ÿ7:UãÊ®Ò9¨ƒþŽ�µvþ‰èÈUÉ-�Î&¹ƒØœ™Â¹Ó—Ôü±†H/÷ÛÀ#Ò¶ø÷”©ù°dÏHhI�Þ¹‹»}®§A�¹Ž»úÏq´¤�€úg7æÉ$È@�è!ö™×„S-8Á¹GdB®RW[ø¶;³ŸZŽr5“~þÕƒ‡;(¥tgçUü|*|2ÄüSÀW…í¼FáÌ?‚üû øáÀ·1ýý÷Aü‘¡‡àYš#rÖªÆ[ÖXÚqm1q¬Î `H-ƒRVJ€„¾Ÿ“d+jHdVà¾Wæ&͹s ¸Õ”YB?$ï;¶²™‚t£æn* ¯À„[7m eß`a6³Pbò¤®³† ’Yû]ÔÇë"º©{‡RÛ ÞÖÃúä†Tß1H>ä!nåªjm( �íšéê×Áß=¼ˆE!B³©Å¬Ã)'œMçg°@1qÈñ¢LQËíNÔ;gF6xÇ»Öè²3FrQiâ—»gQ€™‰VLF°p‚f™?uµ‘QP^æ@ÇWQº©”ë¶[”éé@t,5êê©«[·pçäÙåÈy T„áÿwRœ�áÛÊø“ÉœŒÈ=½àúUtÒ÷±pLc\Ö³:'é~Ÿ¾§»xâDa«A+~|Õz�N–3xÒäfªbn1”êF-³† üs#‚t,=|öB,Ḛ#¯ÛÉíp³ºW5­²u±ÖÛ{[NÂôX©ˆ�qqYBiÈ.ïr67·nd\¦¾Ð�e9IK›,èv ¸ ró|�¸}Hk@Z¨Â"hl š`Ý©Ïåî¼ã�^ê‡eEÌÇË”r}w mVHu¤†­bÞ ¡v}¹|!j³ö>ý¯d‘|ùaÉ´¥+ZÐÞÄëîªB¾R½µÑºªϬ¿x�tðõ²J¡üPúQÉ’>VÞìZÁE»ªÈ˜sù-?+åÃ:èƒ)‚Õ·ŽÔ-»VØý= ž¾'<·²!¿,†ð"ƒÎÜßLå°ƒ¶C‹NË�V˜•åx„L\õð SàÖ-%¨ðX¿V �¼Ô) }~¾ý|ÖÐ*ÂdÀñ·óYô? Go¤ ÆD“ŠÒx ýhø-c¦ÜQÌcD ¬ìó†µÞÌÌ{÷uZÜÝ»¨E†¶§iéÕîÒÍ$s:º’pƒ àÎ(n�S`çZ�¾’›Ê—ÛÖ"ý ïU‹ _‚¿(,±: íX+ë÷}n#ã¤ÈîÊCZ{bå¹­¥j€Ôàžr¥Ó�_¥(’ ¾¶LÜ¡s†-aëì[æÜÞ³æß–ºF‹‚‘”#ø‡¯ˆø]t˜’¶"þÝÙÉϼä6RcniÑ/®æî4„d§:ûsyéðËyŒY‹y>—]‹ÚÜSÈ]á1� f/¢Àý…^‰ç„åÇû/:,/aQ+D¬¢Íiðy¨Ì6Z«Šìïì6S¿JVûP·^d.&'žXJò9˜:½ˆBš}XçŽÚÊY¢óJùsl� B²á|l›Yk` Ñ4¼™ ˆàµ)j¿rPè+2qÅ,M`±|‡òP¯­Yg�qIݳsùˆùwÛw_›zÏÓÎSEräM[[• ®m9 lB+’IÁ„`ÑWøò¾Á°3$',ÆK |\N2"ÀE¡­Þëu¨V«$k… ¾äv _\§º6ù>„i�öT¼ I¢&.Þô/6x;ñ‹âOwU�Òöwñ¢ÅôñØU°\×€nŸ ðù öŽŒ®dsLÊ=ÂÓCŒl�1ø…L!‰$§uI…ËqÎâ¬ÔÛÃH]…·§“äÎN4vÃî†Õ�4³RµÔ ?ƒUÜM‚åT‰8G ä1#óñKlJš%}Ìbâ „:KWð*;×(‡Û ;›ߣ€Ì1œø='"J“…6\¸MãŒÒ"þÄÍæØ•Ð¢îö¨Í²íÍï†ZO«ÖPøO¿(sÙâ–lï˜qŒÝŽXúYÄrN�¿^÷$®bS62‘�½®(öì²³{tÃO£¬¾�5â®ñ´LÈ$˜ðëR[Éùí>&�™ˆþ2§Flñ›@ú´Ó�œñ¢X­g€°×mbç5Éê3±fn£Ó)¦ÂGs|Œýv<°_Œé±ÂæÝûàÌ� å€âaq;î72Øo ›ÇÈÓ€~õ‡$á%>´&/žlAô˜ÞL6ЧWöÖ¿/âî¯os³LœèZ�ÍzR •n N©ÍÛ]VΦsçLH-æ[‡\íÉÞVúÝï„–ËÛžY�ÄTì7¾Z~×¹ ¶ü»ûê?u=Å[ÜõLØ8Uê×qDj^uÕ¤®-H® «¿›I9å�~«¡ò¶¿WS�\`Óqfçh-ç#+·9r:$‡5�Êá¨ðpNÔ&Q^›Ì¦§�[ØßÚ¿ºF $ز/µ‘@›æä¯Ì.y…4ï¥��\áÀ{Áp½¦”——ˆÈaðÓõ¢üp¬É®ñ™ïL:»×~‹ ¥¡n›¦ŠÓ£‡¯‘a­Ì š*ùžC¶ŠÎæ{ÞÕº¶èÝ“;îŠ4©öÉŽb¹âìM‚Œ¶M–d„R2ÎX“Ñv (|ã9K©-D¥�‚;%ù±)es„d \ù)’£‰eQLï7¾É¡?i<ð4ûâájµg“ ]PZ7[Ù”¢—Œû¸Qö&l½V] ’º vÖK¡ßNùÂ[2¡ã êZ/z×:ÖSMhª˜]mØÞb2™ÖEv W\˜ zäl�Ýs†”¢AZ@$ôZ·Æ›;ýèɉÛ2JÊË×?ó= Üt0Äí Òö£wá?uÞUfÅ`3œÃ½fy¹àcî¶CêkeÊý=5i²4 ÏëIä+WßUm‹7Þ|'6Þû:ÀjÜ&rÙl_ÃÆÄCÒOv>ÜcßñW‚÷C�ŠšÎ-“î8BGÇÝаˆ õO�ñmù÷nß=™`>îô'¼ö³×llí´N¦ýÝ� Á¶öèdËÌã¿[&µS®DT‘® ±èjËÉêÞæ��1êÍg<ÊÌ[(®ZêâQ*4Ùõë75Éß­‰†µŒfg9­ä¹‹s™ÓÎÎG�,Ä!¶Ç’PU2F‘ëÊ�ÿm5ÀëŒâVva1ÎåyÑ s–âlFÍvÂâ<j`áÃÜ;§#)9Ic‡ï‰¬;±Z¸Ø¦ûÞˆ.²žÅþñ”±‘?ÐRì×ð^äbŠô#ÖÀ¾*Q-‹Šü|\hú§zÛœûz h©B»¾sk@Ó;‘Á‘½ÀSL\Þ�2�©Õˆà[oó‰–lHvgW¸Éý ;U‹Ý�Õ€ñAF1š-\³…Éò8Vd†§PGµì«z ¡ÖlŠ/\–JÃ6¾u�_'`jû¡Ô@I‡�›h-‘Ò†-3쓚‚HfàèRêF(óvuZÒ)U¥áa¦áƒæoxÉ»ÀÝQ[ÖºÎÚƒ€æƒE’ÅÂÆ¹[fÊsgÛ÷$7³òǰS¦Þ"ó•Ÿ:=Øù¢C»á•_ôaŒq�âRĶ’[àú:Ù6gWmÝ“qdÂÐoU™ãp ËÄ78rÜB�L¥øü»º/ì9´ýðÈZñàÉ6Bßjã¿-Áþ*rÞw‰°>çÖÉ^ÒXVUgÊb¾óÞr@Ùù�™×Ö^ˆ˜jíTê; í•ìp>¾âÒ$ÈÆEdu‡¡ØaAjµ3_¶O¢ù”Ù`pçÞêÐñ·û�€Ð7®Á‘ËéƒRVðiÀAŠžV/¢æ¥ÜÆ Á݈éÛ~�éðÜ�ïës{>, á˜Øjø,_=ÉGÒüJhæÃ�«>äáZÑ‚ÊØ“ô|tz¹¼HîúâÙ!_YŠ–˜ëéi—¼˜^ º¨ÝzžïU¸4‹ã¶“'°ä€hWjX+{&4£Uõ§xZ>4 9‰�ÖæìõÛ3'Þƒ*.ÜC¼þh c aÓñÀa=V�˜GÇV†Šúíb}´c¿E¯Œ38ãYÈ–Á®±ôƒ2TÁæû}fì÷x¿k·é•I·©›~‹|•hdEÑ÷io9¨mÍæi‰ùñ,¾°ÜŽ07«è`-¿A1øžyöê.=×WòüQ†÷[:o›k‘ݧB²AR(ê‰õµBlÖ_�\®Ê‡C#µ‡xzc;¤KØè»Ä‹cè,¨ÈP´hö¸™MU° ±Sô¬¸Ü1±,£kPˆxŠ4xÉf4‹»��ÚÍçñ£ ßvnYÁUm�Ô9ªò^ ®Ü1[ä `§+Ê{vU8ùà �‡©âÀhzú —øo~_=Á…˜TBQbΤX�˜`í‚j§?©À@‚²w–¹¬Y\$*�GÁ¹"ÙU;�H<ær0N¶QÏtà'r[îrû|¼Í*×М�ar7œ¿5×….i¬žOåà —僗a-ÁäI¿u9~™QMF½ÿÄMß±¹†áÎ3{ÊŽj(ÈV« J_ —cjó0þ¢î5I‰LjæôTiN—®”&ѵýÊû�À(qmó>é·Ž @òüÓVJ0¬(V¸d:‘�%#†K©Xâ.v6í~pÑs4yž*A–8áЉ³—»t–ôpˆfãSµ³c+E¿“Ø’Ö·¶ž¼fÅ´ç(]}‡€±ˆðJ…"ò1Xë¶áaÂmZe'už:¯¥Î[cÓmy{vôš‘bå}%¸ry%¿en´zÚ2N‹}-BÛ¢„%O¤Ð5¸g�`yËïô=)é‰PvµÖ^ݹy”y`9M‘ÜðÕ˜ì)Š´ËA¤\‰§z™Ã`9žà-e˜ýÆüFá@{E‰ÆÄùY?†�Ý|…tʯ Bä}ÄÒá£p­g´ë×*I²k�0PpþÓ­7¹ÞÚû™ì±Šp‹w;­œÍ®š²×&ƶ[*ÄO&×j­Ëé—ˆÍ{b× À¾þ–Î+ïŸ!xh)ü·t¤4 B˜zD ùv[�à �_ôÙ›IÞÝ/ªqpèª^¾þ¿B¼7p†¹{»ì·xw™ägü¿Êù=�ý–%m 21¸‡1™äÍŸYÈŸ[°^‚t]Ñ9¸^Ïš‰rñ,“wfš�JpþƒýÔ^’­ó!å�¯_ n„*hˆ‹}Ÿœì­ÈµÜœ…øüÝ¡¶…H+­é �´Òôzùè]h|×ÄÛÊ&mÐÅ.2>¼tS å�¼b]V÷0þiŸT=Ÿyº¼ZmbBµ�Ù$·H3·2Ç}Iå­EëàÄcž`Ôš¤3|«žç;4�L§ŒžÅv Ûªô¢ácubÁzÿyåðäk[`æMæW™;fP$Är>)�ƒÏÑŒâ>Œ6‚·iÜÉà~Û©-?ˆy’áNJËÎg„AéöšƒÇ¥!&jõ·b}¥Ü0¥×³}„ûäèYèÞN+îfW³¢â×#/mŸu½LeFurdõ¢3Œ`è?êÙE�fCP³Š�kWG‡s^ÎT‚Ì@(ÿ_òÝ L„Rë˜6Rë\}M[Õiƒï‰#Ö½ñäJsÊ2Ú„{”Ú硲ûÛß´¨Ø÷hj20›gèê³V^ß.ø_vôàgª.^½\í²šo€Íý”Q(„ ‹2èr’vØâÔn¢º[â&9öH còÎnÄkDæÙÁCyú0wÁê‰"^Á‚Ûé¶µtQÇJ…aÞ&h·„,œ4qð± ˜››j/‚œ¬M]×�]Œ™–á½.—Ó• ·­ÍR¨Ù¸ä ŒHä‚£0”GiYÝ8§#r}k´ÙcôçæzÀ–ç0 Ýw\x>G,¶~Mî¥fÈ ¯@žÛj5iNõCp:ý‰„ÚýͦIíuçÕ n3»5ÝâÀ~´Š|ö›l|«ý h¯Áþã.€r�§¸º’ΔÈ�‹gˇ¼§7mB]N-kjs,kQìë9h�5>åu;³‰LÍÝñÎXI�Áyb9KH¿·{�ò3­$ïÄ>˜?î)†ú@|óm1×&á0ƒ2qÙ{;û«a<î™| laË×ù~Ⱥ¨¥ŒŠë÷Ó˜zš‹Ã[»½Òn'‚šòb-‚-îv4¸(mè¹ÓKÝ>Ù¹r%õw³ÜDd@È*H+Æu¢(L‡mÎ`ÛŒc* ]2;Vйeˆu0°~ò‚‚gâ‚¶”Ûë¼ë Õ¶—ɺÙ-Y«n}…8A‡ÍõUÍEŠS&r˜I«›­QrJH_$†‰ È XR€9à«UL¯z�{yµïFÒÝS÷>Ç_Ã�Ûˆw‡�=äYÍ;ìn�ó§í›œýÏD¯ pƒxÊÔçé`à pÛ7·0K¦Áœ|æØLìñÂÆð£uŠºÜ–r/…zpQí,S:_vj–Æ„gnŸ-þÜô¢à�2Ýý­^ƒ-¹—iÞ;rµj—W¹Ð³4üö÷W×ðžÚAýK¨±Z»�¨Ufá6×ÌYÎÒ¦Þƒ¨ÄCm=zÏ= ­ÇĘ1(NÄ<Š�–…Ï�L½¾åíûǶ— !¢hCçö`q|” �/~ŸiÑXKx8øö�VVQ‘>ÐîŸɾíøêØ0š§@QYŠâ]1²ÁA`:”=‹¹œLæ�;‚¹µZ¤v�ËéœXÔêÑ…*jDî‹…vàƒys€ÛµÈÁ{( È¯.¤ÒÍÛA˜ëMݰájÎfô£Äõ\ù[FÒ\||Þ8ñRvñö¥xú Òwíý*rpÏN« G†úß¡ÅB éÍ3õ7iµõõŸ¼áhZl;ÎÐý‹k¢[›>ŠŠ§5Àc¦ûŸh8'§n§YA.FÖûn—ÃÖmÎÀ·†Gá°îÉ×â´lÞÊȪ˜9 –[~KäýfèQõì¬^n¥ ‘=œ ª/0`É”ÿ@rÚÅ*n¬M÷=l=”ÎöûœÔ¿è†vQЇàÝn¯Ê5Õöï9J¶hhEäÁ�ÿU6 ›;KëøZ÷Œö(×�HÒx[òÚêHÒ†þ#˜ W(­íîSÕÞ‡5ÄßZ’Ò¸ßÛ* ¡‰ [4P*­„�‹šF$T|x0er+™�K^zzVÙÂh+$¯émØN±�Ÿ/í�Aà®*e4KÁµ&+9&/ –“;>W—(¦Dýž\û²»ö`d©ë-kî-ö¸ô÷Ûd+§¨žSÁX ;ŠnTj×WÅ×P€ñ€0¹ƒŸ°´ÁGQž96ü÷ªµ· =ÈÈÎUçV'ÄqàÍ~Ö,11f²‚ÛÓÞØ‡žè�°C“‘A9çâð_€<ĸ§F¥H&«­õØ“ó¤» 6\¼ ¸×[=oâÐÚŒÇYí&Ù´·ó=­ÏjVh-ôäÆñ¶-KwÉ!ï–É—ûò ‹öËÎÆx³¤g¯¾è±˜¾ÕëŽa7MãËðÖÖãõ€P” \ù§¥LŸ¹Â×tz˜ƒíoSÝÀ˜+Ý™ç;¥P»°/µÖ}á'ä©“¶è‚oçÆ=Yî:jø�\®Ò@rúS³É÷�ŽŒ&6CEdÕªW¡{;ÐârH,JâÐsz¯àìcqk…µ\¢û¨Í0z²eªéiЦžÞ̲~møY¬–;¯S«ó[Ð ˆaæ9¢;6‰?w;ª¾[VÁŒº~Ý£ÜÒçñX±dw@¸ðׯÀ…C¯ikæ9eúÍ­•ùgN“ÅÉ·>ÏÄ-n¤N×sUçnù‡gÍé‰ÍŽ«ôÌ0°¼â¿¼U`t–öôx›ÜÜyˆò&œã1ÞwícÛ@Qš™6oV·x·GBpÎ íµ¿À%�ñÀÖ ûU"Á¥f ÑjÔ‹mzÇ ¤Š»ÅŒ èba1Txo£3`Q‘û{gãRËq%ŽCr!ìá¯{ø ꆟًµú¦ü¢FNÎdŸ˜¼fXÁ‡¯«’jë½Õ�úø�©Í¸Æ‰w¬kå+näVˆíßGŸ'ÐåW2Ý÷²‹‡oäÍ$Ÿ³‹bÉmËEUëob óß9ý˜ ×I˜9 Ù0ܳ–Ñ×ùÿ¯ ]þžˆ¨’ ,%™€`ÕÊ$ØÕø:ŸH öª\Þôp?N•ÏI`@!ˆ ‚,Ìüó<õÞyó£QÌÁÉ„e?'^#¬±Û¶ð––M¢ÛšŠÉ‚S·à~ím†fÕ«´7ýpýû—Õ…õ­IƒÔïí ãð~3šµW¨÷õ~Ï�«ëÊ¥µMŽ[½�µø1ÉÍf>xG�Ëš×7zûG° É}Yú?¦hlÁ©0ÓäOBÀåùÞ{ $é~4×àý?On]é|NÉ#‡À`Ì=îÊž}|;ÌvéúwîOç´O™y>hŽéMc¾ñ+s 3hò�‡¤å´«6~¢8êPNøÝœg&¡¹$�߇®ƒà¥ÊŽìë¨ü³d7Øh©ÞePw„Ñ¥@ß_/vZÁéÐG†þ5k (råLŠl Íóਘq“vx£œ9aA*¦÷¾äŽòjy ¦i× pC“A\¨ìFÉG¨f}@MNÞÌu±—ÈÞsžJus…¶,]±eìéÜhJÁB©eî÷�ÛÛZ9ƒƒhÆ€JÂ!ÆÍjÛ»†:mJ+á]a3¬bø¡ ^�kmEKœ~ƒõM;�ùß�¡tï!¿g x¶/}›�.«B¿ŽÜ¶Îçß:®hVh@Zý¥u”P†yÛ ¦²9JpuôØ-ÌÛ ›w¡†gÊÒJ2U–ÁFb¿£�Ì¥w Ÿ¹“ÐZ5tž ß.ì²WxÃQ Üü-ÂÈ–È¿8yÕd°UÞ{G ×Òü!•¹–>šóç 9·¸>zxæu³Qö3�-^ŸtúI( jÓ£²•luí¨·×­msñt ‹É{Ç>¥–Î@ûKI ¸k¶aLêÜ‹ý-•ï¶XϺï-Ðij—ïhôê¬VäFÀ=éív ‹Wió*YµH¥|–MS[Ó¿yYµ†燊ºÒ=õáÎcº˜Ùöxõº®Žnò‹í¡ȇñ€‡o¸yÍÈ*ùgå+®—õ­gKY²ºTIüx¶ ¨ÒÓ�XáÜ<Ô®¾?Û¦Ù‚.RWCŸ �·XX,ý¦Krê\¢¬Xd Ð×7UÃd%/>`îH�4 ag~ûš]‡»÷pÎZÓ�‡”E“¬Cã:½ªP,p$€\ï¾�ðfÄw§Øì…‹ÀRÁŠ(±4UÃ[¶Þ~MÙøŒœññˆ™¯ {Xçn/ZÉùp¯ÙË%ºieî,º®SP9[€§B‰bð~à?bÊ"g‚Øâ¶Ðö¹~VÝQ¾bx~ ççL ·4jvâ/Á›' ö°c�ïe*ZÅG1sí�‹ bKßum?�h6�µì:Ñlò‚<ËäK}Y|ÌÐëÛÀ3 ®ÖÉ(—u3ÇÙP·7(Ä@àÙƒ‚UBäÊ%�wtˆuÐa‹ç·¿ap�™;T(NJÁèê�6ßuz`…ãÔ£ ²RÉ{3çÔ9rJ³d�!󃥧P\±.1þ°EîÿfRM‚µôÏ}MÒ“&ÙX`û£¶ pŽ„«Ûiªû|»šs-Þö‡%=éǨ†g!ËpÖýйnZÁÝV7Y’Ô„w!·;Å5*‡ôòçóÍáfK\´óM›ŸÎô‰ºWwÐêÇd�ˆ~*š÷~æÏk8xž^$y�íšïR8¯a¬†.ˉ,½ ·iÑò+útøÆRÒïÇp•ñl´tǡ˚[@­“jGI}YziÉg+‰žßgs ló• ‹e…š Ö«8º'ôgŒãJmX$ õãUnò ú©OJô!ã³4‚ßÿçGû xÒiÝ0ÇÀÌø·íâãlŸ.þ®¼J-ÀIwsT¶])šµþ§ Ÿ“Ö4R¯©Ìà(¬^Ê1W¾]ñ¾DâðÒ²2NK¾ªÃ~ÄÝ.[g¾q¹öžWô‡µÎ•î›îV¯® øàà ·$[ùÝ¡Ð]„º—|²wrÁ_e‹‘[\œ`Ÿ@‚?!;~s Ëž ‡iÔ,vÄé Ÿ Ú ,- ò7ÒˆQoŠ£§ìÜLž04*¶•¥±ãã Ö—‡m°Ûâoâ¾Å�n]­EIž/Õ¤­‹r 2ç;}`]u›_ò\¶çÞXu�o™;ñ·µÂGF¨¿W 0�®Z¯AÕ òódQ¼Ê1ޱhf‘à^î·¾1ÀJö,†ì"[6[¬ñ×`Æ_ö'�ä�×dæÊW6›Á»ëwb#ÜŽó¸ NÙYìrÇ)½ò@iöÚñÊ2.^..®‰5æð¦ÒÚáî¡LH2Ó ê \/ЮhÑB—²®\æŒ;¾0G¯‹ }Mì˜òåù94=ò–6Ét•«Ùó£ÏÏø•¤©lI¢ cáyDiÖ«‡g{ãÈVvq�2߃ÛۇfºçÔB^�¶—j�‡�óQ ?rÖm¾Uöؾó . WâfÙ��NÚÈÏYŒ—)õèQöÆ|òÉé GsšW=�N²9œþ ²M² PŠ€�ÉkáæŽÖÉ`‚Cž3îsœJ¾§k¨. õw‡p5àó2.MDçc4jÖ�¬› ˜ã'©SG)ƒÞFæN÷ÚÇjÒ‚ƒ›8þ­†Gs†Ÿp¯pPûÝ�Ð Ðõ26Ó p´õsÜô 1€†Qò¦®®:æw©%²E­Èµl™£¡ªK6‰b˜çè*¼ímâßnD\‹µ†ý/Ûi-oÃÆj¼Ôöù;®îçÖ#Tœ¿È|bûpzµž'Á7æ¼Ûí¿3³ì”4K[öôg~.{;-·ZÄ1õíP¸�7ál;È›à{“ÁqW“ƒ·ltÒQØc¿9/F±ö¾àƈx i†‹¿tœáS û\ü‹†Ú¢ú‘Çh�ÝZ“â ½÷ìqSkðÍÅ. '×wÊÓ‡ï2YZŒ6�™S[¸öÖTìã¡ ú®{©Â€¼ äf³Ñ?�a¢Cùñ5Ræÿ„¢Å{ ‚�ܸ®³žÝl¾Ò˜á$äµÅ j¢%¨—WXž [‰î8pAx&ê{~Ÿ/ß¾[Ç„:Ý 'ÎUü·èíb@‰;Î$˃L™ ÆŽ–Aítýy:‹ÖFø •µÈž“sÊA!,{£†HäY‘MÍ‘ÙÉòÎUÙ�{e{_’�=ć—‹[�Üín¹¾=†zÿ­æÈn»j¿5¸îÚ@ yÖúß#ZPàèîÉ»1Ê£âÌóÂà í~ß�L3Ö‰ùY“A!¶÷P=w+ÝCƘtqN¬tÊŽÜñÒÞ�ëS|Bc�ét¬µõÅ6ˆ8Ì Øª_.íç·?T'É‹Cáõžf×Þ¿.ÒG†±kð›+øáº$ꦷØJÐbf»õš!ÜpÖå|+?@ÜéA@m‹Dî{c-�íuæS~ã4ƒ9@³èìy„v™\û°1ófxòüÞÁÈ;÷šËk,)a®Éx»›7>±�„Ììð€b!ÌÒGÇ1ˆjü,„œ´ß|?\,{¬)î+¢†N)ñ{À¢j¨^ä<­í6ßÔzN‘ÅìôÌž\ Ta@Ó–¾>¼a7”‚ßp™Û8-0i©›Ý-æD;`àZ7p†*y¸ …òÊ™ˆµêåNÔà ºHÍÃàµ6Mw¡ü©ä-âÿÆÅøß…‚‚ü:ÁÏÌÖµUÃB/¼Ú#Ði´gû·ŒY±}ß½^±÷q ÐvÛð…„-žòwÝ–ea0_Ä|lR¼¸5‹ã¤%‘¿²È»+_CÚu\Úˆâñžë•¨€�&NGé#…“þ¯=dÓã¨BÕzþ0yÆ™Ùî‚ ]Rc÷ßuAã�fzšî‡D0|PÜßuèsÀy @ÿ¥€Û,…õþM_R {Ž: ùÖçg=Ç›”l`ÜžÐDÌ+x»Z— ƒ¿2q{þ¿v{µ@dAd³A Ší³Ìµð�¯*SŒòÚ:ÑPö•äŸuÅR¿ë¦ªN´sû}_u¸�Ô´ �Œ‚ð®ÉÝSrús‡äïɳæo…ɆtÈ—A|°1½þľ|U 6ë7”‡h{ʽ:ºD‘¾˜¶L£¢ÓXÉÑè†!`3ZÂz¡4d mRÝÏh ªOrìƒXÝß°8°^ØÞæn«Ëɘ/­ò%¹Þ¦çÞ=‚—GoV'�‡îÛ˜ 5cÒõD�û"‚S³ƒÒ+-ñ}ÕÎ,ÌkïkãÔ£øybôí‹8• ¢óÑ­ïÛÔG¼}}ˆoá�Z¸Ýß…*‘¥µÌ^ëñ2X¸íi2¿¹[Ⱥ|#Ä- žžÒ�Íàœy2Câ^Ý] a(çÍúM�GB$%�p6°d,¦pX ¢žöcÁ£ ÁìŠmR›)ý°:?Iéu·òMà7:õ· ¾åÏâ.¾…VùC�zÉÐos‰q¾0ÆÛ¶‡éýmN°jAGuj,Gë× 1 a�/Þ½ze¢ìçŽl-%‹Z•O £%$E¹üþÚž^æ›Ï·f°{¯{Ï )zdKQ¾EŒ,œ¶»ìÌs¥Ú}rÙf›èÝÔ>ä‡ÄÔús—=‘ôËðU{g$'Á¸¦›¥Ý&9´´˜¿‚å+éÊà‡ªf2ÝèVáñ”k²Á�£NqÃ-Iî�¬WÌ]ɯ«‰ žæ ˆ·’=Ÿ1-@ëO¯×³�EXÖEôW¼[Y¢xlH±Žrs1zöÓ kñDw{èñmõi;ðïÒõ<ãü:¬œš–¯mÂ"Ý-ñMûÝtÛ@º•aÞR6¯à‚~íÎÏè)Ú–¸34ú‰PÔôPïÈ+væÄS¼Ö(Þ­ ØG#�$@×¶CÑ ÖëR~Šy¹›øµ»ï^k4è'¼Ãíó§bÖÊŒgÃ0’Îw>o¨ZïµLùãÌÍ`ýÀ`þ¬ÌÌf ÚÔ¬ª³mMªÔµUùÖ¯ÿæ(+$Êk;¤#U`·MûÀÿÿþÿÿüq‹À> ÷Õö¾ÇvÒlÛ{s†í»vînÝÄš6j·§m¶m;vì5³nì¨NÀQ � U(P € >€€tP( €€@(P �»€À@€   P€½çÈj…LÍ4Û4¥(@3 lª©5‚¶2ª­´„UJ• íŽÌÐÆ›³J%J˨ª�%ÙªJMµ6ÚÉQP+c5Ý´Ó¶hÖ¶ÃSl•J6Õ.†‚¨ ¨•AÓ$T(c¶«¬�ÚæÅ;h�*Ÿyݺn"нš¨l×Y"hsm:킊®´J”=½:½°¢A]´©K¬•]�5�(’ªJvÒU$®TjºUHUQT)[4Š¡*%F¶·[CHR¥B€= r 6m°Tö�ÄëUQ»º'mRnઅRˆ$´ëIV«M'T¶ÕSª6ÁÊíÛEµ�k`ÊŠªhV‘$«»p%P”-�kC“6¤%°dPª6Å(HÓRÛSVi RUJ”PU%;VˆÖP©k32Bl­I*AU)UR¥D„†ÍvÈ’‰Jí¨®ŽæªµÑÚÅRª¥Ù©ÖŠ[] P¤IP¹º:ª D¶³õÝm”ô+31 m$ª¤ÖW.îà) i™JU*B‚B¥RÛ®HhÔ%UFͪ-Î8í®Æ.»mÒ¶‹[�œ‹kj«¾&÷�t! ª’ì¦"UD”((¥"(£°Â) Úww]BR! *:ÕÛH¤*•Ù¥)J"IM´R¨‚•QBu[f¥DŽÙ(–Ù ¤¢T—wwl’‚ٮιIv`EJ4hƒvn–1m„ˆR¥¶6²­”ªÛº�u‘§A·]Ý´ 6j¶j¨µ�CLŠVîweVAÐ:'fŠ–²d]R]± ¶‚"N� QÐb¢@Úeƒ(’Ö.™R�Š””’(—MU"ÝŽ†mªÅH‘JGw2+ h‘RJD’¶ÊJ J ¬ ¢…B ±F’(�bB•&ëjGÝÕ;:×m�J¢’¨™ÝÊRRk ìÊ ”ìÔ‚•"@ª!3Z1TJ“lvÂ$¨@ª“Ÿ[¼ñä i=ÆžÙH=WN6öîô²×mu:uÝÌå*og—©­½Ðîj©îÑÛì×MZÔkT)H€*I"¥*-œœ”…!E[j…XÀѺÕÂEE%%vÊPP®�×e…\s ‚¥$*+ dEtj´ÁŠ*+CU#LEF†U¶›2·6�ÖÖ îêàÕ¶ªJÙ”�‚J†´Š‚ª©E ª�$TŠQC¡×B®L:ÒB¨ªM€ÑQ*¶ÊPPD(I •%F��ëÖ©¥)»eJªˆ*B¤ ¥’�ènÙD’„.�W%Tk $¤-…QŠRºÛdª¥R¨•M€ÐèdÔÝ RŠ­”(­…6ePVŒHšmjsiݘàÕDª¡ª¨“F�"vh*í®#*¤!Ðî)B‚l 9H‘9ƒZ ”餖´¥FµF�ݧjª’¨$¨¤ÙŽƒU@ÓR‡a  4Te�S*©&±N�»d-�³�ÓWXbV³¦Ød%@R90‘QlÊ¡"å×K,5¥@Š)(PKT[J¨ ºë€(¢Iè¡”•UN”wmµ)RÓk4ÖÍ£*Dul 7uÆ�õî2 UU¦—¬D!tÒI(�A*¢©E$*Wfª»¹¸ÈZ If5©+¶¢� Ä¡ RŠBƒ�uÑBmÖI$*�ì4ºèuM©%!¶K°jª¤Ší�P+¶t4]ôç°ÀJi(‚ vÔ¶2ªí•&±I¦ªT¥*”HUNÝrTm…oª„ ‰"‘š21?i�¥%4Ðj š©ø%*ªúªŸéI£ÒhhEOÉ€€)¨L*hšyOPšBRQ•6Iè'¤b4h`“Õ$”‘L&¤ýMG©êyAêQ Ú�¦ÿûýÅ?Þ@ÿïþjƒþf?úýÿì+ÿOùÒh*²Ô-RáŠcÿÕ ?ï Å)¨Ÿû­ßkrn‡P ‹;KãU–YóIq"”ZÆ31G‹½š�T» í„H¢„Íë!©fÿó“�DNÍ·g–†Â‹hÅ7v±ÿ±¬¬îùš´ŠÒ´YègŽBA¹—©òË[@iØÅ 9…{V0*`©£ ÂÄ¢.Œ;UTRB%У” Š´‘–0P¢uB† AD 5`Å‚€ I£º]@ „@ß»jþ6¶ÿ§ý/údÿêëݸ®]Þ÷ÿgÝ÷½ÇNæo¼^Îx/ ’:ç;³w»ÎçW�;™w^÷½îåÎë»®î‚á×p»§tK¢u{®{»ÒëÛν»Î½{¼ç³/wžž\œ—.Ü÷»Ý˸Þîrìžw.æuÙ{´w�\¸æîë»ÝÎ÷žÁyïW£ÞÎûëߎwwÝﻗǧÞùîî|¹÷Þç´z÷nñÞ÷}ë¾}2îîÝ»¹ë¯=s§;IçO»·wO}ç�w;î磟vöó§�ȯ¾ûÌço<¼g{Ýòé÷žŽ÷§º&è/{Ø÷wºìA_+‡Ñ×9Ñ�Öãs·ÝÞùÔñÒæ}ï/q;ç/;®w]Ü'!wXîîîëîò<Á¼Mç+‘=ßw^ëåç¸ïzïw¹�\î÷ß|ŸNo»Þ¹rwK»µåì¼�»Ï}Þ{»½ÛÞ¸îÏ^ñïw¢û½ë„¦ù·:{®›ß{Þ‹éw»ïz—ÝwÞz'»½Û¥áÍÛ»]åÚï»ï·Þ÷»çÒ½Ó‰ÝΛݺöçß}z^O½ïw¯t®î$î<{ÛÞçtîîîïw^ë®î¤ög;ÞïuÛ³·p÷¯HŒ¯òëØ÷y{uÚ\tç»Ôs½ï]Þ÷;z뻎½÷Þß]ïx½síÙïpOt»¼Ü…Ýç®t�Û¾÷yûÇ{žõÞ&Nî’9tãÞ‹Ç»¾W½÷¼¼—]Üîró«ÙÒ‘Îï9ë‡GžBhÏ]Mî×—3ÝÝqÝ^½NÜ»´N9ÝswJï.÷uÓ{½Gºô÷ݾûíï+ïwÎû·IÐîs¯weÞ÷Œîww7q¹Þöò^äî{ÃÔÆ»8në·‘w½w®Ý;»Ýç®Gq¾ë½"ä;Ÿ9Ý{Îé’çA7Ï—Ç7Ùéç=Ý÷róœÝÀ®w:Ÿ8w®ð'º÷»Þ÷¾÷½ÝÌ÷½èwv Ó÷¯3=ÉÇ.Nu¹Ýù¸ôýõ÷×ÛÞº÷ºï]Î��wn{�È{¸E×½ïŽç/;�>õﯹ'Ë xrû®{·L¸»{Îì÷w:E;¼íîû³ÞôŽî¾íéì½×¼÷zotÞv÷z=Úw=Üܸ½1«¼÷¸—s¶N‡Jçw}×o}ï¾ù{ÎyéÝwr¹×wwwn_uÈ"f÷Næ]rvî‡�îîù{Çwqu×NîÝ{»Ëº¾÷»·‘y‰——%éÝÝ%Çvò¼-åqÝÌùïœû¯�xî—x÷{åëÁ{¯+ÓÎn÷Þß^:àܹÏ{t§º3ÞÝç^{¯½æÃ˹{λ�ç}Ý÷\¾•ïtK·\tÞnñÝÞ÷—¹:ë»Þï;Î î{Õïr]u×½ïNº'8ç½Ë×Gwr‹®:žqyÎ{Ý{wwÞóÓï{Ä“»‹¾õô¾)_uӹîî¹î¤º;©yî÷=Îôõîå:“¥Ï}Þh3'tî�{»}{Ýî\èmÀû½{Œ�s¹Ñ:}Ý{¾öô‹^ûÏ]nîyº¹»—oºó}÷S�Þï#^—yt½îWºîîsÝÀ{ˆíÎß{·‡9wÞõ¼éž\{¯¾ûïºåÒ�×îç‰ÉÝÒ%'Î Üï—M÷|ïFî÷½çG]wu×Ï7–_{Îíqî眞èö^뻥ïwºñî)î¯)÷]ï¯y:nîé;Ü÷'»®rwG7½ÛË—<¾o¾»Þ÷·;»g}îî® ;ï>÷Üû¦ wvéÎë¯y¼¹÷Ýo^êçqï\œ]¾W’k˥Úï»y|ù{îÝó�½ÜÉî:ì×wQvW5!½ÝásÊûÝ^î Í»¾ï\·ÊùçÍ}ÝåOwžbç$ÕéçŸ{Þùåóï{ѸY7—Þ½îo5Ãëë�(wnns>÷¢ö}Ýžï<¾]÷yy.ùß}¾]é÷·¾îç7wWÄó|×}×|âùȉ/‡�vù¯ åw×»½=ÚîëéÃÊ“_{±yNvï½í ¼×Þëßw—Ýu/¾õó\ïº1_7×»¶}ÚùI^gwÊñËï|¾|f>k•;îö¹«‡¾{×ÍÄæÝ,מw‹—•å{ïw·:G7}×.îòïº�—”‘£›»ïW‘ÎXÞ^îkϽÝ÷_w^÷|‚òÝå×Ëæïu\ûžö¯}Ñr¼«œ¼¾kÞí|÷}wß{ݯ»žï½ï¯­éƒcš½÷¼}ó£r�ß/¾ìû½î)î"œãŽâòûß=ÍÈÚ>o½ÞoŸ}×»·Ýto—{ïoq۹˽Ôùïh¾; ÍÎóÊù<ܾg_{\ {uÏ>û¾î¹D•îº;UýVÛu­}m½[mÊ d¢ˆÙ­f(‚»®§u¹�܈5r¹gq³¸ÆåÈŹ\Ü5ÎZé\¥Ý�-Çv刨ÅG ³»Id®r)"HÆM“nTs\®k»µHŠMQfdѹ·0X’)ŽiÝΘÀ†L*ˆwG QFÁ"å&É‚1Òæ�®[›ºáÎÆÜæŒîÆ»�µtå™2å»»\ÑÈá®\åÙË— ¹Ë®í®cMss&æ5Íw] ˆ’¹\¦rÆ9s”Rl[œ£‘Ò×1Â噹»ºã4N»›šæ"ÔåÙ-Ê8\ÜÆæáQPî®5kK[ikmvÕk•Eª65QZÆ+L"h)fBf2™ XQ dJY†3‹W$W-ÈÄu×%’ šå*:Wîî—Nîwn•ΙÝG \Ü5×t9ÕÇq×q¹�ÕÍßã¶µ¶¯úíµ¬ÚÛZ³mlÕYm[TÕµ-kJÖÚ©ªµZ¯úêÚÚŒUC-Š“HF Ú(ÚͶԶ¬ÕZVÕlª·m¶¥mµmÚÕ[5UšÚµMµ©¶¶³mµ•U«µm[i¶ÖÖ[mjʵ¶ÖËVµMZ¿ñÿ5ÿ�Æ\îrPë»s»­Ç7RÆî’Üînq‘;Žëºî�uwl7Fç:èº[š]r›”èÒî—.tê.î»®D—QѺîéÎ.®îàç"é9Šq‹²\;º7n瀀ˆˆ@‡ð„@µœüëÿðöîù÷á:�ñNÖ}x*K02þKÐjÞ.iŸüútJ&_›NÖ&çΣágÜHµÜô†âª<ÙCçÿ þºu9ç×7@Gä(h!jÆ3ÿm 7ß�çic l1j±ºðN™�µYÎÝåDU¹ÈFþi»­l¬ Sõ(zè:½ÞŒhéͯ¸Ï 4²a…_J^O{x‡Ô? pÞâ kûç\³Ž©J§ûï&¬àûi$ï¹ó>bT_;\kW8G¡Ûãˆp`ÏCÛ:¾A/Ïþe…«Ýÿ‹YS`Q¥¹¾Fuÿ&ÆiŸqŠ=PêXÕþ“®ö+ßVÖ´òï �í£íÞyà1¸ôºW��Ë7¨ÿŽ]%[H"ú…#E¹­Ë’p„ Ò¥ytlÛ €¯ö÷ñƒõå²RXŠÅ(7?Ò±”gg3zìÍ™µ(µ@Ú°˜�û3÷ÔKdÒÒØÛã“ÿ{ä§ù1¼3aqŠWÊ“Þ7wÚ±¿hÖ÷ó–+Íîœ<»Z9¯Ý7æ9ب/2ÝdL¶é�óöØéÒ*¸¨Ú�—n5—�àûã!n¢"ŒX¥��!o&ˤöçnç!�Ó}åš° Ve#Æ[Oùj}›ÌA—Ð÷+6¤:¥uæÏX ª æ™Ê0™ÜðY­¼†`Ó‡V_fB`±´;R°Íï©%ØïfoÌ®¸Ò)«M¸öÀ^G�¹[ºÙ}Ê7ÊÚå¶�Âö&ÒG�-_û£p£¥D;—² 3bGx6=†ÂRUà |ÞY„IsË�® BŠ‘þC�œbyǶgN¤§ëɱçôaCà­ÛcD~‹�·d \äŽE$L·Woˆr޵™úšãÃiAÐZ�Û|Ù*!¶g¢M†zóg†{ô<àF¨wÂhE„RÜ«VŸ�q@ Y7 ÎÎS>ìnÍ!·62)`77Lk—¯æ ˜Ø-¤U).îø–´6bÁ±¨¼œnÙ¾œñOÔÿª_3Ñ5¾ õËáóæwnê}v”ü`#Üo*ÈNéþ ~g€œ$dô½Êbn› cª§&Þ{a[/m¢Ž’ F#OÛ¢WQ… ŽµÅ\ "ª9¾µI)­:¹,¹ã3;t®iÒ±L¦kiÍÿx/Hè˜cû­fiäЕ eà6½�¡ZºÔ¦K"^þ$ü–9q¦F�JBÀÕB"­Ç}Q¬ŒŸsððmX­€ô—ÈÅ$³º;˜ÿ$ÿÉ´Æ_âþV±>ÌÎP˜æÙ´¬+où@QPQ ÀÇïËR¿Ê%ÿ.îk;° kÅž=÷š„ó³�â\C5í]d|=ª�W«R¦’?™eæy’¿Ÿ¿�˜•ßéþ52m{Á¹›eÖoP»ÖigŒf}ˆ×³(êC¸¿ê„ Âü?ë>?æ=¥ëyÓC_Ór`õä\dó]ɯں†ãÇF+A˜IuœŒc'½R£Oúw:�ÉG9þ ˜Gîéçlgæ‹$²Ñµg»|õÂÜÖ:ªÉ¯ïà›£BFâÌ‘$õ(›®rïX� XÙ€Òföw¢ÑY½Ôj¿³©©WqZ÷„]XÒŸ«úrÜÚëZ/~ØU™µ¬S–³UIʗ´‹âFq[á#„×€�­ ÇÕôVÞVÖ Õ³rˆw¸ã+ú­œ’�ï Ù*“¡ýE¬ñ®°â˜0Í!—cÍ0ZÈXö»ËM…:÷óQüÃcWñúØ4ó4RHÛæCÀ“à Äãù§R»ƒúOvõa«{»G%6ºYZÉê®dÜ’1 H"`Lg‘þ,ú~žõ•?¥íFÍ‹Êá 0DnÍãΡ ÷ní/ɽ´vPZÓøK¥nÎÀ^Ößùúuk“꛹2óyX1ûë;Úá>ÃHTRÅ üW–œ‰ÊaóƒNƒ!{¶­íl¾éFã¶ÎvÍsG‚äÁCt`aå‚uѰ—‹ïÜ–»OÝù=×ô'/æ(;¥ï"˜:He Õ_úZ“øÕ\¦of®IRË{‰±ƒ¡0Èmým—~Wĩщ™X““ÿºT úËô ¥ Ð@¡6š”Õ3êdˆv’ôÄÎÙŽn_ÂWyC8î–ô‘�ÈíUF3ú·�¯Õ�ù¨�ÞaUq[°Ì {¢Î£Z„l :—QÆÇNÖs•¦¾TÍXzcQ³!(Û Â‹�IoÜ�Ò:“Œ(ˇ1Aç;jU²Û'8ëÒ%«�(èÆqy¹”ùf¯×Þ2c®c‹`Ðk¥bîæÖ:zxÅ-ðl¸ ú¨°)Z¨Ðµ]CþÉ7|[ýVÐÊÕÚ ¸‘‚'á×½ÔªÂ~.ÛÖ<œÉx&~õ/€7cïñ”ý*ðĹrHê]Gá<ËñÜð‡w-h†ÈÛ k(’æ÷UÂJÏv¡Šƒ×6Jª|º ã‹öôüž£�˜Y·”ƒõÑNïŽÒ·N•”~wÍÌnØ›eÐ:|Óñüý³xSŒEî:®‹: U¸»âè™ù}Š’Iíú†—&÷e ˜>K#N–ÍÔ�t(¶‰Ú˜ÅȹK”YhñÙŠØE øf:Š¥qSŠ2œ. Hñ z\‚¸±[5¨HÖA¶ÜÍK7Æö%ƒˆ?”‚‚8‚3úÈ÷õϼ¯'Dd¸;w±Çǵ ê0”—Öç¯<' ãþP´„˜ÈÃ@_“|óú£5Óf¢·¿Õìó¡Ý4ÇÕñÕoükè3 Ò[”£ê� ¸é™¬oŠ¢µü“œØM ¶Q²á’ŸJµ*ª¬Á@ð¸5µJøïê<”3œ€iUêðP`[Ž:œ£ù¤Õ5LµàÈ6 _õ"„߇mea�Ç¥ä‰Sßb?.†MºHNÐù4M5¼ò,¹…_ø#˜(Š|XŠªÿxTÌMdå|t M«^Ñx.ctTXÁ½vSa¥´Ä\¾ÙÊt(qÅ’2³!åp~è!˜IP¢çê¹þî�C g˜€ØV}åáÉ[î…‘§�3Yê]IkŸ÷ â•(šû3ÚÎémÝYu#|š ”3ƒæöDúþ5÷ç%xEôΫ#[¹Yñ¶—‚ˆ©_E©l¯ZáÛ³”}¹Ž€þõº éÃÈðÀÓ›t¿—D·ó éÛ{öçv“­ïE uh¶§óÕ˜¹õ0OM,‘-ýuBj�¤µV²q„�fßä…*?¶ô¨„Íß&ºÀáD½ÐÀŒ%>¡d[Æ5ªœˆ²¶NÇÿ`È (IoÐŒ\o�7ŽC�ì_ áƒ�U‹¶O!Ù{ÄDå�3ðH­¸uTÛ®3oeÐ9�OY^õ÷¬ØS, ü½â¢àaä›AËâˆÐâ u#”`ö:Jc“páÅr›B+lÙÚ*ݶ• Ñ�ÉbM:“k<`¯ðæ§È)j¯“t°‹wИç„ÉRmØÍ÷™zЖÙªGAZ¿³ù%°`Ž#6Ê²é ¦šùFã»êt:ø8%A-“Té÷ê¦äƆu#¢ 1Õl¦(ýD§wþ^ü«¾Á©tØF$cjoë?WŒ‘µ(Q)zÐ'îšqÏ7E°Úì3·^º4݇æ;²ò«š·üŸýSt h”?4?ã}G žÂê¹g•¯¢ˆ ÙÉËÿFÌé½£Z5-ÿf¿þYêì®ÿüÈpÖÆ¢ÕÀl×úÿ·–ößù�ðõ(óþT[é:v0€w;:óOÎzL–¾'At”zÅñ“ 22 ³G«•škó7ÍqÉg�Ÿþ {zoïXéþü¾½�)á~çàI#ÝŽŠÝð ò)¨µ�x¸ülž{Cí“×~Ex7qá{¤Ø×"ÚܾŽjºS>vJ•: h+¥“aéO(¨Øy ž’0½jFØQ¾’ÞÝLQ"ÕÅ¥ Þ‰pÅÁR‚çϧ«Z©tT\Ù4ù”qê0{�go!º9ìÀN?�§¢�{"ÛŸñl[ˆŽäÀ¢ám�…Êk/‹*å#«.Ff°�wÅ)êlÜV�­ ÔI=ò‹x-ÜUÒô”ž=a P.kc }b…ß–Â ,ç#òyú„óò›Ô´•¯Úµã©Ó’�&>’áY‘äj„ìOo†ùÌÉ+KÂÖú/8ã>�IÝ>ØR`ûÀбoJ¢MÐOyGú)$]'wì¡Q£APŽJX”ÚÀ©¢Ýñ�Cn]‹¦o»®nÌ#:k{u*F*8îO*à@èV÷¸ÂüdÖàãm°vÄ–T§áh)äâyzÊã¯-ËØë^÷ü—ª\#ƒ�WT¯ó¶ª’šÒ®¤;�A1Á.rˆCÏT}?[†~F/OEP£°9�©¡è�e3Öy™t¥JÎsC°€C�Ï�»³…·[Pá~£`õQ•6µ6Llò1£×áÞvY§øb±‡u­ç ŽU\ ®QY¨5 ó¨ùÌùBóVˆb»ºBךl¶êÑbº‰ËC‹±¹jžâvX´~÷ÿ}”²¿É%~E?'‹ÎT/š(©t+ŒMh¾»¿[~(K�¬Hãºé'ËÆƒÙHCÑBí�ݧò“º_·ÃãM�™â3âŸT›˜bPe‰¶<òñK×c4X†…µeg-»÷ÏdÏ›ýœ…Œ¿‹W¼¶EppǧÛ8wŒúh¸áñoýo�éÑž-…[3­$ÿ5i®­qüõzÜÇÿh®½%~º�/ú}¹Î’"÷ÑNVÁÚJ¶ï —×Yr훯g.©Ú~7e þ=Õ±EôêÎí&ñCŠÛ“^žCA¢fa¸7NŸ�Ï!ÉPT©¼ãp�Gy�£û†wÝbÊ%²üC~/ª-m‚H8UÈ<´£s]åâ€Yï:ÕIÃ�ÄN# ¼º;uw1Æ`æÛÍT :ššˆhý1ÍÃVÁXþdß$,îð•”ñc;¯1¨P-ÌFåqfõ� ׆rWÌw?4¸ÝîS¥ÊÇàïî)ÞÖ* .ŒH|‘‰<Ž9ó{·¿o?§ÃŒòŒŸd.á+—Ð÷¦–Ù¼ö�BÔ¢¿šîÒþâ—÷»�ŽŸJÔ$ ™Ë³¾4ô4‹Ü ¿iW:³ˢ�xœìlwïˆÝ.­›*·Æ�õD‚òu‘©þ©@!ª}•:c ÛFÚZÄ)„ÝÅÂ#‚6C¦+äþ;Dý³Ïîëg¾xtºgê ôþixIíÃUý*QåªL­aÛkîîÎÞø_1ŸP ¶cô:UÕ6Òég:ׯª^׆^â³ËZ:¥jÍÏ¥ÝD§Ú¯�oØÿQÕÌ "Qóp@Y`'·üž7<‘â©{føñò<íU¯ AóŸ[Cƒ>íkq/úÜS‡ð™îçÅ òî7£‚·í/ä•ùQTúà¦�Ô?_û�küÛæ3cúB„W3í ]Í Eayaáó{¤¦¹L�@÷hÂúÔ±~~�.à>qôt:/6ê1FžÅú›¾=˼æŠ&ÛR§ZðÜÁ|5vƒ%ªûÓèˆsO¥ò§ï¼=Šÿuç6Šw±� ]ìãˆ<~A8wfÀ �jãµx‘wï�aŽdñôY JE×GÍ"¨UlËI¿×M¿~×òJÄÁóŽ&¨—‹ž»wˆ½©õ²§¿çÅÅkÄŠ‰ÐC˜#³* ë3z 3ó¹ÙrkÝϘ>0 ˆÖ´€þi�hž%•G¿èU®›gEm°ž‘^̱³¿N©|ŽÿιÏÅ8V¦�Õ�³d¸ÔõÝÛ=EI¶}¤ßŠû³‰.›Œà@S[H~áųŸþ‘²˜‘{l/ߌ� ÄT‰�¨­¹¼„· °BÂQ‹ ƒѳ“^ï2an Y,Àº÷ÚUFºú£–c GFkl]# Wb&ÿнc¦˜ ÉÈ 9áo\˜ânDIþtÞ³í¥M‡fûÜ<ñÒãþúÕx╺{e^O]BmžDÁ¹»%|=w2·ÜZëMrzèSÐ’W&Õ ¨Á/ãÈ�Ù£>L¹ñ÷ ¯ûó¹6¥N—‹OF¢êµ1Yîë…!Wåú†ðuãžqÞY¨*ÇKß«²ÝSN²¹hàQœ]l§ó¨ºlÈ®T|×UüÛŽÕw[™±FþêdµÎž3ž{øîåݳÚÃUï8–gç×ÑkêU>Ö‹ü Y·öu?™›è©Cûƒ�(ôÏÏ©_%BùÑÁ—j$snû礎h{*wÝnÓùó̺m?’oÒïïïÖeQ¥»�p°°êºÓ€m9;z«ü5­J•%Jõ?¨WxÒ8­ñYû…²ËÑTš‹ÇS+å¾¼‚øµðëEÕÔ¶±yW°e®¾ßBš4˜�ztJãP‚ÁcÐàöêÎ0IÚŠwÙê§‘Ýò¾¼Ö²Œ³dn[ ·XIòY‚R9ÿiÕWãsÇ™¢š9g1w‹äÑÇÚûHsΣ,²pàæÂB"Y/Þ…kÎàæƒŒæ,[ˆ£w­SnÒx¶è�*p½íMÂmcÛ1nÊeF�.»aŽ�’¥ã(ǯ¢Ú_íeÒü„ÁdÛ/„åŽ(g âÆ®kÐ&eç�ߦÁѸ‡ÑF´ã”[ÕäÔ·5Í@DwJ`ÙJ@çätAô¹©EU&®€F/ù"9ú=§bq±C�PNHd<µ­0@XH%E�27@¢^q�Þ›ù µ}Z|l^J§"øOOjûÓN;1sçªR{N¬ŽýጡÎf„þJŒéDÅE`⢩%Ü­6îè—wáõñ€°ö+S€Ëרâï†\/ÝoޱPííJ×�ö¸{±·D”=0Ö‰ ¦|�³bèÐÒ³ÕéAÓšpÔy„ªWT°¬ˆ¨*ÖŸÈ+ïË»”‰æ¥RÆŒ¸¾ opò->˜tŠæâ êBè×nè´§u“¹¾Ý³“,S)n³SGèŠÚÐÃÙßÔënŒ êb×±z„oïØcÉ7,Ç¿Ñï»)†KêþqöívŸ:�Ê«÷I>ßÛ§xë¢ø_3ÃÒnÄ"®»º8lEÂê$æÜ‚»8 sæ¶ï_8ï:Q î¹34•UÙÓiO<0[¥ž ‹±²³&Ï-åžùõ!P‚Èk/§1ZˆèN7g_gB޲ªÃmTÔÈÅÆõ®&¿Š½µµxQ�Y&I:lÖ¡‹&ªyÅ�@ê·ÝX*w1¤+ìêÕ[ã‘ö¬v�ïUx¿?4OsÒÜ´h¾õD)î�j;º¯{R=�¹Žñ¥‹'¦mô·µÌÛƒU£×ý‹…‚üt3zX§+»?¹@sG¹lû'5'ƒ¬ 2ñóîrÕ÷ª¹�òƒFS½JÃð§‹ŒGîl}7ðšaE­ñ±RÞ¬ª«PÂå§òõW¿ÔíµXg¥…zòÈ.Î^>-ŸïË»µSörzåWm�Ök¯±Þ_;h�x™8TÆ6sI õV‘ðÉž™¹çÒ>Ð kn(°[žÕZçò¥%ƒ'@§']–ÏîÇQ¾½ö]ÝÅÀˆñŽCåè?Ú1ûòŒavL³ (ñbÍåµ;‹ƒô§Mõ3·jUx1Ì�Òmbå3UÎaÙ(Â/džŸí[‘ß“„¶¯õ$ÿ?‹ ]&Ñöwž|ó·Â1ѪqÃz¤±ÿTs§ó§7ØWå~]<Ìú¿öȪgýÞTò›z-þ­c²ÎÿÖJYë¼Ëµ‹hÞR¿då)�ÿñoÝû¿Ãæ9€ÿ†¯‘3*™?‹Yr]¬mmE錚§ß÷Ûæm¦ryõl}ÞÛï] )DZ##»§)¸–á‡ß ç6œ‹qÊ4ÞŽ¼«ŠOPÆð<¤—Ú×zBÂÏ>bì÷Ó)ߘßû3<àv믚È.þ [0¹„,÷R/œt¯PKAôÂm ’x 6=ýô¸yièk+bÔ¦£—Æ”–à¸^¸ÈUvK4Àk-L¤ L8èé/ÕF÷Êe¥Fa¬òïãõ�À¶ ¸ƒügU®z„O&©ßµ3¥�xí™®s‡ªâͱ­ÿ—îJ±£žIRËÜÔÄ`ÝF2¯Å÷Õ ¥÷²—‹•Ùd0CÓÀ”ÇÔ· kÁâÙ**B0¬kHc![“ïíéë ¯¾#Ž„¿í�Œ´m(á°q³ÓœÆo�ˆf!ÿ}~¸¸OXHeOØ´Ýj¢Å9e§_Å6ŸXƒ/úV…pÑNí¿°òû„ilpª™]ÚÊ[(¤n¦Mþqaµ`&ˆïSÈüSÿ\  ]QÍ.üÅ‚óq𕯢+ŒTÚ âS_5¦9ZÛ4w_zcaÛõ]æ›Î¹ƒè~îî¥QçÑd‚Ysþ KÕ_…pܮȒý„ü׈ Ææyóp¦h°Œ—UXóß=k˜¨.ò{éí«ÉƒY4¬è1•`'>ÈÖ'¬wREñJz ÜZYÃÇã‚ã¼C¥OA&®w`Ó¥qu`‹hGV|Vï¯Ò»ò~ãÆá:`ÒnÆ•æ^‚d·På¼Óp_’ž“¶Ö„Qȣ˦¿�ù‡KbR{¸Ó¼HÆvuµ¶¿ X¿Ä-5t“|ê©fqÁCÍ©(œˆÍ O—"~€«záÖ˜Úœ«YopŠ$è}çÆ 3%¿yÛZqSá(|ˆ¿×ª#�Þê�ŸºS�,ÄU”õtY@””ši0Dœ3r¬*þ‰x;mÓ¿š)"šÜû¥¸›¦7D’÷R°*œûçÚo2„Ïç"ºHܪ‡VW¶ïú’0,rÁ×?ð@D�`Ó&H¤¤¨€¡ Ê#Fc)"Mae¡„Ä ¡((’’B‘$‚„" É¦D$‰$d£d€A LÑH!ˆ„™3F”¥¢M0Ô4ÌÈŠI‘0E&a4 Êh”¢K,4ă2B†*(ƒØ„I� QDL$Â…I ‰ b,S)1$ ƒ4’"@”¢dŒi†! CÙ’&)�"e3$’F€É%DÌ™"eR$Ê6DŠA"H �Ä R�I(˜€� 6$A˜Šh‚i“ &l@2€23,ƒ(Ƀ"$4a$Š"3HD2a)#Xd‘EMƒLE ØÊI–6)(� "ˆA† šYI fd˜1"f�L,¢ I¦‘64Q0Ä�ˆJ2Š`SQ™šDB¥*("AšRÄYÊH,I@ Ò„“¤4щ)H62b¤Úd‰’P‰6"ƒ(Q¦‰�I$¢“¤h³BbHDBbÄ@Œ! (RÍ‚JHcB‘$0¤ "‚1!�’™dLË adÄ3Âjc†LÉ(0I„ H¤†$$°’Œ˜”…M&„¬„ ŒÌ@Â1‚IK&Æ0Y"ˆ4‰d‰DÌ…”‘ŒP¢(¢&I!¢M’Òˆe$„ &LÌ™±„ ÂXÓ fL�” A“$̤¦!- QA‹�Æd1„$d¦$ÁLÐÓ‰ 4˜‰&!,0Ll”e¤¤")�1‰ fÌ©!!¥2"ı±�¦Ì‹%@ˆÌZM Ó2™ XÂD01H””‚‰ ’ �1�"Ä‚cDh#a˜@’‘Œ’ DÂ…¥ %”EM&`ÈP„™’@�2™TC1 ¤$ÀI �(¡&RD(LÀ3!‚$¡²`&"�DI¤SfšDØL“&Æ "HÄ�h)SL-"ŠDe “e$ÄÄ‚E"#f$šf ��ÚYL¶,R4Ñ@D)Àd’2‚%‰HIŒL¨˜Ì˜£d$ %"Fab)‘J0˜fI‚ÄÀ$@£H4ÓH�Ò‰¢DÄ¥@„€ÂEH‘ -32@Ȉ`Ƙ’E�)D2!’i�) Â™b1³4FM ƒ,ˆÄh"f`“Ld™& 4&aƒÓ4da0ÆfÐ&™�Œdˆ‘ L�Ñ’IE@E0d¤‘€” �3Œ�1K Ë"I%$H‘�¢lÑI,”%˜14Ù"&d“!Ff‘(˜¡ I&2ˆLI˜"Pš À‰4&2B°DRÂ!##I`šfHLY¤‰˜R%†B2 $”(¢$‚ƒDf”˜�’2IFbIH4ŒŒ4‰À’’C#32™‰„"%2¢ŠÌ „Ø ¦‹ $Ê` BdbP1š’J(ÆA0I 3#! � 1‰D˜„)&a,¨Ð4RÐ`¨¥fˆf!€BJ`‘LLÒˆL‘’fɉ²Q”£1"?Ÿ¿ T¶ð{7�]¾ÁrýzŽqý+È�äŽÐ|)᯳”‘!‡„>a±ÓòÖ«¿d˜;;›9 ² ¡ÏSôôƒf§kôPD,÷ü¼&Îë.è°[`J.²ZZÊ.ÅU›mÀ Çjº^ÙË'Wl»WöqÌYIŸ^Õãp°¡l ƒmFG `*ªàÃÕ¤åãÔËÇ”Pv@“™,kÿeõ€ÏãÄBVsqËk%Wëç_]ûÓ�7�bÕ/òsÏûi•~/ìºvœ+m§r|›··ÆKPL5_~Á&ãˆ:P¹: m7|ã×þºR¿æÔÔ»¡2·øRcƒ,&#%þ¹r¹¯ú2x{ò¤¶£ØÃü­Ò¬3«¶R+ÞpSç’kC·¶ØWUø¸bfÖ<:Àñ£o’öOlõ¤9…#b˜_:Fo»ÇŒÎŠK%5²ï¦ ?ÝqÝ3›ù¿w@Vê]ŸßŽö ø£ËÃU|Wå[{%í[´{ÛXÃVU9·ëÙ#4æ�ßÞhGžœ¬Ÿ×p§‚*“u)ô�Ž[q*;ßžé­0g-~~ ƒæV`‘p�þu¡¿S y)9AÔ2ȪÕž:é(­×oCc]çã¬qlš+‹ÜÇ"”¹ö†*ÓÜ€O†hc¥°µ»©¿…wVA�×J1d5Ÿ--lCâô“ØXýÁ¾¶©êú½5‘¥ºç;“v§ü͙Ãػ{nùtýÐlÂ[gèrÊœ[ûéq]é=¥ ý+ª¢˜®¶–wC EóJˆ9@®'G)M(ų’ÉPôX‘)Ÿ¿¶§›Ã¼Ê[è))®¢!d!ÛE…¼u‡öðlø§Î4W3fJ¹—êÛBÑE㘠œ#Ý�rþ-�½2ã×Ïú’s/ÏÁ1 ¹®ãüF„ìW€_ï¿ ¹ÂŸ ÎÙüN½59÷¥²5 a×gá<^+™ Ù/äf ©ž‡Ì îV]æîâéÌóʽLp ³ÙÑëøš³.ƒËËmÛkŽ®™áNHT“_tª—í—¡b™+¼·H·�8ùáRÄž± 6\»•¼ª¼vð¨ªýòþ«¡þÇcN·ó7»ÓOWÏ:5dëæã?zè9µ} µŽ_­oÄøÝÞfjò;�êáž�Ýn ä#‹o¨ö>=ŽøÞ©HróËà™RÑ”oþ“t¿õ§Ûî{d1Ùéºñ¶ÈÖõ¼{Äè¸.;R„ÞùâÒ_)°·Î!ÆwªkŽÀ„FËÿƒ±wsôS,%wÚ%ÞðÈ¡gY Š¢Îys_×K¡Êé™i±€-K ¾ïPþ?à1ÝMjŒgÈUu“2�"ȵE*ö:³¬É®®�\iÝwñOœ`Áäà�ʼn¶.½;’n 6“ISÚN&ûÁ•s:U:\ƒšx¼Þ‹ªÔßõ¬SØÊ9‹.ËRàÂ7³_½Ç*£ò 54ÜÚìêçôní¾ø“íÂÛô‹òaôœåÌ…~5\íÆÁR†JÓìÛ-ï·M6âær/ƒ(=__ ómcŽ%auX_äÓMQš›“ƒ°=Ú™âãM´]뮲”~ëGÒåÒ¥VVÜ[« ¯—=}<ÝkBª˜nN`Î}z«„*~eÁ_åÙ]œw\;ùáÓ˜«=ñ³Xû¤•—,íw�Ù âqu•$®¥7,9·½M¸Új©Ïø l§8”F$sçIa‹Þm§G›Iý9N×h P¨.�5™ÅÇúâ02vrÕ1•ý(ÉÞ=U›ªJüQâQmÜŸ®o£à^ÖÍê¸qÙÅ?ÚÞr^'v^öl®æ&y‰óUËtãòj¶ƒÄ+Ue�Âq°Ø?Ñ5ÿ“a~I[2\¬bºëÔP14«k>H,EœlP�šÐ¼œJò—Cõó¬¿ok¡býÛzuÚúFàô=Cý“í]ŠÁo“çÚ…¾6‡­eN‰˜MoÃ…�r ×üv s1ZrLQÖG ì8Óà5gúŠpo¦5¸ÿhô³[8|Bí}sHÐ73Fм¸é´·ÒÝ�~ÝkK¼­· Aáô\�ÎE5áY«Äd®ù?çlªûUþÌ�»¸[©ÔRÒ�Çg¯Ä2P.~%œ9±D�8®m+ÿ—.· ºxˆø/ˆÚÓª‰ç—t¶<©þi�Yy¥¡-ŽÔleЬzb¹¥Þk\‰ß©Fo©ÒŠfï—,¢’ý�ðPÂØÎùQ3{_õÕ0®={ieœ¤"TDÅ…ƒ,'wl•–q‚³ÚãyúTŸÐÚ]:šþ=@ôê£Pà!èÆ'êÝ$àög5âÀe$OôÒ¿)ÓÁ þaRÇ;OÌ+ÃäºÅò Á.Ѽÿ­ûyÁö´¤s§´®ê«MZÀV_dŽ èú=(”…½øØ]¨ d§­$Ú:Üí>´�Æ–/qnOf”éé°£B>Ñ!7ZµSh“¤UÜ^ªùÍ¿·úž²Çp&SºÝ"Šÿç<ä£aÍ0÷ÛP�è)éɩꑄÿà·¤/%çÐKvÎç¬ì1v�sü_ÛøÝ�FÝõCñ?�IÉÕ»vÂbºo©ª² +­!H‘‹eú†ŸÇßÙ(guw¯Eë§‘‡úSŽ£¦{þ1Zl¹™ƒ&üWŠ”L‚,á~—ì.ª|ç¿"¬ü/�ù¢†rŒ˜¨B®Ð}þ:ž2 x¾s½ÜÄk9VÊR»£·hØ6�ó4GÓ‹R݉µVüv·Ÿyíõtós]*úöl×§Š'õÞ_È:ù®t¯¸” ]§[lÑ»z¹®*w]ÍIüR3ü_B§+Ê*!&¹™ñ˜PcQº>,ÃN­û(x0ò�ÒO·f’©­,+¬ÎŸ×IUmÕ“�s¼ñYµ›?‘zå¹ås‡ôÍŒ»ôµ6 } CC«70~ ßeÀ3íÞsòÿ• Ãtl1K¼2=b2µ:Ç�ÏÇ.î`ý–BqÞxÖ/ñ3 ä­µûkufóK­D>¬Ûnˆg–ë«NJ î´ÚÔÕ©‘zraOíÕõý¯˜\‡VGô7ç1xò y*rõúÆ9ñ„ßîbùyë,V<†'%œäkŸ@Žö´é“�B¬¡1x…`´gvÐ"„|öÖ^bAvË*Tºl‹3vÙ«A$DQ3%÷¦§5-P—±ÞYÜ�GØSÜu.q¿vÐèkfPgpƒM¦)£Fš“lGò&rº»  !”6Ũ¤¥{fÒ‡Ër…zèÉàÔÌ}±‰KK¿ªs”‡˜ÖÛæŠí�‹‡ðù¶ò˜ð¡t×]õþ»Ï3º)%¡3k~¨;š»JÏÎuœ˜?¹÷¦£etUøò�¤[˱,SÖ<í7¤ù(_½XÕo®- Hy×QŽÃÊ�ዻу5+€Âµ $1–$ÛkPö›똦éÿ67Þ”¿=¯æè.¼rôþ h#'"z½1ÔP2tÞsW«ù§Ãk×Ö—ö÷Ç*Žêÿó…´9Üãí‚»¶M"j¢¨U0~ãî™»„‡ÏÙW®ŽÕ²kâ¡4›ž�©(z^,õ~#¡2eÇõikÚV[ª¸§bê £ZæíùGgí:e3ka5«¥S·(i˜÷NíHÑY�$!8Š€X£‡Ó5 Âòÿ¥¼[3<ΗXH…¡€atB8Ö­]¦Ícû^=/ö¸ºp>}3è… ¦Ö Ò¯±Áã ©Tt#·|¼pΙO]‘ï3 bb­ I¦´á„sô*Ž:O|Þ'w±ßc3슩‹!«âMºÕò99(>2WŽX(Ç.kÚÑ ÉC{j½Ë”¯ÄŒù]¾×wv­¹kRèÿÆ9DÑVÒ‚±æRÓÛ¿Ç/2éÒIn�-•RÜ5+©‚êÖ˜Sæxµa*�䃮Zö%¾’²²KN2ÕNÙþ §E£OÙ²w\�kÛÓµí‡s©âot^P©½Y®$ÆýϨ£J3»>²y ¯IËÒ –,ÉÉ…ì}oyµc¦ª6�ª3p� o¼°èé\³XÇwÜ¡†“Ç?<`]|s¯ÇÅÒHìêÞ:VR®©,ùŸýYDi‰Í ø2u¢VºY},7ªóåú8Åý66„cö¾ /0-D(¶ ¿ÞãF›í˜£Ì��Ú_ŸñìvkF� :Œ°ï\Oú2é%ç_ó@œ½ ‰{ÖÞ"ñœ�Ð|NÄAÏøZ½ÌülÝø­Ù®œKe†—|˜1³Y}ý4³çµ±fŒü°$\išk²ˆ5[U ì~Îñî•jÛ‚Ü>}-Ú’çØD “Ê =¬?çñDˆÑ¶Aó„Iñ•õâ‡-ìy5 €‡zÇø¤lhÕaÕ†F$빊bÃÍÀ%!Œ’Q:ÕÈ·�qp9‰p][9붘]pV{4ÂÕªöqú‘j±ŽÐˆK_”äA½�*~  ‹a1`®Ñ[CÂF • åãQr“ù‘‹VÉÊ,Dèº2…‡J…8 ˜SÄ»èñ�EKƒ8J—º2t_Î�Ч ž×öQ€ó™O®�-Òz¸žCµ©vÔ<‡l 4'@@m¦Ô�vâðþ�¸·eª=ˆne”zµãmm>"žîš™dz“È9i•Â…%*<Ûæ»›ä¡« æ©2þ94öYô”7u•®�*xou‰¼Ì„�ñ†hËj”ϹuÛ#‚Õ)KøãK+u†â"‰ìà´,)‡¤Û,/Y«YöDêÏSåEY†ŸyGˆ¨˼ 4IKñŸ?òC„ODr�Í“Ÿú3#ÚôOuo_Ç˶óÞ©Ôþw,{·ÿê¾Ý ¿`½¯0¸§ÙQ�wÜ|ŠØ¢ ªY±E|Ž[F×'F]ö³†çòˆƒÂߊ6Žã¥êО:v}‹* ^X:mŸåeÕ«JH°XèkIvŒÆ¶=cû)¦ŽkG/’ ¾Ð'-˜e Rs÷.OK²ŸÛÐúºå>˜ËÆHKïb�Smkrr˲,óXñÆ‚’ƒ@,½,±å¥xv;4µ§1·çØ*Qž#?ö]Z}Që”÷&¬æ4fi'&ßþ©Êl€œ4—56Nt¹=êˬ?_�¤”Q‚ã8Ç£´÷l³¯±ùVZ€£Ñît9wÊA0hðá¿/øEû_©%—ëù8nÉäÏôuý|– =Þ³ßMåë!šÞ¹.#Ü,º9o!%û»|TÙ±‡N'³%Uåªîk§Ç6Iò5äƒØˆ6ulàRôà Qi…ÅUï÷¨XO ζ¾13n<ÔåŽ/¼½o^Þ8¾G¡ÇWzÕ'Ðt‰ë<¤\Vˈz¯f&·/Êdœâz®ÏÚXXæ@综K¿$ÂtiH,ƒYÔ§ßù…ŒTÆt{)W4a9ÅÐ È”:“~z· ©Ëfó¿öOÝ—Ýñu5Œ!¶NÃèþEÛ�WÈÊ ûYûö…ÕXÔ:ˆZQiËÃ5Aòƒ¨Ds�)JþIAä1L·NpôÒp5E±!ÅÿíŽ ÎÓ‰,An쾬¤…äõ`Nùâ�Õ¶½óti2¾NÍìa˜P OLÕš4bû÷¢ÞëmÎO­+6‘ò±3ýusGÊçU /‰!)ÅeEV�@ƒ5£|¥øôõÁ«ó/�_ªC-ŸoXàp±|you·?|µy´EŒÛ.‹„2&›•X°Œ%ÿü½çJ]¼´¨µ\ Œñ, Ššå‚ÿÈÓc¥~ö´túõ3g¾¦t ©Ijs΃Û[~ꪵ_S*�_sû>7¼÷U@“ 丫-Ü[Uóqc÷8ç³u OÌÏ6ü�Æ�+qWâ RvE OïM`u©„EÎðÎvõƒµÊñ%H ¼ö¬’ž¾Cql¢û"°—âŸÜá)Ñi¥æÿtÔvi*D=ë�au„ÒßH¾ÅÙjÕG9GœO¾$³FßÜϹޠÿ„�÷§7¹€�®X!Šùþ4'Ï«lnõ·îî5–=¯uöL°qêÀÔ]W«¯+?‚’ú1Rº=or^+ÛoûEmÁ ïo†uPñ~³”Jgêþ§ÂO\ß\Ù®iE²3¯ªûÆO^xÞ¨ ®òb†RÒf;²‘KÜ  À+…ÔðØ’ŒñvÚÇv~”ù”tAí_…½°ñÁlpušoQïù?)"›³HC+° ÕÓÒ3Hî�$“Ni@—rÖ_ÉÆ+3ˆ‚mÉ4“`G W‘V«½èwã¢* �ÃÌJ|švEBDaZÔô![=ªzj*r“HiZߥ•Á%»Nq€,£ý)¥ÝoS! ÀmÉËâ7ÝÀl�ù•žO�}6›¡uU%Ú²e²("ùó¦o¾ßàNöSœV–¢Á°@x÷ä{&ºu3:#øO õ,*¹ß TnC§S�1¦-ÃÏͳY†ÂÄ@I·,²»â„nÈ ¯·±æƒcöѵȰ×Ⱥ�›�z.‹¯×w™?ø/çÉŪW‹ª¾ÂšÀ@â­@É{ìö⹯ö-p=k^¿ªÿ² Ãßt\`ç PY%Uɱ´¢Ù|3…#Üdެjá"ø·£# 5*_ɧéILÝ!ë!äq]º)I©eè óÖ…÷¾«%矷l[9bÞu¨‰º–Ÿîóç~#¨Ñ1¨Ó²ôÙ6ÂÏ@fœpu¼MKùÇpa~6à–8l ûÈjÊ»rŠ–ƒx¶Û.„KpŽ÷ /ÇÃxnÚ ¶VйuÇ7�—žz_y*èé®ìå¾´ †ÓìH$9äWp«øÞñ+ ú"öe%Ó§KBÕO;¦ ß‘ï˜ƪs(½Ë¡Ëú)ž—86[§rÖ¦s6L,©Näª: ÓõpŒWäA_ÂJ'TlÙõe*À™´ŸnF½]xÝ~Î7º™NÁÐUŠ*Sž³œˆ‚š.´¸{6EJ—ײ×Å+Kq-Ez²=•î½^ô]T^p_š ®�zâËŠò`B?ÊKïêÃÁÈÎKe'™Ùoý~�ý+tsPçì+ Üõ�{äÜ)�[zû–‘�Ál[|âN('_döÍÞxºß˜ÖøÌ”�’í,€gµBó‰#™ü¨~òŠSOVJíWNéknÝ×¢-‡Rј¸D;õ>§ô–sÁ¯Ü\ùB_ðUûÒ�y÷÷, ~-Ÿ\ƒW�’Ò›æ&±%c)'ÿ°ók’¹8û¹�u¶êo†eˆÒ[„xŸ|Ð?I[áµíÒòûŒÊÖ×òõ�õYúŠªJæ#n ÛÖ°†¿C•zWó/)Ÿ¦«Ð ×Y`á“Åso{ÝÕöãhÛ{Á o«µòz¥pUq�j,‚(ñoøöТlNºl¢ÆHøÊ•ioy£jÀKþ•ëëÊq"±¨u*&„…âãøë4ÙC³nÔ²»v~@ñ9 ²��A;ÆŒ‚I‹7³†­yÈ(Œöæj ©QþN”ƒz±’aªð’Ô“NÝôßUµ¿“Ÿ–ïsØ´y”•^ØÞ¼Ã´°9-piw™�Š”äW,at?òÇÑêñ8ë]_‰–¹Ã©Ò½·~Š|\wë:ó zmù/Ëu‰÷¨^R…¹ñ´€B‘SMsNè›ÿ!íáWè*¢6%ÇjÇß[ѱ\Ñú¾úëU�°ÇÏ27IWg†ýBœ&éüpE°WŠÏk±þ“W«®5ȰԈϥߵ§=j³Ó›HwzÅË<“x¯Vói@¯ØB0 ñ¾#ìßúª"*]|ëì…�gê–ª»Èek`·¿ÂPºíkxðlÓA?[¯‘U»E …GE\’) eÔ΋ä³g^_™tSQVl`… ÝÞ²" ¼Žÿ¼1¬Ü”'Ž3)-ë-Pu„ÙóJ²¥Öå©mß]e Öƒ-$ëe3èÑXZ'óâ†ïù/%Gü÷â•ãÏ.OBwfÅAGÇpŒ5HÖçUŸi Ÿt­(õãýòíĺ��½‹À^ˆ•Ò…:AÓ«ŠGïÇ~¨bä<Æ¢7ë;Ö:¾›Ìâ!ü:ú€÷ÑJþj�u±5äÞ*º2°Z0Ã40%Œlh¯–Ó×å$ÐÿƒÊŒÇ¯¯«ëIþ*½·4TOŠ`kgR•Õ¸IâSZŸò‹k„"¸êµÍ|ÿo��Ù)‚çe¤.Cjk׊­\ùëÕ”ÌU5rÖ[K#<º˜UdÖÚ*“b Fš £!žg˜º0‚šJSÜü³ ýÌÆû%$¬Dnê×Pûým䨳Ǿ›Ù0G§¢Ä{‚÷ÄÏ7½¼!ŒÕ$¯KâÏÎCF=¹Aì�Ú±µ›’u‘/_ÖÈÉõ÷,J1ŒP½R‰jk]#n +2¤™=Œì‹ÍØ×út¯¾7ãuƒ«åÉ0óº•}±:AóÙmo æ”m¨-w0�Qðv¯2îôu´ú¶ÿëNòΞú¯Õ=J(Ñ—Ë0Ú5¬óš_æVÐ?-åà«÷ïù ô·¥âîªgÎ�ß[{;bÛ&Gýº ?Ø?>XË¥5¾-ù+=d^F%_ÕÚãŠ`*œ?�—®5­ÕU4‹é'Õ)Þ5ýàsíCU×ó ÂõkûåúXv_DãÆqL[æ4Rúþ7²8ŒˆR"—éS„�ÜΠ¾¯‘PÈÝ9sEÓ� g#Ÿ |püÒ�c¤�Þ›1g8Íò ¾D‚óiÚkO˲‡-Î0³Ð®¦°e´œuÇÍìué++*”Û.†ïŒb­ä±¾‚�ò1ãŽu¼²Æ……j+ý‡¸ÑÐÒã˜åÊT=﮺ŠÖ÷¯ WIÚÂ0€°qåEÍЂý'�ÖW@¤�Ut¤Cå›%Ö‘ûÔòÏ7¨ÃN ØÈìò,hßnIîL˜Ã?¥ørß—úÃð<ï´ÿYÚ,…î)Ö6¾õî •±5kå " Q‰ÎcÚ”w®a<Åxdà~ÂØI­�ê-’ ÊÞÚ˱tŠö(eÀƒ$òVãÌ�¾8I4TÖ-&½~ë1è+D Ñw6¹„ßÝ_®ä‘­¢ ,xº~©¶õfg™¢:0ó u€–´"à®â¸‹ã÷ØrºâðSüN£ Ì£å5Z¨ a‡Qµu§?Ϧæ25¿1ÊË.§¸œ\;c‡È{D »á}Ð7—TîÝaAÙÙ‚Rî:Å>µ¿MѲ”R¢ø¥‹a'¶ØW)�_Í5^˜1ë–öü6Yö»Œ]ÛõÊÿ¿b¨)›š„{Ë)悎úª«¶]’~=2ù �AfšßP1ÃX`SO`”$S©ïã^Êl)–ÆjèöRÒÿUÕWv~03G$Ä0·Å*yÚ/[ Ÿ>­m‡î—ñfïYÆ«‹]O[*ê`kˆ¨'Öc w4CrP «ß"´µ(ø¡×æ¶ñ¶ìàB˜Cv‘æl 8óœÍÊ9ì³´°$ œÞ󟶼Ї¼lq3 ÄÂéøî ®ðº.Ãè•éÏ,+¦;ûÀ¥éÈåçoêªÀ(Ø…©¡BTc³ê.;Uka¤÷"O]íÖ.ܬ{ß¾™JÿØø°ù[wGy¼!Nù7D°k¬RÔõ°Z¼Ÿl³AÓŽ"cjD{6MJÛ‹Èé­�œ &þÉ›?éå{zF-î{r­=””„—Mg“1jDP9¨a�É4e-ï¹:öåtåÍÇ·¢¢HæŸ(�Ì[©¶xÙ([¶¨š±ý7œU<©/�Wc*,ädW+±@HÁãdM=ÂÎuâ:‚ó~ sb:¯'–¥´ÚCt,4á¡�h®Iï³^òpRÑ7°¥ù9e—Ô¨¦º°ÍJ¯½:œ¦M¼ ¥:tÏÚÕñÉâ©}\7ýÃ/sªñ•öÝü=wÈ_ü¦Æ_m`ß?/OË¡cäW±ò1eòÇY_¿O �_všˆ|±~ !�J[tgÎRÜ$±ð¯=ÑÓ?Þ6w– ïkó/’…•Ê1ž�¢2±S(F8þXpåÉ_Ç Òú €ÀwŠ¡¶Èó£¨ÉRÜf3Ì;ÿÆèÓl㕽É£ºÑÖŒâ �Ìw›hŽÊò Å�SïL†Rt«dPlgßég!è¦nÙ ˆ&_PI+ö=° Ÿç"¤t~Gè‚ Ü!'í?‚è‚5†¶×­ò™‰Ÿ‰Û%~¿©Uÿdˆ�ȼÁȇ¯çðÿhN—‹þçRk ËäÕ2ò>ú�rÙù×ë´Î*óoùöaÁ{ºÓ >^�{7ûy*> rWבNêËñãciuüy·é�hñ^3ÞJŽ€T„Ðõ¬V~P€ßÎØ®}ºëªŒVEéB_2ÓÙ1®¾žHœ¶Å†™ÜµýË|ö‘j(‚s8ìjñ«—éF#zÉîcÐ’£á2tÚÞÓïƒüèî�Ø“ef["þ•pJ�fö,+—”´SÔÿ#æûíVŸ±—ÙW}pk¶›Ù‘Y•aϧJÙÝí⮋©Ï(Åø°·´®6Š£*ØkWoP`‹°ógC”ìòmËïö�˜Òm¹ÅP­Xs+a?>oŒõïˆHX8Sàì÷Þ²‹î%Ó•$Âõmžèº_Ò½‚kÓ@…ÈÅHzöí…# —ya~5ýf‹êÿ¿Ÿ’Á d†Ñ´Ê�¯[VëmMZÒÛT¶Õÿ¶ªÿoùÌÒI!©™a•cIšT0¢&$i$1QŒ¢K4È�¤Q¦%ˆa$T€ÄDLQ¢R$?¶­U¿¾µl¶×ûu­zÛ]¶Ö¯ý{mÛ[k6ªÿn¶ªµZÿ¾Û_ê€Oøïû(ÿ0Ì¿æ£YÝ�ûU̺£8…wuä¸,î®®î®eDÊ“,¤L«ÊKW…XÁrK–0DH`°ÆTÀe—–I+0ÂJ4ªÌÊÀUx0îæU•CÀYWˆ‰ˆTXewvy-—%!Ë,²U¥„+K:0YehV†Wꄹº‡˜à¢É–™e‰v†‰rU\,@–0äAeDª‚àÉV¬bX:ļ¤Ä:ˆxeUi‡!Ã,<à d…*ªC‘3Ý‹³+ L,e‰iei ìÍ$¬®XB(’Ð� Ép`̺30wˆ D»2ª± YÝœˆxr¥ÙÔ1ÂÜC«8P²ð]Á˜f0ʬí&\IJ;¥`³"¤ÅX±‰X…‚U ….]˘˜råZ%ˆb¥Ì‰ƒaA!Ä2³ XV‰„-*ì\+ˉ‡Hp¤J¨ ¨¤¹–T‡•wÊ`1,QC+«á]�™^ijË3,v*¬!d̬+«DC‚ìå€US+K"¨Ugi0° �ÊÜ9ihÎ%b‡%e”2ÁaZJ•Ä340±°Î«ƒ9€îÌJ´+’U• Â¨erªÓ.H�3P»4˜+2ÒX‰Và•†a @2®È$¢ª²ª°–áJ™UX–„�B± I‚`(!Æ «3¬u(Kƒ""`)Y*°Re %ˆTˆ•rîêìX*¬‚¹%V Ä(„`eœbD<- ÐêÂI¬ ³LÀh\À€¥YÝØ¨œ³8eyw— U¥æ J«º°’eXÂ…)@“+à†…•f‡w•X…fb¥]CÆu ÌJÉ‚!ÔËI—0ð© Œ«‚ŒB—US,°Uu 1Ád vI2¥™ç÷“Þ}÷ÏßÏ{êÿ�É$2h“ ’ŠHbi7µjßÛUµ~Ú«ûÖÖÛûVµ¯÷ÚÛÿæÚ­ª›Z¯ï·«em­ÿ•ªªÿ¶Úµ¶­?†4@Q’,Sj(²• $ÓŒ‹L¤¡¦¢ Õkÿ+j­µëmkkkþmº­jÖ»VÛZ¥«[VmU¶ëjݵª­Û[mWm­·[[mºÛV®Ö×VÕ[{UiU­µ^­®ªªêÚÛfÚÛüõ­þËZ×õµ¶·k[5U«ù¶Õm¶¿¶«R­ª­_òÿwõÿ»þ/8oºòž¥áïéåûåÇ~7×¼�/>÷|—v/?:}ó£ïßy_9ùÇ’–çϾáëµùß¾½×q^^W¿w=ÜwkáÞíÒ¼«·»œ÷Ýzû»�ç×ܾî/óÛUjνwwk”g_λßÎë{>žó_{ÝîËïnxÜî÷ºçÝïnC¸ç{ÞÆç½º÷¾¾Ý>×wEq>sÙysz÷=ÌÇ7Oºø–ô‘ÝÓ—$?ÙÜ÷uÇî¿{³ øwïo?w¿>¾ýû»Þóîêúé�óžåõë·å|÷îº�뤾{øºûŽeÜ=Ü¿‹¿�ùNç¿=ï¼=yûË÷ynî…û£\½»ž¾î™7»´»�É;Šïº¿Oï­kþZ­¿Êµ­Ö¶jµ5­­mÇm¯ôÛm_ÖÕ¥mµmþšÛWýµjßÿö«oZ­­Ú­«ý•µüÖÚ¿ç[U}­­_×ú¡„ÐÀI¢)&k,–‹F�‹%��2 ÄŒ´“e!4ÄD”�"PFe™”P˜±m²(jŤ€"…"1S$ؤь͂,¤˜,FKF#i"" Ù(0T…�šõ¶ÞµkVíúk#TÊ�Š1h¨Ø´QhÐX¶#QEŒ›f± Qb4U½­mþí¯¶Û[ükm¿–Ú¿­µµêªÕþU®Ûm}kVÖÿJÚZÛmþZµn­_áµJÚõ¶®­¶kU™ D@�gû™€êÌ´(°nPv©rÂË ¦J€¦YI.GŒ 2ÌISYC‰U˜bÀª�TÅV«ÏK•”•`Q‰ AW*ªd£’娩 ª ¨Š«UC<4ÑE ¢Ë+C–RÊ »š0a¯B°E(«E%žˆâ­€Áè€L€ˆÿ [Z×úkVßçVÕ¾µ·ûv«ý»U·þ�¯ªÕ¶ßïµ­*Ö¶½·ýÖÕ{Z¶ûUµÆÛ[öÛU…­µkùUT­mlÕVTÛ[Mm¶UT­¶³Uµ-jÕ¿Ò¶Ú¶mµ«5¶¦­¶µ_úÐÿ†æ¿Ï¸îÿ§]ç ç.ûÛ¡w·�îàæç/ysÝç{·û¤w!QË3 ÁC2—vgvVWPÅB†.UÍÜîn>íïurç—,îïqÝÝÝÒ÷wÎß\îû¸íÝ—½÷{Ê.[‰wÏ^dÞö÷‘·žLR÷�x»ÞÅæ.÷D÷<ïžyß\õÏnç3¸îåÎîÇuݽ÷kïw/æ­[öÕ_ÚÖµþ;JÛomVÝ·jÖªT­­[{j¯òÕ«vÛUªþõj·ùmT«jÙkm-­6¶¥«UÿZ¿«UµºÖ¶ªõ­›U¬Ú§d‘1Š6�¤˜b ØÁ`¢2E@ÃS#EŠ’¢ M€�"–‚ŒX´�E‘%&–�˜ÔmE£dµÛU·Õ¶Ûoñ«þ{kkªÿ~¶ý[]mª¬ÖÚ½­µu[~Úÿß¶Õ]­¯«j¯ëjª³j•+üѬmQª‹E¨­±�jýV­©RÛUšªêÚ®Õ«-­µ¯ð¶×Û[mWúþ¿Çü®¹Ê¿ž’äíï½ú÷_¾íæ¯}ÔýÛÝõÞ6ñÝôåút6~÷¾~É÷~Rî9~û×·½ÝÝy~rùo¾w›w»Weûº¾óµórù{ï{^EÈÚ¹ãß}ö?-Ï~ïÊár÷}ï{�׿uö/t|.oÊò¾wïÊÊLB3†P*ˆe" Dê €D*/t÷½£uû¯<»Ýy¾wëªüÕîû÷ÁIR ;¨£¤3,2ò«(V…ª®¥™ß_~ãyîëîìoÍwuËåæõî-÷uI÷~]ï»Õù¾÷ï^o+½Ýzê{­ó}(ËÝ\/œÓî‹›Ý×—Ýïϼ¯+—ïºÇî}íï{ך�Îîý×{ŸŸyß=;»›Î{Þö#Ë—Ë÷¾žòß{¿+ò»ßzù¹¿/„•!TA@’€C© aœ Ì­ ÕÈ'sÓÏ›–Þr{ŠïuËš½ëžï¾íóc~ož suúî{÷[æ÷³¯—–yÞ÷}??{¾[ÎooÛ¯}ö­kûZÖ¿kmJ­oåµ_m6ßËm½ZÛú­­²­[zÛ_Êßãýv×6¶ç-Z¹�k›b®V¹TV ËjåTk‹\«rÜÛ5­·mµëZµýõk^Ö«}mûmmö«W­«fµmÕ¶­Ö¶×Tµ­-kU6Ö¥m6ÖÖëmZ¾ä¦&¿ã–èF÷w+“Ý\{·Q—w3Ýp×6æ$c—kËp÷]5'¹Ýb'�îä”»ÝÞ®�9taÅuïo{t÷\y]ÝÍ×K½4o5zrò÷¹çºxë´¹×�ŠI;¹\äåp›Ë•Îo=›Þחª9qs‡{Õxç{»sºîj<䋺9K¹Ý¢Nt�5w»š:ËßÖµ[úÚmWúêÕ¿UUí¶ªþö­jºßÝ¢ØÔjÅ[j*ÆŠµýjÛUÖÚ¿µmU·ýÖÕ_ã‡/ s» ®nï{Ïîíĺ——^»®Dæ‰uÒî»0KºìåÍWמó’Ñ+»›Þ縥×Üâ^^ls×�;Šâ÷nöãÞëÝ;®¹ÞëÈ’ïy:÷¯väÄww3®ns›—.s8í;ºr÷wˆÝÝç½t¹ÝÝ{Þ=ÏyÉïs»º\Û©¤L78'¤ëÝï]w%×#t:îç;½Õé˨ðæçxv‰y¹yÕãºGuÎe{»Üs(\{ÞéµÏsžëÎnôwNW]×wuÝœîî½îzêåË�ÎéqÓÎî×p#¿�tм�»wÝNó÷Ýãï^K�9ÏnÜ�%yïwÞ»9Øòù¼Âcžçs½Îºxî§©îöõN]Fçp¾õÉﻓØ-ÞãçÓ|ûÝîêîé.nã³½üwÓÝï}ì~ûÞçÈ÷pî;º{Ž÷vt×½Þ8:1{ÝÞ÷¹wËïo¥ì÷{ÛÝÇ—·:矗§¾è®÷žÝë½îüõóŸ;Ë’t÷½ß{ïwÜöo»¥óïÝÏ}w:×ws»]Ý’+Žîï˽çwïoÞîîrçs�žyÝÝ뻼޿'ÞúûÎî³ï}õrgÑ#§Þñ{›ÞûîëåÞ—·óºò3îýû÷ï—;—OÎyç½ww^‘ÞÜ÷yçâçÏçï¯{Ýyr~ë‹õß2=ëÇžýïçÛ¾îÜç]Îno»¯s‹÷®¼Ž÷>îù÷§Ý|ó¹ÝÝ^ßž½‡Çw;×o�÷>¼áÏ9¾ï|ù8G˜®ë¼»ì}ß/Ÿ'½Þ;½÷¯¾Ü½Ý¼wsûmµýmZ¦«û[VêÕ»j¬µ³Ui¶ÓUn¶Öíµ]µM¥Z·k[­m¥m·m·ZÛn¶©¶Õ]­«]Z×kZÛ¶ÚÚ»mµ-¶UÕ«[¶ÖÝ©ªÚ•¶ÖþZÖ–ÚÝ­¶P‘HÁŒšSE„HŒ€Í£¶ÖÿmM®ÚÚi(Ñ2‰€‘ fÄ‘�€L+WÛmum²¶Õvµi[}ªÚ•mk+{mm[kkûík]­¶ßͶõµªúÛêÛk}UWÚÚö¯­j×µV½­[}[[o«köª¶[jíª·Û[Tµ³Uµ{j¯mªõUWój¯µ¶·óomU¼‰‚XÄûZݶگ¶ÚûZÛµ­{Z­ýõªÞÕ©kVþÂL”˜ lj1„0ˆF„�ukWòÛJµi­múÛoëV¯mµíªšÕ·Õµý«kmúÕ¶þõµíj·Vϸè¸äŽìÜÈÂ9Ü»»N×:î¡×s¹w9w.dt9wK¤»¥teÑ’âe:w5Ì&—$:�Îî룮ÝÝØë¹�.s:îíÝÑ»ºw]×.9ÝU­KjòfZ3ÝØçwu —we™»¹t×H&FBÆe%ÝÓ1Ý®dhîêåÌwn!Î"’ – Îîà¢3»‹»˜w\ÐîÝ»©×nr\ê&`†4dDçL;¹—væî®"æá »ƒwc·w Y™Û…;¸Ð $’’!Ý9܇qÌ¢ÝÓs�8Ås¹Ñ)42p¹$$I&G5ÙHÌ]ÝË—s¸5ÝÉ�îîv™™’0F�w]KºìwHÐX›BˆN»´Q#I9s £×*#;¹&b\éÝÁ†IÎUݺڿ¶Ê¾Ö·ÛmlÕ­-m¯µ­ý£éÝ÷¼þý¸ßÇn\ÐNp†¹Ä�ÎyÏ.¾ï{¥ûº÷\‡ç`ÄÈÂyÎýëÒyy=ÔŸ;ï{Å+ߺ¼ßœur¾í秺¼½‹ó¡ç—¯w)‰Î·½ëßœ}õÞ×ߺüû÷»ÝîÞ¦îá?wgæ¿{®sò¹ {¹¤K÷_½Á/w~|ß¾û½Ï^ûÕïwywçï]ùºyÓ=×îï÷ݼ÷sï}÷ÝÕÃ_»¬ÆçyܸHùßwwÏÝ:¿z¹£®ìgÞ÷Ëäy¯œ¼åËåÔ›ÒûÕÌçlîùzîíùyïÝòï»õûz{æù^>î~îÒ[çJýߦõÝÍåÏ;ºæŸ>^mç—‡.ýÜ~í?u½wGG~õí÷sû»]ßz¹Ÿ}ïcååä˜Ënîè¢wn|íç4Ww½ïo^舞› =ÜóÎoùÌîê_;wu>çî¾ysçîïw#{ïx�¾|¯Jûº=� NuôÜ2%î»s óÝÕ×o_}ûܨ„di÷n„™|à„½Ý¿s®†Kœó¢Qvdßuï»é“îåúý÷¾FÃ,Í?u粜éΜãºòðÞû¤·‹îë/»„æ»N¼îîgtvË–îéë¹{º.î·}íïs·R•ùßvèý÷¯^]ùs î»÷¯{#ß{Ëî»s¨÷]û¯žÜäF¯œ‹ò¸W˦b–îÝåõî¼¼ò}îûêé$>ä}éîowÞ¯½Ž{®…÷Ý»Ý�¯uÒ~uÎÉžã|ûãv÷iÝ]Ý~w;ȧÎß}Ù>rºWR{·K÷vG»‰}û¯¾í}÷ï�"]ÕˆbI%Y™”•uPîX2�ŽÄ¢ûî¯{‚ã÷k¿véæ÷ï¯;ÞñF�wk¯Òóß]q/;$ºwË·½Ùîü½î×/‡«Îß<«ß=û¾²'ºû×Ýyåôùåîè{®>íÝ.̺ã¥ùÞoÞïÊæ=Ýs‚HZwÞ÷Ÿ{vð¾÷)=ß<Ÿ.ËË’IQ Kßw¸s{º>÷o?w?.‰2wwuÚ¿~î÷Þß{‰î¯—³}woΙçå{—/ºäÑ÷u÷½ëÍÉo.N\=Þüú{½Ý÷n¡.tîvº=Ü+Ê}Þå×åùù}÷½|øŸ—Þä%÷vy{½ïºëòwžn}×½ (ò÷¯wx¼åîìÏ.yÝ\ç»Þ{·R0Qû»+îèÐ7×n½ÕÖî»|ï”îåf£îºÏß{åûÞõø Hîó\ŒocîùèFMËrç47μùé‡ÝÞ½ç¸%~ýÚ÷ïÝ鉮»�>Äs¹v4_>^ßwk�~û¼ûÝ\ï]î÷uã9ߺæD\ãîèS"÷}îw]×ËzgÜï/Eîè×:y}mµSZ¶þ¶®Û¶ÕY¶Õ^Õ[¶«¶ª¥­µüµ­v«WVÚmjÛûíµWmT¶ªº·êÚ¯klµKmÚÖ´ÖÞ­¿½¶ÛomUÚ­«ù­µ«ûÕíµV¿··÷rîîW]rîºtç;®îéÝW3ˆtc·)\wrrrîî¢îÝcºèqÑ;ºw)Çnn¹ÅÈë‹�Ò\³®:î¹¹‰fë³®nŽíÎuÝÒî»w]ÝÝuÔíÝÊç'wuÛ¹w %Î»»�s’çf2�œ¹wn¸qÝÓ²ìWtíÕΜçtë»uÎîîíÁÝwš\ë»®;—wEË�NvHÓD¨�GõZÛÂØÑ2‹�*„¢Ä‚ÒU­¯ïöû$š2Óns\¹¦˜×wccE2w\“œÜ·4š™fîÅs™ÝËš ºçNì’d Ð2ÝÝnv'uPiLsQÑ]ÙÝwpˆ¤Ñ�;µË–æNsË\®nÓ lI.‘]Ü1—+…™ˆÀØAŽ]"(Š#F‰,l¹ÚR   Ý79»¸‚‹–ìMÝÙ*39&íÅÎî¹nÄF–J&I3¦DbŽw8®îÜÜæõµoÕ­6ým©m¿Wôµò®X6¢�¢Á‹\Û›r‡v5Ü®l¢æåŠ™ET[sW5Žî�¹\ÆMDT2®jìÄnjs¬»«b(ÕÍp+®sIŠ‹F°FƱEX´`Ú»º4jç5s¨5ÍÊw®b��¹ÊÇ7)Ý·,š ¢£ܭû¶§v¹\ÑÌ–ç75s›•¹Ê"ŽZ汋wnIlm%�bܳ®¨¨Å£QÎF®îKb¹µsQ±hÔ™6æÝ×s;¶ä‘¢Ø¢ÅÝW9ÓQEÎmîíW7*çõkZþ­–ÚÚ½¶´­¶·Õj×Úµ¦µ·«j¥¶Í«­«-²µ¥mRÖÚíZ•µKô¬…(ÐQIHŒ‰RX‹$QBSIQ¨£6¢S "4HcDi ÆÑ’#&ÑQ‘¤Q¢´hѤ£cbÉcF�°›mm¾ÕËEX­­íkn­­¬­_ÞÖµ^¶µºÖ´ÖÕJÚÛu‚&" €" D Ÿé¿à×úþGúD�ûgüÈRó†­âÊ™¬þ¿x?û�ĵ0X|³¾Ò±(´MÊ»Ñ\ u®�Ýÿ„ôѰœ¬`yyS0&�'þúÆRO©¤á˜ØZ•94®¼Œsς͹š¬‹d3 ”µ›¦Ã%3´]C©&ùSUà3ùýïuð»F‡´Úƒ „ý-0Ú]�—¥«V·¯d ¬qÁcòDb£Îo+ w^’9XÛÎI4{X] ÁÃ5Ü–Ç×#öj÷ÉZû´'yŽØ]ê hÔÊTè‘cÊ)„ ÞObˆyåË�-­b²±e[ 8æf¸Càt:ÁLáÃzk§gJƒ>2±y‰4�‹æ7È÷0m�H² °›-ÊûI¨!pº‚O€«'—eÈâ-v1š7Í GT žåEž#þ2»§t•�qg,rø=—˜Ç�B×\Leð6EØO„»¶yŠgšŸ %È™FµItŽà�½\©ß 5s›Ž­»Ñ%�TÕV·—i2꘦ŠÕ;,åv**JpTí•NCU·Fä³ÝuŠã�µaFB v¹¾ÿù½o-a‰�¸Èƒj÷=^uÜç[Ž¡Ã…�4ÜÐF©êõKNU[‡Ä{Z´º÷eÛl˜žkS()²ƒSîÂU¯d®‰Íìæ§ ŽE-Þìë ©×Yl‰8q�ž5DÈ‘ EŽ�0Ȫ¦×sî5Ö¬.q8¶'¯‘—!gmšîÐV)‹»ð€ ‹ ÁpSK™qþ˜£”G°�h¬‚â˜q5´-‡ ƒBwâ·¬N嬠nø{+Rg¶r³¨žMlI.c·¯d§Uµ¹©”–Äô;Õiòó/š� E±—&Å>\]­J¾»êÁ:kíîiÈsÖéÔ�K¯Ñ_o,¹áN°Ð¶EÍ�¼¢äöi³ã℘í®f#Žy¸É¯h¢‹¥†²®¤h¾†¸êiðaV¢¢›Á!i8«¹ÝÏõÄ7�*èòÇ鳈kWFUe)Þ1[Ä5[ D³ºY˜[‹rÜê´¦ôN‡ÉexVƒÈ%®öÉÚ:hkŘódæÙ&U;ÊwŽp/˜‚4.yÃn]ÛÛ ,.ALÝ.}ÊOX‰àÎ �«_Ä+Hý°¹Žji;·:Ö/Ÿ‰kiP"@"&Ð" ýœ³áu îWÔñ5ÍØÏŠM†±ü¯g¤sܹ¹bÈ‚Œ›V7"¸2l‘·Å¨æ0ºø™t¢Rº9 éï}+Ö3‘YÃÀ­~Þ�Ý 7r]¥ÁÂÑ î¹5c‹âäò“ù«;¹ Oõô¬.þS¾½‡õ±ÑÐÝ M2G¸P0°¸–Éç,±Ú«Õ}뺛Þ?Ý´•=™Ú×—A²�JØÐ™ƒCù­MêÖž¡+gbqãhsý'“ç02oŒbͳ^’_G<ÉÑžÖÏge4|f™[)x¶}ŽÉÙ¾Ÿ'CuŒ‡§±Œ¥qm—§z$ð�>$hP+Þ7ñsnfb² ßè±÷%L–@}›XæË¬Ð±y˜O3žZzr™s$­-=&"S³Ë>.¡É. "ÎsË%N"™\à˜ø*‘�¡$b�θó!�¥ þFeô'Öo :6«èl÷ìÜ0"„Ø®lK¨Ð Ý(‰Àò“–71¿uäd%Ù/“D2[í»:‹�þO® È"E¯(& B¬ØaÜfMü‰�ïÈ1z¡5#Rû*ƒÂöXv'8 %Q•Tõ–eí4„kµ™Xññ –eo§@›(ƒ €∹”IDô„(T OÄ bd¥¤ˆœ OˆD(˜!ýP§Ø×J÷ì5wšÄê=¿§úè5†íÎïT˜¶¡ÁÒtÖ�¹+?%›×ËaÜnÃm;‹`¾,�ÞÌÃpÛC”`NæÃ%ÝM€\2U"Ña‘`¨Q—k qÄ8N� ¾é�A½fô]‰¡B…›ØçÐMí«Ú;8ì•8ž·BÙËnT§‡ [Æ÷_zt²G’îH4¤}\L'-¢�'qS*iÖpbRi†õíëÍÏÊ^,¨B&¡ûôÝßäÏ‚fêD‹O4– ï z¿ãÕoYç=?VÒ<_£–KcÏË0Lå.9öß„¯¦ÃÀy�Ÿ]7´+ôí#’‰ ‚¶ûl sUÖn^ˆšå±ìXÊdµmö®�;´ å~Ê …�Òhž¨áx¤Q¹¢[Ý3j4’×W’S°žZöàˆµ±‡®ûTlQ¥ªMÔ_žê:=�M‘Ó§¾³‰Á0Ô—«ØGC—µ_V3Õ2ÍÍÍÍaDº(bÛ™Œ:C ìú�~¬ÕÝÀó#ù„·E„p0•89jp·©cÄ Í™ ¹®¤¦5F �#ô,HÂÆ±@f Zcj=ý„dE_½�Šê�r¶›®¨÷Ÿ~…„·“v†m`×õçK©ÊÅ5ù» aSa~ÑÍÁãz�§ C‰*‡yÞ9ú_)�B¶œƒV´÷Z`š¾ Ä<gäY{©t¢:!,ˆ,¨bª,Â?..ü�´Ûùˆr´uI2ÝØ:X¯¢ �Ò´zŠîif÷«i!åÊ»îjÔ†ù�‡½6µèzÀÕÌÖ\ó)Fû$�1‘P+Ö�Þpê-oð˜HÕë:…ìI¸C{­1 ñk…é°ÕÍÎQò7òž6•uíD‡ßMàGJyüAÉHÍ{ÁÖ„+Ñðw2êxH† HÎAÁHDÇ 2qyó8+@^öuh”½é-Åüp>°:Bø 5‰�žÉЧV1€g UZÒ`ø‡iG¯f´xðZSÞb‚µv<8)»²/íŽ&qe’Jµc»¯ÀÁ“ûy¥¸[²”;ú�¸"º•â:Ÿ*� ÞŽM3‰:­‹;�++/íîšA^†Á,ÖöªýCå µ¦¯qh,,‡Ø6ø¹öA_åØÒxN3Ä`wù\!,ÖRå6憘l~ÑmGr7¿O.ž#ú¶ �²/¼íûArØ�Nµj¢Ì×ÎéÊ­A6}ª4<=#òíÇ¥þqˆÈðM5—¯™aÉáè&ówÑ–§Ä@nãÒÜ©PVìVw^×E«Bý]«g¹›6�G!P޽—A†�£ÀÙR“‚‘Œ`�Sƒ}W_PõEy¡VA—&�ûn·£Î¼ó–v—~ÕÚÃä¼h&|ýO@ï–¢F±ó:êèër¸VïjF` ³‰Í²^òÜ6Ûç^(î !+Ð�ssßXÏT¯‰I�y7˜²Cín·»±ã:Ð+ éÓ"¢¹´Ü¯N±vh=³Š¥Á‘Ë/šÉ¸æ[à |sþÝ�ó¤LOÞÄkºWÕG';{å𦠘Sq2 žøW±pd‘‡<ÃWÙ䨄êÚNå ¯$ÉI¬§T“À)fû²�™T+xC�^É{$(‡#wDΤFï\Þà'ùM@’yÒnoŽ= x¦à’È9Ó|Œ7_É:Ÿ¼a"©¨ÇÞgæ°‚ESd3èÅw ±H±œXÕ'ÃÒÇ0¼]³p™A;ñjåñ÷èÀ@A> ÈöÞ¿�Kqž†¦¼uqzP \8¯…+Ì�‹åÆ?<²qW‘¬ ¸^÷ÝЬ¾n5ñ „\Äɘ RmµX+(�·¹~”j—NzLòÞ½ahæÇ±Cñ¯ŸúO2?Ú!O…Dýsßû¾æ°Ð¼Ú� ä�ýùâÙÏå…ƒ=iƒŸ"ºU·ÂךRÜYÁ6³¢ŒX¢y}z!WQêØßƘå5T‹ºK¥ÿ§ìŠïã×̤[•Î7mPÅ;;±�¡ZQCã`$»ñ@êxYó ½À[vaË¥Zú¥——¢?QûN•—µ¸m�fnA2q­à1wû§³ŠcLXO,’ò2}måÝw,™ò$†\×bæŒŒêŽØ|¹PçZz,0aQ-¡i ñõBÍO„¡lS£"è7rXS_‡ñÅ«=öyM°l5Ûd�ÚØG›^\/‚ÆùS¤-ö,È Rì™Ë¥Á;ªÉþïZâ�ñ8nŸ0¤¨×nÐÆ&ðΦû�TšóÓ‰+Ä*ÉÂP@šÆ‡ÜÁ�¤Üï8Vçö4ÀÖ=\�.©«H„ËçëH’b=¾p¢²{­CzÀëõÓl«¯£N9â­?µ¥�œ�¡µ.~šÖðw æx|Ðu 'ãÁÝåŽí‚¢¼Ø::ãnX ["Øk4ŒwÌØ 9R‘»}‚À«—Hø åþÈvHOS×ð g0˜¶Fé?R1µ”Y\,T"ŒÂiãTÔFVLÈ3*ú+x{ƒyà‡bú˱CIb¾æ[ÓgÞ·gè%lÛvÏòòÐ7à-b9D ¬µSvºÂy_|ACzC¶PÍÐJÇŸz0$gÊÝþO�oAĘÇÈðMêàvÁð?+œ³ªXòÿ¢2{¬�þR?pð“1ÈÞŒ!ü«E‹ØîjF�HÈGô&àè·¿šäº}U |îmºp› [ m0_>0œûIÝþ¿|»¾ \iÙª3NzH»6CñI‚iÛã‚¢ gîw;…BºÍ„$›wöߨÕj€k¾ÚTn\xÙ'•zÄà<# ÐëÕ®¼ gJ…Që>»L³X‹‹ô|×|lɧv^ô(u¿˜“ìò¨iîeÍ9±muÛŒE†ÁÂúö·”պѭ4­ÁKô\ ´ä¢dd!TDD¾œüú‡Ã®é®v¹®ÎÁ‘‚½«Çö—‚öTšxF‚ûmÔá¾ûû©+¨–nœOØÏðYl*€îýúΗèüYW†8؆C<í�»Þê]=ÜÞ ùqON}j•>Öê—­¡ ÏP×é…ì÷»ag‹w Œ®õt LSg}âÄ)“-íôß3R𨼠\€mš¾ÍƬ¬@öðà×Ù¶¾ÌЙ"Áf‚Ô³÷x•D|ˆ•XE}ÙêU €dv�­–†T&±Î~Ѿ0e`I5æ^wvT8Žñ€­ƒá,óømÃ\\v Ï€Æ.΂ث½Ûvõu÷ÙaECâó`úï†>€ïêaì2ž¦‹u>±©J­ñì_p'à÷ &×ÌI†¾'-c£IpÄ1a�˜€ÄZWæC®�+ÔefV6 Ú’ë‘Mà'öùãÐÎ ¿´'&K…ü²úä ËQOãí"³µÍ»`ö°}Ûé¢Ê{õ¦ù!ú¤%Hâ épÎÔÁß±ëq¡­C�4e’r¼ÈižÁ‹‹Ÿ¤Ñý.ÂÊï’™T†÷uý:kÙNÅ?fl·£ø T×®È<ù‘çvÃ)a.)k@hêÓN ¤ó½‰¤~:ØmqR�î‡Ðw>¨ÓÞE·NtS›Íé¸�ò~¹ð¹ÂÒ�4îÒ:›žid#[W=E-Ñà{ÉT1¸–XÐ…ÁÛUÅo@�Z'Ú^¸K­Ï—›fo!=itޝh‰®¶Ê¾'FTq‘–%²BÛž†·7 ÜsÇj[þ2*ÛëhU=ªŠ4¯¬/fQ§¾@ñÖŝРâp~®%��F-¢šÚylX%)åÉÎÄØc™<¯�:Âc¼¹S&¥tyZóßAh—Øá;.éØ yØ#¢ãw `kqŽrpJ¥–»Ü-‡qDü4¢ËY4çÚ �šì�2õËæ6|ž-ù/mê·¨¼ˆ†3¨ Øn&®ŠLÕÈP]üÛÙîM‰‰‹H»‰›´™šsí©”«Ý}uÀÝ|óuº…„L|›NÙóXÅnÜÒ³(ªÂˆ 5yÀ&,r‚CØ&}ÁÙbïU’|Eä¦/d¨kÚÉ@ì²ïb6Aôƒ�QK-)r) B­¥ÑÛ@×Kê…ïO½Ôf9ƾ*É+lƒ\C™(=88Mö¦®*BM‰1ÞU0”0PÈÖI´H>uu†ÅÄU²ØÕBÀá}Y4øp;'wÒàÜ~oaŠÞYЦ*Ét5ܳIXu“Ú$ï'-qíB_ V²Éò•¿9ñÜ$úÒͰ"tcè„{$¢Ã4=\$P–ïx_µ8Þ±ÙÞIbOmŸ¯Á=ǬOVAˆálÍP¤KqDš±î2…3ÏÈbÉtŸ½jôµ?9`Ü.Bç`ô&ÚÛÁ¢ÚgÀs«vÅØÚ8i± ëEgÙÕ((�su%|1³^RØ #{Ó¶gDj]íëbAP7“2Õ¥gtMUâg3ƒãfÐ@A‚»„fýPj ñ@‘|<±SJ(â[êÃéàk@Øà«\î;ƒ0š¹ F›#Ä ™Þ} ±>3“pÆ£Ù$Wðmã~ß�Á’];ç„’´A”? Üž�šÒÈëuåõ`á“Á¢Ê(¹‰I�Ù¼ý!d åŠâå¡`h©ìº.Aެ=G@-Ì{˜ëéä¨xAA’ %¬«ú”ÇíK˜!2˜‘¥³h�Vp"NÖg/…´‰&,$éƒÉU[‘œŽ˜Øûw†(s¯´™ÁÔÏÖü ɵ’°;& ~Ó˜„�—|-µ×Håç`�‚¾Ž.Œ3­Ã%’j˜` ­héihâ}k!¡Ê¿ rbd ¡q‰¥ÇYòè·ž4½¼rILJ¯uf…¥µÀ‰\L4ì¶¥¶›]°}À� ·›˜Q¶C“Ó–Ãv*]^#pû+q<“{ç®D ?c—1nþ$éiw£ªæ}ʨ>3 /"¢wŒÅ «ú +^äZéÖfÛJÃKNt öR¬bÍ‹2ÞFó;2ÔHÊšß¾ÒïIlÒk2Tˆ—EsØ»¬1‘…gkpif6ÉU¥fÌ;{A\Š€¡éÊô«oÕÏi¢w¹äÁ._°"3ôkm k‚$³ñýõ`QCת[`p¤Õ,…¯\í6šN¬µ6Œ#¹›IŠÌçí,9rlÌV3jj^ûBmÞz_†„Î+‰®—ã|÷S¹,/k-ݦP ¯y“Ï@`‡!† 8Á 0LY&›Ai“"X0�p=ÓlŒ¬Óä’˜ ÎYulÎS“ö×$ËQEyܼÐÕ|ˆ ºì�Éa¦^ÔdCA÷æÏ£èèß"£Œ¬¯!9%3u铈\'-BÈ[V]µéC??…¦<1ràOã<tø$ QÊŸÝ O2^í¿$Oµ½m�à‘¥È§«’\çp^kŽå‰�—*Òx3°žLTë»JàP!ÍN© ì.ªÉèA½ÃwØb…ŤƒM‚¹;ùGa ‚ºæíR) ·øÙ C�eî¨èð“"´¨Ÿ¯OCÙšõÛXæF’ý¾„ úÁQk½‰TZ„ ,È-‚%¦r5ÉÆðX”vt ¶Ik­²|†ù3;ñObÃHWü¡°RL÷d\~B}çFó_yû(Ä™@ ö´�Ü*Ö,›Ó,ÃD†c ™a {%ᑾ±w¥´¢EƒàT­k)�òýzBúÝ¡+]ˆU¾¦ã-„.V€â¥räã²´šæ‹hØ^¦ÄZˆ«0¤(ù@>ÞBS½å9Ý2¢]\ç!LÀÕc�“å¼dUX¦Õ3P*É’™TŒqßAÏ1†Ã‘Ï£ÁwÞ,\S5Ödùw>rûtv;>ëìîoŽï7úÙ˜x0,Ë¡´—¶¼ÑG{œ†ØZ…2¬VVu2»[¸÷y³§¾ Ó»ì\30ë+:3�²rʨ:Å”EòŠ9=YQC\ÓHúþhì‰]OOéù•é_"& «~,¡C/…]k:e°u£ÆÉ|aÃ=*E4F 4á v; ~I´öíj±Ô ùTxy˜Kr§p‡Åù‚Æõp—ç¥?Ζ¹Ç£yOÛ"&%UÍPãm (µ©Ö„¯nHE> • OhÀ>™¶ Ë7•LJ±}ŠNìtOq´»H¸\÷Áa8¸5ÍnHÊ`©ÖÂe›0‚˜Üïo"q�l�fDß­?‡X‰ÝûŠZ†0L’n …ñϲA›­œæy°n&e¹‹: ÔîʵaµzhÈp½ëØÛ-äaÝH’%Çí´½Y]ýbF¡Wj”äùF¼Ò’߸i<" F9z¹€×f)lµˆ«w3˜¥á{q»úŽ“Ý)ðÙËg4g¾Qól”­Ò:lÊ¿Mç;¯2D �\³ä§.^PEQý¶;6”E»Ü ¢�ÞÊ¢¾¦°§¢FÇNà¹ÜŸÖwËØ‘úKŒ/ì„Ehn'(S’B)Œà Ub¤ù}Rõ%ñÀŒÛ•ÅöÃØî›þ R§ËŽn±ê9Ò·„ý¾�ŸÐmƒ|‘yF³1Èä/òëô”͉–a,È+”JéÂc.Š’5Ø´ŠLH»AÜWP„;ÒŸmIŠf‘q¡\=Ô�l vl! o�éQE,�­ë¹‰ËëUƒaNuvÖ2Õ8ë�šøÂ—(�B|¢²,ˆ0è MŒ/ƒù§5´°|�«[7e|s¬rf#Û‡ëÅ­RÓÆ|^ø×NBÏí°•ÝÛ¦DwñÀª¨ãñH¦©qhEËž}…ÏG‚ €"i<$Ûœe56;VÆ19J³óî%ì w·&€MÃAÚ[áÍ:cW²œ°œðéÐÁ³‰Ö=ü±8®ïƒ/;­rÝVÆ®.ä.-�Z!SÖ`m 8í‘ùd2Çñ À'”FnÍѯû¥Á@«#…±‹·UhÃ%ÞÝ#äOçS­–—Zk¹wT·ºä^³Ûöè5¾CùEܲ^Ç“1D‹ƒ Ãôž[™O7ÕòºAƒoVÀÆ ¥¡h RÅ)V@qü‹ƒpB›1?îvØ1F¼Yb·.¡Û¦—J õÁaòÄ wrÔz¯VWDÏßyÓi=¦ïqãL^Z}ÊjkÇÅÓWFôS�å~ÒR–&Û×§‹g�›œYúŒ¹tgãÖAâQ$ara¡%¬ŽÞ#]*|÷÷yÌ+ZXqôÈeYô�Æå=â�úA–Ø¥�ÆÁ|cÊ� ̰˜©›WW$÷Õ“°$sÎÖú{ç.‡"AFo«I•îá|:¶ÖMD·`«‰H¶ Wgð‚ÎJí0ö¨ ‹ð Jʲ "dT{‹b/@Jí�KÁAÄŒÉJ" b8û3ÙÐù)¾…_ÇÞöø‰©Ìh{}�a·¯+þà½øœR­Ee"»ÑŒà�<”B¡IhJ³½®úRÒÏ!’l”Çíòú�‘äã„cúƒ iä}Rïo¶VpûìzÑ%õ`m’�Ôa¾FäÜŽÔŸ…»’Ó‰¯ª¿8nþÀÊ—v‚ĘMd”5´ã‘\sòž®´_^D‰éô¥óJ`t÷‘¦™Ä]ú—‘sÆ/{ÌX8|ÂŽ¡þ2I/tð 2cT—.æÔèÄøb(@�Ü¥&NCyá¨6“ÖyÅõ¥`ÅÅï+ó–)€uæRPæñÝ<ÚÍï7?//2ª1΀ήxOr>‹™l+B ÂV<ˆ¡—_Rœy—,öf®�èù6nj˜/]¨ä¼MŽ((Èësm¦j�è >o±9X²…�/µ½ž(VLÒr|†Êål®Ùûâ}— ¶ܵîo̶+s+¾¦‘ß:I„Uù<‘Yb/”èç-ø–6å27niËŽ„+MŒ°*õX»ƒÀX‘ŸèÚ;Ÿ®œðƒx,ØX€¾Ô}_�ºR³¯¶Ð¯Ó“¥æ§§ß õ-\J‘ŽÔgYÉ]ô`(ˆ¿Ïð>`åí+Ê�…É)lŠzõ1S¤qHÞn dçPqéÂë$‰÷X+ZšƒkZ“?ï;¦üY×éÔBø÷}0·€¡p‘('ÍP€£¨nõ"ÝήwdFÆvßw.08‚T-}ò|9ðý)²èX‡‹„~|˜œÄ_ëe ¯:RÐup°µe`Üõ¦RöЦãÎÝ!/š ÐA}¥hæ²yr‘¹„0úw´fÀµÌBÅË+¿_¹¾àZ°OÙI·È�*¡(àÔKë>¹¦ ­XX¡øVW?$‚QÂ=Ø pxcE6XK<¬¹EÆÊ€:Æ¢j#/We ‰á 89ÃDž°k_£ZÒ„ Y,»Jüð(N­»Îiïl}–;6 WÁ|“ŸlÁz¾z\¸ ÍàìO%ý÷•˜ûW÷'˜(µ&7ƒ[UÖ<©/Ϲ mÜó1wí,ºw‡Ô¾kÛ‹óa^ÑÑ k™>b>S ÊìL@Ë�C ³êÛ¼Ãá宨[tQ³°=’ñ…v2™²ÖŒƒ‘³kb .÷zˆ@fÏœb3˜ÇnBÏW(‹ýƒï¨r8ƒã™… U}àHa»"[»§°0Åѧh{-ˆá매{§xX Q2J„ðùJŠk¸+‹ùlv̧¶<Ø9BO--DwÒÒÛÈçÞ¿ª¾ÍìÃ�}Ç(±@Š{ aÖí;æÁP@è%ƒlÙYÕŒÅQ Lkã&w =–uF6ùT¦špÐíà ÌÓê2ST—€" Š¥A´2¨Þmú-sæØÃë“>øØmÈéþµÂd,œóêbo#ÏV³:NtDß*4´S¸ôl]Q˜N€i«:.CËœ Žc7œàÌyø@ñõÁ“C f'¶I3oUEªvÃ\$Ïã8æÓ ÓÎbpxª¶™ÀY×�`°aI‘‰‚dëL׺…–;•¾H(=d �ϼ(„勻㓕®†ïü+`ê×GVlqm8imÌ \²sM=ÞÉ÷æ´ôÛÀ–mú'Å©¯¿yõž¬sËïÊò'sUdjÔdÇbˆˆDeÉb;ùޏ™×¬M<—×sÎÃùµiäHÚ®í‘Þžá½î�³ðXTñIÓ›½`,Ø)&1k®Ž«§L©Ól÷n·ä]/wá{Ѷ„ÁÇ?½c1l{£´@F†hZd¾ñ†ž,h5îÈr÷3æÚœ— ]eÔE³àƒ‘€ïd�ÛiôܨÜ?âÁ£Øуs^v ½vì…8eÇžæËÉU3Ñû¾¬¤°am«göÌG!¿'‘:øïÍÃÅê+^æÓÆy Ùç9Úø ͹½¤#ŠËnÇ÷rÙŽ5¬Ê.¯ì=@üëËøÉ/háäúB7{lTapÅŒÑ èÇ ÌlóP· G£}I© ØPL[ä¸[p¹l9Ó`]#^«¼a‹b%…ã¨n®äÜØA�Ë{c3¹‘°�±i‡·-¹sS¸e'RÜ’@P8àîÀxwÕȦªN‡W“�cµ"«‰[ 3¡`@ñoœS&£åI6Ð ´ÇK�“œ[w&·-Û¬FU_VÓ¸l¾;†Q&Òjñâú!xÛ{»³5œ·g#:T�þH @ðç%U#»¬‘E¬¯Áé„¡ „÷G—8Æ™|†vLã9q-H¢fž’`/E§ãØZ ?¨�rtrf—/¬Ï½‘Oʆ9;:™‰•£ª©süZúøßpLðÛ";<™;.àšø“¸cŽ[-àϻۨï9¼«ÐjÐêjV ¿‘©0i¼�Á¯±!‚ËX\ª‚¼”ïFõáÐjn²×¼yD~*)›¼2ÑN ðœp¦–p÷.%ËÈP?_x©Àå¼aQphK^À{Fž -Èf]œ¨>û ƒ=ÉR‰�%qm�Qò"Ö´/4 iuPJ‡sVâÊ݉Aö@FMH)œ@cçhÝu÷×nü$11�2šGWÝž†‰Á¾üÉo…±W2@z–#%Ži_ÉYã6KU ÏŸ##ð÷RmÇz—UA¸æp}Ku*$ç+ËŸ‡V.ä¼Û`Á+s>žk½ ‘ç·Œšn9n1¤Ø O–sØ�{f€ûhö¸½;¼§dãÇëhrRE¹Ì® €¾d¼?M/a[G�øÜj]�}Æ0DŽ&]Mõ `:Nž’Ö³�ÀÄ­7˜2j{1înb—‘¼¸f�k a†NàuÞ!ˆ5šÒ. ¥êZO–1TЖ‹œÖa@l÷Ä ¯5Se–`8"�l½Mä·© �0OÍÞð”à¹U·»Ń ¬0RQW>…ì8°c•xü‰Ï×—Ò�?Ñ4±RxµäôÛý°;a‹ŒZDÎl|ØlÇùßܦÄSÅÿu[õâ�õ]Z'£oÔY›dÜÍŠÁóFnÂ×ã¢�ƒY±'¦¹÷"Ù´O,7NûH/‚öëS¢�°™*! éYé¿©®öiˆZQü¨‰Oì @�&ÀDDÂþþÀ @�Ñ" >Ç-á³ó>Ͻô/ø*ý\^-"/(db:W„t„, xן¸2vúpÉr¶ºßåÓÛ2³Ÿ5ºAáÐÕô-to[‹§ ·»\ÛÏ­sžé¡E?G"Ær´#Ç[û½{è…>Ñ€ n¹j”ÍH¹[¨ ééBR¥–)Ź ¢HðŽ[Pã&Å*ª<>À£h Ëc�ƒ�2²IÚí’ò©¨dMÕ|)Rh¨™|2RŸ’‰áé¤"Ÿ?(éJªŠàþgmº¸ü“éJ±%•¬»<èé A»Óp@©}=ý.Ön6 î® ÑY%üŽ»ÐD+ù¹I޼)´sÙNFÇ|žòœí‰Bl£{‡(Y€î‚¼‰ûHB�À_5V°ZJ¯íb¢öÖ…-Öû˜�!ð ƒsm�jàl6»‚$ñ­f^•X¸uÅÀïßzŒ´®ÿwÂÌ~Õ2VÃSëcIzÐYÐóÚOEhÊæÓ¼k¶ÛOSKÙupðà�™ ñšõ�Å$¸ùùð>Ï‘×DZŸ)‹€äiï¾ø¼ Ê|ùó碣ëáýo½ÖØðÎ9º/|Z×Õ³F »Õ=aD*:ðRimøV/–Q[¯t¤ìŠzfØPUír¾}–‹Çáæ#GCz‚l¡ÙÞ*l|§õ ¥þÁäÝ‘ROâ¹ç:}Ç»¤ùýʪ€ÁÛá xeôÖ1@{Š÷ŽÓ·4Ú‚ñ >M­¤�à`%oÛyV³V¾9ÞtÌŽC]ƒA5{M$]uÁ ‚kÅÅðÌ;ÆÍ›/hŸ ýÈå¡Aü¾”ŒÄrØèl5§¥0VºGeü–Rá�udñ@ÇkäH+ˆºÌaa·!éwù.ˆy±EMçãV@ôP2¦Ö´! âGŽïmìë�åUn±LvwÅúÓаêG‹@†u{4óVláb"ü~º¦Æ÷«ñ4î2k S€qBã4.‘;CpÚ~ƒw»#Büi^嫼Ž`²".løFµ4øÊ0·³ò]°3â½í‚ø']GhéîžÎ6¡ZQ #XÿD\³´e.™·¾¹ƒˆiªX1.žæBô¶pTkÊúCÅ¥]ìmð9Յ΄o»¿œ²g¤R…Ìý’4õô aà.æÉo²#ò¯4mp|Rpë´JàwkÅ{’ß&päï²{…MSg˜žÜ€ÿ^Ë4û(¼Ä*NâpÕc1ð)"ðO÷kY_µW€K‡h ûîè$7’‡ÑÈ\:Áqß8iÞNÂו%…·%s™šM²üöKc°©_+½}¾d�[¢ pHsÙ¹`}P²D_?�¤×½�íóbM˜ XŸÉšköÙ=ãne½Ÿksßûjµ=˜·¹0Ì{G à —aQ¸14�é8ò�`ª¢.†Ï‹½ít¹¤=’�ÕÏíۤǼÙ5Û™(m“Ë÷2ù6&ÃFº¦]¡"`s<]àxw·ÝßÑþÈÞsÆfž%é×ß&äÎèB%úõo 6½z}ZLªG 4U¼QHMadŠäQlv¥C¹Bp 5PXxŒ n8<4PÖXm\oÒàôñ`®$|ø°å/ÆÇÍ^È„7ñ‹µ�×ød[ï­@¨•DÑ/7þÃ'pÔÌ®˜ápHè>o[`mµû®†è_EÐ�â­Ü‚—ݳdÕ¹£—õ´áݺ_;! =ëgKÞLkæu+‚|H¾Üël\‚X{úÀüüå%¶‚ï<d7 ;6j¸Û%йfâ[¨±�çUI6ËÝ,¾o¯¢¤%§ÏçÀÖ×[ýï bE®;혗ÌW"ø6mÔz�¹rÞ©_'­AóG¸É„#¦sñ*(8l2±ZË¡küA{ܬáH¬d½Ú88sÃÉ�Ï´V«¡Öúm!Š )ŠKüñZ~ FDþg¥!ïJÝ<ÉM‘hÜ–µ%ŠÏ~½¬xó#ýÇ´—4¡/ÂP;¯0£æÔÆSu–R¼ ]ít‘•Éèn;{ëÇM£‚WÅœtT4™£Ø ‚Lõ×µàÏf}6DÌ¢`†gkXßlN6M­7³0‘M¥•9Þ—q'Cy«ŠÑFz Æd7,Ø2ËtIêm°Øätö’ÏoJðy$E ².§p}µ’ï´-Ht³k‡8Æš-g¨ÇÅÈõÊÀ €ìËÊÑë%tTUAñûº _]õí~EëvVÛÅ’5g@Ýò6š_5ãœCÎ1`ç}Üïè¼ùðBT «_ Ÿ(O×Aj·ªØ!ߎï=u,o'JÈ¿1l#g¬U¨¾ñ]ëSÎØF¤‘9¹áq·½_I2ö¹œ§.p#3ÎñG.àæØžt�^IÐW¶—,žö(jõ¿Ÿ+©`€�7K!«ò;[µ¡yn¡û•|xñ}â:ƒK¶÷bÛ¬ Mo§ôçCcŸœ9ÁC¤XûE�ŒG­ùïö`Ï‘·9‹¼p´Ù<þB«¶QȺ©ÝCL çSi L×µx)yÁíEÏçÐÝö€ãm¸\ý|Ìw %<³è'º=>ÚÖÙ="†þÕ%ù²ø‘:¾ŠFzÔæsoýàÅk(ˆƒß\ïY>Hi–ý¾H…�ÇyK×'ß7½ž.¤ógß �KlïûzɈ°j¡¶ÚÖ*ÉÉ<)X\ŠÁs•ȹa ÓCÇÄ¢3ã+ Vª Ø€Â|ýàÀ÷Èo v�tÇXŒ¾ù¤Sp>/<´>n£�®;ÜÏ�;ÄÃÇsZB·6ù–=p0΄ћü¡sòè{<Èe¡—¡ -§ML Õ£]«°„U¦ >#uÀ™AîÁ 6#>½Ùµ§q°¿%†á$yÎ.Ju„BÞÌÎ|âé�?Ãh¨áäw ãVØ8[±ÙžŸY퀰ÅñK„ß‘l`n¤Z3 ÂͲUýe#^%³ÈÚßM¶ZE0? × `Ôv£ÛÙi“;ècµéä>}´}`Pø(à>ÃRãJ\ ½,õõÜgç¹¶£šç{ý‹î‡ïÖž¢7ŽrÑð¿¯Æûènƒ\Κ–3–!¶w—D “”1ô­’`áæ!jbÒT£-Þæ/·¹ìÚ)ó6lrˆ XWI%ƒÆ· }ýî-Y­×�\õœæi±êAè@ot´q°kSqÅ픕üΛK:™çR€e®é¾íBx$‰÷®œÍÊþ¾µºo1 àJý­ÚhésÙ×2Ü­Ò…�ÔìçSå.z}·–œ1Ç5öÒ­ª‹-¤6U½Nw»Ô]v°ºÍmö .Z¾—�{lÅõÅ@UÄo²àÏ%ûƒªæ× »›$ò�©¾çUª­$n±Mº1U‡“º ¦œ&éd*;‡Y´¡ XR•Øqˆg=&݆ûñ=—&#˜pð®ÿ_O£^ú¸uçñ#ñ¨æþÚÖ4¶Ó w+O„sÒ ÖÒ%xfÂYg¼½ÝñçeDº<É=E�ãmèÙÃZ¹ÙþK ÑÉq’Êò½±ªÞ€‚Æ*`øÑ›.u>¶½/kâÖδ¯kÎv’4ÄÅLª«8KÔOä>GßšT=H�±bUã"ø�-Uã0€–ûð:ãq�8v1‚ÒáÓÂ{u_擦ø=JÚÊÜ×yéÅ»6�…_�ºôØ¥C;Rõæˆ!#2wÔ�"X¥Ș& ½j­ð¢ur6âó–6˜Õc LøÕ¢þGb¬Ð9›ldHí+¥]ÅÝ{€×íŸ "¡("]%nw-Ö¯/ÆÈ^HYª�Å<�M2ó±Q9›¥W 5RbsØ™åöÁªÒëb¢ý 1�" aõ›¬Á kCdTíˈa1tâ½ÿÀ@ˆ5(?uçõ¥Gvc/H×rò¾ÚìwJ”÷@ñpq &(=�T·«}m75¹i­Ä¾ó9Ä9Q �¡ �Ë~�gr'‚<_H�¤pÀ¶n LH÷8ùø21bÙ¼ÙÏ“ª&¾^`ZÂÈ^Ðl1p¶¹ßœ-u³ù<á´ƒ´½ÀspwÄóÐÑ®:¶›Yh©=†±òíè,X,Ö$éov+1@ª²aˆè²"•¼¸’�õßfîá{F~Æß¶%DM±誦àÀCø›$•…Y ©~kìTgëš‘«5¦ý©ÔØó"R8o5.¿nëÑ´Fxa#Ò-£â ¢ÓyváB¥òê&ôà}ÓZbqð\r¤× h'B1pAf¿R„-xÏ� 6âUˆ›xªxB[§5 µ%`¸ü3Z{uÌÃ$ `6R©/ƵiÎÑ6pF;ƒJåžvÛ¯·®Ø½Û Ê¶ q$ÅB`;ܘA¢3š]å°˜ù&è»b+ù(, " ”;LãƒØ ÒP~ýcÔ›-ˆèWM w¸Ë&ŽJmä ÔŠˆ �žÿunܼVo~öÂ$FÙ#t'³» Sô„JÛœÅè£FDª”±©Ò:œò9G㪃-Æ. ˆéÆ"úOß7Wý¶÷ŒÌ3Í¢]óOÓ®—Ëo~Åø`èû;/…F6xªY¶/a`å�w´Œ)R –ø›‡ÖˆßzÊÜÇ9D± •Œ¿°gÛãª#F=¾ê�UcUä™n“xäÃYÊC;0<,ÔmøØ3»Þ6Æq‚p™`{‰ÐI‡AP'’)÷èaÜÖŽÒ࣋¯7eK1^m4æ÷r;n|öuavÑqŸÜÕFqQÖÖµ®œ~ûê]gN‘Ÿ‹ÆG¸ŸÖ³ér—ƒŸœ…ާÑÂL=|Ûè?4Ypu·ÓöÍé»ßÖ0'-Ž0;ÏŒJY›I”[9ª!-•ôBT€Ù|ýnØ„J=+äÞ€�_üãœÉêØcñÖ6 DÙ¤gÑ­0 ‡ ÙÕ…ígqi¶T 0DèÍœ²gJk ÷Sç±3À9F#ëÕû7½º”x½™¢AÌÇC2‡¶­§ãÑdàÈ —úê»ÖD?…éu�¬BÊÆ]5;;uA‚>)c�Q‚+"óN}×ÍzDþ�šÀÊ5K ýÍXÉwsÝ�øÊ‡_­ü¨¢d_­ªåÚ2{�ƒÒbG PÜ(37ýN–§ŒFauºÿM`¢ú³yÿÏŒÇÙ‘Ù�ÏÜ×5» Z‹öªf¹�Ý3Ï•â•ǶØ?Õ.;°IiA°ûÆt´gb|ÍŽ®>x,Z¨ˆ8™ørC�”áNò>Ãl¡y=êCO,2‹ŠçƱ—*w>+]¿;UþFòŠ=Ã훊^Þß#ÛíÝ£°;ºˆ,œß@Ám÷ë MÝÿ=è@ ƒ¹ V›Ýì>K®Â,Véµ�à÷Ö[¨zÿ1^Ãé¸O·b78&.û×Ä“ÛÓûò Q'T£tšmyÊú-ÚA\N4´g}×¹žžA@Àr+˜Âw;õî÷üú"ýÑn ^ô¶\ãȲªÝÝ$†ï3=ùç\ï»·ÛN3ž^ÙÎw?ªrR(•$­ÔølBI‚ÅL˜ Ëpx‚ÃЉí)ðñÓH›L}KéƒÐQÕ²Q" ë ñûÄž>2øK¦†aó›#7•�8ÎS¶€ÃÞàl}}k�Oˆ†©×ê†}v¶mÏ<ÙPxÈ» Ù&olؽȚ»å&Ù·Âø÷•.Lßhô�ÿ¯Áø?—Ùx®¶C�ñkæHù¶zúÏ…0??‹¡½v³.*«”[‘§zˆ f9å]É´°m¤X�Öʇ$�ùàÙ,@ßPÚÎ7篵æ¾Æýј\o�gX{ozàî:(¸ÅVyÁ¤Üœ=±�¨aV®Fš*Búp�ÂÙuà ñ\Áø:¾a tÆÌDâ×TƒµAèà8ñ7·uÊü?Oá*;NøiûÜï0ðænáÄÄl_WaÂ9;íC?xý¦êîþ¸G{÷"ßr�~í'Ô¨Õ�”§çš�e81tt<š/½å|�ÁÂ/ÃrqÕåÍ;]ú>@»o»Ýïà.aÊåž5ÒrGó8¢¼ëïPh=êÞ‚;”„ý­¦_ÑÌÞþ—°N€>pHIºÜ±_–PïI:�_K…DE±i\¼жC.'÷º˜Í¬ùÜïúh+Ú†¿»77�lùëVà·”a�6à|Sá_x–0ák[uÖeÐ6X´o&éƒÀa›‘ü5Éå�c%B´Sd =)öãZÎ/jÜ<--©•¯H·Kd·_þe'%S7 ^ ¾*÷ÛßïŠCºßnS¦%øPÒ!Q[½Ò-µã;sHÌÙkò¡ø5réÆTN××~Ë'ŽÊÁ}[ÐCÍŽgªý™Í9cR«¦ÀÍÁssâ5uòŸM•7Kn«¬Ba¤%n7˜%Ès˜JIµ7ÏtÌ�O¹� hæÝsÇÄ:�†v·DjâóEÍøp�„â“L¬,Æ£ðvÑkÞFiÜ´ƒ±*¥ÓIë1 †êê_®úc¶›£±oÖBÊLwx 0Z‹²|­ro6ÝÜK7ù�±|?`,rÑE°£`Òcƒ. S§ÝÇt�eºÇs&4'ÌÄŠ(�#)ÿ>ojï7¾/:Ÿ ˜.YÕÓ®`"ý ÓE—Ù@s[Åî8…ë[R)µ·î�ò1,Vmì"¯Ã„¿wÁ©6$æl™NÉB™ŽG;¦©øüDÝ/ÓžR~:eÅ`Pµv*¸çã΢ï”õãéÇÙ'ÛK¨ë¿y»ï8j±gÙžì|ѬP‚ysj__¼Ãñ_3¶Ïé‡]ÈÛ78úÍ]¬^ÎÎ<�`UÑ–ã[‹Äæé ð»¸ðbjS7BqÂø-`Ê4_7û†<½p_&Ö)Ò3ëd©Êåú½™_ÝÆ p+ô²tçXÏ�p"*PÏ|ا“år ®Z�IÉ ý˜Gð�ÎLsµÇÊ×e,S§{‡�Œ­?ƒvIÙÆ/ÌÒ¦|w²@ÙLÚ��ëÃYî½owGr¥®RhÌåí[œH—à–jf>òçI’{*üˆO¨ƒÄ„§³ƒÂ¹šw}ƉêxÁ‡ƒ??ºBÍËò�rtHÌ�fv‹Ö,™j´Fóf�A båàÛ@›&œÔBž.ǰâÕgÆ[ZeÀ�Íò]µéûÛ¬ZÖ—^Ï)ذXR18d2¯2C Ä€Î5=ü‚ü`Ib¬�c‘…z+´_a›S„8àþ+Èúì�ª›çTñóiñìW‘�Ÿ8Ûhߨ°¿ŽéÄ�Ž×K ÷_s¸ê…ÈìËæÀêbÚâ|ž?’qšˆ´#.…i±GŽ.ƒü×ø­6þò… âo ÓGökŸ6/c¼ÁNŸ&.{Ü ÞæÌbî®ãp"�~ºØâ ,e �Ô¹:Âò7½Î ¯k…†ÆÜï_|é%(>860ć۱Y6Áx€ÏUuj4¶j9ô "¿Ö¶ÂÚ�nR¢}ã^Mík“èCåøz;á‚r 6‡ÆW !‡«‰:á0?f7q¼KÉ—Wiº:�ˆ¸CxO´~Z}XЩñà ÚäÑ ÷7D–-^öpZŸ&x\Pï×ay8ï{“Bð€dnZQ±ÑºØ8Yâáù+˜µœ[[JFš~k2�ZÀM°Sžˆ»£ý}ó�ÀÕvó,{ �±ÐZºýñ_œQUÄx.ƒûƒÄÕß_¤ÕÍ }©û �®ñ]ó:Ê |L·›“¨šKƒw{έ3ò½ %�Ña$öàp‰ÿÝž×a#2S:¦ƒåûe µ^ÄÄÍ8 ‡Jª‚Mgí¹¿¦‰Lù½�F #TK¼_^lÝ£?’Óµ!j¶!#ñÛ_evõÖåÀ‚)ù\3Üoíõ—5¤³`µ£g³Ú�RàÔìö ÏŃ�»FFù‚„svÌÊḁ̀锜“ ?ØFÔE·ëŸ×±™N&HËjŠL»Iî“d?ßÉË-¸Ú#D‡s†)n­6MÚQ^%Û)÷÷ò7ÕÈkÛ˜Áþ:ç�~úC½"P@Þq´\ÛQ² ,.SŒ�¼a>ˆ£­cI‹Ý°¬×¹([¯áªÉPÔ5S÷J@iì@ÁfìPñ$.šnáû'&NY$Ð9…«–]aqÈå©m³Œì%œÃY*àäu 8 ¢Jª�)ltuC.¹FÏæíp�Ò×j’hk®ÃŒeðñÉ+¨jöÓ>uÐb£ëlø¼ ÕÏç¥qö¾Õïé œõ¾UØ ³Œ~¢«£wRÐñ¸LýÀ–}°f½#Xì_'s~1Y}sfØA=<É‹û]6qÀßÍBôêøkÐÆHKœU—€²Hø¸–}"߀“˜ì½þ¬±>9mŽ>ží~å|íìŠq°@ø„m¥ÿxjÃõ¾Ê¦@´Ëøl.EÌ“h2ɆRƒÌߪ¼-‡Jõ(Ä»J’aÀ{�ÁðFŸÄË=—Ê*—_eÀÆé‹WŽUªMI)1tûçˆ)öÚ×ÅèpÃF«µ÷kî^c6>bX&‹Ûñ]£Á»|ÜŒrÄ7 uí62_Vñ/:x�LÁuÅ;F²«‚½á¬ÈÛYˆd5vsà¦DøvO” Ôá½ÒÁ¸®wç<·›qf3®"Çnìò}³bc%ÅM0É�' ¼åŽâJt˜Dv[kÛ!�΂¦öŒÎ×£¨X&ä—îZ*:Å~aRÛ-Z÷êìÿN°ä1qæïÒ«žUSp:Ö_rs<’ öóØ+\夦þŸÒ�3˜$±ŸŽÒæÙ=`Ÿ‚çüx¸‚î‘.¹+ëQ:NÙ»«ÅÞ8_ZlJJÞr²ï¦äwb:üP¼E};;LÎ]¥Wl‚z� ÀŠçà¶:ô7¶\.ÉÛ¼‹k¶µé3…TÜ壦;3æ…?D&ܯ²ÚIÒü3�ŽU7A½3E$2YUåìÞãᓬá…J-7m>ÂJ3ùe(3#øÔ0‡û?a4‚_¡¬Sá(x|Ýæå6Å#ô>T¶A\6,l„«Gâ$\®!ó…vÕ¥ïaÓ&©¶í£˜’†n²µÕ(åꌮ «ñ˜b¹xZΜÈVÇ‚´Õùº|´·›¬$Á¾&6Ãc·¿ÑÉ }¼úvœ]œàO`(½öX= ŽÝATŸ/ô ýõ|»HÔkØiý�ã·N=ŒTz¬* Ì*ccsçÖäž1æ‹êzî>�ökZõšœŒ˜Ñz¸IÐp}ÇI)µ¨†¹Z3¥ —v¼ÞóGPÏødµNƒ&F öÁ¿¨óŠ9`Sß/ãÇ7ôŒâYùßÅ}¯ßpwöŠÜfñÞá:Ô9ßÕöb’–lÊ8¦ów!fÖ‚ùP�éf#÷´w�§e‰Ø®dS–Pïz™X/ÖG}v7­+>è�ðbëÁ&-–IúAtá^Ñãåû@ï³S‘ g¿ÈÀÖôŸNå¤R\L3=‚e”X'ßrÁ‘ 4ÇØ^[_wœ,óÛÜq]5íY›«”n[ô1q ô.iuHLJø|útlgÇ=¸�Ò× vâ˜E1qáÊ÷æ àýß^i¨x¤?} ÑA‡ÕVÅâ —%Œ“—Âþø±wî+„|ùÚ·ˆx¾ZÅ:ž-ëLÙæ1Åt-þš¡„ËAÙ§f•«ê,PM›”‚ Qè¸ZÏeäÛEkÜFîß?·i.u¢öôŠôR<× ‘EíUÍãoÀø¾úÊ9¨ú/àä°/ÕÅg % 9|IjêHñ W0p”{ï SØ.ÈØåš“TQäÌið2›÷¹(Ñ,숋õ˜ïlKA£Ð—ÌÖÕÓ—âîx¬Ûk�Aòº){@NúQzþ{ «ã›]�:64 j…ÇkÞÔp'U“#B=kÙ6‡úï#˜Ì†|gxÖµo�7Ñ M¦¸v‡F ’§ì™Îøj€·LVpXÛÍo½$Eˆ’AÁäÂ5zÜý„ †Åáá6Å[Ï݉¢õÜ‚b ;M�|†µ•«à”ÉR4ä ¦Æ Û2uáÑ»Ý;6Ÿ¿M³#†œŒÇU}Žo›ÒYyh³<œ!”¹àÏôçêØ|XcŸebWÝÉ.CŽÚÛe,êFðÛV6©t_}æ«8ð³…¹|„« tÄôA�OÌ…Qw6~�€?×è# ��åMc{7 o&a4äc„Y– �‹zë€H�o­‹ójvÈZƒ9ë†S†ëò®Ö~kŸ©’‚æþÂ$R\PDª·N©¥79¢^�TŒqÔÑW¡aa²;³úÕšÐÕ]1·|:ïÍkÜÇt6�‰ÖÎÉ̾>¶Ö8�TõZÖQoSß:öèÅà?aŠÙ{ø›æÁf¥Œb&>,îåç´lÎåçSÇî}7Ÿd�Cu�71·FýÍe Ìëš{5Ý=‰Ä†0‹Õ(™”¾FïNTÁp—úŠ}iƤ&Ï£Ü:ÚÞòŒeòúðnú°�9­iËM¸EeÖøž0Bów ›µ‘÷YÚoƒÌÇ�vxâ(ÂÁçJ28s¹o‹iÆ0/2l�+˜� i-ÜÞut-Þ¶e�#쬉ÃЄŸ—-ƒ{Výç6RÝE¨ô¦ìë£6¥FcoÇ9#+OGVF—s)°•ÄÆ¨ƒÁ] ³-#c:h°…ûÈÈß0rnôÈ A°ôŠàœK‚…£5ìÈMKˆêóÕôñÙ+îèn®‰tùPÛ\féì™Q‰(=rõ#=é}fî/r_gOM'hvöQ¹Œ=ëW6BÀã8i–»MHžò ÍôÕïžêbvY•Õ£'…0‘]nŠž§+ÀE$¸sœüÆPÄd{�~>&ï7@¡ñÛL!Yb±zî#p €eÙU¬V•竉\š4Ü8˜E̼è� Ûé× 9�-üZäuŸ�Ã!¾xT -Šî»›ê-âÖ_ï——amWLc¢«Kin¿Yµ½™ÉXÂÓµ~ý`\6Aé3³¬àl#–ÉâgEÇåÕÓH¹ÀOo­d9˜ CWʲ ¨‘Ï+Ù|�é]‹78 ¨™Ê‹ÌQùôûœ~õˆ'¡¹g€R„÷éȽºÑ´ uzOf2†v!;9•õ‰/ò¨wÞÞm™­Kü`œõÔÜVü±‡¿}<ŒQÏ$¿Tqñ2§‘Õ(Hê·J»p+©Ü7™w€PÔÜgˬ­ÈPƒ˜«Ö#Û¼•cOŲYW6L› 2W,…ñqÆ sÛû›bÍÃ#Ë¦ï² ÷»Örd ÕóNËÞW81 66ZÏ–È«œ¥J$}‡çL$�…�mS}ÒFÜ2dEÒ4^ÙôKÌôµvÞb•ôàYæxÛ�{Ôý~ BQ‡¸ôì¿^g„QBSMÞÌÜ.ï{¶×@f¶˜™˜LWRCUw$ªßEµ×®âw+ÉQcíš§Òœ�\ŽÌ»žÑͱÌ<–÷ÁV¯ØýÁÔý=•UÆ ÔAì°ØÞ�cË.Ô<_ŽÚl|]{Í;ª ¶Œø=Ä­‚h}`ÂËb£�9é§ û‹Ëáö‰ÆGß&. Î�˜j Y%1ÃîãÈ lÛ>Böø|�5]wéSÌûÉIëÚîS¬åçÝNË Aý ŸZÛ«Ñ©zû=þŸKn�õ›: Ŕӫsl‡ƒŒ2X!µÿnâ¯qhèj#WCE:z Ò>ìÜ�·…^aù¬‘ËG?;9Ø:ÙäóU#!Î)Ùñ½cÚmìÙJ•NÁÁÕ�ëÆ¢„Ôqp�ioæ‘áû³*î j�V§èRXz;l×ͲÆCïÈöÄû¡`ÅðÂÕ’Æþæet˜–¶¹1®;U¹È¨û3ÎuïÌ"²‡Ú¥ã/­)iüM2ÿCy¬R—¥Å¥÷ :q×Tr—}k¡áŠÚ¾6]áfq”ǪÂÎ`!bòMwZM}«¡ÜÇÊÇ Ne2gоÉNÀ*£®”]7;ÈÐRPí^ß¶œ~� ×—:+çBŠ–Kg3!.Òѽ3tú²±{Uñ�Hw˜ªaå¡0¬?,d'M£CÅ[õmŽÛºdÖ”ãÈ`*IpÅ^ÚZB$x?˰ãÞ,áÖ äæî]o§s‹|™L¹IõòÙôk~]/ám�4ðÉ�?¹ ­åǹBÔÚ�3"Šžï:Ìù«ŸŽ×`ÎÏ# ÈoZø…ŽÓŸÔm²Ïвû3ñ&.E†Ø.N›jÆVY”}ç–åŠx·­i/ ç‹ëò0z:ìýŒÍÄï8RW@¿%säK‹«ƒ�ë½û8Þü97bvá»+êÙ&7ì‘¥ñ�[P{td ß€9lî/®bǬڻ�ï©1ƒ»R>8RQ-¸5¤íZÙ㻼;mCW0¬žüøÙú yg¸žâ™ÙÌ5‹T •àÊÈ߬RvënÓX)µÜ7«¼›8¼ñø £…eC ~Mc${3ÝÆBÞfŒóþ­¥d“å]67º0"¯¬ÁôCûÏÂO²xÄhùæ^˜1ƒsŠj!öá²Ãäa\hI0ÚÃï„)�sÚü|V�ñú9´Î–@Ëz,¬ÙɵWY 3CÏå™iþMн§‹íÂålä‹©NnžPG …¾ÔÇBîÃ*r’ÒÁ›óÐB}ÀY;¢9¸r6€ÕŽQÀa–a8¦ÐtÈs©V‹!øD14hÛ)í‘v¿ik-Ñ8*½”x•žñaúÖ°ªï<:hìÚV2bçh¼Ú“'v¡ò‹;ßiÿToYõ›c‰Á*}çbRkçסå÷b¬ˆçVÂë:Š ðʉ˜O 4ñuÁÝÒö‹ßÛÊÙÆe ó§†*G]5é©&GHú]íª´×¸Ô\°ö9 J•Ža‚Ãw Æl5ý5ºL H«»¶:0lDýáà§$øÌƒMt"¢ÊÙåŠoÊã± ”έXÅÝ<)' �©…¼RgŒ‡¯«úœ:/6Ë Tn:§œífu‹îÛòóp±Øa#w¡¿H¹ÒUs¼§cqJeL>$\®4µÛ,í� µ„¤p‹Ó�™·z•[ž\„l&Ñw1|·3ËÔ”\è˜wƒ>/"Ñoúäÿ‰¹¾P–¢¥9fÉK|£¥ »�@þb¬=•¿a¶A(”Nª£+°üEH¡G5?ò‘úøp,8£Â˜ea‘HÑô£$ *€ÇÂ’Fm‘ÇNDáÒ„IO„�”¡mÕ…Ç~dÕŠ ± \Ž‘ë(s¯âØ¢lÚÊ1 ñ/EO I QJnê.~ÒŠcÞº% _‹êª#”eX³,ʇ\?‘V^ÑzdÁ æeЃŸbDFìÃgÀsUMª±F 5Õ6@gP(P9©ŸjÀ{¥(�•‚™ ôÔ$нª ŸáˆrƒÂ*SÂÒ‚J%Š!r¡MJ¶¥…�z¡ÖlÔ.ÌÜ#%þ®Ψb*rAñR¿Q§bYUˆÙ ’�žÅƒ-Þ*|@±AR?Ÿ-LHþ3+â�O8Ê0G‡%ï—…ö¦W·úE�Ä Q}((D”bÂ5©Í³TÂØŠ I@å.pQ0C�劀< \�%áA# J8{¨R?øÂñÐk}gÊÓ ¤h„¡@l£Úß³"Otƒ”BP1ô€æÄwßZåå™:›2là† 9Ƥ&ÈÒËHNX†% Ø‚" ** ®°ÏÄÎHòUs5Tæ-‡©ðøëË;\ýešªp… ulFÎ=_ˆ¹Aé@,G¾¨±õå�nÿUE¸¢M.´,F –"MH§–Ë®%éóWÝ!+}2d�ÂöŠ¢ºúRK”~¨0X2¦�Ž¥B)S“x`å–“ˆ5ÎÑü(™6"ÄA«¶NÕx`Ô¡ T¡)‡vÙ‚© ’,mš5Š"ÑTÀ²’;+y6z˜!n¢…‹årž¨ÁE!ï›Ú²„g š(5[·”bžñ€’§IJ)é ¥ˆ­”[òðòûmÙ  ‚8R„\«(OÄãÌÖ`Šƒ‘ÙVDÁ zÃ5â„ühP1AÂ:³U?Ço@± \d_qXÎ]0PXŠª¦ø¨«ÙT#+g̪~"»QU]èU€Œ*žbš]ˆÁ×™dE5®ðâl4÷Œ�q��ŠÊe@ªª¢‚JjÊš P¥ÈÉüoydžÃÄR3k?!ÌOۆɂ‚JÝ@ôùB¾ÁÆT�vê—96!$Žª¤]B1oq@®•ÈW >,Aâ©ø£”KYaY €ã_CøFŠ f�CÒÅécˆæJëm‡h£™ð°¹M#ÛПåª)Mi@bƒ„X£‘£ŸÞ»ÞªT€-e@§EKŒ¶?±Z=¹ÌGͨj¥÷€ð3Be4Éç‘°ìŸjÁ•©ÝN3*”î½Æ¥Më0r A7”. U²9M1Y�A¶Íª9b;¦\q}º¬>l³µ_ôfßå$,öäwX±‘S¬–a³vÀ¨ÉŽqf{’\Ì4fEùí¸Ãd :‚PÃùÊ24k ›æZÊœa•k(%U 5¢Óeô}>¹ìÍ/;…àK�ðÇÁÙ>0“¶L 8x6Ñ�Öù¯Ð<*�×°)k€ÜÑ[¶ðÌ•dþƒ=ü¡•O# Š Òªg#€{R¤Õ8OXêÛ;|l0Û}¦·Åù·ºï¼%­ evš?HLýU8+•ð×g’î��h ý ¶úI3³}X”®7¸uWoä�£¸hÌÙùÅtøÞ9xƒHU§Kåò –Fr/ÕudÚ®�4" 9Ë4C-çB‹áã„§KSµXr^m/éÐbXêMn²9‰Ô•óèÁ|ÙGÚ$ª™9ç¼äç©,¿­S¹æmªÈG¼ÛGçƒ{Øw¥Ë1·2& jÔÚoÈÿ%0ØR¼í%êÆ8ûwûëMyº�—Ä2¾çá"ãÑNÞRã›K/z@|‡ùº�½b{u@±ª^H'õòdÅUçT±¶’Œ'AO—k”ÙåQg$Ê4"C™bI»¸¹í!ÇkÃÛ¨Rɼ A62ŽäQÐ׃a¡çM÷è5åëºÚ{” ß G7³ú† NZ ,€osU!G8 |wTî´ó(š+Uˆ ”Dé±ò¢P5LÝA.Z Nþðîy�¨zâ—¢¤R*Á·¬ùg[‰Ok‘|ò÷‹PîHalP8|ûÃŒp¤ñ7ºted Œ(®9äî-yÍ™e¯øÃ<�s{|åŒh„‹ûxËÌõ p´4ªFˆ¯×.È´]P÷ˆ ÷•‹ÄdUDuË)Ôl0ãynvo*š0¡ÅüÖ²»Ý¬,kŽÀ!Õí—ÛS)~I˜ÙH¤ÓIO!]ˆ©Ã†°Îa—O<º(Ä‹¡cj'�(ñ!àöUf'Å®™G©?Æ@F,ûnb I(µ³åq€®ö{?¸_["•+ßÛ-¿W»~;ÞC3A`Uq¶Ð:�CT§pÖÍë÷Xå�AÑö;f-A´F…C˜vÞ-¾«:fKŽuëÝ¥YDO(˜Y@P©»k Ôݶ¶[Âu—qaq²C° uÞ“T•„Î@­ô5¾ÎýðÖ®2h\žÚˆ“¢x*xý:°§ ;~â>búxS—<¸—’gPÅŽ¹ø÷·—¡*º/øÆ¾V4Á{cßIùF°¦Ö‹÷‘œs%ôÀUXTD7xÅ‚áW¹Ï«kÎ`d½ö9oÙÔÜ>¾‘?|—Œ)”/  \f¶]¢ü�åËe¿Œ)ŽäËúBÜ,�¨5F0±KÌU°¡i9_´åæˆÖJ_<,ý^ËŸÜ•+C”{ª îAÚ¬OƒTÃe‘®«S]ÛûÛ÷c±íÕÎô ~œêx¥W[ ªHŽË$>õ5¶QqÅ™“¢:P)¶QrÔê|¶î–t„ØÊ O׸†·/ëÈý¦8ĨNíð„h˜º üBÀlÛÛ¬lO¯µÁÇ$Úž–ìêõŠrŒ´X=Xˆ©H¹æÃ–ÖýŽT{êjŸkÝ%¼ÃGQ*9˜Àk%i±ÒϵËÇ¿0Ò9ìóv=éâë¶G²›„†ŠÁ7~fúžvÅ­n«¡Ú¶Õ5–:Dëfo’€·¢½VYE,Ko £ŒK¹þÆà]ÕéKµã_8\ÕíXf¥°‘�aC £‘BwȺ¢ò6ýê‰ðëïS?ÎÛ´)ë°1³qZ‚iÈŸi�ä¯i6Ðs`TB“‘|´áµa  ðœ+ ,}k×D ؈âbÓ€)ØsëñÜrô„¹[®sA/öHÔ"+w¾²Öî š$Ý16´¯DW�¡µÜXvGk¡8?‰v5ƒ@LOËž}£?1êÛ3ìM—Ƈ’ë…Ó� #´˜X¬Ç/~§/Ú£µè­¿ÏBY V}½Ãp*nZÜnÓ—ÂÖ°—z¥í&>V>Ýš£·Äƒn½Ó­lN/t iÊ•x@i·Îô¥tãÇöÙ¨x9a|D[à�S³þŒGÄæß^u`œ^C€Áý°ÛÈ¼Âø1xËi¤púÕo—˜Ûê"tÓdk ÌÓ¥v¸a*5[¸ßš­lgëÞu­Pd·[ÇÅRíHÒ]Ì=f$¼bÆ(ǓܞßTnjÀµ Æl†Æ£{ì™"JvÈî°iµ0‹¶ê%ÁÝа=…‚Aæ-÷áÓ ‘†Ø„¶ŸjÉ�96Õ÷ßvu!¥íªñú¹!U¥J±ÊP„nj:N©^ÈÕP5�kLÇzÀâ�Ò½méy¤»ÍÂÞfŸµ›À…Bq¬ Ëj.àç· ½ç¨Š ’ F—lXïóPiý”¦Ô˜óß°Bµ z¿iCé¬ÓX‚~c¿CfÚ)¼Á}ÅÖàûõšÞíg—|/3-Üp¼~ÓÇ)ûÐZÒºÕ“­Õ ª\ÔìÏÅQMkö}M%¨!̃”ÑŸáÐë=0lÓ@(lPÃ…zãÐìXc¾ {È{%û6äí­tUxž±Äµ@! CÒº‘Z˜•¥ÀtŠ&¯–ý†Ræ%0°+]ùëÀ#Úݱêh¯ÉpYõëÊE–×ñƒ†`Uù,óЎΙ‡=1>yŒ{»5åw™B%ÝÑ»wûßy39ï5™$ÇÂ=BKêá;ÏRíj4obÔÓO¼½Îst˜ûAðwbì¶íW ×…Ž­v+‚üÆ¥@B'šˆáHw=?¯èAr³òÒ9]×4êIÒÉïo†Ô¿Y†ã’÷v"©”‰Û`7Ï‘CüµO<Í „¾ø-pSl\fî@\ÑdÅñ)“’Y#c²§ÑinÒ …xv+ÇðæJàlÇÁMÓÝG^”LeÑ‚/\gd@0!†½U6ÿñ «õ¶6µcje” m ä]YE4ªÒöšÍbÍžS}­àO�‰xP¢ù\àè`_‡RŠúȉê»ó‹˜jŒC1ÓAÌ× K}b_cS0šµ4þ[ ”⡠ݱç!UÛ@ °ê „Åýo†œ¯>}`òI�LáÜ+Ìà¯s®dž<$òÎ:&½¼|íÓ†'­½ÉÙ©€î+¦Ê€¬¢ÞˆŒK¸Ðþ7òñ·Òæ0n/)ÍkQŽhU›×sÊkC¡€ÎÖ^–àÖ‡ƒ�lvp0ôrÑq!ÉûɲºÃÅϔͥ$ûm÷Â61.H%`éìÎÄ¥EQó=•5Öc”wûâ —Ñ€àôz…£ÓÜïŽ4Ý,·~)]ÀMa�%|‰7GFœ³°�zõ2|…6T ôذý«”_ëGÕ }]!_¶ÁîR§rR…Âi΂rŒ`X©ƒzIÝ1¢@^»70»¸ØôÉq­@íŠ Kpï@¹Í@‚ô§Ë‡¸Òx¤;õòHxS¾ÅEfÏpx³ü |†pâDƒ—¡ Þc ø^D0dvhz\ß wð×r4s‹«§Ÿ¦HÂðP÷�ØsËqËɳ+’HŒ“ÈeÈt}ÐxwA�6'®=ï sŠ•Ûþ\;ªo[‚Ø¡(í|ÌÔAÜþÄ[tú¾n*»Nõø˜]TÀ2HÍ­ÛŽ1ËÃûÐZÛç6*#µÿ{}Ù�Ñö8…®{¶ñ— ³M¨aö6wJƒApM_˜‚B}Hp€ºùy’lÅ<‡Ñ‰^f¾î£â;¥é+�²+7©à.Èüjâö$ uÝ£aúÈZ’^(ë+q„ì—EˆðnJEiË÷�¤s3#æÊòræÍÇÞCv«gÝ Xv £w‘®ä3¼ÕÀ»>Š­Óa7\þg�€X@ø÷Ð%Z�$Ó@- ¾-“ �„«ñ÷Ûd.2o´·ã†ƒ—û¬Ð0F~‹ëƒÄc üïJÅ‚4€›ùúL�ÏË�ï<…Ä Y†*8mt‡óÜÚ‹æøc©|‘�¥Ó‚€b˜>œ•î¶ùÜRño§ jF§e°r¡—ú@~3ö³Àcy3KrÅ…¸baa.˜ˆ±�ÔÔ,E£áxúJûá°N5—m¦ù'947]V1ÆÀqzcŒßëH8ce@³‰Ÿ::dˆh ØOs 0+ÙÉBN±ú¤UQe×-/Р´w¢Â*€BQÊ0Nì^+®ûÓTo¨2 Vнâ㘯Å&O¼Eʇ1Dø7Ʊª+¿×‡_c"_®Ös 8\Æ5ƒ„À§D(ã_ŽGM�#‹yÉ8Š–§ß?9þ|Æ{ŽV¨0¾[8áxrÀ“š5ʹhN°sñ¼¦·z£ÍÁ3Š‘E×AóŒØT:­a«×XÐÊ©†£e%—ʸòs3¶‰Zó)%k^ÿ*dHdвô­Ô lEÚÙaô3wºe¬¼Yn*¶ðû±½UÆWUì\(�' ³L²jó‰.U.ìþº+5éŽù/ýÚÂsâDÝXxZßÙùX/@ÈN+(º9±½ÆÉﬠ€Œá[­WtG;Ïn¹õk~bŰäYâé_´máû˜óak²NÄØˆ5púÙŸìyá 0l1äR=ÆVôÏ!ðáñ¦ŠÚkj×1vK\<ÊÞ6½\¥šnåÿ±@÷Z£L€æ×«þK,ƒQãÔö1z/uí¥#¸w_…;Õ̶=Ê[…œKº~p¢8‹W&—¿·€Mª°­†Z2‡È+Úø8D_ugQѰEhm-X0§½).æ�1/pä.—.ë� N´–å6�Í.ÊâqZ±Í× “ŵï°F¢²ÌY-Ý, v;�nW4+H-ˆ«Ï#;Ûzç9Ý2çÎV,ÖŽ9£‚=q|þgî«j‹’¢í§{ë΃¯¡L0€[…} Á™ 0ì�vWÞ|Þž–’樻±zÒw`lg)w= Š”W§JM‰5PÛîå÷s´RÞ�ï1â>ys߈&å ªä§öéÓQd$/†Á)Ž…qÏ×�¹ÖåE l-ûx+ßa¯$~ÏpäöþZdZLƉ¬ÁE½+*âÁÛyÚáa‡9Xïö ÿ«œKi®éMíµÞ)’rry3‹-_wÌ3º°ÃÚÅw¶çfζßÒÏœÒ~€‚p §¹ùµÝ9.ç [?’…l<›‹-"ÝZ-‚dƒ·Ãœý 3†â ÂBG æ/ ø�Ì„E*žÀVúq”ó ‰bd,Hn®Ð6ž4ˆ¼�þ@­R{%Üþ¯½˜1L–®/VÇÏUóäD@§k…Ak6§¶•ÍdXÄ”9&‚ë„à§šós‚R«`Ùfãê,Ñq½­ö¦ø*?µ#¿ †ga§ŸÆLa)(ØS�ú{Òž®»[ÖRÐØ‘8üK´ÁÉtõ¹ÊŒþ�òk2seB¬Yzˆ¶È?zÚâ–W|8Ls{�8xФ«KÏSÚLh±mO’ÆØL=$ã)…ÔÈóTǽ \åS¤ä5‘¾¯'|éѬáQ²Þ6ÞëX‹G¥aË£j]è6Õ/ < J¢!fà•ók(jö°9Î*ƒ!»¼B�ΦòÁ‚—–È‚,Ø{#ÔÛ©amd:¯øÔXÄ¡»>8&´ä…ªR_ (Ñ6ÇçG³Ú _2R&8GK™æ "^„¬°¹ÅÏ@[Y�‚Êú¡ï°½®uF÷Õe~¯'M8š:×UþßÓÐtï è{ÇzáO§yò˜©JÎù¨øy‡ò`7»ã)’¢GŽ;ŠÃ¿iFv¶Æüx ©M¸Á'a-@�*¤.óÏŠý _¬Ð»Wmàü|½5²Ë�ÍSËèìðR3E\Ï‹ÝpÏ~µÇ;c|OîïéìçŸNóÖÌ{Ý#ËYøè€2…)Â<%ºÌå3fÚ3wŠÔHl†Z+¾°ÎÚhè~ýø?XçúW0ép·£ÎøË‰kšÝÄAtSüg‹ó°ë?�RìñŽgÌͦגùÚþtûO˜¦>à>Û”µ^I†òšé”#[' cùÛE%"@(»g}JƳÁFA„Ž Ûô²òŽÃ„PÞD/òã¾ÈoÝS|®QH;¤ÖX°®}�– n_9úÙ’Šy£€¸^^`v8KÔ)ÖåÉÆ¬JU`g”¯¼~ŒhÈ¡çŒ_¤ãBÆ‚Mu3uêN$T�<|\{”län’½ü5A·ÝÈJ\Þ¹ Pà Øë¤n ôv³ZËEó$€óÅoyu7›§6I°uÑ0guŠP1:zê e ɰPD�ëvÚJ«8þùÿuƒ2ÝÒÈ™jÕnà �ÚÝšÛ|ö9o@ÝØ“û¿w«§±¨ÆíœOïJh¹¶vœ†£´U+Ðç÷ZÂ}ái9˜™Ê9ûõ@i#_©—á»´84xjÀ‹[v¢zÙÄÄŽª ŠZQÕh°1O2—ñ !uSKÀ™rƒ»Ñšœ…ÄÖ�¾Tµè`1ø4 ¢6MJ8­�F^|ÒÅ!ËFq-‚æ z^àþªJOÇ»S‹"Êvd¢Ò>ºÛ8Õ}Êî?;ê-²þN¿g=¬³ŒA÷¬Ã’S”Pø–\D–öJ4zÏGºXj½±mD_S�¯8îšÎ²ù 7“3z£¼¯,ü®ƒæ ’òHC¿Ìª-¨‰<ÐZê£`ÀºrH´w»Sƽ„d°”--È%:e�;¦ñksÓ«W¼ìÍÑôk�ƯFoó…ë÷²´\Â~yVÈð¿á‚âCÄbƼ,KZÊÊTCÝ=C÷´GÆÌŸS0jø÷3Ìw7ö½Íç±Ì¾�éœÒx9úo±5+ %ñUjÑÃT¦ /¼ó ö�8§4T'vÀ0}š» ÝPvº…¡i\ÜŒþǯ =ÅŠn Cº$P¦Ž8Ø!ódf¼ÚÜ�¬ägM±Þ ÊÏ�÷Œ‘dèNµ%˜ÔÍS‰@B €N¢ ‰«trŒWa•]¥´Ó¼”�+íòQ‡NŠ+K^0£ø¬·U^ZØÀâQn·‘¸Ê„6ÿyC¹}„¾£ 'Œ'bNµ¶Å²ºË€å¨IÌZyXCBÚVV>ÜÄ lZ‚w6¸Ë²Ìùî¯láMÁ3V¿ÕI‚Í•,«Ÿ¹åà{�*ŠÛï1‹?iâÐ 6±”ÈSthIªl }’ñ³\<™#íU™`Œ$–ú ²\Z«`ˆºAÂX™Ð€‘ èÅþ:‘Õ¿žŽžÇ§ªÄ½ «ÅƒrH£áiˆ„xŽw~:Þ3|6Tóã'¡1Ƥ;iL_¨‡ÅK‡vç³}¥·£š7Œ)i´6‡šÏȈ˜( ©Š± R{Ò�‚–YV趦µ,y"�¨6ÚUé_¥«jî^ÉwK„]ÍÑ,.�,ß=KPÆøª>`Ø=‡F× ßÉÇåè„>5“¨Î2¡ˆÐ{Üg >š•9"—us¡6 U7ˆ4NWÞ‚5†ªUË‘º]1q«² y0àŠñÒÍùÅŽ ާ#7ŸAà75µŽHn—5ÚCž²‘rAa§–ZÄ©E: د‰AYU=h«8I˲2)Û¢Ù è±—�Ø~¬} tM¡eVÓx;°ôû£üþÛá¿4¹6¯Ã8‘¹«‰Í4o bIôóž˜&gü‡\]BìÀÎ÷ÏÖû­X¹·¥¿‹¢5ý §¥+AlÉ$Wa˜Cfb£úø˜mÜrÎÌáöƒ8Ú%Ï%D[æ[Ú �„ûÏ4ÂÕ`äw;¯ª0C/óQ#ñŽ Èàüù�¬ÞÅIÃdxŽŸ¯Ú¨‘¤L.IB\òbòaV5 íZjžV¬IzvlQ2%³i®Ý¤¥œ!%q:eTá¹é³®ä—¸bòO¢qh€©µ¬lÄK5ÑDŠh81Z+5²Çú@…Uó¥[ã6K:DJA2pß Ø°Š>ng»aã_¢ÍÓ™ým«y`›ð4¹ŒÎ1ÌË8•‚JH»¶=‰¦{o†m¢­||9ïWÖŒ�D«Eúl"š±ñ!Ç«œÊy•GmFE LgöYøÓ)‹úq½�‹c°é„\ð„C»ð÷r#e¥#Bcú㥠Kë# ±ˆ»Ëò NçŒc¦7.Õöo⪺¾$êæá<ÐÑp ‹-xC—[T²ÊqBøFÞŽ:� , šØ �´q*[œÁ‡2Q2¹.ï 73 Ç\ƒWŸ­9Lô@‘æÂ®@¢«”rÖç °ž¬�6 ö%J: ôeXšÔ�f¢ÎûjÕ9A]jÖ‚À0Yeîý„¶ Ÿ^ng0Yã Kp^Ø;”õ�1ȃÔà¸w¾‰#<2©µ’b­bz ¿â¬KEé¥ ‹RÂö ÖÖZJ‰ËbûnV¾Õø ×Ö‡w89€·�²¤¦ëÙOZõˆ/»«‹ŸâðXÃæÂ©;ã©Í}´½Ûs`»‡~PÂJKág¼jò……23IJäGV´|ûŠ«>?˜Õ(ø·FðÜé;/€DN2Ãg“~CòU…+�KK”‘¨ÇL²7k¹åúÖethàÁÆ‚vʶ.Ù¬ÜCî«Ù¼|ø¡lÜí\e(o�ªHÂèÝûOn<ö2Vì¡.L¶j+�ñoÜ<ל1LçSb²:Ëáú£?ˆ/õ“­ {ì🥢ØYDD¶£Þºû:Ž}F�}zѲ¾rý­iùãdK † ÙªòÔêéW-.×âÚ\Âï×ÏÀÚIB=óv³[�Ç\¢´š\�‡›Ø@gR¼^;|ÙÝ–Ò¼omÁcú†ìÈûÝÜØ.D=+3!¡yâå�‘÷¸´g�iÃd¬—a(O‰u+gÄõ©†x3{ä(ã0üÍÆ(0cl1{èÞY©ƒijӋÚCGð˜; ÓåpK¯«Q…òìMë–¢OØ} Z¬.>Y‡aÛÎBã¡QŽXÙ¯!»m!é9ÖÍÀ¹€mÒ¥ºõ—ÒZ¨G>Þ™ñ•AXØç• Ûƒa×u{}‚r o+$¥v7g&É5e«!2×;¼šd0@áí¶ìÆr—5niÃV§“±Ðæ%~d°&÷¿óv¬[5«¸:ŒrZÆ*7õrcgÛÍÈ.^t©bÖóeúKR @`_8ak‚~ù¿m³ŽGÖË|ü½Ì4â¢ж+çU€Ì£;ö ï2…_Ï;J~C½ÂîvTâ²ìEºK�›=q;kÚ-Ó/§ÉŒØÆÛÍSò„J[~_Y޼³| …w€xîÑyÿ<'Ýc/aúV(íµè¾±B÷Tö0žÂs#:Ú÷ o &×ÍG…ܱȃEÛjÝÆqõbÌo¥îû¸J²»ì‰¬vmjhß¶Ap�d I»ï@Zp‹Lr#ƒøyG«ÁØÎÊý{:BXn'/±•Ím»"lBˆv¶%LÅv&ð±àQúÔÃüf.0.P«ª‚‹mö—däê’Ên'B†äç—Ñ�-¸W%¾¼Þ>òmË…ƒ¨o·qÈŽ‰iàTqö¯bŃ!}¢§3¬ í�Mð¨ÏùN÷2Ëž˜F/@Ã�:“tw!§ý…\5$e_Ãj F³9 p͉°ú0ó©¥c:³[. VD¾D�£Ñ±Éöžs°I_ö9�[£~ç§6ºÞ¡1†$ﮡ +½é/€H§Ý^I„¶v¹HmÅbæ _±r±üì­ÀÞu!wB6„³F…èæ^^„0X‡d>mu•ƒ†�gHGÙ^ÓñU÷‡|ì«Ø13N–a–ì9³YX�/¼0¨!C¾Ê´ú©§ÖLäq¨±›µ í¡>±#¢g5ðºÀ*n®j!×-g”VÅMêqõ ð¼½ˆcºä=äਪÛmÜmÝ£YW>¾ß™°�l‹³§ÈÍï� Àeü VýñáÁ˜·œjí¨ÛöòàHF轜!` }éÍÁŠtÙ¹—s=ñ~¹'SK!«M¼–½©½¶.6l”¿*¥×âÅÄÁN/�©ÃŠ#&Ì×ó #‹�ži( €¨ŽH´-$¬Ó�LÚó©Ð',�á/Ô@=�É6ö¶ëdï­‘hÜ0dŠ…x^.V�Dç¶]u'¶Ä{9ÂY¹Jz;šÀ¤¥�ßš@2/`IN·ËO(s�œºC3é÷§Œßó�(L_‡Å Z¶J0ÙÅÿY��¬Âváp¦j }B_VEzúà.¡æ¥”ƒKªh³±4§¦*Ô~kÞ÷gög΀#¯§SFav H>ø!®¯ë¾�âJ÷xfׇ9ËlE±·Ë:P$üøÌ­ äF÷P›èÑÕ·&ͰF¬Ö‰&sâÎÄõEr)Þøf‰Ô%É|!—ƒî²y+æ«Nìüu°w?´½ì£-Q»-·«˜V{_Ÿ1,œÞ:]EX«Su�ÜZIÉPJê·Èb¨;i²ÙLZ.<Ú B |Ë^ìßFä¾lÀ1û³†�Ü© h@‚ ¶ê4Y‘ñÐs$-?âEO@Ø%´ê°ïÄ!d Q @[Zœ[P“#Øïbú|çµóñºó_†JØNÁ¾’-eÓ,>DAôjêÓ$Ó¤°µÝœÆÒ°ú¬9GåÚ3ˆ: Õßt´x_7÷ ùöøÆ^— 1¢\~cÖôÈœý­LTÕ×t–ÓÌèŸT!Ç®[í—cF³¿°ÕÜà.Ãy~Úåds›uÃÖèî/i(µ¸ú#�žïÜy@©_#ñåÔé0ª£Á-$^Í òʤ>rÌ¥×&ï/I¶ÔUn4miV%+}‡E ¯£ˆƒ¢‹íGÔì“O7,ñþâ_›/ä‘ñ›ŠÀ½Å“|"�Ý’…�/w¾1ˆ¤Áv|§ªÃèëWZj麛|¡Ó5lÙ¸ùm{ª�È8,X+|?T†Šo±ÛáÖÇJ§ÑÇPpA>är�Dª1LǬ¶M=�3³[`oµÆœ8¯ópé´ó§¨ sHe*¯¸»Ï ŒˆìP|JH!Cd0ÃÚ˜2³)üaxò’>Õ–Às¾³îv“¤ñC† ûË òÆ/Ò„ïGÚ @î æC= 8ÚÂ碛dÙ/V¼a2¡ûØÌåÚ`ˆƒ3¨|ßã›ËÝq—Ñ@ÜM‘7ià�n*PBÓžrù)Ÿ»JžIÖ…°ž±Çƒµóp”�lñÿ6 íÁðkœÀ[fÿžoÛa�ÌyC…n¹ïA<ùg÷;�z²€ºÏ‘AüW >¯®iÙþ`ƒœ Ó)aĉžç…Ñä¸È‡I›5è‘ô�UògUÞ+V�àRêzl¾/ÐÉÞ›‡/ò#`†9Wæí£)š�Ù.eùºFKx$Ý”ÐÓÆE�aˆWvÓšSg #|•<]ÇC�㪠“ k®WŽ1vÎèÞK^—Ç0ñÓÀùHI¹€Ã ãjåLí`Ĭ £lK¶ýçÎX5sV±w$‹î…la¥šßµô¯¾ ¥Œžº¸ºˆ%§1��ögÎo•æ(lëʲ”¬š†CcÏÒ!»­Gèd²[L@Q§0M ÐÈÚ=lP6êcÝ<“ŒWfµ¾ü ¦ ú¡H"xI ÜénÕ›^3&bŒ}4Ž8‚×åóbÄñ «‘\Ô$­÷¤&õìò‚":Þ´UñU€Þøõ"ög­¯KÝ?Rt¾/šöòþÙ¹Am›˜›£è'¥x�q ¿+œ >f-ád°ÒFo÷¼Q‰Á&æF„…õžú)gÁ8ÞÁñöÔ¼CïpªD]ÇÙfèj<Æ}Þ‘tÛ?Fzê~�6ÒS*’%³×PUÛ; ÝÐBhÓà®ß}ΤSì9ƒˆ-†Ž“K¤ds¶ö;Þ Ø&_µƒŸ[…Ø»† ·º±}¦ßÒ†=éÛä©|œîÇ‹ÇÌt–À`ÿ[ÍÌ{$lÄ_ÞÜ93Yïñ¹^ 1Ã8áÚœuž:¸ ¬ä“ç–=%†áÊ·ñO(><¨Üÿ¬ 8€"ð–h�ºyCnÈC«ÜóËg÷ö¯d«F÷®¹†Ønau6d_)`³› FhG—Eoã!=6ÿ-¼PN_§¥ÊDêÁÁ‹*Iœ¯©¬»…ƒeaýa/9æ‹ýçAÀ8,ÉHžrNFêúÒÕ`,mªû®a8M*k¥^Ár€ ¶ÍáboÍB;~'\0Ó¢µññ[Ï~&­b3ç³ndqPA˜=®ÃêíX$ ADÅâQǵR·žÛ;.¥ª†°½®o¸ëÛV•–ýÔÑ< ¶™¥®¦ m¾äô"0ÎäEÝáîÞoø|¹K3Ëй¤Ž7ÖÛ1Œ[Kï]à ¦Ýeا%¯[méLVà¡IKŽÛº {KæÂ‰ò z![\Y:°Ô¯@E‡v³Ú|‡,�§ ƒŽ‘÷ 4aIqð&%ÔÉÿy|ÓÂjÙk1›ÉÙ@ª€pŒ¨,N¬•és£)A3爗p�ÞT#H7,EÚ,uq–DÍÇ|v´%êYð'œÝ+E¡]¡eïb’Ä“Ö ¾~¤è $»Ò l¶ âi[~“�.sC7Ÿ²ȇَII$ï•Û_÷ ˜ Bc�Øá¶¶¢ á"³|]áAD€º¡¦?ÙÛip¶K„1…ÒfA�ÿBÊnn·x?Á_�ì·�ƒœÅÈgÒmñ�³¾�k|Çß{IO"ûA&°èbŠ+›^·ªÕñQŽÀû‡õ¹�Jßtí~ü¨Ç—Ë1˜.þ¦½s=e·µ}ö³ÍÞꀅ1Ñ$I.¬ rt7°l¢~[¡ðå`ÂíÐ3¥ÅÇ`ºXß8Ÿ‡sž‚"H,w¬.œÜXP("È``‚ *¼u;"ÓÕýkêׯg“œÜC"äûèz‚�Ps|¦.×ÞZä}•—/«.KÝkmh±pyͧälaèǶAÂ+‹öø7*AÖ!&²À×Ê¦Ü Úñ�žùy°:\Ý,ÌÒ¹�Ôb¸”ëwg=PŬ5âýa­Y¿³3·ð�ïy?MöÌ9Ó3Ô>�æ1ckȶظ?E¨SúÊ §ÒÙž¢K| ŠÿÅÃ8&9„³ñy�¬iX'¤}Û)�œ3;I�AceSúõwÉäó—= Ã†Š´:ÅíËc5PÒBé] Ð7kÛ¬ïzšÏ&õ¯·=Þ�¾Æ(C#— EÖÖ«pùÍ�°õL¾þe »"reªÆžË5¾[�ÄÚJ½ä‹Øïyš}�\ˆI ¢ã‡b>@÷³¼�¶Óç&q‚™¼“äÞòþ¤uá†ÍïJ„EPwÏWh33*‡¡ª~«5†õv ðÛ‘;•EÙÒEʵ̱P"À 9°apl ç�g�…bZ%¨Ñ‰G‚ø„Š–|#¬Lßn}vˆ¶=¾ðú¾jßÚ1¯˜¥8ؾš%-¸ Êô£‹I+Iîõ{©hZh3æ1¶\“áÒ°WLd£õÅìU®¢í z‹�‘Râ æÆA=Å_„-~ˆ5�Ÿz†ÖpöA±`K‹ _5�’±÷2‰W.lá7¤Yå¬:ÉÞaö²<¼« ­Ÿ6ñL8Õ�xZ8Ÿ›¾]¶qŸ�„t9A6É´J²i¬elW©P±C·W7Z"qa�-üñZ#͈Šú°d„»¥P¿çCÖ`måµ0“8d0‚ÐÿŽ#¹Æ’ðù|±„Á•«8ýò˜ÝÀÚ7úA³ð‚%•7i‰W(J§Ù&’Q¶E–íL ³†Ôóèú4Ïv}ÈÄß)Î󟼖êTÈ%P ¤ Àqæ�‹aÊò’s¢Qíát"Ý|‚P-¨X;�TR’ré¯%Ù.ì°nx�Ew²)�WºÞLMûß2¹l* Y®‘fn'ÔR ¸Žú)ìo™ÈÛ¨â#,@;û|}«éñXÜ×7€t�[23²j¶ê×9I}êQõ¼ß¥1övýùÒP'xlÉ]µŒ¾Ù·µ�0²„’%VŠûÕv/»“µú�£Q3¤GÑòw[ñç—­8trÛjãì®Ã>°ÛÀÙ³—u±üy óð�7�Åá>ã7÷Eí×0—À0—ë`+/|®è¶³Ï¼±¾>¾Ò'­Ž!¤ï/¬e1v¬‹]ö€U<¹á¬1e@xÂi×ß5ñá3ã%ÀNÿW“NŬ(lYñ\v˾s6±©§¦³ö]ŒgßlÇ‚_I¡8wä3-¡†V—,ç°«¯½Ýã–âת˜oy@ÞáÂ�¸!ȘŒrgN߃ð~±­úñ«d|�F à‡’+|郙åßQÍí·ÂbìÊ$áFÓ†}ªQ,m0+X£COL6Ô¾hÏp›¬Q-Ãâú|óµò0>{o&sYÚ¡¶ŸiÕêú®GÝÝ3k«5|¤µ¨,ƒMÙÕƒzÓ»(÷Õâé¼O|4‚êuseë àÐú ø:"{å¯òÙ¼|ÛhM­Ú¬Ø¡y×͹8#ÈW$,¹"¢½§‰íQþ¾œ(r½NqP�_UBçAë'Å aòüZöË14wY"––Æ8ÌQ¿fmò|ÚÏï„òrì×¹Í0§±C®8ŠÆ©YÌ{Q*m[>ÒvœœJ#âèšUãA’+ŒzÙù«‰p±>4pi$k/ž:ç±Ã½�›ktîÖ–x.]-§Þm”pÈ”x5™˜ÍßÀïa×Q}já á,áƒüÐ5Üö~sÖì‡ñsEn>{&©„äEkìh.ù~J˜š|›Ö‚®|ïw-gcúh�°üá×b�UðWèÈ ºi1–urH}:>mYÕÖmÒÀ`®ˆÎXŰ…CHå=Û«¨Òz8¤Œáõ¸ÜµÁÅôõÚN³ŽÍ‹ºK:.í!i]°4zˆ¬úcÐ*‰•àGï–PÃUZô·‡‚ïÔêxàg^о•³ÛxéMîåmÁ³bZÜál–Ù1:YXÝêz!¼‡8k�Lr·Ëž¥K§"™Ä4öµ¿½Äêõœe9Þ}–’]2ÆÆ{¤ß欗ÝBÉVÄ€æä‡7icû&Yà“Æect—Æ<ÓYE×R‘p„üs°4ÔºU^z[ù2€ÓÜœBúÁPìÆ©DF´¥µû¸ØÑxê Ç“·é&[”ÓÓâ?FÛ¥=нéσ!¦¯G;Á™7SF¸=¥":Ë�,Í Û‘Â6Œaç�8OÕ‹—jbo«xuŒ�Ê >¤pÛ‡`vÐß~’ÝÄ}ÙNq©YŠé.7’½øþz¾ÊÆrz”–ªÁy/.üýÐAèìùÅ,pÉE9i+,Mž-êê)ûZåLiÐ͸†?> }ç½Û Àf,suÏx(å˜yµjñ*>mˆÓh-Ôî2oi–¸U�¬'o'�Äãü>v0Ü©ú—¯ü××Q¶÷ îás» næÓ é_T2(oô$žæ2ÖÛ/9ã¯I¬Ö™Ûþî÷e›Î»¿NfÑ¿¶¶R»Q˜k$·‚¾Æ–¨´®WÜmL±g\›V™U™Èc§ÂLLôG‡‡þ>â+&-¥ý�w˜‡‰aθPŽ šåsÑÞ„CŸ½¬âþµZÉ•Á.Þ-›9±£CË`ÂD‘°@)bøœà>»Ýö"Sxìs6Ô`64�ï±”�ÆöÑ…1øD‚ѯ¾U‘*–•Œç窼*ð^�¼AtsvS�¹QDÒP¡€þDK냸-\�•áHȃb9I âÒ×¾k7Ó~­�­ªRJ rrIHÖ _YǶ�†B>Éø=ÆîC™É1oï©Æ=-iú #jk9%O¬Üðö4�d¶9ý�úí0°lˆÂäJ¯äÝö9l‘æÙ ß¾¡U’ÅX6 :}C8+=ÿ®A/gÙRô¼Jû¬á3œ –ü8Ö&Ò©õ¾íï×üL¹9·Ç°.é¤5½—`ƒoÒ‹±Î1Ë�y•æ‘"”4;Ο ˜ ›ÆbÃøÞ¡pp†¡g±^eBföê—•!”%¾N¤È+Ͷ~ZC$Ï•™Ÿ²ª'm1äv¿OÕtŒ‰âìÓo[�µ2}ß>΄yŽý€""[y\¿™WûðÁ±™qZf´Ïð÷Á›9™Š {â‘áÝ1?ÌN^µw(xåNÿV°³í‚ÌÛ¨œÆT´XßðÙ"¼;“ÏFO]T‡·ˆÇpU=ªWtè¦é󤀔nÅŸ«ìï0ÇìörŽ¡ž+k�a°z_ œíóÊ6<2s·æxÜáÜ™ø;oÞ>•õ¤þMç4+f 22kƘ¨íUÓÍÂ_NRfS\q^ç*ñc�;¬²ƒÛÆ Íí±Ûo D^$£Íùù‹„ØÄ@Ô>û`ë?HŽ eß.œîpš½×»Z9©¬G÷ŒQˆ‰UQ{®!#E;nÀ®žÇ`aå÷,B쇽=øYésa Ùù�çUAo qU_áíðØ*Ýb;³�DgœQÌIÅ–² yNJuÒ"ƒ.@è·æ¯ŠH½Ï˜ ¸zü¶«ql8]eèÍIl…7üÁ”€ÊÑ{^oS½óÍÿ?úÔ¸%ùcÄ „_ Ìm©ºuÜÍ!'ˆ…X2¯•Šñ|+FòÞä»>ráR<ë% Rà“KXCŽ»D ¼€�e�I¯_6eàñ°Š� ?—S8€ohmÛk’Òз•FÙ”QÎÃÛ°˜˜NfÞ±v�\C'Çδ!m>Í¢σ9iÁ@×ýÙíº¼öXó½§�ÎFœâ7¨Ä÷ ±,.¤o+I8;ÃáÂÙ�‚ÇH'[-Zƒ:J„ÓNmQ6ÛoS�Ê¡È …Œ‡DŒ ��Aüf2?8€VuÑv8ÏÏÇ}ñuv£Ão*zVMç‘#îÊÁJŒxbn;Mœ,—5Å‚ Åy;c]ù°—žôÀã�dW.¿Þú¤Â kíÝš¦úr"À/ž ìË� |‹!šp£_?߈վ>öøÌùúÀ‚¶÷½L›ôcü€?~Äs‚?Aíš÷VÀ_‡‘øø�Êì*À�Y.Æ3æ¿IŽo•Åeª<‡¾w7O¿±Jµ³µ„­]ù»½ä¡ Uu€Ï`þYƒÉÒZtúSò]¹&¤�opÔ{ïmYíž-kÛio!ò§ª µ�9rv—êTêò½ÒÛµ uá÷¶ŒÏ·!]±Àv‰µóêš²T6NÁP]Y·ìC»®ûG¥æ£bç©�Á'-95¸¥¸· ʉjZÌv¤•›Ž Ïμ\’ìþÈÕËÞ{~ôÌ«†—Ð[¿µGˆ1(²ûEGDïqF¼’sË~÷4/;ª9ŽêÃ&·ª9h0|]MVµ/€P<äë/œ=¢y^.îº�ÙÀNE¹Ž1EÇÉΩ]˜Þ�¿�|™òn�Å&»¸é` ÓÖ„UsúýÏ‚E�ÀyÑ�¨²šèzãóWÐJ¡Ù–ÏK‚ÿ?7ö~ÄHx�?[ói>Œ_ãÆdפ%žò`Zl7LÛ¦ f¼ˆ¥Ëƒq¦š³Mc+FBTx¹#D}ËžYOYÌŸM«È Áêͦ€Á‚cÞ(ÅѰԀï@…î🗒{c¬X´…—ÑŽ_Û÷·p×9ÖZâ&m =õGñ�òc�†tÚuAÚxuœšº{Û6êVy­Ó@v¯ªä¦w“MÛØôõ¥ áP´ž î¾ùsú¯QÀ5^Ÿqmo¿»øãr‹ã[¹D|ÜÝXR.Qb'Í�›´Ø¯F-p�°ïJ?;dRؘPçÛÅpòMÝñ$6˜$ãÙä‚éøÜi­wSÖ@N.Î*Ú«ß%Ž×GÄÉü7JèÎ�ª;0å±R7éëU÷íƒ4Þ·�iÙEɺ²¬`«µP„Pº}j5¢úùBú e_5§ àmmÜ›îý¨wºv°¯Å©/^ü³p†ü£%˜¯†rý÷å÷´ÈØZ½6Œ§‹»Kó—óCÍ?%ß4;Û¶J†e_ÏÞWÍ»žùFœ|êE˜p$²sZÙU$sTnîaó^_s¬FˆMŒÝNjÂ8ç´!¸æ‚­æ�8>÷ò¢ïÈvCàXs�ù=ËÀ&YÐ\§nó¹Dœüeû@ÂF˜¿^ž¾5Â{ºkGÁÿd‚~uTbÙz‘7) t–î�TÁ‰Ïå�N€$:vrº7�›®‡½G¨q޵öÖÎ�c¨´7ô†æ�¡7|#»~€½n#~ê­ú ù`9É¢ùKäõ+Ú(ñɱñȸüiy~cü[zØsVFÍ>»kl­ß¶ÔNïÔ~¸k]UœJé;ù~ø7ñ?VE¼=±Ðû_ GÓqº³š õ3;'ר ‡/Ÿ·¾Ø‡ó¯°SÂØˆKxo»ª_,�ï툷ç«�çXÐW<ÎöÍh&Væ*h땎cúë®»ü`–TßÀ`7/ÐÀoEtFùæçÛïsÌ’ïÖv‡kxÃ?–Üü{¿Â¹½¶½Ç99‡ò%?aÙôÇÉ:×Èo< @âÄåRÏP°ÚÖ×>Çâù-ɾo.ò¥¥;äÉgš³`j=©¼ã¯¨uL¼íNÈÃ&ê ˜•�ÆS¨�íB™O”©‹À75}²2X0Ô±pŽem¶¤’‰ƒ(gŒ�²¬ õµu A%7˜Âbå¦nvq!¨0ÞU‚1C~§¹ì}Íû êï땸©‚ŸÁ¥”ÛÛ;gbî²Ë1Äͯwæ�¢Ð]eŸ_¥¾H¨Æ§¤¬’¤k<ÏߪÈwùíz}ˆ[n”Üèût428yH¿“ ­,zøLNón?­Ÿ¯«Ø�æçìåËAhcVjŒê¹¢(ÂÝRêU�ASPL«}‰6“¶ži�ô²áCµñòiÚ޽ؔ ¾SÜ;žM°Ý}æWo¶kò_€ƒt~Z5œÃó8w<˜aZ§”dã =¶‡�š¶7ˆ˜¨v~Ç‹ÑA··3XãåOõ" ìSVö/Žùf[ò�˜iüîˆW4…¿Û» 1Ñ�ße.Ìòo¤ÞGå²Å²1gh\ÏY…·�è�§ÞN“|†Ýru‘]›°`©ûyt…¥Â«AÂC�$ã0fvR<ª�3þ¹.†�ÍÐfâ׿2"¿Þp2ÇeL,Ü]êJâ8X|y€¹AâÍì~`Þ¯ÂÞüÕ„£ÓÒâš_™‚}›Ü ­Žnª9"áÖcX»ùŽã >VC5r¿¸^‡ÛÊâÊæÝ¨w÷µèÞF$Àûä&ã‚ëi>aª‹C0z�¾Þ/Ax�ŧ�wN”ä¯V–³S `;"®ýNU'ôÊ�£j±`Äo¢œ×jo–›�¬ |•§;º!hÓÍæU’ ܶ7tz>\¶ÿÙûâÍGçñͳ[“ÃHó?jUwȆ  ¥eLÐ2?§zqdçÙû‚1w¡èþœ…‡x«¸nýfº±ÙJ†êãõTŽ�|ó£ŒþiMÑ•jø­j{m‘j±þ\pŠS¢ku±‘Wí NÀ¡:èdPGMl%ø�yNŽÛì2(3�ê#ÃYà3ˆ¸Ô�#¨XGòÎ6ƒÈ�µ@Še†È[n#Ü‚FgäM‰å©ïô‡ÃŽÉn$tõ+XÂ_,uï*õ CÙ­Øè¸ïã� a'‚Äú  iemÔ©¾Ð°ê�D£q8öST±¬°$.¬y\e¹nnšÓû;¤á¸f£"Ý÷Úo!ÈÀ =ká?d›bUÉDóE:°pØÅkå)_Õ¸¹æºÉöe­™ãº˜ýâ¤P’UÈÀòžÎò‡Ç:›²�È,5\¥äacþ®ÿ[?ØîL}0�œ¯sR<Ÿ3é"ëJäð£ÌB^ñ �›³.èô)¡²!Ž1~³«åvä’Y›¡™=ªq&4ófkr¨áyDa¬ždƒ¨)RÅ1av€Ø<=îDé‘;¹í�ùTí}1 �óý$»#ª×¤ïÍuy­ pÈsY8(°‰ï“ªg ®sPeËÁAìÿ�´[2¨O–ËØ–}�¸¨îå0)ǹóÈS1ð¦úæÒ,·/sëzÑÞw·bž'×øÑêØÉ2‹ñekZ·)´;§«V0ôÑË?E––œÅ¿+ÞÕ±Åû3˜â]æ¸ÿNòyÎ)RTΗC{�˜—ncBnფ3öo¶yÜùw›;—Mšn¿NoO¦Î£9®A6“6&3}Àq®ÏDn3‚A•11ØÀÑE’ $I ¤¾3ïÕd¹ LÙÜáo¿=ÄûiúZíª¼ ±'(î×f°î‰»´urq5‘À!æ_2cª 9Þ4ð*ì¤Ùgõ84y+ôÞ€ÀÖ Þ¾Êdu²ºá’�¬Ÿ°fhV‚•¹í <\b4Úª¶ì�<0Øè½�ŠÈªô‚…c …z+EØm9~–˜�V…ˉsAÍz³Üé÷§Œ>3ûØUßÛ§rR˜ý³ RTø˜F ö$\ Z¢ l×L!ÒìÚáj¹8Á-”B›x‘Þ-¡Æþû°Š�jÉsJÃ�¾§n«‹as–j4lˆwvuênéYÀ)nÊoáˆæÒ¥û¹R¦È¿.|YpØ•†ÅpZ qn¥Õ«ç†šõÃJ=ÌC%ûbBzáN®G¬[ÔK(ÕëåÓ—ÏäùriŽdK$1N_ï%~$•¸ŽÉ8M³fk¿¦<„×AÎÞžóK;¡ø»‡=›ûE|ö�ÜñWæ·ÚPÅ8õ×j~-Šðl³J½™iÜÓ×Ì ñ±o¢‚2² ¦-|!«k£Û©Ô°qcøa% ™ŒVa3ÛÖ�6(Ù1Ê7ASsVŽz",¡ððÞ¤þœò[ì}m’m8xàvÿy­œo}XeýÙýn}a<Æq匮/ž}ޝvëµcId‚Ò瘚IFê0™Œø'ƒ¶œRG\½ã–=¶†¤Ñ+´–¿èçÀ áv]¶o,éúMÈÒÞ~‡¸a)<ß)æú «®-o­—:7œ§k� P˜ %äókcöüßõ(C~u°œaíè_Êsvد÷4ÞUÒ�9çLIŸŽo”)m}p~òòž]æì¾Y8ν¤,Ñ%�•2ˆ¹ôõqq–QÖiü,›®¤Žù3]Ô+ÝÒ˲²ë{g¾˜�6Ö ÎÖe×é:Û¦±!Îgw˜“ƒ-[ÏZï͉-i1ø9æß=Ö÷w¡î¾#l;Ÿ9ÑnÃ(`:ËSЮE(öa‹¤@FTs°=ÜUCâç�³Å:¹'Ø¿Û.gãØÇi�‰}b[RØí׺˜Ø‰EN™;„èõmQœ¦§'ùj[8Zƒl‡°Dæêx²e[œK„·kG»øœpQoá´Ô]ÚúZµ+sô1|·0g¥ƒÛ«8‡5h=ähI}š�´ørÝ3ûB®½Ë^ÓÙ2€Üò�ÛÇ�¡dyÆ>Þ=;´µ ÝõZ¸;Õï¡$µøÂlÜå*¸œYˆº› ñÊíœqjU'i¢É™J$�XÖ(:�y�¨Ä†RÚ‹ mqõ:W6öȵȘÀãaN§Ý¥ë™zq-9DÂäWºÂZâÍ™™.³wÞ_0 ,Ržm¾ŽÏyŽl6¬.D¶9�¼©ârw}™ƒ ®yÓüÝíøJÔv®Ì¶]ƒ‘œ» n?^ÝàFÔ>laQüþ·éL´‡`I½³ p�ž±ë‹…¾xí ´oU…Õ�Û =ý¬‡ҮцÎù]Ày÷ZÑÝ0ˆÖ°ˆ/Ñ"¿¡ÖO¯%[eCè}Ê1͸4¦¸‘œ>ï¬ìì ú]¼È´GÒT¤fD$"r™V®e\Dé¤âîñUûW0-Ýiü\šs€C«ò“Ä­ÜŰ(%9<¥¤bbæ FærirÐîòK%¦m€°nc‡@ÔnøÁ£5ý@ 6ŽÍqGm¸ÍûAgpJ¸±yÒÿºä9Á`8ÉmE*þêÂ�›¿Ó°NE’ü–£»üfÛX8 �Czq¢Œ¹ý‡5|}$ ìY{WŸ¨Ôº`2QMdpü~äFá&ˆbÏŽÆï+�~)§Ã öJ}¶ ?â)72þ*äÄŽÀþMú»UՔ޳9lµ)�K#Û6Mz†=…fÕ`ü¸_‚5ß�”õï†3h‰ Ûï•¶®{½5‰PÊý$´é|²8·™¯e¢(Î6lamw¸Š”¼Çݾp‚G(Ún—R‚kîŒUìóTåkc5u›h@f¾új÷h›“¨jÒÕ£µHe¡‚ǸÑßµ†µ›Â¹C)åí0ÇÙÍ@7H6b�­…¢²RŠg¿TF±{�ª*­ƒRGL !Õ¾²^`µìg±ãM~øCžØa¾«Ä( GÍ9ø£w-é0bvX‚ÔVDæð/ʏÖÃ!;  |wFùŠ„QÆæÉÅ¾‚æzåwôÙû©Ãb÷Öâq¢œÙaD,ÍÒpµ¢w’9ç7¶ �˜ß,J“i¡S7öôÌ1î Û7ÝᨠÐM| óéÜé :ùâŽyqö`µó>%W6Ö¹¤õ­Jê=¾Ü;î¸Ó5ÀVÜ—¼à"fî,7ʶo–§Æéœ¯è©>M—d¿r(Lo;¬/áʱ^­Ê;e’Cë{>$�÷Á`ü±gMŸÛ㽿c¼nm ·Ò Ö·ž9Ò™“b"ö8sybCœ¦GTìÙÀBµ¾†TæÙU®_;ö}M¶$ƃۡè3ÍÎ証œiP\Å óB.ä½8OÚïå%lEYÏ%Žà\ �i4 FõýÔG�  =^OYãq”ÝÝð\Œ'.ƒ¹<šeòíÀˆ/ðß‚Œ÷¶¢H±~ç5ÅDT¥]NL"Ó¯À¿æöl³âL—¨q4% áXêÛq ±#‘ô®FjY‹Õù�7² à¤eÒÔ�$TÌl,Õ6¥rº™±ìRÔì2ég�Xs%²N~¹“^œ&B ÐKæñ*uVÓ£P¶ÈÎãRÅw9ª¥Ê:Ñ=ÞK%Ù¿ÄRëûY9êB~¨î“‚ïÕº‰åRÀo­¤�¤øô§dÎôe&\¯²›«æDmug_›�Š—ÍSÔà’ß_£œ5ÁÐluÚÌjo‡ðRŸÇz±”Ÿ‘f/ï‘æ9K÷OÅa¶_;VÁÁNÖòŒõ&¥‹Îp@¬� ѶÚú\X¦ð†] CT*y}’ T�<­p XŽ™~¥Ý7�üïŸ�í»ýìÖ,±W©Êy²‰yº[Z`|!¦ñàZÝßY´¥¥*!îè)ƒîf,‘.|Ø‹<õ­zÃáVäïˆËZw,6”etRSãfi°ÌŽ¡V‹›Áç6·# xÊD î0 /¸wUw›Æ'LaEûÇ`-Z„€û¬­8�¸?ˆ†HÞ’¢wqýƒµ?½‹ÓŽçL£›)3Žº[rïCk« €¡Ý¾>À×u—ö¤ÑL XüLiOl.WByrŠ"¶ä(2˜Q$Ôï(†2¥æ‡‡üW'¶-MU"OËl‡ÖÆ‚ò�-[#BÇ6Q›qµ-¯_ËÜÝùƒMóh¹X¦æÞÂõ´”¾�!žÁT¹Ä`éïÏMNdû´$ì^Ø9¨ÊÞ*øÂ"Ì–È64³‘LDÈs‚ K‡ ¬#3`߬ÿ²!„뀌ÉC—}­ÝÚÚñaGÉÌ×AõÊ`¦Qçð#ã2u…Û[+ Òâ*s~ùáØ9Žõ8è¥íå—àÄÕýNÓÍù’ó'} óI àø²ÀAôíeQÍ'¼G5œª·:Ÿ]ù- x·ÂÏm®W(2O%Y~L|-fuªÖàE!ÅRÒ·˜Í¯¡£l�ˆ–Ñ ç‡¡. Úш˜Âr„" ÃI)w{èèuF…~|¿¥¶B¨¡0žœç=ûW¯'ÏedÎáepM©¾„…c?6ŠŒ,¹‰ƒžâü´CXýôhЊ·Ä-EÑÖRZ뽓 D/eæü¢›$¯Jy[h¾!ßo°ÐY-ž±†˜ï/l»FA„õr þql¡•n®EX¨@ãï±õ--Œ¾®“¾ ?2öcÜ3aÌCi l˜ Yíe™ £%°]�‹`8„åuÖ³d©æK°QhŒ*³UËŽ+Åá|>—‹à¤ÎƒÜ•i[±³�†ñçh<«ëöP^c{x–àc 0«ú|§m0Ò‹‹2Ù0�µŽc¿nÖ6�Êá -‘’öº6ùlÜ_~ñ¤5…ª÷w Léá­v¶0?¶m1kséîÔ ’Vi»R É¡‰|=¬M|[˜ )ß JÇsÀ‰$ Û-–øžÅ'ðÇìjV"ÙR§¿ô¨1Žs¹ ì:è|c“1Ÿ®6Þ‰J”8 =eûV•» íÎ÷Ïè¬mCMû7ìÈ\#“iqÑ_J ʼ Ü›› ;�Ý,–g,°®ù¹#È…3\ò¥€U £jdY™+6ölÌÉt“Hao*®dXÛ§ßdJ<›î6lºm’*Þ([ŽeÂ(±b!=CWÅ6n\o:ÆÛ7ò¦ÓzuRÝŒà¦=zÒWu´° :É|�o­.£–¢æÿ/׿mÍð¹�h§{ÓC¥Â�ïæµ’ýù,Þ!vºZU;–Çíb›™Ä-“¤ë~½"(1f5ùW?²ÁHF¹Ê—ÍI~Ù´F©ž&Nn™íVW5•ðúWb¹3ÜgJ9w@ °jaœ®í£¶ðϜጯD5Ý�²\`ÕôÒ ‚ÒИNŠr‰%gÑM ØÆÍˆ …\t¹¾F©¥, q£BÆÐ’Ɖ\àìÝÓy·–Aâñø†í…4T²§S—É(ÑYØÖ%£èÔ«(çJ^ÖÈÛØL”‡¤vô%`‡éݱR¡þ¸JŒ¹M¥¯| �àxUm¾+Ùõ%?w·z›m³�Ž„Öò}�ýëØ.#ÃÌÅúÌòrR.t{|gôõÉq—…­Yª/1QD `°×æ‡X\@s›†¯{"۹寈Š�÷�[Exu¤Z-ñQs ‰?•Þ^y¹ÐJdÄ£¸;=äoz½×îÕ››O_õi~( |ý¶ úm‘Ò’PŽR©}«�Àò¯Í^f˜)#¯c!·})m¶*-‡âò©µ Bæ~#Œ>”cPBTöÔ¢ë ٬êËç.-ÆûÆœ~ÝȺA!¾ž�ˆœž~Ø&[a®éÖ­)†Çï¼HÀc€éþº}&d¶–:Pp4E”¥LY^NžžÍ•„¹ð/ ø'¬XóRG1œ áà mš°µ¾Gåkaí %†ðkʵžÀÑ£è|>öºOY®Þö>ÚÓPÇH>#À >–«U&Ý uǹÁ³ .¹.ÍZ}ž�‡E)­<�î‰NjØÐxQ#¦ñÚ0T»}­ð]Õü¥Ù~šÙô8×T=o«©ßÑèÛk¸R,|oM®µaÝZlDô´ry›/׉AýcøÅ•‡ê-¡êÄj7 ³Ûí|dÛG_^ØÉ³9Ú[†ã^îMZF–lÓ»“O«Œç<"°¯ 4`nÓàí:�ãB¼˜Vï™—zX¼v–ló=­�÷Å’Ýd´r¥Eõ\Ð`em«iEt�§”¸øïFAÓI9}.{âa�GÇ&ùÊ©lòO«`�0öážÁ¬*@V™“ÉÚF )oúÈúQŒæoÅ“kz‚OŠÀQÀ^VãòÙ³©• å@r~wl€A&¡uiGWUlŽìˆªÁ±\¡c¯1ÐÜDùbÜPÆéÕ»N¶úÍ|š2³ï܉ñ5êÐâh€ÔØHEzN”Û½�SÛ£�¡(Œ‹7ýž¬îqUÖs·®ÖWZ•ÐÙG¶¶K¡¢ ™Ô�ƒi¬.=ÃÔœµ³ðÚÓâ@1®‘×TZ™©” éþC>¶,ÙU¯]½‹{‹ÐÐ!²©�¯¡“pÐâh¿mÄ[í?é›û§ëö3K¹�>2Bka¶Y:»^á~~ɳ–¤'~ÀYŸ¶#Wáᙚ祋Ž{�ß½X9<¸`|ȳGQápû­áÀI_ÞE®n(Gzƒ ¨�¥\¢äQxéYvÛÞ ïÀîM‹í`Úà3BçÉ`Ö¼ÌA‰làÚn;ìØnØ¥š€Žå/n?N¿&ܪoÄØô ÿGŒY³Ä–AjÉÛaF÷;muŸbÞˆ+GW¢ìÈ©-7»Æ*5ËSù®³Ì]n(‘@6à¼�÷Zßn•×á4¾ˆ¿h÷ÍP0 æo‡†‚Öèï’[ ‚"m¶äžÈ~Ú{í{^lŽc¥~²ó�ëcâ*Ò mîÛ–ü’c$ÅËöÏ¥­@f&ÂÈ·øvô,, G‰MøÆõ•0ë‚îå¥Î²A/9ž{6Ôç}îÄݬÛ õÞ{%]¾ÈsM±(“ë ‡#[}›8¼G¾ÎëçsŒ2ðz¦žƒXR¸õ�\o\Ǧ2,hå9àxýß·°,}>ÖåløÐkP«ªƒ²=­{heSB;…ámþ2ÂSqÇ«Ù.j-ýTØl?éb,ð&ѽGö BQ^—„ <Ûg^ª¢qßÂY(�ì¶ÌÞŠâ}@K Eˆ1qÁµ‹S�·ÅÐ_¨"KWN¨è2$Œò®ê¯\øœÕdÒ¯F�Õ’•qŸŸ ´¨g'z»?•“P§ ä˜üø Xó!Œ+h[-q•¹³­%³{°®jÛK#Ús½¼k$[z†Ô'@ƒ §øwkÒ¿è^n_)¥ç úvhh¸˜ÞFûµd½¯�¡ÍÞ9]öâwüÄWøîô¤Ôvf¾¬\~êS“›qî3WŠQÊ`0P—'3ÈdDgj{ùêÎŽß^矣¬i4´Ëw/:»×¢F7 H¬—ÝÊM,á¹4ÛSà1Ÿ²û°1�@¯>x4‚¯JH”DÜM 0‡{ÝØÜ0StŽ�MøAl½ür�Ù�ôWô—*ÉŒ¦Èã~ËäTo“8²©“Žþ¿êoök/äüžGk£z´â��¾Ào'i1å¯y»ag!®0À÷wÆL‚A4³zí#Û ß&;ùO%€ZM•*F‚�•Õù ;Ñ®ë[㽈¬(®V¦hjœÎ Ò`al ÐÄ<ƒpÍóž×[�ö<»1¸&ÍסîÌIÀtâgƒ!ˆÕ”Õq‘ºÈg¼äÑjS¯Ü”€ë ÍEŠz Ì:4…ã&ts¡M¹¥ :5É2¬Ë åÍÌ�Mö¹ã[�§Æ+}eôLƒDž)¹…}îÀP ýôÞ+Ú�þl¸¦~A¾Cb©ídèA%°jÌÖý'=Óž;`�•#ÿ%8XY·Æá†žžÄ÷Åt üÿ° jM³4’ÃäÂ9ˆgRÀ¹3VéÁº(E­Üº�-O‹\qtŽŠ8h>}`bʧ‡Z‰bj)ékµwB�žðšÚrÞ†ÅX»œ¸‰Ö^àqýß‘>} æ-Þ»Iõ2´V|ŠÞ¥q’m f°Â ¥Úú+h”‹ f‹üˆ%É”¥«Gëkã¥hæ@Oƒe©v,%ãL“6É�=3zž;ä÷pËbî+BÞ‡[#ÐNÂUcƒ‡MLåÉh6 ˜±¿á�› :3~6=-!›D¥À 6W>Õ›}I‰= %$¨ÛÖËX,zÔi»²‘îr)¬Ï¹>i÷ѧ©Cï ¼ô!üÀ'pAD?ÚâÜP§£éÅjp%#‹£“>¦ìî`1µ&÷ÖšÚ·hK†C¹|/–º’E“ãJ¬çõ³¶°zÁ]so5p:ÄÔý/]¬øy²ÊÙÐKO‚ù„öüÚü²Gáã›p´bйµ^ëa£ÚÎc˜[0þ^¸=­?ÁÃÝPÕ¼Y @ Àéìópø0¹Xit<g'AŠ@ W3`{Ôœù¥<ÌQ0Èù?' ýÝzƒyvíÆsb&mŠoœŽ¸U`À˜x‘ŸdãPµ­2lX47†ýŸ ­H /0O,Òoåkþ–z†»í¶«h°7fî$% ò>xU×D‘}¥¬·©îÛ…€ˆ»Íð\œk Lvd8I;V‡ù"Ä}­ ƒÏÇú§$b ø·E íE`Ö¡Ž4:Ñžß¾«×øŸó´YÔîH%<Ŷ3_ÁY Ÿä3žw"ºЀ u|Ü7a€ÀÍÿhÁc^Z °„«½Ë�¡ 1ؽùSý«ç-iûã~Û[ÒšCb-ÓÇF݈»léS·b”�å’úBv8Õß솽—1`Þžù&žhÒÀºlì¤e$‚… »Gs„ Ö7ʼ_´©:/¡ 'ÅBz’¶Ã[ÑF¼Ÿ±Ñ´yAÛ'¯š%-XÀë±Gv�UX»åå }gÈzXýgÈ„UŠk¿ˆâû©¼˜¥ƒf1{æSÕ†fDʼncÂ;áÇ%,TPOÁ$¨�§{‡dM6D4N³å¸DzÉ.�†ÝÒîÑäÌÊ|çhÕÄ�ˆV]Œ0[€AcÂEWÍ�°ÝBd2he–h�u,3"Q\ß"æs¡™Ö£[Í¥š,pjZÊ'_B¬¡‹Tëªw4k”ŒêÛ�™”ÕÁÍ:Z4±�vøe" “²„†n×ÞuNÒòbêþž óDOŒl4$×—ØÓ%‚Ù=ÄvŽô݉P½�÷¨€ìŽq½(wf{c Òl¿-O2 \C’1:)§ôe6×r¥vÕ’#h:åXËAÃÈϬøÄÍT쨬@ǰ‚Ìhý²ö÷'yîh=|Ûm¥.â}n"G„öœPgË›¨õigŶ6üSDQ¼¯{Æ�Ëd3lµ›Ï«ÜŒvÚØ±ðÄíÊL’Û&a«H&0OŽ3�?Ì4N»Ù�öÈÖûù{MÇdÖLdœìêpdëJÇ¿mxä�60xÕu`Ó¼…ýÅ‹+zË[Â2ªú)‰­”Õ(×V+FNªÿ[Ô Sr €âr/*õ�ÂÎlbZŸ‘Ÿîçzß´ÚÞd;�Yè‘Ò,ŽÙͰô"é‘KÀƯç»ÌhH¦ÔKk ‰–!­È“Õ£4›ñÎ&÷¡ÁêËæì>E8›=îw•l­Z¦šÈH2áã°äJ°Ýô­bUÁB^G ßdE>€´�–«@mÌ5à;¼U¢C¼lvt‡ÐÞÖÀ*AÌ[¶�–c2Õøî?žn}XóD¹Àgõç|Ø$ð(Ñ'y½'d´Šù¾1åÑõ¦ðé;F„p’q˜Fûey^6Øpîâž�KöNÂ>ò™oÍœC0I+YB¼!ôŠúk%”�×à‚Ö ±‘È;Á@±Å>lÝi¯V2˜ ”@ %öPlº_<\Ãýl?L¦*{H×FÅë`IuXŠÍý‰8\qæ“ÖÁà¶äù —½Á)ÌN`@oŒGRb·‰YëKžuA®±àÂìo'핇WÜk° “ –‡#I¦�̽ÕìZn…ê)+�òl8ñ.Üìæ'Ð*µŸÃñˆàªSpë<|ð[1Ìî˼éÇÿq…³oµ•l?4¯wü2S¶ûváš8»#²´‚†–ÊÍÒ/ó{¸@šì;ü.·¶zÆ\³Õ½.Ý”°ER?Á{Œ0|_$¯WOõùR÷-̦_væCÁÜ¿ÚúSq µ_ìe�ÚºI÷k­€0L„dƒ4Øb«‚€Õ|Œ‹ëÓc€h²é¯w"�„uß™n—•Æï\—J_Ád+›Šyìï~“‚Éh<ü$µì@Ñ®�D£ã€OhÅ ÕÓ[q�ÇmÌúV­J\%.»ƒu“_ÖjÆmmÛO¸-œX}2É�¬Ù)­ÑÀtŸ;¬à<ò<$²Œ ÇK#ž Ýù±./Y+­|[Î×AòmÃA ´+�>jÛÀ —9©¬ß{É�©NÊN^0ΙtC±>·*õ¹LM>ãwo=<�åŽÔ’µ«¿ZmIlú3Ù È¿k qÛ&>|"[ïhñ:=Lçi¸g›û2r'm˜³ü”ùO—£Ž&~Ñ CíÁ7qr@ÌÉ7Ò!;pdù··‹A”»)²/ǵ±&™Ö-³•WÇ!5òè©zb«“L(uý•öÃí˜à3›]N¶Xì|„a²Æ®éúÁ)̯Ï�-ñ3“‡E4æ9²*Õþ,3øU®ú§X]ç©çeÒ#èÍÑvK¬Ÿ%ôÏ�.¥‹z)¾zàõ¶g'lƒ…w+0÷Ôb‹ϳDz¸ðµ«¤¿;[˜^&«ß·›=Ì(ÕÇ¢OùßÀ|[¿ yšÈB¬bséü¿ ig }µçXÕÚ,ÜÀ ïk§$רDc¹Ÿ(:)}yŽòñúÆxšüÐ\Ái¨ˆQ ÆÖÑôåAÅ»öƒƒ[5ˆ{¼å£‰V•@e蘆vi¦»u ë Y’7<5ï£S^-$é¡9×®P@ÌNgÎÉ#·Ëu¥—<©p4šËC0#Y�Öö”4L[Ú ¡QiÁºa˃j÷ÚÝgŽ^mã<Å]Ï…Ý"`’¹QϸÚc ÛÖÛ =ÝŒ(m(®6 üu`uÖµP«§2ÅøÂÙ #Ý1*ÜCGãx ᾆîÖ5L‡[&þ÷[f}ÙáP4Üb¿UâwjãÁ¸<•oµ„�UQ_AswA©ClÒÅZÙµò]Ú¹)ôQG&­K*8F,qZ¶9Ôòìãï3Åw·&@€þÀ A_^ò›]^òôŠë¾ŠzÜ[xrÌ p.”*Ó×Õ°µS`�!†>ȘÎ-3ëPõ>Ž]+”¼RO¿D æ¶,Ê¢ï«à•�‡ÌžÙbÁp/ŸhOm<Ûí „l!Àæ(å{»žDºI¾¬œß`Ÿg«»9Û(•Eªà%§Re»V[Ú¬˜«ÍåÝ™[Ô«Ú–÷5œ¡L�ŠÎƒ‚ãîþþ­®‘41cÃò´K£€~ÑÿUMä#ö*@iF„��9îìaÅõÊ¢¢5…Ï_wó›Nrë5�;¥ˆZêzÝí6Œ¯G0ÁææTy*¶¥»Î³&9ÇhÒò+‘æý¤h.ö·7—œTV4™üS˜žM## ëF©–ËÎkűhÙ_°¡Á"}]HÒ©È¥á?Jø~/ë0Ý¿�é°WÙýÊsìÀ`Ëdlùcº©½xbž8Yt]½gÖ©nÁØËgWúyYÃp­"??|Ë{¼ýËæ˜ÁfûûÝKì›h¯ðg\lÁ.�;±/Ù]ª £âцدGpŠ&OÉ·�3¬5�¤ªÒ$B¹ö 1’£É�”+½ }FDè2vLˆ¸lŠqu@G>ó¢a�5ÛIa|@Èò+mežì%I'TÄk{Ä)ç›RºPl/i!ˆ.ðÕPê9éÈFÈÖÉò ÉÂÁ²L'g˜üºÙ¸µôÅÄ,Àý­éÛ,Ukt³¬²äxùµŠW�,ŠëæK/Ûàn(srâeëS ’û“:Ö °2g†×‰ÇÒÞKbLÇ!PÑT¾†ú‘€¶']Q˜C^.TåtêU0^¹©èð„ùúšÝ‘I "T¾æQK€^Ðø�€±ü\tf÷¾âɯe•YW½á2þô>ô[;«ëz»åƉ"/£ë[‡` ê’0i®”31» ü¶‚»�“•»°§B$à•Zýàq¡¹µh§LK÷;(à¸ë­wž¶>.VÆðâ'éÀiºs[ëci?ܶ)ÒFivÅðZ̹¶%²ß¾7Þb!ù p³ïî²à]Ä>tãpA—™¸Eᥠh¹úŸVw!*ç0ÙÁ#Æ�áþµÎÈKˆ^ÖaÕé,B$$Á6x;‚ ’‚da½«æ¬§�]ÿH˜¹ç걦¯ð@@ÿÂ" (‚ÓjÕ5[[f¶Úkl¶Ím-¶¬«m²«S[VÖmmi¶ÛfµSj¦µ­5U›mZ´¶€@ @€"miª/‡ïë_¿ª)e¬ÿT³a/õÛdÄ+6LJrHÙ¨¡*XÃø×¥æÍÎ0¼R|Ò‘µ‚0Ž"çsÒˆz_AûksY¢s²H¯Ž”ujRŽ ÙDã„j{A®è%²Û Ôî+á´’_ä·»µ›ö…c5-ãÍõ˺Lü~’ WT„.Ô³|m"ù•Ä]Á^óÌâ{’j2T-ðÃëqÆ'Òô‹ÚÕÜëaøìjË1c*wb®U•h»úsF/ÛÅYÏ¢NÁpµ§vjßY–)Uè¤du¨±uJô4KœK%‡>ûPž¿Ù³Þý"…�Y¶F ýƒK\ªžÏiäÔúhg}yäŽæ­’òÒëì .]à·;¼÷W~%„@7ĨÝã–´g”™èejî¾·8{�»ì]‡äã87ÊlEE(0Oœ‹Þ±gµ�0•{ñ–€¤·¦ /M¸ŽW`›@O¢^íÛøé’ k܂Ц%Úow|‚á2'8�+|+m3‘«åw‰�à`ç¶5O¦;ZÊíØÒZ”2GY£?�î\„$³jdcºfwt³ŠÀD‚Ÿ_¹ïÖ+{˜@¶ó˜SrÌL$´\ïÖßîmC6m‚;ä^óÉuL¶È.†¼Ji†üz KmCyrÜ,(L� ëcàÍ_ŽžO5‡–Y²]0‰ à9&Ø£ŸBbŠ.ðzPcôåÜ쳚AÌr÷9jUPLt=½Ëq« †Ë&­Îm“¿˜XX.œ5†ôË» ùœ—-I[›Ý4¾±u?y˜z^O­g+‘*a•£¶«Ølô­È eqT– ú{úut10îϬûm�½~FÐ÷ö¡œÆþÔæ3ø?Fí(9UÜ»_Íz³63¤óÞŽx^Ï´�ófDºz×KìÈlÞA÷íÑ`9nàÆÄl1½äôí4ˆPÓ�k쪖hää×f»'ÙüšÅ1¢©¯ÒgYNýœ€ÎÍ·›•÷{ð†ª5:žnÃj€už)ydo�on5+ýi€¾ßëµ+to ͘29gâL~ݺ9ŽžP˜Õ"¹„YÒy\Mv?rÏéåcb•íE^â&3±Ö,ƒ«nIÂø.E7=f·-ù9nÏ8Ìo}ªBK‚‹Sw¦É Žþ[ò¼mîjÉÂãÐ6#£yQêxCÓ ãŒšÎJ½lä&­�iúû§6ÕÉqnõ…ü3@ÜÍšÜtÖgz¢ßcÆ•z¸„ë�“‘C¨ ç „Š ’6ká6=¬lauäa.M>_«�¤o;¹ùðþSì°“e~ϱ’žÜ+Ø 9¼x0ϪØÉ±4®Kúî¶¾Ÿ •°8PÐ"“ÕÁy€6©ÂÓ=³œŠI¼f°~�Ž‚í¥pÕÈ®ÑOte�¡ÝòÚ´Á²k »ÖÕ1ƒ¸ ^²$m ´ºhVÕ¯‘ð_ÛT¶ÚåÑÞjJ¡îÝbÝ_¢¥ñ\V_’ϰ`!€ñ»j,®�Õ-Äz©£½¸8|üÞò6�hÄ­ 6Á Ås]*Åæ~hÕ&3çÕFŸfù õÂfB3 ,åø-«nÜÒH’nÖ¬²Ì~Ø} ä÷kÀàÂè�5E÷kE£gÅÝ·�är"…dƒ®¨.†-´`IƒC²¦±6|îúÕ‚ïÇÉ©­ŽÇÌe4Làr\jJPYœUvùÇp”o2ö·6hï(ËS IFµá‡�ç9ž!¼‡_à¼ÎÈ9mùamÒÌâ�[_ܑ߰\¿½ÉbL µd`>öQ¸%Ælø¶^ïµ$ V'Žà3‘##<·ÐÂÞÀ—n9·U¼€ðP·E_šZ9›R��À¥¬ª²zk6\°Õ–ŒöSÈ_ò¿š-öv³Š[üfÙÌK±°o†ÓdŸ´ˆW ¸h>jÛ!}EêWW�Û¨ìè>–NÇËÂ·ëæ‘ð1õ›`±˜^¬rÛhmƒ|§¡ß5&z¬ å;ìØ•�äÄÁjqêPÐ_rê7>éŒ7¾†.Àb‘»„éCÓ-U6 5 y—AÄu>çÚ°äEý»‡Mì;Ó#—8×Y’Þw*Óªì2É"á#óá�E¼YäArØìlÃ!ÈÈxòö t-4lêx9›u0 Wp€öS…uoù´g–†£¦@÷» m{1‹_L˜#ÅO<½à ¡˜—°i7Ë{Ç)´I÷1”(Çl†Þ‰²ã~Xiè[8! ãÓ`á¶\ͻϰÞX„�d}U„Ÿi¸ëZa~Z'©OÐŃZŽzФD&>ç¾È~ñ!Ÿ·Ÿ±1ДeuØÆ,-•æXÔÑåž ˆÚÕ*f¸ÆíòÜíqÜøaã3-�k޽è“ËÀY/°—ýi2ÌvÂÏ�Nïm�N�ß~:صÕëë¤zr�£‹Õ#S�o‰Ži¶—T~%é‰Ptº=Pa†¦áÏ °.¯|a÷�Ì›åÒ³Ì}Ä[ZÖÈ4>ß|$ vºZ¯Ôµ™b),ô~íBpœM�Ülo©Ñ›ÔÇE“#"¶]îìúM¾¬ªLy‰½í9ÆÏ­T²äv»LY¸¬ï—Œº¦N²~»:¢g$ZŠ×]o)‹vtðîg4¨Œùä.&b-«sÕ¶Û^0XVl s,{Ô} »Ž äY«õ»V=†¹°Oaνœ>.úû¿¸?+ÖÕ£ do�ZíŠ44k7פéª|{÷¾SGõ±¤ÇV/˜Öㆩâ¥ó¼âÙnWÑOïÝ#ã‚l„%yÌì·ØUƧ°8-J'†ÒZØ¥†“¼ûŠE�q"Ü?o~óÁŠ(]£ów9ºUÓ=¨T¢í§xß®¹ëÏÕµmZÆ0þ2挈ˆÉ«fØÞqão¾H§ƒ/´¶8×ú!ä£m¨8�Ñ×™z‹õŠÈ\Øuäš\‹Ý‘_ráy\ˆgÇF&žô‘ýè�Ϥj·'ÝôÀ³E{E¸ %ãÈik~mj“zUݸ�‘¹ˆ7µ�s;È8Dè8²a×>ÿhøU~¯e�·ûìYBpûO{tŠÍ½ü–Nï ]p£„üeOòodŒl;›äǰլwÐíŒJŽ›+AJ·-¸3Ø7|º 1ªò´?Ú­ƒd¶[ŒH†$ú[Ç.õgL/ŠñÚÂOV•±Ó¥¾ÄÁ61ƒcÞ-º’àû„œt.1ìw‰»œ|~ŠâV®oqó+ì4½ÂÑf1ú×Ré¤YâÉ�1cø›ï�œby½x½ñe3K3 ^Ô¨¨]6àUϬaËg‡HÖ ¥ýX}ówëm}óeåÓrY­¥†Ût¸s„çaYÏ cÂ4â 09O 4D*±f´v81uÞ‡Z&]@6ß[¹®s «�œTvåCve²¿.d­œiÈ Äw!L¨ÌWåE2P¹éxe;€·VÀ7† )›ÌÑ9µæ mietŸZëÎgâý¨–§%@¸2òB~8ÆnÔzûܪŒ`ËLaÕÒ ã1qÕ¹CU@ë׃æ?x*\So ¨8lÐ0úw�1ö”›Õ7�×/!ŒÙ3½ 8HoT£Š<œñÙÓO,êb¯¹fÍk'y X´7Íù }f.y^ÎlÜGÆþ+­ú˜æe{÷¥€-vès{CÎýÀÅ6Çh[~g1‰ß¯Å:æ§ô/�‡û§7Űi̾N÷ÌàÄ|ÿ9pû7µæªƒ/TPl ¼&ÃraÞ´ö™í!Óã ¦ÄKX|û�¦ír\7¡ê)¥(â8o¡í²¿[ë2•ƒ–�›S304 ~�®Z3·ÌN‰nó6Æ[¹ß7p‚ª·[Ãäß'·¢ß³yNø¨!üážÐðbÇ�í(=kú“·_¶np12#„Ÿ›žÔ›Ï ûžI– ¤àC‘¥¸{]7˜½%½;TŸÄN¼µ[gº ŠO,Ž †ÊZµ‰•‚¯Éá®™ý¬Ü³Îô“}‰Ûåä›´¯;ŒƒoÈXö²£vóf|æ÷Éäµ›'\ÊæÕ2)u²kå}P‡ÙîË ØgjqÅ'¹-B:¶^î,T4�Øa \®‚…tdFÀ^Úpœnu�³À@Ô×»ú“bñ̅»ÙGEà +¯=‹9kJÙLK“fØ{‹ ®#e… @•š,�E�…Øx,>¸6Þc ›Õ;‰’®ú¶ ³‰eÏÆáp¯C¤f@ߟ¹K€· CYžÛ›½ ©¹MÍ#ÈÆŠbêOj@™.+·R©ˆ¬�cÁMMno¼VÓ[2[]fhñC*Dë­îXÀð±hjÐÀܬ»»_=V`dM™–M©·qäY-šÍíG4çš¡<è‰Å×Èh8OÙ!¾M¸Ew ��~5áNânVÛ=iC™S»~Èc{G% rÚfÍÑ6²– hØ&š'›2 nÉ Þ…r—iZ>åòúv&Í‹ÿ{¬>)[+¢ûIYé…<33i3¸+’à,">›ÆÃÛ´ÁÝ@@íâjÆmv6xê�[2¦Gø'à”§•—@BÐΤqÌðï«QQܰN®¬ÂÖ {Ù:ûÅîÙjŒ@NדqžYÄ4¡Ýh L—×#ü%‡í½Õf:µ×Ž®†PxuQÃ;ß Úàâ›VÔø}�Z¢Ó2v¾¶AªÆè:ÚI‰L=¢íî|E‹&ÂjTϺº“Ã\âdDñ¼ˆø ¬<7½Ãhaè�³–êïê†]Æò£”ø÷¯Ê<dæ|º à/|}{{›-$±g„‡¶�.lÞSH€«fÿFqf‘�ywDÉgiH�Ï+0½†½ë%òD›-æ­Æ´´-´þ˪ä1™íæÃïaWk‰I OíArÅ@ÒkrÀÔ¾{FøPpœêb™(-П£w€ ˆÜ“¹i¼Ù¿XwΗwô½ŠÃ¥[tÊÛFÃØjÛ/IB ï=Ęó½ÆÏŽ`@Ž‘¬pp;€;UÒQþ‡@]…„¬éð^'ÍÞÚ4I{ÚÊŠb\ÁÒQ«ŒƒE«™ ¢ï<|§ÏÏp÷ÞçðèzóÎÓO||œž¸pŽA.gåo‘Q|‘ÈQOÌaocA»}™�„=ÙÓÆ8Œ].Ð �ˆ½îŒ£¤Õqâ9Œ¸s/U0x‘ÌFײX ç¢Æ VJr!µ‡×›{xzÞªÝÝ÷sž½Øn§­0Ñ¡ìAàGîðrÜ›Gz<°×#[lÊvjÝ]5[=ž5ïU$bñŸ“%¢[)}Æìú·„à "0“¨hÍX†töFíø’äW9�›ŠKã] ŽCƒ 5€‘”S†IUœˆ5<(Ý¥‰e!o·•�¶ŸÒÚ]ábiµÃïj•Ãb«™¸WY´Œ�KUšØ„88}C."éC“R�nÁ­ÆÝ}!#Ã`:|]ßW1Pãïš®J,A~4x ÜÉè˜qÝ„s•Q|4|fTš©vk[l>üEøøðZÒôwÝ{Û¡Û8uSçm¥Ù›x µC°ÁEõw4m¡üsj•ÉF8Êç˜÷ØÚ8ü#["®ø&%÷ÚîÞçsÎuô�2ø§ØÖvØïÀ,*ýÛk}‹eàTFªýÝ�“oº2~¨äƒ¤‰ëN·]È>ýtåì¯ÂüaÞ�MZ•mà\cí?Ã.9¥÷ÑØÅævËÌ@çˆ Žî€Ð£Ýф߄rÝ+b y¾ÎáÒê¿=ÜïXONò½lj-d¬ããÈÇìýëÁ ±f€­ku‹»s›Ô—YöñŠê0ËbØûk¿�ù<{æã°ÈE…�Å9-œî8»xÂnœw§ðô»F>Ö�J‡÷pËæÿÖ?yùõA º‹÷ƒIB" @<Ÿºÿ;ô—Ï]¼`»SqLHò——ÄÞjÖ4’Áêøóiãþ/ï¤ µÙ“ßCã ŸSa«x ²S'toï²üNùëéSuÀü’v\íñž&ä"ft‹ú¾Æ.§ælás‚ãÜ-9h»¸H°&yÞRÝ\ Û¼Ž®¬¯¼°òˆ2ÏÏÓ�å0b¯¼a±ÓsM[� 'µÞ Ì͈ÐÞØ–�‹­û¶¾ù¹ s|¥¦–� ªö·q¼šÛ T-M”ºTa¯øC#Œašop$p–Qõ B]ÍfÝ}(ÃŽØ¿ L¾¨1kN3À´Ã]�µ�Üíã¬é¼¿Ü—,bY©EYmíߨóÉC§³N/Ý—±‘Ü÷ZobN_JºÕ̪EÃOs­TlÅñÒÄ—IÊYÏcBXÌcÏŠ]zAö„¸ð¢Ëw(zÒö]>ÎPÃoŒ(—#ˆ#{×Â�«Þ(žãCÔo¾ò¬VÃÎÞz�GS€PÚO–Aó¡>è®Q…±†³Ö£d0}‚8É“úëPhÆ~™Šî‚ñIÎV*½) ŒÝtMæ)<«ß5øoµóh>áØ­Ü‹¥­0ÖÔÉ(üÇvà,Ãúyí[á.ªrÓµ‡!v[ip\÷^GÕË,ß �–0·”Gøp‚9Tg—?¯kc.$ØA8•\ïæÒ�gœ!è‚(2îÀøÍ¹mF(‹Á°ãï´ü»É™ö'LºÓï0œú°5¦ïZ0Ø/•Ç ¶ãèCß$ßwññhuú¾\qÁ–2ÄGkáag‡íÚFW‚ÝA[o ~¼ë^p£øO™ �øÖ´¹ëÄñ$ÁX­k3íª•N ë0<ý(G€°cùM;žñ6Ò;t»Ãëm¡¾Š Ðw©^óC­¬jKwÔáQ/®/ ¹‚Ot“’«¸ªû— ãq`pbh{4ì\eŸvèGy‡Q6ç·\lç[oµ¹¬„�faˆ½/’οsª pËâvò߯¸Ë[Ȩ¶ ®[6‹C°è·£¶Ú‰c´d]Kâ:†M@Ý spEþ>ð(ëQ�ÞŠ±u‰ãÆ‘Ýß\ãÃyàÈÿŒ+¾ê¡ø¸ø{>ÝWšðj:PØË¹_ø1\.®ïø�6�Ý®QÚs‹ï »÷¶Ôþ[¼Û‡ö~Ù'#1ón›Ü©}¶ð;wÂû`{¾Áçc®‚ÃH-Íâ)R(%O#t¥\îÕâÃcux€` ŽØÌÆsXãIâÇ”’ƒÀò&³|µï,u;¸©`[0]í�e^òÓ8ȤK"u*GImåjß—0�ZÛÆÂ}¶~ÀçA†bº÷S$nŒŽÉ¯=›{K†óåÒEõ¿[p†EÍ´ ì­|c:me‚6¢´¶±îRÀ0µÃ›ù‘v›<¶µ—ÊQˆîA¤5‹RêkB 4Q`Ò0õÛyÉf_¾Oë RÆqtÇ3Üjg†CéÛLk[7LŒ©ãoæXÚ¼Iolø _nÀ1Ä®Oì{:ÇbvÇ!è;=*&H:««V3©ûë¦fÁ™ä Z=„!FÈpx“´m;ÅZåû€T 1Š<‡xûyBÅ“š]9HsNßg˜R§RêEà�¡_ÖÝ÷†zÓ�€ˆ‚~\Vús½ŒW>_0ËåØ` C<¢mnãÊ::WÑO¯ÀÝãùÀ¡#9%îDÓÓL×ÚÎþp#¹Åö!¼›?A „ÒCèÀ`7%÷ÙÎ~ �½“Õ -$»ãZšl}úÛÇ®¹7‹û— ã¡X UÓq�üI¯[ªEž~lâ=ÛÖåÊÅoŸkû¡¾_æÜNCëZÐckä`|T½Ûâ¬{á“Ý P‚ Eº˜�XgQ}î‹—ÃéõcÅg–Ì*#¨ÜìŸZFZ£nø·Í3.ä+œe¸/ÄÆi­×л¼Âö­ós<м8d¢Ø«¥N·¬N9ÁjJ«N¸™ØP�:—0í݃§©š�³�È_{ÍÀ�6\Y˜*Þ]…ƒ{©²`Zw`Æ—<Îá¸q{Ü2ŒI%̨j,NÙ¾{Þ¹9=ZÀapÞKéÛ+Åà�èºñ3@œáüy"ºäûõ |F¸ü=½�ÏJ™Ï,_nXÓgj!„Ìl§*ËË®L¼?¦UüÈû¹ÙÅNÿ?n:>ð�Tà(D!Ë1õ7|2 ±’¶T_3õÁ5©líNfÕ¡�gNï¿_ ™s­Î‰ôah�qBɆ`¿s¥¹šàð ÆçÍ*òαÎ4ÏÉÉn#"ÆòÁ À°D¶F÷œ/it<4ÚØ|J‡~è§DA®Þà÷†¥Jï�Ò2`õP÷uÈ&XV’êMTC7"ìS‘¶5AYËÈ;{VŒMæ‡}ûI¸˜R`ãAŽ? a§ÀMIH‡Åk§Ó“i ͦ¨¥êu9JÍÈ- 1#Ÿif®rËËÊ�g`zƒkmÍoc�Vs �®îÖ/³[Ú¬„ò cáîwdû¥mnˆ-¥¼ï¸Þ΃€j”öXlîqËÂ,›u2ØÍÒ† ðØAÆŒu"@xûüÛáûË·}¯³)ZÞ4µ�ˆNú«ï�mº³e Kê3r ÂàD”ÏìxÁÄû)®(c~_MÂ7mP[¦½Ž>ˆÄ©D*K�ùm«�Yù´Ó“n?.ÓO/Û÷�/ <×-8 ´e¯'ûŸT^|·µ‘„.CœL‡ré眡TB>ñÏDûñÅ´ ÉÊ*B^C0¬4í›rú›ìêþ]«g®â“Ãoä›gp§6M«ƒÚ =÷Ýþ/Ç¾æ Øß·?-Ô‡Ÿ‘GŽñÁ�'´ÂXB 4ŒzCï¨ a2¾‰+bœÀm�VN]3lx¼�r×ߜλÈìoÄo¸ƒû„@œ@‘…8jCJ44µ˜ ÿj1O«VÂm tM%YïüÅo°6b³ ’šŠ…•¶PÝC8—&%zÑý‡ª|‚ôr¾R?9#SL£�~³ç�¾,:² • ‘Oéj¸T&Öt]`$.Äù¨-ÚïµÛÏ2¾}òQ÷Ž�EÁ�òX8øÉ³Ã [ovÃ5mTw\Êã™6©âýÜs 9.µIÒÞ…*ù+nâPjÊã/R´¶J‰kr/nv'¬íœÜ�"ª¸1@²Pª|MnÂÈÐýê]Þ³jXN)«Üf Úî‚,”ä8WÅ÷7}Ê©Åõ»MŽ<ÂR!Ð ^î4—ß1‘Æ(ˆ…-¤#0Tn�ëÍ ÜÃzòÜOóh�A Ä5f~¦scÅ­(ç“í¡TTçM^¿+º¡/ȺYr/^ÖÎsm ;ª×æv¥Uïb©eÒho­ã0õyì$+‘&IPrVkMèQ_—Ž Ù¬ÿœ®÷HvÙÜÒóú[PMªõÿbœŸl5ݳ·ÖÈ„±uºòl“|Dès<¨`—sl×¶²dQY ˆOƒ2�ŸRØ3Ѷzå6l$c‡žGxCLbEQfgÄ]ÖÒœ§Ž¸Nq´qTSÄs/îs–8’Íð½1š&w{jBç¸ÖeªÔR~Ó[a“7j�jlðnˆ¾ ›œ3�ßrýìÅŠ=”Bá…Þs£n¼ë67–a4,Ðë¹JÌl&¢èq¥u"�v8j3±Có¼nA+ l´’mnö±]u·5no­.Ï6 2ï9Çs»P�Á4˜alŠß ‚ðY¢ƒSˆ”`ƈ("šH�Wsk¦±Mp§Î!bq„»µñÞmW}j®NÑÀˆîÚæy�7¯2j‹þDv[vÂÙ4Îxáá>�»LŠöÔÉ�°=hPÌgÁmžLñ8˹̒áÄ™.Ø5à¾nÓ‰-0ìÖé[GR¾"4¶¯#”K>Afu"‰S7Û’L†gñ¼ñà›}¡p*зPÐþ¼ÚÒáŒlÂXíš’Àµ\§[Á€¤»‚ˆåC‹42Äâi®âŽ»ïFps}9¢Ö”޼뵭¦!C÷ïÁûNR䔑y ä+ÓÝ–ËGTs´VEù) ³�§-~jy¥|»_m x=dVS!knùºu[ f¬ÓðÎ�,}:€ÃšËTö¢…5|”¤é¤µ§4µ3DÙE4{uÎ’Û¿C@˜±ö#Þ*Œc ƒ\âÄ¤Ü û™Þ±Ô‘Ÿ×„é ·Ò�§HíÕ¼30‚{Uù¹‚¹“åÜð—$²~¾ö à4 ?†®ÍƒJV.2¶2­kóp¼XòEwM²�‹�îá}ïËhã9„1¾«ÖOUÙ¢Öƒ¬ÖézÂl@8å€:z¢Í�9TLK«>§|×_m™V¼HLû­•íuµD)›fòúÅÈ$Á�æ>Þ[©gü8Éjív;Ú!�M>«ë„ÀáV²L"{á¬Q6_q6*¢!²‰˜Eù�™Ç¯Ó†Ôpö®h”åé¿wç—ß/IÓ?£ò·eÓN£?"lÏ7A6_é»gó¯pø;ïy[Í•�ëÓ¯(š)°H+PX‹ß8ñÏy3µT Ð š¯BU9¤iëò‡MÃUÙcì͆©T-»@î™q8{»¡ 1¾ãg�=€ýõ÷ «y ’¶ÖHr–Ap@”=¶žm£–¸5ý×�“±qÕô RÅp³l:¬!^VÂ)p›{Äm’üÁx•òO´Ï‰²=WB›–Ý —Sž`#ê}¼¦xÝZ›T*h¹$”Î~¤J=ܶ¸ÙóDÚ^÷\×kåßKs•‹·c:ú¢ZÈ­×ÐÀNÐ.l•”åç@kÛ„c BïsÄv ÒV¥¬ôdм�hZÄ~‚»�8>ž O§‘«mñv&âM/÷°8БßÕ° -‹–o+*}aËëp°þ bEpÈf¢]žv¸4^*Ô!.øÕM„,W„ËcÌœ[Åa¦4ÛKµ¤ nŒ9…Iš@èç%Ú܆CVÚXFÙŸÉ×!^ŸÄVk8VLK ¬·5Jˆ.Š_ÃrÚóKEŒ*;„O蟺üx7Š´ËÈUˆz1öCì¯m©Ž4ba@@ºY6ÎÛ¬ÜÅ÷£^tocãG‡|¦Ð�Þ[%#�€PA��}hDUr`¾ º{Á‡os�éD³p'×ç_÷»ïQ–IQ§D6äq†K?…'$ÌK° ¶6|aý+¨g•/m=n>æo¼ ÁÅ (Õc2&ÿY\wrÏ›Œ!6±ƒ§$Öòó@òÊä')1öYò4‡xDtÈ„ ¨ø$-Û0ývÀú m)0C!×'¨&hÃ&‹Ž¤“x{Wì ;˜e® “ø—Vù=\ÝWË{ÕlìZ3ŒX5Ax¤&0…Ò8Ò—À8®ó<¨Úá­ÇÜ%Ð’ËšÆJ×pL ÔúÜptc¡s§2gxyoe·Q:Þ÷ÜQÃ�Nùĵ_,ø,iú+[Ìe¨iàôJ›õWËÆøîTvßa®¬®Ð-¢©ê¸‹¯œôQaôåx]ÚX»Vu­,kÅZ—eÝyä40¯y‡3‡æ<™Zn¤Ñô`Þ§+üØŸÕ“Ö“öC¦Ýpàžùo´€>~Õ˽d ¿~ìX"×ÎDppˆU�z¸NrÁ<7‡ê68YUÇžA×)ưk‡Íà~5MÓ¬þùAo�#íóèÄ ´Ë )u‹–òëë‹×Yñã* Úè’7 p¬ÄII:·TÒhc� m�Îz‘ré’Ç„Îö ˜Ý¢ç`ÜÌ‘�¶0Tr¸*—'�4ôs ïó”èÑ E‡¦~o¥Y��•¯´Ì¤Ë+âÐñ³ÔűÏÕƒÚ­�§)û$3€Uãæ~jË8~`C½ |¥…­@K*®Ö- zF’‹W̽A›ˆðS˜ºÔ.8%;ÜÎ3O¾×Ûc]XÞ©°oŽ †™L<|Pñ�4D òÇÒÁ‘­^òRpDVuÑa)Í^2Dâ¥`ÀþfÅ®ó£_ñô³Z×ë0=ÖCÒ`w�\£E–Êø‘ºü®ÔŒâ?+†WP %¥Š·Üs®Ñ¹n‚¶“ÁÒ`ïBá˵‘õ‘'ü«¸8q' âðî½Ð1vš°s)·=N£Z„Tc®1˜ŽÂ7hB¥ëâífõåjÏ�vú„öŠ�Î[嬂ì�w\+•¾…xLåøy�^°*˜v0¹îÚv�­é�›oi)å¾@‹ÚU·|æ¢2�þ‰D»ñÒ;„ÃÂZ×EkX"+¿¤'„ìMzcèQ³Í‰±©7–´öÕX©©á×Ô¿^ÛLÌIÔ_»YÉJÅ›‡yxÔ¤2*z ÌÂIé[-Ì4¡¤ñœVZyP�RI+�Íñ¯%w•pñ-©· …fülöÜýÜÀ|õží�xâÏX0«)wæ 틳»aCì˜(ìÖÑtäNéâ+2Bßœ0,åذt±Z»3t^Ï¿jpðòø˜¤:€[\‡ÔÙa`%úÒžbbŽdÆë±Á6 N8Ïׯ@Oi»\ºË(}n¿¨m/Èjzaº¹—ë—틲^:T�AÅÉ·.C¶ÞˆÏÖ+:$¦OòlY!z`ÎÆXêº+%Ä},¤¿FÑ6 ÅtI4û3J¶çVMš\c ÖPó›•Èõô€€4èâ€ÂëŸrNÎZ¿Ÿ—É¥\ùÈÇå£ã½×øˆþàÏ_ ˆÜÒ²ê�y®kgaÔã"Yþ=ÏÇI~\ó cù¬r‡(� Ì&ë7Wäîá¼è&g¡a#çsd Yº€u,ô�RÙ íT¥3‚Û�žX9:€[“ÅÛa ‡ÏÖ·u&p8:¤F\t&ÕùâbÒýf¶›M¹Ã(_‹'Ãç½å�ëam¤Í®Ý¬àûphn<åón¬{h�NÏ|~%Aú«¢¦p¢¨HW$)ÞÌšºókÌYÝ#*0Á¶¢a‘~wÃÖ³Ž]2ÖL§o„!¾ ¨VÙZ‹Xè´)2¤÷ŸÀx<Ž÷1tü£ý«q‘2–Ì7:ñ§ŒÓæ¸ ýÀÏ›¨½”nP¶9Ðt.m:'á ›ó<Å—tÃ=ñG›“Eâ\<­Ð´{˜D鎬TÕÝ83öÑõl³fâ85�þmãB ü]˜±åú$½;–gôÄj†ÝœX1¢~‘X¦±ÀTÀ܇ºÄ:X®­àMŤë6 �j(@‘˜â‚ä´¡Œ�ä­†Ã^÷Û2ê¡b¨•½ˆ� f²š4o›€²ã—(áîÒbØ2šwUˆM™ïsŒ†9ãpT²Å­ˆéÑÅ uJ„º!‚žØ/ ó™ÑÇ\Yõæ€yïYø‹Ù½çt¹ô¦ZG+�;j>'ë³Ø‚ãä~mœe#¤Vm…õ”·'¡žˆºˆ-´ÔžÝŸ"u¾¸7ºöûÏ|ÜV÷®V�‰ûq4kµÖáw±ÆG¯á Γ«e«4ѧWYd܉ÜeZDí6)1Ù®–�Ÿà&ìcv IïSó i=|ŒÏã’}Ír\êûs·g¾°&¹åˆ²µlî¸ò¥{«²ÚXÕÛKiýZ¸öƒÖ¼õêRÝFÛÙ×ã<6­ÏÐà•#ö�éÂÉÂÜ*ØGgÜï­žMV[¹‹Åfkަg 9Äå.ÈDâ\�,á5„cÇÎê˜M Âìn4R:É7ÜйH$w+‚í»ëydžmÊïAÇŒì�OX;ë¶ÝˆDù~Ï™Ýaü8ë•«×äA)u"#ÝŠ¦Ö½jºIˆá×½­†£É®¤¥Íô°1ïKçŒ+S†Oó¥¤áÃX‘ŒZdYÞp˜m]í7ÚÏmÚáÛJ‰Ëe¹®{¶ ½Y—B�¦=Ÿ·_g@qÞ¤<;v'ºô‘e—?(óÁÊ)ÔÉòœöïœgÞ…Ú5~Óýô=g›T½í¯C­Ià&>QbøŒØ¾ìÊ 4ÑE®^œómv$ng ¬ˆ6:rÊïEyÀuŒ&£cŒDÁ@‘'ò9.ÂäÅx &}xÝnìb±Šßn:-Þ†·6–¹´òÕ¤2Ë¥ãÈcî¬óüpð¬~¼œ’Öo6ƒq�ÎÏ9µ�Ï’[bjàbÈÛÚH#ÚVÏ^;þ›³pñ–·¦„/~ªJ³•ƒ›r õ½ÎÏí­ñÞ彂:¤x�o/OZ¦ÉU—w•Ál_CìÊÞ:¡Ì±XWcñ\r°Ð¯(ƒˆ0r�Ê»T–-bwVÜÍu)ÆüL�æ˜àqx» jØ×hÛ· ï“«î}7ËdÖ>–éP¯Ÿg{Ç æOóè Žu‹žË¾Ù¹6d1™+��¢ëŒÞXž†½’´@rà&yf˜ Ï©î¯ mÎ×I09†Ö~ Ú/~®@p(õ´4µEØ>0J™‚Uª/ ¢'Ú1³¶uÛ~–G¦9 �(Œ"±„Ÿm§,µ¤–’ÙxjÔ„‰[“°¾¨æçv=嘴 ¯8Pê”Ћ¤ LUuû@<ΖZ³Ç(,.LÛÅ¢‘%€\`PÏ%6&ãfK Y@.@dVH´Èæu¹Ï”1¨†ö”÷_j÷^�üYp£ga"]0Ó=;c�Vî•{^¾¼`#ß��#7™·ð—wÒG�êš^†è.3Èâ%ÅgËY±óõUµVÕ4#‹à経²Î§÷KX8ÿ#wµÊ§é­ïÆAð„/ÁcoŸ‡tu:{d¦VÀ_»Œ4ÕZÆï ÖÉ�œv°|7n›g�âêyXêÙ`3F×Mã] �Ü(G3Ìw�_ù¼W7߆ûþ�¸Ýä·BÚ7n¹é²g%÷àÅšm,¯.D9<¦-8ú¤­�ápòå$³g†‚%ÕO0úá²ü\aÜ›¤é÷‡Ì�ÞL*-¤ µùPlÚ XØ4LMþ}ârW¡’ýøF–²ëÃJÁqº~2äkf‹[]\ß Ì©M¨™Bù[­’g)™Ú›„q£ý5ü¼€œUåÊÊĪàh•›s°ŸTM†>ê¥É½eú;ö˜˜l€8ñjLèKyJ�ÜúŒ2:î\¬ÓQ8©¸ «mèïX:˜²PÍ–¿zy »åQDB†?™ŠhÛˆVR½Y¤ÀìÜé¾8|wŽ–K÷lZõæ¥�Œ�AA4â÷O Þý0œ‹©äI¦¿?R ˆ×œLÿk2Œu`I¶ìûn4šÒÓmÀ~‚£ô±bñ‚êûÌ»Dƒ9Ë¿J4äR•*+ñxÈ<Oà”�\Á]ÚÊn {Gdž��æž·­a‹Q€töw8~M7³¯Ý !ÆÈÂö†E~ˆ÷ØÌ&LDJs‡ Ç’Ò7Ð{N¾…”9¦bX”j)”ÒåÑ;Üþ÷bµ!nœÊ%è7_¤#AZîX¹¯x®¡6«ä-sé$]—;íÚœ¢zž³\ŠlŸˆCrâ ‚_¹ $38Çè£iÀó¦k­"'Ô¡g·›ÇÕ.3ÝÚÚz'ay pïBÛÃïnƒß¾ X<0b8‚‘¼à  ®]ïŠMàÄûìÿ>ÿ¯ƒ"Áû gôé{ªƒÄí'~âGÆÑ}t‚ b�­C; Ê"©úTF™*æ™»Þ�YXñ„³{µIºö!3¿/$ª/… ¥ù¯ VüLÅëd:?|ï›:<²Ï_›_Úé|\f,ãß#òVûL“CÁSgFàëU ¸>„Š…Z©Qì+ °”9 _g$K¹n9t‹{\-’{;o?%·’Ȫ¦µ�˜XÒw\˼ e#(ób6C3Àê*a…´>¯¸'KÛm»…Î qÍ<*—6hÌaÞ\…hÇÃŽŽSѤWµ´º:ëœá……˜OÔ|�ú-hjo¨©ïòÄ@éÂx©ZMË|—¶0&UÈu d¤ˆ–²v=•ó|K§Á÷ß<‚¢ U+×Óyª[*fe‘·U`N_‚oòˆº˜Xdq¦[ Ý ±÷Å7÷N`nÞ’Ù4w¾7’l{òÉ[…›ñK ®T½ñP’m0ØÒã®ZÀ¬�pšÿ˜ogœ_Šõ‘€})¯8/CZ´®Î{µ�î˜~X.‚Ž&):ÄMkÕ�~æÖMôøÅ�‰ÑsôçˆÁµÐ¨‹ƽ*)\µÁÏt ã£ Çãä„CÂÚ>îà#zð8ê9kÈ·±o³›Ülв—è‹MÌåçó`è°,¦§q#ÑRÇ� [t‹2s[\U1ëV†tÖ†®°W?[·ˆ×_Q@ q=·8 —ƒ¾¡DáÅÏ ¨·OØß½cemÎ'ZÕÐW ¤\¸x|¨¬ÕÃ~õ¦\"�´ šÁ"ΑczÓ’EÝòþ‹Ñ ó=";ú±­ ìµXò Ñ)"^›>ÀT…Ã&�‰u)Ù*X3Ö‡#²Ú ;OXQáÝ%ÇÍO¸ÆõÑ÷¾Ç% ø+pE‰“ àoÓ5àÜ@ÈvçY^GA�%±mÀaÖ("ÝävÝ ¿·P¯ø@9šfo1Û³ƒ.ˆúGÍ ½C¿µp"ÆðØÂ/��AeMì–¼õ�É¡Hgu½Éfæfm--ç¿>~³ˆ†þî~»õg|H ŒÎ‰´¯¹íè%½Š� E„l `Æt¾,y¾däUEÖµØË\Âû � %Õ À�!LÁbÝözµ¥î'‰ccƒµo›4lG›²ªž˜Àr×- þiÖ3ÇW‰ßw¡qÑÝV£ÀìÖѽë$ïJÅÅ IlƒÃ#ÞçÈ–CGçBãÑ5›à® ûaŠkf¾‰>grØ}ïwâEß�Vîñ¸ÕÑrÔvT>Y„ú<[„üä¸KV 8àšTÀ«É1k„ÞOÆßƒͲølcÎLu31Îø}[ì�ìTüa™¾kÈZEh2ÜçH®—OyMœ<4T®!ÚèJ¦ùVú»ijÃRV UW�ŽßäFÀÞÈü;n³i†HnV+hÆÌ²¢ à¨ùô�›9ÛA Wã½ät¶ÏSšš MéxŸAÞ¨žï¦Íû†ð²ç1]@™—ŽYݺÓÖnsƒ[¡ÎAþû¦˜qòãY@îvãõÅÜ¡·�ãà�Š¿ Y-»�Ó3R“JL‡ßLdŠÜLÚ–�r¬C0;¶ú5öo7€1{ž&ö™rô[qY»k±Å"�¤\…O Ûîî+—ºq VÍÃ[棔o°˜aËÇKÑ¥–à+&Ö ë�©4ç‹[sò\²)°Ò=“ãÙ¬¥õ;휲Øh©ä+oâ¼ÿÓG ¥Öƒ F[Þ[á`Òw¸ØNÂŽv¼ë4‹fòÝŸDµ®—²4ªäʇv˜Åï‹©ÉæFA0¶bË —¹„ %%�`8ŸÜ›-'=K©ŒAÝ?˜IÔêÒ‰«|Þ2ͬ<�5ø òß“›uXT ýõ£ªœg!äÁ•ƒÙ�㼨St™>KeDn�ãè:æ™÷žsfÆ|Ð �? 8•ÖùA ¹�Dz€¨ŽWÐWÁ]¿µûünA‹'þròØàõo>Ö™¶{æ#­ kD-†{Ñ\¡„]?hLýTÁy„ðIbú=­Q„BÖEúžqeÍñçßu–œIíÙÉ�ÐywêP9lgGé••�^c¥L½ìá® £öös§.¸9²Ä�(‡13$›o2iE›ÊÊë:ÿ6Í\ŠÚ‰°U§Kˆ>¸·—«Y(+v�ÕÇt™˜ÒÈlVLÏY¨oõ¯9U‚l[c˜$r“³ }ͬ ££Ó�bxœo£SÁZu ÃØyö4e�Ë?4Ú5œgȬêÈŵO'§UÓ�/-¹^ñöó`ýqcµ�ÊA7’åøñö}ÒîŠH‘d»±ªp{g~8E¬A8dd1áøqnª3€±øÁ¯&œßVãcm(žÉǰ“q ævóé!Ý"jÛÂ\Y9>µ…OÀá6ÀUtîÅ qøFÚ`Ww@w hŸ­:µzŠð âÙæm"gvO¯å\…�‘Ç ÞÃÈæ±gò|| äm°¦ô‘oZ&BÔäø±ŸÉ“!gÉWIò›4{‘DË¥¡Æ^m„Ý%—› ÞFVdž\&0qh]ùíÖÄ^w÷kÏi6 $Ja¹ZUzá7M¢t满ϱf+È?ÝYÀ-ê2ùiiFˆ*Å´¼´âUpÈ’e' 3¿5! ða™.†�ç &Å;º}‡ÓŽœ‘ ?kq‡’Ÿy•W¶&núaõ¤fµfçÇ‘œ–†r0¡a{‰šæÙÚ¼n+h3ÇGÁ¶G++†`6MŸIåÀç_b w•ݾlOÒƒu{®(×v Ù,-é£a G•¯¢û Ø�¹[yk˜åÛ¼´ºÇÍס±ØQ9W_³UÍÐgëØvˆè‡èí"†O×G û=³gb’`¼’Á¾´–Íðb{ä]2ÒK0SB•²Q›�ŠcÓò‚ÔeÄϪ ”±t,ìàY-ûˆËf£ã\ú¡~ ÝìÁ‰�ÓL!×Rx¹—Ý{•ßÂ5³Åý5«’há¸E‹ÓÚ³¡õ\-+ ¿¬3°¿Î¹bàãw]óã¨g›’vÝ€× 39¢\ìö;Êð4ï~š—RÔ/©£¦<" Ò/<ÈQ?)N®Ý€{dN0׳}Æoj"°ÁËrØjàˆõ;^<î>ßÓð|1lòÄÅÎÙŽÇÃp÷NÝ7§Oj#-nƒl31ܶDŒ¯…äFµn~ÞàR2žÝ5€GwÎM¤H÷ϼ0Nç©·ÃŽû eŸzsUè %"ðOX9™+ŠŠpªp+}–**ÁH<(ñ§µÆ™j¸^ç:QŽ/¡^>réaÔG-ˆÑö32*µ}—;q³,z>ª¦ç+:¤0˜ô¤)éô’ÈÎ…ªlB;Yð"—Èð¨Ê0é-~X"ƒ§m-EàmöSj΋Hø(ˆ´­à8ªÎúof¯Lwk“p­� âˆêzB6ã�ÅÁËŠk!¿d Zsac›ƒå4�8Krn¢á²è§ðÓN¶-«x9UgÌ�Å¡\qµ§Þ¸vÖ½mÂ4Q¾ß ÀÝÐ>½I1Ž7ç"ÔíooD] 3÷£“Ù"» Ãh!'œÚ_¯€ôò!Í^2\>}e©*I$(¼*XÄ1ç,«ÚÇj¦ãKvÃõæàCwZ Qäó‡|ZåÐŒhß…hwDµE?çy©j†´ jmYªÑ;RÜ^Ê`r_'Ü,A܈w™¦Ì#†l�*Õ2i ñëDµï\4“Ÿ…ºª)ͬ"�ø�œµÿ �n(Zbÿ@$^Õ6âBžÀ�c!®c{ÀjÖznn È×q—‹« ‹~ZTÊÉ·Ä.ø mÍ7“òЉD0c¯<.í7~š[?á,c˜Òëùîù´¬'¡"ìÏ?ü¬“›ô^¬³Â!v¦U´Ùo£YKñc"¿kYÄX= «&tÄúÐbžg-Ýšàƒ_ :ªÂízrl‘ñ®,·:Z 9ím@ .@ëqSüáÃajÜ2ÚKÜå1Áh»ì»Ž°Ï+”ÏåÈ\;0bèèhaÚèï‹m€Êe@í¼YÊ–n•b²iD(P¦²ßÛÇkaÛ6 Øv:žO›@@¼ `4/`ˆ¸²[ð]³gד¼:^Æ�ð“SûïQjO!œå]ìûMëdkÊ F>=7ÆØ’€|ø éÚüS‰¶é9™"a(ãZ@˜s£ö˜ÄÒ«2�OsßÖÃõ¾‹¬tñ{;lœýÜ…î^Ç!÷¸t°NÔ ~¦ûB8ìo~iÈ­6%B¡²æs�é¶Ç4+�M.71é{Û[°…À’v_ÝŒ'>í²ŒÊYú›í*:×îã{lølÏ´¹�6ÒR˼ØSôÕj9Ãi¨â8ê¤A’¦KBf.ë©Kcâö6 5�ꊱµÛ·åùîCÀC€P”Θ¦ap“XOoOؾ) ”YÑzÇ»‘‡€îäÊ ñFVÞµ^«GV`BÀà ö¦=ý¤vˆ­+zίnë'cÀ°þÃøôÏ'e}µçÂâ—©“iY¹ëKEaµ·ì)Zum§)AIª²¿ÈYž�S†œvÚr«%XjÅ\ÄJ¥–8ÿ£�tlä5�}‘f2G"à”ÆP©³0c ë@q„(,š|!�¨öÜyÄãÃ@Tx — P³t� «wŠäÙv1Ûñ¸Em9¥ÍÌŠ•cé_4ý¦^ÛVáë‹>øûÜ·CW”¸FG!*EÑâJwJDßeJ2ìS`žåö[‚ЗÛô&ÃŽE ±ØZd*NÓá´ÜcÒ¹râ o÷lýT à–æm|µ¨P¶9¿®¡"TöQ½%LÅ|-ö/gu°*!�j¬y9ÑCˆN–È暴Y«ÒßÓ=ôvjP6¨.ôJÛ:r1ñ½« œ:œŽó·èÇíB{ä…•Q Éq¼ïÓ�hØÐD³Ürê£Ñ+éN>Òd Z2XuqÎ.(¡^9Oc{‹|9´°XäHJŽÜ>¯[Šmê­+fЈ»íkã¡nãJ‹Êx>y_O¼s‹½Ó=Ó©v²! äàÖö¾ãP\‘�£±~Ô‚�4ù¢øðMÆg”(yþÒm—žúÉ�xO [Y¾Äæd³?›õ”;ZÍa$Gepj@±Ó›wù°Ö5Éçqœ)-Ú#âdôÀ…Ù|þGd}œ±g@¨#¿Q‚b�†+Olv(¥K£½×f™5Ð3SÛIÍdܵŽ6{ô–æg¦ÐÂÑ:Œ�Y Ú×�2éÛ§¾Ü(¸i¬�wµÏÔˆ¸úÒe¡ÊÔÁdfAß¼Î6=ïXYp|x\×/œK5åƒºŽ·£ ¯‹3Ó[�R0 )Ð$�$¸<Ç8™•IúnSY ‚½‚´Éc`Éšœf·h‚€ýƒÉA+ )]ÒËç8Mï±/«iHcÍ2+dh$n™_Ü5Ô÷ׇ 3®ãÔô€Qz N0æüd\¦T,‚9 ’]Þäa'2‡+£@¦Æ !¯Ý$¶Ä6‡Sq„ê óF}r© d/mâ÷^kàk»¬$j1®†/2ürÓ}e? ÛʸƒFzÈ×/ÁhçhÄ{z¶èþîü¤: D½O‡Díóô7$$usÉA|46üQÆžÃY›l7m¸¡mBO óì!1Ȳ�Õ”£$ÞÃ3ÄWÙõʵ”ÇQïÂîêEç¦ê×Iäo1fsäü÷;†.0¬² í1­<ìž½3�ðJ$Äv5*-†C�vw=جì�Šêb‹h€„üW[€Ä½õÂÍ] ÐZ êøÎ‰ƒNè€Hi™&·¯Âíù›ïrA·•lg)¹A´V‚¸�µéƽãÞç• à±� ÝsSñÀõ¹Ê\邇u�oj�ˆk\ÃÕCYÐH&õ[\m*sc‹h܈ °0·öÓX{KC[[›qHS/•\¢ÂTjÜdg›æV�Zæö‘‡õ«q¬•�wئýµ=³´eI9ˆ^J)ˆã>g©;g2çÀÔO$í’á6Íd';q3�p´-“Ui…°ÅŸH9�ëš­N+:[çHÿ–䘂t—Î]ÀIbµ…�Ùñ òêX]±j)ª`óØ³œ 8ËÝ©HÜ ƒt@ºwÌhTäÃSª^›1;Y–·{Œ2íËͲ*mV EF`Lö·™í®Ö¨Ú°‡(¡¹�AåœoƒXpZe©’0ÇRÔÌxγ Ó×\f{(¼•¾k°M¿‘jŒ.ÆÀ²J{ΟbÇ\Ñ´ÍÙ1¸kÏOyCbÐûïXŠ“¬2yÎóIõv#è4 DfLÜòûKÔÉ6!3+6^ ëda·äáWANâ+UMaW›�›îí`ÐÑ(ˆFÃiz˜½0‹˜Ƨ+ÂlÇ+gŒ¨•Ÿ n7«ÇŒøËŒèö•.Â9Y3¥/ÌS°»Y… 8¶oÉ 1JxϺø|‘›ê ל:(¦¦ÝÉ6&ÆBý‘hà J1Éhå­n`—Þ)nÿ¦òõqr çÄ´I%âèàÝ¡‘Œ†SŠÏjŒÞœ£Xe3 Â:E[X$„v»þÖ¹:Íö_÷z¶aÃb�2ý©‘;èRV1Œ¡õÓŠ÷Á»Þ‚î¸=#ºg7  *ƒ`n0Œ÷åä3w<þ»z£\›E³´)MÀdî›fÐïM¬wˆNšµò̺‘8èÁ¯ZlQ|{:8åöˆ ¦~ÖÞ6:¶Ÿ<»ƒ« ¸ \Æc{#l>÷ìuJr*5ëq“4èêyÛªÛ¸l=Dg!°¶×®²fë‡í÷Óvkå+»Î—€s»$»íƒªÉÊÄ©³qž0nË\’¸Äà®A�éZH|¶öqBÐø¹‘®%‘¦fiV™bóXAåÏÔ¾"’�IqJ.§¤Qƒ ¶P«KoPçKC�¡9zÞì^díùÂx€È k•ËŽuN¹ËÛTØÐØ#¥É¨Õ› Û»4ðƒ�Y»:6Ñ ±»ªÛIl-‡$I�5²¹& %÷¹t쬞�çO`º¾ÅÛ6d§âÑ5åZž�ÛGÑ째D�]ön9L‘ô‘ïq\Ýý`ä->Ù(…øì¸ÖÍ+D²€›y!k´æÖ`}©‘&™ÛÇ™ÄfÌÔõh “Ë–¢%wÇ QqÃãdÂÉnä[‚Á—?.€kQ›Ë¨Î™áòòsp¡–Ê” î{âྠîŠ<ŒÆ;¤ Æ›Gë³®�(ÙžKêú± tŸªÜ"Om¹Þy�Y„á{¿Ÿ�xÅZp£ ÔB I@ˆˆ‚¹\¬ļ¿!yÌüßcQ£\ôÖ•‰X5¦Ë/*›ÉÜJ06ê'7yÙ›¦í#DhŸØÃ0' 3›*ð½ wÙR—p`¥-i‰„{"¹ž×ÎÖ D€/§ZÕY}{ó½)¼HºˆþõèšMó‚áöº�·ª˜8Ãó!² m›!á´ôGùL›Ÿƒœ K·®„`ýͲõ©:Å`à¿sÌ—�Cì`: ­½à>õÀL6):VÎî'‡`í£¡éSV,ïð¨q÷úO²_2bãÅNO|Iù>¾Â{®ái«Ÿ> ü^~¸Á}†xýOšá/e)Ki­Xíì2èèñƒG³�3‰‡ŒK3›YŽìþ¥K† /ÉQ‰I6Ѥf”ðÙ¯”ãY§gÈöm­ÌF:©\÷ƒ\Œœ»žñ”tJa�3——úÌáJÎïZÚ)ëSr/•퉀 Ìðznc®ÖM– }µŒc�7�i\^Hò™F=LFÚW�$6ûžd[à˜<. òþѤ ‰íÛ>¡¤³ÐÛfç œ„©&%¤»°Øct¦ãоVgF38Ø®=)±Ë…Ñ �ãb˜Íj›º¿lìüiú+ó .Ðû‘€˜z¾¶Øpº¤e ÝË­£ÅN å]%´ÎÎB�ír³¡ç— ؼ$FšÉfël’Êq ²²úýÃ:8Ÿ­°€À®µ¤sÍ+UØÝt¿îl”GÛï6ùjv{¼åu+b»Xñóº 6|¡–’ö±Î9éÛu6©äX}Žeñó_™2·­�"iÜþ¬Ör”U‘G~pÂÉ:uz°� 3<÷ª+giŸ¸IØ ‹ÊcTmµ¬¦ÛVp4½²8¦!*‰¢»`ÙòŸi'œd¨'l«ñIÑÜB‰´!Ö³PËî¾�ºß3ÍF˜7 å½Ÿ…úXR,|š€mÙÀ sš>ŒþðÐÍ‚bMçíp1tåZím ãtb^*…Äõ y­¦péTó²L³\…jÄr}ˆoaîÂ^Fú×2sr ª(ÞsÄܬmiBl×9·X”n-"@ÙX‚Xés³ ÂïÚÍ …ªï¼etlÕö�l¼W^l_¨àá¼Pü†Š¸­Éû¦˜màí=Bl¸9>é±mns±æ ®y[ä6¬ ó êÍ-׋¦¶;dì„â)”Ýî wˆyÆüqb e䄦eÖÔ§ÔU=ŒÛ˜ °k[Š �¾mÊÂãz\óH¶±÷§;Å Âôn޶²T«r‘F>$èå¶ì Ù;ý›Rû[¤Å÷›s˜Au>I´ËÖ!»˜Í44k웲A¦¯Ès&—¾Ê·~{L>µ&ÅÉ6p{Ô,Ë&ëyŠcv;Íb¢eõ™Ÿ©ÃB5Ø<&Þ¢G]Ž+<¸illÆÀ«KÜ­ûk�@_·CG‹¥®@î^¾îê­Òõöïx{ 릛º¦ú¶_0n¯„}šÈOlWåÍûÕƒJ/pmòÕ–ÈÖ“[ KÎo¯/¾Pf {zÓFEÐ� þÉ †ÿ[+(& ókwÂyS^½”æÌƒ|ƒÏ–ÿ�Õ”ÃÝ8ÅÆ4ŒG_%G²h;—®Ó Ãò¾”�]Üã9nx™L¿|«�µ[샯¡1•+ÓÝ ·/‚ˆLNä}H}82^(E½kÙ#œ™³è3[œÄ®ö½iÕfý"Ê� ²FÊalžÕ™ðÚNJ8¾ð‹\¨¦îSæ&C›¥ü§�ö>mói#ƽ#Üõ‚Äsß3ëÜÕ×G…tu�fK‡dt¹Zä˜#0é« Ma®ü›‚«ç-Cà WIcxÄÉ(æé\æXWH™¿‡7oÖt4ÕH !ªv/?½Ó¨uà¥Ç¿gšÄ’šl Si"¶ZWÑe7_sëä,¥v‰ù;A Õ”ÉCÙ]�Ãîq:ËC…à ÝêÛÞõ�6¼ŸRªÃE»[Rµ£p -¹ƒÜTD~ê!�d÷O[æo`꙽-¯tý 4Ó:…ìH~~q»©< SüUŸÝ çÙEâ¾}FÝaôXÓt °àíHqÉO)åNì6%*Sàó¼KdC- ‰å.0ÙŸMÑÆ7¦wu �f…Mïx°é,�ÆP]•cè+äÊûpØú‚_©Œše;yy\–ßæ *½°ÎÏ“í-Ö­_‘º¸vFÜ ÜX0èÉa›]Åi§ˆ©8^*¨G¡ Eð˜i {<”p¯gW”Í´ÿ‘[y�H" f{Âï�d«aïA—–©r3q¿vxby#ÍÀ¼QÕ¦ì6ØÈatku ò|µC®äÄìy À¬`&VñmlÕ\,Ö£cÛÖ6V:T«e‚{¬ÚûÖFçpÀ>Æ®ÒÎs©J ¥Å/{(Ê"[ÅðœR%ß'�Å«V‘$;º_çÀÝÃ[õÇ’á„§W8§\P�d=÷Ï4 †FêlĪ�Øï-é)xì ÷WP€3½»ZâÞ*´`n!‘TÆ<Ö{ªpv ŽóQg·snß'¼Õ�Sš ö‰çDíU’ü ±ÈM¸Wéóp02ÚmyE“P2Ž¶Ã…ÅµõÚá›’qº67Ö!ôC4»mÇ!f3[‰Ð¦K£Ãœô…ci»PŸä/‹rY°¥�wº ú± 8*uh笖F5a·O>ñì“§íÁ� !ƒ–Hª'�3ѸL®ªXB¤¯@ÂãÂZµfÀ¶6óS[Àĺ7^ǰۿŎí-öeBßu“¶Lµ«�±òšÓ‘§ ›à|Eg±”lšÐ8úÇÄjX‡²“ó·â/½ùäâ ¢qŽïð2–Ì;ž¦JÑJ… Æ`ÆÁžËÅ|;­æø×¶µõŸ ˜éÎ)j‰Ý˜¸1û3º ƒ÷ÂÝé/Ýê––ø9^åJ�¿>·<`¹*;M:z~=±q�8VÃmrL¼f¼ô¹Vùƒ¹¿6ÎÎ+\ù€@¹Û˜­dÊ¿Nbt Ž–@_A± l¼˜h Dq_Š˜vái�y¶çÏ‘é52‡RY’ëø@§[@­xÿ…+ϱœÑˆÀ,´‡ÂE´ µÐ3lr'.ÉÎÛ‡p;ÝZØ/}¸óÁ” xè%³çÌú!nŽ77ç·‹ÙH ß|5¾y»¾” R1 g"ùm˜$ÚUTa ζi–6ëï�ÁÅõá9­Y„éf¾¶íôò®7²ŠŽSäà¾ÙÎã#zNÓzñýÀX¶6‚•Œq2^ge€HíÒWû«!Á»ç�®–td;.0jd¸;ïT fl°äéŠÏ Mm €•Ê�3}#ÀF«p|ûÅ ¨�ÑXôB:µGµuD²ëfýx¤MÉáÇùο]¤õ›ý’W m\›€7�å 5IÈO¸æ îh4^¤ø­m&Ò³H RÀ�µ=Íh�&p ŸÿU�èCQóÝzKµqüäNÆÚ¨$ÐÛTüb«[¸C2ô.¨Ú±}z‰‰+-›Æñ•â¾Ë\QštEŽ‚ëÍoIÁ±æådîÉdvšG »h '^³ž‹$r³&*Æôš'¼ãÕê>�‹ó¥úÇEŸXâÃ6æÍ*¡)¶lÜ€°3Îqò/ûÝ,އ£¦'”`ò—]…3¢™ª³±nΠÁM(·&¶ ‚D´GŒ¨¬šã\ßp¢+Df¢öæ²Ø{_‹p›útÍr«<, gµ<âŒÃÀà´u­cö/ÌÙÀÉ(äùöÞçav5Ì…ub ómíÝaº‹¶ygNîöÞH9È¥7ÕâG@¤àæ3€Ñ,8«t¢QÔ! §mó†=xŸ4õîcCnlz|;1°J'2-¡Í�›Ò¸3€È—Ä Š28#õH|1àF=ì¸&Ö¶”Ž´CÌ£kO‰ßCVÃls <Ñvç{µfÌä0Û·$.“(Œ´ [~ƒ�裻Ô3‰?„·ëº_Xæ�Ëòu2ˆÜÄZS'õKÜÍâú²Æ2…®íB¨›¬MEôçc6kÜðØØŒîotcÖaÑDJ®ïÙ�û±�·a­…Zãgó˜Žýf T£ûØÜTaqv¾‹í^Ñ̳LLëlһص€¾Eá´áv´§’èýmh"E$­äÞ5Ù³óí§™+½Ï ]¾ Ñé0˜Hâ<Ó�hJÕöÖÿkŸrÜnó crW†­ÎM¸š°�Ö`Ÿçeä÷Røõ·û‹a4 –à—Ùô"ÏjäM¶ØÌñêíµ`¶ã·\¸Ã™Îß6�ìðRûO ÝSÚ¨´á<(6¤®0,¯7Yåè§6?—½ +â ¹TB€vlØˆÍæý– H‰çõ) J.=žKXvÛnBªbã³²ÃÔ¢çíq,±ô5�¢5`Í‹Ú_=rèÅt¾®H##8d|† £¾ƒËs‰á6^ ÙlR’»(Ä.jÐ~Ò¢5ÕiÁ—AãCÊ7UÕhÃ[” uB\ûUØ–¤BÇÒÊ¢ �)¬0K›‘e žâCÖî7Ïu¼oÝÖ>MhЀÄÃDE?[ø¦™¸‡ÀÕEwA~mÖãB½œüÚªn6�²KšÁ~ Up§+dtæë„3SÓüÏ~g\=ÞG ½q·RhŸV�Ý*‡õÊu’¤ËÆüŒ3ÙIµÌÎM‰ÿ+^›ªÝ7F˜óF`æ±wÌ î�o�nñ²,yµèDÔ¤^}¹bFШ‘–ï‰py ‰YÈhŽÁÍÞ¾?H;mÓÂAÆDüÍŒm2ܱ ÞîµJã3ÔV<�kAtÑLÉvmü•p—ý<À}q0ʳ‹ôɘK¼ìíÊ…ÌYºóÁÙqDZ,=Ê(d.Œ,¾IªnŽ·âz~Íšé«ß{„sZFÏægÀ‰Hózí›æ€+ö‡ãº67ã²Vë4¶Ø%§ÞpÊË`6ø¨@LLbàäõ\�ìXÂù+ r‡Ë�“l>C±ßm;í¸] s)¾O4œP¬c¤‰³–”²ž>�J¢N‰^ÅÔÖ Óš½úí²/Ó¤÷û½Ü ãÁN~æÉ„¡â)²�z7åZž„oPA’Èe=Ëûwb Åjõ8¢µHí»[äm'ªé9ŸmSdTcG‰{¸W±û*öÏîŠó��Öé Š]r×M2]ð/edÊê&�Y¡Žø°óšäBÝ %bpîÚVTWxJjÇ%/˜{í¦[xn~pVâ¿J$]7e¼©�o;He³h3&‡&AéLvÜw·íÛÕÝX%¾Â‹ætÖ~j`^™QWÄîXÝnÖ06_ gŒOP’ÛɮگDK±@µPê´µú¦G/B¨ ¦v‚Ž9ûR)` þ+’y 2x¯6*úÍ¿!>á"ÙãF|³kµ´ÄH(¬Í±[æ,7±êƒ*¥Û4±¼™X¾w´N>”˜ ñ-Z{g,?vpð*Î<Çó°†—%.šÙ„¿¤>`L?T·ñ 6åÁå9²Ä„ê_ÉÍ_ºÄ,vBÓ`I”÷„kþè¹ê½xÏÚé0<ïAîÚÒÞÁ²jþû,�{“o‘UtXÉ�/:âãX¼ YÃ'¼PžÐ. 6ƒk¸´ºQÔ²Tó7:æ„,0¼ª_%L+µœ7¶†YÔâÇ®t©¹*ëËç `myn渘2;‘S(}Và+õ* ôý›�ýŒ[;û‡düº­‚íô$�Êû3ͤÚñ�mêé§eÛõ’Å�ÿs7ﲡ-®J®bÏœt8à`}¼v=ÞÂÛ úˆAß¹×ίߙ•{Ϥ~ègœ„Ìã#ܬ°òÍ î“ðG¶èôcÌ ž!ߎÍin‡¿y÷e^ÒU:%EÀŸ"5öŠËA}×( é¼öµôÉÝD™­e®-xWÊ [¦@kg“Œ‰ìŒ[Tú¸t,×�.ÒáªdEWý9Á`3ß…}eèjŠà5lî¦6(—®ç™zíJU$8œÅ;®ö½åôùÚÞØI½¬Z~…û rÇ}ÈÌü°6 ©%¤Í�ÞJ”VÍ“üx]Ðg8üE] ÉNìÃ3ù~\Ú‚í ÞÂNõ(; ¡Qwu"áöe˜È"Ö (ì°,Lrr¹ð5«nVBdLæå_�¼ö÷¢©Ù£ê‰‹˜> â(®†c}žžsŠü�³~Éðq—æâÆ^C:&íå?e‡HEðÐÄãMEÕ¾Ó!blÛ•s•g¡[YIK»å³¼¬ÛÕ˜¸é�\_Û¯¹,~,ÔDÀga¢Ëõ“ˆSAdÉŸÝ07nZÐíGìmu”UI‚ÝÙ½x^~« ¶8’a}åäêö/Jº:í¬ ÏÞÚnÎÓÄÊ%©’Ûl™t##äóð\³¿:PçOŽ€ÏÇ üWö1Òá‡q­°_Ç<ì8æ¶Þ‹d;ÚIkœmŸ�/͘ì¤wdŒ5™¿Ä÷’Ë0b ­6x šlĆS¡¿D+í&y°_ÚäZî�™#‰0Ø`‘_Y Ú÷}5q'yaåùHuQj‡µåmÖ�–Ç:À ´äöVD$¾/~‘¥, Î/éDÜéYC u³š!aè­ë?ÏG¤7ñ´ñÜbËàU>€¸Ó'M~= t�ý ãoM�Š˜íþ¿Õ°ï¾¸ÚE¢m©û~½·�Óš”£±æ€Tƒ� B÷ȬBÛc�`8+ ñ3ÊÄTõ ÷;E%è]3)»U®òúŒœ˜YApÜͪF·Ž’|äÎ/Ä+бid¹D¯E8ê’>#kM/‘k}äѵ¹<"Äé,a7½áþAÃ"xMòÆRüû™YÃè8÷¾wöœÛƒKÛdaM.²M®,qVggÙŠ#bú"JÔSZüÝtõ{aƒïwûw¤C»ä o{¬hŒoè¼åZnÏŒ2¸ª/ÃeàvöˆÚÇj.2&—‰è¯d¬$|B­žÑÉ=mÁBMðÀ6Îi?Q*@=�Öæ£;µÀSžû$zô x“¶V]cIA3’�S"ÍIYyM=)dq„µ^Ù µ^ã㺷“ƒªUŽ�ÞZkPÙ¾îÐ׺8�hÀzíÄP.ZͤÍI´oÃk$쯻ۃ‰åâóÍ`wÛPôוŽöÓ¹QVZŠœ_�¢üþ§ÕZ°Ýf”¢;EÑ0þ0ÙœQÙSœ†Ù«¤[õ0¢},ô{Ça´jñQÔÅ´Çíê!£D!by÷&é” ½Eö¥œf™Šùî¤iÕÓS˜X˜KþJ¹lÌpè¨ÖÂ{Á<¯Äˆ.wÞ+ y€¡ÖÆŸPg›Srø¸g›Õk÷i!PCv`ò:‘Z-ï'vªh€—sh«1jõ84÷¢¾jDºi:—!{œ+ œî ;|TùO½€¤gQ±Y ú`„Áy<&gHרÉ÷ræÇ=1ý¥?Å— ™oœGÅ¡Ýn�º¯2à™dX’é•8†ãÝ×îB³zÚøã­Ä¿6xŽH¬ÜÆFÇ|6·LïzÎXÈmü­ï=”û¶.|r}Ñ‚7©G§0vLdç@í´Îƒ3[l½ëkñ ɤ·Ý24¬”kÊuí×Ä�^@¦Ô™C¸’tJu–k©´‘ßÈ’Ó—™(´¯§Æ ¿���ÅNïùÇÇ6]~’ ”öÙ&�›Ì:½ &¢-h«nÛ³gh—ûÐûì¸Þ,¬É�ßU‚fOÝ~¸#ÌhõM�ÅáñÂæÇrŒ’ø0pZã‘ýR•QÝó­ŒYrjäß™z‘’8ýûx�æØu|ôëOÌCíרÁ”:Á-Eú;�+•ʵ¥7ŠŸ”®‰ƒæÑ™9h £Ùœ@«Z¡µä)Âñ'Ûd²›Ë«¹ŠË…ráV¡XÒëîÂ?çË ª•óúî€úWª¾1i޶ñ¼šTU¥uHl÷ö‡DbîPM´9;¬’"3 ç§IËH>Áçzí®Ùz­ëÇoÃyA¹Y6·¬Z”™·Á4º\ÂBw™|h€dgT(8#/´’.=’Œ}^=ž7݆ù:´…™U9—Œ±pqb$ {5Ô¥”­®,kZÂ<ˆbHúC€Ìëb† ?â¸×–5Ô-¤ÉšX•ßqÞMìöê\¨¶1Ñvß7ºÉ�ì녃Ѱ)K>®ø|ó¨S’-£µ¼�xn±sТ41ËoîÙ…wxTô¶š­°ËJØ1îÕ8 üT‘¼ý³€Æ¹9£&ä„ä'YFÚïzO4­LcU¾ç�Ø îrw¦âXÒÓ•¤‹¿½^ÑïÍ7ÜDÜ&Éâ ÏÄž?Û\Þòr�tfEoƒ\ô2�ZáØûS[<õò¶:öäÙÛêkÞt®áfpf{”Þ %/.¸9úñ;#þ÷L<E�YMM;**D#¼U¾Þ7¸(�Ž™-}†S¬ÇõžâQòyß^Z\{)‰ýÄ^UÁ?LÙ±•FÇI¹T ¸K>㇕%Æ Kæ¨ ¸ MË-7¬d³�5x’üluÎÙÞé‘ñ+sÇù©üs©ü— 1´çWNôM¨¬T—ïb÷¸ÔgÄÁ­ 1V‹ÅªõªÉˆzyeJÐÚ¬Ýã€õ ]½ëçŽÙ�Ù—6c XÈ>Ô/ÎÈØ‹Ý^ßòÖ‘¤,ó¾b—<“s4ø 0?Ž»`³ "?¬§á�ú~ø(a•t³!{&Ã,Úüj�Ìñ¤oÙY’Kà^�ÇðØ›˜ÇæßaÙCµÕHÂõÔ‘ßã)*çBö¾UŒ»žR�éôa6‹þ+˜à2Ž È9×Õýû­ä›*�õ@|ñ1ר¬]ᆔ¿½n6X®1õŒTDŒ³K…ÐÞñ†sõ÷ooàwêïs|þ�r˲¬ßNv§ Å=Ø9‚Ò@äL’‚¥…ˆèôo•}”¹.\ï¤|UˆuÜ�w)-XrS°%ŠË€XßµS =ð4¬_Ö“Ñ¢sÒt†–¸T{Nžô—ë,únï×|g|ŠÈV€tûÄïª�›­p*/ÖŸlšÂ"�ßc¨9ìp1O˜ÞÖ4SßPSDMTÚÀç…Âê'×û£eˆi7‹î]ég¡swB B–-µ"!QnJu˼â±úØ#�æád…Iü�·± t¿_Ó‹º&_‰™k‚)äÝ(ÆÎô„ÝltZb’°^ 6…ºß«V?j"%ÇbÄ[m+Z•€ÿµ�Z:d¡¾*Í¢à¼&åû6 É"$\ ìj×'П1ƒ¸Ø¦Ê >tÓ3:ü•˜; Ä;öã;ñtúöʬRT×lðÂä°cŒÆa(Î.‹a¬pŸœ&÷ё2ÓÀ‹pètmyF7UOWÏînÃyr /ƒx`ƒÁòƒl@ÚžLóÓ™%m`áöì¤<Ô_ïvÐ�Y½t/¹é3¦°G' O΃8‰¥ýSjÞ�Ug*eŒ…v‚YsÜâøn}‚›/â»·G­k¯ÏÊ\7K¸éýbŸÙeÕ ÎH Ü}S‰ùüý˜?yÄØ‡H˜Aý{/¶Qoîö ;˜¶™pÿƒ÷töœ} /¼ƒ4ÒŒî㘾íRu™÷Ôâ�•Í}é{~³c¬‰ï»Cñ4 º¹¶¯:¸ï<'hüX ‘5vb˽BB–€áC>‚Û륵°Ó8ÎË/ŒÊ:Û–ú]�«×€àù‚3‡÷c¤ßnÒÁT:ÚXuò«õ¶ƒû "£`"ŽƒšmɲB|IaÃè2Yˆf=[Èß3<�=�0¾Ð=�É_{Äy ”À>çÛBqç œÝå¤þ|E„Øa»û »±CÛiN–-»@B¨þ¾ªѸpì ŒïFÕ‚ÑÓ“�Ž“hÐ.úâH0e‹bø^k¿–AÒó£7{t�îŸR•áÄ!õ™O%,¹~¥•Ò•ÃâîTˆõÞ‰¼†l j¡xO“-4‹gK ¿Ç¤¹Ý_†Ø Kë «‡¯9j€§n;§­¯¦1Ù¯ñ¶²µÖFõôø5ÚÅ%Bë_–æ+û�ª¢ûª´b›þèMÒ�ï>\|g†wñê¯"³wÇ2§ž(y‚åw^ô»?Û$ùȼ¾Ñ|QêûÔÞÓq‘ô¹ük=†´½þ›¿— )�JØ`¤;¬Ek³³Œp8E—Î,‰ëêrŽYͳ!éYkAB �Ô“¦“m·;:ñϵ¨PX¹�ÂÅo³i£Ü=B”Ó4VOU©¯ûY÷pÈ�¹8ò¦‘¯Ù=PRönŸ:7æD|5 }³‚”®è L§¨ýeÍmÃ&D*€H&ã멺C‚Þ?…8ÖûØR׎ù¸Y4§aQ… ´ã¶°�b‰ÆQ­”h˜ðÙ+@A9 H¾1HÌW'7†£Úf³¹ì.ö@S„#xETÞɰtˆ£¹Ø, ±˜@#à/q¢½âØEÅf°0"þ¨ RÀô�N¹—ÿ!8ãÈ᣾ÃÐL&5œÐx£�­ÞÝmŸMÌPÕ›3pKV;Û6‹É×.� Î�¡šyøøW®�»‘\mL ��uˆœõA‘G¥r�t<ÌÌ%­¬×Ѿ¼‹êÁªkÔd“åIéÊÞ윲üô†ÝH�þioÜ« ‰(Æ3K ˜�v%׋VXß~ÚjbÌúJõî¸ ôè–ñãƒÓ‰vÃàRu«XD,ebeWEËœ£ùÉO2õÜÝ•JÇb ‡i3g˜‹0½U%C”÷nÜí)É(ÝXÏñÔhlê]»Üž±€ÖõE‹«üÝr¬™q9óxaÓ6”¾G20WhRÙLny°dÁl(@LŠŸQS 'ŽDZõ»@ž¤bMI¶ü§ ÑÆw‰#…ÅÞMÿ^¾|€­\º*x²ž£XÀñ<€Ì1môªJž\'HM×ÓVA8˜G[ÆR1§†ç>3[Nü)Â*ï›-fä  Šn.U È)AÍ&—ô°X£‚x$ŽIêúdñÆOa>®à4Ñ`Én‡XFÁ¶Ø�²#oÛ¶yì8µêÌèùƒMàuVn£-Û[Ä[†n•„ … £³ªØ¸ÐW%œ>å®gkÊ.àÇ+“·#—;mæ¨þ§íìåK³Ïîw9@¬WîJê^wK@{ºöUÖÄ8f´|¶Ñ‘5>ųQI…ûÊí`jˆÁQÎØKî+{¬…‚vT0¨ʧ·±k·­£•3ýtw­çÙ�ñ#Aƒå<û¹-ì=oI�÷a¼hr ¨Ø·ó|ÃrЉºF"ª$Ñoos¬ö¢ìxG*è™ð³×¸×èÚHZ¬ÌžÕALZ``L^–ìÏê$Žç=VÌA|^ï3uÂóWi7²½ѽw/–›twe mx k¢3-ÌO¡kÙ&pK9‰‘@X3Cšœ«nÿžãðˆ)HæH²í�ë&Ý;³NN–“R„‘’Oå=ëAyÑäÜlL}go;k±H8é>W.*óò®l<Ój+!m]÷ š¹{‹Ð £ªŒE†äس>ö �1¬ †û‰j5çÑ·<¶ö€àšHÆ(Ke'4X_d™ãΣœåÌíÑU®¦ñœH9úl‰fÙ(Á Ü´£¾o›5 É þðjÆ ÆöÅ3¥²¦ƒQ!p÷5wsKEì½®Íy¥� Ómâ{v–bË Ì#‰€ê›Õ["´&ë™=¦ÓŠz¸ &þÕ¯ž¾ŠYžp±OMTØX=Ó{L„CŸ{Nœ¸Xõb^Y¾„¨úCÉÚ­‚y—»§˜‰í‚Êý®üJ�¤2Xx Ã<ð oªRlbÒ·Œ`üÓ`ϧɪkù)t¶ ÝG+u‰¿Ÿdk럋T;Ûº¹…O/·�Äfð?d>«�é÷Ú0ªž®:?Ç»oäÖQ‚¢èé–^´©ç1™ý°Ü\>QÚà�V³r£zOòœ')””ÙÎ`FzCŠí™ ‹%rê JrÞO¹¹å®¼‘=ï4‰�?*—⌠é˜KÃ! ¶»2/+Tt_^ ãºÒ÷ñ|ý~¡Þä¤G‚߃˜Ñ>Ù§ §Å�ÿR�}ñ|æ-‹ˆ)Hh½áØvlAÚ}¼W²Æ$>$Úm[>3¢�’쨷Â�ü½6êÅ»¿âÉ÷œ7]¨˜yy޹oωͿ“Œn³ôݸ)b0}ÞrþŽáýÐûŸ]×}»�¿Kiˤݵx¯N[¶»|ø ÆqºyTx€-¹ÿf´N ƒ³öíg°»Mò÷ž¡ŸM³ã2»º"ã„auÎnÊÏ® ek(·’i7÷™b*á‚?Ê÷T7cã®ix*¤‹ùº˜Q)t{¯‘¹r4Ò�ðhlDÚƒ²¸d¬Â_‹ôã8îIu|h›žnOS>!èJOÃ"›¬•í¿I÷Ü'1¹YXDŽÊk’½z43 x”Ø83XB%LÇØÈ zpŠ»édxÚûŸ^ µ¢HK”šæßyD_-8v[ órFüÛ½ñ ïÁ ÔcN�©©F l’¬º#-M3ü@#ªÜשg¯ìoP<È©ÜøÎgM7½¸VI­ÌV"sb·Ì ù¹¿7\f ÊËF}Õ‚+wI@öú}:Ð9F0íÈ\ó 3Uܘø„;ï:™�·d¥7ï.)Þ—™CnWK'ˣ哭ÖÖú‹"3îõ=™ÍáCAËáŒw©¼r² ¨$óï2%…õôÜ€ë´ß>GCø–�ÍŸÙÌß6w¶xPP×mtËŸr�º c îµæqppt!^-ÿ{4¾$íÄŒ¥'Ì0T(—íÁ-Š Äü_ƒí²|œÛÐJ+R5aQ1O™ÝúÖúù]¿Û&ùlADzM«‹æÙ|4* %Á�ÆÉfgõ®´ÙÑH FèÔ±n709ÒX 3–4ÉWHM&Ö~Ça;Ë^ïæh}ŽÓö ÃÖÀø–ÊÈDîëp bü@Ø$ñk“,öÍ& yH–˜Üëio/}pE,i–Ð w ©ƒæ@ìNøŠ`;bù÷ŽzöA$!mt�©ïL^óc‹„2RŽ–ÅE‹Ož°ðP÷æ�6z·UÂq-¢‚|nCѱËzµhÖ%‘nL½ Ê+[’ËIm5'gËbŠç÷ ‘;{Y»Ñ䀆ª÷"ßT1íîw™éxØí|¨†•ãmR<$�Ž3Äʺ½ Z›ºU>|[O{‘°³s£‰´ÀB° ( ©öñHÌX~%Ÿ@D‹µÕ…‘“HAi¬Ü€#¤s­_]tíüüÙ"ž—Ù�R6uù é!Öåíµ ™÷S?µ}š`q!¨IÍ ÁÜ Áöû�ëLå§kâkpB5€öñØ®ö~zY(~Ùâ»�«( BÏ5Åô"W>ý�~ÇyNì± î7=ͨЙ¹%Ê•ÐTW'øƒTAUöŸkÓ¶ÖƒVÜ¡\ö\•ëjxN3J¹2¨›à”õz\^>‰o=Ú7ƒÖM>åL‡#½,}~zÆsî75‘¨'Ç#5 Š`jõ6Ü\�BÉn+Ç0á+½¨N|ïm;YÃQŸ’§wíÒÃÆ‰d¯—B/×)»¥3©N›³ÓT4*¸(*0J�;¾àDc›û6>¸HŒÁ­ÀÈáµ#7º4¤P \1{„(\r±¯{É?»¨Ã|O_7vÝFÐ"ó’+ï)I3€Ÿh,[¯%ŠðÞYð¹óA@߬¹½q~åœàh;@÷ùí:"ªÍÊýbh€ôì£÷Zlû+îÃéÓÔ9]0Aì:kW ‹oAn„éX¢£�€è ÃOm±GuË; eã@¹Ø ý5 �Hà÷±>º†¦lh)܆«cFaË+¿dƒÍÇÅv öWS¼èî§y½OnšùÞH3šîý_Ç÷²U©~">=¬ƒÑÇj®cãd Z3î:|Ùs¢€§ÆÝ+@œ †Ÿà*Fê^ï†VM­d)ͤÖ ‚k<Âìšò^¬oK¾Lýr¨£|ðì N¹ÂˆÀ}ËMÃn›BF‹R_‹ÛJœ‚ç³ÉpîÜéªð@°áÏçZÝ Ê/O¼„üÍÎßÙ‚æ4 Å8äíõ6¤Z¼�wÞkÄ…�ÖÂVÛÁ'Ü ÚyÒ0É,ëeçj~+Ä­�d�ê£90~µí7÷u …FÉ~ C¼7(€¹ƒ¡®rz²4ò�mƒ­ÙRnk¡<¯€žÖ;ÌÚö9Y¤e®shÃ-Fö0qfŸ�\ìùÕ!jT"¯a«Ÿ%Wk9¿�áð#§ÎA-ˆæÂ^ PÿÎtN+ôqKœ�¸ÛwØãõVT²±e(›,o�—jpŒ�»Ì�k �a¡Ø}°ÉX©ÊDÏöTqIHýGa†Q €”·^/LÄí7mA8è kƒÛtß0K[hÄÄYÌ¢b¯ú¶X_­¾sxéöR-o†¾�î3k�];¤ßÖeYÌó·ËÉ;R�& µ�®Ø~¸a^ä´á×èÅãVU£ &°V3úfäíä8Ó7…ÌaÀExú™(ç±¢ŒØBz² +"[ùOƒúæß¬à¸µú¿GmT Ä÷`4çmš‹Ç컃ç‚~=mlie¤ â[uPÞ¿|– â$0i/¥±mÛUB)fn¤\&»æt<Æ÷ûá’Ôx6HÂf9 /˜bß¶”Z¼S· ö|J¶�3«T£*÷^ˆ)ØÃt-5{g.™ëÃÙ¾Ûúqtͪ‘z•|¤X fwy RôóôìÜ Þìí¶ý©82жÀ¸ó�׈—ío&:�—ü‘‘a•ïÞ±•˜5KmíV:Á'·êÈq+ 88´ñSE®X±�vcÛ¿žL+g.±PœrßI.°^ƒ²` ¼«[Ø54ì´…R$Á²9È&,'A4Þ`4j›GÍâþÑ=|¶²§Já1ýRÃ�É&Xµ­³~è�ý¨Ðó½ ÙðÞ±3>; yé¦ã_Þ·LoXŒ,§›{Ö¶ø œDDç�ñisß<«°ü(˜Tÿ@ü)Þ*xR|T¯Yq?Ô�ã± �×"_ÿöËày¦LÌn)Z؈‘‰,�žtÜÔ1Ð*Cü\gú×I¦ „‰(³ *ÃäǸAåv˜Sª•(�1�þKÈÑ~�÷Óò zÂmUñ“ª–|% J§ÜÛûê…§yzòwÎ|S©ð<îð3òÿK!¿ôß/Žã’I8+ES Ÿ8s 1Ÿê� T}¢~“3¯€¹XFMj·ñ5ÅÐ'*hÃÚØ++[8ÿÇmQ€ƒî€,'¨“3¢?kñÑ(=°ZH~5 *{¦"â]JZ¤Œ O¥á+X±Š7 ç¬ |�ðòP¶Õçté‰�ôVU„4°sšê4&*˜1®dAÏ[·põ°%:ÎY6 ½Hš6Á´•ñ÷*Å|\.fºtk#@íØZ²…WÄB¤ S»2ZËT´äîAÔ¡�«3Y, ÌX†Ì`ˆ‰ ÑqGïcµþ·Q¯;_òÝÒ¾'»Å" C1ëm“ ‡PºB ¶ÙÄâ×Ù­Á93üè mám¥(Üä™û­àÑ}•©f{K:*�(«FÑ/òÑ÷À¨m®¥U-:IÕox�þ.DÔi¥«1âÛWÕ–ŸÍá S6–‡—Âê]-c·H:¬Å6zwzS%.²s0¼‡,"xüÐ(âR/­¿í‘‰]ï½YΙ¹:�ÇdW­9£mÑÐ̱«)©9•l¥ŸÛ3›aÝçî¼}Þñ�<¶"O)‘Ó¶Üy¦ÑfsAŠ‚f%.%H?Õ§Ñ\Ÿ¦“³P9 ì*"%å.•Íé°¿wF— Ò!ŸÒª/´šÑ³ŽhM¯>Qg÷šÔƒøJR¶Ž®Jmœ+DQY*„jc–ç �8‰ÅoÇ¢ó®ÿä€ 'ú„D @”®¥uø>þUö?Áô[æÓX‘rOØB�á%�ÒIϱUÌ{ßp¬i6YÏd_ú@¦Dƒu’.•š+áÃ+Ñé‚€ 1ùüu/1N'{F«àÈhÀŒÄ_ ,?�78Zà�\& $õ¤Ðü¦XX§ò¯w¸#A²k峑MJ2è"ÁÜ�¬Ö¼¹¾~à~å×QŒÂ�©$¦ ÿiÜb!ìTížcUbx"£}þ£°T^)BµwLoE¨ˆý6áb‚à¹Or)ìp°ñ^ z|ÐvB.Ï °8îw$Z½•ôiS¼çñm¹¬î(s@½þ5s_TóþV.S¶¯0²ž:Õ¬©K°ÞtRbÛXªÐ%¸ww¼Kæaþi·¶Q6Ú-!èò¢Y´‚qÇåìG \•På Þ š,½ej <ä§Qä½Gš—óeýN0MÒÇõiZömÌ#ú0EeìO“é÷M˼2±Œ'®”a@&Bz�ˆ]j£Œ(ì)0í*±…œµ´�†ßVÀÏäÝü�|@Ì¢¦ý¬0fWô!pû¯O<, ”°‘~}MëRïÅF\Õ£ó)Ì Èßý&#+ Ýê‡Û�9ÓÓ#Þ¥K`¸t²;†A^çê(fRæÉ‘V‚[ÒÜvd‡®q²ô,Aµ ¡ï5ûæf;S ùÌ>4ÛÎX¢Š»�ð>mûª>}òÏø60»Ñpé0Þæ=ŒÔä�½\p© À/S¼×A*(¹ßöâ„)ÉêÆ¶-Ö¸¨ªV3G@aŽAé¹oßuwŸks‘­NùS}»$"?–^ýìkƒûb’b�|>[+îjôC…=ƒhé¯i] •h”ÓÑ´¬ë—ªÊˆâ+-æ?<=_˜Â_͈^Þù }I�:æ1þÂ$¬Å1eO tÓ  ;B�¶&qõ'ù‚¿­»Ã¡Ÿ¶È²PÖŸïB¶’Ž{¤\ÿ”‘¸Î(!qU ¸sî/Lýw®CÌœ'ôTËÍg€lɪ"kâò¶u,¢�£³!dŠVnÌb¸EÍu]樰 Iék�L ‰l ²ÈAs•Òa ÁÍ™Lœ67§Ù7–Q À©HGJ _Yêw.+‹üVsöÝ07 ºÎÐY^#.EåS¢�˜h|¡ªáuaÕì‘KoM…kÜùB¶8êR`°¾Äuqr}6ÿr\�‚«g YÿšT·­@_O‹K<²à>¦0Ø®ˆwŽíþÆ“ô7ùÏ8œž…r cÔž Pî‚Sq»ÇòN„_Vˆ$*bLQ¸Êê°@p"õ!všU@•�­L8«åÃuûY=ÞFC@Á÷`Ïý8&ŒyfKzyëFñ•Æøõß9 Ì YrèU»[7O˜y«UpÙ°fl'åý]5)´(–߇8±Ž½‹Û‘ÜIÌÚ!d�i–½´Q?‘i»þ¾›¯ ØZM9<Ø~�d‘N/sÑ\�V(LÓ©7 \§U{ä V3YœÔ±ÓÚák¿e~Xðüm‰Æn òñÓÛtËà\A>.Ýi(?Oÿo%=C)+­e¡-`2uÐ&`%þš¿4LªyôêOZ�û›Yî¡ylfæ|c±ê‹ÿ °KÛŸ¹\±VŽ—ß )Ö‘¯‰�·Bè·Ïã_w2h1*¸cMæ×$b½œX K­o÷5Þ´avdºÇ”Gû&°…»W`ß𩡇ý65u.Ößv=-^?ºK?ca_zTו·¯"Y�3Q:.î�jL}]¶»ÅøÂ§°7 X˜6×M\2ÿk7qý°Y಻@OÖÃóYK„¥Ç¦FŒAz‡'ÆxÕfIj‹Þ‡ 7…V*�ö2¶hAfN"ÄÆöësBEŠMÚä5±¡£—Ñ0½ì‰õv�ÅÅ/šf´–��7ºÍL` # ±KúÉÅI=ÚL8àŽp°‚süÞ�hÊ¥ÕT¬Þ– §85Ceô¨^Qq‰@d¸ðýmøÀäÍÑñÜÑæ½c¢¡�òxö�bCù+íÚ¯ Ä4kXüPY‘6hí}Eui·Pï:rŸQºÌŒ7„bÉKyæ& ÌÍÈ 4úådbGQ-ƒ#E1_X¹B§—'ôUüag[áÐN›¹ÞéFv]~f'Κït,æ ¶VI‰”ªÂ|‚Îke÷¤n?Û½X¬Ëôœè­}IYiO¶•�%’=“@Q YC½§;†|¼OT5iðe‚ {Û‰ÞQãìó&¾Åð#æàÇí,¨Ãîuˆçå& Þ«lH+5ód_ïLy zü(+3HcŽbö¥û{ZÃÒ(m gå7ÆØ6® ~2{¹ˆSZ8d2ª…´ –Q•s\ÿÙ(eØ��*¹õŸçÆW :Ø•„±™†iùø}B�õ:•½§¼ù«ŽÎ‹w®RvÆÙ i0Þx”¨ôˆélí�º�%œJŽ;ӜțQ:g öªˆºKo“ØÖÐ^à»9d£‰à<,Ê¿õc6K3Ã{³a+¾ö_'®8é¤çÍ“k’�1ÔlhÊî®»Œ'r¿%uíH12H]7ræ·tt%Ð×pÉôl²ªœn[iÞ´}É%X¶ëU_úú·w* IÖÍ"� VÛ`'mIþÑ»�”‚&’Š�%ÒMAÀȆm<° ÖDØÐdým%B»²Ô?Rè+@é_œïÊT%«›X3ëÌ3{Ê §¡2x Ç ·nóm*±…6ýJ]5öìÞ¬¢"óqàÈÝ|Ö-�u.;ª}ã¢"‚"Ë?˜·yånþ¹”–ÔsˆSÍ%OtYÒÖÄy!¿Üb—·$æà,¦˜¼¤Jf|Únúö½Èú6”­~:q·‹jõœCb£`d-ócÊ^Ê õd) }rH®ˆE ìŽôy.âÈ\ŧ2Rl­ÉÕ‡ Ï».“ «[Àò{ ñ;^g=¦öùY>¬üDx-YσÝ?Óƒa †úUåûWy�à¬ÿf–¨«~(ÓñoÁà;4aeó“�Ä�ª7­ž¹)ëj?\Ír9 ÃZopÛ:�·Ãi…îÃBVÕ5?–ƒ¶mE<Ù•ÐkHžÄƒ‰9è+ø»ž"ŠŠØ÷ÍÖeÎà}¾ô:YÂŽmàÕÎËÉß�E?+› ûZ´ÐÍŽq&ùgFü°sœ‡»—½fï=k@MT\bä‰ØÎ±cNõôRvÔ6ê²Å%Ö¹�¶`«âô¸Ž3'c·¶ïÎÜô\Ý?ìî™8#›šÎã;B:ÈLé{2!ÌòÝæüX®�x „+}›ßKvò½"Q_h,ìüû>-Ô Qdx=Á7æËµ½ƒfÄ–¯;dk�Jƒjý±´ž�do‰ Ã�„�ÊN_¡«€¯o›=að¬xÓ¬ýÎÅÉŸ"OH,–ULɈö;Wë0ÐëˆúÕ“†‘Kb�5DcÊ“�!¼3"Þ$_e~øù›ã:a’C�ÎÉUoÞÛ½ÔàƒÙŒZ圔;{�z�=`o ×MB‚áœ0n< �»'Ab‹>Ð6Ÿ.6ˆŠ{°í›–$¾2k ¯ŒÙ„~ �m‰ìyFŸmµó13Wä*L:\žû]æ® Z åOcD�:Õ–ëÐC{‰) ú˜46ˆ�ŠŠŽ¨`¦pøBÀü7c–ÐÕ}¡—K+L³Žß!5¶t¨‹±�Á¢Î„%î+@´”p�Õc›ÛKrI>´Ý”ß²o®Ï#A�œ„éó¹ˆ&ËÓ€e†Â<çE¦êGW××Ó�¦ß"VjSØÓéÒQâÓ »Íx¾q£yÐKÐ;5�ý0‰u½�±¿×Èu—G“y: õ¬ì¡Å¨¤MÈþ€n¸Ï D—L[‹<]r²üN˜'JKŽ››RÑuÊFË‹^:Nöì¥ Âì7ŽÊ,ÜmŽÛI‡�Ã�A&ó´‹Û_˜¬�Ü59ÙØ£5Q Dy‰`€ÄÂg«H›¾†Ðù g܈݋–Š^ˆÙX¡ê°ÌQVϰ§¼„צðEí±ŽD°…G­îl[Df3ÆäN¼"[^๠”*\#âÆpYiôã*Y5;.“­Ì�¦È«~éƒ�ÍÚ ®qfô…ˆrÛYÉZä‘Â?¯O¨T£É£õ>„±NŸ+‹…ƒ§{‚HŠiÅ÷°@u-Q#O;_[ààäó¹óÅö+€ýªÖrï�w³U÷1=°åyæU}Ë8&¹>:ÌÁps9ÔçC€”1ûZØÁxùbÂÒ9EÂá,\]ÛÏòÇZ›"0 ±h°1¯zÙÇpCú=w·µÍï‹\ º…aåzâOè 4¿m˜ËÓÛÖúä˜ícx¼ þ³»!N4¼/¤CÓm÷ƒÍ¶¾««Ü~Ì¿×"Ö�¹|í0°äÌl{›|X5Õéô¦�)õ@bÕâ·§·N¾ípRÛw—O’óiL|‘àl ñ{¹¸üVÀ7È$wæÃ>ˆ#ˆ‡×¤ `¯Cµàdhå¹Ù2÷€�ýKö2.Ûq�!/¤�Òo¯[w¾ ·Å„«ëbèTŠkŒ•l.õ5±UDk�ïñxû]©Ò ä¬ÒÛÙñïMœ+òG9*k"õÑFÚûõ²ê:²Zq¾~Œ�`ÖüÑýS¥U¹0Q#+ ³L„Hê…iÁtx›ؼæg9?dSfðþ¡Ð@(ãÖ!ÈL}žô�7µGòÉs 2%éTø$}»·¨7¯_²\ö$³Ø®P~[�¼ý›sîfŸe¢cYB Í‘�ˆó*³ì¯8UÖp+f`å]ùc¡ Z¬âîùõ–ÛKñ0hɘx<‚ÇÀµs2ð¦Ô­€æŠö¹ñÍ%Ü›p¿ [ÖÑä[|FÂg~=ûe€Hx"ᦠ螪…ÒÕx!‹‹O,ÆÒôóݺ ˯–ê.0ÑqÖOozŠgš\7 ïgØMƒ5�°*»€ŒØv·*•8öa/ Ò%e°œ?P�Ó�K†Öưæ�ëšD•)ó|õgs]ÏÔúÍɲÁës8¸þN¸‘­eÐuRB0®‹nÒQ;ѤGí\©j ¬ž †�7ÇÈ�:ô*'”J ®ÀNýcå1W¿ãwιÜmI±-�†ÂºzÆÃƒËø{�vÀ?á÷9›IClþC¸D?R, }Íå»W°hos��áÚ RˆÔUÏâåS4—m×ù¯P×¾P4˜fpÎsC¸u[`Ôê�±ˆÀ²?bO.XÒ <[S¯XÈèF‡lÒ.Šn ‘OfIت8.bãÓ_³…^Ðwññ{·5wg´ø:�¶/Ýù0nN¬Ý� Ã¦Šˆtû˜óU&ù[q%tχD ™ýÖøÃ§•²Ôp 1XOÎÖÁ‚mMþ åöÔóæöZp©^G©{=ÖŒâÃ>ŸulÐUåÃÐ}—\i‰YÉp]B¤“ÿ 5 ÁȱcÛ²†dÞW)òæ<€g,Ö5k§�F F�#•09âµ 2oe¡8$#çÛN=x‹�&”ì‡(øÕ±»¹Eœ÷—í3ºÈ�ãóžÔÎ=»6!ñf‚¨^ƒç?¯Y ‹äü2N²¶âSÔð)-Yí²Fö£¿ §õ§å,*¤*•ž³ù¢Èø5¿Ã}ͶUñXpD\ÕŠf£½Žë×�nKÌtc[{>–q¾çÃ^;Ç~÷íü€ùR+ž‡¿�£tW»ÇÈ`½Î·¢i Ý&zN7 ÁH†¨@¾ˆ·¾NÛë˜î�ב¦•Îã" ǞѼ¹¬ \³nD÷CŒ F*`— ¯†ü�Ž•¶r£–ÕN}mQ† YÅáŠÏ˜�{Uµ�e9f�3ÓëhaV¹ìoú_“w úÕ L«ïÉCIØ<—°€ZŸ±½ß~ê°-gÈÞÙ:&!¶ÈxmzÐ9f°£`i4ç6�@2úÐùŸE<\ P® ¯ ×W­Ã|ø9@Xv¶oEíêƒEjÛ¶‹&rx@¶%BÀ ßX3‘,}÷,Šá8ˆSG™w¡‡ Ã(£ü;òM�c¤f†ý¾qjÂÞŽç}xÈŸîó¨Û�¶õõð4,2™Fùêé? ¨ñ¼{ïâäŸ2KCïÌÈ鞬é6[*¿ngÐjœ� a'àù•pšÀw»äøŸBÉ»¿$e À™û öãûÖÁ¾W J?ïˆ:¼ù¶f+^Òý{¸Ý—HÔÑ„Ócë¯y½¤]WÁ×>ÔÏç·¶?0F‰.çáô£kxp0åN¹öX~¯®_�è[ƛÆ™�ª·î¾Ÿ— ' j¿0@{%Û(Q¸Øýô©-f“¢œo ÷ôË~ù³ÞM_á‹Fï­¢àƒø¦¤kz4¦û㘌m[åÐ6»|Ò^³H`ýêeà XÀ´Ò·Ä©t&çõ«pæÉþ´>fåß±�j¶ò¸®Zlî`ç›ý©²¦N*ÙNWGq@'éE”-YîD0X3i²�`¼³4º< äÙ�†ÚIüûŸÅæÔ}„N…˜Þù}Þ¾»Qc&Ñ¡×÷ŠìtGÊ4!�@ôâ« á?Ærzp„¶gØ $G Ê!C`Æew÷°‡ƒŽ:Œ‚}SçlY̾»ÞÜlìpÍ(‹@š)æ­¤³f§Y\ÀfÝ®Ãy¯�’À½ú¡Ú7ˆ<¿Åï5—;7¹( vo…oƒ;5htùúÁ��Dñ}�VLÐi—NM<†´þÆ£éÄS¾³Å>íߌ8�ƒIÁimPÂÔÄ7Øb^ºÏ$ŠüWw¬Qô;Îß `¤ôrØ$Åìåö¬¤ë‚J¼^%8{Ås•Öí‡ÇãóˆíÖ¡æ$ G¯¨Åñgÿ€4lÅZøv?Â\Àâ5¥·"­ ÂØ;K™q�┥ê�)ÖѲL=&"¼…)Oftôc M¨Wr9tøÅô‚J{="‰ÄsïHr˜aç'5³‡†«ÔQÁ;b�=6óí,ûÞ]Ñm�kî;ÑÓíöÓÆŸ^/¡‹Àé6Âáá½sc{ÖŠ_šÂ_×${Ö¤T𠥆µ‚&(9 iOÒ´›Õ:cqh·0ê d8ø·|�®Îdw¼jyÓ¨�ßî�(8s Z¦M¹_–™½§ÝÌ?�ËóøËC>sÃg ]ïÄx7’ß|aË®ÙC@Hº°&­ ¿”x§®]K¿ öä²eøh�¡`6¹Êb _7ŽQäcè‰oÁ‡ìjÜξó'j;WÚ`´ýÖë¡lXå-)‡�©êÃH#-Lyù gu ;!ê…0'ime] ,$š\lRDÊ÷ ù‚m¥€Öq ü1âd<¸`y)–³ž‚/Ëk�ïP´N¥UV¢Z•:®äÕóR��¿*!õ”N” 3ü¿­IyΨK�+û‘Emb;¹÷›„’Ÿ|¹ûêO�„gÀÊHe¯kÆk¸«ÏFF4Jœ­¡{p¦¦$¸¬íxýê ;¹sO©ß^ -aÈãºôZz*7R °ò{ Y–-¬W>C�ò…Á©%]0éAò.¿‹#Tyî²?² Ëã}³Nc(ñUômlc`¶I­ííä}ÜÑÈ»¶®´‰-oÇçV¦NlómÛ€-ó‡¹ëQêû;$[Í›g\M…;»û2Ëüî >¬‘ô¿sš}DH 6Ól­óéwX bœoñÚëzw�cdc ?˜6EµAéÒOq�ZÒ觃k¸Ó‹úu<œ`9‹f£vý[O_–yå Ý¿f䮗蛼r5ªSÛ6, —Ž3±¿¼v 9лSÜòX%Ð6!ôÝi‹m¬bß…ç�õðë_àŠDe5úœ29 |`œ}íCkuÁÎ|-ÎÒ§]ÊBâˆÖû¶š?l·@Åu1}’ZùC˜ë=öÓŒÇ|eo±û 8Æþw›åÿw“Ü:{>c’9yĪƨ¸Dï•l}w5,p¶“Õ¡­¨FSL°„Ûš¼c!—méLƒY¦Í{:8”ô¯\ªtŒüb #†¢º"4�È)«õþs~ŽCnwf[†[ rf†âã„ÝY“kždËksÅéh1já+TÔtâ¹z¸}Íž}wfËûx¿.¬Å¿Ù&ë®ùÆ­ÛݵáIÄ 6‡ ùÍ,) gŽ‚/—-Ý>y¦Ü#Åð-vÑ£¬–ÎĬ ˆåa[5pkk‘×´ “¡‚üÀw}Wï¶4·óáû§Ùu�Ç{`9µ—zVb€–øªè�ìµÆ/½‹æÑçfo—CÕ¶(½ÙàäÕJ~D<·á·±41ŒûgÍy�öß™z ,*¼kî‰+ Ñ$ \í*&ôºëç-û¿—øæ²ÍÚtŒ.ï§�·ÉÚå~·$k¦-½„góTÁ¥V!6î ¿Q0Øþ¾‘°úD�Ùo�Â¥qS\�п9p°ÄÓihÒlüJâw™ÑÚíÞN98·ŠÇ»@× ì½áÁ½$˜‘ÃÚŽÔÇ•LµäŽWÇ ¯JyÅì)ˆ­“;×U™ÇwÌ•U›xš±U⬑t¿Zq'¤ÝÔá6ˆûõ[Oj­C½Ã1³v—ö¦`Oˆ ›my½Cƒlê¶ö²¦¶Æx�"¶«�d͵8Æ¥$‰"ôOfȶÅÃWÓhv¡zE¼g�‰ á¶+É�Ù’ÈÈð‹½ìmD3ÃK¼í,Ü_�³1}m÷Ûbж~•°Ýt#rB– zr¸dÞìãHpÌÖ Œ^U÷Ф2ÜÒ9Å’€zZ¤Nò'vÎ)¸»£yiž2K©ÛwGqFe­vqChÒ¾Íí®QÑ«ÇìÂŽ)!q°)ä­œÀ39 «d¬ZWZÉfI<‡Þ¾¡H‚×ÜÊgÙ붆Ùß¶(3Âùöw¦Ñ<:Õå`ó¤’I¹+3Oe¿W‹ æ)G ?™ü{ÖeBL �jÞÝ×í·9ZyïDŸ+Zš6álý=l²uVµæä�G’Šw$'| %í+‰”5¢ÒŽD˜’$<ÖÔ¨š'Ñ ¬Ñ’õx‹QjEÁ|¢jŠ—ò4P&‘æã`css§�< Yêì¶½¯¨&r`ÚšÙ‡D®:†›¢rqm›‰Í-À>æ;QÑÙ×#£]$ðûÕ>ˆ[ItjÃmèâEº¶’ÙbøÈ¯Îy¿ÓÅ\ì3!®i>ý«ÝjAO÷m¼ˆéþÙƒ Û[pWk �ûߎ÷…lûŒïëW»p4‘àköÙ #!ëÖù1K\Ñ Ü½‹8©4üs$ŠÂãê¿Éª\¨^pLÇhL8Ч�m‹H´q%ÙàBgÖ[`Ÿä*A,�/’u­ks6–·btùpZ¯IUµ�lÑ9 ”ìÚH§™®8ñ‹%è†Ìhf_µ/í†!tçB7dÆ«`c›w‰NB)×Þñäfˆ}¯›Á\-²w$üC�[Zß"FË~Y/î= vñ±ìb~ý½Óé6åIÈ'ôK:2~Ò†?&s¢±tdó5P¬s’¬¾z ¦…8{ïA ‘Äåyf¶úÎ,C¢ž¯Y¹HC€Ð|á�®Àk§ ½ùP‚Ðo˜Pð�_㟕ÎZË®BÚYÞ¸ÀJú£� »€°˜ëô>'7[<·^YM`цhÏ�Õél9S�2å}ëNìÇ€[ÝÐÙÌöcŒ¢2·Ö=Ùqr¬%.˜7m±%¯m¦ï<:Âd •�Ìã7úëWl4\Þ}}‚]#›! v"¾™@òçÆXØZÑ‹g4`9ŸjƒÐG’^ØZˆ3Ùf沆Å';§AÆÕþÏ5ÏilŒ°¤o¿èˆ€KÖ5J÷æ!ŠWqMËŸ»o>ÆëëÛo¹Ú¥mrE°»½giØÃRîËM¢rwñ+ôöca£ç,šÿûàÞñòZc†&ÜÊbÄ|Š€Î¯YkNÉ;?ì® ‡U�ù©X�RÔ ± Eɤ“i"úÚÓnžk—|.Z�¢kX‡‡�­°GU~`�8â·Ú3¶|zÞr[ârÿ”ˆE£zÎ$A©Í‡�þ¿ïÊPäï$C¦�í§¼û37 ±¿ö#Ï~<ÁŸ®¯�)„‘€ì;4'‰ñi¯ã¬”2i`t�½Ú�-5ì†c—7pÞk×û5i‹¬ñXö2/M<¸Ô�´1{‡'ã oxs!ºx—së½~n?ñtë; sÍ[Ïj»9Xð É ×§«Ží™J \ã‚„oX´ì‡9B¸Ì¿ ü“ËÀÝ!¯Í6»~[¡Úu˜) ÚVЛ—2ÃRo``P­\YŠúüÚI'ÁÁozì L!‹DpÛ}p!nY_(–ßP ¸Ä à/Ë@·^”ðµ’�K%å[Ï~*à@žExg{€îþ_tl’ÍÓ¹;0\„=~˜(99Á“¶¹ŒcèG›èõð'·{À=[aaíâÉRüa¹[¿¯%·²æi”ýd €%éë;òë“#Û�µàã·á÷\Å ‡*nÍo‡7P"-�E®­´.o�—Ö7„Y¥aºéu£%ßËç¤éhw dÖé5ù>— u‘6Y8®«Úª�Ôð0I`8o¸3IE»VcšÇôÐ;o+[(f þµrÿ1EÎ/†nF�v)rnèÑ0 ù(!]Œ!tšü‹ë(Nvú 1bÍljxdµ†Ïš²ïP�b¶Ç4 8!ÇX`ˆÒ42�jn8ÖÉTRTŠißô–„æd0k�ÐCN,W i·Ü³Ø˜ SÒ¾aŒ( ¬ç³Þ[këdǺ³òÁèÛ¦[‚.‘Ü% à9.Aî4§l} ÆBö˜‚Ö'R¦q©é4¦ìÛë<lŒu�¬V„ 9'¨Dnc}Ïå¨ûMµä½q÷æÐH Ç™˜«6ÚÖ Dç®trg7VÌ#‰@;RZÓ`P(›N `H·Õ×F‚,MCVskØØPÎ|Î ¨Ü­¤ßÓ]®ÎÐÓm„íðƒŽ®ÄÃÍ.-�4Z4ëò¨ex_Ëçfì7½íVù·ö‰³ ^˜#¿ñ>“û©¥S‚èòWw…„o�ݰ«_]ø´1µ¡ •B²NÉõÐà02V&râ†4kDbBiÜÚšÐó&×!ÈtöÈ¢sFEGA2 ð(wp! tÈ,.­8 ~ì ¦.ý¨s¾ïZ$ºI�$­æ/©\.ŒÈÔ¬.ÔýƒÂ§ ±‹´$–xW¾M÷Îf�¦5–+j•åp, #[= µG¸^i'×êl 31õ¾ƒ^ÆoIÃk˜E�³ò.qŒDá‡Ú®¯OœDæø¿0Ç´Úˆƒ áÒ.x2 Ù%‰UžÑŒ·Zî6q"ÈóWáùŒ¾1cp·;ð™Õª§A6Á…tY?à}Únª£¦Ä–ο´¡ðvcXUíÝžfÃ+_¯ž‘¥°A¬ŸL--Æ:QÐWÒ8ë Ž—›ÆX#HÚïÛØèy~�þÔ5ËQib pCwæ.@¢îV®v øõ¦$a"mÙIôä#Sí‡rQÏ'y€3lQ«A§-bNèÕ ðPI°aÃ/ßE<¨\G�J(ß�›�Ÿ‚î¨ëI‘‡æ–|/äâ[®ÝÊ5³¢£†0äIñ &º~É‚¸…PUþ÷¿­™�" ‡È}¶Sa2�‹ [›Èo‡YR×lA*�:g’É žµÞžŸWíâÑ­®“GõJ9U펯n ÞîJ­‘3»Õ €VY±èP’j X .jfÏ[,¼¸61HÀD–7öøÙË�V€J›ŒÌ,_‡…fx�h0¸)k6·Ä§€!ù„hè›å˜Í}íšW�mYÃvõíÁ£q.~¯CR '\eô�¾¥œè¶@FÁ’3Wë["ªà"QüºÙ~Óãc¼æ˜•_ÍÊòædsY·åDD+˜«�°×Ì?ÌjÙ­7?–_|çEj™®"8Uuxˆ~.Y°èF nÒÜg Ôò ¥þ{ß5åœfÅsÚÐwl–ú&ýn'âæ™ºŽÖLÄƒŠ¦õk *úÝ ´ ý®§Ù.p³2Ô€d}wmWqì0»t m)}°'Kê¾îKËÖ÷CTk~šú3­¡º¬cbÈÝœ4%ëÑ(K:œ4b-.Hȳr7auPæºRG¤­NÂÿy½˜×qíïh9P9¢gœè/zßoÈ…ªÓ‚€Ûé&/‘©ëæË‡ß¦Þ×óÍÇ•›`Ûëe4ÿN(‚ÓÄÞb0>Žúdˆ@í H4M±#Î[» °mOà˜âhpÈ“€’ôÆ Ž®ôˆKp�bN`ôW£‡À#JmôŠ§Ï£Eèý Ó.ÚÅ6ßêå¸a™U˜Ü¤m®\¢òL!¯Â� Þ5pª£\Ù¸Z’ÐYÌw5›ÓÅÉj½pŠRÃ�FôÁÌæø1II¶�쑈)]~IbÔoÈÖt—Ï“¢­sÍwoì~N�²Xs�^qcÑͧ8 "iW !.|fa‹¬,B:Õ UYµŒ1ÔC—I)œm£h†:Ú™†Áê¶ÃŽi„Ê®aí¿R�ìÙÏÖ8Æ)ÖFwí*¦=´FUçä~“­°‘ÓTÕ¹væüP 6Ù#®ç¤IZtåÇ�J@l¨ÔúÚÜÜuµà—i|ÀþÍ�ß`V âËT8ÝãtP|'k^5u‰ñnFÏ™6 PÓhiåIߤsouúb[?É0l3ɪ 1×qÎú×ÒM‡t؈•�x¼ÕxH8¥‡<2ìÈÏàD[Ù¦ †Ì)�¤¹´Žî/§˜Ü�-Ü5YæäºXEÍ-’aÐ8<6©Çéépáã+ù1\ÜFòÞv½þ®^äÑx¥_OxNœíPXž¸ Åtˆ0•2X1²U^rúå{°!‹Å¾¿^öšô´™‘ Ú«)ÏRÒw©“t‘n{w½}€GH'ÒåÞð€úúÜ åð°2( ­Ôo»_�Jܲ‹htm«p÷y€ÄÓá‡M ×Þ¬Ä"šûµ”F«YÙÍò)Ópt]ß®UÎcaO |Þr!¨ì•Þ~�‹55˜C{EøÙ£´q,w²w"©¶Æ•ÆâÐXÈþóxM¬VÍš¥`P¯Ê™�µXEðf¬ @B›³ý0pÎ1]»ª^æ¢í�»`®·‚+<˜o6‡›¼È_NCkOš õ½•Мûâõ¶’,/Cj• ±°p~^ÜDsÙ7^R¥ÚJç„’Êm�Ä!·8Qn~¾[!(��³ÏÉñô¬޿7Í’[jÐÿ­y Zó„ßL QR/ô£6‚¬‚°EE÷ÁÑù@¼QÒæ-+áM~àßl™?r‚¾*Y¸¥�!-\E–ÉÑú†˜¹Ó”�ÔU&Â"ðFÂAñB døÔs}~L$›~²Á­“„kpªxy‹¥�}äd�>‚CÇ8W]¿Ïá †ý<�a¾L½‚L,H€úºMª?"Þî„üÕ}�DIj×ìÅZk‰†W¬{ëHlw¿ÜÏW-hX‰‚ ”`ÛöÁèÙ§ÕÙuòc°Ÿ¡ÚkÓlÕhOÍëèC�µ}ÖçÑpåÓ(ô¯�GwéóOz]ÞK7XYÊbVµLàÏ¿hñ:q4×1€®›ï޹<] Ó6¿Á×b£Ó7eR­fùá�…¥·Þq¦#ËÑÍ´WÅçãÈž0P¢>O1�“£É!uéT;Œ Å´õ^o˜5Líýð¨¤p";½2ºdæ+�]I†j>jæ>{'×5§Z“¼QND�DöR¾,ùxwÉñ' MŒ ƒŽ!¥Kk‚ösfçïº(ðØ/n OÂõ~ÁX4õ�¼ríFX/˜ò¯Ô Û#ùîp±xš°AhpÏ/j"Q¾övÛóE)¦Rý)'ò)Ø»ÅZ?ÅGÈ %ÞvÒ39ä Æ„Æ�‰*AYTä±�/p‹D1: à-FT6&º �¼;‹=|ÏNS¤J›îûÓ¾ç–ån¾÷31pÔW«jò©©Ê…õh�uS˜PQÅb“a‚V3zfwè™ Ñ‹ŽÆ‘Ðçj¹ÈôYÁkÔö&ÀÌ AœhÞÖåMs8= F3„— "£'™ƒ4Ç“¯…Åí8{â9¯­w�Õ =–ä+ì—�9u<è¾=c cÄ㊡ˆÏ�¡²NDpàÐ0iDÍìíFÁ$ÎL¸²ƒ‚*z4DX,eñiäp·™Æþ"ï$“nÛ³úcó0>†ÄsíÍùrĉ²ÚÆÉy>½Ÿ§k½*Îr†¼ÏTäéìÀXkþÛÏNG䢑m{¾:ØKocîÜÓ#¢ÎÂ.,“øÓCͬjõ©jª|›•®C>µ·ˆïoígnÌú iÞGÛ:3”¹Ue)èíôзĬ£€­ì=±«¼ÊwFe±¨îWLý�KÐæiyƒ»Åo¢#(ËÆæÂ­ÙOZçÆÐ{ë=y›iÔ{|g‚¾P3R_X\J" |^sqj0uǾL½½æbìõœÞûVÑH+fH®T3+Ñ"¿×†øq^VÌÙÛµñ—) *¢æ° ÀfŒš_Ò�ºRD,¾š˜û™>BdK¥Ð4[9u¬©dg�›Jö)ˆQŸÚ&[@^ÆF-VɹÎó9¡–…&„WÞKS¡ù¸Š/O‹Y¬Dôy´ÕÏØõ¯I¹%%^¹Ïë\߇KÕ+cCŒº3 Ц}ÉÛa<º«ÞÅ0êË�IêÁº«‡´ª¬F §³[ÅÁ½©·ê^?/……ÃÌH>Í�k§l¥µÏt§ Š¢D ¾º{Ìî?£ÊwNµòÛZH̽ da2Íø¥Ìð�tãK,„Ùá§®þfÇ2¢Øh1RÒ­…÷É4*�€îZgÛúmU”L ø[9ÎÑnªkæ¿ �H RñäLÁ‹*PËiçâ¸\o°Äu€±ðþÈ]ØGÍT½èÛ\p=�Úõ†d½Wޱ••¡Û§ÖÍhwëØ‹¾ä‚c€ŒlÿUì8BÕ¦qªàåo¨Ónˆˆ�l•Í/ȾªÆ´/M ÚÌp ɸ˜ö‹²u³ b¬òÁv†ŽÒ~ïêÔûsbXAý“(×ÔŸ5K<"Ú�ñH‰ ÓPÈÌÍÊ~åÒÇlto82d;.ÎDËA¥@ƒ¡œé­.U¹µ›È('8¤|M–`”ÈÃs¯�ѕƱ*ƶ;Á²#Çc !ý‰�h3¤ör†øFµÖo­)‡‘Ê)õ †(ã—Å‘U�­oúrb—¢€Èî™ùÔ#·GP]=á4hlV½&Ô¡Œ7ÔÌK–¶C¤e�S÷v9kƒ˜ %¨ÑæÀþ@žq&q\Wwâ"ßõþC;ŠdòB§¨aþ|l*ØanŽQÓË«ca>½‘«z8lè¨1mÖž(¡‡ÌäþìÐ`£là`Àç鯶·ÄVbëù–w– L(­¢6·¢ñ²ï‹wÕ†a/�לÛì‹ãßxÆcŠÏ¦û�š�qKZ`�®:Røo¿�‡:ͤ×®TVÏŒ”%i)–#dÜ·PºßD¿`‚.àzÑ‚6›PÁòbòÓoßNh^ÌbÓæD Ãbˆã=ÉÛ�È»óy‹Æ+,Kk&J{9('ïד <4™:†6I»"à,Ë(Í•‘�¾¹òkFÛäÓóÄ֟З+²lÍÕ^ÊEhÜýj²UØ ‹Á½_Jv ¸[W°ôÑ8×ô¿3Ξ ŠöŸ e0ß@q÷lkËæ×-ÉW·Ù¨cé#“ðŒn¼ñ:[<¬¦úμ®'Ë/~€ý¶ ÍУxQSÃn‰�lÃ%NZɘA`L|º=[Ž¥÷_æ_‚ÀkÔ.¹uì³~æKAgeØbª +I– xw¨%ö‡–ûú��TþE×ì••9”�Z5n]ÎGê½/pƒ_?Gò’_§öŸ«|Ï^?™ úúÍî÷æßP¹ýßi®P'b*!Ú‡Tž’¸Öº®ŸãAù ÷¾ëy�z,ÄTÇ0IÅÖݬ5Í…b§®Òylx]^ø‡;yÌ+¿ßb3ö#ÁŽTû…•ƹan?5Št‘‡õ�.‹Ž¬YíK~JåN¹¹ þ"èçc!d¹¸„)<½ï·q¼ìA�Jr4 åBG¬ ¯qêAx·“E\ Ox Ú][ÁgT ƒ±È Œ^ŸÖç´=Ѳ—Aø©ï218²//¦Xó_aÓ[Ê`°²ÿ17¾ó–À ÑO ³qºË‰qþ»hôç»ÕîfŸP]WÄ&Þœ+À©‘R# uG 4‹‡ ù¢ Lm9"°M".õsi< 9�?ylRO‘E�Ó�LÅÎ[vÖmÌN«ÀXÿ—ÚëƒD»5f#o<“„z V¶a O·Ï)$l8ÔÕ„ž2ÀŸ‹019iT>€*èf$)µÞÐ$½í_Œw L–dùø�Ø !´¥e„o…ëà”ÁN&mv ¼—­¦C,•¬ÄÙ’¡.7ÒI¬ÎIóaRcÜ!ØkêâÚ›v@†Á²‘地Ó`S�[š.Jaùý»¼˜-ÄÆÚn43f{�¹Pç(œ�G}(SsÞNhÛ8¸‚•Þ0£%«]�Ô{1`Ó5Ô—FÖvs£‹„] 9lT�˜(z#ÑWóeZ)‹oÄg‹%Ñì×)�ï_“ˆùÅa_dÆØÛ‘]n’ác@ÃnźÁàþ8ð£Zƒ=®í)5Ž¥¹Ä`ÝGmP¨}ŒYbÔ³šmOc¸Úä„sÁ^Hflfå0z¼Ì ’wæá{¥´�—¦Lõ)^x`[@‡j>ØS[δ@kÞ—;89˦k�Î×ÍyHÔà7‡Vc<6.̱¢1Âßd·ãæžäÐæ'ÐCA��ÂúShJ£»ëˆig¹LJ@ßAi½™ËŠ�ëcÓgFû/]‚vu–q@&p,~¦wi |ÍŒVPÝ‹õ )À8�ˆd©L1¢Ã�$7”7ÉRÎD1ö×~÷zÕǼ_á¡2ù–8ÚÃ`¬7SÈd%K!f –ÛV·4«áS7¹è>ö uŠ�æ5–ÛôƒáÝÔªD¯Á6öù‹ƒ¸ðŠ“æíO,U¢¬íñ+úáb¡?X&±Éw }l+îœX�®{�…Û Ï/¾@G?lÁ„¸§Kh;‹›è•,ù‘IE9´ÙBèéeˆ�‚!¬JB�ç°Øª¬¬Èdßû•u>܇&^rÉp=³¸Q�µg±Ë³@¬À¶²Sª½_5¾;Më´ö$KFna«·–-V…ÊŽºÈeƒ#%I‚ƒnäÝ�")œkœ—ˆÎ »]¸6+6ß_ï_V ÜÞþó"ã2†ÙvèáàÙDýBê$B1»oÎ9ôR>€NÉí‹,à%¾Hýž•rÅ{锼….G�Éþ3kjêõÊÄ-Ÿ$úÕjÝÞ:‘½æáÁüeXŒ{xH¢rÞÄBÒ¹`z¹ )Ö2Õ § Hö CI1|ïSn�5Ü .ØÃxÑéhªÙÚ#®�#ùtlû`Ö´b"Áƒ]v #I<'ê5ñW¨lX)ZªÀN4¸çdÍžçÙc\€ô²0vÆía˜ö…M“²¿†òÙP¶¯ÌP[ØŸ ªØ *Þôz¿¯Ú¦ßY9€yŒý{{»‡¨Î³ÍÁòg&õ˜WdÊçó¡HóÉÜ®¼±ƒ:&ÍÈHaßµÐ6Ô<�-D·0k7°tÔDN+,Ä‹bƒÓ>žÝC>>pÍŒ'kõŒ4FgH}ßÕƒ¡õ‹ü3I7,V¯ŒVŒt˜k]>vÙ7¯ïs¿wí¸�héÇo…Š PB�î�EÈþ¸@£ë‡Õ_µ�¶ÂŒùþÂ^�wéøzE›áÀ~ *²6ƒ cé¼ä]1W_Ñu{[‘™*\Šü¯×àºÞ¤üîõ§¶@�êæ�€]*¤åÛc›/¬n¶„ zÂ:ø7Ág ·,áZ`{EÄ]�ƒ¢³_†5¼™^àTX‚‘Ès‘BÎ 1@<26üRE‘Ȇƒs�±]â÷‹D5ƒé%âí–NÎS– .BÙú Û#`ž.ŽÉTBN[nµŒ°bøÌe`¥2³ uÞíswZ„“pa]3jÞc’ºÁZ´e¹ŠÉðVesìId=dLžŠéñé�ƒW)õLÂ`vúµlZçýî¢é†¶ah‚Õ¬pLøßUÂå˜™Ž†`48ióØÊõk56¨‹�#†öbÛxI4¬"œ'Ç‘|¬é�Ȧø÷7RZ«ßg®cIc€Ûl™n´æÜµî$rÉÑW…,fâ»—ë¦zÌ×pê˜q@ÁDË?}l»ØäëbËöwẻ*”ó5á<Ö 6§5šõÇÇø7�™Rw¹ëm39šíª¹EtvA×ÚH ÍV®û0k­Ýñ¨–u+t8‚Ú¡j˜KF!¶½}YÞµçÁä&Î[¨y¢uðµ]õ_Z£i»·ˆ}Bh^òÐUK±h¯YWõ›—³�p{®iRÍn¢Tô1ÆÒ�Ëóf·gO›$ò÷†Ø¯]ÄÉÍSk¹t]é4û–0—Fë¢íïÍåþ=p2{×Åë (Xß^rAx7¼J>O6Þ|ZÆnž4 ]AÅNç.*ɸÇG¼ÍH^/Ö9Lq!`v5ʰþ‚³¦Ðàä6D¬Oç¾ÊFBu9Ðçt~ LAå-K¶& ³¨*òõjà÷âchìƒ^ÍYã–­v›w¿êFîa;j:ø }·KeÌtî¶ï]v1‡9Sn?Ûåѹ}×.2Wƒ˜èt]ú ¢À¹Ù³ p‚„sh_~VÔ'Yð ¯Ú«ñ�¾+Æ6ûH%fLT?_îëq~'ÂEœB x=×2�ëQM¶y_Ê.ˆü]]i¾õ‡<µïa¸AÜnd@J臶œøe#€¤Áç¯;<�ÁAñ ËçDGq8µKê“í¤S ôúþØgÏÃ7!£vú²µˆ-Ø=°c§»Lýº­]ëà ÏÙ]Ýï›B1Ø�]"wÓ1öÏ›?Èÿr¨‡U`Ü÷ÓXwš;_Eñ5`�ú8Zê`wK½Ãð(8’¾ä‹Êúçm!¹·ÜûšíiÛ�½m´3F0¢±#}ê«ûµÑ5 تÅ7yš3—QE©ÇU‚d&0–*¤ÜáŠ3VPmÖ¹k:ç3!UÛ]®ÝN‡ |J ¶÷I¥„ƒåˆ€p‘Yp誰^Œ5Ž;ºfö�è*û«‚264;ýÆ9=FÜå8ýO¤ú'¤ŠYšÅòÞ@ARÎoá^.RZ0l¸y÷MBÆí�Íó£›Và’r[QJ·y/Žñó³Õ£ ú¾NGUΑ‘‰ö%@˜#öuº^Šó(ç`t½Ïˆ“£B±»úÇ“i\1{v}]�dÒ×áMû}Þµcä°?÷!ÝõÒƈƒà{÷‹19<ˇr <'s¿ä͈3%Üã#3«ü#‹´¶¾«&ëñ5¥ËŠ:¡à^õjíhÛ¯´§Ôkȶp¤¤Û”¤¾Y-ÓÑÛløF×Ãx.±�ÄÏ–ôÿ–T+Œ½²ºnä“T9ÈœUm9¶lµÍÑû•;­áb¸CÑHVÉak·u-®–ÃÛ…‡�jÁ;5ÝtUƇ–ºÞndx‹°RÛF½¬ß �áÔaÖˆ)4ã}þÝÍ¢ÓQh’J]¬Uc"í�0†ÃªYœ’âŠ@�ѱÝÎ7ERå]â8ï�÷­ɰiëÅh¯}›Š¢67¼…uÈ]€dæÚ…�_k¢䀀í—>f™ˆÂ/ �›|n8`0 êMõ¨-¼Fvë67½ÔYøF÷HHán ÛùB$7¤â�vIΖ´Öɳ���¸¨FªåŸ¯ù'§ã¦¤^¨Â&…5Ø¡á>†8Hkû:b¶1°¢�Ì0þ!å�âØãÈ¿ÈÉx#ó¨l±ÉÔfýýmM§ˆR RV ÑQ€¸‰í4J—Ñæø º<5šàºXÀê`²ÛÒìÂv-Lj9ÕýH“ž¨ÿ“™?Ä…¥–{½£]SöK��Ä^ÚÊïbŽgËÔ‘}bŸ�Ÿ \ùØßÀK…Úê=/N¡ À–¯HñC°º:k7„[b^ÁüM½ÁœøŠ·`s�¼éØæ ÷ÄA^έVe _û‰a_�ld>8æ±fùK6)Hç Àbæ&ŽÓÁhGºˆT5þù•¥®q�6T3D1Ñøßá§ LsNJWup[ƒ¡±}c9R~ oýŠG™æÞ^€Þ;îÞ›$­‹¶‡fŽs}€¢çÝ4±ÆH"^=µ8:¤ÅÊÃsÈBhA HdLG;Ö Zá€Æ+àÔcè�®Z-pHaüÉÖlxy/ ÓÆS;];ü«{Ñ…M�ÒÁñtÛWš˜¢å•J¦7ÐÄ„F®_u‡$ùõAª“,’ZË �÷–~ƒZï|¹±¨Èˆòø°9õy]*ßÝï×L¿Rz}Ø3¿ERœ5ëÎF†„z6(3îAß‘�oà´<�oaöÍmgd]eѳ9díq¡sÛõÚ;�_–ß”7L¾]h@ŒeqfÞ^<]½·Oò˜Wviû`.][\ªœY§ÎÊÖ29î½R>¾$uœ�o êËÁõ<›ƒ(c9£WÁîWW­ÿ‹£Ÿ¶¿Q`Bk—ôÁ…¢)°mj¨:˜ß�ySO!Ûvñ >øºÏ. þ^uÇ{(¾ÒwaիĶ5« óŒwýØÌk:šq/r”u,Sƒ®d½éO—:ö£Þ�ÃÕQùïõÓçøC!×=üWOw ¦8­ "¯µ‰g0ÛelîDæ=c×gî2ƒÛ«VQBñž@,ßsyÀôöËÑãÚ òR¯0ͱµ×0>|é©,ˆ6ø(è({Ï1‘{A@»¹e ÊÃ"¤ÜÖjë°ÔßÀ@ð·[<е«F[Ê�5gI¥ÈßU"ª3ÆÀÅ ¬Zç%”¨Àmã)®ßâ/‹rÜn¯£yŽmð"$T™Ì3|"ÆÛ¶4Ý7ÁÓ¾‘2ÅYQ$lÀ<ã“3gªÑ·êm|cpk_k®(Oíf d÷„^ �Œ.×j*ƳÜe+�ˆ":ÞY`(ïIûZŒÓ äR$3b²Øûõ–<Û°Ttqn‰†4áw­‚»á¾¹‘PM�58×a9¶™øÐBŒõpÊÀq°� ±©‘Œ6 ¯Y<ýû�yê‚„¼<.÷zÛôÁæÈ áô6(ÈTÄù ¬-íG“ �¦ÇÛua‘ CÜ’³´:aZéÇ­«qÈyõÓ¯¨1`G°éCpPñ^ Î[ Y�Àwn;Ó„|?VåúÑœ$ÙåHù…wÇ‘C\xàV•‚Cë¼îOž°&B°â`Æå'’í…ò˜»Éã1]‚üc PvBqgŽ%ÎLW¤Å9% H´X��K@? ¶ÛH\�M¢kB$]¾}±Ö1²!ÖdÐîW51`k®Ö7`²åL[ÈtÑî€Í´ �ÒÙδN�GÅq Ðg0ÖeKŒG/¤Å•9œ�žö΃'ë‡Ó??~/‚Qþìþ—*áûë8]7"žîƒrõËÞ¬ŒëR¿1‚MøPì§´IòÔ±§´ãƒ¤ûÌB¿—Ãy"©õÖät,±JÙL_,É5 è†{©å4™ã7ø€ÖÅ>Ï$‰¬]Ø5¸[õÌ„oÞƒ­³°ön¦À‰îK¨�eÝÚ‹#´Ý\ ¾»g×DEÚ–yiçm®Ø¬;–GˆDiºb.ņ�©�•ÖÝNi?ÌCo©ùÑJzC|ÐqÄ- ³ñ/ZL]FVGó=“³�Ž0í? ­�O9�Þ,VÛõ%y2[»ùAt¡;´YtÐîòiT ],éâo 7­€=Øñd™ß ÖÎC€ÄmGÍff73¼þ›ZŨ{..™}˜¨01Þtc ž°BÚÚµì©uîßQ1}Ñ$G˜57r�]ÆŸ\¬Þç�sJ�„ú\4h#ãco…V¹ËÄþ¬c.×0;ŸìµÈãç/¿¤íc †ÄÿÒíuc¼_úècOãt?²š«Å$­åÑòbÖñšÄ†ž¸ë€@"Šlü [~ª€a_² 3¬V†Fè{,¶þ—Gþ뢊°w&…ìf빺lþ¾ÐÄ/“uÑ9äÝÖÕ?D�Øo¹¢Èæ@«®¦åÞOçˆnú>lS$%…/2Bà>{ߎý ½lö¶!†‰¡÷LNt=oÝ�ýYB°·#n¡ ûϦ×D—hqè¹÷§iªÎ¨Bñ> •ö¯§õs݉‹7Ã�ê„CO�G®sÝçT^Ã6þ@ÑìK.3±av¿¶¡¬/ÚÁ+`0vGÇNý"u÷Lº³<)à/4ã¹9,iš¤3·3öú }Úó<þ¢-\MyíLW^üùBû]™·/3¢k [°uÛ(2î 6i²F6ºþúPx'»ÏÄý_„ øÏ1ž€:¸P™’LoåÞZ“EïxîÃwÆs|`Géýí/Òû…¨â߀ߣ"7T1�!ÇçänŲM!�”ý͈7¸pó�š-`ÔuûX9èÞCî;Α>‘ìࡉ#çSdôf…/ÚÌà ìÞCv8ÔÎnYF°¥²/›¢NÞÂtãªÜzûƬA¸Äå§YciV¾Ü ."¹©f¶˜6Õ8B¤6’¾”$kVL¨Zõyü 6œ²÷÷%w¯)¾_0oJå¾xÒ¼’ µcé9xHƒÑmðTÏͨ}ÄÝÖ‚ò⟄PSÉ`ç(*Þö°ŽAˆµÐ׸u™ÞGPIC¼�ásE¦ü¥Ã冨Â-‚d¡ Tóp «(¹Q}Hš�FŸ à‡ˆî­ÌíˆÔÚE»êçr‚9ÐÖþé°)ncŒúØnYµ²œððØJDÂ\2¡7ÏÎC[Õn �É{�¦3LÜKÀ»ycÄ|m>® :àŸ0(¹ ¯‚9Ã0Uj+¿Zï7®Çž2ñ•ÍÜ$v bÇwÛÃ3ž$néÎÓw"¤dRå�^V€‹)ó˜�¶Ñ’)L”y ð¦ÝìºË®ÉÝ6l…6.jr¤'}¥,\(D+ ´Å ÏÐ)¥ËâËÚÞò"¦o‡P¶Dƒ’BËq ¨‘͵¦[d®²*Ö•[Á†Ymá>¹�•ß<†{ ‰¶S¶%¡Ä0/O¹æÂ$­> g…8óêÛí;N&yje˜ÇY…„|_¹6*ðŽÁSvaiþ›?l|£ÝxBó±|,1×óéI™Á l곑³¿x· ÃJEÈl7°L6�²PÕ÷EúsÏ�éqÙnšsåhä¨&«”ÎÞ#/ä&Ðì9˜¤�>¦ñZnjâbYÅjdüšq8~‰_Á9ž„ ÅÿÓ¼VÉlÿ’Á]%®-·$ø4øí{A Q›¸•…gàV£˜O'ëçŠõN·½1¬Þ¯«Yñ-�\rßz’ !rœ�mAF1s�76Ï6zp�®Á/ç'�7Ñl»‹ªuuI8Æ¡¯Ü¹…ÛONoî›X/wý¶q›7š•õÃÎu×d°;Ïbg&±œèú„Õì�X/””{ u©ÆÈ*ÿ$¥™>Tž y™'ÓÓv‰¿wF9†Ê…Žh¸¾Gj·éîf#=u{àèC6ÜXCÆËRпqóFÝ�~¡¤Í¹Åq¼}¼·àOÑi”/6$ñƒÓœpfѦc›í(xNù±¥¡NjUän’˜ƒb”5´!ÀX~e:¸A!¦íÖnñÃÈŽÛ²\!�æÉÅ‘?�NOïÄS#pº?ûÁ@Ù�G¬ñ¨RÎ:y£…ñoj7Ù€ êÉ}¾h²añ‹V–è 8›‡˜á ¯‘Ûƒ›´t®Ï‚=GªGQ@:“w XÂjX³ËMSp²/윓{ÊK7’¸L7/\þ†c{[žxŸ‘ ?=¶,ˆ}]Q5ÑHd¹ß³Ü’tm«:|ÓßDÚûê‚nÊK°ŽU;öÚ�g`}Š«‚3DŠV.á¼*Ù¼mÅ®—d�Çgƒ �# jÑ9GÐ4InéÔUîL•Þ˜íÄxòü/vvH"9ŽÅݵ½#($Ñ' “£Èd ‰$´ Òù%œ,¦ߌq§f ¬õÐ"óÐ?Í5B:—>[ž,F…¢ó³°áB× ºhµ Z7Pjȶ6|ÖÃÏq¶¸êSì´Ðª kÍ'­>Ž–Ö:ç%sòçVoƒ³÷xðáma’œ;!K±ÑŸìE¤/LA»•›Pñå­á!>àGèŒ0Ä5õ(äΰ+€ÝËpÑiî±—ý<ÎiÙGÑtý¶i¢ûçaÑjž‹rÀeR(hZ\¸#Æ\ƒ#ØÔ'Ïos}ÙC–:ÎÉÝZ'­70èÝgªx'TfA±mÕIÀI¬A{˜½×E£ÛÛÁ;âk@²öÊîò-qhcua ;c�ˆW×3¸tzgÚüÀû"‡³a“R‹ëÐØ¾kÏpNõ(‘@ßÇY?3ÀU�9i³oó1H � ™Œ“’<óåÍœ±LïKÙÅ í¯kãË~ ¥¯´ LùP&÷iÂc» ižå‰ñÝš3:Ì2*cÁø H âŒAÉm(Y%àÊ »‹¶m¨®Ø÷À˜ˆ/¦3�Où=¥„±† ˆÃä¾"R>+Q!–Çë˜ÚÙ5gT!0-s™è}‹ð€I!\RO4%óªê´¸Û„JŠJ#7¿P‰4šª§+å�xÁ~‘ºì™97ã$1h˜R95R_»|õòV”@Žù{*ûÉÅ®}ì�ØÏDoØÀ(ÙÎY˜g®š¬¥Ï¯�HêÒ›{Á ø›»þZ!Rú** na† mrýæÍów̨Ûv‘ VÇœ#*:fÛ¤�8Jö�8Æ ‘^/èOrR{ºvÌ÷Ç´Àþ1�¿ì™gé•^âRœÉÜöÞsÀÈâPyØ*_žÀNµxé7Ç7¶a=€òVö>l„À Utxßiõ€!ÑÃËÝ|$™ßIî‰VÜkáùoD7)cH ýáî OóíÅsUiò„+Ȣߑ󻤹¨A¼#`ð‡E›Ï ¬<·CÉ@|† Zèåï›Î’Òù†±sÞó*"c€0ç'´ÜÂ󾞴¯…3/n‹qݯCœKí¨Bfçx5m(2\ZÔ(éŽö¾ÚóÒ0J«#çM¡*EF;kXvÙo k?Žq;û?9 Al[Ù°Øja–ŠÅÔ9WŽo¯êŒÚBvÆ“+ ,ˆ›ß¡âØ�*ÞăevS U3Á\Ôö׆Öì@A„êrH[Χ!L Oz},@¶ÈWë4RbrJ5ÏV£­£mYš.n2nbM-Æ^d†.çéMò�DÀBâØÒû·^?¥:¡{ìïÒ"ÜmŠp÷GÄê�>”|ûM5¿p0qƜƂÏSŽèèý\;‚Y�Ò L&¤-VeêØ·µÂEieh�¢—š�v1Þk;Å©û&_=0ýžr¸ÆÏW}¹bOõ.]'Çd»Ü|Ë?%o¹À-Jp�+Žc–5(´9±&v͸¹MΛ»y¯Uç¼|aÑr²ÞVܯ‡I�÷|MU[ìbx19¢õÌ2©"å[Jì+F"0?áÐß0åõù·zËPó@Í™-¸[< œ29Rºø–¿sÇ �ÑÎ/ÒÔwkÚv¢P;›\S …�!6LŠQ>V9ľ°©oÑQå²1kk³ñ™¤¦¤7(|R’9O ³¼zr¦—KX“¼1P6´ŠJ‘½§÷m>¢f¨Äì§ÉÖO4ØBP{ØN£ÕÀðT æŠ[(¸`x›~¿nÍ�=9mkdÚJÌ^úÖ‰¢°HbýfG&æ³¢£DÓmX>,¶n6ZÌŠâïÜØ¾RøñUÒ¡‹©ÔmÜ�ºD” `�n×ÓC4bß‚Ññæ7Ô({£ç-•·Ð~€ÏsȾÉËŸz8HMx\pmœÇ³–Nä[dë8p�?)úW”c´`0'éâ¯Ç_kkk0N*×¶‘Æúò’­¹WÔ^®a/Š ’"nqËA«ÊóðŽúIÕ.�àÊÖׂµ}Â^×Ù´\)(5ÐI–¦K¢:ó<âlq“ĶŒ™ÝâW'«êlèv6ìÏê£f§�^ˆµ—¶¶ª¦O�éaå«§ù‚ÏsÔ ýºe vÛ0”ÂÀ0íÀx¿[Þ·; ù\ç„­¬·æÌ<Óöø‡ê’ÚqîÃ:86(IÆ`Pm^+00nú¬:ÆÚM428×”ñSÏ[6´›HÞ;Äd]AðÄ,œP‚ mûâÒ–É—WÙnDê}žýµ0£âáVûóýºÜ|Ùw*Ã={Jí�’w!škÜ•¬[: FߨÞȺIFÖ�±ÀŸ³�ÜìqÊbº›#L3ýÒ…ã[Fù*ùíy\«µQ÷ÝRÚȈn!>âFR,D~ÖïX§±Œs̼¥„,ã8ãìWèØ®³­âìÚ=ñì›§›ÿm2¶8�çídصãKr¨A�ÚÊzöX ¶ðm5N(q¹ ·=Àä(îÖæ¶ç»ÀïÒÒ8º•±Ä~‹ºÃ_Á{ýÙ%—‡ï“Íš#Ì"®ÃZ ù0‹BšÁ‡î�ì8�¸.õµåzÄz=Ç­Ë´D ‹ø¿@ �Ͳ�ù#†ÔE49£ØˆVI¸¥ô“…僙’;QDh­e7 1`•¥G ­Û7Mw™Ü¶­ƒ«œÆ±š`‰Œì“?`ý�Ο8\Â…âJUÚ¬Uý¼:ø³&Ý|ta;.(áí…˜ÓªØÄíë!gÞz÷PC+•m’C å1M‰¥S·6÷î_´Nó29è>“:ΠBúqbéöÁË öí»¬5Ý´üQ-›(Û‘¶Ã¡Û° XDzA¯wC•ªÝíM™Ýpdj@–n’7¦R• ƺ3fõõ¶g£jë��ùYdâÀQ±äžC™EÄeóŸÊÅ»ä×ðGuœ–¹€¼“iɱÆ>­ú­J@�¾)–BG T»ÔðãÓÑÉ:DAlZ,üãß–KNóþçÆoA<Ï}-�úêØ�ÓÀò#ŠH$š›‹Ô:Z,*¯sˆbkü§²Ä¦.Ùs¹¤û ï�ӱܤÙ¹bø(Ó¾â„Þ×”¤K]{“®Írû—Âu/±œŠ ZÖ—¦K1eàT¬ÁkX�eŽ#§cøªêõŒP»ªÐ®|‘†Ð2�6sYÛžo7‹f«­›8¼ILØsy–ÌòØ–‰-Ã/Öt‚´…’kŠ–ý½êõ6‹€–Ö®Œµ®Í‚C¥ËDÛXÆÅÖ7̈bU›Xû£{”©�fÜ„3>Êo=ÂóƂԄ'VÎòçãRÐ[ª&a~íùÖÈÕŠrð~í\Oï¨ßC¸I{6!Ëû™ 6X§^�InjkÀG‹ué%´z.ÊPÀYµ mÃ.KîÙËNmûêí‰%?zÿf½ÍÃéFãäb)í«Ôc”ņÑ{0$LY×)YxF¥að´Pí¡p%Žê£÷K ­•�†pj‡È´i�看”ºÁ®xÛÿ6fÁyw“�‹ÂO‰âä7k¶xÆÙlg}37 ÑÈœý»)šéÌ| ÞŸ3EãïzˆöÓin´Ö{٬ݫ}DÛk8ò¯ªFôpÛ0šÖͯ�^)�LËc³CUnR~šÿ°@ˆ“Ëc Ûˆ~¶¬±S_ðOÆ??Øý­_Ü *ŸŽšs™…îáDõ&Ìß�§ýˆ«®½Ê·^~�+°FŽ$‰ܹžeæË8w¾.£ÇêYe­™ ‡Þ+�ƒXÄ÷O®1*g)$c+á&g™‚�• ’Ñâ}O96‚¶èï;ºÃÇ/G Â.YÒ*Í ù,©+¨H¡’â¶14ZŠ %¾:bùSΈ>îåºÃûMÜüÒì DúÙåà¬PÇ “îÔõÝ^,›F‘SX"u8¼2cGI|b,3ÃdH‡ëñ3ðJ0EwµƒÕñÎ.�˜Â¯‘+4ø;[˜DZ⼜ ¸JGîëÔ yÚÛm¾Z‹\BÈ”¸çÙPã^–‡cm/5eà“Ìt3êˆ$&ñ@ß¶³×)X2·À;S¶0ÞîdAã}Ð3¢9¶€ ùŒ7ÂÕQšA®æxÌ F4¤´ÓÄ&4·4p…М1ãö³.³6Tʉh4·—‚ñ75^CÏíyØ ¶ÐÙªªG+=¿[IݽÇðØ •‡9Ý–¨xaº+íªšïs´¬?-eÆ 0°ÞÑ^ø~C`ŸgšÇ› O ,ŠÏ~Œº hû{—/ª"® (doÎ'=›Ðlyï? èÈöt¬v">` ï¾L0Ã[¯¾ã8T=ûCÆù]y÷“31Œ¿ï/Ž0¼(°h$6!W¹ÊïÚ┢ñ7Ž—(¿)Ðx`.#˜Ô‚S_ç°¸F1!ËõËïw¾³Ò•Wõ( úàÉìÂö×m‡_U]½IR(vŠ…ófÁ½8¡{€Òï8ÒŸ�xzåntÁm±�›éÚ|$ÃøÜQqì•E0©„–Ë3È_p¯nÁÍú‹Ù d4ã¦}­z�² S\<„�ƒ‰¼ûiÜãtðϱÀðXvgeáÑtàdÁt‘`rʬ9û.Ð&Žç/ù¿ùµ_îžô{C Þáå;�à Ϭ(9z¦eX„lVsc·Ñö˜%œ[¶!øUß(¾#*q1œeh©vPÈç_‘Øûêàð>Újû •Ä ñg± £8ÛR½á² ªÄ±Û²SøØ”|ê‹gÇb]Šñ�†˜IìÎ0{Ý«eôòÓì›`ù'Ì{Jp˜×d&3ëG‡'¥Ë׸3.ÒG½œR“c¥]�óG×èÇ.ú®×Ú‡\;÷/Ž=01íKàK@ݱBž¬ôÚ^nâÁ¤ ñ9ýÃlüFSJ dÞM*ØêDùƒ©¼¯ g_¦ž]x‹kþi²‚½«8‘Kßâ0XB\8ð9Ì@É(Ü)šdÄ)½–\`q%§ ÷Hoè:ÈÂpS–éšdfÚ±ÁúôÅŠSü/G�ïì’!Æ»°ÛžSïLbào%»ÆuÜü2)t€PÊ4®²Š¢–4ë [íüx�ZŸ¾úÁ‡±¼WÏÄ&à ˜›P ¬T&‚Üu׫³C¡y«å€�„‚òþ?ZÔY3g>IˆÎ‘øÉql¦À�YLÈü`c£d/–�XrŒaj®ô?_\¬a�Z7¼òlÔNZEQ!>>oÜc¶Þ�_Ìi`ïžU y‰‰ö¾ëY´@<¹ôçV[ÚÛˆæ2„Ù‹¶A}ÏrΤK¤ñ’f@NBa:Wlä<5iãhwˆßÑ�ù€Ó~lm°ŸÊ'Ô>ñ Y”|iÑ] ÏxL5S¾ ,1$#DYãÙ×¹Íòà¦W¬�‹7÷!…@3†M>VÄ!ð«`š¡›#d7¾°JPý7#�~›f&r=—;4Û a iå‚îEv¢O½€�4|¨Üxä{.”.Ãy«ò;£¹§ Æù·Sî�;aÑHYÝá„bŽFàœW™Ü Çd½äm@ñ9zÉi­8¯è6O§ O°D@êkÓ–k¨[û%Ó¡;+$”½Âx(2Øx½˜X-�¨JµÝÖ`# �êZŒ¯ã4%m°h3—ã_�-34ŽÖÁ õ©Q{üfÎYëÐe¿#.P¥&Ý\r¥Uàߦ¸‚Ô©Û#X º�uÊÅ+Ëš¦,Ö¥X]°K¸9Û—€€PH( ܨaI�ª6°Te«_Ù}æ¶9ÕK.u ²AU á»™÷‰jÔùø¡�,q'uõ°ipÐ|á;/wÉß.«út¯t’0^.òΰ × gèP³®ž#uhAbÅâÁ-ÌáfEHƒ±Æêš ºÊ�¥®š ™°$©‚Ѳט°·@ø½›ÓÝ|s;·¦n“ÞF««°Ü}Jš¹¾*¥(¿D?l.V¡·Æ-\�+ìw Je|h•£çbͰØÎÿì&ÐQ‘Î$�]� =‰ý‹Î ¯ÆÇ_«UÕla`i¹ 7o€“³ ]”ÙƒB¯9oß쨌¡}<3‘níq`])QTÙEˆìMZùvK)Ìø¤«cþi½Qå?sloŠæ‘ð`lÙÚÉ“ÄðÓyÆsÁRU³(  ãVC☵ÏIéÂËý9û„Ãîiï:ˆrÃ+z~ƒ¾³ …ÄUÒ¿X™™®¸óÖ'°TÝÆ öx—ù0ZþOx|o®òÖfç�õßßSö'¸e¹æ' ‰c¶Z\8»@ßÙ´ì]%VH¯X ÜÌ ?,ÉIX?ç¬À¿sqüä’�ð¶dƒû;~#ZЪ¡g €²ÏÞk !´]+û� Ö Ö˜FÇ7V6ùBæ/e ˆ D4ßÇŽ¶Çåßʇ½øÓ8ÍÚûÞÁ£wNX=~0'D±}Z·¿iŸöOv`ÞŨ�,TbV»°ß�c õf �qžß)¦žÚG"[‡Q{÷?­Â,»³�¯ì¿PÄa[Kp£=· S'7ÇŠøWq}¤¼¶Ó,cmˆ ·¥çŒ“p¶í®>zÑSÀûáᮉ–wç¿fG�ía|d"ù�NñéÕ¯U�‘ÕTPù[_°Sºî æü›LbÞµîx „0ûÕÐìGFzç½Åú N—u)D²Á�ø4;¿“ÖgÄ@ã \Ã/{Á¸œ°,æ3å§öÇ|ŒÖIܼ† Ú`ë{¾ëúKEƒóïðã� óI³í€èå ‡±_yÂ> >“8}úqìÉ(9±ï¿£( ½Ao:KçUÞÜÞžVŒz \‹h¬çm(rð©�”o°¡¦«ÛjØl•ëjvø�Ø\‰ ¶K!Ö‚µß¼»©æîôhhAªÀã!¦ý1­{(ºô=‰u\?!“ж©õûh§¯c(¡q:BÄùëÕ²¬¸!¥Ê¸ºLÞÝÆõQ•aœ%Žóã³;Hs]è3d ã%Fáhòì#+ ƒ ßMÖm—L1gÔŠ÷|¶Í¸„ºGF½×Kh9ÛE ¤’èõ¨¤ƒ%Q4 ÷Ê¿k ð‚åHu!¼{ÁMìPƒ7£!ÞrF¥'WåNô¨ˆ‚�¼#-Øë)Mž—7«Î.WPÀà:êcA9º.‘L°µÖËÆ¿5Ø‹™é¿´̹ ŒÒ ³Ý°VÓYÓ鞌¸¹àáwî|–nÙ=þáÝØ AONÛFSì7QlžµŽ-ª ¿³Ø�Õ¼’j!¾!=‡LÖÒÏZ… | ‘â›ÛF,bgÆG²lž¡U :ƒ»!ªÃïTz¾H â4g�PÓN{9C«aŽ~¸YV³4 è1Ÿ¯ß.×­|è15Ï å‚ý ·9Ƶ¯ú¾æ9€5b-U…¾›D[ŒÙ«ž+QŬ/@0Ë H ãd>éª@À™&ïDQ9˜Ü,5Xs—5pka¥vöœY˧ÒO‚#»SbiÅÞÒîׯòdØÍÝ÷aýIÉŽàwšVÍJÕùdÞLu„kݰÁˆd4]»+Á¨3š) ö‹’ji…r¦ Úƒ «ËƒŠÐhÝW¾°]FUÖP€ ZéuZ¿Г۶®X>V@v?’ÛÑó«·AƒÏ[ê ë8ß<´hº˜³<®  å}<‡~ßvÛbˆ=å-¦ív3Édye°Ï-¼A}—ØQJ=ÿhR­Hö£ÖU Îíyón/qD ù ·ïµ�ƒf–Ws[SJ¬8›˜Gg³í})ÛoqÜw ¸üÏÈPû²‰ÏÖ±He2Á• úÏ ( IÐ~i2ð, Û†LáÓò$=—–q2ØFCy�¸l˜½ìTZu·îkG«¥°¬V„mŠ»ý,7®œ�•6R×È ¯Èi†ãëjy÷Ói€Ü\^ä¡`Û ™Lð™^[gÜT� Rø{ÇŽ%2xá2lmf¥¦à=¬­xim-‚ 9Kwü|LØ ”!/´, 9¦ ”óÆC§ ]í®c5t¬±,r 8Š˜"&OPc˜6‰÷A3‘Sݽu\èÊ·³¥5­#ë’ݹ=[¾Óà‰}l§>.ÓaÿX®öýw Õ{O÷w]©\ßË‹®Zkf>ûcÏ'â=‰ë’HõœäoÞä£6À>¾šoÚŽ:]‰ò=à ê'O4¶¾´îê 8ŒÛ Á¡›Hç׈— L‚½.(Ëñ6V¯™ý<èëCŠ“Ù]|W ˆP»Jgñn_ÐÚ^ÁÂSKJ0ÇQtUôÛÅ�±ß,ºá|N›ª«6¿g2œÖ¦…Åt‚‘(Ž«YŠ-‡3±Nï;ÏÔªZ£²HßLçæG7Òv'‹½ò+:h½›Ñ4<2Þì¦íÃk¨;+¹�Õ�¬÷‹cj ‰úc!wðåIÂsÇiš%@¥2JÇTÜø’6Ùm±‚âãJ 1Õ—èw†éµç0#±C«g‰4 Ñ͸þô“¦6ÈÐìRuPkh³�å>µ´ºm±˜sšuûÝmœÝÀ¼FL¨²?µsê¯ì�—Õ¿*‡Ì%Æ»j†ßpi¬(01³‚ÕÛï¸~ž¸h¸.àœå˜,ÅÎúI i[xüUŒ‚Yl|OÐHaà’ÁЋ¹~ÓÛ'[BÈ>=ñU|{€nl÷�¼�7EÖË¥iÒá‰G%+JHCŠâ��»S2;ÛÖì5…"EÆ–Ò>5kMXÄ”K7;à_�²êxûY‹Kg9d„ô–ן¿`÷‹ßÕ¿6Ù®v7Q+ó!|Ÿynƒ�ôfðá¤RpeÈ� Oû±1-jïëÄ­îu hû~ Ï6‹mŠ{ò2§�µÐ{–R]¬°�pÚSw¡-d˜Ø'8pÎ ­!âL��Û-9®íŸˆ–ïßPqªÑëi™˜øW¶º|0¡wF_ îƒðžæìºný…û{î·O}� ¢¸²?¦4,c[�èW¡ ã¿ÐñLa¯*àGâµ®€uÐ~DŽ:‰EDȦûÀê¸Ï”›D\�¾>à�Û«_cŸ'°–v)¿x O¾ 0/ÛïÓËìÆ“kãµ_ÏJ+çÚìÀµedÓȤ ¯ö �à´·Á§úŒMÐB-ükôq¿-—}=–z©YÀ-TÙÒ°NuËȱ â–‘üî+¾¯ Š˜aÞ¼×zhÄ„š'Á…»Vðl'9Ʀ�—¥+U(> J ùñÛ<ì± ñÓâ8nç6T=%A€kþ1¹†0ÐtS~ùÁáŠ<×@0|Žw•´°È!Y9˜ÄÙÌØKËîóaƒ]@pÂÝM nlhÖccÒQº†™e ƒÎwɳfsJ?¿®gÃz-9ar9*a>⌾ÒI?Áô+c%?àï|Úr<ÚÑê®øÍ>Ö ŒéböÖdÎoFXzø¦Fd ²ü MÛ´}1õ48g3Œµ–‹Oh´L ´(FVÆòäÖ³-Z̨9å2öy;W—aÚ U^Í.÷º� )Ò$I›cÉ2`!ýž®Â‡±I¤‚ÞvAÈ-…´Èk]Æ BM�¬T6gi{d̺BXF’80dé÷ƒæ£?¿ìs¨?Íò„1Q0Ù¨:˜~�æÁ;^ìêZ½ YÊÂJšfˆ4Sr¿¯lŸq®æÎ™O—O#î£1ø<¯:ó¯^=s`߈y¶àUíXÈ è7˜d3s³îkÎq�‚Q™dQß7â±Úx3² I‰ÙÅh 9…Þ‘|æ,óaÅ(ÈTªd ØÍ�ÂsfÚ•%bt6ùK¥u�½ÙöÉ„Öe.6Uu«nÖ’4.^×ië‚ö»8_ÐV{©0‚…ð<@ù8Ö bËKlÛѬlûÂa‹~Ó„&[•”~ì~ØŸ€ùÐ kÀQY8'µu Æ.ÙX‰RêrÉwSÝZX×ÛÞ~S“šïûÊ`Ó­‚‹@ðj ~™KmH‚0g+c؉/Ýͱô~‘«q¶*Ø35€Åþ %€ÂB‡õ"üãöÈÇbß7(1ö[‹©°{…ójñ¦Øµ–¦ ¾§Ã—Ü!çáËÁH,1hXšh¬$*µ¥§tšPØÝ€ƒ&Ø—¥q7@ç·7’ÂAx§©Ï‹á¾5¦ä+³9£ðÜœr÷ã#m}�Ÿß€ÊÂä�:ƒìº-ûêÐh³è4°ÜÕd€…ô޲W, IÇá'⅚䬗>]XÞÈ!¥áÀïÁÈLñy|-‡à�Õ\·2g¡�²2¥¨ÕpÉö†ùô ¨d£ô—u9öþ"ã·¦ü‚¾ mœ¹]ÎRNÌ �$ ”‚÷–·>eõ*£2’^Ò®ÙDzê(¹–ê/k°IãiØÞ‹‚á«f¯ìáÝг=Öúx`h‘fMk¶ËëQùsžÂ•–Éø€v’ÄFåw�soˆ@`5#†É�•Ôë˜Õ-zN©•W§«Ìë3…àiûä!È®ö5·ÌkãÓ'Ö–[ Ê ZÌ¿–°øËÛBü.M*†ß€·q½~y£§?&6?8k"L?6¼WMø+n–uùL[eôÉz¸÷u-ß *¶0–VºÜªŽ ŒÙ3†´f37xÖ)�Õ ƒá€+æþ§ 3:úÙ†N¦ß¾»m›6ÉÈ0gê[ëhƒ!Ÿ‰7×ÜŃn~çןv?Blõ´�wu´Ü[­êënei™Ñ�×E–�£®þ w£–¼GCWñÀŒvça鋘ˆì}è�þÅX‚˜¨‚h½æ>˜¯£M�U¨Rw|Øæƒ}€cÕU©>’]Ø�œl"˜SM+w ¤ôÃu`§å渌iQøÀ"!õ|Ù2×ÊsoÕ»(mË+踘äeÊ÷ ÷æU­çÅš0 ž’îH|ø÷�v‰Ä0¢x²µV­ÒVÎ´Ë w˜Ê_Óüj1���‚©z@B†|Akg €²¥¨# -N!¡¯á:3ÛVuWøù˜ÇÚg"Ï"úÑ`@Îß(y×ÖÝ�?/5g>ÞmP±‰tFºÖ.�²]®Ôgóß>Ú&Y¬ÄRšq³XÁ¹q˜,Û½ùL­¨!¿ÇÇbGjx2ÕY þï‘yÏ�& ŒHtþJ­‰3ÀMƒT¶Yæ‰@‘;ø�ƒ›,ãyL3ö®ÞƒÏóí’1%ÎíÏ^îà ¬ÌýmçõΤt{óæcoÕ¾ UÖ³ŒUEÿB²ûV|½“^Æ_Ý‘ ï,œ!,”–ùµ‚2B/ˈ¹CUJqAú³XébÄ{1ß>áŸX¼»Ì}Î�™O¸®cÏž Ìnôlµ½Ž 2‹ýuzÂŠÏ õmrß�”÷°¼Î¿4„9äZ¡n”;;*.ñ‰NŒ=#ÆØ–äˆT{­¶ƒxà&íÚ_®é�î}Üû¹ˆ$nk°®gžÌ>:ËŠ?4Yýiãl7÷0ÎwýðyñneËŠp�fQy¯ÃGØÕÙ|+ÒÃDÞ/ÑÔ”�¼–Õ.ô6gsTƒ¶WûìÁcië^#OkNÆè ÖÂâÓZU„}�ló fÔçŽÛÏŸS“Ó=gÚêw¿·%Jû}†õz¢w� �Ù°¢Ãh,wW®9Í”øšV¨Vû-k\"TÖ¾ƒ*™`MÚÚmZ‡Vzn!d-Ôãw6@ä�Àd‡³Ð~]Ìo•ašüGžPF«ö¹kÎ6UøX ƒ/¢¹—Ùí.:�ŽM±n1†�1V¹Ãßá6¦ÚBJŸ¡ß[áÄÆšÅ͹ƒÑZú±,‘o|òÀ³&ÝÉHW7ã6±ŒyÊͶ+•�míùn�+¿öC9½ö¦`épí唽м)0¤0=Ú>ÔaZ&]_&�8sQ#‡>Ó¯"Ã…e ¬ß5i…Å6¢�.5d|ý–|bwxëS`¶cŽé‚êV•kc`ïµâ^º¡–)Àô AŽ„ÈY Ävfœ¹� )¨Óì¹i#d1N{žîÃPåí{ròjIPÕLÝ4Þ-OdsI¿0¥…ùöhZù¨k6w};ŒmìÚÕóåÆðf£‚B«'¾ >À—f;/|¨ ñþ0³™ˆË‡k ’)šs!è~Á†EwÙåÚ0v¡K¦K¢óž’Çîøk+³GÖÛÙØªÅ\ñV¨Ä¶ †;�åqÐMBÞ¶í1bP3ëºÆþin^¸¡�€QÛ5£�iÀhŒ˼~&Ã�¥+÷™:xÝa•ñ�,³6¶Ù[aÊÈ7¥â‡ƒÏrüº›ç7ñå¿9E>þN¾—¶pÖ@�‚äŠ8Q–�F”cç™{¸bÒ²úu­]+ryC/u¹pÎr´í’P´æ�¶.ý�JåªØÖÀ¼äsqá-ÃwÍXðS²HQ¿C¹O«Íë´G—o1)†ožòóo ‡ïqÖû6g¹¶Áî l`yÐ2"Þéñüêxù÷[ÚÞ > ´ÌX=»¦› i�m ó^-P¡†ôíÿ,ÚÉ–*,½œÇ7;3¾I Fý®qW8ÁëuÓ‡ =¬1um}ó^ÅthéoívbA‡}TD[L5ÃC iHÖ‡3ök«ö02ýU7êN?Qgó‹ó›sŸÙÉ×:Ù¶­½ˆ4 æ«Þ-²BS½4눛å&P=l«2lv‰ˆãÅ™j2Ü0Öì9{lˆå&,—ƒäÚ"�kKÉàç%iÙBÖ„º‰œoÖ€Lnr¤Ö^»¿+ z­šÈ¸™Î¾¨Æ:ßË„Œúò€ÜÒ„§8Zj°óEo²¡mþ8øòö–R¾èÂvG¢övß §ÙñÎRçOÍ|îz33ãSÕOÚßÖà¬ÝÂ"š{.«–Z‚æUëI˜+µ‰7NÌY×y¶hBè†ñ ,¡bÙ®[„q(C£Tôý|}~TÀiXü·w ®Çbåu¦ÊXV¶ðA›@÷¹YdÍøf%Wì‹!¡²Ñû=Î׆-�{W�º�å„&Úç”x íâúž(ÛQ»¢�_]=‹0a›m(Ù@F¼¾2É„e“Ë´#Ólò`â«ã5&LœXˆ`'KQ¿8I·\¸(!‚ì»C`>B�‚mÔ)5£TÒ¹Në1/+Ë^ñ°(Þ“¸R.uW-„Å¡®"ÉuºXXÇʼ³ÚgIJELOm1®õÇ:ÉÞ¹Z.ªœÏm 8ä=õ5�£ÅÞÛðÜ7pf¾ËÂøîâŸ�{eªK· Qî{YÇŽ7²à«Ó`æHT´@�Ÿöd›ú„DØÎäòšo8cŽï9ÂÁC¶Èg#hõ¦˜{%UvMÆ–ÖÞÞm1Îd¸óŤ^�®ÎÚ DĉDfg—´dÙ ŽSÙ}¹jG¹f9È‚£¹î]{8×:<ÞXḴûXK˜è~/N4ç ©hLtûOl ¯�ÞíXåbá±ÆvÍп0.=™Z}ê_w"änÕ*×]­Ç$V§”o%ÀLK168멃 ®(‰µ“µ첫„püÌÚ¢+i%Ç^Èh§¢–šûçײ›Î‚öá`�ܳ+ÞEÞÁ[�Ã2el8¸*´‹$üÌu¦/�s¢ön��4®˜fÈ0(%OÈÀå.›ú7êgS5¶—¹ïŸÙ½ô»�Ñ*Œö¦€ëœæd$G#†#K•Ô"þlÓº�ÜÁ‚§e¦- ƒY!¤¸U—SÔÙéNW ÁáJìœ^ ½¡Ä�îù8×®S¸©ûUjËÆ �ìm¨Z™ð–BA—Ììé'ØKýœe3+…­Ž=ï�Ü�Ç0 ×ä–:Öõ3­– v¨SÒ¡{ç�×[%4ƒ ìróµ Áfü›ª@ý'x}ŠûM`‡ípå€u˜í™ÓÍ)Mù0 o(pg ’å‘<�Z�èþmZ»©ƒÞ¬ªdy´ÿ6f«c^Ô¥_ä3¹|³”ÍbÈÊV2ed…7s„V7šâÈIúº�®?÷ÅšZë+óñ®b¢60ãº�Tçìh¹ZžÁ ’ýêÙ¥ò×. qA¶TÐæB‰nibpôìÂÿv¶ 6m`ó¡WÕûM®¸W.ab±†_•¥R¥ ûJ–œýV�­ˆð–6ûè�ß®”_p™ Ù,#T*“pOa"{�Úôò& w·Œðh36MЛ— Ál7>âtLϽÆB…?[ž2¬ÆÜ€{ßkÏÍ:;µ¨4ÿA.¶O¢»çÄ•½ì1ì[¾c!èØþY6!qåh·)¾)zŽq_±Ë.ìø Ñ;üa¾ß�&é©·1¥ž”_¶¡� ’¬m@Ü<:Ń…ËÚÁÌzxÈÌ�«ëÚÃÕ5'@ç.x¾ Ú@" }ì›n nY‚4ˆ#W_u+8„¶ È“Vå,hvìG„QÉd0zN)�¾=ç›1%ÛåCÅ©úhàhlæµ§p[´µÙK&á¶8X_¿q_PS³AòKâ֕ˉfÖàaA¶ÝR*}ø»B¬OG0íËp>ÖÇNÔÁcùÉÄsԺܯ\ãÒxþÈƹePó/Ä‘®h´nx Á›~ÚZÇ 4J²e®hþjG›mp޶K†;:VO¡k]z¶MÌ>‹ãlå‚!}(h†cìnÿ(ÞªíÏ7aN>½�òX·G?x8ÝgaóîM†§Ó‘OÝ/ÓTSÏ A|¢ ¡MACQ&éë䇕fðâ7!=ám¯ ¨|€Ê·�‘œ‰�Ý#’裂f^¹ÐD«Êžâ·çg� ë×HR4pVyqHúË&—Å UÔBd[ž\ i®X7bÁ!÷@±¥!´ã³3šßvÅS¶Dš Èâzhcu„Tp2+‚`2†:‘à7l1ûz¯¾çÍ­èëu€¬Ï·~ᘾûÔHíPR»Ûœ9_Š (ô01¬Aa3‹I5œ7nÍ“.Yêo¿)ã�Ž‚Æû¸Hìº|–ßeÍKÀEføÃ éXF,ak„ûQô íõ^�X™ñÝÊ>�¢Jìò‚±Æ[Ï;éf�8Ðz4-{è( AŸçûG÷{Ëq›®ÛõºÂKÁt=àÎÙØ­òH‘ªIMþµø ;ÂÁ.d\M6æ `£XÇ_}ŽNGžŸŠPóIÀ=‘ô�|7¼[ø•H@üJñvøL¡bxFLóM3�‰%Ž¿„«&›gÛîÖLÑ^o.ôp1Œiˆí7È"jŠ-^ø±*Öð ÒÎK¢Ï2åêtÁQ¤Ìšì‘s”ùX ½¥Š˜Ö*ƒƒÌP¸÷GqB/©Óò3¿ÌL€é{…‡¿zX�íNÁÙ_{œôšØ°@G,9g5ÉÆæ6_R“ãæß“¦�«°gž´É_IHÓ|jú2 †¥Qa8%˜5�á¦ÐC´@jx²¤õ7º&óúeKYçîvÎ;=ÌáUûúÖÏ»Øüª£`�ÖQ¤‘\é|W÷3��›¶²�¤=s ”âÙ±—19AæJ%r3ÜVRÀýÂŽù,ý™ì¡¤qð߬ja¦ïpŽOâ®òÛSÊ \ <‡ŽŸmo¹©Çð&âå5ÿîÝ¿{í`)h¤òˆ#¢7ÚØò ñn³ ’:÷z¹Þ|.+á`›÷Nó4]#„^ §$]œ r¼á’-Pôad�æ%uL�¶¬4á ‡o¢÷ö�Ù¯„#–fÖñð› çÈ|�c’�9~‰ä¾¼WðëáuÙG>|÷y ü6CÀM›·e‚Bì &l‡­Žò©b&úl·7… ò¶ì¿‰PÖáçÏ”U&ã-̵%*Œ£Î¾ »‚ï6;ŒFnã|4ÃÝ0ØY®\˜²ïN«f LTk¾@ûN:Îùžî3/Ÿ qq¶KÇ8¶è¾þËŽŠjPyèà ÀŨƒóžìt‚ÍÁÅŒ»bñÐ?,iDzÅÈ5;1¶,õF„¤€.´t"Âqvr�4;­‘PäÎ�FÙ!VÌÛ~t¬f2‡MuåÃŽÖVP/)¬[ï1ªêVÊv~ž€Å3y'í÷@2TÖ�œõ|˜Õ³Ñ@M¾UûÐØƒ<šÉh0]Ù0°eæá¥‰î�§Í¿I ÎÙš¯Mm �¦9ƒ†s–纗ßD|P֋у¯qP­µ¿K®X4“ hIm“ÃNJWö ™ÎWÆY[û~‡éA¿¸û8Î1<™�ûšµÝ2öCF‡ÒÞÔãi,›˜Kä>¼mÊÉA`×÷Þ^ë”1à÷ŠåŒ4™ñØÔ}kºyNêϯƒKûPsB÷8÷~/‹ÒSÒJا>4 »�‘ˆ@9.Ë\Œç{ [ë@Ö)Á¼1²‚.r'åèz=Åògg�†çß�/‹›!’Yú½{¬Í(è¾cé\>mÀ8²êj(SF C�Ñéðàw,®Â Ï,‰’¶C[ÃçíÛjb`2�„¾…–¯G´ÃDÉe¤øìËÚ7I§±lޏ®7øzŽÐî¨ì‘Ú‡$!Á8£k3e‹®—9�ÎsvÐ`)…MAæ5‡ÑaÁßǶT`· ° H< ½½‹é>bXP¡ï"ù¡CÏíEÜn»˜Ž%t�Æ"';8fdRüu›\®�©7—0ÁŽr$Ag'QU9Žu!ÔpHÎ0wÖ·æ¾¢tªó¥w.{ÖåqL0�\¾ŠÈlL^÷ÃÂ<&GÔ,fvĺV¨CèÕåÝ\öKb|\Ò®¹-gvMÁ|ÏÅÛ�Ÿ8aG57ò˜³àp2ãw¡šÿiÓ-^ô‘[¢†.cÊ=Yv.ÀÜ­i˜õþð€¨ósn�€¨Å¢ñxp0¶¢²"Gk ¤#?bW‹ 7õ b³Cï8ÃëÑmºe«P».nOðHëKd˜”@ßù¿?@³ºšOÁ®69–>:…‰–ø„ "žß¢zNJ[_4~�æÁcNÛ\Iw._ ÈÛ徑a¿³Á>1J² =X–y� îˆC¡°|þdÑÉIßæe“Ê^¤¤CV7=qzTíÚ×%öÓÓlÅ%ݪÜÙtmeÖVT "Û“q2ÎyilViUnN�P®Q%Œžö�Ï鉹ÉMû©U7ÄZúøçaOõ#©'·Ü°Xʬ�Ú 3Ù `{EÃaP×ÇAW7óJòçeÍþlü·-†ª¥%8¦»ÛàX¯�t" ¥ÆV˜ƒ«àJ2‹îqhÃ=æ;ˆAÚm@BÌÇ4�ÌP¢bÁ¬½¹Ð&p …¶“šžÜù�! ¹‘ˆ†Ñ¨QjÉŠ–ù¦á~HÕe¯™v†i+Áq.Y‘m­:?̆ÊÞÙîÞßÁ‹²õ£MкNï]¦ÆqiNA¯ìCY-à80µòÒÁÆuµË'X£~“«·8·žZn ™ œ9�€¡î»Úó»f3#7Èd0–N°<éC…gƒfynV·ªgïe¹8¬ë¯pî ³…ÛœÓCãzAïh»{Gã Wñ°*¶ñAËñãiûØGa/Ú#ù´@&hÜÎÏ 8Ä •—Ô ÷�9ò‹„Þ®« eÞø“üY¾y’Ü2ä6)¸”–°Nξ®s 3eòW³Û‡Û·QŸ¯’n³^ÝrÝþ(ý´ŒÛ¡y�Ù5Ú!^�¹<?oø2ZÝÊž²-3ñÎlÈÙ»pt«;NM°¦PÉsqç n-[™ïÍÐyÕà:H²æ$oou刉»’mˆ¿*ö0G ã}W´üðÂ.»�’Ä&¹ë‡0:/C>ÏW o©ÅÏØƒÐƒ—6¸ <¿åU(ß$I81EƒÝxm~xô±\n€ùmäÈ­Xë…p‚Ávý3fE†81žwÕÇÓ-È7ZúÛ$œ$ì{d·{3˜Ÿ½VulÐÒ`^ôD·$µIÁÜ5¢ù@›ªwûï7 c¤ÉH@8v3±4ùg½óÞG韀–'pðÈ‚àŒH1_–€ç¥g5š8aF*,ð9«ëËe*ÌÂ{îÞŸ9ˆ£ë‡n1jžŠ8yµÞðšsî¹vÍÏ¢�½;àÞ~üX¾Ó¸¤XkN3öLUQ/{ˆÐJ¡Ü1 ìÕ%êÉÌ„Ø^èwÚfç“k¬ƒe¯-:n‘î¶ØíÆ‹™Gs‡¹62Ël‹†w¸H Ñ“¹p÷µ6†ÈIÄN^7„îÆ÷¨J�X»3ð”‘<ÄѬXÈrÀžÝ±=ËàBØk¼øUaæFœê>ËÅÉ¢½Çf¾ã{fÚò/ŠVŠèÆ-ÅCŸ‹#Ì ?®˜¿ #íºOkžòv¼á0#ASóoDÆ\µô[¼"·\Q!8•@5Šd=pq›¯­å/˜¯RæËOɟȰo·ûæŒCU ¸rPFuÅk[Ù|æ!AËŸè5´œ8Ú×L]_f@ Œ³�s™Šuh, ôísÙi‰õ à›L[¶÷<¾±‹MÈÆòؼöo!ÚCtJºä¹["ëMÚs±†Jó &‰ŠáuÃÞ¾äJeªãöþÂ`ø1žB_ˆ¢Ïÿ—@»ö"yùñ%õüàùÑnMÌéƒ6ùÓ“ÌQó‡@››ÙØ=¨ñgs|·#ÅdƒùºaÏ>Ž*Ý=ú§î«)bºÍW1#ûÕßÁÆÔuÕ¬WB�øh5¥ãê,Bwèärmú”ýÄËUõ¯Í—�2�¦rã lÂÔŒd.¯rÖH0áóŸ‚5Ÿ¯ð…›Û `½ò.‰-Ê6�Ãj~ÂÎéåÞf´¶wO+Žgz¯ŠÅ?È" ÷mÍH:¶寫YÑ} ÒÙ:éÁD�™ýŸYvâfêÎ|1Bb³ê}·1±â„`yÝàGVÖÍ\^ )rz×-¬â[�ÓÊð±4ÂBÆúÞíº`f sÏXâãôo«¼Œ‰==Öåù“½ÑBú~Þöy¶Ùà 4ÀEV¨5¨¦j ˵�JÛk ¨­Ll0`Wû”µ=À«Ú¤…÷ŽÈã’�®ã÷Û¾§ö]RsJkä'35kÅx°]à HKưùpsñ‚êô„ ¿ŠÈÂÛ=¶DÞ)fuŠøýííF½¹ÎMŒÐœ±¦•oº±oÝÁ3m³TØ;ìAî±]Ç¥¦F˜¢Ju (Hg¼ZÑ¡âÌè�ó½À\§ÝË7ÑÀØéÏÙnõL�UusöwE]YÆW0'tìPp/¤]ÞǦ˜ œ` ÙHrË”s³3}p΃ÄõÈæi¸º³)Äwmð><¬}+Š òèIHt“el÷èâÖ)T2Ë÷›JçgO…!·Ð� ¦]~‚›lU#½Òêð²f¦¥�ßhîß7¨­vu Àq¯Â\ymÕ]{º7çÄê1Œ�fIk¨÷UåËŒˆ�§/uð!ϘHæAšD…`{kb�aÜ²Ê »¹´4^÷t}7m)V±+‚,ãçÊ»ñÅ'†L¤$‚tå39æAû¥„3^–­€«Î;•Ei7Ä#].Û9‹ë'Íg0SžèùkGEÏrZšç.U$[µ2ëgò"@úÁok ˜=‘èLgdÄv¥)ø\ Ù¾ÖãÁ…H Î5zxÓám¾‚`ö”l~%àØ!�ø8�™2#~Õ_©Îf_ºm p7ŽMA*Jrë€æEç qŽHZo}dI$dùöByÔj-F@tO=´mý`ZšÁè~̰nᎽð¿#Š.A°›�$-Ž&ª�—¸L�ûWÎð.º JïÇ"Lqã@­Î�fÌR¸ÈYÂì"ÖR/v!&Ã�ÓÔE ì92DÙn7»Ùí¶,gæNÉ2ÃpyÊÛX­ ²ßظXSÌ[G„-„2æ3æÏçšø¹9¾ÉbÓ˜®&Îõb:µÆZݯ>^_6¶~Ýî\ЃbߤjÐï‹pÍ¥Ÿ+?E­œþí3ù8rl.!µkgFQèèÓ†¶öö°^6Jí}›¸¿7 ϼ0 \¤-y-Cªì«¯j€í_ý¿nPZìsŸ_Àž·´öñ�ù+õÝì‚íz™´Î .l…±ùë5­ŒÍ鿵;teÎ_lú �ØÇ]�´Â¨6³ ÇY)Ûxb³9·yÇß –�â,ºjz^Ë�p¬¢†À‡{Â…,·ÞHwÔ´R¾ãÉnôú†Ú>q9ˆ;¥ŽÂ3Mý&²6îÜL.êôÞØsu3ï'ºo ÀˆÞÕ.¢Aß:é *éä:\##¨˜!«Ì/…¯ª -–ça_·0­¹²«|S¥ù6Ãðºß¶åêÊàp›G`ôï)œÚ{£°öÛÜ„k1!#¿ß@$’gõ+Ëë;úÔm»�/!Õ`Tl `›,Ýð· É~vÓh>ã�õŠ×�ÍÉÝïwD�Þð½Éá÷Úü¸-­æâ$í�Ô‚þ76²�ùÍsQ>Ô¦á†w÷ËY�Á¦S”}ãÓ%ã côÜ,"sÆÇÅ|ì¼Ï·w\&kÝQÞÑÎ8#oé° êT®6 }¯5ö‚j›³NAÅL!ôS±ªSÌ*_ …ÄÁñe®#­3·5“Ùç¿ö«€µe­­� ¥%2NÌ:î Âs§þ5ã@ÒI޾<’C'ÙÃܲ<ÜÑ0Ù¨n Mc{:… ¡z5µŠhÊ^ uì@¾—&‘e‡f�§Pî$”�òÛj4âš­±~wøí9Ø–¾§½´×Á½åš‹”$"˜q·C=ë:>·`G½ñÉ:P„ !Sý¢÷_ìaÐ% ±¯ l\õ8ûkȪ]¥Ãv[¦¯¦mmŽkx0%gzäëò¾kêò¸ÒmÅ…”9£?œ–!ÔXSÓ)Y”lVŠÚ¿Рé²h\»;?g¥™È†¨Õ CÉÍú7z†Â%áìG¼{� Í×Ý#:¢zbt[ ´¯à»U NÕ“A|ÊÕ+°º¹CMNï „`»½uq ÐK)¼—Ì»”0¥ùqqL”s%ÀÓÈ}Ìv~±§Ql{YG¾ó„óêÑóTt„˜ô› Þò Ì[÷¬?¸ñlw#Îe�Cq2Ž æD˜Ix´jA`ûÀÚ֪ߧ_zÈÁ¹õoZ²X í3ceìR?t¹?Qè/)JºngSVn÷ûìnùË„°·7øÜ#!ôX>+¤¯èU][2) òœSÀx0¹VŽæÀ¿¡�Æ÷hËcZbL›òȹ±Ñct/ 8o~Zy’·-€Cs.5rõ žßg-‹ÄĵzrÛû-„:•ÞëÈ~˜ßX£ÈOdóJ.o°ž/¹škhï7Â÷8j†Ò^—;¹1ý¶µç¯ È…ZGáA`êÔu³·½’²©oéc\5Â*ÇÖúܱÏÓŽ¡•ú8èáö°0 1Jq•äˆ7ÂÖ옳¤Òä¡¶Íh ´œ¢Sh‚Ô¡ÏÝ(‹w¸ž�Y.(fÇXó²eJ½.·A»'A¸ øâ½@í 4$»Ø]gL¾¡P œ$;<èØÊûT áx‚[^ìF;HYËSÎ \Ño=ÀLbÛ·ñçç¼¹lùé^À@xSé•-÷4C^©Ï娽_4Ô…ÉQáçQgÙ%†ùÕW ³Áí€ìÿTö¸{Vè„_#‹0®;+õ¥ÇÚŸ½7޶“? :Üm”h^åÖi“ ÑÚÆ`Œßiv©�äÏY/XµgijúMz“Àígõ|NÇJÛÞL´úÀhËã ½00d+�nª|Œßw�n7qÖÝ]} IàðîuHš—V#¯Š,Î÷ž"Z²›àhi«Î rÉ[%Á[÷ª¾Fœ™ZÀáöu{´�,õå×õ¾«Ùqñ&ŠCW¤ŸNŸEÛçÔ£C¨ˆV6ÂI&cõŒ¡çg§t¸,_bøùQ@J?’DF—íÙO“E¬ç™º ÕÎît [rÃ`ðŒ`tˆP˜(ƒÖWáÏfɪQ?œ4µP5ïÕŠ[µÁ>{ÏÎ ØøƒeÂ'>Å·fo¿¯`kÑ.7è¾lÖø³Ï1ù]X§ÞØ¿jÊÝø®ÂÍjG‹ö–NÅr±"aìþË7Ú»«:ž²6#/löa¬÷V©Ýªádt„¾AùÆ´¬¦‚¾BŠ^²<?´Öz22Æá«ÿ-ÇÂVª!‘iM«‚ÊÉž~= �ù›¹jÁÎ{eÒÞ�ÀÏDŽ7êlµóÄlkZB �Á#;v�æ<½ˆ|ͬž5ß‚qz›o`ã¿JoÅ N—ªï´-ÛÔD ¬M”8>}ž„õéÊÞE ´ �¤=‘â·ì£�êÒE©’çQy0£âÄ¥ëd�FpöáL�–c4÷F¡°äljܴ��°M j‹Ç7; >·.¢Äƒ•¹G5{ Ntè ÈUª�t€zq£6ó_8=Û´€kI"ðÚd™1yM¸`ÕÐlÑ`q¼ÒK1™oª›åú™+ÁFAŽ}–šQÙ›„ý6Ú±J�ØQ�¡dÝ V»Øªà{8.Õþ^¾A1�×e•ŠwºŠ3/»ö`F$›¸×}m'f°Ù wa—FÊ+“:™Êtö:Ö¢qÙÚB¬è1`ÔÔæAôø¾­�6,Ö %€á2pªíVê~V“}az3.$æ•Og«”‹.ê�˜pg2 ÀOîU_º 2…µ©Ò{…­çŒ¤0ýêàÒéL™··�1øÿ8ÏíšßVÊ¡9Q—\a�{4?Cþ!ÿÌg rW¿Ø£~‹-¿�Ù†3�§êrr\C^çâu£;–÷eÅË”ÃXeoeC ’²´(?Vó¶Hr«sû?™OñYèüaÇgl¸_Ë­×Å ÙCÝd-YT7“úß›! ¿³ÔMù‚Þ¨`.�$ÄÒ qXxüÍöù]éï´£}ÕÁἆY(Ÿ)b’—« T­ÎÐl\E Û�¬Z úʼš›VDAF"§j. •u 1«1ÔµK+r1õ®" ü´y!ry ¾S…Cµ„3¤nˇT)š0¨>Î}]«ÍÃkä™®TŒÚºJ›Æ «Öù“´!½}ÝZ¢ÂÖKà§à1•Î%ä°dª>3)C$.Ìy†»\ Š'Æÿ:JS鷺`-\¾¶T1…jOÉŠ„kë»&"ÛeES«½ÖVÇŽNf-K\Í¡k‰UYœ|Ì Hú0oò�‚O‘|“ZõoEpBåÑ:«Œ_¸ûéÕ—Þü\�ªëV9fù¦ dÊòñõ6˜-«¨›¯†•ÕÁŸ‚|;¨èÒGy<>±ázM·,�~ÃVqc‡ç%µøÐ ®1:„Rœ©—EÖ@ÚlˆÈOÒC^Úžþ!îHá�Ãn¶Sô(ª÷íü÷¥ôV XC\йCŸê�رþä{ëɇ'�õï¹M—DZÚ×—>F複lJÁ3'TˆÙÅ3Ï-§6µº·ç`(§a¦:àîÙÎîø�ú�4�>ü¯Ä a#™{°­õ/†³N³kwRm³…�i?,ÝBRÌW’ä0~ ë \¡¦P¤õ÷úˆË§ÑìMò´fƒ"«]ãƒ�={v %àÝ"A¼ÌÃk*JrölÖdHõê—�Î&?i0¶™ªò¼[š.1n‰4[¾¹n 3fô¡7Ê×�!p1[[ñWó>ýéÍAN­noNÚ] ØãRñn]Ür ±Ë‘xÉ¢[òÓ o¹ÇÅ5Øbý�¡5ÇWé¥ååÅ$QøÒûñVÜ´˜X­R›]“^+°fXì¾²UÊÖÈKÛüš‚d_Åm€¢^ m€³P#r¹Ðݹ¦M ÂP°YK{³ÊÓCU 1%ÿZØïÛÕ6ÓFØí‰Ï¡IbÎ7zïÃe1æô÷� 6â†UÓå$NÒÞ«w#H`º×S)ݱhusƒK…ˆÛ­„ÑðwŸÅ#Û¤›cw…2xëj†Û}iƒ#‰¾`w»kJËzfÃ$J¯æIBY…@9^nUåá×n…ô‰Û^ ¸±a±TÛ2«£òâ<,` Âþý‹Ù°ÁæìûE³<és®p`fhʯDx#ò�"`ÅXØô=+þ›͹ õì-’úütF¡ÖË)öƒd¶®Ä¾Ž ¼yÕòú¢ÓØp°Æü‹4nòýÝ@ZĘq¸ãe°á¦7H—²8ôï-2\I5¥Õ�r™nÿ^¤A!]Ð)¢™Ã//ÂÝ'@¶ûp@-‹6¬ÐF"5-"0´ ëGê·6)E:Î.¬¶Õ8>"E]g,ªíh9À;ê~§ªÇ×ÍMãL 7D¾¶&fbù÷5«ß>ËÌsAJ`Ô†¾;Qð3ÂÉØGWû W �*–�à+fL¬`Þgj…²p’tû{è�™¬fG>O«-«rS¡Å}ÎÞÁ5]úÓ23K�Ÿó%@‹Æ++bf›Î¸^¿ÛÄó±ë[÷+_ †­Fï#Ãsôwd" !ŸSí�ŽÝµ[k$ö;Ý`îJ»šûNpà[Ä:�úðÅ*02åxB1Õ®¤œ\þ‹p¯e§øÑǂوݱQ�ÿ^tMK ¶0t9Ùxq@õ㩹ˆƒ½ôìŸ0üÜaiï¡�i�í®5ý°6o�ù2Tîì�‡zò—£%ÁgüÛê‹a;6×’ÉgΦ´4O“D\)bÁðTñOéÙ†‡Ìá¨Óí±—ù@1åm\Eß[)ÈèõV¤ ­NªŸCU?aEWSDUÓÚañ8Nk ¸*=fš»ÜІo]ÅæÔeÎ[r8jèLr�cœ&°[ÌúÚœ‡$qºe¥Â­/�ãÔx&ßJÍf[H´É5Œ©–ó:‡€Þ‰�8>báÝ:á“^¡ìÌ'w¼”tÍ�ѪV¾€ƒqà £"¨ö!­¿g7˜€ãÆÊFµ8½‰Z…º`æV½‡ vyeöA�á~2—£ ƒ­†7¯´�nnꩅŸ߮¨z-F¿1_:¶aǘÄ6-nBjÄ�ª‘Ûc‹‡ 5æçFµöP­_‰¼\â̈èÛCÑ:eú;” diÜŽ³!ÆÊâÒµ\]kdL�P¿,‡L—Õ;®ïñ4dþXóí³ùó.­¾,æŸàúÉ)ÁLˆjØ[ý/ Ä+rÓÎN8;Ü‚»Æh`uäYÛÓ°¼Í¬¯òT^ƒçû¶9c±Ãû_sæÞI¦Ð+D„Îz‚x+®$=j˜žA,׿´\N—wMüõ6r9µôÜ¿ÓÅçm7Õëk pÔgJ¸¡,¹»pØÒå{9Þ¾qá¶WÖQïÚaÆFøX$Db’?Љé1ïynË�Ë2¡jaêÎø· ÷Ðç/[ïEÕÐéÔÝûEÆ¿9qšk-§>ȇ·\kä²¾X·¹ÛÝ�¶êÝ­Ð2R¯¸©®M½ÍèFt@Ȉ�¯÷§Ï{ÆâÛէŠ&#áo¾÷Þì–>ãWWYZêƒÞqµ˜s"=ù$0ÓÛ¦—ÑÔëVº¸ˆƒÕdL2¬„2jošY!gS^í¹Ö~ý²€ïXûh �nv~YÀ¦�‘Ò›“ºýb ÕuÖ† Ã$XY2‹žd{0G®îrFš¨_šSR·81jÓhw•‘Í.ë.w~@ã8ÑðwjÖέ.ó¡Þ8´ÍìâýFí»ëíø›Â!\1&0F ê:Øø{wóadÓ{ÅØ"�ݲÏ8ì �|ä£oiDE{þÁ•œ±Ó�ëçm_äº)ãØ÷öóÖXÀîM-ÜÚΨ³��¯\1‰êy°¶…ÜT ®ë› í I'Ûmön�}›æpÕ=1†œYôåžý£¨ay ‘ÆŽ�)ÑvÐ[´P[ºbAÚÝ]c^9 óQã–’àA#Qt±–”no/6«Ÿ*=£ÅÙµHìaáâ÷:'²ÀŸ¾ |î€KJÔ]%>•‡Y`,í|—?©it O¾¢î÷à <—ŠîŒiî@v/1Ú9��[Þ· öŠoZ$¿ _�Ó¸3Õ�õvRIDÉ‘²k,~½³è³3&Ñl)-ÖÅñÀßA-¨*‰ <¨•\3Í¥Âjò|ýøßIW µÄŽŸ \'^�r�Õ`k‡–Ÿ´‰n5(¦J°RÛ‚Ö4q~ÉÞvùÍáû§U³‡z*ÛíÞTlÓ’åŽ,ÌŠŒ65 !z¤69¹ÔÇaÇÐ"Ñ_¢F›êŸeγ¬·�³¯':HZÁ5¶s~´Ä‡<Ïv>œS‰"JZÏ Z²�:Ÿ…t6�¶G/“¨Åöö`•φžÙžŠ„.IM?,¾ QÅ!ÏÙèÞÊ 4ðœæ'PâÈ|fíûÛ5ñ�³05d"ûpâ~Å÷œ3™‘jq�Ü c@GÊßuÙf=½o-aß}×[€n£ÝChºšÖè6ÁI�6Æm 6I…³ù¹ù5>ž¾³«ñ�Èp·ëáÕ!öW4®ÏOCd7®5 Às*|‰3vÈ ² ö›’×åÁ¬Ë=ööÀÅoˆªàñ:·gòR;ãjGA­z¬¿ÜÅ¢Ú»W8C L×,ç¶šç.Å ¢ë8Ä=¿:…�ÀêóÖ½¾q�žNË*óÇÐî0úÖîùBu¬GÚ�X1"ů6_ÕYüÕ".–¶"ãÚ{ìl¡Q›¶�pfÅ¡(ä{O�¡¨á‡7u(¬„äy<�³ á%)KÇ6r´½Ñ‹š¤wÍÚîÕ|˜c¢tÇf8½õH ÌS| 1 jó'‡.9è�© "®Èø™e»*±‚;6ª¼Yk[Ø@¹g.û¶÷ÆD�Fç˜%æÉ‹µgËU°�| Jǵ´âØ,!Á�xàoSÕã\Ó¹êb·j]£³4ÆjçpÖ@€"zˆˆ?ä?Ü?؈ü/ÛµúóøÖÐ-¤ ©e1í—¢ù/ã•èJà eÔs+-¬�š°ì^¼|Áƒ«€Æt×ü™ßÌÚJÐ_¯‡œd ´Â ½Ø(KG|ÞØ±‰Ü‡ŠÊ“°Ì¹ŽÄíì…þ}ð×»‘Õо¸o…¸�Æ>3�O4�Lf«qðE¬k}Ö=}rÅ®|iLÒ–Ñ„«Õ›÷•¹¼7ÇÝJw75Ç6Z#º¥µÂˆ‚›Ù$¡¼°qÚ§C} ‚ x§×Ô'ï�M"28‘q�—np¿6×»tšè«�·QÖÔ>ú¾8Í7Æ·ƒîo=¶t#ç¹ ±1 ’¢lyî/%æ m�jã§Þ<–Ô1¥ØmgŸ|ì÷x' w�àL…÷ uF##Hˆ×ïºN5w{`Û‰×0i|@pÓŠ€¨¥VqÚ“ð²§QaÞÚ„±®mÇÞÀChEnŠ­Þ1à´�KÇõMƒm°^.l�…Må†ùì'e. yëÏd·ÎPL°j,èÅ‚T V ÙQq:¨ïµpg[')å'N–ê×7ŒD娱 0½Ò�èzü]ý'Âcõ²ÁWÒžXžž§qnjÆcO»uQÏ*±¸ï.XÞÐß휶AP“-©ì/ØÐ{*-m’ ºÿÇ\óQlÕ¥&ǺÁõ­Û-ߦ¥ûùõoÍáˆò+²°X¼ôïXâpíW¹½¢C“k�là;{¨Ù’¢ÍW¹p ðõg½K @ôžV Ö…àÈϹ¢è„·¶Þÿp …Ø.nÚsF„Mê9¶ñZ³`b�sѶ·5ÛÔÒseÜçŮڳÁ¸uˆvŒrÔÓ½ÉkSÞHÝö–Ä+‹WØÛÉœöÕÄQâ’ñ&Ò©KÚ©î…¬='ÆT/•0lŸ:‘�g\Ë,[C|²±¸Æ)22”ê?Œ³‹¥œ‘o5t•¨¦=¶U ¬š�°PîÔŧ¶¢[ã.5À«�b+3Yþ•ûé¢?o"ýì¨ãm÷9\ R} éŽÖ}ô½ø¾0�{ö½›£ú™vVDŸ?ÙôcÛ·Ø»½0°+&LŸsË€Ãø7 qtV´€�€–ÂdÏe…µ†¾¦€Ë ¿Ç¥Ñ~—!«…_vu9�WEp: ðZÂþ¸^áJÀÆìÍ{lÍ+£`Ïæž¹Ô$ Ùuú’èî9°wƒxæ,áPÿ�)«koÒ{b﬷z»wØ-± ¬ØÂ=½–_÷6¨9æ+«# Kã‚…× ¿[ ÷ÖÅ©úö U(ýk¡/�*%îE¾Û†òvÁÙöv™ Q¨5åÉ3fõ¡Ñüà|Ó"Cœj¾ð¼¾œšÌP œñe‹Î1$�¸8ÐÃþÞ°Õºý¼2ï»ObÎ`sœÜ;‰1�yÛÖÄ8)i€Þ 7ôƒÎÚùÆ9I@•›ç3î|Ô.á$r?Uò!ôSäÀÑl Zˆþž[®Œn Ðl—¹#p˜…,kF d÷ÎŒÍ/â4Å¥0 Í ÄðƒËxB”ÚG·^�ç‚L£…P¦�šCóÖã{Ñæo{p:3Í[Úïq�´–qb?m4í@âÂí…SÄ_�^°Aäkņå¥È[VóÝaKg.石¿CA*{é^ܤfôJõ€†±ë¾ªRº[[¦ÒéB<…ï±§åU°Àf=#a<¤ î̦ǡ_2ÇãÎ÷»3ðÀñ™ß«åSK…¶×œéÂ~%ö”0£ª{Ç.‘ßêPHÒõ6‚pÖ<þ[ô_Çe½ä¬ŒGçivîQG鯳 9NižZ”ÊXb° ZÑ|#ZÖCˆ8ÂO›?Z�ï�œ_‰tõ€ï‹Ä²¿{Ç}b.¡X?’2)¡ääÀ[Òžeí\hê ÕJ¬4\–™*·f»e‡2‰ÞGÔ b_,¥ ‘„8ƒ²Ì;bbă&;¯,¦` ÖÝíl#r‹ø;ˆù´1r ‡ÜÎøÜˆ¦%rD³XÁiˆÑ*7…;9÷—sÝñ¡-y]ÞýÙEBýµ×Ý<�ï{ªÝ⑆©¤èïõþ¸o(ut;rƒ=¹ì/'™j�Ñ·Vs@Ü¥ÔòÁÅê ëkOòáIí- ›¬!:q÷cmä#U)Äd¹²óØg“О7ƒd™‘è¹jdÏ¿6šóËÆ`;Ö.ΜhÖ�ÑÞpe§ŠÛ»a0«_®äUé%k’ÑöØ€´Êóž2g)¶#Î4¿‚â[Ï Ÿ÷ŸõW`‹³‚ê^¶û¶Ì½ñ/—ñk1e2¬yjyŠ¢rû/Ñ®¦Ö¢�Ÿ—ËÉ"«Hrw°cBŒ|Ï‹Œýɇú=a’ rð–Á¢XѳŸmœÈ ›Õf»1a;³ÿ~À'¢{÷¡®?u× ­è,E¹•¶Ø® ¨Ca¯\ Ê%ª€/€�GP�û)`¡,ý4,MõI«7P Ì¥åÁÿ#Qù€VÞhÔZ¯u£qp\² súô?Ûj_Æ•x–;Ž©Ì%-‹3tûó»~[¯F|æ ö¸aÜQ€1…m,·�9Ñ2¼;ñI>2àE,Xvéw©6…Dý,|~�gõR­¡¯æäã`zÞÁ0 Ú0Àâ Õ ‚§×&ùSC%�õï¶Ÿ5¤>"úBÚ°)ŽPùÙÚ%2ÐŽËAóã {ñÝNy €g¼­u“/�yŠ(·LÀ¹wÏ]µP³õyL+t™þ DDAaˆý?Ì×ÌSøf›Wò¾^ú“âøÛûNú¡øR·™ó\sž¹;Ž@Ñ$��¯-íÕuº ñ‹Š¾tÄÂiÝ‚Ýïáã·¯=÷'âlˆ,3ã°»¶á9òßXô§\8[ [F9¨Q8Ž ec»FéWmAOj»o|Ûp(vsŸûïß¿5ÐâÎx¿Ž¥\ šêœÿQÀ!ý%ªN%�Ùýç“XÓbXÈ¡BÜ0°†íسQpy\¨È˜nøV]ô a¶I0Ù;j¤ß:™|ý�eë‹å°‚2ØOë¾CkK|ŽèÀds‹8 *©Ìeç3Ö·l鬇$ö—©_‡;³†¤e"ÓŠÍî· � x˜_¶]ÝÍ4y†¹XƒÒMñ³ó¶õd`±¶;Çóß3—߯ZœèxVÃ-EÅBë�ÍÅ}½PLyÜÆnÛ÷\gy$»¥è® û=€Ê¹÷£ÕlaZàEÁ¼Å„%a¹lã v½+uËĮby)ÃØÛÕß4/ìO§›8Õly¼_3ØEq¥XwoÈã…½¾jÖ²·�—žªÁÌùJ¬æ�°!M)ب�DÓâeûñ/¯Œp|-T[õÍ㪠µdšRˆ’w®³LdíúzœÐ AoÖÝÚ`“:[ˆspôÆ?oÑinmgxµËZ„¹wíûíµ3`2Î�°]�М®»�nùÀ¶N%Ï .éömå뽄p߇`ø“u¤C eìX W¬îý«ù Ÿ#q£ÓåUïr�ì7¼(m-ël%±É0ׇW‰a¶¶˜Kú·@Í­ñÙ9y¤,¯N÷/·ŸÜ!ÞX/’Q"ß ²Op†Žë¥yÜÍì+›A¬JK�o6 GgC°¸Ñ_Ä|ßbxZhÄ�?(Ïé˜Þô—ðR¡ç‹æ02˜)éàÝSq9¥¯^“BæPä?gæ›ËÀtà5I´~ ÛšRÈeó¬*Îî}iÒºÔèD;ÂOq—Ýà�kgæHk)Fm�lÝ>5&qÛK[w)šðÙõ˶˕Ò9ï å'{ŒkO­DÐLúçrd�X·+‚:lôéMæÈ_ÚÝ'°*ùçwpúòvRü�²ŒãqFªN§ê Î2ÞÆXµ‹zA…ŽÈÀ§ºDñ›–ÔˑܗAîÞìøP )]ç‡ukŒà”[Æõ‹@®ªDhU Lj°ÁAÄT¢»g`‹÷£Ìm•ûhj{nˆ�ÆÑ¨ºðÒ¬á�\ÐJæ¶SXÐð¶çz¡�½f¹�é�3.·}¿Î]gId‹Ã…1ž …Ð{ŠpЊ]Ѱ�_aM;+æ°³#¨+�¦Î^}*âoD  m�uŒ>Ÿ¼dV[ÍQõÚaAŠéˆ°ä,k0®YñŸ€O;°Ä& wA ¾BÒ˜é·oî¾×Ü|ì¶ ý4qÞp–¡ØgÐ ŽÓ’ ÷6l5˜Ðç©tÃZJMxpBW×Pc‚EÕÙ»É ƒ.x¶qa<]½å¨ãèKDZˆŠ›=Ϫ�Rl»9À‹¥nÚ¥P¹‘…|!¸-JÃm5í#a“(•«zp`ûô(G(ÙHìTq öx{^jÈžÃý"‡Ì² ¯dùOÕ‹Ó_‹s�Qu¸`£ötШ1…¶†á#ê¤hˆëäZ–Ó@ã6T#-Õ^ꡪØÍ½–ÖYûh~øØÅ$߸}‘îúÒÈâj­:ÖS+ýbåû¿ïvÚžüÜH�˜C<nNØ�Åþ³I5 �wìøI¡-ÙK…ÎlŒjô-¼{¡ñŽá±…õ5Ó€‚*p>{ZCh—8ªª°|KúF+s}av[™ ÔóÔȧüN¸0w+h$à64aöÝi1›ë­ÚNéZfµz°.<ËÍÛx,†ð‰¡¬©sH&˜د„TPëj»à/žBr™~yŒþY¥øÕŸ Ò�QàŽý�¬üSª’é Vø[|e\s{‡$ ¼xÃ\(ÀƒB±¯åɾ†©Tc0ÚMÞÖj`æ®çÂsVØ@¦Ñ·±§Gh>eR,—e¡àéñ<Ç1“Ýþ½®æOYaú¨Ÿ¬Gr9Ë3ÀõÎ×´šÚ]6\bN)ã$‘î©qoývLÛ8ù*ÑøÁý R5¾Ýd6iÄ�ÎKy’L6¥c]-êsÑ@7;økªl1•0tÓ;®¹5ÇmAÌ]H¹n¼·«ÆÁôB‚ø±¶.æ-N·9fã(ƒÕíf¦­Ø«¬hƒhƒ³_'‚Öu€ÜÆæ¸lšnÄÐà8X„Å*‰iŠžjkæµ(àC»È=tÎú:í,—ñ7È#Ù .½† &ê^Äè§ÏŒ�‹Ùw ø°BV4Þ‰,Ú‰ú*kä>.„òÖ=ûÈýnV¶=Å#ÍÝQbyÂ|ß·©=ؼö²·fGĨ×ÛµŒó´ˆxo2£#…Â4‹ýzòüS‚´\,AÞuHškT‰é£&¦2Kfž}”mzØ6ÊöÉ(ÆÇÁ°g9=s�kbçç�nÒûpwuœ=�9‰œûhO�lú0(ß_@1²5~üàxßØÜž¯v©éÑ­Ýãc“Û§W‡ÀXD"umŸ7؈Ïgõé1Öm¤c¯¨§’b¤w˜¬ïž ËNÒ£, œ(³áí§ ì˜&Éߦڬ¶› 6nŠì7)}ZÁéܰZutjd½Îê>ºU¶…"”µÓë¶H9ß¾ŒÄÆï¬8¥+Y/*q³Nhu®Îß2CžÂLCàãe³+õqà €ì‡uìkõÍ>ÒëÙÓ†kbm6” �l‘ð÷A[¯·lï¹)l,w:Wžß­ã†·º£sÈŸp2�ÇDðK†aìA‚ä<ãsOÛÄóÖ¬ŠÎ&lÃÛãMO5.µ“¼î³´i¥i )Ú¦m{†6økómè^+ˆr,ï#*%m3Ð�«å�Cî>ù�Š‚„Ͱâr¬ ¼ ÜqQ¤›\µ�Z{`ÖÔÜ,û˯y6Ãw�è²[Úï`·e´Øæ &��Pvôf‡$æµ;5U¶îØåñLhï½3QÙN·û7»Û®87Ö$”YƒêºJó�”ñk“Ëíd•–�5#”[†Ü‡+oL:Á s(ªkãsIôŒ]‹�ÃxžÙ'*ן¡Ÿ�geÞ°’¾üvÁЗo‡Do§í¶Vs£@Ó¯°í¸,Š‚ŸEí¨Yteºü©Q8¾ÒÕA–Pƒó:ű«$J¢«P0ìÊöa1˜CP}Ð]’³gç4(îb8³¥nëgÖE õ'ä¶­}¡º¯�@`T!Çô)c7%ìI†vR¡tWÀ_±²¤E¹ÅC‡Ú0ØLŽ�R³k%Vø bšh„á]ï Ï™ør’1±¢,Õ”Ýä9Öˆ³§£î·‘¿»JçcÜ"$`Mñß\2Éé ]á°\r¨÷ª¢6*ü=Ë5ƒ?Àï9¶ ¨dG4Ù D‘×YWïiÙÑ_¥ur߀CŸñË™çÛJÉì¾ÇždnÒP³ 9øU’ŒQGðÇa”&´†¢T´Åè‹—$@°ÞÀ‹ÊÌjì$Ó(`Bçs«6„Ác ¾Ew<ˆÖ‹ *òâ‚BîÁ]ß;xÅ›w”lÙ´€èæÐ–‘†Zuf F%ñ{¦k<ŠÄ,ðº¸>åÐ/¼’v«S¸K" 5‰(¶°Æ,Ë8ã®,GuÑ"ô‹Ž›¾ÿ´ :œ9§²ý{sMîlÌÎo’²½¢AÍ+a²…Ú;\¸ÚÁf«òV‰ã"�r;ÃrV­€,Ó‚P µ©œx…l‚M’éÍ>ÉÕ4‰*N×Ã%ª.¦¹Ãß4x™‚7µ+ =¹ÀÅö �›ß=�ZWEÄ›\2˜–©Ö~yå$í’ÊìßÂK+þ_4—šNϦæþ²¢oîŸäãLüíÜ�¥¨ÿyl\ ·ù*2>|¥¸Œ§M}Dpáݺ2õhMq¶4Ö`Üëñ»¯RëG æ"·‚I¸— |Ë-IHü˜°³Ø¾£:(qÌu`³=À�XÉMA¾cŒޠݸOðf±ûyól4 á^žGaÏŽÑñ 8qwö…l$À4lGjÆŸ_Y ÅkªgsUhßDm\éSœ0in²¹ B®Df‘Ôœäë(np˜�ŠÆL¾;:4š€q7Ê]‚7w¥Ð⋤øm}kG\Áh9¿s6ÍN‚¹TxD^�+âoMA‹8>Ï›úfõkí›°Aï–> e7/¡´˜žMS†wÔtÖ†k†åPêßoF(ݨ`CmÄÆlIqÆ®áÙz ¹›Ži€é‚7´�Çëì�;¾x8èÓ�>‰ áÿðÝ›^Û¡¡´ˆiÄhÝa7t.úØW›§N©÷ p0¸ØÉ´F£;’Ä(Næ/ª½Óc¢$M܆ &9?©´ÛŒ'Äݼq/°'è—ë—l-6­†è;î"ì1lG¡ËaGÚ9y ò‚…‹Í ´øý¬‡³pSdL:­åÍQŽy¡åú¡õÙîF¾5B³o>c\L]6œAü£a rÙ¿k³S!ØAëqg‚Ê¡ø>tf»þ^ˆõùذKn÷®ÝÞÌ}ü?=ý+ø›ñO'žêá‘àH­ˆã1 Xuxq´c™½ôÌŽ( ¨5º QRØ'9@ƒùš A"3kĺGdD§?.d­mûSK']©¼ Ú ÍeGô»CÙ+šäÌ»QÚü›™JUdn¦VÙ0Þˆn‡Û÷¯!(ûG^�]ÛT' c)¦k�ö¢$^jNkÂR囡sìëã_'ÒåÛRn§Þûó®ªgÎ0Iû#³GûªæK­Ks47\cÛ¸¹w׃î®î úÒ>Õ†*@}{nÌ W„µxK§È¸@á“é(ÅãNìqª¤Dž�›¥®y0 îÚÚcVßáéʺ%i ôbáÃê¿™Ót<œ¥_ɼÛxI| $�†Šëâ,Ý´¸õ‘‰ýÐ" Iˆˆ9ß«ÛüÕ¿¸ Êý°] -}ÈÌ!°½> Ê^8 (R¢YŒ ¿•-Í¡k*¹q,_Œ- 8qµÐ©�o•Ž.�ä…·…$3¾6é†Ì„O HÖ¢�œpÞ:/eÒàLõ¬U¦V2-eØ8[ƒqö¨{µT¹6í,ìiƒ[×LãŠÇºá[¢Ü4B:ØÏ­V�¾YA ¥S>à)}¶ŠP^¨L†vÚݱ}º•™Ô±Öp0†÷'D‹×†wÁ {nnA­]3½oM…7ÚÒüG½>Î>=œ#}Í‚„ÓaŸ*£hz¾³-“•¢œý£åœ8l*ÞÓª8ÆÁè‹|�+,¶3…, ¼&y�Ê_f](X¯X䄘.Ûê^o6Kfñ†�’È»Z´é{0Ý.ÜcQÀg˜Eæ�´½ÊþiW@”Á*n•÷­\ ¢î h@ R½ÖÒ\˨Nû„¬hÒsRU½ŒÕ0å]ÃïruRGAŒ£�¨mb1‘#Ùj絜É=µÍ5’°x¡ÙNc³•¬À\²hÅ m¦âLÈÚ¶Á CWÏfá½ný2·-€¡Nà'‹û¸<ê1µØÉ–ÑEqx€»c]ÈCœ´PXXÞmS{Z(H«~f¯'i~h�3[å¸äñ?gS¹™iè®{GÏT}ÔÝ´Y �ßT¼šÚq#›aè8G; ¹C-³ž4×Ú@â"Egp+2Èù„ÇãJÓfx)Rlþ“ Iæ,€/;Á?!�{´Í°öÕS؈P$ZöÍÛzØ=¸—‘<‘ÃÉ�útlrJ‚¤wPt!ü4±í(rã�¬›–b&¯<(dKÄ�[ ½Vvðs#™VÝkº‡ã¸u3ŠÍéfÚ“"%nžyb½Í]ên^°EØD"TH2Jël’WŒ‚m3ÚvÂÚRtž’\5�C>†Ø•Ü´ðÂXw›ê03x‡¬'YÀà !¹C‚„IÄjÑ×ÊFvWÁ9)�bW¶[Y{E‚Ó J™téhØ!·Æ¢L§)4Û„ïùŸ>¹^ß°'mJ¶ ðBòÿ1ãlôÕ¿w“Ïí×kO�›tAÛ½Î&١Ësq«ÅnÓ-XpÙeovµŽãµW§1†…‰DW6¹“¦Ü™?ǼÌmÜn|+…µ‹ÆœÚV0¯,Ö=EÒU�w«%¯[>OCû9ôòtAŒ_Õ�Ö¸î»eºM9ÄB·&þ)bþ-¼Æ ü†† Cö&<Çk’i#^Ë[²hóá¾°jî‘éråW“@_†4¤dÍã‘£%ÕD$åT¼ *{,~0qáž"E’GÂSŒúŒ–Rú54~ßVÔ?)zœØÆF3ÔjÊ è3t�T?¬Ct”¢ hu.BªLäº6óƒÐ9â×ËÓƒ?1¸·éÏXYö‰Å'¬�ÞÊ*ór{ûuï»`(Œyy$c³¿Ö«šEÿ-ñ±³�ïK>ž;Q#%®fB„@ßjõ™?†å©XÅ{‹š7òîJ ÝÌÏ{x Vf0åD´|f‚õjBŽp8‚Ì[•-î+ï˜|(0Ÿ3¬RÆ£|…¹Æu«Ø#Ö}sŸ^1ÖRY7‚*áo\V©œZE¼gf¶Hß~ ð_�ß„AVÖö‚±bSP°b%bw¸éñ焎= [\z�——nj¹:¬º˜TY’Ö\.üþcõ™7íPã�Û#ž–RL¹D�»³*ƒF ùXí0ÇŒÖÂ[S>ÂÆ[UjË÷Ba–!‰ë*ƒKÙÆYåBŠ÷ ÝÆÒÕĘ Ä‘#Ѭn ÑÅáy}Ivs3‚t\º6ŒFhÁ*ZT¾÷•‘H–3Úö®©ÈÐ;î‚O�/Ë#k8²¶çÑÆÔkŸŒõ«EçE­‰e'“›Ý`¨¹ˆ_Ý8ž˜ŽË6ƒ¿]cvh \ÙÜtÎoyÞ@¡ót±8h/^YPÕe.N¶ºÞ­Dt"úú‰c�íapWÞ㧔ʄÙCñM)+ýmÇfžêȺX-é}U°à{ÇsÞ]“®Y¸ä«\[‘\{ï ='S‚ü*¹/»œ\0Á^RtwP2û U¶ó‰«J¢Žr®´C¼.Wt»ö–KÊÖÑDÕƒ£ž>ܬÞBKC�µ�nó¬ç¼pÅŸÅr½æÓnù�o€zˆžkŸÔ€8iŸr ‹�X™ç&6ÒÝx( eß§BX¶‰_mDõ|+Ï3znŞÌoA Ç%µËP;Ÿu†VŠÄd]ÙužÆ͵tûwxÃýÎǽÞÈjÖ"3¿Ž9è[¯r³¡²½î´|¬jú‰�,Á¶A¬‡¡bžú`8OGƒ/U�#GŽ8Óû>_~¾øi�µ—Îâ½0,LªH�¸ÆK[”øgè-Ø Ýnz—<Iú}O�ó¦¯Î7Æ`êéŽXê*lº§7žs�ÅË<2u`CîFO§îë$žæA!næ‚^‰ÛL&°„á‡[Òœš»$8c))V´÷8ùW†B¬¡‘ ù˶».‰€ö¼EXj5=Vî�»Êrò‰d$–Cæ›71 ’›Ã6uö>Ô®!1¢Ð�‚|aЌ֪<‹`P{Τ7´¶XšácF©tL{™Ê{NµäÛ+‹wi<8r ¦ˆ�8Þy�ÖRô[Q©‰8hÈ6ŒÖã‰~x.ËÝ vw…çr;^ƒ·ƒ"%UzöÇê¶;+íëã‹!@q{YeMØxDv+|¼àí€�xA:Í‚d)àPá‡1½Ú`m®Øéûîß�%´î[¢ƒÞ1!Ãp-Ÿn5Îí¡æ†ÿO�vÒT)"í|Š>¸õv«Þ•}ŒI)s\þ7ï ¹ÑÂMË 8ƒCq˜¹ÝC0¸²m|á¼kM&ñ€& �Zl´Ýz@£É:±3�ƒò m6ý0ð1Ð {ëaþÕ´|O}1+¶îö€»Û³Ì�–´Ù>,Ÿ}½ÈW9Ø×�¸ÌúsÓ‘ú'Ž׌cj{Ô[w£“³Mûé.9âÔB˜ ÞÜHn/"×7L[î0 <Äo£àÛâÀLú[mn/;À[ƒK¨\7¹ ëaE„»íi/æ˜V¼nòûWÛSÑùÀôq8'¾—î@Ó{!ªõð:U’²w˜øº¨ù9HZ~æô#—|yx—Q¾{Ð5˜­ò(ã‘?XÒv›o¾ŸTÊ_;tÎÇÜ�,!Ïqdا…,ÐM©«á¨c \—D¥/ÀöИ³}�Ónå¨1±ü@úÚg“Æ‹×Ðùž>Hä­q¦¢c:¹¸H¡"ûî2¸�ÏTs‘»“žXŽqÖû›ÎñWl8;[écëúÌԻⳲŸ¢!Ž«ÇGÔÎði͹¥¯@Îc»Ç³ó–ÇMWãAºüÉ?´Ï>î‘!;Ÿ´ \äï¢Ge¦†Ío<ðÒÇ‹’”fž],ey ý¥®¨h‹´ïS»Týà·(œ·�³rö{F¥è³E’R[£¼”£ÖBþÞa/Z¬;å?¯¶C¦ñG²°7>bÝ»».á´Ë�f,&Ap±]ò…‹îoj}âj•ÞMßvNík}fV <‡xcÐ%ØÂœv-ûŽd€IX�µšqx"à »Ë×±cuÔ‡@Ŭ“þ[þr%UV KÁí,–)ü|¸Noym¾ÁvSæ¤i‘°ÚÍû­„sRc«îÄáÔžN “/€µ‰Š�gg ©®â1�®„À´;: L;êàï“ J�D¨rúµšÚ¶Á‰�žçÎ÷k×Wœ¸„WÔ õg]ÏPù÷•cGoº‹ËöÙø]úŽZê†>qMÉÆj­Ïr ãX¥Ó9]%ÂQúYræ�§ép¡ðB›XIkY¬¯Ž€[ÚŸ¦c.OÕuUÁ¿ï¸YÌñÍ\Rn)g»ÐØŠåÊâ€ýß�Šºo ‹…=Ä'ØÚéÞáÙÖt8¤?“½�Xë»M%ýò÷nŒ Ò¾Ž„nþ½ÑNꔋÃ[ÏŠÖ Ã€g!£�Ý{ëöÅ|ÈÔ�¦ rÏk¨ðzâŸÃ>þ2µš8õ?hºˆìZ9¯¯áÐ7jâË:Ý€L/Éõ0µ°KgÖ·ŠU®šfŠè¦gER|E˜ÂÚÆ]}Í=¾ ïǽ¥jg“¨‚ÙÛg3çŒñ4À‹ëHY„Ë*ÜH†B-Ì1òB6©Žÿ&8€böI-‘Ò;¿ŠzÓÙMY@û±�¨4BqXc7j±…´&/qHœvŦÈm“9‡PñÔYùQ�ȆVW4ÜÉ”‡“OKoA>JÙÔ=ÇÇJ0³Ôfâ8Ã/6ãAühú©ÑŽ 8 kDËE¢àçÒ7 4ÍÌdh h�vé…‘†š°ðOÑ̦­[®¸9æã}á¿s:c½¥;9Ãϳù‘ŒqòýÁ´ú<-ðXÒ^¾‹¯l–�–¥â†]ñ:aÁ0þëj_dÕ Ãžž#PÅ T}/‹ÕÀy¾(`@ýÕiç/eG¨ú¦õ¢RõÈ�€ø¯m±þÃ�¾¤(¶^š9_4íÈø£Ð`€Û:öoŽ^Pl-‚ }ð4 OÁnéö™ÍA©Ìú{êš|\ƒO×#JÎVgDãžöÁò„P‰‚árȱDõ1·`3Ú–ñïר¼Ò,c8"Ë#y"öÒB=»âŠ6-eÅÞy{‹P6¯o»ƒÍ´¶ˆÞu5)r_k" Ôª¤91�P¦¹É?¹`¤‚¡pŠ( t5…CE¨—&zTµ—ºR YÈ æ>#ë~’Âb¬mhÜJ�ìg¹žýÎŽZ6†Àº‰ü4[SàcU°×˜ÇËV†UM{ã/!Fwí2ØY¾ù±®¦ý¯›Ð«�?Y1•#mg»w`mèÈÚJ1–î—AU0¹! ô®¡¢„¼4åó2B*¡&·£]NByžUÞ®Ó%Ï3¸ŒŽ~ƒÿSLšˆp!6Þö‹óa˜ˆÙvÑ{›$à×ÜoF èÜ¡íýÂÂ8!ë›åºš®pض£!3{gbÙò2`a�0Ñ8÷í?%,z¦b$ý§²#K Û¼Œg�îÇò'íjm“†ˆ9å ‚:�6Þ϶ùI~Çß1üÚ{ñú0תq\Hvǘq rÀrOwržPy+ë׳}«�@f\èó#®“Od¦ú¶ƒ¦æ9½S�ÑS“ÏŸ3Ùõ y“.µ�Ê{ á<©eÍ¥B-œœ¯COz€”;éÁÊuc—¥ìسŒÂ¦1¾\*Ülêšq$8°�Öñ¾XåUßb¡“áø&Å:UÕé†á‘­{w˜{R`§ê#.–ûŸjâQÂ$Præ`Ý÷‰VÞ÷nГw[V°(HºcuÕ?*³mäH0Wë¡ße”ßPÄÆ6gW� $âWßLP«=û`Þ&}�w²�‹ï›ÞÆ¢µ•¬/›w8á2ØÛûäkwÁe­¦y}TeË~{}X·¾™ã Ç>à‚ѱÀôáÙ!ù`ÒÐ{Oy£‘ E˜‡|8´²‰uÕ>óI4ùx˜Õ)¹gÏg¬7œdl6À§Þ&vè&wG]±ÐâJ뎜$Ù­p°o�q‚¶©ß�b§&=Ù�,ÞªlÕàÎëFÝÏ€û�ïc3ª dh ÄuÅ5VÚ`}i&·`¡;›Ç]¬Eã^ï'q] ‘¡Þ‹3h+Íñá1 ª²�Ôv·Ì  W:ïci{:hcÈS*d¶ðn]ý݃ô.¯Îr¬·+_Ç×P.Tí” ‡Z·ÓpbP3U}x+·$ÞÃë�¿Ánf¬ÃÁ‹+SêÙV?"½ì¬¦£ÝÌ9ŒâÄr4”¸Â;9xÏ1‡åª’XùòôÚ;4Ô…·ÝÜâÔA€NˆÃ-ÔâœêR ªÇgEtš ~c_iØÇê_£Œ=#Ó—€¢¤d†g˜6Þ¢è‚|Í}pÆ�}D€”ç²·Ï'‡?àšÍÙ8^X-Clj9çŽYóH>�Î�¥?`¸ù�²¼ë¥JVÊ[ ujSXŒ{�¸ŠpMw’­Ë¾>Šî&«d-c±¢‹­ÚgÅm>aãx´Q¨ç ¼_¯;ÐX\ŒVTZwˆ¹�ï gvI›{–¶n«z99!¬¹µµ@š(á ‡‡…õK<À Z]’Ü¢là¦/ ·¹»‘¬Ú{tuïsô¨ÝÚåZ…n3G[?×ÐdõŒÙl¬™i€v¸Ó²©b„ŒÄ ¯]é�Ü>ùÃæÀx8= ðˆò|IÊe±@™M…ûîaõ¶)b#Y3 ‰ƒA�mi ;¦k n÷u=-õuûûßÕ–NDçîN=ÞñÃwöå‘ý¬îü›ôÏ}½@Õ2ô'Y‚þßuÈ0ioëÆßk]Å0îXh¯`‡Ž¦:ýÈÅ7Bƒt;öñŽrÓw×Ë!�ƒ3ÅÀß¶lNÁÁ’²·¥Îº¾=…Ÿ€;ªuM%d‘)ð5Ø§Þ Ðïör¸«4 G·mÚÈý�¹2¹&å/Qž¶¨8׺õ.O’`/i5IÜt4é¡YèU¡XsÌ:þÕ‚z³ñ¿àXÜîTYK„Ťf\‚ó¦ºÓथ€æÜЪ#k¹?Ï•ÅÔ–7»Îóm�ªHõ\%h…›B¶Óùò:ºæW7DP.©"[Æ`=ÀKÖª{§XÇ.AÎp�2•+ß5­$Üq¼õ»— ä´:†í²‚•ï—S “ŽÂ{Nh¢˜4î[Z So…ÊÓl—‹±ʧ/Î-ÃX’ÑÁÏiKÑÙG²Á£fÈ{IC!V²‰ü\Á[z'D(•М.›¸ýrÔBê�Wñöé#d+(5ûÛ쟌ʼnnj3š•¸ƒ±Nws†_$n¢eìÍèÖ¹c*ö4„—æ-‘ÌÛ™ÑMË?ö‚À§.ml²ç—É †«Î r9n¤íôïVg«ñû‚ÍLâtûê¸UFM°¤œo Kð¾6ûaÀ—:JÞWyŸ Ž?¨X‡&q©”ön¯Î>knY´ìz:}a yÝÁPIû°“xÙ&¡Ð$OϺßÛÃ9ù�=ΪëüyÆb7jÿy}¦Ø7LƒxÐ@nh4÷ êʹÖ·uúÞ�0í~Êù0WZä#«ýçÐH3¯‘=ß{å1MnÿaàëÈaŒþ¿ŽGÛP~2^õœ^Ö¿7�‡&¥ßÞ]¤=þà`kæ›ÇÄ@?‹Œ^Xëh>.Ï8xÕÌ#îþ Ì¦`¤Ý�Æä� •Y1…ðe“¾ïL—¿§jÞQá/n„u»ør•�¿5YN±âßRl� »™ãýƉÈgèêÖ0Ápe×ÏÄÀ o¤t ÇɼâCìl0Å ›ú˜4ûçÔNâ%·ÍpÛBùæÞ!ö9‚K*]þ¯±fë‰EÄŒD¬_f:Ÿ@”ØÕ!£{vN'µ îcPB¯mõð\.¬Ùû½:ÛðCâ8[žØ5þ‘Áü} �JöÒM±ÐwõZf™.Ôš‹ÛÂ:�+ÜÃ…ÓçV¼Ö’p÷ÌáÕªlìhx§ù ê-¾²ßo‰§Ÿ+W9}ýçB¾s� Wsøññ}µ¿Y”Èl†@òÞõÖÌßKd©6&ûn�¯ ãÀ\® ݵµƒ¹Ñðó.=™ã;[îÓÝB‚¶æ¦Öìåo¢{ ]:%‚ÎÓ!ï—)¾ýaÏ—ºã¬Û‚œúuó?‘\¤ƒK%»˜Ý…ñõä Ÿ²ï'Y(f­D*ÇX/Œ™µ÷ŸÈuà7,šî¯În9çïaì%ÖH-{n»Gœ[Ë“‰†À×k L+Ã,dÏý«¨á³|Y²{•þØ*Á2l­—ÃtÃQ{öÖLƒ Žà¾\@u þy 1�:–$¼ê²WâÜLøãýp\ãœÙ¦ùn[Ô!™äèÁ#�ä¬2Q³\2Y”ö�õW|‘\;xÁ¡ ØbêÙGbUÙÛ@,ˆ=wìëX`Ö•Oè§ã‡wÁMcA§„‘ë?}«©b�nçk§kœHâcˆ(XÅf)ìd¯àA0nébaÐc`vQ"¹p(é‚W|¸5ç†4¡d {YÝ´RPÊ{ޤöF/¶ÛŽÎ±ç­ˆ­¦$p»´+ôwìßXÃËš/éÝ߉7&ÀÐxs×4¢ûuÁÏØD¶Ø�ßžËà0—‘âÜ<)Íi⣱ÌHŠÁ�àã’ð4Ü¡¦•-¥‘I/jϾµ"°È†9±`;y{å°ï-c}¢û†Òƒé42EŸös< œõŽÖÚS$Ø@SMœ$± ßùOLV7EH¬!X@&w€ú^éu-‰µúº&mè±I©931öß,êòcS¬:pÂËk@YŠ¡\‡êÏh|òµÀ#~f3Á߯dÝ vŸjïÛæëtÝ–m¼ˆ†U•" •±f{fé©õ›îæÝjûÔä�Сh/i¹˜~±äˆ*lV®©4�IÐ{'ï¬å Ïñä\'ê\ ƒT…÷}Ž“ÛgȾÿBŽ|+sÖíb.E•Л•ô„¼�&÷ÌÄaoÀû ò©Çï2{à6Ìè5\µúIQïòkSª#ýìÉÐú/ @{u&VòxÐXþöÒ˜ªº£*ùä{nì/ŸEÞôö§“àaž68}ú" úp³ßMtÉïãÆ¢N]ƒ�°r¶„øÅo]æ´�®­èU�’·{š*Š1ÁÞ%Ào W-kÖw”ìÑÆqˆLŽy€¢g3µ¿-µD Ð>té�#°a§ÚÐWÔõ {NÌ䧯}ö]¤Ï“t]–#†¦²¥f¸ZÓ øRï~©!XÉ­ø°Êno]xïY&êÈ_@¶s©]%°h7ÅÉ’â†;½WÈÁ ”›ÞvÈ?CG-ÎP)ıSj 1Œ§@Ð�¢ízAÜÆ>ó^¨pQ&s}˜#cøZ³²ŠyÁÚðëGgñ °Û†N7fÜzåkÂa9<`ß{(r|\½ƒÔI}£¯§<ÓÆ×Š‚èdÌm“âæò]�kqWã#ˆ´íÅ!ã׉0~õt˜2Rü˜ †aÅ àg¬¸…&z«IÛùf€¨ ƳÛàþ\8Æ,²=±ÀÕ�Fñ¯\åëÁo‡—à†9fÕ7Ílð¦—'œ$íͤ�[ä,ëVóIäJÌ( *aâæjñÍ>0‹’ýhÉyÞI1Äç5�S©LÿfbÂÑ™›Ô7 ØÜ¿ÖÉD Ø4ÎÙÚ-…õ”“LŽÁ㋹2½®ì2 Ó|§QÏÛŠLÑ’¼ñœÎÛüXõíå?ÌñíJåþ{÷—ûVñ^a�9¦y-¼xqHDŸ®õòÖ¼µY]cÈÝ.JúÚºácT ÌQ,ã�¸RbÊÞ(«¿¶¨Íršã–wuã°î\r½ï»£˜Ÿ-Úö|ó×äãV ^²¿ì3Š Õ’ˆMôgóØ+×!”‘ˆ¡Ù\…³Á~¸ S‘¥› §Þ×ÁuD+•µ*‚Ó3YºhØhþÌÌŽƒÂb¦8[ÞOFÙm¾-ЈÑÝwœ¾®W&ÛjXBÀP- bîo­¸ÓÞ¶®º–R8ÜØ?vµDÀº£K¡åG¸Í]û>ݯЙÅã>È|²ö9k_–áÀN²¸NåÛ;BjS«Æü¸= ‹í—è²ÓºaãW‰[&0u8l…®žFR C1« x´¯§ µþºŠêp1Üë+;×íz"p�ðôp�žÝg¸o\,{tÎú�+cøô>´hÕµ(Ó¤tõùæ³£¾CA^yTTI¯Œñê?-Ãè•DX3×–qëk=:b".*W*0õ»©¸{°îXXBu¾-c�;iÁâ[òùÝ+™'Wã±ü;gg›÷�€áÑquF¢'Ö>z¹ ójê¥s<ø»ûx×fú¶E›Ñ�{MÈx @”*òSn¿6cƒðšÚ8WXï+55‡º†0÷û!¾Ko`ü,«JW7*ÏäBÒ=Å�ÞœM’ºÍ¢ìtì'sÜ4PÝÒ–Rf|f>žpìPdM—8³þŒc÷ÊÈï6úÄØýb^ÀåÜ6Ê7sÎèõÔîNú=÷ éÉišÝNÌÈWâ­Ýt‡òRïm;ù“z+ãèÛo#rïÐQ® XCqž¬ZÍ[0ž±Àò­ß™Ôï¾Ègl‘7ì#Øó„¶+Ú«Üsú†ýÔm¦–Êð¬�‹a‘ø\Tbs” ÃC|««¤h:+aOOBáaMþ)ãþÚçQ ù-mNלyø¥¸’¦™`ã°\ƒæsùì§D DL1V¢íì=ØÚ³6õÆÓÔ;âuGÞt­wgÜÙ J,æé<Ø¢?–]˜SAÛÆ>³}=Ý9Ë„§ 9åírÈy�jîàU^Q¥·Ö9øëI íÓɶ;»F³3­ð wÁi"%ݹq4ãCà®IN9ŸÓ-ßugÝñ[_d¾¿»¾›jܪó‘âÕh†-º mQÄ$¤øæÑgY„}kê h=üÂC†fŒ^vú’µ7ÅŒ©¿�'õÆ(Ÿ ª[ ¿oÊ5²Á«Ž®ÕT¨_ž¥Ë^Æm…ìÕ´-¹Ìå ŒTuÇÙ~·€±ÅYrºŽ,eŒ£¡ZŽH—²²{é¬Znѧ¨��»‘x)˜°ßÞ²k>†iïai\9°„ý†l¿pe³œß€q›aõ Þ•�¹dóu¡ø- °È¥æyú<°Òh¢ÓÂpÝÜ*5›Ö�}bÒj¨s£Ûéâ {´*à‡iñW6ï˜fvR æCØÎaJZ%—8?ÙÝ´>ŒÊx3Ñ+[|®øN{ V"ŽÊEa»"cÓ=kŒÏR8Â3œÖ ‘o©Gn>ùv(Âðáó›•ÑÂsOZÑ«F)w*E W奬Mž)ü,™\¡e§—!‹9¹40+˜y¬¨ÎFyÒØ.¬«ÄŠ×èp¿²Ôf‹qLÑ;­YÈ$[K�@ºˆã)’9³$&s¨G’޶±Ji«`õµ[õÛ�äàÛÒ¼±ìÙ±ï¬×¯Õ‡ yOÞ[ã¼áí{ÙDn§¨—Öä{ä\z—ž™¬}Ð:æ¢ÞbJ-þl(×sÍ{ê_¦ð5�aÝ9¿Ï½ÎJò'+Jà®·[v�Æã$aÉÃf ˜Í±hcããpô*Õtw'<ßë¦%½bÝÛâçun s˜§v’°a$x D]A¿ÓÞÉÙÝŸ3¸èaùr¹ê™ƒEdB9ÜÈj¼›ƒ¾ìüÁÛÕ‚.õ›ß­£Ð}å.Ê9Ø\kš†ÙÌ>uØÑyya}ศ(5®ß¹Þ ¬+¡hvMKêÌ$³ ÆeÑÁ×^°00ã“lŽS×cÇ"ÛÐìÜ)림•f‘UåâÍæP¾kVØMóqÛ±ƒ5 ¶ýåg]ùn¹“^”ÜïÜ™ s×ÝŸéÓaóè8ïÏå¿»´¸¨ÞYx5M˜OÎ_XÀÔW3[|]ü‰_t�—»\,n)ýë¼X¬-‹U@Èá-Mé$ãë6?°üâЇ»Xl|{œxâ½åäC<óqÑH‡w#D 4�…éEœ}sšåÐ,\¿�̺ó–|�+Þ_ß sªñoçÑÎpÚ¸V­eãk¼Áî­òcwNþÅ£XÌþjËpr ó2Á�yî²×™óæðöýç¯)ÙÎ㨨¬"X¡¸R~È«+æ­«"¥ÖØ pM…NÚ’:Ï{>ç<”å±~Ìw$¼ÀòD$¦—7¸|–Ç&‘PBnB!Éð4ñ±Eú±¡‘¡-}:Å E:e¹&õn©‡·’÷‰°clŒ¹9òÛ�ã‘æ�G[_sw©z?ËԑЭ¬{w¢.ܳRbÞ\°i¸è /±=8”�êȵKƒÜÀ‡5.C˜ Ó~·ÃuÒ씵Çv¼D×¶­€Œ�7c{aΪvõ:Ô�X¶áG~ä%IÀu‚x öc „µ7Ãã×B$pÎ S-ÆÙoÜß­ Æú…ÝÖ(óÝŶôû}3�VjæaV±÷«#Ü8j6MÓVLA óò{Õîã–pñ o[²e=Ï/hFJ߯€qÄÂCtÅ ØÃL¬\)Ÿ©ÏMÇô@U©ñ؆ŒÌÅ;èË ÐVðáGaÚ‹¤«ç\âŸkŽ3�–pŒ¬•ó¾¡ýHÍ[ßå´÷€2‰ý¢ëïÄ“V:äéa¤_Eþ½Ç6¹ÜîÔÅÖWf?·WšýÕû ü§m#]çq8@�>R:Øsò6-Vµêå‘a²êQ¦½—–µ{)®ä ~W‡è®�L,˜Ì"f^ª1¢�8d-ø‰Q«±Q²‚‡Ï½„÷“ŒÈpÒû°ãœùóÆÞïrù»ÓÔœcP|µ/Ã;ìà[æ~zQJ‰æÁsÖ¾c^œà±ÖC–ÊýH°ÇwôNðØOä°¶=suêöàš)Z—=ä˜^m Ød8_møçÍîlã¬.¶½}¥-À'_N3ôo~Šü?¾šNõJÆ=¥Ö®Z.ÞÒP]˸ý‘ oâD@ìl~]NËË/q®5j;™›Á/ÖZ—Æ~ÉdºmÁQ0:fPÇì� ŠÞn)«fÓ[b¼£„ïÐ6´mëJzË­H£Yܘ;Š_£ö¾ 2›�q ŠÃ³PyxL¨=‹Ï®]A§«ÓÎp«ž7w”ü°¡Ek¶~ã|?„ukñÞøG¡Æ>Cb¬¡Ü/=tAÇÙûotðߟõºͦÇCŠååC—² º”–ù(ä:ýáµzörh¤Ogìp*ÑÓ­V2òÜe_Oˆ˜ÝvÆy¶�ÛI©•÷>›»©=Í Ãƒ”ÊAc ö±ó>ål˜7ˆTqhXM}¿�çíð{k Ií3{®Ã²'ŸÔ܃ä 'œ´ý< WºÑ·|YyrÅB,ÝÄ´í–t-g˜ïDn4ÕP¥ƒh‹¾5ÿ‚D,BX¥ü@“rAr›0BzRà’›"XˆÄ³mµo÷7ñ¯ûÿÙþŸ}_Ý¢˜Â± ‚ @$‚@![GÖ¶ûGíž<6ÐD_E ãYÈ› „NoíËçõ±,5Ûmé°~Šýî{KVÏ„æQ|×µfg5eò“`ˆ^³u97¥P ?=•sʑ∵� F´Ðy¼òÈ4jòkÜæžkåEŽÿ=®ÓŸ±¼ Gû2kïO­Ž\ ´c[ó×xΧù„@ˆ×7:µ«èO_A7 ’R¦:ëqþÃx“ëHBc�HÛZs ûÕ™®¤ @¢ZWI©\MêÛ-޽J˜ÇzF 8mè,ÚXäšeC*¡ž6Д�ÄYZ¤Ãï²M›vsË&­B§jU@/ïš Âöt7Ã6A‹R6+ªAeݨÚÆ ç’¿YÀ;Õö;P¶WÑÏ â«³éÞøCŒ›h‰+LÂßgŽ pÔ¯Éòíqh3pÈ;Õˆ|<<…^姯:Yúh@V슅íÍø._4fv¼Îëʨ€ò$† ÓÜ属M…UHK¡§ïÔm_7ŒÀP“𳿒‹PwiÖpPVª²ºÊ¾îuM&gKs-`²“ਠ=;ͨaÎs˜¡:Â"¬ï·ÔrÉd"‡yՑòy)룫=Ít®¬È¼§�$ΦÏòÞôÎ`êÑKúÃ�*Œ.‹+xÄ"Þ͂ӊãÒêN´óÊDu·åŒ›„ÊÛP›[ê©… ¬1!}�"ž;i¤¥Þ™·EBSePÄÎ¥S‘±K“ ©w6Uˆ¾N©•Ä—T®å»ØS�áÛ�Â×¶!Gn¡sZôD¸WjÛÜÌP;‚[±�†ÉÀü^O°¤L¥€ÏãUmBPŽƒoR¶) µeÔµ—vsÖ:¶^¸ö–q‹bI­Ý,µÚ�~Ë­ÐÕ� ûÌÏV'ós†wº~QqçH½®^±Ùßõų~œYí¬Æ|ê�µVv5¬t¯m=Ô˜ ô��bUqfÎÓ“]C¡Ýï)\9EØk9~»f?²xL äýĶœ +?¨ž¢­]÷`ϵËw+o(;4º[ìÒ¬ÝÔà‰m œô†-Óß`ËÓ=aï•&æé¬ÚäùÞ¼ÄOWÎ0�¥0–-›Ù™ò»b›�“Íia_Äܦ„¶$¦Å¼l£³â´{Í€,gF`âÓ5«þå£ñÑZâzS—Åß×ÇP#ª™¸s¨Ê ‰%¶�vø~Ã=ƒÄÖÆ7Wê àå>ßÉޚϔ·,¥Sæϧq[.4{ïsªOZüõçu+fÖ×wøÓî\Pg|g,Ì:ùj`-¡�TY/›HaîìŸqá WwÌ.$Äï©î¸‘›0ÓÀë¹gî¾ízçß#j4�¦±×0S÷r�F ¾{eü«�.~Ø>âx�V8�´Ôk÷�ƒkö:ƒ»  nèø®‘³êýòQ«¼e;»¸V…lB )Â5Ð\vw@DË NF+÷{U–KÖÑÄ'¥ðƒÌ÷ÇL2¹È‹~[�4 "sâÒ÷6ùøjc_*œ¦ú,ËrÊØíµ#÷Cgcá†æû'ÛØ�Êé:žo\ÇÇõç¢�sb¦Bj�Ž0‡ÆS#üM{äîÎÎð¼0ÉuLá÷&g·Ñ ¾…;®9[ÈIàýÓ>ÛçS¸¦UDÅ™ÜþÀÛxpµ�°�o¦Í@ƒ¬L�Ècî¬i-�,‹IéÌ6Á Lr @§œÈ‘n›²“˜7ð’”\~É¥e“GpIÍØ‚{/ŽËÊ3‹sœoF‘ó š“È}.a®Ž­ktí‚ =‡”ÜV1ÆÝ+°÷�w ;A_ŠÙg‹XÀ±4Ÿ�hj(~¶û«ý¬ÉÙ~ ”Ùoƒã/¥ Ûíuvtº“i¢ç¤1×åO½òåLãæýc–£äÛNã¨À_¸Â�y}ÎpËnµ5Í}iuWºú~ö0Á%Ú™û™Èì+I2>è¥ùàû­8ç}“mÀËW a ö4ît„WÚAô3f8·�’u¸ÈWÖ ûi ô! v…A�É"9×*ã+L5ë¾W9ÝóÚ™ž@@|[�¬Ý£‰{·o):h²MîüùõÕÆÃÉ 45bN[alòƒúCló{Ù�»±¯†ózÝ0Áä„�Vémfo'D(­[Ù:/Qmeûôú8[×%g8%“¹9;ªjûך%’0(uN‡ :–‚wq(N£j/ÉE8r¿ßÙû»Á—÷/é‡_»´zmÇmnÿ¡ŠÖÐhÏ£Q[ WFˆ‘GR.ËQ=¾Õ@~2\ÜìÿÔç œT àÔ4œŠ>Ê"X õt’H¢ƒ& õ?’Jþƒ€âžf2¿[Ñu =ÆEný|š^5û^ÁdS%½{~ ”y p™4øZH«‘ n6Ø!Íì¾K¶ N7ëÌ”Œµlé£ã<Þ s‘åÀ¬É¹j¾A5ë.ÃÜ=CÏqq®Ptµ�Ë[4Œ¬ k” à±¼%ve‡�6i‡eüü¾£4K«g2¨ÈfvKhÛ8YYÇ€õ·Èë² ¡õ¹ê?¯Ž‡ƒï“ þ/J_ ;µäp—ÄlZã‹ô÷^ä¬ ŒÂ�pNý�۳ͅ�´Q K½ìç—¿{ã¡Æ�TF³GÂéË«4©kž…ZËm£dr´ÇXW¬ׂ6xÛ bñÒìï2�€7Íùºò`5rÏÁå,¾ ×igæ¡ÄL¼%Ó†áh8¦¢Úü×·â†ÇÑŸ3862«³cäŸsLù‡x?½º‘ñ'®G�ëâõòC/[•åÐuÊ,½.ųëÙ/¼Ä ïøæ[ۻ݄�Ô0 ¤V»eè›ËmÚrpôé>lÜ¢iÀ\*¹É ÊØk‡šÉ�× #Å7£¸fýÀâ± Ô†­lLfÔ/I•>ø\O‚œÈúæJº6†~à‚ÿQG*ðP „!7\¨´)j+•wņ,Â"ÏÀùþœN+öð†{Ji¶žû´á©M)gk�Ò‘ÍxÍ9qG …¡&”0ïlÝÿw]Æ|>jØ|h¢ƒ½ n�]5œ�öiÍÌ&{•�Òe 3ŽB–Ý.5\Õ¹DöÙðn e#pÇ0ϨÓÝqNѺ,côa*‰¯3ªÞˆñ~�èlõÒkœ�ó.Ä;¾ ç³s Ëô1 ¼»È/ãÓ×Í}´ Æ0šÌtwrŒ€l™öÕ³±‡ñXÙR,r`³öNû´¯#ë¥ÃpæR7êu/ó�`\³0׫d).oÃ�´ºOYµŒ)S6-Égô¯†¬cV9€·h¯†ÀQ@ Ý—{%ŒëôíÝiGޤp>¾ Q½Ä­ô÷ƒôŽ=ù¯OÛêåÇ4ù£�XlŠ#å—Uc8‡z‰ãI¤©-–;Ôñn5>æš}lôPƬÐbyȦ 1¶]Mím²çÄTû¾��’&q+ ÂK�ͤ�ž×Ý�\}GÈýÀkA[Kh}&`þ*õlª‚0}%l6ù°�iïI éAÜWÆb7\èP¸úbÙØr„MÏÙP¾=z�3Úaƒ¦ž/&àmŒ7NnúÏí3÷Qçº"†ªgÄaùÁ¢‡§jËp×SÑaYñ®e�úÜ„ žl±#;Û /–ã©äâ²±¹‹Œþ6¢ÚÝŒ…’ »Ðun!»}ÇlýêL¿ ³çN\´ñ“Œ~�RdoÄ=g 2Ú*LL¡ÅIDõw©ˆbG¯E�åZª#º·¬ÜóuYò4¨9.,4±·#I˜ÀÅÃå‹ß´ •ÄæŸÜ85Šh)‰phQ…2'»wÀxÍÓKŒg$¶ÀqU§l˜X3n0FA?n#¤£ÈvA[ºëiâ]˜ �µ�H¶>v„õgÞ׿W Ñ�KE}¥¦/¢éG ÁåöÆ# lu‹ yüogÒÐ[±? Þ¤˜âÖú DïÛbv苌®³�ëp˸̇Èý‡3qu'ßµÀ‘[íšÈû²d„"Û]Cr­En×UzÒÁ‘nê=5ÈLϺÒòbê åÌ›çÊL¹¼P7¬�tµ¾ú£ÎW²Ø%Ô€8‰È¦.IsÝ.¡ ;ïµ�dúw©æ£ �Úôc¾7‹qü!ÄïìJ^1t` å¯Î­�BÉmƯÕpé˜õ�«x_ž;÷i(äC[{ rIÞºò·‚ÉT¨{§ØkÞÌdá·¿‹ èèíÁò½ö_¶ò1O@¥Ëq{4àM®Há�îîÃNVàc6£ÝójtcgÂvrÔ ‚Θi¹¥ÈÝ|K*ì£#˜"Ê·Cìë;U’¦^lÖ“pÑ '´üü8âŸG¼ô8m…xNϘçÞ:ÇT—%SãŹ· Ê¢ùYBnÝõÚ°�Œv´�V§ ݸûÌ·ÆŸŸ6!ânŸ4ÓlÜn 6ëãµ`^'«ðƒ"þy É>JãàÅ£0Û2‘:ÇnÅv`¶A.ÿ‡�|°ƒð›Ó†yÛ}õÛ®Aýr{°�<<¼½¦ÜÖH*éùU)ÈÑú7à ÁÕ³ÎS›aÌ>iëƒwDý“gÞjÎj¤Of• úýõJ»· W {OHñŽÆc×ß•5®Æ�8Òr.…í cY(ˆúÀÊç_´ì÷Q‹k}‡Î2`œÅ´ ,v|ðC#kð2Cm±`Y‚rgíþxú˜˜3ósv‘¡ŒüQ!¥æ-šE”^jYÝl:Kµ}}6¤<#|áRC_+§EoÌaIé='BlöY í¨6Ø^ùÉpðº‚åˆÓVs§8°,]–Úf!,h-õ#¢ÜäÿY¤XpN¦ðpó‡€ ÂØk:ñƒuš2�÷hÓNš¯ËWÊ‘žlÿkDþ‰ÅØ �Òü]²–ÑpV�ñÙÈ`Œ†)“#%dJ Â�‡›+LpV³hó|$öý´¤î³o«Ž~�9|T)÷:‡ØÂ_áˇ+©¤þ¨Ð µŒ#ùöÀö—#CèÞ×TÛ¿÷OÃÎaG_KvŸgÇÈž�y}HÝŽ—-G­\ qƒÞíôPØÀ‚_Rùò±½†� |°)îäöÉ4Ò/êÄ!•û+Ö̤ x¦/ÛxaÛ íŸTÅø ¶Ê]ÕG8É™ò½nTLÃÌyÞmísîß‘¬öp/›GHõ£.mÎúÇjÃE;€ØC 82KµŠšÿmÛÓñj˨xáÅ^mß4gâ׺W¾ïPÃK:¿„­QÝ�s’1x�·Gï#ÓÈk÷5[X"é-J¿¢M×]ü|¼J�Z´Ù8ÇíÆŠ¶Ðãv½LÞ¾ò«UÖî¥ iŒS¼X|q6øS½å3Ë:_ØÝmWHù¢ÃÃ0%lªv#õ|Ûb£%®Ph¿(Í·Ètsõù[챆ÃlBÍ0Ÿ”©÷fà.|¶ˆ)ów3b|àú¥çY¶íÓúÇ}Èë0÷”h%>ê, pÈÙH!Ïc˜Eˆ›ò­~§S!� ÔìŒns}6w�T®êt�„ïK³§‘ztœQV˨N΄~ð-þ7Ôé3ÜðJô¦è´}ñÇœªýš¶�í·{/j{ºßГ“b9×ìò' ]@C%põfãV™´ªð5°ï µ‰ûwÓýŸ¨ÚAíÕÞOÖ/½×ß?8NöÄ>Áþš·¯Bè=E»5ü{=“º4‹hI�Ò½¢øŠÙ:œîå€_­uú2â?��^RA  ˇ<ó Ó½{•pòá. 9ûëж3àZ¹E¯tFZŒc¡ärdå–ÞažS Ôðèÿ^ÜѪ?ªÏpxË/jÙw�…;J£ˆ¹&ôD"JÿÂDýQ5µÚÛ^¶Ò³ZÓZÊÖ´ªµú¶×þf(+$Êk,bK@ŽkëÀÿÿþÿÿüqcÇCåT”‘Q¨PU¨�J…ªª%J ¡*ª )(HRQ*� D »éõ]ݳ¬Û®.·M‰‘Ê®ÚÛ(ZÍ�ÚÄmÛw`×p €P†Ã¹Äø€@   @õ¥Póxà€R€‚*�@@ T¤€@  $•$¨(•*%D€€÷¨Š!QGÛ;`Pr©-²ÞóÃÔ ¥P–­Y)((•T"ªmm IIZÅ@U™¥J²­lÒ„" ‚‘¶Ú lÔ…$ѪŠ�"ËJT†Øˆ*Q)I J­™óœÀº€“m­}ΊR„Ž™«V’QED¢ª (*ª½¶ÆªHöÕE fØe¶¨‰U+TÑU)jfA!B•E$%$¢¡BbÄ!JT¡D‰‘U¬¥*™B«Àžæ@%T*¤Q ‚J•*›mb¨ªšÑ¢%¬ˆ€•™… ”¶Ö« t ’EQ©u¶Ù�*]»�E#X¤•T*€$›bª¤T¤ ¢�ªª…$$AIIURU›)$µ•Hí®¶X)ÈQ$ŠŠ!T@¡*¥RŠEm¥šÑíÐ(«µ 2 )­*Km¶m¦]wA ;dA%(PªPUQBêÚª‰ª4m–¶€j…¶ZÐP©PÚI+!a’¢R­2II±¥"UJ­j vj‰Ë¬%*RŸ ÝšhB¤¥@PªU U¬•T‰5©ZÒUZF)›`¥)"…I° ¡T$’D A²�¶ªfÑJªR’ ¥UTªI³lÂSm"�¢EJ^çu+c¨¤¶h’¨BJ¡)-©›[ ´Õ a!&Ú(”*‘"…eˆ*„ÙF6ÐB %k(ÛA‰CclÊYIH(ª„5l�¬ÈZJR*„UJ¥Hªô[¸"¥M�%(‚ª¥)* !R( ‚©sµÖÔ% Q£@¢*ˆ¤ "B’A³PR©IU%T©¶R‘RU­J• ™¤†ªEC0ÔI(T¢%QPªVÚ­�*¨’ ‚¨ ªQ*Š¢‰!ªAR÷t:àHË­íáëݪNgvévwnkºº×näÉq!UZîãU¶UB’ Q,ÃSBX©i‰TJ‚„‘PÙª¢¡%lÖµ!Bföw ²Ò¤"]¹„‹m²ÙT•S­ïs¬µURT«5FiJ”–Ù]qÆ•µeŒ %JŠ�ÜÀèR…Q‰ƒa’ªP@’‰A£R¡J¢ P+ZPQ¬¨¥%P* � ƒl5[Q‰"¢¥Q)•JQ@Ø–¶­$©-i(¡B"¨‹Y‚ª* R ’¥UkJ´³K6• ÓP J•(T“T2”›;�Ò%*¤¤DI%TIEB„)HªEEµiH!DÐÒP’QY ¨TŠ+A¢^½\Õª2e¶`�fÂ%U ¢B©+®‹²ªT¥!¶Yšˆ¥RAD S±ª¥%Gm!ETŠ 4�(•U Ô¨ Q[+ �b—Z¢ªŠ%BH±¶l¤¦±fÔwgE)T¤‚ªUu¨©) uª {Œt©JÙ¦ÍHTIJ�@•KY!T-š HÛf*¢DUEI ‰Uª¶Ð“2±%*UR‰0Š iZÂU*fJJUTe­UQ•U(ÈfÍP ªE"B–L®¹:ª6À-h*)PJ¥X­¨D­¶µUJ¥Zj‘¶ˆ­1B€»j@¢…È5µ¦ÑKjiEU)›"T ª*’T«V¶(¥<6º4¢¥•A›@°ogvèeÛi¥J©BJI"�+mhÐ …ISßTÿh"E4G¨È"§á  ”¤I2Ÿ¥F€ EOÀ)UMíTõ2h©øI¥*�Õ?TÐP0ÓÉ$„È ª*~§¡#È�S4ÓLz¤”¦ˆ*y6©£Ôm@õ ƒ hôŸ÷Ïø“þ¿ê̤ÿáÿíׇûÿëÕ¯ý!½»üïpè°¦ðßûu§yÔñÿiÉÛ·9:Ùíg±ÎýOþ¡ÛžÝ^ÞÜ,ŽtêÈpúxwzMF{äa9Ç¢w—¹Ê÷íïë×Z úÖš4364 ŬÈ.ƒøƒMw¨CX£2•HÏnïsǵ½v{^óÏO¶Éï'jç ÃÉ'ƒ0ë�<öÐö:ïëÇo]§o>¯&Ê_ ™!ÞrÛåöïã»âõ¾{lìÎý®Wמo™"f:®ì²BûÎݬ޽=ûä�“-ñ]1šI�éÌÎßÇZ¹­·â×ìÚüj·•Ÿþ/ü®Ý3ÿ>ôöçÙþ׫×w;º.n>tS®Ö â"AŠD4eQ1ÊK„¼î›‘¸R]Móçßzî¼yç®ðÔ�Dˆ„)E*Ý´±w;¸de}szWœÀ/wKò¶ßÕ^ÚÛZ¯÷ZÓ[k_­µ³k[jü¶¶š­­o÷Z¶ÙVÛ] É%€BŒÊ$ÉABi(ŒYHRÂC h1�!”’1²2DdÈ ÀÆÆB"1‘¤&)•‰1¨¢$Ù"–ÛY›[KZ•jjµ5VjÖU­›Yµª•µ­$ †E,@™ Å4PTl Hˆ‰Fˆ¦�RFHH,JR(b¦5Ufªj­•j¥­¬Ú­¯ÕµiµUÖÖ­2ÕVšÚš¶¥·kvÚµ®ÙjÛfÖÛíµµ»koýv¶[V·«mSUªZ·Ö­¶kZ®­¶¬µkJ­²ÛTÕV¾ÚªîcQbŒk/1QFŒZ(¬F cHcQ¨’ ¬˜ÚHŒmÅŠ")µiV×[SZÚ›[W­vÛ-­í­»mmíµ´•kÕvµm½m^Ú®ÖÛ[ÚÚ›UMí†a*C!1e%I`±£%¤‚(ØÆÁ’-Љ�Pj*J–Q�ˆ2PU$E$‘i‰)(1EE!¢��ˆ4j0Ph‘‰Š™Q„£TlÌH�“^«Uu²«mùmZöøl…�HQ±a$¢Å’LZ"5Ñ$†H¡&5V©Ú™A‰¢˜Y&f€C2ÉBQ 2cM##̆”ĈƀЙ4HĆ,h Ø‘51!BQ"õ­kz­SÎbä]s·MÝ�wuç:;d£Wnî�Ý·;®é ¸»·H±wnæN»péÝÔ»±\¹F定).n‡3¹9·(ä;ƒ\’JäPwt·f¹³¹Ó¥Ý¸î£œ‹t¹s»®êèź]»‹tåË¢K‹·.‘\á®\ ÇnéÜs®Ó¹Û‹¹8黺7(+�Ý�¸Îèá®VèœÉs¥»»®ã;«‘º‰…Î&æ—tîÜwbÅs»Œ–ëœRiÝFºî¹ræ4F.Iä];®·JuÖ s±st;—nîå;ŠåèíÝw¹vç$ÑÈè»·5Ýq;¢‹¤ç5µªmørŽä)!Ò໫‰ÝÛsuÝ�!Ò·;±×rçst3rvw"ç—uÜæQ˪7.Žî„n:]º]×]¥ÈÝ.\è¦çNë“»9ÔíÒì�tî¹×v].(¤nº¹Í×.›»;®ë§s·Í¥.çnÅÜë¸\×K Ü¹;¹�×\ÇBã®1wsj«¸Æ� a2cR!)“«j¡æêw\�ÇNã{ÕăΒE—� ·—J]çaçEXÜÑçyÅÅ3(­¶Â,eXÒ$«"½ïw£¨Hw]%»»šsµÏwy:㜘Q¢yr¹íÜS�Ë–KÎ…LÉ�Ó¯z¹¹ºAyÇ»ÞâŽtwz÷�šEçuܱ—8nîäîóÊ󮎹Ú%ÎQœ�9Ç.në±ãÞž·#wsŽ»+œ®sºêéï^÷.åÕÎ\®vî¸ÉÝ•¤[�µ´0€6ÙD*�­) ÎzbܰÎtÄ!°çh‘¬j’µhH±k D¡Va€Å×,3ÅR¡åŠ5ç s¸¯'º÷vˆ˜’cë¢9�ÕÊîîë·"uÍçfî‹¢÷½¹yrwD=Ût½ÝLåÜ»ÎîåîŒ\ï[VÞß©™ š%Œ‰F‚ÆFLLØ�“E€JPD4Š„¤”b ÃP(&bfbD…00�)K™„ÈB™„ „šS$‘%0‹)€h)"‰0À¦(“ ÄS]îûÒãrõέç9P2±Ì ¦IIhÊŽ5«J²@ܯ5Êæït{»;½ÞÞMŽ{Þ¸’S‰X‹()2ZÄÎc¦ä½Õæå^kÈw; ¼ñ–V`@%q,¶•‰’™VFLW)i*Á†Re2ÚÖ5WzëÒ×=—½îóÜ÷{*Û]«YVÕ¸³`ŒF‘&F 4�(„&›vÒ�a&™]Ò;8÷WK›ÝïkÍw½èÒzUòºo”õÖç—.n}î 7˜5Ù¼ÜûºB¾o7+Ì|¹r®o»½Ý®0AË @’™nRF´Ä”,¶�%£ M1l2ÚÆ]×Ã"Ao�¾íÍ|�ŽOöùr�DKRk›£DÛ˜Ë-””�Ö:åæ÷vº{»ÝÔ±½+½Þzî×–®îm+2i™ºä¦fÖR“)…t“v”&h†&Žía€ÖK¬¢mí½õïb×›”dϾ½á9ܸŒûÑ\/5ËéÄŸ8¯½×’ôê¹;¬Ww]×_wòŽÉ÷rMÝuç+žïx‹k˜>ëçÛG5ò1îw•áw]Gͺ÷W$Ææù¾õß$]Ñˇ Ïorwtråó† ¼®o—_>õÂÉ¢ŽW{ÝÛï¯/•óåòòó)$ÒSI6k"J²Œµ Óu2R:¤ƒºm&�Á­×bÓDÓ13sŸ{µîíåá^E{»A®Wßt¤ÍM\šÙ%)˜�uÀ–Œšeµ²™¤”ÓL�Ö Ò’—ŽD’”še$š›fë vík‘mž;³ë«ÈÞnw»{}îMoÖÚ«¶«óU{[UͰM6¬å̘¹®EB;®d")ÎîêÆÔçd�FˆÜŠå¹“±©.nwvܺhÐk»´d’-ÍÊ�Üeʹ�ˆ¨®kvjs”nçk¥ÍÀ—uÌ&¢Š�Öæ�ÔlîaŠÑ·9Š#sjåwqØ%Ý»š;#» Ö]Õ¢8CwÝÙ.iÕp6ås»®jæ"Ü죚(®îÓœY ¬\£šH��Ýtºêîv5ré Ñ.kuÛ»»W.î�ÝÎÜî]‹nšék”ncI\Ñ®[œw[˜¢¨‹œÒllmråÃss�¶´ÛkMmµÛkkš«RaˆÌ¤IHÉP‚ÒH¢Q�d‰ JJ4s�–BaÉw;£˜Üæ”ÄÎwt]9£S®£;· vîFw\êíÐnM̺uÝ×Ir¸‰üíkm«þªÙVµ«6ª›meµ­SUimZVÕªšµµj¿áµkj-�c2ªH£Qµ*Ö•¶–µ¥jÖË[]ª´Õµ[u­µ³m¶–Õª–Ö¥VÖZÚͶªºÚÕ¶š¶ÚËVÚ³Zª¶Í¶­SV¯ëþýþþ›u×s·ŽnuÓ;¦é�ÀwNŽ·N™wq×%×K™Çns®Äîæ; “"Fîwtºå×s�ÎíÙvë®—s—q.»®îç;¹rç0®ŽîÃ�'.gcuÛ¹uÜJîâNwC»£t袎Dcƒ€f$Ÿÿý'ïwÿÏë?¯†æ &ÁR  ŸcÚQü?XØÿÒò_‚ÿ…ÿÙ3ÿ ?ãcØ÷üHû>¯üûeü?Ø‘ËJ°ö|Z°*Vù‰ûMn·Q�”¿÷~Fgãù´à�œ‹›ˆi <b�áƒöÚß6¾„r (Ù¾RK ¼®îK~™òß2Ïd1[ÁryQ¦Çý�œIkÂ}dD×6l¶¹Èi°Û_q ²L°÷{MF.ÖÆ¨/]½ïì¥ÚX²HÕ5Ͱk Ý.j92š`ï:Q÷¬Xž�=��ª'Ð�Wk ì>Í –±æaX­ßßý@”úçi°â,¦#ùºÌ<¥ÍÜ#Z”À_Q¤ºûØãÔµ p.wgsx(>’T‹¡ÿšYnL'ið’S’ÿ�Qôž¥­¥ õ½å¾z„9Çò½Jšð£‚÷¥Ï$R¥žáÜx!«ÆŽÜ¿&ôâûÜÞ^‘þ¡ÿò¾»VÿÉ"9åݯ‰'3,(Àqá�æÄŸÃlÖ`]=NU¼ÕR´›ÝüÃãûËÈÅÒËc܉6ù ŒÛtÙÉ‚Ì}¸w�`ú ŠžOY³L»åZ,1\åðÚ˜OÒC.Çw²ê7Á§ÐŒ:�&•Ä`¾êñ²-'þE"oî`ˆ o¡Á3_ÿq™——ÐäýÚD'ø&¡¬n0ÙÌmü§šeŽ|:*ÄZ#òð•:ºP³ZY'_fÐ s™œ5Ì9F^ö¢¶)C$;Û Ö,D5 U ¨˲ÍX°mþPWÀÔe­TÅHæó€lDÞj×c‘š‚á­œ’qm8›Êo`í³O§ÅçüÏRrZ{^ŠýŒšÍÛAþ®XuÊz¯¸X>Mz=ʳâøêê0¹É³û‹Ž°9”Zˆ-´Y©$ñ–´_üW�#©M‡9Îå5GUIŒ“QCþ~iTeN:¬uKU¨°wM†�ñô�@˜%yIEÿ‡õ*¶XJ �Ë�À†²vêæ;—åòRƒ?ˆ�M¥ÛæYúçª:øÕïþ#Xþ‘)0ú$Pï‚y²Ù+~ž/ûš)j}ì‡{Á‰ØðØîÑFä –ò#òt¦ÊÜ�QK_¢EpA¤#”¸›9Á²dcs7âõ´M«Vùµ Á™ ù£xˆ6âéAdÔVµ.ϸ¤ã�Ÿ¨‹hfµžQ©»;3p¶¿­¨1H3Šûˆü<É©Ü?ðØ5hËhêJ“ŧBüÝ@æ �¯Ë2•­\ÌA­ 4Ì[ôšNéZ�‰éY&Ç¥¹ë¶8)³š»b·Nê†Ê¾g†cÏA~™£Ï±AâÈ»ó �±W›Ñýi¼ë‚WüD±ŽQà1Å|ÓAñ¿ÙšcþÑ'¸×évÇü°á•b=7]£†< Ä-€¾ßžl‚;@º m´›NÞ*¡…”¿¦– ú¿ðÐr-Ac,¥t¨š®ßüùþ¶Ù¡…/ôÕlÏý�š`ï·J {Ù6ûX,î“ÎcõNÈs{“8w’m›f‘ÂÕ¥µ¼:%+Ò´ûR¨T@Æ‘ûža“熺%"2zX5aʾÀû”M¼MæŠóD„=7nÀ¯b�óïQ[ùÓD±\iÖ¥Õ÷ßg·Ý©gï÷0ÉÚ^4Rl¹hÏgy)¹ï"6¤·Ûãr‘²Sói{—')�~;u-¶ÐÙX³g0Ù«ü²¤}pqÜ#Æ#ØMÖBÖá#l¬h7¶�uÎÄ6Ú‰·—}o_ìŽØaïëA .«ܯX�ê�ùƒó4 Ô”Ò“»Ô� â ƒ1`Ò…LéC¯Š YÿìÁ–ì7“~êH;(zVo°.�:¹½kÉ¥*Yžáï×û¥»ø¥Ý[‹¥½ÂŒë¡HïjÜ�ã ~!Ê�‘u}®M†Þ—hµ�²õBö°òU ßNö²àø†|¸ÓR\�Lf÷½b0wÙ²o¨¹´;©þñw‚’|÷fÑJyþ_¶’ëý�Ï�¸ÄîãwúìÈ5tå:¿jßv÷�¶B A3ý ¡†lr¾ÚÙÏ4JT®VÖ~a:º†@B¿XÆÕû[�]8qõ„„áÄk3þ!§ù*/|³‰ç™éä«âob‹?òöoè�™Ôt¾%o¾¸ôS£oÜdHͼô'B1�]k?ï‘ÂJÌé¶3³ÚäŒuW›¯ØÎÝa6ÖRãW‘¾E“/µ[óˆ‚ÃMèÁa™¶ý©ž 5!÷K�$Æ�àÉCÛØµ³µÎIQ#Ó ®ßšÿM…µQg¶ß.?÷‹¶µ�´»üè·ÌR�¤-u[kyûk‚ ØNˆékˆ/é¼ÿ�{wfV#ÏtWÓ‰»}v/ÑiVO2ļe³…±ÿÐÿoϸ\%ü>«3m¼Ë Ep®H¨öpüR¿ÚYµ¹ùbŽ£„¹ê¾Þ.øQÅ×Òo ´ÓÖå&®N" Eaèøù6|mèÿÌaÛ#IQuÉ+þ¤ÚÂØ¸¨PJ”(�¤GíØé·¬„ã‚Aeÿμ´Ñ|¿·†²¾VŒ8RÙ(“G@‘à_μ!¨ Öu�‹-„8->v1¡2mLmøî÷+,¶–Á“Óñ…ôß̧—–­Tæ&ϦözðÛ™ÿp‡›³­S¢rpâŒÐÃêÝW‡` ;�·¯ Ö4¡¬EŸ›‚©„³\ÛlûxÁ[ô«ë|ͳÊOìlí?ëK^Q$ðĉ~EÎ'ÛQcs3¿ƒRÉÁÇ:› VTIµT¯n>ß­»8ÐA(á¨çÂ;FZ S!¡änCYµ¸šÏ?(�À{mos®Ë3`yÚ\J›ît*„álf;j¶(%±È˜Nô¹ë¨Ù¯ÙY§#‹£JâX´ÜQ‡Z*¹Òƪ †AIî]�î5dÑH…@ýN[lÁÔü‡ÖÉ•ü?ŠÍàÒUá™SR ‹'æç9Ì��s(ŽžôŒáõjŒ1u5„:Íî¢4cÊxÆÐç`ØÆPsH¿v÷Õ•:J04î¦�uR(È …Áèå²Ù?,ë¢ÇËÖµþt¿±…Ð2a ¥2ßG›3 §Œ]¯p2¤x¿|\]B…Љã-&«œbG?;þ_SŸ­ªÅüÅââ¢ç�ÂrÍÖÉgIX‡A‹>¦³hM�¿›Éô RÿeÅäU¶haÅ@#Jºéüð°º'4/Ñ^^íï˜ñÔ*× 6ß8…lOýaD*Léô±�IZˆÈѤc)QãÒ.eWÏïŠÄ8f·ñ¦[y#sý*¿æ±â-jle±nßj� Åio+ês-êíרº Û‹|OÖ²Û%J$ØuÛh÷œ¤òã]]V)mMÆ10N>šôtûö £@è!ÿs¶í+MYhÑïÃÂO#beá'`:Á›Ú“úEI¹Î÷fªçÅ�¡ßXÍÏ��=¸*±9z¹bzïòA) ëXpl²ÌÖ …ÆÞ0¼XÒÕÎç¹RÒ1q5uEÛYU %›´ŽËO©X�Ó&J7Qu6n{©lqL1 *èH)šï>8ßÄLã8Ê ,žãC•}a%Äpƒx‹ »Ã©è×hm·LdJíFÂVÈê ÅÞ‹:Æ a$€W¦Ï8<Â*ËoB¿«Œ_ ¨VÀÆ„Ù%É…žZú[vaí(�R˜:Çw@ŒÛw”ÙDŒÙsû\œ�õ,´øAû€Ô/ÜèZB÷¸k˜‘M‡Ï 9ƒßrJ'�s:¿õs!TStó–ÄFÿ�ß‘ƒå,ЙGß< ¾Ñ–¬á³W'P¦Y%Ó]'Ú2(i`ý=JKH�¤ �v¢çKPécˆoV±F.P’qŠž4¶™4}ª{á!ÂoQH2C5ÛÒì)Çú¨áž2lwdÜ…}(Á;6ø$èlfáÜ£&–ª8œæ%#vk?¹«,ZbDveµ^$tñ=G%2¨l‘÷èYEÏÎaCµx0;4Å•*;ØÏ8„Ÿ‹¿¦Ž¨½HdÖ°N\$9–Ý~Êb2�‘»�1Öùýœ*8C}ìÈa㦎£[¤¶³Y+Á,g$WÄßãÔøî°o­ÿ»kh9š"Ô ÞÎìçRÌ V¨ÿÑ[£uö'DWY8S•l&SÓø…qD‚£—åìøq_1r 'Û…ƒöÒÈû½Í€Á“Iý:yî Hñg†Þª%7shVYtÙ8°cÛ$Ú:l-õßÅ8¶ ƒ_…=i,¾®ýTi&ËYG€|+œ;ÀÕr´~˜_Ú)¸ "þ$ˆÂþ¸½Õd]šï:Ôo-Å»_Ç>�LÃâB«f>1œ>÷ѲŽ1-tÚé¼ oDôdÙ =eÞµ•gcÜå^s£NC>F×Ô0Šxlíü�ÚU~^?$-ˆËE?�Z´©Q@¨QÏÌÑàÕÍÙ�Û©±áHœ¨×QÏv~U_Od5;"ƒÿiÊS"MþÄÝËÖ}ùÜéžd_º§5³ž8$®§„sÜÛU<'µšGÆjìAöó›æãÿ�Eÿ&sU|‡µ!XÔI )æ¹5šCã˜!e~œÃ¯†{:{QöÜŠ¹U‹?5q\…Üu†@M• äÕ[Èì太 tQ�6{ºåV§Å¸^l›2[ó^:8ü¯ï)ZbÞ¨—£,^,C’ÑE²:—»ŠÕÔ†©oÝÀü¼¢¾¹„¿[ ü�©gõÓ1Nµ* ÕßÈÈAš%WUɶ3wãË:(V”â¬xmù�¢Ôcïáåõî·ˆ#¯¶ã¦1 ¢%é˜<ýÞÚŽ° híÏþжX¼ÍéL=˜ÍÍ·oã•<§úöú$háÌäSôX`TƒLW~œe÷¨ÀZ÷«ºdXÖ ÷Eº‡džlq±€ýÞÆK7ì]÷ñÉïk]雤¯dãæÛ}LÀƒ5­¢T¶ãV ó!9tÞ£iðîRÛË-Fñp.’=,àhkÈlwÜžIe'¦õ)Ü ZZ÷ßjÇħÆ¢XK†$øíÛ\ž³.y„–� Ñùl_�±©æ(ê/} Z¤àÜ´ÉA�YýIœœìXÂæ ÿ§ú§ÿoÏüÿØ Ñt|ׄLÿÉE�«r%1Õ'OûçŠA‘(Lˆ óÎæá?ôWˆvD÷ä¿ ;îZŸËÆ£>Kn§�äÿäíIJÌÿ9�¿ïýþè(Ûr$‹b½ð¬†áÙ0àßôD#¶’÷I¿Ÿ/âF©éœªÛýê%ë>ñIiùÚöf· §[-FßÇ VÌúj=:xeñAi«mú(éëž—¯cH„]Þ±L5 Ó¯•„uHoËSø^I~´#¯i×¹‚±s»œ§'¹ŠšÜ]åýCÈnv»c‹œòÞ°Z‰ rT'B7ÖVGRnƒˆZZžÈºYTµ7A±€ß€‚gMÄ¡UbrLÆ)JØå®�Zç¸rïÍÕ¯Dì%Ö;\YÁ8¬£I�ÛN ¤Â-nåó.®‹ˆ«vºr�ßZ¥òùTœ›hwqÔŸ>À_½Æå(Ö]ÔxMñf‰µ¨»#½1Ë+uøÄ]>N³` ·ÉtÙ_‡®!ÚÉï9µ z0$oDËZU;ë�Ž\Ÿç±ˆQÉ 2>Vág¼>&Õè éåm>�ëjkS¤˜‚Ï\ÄU^š´Ì¿Ï-¿qä푯ñ4;ΕVêØâÔmþÐUzøn纾­&ô‚pçW'ŠM`ÑtcA�~Õ-š„~qüj:W½y Ê+q�] ô÷;ø·o.½w Oe/i¹~íì&€(‚ ¡â8gGA1§¼ÇN‹Ûе�;5m5†fc4¥¹"¨3KÎ!K1œ]¶a:yÂËë\9Ô}ž{êu&g>u*3šzogR”§©›ø×„P:ñ qmí˱®ôÑA·\kÄVð>x/ŒÊcôa_gAïš):3Ôyécoò#¬»í£¦JYE¶Ÿ* -›ÂZŸ/£ŸG͉íJE—�}F9¤¼©ôC?~¨ÁW¤ÄJÐøòÇe.çÖªÃ�cÉ}Û¿�'šizi�&mÊGYisrèàÎIè„¿›?ךvióáƒìÉ AŸwü¶Y e¿ºŠ7§!¯ë¾ô¤³€A�«Éj.w׿‰…'©„#AFç ΃OP¬L+FÓÏõa»ŠÿbÁ�Æ×AØõ¼Ú_?”:ß¹ ©Z¿À_ ¼K\üÐ$ìʹ¬Aâéo²k 7Y‰6üê3ùM qqkÿâ¼±�›~Wkv—ÎêÇ´�Ÿ{±p æóúî¦ÆÞQà è Ñ´{BÒtY—“”‡4X%Ø×ŒDç¨ÕÇÌð´ƒ×¡,#aï¹Y>°ÿ&ÿVç;Ë—ÌẠ匈bf¾hæE[ó¦#»á‚9•[ý£’::¶³øÇ¥¬‚†%¡.Ö±ÛÎ =(êS¨'½»ñî�ç«U^Ú�r‚¬®„^®ÂÅwYs,ÝЛ¢m=GÅ]‘|aóÜž�§Á p²ã†a­8mw³³ƒWÐ×Úæ2g=ÒX´Þ¿ÎÚÚ#ÓäÌ®¸ŽkŸ †‰{Sû£êÑ B[;P9±YçÒí{¡fvÝ@»¥à×s(àˆ®WcfÈAjô½úá�›f7ΑÎG~Áù¯z‚òCþÔjú Ÿ¨ŠX´%ëŸtêÛ•Þ >©aƒâ=Ø™HS˜Pƒ“á>Ëw�j;§m›¤F¢ËMßÏC¶¬7~žéóæVU®.ä{‡:e`ùJVs(µºØÊc¦aìŠP‡Þ©^$|&6þ),Ɍ͗%¬à¿5©È ?|4}‰¼F}¶sK,,X„5õß‚ÐÛîlVBO]FìÇÞ˜±zùJ¬¿bÕ”OúîŸk;¯FYŽÃʹ Txy÷Hî™~¤:7Ù]§x¿=®jÀ–B�úë£v.­„±…E,wiS.ø¨D&7��-ä©×ý§agF—u…Éaß ã„œÿ…eèrèâw~µÜ1ùŽåÙ„ñ ‰¸z§_©s$Š?)oxïP`çd(×§|‰yØÓ-yrgF~¹ì[]£ésçE|}ˆ ´ýd,s[IøÏÏTtw½»3©ÔWLA¬`ïo[x}$ý¯o`EСJûÂ:µÓìíÉ;±Ãbïl�÷ÆÄ;1oNFÃ}°ÃšC¼R²âÐ[rElÏÛ’2év ´Q�d¡wÏ«€¹Ò$!²^!?ÐÊ—ØT/÷‰›Ÿ/þÙ¼œpΚwü+œß?n™¹Jý:ÒëT„vßíˆU5¥É¸6‹�þGe­MîËgBL˜r×¢ –­äŽŸœ®ß'¡_@ ý_^%$VeÏÇJüGÊF8ùÇ�h]²_¸>„ÝmÀg#É‰Ó +}æ2eIrHh�±qX˜ñŠ€áû7x›–NË rïÏ¢¢ÍØ.�úÃñ¼fìoÉý-�¨Í{VŠ´/u¦?¾~³-Ãìq«mK t:©(G]5˜îyiÊ«uê¾r œûΜ·mï?e9Ž“EÌ4éèÍõZC—CÅ×™nS1<÷bpàuF4 :öAì¡‘±O.¢²á8^Šþ–awƒ];L+⮸D§¢P-óA›ã‚¢(k²Ü§mí¯‹‰ŒdÖÒBDÜ6S 7µ9ñËM±¹ÅÀâ[äzlÙò€�µÕëXeà‹J¹öÛJ½a?¼¦äË;±÷¤È0 iˆ‹;ßç¿=ë\ðéÚ\êÝWˆåa=§´Ç|Ú..4æß­SÃÐ×âQ�ò#j¨9WæÞÇ÷ÊÁ�ƒ]’Ëu¸`dLº¾05稫Žlxþ'úi÷¨¤“& éa¿Ñ;pˆ{ȱ»—‡ !�«×<3»FÁ9=Lsúä`ûçO¡Ò/VWÞœµÍ{mí)œ‡uc<è %ÝO4ñ¹Õ/¦ìK•'\îEdk1<¹Ýúȵ°ÝãÈXtn†g$ŽûÑøÎ¡¦ãß2ÖwH˜�NZê ëÒònœù¶ÂU§ðÍß&_‚°–_Ðöê›·æñºîøZCäÙ†ÂeI²êجå~“g×ÎLgи‚7±%'̱epp„¡ÿ‰Êm…kÓ54`{™­Ù_çö·Íý¼ÁÓßvÝ«+u£;(C²ƒŸCV«Sú5ý3€þXÝtŸõžR7Â4[/Zw¯æ9fZ‘—MP¾ÌÒì2zé1¹Æ ’¦e»ÔÝ!8›ÇX‰õ¬íunŸ ÒË”¬µþcêÔqí+Kö5qªOùo³@é^ÿøúuÓ[W± ‚ÁNÆûtj÷ì -SEO4è²ôŸiÓQl…ø8Û1›œ,ûÓ¾Ú9SÌgo�»`-–Š6Âë ä½?ËÊêØþ;·pÙÆZ!#ƒìë­æ€ÁtnCúlÃ}·^ÿÇ3cõM¼+¹ÿe¥/ “9£g]rŒ� €îz7ßcìB¦ÝóíØ~|›ôN'GàÙ³˜?ŠÇß‹¸àŠ£4òCØg@åð%nØhìåoÚ´CÞ#Ôø¸éެ÷ t§Üˉ�3 í`Ç þîuÐ÷8üÂqóv�½7±�[atZ*â�g˜÷_‹;•4÷:‘k\I‰Ñš  qY·ŸQq"t:`>mw¹šsPâ¡ÕMÙÁ`Ù’@~lÛZµP„BÑñ6a{ò6U‰Tt'Øk *ÆïÁ¸ëÃË„1iò‰©Yä_çN‘YÑ3šT®Çkb£åòøÓ¤xçàÕ&Êü(_štCç�‹I•'iMýÅ mï³Äagü^` /but � -š “rúzŒ•gÝ™T\'z´™ï˜�ÆîÀ§ r�ǾìûRK`›ä[Ôø™oóù÷õ¿¿»ÛÇ¿®ÞÂ}C$BC0À „cA$‰`(2SJ™"†K)X±††"‹FYˆÐYaIAŒ‰€$2Q�˜ ¡(ÌH‘4‰lI %‰J !�(!˜’ÊJ3FÆ™’ &ÅC3#"&AKC3!É LÁÉ i„‘0’ˆÒQ!$h2€Ø,D€!1‰$ÉÄ&c)bfiJ³&H ‰š„�’`‹“DYÈf‘ŠBHÉ1,c#E&e!$"DE e(LCJ0P’†’M¤£CŠ„²HÃaB�L²QJE3XP‘�YLˆLÐ%¦IDHcF™(1Dhˆ2�HDYH˜@”…�ÄHR"E�‘)BY!…HÀ©3 %“3a1fD�Œ†dš2I† ÐBH’ "LÊ–2FŒŒ2I’(’dÉ0™ �Æ$ˆI!”A˜2DQ2hdÆ#Pš&F™�LÓ$0£LŒ(#I”CJL€$� $TÃS,‰†b�!˜%‰&JY$©ƒ1”l�¤3bÈ& d�™61 Q$‘DHY"ÆÒl�i(Œ™š4¤–)‰5„ ’ Ò"I2d¥$ÌŒ12ÄHÔ&JHY!²™¢Š( "&fL$Êj6!0È!bK&RHd’ Q3ˆI’E“ &”H�`†M1�,Œ…¦£d$ $j( DÄ”Y’D‘ ’ibb3ILÆÆ $ ÁÆ4ˆ£I’&J‚ÉŠŒ„È –2ˆ ƒM"ÑÑ”™©‘DcE0fb‚S1�‚@,�"&†e†�ŒÒH –I0¡’d’A(cE%&0RL%e &PE$B$‰%&0†Ša£ Ãe ™# ѨPÐÄ”€…2"BD!Rà “D”‘Š Hi’’ 26&0$Bˆ’Œ$¤BAhB$H 2ɦf $0fEF5!ŒÃHš5¨г)D�0H˜²3$È‘ÁMˆˆ¢ ¦”aI �%ÉdɈh‰(ÈBP’!‰*"I dH‚ŠL˜H3D‘HˆÂ01HIÔÓ1™¤D€4BŒR!FBfˆfPÄ„šXÒÀ³ $‘’EBÄ„2dD†$d!“ Ã"QE‚M�†1 “&L@™�…˜3K ˆŒAbD1¢ÄŠ"M&F¤b„¤S0‘3 !!"!¨0Q4ÐhRA)€f)6c(‹ ,� )@j ,”Q‹F"”�ecPÌL&@Q†a�bM2“dĉ 21$)”Œ4‚™ †$1¤˜(¢¢Æ! H@ŠdH$0À¤‘X !�0DFˆ2DE2Š@ÐÐ(&$EˆÔ32’ JLi@‰#$ɤ‹2R˜¤ÄF™˜LÄ”F‚ ÆDÉFFPˆ� ˆ$š 0¢@"XŒ“$ÈЙ4�dØ‚0a‘@"" "‚"ò­:�à;V)�³| ÎOÔÅ}«Í¡Õ/t*úKNVtƃóK> I¹yI6釕cz0§”éÏ÷ˆ:8jŸ(ûmCa‚<2hßh®ÄÚà%kÌÐÿ0RZãçY›D8!ÓÃ=émX%/i¹[F7RVRf–eÍÁq¼ñ#)Ö’_Ô•�¨‹>p™Æ›…ÀÁ£ž?ˆûý˜PíþuãùÿgêżMúÒ|ï<õ`|&ø°ô"¼¬(/ß²0øÆ;áÚ{ú¡ªðäùÍ–‡jÜVßI;U –ÓàÊþ–‚Z0#`Ù†ìdúú9'̵íÚ d?|þsõÐcø’øë¶}ÿs›¿_JëáBiâ›ÅF VÃͨó>{O¼„w ´q[žPii þ}'¢=éº`Ùü%|~•BÐ…�|ý[ûU”?b^ãö.ÜøhÊì´¿1‹:¼ùšxY[�ø¿Î²lÞï¶ö ’ˆïý>éˆÏ} lE¶�ØèêõAC>‹þîq=ž’<ü¦u�ñXïÇR|;q³Êc�?….ÿaëNv ¾·èÅüêôüX‡}PøvÍ¿ÕãŸçmª,&ýp¼¢3o?¹Ç�æU«PàýM]‡7›‡v�Ñþ6‚l^YS®HËŸã9er4�N�d¼ßPâ)èô,ž ¼úäv<ã¯KÈ7tß?ÞcÞþ0åž8lÞ™Af•ùd„tî¸ç‡Ï¾:cŽs“LÆ´÷ÎäØ)FSõÜ?a]C¬gù¶¬M5"=WühŸÍ¯ÖeÔŠãøïm9=œQC•é+Û_ÛR¶o’‚m—¯ ˜yXI¥^™ÆT³poáÃñÏ“âMž]ñL2/¤Å|IÚÄußö–•Òˆ1¿ô]kEžFÎâˆ?þÌO¼Ã(‰X™ðæ;p3)Ãc�éhnlà¦6㣈æÑe×ГPy9ð\ñeù 9–—½=<ä¤ò}Û®YÀqž/}TB³>y)Gï]^ut»#á¡O)¹oÏh[Œ™¬à`A Ê~ãºÉôœ€\¸.Ö÷á_[vU}mè�MuUíž± FâÇOµ“ùçTíÔæ8¯êס «¦§ˆ Óº4Ø$ vC¡;Nc#sQ›§&ñY~"L~]p™³X¡Êöª­šÒn‚?¦¿Y½ä&‹'ü(d :û‰göúe}óØ[p³˜ Ý[™otÔöÿ_:ëí¸—NÒÒ+ÏmñvÚ `;|sFSé¿U†´ ™DÄ9v¦È{Ýùñë³¥–’§\â!Þ~K7�`§©U>΄¤þ¶æÓL­ñ‡#N®Ýé?�câ$û�‰ƒ O'÷)ÃJ†Xf.Ó0䳪">" 1ÄôñxµÄø·‹°úÇ0퀛àÐCÑ&ÙÀÒ½¢ÌÞüo™tœôW± ³ƒºs`bfcà 2}9Vw•Ôr�˜‚…Â%`-¹„úº½2KçœîÃu¿¶šK»è[ÓR[Àý�â�ûCq]¨)9ìm††bX¥SíÙ>ç—z¼½2›ðIŠR?{…9ƒyêÆï)Öï€ÞþöÖ:Ô¾5¸zßô¦M\難ø½¾vv*¸ÛÞé¿hæ}\VáÅYÇÑ1û+z<±·õëVU0d„Ì¥6°jÂÖ×ñ¯å´š³Âˆum¹äÛ{Ó©ÊõDþϨ0ìžBgL*îg�ãJ¼Yúküå[ìÄÐúúpaM¿ž J¦Ýÿ 6Ÿ½;øžÃöú¢.§KTÈr‰ó-úöŒ´«ÿN\ésW�¼�‹ûôiÐúÔ鲤Ó×ÞsÙÿ+ÃX;{ß¾º’å¡LNr‰'İçy~U˜¿Ñßó�ýõÖŽŽãC,m�ÐðÝñÃâæônap”Š¸Æ•“#ÒÄÑÚ’i™Ów+µoé7i˜i}f¤ñ?&¡. ÷«÷®s ^&0XHoÁ…ÍÉS�Ýbèuó¬¦ñ�‹ë«ÿ7ÓMz^ûCxN”» ê�Ýâ@ÝiOEæ‹„�{ÑÙ|™u;ÛÀÔ*û /¤ 0¸.¤°´/‚[çL¹› ‚Ø3~)×8ŒòÃÄßž.¶Æëmkº¾$ÜÖ›�lÊåøî¯dÖ_”(yÃïYµœyu§ nÉ&›&æ9wD@^8#ßQü¸Ö;N’1Æ·qè8�Y€< æ5g_7Ö^ðp£â8âŠaFÒ€Rjàѽl¡ªÑ«Öyc8xKjêÞI8ê¦ jJ¡nXd¾s†.:Íz”Õï¾”´&>r‡,$lº5›|V²À=Ðg}äÎéå¡O[@ož>`2¡†Í�ÐÿE³Æ#ïÇȽ³Ãœñ¯ æ[ëÙÏ˶.'|ë£ß¾˜x·êeÍ8—EQmñ  âGYR¶VÏ2k9"Ì®ã#yÛ¾_‘½]Ým:˵›Ž»X~‹Ðæ˜e²w¯•§ˆZs¸çÞ›hxlKrÓë"ذż8Ìå'Ž‹yŸÝ çÍMcÀ¥%fQ¶¼…°É¥YÖã.d¦\Ù¦l{î¬:u­ 0Üá‹F.%Õ(’ùßW´ ™¼?‰„âž:>�[póD“¬¼°³Ósg¾2#Çœ×ÙôíæóÛûƒ»Ù½cj‡{6#m»AÄ ðã奵1¬¸ˆ7#Úb˜l·h¹ !:8æbò­ ‡„¯r^Ôóx0Ì�|kDÌÌ»«Oó….m¤[Ø�†£z0Œ÷'ÏæÒ˜`CãO·8d0Kºúìù̳¬ÚÇ t Ñ»¬"Û||$Z‡�ÏeŽÛQ 'Å’2jM‘wÇÏݳå;wÒ ßÃ/ Ë3¬úª,.Ǹ2fÃ{»�anVèþå0³þÓÃsaõŸn‹šõmWÓ$¤Ò;˜}ã¼Ñs2Ôi$,OÒ¯DZc¥É‡¸›BÿIDQΛ;[Û æ.YAµ˜ŸÏŒcR‡=êVÍ߸ÑF›$N…;ƒuÅîK�…è{A·= ZLw&H²±‹FfòwH#AûçP‹|si¼ÂŒ mãjkA÷sùXZJŽãU)àü§�gß÷¤�›Çunzå«7—L{™X+oÙÆ­ªÈ«7óUÛÚñ7â®…–�»A=•››lüsÇ:ñìùø÷O]99× «ælŽm;8á@0ëå$ÝR'``3ƒ– ŽPe‹ë $ìÿƒÔí×nê«þÊQ¿´»ºJ�j•èâG×?8›ƒùp·ýgÁý�YZGõ¼eÇWLE~ßõ13w|^x*óÕí,é_úLÆÙw‡HÍè?[Ë«{ʰÅM­“¸Ñ�>�ÊNÛ8B8Ã;‰‚¯à^{9,ðxg ®ªs|Áe½B°¯8îýc+ëWúõÝRzå'^žJY«l»:ÂØDm¨Qí*ó·'וY»w„%æ)d¦�}Þ‘=m—÷ß$Š;«+–´I‹Ð5¶.ÏXYw$ùËÆ�Ãáa„h俆mS¤s÷éͽy¯“¯–xÏ•$í³køÿQ*C¾¾¯Ê–oñ¦OíeWígÓ*^Û�‚w1ÂpWÇ6½— ŒãGIàÚja­-¥wÿ0@‚ÏéœÚûð-+ J�ÆÂ¢4ÃQíèúe/|áåÃcÜ`ÌŸ@�PK¡4Z9`I®ˆ5î£ Ô{§Û®6çÔõ�6îm”Ê÷äBØ`œ"äƒ`Ûo'Ïlª­C]ôyLÌ'ÜÈ̲õq8i³ÓÇÚù�ÊÇ´î”}3Øíîo•&ÑèÊ$ÕB``ÚÁ�ÏfçÄ]ë%pºæ½Ó·Ëƨñ¶$'lÎ?ß¡ž™`l}ãSj�tÉö!!hÄ}ð¥a"™„g-õQ°" NÓ<6zâÁM¥+îü´eý­äÜùeû„Ú—¯�i6Ç«¿¤¦s8¹5üäÌ”_Íë »ŠU˦KÕžð­*ÉWÐX*o™0#U?ÛK+Fè"(GVÓ�F/̱7{›c`tm!\q½;ïñ€Çr8²§�è÷Ýb±¬º›ëš�zl|füæ{ûf8D¼‰üò=Ì¿±ñyùÄY;�ÐЮ.ùrA¼1Ü�·X-á!ùÃÔ€5¯J¡vHξiKsÒ�j)s�6™K"„�Ax:|ÝüÒÔÖÞ¶ÀòÙu(FÊãé'~™·¾ùWâ µ}éÔñ]Ésw+¼åpŸí¾\+ �‚eÓˆ]úmÞÑZÕ³lïÚ:Ÿxƒáõ±¬…IÌj/¯­kè�_áϾJ ô)_³æõé?‹ÛUØ”�2ýï–©Ëôûhg÷ôq¸ºžÝ5„ŒÃƒ3ý9Ç“‹£m<²¼I˜JÞí¸‡ŽA;AJ¢]s†1ÆÉ#d²®:bKOž¡‹Éж?–Ô¢Ù¶{dE¢S\ÒâÚlF‘>Ÿa”ßÍÛÆ‰.f×ƱMKõ²ÏóÖáÝyÚSù°‡eåægÃ)H§®±È�çú÷Ê{ïgJéù?¾´=í½u¯3’Ÿü4¨ì/öyÛþ{;Y•cÛ¢Eh~‡pv, + Ò´@�Y�÷(”l.ž‹/˜¨p­Ìì²mâìÎ"*fë0–�¥qÇÁe#Ó8³Ýù¾àZœ&ó˜Ÿß� Wœ×pxâ57»’ƒBêæ«"ÅÉ {óŠVg&1…KVá-§k­ O ¤šFÄB5KüÌ"KG º²}x»b –ŽƒT‹ ¥ˆß×ú¿âáp· Žzfj ¼a¸½úü*âzbƒXVzüny%ÆØÕ›g*uf&ÙEƒáF$ö´,ÿ-ß—0¬gîE£ÙÀf½:ùãÙ²i¤yp­5Ì^ÖxÊñ×|•Úuûdë¶Är²‰aÌiõœzî‹.¯tqߦpÀðü¥«þà�¯�úî�s“x;TY¬eQµÚE“ŸÕ˜Iš‡oñy³uäƒV !ÆÒO\ÿ7ÿX:Ã:Vó�¥1 õ9ƒŒýV%ItøìlïÔ_7Iüñ×tVŸõ(M}þw¯ºep…g3 \Ýþ/PŽÇ¨°œLŒ(†ð4¡Ã]âWovû | ÍçäÌÝ£Â�zV*Ë7Ó).×f¹SßóüÇø´»cÓ�ÚÑ´§ÄKHld7í¿ÝYp¸†KÅe5�ú•h÷›Ö-P臭)O×ÃÁ 0ˆø2ê–Ö›Z,ÇËG‰ïÕw—¤ÝÌ>C£ÞÜ»DÖ\ïFA‘›ãÙ©Z\5ì�l ûV&�][l�íþA)»}o}ú`Ó1”%ã­qiá£Î>b]éäý_Ø óïë¡3î_;—õ3ÇÙ(†´PIÝïúlý¤·yEmGƒçuîX‘ð¯Py:õ›W†dbì þ?ëkKCŠðÝ’8ãžX4­©õ À8}sGzåä+ÀÕ:O—uá¦·Žƒ|Ú Õû“@»â“ËÝËó‡5å‚ýy¶§¸'ד¦=©´íѺú›5…‡|¦¿²ÈÝ]†yv“˜ïòÒgqÓÑåjèïÐì'³Ä<Ç5‚JoÃIÍàün/õ[›ü„œZ™Dd'’18ðŸ:…žÒšììÍŒåÞeÄ]ônœÞ�Ó<à�»Õ°ÄlnÛE‹Ÿ•»s®7ã%kÀ¸¯9èÙ3±Õ4uúëÉ}žñ×~Y+ÝUWÈÒ•ž©’ªË·“Ÿq`•˜æg™AûmFSŸ&sÿwe}Kè)*,¢�vøéó=ŠxëzâÕ*qŽ6íaü8„C#å±õ°zwPë?x£1ÊÛÜI² wfr%�õ'qufÈLó( 3wBLŽ&Óú‘o&7!÷ÆE‰Ï,ã›_˜Üô ÀOªðôoAÎå–ÂEî{P#·«CËoÁ ,g²d×ÊÕ´x[ Òn8)=â{=цÚîêöÀlGOfo O—ƒ1Ïa÷‚Üɲÿ�µÝÉ¡`é,,;›Ñ/2¥kø|”­‚òºÜ˜¡y¨ÖÜIúT³uáý+I¥;„[ÎDÍ]à(‰Ûp(ÈD»õ³xÚ„ä$Z�½Ï ¶i\2�˿ƓÅüýÞš –jœ'ƒ×ÃF²Ú6‘g07¦ÿaþ³î~9Ù©WʘےçÂâC…�{u”9Rñ¨ÉÃ×ïN Y‹×\V èG›Þö ï×ùzíõÓÓå”f®ð÷‡.> ùN•2ãÕŽøP ¯_u½�[œ¸ó5µÝ_†ž²ánº»ƒÛ&ñXn°RXŠõ¸Íõ,ý· ”¯µ¢î&K¯Ísðlæù�›‡ñE•™?Ǥc"8rgùœ7ç/ŸZ}Ç\g¦“pGšRnØ´ƒÈÙ°�=b‰[Jþس®ëƨêò,ÝeK“í~X›¥Lû*ŸÉÖ­ØDÀvøVÐLVuþîf ’‡‚¨°mŠnHÚæñÕù¼Ëa3[X'År°‚�¼“{Žy Ç�Mšÿ­Ì}3Œ÷ŽùÕÿØ,»8».¢X² ÿ­†êöÀ¢ôg5Ú;(öc@k¸î7”–é׬ÄåòÞÕÝë©I¹.¬«ÈNƒD2;7Èëx¢³+ 1®~¦ÒêøHŸæ-{FÉ“lë !ç÷›ü¾F)›óZ„&[èý`WçZâU ÆrZUÞÚL}b¹¨¼1{…¢ÿ�¸o/.BL(FFÐv[ñ :Uò|ëè8^°8eoë–û¢ÍpŸ1X=gl¤`ä¾×ˆªJ–ÚKÍb�A¸ÌÔÃý_vqf�álæ.ˆ÷['îx Òa¿’ìÝq×enVðÏñ´q?R5�DŒ �:bº<<áÕH?|„0¢C ÏLJ7–°/;³´Ýÿ–Û!›÷€fóßEÆöB¥yŸ~n§Z¯÷©ûìZ=©�] °8§÷Nç¶_>µþQ—U£Ê|‡Æ·C?{o0{ænpŽ�;oþ´óv¾=îöºÈBŸ x°”¿–gßêFžo_FAWùÑÃhj~¦3h¯~,©^G‹ÎÃmÛâzæg†]ÁÕ`iôÚ±°ø—àxçZMKµšØ¶¢,ó¿œøØ^‹"tÉ£}èsW?—YÍç™ÆÐñïè—¹…<¡É6Ú{ç/aå=~~JˆOe:9zŸ=u]ò5Vù KÅ]ç¾=øÈÉBÿ‹*¦ å¸üŸr¾Èpñ.§OËy>� A�*f×G0ÔèdМ Ò–rÆ »‚|ÿ+jÕÁæSñÿfÄ ÛâŧٕpÖÌD“·É³£?‘äßáMö޶áûWïgÃå®ÞçZn@ÛOtÇ,ÄœÛó fp Æwt‡Áü¾«ué©J'GÔf1`ïØçŸIûÍ}©^çiÈ}ÇØ¿]$tµiÛœýoµ(×Áñìù„Þ¨º”0Ó õ<üéø‹þK"ÎÛ¨üu¿!žo?"áK�¾Ky¼c¹sË…½+.€Ñ»ûî|¢ès¡�9áÓ �²}§P—T?ÖâNchOÛîÿ×ñ¹ì9»&Þ$Køõ·Ôy´Âh¢ñ¿>ÂLÁ?»0RzjtsñøúNt/wI¿¸qêc„ø�Ô{4?Âå­C:«¥êPc4϶UÅízo�¬iÄFêjus€AÝû0&†MˆC‰2 LO ¬¯¼wwOÃŒ}Ç-ï÷ŒÎ+ �í†G qn墳å-6ŠÏ©7pÐ�ȺÉñL¨{�Ì+¾—œÚ5ëêìö%J•Ï®š oèKôZá'ßßè!»6­™ôõ™º�ÖµüoÖ^ƒrfô@æòs¾vè¾ï Ê\©:˜gÖ߆pAµÔ/™ßìr^ïS½‹¸_¹ýϸڄ±ÿ[¾½ÒŸ^oÓGÃEmdŒfì�9 ˜ùKR.B‡’–<ÓO¶qðZÉ®kqÃ/;í®ÆçÆ±ïük_¶G4‘Ó…(:÷Eþäþ=—Ú¼7ŠòØÇ_Ëèk•ýî°è ÍmXÍ´UEÔ;‹hß³¯ÅsçÆp,‰“aÖrxŠNw jÝJ ïˆØîvŠVÀh½·©mìÙC>òO*•¢§'åÎmqs8F®íA±÷w¹a´â^Ôß«,òÎå´µøMsïò†êv@qïH˜÷T§÷µ‡^Y;x¢Ëwbgn¯÷ÃGŠÝò¯næÕ5� f›]mI7èËÄp„†U†™ èêçó†óÄЃŒË³—cä^ò"³à¦“¶'+OòK¼}~ˤÊ7Æó6 ËÖ9døs$H½øêQP‹FoŽ2Ö¹—(±±xGd“’<ñöw‘N :dŒhb=²\‹;÷}¼^X­½¦9ÆýÝÊÜtœ}¶Úãp´¶Ÿž°ý™µFZ gמÅ"~ÿ·«Ôo¦ °<7™zIn]LåïÇÔsçä ÀWÚ×£)í:ć8o½µ¸)ÃÑ=wSbÛsßνùÛ2^CÖ´2êõ…øWB´Þ«¹§•Š&ÄÛ.ØË'hR„¥g×Þ ÿ’¯ÚuPœ åSÓ:Æ[H‘Æ­/ƒN~ü)…)nM'äàŒó uŸt@ÀÏç5tí<¼%ST'…‰ÎIg˜uÕú¡MÆæëç[|o§ñS2ÙðÖp&4½°íŒ.Q“¤‘iä è H£Ü–ºæ˜?2Mq{6wül¹KP�µÞ«¾Yÿ=Š Öæ‹G¤¾%eâžÁO2ÅíYUˆMhm½XC±+u¼¹Í ¸³R­{‡Ðü÷ðD(4†42ŠŒ�"M%`ÅÝ[k¶ÛM¶´Ö­5µjÚªÿ _ˆ£I©(�ÚJlLÔ”¡h")¢F`ÆÃf@¢R ™fdÀT¦ˆ™„¤!)2hÉJD-­U¿­m¬Ö·üûU¾«]ªµÙm·úU­š¶¿ÃkZ­V¿×­oñÓ&gúyý¿Ê·ün�âoÛh³K)K×)×RÛoD�K5‡G\¼ç[txË*q“¡éëYºëY³†ÔÞ¶kÉÓqãÃ3«jIÍå°9ÂðšpƒÎ·—…�aÂëÐì�9´yiѶ[Î:t!ÑR–™ ·–qcyÍœ8»XéÓs®G«Î¤x]¼›½=s‘Ë.Ù³›9¼ä ³g-ÚÑé�BÂp¯E5œ*Z·xuÈ·^¸ôÞ­½pÞºå@ëfÞ.±èÙo[aÖÐôBlÓ«±yu³tzëyºX]–(άy¹eÓ«9¯\è7–^uÒ#Sa]»’„è„Ø:ïMÛÆnðÞØN®œyÊË-éÚõÕ·©ÉÖæñvKaͱ2éyÉeœÞm—l²Ý×—y9W¦¶]=Q×–ätäæ¼èÓ:äêÎ¥Þ"nNN®›³�ê˽rï%x.€½2·«¦““­»vÓgZ\æÇ9«ÎYD9‹ÍxpÓ—«IͶ‡RÒQåcdf‰ÎºœäÞºá.ó+¬Ý¦‘›�hmÝ HëztèÓ ã‹:#Á'4×­Û¯!t›½rWd96¡7­ÜÜÜÒò½VMéé u¥‹Õ½<'G é¤yÎp¸ìo5“€GnÙ¬ç[�\š·gFóªô]ÙÓ‘‚i[R‡\Ó¦l"õÑÊÝ%C£«»Õ�G–X±Î˜ÎCœë®=tÖØu×QØóoŽî½Ö¼ zå­eî¹KnÞrã·zžºê¼³zi»›cº®î´„Ý»Ëf›Æi)›½<ë­Û×OTØó‘èÝgV½:ÛšZʱ'D ë¨<½o9tè¼:z½seê½WM�]l”ë�!zß¿o¯¿;ßãÔ…0Lf#J�&QŠD~m­¯ßU­~ú¶¿‹VÛ~ÕµkþÝmù­jµKkWò·¶©ZªÿŽÖÕ_é­m­«_µÆ£"„�’%Œ¤‘�cM�ÊJŒš$Ùš4kjÿŽÖµ¶½¶ÕVÚÿ¯kmÚµ«ZíµªÕ6Õ­Yµ¶Ûum®Ûj«uµV®¶Õ]µkmÚ¶µuµºÖÛ[{VÔªÚÚ¯mmÕ[n¶Ûm›U_ݵ·ò¶­~¶ÚÛvÚÙj­_¶¶­mµûæI$$™2I2Oí?§h™cÏ]5e2.ÖSJViví6!â²ÅÚãÝlš¡ BÙÑ�‘Ø› ídªhÌ–¹)'][�Öõg\qÈÁÉ‹ÇeÙb��3&I&1&vrP…;4¨Ž‘ª%2vÙµêÞ^2Ò&(, *È�r�(*me×3kš³D”ɶ4Àˆ½WŒÐª8 "ŠpšI°WmµÐºØ ê䨑¬oEц†,�(–4¹R//SRÛY²Ã+¬½.‹,„5—ÕÛ鋨;=Ýç×uz{¹¼wuÛÞ<Þ@ H3—uë¦R&t•œ)5l6ø™&OôÉ“3ÞLÉ2û™$ÚªZµý¶¶ÿ-¶þýU¯ÕkM[U·÷êÚ¿ÓmmÊÖªö­«nÕk_ËkoÛVÕþÚÛUöµjýi‹ DMÄQ$Q«4”0±¤Ù(ÑFfˆ‹�˜ˆÃ2Dšˆ…A2ÍA2$LDj2QcŠLÌm‘šDf¡-D„C ŒJ�f“4The0(’›1¯Z«ÛjÕoÏjŠ5ŠÅ´QƒTZ5dƨ¢Ñƒa+b±£m½¶¶ÿ]·Ö¶·ôÛU~ÚÚ¿U¶¯mµUüíjÿ Õ¯­¶¶·öÚÙk[oë¶¶ºÖ¿žªmmí¶×UTÚ«zT™333#=aþÕ+z¿ßhómŒ5ñÙÞrRuoJ ¤°�:v²g9wP;u޺߲tjòh2÷½îÎv{Y½o{×\í§SY´íÍ4€êq‰±ÔÐÔØYX¶Ú¥ܽøré `Íj…¡Û·)œÚð-» £ª;÷ÙÑWw�ŽN5/n·v’ÙZõ¬í“&g©’ffã&dœ™’×÷ÖÚßómm[í«vªþëZ«ü-¾µ«m¿ÆÚ´µ­mzÿU­¯VÚßjµ¯òÕ­ùmU;mU¯Ú«lÚ¶Û+m¥JÛSZ¶kj›VÖjµ¦ÛV­ý5mVÍ[jÍ[Smj´“ûýOý0ÿwËbCwvX$XAšR,rÊÒÄÛ¦¥4ÛJ3Gu-,µi%\µÕÙ¬ Èml Pº}çn¹ÈBë®îº‰>yÕ­–X‹W¶ $l@¶GÝïwŽw/uç—^Åè$¨ ,ca·àD$ÖX6XÜ 4£X®e¨ÉkqbËbà DJÞs;{Öý¶Ö×Ú¶¿{j×ô¶UZõ­U×[Vªlµµ[z֯붶ºµ«UüZÕoëkSZÛY­¶šµ+Z–­WùjÕúÕµmÛmmUí«5mlÕKŠ4 `ض ˆÖ+%¢ŠH6& ,ED!RˆM%Œ•"ÆÅFѨ1P”Q’djˆSbƢьdÖ ]kU}ªÚ«úmþu¶®«üj׿ÖÝmm¶š¶¯jÚ»V¿-¿ïÖµ]mo«mWê­Ufªl×õlE¬X©-‹XÆÅm�­ù­«jlÛZ²Ûnµ¶íµ´ªÛZþukëj­]üÿ§ì÷CcŸÇ›5P�m“€I¦dãÊ™�“Tݼ&Xc£8飌¼xnòä™Ìty®D‰¤’nÃe™ÃW‡>ûµóé_�®[�ËîÞ¾ûóÒFμc4�&óhÛ‰Â��4Ò'8ï(ÂÀ$à€µÍ³–pÒLšR®DŠé)DŽ» £¦Ð¤I¦]t‹jKl¦E„^YH¯‰xY¬”9R²œ4À F9kÂé$åg 8sŒ "fJJg Üä8ä Ì圚Í%¬ÒÍ$Ik” IºäLÓ"¹td+Iè;‰™»)4&̳]0ݳk%ݲmdGŒµÃyv¹t²ÎqxÌà„ä3€DÎkÈJ`s\f¸Ö²Ü ¬c²ÎšIÃpËXœ©k‰ˆ“–fm¤Ò`6 \mÊ$¼i¤ÒâÈB³‡ÖNYÌÙ´“IºðÒNpt”lmR’tÌÓl1¬æfe¯ÞÕµù«jjÛ_ZÚü¶jüµW¶Ú¯Õ«m›m[z­~ÖÕû6ßÑER[sV4Z¹µ¹­�UÍU‹·9¶ÕÍÊ«–å\ý­¶·m·ªÕ¯ãm­zÚ­üU¯Íª¯¶ª½kk+mnÖÚ×km®ÙmZV­T¶µ6¶UmnÕµ«çUÙWû=ÞTî�ÑæóyEÝvŠ"îê0œì�,$¹¼ÞH˜É„综Òç½£³çO]ç½×»¯Nz¹º—¹NíÏ3Ý‹Î]ÕË»«šëÊêwv."ÞuîÚîI@ʰYƒhD•ˆ‘„1m¶ ÅVp*¥¡Œ @„ ¬e²“É.—Mºk…×{žêBýmU¿VÍUý¶Ö×ÚÕ^Öµ_ÆÛV«¶ß¬XÕb¶“Z+jýµ[UÛm¯Õ­¶¶ÿUª®þ˜_Î÷»{ž]œîvîÇ]gË—wu뺋É9͈îîzk´Þ–1õéãG{»¦î¹É˧1Žn—.÷mç-ëÞo^yr,o1ÊÒÒ2ƒ‰ÄË⩈áœ"¯Ozîkž÷/QŽ\êòâ��…%a¶Èåq,EÁ%yî—ŽÎ\ÓºæLî¹Â"˜.UÊal¹kE–àë®Ä �v7\×w]Ø‘Ç\©ÝÓ\vrNîØÉs£ÊÆ© (’5D¢*ŒQêD’{NòN÷½wt'»­ÝÙ—']ײï;Ž.syv£ ä¡Hc!nU i0Ë ËÀ ÕÊ®$¤ Ö¶ß9»¯oæ�y“‡)Ü�^ëÞì–;®ÇG]rç»Îîy9åêòë»Ë×¢Ó9ÜÆgÚ¶¯¶Ö×ëV®ª­½µVm­¯ÞÚßmmíª·µk-©U­­¿Z¶ÚÍ­¿}µWòÖ·˜×{d±¢ˆ£ØÂ[c3 £l2±Rˆ‹2HÌÅ�LÁ£Dj1MˆÌØÛ'[mþvÕ¯­mvÕWÑ`Ì J3 £L¡ƒM2i#ƒ  ±"LÃ4F£C ‘ˆ˜_U­¿–­knÖ­¿VÕ¬ÖVÚ¯mfÛk­Tµm6Ûõµ^ÕZ×­[Ûmkª×ÖÕ¥«v·õ¶¶·ëVÛøÚBÄDa(£k(T•ŒQQDRb£&ÅHd£b²d)´j–šYPFŒQY,4A²o¶ªºÖÚß¾­¯ËZ¿zµÿ…«m¿Ùkj½[jüÖÕü­[lÕ¶–¤Ì“¿^ßÈж2‘1"`e°m>-FºaÃL¶‡›»°jÂÖë¡ ±©\—M%Mcay †©¦bÁf±ÍÛ"S]ºG dI㠒ů j¡, ®í¶ÃjV!F¬ÓŽÝXÃIkC—\…˸Nvë»Ávï8~ïzB+ Í¸È *Râ�ÅêÊX$s[kBše”Ú,Š�êÛŤ –¤äIl°ÅrI)@vر�8mpÔÖFšÂ–2±´ˆ…x»5š¼@â„&p�ÛmFË,e,(J9Ѹè�¬$  u\š³®[„œ¶Xdá*Ð-R„¸ÚÉam”2x7ÖRUÛ³wʰ¢ÛÂÖ»-I¶µp‹V6²ò²i›e¶V:é.;(E¥%l°”ˆŠXbd8åÝKB[¼åà‚pJ°c7]ël§€ %¶å¬a‚¦­Â›wlh!j[RKtÛ€rÒñër–m´HÒS.3k Ù/LØÍ¥Ê<ët' ¸áDãÖìš⠀èÂÞÑŠ&1ŒQšM/…-� Ylp¶’Ée–6 ˜ƒ R œ"rk96ÜLKo5é[bfå·H™Ñ—ŽÂX^6X Œm°„W]Ý iÑ1¯,T8Jí¢.5¶Û,0%-‘g/ °Ø$^^í”PqF1X Y)+5³†GfÙIa7]bHMJáRˆm`¦M&2Ç8F¢æá”ŒE l¢Õ”$ %mª±®[l­DeÛuÉÅœ<åÍ1vÕ`ªÝY®Ö¡I`Ze +'ÔGj‚ä"�À"¤U€B©Â:DÖF²Ê ¦[BƱ¬IQ‰&tP7PŠƒŠA­£„$@H-rUƱ„¶õ×9¼rËl`]°…BR[¶©QˆqÊ€¢0›i,(­%„`ÛJ„¤”µ�¨Ë`Ö›wuì�ºç»�ÕÏÞÛoÕªÔÖýëmu­·Z¶›VjÚ›lÛkv­nÖÛµRÙm¶»knÖÛMµWkuUWkjkZ®­¶®ÚµÛV¶íµ¶®Úµ5jmÛV­ÛU]iªÖ›kk~öÕ¦­nµ¬XÈ�RDiÐÉ&JFC „ÉaŠ4I-¶·ôÖÔ¶êµDÆK6$b"Ô“j¾¶Û¶ÕM­UÚ«MªûU­6ýZ²·«m_½m«øÖ«vµmûkz«Uö·Ûkk}­ªúÚÞ«êµkÚ¶¯VÚßZ¶Ûí­¿-«Y¶ÚëV×Ö¶©µf«Zö­¯kUê­·í«kêµ·íoZÛ^Í mlÖ¶¯¶Ûíµ·j­íª·ñµVö­MµµûX "ŒÃ"ÁŒDQDh™4Æ“ †ÅÛZ×í­fÛj›koËU~µjõ¶Þµ©[k~mmûÚ¶ÛóU­ümmíª·V¯œå»D®îH¦`Ž.èws”»»»©"]Ó·H'.+�Ôºçtîdºäs»“»·t�qÎwu×ur�rN9Ð9ÜgLî�Ó‰.5µjm«È`C^î6HÈ2™FÃ2�Dc$ÝÖuÖ%‘]Ý·uÄ$³HÅˈÝÝÝÌ)‰¢›•ÂiÝÓ¢EÎfåuˉ²2$„æç;4X�qÚQ)&‹Êî×…s…Ý»"Ì(w\ÈBs‘$W8ÉÉˤ˜ÉFrºc.îs¤@Ì)L˜ŠG.çe€e'was¦ˆ4Á$¢3w\ 4nWDƒ&î㜠$‚k�"¹Ý×rìPAÊs»2»¹ÝuE�ŠJ‘5Wï6úÕ¾¶ÚͶ´ÖÛ_m¶ýä¾çrKøîw:é‚åûWIƒ›e¬H0šæÙZÄÖ�:8JB­2àqxM¨qp®î÷nîçv¹L¢÷tŽsÝÓ^sºéÎæwKÝtÈü}ë®q�®èœ¸ÅÝÈÝÛ‚~~}ï¢~:ùÔ%Ó¤ ÝÌî¾W¯»¯k–4CI°œ"`@¼¶ T•]�¢ür÷¯{49÷mÑ‘Îç>êë>~{‰ˆùqŸ9DŽO]å'ãŠwsrï'wço)Mh”®(Î 黲 "0ˆÊòÄ QM-d"ƃ5ä<Ý_uÉWKîº »¡œá1Qˆówç\ùiήEîg6]Ü”¤8Œd( máªä&ŠfÜd !š°ÂpÚÂi-ÆBÆ2²__ƒßK¦H÷vür}÷«ÐyÍÉ€0œå°Õ›[*ëãH@Á]ùÜõ)Î??/YíÛñÇwNk²aî®Y„;Ýéî¸lY˵•¤º¤ØÒi¹D㔡œ\(€²“)LŒ-aE—…“uà“LMî÷NéyØw\nüï'ººgÝ\=Ýåu×NãÍòzäæäa‰ª23T¼Û�‡$yßvüï{]I˜i á2˜á„Jb°„+Â�ŒaVм4@ @Õ� YjeªRMmá¥5`PƒÆFl—\L! !b94Ý’Ö©ÑÖ1ªKDÃye™4ͱ�ÊZׇ¥Ó�0—»s÷sÝßuÉîè„�8óvP�„)œ©„…�»fÃ4ÛlRN.È$‰’¬5Ä Ûe YlK¬²&Á�²:ÝS ;Õ÷ÎwçQ‚ç]ÑQ¢èîÉ�yË—½Ïw]îõåÖbëc®JÀÕñ¤(�8Ý»ñèL¡Ýáx}×9v>u#Ã�»+ÆXC©ŒÒpÊM1åráÉ\ákÂh3YFs¾k¤ï½y¤=ί—˜MÛp£ P �LeUä8M†fŒ¿|àÁ¯yíãÎH‰ffùÑ{»år_]tûº‚ûŽîé¤kîÜ}ÝçCb~urù|/{¼Þd!!/’™5M»dÝ"›.¬—]2D,a*À&¹¤—hÈØÀƒÝwˤ3ñ¹�×o;ñÚó¶A÷e(@È 2&rmKVCV¸ÍÛìl>pÌa˾}Õïr�L?;ï¾óñÄÉ$']Ôç;®I~:LÏ~}÷Þ^ÉoŽî DM«!Sm�¤ºè±È@Ò8S¬¥"&JF»n©ªa&$îå'7½ÇŸ�Ÿ7ÝÒüÎ{»4/œ`ÞÚÖ«­Zß­[®¶µfµªûm­Ú«ªÕMmµû[V»j«­¶•ZÛøÖµ]kR«UÕ¿-m½¶¥µ5Wj¶¥ZöÕm¶ö­®Õk_µVµzÚÛWï{0þ.Ç w;ºì�×.»Ôé1Ë´ä[ºç]ÎS®î»wp K»¹ÝÒ—v»W%Üs¹Ü-Ù®‡\œXìÜägLqÉ˹Òh£ ¹¹Ânîw\Ý ×NÝ�Ó³¥t‡Sœw]w]Î)Š"+V8*F(¦1\çtÎíÙÎæ»œ»9räíÙË»¸ÎNvëº\êäws­Ý.s·YÄ]JíË™�43Q†ýjÖð‚ˆLj"ƒ”lÊ$µ!e5 Hk[]·ñ÷ 9]Ú»ºæ»º‘+›£1£bE%9ÆfÐTƒ� ’;Žš4ÌQ‰wnRFÄiÝu1®nQWN)•rææåÍuÝgn‘•ÌrÐDCB §uÈåp&j $´]Ü�wHIcMºXÔɆ†�Ý$fîÜ×NîºîåÊå�Ü×NRR[»±»·R;�·dÌ…ÎAEˆńˆÒDR.nî©ÎJƙ˖îí$^­µùµi~kjj¯×åFÆ£coœ±¢ÅQ‚6-ˆ±Š¢Ø6æìÑ¢¦TmU�¹W1¹;‹I²E±X,ÅEƒ[»¶blmQ¬Në.ìFˆ‚Š,\ÜÁmËp¨´I±´lFÆ®ZèW+–I+dÛ—"£IAb ­Îj,P#Ñʹ£m‚ˆƒ�%cRb6*(µG1¹E%²jwkš’ŒbŠÉhÅW6åÍ�¹].F"�F�FÑ�wE£wv¢ÔZ,mÍ®h«¿VÕ¯Ö³[[Wj¬Û[[í¶Õ}¶Ö›koVÚ¥ªš·VÚj¦Õ¥­³[mv­K[oδ“˜¢ÊdaFB#EDl“¬³¢1`(ØÔÒ3"�ˆ±¨�B˜’ЀdlA$Èň�DÃcƒL,�kmWÕËmª*¯m­ºÚÛYk_ÆÛZ¯j­ºÚ´µª–­¶s$Ï9$ÏS2LÌ™“>ÿŸïþŒûgùëþÏöóûyïþ�{ïí°ü1þÿû¬nA¤!˜jÚ²9< :n‘#LUT½…)RÐ�dKÀZßøÍ°Žèá¬5!ëpwÙ ±Ë…/ûE»W¥Vºˆp•Û‘É·+´Çb EÖBäìn6™ï{d¬qε´ƒÊÜYó´Þ¦�eðØ\T„mv;æÆ£TÀ�J)¶±E¥í5·0O#!JŸü‘9³µÏ‘lˆ;ê¯ê¼^¯gK‚ÊòD0Ú¦ìò,[=„Sx¶­…XÔIK>3L¾¿-K»I-ø=Ì œI^ h‹2Ç/7�mBb難W‡«?RwQN‰~hGŠ2ºÈvÓ¶)šI·±Þm¶f’lf{B� ²S^×F–G&(,1ë{Û ©›$bLŒ°U ¤°Ö¥ñ§ÞÈX4ìGlyí¹_ý˜®=Ž&IÜLÄ/3›cV"ØD»ã×ÁäGÁTxRœHt¸š{‘97&×ÄLY`yd²¬²Þƒ—<Æ Ÿ›3Ûaì ›Úâ‘›e`[no‚z«b—˜J ½Pï0`�ÓGø®aÀxìnâØ^ë ¬ n¤Š›Tm¨ ‚ÌÄ/És,E†Jж¤× áN#¯:E›ÝÊëTqQVÈ÷¯/ÃFng/WLeü']ív¸ÖŸ{-‹]á´ùÛEÏnŠ[V¢ÝñÄþ¼ZI7W�÷©hk/áÆz(�™Ô§êÞ…W4ÎA0îQ£(…¾s/ú�eçYyë½Q¿5a|žfs²€ì‹~Æ"-5ˆ¤�΢�ÚvÚÒ.—Bm:MÎuAÿðnðäÌê3:̵¾0wÒ©W¥ c¤hF 8œÅÀâþ$õŒI¶áZÞëœ&Srµ%5À•@ÓC‹Á#|®)Øë^Íè�vñv÷`ÔdÓ·yÊ8ˆLóu­€�>aÖôˆvv3s=t}¹üçÛϯ/žÞ.dÉ’L’d³$ÌÌï’Lß%X\÷‘¶�vV‹2½êΓ ÐÂÜœv- uµ`º}G÷VÊ5‹ðÇŠn'B­ò¸„ä„)a�pjZzE¨ yFêJ•øOøW¼~¬tü7“Ç»å 2f•Û¶ä¡‚f­oÀûšGŠÀgH'¦¿øˆ!hˢʻËnl`63f?�Gn¸ŠŠ9;p[ÕÔDNŠZÄPñAæAÏì*H~ĉÝ Ÿ¼D:ײŠ4¶ñ’lÂC„NM®¡†°³bK´!¶ÚTëYAùg{ƒ»~G0d¢”¢_6Ò�”ù�FQ5VX'n=$ÏŽw¼VýÎÍÇ|“ƒ ¶Ä@Åi" �ôWü Ž0„å$€”ÆÚ#…§$O¡ÖN6—¼[@‹DçÖÀqùšì­ìÍ../Wf6¤ô"/ þæ£ÁøæZÛ&a̲o¾·€çûA’euϬÒä•Ò1ñv6Ž7SçKåœTü5pþ02Ø_ÂCM7—WŸ·`Mi­¾]N=™¹jóº¾Üd¥ CX‚±R²îK@ƒô/õêÏaO—Ï lêbÌ‚„v¹{wxØþaý‡ˆ•T‘—ñ„=Ù–ÃÚ.}ŠN©o´r¯)6•¾Ù Új·V¢°Ø;|™!…­:6ô` ÏñP�Š®ü$»›-Èj.š$îõ@@’ó-ù.® Q$ú¬2ã)°ΜfzJc8ü2Ô£†9€If媴†ºdpS`0� ÇwM0xOlа:¹S«—1ûy»æu+7‚ø‹…D@GR’Åw›//x‚LÁ$Z[èÎõǯ¡iAÁ‹ª%�„0à\5G·1—1#QXxo—Y£ ðÄ»m|‰‚ýfÇ6ë°ìùKÈLõ&/ ÔÝ–ŒSŠšË%H8D3&!9j%goÜ�œò8q1bûbücĸÙO0ŸŽÓaD —ç³*éºveBçÚNÂMò0ûÄKha >£ÉFS¹@;µÒxAÒAßyz·7F8$ÍßÀó!~gÍrëIQÖÿðÏ1>û¦8•ß¹�ßʽƒæ1 �+…}µ…Ô|¡d‚þ|¬˜Éh[:5p3|þ$ÛM‹…‰&´§ üÏàÑÓî#Ø �éwûq‡ËÀc‰ŒI‡ô"¶­^€Æ2Ä|\ÞøÂfp.¹_²F 3“Ϊ,�:f®;VÂ8ÂF±�„z8l.› ±3Õ8$°êåg¶óëiI/WÁ+*¨î>]ÅØ¥É²;6/á�Ñ¡#õè¸|Óà1ºb›äÀD(É4·´êµà0­htReš;&\Œ?vÇW± ¬û e×Á‡lÀFL!¼Ëj}Ëû/� Kã;ã–GPêzõÏ“×>µçì ™2NŒÉ’™Ã3=~-û«Zþß®ÚåoêÕ¯êÖ¿†¯ïm¶þ�¾à>0îsŸO½QÓ{ÐY(9p œgêDré‘IâŒÒŽÛ×Ýe“›2_‘· lŽ#œ»�†,_KØÏ~Y]†kÂ„Ý Úíü^ý‡8-4cǃ÷…±Ûý¸çY\H�‰ ËÃÏ7n |kÐElaIOÕ,¼“!Wbö±ªl¯�~¤0fχ`×Ú5¹�òwÁy ë{æÔt'öi‚Ÿ³Œ ¥—²÷÷ªÔ QVÔ‰Ncó`q3`J¼§¤‡ßXh�|Lcö³Ø}¢0ňFEÿPöÅû1n69‹äAN?Mѵš¸`Ƨt&ãXT~¿¹`µ|eâà¡åÈúÔ‘ö&sW©nÈfÒ%+çC`îþ `Þawé\èÓŠ#›äf¾E,Ýàöo-‡Mü²~^¸¥Y¯ñ`Ϋ#éÚ°žkC~d-Ilç®&b R�aÉðAsªÅôRT\1Ð[d�BNÉ8 `98 ÒHÚhŸÉï½SëëîtG7µOÅðíçÖÕ‰}!ôÀdÕ@š’}톯bÊÍïa~$ÏÅè¥Ê¢f—�jíN`¡:a¬Î,§@ΦºÓ=”�ñdäïÐfÕÁ¥È"þN¸q“!‹³`#­¹¢t³özË긚YºDÙàì yäªÒàõuŸ‹ë†~�lÀùl ÇuÔl¢t¶fòœ2ç˜$3u¾ñx—A±î¨3¢"(’ÖpínyC|ï�·Ê̵Qz·î7Eæ sˆÕaw� ¼pép ËJ©‡3�”¡íáÆPž”#W@ÅåS�1¦º�æõœW{9L˜ žKäA@:`wèŸ^9θ¶•Ë•kNû¶Ð« 6Fí‡Pu°Îa —Ö/‡ç±•d¯Ï®ó{þ¬4=ÍOMÆTÓi+0'. ¬Á+)_îT�G—ÅMEÅ¡—O�¹Zª ïÓFw\rìj<áª%Ÿæºdƒx��!°Ô”�‹t(Y9D€Ì¢§€íDýØ*ñ[›æ|F‘¼´m£Ú6Ùßζ{GØd¾ô¸”N‰Z¾¬Ý�]�XÅÓtë0§Ø˜ͬæ×ƒÃ3æ9°yFÝhS‚çsÒyð5‚\ç;·'�«ÐdФ†q¾²{Yè*Í•��ˆ¯³èÜÔÏX(ií�áW�€¼²S3hPÇ !éŒl7BP/|¿ÝbŽË\EÍ LF:ã–v,ò0‚s(Â"Ö\“è)(7ëã¿t(ÂwcÝÈhþr¿?^‡NxBÏ»X¸‘=ÛeCªÞ¸½›ÝY"ñs9by&$çóýe~|¼ØíCc!D�u±«‡ÜG1¯U¯;&Ëd3�8‚\„BÛ[K”ùµ @™„ ¶¿ œm#–)ö޲‚(ìÒA­.0ùÒ¿bX3B²Zá, °d�PRZÌg ³Ì²Çµp©ÊBú¦À\yG»9²ä£¢DÆÛÙ2ÐØË9*X[p×$"¬ø—Õ°R8`±Ôägd†ìU”þ¿‡Áƒ8[Lw¹¼FóüÌSX²ÜœŽÈô×hºVI ˆ×#vÏÇd×-?rkY*ÆmòËþÈ­Ó)2ÁtZcÖìF/Ñb`J@P¼;œ±ë6ý°²‰òæj{n]´±#ävE�e iìŠÃ®�©>+®w4)е“Á'g-¯Åõ¨E‰'9C;{]å¬Šß S“{UeiaŒl“ W,¸dÙFCçÝœ] Zûðú~–Ö¤ä+2KŒèÌ^T<³Tm,t'ìç¢qûDì ©ÓQ¡Èš‡_óYEôÇØœ[=Èú,M�k|Í÷æGä r<ßzÛð°>™sø�Ï[GÀ\æ ²Ò8¿–±+d–Eåþé¿nj¾DÝ»ÂÕPŸ' s“Ö %ÆŽ7Ñ퇋${Ú©´�‚9Y¿çÓ<~L­È`m4As°Ã½tCH1™kÖ¼€ô¤ýœWz¤¶\9½Q«ˆXÚ\~öœö½Wý™’°¢yÎÉ—|ûËá^ðd=É�¤ÆDJ3†¬Bä„€„.|b|X'€Æ—âSe×j41�h s�;Aƒ]ôy‘¡&wÇ÷ÁêÿªåÔP¹ ºËGS¸ž@ŽšöÍ{—3½[!Ž~hXçÒíWæŠ"n‹`3!цÔ&ÁÖÕ21:¾dÛÇh°!�x جÃJ‚bUIlj׋Ã;‚ß>Ì‹þÐsþæÎûñ9=´E+zÉÉ�ægH¶y3`¨P~ü~ t&ŒmšÛk(B!â@_д®è¶Ž@Ò?˜Uø+d€à" a™64–3çµ'IÇAÔ1 ‹'#ãÐr ¶8ÉXlˆ9¬ÕÔpe‡6\J¡&”ËobêÕ(�–‹ÃÓ§ÀèZå>iþeU¤7ûލZ” #â=)¦¯|‹�$¦ ­'§KÄS,+�ŽKÛÀÆ„õcø")�SHX&{¹qü×Í´(âfÈ {%rþ‡ „b0ÑF®ÑëæùÀr±Á�_¾ >ô2d|iŽ,º‚›Hj£ç-.çJ@%¸‚ëR¸»—g¡`³ÿG¶§1ø"[©ÃÅQ�­¬’ŸoqwŸ WpaS�'m�ðq;ðW’§¸ø8�}ðˆÓÊ £ÚÞ¸àΕYÕy~}á>¤úßXÁª2¶í-Uî8íä�@¸Å8ÎuÈp:µ¯²Ö"·W5`O“ sl‘…Ñ-TŽì¡NÒ6„,²°3\žÐ‚<²Nˆµñ¬yzŠã§œïZóçÑ8èCßkzÖAÜ_Û… öÿ�oÀ¸–r{gCol7ÔkNƒ‡äN•©3{çE £ Ë`Ä…õ.ÌÜÆ´/0�Œï ÑöÙ9È›ž}…€Ùƒ‚¯z WW,•®Z‹}Åön¹ø< 7­ãS‚ÝV•�_�^±,4_Ë¿›Ú%çx_«ò7Ç„ìkd-µäÛ¸Î1A¦l†sÁßrB£¡ÆÜž=¦žÐ;¦[¸o�GEkg/$=P*q²–iƒ±4]S1óæHgêh ŒRÈqíjIIeò™ÚQÍñkÚõeås['ÍÑs÷Ü�ÀN%°öÙ<�ï`ýG:—5¿5u@\L DêZ--~ÄcX;�Äk—yÐ`”+’ â0X|ÉKyrt•q ¢íåíÍj‡`ïaöí΃þnµlI­ƒà…í�ä¯-–ïãõ\1,�1WuK[Ü»‘Å91(˜ˆ·<2ìû ­h¬ï a&ˆ=ñœÙ¼BÌðcLFJ×÷_;F@³}ÎÃèÚ½9Õ–_|>4v—É6”�x T®þÍm¸­䳞—0Lÿ]ÌÅr žjI¹ Ñ¾šÝ˜ûs=Í“å!­�Î�¢?¡v�Ç�RSŠ·²yB }Š÷ÔY™ÞMD‡�¡ëC÷¤‚W÷T¾ãJº59u¾Ú2¢O‹<‰ùáoߟM›Èbòu…ùò( v5.Å­9:HÈ; �)oÕò…i‹3£Eód#aÊô¿F€š€ÊÿJäY€¿$ .Ð"s6±¶ U�¹CƧ uu|s¾pX*�"ý¨†ŸŸHˆLÖ¼Õ™Ç÷µØ›â,2÷k• …Ác‹,ÖA_ZysQ‘–ù´YÅZn%fÕvÀN›Æs˜Üa¡ÂüZHZ¥k1R!ò�Îwå’J²£6›l•=öÁpðº˜á9�Î{uW³^é#¹Æy‰p‚e\OÍ0Œ ¾ãcév å—!³37¥[$�„~uÌÂñwõ ò^ÿsOV�Jß¼2u¾  ¸³Ä1YVý[fnÂ^±™ ÚÎM“†¼q°¤·»¡ÇíÎíÚ,æÀVž1ˇµÎ¸Š½bLâÌ´¼A4é­×mÆ1í×á[6Tkƒ­ãÛªyñ¬ÞRÔï§¾n£Ù`Ü´:sÆÿí¢*c´¾ú”Ú!ŽT¤^Ïù,††XYt¹× 896rÔ.ÎéKÛžŽÆZÒeÛ12Ùþ»ùÞ9`+~wÇž6ÑRl�®Ë(`‚ÉotkýWKúWGïÞ9:�àsj¦wöBS>›ZlESùÎÆ²j×CÍ„ÈÚpì;ž>Ú�‰äÃ>Oǹ ̦®r�u(¾-¸´PÆéwüµÙåÒÜ|ÌÙÂÄ1½i²ëÀ#£{êÊ�Û ]­4„øÃpIðèg[Íjîbë�¡ÉgÃøbé�·Ap@‰ùj¤‰ÀüðOõ×QU!pá‘©ýIòQŽ�èWxÀf/Ý@þ¦E;1obašp—¡#Η¢™¬e'x±‹˜Îq ¼dx\]ª�UYÃXº‚�~f0™Éþ„k¡l^2–ŽI³@ŠÆgÈ=Nö7”Ë~¶/®©JÁÛ�2\<ö3YlÑ�¶‘@cF…wÛ¶&+YÎô½¹q¸,ÏIY+jøÂ_–*•ÏÛº1…‡–PZÁ§Ç•´ó7ã¾Ò²0¶•‚$&&äï¼ÌHq˜0Ç(¸„c÷Ùe¾@¯ <¹¤nQ1û§îä=¥¥ÞïL×ç�ùï˜;X5X–Ë“åu+¥Óüè{C(øäŠGÂÄÎ $Iø"�·%y° 2;@&|�ÚLŠw­¥K³½åNÀ%èúîà8°]f�^‡R›ì2ý,¼\�JÌñšŸž£Eà³· s ¶ËnÝÂí¶ËX-ñ8…—lþÆHï²F7OÐGŽ' 1¸_& šâ5¯xüçÍX’i4ë— "bÌ ŽŒ8 Êxà[”–ÀMqøÈ ÃܧÍñ�Užsƒèöx’ ƒë{–mRÅu×toåâa‡j°˜»|ª¬_'é¶c·�XrE"Q”Ä÷ ™hãOÆ‹û¯{þ3&§Õ%ßs¥ë*­ó¥°Û÷A¤æ <,ÅÃw“Æ5Ë]¥¨‡‚·9ppÙš]„(ÛP &o…¡ƒÎæÍ”2y.p$bmûZ-¹SrÀŽbæB– ¢8vCÖY‡Žlg½ÏNåôá³ãƒÇä^"Žä�ÝêoúÒ9Å”eŸZÌ+E·çT‹*m Ô)Ŭ´Ï,A@qŽäžV·•Ò^¬äâ�y²ü׳CäTLÛÛ+eN)âD5¶ôb0ox3gó*T;–#."®Œ%Ó>Íø@¸-ôw*¬N¿dvPÐ^£Óv¾ç¹~¥UĨÌ*Þû É�:µø]\—VÚüÔ§ëu:�‡nS¡%‡'=Ü> ÃÇßmðx<[|Š5;ªÒ|‚ÊË_sqwTз_ªÿ´"âÅÐ:³q2*!5œr0Ä@‚ÀGQH×6{½Æ1§0»Ö«#LøÄè°§§Øn£$Ûh°ý–�ëôM9I¶¯B2:6^×ä$Ölr¦«®Nãåë u û£34N�S¶í›_ؼ>'ç§ð CÎ0úŒI`æHf* K— Ù� 1Á“çǶøî·»l2ã�ô윘µ*?W¶Ù­‡ô ·pøûÌ"Ldì¸X¸ééX…F$ݯSë½ÀðTn"ù¨÷œ!cV0ÑŽøÈÃÑ‹ö¯N…j·& ÌyYpˤøq#Æ2ô ª–67RÏU±÷&MY ƒöžSOÙk·c7ÑÍ©bÆ6ðÃ3~n9U¿N ÛØÈrØiÇëm¡÷7uR†æzNåg18zI õ·•Ÿ2è²ü"k‚QdTFV‡×L”¾-[š¯¹k®ùѵBˆ@6öEãôéŸuzßÜXâw™x5§lìüÚAË6E¢Ít½Úbh.ž·“…ÇÞpÖÀ¤ˆd–±ûç­¡�–?7‚õk$3¸Ô˸Y›˜¶€SDƒ|R&A¯×ôl3%‘‚Ü}ÊKâSpþ´àxØù‚Âj¶†Õ«¿$ŸÝm@sx!²ˇ7ÕÈÌowgˆ ^riƒù¹>¡ÎÝaQÜt‡§®|ÇxÒ[�ÎÙuUñÞôÆp%Œ�âÿ Ôr�Õ‚]qæÀYöƒ¹�Û0B¨L¥È[éO»˜å�d mØ®nýÜì $yHA‹€n1´¥ï^E÷ƒSÝf¹‚&\ûC|t?±ÝG›öÚÿTþÒIÚ&·¼á,Kc¹uc"^ÁHPž[(ßJ‚¯“A¡ÔƒHjb~n.ÎàÐÛ±á æ­ùñ߃ð’µÎm—­&w<�Âa:اœæÂß[=%þžªjl‚P�¥ÌJýS Kä†bžBdG©~f©}Ò½¶mÛõþh!Öù°uße³!æMFBç— 7!él<Ư›X㢮¹BŽBë ‚{øe¢H• „%¾* ‚á­Õ\¼ÿˆ¿TêèH ¹¥�§b!¹`G`"N?Ï€1´È@(‡±tv�§Vã'x+–ŒÚ B9°)dXbk,ì’jö…K€ÌˆÝ» ­¬æä»RZæ)‘YcàH�n¯¾'q٠ɥ8P¤Ùï•n��þ  lñ«RÀR¤Á‚"Ù&›)4tîÆ ëÆ Þü $Fn>1†âÞÅ0S«[�ñ¼7 QÜ£y†²ØîŽÏŸá-CŸG7À¶ÉyŸªKN“ùt ÓvÀÞü³86˜í·%NA[qàK±ìº`B\!·“aÉ LÛ,m5Íò;EQMú™kØ2!�ÏÌí:Ʀ(F[qºP_Æeà5Ž ÑKH†Ü¹»åoDÿr`,j-7%9‚jC0ÏÝAé')G…¤ô¤'mõ ]ÇíRØ[ËQÝ÷´-äÖf í+a/XÆÉE�hZþ¼Qà5qÆT›+ægΧ,‰@à%+B&€ {¿[ô¾ixwI6mÇbø ½`WzÄm.@êË”L¾,Ú�§ÕÊ�ÂkK“ìyuÙ´ë8‘Æ;¬¦þÅ��ÒVp{ò¬_؆QïÑU”*éuð“âÌ~Í“oY¶ÒKzÐ9:˜‹à«OödÔË:Ð͹u5ybxãF™ô¡æùµAìèáµÒ÷ÈCJi–¡@í´Õ‹“òƒd>'ýEá¯Øø–©b8¶¿µÊÅ'œ;[ŒWÆì!ÆvÇ\2ßC$qÀ�¿Æˆ¼²èÝ© •ÅLS#È%¹D,íqÜt(¼]®óWÔèl4…¡ª®T˲=ë  cpÄ9” q§RN�Â�©â` /—“.£·ÍPŸ.yÏ�BÍ©küÔ,°îyòÛÇ”±kM™Éð5d¾�põ Ä/W£×›R½’ë»U·²™Êh0ÀïŸIÍ?o1Íì«›ñu½y�ÛÄë;'�0½Éö²›P” .µ@Åä8á¬:Žt(†òŸøìŸN3×è�ýXNÖ­ô�Eg“¥îgñÞ¾\º°ëñ¶AÄÁAò­õõ”¿7¸–tÆ’É•t¼0 ;P‹o¨aÔ|9l¸]HTX°ê^Ÿr¿…µ/A÷Ïådèì9/½™¥ '‰,?²À„èæØú[9Ö!Âhì~ŒHI×{ 0Q‹ì5–`MžM0ªð¡Ù£p³ y¿¹{â¬�áŸÇŵ•‡ÿ”%_Xᅭݬ”Ñì]Ñ®­î9 {SÊß…D ÏùYùëJ„®ó+dqû‹¿?b-ôZÊ¡˜°’�ÏAê³_Bà"„»œ.ÌË9Áu¾­8+#u†ÆNYŸ~õ®¹�õMâ0Ä €#îͬ,[ÙÚë»çMú¦ŸŽ‹Ú\ZŠwØp5–E÷€çëZX6Ïíˆö;y¬ÔÎ`;¢¿kסÁ–h;pq”Ï#//E·^)ëdYáM¯{í¬HÅaZú�AíמÈX]�¹ lš÷/¨Ð_Ó0¬Û ŸÔ‹L76|°nÖýu ¹S_7NÙ@ôuT^¶<ú:G»3è�Ì2˜‡ ¸3£þÊ®¯jDZfÅ? „ò[ÖÅ_MfL\�\†2Š.¡Ì°Ùh�Êô§ø¥püp,’´‰fÆ?¨òlÌtŽúB³µÌc¦c‚có^Ș(7˜QV¥ ˜ÃF /|&+Xx·lö+ ŒÎ{ÐvxÐ8–HOiß~xÏZ¤k£¨e â´vhºÐ\ñ$äïÚäf²ÍŸ°®˜ ôZ4³¾ã|A´<�r{\Ãü( ¦/´A¯?(€§L~›‹tGº4GKî½#ØOº ïKÑ_OÜÖ´¾‹{=ô«gEÔ€½Ã>CYA— ¶üžD[�tõ¿Ì~ÊX¬Õ¦ÔËüe¾l ×›Ûî휙ðJ²ü{ycóÖ/ó;¹ˆ2+þw–û¾Tã!„d‰àIáÃERÊÖwö!è…ÂÈo½;;÷ãN3ÐL§z}»n«H[ɿۉ×u&Õô7 £Å£@(a�é‚{ªŸ¼Œ›-žpïQÓKŽ ºÂ™)W°ã ¯ƒˆ‹~ïÁø?W­‹FÓ ]~U¼ÔsèböqB;+Åìi� ÞÇ% °FÌc‘FûHÛZHŒ�²F颠³*ìAß ÄÅz°g›DœŸp;‰¦ \quÝŸ£yË_™àBØAœd3Œ”1ÌE@>M%&VoWÞ_ ¬å)äÅg]ø'Ú”{Úí²° É.è•Àêæ1×Õç÷z3¥Œ5çY¥´ÜX„¹¿qÏmµ¹k¬a¸È€þ†Q”I¥Æ,Ñž¸Z'+¨Åñºq|u òÿ¿~ß�Ó­ Üo’Õv8!ÑÎo�ÔØ‘+q>nXuŽec+˶�„s`“ȈHÓ p%DS‘† ÑÂgKÍÇ@E‰Ãt`&2 FïÓºë+ùS“»2²FfÍgnøW ßS�i-v="`¸Á +µTÛ'Ëhó%G²Ãk3ïÄa–üìO±QÈ]O"Ñár¿D ɲ"=0¨Ðœl³ËA²†î+el‹8Ô³î¥Xœ ¾Í—ZsQÚÜpw½š~É›]÷¾¨�n¤Ç °ˆP@!óZÕ?�„·®p¥C£6²¦Á6#ïT]Ìɼ…'=¿´®Áh£ÜÔ�‚%ô!®ßvCص;\‹Ñ¬È ¾RrÀ¹þ/¨ùb‡mydX9= 0h4-š ñZŽ»ű‚ÎÏãØ‚Iï Í…¿Lu‰ººð²Àù9l+N­ïœ&f·óØb®�’ƒ¹~Dj ¼{AÞ^ÈßúíŸ�Ið¿WlH,·Ì—‡ÙY¼¶]ñêìÚØ„X9 ¯¾½ N„å¸!}obDó걘-Âc@¤A¦”x–áÞ¥ˆ;Ð˵óiáËO*N®¼�Þns¥íÅQ[‹Ø,´YA:çfºŽú€,ï5§{;u¯ÒÊŸ1Š\ˆoíT ×`´ôb–¶wvâþ\ÜÝY5E·ÕH�õÏrÒŒN÷'‡}U2t”k1�Çd˜ƒqQ ÕpõdÈjå»ÚB—ª j|ähó5r›âÕ«…D*Ž-›çó³U·|^°XÒ±!0+K"óãí=oäyØß²ê™Hˆ´ì�¡§ç H2G�uÔ­ð\̾DêUÄ$�Ý;irQᜄëÂ{|ÜB®Gõg9ºˆø­¹&÷ôás~(µñY»¾öEæ1ñôb½²3V]î›Mж|v}ßÉÞ Ù™¹Ij²ë¯†ŸCdb#¾áOªØKêbyÛ¥´¦´¶¼("mïX¸PFäš^AÅ UoßfRRþs€P<^Ó\�%Ò>N•¹QÆ×ñ®À{5 éVÕ6––Ój‚Kqñ|ð³<ØlÖ³…Ô›¶Ì-¢ÞâëY1¡c£5ݰwVZ„—Á©�Â%'z»=Å€¤\~5ßöîl¢ÿnñÑÀp Ñ×^øø ŠêO¼óÔñFsóïÏ]¾=ÿ=uØóùgøæLÉ2fLøÌÉ$ú’|™’†L™’lÉ“&I“9ý>þþ=¿§éÛ}a\"¶‚Hÿl§dëBÑ[žÝ/€Àb>ÞÅý-ËÛÝäaá±X…'W’åçö¥‚Ùe+mD/�âZÙ0cÁùz×^ul·&àH*ˆ îÄ«v;�üB!ø n!‘ü¹þ¨�D @"ß]Ù¾û.,ß�T°8%3ðèŸGá'£=ÉìN½ß>žäœ?IèðIðgDó÷Õè“ðÏDÏxdžŽÕù2O“äŸëÃûöé¤ Ï¾3/Û�õùgNsçÅŸ„ù=|¹Ÿ½_øã“Ø™çŸV<öï¼'×LÌòfgÝêççÓñ埾ïÔ?„û'ÇçŸ2çÙ=ÌÎúÉùîûxíçg±ìf~šgÛ’x'Ù=‰;öd�“çéžFbv&Ri;š~�3äóûlðw&z3¿Nþ>}ÜÒz/ÛúO'ÏÏÍ™NÞ~ï“<}„á™÷ãÁsô�<~2OrR wüŸŸv›<{¥ÌûýÌÉ>²d’| >¬ „�×¶ÿ‡æÔ€zCÈÀCeý%öË™�ã£aD»~öòý-  ð[_›£!y>87ƒ*í>qïŒÞëxÐåÑd·}i¼QTÙGC×kDÆ Ù[.³\ví¯Â°8ã¢ã‚mwé„A¾ÔxàÖ¶;~3ü/aÑûHÈû SÞÜ9óÀvsuŽÑN�òz°Ñ}ó ¥Uü3<íXÞŸÖü€ á^·>/¦~m½«b0A fFBóÔØ÷Ÿfš^9ßu ã2ÿn`vï¡xñŒ�¼ßoâèÚ²7òvÎy–p#¿ÉZÜÿ»÷ïÁûôy+Þ×Êm�ÙxÁ¦e/Ó¹_₲&|8¥�<0‘°ŠureðÐø5Œ�•�3ÅO»"§ƒ«5{Rá”CÈ;XvXÏ- Ö Ü1r¿òéÝŸc./ÖÈ]âD5¹½Z˜Ÿ:‚H¹­ wÝf ÍÄ ûñ/²úñÞŸ$÷qrä)e‘ß\-ĶB«tœàB%ƒk°e ¨+îÇ[êøË%½â ÂÅ èk*þ V™Ks o׿9¸Ï4¶ Ùâé´ øîÊ<¾f¼ U1•êþøøÎÃZ8>?ƒÇ«F;‘�j¾Øl¨¾žCò˜b>ÇÜ“_’ qî+ζ�j~´„Nô•¡—\ê o£faÐÕöd霙íRHÓ;"Ϻ)¨U-é³eõrÛ¾ÕUûGè™ãÂ÷–¨»¨�œ m$Úõý¢�îqèÇ…:8‘æ§­ŽfÛc‡ìªZ¢p¹Ž›íÃ#yævz +öNÆºÞ û>‘GÖÛMƒ`µce-ù,âùœ³÷#•úˆX˜Áß! šÚ¿0¼ày™¤+&O~ÊèÚ5›‚ÅÊŠ¯6˜˜ryEû ò*À\z…œIï`õ¦pÈ(!‘üC#± °1I±Xîõ<Ç‚Àk§HƸWUÛî¬ÓcD´¶q%½íxÒ…°PºnóúbÙ­Z-¿pïj Øt�húû¬÷û…`b"sO«s.�î;§Â·GßoΊ ¤’ê�ƒ¨Öf(á+Ó¢nYÞop~Nêgêl žØƒ�s+æ Yø‰\Ûý{È£´Ü t¬êè1{‚Ü÷y¤_äU§¥éL �;Há·“ênŽo7&ÂhFõ½bºRp¢I×Ç@?~°PÀfÔ’+£Ó‡Usyü|R!ìâ×q�.ûÕØˆ&ü^ÂÅù4 ¹ç¬üúñ6­µëŒÑáÃyèyø$=fxŸ³SmóÜÙ;mæÁ'`�—ßZÖ,3‡S÷gÑñÞ¨7«å¶?¾go†´;Dú¸› uÔh·•¨ßº˜uc/ˆsÇCF@Fê…•¯ëñ¼|íô)BÙ< [dŒü1Ã*•Zi‹bÚGŸ1÷%žíð[»#$É�¡oµŒ’x\Ï1l}B™™dÞq[ÐÝ �ÂÏ Sî>òÍiw­éÊ9~ ‡²GnÙ&Íàõƒ�™1±˜�‹�‰°8áÊ6œÜؾøÃoµãÂú9ö ®ß{½–ºLiÜç<±÷ÒéÓùÇ'yûì8ßb;õô¤'œ3_ºy#ãÓg¼6J$7†j��ŠmÜ?BÆÀÑñÞ§ãç~eý„Údð]8_±6(Õ²Éö2>z ïÔº‡[Nû8ƒÝ* ؼ(À�Žfqæs ˜°{GV¶¿k…U#èØÛW¯ Á韤BœÏèppuEÊ ™­"”0[†Ãke­>ÇÏSFvÄÁRædáR1<ĶðyÌ]âùòÓ›¸±sRáñP]3Ì þ­F!mâÁ<_XɪêgÞ;¥G«ózú´¶kw™µÝ£ºú�1¿f;ãïÅŸ¯Áø?³—¹ì·8ž[²ÖÝn3A1ÈÑè"^‡q!�Â3ÈÝI•±CtqÝï± sËü´H$&IÏþƒ÷àô»b;Íš+Œn»Å·ös4Ѐ�Vn0zÖ²¾ù¤î¤þ»3IéÏ ;çfýWÌX<+m¯C·sGÍMù:‹ÛÐ�á•�¶XrÀ:ÁŸ˜/%g³ U~·$±²ïh³€Ùo�ýø%Ô4xnM\_p :å·a2 >ø5ò[ˆÈ ü™ÚðÕp¥ŒÔ0#Î%ôÿÝ· øóà6LtÝÆÔY4aÛ/SíóÁ€Lø,ÐùrŽ#mã/íž&?Æ@æƒr˜=óKé.)C}�è®lê9º•:ý—iÆGVÄA¡Â=Ÿ¿^_pF›Ö,3ŒV~ é�9_Ý"Æ÷&=èícÀÌ¢Yñë• ”œÓóžVž$=:ï' ¦»u@¬û³^¹³qí¬|ÓLs™4ˆ�—w#°ÏcQ{˃l8æâ9¥t5axÌjYŽÏ` ¸EÇò‹ò=ÇPS!bŽjç ‹Úznyï4Õ$÷ÙnÂçÞnÉs³¢á‘¸+aç—6{F¾‹bÍ Åìêë–C¿-IUŽêL4Ä5u´ð°˜ ³Xªâ�Ox”YkÕuÕQ;”ê©7Žrô¼óÞ¿o3�´“ŽÔ/À)�v>ÓŠ¢½ýkø3ðcvÝ�)0Ü÷âl«)�pÐÁ OÑ—Òc£šß*fÍ:¼õèßX½þé­`pƒ‹a&ÅÃfÁv–›w îM3i«„ŽÝ•÷‰¿ZT®­žo ÐÚ,‰è˜ÓNdåô,¼‰A#ذuÙÇ´^ÉmŽú|(”€z—Wý·ÎŸU°äíÏ=£@`R}TðV¯ìÝ”˜>²!UIkÃ*i²³k¼‡;Ü48sºEÌ�²%ÞL>¶]û™°ûeß §~ÖÎÏyÆí;ÀQt@ËTÔ:·©º)F•-Â@Vä'j}O½ã'ÛÑg,•埞ñ`*á©Îó}ƒù…«Ön4~.g݃“jo�©¢îHI|0‹o¥í­›Zªð\ƨžàHA+CÒ�Ê+´ë˜6‹\^0‰˜Ë‹m¾§êp'x{)©€/_~ß·Þ÷>V¤z åù³ _nú~ûª�ÌX᳡´4m0¿�î4·�"ç¹îîž#Ä�å¾);?½ä–J ÙE 8ä>,ßaÇuÜô5 ´ÌîfìF>ˆj{'L ³ËGÓ ƒøï•7è ¡»�÷|C´�3Úû#èš}–¶ߣà=#¤MÐ!m‹/w'Ë?ÓÛ| ö%5†ª¡ƒì*"3<”"„pšñŒ\2²PÁ„´çÝÏmpE<1$Å&„-ß-ÅoE™ãV‚‡Â1¾Þ2X™b·¤—;�k1®sìÄÝè�îí)¯Ö™eí¾[(�–D'ˆ]²¬lÏï™ò0ìá»î—†«³,ƒlQB7ÂiÝZ©irÀŽÏKóºÚËE†¿>öDBÈ|È@bñÌ̦9)¡z·m;:wÖ3"eˆº‡‡ŒÇ‹>Ô/²æ 59º0�&"ïI{M^Ëlõ²ÎB @7¶L7ä&5åÇú+ëäîq”h`#B­†ûž®2 w—8OŒpøk`uã�^1hQ`%Ñ5´–Ó3AfäÕ¤ÄÁîu+°8Ò3ÚbÁoT«õf”­ënUe 9YY©·âŽ8ç+c0*¼å[4";WPÀ�a0}ÖWó^Â>@K-&'M$ktڅÓ^EcÖUÊÿ+ß9¨"k „¤úzs;9:ÃÓ¿,¹²¤$¥¬ÌúSÂÞÖY|�µ#çh×ÈÜó™›-Ê¡OvÙÒ�D#¤ò/”œ´õ¶†ùîžå�l½µÙ]²[h©f06aë!MÒë‰h¾ºÈØÑ¾W1i;ÙžÎadhI¨ 5ÜnÏo Îf!£d}§ì³jÐú°{Ž­Hݸ‰ÎËÐ,�â²í— \&‰`uëhW=ð[Ùç:äÐ-õØáÁi ×¼m‡X3N¹ºÚ*E¦.â\nb}jMw¬¡«ã�رÐñ_ª²Üh¯y)˜kN(Ÿ,VòmræÕ£Ãg{—P¦æš™“gƒý•�§ C—Å{|Lç5BèÕÙâF·Ü´VU¦únۢƺ;P­öצK@F†ê %ưXk€æ©dÉž,—‡õûÝs<¾õ"äÉZ¢aDíG@Ͷ=mã<ؽŕ3úè}lÍfÀ¶¿y©>ŒW2ñ›¦^jûzÚN�(¦•2c4œ[VÐ=Ý�”ó^T±¯'vÎÒ€ëZh9ŠçêèMŽ­p¢síÛ“y¶®@¿~ž&I'32f}I2o×±üÙ~Ï™È:³¯ŸonÇkVs‹{�αÃÈ_¶9ë“9$(‰ÀŸcÈ™/¿Y4¡KÐÁ‡\®«þtIÔ�¨`qvf@Hçï?gž¼>>2ÿã&I&ußÏÅëóÃÔ:øéøôrßSônö¼ç�z>ÿ_g¡­O¢(ÈGº]À^ó~Ív’¯kž3¸<ÁýŒ …÷Ä(È*¿ss‰ß¿T¡[ó¯wŸªãÖþ}°.Áþykë3•¿ƒDI:�bø6´O�7AxúaBø­GZY– 3¢o†?F:UÔÞöŽÑŠuB>ðß2P†;Õ°c@Ý4¶G�ÀûÕ�«ôõç'5ƃ—ã(áÏnP«ŽásŸ&Ș§¶ŽgEêšEî=e>û&*¿ VfüäòÆ/¬®VíE™ V­1­âäÌÓpû†2NPx_³JU˜rCÖ—í¬ÆÛ:UïÚzÎq ¯ñã{Ù�ÜmùMS¥ó„5Ë�¦8½èw^Æcphš;aU슈ÌÝfç,œ Zÿ4ŒΖq?†Ÿä·á‡ ‡2 -~²E_"�įå³×èÆå€)ẋF»ENd¸ÒÀD†?˜góp#ÎÞ¢fzwÁ�Û9}z)Löž» (_A¢áA;!o?�®|�ûÙÛ(æãçZÔD&çž5¦54ô þ,ä¨Z,¤ôÒ ¼{ÉÐXowìñâÛó½Æñ¶ŠáhzWÍÍL0þFHsû'"O#Éý¡ž»ˆ&ÄE«Šra6@Tºn¤?M°A€KçMBÄDâ>G�°@Y߉KAûy˜g·«ùÈy'bú D+ña~Ú¸KSæcî«Î}hÐéwîü¦¢Íñ�&KxpC­â5µûd=’9æ%H7¦EŠ€ù8 KfRœ«‚~ø{g×@sø#™ÛPJ$.ŒŒ+Žxp\çKœäƃã_p×]æì'cø!ˆQxöÉt(îS²Xs`çz£í‘ÆR.áÈåA¿tÁë�%ýàõ°Hn½û·Ü]¢±øºe�±‹ý6Tc<_zÈ)b2ì‚ËT€HŠŽe�5käÊîËí¨a@}â·ÈÀÒ}?(y`¼ÐÊäVM±ý1ø”i÷ºSúQzBkÝZÙð:Û½õ®~tô…ÅDû⣅êèñ?Ž0¾:±¦Ê ŠÚCvûö|c ÑS{$}ƒ“–ˆÖ-bjNQà\Ô‹âg°¸‰â¦œ§-Ö:/DjÎYÓØÊÕRG�Z'cýøäfægK‘|†Û�º¯]n’êJñ³‡,$˺¡+�‚v=—Ã^Ī* $¼µ@0V+2ÁìnK J¨þ;À[§žöù!AŠR[Q€_Ðj$ø@‹í•ŸCk ÜòÛx¢ÿEaè éW�m&ñ  …;äDÏ@,dÿT=AO±Š‘ݬbB ØøM½TØôtºtà÷§|tßâÃJ~N |7¬è¨W{9t¼ÛBÁTh–È\­h Ë2MªázSª´hºÂŒ:üOÄ£§;‰ÈpJä®F4ôVZŽô�“ªÓ41üµ�W–ÞTwŠ ,­/ Ú× ôgÙ%}˜À£{TUB±bpqL|ò�åðû÷v'@27´é$0UšÐ1„ܘù˜õX¸®7úú�{l™`O¯†ª �>¶£2z³ëM~VϬ߱ ÚÞٕDz‹,ð/óÍÄ5‡ÏWx–XBÈu ‰òàmäÅbÿyKˆè¥[ 1  ™2ú‡šÑùh9ÖïÁøÓ­ì�í52¥%I€·áPfäü·K?�Òö }*–7©[—ÝkÛ$±^�˜W?R³ÈZر¼'ç¨d>|†²smnKì—}1ÎÁ5× _¯3–°NaíêÙ 5ä¦K3áÚ*O÷a&JMLâ~P}¬)²†}`Ç[–£|ð€èD- Ÿ{v®ˆ.ØLÝéI•‡6ª“ã¯A±—>g¿ 7YÊ`[-3-‹‚Ü)U _*³ÞÒ5T{Ž™n>V |ÒÿŸ>Îï[}�Ÿu¿[ËKSo¡.Øq Õý o}>)‰ï%“]@à4èä¯å€�²¬¨)uÈkÑÉËï?s³ë�.ƒÞ]^»’¿Ø-°%&þ;_Çž:îíÄ7Ù$w>P=–¸J6ï’ß�ïÎ?ÙÁ8˜Lý‡tx|Ü­•8 �‰Zó+“³q�"Ø¿ß\èˆjàLCË:•¨g=são»Ê–œ, ¡Î?`)½Q'úÔúò0>»Þ™?ž®±÷ é\°{_I“8Y'” ǵ�Ø#çú>rÇ~F'u¤$¤ú+Ú·š<>ºs'Ôã:Ñç“(1èTy û÷‹XÒâÒ\2�Úǰ‘�²Rþr¯Þk:†ïk‚„L±mÆ€©ˆT6Ç*X|áFH69¨ÖBjœäuGÕš�ÙàâÒ²Ås��€Z§ ÄÅ̬Oi¡œ>×1µ³ù‚)¥÷¨lþÌ.WFH\Œ˜B µbL!²ä+@Ø;3Ë~,3 ]ØNEÖ¼—ó=â <³¥k'0xFÌÚp¹ zrS{QÉxä€úˆïܶ›�YE:M›|î÷Y ZÏÖõgT½âÞ.Bi=ŒO붺›f5ßH–’r‰RWëý5w ™_ÉxÖÜpê:„¢ùƒxH]ÜtÙ‰€‡�Dáj±1 ’Ù³ÉÁ :ZÙ(•-1†x_8Ú”„qƒìuöžÖí9wGœ%À;`~^V!-„ƒÀÛëe`<Ú® «¬°¿¼O6§óAì³ðñöNŠ˜ùœøp‹›õÆ3¨~Aq|„qŸX°dÉA}§@K]VBȯLS‰#†6ú îÔ"9S�õ‘¨ÿ.#Í}¡§2ˆ šhÛ�>›=ÞãÃ*¨ãÆkD-ƒÚó¦¿NàR2xF‡ê8ÙO±B®¯X«%…±.“‘æÈ¥Õƒ6ÎôŸbCX¶éZìbäû,ggnÀ:éšÜË¥ÁÞÙËZ1õž´Át9½xj,[ìO�EŸ8_ýV– º}=Úõ~ \A�¿=¿t;ü] wˆæ'Àç!a"^[VÙ‡ò¨]°ß™7<(ŽîzÍ5ý¨zŒµÔûÁì.ÑÖ]úiX¶Øƒ6ÊåÌfÆÖŒ�h£ƒœz<9nMk>Öd`2RßÑO%Ãøça�Ü;¹4€‹ý,ÈЫœ;ß`ÛéݧÏuÝp�’ø“hσ€bùÕUx7 ÔÔ†½8ž]€Èû”݆ŒœÀlÍ1Öm¶ç×{O¤åb°{¥è‡Wk·«ÆÎÛœ;Åÿt 0Õ%a9è†ée‹‚F;®„[{ïvø ÎBX‰÷ÛW�²’ œ(¡+÷ €ÎFü^ió+ Ún7Nj“yŽ`&p{ãb:Ê:�T,"XI'½c)þÆg%É{IL-\T *…ÖéÁbbDò�ï�ÜÀýÕ™�´Ò6§„´!©U^8I'½zú`_èq=¶ ˆ\+`ª÷Íû½:™÷m^Õ›†«O†§.õ䟉 %«¶Ø•ús’£ cüÿm‹‚ë |öú­Qª¨¹/Ýã{ÅëB±oíF ²¡nÞáªVEç±*%ȵqn¾=xîÍ‘\˜:¤¯ÂxAí8g…_ªæóÝCƒÜ~ögOÖ/Ô!‚Ö·Ö.0¤oëÃaÍŒt�ÎåŽ]¼ÓëèïôB÷r)·v@[â97{}ÛþÔ´/çÎp9ý?{ ÛRõyÐ\¡·lÃéÙ츉sè®mnÖ$š$LêMÃ] B�hBW€]† §üBêÒzp¥ý±cò¢ŽºÆPãöjéGðl2ßj³½}`“üºà'žbܘøóÚFYV:GÛ$‹ð1Y½ÍPÍK$£Ÿ á›kÌ+;çmÏ,7…¶VÊ!Ó…óƒ#3Ä ^Ã� ‡rq c›J)»Cn]7Ÿ«ío9À[‡Êã`DRûO6ê°$KØ»{Zø‰¶:ŸÔ£¦FÁ‹Žòwz°?íc¸�KwêI¶_[© 𥬂×uGò®£]ð vÁ­tæEâÿ•›�1Î-$ê>ÐNé\,øsXp@Çq«=®KòómL˜3oÂA>«R4û+�ðɘÉl,9Ì㾫2»üøÁ¼aÚ*î·'È'\ØxdSXÎ9.Ù6ÝìñS`¸ßšÀ�Á˜1¯‘KS(­4±§™³9fŒ¨Š&+Ñu@† Šø‘nÿ)¨0-öµ­Wß±òúº.П|ëm S�AŒþz›ˆöÅÔ³|±RJÝ\¬5²úá÷ÂÀÏ^[_Ù…Ê,3ÖÜ.œ ¹]·ZÁÇ“åÌÆo´ÃÆI�Çöaó‰ow|•Ô�³s±|×›ý+?_~sÅXTfÆÁ±EMçfBAà uª‹Ë~ÁP^äÀÙ›ÎS¡ë²¦–Wx# >2& „T¯Íu5âØ(ÀlÙXº§˜åÚa’†ùN«ÏÞ É81:¨S_¸\çkÑhÚîÎx bMasæ§ ÷4ä€DbšÅ\åD*ôо`õËþBòœxÎ_Ôƒè¼ÒÂáu½ Ñ{¨ù#àP޽fã|æ½-lH´ÞÂ}†”:Ê`Q]K„È—@¨˜lØUä¼½çXª¼„žíï} ~ˆKy­çÀgd}—ãíÍ•ú»„xGêéŸÈR gÆEÝ+5F.D”`ÍáW½˜¶í¼…ƒsLÇ÷1ÝHaõ9¼þªƒÉí48mˆcœÛÄø>E¡Ž9íKÚ_Ýœüø/H'AÔß.èN†?n™õ7"f'f&·v=Ø®µÒú­h»Ž›*š 0·˜8…3â7)ƒ€õÕ=Ÿ²_P`{j»ÊݹŽÕ6— ݺ†„>ûÏØóg>{?Îô®p|alÜVû’OD>’°yý*Xv¢Ì#äÍþ*Re[s’­h ¶a£�£ç5ž¨.dGZÐ]r×Û³“lË µü Åžî¼KùçA‰Ú–A•àð +Ä ã\ÚÒ„YGX|5-d3·ÆÌ³°p�ùv XüöÎá5nqVÿO_8ä›Îq�£œa8†sXw=X±)'»ÕnÖxÀÞ |ìàÊm4×ËiØ3ž+/¬·ÕëèzP±[¥#¯†(ÇÚG®"ßc¡Ï:tâ.°·íË=�cé]ãÒoàT5½· 8š1Fì œ}'Ìà@½¢;˜™˜à®2Ç0DÝãTV ú3Á‹Ø†ø˜)Þòœ ˆ¼ N;­–lA CI TÄ3LÒüOe+¶\6�Úü&ÖÊÒïé @BÙ†Fs 1` òÈÞMrD�c±>íÄcƒ"$ˆÌ“J0šØ<ïì^t÷ÜŠ}5~~Á�]ê°h·à,¢}¼¶:•—À.3Z ‚?8‡IɆàrÊè7´FžÄ•dÜVWë ‰ i ÷+ûE`¼¢&Qïcü“øïpS°œh—#‹ˆ̯Ëù’äŽ�ΪnëZCZ-•çƒ\Ù­ÃŽV�Ì@{K©;–Ân©Þã5òðo—0û¸ª.GjOpám›wa�µ4¾nöÆÎÍ>ä žjÜœ>w q3íe�؃öë»K=ýÔ#ÈmºyüÑá� föÐo þNCÁ?tð?´\êBƒYÊb?µ‹õ'¸ –\žqÑß 4\êK¸ômØ–ƒ8y%¿ åV¦}/¾{·ãYfL„U¬&F@Q˜g¯¾®6ì;´¥ÐŽQ»%,%�‚=M(.¸ú¶Ó®ÕƒoºœÚ4KûB~‚Ó6aØU1Ú­pÕMÙ£a®xöÚñw¬6ÙÖÁÞã`~Á:ø’± õ>~?C¡o– ´Ùõɳ r �°Èrü¡-ц=‘.A!^Ó2™ÙÆ4É”©n÷'¹æ8‰Ÿnþ÷ÊåcmT¥*,> Ïp»z-ð«°m›Ôî ̨¬Ü– >M3*ÁÙ]�(^ã×ÖvÖrÝËíÈr19ÍJmÉ‚ÚÀîɳ%Vsê/²Ùñ»ÜÔrŠGß +ózõûwOœ1ÆR%�• vrX/±›ûBº6Û¡o@Íïo`…ŽYŠ-s¦ôßUyÌËå%W–/5¼‘~ì÷€Æ&Eñ¬Eìåõ)Lh±ÚM‡u¿RJ…ó‰Çè ý€t@Ñ<9Ê÷è…ËuÕ‘½]˜#�~Æ7ïmëà¿Ùr¬¹{Eóµ~w–�lþÀÁu$õˇàWÞM„vدbm 5°åƒ¾Ã[¹©!Òþ‘ÊvÙñ›‘†ûãæ“´Ýô}̶Üp,6`EFQÎÞ +¶ª;ï�å›Ù”°»RüRi¥´ŽIta©=Dü˜fÈ]ò×tS&ÏÉ;œMc§ŽïµÌ08ùÇNâí�ÒK}kþÙVÊáá1áë±rv²\y5×{]@)æþÀ=àÖ¥Á³Qñ*F¾ú¡ä0¢7ëxÒ¨Ù@þlÅ®›·oQQ¿åsE çO ¬}jXì?òÜno!áòû`WTyKfA‰øŸ OÌkkZKE¡%¤yuTíÊ6Óë}Ñ”v MËÅ·øuÁ„2ê®pùáâ&šÞnሥáÀÙ$+£ð[ê’>-­ò)Ét,÷y÷Þi¼d¨Y®8«ý½Mós"ÄØ[U!I _§èÈÝ·¬¯ÙædX#ñ:ãíï®zª¢u8SèlÌ26SQ9Á‚J÷[ÊŒÁûAŠŽr t«Ë[˜Ÿ«šNuKÊJ]«s Çq R7ü{{Än¯VÚ}bÌö º�LÊ·¡ŒÚ*G…¼m@›‰k à(-Xk¸Í�þv™XïO<Ë¿èÊïÛ Åòð¨ËE@�¸²¯'NæHUmgß„W‹) ,w2{2õÎk B¼¥¯Ê®;�&uúêÆ&HN;bVØ^И îSqm³æ.T=߯€[â&RݹÄÅÛv‘t,ÙP±_ZQfûò‚ _k“8‚¡ÆøÉ Åî{ú�ub©æ­Òý÷c–òRÄYzÆÁ¡^ ä˜i³K¸Ó÷ä*a‹?úHA½ö'™�îG¼-vÅrKÆ\/'¾ŽŽø1=Ï‚ÆZ¬½³¸!¼¥•ÞûIkNjlÝ_³íªè”ßÌ_¥÷} nïc°¦Ã1SÛ Î÷¹§0 à4r´¨vÚ3*έ‹ü×l(­é!bÇœXϯÈˈ6³yÃNÃr6ÂN4MH`&ô‹n¥”D#xݤoòð*áXÏȹ¼ -‹+gm‘Ú¯<¾ð?šÎ2hT�·8æšà,e��‹ž>žàVÚ·Ì|gÍþEHYTÓ~ËkÚ^h@ÐâÜg:�5¸4Pux{ÓÆ^Åuq·ZÌYÙæŽ`€�Êú“QQƒ�.ä9²©!(I—Ü’ š……ÕÏ)ƒøt¡ M“4Á ß~áp ³ 'ã ¨¹êÚ)ŽÙÙíÂPÃ-ˆS™Z…½^qÛ“Óü8ôd0À« üP I“ªù¿yN³Hp�lS_¬˜HÙð_i ¦cšåúð`¥Ñ¢W F°OtmC}J#Bë�-0æíæÆ‘�=¢œÓ‰äßtíšjiÀ þ*L[� bþñxrÔýŒËs;ÑÓÁ­öo¤Ã9µŠÞdK+ž-é<„új‚F¾ƒ[6IP éh–,:S�š>@ªsËq2±•Móï§¾šÖ³k‹ƒ Ô‹ Ò™Š4¹ÚòYDé_“:«÷…±ˆù@lkóSbò«²•£>ßg¸ù ñˆ¹ÔnÖ†ó_ÅÜd6 ™Ha¦Í÷hð4«ŽÞ#Þšï:j4ª,a«e ]pçÆ‚K¿9l¤¡ê�å×€-=´gæ›ãnO·ºMÂ9ó ÷œkRÙ·1õþÁè Lž“—5'”Å’+Q¬»&. °êbc…5ZÄÆÉé–ês°™D|ì)‚4bÿfÄ#¯R¾?ËÖLü¶0œã¨Ú޼_¹rDª­<ä„{%|/ЦýÓmí¿1‰ ÔÜᜢ3°/wÉ-Ãp²|¸jüRp�Üêòêñ ð±èg´ïJ©<ý/ízî`ýàX†‚Ǻ«k§zË Ø8»ˆ_c9#Gu„^í¯¸í4Cn­-²4Û^®€í̘ZBÆÃ›™r®œÔÍ¢û•2i¶èQ°æõƯ‡‡ÆÂëp3É&Q~*^Ýmïkì˜Wr ñП2•/’j{X> [¨ œvtUÃ<´š9‘F3¾ˆ Çq›ç'œ> !‘Ñž·{(d;ä¿1ÅÙ½ßjžáÙW ÛªmÉ{„èƒT„Ýþ ¤O?¤’Æýëã·Ð¹ÀzZ6þÉáô!aUƒ<“¦°!¡…ê]Áñó°ú°Åuð<÷V fÀQD$vW®_DÞœ%­{4öFÁ:²1}§Œàg­BÏB—ÀÉØçìëZš-nln j|bìYlH7n«<ËŸ8}BKl ظRÃòréÄ"wª �v›àÐ 9DˆíÕ>‚ç;½ˆ¼Ì‚Äód™Ó<0û‚¹á³s¹Kzª]Zëê4uKpì­râ[Ä)Ú9'R+‰ž5(¿JâªNÙNMFÚ¥‰^„]v×TÜUZ’ÆXÌ `ÑjKW,ÉÞ·.ÿ>Xg»–“¾ ÞÅH�áy:¼$7rýՒ˽{#h…¦5+)]Œ¯9›3h1µšI€÷ꤻß�ü'¼{ïi¯æ]òaf? „¬ÑËQ"ÁDh"„(ÊH80´ëœåëF&a”8Ä^PBO)}ñ-³P jD›xÖAV¯©NÉ�ˆï·+¨Ìd0;FÞ ahk«] ;�7ûŽ›ž6K nõèÁãK!™6f3ºK˜,¦33!Š Zœý<`#'®�Æ–0õ`UKÔ5ªÉbpb žó�Žv|#—¼ž:»ÍqùfÅòéJ6¢+]8`Ö¬ë9ž)êFˆs[ÜBtÞq¹Â‡Vs‹që—0ZÑ™ÏKsTƒf¾ò76÷;H3Þ £ËhÙãqåâ-dè˜É´�XC�IfÔ ¦Š€çÎwAæ–¨swk_„O U£ÐQÅÿõýѶ=Œý2{ϧôO…¯Ížþœ&P$ù 'Á'ÁÏok�‰îu÷ãÛ×>¼ýÙ>É;6üÜ�ÃØžþžä÷;™>ÎÇÉ�BOb»Õ�‰ü†ž>>ìIôx3¹'bM\ÀšO“'Áž/óÆÍý~~œa2OU’S×®ûõÎß]ìõ;íÏDìg^Ì�M>IÈl±öIõÛ—'Á÷ëòðžä÷>ŒÏ¾¯ ù2DŸÌá�ùîLüé�zü¾xÏ®Ÿc£ÜÄÊw<÷|>*g¹Ñž‰ð{› ÂgG­g¿–yY8dèòv3ÜßçžÛ;”þþûdú-`OnÎpÎýG&™xðÌžäšfgïNO’|Ìú'ÓÛãïã¬ñð÷?„îg )žÆz3„ìMôÏûìÏ’ILú-ù¹Ñ:÷÷ôl!8}ß³<„ôÎÝüÜðD�>N¾ysÛéŸ$žLÏឈd¼2™I—»'ó¿VpžD“LÏÂxîÉò~’O®ï´{.tIü&tdÞ£:öŒžæLø$ù=ÌÄžß9Ý;þ÷Üóå“År�÷ =Éôf áÏ~î{^×ìóñós‚g~ãóåîdì|ÌÒ\îg~ܳ‡¨ÇgÛ®Û¾L˜Öy<ÑàŸ]ã's'ñ~=y²ÏhÌ;!–‡!…'ÑôLð_‹dú$òg×Ûìg׿nÞ=úëÃ>–x†NÞ] IõÙÏ$/o­ò@ÀŸG¾mž^v=¹œ=ÕûãÙtÓÜÓ7Ë�Œxæ~'±4‡Œ'¥ø={½3γà“àÏ_Nv;' <ž»³Óùí¸}²{“Áè§ŸLö'É“‡Ž'Ë%é�øça"}“ßÏ–ä{9µŸg�ù¹“Ììù2Nž '÷!Ýν[ÛÓ>G±ç{9Û®öúú½�ôüvB9ì„ý?L�3‡±õáíÔ�½§ógÁàÄôg‚}“¾°~î7ïÛsO²w¬ù<÷ô^ýžy{ž€œcôä?‡P}¾¾·=y~Žä–ÆsÓ÷ážtgðÉògoküÙðg¢û¿†J}S£±=õüéøö|ý?gƒà�'c<&Jd÷>=?§¦O$Ÿfx3!ÝÎæ}ý0?†g^ìçœÜ@7ädš�“d€ˆ¿…D6ä ä�à÷Cìg¹4Ì÷'é�ë%)“¼$ø?O:û�ŒçÛ3ÛõÎÇiÓïwãd¤ <’dþvfOߟžÿ;“ÊÎŒg–v3¢y$ú2Næ}'×ï›7ãðëgK!î¾îÂ{o‹¦}þûÙèÏbNäüúp)‘3'DLìsóÞÌ÷ùêþ{xs¿Û’|™'è�çï�ðs|ÄÔw ?›eúù ½tÿ~ûãÀ‡ÐäòògÑÑüöwéÉ:øùöüü/ož×²Q÷öýëœ=*êíÂ{¯¡õƒÞÇκ£×«î`°¹k4> lÔä-œlÌi¹ÎçÃÊÍí%¢.Öh2L›7H‰94ÆUñÔsI„dÊv÷]Ã�0¦�øwð£âMìâL0HNEúŽ£§Öé¸C`�xbÓ aÊ¢B$‚m‹õgŸÚ©�†h ŽáÕ5A°^¡¼>0û:ÃóÍ ]BÒ">\ƦŠ÷d²ŸÚZpËœ€êKúÓB÷ôsr$ܵ�w(#¹‘Ù9•~C¦lÙA„¶ã³G€#šÏ-x‹–Ôõ_®âÒHÓ°6öXÏè|ÜWÇ"bb%Ÿà·WŒ9HFüA�‰¤Ñ Ó…,ïGP�n $@$.°IˆçveÛä/Gc}à¦~Î:/¨ÊVCªºt¯RFø5aNB�¥à Û˜K+©í1¿Û=±êÎ6Te¶ðËmé/øiƒ;½¬YÑœ§Ö­‰µÏ8¡ ³=� øWZ ôî°NC KÛoµÀ =no|–×z yrô[ó×Çzž_õŸ,Ëk‚J¶]‚ŸA€E››È�2†³6LÁ¿@ä'Æ o©\ þlU¡LÝ3eh!ÊÍÞVÏ �ð—‹aøA#u�û› ­ òƲގy²²%eÀ}í�D‰ÆËd—xøùhÑyœ,V²t¶mcfè?dš")Ž*ÐZ.C›®°Ù~p;ØÜzw˜9¾¬ú¸HlhJMw<ƒúBA6ôË©Ø38ðÚâ¬�n9+]£fÇ*ÕC³zÔQ¿=4Ž’5`Ã…\œÌL,@îîêOëÒKPÁE›{eº¿V69ε€Ú €ÃØ|îŒ=¤Ä)1�Û7jPË2ƒb¶Œ(N×Òž6_ÞÝÂ9ËѯÕ;`^:µ: ‰IÅÕ�®¼½Ñ²·ÞrgŸÊÎâ`G�ÌP®Õc6y¬Ã嵟5—¶¶ÄWžN÷Ÿ·�Ös‡u_²,ÓmkÈÆP�¸ÓéÎ=î£\²ÑÒ«…#Îo¶«ogE»Trïm%ô€öXärwÙ A†÷.ˆþHVͳØgmЊB˜[ÀX?'´Úô×èÙHø ±Ò. ¯°†Á= •@m²¯ØÏ­n§[gÀAûôN5´—öÂÅAh‹ô…×(p½BŒI0à0aE¢�Û„»@ÞdnxŽÁYj/˜Áìòé]Жø—Â�XyÞBƒBrå”[f•$z»Õÿ¹l ›*¶áîú‘ äßqž˜·X&â=‰ŠQ 9R1Œ[‡û€nžé ê«žoÒ6å}ÜMZûÞ!�سvcé_wkÔúþE Gâàv*S*íŒó2é‹ß#°®»™k2ëáÒ©c,kl ²Êªˆa6”5|_ÐÈ\“FÐm œÇÊô?d(ÃïÜwPfœ0X^ÖÊ�Hh:;QNIYéa_Õx覹Ž;\öÕ…ÐÛAýcœ1½Xב*æép‹�éCWy$±RìJ7�0M½È708¡\~‘`Z0§°¹K¸º~3. œL« ‚鵫—ϳ óÝ6À{=Ó6ß&ÜÊ9¦S3V"ÁoŠônÎ:É•°0Æi´#I6l›SdAoˆœ>½ænø–|÷?¥ÕŒŠ#MãïƒÛº·wn2hÛ@šÙx°» ­792ÅF¡�öò!ƒ“|FxÂð¤ðìº(Æ[iÝ[}¨Â°þÚ]hCNY3£+‡ d«ÉÌ�ç)q¸—ìârOŽ8YÍ�ŽTëÀ²_ܼ&úüÌD­ÿ`|‰ q†\+,Tà×1êŸk‡ËI8ìîÉzÜfáÃZ½gÊ”—Íkm•£î9ö è.�Ñ{KJhÇš¶Ê1ªÒ˜^õG"¶KéÀ€®Áu WÆ6ø]ƒ¶(‰×©ÕéÄ�Ýÿ>´Þ¬°NþDà¸UáàxO¿AÇóèAg^Ê]yÒªj˜àã]÷1†rö¬:7ЀÌ‚uÉEG_kºõ¯=2VôÍÙÒÎ.n¥¯”qÕ)~¶3…•’‹ÈE·Ëjúd»’Ù/ Ä5íbáðJŸåJævµIgQiÎÁÁàt¢7ÄÞ°¬à¸ 9›]3@k@F]ÞŸªYÃèýÔ9ÚÙÔî¥*•Gj›K4Ü?~U¯X¯wýâ©´ÆoÄðLi´Kìã~8)i[ñ¬‚zD·ªZ ÊR¤:ÂۛăZ€ËŽ8´ÛZ+,7G¨¬MN2ã˜ü¤”ø›Î¡‘ŠéâO8vÁ³6ÏnÙC?{,ùrº‡�tÓó²ï¹Ò(9k‚z$Á‰(¾ Q%ã4aÕA�l÷¹<•ÅÅhÆüÐ�cA6>÷xZ’7À3¢HÙèÍÿÀ÷ÛÞ|5Ú¡¹ LÃ�Ú=î’ºüéW"®#@t€a’ïHñpÕj]ï¨=*iÞú–Þ—Y‚sÛ É  I¼fï7]áœ# žÈlÚý€Ênqëøø§õ¿!®•ìËÛ°'zžÕַ㕚Ñëwea 5£°[kh®é«ãwûàuS‚Ày©Ï¤É­«,r·W»…ȶ÷»r~“[°ÕOØ×>Þ—gÎP‡M[&Û`�-ù£B@ �Óâ¢ø$�…­#ub¡}öÑj·ÂJ„_c‡“ʨ2DZÔÔÏ6 v=ñïPÇe<è¹p°¹.Ì·§y{ò÷'ÁJy¨®ÚÅq`ú/¹=Z­pp«ÊØ=~CC…Š7 „‚¬†)õÍ«P²¤Á6zÓ¯˜ýkîÌ›°gmиG:|`¶âÈnȧsÁgœ¹¶œäb¢ e|Þ¥Œ¾ËMÄ„âk}�¯°õ…ØríÆ,a«] Öpæ³!¡;b È£(�¡¤yG±Ë‘Ãetæ|lc¸¸Y–1 žLiÂ\¹£v3ñ_Î"•V[¥–ªÃ/‰Qo@�Ø‹bT-÷ŠÊ<Þë¨öy/`ªßM.‹Iψ=ó‘œu>ñ)äJð¼=œ<ˆÖ_að¤ÃTMÓ$î~#ùtšWÞ°´êc‡¼;°Ý}0uDîîî_9Ô=“xÝðdæXÉZm„ƒNƒÈHÍÎbåÄ×}¬Îìw̾‘côŽ®°½¥Sv°XÚAñUÈ…yÕ² ì9—†�±nÅÔ°%$@[9Lš:MFEœL öd,'Ý=Þr¥›á)ÃqÞOò´^,².h&ë˜g)d©Í5ÄX25<ÒA¼¤4J€kC7#£¬¨\pÒÞRæÕ:±ÞËV¡’Œ¨n¨0�«-†õŽCclZ¸K/:UYÆ$š2}²Ý…]@K-mfûR ‘{±¤Û”ǘo {LE#Žõ²y ¸w7€Pº�Œ«n ÖD’YœAgz»[cgPˆ‘�u½ÑaíÕ«.ZÝÒÓy$5�¹­ ¢Š+»_ΖÝåÛWŸ½¥ a­ò ÀÖ}FN>[»›cˆŠ)ÿñzØï ÿÎÙ+@Áu¹Õ Á†ŸØ£°-bSB ’Ò™UíÂJÓh[nðB€_å¬îÜ”ú‰8}«:Z�K÷,=fèX¼èêw¸ÍE‘@×EnTxM¡; /\ÃÒ>rú³ ¡AÔvn ¶³&š]°×}Ýøš°An„·AÁ»KHgsXj¢ îõm0DZ QYòr1œÍâç`©‡ ·fì›Âé‹Q¢hFK¬ˆ‘$Û[@cÎT§FÖp>^mŠí´4Ø{ÝþÞ&ºFþᾊ„ÁÌ—e�%L ë×µ}ê«émððCLò�÷9kšÚË!™.°'Âëðƒxobð‘ ‰ Ñ?¢Ko>ŬMÈŽ£)NdfyA‹—²Ìz²#à�,Ù{<¶ ÔW4„еôØé7ç!ˆ&�­(�ʹÊâþû{Ö7B;œi õ³ dÞ'‰‰½vý<üþt®îx¢ž0uƇpDR�z¼|F6L•ÓŒg“UYŒd‚ß;ŒLÙþæÌ —n.¤ C˜E™$EG&*«§•tuÁ�YÂdz²Ñacä5i´Aó‘.o÷$yZÎ8U¾:�°ÎOA™¯ YÙÏ€ïè™oÈŒ-6@ÿ–mf`]mÙQÃo�‘é’øâ¤`Ãth¾¸ED°…܈ï£üG½sjûœ“!¥à;=ãø±¬3ÙE†´<ŬPÐêXLT»yɃN6ά³”Tãµ~lÈCO€>~²ij‘³ûw \÷lVç "%Ø„-ìÃÉè9®¹ßYîÂAö A‹´}p‡^§ËêÄñ*ŠfSÃ:¶m¡\•> C-¼œ©eE®M�5‚ìN° F 8Ä)à~K—©-¸+) !ý=¼4•­Húí¯,‰ˆlÇt²‚nój¾÷�Öúqb{g@Ù PMä‚TS´a ¾|¿œdAĹ ãÇt4tic z½ßé×&ë›Ù(È!…Ûkxâ•蜧NÚœF±xHÝàiÔM´Ìf;²]µ~¦á+éÄáˆo©�çD8¡‘`¿pþ+{¿q8Ap�·�²—T×Áỉx�Òrˆ;f.Þº�ësApœµÒÁ n=¹ª³Â¼¹¸Ù.ٜƤqûð~»�Ëd—"kC¶=)ã éNzëšR"‚‚¼ß@R¿“ Ñ�aÃ@ÓÂ}”ÝŠÁEA�5ÈAùÁÀEF+Yn¦èR²Êë“jz è>5Ü(`-%XÚ¬ 5¨�Ùjþ›øYÞí£öù‰`c2LCA€“™ÛjÝܬLXã+†óP?¥ï¹+AÓúÑÃí]7T„g›°[�÷SÑ#”- T]•´­µ¤~0g ’l·( a8(îÖ™5­’³U‡1X[§ }½ã˘&l�¥©M§q%gÛ�µivqºÕ�œ²Èap¹ÔÑ´ªÞ2;ÄbÚФžC•¼ ÅBÞr Þæ&Æà¬` ÎáÀìE¾<7!5‹ëNp¦ Mrd{'¾}öT'MÞ\7½Ãû�aŠ¹Ëƒ7®“wN‚v‚s‚Ô¡i•.Ÿo0=n9Kl/ºÂÓä³û­GúHõ¬3šì›ôþÆ8ŠØçµcÊ8Ô°�ü˜·G®Å ­eˆÎ›K£Ôaæ–âšö«›�¥8¾P"‹‰küö1èñ—ŸwÜùô*¡ƒ.ïSä ½¶Ê𫶤4e!ÇŒn+ˆzèA~ò6§ŠÊ³!áCAD諎2¨ùˆâr&i½ÒEbÄöæXø5�azq&ȺüXö¥ÓG·iÅÇ ¼‹rSŸzûÙy7°oömðà|ÊžÌñÜ=F=ž*ú¾Y-=T R`É/xÿvó�œýÙi”fÄ–“€!×wÚEŒ÷\I�ïí»…\&ðFpÙ¦§‚z´êÜð[Iœƒ·:ánlÚm’s¥ï¡(Ю}âˆW2T.3¼zOc¾­ë£Ð;nVÀ|l¢<2­õ¬Z¡è,æàE¡PbQÑ‚V VÅœ.X‹2¿jÚ�`™Ø ¨e“11fGÔÚjÀ²­óíXu û<‚eòè õÀCØ e°ªÒ w*]Aa@·…}Ør&×\_&˜Ó ˆmá1pU.e�B–™r8X31¤*‚‡Ð[G¶È°YæÏO¹Ù—Eš÷éõgÙ{a¹Ic¹Yc Ë$=‹ìâ¡kÓ÷ÈÑæIZCV≎Èy¸YÓŸ,¡¹ÚrØ`°çhf¥ùQ1c{/¯€,PÌò\*¶)¡Xê›Ù£ÛP# 7 ph|ë¬Xßx_¡Mò�ß—çÑæ'˧ØoíL_€xLXl$Õ®œñŽ› ÕW8´×*še=VGÉ�ûŒH@E„K ¹ýg€l „X¬q�^G‘¶!½”¾K†2JaHÐ:ÔÌÚà ›)EÑ‚¦)lªÒ åÀÃ!’¾»sZÚB¶ö·f'½�Ùß|FŦ{¼nœ~+¾·Gû?c[`¸cžvøâýÊGí.éž‹‡úØíõÍ‹2¯íß ¹TL°t¿iMWÏc@-‚<ñ-³¸Õ®5Öª wÒ²DEŸVGÐ íö½–F%¨�¹d1ñ¿]°è+–JÆŠÿ8"­C¨4(/>U𯬼Op€2cÀßTòga$0¯‰\7_,amrÛ@ˆn ò79�©©ÿY;Uн®™âÅ8Ñ÷uN:t:º%¼ƒÙêÖ£;%/Ã�¬ZÆhz7µâ5gþ€£ÔH-<ÌI-Zp)e#4ÞåC'³¶ŠL—à!÷œ: Ô[râU�È9aÊ¢@ËaîBa9†ŒIŽI�øskÛ+7D¸†r•ÁÊ‘ûmíLªJ¯l~ÃBÊDê´ìw1x(릊@\#…è~ýûðïИÔe‹£ÕLH@�Ccã*DZ€Æ.tEtGW–@µªöªý=XŠ_¹ !`4“’è ÊvòÎ[‘<&„ŠqVŽ,�^l¡¥…[:çÜgïºç!2Bîíf,èãiîbþ$º¦Ä-±\ÁÛEDO+ ¥–€Øc$¹ƒ2™Ó’•XîÏ•ºìÉ…­/�¡°ˆ4`ÉÕ"m}L¾qEí–8èÛ!­-иh·ÒBêLnI­ú�ð\˜Â‚!�ßs¾åoð=ë ¨Æ 6 ò¾ À#_V”„ðÕyª¾�—Äád ¼q%«Hã*éÆr B›‰~%Ùʶ;%¢ fŽ™` „�æCAš[+­•ßàìГâ)²•¤àìpÔîÊ~/»Q�Xšú y.&ª¤Î×@�ß­-}ê¤]û¹¶¨E�þ´Ê‰Š¡ÌL´o §ã "{êC �€÷#ÈÕ�È‚×a8ö RÓ¡Õàç[™�tSv¬]3+úvNˆºBæë7°3é‘‹7ÐÌV[*�üzp/Ÿ?Ž—~Æ2@c¶P9ì­�,×›Tr†íqí/ÕÜÎcd‰*ë¾ÇË“jÒÛ‹±�¯×_:øâ®¥@:×^C”W³FÃtviž—@ñ¡¦ëhv¹Z r˜9ÅÊæünëë®Å¸šSír-˜ÅÌ�x\ÌÙÍ‘9ò¬ÉzKgá\%Ì+#YÚ&\_%W0úf–äHÒòÞ]ËsÅ„¯Íx·–.³¡ñ¿`+g’�¤b1ÜT¸·Q×®t,Û?ßc·ä!†A|ÑA‘Yîëžfí ,.…´Ößnõ¿k%\ÎC·‡ÍêÙÌ—[ŽÒÍoƒ¡‚Ñš±YIW…“5ôêÚµ40ºá•½dîn½l\RúÚJ/EÂA5¥X tã�Yõ1åG64âC ¡é÷5#ÚÏ“Ó_ÂÇûð~�ÂÔ ¯K{åÊlQÙ%RCAlàKQÀ͹œ5ºDê G:@b…v7œí·W-(%µœðƒV…7åàžÁ}]  äç]ÔÜqJGuQ{ËÅ�­~�ƒ(ÇŽÆŽ);lÊ^]Þï è=›•1«.ßiš4=JY¨��“ÜØß, ÷ãJQ7ØJv;”ï—`«@ VTŽ`ꊨZpi»Ó %œ,¶?¨ÞÁt %z¦ëY G¶,Tç2Ëñ 5»õ²±~šç×7¾&Õ—ò2i#‚�ü½À½5Iޤ¥/".¨I§ùÄŒÓXèy�p9³¥ Tš,ÂI‹˜÷е…y¦Hk;†M_HJÀP:P¸®Õ†ÌÁaÌ#ÎB3Âî@ÄÑu«9ALT½š�â-K6ÒRlr¼Õ:ÞÓ`µ½ðSw Tê’e%;±Ë+-påx ~b;òýŸO¼ý€ŽÚÌü×µ[N«ßG•g�Îjpƒ`_ˆD†æGžÒ0·£™[¤ ‘6ð¾$ÕóQ˜fƒ;�¬¹ùŠý#Ø&“è{ë5þƒŽ]K£¬K#üœ®>1„¿á³2íµ$“,ùde¾�;µóVÐLŠ4ªñ oZ¤-»½³)^"»© YúvöÃÌ×ÛôüY•ZˆXmNI�y�„léçÏ1A:C"È)þµÌÏŠ‹O|Ýzç^ýüs9¿­;2«e׆Vúˆm®Mœ_Aqr«"¿‘nº¸€ŸJ‡é}PêGD;N¢‹²Ú+T‡ä”ÆÉÜ�¸<-Û÷Ù£qu#È5¸ÿgc ëakˆZ‚l´¤7< 1¾7iŸ”�díÖ±ö˜=ߤ´Íà'xüÛ`”qÀž0Ý,À ž×:Gïyèœû±z�˜ðȳõ$}úÐn¸”b÷ÇÕÁ�x«ÆC0yu·ÂÐøk½¯v üŸœ• ÝV»;6Qo3DvÆ�ÎAÄ‘,ø  ï(PÊ=+¶dEádÑEs…]Uí©l�Zô ¨ÖóƒÆ jî’íh<"¢œ;|Ÿ@/w‹~K�èð„½�êÁ0 Ym¤,€ônø&``j$êÝS§!GH5d½µì숃ßÇðn7åÈTéI�=„²b¢­½2Ëßö.. jAx-¾û-šÜÖoÛ&ðH¼L[›÷¹Æ.�öC§¾jZ#\›Çæò}Oà‘ÂÑÉbÜÓè~i,ô×V �°²6Rȇ(Yœ�äy�¸èEr8qU(8¯µ™Q »9ä~WÚj±ìØäãayù‹p"¥P±íÈ •Àsg*²áØœ�b�#0;[Õ†fôº4M3ß²¦Ð €d7D}ÝŽ³b´œb“-ÉœýgÑZ66$tÊxËjæ¯ïO9јÛw +ÜBJu+¬Ötžúɼtõ’6A}HO‚’–H+¾+F]f©·px{3ï¢Ú`-^ -"Ì)Ì >0m ÷;aXq–ÁÔF?~À¿¡÷’¹æÎvlTa5£@M¾¡†ëzLc˜{gEÄ0EËÜ%då<¥B‡€ù÷V€"„Mô•È­ƒÛç­wZ¦4ÐweŠUFˆó`Ë ¢J}ÂÏÆF þH‹µìõŒëxòù‹‡»A �G\óTi0ç»ÜÒ2YÛÕìÃF½Ž^Õ¾{›p3å~î;Ò 0@LŠà1е0x™-á²Ù‡Óò‰SÖœÌ3^‘ûqƒÃ]hE5Ù-h&—å'«!Žc¯gp]Ú¬`–Äs’kQkµO [.//¬_&@|InLLÔ>Ñò'Pãì_µ~„Šqž%ui²\3¹%«¿4�àƒ=[¢wÍüô=ëNù¢~q SO�Ôä<( �ø_žâˆ‹—zñÄ“cJL<]Û*j"3aSE¥3é-àcÏ»Y³˜Ñ•ã7°0,øøÝKbÄB83�Ý$i/öv ¿l-¡GâF¬â8 ofN×�š©ñ¯�wÎA¾â¹ü›ZÖH¯çÚ]ó7Ãl1Š`cƒ.l¡ý‰Œrúé‡|ýWúàV~lZø™Ä†ÅV–Õ5z]é%ã}œÑ{�8�réÔÜÈâ�vè« –0Mœ*üÅ®°éÂ2xÔ«D½‰Š!ɽ̿9HÍô˜­u®ØËÅç Ì_@9iÛ*…{ÙÜǹyëhÈk®h[sú A2q”†Ç§xÓÆ\ÓSk‚’E"ŸÐ / �Ž�4Hæäª–³µžgÅvb²Ü”ù€¦+[l'u»T^8xç: ‹â7¯t‚Ö|5-ˆ*ua[l%i=¬ wÚ—^} ¯s8W2‘}ãÕÎ Cb]F•�,†>âÈ1õ¿\/1l=îÅ›¨uµÖ æM¯>.òBð‘fM˜`ø±y2wßO•�ÍþVã ×ìç©[¦À�ûý»›]}`O�¾Rà€vk1ÜÏÇV±âáËâ6âÞ¹Sdï”ÅðD ž1¨`¨óDHš¸Fïb¸a~` ÷­üVQ‰-ˆnžîÂß-¶ò¶rmÓ.µ*âþ1E´-_¸0VZ9·ÚK³ d kPfi2N�~ó8rXÎÀõ)O‹Zó„4õ§èº÷*ö^ÓA‘=¸W›ÐƒJ½ ˜ë¶-€y ]8Âsš¶ì�lÀ†Üõ6þÈpÔ+´óÛmGÂÇ»)JÙ™\Aƒ+ϵ5ë#ú�LJÑaÝc’TܾÎÒ»ƒÄwñ�Æs{(•Ðþé{Eý ŠqÑÄ8.W�›�Ò?‚Ëš@q9$2‰³8³�ññ[WÀÿhåŒïy|N—TêÁИ±ÿ0eÜ6vÏ#ÀSÒmRD0g,¤øî«¤P/iL¨ Û—ºLbJF÷¬Zü²èuS�éàßuäÙ±ât¿’AÁ§��ª|&‰â΋ø½öêÒÇpMoF:«ü×Ê­½?”89Ósl “÷md%m¥°eÊ¢ «¢0gÍèJÏV@mEQ¿©,O\Ä&{rù¦ùÞ•p8ã�Ôåñ–‰JÕ•zÓœõPþéik+>ÝrÕ°µÌ™ð8'è]íæ“ÖCá0&�`u÷…>ÀÊÐõ÷ŒNØ@iû´úd"¨tNí¡Ï½†%å¶¾M’‚ ™‚i'XP]ÌæÔĶi&<±†>اÈ'µü,b`|8Cëuž:>ð¢£é'…œå?g7 1¯ µ+m ±#{nØûîs�çË‹�kÜgÃÁÍ*™�6eøÕ%°G’9“ŒÙÿ}iÄ]ͬB ¸à/F{¶µ ÔbT\,$/‚r°“0gË<�Õ�`ÁZg{ÊT)Ðf“WÞç­¸Ó3Ý„“ñ]”œ±Ã1½ÝŸœG†e%²à4³í^²¨{5$Ê Ë*b€É?@¹¬ гãnõ‡|ä²e�·‰Ät>�‘ƒ®æŽÒ׳!m “¹äs)ëVÛKF:Ž«cr‘sõŠÙÉ©&”2Ë¥ò”(YÂ"…d#[@ä–p]„0³;…ûrTËå4ÂÝxy<ËÅNÌ;VÝXþNšfN&ƒ˜¦ñ)Ú»gÞ"|ûk5h‘Ùø!• Qx9ù,¶<ï> =¾•¹ ÞfÓæƒ±„OäØkP‰+°§â‘…”4<Û DIŠˆ_%¹ ¡TÄ tÌËvsŸÕ’ø?~»¸hæác`‡1Œ€íTÑÁ[1|¦EâÏ …¡Bá‘ènͲπTt“i K[I©Š¬7„θÎl 6Imws-o˜æ§Su ò#TLw†ß…­¶zï¦Ð¯àvÕpœm¸Kt#fMÛ–°ÄsË0qͤ0Ô =øJ7(\·,¡[€ç|ûÛmk‚†™…Y×ÝžJ˜É»Ù2pß= �\öº_bÄXÎϧ‹Á�q›ÃÔhtzdÁÀ]œ—è¡tæÂß­µÖ¿#àP[¤œ7¨ƒíÎR‡ã×Õ@2¹ð¨‹âŒnd)­ùÕDŽX2Zk˜4©ÍüííëVò º–cäÀˆt°(Ô%DÝÑ*�C��Ÿ_zÏÔËZ>ÄÐ…}¼·s”vÝÅûzÎ2×,&õ;f.—Û,ò @˲»ó¨ŽxûUE±ìˆŸ})l‡6„‘ÌG72ßl™ITaž6{&èUsÜŽÏ,"äo r>Îç8Ôo8îö4¹yŽ ö‡`“Çh‘JÕP¸Ï®l¶þã&`ì�aÖ¢é 2‡‹&ðj¼.ù!4ØàÐq¹�â|¯ éKNÅÏq&9¢78›P³)¦×Bß,GL’×ô¦æ‡g!Gi¹'y`ó„ÆÝ¯uÇšï &ã8ƒ¾ÊALNAKB-£¶0,Š…Ú»@zÊñ~KÀqø;¨ p¯,D`ê*rY�5µZÿ‘䳃ÃàMg™gö6:’«¸×4m …À¦õÜkq�=Ä{T?‡Ô�Ã#±¶I�L†!3l€ç*‹µ¡)Èþ$Ɉͱsp¼;çC/­åv±pÁÖ•ì÷–B2!&=æã x›³³gVw�“�½£X‰Ž,´ïÍ%°·%Š¥QÐÛÚBmªaÇ e–éïuzŠ”íg ñw q56dÊ]陜d�æçT@vÕ‡S«ûWÐï|ŵfk¥(€¨°S^ ž]RLNv‚eí^"ÚZRÐl¯v Úhb–Ë‹1Øu£en &«¾aÚtá†ÄŒCip׆‡‚Ø®_–[ò怬¦Xå�. ÉdiX/´œ^â,Þ“ïQrNP¶Ñci݉Èó�è9aaPp²ÂmQ¤ÇFÀµ ±*sðVã"›Ÿ9bð,Ok›i©ãN (Lõ˜Þ2T¢µÅ¯v§‘–”!ÅÖµüѰǡom¥-Ô/›) sAEÃK@šˆ�^ïQ§õ´˜`Á¬‹ÖŽË&â"/P5�ñÚTÒPi¶ä:[”WSW¼;’×yo‘õ±o{´ób;…V•™„îéZÑVœ¦[½ Èë,EäÖÂæ}R‚U·=ï6Ó°eï9ùã«wÖBþ�éŽV»jEú×p©o BÕ¹8²}0Úê+YŠŒ÷šÊŽì,'pˆD¥_òÍ{%X–pBµw`UHZ¦ 쮼€èe÷ôÆN¯»cÙ¯Ž{äÞfÎ౤۹e}ŽVq.­h}Bàö»®ÉŠZ›å¦æy€–AEØ´AÙ„Íf*‹¡·¯É�•;ÛŸˆ1�C0à™”~PðùÁ`$9¯ß€ñCxž-ã~y?ƒkÝ#l²Í Þû‰î›W8 G¾xä,š ˆþ EN´%R>¤�MâÉQd�my«±Rv›ZC g°.|Æ? 8gCiãiv‚NYúô~µuN>ÆîDš× *³úEêº|r² A­±÷BÂý~`.©Nu bÊSƒùmÇ‹pc ‰ íS³ƒ½¤±ë�ÄQ'DðA×e¾��䜈WoµV90%åcÍÐü!JL’žØíØ"33ƒæv1>å§ž¶ÂKyÉ+'™d©Wè÷¤»äL�÷í…jï²S]-NÂú&=r^ÛÜ;µþòž5ù5D/^ ³Î%[— ¦“ «½<ØÖãÌk�!p-C EÂ=rg}óoù¡÷'û oWm�!Ášó*ëÄ!Éí¿r2Àÿ„7Yôó‘ÅmR¢¥»ñ 2†Æ¸%Ì…BlÚY“uýƵm F6á\„®�Bܨ¾ÞÜêG ãÅê°�k1Í(6õe÷QÝÙ.>Õžjà5žŽEŸ^�y‘¸XL´ƒeÍ�tŽË®\¹ówÍ~òHß<~„ˆ¦×æ±=æy»¾Ä£Æs8œ×Ödí�_åKÅ>’XÔg¿n�ßM:6ßÈ�s©f=o)‹àÊ”µ8·ƒšÞ«õd¾°oÝòù’£ö¬[÷Úkúˆˆjv¾ ŠÐõ¦¶‘¿‡¹d±‚.§™»ÎznnÏVäón“„ñŒ­ªÝÝ.˜fõœ|çË™ÓUÍzvš}bA}ñgdA´}Ð+šw3Ëì­ie×È�ß:@[•Ðêæ>ðð+ÇÆÔOº¨è0jçk²Rï�lêýIØ”zc !WuU[u—¸2{z*Ç™Ò[®RE—Ò÷9í½Ì>$ŒËoÖÖ¤¯íú*;Ý„�*mÚÏÍ<=ôÓŠ}o_z ªä†‚&Á߬�rΕ”Àkž°° +àÉuð?~èpŒ4âÝ™èšâãÙÅŠM—¼?œUWÝÆV‹ßxV\³° ›~ç·ß‹‹ÉÑ©L.> ÏD �²�¸±íì#¹ùV$ÝÑu:[ž:û µ]LXÈ:ØEŠp—q~P�r mm£»ã±õ‘#eÄ@Voép_Ú„Á› ÿÓóKý–›š™¹zÛ_ Nrá�ÚUÉ7÷­;ËÕÓl«r,DT<Š‚Ž;ËP�épmÔ‡ýÄu¾•ÊÉÒœßÉO˜ ¶ «Ô$Í6–ß¡z÷¾¸Ý|²Úÿ'â:¤ìn�Æ%±Ž¢ƒe É´ú²Lb£±õmîËtVÇtx['Ö×0»¨wá7·I³HBjirƒ 0´’|ݱ"S·w#+tÂú¿ƒ+¯T˜^#N4<ãa`oØÐ Ìð`ËP-�aÉÄ „‰²<cÛ¾dp?1´"à‘˜ð½ø¢Ì^ʝj‡·j(0I¹ðçy¸[ÐQf�$EwÚ`¾s‰a¦…™>7ħXÈ Œü�‰�”AüíÌ&-ªIÒ…—8Hb¬ L×Öõ‹itM‘zoëù½Ÿ0AàÐv-t[¼J�wiYp<[[­Ãm Kß™:ÛÛöŸ{¹àD¿UÓ+ùŸµ6l¸ð¼ž2 Û)ƒž”Bñ@u³ ·Sì+'¶÷ÚÛ=úx„Í(d„ŒsÒGÖ?_d™µ[|[x‰]'’‡pªP�2 ¡R= µôTÇM!Þ\í¬tÜ2P̓ƒ ³hk?�?Ïß¿pã•ýÂJ|Ø4®{—âÇ0œ$Q>Uv‚òñЬ Ö÷²S{¤!¸oÓ¬å› cò¹µ�~Ú'.(÷ œ*Ë“Z†ÒË Ž²?ŽÑv›$–(""ÇýƳ�¯›Ûû•ØÚí%Ëž¶ù…ÛEüƒ¼ä(yµs–>k÷aï{¡@á(\mnq’Ð\—À² ‹ò#ò«†˜¼)¦«¶Žbœ°¯»7;žry”wRÔþ&Š«CEH1›v:¯ò…{Ðïçñ"é|•æ*ὯxEÇ�D¥Ê Æö0:î›é.DÎ?hcøiùXr›�òg|^lÎ}»ÐaŸbyŽõOí©k«�æƒØ)½ål:m&¨8„(}ð¤1ñ5�¬�ÄÍ�Ó¥�/˜¸† ZÃoÅå9Õöz•9ࡈ®ÂuÔ¯¡(1�ÝËÆ»4~ìW>� ·Å‘InZ[lZ”ɇÚ^] €`�ïoÙºèq9²ptÉTì `ão\៺ !÷j÷Ó«+ ¾PêäfÅ•;ŸÂõãOòv_yø±œã×–êg鑲¬ƒáþŠț”°ø#°™~W o«ØðÈÆ5+·�ýÜŒÇg$ ¦{ûè õ÷ðzˆ¤Ÿ6²ü�;u—Ù[šûèø<ÊæëØ…É­&mÿ^ˆ~ðöût ÑHþ #œvög^îºg±4„<O¾žxç¯?]}ç€Çú¸g‘‘´”Û32Á¥©›_¨9@ÑäßX°Ð¸mÜæ'L_T¢¦uøqNèäÑ}íì¯öò´¾3�ÐÚ¸dË’æ×³ ÃØZê®st*ñÙ8ê!¯nxô_¬¤ÂYÔ†òYc+5òÂ+15¬íÈ~®×³Ùq0¼�Ï®KYÆò.˜9â\�AÐp½éi¿.[DeÖê_é,ÿÔ|8žf½]D,?±�\\ž¶öåòàQ Ùòø*í¸¥Õ[³–Ç·x»Ë&·ÛÂC7tÙ5@‹{yJÒà€‹x¾áº]OôRñ”3ó°à´Ñ`¸Úbngˆ«MžâŠ!2 Ç'hÖ6­“//dGL£"¶¾yœ1–K-7ÌÎu–¾æ 4‚/…<á œ5ü.P#³…³Ô&<öýl ȃX7®JT­C¥Ø–±¹c¹+¸©Q^Éy™`[‰ÐJ÷¡Ï-ët%Š~“_˜³ŽÐìå×ô]1\"<�3°{Ê0¨—ÎücŽCÚŠ)^Ä«râ­y€õ:¢Fp­eA%…išÅ€°ç¸ÑžKA›NÝ]´> ³¨pþ ÷ ª#D'SŒ¿nAÐzè$´ÝÆt•D‡¥O¿}sˆh%¬Ý…vWî–€ìÓã�šwíqƒdÒ·z•¹ƒÍ¶$µe|xãJ(ïŠ8¹ ò}¹Ö�OÜÚ³;¸¶í;¶º/R& Ã¤àËÒ™  F£ŽÕ®O �ÿ¿ß¿à ¯}ØyÝ\%î¾ð�³c&Vç}¿%9}ºï’5û݃íÍ„Gëĭ̺JOÔ±>æÜýôŸºáS�FÑ÷\5€Mä{o*g„}fRpÄ8zز¤Ùé­:Õ=¶íjç!ùŽÇ‡o[.’…ô¦ŸÖsËÐùÝÅg‡9$×ÙF»áP¶ë?YYA¥ƒüûÒ©Ûù¯´÷f=íò½ü/Œ}§å¦}sø£‡·6“lTÂ'1äΡൻ©|Q>«ìÄ}ÌÂ00åü,áW^&g§Ð40- ·uÖ^-X¬yúÅnà<õ«†³`ñ®Þž1–Àg™nl X­©Ë¨![—Màȃîô¡;…>cœÞRøÇãZkù1ŠyãtqåSk¦Q�à‹3~2OÂØsQé¦%G�ÊB—è4«~�ÑçöÞÛBÄÛˆD¶§l’Ò?w5 {¶Sò%‚|mUÙ¤hÖíGôZ˜—­~±»?x3’‘–3: =¸L³NÄ¡iÕ—àš‚ç­c²fSlöZºª_9†ÐMkXnéæ�µ>T×奕 ÕuìbÏ Tš±Èôƒq «üW9› $§í9&w¶µä«nD—çuÙ¾�…e»öp´LÓnm|è@¾×†'l0Š”TêŸ`Q^â|³¸®wÅ\%çÇv&^W©¹•"¦Èäkêe´>´]5àÛ?ü×€öÐg(ö៖ "·W ƒáñîZL›É u§hÑ9 † Š~Ð+}Ï,‘ÏØÒê²®Ô; ÍJc¬ÓQµÁôáPƒ2éo¾�`®µKöïg+Xè¤sàäÐÔ€‰!õ,¸S‘+)ŸÂAf°€ƒÆwvaUæ×2뤆˞â-ûé;Ú­ËÖ÷êËâçÍÍC}ŒÍw; •Òº•ßElžjÞwÆ0ßchÃocî„ÇBØfTˆ¦ÒT¸â–Ðl’Ø‚É$b~-ù©‡ÔšßèÈÏÔùìPÜ»X¼#‹à¼å9ËliO‰…}°)¥ýÈâK.Ͱ’ÉÀôÜ£’¥˜7¡7ñæÂ. j¸èÉ“\7WS+V8 ¡hà­>p¬–ööOn&Ÿ{,utÈÑmëkÄàp—|ŸbüŠq„\“MÙTHÜ&æAŒó vdf²dI‡'î4ÚQ&öªñž…x®Á–7=‡]Ä“êù»p4Z�ÀXæ–á‹‚30¯»‘¹C=¦zú|7ã[ñ8ç†ÐaºlåÈ“Á£é Üì5Ð�@¸`] FÞ²J™ëg;¢Á·T˜&Ú“F¹¾4ÈQŒ±¢/õˆú¬.;íÒçN!)»˜>2>šäC´ß“íµ['šÝ¹ÔT’ áòÖÂ"}%u½Z6S?§á êûàža‚£D1f^t Ð7b²’…ØîÈÄu7÷ª.ÃÔXV‰µ¬a»Ý'­]Ýÿ4í0�G—¼ß\ð5!5¯�RÕ�¿z·€AÅÎ �qw“±ò-ZfüÊÿp2Nx’YÃÜÃ]¸¯šD<4ønb49÷Í·r�…:1€GææUk-õfµùÈ< èŠZgãé°íø¼|àyǾÀ²û𳕞öKü¹¨EpÑ}ΤV}îãÐÑú%>±’ÌÂ&ûK÷¾Ç°ï¸u 5Èßàƒqóâmçëi½¿»ø!·|…?eÞPûÝpäǺ;Ò\òZÐ^éf°­b¯¹®H.oWÏ”q£ìTogöÙ�kT%ËP]5¬—zo�ĵ2;ú ��Q1Îeƒ•l@19êî2 ÑÆn­™ (\n5j·rbÅÉ À´.šÕ‚C`÷Þ…ô�×8Âf¸IÓÞ3Ì×Zú(²1¬äÖ°È_¯eïs˜yBs|s*å;Ý�íÏCUSû÷àûÀ?~ùj?±nk]Þôg5Z[ ‡¯¿ŸN92Õ€ž¾9_‡h¬íW0ÙñR1�Ý­‰VÌÕˆ°]·æÑ‰*ò½£{hõ†X­á´ôº ðö’E(Ü�µ[h g>£}NmÌ{nGذܙÖSWx+¦lÚÔž\ Ï+.h¢·Ê6 }”K5ì¡é<ä¶ ¢§ØÞs }ÒÂùš}·6ÄnNµ¸Þs’{Zû15C? {¸ ŽŒÂZõ•„] ê ‚ 0}*³Z©Hpá–ßwgF×ÎQ¸f ÛwÍ›Î�þ¶8&’�,\xÌÕ]Wp�2­u.ß[ pÖí’³‡‹ÚêHHnõîKÜ‘”õ 0á°™2þg}6pãøÖäjã/{A^4)Æ`½i7µN¥ß‘ê%°Aa¹&Ððµèò  ?¤>Ãîä ìÙùÍ&D!îH aë-ò*9Ûj�Ù9Wº Øâ gQqÃ|{“Ø/±úøŸNXƒ‚PaÇsÓäy7µÅÆÐél [ùµÂÌUZˆ4ðr2¡qiþŸèMlÖÂ%”@ãï. Ö…­`]íXæÆ˜^òxXŽ5e_©\b郈0MäFLeXźýÜPþÒfT¨°yLŽ˜c‡FJÅ‘M‰«‡¿@[â;8f/Ú¿bNmÚúJE± �rúÖZóö/CùWw¿`k3Ûþs°™¡…ºiRÈölôß\ã=•Àjylöïaµ÷ó÷€Ñôôv¤¼O±gÆnà�÷á.RùF^Íã×¶¤“äå˜(a|é»’Ú“—I*«”…ÛW3Šý„˜ Ó´è¯êj*�T²_$Ê¡d¬mJÊ|d!+žð úq¾,ÔL( - 8 ‰Ï0Dæ¢ D²Ïj÷,cN˜Ì4¼îZÍm8¶úÓìØr#á¶KñZ$�Ò­aás“é0CÛ®‡%–î÷Ížv�Œï#FÔ»˜sÁGÝ0ýbýô–#ëkw U¸ÖªúÅmö$йñ~¬ÐPhµÛAá@¾|*üÉ‚ xe­�f�Ñ[ΩYú˜ÞC¸à™@j¬6æ•wÅ…÷y¢+L)�ßdÒ—2å¡Ý‡]kÌUR_02%½Ä3GX£[Ð^Þ¦ªÊn;€¦´M^¯›˜†ÔyÞ@Ü ~KxeV¸ÒÊF 쀩Û�— ¸D‡0UÝá ¸$„7½yq€�†�/ ž˜®]‰50XBŽŽBÉ�µ‘ÜG5 ÚiÜlƒÙKÏt}°nc¹SÚfuòQòØX‹ A ¦VîÂÕàêöaöÕ¼/Ϭ¯“�Οcg|jl ÂA}kêù€XÙF¾ 0jM““­7dvëí8àšÑá«.@¸$c´6×͹°ê~ú"Õ¬…¯@×Bp+&«Çñ[û�þd‚O^Û7u@0Ȥ‘{8A  ÖÔܲü?£ì–ZÞ|óøˆÆlÏfÀMœÖooHЇ#Û"ƒ‡.I¸ü9C|p7+éZxZÆbçR’;±‹²›ˆiö¶}Ùž¯A¹Ù`+…w&$w²bXð‡V‘œ0#\%‘ ´ùN†¿˜­c²3Švt0¬}ø¡rü. ȆœÐíÈðÕ”ëXÎAרN*ÅÆ…÷òÁqú²¿P/ÉEmVD-‘taµþ¶1vA!”޽ó”è™á>—MxtšFø ÊÅ6QIPÀÌ„Ðø SKEdÆt€W¼f3«EÕÆ·³QãqÄT7G¶çÊV˜{)j£‰¶Eà˜õe8¶£õ¹hÔßF'­2˜4‚ÓȵUéJÆ÷VŽìñS Ûüìï5+Ä�Éž9¸· Û§vò…µGN…7«XóG'ÄÄÓ±>‘ðù¨™-üV¤5€Ç—Bæäk+m/Kô4nÓÜ’@;š¢[àJp|§2V+dã pUo»­çÆÜP˦°˜ d ×j6ÓäV;i¯Ë­Q/ÈW£vÍjN¬PCkÏ\ú ¿} Ëlˆ’祼·ãø­á ÏåÝÍIÓ¥Ýsàû¢ïH=ìáa#¼f%S™d‰'m�wSå¬ð¶EÁešH®òŸ? ¿~Çi‡_VúVãÍ3�ïSâÆ*‡‡”;|*æ,Á‹Š/ô|`Ù¼Žªœ6ùÉ -Â.n™YÀ�ÛógÃIÉ2ãTè+ Ÿ]Ñ4t÷þÙ×h;8og!¦oá:�C\+|”6’ë}à/ÖwÈši‰þ% ªÅ�‘3ù«<|îöb®­±ðTÄù’ÈPtvÿFôº¾v™†ØÌ 1‡ûx†sThP _u)z-GRº×K¾R¨(²'RoäTÐ8ûŽt‰28Cl…ùáŒ46&œ‹åþ·¯¹ÅcNP¡ó4!ó…Ê0û8aëO±uÝ|/g&¿ÕË]\÷…ï9=Úf{vKÊë Í}æ*÷¿: ‘�AÝYœ#Yù®¯ˆ+6ŠÈ?Hj|=[s…cà9R½ÏA.ö¡[¯¥ôY|mcèpƒ”3�ý-X(7{äkéëýõû>¤Ý¾âŸâ�'Þ� ê�âË噡†CŒ�×Ûöï ©·O~ÌIN›™ŒöE±�Â%nÈ›l¾,ÑwJs�Âìãf˨ðË(ó[eÙ$D[B×p’¶ï4ÏšªÎ�!Q¹,Ü\Ìí$ßG}3†XBlRâšÑY:䯫‘�æá Ö¥Ÿœ ÷®˜âã‹VòCf]è|”ä=‡ t©}÷Íñ‚� âN[sn¦�xž6m8šùuG¿4p’ Û×þþõ¢Û£±z±‘=Âä[�JWÈF› e"^†�4J:한Á#Oa|éâ5¾aý­«ÿ`½™Ùƒ_�ªV•®ì"£æÁ¿yc áõ`Ã`ZûfpC`µ ÍäÀ¢?oT7ù]^±öô!*�±tÖÛ~óXÓaþ§sm×›·Ç×ÚfƒTÀ² ÁÄõoÀ@" ¥|‡£-þ ²´Ø‹¾úIÁ Í;õ×R§Ó÷œTú“©<\pÚ÷hû»û“ùí8.ª§„v�¤,xÈ;ysÕü|ÍëŠ�7S’†ß«ß§dp?cêIL½¢l�‚1¼x¾Ò•píréõ5Â!mËàJ“Ú ‚ØØøŠ°º]a…EßYOm¹Y¬/Y¾ ßS£ËTçøš¦qåî鯌Èe‘@qÈ÷*Ш,4�Q¥m�}µ�dPßß5mÚbÄÝu L†¦yœAMì‹à‚Yï.HÒ[R†¨± –0ÖÈ3- ײ�£�`I¯´s'#U»o²e½5Û†~ÂÐÚ �îYd½…QøV–]-_uç@†pyÜä ×6 «*ΟÕOÐ�8AÅúÀáö¥³3y,<:ЫHÎ9Êì2¨Q.µº Md-ã ³×ÚÊõÖgÖ»`øÅ¿8{8®Ú\Â[ŒF>ºŒg¦ “hÂzlö�W§¡ï¢†á3ÊUoV nÊ;)ácó ñ/=Ãv­6‹m•m»Ÿï]¿c˜¿�Ã;EËùç‹×Mž·{&yÛY§qpW#ná¬1ÑÍ8P«Ù÷vŒ. î—’¸Æ�¶øÍXIP��ú�*ݯÇ޾ȥ?02ª8`s‹l$ d×M”.*“ް%&‡äÅžG«¶ ràvÀŘ€ÙîªB—À‹Àcò)k]•bî$.IX jÝ"º¿ï߀Úî e¼ª:,gù#tÈ»·îÊ{ 8 úK«œ‘X—Ó@z5ƒï7Žøn" +züf]… Mü|�Îq@¹¼%@U��ó®ûD¹© x·�ÞƒŠ~qiKÊÛŽýË~ ÷xž£@u~¨PjNÈ?¤mƒÌ?Vô@œ¦•ø£ˆúÕ”‹º´è' ܲAÚûêæã#ÝP¯¤‚"YæmÝ€Ê|têÖ@hó´T ‡%vãÒ MsŽÿn=Ȉ1³€ˆ4'$úEm–n7 ¦ @¨‹X½ûq4ËMZ„^«•h°&ÚìÏ[µ_[¿^ÅIµ<¥²†|ô™ãîéØ±Ø¹Çx.u�òðòÛPʘ’ˆ¦kÌàÍæ´éCKAq„�1h(Ú†+ åõ¬ðî9y§Ä…bR÷™¿Ã˜Öµ@vP/W}¦BlØDS;I)±yf½Å‡´»á™D˜Y[¾ y°#~c~%Ú v×eº{MÆ×2yÍDV¨r÷a¯�”>uÇ"™ÛÍ.E<�¦žgÐúòÑ k'p²êt8RDu\`*Ú¦¯?Õˆ®Îr«;4Ý×0åü¸å“š,8eó·Å—Ó!Á˸pÃö'u·{W½CA;|±úb½œ/¼Î<Î8èÈm²¶«Ø,ÜlôýZ$M¡t¼¡~¿Ýû†Gz„Ý|½ÚµÕ Ê/Ûú…””ÐŒ™žÕ··káiZ·ƒ·ÏyÎ4æ—�C4žÇì+m`UL~<Ü=£-Gíº°µë%ÇÓ<ùJõ¾{Ç~ËÏ‚éá$ÅÏ­àÁ¶,m\p‹}æÊsq�6�˜jˆ{Ë8(eßuѳ%ULcèGÎdÙÑù5tÈ\+puÎ@rx8¢ŠñdÁ‚{òûâ9ú!ìA"dÁôÞðÄ7ïËóY„:à^îP»²Pî¬ÊÏè³1»½ƒxeévVÃ_a5ú-�&‰‚4 îÚMt[K»&Î~çÊË߯26wñîðp?A~‹ Rhÿr6�ËX@>÷­¬@ˆ:zSuµP„´ÇuxÍôŠEÁ[ßq=.ó �Áßþx*¤†í+RÏÂ3ð3Ì-„7À0¼PÅÃè¶F ƒÔ{dŸ ï¡Ë¦Æ­§Y$Ëòçƒ×}îeîý~Rj+œï¡Ÿ“€å¡Á]pLX~ªå¹XEî|ÍÚÜ9’™`U@ÊŠ_çæ1äª"ç’«·»/%Û0Q»N6›Øf¶g¼â Aæé¡/&†C�ÛãàW({sr,µXP�û–Ž4?ª+Ä'áM�ÁVÜr�U0Ù›lIÉÆÙ‡U`„xpF P6¹�£2ÇOsPK~�ì0Kª¾+A„K—¯�‚ áïæ�žGÁCâÞº®l­æk2¾ê„µûÂ@‚SÓ 1tKÅqøö�K}{Ó™KâoâbÏø›ãv¦ÙzË3.©œ|›ÀÓ[ϱlƒƒèy¼¿/±è”“Y šŽWôÁMÞO–™…Ë#xSz'ÐK7âŽ×æ¥H•½ÈÌ  ôœX¸!»bø¼H<�`~-­/ö.V:PfæŒFÙgÆUKÕRh\t1Ç8sËñ«:P?ØRÓ²ìÏ1ÐïeZÝßeìëĬí¿g‚pê¶Ê'ÀÌÛ+‘'f •õT¼msÓÛs�%Û“áK`3åŒù½{óõä†Q'©èÀw´pEµâ%½Ù`Û‚qEÃ?¶Ö†)_?®ÊØwȦvg!)¶)»Èál]»ñÐår"ÓƒH-¤­^øµÜ¬Ë ¦tÝY©­‰®ò]¬Qc�±Œôû ÆÀëº&M~+ƨ|®9Tø�ˆÕ_§AM[;…-gìoË÷ÖÃèB2Eág¾Vw×Ì£ÄnW±bL½Ž–‚;Ä„/p‘OZðˆ¼Ñâé´ÒðŽžâLÊŸyðàÂîM’°iÝ /:P‡ý½pUüj=N»ƒžžû‰�›2ùš{ÞlX-)ùÉ` [lmüU�Œ_c9{‚G%!Ïì™IœÕÖÁ.£�_: n°GøÓ¿¡;Yðbh%)(f6 øDƒÌùÁöÊß¹qÑå¦ÒæÖ­9e}¿¤¥‡qAß úº¸S·ÁAÝ(g¦K6 ½Ð—w=܆OyÍô¡b•[éz²—^ŸÊ— 9¾hù¿}�ã�áÇ„é½ûTŽg:Â.Wâ�ÜuÊóË0÷ç7‰üüáçG5 ÊžO¹…Åò¤ÍÉÊúûVk©dm7xíãµz4¶Nëű‚.ô´ô¢êã†[dæ§õµãÔÂMžnhÖ?Ù¤ŽM—Óòq´Ã ÍUã;Õ» ô<ÝÙºA|Ü-Ž{T=vˆëª@ÐF�kXzäµÖá$¼ÚçÍBÆL, [{›Õ–¯àx †½Ï ºÛ»ÿºCÌ;n�¼ØHvàNZS‹ ²½|A­²ß÷"�3ñEÉ”ÿ[›H™«Ò…ùooU¯Å‚i×ñúhÑÓ=†‘kwa57»'eôU�P ãd°;¦œÝçå?sŒ-ÀðÉü¤4dÀ8Ö4{¾_'öùÒçf°WâFÁñ*{1 mölÎ%ºKZ-3Ù¼b_�ÙíZr j:²nAÍD's:_G³,ž½¤0¦¾–î>Î*=².¥´ØŸÂ^šÖ?ðfT ˜û_[e­ƒŽ“ aׇZ˜ÑÊü™Lò1µ�qkR zo…سÍ8â‚¢`Šñ‹ç Ì\�gí9ªèw‹Í_˜nÊùÇÑ… âÓœ< à›@&<Šº0šÀøµã×ÞÂ3BYߌ³ÀÚò™”¼Ñ·©.#G‹ï0¸aÊ”ß`˜úõâ&¿©ç30}ïêúî²°§�®cgÍ ØÙ2A� Ä8µ …Жü†A’Ÿ¨kMr2©×vh­ÍLiSTGlß:�ÚU‹8o}€+n°=Ÿ§¹³!r�tþ²à^Au†«Ì$�9q�SÂØÁû7´lª§)¯/u_°d#mÔ¼Vlòè˜�O—ZÇsö¾nÊoÁ^\Á £†¾+9"Òóí¢‹’œ¥Îûû2›¿5wÜÊ…ëfûXîþ·LH\Œjˆ@Ô üjžN D8œxÃÈIc!8TØ® m¡¼êÞa3ETð-P&\#—¨ûZ|Èü?yûC7$É+Ãìkgè N¥¬âþùW’‘¹¯ovSÙýë+뱬!w¦ÀQõÔ[ôh[×…ŽV9gš‹‡‡œáé@C¥³¡°@g¡L£{ùàÈ-m¦y•|w~ã3)‚è0 †ÜZßTÀ1ùJ¤ç…Ôçg?µé-Ÿm@²N‘õ`T�Á3îî}b¹Õ­cTQn�ž!!â�çíÁò xÿºå>±amì½ô/¥³ 2¾ßÏÜ{�ô_œÝ•j{dàö•è$ö–aîÌ ÂÍbˆ2Ò�cjöCÝšŽ›¨k×T?j”€ÓÖ`]„äí¬^ÏEÁa·/G W+ܱ°�ϰÊêi\të›d¡×àÇcÜofKµñøð“3’Ù“V:‚o퇥$�†Tkâ/"R"Àò X\CŽtþÁ;ò,CM‡çY9G™h¹6^kSg�¨1õ–Øï&r p£–A‹ÅíÌ£<ü€*‹zëa�) )¦i¯ {Šcƒ:kð!È-©ÍÝ ¶aUó‚Ý€$!Ô;›’`H 眇BÓ=TÇëÔ°õXÈÕ„¹Ïmd|§RQÑ8&i Eç�â¯\ä‡ §°í¸&Ÿb@xýœf´P{' LI¸h8B!{ñ$°×„*—q@ë›*Øq@ã÷E»G·¼ÌÞS›°ovýªQS (ƒ`«™§ #©¨@+›±=×òeRqæ]/OkúÿŽ�ÓölüQ¬cW é.„ô$Óg4ö-¼3b—ܰýJ€¡cÒ¼Ž'`µãî{^ZÈO²Ð�M|ËÁk�÷\ˤk’4b®—ãêdsÓVªáBºEʼn×õxÁmöκãLwöì@; eó°ö÷S|Œö�KÅÚ.¦pýwÁá# �‹�‰•Ê;¶[ä&ëÎ-1¥‘4ºý{N‚²G–K>ƒ°Mwˆq Ø“×<ÝÌvõ9KrO})k:ÄS„XéõAYM-¥ÍL÷»s>R 6ÓRgkÊ&]y‘cÏí,\&E•‡ŽZV,�Æ`'{éP·9J }ÌÕÖûñÎ=Ío(Ë&É»±£¢qé—‚Á›`·ú×݇4¬bõ6úØÃT ˜X„ï$æÐH;Œ\n°‡7©`°Ñ‚haEª°àîâG|¸w¸»öÓtœ’»Ž‰om§W>¢~lšcº*s` »L&Xƒ À9Ýe“öµi¢+úåÌð¯[žì±Ë`ž@´,ొø,u„Yç‹‘V±|0r7$öö'ûcžøÈD?7èð¦Ì �¯v,pVäųe©²lr˜pÑuïé è9R8\–¶àbh`óÀkhšÇíü÷ÙMòf…«ËÀìÕCð^�Xi¤Ö�{[åq®2,‡0 8Ø�‡»ÉÀÌL‡'áÞ‘€õm¬þ-Ì{lÛøAhO`lTJæ-iFoKýº …Õo—ø_4@ <"A+Žâ$WuœåVäß¼Œ÷Pí.‰Ž~Ö¤•ÓdAf±&Â…!-cÁel"1ql3On%-2óöyÆÏënp•Íä3Gn²Ù¯dóP±èHŠÆ2ú]–O|AŸwc…îôœÅmNº ecè•Ôú{«¹k¤î8%'‚£z+Â�Ãæ*‹!VÙW7祫¹Ô—'ìU_r8_ ]4Ÿ*†™ ·Ÿ�·à†Õï¡5ÝR,6¿$Í�GfwÚc…´Úp%¤b¶Ÿ+¬È¸ŸÆs0ìL幉„õr×'±dL� ?6­9D¿–Û¨êæˆÈÒ^ЩFÖ]sƒ!|8Èk‰6ùTø[júÑ\ÏD!@Gø¯†˜UW‹rWÚj� aFn­õÞpyÊÖQim¯ç”ÙÐ`ÊTWƒ‘"R8Kó§4×c·£dñsK±Ì R У²^ÎkÃkhº²˜œ�óq¦-YbEÛ€�„ômÛaVYÁ�ðXW9KùLŽÀLµ.X‹±tù�îq˜}Ñ~æøÒ7ÓØbÅ„ăœó\8ÙÙwI–=Öã¯Ã! æ›,zÞM›–H¦²¯áO¡¾ï°½Sî+'—¾yîK7äì¯d°Ñéay‚ÑÍfe\šaY.%—מfùDû„1°•› È�˜6D·NO†°+»:ã�/áYÖÙ ú™‚±挚ФÙpãäKÓ Û×ÒyÃ|ó)`ó¯IBáC‹•¹nÇã@ö_ñ®Êüß5�¹=Ováp»cB$Ûd,Ï}" …òeSV÷.Ø•ð&™ÏºÌºiGMÀÍØP‡£ßØpµÍŒà—ð í¦ôªÌ—Ò l}˜¶wÁßcÚ'Ä»Àw(›{ælIëya‹goÚIíçA„(À3Üï`ñêµB•ñçeôBJ´(uc™Ëx7ù„dqœ‘~Æ¢ÎLcc¸Wï•3Jj9É£ÕVÛÐtþr·]#]\D#Ëöuüa£f9Áo:h[zóǧíØôÏ×mž>èV6´N]®ÛËŽù“zôîÏ CÌŸLÇi}g,nƒ˜‹ƒá£´ÐÐO9ß½]ÞlŠ„ ƒó{†æÝuù†î*2 ´çìn•™‹Th¼Ó®SX8öMd‚Ä|`œ:º2ï†À ‚Ÿ\À¥;ë;¦Ó_&¥¯µæŽ þá\çl…¬4•Ì|eAðA“¬bHñÙ×ò3µIrNá6s@+ùNÊ–¾Ö‡só¥‚þ©!‰þ†‰R4¼ë;RÌbAXìE=CL×ñ°½ùå¦ö]to}öMòûÆÜ/«šòÏÞáôÁsdÛ·™DwüÁm¥'—KügŒý½ ãça‡�‘{�¶þœìŠbÆ¥v ‚¶áÆvL f˜ã]hLl» (BÙŠ7Äδ|~Ý»í}Nj¶;#¬8 ¢‹.šÌã}â’Pç&Èïêiwö0,VËj�`kZ˜M~u�Œ *ês­íbeoHs„>ßvÄI|ÉÕ¾¢ ¨ r¦A»2½FëMΟ,§4J’ÿ�4\ϵ,ªt í…}³ãõñ}IÝV½åÀ�ÌICåÓ„ƒ»È?jÀÃ�Öê{½Œ°‚ï¼@½-ᬿ”؈D@C¼aZb ½§á� gϺÏt6…™Q©4eËe�. ú @Ð5lÏS=c‡Þ×A}ÚöòóÛiu‰ÆôÅß>d›«o¼ƒŽ{>åÍ÷ÔŒ;¨ëb»�§G¦kIí”ÄÍ+†¬×DYí0|AÆãpêË çœn/,òa}ì!9áO»ûtõ›´}_»àÕÚEp¨#Ï©X~ÙÀ³FXð‹¼Ìœý›ÛlžÆr·Òà4móCW` •¦àeòV\Sãù×2} Ø埱oÕØË Hë1(ð-ÀŽzëÖ›–¶m<;½ÎYÍ­&:¡2œ­­ â> =øcÙ¾ÒÖÅWfkm0ÁË=ÚTô×IͯÔ1„Kº÷ïõOÈÚ˜"êß&mRŒ"œât\g�µŠïaºôaYb T5m› Øñ½›.îëp+o‘Q |ª¢;Õ¨íM’.‹¼TÛoj.Zç=ˆ—[41Þæñ¦ êw ¶åkƒN x‹ÛB4|ÉA¢‚‰ALDég„Ã6[e�K$]µ@P ±\R¨¶ä1ƒ·h49éµïÇË2´—ÂÚÎ(Q¨(B£vJööþlÂÜ×mÞdâÆw”F§CØóÄáŒöS/ŠÓnÑø ûŒ³Çx Ø/n “lw³Î,Ü2p…Ž»5ÄÃvf& [i‰3¨ó`sO„a_šNµ!zŠ\­ÆÄ ¼_t?‹š`±�3Þû`)­!f¦TC‚.óÄO' ̺KMýz{ÞwÍí^vZá‡È~-yÜc«wÌn®L1ªp½ôAÀSôè÷ öþ;ãGS:¥|b÷²ŒÝ}k$ÇhsöÅA[ÊO¸ìdÏÄúFK4¨–•â¬ì'w™´~S1Mê5�„¢�p?Oa>`‘?§YË>ëj½O™ß¶kº�Ú>æ¥�p ƒÎNôœö.ñ»‹yÀhî]|óe) €ÇU²Åh3ŽïzÆó!ƒÓÓ©=­WË,*߻˽–õY%¹²æ6T-×µ±Ê«è�¤n�]}„’‚¾"Êâ©7­DŽD=Š\[—ª(ÕŸž ì³2U¹‹明ÕÈœl ´Ö·¬g)+WH±n#Oît s—­÷ jÁ1Ë�òäByk®ÞJ<�3G¶Ð„ç~ÉÅåøgÃÆ[OµÉ~²r­¯y/Ÿ%¤uº8É?*¶»¶ñUvÇkUq3kOSBgˆÆ­.ë7ÍèM÷7ï�«"V Îì@¿üøçÀ¶mÆï‰Æ|·R¨”s�Øâ1Ì &à‚i–BÒÿ‹,vÀ‰¤~ŒÄEãìnëqøìdŒ+|‚s˜“øã݇¶›zˆ{¹«é¶ù·½&ćý?}ZØç¾.ss²ˆa«J–,HÁ9îÕ³_V ,¢„ø¾Љ‡ùäW; ܸæ=ë”ó!ˆw,}$ópÓá4è£Ñ¹já³e%‚ÍC —hÛrž‘ÓŽ‡—µ¹Åç$ÜG>N0Á˜lq„>#èÐ[a%åÀk‹¾_€í‡æCæ°ŠÝ»íþòÔµf¿¡(KÀô4×óZó±þf~t«÷ïÀèÿŸð~Y0KÑÍì•€ÂFäZ]~© {�½Å·ïwäÆV@˜bïDmƒ¬��POc' êÐâ^P–]‘r<íbÓÒ9P+jùò�ƒÂŽ4½•žíN{-Ò tA”>UÀcƒö�»&wsDúž‚çAËúÐISÌÎÊ2óq™Äõ¸ÁßeÊ/W”_/}HPíÂâ% ƒ'!".ÙÛäW$d ¸aÏš˜• Qvüa»¨ŽÖ1Û Ðù¸ÜÐŨCê¾£;°ðcdÂyP‰Û�t- °Ë}˜¡Çá;=¨šÐ“A}s®hÔ6-É9±ÌáHôXBØfë.1X¡›ßؤ³›¨z‘{Ã/5ß½D=è¿{n2:¡Q0½î~Ø\ÃZþüø?S©f¹=’ôùÌL-ãí¯¼]v€™ákô#U¥;jõú$!j‡Ù§¸9T;k{H¢ó¡ŽÎøRÃ�Çt¥_4>À õÇ›²�p°ôÌT:©?Å5¿yGÊ¢#˜ú•GI°ÅZ…-ZàŸ.Ç­ØñÝdz“E‘-çUʃ¦é žµ Ú¸ã=fâŲýËa€³Œø‚Þ›«”·UMZn·s9 «g™Kkèªn$¾H'y§w¢"×&Ž4ôdÖ|ªÛ-6ƒ[´­:ž¥qøãÃÍ(žè]gÇÄW­›¡d×” Iö~ìô\>ËÈcœLkaY2îFV® g5ÀÆÅDÁÁ‰«�]Ä9EHGrï8 ë®ÃæMcO˜«æ`F®_YË&!›6ÆÔòPÒ×Qñ…O”ÙµégÒ¶Ö°{í AÛ£Ä2[¸cZØê7òNgZìÇÌŠõ{þ¸ Z�<…ˆ*ëÇ ÂˆûC®#B€B5T øÃ4€³¯T¤Vb“H>´@¥ö²Ûâ:íVÆ�så £Ûá$|[ÈŸ%ß?¼3šÓä–`3}I¶TÛ¦‡”芅|Ï;«è;~ÍÞç4S�}Þø¢Ù¡§ÚæÁ´Š¥|æ\ö¨°à»9LTê×å<ø�÷ØŒN˜èlîÂ÷kÒVÔŠ]r3ôßëÏ]™àó½ %° ƒ-À[ª öû…O-ÞØú“šX-àë¶ðoߟ> "rÕq Ҥ܃¡ßÕ·Ó™°ÕÕ“9íšËq´6ú ZT?OÈ€`7Àa¬tÄÏK (2¹ <Ÿ*Ö|Ð_y­d3Ê ÄѤ0†€çyݮֵʀŽÃ\c\wïAØZ|d߸Ë(^c2*áG ЗÀ\ˆñî¤~¡Î’ʦ•ßEé‚€GMYK�=Œ{„'µží“]ðó•$z�°Hs(½l_Á–—”�ƒ¾šçíòþC7Ûo�Zs,If­jgÉèO¶"¦ÚoÔ¾cìnاlñø_–T=^ŒP�)k4â2.žC‚ãë„Oâ-þ&2Ö “FHÍŽ(N{Ír✹¬�o]«H>›K[ë“ã =+ì‚’²¨ 8}ܼö\¿ •ÈÀ\îí©ì •Uõq~‘tO¨AG­ƒì]$2(�8ÃSD^*¤Á¯bP#?Í-»·1¢6 {†uwb;‡i3Ù…®G‡Ä‰”ïuíâ¦tZO9*1Ä–Q([tÔøÁ¾f/þãµÂÌìí´,ÜЬÿg¿C6‚—™+°¨at:uû ½;Õ±©ä¢ßÜ¢�=®i²q‚ç—…sÖø|…äsì% |^rbgÈæßŸ o„ië�IîòBBrtŒ“U‘\½�Äl‰{赕ÓéÉæS{H°4_&.Ï�ë¸Í,xå•é¾8Óá;é$¦ìÀ£L:ëåøE�½Ó·­ºæëm`­~?º�ŒŒ„ï¾tDc˜7ZþýøöRcuüµµUÿ+m•­-V¦«[lµVm©ª–Ú[m´µUKmSkVÖ[U¦µ¶UªZÔÕkKkiµ«Vš«fµeVÙkV×àߦİQǪ§jlÔ?ÌñÅÒFmkÁ¯¯BÑ0à2‰È·›ª„áW.¢ÅgUæt5•âè(þÕ+X0`kÌ4”‚ˆà{&©²Â8‰1渄µk‚¢¨o6k9Œð•g:ž­¸œ\´õ‚MQ0…ûÛ,áÎÛ$6Ä~í*ú£! .‰�¶va¹=À`u—U'7²ÑßqŸ1Ž­ñø? .†˜ˆ ¶þA‹Üwº²ï{ún7ú}´·ÝçuKâ‚ Ü=ˆ(NÔ¢úiO§Íç)¸ó·¶œÙó¯mD}¯ÄÇe¯¼Ü°øá%& î¡¥�yû( rÊ…¦ödPt°þàî�¦täÓºÆd ,!ð``¨€øRÊź`þˆï MÄ"~¬}bÛp9= ö£|ŠƒçÖOÊ ´¿¼`†ö³Æb�¸6å‹�äUO\Ô#½ŠøgN{H…—B€ø,µãÑd6^ Àûvû͉}’ÙM†WÏœ¯S,µÇ÷)÷¼·²~;çìá¤ûtßÐè]hÍp[<�Kkꡎ~¾:=á¢�ƒa4˜¬~ü൵Ե›€¥®Ã5A ÃTé´YL„„IoUq8å¦Äçºá&µmÚUߚݭñß&7æ PÖ“’Òhà8²*É'õ…©²eœ²¾â!‚¬�{µÏ=äW êáÜY®fÙ0'îd«îÔU`õ®+ãâVÈw©?^„~z×ÏY,SãsÎm¶‹¼Õön¿¬¨C‰Ç°¡�àʵ7–¡¡Åºå%E»Ånî hN)�«Ê\ühÈozlP…ÃÞµ¯0#ýø5ì Þ'ß}A�,Žè§L¨-ôýûdÕá®ap* • ”Ñ}9ÉFà0™Ào(«XšÉC�^eª�M—[^¨£-O¥ZÉrå‹¢„›VÛ6ö™©¸=Ð$ÊÇ#ºC*wa °Ó;Úæj�qŽó{b.Ú×›éÈmwfëÙø õ¬l5dóEÀ¤³fEm’x#y²=�æ2†eéÐ¥2¬Ö—ý™äqtP!Ì£XlÓÃÁÁˆ½ör£gÁ­¯«. iZ˜�uc@†KÅjé5µZ¿ Ù³vëÞhŒˆ‚Zr Ľ(LsiÐl÷7gT°³|R�l‡­IÛ[¡C±€ñ{™^®;¶g~\5Ó�#µ¥_¦<}¸4Žó«5šåO˜!ïžFvm¸_ �ø€Ã€µd‚�€m88’ƒ‘ †ÆYˆ®ß�¹šï/á•)N6OdXßJMEfM±H ’lNDª!µˆrµõËŠ•œö57Š'€=»õ4�°Óž¦˜…ò‘zMhâN'�”LØ5Š9’oɬÆ,CAÌNje´y çœã%'!×-·u^, RÊÑ÷ßHÉdšA9�=Á‡å×-‹î§„‰òl½o&’ší¶~tùÖ½Ö÷æ‡*CYN8;»úÆ<}Lmb¼¦—uo“àR@rrhÂB lÊÁgù­yw…Z\d …ì ¥™Œ‰s?[RºpSÝ÷®”! ê_—g óÁVÝø]v˜î‰¾ÆZÜß9¬\À��ç tó®¥õsw“�ÔÕ­†Ý½}†»¬û÷¶€nDp©º½1Lj®°¸…&ócí/›J€¬Á¥Ä2‰ç,ÖñO m��6/“—ºõHÆt®‘Ÿï+íƒe:ý†M¯/Ü©ºýüÜ€£ .ê_¡iž`4K¹U˜k%lµ‚æ�u¸ŠdDøs\GŠ[5|ǾéûtŸ=İ<ÃìI¬E±VïŠËjß"l¡éê?-z]Ê^Åðw¶AÊc½çìÖG4‡|£u·XÚX“ãâç0)^¸~^Õšýy‚´=(¤äG¨x7k•ߣô¹YÓ3"x‹ÇêÔXéÉ‹9kÖ­C\ë@p}’Õ®è$ýý#�מEùg��â¼›HZ^±ÝÁ唬ÌÅœL7‘ÿ{渧km,Õ~jÌ¿!?&óׯÞ+L/£Æ0ÇÙÆ0²/�÷ª�µM(%Œw?ž~[Õçsáò[e Ì_qœèõö>ÇLßcíºæÙ~»wìÏågÕoÈŽËÈa˜)þ:ûà U ˆÍÁ¾ ¯ÝÞÚºÕò�»¡„útpµûÑÄ›@‹ð €‹édWc·…¡UèmxŠÓä§i?løõrÖ †g”Vµ²ÍoÆ|N ò%ÒÉ´e0]jŽùM-í™ÓB¹ßÔj�ˆ„²Õ(o ‹è,M{ûš´~�1w‘Ó&sŸ\3ΟTõÜp哨&Ëî–Â=¶ëR=ÖÙû‰»‚àAÒæT&u™C.w´õô•Þ8Ýl§[�eÁ¢dLôF÷°o']·ù¹^öwÜós¸¯¹dœnͲºÛÞÎß`ÙÔã5[º/é CP$‡ Õíx�'·ÇámŽ+—ÁZÀSp™ý¸*`{b•¤ÆœlXê�ÿfªòLÊVAé`“àVµ«×ŽÈð½à¤· ä߇¸·©ýÇæîÓœ)Q%íØ}¯s�aÙþÖ²š‰_ DW­j¾.&‘ “ööHT»ÞÍy¬®<dò·å|1Þù“8�k?››†ï ýñhªêóJJèJÂÜ ]’µÄg�ÚüÙ㈎Ýêõq=kM\éëb+MûÅ\2«…«Â½žûS¬\<Ûg¶ÿX‡xíçŸ :¶¡¹&tøÁ½KRöfýÉ3b×à[ɾj’KT>«²_Í`> ýÆó\à1ã€{S`Ç.Ú7óÓrMª¬}k_jâ�~‘'UÄ ,¾óÔ·œQ_½|?Wõ§²±Çµ¨Ce\ˆ>2å–Öá`C•$Ò9Q“I½¯HAËCfg!¥¯ªüŸ±gVКÇÇÙfl.¬ Œ Eß¹JXï “fßkRk�&ß>ÓƒYê—# ´-i{A^»L˜k¿»µÆ=�¯t<°+‹…á^Añ\¿«Ë�ïž�y¢¿–šâüErWЉ>:ãp+ZGÒ®Y­Ï_±á«öɧ&m`‰rõ  OßËÑØ§Ò¸tîlù2ÑùHï‘‹¹ðöWºæ¥!Eäû×Üòóà—W•ñᶺǗú‚™Ü#Eã:| )š0öë�«”U¸rdfZŧЛ>‚/ØÀ8gi¨³VØs Ž€s?]ŒÃ–xÅ­[¦tû;aQ÷Má°B·»BKÐv-fM¿Z5«6X‰�«ÛGnÃtÔk­®]õk Þ(§–šŒ,� F ApìA Õ#]÷v¯¾0.Pí+À+¬e†]5öäqðçÌgHj`#÷ &/Š.õjÉ­$FÀÜ�O"+å¬Ô-Ôïê½Ø‚÷,Ë[i:³–óÍ€§Œ*Ê”›LiTn�FRE¼ÚÙ†Œ0: þ`œóP ;ïø9,ù$‚=ë¶Í®_W;€÷\V—]ß~9 ÌÓ:\lÒ=[çD9„&˜$Ž”#¼Ã7á7дì£UÓð³\œyÝrÎÞC.†ÈÛo*r§è°¡ZÍ`› CrZú°¼xAi¾ê#”–ÒéÔ|íðï¡HžoçÏ€ `àé)'|@¯pîߦjÁBB£�&ë·¶7cS:8 Oöš¶’ ‘«®b[êìøÅ'<,8“èq¢6©£{÷mTï“ÛF‚øà8x÷8¼zª—¹Þ½Ô [ãž ÷?ú´û$–ý‹ì5å`­^š®°>@éYG{âÔdSA—ÍMöc¨Âh,Þ9¢›¬g_DÔDågGñLÞ]JïÇM¸§_Ö¾S ËàϑжnÉ_úÒ�£ëùûšÁe,ðš<4à�\j²Ç-Í‘�ïÁøâ®ýÙ±}×?A ItîÁµSÄÍiTˆcƒ÷½VÅ÷EnŽ3;ãuËsdÎ�–äwG;Èà=Ká0ˆ�º÷(ª;E•Þ5`iâÿ�o½·rYØ{šžÛn\šD’#X+Þ®›Ú�¤¼Tû‹šcÈ.eh=•w³Á“]½ÒÛ!5|â�ÈÌ|6×S+-¡-„ß0vÏyÙ `šÔþ&äz¤Ö ‡vopÇž}Fɲ,U‚ÇûéÛóÞ±Û+î©ào*M€<öô`zŽ[3á¹Àrj,åÜcógÊ!šY]‹H„P狇Mè®7iÆÐê û?‡®¡õJ&SBCZÚ§`AÛžøí„NÍþ®{ºN™Ç,½J´¶)U¾ÁØ1#cr¶”9*Í[’¦ŒPõÆâÌ€ _ºâMêÍLQíyt}R~è?\êÊ!Õwf쿱aÔpŠ)PJÙ\§ ¸³•ÃÞ/‹^¯v¶¸Í‘îÛ²º'u ¡=/`m4O6mFÁ àÞ�O€Gî‡ÔŠ‹Í•½õæíñg¬! õ•tÆÉ„¦{‘„)ßJ´J«‹@mšÿ°5X¶\³Q–« ÃþD<ô›¿kFd¿š5¾«ÞôîÂI¤²ß áúŸHNc¥Ôû|Òé5XaXbÎPÚ|;sM¶$ŸnŠpÙ;툙œ2¨�‰Eë›Ñàvçœ[vЮ'(lcÒÕ�vçÊ (uÞ]yIíq*ÞÛù ¯†->ù£Üô5³dAn¬A³wÍÐßg£ê‡z´ÕÇfMÜXOÕó÷ñáü_o©Žm`: _/½ƒƒ| „t/i½V!î‰ÌRñé»+Ü(vGÔwÕz®Ø¤7Ì/„ת¶ÖNs"œoÊË›NÔ°,Å«´ú4–Ô$�Ò cH"Zpãd§Kgò¼�ú"OÅŠy�ã“jjŸž·ž°BåO¥)EϯK¯©È#n½»ñé¦àÎ98›v±¾†.OÝ´0ç�ÀÈX`4߸ÖŠÅ)DÛèÞ¹4íª=ƒ«w޹ 5C‚Åâ-v›Ô´6°vuò¤n„}ét¶¨ëælÎÁúV ŸÞ –.¤Ž>Áµó¸ÅÄ/‰Ec[Rk$¿û‘Z‹Å ég5pàDü`÷Îok˜­{ ö •ä9‹^4qØóÔHzpŸ~©éqòwlùçILÁdâ#ß&q~ú}Ò.GD�—šŒEóxbjˆ9”—o<=ðï}; ²“‚Ü4?޳V$Dê~åé·vÀF8œÎç¶mÕÚÜí¦­Ä¯6 2[ç4¦Ú¢™q2Ö8~ên 2A.Ž!�ì-WLeÓ.–˜{v¤¹ÔÖƒÜ�•,“vþýèÝÃxÝ�W ”ktÈ ?ú»¿«šCÞK�˾�˜ÄзÜ]¶ò e>°Ce¸4´áeQ·}*öïv&Ö>dU«ÀŸÖó^¤Î.šʯ�3“ëuÿF(4 ƒÈæÚ›f™Å–ú%¬�®±¥Vœí�1•.øtXvªàSûo‹ä-Âà{qßF§’�h÷„‰w —~>¢•/ˆB÷rçfb7™�;Íß�Ýël…®f;3pypä®1H”JÚÅæä!b ¿Cqž >�À�ÄßEý¬l*ã<o8ü9ù§–KXP4cÒH­ŒN§hmÃÈs§…Z�¾á†ï�­ o,as÷9'ÓávcLÙ+ÓÌ�Š6” ç/릎ËOÂʱ#·�7n€æ£kÝ5�…ì .­~Þ3Ž GŒGáy_ÏìÐ�FaR[Áa¿žÈ©öSST ré•ÉŽ"y´Â>u=-ÓŬ[Âe™ú­ZÞѲ™l-6Pâ•y–\ô2úèm:J d[š½¸!¦‚„xe»šŒër�p=sŸLÆç^÷–Um›ªÕ×µ“�cL¨Ýæ´ñV¿šV( ü !°ŽU!—‘ˆ@u ñp#«p‡oˆ+ðà&Ê{Û‚åí²¾Êö²åBÞáX9©¢Tœ >ñ4{¶Hž:i ƒ4ÝíNºÇLÎSóžmIÁˆXIFwÙfûyšã¶ÈÜ›*ªí8)|{Dئ˜öÒ22�Ôž3kù+_fÚ¯eªå>Gè1á·19´M鵨XÿzˆÃ¹Þ@ìÈÙšUìCŽÃæãreJYd££°ŠõMoÎìÀ³× Â{D ¿.uSŒ �åÛæeM¢ÊºYoÕõ…¹˜k�)à—|õNÏykGqª5�îSv˜á³­Ä“^:ÂF­åŸžvhÿ>û é½%µÞÙ“"þI"§•Ø '®Ixòö­¶mp S Ml`<×.ŸJa—æ9½Ð±*æÏY�_YTgI:H,G…m¿@ŽšÛ~çðº¤.¾åµ-“Lªjî{× aíŠ5t†8Þˆò¤ÔC(Ÿvót±¹Z‚®b'z¢_ŽÉ’àà��çêÒˆcð2ó×jÌo{GàU�¼ñð\q>žwÛgM$tÒ6ÚšM© Áöæ«ðÛVEè>m<æ±{ä·æ;±˜b7ŒÂ Í¢�…ËRùÛÊîökè/¹_�¦ÔX‚…<\˜Àö ù·G ö~["}@€kÔý•/ÄÖÐÂÏr\Åùó?@—çqÂ�ÁÎ÷’P˜±ÝØ:Ò&MëöÂ'ˆÂôA½ ßà±S.ª±`ëÁç\ŒÉ®‰L)P9ƒÛ;½ç× =ß8¾”Zä5[Í·Øy�¥”íêþî“{¿U1Ü}Y§Š(§V1µÚ¹�+d½©iÖ<[«g&ì›2÷ïß¿ïÁa·([ë«êÜ*k´W9U:ڞņÀH€–“%ý�Ø÷)Í@FñÑßÇžÌ�‡h’>Q€«‡¼2šnt¹å冮 èØ ¾Í•áJHóE‡tÜ™‰Ð(…ô)�QÏ ðÿZ ÷hß 3q¶»¥L ¾™°ÀeÉã5µ;3Ù­HVú¬ãÙTd›N!s&ú!œÿ�•$ƒÄjü¼'Š™·å«ëÇ��÷ùï0­T›õdY«¯õªÕQ=ltSb`T³4™!8jZ–Aý AçòËØ²°'0­]¨! +[.ÅÔ ÂÇX C15Ú¡Áz¦¨ÙWÇ>m.µ;óÐk´N"äÔ•p'1Þ'õ¤¶6›�8¦Ÿˆ½•0¦.*ÐÂ~$Ëì¶0FN-Bð[^B�›ˆžB8¡›‡uºÕ´*s¥nÙºýÌ+JˆFú~•Dœ"F>—!‰«_‘Ò±‰ÃÜ/\%–šùAˆ®ôqó_¤LÖâ�~êmä•<‚vùŽ�1’ãAáÂågã¯�Y%Ý!é�E,‹pTÐxzjš—�·I)_kk�ÏÔ�»ŽýŽip{ùì—(¸š,n¶ Ã�…±v”í´�f<•|OY–/®ãܘµ¬ý޾-!ÍfRÔ¹röœ|— 2Ê,Õ�{Ú ÆEÍvCµm¤FóÕ <ƒùúÿiLAúaG¾Ö²§êú³¾™CYt(søë¯Ë»]~<§sJ�‹× 1`ë ‰€åæW¦ªÁ.ó!j·ì™&r ¨ÜsJ¼XêbÑ„èp¹ÞM‘²Í�Á^_u¹b×Îs Ú|ì8, M«1Æ+eí’•XuŒ#êF54(ùÐ(ç–^¸oŽÄ~Â3½–2§ÅL¹ÑÑÇçë÷Ô…x ÷qšìÁ%Œèu¶©Ò�Ú�@˜®N¬¡©�mÍX/Ëæ}­gYÆOfëk>x»Æ¸í¬š¨c²–ÄDËÞW¸,0P-ާIˆëhHÁæïb íB@ûá ½ Øã…»4:.¯e ¨‚ÄEÛC(מኽ@5€�õ#[²žS}ø§1.Ÿ¸æ3ˆß]3>†>q2)á$¡‰ø™V·Ÿ¢» 혻¾ìk;Í…kBÿ=å0(¯¾æ˜/­²¢a„õgIÀó%Üí…„ôÅ”‡³*'�ÙÕX4g Oqï÷”±Üÿ]å¶�zÇM©7¤ø3Ò�²PñžçVÞóäQQÜ«Ž9¾N‡uF=¢×TY²%#´°`�Мöž�,éö›ó̸q®•@ŠwMÜ«÷ã`ÊŠ”[^TŸ§HõYÛ¢!‡Â鮯F¡¡¹{^n`ô˜´+8ÀsD:bò[!�I¸z‹ $…õ’\?à߃ךGÎuÈï“÷dç5ynrõÕ qµXh²Àжb�oñÎk:lÍm¼ «’‚†PAž“ƒž¬í<œkM^Ú€ÕŒ>j©{áùEºgbC�1ßjÝŠdj·Ž²œcÄßTÈývÉÛ˜t^x€PW‘pšêÆõTÂz<òܰœÙÔ#�iù.Åu}ˆûac^Ƨõ±‚{¯¥zj;û¶ºcž ç>ÜNYÆ·’ÄÆ›î¯Ï·œÀ¡áwµ}Éé'Jé­û0/Rø“°+O]‡¶o³¹¼Æ9óáú1#l�ݹ6€l(�5ØG#„~V‚‡?7°vÔ¤�©ÀÆ�YöÌÀ_€Ÿ†UW­�k-ú`Ac Œå¥˜lþ¹ѧQ6ÈQ–à­·›¾~µç}¨{¦p{³#MéíÝÊÝn¥¹µ³qI�—Ò¬-½‡TîÈshY��}ŒœãË“Ÿ=‰YAv4Wª°©./ezMUÒÁ}Ýš?xhû” ®¬RY›J=l3¨Œ}ÇXŒ‘nà°ûc¾ê3&™g{v®ò:À˯\Ÿ|¾þF €ß“ÏÐÆö7Ù}Xà[6ó3‡¯(®½É�½|NyÇ´¦.§Ï§¾G´@ê>»ð²ùÙysÃizí?ÃøqóóË�¦½DÆÈ½·Jj?iuËãÜ÷]8¨a ½3¤&XEÙ yÚÈp&AKÊ5¹ÎFløÀœõ­Ýn­˜Ë�ì^™3©Ì5¬Pø) Ø'c½ îÈ;wª™¥æ‚¯d Î÷j—júâîÎ!%æÙükU/3BBM`B‘ ùZÛé¤Õ(4„òÛ‹ß{Hàˆ­¡ßЖq�žxòŽˆ-«m‚< ÜoN�;hA& x¬-Q°Ê£P0Ðô3!©Q¾±•ŽyI± Ζ-T$‡t:#�† öy?°G¥£Uèš±ó˜{ów˜ïI1i r}¨•u²g°¾5kœRx ;Ÿ(ñÝŸ¯W8•�²lwHr¸ÎJá÷N~ ØjûYk]çš p]„Xx[⎯®Bµ½ˆ§9;Ë3” ;ìKL±±zÓg(Â�w«`|q;tqq¶¢çÂe\Z÷ ¦ü•Ø pÌ3ÚÀÞÓŽ÷>Õ„ÃT Šh@»}€ú„lê ÔfØÀŒ¹öÉ-jlçѦԉëV ¼À¦„Uþv·|§–V×.µñÒ ºã6ë{•”Î{^×è鯶£Ae·›¸À’ ƒÐ òB¶6a«êÅšX™²{¯Á /~£ˆÞ¨ÁÉç³ $õavÒ– -?²dÓ=K_Adíô¨]™‚F^àß¾ ÉzÔ·ô0\[B¬Õ.¯fÜb¿X¦ýk«c©˜GÚ\ÀXðµ8Þ\~Ÿ£AÐÀaô0þª—~Z…Ï«Înù÷'½ÎºÚ³”Û$wfß#Øg…ø=Á–›:´x]ö\ŸvÐî®4_ñH2©pô‡„–¬ÞuÏø #QöøþZά�Ûš„Olž�w5\û°w([d!æ h§¿5vïÃ6ît<þº×i¾|žßç߈Ix,–hJ¶Z_8 ¿6î�sJ‹q�B& ¤ç—@ç)�Z¹È®(î¯èPd ~¹"Þ*KÑ>ðŠçl‚õÔg�íÀp<åi­û»€†¸S‡±ú `î-w¿ˆ¢p“ï|syk^¾{]FG.h¤¿~ýûð$gl¬ ˆ.ÀÛ‹.èýd'²ƒÿ_X¶�ظ-òàwŸ²›[°gvÏuïKh [CácÛÍ«pê “À™ø ³}5–/£mÄ\ª—¬ŒY…aËÛH °­‚à<Üháü^–(&›‹Zf_̇…¨Ü¥75ÇE+½©-Ò²aºïêäòü7iqLÚ8�×  <®y!ÕÈ>é‚FézX=ôŒA—’à[˜Äf¬øÏN¢¸¤Ö}ˆî¨N-¡ïÙñ=¿¶AÏŽ9aâ=…c~U6É›6*Ëa$ƒëa³ð<|2®¿¾@ã0j÷jǤ6vÖ”5ˆ¥cÔɇ^â«€)(æµXz ÷±{ê¦ HÍîE­­¾ÅȘe�Þ"úZˆéÀ”ÉÐ"’bs�_’�À|”]ƒ-ñtÑ”Šø3é:òVɃ¼a¦ ;6Z£Õ‹‘çgÅN�ææø÷Zýߤµ¥ûY°‚»®ÕŒØû÷ +u:Âp®µuƒ Èy}ëß™l†·…cv>0ç1 ÓCå_÷&oKÃaž5ËRcÛ[Äð³B‚T–aædø`¤ÿ¨pßq–ÎÑc@�<ÆtWÀƒ$$¢ó*¸‚/¹3Û^Ä©·ÒÈÜræbYßÓÙ.aƒÅrÕØ"Ö¼&L‘›\Ú A˜7!{Æ­�òô5�¢‹SäØgîû�ëêÙŽævjeÃ{QˆxÚênFî²;7ÇL=gÌÔŽyaDN-/øï©dý”o ¢÷Î Ðpµ"{Œ[3[ KúcØýáJ! 'Ï{û·ù9îÛ47c±0™çöµ t$ë?”ò&*ÌŽ>Ì%ìÿ]`Äñu.Ò*Å• ÂL¬çÛi;Î…Œ6œ®£�Vø¯Ï>ÄGîæóo|{Ä wa‰•ÜÏFSñ¹ 1&ãY°5ɇÕšO”yMˆâ*ÖÁò�öðë�Fâðh†ï¦°Eºÿbï[o¯dOœcìc�-�™Øý›õ©u¿ .YɶzÓÉ}J½õö«gº_x ¸p0Ž™äÙbopÐIÚ¯BD7«ÉCIZ«­ØÎ(á˜�VäòÏP«Ëà03´Âö÷h5‡²¸0bŸœ²f‹“`¬Ëgx^WFÐÅØÍø~�øB‘¨~ó5£˜ÀˆƒI4Ýù¼¶šîÖƒV·ì¦—1iY¶×)gø¯Îgmöî{v´þ­óx nbš)Vµtá‡)ôÍaA`<þ½<ùBTuOT:ø—ÜÜ…|ë€ûï?ß)$ÑŽÑYÏÛö,Qî²férc}{ÚÏ{¶àx”ªòü)Uñv™­«‰­Ö‡Gúûaà]y· Ï×+tvÙûx˜Ù¦áÓ¯sa¸¯_&ÑáÆ�x#Z×7Õ®å�Œ'©ñ�®°¤Ú>ÚÕX \Kï²rìØçº»KnÎ�9â8•�T3ţХÝÌIך™A\.sO�M?w@‡0–ÇAô´æ{8pØ#ÔØî¸X …ﶦ Ü(� špE†Ù½ƒaFHvœd^Kj]Þ�xÇ/s!Ém%v×é7{‡TX\§L ÀR*§€ø~~~4??1à–•'+Wh�÷îî鱪íþç÷"×Q¹"�HkõÖUnP-§¬Õ¯©2\‹aÆ£(°Àeo"{7óYBV`µ±U5ƒDŒŸ[«Z)-M{kû~F�“7”]bæÞíýA§¬&‡ÂC�Ì%ˆ÷à w’S,B–¬‘½šƒ 0Ea54;Ýe`„¨uz›Þ’so%¸1‘õVöef`,]rðÄ£:€"ñ'­—N…ç?[ጷÇ�ˆßÝe�º¸0=Å(ÂÌPàq2ia5Üç@‚m"-ÀC~]¾fLmÿ RNÇb‚‘ tÈ_pJ^ "µº ?1Ëm@¬�DζÁ;žMÕô¸eiÅ3uÐx ;&lÏD&A�?j¨˜È›�Ÿ Ml³‡UE.Ôñ˜X;»ÍvÇd<{µ`RÏ…K‚ZdeÚpĤŒÿLÚn ú�[[… Y-ÉÆþS}ØÒ€ô›Ž e{îí,t¯Ñ�ºI\ëæCrbî…�ÞÖIµßãq�Û˜ôaTŠ˜<8ˆ×­kšï̪°ñg;‘D1ZÃѰ5t‰ôÂ/5Z¹s öûØ«€Þô‰AÙ:pŠ/²M�Ó³ÍñÓN~ï·+ºX`'iÌô$×8Õá»Îæ“}ÚlO*÷µý+¼æêT’]ëÁOùCA ìœˆÿ>~(CnÔÌä„hµû±™OȬÝ“í/ÇÛ•÷z¿G)‡øýPïÈdß¹L}Þpf. y³$ÃïÊw*ÞØPvKÜ‘%ÃÑq\TZ>”™ g}\'#¹ sœN-8¿?3¬tq}v16¤^ñ_+KG.ÙÔ—’>rÝÏ)®÷„>²«_Ü]su½ òmí{ÛÐr0;ëëEUaÌÒɵŠ�e`î#«·wg^�t>î-ú_çOZÊîngz{œ£ƒ„Oà ´óàFÞ¾E»^—ózt�wëÍÿ�À¬º*ºü‡¬&üÜ/E¯¥ +Êp[~M®�¯ZE<áT�™)6Ð’L-rmÛ(èvÔR°q{@|ˆBÇœS‹”?Û–±ˆ<çï 8;ŽC{Ͷ;-Î  ×Prò}u÷OžâÅß(Œá øIùö'—¥LüF<Ÿ›äO?Ò0B!܉¥ºod‰`ÐÊH7ÂfÎrëgÍ�â÷ÁJݣ͕U„+.S¨ùŒH$ýö:Æ:Rqºd±©ئìÈ�g7ßÈŸGªu—!BJ¾<Ô4þd¶N¦˜AO9©ÈƆ—ômEÄ(äsA„å=¾É=ßv0"³öC^øÛäÓ>¶\“È¢ö0a—JRÙ6ð»-6;ó ª4ø'>öÝÞã.ºâ˜?Oß¡˜XQÀ=€#¼ø•‘4Iyn³ŽûŒË½‚ßmˆÞæ8½gi¸”ÞÉGEe¥*bÒX¤¸ H›X@o¥ç¥OPÁAq,×›“¨œ½ñ8Á˜)rÈâpfR, Á±éføæø”EÊ–ôœ—S42 ÐÐQ¥‰õiu,^ɸ|œ1A[lô¶Í;]qN¼­+ÝXJèu�&‡Q…Å–Ëy;î,}°¾·� ~–¸ê>:zÎÆ~+±h¾Žy/ j0ð( voM&þѵ{J�¸”Bvmœk’ �1îþ0އi¾µg yñÂc(6 ¤ÈÂòº¤>Mƒ“)‘^ÊêÂ4;«6Ý´l9¸q 'üy;N¯¶ ýéx9àZpc® ²¸ˆ d”5ž{~vW ’C;9Ü‘åƒH÷y,.~J¼�>Ú®°T7±5Ÿ â¿7 Àç(ûÕu YW½\-yÛZlSÏWúteöìýÉü‘–ªå?º.x©_´ÑIý‘÷UØlï—00å–O�ú[ïiC®ŸqèE0™�X6~Íø×:ÊëxÂ-SÛ{ÆÄ‚ÒÎ{¨äðgQ—²¼[™¥QéK~Þ~°x„]¨Ù5Ë%ÂdQ GŸxH+²óÀéÁy¯ã|…i’ùS‰—ÃÑ8 ó_‹Ãï&'_AZ°ctj�E /R,`F¹uЭ jÏl»A#tônà—"úQ˜«¤$çu·v¹üxôûœ!º¤³{ÂúíîU·Bç‰ÆpºH8-ˆõ€�ý7ãß�SÞÂ<.fE/ |ý—Q)ûÆ¢¦FeY`Z�¸@Í@šö©}:ãoodR³m+6„R�3Û0¨`­âÝöÍ»JŸ#뎻I¼[P{÷)x}änß¶ù·O½.N_º¾„Ý&t]]Îðï~›¬¥œZú¯T¸ÿ±dLtB)„þ-ZÇE÷Üù-SÑÄ«Ùl»•ï^~dz îØüf¿Ð˜cy¾9XòáÇ1ÈK`2�Ü�ÖòsVó ?Ðü€?~)°ÚX¯iê?ŠA´¥nc†*kk#ñ¤ÜsÞ|×-¨ð˜>¾á 8 m€Y5þ{Žú¢³kCJ?ßTbs®^µôÞs>ºÈë�|¹œL6²•3}=‹ÿ‚[¾º`"@üâ>‘ž„†XÈ)�qFx”…Á�³”tÀj­*Ôƒ\&ÄîI‡€ßŒKYß{î¢ÌûM)†l£zí·Ù94¬ðÝCz>a¬YX{¾ðYÓrÕz ê¦éjuüå}ÏŒW ¹�a·G{I)2ª˜õ»ku¸ÄqvíY«eÉÎ)Ó· Æùަ1i%úÓ{ïQÉÒc8Cí˜;�¥"ìõÏÉ8oR;õ §YlăŪ ¾ÍgAÎÖ­µ9’\¹ØÈ¢1 m�³·qZߢ³_A!sÔ ÅÉMª¹ÉJm0�96Æ.€Î†Y�ÂýIƒLÖõP°CŸa}è 4}m\Ø�&ˆƒÚ;�u¶Gç–!w¦ÂæžËk\CÔ–î!ë…¾¾¨-ûÜUøz¾sœ ­ŽœËŸ(7h3áuq‘cø †Ú�]­g]̘bÄø&è”›|DâT‡·’âì@èeƒ±œ£ ¨MÍ3ðב�žBWV¾”U(¢uœÓäkÒK0JC£�Õ:ñ‰PíË(SçÉéÿbÈ€ AÀò× ‘l„�pyÄ9ý2ñ<~†„.⤋™+Þ1 $ÖØõZ±ë¯Ñ�œŒ ~³{Q)ˆëF¤7~gl¶pPL¥�´$h@½øL=|ŠÏÎ %îÁÞÊ}p¤ö7’‚×@�kNÉü~§²âoùÞ·rª)�Þ”ýý)º­9ʲæÐ��Üα!rû¹5Á…Ž� T¨l\þ[ä4¡ýo· ¸ÄžØžBK¡�v™ÎÜlÖ� r[D£„‹ú�¹¶'tUvR–uw-xûe`rÉú¶Ö°h) äÆ ’Yðî�²¢PÉd&Õ‚·ÑÁ †pË‘~\~ôH, æÐrgkC\ ø\�ÄjzØp–�L4¢ÍOmqÃÜmRamÜWh6­Íà½*/¨·›@ÙžLJA…ªöÈ_a"·íÓ¸œ.ä|AÙû^]™@OÍ¡]æ|8xópôÖã ­³¥Ã¼ø«;¯�àÎòøÔoÓ8ðf )jݳ.ù=›Ù�).µójè0z:Ø(~lf“ä£Xž$?„,b�¤ôúÛx‡ÁÕ¼’9ÈìÃ7æ© »=5XÞË%wßO#€Œ “¥V#E`©L�ô09j“­½æ2Å/Vœ†ƒo8¶ÓoÙù¶:ãÜI[“ãò€¦':�HV@9/}oCf¨½O}Z±‹A.1ŸŽÊãK¢ Mq9U.&#ËEtÒærgèÛñ�Ñ~×Ð@‰tA‹¥'ËtÅZÚ4m[BÎ’»�â JÆ>B´ÅÍ9f#¾tÉ’ææÀøULì¦Ù”s}å“ëCÙ°h'ºï`­Æ½‚ Aù–7çêŒGŠªÌ©k†£é´@dnÿ^¹?®WŽôÇ'ª³O4æÃ:³Î (®{™c¼$¤‚Ö{[Î\H²,sœL’(‰›ì�¼¼Éª§"š ”Ý_2™âæÚ³‘Û`­;ø —™j%R߃òcaç8>aÅG)¾¡”Žß‘;뻲A¶Pçac¿,Xâ 3g˜Ðfÿjï�3(þIk¥äƒ1è�%Yô�Ö¡5`\®À.æ¿R¤Íð3W¾¬¨ A=K·X ܵË�ž å& ¸�ë3:刅h$ÍØ³2_²AŸ£w n0Œ!‹„Õñ)ˆ;7kN-w³ñ8ƒðïÁ(]¢@ªë0A³3gxÝ }Ÿ¸ÙæµÙ�’ŒEäø�Ìèö�bà»#x¶íË;6@œƒ”€KÈn æí…Î8ØR€!È:¡,xád2c74ì?%1ƒjÍOyÞCl„âÿŠtÛ,ð*‚Ë[LÛÂÎ|À=™Zžù¿Ð¹ŸN·Ù•‹þXAÊ£á,¨P³P1ñÑjXO�Äß´<­�¼ê™²î›‹ª)ÑDw€€(1˘?~�6ÈUGG‚è´š—EÊÀœzVÔ— ©¸5¹ÛUq þöÈaÆýÖQº–‘çu(½-p˜Xbyªß7@µˆpãÊ8{AÊ8Ç8u›øŒñ¼��„OÀü[‰›ûëþ¶Ü»$šò�[ætXî»ßDäœ1@à_ ^2Ö¾€ß–˜¾Ð"øFùÀ±9ÞˆH�|V\ìÀpT(Zú>¸«ÆïŸZS¾¾Æa­œ�ÒÁ¿E.Ç´9s´¬Ž§ú2ì6ÙrÙ…FCœß ‰¬ d’GzeuE`3ÑtäY6(ÿÀÓE�;=Î+ó_Kj=»[²uüU�`¦\cvŽdQöû‹q ùÛ„×®Û—îL9]wÝ÷¾„ø˜Ÿ«öJùL߬’‘ú7¦°¿>ö¬Ö€ït•žF-�ËïÇÌH£Ø6§y…5æ�oèß0N�‰N{.{ë�ì8Á~½ O*è(šÈüO·wzéMð©!A c¥&ÛÝðW¹iƲ ¦m u>ã�]É÷ÑÛ˜Ñî „ 0ÿ¤…ÊÙθ� ¹=ͳ7½YLꌈ¹m+°g¯Ý(°?> 0…ï ;_îo–;<âŽFµeÂú¡ÖÄ8¾$ßÓ¤=]îSwø£P_ÉN«;ɉwØhÑA Êã@C±[‚®¦¤0Gm¡¼ú}¨?¶1µõ²5ðø±Ã1ÂÇNtâ\M@ TšŒpzäÑPcV{~—èn{³n<¡+ÞÎÇÍsÔ\s͈´á±—³^Ia ¿'º,b ½ ãI*³ìN€¡øügµ¬Ë"¹¥@Ëóžj/ßÅì&jd'è¼¶³d×Öëë–^­€(žËâû$¬QC“™š‰¤�hˆ¨h¨ðªE_¨oZêÀPNšø\]˜¤3ùíK~sçpAϼ•‰z·�ǰÕ`RGµÚâ÷©™9?Ô÷«m7x•9+@Ý$%ÇyHl~k“©1 jËCzÀ±`_(=¿Už[:Ĩ,ÛÀ)nƒ©™Ásãük+zÕ²åq(˜œIÛyBcjÉj!°Ûyo6SÉøŽÇÔǺ9÷_ŠKÊJd²ZéºsÃ,Ÿ6á²ÜõÖxÁ5È*;vèð@öö> ¡äPŸá…0îU$²�ÛýxßÚoÝ áºeò÷x­´ÜÂiB¾¸ëCôO³ËÎn†‡€gŒY UûË[ô0ôjzªîyì^'@ÿˆzx¸‹Âi]3�) Ò ¬ç8½´ ó±bExy(65XiÃÓÔ99•Îb•ì7‰°Ò�X5‚°ÜÒ3gÎ’½,‚ðw"™ü`3‘˜kåbÄ„Vü$Û,µYÀ@TOéÀúp#gbI�ùï>¼:q´v·ÉÈÙúxÍ”JŸ”«¼ÒÅ>ìè­xŸ‘3$~kJq΂/å�«»Së [Tým•vÒÝ©œ�ì(–j½pUs€Y}`*Ólå¯Õ‹Ùé�¯�Æž€ é;)�¤BÖƒ;\¨Äå)±Ž²…?Bu*)ö�k%x°$&DÀ²U_fó·,XQHññœ[!‘ouø `&§y¾”:�ƒ_ÝçûÁ@ˆ¤A˪�S°GÀ­Ìp°³»D¯p©ûmî…ÿ7ZµÔhïÓÝÝ2$®oâ8¹ã½¼Þ}W§/Þ- PG Üó`ÍtG¾Brô”šåUœ7º¸NN®YoFl4ÂÜ"9°VdÓ¼“NUCƒÅ퀹|©^ãÊçì�È.O vKÞ¦2ÒîîZƒ}¸‡amˆ7ì®>TWr�-}.d^ÌòtAÔ:v€Žäc@×6™%ÂfŒ#1lTæÜ9±²FÜÝ™Œ2b$… «‘«qª?=ó³hQd¶øK„‰s&ºÜåèO°#Þã}"ÈøžLè׈âÊ6Büî_°™ù7oíóÂeûÚçù ¬Îz>ß|¢©c_¤; É^$ ïjõyÝìÝ10þ±P$‡:¢Ä^Š…Èqäk ЕùHÃVæl¸ª¡“V³`J[IüýüvRÝ(ÖuXi@’ÍŠ¦d5#�ò�xI”_› 'NØq“h_LƒŠ{ÀÛÉíÛ5®µ“§Ì1E0ä™Å-0âC”þPŠCøÓ‰ÑÆ29¼•”%³zö [—Zð®S“å›Þ)J,P{xò°Šs8É.r£å b¯Í“­RÞø«~0æá ¸¾‹›ô“„YÈ{Ì ¯"üüÒè!J6o}O'Ty_cty̺ЖzÀœ±‰Íî2 I¬„Mˆè14#ÅÂ÷ªMEô¹CÄ@k K ä{ ?¹œ¼ö}ºñô¬Ö¸ ;Ãs·Ò„ÝV¿S_ËxpáSwY=\uÅBX†µ¡ßž¯€x^„#Ø^ìíÞçºÏ¡HPIŸ }€l…vAb Ü #[~;cgk¾û‘Vö :hÒ^§¬…Ãh§ÖÉë.è¥ìÛ ¡¿°¢k„U)¨Ý(ì“”#dºvÎãb[þ1´#™+¡ý6Ö¤ÅWŒÂ€î‚³!ÚÛ^åwB²Àfû²ã|+ZÐCz#7² Ù¿mÆ}j�P)áìñµã˜eÌ5UF»>:[*¹*Ù€kY¿æÉR .€¹ÈT&Ô(™m QÕÀI-V,íË=‰ÌŠÀ@Y×lÀœ{®9•'cu'>ãoL?fÎÆ”¿vÿ1ê<`õÃ�¸D11ãOˆXox)&;0$AÇm¬Kèß@ª‘˜…·{¦À?Ï÷Ç5¼8< ˆ ußï¡Ë\+úwŠ�ÝÆ†*7¢Å‡Š•Ø=z10¨>J׿³E~Ó]°vÞ4þ� �"6O¢½0[žI� Vû§»Û#¡ÓåÂÑA³•Üò`[]@å>óv rÉϳ æ_myðzöËØ¶¥D»²WóNuŒgR�2f*¸a¤[ƒï®hУê�âGUájíq}Qà®[_•á„×�S¡b× Œvtœ¡¤—ñ ^‚ìžõ¯b 1åðÖ°6zURØÀÜ"iÿX>ò–ã ÜõD¹Þ1Õ³pVÒyÔŃß6…„5½£Èß!™À­0,E´ä’VTÅ„ô¸Ð¯*M(þDÌUÄû½Wêzd„!êmÒ„½ Ø-Ù"~¤·ó „Ø÷W—ºf2ØØN³ˆ²§¦ ‰“IÈt`Ö᪂fSbBY•îÕð}XId¬ËÀnO÷³Õ –±FCÄÑÍ'Úîü°á<¿é`ç¬"ß8[î úú’K€ùr õ×WXA›úϱ,º—9x“Rí|ï-gÇ{ÝÞûåì '‡Ûq’9{òºØð0AmÄVÀƒìé]Yù03W³åèS?몷ŒgäNo©^A?Oæó_&î–eÜ$ ü?¹bü"4!nd¤@…ÆõjL=Aê~·R¬!Aêá±9°à¾PÞÛdÖ¢Œ“ÔzrÜCG#Ó¨XÎÐô‰ÄF;û*ײ}ó,œ YæpÇ©kލ£d,LtHÀð{¾¤1’X.ãBÃ4HOÈŸ,(¨ñ×\9¶&x¦9YM(2öðänÀ¡ û�ñp!ÇÕmÂS—¶dZï)x„Ù]ð3`Õ8¸}ÔÇv'²Ò?¯ºédó…Ïx`éXTñöÄ6­b®|**7³Ž¥só_”dÙÌÊÃé×!̯”UÔF~’sª ÏETÍ·Ø_ ©$C±1vð8E¾A@Dð¤Èî*�óð|ÅÂûYºC¸•‰Ôfµ>"k-°k2 ÊyP_·›´aÛjòÓ!ÏKkÖJ³·\^ðµv<¦30C9«±—j�åen'½C-dbµûœ3ø0_dïÅ<¢ö�0Š�™”ÂìE]8ýÓŽéwr¦ ®9y‹k/ÈÍ`î’ᇛoï�><*:Ú>ìU=àm¿Ð³�é7BW eÓdç%Áº‡*³ü�¦ÄwGí!øó±º¬žßÙ剹¦äœF²#ë“.; Ù½…ðÞn{ Õ­¦Ì³†fʵ÷¹è ì§•Sþ²AF…ÈÏí}Ë*Ó„«RÄZ™6˜½\;òª­À } |Ø!-¸@JöRv*wÓ!ˆå¯{@üô5ŠB¹E1Ó©'m«6Øå£4’Êö6ëãvx�8kR#|ѬN1r'$*>v¶,Òµb¼¨mw’¹èå%»³¤:ĬðGm�Dú4ˆ»¼R—s<Ù^Ò‰Cò¸UX7ò¥,•ºfË‘îy¥ûçÞ,£¬?թ߯­—ój íÇÉÛlƒ�|^Éð“’y4ŸJT}2#™nþò†9 VƼ„Êθ‚›¦3£Þç!‘¥0³ŽÒ6‘ƶ�pËÄLÇ�I†¦lºå9¥0~ ÐçӍ޶•6Ï©Q{^ìˆ):·¨pï„Â4�� Û‰ÿùA¡è5?iÔÜOöo«,üóA+¿WÎã;ŽcHTë²”}ô_D/t(*X$“­s\ ¢´äs*BȈ6b!„N®R_åÐŒ!|e�ƒɤù(øujÉ�O?vN ,d*BEIÆ7µTµ‡ßEfç]éE®–xÞl,¶X“8w¥>Ó<¸ÙVðÌVYÉèrsˆZ¥Â’‡óc¾÷¥QšN ›…!�§XÃÑûïÜîA«h‰×Ýàn`tÂ[DÆ-ƒ×ªƒ�# QËŸ¶ûè¢z‹ôb¸sí.‡x�dKÖ½÷oÎS©.ï¨Ð󭡨.ƒs„²æ™D½[l+wѶ ½·Í�nö– »çb+m�Œ· àxÊ’;§bÓ�Á?‡Âc” âc=´þï8‚-ÃËó±��§±3ÑhC–Xbæ¤7=Øw!´áh~hí› èwqíœåw’»Ø„>\‰Š€�蜩—YLß1£|<êÑ9 è€�Ë_¼°"ÎYW¨Ç¶Q1 HÀl/…S0t r³Íì*ÌáÎ8p]X_'ªïê¾,4/ŸÛKhp ³Ó~Ο)¢¿Éƒ&"R $^Âê#äàK$‘cH¤3†¹¥U¬ÏÜô¸nøá¸‘¢Óà%wΫ¦¸ÂˆíðZ ¹(Óé¸Ãz‘þʤ³-£j¶2Öý!”pç`37 Òâc{‰ç˜t$Å›yy%*J�J²Z Ö‰æ(ÞÆû¶TBº¥¤ý莸iJ&Un[·-;æ8ç›8>WVGr|kCä=N@à�ÚÇyZ[†0œ}-�JàÌl_“ ¾ºp§%€›Rm b`㟲¹i'Ãy_o‚'ÅóÃhZ8 Ùî„:aùղذȂá¯ôÞ\`÷¬ëÚ˜ µì*‰¸7'#¶4ò…§$ㄾ¯g\VñBÂÍÆ×Mé8ûZbÁî‚͘›-¤q¨Í»%nÄó@÷p:~»ÚÔ3Y×>êãeWÑO‘A2¢aÍÁìTÜÇ}--§{\HðJO*y×!40�û7¼IF½T‘Ò`•ß~ÀBÞ·…¶£W%¾fþøf"ÛvSPð9Ó³ g•Q°žyÛ8ÏÁfµY“Ñ8³&×&ÞÞ}iÅ\œ¬¶-¬`V-šb¬Z·H� ‡’“ú(0—�Q1×Ð$ó[8¶¹¦ˆÓíš÷{N/,ãV�~º*Xk€Ÿ 6ø-ß#¹��&`2Y?{JMG„AûWÉ»äd: { Ùª!´›p[§Q€)�DoɰÞBam ZlâÑ«÷D8á‹Çu¦Ó]œ§I­ÞÀŠÓ�°�=�KîX5§ØE?9‰yåè÷¢£¤†ŽýÕÓ톥m•·1«}AZÄψ“Ê" ƒ Xt/È�ï­-]çZ.Äã£kÔ¾pm»îìN÷™"²Ý²*–¯¿}Î�¥ñ­t‚ùŠôvÿŒ<õ­zù§¹’Ž�hc¸Ç×ü¯¸kuþKó@_T·Ç¤{ÝÍ¥�¦J­ò.RÃÍ^9ÎÚ˯—Â÷õãoÒöŠdÉø."º°f÷»—9�:„üùî)÷/%5¦ šˆKóêóx {F“éÆA5v¿çö`kê ci&´–ÛA;ݵì§9Ðóæ[Ыâ“‚�×:‹k@%nMU3^%yHae(³½Ì M ]¬c俉ƒšùâ . äãFà~6Wö'ñõFRËãÔîdR:Óû“¨VæÈŽ…ëÀΤriøD™÷ºÜLÚ¿J 57~ªm†ÈTï€×vüÓ–¾íª¢»wi}ÄeGÁ%yÀÜL� ÝÃ]Jøtàîˆ`x"�ØØºdw +¢u›50¸Á†çÚ=”’ë¢yÖú__�N]þvÛ®¶ó׿>ŒÔd;µÁlì iS„`T,�˜|aD+Ö?›{%¯·ÑÕµž½y›óÕ“žì£ÅÁôí„Gy>Üf€³Ùìg'5¶Éòž×Ù%ŸN™¸^Æb7i•ÌÓBJ&*ði X‚é¼üÈj6öŸJ ÄQä…aiÇœ =˜K(ˆ{õy §°© åOÔºsmé©®*‡«Æ´Á)ÈÙ»:[1…¬ƒÍ«È¶Âôro~}Od÷ëçv®ÎÔ�0GDËeσRw>29Å IFO'6ôŠð2Lý½¦Ÿ¹¸£ã+¦ _Õ=¥ÍT¿ ½°ÕŒ =xŸ›Ñx­¤ÒxÎ’©ý±@6é\Sý´À€¹ozúØÍ¬Ùذ+£µ¬4,ú•e¬0š>+,¶m®übuu¯ˆðS!Øm9\®`ÃÞ{êš,lº«‰,\Öøûèâ4®g„[`Æ�&œãµH“”\±Êõjï¿–ì,xò+ -£„ >ß/êηéMPÛ·¡ÛŽ»áaºÐÀ€MµÏTÌÈ_}ñ…ûv!BÅ–7~ §-±,Â-cÏóì[–ÇnQ"Ûít9£®rÂ�Á�úFÜs�ÜNÖxô"ã3ô¡ÚŽ6í¼Ú‰wH,Ù,+?ƒ6ëÅ´&º¹$PáÐg»Ÿ—õæÅ£öÈ©^U¯Pñ±å°[¸0ÀP ÝNs™bfSWO߀âõÇ�øñíaÊÓl'×› f3@ÛgNX“!.ÅŸ;|QŽ,…Û<²e¤])bU!ŒþGa墄'«9ÆEv(³ª\¢ç/‚$^æòô»>¶ì”„<æ›=ÓäþÚQnnîÆ0Vâ3l]V5¾7*¬©ÏI'¥C¦})_Rc“z棋Äâ×�ù¾wL›—SÂ`K®ev]#U8y•FÙâB 1³¥t’ ÝfïâüäŠqT¾�J(±½F?zºsÜ\%TkcfÆéÿeÊÂ!l&l/Í2Fí&fðXä"Ø‘‡4/;%ÁŒìˆUKuK Ç8¢ÈJö½ªãד̱=·—¾×[+ãœÊPw]B¹© yogQ׆‡>¿ê ­ä¦9ìËj�ÂBÇœQÅŸ‡n£½úÕa�»�ÏH†l›règ±²ˆ³Mõì*¥iŽÖÊæF •6“{Ú$Po· ¶§ÈgI†wÍ•é½Êfg´“˜Î#­!,5úçÆ’Wï¬ËÝÚÕ}Œ%ÔfíŽßÒ¦!T� ΖõÚ¸Ã4k†›ÈþmRŃ1Ú`Ù…ƒ7ô_n š+ #4ÆÓshL±¸ A%ï2$Äã– Üd¤óK-‘â÷iéoËõu[4›Â8 „b+¨M]ÍæÖÃrÉ*lõ[½Lö×> ¾§A±”!Ab £¼s¹2�p²ÜÎ:Œd ÚÜ [r˜Õœ%A/�<¨K�!'w½4­‡TÚîwÅ-“ØjÓ0y¼fYšc-�ÂÙ�Ù ãE™’Kd3ÛºNƒBĘ)ØŸJÍ©…¬™¦´«‘a™Ù‰l…'Ô–’V¯c°q w‰!ÞpcÖz­:»�7£‹4Z}gòW Jó}i;q¿aiñy¶ÄÌŒ‡�ˆ7Mà ™Fì³ÙÝ©Š�B‡"Q1`<£r'(¢Z�×|A}W´÷9vã­® âgÄÛ­n3 )ÔòÙˆ<Ì\P)Á’+lùYÔÆ±œ•Y\µ¦V¾ð¸Äî‘òÔ²»nâÂ7Ä3V�ôp¡a¾óî颬e%¬ lш À‹ –æTæ6 ¦"pQÝF…¤Qñ(8‹gIwbÜp¹GŸ˜I{5¤IIÉ�UcðÔ’ÚãGD<Ý®ÆÖÞÖªùä]I«etÅ€ÆÎ¡§È$(¼èçÜÞ¦îl›¦ÓAË´ÝXÇ~=Á`i½nókÚÊâÎÈ.Ƽ–-"ç…C¼6é ÁÀÉËî�$£äGÄÒ<å2•ußáì�´Ì糉Ñ7 ±wp°ÖÂVnº³zØzŽœÃÎÎD¿:+†^D…¹Ópè wº7 a¹}4¹ˆXQ&µ€8 Í•$Ê14G|mÉ ŠK¥ŠGèÊnLqÎÕ� Ø;jÁ�(p… @_60rÊÃëWÌæó öÏÍrf¤Š@À‚Pö†3n¿È6ØM�²³–[=ôSafMž‡Ï@–ÎÎ�Û–�¦ñ>Åý�Z–sXÍ�AϼÖñ\€„èSgpX†.Zì× »îw¨l7a{ ÊÊ,$Žàƒ�L˜¶¹°‰c|HÏS§—²6ð‡‚Ñ�¯/‡Þjü-ÔÚjv&}X×5J–2p2z>Ïl!#nWPVó5Þ.óXΓ:Øßcâ(Qñ¨ÅˆfMÜÉåbÜוn¾’ЧN“å`gˆ¼XR_¬Úo’­ìÏD[Ø’ôó*]¿&êÊ×̤†™ û0]d,”:}.¥ Ãø'¨Â„”g¼ß?KÂäÁÎAìHž,ÆUCn�˜ã¥UÛ¿_]xöç¿Åîw9éæóÌ’I“>s$“ ™™?$�û÷à¡wÖX2¦_®jjº¿î2 ‹†�‹z©3aά¬»�š/·9>_·ÔÚX+g¬N¯‹1 ÷N¸3â0³øg”�ÉwËA…Dâ¬ÊÜâß>¼ý;™2d“$™‡ÛÏž»=¬üŸ^y?§ßßi—ã´‹! Ýà’À‚obƈ6»añEk£]$:›«�Û&ÆÑAë1pÛ‡h¡‚¥~AÑ*³¿¾s*×&Ë$�ámÊ/ �8¸åûdSÚ|MoÛ wƒÉÛ:1X0`àëˆ�Ž· %§;“eÁú�U…»VbŠ¡¥€3’�ë~jÝÚ퓊ÀÚØý“lÚóo\�ò¸G T럽伕†(†[Úmù^tBwƒ+ §c± ©ß,ŠïŒÇ]…0Ù҃ŎÚw¬Xf¥œ¸Ëy�zÃÔÊ›‹*^☄U¡xUuÐF(±œÕTò•P�ßY%µÑx!ȹ𠉽rç¥^SÖ�QPêø°P¥Åú»�×rz¢*,Nö3]êâà\ ž�Óe¼H‰ý„QáØ¢Ï!>0´¾Á×ÄgW˜ÄÈ•l:€®¿§¶û­âôå˜K‹ éÜ5ªQ$=ó!¾ÇsÓèv/±¸j{Ý,Æ?X#-v£w Ñö³Ñ]sWàƙhSsMóX�žºé§èüß)ŸIìAWr$ˆ»·N°J�W…ÀÓÆ=·ÛB·zO­7«FSÚÅïË*p-î¯ÿíBâ}·wp¸ëÌ+_èÒ��¨ÀÖt äv¼}p‡AˆydW×öjÚ`°$výþÎ*uçHŒ†ˆµMºŸ�̋Ḝ`çÜûïfó=v¥K�Ö Ïv¹rÖ´$úÙ›÷Ô}s’àô$ºrMˆÄ‰�p_ˆ·cÑñîï�Ö•÷¼q~lúß•5‰/#� #j¤9é&ƒ4±ë~ŽlË'|25Ú �b·µlmᆶˆP˜@,ÉnðNlX @º5žò®³îúˆ|µsz�«´¯O®�ÈM÷gtɬ®EZÃ…IØkŸ¶ØGßy`�íí ´ß0×p=xÁQq�áqåð¢¦oYsÂ�­Ã]u‡ÇìðÔœ;›(�j” Ü,(+\IO9‰[*àºË9Ó?=Ô�îZñ2�ÝTÔI¼ %‰ˆÌÿS±PßQrNzýµ¸MÉ' È&"tðU3Ÿ&oÇö¬øä¢l«çËë7ŠûoûoøtlàäYcJÁäi\$þӺϗî[ô7âÜù}Û›àc¡�“{àæÖÃö£Ù´oì«“²�?ô—ï)Lü—=�—·€œ¼jØF_&ëÕÄ]\=a_Å(aÚò£eüH¾ÒßU¸é°fö�/nâ+øâGu{Þ”K~˜R—èQªÈúÿt…V¿ÛÐcÎx’(xœ‘Xµ&:Ñ™¨×=¯ÌN;©@”sÍÚÝ:VXF{\>ŽÜ·„L�_A9]£ $ÅûYÂ9˜ŽƒxZ¢Âe™9ôçÐ!$ÛÊ_@áî+%&¼Äö$»Îj3‚ÆNh¸¹¿nêL÷&Øg¢Ž/Õbk.pÑnôñðy_­oŠe«¥µ: ŽûGÆ®áÏ+à|vßa©ú§éÖ®A9Ý—}ˆÐ\öo6[þ}}½S‡Ò¿ )8•sÅ–U¦�-Õñ +¥3Éý-íg_pƒâ e(˜ªɢ&ÀŸ×@�ù÷Èwî5)ÎÅYn»µ°VK£šßãs°ø›<¥ó…?éãkÔAºžåË—Q<7v– nr Læ%œRMÖÜØ)Ƨ/P$ ÇÍÊø ŠššœþãçÜ9¹È(¥–áÀ"¾œL•S`[•Ëz–ZŠö´õw–ï•ZX,ôvð¤nó!xÙåN”«¶AjÜÍzëë0*€Ÿ;Pȧ…у矛’䜋)}^Á&”Àk˧�Ôˆh\ÛT|?ÜTá{UX¦í][UÁ¨—�_;uõ(@Éu é<»`E°ž2 b�)õå ±ò+ùzW‘#óKe13dL.œªù´Èεši�Û‚ÄZñû—äX`"¾À,Ä ›Cãø×âEw_p ®côŠ‚ö;÷Ù¼²øFê5lul} ˜žÙÎ؆ €Ç¾ùsÌ W­ÓÇ~ðm¼ÇFÝ“Tèúwk�,¡uj²´¾Ý/ªE€ð~D”¿‰ÚXö¥´ºh%mð† Wܽ™¯RÞ’¦ã[´Õgp@{%Äõô&/õÞ=Ò!‡Üqæ1…ŸrQî@ÎrZû+cG¥‚œüÝU*¢@ùšzuay(–ê�޳?n=i‘eÌBXÛ1»‡¡óa?íQ�#7p¹ok™†Š>�­— Xv!ʉAÂ'FJG׈pÅìÈ!Â[ÞƒnÎÕ툂ëß­h²è#Áƒ÷U‚]½äè“[…ŸhCÚC¬jq�øo/+´ ÅúV;REåñ”ø'z¦×24qê à6Ü»œoõ[Z‡B‚ý0ž“i;À݆÷QÅa©ˆùT & Ô`…àcU–AÚ]Å’¿yõØJåB†‘›¶à%¯qyKôö �,—FÐB…ݲ�V µ–àç$ao"5_Û^-÷:‚<4´Á35—ž,ß`ýË!E¨p†‰2ƒ£�ÇDÅDê©—l·W¡(dÅþ½÷™uk!©èéqøÁ—ÒÌ9¥Õd‡CPAÂчŒ£Ó‰ ¾‡T:W¸Å»Xרö,Ðvà¹lênJÒùÂÏ)™l®ô:s|wD{™¡¿nïÑÐÛzüg’‹æ½.cV;2\³ôކ[‚µŽÎ›5TÇ)%Ì¡j1×ç 8˜EkÍ?U:Ù߬Þvæ³tÜÈP5ßÒˆÆ2øÄ•s—°×S°ëß­å¢qëd+<*9Öçwi3úZ¼Ž'é ú7t±-Ĥ ¹i×Ý›B{€“ʲ—eYNšL=ÎÖ,íÔcDù;°ôæ’ÀÃh°‡Üòí2$ã‹!TÝÖPu.®ŽN«ÜÛbKÌã*#L< _˜¢F7®œ–çV©ä\÷\ ¶Å¸�h½�Á³4—ÓÉvÒƒ„âÑCìx6†Ð$t õÙ·Xh8¹ÖYûØ€Ô?+à@#3£“kYUêèÍ{u7y‚o 8Ñx;zâ¡Ø3¿Ä5ØÚ_KÉŽÞ[Ek«Ö(æÙK•®%`‹]ô �D“‰T^.LøÕ�<2Q 3¢ÐÝ£½~fù¹w6ÿ§ïÁø54V]r'‰§ƒç2úRÈ>vÚŒž ¼jÙ„ÒØZ]±‹bwek¿5Á�ç[A¾øÚÊiAÚNÃ{àÖXꢾjÓB[scrxà–OaýyBb&=&“y{RιímA.Ç€B;l_Ä fÎ@è7"úì2âÿR„ä ÈÁPÕ︽³y}wíî‘¢…ÝÚŠR «o'¡Ú@Ü18™è"ýÔúw—øöa@a%�šDÌdJÍ‹õ+Jþî]e°Çx“•UÚè[ ²›¿ÛÑAmOs·Õر›O#.ýë@À–CR¯… »h{ó\›úÓªŒ[¾[pcœ¸FB;Úì �WÉl�"Ù¡®—Rü¾À|è»¶8&µcŒ„™œÜ«ƒ">Š’N†§!m¶Û¼ï ·ßV[ößÙ |ÁJ€1µ—VÄx;j£8&·5tº!Qb8†·›î£néuNqY£Äµwø2*yìÓ�­Ç:'»üÚ3(&nVûpE\ýºZ8yÓµp±ë¾­ŽõpFÝw{wO�]�×µ»+7¬U.¶§ Šâ×âégIšÍËelÚêYÅ‘…k°‘ú-mß ™Ô¨ ÀÒaqƒrs@—zýs¸œ.ú†ËZ.‘ÄÜÀ°Y�(‰ì¶unBãWÝôB7hL¾ªRàÔ0¬J�Ç¢€$~í¶Ã3K´ËàŸ3ÛÒ£äêî¢U—“ˆ¿t�[”›ºÍ°íá •ÓLyˆq®5R•¿X‘SR Ä[CËqçZÔEæ_j4AèÓ³o[>ãÖkÌ3eò’ËÜ–å¤Ïfÿ(4Ø'¸†ÆXds®O6à€s[E±�‹c�¨­ºi q§ýÜï²^ݺ%ÀÞp©„yi’¬Ñ†pÓ­_#¸„{Ð/!Êáx㘎AÏh—»ÿ�¼ƒo>"Ž/² i�»RŽñ Ò‡Z2Èùüå°6ÚE¯ãúm�Ñ?“¶1wJáyz7Ìõ°x¬¼ Ô¦röÂ…Í´Óa)Öü¶§ûÖùk5t5ŠÎƳŒw)_wÐÛ­ŒæuZJØ�ˆ=l"ðGO ›QñJÅ ÄpšMm¬ú"hH |ðíCÝnnìúº\+OC»L5&ýÀ>©ð*ǽè0Tär n‘ÁR“YƒcŸ•A±Âv0/[MŒeù¹‹!ù�«„ý$ý­$ ‡ƒz·œzŽ“| ?Þ¦W_³$¢o�¾Ûé¬O"äc�ßËDm<ˆÙ‘—Ô«‰pýøþ"r ‘KÙÏ�×øv‡ŸNWÕ÷3àμ³äÏç[ñ÷ͬö8Onìϸgç·‹ãǾïoÎY/ÉÔ3ë¿~~s=Œ¤š!·ÁðlÿÜÃÕÓÔ�¢âü:'›ªËü©0Ç CÚ úëé $ɇˑ訴‹_!U ‚´Ð¸Sã{Ñg¹rã—1¾¯ì�j5⚈$ü±“•ånuW@…ãëQÍñ^Åai*&½6+¢NL ‡cnçe”,êX�¬;‹š~+º€õ°&xÔ6i9`ÂÔ„'.¿†½Âoë'jÁ?¼xü‰üÞÓ xšíËøƒÜÍa· Øç½_æakÅ@dò{[œŽ¯Ø™h½Ã3zŠ@t,¼ÍÐþ¾{g  Jì5°iµYÓŒã“}Xì_£¡Áá—Àj3)DÙ§ÅO¿1Ý—÷väÕ“ükàç„› å�?ŒF& µñXõ€ø�P¨­¤�ÃZ ãCZ̤ßféqÁ8hP¸6FÓ±•tŽf­lø½¸Òý–°:£´Ûˆ $ÕÐ΄ÁNE$é–´MéªÒf^¥TÑ€² Â<ð;!´Î]rWëñÿ§ íÆæ-O¾Çk’�k¥Dc�8›¿1ÎÎŽá@$Èé”»Ç"Õ™×y`nZ¨ÿ6È�JæË¬õOìóvÝ9ãöÊ¥ÉMK‰_ŸtŠ;|诗EÝrÆP',6{®RóÚÕì$쑵:nj÷zovYpó�Õk>h p’À>áe;ë‡kE ì« ^ÕÅšÃ#Áñ“Þµm[4:Àò�`˜> ÛÚo. |ÈQÙ W;Ï-µÏ*ȵ¦[¶]˜# &ÅJ27ÀŽ1�'wMFÏ–¶ÚCÖÇ� Ãäò\уnöÌç 1–¨H¡1ÉáÞ©HD.qQ°“êÖİÌåFC=ÊÅ|î<‰Ý‹JÁ�„ LÕÑtŸ¸jɶcq·5ÎçTÀR3yÛ°�•!ŸÀ¨³NyÑËÇîr5–²s'õWo�oineâÔOí£zXõ`ùwMz½{'ÓÌ�‰¹¥=d+¬«QomÖPÁ…ÄÔ€jÙ Ò—Q>Ë,Ïì‡Èh¬Æø±„wZF®èV¾ÍK×XË—Œ ©ªÛÇoÏWM…o`$Øf@†ž&|8MÕLí#;}c FŽQ@Û<úú�}ŽsŽˆÌTaîîoŽBæ²ò¨§kºÏ$·D‚.3nl[DJ6¥Ý‡"ù+M² Ò´ >ÿI6µ�ÂRQN[X\›obgžâY�ú0ï5¬Bó„"v=ñ�OÒRÄ»ïA˜9,óEúG =ìk˜>WÄ›fÕýî{‡Šò›k}Qäs<8¶Çèù[ÚNN—Ñ ·* ™hAbs­MHAq9Íœ±þå­?'’ ” ˆî÷å—‘¿´Öט£‡œ‰¡ØðÉ’®E_ÄGÕÞÓt/áµy‰´x ×½ýgÞ¤½AÃiUÐË|ê8qÜFƒÜ{‡ÍðßÍ[·Oxàæ×og¶ý+�b«.2-í„jdå¢`êõ ]¾t™¨2 ÎÙo�Ø-k£+Ÿƒîk�R7§ŽjZ,»æ^1lYò°HvÙ<«5TcAÍ^Ô“ŠG[ÜlÄUã ·Š�õò£cxäîHÊ™,·VáÑ¿ÞÒmùI§¤/ ]òÊq¸Õû¼q…° zgØý÷q׿ë$ô[ËÃ_�¯Ðüpgz<ƒRw<~q±óp ô'X,E}Xå@\-”gk¨i —k#c—r¦õùÆ §ÁÉü:´È„²Ì‰Ú¡ØíxqÚü\‹à�Û~: w˜v›ÍÔC�ÂÉiÇÚΚ@Tö$]X�Nö�ꣷ,p–ÆeAô+ [}¤pÏ3¹›ã`jÖ'g«õ2;opµÑ¾‚Ñ÷ÏAÃéþn=ŸëÆ#¿-‹P‹ýøAeÔ³8¾E«áÛ‹›öo©o�œ.õRÊ�«iWº$ì!jìm|Ýòñ©^`°«8PNT•�Ö¥Îäá[ÔõßCfò(þš½'®{8(C\T9’t( ßA{¶ç.„.ÃÇiºÖ6¿ä·Øi²$diG÷&3v;æK „ÖÎê %AW:6ÀX(ë‹u-s-2¼�fK†fóASÁÝV¾ÖƒYvÀ òƒ$W²!ÐVÝXÕ»Æcú+ ¥¨Öi5swaQû—�²¹Ç-y]ûpq'cÒBà+ìDÔŸ”s‰Ýþ1EÒíl‰ôCìa_•ê¶m�Ä·’_'Ąf;Ê<Í.”çì3•éö#’t �%®Í”ÜÜ÷8,ÙT2öíöü»GmÞˆ£¢Æõ©´tŸjЈ�À¡îC¨¼4N…Fÿ“ÌGmÂ_~\Úy¨³A ´†Ðî³Ë㙑iÓ\±Ž�I¦! ^ÍÄC©$Œ{ܽ )j´$ÿ n4Â] þûy�úÛ ¶zÙ@Žw®Ûý!Àd+ðþ\AüÝu8íö2> ›;}‚†…/ZøZžÁ••»@2_…“yàʳcFX7wظ°JÙSRYR!mÀ8m¬ª·j‰Ãµé·ÉaÛ”„À÷Ó<í÷b<Ù Jq°® 01áš,®ÎyæÄ‹Uг„»°�·]œ‰¿p�úLÉ“gÔŽÛðL(+T›–y#âݽ‚<`v¥nMÿ&Z&Æ@l]ÉÞ ¡¼îB±O�›ä ™Ý©ÊdÓÓ9±ÎäŸYçÖ>謔8Ø=¯KìqK 5Ú÷²Ë�¼�„EÍ}ïÏ4;Y�`/ŒŸŠ)œ³¿¬�í2û7%ýÑ ö¼±qé=äùîJ•¾æã¿Åži7{âÕµ¹ØP_�¨{<»VßÔ&t¹’ðÁÖ,Æ÷ KÆù-�b P¥šW ˆ05úêüÛ8]¹WBq:’\Œp— Œ 4ý<¤{f*?náhŽŽ×>'€|Ò Ñ¨v¯o_sZµ|Ö|Šz–Ÿ/F§€æ�2¥¢½¡Z™Ô°å0Ž;Ã}½è” DªŠÑ¿Ád:PSÆäq¶á«� •) ¦GÑŠ¦^:P¤:hCsÚÎsöUºJ±Ÿz‚Á Ñ^Û€Þ[eÅÒ&»I7l YÝyƒˆãõ.ý– ÊΘØE 5`xäºrï¢ël!jŸY©©»ánHW¥’glJ†Cµ› !ÀA)Òé€íÍ` ¾€Hµp²ÓŽmÍ„\eלÈßß¿·ƒ*npÐTjöÖ¬ù:®®Åó°„píî ™dWÍìºõ‘�ë†Ç¥û†ˆUý–KbnÌ�¹Î0‚lD˜m—!ÛJôW×Eïž—4<`Îx—ÐZ�1×gšôÙä»äS’^ßä)‹eÉ�墥,¸Ðõ÷ a£/#%%%áÝ ïpÔÞÇ×@l&��³‹ w$D vBOm÷kxæ¯]`¿IôÀD…‡Øþ¸²ê‘¾[áË=}]Ø,ÌWïÈöúÕ­ÌósìVAhE Í©òå~Nëgؠ׈2уÓõ˜ç_`Et‘a]Ð'ªpl‡Ì¿œ±Ù«t¼Ò®oZ} ¤·-ŒDBt´×ɨàšs„<\m� \Ã+ÙíèÀ`-:š%uÇVé)|õ¹0�7á¶³i3±MFg8PéVW%Á’7° ˆ{ ™ê _¹7Ä¢5¸Ûq9š³@sF–‰CÇš´rVH”¯Yx±å:Ù¦ºZ¼²˜Ç9 ) YO ¶³�ù�}÷Ë̇‹€‹™S«ò·†µæ<ŸkT𽝠TÓz<–¤jú Vħ%Èpz‡�ýò Æ^†yòom “ž­´ »�ŠÜ+³|#YÆZûŒ[?w–dë6åé Fã7 r–I—p„RÒkÔà½0›l/J˜DÊ<î¨MŠòµÒB ‘äãn·ƒTןp;ÈY‚úaúbä Á¬~¶L>†-J.ŸJÐ*~P䥞:.êôs‚1↛ͷ˜…"D¢H«~–/´Pù~ËZsº“ÙPï¹××˶sŒH‹bJ0°¶e{]Ù›ëCÇiÅ�·«æòx†;Y_ ïN02x;]›_ #lÒ¶^ ÆÈ‹¾íƒÖüú�Q¾Æyö#~YjÞ‹w°¡ëi"û^púMO4B~×À�L‹ì{o;1TeðêYŒÂÒï¸.†‚f­$üú×@R ^àÑFEx¡r6Èa,æèšý�inåð5%ºáªÉ[mœqò k6Tp²òÄÞ.t%Ý’Ò�9Õ6p9@ÈÝH@æsqvå¸Y­‹Ð1<÷ÜÇxj5Wõôý26à÷¾¶aªù½ŸG¡ª0wo>SãÃ,Ír÷m1~íO¬ÜCú³p{¾]ܵK.šˆÝi¬9Æ=»60C¨—Žk�óU z_$FæäÀRGÈq.BŽö6áß�ÎÿŸðµþ%ÁDø\ekûgÅmˆVmÓ¬�º¼K]þz½­w×ÖàÇÇ÷‹LóaÜZ?9¸º…ÿˆùvó{Á½þ𫨒à½'­ÈH¢Öù‘íF÷k%ÁتZø'¼ˆ_ »’Þª‡¤8`¼–ñ�åªÎh‰ES« �ŠxaBW}ýi$ä.QÅOÜÒ‰xÇž:³0;×öûw¦^÷âÆþž‡‹CÈ,ü!¡ó�þ͜Ƒ%7�ÇÛ9Èîª*¢ô˜žÎôÎɬåæ";Ê[(èÐ/ iaský;ëÜk[%Êþià¬Ø83Üû›=:ä{e\Ä]c¯ö9ÇæÁÝ»}( ˆÐ^t§Ê …òºÈ=Ð2XôœÇ:Ên1 ‰¢ö ,w‰ ¼° N­I„jS‡¶N/›BÙÚ……¿}m'xY¥Æ¢˜Áë½Î#wÉ2Õż éÁéöõSÁ¶;ÙõînGQð¶+àNó7I†c¿Øx€q&À÷c|òí»®±7R¾ó�£ Kòq�õ%ó$¼ÔàÌÝ`T1®Ò� Z´[¬Þ'wÛÚpZDA{»QND TW«7c6ô5ýb�&È Yo¯‚wÖÐßðŽ)±X Á¥®×@s½[¡L„ÆY{OCŒ�Ö¥£´·¯Ç¾'l€¤ ˜-Þ6­ÎG\p‡øÏ‚‹‡r i®8ÞvÕÁä­@aœ{u<Æv9n�C©k-T€8 í=´:]ÂÕ“ã5 ñ£6Ç7�cC ÙBfj®çgdðzêýõ¦£O.<G8émúÓª¿*ByÐ\» âî<^ÃßZ`J[8@¤øµ¨q¢¼ŠmO#Þ“¥#¹/cµëT�‡9£ÑGçPÒL·ßl¾D å »6{~G aeIëÞÔ‹ªfMÞŒÁ¯ÅZSè’\‚Cc§Xdµ»q]•+·™ÐÊäÕÄæeÑï‹¡j·¬èŸøóçÀù e|:ÉmhòÔU¾.œ“ßŸÔ ॱ!»û)Ç@ùj¸ñ·o×ÙI¦ÜeSvëj‰êðf_µw½ötî7÷{Ÿsžd°MkkxZ2Ò~Ê|Èåë!ŽL»Gf‡4£ºJÁíÖ8°‚†sÁo|­aÄÃk9l¶à4H߆í:úœùl•?¦¦Þáìp }©Éw™‚æµÍ¬ aCsµ€‡ëp—ÃVTC.E”Aä”3~x�eb¨Û˜[¡ZF¦—+Î.ô3�ž&ÖLxZÑÛÀÚM„vü>/”7¶$ó•űpÞiç|¼N ìÖ;v£{¼“>�‹IÜÉÎi‘[r…û¥`3ˆ%¬¥#Ã`öqg@µ &±Þš‚÷œƒÂo(L`¥^Žè_<}Q8n‚ÿZÓÃYl›·Ê퇹)gS®¼ xN!ÌÚ¼U1{¢»^õ«I¦®—Ó@Ã7åcu,³ó}«Â ¤$¸xKÎ~Ÿcfó¢…i¸¶�¾Ÿšífrôßœ~}š(_}BŠ‹L`ŽhÉâR¾®Žß{P«®í_GnÄáå(vÙ§¾c´&·¿>ý·kÏÔq¾ž°Á›?¦÷OÝì,ñ«=·"á6ûìËSfB‹ ~k¾Nx×täowq{$òHp¼p² 4üÙ·aS}{&×¥Ü^gvÏG¬…_ÓJ Óˆ¶Ó¥hœ™0d1Ùë·Hµ{X’Ï"ì·éDª´ƒÙžýìF�ŒÿiÀ÷»IÀÀ·»ijp�pMàÜç�†Q�K¿0¹ k¹�ôµv¾žÄˆø”w‚&‡qT'­u9YL‰îàC¿ÖÃGð2ÿ6¹=¢ê%?¾tÞŸPjEìšÜøƒÕe‘Ü/â/Í®ž“¿{e½î›ÕD²ôMrXô!~jâÁ—’-5ùÖí¹H�[ñ–Ý~í8µw®Mµïo¢µY5ȘžI¡¤dðòvj:Á>)ðIKØ�æµ|Ê–ð·Èܲ8¼òèc<å¶)f õ¶‰M¼ù ¢‹÷kz^ÇyÙ_· ç˜íÞ~fí#ç<:AÖ™3fK nÊ‹}r*:8þ‚7áÅñÚVåëSo6×þ¬z¯[o›0T%¨Å‰Ì”hBƒî@ õ4¥M& ±3`Q€ø5öl+ÉÁó”V¶Ö>Aì·dŠ÷�°‘ 1¤¿gu¯ÂzLiž:Ú(œ~y”Ô_#¦Jë>skP´–:k¸t„F õZ3mi-!œ·K,[ýf,QŸ˜öd'ÚJ" 6Ôܯ½$F|VÑ�™ kt¹á)wºüb�SuõVõqȵ€Lê$½¸††9k7ªLù'˜‰kƒGÀWxw-۬ĆãËk1W±2µûfå0GTí¬%Æ*QÕØÌ^ÐoX†Ë>õb+5ðNM½FYŒpû¾„þu)›‚…±&Þño|ÀxúM“Ù©*J—±~ÊHÇîDø’ —žØ–ÂÿQ¦~ôÊøê#…ŽY³~ã”$é»`6Í9­S"Ö/š°Àf ZÖ´aj+Ö^Õ�”Ü¥Êp99¾ºh™m˜—ã×õוªšíž¼Óº¸èÁÏ Ni“1ôjßÖ¯‚‚ú(Ÿ[ÆïË0Z”—­ú!~�v˜Î[v÷ÜÛ‘zûË£—-s¬Ù ܽ¬»C·¥EjÌÚw=L¼Ö>l^ýQ & ¯å!3ÈIµ•�mA v&¸Ï§[n—ê�£énû&ô�s=Ñ¿Ä-˳šõ»Õí‰.LcÏ·²,�:,ï׺j´–‡~,|àÎÊø2öfd �[Rl«`Þwø¬:ûgеÇ[§ù+ñàÂÓßµ„¿·¹ûV÷Ùìû}‘l�dt`�NÔîØ³Âž¶xuA߀ºp\I¸�1M¢Þ²bµ6/Ø[>£BÑX1Øov^bÀõÔ¤¶þà}¿€´œ¬‘�ÄxËN)Wì�ﱈKêa½‰À–Ãç«vë¨N] ]Ü¢lÐoÑ2ŽÑ÷R Á7Ék²ÁöQßëê|ùçPv23—ʦ€I,‘#À4Z÷"F˜Ç|ʹ3¦É g?*O“6úÒ´ºÙþLs3ðo¦î C)ø²¨EnÚ¯õÊré[ïX,%ÿB´ÙÔúÖÞ:5¤Ê²q›­vA•=Šw…»ˆ v“îÆ¶çY×U_•Ô ä >ëW³Ï¢þ�½Çpç×ÀŽ€"6ï¥ã, -Wƒk”Î1ËoÖ(p¸b[WQÆÉžñ]ü·Î½2òÏ#ÝTâ0žrÓÄÀLm½í\µ&?ÇîªëÓó:P ÝKS,"öäú]�ö«} ½è öµGj¤*7Ž«=ö‚ÅgÃÓþjiÇR`òÅ+•[ˆRHâsÓ¡¢SÜbèÞ-eö7¸P©œ-d²s‡9ý*¯±Êè"irÔá‘’€ß—u¼^æÌ«�ÛZVv Èc”®OòÖ³¼œË`:ræXggúï‹]1i �ç��¶KÙuS ŠÙ‰¹¨Ø>Ö#lÙ*9@² 23“.Å'oˆ´&ç…QdøßÐʃÊYiAЍœC))襋UPTscWd_Zž.W¿˜Æð­š—XGIop½†t)\‹ù@ôC%(—Úþ;6C}6ï±6yÅÊ´zä[xJ¶2 Û@5ûíïáÛè£z ÒŠ¿q�ý½s�I�ó—ÞòÀc:‹X6¨Iên=ðÿ$?Ü¡ÃA�´£uåãL"@C£æÖÄ °îm�ƒ®`õ,-£Öfýß\ ´|Ó±É`¯,_ t&Å­õ9Q²90Ⱥâüxâ‹$ž-ÊΛöê·ó*…¥¼#²}Ôå¨ ¡Xl¾êß{Ã�†/dâ�1ֱݒì(› Ǭ�NrªÖ-ü»9Íù«�2šT�ïâCÒnÒýÜñq!}†Â¢u,É\~ióçÞÈk÷õŽ]�᪢#GË'anôއ€)Þ~·O×;éZ+XÆ25�Âg–po59Ïiû´ÈmGbàʈ$ ?=[ØéU@|9õ¬Z/ž×ëtŽåÇ!È~ÛÞǘÞ=Õ×)>] xÞ‡£ÕµÅ {°5¯¹„/u¤"·à¸ñ]A¬&qÂ@¿´à|Ù�)^Íä‹"¹lúx¢%€âÈ�öó�ˆ©n˜úã1­Ìw<`{+»bwÍóäù°IY¿ÐäƒGy7ú5ñ'p �DJÚÁ±ò¢E=$UœFs, ª‹¾=†e‹&7ìƒïZöñ Eâ Þ´)í“}ï©-«�*=ÙÅšêï$Žzt›l¼–ÊŠé��¯·÷nX*CVñçsðM22FW¯Ýz2öe,x/omeu’3ã«cµ_S÷0Vº=8º°­sË}R¿bwWKi%ôÊçö¥jµà¼ µðºQgSÉ›9.°;z[Bï_ ‚ën©€¿;\}µ®ù.agnGî¿tnÑ@×+D‘,6Õ²äw£ÐQ„YC¤�D¤hf¨ó©çkIaÁØjg *FÛ–m €ÐjŒÒ�é [}Mm„�Ã!bkÛ¸¤'�½pŰTúÅa%Í•k®v†OO}NŠ<¢F]•_6ȸØl¦¦œ«N3)óÖípSÊ…z¶-%¼ÙyÒë™gÕ´—ù–pÍŠûÎâ8J|!¥�_òßCqÌË9NXù8a–½%vÞ�¾TÒý}U‰D:öLP§­w|}úØ·¾|0ÎŒƒº„°Œ¬S°.õR‚Æ ¿¼>%%C4.ø6 ÏŽB¨ßÙx/¤½ÝPÑæ$ó¶3X§û’í~>åMÂ59iE§ZÑ$>¶øËqbýMh(£vZÀš€ÕµéO²÷LŒ[ŽçƒûÕH<¤‰ÖÂÛ_x”E—æmä�¯U�£�No`Ï«ÍA¥õm7u’�“˜ÓšÉ`?§âèBôhòÁGlÔ§¸Úpí‹!šÉuÃ_;½Þ–ø $/9öªøS*´Je“߫Ƈ˜D­Í ïûÀq²½ ÖY~wv;Õ$cîîæ{G3iÚ戵¤¤æ-{n²˜dû8y|O{ª,÷Qy†Í .‘2دs_{¶àÚ1_HÙŸQžgÛ‘O … uÕQ4Ū瓗ôÔX]“&b'òŒ ù‰@à2Þ°Ðð|?kp†ñ§ƒûš ýŒ°6ÞÍ�XrÊ¿–[mŠ\ZlöaJåó×€É,÷à³½åP´ýß)t—X› ®9åº)a¥±TñHLTe‘e&D)È×Ð)¹»Ñý�(ãIÀÔ¸‰F*ï�µ3€]Àn0¢ë¨]úR@bíØÎ cMp„ÄÊÚ¸`ÿ­Å³•Ëœ[>�+®pZÍe½�;Þì‘ÆÛ@ÛIeÙ{“ç5+¶™ßæ+¨kí'"dij´Þw R½“ë¶aC~ö}!Ÿ»êAý0ÝÁáï¯rãè£nâ¶B~"*y›,™x͒∸BûSÛ„Ñ [xØ8 ¦×‘8ŒÓÚïɵiœUS¯*|qϣnæ"᜸ ÁÕCÊ|NøÈ5°4ËuòŒ}É—ÆÞ5kG[0OÛ®/tÛòÁ˜6.ÛðdØöçO¬FÃãøH©üÜ{÷‚ºÉ¸<È­þKcÁtçy½nK=-ûµ¶âaßX^RÖ^í]ઉ�Bǹ¾¿Ãù| äºrûÖ·�5(ÍŤ¹Ç‡k¸ ^puŽ>àF2U‡�¨H‰˜ôó/uñÛBÏf[ZÈÆ ‹“ik}ÂìÓªù»±ˆ|[ÚüI8�¸ê{qÎ3}×™YoÛæy�½ ÷M,‘sݱ|9‡±Q¬¿6“¿kšÝÏ[ Ö­ûŒìCTFI£øè÷xûÞ.×k5 ŠaQŒò`à�æ¹F§²üm£F>°+Ï‘Ž�§#;k˜ÞløÂc;‰¶K>¶þÞ(y Í«Q‹²¤Ä æ ÷ ·Èô­¹½ÜgÁw½Ô¸%Xm—9ÁYçš þ@¶Ñ…#Á±´�äYÑ�˜7ë{ ‡?qž,í²¶á»çÅf¶¢�áUB¢ì8í8^ÌûÉvé|ÙÆN��Àè_EV\Ãl—%RF:…jA}%sXî^Ý@ËRÞÆÕ�¢ 4»AW§Él³Äà6 Á´Ùó¼ì®RÞÕÁàéoñËYþàØo », ¤ އb>Ýþ5—Ò9t,‡b'‘É‚ëARWÒqðÁ.,=ø=Î([$°WlÐ.nØÂž{m”2º3Žt€aÖøz¹‡N¡/Y Ì5Hæzì¬àã_kïùW:Ãc•ôã•ñ¹ÀnBìþož«?`2¦´*ýe¢�jÇКöfIg¢ØÞµëöRϧc¿nl;à0k*Ö¤.Yô¯�»Ïé…è[»¶0ñÑO�ükÁ‹ÇUcà�ß ‚sNîöÝÙ •Ü;Å�Û<±wä·�ÜÜù ñD“®µÚD„ÓeaR“ð+ÞÝíZ pþ%ÉÈœö¯Q‚ôNv3ûÛX!VàPkîÌŠ¿ÞT÷Ó»Nm }î„ôx¿ye ù^„µ�{l-³èÜ*"WÕ“ãê*Çk�[�RˆVuíÉ@êá§Á‹q±¾êúiê®´Ê]‹å[ëžì]µ±c…Ç|»qMSîƒÏtœ« CU(k­ÊÝÔ®9Ñ«¯Ìdw|Ö¥•ËÓ‘Œ -vµî† �¨Ê•A�_´c}Ž˜èþÍþ{/ºÖÓà¶X:@¾‘SÚÞ;õ¹ëÝòÑS�ý¹&;Ϊ>!ÌÀ"/�ºÕ!¬*´_¼ògvj€í ð­¢È2÷š&Çd„B^°­šðP�Û–­ðƒÐ“ u�'\›y'Få·à¯N@‘t—¹g;X�H�}¤¼c²M…iÆØ2%"€Æ÷�cDv±©wApøIaÈnØwOH¥\,�óÂø¦µ}[Ò¶±•dš/דï]Ì{Ââ=¾¬>..!X}0Xºq¸–í4ý?d;+ âµîöÏgņ^gÓs�#ÜV&G+_š´š��ê.éïi´ãí6k×ûŒšX_¾ï»Ð郇Y}7d;{䞘*ÝÂ/¢öÍOWKeŽ:MÖ¸ñoÉÃ굓îûÙå%Díy´ü�Žƒ¥‰Iûº'¦ÇÙÂÈ7/H:šÌÙå.nò€{TI1ŠÑ|£6KŠ_òYØat+Ðò© ï(OyeÝ›zÔd‹uLç?F`kfï¶ãBŸäË¿åÁΫջZ;ǰ&¹ÊÞÛë­¼õ:ËwÚ¾?\Ï”!ì²muZë`c¤�ÕCˆ.Ù½ßÑ•³Ü'&n¶&L66ÆéŒÉ™©ÈjøB0o£Œ>lšÖðbó Bk6ÀR!ÙÄþÔµ¯Ý>+°`÷ P"5î/K™ú«bŸ&MyDŽ:5öx;oаá|ÂnÕ•ÐXﳞŒàhW¥:4èüK~¿ÚàêàÕÂàóÓÄ}´àô¼ªçHªʧo#l$۶ßjPÑn[«ÁƒKaÀù\-qŒ·È‡§Ð'R|#û¹“d›|Ax†5G·®{bõ²´5Í.ª8d¿~|>¬7`4Cú�¨ÕìUæ·È迌«Ï'K�1ØuʄۯY³‘ÛK{9õ6ÙÚç.îu~ÒX±Ï Îðî]5 ´ÈàÒï#È«�Ó7×g�š¾,™Íù��×ÇÇy�Á‹…D«'x… ‹@�ªÝ³PâX� ¬¦g&2 dý D”O69 ¶ÇÖÎk~áhJt� ͂ÀçjI4†/y\4U¾&›él'µ¡Õò£î …$ÚåYqqÐ^s„$ø‚4 žMì²-1§+au#p××Fí�Æ?rÿÜ»ï篻æ �_{À€û|îºFä›%Z µzã�Ë.Aø"„›Í¹ƒð{Ärub¹Š2ŠúWÓÓ`oêÉÚ‹ÐÀLÇ„øõ¦¾Ý¾)-÷>½�óƒe˜½“;Óvº{ìçzbfÉÙœ“æØ ^•ˆñRþ˜ÜÜzÇÐ=h5yΗM¿X¦ØŸv‚tß¿~Àßà|†ulßپퟠ?3DùÑ!±R—À ˆ0ek*@ÁÍ#X�2 4Ð?ð? ×íì¯Y¾0Ü´!ƒ·øàc¿ÓÞ÷V«5 Úì°f�&;Ï'üÖ�-ÿôû¡I¥%Çìú&`ÏÆ3ïý™Ä:wܳÀº.d� ™ß/`8Yì…®Mïa(-cüˆÔŽ´Ðº«å a2á‰<JÙ–äì†`¨À½æÅàC.ùX®aü‰>;ÝŒ¿Éé9�±›mbÞ8žÁöLƒÜ{‡åUý�_÷ŒÔ]9wË/We�š¿QYãDs8¬ÓŽ«;“D%T¬Ü ®m1hQ˜I,ÖPßÐ`0ù…Åsk|>¸MaÌlÚ�qXU÷ŸDW7©³Ñ%A¯‹bŸX`Òÿóð??‹åÌçr‘O�{�/ÅB‰Ìy)±øŠV,áY, ê<½ÆÕÜY"˜ŒX�*VÁÔà‡rpF1�¦Ò¹ÑØý—ZÃ1­ÎøcB1z”C1n:À=L–Æ*Gk‚¨–ӡކn•[{tß;TΙoÌû¥4ÛÍàQ y#i1ìÜ®ùÀpŠbU¶rë£5—‰05ÂMMrþ„¸¬&£ËŠèpÖ*0çÎág…Îþ´Ákú”ãg+~½Œ”Ìñ¬_Ÿ›ó]ãs"Ã~áåÔZÓkh4úq–ÃÚRX•l� ÅåÐŽÿ‰d ÂöŽ'a}†ß”Í÷¨GH‹nßÔyáñ·_íù,Éꌨ¸s ±•b8U\Ÿ³y[ÖûO_â´´gA¿÷Ù—>?Z>/:Oé×˦ž©ø“ò8f)�3"§æsÀÈ]üÀ™=†¸†<ââ›T[A¼]ÓXRûû~ñ5Ø1i¶çŸ—ßR@çL\ëkÕìÇ�%dä°°@ZŒ�VÎ ´<üÑ9#gœ=’ͦrr_kpÜD¯Â°’äÞ\´ÿß2d’gúäÉ„ÌÌ�Nÿ?Ï?_¼ê}zèŸWt«¿6<æƒùÇÐÈ ‡ø”ÿ½d\ay§ +óñ÷·½ ~8;—)Ãöu¡XamRuO2~¯x<à Lté¢ÿŠ¡@ce¾#�1GU0æJE»q—ãNa­Ð v ¼Jfål¹;«ÅîbtA#)ŽêÄÍrsZŽ k…ÊËCÈBRþ’É~à僙ÕÒæ‘³¹ÆFÄæ°„‹6b��”)0x{69‡•]ccšà «(Ö, aL„ŠÓ" ½€…럜¸TtÒÅ5½Èª4ôyÙa)'5Œ¬›§‚»Î<¶Ô5¤MìÚ0Þà U‚ü–œÑ`!§9–°ç²Þ¿Ï¯åð»]ì.³|‚y†,ü‰â!DÿQÏu*Ni‘ÛèCüopÅ6,à írÞ]æÎ}–öÇ¿˜-Îká®qlho5ž¬œ>jûe‡—æƒE@`R®uéÁò:kÂTœR5´[Ö.x˜ìó\Ûþ§£ÉýBæIdùÏT¢ J?mlJA[Ø &?:^nSÿUÔ{>çûãcUñxD»ÏÝ\]èu­Gz>œàš¶u‚ÊÛ¨á"k{”�d¢�äu7å­? ãÛ6›6Î÷*ÞЙÅZ9&ØóabޱêDqó§®76`Ÿîi»�ÝÀ¤$3býU5ƒ7-O }êöh p½ÁMï!ûðàé$ä b] ニÄ×÷Ü`FpU¤ço¿Q{òÍÏ·H½sF;}–¥ �-íû +æÌ‚ÑDçïKwWLmW°¼ñ\ÓëâîÜî— ´A!\‡E>† o�ËܦY5šÃììäŠo€] |XÈ_-£” ¦»Go!©˜Ã®¡~EïF— PŠŸtô�§y‹­ ³ÄMÁŸRÝæL3¶¨þ#È~›¨3pþös7”ÉØ½ð7ìáî= ¶�U² )áÇ{4§“gæ]!¬A ¯ÙæO5>ùÓ–Ïsù¯Ñ§e �ìžø;4c:ó^º“l”sø6Ï®þ_í-¸W4>ÝÈ ñÄ{¨mC(û+lVá#|æíÊ•ŽÈç7 ˆ,üÁ@•§#ɾxôSf~'ÞVñMüNyU.ÜÎ}íy«ÜoæÂåóC¥ÓR�í²âÃJ¨.eÿ–†aíÊÛtKÐBƒ$ÏÆ s ¢‘Ì„gy|[˜HuØ�±8¦0q›wñ:¸¹e´LÖ/Ö[°¦¿Ñ�[Y¦ªþ™\(úßD u…rÌûÏ{þ+Ðì·§>ØßZ�Ø4àg¤Ç*AwŠùy(+¥è jà²â1‹*GÌ+ÏI2|‡€^YÎçe§¦pºVômk|I{±µ›) \Â6¤ˆÿ7i×È ZØúÐ÷ºÔ‡Ôžé±’µåøB›4í«zÔö‚ð>~#T�Ý$J•¶ â«%9¾.cV-R»+§{x-ó(>–Z ¡Ë„b€¯DÀž†5tÁ”¼ì<ªØŽþe·½1οW™ÑbªÀn^áË.+;pzÖfÃ}¦êà�¡Ì`ð®æS!µ@#"ë`—‰Ñh;òxÇoÀ‰¡‚¿ŸñÛ9�»¶‰\ˆ@@¤ø-ßî[üƘ‡Õ¨—M?æÝòº€5_¡)•`È|¿[ãm†ŸX—¿âÖ½he:©ÏqÇÿPÆú@ç“® QŒÿ *ÂF=ÄO5©?ßýÈ¡ sZÖ�i3`R1`"ôÏ�ÂWP¨°›yx å?ÑäÉpœ�9G ZnñZŠ@`õ><2®€0{5MÒ´W‚…·Š:8�;^¿ÛJ•ƒ½uꪜ@Àrµç$PÏ%̃}°í ãÇ®ËU×+ÕŘ»�Ý0Ú` 8ÜjÑÌ|ÔÐ ô¶tKaëïÚ‹Kîb3ŠþÝÞàw VŽpwjEŒ½dm}¥òBù3båÍóq—±9#×ï�¶•Ô¸?úÏônx1>¾×9õ¤MY´w26þðÉ] 1MMõ5ys¼þ¦e<ë®!sÊ–:e²&xÚ;g¦i¢‚§ë /L‰k"�W°'P 7FÏvÝÜ9( €Å˜¸šs˜…ßo›Xp‘�‰~ä†õ`yQƲïÅþ×ëNZ2Ç Ý%ÂGÂ0ó ŠÖßì�ŒÉ¥‡øÚÒºcãXa(~þ£Ó£¯.è-£“@ ØÙž^Òú³†o·#Õñ›ÚÚæþ¡jLÓ6‚§ÿ‚è×#铳°æ°¡ÅÕ¢Oiük)×Þw¿”i?Ú îw Iö×~*³bƒ�5°/äD#†òn óžhÛ£ñÐn€ÛÚXÁËw-0.^q֦ٞŢš{�X%(HZ'¬îÎ銦MöjÞÜ`ŸÓ]ž· €(–˶nÌÐ5ôÃûf¥²¸°X¶3ìãXjOqÿ|‹Oí™Ûc…&?ø…˜ñ«ù–).Ú0� +‹K¸/õÕ€“%tB.hÃþ<»ðÃMHsí?Ç�ì!Î"˜1v®k;ÈœY=ŠªжêmÙ¼t‹õ—Ôa{²Eøv0ÆÁs­BÅ)IÆ(ƶ€æºHü>^ŽG²‘é´ò§¤�û ð“Ç〱¬‚וg�Ó‹@âSUjøh½uvŸËÈîîƒÀ)ýtä&ïH�kÒiSOœí™"`êŠHˆ•ôì‰Ã0n«:….öŒm_ˆ‰7 ŠFô 1ïºÏ–W8�Œöq‹É'þ8'Æ··NØa—Iü­�^ÝZ-°7.¯ãKçi°¬Ö²I�C[›˜¬¯¦¡¾™I£×1RRÑ{Ø0}�êô†%Ês£ûógùÉo�KŒÄ¢Í(»ëöòfÇȾ.†x›q›ÁôüоPåŠ?XnÄÇþ< ƒã–ÈeJ©ø†‰Ó½Ôf÷Uðq6óŽÖÝŽ¸¤×™69~U)íex²jBŽÝ1ïßx=o-—0pÍ@œÁþgtVɰ½WwtU¬Jïvûâ²Ðt?bOìIßÌE÷O|¶ÄßiY7úZD;–èsÉt°¼à:KW 7ÉÈZȧŸÉþ'›N v�1þŠdæÀ;ó*ð°÷} <´{6%4ÇQ}¿°á:«û[¥³ã§Ê�â&-÷ú0ªÎ¤×¨sgÖW ßilpFUwD/Ùσü�ǵžj¸hÙžÞáZ¯ÂÕCÈøìÝÆŸæÛ[á»;ÅR7ô÷·ë7¹ë­}:W,mÃÁsÛšß°A°1úË7)¦&Ÿ/›˜>˧ê¾ä¤Iýlªc“Åö ÅÖáØ„„Bfƒ•…×1}†Í°·eØúA¼K›Þ˜2$E6zÁ[s\#Ï{zBÓ‡5ÜškI’«Ùápë‰}ÎÛšäcrRük±EÆÊi3Ì�ví�ÞÎ;®zñÌ܈vpšÊòÞíß\f|Fà * j^ïiƒ Õ�ÿ…ÝeuK¤3­æ,{œÈ[Ç¿mØ¢Løð×Ö9âX¼ñ r£¸Ô)¾�3§Õj¼«5axFꬤ¬¾¹b:œìš4@x1¶™îHöÞxKLjðzvù¡wźÔ9K…5qŠYv F3�&Å•g{]òºhÉ¤Îæó(+bMí®.Ž­b 諵‹¬·ˆ J›¯yqªv¾ìò(ÿZÏë(÷Zv_vçu¾­ì 9 ”e{Ö9¦§Y?YvÖa àüp‰wp�Ës£W‘\vr­`@ÚuëÅhªÝÐèLÄ1_'š¿”ÝhüÖ¥Æ÷6�߃ð¿ïÀª;»+·(FòRÉ#¶ F.´]"µ>ÕßhÖòþäi:Õï ´P›¥“¼ŒX.Œî‚²k�mž¬^Æ4®44âM�~t³Ow•nkx`ºÊO ßóû8Ç%dvÌ·Ù×e¯KiTç¬JÊûnæ…ûXL‚”çöa'¯(�Hï®ùf±x~Y gš·éÄ|¾—Á»ÞcÓ£§µ°0›òŒE[—´ÓÕŽ@Üsoâ¥Ikà1ÕdÏ�­±Þ´Ãû†O}„¯ŽX¶½eÇ}}ó„“å-¤¾EPÈ(#‚p9ªòn7ÿ:ò’&gm! m¼!¯[©Λ­$ùò²:s 4åÍš;6‘Ü•~þÔvZöuÝÿiÈí>waó9�—K TuuPÓ2‡ B…—eº­²׿1¾Vâлi-ì†q bñ_ÃYÛOƒÖ¼ x(±…%ö)ÖKœ‰ÎÎÑïR1ˆS޾>Ý5`(¸OX�\¶Ámý÷?o{‹Ó¾½9�ʽ¿%ƒwIrßð0ÁËh7ìÓÃ;`â{)B¹…û+�ëÝk»8¯¯C;tÐæöz™ (@YÙ.—Îj»îéýVÇ}§÷¦Gg«)óÅããq_~¾zuˆX/¡2+tåà�³Ýá¾Ë†-!¯ÞoÀÒÞo®to¿žÎš"jÆïó/ʼßÊIý‰2!ß+œœ6_`?»yäÝêÄGDb Ùõ÷f,‚ç•%®5¢qìgœ…�–›-£&~è^ ÍU—ûˆ[uà�×O4K©±�/®/+æ"a8Ù K/†îÒW ñ¾ôn·<ãF'ÌV[Òû²5†¾þ NšJÂ× —w5ž%–݉é4eúºçœ~ }öõØ ©!g;o™öÎ: p5•®â¥`€qÞü|íŸÏ!‹c°’Oç~�ô�–P¡ë¾03Wü­Ëž,ÇtaæØ8 �íý„Ræ+œä™É�óc“VÈBý~^&IBˆï.³{jäö]�JÜ1¸6×r³Û�b߯Õö@k§7£ÖÇîFWºž@b'Š´®Ù *÷EÌúùƒ(@k°�ª¶ÅŒ%«ðçrW`ñÍAI3ŽF5·w¦píy»”LÔ_›|bSóêre5�‘‰„Q–¯h<õslŠ’†åUQêøÙÇÌWú 6.±¤ôc"/>«…íá�´¾:­´ydó5ò7?Ÿ¶Vê$âÛµNH7RQ˜J\ÐZ–ûD›l$5yü¹2Sg´à¹³¥}Ͷ‘&q�¹ÚÛcúý¤­O‡�V¸ï½ƒ æ“VÀÛªÙÊW~Ù0/gútš_V'ó¥xÀ·˜•Í‚:@±"xLmÊ Fì#’vÄzöÈ݉˜Þ¾:Õjÿ^ã¸ÞÃ#9º Qƒ¼Â ^Ù…­pdÑlk9Àj:¥÷Ssƒ´¾ÃlЃò~)� ~‡¸cVŽE©y}¬N±K¨ç¯�µ=!­|¦6¼BœËãq˜:´#0+³Ô+vzà{5·ÝÛhV¶3ûÙúÜ–!ý«ùKÓÐÝSåí}Æ6Wl5´Î›Ù$² F»3R£ù åÆÞ¬óV€3êžmÞâ¼£úÁ g¸õ$õ„ .ÂF‰`æJ)¬.ˆ7LQÇq½5ç'gzª0å·v© àºâpKëßu\æ5N›Ø(³8F¤C‘7ÖCU‘³E VDóHôQ¼ír¢ûYæ=(¶k榷ûzÀçeL˜ÀÌ··¸ý† >äM.|ƒTNê“bz¤E/H{Z37/Pæi¹ÏkZ²¬ÜºŽ„5JÝð–Ó!•;¼wL �ųpÖÆ*9ׄiÀe8ùZç�‹OwÚp(›C¢™�éw©ä⊠˜;Tà7ìÛ|ôêïïjD(4~Ø£ƒEµ¤u¬Û€VƒŒöÍ‚>]ĉFB[Uv_ÏtÁ)‹6*Ñ¢I@¥o)@! .Úìk,6 G|N1õ­­¢SnÂin)ËhÃ„Š®¹€Â�K »Ô';uçÓ™.[œ Yd3Qxt¿åµ­¯^ºUBÊ xÞ\F\TâyÄÑÐ=úò!bˆ¤œÆŒí�¶’Ú4ý‹>�Ûb~ì3ü ·ëv¾’©JXû²w ¦®GQÁë*�VûL¬vã®-¡hÇË'~%ãÚÆ‹\2÷‰`’ç~ô¶a8k gº“ž„´Áåök›Å år£ç-�ÿGãÀ|éMf°„j‰rØh B #Ì+8sKûº[?šý‹Ûïz˜ŠØÈ'¾" Ÿ öiÇå =‹�ååÊú ôê·‰üø¬Eš-Ëq­Ë”„ä Wz URìsQ,®T4¦�tg÷,Š%ˆz@csµ¡w!k}�nû¼g 3ýX°z“KõŠÝhí¦ �†~ÂT‡§Ûø8�ÄÊs" õ¼ïGšÁ²öÿQÜqP@¢òÀr9 n º:÷…x4[üșԒÛàéWȨ¶bT†*ËÛ1!S0Ïã6Þ°e—öF1â!Gý[Ë. ÛÚEA@Ž+µäÜ7�„S�ë© ·ºÁ�Ö"í5Š%> W&#/»t“Ñä=ÇE~Ïç²G¼¡ióÆÿ`*(>rˆwÓûm·;{Í44 @AàbG]ä3'YØ×lmü=&ñÓ×ØÏƒkšKýÞ282÷9jÂFÀŠòpÎï�œÕ5¶úØ-z{ÅÛíE’x¶ ûcF’Ľ=Þ­Ìø#õíû–AZ—N„û]ôd—.ŒñðvÉäÈg:Ig¦·CŠ«cºù4¤‡Àq &v»glNÙœÅë?R·ß#ÛÒT Úö$ò[œzü>o“Àm…3~ Q¡NxtÁÒ7ë` ]•n`ûo¦­»2»n�Å0 ‚BÕœö+/Ø-¯:a|Ó²·±R_hÒêzŸ|‚Ä®Ö4‰ù„tÇhsB¥|  W–T}ð1•S϶ÕA˜qÀä ØúåÙ¨¾…Ãz¾sç—eí¦˜ï3ÐRÖK£°—”Œí56ˆíÏö(…nG¥,jožHT©ë� ½¸VG«blÍ5úY‚Dy A-è¢ ó·¸Fór:ôù®�‰Ÿ$GÑÁ”ŽRoÎuSx¼Õµ/îÕÁ7kJÉ7³ìy@Fà®°HºJ­fXp0<™•‡DðR ±=ä†ak±×@Ç3óÏq÷"Á«¯z ¼–½dKÝJËà‹#ñuâßÒrÎ4‰^-êö�£XnótªÔ ‹¦Ñ¤56r(&!aå¤<^†�TÔ„¦u“õ9{K›±gzlú¸…©0m·ÞÍîÀLk‘@ÏL÷áù›ÓF¹ìï„~Ý6U li#~a/×þàh%¼3úp|4.{–¤jÖZ'`מÓM}¶M‚è]N‡¾éÙW[›Köבm[˜ËS¥÷Ù&Pª ‚^73:bf¶,Q}vàZ¾‚yLo#¤hÛ+žæž87̺c·`Ð@bèMSZ§�¿Ö‰zcÂ&-ëé°�DÁy:™î.Ìÿ}6±Þ u'¯™i6z´8ûã&ûˆ¶¹en“_î°ÌÆB?“®ßª¶ê¨5€“ÅÜ~ãlÝï.R§‹�; ñ÷!—átz$6{ã\ ©| å̸ý7·iϤE·3Ç=_Wï #Á~œ îV‹E<�ÜØã•å�È{Xó‚{œæÙY–ÊɑΖÖk…dzo‘�M‡z›\:'²\uî]C‚<ôNöä¥àõt»—>_ ùB¤‡¬™ <~çS•DÙ¹ž“í?Ÿr›$Aø²;œ¡¼gùưa茸ßb$g¥mõCOà1dW?sõIo®ÛEÖƒ8#ÆÍ~]�ÃÁ°f+”qPõ×Ð7úÎ6€cT�$é~`«µ[iŒm´3FiÖO€Ü4¢¶L¯I�·U##E£ ¥ç{Õ¸8Û+Èîâ!ϳ?o)"IQhèq× pR,P|0ý) ¹Ø"þ{¶4¥²{}÷Ÿw/«›6 I¾iûžï“¢š*ž1n3‘ÿ mÞúÝ'F ‘.UP‹C\Sß9ó±[V™ö£�0<š�¤ñȾ* ŒÜ 'ZÆýºb .,ŽQõÛò<‹ÎK�á Wý./ýPáG‡;æúš©siöpÛúeæUÃØìôÀƒ yú®¿]�;øî=è†úº]ê\üb©¶Ž—ykT^Íq`a¿h×E.V¿< òãªíߣ›Éà�ÙÁ g#Â_Ï?®ºŽyç­÷ïšñü_1ùëÛðwÞ˜¸ \MêS´\§Ì˜lã Û7µ%&_[ÙYlw“Ö7ÏåͬmÀ^[¹üe*Æõðí#]4îð®}ÄšÙ3ã̾¬¿Zš×uªN¹ÏH Q¬§Ä3±bm7¸ã´žÄZ±hÒªÖaD�H€Ëa´ø|�=ˆ”’{Lѽ¶Ùq/åi/Xp $¦È ç¹PB3´–bëWàè�·æŠ]2.G(�y cȈ7#;Á•ñö.9®äÛ³¤8"`¸ øÜ°wÃÝÿj&Ný�@;AGe jä+X°:qÓ”§^ãˆs}Tó?¤½Â§Z1�^BØ u³bÇ×Ç­ÏRnQìæt0k0È·ØÌÚÛ�|ÈùÛ7�nWJ?tÎoæ0ŸÚ!¦=‚é=´P“Ýß”]åZÍi!;ª“ 梲VÏ=©|…KÙ°\Nà$>—äð c�Þx»çáðFª•<׌éÔàþ‘ø}”ÞÒc�ÝlüZ&}Oœ¹öæÇ¸M IÓ[d†"T;¿ý@l Ñ<÷¿É?É� g¦ÓQ,Ý4‚ÝeFÆž'V¡êÙà—²Ü yL•�ç [Gye«‡?ËËöü•¼ œ·Å(YÕ¼†-iäy©×ÄÙU ¿ >Á›®Þp#OpßTüªáÑÇ1ó^ÉÖëÞ#š{#eäWAÛ­�Œÿ<rê6 "á{OLF¤„t–ZR»š›6íЃÈ¡7Ê•}À÷e>£ú ³ÔA-'FÚkå­[~ìA´ØÔ¸†AõpHá}‹ðý-÷o�³z›ÚïÎ�YÎõ«Ÿ¶©�þ Ëh<Jnžãî}Œp7.¶¤Ûôñôk³¬qLy…ðyw0ÿ—~À6ã'ö¯ÍƒZìxñ†¥œ¯%zÏ bV…Û‚Ÿh/µYÛ�� “Îu6· ¤ÜÕü+Ìb NB¢óã†ç)5MÑXÏ–‘ÃÁô½:ö¤“bpÜÏÐ}{Ø,B*Yr0¦|RØðþtêEqLÀµþ8‡äá~¿—ïå“×ãÃ%>±íôÏGáÂu²fdÃëŸ]O_<Òùè^á«#í)Šß9:žõuïg¯Û÷íÙ·~ìd Ù_ˆ ‹)  ‰§N^Â¥,¸–K+QûI„;=›àÀ¥Ò&d^yĦýSXûìì^¯ñ5 Ç!ÜÓ|0–½­¾N¶_ÄŸaººç«„KS�Ö÷°]öøØ �(·#³§ØwÀºzÖæå>l¥ã�~('T=ÒöÆÂ±‰f¥’|­Žá< oÛÒY+Wï ýXh!6Ç+½[¼wK­ò-û&Ÿ-…… ¬Å¯�TÛ�´n 9îCz|5 #p7.ˆŽíѽ•È‚ºmÝñƒ0ï…Ã^6ýÊò\äÿ<š=~g÷©Q[ÉÂYB¸]¶KÌ+ºÛ[Ô9ÚÝêRYÌantÿc[8ÂÝÇS7Òܸó;& îS ½’dæ*К•0¦dú{>ÿ<”ǃktƒ* .ØrMèkÅóï >§ÏW3Ñ V ÔÇ9ªß0«íªº�’ ã\5yœç]F’y°À�¤ã?ÍÜceÌ3q�eò*؃³NײÌ5�ž±`ñ¥Öqc}\�~YEràm‡cß6CZs ôye¢re~?Êõç[è@[¿Zþ»KîH±y¿!Õ+ž³ _F!¬ºJò ¶Î‚Ò•éFvÆìü¿>¯2ýï'Ü™¶ú? Bh>š2ÓÛjæ˜trÍ»·Ng§MÜ Xdx$ n̤#‚Á€³{u)uí©î¥µDÄ£“ß�BCÙ�Ÿ,5ŸqÛ˜ŒGpðÑ †î®øpµføä5Â_þË#Â-Œ¸/-Ûoû ûñ¿§ åŸ/hÕ€ï*4ºÇ§4H'÷b1NîG�›;E¯­ßaÜ`8ø™G_ïFýNL0ƒ³Oãß??µ…ÝäáuÉÛS,Ý>5Í‚1(FÛT ûFœƒ[ÄF¸“FÔm§™?ªÌ™13kFU�¹ol o¿±q_µ°íªË�”t&—dݽâ†ë£«@®,•¨.ïá ­µ†Õö×Äpölu‚1 nAÔÓõ§)P*wÚ˜&ÚÐ(òØ % J¡AÜ÷m¾Z÷# 4Vèäl Ä^\Þ ÿmø~'.œÛí|A{†¸¼³�� áUŒ§Ú–oA¥~ZµôE†²dç„�ü‚fO‰’gÌ™�=ëíï³á›÷ùãžäûóËóë­|Òî*žà\°}{cÒ\šûŽÎa4€¼Ø ÝüöaRƒÌùPƒ˜™,ã}Ù°+:VórcͶª; ×;<Õ¸þʲwF¤¬àp÷¼˜-ÌŠrÀòzˆ‚¼í¥Ýk1ãYH�Ÿ`¹†aaSFîÕ¨§‹ `„!öŠŸ d\õƒ©ÄE @¯;º¯w³ŠK–Y�ýÌ[fÙ[ñÍoçºbÍéç|¢Äe40pøüÓÍ}Î89û Î‰£šDƒÝ\¨¦n¯ÂÄCdt¶As‹Ô ì%l!uT×¢úˆklHKMxÇrû à‹«üpÌòm”¨€=jÈoÍÄ_©Ø²€¿TÿBÛ Nï6R6~êÝÛƒ…dΫ«}ÅŽjVs§Q°³�ÙQ1=RíïËÈ©óîïzX…ž88@�±ÄVjGö,˲s9°XÞÛÃéºvM•‘íWm´€Ø™'ŽŒSØ5Êô|ÁÌŒwW:É4fãèQ„¸ >àí�¡k•{uÑÂkB|BüZ¬­…C¾6 F°Ücq”±ˆõQ³,¥_›“,aòRP¯E-IOlͱ·PE´¶w¶´©/»2‡]•P–fè2¾jöh, �˜ô¨%¸ü€üÛ–„�–Ñ�tÚ¼\(‹.лÆBµŽr¡ <Ì{Våg—…ÁÓà�nãøô½ÄÈ3ô¸;}å„1{ü÷{A’÷¥8+D5íŸm-x>kSQ‡‚è¬ìbŽYôÀò.ò"�^0DÍ�YAã`¢ bŒà—X;©1ìÙ»mzðá£3E\d[8.#ãc¡·#‚Y7+¤Ë”��¾Å¯Šƒà6Ð' &–æTÄ œ+ŽrUêÑàÇ­ � § ÌY2=¥·®ÁÇ´/<«Ý“çûS®¼dºÖæíê#í˜,)ÏEÁ˜=(3 „¿ª9$‚'2³´i9ok<=›ß+2ÖbfKšÄ�ST9ñ…ɰ6> j˜fsð’_d›^Hš••É$UK7Ýô)‘&` �ØÚ ã/⃲¡N¦rI½îó¡ 6Ò͇ñFK3Báz˜H”¼V‰wÀ <T‘‹9ͳÖk2§a"î½A8­â¬´×Ô\·‡6º%-±Ë5ˆ†`�æ%¶pÐ�«”¯¶1˜È@."òÉŠ1飈=éP;kæt×[ÙËëë~oŽOS�?7·Å‰/¿�SÏ·Åïgžßç&dɘ@ õÈtSà`Ò!†®™d°;Ì(§ä‘ P gÚDú 9µÂ|-º`vläI¤ ì{àïïõÈ\—ñ›ÙyÆ¥›åé P‹™·ò"›ÿÀ*4RõÅ£«íî<‡D Ä𾕴}¾—òvÿjïà›,œ¢$(^2ïnv¯PNRCÎôðaå3É]FD%Æá¡ýålå*ÎEº�gW‚´¯†¦ì„îí)û&ÐÖD70–vyÛgÙž¨R`"RÅ—ÜìòC�`Õàr®þ5<‰ˆIÈÊ&„Q¬K¶Ö;ð[ƒÍjÞ](úvuàà*„6*� ‹ìŽ<„[à ˆè‰÷°ò¿”b=HëKŠÒy›ïn`Da ÅC¼$Âim– ¬óf›�ÓÓH¾°ì˜w�é«Oh¶AR‘dŽm³,kë¾ <±‹ÓÛCsy|>íý‰æ n³Ë«ŠuW¨#i8¿M¬»&Õ—eC�‡b‡Ð4½w¶zÆø“l�n6c¹a%’öÞš7úAÜŒÌBGó‘AÈ=pðVºÝë9s‹)óŸ4ôÊý�îS¾‡/ǰ!ÖÙ´!C�¿žæ-YÇŒžX$™ ÇI•–1ÇÛ•�k¼%´a΀„Åšzÿk‘ L€:¶ËQ±LwZ*äXííAÝï‚§õ?›œ?zÍ9uVúÓÚó:�\KÙt+&ÂËžÌèeóÕ™ðö2ßk §�a¨Z,®ÀW×ݲ♚�`íâE6ùæ²G„ìôÌw%Í)u0c±|ëgí¿°Hµl`ÿz/aßŸŠ Hw‰ê÷íã/ \­}‚Äk[—¯»Æb‰ üƆ$9y²ÂŽ*¾ǘ"pá Ò(NY0Q– zHh°¯T~ð£ì°ýÎÉø—µ"u”0V]ŽÓ�qÒ€ê¥R9­+–4ï�Ÿ¤¹+cÌ.Y{¥Øþ°y[¤9 ~¯L.ýtôecƒŸ¾ÊX¹�=$†°áŠDv‰Å´S—´&-еQ;i›e_Ж’aiŒË烴HÝ„`ƒ˜N-™1kS8… z¢™Ñ®ßÕÝnr;ݼ5l£��ã!Þ^ªêAÄàwK[é‹Wr6Ϥ7ˆ? @dï!~1øÛµ_©Åµ582Ï®Þq Mûœ\‚oÃÊ®H3�Y(*Â]{í%î¡”ñdN)“e›ü@�f·³¼•LäP/‹#ä1 �wÓbX™¦é@èÐ�»°;°[Q'l�ïs‚š6×Ì.ùËXx+‰LMÜ©²�ƒ¼Òü—ßNÖQ¸iÊú$ŸéE|¸>‚«­Ý-¥4ŽFrã¦þ ¬ïf…óªÚÁ¹ÓK†zm¦ÂKlmAÃ1à¤a²eöp#¶DÙŒÉt{ûf å{!æÆ�–ÌO6´·‰¸9Ç6Ÿ GÒ™hŸçXIE:ȉ‹†îB¯c (l<‡õËӮ-Lë¹�®Û2Jµéq •^aDfÈ^ñ/ ¿²<;}./ÿGà{͸ñ@Y»ø¯+ Z�ÇQd}ñÒh¯#{€ÿ8ýŒ¤èrÛ³„¿š š7[Eü<Ð;Ï5t>Î)/´Ë~ÐlI̬på85íld¨ù4ö1€¶CA8þ·¨ÈomvØ¿#sëSÓÌê- ¶úüïdìxe ˜¯ÒÆ.’è9˜ÅUbÍdü‡—3}sLUò‚T;T ¶ ¦·&Ù™.iî¢|gæÛ?ëêÚØQ˜¥úûв†âÞ=|sÏ é‘þtO%n¯µ>à䉸¶ºî5·‹@‡ü?¬‘k�Õ‡éV±}Ï„'Yñ²zÔc”YœíÁãÀ$þK†1WgþƒÍh’L6+Øž£¨ì0vdL#5¢;—a4-zy{lyc¿ÆZ}A‰e»§´�2qVÁŽ]q�niµP–Ø­Ø9¥Aì 2Yl£äõ3»ßAO�ÛZõíE ï…æÓºèys®s{l6 ÐJ!m<®Ä툭ãÉúóFÒ=‡êM’À7ª¬M…عiz]i[�a5iÑ7ƒ¦`ù�{WáNÖYC:»UÛ>Pan‘°`€ú *c—‘QÙU)›ÄùGgePd8œXdz°–Üð·m‘Á`›ýŸß:[i®ß æ;lê[ð®Ã�QÚ�:ËåÊFý¼^(ÔR€bäÕûó=w‚�¸òÚÉV[€8{ÔýyF™ð;ÝZ;)„]èz‡àÊ7’ù³rÚOœ¦hÐþrÎ+Á'b²kî�Ʊé2Râ3ÁŠìš¶!€;EÃ<À´ô³w¥éð±Rº<‘ÒóˆPÒéÊ]ŽdÝ)o±CøjR&pêW(>]ïPneeÅ—+˜3~vë;^]!ÍÃ>8‹–[¼ˆ}Boì7ÖÖ;@öì'G¸Úä[÷íØèœQø%¯n�ì~Å@îÚ-:_â-‚´Ø­qS Ìï7·îéi -Ç"|Zô«%YL/JqÚùp¾°–Jô��!)4úoõµÐÃyÌø>5á=4Ï9-Wßãü8½0ÈíFÚÁûø¹%-Ÿ¯€L0Fƒ í¶–¶}«€ºå§†FÔ€û6‚9[;ŽtwÇkë^ÿ«Æ¶‡ó¸hZêôþâZ–3z\RuÈ*ºýBEY- ¶.&nã¿ áöë¶Mûä)µ‹ ¿YÙ¬¸p9È Yäoæ¶ÊMF3¯�ªsI°Sü&cÊ)`ýø? 0&]™ƒy~ñÏÛÁ­ä⥱Ëd<1Á™½†ÆI¨Ì�´ž—ÞPh÷-yJKg!1ie^MaL8& Eï3­§�pU½�v,úQÔh»ög—¬wŽãíZí7g³líVæÑËXùè­Ã Æ©§ŽÈØØzÞ’¸ÇÓ°ãgžw<²{@뛢™ök:ßm®DwíÒZ?g6�Ž�fâ³ÚlOÞŸ6•_¦6¿±wŒmÕ®üª0É¡d»lÓ0°’Ï÷#x{q¹°ö,—k}�ñß– �*WéNÒêO\€ûÙbžw¡ ²øiIf;M*Ù 93Å,|^�¿[‚ÖÛì òÐo:äIŒgníÀ‹j³Ó©æ$¬òª� ; 3&¨‹Y�æ—‹wOÆ@´YwÞâÝ…ÏdÆKØ8’f�#‚É…ƒ ĸ¸Ù!tŠm”dÖ™X¯©i)Ǥ«v¼ŒX�FôLö }çÁ�]í³«ÍÍèßÑgžtù¦¶Z×ÂÑ�˜u1Lá!ÞÈ{Yî y —–M‡sI¡vÊ3ìn©™;&=+‰8v)Ts7Ç NÖKC6¸¯a$æ}™­Y�A~ã@Â= âeA¶¼5¦1Iè1ŠR†�4‰t¬xIdn”�)D6 é»Ï$èaào�Ø^0µ™è9øä癊Á¢eñœþÙå=~’ÁÈ™nºšPŸa”ÚʾÇËš�Mý¤_ëàƒÁëþ/.ÛnÉJUÁkÞßJ/Œµ� Q@ç–îZõŒòÖà•Ý í1W�"îÂr !§¤¸�ëh×·1ˆÚk»mÀ–lÙ–]OAþÈvCS®Ýцù,ø}¹Å’=Ã(;W*w°¡«jP„ueýÂF”1àjšèíS�†¸ö*E}9–£‰´¥�z©ƒ§q,Z£ÚQ—šç�WÞlŠ? à3äÖ¡M©o;ª.K­1�q-‹b4ÀeC—W­\DÀÇDt–I X«Tíóbm<.?X›/.Ò[|Jšúm¤çš`×x±6eGÂÈ‚¢8‡âë`ì‡/ ‹jä³h?-à¬aN±¿Ž‚'"6P?mKâ[eGxÞò 8pîßhÞÐr9m•·ÐiÉkÖ‰ yjkʆ¨ájÖ U‚EHkJlkhرú|ÅÃ!¥£«Fe-Dp†º\ò¶–o26¼öȲks8• ÇÃùÏ7NB–~´Oˆ¯‹ë±|Aƒ†¾èuì$‚ƒá鯅7õD¨½Ý°z›”&©“Õ·<ËãSyd9Çé'øF¢·™ÚX5\Þˆ)Ü;m…�ã¡…ì.í~‘Riã.ܽ™ð<΀Þâ%x%‘ ¶H'9½p¡²we4ýœö¯žŽ*‹L;OV£“äˆÍÇS )6(=¿(rCÌ�Ô2j­€3n£ÎèG˜$µé—oËØ`^„ý ;YÔïf´P ЖïbCͱôfuÜéEÄ"¦zžn.�53 ¯fè…~Ÿ$í“kçs§® ô±OMšF-k»ê´*[3彤Î#o+7»"­AY¹}Øçæª�š3mÖl.þõÔ>2Â>Qw,�}¢Á{^6e¦UÃë"!ÞøH{¼ûz¾ÁÉáP\T–Þ©Œ6)1 A|!Ýl.U‡®äÙH‚±qõìnSŽ~Ùp‚O‚/‚ªtNR¶H¯¼¦d¬49ò•¶ô©Ï<hß4|G!‚$¦žW>q½+†‘žÃuI�¥Úʾ5E˜±+'Û¨Ä�}à=D¶¨#yÉc†Mï}N[ù#2½�g…xjkž9ˆ_EjŽÔ`úJBíÍÇágÍfþ�B·Ißµ_ÈÉgX#E‚½°šõrƒ2êÍËzça.ô¸±Œê“…W„Ó6Rë-:î+…níØc¦ ËÄa`I1ÄØÈ?l4(sa’,’ùk/výàŠwá=Ú�.B6Bã·xVÀéñ¬…Þ¯—{fAÕäú”�À³³�ÕñW�ØwG UØC†ˆ±_Ó�ß¿~ BU>Ðà&†. u½¥¦óí²/fÎúUqÁ²òH±ùB˜:Á»ê;–Èãaˆ½Zàv™3™%CF´L³¸Ž™QµpØe@±ƒ:ú…f6·Q=í¨%—|ÁLŽÜ³n;C±pù4¼�Òæ…f\±¦ÝH á!×ïEÐJÞ‚üè¬Whî”* B®‹=hÒü¤®ï¼¦¨k7 >T…¿{íX¼)ôïæL&¼?#QP$‚sm�±’1 ƒR+>ü¶Ào·Å9%› §˜�BšÞµ{3Ðädt«UK„+MgWjÈJRÅ�ÝÛSë�’R�û«„Ç,ùÈýA�¾ü=DÖxvbAÐ •}ƒ�}òÔ¼sÓðÓ',yT y„r7µŒ —Um(Zî÷{}xÁxmß“å£Ü§=9êÃôqæ×sh9Ô%~k¹K`œ i5çiNH(ádŠ¿<~üáÉõË.Çð`œ�RÙ#�EíkbæÔæü{ð…‘ÀÛEªc£c!ÀÓ¹R–Ö‘W(í‡|ÁW¬ˆ$»×'»[`>/4³òütüPŸA¥¸[v;_f–±X�å³…ÎçA`{‰òJës`Q›§~×Ï×'‘ñ´,c»¶ñŸ¥=õƒès9|˜ä‡; C€Æ–Äè¼>FtlÉP{£´zÛÍl¨Ñž„+�ú<¸‹Ïx¬1—¨V½ŠMÂÿ9}} ¡0Èš ÏCƒ:h¸~Šü`Œ)q@¤{h¦ ¡(*]�YAýÓ×;GÖ¦3¹p†èÁ+Êxzo? S\<…U<P&6Õ¨ ¤”‹Ÿ&ÁxÂ¥ ÈZ `À#2íqEb¹dF®x³õròW‰SWõ‰g=ç9{uµ-ש^–"ç¸Ð‹hJž-9 –Ó¬°¡­àÙà&–²×ØD[Blæm…Ú¶³¾]wÉt¹ ¼Ç»ø€?~ V†‹GàH‚{wƒsý­tþ0gõ^/¢$èTØ*?ÅΨ‹sÊ�gyݬʱ~B•í“è–U�Õ¡Ì[ú9y¹QF_b¬ÌÅëí™ÐS�†&Àж¡Tw,'ȇþ™vð³‹ŠÈæÙûÔ†ÏÆ}ˆÂî{lu /çœ8­û+”&ë{‹Æšro#eÔ{t)½@ÇP>F÷.ÀòâWÉûà’¶ˆ üåp³6¡è½XSâ¶áÀ” Uz`‰º¾~WÄ’Ù\bmt¶…”›ÊÉ–´øÉ× ò�ª¡)S§ÂIº†ë_ªAçyWQbsarë˜3»3¿í\Æ€Mº>ůt:…1‚RêcSékÁ ú‘i$î÷ÏT*Or¶ÂíÁ\æÓ–ö°y¾ñ—ùq"r Q®%»Ýæ$7à 9}¤¨¹…¸<:¾¬ŸDäój6³ê´ïzpß±®å7»ºÃ5ÀRAýÒfMòÿÛ)žÕ‘)ªÐOl& PÇ›BK Éåæ ìE�K½•ÝSñãZœÙžs„ú� ~®I—VŒ÷U\_8ÒÙ¹¡”&ýc°9–~o™«nO®>þÈbK²ØRøbùI\«ÀÇõâû/–›WtÞ73Gk'½V“~öἃå£v7†OªÛæÒÃWÐã°]J¯(ûœóB‡¹ ά¼Sà±áÅ>îLg蜖yT‰°¯ŽA.7‚†ï„ý€KŒmÈr«¢\Ô®ŒôLoׇ ŠÞ›õöI{Å*Ã1õHÉÖ—MrëfJçŽadp-¾JÑ‚vVsRûËt0K{\Å”ŠÅÂñU�Ô×’•ˆfe’` y:€øÀz´l :×¹Ë߉C•ØKÁ¾ùF‡¶›B»„pÒ[ãïÍ„wÞe¶™ vÊà“¸=~A@“æÈXahá•íW½7×=ŽòHî>wë¾½XyJÍGæhü³M‘¬õH=(Aäç¾+û=¢Ãéï<ÑÊ ïÆïÌ"/nÉh ®D™oÚåIä¤g[0u˜Ù#…^ —z»a‚ ‡â"Ì´8WpoµLp)ðK Ëˤò�>s2ñw†¹+~@¾@T-«ë DJí¤ðÞ†,÷Pxß Eà�–À,ði äî*ÊâᄸòU,˜Äáø‰JãmkÌ„S¬i–ý›Uz)Õ±9¡FFî­‹&+¼7J8©‡mm7Öl•Îq–VÊü·õƒzD‚Zñ«¾! NwhÕ üˆ1�Í+ï'ל££YˆˆG¯e$a‡îù> áÑM·¼˜›Ñ"b‚ø›jìÛÓ½{2üg¾ÇjX10޽•H,\NžÌÙº«ö`ì 1¿XĘ—™ö5Ì–H„ ¾;vyh¾0©€´LÔô‚äÆÁÄ­Š�9´ãc2™¶ XrÌ«`�Ö�Dô�W´auÅÁÍi6@�¼ð¢ÜûI\I;ºuÑ·®>ÛJ‡žn;¸qÜó|P¦p°3ègfçÏ™œkc…¿²Ç"?´ànlpÕ¤E�']I¬ôêß+{Œ|Û¢�˜/Ôï]÷Õ 2?P…β%fÑG¼ØÑY-ºZ¸D˜d=çÐM©NÁgÃ]³ëˆS˜5í,Q)fß4ºûSx¨;ÌD@;'½~Ÿfé׉RŒsˆQ¬¢“C!k»ä0Ž+Ö/|dAó®f‘]°ŸkýÞϩ֖øŠ}ëñ CæöõÙ ý¿— A~uTÂ,i†«g™:«M˜ñصø[pìKíçbƒE}ðöÏ�m_9ÆJĸă(‰1÷”œvC‰[=¡ H›QãB©.$®{“¸f#v}÷‡�·Ô†„‹¦Ë¶;žÔpj¸7›_LÅV°1ó½[bfã¢Ðáªö‡vÎX?XÄj‚ŽãeY…0#© OÎOx°1P;…Í®åË^õ�\dQó-qïù‹)8ÉÎÉ”ZtxuŽVä×±\:Ä¡âNª—âi× ¤·\u¹JÉpï“#{X½ €I8žÞ¸s`²°g‘Þx²­c>yrÚ(T»ê¯‡.™éÈ%ÆÃÚE�¿SíQ!;šS.ˆ®…a!8Ÿ±lô[�æ¤ËB£VÐPv4·g�¸µ…iÞ _†z°'n¸Æ7=5,)Óž§a‰vÒth"+¹¬êîùÎ×¢.ZÖÍ•û›uÕíhÛv œOm­ÍÔg #Š;"¾ÆÀR°Ÿ¸×vSëêJ'eê[~ÇÓ“ ¨«¿8JýëÛ¥wmp§ƒ8sß’À°”×ì]/ðmÒÖ�…Låš0 `z·wqW@_Ÿ&@g­ShU½cÚœh΂ùã(–É<Ô0Óxš÷[ü˜¼•Ïg×mhû0„�Ç4^_VA}Åɉn 0ƒÛ~y½ð/!ÝW±²ë8ûÄÍæÖfîL“:Sc[éJÖÔÆ¢¨¶}Û§ [˜Þ’¾Æp´ömGÂØ›kïÉ̱ŒKÐF¯¶‰¾¤9V›œ\Zÿ%Ñ·¤Ì¶9iâks¹C‡Á—Ÿ¤`ˬCëQyaFÁÇÇ{¸¾�Z7™…éå–æfMqƒ~&<É{`†½®õIs òÚA×}¾è R,OóP'­6 -f T ¨aFó7ãDjMSOÊø©˜0_±õ‘G,ÙÇÂOŸ‰�¤ÜÏJôó²9=麋¸¥å¢4D ƒ0.¹ö 0ó³XbgH+°ä=ëˆÛ|TÂçQ�0µ\Øt¯éé0Iyƺ·–cêiOy!!ÏZñ³šÀžÐ„BµHÂ8Œ§ÃZuÖ…¬3¼€ów`‚1â.ÎYÈ~㎽I�}[­—DR Ÿ OëêT Œ¹°K#&L|Ek‚ëìƒÁ4[¡›L?M7€Æå�6Ù2Žíbv�¾™—¼ÅöÙFï3§ƒ©Ö*Ø\f½ÀXœú~ð+æ¸ð;llцu¿]AоÒ=óÎ[–¡ßˆ´¯s²žåÀbá‚Þºi%å‹�¹¡få˜I$Rpç?M�CÏiгMžÚ«GD¹*<“ég`EÞ¢°Xl¦� [·z(¥�T¯—Ƴ€£WJl±€W£`ÝŽú ZýpWùý%äÉê½tl†l\dÃG‘±»Œ{zÔçQ–#CÛîl¤ *@¥o†’ét7>½>xã[‡›í=ÙZôîvšGj s2ûõ÷»A á1!mI0“, AéÞÄ8€\>3”IçA’ÚŸŸ ZØÈmq‹C>‡w"ˆDsw¼j‚žS¬‰EMÃÁ w¾Y¶Q¸wa¨…ö©ÚEŽåßI×�l¼B›•ù-Ïwî.¡_VëÑoK† Úäg¸`<×Óè¤]2óÆ.±]3­Mß$9©è.¯dóØ5ªFA6 ?¹R;†ùWaйXê?´¢ã¼©ZQKJ `ûía7 RßÒŸ€“;ŽŽâöéµ³*©owQOÊÐA×Ð�³y´²®‘PCð0à»÷vš"æ€Ï«ÞE.´<âØ^†iÿ5bÌ ü¥såM®Ö¶}·òåŸ f  ûéü”ßÁ,3¾0D÷" â¡·ÖGqÀ´ž¬©{±8Bv¤²Ë”¦{ê=³Ç�6‚v¢Ÿ€?=–Ûöxÿ433;Á�Ý5Û2RÑ�+ÏŸ‰�®Ÿ ®­&®Ë&r«,Õ®»u•ɮ֨úLq¥,ìeVo9~°H­�³«Á½àƒŒLëë¨Ak[P¯ð§}•h®•YQ¼ “!$ð£7Rý‚ÖõÄ‚1ŽfÑÃ…¶`Qm_3•z0°VSU{SŽù (ÊNùK°½¢Å×Ë~¶õäéÜÀ|ßHÎ;•3G Íj÷¹òB&a�%ù„ÚÏ¡N¦_`¶K2at Ø^ù—lÅn¢ëö�Jʵ^¾—-q¾ea7¨”v³!þÖ—Ï„¡Ä,àŸQ§¯!oäƒùn~v”>;UÔÆvÓã|Írö£åçƒÂxʎбi?ÛC›ƒÐ–›BÇFÏ+›G7ƒû¨§1[³…ˆîV^j„®�etk¥Ä0À�œJYK»ÐÑÉçÉ Ó  ;(�€¢ ªÐÃËìíÑÍÙ¯…'VË®1×n¡¶¼†Þ�Oo[ã¦ø�8qõª½–Ëp} œ(ŠŸr(\¡=tíè JP¾ý�Ü3rs†]ºiUvmÛo’¿¯ë¼ïœAÛt‚h$®Å>¦ìtä�‘�µõ'èLãjÌLëZ7¬;á†HïX¶{¼Ê95Nn[�¶‚Áé•PkEÖ¶ÎëË£ˆQáG1�5Îl®\Á^d «Œ_W1ãa|p2" dÑ-,&uD„K�@"²™ÈfUjªò‚A&ûÛ-òÜÛ^ÇÄ7+^L…í§Ž´*Ù ätÁ{8ž}úù’ KKP”{¡ ›ƒ[gí�'†Ç!r-PÜ$ˆì0t.ùäg˜´{ëÜd.EΪ6\0ȉ«úÕ™0C»$xÞ2æ��Ùï¦ô7’ù¦ù¹ã6¥•.ó:ÛZ �Z& Ïãlx ©n@ÅsSoŒðªÅÚ½£¼IÎSð†ÂÞÇÖµ²,®qj‘çB`CLuŽ?ãË#m 2?$-SƪÇò-[Í·éÚ3 †µŽ`eòÄÐü°JJÚ\ˆGÙ½¾ÕªtMGÑÝä ™pìã.\誓ôû.TGë†Sá{ó+€�‡Ÿ_ed”ë‡É+f~õºùAcý¹²zûuôàæqŠüŸ.Êż÷³*)^ê*D(-‹ÉìAwhÒ¬! km¤à›)X‰¨%ÃZ;‚lqâÀ"ÇÍó{–Å›dzp[ˆg‰o…mƒ(ÛMG­öÁ ±vDËß— •M®8/«Þˆ™âo;ЊeɵFzV3#×éÛ0ƒ¹ØíeÈ�€Ë·)ø‰ÉŽÈ|ؘ˜—¢˜¯p²ì•®“ô\ÓÞ ò•·µuÇJ ,ÒçÓHði ݨc�ÆÁƒ˜ÚO"‡{í×Ó·Hãì$wS歹øzõ­Í¤@ŠƒØ)‘ŽºjÍ€öÌþ C/°[ÑXKeA@Ñfû (ðš+®�ăÁpºð`9:ªç¨ûCÜã¦Ä×cÚ �m\Èì ϧ¿o<Ùîbw�¢¸_7ûö£e8(gùÙ*Ðã³ÔA<Å‚ã¶bl�‹’µ`ueÅ© Ú*sKueÝÎM=Àt†ñöS ICEe)WR>-üAŸ‰¨‘�Õüa¢|ºå �8'2µI´û?Ž_™Fe. [$ÌØW/W¸òCcîs[ÌžjnåN³ÙT \QJwôh/Ì~:w ¯Þ¥?=,9'‹©õÀŸÁ‹�þøµß0¡°aã(LBØÐܪp‡v¼R7â³{ßULëIq¾ÃÕ;ù2`%óÖmžNGKlOlˆ�:€EJ·ï/äÃA_é‚ÛÚÆ‰à£­êÊ£%rÄ[D›óìJàì=ju.ðçZ†é<.%àƒ0x+S/:&×…< gú(ŽÇ…ÈGB|×ùâÁ:ðCP‡¸GöªÌ×- 1ðá’jKè M׺kc)$MPkLÞÕtínÓÊn�¬ ¨#X sÑPþ ê“H%ø,úº#ÍÖXwº  /Êr´¼Ðâ-Óc=¥q€!ùÑÀ‰8d%"hÃl]©Û8XfÐßëŸÔö­\gÜ+Óà­6½‚LjDÁúöÈ{ÍÚ­5Ý�a A"ä0Eòæ `~™SŽÞ¡Ž_Dám#³é=i‰XEçó�è:WY1k™F×í\ 3T #`ÓFZÄ‹l2÷‡¼1³ëŠš³æÈÖK#âa[Îdµ—†ãÐ{÷اù‚$ «Püû X¶v?aëUí_dÕÆƒym6�T ˆ°œß²Ž %/!µ ‡/²É½@>yhÍ-—‚ÿˆO3t ÜÞò~¤ÇÐ`µa>Ûœˆá„€ì'­�atµáBø»ÌÇ.¹rÁ°a>ÆÔ6]“fL¿çâ.ñ€”]GˆÝÏv�Hë ·<@ï;0,uš‹¡ÝHÁ$c‰íj9²åG±2GGq©E^Šúã6–@+ŒT˜êÄÜG‘n9kžìN!šã½G§_A …†AÛl@6 "$¥ÎÍl_QXC¶ êÒĹ|h�¤ª¤­»ÏvÁ^͇×î šQŠÃÞ¹Ÿ‹ÑIõÂþ¬½­B¶WnŒkf¯®MêSPQ«äd»lú¥ýeÁOa’šÑ¡]�Î�q�€Ç�hÜåñ­e+öõ—Í¡dep á}v¶aìu.M†Òó/áâãRñʺuc>�äA(SÝïZL‰Ì—¿LkÂiÝ�+3äC‚#D©-hº$×¥r;LÂþ­�ÌÛ» (œzeZØ"²àæ\ÂÆÓª±5�·äžò8(ð±ØÞå¤D0¾´Ž—T«,xº˜ žz´è�C¶éç- ±¾60×ï|›Ë–rKNÙéì[¨wy¶†Ì túàðÜÚvòÛ}þ1¾çx c¶Uæã9wÍæ[ ôõ‡ùùä€n®ïÑ´\ó¦Ð$öQcJÊYš\™Œµ„í|ürE¨Ä9“´÷!áR×d0ôǺmï»_Ø£ÎC{à…Öu4¬4�ìÕ"<¨kŽºi£CiûºJɃ«6M7…Q,¤`2".íùÂÛœkò~µ] ›û]LÈ®¡˜Ø•‰=¼C¥±ì<Æhg_{ jç¬ì½Ix:žŽ×°?º†Í̹À\ˆlà‘p«CO޳Ë6qA‡›íÌÒMLH]"Ê~¬`/žp£G×àw=ÞOñ§Ö/ÐNåÙÐ ÏÏVNÀr =o{w‰ú1BŒÅì˜ ©dð̳¬d!Á,� Åч+p_Ý1-3ìîï¯mÍ �cÏY®½–¾¥r._U*–?kM˜OÜsOlщ?‹ï¿±Å‚v¸ÚµimÛÂÔñ/á¿4Mívê´[ûÃß´Û-ÚÑ¿U—é¸ý$@7�ò 鸉¼!³+q)•£å˜—ëêþ\\ͱg‡0¦raåYÐ&;’Øe²M�Lç,µ“5Ë ñ`ZPÐM¯„l È=å%¸Çy2ÍcV§K˜ ù—›Î6Qç4yPÎI`¨,{ç)æÉa1ÒcC^hÕeu‘-è ƒ°S–[ìáßàkЋ/Àã îÞűÒ�ÞéûÖ]Š·è¬Þ.eÖ¿9Ù›60tùÄÝÒ׫@3shÃ5ëq¾ŒÀ0Õ¯¯ëÚ<ÅC™Yßço× ï/Rª)Þ ži¹šÎ]Ã6ß&ú–ÍNáA19GklW9�uµ ý–¼]G=…)©ËòØþï±ÐÙeÿ�rν³k5ò�Ú óÜ^—�ípz\ëF!¹ -<·ì¡¹ý–ÆX%À£Bà–øÃ#‚[Òñ³§º3ÕE•œ�¼Äq˜0D Óßœùµ½èÝ{æ¿ôÓ*ÞCû&—�$%«,ˆ.Þs*pØÚÛBM1«^o`øã7±s-µÎ–Vó�J*ZzñONAò_°Åm¢?2h\T¥ÜC¡q%¤"D4-Ã%Ñ�,÷´ä5¥Ñ®ŸÖ>öijrirßP,ù—«¼ M3/O]®‚u£³¬hB9™¾ò€€Â�¬ �`”ðµû}ÚF2øfngù-Gd0`ÕžtÉÍšº‹4�aM³-Œ-b™ö~s�(vêeb¼x×Jy4é«·Úlük‹™ ]5ÀÁ0·,ê¹á§©9|ØjifßÅ b šÁñOöуJAV�ø[zÒM�¾v†@g$f«~�Ɇ ¯eÔ\kÄ&ÒS´0YgLÞ÷–@ Jñ½ôU”üRiÌÚþXÏ}ÚÚŽ5Šû=~It€Üq®Ú¾vB¼gÅI‹ÈoBÁ�+0}â 5ËÙ�«Ú¼wØ» ‰iÆ—ó\ãæ_<¸Ãg¬¢fB7†ãÁGM¤!÷< °Spg¶KË¿SWð�tˆó”D(äzÈâ„ Mé†þ€XIâ[�¥Ò.À—Õ ¡Ãâ²âÙ|¾R‡Ï‘Nª&°§·çE¥/¼µ6´Am>*Œm.æ}$‘h©ùqœÍ+b­e—L#Zà²>�…ÜÓØ!µÄ¨LPïhöf¤n<û(GjÞ3äð>«¢`èH°«8àƒ%}*÷¼ŽÌa³ãBNgrò$@V  4¦8î… J˜âžÁ'bÐ;ØŒuFé'è…°ÇË«aÁªü±õç—Ϧ�Ȃć:¿nü Êš8èZâ }C5;\I©s’°™Œu«ýc’À› -+›Iö¬ˆòY«zxû7Tç�ÆÛpXïÒ‹­.î÷BŸ) ÈJ~œy²/µÅQI ‰áèIPˆÌo‘ dDCK€i mI(È!)[ÀÑ"Õò ÕœŽ '¦Šäwb~Ö"ùuübÖ£ËF=~oÁÃbÚ£k€Ð¸ý`Ž—— ›¬3�¶öŠh™‹ø5"¡‹AC@×ö –ç×<ÀÓ`% d|�ÆßµŒXã*³bÓ0oœš\X‰P ïˆ&åAK–Řƒ£‡†ÏÛÑáwt¦.kéœ_Ç¢F´lh> –dµ�»H…°jân{íìíš©ÞÎN&l¹‘Å;«‘E`Åv3 —Í:5È©ó`ɬ �«§oX1JkQCyFŒaNa‹¤‡|káÃyøpãl‚^T¿::Ñâôɯçh‹ge¢á“‘^%4ò_XÌ.§oœv �#“0vJ@õ±80‘@ì(Ïp—bº`ò r cU‚ŸX¶æî!EæAåÈâprPÒ(gQ<ÀnPBšäLws ]js­­œ– ô †Ê/g„²¶-+‡fi­[zÁ-¥šÇN˜‹œ¿°‰ÊСvºÏR5›êèÉ_c’¡õ?ºÐúÀQ8æÏóó£h»Q|h=cÚ!µ*Ãã¥xüù\’Š®±s¸-¸Ö+¨A ü«œ…#rî»dª†r3ÄÍ…ãŠ6üá Ω½°«¬ å ºìAV±Aøù¡“âmg,\Ý䉟«Ëb]²ÛnoWÙµnF«ÃuÔE9ë@¸dO:@¿1òÁupWú8ûìOºN%…;áSŸ•…@†Ã‚aà/Kç¸î^è  PBãóüíMòöŠÅ(f€ÆP#’³r_pEç«Ù÷‡L#ê=þ3Ù€ð–à¶2ê—Óš;n3•/ *”µýZ¨L ÿMÝ(œL »¿Çý=fÌ;åкi})÷å𵛀Þé`°Ê¨¿ÂÁ‹ù�yޜȱϬ€•zª Àw÷¯ôl9Ô™/ÜëFonÜhÀawQMËóWQW»ލý-ùh¬ ¹vã¾ýb­‚ošFeÍEJfóèM¿NWœ¬6 �˜ºÈbÖ0Ë]ñ:y¬†àkZÞg5˜“!¥&ï/‰,ŽÊ åÂ5\UÚ»Â]†MP.ò5Nñ¯¯Ú—D…ðÜU­�P[šõ Õ“æ]ŠÚîëÌ ¯Ì׎¶ôþH}ζ-£!¶§Ä\ŠÙ-)E“f<‹ƒéËCÙ£ol–>%¬_5Rœ)—7 êä)›úÊÜ_Þ¸¶‹fÖëeűˆê´E6áAŠbšCLÆj‚®ª6›“†¦A»=-îáí¯¸ã÷}Å¿t¿™|�ç;Žþ´•ƒ§ÜQGm•Ö% ó!šé¨U=ŸÙ«rÞÍš½ŽöÃìBÀ26Ò-Èæ¤[s+,=ÝÔ ]ȼ20l7M­øî¤¡ë¢…�f‰×Âä‰ÇÎKÀîðÌ>+Úrzà_ʧAaQ …^'ÀÞí …þ΀Â[¿dµ½! ¹ÞíGL›ýÇÁ[ ÅS�Û,U |¢MÖ oz„ô#æõ‹>ñ9ÙIIt§€¦û¤õ–•À~ÊŠÉ\u½¸oTz-áiŽtbZÞÞUýC�·^ÇîÇW“¸›Žˆ ¾#ÚÏÇ@ƒâ»ïB_&]<%’òqS·¼Ž_áai$¹0ÉüMeæ™À¨^5´G?Gá»>Íá®ó‘ëo•Þ9½õ¸Q¥Ô+O­î­Myús¸nëÄKG—ÂìSõëèrM4v �ÏXp¬ œå¼Ñfç݃œn“¤ÃU�’Fëi×#xxé�Ëš#õ,cP1rHc0z¹µÙ,� Ƥ6Î×jáSŒÙEÔóšqKpz&†FoÍ�øeØFÑ̳á D‰áŸÁ•©gs¶¥W“Ü„nÞ~¿¼võ·ŸÝï×ZLk Ó ;l âÕ}ªzÐÒ ä%³wµâBèý‰>ûÇl !Q)Å?œiªA"öR7 ™ nVË&†6©@Õ¬ü36ü÷Ëk‡;¾óW¢«ó.ÿ°==y‚ø»r86'âVQ×¹c�Wå�Ýåx)0;ɳYHí¾C·ÔíÍÂ`Öƒœi¦)ÁI¡Ù_Ù½[YÕ¬ïdÉj°".Õ[«èXw/�ûÖeu¯ªo�‡yoHñï›k¡ß™ÆúT Ø/8g\?b¬.»àŸkÂM=FÊð%á¤f$Å~%©;µ;‡àöE�§éÒÝpvž_Ì­xŒ š¬ÒN£ªâ0xC‡¥[ Ú³]š´@ï<»5.LÃcS ïNèø'Ìy÷ÚÂTÅò=˜ŸÀ—?ͳ5úÈ¡ƒx{’ ÷7 /½ê˜%êžÖoîk) aìØWP…‡p²K<ª]‹ ,˜‰YZ/—Ÿ–Ðâê`opë/'?±¼y>{wˆæ~|7ѼSdÍÇ»é�­t`%ân2³ZÄvrÑhéÈ<¦ùZû|.Ëõn™¯[ß&¨¤Â¥p:Nnt(î`6 ÖëÍȸì„WS­TØ]üà–íþnx·ÃBSö@Y\:á v¤ (K9%®6ùjqÌXâlY|l´ÔˆÏk>%¢^ʲ”ıD¸€åÿ'ÙY"Ãù‘‰v÷3ü ê°FÀ倔 É �{¶Ëd.‘Î]-h™Î�t¡>7�!+òOàC¶˜´„^/{³`¹g ¥¾ÖrÉú:À³×=Fµ=¸{Øý�ÉÓ»öÀz+±ic4•ð]Q`Œ� ŒÃð~@ú˜2Å‹ý×`ÌàiËhr« ¿8¢¡�t¾|ºOµ²)Ç5#:>ÎD„÷/„,oc؆�±¡ÓÙfO—øæxrºWYçÏÛ½ÛíQ¼¶Hªo¤ð°³~Åœ&³YÚé¼f_Ü€e|¦UŒúÚ›@»i錱—7¥²÷b‡:–Õåè¼ÖK†h[.p2§¤óu•wÖí�äó^²/;½æB£”ºÀ¾¬ÇÌ.On"á‰Â's¦ &ìñÚñç>â£.|W ?¹¹û‘É�`^;ÌÚ<œÐâÙÉ‘ÞJ­yÔüîVÊdÂÒ·ß1Ìó›ºil£3¬Éˆ`0 Ekø µ¹´§ã xßêï®[£ MÇrVs<ˆ/¨¡ôÀœ+Š��Óé+òVŸ'Lv€¿×�ÖXv= ²e ôÃ=€…Q®óeg“¤AÀ€š5Š®„o6 Tt¨:%ðëW%.[¯‹ µçsïqC]ÙÈ“»úK:Ï‹Kg�&Ɇømz–¸"/+’°íïP �oS1X*gî×èMó3·¥±ây,ÖÅÀ’CAçšø�èƒÕ²=N‰±ŠŒ ¾‚½“5;…(=8æ/ øŸ±"Úi’àÛ„XŒ~ ;‘}­o¯�».TPþœu„‹²Lâ3šwé´dB϶¬‘úúUöÂ]·ÇŸ²é®� Éu;`ÏZJî?ºØ©g¢ý‘µœÇš=ªüïãò(EWÙæ1­GǺHWj‹_øâä2¿�®®×#î€÷ê=î¿y©»wç~mCHaäý÷´ú=¥O²Ô ›Œ»­ÃÚ{8:VΗ»–."7་üï‚x@Ç&‚¢+ØT¨çr‡¸jŒµãqK€¸swÝtÜȵ%X 0I$«¤ž 740Å„)åévð?Yp½ÖªQÆÚ8¿MÇÃPa@r0µÌÅŒ:èná6'ÝÞÀÀH´y7;ºS/·†l7Ò*l‰x¯†¡‰¯}lXq'»‚Ó]¨¼SÁÖé<§/Äñqî‚ì |ð ŠBëd9.ÁçXÐsämbT™ÀÂø¸�Å(ö\±,3\ÁCÌíä KîŽog,N™'rÙ(ducmgŠ�á­Û䥶%åÀ°@W ÊîPñáØU?''ùÔ…¶o¸{™o6Z›£ìߌÛ_®£u‘M…ȹô gõ<*n£ê–m¶ä¦¡:Ž•¿°^Óo|OyŸ,�RK4“âÒ‡·bul|Çfmàêá­¬Ó ùºÂ6½ã…fç=­Én$L ðG¾lp ªgßÃŒî òÞw¶0°§n§k.ÝnX¹ôB&C™®c³%rq¢NZžÉ|àÂ`ü9Î <��ùÍ�ʼæ÷ Â~5»¼‰Ÿ ’XR7^;xAûcÏTÇ7ʇJpD4'd†³×¡XZ…¾‰ÄDÁH8qOEŸŠMr³z½æ{­v÷w†«îÙ&ë=*¨ðáO!©‰�sy𦊔“>]ÆLßÝ�¯Þ‘qw¿…> ] ›åÙKˆÎ¸kú%›EÖ®µxt3ÛŒõ›È?г kö2BY�é8âÄ[&Ç/@¼ŒÃ]òëwÜE¸óy±ÆX¡qÕ†àÕÓ×ûÖ-e¢‰1“¡¬Ç^Œì?¯AW sBëÀºlÑ!PÛƒ?«LÙæuž—£} Ö8-­mÕñ"òÒF\¨�Õ0*ÁÌûe»)›´�³GÌßœKxo)D&J>ްq¯¤ ï=x±è<ÖÒ1ù"øýÀ´­ŽŠ´“Ó¸üg„–ËÅ£$ö„m%i{•vè%9ùæÉfkqƒ11Z›t/ƒ°ÁR2ccƒhèËà²&Zn ã"¤$™"9´`eÎü[ëÐÙ{¿¢—"‚zj7é,‚–]g¾å…Ÿô9€(³¥Â&‡„¶<ÜËN†¸ÍCóµðýmg˜-‰6þV}ýµT©;í©j¾Î­�A•uBîK�Qt‘vzs=m-?gí³uÿ Ùû±‹^äçœú½öU‹ØÃú§­±«gdøb§ãåÞô¯»Í¢XÃãÝ�`ôDß1¨:…–1ÀT^é 9îiáZý"k~H›²ãÍÙÙIz\�œoúT,›àuìÝvɘ6­¢‡¥�*#‡üKö*µ×Ö>³Ÿ,§Eï��¸‘L¾µÖ”Âö8uŽIZ¬¤–”�FOï%ŠÄzÀ„Œ�P%8zŸÖá ¦4Ò…x¨°Þ[ j˜ÉOŒBWåiöͶÒ} ’V#�<ŽU§a õtª†¹¹$Œj°àçÐÓï¼úûÞ÷D•»ego‚8o®™Õ« _™ ñã^<µgˆg¨á50m†_·Ý '%¾|Ž5³d2mÈFàr’½½¤pùþ÷¤07·IÆ9fû÷w²²Ùûz¬;Q»1…A^ü"OóG×SÕUÈ…iÍw¿ÓhÁüsî}uµÒ“ƒNÎL\u!«¿‘Üy Æœ¨ä`_ð:¦ ¹M¿{'Î[€È㦺nÉšä/ì€ùyȾ \8$\5-zÌ©ùO9ž¨<­go s�R<™rÐ$Ù9¼=ZÞ'”j9lúÞ l@…ЗøoÅ{ì­ûâÛÝåÀçóÝÂ80Ÿ2ZÇ�îG#9 —ÖuüÚnþfí±å §a£×nõbÃT%Ä;e'<<<É2ã´_n=f‚¾ˆ+ HŠ´é’í‚;øPìÇ×»ì¦í½WyD@ïz+?5üÈ©\èg� o±×¡-Vns¸ö¾< Øù¿±ö9¡¼× ˆÉè äKÐPRPœÃRmƒp\[-[_¦êþÑÃþžÊCq�©{Åt>àCÛ@PV#ˆó�Ø„(-‚`G¦(€Óo wôñŒw­,š>ç“0:Ò;§�TãC’¹?mÑä¸)—6ÛW99v�eŒ7%Em#®êëE­ìøÐŒÈg?Ú¦�²AÎ{æ�ϱFY>µà¯Eƒ³CÁ’¶f=¼÷]þÝ™�Íy±« GÒj±î[§†xŠŠÊÞâD hyQŠO°L­*!UJyÛ‘R:žÀCNkŒâ® )BÓƒX”�ëCùð‹s-q bž„�親AôÆ …²½f’â–‹I ã%\ñÑxÁÔ’åÃ÷Ìý•o.ÙÓ—:k.º�|×úü©°×Ù§ ‚ðÃ¥�Ž÷x ç5ßžö„ ?3Z…oœsƒ™×­;vdŽ@ ØnߺzÊûIØi›+È%²–À‹4Ú]tëd=ëÅÞÍíéÜ[äè“›ÉáÏ9ËoG·œ“£ˆv:·ÀvOC!n²Š�<íýwñrý3ôÍ›³ÏĽ[5q×e�³Ç„² !nÒ¡ZØ{ƒF.n¬Y‚ÃTågàd@dÞ?JUZ/h¶böw~)ë—Mˆc³…Î2˜:ÑTwwµH7°Y�F.^A^/0ŒÃ…ÇÌ™És‚^Ùs´u$O[º4·í½‰ÐI„hÊŽÕˆ=\ ÄÁb¾çæKÎ�øôÅÇÁâptÂå¦*¦¦ß^ýêÂØ ³6d`…`‹ÛמRŒò€Ï|6s,ë<ÖT]œæY¤ê ïÒ¶®ô~³¦/{¡ÃV1×—qbN a�ÿ“ÇêÛbÉl7Ù_^€RÐŽÚè©ndyk N=D� c웤 �úž°`w‰Û�X\è‘xŒ„*¢~üø7ä+2è÷yPÈíªpTë…cc¥D±sðû/l»{«‚‹Î–7 å/ló³Ðr" �Úÿ ~ýû÷㈠›#¦\xàQ‰häZA…a¬æNÖÚ› 1j}%Í 1’ä'´`ÊhÕl»@|ÁŠ‚Ê5òBmœbôĺn‹,óèQ˜Å¤ûXw‰“sÈú‹qÀ ÿÐÿs'èÆ{k÷ßœ:NQk'ŒO=;„ ³upTJ¤a}Ï«–ž¾6C2SEcâ²®ò],6µvÉ~·÷’L×1æMœõ»Ìe{Ä>•·­w´V/‡‘á Ò ­W;a�õ°¯!°ÞˆñÏ4vuç&ÀËÛ\¬p]ÑO#£÷N³ùøíˆVˆÂ>w~ìF¢2XÐöÏŠ|$¨®êm+Ã1Ñ:\EÐÉò[N©vtëu¶ HeðЬ@}¸c„+EX E¶ii¶|ä3²Z±®—)°»’uý½œ˜¡»ÎýA»Ê‡z÷ÃðÇŠ«µDʘé¢Ä1l’ sy�K°-Mó8bù®Ê*ãP¥�Ü€ºØÏÖ¸o”¶¾V7W ‘hÈÂï´kÇÜ3­ÐP"m*$�hÁØføË$_³âÙ}Ž@„®ê§£‹}d=þ3Ï™´»l0�,ï¾…¾ƒ:¾�;ºÅwìÖã1@”? ¦ƒ Ÿ7ÌÅ‘co³7è½ÐKP²·;Ü‹ö�yAõ_Îã͘ÍBáŒý1×¾ôcNøKeó„4‘-Ë)å*¸4¨‡²ŒžSÒs™À�ÚÂ�¾Œ¹eÑ9mÂù!>ï NØ»‡´~µ2²`L¸1…Û½ =—Jî�—ΓÓ/ÕkNÛ›�Zúûà'ý*Pvsø,€râ^!óié2·^£îž»ÚOÉ}‹á�xΟoº�*Ì€«…;ô±%OÃÊRˆù›¨ž[ùÆ:®ïßÈb#±ÅU ê~!æ¸xÞ 3æ?JHb‘¥ùÆ)AÚŠûK¹Á)r s9€¢ǺëÆ\“ì è¸ ÆÆÂ7R�€`¸¸?@¨…bò@6îQÀ˜‡$~³ Æ!‚í= ê`-l;*Nz%�õà KõÔ7Û8ò‚M à�ì˜ÛócÊß/Ío­i+… )�A°ãM’ÑXFwÖJ]ŒvíºÔ–ëäKÔí^þæŽ1z¢«7 «¯LäçQC¹œóŠa£1 g˜(«[r›,o¿w¢Ó±ú”ÁóÈÎp„Š"­%¹ËL|�Z컦a>_C§Ùg/)%ñ-š$é@aTÈÂé¿©Wå rÙã=vLï`ÃK9}4*ùMcå\Rl wÀ„³:\HƒºàF‘/wDé¢Ç—a/§¡¬ˆ—Ÿ‡_'LqËÚr»-�_ÚÁ­´Å¸(΀C5Á¨_Jø«¬F¯7qÃÙ®iæ1Õ ÊÓsð}ª‡~Ù*=ô@s:P“û60Wßá–Ku.²£¿Ua~Ûu§G&7ª¸íüR6œ|~å”Éo´ØXvØ]ô×-ú× |q¨mb†¶MÓ¹_³iû­Ç$;›S¾0y�쌇*ûºH7L¤»Äc¹m)�Md�(8·º[["VÑúšÎêª�N†W,Ÿxm8êÞ²€¼ˆ÷ÀrºGžˆ`s“p¶bDUD}èLoZçÍÕœ2@Ôù¾ù»o¤íql©fómNѹ‹:lQêSZë´CÂ-/¸Ã+»æžîF lÏ-B‰apÒ¨ áv[W[»Oü>œwÚJ×·`Óç_‡Ð³ú~Q$ åmv†!g3¨ö!“ÁæTJVÊ`rÆY[ÓœVô/lÊÌé#�¶g� ¾Ú¿.=. æžÜïOwÎP-c ‰jk�ñæ+އÝaÃÄéqtO¶Á­·cÆõŽì­‘ñã'q™5ù¶Ø%�»uÁé] }¦¾0ý‰pÔ¬[xiÓLô�k™–÷j�°å|§î«ƒô5&ßµ!«'J˜Ñôd–m½ú¹Òt!ïh_„7}îË�§}ÄÏw½§\9aüâ«‚8 »¢!7‹\9åØ]V à<0cI8OÝóþÉîüD¶(êä-Z—#‰Ý÷„{ ã{CÐ]·nçLU3 …|.-dgå¨'f@Kb"78[¹0εÕÓ…>𘽳_"§üVû\‰-ó²o­ÔæŸ+„ˆ^&Í%–³výxÚLgÊ“lcQ2L€[†SPð?TžZóxΛif{’}éí­ÀXµ£š‹¥N3ÛÛ$èÍ+J¼4€cPFÔû ¶¤5Âè?šœ£î—›Bˆ£…ta…?¾ßKf@�“ Êó\¹F†úmšr¬­ÔÎ6 ®ìÁ{äÕM³v>YÖ%^ªxf’vµ|áú§ �;K^¹j²ž²’ZñnãgÛqLв#‡„½�ŽÑu­ß—›¯îs‘Ë©ºº1"ˆö½�¬Žû(¾Á�·ÕÚÎCëÈDj-+ñ¨¤=,ºó(å5ž²iˆúöD–�ˆ?ÝY*Ú_¨ï¨Q–¾9{69Ë´mÂoðëÅœ_ÇPÏ{³€‹¶èMbÛb >€¡à}£YÿNl —ŸÕµÃ' öä;Ï^ݾ« ëk.-¿WdgHïî—_«m dX~øý*è¼ä"a0y¢.,]êšÌ5¥OY6"Ð��P¶o),Å ¹jb¼ì­9!–¨Ïpƒ|¡[+{˜‰Tgý¾­Bvˆº·Q]p`šïÓÕœ�fYé÷ØÄ‚ó]¿ã-uŒÃv£&Ù‡ /[çkö¼Î^ÚFÉk|J¾ÝƒKЦ:°o¹pð4ö¾“«€¡qöµÞ…N¡3¡÷›ì-gŠJ Ýû6b7óÊkÅnÅ�Á¬7Ác�aa» &;t’ïp¹¸ ±ìsdøc¤Ó5Y”ËŒ®¦uQz–Õ(^S:F`·£1¼ ]‚vZ�%©w«#€ïsÜI‡ú|nâÙ^¼ÅÏáÇÎGÌXlÊä#A œ‡‹ê4Ì“’ä áY3€Ó•¶Åú±RÒôº–µßä ™Î+ÑL 9‚g¥ÔC NÂAfHÙ(›Ä«FoüŽw×Öy7Ó~` ãxNhU.ÏCšÚf 0±µ`;h™¹¹‘8ì–õU¼7c8]Ö×*ø‚˃Änó»«ó…é9žžUb Ò 5މ¶Y±§Á)Çã,Ó½Ôã«FZºWÞ�?]-®¤o‰ÀV§•-*˜ðPpÄ6VËŒ�á·œgFµÇ,=â7cP²­Å–ñ‹Ct: ÁuÁR$ hžóŒ=jGŠ�üúKäs•ÛáÄ %@KBÃ,"Ht=ýq¸dHr¢O¼ïGó°Pèq&ßìðÎ’3pÔ~(½¯çýª`~XŽa÷»]PØ%‚Ìy\X«wÃ>3Wü†öØ5ÝJªß�åڒ룆H™¾XI”>öý¥M}gæf¸sûIù»ÝbäYÑÙî=äüï�x·Gƒ%Í��¼ï{Np�Ãüæcn¨v$>`Ø>*-›û£Ûñ¹€•W°êÞ8Ú$r—‚Å|ƲË–Œ³?ËÖzSK›‰žDÜžò 'Õ‡d5·WÒB Êd6Ìg“Û|ný¢q¥Ç¶¾}\ÐØ*‚À®ä.8è¢ÒIºbéœp®úßÏmF>€uã{+@`àïÆ-;b¦¸Q0‹|é¼\ jâ<öŽ'Ú§ú´“bh\Ì'llEÓ×ß½u;»®vžëh¶½Êï¿×Ýo9DÈ! 8i|Ê Ø¥ú®iæT+Aƒæ§‰bu™Ê îy@[±F½’^ QK}<_ÖM˜•œ.k®1ȘR@Ɔæ "¤Ÿ‚ߟsö=Æ zõX /K'KzèsŸcè´\û÷ìZKA[ùä1#†#þæí^úßoˆ@˜A@¼´Ÿ(ï¿�ÌÌ™ñTy6À,÷qº |¬÷Ê`3CÔÇ® ôc”4Áþºp+ï³A‰•ô85�¨J/4$‹x<{úéý%’EÕ©~ÀÀb%³�¯´Åê¿DÎ�WbåKa³°«ÿS<»`²ãõ±©ép'LÔå‰E­�µ´æÆÉ\‹òkR˜û†½âßg½ëÁ²çÁ’ϸBç¶Ab°íÓ– .+ÈòíÞUk�á•^T�úû;:eéµqE6µ�t„h0ÒYá²ö3 `j;ažæÙ,f¼5Îbý…»ÝcÙ¹Û£Þ8|ˆW-V�$îU¶±ªi«¿¦ E)·Ô3 ‹ñÈEJ„òñkV½»su�¿)Í~]ly¶Eû*–Ž‹þ'X&Dî`B�î¹JÍÁZ’²r¦&t牬ûÖ‚â}g›`C=·põ—Ó^®ð+i¼Â9á\Ó’iëÝÞõ‹h-ìhäï¤Ó …ÍÇ�¤ý.Z ¡“X”­`…ªK«ÔeÇ™`AÒ>XS(Ú´5øQÖa r×@e9ìOÜ­Þ…Èè³WSilfÂŽiƒ³Žµ( jâñ‹X¯rèÔ&(¬AÚ{K¯½_yÃSÐïëí_yõ‹Í}¤ƒõÍà�ÓS¤†8/l“4B ¡±'ªV—=g,[»/ÁbÇšD.°æ (­5Îf;/�aMÑù\5PlÜõ›d~³èp)DôvÁžF‹eMù›ƒ›!·_œ€Ö¥HšG¢øC†è—¢BkѶ³úÑ!Ê æ#ÔÖ—­%3›qB¶2ÛÄ[E-ÒëUaoÚNµ¸·*æ=´pÁp&gwûS×—YîxF·È¶&Çﺙû:Ôh¥-gòô,F]íLÛ¢î,ãy°ožhõ›C9ŸÅâ´D¹…¤DbÖW%8©>sIæô}pfáYkÝócG�°ãGÍ]Á*ü*�©îá3e3SënÔlûuY�$\ÖL¯°eDé©ùL£8:I²‹&˜¾­E&•Ÿ��Aa/GÇRÍìì,ãû‡­|RιÁñlûRt£e0F,¸D4öµ_ž P@ؤf¸€Iµ”è¯37¼ïqËD9%’6EÜv„-`«ðîº{å¿è“¶Så ÖÀ.@™¤°'iÚãžíÛœ‹!bžÀ=À4鬋¤½”Ê|úz ƒ)×W¼.Ù,“mç„�'VGÈÛ™®ÜŠƒã•¤æ´!C} ŒýJ1®¸òšÑû‘Χˈ.†·"zú�ý©·›Ë/×Hú›¶ûL!Ô~‚c/‡××kWó+ãÖ³£an§Ó3[GZl˜gâͰ›³c¥ô¦ pV›ý‡‡õ嫌�›ë›¯,o*2¥ö�­SÍaoÖWÜ/M4Í®³caÆ�Ðù�°­ˆ£d‘Ÿ^:Z8[fêë¦yy—„l1HšÆ�DÓJ².sðà–´‚j»_³Ž/1sàÒZÉËÌ]nZAK„Ä1o¯žJŸÔ÷‹»çVŽ(ýåY£WO¯WjYµ—v²âÞΖç¬+" ÔÎ’×¼|+-gQìp„±/õüò/Z~×ßd ÑYè}òÄ®Z3o‡+UIŒó&9JÄÁ[”m5X," CÄHÑ}7Þ™n€«±>1�­2Z[:sæ¾1�=¼Ñ‚Æ(·×Øqš¥„oGmûv ø•Úœ´rÃ×tø^à¥û8õ…ï€ðýüÈEçͲíCT†Â…  p¶¼¯nœáHÆRr¬çñïDý¼)€ZY�Ûë8ý¤¯;kBùGfZ waŽDx­ bª f×`g6aë ¾û8‹ÖЮ›„È%ÉõÖ¿oþ‡Ï€÷úóH.�ÔænêH!ý›7F?½rõ—^Lñ°+òvÓ1 [b=òØéêOÖË0bË9>€Eº¼½ÔÃOR3:ºìv/ØÉí³#iu¼gÛÌå|nœvíâÓHA?…Û ��t�Œ¶x·¿‹¦/‹M f*E3k+ °`2¿8>l£¬}.®®¡ø°I†@Ë»øÏu¸¥Œü<Ã.í�¶ÌA$1Ø™ù²+×Hvbl_ØuÖhž/nE£/�jcÖ+ã`ÉÜþMDÐ|Ì÷éçÛÕ«(÷D[í)KÇ"¬Ö`Lƒ(öhÿ#õ™@_:V3²/»ñM9àË€]܃á“.…Å}šw:ŽLï‹ë_”�ZK 6«²g,‡Ö|Æì³=ˬd‚öï׋–„ùR€çbpŸÅõ¹,ÊXh^� +ø§„îún„Sq¹#-½Ã°wÜÊØ«ar8•�Èf Ã•Þå´›,ˆ)QbKi´ä…oZ×0X£e1ÃY­œŸ$ý"ZÌoÍ!NŠF¦Lƒ¯äÒCk—3®ÛíûQemØ/×mRìs9M"šÞ�_Ì@®õ‘´°0ƒSç„;¸Í+ª±Â”H gÌ ³[5o¤ Ó0�à>¦•7¬æ3ÚúÅÆ=åf­,œ°úþ~v/R%‚wQÂMYƒò—ÄáÞ1ѺþK ) •j€Ü@lg�½®Ž6EŠ%‘PrS bº»‡ÏßË-y%· í'w‰ûC¥>m/ðÎ@eo·»Ög6­NÆê@øC�~Tö¨¼—:[�¼ô'X‘Eòå-Ó®\ Yq8´Fk &ºãÜ=½u½¤?·¥Å°üX\Ìoàª9R“¹!Gûv �qüÎ÷öàÑ!FT`Θ¶ùj<0>x¿ºlÇÙ.MÑ5õw J@c~ž¸ö�u qíƒÐE¥ßc*»³ßg+•R),ÜOÃìÔÁî 6˜—°t‘êÖG¾j¢E¶.¡›ä 4•§ƒoಅ1À|>õÂÕjúY� hÍñnçOy6 Vö«êÖwŠ�·1­\¡gdK¹`E¶3»‚ùj×_µ‰;l®ôÃe¼ä¨È½|�ë´ Èÿ‰õ+v¼!¹žÉŽÂ“‹ún˜óþ÷­¸£ îæ› @Ù„<äAÌ5²11¾´˜|¡Ïa7²lÅ|}hwûj¾3ˆÐ™øÐÞG…æð×Û» _jøŸl)™¡+«ýcì¹ %î^ÐÁûmêÑ"qDÂD—¼²ï[YÔ|õ¥®…%Ã4EµÇ7¸[|‡k «#%„ŠïbéÖì eK+‹‚DKuKüøß–GJ®;˜Âxj€àÝ áT�éµNêJ‹[°ˆ¨Ÿ¤8^O¾\kDúbH5øß_Km1�H9œ¢4ÆCq<ýšŠÚ*NoÆ¡½»”ªÕ«j»Œ~õÈ'1 ¨)y5¡3NüöH�Rˆ5lÞã ´Ù³.'w¯t(³ó¾.tt/7Ö!)¼0 �sÇ ã„�¾\Gœ:=3{‡€m›‘ÞÉVÙ0p†Â°t%¯˜ç:MžL¥—š5Ø(ÍÒóQ+µR"ƒ®˜’è|8¸ÕæiÂŽ™‡6 PMðª+L<¶ÊRSÒ!4CXà×xA5^ðkƒkj`ÞvE>!º'/,¹ñ éóW¢#Ø–“‡}œñQÁÛgjÂMÊ�°J>`¨ ±úÛŸ (±m0j<´ÌÖh½s<ˆ1 7•bÆôãí—Önâs†l‰GX3�E¯Ö2*Í5Ê”}ˆ;²”‹icUlœ$�=”@a32¤ßà‚t�PoAcW°)îÖ#†• œÅÑþä2=î6˜°ü[E¾ó?‹è�"÷ý~#v›´1tМð¢<‹ ÜÂWsó°[4±iÙƒ$M$¯Q&Bey§/»?k4³¿•4»…;ÚÑKW˱r=ˆI?y oU:ŒuïL§åÝ`ëÄq»|N/ðÈ“š[÷Öݠ݀GÝîòèuÝ숈€À„‹€Þ¼ˆ*�ãã—¸ ±ÐA?kHZÖbr7½Oµñi;@ÉtØ7MlLñѶßœr?,Ö {V’ÉÉA$ í“esŒ-ï¿ HÌŒa0M3a'γ8Þù~Nñ wán7›‹;± o…éÛKl­ÿ#X?²’Lc†±5ìgû`Wœ}Q6E´jncÔ›C…@ª…OvÏ8›ãáë{ÏÏø~ú�;“±3¿ãòNß ú\ø÷`Oã:'DĈ~ŸñVÁoÄÄŸ£îŠ›o‹FyÌ“Z¨rùþDƒêåU§€ë…ÜÔì2¡}m±„Û¿9Ÿç’&çæýcïéÐ�ÍÚ›½qïUG’b[5š¸ ÃŠ ‹þ�bÿ¬ilÎZaÍQÜóž!š 4 d† z‚Êä|6»ó¤ TÓ®•‡pÏöׯšÉ‰þ ß2�8¬á éó†Z»+ì|â쨶ò+Ì'Wó€ëšð-9›Ûó™c�î¼¼ƒO—+óäõ¾7œ�K ó› ÅsZ6 >š†Ç\£rÜYð÷d‹:¤H‰>!ÜŽ1e‰ñÝNƒ�ˆÌí@Y®ÒHß2º3�TXÛ2 :†/Éñm-i\�2‡‹²º1daÏAzì0˳|–3¯! \ì£ñ›·#æÀW'âúì[.ãºõM¢mi.¶<š÷ ¸­÷ˆD­¸qT †Wƒ=ì%à}¦Â÷ÜÕt]Vê¹]šÛÑõ©¨.àWFߨÜ{zøSqI¯Žë¼QýM}¸`E¶øõÉ”á,t—Ÿ>lw!I˜ÎpšyK6ZÃ~û�¨œ}òªÆ"Ò€O~1ÞUÎÚ Ö¾@� ýìÖ“«5ë-ž(â/³Í¡+s:C`¯¦÷ošCøWîxN@9xª¾�—Ñ�µ&+ñîSm¯¦ÖÍa.‚Z ) ÍÚY¯å{¸nøË¡·®KÕî3dq—Eȳ-´V'%oÎåNì÷•d°aô=8؃M›©ÞKsäóâç¯ÃçÞ0ðEcÌXå]ƒa7š*®yk{‹,ªÀžzø ³ØèÂéòu¿n u~~w B A@ tb÷Îë  :ئ Ù\Ãl i—u,[¨U ßE ί{>\ôrŽ.ãSieš%t�ÎI䨫öñæŒç›ÂèÊBÉLÑ©Ïíeܨ.y× <ß​oj€[ÁÈ�aBÎíÉ-A|%Å<›]sÚ�>>9Fň~3ãØLé'D>fÚI5!ßÂ3¾>ïΙÀUì›Ì¬Ç,³ZQ§ÚGƒ{W8$ý¿© ¬'EHñ«HÜñ€>°·U^Í ¢ÔEÛ¶˜Û`„ ­°hÜ_F9~ãP'‡Ô†úæ*ïIèú}ˆÙ:ky]ÖGb¨2ú: ÔàÌfûuæV×¾Ó(óMb^ÖŠXàmÒx3x¥l§³žçŒ¿ZÚ(l .¬`�ÈpqPQ`›OCèu`¬{c�©Ï­÷�¾>–i.g“ºêßL¾>RK/ÉŸñ)Fù$àÌÒ•6�G�4à’Õ_/Ÿ?=í<ØÖÌ ÄÞÄ7äœUÏ�á=ª£“ ð^-á3'>Á}­9&ž*ÙCÝ»^Ô<îrœƒufs÷Ü üºÑà�(ö�§¥| Šù”x¼®cÙ¢£Æ+o¬ÞÒm#²ƒìœŒ¿ln2$Ì+”Ô˜¯¡¶xmͼé_vÞਆ—$]íù@=±òi¨€ UŸOÁ@$ß ûX —S»µ!Ð d2‡®ùCqùgó4s ª>³Û·²s³*¿LøµT °9|ÛU�ã‹ç‰âÝ~|{¯«`5É{�æŽòÉß2d'¹êúk=÷Ú}î¿ë¥ýYÅíôsœ>æõê/ñbPcÇiw,Y‡®Fm® Û-Á=ÎŒð­[ܰ£1 vý ãw1jB~žFŽÀpl'Ϻ^õ¬ú³îp°VÝ, a(*ãµ"ï<,жEK‰c¬úÕ.F„f­(¡…@æ­‚å¯í¬Õ¸w z‚ƒæQ®EZ«,rÄ�väÃ:@O2`jrÐESLƒŸõ1-æÍ\˃cw´`2!Ì­ûp#ráâVôx‚ 7—´ ãë8ì_šQ÷n?qSÏã›m0ÚVh�šÚÀŽMå'Ë_SKZ(òøÒ÷ÁdR6`PìpÆŽÁ`"¾&Á»Sw"É‹ãu킨wn4gïiLË×f4Ý•lãJØnéDuq‹æËû,t-Ø´�öÁÚåûÌÌ 1-÷ŽÂvÄÏb¶³8 ¨{Hçæflss"ÞÜa³ÂPæ, pT¢5·mŸŠÇ#™b =‚Þs¤W»X„±jvØßE6Önª¦Q�äÛ¸…‚O(�ªÞ)TGè §/íñð!|¿ã›ñ eÚµô°ˆS]A¬|4^àQ,«Ä¹—/½:¹ƒ•�ô(˜+ºNó{œÍQ¥Cç2q^‹‡ì“Þ"ýÅ3 C3É|Ë.§V^„­ûÍ÷h–¨=_Åw ˆ«põX4ß3K|ná57ª,œ•ôz»VGÕ.U†ÂZV‡ƒ;Ý÷O#´¶\*ë²ÚöË2ÄêÚÇA³ª½ãK”»ÀXvdàèvú×TE7 íô.ÏÌnq~+yÙzM6ôÿ/?FŽ ·®|ÍóùdS™®@tzìxÔ¤:S€ß1ù$†“SfkëÂi«’Ε |~´âº`†×À\ü[ƒg¹åZ­b ¶ ¼AÆÑ½õp‰¿ãÖÙÔ¤¶±»ñ†Š¬O\b–мlv”[mÚþ®kšŽ 6µvœ7®&/ 1Eû‘GcÑõÈ;GßÃ)ui´þ*iOðOdÈà÷5 7”3:˜$ØÒn×…o1£qÓÔ‹ÖÍË»uŽÂ*ʼÜ~Ê;ÛÕ{{Î) b{%˜y2õº•£Ëê;ëDG£Ù Ó�09žh�9 …¤RûãJ+Ù½ÆÙö2°Böƒ_ ú5ìÐôÀïúÿàýû ¾KM¥=e’Ì+ê9J¦®ñQÜ[  7ÙÜ»ÆÏiÔhÖ#¯k•QY%¨Ö‚/9�}ŽÜ76Þw;’(:' èÚ§M�{žÙ¸ÝÈlâß)ÛÓD�ÚÄZ󜫩~qÙc&a#žðηs%ßÁ‚™¬ÐA-ìkgM(Ð�9=ÃÄ®¼KZÂFtÞä´ô+gùCˆÆ>[`§6ß„žÍKjÒrsV MN5–«@ësg…EÚ…wÍ9Šíå·G‹ƒ£ü³6Ô~¼m.ØÌ{QXIa:å8“®M«qSäòÞøÍ™ÒsÄàðÀŸXé4ÎTS�Ñ­Îq'œó º"ÆO©(6mšƒìl‡§‹onX9µDŠ)¦ªª?Õ¶Kß™›ÜK$¯i% tʲ^-Ï,Œ—?^Xy£ÄQHÑâð¦>sãV˜¯*ºù�Æ…ÇG„BÑ3�(ȃ¹³g}³´†Êc+± ³Æi‚4ç4| É.�øgØîo»=x‰Ëát>§,üP·¥Kn¥‰Š‹Þü^¾_ë†X’?»{ÝšH8Ûu.s&DâžTb ¨üùøH“6¹N²ÿhß½‹ÏÑËÁŒ±îãš9téW],¶'ÆÉ²RØ<�±I…-Ðî,¯V©õ>7m×Ò(™û…Ô =jé®ë›åóà•äõ‰íp©<[ r\@c‰H„¶¦”Ãæq ú²èüfeû…iÎâ-Y>L§>ÞÑÏ RfÖ¶¢òù˜¥¹Z­Mš±�,ª_4|�¼¾!#éhT›{ÃFÈ2·p8› dW„×÷éu´W l¹]P[/§k*[!9×" ™C œÎ]=Ot�8?ÒS�I“oØB†Iv�K몰¬Å9LV󋘘ăš'DåšVñ}·š÷º‚°{¾Ø,Ïw·k/W{ÌáˆÁЃ&ëäê¾Æ¤sƒÍÙ/é™qÎÿõ‹DÞ#Rïv\XoÚŽ�?N™´IÅòÙc!)¯5—„¸»ýæiïé´ûbíHfšƒ Œ•Ä3`žØä[ÏN/%vws™í¶ `µ÷N©L§Ë åÀâ´9|Hm4w¶\YÓQw>b‚1�oÝÆLQ“2ëfœ�� N ­¢è¢Çõ M£¯Ûµ­q.Š\ÃæÞÊ;Ýä´­FÇpC.q`>­…d{y·¯¬0N©RÃÜf´~Ø6Û¸Pæ&á›Ë.³¾šx2‹»�ÍÁöëCË÷–÷DŒŠ\²‚WÖùO’(,å]MO¼ 6YÞƒ­ÏmhWV¶Ø™8$.J;Á´¾+[N0"”�Úè …‡ DPí‘;©N+ûÛÖÚü6-Ÿ.¸Û€£¾ùTÎÁÓë­ƒeáôóÞ fÞÐ'6§ì×!sÀ�yE½%Y8Ý1&%téè"� ª™²i4‹�ò¾/‡´jJoyÏT› 6BaDüÍWh¹y$~|]föœÆcy‘R}µÛq}TíHÎ% Úò�¢¦ØWÔÜôê,1ÈÜvÀ’Q‹ÈâM¡iOi¸ið56ûeù>}ô½§·#cÛ?YP!™˜äÚÍ ˆ@æ(E¨Ò|; Ù¸Œh·Z$ÃCî,N®Šä£0¶|/ª½Ú¥N[œ5÷ËnÁ§¾­æª×^Ë?®bna‹¤3®ÚÊò•k]“åa#Û]ÛW¯ÍGí°A-��-�Õ�QnF†§y õ¯€p(2{É™J²hî€Ï=¥<{  ´C*Âu¾Íg]nì5®ûs~Þd}}aö’ ì&4Ê w ¡äÌ,σ�θîÌŒ¯bx¬`̽�E´qwå6�¶–LÎðÜU‘iYTÓ`1°‡ùAVöw±¶hîÕÊ|dërN�†*¢s“ ûÝ»~¯ÊuÐjÅ�Á\ˆ�¸µò–ätúTØaä¿ÚwlqËL¾¼ù3äÑë pAâÒ^%¼Í`è”vÝÇ简†RUš°fš/„Ê~m+7l·fÄÍÓˆU[DHA]X6"Ÿ V`s *ÇG ŸbÇö,9Ç�ÚDuç@iS€<;ÐÐ i±®.³½JÚ3{Àñ®v(ßÖ�PŽˆ¾rlô¬:¥* µ_ÓW� =ñ²Ò!féèÑ5åƒ€ØØwKÚ>»jæ�ùÖöB]–.÷™áX+qú„µÅåñóDI/c¿¨½±4¦ÐyÍÞƒ  WÁM �Jfâ í†Ý×Âd!uš/#¾Uª§çé½d(v#£]'ï9ÆP øÌ[7šjÖבÊÌ4�¬&T's·[¥¤ [KQz“-ïZb¼«„®qƒGηž»[¬3%àâK%[óŽV‰:wäèõ·ŸZ›ï ¹³[c½F’¨ý2!"¸øæÏ_‡¯dLdŠ&øÍeò�Ô5¬CÈEC•¯ôÊ—ÄKjGÔg9ÞïW ÙS;?Èg²m•‚�òâW�$cÆE4B!ý&À¸_Ä6Äýô\j#ÝNå@`hgà=(j~‰ýÜòìôp8àxãÇDµTg…}ÚÓŒów¿ºzêž@Stl\9e\XhµªnB?Ãzõ`7Z”WJÝy0žÅ©”˜_ÜN¡À�b‘YuPÈjË$¼Õ`Ä`ñš�€Þ×ï‹‹¶vÎc”`bîy›M×Dk¹->³§g 5«àWbx(ÿML8vô€Ñ3`š·Ï©Û|±Í‹ê«Š\ôÏvŸ;eQÒ:÷Ü\eÊŽ:›}-ᇓ•;¹¿¶Ò2¾:Kœb+õ²wž'�¹»`$ -ùé*GÅ(¡ìÖ/w’ݼ¶%UýösûÈSDœ\Îì£ >5ÎçqúÁÑNx źDÑ‚¾“M{ ›žTxí{¨e, ÙáÓ…"ÀD;\A¥ë�“])E‹»Û.ð¾ªHô…�yüœ^óo]Ž­¹Ó6�ìºOu##p ‘‡ƒµ�&÷ ˆ${=v<Ò"Ѭó°Â ™âIì|�ï`Ä­=È�[""ô–ºò¸ÙYè„5b[ê@ ¨E„òZý�|Ä'쟔8öýžâø<šyl±w3“¬áð©ŸÑR•g\¤'¢ùÊÝ F¤Oõ§±u³¾@&±8u»Hckù/‹[¦<ŸÝ™Œ.‚.tùZhÍEè&â&I(Yû�Ùg [µœ®æŠÛI¨Þï°?Õö‡Y\2©Óúx6ô—hK¾óFø !]ûåÓ–¨Ž±²�ÔÒè—Ÿl£^É@†Ù&ðrØÙVÊ[9m£¶ˆ¹ m÷™&´Êµ÷^>ó^"eÖñr۹߮ƒà©Ö0Ù±`e“!µ0šVº÷zkÄ‘¾¸À׬–q6¨¼‚ /´«p[‘²=µõ5WB4&ÐY8Ï:Gk}ÖoÚ.ý'¡‘ÚY ;À ƒÝ‡Uª/˜ï}7YMÕ´JSå°QÃPáêȃ°Ð u“zxJÚ¦³°àIo˜¾ ÆÑ)ìèà $XΚ¯kÎsu„6âü4‰�$¥-}ì²ü9޲9àÏ<Ýèè£êç|!çˤjù¿Ý~Ä—±î~¦/²m²ûiÀ°ìWX â €�ôwõhÑ1Y닲uA2Ë}ìE8ÎŒñSYÎË:ÀÖ3_—š[JŠÛ‰yDæÓY6x®ú× Wd*QŒÀêô­1ž}IÀ·Ê3Òœ::|fÑ·K @Z8³‰Ѹ'4Â{•a2ÝeûÂð ³\'žøåÞgäB<ƒ‘wŠùÜrÚôYBq‚qÎ6°Ÿ;À©Õ·×]nz¨ûËÏÀüǤ ÂBO |ËO®/Ì‹SÜF™«.Í@¼Çü€&Åãp ýZÕº{c‰¾Â6#}¦ÛÁÔŠv^MÞM2:>¡;cÚÏ„³»’Îe¬–µ¡à'R¯îØ<µÁbdìtúX­:ÄŸÃ�gÐŽ¹ô¾Ñ„fÇ=ÜÀ˜GIÃT{¼M›‰(TÙç¤Ó@A`÷¯ë¹w¸ø|XÌ;çí)•2à�IŸF Ò È«Ç1¸²°>Î`ךôwœâÈÑ�6/„_&|õ¨Â·Mª_PÂÙEß”àê¶úÎÒm²uî�}”ÍÎÏe;…µ»}=ÞË_Tˆ8¹5 Ê­IMÅn*nÖ�µñ'Pv&HàZÒóÙ» T^‰²�¶�·CB¿ “,°Òd˜nP d�ÍͳY0Å©çôÚXàK¦£|+^'HJöåîäÙ(!m¢¡knϨ»Žccg^Ç™?4b ?%–ní‚D ô7ŒKáM8¬ËKØÝz°rh fͬ ×ôom‹z>]·tÞ«M™�hKµŽm_1t ÷#H9â"íî‘Ĺ:sû>^<ö+רÍ|>8ËÊPã@âAt^l@×á©Ikò?jsš°_–³p'¨Åø-ˆ{à$ü‰£Ý�r¶3²àçsù� o‰l®…0·ò·ôlâ±RÏÏØ–RØ;  ú÷„ÛÀY%Ñ’è * ,Ô™á³c9P"Ý�Öð¸iC £±RF/…+³ªÞ)à“'ŠïrÍp;ÁrÜ ºÕ¯Š )®˜d很½p™x79j 4Ïà-Èi Zþ›ÎÏl—è.õ �-ÂVHºö€Ãd6=†‡-üKžxXQ)£NtX¡N®{�±t0—Ü…Æè~¶ŠXK*,Þ¬ÓRå.›»¤ásGd|”qm$PÂ$Œ U~ïÝÛ÷žÄkM ÿk4WÞdøWÃHlØšQ¶h’� x¸ü½ú¹˜A ÓªcdE3ûw²«ßNÄJQyu“ Õy‚1¯ÚœJ�Û©`Î…­\Áìpw:«+B~Ír� f ßB÷ê6Ò‡-–YÙ@Ä=YÖ1C9•ó/š~u1¸]6Ëœ™†Ë@6Bu?/ !Y�P3&5j'­&Î W*½ÙísÞ›— �Ê–‘€[ö �9ªÂÕ„F§’—†u³ˆ`XO—ù‘îãt3ÉTˆ–C1Ã’¡á"†Ý„tO³ÚõÅþö+¨°�èI·×…m2‹j¨È-dÏÌt6ЧJŠ,Y ±_ÜŠùó‹0mŠ÷¹²IÁ³ÓEGt™ÓvÐé}è)wëâû´Hß”åf…9„kV³T¥S-¸ô—[�‡bíßkÆ\µ€ˆØ¹½Å¥zµ"îIŸÕ7lÄèyŠÅŽ£·Õ¹»6¶•ao%¶ÒÁ\S�{ÔqŽN»ˆ!ö— Á”Á×i¯îMn7Âhš3l¹,‚2Æ‹ýR¿¾m»‡£qn‹e§åÛ¿Ü×ÙêwäÑìœCÈ7çØrF˱;2�h’bZçMUu;Ù ‹)ùÖ"iŒA~ !uB–É&†Âê­v\{ûNâÀÔŽ&/^Y2]y–æHÄá<îä7–pºÀ†·wÞ7ÄÊÕ¯½ÞÀ4õ)9HÓÄ�P‡D;b¿)fÊ,Ã�à™egÜÔî�ž€_-ëKtº8l’ÈýÉ`¸q‚ÈD|Aßb—‚³ðjšJÈ[œ»wlÅ>BBL¨}ùK�¯ð¡¦– Öü7ZJ�·3×ka˜ŽòL)ú/‹Ø!2bWÔRJ°¬²Âèï1-}Æ�2Bå9(–D…NÆ.0–¥OÌ"4R¿�¬OÕåm9»±ÞEg[Åü:Ű&Ÿ©Jï:Ë�ˆˆ-ÄOÚàmU�Þ�íûîÀÏÐ�r1³6#2RP‰É„‚SݲÙKÍ̓†GÈŒ»Ûc¬W `j# õ3 Ëî}9ï¢ØÙ\EÐ6ƒi‚·ØØ[°3> ;Yã©“nqí8¼ÓÂ{Ž.!ªaÀ&8ð&îœÂªK´;‰öÓmx6ÁšÕûd¸V|Ç}ÀV¯SÞ.õÔ‚(žáL�ñs>ww ÉÏDPå»Å[o{ÚD)3ÌHËsbÆZ|y�󰨮þ °3è>îº;ÌP ÜèQŸ'qŽâÛû\ ôeîO{;=‹¤Ìƒ û#��Pâmôr¸mÙO¡¥É€ÇÍî}ä0h„Žéª'�Xò`ÈYùƒÛx9‡†�q—,±¢šµì�œmâÁ–Ñ}Iœ¬ØÏÈŽ3Š ¦ “ö{yíÛŠÎ €2hz;p`¨W#šzáºj Ñdò�»‹$%IÛ&Gñö/«cG{æû‹wT¤Çó¾— *÷f† sµ3"�q, ±Ýç39Æs?š­`ÌbÒOËeŸ]*¦ïÚµF¯¼òˆ „Q¶ùT `>”“�RmØöVzvç5žÙVîÝÝxô!nÛ?=Ê×Úšùbü­ÉwÏŒ÷$û»Þü:( ªîi›àbÁnÈ‚ö6ö¸í%ösÚ†Ÿ9ÛÉßâ;Q^6 W»õ‚võŒa;q²%«ºÒâ\5­¾û»uÀ­ˆ™c+¡j$f±W|'Âð¹1v¡y'l=ËP ˜Å¼�¾IâÝzxÊ'ËôZ¯½c'?;ñ ßâS] ¦>6:û´÷ ["‡Çð›%¯‹¤�+"l•ó¯b„«r•Yhû 'H7¾ã¼³¡BŸO¼$€éc¸¥7šËüLY±aƒW*_ÂÍ”2Ø¡º…®i/‡ GI˜œ8‡?–ŸzDK ]±kŒí^ÇX²)B Ô+ƒ 0f((. •ÊDã”–l 6 mÕ$ c#Aý¸ñ)ªãfŸ˜½n÷VC�Ç?cÙÒý{ o®Sõ±ã.nÞ”D/{ð�¥uMp÷![¸ü÷"³Ü»hé±K¦̹ Ìk šÚåvÔ3UöwfÞÈï)‹h9T‹ þe™¢{»æ¿ŸÖ§!ÇÅ¡hølµ‚$××:BHÔ¥82jšW¤•‘Ä#�¡ àTpfa6Šáãw886Ý~Ö4U'CY5‹Ý‹+`Æ¿)~~£ƒbh¬«ý“•´Î(—ÍL�Óû%Áõ7<8!�Ê�DÃpé´2²Ù´Z­ cgaI!a1Ðêîd�qñG'ªMåŽU$ Z2’$qòlз[¤YÄýáhíHÔæ‰æÉ^7Js¼¬[!s�¸©Aì^l‚ä…‹» É1ßV�C¦8À[ûºÎ1ƒ°�££t4_�Œû!2†­€Ú…Íþc‚TÖUšÿŒÑÎ)¶ã–/˜µìlòö A¯áýØÎˆU,+Gòàaë•+ëÓ˜(õûu†x染6úkZ‰.©q¶ŽyûÞlHglÉFЋױi3L”.Ka*�¸£tL8àÖ´Íâx´_d˜¤ûë÷;Ý0´Ð:†Ð�¤”¦ÌÞ ½+cR ¶+úy42òáþ)O1E ž&�#xItmÊ3ÈЉž¢G%îÞn²}üiᯨÉÊ Œ²\s¯îgY¢9¬t]`pa…¡âŒïöç|¢­ éP³U‡Žjg”ŠÐ6Ú8]£Wºí0díGâ¤[5|\,È–¿'É¡€S˜ˆñÆyX쇛«�iÉ¿�p+i„ÌPLþ9Å�—_¶™`Éq³/æž®†ó¢0ú~–ø/ùó,�}c$9�Ÿd”_OK�L鯭õ¶ˆ˜(¯ ×ÍÝ}8r$½k¬ï¸ÞF±ö¾ãbžåR¿xà@¤®yw}Û|ýgÍUð‹†„­q„¸äÁêEîÒ¾Ó…À[‹¹Òã‡ZÅs_oBŠø›ï'3½‰]²õ[Ë]¦Ÿ1‡êðÊ+g‘°e}ž÷œ£ÁÙèð’‘}w%2¸¦Îñly« Ø'�ÜœÓönÌ6@. _ì‡Ç ë¢À,N%±“Ã*¢Í´Ä­áŸaiϧ8B§átù}!jîx»¦ïW©bT+‚÷NÈÆ8ÙÂSûNÎöMêÓ¶]TòóÌ«q< €Ä-y ìYÍtÀ~@³çôWäbãCÝ7xG�oŽwmÍÚÎa1WE(Ã2ÉXRelÖ»°˜°VsBýŠY‰³¯á7jÈ ÖM*z/~ì™Õï0/§‚Ö4Í1‡†D9½­Çc’!†+4eQc,—‰LGË©eکƳcƒÖSyu+µ ^�<×´îˆ=°bÿ�¨ÜCƒOí—VFö¼›Ž†>±€€œl{ÔŸ¿‹ íóÝGJB²«&ø<Ž_QSiCƒÆz'£¥Ä÷¡æk1ë.ûÚSŸÒçlEõE�/èØ$¿o¿·�f(R Ÿw»¸;†âÁà Ë7æðg•w]Ï:[[Û#"•Úê .-Œé)í_–ƒ2¹¤{þÓê¡­u¶¬â‹6oqe3¸Ñ¿ÙÌ ïü=öØk † föÅU2ð*âœy=OùdZ)ßo•o¥#_$ô²¸«!{f¿¼OÞµ~°òåC?™“»¶ñ²‰•KM8¼< +ãËbÄ ‰‘È)¯Jm: cL €ØÎœ%€lˆ½ËB€¨09ᡵ‚œnW09ê\Ó#É;Yon ë›OËÎï`¿bÛ+n@¼ 5áúM³ñó-�cʪ.8'6ìòþÆA'rç~xïÞ)ÆþÄà²/%rêð”Ÿ/+4ÿ}ß¹ &ü=€þ1¼XíŠËòÝf¦©Ä ù€À7œ šmGã¼_PÓ|m±‹3XF.˜–�'oÀP›ALž¬Ù¢Ûâ�µgPÊb»/œÞÈè6Ð çÜ¥È9ØÝ�•—l@xŠh"Œ´¥P!¨R69{D9Á®•M°ÉOåÀØÙ¯|¢J4Ìã2ÊD,rA[Œ^ÖÃ�6N‰ý ‰)oÔŽ$Ò|Ûw¡{ŽüÊ×R^-?:y¹ �k‰fhØ@^Š 3•Ä+Y±«>Jg™PBÔe–Ÿìtjñ +§ŽÐnƒv ί? �ݸ×3]\a*C+9ýø?`¯Û@ÝIƲ:Hi^Gã@’$/*÷*èV¦ë�ØšÛP[KäI"í’³]1œÚ,eGÄÑX¤šRãEªléPù�¤½1žaÃZ—”J12�üH{G5ƧÌe«nª:{�ó˜0°ë7¯³a?Kñ¬ò°Äý×5Á4 1fÇCLäZAœË† B@¬ÄÖ9E«Ò ¨j$ZÀ(cBÚÝ×F—ì-°s‰.aÖÜÊ1öa9‹#gÙh þ?± ŠÑ`Ö#B<\\¢U¹Óh…P(¿µ:wï+§Î|æÿÃ�8¶ÀDBÓƒ²Hß1ñ„ÞÕN®(ƒ]a®\èîEøÿ燫†\œäʱ'*îÆ–^Î ò>ôôEíe`Òða¾î;£7ç’†“h82Ö™ýßy]íŠÇ5§9Øj”vbë5®Ug%¦º‰·²s šØ—N× µî¥’#`mN“lk±w Ï›MÜžÆÝ Þ56¿ì ó ‡Šñãj]îßµa†…A$wp!ú%ùz‚ c·ïÑsd쳺TÉùŽ�DR9ƒP~¥J†DâÐ�¢çúàýÞu|MxϾ¬c ÜB9rMñr{"‡EÒ§ÏÐKñNãõž(Û â@1õøÿ´2÷L-Èž÷Þ¹ó�ئò6òcƒ`ŒEbrÒ}cÂÜ(«qÇëmƒœ€ÞC¡�”æ²¼ø›%ù˳ë:`�ÛX‡cÁû#ˆùhC· öxò®ê…Ö½±¾—ë=cuM€ƒ–ž"¶Kt¯àtˆë!Oxöˆ³Á·û Ãùñõ%Ñç�ö>_Lžd�Ío|gî‘÷šcÛ…aÉ…4ߺÔû²¯·ŒzÂ…fêÕæ 51‘¸Sh,”GúBœ­ó Öó]…#dKVÛýò$Xšmf-Ñq¶>üÆX<°çQ¼ Ka‘ÕõV´/@¦h·Õ(Ü[+\±‘„ =q,rC;¹èóºùNKÿ|!ʵëSmÒ�+Ní•pRQ½—H$Íy.€­ý¾ 9‹l=æf-ŸsAi ¨luu¬5;}N äÙtÌ÷rt�Êú½üõ3îÙYqAœxVÜ�vóø£ 1§dbõ‹—ÊFë—ÆR“¢¥CÚ�˜w�…¢à»ÂØ"ש˜+‚àr–k˜PbíªD¯Í슃ƒW˜]¿ÃÔf�ëš]àLZA¶íû˜òí`~À¶eúudÔî½Ø1™×ᶉÃú}ß柳œÛ?¹TŸ¦ÙC 4ÔA嬀»1&É%—„-@"éÌ ¾ ߨ`bVb2½ÎjÙèã4¸¶ËZ_ç†çcܼˆ.d�.'^7�¹ÛŽØï¹~¥ªBýþ,Lx¨@ÈDÒJ?z¶I÷/L*_.&ÞO7¤øù÷Cp›ÕÞ¯çH-^µnRÌäë5ªºb„qO«ê9êžøu}i3·^³(UĨ.Á§5SYC¬ÊNoKÍaSl ÏÀ¿~ü[tõþ{?[[}:�‡ÆÁõ  Çî‹9·Øáâf÷lxíuí·Ú{ÖG9@�È6uËÙ¨Äæýì0|ýˆºi5Ë%^[9.PMœ11eK‘û¿6¿M:xÔ;¨|u$"k… ¦qî^@eÃÈf"ƒè± °¡4ÞÂJ¬ý�ܵà#¸»–5ƒ3ç¥%Ê…,i…Äk»÷@§B,a«$Ot4”R{|ƒØ&#<Ã&Ⱥ`wC)ÐAHÛð¹§<…~òèö¢ÃÞ�§Wfhé2ÙPjþî mwÈ� ?Œœ’ÐVDÒ¹ Tš U¦ y˶�°;½A&²ÿ®y¼óv{ÅÑ(ÂÔAfWFüÝÅ(–l?'v/Ò¿4K0”Wßo×KÃü{8_ƒá®BÊ÷Àùfm°‚&@R­aw‡—±¶R,ÆS»ÏìeÏðïß¿n«Ê¿X³fïÉaȆæ*/ìq—*tÉ¢îFìȶ--Á­†¯Kmä4¹Y¦Lf¢ræ3§æ¦Æ[PÁ°$21!èð¶ {žå>±oIo�6ÇZfÞL¯fÐsëm¼Ø>AP@Ѐ¬\œ€Â™ ´¥ÇíÌQ‚½Ÿ¤¼1z¾•�áPÙùôšÇsµ¬–C€ëíA1 Y|òÝ«î|6YŒ¨coô–1‚$ûÝú½ÞíæeW}q›+ch‚yùZªÿIü�Î3Æw‘VR ¢µÿf}beಯb÷p3³;„F_ 2ˆCt½t¦ðx8k5ŽÀ òäÕ$“8e@O¡mx¸[^ìµ�ݧág)IWÐh’̽�?CZΜƒ†w®ˆ[9¦¿Êx ^bÝ»¹ùêSÙ+ xîzÛ¬�F(ƒ­Y�%_‹g«òøìr|ÝÚ˜þÐW^µ÷£Å×GÈzo�IZâ\=8;éù3Ù‡IÅ}»·m© ìã�5=›ä“wbîùÆP¿mN–ZÀ׆ÐiV‘­. Åëæub8žv²ø²ýŒ+vHqU°=²65âVüå¾ãL"s'´‘›ã|˜ôÓ*/oÌþðXWCðöÐø^Ç>Üžïï(Kh€kÊkpqîW~ÐeÒ®o–UQìR×q­ã–Y ÷aòë´AÓÍ›zwD:µz³pžÏ~‡¯bµ"Ñ›ÑÞiõ·d4Ä �pÂqz�½ѩw�ñÜÜ—@ÆŸlú¾W¶ªÎÃl®Sí»¿P×ÅÞö0Ü7®x�ÏE-½ó·¢WLl¢ŸÕD\íåaoë`T'ûV�£h‚ܘÝPÀ£”îÓ½˜­VÈ_ -êº|Ú´†pÊ[Y{bbD‚ã±Ô[@ÀÅ{>ñ§ô¾†C„³¤Ü,âZfUh¯&Ÿ#n‚�c4w¨’ˆH¡š‚¬KÀo¶Fû/n` tF½[ŒM8Rxu¶øï'VY|3šÈc¦Ý•BÒ.j™´$,ÍW¢CÆoœbíÑŒ(غ\nðÒÿÛAO ƒþ+M' Ú{0ÙO?’²grÖ”MBÉËVmh½×ƒÊæf”5öâËÐqS³ãIýE`Ϊ�  Maȱ*}@«`FŸè¾F-rRq“öËØœ1‚б×":¾Æ—±±÷FQIö]Ö‚—¡Â¬™}%dÐü =.{7ÊJ=7Y$Ô}Öå“�š,„vÓÅ�øWYÐØwòŸ ’VMŸyc´¸ VmS7ûzº¸»Y6UùÕ±ÎÚ;…%îd2ñZuSÝá±Ý½ïçÝÇÊ…o¸ið_a7†F¹ù-^÷p¼àþ»&éظ¾&¹Ú½U¥¾�k]˜=�AxÜáW¯¡± Fšq¼ß>=Ì œ úWˆÜ~ܺý®ò’ñ>#ŽèŽôÎ�@>…ßä¶£»+fÿ�ÏóV燸�Î4tîó›Z@J.…mŽX=³E+hÛ˜C ¦A[ä�­oÚ!H ÐV�њꀊ@�œ#Ðà@º�ë}t"½"åîÇjq¹ƒx‹êQ⤶»˜ð-‚cç-}pétuËYÎnF°l(Þî:¤àÇòh�ù•£”krQ÷Dðöª²2ßÁÆ;¾ Ä‚¹‡U¢ ZÀpÕ«í ‰)­#þîä$¬G`æ7ck±®ÑvÌuJBÌîRKͦµ½Þ×ÒW|@h¢=l‚´§²¾|ª¤Td+Hͨ‚¹:¶¶¶vй`P »IWÈáÛok¶h0ï"Û)Ùíª×/Ø¡’Ö�—Ù‡#¸§å8í¶€§[:ƃâ4Kz8ʾµˆ…o$õ�#ƒð·»L_²Ž)‹U«t…@Rm•¹×¹œ|º²à^÷Ø®Ä VÙ2´à�z¡.J8D¢Š®ù¸5j�xãgs+�llŽ–¶À˜>ŸnÛçǵç<{÷ß´~$ÌÉŸy™ŸüäÉ™'ùäÏò™3ày×çŸ�±÷ �É}¯%„ÆšÍßq_ÌPW¸¤m  OÜ¿éÖºF::\Àõ¿&މøZE3òöTÌá/ýµˆ•ÖrŸ\�¡aF¸ïx^‰:'“øˆvÛH‡v*4ú ྉáUEïN,‰Eù}x½ã£’û:Â)ÕN~´êeJa°Ll²vò•ƒ8'õ€htÖW<懛$%-Z==7~ouÄ¿ чh¬ÑuYlídPqÈö0(JHPÂÕüºñŒ­Øz©¡wT¨èvç±Ýê¡M§Îõq Ë ÷ߜԇ¡\•ršO­"Øžcpà)v¿@suJ ™VS¸ƒJÔ#ÐØÖB0ÏS:¿ d ³toÝœ„ÓBv‰9�RXN§¹�È|Ê¡XÚÇ»çA™–�`TG¹®ñ·Q•†YP¯¸99o®IZ ô7“‰•67Œö :Œ‡0Â:V{\ÜC x™“žâÞý¸h*̰US�åö¤*1ôÔ—ÖýtýmÝî?º¡&e/Q‰8J�k+š…‹>ÈØu5�u˜mIÔ¡Zƒ¿ sAl>ñU³/ã•n Aö¹[áTèkN�Þ õÅ|ßXÁÖ×+.Éøµœ Þ†F§� Û1lDÈ]Ùï&[Î$�dÇ!p€Ô‚¤6¢*ß®(‘t] ÃQq Þ%ë«C­gFß°½«çî_¬u=f÷±øˆÂ²x¶iP[i.öB÷jOKçŽQLôÇ$~OÞÔtîÎ^™ÈX° ç¦8ÑÅ bÄ�ƒ$¼ÂÛu`=$”Ž€,I¡îVкŸ™íÈâz_‡¦|>³yn7éúäæle”‹yw€+a‚Üqd,{ME õ:é~­Ê–ë?Ïkö½ã÷,ßó¯UÚ‰q7Ý^:�pXàz¯`%Àûä†=,[Ó>ÂçŒKÜÐmá0…9>Î( áÍüKÇ�0\‰o†Œ«õY%ƒKº};Z¯Ô<æÖ�xyK*r,Ÿ|®Ü-…ìž8¯Í“\ ¾Î¶Ä½l5)vBdM—býñ Òèjv³zóÜáœ)ɦ°ÄÍ÷¹9P7ÛÓªÊérIû8alsy Í†>ÿ‘±‚ß»OÿS#N1`çögØ:·÷0 xŒ;mXÏ)ÉQl.‰z}ù�³u-þæºèÔ»­lúºê×øô;º»×©'>ÜÌ ás9âÞÅÐÏ.6ûGl9aæ.C¾i~Nã} }$æŠèJ7çA7°*Þ&±/Y€+Db¥˜d­÷¹`¸¸Ùl¦Ü=¥â¯�‚Mÿ7·t‹çHIb[|ÛËøB!6zC¸fO¬‹iåÀ—Ju‰�çÁ¹ {Òt×8s*ÒÙ¹éuº^oH¿|ÇŠµ\³ÇŒ½æøŽ ^lœŸØ¡Ù„ù*vÝàG­÷Ámœï¹Ûä›8^z~5Æ\Y'’.Êý`È@_°E™ú5ð K7ãON†m¶×ùr¨­]>ÇzçÀñìÛJÏ·Õ²Áb£)Ê#M¹ i ÊbÆ )Ž; Ót̰1F7EBb º&ÂnR«Ðu8pc@“ÎG€ÙÊø]ífnÒT˜”�ŠB/lÛ%›]VšLîXÌXXlñ«…ê?y¨X8%|g Ni âhG۹ˑ͔2B!ØbtݮĿbß ð#ém>ÊÁ®Ë+Ѐ‡·ÕKbðøðäd9ÖÑZÐÈØ©ë{›øQük!Òiø-¼:#¤d&KB­vCo kBlyP,ýµYd6G~(zç°›®4êpíŒg÷@ßžåžo/pçtÙcÞ†ít1G®ê+;üÈ�ØkÓ-°f q„ 2q]N2¨˜5À»ç1—¬®µóö£¦ÅÆÁÞƒÒr¯sreúͼS¬Ís+2] Öz?H/xf®U”³Tô4LÚ^hw�ó_k<· \Â=Ë„o®\XìãfîÇ‚‡ç°~$B’Êjaäaå~ð—5yG$Õ%(ØômbèÚda ½«@lÒ¾ž©=Üe×÷fÚ\d𮏇<®qUÌLñ¶±dÉKV­4 ‘�Ù`[L‚!ô Æ° ÖRÀbÛm�4ðÇÕ&LkÄëg’ ¤~ù'dúÌ*aüù‹±Ÿ0¿°ní|.\Ï’;íæÆNŒ*Î<À†¢@Ì£¹We‡›Á�ÝÈh4c´ñ/غ�J<†¶­òþd>ü. È�ë� IêÍ|˨X~‹gYʯ–8[_”%z à/phÞû ¯ø\ÚóètBy³{Z;eŸº~@ª0ûÙ [1`ÿWÈ w©ÂK"ûz<àÇ5^ f¿’=Ø"9‡¦Æþ:¡|ï@Àmt Eȸd«ÿÖ%šÉûºËž“… ´×ß4ûW¡€épJrY—X°�Qó+ż½‰|§ê†dÊ#�²^Ý ÁI q©ƒ<¸·ç6ˆ"ѹÈ{Ëß¾Uù?\Xoس%ërÒ�¯Móáb)l�7q‹%ã,Xg=Ç‘‚„.€Ãê—¾‚×€�¼cQ³„'6fÞ�C¹`ANyAðAGreH0ÆBÚÌTNøá‹¶{ƒ�¥7pÍàx¼ž°ìÂöë6ïl©Àx1@ÁÞëšÃo r¼Mö–å'pæãN Üzò_Úž½«”PL›ÜE ÃlP§jŠêG’”Ô(> V÷3v+ à¨ÅG¶D•†ûï|Ãä½Dâ?$–Ùz»P@QàOvYì$ºk³cÀ,òúõ\ßDœ—7^tÂ;@F AÐéïµsBÊ!àü9&:§PÒŽÃw{s{Ãe¡�$|žušjÌ,Zrü“A‘‘Éæ4wÛ–7�ëÄê7=è+”ç­†m'z½eàÁKgù‹RQ&fDÂ꟰©Ÿ¬`!O�Gbøw­†|†G- �¶xÆ¢s²@F'µµZµ3{ÇöKjÓóï$^±!p¶ù—éìõeýÀ¢§ÜYxÚÎoÖ-zt°Ÿ’j ®?–þ¹ÅúÚѸóØøAÞßP¶{uwzpû{Ã4õm=q´·—ö­a=åýЗÅì}¨ Õg ªµVÒ‘Ô�X�wÔÁÙÚ7‚àw~ÆÇ7¾²j8èµÅ¼÷ù:ÑÐ34ziÃÆT2€µ¨n¢Övl¦¦Ÿ3œ �År2m/'u¿›Tåñäo‰µr9ILµb›kø¤T·?(TZÏo¾ä/wÒ>¼†ÑXÒ9̲{a©M~oXì<ÂÇ™­Žö×ïk£i8¬ÜëlOFµ½v/Åë* üJ¤úÙ•œ×‹Ãq�]S_o6K�HÇ�ÉСC:Û…¯KƒHr×¾Á•¨‡1ö\0ëañ€3wL‚?xO v+èè7�ÎÁï�‚ÏŸ€÷Ü]uú 1øFÄ �=é‚\?ßïÀìW·¾m¯¦s÷Ù5 Ü�S€ØÚ.Øäú%&‘¨-S²1…\¥·ým•úŸÆámÈ`”ŸË¿ºJŠîWi&ÅÂîñõÃñoŸ5(ÎýñPF“0/Äú·æs’V௸à°X‡Wa[lÁüþÁ6Zg7Y4ªçÛ„ln“a?Éþ›óãµùªå”Ÿ¿œ"¬m„&{í¶|D>§Ð!*£Y’zM¹NM1'¬—yíþLèÚÍ’x³AÚØ>Yª›P%ú£�À¦IÓnÅLՔÆü™L ÈåSrv¤Ž³s÷À+¥ ’~ÚŸ몊âËyD܃y©¸:l èIaï+ ò¿ß¿~ü¿“"æÇ;o~®ä¹È^vKSÏ2ÉôÛÔ'óö–úÇ–qž±NrÇ€å�ãžûXÃ-µx¼}È¿ÝÞơݾIƒ" •LgB‰'áÑ‘`ì7û›ÀÇIbö¾My[¦º¡e¤�N-�|œÇ.º} °GÇYnrZ�€D6zOùüû÷ïÁ„9 »šk¹ší4ÇáZ°M,†‹X� IŒÜ‚aï¬3ƒÊÈÓ³®>η†òÂï?ðAkEn¯ïë£Ô*È0}Ò<�Ī�†ÄZ³-뿨9®fA¾Ó�ÃH¹´µ:~Õbê«‚““°\ñ…ÜÑ6�Tk uù9-kUœq´µ¹bïöE\�¬Ù ±ùë8Siý�s|\–ÛKjXàÅ îZáÞGź}´1×ÑíV|Ê™/27¡z;�7Ì´Þ™÷ÍÐw ÀcÍÔÃ䨰[)‰U¦ mæª)ìrü;l°Ïœ‹�C[fºÚþ$H3C®ñ†ÊïßÝ=ÏŸf\ê9}ïÍIg=x.bµêøf¹ ‚ yP/~ߪá¥ðãõßǰàv?qûvjÕuÅÿBTõuÜ÷ åjaº=E W«Â´öN5¼‘Ç\.$3PÁZ/”´£†é6 ÿ.½l_Þ&þÁ¢4ÝK75º™µ+¸^Ç/PÐ[6Ò%ߘ#Üè>ž† L6¦hÜe=Û«�âŸ#.lŽ g#›k„Òƒ|4kÑKOÔ�Å;Îhî Of#¿'š¹…«‡²Lo`­†ÝÑž’ãéÒwyT—ÖvŠÖF¾�‹ÂÞCï²àw#Ç�Œ=�ÚÑ»‡ ™a¿}sñ›ß™æë_‰Ý KŸ‚ÒxK¬ý-G¢ cB¤îŒ•4ˆ†1¤¹Î Ì¯vkœèn�ÑÝ�^21x–ØÛ+ªÌèðÃæÄ3Mš1•ˤKaxÌ6™Þȱo?Ѓ±Þñ!…Ìa5 œF÷Íß:»\�š5°™FEÅ ZG—ªŽ}*s܃œƒƒsˆ oWjïUÔ°ËE³UÐHŠvXŒ˜ºïßC…µ& jÚæÕ½BCƒ8q¬þ¾ÅÎîÖÀS¾@—{f¡éÚŽHi»ËÅÿÅ@*´%å®Y•įы~/0Þ‘µLî ÞíÙÓ¢“òðÊiõk>?_®�o˜Y`£:ÙµšOA0¡QáA¿Ns¨;tóÍGxÍQ#F“¹½c ^ÒÙ¸R²(ζÀk,ÍU¸K™ˆÅ=áZûÆádq­$Ø�ÀüxPúìr·iÀn<ë]æ< øß«%®T¬Äö:",flÛrñÆ‘Ë;kÚáxTÁuµÈæi¿rx™ÞMÍ–XÊl•‘;>õ¥ÌY_ŽfQ€‚9²‰ ÇW†n±^Úß_¨Rçu;mé,Tô!ñú�½5:‰ž�1},"É ÑÐrתà5 J¿g)×Ðiõ¤ïbÂõœ>Î:[Œh6޵§ËàgÏ+ÙÖõ̇.y¶Ûaë÷:˜„ÃÛ”6a7ÁäBuTóØÖRóÚQxè‡Jß}½?W±±6Ûʸr·'Z}ذí¡ûܰêñéÉ Ð@7u·ÓìÙá‚o4EŽ:¿ÕÙ[u¾Üc`?uç½.`¸É]LÄþ¹6r€^ÎÏxºÚ•¦àe,>5°Õ¢À°’¾Íe\–ÂÉ&^S7¶]ùf$ ¿Î©ìd@ü™¹8-Wwô?8”“±Ôºº€ÈXÖ»�Ë®LÜ�µœ¦*{Ÿ’„a ,æÊRûù¸§6Úa%r.7½ñÞòø•ÁúkÀ§Þ”K;t/—K;«/W2fÉô@«¼Øo·½gÖ<õ:³<{ð»’Ì׺CDG²Rk<„òú²ß2Ú&+OxµÍíñ¬Å¿½¹…{}8./J¡ÇSúÓ8 >¶xæs’¶õfùŒx~síU×û H®e—+w¯´'ËE�BK°¹Øù8Âê•[ŵ¯3UðC>|¤kñXPÝx»Ýÿ€Ó˜ŽxaÛvïý­P7Ë¿²Åö¿3`VÖP)Y)Á¿³\�<¶žè•¶Ñ-¤»šeàÀÀñty¶s“”¡¼?{�GÌ{™&ú®¼Éû¼å¾#ýöÇT´#U-(ü&;éÛàË#pR&4#8úæ¤wë䢄2ã< ›‘;ºg Mñ,âê».FêR#pòZö—6Ÿ�>d¾PØ%<ù°û\Þ¾;ÁؾFˆ’ècT±¥ Ĩ+# JýÛ\±n{¸ÝÉëØzÙ=oA¥ßÛÊÿP:rή–äDvØÍ„ÞÞ¾çÕ¾4ýw©é…�Žs•L†']¥¶K,Ó1®&qdYûf\XÆD˜m@À€àæäSK…G¨s"ýÊD5W DòMpB¿ú¤z+}Kâh- ¡JŸ­8W,ð¿c^@0 ÄY²û1¸Z¸t–·¶mšèòsÌÅÍ~Ìÿw2¡\‰Ò^ØC…Ý@ gÄqõåÂÚ:¤´nuo†�²~€JÄÙi¸rç –áßë1ŽvçåYÛkªÑƒ·(ÂÿžÁŒÓäa+Ò˜û;šØ8Jêì"…| ¨�Ó2)‘[:0¶Î"ŽÙã`1x"|é�GDZ¢*Zgš«èž¯H%ýÞ¥YÀ�âJêyŸYµö›âx‚>ãQ½k~¶ñÌß›ÑmÑ5Ã}ÖdÝ€Õ”:Dšß5Æ2Ûvˆ‡ÎÃM¬å¬d#®þøðÅÀðÑï^ëš=R /ïˇ'2Ã1‹l�‰BœÜÒ†Ú§‹H0™~;\ Ûtk¶Ä&s–C¶¢,‚JÄÈéLhê4.ëvÀ6x)O½Ò†Žïœóñ#qù?ªT qNЬËÜè®2k�Eo]š…\=_m«;LàfÎÖÙ†;ì„�£zÙ^Z¨¬YZ_ƒOGÐîáÉS;PkVä¬GÊ�_vχü�«÷"eC8Ç¡àH(ýá13LLc*.%Vè…‹…“+¾�¾µ�„fÈR”­ïüŸK^¨«¼çÞò_âm§öìƒßÅZ÷Ów‘¥aúoò‡CŸ¾ï•7܆Çtò@Þ4‚usÚ¹럱”dl„åèp%ˆ,‚ïéÖS.¨ ̸6øD¶yå¯x>Õ1|³Tâ)p‚ó‡�JÝ?!p ‚±{3ÌZìá3à<§êŽ?7RÁ �Û¼ùÎW­�c+æ'%‹‡<|3¼;N¾éçÐL¹¶Í�2¿‡ ÓâªüM ¬ £n°�%=à“¬x÷žv‘³zÐÞÕfê˜íìA¿‰¸pàr‰âÀÁZ¢Yÿs»¶¿‹–Bp;_¬|·Öàù Enà\=ú o=W ÕÙ ÓmÞµœÚx[汨ڼh!€¶×»¦»j @#_äïhÇ’(�‚EbGË=~fAènÒÖűs·âM±�žA�€—ì5ïm4g}à¨)Ôî€/0·D¢ˆ)*ÃæX ‘ç\ªý–Z@l§x¢ì8´GD2Û8Èl†LrÙÙWGAOÍ r5™™v;ÙÊ/�„ãµ!TûéweÙxo/� Aœ;òz —6ëOûöVè õbÓ-@p^Ø3ôöçôS¿/e+û—´ÈÄïj!a|CÝ»hÙìöLåÞ(oL²~Xý:oæÐ69Dà!$òÛÉ.ïaE�m¾…Öž’ø�ovA, Å…VׄÔ*ç¬ÜÇAÃ잉šfÀ³~µÄ:fÅÈ7/yE�úe¿g˜ëÕŒ‡Ñ `{Ë›£ÏtsÓ&Âk]ŽÝõ¢&ǰôÍ´ÜŽ ݹ,j%ÄÁê R.¾œ±óqÅxWИ§â âkÅ…8Œež†Ž�mºêE˜�Õ4Âx �™ŽÙ’It؃ï¹Ô¯™«�3{ÕXhì» À(^n”x"à$Fq(Þo:×*çÚ¼^…[žÝUos¬sBE¥G×µ‰1 ]Å­rJÇGQ½á†Ö̺oIõ`ÛW+^ŽÛÌüéÕ07u„8G[V6cO¾,¼Ê£¼H9jûæP…¢z…xØ`6,Ž«p=©©è1÷{�"&�c9sv;»›½s"O² Ö£ìüý:‘ИüO:¸pa1}ñWå=v�àUbõ�¬tÉ&‘eb¸!ß;vÒ°ÅŽ…N\‘ý—7ƒ‹‚œ¼Fç�•%�ص}ó1渰ÜX‘°oÝÈ�’ íIªp0u–;ùzŒwLnhü8ŒÀôÃ�ÛHÚ¨Û¬G¦èxËAþÖ¸�€u LY°CÔpõû־€?TÑý!ŒÛSŽŠtUyî_1�LèÈ…pýÂÛäÛNî ÷‰0â×Sd}~o×ÎÔ¦ý^h¾ÆÈ›�ÊÃTãáØ‡ñ¾t™ ®ŠŠ\!�«\@=>ü’ê×H�),G™�Ë Æ×üE¿Š`‡¢c¡£³8ŒæÃê÷P@jt¯ñuÜËѧ!°§ w\‚ÆU~èu˜ «;\�ßu¦‡«2©4mÎO)õ‚ÀqÕTá_H%Ìˋ߅lâ ýTÒéad€t¯ À@_¬iY”î°SŽ3ž íG¹73B:°æl,¼³¾¬bÖžoc—iµ¡F.„F šã8ä‚n ½¶ÆëüÖ ¾ æñ¦cuî¥r”áÄvúí4»ø† ˜¯éíé‚Ä\=\×¼yˆ‰Ê5†î"†*t$ ”zzj×íÖø{þ‹ÕœÓF e U̇d0œR_“K¢�ÍÁG5Ô”'ý3&lNù»¶3œsw¸JÄרÓãÕ£#ÐýÜsHOSªO?0’¦wsçÍøÅþí ‘`‡žRƱ:�©*mî÷¨g ¬¥¶8Ñé?TÀP"*šò³¶ð}�9:•Zå=ÞÕ¹©M±ìW#‚ç­·Heëµ®& K@Y2LnÀU‹‚Yź®ˆ¥©”;ƒ2T¬\�djÁnõz÷!¾×lÀxæÏœM×¹˜¾kxvà`¢ ‰l 7¼¡ÒÛSÐõçR|”¿9”ÀÐ'ÈUømñ0zx2z‰{~ñÝ¥Þ¸ï�uüÆ�EaÙlH†ƒ×V¿+I‹È^ÖÅÿ_(æ2©ù°ý%+†N�B€§ ðÿ@¹›u@ºúHØ;Ó>A�˜º(NvN¥—@Wa@:‹k*Ó’YæsV(I| hœTòf,4D¦Ek™iD/�ú–ó„Ì5°`õnŘ2R9L GAy7º‚0Òom±o_Ìíô5�]ZXËPû,Ÿ Gc³u~¤Ùäz³?oÀÆ`�“kþ£tlj-*.ÖblKOÛT ¯ÏÅ YIÉøï¤åÚäSn*Ÿhî›²Þ ”B=åaàÙ™K £J¼8\4m(þ³Ï–Ûš¬zû€‹õ¨~tu·ÇôgZ™ùŠ+)äK3HuîÁ÷Í÷Ôÿf޳^w˜c븇r¨ÿœ¥–Ú7u©ËÅÉU¥É‚ÆzGn•¹|�¾z¥‹ƒ7lm&1í�¥¹¶f”‘ò`òE¥³ûâowÕ»*a+@4ø_|7Ü£{dnes_NOAÆFÞ²¾¼¼T�‹ Q5�ÉÇ+{ªX€eÃøž&#ºôÀ�G8b eL¨ÐYúµ Ã"§¸ [ŠÛ€Î{ Ü”r¥ãXúl¿Ÿ7]Çmli¯äjÁˆ-ÎþSòuJØh×"@Â~]¯*×·ø÷ˆ¹ÄŽ›™´Ý�þî,ð=&âÞB+Á„š~ms:Q.ü�êx,‘a®Å�X oŒ`uð+XQ LÀZ&�þðà__SÇ#Î�Þ®ªd=[À÷"òÜìÙ/'± À_4®šXϹ>«Hmïu÷wm™¸ðfÛÓÄà“,X‚èô tÈdj$KwßIðôî]*üøì1_ ÿ²˜$u1·<9:.Õ±s;q‚\+X ¦Ë8IÇjæMï‚òýÎ[iêvþ€aª‰‡Iœ ~µ�ïÓA›ý?9`[‘[²$èŸÃÒŸÔH§Gó©Öþàƒr�—»ƒƒªÛ2(r-ã¬>‡¸+À´Vw¼MÆwàêQÇcÛÕ¥›Ývº"Y`ˆŒ²½\޹̗€ÅFÇžüŸ°]$©ö³4ß}™ ñô ²ç�µ"cÁöí1ð†9�A×Ç ¥„ø¦ý+¸ àšà!òv ®`V òÜ˼W±] lÚXö½IÚàLp¹7É—*‹%¯Áûð~ßì?ïÖüû÷ïÁÀÇÂ*í“cÓ¼¿s…N íVbéÌ  (òçóËd2"–‚vì9öú‡³Ñ÷5ʼn»�£"¦D­òÊ…^âÊŽG8[_¢´fv#ùI¬mñXBlϵ(Çõóla©Ï4ç8 kòÁ»±Ê¡°rs8øž½DÀήÌ6C–Åï5ÖÂFæ:øÚ8œÆÁ•þ|ûÆ»ìÒ7—‚·�~QÂ?-Íld² Zõ=3æ[[ËQVÊöÀbgÊ,»ÍŸñ Ä‹ÜEo8í5'æ]qO §¸¶[”Å AK6¢¸«…UT¢¹K®Îrøº2%m(q<¹603Y`�­ë»&V\,Âð]XSÃ{!øÏŽG…žl4€�†·â¼SÈ5€\ñ{›ø^Ìeçê�±‘üÉ9ÅÀ¥…pÔ¤ZÎHÒsÞšbÖÈеà†µjÒ°á³s¦5›%ÎZÖZÙP¼IàÒLêÛÆÚÓG8ÕˆŒË{g%ùŸ˜ê”H¹w|”yXÇ5ÍŰ‹eÅ9ß¹fëÀa’ÈV¬�™ˆ‡a¯;\§zŒÈ,M ïd\|SèF!R®y°ùøB"±¦ÎýpFL�µ‰#Óh�ÓDt¼îÆòè|ô_XßF­‘žíÄÙØ°  šu°=ØGnÇBVíÐÃT&‚•šŸl2½`n2ö·Ýk®;íw Ø›ÛV^œhJ©�n&Ô–ƒU*#2É\oÛò3ÛÖ}6«\Àæiœ.]±b“P+�ØùÌò]„m™¯ +ÛuÂö‚gãeƒcÍLcv¶"ɲ²†mfy]ö\bÐÚE!0¾�¤î¶ÈCÕŠ¨òXaˆ¶Gªà�õIîƒ6”>2>ÞòyÓ¶ùg„À*Ýí ‹*¤ÜPÌ@ÓáMI?«w”½DZGsÕ®ïúûÔàÖ‹ Ís\ÊRÚ Ú/†?R¾ý•­08F3Y1ÛáÝÌgPë®EÒrYe)tâ¾qY°ÆK&ÀÁ;Üé1ŒU›Fãéd– X3œ,õóµë¬–� ñµ˜¶÷n. vÍ•W½B“€ø6SÀgÀǸ�ß }ÞÜ·ìëéÙ³‘5’àOOœ*Öw+û;ùw’á™íÐãA­qr¯ÆŠÄ¼j2yÊpç/„joóά£lÙºz½¼ÝºÿàßZ>Ù¥ˆX®²g¹%p…^ 9gÐEkɳQ~ænDÄ�Úf®z”´³.lÿ5�§©©r.!Vlƒ&;Fv <¨U¡êŽÍ¶Rµ"ƒsÌ ¡ØBêÒÚˆ¸æ­$’ʉNV52$îoùÝÖ07Ô;Þók¼¹mèCO)np',nNAtÃá$¬z×Eà©Þ,õô�}oõåëùK›ëyâ8½-¾Íÿ£'è¿‚´k|>_À€”‹%¬pc� {ÌZ+(BÛ°/l«;>³Hg(%úÎüŠ:·¯àm ŠšÀce†¶Oñå,4�Vƒ�Ì•óaw¡%¼¯2ÁlÏ‚õ\Q‡8×Çà¼æ/ÆH]ægÙhº¼ ~«ø�FV÷½Ñ¹ÐùàËFíÁ™.ên âo X_j#�SÅ­‡½® g5%„´U/R°`óO¸ ã£áH|¶ ÍoÛÐÖMtÝ­ ÚÍ~´`$.#TÄ©Ð>ªjæ&ÃèPnÌô5lï£Êo|nûy®RX“_õ9L_W½(Ž|Ù|”aíVœïâÛg*X7Â6ÜÞÎ?»¹‡}§·°çy‹¤Ýâ´ �W „ÆGŒ…é¸M²Eµ“ß=´ûݰ~÷z…�ΟåS#†ÓD\0w‡Õ5;¡¸à—ÕaÊ㋽0pgDàÑ;±†ôž©�èôÛÐ:vÌO‘�4iG‹¿Ö€æòfoÙvöÑ2å`¶š—9ô©u«ý91õˆ­>ƒ5±&}» ÐÁ†CV-TÆTB4¨3ä!†*Å3f·D'¢�w˜œ4V:mxˆxXçpå@½$Å/äãYZ±#C›1B?ØŽsòˆ_s ÎÃÁ,x>pvÔí‹L¥Ûòt3ÐÈ äòÉS{ÚC[ðż/J»¾îÜ–‡Y~�ã@»º[CÀ¾�{Q¢V›ôØñ²`li] =ˆbMÜw´ =-ò¸d# Þ{7gÞZã ››¾ÜÎý9§Y¶ÔžÙ,ðW¡ÝuëE¡f½²÷Ú'×'?X;Qû¶v«g’R¡§æÇ½Ýcì…=M¡6¦I”ѧ¹)Á8%+ Yì)g·-}±+áYó¦s6mŒEý`M• ¢»N‘fHU�ÅŒuO•Õ¿_0BÂ'¹ i ý÷.áðM…:áîíÓ:’% r×Í9øªÍJã…æ±ñ\4Õ'ì° †*/g]ßõGG\½<ð,å²1@û¾…�1Í·bÇp$ùðò°ž'{KŠ()Ó-.&)"¡m(¶›MÓPl€bvÖ«\t¥EïÏ‚à.tM[³¢ëæ.–¢Ø2Ú÷žÍ#’=¯°’Æ�×™îýKúX[»\XPÜÿ*LmÝà��½£�‡0À6\Pž¬mM䶴Ц[{3vïÃ(‰a%bËlf«lý®!7›<]B5ܧÍ ãÔG±ÓXà Œ·ÀÇogQ¸iý¢@8Íë„&óB1ih?�mí\ý_pPáûtpÜOØ"ÈýdXïl¥ÒûâÏg¥�Y¯]çÞ1h¸âê=›cÁ ÷Ó7<š}ݺMnBtç¹ÜæíðXOÛÅ _|æÄSí¯sn¼=(þ][Ð >Ð'ª`zuš^™Âlt“\­Xo•kØ“šÖæH-ÌÆû‡å¬ÐsS‚5x¶ikXP¯�9o½ïÒûë4Í* ^„,7žWKˆ6O´Ÿ;.oÄÓeŒ&Ûm$l*ž`³«•|0…ûò÷³ÏÔZÎܪݖœó€¡|ýñx>-,ŸÁß·¸_ÃæfðpŒüÉ*.¯ö«ÞÔî��+vÚ° ©A‡¬ �+°\i›0 ]÷—&�>º½kÉ)yS¾9R§ä�Ž95lâDºü±Ì9½·:³Ûòm«¹ºGÖ�! [|£VÑY£9æG¿¬øxÌlí™>‡˜0öJ~ho·GŽyFIÔ |pÁØ#VrΆƒ÷àýø4|WÈCKïÏÍ–¡· ÃÑâì¨W[5µŒÌý‚{äÖËØnæ:Ý4ó¦yäña «¯c«ëqf±gºi îz[½A³™zåÐÐÍŽ6?™›~h¶—Hî Ï—Z‚Á )ïyØN&Ä~ùcvò‰ÔËößµ_f~ùËê²À•©tÜèØjˆƒä½>ËînÓì†GŽÁ¢æ=Þ¨�1´¨kªð×_ý„œuõg'üà‚�í�Í ÿK§=Û$k·µhéØm92�|Ä7Cè"pÛå.ún\q7ÞK¢[pô[qÂÌ�9eÔ r!�ô 7haÈ2A”»;‘.¹²Õgåœ,;àn_o'b\„‚qÀå·”·Ï@Ec,ÛfI—“»¿%øâÚœ!2»œ@`‹Æ`ì¢OúÊ™Á«A©‹ˆ‚òÔ˜”2Ø?=öŸå ¡ÉˆÆø§ß*kÎIÛ8"V½R•çÆuÀ„¤ÀA¸v5‡$¿¹‘KCZÁ£¸7”ÂËÔ Ó‡- ÀdÚ”ÈþÚ°^œµ³2§½ÃÁI*á‘îN‰9m†ßKc#i…è7�—�Gl®Bµ‚°TåœM/·²E—g�þ•g'�ŸÖûpðXï±`u Î=�”øŽ{eµçF :ï1Å <`ø¡×„b.•k®rÿ/ �ü6µ™(ûŹ~¾·($ñ¼nžq»è܃kÚäàgxÊ¥�9uÝ=²[ Nfò�@à¨t�Wjå=Ø–ä)±>: ß�1¼?í œòñoÒ;mí ð¼Le jYŒì”ª×»ç^^–²Äâª:�pÊì6oŒ ¹®8…§ 8¶`W4¼I’¤â5< ‘áñܤÊËg—@¼Îvv +bE9ë¶æz®ôý›ªÆ€§½ß4{sÛfD"*£:&~ák9WÌpè<–8eY_¨©<`²*u*2v ¶è(0²^:п9ÚT ºlú¬Ä$°9Ð+N51J!Õ~Õ—EÄAP¬D�·p⥆£Û马*$Ó«Avìï‹W›œ­ð�C:m}&m†wé=oƒÍjÚ^Œ÷h¯]ÏÃIö““îL¶×äïÛõ ö]·Ó œð¦ L³Ü(uÊIVûÃa°·`?ºl‡Ò3ÅkÕì÷…šùß$ëvh"Ù†ŒT èKdõ—�xt·Ü=-Ú1‡˜‚p™"U-K£ÖÝ%r×R 5áàÉßd ]±çÅDŒ“hj#¾“r4mgE÷N_jÆã„º¸ÈÊsWŒâÍ­b³¾öõÇ€ý°3¼—ãì6ÖŤñ<Ó§ºÌã êc¸`Ä[-¤ö@¤«v`Ža�OÓÝcLBÉ‘ÄdÐd5çÚ©pÜ$RàJ;-¤°^J»¿ÖÕšùóÏ5ˣԡëŸË ÔWC 01”gÑ­–æ(¹ž°6¿—|î×2•S…9·tý¿)õ‡>ß:\ZP0akÊ|Ú»Žä5£>.…âüÞÉ¿WƹHþ!­ ÿ+m§8ï»~‡3¯œ†öÇÜ f*aÑÇò�[l�à.΂ͱºÚeåãoKݬ�G¨Ö=?ÊyQ]©ø$×ÕÒŒéæ@ö¢˜ÒäTë�NåI¯4�Þlë£ìØ_~œÖ‡5§š9’Î�Šúõf±N?"ø9zŽ3ð² Ö+7Œm¼>(¡˜j­ �FÖ$À¢,S«´¢¦Áþl+~éÞ“n·ÀÖmŸZh—•KUöÀº�Ü/±¼d,väÇ£VH›�Sý!ž*Œ ôùlEO¯ÑwÒÁîÎ5°•´Ñç×W\tnïF�(E=âö^#G>óïÍŸN¼AtµÔ66búªô»ÒŸîf­Å,z”¬Ÿ3ô'7 Î’½±;Èk9.)r´#½Ü)ñ‡Æq½Á ’µ¨å~ÞØ+•Ýs9 !IõÒÛåA:Ê ñðûlµi©ŸKüKÊÄÚÕ¤j~Ù_Úf}õýú¶×�>,jʞƳÑÕ£6µáæÁxéñ­ëRÀ'Ù†¤nÉ„g°Ø� )ªJÑ9ƪ¬|&~_"˜uVh7ÃBtî[ÎCÃøû¾7!耊eak(wy ÷ köˆ•:o«Ù$hV]ù¾Ýް±u\Ü÷•Pл Cˆ^RÉ�Ä‚:’-¶L‰ÆLkI+Š ÙÛ Û3x“ü9ý­.ìíÙ¿‹Ìž�UM‚aÍ—ºË¾�ot“TÑc²Ù[‰‰õ·„Ç!¦ÞŸ�»$Ê Ëà€÷®yÕsk ׃9sÀ„"¼5¡5»Î³ @¼{¥ |xÆ2ÄÖÙŽôb `'˜Y:²Êä'v­—níkg2åË[1ö¨o¡³¿#z „,™4È£;Þ»#LÅv°²L^Vg  ¡EEº¬;sßÏœp,Ípµ‹c#B Z‰|D\‹y«òTÖ÷CŽÖع}Q(¢doÝV1ì'J€ \ žgL ’‚u¬!CVTìpy;Aq…`È�Æ’¬��«îSK-ýËPdË¿Co³Æ=uhÔ­{ >­ŒNtÖCɶíúýsøþ4å륡°¿vÂ�ÝæWv{sev+Ä |Æê(Ž|Vòâñkkê 2ýâ¸~"•-_Qô¨”/˜o‡üéV@3M“_06­¨V¥T3¥L’þ»l‚2»C¸ÆÊªoY‰‡á&&¤’Œn>‹�´pòzÊω¾øŽ=;;÷¸r*ÃÝ5Ìl‡Ø…öXä›it +æ×ó‰�±{.-Wç‰ÿd€cÀ3#�D n>3Îjg-’Ç”[k…2~>•Ö<™ Gp*ki… À«Ýù}§¦@â©2Ûo–wÐu�´®è_!é"pî=`_pW °V¡QµØ›Xš$bh¨}͘tÖÀâ4Á8ÒùçP¤X{wY¨œ† ú ~z ȨF›MvPÙ!ùyåv”U[Ui[ó¦^ì¬ï$F9ˆ\s|¬ýîý¾¤{‰)Öââù-(û¹Ø_UøcNÛMœVbô÷åÑõ½ÅÜ÷…à·‰‡¯/½Ðìš_‡¾e³lØÀ²Š©ë[¯¨ÊÓ¥Z J­e©iMM pß’ÿ4ŠˆrâW´ :Ží!´Z]ÝÚî7ÑÈÞœFL�Ýù8Þq¦bÈÖ�, NË̳TmVolí ¾�Ɇ9‘ A` ÕoC–ß0$: E�’TC ðw! ›1÷@ÚXÞãL¬ 6Kì¦,­g ›Ë8hµ÷ ¾°†b|“4m¿“äÝô ÏBf%žÂØÕÉ*PhÓuÐn¹¿ëÀ>ðHl™1bÁ+ g¸[Cnc’瓘�‹Î~¢É„{ÚgÑOjû#°`&‹‰›/1Ú´ÈiSTÕ�_Wt�dµîÚ �%,ëS~çÀ¸…HŠ}ÜÍXDÁkk(9Û{~y/n'~÷2…ê|À.1KpùÛåÅ"Àh¨üý-~ÂêCuA,²éîÝ¡Ûìq+lm“Ïk®ÅÖ0º({‰O±[¬Ìᤡ°lÅ{—ÛW›LW¿ õûxô⹑gä²7Nk"ªÖ;-Ž»4ÁƒxËWŒ³êD£ç�!p3ä-«Î^é.mà�X‡_=±YÏ/g„ðŠÜFœÃNÊ¥eåïõã;Î3°î•ý9\¢ƒ†hH¡E é«v€WH4”Dj! ê’–WºCÙbƒlHràz·6ŽPÛ²d« eùòœ³*|×K¿i¡ŒnLØráò0/”�©±â‘û Yö¬yøö7Þøä3øK_ë)NÛеP�y°ï¦b…ËùüöÂ�G3ò(aõðxÞ›„Äo´çx5¯k7ަÈz™­…<¡v'KL;ð!tÕœ­ÔHñ•˜Lý7žã»�¬8�áûªœŸÎ�Üw€5€®GC4g8T†á¡1‰ÞÒní—VÕ“‘æáœFk�ÁÊ­¾€af íl"µ&®<«âê@¢tå¿T*ƒFÍG6;â˜û¬^DDA# 2ƒ³�¨R L2b7ÑÀ°·¾å1`tXÝîn0GSñ.eù»}a¦È½è°�}¤Ý�Ex¸�`8Ýœ 4œ éšÙ!ÆSޱû›–´/W˜¶·ÛŽiú KðÒ}äòùæo7ûSÚÄj,‡¡Ü—Á7Í`nñJ¬éþ^ñls1„ ‚¤w7ØÍtoalÞåte†·—µ;¯r–sMìdœ= �OAÿhoL{/è9K•ã¦1�ç;‡èkãzÒݰmë×óª¹H?ÊÜaÙ6"Þœâ-³”Ђ­zC]Ù·ÉTcê_îÇ”‹÷Ky ”„+ã±ð8uYôq‰#˜°&ˆDZfÈ“Q¸¯lؽ˜KÂ÷z�Ÿí‡qÕ6Cr¥mœà—(Ø(±ØrD,ºD]m›äKÞdªÍ‹ÍÁ{\WC×Ú°ùÌÜnaœ6}¢¥z–5ÈÍžŽåæ ÖkVøÚ3‡ÑÙÔ¨.«+•°‚=_B®� ³kézSRºŸ•QÈõs�a4Nâ0ƒoa—¿GësÀÁÞp½ôýIÏ€wÄt0c€Òp”-mØ îx¸œìâ»FÎcSäù-Í8HUú½ïgᘸWØ[ €*KØÌî>97Ë_ +&yžT`ÆãÛóµ{‚Ã5ðﻵ˜êãN‚6–41`Zü°c—Q;<ÏÙfd/«)-ú;k†ç|굊ûÝi†Ïsج†¶õÞØ5Í-)ëe?¢î°oþg—0„åõnÐc€ðÅÂG¢—0Þú $¤AÂȪ¡¢ñ¸Gæ’Ë´'G84<G7¿³<É÷¦{Pà_*œlÜ�{{-3¹:âfÝㆾwH7£a¶�ë«Ð�ûy ï)=%QRþr 3çóf Wa8QÕ>äÃ*³h‡{©Ú'¼Übú¶‚×sÔBd9½f5�Õ‡j6($)v�ŸE¤pŽSX±ïîÞ÷=1’òä«BÑ:±UCè~#;ÿxæ¢Í~–¦[›ƒ]Ü0œðÂJt¼øÒU¡“‘:Î_$¹µ^é�†4¥3„^›·ê 53B<Êy»¢@óÜ”@öè^šmúÞ`ðØ×H[/?'Ì|¡(㢠ŽÈ“Zní‡[[n­¸.¢2³Ú�”üòò8zÇAïn:Ö3âÚ¾%}®‡+²É¾Í›�È d‹ÆDzNM�yaáîJóÃ<Á%Z]*ž÷JΰúqýæK惺¥¶ý–ÈþSsa‚':2º r`ùr€†³ tƒLiÜŸCí9ãÒ¥.0 pK¸#öÎÔÖ}p$nx §PKÙ´Ã-ÓŒ�Ž�-�³4D¾ÀíÉÖR$5|\„1Ý®k4E$brܾ]�Èìu: Ä® Qoa¾Rnð~ש 6­x»ŸÚarÊAãìÚú_€È9ØHÁ\Û9rÌ»zGáóÄËH( g1T ç„h ÅÚ/ŸH »Õ¾ÑZÛÏV.Â*_qŸ …ù)ˆµû¡�‰a@g�;2õ\ÊÃÜ‹½ìr iñ@‡ZëðÄrßEúw¬œßm o”¦ü¸†ß—Xwç,¬¯° ¿%xú2¯v6Ù>TËÝŒàÔòÖ‡ì™nzÁlZ@÷dk%qÄ™ÕöIÑæ74,IjWøáÞƒ°4ƒ ÈÃ\Eç“TOzÒB~€ü”õµÏPÙ�OçnAhù?÷ÆÛêÒxF–å¬i��&îâþ�:‚Ž›èÖ¢Õ┄)©ìµK í=Ð,ÉJ€Ðß>FGäשGÁÜIJ'‰÷—!ë�õ¢>Ûõ�Œ�ËÔO°¹Ï'*W˜=0×D-1„Q¸›náÐZÏÕÌ�ˈ2<Ü0ê aŒ© “�‚ymÄíó£ûyâ~Ö37dá7˶™  Ý$÷i‡:8så=ó>I ccÞß_a–váHçÑ©?"å Ö2(˜o-ç#hh�wЦt„E²(Ý›eYÍ ^Hñræe�Ÿ`ˆÒ€{¼ÝB�·ûpx½ÿ)zÞÝDéýë�Iì:nÉ•†–bï?xQ¯žfeÆÖŸEÞ®ò ¿âøí[ÁÁ»(Xþ'Íä1–-#ðê0G8Ä"Ó”«Æ4sM“|X_=ê çÓI À�M¡°ÅÌ ­Å÷ô�ÁÎ,ö› \˜NÁu`+Ÿ‹|Ëz 6Ýçû­ÚnßZÀÖÛ ua¡ lÞPíFÛ1ØþÊ"¨vÇL¦/5kjÙúk)Ö›¢dÖ¾_;Ú/´tªr±²ðí;õê<2ÔeIkc%n †,ë Øà›¥ÅC½ŽïÓªpçc'ã,ÜòªúT< ‹I‡XܱwúÖkÍëíìýëº>ôõe¸Ù~×›U*:dŠZ!,—Ò\ž�³%ÛÍËk¦™Ì¸bõ¾ÛîÍ¿m‘Å€–¥è3‹8†–ó/X¸Ÿ©xB†ûÈŸÌÎæËo“îP3 …{Ø„N é»­‚6G;aÎÉðáVåíô¹·oi„’ ~ÞŒÿ<ú=v”u�‹¹ôÕÈzf¢föév=õ ÿÅßâ î ÍÿL±/jÛ=Ý 9Êü¦�™Î™}±£‡‘Ôóó£lrÈö™Í<à‚ ;WÌÂGÄÒìi�‡–Ý_–ÖŽ5�FÔn8wÞ0ª®º÷hX‚ÛõöÞÝÄ ïvô£4ð師õR×ã_:Q¥‹ v­# ì”"ÁE»†¤ÃKø fso%(¾„#ÇNQrñõÚ�Õ‹—úî’ñÆ‘@÷¾öó€î$_ây›ó«¨Ì–”45 ;íX�mõžD[íkõ[7i*Ý,èl²{K%"\E1Kô}½Zm`S¤ŠÒ9螀`TÐÆ«p'ʯÏÝ/bi{+(ë' 8¸ÛœÉ%V̰{;€…ÈÓö™vÄGVã¼Nð"o¦óEåin}b $½Y¾1Üå:×¶Á]›0bPõúôþ׃; ¸áM?m\¬¹ Í:Ek•¢†ñE9:MÐ%¦/;�D*,¡ãYù£u»‰Pžø ‡A�Ý;P#O¶ëžý«>x°dI¶Yá/§Ñ *©ŸW ÜŠÉ™/rF„x‹(9vI¯lKô¾µ«3Ç#³îJá$ñT�<ÚžÔÒ÷‘8 ø©ðs]­ü늤‚ømÓÙsee¸rX"P`ö×гÍÕlÿ‡úL!5£žI¼¬<[’Æ-pg£å˜–Ó�r@´¡TiÑ6J”�‡ä¿à P<©[DW w/$ð¼¼)n'ÔÅÄ—d#%æÄs­’÷YIÑdË#aýŸhh‰O4¯æ)>ñy ܺ]c3{dZ‰m2@¶ï,Œ� íëz﹯XÓ‚2qÏè î�é#[Œ ÿná%ˆÖ£ïä»%Îî—Kœ©5±©–�³¬¹“ÎåO(žG‘�fê1øqÞ(EþÕûÇ£“ÂÆÖvAˆrbVµeöW¸ �[ä�1÷¥$ˆ~0fæÕ¹+ú9ª¢(ûžÉ²\Ì>.æÝ–hø¶™g�Gµ‚\Râ�œe€¶.×`uxÕƒ� }W¡›|·™�½‚ˆ,f 7 «…ŒŽW‚;Õâ¹Ù�œ¿k,�ᶮ–Àì OZ²#Òý²=ˆa«bϪ(˹¼®B �¥ =úæ…­&òÈh¶ùõšå€ç¯q=ö¿HR(Y#´?X%"å×¼ûºö‰t›ì:\"a(Û‡Êe å+ýö3ÙÑ矰;ˆMjŒ¾TÒ˜àvÂgšÁY@zÜw<</Ínêÿ zãEÝuŒ&k–šó™g8è6H+&…‰ù,ÆGX‡U³D‰«*²×ŽfÂw ¼­€ìõ§�Û.€–R²“ sл Âö|>Wâµ"òÏäW[Bøq[nëÄ·½ÎG››£Î&%n#Ú„fÅ@½=±�N÷:¦bÎùq±£•t”€àí¤Ù^!ù<ï8:C…�ê1ÒH¼¹W¸¦Æ*Þ~¤[<ÁÓX õ¹ËBôo|boRhÒ s¬88þXÀs@rÑÜq¾ þ¶†¨Âþd½ 2©+ÌVe¦«Î��5ì€bK; ¡hä< 6È9$Üe³c=Ð.”fÂÿ>áÿRAR‚�¨`Ó8`¨Jd03ÃN•¡/Œ-è=óóÀõþîs{(ÚÚû«PÝJâbù ~í¦üe’ànà÷¾Ž„ù=ˆg¼À­Øø‘òñ“ƒsî"s|ʇš³�%kSÊ…�¼º\NIâûËc×{IâOE®xê‡ÀI«êÛ -~ù5òh*,cŒ&îÜÂ�’I¬ U OÁÛ®ªÍÕ[WÃìåý•âü5|WÍÜ7'ƒa1B–›ŠUôo߯io/¯¾áÕX:ÊÌWn E Å´Ë”šq3âò·¯†HªÁ´Ùs’k�É &ÛÛýN¥—€�D>ô໫¼û|Î9(DïÆ.§W\�%ö›ðéjúø¼_Ïù£yvùVí`<Ý©{œÐ¤à…ñ·Ôìé±#õcaðÒFhøeY¶,€o@B‚&H0¢à8ŸŒBðì7Ü™ üí ÙìÏŸ“Kñ…dž÷Ô-¬åJÍÚö˜Çg_�;…9¿Š•ë8äì¬D?™Ä±Èqz‹ðm—fÍ]qL“#AŸÛ]ºÛRצ´¶g™ö#áÀf¯H\#€2Úr—œäü­sȾ�—tÙëÜù6ü Yï¥Ì�ˆ6e\n¯3¥í¹fÅßåég:¬H%�m¥qµzw§ÕÂ{‡º‡�*�¹ÀßcØM`}¼¥¾ÙcgBØ6IßA„Cé'UEºëÛ¡ú\g-AŸ�‚ÆË(?,AävVbݵ—ZËlsdÛ¾Ÿà~Ê=Ên=,ã­P0|ÌeˆÉÏ­2»r�´®%VM®ÖÙýÝó²þ™H±­òWJÔ§Ñ� ã gB»—Q^ñ‹ñúÅÇ´2nQ0ip²\Iy9½f¦âË4bÓ§?÷ŠLû|M­�Àé‚ñÕ)1ÇT®Ý8n‹ª”VZ67�%uÙ`tA6z°B„Íë! �ŠcÎ`왯uW(|Ž2Àn$l. !V“ömˆÙæÓµžÅbÃ/÷Ûÿ ™—ê,‡ ë<—ò(8Ajl?q#ö\+ä­¾ð’´ë÷àÞŽÚéV°ìk_’U±Gíî¨Ò² ÷±<þ‚ðö{÷/8í_Éßs¬ŽZùÿ-¹R@2§fsóó¹á41`ûΕØ^êµç¶Ã;DÂ:ô>%r’×Êâ9dðZü¿'¶+×_“ÇPSs$¸v†Ál-Ôe0Ç`lßdŽMó�öš¾ë¨r”7Öd—áü)Y)?>m�|„Ç1^óÀ¨\c‚dW€… f ³Ož <ÅUÁ�ì× @#Šæë`X�›4SÓvy��÷détÚÒ%®w9&Og»0àCÄÚÖò®»kŽ…ìA'× {U]í†8 wÞ/UmƒÕ]Rò”õ˜ã´ì¬(…‹ƒÜØô¸Ž Ñ—‚׆g³�xìÇ›¡XC ÍŠu`_9ã Z`ÝWcôòÂ|½œÅêçCÍ'¡™—ÙØ>]fÇÏÊÛ+µY?ÞcÏPOF¡g ƒlv¶ƒ 7;wà¶T˜ßŸ ¸s[ ó[j±ÙnÖL½õ}àý iÌðW[p"Ø™>Ï�Ŏꪦ Þ=ßzìÁ*s`kF %ÜÆî9PçÌÖÏÏ IY¨Só@7~\®¢Ée ” �Ê–ˆJ’“v ìOéçLQw´».Í�&÷Æî¸B"bmåé†fý·@øâ*ùº®fÌ׳ã$˜À´+§={ŒÕõ‰¶N%?.T*p€½>'0»uÏmÏyÌZÕÛû¡�èϾt/ß¾_½ÕìÝ_Vá³îP"Àmûõøê+Ï?¿«ÛãëîÿºLÉ&yðäîIûŽŒßvo»'ƒ'Dó¯9Í'Ï—ä!„ H! dÌ’gƒúú{÷³úš_>{zæ~™NÄò{™ï�†Ã33$™ããùûõù÷ãë÷âM÷ó©¹ýûòj½^U¶£Ð~ cѲ__6/òb‹s 2¿¹·ÜÑ¥�àM ¨Í‹4âÇ'Úyªjó¾íÿ8~Âi5º]—1›x‘¿)1+!«|¯”ùNÖ/£ý?>cw,+€ì¿e³¦vÒGͳ~¾WžÎüšýûð:" ){�¹o0°á˜›ÝÑëæßn>ÎT¬å'+<$ÂåŠA63ÑM4|Æ\„‡;¸æ6ék&Á¼qm¾ÔÌ5bÀ—u`ÕF‰É‰Áº‰ =,÷Ç$1N¼Zbt<)Ý ¢\÷LfÅ‹^šx4¥}‰œcY\!ôZw©¨cvx›’ìéw{/nÔ–>9vÇ�½ØA:2\ ?\Ü-ã嵊�òÜì+0 ÿü!Aòt bß–½µªE!·�ïšõþÜg¤@D"uêâ{ÕcÔß'uGŒÄ®¡°nA‰×E½›ÂÖct4ÕÉÈïsf oFÖæóO+hà³€†ó‘À‚YéàÖ=̰XÀšV8÷º×›éBJ4Í�»ÆîlùÚo‹¡ìèƒkVÚ=+¿t ’¨Ìç†ìn&ä  ÃYø{žT“îUÛ3<ÁícÉáÕ‡}Œ™!­SžÚ¸ä@›’êÓì�´ LäBõl¤˜$lŸra"Á�ò§{U+I­µu›ú5³¿™ólŠ×¹P4�ic,(é9ž›XC^÷*ôV½’¶ì&qÞiÞ…8ª3/Ž<~YêÍn3Ô]uyÍIiò1ÓXÀ¬štóÙaÚ‚°qîd]Ômv縚ñžéºŒ&<ß— æêÀÀã #®Yî·ó—Rüºc3¢ãËà™,ðY)ýÖÃèÌé­]ë¼*àê+ h •C@�éHC§ö ,¥œ øóÒ5 ?5§°áuq½º‹HÔ—€Ï¨׿BùïŽ Ïw•'R^¾þS¡ O±Þ}½Ì=°sùLŽA”*‹�=D9KX×-͆6ÿzymx7Ëèõž ÙƼöï> :³,Võ²¢Å¼+äÞùhlÊ·£å0xüZö:›qç}¥ÍG±§¨]´� õ%ï½° õâ©ì\0 Xœµíî´-yã\þ�W½‰ÌÃ{Øþkƒ�FÐåsã,™¥uð¸®R$õ~t0~mädíøùºÚ87ÂnÀ7é»Þw{©†$âykN¾› ·WAŒ7Í—_Mû¼äÐ6åtû÷t÷ ͉ªºq|¢á‘ýB2Dž—$�ûB`êKÄsû(ì2¨|�à`´±0¤ÓVMm¡°ö�A±¸*R Õ)NÛryõ�bÆómFÙðÀïþô)ußÉz«~[¤uñ£Ôð5ƒØ^ëж]3d©^hJ‚ñå½Qgî¤Ð>ñŸ´P•¡ aêXÍ'€Õ*çfbØBöÑÖï«.íì©¡«¯&Š®Æ�ízUyWqÃÔtp ÞÙ>øíªÖÑöÜ6© òëŰ3X§|N¼u¡ � ŠˆE4Rø8%ÂÙ·ë¿Ï�µ¬W¿íž hÓU¶ªÝ‚mðRS¹Œ�ÕÕ¬tî¿!‚Y>²}€B˜~êÙçjúÙs/7Î9&÷…‹èF/Ñb 2‘ænX… µŽFh;Ûp÷"µ: ßòžà÷’°Žz\Ü6ïÚcP¹Þn‰pàý•Æ0ÏÆâsIJ¿�P;»ÁaI•ÊÕZÁû ÿU%Cé ìîI†67^⽇݃ —ä[;Êž“úÌÁf€‘ˆ¢Óæÿ "«1¦OûpÃ8ø0cËY0O«R;â�Ù`šÙ<àaÁh)„†[uE‚£@<¸dQ¡T‹× @0Ú†æx~൯‘¹û6IT¸.G@š7 u¾û2 ]¼ázþó Ã"»Õü�½×·®}¹OÊÛ@CµPÛâг�g‘3Š嬅ûˆë©òއ”|Öø€;Eû£^/× lw� X¯¬˜�ßÖ(ÚºíVµÏ^rN!jˆ¶²²oAöö+Jêÿu×¥¶ôÚ«,7nù^vWÔwâP½ VXO«±½Ñ¹^js#ˆÂès ™myy1¬n;ÁŽäÕý•r ®·;š.|¹úÆ%•BMÆáæ²°Ðw0‹×©``Âp›\‡fûÚ„>6 R~L»-lKxÈë×n.=ìðüÝ3o}. ‹w<·&Mî!nÄöŠÆm±©(ñ…Ø�¯uáÙä#‡˜ä�Kƒ€áé «]­ºÕЦÀ�ÐÛ4vÚ¸]ë}×3ÌGR3ÓnŽ:Üü°t ëߢš5&Its3€‡ìj¼Rëk`‹Þ•åìS™\„Þ—s²uFJfÛ@;`4«œð¬)r© žâæ[ÆTÔ\8¨ÛšÎöûÉ@âõ{n5�¢“àÌ8EËñ¯PÆ€r—©CˆgSYp{ e^Þ¯‘Às•‰úùÌ›3¸‡poz’‹sÞô²6ÁûxèM£V¸É^ó3Áp O|‹€¬»·gëHc>;©‚¤Jý®Kox{Ú�}h_ŸœUËDÇ‹ÞúBy•T®ž`Í~fð-pÂà E¡¨f äýŒˆÛ}]ƒ²gyĬqu8¦V£B›Äï§°ïë=-�_Ù`vDær ²]çµîx&D9sÓß$á%AZ”ljÛý4Û•‚—¼GÃxùcÌ™÷Ìñ‹Ù”™qÉ@/ˆ�K³Òà>½3_}¨y|£b€1wÌ?e M7cdï©Q×=v³yIŸok©’«²oVÿ\\Ù4<_Ñ­xð�oÅ£‰Ÿ¾¾ÕúÖ諃ÞË*ËÃRx£vµØp •׸ðPºÁ¢U@Á…kñ8ë©ñØJt.(hJ×ÛZo÷Ë.I|ò§“4V6}æ+rÝ¿-�kâBµe¤Ær›4 ÎêMg-úXʽÞ춃~Z4÷Øåøgœ7xž5™ÕÍ·úR–A�2 ­ð;ˆ � „¿C> kJ×üàà�p<ÈÊè›õ–“G©jwŒÅsœÒ^ç; Qó•Ážò° §ûÁ>°xq,ÀVpå¡Âmìi¬Ê÷PÎÌ²× D»#õ™ãÓ H‹ަfø¤Â|A�¶ßd¢5�›²Säš t–XOÆÖÊþMåáÁr—6«}†=PÖ˜-Ñöó^“‹Vè›]é;�`û&ÀÜÊRÆ‘MÝš¡¤"3¯'¬q»'¯�ÅÔÎHú·HeÞúéLD­§“͹­xý7ÆÌï§LwwžÕÕ§o´ÆÞ߉µ-ñîßá¨~ß{ëŸKŽþè@`ï ] �¦EW¥�ÇÃò¨Æ9Vä´¾§QäÝ\i¤•ÞÛÓ*mô¦vgÏÌœŸ è1-r�âÄ#ÎVò7®#®²|ÇŸc¡ }ÚmÖ• ýÒû;2¹(³ô>±r^D;Ê+À!Æ5°Å0XX$nSK¤ôÁ¾«­£,B�»„ãê¥Ð—LÊà0V–LÍ;g¡ÝÛ¡7¾2È^cÞ¿Ô;Fã%nøÖ¼x“ؽ ¹2?ð�ü—Ù%Ïß3 ØÁ%–¼ûyõXšüÊÊÇ1gŸmjÊëiòt³<€½®©k(º[¥�¬Ô\vgðƒ_\ÿe7 (wcõ³íº�:½�8¡  õP›„>3”ó,=ÓO㿺ßLówÞö&{ä¤Ð7�‚}•h¶âçP‰�6k÷>Ç0ÙLÀd7¿~ÝúòHè1y,+�Ÿå/o¶Ú6ÿ„0…Ž–-újnÇ8ϦgenUXåÀüsÕ�äžvAôó=-ÿj“U§œž›0&6Çv† ÷BͶ9Áù‚LÙÔdÙ�>bô%%�„6ñù!K£´@Ö1€µîE<Ñ úêa½}I¿x«ÒY÷Ì%¥X¸ïsð6þ�Œ+dÙÈf�ÀCqߊ§œé«å˜7—íD—_bª‘¤‰ˆé‰S#.bÂ*u÷eTãsûŽ>tÏ*è¢�ÎÑìPZ³Ì}ß}3^·_U™™]›‹k;#?3$½´^è«ÔŸWQŒ¾Dâ~¾Ê ­ê÷î&íÕ벦60Bw\9…´ù¬N!‹RŽF|p¥Ã3¤ÚóÙ‚èl�î>(ðG´~ ß°Å ›ÕÍ&ƒbMƒÒþóe d‘=à˜òM÷µÁÎuÏ«XtÕx�6RZÜŒ\±<Ù3öñµâ%š( 'ø_Ù¥€ë@7í¡-÷qŸˆ<ê 3 ¸a`AW ‚ž6ç¨÷<±äJxCíÝ$1O�¾`6‹6…¢À_�–Eœ_*%Ò�Ÿ ®ÏÓTnîEO â?¼R 8ŽFK þÖñ¶)ñLôÕ&Ý•à{¶�uïÝ@s—¢/7Ç¢½Î@Á“Y¸Âscà\ÀëïÓ ©ô7…²n—‘Qe µsÙ~IšuT%vq°xwíìH°9G(ÛǼ ?1pèz—�ÈcQ´½Ú_�ŠÛ•² ¶žÎúz’ 'à-c\hï.RñÔ‹!±Ä/>Ê¡‰m@lá@9ö"Ï®@^A«æµI:aµ¶:‰òZà.ጰ­Ä™|6æP¤“žàn×ïvÀà±7œ 7lZ-\Si Ñ�*çÅS1Šá·5 –©*+`Ï{æVmÈ)ÂòßuŽ÷žbÔn3�¾ž;<ï¾{¡ýöaQmÃwyá[t¿h±�&ÜçáõSêníÚ’lYOºÝf Y8»®1µ,ßI �Yp,ÍÔñÆè<À6zÏbhtT %žHìÂ~Ý©!ÖÂØ''%0ÒZËkf€ÉÜ×5hÿí0z¬ØŒd ©¨f•b¡ÃËBjJø•V:F™¦HDEžÄgŵW½ªfÙ :Èqÿ#z�WÑ3,ÕŠ&Gü´ÕÒUWkŠâ R�œ½jÕ)éZÝ"/MOõP8]RŒÕ¸�u©€Wý0·Ñ]ê€9 ®’¤e¡0†dT�@òÄu5y™z‚ó¹j  ZBX°¨šR�¤´5b”Š„ ( JI¢t§¢�/Õ” |Hž’ R)ÿ·þ§ûâ¿Ý1WûñŸmV-DãlEF®ÝGESã—¼N싞ݺػ9¸Šˆš'§v¶-žÜôØÖonëUÛ{^;µj7µw¶�F.�ÛŽ&¢Ô•ÖŠÖëv:áÛzÑǹǽãÆ;ÏuXÆ��qª‚"ÛÝÞmïmëí½¼\TUuZ6³ÅÜRwF¢ãvÝm‰"«ÞîcÛ»GV;³Æ5¢šÔ[®+¨í�ÝγDÆ7]]¶Ú1n‹—3lmªëWM{cw®ë3©*+nöñ^ƂѩèÜF6±fÖ13Ö‰ƒ�cbÅtcµ½8Ó›¶ÝïtmÓÔ^Ú ÞõÞöÓZ­m^íÚ�Q/»¹ªìöŒqFö:ª­íuãƒFÖ:Óˆ)ª"sZØŒb»èè7q¸×4LAwnª(â3ë×N­½»°kÓÞÖ»Ž8Å‹Öìn�±¨ë‹£n·­ë·v¾½zªñÓ¨k™ÑU§D#X�Z lj§£í]v1©ª*8ÞÞ¯·wvÄö5Ýgv(.ÇO]ۖ킊޻žŽçu»{»«F`Ûk×£Ó^ j.ç¨Ñ£wÛh¬Æ«FÕ¶Ú=Üm½íìz{Ö�Ú‹©¶ƒvèÆqŠÅǧw»Ž65V«[lcÛVÓ£‹EØÕQ‹®ç`ÏwÅuÛº:ÍmÐqØ­[vÏØÇ:ªª‹z5Ûmm`Öî8;jìf톶MŠ­cÛsm×5±Ý¯nìÔlØ�­Œí«­=¢£llUŒúîŠ:z ·mtÄDbÚ«[»««bívçm4]�Ûm�:=w{[»m;{Ž­µGZ=ØèŠ££G] 8˜âÆ·fãGf#V϶»¬UÆ{Ûšñ�¶‚Ñšcmº8»vîδÕ[ÖÚŽÏEwn‹­ÞÆóî5‹ų† Øë«³¶Åë'FÐf½w:ì:Ý­“ªz;Üt{×¶;ÑÄiÓQ[fA×EMF´ƒv+ìê툂*5¯EWm¬í­­ƒºz®Û×v ×\èÕÛ¥ìmlzîµlìaÝ·Zƒ»=Ý«¦Ñí¸Å·»ª‡lSucM­®�vÕ[UU·½ïotqv nµUdèÓ±W®é¶4Û[±®½îçE·cPQv×F»Þï^íULÆÆvÕví¸±³gN6ÝÚ»[;³¦½hïÎìQˆ K»·ªÙ¢ÉcuŽ«o`ë³½�ÛV·oAï[{®5Çcž3Zó¢mx�ÎÙÅ´N&Ö�µY�³{µEqk×ïn±hª¶=öÑâ4[XëŽÚâØìõv¶·¸õêÑë¨ìÄf ³é:âöÑmëÞÆÆ¨½{Üzñ'»ä{±‹Ç`ûÇ‹š·¸×i«·öîõÜâÛjˆ¢�µ[Ý£Š�±¶¢í¨â‹ÎÖ ¢=j#‹»£ˆ§Ö]èãÞã‡mxÉÝÄ×¶àØ‰�bŽ·qÍ½ØµŠ¦£Ø£®‚Æè÷±ÄÕgcEQîïcÅÖÚÅ[.-´Iµ¢´Z½[WY¯]Ư^ï[µU]hŒoGonëÛ:qØë§º£EŠ5ZõÔ^Œ±v ­ÅTÆvµNiÐbÑ×ÞÅXÞÁ‹�mV˜µFÝuw×uí­:;»ŽØè¶iÖ{ñÝ»uÔ×½ÑØ¯vÕhz)Õ£1Õg«m&Ñ�«]—º�]ºÑÜÔuIÖÛ]]ÝÜõÝ�v=hõ±[Ží®;nƒDNíVH-íÇ^®ÞÚ ƒ½‡­½u1Ø÷b�z÷¼ûu·»Ú}Du§F¬j6v›SŒmQ­{qسë=}Îã3mŠªÖ±9¢5�± š[í°ZÇGOZlk§ÛÛÞ=zí­F Öllã`¢�£hÅ£Ö+¯sÇXÑ[»v»wUت½îëWm[;[÷ncEZε¡¶ cÝÛFÑn›njˆ®Ýv�L÷8îŽÝÄ›ÝÞ÷»Dzâ÷Ží¬Z Z¶±c­¶›`­ÇvëlXÚÑVº ÷ºŠ=·ZHì:ƒFNãtNìîÌÇ^Œ{EÛg&´•¶6Æ#Òh®* ‚ˆÛûtluq£GzãÞÛV­Û;w:ÛÑ»Ç:¸­‰ª1i´‘I¬U¶“5µcE³±[LZµÛ´[:‹mh±×EQAÛth=íÕnǽîÁ¶ ²é;k8îöõÛV©Í£Ñ£Ö{8�i;º-�»�‘þ ¢¡ø*0 ‚xIࢋ* ä¢b˜©¢‚� ¡©†ˆ†™ª‚¨jh¨¨ˆª¨ (j ¦š‰ª‰!”ˆ&"ª""¨ª¨Š)"¤*"˜ˆ¢ ª¨š((©š(b©ªi¦ˆˆˆ‘ %D Q…‘”@BT*i‚¢h†*¨™&¢ˆbb‰¢f$¢"ˆŠ¤¢‚`‚(‰‚*FŠ(bˆ*(¨¨¢ "ª ¦Š¢’¨˜ª–D�`EeeAePOÐ’ ‰”BE+‘L’Š,„Qr£ÿ£ ªr$"žQE‘ª  ‰"#( "¨ylU QKBL4Mšh¡¦•¢‚Š*JJ¡h (( ij˜’©Hˆ’Šj©j‚©i…R J‚�ª†%S• *<* �¯aU8PÀŠ<¢öˆ&�¡)ªj€¦ššˆ*’Š˜¡¥¤ ¥Šš–¢©i •˜ Z*"’˜‚ª& ¨’š¢�ª¦$‰( ªŠV¢"J¢Š) Z ªªY𠡤(J )bhŠŠbJibB$¦!  ¦‚ª¹ "#ðœz ‰b©¦š†š)Z(¢¨H‚ª”¥hi¨‚‚P3‚H¨$©" šf(ªf""¢ ª‰š ˆ „™¨’Š&‰©ª„ ŠŠˆb’¨©("b¤š"ª©Š¢b‚ "ª¢Š ¨‰¨¨b(¨¹‘V§$Qµ«TëTZ tšØÔÛk@é£C¦���±%¬i0bÁ0V©Ö6ÛƒmVËMjØÛÆÚÒUj«fÅF«Õ6„¶£lÕ³¶4j‹[Kˆ­j�u�46*Æ*«dÑ­m.ÙŶ§VÎÙ Xb6ŒŒÛj§c‰ª“U¶1ÙÐêf"±§Q¬h¨Ö6Å1llMhÓF›eªcjLiÉl¶¶a-´4mœlât��âͶ¬™Å£hѱA™Á±h�³ƒV¢ØŠÄiul±­EªÕ°ÚÚKhÚÙÖÖlÓ‰cl 2ØÀlÛc:\XA’¿kN±DDUmšh4XÁ6�lÖ��jØ¢Û%Ûj±E6ÚX¶ TÓlkcTÅD•Té)ÅE£[bÛÑZµ¨�DÆ´hi`¨&µª4h›¢ÒÑlEŠ­’µ�dŠˆª‹Zm¬cXªŠ!ª©ˆ*b‹M;X-�ZÆ-£Q°‚ìÔ0TCCADEQCEELГPÅQÄaDÖˆ;j*Ù)ذDlæÑ’ŠJš$ƒ`Ä]�qº*Ѩ¶ë�´vÍ4\]Æ™.Ø" èÔ]=RñÖ�¬f(+µ³ˆ1=�ÑÜê-œÝAÖŒDÓVÏqݵ€ëTÓÆÑvÅSmOs�ŒWZ»8Ö4h¶4�EÙhÛwpk]E²cF "­&´:":ÐÇkjj5ªªë»Wv.ÄZ4Ѷ Øín°v5iÕ%Ú£`ìf .¶Øìg¶Õ[® «°ië í�uÝŠ‰Ó˜‰­§[¶´i¢Ž’µFqkbvÅU»º( ë»® ŽØìc[±Û]°U1E£hÖ�TEÑgl㱈 (Òè‰;¶žØëIXÙ6űˆ*�mmcgcf*©)*;·D÷õV�mk»¸ÐbºÑA$EDQQDU!4UQD1IEUM$ÓPEATÐS5K4TU´TDUACTTDPEA0Q$ST)IUDAQASCÔTÕUQI1L‘2LEA@TMTE4DS1RLUU2RET‘MAPÅPÅTÁW®M>Š ;¶-… wcŽ#‹'Nƒ¤ë®ØÑÕ!]ÝÝi5ÝÜLF�Vƒ£­±·qÓÑEh7X¶F�¡iÚÔë¡‹v4”qÛC­±Üg¥­:4GCl�qhƒTÑ£AÜj*€Å»ºº4ÝŽ›mÜwvwm'wu ÖŠ ¬©ÅADÍ1EQTRG»Ž ÷�{:=4u­=wnØÅT‘­ÅÛÔôuv õ¡ÝŸC«Ù¯n÷Gw±Aâzztn½ÙîÍÚž�Þ⎽O§Ä»Ùâë»P^Ç ë·¸£AG­èî4­tc¬^ÇG½«ÝŽÖ4è¶Ò]¸ÆõAâëÑ×Tz7F"Šö:.Úzôz"¦Ž‹nƒE>÷{yôµægolñxÛv Û£BTލ6ÏT4žë=ëQE¶ØÓAè:;aêìi¬Áo®�ÝÁE%k®ì=½“Ýg­¸÷�Ö8·±¦ÛÖ;;»\†›m´š õ»t{Û§Ñïg[±ª= =Ç»G{݈ ={d§­owìÙ£Ûuwq»Sv£¬Èïâõ¶;z½�>ØëE=]º}µ{b¢êì÷{€ëŽ=Æ÷qÑÖ®Ç]8´Ñ¯k½zOO ë]¨Ðb6Áïa§¤Åר÷;F;¸µv¶ŽÏ§Ô{vb»%STDÑ­[zMÅ�1WF/FìÛ;Ûªë¯xîëÒw»´tnÔ÷c­w·¦ö= ÑÛtÛwg£¶cÛ×Ei÷cF;»®Ž®Álj�'¥ôz=8ìêŠÝކ �ºèݺ·Z})ꊽ�¬tÛW½îé„ý�� r¤¡"R6Õ [(kA ¤Òi   "¤ªkV°†ˆ� £HkC�V 62ÐëZ1  ÓF‚Ù+c!¶‰ ´Òga4X±-c¨5£E¶ŠH©¢…Ó £Tº4†*˜hÖ“Z"§ZJ  Û!4Á£TPE­!£I§KjÀ›b‚€ÑT8“mN˜‚Ø1RMT[k“m¢ØCg1jš)t†Ú  ‰i*¨¤¢†—T Œ…U@EKª].‡QNÆY” ª¢š((*dÛQXƒM5;âi¢*m–“Ti4˜‚ £CMhÒQFŒ" "Œª&B©@”¥4�RAQEDÔEQC%DTUERDL’UTDDÄÐÅTNŠt¢‚�¨Å 6Ôê¶ÆŠfjŠu ‹Z4fˆ¢­%líTÖ�QAFÛF¨¶\QTM£ßÐ@ù¨À È Œ ˆ�"* �ÿ P¦Š’’š  ”��VPdPÂB€‹”XI@!%QUÊ ŠH*Œ‚ˆ0Š*,ˆˆ ÿÑEÄÆ ˆÕˆ£fÛƬɦµ³ŒkQ¢Ó­ª¶ÅµˆÁª¶¶«bÛF 0k˜ÓÛvv3XÚÆˆÑ¶°I­.1k[NÄ`Ö¶²m± Åa±m� �jÆ6¶Ö1œhÁU£Tf5q­´íc&Å‹ÖþßáÿoJé8zË�ÿEœ’ÁúÇ||üõÂÙ7êOÙ£Ú·=g1¯ùt¬oqÿO‹íøº°AFu(®/¬l÷¶#Óÿ›Õ[!R¯´ò9•: ‘I/üyËÇ‹R˜¥Ãþë*-²ý$×Ê:¥¿Æ1"÷Îc¯_³2Å÷xè1W6g2Ó$õW•ÿÊ.÷Ôë&¹ƒA7²jp¤±X,ÿÜŒ{>0L‰ô)€Jîdì�.pÛÁ¹Ž'Y׈hHÅ×íS„Ä @™géÒÜÄõÍÖ60'œ: ¶«`à¼_uòØ×8Z%Î?ˆ¸W÷CB�üj—ׯÖ.}�;áüÝÐçhV¤+DzÌ:àÙ‰ÂïuƒŒ Òé©´!¦ÐBëé�°×Eoþ.üÄH\vg½LrHWUÁýEß² y]h�b©ÂFÚÞ­dµm¬ª.«ÿ? ®ki¸à/Ñ>*®ç51|b>±.–!a Z»XjUªöñ3�aùHrl3�Nå®4Ô pùºægsÌpZÞÕy}]+s|z3vkµùYžN�œçáÑš•œk\e]Œ­T#8S0nG›ÞSIè!{–E-ÀÍVÀêÃ:°¢ øô{$4é„�PñZâÏFaãŒÔ¥7_ÒÙÉax]i÷YÕ-jØ-]�.‹þõØd¡ÝPÍ Oákdñ¤E¢<úðÙ+ÊÕ³›“D}uGæEák£ð›ÝF÷ ¦ñ¼|;–ã_ÿrg|~ÅBç‡C˜+:^U‘¨ôsdV±íüГg¥ùjÙÿÑmmdaÔàDBÍ�Ç$þI"'Y…¸Åh‚¥õ‹¦Úái#+Xyð,Aº¬ÜX&w” § ð…szÔœ5Òÿüw•¶w¬Fb-[½ÇªG£#Ìm,�§zÌ~DÖÝH­Œk .4�^ËòMaã‘rƒÃÍ«Olñ'¶�öIuZgù'²ÀdÁ®;E/ær¼#à½zHb ˆZ–âF •¡ïZ¹zŽ/W�±Oú¯ih9�I€¦Äóêq2 ejyỏ9 Cef±oOrò�«5„'!<ËŽqG·ðëͽ2ã Z`:ÇZ¹çÚgÓ¦6ÆŠšus›Ü×ûràS\Ô2 MêîÁ›PÄä� 9õ¸Q(ÉdA5 WŸ‹‹/N&riH!�^ת"ûVJ„Åtü®A¤­\šÎÁ * T¦ùL˜Tq>©iÿJ´|ÞÄoÞíÓÓMnÜíÏ ›_x·i\‡¼«ŠB´tnWKQDåÏ;Ïa h£[L"¯ÂöÈWH@·>øßš‹ä,÷û¯ï‹4 .‰â…ûQß ¦Šìt4'“<¡ÄŠ/nZAsTÍ Ý´­³ÜcàýÆfÁÜR&°¤®kÊîlÑ+‹¿VJíÏJø¶²àªŠ ¦’œÓ�TˆQP•cw¯RvñW5üÂzË¿  ´U×£‚²P l´zÑ|ˆïrû; }Ë¢N5¾rÅ•UŠÿ~Ò !Ã1q/©kaÌàšÜ�øºXˆ8¨|:ãÝ»'9Ù�ÚRÉ~·ö-»_©ÿA\xï#¼ÑŒjgӵݡTqG6—/³C‹ìLm±ª¾�kú™1ŽCÛëØÛã•»ùžÓx)‡Ýp‰K�‰¢Ä‡ì-é³s?à�àÂØ¢à…d'$‚ï=v�¬ÝK¬:+Ù1×�‡S«lcü× Up$©‘¡é}˰㸵’œîŸëœŠ‰ê>–)·÷xÄR¹†üAÄå?Á¨ÿU×<Ô�Çrªâs}*‡‹ó°”œíþf5é„»µ(6|`AÊ�2ÚV‰?E{¶Ó¾®£z âÞy’àÛ<Ÿ<áÃjeF~õÏ"øFWµìᛥlI—j ¡è7#²¶.c`Øh¯ºÝóèÒ}ävnƒB ]ñá�ú~¢Ñ’ºH;{`^üOh°" ž¸§9¤u0+%Íqj•©äå̤S—fÿ&e¥Ôo²�洛΀µî²'5cU¹h¦-CФ´n'MT±�#ýØ0·�³`®¹<á(KU¼nS„Å¢þqÙôÿœo“üíF÷EVçK­‚ÜIjdÌM‚š¹/ñ5D±¼ký'®©ŠK_:–Mw¿%VŽäbܳfЂ¼ý “[ª«ŒŽa„[Kò¡³qiA²ðŽ‹›D�…¨PäP¯ùöó…ÅÌ­›SÄX:_ÇÈ8ÌqÙ¼èvÅ—�©-}À¡ôøùvwÐbÁ¤3þ“7PÇJzÀîò”äÀà ‚×hîÖFˆÖ¶;€>ý]47/ðJ/�ô­5½©òÚ¸–¶¿“ch¥ PF 0Ä6Qù¥?è_ü�‘}ŸTx¯÷p …<3u3›a5—þ]©=ÐEŽéÇ GÊjíÚOø4¶ðå_Ýùæìþ ŒF¹ÊªÚíå�k¬UÖ—–¨ÃLW:W²t.ë¹G¢7/‚CtÔßúN+þ÷ùþöä¿ç=½úÅí o‘ß:µý®²y$Ú�ñ¤C}:¿³8/#ªÕl¯€KÍ…óýu‚:Ý{·ð/¯`_ÕRÚç·UiæñÕf<ê­lÌ&¤@Ffð´j3wnœéò˜| †l¢%zYß`ázíüyœ3iöÌÿïƒú�ý£a¨=<“]S£¿�ÖÂÎ:. 3ðž4gîi²+‰žùÓ;öŒ1-&ŸtªçxPöJï m®N.¼‚Û­h­82šÖ¦èÞJ·} ¿ç(õÁÐç@ód*#?nb׬Àf±±î43ãœåJ€ëmŸƒžoã :x÷:²¯67–Efâ8�ïHô|!IµSµh“O랎¿Ï�×¼ÿ Þ5øgÆ2yí`e¾ ûgÕâÄW`vŠ{jGñ�˜.ÅlÁˆFPwþ´˜ºîÈE†þ4«š®jÿå‚%4ƀʔÊ_Ý>®Üè³ÿ+û4¼�yq…nçÚÆ_lž~y$›•A†ÿ‰ÿ;”p™NÝY¸'üýg›bŒçÿ£©ÅQùç)â¡EÒÛùH/ŠÑÕ„Z)XçOb«1¤ÙxcMàȇvy¿h¹Ñ>ÓSòd69î+©fÕÁÞô@Å-ßž3  _hŽA›Ó:ÛxʶõA�âYI™3.0î«_�\[ì>DN–škC¼™~3~îôvivh¾CüЩ*vÂÙ1Hì*«‘Èñ‡[ú.{xåÕÛ_ƒ}ìÛ¢7íoyºšs¬N­xõç›|GõtµJ´±¬ªzýQ¥ÿ…ømÏ»ŒÝ­$¿µ¡SB!þòÿè^C•JÛ] <¢ÎæS²­ÌŠeqÈ‹_Mk]Ãx>Ù oX»8Óámé*G©sÝ»½ç‰¢ÚK„¶^útí‚{aeÐ �ˆp(-n¦¿º\H¢PZò€º3‰¹†]ì£q,çñ´æç8Ë¢¹Y}'ÖáeÌ—=pÈ5y²ãD¯{ñõê1ìŸi Vo¸¨1M=B—pŠ�pZ'ØIoSD¢~3ɬÅcZ^V“­2å7¶\¨%rÆ÷Q�–¤­?a·OQÝ[ºª?³•8Ûñ³²C©†%êè3N.nPÍøTÆÐo-WÕÕ«vª%Ù´3ü¥Cܵ!wí7LÕiPÆfÈçH�½í wþiÿœ¿Ú¿ÌFÖ4 ÿÆa¡o‹ |+^ýiþ)'Vâ`ÔÎU𼡵Ìÿ1Õ€�? ^¿ßÇü=æ÷#вÑÐÒÈÉȲg WbÄ¢O˜µ¢[šÆñkÓ« æ?‡{­ëUYí.ž^ÜvØÏÊâoÆSÌ 3¨9hä�I¢Áz×wR@Ìš*4áNh‚–?c^EVm$ÈN²Û ­‚Äk±Ë8^I]ëä1µ2UÓv”ÿ„�Ò4`ë?ë‹ K÷–—ðƒ|¸´çþ�¾.Qyÿ¾¸V1ö)ðl«¶“·ûÍduÌ�Óv¶ò5ÔŽCÂ=¯† ¸ê²éJu„»t«œÁÉ C“!O—=ž¤LÌTìÍXÇ „&öT\Ñ«ÁC¬o.uŽË6{�õ Ÿ>�å礋�µ&©oU%¹63Äâ—kß0€v¾~ZRò[]bEíÍa|· ·«�…d †Si䨢¯ì¦ÎZÛΖ�`º;„œJnqHÛ“A­Ê~½p¬·%›V.e âðÕ¯„ç5e'ÓOt�ñò^sÖ`‘ÌoLMRpÆ«=¨üy›žþbùÓr²ˆ’J�C–Ô¦´‚AïuÎCSlm¸›²â!Ež0†³V•+Þ²û‡ÃʺA}Õ¡™®�܉2G»ÑtáTI½e¥­íÞq¨Õñt­ÂRNkÁ�÷—ò’ËAPË –±máger3å.Q¾ÞUŒqo¬ÿñ«Ý|ŸÞ¦R¶¾\Nq æ-uî…ËüÒqúëp¨Ô)&|€aÂ¥ vm82]οõd�°÷ =ƒM!�JqÙµ#7eÀ6—~=û¹1аN"ˆ7€`Õv »ÈPJe=NBY¯sÉ»°q‰ñ}ˆ[0§¿o ÌXÐ-Û0mõ±÷kî-üÔbDZræ�™T–æ»ÆR/�: ¢ÁƱxᩎþÑSAüßVõ™·NmªÚÄ_U»ÿ7Ó}e0¡U+C›TÀN”ÔÓ¯*Ædöm¢6ƒÖAu 4– tcÚÖYõ:x8Øük=‚³‰½¿ÍÅ/Ù7 5¦ÌOäëü_ŸÑt 𻕸S}­q}®Úè,صïHªrè«[+¨CÐi�c6aƒì`*,NÖ±ùS²æ@ç«¶Fxûzµ@òcEIñõ{\Í媀)tîT‹9å²¾$–Õ#^lº1«‡$v1²§JÊW—2³­ LB•—G†ÿyyŒÜ‹”°¤däê‹ð®8Jðf-�ŸÅØíqbéW+7×  æÇCl¯vULmîÌât¬ÿcF¾‰TÙ|î!¸ƒä`pÇœk¸œIU€‡#gPgèÜ ’ÍÒE0ù':{›âQ„½•<ÔÆÍlF�4TÛ Q4‡¹¤ùl÷SÒ†èW‡¹íêP|fÁ÷BÜÑ�¥œÕµÜ‹@ÊK¤þR¨€Lƒ>,Š¡5û)8r«gœ@% 3‰ìáÍâôÛn#·1ˆã ˆ.�¯~"” iQ¢óÏyøRšâšYZ†ÉMô ×˜ðêÙ}ð¸“8BV•Ö�œ@äï(QzLÕ%Y£ta-w¶S�ßušäÓ•Üœ�¨±ÌÁ²¶È៱ʧiùZ‡Ý–ïìw�³Yä32°˜¾cˆ E0Ù”rù�öÊâÝíl¿õ<µ¦ßòwѩùŒ¡„álrÛÒֿ襭—ÂŒµÍWøÌRRÆ’¾å>ÈE´9NµY›ú¹]m££ è©ü¹ ýO›n׿jkGìIKñy6¤ûG\u:�}­ ¯# úpoþ_ùÛý,ÿê�MÝíÿ§ÑœoþcÈæ&ΪXAˆë¥ìnxšë^«o¼Ñ„ɸp�ZÚK$�:~ÆUˆzúî'Yºõã1€Ï¡æ6¨ArbZ@ÏU­�w<¶)L!ñ€N+QcØmŒ �áÆËùBï–»_úR¬–oí±üÅ5+¦"Å8ugÿÉ^4•‚™!T˖űšÓëÎP’6,V)Ê5qŸáEÂÞ‹ôÅÛEþ|hÁLIåñn½Ìc£FUDZèuû8fÛ#QiÃ'Ê[ÈØ¨ö¥H1s«9f2Šf…OdOûß»¹EŒ·pË]+™î]@>øê§k*‡š—fZûÕoø+.ì=ï£3çcß׎ ¼Þ)ŠpVƒñƒU>¹˜³hpûî1{Ü~HŠu�)¢‘ä|ÞYÁ�Bœ �ÒùÖe•».[ p^)‡ã^2ÛTì ñÆ,w/jïß+uùv�ùÀ/ÆRƒzžÔj@-Ó‰¤ÿ Í˼ÑÁ>‹ é¶ó©·/ÁTÑNG—QSó�ó Q¹‹V‡]¦¡HÄ<<å0.Ñ`œäcçÓÖŽ/9^SR¿fó<½£X‡ïHØýïìò¦o¸]Mâ"Ö¯„ÿe™{‡êƒëy¯»_,q�X.�IYijK6â`lQI�‹öd€Øï‹<[u9%“kd.qÛHQSz-,¸Š\oÆhl· ¼%‚>ïeÊûš�²}ùZþH0À³oÀD"äwrÇ­™ó¼:AÄ_í9êvÄL&1þ2‹¨�©†+lpª‡Êœ~@`X¥£ªSЖ¥ËØ|U—dKÿ¡ŒP-G劣j>ø†H£>QË®û_t§ÉJé­ÚÃüìX‹L·%´Œôâä'7ÀÇ1¢ÙVË0áuz�U$ ¨þøæûø¾¥Ã2Ù0*O©.}¶nµÙ™|&I–Á¢ j/üÕ2Þ™ëÜÏšq‚hAwöoï]q~stÎmcE`ÚøèöÆ ðO¯FÐÏD¥>ƒo‹é‰�[ÙÅŒ Áîcãt݆!ð^wSTâ&õœ'Sa6½mÇÔQ`¹�íE/¾×Þie¯kN_I¯î.Óå‹_³âD\å´æÎ¢ä¨)ÆŠ;¦£â«Ê¨EØdU»µ¹Æâ‰íX­\žX|q6} SóE’Jn Ÿþ*€ðÂF¤ä R’ÌcFÊ”{/µAzÔ@‹ŠfÛZVNàºô¹e÷š½lãf$úÆî[Î=k[›Éîùá�[x…#á·•ôþq6å^úûM6÷ctó†‘7Æu�%šU=šÑŽå‘ÿR¶X¯1ÙuR%àKoæ=s€¿Ò1«`8lêÖñ·p6ª2XOÚÏ+‹K5gMQ†ŠÊ‘/­k‹\ì¼Î+jæ‰îKDH‡/ª»&x³V¬l·ŒE?H�Á±ƒ#–|z›©U¶,3Ę P�z¢n£*iÚò'6ê,« 2âIÇJ£ÇYÕÄÆ(Üf¼ðë#[‘ (,¾n@«Ÿµ¦ÿ]•i-™1w|™Órèá¯Ï«_T`oKš�ø”$µ‡'OߨÐzåÚÉìo—(�fðÒù:[\6ñ“QŒs¨woì\¿H"‘¦ K¢´wæ,£¦^»q9[JÚꋹƒèë36¤{ŸŒã¦1õðUaÉrÙ *B¶m¶g2`âøÇ „ ƒíŠ ArR…ïKÅýËâ{úP€FŤ!–µ¤ºÍ£W«·‡uØÖÂú$¡§?u ,-€ŒT©å~Ç£m õå‹Ò íÉÈ)\Sï¶ãn¨¥%»ª#ƨÞßÁèzµd€Ð’¼â�Ûª=„õ¡»½1ñtöAUÄ"ž S·þ­Ì�?x õ²ŠÖݦbܾ ãÅÜ!(Ú3hFnc~¶#E«Ü>KZäåHصæHÞx‚ådœ²nEÌ3ïkúª›ü|)´/Ð�Zæ~~ €S¿{7yöÉ~—Ô³ï^ ™ÁÆŽh’üÙÏɵ/hx·.P¹%[)ôU N�ç7k1z¦/§r&D�{�å§äŒ_R˜«0V5E9Âé hªb×uñºyÅ–ÜT­< Ø]›¡ZTÏ™g<šŽì½<ýhÃ^YN/ÜZqðy:bD¥{ê�C:;±JÊ“yuɱ¼ÛH Ö Ð²‚]õÁe&>½£œ^æZÒåz}¤ò§ã cµuN¿¯àz»`Ÿ3eIKõ�ó÷Æõü?­T¦ó¤â�]ú°ý­¥»Š¨^9Qh6;ÅQ‚¹}1Ø“&4${pºâ¬’àùvùÕjgßon$An>¯’­°jXÄ|÷§³¶×Tz%ÁH°ý©ña8·ÆzV;suê�ňa݋֪$â�Ý•l$±-?‡«™¾¿ßÎbþžÙ’²£•k2{RÚµµÄå e²q²Âê3ëʯ+5J¯ø´ÞÕ™H˜’@1ð®5[õëAHèÔűQŠÞ5Ò¿ jjkËêŒjŒƒ‡üŸ—òì0ËÁ•|®,¥]¿‰øÉ6ðËóÐõG'¯•b®ÛõKe«w…3_9%GñP)ûuO4b㢪ßN¥a­¾a³‰O}{ᨻ‘JñVyûõ3?L÷³ï~-ƒéTrÑÏ›;ý\íßx_wQ4&íX¯} e•öYÚ5Hµ4£BŠ‹ð6=Ã6a±nþRÊwU U ódìTtžšà�|1³ËŸ/Ç>ÔY¹�àE¨w;2«¬àï £á¯�*À’¦rÛüKÂÑ�‚ ~|ˆâ~ömÙø«1¯Â &§pÆû’š§p­iK p§%ØÇ7…¨æ2`5·Íø‹^poÛ*‚Ý^ûEê皃«��ø•äO|qÃ)8,ÊeÇpä=l«ÖM¤øÅÝR‘ã×;OÚ+–�3]Ù³p!÷‹¢ñÝR˜îÑB‡Õl¾£Êfy=á+æUŻ̮ýÝó(¬¶�õÁƒÌ&{{2È•×@¹dnØ´øJĸĻyH·Ô×<»mæ ýŽŸ¢&´aLÕvLÄõfâ)î�“€’-ž˜³ê=YOe,ó¤ñÅ´Z‡æ‡Zš^MµasÜÅaá®�V¤u4`Å£ò³Ò1�5,�Ó‰ðjV)Å¿ªƒš} ¯|‹¡Õ(´¸îðŽ)Š´~«|ÿ1×å‡Ãöjâ]ò)ú£5ÇqüŠ'…\ÇǾÇÒ@=,cQ<þ*̶&á ß'0wŽì²WÈ2'¼[Œ•ÿkf}“lsüº@QÑá®kaO'_Ÿ±@A”nür)ú¸9­à×Bî ÁʼNî ¹@Œ[«{b·¥^qñ’(µ‹iÞ¤+ê–d'å&^ž}Ó—?ïn“ÞÁf—Lêp³h&ùàѬºÞÊvðe©S=ØŸÇX/eäøƒ{=ºïðØMµ3�®ÍCØê*»êõ×S¥ðË™6Ä¿íïavÇ{HæÀ“jSé^Ëç¶-µp;ÉNÿ]Þ¸&sœ°(½UØñmnjIͨ²š£¼îí+�±c»4ÃÚ>¹¿¶– ϱÝЧô•öS0ïl?ü> çËÕÆhy?Ƕ¡Nौ×óµMKFW¨ˆhx�^Í]Ùëœ?’ÍŠ�”•ô@w¯SýZ»Ñþ.(æUj ¬óV©'„;J)°ÿ7-;E·�èÛ tÒኺéë ¾òüªvñ#ZÈøSÔû5³ËB3¯ xì¤Æ$ EÊ—?—”ârƒp=d� Âüaz`}4ßZeA œø¹vd·¨Á5õORâiGrÄ’ëxŒ®/1¶{€UväñÒ®…åðéYÔ›£#'q'Ø­žÍ.©V+ƒ‡§“¢™¨ K0z©j‹hÖÓ â-ƒýЩCïÄ¥&Cû-Sªé[•™�çûNjæÊÃÒšê4ò5æ$èuÀþ}�Ïû1MªÊQÎe"LzÈ›4ípzŃŽcchëˆ P.z{UˆVPRÌû‡6bÙoRKâò?0@„orø•ð_Þò*¦"!ë–ûüÝ>åè¾�«6'ÉÎÒ�Ï 6»ŒÐ°ÍÏ„£ùVÈ�íÈ—ÖɃ¨q¯ \¬Y-rŠ ߇¨æÔ+,¹|Jï¨Ãbéâ3{îâ;3½²—ŸRŒââà dTy 5ô9Ü&Hþçã$¾(iÝ·.QþÍÚhöÝØ@Åxlz ŽÞ±m½aÙیë˜Ñˆuîçä§µwWÖöë®: qEpÀ;­¶PªÉ¬¥n&Güm½Zæ;’¹5²PmjÊíÌ©qN�<´<óÝ$ºRÜK$övyFr—Œî*âF8Œå–GáˆY¥Ž®v¢Ò‘®Nëå�¤(¶5�µ2½Sx°r¸>{Èö™ïËIÁ¶“<Å„v\Šûoåæegvíù¯ê)GB¸^Š*ÜÀøc¦7‚æ¾4Äå1ëA3¦º®ƒ¦K€�G¦'ïTu쥒££ƒm“¾°ý?¶o©"«Ó�¢¦åÔ›ËÂ�æµô< 2Û<<[ õ†ÐJ¾Öv¼ø5l– 1pØe  ïÕ.¿ÜpÊ‹ÚÖ™tKŒCŒßùg³¨Ð~ØâžSðç;ú²§ŽAâ<Œïù ¿³„‡n'³©T�n„E™¬�…Ϋ¨Øb%ÏV[¹Ýöõ�À ­?`9ÒÿƒŸ¬’†3ç¦ÿã4Xßü|!᪄0uÓ_×W¢HÊN@ü.m�Iâ‘yð-üâ]±e¼˜lN’SZ¸|Žž+g¢r�Üňloïò©üHšœbàî”ÖáŽÚN—@ÿœÄçµ21¢.Øc»ud6Á½�5ÄUûÅMŠƒ45ÇøÓÏ»“ÙžEzÌEbH?e Ø•£@x‰Àx¤èºÄܬs§òÒÍÎeƒìÛÄÙ?=�ÆæÊ‚¼ºŽÃš¤|ê66ÜRÛŠ ®î Ž.Yü½ÿ¶vG——ï¸Ö49öʯWÎØd-³“òاЇ˜7Ú",üš$Lñô Ì,s#}JUٺ͓Un:„p¹[Ps} YûB…9>w6k�vx`í7V*E”îo¶#V:pt؇½‰¦XÑ�ý-Ÿ~JÐ?÷P û¾¯Ñþ3z¯Ln¢x­ZmI¤³3µ[ÜTÛ­1¼'}d Ž™{³ªNj—U‡´Ë^)V…?RÍ ºÌ[·wÛˆ6Hzæ¦öç‡ò/ãKC0�é- hx¢¥ßkB¥¢›J#å;³sªY’…wý'Ç*´Ùwýû¸ÒÚóÔJ-¬…Z^}UAŠa,Kp 3 �æ#5¾U™º¼îîÆØ-R aõ­FßêÜ#í+$²¨Á­ÓÊ®Ýdî÷=â}é ÐÈ r\÷ÍÍž�ÂÕq`a� ÍøÁð¥whÿlô-þ¯‹¸·:5 =ãrTšhÈàŠþ¶A‚É“0y�Ó$ºÙܯ×'¿]Ò©À´fòOgãŸhdh‚%˜¤£©€ë¾9ıf„ÿ*],ÿú]V”»¦z�ûröM¡¾åN1ïøø§~«û‡ßÀ¤og-E•׳—˯¾ðuéZZRÁ"„‰t?,åì3ÕšÅZQ— qlé8'KxX¬Ìô2 À2IY#Ý€gP3u:ö©=\í¡EÒüFÏèñz)l HñÁ±†Ø 'NêZ¸¹6‘õ¬éØÔTm5:EY·ÛµcFhx|°@Ÿ;-Ý‚u%ê,›®&æ/Õ˜©jçÅ´|yuß EXI¦!NÜ´¡Y�^ïY«uE®ä×*Sòƒ F:Ý;Él¦€¹X$‚»›®§…�oîQdÛÖ4í²}⬹˜æ>ƒ[ç2½Ï<ô�ƒ»vÆÍP«‡ã¸òÊ»¼ÿ™@êù\‹0�qöey/¶5à×�‚ŶÈ+«1Ì¿ÊR?‡å£ƒÏonÞ±D�çö ¶Òb±>b¸à»ÁŸÉuj ñîÕwl_eHåÙÀ}*_µ°ßø»5j¼;ËóÐà«ÝÌx?x— 椉,.VDYôXΧÈå½­£ŒQ‰èúJ'‡P½ÝÙ#údãG*Íð[2U�â\Ý�¶õJâ£ÒÝÝvì» ÕSTtª3[œ¶ô+ol?"¨äå�é"ÖZŒ…µôÙðÚ‘­@Ê@`þàý8—úÏ-ûN�²zšÛvë…Ø¸G‘ˆ*‹Ð¶Žfúúx̥ЩIÓÏ$hÒR‹3gwÛ` æ�å’U÷—!½:‚®þ~Ì*¥�P ¾¹6WR fHÌêoN•Žá?a,h:£cÍ]öÖÀ·½(‹ñ“ªãl};³ õ,Äø^ác„”`EøR¸ŠÁŒ‡=…ŸUûß!ùOÁô!²hêkÏÝìéñø w_ÏÍŸæË *K�¬$%x¬ª<-±¢È¾”çq¼ iI> íÔp&§€²µÕ/x6}u¸ÅbÍqÎ742·¦ûy)4jäk Ž|ÑHšqŠÁVÚLh«·�@Áƒó1Ý9É̓b ©Ô½·­ÅE¿±Þ¤\ú̾¸Â®-´Å]¶ÎakŒÝчLb�~� S× Ø]¥JÎÕ'‡YqBª�°.�îèàÍ>YëävþUÈ8n8%­ž¦¶Ô±‡°ñê�ú5‚MÝ­É©�)¤}W—vá1nGãh�rd\çËj¨¼˜»Ì¿SμTîïRUíf”à›ƒÌØ€äÂu6ï˱šî+â«uQnø²[áÓ4©ý£]Ýu‰„(Q zãUp}YÿÇ–Êì-$ö™žôy¤.ÒàF;}ÝV7^Zv5…úHý[øõ¸Gû B«ç›+Ë®ò²³j‹«ÊÏ”‡0|U)háù„¥#;1ud!âÀš—-5$Ñf¿'MÕsuŽ–wÖ…Òo1)òþIù†Ÿ“”Àˆc@\CÆã½#5-ÈgPg!RµiÔ…¼9Á pÐ$ÂñÁ†¨šêZƒ,âkž‘*­A¹:BrTÍÖšáùô4Ë’]qAxŽ,¼»­’M×Wöµ‹ìÜ+3¬ŸqY›Èh1€9‰ °2§,ƒ•&‹›ßEW‡}Hb�»äh·‘dÿiÓc´(Ý ùÉkM¤î†ñ½—ï+ ]Öymf{Q­ÖÅ%IÇÃùd\¥(¥9ÅoýË�ƒ%üŒ0Åïb\5²…~ úâ7qs tòéÄ^¹À‘Ãø¾ Þ¹µÑ…xiÝÔŠà©qØ­«�&ì?üÕ1oº•@ØÕEaýeX³rÞ9.U(ÁKÜÞjrš:òÀ‡Î‹2Vßß öË[zöMÄjÖK ¹ÿ/œ?ƒý‚Ô€ÉqÒÿ¬S}2‡%ÃV|/“u0tŠ ¯ \InæŒ*˜Ú¹…ëª'Cö è£yKµKS,µ€ªæœîu bÊN—Œ×ó™3j�%;Z¼?Z¹äôëYP#¶ ñ�§Ös¶É0=/ñ†Àx®_æµ� äƒôþ)XW)_�FøÖÄ ŽUlʇ Ô¥$c7–²]Ö·éä5$kå˜CÖÛ<.öåS© gYÐ* ï›ë˜AÃ…+VHËs&iö�À¦Û÷®1„%‰2‘Á×pb×´]ÞBI?KUqNÈ1Û2ú7ßq;¦[«\ϲV‚ûk¸ìR\ …'‡¾&ѩȬLôÓdr5Ü^¹/Ê›Kç�R¬LÙ% Ž1Nd‹†É 2Ô}ž†é'>ù>gN8ô›ì2éWŸvtg­„S­óÆ;è léä«Í¢®•î”)|t!Oz–Žßß« >óg9žO?6_$hTZ‹+—<Ò·ùê•\ý©ÄÚb­§±Jd¦hw.F™pí^ Þ†@÷[X…š<5Ç)¾ÉVc 5L}­î YS3Yrż7ü»‡¨¡iRA—{ÃimšÃTƒbg˜65‡=YV(›Ú©ÂIæ Ã^áXP…3 G§7„§ Ý=êñÛ=t¬"zCͦ­¨&ĤU¸×WÍ5>‰ÁÉÛh§2©ç[˧J*œé/GÕWopŒIòšìnÚÛºMqaôÖ·©«Okü !¤æö,5E¥ì£‹)uËŠùÞ˜Š{ÜÓgæÎcwœ6+]#ÇÆ6Ê4¡@ ¦Äæ¯ b¥^j(xÐz�~Â@ùmÂõ~¤ÔÝ<§wQ_®GôÂâyéžØ¼ŒUujl] ¨Å–Œ2ß�åÛc…íßÔ‰Þa»�$žâ��·aýÓ¾oö®¬_b£µìz&k݇3´­þHŸiíáô¬þ ZM%YS Ë‚6vL�ÖmTd¹áâÂB¥²dõDAðÒ¸¥Ú¨ÕÇ ŒØGêɽ·a[‚pÑòZì´w.Â!ñs|‰sv+Yémó–ìlÆ0ÉÎÎyÖpÍO·Ãoãð¦HvªAFk…´{5ƒQê&r¸0 1¥Â ·KdC ƒYÜœÐ�Ù0bÿ‘½†×´:/ ž9á–Võb„.cÒ·ã¼*ô‡�Ôøã•)ýÂqàx‹Â¤·"¡¯H/ÿ�qÇoö7϶7Q|æ•?D MB0wÉ—*¬œQ ¬^k…”¯+ÄçáJ´ŠqbþÊP£x“" zÝÓº›\¦æÖ-¾âÍߨ('ÆôO%ÿ5ž­{5 ©Ü8'ñ/¥Asòôë¯ù+,Ö×Ó•A˜Pýl]Z�Qõ£Î§]¿\%eú”ÙRÒ…riX�é³-!ƒù¢ç×UKÈ�ý:•€Þ–;¡½mz¸¸ºj€‹]7;ò‘”%£�v¸¥ïÊ÷å0Û7³ÑÛÆÁc¼–xz©b*­±ou�:П0uÐ/uxF"ú¹Íjª»ÅÜßibëª`Õ(�(²=F¡ŒŸK`,Ü£“o¹#q;!£Í•ï ¸“‹³+…¶wHñ(-øQüæ<ó¼cò«S…H'Úþý«Ãª²¼Fµ�ñ:Å5Z{Ï’´q�¯ÉƒX0¸¬¶Z~’(Úé†+´¯ S +1:·²Œö’{zu,=Pk#CMc•©(~qW׌<*ô»Îãæ×p×Xç�ï �r»êû õçò%ö±¹ñÌÍ�Ú€-ýTT£íÇè¬ß7b—ò¢åœùLaŽ•�Å…ú sq>HΖu�=ÓÛ‹ïe±K¾W¸=tÐÇ£+ùÇÚ®åýS�ÖPhSŸf›¢ª —d ×OÇ.�7AO×ú¿!ŽTs.–s™_ˆ>ÿ˜S ”—ëÜÖò¼£ÕÏ œ‰�Ûrª6ÓÓgT¬=^o«ËšiC–î³PŒJ½­Ÿ7ý£N¼"é;qãã ]ת_F}¯¯�*çWÍ1RŽXuÛ)“.å_lY9J“„”âñ°ˆÉ†Ö$–rà™2™Éo.N[±RtÂo"\ÓV óñNÒ5e£ñ÷Í®†Åš‹Ø0§á´)9§Žþµ·„/ø¥áœÍõϧGqQ© Í:/¿é÷+J¦  ßáÌ®pxD¥ÈÏ[ÇJ=N‚¿qUŠšôÊ•htÄ×@ŠÀcvYOÑ1“rqÞM`?®37xÜig¤w–g6Ójò£éŽ­¾ÿcÕº„zÇ'þ˜È«ðASH“2¯Ï&g¢pÃ�æxŠÒZ˜Mó=›Áä ´ ò>4¢ Ò­é¶]6hŲ3X§­‹Úayè²7ËXÃKΡÊÁ©›ýc•¥)äTÖä¯u·;W LNŸ ƒŸòN�:Tº/øíý{�¹œå‹<Ž¥y]ý[¥óMWµ3•bïûU;ª/º(r=èÓ/žÇÈã•ñùˆ¾ðæÝ©) Ö<דe +u!|etE�½[,D çFµrÍ+›¾értZQ|íê6}Á²*ˈI†êåb©æ’Âó qêqÌFnþÓ|©p­ô áFzÿiÝ�–†`>çšÅ[´;œ¤³e6ù"ÕÙyüŒldâ ø‡ á`WéýÎvúJÍ’ØÄt“rŠÏP7¿gmÝM„_U|\ë‹!÷ñ„oP“µ±ØáæÆómÓ3dvÛe¦Á�á‹6¯l<š�uEÊθQŒ‚ࣇ°sÃZ2­z5~Â=.­üÆM¨ŒmÂÇAÃŒ$S*¹¶[YÄ$,^†ZÔuÄ„‹4áèÒh‡ ›Œ‹à§æLjôþ‚v˜Æl{‰ëEóÃÙõͽ8äßývúTÿHþÈìP|«‰\ùŽ4q¨×†Ì÷wÿ1xêÈÅBH €pœÑ·� ³~p^bƒÈã�a„«óö$ŠÛæöñ„Wrd·Aïs¡ÇœàbŽÔúñîsë;¾‰ÜÏZ6ÒÊÚ]sâ:P`j’]™[—<˜)ŸsÒEWÅ",ã2²¶ÎÄo¾knÅËu-|‚2ó<ºŒµMÔ½pY‚wÏ<Ç…õ¤¤YYî/F³»-ˆÊœà—例•Dèz¬p( Ûãâ‚ÀÒP…“gåðÉON0�_¡œç/‘õ0T «¡++ÿwšÖl«XiG>É0Äa…)GÞY?Ë2¯Æq5»3l¶=ÊÖ¶ŸÙ;êØ½V£œÔê3�„üûûñ×¼A\ÝÒC)Á¨úíë[²*⻤ Å–ŒžP×elÀ1œ-wû•ד¸ÓTÅ…Þ«d.Þ!}±¤K‚‰³"1TzÜuŸ_̃xëÙί}¥®ç¹ã¤sT ¶ÍÀZ½ :ä'Ò™‡Bͦ“nåõ(®9SùBiöKrʦ�xq8Á¼6*X^äB Í?\4è¿"éöˆ’�æ¶Ž+~”Ô“ØÈ¼5%7“`}éÈèÍ»LE|¶¼nÜE×è‹cË?-;Ïq³ÜÒí†&¨[¹ôû\å¯L]D…n¾{BZû°M{ÞÇÌn$)oÜîs¦œr²H$)%9¨ÍýÆ ‚�È8Ý\Jn8¬¸[ù%ˆªµŠÌ¦5§ ßjrsJœ§f^Qf쬋Åâüªª³T&ïL¯Õj¦Q§é¼E—6ý¾ZØ„/*]ž/úä§bhú-üÃ&ö}ä—©G’*Õk¬ðƒ‘À¢‡sñòlfÖ>Ñp/¦„‡ï2…�Õè†ÀXÄèƒ35a••üæ¤m¸G-×ïd|Ë�Ë.9¤(šÜTûŸ++p&À8ƒT ZŠ€µIÌj&7žO¢Fqä;[,¿JÈ�&nk΃դF¥e…Ùâü‘^�¸Ôú¯ =:ÈXskHLI®éäî1Fº3VùT#¾X¨E�áU[rãzÌÌØÅ-ož‹Øþ€] FÅ1é¼{…$_�^œ\cïÒ¬·õ†ŠP=‚å)á:à4À_0Ífª;ë¾Ð‚Û{}¢�˵¸^‘¦}µé $ýGÂpæ«°ë81u%ÜŒ’0bóÊÖ½DuÌÜfrsfÕL)Ò…ÌúQ‹œêïT:¶3º8TÕeNw%7;òV̨6¢Ånîü²…¼Ù•ë„jñÅxUš Và°=6É¥«N¹saz9Ð:6¿‡Òü.XFU¹hžÆFuKÖlv-—Î’[•?È�œ¹ÈÏãÝÕŽ$©Í^ã¿“ Î+ô’�ãm5�È�ÊV¡ìz=£™$[Bá`3W«Ö§éJ>žÐ.Í+ì@g]åÆ\v…WiF.®Ö�ì† ‚îÈüT}Žm%§-å½SŒòȬÓtÙ3RíI;«29—9”àe?áô¼—q`=Z^S:C œ˜°.åaŠI2\;h ºY*ä!�üô\p:»¾%•³}Uº`4Ë:t3hüpòÃÎúf/(k(mñ©ý€%ÿjS ]•é�ͬ/ÕG«ƪõÚíÿPóp"¹¤@]âó‘ŸøUÒƒ·põbZkÃG—‰A,bÈjG� ÌX{@—¾o*GHôëºP¢^EÚÂüg˘kÁŽh£¥ ºÌ¹˜÷Ú¢ÇJ=,ðu†gëUI$"¨–^à{Îø·ÆÊ�HÅ󟼀åÊ\5œªCBÊ®äh~?[�xN�U†®�®Í*÷Ü’ B¨ByÊüN«Ï†È+Ævg)k)öøÕ­9ønñÀV»;„‘}ô-žA°Ÿê #éSãf³¬â¥doÒÉt«\y¡Ñ;¨Wãxê’üñÙë­¦”¹È�Þ Üô}|÷\´`·€µ8ï—f4—UVúë3m%ú‚­HN~M|³#3fÃ6»2‚0…ÅSZÉbqXTz&7¸öYnŒ•´¥}Ëî§ çä[£XjWíÍÏ%¹“r4©�¼n-ʹÛä( ÅbªË_;›É õa\7ˆ \›fK*Uë§�ʇ(eƒ}†„qø·Ô36‹Ep@wêI@¾µÒUðS¸’ƒ�Òä®’ñ³¨Ý�§a’š|øFQe ïënŒŸ!ЗJø‰øµqòÓÏŸ>(b)¢˜ ªb‚¢¨¨¢ŠjŠZRšj *Šþ€«„QBQè ‹þOúÂ*š¦¦" ¦*i‰(˜išZ‰ª*)"b"Š"І  ¢H™&*¢ˆ¨’jY¤¤¥’Š"¤©b(¦jˆ‚ ú¢ ?²¢0þ"¡Â&@ÿGþŠªÂ¯õ@ úð߿Ҩ˜ý "EFFiøF&+Q-C Qh!ŠteÚXÃ`šHˆvJCÈcöqÛ¿>øðuŽÛÙíÜG�w»[óWF”ä™Eô°uÝ Ø$U3 dæ�„;‚a a\ DÁ—¤D².Í¡&žaá�$91 ÀräÐì¢F �¨—«¨>(õÁÅïqÇ}}ïc§ë‚¾ÇÝ,í$@ Á�i�ÙàÅ;i3!�‘.d: ÔvA2ĉ*2¥$�Œ¼90`D( ©&Žܳ€Ér‚…F!ƒ•¡KÁdC�Ń�áD€å‹ˆ‚¡=]‘’84!NT�d²£&�ž„;D<¤„™q–h4d¡Ðá¡;º£ƒ,ÎàÃg„ˆs.†!‡)ƒ�å€rŒ8B‡/A2èKÉc0¨\„Aj:fpK¼–‚ÌaØ1D�KÀf„žH.Ô˜ båž%‘’L‘R �%áQK4šIf,åáÙž€wP^N"X@€“†“–ƒ§”ä8J!�™F=ÌJyh™è„HPX‡†€Iw0qĦvË1�3³(2ÂÂyH”íÞ`5¼¹3,X§A� p¨U&fÑÔ'4`RÞ^SËBƒ…؉x4IpÔx‡ÊPJPO!�”©/0�˦gtÒìL¨!4²hO2Æ^]�ˆ hA‘ˆNÓYæA2uIhjILÎä³ËA¢d»@`%ݘ„È…±�ƒ;´<ÌÉ™„æ8RÌ‘$Èw– —h,HHH1 ’K”1H¤¥áƒ†€¥¦%¤‰”c3$2dÌ¡Þ]”<*1)#%$Ä;¦E€¤$Ñ3»³ÃËDM ‡þ§û¨X¡&Š †¦* ªˆ€¨˜¢¯…Aý•?aW÷QEý€?Ðÿø¢�ü•áBEþb(‡ýñÓ IQEUL3DµUQ$ÕLTAQEEQD1ESPÑL±ETUR¨ÌEQNTQE?Ö †DÈ ˆ ¨0ˆ«�W* AT �‘E\ eS¢/"�Š r£‘È(¬€¿ÕPþ@~”Ap¨À"¿ÙP@üÿLEŸ6ªÇû#¢êÑ­Œ–Æ,[]¸ÝþÞþSé.½ADzlz¸ñ·_gѽ:–¾Ÿ®¾=�`éG{AÑT½Ó÷ß}omLýÜz4”ojhÑëÔÝ>¾¾¾ö ^¾îöëѧ§îÁé§Û{jéÛîN{ëƒ]¸î¾×qñæ´wcqƒÖ"ûnñËwѸˆèè;bµ‚>ö=ö7ÛÑõëÐtªí¾ï¸õ˜»'}îSÖƒÑèǰ£Ñ÷ÞûÁAöÇ_{ Á½“Þöûßßcé)õë£K׫²ú7w¯z}">�TÕ&Ü}õ½¾“TÛÜmwjºê쟃û"!ä%á!>Tx@ÒŠ,£Â'à'ñ~¡�Ð�N”ht¢RšH4RJU(t�¤V�Ò©HŸŠ‚ð‰ÊˆŸ¸ˆ<î+òùPTTG*åQ2@Hª!*2¨Ž*õoò¸®Øt´Sщªªh™(´bš‚ª{b‚Ö*«»uFÆ  ÕÛnÇ�ÛTŠ(‹m‹8«OlE·v£Z&ŠkNÙÑÖ˜`‰:4ÇcµÖ‚ŠjìcgMº:y;q¬ëF�ž�ݱ=RUmwh-j-1§D[tt[wÚŽˆ˜‚ˆ»`;ô(§èHû ƒàäEtD@È©ûÂÕÐ…@ BJÕ5úP û¢/÷€¡«ùkø²Gw¸¸»fֺ8éÌWmuݪ3 £U–¶×n였Ók\k]t8¨ Š(ÕµØpQ%=:8àÕSÚÉ[gÁFÖ(Î6Ƶ¶0WnµŽª;»v’5š;Uqκ¬N­ƒ·qж7mÙ�Z£X®;qµPíM63×ÝÄWclZôx¢( ¯Z‰>û»íŸC˜£ÇÝÞµóVgmöÁ{8Çc–ë»ÚɈ /mW­ìèôä¶-б»ôb ˆëMÛ®¸¼lDÆ´u‰ñ³ŒëQÁF·¬TA{VŠi‹¢ÛÝŽõ¨(ö×Xbßq½××N›8íƒÑ˜: Þö=zÖM�zî·×EÖí÷f$öKh(ìÓ¦*�wh£®“©>÷m¤¢ ¢OluÝ«µèöÞ·¶=œ—µì÷³ƒ«oFôttQëÜkc=î{Ö#ÛwnŠ&6Çkjžñ�Ý\Äh¡öLGX¦=b>ìuìi×»TöÛÖæ»g ÖÆ*™´b£nŽªÓ¦˜¨­í£»žôžÛGÜ{’�¬S5MOlô½Žj‹m0PkvÅZ:Nw¸ê=µAFÚ툽X7G§½nÙ‚û=>�Ï]U}±×¹÷b**nÖÑRý]wwDG݈�±^µºíÚ ;o±ˆ¢íŠ*1½Þã^½[AUÕ»�õêìÏc¸°Dév{´ZÁz,oX ÖjÅ õ®©­á\ª¯èW&T‘øp.QVUðL¨TH@ýÑÂ�" e€@åF!L(‰ ð¡ûˆ ð«•?Ý8ýŽhýâÙ�E±[m´ÛFØ¢�mµ£MаFÙÅ ÅœY6±$­9ŒFª™¢ÑZ&60mœNµb-v¶Å´bª"�‹ÔZŒX±;Y�ZÆÑªu¶ 3U6ÃZ£lÆ‹mŒm­´cXÄ[¶­cI1°j­±Z4P[9‰ÔÕ¢"ÆÚ¶šu§h‹ZÚ­«FÙ5gm6Θ�1²QFÆ¢Œ‘EU- I_¡:i¡hªi ¢––¢J)  ª"J¢šª‰L§DCûìÄ¥E@[h™h­biÐQŠvÕDšCØ(ªÙÐLHhÔ[f’Š*«A¨*)‰*'N Ð袨jtQl”PUC3E²„¦„¶ 5@m‡ZŠuŠtâ£X‚”¢�j*b4&’‚Š ª ™¥ª(ÛRS¶M2ÌUIE%:]F؈i¢ ˆ ¢�­�«9‰�e˜ –�µDTmª1°ÑA‰4ÍMUT¯Â©'Ê! x¿Ri ”ÒQM PéÓN&ƒT�¥ÓHR”P %4 CJè iÁ¬ÖƒBSKM Ð$HÄ CBÐPl`-„Ð4ÓT)&�!3£TÐÔBPÐU4‰M BеZuMJkJS¡kKAÑÓ@E@D´F´-� I¢€ÐQIT•²SB.‘¥J)ˆGF‘4éС ²èÓE¥¡tRÒé1!E% �ÐÕ U6)@~•” „"‹åEƒ � ‚JŒ+�V…RU*ô…UTÍ3!2ÑIKT¡QAUQD34±5AHQM4ÒQULT…DE4EQI$QT± TE%ÍLEQ0QMD”´ÌURA”4ÓDHD(€xG@!@ ŽTTe÷U@9Q$ª(¢äþ`/ð ¡ð>|ŸòÏðÿãå˜Aÿ#Ûz!E~þ�ø‘íßð¹(žáŒžnå_÷�ý°X–ÉR泺HiM›èB•·ÑU•ÿåÍßtzÊ5ï!, ª» Ýì¶R‚*[¡&ê.‡Zݱ:K¯Ö�5ù6øÿÞõ:ÖÇš 1’Ú:®ZÇ¢-¹«g1ËÃ*¾f‡;uu¶ìw–&»0³¥«oX9f¾=•È` Pb‚}ÿÂèÖ·®|Ÿ µèümØmO­Ö\'¦oÖº¥×®§Rp³QäŸ( P�GŠPµÛ©•µÚC ͱY³^�åƒ3 Ì@ø t�Ʊ-G»@Žrš#\XÓª³úåtÎÕ‡9§À€í"c¬MìøV;Êñèr>˜n“w>7‘Ù0 5†xc[¬&]=pgÛàÑ؉½ÜÑÎøÅ”›mèd¾eÞ œ�;/›ßƒfXÂ@•¿;&½¢ÐŒ7 [ÉLå5ž¸4\hšù6<,eûi—]E[oZ⢜2ž¤Óq¸sÓÏfž¼�""Äø[w¨‰#ü¡81„1ŒtÜÀTÈ›u|‹áÍW¤:îÎùí¼«Å©�Ñ*j®qt2—�µ³Ì×ÏÞøü!² íC»kÒ¬8ÄÈêÛ3&HaÝÂ-ªkÖ—×oÎXÄCÑZ–¸¸¼ì¸;_éågíÉǦ˜²ºó¸ °©lØ>¿!Kñ[󨬙ÚÇ eé—»?;p´%þ[M·'»´½€}ÖìßÃ¥r•Q°eÉMŽU” >Kܧ_i/v5ì – ð÷%ü“‡@qú%˜öÜÌÜ9’`Ä�ÚŠ5MU‚ÍÐ ‰ àw‡ÊÙÀøÖVûO/«š(r‹0üj·ô'çL•_÷|¸Aƒ02 U:= (Ð4X‡BÊÈyÊü¼3ÈZ„Tõ÷ˆ%Aúw6A-ÒÀíšä’ >e$PaÍ�Šlˆ\}gC—RÈ]µ ¹ ïÊ\•º•'ÉîJçªw·ÖðE�Üt^µ¼�4íµ‚üaî}�)…§vs`wl\Èø†t¢ÁlØ;¢ºT¸TEǾ3ëƒÜk ÞÔ(˜/Õæõí ŒVõñùÂÜÝI¨LcF ap5�rãÐXã!nߺ™[ÎȲd´ho|®)Cy20ô–�h£ÌJ=1³;!Öº,·Ø„f/Ú³˜I¾Ó¦÷{ámyÇÝx±Ü^plÌ�a©Q–0'aÑÎÙŽvÃWaqEƒGÝp/ÞwšPÁW‹½¿u$È T!RFÄäw«3©�‚RŸŠì‚í$ÝTá¤yJét— ¼Yhåla’8¶¦ÞJ (^|ûß»1�wN#.8•ùÕ¶Ê8ˆ·PºR?¶0¸aœ‚–4�ÙÐ…qz„w.!%qÔß…H`È2ké²ÔCÂy ¬ÐÞg.È÷ýZñëKÁSǹ—z Zߘ~/ªfçŸCmˆº?9gߘD c3² ˜0¢8 ëì¤. â2Wå¡ê›[Ö1M§¶¯®Ð(à vk¦–„Å¢³ å˜:žm``r$«�Ê#!lªùºuö¡xدZÆ]nZ}ç+^åÙ°*º,ÔYÛ"j¹ÉXÚ` Xš†…1àLh̨±åVFÞn©p &²n³�ÞtÝ¿fmÅܾC‰¸3Xt B‚Y®ØZ ;B÷@½!ƒº™$é—]*eB•؆¢GI;ü’�÷Gêü'÷�ÈÔˆŸÝÇëÿ„úþ·÷@§<ˆRß~@?Åüà÷°þðB”Ã@)’úP9Þ/ØÏ_dZ³òµ}=È%7cÛA°d¶ÀÍý@†ìy‹¦ÅU§ÖH\À5І°§\»�ÄN¿qùUKHã PlÜ$¹”ßöh!c¡šÐ{ä—›×œ8“¬ºXæ8iˆ«3C_’%ôûh/ñQNCé°P;YB^÷"Kõ1s×Í8â÷�Þ ç\&âk½¡Ý.Sz¢ ¬Û¶©`‹˜åP $68|.,ÁþY2f²¦–´™UÔ5» Öf i,XçÄÃÖmÌH¡çV/ü»qÓ´ÀîLò?Âh?É‹‡yýgú³›„ÑöÂ\8Y`åì&Œn¹ÈïÇñ›‰äyç†Aãî8�De°N‹—LØ­Á@¦yÃÑïãJÛ´—É·éuL}™«Üd‡êocáǧ?O�åÏS¢ÐcÇ_®†õ|"ÞPC¦ÎE7 ®Œ$MY´Ç­YA -¾­üû;ÂÍUñßzõ«Ý/Gͳëñ­߀(ðØ«‰Y(oŸÈ×i3^“!Þà𼵦¬,Ÿ& NµìmÜ·Ñ«³†zÝ]`œ KåÀÃqø”Ü„{€o}eo¢õ·Ò͆³$ÿNrjBE¹Ë~â8�Ú`ä‹ �¶—¼¡¿X®, öä-c@“³Å·%e°†…ÏzÔ­Ôwímz¬{¶ºÜ­ƒ—ÛÙ6¿:qÎâú(-YlÒ¥q�¸[õBÛ*ˆ±šçŽb‚º4È‹’H¦2?#Î3Ö°]…} ¢eƒ–vƒ\ e†U9b²Öß.¨RP1¡C&nÒ ÈÀç/”µ\Ÿž7ì³”+ªÁ€ÅØW$¦Aôˆaôj0ENMõ¡¤æp�»|qÓ±ÌivüƒØäý'$aÁì!+=ÖÑnÃv|]ÅGrWÌä=µ^‹Ë¬­6K�î°¸ãßeK€©#Àº?7·›5‹:Y‘Ó˜ ²Ìo#‚*\#†Äg/ƒÄÆð‹(+©«©Úw›°&”X­‚};�ŸˆðY¡›ä;`–[^›ígåmiÜ·¼OyZïÐgÎΫgè©©¬9›nàÈË—ŠåGOÌ$"Ölš†;?-i‹ŠN‰ôü‘—éxÉ(¡Ì€àC7¾áÄÄ/¦²¢ê7¥H"±B[îÙ0RF¬y¤�kÙàšôŒy=,däNìòùŸÜ>à13w1îdö¹”1¥Ö¹ƒ¸ò™1:ûuåf£4!'ƾ1¼UÙ[ÅáØF­Âð•OséµÐ´P`Ù¤L#@Y$)X Öü¼Mž`u‡`]™MÒÅ«†¯@«ªv's2•�;4Æ�íËdš„ûˆ —pRh~äx'ë E¤Lð׊Ù)Ф1"~¥0Jcl§RyǪ…ŸF¡Dš3Pª·ªöàWø«åÞSŸš¶ð<™ Zè _{ÖûFMt²úÞÇ“š=Ö'•ü¿•ÃòÅC°Ú ­ÍåÅœcf¾pdƒçÞËÇžò4®€Do‡_å€íâ5]­:É%õ“`½¢.ÖsR‘ ˆ Éàœ&ËqÄ¢1ƒhñïXS)�#:¸òÀwÛ\€,< �®“t�©±eœž�g1•Òã9˜l1ÕÙùд�£#Þ§®ú›Çª²ˆëÕÞ¶%ÅŠAÆT;IÊ+4öB‰îŠr=¹ð©Üv¶u¯EZRŠEm²\Í¥í÷£Z;Iˆi ­ ¹¹mú@Ð60zZ» ~ûql–ã7œ…ˆAs©¬gNõèQ´šwÙ'�dºNa €¸|ðaÐ& [ð†S–в²ÍæÁÞq·?® 4¼Ò7K³¿›¸/„‡æm¯+íþcµ°'V½ùK &æ7|‹~,w,w¢šŠ­×IÂ-ÍŽWšz0ËÚ5{ ¤¨ã(caÀßÙåöïy=ÄMWwP)B~Ï7â½ °Ëò`ac�‚Cšëõ›"÷rvB¿È] º âo i¨š–Ǧ¹XöAØ”÷Y=%·ÀSÅÇ) ËY\­éÍÂlNjý¡Ë+-!ƒ:ml)ç©~‹DŽ4Z±šZ�É“YµA¸d1z5¿qZ=à4 „áJzÏ´Ëfm÷®Él&aL눆*JƒñwØO›5õ2Y/�uÌÚí"(•µ�³}?0‚V®ÙöN†Û›®'÷À©èë…êëáË5±‘ú3±2�›Dzc]ìR0äšD•/òÐbʼàÈ xó%ô%üqC¼F¦5k>¼d¶S°Ë“w -°ùi~b-\}ÞwÏ—`)§¿ua;¹fP€Dí³ÚM!¤`½–}k¹´%7áÄ;�õÚÿºø!Î¥‚¹è­Í‹ˆº¶ík¥ZðÁË^+-8¤¬7™2š°W‘ìD=Yå(ޝ`�Ü‘¨Zra ÐtHŽÌvÛø3Q~Å+ÔZï–|1ø!N\#m2È©cÐmg;kBÞ¼ÈNLgD�»1n9�€\åÈg¬lœ!ýv051H¤0ía僢˅Ýê\Eø�¸`�@ÃdÌOCTýJØÀÌ£mî€qe¿“8æ?²á¼ÀúgfîÙÈc\®]TvlðËÞO¢ ¬oÚùÒ Ôž_1H°s4òcökf¹ùüÃÆ‹g@MÝŸGØÌAþX?ÎÌ©.C}c³ªLŒke]|:÷B½³m�éîéÕ=mô<‚ãÚ7;Îz˜ _.wSË¡ƒ-%tàù¢Ðߨ#l—™3�[€æhõÔ‡À± ðœ�oîÐ�2…ïrðl -m‡¨þÁ0b@xÅ4»GÈg¨SØd¢ÈÄ£[µ`Ýþœ¦µëÖ±sï%q+zÆ"¦¨Æ£®ƒÊÃPTkÊÓÀ«5ŒÇ# ¹9«•kW Èþ•¶Ñ“'»ã-‘»l1Æ–w:l©~e–{1'|�pÁ‚¥àÙ™½÷Îü��Kg÷lÀ|�mb¹´1¹€ôðvk9d¬”´ihs�[Á cÌÒ´”�Wµá‡¶Ï¶óÀǼ.gÖ{øÇà:±aëÇ´5�}â^ŒÕÏCihÈz‚îÏ™`î¦ùzÁ‚NQŸ-l`Ž–<&½}Àw�²î6`ùÆ„åÆ˜ÔB �Ê«¡·pI‹?hï9Åq0IÓ/[äH ÅbÙUý+U†P¸)®L>Óª¡;xÖ#='É‚ˆÁým:–˜@¾@Ö/ xÄqª²ƒè§Ð‘†�3�cPÆ…3í6 BˆaìY >nÖcàÈw1e™ÓÒ ÚUáTëÓ‡ozï®ÉDêu‡U !ÍÒý^Po-[¼Ñu`ãcWÆ_!‡l³ì3ÊçFÅr«q’“(Ôó S:òÑ“¹<–9m-¯Ï¬†¹û§íί#P[•i÷$:#’ûI±Q¼Xº™<ܵ<ù– o`§FFq'L«¦J˸¾ ¬Ç“û××o¦šÏBª&›K�…;þ¸Žvï÷¢ƒ[­$L@Ü5‚°˜àÕjñA²Ó½ìÆÅžÃÀlån""ët¯ ré?„gòšä´¸ÉÀ»AêxcYæ³g½í/j� Vo©^s�Œ4fÛÔô=~sΗh°pò÷N³Ò?¼c6�­Lu‹ _GÞ (£ž›,må²³w�r§b|¤g“«W‚’t{ÖÄî@‰® i,èÅC›l³îÑñvš’ÃŪ†áÌ­8œ‰Îöºl9r¬i£$f9‡B˜Ö¾Fˆz9ü£Yo&NÙs-:Vu дÓCc“EMòytlò nHe«Ê…‚�dM�mu/vÀÐÞυ̳±XAÕ“)C·‚ÚER*MȆ`.‰¡ûÂN#aã¾7ÞÙB‹ySÞÒf¹%–Ï6³ÔmjÚ®î®âVäW89Q•.Ùbø/´ÐÂȾÍÔ…âÆb?Vß�gœX�l1ƒl¿Ó|»/Z�! é6Î]Ö±·C¼làBÐjF1’Ó Þׂ1Þ©/ü©ú|�]º›s› ¶62;ÒN¯£3Ãszd|ª=Ó(ÝM¤iuaƉ$±K ¶Ûجš˜à•Ï ) —ý£v{±#ëX(¨Zœ«5çgîŸÔeÕ{;çÆˆ§è3ñ®V^BwØ2ë+,pXA†ïÑ0O ÝæÙÀ‹VÊvæ*)g2Ø–{3³7„)yH�·ämZ‹œõ–Ò$kd¿;¡%7¶"ƒ;ј œ~LWp¸22˜šöòÉU‰;K�¢­˜q*°¡a�jÇŠ‹ŒZ​7Ó\ 4Ée¾âÖÄ5¹wºØœ�€ƒ²Åmò9WÛŒ“YÓgËû\�ØjøA/�×Ðö�Þµ}%n¯dÚó‹€²Ïy°öæö]KdÚÆíâŽù"yÈ{òþ ŠÀlÃ]Ííêæ"š\@«ÒAêÎ�D®•ÐKµ (ï¤@c:7º¶8j€fCÚ‘Û“[òç©‹ß«W>D\®øÙk›¨‡ÒÒ-åâ"©úm Q¨ãÐZƒ"˜ã.’6›|j%g[Ƭñ�7ÇLÆmg}=¤/M°v‚2Þ‰¿N3€Ý•E½c@³‡Û Žõ™1'ÉÛñžØŒœ·m O4~†êƒ~Ú]–5•ÏguõÈ5l“Z"Ý¿Ø2ŒÇp`9&uÅ�§Nƒë±’2‰ FF›|²Ü{)c4¶Æã´‚�Y³{µd†Ÿ\Á¯‘§~¢+~܈æ¸mo † c¹´>_aYô‡c¶Ç† �ﺸINÂ�n_âûUë�íVL“(SB Pê&…nÕžÝ85kÊÅ”a¹Oq1èvyY²¹jÐ?E�‚Õôˆ¤)w¥iÌ}ŠÊ>‡íÛ!º|}ž"CÀë ¼%|äl %›Úê®äS§ -Òįǽ1‡t–(Ô¶pžæ¦Ù‘6ú¦\~­;\!¾~.›®Ë·v“>�Yö÷ ̦«· )ï�ì•¶( A`coÆ�¿�&¹ï�Æû´±nÏd�’?Mì®Cým¼m`ëz¨ „]§ïxKêí|eH¤¿ì  :ŠJŒú¶NÙ&…q¾3VÕ?Ï<¹Ô[î~ƃ�° PæF|³ ÍÍnçˆvÑ6³qfЈ„¥²µ ÍjÑœ77Ù0wÎŒ`#6X8·‘�›*×"Ýúö·¢þÖ¬DӃݕÂç¤ý“€ÁÚ‹Bqf`"uü´/3Üt[CJcA¿&¾²Ýsìg³B:žÎ©<ý±ó^xf>@ X¶•{jÂlŒ,8hP?fÕm,Ò«o|®Ž}9‡��yúÊjݱÀ¼FMÏYÙÊš€/¸m“Ý´ �ª,2ò@±fÊãÊÚIß“ 1‚Œw�°ØæRÅØ¤"aÔ—6ØÑWíÔ …±?(+‰gO»5ù‹Ͼ´ôš1ŒSâo‰½l¸¿ºŠZ°r´ÅÜX-t!ÅU×›F®ëå“ÞÐ?½»Ùå͘yõ4&lŒtKôs}S®÷´îiËí¤ä5€Ú0‡áQ€„Þ}°@†sˆ«Œ›‘~Qþ!�&¾ÁÝ*—T¿ÔxüB“h{\²޼Ù²{ N3¾q·ãźN�ˆ±ÇS$˜Lèlî‡p+¤Ö‘û¤Î­šîÌ…\…{‚!ÞÛ=;/ï±YºBû²Ž,ã†eùñkìUïêÐä­÷>æ¸åöŸâQ0JW{ünªþÄÖ‰JžY°¸Yþi«�Ë•èBiåɰo�eqø5R gãSU *D=ÔìžÉ.´{ÊÞ”„ra|°[=ì Å�)¨ Qòå±^Š‚BJÎÁlD…Óx�Vq^‰=Ñä¯GÛŸuÝ =ä“ZÉjG’`Éä½Û˜“pJ—U¾¼}IÐ}|˜_ôu©áq×f‘Ü3i‹WÏÖl_¦uÙßùÃ�Ù6aTþe‘'Š1àlU[µ—(jØP.æuÚ %ÓÛ½f•åºm‘êι¦Òˆ ž Õ�Í‘bS­–«ia*Måa0ÖÁ_`(@e@ðŽ× Öó¾ay$".¢ïL˜Ïmjê`è­hWËØªyÍÒÜ…A5‡ŒK“¶½L*Ð$ ÒÛQebÁbô,¼Ù!úulçD®?¿{뀤œ~ ?Z‹ŸÂb¨5«}U¾œÚÊ™;ž4æÿrtÁÌ äš¶êWŽ›ì †&U’Q8¾a$uz„·€Äh•ØÝ\ƒgè‡C/m¿ûî̃âË•å·b·3årÎWO…Ûù6ñüκ?ê£\Ÿð¡¼¨ŒéPWÔÓî°W·µYSvĺûV¾Y˜!G•b”µ°¡™aÁ ‹¼¯"^gY\Û-€š"íA°s¥’Ìèµ%ÛæLNšOJô(þ6¼«@Â�€½Çx5©á9½Ã8HãFeàßk�qÇÖæFŽèè†b,wš–Ø žãfC�ùf[…Ëëažp¤‡mx†ãƒñÏûÍ–wÑÚÁxBó🹢,ÝþÄYà„ˆ€JÂU`*¨•¹éU`ï¦ÁCÞ«…hû//ª á´ÆáR6¹âLÈî$Úœ09 Ïz�¤}ÁP^-³Çv‰Íw�¢8ÞÂË9âv(¤9Ös}‘) Žy7sS¯·Û¾$[˜¡Ù'O¹ë¡*ž‡Íº/q*¸OÖbÏ‘ŠÓâ�_ÆD¸a�6y.ÀZ/ék gùp„Þ·÷Ç�Ï#ºkHü÷�ä�©¼Ìj¢ì¡æóÓX­3ßtX'Â?W¢™¾¢/…%«åЬ!8ÙÚÀ+<žš`¢zø�ÚÁÅ¿&v_¨�»ñ܉\b‘‡ ìnºñ’Äõu˜tQ¾ÊÑ“ «_¨ÝãX\Ôô9ôð­Ã7)ÜöéO— zESÖ_EŸ›”èm�æÓÔ±=¿Xx$釴-¾mmû¹ k` O?®ÀìÁfwF̓»c'ĹÏ-º¶ÏÞ5RéèL: z zàÚϸÚùj ˆR0�sí¥ï ÈÞDE0#g´Wl /­�5¤˜ý¤e\å&-ƒ¢ýpÙ®däÔs礶ñz]³âëu‹PbÏð†ÁÒÙÂ3NÌ7d5!Í~•Ú6w uE%¥âálp\Úœ;k(€²·üp—„åóC`¡8°‰M|vnD¤Š7X"~|¬:Ff§ÈgÏÜP�æjþÆH­e9>~¹°Ñ¨òÊeE*ø@ø[ÔpÉõö~ë†nþ*Kµs…�Àa¿jvxݶèËÞòÕ­Ío›~^ö sq)ŽÉ»-+Õ+í 5(òZ2BèRë½zúwÒ‹F‚�T­©Þ 0 מ3Â0Ä¥‚Ÿn"¶‡×è³ ÜBm�ï�‘BP½'Çùåµ|d!Cù®È;õ‰’Ý"±³¢°%­˜—­Ëà,¬‡ŠþÊ|?ÚÔVãÔ$Ü2K–E»°éÇ\Á­q^ñqm> µ§¶lʰ÷SÂg×ìRíÜU²m勎S|À¨5\äd•±hqÒ' ¸´¡u{• #íT«Jc† NêÁÊàì-:¶ÎE©¯¦/jÅŠˆœãë~k‹äkMu+Ì~!cp0nýI¯�ÉkŽ©dîpj5Å@£}ïM�¢aØOÖ¾ólâÃ|Æ®.àJ‚övÄ„ Ö�´Œ»E$)Öp©wΗ×Û8o–%óLäˆ$’|…oÇ|Þ.Yd¤Ê;,c & ‡<ÕhO>ÆìÇˋٵ{bÏG{uìá¹B5^‹§;<ÅÉéOjb²!�_ÃË� "Ú  a²áº ´µÏLŒ Då©âJ�7ºf!Îf£d˜JŸ³·¹‰÷õài‚À¨|ªu"ÑõcÂQ¥÷4oV+Uà‚lAá¶VìØ î�§Ä›0Ô*~ÖA¼GJ0ü„Ö@B %&ÔÏdû4q©ØjÀq(ŪýšüVq!=W9Ð]Dóga6¸‚Z5, YÐU�¤jÇtâ¬ë¦»ÅÇq[>µ„ ¸‡;Š|¬Ð–7 æÑ¶R!w¢À>~Øn�pHj¼2‹ZfÄ…ºÀ 5Bظ¢�˜õE5ùìH^Ób.OY°¿vÂq܃ã{–‚¹Å%V+s]îÞ²f7Ö€„÷›&?4twz͸ëf#(ÏäPÀ!ªšQT>ÒWi´ÀùÆsšØá•ò¶¹Tu�»DókJ«¡ìýôCåÓÉé©›ð6,k{ã§Óy ¥15¯Š³¦W Ýjã|xéÝ’yAêÓc5á®|uÕëâˆ>Ö!áOñ4U¯í•î"¦|®­e÷©“X@q Uj÷Ì ~Õ¬1¬É² ñŸ_MÃaX¸1ÌU%áV¾§ï7'uÕýZ‚³•úøÎ¼±€Nšd’#vÝ!ܯÖ㢯1sîæÝŽwwh»Q>ÄtPXº¶¥/*^øcQRN“%Ôµç -Ò3�2Dã0Âì7й¬9¾§‰lŽHŸOhXypÀ�5ÍKhzú´j¦õvS=¯ ËØúÚ‚$ŠŠqÀŠSÙÛt‹YƒAÊ�03, OKÉíIÕâé^Æ}ùy°éÏOvô{sz~1]ñYív¬&VaÃEˆa Ô­��jû¼jºåfN{�«ôCkÒ'ÁÏ„†Ùª[ˆ¿®¦í'~Cl#ò§1ÊQž#&Ï I ^�]=„w±~Þëæ¬B¥—¡åµ®~²Ÿdú”W›™ªZˆ\íJ\¶*ò‚7íàpÑ’Êð_ë�dòptn˜¤¤Ö’�¨ A“V»°Ðhi†´ª î/ uýlØÒ»² •^ ¯µ4dŽ=_B—°[Žé,¬ä·Zéb´ä®âׂÝF WìGx!8÷&–âš¶÷àøhÖzê¾ñ6þŒ¢LO‹Ék…ú:€QrìIÇq �«è|Uuæøwõ¶|f•ýª¸è€�&°Æ?M[ÒÌPOC ⃹¥™Bè“�æþÒ­˜ aª‹>¬å^ƒGTaŒôÓ½ô&Ô}…nô=:w„ˆ¾eöÓÄ©ž[¨ÇÛ§ÝÓë(|ƒìÚÿmyg,þ+ˆojOiRSßÒ�k’cGŒÎM7ÄßܵKЇ‰;~!ožÏL) ­Øãüz)hïvš8Ö(«Ì·i�Ftéûå3íXÖëÖýWqöB 8ÚJ`Ý€Ù>Hî}ÌÚTÄFIþ sÆ“xß4‹ÉnOÚ¬Yh ‡.—;yÝf�CÃ’¸õJWŒpøTûU*t,þ-3�ã{fGº—œ¦Eã‚õ&á¶2Šþæn X&U³á³½a/g‡4uo'Ò�žÀÒc¤”?l’¥—€Ûc³_ÎzËa)Ý€¸Qn4ÛÞFÙZi8spC{–yïyþ^œªÚØÉþ|eõ/œ‘ÕƒPÿWs"ºô�* �åª-I|ˆNK4ð?Yºx¾OÛ›‚€@¨XÚÆõ3S;ÉŒó `�Rú¢�‹B8vP¾ Ë«?ÖÙùCȱK–‡UùˆL¯é 7söoXq/äUñî�J§ÜvXÇ¿†ƒ¼YÄ»8”Uå$•4~:UE™æ!…>ÿßü»ùÿ�ïÛõþÀGà?�õ¨‡ù PP8 ALróþYÏ‹ü>Ñ4LܽÿØ=Å¿Çõ}̆LL"làÙË€ž÷Å_(/xóÖèrádÍ�¹HX¢8eîþG=UƒË¬±b®‘8ÈÚâÆbh g( H”ã )ÿ‚Ùéè@?i+úÁPNðb)IõR ŠNW†œ>U\“n– ˆïh/Pþ*ÈdŠiOì³ssñýaÙÏh WÅOá m*glšQÍå�øÓyT®7óŠpÁh> íRœ<"Ÿ.6î©Ä©ƒ³$ ‘O=UÚîÿ˜·K.ñh;"M(¥XèÉæ�}:4Gžìµݹ¤<#Â5áç=Õt“ƒ'DlÒ!P1¢Àñ©éBBLšRçgp»84$d‰Ú G†€{•Nî�/Ú É�*RGåé’•È�§†æ�x�4üh;50{#ãñ ¯˜A¤P” |†.p MHsL�æì‚;ª¹ó?ž‚£ˆ*1èŠ9ò” §´¥(¨}Ï}Œ×X_¾ŸQoØ(uAÁ„Éký·N BŒ1è)mØœmß÷ú9@žÄs†å–ލ (vÙ Oçrºo¢o³Á}ÄÆœ5™§°pl‹%­m½ƒÕš7+xU¬NÁ�Ñ÷<[\tbj�]Tk„¬fZÅ‘lå*Î½ÂøÍžOYŸ– eܨÙ#/Ê«¨ßîsð~ýûôÚþç9œ¸ð‚|»]›ó ‹ë·fKŠ\EC4p¬º…õg`#Œjþã…´ÜsoËò«iÖKó|Æå(ADlj»fà_I•×ßè?~ü¶±Ž¬—ä}ßÓZ¸_˜£vÓ"-è‚i ;o=#¦öàmËÑ+åhžf›ó2�Ùü÷³Û/­í&P¬Y\µõò;DNèîžüFrNäc6?Æz2%÷6à0Ár¿Âfê?ÕÕžqXWb]´i‹.A˜«žº UÌÇÜúëi¨$3¯F¬áôóœîÝ8X¥úË XÜrK#¿Þõæ�Nݳf!²¦›Õ“dc‚ï˜;ðí‡"áyìE•hˆ‹�¸­™¼ïE¬£…Êc£ñ*�8‡>|iy–•> ^Q„_2/�X¸©ØØ6=¬P©à1­›ä…²T_¶‹MãK-Òâ%ŒûŒeÉuy1ÔSÝêV¾�…ÂDC\“6å ‚© ó€‹�Æ0ôVOŸ™¡ à¢s­qàè¡òxøáVÈ+*ŒŽ¥Ðµvêxš™Íúƒ¡�Û¢ eXc’GÅN¬<«FÔ'º¡¤Ú¢/5¼L„2¯d¤†Y�B[mdÆçÇ™W{œpmÕTëæý±h(@e±nß [%Æç¦º“jʯNÖŠÞbìýHI=K–G0X[Téé"ËŠ3zÖ.4 �÷@U²_ÛV£\YÃsÃ�¥·ajÄ ÷Öi«‚ $§”2ÔC‡%\x¿²SÁ“T2`ù«¡Ÿy&Ïp{s¸�æËý¬$JÛ=�n {\vNïpl}ŒÒ´5Æ÷§ìOÉàQäà#À»›Î›ç{.ÂÛïx-{뫦t2k"g7À¢õSgÂ`$º¦aœ‘À°µ`Yzä×>)2D.—]uW>ôC]kÎ9¹]_ EÂÜè9”³¨¥o£T:(®³ßIxzñ¢Õq0ó{0Ћô†† u2�Úwtµy+HCƒ‡çÏËŠØ-&C^ñ†b'¶­6‚Úc›v^¨:4 ÷¦¦ú ƒFÚò^ï W,©¤΋~²ÁPã|^>à•PÂÕ¬»ìqÇ_ÊõíTO-ьȹ¯5@`”Åz–_£nd�þ(Gåñ¶M¾»iÔ/­…ñ$&(Ê\2¹Ó uŽñ`Øç/a¨0‰�´ÈQU@”­¬‰Ð×võe`ÈÑ«}‰`ÐItbH¬G`ر»É}ÎEiÒ¼ù3¬Öúm|q Ã?:嘎)Îë[Œì’ä:¨È¯¢;ǵîmgÐÓ…›Ÿ'F¨ë®œm÷D•Àiä~|ëM›þ×Ó½wKYæ8Zˆþ(ßK¿÷Ú^æix¿£üPPR”z»Ï|ö½y®°xo"W¯Ÿ-“™·�g!™;zY¤1­PâÒ±JT¢ûA£ÆQ½Ç�¿¥((¿·Î\ý,½¶fÿŽÚî‡sãj=ý›ü[˜øÓ  b‘~"i Ïç]s‹•ÕȨèo‹:#S­GdN•ÂZYø(áç¿Ùö4fŸ˜ÚÈt€>,\0Žt¢¬]}Å!¯(«ÆJn#ÏÀùóä •±›…õI ­d“ã•â–#˜{Fµ‚¶1Öö¢ãÚ܈m«QP).b¼Ï÷ ?>|Ÿ%pÜK4�VvdcPP05e›“Qæ0H§`Õ€^Ñe¸ßáô±D±C›ü$:Õß ‚<~wŒ©+Œµ7ÍàkO­Æª.x4¨Ûa«2Å …›Õœ,ð÷¸ïF•µ®tGÈ>Z›Ãäˆ)wÛKZ¹ºNgx²[Ñ pqDPØÛ;t) ¤|Õh~”÷˜øÑûAÙx@²ÚϯÝ~™É 7/ðð@k±…¸U½3yi¸¸\ÂWÌG!i�„‚†f3; +´¢úKAØ”°ß2œqT£¿wB¸ ™½*õ ³‹–¾˜ÔßÜÆù&ÞXç2uÙíª‘ÞX\î´/ uÏ–+Æx7îúÍŽ�ŸqkO¨”±Úµöš$pxžh—bôz´bÕÌ/ se � 4ní�ÆÚõt³`SÑ;_O£äVfeµ[J,„‰jµã2qB¨Kàs+Í¥BóqW¦Œ¦|Ï{_˜u5Ì·¶pè-P²XÒUÑÕÙœ­ {Órw™‡•hr-d2E ¯Ã¬ ñ/uêÒþ[®åNÆ*�€B¹.°C/`+e<™Ýî†ò×m¹šfi-oM6ûy‰;g1ÀÉ?zÎpYs(îÀìí æ4—ÌÁâc¤w‚qÂDË÷[å~IÛÕù[ÞõÍ`P´Ê·ønäêÑj²ãªÜ¿”2¶C\a™5ìYáº$ÿžæçÕäÊ>txuÐ#£Tì.yÖø3GjÉÓú›z Ë{Ö¶uLËÛ¸ÎêUйß+ˆÛ«O˜±8 ¬@[c€† �#)¨å™v Õ\ω¤ **ùu$ <) Å&–ð­7ÓÓ˜Egè!®®†Ã�AŽ7¬u©àW¨²œ‹\ä©”úý�cª ûÖã„¶'²Æ( L‰yž©Aœ,^¢Õj]úb(üdÓeÃh‹ƒÁL9.bÛ _´ÊºV³`½´Än¥,´Å³‰ìs ÜÒ,­žJ¥àÑì™ZÇQ|±Cƒ/í¿›mU·¡¼7ϲ߭wpÍ‚*þ¶¾™ $V!�øt_+æ£Ïòaè‡uââC¢j¢¨ÂȵË!/ÔæÛy~8Q{&ˆyá˜ÅáŒ;~„´þ“>/8ÿ�Ÿu�h ü3@í#¡Aænæ A•Þ9_Ý‚!Cî”�‰”ôê }J`‰– ³b¨m–í‚}ª#†Ëæ?޹t�Qï ý³M¾›$è1 a»tPl±žäÎoQÅ‹¿+Ò²€I­ÆFi¡ø±½XQ‚pÆ÷•òÄ�Þau̯`®m"Å¿9Òˆ«]n²Ø<Ø’ï°Ígg+Ýõu¬Ÿ¯ ïȽ{8p‹»n5öŒÿAL™޲4­¶ôê/3(¸eȪ•Œ®…jç5‡–}¾­9Q-ã>¶+†¤ÆCRÕ5Ü’‚úQ~¼qþJ”ßÎe^ÀL×Džf×F´‘†±pú.#róQ˜#nf¡BÂÆ[w?©8·tŠŒ�®Èùs¯!O.byµ(­ò?¾XÛh¤´½]g�y–Ȧð�ØUÿNß&ÌE¾ævÄ9Éïfx ¤¾D÷Hé$ 3½h΄ÏfòDv÷ÙÑÆnç�7z?·öŸ^lç~øiø×œ-ÒÛ·y»îߪo.²¬Âb?ßÞ††ð0dÉ[&wQç’Çÿ °Ò*wÚ(† ûˆdûKÂmãYò À "o òöý�ô‘ƒµtÔ„Ø"T‰ž>ǽkX»¨M¿Wêèß&{Ï©\- ÒV•r¢�Qn­‚«Í¦ÅËÂy�Åè8ÖLöýËyþ‹ñÝ›FôÖµ’÷ŸyÍZŽ‘Fl‹¡ÖðÖœµ/«·¶T3»éã¼G¨(�‰©áî yBiよÈj¸% lþT=´�uG åzÄš²½�°±v¯è]òöæ©´=íì×ÕW:P±\u­â¯-ü‘~·¢Ÿ6sIîsŽàΘ2(,Þ=éèô‚Ðë†eP…¶"~àRˆCf¾�¯o¾TUãŠ7%¾Sc•Z Ü"þ¦›µò «…L�4Æ1ëYÎ[ÏA¹‰^ê¥BÄ<Þ6Gm�”™CaÉßR:æšGÝWcfÿ`ýûðM€Y«ÛqÙ|P¹#�ŸõÏ®ÊK|¨6óâ°O Õ¾Üë3Ó–™`°,Q7 f8:«qݵu hgñŽé›‰šG¯ìñ3jqÎ)Å«ï»Cê=ö@ÚÎÈ•Û*$EÞXn"x±áL¹µ¬7|/>�‰–­ÿ-¼gõUý|L5ÂÚ;`Sn쇩Ï<àxŸÆ“ªjºÚ¨RõÏvc;|‚³fÅ“1ŽO®’ &• ÊzÅð{ ‰Ó7½΀¥6Ž¢Ã&¶ªÆ©¾íûø½€QªK9-ªPȳAµV’íc°•Ÿ±p™Édsy‹âßUèâu·šëyò]�>'3UË.HZ7åí½»ßKáï®¶nÚ \˜P‰·>5ùÉí*P³äJ3õÎö’­`:Õ ye+uÒÅÐ’õ‰uЫ%ò½f`»–Úç»ùª‘è �„¨8)ÕP«8>��¥"±,H0M—ÜV¾ÙòOó(É_@áÇ&û|ÄNö‚ G�é3v³²T ‡êñÎòdôê8-âl~^iµq††Rޏ v<Ê:„ õ'sm…ªæË˜阥Ýfý¼tòE�gj&fƒmÇ6çÚŽ¨)Û¬—k,ex€Z÷;YÜË,�¤sy«-d8¥<ꉚºD©ë€`@–;Sœ ¼â1dË•±G‚lêéEÇ ×înéûeºKÅ„†“?a»÷†ÓwÍ-3ü+ÐŒP ê¬sŠ-�ÿ‡JÅ£³àœmµ‹߉{ò,4·“{2Ruè’^2dzN^Ïl­5¸|°ºýkÉH�#ç À¨(° µ6¯Ö;«êµtPÆE.ay\]Êa»Þ=ç·¶)$Ž Ž=Ǽ˜¶dO�-¡wK,º¥=•ªÆ8ãœCSF4C=€´Èÿ3&’(Ì Öí={˜{ÕçbZGÕí\Ú%˜õ"aF>©é]õ–�0Zg€ÀW4¾j�¯6ùoÒÛàŠÝt�vnš°nvýúI{=Ë&?ktãÎÔ8Ž? ™Õ^oQpcÐúôB´(äYÙ÷Ȧnª‡[ÑÕ[Í_gg¡%0×1XèTw5ܵ¬[Ï"#ï|¬•+Iß:ø-*&XýŸybøÈqÝÀ^³›ôš{žk ’l»ˆ×aew»Ïÿ’W µ,Á/ãO=ÔÒÿvssí7„·èR®å³ !ÐI �¯‘(¤~>ÖñeÄ™ÚG ¯¬( }k½qú}Ëô¿©ú=Lkw™ 1¡2c} úxFØLy-b|xA«½ïsØ^”ÚéXu¸�±‡_×µ¤ö? ?Êm‹£{ˆQ]ZÔcœê¸ù1ÖlÏŽAÙ–D X°M š?[XÅŽ&½ÎWc *k|>óz£š—¶(0';Ò[c×D]¶ïg¤pvÙõ.(.r|[!õ¹¸³ê}` 1ÉÀP| Ý€ë[*V!ã5Ž4žkx5­D¢cJ6½àIa&³Ã W— Q§û:Qi‡Ëwô}°S†Œ †ç›‘渎Վzø�„h9ß¡Yt2ÑÖÞOxÅG¾áÄpYµ[dWdÞGwȪÐ>�Žq¡)|ÙÍÛz·Êõïˆä1f%ôê†$÷�ñ½Þ¥®d·. ÔX�;KÝ8›ƽGÈ-æ…hƒÈ˜Kã…%>Ô².´ôL9£ëÜs·¹ÏØñítj /Êê¢�“´5ÖŒ¹:µ¶"ù0Þ$PLT°,!¤÷+§!¯AÀÃîUŸ˜-ÔCæàX„ðžD¯d’ÁÃ"ÿž df–ˆìRg¼FÛ`ÉUÏ}ÛáJÛEÉÚÒ�eòâæfNÎÁG&–˳”T¦ÂVÚ4¡ Ø(Ì é*Ó·R²­O®wv”¥‰³]EëMÀÃÍN3†DK£f#-§[å2Bƒkë˃O–±ŠN± .B H É0u8Ð�êày¥ç-sTüþnQKáX4ÌßTwQg±�„nÉ6Ë-Åû¼1ùû¦&‡}R?k œ¡ù²ü+v%_o!ÐãÌnyšÍm±qoã„ìÑ‚–R®S|£ž_ÊÇÌž4úu¹Äx(µ©š*,kZàZä6»!¨ÜFÊÊe ÞnØ3ÖXm¥ÎS!Á€Ý‰û–K¿à� F’´ú�Ýïó+³o¾½¬Õó÷Àùýi -­ ÇßkÉžƒ}+úº}ꆮAæ³öã÷Y DÏEo¨�âODb[@`ÿÍjz…R )]*ë(ºJ’pýgS>ÆùSÞdîÖ–�´éÌ[á˜yˆgxéꑤÀ»Qš�µœÉ Tß,Ì¡EÏ�B?šªùómm'|¿á|¾{QÀä�Øšº7ŽäÔZ�ÿr&Ö� hû&Ôcä*¶OãaÂÖŒòm«0–…=vmcAûÉm_ÚâW/Io&>"`Ö"äD˜sfö”¹Š°寜Ãp A7‘—©­rt\:ŒFv%·wZmŽ5¯Žt«r0È1œ˜ÁÎelçV±®nÌTu[>�À;l€�YÍä�ã¡¢/�îÝè°aà–íž2¡©7CšîúçØ®æ_JSi<#�x7uÞݬ¬²O_EoŸ9~ºÎã¿R ‡D2ÏÂiÖŽÅPdfÊDý'D#¿Ö5ýaZiÅð=¾E¡‚>M?_�MònÊ:;Þ…`8åÚ”2ÁKñÙD ñ€¶Y½ó²AT Ï–9´ï1zÑ1l©¾`ΛžÏÙaS‚â²G› + ,lJš�"ù`IoÁ�‚×~6-¶É¹è5^Ãçê½úè|Ä-‚e‚˜¡Êý»B—l qx&®Eö¹´è•'aüú _nUAö:—®8©åœ³™0;›º•“P\·˜¹wÝ�¤¶ Þ'Op@Ê3Ek íÙ»ÖE_ÁË™îîƒÔ3À®x¹!ÑÅùPá;V¶�\Fj!@� [O;]R œ‰ ¿*é÷ƒÓêúŠuëóW¸iµm?æÀˆîþeQà÷õ¯�ÝqE”5rî»KÍ]ì«%`òfÉLè"Ÿ÷å‡Â-g ‰ðUíc!�²dh%tABˆ‰K,œ¯–Ç º1œ@þ¼¿%²7*Q÷ª¡å6…•j{Û«ù@ìqkjઃP›�|6?7Ë ~Ï_îë?XV~æJ ăÛ$@d«§Ä¥Ê2ª}6ïËêôQÝ ¼çÕre÷Ãag³a°¯$¸3¸KYw…?Z-Š�¶äíú¬o $ü¿s‹’ÁˆïsÇ L×§»՚ŒjÝ“: tÍ,:zÙVLºá ƒ7�Á}öX/‰c+NÛží—ôƒÖ¦�ƒæ”ºv¬Ÿ88œ+®•ÆÕ!“ƒ¡ÅË�ùÝü¤…n•ƒ‚÷>j°s~݈ÑþÍ“3ÚаôHDÇ vÚñ~ŠÒ¤OrùÔjGSÈÿQ0Êâ“–¹‘’·I™=¤æ:2§|Vh»SÁ¾Àf‚‚’ÌM»�çï·«Ò¨ë餽ú  ×€µ÷[×Nb»kïÔÚ/´^¼‚ry4  Á¼¸÷½ûí`C°>|6öu:?[2Ö–9øB‘m{…М‘Ããõ?‚g5«3ù#UŸˆ·Ol Tò8ÏøŽudsLæ®æ�û 8•ylÄ9 �oÅÏ.z ¨TÎ8É•`Ø ©}H·²a§C¬:Éc5Úcc‘FÑ�å· \åþšlå9±û–Q\¥�|Íœ÷¨’WåÉ~*ÇËjœl½�³…÷x–ß–þÑ| çfnðû�‡Ž›¡x ð#¡ñA‚ÖÞ¾Ló¦=ë6­å¬Y*uŠ;.÷÷ëß–£H:nº[f$u{j‡½#Ø÷´a>ìR裿s[ß¡=Û�Ãm÷1μþÞ­eŠ ¢Ö1â ß½ˆ}#5ëÐkŒ3ö—ep@<\ž,—Ù¦Çç@ò¬å›à�SÎË[PÑ<é'èTû¶vîü{U›�>SÇlÈË�ö�!°ÑÇE@«‘�Pˆ¿CÄÃp1o4—ÇpÜ=˜fû˨âg(øQxÎܶ'(²�>oÄ’®‡W£î#3SY kyòp>ñ5Чv²Æ ‘^ú2A}U¬‹[ûÏ{+„É*] ûlǧrfl»½ÅC/¢ÆŸÜ-A ÿø®'ýŽpßFØ·L]dÖÞg×K° ¦çƒhtÄ×KœÍc&°+’wqbqI¬ä!E¾¿±kÇZ eztX³±%´i]¶3ïà?»FŸ­Ùßèˆç‰Ûá-à»GŽâ ×ËVƒxöh,çŒq€›—ËkÉ9Z¯ÞãᦻAêí¶K }3‘O‘W @ê6É]„ñ ™‡ÊT#$6? 7œ ¤õm˜”‹á9Í¢hòPœ$ ³gvR³½=;àcÄY£Ýá÷ N§ ŽÚ4‰žÛ»3h÷E�û3ièvU¨êÕk޹%æD c7�hZ/Ê×—6œÙ‰Š‹Í��OÀ¢ØåŸêÚNG|Ö„D_Ì×�}FôN úǽQ yïÚ?µç{U÷½|åÒµe¨ÃžºÜ4ýPÛX£k Ê"}¦ Wž ‡Œ”—@ƒ2¼K›Ûx`1îGÁì×z©¦ñüøÁoæã3[ÏçÎŽÞ èÍ­‹õì]µöá颦§Gذ[lBÌ„epŧ²Gjï�cE šÂX¸.0Ëð¸6j©–ÃŒgyµýÖÁPƒiÁ>#Î_Ëwò÷µº›˜ý�œØÍ&þòÆS‘% Ñ$eÅŽ-,ᥟ^ô\M®�[m ë’�±€K)•1¤0CcÖO7¶ Î@î5èpSô}ÖÝ€wÒ;Fxç^»ç[šèþ¼^öÓùŽÛ) ¯N ²£ÌÒc$¢>T<èrsãb #—Ñ'Ö ¹q~ÖpR÷9ÆÕ¾Ô¾ N¤°†ãm”OÓ¨Ä6¹¾ß‘­¾wkexiQêVX°aæ/éÍ7=Ô³o.Ht¹7 ¾uG¤C� Ø×Œ±�â²®©fRKq…Úéﺫ;Ü ½]Üô’ÏI !¶cÁDÙvu¼|£¨ €nâÍÂÍÀ'Ø5;ÚÎn…\‡|™ W"cîQåuÃÒðËUœÎð{ÚÍ‹§6(¯mïu¾Z¸%–Õ|Gò/Ó^µ·­Zwh�Œë œ¯Àr>ÑÞyÈ>7ô³èÇfÃ'Ùh=Ñ»«ÐlDˆ8–)©Ø©3¯ ^ ´Ø¯‹I& ü­Þ´ðµ#‹díL F™¿7Nû€n&»çGÛÒ¾ý�†Â±aø ±¢‡v‡¾X 93´ÁÞ'àF3»àûÅQzihΚÔìÆ›KuÙ´,¿çm‘àpf¯ÔÃ`l�0ÓÔÓØ;ªÂ})qÎ-N^ß~ˆ²e¿X|"Wæü;X|! Ä«ϙé¤îATž�qäñÅ;¨†Gš;Ö”Ÿ™ˆ××Àn6| 8¬¬>²zn”Ø)¾IMŠÖ°„òÐYIb‘j9sìŠ_|\Šž#2Ãc”<¸j7�7í£–ò‡¦´ÚèNµEÈ7"ýÛKuÕjy ”cb[6ZYû�þ²\Ab²[&k’ qW9)¬jë‡0-ô^ÿ¯�½š’1ëq¢=ˆšùƒŒìUÑÂ=µÛm‘!’_½ãf+Y ãj–1µ™mÁ<(hŸe #­SoX3KR“µàØrÙ†¹»rÃ$’±ûgõÏí±u7)×Õ°¡È¢ù-æRl†�ƒj·ã½NM1ˆÅU°_Ó}ª)T_x²[ ëÀE ,ƈk¿›®£¶#QÉ1Ìq°p„Äù¯™{j—·Ü|î ¶Å“Mq«®Ú=·®2òÓÚBÕäe³gáúåÐD4QU-–•Ye{èý¾NΤñަž 3æl‚¦EãÛ¬Ã8ä�°t)êµì YdÝTÒmf gOãƒ`‚´ša ,Ö×Å6;|HÕ)†j•xWtKìyvùÛu�H&�ÑáúÌC Û‰oË`ÿºÓŒ#I÷ðr:® $ÎæEߣcmh§ùXz¶@GpGro¹Òë|]àò”¹r€þºM§÷a°ÿŸ.ú^úåªÓ®öP.jÏÀk€À¨�•n 8 uk¸½Qä-qÀV‘¿^õH. òh~úH÷UÝÁ ¬hL5uk}[ÂK”þ!ùon^Ö|jéùœÊV†®ÈÒ¦t�X½œv6ÞùF&ü`3íÞbÕ˜a‘§|¸W�lú�×8WÆCc,Àj¶!T�½Öœú¾�] Ë"2›=ÎöîÈÒÀÖµùW©³X}šy°T”kŠx¤–§ ܰý/Ô~ Ã=—¿Õˆ‹n;çÆ íPA¿RNIu¸»­á3ëcÓßlšŒW»"²ÀnAt„Ö»žiL‘5[%?½× …“Cß¾Åm;Ã~>÷im)‡®b—–Ó¬ Y—w«âX a¾*õs'Í–¤D¬ó\Õ¤gÙ]G òÛ™•[çåa#ò¯�a]X͈3 y.ÞᇱòÚ°æäª ºɵWBåŽÆQ 4\j2ʵ§Ml âP §’,lüpÎÃ�Ð6@�-YÑ´.Ù9_n¾ã�_$9àwBtÒj�Ùä Æ’²ú;ÆôLƒçFÇ\ÄÝÄ w� ×ûv ‰H«·¿uŠh“úÖm"{-ÏܱDá¯T³ôlÂìž!4åg×åZa5µ1îíÄÒw–'çêQ>{Åؽ㎦ꇸW?èâáµ>lê|à>Îö�ÐGÙWÖ‹Cˆ¹•>oE:³®" 8îLµ{’󛃪†k%®úм4°ê�w“ V± ^Ò¿ ~Ô8QØÖ?rŽPÉšä·\q¬·Çž-ÃÞ?NEO>^Šr&<­DHE¦æò]ï Úku¯8DnçI†~Ÿ�çü<¶bO¼o8$ÅÈç‹ä¼"ZÀ¨ _€’‹ ,Íû«í´$Õ :´ ^<Ï|)ƒLKBŠä #XQRºÊ&n“v‹¥^Þ…„Õ¬ÍÈÞ˜îm‹]z»ÊÉ�×ò ¦ŒæÍ*ÒxE(s›`I�—Mu“hv€²r±H’ ¯²ÓºQYÎn6®oS‡�úë» ÜªJX*{ž+CŠ×k%�èÍjƒs�ºŽ ¹ÌMÙi=¿>3·xb¯œ’É ï»8””ÖÜìËi1]ÉPçDÃúÁé´3lêÈAtzéRêιr–¼áA*g<+F\,ƒshžÕ'åô�:ß3…n9<6MÖÜ cf©oKöÕ·Nã®AÈÕÇeåÙ.>ÝûZ‡ÜÛ«]ƒ Oe…5�ÌÚ³Y²“@˜å—YNbQºö\ZÎͬ“¯e¡—?ê˜ÃÒˆç @ÐlŠ÷vÛ³º4©Ü,9��ÁúéšëQçv‚o*™4§=«Ph�úÑ¥ÿ* �%¨.X�Ñjó—úiÃLwžƒ œlüoµAcAXŽe1’|,ÛÚ™í…M’ðŠ9Ñ¥)¯R!�:¯lÒ 8bµ`4G¤TÓâ�/â ø�Ù¦ˆÓSW}WLÈ£Añ¤AÐxDšPšÛò]8¯Yac£NÁF‚¥Íë—© À8ª±¤š6�¸ù3ÕaÝ®Ží¶d)ƒJuù|h;,@¶Ð½•$ÑBø¢2ji“²)JºÇ�Ô§†š4¤ŸHi“Ѥ»·�r¼¬ì‹w„§D q ‘ˆΕˆ$ 7 W(R#?8t;8 \H4óô·j­³cÙ ü@õtîÙ I%Dê– TúA p€ÄlǽµMÛ÷�A¢³tÔÞzqNw 7uAñ¢#ÃRƒ¢¥a9Šp�’îPßë3SÞ � :#?3 ‘£Kš"�g·C}-ÝicAb ¦�,h$�²ÐŽ…0@�hv€ìÐXÔ�£cRÝí6LeO󮚚…³²ÚZ©vÉáð‹²¥ɯx"¦ >kª%WnÔ¥j…s¶Ñ޽Sœ5‹‘øÐ`�›­‘KPžÎÍÍ9òèÑx©šª\ÉG'­$~#ZÈC:Ò Ð(ÐmÐpj_waM‘ù›óÒ )&�Ú{&5Ò± iáÉ �e£`<òÌg¦D~74¦§‡F‚l‡yCï”wV }4ÐG#š«R•" d#|µ:47,ÖÓàŽ�HÙÆ€·y`>4ö¨R¦‚¤d1ý¶x©ÃáÙ¤]Ûñ§ë©1˜‡ Ù¢„ ðŠI.2oÚ¹„,æçŠ?><ÛPdŠ‘Šª ׿¦.·µûò¦�Ó$L(e©é“LûU˜†!²€ìÒòÊ˶—DÒ2 ©§„×BHîÛ³‚`Ðx‚ñ§ç&�n—D.•Þ“RˆÑÍgSA¼!,‡›TgR@v )ÃßUjd€0ÈrÈpø@Ñ航†eUxxt�ƒšIáØ:#†÷MT- Â7ÚÑÆsW±ƒH7jôôʹܽØEF”< PÓ;„{,Fî© {¿mAb)$@N·H�±üB5¬6=&Œ»®nI‡ïW×a±ØÎóÍ8©d8Ã=fsÙï,R§«:ZKóÖØPé´Ta(n_%ªK'£Ø¤ìû‰0ϺV 73�Þ³™êØ2W¾#!p‡ôj‡�×Û2—ã:Ë>QKvNLxZ7@L.róÄ�Xc)aå”]UÅÔ•nžCJóD´ ϸ ÚÊjGYÇÖv^-þ ɬŸ ,Ôj·.b´¯¯”�î.£ôZ'P\XfçÄ(ÓÚ]hB…å°×´çb_(8 Œ6n8;ôIw¥œ2ô}_Ž‹]Ù8‰¤N³`¦…PÀ&‘ǵ‡Þ2{ño]7ŠÝŠŒÔ_³(y04kE/ŒTòô-­¶ód°U Áxëpºã¥ö–xáȓؿ³Ú·ÞÖÇ¿}X€Å~çÇ~ܻ逯ä7dïÓÎ`;Í×8`ÐxÆðãã Ïé»0ù7¤ ½/@—¹›ïãül˜M!ã…Ç_‚ÿ>€þ‘ù‹BX¥´oÊäó‹¸ [kÄ1Pz�¹X^þ, Eæ ÔÜ ƒƒ€=ý:zeñŒvÚëƒ$�`¶Íö—Re¹š6­X$qÊ!™>`K߸_±µH©ÑVíQiÀ!‹…íÞðpW!"0íí¤�¿|ŸCäO¿t,àÛO×;A¼Ä·ñÓX-º@ÁÂ�¼¯R¯¡NGìÐHÌ0ê?:;«ŒŸÞžFâ_äÙà—Z‘|™X¾=LàI÷!.ë[fÞ în)päh¯»¶sæ}ÖÄ&Ki™m:æÄ6‘¼¢$' dÂÈ8 &ɃÃòöÁÍB’ûåÇ­tsÌÜs¤Ë³B¨O{wY¹·ÑL÷¹B3m˜£oyÎ{®²„í$ƒ1Ôqô-ô–ºh�phùßô>\ +�h‘N&¬¥åø~޾¸åËXnRb+ðÛ§Ó Vù§Ä¿Þ÷³ž+Ùé;#jR##¹ù—çêP™ÁÓ>ðí`pÑAŒ7AMI�y²’}Ê>os~| –SßiÌB,ÙHI¸²Àaÿ*¬.‹!�è}gl`æÆ  ‹Ì¸á¹€r@]ßM쟔ݰ-ø<·*Þn´q-³@Ã�³Òñ¤±ô Ì`I£oØFÍN°ñt!)&àÎàõúi!âaÆÊ*e›£_|k·Ú[|¤Ão0#[EÍ£îÚ œS¯ÎÒüJûx=¯JK ŽQëÅÔh%�û+¶à‡€L,óØ rµœ«F´DÓÍ:�(¾È7Å0à5±€¼íŸiT¸Æe~åŽÀÀ] µô «�ì>Ôš�Ýøœ{ÉO B§/¿)åqó]J†ƒÃšÏ܉´IÅ öˆX7M€élôA6˜uÆÉ|‡}�i¦ÒJ}pp\„e�òPNa;-m€å¦L•öêz{ßì _:[ª9)2ª(âWd[:è \óóÎÜ5³².J¶l¶€áW6/Ñ;~Ú.7ÀB¤aDkc¾µöžâ­uù÷Y’ L[‰c\ï[¬ „þ`±ÜEý»NOßÒ¿g©^KÖDb§S—Ö3œ–Ó‰ÝhÁlÎ ÜÎá¡xFöCæ»4fÔ¥”Ô|Ò�öéhBbûLMo™°ªöÒ ioÐA†Þ�{`8Þ–Õ€tÏg8.pÝPl¨UkFB|æÑÜ$5DîZöÀ%ïÂÁÕíX ßÙ¡ÕpΖ;:Ö1{¸¨mM±�íðÁ±‹-•Ùû�ÝjÅ &—È;Ý(¾_ FŽ2rº�Oq3ÏríöR¯YsRu‡ÄóZ ´Ç„PˆÖƒ&M ”ÃCL†šÃ&q¶£çÈ–SŸE”q \µ¥É^›h�Å.­ v¾ôžÌ�¤Õ&—gÒûÿÝy6 û×À[æÀ/{¨ÈˆìúÖM:g†œ*›fža_(ä­%bå¾²ž ’* ,}ý¬^¤¬Z³q o ¬aXB%UØoÀA¦X !;¯Ò‘›¤á Rë¨Ü/gûNMM=pÌÍê4¬m¡ü/¾31±�šmì‘FcÞäsôͲ¤ž[1IfU°e )‚õ˜EhU£§@ùö|1]µ0k1¶]¼Mzä1+­ÀÀãméqœ8ݲ²ÍâˆÐ‰@ ±Â<ºÂjÁÜ()ßö{ºçK³èª¥€Ö·½³ãBR.{>d&ô|íQ ^Y‚óùWg0²”!­Jz   ZîÁo¸ÍäÔ±ƒOÒvX}O½–²dQÚ¥îµãÏ@Ù‡‘<�Ët£énUkubGÛ¦þì19>î¿`Á—±å�^×>$á—Œøp¶šiÀAÄýÜÑ\êÒ0ãošVL#‘_dƒ„Ó…uÆ5´pGL ¦h’Š&— Afµý:Ëq•Þò‡õð€l]­¦P+ …ÁÞÎ6Ñ¥›™¯ãæ¹Ugä& õ$Í‚4™|ýJbQúY´ î0gSx;ÞƒGĵœÊBt9‰w�TL�ŽáÊUІ§ã Æ]ó4æãsµèñË ñ�fØ�Ü!ÙM¬äô2I8¡06ªr ´Ñf‘û��‹x:°œó-k k†$²ç•ä£ÞAóNÌùR¢¢¾þÔ¾ñ;Ø!ÌlwÝ&ì[çö:=Mf(Cít.lŒ4AS-ÐÁpÇLÓtJ:.Þ‚¦Ÿ�qWœäÇ]„À“òÔ²ù0º5•ÔħvãŽè^.$—뜨aj©'š8 'léVÀï›áÂð㇠›s*ª¿Ê@-=Â0ßš¥Ö:AËÜÌ:Ü5ã= �]3iÞ’~œ[^ Éw,: Q+(Ï$A #µ„Óß;ûŒ4öù�[…ð£_3sÅ}Ãùàúo^ùC;§ _+bõ�!4e-¾#Á{&ñpSk¯qÏI…Âèu ‚O­OJ {üŒÀ ƒèÅÚà»>nì!Ȉܪ°�éF~ÖäÃH´{ð±ç™~¹¤/VÊV Þï"ËO7p¬« ´7‡ÝÿUbÛ+÷[]KÀïkûÙ�—";Ÿ'ëå?†6?¨6Gܾog?Ò1òzÝ2pè×uofÕkƒ¾Šzc6ísÊÏ·>ÛÃ$ƒ±ø Õ~^ù9’}d�%Ý(y£ÀŒÆ핈¾JÑÖÑ`À#Si~i À¼¸($³°G±�²ä&¹Ë †¥=9Å©.&Nw|Èk ¢&’F5ó„¯~”°ØÏAoÝh4üAîm$„ ‘HnE)S±â2Ã�¾4èhÁ诺¶N < °=õ9$¬óÝJÛsÓ¿O8ǾtÔÏ!¸*˜Ç¨S�Â]ªÊE"îÎ 8qÈazAa1vï§¾â)2%yeýmc\N†U"$ÕÕNp‘,þ.`¤œ¸}ðà,1mæÛ $䛣â£)-uô°<¨Í6ª›ß‘9�A6¢ðcáP0ŠcQÄèx¤°\�U‹–0Ûk8€¢a^0ö xYP¬˜_õc–§hågî¤tn�œp‡€~¨.á„6Ș-b˜~³¥”4^Õã/ ƒsh@¾ƒx+G;i!õ`Ј‹`Wöï± D­jç$b2ñí¹„,R+0rµbÑĺñh¼€6 ìÇ9K%C„¤S –ë†:R|á4¡Ô4ÂÛu�ñ ¼*úûÏ@[+€d¨ƒ'ÆÀ"n–o=q{pÚ+é¡q»æŒdr¦:¥à9�}¬[AËݵ$VH£5Ãh0Z„ >nÞSÉn¶È§[ÜéÏbꆤzÂw›i5�†† €VYîø²žÆŸ¸¿`Ì1̆Uí�Ô {$ÛoyC�BÚoÁP•› U²… ز"†:‹sõµ�’�žÙ¶£TêaÞv…Ä®Hþº\O>D­%ŠÁcêÀs\ýŒP¨K²>œ;�ÀáÍ ý�ö–Á•3–{A<#äÇd�`E³…•6µÍ÷xµj³`³fY }6¹h‰*¡>Dgí;ßš®î¤y‚Ù!oØé#�c.AbWæÞÙ“lÆâiØåkÛdÍÔ7ÑygÂQ8±ÞólôˆîÄSâºß°I�éæÂ=—t5u�6(É <-h3¢W½÷Âk…¬f˜”º<ìýuÅ ¥Ôýfïg®F�W™›§ù|×ÍE�>Øb+ʵÚ%¥Ärëƒø—C*ü#Õ7×Zq¹å " I\á¸LäåÙK­ $¬â 7öKô­¦=tD˜Þû ¯À«¬¼"N‚Ιé¿L6� à‡bú‰úصïVÁ9U¦zxÛ+t öai÷ .=Ù ç˜[:â~,kÅ[‰� R�œÆb<Ûãï;æw±îoX¸‘.=$pÿTþé]^‚tØ`Ï$‘O9»J>ws[7 +9À¶…Gé[iDW¼µ÷ g.fµ«ýÖêð^tJ6¾ÑúÙÞ0ö6¼ ¨›¨J>ªv.½% ‹U£ã%øtÌ!Oõ&¬dÐ(wªÖ† ëÔŽ¬]vqµcIÒ=YS¨·`] &S~"… mªDüA•¡puÍãYs—ÉHb±ª Ýuw;1Œ�ì«?¬ OžH3ò&OaîL—µúv<áŸsÎG#aÇ9³„�í ÷$E±ž¸€Ê?H.D«Ẋ'Ï•ÁøŒYFÓõº`^# Û…Õ�&êõJâ‰b5 ŒéÝÀƒ—åX•uÑ¢û¬—„Wèï�·Æ0H¸ƒ¿`5-xß_ëUˆ/ÒŒ<™Îms‰ƒ}do*xFÜû�ÃÑô-Ã’RL”3³(�Û 5×zKˆƒª±6…-"å€Íš@¡*ׯ”E/«¾$Z.xuãZ×Ùž; TMš ôRÖe@Í•‚³Ê �{ºåóâ�¼"w&ñÝ´^EËrvÖõ A9;=Œ=r‘ÌYÊØ¸k"ɴâ�cpî)·àìžÐZàøŸÒ\qçcÙÌ£ïØ}!–Õõvh''y•�%³ —\Z•óÆÊ ®y·!o$:05°4:r5ÔÊþ>è ðlÉ…ºN$‡Ì©V�‹DZ¶Ÿ Ñ¨b–‡qdsù×u¯-ªê¬·áJ9”ӌà p›•«F ˜­ÏÚš™úöÜI­o@tÌä<‚ÎDåc«Û¤:Ò'(àNI~uÙ’_–ÎWŒyÊšiôÚ]۬犰Q¶š5 p²¥­1‘ÇÂÓMòÛ³W€­Éáøz5k¤^чED;ú¹§›–·VÖWo­î_ÂH«|ïÞÅúûÙì÷É4æ{ÞŸ‰öÝõJPP Rë°‰ ZQiñ€ùr^pSÁpàG`R7� 1â|Ý9 !U8æ#Bh†½êÙ+Ò)#H6ü53ÇA¿Ï`p|[0Í€ëZF÷Wø ýGšE td–³Ÿæ)m�žŒ/úãc½K ‚ÐékCix1¿^†ßÚðu£`£›˜­XÆT8ž®Z¹R1t¦µ¾}÷nZ™Êˆ�,`cé¬>µ}=ìh&t_ÜÎT¤�]’ÙÚÈÌïDøXTZCÙ´UóŠÒ�£~õ¤ívUåÒ)§÷v°ùr/N°ñ *áªçÄP[d ö>ƒó}E¡«o–µî³Éç91ç=¥> @å �àýZN†ßƒ¾  &6g6–ÆþµÊÈ`2bj(QžDeyšk�©PŸ¹4­J¹\\Ë1‘˜Ï¡F4ÇTv=þ:Û)dAsñá¶vÊ�îÙ¶}Sxh‰_Wì»ÞR ­…øûz«%:–�5_²PE��¢‚4ËÝVßrZn€ã6 ˜¡Ã¬rîö(oß1¢p„�Ñ»‚eèö–Ž ¨¡g§u  �ØÇ\ÛÁìéí¾½tÉ ¥<°®˜˜8Ц`˜àU¡�‡ô¯Æ9ÂûöA€pZö͵³ 3U¬ÐáÆîÕ/Š@ù1–´§ÇÂ�qæ¶"wŠ p1ó0 –÷ŽwW3ê¬j”h‘C0$ÖSlÖ¬ûj1ê§RùÅøë»%ëHMÞsˆ–€bº $!¸õ!€Âé(ROgPE ňš“…B6‘»‡0wñ)Ù¯cy¼°…ÞdÍ�uûXêm®“É´œ‰.™{§Îær¥qÔ9n�….Q‚Œã*<M»8&ÞçT&¨·7Á�N·¦ —ËêUÎ!ÏV†ÁÅâÛù®Ì¨øAÏÔh+�ÂVhÉ9yP@Ü�_ ö`#Š Õ÷0øé•÷$– -›�e�鉿mô`‹VÄcl=Â(üÓ�,<ú¯ ™ù®Ô¼]Ú­‘ãñ(SÊÛ nåh`ú_ó¾�E @�šq– p$mû`u :‡Þ¡¶Æv‡·Ñ·TC+@Ü~¶âøDE•júÁaÈû(`&=�36á²Ì"�ÚtLJ¶ˆ¦N8+ØB>��: O§£hÈþÚ÷Q£¹»ZQ“Q!bÓ™\@H4™ôë%¥®^ÿSm·�2«ê‘ëæÂ8�üöäá;Í¿p­ó°H;²i1¥„ð�; A¾Jz+ø)·(×\æv²H÷ÎpV "SéUœ†Ð`÷ ÔÚÂσÇ=¬y‚9³>í$çǼ"[±ºs<Ð>»÷n¿Tqgæú|Žú¾?�Õˆ½Tÿ/¹h_U@ŸÉw‘(Q•ƒìÝà,âcTQ±ÿ}øè³ ”ê¥ÀDW@eg þ]äD"¤±Ø81ù!³~§dÏF:#& 1ÊÍÛ‘þq7ì¸Q$1 iO-þFbÔ‹ L…Ç1­…j�`´†X8q_QM¬=õÚÅŽÊ)¹· M߼܋^ 2ÌÏnJ_ߢªÁ:ÁaÄ‡Û P(fLa_ÍÐ<«×C�³ÑBÙ~Ù®Œ`‘÷ŸK™>„çC=¸ß‹½Å•géøzÙ%y?X öžm 8�0]_?1ЬÔuRm¬–„Zu÷8ôU$«%&¥²ª¦ürã¨Bæä›k©,˜j¦9 ½qéƒ÷àüAŠðw=2�Ój ÁŽø+鬤aÀ6<òYɸl¤¢R™ƒÆåÂh*û�ÉDÀdûV §TA�ÆV×/ô[ö šTL x›«dʺ‹=Åw³·²y-C¾4ͼAÖô‡^m·T°ïyB*Âú¢Û×îHi%h"WHÙ6³ºá˜íÍ7ŠE¬qÞ66ÄŽÕõ|q¯Ë¡ui9kvÕÿ–wîWòòÝéØÂ!G�Ã'8 ù/$í³›�‰Eír‰¨aù<’ôÅñÆ%ÁÝ~M‚ø}½ï�èʯ9’]Ý”Á„ bŸÊw7³:ZJ½eÓþ5³Û8EQ+3¸´[4 p¡ˆÛ_ 7‰ñù¾< %͵ëË]”•wQ §é"d<@èõû›­h02:�{€»ûXoïxªi£ÐÅßRdøQ!ñrMwWÚ³c×Àü¥QhŦ~¨WâäCþ-½Ô:½žHI[ 8æKk%%ê‡6ò·Šå—Üz^ÑèC”‘$ëmÁud#‘pgpòêź3(zT¹û—iЈãJ5¢zW­ä¦2Ô!~ŸÖ-³¯7q°ßÉÔʬôGÖÔ†�„°�Z)Žh‚ºŒÁ·”–W—[†ßF?5–åê“Oãe©Æ ;£xÆÞ�-¸&r ì‹É!rÙî°= â¯k|öD““ŸËùÑ òë2¼&ƒßGVÉy)YßnWÝÍžœ‚Úv+÷¥M}ëìø2!»c�»ªˆ‰b ŽOvn¾C„Äž±»rÍ™w‘=»3öÒOqt2·Õºö{­Î¼@9“¸Sl�–Ö8ôïÁÖEg„×.c<Ã*íDñ»Z ˆã#­�Œà¦°«Ê¿jÔ·‰æðgœí*”ß`j â±®F¥÷#\ïMja¬ñ­ù3s­¿Þ*”=Q5‹çò ®gnPÕRc0Ÿ5õ8 ç�Ì1 ¶á¨Cs(Òù ¸ó¦Wçk¿Êu4í —¯±äM‡.�­¿Ô€�Z¹¯Ý…}AP†�»l¥sYP¬9ØrÅã,Q<|…ÛƒPÅbÃj×wÊSÙ³ày‹ÇÃ+ÁuM_xT»é>¨ëÒoðÒö °–Š;ÛTÏ€>&¿1ªº£&C…y�ÑBìævB˜b±9aOÌÌGΛ0XRÉs¨ƒœ;Èj¡3»E€eáT€´¢¶Z+jÑ_›%X@|OAÃ&wïä}ó“šÁ˜°òm`5«f@s‘N%éü@Ò€Ÿ7,íî`is¡øQHñ�7Ï›7ÆY�¦oë»ÛcÉaJ‰Ÿ§wïÅÔ+ýH�Q \¯BHW$Š悪«CM�ŽþKªŽ^/V¼/JT $yt™>Å�×›œqn“‘43 Å5ïÔ¶®ØäMÙïòë¨ü‰R¸3 &ɲ Udƒ°Õ%t¡M‹×™´Uƒ[|Í£¾mOn d3iÌŸ½ecº‘XÜ©1û)õ,95´Fv7¯ÛôB¢W“\£ñU{2 ¸ÁÀ¾�ATЖµÇUMÕ¹ÈvÞm_YÀJÆÇ¤ÀóÞÍ<ó4Ñ„Z�ØÞè´~Ã×>ø£�¢êó…sC aý˜›ƒäޏÖÙÈÐ\gLˆõ5?½œš‰ú’ÁCg ¾t B~ßmí|¯d¶ÂF—·â{cDEè+ä5Ï%^X/n©?3•ö«qÇ» ¥s‰¼fª^?  *�¡5m rtc’žòâO[\$ni˜qÚ…ãÖX ×бŒ«YÔÌÁ`(Åõ}VÖèâS½Ý3¢îñq»Ú&&Θî´v.Í¡ `,—°�€]ί!k“›i1–Z:ue¯Úž*¶L_—g²º¸Òƒ06…pON¶rÒ\,&¿Tž®Ý{勸n(ž¨Õò>çC)îêÿs•çÀÿ=Gƒ†gŒ…·| �Ã#4%'Xl›æ=á/E#[k9TÓ·ÕôË1}ˆˆˆ)¯G%ïêâôù—ôÞöž¼Ãß¼Y€ ¥(èLb0½"}¢û敇=ö!SØÔf×@Ä[ àqe11”ßláߪõõ{™~@Ù¼ÂùÊcë„®Þë ¿"/¦BeQÕAý‡¡�´l†ÁÐ%VòoÅ?p¼]ì%Z4E°ùò ÜÀ«G>Ç0ã˜k;70ªOëÞáÓü›*n™é Uí½)¦j>z+ÞHw”1úcè|¹…,A½'€•°`’ ‘Ü:’ “ýõn� Ïûøé»C[6ä�7ªŒèÌ÷ÌÐF.&q ›&Jþt…þÔ ’¿0Q^”é_axèð)‚ïÛÛ!ÄÓk¦½Â,MÓ�¨¶oËQ¾å|2ÎúWË…sðdø](PÞSbØysæòí )˧YŒòÙD±dn· Üòö!ÁØ5VNó‰­+@EK]ŽT-›Ku¼âà—Àl¯[³øÓ/[³¬´ƒ)N±­YT,çëÒ1Æ,·²¢$ Ä}u7fCó5…ù  I¯@HCß„œ\5É91É&ž �Ó„‚â Š�¶LÔ— »ü1mÙ(]ŽÂ}ÅÞîÚ R.£ ûÈØ£Ã“�C¸GÀ" ’‹t.eXä¥ÿbm,0+gEɇ€ö4=lj!úsÑ]¸Y­ÒÜ*P%Ê×í(˜«´RaJûWŒp‚_bÁIíq'éí_¥¹³Ãp3ւÛ§Õ†¹ ˆlmšAL†kØ•†7?­á_dµŸ©`=Ž7åZ-¨ø3L}'zù“Væ…»B%q(BàÀm´3Ï�.½JQbÁXõ7ýL0˜§O¼:À;M€Cê¿bMÕGw¥‹4Ik?-Ü5„ÄØÂþòp+4L JyYxêtÖgÐ|̇ à4«AñKM\=¡Å ìPÐóÕ� ô_.4˜ZŽ�EvÞŸ@¥Ó‡<¹2ˆík#Q ´íž�%yë«Ë†¤“æÞ3*$d ›U4™Œ5m³”ÙÆœ>hÖÆüy¨±êá�ñ5¦qkè\ž—_!´ À§m¨)z>á?ç eëŒDóA¦Ü$è¡Pg8MÓ±®-bÚÌ–ç‚©–-¯cÄ4¼ÿ¢v�+Q×·iñÉáSf†¸´K®¼Àÿ48ŸGv) SÇ÷óBrßœ tÎ’î+磼Ô*™¬]íl8“8}ZûcÃáK÷�ZÒ¦~)Dò n»7»“Ȧ_U‘4RƒÒ…gû‹Ëyx¸¾[xwFÝËdVV¯Ò&<–¶°®Åi#AYãp-ª`j?,(»fn«,8˜Î‘x¬¹BX8ÖÛ%+Dm‘íðÖus WäûÞ±°.ݬK@ß�©ÌO?Dœ±}µk-‡Z(¥¿~ ¯+Ûš  ¬š°÷|©”¨ºñBßkp26n£×ƒ”Èـ㛵­ ©ˆ¹üx~MÖÌÎ.v{DÒhîfM>®¹•³²‹ˆb2ÌÈFÊm~“ºµ>‡¢7îå,!;Ï à½Æ½Ëx+wOÖKû!;kj³J·LÌ6Ô]iXæë†Õhá¤úΈs9,Ø'dnYK»0¹_ƒp¾nßRt›çmZ¢yŠ«¦C¹óŠV0~Íã]ÅgÜÕË,•vZ44šƒ_vÚ "«›T¸ê«GƒÌÔ¼r˜Z1r×µ±Ã0Ïò, 0&ŠÇ}Š—WH9à5š ­g´Òt–‹ìöv " àäøÐÐJIªãF/kËOó꺹?Ú=qÚ.*¢×3�rD*€¬äOÒr³SÅc•o¦WÅ•pÕÛÛ(ééàC�=KnÍîàªUÅkM Y.Çì¼hÐ¥Gb8x 0Bˆ,g…½f †Ó0Îw™mÍÔk §Ê}N™/‚¶;Tj{ÆË;"Ý&Ìý9 •¯³c³¬Yå᡼ÕxU°Õ¦ÀUðçY¡Åc}\\068>›†ÿ-Ï1Ž‹ È3”jŽWÎòMõ§Üù‡‹o[åæ^‰>°a€èKeÝuw±GÝ–—ü­ÚÛ)loÂs�±Ãdí{Xxü´ßõÉæ%%"û¿S`ûzÛ”ïœÊÊE‘Ÿz{©bÚ´A•)§«£+Ë4·Õ“.³hœqVê­v°ªwÔÌx(’“VÛ ³'Ö_Öéè:¿¸U[ÖÅ÷Ú(ç1ò¢•Ôƒ¾f[ßà_ub7­ãvÈU†òeÙ7’NÆ]€ÿcqndeþ…õþ•~6ÔÞÁ½¡¤#žù9¸ ‚Y·X�]_ò°ê5fá†Ý¥ÞÕñlâ­›ý‹ÕœF:ztŒ«ý°ûˉIݨìû‹Š!ñŒ¾k»¦{ppÚß1‹–®KGã´•˜á”Œ«ºU«ÉW ²ø{T¢ ªÅäuYRÅä¨f®`IÈ 384Hí'rc)Ãç.œ]Ü8t³Ã»$ƒÝÕÁJ5O5�Tó‹�@¡ÄÅhoÇ;g24!dE«,ÔN¬Ç¶¢úñÉR[1Ø0LJ»“Ûö!‘áëýñI�Îóë³)¤‘õ.¡.Ñûº=·öp<„Ä�QÇqcÐéð‚[´7;�ñǽr~NlÃk-*¼ {àÈD‰¹Í�ƒ\‘h¿ß“¼áWã¥,éìØÞxÕæ¥–÷½qXÊs8·k™…+YUfþ#’Í•�·|#<­¡½ö°�Ägޏãν¾6î]RMÚýÛê`$6{v=á—*S¢µ§<›�°%TYâ‚Áó Ùºfe *y{ÛIÞãunï´!€Ç²^'§MçhA§–nh9*¶Î€û{c÷ß¹Å4oFàQ4Z,¨:/ç=_tào‹k[jÙçB­×ÕW´scs¶_QqÑßRÔ_Õerº:>Ηm LÀD{HÚ‰qQÁà\,,)a¨š™qŠÌÞN0b!AZÕBbˆ¡ÈÜB,ØØy~2{M—‘šE.E‰›ìÕÀWlw�ÀobpxYy(ºc)1Î)�%K¬,Ð=Ô¢È\U+¡‰;ÛÔ\§»Ðê—„\½r»ÇV$ˆE«Ë Œ #Íð| [Ñ¿#Ð0?¼J8?8d1[¶Öù{g™%[6yÝm&énAlY–’Æc¹¡õè“:Ì{5¡¼—c”À¤}vz+*hŒ ¸]Ô5ÈgBˆ5ûÑ”œBKåó_jÅ þXè[/² ”Z�ñíKöŽ`@LeëuR†½SNn�Fä=W¿˜z«P: jaüÍ»Ýa¯ËÎ)ÊR2$Y¹½B^h­Z�Ó^ûd9ŠþUãfO®<¥~[ÑaîÔ"®%Ãe¶° µÅüVnoeʆ•Kõ¬bû�,ÇÊ^ôó„–Ðݸƒžbè!WÕ]A‘ ¨6DÏ5·Û¹¼îÉ»ø‹fc^¤°ß%-×[)ã•;Œ=§!Ò"Ö ‘ŒÛ”°izë}¾=”ï—d:´gJñÈÇŒb^0šd¦7Ø3âÏfù7x˜=–…uiR±¢)‡ÔRäXÙÉUV0ˆÙ"Qvî�¥\²ŸÙ{±Åd9du»O·½“¯_&d{köæ=ÉŒs7Þש›—t¬YâžÅ&ïÓ+ûÕ”ÈÀ5·Ø J˜s�£ÞYÛ~ï50@Æ÷a¸±XNÂç"̇²“]2®{8rfªE†·Ü­óÌWœ 9,cʰµâFrMƒSdËnE ›I±Ìh gìtWÎ[hJ^[åhN¦7¯ÓØÒáÂÖ¡ž ?-¤�1júZôYžèö¿¸Ž¡/(9Äàè³Ð^Ôï}¡¼ã [ClÇ›?¦É¬`ž41[7Š™êøë!Ø ?Á�Åè c+ro¾Æ^�Ôõzã :d1)GÔ ÂiÑ/›¾œÁ|ß]KA‡!:vÐä\=UÚh͹gªP¶¸b|ß© >ª Ô„*–ö½‚¾^°z'+aø.Ž _'¹ ¾SIj’j´“åµË[bMî×<É{R4þ$âõ=ËsKKZ^Ou/d“�÷Z”±¾ë—Ú£žèAMMPóµÊv²�áie̽ÍðxPJ»7fòûíªåØh�<+s|qæiz‚,¯1'Ûº�ÍGd;I ìø3x­Z‰UD¨Â«Ô"¾�Š82›®¯p¼Èîõ¨[ˆ†Ieö­’z›ÛV™ç™ì.ú)1�Ü€ylq7ŸjÉ’çßdx+Ö!¨¡®° æÙc¤š7cÊ© Àóך›ö£u,t3Ë‘¢PÏlÝó ï\ÉSÍL'˜}^Ù¬qœ8í.±±®»Z’+ÛÂo¸÷.˜&—hSN¼0׺�Ìb8–Ëxëp,|Öß™Iþ¾P(²wêÄ…üÛæœ O߉0úO©Œ ‹W¦J ¹à`ü�UûveÀ=™–xjØ�´è¸öXö ÄqI�îíǸK¹ý€�zãô'7Â3zy$«Ü¸’ÙyèîqvRclhe0åÌüøQ€Æfø ó0f ¦˜ƒ•£Ö›»Ì6AžC°Ç•†Jœ–ÑaA†ÃÑy¶쬨\žïÀèѯ»ÊûœÕÌ5Ä®y)é›^Åù¾gN¤¤Š±¼ ‰wû#R¬ú¿˜žß®šó·f¥˜ÿHñö = 2»�ú#;vÇd[9#á`:ceR6.cܺkÁ1à¼Øª}Ï\k¡Ù<ëEÇ-3�®­PaAsٳ̲�^Ž‚²²!‘/XdÑtŸ;åaÏ뢄ï^ íÇV}“iB eÌy[°ÓÓÐ{8xa¶æ h «;.þpDüg¸ ”²&Õ߸BýRó« ¢…àׄ l»]†X2וR¢Lºa 'l8ðWs˦ù¹–ÆP1_-â<Üæ3½zûÕš(f÷?Ž~‚ÀGjÈçô[6¿¬7q3'ÏÊtíd´Þ­@ΚÚÄ# )ä lQ*SOMm_9¾/ë@.Ü7€ù[ÜÕåY5×m-gó©¥à¥3&À‚À~ýøv�ˬ…|q¦È*RH(á>o\Äêê�)6ïf«°!TEµœFÙN}V²ß.W7 CWB‚™×úaö*ÜϺ¤öy�êçÆ6"ûl@"-¢zw¯=/ö§_>ýêØ”dEFUâGŒ½.v¼Ôu±óì˜qF¾�rƒa�ßr}Þ1{ï)Û¡ô2°Ðnt�çX°¢ÐÂDÒ,7S»!üÎ;žW@Üâò"+ÑçÞÆz~=¼3¸¼°kV‹ýÐaT€wÙ¿t9íñÐEà,žþŠî`CªÇcØ8˜b:Jç„ýä�zëË6ׂU½Ý·o[nÂ9§è© ÙÖÞ$ǶÐö:Ü{»¿M£uÔ‹~·7}�RÀƒÃ1]._7“@¶& ‚ÚÅ<°o¾Ä/ÍIœÅþPCÔ®(œãHɪ¹ïG a*VÞ'Æ}™‹æzgÀfa¸eôðpmØ1Ú²dîÅH×N\Ó|àñç{VÛ‰2ë—1ä·w–⌆7I¢Ýð·‘u-V¹ÏV[Ña„¡Hî‹w5йiw0…ø1d ð‚8DZžX0E:fÀ´÷ÍÍjü#Öó ¬Ì¡Ù‹Yø=/Å}†w™ýp>—6ùÃÑ�Ò:¶äÛ’x³ú&× tõÞËpÙåQ"õ“Twõ'Н#H9ÙÖ¶˜n¶�×..Y½Ã€°Þ[\„a\ñä§@ÏÖ�ù_=u(8_‰³îï<¸0ëåÀJ* Šù4ç–ÔD ë¦ÖlQäŠT�3÷¼pã“þªµ‰Ó ­úå-¹ž`7&™Š*µ! ¿xÆ0'Ó>ÐìË©P} ŽdÜí¸ÇóZ69u áÅ ’CY»mëûJøà¨(sSŠÔíë[´X JVÒâ©ü*C!I‘ùuà6øŽIïJ-z �¶'¤º…¸úrév/.yøó¥ñÌ nÖu1VÌm[¥öw6¾Zâ«Z°ÚϺæ39kÝ#šñ~��Tð@`Þ�¢&N5{ÏàkD\A³VÓkYFÐäÖBÚ$E�<µvڰÉE¾±;¾Œ/wΚ®#ç žº2¥‚Èý”Ö.É�À`u«B –Éô /L�a^èÓp`Æ=ðü°.�NñpÆ.„ˆicV[™ÍˆÕ*òf0?§3ÅjØ<¥¸~~p›Y» 8ߪaÅ•^qMÔ£¼2¿I¬I“19A€øÊåÚNètÅØGú0¡ÿú»~CÐ\ïL`Ç1 ==¼‘ŧtóßi'YÈs6Âj`¶­¡òa‚¼3ûèïyQú�ÃM¹�ЏoÄç5³‰`“Ò½×�‹pLüil;ànÔ¯¿‘3�ðêSÿ øwfj›çhÕ×><ók�2wÛ �bApÕz\/qSð]yl·°�Ø+¯ëé{°F¦ìôx({’׿fàëx¯Eá3¹Êòúâ@ïYïqH(–K1?6Îà(.CÛZ5¸3þ²Ÿ$û»Rh$o²^'£ò£¦KM°4æ? ÑÈnKº]‘¼¯±Ì]#—,à(‰mrÞ½�i°"Eºœ[†®Ú&ò6Wd½ÇHðÛƒà:΄› fò'-�¤gªU¬�Æ:_}‹‡3õO«,ÚÐ9‘Lk3€¸³äÁq؈'Ö�–Â!O2´:cgµÇ×çÙ®Ûú·coLfÜ ù­y¼5jâ.AÎ}ø€oïºW ŸÙF }[ñvøGìMÖÎá—@zkòËûA%¦bÅ«zbÏ/͵¾é™}ägp]‚–¬Çžê¬íÿãü5üAнÛ×ÙK^^2žay§Ý•$¹ª³K)#ã³Ã%œ€$\+ôŽ`S9ëd§P‚~jèlÄDWاñÜÿ ?7½éÕka«Î:Aш+Ý{˜_¸ì =0©}'JQ]0ø‡ (Êö›Mœ]lá�îɨHZZ i_^ÚšF¯·Ñ•y!émayÛ{|Ç|%Ö°šÎ‘×<$“4P@Ï'¾ w`²Ý½º€½lñ,'ÁRÊøÐÌ;‚ƒé´ç ‰pBUÝ•N²gÞNÃè‰ÐeÜKÎ"ùV'+¸kÊÔ?²ÀþLZ „m¾ïKLjd¿²MÞ–-Ò·=³;-ï†á²Õ‘UÝcß>G~åtÒmÆ�–óÚCƼ1ÆëYu˜°—¯jîTÔ>ƒ³ÂbƒÚnʵdûu÷U_¼rþ׆�À­EU†ÆI˜—àI¸o¾}ø?ïÞW4¶pŠ ½Æ1Ú OëøO÷/‚µMüy¡ Šp3ø®rMN­±S`=¾Cù"9Û>ˆ)Ü×Zv.{àÂr1.dÜkŒg÷«¡Å�q8ÌX2øòÔ\4×&G g~-¥ë? s=,ËwlíÓïìö‹gáæn˜\Zz/ÇÁJoyO L7qÜ…&@ôÖ;Þö‰ÀqÞÆ™TH„³p:J¹×jNªS4¾.r7®«‰gs—¯Ü[‘ .ýÏUݸ-©ºuÍë*�š).yc½ÃÈh,�c`‘꺓ÍNæý9aÈÓ¾ ºû@©1Òe‡Lºö§Ýä×$ƒ�eœ ;As#B B„©€×ÏaõôØnïzØ¿)4¤Û‘hLv´¶sÄ4ï®vήñ‡ÆíûŸºhë³ðÎSÂù~å­W|˜Ê©N‹ìk[Ù¸.ÕÊÙ½o{/6¨¯y9ÅÓÎó¾4ñqÌ#7Þ.#: Ž `Âî!eß<ë]GâK[V9"»Ͳt§4h�°íâ3$†#+{Íñ¬ˆ° ‰mï…" hr‘¹!Ÿ»Ë+w\üV08ï]a:Ô ß²á‹å5‰}7U},a,¿ xý�ä �vÅl¹ P±°«`LJ™ÅàY‚å¯$lº!Aá´…%™*·µ4îÍs¶jM6RS’XÕr÷ÓöÜÊý‹ê@È-cäzßZqј,¢T-aû<\¯ whÜÍ£5DÜ ãß6·oÄü�_j!»fäÊD}ây«Í=úåì3Z]jæÅß/B„˜*¾Uætý†Ÿ~ß›Pðmq¶à§úÁö|Ì}<ÛÚùóvzêfÑm#�I'W ?®™Už!‡l"9Šã¢någ–l�Ùðœ#À*¨L\Aí7fÅÓÞFk ˜ó;!ãÁ-ÝzÑ©SÒ>±fÖjýߌ‹�à¿Ùß'u{aPÿ'‹¨GX ªt!º]¸îŒWÞæL:pŒ/1vÏ3 ñòyg?`bÓèv±&Ãça¤Ê¶Ýùž,ŠõN>—\rçžôC¥‰†$ÌV R ÆÑù†ßxDÈߘð½÷[ <ãFޤqÕÔwÒÎøGWXÂãäÊãpµ¨ÇÚŽ?mÐKëlrnðG³Hñ­õÚ=.�¡‰e`Ñ“á<;ÄùÃרä8´9穇�[¡òuLmzÚêWÏ�Mj­·ôâÛž9‚§æ0XûâUH;Ü4xaÒS_œg¥Uù¿q3´š[³ÅGÝfúµih¸¨­}5FøÞ¾M£�„¼·£”Xû�ˆ³ó¨lü‡­ª]]¼',Ɨݺ寮D «NHL9èôcIÑ®ï&ø­¸ r;á§î¦’"šê‚×e…nL—¸ç:pí[a� í'7Æ®SöòÝçÉËÕ‡NÝ \ð¥-ÁebµÆ@L÷¤Áõðàùõ™^éàû¡á†´pÓ}¬"ípCe&¢C_Ü UK3B¦1hÉ·nضÝç°Ž©QÌ™MtËq‡ÏFáËê¿R‡Ð2 V„mNˆ×oLX­§€K ù¶…r8ë†�{ÑF§¯… 2ß^W¤­Å´wë}ÊŒ®Áþ¨^F›eD@K/ôj¯{E­‰óï¼Åvi˺ \Hžùd¦¸„s ¬v»›|UœgG@¯ö5»Bø`ïn— òŸÐ�Šú Á}O¹;üœÞ��W1䘠2UI#u˜E.�ë^•ÖÓ»¤µ.rp€É‡×Ýv5YíZ” r”Iq­ˆüQAe=zçØk°ÃïgÁ¾qoÓÓe9™2j «è b3®¶¦ÜAp¼ âRaxXý¬…¢Ü=žr–†“î„BîÜàEÙS‘•mꨪ.oÏÁ|ÄïLÝÁŠ@v½³û�Å¿u6ê—;Ì`U¾ß*æ¿ïáä6VØöö¦Ù&w¯µ(Ô? ô¼}æ‡e%’»ÏBì8òÓIË-ºÞU|/XÌ@oaÈËôÄx³�_Óæµ¹výÇælL±[Äó8÷;†è=+q 7óòÝZ#Gíc>b±U–ñPá,À&¸/qCpZÚÈKqvÔ~ ã¥)•'¦̹!êû\R´ß’LÅÔÓl1¶Åå/cƒD/‹r¦WÂjŸΠ˽)†µ­ máÃ�$»Ë{1oÖÕŽì*ÁƤ¿«“ß~ös~YrþgØc.ñQ"yÒ„5¶5düW„·Z¶ÅòK÷tžéÊ7‡�’_à°2“”•Ñ5¾rkŸWÔÓ2‚H÷œ}ͳócÀäa‹8espv@3Ë|ɇWFp^Ýí«ÏJLï�㇋ýÜoS³HˆMh´À2¡êhæó\ÓVƒ¥Í£ÞÒ&¬°ïl·O4:ç?jéµ,X!kº0ä‘»ç0޳ž°®O£õgqRëöox/ƒ:æ6ëÅ}�fÀ,ñ×ð´pª‚r•¸ðgz!û¼Ýê÷QÁap}Õ €ˆú�y“·Ï%†Öªšï¤ uy’¼�3mþ›+æ¼<{­°îÝx³[VÁ@ªí¯È•QÇ›A`gÀRbÏ lá*ug«á9bƒe¥9%1-ÍÅéMæ&ÛlúG`˾6\e�¹äMµ@½IOkÇ¥_í—`©� ŽÚß­fDüqY@'åiclf_8®•±·Û®3̪ªãÒðžÇÝÆ}»’J¯›k‘ÏMÖ.+·ÚÁÈ !€ ïŒ”7 ƒy�«ˆÀ[ŸyD9ܳ‰>Ë›ûbÿjƒ ¶Q¼ö8שÜ5«Õ¬Ú9µ­ï�À ñJ@6±k, ©�„ð:¶gË'l¾%ü¾› Xe¾H×°2˜–ïŠ÷ ØêÚíN¸ç¹î¬ЍD¥„Êe«m®SÊ#YðŸÈ‹ãz ¯Qꇹ¶ÓºÎ}ÌVîäšÎÀ°ô:�¿7¦Íjº)µ2s[`5: ³kûâ¤ñ ²—–W¦Ì'`ÕŠÕ®kŸç_öï}¸tûÒ ‹Æ+jÃÁ°æºæÕáŒ#H)€…÷.2ÌŠ§œƒ7¶ÆùÇx2„“C!] G4øª@Ù èf;0"6þ"Ü ±r¦`¨CYÒñuœdAwã®YG>mU¯¹Ü�ÎÆ–_ÀwF6p_ðd�(‹x”jKjG�K‹b¨B¾w"Í…æXf&E+ª7\¡»Ë]’Q@ìªy½½%°E–ÿ=®}¸`–6e-lçº)×m~ï„<ä.ã{‰ÔP‹ŒjoÑŸwDÉA(±ã·1ãúÍ5“wøõçv6íþåèË»IiânÙžÝ5qkª÷°·r&²…ógÚ2¨_|.r©û•BéGu× Œ��7‚¸TA‡†R®ß³R5 íƒO†Ìæ�…,Pìa–‘ññ¨6¾`µ�Љ”�­Ã!»¨µ{;q–6Ø…�™>ÈÖhÃLGˆÎ)SSw)2ÁHŠ�°xÚø»éÙ‚ÎUZÃæråâ'~üÓiìð,Ù?óÍ!~ô‰›ÒºEÛ³dŒg25‰1!SÕƒmÜ UŠÆq4ª ·6—1!‹ãëÿSÿ)\,ç‹ †\ç¬ï0*Ò»ò_/�æž&F&ñN%*2~ŸWt˜Ä˜oxDÐ¥ê×¼î”C#ÉF¶42.»WÔŒ‹¬åEbÓ�¡"¯Mç&¯¸¿FBÿRpœP›HœõÓiF !>ëÈšOd6.ä±FÔGçæÖªÌ1qA×Í9‚¬× w4h)¾2Eôf±®>‘ö?Ïæ3·aÑÄ<%Þ„NÉõL{S·Ù, 6=¾>; þzxû9 º5½¬Ünh+Z©%¯Tó­�k½Pwwδ«&PkÓØª®#¤{åïãI&GºéØ0k´¿ú ùñ¾_€£Ã;×ÇÇêÃWLò¾-ä/¨{—ŒÈn6èôÈ£^ ‹“)‘J½;f‡´_µ°½Åfð@}³#ìÔïQðpýÞ�Íö±·Ÿ(Ëq|År‡¡ò…(DÛWñAa½éBPÈyáUúû¶åq;�/ÃAq<Ž]³Ò�ÏŸwäµ·8™ ê.™I9—ê§n<¯]b¶Ã#òBXbpiû!S©®¯4¸¤â[¶ÞÂ’l;F7À«C`«^S?£X Ž8e­„Øæ?q·Vù6–K'mCÉk°…8Ëm}…¦y™fØ) «ÐH •Ç öŸàå5‘‡Ja‹cpÛD)±ÌYfl'o—lýˆiùßbšm|E½ºN,–ccI��¶ÂGMõ¬Ð›°À¶<ÌUÂ>Q|c0 ༱Æ4œ£žÃ6Å»It{]”3¸üñj¬ŠmkËGueEû‰7¿È¸\§† |ø}/çrhzÖè–[lƒ2m%ZÈ\ì5mf)CC›¼ýÖö· c!ÌõcH¾ú°ý¿5žX&ñ"@i�ÊÀ{P" É,ËÜz•Ýqv06Æ´AQöS,98uA·oÊl7'ÐHmä‘ÛrÝÍþä¶vü\;�Ë@Xfóñ\C…�– yxÞ´ Bœ‚¢BGŒÅûSRr6k¡‘@’¡Ó3ÕÖƒûP  ð\‹m¢¥g½˜Q}ôymþ˜ås6ÜZÌa8ú½6Ç“Þç¡é/ܺ×÷"')ä¡¢ÖoÉ0ð0|Ø\ò¿¬a€µ¡t( a�ÅܪÓpJ�Ñ ¤W:à-÷?’®4Ñû\\¸ù3 o(îbT'ݸnò‰B4Ô†X!0tËs%|×ñz›ÈUW}Ütœd¶v¥‹Qç}.‰ JèœÔáýa,?ßÀ€?ðÛ©ÖöŸEà°8ë|ø,uRø®³9ÐjÒ»µyv;×§4ü¨ìé·þ„hˆãjbA/sΫ&6wLûa‘øðÖBÑï!­%Ò¾pd¬ FXW5¦µ·_dxتJ¢ÞDr@˜üXB&÷ÁÔð~}—ì̦*gxHÜ6LÃf'µi‹†/F¿™KúçoX˜��b²7z(šJ™$\W•>Äâ+íömÇM0HDóФ"(�K®èqã?[¹-b‡ÙÚž ¶¥ Ž‚%Ÿ§¬)ÅÉ( ¼B›~k»RbÁ6i»ƒ‹Á^×jž�‡+»­Û‡K^¥HößIDž“ÁÕƒéÈÌÖ\\±.Çè†5óèJ %Ã~¹�¦é{ÝÂ�®ÿj±¶½þ½â¡ny;x1ä *–¨/ûw`<ޏ�#8Iái>;gSðêÅÁË/xÏUîJ>+Ôel¾"×N»ÄášÃ7^äk^ÝÔùÌTCªµ�øszw¨‹|êÃë—6ù¹³÷³ò}Rmã(Ï2 ˆ^è×»*br‚%š‘L%¶h¤Æ"6u"½õ{¿c8¬óef¼š]Ð¥ïb õ6ÇyhfÏ67-ìÎVжHM%âÇ‚ñî‡5¾!�"«ðÁL;ƒ�™ã¢n -ÓU5“™ÔýÞKáŠÏÉ|‚}8£ñln·%tçØnMhÝ©çÔ¤9° Ý=T�7“fÆÙ (ߢx¿)Kak€­o&Úc·gè²UoIèd<²Á6Q³¤@³¥�)Ç€’ g)ƒ¸û/Y»nPo74 ]«f| ¬PçfáÑ1Ý,¯ì=䀺�cµnùÇ(¶AFÍ5¿o-Ëñ8õj1ëßÅmøgAÀã;P Ê!²œòÀæ|EGc9N{ZlVìäX†i ¦Ï{! .&´B¬*ÙÑ0š½'ú‹à;ºÒ•˜ûÊ0eÏ.AÑ ¾¬Í¬™óV]Çíí?k¥Gý vI.§î CFSù´p"/ËnãýsÝ;¢Ò€ñ÷³¼NsCŸÀyP^ù�ŽÚšKóÎ*÷”6@Úëv@€ñÒ{±Ï~& Ü;Ih.b9Ø9µÚp oìè}ÔU¯º‡s›aó¦Á¦¹»A8IwBÒ±»Ïì/õÒ¯ªš~ÑzlÇ ©2Q’ÚͶré60­-û§¸ mƒBù:ýÀrÂx/•8ü™S6J J5Ž…ÝÇú�'„‡½"ÝÛ Ž{YqÄßvÊÃ^7g4±�’µcMûW‚rÆoIâ~a‡°3û®Xçšæ©êAi°yn?OÖBn]tJ^Ö.ñ ˜`òÞÍܨßêùü³2@vBX áó²?O†™Õ9•ƒ|+Å MOÚiû‚ qoe¬·I”K¥_UÝFÄ 2_>q•n:}¸Ð°¶� «÷QÅ|ê|î7xKï*Ò/jyÖ=7ÔðAŠ)rÍt®M; qo!¶ÝßÎ Y~¨¬VL�Í=¤�ãl46©4ƒC5bÝÆ;¢“aMÙZ‹}4‚ã 3¡ÌZpÝ$HT�y¿@i53Á XÚØõ>ç—K?¥väî÷ – ër­¦}·užÅôEI§üøE¸G»,G7¤ÎÁ÷Î߆¢ië9s,ñnì!¹.Ø}N. ÀÝD–¾ŸK¥ŸÚ™»=½@·V¸%Úhm÷ ºW5Ž\ƒ1?u¨ß©¯’2-Ée! ê¾:xážvцö|°)ƒ8¤à¸ž«èyö뾋üâ…@?}i>-jBG&ž5·±ÙÂvñ¶‘1îù¼¥^þï¬n˜yãöøäçL'•»ë=l€R‹"¬®mƒýk•iËá'RñÀˆ¯žÀæòÙ+î«EÁö9ãpTtÐy-^º€Þ±ÆqaÊ’ô—Ï�Ì›Ïh“‡ à ä,f¤GoÅ¥1ø˜zÄÃ=Óqƒ±—9€Û�.7œ~,°) ˜¶ÒÒ*fK`¹àf(Z¸+¥«OÕñÂÕŒ…H4]µ¡¾û˜@Ù–99 Óµ¯ÏÄø”|xN5C”©+~üŽ-éÎqª5>bÛÓ„ò…“¡•Qû_˜É³o‘¾}’_í‚þø´¨¿l9ÓÙÙ·<Ò*NÖ±ñçIô‡�D¡¨¥¸x![X˜4 “ß_ ÀŠìY’£Å€Ä˜F�Â#–°É>ÞiZbso…‘Óñ.Í`µse2ýV™ºF+dïË«³�„ýÆšýß­£n°Uç•ÁÊ­éC³¬)i^Á,v»ÊãÑ%ð�lõMjïèÓjÏ3–¾�ºWÐd,: ˘ÍQE‘6Ÿ¯Yâ§Áñô!»—:›ÞJTrY=óËLõêÀiêm¤ÜO}g}yß i̲ÞfåGTe,›nÕéB°µlFubbhF©CÆvx9Î�‰›{Çõ�.— ÇØJÖKê­ïWñ Wì“‚ø¨Žì10˜«lCWVÙÿ -í™[ñwê™âÙ�·o‹É÷ [AákÛõ9›Á¨twž„©•¶Ò+G1/lh›lÎw«ÄÙ¥Wt’ªMÀ(Ûl¾ý~çŌף½0Œ íœCo UvVa ?ŽÓmJh|ööØÇßkÍ,JÒŠƒÚµK]Û•p´ èyèKúÙæä­—Ç®ÆWxJ f¸·¼™€º^©–‡{9x#my|l»ÔƼ¾ü[óîö„`V‘¹¦ÝÚk f}¥Û6È€ÔË Ü2ïà£ûå�ß~;Æu + õHó¦îjIÁm`ú*ĺLÜD}mråå+·L W@ÚéêBHÄ4 ˤËNðF†f<Œ¸õGu�­‚Á]1¹-Ê:¬"è7µÒeê0€1·_†YF¡dµ@€XíÁµ·DÐ郶§ÜÝ&„CCÁ¡†8ÓU¿r4¹ý„Îoh‚Öü3—?ݽ�dÕ=+L£L‹;¹fÇ:¾s°Ñ£EÜwæ�ììNS_V�†÷èeŸ°eä¥á²ìÔb&É iÅÓAšRΕæ¡ålK§€š²vf·¦¹ú9½�†Èïï±Y­¦¹Áª7Å øeKœÓsùL#’y<¥¾³Cyô¯Yùé“ST<Í l½­¤mpËõì´ h‹ÙlÌæ¤`o¹9¾‚ïwÈŽ¥Ò†Œ§f›,#X-™áÖYÖjÅH –ÁÒÞ±y%Ò Ýœ Á�SgÌÚšàµHª,ào lÍÍs­ß*¶K޶ÙG+G /éO‰nçô‘Wøœ‡sEg£ù7o­ RLrcÄÍ"ÐSi‡ n¼«ÊˬÚK ¦˜7ƒapsÔÁêÆÙž,ÙަP‡_u£MÕD _926÷²ª\¸SÞë�iù�RÍÑÎ{6›¡Ü¶ÿEgH» /‘ 'm-ëVÈÉ œ§ “+tÐ’ÕbD/E7E1œêùNÀÚ |At£‹¹ŽE„QT7ù®C‚}œÂ¿!a߯ö.Õ€óp¼a5€JOÕl‚sˆ>qÓ°pBÇEzì9ï oÏËB¹»ËÚl6�8íã¬ìòX4¥6¼™JHì FÍÁ'©Þ­w{ûÕN+'`Ç9â-,<ØþYœm#EìZÐßfÑõ5€¬%Þ[LÛj~ÛÛÃS¶®ì=£ýpóœä#¿§®…Y³³Ò©bñö/—i„3[éºï^Ù?3°P0OtOLBìú�x¯Ñ;ÔùÙX/odžcmL}¨qÊ&†¶*u‘ÍŒrcFç¾ÜL5ß<Ýš~�]ñÓ Õ!³4UòH°áN“£,:Õ‹}}øÁP/®ªê²à{…äDþUƒK:ȵÀHƒæYî’ÿs~ăüJ`#4ÞP¿Šȑӷ‡ñJBq븂Ó^ülÞý?Û‚ð(-Ô·ooˆ*º«mUܧve°‡X´tÂ}lö) Žï›Í«˜Ço”Ï7û²*ІÍ/ÑØ’å/Õ“�ØØŸ|~–§;{c¹úÅý¼«g¡«Zã-øëá ÞT7¥ºx8†Á²ÝŠ×o§™\Õ˜½Yó{e5òEÅY9£çk©c”>þËßxI#“ÒA}­²´?Õio|óÙJÐ,Ðn—5š[ScU¢Žµ×‰¹ì/ƒ+6ÕÞîÀtçKc¸š@ËmÜ*ý8 Ôû´¬ÍùsG²ï½(cL”öhK?#e¬ÆcÂŽ §Ê¹3 7]„.Õ®rD¯�Ç‘ý%{gÁœ¢ïaÒ;†9†æ•Cˆsm»ÍFDœ'¾¶–ýC~vížL´àöY™É Ôë?aŸåÖ@„Ë ¤ã6òGT~äÍð(é�ÛØRm=�Jï›K•°†Ž ÝÆ%H‰³ñhÍÒbæ Ä1 g¸±J“†Æ¤ÆÁgذäÉH\�;w*ŒÓ€�|†o÷K¡Á…Ô‹bÓ£›%ÞáX°I“Ü„‡#WÊœ¸…DSŒ«æQÈX»«’bÇS€}éù86=XO`§Alè ùlFÅåD7¬€þ\ôÁ½Ò�5LVõLÊ8�úÃ?#%Id{G­W÷Ó…€©=·Ì«n=Æ?šÛˆ#¹.صùŠ SÂ)ΩʓñZÏ<X*xbpÁUÚÇ {f줋tOwï*à:F}’\b6…ê]W׎�°C‚?¸ý:ÕniìÇ ²f« ¶¹³¥ÆîÌ lû3«m}Ÿ¾ NA–+CÜÚ[¯.äÃù‡²§ç(P ð íèÆŒ¬ À/kGÆ9NË;-cã}�P>K–¥O:($ç,ÇfÓ°J“×Ê��4¢2ô[bËüå‚ùº‚õØÜ=³×ó`œÎ]Ï õµJczè�êç¦%Š;8¾RÔUbE1§~ÉúØB‰­‡XSPæ NhÆ tg•�SîIý} j·µ ¬Œ‚îc´¡·!ÂÂÉÍ™ë/¼Ä“‡4äºsF}^5—´ @¡ ô×òÚýy§ &‰`ïý&ãœÚŠýìg¨OÝ x%ÑO�ëË‘ Ï'‡!>}ƒá �ËÜÕúüÔÆ™¯ë°³ñç;¾— KËk-Âê…ÆBÑÑÈp¯;ß Í®›Eje²‚Imè9Vâݰ(¾Ž¡dµèîŒïÔEwe�0}¨gг€·Ÿ_+¶ëAŽí„?˜ÐRÔòoFÁp:kÚ6V\jz$·whå8ú+S=¼,®�ô„_î.ÒM¹Óhl=7å­­ŽYZv­Y°C¶F !^UC¾d0µBpq¼�zá�¢wjì�«·¿&Û&ÜI<]ÅÝ;®]މ�(>®\£/h¶(FXHX¬Ñ'„j¨Ë5pâ¸&ôn$ÀQÙÚr¬Ã?ˆR2›~OçšÏoõáŠÖûÙ¯PÀ`š]›cÅK³¶r­Á¥”•ÚC£¦è^Ð<áìzåTØK ·Ì§Çé.F"tetÇ>p­¬Ì…»æõà3T )� 1‹ôXCËP®&RgcÅ-am‚ú3áçm·U¹EÅñ€w ï´m‚Mk5�c«­Ë´8­Á‹�Dê¬oHñ:@¸‘7ÃÆ'Râì\~ïbû S„Eà·hÆ®všé“•í´WÙìV5Šœ£½)„ªô-Pà—ÏŸƒúßhæ´\ÏÝÍåÓ?Ž…H‡ èN† 0U*`GË,›Y õ‹ã°ñ%®”WŸž&”+ªm|ìÝ à+a WV Û˜I`KÉšoÜRàêUdI/…í-XMÒEç}¤É WÑø‘~ô3·žkSŸ3Л¢]ƒ�9m�„¿Yì ¡ 4+íÂz î)ð�h)®´Ø¾î¹+9±"‰d>^‹`áB¬¡¬„¥ìs™{=ß ó}k‘¡ùcï±c#0å [�|¦à%»E¡„øÒ°ÙÆ3kž_5ï­ÅùêÖ€©·Cë‚ ì‚ÔYµÛh ö ¤;ÞÂxIn†(E5’®§—qŸEöòÜï!»®Æs%l5KÓbñ‰¡Žm$g4—°èÍýH^¹…5]`o¬ÃÛG²âKÚ°)ú•** âAÍGÅ\Ùí¦–Åo7ë;,�:¿'[lÚ² øùÅ`^©©X.D Ù¿ç»±wo [�_,ê ü¦¨*<ŽY4ßÝpÔŠ)&x¸Ã3 {•Ê;½¯U¡ÄŸµÐݹÚ^â«íúã{VŠà�Ûì=îØ"Ó=?&KdÌäš´eÂTã;¤{)í´”¨<…È ïœK1ß4é›§ÀÔ�ryœ¾±7S³IQ8è݆ØeÎ~?úOsŸcϺMÔvºËÓ'±…N…MvÖðÿñû{¡îø;� Ád#vtgA»¬OzA½ë\4‚þ|ìmŸÆ•ALIýµ»àcOu�RÁxó}^€s‘ý\6¶Î‚ìŒ÷:Šö2Ö`«VgW°.)§îàÔ!©‰‚�›´|¾ÄFíWøÞõ @…ýz[ ¸é¢]Ü›}éÚ.”§„µ“5›�©n Aΰb¥p VKÓëÒò¾�ê]ÝC'Ý‚oE##Q´­K«ša‘‚ŽÑërC¸zËán6z¹ë¤Í&A€Ãñ7SJdã/Øzß_MpJNj’*¨H2Ú[v'Òjñô×Gkd(eîEkt®°ÓàB²A|¿æôÃYcƒ0X1Ž÷øšªÐ3b`—…‡\,‹ý;m¬2ãìºámc´î‚oæÉIßó„üë¡@Œ~@¹CÛò�©X¨,§—éã7ÕYX3Ì2Y··?ž“›µ¦1/+U¾·?±;ŒŽºz£é#qk‚=”A.ÌÀ¡¦®c|2½)Î’Ëʆ(ˆ¯»<%Œ1Z‘6·xa‘€|öß­ë݆žÜ´zºîÏeˆ‘�9{kç?ÜÀ`ÿ*òW<ÕÕi,ÂYU!Ô*ÎR,ÒSH^Á o�ïü–×å·CÚ½%ÉY¸%'°¹]±§uùØ e=\ŸpÎò—jÜ};{a{Ýš±�ÖÝÖnK9 G[šû3ž7Uþî¦ø±¦W{‹ÌcmÃÙZO×ǰäI!ùú·»®ØRCÛ†¯µžù™[s*y©ûǯ¶YbS rUrá#?p"çéxO¡d,j)’õxö»Ú9�‹d£ R¬fÁFbŠamIÝqQ¶8Óg%uç]*@s‰êuŒ®,�y¹ójf¹ ÉT™Í}f€4±PSÌ…ã�l1XAq²1eœµ©SA k 騠ô-Cd6áÞxùš·#§f Ú*Æ“;vvÔ.ÖVµCF´®.U­¥—g�ð× œÎ,Ç`1ÀH7r€°,È�îL1èL5©äm†A…>!j¸Š"çŒ2`ƒÄE›7ñq2¿g ‹'†“±˜)ÏØÑØž9„RèüI².–2› 8/ÙÐU@0àäþÁý61: ©Ã¢Ð—�s†�=á6å}I–ÔiÒî `ƒî—aÃãzæ–-|—=®bŒ'¯³ÊÆZp—2.ñHI|B¬;öÇ–\ùÌWî"¼²²!Òb„¯Ë¯¶';Ž·æbcåë¦ñØl ¾[<¥ ¥?Ý@ü‚Ón¾œ”gÎSÅÙù¬¸¨7?{`1÷ð�<‹,,�Y][»hÏŵ"求ve<›2©jJM‚`g�Á5¾Ãf±°ŸŸÖuj¨½t$[Ø/ü¸•t28Ò€o†ô…Ìn#k…:—½Ž»Gy¾ÇÏInam…¡î>JÚgÛíÚá½Ë$‘é)OH5`ë†'Àø£¼x¼ÿ½Ò½ºó±Ùªt[M 6OqpoZÈÚo„À´H^²Ü0·xÈó) °o{" ì‡|K�ÆúJû9tèºöÆÊ°Ëæy烨ïS1ìO¨ÇåÞñJPPÕ»ÿ²‚”¥3¼k]quvŸ/¡^b»Iµ1±s+[ú�B{¤sk{b¹ƒÐÑâñ MuWºµhœ2âë”’ »l«ï=Áø.÷ÙJžÏÝ·�œ%|,yÝâqg;Þ¥ru½ò‘ÂrF€w!WܺéöI>ÕœHÿž° ä驨#\ÃûVÒ, q¯g+�3Ö¾vRÞj¤m�nÄ‚�®ç!ü]âc±›dxÊE“¢ïg›²`}¬¯˜e¨­´ßÙ>h¾vØ7ã½Øìw\v½ ¢ßTÖïÜ^D½·S^ó-•·Ü b¬&9Îj`þZŒr~T¦¼zÉe…@%²*ÃwÙûiÏ®gQpdM‘˜»‹Fª°¥¿±ïj˜X'q73j’úä -åAJ÷ãÆ«¶^'QBÜk:Û©‰[Túî¬Ê!ó†TX—G˜u}Òþ×Nã¢ÄäÌ@,€cm-4ìúƒ÷ïÌ�Šp)kØw›­ÂW{ñ¼�bt ÷”ˆA_ Õqë”�iþ¾¿Ž‚øÙ‡Ÿ™T‰œ{§dðƒÈgvG¶y¥—ýûðàλ¯Ì˜¥ �+âøw¨N°Ïö@´l;õÊ éÆéÁÂç>Áj­j¿.<7–¼œí謮w„«èâšÂ*Òl‡Z–_py³Ítú^wz„\Ó�� ö9;–ovô¤¾WÛ^ïN;û–™M]Ynœ@Þ‹d©¹“e,…¾ªko÷RÌÇ1pÓß³jd¯°ý÷5—¸1£—šzôòžèN1@ï×nl»p]24ú0Þ\�ù<‘<Îc>§Ò¹ã’&¥Ošˆ™A )Çy³ÝÓŸñè¸GŸùLM»<&�qïrÁ¯Ï�s›û³• ·9B?(W‹Ù^q�éÅñÌ_)4Çö4ÖñFUd>â˜Lo$·ƒ¤-íUevEuï¬vØq‰¤ÖÀi»0Ùø>ôañðXwÆyÞ“¸!^M}pÈBnÈ ‘Ôò9|÷ÇvK°üé2ͽ(Û5eV¹Aô¸{¾=8¼íø+;�•¦Ÿu–km�ˆ»Z¹aíã&Ë„öTE°¯¼ü2a¯W »^J€ªs¡2øµÑÉI©{m¿=3ämy "ƒ­¡2®ÊÉRÇhÆû÷ïÁû…÷cÈZµäÖiõ[SMGûAÂkŠÅñ¯9 éRæ0êm‚¢Èk{@`–³å+ÊíIa³µn®æ={`ra´#=T.ª9ý‰0ÿ’ÔñÄ Þ¸ðvaU†`‚§Crbq!߸€~BX½yðïuûJÇkª‡F-œ¡ì�¦ýX>YBèa¨Dúk}Àåõ 8Ëu…í¨ÎÕfPYy2\À‚÷A¤D #-o•éügïcÏ�¨ˆ"ëOX ú¼µ¤Íï¿y²Ò®mÂ|ÔLpï ;ý§ ™â„>R�¯ígƒœN(ɱÀ•�v´’·ÙÁ ogz.6ôa°<~̌ŗwúÁAèîwYËv2S”±Ôf„¾È ¬e*ÀA�ÖtÝÒ]—)v}_éß[+ZÑÞ&Ä"X81®>`+–ß¾ªê/û-VCÙ=ÖØ�’ÚæK`ÆÀnõöl\N! ¡@jqQÕ¯j᯺`™à¶;­‹–›({Ü?IJ°ÏµöirTC?Äçæ@ÒAÊ}»¿D8+B~�d�`׎ÇNžû&y;ðîk!ݹãŸiЙBª·°”~6€Þ×ÐÕN�#¢öÓm3M£rÍ”­·wî*“‡¦“!,)Uõ»Ì½4D}Š{—Ú¿Ÿ|€Ö÷»…Uò–®!K]²Né7Æ_!D^Õ‹nËîí>å|¦ÞÔ±w\³°}0}ø×_Zzfñ£¸Î”Rðg\}U jÉ3ŽwE1�,ž`®v ¶¾ìàX@÷ÿ¶×£ïïüþ]üoÛõ¿—×bÿ@¢�ßçUþªŒ�¨"²ˆ2£ @ * ˆ¢ª¨À�в¨Â�‚@‚@ JˆÂ"#"ˆ/ÙüOëþ­ü[»úÿOm ˜p]çÜz³ÊÛ»ÿe3u±<ÁÒÿçBȰÙä¿�üåøÛJâƒ[½½ëµ9â!¢ìÙo€.KBÂÈ^™ è]£ýWà»cœ}=r#R$Þ/ǯמûÆJ�Ÿu¯uÿNß(—~ÌÊ¥ãZeø2º­û{„!¾¾ýž}½é�Tj7BÔ×¼e´ W ¹ðˆv`Ù¸?yp*eºxû!�u8®|[§ŒÁ|èÏšÀ9N7oZ„»Nô¬BN Fw œ�:çDbÊŽSD 猚½}‚ŽZçdü¹,¶‰à�;ÝO-X{ݸ„E̾²g†4X§-þpEîL)p„\[:Å_u¾/&íŒkwâ ¸N;ˆæ‹N\©å|ŽðszÛ_Ú5Ï#~d" ¸GŽ-{P›�›—OÊAƵòÕj¸É™ÿÓYK-¦÷tr}ì¼ ’"?¯ÌsùV±[uµ´Z%@Á�䎲OC©³ÈhÙ™pî¹Ïlt &ô€.z¼Y÷?\­KÔ�XqÛ@?_j›"LÌVàE=€D<˜o¼o¬_»ÉaÀ/¹Ÿx�ÛW“̦ÀïBÞ¬ò�½}ûõÙ‹v�ú‚l�룬`]Ÿ§Ûb;VÚµØÝ$Ú¿ôcugÀ¬'{ »¶ÊÓôm/_zPèPmNcE•$Ü/E”¹3ÙѬû‘Rûµº�5o¯§kßìþ^ýk élµšõ÷äm²‡/�­q{oZ¤øæe{}9+;Î GaÈ;ÏÓŒ[§íãîs£ÇV +øT®½¬ ‰çd\>7xQÊ™?W94ØÛ@öíNœ› _÷ïÀžežýÃííXÃÕ×ZHF+?~½%eÖEíVÄ|hÂælyçfO]{ø»½®â8--r… ¼‚C�²Õ£1}•Ž-vº\lò©Ÿò¶Q¹³L[´áì©ñ� îÅØÉ7;¶Kß8+àyè 0JÙ§ÂÅÑVºé�÷¥smV†¾à—× V�äÎ~ά·‰µ´­±Ç†[ÍËi‚Ï„ÕyxΞ‹[ߺÖoj¿|¾Ý>ć"Û7u.)vø¸,¸¶ñw¾P7ùØÿ(;É;î- P>rWôµ\ïN’ÄH“ïÅ–Š®’°wY¢Öã�¥{ëWkfŽÌ CmK*ò®“s°oõ´‰åjÚÛRáÔ¸¦Ç“cÚ±‚¦ õm7¢ª‰.Y¨lßZ(lUÖÊŽˆK¾À‡"Á£Nñ~À0ÜŠ”7©'kYmy(„~ß(åaÎÛ>îZ_5a¿sŒâ4k e�-ù ãå‹<*X\hq“7_ϸØÀEw�Ož²Û};ËpAº¨eÞF®ÀÈ:!~Ô„—UT!n.`!Æã©Ö¡aü@œã6'S<ݺa¶ï{LÄÞ`ó'€C ;¿Gõ¸ZöïÕ`mÿí;´-Ô'/ÀÚC�œíàgÔ‡:¹e«Ó˜M÷�òÔ÷¾[mD1èæÞdôö ípM…”mïG½›ñþ]=sô@*�æõ»ÜY.‚zªÙÀGDä¬L’&R ô(³E—Ò$˜HlU‰¡öZ‚7•¨?5’'C”Œ¡,áv�’Ø´1èÆE.2rÎÆ&ʘ+zÎÚ`+ìë©Ú]5ð•D†Ä LË j`$Bæ�ºÇy¢¬Áò.—À3žò‹m( È'3ó¡Ž¡Ö÷m·Â¼s‚ø»µF >à«æ1$¶qnönYkÂýb/·‹˜d€h­{Y�ï}“Å:ÐÀk½öÍ9 Ó Ÿ'Å¥éØ4ì‡ïm«­Ï=øÙpb:ôæû—�cx ê!4'Îâ’+Þ¥Ø.´õ—� �‰õVI‚Pò'7ƒ¶Yo—BŒ÷Nn¡g#NnËo&Úžì FÛî´�VB'ϹÀ˜Â%Ý“]ÉÛ9ýžá­mâXÒá\÷íî7äb˃ÇãÙzZ�Q€âÆÅ­˜Õ> 4’Ø<œ}4wͲ°^»±Aè�Ïb°1¹»ÿ_e“7æ0ÞGèèRü_Àn´Ô¹•SíµVÝÞJùHœ×*_!„E}í÷'“"@½Ç&åÁTäH 1©ª÷J¾†’¨›úÂ.é€Âqô¶V"µX3Ì©\êò²T�.üãkê—P¿@ÛÉÐuòs‡Á2¾‹'‹[›g“«YЉ¸á¬«7yCR埌A‘�6?cæ+árÏ~é/�] SWA¸žêê%9û'»}D„�Ã&<ü7šè±ö¹°É8ü–F7xóµÏ¦öÈÉrňMbyÎ�yî·<ÅõÃ0±hÃM��käPY¥ÄÝóŽ©[Ò/̈7³ÂùVô•ßzƒ0÷92�fTžXäìô@Wt º‰'Us�€Wåê$³÷ƒ|Ö´µ}°§’ Ê@N—É`D:yåÚÏݶgw�MâV7‹f¯ÔÉÎsgcÌUÍFk¼¢–ÝÖøà†¦&N¬µ„ }P ë[]¡¥³Yæ=–lt9ÓìÄâù³�d_E­‚9âWƒbÌ8Š'’ÅS€é±X»ö¹-rV²V¡ä’áTRáë7Ÿ×Âm†¤™µÆ¾n¬º.Zžp>•ÛÀ¾á_ÀEMº¶tU� ÞYAêp>F¨°o%‹3aRÆ 90„¶œØp±Unöö;èVÅênÛ¤ÂÏŸ;·r××Eöª«ÆD9~ß¼ãIBmì ëE\:�|crR Ý«�—9%hmIZû¹¶®f¬©gDµ‘[t¹€ÔÎU �Q³:°s\Õe&¡Í›q°Ü¡4f°˜º×îºá"*žŠÚê¬ó›"ËWJüT³ ž`W–±rôfà„Š àršrÀrïgÍ ÷:²=OskåÊ^«·Ær�Ž‹òâàUæÏh.ÁV�kXì›òGÃéÊ{É%µJ7�"_…&yŠ“+÷UcÇ�‘ZA‘°Dc&ùŽ»{ç=wÎõ»zÏ R€8 óÅm¾4<¶ƒkt¶òí~(­%ÀŽÇ‘ ¿<Ë;œhIlx± Õ�”åšW9‚ƒüÐw¬üE$§®oXú|»Ñ�µ Šå}Î&ààTÖRáÓÃ*ZáÖôÐ^âkä·¿“·­xÔ:_6Aˆ‚ø \œ<—lìå �Ò À“´͇ØE§ò÷;‡šòJ[͸ü¼gÒ¹¿HÈà"ªqÄ*g2QØÍ¥–[w@a¾G��³¶ûgè²ëa­ÈûJöå�ݼ¿Úo¨‘þ<ÌôÓì¸Ø²«Ž™b¬_{;WGç˜×tKóÎ~º|MË{y¶@�¤myÒ6ÁÍ{½‡ÜRãþùNYø�ÅÚqÈøÉ™;`ž fŒïñ£¾!~VÙó"n÷T özÝ¿vØŸ"œ…ûy´ìÆ ýŸÏ›]’‘ëP�ƒ�yÉ Ž¤3Ÿh,+�‡ NLq%¡­YV÷e;•"fùýVžµp¨É@´.�³æŒêyo j¶”zñƒ]Ö„m[w…•·àÀ÷;”íMúCÚ[%éçÍ,ÆF‰uê )��9‹¨:Ë6›XÆ[¼“{l¿ñÀè™BŽ�ówä§¢û6ÎíÅÊhƒ�­Ü¾}Î_çÞMœ&@± ø¬I œ$”¬¦m×·d7’Ÿäƒ·¨·µ¦ccÕ.Cï¬Û î>ûîK.øª…ÔÅ·ë…«Ëáõæê;©%LÀMm@¬V¥œ/Dñ›ˆ_yt½Þq/ª~gš!Ä3÷)ͰkwÖ.Ç«‡Ò\@:fâžî qF…Ù“ˆl¯ÉÍGKÏ[c:ºöSaûð~ Ÿ(ìü“¾”öæ³c«.¯½÷šLî£[:¤]µU`ϳU&¦Ÿˆc”{Æ“‘úõy&jj{òÝa v™€Èx€�øÅ1 ²l¿$†9TÆ7C†yÂâʼðBO'\Ü·Âï_0Æ[7ù$dð»ÜO[æWÈ4f­"ô€¹ýØ¥ÇÑ€q°âþàIê“P ¥b|Òôv` ÔË7íre… !Üp-ߣ Ï#� C{h"2Ùöâ(´„‚µÃ¬u7\­4´޲ÎöBK¦Où ö´Ñì᣺�&³xTÿƒä%ÎßžP®Ý¹òzŸ+ç»N— ô7`•yãx\X6jÂ'”9m”›ÕíƒÅ¶ó@,¡ÃºãŠ&ÜØ¾ö–Ê×s”v¿gCgG°ÙÏŽ=ËXö¶ã&Ø- vmlŽÃÔœ¿–o�j„õfªÆÏ_gÚ¦Ü(/ÌS¦ÎW*ZPyrlþSÏUé`µ…7”‘&Ôàì¶ñ%ƒË8‹lV0ëhkïЭ(tfÜ{,‹O¡D[BñBå ¬%ª°÷6ÒmE—õ~ÕÕÏä~ŠÝâ™FJ]–9&$~ší/öë¡o“«!}`¹‚«èðò³çÒÿš#XËöˆ¡•¾àvúÂÀî}Ýxª�Ô‚;^O…ý�îfÂ|E‹K ,…Ç«Ì1“1Ûf—û=ÛÙ,•íeÆWUdßy¿nÜwèpna9ø‘dµ’å슒à×6ÏÿžÐ¨ä´{a®®Ò;Ô;Xß"Û¦íìC. ;Æd�âÎJkߣ7¯YíüÀ‡è/ÑøùÙ½o>óûǯ<@aoÖö#¢ìÞn->èa›»³ÜŒ¨-/{×�~¯Z¡èLyL„æúƒãc–ÙÌž©ø‘üWéë ñ†F£³sŽ—œÂªÀfY6'$Öì¿%éLó&£óyœ;VÍ'%/Ë­ú}gU_¶Ï¤8Óî¶.z¶æâ+¥Žë øhx8ÓæOñâàN7ôîúûV�áµÒo¨÷ h!KÏ!�h;Fc|¥öªî½“M ,ˆýóãºØ�€Ãkù Ä‹¡«Ë²ÛÔsr{‹ÝÖl:\„/<ƒ…V$&n"£çy¬®A]4'š‘بµ(8}ì[±õ·6h Ç"Ã>õÓ%¬#Û™Ö*Ý©•—æì׸O˜õ�Qû°È¨0�¾¸,úNzËKo£{\»ÚÏ'¥Y™!–Ž¡T^÷öŒ3Ÿ^4ZãßT¡Bß°��ÜÑ!=–šâ^½üUXâb£WµÌPP‘vä¯g(·èÂã_–ˆ>Ýü?\"ÝmÍeõTBXÈ òÇŽBg³Kmnê¶Ëˆg?m |_f2Œ db?ÖÚ“¾e¨»�"K}£ˆúµÐâƒ_,Âc<¦à\®¿Qý!BzžUG‚±Ä¶5Å|waí™v|ÐY&"¶O´Ôþ”Û&îͼƽt¬µ§Ò§¼ðí¡[ ˆvk/(�Æói“;¢3V³Û·h2¸ãש»Ì»G!*aZVÎqœ ÍΜzr<Áî}ïc��Ͳ)¿XÔ˜,Gš�ÊÄÐ"ªK˜A À‡…ôÍon¥Pðp.Û%¸ë–n™7ÙþµŸ_Üî¼Ú£6JÍVõIûjµ„X}¥ýAÅËÜÈ —À[:£{¡jâ¶}èw“M…ð/p S TeÖXAÄäððÁœÛ1›YèòHøvôRõ�0Suŵø3`“)Z“,DJìãù##z-ålJoYœ[¨YÄ3¯[-›Q¤­ÜË({R¾IØíäÛ¹…Å·ÚLÀYRbˆ¬×®L¾îáW4ÛÚUq9¢3ã1‚¶’!^¹u%lxvÄ –8WÈfdflI!}ä¬Ekõœl̸§djúŽ.7¥ sR:€'ÙJM‘vgn ›=\LÎûÑBÝŒö‰­ÇcYC°Ü½ŠÞþ¨9ßÛËr\@îo²kW–hFó"§òT׌ñx}3ô*¯P4H‡›çåÅȾ žDµ¾`”�j\�KÍSE¬–³éŽ\|´Ý1Ç{Bnš1ºô‚sïe§2%ò7ÈøÌƒrÝúZÁâ Ð"‰‚B¼µž˜wR¡S$‹ÁÌæüÈz™ÃÑêÖB»­ä™‡+®†U&Šöå*ܽ٠ôóº.êA‘˜Œ¦�+pÖETHW¯Ê:ª]nàîR•úñ%ö­š+÷‰Hq{@ òð4zZtÔÜsL:Ba¥ä#Ÿ6² b8Ÿ‹òSÙ]Ÿ©ä[¿“ÛKâú+“Ù¿&ó; ¯B°ž  â-�“&i(h>í£KÍ*IÂ}¶g °ž­õ×£ÀÆŒg+|ÏDù;hDá7eñ­{u®5òŠˆ¨ÿ 6�µºKdaíh{ß\@X¿È¾Æ«šòBû�WÇ…=vÑ0VŒ3|&i˜'ÄÒ†ˆÞ¶ÛîE•ø"ÚÎSäÞ$ÓŽ ˆšÅ_=rjß•Õ)@)A¹Þ{ñóì@Œkî}î*10|kâ:—c+p[+‰Æú¤*+žp�à�]Ø«Ùvåz MñBgUA9DŒ¾Û´£oQkõÅÄÎ�Â+4�^t8T ½Š§À°&1‡±=·šÌ[Ÿ…4ùÐG� l·�»Ã—w|�­v± ü­Å ʉÒú¶ÜÉà-Ù¹ž†tk <8u„¹èÍÝË6AÃ3Ž.ù”­ôŸæ-WgdulgÚH½ö«Ìè ÙQE†øÑý�‚o=ÛU`›¦¨‚t=rú~Û‚û`º¡%õò%õ~ Zô·nF-P1IwÀ­‡ƒO«:ÅK“b=ÕLPâVç#xÖ�/"Ùgnˆgdpum[6«qqºA}‡?_m¸Zp�ŸMË�´14—°Ì‚mMÍÝËU!‰#Ï]~¶h3Isü�Ä>ã¦V7ørÉÏxë§L¯òXúI Ê‡Gp|rû[n[¢N(u:œ Œ<aý�ü”Ú‰;É0zßÈÑðrå«M·ó�£Å Z L~ž{`­(£ü»¢pFý~ÞñÆ»–lXXFÌAÀÎ-ñ5cˆ9–g5çÚ4dÓgˆ Ëc01ð¡ìSnŸQÖ9öî €�Æ�m­¸=qmò€ÇLôæIÂ+×q»"_NvºQÕ�nç¾7ØlC“î,[¿H+pYÉ 7¯O•uŒ–0/ŽŒ 4H” s' �LIeþÇÉÓ݆¼‹z΃[|„:lØw”hVk,³dÈÊ6tº;5‡Â�§‘­È¼kp) é­»8Ÿ[Î+.¡&=F"�Qº;СfG7ùÍbƒä¾›&¼-(z2¡»@{|íe˜ÅN뀴}ñºV‚¡±žÖÖþ†k_¾D‚3„§÷D ÷qÖnË ”#}à$’F…9�h_L–õúPÃ"[õ[—>yÍBÛÀ'íòŒ2C9ï Þ"?e‹.̉ó‰É'˜±vK tÍëdÞ°Öœä:ya¾âòÄç¸ðuœ}t¹wgMhÚz°ájl¯TmvvÂlïgÁ̤5íÀ°û[÷2PB†È——޾ùa÷÷4ßmÇ»æ6µÐ&rŸ«Ín4`þGÃô)¾óq¯{Ö²Ûç�9–/¡˜¯u†ÈœŒ sYgÅm »†U|ƒPÅ´\¢—ú%lHJ%B¡ST©ì‚c.![,7¥õÎ{£°ÇnV+N‹/Ú•”&e-(­ïÚm*E�ˆz/™møÝÓæÂOD>ž|‹÷±Æ¿Ÿ‹|–ãÚðW>žOÞ[ß½�m]¦ì”ÝØ5ÛÖ­ëýk;^ʹߥtb2|`ã9kË »Š*¼Ä PÔdq¹ÔÀ3¨Þ~�)=ð¢Bßsqõjº#ÈzW‹ð~ß�OžãƒïäçÃ}}š|›:r¨†^¬4. ƒZ=À1ç^‡§­Ý>ûŸq†DEP‚Á”§WÞî´åSZŒ¼. ´q—,%ž]åî5L{Wº´¸!CBˆBŸ²¹Þ”!÷R/9ö0g„�¿#mcV–ù†°ïxs:pþ! Y�ò¡5ƒ–é*ÕPÌVÙ´PAA\Ñ3¯¤g²šË›®�ñõvHµž‰‚cÝœvuyÖómm\¿ ­wî��$óÙÙ1¶†Žgn5O _‘(°X4³Ûç~FÛu lq¸ 3ýÙ¢ã‹Ú ±óƒ! ,¡¼]¸J{„]º�½cÚùz·oò÷ì.øsôä'»P)GsAh —îú�ñ¼µ {f­Kx?—q[HJþL^m�˜7=1�r5ç·£hKÁŒ­Áxl_žÜÑ ËºðòÎ(®xeûD /îFÁ=w´Å~sŽAöÚ jœ‡Kc©°zd¤ÖÏ–m,S`o6�Òê�H,ˤêÚ¦/ª¹Òí’8E\Žüà_¼†+ìù� Ô�è 7îyaaøÒÖ›zÓ+‹�h˜.çBv¤¡µz;ÔQèF#F—»øCÃa{Ziƒbn’ö�Û%Víw§üÌì`¢dF–1¾ƒ«š•³¡¬7ÞÈL.ðO|Ø‚¸Ò —–ÚÀoF¾ kéYo¯ûr໺ۓ ×5Ãôºý˲Úô¥µäήÛ-IZ;ZÓ¢ð'E�ùÊíÃ>‹Rè·[ÔEz�xCBNXqõß…Žȧ¯g¬f :â³ãG'EÍ.ÇMJ§¬–³ Cæ;€ß8êÍö¯ÅuÂfðœ�CÈÖ›=\‡}ëij›þlï*à߆ÛKµ;ø¯x½ŒÓ(a»�¨8®ŸÏ ÂXù£ f#i||á¨?r»èÞç#fĉ �/�à›*·ä»/:\}om”p£×Pða«ˆd2}Ï,‹&âqâ07âN Ûu 0ªp³.M. *×ðãÏæïdVäœT•‚m; iœ%뎚NÀa‰�c¦t*Æu¼+Z­ÔwíÒ7ÒÒ~éÉáuòqÂJ š~ÒÜ9Øçâ¾ØlÖþŸŽ éùåΛí§Õ<ÔÓ6FçÌŒž;—³Æ z€ŽåÄ(ÌpP œ®΄ĭƒ—Û‚…øÌ‹zzV ²ky´€ôrý³HÃ÷ø6·)îŸWнõñ r¥²5'ï²�]Ūÿ7À—¸%¨=àÃÌz…#`˜É:›éKÕKÞK­ZÍh8RY+iÙO­Óµ[)zŽZ¼üÄuBÌÊqFFa›omGÃUMzD 9VJ½‚M¡(ó—Æ}÷Öímíè÷§úûäæUÀv„Go«Z`ð‹”Ä$àà¯ÕÔ‚uu‘U®žãA’Ðw£Á*×Y”HµŽa�-ùtRÜØ%iäþˆ�ï ÀH;rJ”ö Goj›«)`žÒ&ÉŠÎÉöI~—z8 &0chä’àtêÒþï Óè�U¹¼9v³më¶Íxû±AqÅÁ÷Ìs°ÐÆiËè·Êµ6ÛÀ¶l]Ñ*)�–4ì›–®“ü͉Ö6² CTx¨¾—@Q(W¯ÇÕycYÕøLÞ£r7O:+;EnŒÀ�æÑ–4vÚVtû©•ªñQáÀXõ{}¼>£6èßþá“–cóTúˆ´ŸïØ;†Ãû¦Ù%k¢0Ñs†lßšÁ¦ÔÌD­5p]‡´ḛ^§"›Ä ¥hͱÓ¼qOÏÀ sœ*jm„Öod¯¼2ƒ}ª¾º+ÝÕ:j9gÄG3Ï­æJákD�™,ÓgÚ·Ê“÷Æ/˜N‹xÑ¥´´j3W=zvEçÆJu�Øͼ=3��1Pb…[vŒ½»uŠV<Äiã> Y·[ëˆç13·¶úÝ(œÀnüfkF±–rŽf„E÷…\ Žù] šá¦½®‘랬ÒL_G¸[£!²ÕÀçŸ��#`v³dµš ܳF¹½ÉÓ½CƱ¬T¨M<¢j…�5+¸³Ÿr¶b¬P#ßZÑëPk¢†–,¦z_{Ýý†~QYrD>Pä>ŽÖb{ÒºÖ•{s4ìo ˜cGTö19 ”óÅoÜ͆;¨ÜÑô`µÝ0º¿!ܧg0ï  mu/¥eÊvM”ÎÈUõîúÝ¿»ƒÁ6Hᣈ˜Z nŸVM¶a)£‹„Ô‘@6ú6ÏPü ¤TöÎ7¼×BoëÌZ&šôxA= X°Æcø­«$[á-f’† ² Õ˜-9�·»„ êB57b½tF¦Aj_Qn‚B XZ.[¿Å[Ȉ@´­ZáÍaÖ9f !ÄÆ –Sˆx¿Ž3ÍÖÆ”K0Z†»�ݘ1>­Ô0dc@ÊÚî˜/�½¾)rOò3Ðe´H!êô˪bˆ]õZ©k¼¸�­ ½ØOö00ƒœÁ n ²{ ®Ùˆî)« íu�…áœç¯j–SÐ:6F‚_mæË•Êž–@p4q¯²ÐÉFRÈ÷e"ì.„x}☑ nÛ åM�ÜXDò¡v+o|5j¸—.Þ¾nÿ×U ¦¹Ùíµßv® Èb$¸;׬ïq¯•‘âÁÇ“!«"ñö:+‘è¸KÇô'çHs• ¸[¶Ó¦8ÝæôÙïh£Ý.}(÷ xâžà,_C! }îÈEAÝ”`‚©ñ-–ÉId�’uÅËíÌ «�¬õ-åç(u­ûWµë¡ •1AjíO*ìF¥îoÇ}Û#s÷³Ý¬—<‚Ãõ»ÙÑnÄ]GãKîùÛ#€¨\ì{öíbÊè`øñ=gÇ!ZÎ}ƸïôLç‹§õ.è»gBÝ�|¾Ó©a‹6å_Õ§kÖPAˆ“÷@ÞkwÕy`­·…ãÛF{·ƒ£Ÿƒ™Æž®Ž,hÇ7nu}òË¢{´]+wÊ žºZ4Ä$-\þlÖ†öZèV @(� œö}‡à 5Þ.µdÆqžrΪVÄé6!…¸>õÆß¶E„k{™Sçcž�ÑQg^ÎXH9¹Ç¯NžÎüåÝæØ²÷ôE@+Fºíû»¿ ßœ¬¯6j#–ŸÄ÷Nre‚-^&BïV¶³F‘Pͭ걨Jî­Z¬à=«IHk‹Ê­éšílf~Jis }H²X°}øþ’¾ 5·Ú{=4r¬Df;aån“xÇ à$¬êa¬Ø,hÄ7³gJ¨!wï^FB·E¯ ‚ZIý°4 ÌŸ sëÑ0AÆInxÇ6åç%Ð׆­1‹‰—7ªåþ =Ÿ×ÌÞdµæK¾ñ,Énº�\í"–0¬¥cž¿`=~ì8� ö§fÚÒúÇœ]œj¸ÈR¥ »“²8 嬗 z©ŒܶòÚÅéGÅlâññçžþö,{aåŸ�WÓÿ )þñ@(©J{?/²%‡ñ»=�kH0º¹=þ¥aô@UCüb©fIØý6i·½|k÷3²HmÚ¨86»�·•޽Ý8Æý3±¯°/q²@Ur0»Z7娂áŽ) 0(²4¹½Í܇€dÜÑšMí|"EÐÌÛ·',T¹OóùSêÔm3bÑOUtn„Û¬5v;Yí´á{;}Ÿ=C8ÏwirÌ ï~½ò*†–R8;^éY\Ãá¶lX±“Ð9F& 55æ”4E¤\‡{l¬Í­u™¡°ŽÚ ^°á|æVÍ—ÕÁÙÑ­qeoÛ׊mܤðÛbfГÞ[V_ÏѺà�½C,Rµçu¡¸£êR�ò0Ù6Ò?¤®Îöá¡RÃQ»ž‰1�µ¼?ì=Yš`Aƒí#0˶3ΖƒZ´a �와k¬dUòPV;Ô© �¡I´hò3±¾Hn2y¨BQlJÿ�ço(‰:-ÓÜ5["¦éœô·‚/Ösñ— ð즠BÐìļ|ù|„7•(d&(6£§mX_™WïH})1{^sd c>šì§€õObƒAË.8*ðí²Øš=jBSX5dpþ³#=ö<;pÚOJô¿vþ,Ê`"þve+·˜õ|f9±èÛ‹êâÊÕŽ6Ñm¿ž[Û…äˆNç̱tÇ'—ÊÉ…�-¾+•ý»hÔ,ÜÍá2¶Ø [lw tbL4«ô´¸Zlºö pÁ¡ãOŸt¹’qc“Ìï©ÛÃÍ�—Y¹Þ) Û"%Ax@A}‰¶†Öjųdº‘ÜÔ¹6ÞQ:¬µ–@°"WŸcº§ZÏËš[F+j3#hzíp@T½$‘^ñ)nVl¶t+ÍÅ[�1ãAnÄÍdÞ‚ûœ�ÁÜ÷gE¨o%hi³Ý kÕµ·ën:øBÍb^±îUöŒ»ï§ÁÆõòìeêÜ´6ÔÑúivâÝIw™µos™;ךª>¬ÈÕÚ½X1Ue,uæà6®¶ÙÍnñíç¬÷Ð Š R˜Í[€-à÷«„GŽ‘L¡JлgbëØŸcM2¹M ùqwkÀ‚;›?$ »"†ÎE1œØÀõÜæÍOþ[d†' ô.u¸Om€±xúWEÝU_v"p,°3ŠÜ¥‡VÓ°û[�ßÁ }±9^6ø2[ASðÂƱ׀0 ù>½•†~â]ò~ø{õ8@“·L-Þíf#Á1k^`¾‹/H£ÂŽ@”¸z鮺8?«Ž°›Û!¾’/Þy¶ƒ?‡ص=ŸCRJ93é,¿0Šcƒ :É@ñ´€¥àÝv¶% k²ô].&q$ð;¿_ $|¢‚š;ÁµreS,š¨ŽjÍ«²ÑbÔ8Ÿ2[’‡˜i ¾dü.ºØ KìÒ×·‡\Â$å�º ¨vE¹L,8ýœÄqB´A#§ët¥™D�ˆÁ¹®~aQ,ﳃy<Ùáml¤gí½©”"g�±¡Q’$±R3Lß.>Pƒæ³Z]É’s¾s»ZC‡À}‰\'¼y¢ ¯ƒì%ŽçÛ ~nà}§F£Á\´¢h<’ÃgS *�Îá­õœ "?Y)í�Ó×oŒ¹Ê¬ßlཹ­ÚØóÆÚä ¥ß3WÓë$<±êoºF»)“~åã¿n,¹ñøR¸€ÿZ¥˜8·ÍêûÔçÈ"ØÐ×X(‡zš-XvÇ|• Q˜cßUäžAïŒbïm¶ (qT›ßQ¹,ßWϯgáòýˆ·º _>æxA´9f/X:�\ mQ}õEÏÕÚ½÷ñ�}¹…’�± Û)~Vbçhýó€Çur€>^Vþm}•ù¯Ê}à~¨±aO³bl‡T‡Ÿ–|¿+zfÒüj h3'O2ñ)IŸë_N´g�JE+|/ö˪½¿+—c£éëršü�¡­ »ï·É{¶3¯:š¡¡ðøD™×Ž…L÷4 Æ*”=>>¢o«ÙÀcòñ7šûàÜâ“�î[8Rì?�ºÑuþl©�ðeù’ý.Óq�ä» 8´äOÙ�¿R²|âÏÓ²«ÚwÊ:qB¨<ŽDMò·µ‡AptóS4Ì!FjÍcñé oòùªŒö&íÜKôR®W ¯*®D , ˆ_xOõ~™ÇU?i…f±iŒZîCúÛµÕR4Õ®([•Ä«xu!�Ëì'E�ŠÒìœÊM'ȳmφH‡Êœ^rr›•l�ޝè¹aµ^ªÊÁMù½9«®®ÖQå>Á7¢=&ó‚X£_Á#R¡Ÿ `,—í®.T_J Ôž1ºÓçPÂ6z^�ErÒd ¼W]ŸäÌ}¦-ŸÁÜ3ºã÷Ýs‘Õ&¡2´k¥ðEHÍágˆëß <ýZQàØ’È’]–¾~/SÌXhI²òòõcO¥+a�L9Pk¯�þ˜�`ÍâQédwz ªÝìX&´OmÅžT$[}Ý%&›D‚±µÎHÏ-Õ÷¦‚¤Ç9@aßNÒÆO‚®?6è( Àöð¹°{z¥vOßm˜¬÷¿ïˆ_"Ùp’߈ún§kÖkî_9û�w- ;tND4 >¹W±è!ó¡ÞÎ9®=€kTvúýŒ dŸq$<,î{”·bA…µõë#«#˜Ó¨´äý¤ÜSšIP†$êß|*VgqÃ{ñø4æï*‰l?E±à€2'ög’k[Ïc°+K¿.ùâ�J‡ß„]æûÜxÙ›‡“¢fÒñBýÛðÎE�Çà-¾™PR‰õm¦šJɘÜ;ù�ìF9±ñQ`Ë£ùòV›ÎrÁ…!,N¬ÔÀ:Œã·úKiÇXêo3‚¿àW"ljµªâ¾lm‹#ªÒ1D`àÉÉÐsMº5¼»�ÐÍKZ!6è\PÆ®G¤Ù#òÜÔøþó@3o)Ë(’4*—�´Šúê|„Xh|·šý&ÕÌ1pÜ´'ÏÎÖ>s†j“ çºs É!eW;Ô@—R7Pº5¿¶ûápKë�~ˆ#jF-ÆVçut¸t{ô¿ti옭YÑ›ÎmD¯E%ÙˇM6ýËE�îÕƒ¿ 7}ZðDY9¹2æ?#‚èMà°ìë T�·†ë}aXƒ²ъ̽òü æÁSëa=Œó››þºÌýRYi¬’Å®åLÛFg1ä+¬.†Aù‘�$ÀºÓ¿Ë.>dz†è眰x §, áq+ŠW–LÀ‰âä]S䀭ÃXmg®NIË-„蕤àí…=š§Tu³¼(ï‰"©Äa½ôcóz4¾{°·°cmÊrÁ�‘MºI7�e ÎYEFJÂÁ!�­æÆ‰¨Hú�GQ| òæ Œg€‰ÃñÙ›yÀƒ6Ǥ_‰c,²ïf~Lã«Ááóaã-aÅhŠÿu�XÓ5‚ 0gOûÚ1 ç·`€dÞz.W“øôü=�»„H±ÿ©WÞͺ9ŠÇø  ”YÔ@¯ÑöGÞ 77äÜ™ê”݃�ÅÔ}`¯Á€½ö™ö¤bÒ ¤ý5b-X‚è︇CmÃTÎá:-ýûŽxŽJCUXä¡€*Ê� Œ)‹çSùÍAZ Ec¨�´Nñà%�#B"-ñ§³ÂŸqt,^9 ùÝí“´æ/c ʹÈ.þ‚W8Gå•¶FBb­2ö`‡%½7TA3Å<ûw±o¼?o²¨mà÷}ͤŽc/ù# ¬èøï®dKƒµ·Ñ€jæIþÛíóaø«Q¯„· ,³êw$È%•M0î¡Éë€GÌrÓ©LÙ±ê˽j�ðÕk]ðWq‹¢^AènŽ]ËãUà_Xì9“)Е8´mXÛÞîCómžÔ®·I·&|€)žØ¡dºØu2PºË>sóâéönEÉèá—�¹Ýp€x«ya­½º«3mRÆßZ=˜æ)3N¹w[+Ç2þz{-MÙÉšCpÚUo¹]PL3’{[5°obŽ-°ÏuÑð³HêbÕѰsò]Ãmh† ‹~çí⸂ÑvÁë nöuìw‹ÁìÎ>��Rè8Ø9°Þàf‡R}G˜7õÕ~¹]¤<“Ò,ë �=ÔúØ9‰vµùðïWK¡P“Kpߎ¥c`Àߟ¶^?ˆ ícì8wQ:Ýdþ4í{;¾F<yòŠì·h®�šD#¸ìª-í +óÎTÖOî†RfkƵ¯M¯«Þ–6ß0Í´QøSDÇ�«îÎ4´<‰ó]¤Í‡y¸ªòW妵jnÚ-Ø(£<ÇíhñÝ�wÝJ5sUÄ× ãw|–ý�Àfÿ…p¥–q°ý�#ž¸#·*ÐWx–ú GZóÉÙÉ�_*·zÇœd6§U2±ùOÀ1ÑãÎ>ZÕ�¸4"?Ê—L�Ñ�ÏF/‘E¼ŠÎ ¼4ntúIì‚›¶�ìÂeÐ֙ɬ?` ‚÷ÐÒÁàîA¬ƒkè{j`äJ„^ôó¾5±–¦KÉ3>…Fª¤VÀ¯F\ª˜¼k«8ü>�Â[×.9Q±æVIJgãrH›nX<길nªJ±ÝEÁ}.u§Y嫌#}ÍS'wCÄDÏ71ÚbÕjú°¥VG2È /˜ím ú4"óë“÷ßBQ§Þp9&ëýÎa´Ge°|"Àt±¿J%¡½�õUé jÁù×v Rޝœ¯&Ù•àë“R<ÜjÜýy\Äš@–ë§úÐÄ$Ëû—¨ ï©® c¾›(ì–3ˆÄ°ÇwË,fsé  ”yúÐ^JÇÂ;õö<Ùy‘ ØUý+A%~<ùuËt÷Ï E^‹£ÌB¦ý¶Û Äžbsû)Ù¶µ×�&Ÿã¬jŸkŸ8VD5a³¢nÀt3Éd#oî�›æ;ŒA j±Ò!3À%Üxvײá›ûê³H¡ Â¹áà5ñƒà6Í|¿@me’[H63ž Ü{@d [ ä» �ÆÆz- û É 6¿_‘û÷èRž'0H]-“˜bÄOÁU‚ ªéœÄ[t¦û7‹ó\©½´ZÉz ·j¬îÎZ&¬S�|Ðä"Žœ³É+KP¬÷ºJÖ¶gR®T›×#ëÛøz؈Î=àqÀ¸Gµ·‰¸6ÆÂÙZоš›ôÀ1" !õ—öÔ^Ùá…‰r-Rà‹`«‡„4œ{ÉTóÃmFI×õcW¦PÊÚJÈœ0¦äéØOH¨uŒ$­#; Ü“&Õ8q0XÑZŒÃ.7¡ Î 3 üŠÄ¶Ûæ±µÃ<¼ûŠ¤Šœú£ÙógyÞ� ÀÞÐâ;K"!YE/-4d ¥á.Åg¢zzêù]û"Ró¯U—æùîï:»D5z q ÆÂðK{¤( ¥&Aý�Jás¬£K…Ã~h1vÉ.hsT qÍ’õÏEk|¬à¯«…ô¾(# ø®‘–Eíšrˇ Å…b}ÔŠ‡¤ÞB•%•Cï±mµ„$y,„¾•C%”„áo«¾ÛqøŒC>J"f'$Ârjvw]¾­‘ØSoF¬i‰¬ <â“Û[ Žû˜etØ…àR\¦úÕŽ›¸ÒååötµOÛ¬¾ÎÛ«EÚ±öú¾H"ÄúBÕ»g•>˜súLgáÕ`Ú¯ Öô¤÷,Á3�ÖEÂC”·•ïèA=¯­XÉ›Áäl‚¸°&×:eÂo_ŸžäÇ.ÚPŠÔ#MyP#<¨([Vb±­r”–"Þ&@Õ&ÚµO2«“¹/2L1y–¾˜ÝˆªŠ¯Ì^a0‹ð[±QV £UÀ¢�:ß®Ïq3«o‡nãõ©µfˆ¨{¶-ç~Ì–*hî†u!y� ù¯w=»�Í,w¸è¹jüès±b˜âì@¤«A-7šyÄðó ©¨Ö 3=¹F‰ï�a�zE~e|’ö�;VB%‘Ò¿´kAÃôX’~#;¥åoe@,µÓˆL³\ÙÍl!o}ô/{¯BqY«¦úy´Š"�nÓx·°6ïVáåÛáðexäÍJçuYß/`V¬,b�1DcTÅ=r¥Kàñ{æäI”Qú·#Ã1lÆn0NmàîÔ/&m—>ö·Ý[^—r-÷™Ôàø|ÞË‚†™î ƒâ êËmí‡xkU±çerð §$“�È¿TGWà7Z®jô¬Žb{:n%Énn#Ìo+cñ§ˆ�$¾í=“~K�ÎòíÙ‚¹óáÇR‡[o;ëW‹ª�YpÖìq·Ü�œ‚àf³4. ïæqÊÏ„·C=.Q1eðL;Çîl&:±fcÇåÕêïmjÏq±þ%yˆO>÷ůwebäuH‰] 0o%†Û‹Z“]Íø®âàtå£òZzb{äM ž_m»EÐ$’ð8)o†zhD­è\ž�4ÀBp?¼|ûyV>�þ{�zj�¼z¤{îOÍÔ«[•}‚Úh†Ó|Aùû¦�V>(ÊÜÂ-ÙÃ_CÔtàßÇ]F¾—ŠYpÙk6Œ¾¯IþºÊE&+á�(k�Þ$Lþ]׫rdñÞL­È±fvt¥›·ZæImd-�ð½3‹Ñ«›©çZ�Ú³ ‹¾Þ‡»ghú EÊ¿áI¶zÆÉyÎF´¡Lf|ªýYÝo+�Ôð�™Åû|7HŠ1ydèìíÙØ¦¢Ïä8òû‹ùGR�ŒÔs#‡³a{ 8p¢Ä|`ù'=œ\9f8Á™9]ƒ­UIšK >O•ÏI_7óÕbŠ¿Õ˜Î”{ ®ar¢¶z« `K%{Ã�ëbD+ˆÚx‘Ý}}t-\®‘Ó“ô5u`›aG‘È©2ü>äß�Ö÷X*8~fCh¨5Ÿ�©2˜¹õW*x�Ù¡‹ úÕ-„M$õКG ¡¹is¿FµÚ/sÀ™",ï�A‚oc)¦ˆðºbð¶8µ‰Ð9à9Å…pZ�˜¥Ì×ŧ‰~Q =ئO6îß¿c‘ùÏ0ŽT J ýOñõôÂ,>> føRÔM§öùEµžÚÄi«‹§K*„Mõ…ã@Ÿ'.ª!·é–qŠôh(mª�Å£§%ÎoŒ‰ø� �õKiÇ_Íîa�²(#²('³ö‘oã®JÂå r;b^X…EèÙVý»ûj‹Þ¤Ðô—P@»àÙd^™¹�¹Ò7*Í«îô" 8Øë €ÂÂ4Å´åÅòÃn3pµá°w¿™vm�b W[M3…_—ÙÛh|äÍ(èv@…`|Dn‚ç cç?|bºµ>ï.ò÷€“ÃäLj3½Ÿ_쓌Î�™Ãí;´�¥œ¹MSÀÆ®(Ü|Û³µðsFu|Å› 08L픵 ¬„š<£hÇÉvSÙ~—±ŒTû®´",›NPAŒ}¥=^¹öx†9�w=ô€îžºý6xkΙ¨Ÿ“®R}µz×ÄqÓYT¢­`ÔŽâQÆù¬ð/aFíÃöýUï ¦æÚÐg(1*»I+ À ẗvÆÕŽÑŠtq�V µ[wcÖ¡aÝE‚r}ƒŸ${ƒE¸Gwm,«UQ³h»ˆ«_n]#–uÄî­¾/f7—N�#Ð1U¡3�xMw!g|`£¢jÇulâ Öã}¶¿\í�ýÇ×;iK«l™Ç¦Ÿ ¶îwM5£Š¢B|Ü&™Ã—à ÛmöàìO|êË—ŸTæ×g¼UÂ8-×¾¦á9° 4As%G FB¢Ëbø|÷žèÌ2h¹Ø%ÎZvfKl±ƒk{#XuÜ3tÝ,�^²ÞQµÄ�Ž3ÃAèóë°cšÈP£y/Æ’ÍçUV357€/ ‰à÷µí.õ©ÆÙÏÉ¥ÒaLbí^]W%#«Ì·zm¬(T/¹ÅÃJ€,�1äb³ÙWÕÅë0ù¶58ÝÙ —�ˆ¾»Ûƒhf|EEã+™£ÜìœíúŽ@e£Î¿ kZ”�WúþŠD4.Wƒñ+õëäáKXÀgï–µÇ ÁMÅÌT•ø÷]Œ †/!6±„ãâÏHzaâø&,‘� Q(Ç·@•L­j^±dÄL´ÛL±rÙ N»y؃ZÜmsݺƒHœ¾ÆBö�’û ‚ có¤Ìº…¿Kd=ìû|)ù3ÛDNþ´\Ór-Ú€Ž0¡ÀœÖ¸Ð4Þ»¦î?FAL“¹ÜLͤù†<’ïYIåÀ»»ƒ;‘…`¹æ`aƒ°¾ß˜å»´6š^r~%Ô_j6FµŸ/6+»ªȨíûÎÖäÀœ}¼>W$$¨ZDW®ÛCz:‹‰®ÆÊö ã�¼©–ê«@Zuˆ›èó}±`UÎë`Ë `›Iù1ÒÌdÒõ—kôá:e–|?8&¥×úGA$6¬bTëZ� ǚ܂V’ /pu³ãsµ-�Â,²Š¶¶:×Jü]ŸDTX$-'FøÉ�ôy%©˜bßNÈCiK”Gë†åóìMŸʼk¹¤ÍÔ2PxV°ÛÔ Æö¸o[Â~‘MaÊ<àõ«eSM†ûáV3æFKéæÈZAˆ@ á+d ®;òg™ Ä)aï×ËENva-øÃêiö:öñØ�ÀVqõ“gJ3ǤöÎs¬Nµ3ÁGÅÓ*™WSή‰¹p8J€_±$‚,T.ŒŸ/AdL0·•�¼|YÉä˜Mäåu¤+F(.†é²7`4Bˆþà‡_JI�öƒì“ÓÚC;�ñ·Ã@ç f~kû~{Í�p/€º�/Z™1âô»?SÂi8wE·–á‹Çž oÏhÝë¥ï$Š]=[æøñäæÑ}£#ïlÁ3}îàU¾å3wœØµËìïf6Þt*;cÏŠip¦žaä�q”¬ª:=ˆˆYnÕW¶^wÅtr]³v²gÆ9yÆ/{gÇŽ 2Õ¡Â9؆L ím¼™âÖ ¾×y¡Â•0ovõ@ #¾ÃyÓžÕô¼·æØ>5ú¸!{ôìï¡(•8ÖC:›ƒ89 ßÃÈâ:v|ë/o£M±½-ïds„=|ü'—lÌò ÅŠgŸUÇSëR!Ø•±ŽÝ�Jc‹ Þ±£*‰´9HñPW*›h¾rXÈ3®lçÅSâMÇ£3¡®õ=ªáre÷½D»è^ÜAÆOïg_¬m›ã`;‘›äoTõèú*õm§8]J-M(¯î�­Ú¤ÃÄE”óEœ-øN†òˆ«w#QóÅñÈdоD8` ·Í¶ûƨ[¡ö`ôøÚ1çšêîÚ——¼/3\J3}ÔaþbÞcnV=ô¡U~ùbÅiÞàç½,$=°—²ßnêÍ*!¥l&ë_›ôîÖNÙZø°–k®ï„–€D[N å–ÓúÁn[BôZÀi‚\¡é `«ˆöI\âäAÖ0'“¼K½”�œ’þUŒ†ì_¬mC¤ *úS%ŽˆBÇï6 &¯fÕÕ¯" ¤yÌ4â(ÊyÈà原EK”î®.rԅܪúl³ÃZ±�¤ºî.·¸\ðÅ�FíÍiøÉ&j\¬èleB¸ºß VÀË©–Àc,"‹úW¢N•„ÃUý–¶+˜„^sœáe�#žžo¤íŒ ÞéƒsR*µ=ÎÌBªzHG~#j5YLø³fú¡ÎJêO�Í¸Õ öœaÁði„'òjÍ�\_š�Ö¹~“24L1ü™a )?Î¥frÌï=ç1Y¹žè�Ùyg«”p5wŒM%)[ ¬fT)¼&ãâ´/…sZœÚ^7&ÕnÁg=…uV•Ý °ƒ-FÏ–òNKwõh� ž…½=ÏOgÖk� Ö›JQiV䘧Ê?°Ã\YmkFh¹^úùªt�P@`ž £åÐ'<À£Z›§cá®ÄAÉS8åߊÈVNÒ, �6J`µ“™ÃîÔƒH;pk'QŸÉ—¬4�¼ª9Ì.‰�$siÒ¥ª/½Tßhol`%Yü>ç�ìËI#³(ík²êâ…€kÙQŸ˜‡™5[ŒýkìÎ�­/â¶�aË Y¦qZD šn®Œ)h²BÃRªxÃ^���u’�.�»–lI‚ÍÒ/lå�ÇÐ�µ>Zztfæú©~Î6«h€º%%¹£ŸB¤”›w&®Æ&›W¨| Eƒœ•¦ æ <¶ðîµä‹fÕ“Y˜-¨€á(½öòÓ w•¨âîú²ë*œÙ…¦ñ6Ñs‹<%ǘ.é8£q—º0´dÚ£ý\PÚC¶#±µb`¹‘*u”ó,Pžµ6u{è7 ™"#yã 5Ê�d3¤k«ÂHÔ #Ž2»�ˆtr‘DžEM1Ö;ûÝ¥F½É,ÊÕºxŶº0DÛ„*À]Ô³‹Ž{ט’ïgsÌØ0ðµÛtòvv¬_›“ü‘íp¦ôIJÌ›ÉÀNñÝ“ˆV\æ�ѯ zÏ#SÖ ­›~yn½’‚‚nd�J ´¤Ï1çL;»íÝêÁ¥Ñ­2Lî‚Ö€¡Sm¦MÌKnwh6±êଠéUŠYp�(ÊÖu¸ÃÔÀÊž³»M“°Þ\·Óm¡“¶÷‰M"n–ëlE€r Ä�C²;om Äm3Œ\ÔE2˜t~8ÖK›“�¾…™oÞF®î]R`î xÉtwáq9Üã9 &‚‚Cä:û—:k”…�XWt×ÃXù«—2`6FZF3 ±Cñe+Sq¸½+iÀWÙÊ\(YNq˜ÛeëDSÐÕ T‘.ô�Ò/¯V£AêZ8ˆ×Âcºg�ýT–\à�Š‹‘-‘‘Ú”� ¤ ذØCCµ“hé,‹ÛüWX£,!ëS/aã9¿íaYH™�Y�ÝVzÊ£æbö„Ên3g~¦¸],–͉ë.ØXCæn;`+i)eí£°Õ+ #‚Q±t‡sm責ÛÁ\sb6ïaXòhÖ€“Ûúˆl¶q®œáW9j½ho¥½5´Ñµò5n%ºÝ´-±Ó+tPµ+hž ìÎÁuE½Ç@„¸8xãÑÛn ’n/úá-—T)?¨›™Id¸ÝƒzÙÒw γ¬F4þnXÝ\¨=³Å¹­Âp Äw•nðô5’ˆ%rÌVoî'Ç�ËW``ÍØX;bÒž ÅÀ°�Êj›I�Ù;Ͳ¸G­´F¥2²aÍø—ÅÐ…ëxܹÀÜUSV•ÔÒ™--%‡RqueŹ~«\l3°¸j*/ÖÒ¾Žt‚*F «@T}ÄM°”=4=‡yÝ# â›  ¶xVb(Õ‡‹‰º8Ǫ�Cb Ž%™ÉßÉgF(ök~x¢õ¬­ZGY®ù”³åæ¡È™uä½—A,Êz²b3,�¨Âžpl’!¬ãº}:(�_–cܪ®ÇVCî‹“ójƒPó*Ð/Ð@ܧV(ÈA7ÖËÞVo9ºU^ÀžfõssÛW‚µKŽ:ÎîÊLÍeÝ‘Ä(ãÜ(‹´SªOdUøROê¨)ü·òþÿë¯Ïïþ\{úþ~ó$íÑå>�NwרX¨b†n¤0tJo›`Iï.[>ˆ ¶¢ ¯ƒÙ�%ù|í0æŠÌè½Æ±v> GmßwëxãW¢±£¿)J¶Zc‘kFË…z’’RЦ?¾ÉT(A�Ò#˳­èUÑ7ÓÑp�Epßb\Ç:…º�î†_p 0x!mæÅ'ÍმpfãwÉÉÕ)?Uslé¬G´|‚y±[Oì *ϦÍÕ>>Œ}ðq>b„uÉÄÒcaááZÂ�x!T™r€>Hg(òyr«Íþ¿šíiÎl�‡Û5ѹì 1"ÜTÖpåez½–"ÎYøsÉm9;®±›OJж›F�„Ù­ú…×7@�’‹c#}BT�ŽJ—�¾³ä¬'P°U—´p‹ ë±2Ló¦ÕøßF@!O¢/qA†ÈÛ\êù4ß'ñ‡·¢´Æbt È÷t.驌ƒè1Dâ¡IOŒbT0$C×ãåó`ËŒ5^wÚ°œyZÜÂ3Ot»È†ÎG*M+%­°‚á¯õ·áw”ŸA„¹Íïˬ¢ñzí7¬}Nz6¬�¡'뇌_YåÊÌ«dô $,E8ò ¤Í+›ö{ßj³È(íÌÏuú®]¤«§m¯QÒgM8½kˆVÊíƒEÒ$Ìp›¨¾v¹�Y†Áç¶ÒÙ±5åT†úÀw+•¬�U±vó¬î½IºZñׂ˜fj|QgÍ9Q½Š\^_ünÜP”½ˆ\–L#¼éPPÝ¡,»\MôÊ‰ë„æ ˜¤Ä0Ù¹Î�#†ñ'uˆ¨°b+#)D?–ÂLœö¥n¹0-ó{"È4D-áï¬ä=8|‚ï"MµÕßG‡§N;Ts¹ÀuÁ³è½„­) ×ç,SÅÅÞáÆ "£ç­´ë…kÆ(ŒKŸy/¥‹.·§Úca˱xp¨8¤õ” i‡¬ºxí¯OÀàdk »°äyj�vØ0¶T`*îdäLâ$Ê}®‚?ÞÜL¼ßAhÅ«ÆÇ;®Œ…¥íà¶2i�DÄ:ˆùw´¬=wº¹h¬U“Æoèäë¸hño‰Ic7›LLˆr4�RšëãÉ­³›éäf ¢—M7³\qjx€°EÈØ=¹„¡Ð†¨9¾„Ž#¯fE ÷=ÞQ'¼ºÁê7£€•‹¾1³ã§ëB†®j÷�cX^w–Ê� ¾ãŠïÏ4/„¼ý "ñ‘8|þ²g‚AC fŠ\Ðz™^nî[Ëwí¯ò{äZ‡S~â½oÆÐª˜¶|Ÿµˆ<¯NcV{e›‘øÊ¼�S2&4;,-ÞZgO�úÞÚ›Ÿ¡#Ó/dƒ%Žs|}Oim“EP;þ4n�×ãúØrÖ†Ö71©l0ï™ó´\h€[‰Ó}KnÙ»Ú#4ƒ§ƒß:Ç›�ϵj >a½NÔíÖç«z]×Ó�kÄm¼”“¯:ø”y0ñwjYP,ÑûF�î­ç]KôŽ-dê.ÑáCR²¶@+ØlP‰¤–AäcÚ€}ë™¶É{ë¤Þý õŒ² M<üïûž˜+úbï¢ U¬ß¼ }/-Ø�kÏQ¼–XA…¶ó¶M%Çl¹¨Ÿ¢ypô¾’㑾tØâh±)½,\s "ØåÞµXíÞÉuJâvÙ½ÜîÈ*Ü”§f¤4Ÿ>s €µV N­)¬6.Üm-Íû;‰¬Fp9 Þ¯i×îÊžDÉNúØÆ„9Ñ~•5™û ²M^¿º�iX�B.µk9µQ�žV·èÒ 8È·ßõÏ`8,k×�¡¸õ�d*Úˆ e�íoª­þø' [ëYØ·ï« ‘{X榰§¸ÕAÂr¯÷É„ú&áZ†/ˆ‚_!´eEú�=ÃV.Ôw웥òe=ÊmF+·ù.‘“I°m¯«»\9ÿ,n—aŸàJþì¡„ß%t0ŽŸ$ ×þ’ø^ò7M3î…âõä` 6â8¯‹�ŒéÿC;pñL1p•}²2¿°ÿ6P 5žBŠ[_ŸùS}c9�¤�ï«[ÆÏÒ­Ò¯Ÿ�n糬FK`8•È\ «Ãa³ÚDí ®ø¿Ó� ýHæÀ÷m‚àï†ÄÁa€·\4Ùh¿c羨8Ñ%Ÿ »ãT€óI\¶H�’ìbÈÃ$ñöÖ³ŸDÑ!>ÀSÕ"‘±ÝµfÌ€úA$ŽåŒ)nßM߸SçNcóß4ü ‹*U�È›—jœ³‡"oÔуÏ5r€�iímåY9r·�Š0ЮیÄÎfØ`>u³îÀnö.ð'ò`õb¡A™ � �éôsɧ˪­ï–Öô9I³ã5nKmïl°‰¿c,ZÜÇÅIûy×él¾~(ÔL`¦é¿“ì5»a�ûÈToƒw¯›ÊÜ,®#¶º[ÑÖ’vnv°•~“TNrƒI¿šuó:е½Æ^ [vÇŠç%Hñèn.½* oƒ�ͼùÅ]ëýÃ÷àü?Óö —Ñ´¶¸L7ŸŽéо.Uó·ï³¿³É„ 3M«}¶u�Å�I‰Xþ?ÅM¨+L‘œƒíMÊœ7”fÅ®ºC°‡õÓÑ5ð æ÷Yµy>I2}è¨MlnÌ»ûipÁi¶`Ó!�Õmø±”‚Ͷ]‘ o„ùcô´N¤EÏÜeóz{5 —Î^6‹.DÌÀÔ·��¢F«ÁÈÆÏ^ ÒߟK.å»w$ç½x%¢¸æv3Èz !XP�þãï|~x5<ŸØ Opï´EÀ=a_\Jò¦0ÏÜ“^ïÕÝ”¸C1жm‘¿0,^úÍU©ƒSWŸƒ_\­ŽEìÁ%4FüÍ¡ V»¼-§ó‹ˆÐ¯rfàùÎÂÞó|=AÙU# e˜wÉ\ê£ aSm¶’ìŽø¿,õ(]œ�>ıž2&ièk+ˆÔƒÆ†U9Y Ã*Ï)�ÆŸ½gåFÊ +j€÷ɘoÌ =Á÷:{=dÅ;p×ëþ¢¡ºÖˆgÔG™‡ +8öÂÙ0®5Ïë‡~¨ì`&q|âÜøîL&­Ûï7]†“ãZÓÌ«[ýNjԆ÷@&7ÍÉÿNL^.'ŒžmHkB¢ó$eâðŽ—•–8i#øRý#]‰ŠÊÇ˷ȸV�–†·+=/tb–Û¼›�Y1{ã�·æÉ×½Žùži­,A j¦rNš"Ï}B¨$6»]Zí¬îÔÛ(aìèÖáqpSCXûî®0z Û€œ»"[@v•÷’Ú6�©XØô:æ˜Æ7¦_(uUrÅÍq G,Cžr…<4륆ËÒ�•o:kBMÎK�Ñ¥r {0@‚ÌÆ(kò÷°¬ç\ý¸–lµ]÷zÇÏ“„~ýUxlܘí�ÃFÃÐ$Yï\;6ךêv¹¯•‚Ï‘­-‚ƒq™í5ÛiÆÔȉƒÃô—�K¤¡Èܵò[”#��»WAJÓÜš³¶h<Å7Ï®#ƒÁ-ÐR·yo½1° àínMÄ/5€k5²ü… äy|B\‡£i„XhÛsìfÀéÁp�9¯©@óŒ¢êËö¶!qª Ùþq6¹º¦+~>Ÿ.’Yd¤,»œìɰd³ vŸÃãò9ÎÆLm~û¼£s^ö«hn<²YÈͯ{†µ»Åí¾Âñ°mUiA¾•î®\]ê"}ÈeËÚê_–ƒz@κ-w�Í(/è®aú¦}ã£-±jô‰~·[öYð9­¦Üöâë˜Ìiˆ° sqÍÂ�o^F¦›cx ¬b®!IôQ÷;…ÆaÀËšvfà€l^ùñùñ÷2�áüyDtbîKEqFÅdÏk8‹{Öd´¢wgóLN›Iñ<¶´`:aAáyfÌ ÎoŸ@„MÛG/Ÿ¬�B¹cï³ç_I±†º±êªŒH†Zs­åÇJ¯YÏÍõô: À¦`à`­šü²®™Z2K`²•bßX”H ·�†ÛP|ÕÍt@H©|Ó ^H r�ðÆ¾‰¿.iÒÞ}|�ìÁºˆ‹2Aó�»ÔÇep¬-Îx¬ZN�2ë7”tbÎ_ÄÆÃWO_YO1¶z‚¼gòKúÉ£Æ>úÙ7wR­ê!”¡Î.çD—œú÷ÑzêÆŸRÈg¿uR0`hšÜµC_œ ±½¥uú>°•~}ÔùLþ¬>cH«A°,¥ÅÌWMŠö„ň8�VåHpnÝßzÏ4Ì1�¬8f¦ÌkçË0W¶1S¶y± ÷ÁËÒoý» cÂýntIzøòcU¬D@yþx™«n¡Õ@äˆø^ÑrOGÚ¶¾ÖW5zAƒ(ÙÂRLºÏ.ùJЃîíÍi®kì”07y* àø¥^ßBÐiàÇ;µèÅ" ÌýX\8}X\ E»ήä}g]`îLÔñfTÏo ³h¹û{4 sEÎÄ^Á)˜ÖÅ.—é¾ïÀûò:lç÷ÖµÛœP?Y2–¬0ªÌ²o†ž<xG¥îwëXhn7Ï‘U+Dl�s<·ÈJ�½âÌ+:ü*fè/²�Ú<±N�U¬žÆÚµß†Á,€ˆO;õóÕßÁY WŸJÞœd–�}ž¾w�|€#ÇÉJêÉc¯îÔ§�*PÐØ¬+ÿ½@ýE̓¢VÚÕ¸´‘ÇÛHw+{hÝ�ëGF‡qÜ‘ 5šgí܃�ž`[µÖ+?BùÏh´Þb²-Y=>JÇÌÞãÉåê‚ÎC`¢ ¥‘Z3˜›š³íqUµ?AŸÂ$ÜIO<`aPrœ‡·›�×Çh1ŒÊò\ÏÈ_³á`ê´wK–Æg(x˜Û`×á }U¡u°×s*U¤ÄdöI²7lÌöˆ¾„xöõÈÞv6ËšüN¢€ÿ¼„FälZ£¢ôÄ$ÍŽ]žÄìZeòþNjUÁKhZûÀšÑLû`ÒšÝH°/A]ð{$wÕ_‚{õ71n>0mE¯ˆJ:³œ�ØxÈ iîBZò:­Ö¯÷0Ëž…sOÙÏxœ‹á‘(xN’f0J!— iÑo\»ŸTñ°ï7Ã5Kp÷£zG2,)—•YA“v•È­’.¤ÜÏ–ËíTÙîÖ»lo½à²a6Ž=‹põb{ÏÛ¶püè£ãZ¤P¬c²˜Qt«g/xŸ‘Öô=+$kåÐ7 ó7ð`Ã1š<$=~¥³­Ñæà«eWü8ñBÜU ´1 žß{*Á6øbð^p‘jö'’Ql¿žüö¹~8eD' WfÞJÁ`Éb�ŒYÖ{vdžfž:–£×¸Ì3Öµƾń“Sö“ã"}žÙ¨M{ËÄm¥jñ«šXd�È™¸FF—N×d>N�zô›V…gkZ!û}Žl£¡%Þér(›0×ÓÄ”©ÚÛAÖœXäIfÀYìÖòª8Ÿi'iWpàz!Ê…C­ Õѡ΅À@XXou^2�sÖT2]>`° ó?jà™ =b5Ç ŽÓÓ½mÁZSšß…wm½›ã{¹ƒF9Ù>>æynò4aMÏ&·ÅÌU…îÂ=�òýoÜïøëä¾Eù|¦8FU5\DÑ ýÓV“k{ cû�î„%˜BòeŸ=e£ºÖæâ/|_`vÊ'tˆúyÆÎSÌ"ùTíb=f·ÍÝ÷m/#æ+l>äbùÊÜV? ÈÇÝîÍõœâˆ|R÷™eK¶P7çC#ÛìÚmâ}å`—âÙZÓK@ÕƒÝ÷,)þü28dtô¨5³h±^@šK@™î˜Žt…›ï Ùº>9c Ø9¸_K‚5]ò^âò6h0‹Qãi.¸ìÐ�k…ïj°­73�M¹@±Â/õ¼ý=^NÚ¿\ˆkV+X'u\4׆õ+á3 2ÓbBËŽÌâûå7“£´RÄ�?goÂåÃ^C t»‰ýÜ ‰øª­�t}6ì+g])Þs½á¡î¶üTÃÆËc _^ªy¬÷ͨ>ïPO“êy¹O2 G~4ȧ�ô¯xÿœ‰Áð>·q äÔ�“$q‚²Uá­´@xø�¯´sΘ1»®µÍìu¨œ?M�Ä._¡Â,Ö¾4“ò�n4 ’ÈÜ ¢ëÁ‚ïT#úeh16|ÍéS硇jlT[@¼Ÿ·á�ÑQšï·ëgÖés�!kâÆÛ J /xí–d&—ؗ킦òík¶Z(@®Sm¶pf Ûívî¤Î·2öFræ8 @M¶ü–F[ò+€–¶Jì3¯G0w S a6ÔÞ‡¦ˆýìrö×dô¡›†çA!¦ù9E‘Ö˜ø/�gÅíÝ-ã%™ùt);tÇ„!áµEˆíQ?:ã3¸îù*ð!ŸÍ4éeŒ�îc¶!æ³¼˜s Ó<0ZÄ`õÉVÆoù^j0ÂÐ#Y˜RC~í²MäϬޣù:vû�‡òÞµ›`û8Ðï¶«—zM‡î1¦£µ£ìù¶}Óò$#SƒT²hdm-°qÖ3x0,$ ;9ŽzvÜ•Øh ZÁªïY'~á%�Ì|»³�®Wñª|úH ¸ýäÕèªÀKô¡y‡òcäX»´j|Vž�ø½ a�Pìº&2˜<­Ž:¼ ¼çDšÄ¸{e:h“µî¯‰˜žUIº). ûÆÔ{Ò‰Ý êNþ{Ú/'›E°ÂÜÆÖàç°q¯Yøv”2Eº-Äâ½,¸Ös‰Î0“¢g`–~Ž*¢HÚ]l÷€³xûDÃ8ž'í†C:Z×Þy“Ô2Ô6K°¸ƒ»8ëïx9©Îý˜1ò|.}>ëÏŸÎ]Ù˜7¦¶IšlJÆzð›-ÞË~4Âv¥ñ@w ÉèV—Òt8õÓ—›h�§s®éPätE‡C˜ÑÉíG’x<ÛÚ¬rÕXLö“�NöÍÍæÀQÚôµ?·&6û\ð#·:÷±µ�âÊ�Û»| )¿ºËÛ|�§�xÏHJ:lû*j:€Ôñ“NbÕØq \3Ù½©ü82¿2¾ ?agеÙÎÛ Ží9›m¤Üêw‚ás‚�Í:2üÈòøCv Õ.ó½Ú,”ìáÎçmp¬‡# %²„õÀg¾¼ËoãB!.•ÅRS\?/µ�Áoâ@FŸ®uá‡4Ö_&�«²kn±»H¤]°nÞgá å}5P)¦úç/ÈÎxK¿×ž<4FŽ(¦Ç¡ˆTµpÜÝ&Ç�?ՀÓ^P³‹¡!ƒ¦àšLvôhÅT¹-ɹK¨\Uô¹¼¯çQäÅ6ÓBº&¹ gÒ¶ÅÔ‡jíÃŒ‹Á 6Ã!͈ã°gg0 œß@oÜŠìÜo<°”ä§ÍŽfžáÃÔN+:¡Úü|57zäÚi#D{DÀ�ÌÔºÛö >£ÇR2PÐË#4O³ÖÝ.9\1ûXÒ7%ÁŒ�ÆÁÒ2û¼6ž?CHöåb¶×ûc«+¶þAêòÛºrÎîüúýÈG�%‘Ô9»]еã穹ëð=hór»*ázáuJŸ¨[ ']'h{عn�-VìâØŸz8…�,AlFX¦#Tª¦³dH$ÔH#Ñ>|^*Î9± J�C^Ëû[¬,•ñ`ºšà�e )ôB#·°Í®ÅŒñ,`DMžN-}–9¢Æõ$�0ûÅ�êò³÷�Ô,À·~<„ËfWmg¹“ˆð¼ï,“%êdÏî´éç©ÖˆG½ì»ü7ϵIÖ\`•ÝGˆYAÌb™Û‡ÍŸSÜL±ÊžâLÅõ<ÝÉ¶ïš œà’jêϳ±Œ*¾Óƒk𹵡{Z¢…‘Æ>èK¡}p#Rï¹ö‡º“Ü殺î3̰«0!| Žgë7Eî” †lGfMö¡7}e�w¸{öyá†Ý’G!ä*áõU{ªƒ�çîÇÚmÐG­ßxõ÷~\𠵌²õHàTÌSksDÍêñ]ìXß [“ïl*ì5æ ¾qºÆŽÅßY±¶  äsPÃŽúÚæ—íá'Ã~¡œJ�§Œ•WpÈÔ{ö®�^À2g‚|ßå±Â o¤¦Û¸õCœY¸ö¢ƒšÁ˜YíqæZÓ?j“W’4¦š¼‘꼪ú |Ū -dšöêp©¹=-†*«¡®î“¶ñÖçL$'öcŸ}õ¸^ƒ91~_|Ñû& r“Ó¯�§ªy7-¤^w’ ”=Ó×ñý †IÈbˆBڧ̈h…¿fÖ¶¹]BaClSÚ—±Ú�Kj�]KïlràJ“?¢oÉÃö¢Õ‹6\VxÒôŒ©£Â¹øÚWt_,éOeóOgjïïíÓý{L&økÍ�›‚LåãÔ-r­¶±ê¹z‚eƒî¡ÇÆì pÜþ„ºª (pלß“´ÖMPònïŽþº±¬°…ü¾{çÙÄ›®X#�ÈYM¼[cuÒ)Ž:ù8¡åìk¦’jÝÀ¾Ä~¦ .’Lö¼J ÷*/Édæ¯õcxû)«>(¯�)çqY«;ÁpëÈÙÓzÔ(nåÀ¶ºÇÃz�lâ\@]!òj `Qµg3Ïⵘ£­„Æe�Þ× ¾§�fUÙ^AܵŻýÏ8l‚­®ðwÔ0ä ´¸km/N!²¢/œL¼HcñÞˆ}·qèbÿ{ ž|~AO<œ‹µÆx– (æå~ͤqð.0‰_:æ–„cyû;ÄïáÊ…Ÿ�=ñk‹‰4ù«UØ@húN® ÒlNÏ¡ÖD+*Î�.Åç|ÔëA½�×”íqûïû÷àüŽŸ:<ÜB¿–Øû‡ZFš, Œ¹-Ëwn'¿——;@]˜ÙɌ٠kŽØ›¼MÆ1î<>ˆv:œ¬Ùïø]µß: G§wK4êAøúžf>1½Œ£lWÊ)¡•‘ÈÖY/eÆÔÖ^Óù¡;Ùã­ß(Ù±R£cÃLêïµX}Ý60}“k„Ö�UC<,€· Ìñ7œá¬Â8ËëÔé³fa¡dØ ¯³³,=òyä!ÊZoÞÓJ—cFŸÂKx=k +À$0�09ßU f&¨ºbþéAƒw¸ø²4‚eq{ ×�¥öÒ"açï±�ç>ú˜üjµÇ†€(‡/͇ÚÑrr·¸<�ä»Bm"�Mœ  �B²rôèÃ¥XߨÀïA¥¶'‚TÚ�rÿrôfj¼Ü¯9ËÒ³?À“gN$ ÃØã/f㱆ˆÌ39ÞE-Ýë)¸ë¨_`ÅÀî9¹V2ß+Ό߂_žhí1D¦ /¥‡J‹&VyÉ`% ±Ù—ÃDFø zkG!1$Dîò¨ZÐõŠ�!œÚÒÖMõJ\ÄF®²=ÝZF½ñæi]�ã=�}©ówÊé'}kÎØ¿Ö`JüZ¯ ¯I{r¢q\Rï×çq÷fp‚<ÛJÈg=¿B±çA>+Êv÷aŬ€ÄÙ ªF2œ)d}fÐÆÐ¥Ñ1j=Ø>¨I©Æuu‡¹KÒ8Ꮎ~R5¶~rzv ü³ê'ÕI�—òÍV¦±c£3E,ˆ±0k!ì¡ñ²$.²éÊ)…Ì`÷t´n…-¼Ô¤\Ÿ¬m$ëÖ”êNîÒçT±{\£E¥.¦N7wô�LµBü„æ¸3ƒw—Cª/ÜÁ'ì~ÐñÑnŸ \ÞÊ&Àî7kŽ3˜$/ÜÛ+B]N*—®­yÅ‚:Dänç¾§~TŽˆÖ¤ qÂ_Æ0žÅƶ�«ãÜÞbOÒ”´jDÅà“ø²�°/ëÃCUÓéÅ®òëy”tz-5ÿ“|p„Ïœæ¯óíð£°.¬X�Ìá¿\l@ÝÎõ Vó²“û>¬uðÏ)—p…U„,háW \7ã‹èÐA 4fé*WY;©ãØT{ÛâY¼0bòQ2ŽIQ7f†ZrãíÆN2¶Ytí?»Á]`Á‡1@)ñäÇg_p’S§(&³ÂH#Û’÷rçTÄ[°uÃ,Õq–ï_±U€Åw{o®®Š$ùM½ƒúÞ„^±~óôû,FOöP[ÁžXàHGvú»³´Äj ©ÐUvİÑî´ ü‡°Ké{­ÉÜAî`–»Â)‹ «I°Q�‡yÚ{›×7O?”ËOÌ앟hüiC†¡ /ý·#UŠíø#ÚÛ\Î{ Ý5c¨­ÑòNE;{µi ç`<úóëZ7[sgj‰‘‘ˆrJÞ›ñ0¿ãàLU‡évºïmž*SÜ µ�úµëŠ0@–„îA—~"úá  Q|öÕyhá®>E å5>ÉŠµ£v0ÕºsngDiV\ý‹UÆé”nÙÍEëšö?s^{ûß´«6÷�„]œGÇÓs O�žx5ÑÓÕ?a>Ú±òþÐ}{׃ÈÙ5æ.(^Ãá�¶ŸÍ¼ðÀ w2ì¨ ��Òlî—ܘ±WœËÞ¹o ©Ä;à´!TQÿ?3Îר _8 ¨OÖ6×pÐLƒ¸S–Ód–q�,˪&ïŽM�UVà·ÍÑ–6+ JB�àìãò­]ð¸Æâô»©‹S.»¶ G”=ÂÏ£[�OÙ;>´p8ê\!®ö¨œŽ±i6]Uj> *å“Ûlo¾×Øõû_eMÌÈÞ¼ùQpÿ…àäÏ,ià²üǰ–Q–"¤ÓyþÜë`‹6ÚW"Él*Ù–†Ñ�CA굿Y)W{ý2�éà‹g]óü,ƒï‹õæwÍ1WÓ],TKSÕ–×’M¡>l–H¿i<%4Â&ð™Â<€Œ0Ø‚Ò.0Wǰ̓¼XëY9%ÅŒüeûÞ;bûÆ�”9ÉË5¹¦,¼¬/ÎìâÕk"]Ü᥼È‘³qAÙ«ÅáÞÊÁj,ŽÜx³šÖpÂÙ”š=ò ‹ ümÐL�è<)äa¼¥ÛÙ`ïÛ»ùn�ìxÊ0Õ‡Y#‚��\4[ñS’hZ8­ýôh ;«f7ºÈéBÒÇE¬¥‹û.JÝ\~Tœk ÊCî4Ñä‡h+3út#r=wQ½9Î-ƒµZƒßÞZlÁ:�˜HWxf±À9¾+o rà¿p¶°”žþKÝ®´dsö1T]öpMÃwƒ°Ç€&Y,oZáRn–ĺKí¡¨(£G[²©ä¹bgl7ô��²%&F“‰ã}÷Yòêíƒöm ÊÁ÷Ù�àa¾;Õ™7˨Ñ=ÚkTí�¶×^¥2éöy’ûļ¨!lšàí2Ú?«XžðaÕîŸU•µQ` é—1ËXe²? ˜E­øo9Ö)¸dÏ)ñ›µ=ʉåoœ 8’Ó›%³`[�××ú_l�ZÉdüà‰pûž}ú/Ÿ¸v‰Æfün#£úIÃbð}?#=fÏ “ ;1"øØ&×@^êQ_¸j¶° ø�O…¥öZ©‚_;[©äœù‘5®UÂt`jse�†Z‚g/¬Fµá‹%Zuœî¡‰[9)µQÔq¼:4ÅÀã ’i~Âä󼽄a&ƒÚÍ¢ãua�ìhv�qLß=¸ç4nð)R]h6Dî,_Û”µw'mäb¥\ )å?U„C2Bi6™KHu0—`Q.µÚ¾R­Ñ¼ë¶mo6&ðòñ¸ÂT¾L8sÐǵîåí©šU ›8p[Ѐ�HmJüÍ(‡—9‹Yñ‹$+�åÊ"*=ÔÊ­ˆ}¥Œb˜X-jè§ÓÕ6ê!ˆ|RaÏ?>C\ ø$lÿ�òóºûxÉ’c`ætµ@YNø›c æÌZð€MÕ}(x*bŒ¦ŠJ¾+ jév¨â¸ †ù&È åêãv?‚\ôwü_“‚%æ£Ò,fãâtoä°‚ñöðªl'ì„Ö@zþÂ`i+…Üɇ±ôd¬ƒ¦é~G¥“ý*_S©¯™X(¯%<0ßu沸ń nžß?¡‚ý6Íñ±æN=¸øjÁDŠ’o‚ öÂ9¥hìÚ6×êÐèR‹ ‚þH‰Äe¶×–0ºK¼5ÐÍ-F¡TnËȺ4Ü /� Þa åÞÊ[x Ý"Û:kA�c �³nŽïVKêcÑz/s¼Óîç2¢ÈINÓâ«ôÒÄ¢]úYX(bw“Ìx pûlù$ì{eÐëИp*¶³æÆ‘®cs�4TÛ­ÆÈì•˵š$ÚUTå5xÖ÷äù³‰¿Y“›àÔéršâhÊ ŒÔà ”„Õ«šÖ°ít+ ÍаðÃ\±ïe#kèÄídÉ= S24°�æÈßåýqòpꮎ}é:ü’B€71�î[«; è¥A”`!=õ³ó�4¡Æ,•œ!à%^«.C{Iëð’ta&¹S&ÒúÛ§)¶ÆÓb`=± ‰e::j»‚7ÕÉ–^ï9ˆXÎqdš'ž¹QV…Ó{>NýðÇMýšQYyŒä ¨a±œëí£âS:ÇJL§²@H%¡U¹O³à†ü"Í÷„L!~mp´>hP‹íiÕ Ñ,!*äïyÝ'ȃ�5î÷jTïŒÐÂ�# "|ü Ï�-Eýƒ5ø9-€ïÛnUûkÖËž-ó°ð2BÒbC·a Õý¢Ç™‰A]vó° © dË�¡'ÏòCûw•èßÇÎéõ/?r ári‹„ÁΊ< Ï—¬ç_;a×rC \zŒGź&±Ø¾ÚBÖ-Ù u£¼g‹9­MǸ å7.~ʹf óèu¡÷G`Œ»S…ÍS½n @4¢œôF¥X¼àS¤rÊæŠ ÄýŸÉÌ`hnÿs!´ö+)Â&àkïmÌ\7AnîøàPÕuH�¦ëÊ#ó÷*üHbé„®Ù�’®!Ý®û›�ñ¬ì•tÁØç1(Ä2)±°á÷0Ö5ÖO]ÉW›�±…Iv9–HYåןX¸WÒe9Ö‹î’mxÖ…´,,oäšv¼Îñ÷µ ¸ÖÖÓ/÷õùý‘Ì0ü|ÆŽ/´ËÖà­�µÙ# �kFJÆ:a„&HÕ�ø¿ÈÚeÒÕ=š ï`n7 þnPÏ`"Ev5vÏ¥˜ {ËLš¾cW›7ÇÁE×l •ăÒÀí³Õ†Ùü6»ãîÀ±•îÛîoáæ['ƒB¡°ê¿}Lqôƒ�4f\Ú ÒæÃ±ê«[\›z¼»PcW8ž�p�lõ7�™Ô“*8»ÀEýˆe¨m´qœt8›p¡Ž?4'µÀŸÃå‹:Àɸ›ÎA¥’{B±!ˆ[îRóBvNóŽái�SDÕhÑÙÍC»?_/ÚàxK|[J»ÇJö!mi·~JoÓÅ.|æêбtç'c™Ñ;cxd€ž›]\|•—k)ñ¦¬+”ÎXñMÁf6 Œ\8ºl�-ýoÉPÝbmºÏU�2§¤¾ƒ’ì8�,ö16E"ó/�…�ÄÞ@p-†ZÑ*âë“Þ¤x’ȾÊnÉ ÍUˆù6…ÖŒm Šýr\—Þªú3­[ßb  &… •çx>‡À¾9e^E¿)BGiXºY6Lj®i”|ÝCb ‚&OŽØƒ%.`n)¶ÞÓŸÃÆÀzÅÍAìóE¨Ò7véPm�AýÜ3ã0)8YÇççyjðc,«œJ”Oze¬§´=ˇÖÞnrÞ|\ß2kÐóttFhˆ.’ú°-½M+cíã–—ņëõPoh„U€êLʤ•øzÆ4§¼šo¦ö9 ¼$q–‡°‘mÞ¿$¶'27‹7†nèfsÉT]–*Ì Sà#Œ+È ƒ»Î˜Q EaæþiRÖº+L ‰fñÁ_Ñ3oã{Õ~Ä”&H6¤õä1l_¡l;ur ;D.S%fÛÌžõŽáÞ)Åúý.ÂpÌ×�­oz|‹t»ÔîÓÉë]ö TZê¦ÓÍ,ì¥`f@«*§kÉó7K]ÊÈ.×v£õä>-Í-«Ç»ºFÇ“�4y–жá‚]5l”&A3ª^»:N{[~ç}ëBã™î9¡¿q w@RYº\å^$¬K̸Ϣúé÷šÝ²±æ^Gå`ßk7…{Ê:7Rí¡->óPî-Ò-e02ÙàMÞà%º½bÚsWWõïgñƒ-º48¤·ZV”[M…½¶t£Y7ß4$‘ZË]¦.*\å0\U ç"«1d±l«\±¯ žë"j—¦k”±Ä»ÀJìøßjz­ {äð3²à ,§sœnxoiîÎÒÄèæ�ÀZ[#>‚`SìoyPŒqZnìŸ{~Ã>¹áä‚G ‹|-mè5zÞmÕxã:L{ýœ;a ½ A1X™‚È6µ{ªmXd_g3¬Úܨݶ«ÂóÙ(Ã.<»žÖŽñd‰OŽÐ›zï!ÞÌjo ú.uf´ŽÒö±n Ü™ÀŽsxxZø,Â/X‘†ÝvöÆé7ûWÒ`*ùežãŠ�>vL$PËq¿‡i…Å úº;_„!É~¨OÍÔ:å½�—²úO‰Ô Se`çï@Ùë¶î¤1•;X‡G‘½Æ@‹ÓÆ)ý··Eo£j¡š��Vï-�é\\P4=|â;¾À{˜ÇLû‹Ài×ôl]Ãâ�}%JoMe»Q·^áÆÖK¸VÞAoJÝ’Àõ=&Ì}΄÷¦z,ý NÜ_c¦ð"ÖYËÖ…À[*ïózl�}À›Ô Ø«j¯f»KŽ|ÉE`ùOºÌmï.-¼©ê­Vß3¿xöw'>žRío˜á€gW©‚a@Éû �#ZO’Äᱤ°«Ü€¬MÙºNOëiŸ[�̱"‡kÎ IÌþ¨œžµŸÍ¢{[°L=ÄÆÒ±p5~ßWR™ˆ@ÈòÆîÐjæù~�Žìá?³¬˜mùÉùÑ•SwÀ§­q^5ÃW�‰zŸÜoXæy¿V¡&_!º{`s†¼¼^g¼N�m#–ð‰g#e‚.ÔHÇ»íc(Á«A…60pYï³lŽóS"·6qíÊ øðúÃaî©akªyíÍýÆb‹ä$wg„,„]\È>f­1ßæ,FT{Ò‘qy9Óey–öÄf7¿üñqñtqß�­ëFz;/àÕ_çÄq"®ÉÖÍ”G5ô;i•¡]�÷o}äëgÊÎ0•w1Ý‹ôåfzDžvòñîwÍ{žxÃ\Øs7ª­ßŠ@øòªâàz‡gd¶äcjE‚Jæò}£½d­ëò_¨Y”Êw<½ÕyW‡ZèÅÄClc‘|›hAMö¿×ÛÆIä.µô†Œ +"QrÞÃS’ Áœéõë…“‹»�Ýø[m[YrÃ’øat«R¾Éú„.þå%§˜�gî%×èâ�Íí.ݸRüv"¡B�”«ï˜ŸIx7r óWë „FyK‡‡ŠPzØ1ýùð¾Í&ÏÀ¿y†°¨{³wú¹±ó9iþ£ùo8Nk1;÷©X¹n‚ÀL ïªï,ɽv°]‚Í-v»–Òäò`8waÁ’=°ÂŽªNBì�Û=6,z£ãBUl¿9_ƒÈ`Ð q‹ù{¾Øû}n6^~Ô\‡…¹xHÖ­µGÒÈ-®n/§ï|(ŽÕy»0_]% ¨Îào¼xÈçSZd'� úèÒ<m—im‰Oq:¼' èü8tk(¼îo®?0m\¯�^Lº’4J}}‚³wåb{ÆåïÍ0œn¦$”pî»— Šß–Û]œÌ ¹µÕå.uNvÓØîì\¢k5•�oq?öW¤©Ì@+–ÙYû8…‹jú|;BÝò´¹¦³1OóohçŒ: :·ÕZÙÚhŽß>Ðw×ÁîÅ=·59â¸q*èJd¬ñ-}+Ùþ_~ƤŸûX‹˜¡i0=HúwüãÛÇõ_,ÚU.F�I=dŠù朳ý×øª­¾ðtuòZ:qŒÕÃMür0‘„/íZŒ4½Ó 9Ry)kOWS å {l²¨ºDûZt=àMlPmºqû÷rã=ç?WÑ½Ü �9íÞö·MP37ÓPPRŸ¨()JgÓÆôÿWtÉ ¹è�J×ÿÐüˆ€?dQgò¢ñ!øÚ�þç 8 fùR‡U²°/õÛ«äu†¬DìvÛhôõ‘ÆBxï»ÍEü—È® �íB2ICùG.oû©»3¦¯‹™±´à‚§§µMr+ÕÅ£5ÔÿdïöòƒÉëz©j‚ˆ'pÈ9ÔV¢à{òÄÞ²ÌåÇ~YqŠŽp³X- A³ú”†6ÐzC¦+tkÊÉåð©rÔ´eÅ¥3nÕ½[£M¹0w.BM-ÎüÂþ�"ÇÃ�è#5üt,… `ÞY‹1@æ“}çë¼Û3k`·±8Ni_�Ãó™7T-_º·J-AŸèÀ�åÜ5—Øæ·P‡>ç6%×âQHà†ŒY"ÁvoD™_ØYíx#hþë8ŒR€1ÿb�âËUÔ/}©E@€aÚ–ÚAt~RrƒNë…©s­ÓLÉP»¿¯^,¬©X0‹ÁS[ǯŸ>ƹ¨kD²d®ÙQ5Й”n Žç îW‡X¸6t™]»«³ P¢œYàSÝê͹&ìúÇqá˜Å™C-zóa¯LF¥ÒfÉEmÇùkËPNTY½‰°âaö³OæmÿK˰ÆóÿÊ'wœÛôн DÝëo¢iÜé¤AÊÂM©WszáW$ÁUc´­q³ÀœÑë×Q|—âã…îÓˆÙ¹±Aò 1&×|}Þð¤™dÑ!”åYY”!F 5МK)ã/gÞyBÌ�{¥övY ,HfH¸\Á˨ŹÛ/*½Wà©ütj®lN–ØÉ•�•\´Ï"ÅÃP°¹i9Ä—Î’+˜Öïš÷pb‰Œ uÖÁˆ’pºÚÎ.pŸ¾± ô>}�"�¸Y®þkÕWÉþ ú ŠÙåœ[ñ×ã9Û��ްÅA7ÿm)@?⊠Pw»doþuvÆkaþsº§ÿ…Ñ;sÑ‹Á"1º�òr~â±zË‚M¿Ì²‚yþåVØ¿È]ùÙYgDòÀ¼žY¬ óTƒ c>*^ãü€ö-—qL‚kÁPü ø£~›MeQ~ïé±™7öl¶ù"œ³¨PÕ%©åâY¶üËÖ}»þà¿ê9¼lV¦Y;Cg^î ð˜¦ëu‘²‡6,|²på*ª†ˆÖϨî0­‚Y›%"eEŠUõøÙ³%à&¡. ’ÖˆÂâ²óM!¦§'^§�RÜÓ›€Á¦Šèž�À¯öØ×]¹{›÷ÚÛ\6·½hœ]²¦¾¹„ûT@\E6 ¡k&¸•Ä4�ƒÚ-D‘~)rBãÿ5'Y<,QÓÊ_ãÐÿsmŒ¢z3€�žÁzX—gb ^rÆÅÿ¡u¨- óÞ2æF\Ý-Ê7iðql2p̓F½¬u�•2§]‰ä…ü\Y¬V®¿âµ2†ñ1†r+§DKªöíÕ_ØÆW gtæ Gm/– †/ÚÛž^-Ÿ<)à‚ ”OˆU_*7y¡èX#—½?ä^ì¯uõ-XÜFñ ª‰#ó2Ïú×yj¹§=YmLp0G zfOã Óò…qË¥º_Ôï¥5ÇgõN¡½/èñ|Ö”Ýf P‹ëÒK,}]‡ /�ìòÛ�_O�—Š;†¬Ÿ�÷kkãHÛŠá¢(ï…-гÇãþ÷Úaa„¾ÿ¶ùû\ªˆìIÔ?yþ§EÝ}+d^è— lëÌ.QÃg±<…ö=ˆOáùæD‹\þéS¹9ÿ5RfÂèË釛HŸÉQxR×öTñð´m¯˜¾ŸÚ@Wøl�àN/»�ÎÏ÷ꯌ…MD@?™2 ·¹6 ×T£þÖï±ýËÂîéÏ»¤¿U]ÿï< ú÷] I5³‹ñ•¾Û4Z±V JÙå6¡FY²ÝWür�DküTR¶óYJç¸oÒ$.#õ"áŠò;^Ûøº„ w­ÕÄŽìr"¾GRÃ4愨dÛzÁ�<¦E.¨ÃœÀ1C¼£Œ•ä?Ù¼S½<‹ì¦è+RCQqÙs‚:Ž:µùˆD¶ÀêM^Á楛oú\. M¬°à1 £^6ŸCþ¯êÍä!ÕÈJƒ“J/:â‚ùL*?†æ}¥ô›Ý’!‰¿„åz0ñÄÔS:”Ø&BUÚ¸oÇRÍùGóJÛJf•:η0¬ŸhËüñðÀH²\ ßÁiûì ¶¿aqªwPHX:èç[ ™üÈÍúèŠ�+DfµH„AoºW{ýŽÚŸB Ĭþª…ÁÌ%³i±™6ƒfôî¶»ðA¼ùÍgðã;Œߌ—�¥îºq˜«K…Jw—)wQÕ®­PèAÛß²‹7ÝÙ¬� (uH(ÕM =¢…1þ’Ñ0ÒÚþÛwÍóÑ\Õ>mšàC›@z¯…Žibè'3ªÅçêäXÕ8nwGз>ÒFKËO�{AvA] Û€Yax£GårU‰ 5PYš§ß2¼1•i¸žkÁŽrx›C¨Î?¾¶ª¬[½ïuîO�/LÔW�GëN]Gêõ$¾¹ î�‹…ˆQÉT÷Å©RNÉ�ÀÞ¡Ž7ïñ Ã¢®•íÂëŒÍ*иÅ?šÎ;!{ }”ØJ[côâ ·`¼ ÿ§»¶þì 1Q‰®ZÛ96«ƒ6½hFö¾-®Å¿[}½�éÕGĹɫy:�(8Øy”º8Á¼™±phj‹4ªh¶”^BzºšÅp÷þ»µ‡×Â%¼o\Úƒnå¸ö?RŒmO~k0+Œ¦w±Cõĵ’®”{Ò=¾Ï{Aµ°X‡”2ý¯úù¡G 0�²{ÚAQ'Ü<¥@¾•kW2þU˜ÒHŠôcÂo›Ÿ÷Ð>0AÁ½î?ÎbìÌ÷ÝqšÏwu‘µæÿÙG[÷(qŸ&‘V°©dKe‹k׉Ж¡?§fSÐÀnÚ“-çh¶Þ®÷⥘êâ̆8D ‹dßoÃXê1á#·ŸlÿKoh »Í*³r—Qï¼kæ×÷â‹jÓî2?õ¼nÀ¥›Û™ÎwÒ¨¦^U7c¿dÜá�—OÑzhh4ê²!œÌ]Í®DD.Ëî³x².½ävïͰzÚ‚,”H†Æ±Ad9]¥ï‡C¹Q'G�ž‚Y=x~»8�9X§gæ]]_ )ãØŒÕŽñ¢Ýo+Ü®‚*!•ïÐ;6î—ûÓðÁf;vž‹odj»J¦š€W6Ä�dibÓ¢Gf'â")Ó‰Óß*1Ãkh˜°äýiµØxûA‰«á,·tì\åo«×Ä®ŠõÌ:—æÊ-âyp@W×q¦ ª~a„Ï ׸g1 qmÎ:XaöûY%bÑS\ß5ùšávNûƱÏp)@t  ˆÕíµgc™ÿo]‹5üZ T�æCÃbï™V›\7 |O—<òðžp)õìEL],z1 н§:�Ϥµ:ÝïŽd82Ç0!“Œ—«ól€zòå¼6l˜e¿›´À-‹žm=„+WÊ«5t9·V•œsÛØœà3¥ÙÛe6QF-*…Ï”ŒCki_·Ê>lèÀãg2x!àÎ9† �¦d†ñmå_S#: «Ò¾RÉŒðs«òœTæÁ¦®Î 2:0K¬ñ®l³mÒÚßœv6l¯Ev“àþ:d±'DÝ{3%¾ûŸCç[-Ü‹|Ï�\%ëÎ5/NûÄç ¡~ÕóÀfèϧrïé,ï¼Yçå\:B¢òë,@€ö'ÏèHÝä/‰QìÈU2U>çö§\hŸ{‘Âõ‚-ªÀŒ Òc'g1¸"Pu¢wgg‚“Z½húØ3ódÿ>PþŠãâÉ¡[Ù òˆ��vù;{È‹àvì{gŠElÅUý�÷*%uºáî=] A-�páú›¤­eIŽH${õ�‹MâeÆçì�U“V€[‹gsï)°dïò?“€š:@¶Ÿêxõá£Ñ¹åçzŽ6;Ò¾]òá�ØÃ€˜¬êÝÎè*a„’g+èÁó�»ûôT†bEB½¿×YFƈÎá�DgÛ®�¥ó›Xí]·öoÞìǘ é[`˜ ¤‚8¬¸¨¶]]Ìz!óhES�¶¸öç–d®[¿…FÑkŸCÆÎ,Æ'—�(Ü),Td¸%ZΣH¦Ð‰n§3ÇÀ‚Á®)‡Ò¸Ëóš±°LOœºMžnWEÞµ�‰­jÉy|-C’|ÀfÜãéWñ uÂlúq¡wÊœ†Gãp•ÅkM‡ÍínßÃÍ8:9ââ=õ($Çõò—a¤»w=³à14h7êiƒ˜ÔN =~öÚ¯0ì´ï“éÉÛ».×i0’'ÅúciFùc+öݺÂ+‚ƒ®iŸ^y LÒ¼ÎkÖòÓÙK©ŒÑ™m9Nâ"û�ñ~dvÅ‚ÿì`ûÀš±Ù¾™æÂ,€‹Ô r­ú³«Ú´žž±J¥®†D¶ÁžãŸF’ý¨ÝówEä�ä’B¯ ¤žWÜÀ…2GÌfE`ëÊ<„.,kÏŠ#¸:r9² uPe³cB7ÈÁìDPº_³˜%ÍÃ+5WüËЖ”jâ �Ìi媺¨o›o5,üì°åƒ¤kÎÇr\Þêe(´u¶Å÷7á»Á6ŽB_´—ºjÄ�pÉ[í°5éªQÂr�T‹Û[~×éëzÇj‘0�÷¢æÎX(L̸»jQ1Ž:ÆÓ.t×îaýó¡j„s�@^`!ÒŠ||t¬ßÞm7vh½ž/OsŸ½úÞÛä,üDO·�ƒ�kÃê4@·(Z_—HD;bM^Ê€W±Ãº¬eÐ=+œ™‚æ6º–û0¡aò©!éH@Á ovØÓ§¼üˆ9+ ÙÎþs àÊܹ…�·O×k…Í”w÷å©y£k]ì³ÎÒÿ�#��ñé´Wßxn1=ô\Æ.òz¸ñÕ�<®p� È ·½Ijb¯"˜k±€áÔÁùDμ÷ÅÊ–É.jö ” s1bù1誣}á³t²b~0;B¢YôÎ<�Å2ÔBüU k¬Ü™ÜRb¨ÓB ˆœ‰¾Ì…±y»aòë†kŒ¬])¢a™¿X”˜Ëö‚ʳ—ßB™3!P©~ÝÒ.ÐeK,éÖ œðÆë‹TùãZJt)"®n¿;Kì£Ovp†ªÚ½yÔ`\1Öl©ÈFŽ­(E»q.ü¸=nlzÞ#W¬Ò[&Y�×3Ùʰ!ÐK/+1•…zz;¿ì²ÍÖv¥„¢Ù™òÜÞX‹S~»tdý’�4é‡Éå3›…¸“µ¢ˆ´*wÑÍd)ƒféóñ@Ó0h½¯�wÃÌ}{×¼‚›éÚÎaò©YrËŒ oq¶t7³Ë‡b¢ÝùF`Ê0_£ÄÉ/Ò²b³ë?Kàñ¿• Ú�çípßF£·„ë´é^žè�ŽÎIü¸‚ÙodQMˆ3lÔÝÑ9�’, ƒhèÚ×Þ\1$DÝbü€«},²��ÓŒŸ;ñw»pþÜc 8€"[ ÄÂzØÕ{V(Û?`¯i3ùŒãÞ¿h9-¡IØ…ìu{Áò'ë§¼÷“ÇO^__@úlΡJYÀÐ '—é­jìI≠±.­L×ÕHÀ‰ž©;•º’ÍœÙ÷�Ã4+)¿y9HÜÒËÛ×Ñ?hm¤ä.aVoãl‡r‹p3)®N·ü“1å…b÷d±Yù>q zkÖm°7Òà…tÊ@ßOÈ Ü>)<‘†9õV‚ ëÓÛsÇÊΩ0ÛŽ�V²ifðmÙ¤ÎP^æw„à¦\ÁÒÊv'Äy1%A7t+¬œígíž?,ma.þÛ}m^L–7»…µ½|Tp@ê=¸ØBº9ï! .ŦLãN×ï®ë÷/Õµ-«ªxwÂ.8ÓFùm6uZ …èæî ˜[.ËUG¬LÙ™ÙÚÅrûl¨0È•Ð;ÕôÈÒ¦9­« xw©œ[|Å{’}P-ñ�ÉŸï­÷¾ÞÞœ~ÚmûÍö¸;ý‘ÊO ~ÞG—m‰Ž# žl‰»Ž¬ƒÖ5^´bømXîü)íiØ79€xwe†¶­ž÷ö9\Ý �®ý¹Õ%£AU)·�BC³ÙfÙhɯgwµ5µ·o"­0f;~ rÎF*yœÏxÓ6m©#Îí�œÊ¹s½,¢H†ƒ„ ^#ÛžäUÒ¹CÜ}Ç_BœÊ7’QÎÌ|¿}õ¸8¯�FøE "‹3âôm¨[‚ˆ0�{ó²O4TÛ½cÝ/`Ž÷zD+ò×ÓÝtú"à“éGCFÝá²ôxnz»Û<áÚ�Ã7âhb‰†ŸFkžßpçŵE%HuqŒÏÚ0æÌw_ŸòñXxXjÕ‡¬²UûÏ+ÑÜe0‘s‹˜Jm ð„K“îä<÷Hö¢W•�„�Û/nô³|P(\žâ#^sÏÎH‚ÉíKÅ[O¬_§íCÉ·Ködoؤ^Ù%æ`Ó˜?¹C‹Î¶_&TkûäsOrY–£òGr‰8U_6¨�¿gòý Ìð—éW?êå|<ø¾¿Sù»è’Ü¥ƒ"aÙ�šcSün =1zŒ.ÉW6áÅ’ú%bŸåÕx¹]½g�„§Eª>¬ƵÙÐõ[k œß+Ît tŒJ,Æ@ÑpxìàÒ¥ ؽ]¥>ÞÎlok‘¯…4L Ü�2ÓVBbiÀaJQû7YÖ,bê×G­²-@…°M�¨\]x¶WeQÍÐÚåY û/ ñA¥¢Tk0ÌeÙ†æ_a…hs—»\S"›íçQ‹½/9È’gra:Nº£WÌm[{3MÛ*&`’ª±¡ƒÉ –]"VD/¡ªÏwm_]°ºõO(9¸û+ªý³½‡´h(ØŸs1iã…ð#ý|�Å€ð.äˆrÿŸa�H]‰‹‹U‚´xÕ:iÍ#mh±q°? Ç¿A;bþª«;/+•�ñå­é#Éô.ŠN¥Þã…döCZ¾~¤çCŒÉ½úz/J "`åùôjÒå#| óηŸ{õÁß­±WÚ&Á\ÃUY§}Ÿß>çEö!ÛC¥KÐ[2yÄI†[7œãm¯–>ÇÙ±;>m �u¶w$áòw—‘¶ç¥�Kš7èßÝo­,<ÙˆZæ{è–,ÿ·½%ñ­Š{vzˆqÀžÉC">>W²öwº‹ï|�w¡,°^ådí¢‰Ceó´ŠÙÆÜâ6¬NË�.¿¯74ë˜ÍÑ’Öãª�NÌ�Y~]œGòí¶Yß¾•n²…Üõ»ßê·Õwzˆ» ×­û*µð}êÜÀü" {,VvTŸtºùâoÃ_´n7S„s aº¬¢©ê8�Ev¶ž‹%r¹{>À³v”ÞuØ1�ëÒ—R¾Ò ††Zs—¨ Ÿ%Ý-jMc[ŸûtŠÓ8.ö ~á’7Eû>úWòîOÁB:)tÆ2ôÖÎÂi8ߢþ'xa­[2ü^ùÈUi÷ Ý¡œ�"©›gíCöp�™|«}~è,â,«¡àJ O¾‡*ÆäØìyÅ�îð!€ëøÄaBÖò¹TÇ�E<Ѱ!†Œ”ÑX?1ÓJ÷Xã‰Owæ¼n�Á]ç‰*Ûº¯ .ÈJóÆbv‚K8AH��à0eêKUÔ²h#!l^d·—�´mA j�2Ñg|N ›;GØ�‡Ôîÿoc�DXNvÈŽЦ9«÷ Ǻ4qàú¡¼Ñ÷Ö¶«¢ás@Þ®í²cíÌúø�‡«5¢º†Ê< �p>¨.¬,/.�R–+ælÇkb*|zÜ?ÇG2BI;°C«¨c˜ž”Œóñg[Œcì¾:£³?±oì³¼/�DðL²»ÓÖyÄ;†/7æÐ•‰UŒò¤wõ,ç&Õë畚÷¨�öû¸YoÃ^KÜtûËÀtörˆI*–kâÔÿª†›ÍŒNû=`hBŠ[ Ú©„ùyétaŠ‚Eø t62úûg<6¥(()ý�æ¶ïûÞ?áSf: 7Xò§×L»átÐÇlœS€e±I¼¸F±…— =WÃoÏYq&â~Ü'êdSfŒÛ&±H/qÀ“-nÞÙ×ôŒ ƒa$ywæÐX5®hÅÉC©§{Åk±‚׎Äky™½NTïÍÁE¹x'ÆîLW;á„J*AaôWÂfºug«Û m‹¨ð‡ ë—™kv9xÑžÇl+U‡À+}KR|`ã˜VÛfx!Êí¶zÞ¼i+°»‘é�åàB ¢¢À®©§LãŒþçœc½Ñ#-°Õ'…KØI}ýi|BO-d·ÓV’Ò5`µÃw¥Àé»xȦKK± _·�˜’úÜKðJÈÁ†È6«æé:!>˜œXÆßR-�Ò9ð:+;—|V-y¹-»Aw£UÉOÆÝñ÷Þ̳ý~Õ®õL^ãèö[v¸âCUá\‘þùéWÁôûe[«âËÝ-#Ö'æÃÛ8ôMÞé!›�+ Aö)·Îsaòòæ_šë+Õ0è&öÖG;Ú�A·½Ákiο®¹•Íý;álË¥)‚«3ï2>D=å'Iðƒ„ýñEÏM‡+“ºå…¿SÕ6�†rô´Üv·rk[«–Ã3Î… ;i¼8îÛpsGÑœÀ [zÝHµ5¨î4àÝÃ=Ù}}ÌçVt"Æ-xÃ…£ßºâXK<7Š2µÔß¹“aÀÊ|xÆÅöÌÐ|M% <LJ àqk êaÄNOÞNÓë!-åll¾�Çá*xðA€çÌÒï‹øÃ%›ù›¦Ñmã)F_jj¸þÅ8¤ŒYntÝö ”Çl‘GY¸«°6.Ï>~ðƒw°¹ÛŽ(¶ƒß{u`ߤ¢ðCM)ZF ™ã¦ <÷I0f ,/râQé@榲Ìþù3Uµ­u®{×.ɘjûÛ£ÌèfÎ0”×J}œh@49'öB½Ü”fÆÕ}ýÅ|4‰6QG“™ÆöV�ñÔ¯ì�ptC̓ý½Nâ}­ñƒüØç¼ïC¼îÃPPJÀR‚(_6Γ{z;ý5Ÿ#óV&nÿ^,±>ÓçH!ŒÄàÕ·¼ï×-u ^C ‘ !‘0تÈ�¡ä˜þP]� °Ñ3C³†!y{šb�fÐÕÈ„v- 䑜É&Ó'LJz““`—¬�ј(š*hd/m)ŠÓ… ßUwf Åœ†çE½­ÞÉe©#0l�`Ûm]²_®ï•˜î϶Õé;Yêßµhl¦û¨5Õœ–ô¥9ä$‘àã)„¾�AyÜ…;%Y¡o€=mÀíì=ZnÒ *Šoö*’`^GJ¶aCFq¤KKâêwÌÈÈ<5©r˳ܔ­x=T§mXÝÕ°[YÚÞª0†IÑç‰sªäÕ¯}õy9¹Èð¯¼5«‘«›ç�š€Æh™Lh$íËfp™b>q»jH³&ƒ]" FË‘°c{ÙÔg˜„§÷ .Ú#ÌÔsKZ#’CÖ®l+íñ:l6à¶Z´}áá•OöN=…àTÙ0õLÚ6•>ŒCAýCµi�\ YåÄÑ[§!êÕÜ( XÝ3Ëp$5E7Mä4±éjÙýÎ0³t. ÚbÖYu†nŸ—æÆã`0•Ú½ó&(ìf¢©C²f³7ÏjÉpö—üÄÚÔ}ûní M¼2È—ú÷¶;›~.1 öxødXKw‡F6–‹ËÝÑ·Œ€ë l|×Â3­ód™ –F¹ÙÅÖæ` ÎãBœ3âô8 œPe��Ò˜Ò–†ÛÍÅ• ³xîŒ9M—Í…Î2ˆ]Ú�,ây]ß«g¾mî�÷/¼eñºR€Ý)K_Ué�ìy—€ÜÈA+J‘˜éÝë„aœ¥Y“i-~Ö:å#a!a¾QjWmIÞ…¦™ý¬ÕA¹’f˜h „§Õ�ýcžœuÖóºi#�Âu{+é³ÌŠæÏ`×zm-‘‡v‡32lhÃË=˜äñ"פmâ³­íý7#Ü04oaü» MD°`�Uwä놤I(¯½ÑJqÅÀ-Ù§Ô¦Îú…Ô¿šÚ@¬C¤^ª@zúäî#Škq‘ÉÚbmŠÁvyÊ´®Ð°Ñ¸’w-cÚ–Ô$dO  J3„ðdw£³äÓÄ  F¤Áòʸ$«ƒñnÛŲgCYW;ÛiÔ¾khsÝäÞä„Ï]àR¸20v.�BäNÓd€ÅY\iâoZ]™< %¹xé«��a9éeL}ʼZ²p‡šÞÖ$c.(¹ÿ; ×Ãl†¢£„E¼—íh�o¶F!ÈL °.8v¯C&ñOâ­¥óWùüÀÿW�ËKA¬cY§¯×ëí‡ò|2ðAöóè‘ %ÄÁ÷dodé~’Døˆö{ØOvü2±ƒåÜõÛè•s\}äðtI[øôd¹NûZžïi_]0ÕëaDxy¿¯"¤[œè¹¿»X–ÕËyM[Y2c`"ñ­ìN×t¡D@Á¦c”õr¡gX;Þø8ðhß·T^9ê¿®Y’Üö-XÎ× ·ïò/è%GПë�|rKzÅå ò…Á-°™e°¡¡¸ˆ‚!láô™V‡®=l0ëÚ„ �—²UÖ|*eÒ^“,Eð4ú’È nlý:¯Uˆ­±¦ÔorÃm´Ø)AJ tÍn,Þî ™¬NEØúG/\f±6ç0ºÝëR°¢ûq`Ý�g;&Ã|õm¨†\»ÜA&1Æ(–³¢Ó¦íÿ�~[JbRr®óëkjý"Èî‘ø~ÖhgW–Ñxo„%»ÖY�HÉA6£”!†~ÝH´Vç*n’‚Û[Ù�ש¥·xø�Ê—¨W«ƒq�ólU³äWA'DT"t‚½ãÕ˜z3á‰Å°z'–¤¨¾MÅ„O/M®êm¥Ý°x§OLåð~ýú¸MT„Z•®mÔÈç~î4"Vu m`­``ÊϾ�yŒÜ’‰´PšjÐ^¤¶›ñÜJõ³ª[=–w~ÛM ®@ùeÕD·�YÖ²hM–4S+Ydê¤6¥5VËN£í-séîµ� >/–ÉrCVdÅ’DÝŒÞÿãz¹~îìr½�-Á°ÀÃ5Ž9V¬‰¶:]ôˆôÇR®—3И�uü;T‹¶Ù‹â® #3oï’Ðã\k6#¼Û'3+z¼oº³ÎLBNOYME« ?ZCÑÝ®‘°V—Ol¿Ð©f{îêåÿAûðkÙûï^Ø“Öuî«î‘’¹b±ç×obzƒÌ¿Æ2Ê3âÉp?¶Ûüì²ÁeÁ­%üBQ4.�vwÝt¨NŽãiV1ÀY†Û Ù'ݹ_õé‚üV2 ë)Îí<µ}êj¡ÉÐù»�1IN&`~+ýµ¯6@]ø:úì ?"å<¡Ìê6ó�–Q ž$½É¥�j×ûvüè¨YË–[ws¼ýªóîªê¡ÎVëºÓÈò±Óå‚ö-).\Ýnÿ´ã{ʳ(^uÔ%rýï&%”Z¯¶XÃ[yV@LbÛLž{Ô=jq‘Fbá_‹Åf =xCëcßw(;-‰¤MR±¶æ0ùÌé> !¢‘ˆaHŠKR&û¾ {D“ÛžEÓ&¨‚™<]yd²ý¾åo¶úù¿L´]Èñ&‹H ç*p¶ûûs›^Òqv•—,ˆQ6`Ùš¨ò¶Î]—�hÞ�ËèÞñÔ!2ƒÙiÉn}ÅçÝ÷´ ºŠ–0|¤žGƒÉ’pÇg´+ë˜zïзtÓ™vë\Øšye@7Ñ= €¬›ãùÚNÔçÝTªÌ8j‹!¨’#Í6{m¤Ùƒ'“·¡èÍ©CM²ïCEävâg¾É˞馸RYÔcÒã~ñyVÙÆ`Ô†t‰2Ð)5}«°[8Yú ´¿ÞîÕ]ýøð~üè‰OÛ±‚s¯XÂÎû­Î�Tc*ƒð_£:Tøª³´Îe‘ éW¤¸úºï)Ùå¤sÆ]ÏëgE Õì÷\™çBò»µ¢(5ŠàKâ‚dÔ@÷TÆ#ž@8`º¡ð;Wáw|f…¶3›(·1awÜâ2Å7éHÛôï`ÑÁ>³�]µ»—aHb¨·r·Ä<ÃåžoA„AFÓ_8r-ïÓ·†-Èܺ XÛc}¯H+ÏÁ¾î÷¼AhtÇM?Þ9Þ—{¯|Lœùø%ˆÂ~œ�þ=»�qñc\Åim .AW ^^ ‚�» © @½ŒXS›û[@Y¸Ø È ¤ˆ�εϯ°‘ÅØRöu .…#�¢#�ÆÆb êñ©¾/ Å8<Òyî&°ÒY—â¿ÅMŽz̵¨<³”—…åÿ·fÜrÅÓ‡èä1Iè˗̭ܸ¸óÀ ‚õd·,“ª�×Ûx×–Ö›˜Ýõˆ�v«M›è#}§š�kÐÝwÆ·—JLXñˆ‚²§O¹D`‹WSwc[Jð¥$rO¬[°Ód—*<è5õ¹=ò„F2Ú¤RÉ‚G‰ú,–1œ±Š¢ú›2$þ‡î§:Àæ3Æù2Jp§îI¤Ø »›ïé®%ög%ž¡Ä0êÑžMعy‰û¸­…íÍ™™å[KÊé€8MÊõÆžŽþ›�Æ£¶Ì¯—-ƳkŒ”0/„ÓŸ²;2Äè­ƒS@¯»k—Kesw!ˆã†½€Ž%ƒ‘ÚslJì :Q`„ÿnÞ:o‘hç6!xÆêÖ3Î}M‹lƒÚÆGVn©ä³L^ì%….ã´÷OIæÑ‚[µ¾•™óB*ä)>`Vy$qr#>ï=±«�£÷:A|ad5ÁŒz¿#oU~Ÿ�Ÿ+ç;i¾×=ÅÝ”² Á:rt ‹í>ìJö�Ý·S¼hÖƒ1“aëw||9 ¨¡f³6’�™{æ>ü¡ÎnñAuì‚&--y³ßmH¥Â¥�¨3òáãAkx2æv4ß:³ &�æ®]²Ä¶šG^�Z"Tƒ–ªíÙKŽ2¯‡mfç×}M°l èãÈ'ãgtÍ…Ç/*Pž1ã9-½ê­ Z>ZWñèBº¿YAšª­¦¯–¾ƒŽjž£™º'†ô2KÞû´6œþLv~–â�ƒµÐˆqÌ7ë³fŽËX¿ÈW+i  ¥E‰�ñâ1g geô×GÙ €ûÜO¨˜]¸IÞ8Zó í§×?d=ëX#Þ¿Mb_"XY§=ôŠà5 E‹Œ§\Ó�<æó ´¶ Ðës"¿šsõq‡…�&f˜ÞÅJ›»ª›%âc 7}WÔsÂcWÙCfA°Ê†7̰ܷ=c¶r¹ÅeÑï�VÕžæøÙ•ç8¯�µÏÉæ\½O/ZÎn ZjÐ|ë8>ÓþL·7öwÙjÑgº—«™‰Ö+F88€Í*Q¥NöReœ>êwH0e’Úž²z˜ßZåAØæoa‘AÞ*ý>ëX¹x~µknµQPv«™qêÐ �í_+gúÉZÁošpmƒþó…¥0 -‚ ¢Hˆ1ÔnÿÕxŒTt°Ïq`q““*‹zSî‰OU;oY5Õ óxÕ1P¯9­Iß�•™�á(7JÐH³YúO€S’®ºö;»ø];úÝ{Ç3ŒÆ!CÂ)í؆Hë,Z÷ ÞL’Ð’Ûœ·Ûúâ믯¹ŽÂ`ûˈ„_‹À½ÇÖp7|èô–ažïÐ!ËïI·òñ,ó�‹DÈfÏéãëI„ê"uS´T÷Ý@0ÅEõ`k^º�Ë÷3]è$K9N•ð¼ô‹7u›9ª[4=nw†óÞ–Ö™ò…öSeéKÙ³yÁÉ2òHžüã¸_i:BØÑœ.g6F3YLoeùöÒE£æ»ä‡­;èu\ÐJ°¹x(pêë+7-€ýø»ËbƒûˆÕà1I r·æ¹d\¡zXÕGÊJÕ Nõˆ�Çpǯ:j °jnÛ-N€ê‹$hø™º�ñxòÀ7,GÀ*¸®™ÎWÅq¸� ‡§�ººš÷;7y èµ6Â� õX¨ö¢.�®Õ½=öŠšÁNŽn¶Â,UÂʈYÅGñ/ñ‚Ž«‘J¨èŒ²C³Í2Œî¿Y¬÷¹‹Oy#Z¬à.ûï…Å¥+xðãV«—6aÅ™Éb­[þÌê¥ › • �Fæb£‘:†G·Wwû¡y­%Lá˜ç†úQÍ–îà�9‰Ó{•…Ë·ç·û÷Œí:ZÁÐýu ß1`Bôe †`^ ô�L œK¹FAåís@”…YGXŠã¤Ø¢iX£·¸Ý)1dÝK+Þ×Ó½fœ;©²››ZBCPÍvRM¡Ê]ë-.ÎE¯¥Îª�€ÆOÀ�A†™{¶ˆ*D¤À0>Â4æÅ22Z3®ZdkyíæC½0â-±ãíûÙñ¹°¡‡ {ç²Û=Ô^é,%Ä >¼Bò¦£ó–òÒz >XÃê-~Éït W1ÙÎQÃjÃ%L8çbê­æ0{·Š“¡# Ò£&� ) qsuð&YQ§+¢‘pSí¥¾¼‡;jœM_½¶ÿ!‚eÍã¿zP«ø)Qü‚_unr™ &¾…ˆÙ¹�«XnÛ.$3+šÁ·BÐ¾çæ¿·+3¾ŸÅ¿t"ÅÇ_Q R0Ê–ê3½²†`Û1^ÍלÈ.1¯£ ëîÏK\î³nûJ…öÃu^Ð%ËÛ¹^yuæé‘…¿l­do¬ �Öeeèúz7ƒϪ̈́8¬³›&0®AÝ@HÿÕ®ƒÑÅÂ�â7 cSŒ¿éâ`´¬Ø[ÅÅAÛ@{¾Ð7ÜŽx@Îä÷� )�°†÷Ì•n/qÈÍ€sÞ¹…šºENÑ×»jO äx 5˜Î[³úlz0°Ýƒ aÔ~%0FË郃jYгķèóãÕsîmŸ_bÚøË|Ù¦†�#¬ C²;zNš²Žñ.0p(œ¾ÇGåSÉëeª^$–5€•BµÌŸê¡ô3ŸŸ®˜ýíµø$�zZ”Àà VmÜ wU ·`rvµô*‘=½}e°Ib+`̳uOÆw £,`(lÐužÒÁo0 à¢[Ê­lÖà\×�ʪÓhç–ªj8¦Åœl—‚’»Ò| cŸäÕç·XúVê (ZÛcRœÔTèž0µ”×Õjë,õ_Ûfgu—ï $0yæÆ~ÄæÌl²â:åÎâgŒ¡a¤Øko¡iëÞ�OêL™°¨s_+ÓA9\^‘ŒØ2×vg¾•œr .Øiûã( âNåÂBÂ7Œ†6�sNhã§8;G°Ÿ°Át½îñ®õ;ÈÁ¸,ú§óóç‹®à½S®I]Žp7>÷¹®›a.㪰g'šó‹:åÂ9?XDxj©’ÍæC4…ÙTp Ãyæ°“Q6îËø’y±¡gö_ˆ«rÞH-ÃÛO1ûxÝe³’C¾Þ×jÊC3k 5» Q˜Ê˜e561PT—Y‘¤)ÇX׌ND 7m–Sæße†W�säõ¼áÑDý�«!—kë¢Gm³Û†ŽÌ•´÷I¸ç ™TQ-U•P[•n ]3—Èîoô‹ñ y7è¬ìGö€yƒ ùŠˆŒ£búГÝÚ¼œ²WŒ3°ƒ§µàóXøíÅ) 쳟ˆ4#»ÈzÄörƒGŒß!0¡ÀÆù9E4ÍÅÆÍ‹ÜU›«zl5í”"B39n±ã4“9:¬ 9k¨8¹»ù«O�*œ!°ShehÁ÷ê„;³>‘Æv?Š-àÝYñ¼ˆAñ¤ý÷¬ ƒð>�‚äÜŹ GŸ= =d1&~‰ýܘþº/Ú\ŽðUѶÐxÒ�R9|2jc¢–<¾nÿªug¿Ðw—ù0U„ ·±œ²RÆÂ ÃwùjjÂhK!M*¦7�üú xz3°ÇiïC[v»PÄ` Ä=Þ[ €¢ng–»ÕÂì‚À`û‡Ý[& ~jIµ„ûz±�n#cpÇ…>U}³cˆlFVË!Ç@™ ½œ$íÆY{MI7<ÉDLCÎc`âc5¹]WºÄ¨¾ûzÓÆ¹(‹®#ªæGIžÍoÑQF õpѾ¬' ±öØŒ´±Ü\ÃTa™± 2ØC…s}Æ`tóº5{ŽW�¬ohÅ»¶~Kïw$…£ÒZ8Ã@¼œ›Jr§„ÒWº3Ž� PVÁãÄÙÇá â– D÷ñWg ŠDìò(âúVî«M‹90[÷FTKì_^ë kË šØPnP,s}ˆkEf´ÀâàkÓ¼áZùø*!ÒØŒhÁ1¨s‡¾ bQÐ-W:›½îÃ}ÏŽ2sP&!Ù^Á`�BN™¬g9Ó¼…³9ÔËæ”tœ«ÅI2e0û�&Ày “ÃסVò»é†`L¹½,#-§*â;�«øï�ÛÆw°^(xÂa»×(l‘À–æVhFÒ§¨{ø�·äåØâþ@ <«Õç%4V1ßä8¼"i8Œ“± ³�{öŒ¶�V‹·§{)ª5Ír“"‚ÅÌàb÷ÌRLà(Öå5–`V[c@9Í¬Ô •©±2Ü“ÉJ:Øz|ËJA‰L›V÷³93ÀniVè<=©ÔÙF—WF‹/®øï8ÉÌäî*ÄiYö¹c^[Àлª¿_oÓyÎ Žxõ1�[ˆñ¯<€Ôå)8®Aª[ ÐÞÁT4E·<Ά{|Ð!¤zÁ^mÁμ®MáV•:?†\õÓY7<ª¹�ü|]Pp ‚ý¢Ó·Ç�ø_õéw°Iõ> ã9ð{Ø3OÏv7æ�aÚøo1ÉPNyÎ÷:<ó¯FoÅšï»wd=ûu-[íêίÈ-§r¡¿q˽-�­œ@D´#ÒД[ò¸šÞÄów[ìÞ,¯Í#h–׊¾Ù_�{Lýxƒ{òþê›:7«s´ÖzÅ~©Â� �ˆ¼ÊWùC¢8aH‹­!˜TíöÛ·½ÄïpP Ñtˆk2Ú‡d2B¨Ê¹o,…>"CãÀƒiÁŠ 6£Àhˆ-žE‰DjœWÙó‡½ìt ·ko`‰ûë_k¤;,±ýÈûí9g΀=Ç=˜¯wØ0)A?Üu&|ÜÈh«¿§œ™-Ș\7!ws+çÈÝÿ>ô:ú¬TY…×Ñ8w ê"$×g›…‡P:žH±$i$�Õ¸-èiqÎW™3«!äéÞøÞû^®ëݱQÁÁŒ-¾Šr šë¦4êD›u½ážp[*&ácE½á&Å"AmbM¸ÀPM嬮R‹a:¤ë¾ƒ‰®_÷�tÕÁDŸò–YÁ�9Í=v'fËúw“lækM¢.Ú®å·'5l$kt/7"ô*ÜDô;ù‘¸Âq´Î'˜Q ¹g¶$ŪÚGñÝÛ¾oYÞó‡hgRÕýL|¼+ =êü/nuƒµ^ª.Suµ­îÜ.¸fŽäPt@1~ SÄ6KR= ʦ,EúŸ_’A–ØKvö;ÒÜWh“á Zjƒ–˜ŽN7ÖÜ_ÖvŽ%QðAs£~p<¹RäêÊU—é?}w5õšÉ úõªbkÛ¹ÅÞE7Óæ L¶@O<# ¹BÑ+zÅ’Žóf&'ìÌÈ'}Q� ¸À1Ú†¥&drp×¾êmœXoHBe…]#!“Jƒ1SmJ¢E€œ8PY‰´ ;e“¶-F"x¾òR¦æ ±W—V¶¢k ¢ãö_Ó®\€›•ï&†Á�­ù•xàËÞâ‘»ËûDœ¥âá`DpøŠe´¡ËXŸ=€[àFñc—½c=GS[ê$·wý�õó ^¬Ž×ž"ü‡�%ÂÚU7uvŒžìñ”ý•|†àlDÿn]ƒƒþ$ÈVP·Sঠ(k¥n/Ú iWÕí^UpK„¼]%„/^Â5öV Ù´ä ¹ÈÖœðÛ¦,n°�Û¼�Ã\Üö&›[9HÖa:\ ±ê&k7l�æ Ä$$Š+ùŒ8è�ê°wKq�ýÄÜ<£œFe—4{´‡¬ño8�]+G$•:ÙÓ„…¹ý:¶µO|+Žñ¿ÉÀ9*ùWó|R�Áú_iõP�ó¦SÏâ‚ÁuL-ÛêI y�_î:Äצ¸]^ª¢âÂÌ»[–µë}Eè2ËãÞ‘f2“»³b-¢yf7z�WɉàPùzå®Ç·vçÜý«-ÃL=²ºrÌ«Y ž¸råÇÚVªCIž¤òo®ý¸œ}�Z ŒÎ�� ë¡âæð6ØÕ »,ÂÌÇ~$Øx’Ü;e†ë›¸ææÛÞ.ø Ënƒ“¯.ôÀ2ô/øÖã—wÈ=+‚mÕ Bf8§�ÕžÝDqÅŒ" 1ÐÔ©­˜3s·›÷Њ£š¨b ‹+$åŒSœ]~ëùã×öKÖ#±Î#lý±Êøvr›¾²”aD\>è¢n(œ=H|\¥ˆp6¹u_s¬~”}æ÷ á>Æà¡v@OɬÕäÑ©,¢XÒÆD²6„‰D¥A;AX}Ím.ÓŒ¢®×uðÝ�C ËÕt"ÕÖï–j ‚òp4 Å�®em$ýݥɸ+Ï›F‘æp?^ÜžWgˆ+¨…ºùåõü»™*ûæºÌº½½›¯Lwˆ€ï¡6WÎ@CæHå`)TÈ]鮫æioÄñ°�K.@оÑZ�L׊çm§¾”l+qµˆ¥Ö§°4X¡o—?DƒQ*—Û( iFÜ?/s�ZP +‘ð)ùg~ø(2B¾TüTn÷È€“æqšóKµ ‹/F[g[n6f*f&üÕý�Äs¢T÷$ ¦ö ãj5ZªÀ¦7h]Ãq,mµ£¿×RÒ®¤!°ÿ²K .Ä>8âi-Z·—0P<× õ´y+é(Úž;S„8ß¡§Z�d·.MŽˆ:…¶îêQ‹�Æ?©sÍùr a,‰$ {Mp„` ;¨ ,·kì,ìP>íßE©ïdy‡8³”6X—by}‡“ÄP0Ì!�™y›ƒÎH‹C~>ò¦¹mµEMbaqx—{¸šWva…û�Y[­¤évµXáK58“f£7'Në0“ N| ëC‡Ï`°1—„¤x¡Í¢Q†E8“t n"­.…ù“÷'@;êæ`è`õ­ûŽÞ*«{�‹' »�ôQ(õa‚ð„åºæ‚ùѤ¨×,Adr@]ÅÁ¬–õ©2ëM ³?〸KߌòêÖö8›¯B‰5A­Ç_£R¦Ø¶Û7Tóþî¶HW„iù/ÈùW;ö°3Ŭž�Éö¬�ò}�ƒ7¦*>Ùèð³AŠI—š�Í}ò\�í»7ÓqdA5“²JÐ ¸ìïÕä75 –Áƒ  !i=Ȳ¡Š"Yôz»×f>¥û*tƒ@Mý–TŒlo ŸBÕûŒG“ìjXYºŽ %uøææ %nÜõxúÅèžÅ†pœ³áÚY{`î >½YÚ|°íÁЄäˆ\?µ>n>3¥¥_)~½³ûä t;0?e�Môjåªú^BÏ®äÎ2Z…�ï ú²ËÖ¦4ÂD ˜<@�¬e0 ØÁrp6bÁÅâZ>HMÆÅ|Að¹?:²…È1ýað‡„lEm{�:�{¨›/WU/ �R{ ,ë9„vÐ×ro9èØ<Ù¤ÄàÙPÅœƒ×ë8l©ûÃê„Zˆ3«t“®tÃÌhÝJ7a0�dè(³Í Ï¢çF<Õ°ÒÚn), Ë»˜e:lÚcM��‡õ˜³f„„8Ó§¦‚¢›^Í |ÊrîV}¶)Àh‹Ö·×½¾S$ÂݼQ‚‡¡¶ýÁI%M=Ý {Jè?Lãè/ØÃú—'—ÕΛé¥guÓwîv`*(%Ù}®RbÜ®¨}1؃”g‰rd�;¡5ºìæ‘(Áµ=a1N¸RºuçM]%Û¦z-ËÑ6›RšÖKðáÉ6ÒÒ³µ´ÕÚ¬o};h‹÷am®½=Íq—e¾K±,æ$ù=Otù*øÓß«sÔXü¤: •ºvã’Ó_°_ZÔ×7\ø’ÊÛhHpS;ç–lGl4ºšÇ4 }�õ$È4_»äœ9Î+O›¨±oøêÂÀîgÎäÊCTÑ�¬uOöƒ]oÉn«éïsØt/† hmÔNÝß‚i Gr ª|FÙŽ DäkÙ»“ o…°e#Èj 0 †²ìè.íÜò‡e€¿Ö{ú‡–-�y½X2¾L·ÌËø.\9J8.#+s„¦×õÉ@4ˆýæÊai>µjÏÏëKmÙÞ}æ¶aˆ¤™ ‘.­yéÚê3ªuá„ä!÷;Þ½Ì ²%|.·Èœbb€ÅóÇá‚jÉ?%©¨p™Ç¶ß‡Ídî4"‘z*¼6\8l­�1m"´Z‹F¿Úfûc)ÙûÙŒ|ô‰!’$ïÌÍÀ 5p�òEZbåì> OÂ~ÉN¤B0>L¬ÅOúY.ï×ßGëz™Ìk�PUÛØœ7Z:ìâ~àó,…òñó�‹èTVäŠ^µÃ/�Äw¹^fÎ �Yù&¾ ± `¡{µötP'íN‰ ,á’«�©YÂÉˉ½çöQ½lvÞÃ�…y)ÿBa7îÀ|§¸‰Øáñ@žáÔzAzu«e²3Œ`à&ï[ç~lP öC‡¹ÙµqqVË5!]ãÜÚrHž¨oœL£Ž´q\n Éëîìò@øIñ°Ý¸â [ÉæÛç$>ÉÇ@чm=©øp îS2=<ÝÜp›öñ™ËÁAüæ^Ã�:†hàVå#,äIÒ°Æ-ñ®Xê.t]2Nåis¼‰4{שõK¸o…Ëɱëw…MfµÀÅów �žAº+M�Ú‚`¹´Õ &9EÆÝv÷EÆCoõ´ AlÂÖTâì äyéÚ–ž;–ÜÄøû‡�ݱ�"}•�s‘ …rù‹R²Q„kô!¨.›0”>á<¼—uI){�E ѤÃd”ö{µ‘Àµ:Ypl&“ål\(lÝ=ì¢ùê,¥^eßf`ùvj°_®·K U¯™ ²1ò¾Þ³5Fò¥i?Ÿ!Íg{»Ë— â�–�s.Ý�;ˆ9„aL“!6’B2Ór…‡�kö#RN© ¤t8 6gìñöøÞä»o¥Lp–FáŒbÑËó<lç£Ë1'I}—éÉžvŒ =à”8ä8“^§r—_[kx¹eíbgÂžŠ Ž‹C—bæº$Í}.ј6{zÌF§w`(J¯*7á ¶|J+ðÐE$VO8drÑTê+%¨;†5%8÷vËÐF#è/$Ø)T›>Ögõ�¬1`¿ùÛ½Mjd-dÚ&ú”w|?ÅãÒð/Ù³„Üß)!ëy`æaaúh_]qÌ>9š/³Üt‰�ýiwwPÆßÀsÕ:!k‰¸É÷ˆ:äÚdGn¬\ÂÃfÝ]×z¡p*X†¾œoŠ7½¢·Á é(ßõù–ö}‰‘º]2Eqµm;;!zàw6úpÖ{ÓæK�´¹ÛïŸ<4m,((öî‚W Z·<öò†Ã>c²1\«©‡Äî¦-ñ<…õZtpØkc“^wídàë÷m5žb™Ÿ=˜j˜>è3p›É£ÀbüÓÐoÕA»×î<)ÑC÷Ö}ôa÷²Zukò­+4ˆ^3£=©-jÖˆÆ1E¬™¡ÎÆÇs¯*ß{˦ËÖ\=;5i!lݱZwÀÐÙ ßñ5‰ÐÉ'ÞrÏDÝÜóC =P¿­Ãå¥Ý äÔŸä:òµuÍø8ÉYOßijï3õø<#‰Lmcã"k’ïV–ç®ØÂìØYÉãùÙdtVA{X}~uÛ±D°ºݨ-_9»ó>ö~dÁ‹ãEB~Í¢Éc’ÑF00>ØÇ5¼0˜ýgôÑ®/Q®¼Ø˜ �ýчgÜ›„�Øþ¼É×ÚÝŸ=¼ºÆÐW(••æà8÷·WC¤Ä�IÐ. v÷gs2ϰ<œ£ªjÞʰ†')¶ôØŽ<7l ßU ‘üÊ[Ìá¤)°ÛéW×ì@•6s|}2ªî¢$BSoOÉvít>¥KòJÓ÷"þánëj×–>@ú¶q°Ô��ȵ*ÁÈ›4vÏmßTÁ:]ôÝRú¤æ-ÛJ<‹ oô­ÛÖÃ`Ÿ·ÕÜôBSVøÈºÆG|ZwÆ{Æ4 còdA,möˆÀ1â«2n‡µÄˆ˜ô�¶[Ü‘œ=óùŒ‡æ ��k�,±¼îDbB®ÖN½3©×KSI`Ya+øz#�Ææ9á¿íW ¸œ7¿žp”z7‡P{F²ƒŸ7GJÆ�;ëö ð‚•¥üX¾/Ì›eãܸ iD&\þotý÷ÇOŒ~t~é'’©Ôsƒž7p “΅ã²5›üÅN^B �󮇭؜cbvíƒCÍ=T?ƒsDZ þæYHßZWàñÈ?º~ž3Äæ] åúÔ–Õ×_ÜS(;êæÌg‹Îcè½æ ÅÞhæÎÇÓÈÆ@ã+\åŸêávÀÛ´P”Üò®ÑˆûxRŽ�™¨ï™|g(Šøí„±ë&ýu®- oÛE²ZrPLJ¢ŸØ¿ëÜè_ï¹Ö®ôç5{¬Éò…íüL‹ ø˜¹p×((õ¤ÊV>éV1ºÖ4Ÿ©Nð=Ðþg‘�Ï”šµ xç pN�2GncX"j€¹ô'<²7*à†’þµ,çC >°c³B½iCÀY÷ ½ëS8~.‹l¿]läm«å2@|<¯³1�n6…È2$Õ.öÇ7/°–÷QÂp;é,öQÏ#ï‡r`<íÁ}�.¶*|eqæl´›:ÈŒûaiòò="±Ì› Ô À æ.ωb¿¿î+.ݹm¶É–¢¾Qõ®\|uwµ¦›¶æ>TX'ß•›…ÜhQ${º (7÷lð #‡ûÅ«^Ý®dPil²S�V±äFÉl+ÁuŽ•5.âÑ5Üo!Z^!~3…›À‹&®ñ«Dž‹ï7¹Ì§0g¦²žÖ“Žûà~üF×1k°V êŠù0–?¿6¾�g2Ëuâþ÷�Ðк`Z“¢ëd€ÐÉ¥ñŒÖ¡RÁ^94Z¸·=ÜbÎy‹H¹“}R‡[?ê¯qygÀßìzÅÝ`Q¦¥mŠt‰Û ãï‹F0º63ÝÄz4 ¯ºØw�£ ½·ÏÄÑâ¾ Ñ´a¢Ÿy\‹guÛSœï˜v“j©Uky¤MméÑÖÛnvø>C@Þ„ºn]—ª¬ý&ô8káO‹ú�nì—á?ÑR0[9UÚ¹"=¨5G�ÑËôkŸÝÄÛƒÝÝ k/pué4Ùdà÷ .UÈMl€Ã�¡\�s!¬¾�±Ï0d¿°­êœ­cî´ŸÎÓèÄ ŸW’G”Åûu,m~·û]‡¢«\«ºÑ m�7Ó±¶-¨œqÑæIî:}à/‘<¼®ø9Š/0�òíˆ4´ZÝÛ¢šrPÜv{Ø<ðò¿>êêg|B×Ѫj›­Wî5¼$Õk^ì<Î*Ú’§çÅ÷�Ž»òg0™ìÜ„Ð@zFp‚Âày$%µ�¾ùÏL o8­E¸!fÎÀWfm›æÉ¦ûQºŒ}²P%,) ýR­sÒh§b1ókÂÆ× §‡8éó…ó2V¿LòèÛ�d[lõ©ièßë.éÑÙC-òýY´¼æ~@¬ül¿p!CpE–:³š8&Í>mÎa�–­Šæ�œ3²‹ùd̺í~$OÝ…vßÊ]Ž·ã=á 3¦û¥^‚Ù~&CïÓÙXðàÈÁÝA oˆ½e¸‹+ ƒkOµ8¼¡ýŸ ÅKÛî\!)ROS"Óe�‚BiІ˜–bîp¿X( ÝÚG_€ph·¶Ó\ßœ§7€î§]ïtØ×Þ(-{Þ€÷+ð5°ýa�Фë||YÛRé× Ì)ãˆÆ‘�ÂWøðÁ¾`’ךìrС¶Nß³S ­{ˆÉ·ÇrÊ~CqÂä^R—ºsœ¹¨Ð3Ngˆ»§¼è!m†.Èp°�y,…„ÎvJí£Û{}Ø!ð.Óƒd#Ì… ©·qÙÄ05Ÿ‹ˆÐžÈ¸Æ¢öŽGÓ šâìM‚e^ƽÞÞÔ¦a·Œ7äÉÆõ‘@_²\ ^nŸo—¾çmžÍôN .¨8ÂÝr�±n[£öÓî7zMø¹úY¸’ù3á=ÃïpV³~ˆvÁrp®Ä†IGikf�j�h Ws�6Öéð™7šÍ`¥°ß˜ç£QXáyÆR'º’å.�͌내ި6±ªLTÄNÀˆLoÞv`®_äõüxŒC vÇåáilÏz)Ø �"ÅcÉ›.ü^œq“6dÓLÛ™›3þ·s?¤||=æ$ܲòV'=ž3 ù¸³�ìyÁBS‡x¹¸}´™ÑÚÛ«oš–ÃÍLl£À[l£9ùXûµ.>-ûÞ�qßIq ÉY·ß9WŒ>‚Ç�¶ž&¬wMßIBJ[)•ª*�ŽI÷äâ?Œ)ò("ªG„ k›ä~�ŒlôqV¦rÆ%4³«ûÙ¿ †ƒæ©8wÒ}Ü0yKÆQð­+=L©2†O–úÿ§9…¾H8.?ž%è÷çµ}&÷ðmFÞ±0W!±{ö�í�¶Ån$X`чYÃÁ)¶o“à¶D�wÆýR¥±’í]¯¶ ²ygÏ~2Ã=-s¿hÝÛ?cwÏ5¤31øî0iÙ¾©¾‘�ͲIXÊ]—è�»Û.îO“ß°ÞE³ƒÃºfk‰Eò‹—Ñš:«{7–ßAQáˆ~øH.) /–­,Xt?_2õÌDœ@)… 0j-˜§7Õ±Iá2¾¥*àâ�4êhÀ» %gâWa ¡Ü ’ÂFت*Ðm²—d¤Ð^}`£ÔqÕ(•3ŸÉ’ýq\Ÿ'ˆ‹%élßI*÷t%KZs™�¢"ÆŸ?ÕzZ·kí°�uÀPâÏæÍÅ�CìÖfbòvâŸm}Bć֨‹�³%Ç|…VB)‡Po‘¬6§DD¸:Ýÿžü�ÏDQÌâ¿(çE—µ§L} �'”¹§(Õb—yØf} +�Ä oŸ¹¸,‚ÓöåÛBØú“OԎý’oôàŒ»|i7Ù{î´€´9æTÁQÀ¤`A‡°Løòê!žÅ¹$‘^o^õÛþÊj×#Pt@} $:rñHu'â·2�Õ�ÓFÊf[à9——,+¼wÑEë. À�²!ó:ç_À+´ÖO½Ò…˜H†ûÁ3M àMýç0´Ã‘*ã~Cý¦¤$˜ñbk¯¤lùªÛoÞ ¥`"\6bÌMRð x²<6€ûÞ«µµ¸d’ƒà{(èîdNó¤�Ñ.F¹÷ÙP…†öc¯½÷oUfnüÑÒ»á3V.Àeuˆ^ 濵M2¿ì¾Bv�µ€ÅZ¾è'+|õ)-¥éD;#ÚaØRfæIŸÍ‰ž†ò‚”ù îÅÜ Æ!—…’¡{‚ÅžFã\'ë! Ø +ÌÚòöõ²ø¸‚ñ® ñÄ4ž›EÀ³sì·Rj‰´IùØp/:™‚Âç3èÝÉM»Í=ºþEÔ�*Ñ ëG±jé Û¾xê…í ‘Äi�7bw·wav ¾i4z}£þ‡¾ãÇv "`ÆWŒów¿bƒ> îI&³\Áwzî7T�c÷ÌUº3«[ªÀvaÇ>î¹t$fœÉB�©´Åýäk�)‚yx¦u¾>õÃÚRR“¿B®¬‰¿/Bê{ñFWbˆ-®“H ¹; œ A±hü»Í¸9Á¥ìΫ0{Ûš1,eÛ6Éß­YÔ:ò4å..tÔ‚‹ÀUøÙ­ö3=ËÍŒ�NÏ]õžáwøé0à…à àíÊöð¼ÚZ~û�¤mï7×#�ëïÊ÷¢¬r“úÌ1Bc3îé7pU$kœï_­è«ÉµµÅ]”nœl‹ª¾Ÿmø¾Ï/Ÿ‘ow‚VްÏ2»O-0Ÿ^¡àâø øbŃM`ÝŒE_ðì5Kær ²Hqh¬m›¡ç¾Œ*°N,É”ðsv1ˆ~òÕHvxÈ9ÍÓ˜9²æÂ<ª› ,1¤D¡ ‚bÈÝ�z¶Ýã÷ƒ,¨ïÉ[þÊ‘rÓÄ�Ș5sdÌ)9XÃúüePC7¨ž´{&¯—-È¡¼uýó4ë÷ ^b4^ÎáúD“dy–’Ͷé�f©…ávĤÂÿµ~.³]\í©ÜòAãÄ-5­äëXdà+�ÒO&ºýµÂãKö¬ì ¶@¨5. 6¥½Ew„»äÎI´Hô¶ðùí¨§ ’®¾µdd=»ñï„Ή–îx•[m ÃÌàå< /…6�„;Ú¸€ioo|oƒQ–PÚåy4úÇ>RÖqi±s€•XÎÚÑüΘµT¤w]%õ,_’XR´åŠÁ«ÙuRÃ#eê+œ«ý-XKóKˆ›¾Wu»ÕvؤxäO^í= ¾Ü-Ÿ�C‰¸yÊà·Ï¦Ú:Œàd ù¶«ê÷¥®+®-kþü€?•y3ÜÛÕt8Fê#_Ô ½¹ÇŠn�d8ÅÕ5Õ(ÀÚr˜Q¹ÚÎt‹íz©¶÷².o ßJ PR—óÃËb«ëÚ¸´Õ¿à5ˆŠ˜Ñ—`Ùh‹u>?¸ >¾EÀu‚cÍÀtX;îqO“xŽã€<0ƒÄÅ›Vß]7—ùÚ�k„š´BLHé�ðûßv—©PLSÁ4¦SJD»õч‡ü ù¯ûùv ¿%0ι,ƒ'þ?ÝÆnR—ÕÎc«¹P{sä|3¥øU­J8o¯«Ý·´1 ±8¹r>œV�Ìœ.íg-}bž‘ÐD$_=ôªÊ¶ªíjÞGSt³Õ~•‘¶›�šFtÜ�Û¼5¾»¥"Þ»—ð�wü)Ÿ�ÄàmW²>‹2‡ÐœZL[rÄÁKîïv|ù¬ÏÙtŽOÜWeß Rt\§ËLS‘ž1ôÐNv  ®•Oé¸/^ÜMûš`û§a Šau¥øyçD�X|�5ïR;jÙË·bd>³Ñ8˜ [?ðôÙâ�a+œ±ñ¦T qC7£ÒõM¦›ë0§ wÑ·wÐÖ7jq¶Ñ 4€TØ‘¬(Ü”²BxÃJ¥w¢Mr”ïN¼\9a@ºãÈ[¿ÀÖmyô1Š>žë ¨ DßM¡¹z©©ûä´~¸ÖèÄ9ÊûY �cp¦*UóÖH;¥¶L+ð³cCøN®Ùc´}OrNW6KÍ´1À#ÁïÖ©KçI˜’¿…>8jæA‚¯¯—->é7~ÕÈA3g¿;M€¾T·o Áÿ< NͰ²á„èú÷.E¡AM¶É[ºS’ôjoÓÖ4aþÔ�·£t'“éŸÈ›Ó|Û´_”Ea}ž¨n ‚Ò>> µÑ[ÛZyv4ÿp²Í¼s;«pùÀfÚgœ—¨qù8¹¬+�jÌ)õ´kÜãÆ3ùBÐ0©è¡êXáûÀˆóÀš¢ލ2ÙÍšÃn ØÃ†Øn›K<')³*³=]{~;z¹¾ŸJû¦Ïmû7MŸEÞ†„[—‹s‰~І»½³�fÏyÕkæÔ@§`—¶òé5›+¦¨É�aVg†2OŠö ]Ð{–#÷\ükÒéåMÏË)š~¾öøÞ‹ÌT6‹6�?`®� 0�7��#Kb sOTB%>#*#ø Ù.Áej +^Kè È_pü@ßÅÛAêÛ³¯¶ž¢ß`Îêìš=«~ÃËY`ÃáÆkm{Ks`vn!ô‰¡g}¥�%œëkSM‹¿Óìö •gýšUH­G©qß$žû—+‡-ŽÇ}`€�9z®ƒØ?͘žò)ÒvMø%_•Ùì�cm©t{IjùùfþO�û·’îµÁOž1ÓבE?Ÿ!”+�+•íÂ$"O²þˆŠ-_ ç½¹hàƒÚL¦îùñ§&z“åŸwFÐxOcâ¬öÜõƒ´[¦!nýÙçÁ¶ÖKô|K8ñ×<žóèãGË÷�JâÙÇYW¿Ê’³ $ÿ²M~6a¡…P¬'ˆ—ö§VºOÉo2ÝÀ«¹ÏRÞÈz€·)0.3Pú¶&K\O°êÑìÆüQZÈ8á¾¶ÍÄBXÎ [8mã|�5úìËEzJ±��’Äà#²uÏè#nzöKÛÕ�²ÿº(½ &|Vl¨É[)Æ�ÿ'>/Õk–ÉP‰ûuS$ä®…ÛRëì1ÀÁè>Càf"¬§ˆä4�Ç�Å.–)]å£x5ÞNŽàEœ{z_áwC9£[÷fã :w Îõ>Hé¾ÃàŸáv°D…“sýg}•Æã¦Ïm¨þŸm7ŸàØDÑM·ù‡¬@Ýç°×ÅÉ$TŸ¯,¸ôìMMæ¯-œ¯cg±¸eàL}Miµ&&Lly`ELi~Èž–e›í°d:`ÿ„-¶K+¨RÞJ¸Ð÷qúöéX ÈùÜ…“ºAãŒó¬ÛØ!ÇÏ'GÚŽ°ÛZ \<ž�0‹r|þÜgH•‹é¯DFFÄ…â1„ 8Á@–Íqjãá¹s\3³—,Ö7 ¤¸®­\Ët\æÇ¶ý¾Iì Èql ¢+ùÎô=̰Eÿ/�mZ®íéâ»Û„�ói-žÄ#ÅÚ×:¤w2~GæÓaÊít…fÕkJú$‘Di¶{¡�Ó"¨£y&Íôtið(ŽëvmK  œX¶Î]dž W-…¶›yvròÆ×xk>±Î4À¿Ø*ÒLRcu oƒG ¬ [Œ1kÝ(}*û—·t9í&6núã['Ò�öààY�6¶ÒÅ-�ðØ-áà i‰›õ³èë³Ø–É#ðÛ¹6�Êݳfðƒ�EGšÍ|ᑲìÃå燸J•â07ؽ ¹W>¼{äSÇUJ<“  �\ZQ1Ìö[‹°Ï`i¸FØÈol„)ÓÒ³+^Ôðêéúf“Þ„h%üZ•d!òRfÑ©ä ld૦sm .®äåOòó¶ãN,Å�ÉãÑt«“4àÊÐHˆÕëê1òXÏajö`¹ÅV–œVR–Áæ‹Z%`$;Ü„Zè4[¯ Ae�ˆËî×[’¿ß›¿ÊÜf?|÷oÓ+†GÂà¡­�‹úß:=2Fû;ÞÑ­ ð²‘ªO-†š¬þŠÓf%ÁY5MoFjÙƒ¨¸Y¬ÏvZaË& øìöÓ.ŸÉI€…¡NÜ qp=gç@ÃÁ[CÃYhröd;= Zjµ®8ÕÂÚââWÞ›ujKZùKho‚¡œ�­Zõä²ê¸ñÇç�¢H #@_ÄkgØTeãÆN¤ ŒÆdß`†ÑÖ|�±aœÝ�BÃ�çn$û‡V’\Ýöç×¥—µÎ©b‰Ó–°‹Fé¯[Ø×?Òf2ï4YCK �ÛOÜ̱&u ;tÀñö`�Á,g ä9 ”Xã‘¥šJ(ûê«q�µ8³sÊh_Z�‘Lrg‹jöÈœö�ð”Tá'ÜÙuR в�®Ò sMõj`L"ø5<¬€Ã1ä ;ë³S4ö8·®\MI?c%F›�‘.cÊAÜAMƒ}¾Ðò–ú§óc¹ErÀ©¾L&ô¤®Ç Ô^ØÇÏ »°G1øqq¸¼�…É‚e¡J Ì'Rnç¿40hõϽÖ:Ùçàñ`w׫ã–HÁgMòã /<þßQ¸‡éÛ„ %Ú^³Ãüë†m.©t3äáÙ‰ëÛJe ;…¦í@˜ •�ïÎC7±ÓF±«<¾PU¤±�˜6˜¸Žø4[cÓþÉeIk7@gÖ�C¥zM[H}MaåÎ~l¢ŒtqìñÃw�ó*twDÛms»® WËÎÏ‘4V5IÀµ×oYÃXù�Rö‡ ;ë%× ‡ÁfÖ¦,x»ŽÞR}HwèqqÒèQi ´iè툃Pâˆ×T|òä˜ÁX«"‹Ï?ÆÀ Zü[k�eÔõ e±RÁ]x˜X�­·d¶ßUàShC˜³”½¶)”úPõÛíÌÂ÷.Á­×ãó 0%¤.<¹pd<‚WY�†Ân¼kB=„1ƒŠV£+bÖ†Ù`\f§ØWüâðÖ !÷5©™·8C‘.~ïž'é›{ÎýôcL}uÁ^Ñ�x¡:M=Ûáâ䛃ócã qå�Q®P8þ0ÍfÙ›y÷‚<„¼Ùxû±ÄŸ„!=�ÝÏd€"˜ ÖÊÁ^�Ë éÆëw °­jêvSÀÂÉÐ3€ÌÖø»šÖ×(�‰ÙB…5a°fÿq³ô�¼ó…íÌ­LV„8ËÛäfHuš£Õ®îŠT7˜8–I&²¦aŠ‹™ƒW®z®¯Ë·5œ^w�Þ u…1ý&yá—R0nAhÕÐBqÔÂQodáãÍ“ \ ›Ä¿1}]øÛŠ— �¹âÛŽs³ZlÕxW/õ¯k¥¥œ80ªµòÞ=C§±¾÷ãi·Ë;?�w€¯JosãýYK5¬¿:8Q¶u{·žËÝ¿Q ®~ P‚*.aÙ³¥‹‘ea\_‹ØåE¨²{< k·5�ÚË„—Cõ²uÖé‰ï¬¹ƒš�¥– ¼p% ÷xÜpƒ�aŒ"�H„¤£x4gÆîù$Á‘²– ¬ï¢0sÕp·ö°ÂU`-pÞ…l7Ž­ùÜ>{/—ù)k¸ teF b\r`%µ°jI~]Ê’O\—«íü~¹r.ìá¶<¼¢vc«ªöfq1¦é ›‹gžŒ.ýÒ—t�Êje%ÇÂÛ‹MV{Aê}‘j¿šÜ j×>by¥ôÝ%”pý(È·ã¥&G±)MsIƒ„•¥#ÜÚkÃwZRÞöužá¤¹ôcÝq7¸�H#;FLFï�¸Ð# öª½D…Ö-dâîË_£âŸ­ƒ‘@±¸â€ 9½¨7*ØeKÂZ™K ßz÷îwò…)³¢ÞXZFK:\Ó¥`ê|œJØÀJ.–:[æ�kæ ç:±¿œ´•ò°Ñ`˜+¼ßKðƒFC©Û‡ÃLVŠAéÜ`ñm؆h¡‘4ˆ?{¶,ý÷2ZC2̧؃ ^™冣Ë>Xd±Úp+ó4vÔ 99öžÜ\{*p£k±ü °nrBÎøÙá’•s™øCm7º°×ðàl†9Þý˜qþ=Dò¦ü#B+oñ�И–CâS·n|éý ]L Ï—<^¨ßYå19êÅ•ô[ù&%ÿe£¹Gƒ2MFW·„> u~w9 kTåìãÚ{M¤>ç#@ޏ2íù›²µNn_a‘,xHÞæuò˜¦ÃœŸ×FPjÍÆžwyg�+[›Œ~¸ç°Ü›öÒ”WŽÄÅ3‡ðr.Ådûí·ž³±Ñ*�­6RÁ[ Ï}´i¶Âòpª^ÅxïeŒ¡ZicØ…&‡ÇmW«f+ðp‰ê&Qß��eLŠÅZ â—öžiYl§ ý”¶B]„†’�ð_Wg¨ÖC��šêÛ‹&Òz‚ÙÇo4¿Â?Zá„-í¾ZÁGy¾U÷0¿ l/ía…p’)¨K“"sxUi%"ç1õ¥ƒ™Æz Èå¤òÝËlŸÄV쌪 få”´£Ùܯ‘C�Ъ!øÒáŒþÕÞ÷äÅ«b÷V•¾ X€`¢ö»«tÂN �Ô–lgb+ùâVcÍ @~sEörlC0~Ìf“G\ò‚tŽÈs_Ö+è*ºK…ÀÉSNûŸyMØ®J6U)Bú–çÙBDëŠÍˆ�ØÕâÒkFKA¤q\ÅàK¶ ±@/R“òç#Î�c}/-®TxÃQÎç‘ÓJ¥Iù_N#q&µï˜[e‹:4¶²Ò–º‰ìHV»LVü�K*a.»¼Ý˳O’„!ú�)Ɔ‚ƒ7§L�áËõZ_Û-½(Îñ¦©ƒÐéBv •¶‘â2œÈ·Á»7² ™GÛo ±´–×7°M®vâ7Ú=ıІǛ}ýS›¸J(Ÿ¸@Aó@Å+= ¤Ã…ƒâR(¹.~a ¦ýkI _åB9°÷ë ,' _c¨¿ÄC ^â(w*µžè¢LôÌÁÓwTÐ:’²Ü¨^¾¦DÙãˆgãÑk™\ßK]ûÞ`é§¡µ> èÐz§kk^DÔZ‹Þé;?¸Ágc™·f³‡xÕŒG¥ ¼5#t> —ÞÎÓ÷½Ä@Ù\t“æÛªÀ>Ϲ¬ `ûc7áÌYÔ|Í’ˆÏtâ[ ^ü°³®±Yá8G£ŠKÎJ·h„‹RnÁ\ÁZTk¹{½¬Àqͬ…`´5mµ¯Ûº%g4|»íËY褺÷m¦èöü½¯çºû}nZ{Êíu¯ðkõ޼0ìD!@ x°[íh 'X·ƒ™ô… 4«žVÊ='Óä£Ð ¨­áŸMûU…ös¹ –Ý‚¯~ou½¹õ# øžX2¿5AÎ~Uöœ&ÿ!e”þ,QD¾<æ>6Òà«ò[³r` CQé…&l=øû/4p¦M'L`]%‹à|»Da&ñõ·›˜x·À,±w/~¸H»¶}ëì-Zk£�ÀÚEÎ,¹êúF>\Æ �(=úV¯ ÍŠ@žÛR�\-°�ë±b‰/¬6²|׈¶3uŸ$6û‰·˜ñvrn‡ŒkÃ’šCyRŒ§…ÎÃì4UYóø‘ñ³O¥ðíÔW}”(eq|òZUóI$sÍæÚLfÛÛKàÔSöÈ $%±Ì0 $fƒ œÊ™@U”Àº‹fsT×zcå F\ŽMƒË™Í6U¾Ø‚ë&ÎñÓÆŸ$X’¸¨d²¨wƒÔ‰}Jí^Þè,b±õPo§Ë$Þ¿l"i0¢öUŠF†7z+äÚûα`Ê%ò„LïÁÓs•øø6@æp¨ñlÝÐ…¨ ‡ð|âYï'>{žÔ_„è½´È[ø{‡±îS›Y‘#¾k¼²‘¨cu‡3¼_Þ ëe ~Z|¥¤ù“à ÷‘×RRVâ¹~U%ÇóªW$ s2`Q†æÿØ?3ã¼�?Õ1¡}aÏÉŽôÇHôáÓqóu­Ætˆb¾ŠÚ–[Yõ d!5~û24 Û&ÞÛv*x!Óò3±NpÛ ^©‚ÿZ0ší“‹ËôzCõÿElCíÅÖ*ù@Ù/ô<ª.iíŸ!Êcø6omùd+ݘb›2ိúUuQûÐé>;ëtÕŒ²™uPÚ,&ìÙ(S¤�ÓÛÊq1ËÔo)ŠI2*S�)øÚƒ–ØBDé^¹m [Ðþàß=~=v uc$Lõ{΋O‰7Î!@m²A Ú§^�Œ—ÐYÇÄö©:%ü8Ïcû=¶Ü/Ÿœ4+�\º\~±�fk?L%š˜Imz�¢/ðÀ�ŸvÅ ö ‘:šý†ûäH±‹W7TÁˆÌ²•øÈ”6¡„'øø)eDD²÷¹`Ðüïl¯cÆË‚¾v&‘îeèQB÷HeÝ# ý�Ÿ‡¬c­„âö ;îùM]Ãú÷`^éZúÞMƒZb9RÈ>ñ€Ù )A%h\w„z¾Môô<”!r¾‡OµZ—å#0Bºá›·mÂX¤ z™0èÔoÕW¤Njœpa×Ý](DVLó5e„C̳P�¯†-³Î˵oÄ�Ýir_\-U{ἤ œ u¦|äw½.;[à8¼ÂËr†˜K �|<†ÏÙÙ�'Q3+pøU½Š—àTûØý�ß¼|pîîµ4 k´ÍàX½�ÓË:ƒ1XyZû“z¶),âÓ¶ð«P�ø*á2ÙÇ›³±«^Áî²#7!˜RSPp†·›‰™»ÂwÅÁ\ì„„É8;ñžÍ‹%›Ú½DdL�êœ�^Â| K3d¤oûñË_…ð¥}ãø¾¾:.ŽE w Úœû�ϳ%ÙÐ\òÂjÿ^šÔ!s”3Å•œˆŠì3&âtêЮ¨IBªv¼»e`ÆJyÉØ$ˆrû£µRžkáìNÂÿŽŸ™<ÕXÎÂ%„T¿¡`/mÙÒÀ÷gPÈ'Ë3`I…ñ‡—íý¤÷ÒI\¶3�çÒÛÈt0ØŠ“@£OoÞöT4�®=g–Ó;‰’)íSh¬Ð\]5£¨øL›æä�ÿq,`ÉHʶà·ÏÁJ ¥X=½ÿ¦:^Å8XòXãdûnÖk˜Ÿ§xøÍ ïãu÷ìõ0 …iÚŠ¨Ë½:Ø}ó/,à˜ê5ÚÃ_ÙJbÀ ,Ž"ƒ5޽m#JÙÚgÃL(ŽfÊ8 ­ æñŽºÌ>j.(-q½iÆ�`?œë¡/8ºÁ \ñéaY¦À¾Ù—�ì‚zT¢ÖmäüÂïÉÏ}Ãèvñà,Ú÷èÌùDwóN[§Ÿ;bá†9ÙÖ êâu:×ö5 Zr· õÇ­±ΩM©e4 ©v˜Lp�¸ñ×¾ª×‹ìh.Ðá†àÌŒþ¤Ù ºWC’L“Ô&§°Ä¸¥.Ó–ë‹ÁíÈ"¥ç1€ßôÝdõƒurd‰`ÓâXkÉ1l"ÿ{µƒ*¾Pã}+fqcwâfì.öíÍU¿mŠæJÄô1�ÏRî½põõÓ*_ßPh�ï†Aë$ æõE…QÚ{¸-€TæQoå(‹¦d³œG^ܪÈY5Y­‡²�Ëï«€cäÙ[Kù¬ù#¬¡e•WN¿Û>Dr„Ù_/¬b.Ë'¯‚èÈ™ ¼_™c‡>œ™\É€B”ü»|�ºÙß/Õ1Uë>PžV4¸f0‡ÑË þRÑ�@ùr²·§„Ѧ—ù)ï½Þq˜Îù;ÊáœÂÓŒçL¢âçÇOœ ˜¨;#?°¢-¸ã©ÐÜ=J‹ë0œY:Ùrޤ,5<�iì¡„/-[F¯fiq›¡ +é‚aÌ—:ÁQ,F‚*Epèªeø¦ ^]eaØ”ÈÜÍ$�-Ê^ –o´CˆJ°mKpÓn€ ë…0Á°M.}›VO£�°ÜCyî©°âü Ü9Ì6½Û%š¸)@¾ø<ÛH:'%AÓ†x�¨‚õœ~ì_ï¶–dz]U·ÓkH-Æßnf°«Ór¸ 7âšÀÈŽÆýèZª’ˆJ”±EW#6 Âû�¤ŸgH¿/ÊGV®ÂˆŒíF÷±mrw èuÚæÚ\‚9ן ½Dð:�6z[‰ïS7赤4 ³ª›T›dµyxÈák›� Õ¯V}‘émKßã�A¯éÆ2–X´¡ùB‰êTfÒ3ÄÆÖE×ÏãC¿gã}âBÁç Ü~Q+µφ‚ݹ�8FûÜXt,Û]P©¡WûÂ4,€Ñ¤‘¯ä-ÚÆxŸ~!Ñ÷jž}54“� H’�ÉÈnÖH«ª #JyîØ‘ŽãçÏóg7}3cÊKÖnˆNP+Ö!Âç9OyÑ[\“PŲ{Yà7‘Ð-¨2íy=¬`€Ÿ?‰¬[N“ nGä|‰?%l«g/FÀ€4¨é. †šPÄn'ó¾§t¬ßÏ-¦œ´à™çÏ;Ãd)LWµ” nàR9nÛl`nÇ€X}Z1VUû ßÀ¯`/OW  ¦¬a§Î”ª± 4¾n[ÏÁk~Ѱ!<š~5uîUúx†HÓû©`z0²aºéÞz$‡pż>çÛu¡7”ID8e:Ãý€LØ›oÁÖ�bó~&ÊbÄÖ¶w«BÌ ¦ÅÍ™†8éòºcäÌ£lZ{…aÖR®­n×Vè­\±”ömÔ [øäºìÜ¿¹RÍ5JúW†âI¡þs$E�ž˜RʪD&ÁkWÊçÕïëøÈaîæ#tD_:ðëÆë]Þ¸*È—Ðbu9 8Y°¥˜ŽÖÀ.ö¦DªÌ�wèæø¶Ê?�Äë}iÇšáïoB‹û‰ÞùŽç‘„dì­˜Óf”›OYrD’2sê¤Fž‘Kfµ‹óWü"üÖzàêñŠq…4ºÈyÅn’f»Í+Éä ä43õaä´þ]¥¶ØNC�Ü|ëòh—U.°X²®ŽÏlD`Ôpß”:¥}Îê•¿›.0âÝZvÈ9tBèjRmþò,[ÃAðCŽõ'Ü Ö�>L ñA¶U¦w ØŸl9ÀîᮿgÆ3Z¯VRFbÜöç›±ã¢7ëc{~”—9A9Û†Ì(é0Å© ð¥z“�x×rEt½aøÜ±š†�D³Ep¸äˆº‘ÈláºÛU}òàÚ¿E>2]æù"V ¥.¿Ëò` áh÷Õ½Ž!�Å­ŒfÃpo|ãQ»=„&«›—Ä þ¶ÛØ=’@frœëÎ3_HJ¾;ÃÏÕ õÕÿLé—ûûãeU^ ã ¯ïã¾A·Ñ\d1ÀF‚ÂE¿BÁHìßßÁvÆ<]ؾö–wñÚ &Òï‰Í�UðvÆ€còò×V7²:goãGœ¥ö†›‹�ôÙ¬XM9&{ëðƒ“4A]æIšÞBÖçwoŠS`ÆÊ$þÄh�€ÿ ‘òëäœ�›Í/‹\,» ÇÃàÆM! »R§l¸j}\ؼ—øêcüøJ�1©¦ NV«½ûËXÖ9¡©gº0óÖ®e ë¤>Ñ”N·)Œ=>/Çò¼1èožÕŽ69±–Ç®¾ls¿wáÊú™ñž±ÌÛÓX_­ÆÇ¶ÿ½u,| #ŽÓß~|ÌEåÀl1‘,zq­„mW½3Ò$øI­4¬ç÷µ;÷4{­JÅ¥B„ûÁô9h?¬¿rÑW±¶ …}MӜފ´9tðï ×¶÷ ü¢õw®ÌÙIÉbÞ}5,qAaÂűŽinïiæ¼5úÂÀߊX»ÛM\9�göŒåü<¾ö9 Û¦Q£Õ'†B]�Ežûì8¸¾vÁ¾±|8 ×$2ùtNkÃ�Ú�ä¤×FKÔ�+Çž‰XO@|�u{¯ø¼´ßìSø˜áhRÞWLñÊá=êÁ³ÓàíD¦öNžáïøAJ-ÀV‚âðñÉO�.mø?âV®¼çxK³0X>_2.Î|a»lñ&c9w¹çt.µt;ÃZnAÛÓV »z�|‚S_Œî&.J¼M®ñ:ÚˆóŽÌ7›éÌÌAšÀ¸ˆÄ¸J&p¯a¼`DîÙ!‘»È¢6åMËXí°îâ¡q½ç‚[ÊÔ0¥۟׼�Ø”mKãë¼Þ4{†dÍ%¦-Õ £Ã–�ú¡|[– :…Ñ IK³¢Ò»c€¥ÛÖ1†¾Êô©lÆRºÎ‘»M–È`u =ÄŽÜÈGag]_.jNxÊ™7x#†²âà_¹beÔqxI½Ç¶Ì¡À´ÕKiðsn^ç½ÅP_0W§4þ±¸Ô‚"Ê@ÊÞIP°n:Ã08“ú¶òLÛ†Æù¾®¹pº'ÓžV¤I÷º ^GTö+¨¾Ooc&b=ç•]¢…\�l¼u¾i6ÄÚ¶£LÃAêU5o±Nóyã§£ŸhÎô mÓ Ç…ô6¯@nu½G–¦õ¥ë#Ïg�åäò ÕÓL‘#dˆÓ]‚6júlо ƒl½Ç(šn¾‹¥QÒF£}½R•�žº¯œè —]ËÞ‹»b±[« â„îË l¸9ã½=sݧđ`§AgP{yW+€Pµ-‹€*ú©”{`S>ºX°jä}|Cv-ÒÝs­oðîí´¬–Ïf}fÞ3Ä�hœ_-o0@öˆfŽo)cߺ¦‘d�“VÎ8wG€}Rଠ™ÒÚ®ƒûgΪ+™'WÅûšT>¸íÖ»©¬Þ 03`LñµaÃ.zÀš›+)âò•ÿ[;,­B'%‚Eï½ ">Úk´?Y�Ù^™è§½é'Œ¥Ï8¶^‰¢6ññÁ¯„Áµð $­:F"é¿j®ò„û›'‘ô: XkdŒÄµ8œ/>…ÈþõìòCÀ!¢\¾’÷ò­d\/u6Ã9ÞîE‡¯/¦ãLF-ÂPµ–Е=®Ì‚U¼sÁæ-8òÀÙÞé�6%)ÉŠì\ÖöåÝ¥ÆÐK�äm.6ËÚb<¥˜ n”‘–ÒV9Î[v¶Ã*št– 5ËÁš`©~ƒïÎ6"¨Xå\Žõ|mƒìIIº�çjãÊVʘà§�Ïü@?t£Ò„c%ž¶•”Ĕ˽Ñ9˜Ê7ßDC¿ ²ú^Äœ‚„gNŽN "¾·—êÕ&DÎÈÝ&]�£¢Èd·j}t·d|a²!¾ÆÞæ�ÿ—]äé‰?Çt ÷@´Kfi�ñ —Ðmm­b÷¹›`°ÔñxÌÉ�Í ™ò!ïS5NYyTÇ\@¥H^ƒæJß-‰^ ¢utÄ^}«ð€JJõ¼lrJ×ÓYUÊ�²Ø«rì£ ã³‘Ìm².†r"8­v»q e …¨Y=�B‰gÎCh§@Ü‚ÿP>q‘6øŠ÷*Ë"NðÔ‡kZFæbÎíS/Nä DáÆøºm°Éy¬µ–ö4=#ÀÕYRÄ £k3¶{|Ì%Npk�‚ÒÜTîä¹t£,áæÌü£žYCŠÈqfh¥•Ƀ·Ä  Uq<@?œ±°‡ \11ë ÐßÛ) z¾ÇI˜@4㤌ÜΛÏ©":Û÷rà= Gˆû䨕fNZ �Q.½œŒàh8áý”ýqßI[ÚŒc§Ý›Øh}לe’ w—a>Á…�€ü/Úo*ô»å'-ÆÎXO0›Ò61Œ"{=§g èŠ2Юf�æ›®×·k�H‚æê‹.:p|±€©¸¸+ ÙƒºãAý°ÓÅ·žÎ¯ºÞÑŠ­„X�ÀWâoÈáÄé ¤aeK!¾Ä¾Âw§û‡ÖÙ-P¯ÌVÛr²á‘‘7u £=ãEå<ø°áaâòªÏ¨µÁ´Á[‹÷ 4JElsDž Û0ŽCg „ öóѰì8{õ0û ÈY •†­×;7ëJ ¬™ý˜y–ºŒ†ù<ÐÅòפKÙÔ_i7.hó�:i¢\¯,DÒB{Ѷr.ÇY'Bkà�ª¢3ÒÌVÂÊ�Ì: B[)úF ®½ ÓS=pyl^¯øÄ¬žò¬âÆ™ÙGž†ÈªsVÞµÌ×C•ïa¼ÔóäB8]äÊ06L6¶Á¨ß’>U ¨}Itý¼‘²­ðQ?ë\7Ú5›dà©JÁŠ#AMqñ�=Sýì^¨à�5p$Hª³-)j¾�3|ˆXø£ÍÇôÞ7Ÿ!àTåOuŬ„ßmN5&ç.†ó`Þ˜üMrCd³™sNòï:\ Gô«ý%ËžzZÆ‹Þ% z‘DKûÊ´l1è ‰�Ù¸cÚŸ_×±üw¿YÁ)~}K§˜š~>±BøÞtHÀ¹ÛWx»jïá¬T·ðo•QVéjê˜8|·³eþÐdT»ëD”g¦]—“ó&6˯§õÍì¿5ì²ÌÎÍU–=½ %C/%­G’ÄF¶8å¹¼_>[=0�Ž{Ðè¥Ójð鉻)W°›RÚØÄçë˜eÂ6Ûg­Ø´Å€Øîû5Ø#@·E|tß]Œg±±ü,MëÛ–ü;Ì‚m¤�ø¶ÞiØí�ú< ¡ŒÄËñŸ'a`GåŒNo­üÚÖ¤!u—í»ÚZ5SNgZ&î¹X¸šè±ûÊç¯6*³üv—0_› â£�[¸KŒàìzûso�)^×–4{lh+’A±kÑ«äÁî÷G~?ÊõÖ¡·R¿]. ¨Úó@K<·õR+aÀ›] ½®6¹„Ì;w 71¸…1Ãc÷}Øó¬Þã\åvC*^ÑŽçzNiÓ�óW‚ÞØo¯ñ$gO�$.]’µqâA¤*±‰Bø#Àª KÈ DÞç!A¤�+îxS† ¶yˆ@ArJ¶ð[bàB}×i! ƒ/mܹ%Rdj„ï{\`-›Œ@=‘Ònªã~IÌ«â÷ÛX£mJ‘Ó(ìÁtèD84ö Þ²TqT\@8v¯>I vqœ+]â8P»Ø™c‚4È‘OHܨdv@Æ8é;ƒ3[GVª‘†³B e"±žÊ�½¬ŒeNƒ2¿†ú#ÎŽQ›>úç¿WTÀuñ0_»e> „†Üú»Ê.e”ˆâÉ‘î¾9³¯†Ù.ÇVÌÅ…l›º _>4k ŠÄ•éÜ!T ;ƒ „0…÷»iRZƒ—dž ¥°0Àh\ ƒy:/è§±eôgö³• ¿®äöÙÑ%ÄvËÈhðéä§gtÏfë›æ¢ÝÀC¡-2ý&—(Æ5—÷Å0Ñü½ÓÙ:Õ¶,`šÇVx€›¢A{ u½Šá&ZGñv?€à!½[×ð!ƒ�}!€`osÞ5¯ å¶û ?gcdÍyõÝÔtX»ž÷�¦-𠯍–ÑʗثЮq»ä&ã….°]@{÷ÿ. 7Î0Iç0¶N]3€…¸$ÀLž{Ú ðwXöJÒb¸Á3[¦¹Úô{@B:EIñìì •ŠkpeD î—Ù!ÎãšiÚZÍ7=÷9—ãµóA ò¹Ž5}ã¤;/×!¤¹íØêÎo‘›gyÄsŒ…EØff×É4]º_ G,ϳÊFÁÞå^_ —•t^>f^ÏÂP¾2HRý¤óÊ…$ :°ªÕó×EG±ù¬¾Ù¨e„íw„h¹èu¦#¹Z‹Œ µáŒéKV¶^-~Yõ®²$�¥Y¡gF’ H�ãýr*I^�ƒy£¾=°ìš½vü½åõ6¶Á^ÉЦÂú´„ÉÇâ›-~‰·�/ õ‰/ZëR¶ñzú4,Ç‘Ì`»Çf’•\Û<"�ÈB�î¸×pêEkòY‹ˆ? ›A;m` =L žpìC7Ž÷yò¹EG•fÁÓÉ÷äû Ðü@î±TnýœùøE"=k!ËeÜf–Ö} œNJÚ Nêv¬)u‹²X_KÉ…�Ô§Ä$ ó¬JìZ~Â^ø§ˆÕ«¦xÚ%Ã'8`¡›«Î‰F®äL‚Te2 õ·/ga¸èàØ �¾´áVw¾ýã)3�i„ x~Ü9_!0²ë"$5‘½¶&Q€BŸavU/Zw!¾o‹âïHóÂfõcR'ÿˆ*ÄFvùŒ…V>þ[ZzxòÆ7{dÎhE_õ}—I�ð$-[{¡Wõ\+G_ uQ8{–;;8ø�X-Y£'ñãã:ÄR’Ì’Yß'We¯¤ópkj×Þææ]L½3Âá‚FËCé1:èƒÎ €ZöÙh˼ë¶k£Åߺý×Ñí¼ùÎü}3Ç��’¯†ôG}zíØ{}ޕř�öW9îne ¢u1l^;†îÓ½lüöÓ°å½’Ɔ° ó§7Í—<éValbÕtžaÕ™²º.£¨ž:=i¾BövǰàêlÀ§™‚j, q² xQ†RˆÝ]cZÝoA�¢Áp(×ÏGqmW3õCàRÖØ0÷ èè çÁ j÷äÁY‚U܇›ÂØÅl%t ^Ì-èUùZ ЭÌ^@6˜5Ha7íeO’GB[ê`õ� ÇÇA<ùÿøç#18ü‘b|u=`£UªÓõËh_5dfû’b¥¾. 帳.GO:\”‡ \éÎ9–²91ÜŽÿ¶ÈáÈ%¢ÈzUÃhÆØEú¬âZ—n÷xÜ”cT�R´ìHÄ]%< 09Ô])Lrä{(k_X¯³ÓNRýÊÍh‡¼5¼0Ýâlº6 ´]£ìæý Ë‹³tlÌ–ëï€mTèªË>"¶®I„Ü`Tm=çƒ/ìÓÔ~ƒ!·oÕQ(…Eîb¡8*€<+Ì‘±ÿRã,æ0q§(_dRÛ~]íÐIJ5�ò4*í�öÛä¯âæ ‡”´ªãf2‰¢žR�„0Ùž£»Xö.rXçʸäý<.gèQVr3ˆ(xõžÄh¾¶{0n™]9yu—¡ù#Ì!|WÝñ#öÙ+?÷®†ZwÊ:•V §�½~=Kíyd �QU�.-ºÓ�ÆJÒÉôô$/¿ ÖÖ\óµö'<4º2ZÉ{&pÁ® b°ØP—Ë%/÷ ‚!ºÕðÂVK~AâM ­_H�»âèÕóŸ+ŒÕÖӦЖCΣn:‰%nf0Á¼Õ&‚õô+v³ÂœP³ÏZû×gk†ºúT"è8M±³#úZóKó‚+^ëÊ\»;w %¾¼,ïò?4 ü;ÉB�E¾yÌú~‚V!švÜoºo[ÃÔÐw–lè4=iãYí­k10XŒ6ˆåy¢�Bm\ŸoºLÈX~¼‚Rø·Ë|£Ú>*{úEÛË�·ï­áÍ*Í ¶çtˆ�6kŸç9O§LØ +Y’ƒXŒh—>c&á^¯5Z¤&ê‘$å/ƒ—¸€¸=¹¶wik’�tW2[,Òb,áQÒЫO€B Ï¢A±G´—7K‘�ÃË7�±p¡°öB 1eÞ'gt´€)nƒzíÏ]ªƒ¢Âábå­6Ã×?ÍëºÜ›/¾ ?ª»§™ŸÙÕ~ìçužVR»›B¿B‘"S ¸šaê);UÞ®PÝÉ~Þ³t©céô�÷ìû߃ð~ümÇdðÌ!¾ŸN98Ú«Û ‹;ƒI~¿A9PY-áŽ~_Säji7¶EDÕ¶  x. âÆlVÉ¿Ž˜B爄j¼s9ïUàɤ¶(mhçѼƷsK&üÛ@amÓz÷”•}ë½á¥¦æVº‹pî[dç’R‚ {áFSM¡¤}n�Ì_g¥ÀRP‚‘uŒå‰2pÙ¿£­îác%%h2 LFY œ€8¶e-÷"î*“(K]£ÝäB#àÇ@üÉó_×›xzçT<óxåý�ÑÈ Gât=™Ü*ß+¶Wò[P³Áã%hAI§p]¾Y-!‰½p¢S7•´ß{ ŒKnlvÌÇ«¥j¾Ô‘ËM¾hÇ€/¤?]“xâï'k»e(†mJûQY ¶ ìZÁ4¬²¾ÛÛ·®Öˆ´Í®º ö/ RëýšžB4Ñc…@é´&h¿™·Š®0)¹¬Ôhó³ÓÌ N^[3™!ѽ™kK‘ ®³LT!L¦q6à\k‡…Þó’+’ïMw‘QÆÌ-9Ë‹cDˆÂ‚Å“][6ïbòûîWM9.bÁ£V¨ í±ÄSdy–M•TÃ(L‹•lj]-‰qç=´À>È-f´˜çó•÷¦@éì‘´É9RlHº`[ -$²­å…ÆC7Òiœ †Å�c:`¥È‹[¸w™‘<ȼQ­=qv1wàGòÛ“@zåF×ì?;_w¸kÚ•*‡ò‘/O Ž“üÝ�wPÿ VêË{dħèÆãÇ2ïÍt/öý”ÏdjþbÂúá§±Ät U.Õ÷Àíllq}ñu÷�aŽ©}Ë{H��M ë]f !l�–¼PK÷FÙQõ‚ÛóôiýN‡{ãR´© <éÑ[} wåOMô¤“ï¼IxF Ú{ /ë^Þ\}~\œ¨÷n�À¤'§qPyÕ�c‚ëò2—ú Ä�€°˜à·½µ8¼–êCir˜=�_ Ä‚TïÜ­3>@k §d$�•’IÑcÓÇkY±¼‹JpU2]Þo !_÷ë+zj TBØ#É}²‚ŒQo³g ½Ð6uÄ;ú´èÛÞÃTì ésήˆ–çÄŸZUÓ¼–“msËÖÇÇ倒à _3“b*Ú ¿`M<Ó�þ,朅ÇD P±»c�Y¢Íª·Ì�•ŽêD!�Īttó¯†Ý¢Û 2J9l‹N˧ Û‰»Pu�±šà§ªÅð+`·y¶=%Ôl+q¬ßüðÐÛÎ •n/ãî¾Ì¦‹yY‘«Ø7Û:ÞIåL®ëEæßž=„Xc+ppéWg�9ø¨Ã|µ¬A^Öï¶ðNMq�¾´%¬qJÿN†®�ÓiÝ8è–B;’³+tAyî�Ã~×ŽÄ ΡwÈ{½p+5®Ÿ°"Ï,Á4ôÿˆÁže·¬3’à}yŒûàÏg±×·:ÚÞÇg_–‚•M¹�ƒ1¿G);Oº²�àRÀuîl.;¯™Mq1‹/ÊwšmG8‡üÖeš�½:g—n¥‡@½ê�_eÝÈOH× :ãŠÂ-‰¢Ðƒ”ÂÛ÷°túÀúT›ºnD¶ö\Üᘗéí8ÚþFÈfþÒÂf¬«Içk–ƒa½YU„+‘»R£Ú¤ U¿©«ÙºìFªð†Ø¨Z‚Õ¸&†Ç»›{aÄ'ů+n­ùïKp;ΖD]îÍ2ͨ\Üä&ˆÜCvd¶÷¿È»pn-gc¨¦8}¾.}ÐóÝÀZŬIjæ0¸#” iW��ð-=\N‡˜o.λe;=ˆÞz»2 Ï;Eú*Ä éê ï]–m…u ˜O`ƒuOÑoºœ¶WHÃéƒ%Ë›rÎR^!{nDˆsfáËÆ®Œ‘Ž£-«x§.kä•„Ü Vjû>Ø‹âŸ2l¯Â’-óÔ5±Ùu·oº—Äå-�«ëß+§Ð½Ï­¤aûéôhN¹›•Ûʂ�ã(äP†=`DÆs}¥ïï—wúQ(W9&–5³’üÓЀ> ÁÇb,©`í°_‡Q·ŸvŽÊùÉ@ 7F`|-æì7¤.cÙ_Ça¶"+"ú0êŽÛÍÛU뫯&�(^¦^E´‡Á8£öøýz+£Òó<š¿UFBäxëžQñ`?¤'%™ËD&ÃQĵb.}³·\{lŒå{Mu�ëSêIAæG㬋¸6Œó’«yúÍSÍB ûãÏjb¡Bÿ¤•5##…†œÿPck,)}{Fï”!=¼�Ý 2åW�â>7çUÔ°p™Ó‘y‹¼Þo¦�‚–;Œn.¬¿grÜsæÄX±Âåb�íëZ•…mq΃&ä l…ÖC­mq­ÞáíºU–Ÿã*ü¥?æˆÙï0uö°ÎMN§íº Låj˜pS‚åíA@³.sè)â4)ˆÇ»»¼ã�àÜ�‰8‹pE(h53”·˜¶Œ<ÑW2#?—ÛŸ²ð››Ž]"ãëƒ,°wõp4/2Ù¡¶™ßoOú¥Ô'z m¬„¡pýܼ…E-c8*drÚÚò a‚êt^ ö¼§fã§K9¼=D †�-sÆ‹›$#Y*Ï>!š¨P¸á'Ñi�}²uO¬f!$,[GêÄŽ÷Œàr%VÛ>Û³uÂMàeóª°uîµ´² ¾#Ã\PA.*D9Ÿ�Þ=‰\€ÝÑNÐF:º�îè¦ñ¥ÿYÒ�Ûsô=­Ì>®�EÇøD¿5‘ûMñæùâ]êŠá†Cç!ÁgòLí#»‡œêÞ³aĤnáp%A’Hн®-•ãéT¡æá��¬ÞáS>ÐliÄ­aJrxÙ&Tú„É/e÷?Ó–2ÛÉN3°ŸwÝ_®è¢±:Emµ�³Cµ®F¬6ò'¿C>ÀñŽ_®gÇlÚ3ÖA3B_; ÙÁàèd=|_z8Ì9 ÀoÞsÛj,…£!m#Ƈ7ƒÍdm0˜±XíN¸åø.z&±Ø©8ötJ5Î ‘ñ«°V†wE 4%rÐJ"››Š–œ�.­BZÍâH†@B ¦&óÅÝÆ[(  'VBZ¥0k¦{'Ÿ�ˆªgí•CœM­ÊÀb‡ õnù5†Ä©‰9t·ˆÑºŽ×c>GSçë²ZÌøÂ 9F`·&åE•ÀÈB:Ø42à"÷‘ÔS¶�#­=’s–éz âIúw r§Q}�CfÉ�¾$“í2ц•®Œm¦6c¡:C¹'�ÜÍ›SX"gwùÊ$˜%©n–û»^à®Ä­ ‘UÏ g�‚¬ Å$À¤ìÄ0eX_bG‘ã�Õ�òyˆZc1ú0bP;ÏUð�ïwŠwÓ»³Òµä¯±yõB@Cchãƒ_÷Œ^‹i&¹C¶Š3¿s¶¬øë¾m«f5÷ÂÆŠFM8„d«…—س™ümh¸Ø(m¬ /:œ3òÛ�It× =;ël`w:`ØççKPÁÙ*­š„`ªÏËTê‘ �‹”¨8cV\#Gàû9°QηüDÚÍ4–h5gþvw²âÛ &qzõ \³µpŒßötÊVFä“å¿è&PÞðˆîMæ+6[nÚ°Ý· f—.ôõ¿ñ±ó“Ë;AÀóÔó Z&œÃÛÊå»Ü¥8MÌCÛÁ 64œØRP�á'uÆF1¶•褼¹�9zxŸ\p´¡¯ºd×6~á–læh|ùî~$P7úOßN´  úÐwiª´ê^²Èxr©yÀŠÊcyœˆY�L5Žà0z΂ÊmA*ª!V1µ¿JσÂ`vZp@¶Ë-æ…¦Å÷väAаNút¼*_—™Î"Ö4úØ´1 »ì�ô6*'N]¼Êüºùó¯a}MQ×6ÖÍéºÁÖAvsòŸ�¦ù9éb“-ÙÊöõð&Í pΠ0d!ÁÇT'�ÓBS0Lå5XKŽ{tÛªñ¥ä£‚ãAS‹žß ƒyËÊ=l÷yÐ[ö­´ÃZe¡�c²�ø²©·¸ÓAšk/„ì6­ç„¾ZOSêØmW¶÷«NChOÉf ŠâÁ²ÞË¢z®·ãá"£w3I–08` <DßÁìv“7÷IvYøú€§oØç°›ä� �-ØSî>f²9ÆT¶)Dÿ€IP̓:®¸Ù³•v² ˜äƒ*Ÿ3gûs¸¾o.=Z‹ =ŒÁ"YT"ï‹B½¨ ®t0‹­M¿)C§Þž^dFéÈK6¼Í{ç =]'BBð_ªÆÂq¶J´M¨¯™W ox‘â²›,ïÍî¬Õ´õkYå&Õ×ç¶”ö  £r+ß‘rà±fbãžäU±É¬\Oñ n4¤¢a£?%·‰@—ó ¿QŸöå·f®w“\5¯«ZI€@‰œHú�s6íI𫦠ÿóûGWr¹¤oÆæ{ÃË>ìˆ��ä] ÷¬]t=zÐ…ºh¥Ö3íÉÓFqP††y @!1Ý_„eÙiYÅ…™pJTàE ÖP6å¿S.ìÄÛŒ1'Ô ¥upþÑà€Yx [ïÛ ßY‘ÌGVN Å-½ °@Fom¸ç7;Uu~ìöô_Š•÷ ù‹NÁÆPæVª°í•/ë2RnBá^º |Uz¹ ZÆ¥n&q¡ϲŸ?Ó¡T’Øa3+Gqqê•«Ž½¶ìùP!0c!ϵ]¤D;Ëc7œdª/c¡“óU¡î¾N˜gXk®Cá ð‡ê$š¾gÑúÁ³¯(_y,=ºÁ¦½úO½¸D l¿ÚÎE£ïyú\UßÕÇ�C¥d9,ÓÖÊ÷l·Î÷Ö¡noÒì&aw³èëPc¸í®Ú».…­»DUBë*ºÚª€µº„'³ –’ß°NPHK:oXCLW¨êpYy·s·Ñ7ªòcžeò•+o:ª0AÆ¥Zñç-›uµÉ iËÅ‹ ÍWÒ¡[�º Ù`á@UD=ÄÚ[²¼–8‰ ­ì@pãt g#}Ö¬±È"¶I)ôôqÉܹþºÞ-Â}–•œ›ú5»¯o°Y¼Ð0цBëcà ‡8ÃÖHæÓx�?ŠßÚÒö᪡m5Y‡¸ïшrïŽ)i¦Ø�þÁùSrDÁ¬ËUŸ\cÝ1ˆp¨!¤ è TÛ!�Õ?`nä^' “x½ü­®bN¬ó‰Í y׈˲X…N"©7.’n¹Î¶�Í…%¸–[Û”ñ Õl¨Ï:Éd·0Óù÷htï•tÍ‘Äf5lÛ/›ìtË€óNßÂߥMª+ap~žM БƒÀ«"OÍÁfì…§n*‘ÏQÒ&ñi×í«È-I|•à«[0œò9}øHÔëcÌka9+Y†0;ú…Ÿû¸ë «ÌÛÛv{×; ¥SíÝ?|µ‘Ø~` #aŒÅG*õ@á³3;ZO7×J�D0LÔ+ß—œMªxš8<›¯Ž¼]%Â@µ?�¦<âôzØä�™n˜ƒîX(ýdù0’`8¿g›x§øÑNÐ}Gj×ÜP´ܵâóÜi ƒÇŒÆ>xóW{WÄžGJº©Y7¢Â¹ÿ‡î‡y­%’-Y‘ÞÆ÷úŒB™/ Û6Kd6h§gCm‘ôlH×/àG³ ^yŠÇÆ�¯¸¿¢¤Ü±‹¡µ±çe´0ªÚÕÑlì­„¬Íü¨BU¥¾- p82œ�Y4³[²ã œ*.Jˆl^�ÌZ§/Rµéá@³¿ª9�g<:Hr@þAz„vÅm}~CI:YPé°DJ*<‡ pÛ)ƒ/”ËõäyÝôñ U£ †»ƒ ¤'MÆ®�§ž\Br#�Î) €ˆ)(.³˜˜ÉCQw�íO4¿†C0[¾ ?«Ïsøë÷žxÖR^¢ÑÈ®=7êÚï€MÃègÖÂÄ‘ÅYycöpj/-™pD+…£½9z­ca�œP@ nt°¦4¨/l0<ŬŠý–ü0‡z<Ï%mšËÕÉz.óªí©"NìxÖžHÂ`A̘�k¯„ÇÅNϲ¬Fv:�{/¬¼§…§x¿5ƒ¹ä[.ØüŸÃöv6§´8Ã'Bû�îåu]�³�"¨q¢d‡Q$x¥Íç8¶+�¶ô•òÍ×ëo3¦ 9y(2܇)Ä»û»ý›ó7ž^ù(`ùíŒtcÉ€2¬…·§�®Ç7AôH¨‡¿{üzЭ(å¯M“wuд+A­}Ñ:iªéò…­‹ÐÓ¨åkîüÓqÜ`…Q v­t¾µÑ\\'š0`áNÀ?JG3´#4–§¨€}XiÉC�©�}t³^âZ¹ b®&î¥lŽ ¾ñ¦÷œýí¯oÞCˆ«û/øOkê Pu×Å)¯½¢“ÛK¤G›–…ýz9Eá­Œ–užJýÏÆ«lX"vù1'ÖÀ¸Ø·kåàbÁŽTY,‘I±ÝAÝlʵ'os¼ÀÝÊá�YÎÜ�Óg®ÿ]çà‹^ &@rA�Ï•[cú.5ŽF“Õ_h'úh‚u¦µÂ䆡‹hbJâì©lÿHm3º Éü'%ö1¤È7‹Ý×n�¡ü¡ÜÜkÒÝ–m.ö˜¿KcË©ÏßÍí>‚Ç7£°v#••›Ä0ÞÜz~+݃Ý$tét{‰¢( &Á•jrÅì.ÎÀ(G³¥Èt‡~/�VQ>™fîíȬš2ã%²Îw,ÿuÖDv’ä ëúô¡} nZõšvõà™SMø(g¤X �ì8JÞ!yG£î=o …b�Z>p�s»87s¡hŠ?8#†’ÅÉjKzèÓ\n5¥ìÔÙËUÈdmÒ+ëP¹Fº‰¤våmøÓÒÂ�!ês\M¦o ”qÏz#›ççh-ò¼ïuníðÅòžzøº%ãz1�¢x`ß"ðä-¸VùlÐT±¯å#„ Æ$â²N RV{A�ZÎ�gEq&> œ¿m7Á­½~U^Åãk*ˆ]‹£í­²mìÌJ !èûè ˨cvß…&÷¦ØÇºâ«®ãèYëpÆôÚoq ámnº*mˆ,½äÒ-qQl–¯ûÁ™Ô qûÒIH. gÞÊqùz[ßa­æ5°ù0ÅSh‚gÒ™r˜´~ö. Á›~cmã  Rµž/’Í–ÍÛƒ70ØÞ‰¤§�>«G·ÇÇî…ŽLßÝ?Û¹cQøKPI†µØh³KÌ‚ãÙå”»4T»ÄYèÞù¼�¡K~¹µËpYl õ@¥-ÑÔç�8©E`ÖÊÚÑî±#I‹‘pv0ÝNQu:>9‰¶ËZ^p¶9¼¡n‘»›¾C�¼Z¿ÜlÝp´îÏí¼‡��,QÐsÛ¨4So‘>¡N¤êA¥¨Üªúòo0>‚¨/[àœ4h 7r¹ÀC ˆ±(±÷oðj¬|á¶±r倇½³Ælá«z/XØœæìÅL–üpLbÝCÍV iÍñ¶Æ1O�g+�h<˜Ð㚥CØ“2�ò4ÚëÀP)³Ic™n•#ßäW‹[ ?0Y¾-jw«(݆çºëh7©WO°æÉHÚ`Ñ>b?¾9¶UínÁ¿9kúÞE2åpxˆ© ­¼vÔÃG Ó÷½·�Ù_¯ˆ¾·³Úx |‰ñe¹¾pœpa¾Ua´sºæØ49·v…Àöí…H‹ôUòüsÓ�5õó,•uøÝJˆôÓŒ0:ưcQœÐ§ï'‰u–ƒ8Z$³T¼~¾=¯íp­…Í(/r,ŸsËcÝË슷zv¿:*ôªÙg%t;Ç”\’©=”[•yß§øZzµEÛʺÒ÷|Ž‚N©tÇìLo[ŽÓ/!úWýíð'1lgkyç¥Ç…X½ÿq3‹ÚÙÔ‘Ê­4¶nN ^7D&U¿P`6O)�¡!²^ Çw»)˜oLìZ°Y ÷ã7Ït£‡žè5´ ܵlË��:êÍÓnÊ©TJÙÜ¢É|j9Ì9!IW4Ð@� ÈPtÙÏ5›‘s3{Þ!Y÷¢L’"ÛÊÈU]¸.„®÷,qsô•T;Ö1 XDZ–^Ïeý^�CÂâ.ÈJ:Á0ˆƒèÐ °�»š˜XÁd÷;ö#~+}ÃêTÄû¹�Á”ƒp…„ñ7¶›<”e«[À[¹VçÄ·^< »Bág¨r¸ßµ,Hß{§f%ŠÈa‚&ˆ2ßzRáOÃÊspuö+g[¦Ìã¯`ì‘u.ÞC�W ÉâÊVCZ¨BE¡öJ\k¢r7¸Pï¨LÆßn+<°�p²�=0 ·® ‡gQÐ+�áòoÚ¨}�Îvjöd²m›;ÔzÖ=’¯o[]ôÀŽSò«ÀçJtjÛ'm3æ»Îï±¹Vo'UùœËT¶u–ã^`+M&3`T»ïHÛÉ j³–¼Æ<(öî–²Fɼ“URAp7û¹V®ccM—èÍ­8׋ƒÊ9AåŽaéÕ ‘b^Á(kÅÆ­»‚s‘iIG·�¿S�ޏMîé¿r×[?2«¸n ñ|àÜY‹ÇqÕ`î¨`Êùt[ÛLËâÒÃU¤‘@±N‰S¸£^`ÍIë­«�mfñ 0gtjü^ýGº½ rÄT\q Ì™†F^S&L æØ{Èø²ÉÖI²Ô"ˆdѼä>ÂA„Ù)Å ½�¥sö�îPa[YûY6ÿ/±�Ñ9¥(()"‚ƒý( |óçÏŸCà|€«Ý»Š^Qs,®kbë9 ˜r´­õR¨Õ/¡°$ç{¬Æ‡ÖUæHJAd ÜÍßA&ɧH­�&Ö´Kˆ'p7©ŸV@“@ º“I’²×~TX„~!%•ÔM:¥ |ÿŸûÙQ@ÎÈd¡_o^*J9Ô ÀþeþÞy‘Í û­ÙûË�&I£¸û_!b¤*L\ä}^ÉÃ7ð�ß9ãÆ*k?`Ÿ}µÒõnƒ�P-çêZž‚í\¨Òê„æ5Q¹ø·›•î¿\Z9€ó&ÀF0®ë.eLçkì[Wíìí[v»ìýI™½ vв·+qG ¦UùëôkBoz¾Ád7«"NÊÛˆ'+É›ZfÜÛc›²? ‹ÖïfÑÕþ¼{.šŠátƒÃg©å�PŽ2µ°!‹�aR¤Fj"/ŽÉù2¨¬ç쎰 ipj)kç ø6"¶Î’Er îÿmÕ¯Á½;Ø}s�\] Ó“¤ß*Ç®a6á¢ììÛin#z²Ž&´åW€Ê¢�5Æ“¡‰¶²ý$ ÞNBhx ¾SªôÕʹJz¾qŒfÁcTà ÛGuGda@·­ •n¯Ù‘TE�`{ÈÔOf´‘hCË€2ܺ0šK¤A-èVf¯Äp™Pù»�é ‹&/oÇ4•NíóR¨mÅ®¾�”ðæ°û íýpÏvý¾SÊaäØ*“ Âé�B”WO|¾, wWÜ�ÜôkAõïX7åóƒ14Œ»½Mò["F[…ºžy¬g X³³~ᨊ‡_»%X|Ê—"¤¬õŽk©ÕÂ7³°xk“0÷©Ÿäü½�[æ÷o×=þFû[\÷hÂ+^Û†ï%mü÷°Æ²TµÇ$e'—¦Ä�–õdŒY�åpÙñ£}ŠJ"ìTô=BRÜ}�s,V:p MM7O ‡Æø€Ð>ޤ‚Ù®s#ye?vp¦š°Š‚áAñÒ­%6 ¶÷‹ùå¾k—8g|ð góAJ÷çõè ,ÐZ<|Øf8TC¯´OV�½ï9O£­%ö�¯¼'©Ä™8ÒÂú+žRˆ”ÊÌ™•À%Þ0šå_½LBãûƒŠ¢o!µ½�±@ȹ¸lîûJ²}«7-9øSÒ ~o¢¤ÓÜu·(ùƒ¾ÔÛ—,Bxú.˜ ’GmuËŸXl=Û�r»œÚEº«!¸íÙûÞhNÇÙë_–èZîêi¾ U#"³˜÷GpP›R‹Ö6Á7‚GÚô�>%…##Ã!^‰{Œ@†2¸6vµë6W3P×Ñ_1âBÏJPÈÛ1LV„øÌÒ’0:ùK�a1¯±YÆ3;ËxvÉÌï¹ë�ìûÄf»*Z߇}®$ÛO,Üï$‡€Û… é¹øì¼O's^S"ÃèBð¶Ôßm­f<¼7z· {5 2äù•ºQcv7qQá=nVõc=+†Ç œí•_ˆaÒ–ðæ¹p¶¶u„�÷,�¡_’]¯“¶Rb³MíµO¤Øž>v{uöz Ë™¿Rÿ×O^çÁe‚‹h{› �棂ÝäþB낯Ñs í>"�:g¹ûm1’ÀtŠÅ]„EÃâͶ¶R¹uwÉåÃ$ê�óÝîãç{ãd"·v‘'B‚OS[‹~ôјû‚î»Õ‰C'È$@¾:åÉDkùÑú÷‹æBΧ­@bäÍ‹EG¯ÍYì!˜za¤óZïˆ1·,›%¡áaÜ’{ßËùLצÆ77¡öR'~éêDœ²°´Biúî@œÆp®¾Jê+N�3 ÖÈ Ò›ŠaÇ3Ð@ÕÙ² ªxuÍfµ :²mPdMt&{Æ JÁ‡yO’×zm*iZõØôóë'G/tÐe°‹›‘�ëû+hå¤gÐ^ %…–l’á€ÀËÖYC bH�P*\b¸´â«wî²mW�eG¬äØ ½v�èâÐ�H÷c|cCÚì9Ë®°o¼Ú3ËýRB&ÂÙ-Û†K®ÄÜ]öÏivÑ E^Óm=˜€AìI]-l’-ÉÊæ,µù¹¤Èo4˜Ê:òJFv/ ÆKg�@Ou#VÓYæ÷�«®¢Â55‹ÈpqbxÇú©»ð'ˆd­•s¶Ó¨ ؽs�Ñwµv™X½D"Ø!“†¬¯~dÕÄû áw )×C˜Peg©3Î|Xéz}Fdž‚Xýðɺö‘Õ{»Ç…ô”XÞ“ `2¦²/qJXÛcX5¢7[³(K^ÏÌÎ$-féTsìRÌD™rþq|iÉF<[™2KòûЇ$Cµº†°MXLÞ´�(d§îþ!ŽÉåÈA(¶ÕbÃðfŸ‘A8umË)¯öî6E³öwN¯@JÄ¥ö¯ �• ¦61.=bwÐØî½�»ÆwcùTï÷.…¦*vEGq�HÂêÀöw¢Å&eV'W~�$¤ïS{E©Hä �sÂ�[˜¦hbÆ’šKÜoOçгã¹jB¬ÒÊkâÀ`½½ñj@ć0º$Õö«êp±(³  Y/öóПkãüTvŸÖQ�R'½ucÞk>Îæƒ¼#üÄãbm7m˜¡˜{“WšÄúínß l ×Dì‘ik+(®ôyùô5ç7(™Æ'äƒÿ1$¶¶“¼øãC}@|ûλûØ;øÒ½ý—Aô[?“|„Zé�OÖ‘ËA?ª;·‚ŪøSW?žÎ½Ì}~$‚à ÝȨM«èõßœ>é¨Ó¥‡Å¥r¹õH‘ï1·Î_ ÿ³ßÆQuç·¯ûÎýÞ6Xñ:Ï?a«"B1é2ós‹½IÐW)‡lÖ6ÛË+ƒdÅ“á@K `t$,,Á…Á¹ò×-ö«Ðb4Ç;æ]"á^Öïñ�~½\÷íªäãb ¾<2vsM‚üÛñ´¨uKM9ñµb딑b}aßrwí�ô:本ÈÃZ›`t[Ö–Öá}I?ãUØP舉겮aÎHpEË4W©2M©VÃóIìveå–¶¸XÙx-õþW¨ø”A¿MiTÿ�jù„Y¢ñ.ÑÄ0(˜ü §á Ûõµ»ý¬…BYõ=�î}#Ý¢ª×É)þ¿~ü¦ÚIÏŸÆÇòôËS[ @þ´ÝPÞ2a÷Íóì y¢ Y¯`U39¼1Y!Sõðs†ò„«dÒÒÐ*Kê3Œ(§òî8ˆL {…”¹àè >\ÀœQl8Tˆä¬÷Ïä*û�xöoa;‘Î܃:d^ÊýòÓ8Þ]Ü/ôiâ°ws5�¸ûbß8f7»ºU­�CAAŒ1v[P´¡°ðÊËÕÈÀêï?¬a˜[.YÝ@Ò¶½Â³�{�†¨>o‹œ5¯× ¥×:�ý`‘å„1T¡*õ6¶q}•îËÑk~¿Û&‘ðÇÔ…ó¾2ÁàñC—ÂO¼ßÙÛ©ó-zªoïß¿~ü «mQ_ÃLøØ_ÄöÓwXð%9çÆ©~Ö²C«¹ñD®ÛllAÅ,ô­6L¾h¦æ‚£l,öÝÎþ¡7  ’k~·°�Û™©êŸ6¼z �›wil=^ÙÙ9íí5Ý|8­¸[ÚÎl={{Ï";óœ‡Ñªówç=Kšv˜Y¯ýÔ Õíié&­†PàÒd x-Ø"÷±öS rË·ŒfúyÃ[Ñš$€@ÇNþoÚÄ�0¯jŒ´€Àš•ªBC8é|•¬T°Ñ9>DÎË­s ?·Þi,8üý˜Åbjè%æês™_ìOØÌaZÍ¡ßîv/�üÉ vöHÙW®è¿XÉuµjýê4̤GµËßAS©bÇ^�G‹ÃèC£B+Š‚âIK¾Š¹ZØÝ4q.{;?ÚÞ“��ìr Ú<zõˆ¦£v�Nb÷ÌFA¬Âý Žª1+Ò.Eˆø‘ý$Ú U_$ïöp¤Í¿7lÖ‘>K^Wàäüåà̘´`#Ê€sÜ$owüš‚pEŽæîö¯lôz¶øœýl5×{Qß>€ôé÷s8¼Y–ÏÀ»µÙc|px-_^ÎvÐR\†>2?ß@NÎöIKkQÆZG„b memjM¯";*zÍ·V}…rùà.Á ·Ê¹å†9zË­aA€g‚Å© ¡‹³ˆó;åÆNLŒ>å‘¥©½¦¬B³ÈÌ‹€ÿk Yú,0Éðp9úµ8j3�»s‡Nž¥—{[\º´’8®‡»%kVÆ*)'Ò§�¿n½±ÊL®�{Gæ$xÅ!Y­¡�­åì+e66q0ô=—.¯nåî%ZÕ%ì(©dV«*Cg¨ÀPb­l%¤¢/ ©ÉІ#ìæGºì¶%Úl1Îý<jì Jkµ(õõ17˜¹ö-,ö¾¹p•‰"åfFîBÖ—š„vÆô{‹6PI@leÏvÿEð³Ð2íå(„�À§4n–Èn~8T›šhF[]R°©5ý­œ3r§Ã?Ã�=åaŸ¼$³Ú‚â¨û=QÕü®7+ßÁ ižêÂPy§ªyÃpVX»¢„øù¡@<…º?O 1%ø®içV¥0½ëAŠ�t@/™�ê±#ÒÜzcxs4ºg3u >\<˜61�§qn¶Œ±oÎ$jVÛ“B¢7K6š&¼M»8ÁE¾Џ? ‰‡|]2ÖίãPyRu߬…Ó€Íy§y¿S5èq’ì¥×ÁÌ10ë=-NpÚD&‹)ų½jìï#ÖSÔ]+ <ÎwÀ–¬*V®U¼)™1 ­ZùwÊ�ì55ô'˜'EÐw‘µø2“´àNÑ[}›Æ³n*û+J“ù{ Úy[íWk |no+Ÿ˜5)žÏˆB·y"Í PŸ•Âò2r©š íÙ!yD~b\±…DÀ›y:‰°(»‹ë; ˜iRÙª"òÈgéäÝÇTÕÜÐÀmòj…6Òìvo.V&d“笪ï`ÚÝyù¶kt¯yò“Ê8„ðîo+VÖ’q’Ż䮊ݗ…Š”|äÌ $%m ¦‡€xyOh ì3P�A‰ÞwO% º€Àk �;ˆÄ‡å£ÒH|;Bš-I„zɽ ¯Þ&k í ݃íÏÚåMp:·ÐM"|ñ›wáî³iNÏÌÑl–Ôjƪ6ò—ësˆ¾QìçÖŒxêêgå „Qè@m1Š/V£�®EkïYÙ0é�žÚ ½:)_=rƲÇ—ÁÑÒ)í3Ì‚îL ïúhU'ò-©W-aAG-šâìÆû—GžrÇúw›& Y�” ›ïGøßâV—[kpÿ%OMܰ]�ç+¼D%+dmlŠÇ¹]ˆðWßcÉT&Ëšøø‹‡ ó\¹Û=hzíÖø��8B<‹™k!гkñR]¦ÐöKå±n“*\øEжcIÕ&YŽv“9' ¦\«<»øÛà`8sZ}=AŹ�}OšÊÚ˜¼ùØL¾†à†�kíŽ÷�êèwžQ\ZIX? y›6»ÖúøÍE`¶3Á÷ÎÂ73\À;�ΜÉ<�Yö8ŒŽŽq´Ÿ˜íË–9�óNùºE¡î òàiž‘MÅÅ@ï‰CÏ ¶9Œã°oÈ0¸<­-²<ÜÊIZ�ÖåÝa-Îö#kJda8iø Ê™ØêÞ�œ.Fç3fFxhÃ"Ø<ô´ï=à 7�p éÛ�±¦ÙÄù @§ :7öÈví 0(#É—¶ÞÓ­nºa±–{eÞà@icùMãÞxoo3݃|‚Í1ïP³IÃå)»4^•ñLÛxaLÓd`%°ÍDRǺ¤ž%E$U½�Ù®ÚʆO2°_x+žþÛ­,°(¨±¯çCízÄâW3ä“l OÈ ˆÅ: RéÓI¾Û<Âý϶SÎÃÀµ´~V`ä.�~¢ ”{"ÿQýñ¢`6*‚é(Yþ;Æ­ÕÏÉöL¾…ˆO5³ªÅb¶u�5Œþ�áÒ†¨´ß!|ð°7¬äËPúûvýŒ–V±ðkèÒÅR•± œ}�/çi.� Φ¶±Ú,ËŒ¤!,Æ3î¶’³ÔÜìÄ�€Â÷  ±ˆ®(1j€‘4ë™ê¬÷’6OMÓlÒ¼£ü6ÍøPzî#ÆcwSÀÚèC¢­¡á^H&’¤¡ë›ÞÃÅÐ:U�s÷È‘r�ì5ÿ8e¬nàØÐÜ# ¿¨ƒëÛ]ý¾¶0 2Ccуéãè‘Àq�ÃZq`à†òú\õ_yåR–èwf “Óùл¨ETÓ²¨žöCIûãCÓ…¸Cï²ÌÚø(Î/@�!jy½òÛÆ6 ¹æ¨¹ë®ñ›ƒØB°W…@¢î�DQA6ÑÛÎtÙ¿y‡fmhŽ×kGÒ¯’WîÌ?i…ÚËὕ·`èÄGx=³ÞÀØ­‚÷ÛeËÚ=ìv´Ü 5ï ƒ=Žò\s°áŲÜ, /ÒµZdûܢúÿ³,Ú)óˆ[¡àPë;§Ös…?s³$ï6xzX3C{�ERFòn!<Ï+OAUƒÞpÀÚ»ÁV/)£Žd9ºä]5ú½¦¢üØžAð%º$wžAc“¥ôƶ5+Ãu‡À�¶öýf6¦Þ¦QÝKBè›7lÖÚ¯¼"\,¹º`l©uÝ8lÜÑS“î6‹*�dکỺÒz«¥«Í7ú_yk”â‹×2ŸS&z÷ù•ˆ¯§‰ðèZ½ýÍ�þ¿öšÆ(E¨a°·­ë=;àe’»ñC£½x8{G0ýl ‰àR¦Þ.^ `ò§É;@‹¦-÷‡]µ~t™Ñ¯îè�6\à�o®¥¯ jç>ñ˜YŒK$ �~ê1pî+ �iŒ ‚eç­ƒX?¬³J\]pÝßþúø%7–ê!–%,†:Ò; yÑ áåø‚EzöC‰L+!ûÒ¯žå§±ô–(h,ˆK åÑ›9|fý�òSç<î‚4¶Y‘³´a!EÂLÌ’µïXu'݈PiM2kV[ ¼F´:²<Æ q†êÞÙŠAy­³žÛYh CÀ¯ýÕ¡±”ë90“váЬc”¥Ã1_@BCªþM uCx Oí­ïø•²gb?‚[yˆQd¾âNìÀÒ�ý§:¸E¾ƒÆ\}lôéÏ$ªØJ°ním¾#9)¾ëò<ÝívIÖ¶Ì+Í¥Îq‹‚.™’¡ÞªI&öBµ}É#á˜t�måŸÈOÖÒÛ8{JO¡Œ�ÃhÚpa¹(/³ÐEÈ‚áuïºûýêøt¡—ú:�ÐÞ#nié×+Ð/¬6‚Øßä5:Åÿn^¦É9äìop€"£=.�zn.ïU•¹eáæ=ˆîfÏ];8#alÿjð¾o/eNiæ†xXì!QÔvø§aô9ðñ¦¿êÝI:–Bhâ�û_˜ý'q7b^*^Ë ¶K™·êi�ÐKáÁ:Û ¡$,Ò« ŽŸ‡`…CÊ%ÞõÛ}hîañjƒ%Jôߥ;¬¥:vªæ>�|8G°¼Ý-¥¥¬¼ï¯æ}K‹ù"-7Ƀ|·R�†eò`|óœ9ßWfãüÑ9ÍôÜ[B—vX¼·Ö”NŠk×Wp›ÅìsfmªºÒT ¾}Ylö…C åÙ®={7]¥Q˰nÃÙDÎZ%·Õ”- Ó!wsÌò¨ñ\$°gkØ‘N9A½ÜvÝCßa•�s•p 4Â[>ªMØÉ¨÷ÞӮnjMncQ¥Q1‹ªŸ­z¾UKμäŠGXÙ[åy`ݵ¤‚xŽ’ cä0�ÂàgL¨ÂOÛ½|zÔ¼wI Î<ëÉa«©nˆë ^‚ý—åqu‚£qqÀ¿…î÷‡ë·Lî œáŽšÙxzÈi÷>/_�w®ïöFèZOµ†òû:eM 4dÔ¬ŸÓ8æh3 T6«Èà–ÑÆÍÞÀRÜòø{©Ú³wí½¼\| þ$ýÔM£A½¶A£á‚h;Ö½qkÑð^ùwKÎÎÀ‰¯0»÷�†0¤üã?… Á³Ï…ͯÛÁ†¿“X"Ãûõ�_Ïû‚Ô»81u>[¯¬ èÁ¯­n9ñ­–s#ú·1|ІJ«C{gAÃó–‰ZÌsÉlRHÚGàÌÊ7N\�4HòJF¥}îÀU �[5yƒpX …iô yÓ½N0†âîeÙšùÞí^™Îô†vð•vÀ|LU±—³Û¿ëÀ¶�¾² ]òཱིÛDhæaNè#•ü_BàÚœ‡�Á½Wø¶%î«÷k À.±M`¹êg&3Ðë£ûœ€Õ¼d´T2(û¶ Ô±.�ªpÀÜr•`âõ½õ¥±kÈ\ºûÓ=ò@Ĩj wTÖÞù6ÙBß>@àïPö!Øo™’tcÔª°7—€„ì'° À®hiñÝÝ;6…—¡=Á5!žÀB‘Lh¹k¼yx)fµhÖˆ¤³ý`y`»fÌfp´Î°ƒL±�iG8¿ÅŸ°aŠ^•P "�­�b’æÃA‡ØãFÐézNg8VR 1ÐËU1«%T�óš¼G“ÄØ€lr7·‡‚�Þ¥¶0¦6ª 0W麗h°õëÊóÒ9pÁ† }r€Èš-^U,¯Ö�5µ*hßÀè÷8x6o7Í×Ö¶Œ’Ì_,Ÿ¿³ëøÛgÂsú=#‘æÖÈÉ[�ë‡É�1œ^GfÒ qÌÆßröäc­sS2æç2ß�pýmν(š||7œé�>ÆW¸ ä“×%»/BŒ�ù)ð‡ÓOÀ=©CgR˜µ¢Óu¬ˆŠ‚Ñt*¦¥´_¸tÄIíMfnÀ±·œKÌJ9ïÓD;ÛèJ5v¸eÁЬMídp�™¨à¦ÚV®²Ž#8¶È°@­Òq|Óå‚y‰Q¤jÈ{©S>²cIðç«ò0væY°bô:ì}~‰Š(}[bOÉ’JTÍïÛ–A›5 Yùö¦O�eS!5<>ð8Âx mÆÞœõ5%qöˆ›ãÏËå>ŽúaŸ—-„ ·ßg!›V–|¸üþwmœnå]î —Û $ ¶Õ_ ên<ÚS‚c]À`·óì¼íuƒ^±z¥VÞõ5;ÒôjÀؼ‹ð«‡H ‡„QØÔà7² ïox*õÝgÕØ9•'´Åo§äÙyî©RD~¾a‹�7"÷îy$–§Ç/‡¬GsŠg³a°i¾àiQ7¡�<ÞZ¢¥ît{ò¦o!F‚{©ó-Ñ×Û$¸=ö•éý‡‘Á1)ÂhÀ¿?œÇ²>Öï-ë²e!õèïai»ß|¦û-1q&ú¼—m¼1; š ´;8ðT¬âM×ußX^ÈÄ£�RYwÝô$ö�[ÿ5@iñ7 áÆÛù"t ‘“QÀl2©ÕÎñƒ1¢Á‹4ÈÆD!ÒD¨4Ý“@,F4£‚'ä#9pö×å�@û¾s�õÄ®'8.ŒÏl/cA<ýÖwï78±í\òS Û½šÁ¾eMfæM6�"v#P>Þ¾ê૽ß?`… áXiÖÈ2Rz…hhç w¡†[“Å£ ¬”¹}c+qd[wë±Æ^ûie’¸5ƒi;Õ›kæTâë‡/ŒtAy“ ³ò›û H:!Ùa$·~mØ q{n�Ú»˜]¯7<Û£1ªuÀ~ü)AOó¥)JR™ ¥S�\‹{÷“¬ÏMwÇ�ÓÔœŽ-ãß4ùPL)<ô6WrÄ[‰©ÇfPÈ-c5¶ôa\¼ÌÕ€ä!+6U3S+­ëø[U•#¥¿^Š\ àÌÜ Ñ¸ §WUfAÖ™�ä�£9{«%üO›lo®bSTU ‹�û7§P´›d*Íá5°» >n¹µã¬ÕiÐ8-ä+$9>t{YdcKm5»ú½�uóMú6WcÊhÓ…G Fä,fÅa<Ê7°Ç×HFbÝíB7>Úí|`a‡ý¥mËÍÖæ]¦w,H$ú‡4òn•‘nA�ìÙÒ�Eäm4X磺mnÃUc’à ˆ[¨éqVƒÂÔÆ,(ç´ZÉß‹l¹‚ß ‘Ïvõ¯É¹£›±ªÎä†iW˜«ø:êÖ�Ãd�u0¥-¡r«30 rÓ}ï'Lãº|æé“¬®/QQBA˜©À;°61¦îÎ:"Ÿx’¢Ýjk $MçìfWGÂ�cø|H‚ „aŠfà’³W�LUœgdyTR¹NmgDùSQÛ�¨†aØA[//w8‡ƒj@[àÖ’^³kØEV׌ÝïsK cHžUe]HW�‡Š�’fIëàû0מ_VlOr*‰ŒBÙuH¬ÇQÍe�ƒN.nÍ5†R¦[®_}Í�³¼ªF´ñîoE™(/M4â×é§±É÷2é»W8e„‚8è8¹eÁã =Hj¡[³#À•‘-op*]ý€<54Wɬ:;®_XX›yIìܺX+h’Ì ‰i¶’·lÆ%)¼ì!5 Ñ#Cp•pâaõE¾ zÅ}ö¼¾*3{`G{#âʺà;x£�¨Œè´:ÕxSZÅËk©cyEkþ²Ü‹¡%gI®€UâÁŽA«¯®JE–Êu '¹nç÷ºÜMf g±oŽ©87ÓUEM¬ýGå-§+wJÈg�å.³KøË�½¥: d"™?à~Àyhrqšƒ‰kI,,¸—#g™½ºpjõ\p¬ðnÊBñû]Ûš—ÃSνåu|ý]ÌÒÂñ|–²s`†Ó:Ê"ûÊ=ÕŸQ=ªå:)Å ºIgüÿê`p0HÄQÚ!D£èúËÕ’ý`@ÿ“Ký-Q~ÂSªóiÍP#ˆÐ[eS9°, ·Õ§¸u³qÜ^<í~º‰§±y´ë¥Ô=žAÝÄÖñK[K_Ö7­‹gÚ¹¡ZÀz5$ úZ·3|¿¸z°p¦&ù`ã`þ™¾™Þ™PnýJøÏë÷XÆÉ(GÂWyõ•0¹ì+ÝH É3F+�gð3öúùö±�¸ljÑHØ…@†þ±€S�΄¸LEƹÂQ{Îñî6y6¦@^>F'$0€ÊI|"šö°‚šžþL LmO«ZµØÐ0O®áúPÔ¯×Ήª¶DðYoc\ ÄZ�(³l#�Ýf�±p»kZ8·C¤keGdHˆÜÃêÔ`®Û®òãÖ–µ�š;‹¨c à<ϸÁ¼Öºû»Õ5°Wöѱ% ‘Ìž½�äXo,á‡L‚Á|‡¡œ;Ë€à�ÒáA½âé—r/†è z/“öÉÓ‘ÎþTîDH:k¦ªÈbj¥íŠðQÖ“c‰Q QwSMS®ž³ÜJ™™‡IÃã.Õ­Ÿ0Þ>õ\ýX7KOÆŸ cDPø÷Åܸn˜øœû�öÒ‰Bçƒcèμ1õˆºâR¾C9Å}Köä-WO¬3̇­uƒ$`¼+ íÊq„Ý`T— @~b¿WÄAœQP•}ƽ4ØtLÖ£+œ@¿5‚'4.Ä2ñkUe[‰Š39õÛy£Áo‹WÆq¨×cï@V~A òÖäFZMô™ÈlȶÑx¥ïRý§´[ÔÞ;êM¸ìR90øÅúh�V—À�3úË8£´Ž‡;´q´Ê/ äÛ›@µl¦­Žp d÷c�¦"¡Ìõð8H*ùYõšøÍÙ‹q즑 ¯F8Æo#F¾MÞ÷ïM÷u–~£â¥öÍ ˆiÙhAñöq!|§º¸çMÒ ›Lm4Gìðt,l 7Ú0Hʼ—3`µï£‡ÝùÚ›-xWî·ƒÙ”²”ÝoNŠ“åÞpƒðãösTÙ0ð äÓ7Òýzû4–{ƒÛÃjASÒkÏ7±.[ukÚŠ\ðÛ.»‹Z$þ/5ç"ÇäìX7Ü#“{�®D \Aû…M Ú$†¯˜]áeä.²öç™øúàðÃÇþzýnƒh@¹-Jø‹φ[=�–Çå1šùw»Žp #|–o@/¶’^{´ÂæÅ¿"AôOSŽ,fÙÓx%4Áó5Õ´ÜÍ'Ù)ª¹“ù;¥×â Í ´±•A÷¯Mð=úœT׉qŸšFC !!b›Æ„­H±·àC£Sç�@˜ÕÔ Î/¢ÅÌÍ!fè)“_²oØ„"L“¢ñ>…³ª ˆ]cáö󟔈Ђ÷É¢}3º©e,aáÚ´èC0£åFƒ¯ÙG›åîwË ^³³A3øøø�¬‰2ãÒÂçÖôLdC™òUú§Ç®úëýnc|�çÜ„ü*5VÎ�æ(j)á9a†xß’ß[F’Âú»Ø³Ÿ¬â܇ápY†ÈÜ–]í ŠdÖñy{~±>�Ìg8¶Pø2Z‡ïÕ“ ]�í–†ž®µ1b3 ½ô¡kÒ–Ä÷æ€ú5ÑÖ´ÀØ ê8l“Zo“Ž!\P/ž’oz³§h’#tUhÂá øÉW ¶ªÃ×Ö§ö¹½nÍlnŒ ‰L-èUæçnÎJá ’�1Ò@c¤Ð!z0 &‰£XÆ�¸ Ó˜ö¡5Àç~ìeŒEsb �ë-;h­ pLxLýWûa4±¥îÉCâé%Y'O3°Æ9¤„§0Æf9¥ +Ö`à£Cýfb–/Ú9Øû×ß&sœv9Ð`ÌBBá‘õÖÈ~³DVÏY¬%AâˆÒ¯[þ]gC2§RnK:>/ü—ˆU{­½E™Øö™NSåÛ-®êž~¯ƒßPÐkæSX? ”.©LK³”8«óP¯ýtÐFÛj‘Í”žÊø¯Œ9ÎÀN&'œcbætSmVóÝ�ĉ‡ =£µˆy^à5€�À,·ˆ¬/øŒÀ¨aªh¦Í+Ñ`ßE~YT}µ,˜#ÊçkÜ¿“¡#q,ΰŒRíÅ= Žs«B0'@ÆaRÓprpTaÿ=ÄÊYÑ~·Àª~KTN‰Ì²Ú‰.Ž.ÛïÙÜßyÑß×L› C2´”ÂEÍ›ØÆsS­ÊÍп/£ÖðÄΉp^î¡§0Pèi“v9ÕÔ’¶a¿)c™ýæKènIkZ\‘ïV‚eðÃ|µÑ$C�¿‡‘v­9$VŒ&á­)~*üŸJd9�/<ë%Zòãº* �3· 4ˆÅ o§Aö>ïÑQ«¾È,ð�j«;h$Ém èŒÕ¾¥š~-Sz÷�Íw}°ð¼²þÙ_n`½Š¬…ƒ2ŒÌ{ƒÕ¤ˆ–J<ôìF %õ,çs«ïü«\® À`ÀHÍèò0ˆ0AÛæ¯6ôC¯F^³Ð=‡ø 3ü¶`�`E ABØé¼·#¥·v˜Ÿ;rî]îiJ [3ç�dTÏ–�(q34Øö=hØsv༰•$mmCzËú_ËŸ2&¹Ì:îDç3¨p0„¼ºE:§Õk wÛw‘éß[¼-\ý¹J 4â³óÝòôó“Üq&ÔæÈ“ ¨_ȇ[mÿlñ ñgú÷ÐUwqñ®ÙšŠæfå‰ÃùS…ûú¢1WâêIðe°B¢¢kwþLZùx‹ õš3ªôc±"ÙæN{›Ú �Ò˵ ¾møc};Jl –ykÞ´-¤ X«¼¥ïq,zùJÏ»7jdcJÄVÅ —· §QL‡9Ð…Åná ïÑ»põ8�«S† 0:F ,ŒžHÓÔhW‰¹ü!µ|ø0û݈ÁsOšþì!ÃC¿¨6/ÂÕ¬@V^¼YCãþpXü�½ŒÇðzzm O÷£ �Ñ$oNH4ÊÞ"_á5 D\M.Í~S¼½Tç^}ý2уÊiáÀ¶úïZ�0Ƶ™Ÿ‘ ¨ét ÜO—mv;¼ä±rJy1tò1 ük¬Ô=Tw¦ÆÅùñ¡M41£ \˜ê±#õŸ!±Ðnn+f.-_}­ùtŒ"…„4ðc ´Ç„_Ê®3[,t-¼{͵›™�½�zÏÑ›P}ÀÒeèM]Ï/|Z"+ÖÕߨÍqy qà Ü穌~OÞr½=æ$-Û:�æPU©FÕñœÎÇcÎ5i‰l"ÐÍ5#Ìh¸ÈÆÔÌe„o…1žJÏBÄQxcm³W¸!Ü{úûµúÁ#ûr³0#‹T3Î^>;E£&?œô/ÐY�5tø ˆ¯Í�.빬gZä‰-¬Ùi[Ÿ!�D4ù¦À•-ºq@ZÕß<'éág„Ø  ïÅÎs?k�ð˜üjb!‰‘ TùdN®óp¤‡uƒùBôù Äc!ÅwEÂ)ßDqGõ¹•Öj+Œ=LØpE›’5ÚÅZr¶u¼´6çgTZù¬e a€—.òHçÝ.*ý…Üñþ±«X9‘Åóöý¯jT;G¹62ñ[‹µÙjï¹ÛmÚ0I}’¦”SÜ…ÎöLí8éÝø¸‘úâ© ]!f–[´‰~¨’Φ1Ùépç�@E^2Û#­F#Ëq†,hÿ#RFWšé»Óns�nòøƒæG ß­‘Ef;W�…’ý"ÀÀcs GÞ—“Út½º( ×{zõ�_`f}5¯Ýò8pn-„åŒ )E%MԾމžz±ùF5�| ?%¾+[ñŒ<˜PʹÂíI’�Öø3oUÛj»É°æ%w°ÚfúCq‹ˆ�~ÝÚÙì0<O²;Òmmw‰Õ3q#8ǽ‹¿²¹£d»<Õ‰w“ÏÅ„—у«4yg·† ¯­H\lnx’º® ñNëʹÜâ…‘ß·œÇÖL}‡2=ÂG§^ÄG6Þê¢9‰—’ñˆŠÅÂܨ´Úe1&©ežÞ³Zw%“Û�@ÁsLkÆKkÛÖ|÷.½(ÅEM´ŠcÑ:3� >“](õdÂ>q7 ¡?Éë|ÆèUqqÏ�˜nb©x]¯¯�—±«ÊõÐ;|i„øõ~*H‚à‚U† ¬�4GÊ_wžmq�µ}�L9.åi³mÍÄ&œžH9I°1±7ïw¿èÛözì$ y´¾|Ïy¿�ô§È}ýÚqïL¶þjW>I‡6þ`û×X~ó[Žø_{ëi¾a}ƒ/¯öos@³‹¸òš¦±cÖ³ª—Î’Z¾7\nYi:G‰ž5E>’ûª ÜôMqˆû}¢Úw ³’‚+ªáFSYý3'Ò‚xš>>­fh¬¹)uöŽ(­ºQ7Åþ±sà ÇIpèŠ÷×ÔÙHÞæƒj{dÕ™Q\R¬}›_±ÕebRa¯ÂÉÞu£ÜÄ9†úµ`�aB¬³ñÖ]lë0XgÍÛʸ®ØøzEÓ͈ò«¥Ý¸áÛ™„À£söÙD8©Eѵ�✬r0um½Sñ6÷Me€`E–¦œ‘ûqzôgðH§“ÂÛ1"ùúøo6ëg:,§éƒÙÆMn Ü8%ÃΞÖÛqêZæmÿo[¹¤dtÞK%ÊxÊ#`Tó¹ßãV‡Î{‘ɳœ /ó#ñ07LÚ 0 \M<ˆ¼V—‹¡¸†˜uR– R§P,@™}C^0 6Lš%CwÆÈ�¾�Ìá@ÈúoÓÀwiÑà'—‡zíw8æëxÚšýƒ+"zÒb*PLoö–ç[:[’™]Ô€ÓáÛà¯+_–Òã) !£ ­9½½æªF_>ÇDµÂï²�¬ ¿¦ì ÆPçšßÎu²Bßlˆ"új’¹Û«¬7ÞŽ%¸\¼ïÙH``ß{µTŸ­Ç;³Y_«øÎ1|& A°/jaù¹�æc!g„¯�ö¨´‘�Ê>…«…{©r�'(=>Ôâ¬A‹r&«0ƒï39Á©µXën‘¿�e)'C Ò¡Œ¤Vcø® i\Ráök8®“7ŒÛÃàN×Wbt¸®ÂYX°ÇÐΑ›PçkíL)��¾÷Âö£ƒ‰UÆÞÍì¯çDÊtÁ+˜—†0®ôö!xs­¾Äí�¤=³…²S ½8Åg»¶:{«â^U>„¡Î«¦f�*8­°gí…³­3š“ÍØÞ#¼»éAÖLÉÆ–’IW>òòCZ=Ø<ªâ‚nÙ‰…'s}ôÏ4‡ ˆLZ,DnÖØå6©†fHýäƒ^iîe0Æ›¦R »¤5÷Ÿ8¹jk|óxP�]<}�½r:SåÂ’ÞnÀGh(U™é¬,Ìn´'ÝIc�°* ò–/t»£ú0*žR¾ûU+b1ê×T¡Ã¿¿�­¶ÛGÄô¹ä�Ö5†øPQ‰û�ÆÆà=¸¡:»¦ôý­û|Ü�}èk]�‹l×®TR�AÔt;ëR†IéÆz XLÊa�¬L±ZÃ…‘‰ >ç£+qÀãf¹]s:n»ÅÁH{UœÇ~eMä_Ü‘¿jݯqº-�1‰ÛG¾ê)¤´O XwÆûuÎÝ8)ÛOŸ ÷täå„®•ðZÿ·g®èò#ÍÈ\%”Ý™¾K¸Ù”³o?§Z�Ù¨F|eDÛ¸(`[—)œseó(4­»h-–Ö)ÖM3(ªeK 5 Ô1«m0ôÁÞ ²†gh3Çè³ì°g�à7œ övе½8Wò›‹×½rž?·Œ)<ï%‚»!¶™�÷On"ZnA©q ÞS=ÍÁ}Žé€Û›ü=b=ó ›dÝ©?¦™gœÎÖÚqã7Ò² ëhCTû\›X· †�LßUJ…s9ø1å+¬´…yì™<Þ+61…ÇŒ"¼'{†@q÷– zU»Çw–¶¡z�µº„ß\hµ÷×ý=¤’}7¦N³®–ƒY öBuyà[=—l¦WvæÐ ¶€Oˆ�Kd±ÓÙ´ê,®-3NF".PýØéÅâê8 Ÿ¼¿ƒ^¸a:�œ“d‹ öv"<ƒ}-͇ÁܾbÖ~ùâ5˜ì�˜råçgŒØ6q¡$ÒœUÂÿ)ŽéD2ÿ¦xÊÃQ%!ϯj1ãÖ®ÈYF¸ájÁM‘ 1×X2vý5¯ƒ™wã(§@:•Ñjžå§ÑwJéûì ("oaÌvVþè—Z²(Ç[€©ôú^‘#„Éìò¿fªÔ�ãeEÑ¥ƒÇÝë7=‚6O]ö�Uô�•Þ_�fA›œÞÿ¡Ôó¢FëÝyœ5â‡kôå‘p�ÕþK] ‘�‹Aˆo6¯ë ,¶l…ŽxjÔ4S®ÖêÙ LÄ“ð;œ£™b³\ÕW-pçc:1Š}ûKê-ÆŽ§>×K>à�¶C‰g½÷OÂéŸJÖéú�€x®�Ç�ée[˜q¸mîËqËZ×ÈÇ;¦Ûm:Û«±†@·h.ÊÅúöêÄýæÜ­³¾ûpé�ߥbÞÑ[’œÅ¹ péeÔôÜåëcÛ“PúPw&¶,Þ~f¤5§Îûù|ÚÎmžª�«E´!š’V�¢ïVÐ�,Fzm`°<;¯£ƒ#ý{‡Çåš6„-¿[Rß÷ æã;¤¶dn§Y, ”jvÚÁ/$i`­(NGí>W²ÏlCµ�z¾­æÀÞ¾}Õ ðf§$î…›<’YÜ|Ÿ>ºÙùæÁªnÛ6R)Ê)Uó…YûŽÀO?~Þé\Ýûkô%ÇIãðò×Z"÷ˆr•ª™q>ý»8µG¿qÜ àߣŒØð€\ðË¢Â+à3àÑ1PíKƒ°íçèéÛèDx,�0}¨m|OÔÈx¼Wª‹ÚØ\®<ø®zû×XÚ‰Tgdƒ4Ç3ß1oÔ IíÆ,\.{V꾆:B‰;L_z‘²éœu¥Ð ÁEŒæžÀ7Ο½¬Zù|ç Êf?w …ôþ/_±—c´gKè·v7é›Ažë�Äš¾–ú ¬‘â(-Ce’ Õçd6V•Š�S­¨�ýµúÁËØ Vªb0gj½~ÕP ÿzßbùå8­ˆf½P4EƒGÍžÀú­Äòö¤ôpÖ¥I'Z—¿yrúÝ]¹;°®Æ–ÿ²�fmÚi ¤Ôéú„ƒ©‹õä°`ãE\7Jë…ÅÛÇ–»çø¸‘cæñ—òm�3í%å³ÃÞ½†Ù�9Ù¢þÈ Ñ�3ÍÿNU³©ú�ÁDþΨ( GpG©œci÷Z/Z›}â©ND0‚«�(Ý‹*=t�Û  ªÚvaG}iªºŸGh3VMÙ·Fž¿7ö³Ò@åÝCWî%Ü.° öØÙ‚C]WÕ³øó2@Þ)è¯FOu&g2Ï8:ˆ†Ö<ñ ƒW«l…Ró‡r &ówQgëê&È­^À¥¹ÊÜÙêïÝÜÿ^5º¾ÖýOÖ±�ت“£}‰ªï6÷¼`óš+_š¦•×î$päÚ§é¾@ô°gmõuö.ëABçc€·[+n�k�k⃙ÕkBgŽ{/ŠÏ¦hCY†dÛô£¢€X®äÔÊ«¾«9ûkX'9Õþf’>†”2+±UÏ3±^eL- Oß0•…´ Š�¡[‰ªE¤–/òÜVòV©ðz'æØz"Ûd�{e(ƒ"IÞ¯Ê:¥¿gº¿èÞÍÌ8?s«ŽÛÜéíÉ…ó¤�BÆ~Dø±Rœ8'4×È*iöœJ˜Œˆ}Ôfïl 7(² ›ÑA–þ¯a~%)@ à7k8³¾‰ÉïêøÌGgkæÐäQÎE¾àrÓôßÐ ˆ™0%ÜÓj•A �>~)Ð�EµºHë:ÿ�׌‡¢Jeúçj ººT{ÂDhbå‰NÞÈÒÖÃj`¡ˆÓa,v¬Ñ0²Ô*ôw¤¤_õ±ÕolxÝ’cÔƒ2ô€OCA�ˆVñc³6µÖ ¹�_*§[ñry¨5œ$ZÆü/õžÚbCOƒ$u^ í¹Š 7Û÷5xLÔÕ›tJ_&öÏÈŸw#šž\¶¾ªgqX *j;70¹Âl™¥Ê±—ÜZ$ipš‰Ž,ª�ì{“Ž­ Õ`"À`3^ 5¾)öà#Ÿ^ >ÅJ·tvûí•f yøîæ>FRuú �Ž’Ð-u!ƺeM’êÃÖÖôam~«éN=H]& è»ax>¾ÓŒ–Ë�p¾ÃwЙnÓ·y/×…°h{ÓŽëk‚"‘Ì,p£¥Ù¾ð=ÎÁ™Ã|sAÔâË¢Oµ®Ç]q¼±#>wŠÛod–ÂW,ÛJHIڋɂ閙¾É$ˆ›SŸá°Œ¸Öh¯¯‰ †ú¾èÍBóë{ò¿À¨½–­ßÙççvܨ˭¶zH¸ZõÕº4 åC1¯e÷Ž?Ÿ§w‘©;N†/AÑžÿ›/¢ÎIÕNúMˆh÷;kææLÇñY‹FŸÎW»–îÖ3]>íx¼Ôçš8Ù᳘( q PøýBèÃÑ€†7Ñ·¬‡˜ß!±–p8|ªŸßNKËù®ð$ê¢nøÿ¤ÚÂÐÚ½?Œ/'LòYí¬Æ‚#€¡)ø¸‰0ÄÂãØµh9ø°µq!–®R,úSo¨¨Ç¿Á ª†¾tU|ÆQKÎ_ôˆ�س»P…remå|®Uw`KR*½!ŸOLZÅžö¶_\¯A×¥Ùiô Êþ9Ö!¤Wë¼òCUU­oEÂHÒ§¡¥¤]ÊÅjö‰˜ºVY¥ˆ?XXTÕ|ߨcx¿Ó1Ô3 ¬ïúŽU›$y|I�þó^CðìÉ~qYKhãöW!¯ ¹h)E>œ–lèÝ[ß²‡{ —™Ó]wì5Ëb5Ÿ»“°@–ì!í³/ovO�³“H-ð5ëšr›-²Ni�Çn—¾÷ϵ‚�ºÃmP¼dÄHSÄÙúJÉ E¸Ì½(TÝ ì©GZëÏì_Çp¸ ±n @Y�ïwèT!Å0-‡»Æó3$XPÝ1‹AcëÒŸŸ^ÛûàÂs½ïÐ�ܦ…†E�ÜãÓ`z2Þy¸ÕÉBÖS1{Þ3?Xó¥ æ=d4¥Ý Ì1™ßœAB?’a¤ÄõÌܹ s·+¦7O CeMnJöFÂWâ|ßt90J${‹>ËÐáð'NA-QSͫޘg{…ß Åõ("ÍKL"L/ŸX:{Òž,aÞ+;¿´G@ém܈ ~ŽövøœåŸ‚ìÉcÑ&ñìg÷=ÖßÂf¯ºÞ›;ØÜ¡°¦ßÖ›hp»¿M�§Ö/ØÐÄ®Æò�tøäûæÂAÇ=ûÀ˜²FAk ³6Ùù´N"Äð@Vð�Dö�ü=žörùù8]X©é-Ô¯>76K%µ?›–hƒ÷)æ>µ'Û¸ª‚{3¶±~žþ*ØËí3Gšß´ ådÊÉð÷Íz@«–O�¾Ï_T€ósà¼×$ÜA;вü™}8Žðò †Ö«œÆ;"x�\ÏNÔœ½ÓlyT]p\A£ÜŽj×­ãHÜìô6KÐnÎÃmN:ü‘¹ Û],ËK3„¦’*ÑU‡»ælè¸c|ôDß}ËppuõqŠò$œ¹¯" Úü¸H½‡·."n³ÑâGfî8åÎ.š+ë ‘½µº%¢Î;-Úcówh¸b…Z,ÝÇÅø´J6EݲûÑi:°>2x…@¬ûÙç‚•e'„c6cMGw‹Ë/1ŽZÒ3.'Ld`ÖF“® avqU°ïÍòTíÙj‹¨L?­÷GE›‰’Cû¡Š ëôÀ…n´œ„²ƒwçC‡¢è†¢ó0ÖxÛJ^à ³7 ¥Ò ~¬/Ûêã–ÝÐwÌT:¾ü>yòALaQ\*¤JrážãXQg¬Þb”-ŠÛÈD ´ÅÜ–uŒ¿s9]£ÑÛœf¨8vÖ,]ŪëÐT�f鮃¹–ZVugr¦ è%!_¡ a(Ÿöùo)‡KvÇ8c©‚Öžmv3pˆ²E¥Ò¡(²PùñàÚÁ°Ù~±¸ª hSR’§¢/œx¶É­¾¶Èïr• t :—A°o1œGŠ ¶ yÒx¸reC4N ˆ¸ÄÅ•"E Ù‚ «]jW‡ù#Só5•ˆ²o†ú¬ò¨•†ÿwúÙØ stR5 G ý›Œ€1›�oï•‹ãÛÎrìÏ–7ˆjøòDAÎ>ã›™°“‹hͲè8òá@ßct¿/±…¬·íÍ•¹T#E»í ež¾ÈÏ«•™^ª­÷I§80¾¾ ­”çÙn¡—9µÔöUwÌ&�rÂìâ�L~i eu:ò„•ªÚýfnüæ°¥˜7‹ «Î•�mÝ‚¹a3¶“¸a-E´jžw®o‰6N*³F8Â/ž`Á_{@èèmˆ­µ¶ à‘¸ÚOÅ®ÆSFÆø|/ç¶–x¢ÐÌ]wAYeûáTðæÍœëgÚʹèÇv£ÛØiðÁ ^:�½ðkÊsÆ;=ëæ‡;·-hR#~OÌšÚä­¬›ÞÑŸXàUßhùùѼВšù¦[’WÌg\ުūÒí`WÓL cô¿Œ¦£vŠ-˜«Ìþ·/mR¾­•Žqï QaÞÛzÌ"„±”ÌHp]­Êï´G©è{˜wÑñ¬X3ÒlmFþ{ÜGÌkëTùÁëˆf®¾g`[fŒÒ?5Ë�s£ýøºÿ>°µwݘ`¯¶¸ì–îâO¿Eá`*@´y»Dý¿JTeWïêûË­æ�o¶æ<_3¾›��„6vŸÛ/žœ‡¶Ö&”^˜² +Î)E ûgpÍ?К ;Áã©ðV§öŸVæü7 ø¢°í{¸B„馇¡c>C{�È”Ùh¸WÕùÈc(Òu­WBÏžég61d6Øže ~!BƵìKéÚZy K�Òå5^ ‘z�_…$�“)/ %à©l“’Œ×/\NŸ ÷3»r¢®Y}§’@lã¹<ñ¯Yäó¥¿A—Ó³çüFBý¼sН˜RÀϬA9¶/>˜võo+€Yï§Éj×à‹ŠP;�@�oë‰ÞÔAK±¾/Å€ê¢~扵HN“€Ä 6CJÌATÖòÉçÈx×Úá^-̯&èñ“ƒ��îý÷—�§!~ÑÅñaí~mö{+¯³CÚ�³ÂÑhÂsm{¯ ’¦”íp8E0ÁÚ”[T­9´–+�¾uâ_qï\@N_d|#e^v †ée´ŽèšuèX|ß±ùž€n: †¾~«íÚø­òôõy*—·:[q±Z \ÀíX9¦ñÀ<½N)O1ž sݰd{sU ].Œ¼EØÕ¼IãQÄ—íSeD>z²ÞÅõ‡.È’A£HHr‹Tk®5œv¿Å•" :ºsM ’@$ š*x¿œÑS1Å5‚ù�7 ÞÐs:iu£áÈ$’A$‚A$Ð?~¿·õ‚Ô›ÈeÜžþëË·–ØçËŸf¹ü¼ì¿*ð¡Åýø;«{Y?éXTøf5±Ýú0Ð]gÛª¢i¿6a';·#s`üß Í¬;º#ñgð~£¿Ùøõ áÉŒ5±hÀèmc€>rü®² Æ÷P)[G˜êÓæóäs9Ð¥>�Îñ^=é{ÐümJ†¶÷æ�ãÒ�²»vê€kÓÛÈ�@̱Mèô+œ±ê4¶Ã¸³½mqeë¸Ú#Ûpå)�ÈA’òÈë*ég\H¸_|àb0È•`Ù]@H-ËÂ^ê—™"Œ.ï$óÚ'¬ÔŽ.t4?“³Ë(ÀãÿLY$$úœfõ!8¿î¤6�FûIB¼ûá 5Q"ðBj?ïfµÃÛú˜*ý¢öº³á7£ÙjIxævk}GMt+¡h„é{ŒÙKüÇ­‘qïýfˆÝ¯HØä—O™æØ�+c*Ý‚{$µÖôHŒÝ»È†Ñˈ£…¹b÷Šd¦gM~R¹Û•5—‰3ʰb8ÛH>¨nW,¡7êHÝ�ŒùÔUMj=…1ȦaWûkZ=H4† ù^Àò†O¡|Iéþ Ú]awÖí¡;))õ£óɹ ˆÊìQ¡uîåNÑ0Q9Jy—$*ú;´Ñ= ‘gÑlÞbPì1Œq�ë�bM‚µ¦ô{ÈÞ·peømJÒÓÝ:b¹d㦣@{ÏÎ2›E+i–Ø�e†µ%QÚõޱnÍvB—T»äÂn¯Ô]4©È:,[™Ñy­Ê‡i§pÕûŒËF1“Û�­‚w_Zð”œÐÐr?g(td déƒâZnŠy{=7ÖK:Öµ/›vJ…AêŠîïhÎÕn¢*Ž÷-cÒ& ꯎÀÀøøÒuNG¤}Ž¢tû«±%Àħý覰óÄþDí�tÚ›ÝÒicH×–’�¯oØv w—míyµ{NYîzÜÀ-ŒÂ!2tNƒÍ•jnÑÜlN…L'l—VL”çNB�Å©z†Q²ëMw ¼,ðK{ ƒ›äËŒÐî™A a›÷õßÅ¿p:œ¿µNíVMÌ€ó ]zÛì<°‰’U7dáúF÷è뵬¥[Qi¿m ½ç©s:5ú�¾êùF{6Ú"†bƒºQ:]çRÖ�ºéœxÊ.µ@!�>Í@—Ìc´�~ú•|•ÃF°ÛÞ)§gÞ6~+yNÈvn Ì�ù„jÎ#)bÅàÛ»L‹Œò4W’+5‚[¼OÞÃôRDFsòG9[ÅÜ” €ó7FúÌœ}¬'¢ø×d õÊ›{wßÇ”©Òõ².ûÖ®ÊHl°‰ÈÏÌ’ÍçõÃ>ùB÷;1J…³Z«Ž3ôD_H/ÅØeæ–ă)^Ñp2·ÑmZ‡ ïÏ�Ç‹ fú€Üíf|&= …š¼!Ü ^C�3Øù°>뫎›Õ7¥ó”øtŒ'O˜Qβ¾®&ŸY )c:öbÛÌ1EI~â‹ù¼w=d€$:Ë@,× ½ŒvS€¹…`¹$\Ûlù?÷RÁå# ¿AüüäŸø^'Aes剫—op¯¡ì/ò_õ¾#Üpõ_°’uÈ“` ³føÓ¥6r£6®¢�a)ïƒ:¯:޾úçQ#Lx†Ðü§«v^ªÅ¾&ST ÕÖ B½«²Ô@}Ìžæ ÖâeÏËó16gmgKlÞ×PÜš:ú‘ÅÂõòCþÇÖ©[ÓÈá¢mæq®ºd¹ùg¥0¶[Ÿ×£ec6�Êø:Íô´ -6îúVf*`3ÄVÂÙˆ_ž$nÇ÷P0ÕÊÐ]wj4pæ{¤. &uå-[4ïìŸRãÀå¼Aƒ`�>ˆÞÜhïO×%B2Ku¶9�.6 °È²ŽÍFl¼Æ8tñž‡”NäBõ‡`�€‚ö�b×ԘĿãÒ×}³ £ÄËÐP—kÒÑž÷|ì[#)ÑýÓ�Š\+Îbbº `–ø¬„ è+Ùº�½y ZrâÒ‹$Ão¥³`>ó\uañ«¥©"©ÏEð�ܬ0–~Î�=tÏÃL„tD]؇>êu ßrÏEäAÑÊ5‡ïux¡z±‡º3劂BÛ¼¨ÁE\*ãú �<@v,¨yçÕ^¦‹]Ô±éDȉˆ±ƒ¸ºès»\|…J­@>¶Àæø†ø\çe3§OVAºøò˽A”¡¾¨@œ@J›ºS<ñ9„Þ¹‹Ø8�5gt€æ²�¬þ¹M&oËíY=1ð|æ�å¼ÚÈqFb=7S»*�¾á÷^*Gʽ•üpËm†Çh¯Z³=�(÷h .^+ô®<竘¶jß�7âfîš·r=Lœýjú†Z|³iž7ûpΩ Z¹[5‡Lîæ6 MÜl$ÍÇ#{ç˜ÎÖƒ|C-*a©Ð@ú› M|å&Íâèk7츳æã}¶iì]¢ùé¦\¹‚ãÉq²¸Ò'«[eî8ºy'ÏÃêºÃóér?h._¤Ú¶|}æÐ˜k 8ÝTÄFÁc<¯»k ˆ?,Êrt—ÃÉèv[rr�}½qš¶™i{a­÷ ¯ë³ç‹óÍ2)�ö$5ãk½ú Dª¡-}�«º‰ý¯ëõ4I½/>+e:Þ?Ô'N®4»9ŠENKS(gÀ´†KwÇ^¨m`Û3HIbÈÈ:’hé&VöšwÞ›ö ,ÉîJlöŒû.s5# ì(ˆwŠúÚ°'BuɱëÐ%ɼÝPí›ñ9ž—Ë£MÊáÚ÷¿5?¾Õ—.Ž(�íì›Î"6P2¾âˆKñ·g/E|Ýót`¾Û~:QîÁg�<ÀãSCfe²zL.ïžúmÕéÜáþY?M�W5?�#„ñ=Uš±pö%¼ã� Æ4v!(wsUðRg_DÉÙ0MËZÁ�kh‰ÂA“(OÇ©�F^sZ<0x§¿a¢±|_$:½ü˜ !g›¨uÂRòOºi’�þééлCó_¼;7°mÓäö~Nd0mhº²«Î°VÏKçÇ¡ü$Ù]Ò}OÏÆ3%O&—ºö[Y³)-öçôŠç¥Çì3²å÷WæöOÑú T9–yƒ­>’ê,ÏçL­�Ë®,³¥vÉ�îc�¥Ý£O+$!×BüApµ˜gD)A’<Úï²;…A_ˆÍ"QÏ›ƒ.‘Ëùw¼�}§üm‡^²{Ù„ O‚î×îp/ZâfþÜ` ¤¶G/ š9]Æï*RíøµW>cxžoe#î‡x½U Í’�\‚çž RØ`¡šu}[åî¨tÀÖûŸŸ‚JâDö�óÍû¡•É›‚öÊÚÁ¿L˜!§I9dmäU}‡Ï-Œ¾ò‘ƒ.<­›yû!¾£+øf‚2S‹k‰»G‡�X<–‡Ý·Åú´—Â7ß"ë×âŽ:HAæj;¾7ÑÏ­Â.tG¶Zâ’jÁÐ;ÔnÊ@2VïÜÙ9¦ üƒ‚k\Ô¾ÊsVoÚ‹'Jçg®8^dypt8ò�5�½¶oíýM®v)Ž’¬w<¡9�ÀµlÒaû»¥�±`”Â87 û_€ígÔÞf…îšï2ƒÂsº&$ó€êÙ 9+×/CîØac;÷ lÕ¡$ù—)Ú¨|Øóa5•öù‚ç6-Ü¿l¹®aºì2®VŸÝ�3ý�És\.è­':·‡¤ŸˆO3Ù;b¥6»b>}yøî÷Ö8”Çð•Û-’/�W‹ ;­¬¼kÑ.Aò]ú†šç ΚDG°ùyZµÿíÈ…†õe{N­¼:q=0\ [£~ÉU§Ø­q±˜/_�ëpCoaºW¡=Y0saÇhíI´U¤¯]nda¿õ’Ý(âÞEØw¹UjÎÍ�ZÔ|΂]Bòf«�<â¢ñ`¶Ÿ3¯6ÓÈÍ�LIe‡48M¸ÀØ­æ\סGÄ¥[<Ä-´v®/ý»Å×”ßÅî–EK¼nâñ¬œ Œ×Y3÷¹¤ÎÆ7û[ ºl}ÄdûºqÿOÔS-x`ÖêŸ�?–IðO± i}Ì)ü­ö2åë2_vö9‡µûÑÛô¬×­Šña�/�p†šú \g�¹LIŒÝêæµæ¥ú9g  Èók0w¨Ý¬â_%¹ûëÛtZîY û.õš‘ÊÕZmÒŠ°j·psWßíHåu{Šf^Ãd¦D݃écÞÎÝíq‡EàlA6º­º!N—{eo`ÝnR£©~=¤¡¤^2å?<Âó:�¿v§jn GhmaAVp_ÝPâ#%î{4DˆÄPGý}t:©Ç�:ÐúƒÁý�KÆ¡=_f¹j¨Ûò¾;{Îí±du÷ŠᔟÈ7öòô�uÐ(fÇ|óÉprÑ ¨ÙÓÛáß@×ñÍý�Å{ãÔd:™b€Ã°8OÑ+d<¸ãäÞ›¿ÉìRX÷bÙé°_=½¥­Ëì<¼âÔõ|Öñ_2š¸N-¶�æÒÐ@u:ªÅ}@-Ác’wÆÈÉmž–å÷º~tè.î1Û¿ã¤ÒñÁ*BjÌ¡›žžsü«Š\bpÅ-^7˜æ­€Ø0VºläŸ';³„’±÷† Ÿ‘‘ÂÈfoN!¦ë íÜó¬_tZ‡ †�8Ä]ëƒÃ(�ë¯uvúœ¼È÷óÄ‚ÄzÈý ”Ê5÷¼{'ºêÛ¤)É=‚# h4ZžJÔFëqÁTn|WI<çŸO0¿³5žY[¶Œ8›=––PVSzåíi’œÆ“é¹E̹@[û;EsRcδ òyd{¢�.x(Qd¿0¾ä�Ȩ"£‡¹�E­9„îþËS áV›»ó‚'=Üã�Þ�±¡“�só"ÚûÚ ÝÓ�%u&ŒøÐ %¼bŸ‰µtìØ_P’"¾©‡ªf<¡WádÌ"î| ÙĵX/T„7ó‡ƒD$‡¦â�˜6ïðIë  ½äè…" Ø‚ýGÜäµ\û¾�ç;pNG­Ý ÷øeOí¹%œ+’É2–D=µwV 5¶ ·í�^.i´›XñEû/tûí7 ‡†ìáCaê*ŸlÜøIýòpg N›Šwç]�„®!òá Âù ¢>ÈE[Cd¦'îiŸ�òX›š.C!X‘cX _r³ñ<%ÑëGKyi r5vnŠõI™‚Þ?®Äßr><ÉM[Ap«*l1Šè˜1˜h-�ÇÊ‹‰K¦v†£¬Ž,E’,I)•ë²ò�Ñ Æ[�$æ;¾ã]‹xoÉýÖÛø-�Ûvö�Ô½ qCiŸ�1­¦zXRÝØ TVS¾DÚ{7Né¼°@6?>o.°þé\ìyƒï]BÁä&Z‹;¹Ô0TÃ?‡m�Qu¨U¶Ú9Çü Æ0۠ذFÇÉ‘EÛMœæAÞ Æ‘‚Mo³–}þ´¬Çì�âÿ§&Ï_‰_¿r¤‹–PÓ•Ç~™¸ßßRÙ�ž;E׌€ùÇ/†î p‰sKô5E»€Ô툛žÐrv‚¡Ó`zËuzªçNÕCo¯GÝÜ»ït÷w]ÝåïuÒû®_/¹ï/K‰é÷^¼½ÛÞêuÜï9÷|HõÝw»‹—¾úñî§=îôÝ0ßw½t÷½{�×Û�›Àwc×w®¼óÎÝï^éÙó—ºâ=Ý®õîöÄ{�uÛ×¾ôîÞï¼î¯{Îõw» ÝÑ“¸Û¡ÝÝÜ.óÐô»½ß}Óì�ϧ»¼½"'ºç�{Ñ{�sÞ÷³»uååë�Dç;�ÎóÞó„a®§v÷q)ó¾EÂ|¼>úï>÷^¹uÏ9ºõÒó®Œ^vf<_}÷ß]Óº9ç{Þç‰Êï={Þ¾öäŸ'Þ¹î¼ï;¼½Mî¾c»×}÷¼âï/x�wn]ÝÜ.åÝ×.]ó§¾÷½ÄÞïCÑÜp÷^õÒåÏwR/s½è»�¢—w<¹|é»×¹ws¥pW{»ßw}îß|è|»¾íÌ÷wnNë„è×w;{ׯ  é'AÜ@x 'AÒIîè’‘%pºr{ÞôÎï]Ý:ît®]<ÝîåÊçwN®û¹îùs‘Ç›�ÙÓ®û®žožžÎï<ï{Þïwyç�sÏ7/'ßuãqÍÎnqÎùy½7M�w:w9½Þô½Þ÷.s·w^öåyË—s¹ww“ÞöGžî¼‰yíîw\ÝË«»¯»ËÝwÝÞÏ^÷¸t\¸q^^^è‡eÝu•ÎÜ»ºë›£˜éÎî¯MäóÝ=îõÝs»¼÷º}ÜÝËç¼çyÞvwrçs®¸®WAŽæï+ÝÛǹÎ�¹ïwŽ]Å÷twÝ黾ñw}×zt:óÞï�÷Ùwn}Þ½râuîûݾ9×-×Ý^ÏN�Ý®êá;¦íÍÒ�uÚ^îÝvã ÷�o,^UÞëÏ{Ïtžì sµÙ{ÏwÝ{îf{»>^xûï^\ð÷º½î‹Û»»˻ޮxî½è¾ïy]/¹ï¾ö>}Õá{¹Îà\äî’»¤êî»wq^éîÞ;Ýç{¯sïºõ÷.nãº=ï½Ýï¾¾î÷nÜ·'Ýr_.1‰ÝÓ}Ü�5îóÓ�rºyïó׋îîw»®ºûžðô“Χ¹ºï<æáGs»Žæóvùº#§Í{î½îçK®½Ýè;ŽrëvuåãÝÝÙ»ï|úù‹ÎÍçÎ^⺹Ëï»ï£®wÜûÕÎï=Üî8ê½Ý’ð[»—]×(w%§=×(eî9�×0Ïw¯k—w/<Þç^ã¯8wÎô:.—|÷»ïyÏ+ºìôººº}:^\»Ýçœó³O.9ºîáww è{ï^žëåóëΓ˽×>ïs؇vÝyÞ÷¯\w]î¹²½÷¾œ¹.r'NÞQCëµï»w;¹¹¾÷°õÞç»Ó¹7/{�Iîï¾÷�÷^ïz™÷sãîÞ»±wœ¼¯zëÝíê+Þ—}ï½Ýß+×®û×{×xóvêNaÁÎHžo»#·Éß}}ž^ïzçKæõîÜç½vû¹÷n]Ÿ.^]λ{Þ%íwwºéw»Ðó|óÍîëË»u:wvNçSÝé/|÷œÄž÷·œ¨ÝNŽqsÞ¸õÎ;çž{»¤º»®ãºuÝÆ÷tåÑéÃÙéyw:5ï^ö».w�_}¾÷Ëß/—¾÷·³œä$�Ý3ÝuåÓ»³¯ŸO¹ðó¼äus^tMó£Îï½ìy»<ëï½÷×½�…åÝØ÷swuÞ÷›Ï�îƒs®w»w�]:Ä’ï{“ÝóÞº%Óæõèw{×{»—:è›Î^NÇî÷íTïÝÏ»¿\óœáçs»;ºîÓ§}ïy÷»Õîæ/ws¯yïAOuÍÄv.Mïx÷ºìsÏtíÒìÏ;Ü÷¼÷.w÷¾}ï{åônîû¹Šo#uîãÝyîz=wv#|ûß'�îó¾w¾§{úëÞîtºî^rîä^õï\»�tŽt¼ïgWKÞ½îa×vîÎvŽ÷º{¹vƒ¥w:ä÷½ÞçÝ}4ûîów�Û¯8yÐN�îìy×N÷sî®Î^ëïwupºæî¸�Î÷¹íï]{>ö»Üîwnîæã§_NOuòÞ€ûï{Ë×{Ç·Qœçsîò÷uó½Ò1Ð�îð�vés¹×N»¹cßv÷»˜ùvcÞû×Þ;¾uî½îò]¸®»\C˽Þö÷ºårïv÷.C"yÞï^ó¹îûÚ÷¹Ý÷�®îÝ×në®Î½×»¯^íp{ï]î2 þç§Ý÷¾ç¼uîûßO|½¤Þ'{·O9Ý÷yyמ÷;ï{=×]Ûœã:8„I“9‡ˆ‡"" &î!Ä0ržžE ¡ÝÝ'D asÎî“”ÅwtQnçNêæ»Îß}ÞûÜòîßwxyÞ—;^{y»Ý×wyÊaAÓw7½OwŽîîn¾õ÷¾xùÓ>}îÆ;·»¼é;ŽìrAÞ÷{ž�òó^—Çuw]qÛ¼ŽÏ½ïw]Ìî}Þ÷iÝï^÷7vïn¹ÉÞw°o—�Ýé—;w&nîw8Þó®î®çÎ/}÷Ï}Êîç99ÓœëÝîõëÝ×tÝÛ­ÞrÞ÷»Ï{½yï.£ºä‹»œˆw!î”@D¼$ä¤BI�"é+½çuw]=9\ºóÞéÜóÓÛÏ_p�î‰I9EÓ”åˆ0’Lƒ¨tK œ«×½yî‹¥ÝuÝÊ]Ü÷yó‰ò9Šî¸È%…÷{ÜÏœCz닜¹»Ýyóíç{¯/Iî—ws‡tç½Ü»ÍÞë¯L÷zN÷½¡Ñ ºW]Ü»¾^o¾÷·Þõ½˜å:ëï]äîq×^ïy½ëw—9½ÜöW]Ý\óÞíÉ8íÑÞãסÐ!ÊA3¤Ä:dQAwˆqƒ¢EtëžsÔŸ{·�Ýçòûºïyï*ééÃîõëï=ÞžîîwXuܧ»ÍÏ=ÜÝ×wtwW{ÝÝС湼׽ÝÝw7l“®®¾ï<ÁÞ÷³/ÝÝóç™åÇÍÞíËλ‹]×wW¹îõçnwמǸۦæ;ÅÝ>|Ò%ëçI/:ò÷—\s=ÝîW¥å{º»·:éÏ»¾ï±^󧺎îîã½×;¹NõÑâOvðÆ÷{Ç›½»Þî÷tî�׺çÝÞîwrh·N_{£óžw®„÷pÞç½x’šb÷Nî»;¹Òwn�/žòï�ê÷ta×w'sÜ{Û¼ãÝáìO9uwg+®íÂî뎻{Þ»×/w»Þ»�ÎÎëŽí»œ\®ÝÞ÷¾}èq»œžï^è×½rîR‹¾î;ÞRiñݽ×^ºî]ß{tñÌӳϽÝ÷¯;»çž¹úþ¶ú¶ÛUÓkMZÚþmm5V­~µm*Õµ¿émm³m¶×a%,”R†LRhi© 3&D1’ ±ƒIiŒLˆÆ ¤@Ð�¤h�£3 “L „IIA i–dÌ�– ‰…!-VɵYZ¦Õ¦¶©[YVÙ­«6ÒÛU6Õ­,Ì1"¤@ˆ ��†"HÉHBARb‘1��±D€Ñ#Œ%kZ[RÛk*Ûe¶¬Õµ¯æÛjkUvÚ­¤ªµ¦ÚÒÚÔ­Ö×mUµÕ-­¶mU}«knÖ·ÿ­k6ÖÖö­jmµ²Õ}mm³ZÕv¶Õf­µ5ª¦ÛZmµ«íj¦ìZf‹A%‹'›FÄ%c�ƒd¢Á2�¨Æ*J£E¤�¤Ökm-­u­5m©«mz·mi«^ÕnµµêªÍ•«ÚݵmoZ׫]Zµ½¶´Öªõ\´d3(£bÅF(¦j(‹,Í6JJˆ$4…2l�ªKhÄdÅ�ˆ™Œd3 ˆ“Ah1XÆÄZ0‰#&#ѱ’4˜RØ1¢fˆ£Qc’d(5öµ¶êÍj«õ¶ÕëéŠ�Æ‚(Å&4‘Œ&ƠѱHA±I$Ûj©Ë## ¤©1¤!€J@h%*((‘HL’B 1`•�h’R"ŒD” A&’žÚÕoUlyuÈ·9\ÔwBY—$£váÝ��aÇ]ÜwrnæîqݸÜênî1×:¸K»sww"�ÝÝJnÍÝt2ƒ�ÍÝÜ»»®9ÉØ¤ÆÄnW;®ŽW%Ýs¬íÛ¤.º)×QC›¢Ü9»9În[ޏºîe»�ºîCerK†æurW\Îw.k»¢—5Üé¸\.îܹЉøë¹ÎWenn»ªæ(ÝÎÖç»·LáÛ˜Ë�×r\¹wtîŽî3®ÑË;ŒBpMäÜístÝ1Ú5ws¸ásEÝÇ3º]Û“º5ÀåÐæƒræÎ»ºî²FÉ¢»º,ÍÈîë]×n\¹Œã®6µªUý—2:\»w'QIÊC—:îÜÎ9ÝNç#™IÝËœ7L ·ÎíÝ× Në¦îᔋ•Á!Üçiqvîçtt$„L)t9;�wvîì�Ý€»¹u×+—BçLsqΤRu×wIq.�ÇK¸§9‹ºãŽîîºw:çH$mªºÜ±!±lRÈcÅ ÇjÚ¯:7�ÏKÍsr븮»‹»¸{Ý!!K"¹Þ^w®åb.sǽ{“ÝnÀžî½Ü�"÷{݉ÝÔd¯"»)Ý‹;¼èç½Í7uØs¢h4c½ï!Þâó9¹-ÎL#wr™ÝrˆçwwvÞîÞbDDw^õro;ÝÎvK%»w»W{µÏ{¼rìnG{ª÷u¼,d½î¼ÓÝq܈±ç!îàs]wn÷]/w4›Þö{ÞèyÇ:÷tC;»•Í1ëµÂ$÷:9åsˈ9Hï<òíy]î»Î¼×#»ˆovän\ÈÎ÷½žë¤p»»‘ÝrD‹Ýïww½s¸Üeçs«’t‡º‹¼»A¹ˆ'�žžõïWy¸÷s×jöÚ­ëù$”ˆQ0Œ‰R‰BM52˜lFŒ‚HÀCdhÂI2l¦HL’™1�…I F$D6h°ˆfRÆ,(Ó$� Dl¤&D’fE“2RQ™ˆlÁ‰a.÷v1sww͹o{®ƒ¸ÝwžÞFGv¹DZ]uç*ç’Q¼Öæ¹æ<‚å½yÚénX�.ºW•ÇwW½v8k�vܺåïo5î{½y‚×7“½ësÊ÷uyæ�½ë­Í„]ݽ5á¯9Îs'O9w»Ór»Ý^yª­íZÍV­á!5É�&ß3Ü…Íží¾ûž]öóº^[Ãç½w}ÞcO8æ{Žó¯Mç½ïi.{îøQ^\§�w_.<ç¾öõÍßwFæÅ÷ºç-sNì›»v{µÊ}ëÛå‰3»|¯;»{¾÷ußzëÎ|³î+æ¾DW½×½Þ^X6ó�×Þœí>õÞ77 ;¯{¼®_]×Êø»®÷kÍÒ¾_<ÆçNï{Þ�}9¼Ï�÷Ý’6=÷n^ˆ`ÄWwyyﺾõÓ<ûçW5y|÷ݼˆ/›Çº|ï{«—˜§Þ÷»½îÄ›Ý× »¹¾úíÈ×…ðÝÝŽbåwuåÍ‹Þ^õò÷»|õ×n÷_>îÛ|>[Ï—/Ÿ}ï¾¾c}>9»î7˜¼»ÎÜøîïwËÞ�p®î½îòÝÞn]÷nkåæûî»wiÜŸ.÷w:�wu‰‹{½ê.˜¼óEé‹åçß:óÎnç}ÝÍïq|5yo{ï{/—6#–÷»Ê6‹›3ÊóÃ&wÝëç—Êø÷Ué¹·<½Ýóœå�Ï}ê}×Î\g»’Ýî¹ÓÞu}ÞõÏ»¯¾ïJæw{»£××{_O½ÞmîíË„o—>}zé÷WzéÝ_1{Ühù¾ïz÷v¯>[Ï»¯(½ëŸuïv¹\Óß{È�wݧ¸ÕæÉ;Ýëst¾_=µ:Õ]­¯Ö«Ö­\“h¨%ªwun[‰s»«™™+šÜŠæás�`™bƒ”[˜6LW ¦nê»1ƒNvˆîìnp£lœµÍ9Æîâ’ºî¹ÌîÆåÊJ79mÂF×J.ë®›\Å]݉4%¢wp�¥n6-͹p×+†œuËK�²«®éÜTrçuر¬;§]5ÍÎQ·9¹ºa1]ÝX¹䚺mrÜ®nnçd¹rÝÝ�±®nG: J.k¦�¹ºXÓº*àî×(¡šŒkÍÅÝ’æf©"î舴W5ŠŒî²sW,‘¹\ÅÃrÎësYÝrÜáÈ��¶Û]µVmm®µµrÛX¨ØÚ6ÔT"Œ4I”bB2D˜32(‚E!$‘4I†èiÓvîît-Ë�±AaÇbîv±;®ÁÝ×\Ús´.æNäÇ+œw\Ä™Ý�sqwX¸]5‹•þ¶ÖÕÿž«k*Ûj³Z©«i­mªkU-¶¥VÖ©ª¶Ú«ÿ:Û[RX),mdÛHh-�’5³kZ[V[kMª­•ZíªÒÛ[[vÕVËUf¶ÛlÕZU­fÕ¶Z«Wm­[iµµlÖ¶Õ›VªÛ5µµKZ¿òßìùsH§æ;»ŽG.�9:ÝÎ]ÑØÑáuÜç;s®î;³]Ý;'%væ]:uÝwuÅÉwIw]×s¸ÝÝsrîtäî¹ìuÜîîs»´Sº¸à]3—p�Ýw4¹ÝÝÇ:îNDîrqÜ\w:wqÝwHWû¿ÏýÿíÿÞÿwüŒ¼w(÷zö>µ& â?úü9/ëªé²ÆECå[úð¥yüÁwýïMà°o?ÞÍ 7¼«%Ô—‚Â+•Ý·($­xëÚÆPÿbùLÐ15å|}W“çü¦—ÿ˜Ö‹ï»±ÞŸOŸBìõPªzÇÖò"”^Ì7ü‡cŠ×5óþo~æ¦|ÿÉÉ¢Ì-¶`–��ih†¶í¹`ý„Aê ¬b™Ô– e‰©Ê…ìª×e o ±�¹gê§y+Œ¢‘iD°o|¤íÊíôuÃu“è(`Äýü™¯±«RŽyëk£ÖÒ`çÛÞ\­`gþyo®$ü¯{Ë„�˜)·”e+”‰åX²W¡Ítt™¬qçï‰ånCUA‚4ˆºõriAwt<ÃèRV.ý; äïnÙ;ƒK”ÑI^Âq˜ÝäJU«v$;•y̾oÛÀƒæp¡´¡‹šJ´KԹ–„�XGü(OòÜç®óNÜb7�•ìO™è5³½Œó=àÓ’xèæ…Ä_Q(Úí‰ _¸DÜ1ä( I1íóÿKmeÅ>s÷‚<à�Ö¿g»�íG²°ñj8†E)ß?ò fý5VA clrÙսᗺ,x'AÃÔŽ~#X6�ë½çh(í¿�`ø¢$Ø)¿ÑœP„¾ ËÙåhDr&,î.¤‘=TBg^a?Ö�ÂÿÀÚ ½¤�š¹^†�²)ÿæ÷kÞo«k Ú%n^o÷ßéÌæ’زZ’½º_½‹Ò踪*ÓÒGy½å\üüãhyY=‡®g§H¾I&ƒ¶J�uz_O$Æßú�æ˜(Ë7ûö{†(v-”6“š�Mµ„QyÉI¦èîF¤ë6¥ˆÚ8Wе@bܽ¿�Ù‰ËÖÂiK–açòŽÓÿȶÿ…‘ÂÈZ 'ãÓÀîdtF+žœW“ÆÀÊ­y=~3„üA¸³BF°Až2³pÜkwê’�ñÏ•=ÝgŸþ™ƒLÏû±—Ò>º§¶S¶È(}ž8F õÔM+’É�ý��1Ķ(•Ì?´µyl»ßMÏઠEAtDÅ3ÚÅ A¢ü=c0ÌhÉ"ÆfaF*êåy9ó:ÅÏóá=�!G”4Š_/ïUëþSÈÁº>Øc,.íÝOˆ¦†µþK_Sþ¸\Vì×J¤}?3^Mó{‹ghd)T79ËóuCL#,VFíqA<¥2…_;©¹ QÓJ™(Ό׭kuNÕ]h÷܉w†˜X{(®kþÈØÂze<ñ&ТÄûw16Vì²eIܹÿØQ©]pËÜ2ä÷ÀP»]$F¸ÁP6×J÷úœÄéþ¬½µÒóج}G=ã߉ö~ÌÌÂóý±öñ§“ª:ÓTÆu�æËÇkbµfÓ®Žî»Æ‘=>4ñ�l¸3ψõª WÊ_Œaž‘{ ìáøÐd^±,òg?÷ÐÕsˆø ’éØèqOŽËžuî¿Ëáh»5Ê3/ÈBk{NÜl¥Zlwröy6²‘7Lˆ3¾ ”©=Q’”Ý'÷:›ŸÛY^&Ñ0æØ—ø|רy%eXýl0î�s|…Q÷Òx™ŒŠÆµDMcÔÌrˆeî~Üš¯×ÚrXûWÆÐÛÜoŒˆ%îo}™.âírJþaÛM$—PôŽ/Q®¾Ÿ5¼ÑcI‹$6œ…J3cݯ Œ½)Î�*¯Š×ôçd{-´E `c%4° lÃ?ô¥©(ŽÝ,°ƒcfÐÒ+ J2c˜.´ì“�Šü¼=4I|RøÈ[U¼³ž<�XüŸQÍ77t�†.8·ô[�Ÿ*M–À¯�ê�K` ³¼æ—û¿ÝåsY÷H‘£`W»›¯ÄŸf2íØæ4ØÊÔSÏù¼éÑýü7ÆåU7›ÜkÒ‹‚aÿs“C1æ„{á͹¶?yÜ› Zþºª ^Íf%nX]g)1^¹Š[«j‘ýÝ¡ñ.¹­ùý²Â=Šö&¹#x× N{i.‰¤¶Di@jÅEY½å�k:HFc8%þ¶Ì­gúÛü¦Cé¸E~“X*”äÂK?°Y¡6ÁdÝ �ăžÿXWm•Â&U¯œã·;Gf[Ld\ں퉩87©)sY4 a9ƒe4°ü�B5’ç„5È=+ãÑ>”ò]NZW0$çÍPí“®sƒ—p€U²âMXÇä&8¤Ì‘¬ä‡§ó¶V�*óÂ?w”eïH‹Óoj’Ùòz Ó·�~×úËᲔυ6ÁEóuYa-±c…AÑJù“¡?ñÓ‹Ü�c9�ܵ±æ�1¯FªŸ¶ ®<û…¨E-•v*úÔ¤"\l?/ìs_é¤9¼‡ÑÁå©/V1fj펔­©5´�ÀÅô„TmºYU„ågmBpèN÷3�+zfŽË¯�´lìðäÅŠLôPTñavL�J†… lÒå0yåñ*í`ÇÖÚ}Â7 ž´‰&…Oú¬ÛBÈE™¨„ö#·žÞÖ{�a[„w‰þ(ŽÒç¿2ôÓ »g—mù-ñãT¿4N�íC¦{¨h5 .“E3“(®ß#žÍµþY'y·…Ek¥ˆ…¬/<«enm}d¾H3 ¢ÄÿZ5¹KØú_ ‚çªÍú6È3þ¿uÍ6³t‡5þØN&eýÈLÚMl w37Ï�{p4=ZdKC‰·?~烙¹šàQWCŽÖ¸åB숚µ­Þ¤¬ò1‰£%³å^ÖYÎn»rúªÿ˜vvÑŸ;Õ�§½ïú×éTs_ÿ­8ß=ª”aV”ËÔcL-QPr ÎÖP'ÂHÿN0Bagÿ$ÿ¡Œßù_½úx�³¥uŒÅ±TgÅF‰þO2ðaùL24O¯ç!…ޝ¿0·Ô%,þ•PÓT[Ô˜yîõ6”¥ ȬŷyP“yÉ?¨'XÍêhžÉ­ÿVq¡�ÚÖ#ýÙÌ5žåWöS1³!ukSÕÃÅ8_F¶,1•êºh}ÿŠÎì.¡*¬bn29�¯»äu‘\fÿé�!{½ŸÚ„M8ha¯ágp<â¼g·àUdð»Ò`=þß~6k¦Oá‹w�m†WXcÉX¹å¦´fÁþZž[6½rrR\º7®µÿƒvœAUïþC5ˆÈbó|¿g0&:¶hÕA‹³V©üŠÙ8ßCw°d]+TU²¨MñEà_Ƥ¦ ÁµúG Mf¾�ª„VÉoÔokdkŸY9T™m–qLÝU_–›ÁÅmA!E‰qz0©ÇéÐÀ µvÿl‹žG°ŒK·zŽu€i°tOœèwòFßq\7N§]“ǪdÆUôbIbµñ¶V{ùÉ¥/y®O2]à�hb“ûnž´AÉ(ÿ£Dq³~W|Í™uçþ·ëItÂ}P< KVÒWÞ(”nÖ©nHøƒá±Z2Ç_öD­%ía=ÏŠ»ŒS¤@{£§¼Mì©~ç—¯„Œ±Ë¥ Ð-ÉX‹U¤LF�qY—·iš¼ß�9^S¤ƒ¹G3%±3P%¾‰¸§; ?ŠJ{(sZÔ|ñ²ëþ±€õ&ú{.*/Ù2º+¦œÝC�èPÍ/ºº´¹¡D™-Ç_Y!Ë-ˆhogêx&›K©ãP³Jòs# –9NõGË„µãb“6|ö[W4&N½m ÅÊyQ1Þ)t“pe€XÅfá5�ÖZåΪ½`ÐÃD‹¯ô£T´žØ8‰XÇOI¹dsÝfã½xeñOÕ,.2.�ÊÏcÚ�yb§¼åyÚ,%ΰ5ƒÿ`,é4Çmÿ¦’|ǾþÜ7=bðËâ7lwLíÕé½ ¤� ·´‰´l]i*󹯨F�Øyq9f” Ê" ãlL·+ ÿ™Ôƒ¬çÐæªºŸÛ^ÎJš'õÑ0î§6ØÐºëçRxÙåZBÁk, %¸.íEâ±;Ð_"s•þY� ˜²G2(?»¤úáHá}zžÞ�ˆrɯ+à‡žÔ4�J¼ò´{¸lÏܹÌÍÀmBðp2eÅø†suu$7çÉ^Ž™N¥ÈÎu™3œwEY} Í&YúhRÿ/j^‘Í™˜>Õ†êMQ÷Œ^,´?a Ùí¥s™'Êh9?¦úu¹b¼Ý3wFŸcdã§Jý@à >uñðhk ñ~Ó¿Iˆð1_.bO´_Á}ßË ³ œÛ)A‚K¦1�W`¹ÔiÐþ‘G<û“o8ͬ[Þ´nJ°u†'dàüpPN-Qø²�F/šÍé2çûFÆ:$G{|n€Ò˜1„â´¥{55ã.Ù ˆÃx¼ñw ‰,‚üaUìÝV3ù—†FVw‹ëŸŠT”é@|²¡ÊE’A1Í4ò”Q>"Ý5ÒôsÏlëŸ(iücŽ p�ÀÈ?Fß|úhÉ={cå6eˆþ–ØŸV@_ʸaJåUn…&^˜uŸÑA®ï?ÚºØ/¢?xÖkKßÃ0˜@, r¯ˆÖ'“»‰EKÊζ«�ñH¨Õ„ÿÖ]÷ôE½«n„·Š§ð•‡Öë©LW¼ô­7÷H&¦¾óA„Zh¬“‹‡âò.;aÀ•«O€E”“ŽõXݱù‰ŽB=ù™qÔ*ŸÖB´ÑóŽxB‹i±Ò¨úÌÃĤJ6°±×ï“SÊ4eD¢ÁŒ·y’M ³¤™Ý'J'E%˜ÌPNž-�rç Ú*g5¿Ê¼àJù+q ä®5rÍ�í Š¦ÿ�¾=ÎÇßs¿¬¸!áìÃ%!>H=ÞeÖ7Jã=Áá5þ«×ñ�—3; trFÙ5ñŒ�#Ë�^«d¨½¾øXJ$”nÊLëUĺ‡#f@ïí”!�ÛL¯š~”„G�Éæ¿ÁAv3?}m6×üZôH\I&ËbÙ9¬î¦,ælø®g5˜þyù™Æ?Œâ0Œ0ø)%gWW(+Bµ×õŠÇîYZqÞ?¯åÒá)6³EÞ¡ê·§Ó áüZno¯ö7Nw¼¨É±ÄÌ9_잯Ëä¥DZƒ$.É΃†£�Ä 5I9ü EÀ@“9Ͱî¦ÿ‹OŽ!]yEü¶ÕêP<ó‡Þ-Ã+)€ÂRÃûÞ;]HY°h�ÖÜŸCƒ_ÕMÞ§?D·Nn½Œ iÖ—óqÑ_L“<Åú‹à-¸¨Â€>å–‘¸ôSY³†O¹ê€_²0†SwÕßd“ UY~ùå� Ò.Yâÿ­J&û°§“iJ‡¦Q°!ÊRv¶n×è¨8€œètåa øöbCî}g]Öêi†q2^( �”½q÷rgÚ�»Iõ{}.TdW“Äsw?¨ñf(&`æw±ÐÏÇ›°X}zœéÖŽƒ�âÊèJžíñKo˜Í²þþôû»ÎñÀ­¦u½ÑXm‡�<¹Y�þ©f~-O±:TãzüŒýfL#1Â^Qº®¤ºÉø¥¨òÍìø€˜ÛÕ¾g…>~•ñV9±FÀѪbƒÅÓZ[Ö(‚wAú…ÚHÒ¶ßn{EÍîÄ2ܧ£BûAóéòéŽs-Ç.þ’Ë¡9„ü8ÒV1ÍrÍf�(Ú0­¬r”Õ$¤çÖDؾx�´lþ&_ÐB~ ô!ãS+³­ÆyͯÝ=5ß7¨�K¦&Ôxº¥¿�RjÅm‰skTseÛÏ.&ìRö àï†!ö/�®%+ü‚5ò1ÂÿÏ@òKzæ1k9Eÿïô‡÷.ã'Q�x‰gÚ¥±S¤CũȚð•1ÓÛ»7æ·:Ö°½ŒiاËùe#2´ê@§ClFYš÷g‚µ’ùP¿xzú¥É|}ŒÍÅ×üÔ;ÿN€Á(ÏüÄjãÈò¶eFGýe¨Mé®­ùÛmox6 Él”HT‚V‡Ô¿ýò£Ã dÙ¡G"4WúÀk:# bç{ÿ°¥z‹¸¦ouÉLlw„Ê7¥äð§_þù8 &2nb<Å" k†èª×»žùËß ºô¯¾¹Ýø*ðÌî!†¶Ý_–à=Õ‘?3×ÙGvöMêÍŸþ_®s£R·ù]3comLjI_Ýrþw C¯YÓíÅ»IÅâ«øšbò9HÇÓ±(ݦ›·¥(²kçhán÷^¬ŸÜ9¬léú®Ì-Í¥¬5*JþÖïë¸ &æYš ±ßŸŽjµÄ¡LqÂn¢úÐp¹çÅhWßË(ðàËÖ=_Œÿ˜/ýõw��oTx0;wÖûˆ.d«³îL—LjØ–†\¾']9BìhQ™(‹,zm�’*ĪÏÏ™ûC BAÒK °üêäÚ;ŒÕÒXO;ãæ;P®)¢½)~÷ž˜2e¡wÁ‰’èäÈtàtÉäT|F>Ù§Ò¹ýÂB íÅÎk® œGP2â×<›íWKœÛùÅá-Æ·L@›éÕ éÌ2 ×ÉH8ËCMn‰ø”ª ~M�x.F(&¸�gË\κž/FÀLyæ²üß'g©ïnf¾ÎXi ùŽÆu‹Otñ{ýFÐC ç�÷f±_×lÞ+ñ~KˆPwçí>®rX_¾:¼>ˆiû© þ ϹoÎáïû…ˤXÔcúéáÉä?Q?A«”Ïï/ }oÂ’µytì ýðQŒ�½>éÕ_P %Xô˴›û>âžÏN¨¹¦Ý‚5Ìü³a w¢ÜR„«W§"îªÀˆ5k¥2¼‚$DsÃùW²Nêß!¥�ù7òì-|ñ~-<~�¸;¼åÝ9ñD¸Ó|=:„œ@‹| �¬ƒÞJÇ/&�¹®n.1�×ZLc¬3ä�æâo¶1Ž8†fŬ?Ì%%TˆR_˜þ1Ï_¿ÿ:/Á “ÝÚô¿¡ºùq }R«�E'v¥yÉ’S¯p]âP*Çó×þûÏçïL8jó7¢*ëPPz0’”Ïh¿¼~bp™›,ùf¸ï£ç =/ï:³ù\06…ìäÁêWï² t'Çe¹c�}eaìujžagu¶áÛ�.ßµ¯®¼õE“‰à4;Ý}ªæ‹ˆæUUø7›O-N\¬âG»TÒ}6ÇlZ(l³Bß ‡6è<¼=á ŽÅ¹ìýʳVã°wtЗrwm¨´�‚Z§g õKê)^ÜCWò¼|X†-r¯&3ÿ#F¿Äç¾-ÿ?jÝÃö±„� ;3Ї-©Ô¡þ‘u6�W/ƒEž'ˆ6íç‡ÉÎ0¤hë¯ât�¿0äak''õ~WWç„X¯Z9߃Q`·�|jÆ ÿM:Jm“£?šîA_!W_±öPT”]à U„k¢Œ?'Fa&×d¿� £7'!:Ogù2yÏ,·w§`?ç¼ñ>õóì­U žÿ�¯¿èm˜cT‡$”λ[DrÖÂÿû�‡õ ú®köÒþ{WÝŸï¾N¥89¸À­·ÂÁ[Cjk¸Ï®M”ùm¯ßó˜ÂîUºZÖ{�ãdµ]¥¡¹YxòÛ¬é^'Õ T#™ Tjnê©GJŽŠÛ®–žXæsþ[úÙòþŠM§Mì]"؇,k¾Ž.'m8Ox® Ë½'ùÚkŒÕ;‡`äâã‚ðâ ¯›‡N&#ç'»:™„âijœ‚­�êÚnæUSY÷HÛgHFŽýëÝoVtMAÿ|óÊ\a�>NÑ;FÔSºZžò »¥fVÍá° Žæ©†N ‡ãÕ¬ñÈtÍoÕškîÙD±¡&0¿ÃõÅ~¾|W¹µ…j¤ËCåÑ€Ïpïî“/B|3]ƒµY6T(-¡ž‚K1“ :4²–"déXË7Õ[CñʆçE)^ìh�cW‚4œ(#WãÖ1ú<*I#ÍØÜ|ò®d3á ÷œ÷šk,Ï!Ô|ž×»¬æþ(�ÌD›YtXEwx‚ •Jf¥)¤È»n­«FNö–áí4¿˜€rVû¼¸mÃ�v4•�×Í=rÊsN¥Š ËáYËãõuƒ޾à¹�»¤sq–ÉCï^ÎOã Õ�s«Ò?ŒdW�‡â ðÓ„îÙîÒ¥°³t‹BˆË²oV÷¢FÔ3œÎùþ\´à.ÜrEá´£%ÍeIÐ^–Ùíȱ-Ì“�„·¾ÌÏ®¨RªÆk íñ¹Õ”D1ŸôSKÿ�h%ün�—¹3øþ]Ýc_¯õˆÒ ¼uJøë±ùSs›“€Q’À=Þ·Ínš”#Ôʳ‰ð@èÐ79³ÆÞÏ’;Ù‚¦d.d¿}vøT5Ó13ÝYpw Nˆ@ݳzP�&Ì/ÕàE�M8†cît1'�Ô @CFÔdt»Â+¯Ê˜9âÀÀkwJÔ˜öýG4›p™'øpÇ>m)ÃáÛÚ…‡ó¨pÓ�•ã‘‹7m>-µbi‚ùÌ^n¥êZ¬ Ô«Ñã©„A�[ã#‘€AÅ,s”@_”�EL"?=ÙþMcò\á¶Û–8V„lTßÈJ¥ñ¼p9yÌD¸f§%/-ð×Iƒ‘ /é®nL¿!ä�Â&| ütÔ5ìù½i98Î-„<—h@Áˆ\ú¹i,KÛ�ИV7;ÅŸ›wI×€§ewÊqú+Ê.¾ãÈ;ë'ªJpÞ4M(Òœ`ºÿ¡|¸{,Cq€Ùç©……pvŒÕ·+LžJ']gÀ{F¥þÊAL†áhÈÔLî Í,»f Ù«6öÓ Iðª3¦­‡ùé;óšn6z PH+s+±�½ÔvëÖ­A–]jN Êv)1É<¼ÊrÚÁ÷ø�—ÛkL4©Æ]6EA•�WžëÒZqê�“woª w¾v‰"ɪÂùÀà;O©<{_àð±ÈX~;Þôßç±�òÌMž ç�y{o.,|¯‡{„Ž9£R»Ìcž³Ç©0‚çô¿>´8„4N”Ú„Îl½­„3Æ¡—Ñ?Bù›ä©&5•œ¨ù•__âÆÀ]O�pÙ—¯óçd ”k{ÿ—§KÃÇ©?÷Ë£Ÿé÷û£‡§xŒ�ÌŒSÓëýšÙ°™¼ˆ’þ°)Óª1†©ÿº‚*åÖ&_ßí¿åAÈÞûløŠòÈ€ßE’ùDJwHê‹1Þ·;çv–'çGéGBªÙ_­Ù‹fÖÍt%�"¬S븬X#…1ûK+µ ìM¹is¬Â�v{­u´ƒµ0¿P¤šÌÐ.¬6ßÂÛ™.DfeßgÌËùÑ™ ƒé[?/ÍÙùó8”cƒi‚{õÈòÓ¢Àïü‹#q§¢ø¼ú¿vÆÒäÇ@ñ¸[ísi=¯Ç¥óæ›ûÝVQý«µìLÓcü)Hh,ѹÆúºœ8UÜÿ80Ÿ›=»Ã à)Iò¯Rs‰*èÃpBBûC!R~¼ôhÇ‹£˜$OL›5ŒÎ�Œ!õ�dÞ7èŽÿ‘ýÞ>Ñ4ÒåcW°%Ì>Ö á¾ÛÌ7Ãw‰Sìú›Áû}›ù¿"«‘÷?‹³MÚY¦œ×“Õ�ë¹qã⑯5ž+n|!Q–XÔɵÕÄ£'z¬øôE³°.øGH´pÛÍªŠ ÔZ]>O¨ŸRO[ÏÞµ\�ϹÆBª´/‘QÕ³ê{êØðàµcó^M .ÁdB03a T£€ñÆ�GäO. ¹ì=IµíÔ^Žî‚‡Áå‰/ŒÚYå.`ˆämXý`™,çRë¢wžÁ/ž¸…às½ïëÆ‡e¹Ôz ˆä@ñIvìJüÝJ²í÷òuYŒþöx†…ÜyŒøý7,¥X³ñ�HááaUá[¿y�ærÔgôù0þ,çPÊ™»çÕFË{¼DmÅ[(?ÓßòUwy7ÁüÌ•,aMx Qî²òZÃ"V¡E-ÏR¥j›½ùúoÿ¦üÉ‹h!{'×^šÏÕükÀ~)õžz»¾k/ÏóÌnK~²-”k7ø5sóÇÊEÄ·°Yg®ÝÝÖlŸå9m7©:Œ%ê»Ú„þÁ’Õtçú¸Ìî/çGœÏ?µÔ"úBüÖ£ÏQ¸ç7¾«(ËçqE:z-9™¥æ˜*\g®©5LEÌ›„ð~·M,FrÔŽmv˜Ñ66]R-äAÉðÆÂí<¼Ø¾ˆèèáá´K3ùŸ´Œßö)ÒŸ@X­`ûUÔ—o2¢OŠ Ç…XŠÙ–XµÍ—{"º}©ÍŒê:Þ]ç\Vlu|8ôkܵAA—ÄožÈ8E ‹ßúo•ùWN¶Œ-o14%îß)mÛ£< CÏbž7C?N]Ξ3ǼãÁ;¤gµÃZ\aóc vämäww6>žk68ø|8Ÿ%'�3Œ›û#t¨å©îzíŽF E*0ã‹[X­�,Åßî%1\GnIJÇX2)Ò`L¡�¢äØñöK9wcïuh-¡úûÖÞÎ aÏoJ]b�V0î.~½,!³ãeÔXy: (3¥ a½rÖ³¥ý�#ì%� å1ôš7Rç犟«, “;øÉ‹CtöCÓÛÄZ`=•As ´³c¸ƒ�Ìn7ºoï½'?SÝ×§qêg„*‰ñ æGlND/ÐsÓB¸—=ÒÝ^ÿ.\ÜB˜FJøÁ\¿Y¾‹ÇHaKk2` öJ#ïj3ñyÍÊ(íHEiÝÝØ¢·¼ÿ·Ã¤‹a_óï³\ëø]'ÌÉpÎêd?†#Ô*¶¸ÿŠ ¼EŒ¨;.¢mÀs!ûòaÞ]úØt!hõý˼”›ŠH¼eò\ÓMÌ µ©PO,ËÔ>Wõ€Ág¦yF´ëŒ“às u.ÐmóÓ`ÓŽcoɈˆþˆˆ‡àˆÈ" É"C),B˜J""b€‚ $’"BÁ£ašJ"3,’a2(†hŒLP,L)i "�ÆB,…ˆHf(#$”Q¦c4”6†&!D$‚�¢�1E€ˆ# $…™¢€±HA„Y2K2i$ÒLÌÙ„ˆ �2 LÂ1È%‚&LÒÆ€ É PDˆI’F‚Œ�e$ÆdÂd‚0Æ�)ˆRL‘še‰$Ì’LTÃ$Äh¤Ñ4 I‚ ™�&… �1ŠeHÅŠ“ X #$’B2bb„b…‚TlIf�Bƒ&ȱ)DƒJ`¢HI,ˆ ‘DSF¥$‰2B„¤¡4`Éh0Ù˜A‰L"H4È‚bˆM� ŠD)66ŒŒÈ‘˜lhÀEA©@ÊP¢H ÆL”i Hd#$3M%& )”¢K""cFKbLB$‚Ĉ6(FA€�È2"2&Œd‚�‚Ì$’2j$Á¦�&&JZ66ÉX‘¡HSM¤… aLÂc˜É†hÔc(ÄÄÁ!!@2’I�K4F™¢††„a0‘eD‚%`Æ1±i4fE HÉ1 ‘¥$Æ$"(Æb#%ƒ¢D0c3©2 ’Áa– ´I£(ƒ’Ñ”a”²Y”˜E’C60†’&‚c4Ä€&H̃dĆ$�¢„Å’$Å„ If¦f I’˜)HJdÑd„¦fE,%H ˆ¦S2a"f™"d€SEŒQ!‰ m�3DÑ“c"Š…0Q$FÄÉ R LÒBfÉ‘$L�‰¢MD˜EhIDL"J*HƒL’‘¤�%ƒ4°dÙ%$¤‘`Äd’! ÊRƒ ÅQE ¦ÄBa�¡±0f4D‘Bi#!bRQ�Ɉ¥&dI$É„Q³ƒ!(ÌĘ*aLˆR,–fˆ²RQfJf`°E&‰052Q“A†EŒQ�$Œ™†eDC ÆI$B(°d )E¤LY2&B `4…&M²”Œ²”E$‘4@2Iˆ&ZB‰�e&h J)”e4�¤bhLeLÁ)FˆÐl�dIˆd¢ŒŠ6DÆ C"2 š�2XÀ1ŒDi˜IHÅ‚ °”CAŠbLDd¥"€L�f“¥!,l�dLC)H“PL K!I#dˆ‰& 4†2¦a4&&XˆÐ�˜ K D˜™fb�ƒd‰�&‘¡Šf#IIH,ÆÁ$„’ƒh(C dfÂJa¢É1I@ÉšIÒR$’lb!b”À bdÐÈ#“#$š“Ql%&H6,P%�F%0È3 $61ˆ€S"Á�&F3 �”e¡³‰©Œ™”!a4šS4³ ¦b€$„ˆˆÉc 4„Ù%"ÌÒ%„”�°ÌF„É‹ ’–‚6"`¢L¤A!‰…"‘�f’’CKM·�Ízê£wu§Þ•îAØ_3=é¼å) .§“iWÍÂ}c´Z•‰r„ìÙGa™ØN /(ž+*ÊÜ÷=Ä%VŸZ�\çÛƒSÐAÉüd=£±'{Pkyݱ²ï mJãùb°¯ZhH!_°ñá�{Ž?ƒˆðÊôÏŸ‘ß>F;£°òH™ è¦þ™K™ûxw%'¼âï’nc\?Ë‘ì‹dʇ@ÙÍÇ)¼5Æ¥”&í>tƸÄd6ÞX±7üO‘©¦ûµ¨5>YsF`Sôl{±p¬CÁó(Õ:ÔºB­§XœãÕÝÒúûðYg.Ùˆj¸@îÅÔC¯�Á|�s:f—@f»�3†úÃŒ`{ƒqÊ5ªáµ<¯=¹¡ÒïXF}|MÛ¥¦7vT0¿3§ñ[{êͱÉÂ3^hë³î<{ä\'8½™—‘§œù×¶¼hÎ#"“RâóG¶â×¼¶ƒÌ‡›ÅöeÛ¥ëw—]¸È^ߘ„e.‰Ìï¼$­1 ®a$σьòO®ÿ ÓmŸe@ñÜ7:êpÕ)¸ÖWÑû>_>£yDâïÎz,ͼºÛ`¤Û œI匬N2üW�¤¸nš”ëEl‚ºö0ñ7’¦ÝTvxåýѲ<Ú��|cº²ø¥Ìz`l¹$Š-N´æz¶‹ä£}(u>ök/Š%ÀÜ` ¦òÇ¿­|ùyKw/ ½lYŸ)èü0Z;ÞV«ëyÈØþbšo_ë¦Õ·®äήe²p·ÇæÝ51>~]°2åfÖúâSU.àXom~¤ÏÜÓ�=¶-Ðþ¸¡¦‰àCÈ)´ÇÇ+e¦¿ÆÇå”fºs¢ôàl£[Ü!Ÿ°¹$Ë1s|h``ðmBö�ûÝ΃òÞ9•ëé~û㨱먞ÛC¹Ã,’v!ŸÔ¦dùèëW/üùw–`;O›©ì>gŒ8ìïïËÉûcK¨t0w] �;{3Ïi$˜HÓ¹²ÏßvLtì·Á˜8-Ý‚ùÜQÿÛÕ•'Br/‘ÿWŠ÷újýÜ�çÔ‰.:ÏdÔý½#OÛA�~×¹m›÷å=O?m?2/ªìçåþt Oç2h½BÃü§Ì+ßz}RHŸøù{¶];;Íì†8|W^)2ýfþÆ¥®ÖÌ,tg+óƒÄlã,ý~íïÕ—íØ“˜qdâÂ_T´”g‡=ðÙ R;M§óì.»}¬‡d”_í¶ÖåÍ9õ¤g™‡‰Knm›a5ï“j iâò£èSÌÌt§žàîmjP4ò&ëÙ9¦·³Ü3u†U¾(Gf_ÆJK”Ó8fÏæðèpR|€Ñ $4Wï×70fì,¤ßh˪Õo:U^ðÀ³ÊNT…¾$ªŒÏ|ñoöÑ@tS‚$ §•£BÁ7ñ.�Ý­ ±1T ;0 ®éàÇ6%ù6×_†ÀܦËmg“rWS�—î³mQR±¬íK;¡™ÝE€užætèZ៬†®è–c øú½Iµ¡úìs»j< Ÿ³á{î¬á�D-u^¯È¹¾6•èÎ}ôµ¶àŽ~$bnÕö¨¾+*(0n<£§Ò›üÿ:æ‡pÛ¤åJJÛ£|›Bv¦W¾?W÷»¬(1—¤�Rð‚¸}[‘VÝàL‡Îþû»aîIj‚Œ0ö�ñzç‰zùòž•lãÇîJ(ý�°�ò^عæ†ýåè9úúõ]M�d¯WFíh»]{w:unº~¹˜ÆWæ˜ ¾�pã:÷yuóËgtÄËôªW0{ß}áŸàÞ°¿\�R1¤~M‰!cžø´³Ül>�`6ЏåÌÙ¤Óݺñó æ+ÐE©Ä¸6RKŒQô´ãùø‹¡¥¿ÎþkW<¸Ò@ý—¹n�%÷B¯ø:P^}åsé­rÒ<}ƒò¤=½Ã†Çyaƒ»�uårÞÕ§—¸™zË¥è1Êyy;}µ‘t¼¡›‚„ÏM“Óe @è¯þC¬×\뻚�]ô>ø‘tŠ•D›ÓÁ;|ØJO‡,&{$áýU ØR픣˜RJθ%ޝ½Y”kÌ!fQôk]�˜ÄÞ,êÄ~LÎT*ùǸªáÿ!¨rLÏѬÔÍñ¨~17–fÓ·ºMXè—P%Áv{ÒZ_õÒ$âzé�Teýu ¥½˜t3å ; KdÙ[ß•.Ž†Î§ö¥ùV}Ãaôµy|_¤Öq:B'þ­Ï©Ô^ö7#ã�¹ÞÆ¢Ò¡> 'ȘÐ&xËñõh"ö(F¬Ì|ï_¶ß�bg‹2Üh¯fH‡ d>iÈÏFÇ6­¼)ŽCu¦ÛGË£¯97™á[Sõ ïçÈn€0"Ýéõ.×VtH"µ[é‡ó0Vß_·ƒ›ºÂro®^Q¶.>”g÷¾6 à`­2^ׯ£-XÆã¬ÏMû†/äî‚Yáníboßë:“¥²³€ÚØ„W!HÙ·a»|Ž™HÓƒóÍæ-ÅæÌ#P ‹H•Iæ SCÏ&*öÝP´8Íè­#òe?ÝöÜ 6_Sœ£-óØbå4Ì|öùÃ÷ ñ'’“oKh‚D2µ‰†�÷wÐÑ µ^3ÄŸÕ�ðáæ.àtD©ÇêÞ:%ÜIð&ðM—Aòâ„ýFnQ]v—ŽAÄ}`^Ì•[/žjò&2‹"U¯,evÌ;? …%~ncüoiÔKe£ŠQ !UGåCØ‹”.dìÍuŽÜ�fð"g§& ÀAÁäͯsWøÌ²ûR‹Ür¹ÏeƒKϳ⇞Qî—îO¾¥—è2?Í2-Q&*±gµs"pk>,§˜8 m%˜8dŸåšO冒Mº¹àþ™ÜOÚRZØÕªø�LÜý×ëžÀ¹³�U•[ôø9�8s¿±»YqåukäSZ×9è˜Ú¹ÎNû¿ƒ ‹ÿ›ïƒ™a{̪ü¥%N0¬æ †Ò”hfz£©xœªGwXÄo¬B J·ÍÝÖg#|¬á{×Ú·5ôB.gGmO³M 4Af‘*p�±Š³vî!ïò0ž�žËÝ_·ÏÍ”º¨P¤Œç¯za?NMéÐÅe �žòiø»œ ÝôRtœ zFTº%€GĺV`�ì‚i{6ifû�iPÌ^Z7µŸ‘øtæ0Ÿ'ðÕu7þ?@O&Z,,s¿;‘Yì4ãtÎÝ»Š·¾Â8w͵³­.ìU÷ñýg°ø�çÛõ¹ìHåþxGâó�„¶ÇÐÇœ«ÍÍ.¸pl7²}! šg“?ô6o¤ÿ'CâZ4,Ǭ_ø×yÔäï×4ݯŸ|«-�V0ò­ü³ Ï™olá¥X+Ò(]P…?’‹^l4Ð8cä0ñü;ƻ魕²áG×XltØµãšæT8yƒâ¡6ûbåùý¯[Y¶oÁÏàBÊ.öTÂe´wF‡Ñœ/º5Ð?�õþ÷^zj-&5`ÿ ˆÞÞú3Û¼ÙÝ>æìšo*ÿ›å\ðñ{šsN% ßÌ|q̺-½?jÓùS>7¯z´3¾âýY»“#GmM&îb3½Ø'4|úVQáÌÒ–y¬Æ•db…Ï4Ö¸œÝ[–å@iåŽÖá ‰îkÂV™Ú N´MnÂåŠÙ¥ù`-­Ok |y>U+EŒ$üì¡­¶qqÓÁãž§Íìü�€SòÁ[qšuþtÖβ§åªf[l³Þ§‰ã �S³ÕY&z½Ì·i6bøèF±³d©ù�¼hþt‘oËW •o—Þ±`ȆùA‹ÂÝ×yy´Û0\UóUŽ+¶~–w}C+å1=Gâã¤àëPÅ]棾ä8Lôصyôø�FEÆÓþöÉjÜ‚G²}°%óŒ¦Æ}Ô»@Çïú=¨£¡Ÿ²kCÄ�Ü\Wú¿»Ì F‡#`› Þüœþ}Õ|fJ_Ïh¿×_]Oý¦�Bã\³Þ?{nºhk_QìÉ—°’¼�0yj°/]å)KV’;ÜË÷¯Vä½6ht,Çï<çÃä6T©ë†+¡E V(»ütf÷õ>¯ÄxhXÅî*‹-ªörRêå:ò™ZÎ\ã‰q({戹 |Ž6Ùò-»“^i—¯3Ð |:j×wçCU¨­f.´œ¤aBë_¹I7f'¨pÀyøß¾¯Ó“ï®ÂÎýä¡Õ5öDÌnîÄ!3oë‡?¸tÐQA¶ëYËË;X/,z­ÛC9ñCéËŒ{h®Hq¯YX6’2þiœ…Û”÷¬Õ§¢J;×®gÚ±ÎÜx ƒšµ8j�1�ÏØÆ/�Ûünà‰qtCå†î›�L/Þ³'%kŽн3`]Œ–à÷�îóÙÍþvÆç‰Ûüg1ú õ1[ŸD¦OŒÎð[P(�PêD’wHÑbÇc|Ÿ"û©½yâ~£Î¤Æý|~B{£(õ\“¬ÇXØÆ²—)Z¦3¾$¡I»·S3oŒõݧ 1Íù‰¸k$¦¸Fföùºú×G˜p»•�NØÜE´û 3¯æž¸‚Z+p¥åE–y¤0Þ9y³ªfyi¸#ÕWÞç˜xÝæ u) ˆŠUèÑäa8�o¾èî|ç"Gt✠†%6)·te,³Ès§›£_êU%öÏZA³NÜõPcD¶pžõÄaæÖáÏtåqˆÈàÕ�¢æ—|¾øÉ�Pò8#Øt=JeJo ¯þuÇçÊô³á¥vÊ;ÕagλÁh/�˜0T™Óeáa¦×3ÃBI„áÁ&Ï“—1ñŽ”ÃTV¤9-Ô¡Ês9Ôpä1ã§é�ÌP�­`–ü­©._‰ú¬bII5U>$‡QüüÛ•áÀŸð'a0ÊeÜ�kb!Þ¬=€Å‘Í>¥ÃW ᣯê3¬Á9‰Âó?wÔ;^F)!y4_ØÂÌ_èëÅY²‡-7õnŽÖYq‘%µJÎ%öÓ§]ã“gÞúu! uÃN³¸ý©æðç„ËÓ�¤è4—ýýï™ypæ�Ã4<=�ihÜ;ÿpoä_д38 ¾Ánçó›6‰Ä'9õ92ráêc,ü~ZÉiûó5lÚû(±Ê“æÅäÊ7Y¹²+KêF.ö{œqeÓ¼()D¥®ë}WZ}]É~' fþwÌ>5̯AøNÇb˜Lü=5 ›¿F–íµÌá ’«S«Ë¨ÄÍáã �Çâ¤Õ×x¥šë´ëBnêj/$,�•jï÷BŠ�I î|©lZ6"{ýwû~œ÷¦‹÷œ£·‡¹ðwè…^¦ ¡‘ësÝÔBd@øvžÆ!Åï@¶&²_#rÜZÆyjK‰jû÷ýjI< –4ÚP–"E9¿%|F}þÁÌîÿ›çùºËåi[ù@~]>ÅÖ•{éÐd5Ç’<Í�G±•/hx“ä˜ ¶žŸþóN5Æ%ÈšUÛ‚3HOzñTap<ÑŒu=±Mý9õêÁYÙ9 QJ–·Ì÷×#¬mÙÑ#¦Öµæot™Ö4¼¸ñÅav3œ›o^BNàA�-¹Mêë#½F4z“Gô:.®øqhBWXßYâã¥t3.È‚dY©�²öŒè÷N’¦ÔŸ:n¤ÈÀ¬{ïmÂeqò¾2ZÄ·‰øí  ãD÷YhGý 5þÓ‘·­ìWµÎÜ<óš2,Iƒ­CÏ”òŽž”ì ¸¬<œ»n¿t8Ç–yZcÒçZûÑÔ¯kò7�/92~´çpþÞÚiêÏxà5+ì°8>Ö»½âyõ»ÓhÎd¿¢QìZ*‹÷ÅTÆ^%ÈQ 2��¹¤~°Ç·›y¯„~qÇQðx×CoƒäAîeûËì#2�;)Q›–ºÀy/ðê'°^<Îí´7®—Žå›RL˜ËpýE9ƒÊQF èvzØñÿħ5j=µõ"ÒeÜÏW‹Ï¢¡ü†!+>Õ´y™ÔlLE.­»z4W;_X‡¼q˜V€X)›Ÿám(D,ìnÈÿ¯9|‚Êkò¿˜FqSßR;«^N#¹|ÿi>Gˆü—~Í%N®ƒ6d˜¨ØD»ð äÿÈŸ={�ûè¤ý’Þ9žIïÏ~/hݘ¼ žu*´a` Nö’7x›ÈŠ�ÕKA6ZÑ·Égä`å”Ó~׈ÛZ—àØ�»úYÒ¾FYcYv¥_hº³(…-õ^/Îyêö“î‰_.ËQ^îa]æ�w²º”°­è±¨ËžŸ’¿º4°ó2tìwkòÙû™“þˇóP�}ÇîÔÚâƒ~Ô�`s½ñçÊ ˜öpì]&\tšrZÆG Z-¤qæï¯ëþÕN5QA–4ÕIжûßs÷š$ùs:N·šÕÜ|Ô—öüˆ¸jHø€µ›/=ƒ#¦¢Ï $øÉ·-抌Jßr)¡8|O}]°§óÌ)½œñv·˜¶B½P�ЬXޮ܇”‘ø6œúÞÉÓ¿n£ùŸÓ-]×/Ž25î®Á ·+· Ó+N-N:ÑiÓ’ÜÖŒô`›±aÉǽ´gpíN•µ:qOxmx–™-}iD½X9*±6Í{[¯î~Övõ–¹tæîÅ+zP ‡vØ|¤¡÷ÇÚãS²'Ö|oèÉõ»Ýk“±ûÓw` »å å B1•¤Þo®øRM“b¬v-þûlj2挋ñÚ—,ˆóȧ ÌÉ]«ŸnCµù«£@�sÌ!Ò¶?Á§ßIúnŒÄÝÁ¢6#¨ÃÜ}¥V1´,EåÞZÔ˜Ð�ø¼%Ê–Ç÷Ý?^¬šž¢Ï>'Ì»¨c7ö_›aÔ*`^ ããóÍ3ÆJ”ÚçKUc) �¼€Ù}.bÇÆ×€ŽõÍØ‡€îÙ#ã9*ÿ—ãA0ß=š‚U¿Ú}†T8�ƒ!]½4\W°õá‡,`q †`Xâæ¾­êÊ#ˆz™ì “^&Î*çî5"‹NQ—h_fãNÏ·C8±åé$dÜ�9ÐéÈ FÝ)¦©i›Nˆ6ÿä¤rûÜV]ôà)ކü18Q뿜;Õ…~Àâ,ò‚=­ÚBÖ í?³°f/°—8æ4ž.zê(Ò‹ ÉzÏ�ƒåÇÕgÌâf^Ï>wB8.·’aˆ¾>Ró¨Üu g.é€cýã«tëïó­�7Ø:RÓ†ýÕ®)ñ£ÅaæµË9‡eÔOðm”èe®¥Ë8–£lô[|é> QðŸÃ{ô±iÅÁ‹Ã]wML¥­m’Èã RNûÃÙóú¨ì‚_�׳áä ¯Û—Ý#J…ø\ï¹7Æw�þ—äÄ dr ñv€ÉT¾ËØÍØw§*G‡È¾�ÕÙiþÕƒ2øûô ó½Ü�䢺§Þ‡64Š™!Ö#¡È¯N/­¥nðŒßŒb!6�ÑPÖʯí0ÓÓ² jã›î_û¹>ï‹-‚7G¼?7sªí·å¹`'M³‹VïÄg‚2ÙU�½�»‘7µÇšI²Š;Œ.¶w¤“ªjöpöVžÖ ³9œ­vùæ`�‡¼ê]‘3j4ЯfpÆåÐDÁ&Øú;Â÷Yú¬êÇ2øRóŠð•ÛM�1°Æñsõü‹¼Õá/y°Þ Ù7dÝÅ—Jãqè¡Àéý$÷�ö.޶ǰ],sŸ<çþRž�á„op¶á-ôâO·1Ý�2œÿÑvƶ¬�ý…g_:‡ÉŸ!Û2<É–rýI³R°h` ê˜Z¾Ì0ShÎWAR¯/ùOÝkqç˜Ûv);I>xÁ „»”ÉøßeÉŒ[€ÊGÖœ†( ÎHDÉE=ÖÆN£�Y{›¦� �cŒÉöÃ`Èö[ºÓ"“î‘Ò:¼×¸a�[:¯WŽ·<µ<œùÉ* qR±¢¥«#’¿þ§ÞºR‹~§3³YÑa‚¼üµ2÷5ášžÄíDÕ镱ºBÛ¹žÓs³¦Q>ínV X­øÊÈÀ⿺YªÏ~¦µÛ~må®t1ãÂv„¦lÙŸx[Ÿ̔ÿÓ2ÉÞÖnQQ/£“Ç#ÜsR˜­cá¶Ïñm çì\.!e‹&g9óÊáù ¨æ€ÏÏØèe²]€‹t�òï‹z§2ß(Oÿ±sßš ¶�a¶Ë»ÍÊ�ÐúÖH®ŽØö¯RÌfòŒëÕq(%9‚£[à† Ñþû†ÓµéÏ×�vO?ï®$³Ä5ógÕüR>ZX^g›]¦Œ¬÷êxЉj¬�ElK¨·ÜVŠ­«†ðÚè ã(`ù² m>OÜIÕkä°yúöBöl™îå‚Ý.ІÑ©úËÊÎÉ :g�óŸ…ˆ½ßDå<­dÛvÕU/kßÉ5¬ó¯rõç„@Ù”õ…’*âäæàaD›5¼ðÓxT� ÒßgÄuÚL/·:8p5Æ�´Zïô5ûæ:…s~,X:jaðÆÛ¨YWÿ^ô6y�fïœzŒ ÊO¹ñôìàwéG½çã}�@lHJ곯fyRy3^#ù‰|T cAÆ8fX /6[ä¢vjB´ÒÖ�“þ”U ùº×…’‡ÇêµïçL¬vèl2eô™�дH„Ři%[¯g‹­ ªlk�¶ùÅþ]‘ê�Œ[1ïœâ׬,ÝÛßõÓ>t‡�³œï‡Eu®×t]».ò÷埋‹#Ò±9ëJ‹ÝssÃm\鼆OYUUõ: Ñ0ƒ8‡�x|+Ûmc7Ùœ]Ýâí^M‡<%XÜ·¥º²lO÷äP«!Ö˜žKÉ ‰èóp8j(ùð½â.Ÿy Î# ¡´~½òͱ޲ÃI7Ó¡ ¤º¢‡Ü8Çó†Fz¬\Y‡6(CÑ`£¹§&Œ¬�°øÅâ�“3lþ=·Û/�~D9ò1’l)—*Ë–Ðx|ƒúl_޾b“·Äæ^\~sAòmÄG�ìø–\0‹Ÿ¤Þ˜ò�*O"�ç|e[í™ýíAÔ÷¬rþðôØvd.Wa'è¼gÍ}ãßaQòrüÀ—ÉÞ¼Ÿ«%ê‹ìXÐ@ò�¼ÝŽX\äIõš‘JËù7M†zöJv+3§É„k+6Ÿw\�ùTøºéò³wý*þ|´Íóùæâ·«ëï.³>lDºô½Z´÷\yÓ÷TuùÓ8Xyõcõ£FUñIô×P�’·Ïcðb£‡2Õã㾨ò�/?¹�‹X×t~^�Ä…¸Õ[·WòRÝÙýº3¨&íøÅñ–8Âl ó6,>§W´¾9±­¥ÏD cjÒìB„$L}9þ Qý-»Â¥°üÈëa´¾²dÿ¬ƒd3Ÿà²kÙõ/†�9Ñè ¢ºýý“EŸ(ú£=Ç‘Åzù«cḧØÙÓpXmß2 %¼š/ùÏy‡r½cyå}néÎ,4¹Ñ�dò³‡\wí‹F?RMZ! ^™°ðO2�ìÀ¾FIÁ÷˽æN$ÞþlÊw“êp\E[Çé¾`öÅæ }»}¢2§¾üÌ0ø–js�hìtóe¯Ñ_·„— KóMKXWLZßô<:AüN"¼uªÅÅ M§� f=gú¡¥ù¸øÅ ÷¨¥YÑç×È*¢À—RmqÞ..Hl^œÂŒáGßáߎÜÙ=t×XyçN¸þ4F]ë¥ýq5õX) «¸Ôf ?Ï€”&æ3wa×ãÕ|¬|cš•gôYúÌYC¼w¼gô�×1«¥žòg.LkÅëñhâf øpZ/èžxa$½o�¿ö^ÀCàëz½¥GFB1ªÙþGÑmÉ“î4Mµ—v^:cËtûhsŠ “1³'r.òãâ<íÓ‘tñ'^ÿß¶¦]XãJ ¤xÓ‚�q÷—Ø'�”ßQ…ã㱺Ef8Z¢Lj÷´ò 2�gMÄ1N8ïžnIß:ñÓæët£J\s<Æ\Ñ]²¦ËÜM�Û|u#æöÐè©e…ëˆJ4At�[ :³sb½öœõ.¢ùŸ¬à5–/ÔždÙ–?#ŒuW%ø™ÀMUzs?õDŠ=Å+!™zˈe̵)¾Ó=¯UÏ•Ôh*tt²þ%x�çÆ½ymGZƒtDWÆ›#Ãhí…¥ÅYÝ/„¡Æ³þ.q§¼Y—BÜm¤žë‡Õ…—‚î™çÅtq~z‡û7Zoþ{í®ØºUª~¶•Öé.°Þ© Á(‡ ›8�õÏdLh{¿×£á–#P©×Ý¿ ¶ê[lÙ»ÒIÄ‘,Ò¤ÞÂiÁ´<ð_æ*Ù�j50cîåé íˆjÙa¡®Ow‡îcb—ê}ÅcãTó»çÖ/+’]'ü¶=ØÕÏ•øÊNèb2dýá­ûOÖZxZÏ�#gLä°¸Õä¡i´7Óž³Þ%¨‹á¥„íA}ûsoäCÈÍ)!Ë ¬—`| :_Ž[ˆJ›>|Ú7rôÂvÜNÐ[Ò5}º£cóÎ. ôï�W<*ìk®ø¥z&ò—xŸx†úfèPGÁé8F ^bÅc°©Ûã;îðÇaI7�ÂîgÝaçó¹‚N]˜�6êI½^Øšƒ¹ºÂÍý„–'¼zPáçÜ8ÆÎ_#ø‚lBgë!aHÏÞš€ü¤ÔWC¶|ø…ëH+#šO®¶Gà¨Ê8 xòÑ|…™ºsů‡N;@8 wWpçh¾UüJ+ÏaçÅ—Šˆxëø)×v¿Òˆƒ:ž“X‚ã?æÁV½ÈÊ.ˆ¶)>vËñh´eFßl€Ú.¶*¢î¸8t4²×™õ�x­Ìp?o …¹>SË™w »® ‘ûE¾ŒÁ£E$b‘hï“4æâËK³}pÀÄ“ z«ªË«†‘HÐíOòXVj…Qþ–£P^«I³Öñ¡H–No mžÆO—|¬‹¹r!TWC ;¼Ýÿ³Ýž©úõ—¡cå1,GCöš ˦ÁƒŒ¡`¦ÇåÄ@z``Þâ&Ž5àV„–管÷%FˆK&R�Ð�„å:ÁÍD‹ë›©Ë•�Ž×g5wõ®OZ\Ȳ<›3Ì%wÓ51Ýï™ÿ�~¸›ž’G ër0L—yq‡&ÿáÌÅÕy:�Yð^0{M¡ÒwMÏZÞ>Bx®ƒ o© ¿B°Àç·s)½Óç‚ÓÁk£ýuA’1‡ËC³¶VY�¹~ G¹Ùù’xço %#:ݱèÇÊÝ¡'«rÿì†�ú;ëܯÄB`ýÂц03¢Ý;À{Aœ(Úß¾Ÿm.NbüëòÖoX)Û�Vòó›çrë&‰YöFÞó7r-�VÔx«ZBscz´©á¨Æ&"ðõûm^[$øç—¢ê‹ÄCCîùÁïB’€éoÅn:éï¸*¬Êc'8¦ž+9i6ÃÎYÝ šñ%ÍIå~;¯»#¼íÆ„²ä›b}ƒu -6;BèŸp¥© Fѯ$6‚®Yø§79û‹6 ¦…K§“³ìî·pw¯zñ½î¼Ñ^]>òëÝ;&w½ÞóÞy÷Ýžw=ÛãÞ÷ñU[õ«_Õ¶Õþ5–Õ^ÛmnÛµkU*U­­½Z¯òª­ÖÕZ¯í«mÁ­«zÕ-µm›[iZÓmµ-Z¯ùZÕýkmku[UW­TÕ­eµ: $�‹DY*“`Ôc(" A�Œ$l2 F¨‹ ¨ÒD0É�ÖI Y"ˆ ÆŠLQE$ÚŠ�m¶·ëjª¿Ê¯ü-Vºßð­_µ­ÚÕjÊÛW«m]¶·êß÷ëZ®Õ¯µkWój­YmJ›üØ£Tm�ŠŠ±‹lQ�h ­Pmûjµ©R¶µ•­ÛkWUVVÚ¶¿ÆÚ¾¶µjûyþDFÐÐqC¦‚ ò & @O&@@ï=Ê?ws½ß-å|¿G®6üÝ÷|ù¯Ÿ—7•‹åù|wy¹`ü¼¨ß5Ê‹“÷]wwuùçžnZù~=ù䀌�ȳA`¡@ƒ*w’D»Áhü?^ûÏtû®ýû×çï»|ôÑùp°K¸ww&b–„î‚D»´ºD–P ˆgì{ÝúWé¿{íë_½Ûóæ}Û×w>ûÞÆù¾ûï{»{÷~÷ÞלÝוËF(ùñï^¨«˜ß.ýÓÞõ¾wº¿}Õ実–ãηšý÷ïß=½ûßoJù^÷^}ï߾毆éÏÁÑÞ_¯Ûï^_•r¿/šú¼rq÷o—Ï¿wgšåçRb— I&%Ñ "]AD’BÝ?>}ÝÃwÝókÝÛŸwïAç7»·+Òß/Ÿ }Ü/•ò½ûîß½ðyæ½ûÛ|¾W/¯Ý\÷oÞ½îü¼¯9îí{¿ò|æŸ{Þîùí¶Úþ¶µ^­µ6ÕoãZ×ñY¶ýZ¯[m¿›km•«[ÖÕüU cQoñ\Æ­ËT&®nZ¹¶‹sITZŠÆÚæ·+–æÚ5Xµ¹msj‹sUÌhÚ7ñm[{k^Öµ¯í¶Û^­mjÕûZ«íj¯[jÍZÛ­ª·mm®©mµ-ZÕ5VšÖU­nÚµ«îæÎ‹·÷^ò ÛÍïn÷{ÕÂ1;·79$žëŒPs\fžºì÷n'»t¯wCMÝÓÙÈ׺äÛ›º{ÜNmÇ9Ük”P4awvÞ]0Ow:çnÙË›Ê97µÇDîé-ïw¦îì÷[‡ݘ¼º+»�8 �wr{·—; yз“º¹¸nNíüí[_Íeµ¥Uo[VöµªþÚÚÚ®Õý•b¶ÑZ,TUƒl`¶�QümkUÚÚ¿­­m­þ{Z®¿Æwøh{Ùwn;’í×t¼äÏ]qÝרJîJ튉¹Âs.á›»«§½Úç7žqw^Më«’k›¼÷±‰ž÷½qÝD›‡9®îæ.n¹;\÷ozæ;½+ËÝr7s�;œë·uÞ^Ë�]ÝÝØ¥ØïsÞð.ñÝ9uï=æí˹•Ý=Þó¯tïyëÝ ò�ÅEv$¹ïUîö¯KÝGwž÷;ÝîõïNw½w®ÝÛ»ºNì™Õ×7.^öóÝÎNÓºæŠã›®îN�uλ’îÅz^Þç.çnäîîºîívdn]¢QÚòÝÏw<=ÛË»—›“œã½î�w’P^Os×]ïvõæèuïsÉÍîçµÕï]�é;¹ã¹{¼¯{Ü“Öîî:îîîê/9^$œ÷»»‹Ý¹7näóÞî=Îñë®é4]îóÞ÷ˆ¼îéç¼yÏs)ï­­JªßÍ­]ZÚß¶­¥UoëV¾Ö·¶­¯jÖZÓ[j¶ßÎÖÕ³ZßÖµWú¶Þ•*(¶ÝzdZ5#-£DFKP�ÉlPE’Æ�’Å i E(aŒ JS(  Ö*umámµ}­k­j½LFÍ&QDŒÑJD‘Hj0$RQ ¤H¢‰ “RCJ)˜Å¢Åö¶­ý¶Ú¶ÝZ¶þvÖÖZÍZÕí´ÖÕÕªZ­6µüÖ½¶ÚµëUí¶Úëm}mµ-W[_å­moæ­·öÅflj Æ£QFŠ,„ZLQe†¨ 4Í ˆLc4¢ Ù†£bÔF”É¢¢i±ƒQI Y ÌÄ“íj¦ªÖþ­ZýZ¯êÚ¿ù[[mÿnÕªõª×íµ¯õ[[lÕk-kjýý¥þx»ø÷¯O½ãÞåîôîé^î<·;¸»õ žÉP™BE4 Ðw@¤ %;»†ò{·wróyw»‘tæ÷½z"Ù‘J!Ùå䃼dC»§!Ü8N˜'N� ,DÂr ]:,¤„ C©ûv/‘½ç}üvùoœã]Æ:iwNŸ½zÞ÷7·^n—w}íÞïºõÌ:ï^íâ%¹=Ǥž/r ˆx�KR Ô—.CË»:M;Ý^Âòî½»×_»ïsï{½ï{Úoá'„„$;€w—EÉÇpWºOs­Ï``>]îï>÷ÝÞ—g�('tåÓ¦x„!’‚å�twpä “�å—½÷Ü}ÆáßrzòéÝróܼôüûßw^šó£»2ñÕëÇ]ïnêŽä4—€‘z8.¤§�]1ÀrMî}Þ¸ºNÜ\uvýîô¹w?�_¿uóìÝ×Sïtz÷u{ž÷—.÷\¹O'y½.wuçËÞ»»¯½Ç]rºî{°÷º{þûß]Ý}tî�åéî÷·=½ÒFeÍî»Òwyç»qràp;�qî¹Ýã½¹Þz]Þ±§ñÛžHî¹Ï½{Ü×ïw¾»ïW[ï¹îžíåèGÉ÷~W)>h§}ãÝÜFyÎôÞóÎçÏwg”†—Ý÷Ü{ßorén¹ûß§w=wBN™Ü¤î ÉN d!'‘tEÜ:wŸ»ËŸ_¾ö~ýïß^½ë¹Ý¾îÞ›nWÇöôžûÜîûÝÝ}/\ï�|íÈßwÞ¿7‹òîç;±]ß½»7.‘î¦"r!"Š&”ƒ¤D ˜¹x—=˺îWwë×›½Îºò2{Îõîç5ï—޽裡úMÜï{sËÞïw½r÷î¾û¾Eéw�\¯/+Ï<ž÷§�Ýî÷qÜgk×o/ß^öù{¼ûÞ}�wŸBtY:H!�Ý¥LBIˆQï.{Ùu;¹åÊós¸.§;{Þ{»´îó§‰ïw£�xîòåïx¹!ÊH"ê];¹€ƒˆž³�]¥C¢œˆ™w"Htîȸ2îðRD©MCç±¹îìûïAó_xê÷:þ;zöwÞ½ç½=Þ]çyܼ.!® åü>þ«køªªZ¿«jݶ¶ëU¥ª–Ö¦Öš¶»V·[jëjVmm®ÕnÚÛMj®µºÛ[uµMkUÚµkµ¶»V¶Ý¶Õk¶Õ¥¶Ê»mªÝ­UÕš¶ÔÕµ·õmµ5ku[`É$‘"JJ )�€ÄS Ò’3„‰FÈÍU·øí­+ukKˆ dfA#$„ÉŠ„ƒF�JÛêÚíj¥¶ªëU¥kí[jUúÕ-^µZþ­V¿­V×V­¿‹[ÖÚÕõµö­­¾ÕjûV½­öµ­zÚÕíZÛëkm¾Ö·íµµšÚºÕkí«TµSVÚ½j×µ¶öµUüZµö¶Öþ*½µmy�Ù#&ƒ}ªÍ[jûk_ZÚêÖ½µmm«kÖµ*«HÆIÅ20”ÄPˆbÄm!�Úµ¯âÕ›jÔµµúµ_Í­^­¯V©«[}­oêÚÛoÚÚ·öÖ·¶­®­}w�›®�Ç7hâuÎQÎswgttìî;IÖé΄»·]sºå;œ»ŽîåÜݔwW»´91Ý#9Ît»§svs]Ý.›¥5ZÕÛZò™‚ƒzéÝI‰…’a‘g:bré9Nâ(Ã5,ÈÉ)–.î‚NuÛ�ιÄK»�Kst‚"»¹wnNºw4Ó‡!Î7;D'93Öã.îNt¥4\é±HÒ\§qŒÉ]Ü‘BX¢ AFç$¹ÍÝtnWH7uÑænt†‚ ¢¡$Hc¸íË”ÒmË£.ë¤ݸ&N¥ËrÊîâ$¦+�Ý;†ë®ÒBäíÆÉ\ç9t뻄Bi-)™ÝÊ4¹ÆSLd ˜îç7`Hç6Õýl«ëUõ[Y¶ÛM­µöÖßÓ^/–àýÝ|þÞw(‹÷¼è~܊`Y‘>:îî�”¹º{¹�ß]éû»ÝÔEráïÞð¾íÏ+™7<òTÊ|¹:wº¾à$¤�$9S.ä BE‡yI”L@I=îô1óçžp ÏÝç×Ý8íÂb—wGîºgçfoÏ{¿wA¡]Ûó½Õ»æï]';?/;½]<�/Êõû¸¿uùzòíL{÷kÇ»±Eݽís˽Ü^îîëîèŸuѧ�»ýîòçÝÑß»x¤…Ýßweî¹Do¡r'»©|¯}óÛ˜Á¦®ûóØß¾Ýû¹†>ë…Þ÷’‚ó�¯¾÷’år¾ý×Êû/žî¯yË»„s†‰w]÷{÷×]Þæó;¯õÞ‘ú]û·½wå¼åá»Ù/ȸüêøpÌ>÷½€ —uë‚¿<}ß{«»¿;¾ñæû¹û®\®út_uعïrÏßv÷ç<Üß—Ëíç_|»7gïÞõ~tyÛ»Þá•Þ÷¾î&ùÓ_º÷¿g<=ßzûžôD˜¿wWåÌÓ~÷½—»ô÷Î÷¿zùˆù>ï÷ïx½ÝDzîÞWÞÏ]ï;�_w}ïI¯¼÷¼º^;½Þžß;B;÷ëï¨LÉŸ‡gw~n»«çË}•å×χ«ºýïËzUçïßx¡îé#÷}ë¼¾o<æû£¯ ¯wyÞwu{×aJKÞëÐùÍç60ŒÓ É<÷w¾w×»¾û·ß\<óÙòâ÷w»�Âç }ÝyÎë•î¹>ë’O]¾÷.n½Ü¾ë‹/:‘s›së÷¿>1~\»»Ë÷]}ÔóÏk¢b§Ë›î¼ÞO�œw.“îîrýÝ}ÜýÛ˜“ÝÆ1 ç{º¼ÜÅ÷ÝáÎ�×Uû¾—±÷w߻Ɉí÷º3ï×^Îï½Ü¹Ó²7ïº÷ïÞ¾>ß+Ö{î½^WËÓ»Þäo6¾û¹¾‰òÜ÷ï^ß»ˆ~\oÜn‰›�_»��ÑÂ?/Þåû¯ß¾½ówçßts¾wŸ—)ôë•ûÛ�×&•’¼ç;»�×½w»„_¾÷¯w5ÝÍñºèÎï+ÝÑÛ÷Þ¼M‘~îw]}îÞGÝ~÷3åÚõÞ÷¾í|»¯{Ÿwi˜}>?wÔg»æ¯.n_—½Û»ïtO97¿{½Ã;®¾výËÞõîwÇww¯{³¨uûï}åó}8” ÷tÉÝІüé¾ï½Éïºñ8ɺîdÁ'.$w}ÞÇŸM{·^ù×v¹ß]íÌ]ï{į¥åëºëÝ]{¾÷%|Þû¼×—ï¿^¹Ô—qû×pãó¯’îç_9:ïžMˆ¤)uÑ„O¿zò’¼ìÛ›÷�ÇçÞ÷¾öóÒ¾÷ÞûÝ»ÎÏ�2ü¹“õ­U5VßÍWmÚ­Y­j¿�[]m]VÛ6¶×ëm«µª»Z²ÚÖßÛZÕuj›[mÖ¯ÛkWµYkKUÛkZV¯V¿µ­¶Þµkµm«øÛkjþÕ{km«úõý»„»:9ÉÎ9Ü뻹×uÛ®é�×:9݇:ºwu;œërîºæ`ã»»qÝÜî§7tº8D\s¨×B뻇vë¥p Ýâ�7të¸âîã»uÎÓws¸NçK¹×wt.QÑ;ºwbºÜtçî—t]Ë®îînœ§NŽ;®çJMÝÅÝw+‡;vN87w9ºt.t%ÑuÜî뻢êî�ºH̘£ÎÖ·�ˆ¢LhÄ!h‹!ˆÛ%F6�AIÛmvÞQ©ý�e×nT‘6d“—Ha’‹9w.‰wrI¢“ʼn'v®h.£]θ "(£\דNn°’XÐR&(³º¹w]‹ƒIŒ.u(lW-ÈÎëŠd±±Aˆ"�Ä‘guÒšlb�\â0É ¤Š,”¶ c¹ÕÐÁ©åÒÌÛ–7HK.s—g+•×nŠBºsGuÓ2 îëÖÕ¿km6ý¶´µ__ÊÆKEÊ®V+5r’«�ݪ優1cF¹«•w.µ-�,•¹vcD£b¤ÆŠ1X´TQJ¹k•È[»¶®\±Å´i IDQ5F¢�F9Ò±¨æ¹b9Ëc&ر‹gq\(‚"Æ-€Û›–�©5ÂäBX£šºb)Üp"5ÎmcV'w Qnk˜Û»¢ÜÕŽšç-ÆJ»º´V76¸EŒZîíh×5r¶�F+±"Å¢-ÍÍ“üÛm_Í´Õ¶ÕöÖÓVÖßm«WÛm´µµíZÔ­R«­«-S[i¶µ6¶×ZÔÛZ¿v,fXÙ [ X£EI�Di2²B‘‘‘ ’LˆRS(‹˜aÂcIF ¢K$ÄÅ�#h� ¢JˆÀ$h�„�­¶ßmksQ­¯ZÚí[VÍ­jµªöÕ­ÖÛRÖª[[mÖªÿ mŽÖÖÖÖÿ»¿Óþ?ü~ÿ?çüyð¢‹à/ëœÑ| øôÃc LlØèÿŸõY{Y“˜ñjâH£ʺQ›?åf)„ªyšÚŠÇr¥^¡[&fÕ‰, ‡qK$<3f÷R±ƒ¥÷Š—»–l jãi0¾E„ãD9¬µ"%¨r—,¶†Ò±.Y=•–\·\ËqñÃAà–T �y´ÔÈ÷[X;±F-Íô\õûZM &ö«Ÿü 6g‘Ãu#x¹£�AÛ­%ÛÙ–8Kvßø«2Ï ðŸg:}÷Qz›xmCX·GÑ;ö°øûÜ›tØ jBðY͸«PÅ8fÓ žˆ9wUxÃíó‡äx¯J+qÚé6æ÷gk%‡@ݪñB·#ȧ­(*¾íƒ“”3èÖ =º×Cú� Óì&�µæDm*[�r&ê4¨«—NXÊOšö»Yï‹Ú2ËZ¡QqhWºsi�!à›]-Òi” Æ3“ÜÙ<±…_`¯€{UŒ^<Þ]¶ Fá{‡,n ½Ö‹»“°—£¸ÜʆÉn- ±Óㄹsä7/:Pt, gïaF—Ž %ÍæÜ¡EéÎúÅ�C<àÄlS­,ïKaCekqÍ”ÜÍBîùãWÀ�Ö –´¼]�^3zór-xl´nÓ’ã‚ûw³æ7œyÙ’£BMŒtïÍc[{w ôí‘5é�»V”Ñ„ tÄÃY¹•ùm¶rêbɼϯ¥Â‡¿ GZ¬6³<ëÚ !™—òšÞ·¾ì‚u�ò[ Þsˆ=м.=jˆa5I…giz±óxx};ë™ÈÅ!8gJf~¢¬à²0¶(|6…Ð%%�†ÀvQ&µ‚ŒÞRœ„Ò{†7ä[nh/ ¢8Þâ•&Ûle_e Õ²Ì5”X#Ðy¢²³åüÜÁt®ü½i¬¥,³“Bì·mºì»^û¤‹¾2! Ý¥-é 3-zsÖ Áuq-ÚJ¶[ø]ìûÞY\€Ë<‡æAõ»lt€¹W¶V dA„uÆÌ«"“—(É(‰ÛmRí¼’™mÖC_JcPZ›5Ÿ U7åòºÄr$o�ÒÕô‚—«oÂ÷¿…!‚Û+�7„iõQ‘6Ån{Dß»tQêêG6ˆP&½Š„à ži«Ä§]¾ER �½e‘娅ªgvÌÛÏ ¸.´\í˜Çðàü`C0ff¸faÝâ…äwÝÌŠé»æ�'«ž’oDÙ¾ÎÍEt`UKa ¿»=åì ¯vg¤ ¤ŸœðÚÑÙ YYœÙ,êsmvþLPjÉÍ…µ±²+œWS¼Tæ¸q8 ÌÖö}É(yAš=-]ŽÂ¿øJI3_vXk\ÂF‹Bö:Zu „éNleUx•ÿÆýÃ3‰�ÒvMÑŠo“V\³AŠ¡æ.—‚ÁEÄ/þ§Ã©€\ÚÇX!7èg·ñ÷:qÑŠÙ±Z·ÀÜ�×ãOçàö¿¸Ã+ œÚÖ7õÒÀØqj *�éÁ=ìW7�°ëùŒŸ}®>ˆí ‘D3ƒXóˆcÜ“u¬˜zÌ^BõcyíÜÍ �=°Ëö`úXJìg¬ù[ýAV§ÙZÒä Å‘Œfõyõñjú÷ÜRq�µœþÞ5ÒÊNß•·bÕŠö–hdÚ³ÆÊHæPL•—˾«âPÐm B½é4™9±H˜‚´Ý£à ‹‚gðï¨ÊH}‚ʱ²ãG¤¶²gIæ.áN^¬`!|ÏéœÁì”Õ½™Ïsëd=~½’}¹-„®²Àƒ±åíÖ+¾®t8ŒÁ¥ø®£“?Õ«—mu’ß4a·`‰^àåFâ€pXƒ¡ª ®@yË$ÉÉeX�%ìïÁÆ-&:Q)Mšfsu½fò®^ƒR(øîesÉòêqÉ:¹Tˆ)¸µ‰…!ÀÏCI+›_�o܈dü¼_Æ÷ &©W­ìiÈó�€Ò_‚΀—†L+†/À¨"–¸Œ¤¸9 ä1ú³ qa”Ðöá;ž¤ l&ÖõÞç<Âk¿¾ßè?³î6�^]6ô—êÆ`‘Å‚Ìûv¢Œâœ%[õ°ê /¥[º€ÝgbÎ(ŽÚöYP·oÚkÁ è6vÎZn\BསVdm¯ÓÙ¸2XeØúu»âî qNÞ%ov‚½ôLᨸ¬}’Nn�·ñFpói˜½Ÿè�OÚŽám™£d¾o ;¾65Ædmžù{aó»sRôŽˆXG¯ H²�˜,±×q¸XÜ«fost’ÃÈØå�Ê),¡Èœ¶êymM¹Jƒ rxÍÙ—8]jü{á§v2l-¥ �¥š¸¦ËŨÉÄŽûij¿o½Ò3gèÞy¸˜qÔ‘²s�êŒû›%[-ô§¼Ö?}g4ýÓÏTßàƒP³#_ä¼¶¿³J·æÖ¿»^mü+~oáµýÌÁ¾ é`oø€ÏJTWû–ëÙ}¾/ÛÌ{KÓ×&��–€&î‚©d§…Çõ±Ã´ñŒÞ§ä¡×Ü_#TÚì�¹ÐŒ•)ñ�.¼�ØŸŠyz cäÜÅŽ5çÕ› ûî_mï³zû u¿>Æ� › ­+ÜÙ¯áøhA¸6 GËr´´ŸÁãBù%°¹·ÚÅä¼¶P¦'0U¸tÇŸºgÜW 3b$Vi½ŒCŸ)í®e3ïƒí. œ¨¿³�„åØlQGÉ—ËV€†Á±ÌBbø+/løÅ[ÐòÉ„HÅy6**tŸ#sJ¶O'Ñ寺£¹†0C+’ˆ­¹|âô+fÚÎ{�ã̰V@}MrPWü�˜°Ö&‚Ô9 Qa£fópŽ}5:h›áG^ÑîÐ"�›™>q÷c;®­|¼n)ÇÚé®Y &WÅÎñS;¡g`ÆÓögªò’ ³$`€ÓÚɃ}dV¸ó D.¹¨kÄ岞Ӧ“&ù[šÜòƒçTk»µ¢òù©¹~<áSlÀ-µwŽžèûõcì¶¥úÓ3ºjñ~øCvë¦4{¢ÑQ–¬fHÏw‚/¼»‹œoQg<ý'ˆy‹´¥.’{ðZË\¼Z¯¢9[¾áä9g`«&ÕTãÊŠ=™‹n»%l[NÚMK¦F#†_´ =Ýf7ÀfÑ‹Ya3zÚ$-þ’”ðÌ=k8C¶]°éí�–!åÚ^Ú†Å)Ñâ*0’}ʧ@”;1ˆÈ?·µ�^Dp‚úpÝêÚ(,0ä<ÀîœåˆL¥F:(ø5‹Ï Á¯ƒ»ªÜL¹ƒÉ2p�ö6£b|ø÷²s7ÛÒñ§E†(«É«�‚ëlP)êå%Ã;$ÕèY|Øö•¶9-ƒÌ®ÇŠ™¡²tmc�&Eâ[Tƒg�r¹ôä`O}Ýþ´ÜœØôÂRp語 ª5ß`•’¾ÄrÈ ]²}¿'Ûž².×Ó—ý’è o!8¿á,^Lwµ‰­ �âpΕxÇlKr5Œ5Kˆ•pT5“Ц-´%ÌX^2ôѤDqÕ ìx©�²³b”‡Q˜«½ÒÏêo3Ñplg{êô½ ¬Ò·œJÔÅ­kÚÉÓ³[‰*�gmíŸõé®tVÕ¥‰ÕÙŒ±ÝÇw ÔH� c[¾‚ýp¦¢'�lË ’�f‚«_y,+´q�¨Îé´”ïÊ©½÷-e„󗧬¢µMý§©‡TÓt8$Šhàÿ–fÖöµ¦=(VWO—÷�R°/7 ‰¬@=ò;>kSÝu~¯3 Ô¿êØ?°LÀ1ö×eþ‘µi°( ÓKà°aQz:º4þG0S˜ »b“¸ŠßÈw}D]€x®-6ÀåžÛ±¯yÝqF)CZ¶H):¸“ûå 0ÌÞu?—g6 é#Îu²Ú!N¬\ WÒ·% ö_MC“‹³Gصt¥¨úðÿZôÔº½íㆶÉÑQl|œ¬&¬ÞiYÁû">W ‹•ÄÈ ÀGОWÔ¡Ki6Ð=ÇzKUàÌ."<ëÒfn3ŠÁ™ïÛ~nÌÏžhVÙ3à©5ò /a�ÍŠ‚ÈP²Ò.�Z¡�·zÓu Xe4ùw+ \°]mÝŒØQµŽÚ'"kÞylÎñ€Ïm›½^ó™�nÔœõ©ªâZ«bÊ‘ª¬äÌxíøÒ�„¿!¿�{;­Íã]á*ƒ8 Ò3dC–½êÔéeG`&ýVåÔaª AlvÞÀÖ5B„Û£´æS Ô |+³ÑðÀ³/9C†Âšn6ºÔ­'4{çtüÊo<·v÷6Èz uS�ú«þœÀ۵Жè^îí Ssä(;ä¼Ó¼¿ì8Ô½Nª“Ñû¼SÖèöûÕvHx5¶öô�7J­Ó•·¬ˆ¯äè+¾÷š[�³œ (ýÌéÖªÃk̪.b G0�†¥…M†ñØÌ€•«•W(Z_›ÉÒsãÅï`è'/C§¿2@ãÛßO�’±•Ù!²Øw¼e·wî¬!‡zbCâM.6©Y :µínìµ+&í—˜¨¦Î) n%pÍŽhm§ì¤Xk¶Ä~«¸‚Õ–^™ñ‡r—ؘ¢&+6Å�¾„T\†¥ÉŒUüq„ÚôÒó·[E˜,�x4ó¦FrŽ"ˆÝu$P6:ÎVW:.CiWªO¤…4!B—Fpõºv™mX4&µæQXx=·#ôB›^h~Æé/S�äøñèC¡\‘ç4�êZ*K�bjÀ¯yƒw¥“c›rÈw=8CÊòæ• ¹µÉÏ8b©KY«öØXPþ˜Æ¿ ó—´ý¾Äy¬¿O⸳%l¿OãÙøLiÍ{ÌH\‡–ú45ŸŽt´§UAM|g.©Á�Ÿ÷o>%˜Ðë´÷½�äÆÀ¦@ç!Ø%{Ôæ˜L�G.}F Qðº7ÞkÈWÄãí‘ý7—Íg g˜0Ü¢øÙ+ 8´¶´pcïzð#Mt¡´X¶È®ÆÒ†væ²Ûç¬Ñ8ô*ž9‹àwze¥Ùã¶û¦¹ä1cæëkÇ·-«€ï×xi6 ª�J}ËýϦ99Å«¿†ü¢Ì!ø²áÆr<å0C•p‡ª3ð ¯tÈ�|į«x­à¼:wX�È ¯4qö5’$–kV pÇÝGĹ‹®– pd·AZÿûu�_ñç~ÎŽÊ-pù<îŸï³L[K­³ö”ÿ+Ö3wñóÚb´[ñ¿Â¸ßæçûs³–öºoEÍ©àxÿ°|"-é,³ÛG`Ócþ”÷“cb-î¦w8Óé ý’La.`Â~mq`²Á ôÛ¶g{ÜäÒÔç'8þH¸�T‘Êý ;Þøê¯óËVá J27úÍn¾­se÷Ó áDÐÖl\i\_#ÄÒ1UªšþSlž0 Êª½âMç½Iž{ªˆöB�Â/È).D,þ_XJ9ólR�˜ödDû£ËU$–úùµ÷Ñ_^ÇŠÀ`Ì·qÛn£:÷>”æ×Â,é�C2M`.wž�ºæ;Ýf`E&È6R˾S}ÖçжYÇ(Lú*æ(Ô-l˜Âé4xð ÏÏôM 袡¿ÑÚê_KˆÓ6¨n!§Æa¸ß^™"L,\ÆS¡bÂÛW‚*¬aTG4¶†—<Èí'ãP.VîùŒÊàü¨þw@~ uŽdEFê�¡è$“ŠjV³�K†ÑÑ6 H.Bû"9Îä-%9ý†S×*bh{z`ØÀØòÅ}™�“¿7C¦…̽°×Ö$�™zkFð )…ù¬á…æÙ˜i’´ÅBBûÍ<©bà˜Ü…¯—¼šÀ»u¾s§—¸8ÝоÆ7Rø.ø«ö'Hè ³ì™Úúê2ÊcB² N�o[Kª Ô~ôebä�}&ƒƒ A· YM‡)ù�\7¹UX*-îÉò{:FÑó‡Px’g‚ùŽðjü¨‰1‹ß9lá‘Ì�êó&®¹‹³zãl!³ƒ ú9l@�óiÄþŒ°$�®`d7=ßQ“5 ‘9…=ZÔ›ç²G²\Ì’´Úk”\%öK�î÷:Ns`ZÁZcsÃÆÄsÏ5 À{CÞázÉ‚û€Ö â\$Ø{züŸåÅÖÆ½Í2{{šÓ2æúÍÁìŸ 9n×(¤~Ý¢T«ËM”¶7lä×§°Â· P„~Û/S"õ.:×ãø~²ºØO8_2ú-ÄÈ ˆ?Ô†¥0¹kEƽз €'ºÜÒ]vVyTwœ ¨¯4YØÆënǤ¾Š„É.:d±hÓZ¶ÇŽóoˆ¦�Û+íñ´¾±ÄŒgÅÌBt�²Î³ç…Ç7`Òá�Î/I²Èï µA«Ø²/f? $/n%ñ÷î$W…_ö>lâû }›m&B�õ| ¯É,_ :Âüö•†§ e´RÇ�maÊæX^Å•Ç^B5®À{ÕW8ô¡­h{m´8§h¹�”p¡%™0¤[í˜,$Å /D 0MžÃ0™6'zg3¤+t¶F…÷ÙxïœOƒv lOîbóÞ$…íD0˜O¶ØIùœlÀÀˆvÄùþ n3¨ {êzˆÖJm›�©bÎ_]™d½Sô¥0÷�LjÅì&uCÅPÖ�‰CsŽÉ¶‡+"Âà Ï€úú<†áÖ-j%¢Q…&�™®–ïl¥ ƒ‘I€å6ì�`Xo”°�¯T…žÈ÷KoÏ0\^àPžèo¦}­½MÌ Ù,Œæaõ݆͋3¯›ÜÆc_Q¢`62¿Õah~Ý °–¾¹ ½Œ‚³¨}Haøö séžåAŠòָÅÓ`{¢½<Õ3œ�m¾d_¼C؉�†®š/ÆÈQ¾ Öeõ²]iPbø�1)Ri 4cƒq¬\¶Ý=ˆÉ¿?�X}¡kud!ýÀ­›ŽÐ³žûÔ®m9 ÈÎÀª K%{fbÓšÐÍxä§é äWÝ2z ò¡›½KG¡ s¢ÎVEºÃÝ|h F$>“EÏFEVšV¼T•¶Ç¢œc�½ŽÇ˜¡ý¹×1_§˜ ×�õï©ÓøÕØI‡ܯÈ]×и´n[Ô¦HYŒ† �³ž ë{‰ŒóÔÙˆlÖ³t$Æç¬Í²0ÎŽÊaqtVMiÐ-£ûvÀ÷{¤Ž ÄHLÇÅ—°WD+·ºÉ@\ý˜M4 yÞã2‘"äÎØ¹õÙúAÑ áe-�V~¾õU7Å{5™ÌÜzáNÑun\ %ä6ZCöbžÔÛ‘l@ýZOÔ¹\º؆�è‚üñk:Ý'yoæ™4å�÷6ÔÆõ'âJ£QÅï[ �Ø…J¾×-ŸIÑRV L¤ÉÅV£‘"jE,¯°ÁÀIˆ“ýHG¼²Ã˜´ï4‰ëY%Z„Õ8Dd§*ï]+®uÊEu…éÆs@¶ÈÐÃôêƒÎž”ùÅiÞ N?~í2Ú z/WEú¿[›Òþè‰è’µlº¶o·Kb; ›ùƒ#Qž�$ -yönGÅÀÉ_ªyíŠã¨´ S+ àª4X��}’“)�5I£¹VqŸÕ}«þÍÍ<€ù°c�2V·9¬[µ€QÕeá ÍnŽ= �hÉSbùÁ+žJÅ¡Ut%² z¢ÍC2úªµ`ª0�kÊ>4À ,ÔÔd~«›-ŽürÙ {[H¬Çy\Ò$Ì0%Ѫëà.9Èþ¬ö“Dâ_ÙÛ(ÀW’]øŠy {¸n– °âÃuÁÚPÀ×áÐ wšfÀщÐÓÁñeó�³0f>ë–OîîkX†ïy‚�Çôrøô;0[#ü½¤ÙàwX6Ù¯h׿´–Òw^%¢R €JÃg8íF`Hü ù»ƒÛ‘׬Ì*8Ø2•bQ=œ\î7!îþJ?Û±êe³s»î½VŽrà"±§×ŠÆ¼é“Z`¯ÿŠÛ�Ø…½æè\pAåÕE+Ê6£(�)Â:Þ,Ž?ï}ŒõVV øZÜÞæaÅÉ2œ±‚Ú±9`þ·( ’T•mšûëg0þ=û†Ì»Gn‚;þç?`-T%µ¼³Ú™×ÁBòŒ8¤�ÄâAÂáA½ãñÃ’´ž@Ð�à–³7Ì‹�}™b/WÛÈjµcÇÑm{XÞõíÌÛQ)Ð’Y¹ü¡×‡‚kcËA°ñÃo²óç‘Êb�q¸ácC’"¡ž9Ö\± Æý„nS¡TÍ\odö­‰”©û�jð3Íx6”Ö<à¥rÑ2V DQ\QÓGC!K6›LÔ>C#Xèö‚§½µš€`Nå:›Y‡(UÍål"!$¡Ha4çÜÖ÷Œ½ä½^°d7„:X¹#AñUÂŬ‰l8Hùîx¸êoiž6÷­1f ˜7±n=Äñè×t¯º­wAŽâVzCrSÏšO£3¬nÊa‹riât­Ð“øÔî¬ÄAbœ™¢d¯ÏMÜy�ÿWæpòQÙ€øL*"ûý­Ï9ÞW'èštâ@+F³kx`5,“ÝÚò¯è;—r[^ mÍH¶5ÀñÅZܲ_5÷mà»hv?B…òÌ`¨Î:ë«Ë…÷‘ƹU�—«Ÿ¢ï\ȰퟂÙrÚN%†ÔÈ9€²'°ƒÚ�ßÜ™¿<[̹!‡-EŸOD�­ã™ˆ31¸X=Öùï H%n§Pž }µîèÀ²–üËúCÖÛÔצWŽaó|mì8²þ&¨ü»Z[t¡†ôåŒË†{ö|Ô Eí‡E7¥Ñ¦EWMÊL­"êg¡ôY†yÉiTûg gð|îN…À„Jml¯~82[E×EVíË“ðB)ÓV6î7 �“õìÿÜÍgoeÃÞPÚáJETÝX~¨YÄÛ‚µYF4’SR•éc)óÚ œ@¾"žÞ”Aˆ#-lÀà)˜­ï$þ�ß6A)w�)/ïS&c¥UŒ˜"Ó¸�|‰f؆óskí"Cêò[îÕ¬ÀûŒþË„Iìú…ߊ8‰…bXyùK(táeݳv©Öá®õ¸rÃ1ÅÁ 3à«ÐuÙl´Ä&_ö,™Vkñ=÷zI¸»ƒa”ÄlhŽ.RÈΣ €Y¢×o¹Ù=å³Z‘Ùfyú>  Å[á÷Ô?àÌ0;:¸^cÞº¦º4ÇVX¯ÝÚœ§ƒÖ@ù´ŠÍêçüwÌ”(‚@BœCŠã6†x $#ôü\9çMomIç Cšc"ØäÓƒc–¹,2dÓ›ãaxÓ–0ìfÀtw,*V“t+ñþZÉKX è%ÂZ%(Æš¬MZ¸ ç] èå´“Ü…Å›²)a6ÅÝW_Ô­&‚4Iþ§¨È*'ኹ»¢ ™�±Ð�„4%—��‹W;3@áü¿–¿Ç1t¼%® @srmÐÛæØp2 UBøqèŠE$„Ùîƒåq³X)¶š½©È}Òøwgø‰*³eÓv£2NâKb{+_I»ªgZy‹ª�ˆõ)p�ï[D€Tã$ö ËñíÌ¢gþË{ÙêÁÄi€ùº9¿c�ˆ7ñÏÉ9þÈqí½’ßu¿õðxÌû<4æj Ó¿+|ÖìV�C7[ƒÕÎT�¿Ã8óº #{ØþÝ\�}×fÞc„m å�só«²›~µLäTÇI}ݤá`B­„º“;„…@Ö$­I†·,XK àFXó›i±/ˆ©ÍÌbM›ÐÃ�™¢ê0�ÄÿoClrÈFA‘I£±Ža”bH Ä�+šãê$ò%6ÀX^Úœ2üIŸ´_H}ðkõ¶úüà7Ã=¼†�—î»|¹ÑÝ$,Ñ›@Ý_ïÖM‚¹zn©FçÒ7ÇP£.Áó¼ÈNݰ˜çÈcp¨¾V3°#ȑ۸å¾P,â:r 2s¹TÌ/U�ÎÜ´Hç6xé›IãM€³8˜ÎbÛ$A¥°�æ\ÁY¬çö*5 �RpybÝÚ¶!©Iû–kÜ,ѪÝÓS6£Š‚ÁÅBp,=‚Ó)Ò"ÿZߘÌç…é!ûEWT^n¡Îü CÖ� ø)I¸X#xæ3½¬¶Æ]ý:ÕDw �Vcr\áô¼üàÆ+xK´‚?6�Ó{h‹õW6 |µg#æÝï`Ã0ä‰VÎJf†]EjP&0o—&¬â+y~�ƒB^´á”æm{­÷°”HÒ&B>BUÞ$y‚·—µ‚Q&s¯@ÈFS£ð­®T�‡îîÈC(¶0G½ÿdo=¢ÂgÌqA÷²Ž,ˆÛ¹@qýF™±wƈÂmÄ✿…ËJªþ²4+L¶QÅ7O¶…ŽùÞÊß&šˆÄýØF‚(FÑpI…PW}àÏ:¦¬N2­‹ ¾v¢�ÓaEFGi ÔH{|jì?Ø|·­Ü_~ÆÀSl×­¿ó@ }›glZn `•ƒëûÖžÖ ‡å™u€}ÌBa2ሽZ5$ ¹¾°Î?±àUÖ·æÛ~ ++4Šè³9JÆJÝ"{{¿‡5 ."ÆB/ºzäõ@1Ðç¼Ý§Aƒ† ¿¯§z lý•déè!°ãè]a¦Û7µ™`±f\ZË`Åê)K=IHR} k…õ¶yÊ9Š(%Н¼ã†ÖÀ ¥Â$q•ö¤íÏ¢ÃÎäOѬYå'¡7Æç]¥¨Îk6—2¸µovùÚäpƒõÑB>øÙ,ÁÙ{}gµs“~ "×;ßÓ áØÃýh ûhð«SNhüµ†ÛÉ�&ìïövB<¯¢oÇü/�—ŸvGY›eYñQÄ>ŒÑ}­k5Ç—‡f: LTØ�ALÄ®ŸVfÛ•´-©?TœòWYlŸ°Ÿ‡¼êäµçiyÓXµü€é=¢üŸvñL·ú‡ò£‰)XÙ6~‘°¼¼}«8lš4 TDÌÏ®'[NŽ‚¿«ÍõøßsòÝhl�º£p‚�Ü}¬Dsî}kyþ‡WÀ´³Á ²<ëíu¡È;$Ð0Hft5Ùý9lJ©É1uµI¿mlVC ½¯k›p¹i­°¦§LazgŒ™»´â|èÕvøK/ýÞJõiH[dÚ[8�.^àmÖ ±D kJ�ÆFjUì‚£w¢£ bL3tÇÒB›ˆñUÙ¤=gÇŽ¼k ñQ~o�]·”Ô™âÓd 4ñ‹eã>kYÌï·¡YÐdù€\Ø|æ¥TÌzû¢S.+�,�‰¿`%pt¶EÑ�Ýõ"‹VJ¶(o+iwûJ®†zø ‹%­Kœpv¥Â_Æ«µßŸ�Ë¢0³’ÃÙ¡‹Å@ápíãNźç|Vw;ÑmSX¿Žþ¿h^ Ë“[c¿ueýÖ73s¶Ö'æî— €û¿¹RX,bkܺêÉ4ÛßÛ3Žý´}NbåÀ;XËìÀcÐ+×Û…[98ñt7–;œKâ€`Ýc’N^êÎonyW ÃeÁSYùË?"f�¸öÕÅË"íK|žºJ÷œÎª¤ •ˆæE .Âsg¶xMD&g€ûíñl4!±¦Ÿ®o2›ÕÎÔ“aë«û*áköß3ªjœÌW®nGBm¼"åÂ8§³ûeTï�@a»æ6_˜Øhƒç ·¸ADZì£GªÝ×ÎJ�òÈÉ?²“oŽI!0O›Q̓~X°$áŽöTt;–¬ù Õ¤ÓY·$ö$,.…8¸ŒE`‡É ܨBŠ8z4Î"Ãsp¢S¹Ö³ RR$Ë;iqÙ²z I±Jð–Ø6õ’;tDeWؾ¯Ì M€‹PN!;kÔÖqm™w••ã „A•’±##l¬6�ñðºê‰†u�n`ðÀ“h«ît Ù±YPï$µÒà¤Pp×ôs¡!¤X›šútżíöDo¨¨ƒÊ|sÐyÃPœXùšN×njojNà(�Lþ½ê­*çaõ‘òJ“"Û¡›ã,˜}Ëíú lSNË¡ †@*{ {*Ê_SM/ï¯�Ów‹_„7�Kn¾ßÔ.�fÆ$y�͘9k· Ûîöjvaš5Ö`‘óU-\ÞÂ`¯YZ«”µ[mÕDxÝ—/ŸÂ^¦3dKLˆU¾¨žo Íl¸êÝu–Êíü=�£3ÓÜ•UÂÊt/{¿½_4|AÖö -°A"œ•�'êG­³ùþyºeÑ‹X—\j–x�ŒM‚´�µ¦xˆª2¬øxàPDâÛgà™´EŽª¾{[½+ yhEÌ´ƒ Ý;€ö­YÛ&YÈˤ� ¤Ó 6S¡«62\é7×µ‚@¾È¯†óœ%NÄ=¶Ü`ª’X':sÈàýù%àÚ zÌ2rÖ˜�c>Ôg8á]n_j«¡J+‡³sc`(N×2A8²®0©jîÉiÄT&yÆ,s±'hêÇCBåcã³,� ‡fžáÛê…Õد›­›ÛÚ®©IòKcÄî²à�;Ö‘ÅÂü[�X"'¦mÒD´Œä.mÉ7œƒ².QJ±ÁÆI˜Rò S�ì(µõÖøå` ˜³6üç%Ý"1Ñf9f²¡¥¤ Ó#­~‰Ü>«ë¾z}ë:Ô)zÐ’üd0z¨Cß–ÊçA€f¹z‹§®±]ÛUYƒ�HøØ'žYçñ×ùî×DÉÅp·ÆþlGÕ„Á8qlÌ Ú•ðîpJX P{¡œäq¯�© ¸f6e"W:Ûæš…ŒEo0VjöØ�¦Ä¸‘Gg(ëëAßo$-a¦S¬€áÆk&YT(”n²PÏ*ðU~³«ÌRV¶õ¿ Ì®´S[Ó¶w�4 éy–rrWdåp¯Îg9;a1¢g‘t}�e< Âׇ|LiÏÚ°bÔ FÎÔZÓj‡«+w±Ç ª1+ Ëìù"£½5X,…g�6p¾™Àõ�ë °aæÜÑ~ôIÔö\ÒÕ`ØÎ8³cÇ@PoO€R<«EÒŽÉ àw-¬Èj^×ÐpÉÆw7 {"yÃlm©ž¸ò𕚅[¸:6Qâñáœ`ºÌ/!Ë ÜÕ%ð6÷|~€�†F)!8;;Tô=¨ÜkŸˆ|NÓ™�','¡ß=öùVÚÊ‘ôU—’¹BêiŽAMØ¡ þ—Áˆ3 0ôæÄÕS Ð…ºÒD5’ám6BZ%þ3\6nW0Ö€À¾R›gP½ª3¸ã44¶²ãv, 66!ÀB¡$¶ÂcUÚçÃum»ÞîúC*0Ù`ƒVØlëÞ»#¡v=¾+Ü›M8ÏåÇ`³{ ÇHû ¡¡â6¦—ªãí‰ë[O}l}ðk˜ N|÷`î½dzñ‘oÑæ¬Ù ~èÏk!ÁPËu=ð5µ}J„—!½žÕÖàƒfÄɺ�cg¡êk#_o >}�/XÕ÷që=§7¹=Ê÷™À(ögóÝañ{Ž‚‹T–¸¾5"ŸfÁŒžD†�n'Ò“gFWé?­ó¯£6;£O7ÀƃºÀDÙ‡§ª›€=†€Î‹ƒ(JαÈLÛeбÂóg°Í|:±}÷Pø6#Øü.j�94‘ðb×�¤ïÜÅ¥ ¦£ƒXÓ u—aÀ3Î�qg{3AFoÕkIÈ#Õi›ä'Èg0@­]RÔØ¯9Teå€sSÌjAÉM2{ÌÚ´&J©~{F��î;áÈ#øé -[•]&ˆX¾1ÄM,’ô-»K3ã£äËÐC YÝËGÙ|ëLؘ%Å5É™îüÃoÍk/ªMÞ<Õ�¢˜ÿF  Á¶Á€,ýÌÌ ff`!€`Á€`ئ~×ùuá΂€ü{ZÚÿ47ùašØô"²¹Òÿe3‰ÁÖkº^.7S±Úç¾J‹aZ€‘“qºÿjÙX©ày·da-ÍðãoÅ· U‰�DFÚ#q/ �n!V‡a/óØ�² ·B]�QÇ‚éí“FlìÁ pŽ¿-õWø¶,›š»²"´�¡¿B»ó·ì���¾\�”Âæþ 4x[δàk+]Û¸÷*ô„@£ 8@’‹-ÙrÞ™ä8³ -I[ÊbY§]Gr/…Ó¦ð� ~,æ†ú@WSH �ézj@’ò˜h†á^ý¿»«�²:/UÐD‘sB l�×·kžU5ö…H"„\†}ÚÐ7”"$´U^Ý»4Œ&„ ÙfrH©¶J•RÝJaR"§÷hZÊÄ0‹¦Ö¨ü^rúLÃÂ8ëŸ�%¿Ó<Ž x|ñvGÌj0 Ì€o�–·:ó߯®?zñþrè|í¨`N8pðö'ä§1—ß9Žª]:Ÿ;ìOt Ø.ñm(×ãê›pÙð°JÝ·d‡¡†ù›ý�ø`›ŠÍáÑÁ s}Rȵ|~Ö awÅ/ŠˆL§>ÅJ\Á)È8‡aïKòÛ{ÎÝÜ;qœ= =%�&ã�QZ·EzÞŽÇ�ÈXäÆát>ëžêm»Ší€feç+�!Žùú3Þ>²øËØßAõ„¸?|Ç놸³¡Œ¨ýO)â}0ó=LÖé³8ù2ˆÁbÒÇ'”šŽÙƒâ߬UbS*Ç…uþ‡àýø#¿DÿaË�€¶Úß--_¨d®¿XµÏŠ…Š£k(ÍÊ»qpI³£–8áóÄh)AjÁèvC³"ÄàŽä©£âŠQУcyš 2”˜.j3ä5‹ïr½ü`©ÌÕôåØÞv7)âß$º]Ç5§àcÓ�ÉOŸ]Ëû{`œÒ7ƒšq?jþØ)r¹#%¶\®Ýæ )'Q“^sÙ¯½rï«yŒÌYÑ‚þá@#>Ðë [æxÀ~ŸHrµ*2]\ßøf ò/öå?Ž9Ô.£õ?Çö?²M°ÙÆAÁ¡j"[—í Yy‹ÌÏ¿µf-®gyÁÓ±ÿmâm`|¬Õw›Ù0õWüàcO�PÖ3×–ìÊQ¼½‚â×0¾íÈÎa„ƒ)üØkuÄ1 |ì>ß¶Rmrí®Z„ȼ·çÄj™v™m}Üïe¡GÑÙÔ�6@Z|[>r!O‚Ö:àΖúÀ²ãzâÆê‰FGn\á@?~Ýö€¦ -“Ü;¼ÛwâêÈ·Ö%úÍmQºmÌ�„£f§Kó)Ï\,±îxì8’ÎX}›h5–8µœ¤Á1ŸawŸnö0dx^P+Oåœà©åó¥¿Áòý¯_Šn°[:'@œ]�Ùªèýš«O $ �ö·@'=q™”ØŠ)™óÄÍ=ûœk¢¿p;e–z¾db§ÛE¸6×D>&Kñ^t»^q �Þõ[(] ž õ‹ï7ã?çÑs†Ð´\·Ì 1Ö ÝÖÔTD–-‹ç³Õ ¹Î+pça-ß*ä`U ¾Ç"iÁ�Y‹‘FfÅmÐY:¾˜cœ‡e±ì/l©eé“ò!o¦Í¼º÷¢9Þh.kιâ  ðÙ}ñ¤‡í9ßœoOŽyÃІÜØó©µ4Æü7ÂݦåYæ¾SeÝ«A�L`½S"®Ý+BŸíÇ÷ùn´/6íbJ-· –9“š{Õ®NHb6µFú±ÕaTš³9¼S½±¸¼�¡}EéÕwYÁ^®ø|–^þœ[‚ί$cåË'\¬æ¹c"H®V/<°?§”­òæ´¨ÄY´~è’ìÌ={K êë|,wkøqlÕ�D0ü~ÑÆtMŽûÝ—Ò¬û¬Í;û·°Zš2˃2Ë9¸Ó¤;aìZ•«Uÿâp =ÍÒ–Æ�@ââÑèÍx< q#¬KQçÏí÷˜÷Å_ôüƒðwµmcï¹íêï{P/šÓEƒ!Þ-?|<ß>•± ü}^0]>wl'ÁÄu¸O¦W¨z£|úû´¨y‹³Ú­uÝCòÚ�b­–�Çà>¸ÔÜn± CæO®Åœ�d±gö= N $­ŠÅFÄTÉ�¶‘¨ÒÖòµðð•Ô ï! ÷¸‚½@òÕ« y<»»w'°LëQ«ð¬`ØNŽž»N.ãÇßœ°oß,Ú—ÎÍÌ+Ùl}kÜY¡­`ÀüB7±×&}ÏSÖ>´ÁäD)²[zI�¹eÅœ—îΔƒŠ1n†pÁ«ŒØ7âh~üc­ÊýóHë�ïQSæxg×)W"&à¿Ù<óŸo×Ðç¸eÝúÓŠCÛ5Ÿ}ófk%…àü:K&¾}àŽÔô æ�é¤QrÛýô^M6Óïœ Õ¼{m¶}öGgÝò~�KÇܰõ®k ο)iòö³¯�¾]Å'ÒŽiÝb�ìßwcÛÑÀš”j‚@qëµM‚rŽW´GÇÈe€L]þÅ×gtl &¸õñ¬ÅÃ9¢ÂÓ\±Ò:’0·tÛ««¾ ñɱZñ߯/Ïuéáù·3ë^7n%¾|FyvåÏч ÓYÈ0DuÃÈÎ Èi@‡À²¦ôÍ­$î°r\<Ê×ß4vÄÃó¹®ÒË 3XØ3A‹ñŸ7äwt[°p¢¢Ý:[&N±šíŒL1—1Cz\ã¸Üñîi~ï6}2ªRÌýÀâ¯h={°í<­WcÀdqeŽ~éÛËbùš°ê›ÌÌO'ÔlÏj ÊhéÿU5ƒ^ïU<ª ŸžóA˜½e—¸(|Ä'oÔà SØŒ�RÚÄ‚‰¾7¡QþüšE—;}^ß>ÀÃÇ[>õç&#x°/:À;¸¬Y×–eKØçp>÷ëÓGe·YRrç·­X DAêþx�´ÊwàUCiló®v½?fº¦&ÆquÑàíçØ‡±a?H—”;ì(éêâBºñO±à| æ¸Ýøû Ÿ·Xß=B/p«¼g%ä�ØÕ�kä°5‹†­$Èd ,—áøWãn=‚Ÿêû³Èþpÿ½¿—žÐ0oNƒu설x¿m¥¸ÈS•Ǩö´Ö:6YôV–B‡Æú"AM“Bi`½55êö\ $Øý€ôæ°Ï6¨b:3™aNd\8Rù{ÝPÆÑÌjÚ•É�«’rúúd”½—|ŒÀRhä‹ëný¥jqã¹ç dçˆÄ/ùJ‚j-ÞŽ· ö’"U~åñÁ´R‘I“¿oªÌ+ÝJÎA™t¼¾ƒÜq´Nš 2ÀØ!ùy9ûçDéo¶2ñ–Xv¾µ¤%=²šyÛÛ4Ç ïÀ �n–pöKo•¬û:4øSó}¼C®]PS \ꮊílAŽG­,�XLt¨ó=êe`oб ˆ×ÖuÁ¨Q¦‘UÊ{Öo¡ŒÛ‹· ñ›QÇzñ‹Œgh oŸ2þœ¼2ÁLωÓ,3j8�8¹am˜¿mAÄÀxnÌÇäÒ¦Ñì.'ìÀ93nÈx2Œ#‹¢XôAµì¶ìHô‘îÓ (Û‹k™q¢+�`mʘgØÄ©¡;@ßh½JfÚöb6Ñ…g„ÕË]ò ºäޏM`³Upʤ²ƒ%¼UÚÂè³ÚÊäï‹¥Ÿ#øÉ‚¯ÎPcJ2G®D£ò„]93^ølr4Në–¢­ݰ< h£08ÙáÙΆ%9ÊÙ9Åi¾Ÿ+áÑ ï|ínI{öà Ía»ÆÞǯ§sÚ$Ü‘�ï��4¥®[ X¡ö¶öwoùÇ;¶jÕ¸[·øÜˆÍüMhf±_ ÜcÅ“ú¬àR/¥¤Ío®Ý¬ðš Bùƒ |Ã(a�C®â�Áï[ħ¬×Z÷ù,ùI°Wª7{¾\wÃæJÒÜ™ <³¸g¦}Ýl&L‘~Üp߹¸rnÀ×)O\»MÑâÈ6K¶)Ù}³QMƒAu·ŽnýŸuª¯¦}\xW8 kÑùW·†N¬ìO¬kfUØÂ™fˆ †Ý.F¬A—©][ªxãµí©û¬äc£`0€† Â@`-o«e­oÄ•éo…Æe°Ù«´†y8nöÌÄ"]İ c²ìþ„‡‚¸‚_Sx°»”²ð$=/’b.-‡òiÙÌìøqŠfßô`ØîÑßø›ªuŽò•$ŽXÐ@š)á*~úV$È.þÇønTs },×T üäQ=Jìïªý+_qíAJyC{IÄÃîµ9_ÍK­èqþË2¸KØâ ð}@=¢i�˨=†²GX-ˆƒ­"-§ † ÜÕ>UO‘‰:š+[±7ͨIP/F dîõ¯Í¸w³óõóÖß?v"¼—Ý’»Ä²%BüTq‰š²GŒŽ¾Ð4r>I=ÂìMŸìû{£Õy‡¹ÐóQñØÈDèÐùxOv#�iH-U¯Ö0ç$Réã ÷Oâk°åƒRPÄx»¤Fžž_WMAÔD=àRVƒ{Gä3’DZïµjƒ0FUkP“+¯í‰ž,ô�$ð¨U=Ë)Heû™ë9ônÊϲÆ�|Ø�î e½ËÔÌë¬ë`1ISšûà] s$ ÝÏ•L!—¸ŽBwkÛ¡Y«juÂ93…éÌžé‡'VªÝP´&…‰ñú¸ôfãžr;3b䬶x˜«=�娛0\ÉêÁÍï` p¦]X³oˆ8%8ëñ`CYïÙ \`�Â+ÏóZéÌFL )ížBÏïMíðöû âzí[yj|°Ë’ùî~åÞ/P\Øj„H2á®ÝƒØky Y/¸û\ `´ fR·zí÷ ìè± µ­žvÛKoâ–³ 36-™x‰Õ¡\V6a©¿ÉØä„q˜¿k1·€á~êZ56Î-ÍA¬©©ŠDüéÅ›¹¿}žq(P�µ´µÌuÈ]³iß¡íóÇà‘NÞk¬ ¯¾[š8ü‘ÖyfVª§Ê8�ßÈKúµ§Ž“ó*7Lyḫ¿áC˜}®�î5R^"®ä¢TÛÃW²Íê¹ÙŒ ç‘hy" ž-NhlÖbýN|éŒ2ÜÃâ± ¼"ƪŠØv¨Zzì/¹¾pÓž4ä==|*ù1îýOÑ¿sîãP½é›Gwí|“{aU~Þ]À è·Ðm}=Òd-Yàd-d«(a.ŽwÁ: ­9í'AÅÆ=©æ�qoU·�w•JÝxT5'CìùÜ|‘ûk½@PFÿ[Q´È‡×xúF™~}‚ƒ9çGŒ/F¸ò·´úÞ9°\#lC |üW¡<¨Œòúµ?1¿N´8ëŠ!ø”"Óò/à³jÅìÑ��sòÐðŸ›q6îƒÄ¯Æ£[s“Q÷FÚÚUR¨å˜V«ð1Â>�@OZpkX<`½ ÒqgÖ? Ä\Z~:RKh„-\§µBð'ÌÒ)n`¹ MRc{]Í€¥.nƒÖ»HþÊÕR-UB�gä YŒbÒœp)C/ÇÏœÂÿyÀ£U3§HfNøÉÐPYH²,p�eoÁ~X(JÀ^ô±ô1¹á�À°ág@é[¼EòÚö±Ñüä ï¥NŒ¹œÒ EsÔÅ(9ßü;š‘S�;£Žtà6ÉEúFÿãPbÌA£ë\ * †šÏÞÂQa«f±Í¡§o˜Ü ”ù6ƒk�î÷™Ç7ÜFà†³»tUüûKŠÀˆ/%9Ïö‹+:�Ö®©SÐ×Õ¨~aàyHºNuø҅¾“zòl3;ù´8ÇpfX×$×¹TŠYWÆx©6í`8íp½ÚVHØ4M{h¥˜˜d̃!‰„ }¯˜JNI1¼âYCs¸Ü‘³A{1‚›Æß•1"3Ʋºù,ó£ÀÇäµd'à:ŽÎÏcT ¿ƒðà塌™°JÒ €qÛw¾” }݃n§w7Ñjܺل ta�,Œ‰ü˜})þ['×m+ôò>­�=bî);šÝïœq…2Y]á–qø‘¥äÏS¾k6ƒÉDãxý:b%9½6©¾;Yƒtu{[bÿO>Ç'«¬ŸáÁýÙ87sRt½Ö»zLb8O§½BSÏbt"€Æü·À8Qƒ‰|À¾qvÕß WH8–ñ/aÅ׸ÅAfÆ‘ÀZ*ÜtSpί{îûÅùêmdâÛÕÕÏ>üp8Š pwFE%a*ã~gZŠË;s}“Èö«°öÙç� x»ÑTB([ò§×õaŒ…£ UˆW1‹Kg™Ú­…ZÓM¢æÐ<¿r˜�8ïØ…tîvBͦí`‡Žwç�DÈ] ^{±‹}[¸­ çA(O†ÈOD3%»’9¾‹W¾ãWfË�ícLª sº=6q?³Ô…~ç¾ú‚=4„ãbó³�K=—�#KÛJ¡e£1|Íc•Û. \lè–î1gÎbfSŽ&>æiuµn–•Á[yèÚyÙPAÉ:Ô6ò \éFâÔkc8S³óOßà«ñu�U³–«X£�Sþ¶˜, ‡Íf !ð¸›8D»ø¿w¸� ŽÝI÷b7CH—ßÂÇÂŽÀæù¼ÀT ÖÓíÕO`»0.d‰Àׯ!~ÃäÙ „íZötνÍò2Çcæ×¨ÑŒ{Ý»«ÎÙ°ˆú•H¸ E¥‚´J€¿®ï×ÚlŒoªÃR¹rç*6EkŽ3æAe9�=þÀPeìE6 ‚Û@~ˆúÜbû2DVj7[ñlÍF6A—ËåoHÙ[uù­UÃ^ (ÎIº`8BNe„Þ¼œ›Rš¨s{Tµ1ýûMÏ@7Þ6TÍŸ…°*=nv &ÁmÚu‹·Oºð9© \íÒ2ØŠ [†½pûx¢ÉjDî …ƒzv²>õ´¡Z<‰ºe�Ûk0]‘.4hÝKžÞ(Y²€…½Uc{<þ•Üó$#˜@¼ðßlC`ø¨oäÊãùâÝ $'H`­—äm„OTÎñ`&JÏ41)’!ä÷¶cÈ–uE§$t�g&0 V6ÛÍä'Ï4CsøŠ•±Œ•f×éÖçuV­'‡´L�¬!ÖÂ�;.½Â®¡Ã‰¡DÅ DøzÄ §}ˆ}8Rz ØçRÐ;;™a`Á¬ ê'œQÊöf~UêDðz!úøHÛ&Ý%òóýœ«Ï#üö[Dë)9)GW»@UKç³#/˜µ©�¥™ ØÇõ¯&�üÃl08fª•8’ËÅì£aO|(›lØ.óY†ÎXÄ‘¿E.¹ ]¾…ùŽÞ¦#ÊŠ“¨Ë bõÞû¾Ñh÷¶uM a±ÁpŠœù ½ïµ9Lê°“.2|°y³;FÀó- ;ø0Nñ€¢a„`j�NúR轉.:>q”æ404¥®á–KCzî’Úæå±QHÇŽ'j�Ò·ýÌkfG¿ßo¯�<ýûKï®m!è âð¦�ºZ%Bá†,öMq¢!ŒÊ’ö³Ä†ƒÂ«]ºÔos>æóƒëæþ‘ËÛX"m¢@°qLúD$eí>I6+Ú ‰=øY~n7ŸNhD´AýˆÉŽãð‡j5©ò@%{c£;4$²Ùþ×ä&M<ÝžÍ0ŒÓ¦Tæ®}t<Žï„JFq„±�õº ÷?&µ›�PSäoháM¬¨2³ó.›Xf€ÀP\7|¸w©¯èÃ¥3w٠̇—ûSrNL´2[o”Nž…³+¬PþyÆ0“¸†Â•æ€N³ ß%x�Ep]ÅG™Ò̽ÜèØúc„ÞÓ8Ïâé®–Þ7G‰¤í0îp†ØåMÇÑäyŒÜ%š/ÎPèk½¾à60¬6ÀzÞ¦J?sÌLзv·Í:vµ‡ ë7nµ€Õˆmn+˜n<61æüèý€š®RŽ(Vù4b+ä þe�=AȶÌàl´P7…ü4!&Tø›I�Ül:©ŒK[åÎElbE{M 9§…�Šqw7•¸ ï u�ZÐ:ͯn�‹*e³mý¦b¥ýR ˇ-ƒÉ†R/ ûneby˜°�_<³†ä#Š"l¨,ÁÕõèQv#¬€šËã#•H.m¾¾­ÜH ‚ŒHe—¤a­#¤¹Kl¢9nX¬ßQ%IfªW³8JzhÛ­Þv|G\Úþ×\|�7\p0L9Õrz{ê••þL¾‹;å"^­Õ¶ŠÏpÛÞh4k‰3.ª§sI�Ø, 'Ö5^Ÿ�NTõæ K_>þâ c•QÒü3¹ò÷Ü3õú–ž�B8OÕ˜A]M>‘0ˆi£ ­�÷óC¦Ü- ø@¿*o»{ºï >[½ù¥«{t>ÖÂ-�Y§²€Á‰Ç¨*¶7¾7Gà¸.ãJªñ¥O™TW-ÛkyÍ`ª@…’¼‰¯X[óÕ¹ñóÖÜûíbý »â/×t=–•Ãå½ß\âß°šÞ'é¦ÞöŠ]Í%° \„Ô€­ï|ðtuEùy½¯%ò†Í8ãb3/&óï´kâ88ò'Ô/—¿µœ*1wÙNމ|j…Î*oô-�þ®c“p››[Z¼´æoiÄ` ³ð8ÑŠ>ð˜N0R‹ø·íç�„¸-b‚~3¦È^ÙÓ¬@,fän „NelïG§òcß5WØÁbƒ _nÝèsåHƒ²š–Íž>1ê]j•޼B¬ÏÞA-WÚ%Õ¬d�oÝÎ;ÀøŽ^žM¥Iõ_gÉ� mƸñû7‘MÎZ½/F¤:ãÒ&¹Á—¯½bŸÞÎ�ìoWÜk‡}/¥•ÁžlÊÜ ûž»$ñˆ²Ñc:}°ñb,›·r_Ž eÙÈoi ÄõÎî_mj 7˜»Ä¬û·óƒP~Sn>ù*Y÷RIã"³?…Çi|ÈA9ûðƒMÍ}ïb­-|o_¥o?Nô¯ØNʪó:æD� Dõncvý‡¸}Üa ¾DJ“Ûï¿ ¸`œ*ÈAvn.v1ìÝRý€ðuˆ4½Õ½ãI}äHCva� ‚º–\T�%Ù›&ü½£ëõZåÖyí°ÛcÜûwÀSäw|¶Ÿ\¤G-�ƒç«œ·EÍŒGX€Šâ= u@¬Ù[|�t³]e‰ªÛ.6ì%›*gÛ7ÐIÁVl¢ØGßFm],5¤óx±q-ðý‹æ»jËV¸sPGï(>Ür—XãjZ�>þc éädfb -æ6Œ>ùkkÒI0ÓÙm×Ñ}ŽôŸYvß®€Ç ç׋ÅrìrQìÿpqáê¸l+SÉCLï`¿Ü´FƒU¹IžP‰Š†Zx}Ûh8�,`*'gWÎÓ¸ØÂ>úñá 3k'X&†ÖÖ¬¡oDž²Ô|AF. OÏœôø¤2”• W £é×+}¥1U/Ä“„²õ1÷S¼ÄjŒ¬z|ˆÓqú‘°ÇéßK«ð¿knjä,ÈÉ÷Í�¢™#J ?>FÌ~Ç‹8M|6ðø.UùgÜôH§C »vùÎC(„泄á�éz°=¸gq/½†Ëö£w)AÍ÷NjK¨CË@ò‰gò˺c^m±-ÁÊ”/¤ö— õÖ˜þ}·êÇ}/¦�åЇ±¥¿,è"µÌ”Z¨rbp;ɬÀÊ¢*Í¿F�ÕòH2ÃÚ‡íðÆƒ£eÅÄ4|F‚Êï¬cmý‡HûáÄ ó’Ù*@ÍÝnå†ôGår|¼‹-˨Ñ4á-˜©‡éªÁsšEmýW�¥±<#ß2ûF¶� Ïß^À�}ŒéìŽõ@æ¥fÚ·ŸÄjèF>ú4ÙSíÜS:ªkH_¾Ÿ�WjÊx“?ž’»›'Ö¶mkž;H1¨UÊr‘~PSZTû’.Ýõ›^u™Î3Ý™Dù5 ãY/ò`I·EÜNàó7Þ”/ƒÕCF*ð ûÆø¸]púe¡¡#R¹�ÙÕò—˜F!²«‚^RÃOê�aèf\ í×Åäebsk„ë{®èZšÎ-ixkwD.p‹5j[eâô >˸´ a•CPÀbŸ[Ÿ.ߥد`‘ k1à·»g€MÉçë^x}‡X÷öˆ'æðmDÜúÞ>ö0q§¦ 4üg'™æ’øÐ†£@¨îLù1Ø�>ÏP:o¾›†9GÂÃ�åkáY}]Œ–$OLƒŠ-bý˜b`²)MÏ =rz﵉mÂ_ ]Am�LàõýÞ;Î.}ãƒõ3­_ôG!÷ÝI {3ŸO™),ÔDšÇ††ÿ`›¸…|Úáçl>0é«D<…±±Ý6ýe¨ýÉ íœÆ-¥ç©@ià/:ô'µT@!Øpã ¦¡s½°XüQèf¨C˜× à›“—Ñ€}ɛŰdT„ÌO]0éŸ# ë|<œª¾>JÍØ2DßZ"yœt™î?”2íŒ<_/u`àãŒ;–ƒDØ:ƒ¸œÆñvÌî³€°»¶ÊÇWËܶ­e=©isR1¦B %Ä'CrÅTæ ê°=Œµ¾G ~·9AeÚfÖØ+ð�q‹&ö±‹ˆî?´ 2®±*ÍêêÌ�¾•»l¯"¡Y­ü×›—õL|�þçòWn¿_©�ïÅ™Nbòå;…8̃ÿK§á©¼vJ¢Òjeøqlñ„“gkƒƒ¬a’M–P·™©Áœp[æ“|oÛZ}½…ªKò�È|KŒZ_¢\måò� kb){õ¯ªnÒRì Û"%ôG‚3šÓap8KF€¢´]fè�ÐÆYöxµ“ z¬t,¯RFˉ•pÙ�¼ZÏ <·Re“ð£•k³d›d’çõ×˲Àmv.W½ÜÆ×j·Gxq7ÃÀvT5ÔáE« :ìr€Ûº?amM‹8�D¸Yk(±“[€Æœ;¢²y[¹ÈnY3,Š…äPÖLL@\í@!«¡Çi8#\“†î]Ü÷V¶m”w�È$«‰ §#c�ø[Õ b,ÕÓ,ÃÊ�g� i+{© .ìŸß§Â?{'ÇjÑ}ëÌ5·�—W¹á®>7ªß1›¸U ¢,^®RÆÀ†Xõ±•³«³cƒî˜W—fMu«#¶¹*VîûGýØ8µ°K5c kk–Œ�ÕŸƒš¸ÞVÍ«ª;¦Ÿlç½�¾ªîá0xºïN’¤dã°öÒ)/k�ƒ«C`#¨1EžiâÀ~¹v4�³ª„Ä–ÙM°<3¤@Èiâ,m(ðre’͛ۄž™¦~†ïß@q —Kå6Ü:ØÆ9ðQ?~Ò~Áì\X-Z-Ï>î¡§Wa�ãˆLeþÅå»ò=Ûq\´_øÕx —Èð9QÇÙ‰&l!tždbõÓQª¶Ht²ãîÊ@-ˆíß=s¯Aª áy‰ƒ` ç^ÈKÝœíµpמd'wŽV°:RÝãHÄåøtã$z‚å0!)ë<«~ð§t×·Í# Ò^ZûÖä˜IL½ÎKdêë+Øý v[h_"[ŒÿW{¦Þ�ÓI ?�î+o†"ÛQxÉÈ’kDy;77ÁðÂpÁ KÛŽ÷…ïÙÕµÜ�S®¾�<¸da7ª¼›ÊZˆ¦k´QÇ23~pÛ]v­*ç>æFñwóF¿lqC{á§. ilu”Ÿv¦¶ÝCt®ëŒiÎìB,ɈÜñV€ö:ß² `òâûÂï A´6´;±ÞøŒ–.¥ôº¨%å¥Cƒs²rü¾ˆÃˆF<>7Ó’wˆ†Àd  ¤º�õ0õ+­o¯Ð°q:¦N¹€ÊÃwô)ŽcVR8 à^Ìå°!Á°–¹ ¡k ½Hœï™ÁÞsšQj-ÚRôÄf_Â-D*þ!M©ðKFá­ã0á,B³~“žÂ-ïG:¦±�ZÃýŒO™6ššÒc`9Âî2ÚP*Ü™Õbã²|F$S –~…­˜T±¢ÊÂZ´M¯«›\ñ¶P´g›’w`½š{ÜóN…r³S­¥Ä®ŠÝóC{kãÂG˜Ð!²C.Є]+¤2îì$à†¡n¹mRµMÝ0‹ ˆ@—!¨^©!¯‹¸èÓö“ºÀ’Ù,Ö!¼ \¹k–¡v[ÒÃø†°ƒ š¾‰Vw0G¼Méfç‹Â¸… ”b¡6òªd¶agÔÙ T�Vétt[û¥5—s¿ÈwD*@üX"zヤÑï•€9(Ý®­—`;”4FA D5ˆz¤÷e£û嚦:Óš¦±o:^˜,ÿ„ÒÎŒ‘ö•‹ �–úvüª˜#½­ûë—¤À'».�X@9YøP­hsB7¤3GÑÝ&‚ i2X4̲²³†Ñ` ¶Hè�Ãê»v‚ÙºÍýîV:T‚F ?�½ûê�ÎÕô€ád~>‘& Ð€wüa®|Êf¡sßÕÄ  {d¯GOÙm]�IÄ~,e ïòý Hâ ¾1�˜ .B>*Ä"yã·@“B1”=üšÄd�+é¶=–,dߊ#.„à%{8’j…ì¢lãžË“°_jÄ”YQ Ê MH¶žÑCõ®ý–&å¶X4B zXz[$ȹ ý=¿`€ˆ¾ˆõŸ4ã=!Í¡%¶ 9¤ÈÑ ²;< y³ÁΈ²W½æ–†Þv…®ø†3L¸ƒéðŽÈ,Õ `ƒŸ3ÂHP­è°¹e‡…†*‰`Õ(ÁðŒ-cRÍ“s…g -Å&…¬v@Ñi,HÊ^é0ŒŒˆ±a@눓Ñfìð¹§t¦dTÐà�‚Áíë³®+ñ3l³ °º„Þ&m�>Í6kº4ö†H¦4ó•S) Ÿ o mBl‘c2†Œò:4�/W«°C`&ç%¸@Ö!èCÁñ§ %7ùø°ç—ê½2ÑÏ7ƒ7Ï£nã7ŸË�@ëXQxgT>³±Å}WÎÛ*öΈoÆï絚èvHg¦s(êG¶Uvh0(ÙfÀ(c�P¥i5 Bbmµ (%Ø-¯!É®u°n]­ÝO5pM“8ØÄ)$d‹´º�alxÇ{‡÷amÃ%Ît™©´:»Öwù~öRH 5¹^C›2ô"8ÁýÖº\)ÊC!×/Á`ºkÈj‡azÖÁðRòû)š`ɽ¿Ï“V8J& ÷Ú°NGÐ6”;JæÍóLj}£˜< q!B!¾!¡±ÕTýûÌ+>ÊV-¡ù45¿încç‰�C¹?,¥¤·â-l,Ÿo09ùÙvñaµ=¶\§IVÇ=\ü-Á4.J«ˆ½À²öÖdJ¬™ O(H@p’ë™ÙÍ(­› D),ú±Eˆ€òÀ 9�gñj¬�¿©6Oo‹z|p�9 Æ§b!½3Õ„,6ªr–Thõ�GH„ÀEgÂÞ( ÒaˆË›ä_@Lª.²¹PÍó7Àm¹ rÊgãeœ¦žè�?Ä–;ùáT£Fã1{ªWeóòùÞ¸›�ž`DÇÀ» ßš™“씸¨öÖ 2†Ð*";úA³[¯¶Øô8ÜŸ/Q‡ ¾¨µ¥Ûw�ƉÍÍ}‚Û4áiþL];edkÛl¼|¹À}“`–É ¢¸lî_g‘4Vå[;ì‚ëwúÁ6v�§Gé! ·J÷å žqŽ[ÜÉýT”k.2å½ß�?5å¹O`¶F?kpÅpC Ë„8[FÈ–¢À’Óÿk×e>Ÿ¶Máp\Ž ßWOÛJ@gIâ*C(®ÓÌ«\Œ‰8’å¾¹‹ >Cg Ìï* PÍôPGçßXVõ¥‰ñŸ7¢A]0(¿úsY S}« ˆ0¤LJE!AÈC{ŽPaëÿ]ù[Ý4[álq#E<öBuÄ5ÝGf;l˜a,É”dŸµÎV¿ > ÑÎ÷U™çeS¡ˆË=š÷IùìK hyyøïŒa…Ý&8¦¼sÕ4l×+jŸ2ùñJ<¨Ð>»÷døË½oEà#1ý‰Mö=røóñEÈîu}¡’ÆÂé`3^žÊD¹AàÛÓÌqà! {¤kÈnË�ÝV{`àþ̹ïÑ®ì;ÀØ(â�Ò¿z{Z½°â{%ÊîFÒZŸ]6!;Y«ªŠ–Ÿma¡„ß�E@�ëi}ï‘òÜ�¹lãQÝï?ˆ@݃�¦A¹b(Ñ*ë_„÷»êÞy{Phl^nØ_ö”€(ÅnzØ?ÎSÑ1mGSTN�‚zØøGêë`óõ]Š:{"/pjð�Ê–Ö3±÷ò$ï=K·ô^"žÜÐ�r‡‘<Ò (ñæOµkC=�ƒ¢hYõ®F¼nÈðàÓœ;]RYq!o®؃‚÷/ÏäK`! [ùw3–¿R‚³|‡š²Òç¬@+ó$йc…Œú¸wß@±ÜâôÌF ‹�Nš’†OYž’)XOHÒ«‹™TÂ쳊Ùað×Xˈz/ÏC(y±nÚnºvð‡UØ >Š Bhö>œé�ï§{âÎ@SÆ3eñ :( Ñj¦-²ñ`E©>h׺n‡ÛíÚ»§žNEªÆÝ!ËËyc|mYᨭã#Mo»±>SY°v»«Ëã4­ãZÕxW>:®"Ý‚, ±rmú»‰Òöt¤úÐp&©Le¾ÀÓ¢)o ­nî OßNWtÉV–;@xµ™¹†k’(º2ÊúAL }–Akcì9gõú¿_áêOká4+‡Âc2û$J®½ÃšÏ�Â_ K*À|‹+­W{¤“=aAûšÅèMï½^A±V´3/sï&·”ݨ¶ÌÎTQ¸ËHpsh?Ç+E�X¦çG“ ±W¢ôнµ³&ì¿î¹h8 ØÆEËa~Îz†N"jÄÁÖ%ô®î¡�°J’\7¬Í X¶¢zâ¾7m^´4¦ÛCÇÑuë[N¶-¦;_‘í3­ídž«º»\ãì_O7“-ÐâY�nzû!A™ ,8½ñÜÝ$ö¶qÀrxú_eÛ¬q³ÛhE.…Æ\µ³9MßvHqÞÙó¢îéBF²ÄÞ)t¶¨2í‡3½÷™3À³U¡I¯äµÓšø?#cméÍ>¤Ç²Æ^®n�rv>÷¡ ™žÈQà­h¶³¯ˆ“¬Áª(R uçp‡Ç·y¾ðJwY¶Ú-°>7WfãÆÏ{µ‹S&&>ÌÑ™ƒn–¨Ç\�å{{oÌXvØOlŒâFà?z¥™Ÿ„Þ*±ù~¥/Žñß2ºÊ‰‘›l~ÕÁ#73åïW—ØÖœäÜã&ÒÝÃ(ee»¦@ÄeqVÄ[#æÜ2]ÌX|/¬ÄØÛ{~Ã6-E¥z­T¢Ñ´ªÎ2¶œé¬"4Ùz�|vž‡m÷¾Öz]ìºÆ\½‡[TZÏS‚�Ä>«Îç¸/Ù¢ÌnTÁ³�Ž`X–>• Ö+‚,ÓŠh†›µã;Y—ÆPÆË)@a†`¶0x!¸z¯r”€k,QOñ»&ïh«ö]è|ùÇz°–*y-4¾©ŠÅ¥�ÃÌ•L‰œ‚xð çVø-¥LrSeÇu[ _1ÞÅçÊâ0™ú£d�$A/¢õ¿jÀ†)ZÝ·PѲÖ�ìy”DZô¾¾kGo8 «ƒôq¤Æêšô�c8®nèëÜ­ìyÌ è¦¤„°W!|U�2áÑ]�áÆ"G ]Î�d"Š F@�X­V³t[_�Š™¹¿â’w±›ß–ÒØ5`å[ànÝ/ÚÑ#«Ïå |ÂÎÐE¡Üü‡¦Ó<}wAøõ÷|öQÜÂÞ.Ø^Ý÷Íó6­©^Ú@çšÐ(9´†V60ŠáPý¦D½wÏ®vJ‹Òdζ\¿a”³ÉÑ.à#zHlbg8Üc €Iuƒ»ŒrgªT :·útí{SLÛ.ëÞôÐb7Þ_Ó¿ …ñ¸^.3ÀR;0„ΠƒV«ñ š©ÞöÈ…²ŒhÑ�X p³CÜCÙðZòQ¾ÔϼÂÏPA‹¨TN»Z0yÞE2)ºÛ8æßjÎ÷'åYœÄ‡*€OÂ)9 `›ƒ¬B'OÔò‡Ò®Í)ZrX­"wÅ6B]»µôÖ;FA„Ã;—Y3F\ð؆F73, ù‚Bc� V!l²—I^ß;½ˆ¸ì8dÉwšd�—�×åc>,®a÷©8+5®‡„È'Hò“û`œGîÅ¡®3ÌŽnTì �¸î¶é˜+X®¹Œ�[TêÀ¾¤)°" ¸ µ—/c–>Œ³ÜE·žf7aN.vÒˆà¤ûžÙ]ùÌEmôHßiÕ9XŸÆAM½Ý¢ÀÏtýý)xÖÑ$Á'(�ö>Ï`Ü«¤�5É4DÌWÈZ‡CEÝÃØàµbùtÂKü˜¹D_ÉaÊÒ6ëS4ÂôÁvàjØ•ö¥fÞ»ÒõÉʺ3ŒlüMûC»}í¹6‘ãL.HžHWû�d-²æ:"T2|,ƒ@¯AM¸EÂëdlÇá„çyOÕj}òû Ôû{ ]ô­&D3Àí²Y sX›†E+%8“tvR\ÓíG–У0ÚFá`£IÔ4³ûLœóÛ¡]ÝØþÅFv»RˆóyÙ¯šÖ=ºÓðA×�ß4Bòiá9¼áš´²i¡Ca~¼$Êl™j�±/5µvÛWc ìa�÷»£~j]7N´W͹!a1@džމÀá¾yfñjFö•l‘ÃÖïëMóÎÒ·®].1¡ß­MX�ÙQõ¥»u4=çcñfÆÌŠÒBÝÎn†{û7á_›OSLÉ­±ÚE�Thr'�¨qw�±'m� ÕÁ —ìmcYÏNLF:Ð{8øiuõj_õfúEëH Ëd�ç·ÁÞcB†róÆ¡ ͽÁÍ­ pl04,¹~+[–Ùâ~º¶„%² ut7= Ú²»ÌW8¢kuí ®ßŠ7ÚXx»Ò¸î­ .ÜO IÍš´ùÉðv'>`[™¾ñ©¡f§×Ç úv'Äo 9ˆÓH5Ÿe“öÉc¥²0ÉXIƒ‡ù¶Y}Àr-T<s[×c +£ ¶­%ñbw�u¡ƒš`Ã.Xö/xrÒjÅ«�Š0XÝ9 ”Aôs /‰K*c¿[ÒUªîÏ»ž‹´Gm¤- �-%@ÎaÉ^ýe§�' ²v�7{�¡æ–`¾3¨+©…\´¦ֆͭR¸½M=Lñ†¨.d¬n©ÜÜCÛžÖ3›êÜ“Ï J§aD§v°8ÚÔ/ˆˆ›4Ë   mF“f0VIÚ`´ÝLÖµÕ@€Ãò™æÂ‰ÑüáËXÁ€ üR«°)±¢7;^ˆ›Ü®Ñ#=ï°°C:Éê}¥ >„�’;¥…É®¾#<.¥Ê²-QYS³yò`:PI‡,£­ ?ÕËØCÑ®6P'�É7á#tMHW0–šˆ{ššFñÜBŽ…ÆèXpÂÊ´‚PÙË.?¥0…ŸÜòõ3ÒfìÝ:²·N:h2·g×oÊ~Ð�g 9N_‹‡Üíqß$§É›.¬šBŠÉÓaÿft7yYàk¤#N\ˆR¾;´×ã`V¿ïtoiè­½=� ˆ3·ö½pìØ€FoºIÎ;®åT �Eú7@q€½ "%¾„BÕ·üe•Ÿy¸"˜Í—7U¬py,døf•¿~i*8IJ7œc=ÒÚ¬:ùø%YB†Ñwi¡ÜÔXÀÍßAv}4J4ÖÛev j£¤èÛe£3 ¼M+áƒ@š_=É™_ ÊÆ”çml†�f>Yöqâ VÇsÞ?ë r‰÷çk‡màXŸÝ;Š=ƒÆ6ý7–š�tè †Q `jôWë4¿ õ˜…Má ƒ—ÙóŠg‘¢Öw°ÎTÄYãÍ9DŠïk6–vC6Óô°¶­b¶[ù 7S…“-|úÀs’ý6åzØl�â!º˜ Ô–`ð¨Ï«&Ë�q'×es†�ó!êéøPuƒ¹i6æ›âopç¤Dr Gê‰Å,m{ãU¦«»Äçç�hÁ€`4·¶2Â!Íñ¤Z"LÉÜ\NHê®¬Š­5‚�Y¾ï4lâzÎ=»ˆ3Y%ã†t•:Ví©Méh\ÅQâj ­ë5$x-ò‹£Ñ�ÒáTeœÛ\ÝEPÞt€LŸ±Œ5|¹·.r @?7/3žõnëÑ$I'° Ú2ùÑAÈ£jø~ׂ¾%¶²ÏÆîFivÊèrš‘C`�2¦;]jêÂDãŠm<ƒ$[žõ�]Dmצ°¿F­¤´B”°›‡ü —¢uüYÒ˜…;fù>uæçôUóÈ96<à21f¹bó4ø¤ ­½†<`‡éñ‹LF|{ Pœ?àÞšùÓrÙ¢ n1‚D>ž} BÆÀb:àvŠ1ÐoŸ*}�‹‡J³UùŒ"šñŠîç—å9–ß^Å·NkëÞ†ÆôivF±LfkGÉᲡ؋*èÇIz´Í©„^Âóº°Áañ ÞÖO±#´ë†Ó!j@ÛEÃ]CDÎ s6éæ©ú&pš,vHèÄ–ÉþEÒ`öš†q¡íié�7xD(Ý—\#¨ï2�Ú¢4¼Yñªzs†êöþ„z`uýlóiú'á/²Ú\zǤ);ê…ìT O Pç‚(ÑK¨¾],n¤­>0ZSÈ}õÄÂÌ3öP³uW³¹Í«(/º‰°7»ç½>ü1]N7ˆ�è›G€ XƒqJmÆïû§PD‚¶Gd‰çÖ0ÒÛ�ºOL 4ï%ƒè¤õ?Á¯vÝò\Â! ´âô�}®l4ÞäPh í{(À!ž‘ µ¨–vDéw;�‰¨¦nJEnZ†r 缯A.)}ëö¡öR;æ!á:~·Ýãsb÷.K›ƒ1ô�ƒ¤YòÚ˜´ EÀø�»œöÎVá B‰¶ð+»éÎÖÅôŠAûÙHânœÐÆ0˜ìÚ0#Aº�Ø‚äIö¦õÙØ«¹¼ZáfîpÜÍÿWƒ!ÜFö.Á;¦Þú3hïuï_žï~Úkq´âÓOoW(�±Ï¡�ow‘°Ó!slQ`2Ôº‹ €ŒÜ0ÕmR£Ž'$‘wm¼6 HÙ™d‰R(þS d¿8øã÷Ÿ¼ªG½c|† �ï_€ÁXŒHyÑjÂzQõkÐÿUŽø®,P6Ë8‡ßaϯt7$½K�!ÛŽ ®â¹Ãµ”’øÛÝ�÷>l­-¢“gW¹zžHˆõðA`'ôâÎÕ¸ºmÚH@Ï£Œ€GëKAPä¬ÕÃD$höæw Ò¦*E ô�©Þ,ŽìKEW·Bý­Ú¨õÄxWÀ‚" x�(ßi8³QÞCÛ³œov1ÏëË"„�è¹Ër $¹!öXKŽXË�t´ò¡g¼Œ-†Úä®ððQf®¸fÖ&Ù˜˜jeÿ ªÓÉÈ`rá@"ñŸ°Ô[Vm_u�¹ªï.ó*º¿bÜm|–” zÛ۳©úª‚W‹³ÂF-¶÷ÝîxZÂíÑi>0Cæ# /äá[×ã(#‡ÂyÐZ­£§É[ª–À}ì#Úsedm@\#ÞhoÎø‡L6Á“óæølPRàUOc£,–JW »¿¾»„æá Ÿy^Ýgñ<•bÁÇ;:»_uò†ë±½”³Ã¬8ð¥D`²º“AÖ ¬ƒvv# CÐiÿ°%©^}„¨7“Óh M!ÒÞʹFýÜX×)[rÍ\6 C Í{QâZŠ@Ö†óú~Ìðõs¾éõ' wÉXÏ 8iqî2/>R»f ßçÇ3Í©tj“®±A÷Ü¢K†Œ®>YúHÉÃô�:-izÆ�Û”…ùwg¬_l3;° Scr�*ºŠ±ïè‘óa‚õ¯ÜOÖŒ}ÉÂlßœ€úk¹Ûé äÒšŠÝ$ï*®_…Gé�R{ ["úÆÔi•þ¾ÐÁ^HŠ›Ù³^cQlŽÖ(€ƒ{Mä/*ð_GyÑÏDü6Cl†…˜5Èf bÞru7òÕœ—7�Ö6q­A舳†´¤Å¬:4gøŽ3¢/²ç]Æ:D�ò CÁqx“_�(˜ÑÕÞ ”n ¯:qh;ïxÞcÉоvª7}ÅØ„˜ùV76. dAô&£|¼.AÃ�£­(^Ês�Å„p¤€íYGkÔˆ½Yˆ¯¥mÆó"lÒ­{áîÁ̓"m‚­®,°‚ÒÆ™ÞØ#g¼ ÀÒµ·–°­�Žþà6_Þ´i(5¾lÝàÈÝF´Ú B¾Ö‡s=0Y©,�Í…¸Žè7¹B³f�ìIÍí_˜ Ðù}ëÁ¹ëé{#$ŒúÝ‹îírït‘.³ þk—Ð äñ´<8,¨Qœý/0æÞè h£,8[ô‘îÖŸÆ¥^í `ßFàöÒVæk(õ~îA{꽊¼{ • ü+é'RVˆ5‘²1ùÙ²ŽèÒº6`¶|a!v)D~8G…g‚ �.ÞôÈ�¼ ­öÓ¬s&·Ú•�� ÿlÇwˆTÊ£¶ù{c}§q4�â ¨dJ)äl{ªð£ßõ– íjer(B Õ¡N¨+höM…Q¦)ò“‚~šÞ]%¡ãÛŸZäKsº—ÈÏv‹–“~¯½LGžFH -Ýz\)Ÿ&<^çÝo–lÂË}ž‹éÇjø2o_fOÉ;{épXÊ•ªG ËIi“5¯›w@‹ í£z¾¢#æª Ú2!îs}=uy™¦Í­æ“·‰&ö›ÙUî¯ÌÆæØ5Š{C(YOÕZMïe…œ(¹Ë˜Ì‘ÙAq‹¥®JpÜÝë7yTnMŽ*ÊwòQ€–sO‚p|—¸Ó·ƒ•2³¥YÇ'×¶8¬€x0”¹HüàÇò.‡ê`6Op-‹�B ¯fò½÷5í܆Œ+â’¹ç~îQ” L*pˆÃÚó={«gÖÐ)ÌØy¨õ ÇZ±”±f‘w{Ú^ö ¼5×$‹Ê.zõî—K^j@z¥àßÖ±^—(Fc˜ \9НˆŸ7yR‘¼fÓ Qñ¸V«:V8<†ƒ‡ERyºám ]xºú1½8ƒe¸/H¨7Í¢)ÉC¹ŽZöðCÊœ6ÌGC�(¶ê®¹òù\ê#ÓÞœû±ÅFV³�E9èùOÌ^ÐLV´ –®Qùmà§Ì�uS /|“æÍòÝ8§õ²œ`³—Š)Ü}Ü4ÅæòAl”�[q�j &BÆäסu÷›�r §x<}VεŔÙêˆ.Qì–´Yü€?¡KÞ– ˜Þž){T"¼âɪáíÑtïgž}Mcu}Dj]_r9-¹ë$ t{Þ(Ûn’èu-]öyØå 6KÛ¶­dCd…ÊA¥‘ô[¾ùmãZÒ~D>mZÖ|nájZÙ³9²œµ›WÅ}“ÈîI©µ1É“àÀw“ß(vº Š–š˜/ó¡ï•t¡@çÁØS ¸fùg‹x°b€Ðpc°X^Ë×±Ý+§IBЖWʵÌ=”žÐg¼3‘|Ù±g‹ÜSîÆ¦¡SŒt‰ØvùÁÖN×nìË؆_Bãù‰×÷Ä䀂ºg V,k.;z}lH4¸WSåU–T£ÞמÑèkh-~`2&™}óO�$C¨šV[ç>ö,7zÞRÌ×Ò¤/3˺9ø* o+>mñz’"“ÚæÂìîûxžEîqn¢1ñÐíx+]9{9^jR0Ðã¾ár á>ß±'Wj@÷j€9kÆÀ©wÌQNqòÞG³³Ÿq ;Å;[ï<÷IÊšÜÃEÔ,Sž„ƒc ›,ÛAjN}Ô�ˆeiÎé‘~còjY%ùot£…¹l ÀÄ‘²?µÖ§QÁðå¨*ßu;n†¤àfÅÃàÇTIù÷GísZIêþæ. 4~yÏ© UEíΧ³/Ÿ6@ÐNï«Ûœl%f 9;°–Xã¼ m¶Q ‹Œo·@ãÝèÇ3å¥þ›øo8áñ�qpˆI œMwjß8Ï£g9�ý«ÐšÆ€Ì\„—p8Ú² m)îsõ”ý�°^pp…tÚ ÿ6” ÜOù»å%Ñûz–(TÎe­dÚöŸ§ï禲ê�q¥—Æ!jÛ%ѧW# ýÌYê–+VùqJ;¢ã­ °;žœla7Dx/sB-„LßOœþ¦ Û⨠†±­xl¡`ìÆ”ïd"(·. q—ÍÉ®½#¢ST]KÃ39H•^ñ„Ú]yüõ•Ý•õ¤OhµX+dt±rvÖ[ޤ”„4-,‚„æý '#�Ö|::(kjÃFAúû @K/O¨Qv�Œd\]œãC©ætëCè··jZŠŒiâP�ñÃϸpdEÖ!ÈÇÖÎ¥ñp' Ó\MrÔ�u¶$Ï–ÒkbBiˆó/à ¬„¤ü™¡¯‹Ç ­G‰U>i¹�žt©Cà#K­Ý˜õ’tÍ~ÖÙ„²C»áxû¾Ìunð×zk”Ã;äÁ�¹{d‘E‹?™–lZ7§Í|ÌrÿJ‘^ÛVU©—Áèd Öb+ÍÖu§Òâ½3ÙØÔbÈÛŠ}À=92^kF·ò)h­dú—»É¼–ï‘ã²IL ˆçì³îwSž+ß!§› !¡¡z{�ÍHáC˜ `þ|ÙAÜ v�!"q»�ncª�Ò÷Ř:‚Á0Èè©Ò‡8Øl'œHÏ,á%t Aê‚ä)¿…©a\ÖIšs† ±¦¹«gŸ6µÕ †ô®j2ê M3_¥ìòƒ5+ÉÚÛaOX1oÆNád 70‡a¤IJPOì` ‚Ô46"ÍlGˆ6ñ¶o�<äætÎ�ðiÉ­Û]ô×0Û¯×zµ’~‡¡("g•0SßÌø'Úvv�µž\,'|åŠÛ ð™^šêJ_a5ÀÄŠ.™…·uøÛ FC¡µ*Gò³oªTÙ¨%mdæíÒ(ÞÃLÇfʆ˳P›Ž:ÐAA·WïÂvŒí=¹jåý–²‘ÀÞëÁŒn´Ô<±¡�Œ“`Éíxªzðu~ß'ƾôÄß”c9UÞs¼-.ì�Ǻú.âÈè® Ý“J4tP…”Åß‚Åè¼!žûFß­Ý«a0I• v|J7£jÀ¸¼5²IoU†yjax3ÆW6Vå ¦­š¥nžØUÅuõzï» À33Ì-å¸õ ý§³Oi?GöÙxNS¦– 8ÚÖæ£ VG¡`RúÈh}ë…©“Ãaç7zžŠ†àæ}§Wî «sÎßKÕB¨iÛOÔX‹~äåz—<7ÐXáéq-J²€ž¡CÆÊ}'ŽQ ]µæÍƒèaÔÛDK'­N?_ÙŠ– A’ ÌŠ¬~vq„xjA•EÊ+Ç ËüÍ|~}¾þ×Ì û^ nžÛ[}ç´ï±µrm¯H/`c ç¾è>‹|[Õ¾ÜVèà cö¼Å®f8•ã$›ÞÃm¯â¦Úß…Õ ˆ‰¡Ùž-OWa4q?U2Iç7À2 ‚T4ü͸­cˆÏö ¼kPx'Xà_gŒ)  .{¯­—Õbßšñ¼)I~BÎ÷“`ì u"�§w ðcá�¿®H_²Q²w¼�qÒÚšLܤ®6…cä®ýEÚ䱆ü÷s£A|‚ã:@½Ø1ö!¡î8Ûìô,™¯6ûˆÿ5½#ŠšÆ9qãX³.ªlΖ¡'Íò&xS·Þ0êLÕÕß+›G¸Ò÷ÕÌ †—7\[v¢A3=åøŒ;¯[jZÖÏ´W·�6·Ë¸T†éwµx§ Ÿ·�ËÎ9e«Wœù£l]xfè}žsýˆÛÊÂÛ¡™±f!¦÷ïƒWØÐfÃL›5.øv¬›©ŸHñ�¸®ûzÎ+w ¹Ýõu×éÀkp¬X�€ƒÍ¸0ƒ6ˆE9½ˆmÏ*&£m»´'r®÷Î ¡ÞšŸvîlŽQŸµÈŒ¶(ÒÊZ4¡.b÷²ÂŒEh ¥Ä‹ZÚXq�ÆÍ¯]˜ú·àÛ•ˆ4p|*}ZçÇá-[Ѐ9(ß/@8ã%¥X]W®ü|d®L']R­†ûá3I]‡«pè6ÚîÀ ®‚ØÎp¡½äf�­Ïî‚áLSòoµbág%œ*€¹‡ÞÀ| ¿&"øÒŠåAYÊÌ¿$í5ëÅôÉ…«ŠÒ·Ð &Œƒ¤>H‡„ß:9jo×Ô÷ g—JµÞIÂ[ S’Õ:ä°²„É’"+»›3œZ¡€ ós 2ZåGætc-pZÝ`tü3—|á[±Ýº&œòÈ^# ±ÅïºèàhÅ1Ø•A¶ôêåÚÚ²­‹wZÐ7ê D3Š }-›ûɱgÆÝvßy s@ ®Í—¸É)Š=§ª¢ÀU^Dë›Ë…´«–Íóï¸ÄT¡ÕµtÕÃiKLeåqB¶í0RѽÃí§ŸÍbQ@!Æ!]¯oi­BÏÍãQy#©°t~Ìð2J)ÔÛúKXùv¼ûØåÞ‚,1¿§Ô£ïÌI¥€<�A p_œV¡²TX14•ëf�rdÝí–rÖvW @C>üYü-”˰#õã5ù[»¯yª£Ò«È¯0ÐÑîVì͈‡wø;-ýbf("�Ü)o¾¶X"7càôéÐÔŒ²%Zkò™Çœúí2M’�ìlXÖôXÊpúÅcªè<àu½¦‘‚θeê ËîºØ<�¿CdK•Žƒuo¤-ÅöC猅›k¸È] L€cS¯ßwM�†õÔh=9°¬)j¼bßËIÁ·@;/)Ÿ~ M¡KÀüM SÝóî£@d-ÛÎBÀß�7W¡rs‹`—`ëaÚÜ|�ðîΩl’T†AfôìšÒ†ä‰ãVD{u&�ó•éàáñreAQ ¾Ü'�ñÃ¥Ÿ�EgKoö\ÕaóØ�È=ß<‡ßGË¡c‘•Ÿž*f2L~OiŸi&c¢8_µF™ïTßÕ„dvêO9O¼Ègû;]Â+•™˜î·G*gÈ ›/±Cá¿Á2y[¦·PÙSIb*ÛEÀýñu“A-öe´j¶$ÿ/sûù¦ì<Ù\þ�‡*t’·‚(sí›ÄåòëuÍ*ÁXì™ç³#3 5hÀ -9˜Û÷Ä<ékO'öü|3%åó»åˆ'sAÞ›iNMJÜ^èŠ'­h› ÆiL–Û\õï3`x‚¨¾ê¤»aÖVÄÐ%hôñ‹ðÂÔÎu”æ¡çÚïÓ£àp¨4 ÞD=kãvæ’’G¢—öd3Šä?Kñ�ÒJ|õð—{.�am Ïãñ5í˜b̦(í·gÞË `:žB†z˜xof@ÿwò]ü¸wë|{1v0 ×/›òfKW*€ç+«8y�³;Ũɵ˜í…ÝmÒ!;ìȉ&»bo”88\èÇ&d`#j¸œWá@ê „€å° ÇZÏê¶7Nß”[€IÑÖ/e_Þ˸>ß)6À|ó­°ÖzÕ« ‰4ÓNf!kRÝÓêu}׎\V‚ kÁë«´'Ôwו @f°¡x}FY5ãÚ½rýäÆ|¸óB°çÖŸÜà�Ð{aâ¶$…L¿4¸•ê7>jý¨(ÀBÞÄÝG†{5ÇÝr³®SÎ�Øóæ×u-@Ñ‹kºÙ¨”!Pˆó¤îR>Ù��/v Ó Šøò96O_ñl|àÒx6Õ”ÓÔ˜âÆ^Ka ƒ±¹åÌó§âw$îãR&FìVë°‹ŽØ£mÕÛ€ºß, á"�*w%#±9'QÛx7XÞéivë±×æö·t¹8ž¶²àk9©[·¸ÌKßuz±Ð ½ý«(b¤´$Ã2&æ ­¦BÐx0ÂÇ ½¬³— ìZ‰‹}Æ+GâŽ!÷�¡+æ¦Üc¤Äø ÞIßW {ÓÓ7l" ÈŽ´07×ÈkRtG¥Âfïp ’Y=A°TÓ~cM {‘ך w0Ö.[lâ4æ4çoc�`Ækr; í^-;×&Ò5Ðê;¦¬ICó0Gåéð\.(4ë I¾ÙPÅùð¤¿ñ X0ÁB)Üà�(P¨cÞpk †Âöµ�¯?\#Ž ‡|_3dbÅ×�#ûÎUÔ5{È®ÀæfþØÀ}ç -ó©¸|æ÷7[åóª½ÓŽÍ»ÞLã÷qe+±dyì³u—x‡´§»@pñ”ëÀšÙ¬tº¿qL“ä«Y#Á×ΠwÔ¡‹„Ol%óŽòÿ(v^É¢Uª«­¾Éè3#í‡Ç7 ØŸA;…|tºøE_B³,þÑÆ XŸD�ÂPäÉ(L¨µ:[Yù=Àœ De6Ɔ'î³þÂíç Ûñ†üÚÒOH®XëL{Ú+”Tƒo'Füõ&³Z2 ­‡7½¬÷Q%¤hÉü“¶�%>wY½ÏÅÌ#µšpÁ1Ù ËÙ#Dù憂ð–¾Y7¬ÔÎ>7ŸŠnÜCë‘A'•¥-\9¬]P—bAl4/’»�¾l¼< sݾŚÀ¢VÈ\ÞîÇ]�Rb¦¹ki‹oakÍ#Mâ‹Óé§Zî,øDevÅ£�–k±˜  lÕlÈ$–°®²l”{²ËÚYï×8Ï!�/¬\ä4o Åé‡n½ <¯ò6·-vÚ]ÀPqj@€91à6Î<³ñb”…©ÏCðcm`:Y¿•c{רßv¶yERÙªåýß0á·±Ìl‰%ƒíd_KI±™ÁرîË—m­Ý¶AB0¡œ¿ìrç“#é lý£QfOÕgL!‚áð’CpR+[-&'F !—|6ï ¶±¯�AS 8rU‘w³Ôy²—D-sæ2– ›¦;L»ìƒo³ ßp›<Ð8Ì/yÐ}'}Ûë_ëÜÂ;œÊºÑ´¼Ë_iNO¾ za"ÒxêëÓÆn§:ã·²·ä¾2xÀ%ä76"žŸ)aåÎúÜÜuçˆqÚí5ÏÝÇ´XÉN¸ð>ìª1žÙª'hœö¯kë µ®ýŸk‰«ÝÜuˆú[Ó�O¦úÓÔ©w\Aa3Ì€K”ˆ6%:Ò)²ZÈo»ç{úÀI¶ú2qkJo¯{¹ùËÎøõNøÎüÆK­³ì)~:ê„×r FÛ‘«�ÄS`bàGªÆ§8糋²ê�wb†Ãiñ�ž=xOã?‰Ö\þ¿äo>œá @ Ý5‰…¬ÊÚ4+¢oÈüÿ•='ˆ0š÷¢,Eâ\ñÊ6¸5Ƥ3ô«­À§·CÞ½2¡­Ø0@äQ=¦”À¹:LÊá’oŒ´[nähE †�pœuæG#Ùß[û=¼9…”-ßAHb˜‡bΔ€�ÂNV÷ŒÛ^NS&mì5ÍZ+~¸0üÏÌý²ÞšoÍ&y!³¸rì “E~dŒë¡¢Á.þ µ çR”T8³'Mu¨Â½þPŠK:]pFí~¹±~j¸†¥ë¹~¾mY±…�uœW•f¾¼‹¸Nk˜xåˆ'Í¹× ÄÜå’€Œp Àˆ¤ý‚ùUs—^õë2BP©Ù%æímçì:†/zâ£g(€‹›¹5ÛH£ZkQåêé´(ŽŽÿë—CÆr�¶PÃ~�Yü¦ïéŒc|ù¬e��‚e¦ÁÅ àXä~ê Ÿ0Ð}ã®ÏÒõÜû‰�q%ì¾>vÝë?o=û]:ß zû¿ “æÜoIL½¾éÇñ�9µM†èÚ ìFqØ ‰h°æÕbÜ{!•/¹ÐÆñ„!AQw.ð¾Kþn]·aPUDK÷ J—ËÎMÐ]d­tÞMö‘ŸÛø!w1¤î‘ϼvâkscø%Æ+Ú³kåH¸]ªñc/‚©"Ø×[“ïÎ#¬ ÒâäQÇóøä½ûÎ>‰ô’´ÆC| žáñ™_>çæëÑ¡²jælÂ8ùMèÚGÙyؽû �ퟲ[Ûµ©CtME^ [I_˜6›�ºð}p”îÚÕa�F ‚V8£©lYUh/?ºÔÅ1å£×g7¸È ÛE›á¯w˯À`¯œìÜ 1i};ZGWÄ–§‡UŠ˜ž­üùÅóˆ�°·Bƒ€Øo«e&xÍ«½Ûû.Ñ!õ¯Ùc]úYäÓâ;(hå~º†²� >yدõÅxó× , R®ïyiÀB Lá“–M$€¹k8²„kÊ+‘­™ÈéÕƒ•ð7 ?EŽ5V $a®ý a]·�& ª3Þ!÷]pžufÊŸáåiû ·“ºÝ(xµ0òtZþ³=ÕÏÞoc °ÓÖ1ßÙ¾Æñ¢RÜc—j´äÎ}?ÌZà˜b«âvÀìqêHÔú´lùkwd:âRÒ{)Ûí|Ê5ñ7\~(Un�]î]üõ�Q¹ŽÆng‡f5ù.ƒÃ¶Cøž3)Þ}X²à €S­’;X¬éò“ʘä—ò³sœz›Z¬;4 Si ;Ùt„ŽÝÃMGæ¾û ¢RÁWÏåÛ1îŠS¡†Ëq÷²]¢sbTÛÚÀ°;M횬¾ÚÎïïGÎU{myk´iãš¡_n ÙY3•µk=*q]9 à‡ÿGàüÂŒŽú¦ôàºãý®…N·ÙSiÏÓеgêiøç’> Æá}+µkÍãÏR.¶¶-.x£P¯Â(qÆ2úv”~cGûÛôY…”³—ƒ~x»�}ãr›6³9FK…æY�&ÐV£öØd熌ØløAÁÐU7°)ªI{ ìéÅ©LÝ0W\‹¬“m~w�Ý{VèsµÚ ·˜ºpUîë­uë^î¬vS ßwõ(›Óxß•Í^´êßsÏË^‚ǵïéU‹yC•ÛZj& “m¥ú«l†™n�\¾§ÙMaŒñB›6¥’·Ó¦º½_Fqöø~ �[ºî:±­W¹~z@Ëv µrê D\«šdŽmØnÜpiOÀB#7ò\bßF4\¦�ÒÆˆ>l÷iŽJE L”t±�4Z™B­ËÛVÁ¹/–ŒþkS" ­ˆŸ ËfôýôpaJÛóŽ.šYábÓd*Tü[ îïPâ«ò™²`#µº–öu$uG;·øÂx+.è…‹ pP‚ßÄNìísáÐ?m ,>¸†„.ÁÈäBPý@!� X¾G Eòç°{ZÓ£P›Æ cù*o÷j6ž´ê N[œAAÀ7�Ô¯fdoz'îaýšNžIÔ4”(€I†e¡0pK9âÐìâàíg”€Í€ÏOïÁ2`¬r$ÐÔäè|F•ꔓŒ¢%}hõ†ÌVS8@Óã ¤˜·mÙµ/§ê%Þýæ¾!¹'›Êu/Ù?U”<'i› ÑÞi„µ7ÌÊh[XÅ6çâý{ø/!¶ÃNs¾÷Úží�Aù#¦·A“>Néan‘qÛâ„¶Ô-8gÞÓ!G·Òìq‰åÂ|˜”Ø(ýeèçÄýß•/3ÒéÈ×ìD–~-òÅ7YI¯aÿå¡þÖœî¯ë ó’�œØ·íÐ*Q%ünƒ©FLôV©�>‚ó¨‚z.“ú癌 dlONË_ŸÐŸíé³0/°]BU«óü»šº;ßz?�EÐã–4Þ‡ìÖ1p~ajs!«WØ=ˆìgíßëé¡a…1‘ðõÔ,¡Z^w2�W}€o[&]ÆX�-.!Üô-òö툋8[ ж5%�$—ç=Q!9:Dã:Ó¦nù æ¢�?õÚweË QÉwdMü’¸é0sïQ¬ÿ»ÉB�”MÃLɰ`®ROÕÐg]Û¹}Èu ä¬'Í„À^Ä0Ýkö>|ùð²Óª%9{öŸ^²Sák%ŠN†øFÆaŒ±˜¿Á÷ÒVšQÓàÅÏ—; -%]ù� mtyhKžj^ógEWئO´’Õ‹p–p°xÄ®‚ž¡êfãB¢X½%¿­JNÈGiR"1Z†'‡nû1)h+Á¶à‰$“bÔø³A Y·OýÙIyL–ô—ÇÜñGáÁ ù>5ƈS·}QýG~³z—49|B@Yócš µ° àu±;�¯¾ö‘òrwÀÕÀX�ü½ ár9>�fQ¸Ër[Úìµ®#´H¶—› ѸJF¥y6u?CoçÈîâ,So`0™!ÖŒ«”–‹u}(ò”Ç"U`„ ÷õF(.ùÂw½Ú[¯|œÀ…`vj´¿c̯4gëÄ ‚þáœÀۉ׎ÿRž …ýÆò{-Ú&VPë«ëª\@ ß5®t¹¿Ü.�‘ ˹n¶Ì‚Æ"·½léÄ=˜áaW9_¸½²‰:éˆB)ö!žà>L¹çž}Eã ÝÇxWèk(?-Ò*¯òE&v|@üÄbÑwøïy�X�Z±^çô>ô®�¨¿vü��9UË”ŽXþÐ÷€”:ΚÝÝ·Îãá�åMõ>Ð?"Î…ÁdO×€mõs«YÿD;\6—óœþŬÖø1+: ˜Å;öøÝ2ߌÑc? ´†í¤×nwa:14Ÿ ÍsYdˆÅ´xå/ÝŸ�G¹å vt,!«�†Ï5&±û"dy¿…¹o2 -ƶ)ɹXAS$Ï£Ü;ªpT Z¤0¨*×âC¶|l¼®&ü[q®¼bÍ­ Y¾F7ª¾Â~Ý©Œf™®;1Àåâ²k/MÍÕ^Ìø-\ DHÅþÒx£›m§zÆß!…[ï|i¼Õþ¶èÊD>hÓy_ÍØ’p±�Q¨Y(ƒzµÛxÝŽ6u•X=4Í&Á„�–z¶_wÁ|KQˆW³™ê‚˜=´Y³Lit.A„¹~Ê._÷ì˜a‚Ú›µN Ò ü%8§¥w ¹w(ÕçJVK©åo�Y÷^ûQçÓñˆ'ukk¦2ß|7ä;ZŠú+©m‘¹…-ö÷T^_nŒÈ©QûV_}åZ?µi{4«UëËXº…3w%Á“Æþj¥Âs¥“<\,#µ��ùÇu7g­òRϰ[×[Aª•÷1hH1µ)•Y¸Šá“Cc*é"’( ´HXº¬ùí¤XÑ»>Ï Ã¾ß:B¤.þ D î•…ËY³\~÷"Ó‘¸RSQ%ŪˆzZ½¡K"„S?²µYVX°Úo^cÒ0–òc«eÿ{*; µWAÄœm5mê"£rÏN<ïɳ,ŽÐ<ª—2î—~aÝ¢ÐO”.’=õc$¹d}ç ‹êç/íð Ý×p±|ð„Ë;ŒÉÕÂî‡_}júLöCT�aØúÎ<,‘Û’ÁÝ‚dÛrëòñ#iàvíÍ"›Ìžx™‘èaYã\ËË`e Q $GM(Òú6š]–‡¶˜¾˜ ’àOãâíÔ':Ô Öè{9�°:+»ÒûDk† >óÓ`øBÞOBq`Œž}÷’„¹–©™c÷~e"s½g:´=¬¶•|-f´s~ Ë =¸Ž ™½†'0,ˆ·? ’BÒ/éúÁ~¸f¨9Þ`ë ~d@GZŽÁtöBWX 1géÎ:š$Óq§M¸,!¶®M�y½åÖE- 5¿Íq�ý—êëlfšø•�Ö” ®›©ºÅÄ)œl¦×ir„ÿó¢ÞöLj žßfŰÐòµÕ¶ð°2Ä»£ ?L‹‰þ¼cû–¶k  z9„A8¥²9«ÒuôakFLbÊ4 ²/Ž1Ù"à¬ÇýÎ?¯�`‹öÿr-¨Ôh¦ÐÝ4Ié6ð4ÃÑkõË©Ž²/§ù=L1ÝÕ Á5š-©¿æÁ·ÏÄo?—^‰�ŽÜj'öË{¾nÌ=‘�cãÝml~$’`Òãg‡*ܦZÙ\8´:8cììdæs"k¯ÅÈÂXwž¾êA#è N‚ØmqÒ“690¾˜Qã÷…÷»òqnïêÖ,DZµ=M‡!X$r•òÂ;~ÉÊÎó·¥’™OŽ$ ™âL1….~ûËÖ›†^ÆŒ@O[¥âAùƒj³ù7©8cļ�ayk$Fí8£;uÀ»à^Ó3Ú`ð'ã öÜ�Øhp 2ÆX¦gA'–Ô?0‡G|Ùî¬ÙìP*ò)ÁÄfÖê%š"íS†´ƒO7©,à;bt7À‰üƒAŠÙ@æ‘Ãéj_+W[mF{¥úæ½Þ²¹Öˆ› á{HŸA!‘éÛ°\;½aÃÚ¥¯Ù õHh:öÖ”Á”>g;¿PÀƒ5²×öÒùÁ° \ õx°„’±iòÔ×÷ ×x„¼m—¦+î–mkäA¯ùöB|eûƒ»�7(w¶ßm¸i®ÓY9•ÅÝØŒ ó}£šŽ_H‹Ó~بƒ•/Ø|iÑðNH ½÷Þ&èMÃѸîð5â7„G¼üö_ï±t�›úB™¹¡WŽ=çëÕžº)lÑŸÅv\�s�ð{É?Ì ðd÷L gg8ç¼übEHi-—1tÛª«‰Å·rH ÖÂÒ´–DFÍvÒ¾äݵÉ×B-–ËS¬i“›&”D”IØÆü ß:Ú¨k…À�šy_B�´Èx_~S g‚¾L$Ä ä늾oaÞÈ»'a\“ã~ËDº‡™î¡ƒÈ~�}Ö¿©Q÷×dÍ'¿«pôtäS!ðÃÚÝ6•”�ÉgË ÐUµ{Z¬Ò¦;Bh ¶2KxB¾ž§E�4úÍn©Ëá�™`•(ÒÌ Ìì™3L jÂLÙ»ìÐä§Bp·|`ÅYmÞω# ‘åü`\¬Ó~åÄçC rˆC¯1†£Y·óæó×'û@}~C˜ËqŠåã`5Ñ�Ë;SR,1¯nîËõŠÄÈ�Í®O"øpoÆ„V°än¸s|5D!{(œáüV¸Ø�A6+¯YŠud·Óõ(” ^ì#Ú”ªÖ1œ­K"¡Ýá;†÷¤©-ŒDÜNeì©ó#WùURË /)æ 9³^S³lssSL�&lœ]]{–‡ 9È�üI’ËbwG ŠxvçwʵêûŒúËšû!ߢP hŸW¿'ñÄu<½x; ç·n?cöìsŠ-èÛ˜~õ3÷#9–qm =¬;Ä3`ŠýÊ\Hå!¥ü—d$uåq « PÕh]Y¾¾»ßlµÍo�z³ìÆŒ5ö·¬·¸®Þêð—-°ê»…•Kl 9³…äJÅÏ*�ã‹ÅžºûôQÜI˜½rö°ß6{Rÿ5û]ߟ-žwýà¢EÑÙ°CÁ¿P1? °Û·ñרö¿ÊƒQÇœðÜQn5<ØgNÎÒé™­MŠ¥(àó¦�ûKxó •Ųl4þÜÞd‰Ü½ª¬·NÍFT[5Zjîe´ßqs<Ð ýS$9$ˆ¿ mMhña´Û'Äúïâ¡¡Äê-»d‚0ïyó%ÆÛí²VúasÔ_¦­´‘^â�VQ+ôµ¨a@QßJ!Ìtæ–ëÕœBË1„öë*M hÂÌà +ä<žÚô ™º«†j\²gxÍâÙb™0[;ʪNàØhÒ’ô–œÂ‘�8Fp—)W²[3dVâè.2ƒTà[…NOñçZá ¶ ‘)«%„zi©Øh€Ì7ÒüþOnx -o,�ÌîéÞªð±9½Ã7m}ÁsƒÜß©DóöÔQÁ÷ÐeÁóŠCßâ&¾®J!ïÖ#›!§=|…�,u•BÍÑË�yÚ\4:ÏaÝA÷Ë«u€ÁÕï´R^áæüÐÐX~/ƒi–Zq'-ocwý~S“ц…{]E`îˆ\�]Ò‹²e»ñ0NÂÔqñ�ãå9|g=oãÖÊÜë\ÊǾE¬CAŸo»¥"ÜP¿Þ®ò =XŒ„·ÕySÆítXᆦá_õüø??ów¿­°±1 0fRZÒ.ˆ…¨N!yý0ŸU 7W³jc Œï�ÒÞelw`R jÕY6 d€kT¼À�#>Ã4Õ§ ûJ\Íæ•³9iÚ_�lØx–B¾lŒ8ufý¯š/|0ë.‹&£µóó)b½%Üš­(BâÚæŸ™Ã:˜D¦(¸°—õI½âq£·™ï„íÞÝ숉�h2ì%íjÙ,ëåχ‰¨¸¨l! ÕËž«ZÜ.ÖäU†¼l4îWj˜ LÄß8踸AˆÁ�ËS 9hæl²ŒË²ãD|šn‰òOl¡™±ñ§e [ö¥“¯—ůØäÐ’Ô€”†„èh·z;(ðÍÆróÒØ¿ÔÆ«·ƒC¼²œRº®¶)“Æ®V“¡íi]‰§X-`GRÝ´€Ñp8MÊÅ£EÝ홸æœÄr/JʽÁ`±Å �ýzÉwIqrÀZùå‚â¶zN`M˜fÿnã¤gÎsLÏ´\3 (Iø¸¹€U¬�‘«¨f·Mø|ðýÃgã'z†Œä}i8葊ÓFÝòùÁïnyꞦcCÖaP¼ÿ´¨œº…aÍ¿¨¼±çè»/3–ÊûE Њ~ EšÙ˜rø4ÐX–&éùë–9òÙÖš4ÆöºVÉð[‹7“mL®î¬�H¥§/£Ú»ˆÏ�­Ž&õŒãɈ¡S°f¸V°|Ëö/N9 N¶ðúö!eSt•e[lM!ªc4—@нÊT¶! !½üj;ö_Ùû|É>v¢©ìtPZYUÍEeQ µZZÍ2a²Ií\!*×¼h(ÕÃê T5’CC i$`ÐwQ 4CX-Ô�À«͵¾XV‚ëh[�§o¬¸¸3æîzN<„hG]›S dÊÖm3)| ªÚÊÕÕKóRG]ÔÕ5soˆ;ÎK…ù¸FR,¨´öål82#ßœz@Ð"'åm¾œT×tëÎî#c…ÝÉ*�€�?\ïc1Íìéîyq C·3¦¾%ï:+äH>‰›dkÝ]¾9Üöþ†9eØ í[îÔ#Sžínà›¼d¼µ»qËm/õg·Ô@¨v7÷«w�Ç>á?†䉠‚•ì}û¤¼öVoÇòJë–Ûô,w nË>˳™Ùœnv6k�0ÛÝW ýßBŒ:ܻնæJ´;�X¸È¥„ÌKGÛ¨¡”F‹`Gü}]7h ‹®“ùó´]1y½£})cëÞƒXù²;�ç(îö-?`gê«K¶U7’ñLÐ@ÃVÄõ �"ÖîM»ÑcÍÿ,»G1K»NT•AQ5|¤VY�¯±°å\ôº‰dxÔˆ]QHÎJ&d¢–öö¼U˜ä°IÝeYÚÜfy4\� kJt1½ˆþçsw-5�aîv>·¶ü«ðwj ,�7¿·SͨGÊ º¿²Ü…åá¬Ì(dLÃ$¾²^+$B\(ŒË•׌š¸%LòÐdV- ½ô-vßë-2-ŒÛ�à­ é ¾:\ Í?ob=øÝDS3̾k ÁQÇV÷K—ùa´·yÀ5ŒÍS]Ò¾›pds½ dÚ¤6 ãÅöZCÞ¹ú$ÿéÆÝÇÛY°$·Ûû< ÔÔ oóÃ}o¹½”¥{~žÏ*}´`Ã{H…Q½ë$oPM^÷� Jƒ=BÛQ¯I¥ ­ÔYÈËs� @Zó0_¦Àƒ²à«�s@Í”ª®™�—S@ü¬N]ZiTç C÷¦r÷7ÀHv;—²zj¸4úØi_ : w)R6Cî*;ˆÙo¶¸ ‹nÇóòÈ\K——qÞ< tˆì"áb÷ÍqÓ¹…m „N•îàg~Ž*oWTP>Ð3ä²¶%û&&�îÒ[1àm• ,G½¿rT.ÈR¯fÅ ‚ý’»!ŸJMÆBdÊÈWôM¤,'­[mW±‰žÂÓ¤e±#dôU‹¾¯Hƒð~Æ·¹}LˆZŽmù¥OhG6M>1v¦ Þ[]í9˜Ñ:%½R ÿYϘ’njöÆòè°’!顨î±Å‘S½€bJé6å�p¨´QI€%2¶A•qZã2#cKðêgŠ"ª_ bì3Y¤µg׸²»×Y´ûX¶›¬¤’l»²Ëu�tÚùK2®IåhP’Eºnÿ$ß*”ÄìË6ÄÇö�{}g8J&!’óPœ¶ ;§—!Ál8ÃG`¶|ÑJ^Âîï¨Òbä®ò›�enܰ꽊6^F .§½¶4+÷·N Àé=ÜWwn£7 •k)ÎÓ$ž{‚�@t,jý&Ó0þ)˜ü+]í[y ��wŸgð> ÁáA”gBÑ­¦C‹„-Ñò^% ´JänãØ¿vUgz�\ EçÄ©€×äà³ Q�zýZ§`ÈŽ6a „#3†(õ¦X\‡ß·¬‡ŠÛéeŸvk–.sîÜlŒ™ºm¬iÑ×N4¾d:ž×>.)ry̦GôèÛ¿Ø-ž£lXåMã ÷½CÚ�´¦ qgI.w%Áƒãy¶¤Ÿ%IÎÍÒé-j”Ž‚ZY …÷8ŽÚ¶O� e¸•Ê�ÝÝud“8z®·}¥Ç‰ pÓúi5xÞï«c¨7Àå¿|ìàûTæhïÛk²Ø`¶{¥=¦Ne�M™ Ý*c=²°u«8³:+�*ˆ†b=D`½M�׬ì�b;§“îozÖî¸#…JAçyÜ b<`liû€×¼ÆGO¯_ì ˜¤£¢o˜{lÌ¥’[^Ž…� /Ùκ7Í*Fðö½¸K|D03±Ýaë™èÜrX^&óa7µÀ�c\Î`+¡Î™¤J2n\ø²_dÚÁ[‚8™òÇ={×®žgöî£æÀÏL@Æ‹d9H�ͪì%¥ ¦í΄0 ™ØO®�âÂ&¦,\N¡ï¬=Ä €êÜÖ° b5ÙUmVƒ9Õ_)~ÞsÓÓŽ%nÑI`ȿˊüñ/0ÏîŸê.V|\æìø×;!ii�í‡ &n.ÀJ°ï„ÆL äèÓ`º¶–×ûÒª gܨ à;™q¦ªÈÓÏ{t�}‘hY¨íŒ™çËV…„í¯9s¦Üè탌`5»Al¿:gªPó¿Øl˜x—“°Ðè‘Z£c絟óîo¹ @±Õ$_!RU®†á™Lc<–í¥¸É (Ÿèmß¼­å; FQLõÂ5·’~¾„5?®Ç¼J!{ý‹îÆÄˆ1çW£©¥]þލ Gî.+rp'U¸®�^Å'�lÌÁŸöz;úÜ]nJþ•f¢Ÿ·zª÷~µò>Ž.¤~·l™:ø!-ß²@`îoû¢ˆNîS ÚB.–‰ùsè�PÄ·i®8s@.(Ñ‚¬~Œós¬Íd)ññ¢Ñ€á2‚` Ää[€5yC/‹]N1:gŽuØ>*ã¦ÚÖ,ÇEÂÄRÛ*+à%¹¼œd;ø]àØõ\³žBP޾¹¦£fßÙ ÚA}éûïçþñ@0)kÎM7çÌ}Gl“Õ®œ»waÇfÜfÉe󷳈lôŠ„ÁÖ�ΰal­ª íÓzõøñö¨«Öæ)RõÃÔ›ñ|¯:‹hX 9Ø["|³œ e¸M¦àŽÊ‚€Ý-me„qTi+†y¥½™¡§ƒŒ¹ãáã‚õ(ø\‹X ü³àc6UÈ%Í)±x5Òìÿ´ƒ¬ËÂ*Cê ܽ^áï½ëlpQˇÝ}×;ÏÖ7.ª÷G³H-Z›ø�´�e�³_œâÚ¾>±’(vÁbÒ¸Ùz®¶2ù�Nð‹@DnÌùÔzOœxta/Þs‡ô�×0?aús{�¯gû]Þsäñ¹Ü!¼5=ÿB‡n¢r¶a&+‡ª­È'ÞQçnmÕ±ïO3mJË‘s5¿ÇʲÔm†ŠÂõÖFÆ‚cæ G ö W�w0j¾ó,”Ìk¡¤¨_æ¾_¢—6Á «ðÞÖ~ ®Ü�° n£õÛ$�f¢'…ê·)1ù?5ã‹zí°–k_($™Õjî6;©d*bå- Ò„“6WÒ @Dä\ÄØHª'òѯsí¶F²sßÞÁ¾iߘŸCw°­`"\Xùmf'·¾½ŒHÚÉòO# r`Þd剋á’ºXÀm¹B 8Ý«Í÷=ë¿e1Ì]”r”Ú«Žoøô|Æ6Ûª›7x²#WG ™ZXÇRÓ¾jNÆ´7ž2¡äN™™Ø‹#|ØêÖàdS¼Y‰ðÊæ ÍöùŒ{Ïy Æý.ýæBæÍÆä‚\”Ée²©Ýv,Së�‚�h¹�Y3~¥ï¼YäSzté1öÉÑ+ 7äþË×eãÅËíÃ…‹éCv»âšÆmAÚQ¬Œ‚Ì»†(AæÑC™Ø?Ëþd÷2gVÕ)~«BÛism Àt‚EADºu®ê-6?k»ÎW½³R‹$ñ;Ó‰ kø¯Ê>€¹i=rÞ“ä®7.ø›îöå‰"þÜ�k¤½ÌY&Á‚¶3/i@yÄüÎ@Šì{ÚcIû⼪j¼ü÷d8Ðánþ-Éà³­÷ã =Þñ~:Mí΢5ôÏ?¡`ñËÛß²µ_OµÊ±ð:z‚ÆÃ•`¼ŽXŽÖøw/O°iÒÆIÊÖ8E«r°€ ¿+€€jåľ3MÇ˯¥*ïf£mØõ z\òù‡9|Šc û»’a|°Ä îK”~�-|E\%8qîgw¼ĉÏ:O“í_ʵñTÃqq.Ï®�U\|C¯Å<Öuãù6dºˆ‘­“RùŇ`ùƒÀ߃ŒïÊ.(e0ê¨eÊ›“û2Ÿzt¯~Û× qæa7ɵkpq¬4> ML׿€&Ý÷0ED\¶Ë�0~Ù ñœ[@\]“Ü)3ø¤x–—•J¹“fÓu_�Pïr B" ›šÜ1);t’®xø(bù+Í�ÚÓ›o»jý¡¯Ùi‡$J/Šj}Ú¥gU¬'9…°’l(lÈ6ÈÄ^»Ž<¦Úbñ¡×Æ<7SaåíLÛ|ÎÕ¼°‘€Ê—ò,ŠZH’†ÂâO&ï<Ö.aµp—o{ºcÝi5üU±%ñ•‘â[QÓšÇ@%m_FþC]"úû~-¹8(>tî¹ýgO«¢á›;Øvá32?ˆ`¸ìvî^tY›Ë¤©©ª€‚ «ŸÜ_ÆFTºh ç×@¸Ó’ôÌËÅ»_Þá•¿*�‘iaŠÎy"CÍw¶4~ºY‚D�]�Ãx ³qœ£mÿÞ’´ã`ÛÿIæ–ö•ñX™0Ú2ðp&º;´ÕÁB¥âHt Á]Výõ'Á²²¨6©˜\C�rÈ}V,7‡¸%�²BÃêä¶Tc>Þ´wœÜT/;Ô&â'(Ðn4pp² ù±,[pøí"9ùš²-C¿´d·N ð²]e>ê䫗؇ûvAIJòÁp^ûëu�M„ûàö,z!©ÞEu*HyC˜ÊêœÅ0DG~ãCf.ítö]±¥ÞJnM‹’b|‹{¸Ræ®íŒ½ëGÈÆb2¹ƒ»Uö°s”Ïh«zòúw/øé}Kè™î�ØD㬭„õ®É*!_�ÅÌ 3“U‘Ûð0ìs`ãkëë4­†¯¶C¯ò{mžTüVYbœë]×൦ÀÜÚƒ!ðS˜ÊÛ$TÚv-Vi®[†�•Ðv1IyRÅ\¾~ë`sú9Ãúáy1UD2ÇØ ‹Ûë¤Ö)ÇaëqÚ¼æ—Æ¡Øð&éB}o–‘ 6™‡@Ú‚¡y‚«»ã„m¤Qƒr‰÷B÷e`É1Ï{ö7¾Æ~m×r’Z¸ËtùwMÖèÕ¬… ~ìæ±Ëüq7ӉΘ;œú_ZE}·Àë8–=“B Ô¸©i®‡ås[…œOÇ[”Ò8æðÖ©žÂÒ™ˆ‚±Y»,åΡÇLdJkk+ù®òDá7É*i—rJ Fë³Ê9Âω¬L_7õpy1Š*€¸ª!—Å„é/_†?X!ÀCãá|#�B^Ze–´sö6 õ†=Ý´$;ñfô%Ìæ´x�¢Ë�ÞØÀ[àû#®®>ÏÀlãÞ6˜ø¶™K@5†˜aæ.+ÙéX /°›fO5ß2 Ÿ¸^WìY5E¤öʾÌ3 ðqcCeD¹†Â’ƒjêªt"NÎ#:Z£y\;›“êòÞÖ˜$Ê»:]V)ά½kZòo�]S›Áçy«A·e—ËMÖI Ö2šõÃÌè[#Lü˜`Þ°L-9£™rÆSs�›¤”B„g{e£…PÜ•‰ÙSô”Q·Š€AT3q7á%ñô"*U­¨Òs,â‘°ä„Ö,=g´Aß"THnºcÒÆ7xï9ÓJÑÑ®Dñãµm.u÷6üX�o€ë¹ºw ËÁá‚D—+p²+o¡Ã= ˆ8̱vÉ@±d€(L ÙܼӦvùï{<Ìé\’ÝÕ'¢ y �;ô´×Û„þÎïͧæüÍ8°fÊû^Jâ­C¾6; ì'ÞI!ÌâhëóØÀõÎM£i·jq©SÒ^Ö`°Æ¾¸I#fû<&¥¨þs塬зZ´(^æ[ l› „¤×ÖÝ+`VœùbžÍvDm;÷¢ÀÏZ!X‘YqÆp7M×±]DÜ|aN–�Ö±{õZ”.q…KÒ‘âs`ÝXrèì×Ñ·LG®Ê@þ‰ø��Òû0FÒ>ÔJ4@�±…^êyŒA\W›X9}˜»-äPQ.èîdìPéc»MÕ�¾\ybÈ¿(弟š¹tÀ$ÅH¶b›k+b5ù;¨Œ²Óýí¹«ÖÝ ¸}è!©!í¾–- ·Ý…ŽD^A'Û¦5@Df”sÕìUðý ^ÔW{Â@ Ø;õ¶iß7°àóä\'wbÝ l§ ¨bLÏÌh+6y~êT–l`Ü!øû… þF´‘„ ØÂÓ+.ãÝ·’©Ác3²¾Ä ¡è_¶5xt³ÏÐ Àö[] ‚ ˆÓ†°YÕÍI ”¥ Zä¶MÐJý‚­}ÄJó¢1îB|·ûã¥1qø'!Žè®¯8�aص›J§ÞjhÃ:Qè<¥ž(ÈܑƆRµ8ä‹»Á3"†rÔÂÃÒ.ó#µúÐPµ§-�Œ6Ìõ¶PnÇ/òêÑœ\À¹·1»�¿\BQ$39Gàñdo ý6•ž‡‰×’Ï\&†Õˆâ‚=N6Îù¡6ʃn!gKG„0âÔ1”&ì÷´"Y8;œìÔC cËçZ�Y'4Eh\�·ŧ"k|~SVò(´‰ÉYÁ‰¥/�“«uq kžsJR Ó1¿Sbå²L*#T ânz†¡ŽãBäÕ}û•bz þáNÍ�bY´æ;¤ˆ|ÈuíœO4`.ýáðhZÌþ´Å¤I¶Ëœ&#r‡ý1kÞ´x¤k�¸~îðœ`Aä@RãZQ°}¾<ñkã¬\ÜÂøF¿a†~n�‹±ÁÞ~5ì«§*EsÓ±n»àúµ¾º ‹{m�Õ~äã8¿tI?´އssN/8a�«½xšeío� îÇ‹¦/¹Úfzù“¼xõ² ï�káŠD*Ï©[¢6/¬¢flfŠ 1F›š¬  PÜÓñ+ wŠœP(úÚälD.@­Ý†CÞô_T÷fo®5IKtàd\mhi-T0�ÆÓð¨�Cà%-¬#Û¹6é°ç(Ñ–� `»{«‘£¿×,f@’}‹X3'ïO¦úZÛ·Žòø¹ºŒ lvÑH‘Ìn¨÷šÒ|’1´¾ R9P¶ð(¹Ëi²:‹ˆp7V½bv¦£Cb@¬|¨V³»ÓÊ;>‰ 0ÊŸ_M˜ž�„_!Ûá‚ø·$ó¿àà‚/ Gºê5ËU€uù̵ �Ñ™­³à�ò à{t‡ Œa¸‰ª¶'@ð&“C}(_¬G룦Wr8ÞDïÅ_Ñ�X„ vzuÔpL4„Q¶óͤ²ÿ Oß—?5¿Ì œ�Ý£ÔPnª ]"û‰@›(­NîI ¦ÆB'5uÈòÅ ¶.iô0¢µ›¸œ›¸)å¶6ŘÛfÑþnyTAÀ€á�šÈ¡'…ŽçcDG&—ö4æÍŽÔÄÀÀµ ±¼tlš÷j_ñp�"ÉÌ¡aA¶ÄØm©R“l¶¶íšÄVT¿ ÏC³ë]ß…µ9g|\å`Ì‚±öz‚£ÙMO· —tMĉïn“•«aÆqÉ|DÏ®c‘ˆ!éó¹G �4lŸ/ÎJƬ\m\mm8X1¯¹[+ ÃýNÖ­ó”y'áRÎ…—‡¡U ß×›ûWTPŒú~º¸wIŒ þ4É’Åé!Æì©»Þê†èþ?;ÓÍD!ÔF½EüL:Ž™'zT¬¶!l�<ÍYÈËí?¯`)–=Ùó¼. M¶N7‘Ø`6•¢i|Š{I+Ø.øŒ8ý›š]äªÖ¦ Ü�±F¾ù?%e’ÉBF<Ñ{Óa‘l{ `0 |5ÝRUÙ¢ÿ ‡_ã�=îÌß%h²�ÏL{Γ¿T`p©¥ÇuÑÜ’_¨ÕÕ+n/@Ì}BÖ¡`¢ÁIy(Ù¾LÈÔ¶6 ¥î‰Øs52ç;qIcز²AôTÅÚËÇëZÊZãx^®Š·àÍq ×d«°4—ëÒ[@øblWs¯Õ"ã½Di¿»ÀÝM¨S�æø /¤)ÅáÊý”o¿ ÚþÑ^ðþžQ+_IC2ªåÒù¿7}ýôÅŒès1t [43ÉÄ�ß0|LÑ6ïUn7•õÚ÷h¸{Ý·®"Ã¥¬À³ÂðO<ÀzyšXÂö7€PYîœ}Ç8}| 0nFn£¨.Ž´0Öžv­×Î([YŽYŸ!qt„¼cbB­Ç+×´rÛKw�^nÄ�Éᘗº|ïžç³'DN _Nwàn�TÖ«lÂF ;uÒûg±E½µs'N mVÐ÷‹#¶1›ÕæèÛ¢î·=p‹øØYV¬d˜ ¶]€4½ê0iø6Bn R¶\ø¸ŠÊíµ·¶/BFŸ6>õáµWÞFýûzfn€ê™˜ »n# Ùט„¯ô%QõIæ®$]U‹)oàÇãÃÒ,ÂQ£Ò„¡L¥„éí«ª[8l ^þæ}MûÓ’/Vü9àË_;Ë./�aϤ0’Í žGäús»ßWâ9ðíPw�–’Ö©µòC´VÖ*¥Š¯q¿×›Ž[4ö\^âÌ91ΡøËîìèû{áÔÆ�¨Žå lŒžú–‡™ºå½VÌm; O7!goÇhúÖý²I�4f}.<Òú|#À�Ë’tÞ´ÓÚì-)›j§^wÎ.Ìï«Nš.\tø€·øª -wq²Um>-| ûÖ{Hù/�XÓ•Üÿ›ÌÔÄú‚ÄoÞ ]<+`åÉ�½Uö¸¾/]œ�Ñh””°-rµ }Φýo£tû‡þ;£Qõwuå C÷Ö`ÀõNÿ“9ž±M[žÂ&=la¨l‚Õä�ÝîOª© DÀ¾ã!¾ëQÛ¥hÈæ/ŪI¦UeWY¥î Ò)%Ž€—{ç#Ök"Ñúü�Qc+Àiö6öðPjü`úRí`ú÷Pã¡Pî«æË7‹‡‚2¤Ä ×Å'h*�GÝÌ[K“&l²ë!G—Ù¬/Àƒ‹­Øe*ÓÜ ÷ Wá NK7¡0P`q~¦…µIa`•;˜o$ÕU=¸Z0õˆ`Á·Ì¸§Ëê¶ÎÀ>�þ¨%)œ›ú„ N¶±Ì3ù„´}"ä× �Û¿Gãó°do”ÞQ¾†Šå�ø5!ì8~vŸ²>ÿàü$Ò&¸±Ù){/o—€©æ KTª• žíšÒ=ñ/šNs6׬“Ì@ýÊéJ‚¯SqªC�wNµÖoJùÝ­{ý¨²•”¿ž46Ì~ÕUݲÖÇYWvA|Ÿ²oŸçÄü(;ÄæH4Ù`Þá~Žä&¯Ô±�”#;„ n]ãâOíïšÍƒˆìF� zÞ·­RØ8O˜|l…ØN'Ý$ù ûÝó/k¾§†àï‚Aà°`z&-ÿ7)Bµ�m÷ÄÝWzúµÉ6~‡Çúq½ ìçpaû×Ä2éšÄÝû�{«í¢ãö³´„Ä@^qp2ñ^ õ �³®. 7Õ3ׇ÷/Àܤë�\æ{Ì�¬avT­šâ>‘%ö[OûÃnDŠsxÊ´@Åd|Ž—gAWkj­ÏÏž)ã[> NGÐ1Ð%Ç y½¸üpOÙwgüü}Û¥±ü¿=Æ›bv®Z¾£Ñº „�ô—áщ?· &]ê+°ó8~~‘ßAxnnô¶s¾QÄp»Ç>žo¨\e€@�dYpø0'Jµ€~ÕA'a^ÅçF�dQK ÅâVZ2íb¸8½’Qš‚‚Π÷w¨´K.ÀõŽäa ÜêÀ„{`z.ãеك€\}gä=ÁçÃ5 ¤ßìÉ}ðdÚ`Sšò|ƒpæô±8¦³•«úD‰¢ %<՜ӻòvѱžÀä~Ï õÎîxÔ{Ù:Õø´äW*ø¤Z«-VEë>—»ÜªƒÀ€ˆN>¼Ô‘/‹ì×¹óldѬ!¦# ¯ìqÖrÔ‹:^¹ƒÝgàÖÅô;�éh#VS=j¶<(ÜPgë<™òXÐrãB-úoH„:ÚJ4© ÚÙélxNØW{܃!²Ú,Å­p¨¸écMì¨2p´¶ ïw;Œfµf0<€‘‘ óE€oJ0îÙúóÏ® iÛ°íË÷lè¾uÍ­i¶ SËD†ÖÎü> Ò'Â0ŽròÙ-Ç�ß2Bë‘…r"ó:®mw«ùòXÂKUbü·Ä©Ò$М]”ƒ|ç(�·j‰”عE${²ó§Ü¼£r܆‹†®6нñrM®ö':�.ìÏêÅJ¸° •¤ Ú´Áê|Ö¯TÐ9 ßˆ–šãÔÏb¿ìq±˜´ÚÛ…ÓQLJ*Ú3ä°™õý¼à éÐŽÖi+G°Ö ˆ{&=ÑĺA4Fû|ãZEÚ�Ô(q7…WÉ k�Kp‚Æ­ºhˆ+f±œKÉ,ÙŽ8·Ì‘ÆBÆŠ4ò¹ZôVÜH;{³…¤$ƶø~…�-‰„A%Õªì>©©0ò«`üV×b~kÚÎÎBÉ÷h ï|¯¯nÐÙq¿?b<þ ªâ)ðm¤ÊC1‡wãã·Ì Ìù²Z[ ÂØb‹‹àc¯7Ãsc̱õ÷|fåA–„Á·«�½@4yg f¶rûú‘€ë?»ø?2ýzðö*ºà¬¹ÖvÒƒ~¯Í7;-ç.pEƳg€ö �1bd¶l)ûvjJ)d«ž¬Îw½×gÃÎùú¯§œ lIooÚ‹± ,k�êY d–¬9I¤…eMüd‰Ô¬ í¦ŒR;®—=*ø:(—ƒìª˜—½½—[PÐ!˜¸¤è[ÔÖ %~:–—›S<M'ì,? �¥aq�éÀ˜ëþzÏ|ÛÍ‹/E÷ˆûyÆÓÎ}"�¨\ÛšXGÇ+Ü´ío zûCµôuqÊðk¢ ­�Ù¹—¾·ª•ö‡ÂDWŠ«‚ÝÈc²‘fÁsò_Û•ÃMlx™…Ôƒ‘`øŠˆÙÄ¡N:Ñ’­Ùì!ýÃHÊÀ:çS7IàžùŽï·-Ûµn¶.¾@~@“È›ÛTUàF@�E4Šk q °�OÕ“¿áÜ:ûèÜ�£Ý €ZκòÔ×A›¡µƒ\á}¹¤…Î; Ì~ò‘%Ì» Æ1 *‰§7±Úr$^”×Èý£ªd˜?W£/xaD\�0ݺ«hŒ }¿\C®Ü}¤¥¾ ‹9ÌýÖõ–Ýùa³å÷@B¯·u‹±P„Ý”cˆ!�xÕˆÝx ËÞ“îÈŸ£•Ô­ *Î9·4žþØž³fûxn϶@˜ A¥×3¾±‹þœÒU׸’«Tø…S{À¼}›gÈM79é¶WL“`¼B2ËÇ=füuG$XÛÓX9‹s!s×TZ_^”҆ͱ<À>î}ׂBNÏ.}ñ�1gé/-%Zó­M“Ž�žÈç�åwضŽé`æTÍBÀ@Á�¶ßî�Ã(ŠÚK Z‡»8X[UDÖëF„˜Â¶Gè6b�›ÁuâàµH;v¾»PP^Åá G¨Uò?Ìl(R¡hÝ•'ßo ùÝ(|¼KlKO?q™D+¶\}lýèõ#Çbèöä~´ï’¬`­Ó”ôÙ&¾+*å»{�bÖ0P­Ãõdú׺ö7W ß”ýñ˽\‡ˆGê¤NµÚ¼� Yúõ»är¿:ã/ üW×ÎZvPUëJeø³$ò�/[Ðé\_Yx~Ý¡öÚ�þ?’ƽ=PÚ/V¢ÎèóÓ uq±§ç½÷Ã@éYîUžn‚0„Ú®Ïv4œ˜‚¢9—×^=*dØOwzý|u¸ƒ½ðµŠ®] ø©™ÞE–‚¾M†ÓhgkJl¸4âp7Èl¬–0$ äI_ÛrëõÿnÊ}„5ã-ˆmÛŒw‚ÝÞÒWŒª‚=tÍÛ �ÈFƒ`,Ï6(ü&.]‡¼¸!ËZ£½Eœ¥•Û7¦Ôrì ŒNíÊ;Þ9†‘/»Iµî×yßdruzKÍ‘[–L—Yœ8eÎ×ñÏŠ~2”;B{ʯ­òh¬—ù­õ›KñôʶÒ2v³µ·7ÝÓ‡%Qc¤5ãT�Ç×ï¶³ñÀXøû‹ŒÁú9 yœ¸Þ}é°›îÏ3·.'À8À!nIY€¾¾Žc¶|_Ó´*¾Æƒ¸À†¹y{\·{Í=»æ–àîšÖÃc�½HêÛ~@=-Qº�¸ºR[ò½çÜD3…°Ì[$|båÜp3_x[sÐ…*Dã�¥\ F 3¥ €¥2gzÐ]iÊ}V]4žùKÞª#ì)ê™ ø6> ±. x$r7Ð>”® ÒÃß\ /¹ŠK¶w ’§5š»ŠR á í¯v«SÒ9�çÊ[ŠmŽwôàiJò9¦»8tµ¤üÍ7WÙ[vyüÝò‰ôº]5ó½çÔ:ìÊÜ \1Þp(+ ˜dt+ézM„×ã!Ø[?[™°ZÜî/<9¨ã?/bŠ`«Aà3¸@ y™íÇðIÙZïÚÔÖn¤ÃB– æO£ýÚ2Î- F­’bœÕneR�ް�œâ7š±½�kd…„ àX^ ÄÞêØ í“µ{i™h0Y�êL“Ž{‡ƒ¾u—ΉO�‚žæ�;äÖ8ä{áʾ<ÑÃæº9›ua ;g3­P5ÓÞ?h'}¸<ö×Ôô30Ú—À¡PÜÅ©­ÔD*+†@O®VœéÂ̼Q¶y¬bª®8G«ã•Ê€sÐEræ¤ße�¦D—!aàÀÆ×w5U«5iͨâà}k÷~•†š ‹e­ŒÆ­c>ïj’­njz*IÒŒ&¥PAmÒ{9Þnñ‹2ò½({hË lVs�®Kçù[3„ Àís£ííÔ[ �£…Šfä‘Lz� v•´ñôX^íó±- ßkÀ5úNaÒ˜—D;·©Qüœ ìÇѽݔ§ÁåÄmÅÂÄ>w—ð�ÂmÄ/yvcKÇQ8çà�Y#S¿�ÖKvÕ²ÕDÎÕÉ}äáÃì¸k�(P˜Äuq1Ãý«m‚– ¬gÙ G`)LT[{x¶DŽëA~(‚‘j,’V¦ŠŒÖ‰ÚÎq©Ô‹Z¢ˆRg}TšävÓep@â;Ì�/¬˜É�[F’ÓeÌg®€YØó·^Æ# ³èÚ^ ó›l:fUH$‰ÂÜ_Vøç—:Ÿk )ÀG|âŸÌÙ.;d]7›µµ…¶=W–Ø;zf®öì]ï¸ aËv,©ãµ]Þß­w²k*·è@wKTcb¯5ú¾[\i-¿ïF¦eå¬ujw¡¼G»Úߣßm ½S‘JÛ1iL2ïæÀ^Øpó4ráÍð$.Ì©™×\¯“ Åe'O¥Ò´‰ôò¬L9 V~¢Ì¥6�aF,¢ÄÇ|^ýâ•wP×ÎÙvoxì--(W¶Û«I¿U›ç”žyë¼Yô‘â(ñMúÇ“Y6¿ØÅçoÚ®yÌ«FÄn6Éy”z¶{�‡H’ßìâ¡Ûs€c]€d :p«YÛ¶Ù™A¥ñ¹2dµ ñÌ¿"ÚóçšÞ¡JPóÒ­ü„ªw¬Í pq•dµ‹�šuêóví4ߨÊÖÇ’žŠ®§ç¨jênw÷“eø?~„K\ëÌ4ÙOpHX/¯ ÚÓ &±†Þ1B`«tÞÝ57¨¨ÝPÓ­ñ=%ØSÙyÕ ˆ+¨¥þß~$n £ç÷µ„Œ'’tMÞ¿6á8¥W=qìW‚µŒqÁú×íŸBrÀ¬ªüø ýýÓj{{cKÚ¯ÏN¤¡n¾2Án±•¤$ÿ^(½ �Ü=±â®ŠqÝá*‘ý|­†É�;¬ëñ…Ï<>OgšWFÅۚ؄ÊzOz}ךËr\)ãg›CÌ¡ïËê`ÏÝLa…ê=Jh˜,¸ìa“7Ìy3||ŒÙî¢Ý‰Ï±2î¥Ö—òÃóoâëŸuo† Tœöñ¡-9Ü|Ùd¼¾àÇi¦nù„î¾úÝãó Z_/Ë9èkåø²zpŒÙ~Û7¼˜Mº¥ï¬¨¦ªÅG—Úoà¾Ç2Œŵá½þW>©C‡Ì{¿qË¢È;+§q¤°bî)«¿Ú£ùø±ð¤ Hùû„aüuˆPR­ÚC¼š¸�/oÄÍ”ìöaq/Ϫ·ë·Žc2Ylå×5Hsz³2 ¸E�Á5aWTTµ¢�ÜÚñǼŽmôg.”Üèp©¼H-kð‚m“=ØéóÑÞ{Þº}]†`òÔ®0ÝœòÑHÚ ©P�h³9­¬€QEðXšÝ—$qûÃͳd2¢ÊÄÆÓï¶/ö÷^ÛÝ2—Àë…˜­_ëwŠg^ƒÒüN ÈÔšÝ n"�·BŸ¼WÎ�b†Ìjúú´¡mkóG”Žøk¨?\˜59××Ö¯´r¬+øã¤5l˜úB‰yEÝïåf¦ÀjóQ9*(]îurÖ´jüÄ`ïB b¦•AÊX²]-£×>ä Âï* �œ‘¡¥Ñ-nRŒ.×Û–¾Ò{ËBܦ3¾$~§§[ÖøÑx4Ú9¼ðªõet˦A ¸`·.èû4.O#}ŸV+YŽï·Þk*A%³b±/Åݵܑ¹|·zr‹ƒþ;5Š?>øëW¢K†o|Êa³$ˆƒ<Õòµ9W$îš²ï{ùõ`|¹³›Hýãçc5eVØ Ú‚á„Ðsy9õ7"‚x·ËçKv´96+VWè–9ÌíV—‡±ªÑë~ ÂÈhÏmÇ‹^³òžv³ïvŸŒÅ¹ZüØÜo¼Ÿ¶ Z�ñ8œ!;tù[Ô�uðF?œ[á-ó]ÈÓSe�Xz`¸!û*ò kbŠïvl�ŸÇ®ß¯FÖ•qèŸÜ:@ØFéó_WÅɬj9½í¢6ˆ–÷î¤XtŠÒªp¶0^[zà6¾¶°<×WÀ9ç`•­‘h ,J; ‘�é°´ÒÚm(Á!bQ‡3p¹Ü Dð^»¶&± …."»Nì›ÊE¦~­á>bÎŽé}¯"já#¨Åo÷TiÂÎ{lÚ±Xܱ6¦ pqÇ·ËhÁ¬wÙ1ðcM º­^‚)Yd„´mÁäø\ÒðJ°F ˜Þõ±èd–Ú:Ù· 2µ0˜U <é‘,WB%|›»¡ÉRx•Â8¥…™l]zKn£ÆÑ Í¢ c‘Åîô×fì×�É•€šµ˺‰„ÁÓX¦ÖíB±”“}g‘ùÂîjW.E2ÄaÆß0j¢gF.K¡–˜0qÜJ¢gÑ«¢}¾Ê’nGZ¹×h¯pOB_A¾s¸Ö(Y™—2‘¼&ð˜; ÊÒÌѰvàY �W/@È%¤>ú¸àçeôs¾Û¢k@õœ…iWmzY+Þ/‘!UéÏ-¥^¹ŠÌØh(qÉðÝ?W.vl´7’ìÒš s§X?¯`ËVÔâ}¬–½ÎlØUêýÊ'ãLÙ·l½ônÚ .u•¨·ËWSÊÙ…*l¯Š4ÜEên†¶^Õ&âw›-½ßÈùÃЬÜ=úx=Î9U†Ó&5iDÈ ó»à»Û8r„‹>!“æwò}#÷Ä~ø/q°Îíe‡åÖê–À1Pl:êãëbo ÁÖéV«Y'{¸¦×N† éäiÉÅäã Bãw+îíoM˜ZÌúÞŠ½îm¦¸à|ß·ø×ªd8]žTèsõ»¡ë$ø ÍOk!nm•§²ê}‘y­1Ùâ™í£I¼ŸªÂƒ"f'É´Úßnyõög¸%WJ�bL/Ȧ^®hÊÔÃ(Ö~U50a|àOá�çJIs ¤¬|'[ú ×&4@B¡š°^ÚÒ®ÁïvPtÌ´�;–~uÆö›*toBs7ÝÊè@*´žö]ô2·Ê¨o:‹hšä¤—ÆÚá¡�ÒOX»ýÐ|—À}2ËØ�Hºlò™÷K2X-,µT�~ôÙ­z{Y[§AàmaÚÏoc}(§çÁzÞ SF)½`öeƒ3Ž2çF“›`ZŸ?d«˜ ”¡¡cc#FË} Ò~| ¬ë—žuÀ¯¬�½�ø©AÌæqšì˜ïqÙJY[ñöüèSùÀŸ½@?ŸÚ@�ä�F Ö2ú´u0‘0ÝØ$�wÚPkÀZÚØéð8º‘Úœ‘›Û|Ñ”ÊÁ]vÚáä,õ�±ýîfh2ýΦD LÕL˜îšV'Á:ý±›¿RáÑæ~gðjŠæ)­¡ï?=e´¾{Û‚äN†¬Š´c$¹ô¥LH%ƒAEv?€°{FJvÿ­öÐ-õí£OQ”{À~ÔR�ÿFƒ OY ¬Åí)}*ٛќ¿XjÙA¥¤ÜMÑQ­µÀéŒÚCø–ë'Wn£íÄnÓÈSÀ¾W�`sYÐoã!N·¸ý#ݸr­ù–”£·@Î$T:� �&wÁ§™°û*JNûÎó¢˜nö9’@¸böªÛÅFÖ‚/®„ 0$¿„´õ¡âÃV³îØì,…¦|¶âP§;¹œßô©ê§‹„àÜ_4ÕGYø‚‚¶6¤ÍJ]‡njn íð™4õsMaÏÆ®Þô€ažÙ;ÌUöóV} cô’…ïW>aÄùXâÒƒJHjÍ¢ýA»a©ÝV÷Ç  ¸Žö¶5u¶›ä3a”…æÑ¦¤¶â›ßäPÆa­lÔÛÜŸ¥·>¬Àfžyæµ§|‹p±m2' P@wë²°(¸Ë¥é³¸ÝóQsyU¾œHg š.õL{½gc³ì!q6#s–,$\ÞÎ: †ºŠ�,ŸàïoŒÕ¶„ ûë.!¨§ç€FyÆ=<×ÕÀ/·Ãn}ºK^ì8ä�¨rM|Ù¾J²[˜õ£Š§�ÂôÆSÅ7'†!,ÚrfÚ§qÞƒ´Ô"›Óƒþs <*bŽ­›lß;ßÚXÜÚ>Œo¼�õVsê1êë¾ÆßdöbíúÙ1$(W°Ð­Œu:¼‚¤cxŒ°è™|£ªytDoQr Ìt·ò|Å€ñ¶ææ(È×(¹ïÖŠþÅHX�Ùú“ûLÌc—ó÷bøŒnÓ,Uy7Ÿmj]ðž$Ã4@=óÛ7BËÃ>‰ûÅ&L?-ӞŨXº{³Úû+ô)žs]LA]*"¾š2Ñ §Š¯7{¨p‘>ã)ÚÑëAµ·žòà®3›o[·“›¾úø˜Õryc%·=ÈÚ?“OŒ s Ô®®˜«ðwnŸ·Öd0pC39Æ«­GYw={Sñbj Ç¿ ÊÕÂ:•½ÃP*—N'5P åký!@øùbãÝ ÚÝBà+Éu±ò~pŒs—dÏ_xµï7í°åŒAMfÈ+»cµÁõT!´Âb^ÓË<ñ˜�غŠ�®µÚoX*ùÄš¯+8¿ƒ ³&d¶‚ûœ‚Ö>po}=á,}>¾ùõ{Î#ѳó¼³6×~eÑÕÞXCm®AàWë¡t¾${fL’7Ëö͈`3à¾ã•|rò½I??y’á$iþ › ñò¿·ïƒ’zôšpWöõ,h XíZ«ã Øqù¸¤Ô/ºçõëoµ—ah‡S¯»Ö"©+[Óòþöà,\D—n®û™ú7L—Ð’“ˆ�½Û=›¹!·•Z|D¤ìøío‰ù€R@çOÈ‹‘8O®¤¹Ô §Å£*ã:íŸéÔá~3Nf:g³5y¾rf9Øš`Ö=qf‚ニ"žK­f·´5 úÙ›1Ø-x¿d¾µ +cd¯cY£‚ šçªÿ�¦�ñzý e…!BÇîV…� Œ[<:ìO1&`‹åì�k®ùk”‚–ÂFƒ`­P+¥†ÌN›š†|˜xÈ‚&À_¡Â r޹§TOÃi+˜]1t[t&Ù³Ã¦Š¼áÑãi(vQ™ÔzRëŒð¡±\îªØ…�#òQig›P•¡ ^—yrk&Î`d4\mŒ9 `on>JNÁ„–t™!‘¿¤DÕÄÁ 0a`µù+¯§Ñ[°e­ žØh“IDG¼· µ@Øo¹Ý.x¶Ï¸fì<á1+ÙÊkbÔúnâ½V‡Í”±ªï ÛŒÔ—ŠHp@Mèú™«°|à�Ma¯- Ÿ  Þ±`è`:£×9ÏÑZR¯’ÜT�Í·Œ=êæÕ6Fªù-#ȳb}ŒHµØž]×0åW¸[¬á @ð4úªØao‚ÜúS%òëb#Î7·Üêß9pv”Êol·ÞÖÇ>£¿¾ÎÒfÁÕŒ¯ 7ªÛ}£~’è˜ÒØÉb‚ü.ܨ›=�M…èÀ6\Ðg@)ë¼»[Å�ãZì5˧†¹¹Ëxƒ»”[Ìèë ¦žãCv{6!—;ˆ�qÿ:tƒï§–سqû}Õ¤–æ˜L`üÛŠ£9æ£2î« Âc.öÚ¯ãÚ~BÃvÛ¿CØ\{–± Óû¶wï¼õ�moܹÃR]³V±ô-YÇ# ÅʼW’ÿ†åÐq,MyçA‹™ôc^ê7+͸ág¿ÔJ5x �¶-Í :‹RðeÕëki–š¢ÜDëFæ=mŸ_Búœ#vÒŒ²èsÉ´¡:TÀ‹ är«¶Æ´¨ é`0Z(ù¹ó§L貘¿ëQYQö€¶¸îÉ x5Ë‚²¶Ã\ºøƒ0^Öý¿à wä íO»ÜAWS ‹úÁËÚ“´Šïœm‚k(µ•UÉŽƒ&K—·aYƒ¦�¾�±§ˆ ¤ O(ºRÛ¿c ª†»¿Ã“iåŒqë?™Fï—¶k¦Dd–E ë†-µSéQZì|› Ê훋âvÇ‹"v÷¯¿aK‘ A•Ýž 8àŽµiE9‹ïA§_Ï €�‘«=�rö€¡•¸àѪD3”Îx¿ˆVhºH·:äæÚÔ™·®Ÿoa×u —Lì[¨/riŸ åØ_K�à2æ~Ô¨†º®¼w× ¼9Ê 3fΪ¡'µ'¡/ÍÇ1g]‰šßX_%bg\\îî±}l²wŽ"‡-Yc7ÏÔ@éÑRæ#RÚ�·è¶EÕ;bÍtB›S8¼_ ›»".æIUùÕ Õ[´ 9ØÝ½ÂÌ~[²zÕè!P]n³xl‡<Æ@„w4ŽY9Uèâ!�ö×,ç¿�¥AÇ^­ üGª ƒ 7ð�Ñõ"–¡YweÕç�*¯ø°ßSGT@ã‰ôg\ À=±¾sïØº�ôqS×'=àB§¡â¡ÄN^:dx›á = ËŸvÐe_—?zcCˆÑª›4˜‹d�ÝéITTˆÄ1cõãÜð çMX•‹÷¶?rÇ‘¾ƒ44žg Õ°YÃûÕ7ÞßnÏúì»Õ¤c'H�)Rï´ 2v®�äbPNì¢×àiÌÿ—H圼ošÞ®>¼s¨‹ -¾¿ã¬¹Ôæ¢ÐwÏ|%Üí:|lîÁ†/SO×O-1¯Ôàw7ÞàÌZàö/{½îõ;sȽË0åÚó“�\6Ç•„‹û ³©åºŒàA¿—½F ÈÔ’a æó2‰z>_WrîvÞl˜_“>¥}ü>û&·KdO¶‰å_—º.m¼ ¢pø�†¶CZûŠIAVè%± l@ãjÛ¸sa‡¾«ðH‹©úÞdµ0ØP‚—QbÔô÷q®j´á˜Q¬E…qîË¢‚Šc"lysvã¢Dg!Â|¹)ÚÄè­:¸£h˜3‡ÝÂï„kG~òÈþ"ÌëÉqA¿±E¤lˆîòâ\Ù­ZQy�=†åúÌ`}V[µñõÛ&’=ß ,‰S÷3M!·—–ïržç7æés3tlŠ ®0ç[FFg'&°8paÓ"zÔ<*UU&/z‰¾¡;ˆõ¡ùGeñ.¹Ì–¡üÞ|�\õb»7“ia wF6 òfÖJ:Zèõ9²õ1ÚÅ ‚PËyC…~C”O"_TV$γÅÅ ]J®7Ó¸€„A�Ž£¾îüî–žF]9½á¥ Óuûž€wƒ“@ÌŽ!oÞ컄¿ãÁ„BÉ‘9Ù¯:#aó0Ñ+ö‹îôìÅø²©ïjû »'/ÖÖ}/[Ê¢ÞmÍe°¸+Ù¡¢d÷ {‚[×�“PdÓ_ `ƒ›Y^IäsÞ+b'uz· ÃlÄ좠|;'•êâgݹÚǹ|†*²”S™ÂÈcö÷=î¤Ê·�šÒN2`ßžÌ%7E]:†mYLH¦ËãÙv Ÿ%zl‘¹ÔŠóx±]2#’�²ψÈjù õ´/)·lãíòØÜkò~ªÌ¹jÁí£Nw &ø¶X•{›b’ñÃÓ •ÔC³IhmÖreØxØñð�}Ø6ºì¤qÀCº#­rOö¹ �“ñ˜Ô¡ ¸ Ð":ˆ.Í[¡xá†Å®ãn`CÕFÏb g±›humVµ~J�Ià»»ÜæqʃŸH¾7ô«1§zà9» °Vö"ýb Xã| ¾Ö°J¨ùMö/ev5@—$¸¦aIEßeO½>¦êŽ.k:´-H\8Ķ ÞkY–÷ÛPº”>ñQÍ·ZÃ÷½ ´Z1ÃÕ£¶ð£îÿÈF5C»u23G¦Pl@þ¡ Z¤Ö´ßYo¬-ü?4mVsD¸+)·Vý~Î ±Ý„>¢È8|u©QçïÂ�â ó¢Hr�¶ÂÙÖn™&}Õ2X¿/wÂÊRЂÚñX|ŠžAÇß~ßWÊJÃ7 ÉZv:°‡ýìt_Ø4Óþ?F;òyÌ‹R1?æ3˜f Øü`ŒŸû•‹X•º³AÚv¬ÑI6“~·÷³Z�?¤uÅïô´¼©ê’Ë%¬ž0 öé鮲×W°Ôjd¿Ýp°Äw¦›RöË`‚É�FINù"g0­¾Ü£±X¬êÒÖF,‰ß€u»rØfÕ’ßäaG�Ȩu’ñ Üu6†¹2á]/F/N™]g«’ÕW×W•¥?hö+ÞjÃ>žÝØÊ^È2¥}�D–Íf –�ì5F�[7/ ¹ÌÜFÁf;g¼«z:êþô°n3»ÞéF/Û²'7/N�s <•·�ra üuCRm.ܵµ*Îäm){¦_¯n‘䯎Ñ)pÊ!› úDaÕ9;ß³ø^g !“è"ZA›¬RãZëE?ïK¾¶ƒ¶ß[³u(3O-‘>LÏ<ð^¡op5�îÂÍʹmÖ{—b›À9'"ìƒA‘­(Q~¾y!ŠGY’¶ª±Ìo6•ðïc¤V¬¬QÛYw;›‹&έ=:…êw4-��–.ÖÃïD8FXh¸iB ˜Ü&ôÅÀWƒ É™”XCMgbˆdñ¯[ÆRë ‰¼r1Éš½oH˜}r¶xÍ<5C~cq¢3Á塇õq8“ÞPQ* 0Ã3£Zå�EÌ9“])éx……¾!{îÆãTæ*G)»Z$¡6@áÝèé,&Y¨ ôpy”1@å<²ŽFåiÓ^æ4ì�`܇W�ºMô|JdÄ$5>GZ{vÛ¾0Í�µ¢ÖÞ·¸~KR(wp ŽÊ<ê/oÞ`a²õ[¿zömWkõˆî0£m`L#m�ÓjY+ˆÆîk*,J»ëñ)KèY­9QìÁ™�Ú�¼�ÅîTÕìz›O|ÎæKäó9 ã°2Æ híY¥OÖ$f²!r;‰Y2ûIô¶�1g›\% ‹Èmà/`ô S†æÍåè¸zá �N�©Oøç¤àÂIŒÒÇ�ñëUòù8j?š¦°eD˜Í� qv³<çÞŽIàÂÊF)Ý óîùÄ=a(ã�ÑD…~š¨®"·±J‹ê÷‡@c¯!…0_× ÞÎËÁ0-lªÒ³†/<…º±+Ñ夲ª‹ˆÇ’tމŸÓŸæ\Yór³öß1+SŸO)øúgÛàÓiÌ*ÚY*®Î‚"¿Ÿr3;0­³õ vEºÑæâ±%¯Ðñ%•'ì5õîpõ}„÷v?C5áóÓ×fs¬˜•^S5ÀÇ3zO±f,£“š1‰âfÔzs’A¹ŠÕ¯´¬˜[)ù)\<UÄR¹žY2æÎX¼Cä×!B¬Ížå3ZkÙ† #zÅž£P€xäôy׋Nø°Ôni»À€OÀÒõjØ‹o÷!ç�áNñÉ TEh¶ËHÎ:œ$ÓJO~»�ÀÇðØ=‹™Ýß1±`³éyŠ0[pá{e¶Â�TPvÖÎl=È a)Pu�r-\¹r¸ê[ʾÇä̇“jÐmv7!@YÚùå-ôÛ¢™Ï…™4à6°@>8ÖÀwgÐsÉq«0•CÂ`ÊÄ×ÍoŽ"û£kê¹ÊÌZ¸ßR¦º³Ì!n«ƒ¨FÀ`}Mi¹MÎ>ÎudgnäóÒqLëtûøc¼<ê/g?Ö %õýžJ¬,mÇñ˜Ø¨ :�¡Ù‡ËyT�=çä)­]cÉÏ|_õ…n‘Y!UéÚV9joyMñbéÝñ÷6‰ ‚qPÑ(â=Šë5¯Ž�2,ÈáÒÈ*ŸZS(8åo[X½” röÞ§p�­|| W€_›÷ͦΤ .ÀûcÞ.EbYÄ$6ii˜Ê³Gº±|ZÚP¥ÉfoÞa[œUþ i#o¶ONò„ØÔ¡ïÇ2 ¸�Ù1ùæ””GDø ¥Yj�DBÈù^Ò °e9L†Ú¹bnÜ¥ é0�ÀˆGÎ-3†BÕÖhl)xÆ»`‰µyñMúû˜Ê:\‘„……ˆNð� ÜR£�.Ó+ÒÖd!Ý�ð]"ÒŠèBÖÄ<Ðá Þû³E;3ŒŸ‘õNX[ÝT ®fòøÛ­ûn”±•â&ýÛâ0ÚÈ_˜·j3ü0©ÒÁ1 ±6âÓ®Å|®òQöǡ⾗³pÂ{¯YÑýËí:ܲ„ÚA†áwÖ…Klâ¹Ð yÔ3À~ƒºî°oœmúm]^Üàî¼!Ž.úùQ€€ˆtë4¿ÝGðñATûãA|³¨,Uª÷ùÉðf!ˆ$ÞŽúFÖ亚»% ¥‹”8:ƒu,ïgLÖáö𥥉´Ê›÷gêÃF¯¼^iªÊ¹Íp¢ÿäÌÀ0aÖ3Öàª&—Àý§è}å³NÝ{šì˜×š­>(Ω:ßÔŽ,|ë°—âæœ­ï@óÔþ*�ÏX·ÍçZý¼/q( öÂÀÙ}œœd—v;“ø¸2” ”ý !˜0<†ÈV”>i¼c:°ÅUá´Ëo\RðÚê“b‘Û ŠÐuñ<¬U.ìr*›`æÃF�  ’Û÷ «ô—E‘ 6¬‹Í+Hof}MàB®u‘Q!“Ïl`ýãø]Ìp‚�¢ÀpÛ�ƒ¿¬€5ÁnqÂCzP&­ÆÄTl²${›d•°³Ö­E¨( ¤ï¬6ç–¢t4Øå­*ä_Â`bÍl •[¬.3¹2§ñ^§ZçRwí_Gƒ6ý¡º„³½[&ÜåÂÀ4(ÝSG!8" •�ås+ëL6#H´û]—2éâ™ë}Có0íY°”Õœqø¸®÷\Ú¥¥¬B_“¶X|Ü@±̟"à4ZamµÚóìž(t�F p¼ßŒÏA�{à8Á"Ïv�~ôñÝ:,OMö’í÷½…Øt13ô`ï�‹]{^ ŸQ$hê´ÊL�3°}d4oÇ?Ê�g2ßK{ÄjAêÕ³¹tÓ“<ùoÅ-)û«8W½|„e3}è΄&ÿaßO“k€, ø‹ìßž†’.óìvzø¹B;f�m-b ¬±.ˆƒšT� bbJ€¯š½GÂX)|p£ÔÙXüÊe¡_“õßœFކ�™’ ÞC ÚYý§È(^(ð݉ ¥ï…¤û”á¿kX ýÍ�ô@¶—Ô f�$¨¾þÐâ²è]óÒLÉmœÇ—Ù„\M鮎n…©¹ÎñɘD$½~�eWqcýk„e.P>ý}ÜÕ¨®òÅG%Ær±¥Å’É–Òδwš„Ç´Ë«žãbÀÄdy9Pê§u]V‰^MÛ`‘ƒÉΰ  %fÆîùk¶6é˜ëM·)HÖ`ç9ûQ£��ºˆ?›uÑb~2ú±¥Þa}5KŒ ±ežï’€;ºŸE›»‘‡óÕkM¹Û’3�ß1 ´‰œåÛ~INbš”¿f'' þrKè¼l ¾„„+Ù7m–®ýû+¤Ò…ÂÄéÆÈãÑt^…ƒ&�„÷i�ÎÊ F�,¶¾¹lªàa|P ˆ�P¶·º\q°þ_R¨qyµÄ/R“¿±e|’*ÚÍ9†Š86Ÿšá�ÚzO%óËpoàœßîÓýu=_|¾TiÈ.¹¦ËRœT~J|WUצcaÞty§úî€Aåk¤ñ¹lj€× ‰lV8Í¢¿>³P\`‰ èx{惜ˆð™3$(ž±õ.êßp®^ä~¿Æ ù¸ò�ÁÌèïã7ìØì§Í2°š ;Çä~†®êwuú¢\sb µva¡mhRÚRýÁW¹é3 ½©ø™“(Ç•�•tq=K �ä16|ý9ÈŸUA¯Lænoà\iŹ&Vtù5‹Àb–øøX à¶yyp[v¦Üüî‰Èû4„=4bnÀ*¦šý¸R„ÝÉOAÖ?+Ž[Ý_¬ï Ïݼ@MÀkš<Ùp9ËŠ¨Z¾H™‚ÞŠv½'ðÇs¤á•ǘõ”ædèÏ�)}™ÃAV�A/óê÷í¸Ìü˪<[m&ÛÛPŽ2ù/­Jñ)­ž‹¯óÚ0¿-àK:�áÞ#1ç5ñDtK›$Fl—¼ vá3úyæîÂùÍA8Îb%W�™¡„îå {¨±ÛÄdÃ!€µ °Ü˜¢ik•ŠZxŒ»ß@©`Úà k7W�Èï÷ÆHR‚Ÿ’V½:´M¬š�T®óû ßzlaíÂ{tÍýêŽ=B fó<îwHåµâìë¾™˜ ´b´£Ç"ø»æ²ÿ¼êkƒº\Çp´šBU®|iöÔþû—¯‡".#YóNƒ`\Gœéd<½Ìr׌eú…3 {•”ºRãôë9‹Pad÷YEëÓ±†òVxüF«, m2c…êCªddYUCÎo»8]E·ÕP†iëO½Ùà5.ÖîT7�Å¥kˆŽˆOZѰØ�ÏrÈKáÒoɨõP°€<ÖºG ÏÃ""*,{˜h2¡•ùÀ™ìëp'Ï|¥ê[Ò*ðmT@§1|ïH–°Ivøéaئ¥…¹‡mÛ�FÍ åÕÄHóz–îY¬¡SO`Œ‡ÐþçIŠÂY¶¼fòS€ý‘åô¯ðiynPÄá‰am#?S�Ì­ÏG·ô(æNõmEÍá:ä"µÖ~ví¼-�È-/Öé}¸cà�Ca§n€–iN<À’´0T" ˆT¾Õ~är}™¾ßòým«ž`�ØgWc/rì�ÚžÎSßgÅ>Í {´Áýv».¡ÿ1ºëQæãè$æ<8•þ§eÂb `.m»¥K�@°[&˜¿IwÄú�Qyïçœ@!È�jí´Ë;P�Ì×\¥$4¸èha"ݵg;3­YÕh´’;ÂÛĆ tÇ£½Û *"VÖJùÐ`.ðtŸ|Ž·Iåø t¬2=…¹CºŽ�üädë˜L<‚=È‚â±_EÄÍ ÊU¡ÇÅ-g¬"ɲM…N+™¯Ñ8=30¡P„_2ÆB(‚­kv {Œ›­=^æ \iPâE†·a7‚Òxþð?«¼ÜGíwQ´-�ïÚÖsò®~}¹ØíPÂúEÛðô�Ç+íG냄ˆá‰l&pO’­UoKé¾-„r¼aWlo!�ËÐ:å§T‰VÑ_ÚêáÉ}Âí1ÂY’Á…e$’îžE÷VÙïW­ÙZºüç›I›¨X—íí}.¡dúIµ"¾G í‡}ržÀP@J¶:1ÃnAýnÉ ü΀’Cq=âñõµtrrR”7€ê£H!7±±Üý~§Ú$æYv 0Á÷°ÍÛ8Öyr·˜ò¬¿­¼+ØR¶ î훯YI‡&NÇyؽ¸­äa líÄ7 ‡'µ�­Æ\VàIìƒ`Wç¹PÓV/„äÎ(É£xLZ:ñˆØ+›µ‘^O�·ù1éSOÙ"í`¨ÚùÀà§c'mÈ«N4BVÎ~04´‚9ÿ!`´c¶ aù½_ôm3±Å¾ÃÈÓj=J•�ú•“gÌ£‹‹ïY½°ù\Ã?1A�˜�$=âö™V€J\’¿À‡f–,ñŒe­õùk@¬ÑD’ä„a’£ïi ·FÂxa‹dïc²AÚjü;gY z1=YmÖ¦¸ñø/šÅ’p|Õ!\Eç #-|p,ÚÇ^{t| FÅíÐ÷›g|`ÐÏ(l¦ ™§Xeù/šp‘íÓ•pu8¼ØñÂãÖžÒ·‹N~öþ'µxƒ“tâi—º›©U¸¼Z ‚& O´ºÉ«Ä°ìôx±Ôò©VÎS¹NkI‹9JuÒ.#®æ%p´jÅÀæP¶¥©7/ç@M-ÑÌbÜ–€|®ÉÖ¯@ ó]j‡¹Ó¹ `9šDÝcºNI �)!ÂÆ×V3Åø z­PÌK†ïZÞgŸ�©—òAer<'Š>üú¦Ù¶”2”ZÖŸw ÆH`ìp#^{›š1+îXRo©\)ßwåuæ"|Az\„Š�âÒö&7ºfœåsšÔÖ†‚߬Q«FÝ%�åö]yñ[YêXN#œÖ]H:“¥iMÞÓl¡¿ýK…—mv¯6”�YLJæÇµ ½²Ø»[‡`:BuêY?®‡›âe÷à€2�¥†ëøs· F¤nxÅSØê³‚€Èx–p¯;åW–ÃýÍ89o„†ÃʰKü ZÎnÑ+CÕd˜hˆ×Û­—mpR­^gà©SÚÛ�06r,…b´B¿N?'Ø'ÓÄqu†…Ç-YÄ%µ„a¼Îíï.*zR AQSÚÛÀ@a“r½|¨˜“”�‹àårºÂä¦åîà/W³½ò”zÔë× mDµÞgZvP^ £-À™ÌÚˆUy¶½žîÅAM7+LæƒJO˜øùß³ZSãLt}›0÷%eû…Â,®ÄTSõ'‰VÛ9דë†V :? Pν�º'ÊŠlÛTs{ý÷Jà‹z�Ùñÿb�2ÚÙ³n6�Î=W/ÃÚÚÙ¹š�[ Ö â�༄�‘MâÅ{¯Ì�‚êþgÜÈdµmšó‰¼£¾Ïœ¾GÆ:,Lɶ½¹w ‰2²ún «ºA �¶ßìò–Íh3UËRÈ¿ÑÚÑãì”ÔZúyµÏ¥ó2©'åÄü_d7°gA+$€Ý.c…+Ÿ9y»±êéa?¼ù©w-È\c{x@¾´fâÑgH 0W*cG¶~`ÄÚéa²l®N@Á)dƒVp-k ÖíÓqM”¦ÈÔäÂÐî QÐ1�‚  %²2„Æo†4 X’å´¹9Ùž†3¯§Ú¼m_áÉ»÷¨ Ók’í­ky5W=Q�Š�¤ášùݸà±ò(RNÒÄÙÖZ�Ûe;Ø[)†~i�N-žÇw©}ÚÙv­±Ãß-?SÒ¼ðv<ð,&{÷L››Ù‰vŽi,gM�9/Y{¼]\ç´w(Ñv¸Û§?aÕ2#Ýdh­ž ®Ô—&3ñü/ ¬¯ÃùA†çõƒÅ\Âðy;YCÙjâ3�º�Ÿ—~߬µ‹8;ñqVàó)kUòNåU (z¿ˆ»xiݾ=·åpayZRÍe«ƒÛ’ìoH¸!³)o†Ù aÏESe ††³šÎc»¬8e� nBe'µ‡M ©võ(Ás��à¶AŒ›%ñÅæ¨*veAÕC)è,YÙÊÖù®’È`:8»N� ë¬œÈ�Ÿ:äû©*s·¡àžÏX»-ïÌYóhHf D—Û‘'Ý+û>» «© ýœG»Þó•Ôé;˜*Ö¤)œïµ$«�Þ#0“zÀîÓIËÆ-kê†(˜˜ÅNtCŽq¯×ÙF~e^ù‰šø{ÀG!;p¯€µð¢“AÙtN[#ÄpÎÖMÜU ™ ߉‚µã™ºV9'�²@Þb$p†cƒÖóaŠ¥Ñ�¸Ûä—T��Â@5%w \+xtc ˜Æ6Û/È“NÒlùszüí<× 7å“Hz;ºT•• t\9·>ê¾åå´4¯t eˆ’½iØÂ7´€ØyqU•s ÉÒàa7Jœå‚šÝ7`P?*_;%â éò”LJ½¶°o??ÑÝ÷V\Lø[pBƒ l²waôk<’¤¾pø`<„äÚ¾ˆ[8XيËVK7[¾d:Ä#®�=ˆ{ÊĄ씇 ¿ªº® §}fKQò×'{$=u)vô ‘ ;XÀÅbã7•€6aªå�$> Ëvó}g5Ý×5ßJöîTÅ¿ÕÂæÌÔÍ€t¹çzZ@tE×sw»Â!Û�K6ûzÃÒ×f³†FPW7hì>‹�1Ü@Ñiõï_(¿BôOzâ(»ÕžÌ:â@Ô$/Y�;5å.+hx—ñ?�PÛ !§¾â:Ì�—b/üó­É)½ª„öS«xýóÜÞã1:�à·À“å�²ï©ÊÆï[I;Ýæ}" `.Â0—„þr’ÓãÞ1=>¶kX{Ì.Ô�Ç.2W{PÆ\rY G8TuJe¬%T§gïX Ûc1>õeº_t·.’Ýt™3 Ä êt©2ÙÁý¥¤[qΜzñÙöص™år…?ä·±@zع!Ю]ñ‚nݪ‚À‘4æa܃Œ*<‰U©áãæ׉´…ì6ˆYú*/ÞhÅÞ’�`ËÁ {®³lh|ô¡ŒÙܹ£MàÝ>†xN‘M«_là'RæKú™\6›mrÓy°$¡»u.Ù30QÊŸ[Íz¥ X -æ÷V€ÖÈ©f%²£p0Qørk9žåÚíöµ•s¿¸³,?Î<;a|9«ï4Ò…™RÅ>ݺÈ3Ï[Èê DäI¥èõµ;0vAã9Aœítàñð}xÂ1ù?²C›8¡å�¨­4»�À…K×­F‹“Z‹(“h¦šº –‡öBò­=™‘ÕB¦™®r„xòÁTî]p,í¹©ÚW'¹K�dò™FT+—7µT�€ö ÎBýÆ?8§¢þåXù «z^ÝåQ° ûëºIˆù˸Ç�.;Ý™xò|€Fç›ùÇ/Éä Ä®ì@Ñ¡òëàã‡*E#2#ä"ÉLsÛ¬+™�òdX8枀/Àk®† 1gÏÂfŒÖÖNv�EÆE‘ÎÜ;/¶ÙW|  :Ì~mŒÕ@kZÛ¨ve³XÍgo¥äÔ·å½¶ÞË‹I‹ D¥Î‹}q�`颃 VÙ¨{º·&µaîŒÖNІt]‚ßùý];’oGC¼ À¹W4�ì"~ +ÔzÚD/¬Z6QeXãØo9sÝWñ±“ºW‹ìr©ã´ù‚(_¶þ#Ãf>�®\üt¹[ÂU¬B×xæ®ÌæÃX9l[â‚ßÁ¤2íKdšØ�[–¥y68A^9ž\†çëŽC›ÃHÝ­ß:ë9X¬ôl7„45ña²�y«�6€E’.f°2ÆÈ vº¢”=᳉mŒ Œ¾¦¤H�Å*äIq²íöê8Þµ¡ðxò2‚!ÚcO}ãˆyÌ«€´ïpÆ9ú<·5ݧп»èÐ1–•y÷ÙA'ÍZQ•|‰ÍñB°axµ­ !ÀŠæ˜Ä×7MÖZ^=Ö¥I˜ów(æ©}kÒnÖ_Kc››U^¼Eg#·6 ŒÀ¤$™¾DExnº<'áÆ”µÄ i7¥k4Æê Zéð©»ý®/Ì™ÙU]Ô‡e�_[ ´ºËF]­iäA‡´!î䇷 þ¯ƒ0�Üv®5³ÇHH¯õ0E¦I¾¬i¥,p6èè��™Iô-q(Û­&™ýµ[íc׫¨+@qp9bjÊX�ÀãO6DkhvU§ùú‡lZdÒL¸7TÃ[øª ‘�÷q-!�—+ ñâÍ¥§ë.=Ö»†Ã{—É ¯§ä(öˆ-QèOgGU]ø¬a¶ˆ$Ë2…O‰zCª;h=5qÒߨb <ÏÕL­t `¹½�¿&.I¾„{Ã>ööK}Jýs}võoEÛr½‚ÀR&5‘÷�Ë^z¬„ßbC u}ýÏh#¢¹bìsa;l¥–d¯rÚ®nz°£Ð¼«ÂÞÍ¥ËôC«)ŽÃ…diüU�‰/֯àp©öÂô®øÏΠ+U¸;µE|öúxon�´uj¥ól³‘ÖSC¨«*+jµŽôƒ[/v 9ñ(|#8à‡”z´�¯ŠŠ¸_†6‘}HX�W㨒ªè¥BÙ›™ É–UÇæ‰ÈøÞ•m|µÊ°žã:‰„<Ý™mi lâ¥15qé¢÷¼Û¼Ø5…¥¶ìö»6Ðn§oŸõl5Ó Åœ>„pcóð'Ý¢öNX–›„»ª3‚ã$)èÇÈͬX'‚�ÜŒ09ƒ×5 �jæš 4Û ÙtïAÜ”gmsÖC°e{˜ttÏ„ßî_‹“R暌¤aìæÁÔZÆäpVÙÖM;KM1; p5ÉÜô�ù¢Âû=©á3�ãbÄÂ9&’Óq7{š[ÛBÞÅwY‹\\ ˆN>XQ݈ân²Âbík×�“”çwñëûT9.îhu(@d†<ƒM&…_�¹|ífLR…%a ‡¨æ”®I³¡ƒÊ ‡íËtÕò->ܹ ú�£¼Æ!àó†ú¸äc£XÞ¥\¬bô@˜³Ê%™þGxÒ2òØ \éíÝeƒ:VùŽŒ6†û %\3”óµŠåx6& ºÖ‚Z2.a�‘�»s9Èœ½\ÏòjàdË™±ß$èÖÛµXl&=óFa[O“Ï_nÞk2&W6ç}µMÛ:ÀoP3Ÿ²já]øÐeèÉÖ€õ¦Íý¯¨±‘,7ÕOs‹Äf””KÁU½³'òŽF ,#[˜é_ N$sV† ÏK7À˜F�ãý“etHÁÈïæÍv–ÛU $d)@RI�0ï× ÞþÝœWH�†±ømÑ|ï!–;˜–�"êæqj<áOp+�T/»ÑÆõA�wv ÚçS"&&sË`l48Žy¿'Þ�GÉ—Üç’i’áÜá<”‘xXp­øßˆ�Ý”‚K\¾yEs˜é`6_s¾Èí¼OÄ›ð§�^=FUrÜ‹eµ~ÙŸOœ¾b5µ‘×jOR¸|†¿ <õñ§GK«êé vÙl©ÛXÆi|”…öÄ �hÚEï5¦t£•(I[(Sâ[–Ñ÷<›òÕ›3!¢h©³‰7µ…ª‘ĉ°\B\wž¬ÊEoUjݧœáñoÂÞ8l­F�õ…-™+áªð�Ý3¦[KÅg¶ºF7„šÙ½Õé§Æ;èg ³Ói7®Ms•�Ç(Ü:¼¡½Õâu½ ì)ӵ؎ÎùªžÍa¶MR»€Ð÷vÞbù+,ø¯)lµˆgÌÖiõÜfù„ÅïÑß2=*-R€ŒºÇŸ’ÝW�EÔ«—yÜö÷æUEõ…¤,H–¨éïf®b{m3G¯ÆGõÇQîÜ,+ÅÚ ék˜ «ØÆ£Î²‡7ñ>;£?ÜK%r½¾l¤ã{¢mj¤åEì”7Ñ�ÝAxö€×¦¨<ýâæ®|Λ“Â&\nh猷SŽN}­„GeáÔ©0x%}íl ½‡Q³)–Û£  w�6½˜Ô³jÖç(†i$¡�o-Œ=OÂp€ÍîÄN íe�ƒ„`T˜Ò¾ g·¶43gV�ÞÖéùFDãWìN˜õ(4ÝÎôô¶È–‹6õv‹dA­lÙU±�‡"p§µXÄá¶‚re·uZj”ÓŽM/Éïfe)k²O@Õ¹ÂÀ(R¢ZãCÕà\`Ÿ•’Á»ª9�ÇU¸V5×âñù,™r]©Y"pÁuEfÚœ]PÏ:Å»®‚�•å²÷G>Åh)\wcÖd¸} iUïaŒ`¹6qDy ö»‡½ó�lVBóæeʼÒîÚ•Ý 0YNDËžKJvÑÅáãA)¸äM±òfw© )Ž…óLÀÏ�S!âÌPÆÖ­á ¯}ÀØD ’»Y< tÓ8GÉ"JÜh0hòŠŸŠÙ8[^°’¿1º§Ò½]—Û·7VÅì!A«fqÍíõ%‡ˆÛ‹ƒ _G9*Çù–1„UÜÓ›Žl3*ËÁ}bçËç�ÜX> Å;­ºÄïÌïž]êÌÀ Ó0 À€Á›¦ ̃X×N’÷¸¤5S Ji¤ÓcZ~‘·Ñ,åËÇ›e €ÈœjÔ QìÈ‘N˜ú¨j¤ÅÜ¦�Š]P1welI«‰‰N=šÚ÷c-±~­Ï:ë³�Ó ÁƒÀ±ó9´¸ö¶‰î/e –Gœ†J×ÚHÁððHÈJŽ ,yMîqD[$¶"£:a-Âo¡al8è'³U®ç[ü¯�¸åŸ=åäÕn¨*jv>ô§~î¦ì] Á®I²ê:5ôDÂ1þLMdÁùéÐïGkeåkx_Ô“�LèۥÙÙݶõ��ŸîÚ÷‰ZšµÕDIˤ‘‚Òöônñí†4ñÛnü`Zûh–l‡ß!a7qš])íõ�f©æf1šµ›¿me¯eÃ;CØí£Ã�ÃxçÓ¹P �Y]F«õÒÚé'BÐÎÜL ðš6÷YŠ`uÒòpDƒùùÕ#ÏÊOªÑ}9ûœu϶Çâ}Ý­‹Í­¶ES«»‡Áñ€†C)\CéÁ5 × >�g;Ê/n*Á¹û@(ç?‚®³TÁ±ø1zÚõ ýABñ?‡í¡Â "~Qý0Ñ�è;I WP¯‘�vÓšCð~C¦ûY= ¡ñ3Ä ôºé<S¢óìÓÙ2·´LÂÑO8Ilæá¢l¶&m-Åb÷Vkêg¿Z:íö°K£ÜbnXÇCNÞò‚¡ÂSó~WLï�)}ã/&š†]P¼B¬û�‹÷¨…Ò³G¯z,ˆ8B;[âjÈüÙ̆:@PE,0ãæÉ«º³º®pôIù‚nœŒ”tv8ßÓhëºéôo’c“�¦m®G—Ã}�L§2˜¶FiìAmqQAÁ´¼~uè�9ÈfÈCòsl\Ûh>AýËunÇž0Bsi̧oø\, ÍáädSF˜¾#k‘ÃŽ«¦ ˆ©�•#›)u£º4GYűs`+Wg¢…¼]dE¦�bØÒ^Ë3œwͥݜaO,€1fí§�P¾bƒç¢ã- ‹¢Rø¹ì7ÄRýšpfé8"¯ÖÂ_â,èÜè"áÆ�†q2 Ð/½´¸9‰ê §Ñ¦óo¥nµÒVŽÌÅêeMêÇ8ÂÌ,†C7düú&;|eH^ê±)©Ú[°J屨;•[ Üû—³ï–‚ó?»g=kts1Û»†¥P/–»z¸ì@âéŸÅ¶\T¡w˜{ŠEl¨[}(x�KÎ@dC{c†XmþÚ?ôn…ÜVnì1í8=ßkqÌ”€Ñ™á¡³ƒö±‚z:ËìD*Ü m ÛËt´‘뙃�Sd¾H{Ñ7tmŸ_zÕ(¬iØغùÑÛap9Ò E—ç¹y7ÈÂ<²ž‡v#.sñ ¤·Ñ�x™åk›�†»–�‡@wß 3{y[Jf µÄØ->ÎlÍBÍíw[׊lD·c´Ùô¸õºú 1{r•x•ù>ýÄ`µÉŠù öI»Àp :›wi¸þë–lµÒO͇�(ãCIœ%³hÎçG‘°âu29POb€Ò‘óìo©Y·ë_œáÀ`,ز�m. §L÷%M§‹„VÊÜÇ1ã²&3,±†#OË5d'öñA>�‘õûv„®¥ƒ¹ÄVÈU¸ÏHëœ�Ì‚¨�S!÷S¼röçY“nýêG«ö†¦;Ø=y×(8Zá}8=ä9÷_µÝ¥&ýS"á»\ù�'µðÎcð <1„zfç˜Ï2�¡•×T”f´iÏŒ&ç ÚZÖ˜·äª$[œ?±~³/²ópûÐ[+_³æY E^úóä» Yµ+³m7v)qÍ0]Qw`” d"Pƒ´¸SnÓ̤8YyiS˜Áƒ[–W¬‹Ì¿²¥ñƒ¨/¥r¡QÃý;Û¦ÂÏoU­¹+%Q>«Xºë²‡s~Íò%�“‚±Šc>ͱ ƒ¨ä¸eHÔáÖ,­eb¬!„ÑÉ•ÖL!nDq oøÌ|ÛÎ[ä˽‚‚W˜ŒV¥…¶7KOŸ”™j †òÐÁlpy)à >:�{@ÖíévCÄñX*gÎð)ÎcÑ ¹"#¶àÁâ®’  ˜^�–Íë¤6ÓÆÝQk ˜,ã®}Å8º¿‹|™‚Éš¢ø/ŸHÁj÷yª^sF^"H¹bùäϨ±++Ý‹Îyôü´7Ç–)•'b#>çå §ÖÈjJ൳yOC€á‡Ó¦å¿.ád2ê1ôä,ú¬Æ˜žŸÛ;ëÍ•€v%‚80n7ㄵæå®�ãÕÛn7ãùK$<–½(c¾~ª;œ>•˜�PZÞ¸`˜¯³Ÿ¾¶Ÿ õßGtìæ²×C»¤hÛ; )ú‰CŠ×�XرÌïÃBi1Ì�\´ìjz^eSôÍf¨«…'K«vÀšAÚH¾ð·n Šq½uU¨8óùNµh+¸x¡“kçåk¸ß=®Ò_x­­N]LpºƒÃ•£À@º«¦ 4K*J äã‹¶—‡­ô0�0 7î^V[†º `¾vIp¿x‘6CÌx2²ÒëÓDwyqpIøƒ›£ÐT©ïÚòTîÁO³Ý“ó)|‘Aeœàôÿ`J³öZÏè¤Ñ[‰¶ ‹×ÚS0”/#<§Nõ˜]ZþÃðí|F®«'•©IíX–í]\lP¦>Ž'cɪ¾‚>êÎs·TœØ­ ¥¾bð“|1T `žq�tà"»!”ó+Ál”íõ«€0²û¸]í5|ö’ !Ãñ=ø0Îyµ˜>îb•wEÖ,nTÏîeèY€fYp|¦´¡î¥d·Âùmêô“o‹ÓŸ&µ×ô„h7ÞMvÝØèv{q�ùÃ9mX¿ ‹FÜTN”X(xáI~yï�àNP'ZQuÑÞ4ÎømŸŸR,-8sÆsÄc‚YÇv,´)iÚ5qé‹uIÅ—UÜØ9±Ö]@ÎC‹RJE›xYÍJÂ2áA°n^„Ar<�-¶,•€ÉÌ."÷ ä÷N-$UïÓË«BÐøÛÙÕã¢ò ZKUisKS¦{’Blÿ é˜×BÍn2÷zIY„­1Ž1€2}NP`+#6-NP@HÓh¶4`jQ:°:J˜+¸Æd:9‹�] ÓÃÌîFØN¼÷òú«¸=o0Ì«_dÕ_¥`Íso4¨h5o¿�ðàŸµ7ŒåyéïÔ0ø:[{™r‹!u!óeuV·èî8ª]ص$ž7 @û®´~0ÅÉ2ã|‚Š6’íIH‚Š’"7¨ Î�-Úì�iñÙ+ esg…°ãÂ8l¨°l�Ö¢^êöLÿ sGˆe* �ÓÆlVâ[%z¸¯ÊÍhЂ¡–¼•Y”LƒD›Ù¾[éÐ,2}ŠÛWb³áï6É—ü+ÂÐ�»M<{&÷tÇtµgǤï1øºÁjS¬¯vš ñþ÷Í~|w\Ê’6Èþ"ɸ¶‰l9ÙK)Zç„Fú,¿çù²{ÒY³h6-§òj -¢ÎöñŠ 6É?Ý~¼sšuŽŸ´lžÞøô47ºì)ýÒìþE<­ƒº·½K’ýîXÙ±$ñöC,¾‰U.Þh8áÝc]‰£¸°ÜƒÉ~`Äúº zƒ&'[–S;Š·_²Ž‘†}W ðQ§UÉE»IT¤/›wO…¦@Çx !yE!7h…li¸¬¦‚É‚®»É¬¦`ÉÞN,q¶­¾EëX²Pç‘ã ãÀ:|¿�Zþ‘ ¨blÁ݉ñMükl#®ÀŒÇ®üÕ’Œ ƹ¶÷›ݛۡ²×²Ä-Õ· ~�ÖÍb½-¯^º6PŸgƒ³QÖ’c‡B�w—_jÀ{wz ý}âö{)ö9$¡›ûëõ-™Í¯Ý–7øÝ§jùã˜/38¶š5ÂDÞek¼Œœ›ao}K6pª‘Þêžöà¦k=M).úlB=¾]w•¹Ñ§‹m “ªêçÅY@û ÍcëÕ°ûè*Ho°÷WÞPe���[ýÀ³[Úqm=÷Ü{:¬†ŠkÕY÷Å1R‰¤ã~ÐCkŽ W¤ts®¼Éª7®Va*�N55ë 7Á©¤R£ *’­½lwrú×(µ¨„DÜJvL¬X]ÀQOËŽa´øžÛŠ:o¯%ƒò%K­Œßy#ŒXЊÖ }s§§N j€¶ïÙ‹EÕ#µñŸ-”rµ¥½žÊÀU>rö»Õóp;ÒöbP@ºô½GoÐJNF• 9.°àžnR¹»î¯Q-rÌYKr l� ó»Ñ®ŠL4…^C`’ÝüÙ†4œßê¬!)z¯ŠÏ@øm5Œvó�^á5ŠÝ4ÏZÅŒ8©V7ló®Áp+j¹j¿¢W4½J‡2¡ä·,ç£÷»‹Ù¡¶"cÝ`cMžŒaœE Ž˜.iLåÎ�(R§VÝÆš—rí¤©9�ScºŸo£µ/5oÝo@sIa½Ñ»<Î1~P\º2k°¬ì2O›ÈO&œ’òÿÝ–Dê¦Ï|”wŸ8¡l¿(€8öPÁ„WéâWxË©ôîÝewÊÖw´a-k¸Ú ^ÓM&±b¤TŽÍKz‹?×p ±äƒ &'݃·oàۈͯ®§æÙâàµV=8K+eå¾Gîm/fæq‹Ø~$DR'ív½��Zز †É'·8j;Î㳌��»c³[óª ÞwµI�ÙÒ#€iïn ‚>pè¿Ñ‘�ê‹p–öë§\ØI”t¡ñî*l••‹P<Ù¹œŠ¼.-Š”^4­¡ /E3%éÑ"¾‡¶D\vÖùcÚÕDañ(ºÌ5ϱ 6ù’i{”¯tãwênídð4f܉wÈÄælz#étM†02�›xHBÓ‘Òü…Cò™î}l¸ÛúCöáG-`-ÉC"lÈ:áæ.hÎeB÷×§–ˆˆÂÝ1µ«§'4õ VÔÙ` ¶* -5h7ÊywÑŒ?¶�Ë®,·÷õG¾û~»Æí© _‰ä)¡W ?T­X5^ èðPH÷�¦©/œ�ö&~Ô€÷ æ�Eœ§[ê¿àgÊ-œ>ò&Ð:À\DSlŒ_ÊZÙI·)• ¥®E|ÈÄ.D·Þe­¾ CuêÇ}ÎVý[º!rɽ-óg¹Ð5ñ«@Íó ù~µ’+oÎa;‹œ˜XÀcÂ˼:uý³ÈÍ©q¼#.#sún?+èùivc\ìú¸b…>i6ÝÅa ¥3�cŸ¬¹ÎY‚5|Já™éKÔŒX�¬Ë³üÅC ÀzM:M½?¦å"·!%Œ|Á÷‰-A7\=•ƒ—¢ç/7Ø¥Øû–êÉÀ8þËBHdur‚º`vïgCáÆMRÈA®„hb˜1l12i^Áp0ÈádÍÈBX–�OÒU´kÅü¾I!ª$"Ía�˜ÈPË,Ú iwr4ÙØËÚ|ö¨Öó}÷µ¶<{+/L¡r€÷êæbO×äü’ŒkÞØ5½Þ­'Ýš‡4 @Üðùyh�×–Áò›êÜòwÙ>Ô£ ›ñq‡VƒÚw;9Î/yìœÉù™±J`¤O…0±K#ã å÷çáSk9ˆ•DŽúR�¼«ïÁ¾v‘Ä�,´åÛ§L­¤ž•È$§8¶í˜Ìˆ\ÜóØ­+‹;¾_Wœ¹žˆM�+s‰‹óHšžpA”ThâýÔñžºÉ0Bðg“ÕäYy"aÍf�–tæ¥=u°è>ép�8 8ˆœ9„mÒY®ëm�ÕHüFž)qØšïvÓùŽÚnú¦ï@À.!Œ›mÊ 9Û ² V¥~Çã*5³Ü¦„a–èCúµ‘ÓËëH¾ÆÆA7æ˜jI²7�­0Zü´§.úe¥ÔʵU�0.4+÷bÂE’¥�æ‰ÑÚ¶›£÷|wI‰ CÅ¿v··�¾ÍGyï›I`~«í4Ó±ÒTÄ?Á|æÌ.VŽl¬ïn7Ý„M·Hk�ºÄ8Dg¥AlÂß…kÆ#iÛÉ}íÎX@›àÚíìGìüçîa¾‰jT³ª‘%ïß‹jÑØv"˜ZƉ˜Í_<úX“›; c�-‚*žjâ÷…•‹{žï™Èï7�#™aÓåù3&Nœ€¸6à[xÎU±íy°7W#?´þ¨pM·hî9Ý=bÚEòºA6¸ØqƇn¶ «û­:èÜ d ˆÚ™8Q)è¸�ð2Vïìf»U�ض^cEÏëÒЈ[=�±,‘wtE NLo4¸©òj{ÀAõ¾GØ](;¨¹3âÖx½Ú5ÇÚ— “=ÙûÒ:“Ò’/Yo(‰ù/ïFJU³‚G¶Ào±<%†áMÅC$ÖùÍ-ÁXÐþ2¾‘úYoÜ,š6§îD…æÁ7ÝNT—Ìßí}©01Qíæ—£˜àÅIÏGÞ÷aù$}e\÷éŒìØ ê"-€|£Z…>s{ýªÅ¢¬~ Ýj:¥—v‚v ҉!&>¦Â=ß1Ö²weÑéRòí…ç�²P.¬Q/œ&’ÁaÇk&X³mEj î’/æ,´„@Ä_hØ„Bfv«ÈP}£Pô ÎzÚ œDdèA‹wüÁ,t|ìçM¥�éÝwc�ÑKTªjƒÐ˜¥Ë°PÞ{�ªŽ0We,@…¡½ .h{��qÚŸ1æ ¹Õ²ÆøÃÑ ¿y´x6~cXó\Ç»| ¶±J{°^(uƒþb°ì±3>‚�_“_o? 4ò¼ÞZò…·#·pä=w¥œg)†]âËC•ÂI pÒ³°ë­¸ß¬±[ªï¼’.ŽE¡ÌQ"— ŠìXÚŒ>=66ÏlòºÄg–šû+5ÛQ(5ûã:Û�ö–%ñõâž~ ?¿ ®}Ðxšì=×[qºs=ï§¹çˆ�:جϣµ�«fÛˆ=”gKN×rsÚÑfœmmv˲žÔë|Þñ˜4˜í·Ž­®EðFŠó|jeDÃ[ËèH4üí«Ü¡|˜Óç`¨©AÃ&ùÁgE*Pj´){ á:qDs¡©Þ|¬ÙZ™¤‰fuV»ZA”Ä­õêñ„jÜÂfÿA Õ‹µ…ÍíT³t¥VMÚD#}O_!ò“zØÉŠs´€7­+mõ¯’9ŽÙŸÃÓÞ*°!G{]¹d9ÍfÏg27Ÿ§v…[‡4œ…°8¿ÆP òýÈŽxì;E�NaûHãsD‚U¸µ—x†V,Ö¡?Í”ùs¨ý0Ö­èi.�^žƒŠ ¹ @ ‹e€¯'a×ß�#™öÍ:PéB20]mæ‰�z„¶¬–1g¥Ð g5b¼ÈyC¹”Z@+[Òò �Ìè68 ùñºÌ# åkt‹v“�'Ë­M÷åò*½¸=›†o+áõ9`g×ð3 øÉRùÃWnqçÊ–öÔ9c °Øt Ç«*2пk[º;fÞ¥Ç{»šÔQWr8VíÖàÉD’n a=¼‹ïX2ÇS6¬˜!èaRî!ÖR^Ú¾O1/�VÔÃŒQ—ð»Äm­™r0B¤ç_6ÐŽöF±ykÌÞȿɚi?h‚\ Řô�fOwt£kÅ U”Óîî÷‰+¤Y=š:YÉ‹g.À©rŬzÎ>©=?¥(“îû”Î�ÞÕþô _³›�3�3a’ÃF»÷±ËüÞ KÀjÑ‘èÊ7œ}¦#„sí'= 'rÔ`:á”Å�=™tX{ mš.Vñc [¶¾Áj‘û©p|qË[tŒ9†ö©o³ß: î±zfá)p ­~Žç�IÇ-ÂgWEÍ[ÞQž$‡5L.i—J_Y±Þc´: ’/³t*š ¸U+þ½kGî¯rŒÞÃð¤•Ç­eQœrœ„ù½Ûƒò£ï»Èb"ôxZÃIÞÞK'ß~¹öÌò:_TØ0…™Å +b~Ý]5hü€(„�§î[:}½ÐD†¢Ý¾\lgê8Ë Ã…°AyÖ_[2´ã\4ßòÕþ³ýî0q#,ãòZ¦,‚� “ yÀç0L ˜Ã|Æ¿a=å*¶5Ûò)ÊxøùÚÜneP�ú½¨Ôà`¦Ó·uÌys•4@ÓÜIJ°Úµ{@gáµï—¨Ö~Éu|iÅs(X`R¯¾¨Á›øÏ½uN­äëΦ‘µ£BÞÞì7A‰ býí×ã—«Ë� çñ”¬Æ†ø{g#O‡0j³dlîÍ7Ë`éÕdÌ«W'‘;žuX{÷ÜŸ0<›a·dØòzt ¢”çä`íà æŠq°¯ÄèÆŽG–Á./ÆŒp¸4|æœy±–A\go‘¢®mÛõ�§|ªLœŽ9c1— *ŽTòA1ò®FmŸž 3ööˆYD9Tgšï?×ÔâÀfÂaÕ‘ÙZ㚃0^´Ïɩ݂-õÜîÙa “í<È\vNŠKˆûöëow[TÔ÷Ŭâþ¾$LÞH6£{!G m"È8Œ“Û!•ű�·6×uLË–áè•9´%Á4d’7šº`´q{–XDéÑþŒ:½˜–‡»ï7Î6˜!V-(ärÝPÚìºN�S¼èG�C³ÖRŸê+ª_.8*çSEÀ]e êÀüR…¶~Þ{ _ F1|S¢²\ ~`^Z$èë.Ýuÿ ô&þJÚ§c�]é2 ˆâàÖZ�ïWñz€É[¾Ð/B*¤aÓ@niuídïnÕ»SÝuœ@V ÁmÓÝKÂÒúÉ¡æ28‡Øóš6ñÂÆŠ':¾N|�evÔo«Ü\)Œw úÚ²s[JИ»ivHdÐví­núÍJyžºZØó0D Ø‹{ëÉ¡^ùGzz¿8|›˜E˜Ì@•µÎ7s„ñ•ÞÛwŇf0Ç{d4’&wUJoÄ,�æVˆ6t. c;âpñhÝ¥UÞÇ“´3æˆÐ�&ÝŒeZrE:ŒWsª­Ûò9å�ô™yƒ<,Í+à©Á—{¼ سº½Ö|½ˆt°ÀE®ãÂê.Û€'¦Šl„θØLUöòxìqÇY 5Ùz$–aØäZ2„ú–;iWɾ3ä8ÕàõòÁÒì™0GËQß�oÁûó%´¹±nÙi�Žà-â*ÔC ·«1€“s¡——¾’nW‡¸ w€ö0C&œÄ•Û ±Œ²h¦Obh,ž˜vÞ�j›Zó*Ka-V¶ç­—Jìë(æûõ«qdÔzç{ZÔ3ìÕMÂ×îtêß^pÍeLÜî|”>�,A”m­ôÚ;€Å :M?oû†2ÅÐ_¯6I‹šQ>"þ÷bnÑ{•<Hu7 7ä 6Ò¡_O«x*ÕÀÙÈW9§9¯9�Ù ¿ØÞÆ)ÌÄé“y‚„ú1E܇?þ·qG¿„âÂæ@iÀúcÜõ8Çõã=—žÖe¶ñ�ëVDí_™ëÒñsuÕsüT�WY‡š“¦ï»Ðwç"í|EÆ!Æ{µÑ¼M€éèÇ]Ó>dÐ%ÿ®|Ösõ\0ÿ¤¼é¾æAÑd(RÚÝ` ¡í«Rô$×Õ¨¥ÐÃ6ÈÂQFµWšÂ[Šay­¥×ëÚY[ ±g±ÖîéjÁ‚òêÂåݳ ×;ñψ8h@¢…Xd¦D™Ï-gdú3q]LšcÁÁõ¯Wh§3®%î‹ïJ@¡!»üÏí¥QPÖ_›wïOugMÀ1”.£[Ž9e¨sÅöL÷áP!ËiLÜ`�.)Áhb –Edàr;ŽM:ë‚·z¹Ï=¡ÞܬÏ�·÷Þ¦sZr?}©¬Ešd.éWX{%ú QÖ<²£V­kŠî*é:F‘](™�Åz]Ös)øþ�¿‘Pï:~cF§¾�fÙ¶"¶:Õíia¾i½7RQˆ»ZMž5S+r‹ïMµœ¿"SaVÝüõŸÄ+·PÃ-äèÍ¿Nk¶¶ë™¶+À!‡ Ô¥t•;«½¤7v;Û®^“ØÉÀ­žçÎáí…W‰³¥ÜÉÀícu`à€ÅÄ/Ãaæ†ýË“~é.„`ìàˆE×|~ t6rv¨…‘½˜©ÇßNK·ÆAM‡{q:σ˜Ø6g¶¿DTm xoh™·ô¥Æ Ñb�¾/ßÉ`›çµ�°—ŽáÍ<oÌ·‹_kCf=·rù¿p]3PC«uGfÀbùD-åT¯§~_óoLO• NóˆÙm@õVò®Y‚ÉðÈKöÇÛ´%óö:Ñ’²#¥_8Iv÷ Ð]dî5ÒgUÆô ß»e[óÇa bÿ;ò,6QP]|Å—”1=ú>˦ÔC:xtª~¸mÞ$²Cè�ßUÈìbÍj Ÿ¶§)N»!^zÔºt‹tôLgi°œ;7õöhÑ mlº~ &û–��>v®˜D?lªÅå5ÜYNüÈkìã6–û‰¬/Õ™ø5y® V4¬¯›5µYëÕ_ÏÝsU¾ái¶H¶�Z‰”‘a”GÍÃ/¦¬6× Oå6;ß›÷�·pQžï®: ©À‚š%Ò­°Ûêà"‘“¸NÄ@¾Áû ]µ4Z¢¡àHhñ²:@iŒ¶,Ði§²†ãëÜ4:͈«ôÇ#q€¥Ïä¬^"ªÎa‘-�÷z@VK?¯ž_šDåèöùËÄiø–ìE2Ó6󱡵©ÿma0­{rá|DÆôûH;)Ü�t¯ÁÓ&ü)½r)Ô틳(>îQw/Ö†ùwh­ßÐéË`èù®‰íÑôrýª›óNþ.{�ÚÎJ?UPaÂÅÙïc…d”°ž ¯ÂºÃkM‰¾»:Û‡�.3mpÚ�ŠÖ;µÈïœÁaÕ/Á¼Vì­¯¯ûž¢ºód€­ä¹cÞÁ[×Eî­ÉÃ6'dÆ ×CM‹EÒ#™ãm ¦vA`âVoaÅ@ìɰîg�ÛW·¼ÑWîç©´`Ç}³pcjÙhM“Å`5–±G¥x7Çw¢ÊóËî­ÐÓ�âlƒßª'Ç<Б ´ç¬W6õœã®¼™)¶??>Ï‚ çÍÔò©r­œyð}eôwÝ8¹J‡OpòW´,ï�AKÊäðúwr!'«.ü߯Ȅ¬3d­’›ú07VDÅnKÎ(k5`NTz jíQ¾:ó4ÛUÆéí ú;]]¾”÷6P»ÇŒàœÈ?Y¹aÚµ¸è8Õ[WáX£¹%Øä¯ ùðÿ´âà b Ðó¨Œ@{/Ry»x�¢$˜ÀßvŽ?�CbxOÔTº¬%S‹å'–dÈ‚¦¢o O-l§iϼ‰º×œt_›3¶ yö�è X" DÊjÁ¨”5È*ßs© ùl“aíãL-)Wçí¹ÒžYS‚r¸MðwzeC7¢;\ú›Õ½cŸÚªÎ²ÄÕ¡Ø–Ÿ±µ¾^Cbwù£u=âùâlÂ5H“/E^ź"ÒvñžöUPY½<úäÈ*ÔN(³ÖLÐ9SâùÊÎÛ¡¿P7.’ÜÎÃAEn9L'kVTåƒme¶ýÁ˜"köÅ[¹Õ>‘abšµlƒ+ªsqTósoEÁ¢—À@­bÏ|ΙeŒû×ã½j1Û.Yú¬8©üÁÂi9<Ðð‡ q1I‹‰l¾Ì†7œEjü ÒΞ/öˤRÉÈŽò2 fͲ–=2Í�÷Õ�äAÉ®Û-»§œr’r®¯IÃ0™Žœ›l ~¾­+Q§|s{@¦h0î¢ì öî‘Vœíl (`lªl¦o€#G°M[«/U³ ÀU#¢L³ U)Êk!VI®DÊçÓnÙçážSØG¬´ëz7Mä÷§Ë±j™ðÒ:½÷a“vÊ“p(÷¨àr¡ÛÞMn6uÒ\ÃHÉ‹]Ç:mÅ gª[ÑBA)ŽÖ‹²¶% ñèuõlÜIu¸°s‰Ñ6JìBˆ (¥­¡Ÿ é ×òÅ}Wà ǹâ5h?åcèQŠ~ê¢ ŠÍulÉ"ð?1³¯ú·ÆSÂì–moS#d¹ð@ׇô5Іmõ·ï1‡…ª­ƒš³ÆÝ¡~>ï‹›oÙ·›½mîh¿+Ìè5_N›ô`uGt—Ô.ÆùÜTíëï�22Dþýüõ¯åalèf ùAl¤~<À­» H\ nŠçìêùoÛ˜]Å –9&ùC ã…^Åœ ¸ª—,”˜/�û&‰·kí³Ã…ÇjVÓ á`(Žõì#ˆU8¼†×2á_ä(žXI4 à‹‰Ë@[‘ˆ.r2*‰g;€RQf{®c„yŒ¨JÜt¾ Òé­soÅ–Eï 9�ÍݼëuÎ|±ùAD`×mäÝG<Èñô%öoº*à˜ÍVº…N$Û£÷MÊݲ˜Áƒ_ ?…D“ Œ©e”*ÔXDX¶a%G×ú�=uÌ劻ãÄ{d”À…iLܳ~U¢æ‰°Ñ%O0$Äwíéí Pªæ¤2gœei©ÇŒcîF¾yrÇ2û‹#áúrU­gWzæõ])†ØŸz¦KjOr›{5àbìµ?�}£q··ñ ÑæÞ­¥á¼”}TA:,l4ùæ�±ëƒ¶m&›~¯4]ö~œ²ûMóZ±µE B-uU̺:ïÂiÂ-¸¹2ß˺ùÄ(†WèÝÅÒu@o"4«ózKõ”±ÏÑ¢¿¸]ÚŽc•˜ôd¦A³ˆ�n¤G-±�YŸ {ö¦Åb†]$|�ŸËì8`úÈÙËÜöDo%�zÅ’ß(uÓW—³Ñôâ[…ÆÆT·Î>~@Ð?O yˆÈl‚ùQWO’:{Ür+Ï?ƒLâÉo¸ÿp Á<ˆˆBû| ¶sµ[ž×ç²)::ã“ŵඟXZäñåƒFà'¢Û7÷Î}ûEx³ù‡È0Y Í;ì¢×OÐìEd Ⱦ¬Lf,¾ø¯VÃSpþ1¶W©Ó ç��¼—$¨²‘@ÎjÉNl˜�¹óíŠÔþF®c9lP½ 0�płȀ Cˆ^Êø{bã)$Ôd (™ .U¦NâªM€Ë½¯¹¨ÝoY»Bi±‚ÕWŸ½ f%gö!/ä, ëͺÆZ)¿ô-îõòšý¿ ‚X={‡ ×SðO~ðÖûvqÑ3ˆ€ù›5¾{–²^îV¶{aÛoº\â{ëH+8ÌäÖ~0„_”˜¯õf•g÷3Ýô-Ì^Øæ[#Çt"“ ùpŸ¦0¦ ë²w)\jpÙ†a¹ÊâUÂt"¸Z×ð¾ ¤7àlK O6­R>ƒáí÷Np™šhÈ_ã¶ï˜H&Í™«�žD�>¢ÖŽ(ªžWŽÁåo9â¡�Ëz½ñY ; ¢Ú¾N8܈¬-L!GÍψ‡p!J8€¶¾)ûxm9™›Î ’ m‰Ü.S¸°€Šرµƒ \…G¸pþ›í/PŸYµé`µ¡Ûh¡wgš!ºç5Äch>‰0àI¶™ ’–TÍâÿU `ï9ê P®n!&ÿ?€UßY(.¤Æ¸ =�-¿V{8yÎ(­Ås=-¹gBi8ÁÄhà¦÷|ýT%o<`u£¸I†0.|ÅN­yØ…îòL»2;aÚÖ¸°œƒÕáŽ.µj=æ$~6Sòx†î •´Ï –íóðP]ðÀP!æÝ­Ý eJ±dMp2°ô>5šò ­Ôý Ï¥K_®xرK¨�–ÞÚA¨9øÊˆŸíÐ×ÙnÃç™ Œ¦.+›`[kÏÑ¿�Âo1ó…3N¹Ö¯©¸SVyÞ¼R¥kðz% -Ï¡äKt¶÷¨¸Ð.nîq�EÀÛÙäzÊÙ°Dæý\M±}ìåJO»ç7«{*(Nòó½×Â÷ö) ã¤\¸·]£:ÌO³p0Ë` W ¥Iõé1&_tø*Ýú½—³dòT]{Ø�’‡­’#ÃÇ‚Ýv@aòˆž¤6ñ„¹5^»zÊÍ^Øy|€àz³µ›h!oÕ£‹í°UòÄZ5•��¬ìéŸMYCoK˶qö *ç¡G¦�ž’Ag»tv%ÝVü)“À›!dvøkI©äqºÃ›F¥Ú§ÞR�A¯¼ê°ÿkñúÉȺóàú'ïY¹} 6ᦿx9©k£À &-€”¹&q¶ã%¡½ÆI{­œk£Y-N~Û _b »LÒ"Ä0-ìss›ó�ª¦`§®ô}a›ö¼•Ktç=¢�)4Ãô�=œZ$nÈÖÄ—]¶DS”w檒$>˜©‹M18ïšµš3)@R)nÕÖ‡ëdLd7â·<ßG:|[ÊwM¨çÍ §”Ë€›|¥‚›Øôϰ\9#Iia°ˆlo L)M‹j¸ÊÈ'L-õ(Èñ¹™ò UÅšx ~Òñ©åñ;ì^ÈV×Q¼ú"{»œÄ ÏmE­Ê@ÈYN§WêÖt9Nj8ó<ñŸç#„ÁÒoȱ1Äþ ·€Qe ›<­i¯d&îæý20k}”¡?µIÿª>Žý»ÑTë›Ô±Có¸?ôټ٬böƒ�‘‘¬hP¹\è7k%¼ˆ¥'”V}¿PݬúÏ>·C.4,ÇŸ\1Å»°Õë³¢S’Ì8jÉFÛL’p€ë£ºïã¶´’v†lU&Œwæ,;Öua¿ElAºè_išÌf÷x<.[+ªØW«‹´@…QÒöùÞ0Ék†t½…ka¤;�oÒßs<©�ã}Í-Ƕ�mƒ¼qJC½€8$B ¿Êh…0ð+?­Bš›‹Í·LHƒ�ëný>X�íö-ÉÃ|ýh 4‰�sâ-¢ÿkM[$˜t?üOohè=)¶VƤ¸!Eõd?åqœÎ¿’ ¯—^-Hÿ&~!¶+N. •üó…áðæ²q÷zg¨´Õùú‹Aß§q¤tßgMŽ›_ÌåîG7âû˜´,EÛ h]ÊìArâÁšÊYk¦›y¬h)õ÷z<Œì¯Ø°KU5´ZÎrO™¸f? –�‹éMýÀÉ;uÁØÚ”Ö*¸kf×·3¥ò³ƒ´WHZ° ¸×8¸`Z$³/íû¶åTi[OÉL—uxÂø\Iâ± ÖXPpk¾‹­Z&S5©pWÞ“â¼¾¸NØÐ1òrlF˜dœê`£Ðõ—$6ÐOaÜ&h-µ‚¬ñ�ˆ-›Û8ƒ¾ðñoº(»s�Š Gõ3~mÏdQÜ5ïXˆ‡'!­c×k’£gÐ�,YÑ) ]uÒë6ö­¶ïåo½`gï�zfÍ]d9�szD0+ü«på�ÆþçT™Yó}þ|Ür">Õƒ9X¼Ùtô�M�›üŽ b ™ýIÖ~Cå©L) u©Þën;réS‚âé»8ùtñ‹wVuï7”ª8^Q¡o9„Ö/"uMw¶Çq6,ná£�›Uí·Ê+ÒèûÍ`Á?É6 ˈ†sꃒe#Õ`1ö@Æßvçë™�x¾F=ÏŒƒ#—aÛ2LûÄØ"Ú0éÆ�‰î³}¦=B²­{Ø;‹'I÷ ÕNômÐ¥ß4®1ïËáÜ Åú}"s~}ìmX3n·2í«TRà»ná\0V�L=ãÜ›û�ܸ?™ŸQ/oÍðßðáx@E™U ÙSE›‚+�£:Mg$/;^¨í³!Ç€Á¯]ö6„úõjÀ<[|<*¾”õ‚2šaâ.ÛÞdžA3¥‹ä(²žû¦õ¯õX´,i×]¼‡&À¼K’&”"ÙM$¦}’|^`ÅÑE´2å�Lµß({¯ ÚÀÏÍ͇K µ)† ñð‚ó5>ÀÞ×θ �Sðd#ŒMw×;ÆPHè[Tr³^¶¦ê:Ý3µòÈÞ ûž½«º †bœFpüc¯Éëú [ÛXÑ'>™å²Ìm¦øÈ¤ ¹Á áHp�ö׃Éõ2ÏP5jF­Î—M_g&—Û$9Z¯~½”Nèy6:KKŸ;žëN9¾Êq¿²OÍ�ŠþÄsì@ÝäE­O¯ƒ`íZo1à,æŽg�-c6†ÃZ·»¶ëo¥öì—-QÆÉͪ¹³Žijù¢¼ßlú‰©Ho°™EÍ€wvÌ m BcnÂ%Fnˆë¨Ê5BÎ,Û°o\Üoõ›!:mÇ\LFÐ\Uåv¨ ¦Xô;F߈q®ïo5`­Ô!Uk =°7ôo6ß(ÓJˆ_S„7¶·¶ô½§Íe·ò6»8õ›EÄM ß¶0-¥Tw.ãµì¸¬ä‰¹ ÝÔ­ÅÒi‰†üÑbãì¸ææa«#A©h¦äÖˆòs›c*,ëOa>6­›tÉk RPëÅ  ÔiT„+:-0,ªÜ½åµeQ÷{f(ðõ!LÀôs‚Í­ÕÜ/Df,¶Ø¹´¾Óx°NÿKÜF>Õµ§CA;p¿ÃôýzååÊàÝ¡�0à _'Aˆíð‡ê溹p7FPGÅPõ]ÓÞHßžÕŒkhÏœ6F˜ÍmQ‚VáêÔ�~s»älA¬ùˆ0MlýŠ®a*±€\6lñ™�cï{ ãYÀ4üg^»Ìow*‚ D(SçwJˆÝG} ¹õv«í–¯Yaþö¶˜u;Êw Y5µháÞfĈ¼��öþ ãÓÏŒB­ sKË„ýlñÃL{.�dþ.ô׌ÆOÄ8N㛘eß%f/{È…óÈÚ9 o—Õ�SDbòï‡Qè¯SR|ŽÜ‹fmÀ«øòµÝ¥*ß–-w?uDZêø>²@æÁ¬­ø„÷…ÁÂwíq×NP¯°~òÀ0wA‹øb#ÖK¡µ¨‡‰rÌÅPÞ(ó¼DÖlý”ÖØY0Þ”Õ9«Õñ†�ªzì lÍtKÅžED0çÍØŠø\ãZöüÛ{çÛêÇ»Spt ¿h~û¾½LJÛ#˜;ã6 æ%†³êeØÃćã–ù^CXvÝKÑÈàÚñÉÓ~YÂ^ ͵ÂZf�ý̼ 7o®ê­Xžâ5oÓË}Rúg%í*O)õ@ï¹*°h-ìTt'—FP+Ö�Oí}²e·fŠÑŒJãÜ–ÒÞ„q  ýò…±¢ø¸×ßFüê$•�5<{Šlôµóö)<=SÉÆÏÔ° xóÀß|’·9ü¶¾fÐ]Ó;ÄÔÚûqJÇØ!söMNà¢æ PÅ®Òú|9'8˜Ù­U°‚Ïñ2{‰CWÍÁT-£Ç3~N¬…¼ ] WM—< Ú^1i¦ÕG`'�7�ÙçÖµÇ0þó�öÄøUÂ"šBO­MèúËk| Â%\Åöíó�í|%™R5¯¬ÃXºjlmˆFÒ68÷rjçÓ® ­ Ý®¥nF™+ë0 àI�±=õöá”kGa«H ;n¡ã}íÑ‹0}s•àøôqÌç1¦1åóâ=íÄsƒ{OëV·MCÉI]p{9üY€áTX1¾v¢Æ(ikxzðÂ�ݳ6žÖÙvkc82"XLe(ê‚^L7�ej6í�‚òìÄ““Ÿ8860¾Ï#AÃ<Q�xÚoÚ‚ç˜uÈôpØn0(sBÒ uÒýª€Ì»%…Núé !öCZæm±÷us^OÛ×ÎíJݘ¾é"®Ì䂟ØYúj»°+dXÊ�™Z¾ÌÜa°zäº\ ¦¾uõhß8m3o½»×—ÉÝD|YƒôÛj\2]çc1ì�YÝž˜ÓldD¶¦®òÿZÓÒÞ�—‘zàÕõ:†æ�®ìMÆ}gëÖ à ©ï¿²FÞ嘆�6´€"§‚Ý•`É|Ýw.¬Š�~bÀÌj[!Ê–mÑE ßû±zÿÆ�1¶1jó@¡^ÇÛ6¼J*7iê$ ãçc¶åÛZ5ð©ílèq¯lÅYˆù±ËNÁ¬ÁyN;[Ô3å&ÍÕ7 ìœÝµ– {Ùíj(­‘Ë�™…ÊìÿÍ}Q¹)A]ԪЗ¢;�pØ�ž)!{c¤X]h†ÏçIîMÿ¢ÑU7‡—ÃñNìœðAYï‹»'ÊJú4ÒS6_ø¯Gkºe¶›úøÑK[Cýv|bbá²i§nyû�S[Ç«û® ãªÞyzca™™¿˜0`ѯï@ôŽ�\LÂÝ]ÇGþ…ËÔU#ê`“?ÞýPÏbI“ÚVÄQÿ½Zà`]M?±¾‡È­âŸKã h–þ;}ñ�kïÞ?lÕRÎ;]²Ûâalì'™»‚ÃS[èköºíÿýÂ0lÍnÓNjÛÏ„C�b˜†]ÂB|BWàÎj …/A°N€£T1¸�Î$ä,¬>¼?Ýf<RMûý‹¨_'ÓÔ”T«G*2·’2ªÓ¤èh#0Çt„Þ_‰ëeat\œZñ°ÿcbj4Ñ2Ðÿy;¶ÏÛ­+³ãVíõÐ…®;Œ™vJ-49ÜoÛjjò_Yî³nŠ�dò\ãðô­®ÊwZØCÃŽáA2[å[zêi¡> õ  “¦á{"•½Fy?cþ1ÍÅ[Jçîç>W÷ÈVžo¯ô`Á€ ÿÀ1ƒ5mo?¢÷÷ý:¬ú„š†!hdÖ@Ѻ·Q£®ÜÈ%6¹Ò†nª¤‡^‰"/›…†ùWÞ3‚Î73÷'»Ã¤ˆ67PÛÞÑKõMqsÅ z6VIÞ½�-¸œñ}®ªÌÅßD DvqlaƒðÈb]!á°�ðüUó'‹;€YAÂÞ»ÀÙAªú=EŒSxP™ƒyB³ÿKÂiÐ7£Ûä¸åFÜÍk@{¼~±úvŸ¼K—·Éãm‹#ÓX¦Ü\JÉH^Å„!ㆤ|Z„pxÃX6X�¹*—`øçjB>X·Ãîç· £6€±ÓW¨ÀÎfÍþ¸$ÔyÖ!8£hyž·Ø+¿%nÉ·p‡ÙÿƒÆòZw3@UàÌÈî3§åëtõsͰÝ .`Ad!fp *p!É(ÃþÓ_´¬öÿ–x›e1Ÿ™áf@ÉÖTšeL3ÄÃüwÊ¿lä¥-‰D¢¥½þá ŒŸ3µ(¶µO0R@Gð.dÀ›³;XÍ·–‘.Qµ3iö\Ñs£¯|Þ§ñˆ—€©‹> -)Ÿ¾ŸÓѽ'•âÿu�uLš™Gb)ò@#nuC©˜Ú#c1)²Ï,nƒ|xh˜¿¹Í#`Rb(Íä¿C dÁhŠÿßOs:ÿƒ3ùó? ÌÌïí¬ÿ†ÇñUŒÍÂ~ ­ó”A…nÿ9‚CÒÅwŸÝv°�´ø98d{2XP]¡ˆh0ÑUáø´gz1° kVÚxÊZÆ.æ¨Í?Í#Ÿ&µÌï1¨Ì,ïÏ_¹õ"1y‚BÖè_Ó”�ú>ËÍ€67\ ¢š}8ö{ÿy�" À­ñÀÙqÅå›Õ_*.¿óxÚy¶¼IUþJ=Oð¨˜vyÍ1*ö¯Ìf‹=柤5ÍÅ´‡ø­ks9Õ|z%R+…1 £`a éÇšÝ#t4EVÂiWXÖM¡XYËÊ|H¥—+ýÔ¨å�òt£í½ Nç®�ü…ù_^çŸàû#>88øÑ V"ë œšê Fl$‘è÷_òQ°°S�Z« �*€…ÉOñSíxÆAzÀ*I–/^>)D!+ ÄW-½²ŸñËÉ„ˆ-¶o›ù4äÛÓÎY…H¯på¬ú÷iiµ~ÿ}8Ü‘E”pËþ¤^ÔÕ}T‹2(: &[�uJcVQûšÂ´€íu DH p_¹¾•«õÍ(RË÷�8/81 >¾ÐC;8 ø‰1ôÂp@¦Èç œÁAXB L—2/õüϧÒ�Wûþ޼ýJ‡Òó Ô öœ5aç@ɪÁ Kñê…;ŽïKáK2 ý©ÃêûÆ4º¶s ¨|ÚÌBËl²×½tèÃù¿ÃNí@fqÓô³ò’"Ë¥Ãh…ÞT­óE…©T±ÏQþ­\Ö µ¸ù�Á®S�Þà‚SÄ3îiVüfãõ9h9ès~êGo±>+�êd !F¸.E1ÐT�Ž‚j÷ήÌG”—+“¸qϽ\üj0rô^–Y§^(¯F+ã‚‘Ðneˆº*È>ÿh)’XA… {¦¯¤ÙÚ“(RÀŽL.u‰Ì¥^žgÎ-¤¼?ñú¾äÜ·ÅiÞj£™QÒ ™‘È…$ïìgè ×j-ÇF³¾›÷¸öúΓœ ׉`Lq*½~^¶31©3þbB>ˆé" Æê 2½k2Ù§od˜2J�ûDB«PËfÚ7ò½å‹Ha¶"Ã�>%A@D¥gýµ´št°Q•IÃi˜ )·’‘g×UŠ_ã%„ŒQä×ãæ "þu1JïCô»0Û¸nè ·IÅíWÁ•ˆ…&óK~Óø›:N¨–Îï(sÙ¦E׌U5­!ðmtkÐé{·Ã«º ™šb”�Àúè7ÁpTWB  Lo{þrÒð^ŸË#I!¦c�ú/¡pÒpˆïæ7Ø`Žâ]š½§ AºntŽt@gÈ� QôlSkfJ( ðú‰v³œ.ª$~S@ôȇAeÈš ‹ãlJ“4üÍ�V¯ƒ‘áÏ^´oݦuü¥�~V”ˆÿŒq¹‰ÍÅz�hEAã´0`nWž²a‘‹ø�ùUÏ?²-2A?C«iv<ÝÛf “U¯î¢Q�l{käXkùeö‡…/š¸âp‹?iA„ÂåfÜßÞ’ÔW9È_Oü0lòwZɶ‰ÑË)ÔÃWäZ‰)°ÿ™8Ê_É›åmM j>iámÖ/æ2ж‘ÈhrŒ 0;ˆ`ã5|ðè¶L²5Äÿ5ãÔXËäôc!g;²¶âÑq׃£G —ÌÁ®8&…é��>*j£ÐݲԄÊ#%f ÖȪø†vàÂæV}Jµ´^;K 𮈳#�,n—å×,:ãB\ŠÁ¦¨@z·ÒŸâq.oø¦ÑÛ5®Œ’ˆ¶X¨S1•E†¥Z*ÑÅ™Ïñ“�2Ž8öVx~ܰ†IAÎ×Teõãp$™žm Á@¥Cç¦yœziý]1ý3U):LÉÊ{‰äò{wÀ¥“€C=0PA‘û:ê˜cK5´ú[îºâ°£Ú¿«Âfs&—?¡O áíhëpç†\y¶­2¸OÕ›u§N˜�^ÐQí~[¬ãO)=ÃãcDTFò©hªˆ©ˆÞ¿«…íÆ÷ µ†úüîÀÙ2•@6wØQ|9ê스¦rpN¼ÜkâP�]8À.è[)á–}²¨¤­Ó„' @GÍ÷Ê|à ��ÓfyCf½�(ÙS=ÝògÓ:È·À¯íª ­ØÒØð#›à3X" þj­€gˆ©#ÒŽ-Ìf0I F5ü*µìC�±YñÇ›ªÓÕuuíue`&©Þ7V•¥º°ËëÓæ/bÛÙyæn¾"`osæ´€ŽÍÒÆÚÜî ™†Ûor¸g†¬ßíÁ�ñ:ÐaÐs6×I è‚'¾e"àüñ?ÖÒAYêQZhÂ?…sŠâcm�™ùõô(#~ãºX’v!3ŒÍz2—ßSÔ-" ±š^é6T …¾Ñ7*š&?xŒ‡—vEäIO_ºl]óšÀ¦c¹i1i¾ž§TW::±°I8«½‘óV`žE�Tôë­Æ 6ÆI¤“¹èïLŽíW†§Â›¢rùß4!•=“d±SÜ™cVbrª-]]ãE%|Ú4]Ké­Ë_Î×4 VEÛ §ƒAXwb7ÌäQ;l%âÙæk lè5„ÐNêŸXºj€vnÁ"i­—q~TÁá^WŽl…’ÖBñB|"d‰òsZóÛ›h±ÓôìÙsÞó†ŸG*Ê�|b£�ø?~çï߃ð2u‚�p†PÙ4eø@�s'ãaã:Ãh‚`Kc˚܌=ýÂù€K1zÓÒØÙ ¨ Ó~X2o–Š Æ’ï :{%ÇI5eéøðt ^+4‰¼›óZ[™¤ÛB:Ñ&¤.8b¦3M„õ nìä”Ú³ÞØíw �Ù%5ÒûЧÝél+a´65… g+2§‹C¹½+(bØC}a‰è}�p/LÎ}çõ0•·e„9Õ�ùÎNøÌÂܶEo(TÏ€PÍû·à²û�F±×ƒz1A­”ÅÇ·ŽþòÒ3Eð`§ïdý-æÀßÕî÷+õÞg¾¾À¿/B2�yÈBÖW^¶oÌ¥ŽÑ®8ÌåíßݰI»Ð“ìó™ÌÒÛš�˜-sZã•'w~&v°5Vä¬ÜŸvA•Ëv<°把Xê'#Ñ•ûFo±ÂfN¡ï“ƒï©-õƒØt<.ø·Í8}•º¼(¤ZÓñ¨WÎᢛϣ\�L9-‡ �D†Œt®:e²‚hîdFuh1ßcÝu˜ƱՖk›­Æ¹£!ˆi‡ªPD )bél,‰à»öû.ìKêÕR¢W™$U0`ÖÂׇeß§ÍàÙ÷†lW -³gÝÈçX­ÆuR0bªÕØüöKtñê$lùMÂÍšef>#‹ø³Ç¿Dë\ÁŒS`ø¨Î�%óñ ù»ñí�g-e× Î‡A�¹òq#..üÁnLh)ÞÚ0ÙAôÿ+=²êæåñÜ)w²ó™·Ã¨»ˆ_o§µŸR(tìüL›îÀòÇD8ò•vZ;èZò�8NíãÀ q”Ï–{(äIN¾I’-1â$¤x ‰ðIìz_Væv9£í&�yw-£7£IiY>#U'øpÙð1Ö˜Hß$‘݉:§qe‰®©²:”箪[¼ÁÀó¸ GZN/]õ(Š> `=Ã_›2¡Ž,„+»»Í™6ócuÁnúÖT:ÏkeÐ:ÜS¥�j5jý³Ú­òØÇÚÖÞ¤¶ð5»$é® ÌkÄ4\ÎN/\�%QÙàN.±×è˜aû†Öƒñ¯ƒéag[M&9¶¤º˜!Gê}@—îUv œ¶7ü\¿B]ê�`ɘ`1“Þõup…YTéZÁrV§J �!Åá9ñjçk^?XTTÇò—6_ †Šo¨ ùºgÕ·wò_¬—óê0˜[¨9µÞ¬<Ê�l9æËzá!o¸tðºÊL¼÷Ÿn‘µÐø[©Sk\ˆ.w¢É¨6[±ÚÄÁºÅ¸¹W8i`rùØ“)w¯´³Îå“\jš2ÂYççö$ƒbÕÏ”ý}ù[ !Ð{ø²ÞŒ ü('Üx%íâÀVt)8^Do*5�ºt—o�é«—ˆ¤­:Ö´Ù&ǃ(�§O¹)Å@4Þ+î÷@Ü V–Ìn *vêD9¸ ¨3gVpíì®Ö/ß´Ú#ðÕ’×�¢Õ×�²NJnÛHÊi†ÎUŒ^‹6H%k=s¾;ªûf«õ–~ÆQ_ƒ™ß`­+bGe+z%ÜïñüJç®áä0Çt–ܽ۰ôTù<ÑqßM 2Zvƒ�— ^ÉÙ8ÿ+´¿ØÐó= >OQ~Ñ»ûïÊŸ·}~}gPåã×w ñyâChœ}½ÏÑpG{;™ÆP $&›ëÁô{дý×ÉZƒ$=MëÇ�ÆcS *g¼¶…–ÙP|H`Z4©ßè$jѪ‡ [ýžw�²²´þ«sá -lÚψž­�# ¤µ,A´c ˜/îOÉSŠšÎ^+“º0äòïmJŠŠZöT‰”ŠÅ’¡&ßg#ú¿ª*#;ÔYÝRK˜tH¦'H ‡eÊ!„ ‹–æ´–&Z"lîúóAI�nPpZ¦\ß~ïémq‡ �€Ïɾð\7¹à…ézu^Ù\-ÍÝþãýk‰Çí¶öå‚»œ_é#4PóÌje܈R•é5�Ú™1ÿ-�É&+pØ�ÔÍáñZ³”=I°'+IÜÛÝú¬½QlD±ÕÜ¢zS/¤3ëµ½¾QŽX=b¼‰úx¶Ï*BL—_‹<l«apÓìÁvúäF�ÂAj¾ÅÙTj9 ÷‹cÜrøË£9 wÅ^Ié%¬M¨WžUDºý>]5Ð3U¿À¾€«F™oޤcé=žáo`)åíÝÕfRÂk¸@½• ÐÍÔ”ªÑÉ5>“ Åõå À»Æ»È_dz : ƒŸ½Û_†heíá¬~œ Rüv¡žÚ�ƒêåÐW5÷Ø_…|þœf“2Š¿Töi“Õžp ­Ö±ƒfç�'Ú «Aíˆr º;qÜßãf°ŠP¨ë%8…T¹MÉãÃb_¨ßÂó£a Ú�ÀÛ¿ á^ãx ¨ÛÀ^@?ÞÖ›¨9 =†ãã¤PM¬kùÚá›éþñ ®AD7Ö`íhª?N>òÂO¹B\Û+`4žß+;úÖpeé$ëlÞžn GAb9ë+2 /r¥�/3}Òä7À9Ñ.ÛQ,1f°fÈFê-'ÑÈÄÝóS—»Ž\4%™}GÝvó¬2Ûŧ·½³€Z­Œîr ÿ¶öÎ "g¬(›e[A·è80@íÁx,©Þ•pùé½HfN2Ö›ÍL–討y›�¬q^\ºàz8›ÀÅ÷*ÑÔå1… ;a¦¥Û�j·oɰ8PiBƒF×zøìùY‰62ÄÒ�):E™òæ6£cE·íÅv·„’! VQvÌ¥£\á˜�€Gw§×éšß&dS÷˯gÔþ Êx·Æø| öô× -~M:a*;ø�v³ŠƒýqêÉëµÒkßhNÓk)ã§õÏ}^c·ß#5 ]ä~ãBÖlùÍ3%æ3½~Q1¨Ã`æ‚ù N}7ï¥ô:yPõŒók…Äüæzõûó@7B3…a Cš-ÀM¨ù{“‘þ´êô‡@i/ÅÜË‚dâÞ¡°}-÷œ}m´¶ˆò×ÔY¯˜&'°š-¼)@R 20–× WæD¦êÀÝR®¦ÂX€®æ­cÇqqkÊð{¡Åø;2€€Þ=äŸyk•›…ëû?‹’{Smã;E„áÀGÆ¡€o²Áõ›ºm6˜W/4Ó—pVaÙ_r—±õÎà%°�f{y”² †J�&ò¸ ¶ �Jd¬<q/PúªùϚ̀­4ÑY®Ã¤“Pq@÷´Â¹PÒß}î6áZÔ?+äLÚîÊÉ�>ºàc²+½¸9ÑQ(û ÍíöÚy·�l;m.j>ÁD¾9³¹S”çŸJátÖy¿|ˆ €KÆæ5À¹Ä$½»MÜðIn‰qv>·Ôé†w“+\àq†±X±8³|÷¿¤ ¡CKZU4ÏS!¬ô6„�öûTdÝŒ>[nˆ/*F.û£å}5¼ÊÚ½ÊçPÑÖÚZˆu.’#‰ÁKèmæb�üWÝJ•¾©uU×Å»_�êØÜ›õº ÇÆÒnl—h}Šaò¹¥¸q6ºd ;°lù�Ü)ƒ% пµrº5-zNÑË<öŒ-­sÍÝ}–}»at °)©Õš‡|u}³V•Mg]ž%lB�ö R�vÎë¨�yÃi®:°þXD\‰ª€WƒlÜ@ÃŽAWÅvPqJwŸ×�¼‚];/¬Õ“ _ ÎNvzdT>‘ø!Ô¹QÉ|ç-|\L‰ ¢Ã#I‡ž¿}Ìuó]k[å¥Þ[ÅßëkÍ#%pKž”©ü"õ˜økήëΰéá^jÁ~©IáC'˜lYýàêïÉÖ1w]£n<홄U}5þ©Ì!=0\Aå䔌2¯}´ËF²ßi–=ÝŸ˜‡3Ú²¯·ÃóyV^ éI:z¶ÁiY·÷SSÜÏ*‚¦óz:l[Xë}—›*6¿MÕy9Hϯ½b=Ðf±ôù6²(‹é-†‡|†È´U~Î� Œø÷– ˮŸÍV)ª+Rû¼”É6¦¶Èa”ð×Kͯž~rÄ ¼ã]—jï´õ\õbïó  œ0¨$�¨íî'áÑ´$0eïnŸO@Òz7U\µŒñ“ D¥Rßä05£P‹zÀ®‚ÛAê¾P!û=ì×È» õ¯ 6ýæ‡L^‘‡iP¯ �î6ôÊØâkÔ¾ÛæÖ²Žñú²F%={÷€øŽù!Ø´89Ž¡IR-£¹0Vkó‘gce.Br=œí…Junê`SSÅ>7ì÷xwÍ_C_±b‹ã>… ¾gy„‡äŽÃëyŒÑ5 塚±dߥ{6…¾±ü±föÎb0*²[h@«ŒQÓ€œ÷²äÙÇm|lîš®]þ ÂÌM,ÉÒÆOæçéÎÜÒ /‰°÷^»¼¸íí ;=ãaò§BðréÔ…RäaqqáÕÔý‚œU>$Yói)‚²_I}µ1★u€ì€fä—ZÅ&>©åsæ-ÎÛ:ŠúgwYÈO‡q�ùŠâd4Ô»ç>æŽFpDãªÝ¶yèás�Ó�¸4ïÕxÇI bÕøK›\Ú“;¯_öohÊŽ‚[Ò¬¯>Ï¿[ ǵÁÄb“ô¤VF«×^úËìMÇ­åM¨¸Ú[ÔDŽšv xŒ½aüÁV?yæ<Ì-öÊ?§ÊnDüþÎJAEg£ïˆðoûáêÝ™Ð@[Ÿ ¡þ·Õ¬ÃßU®eä ´ŠYJ‹Šåóea}s”6ÜÙÜÛžhv㮽d{G�ÝÚéËq‘6.�¹rúÓâ´¢‚ß‹ܶ~=­›·ï|–Þëei>ŒxOC�–ê˜/„&zã‹]èÆrk‰¾ôÃaXmÉ+à™êȰË�f^ú{úȶ €”Ã#òÛÒUží3Ú,ÌXx�QdÄð1¤­°·[¥£zÒ:=í:ÐT6•àNëÀçz\L.'Â9;†Ó³èÌ{id�#!¦´(B[´?MSúÖ¼oõƒy]H¾èþÑð2“j2àÍ\N.lÄ":&×ôSöûß3e ½"Ø�⌗ æÜ ˜ü*kÄ2ß8ºbo™‘Š4 Ä/²móyŸu5‰Zž�nC±Bàšµe‰'|eK÷…iäjX+8 {…ï´iïð=äÙF´›'¿ªdjK_ž¿¥oYÙŠqWq'`Œ¾Ä@¹íüzë69>E�Ò£  .¶jÔäZÜ=){§d&²Î\n&?®¯�Å‘@d+øï»fPÌ8Ót ôÊÐDD_oñ×&5ì;_�ªC:< ïÚü±¿rQë »ö¹¢•�,ËN Ô†ÿ][ gùÏ׿+Þöó«ÞŒŽ´Ö³^ýÞj÷;9õlÀKØÐ±Ž’Àÿfþ¹î.(Áí „kI1°HkÑ)ÜÑ D ³U:€`L$±½ñ…܇ØcEÑÛé? j|ÂSá#¬Ýω e’ú ïAaÇ—¤Zýx#Ä_ J»;r‡&·0Ue9»ÝE9½Yµ]Ú…lFÝìð8¬&-œëˆVáO ìç—ª‚§^ÕºÖAð9h!²{òd7t=+ܧ÷8p¬Þ,]€ø>6> î�}üØ"hF«!í{ÈÐ\-^â²#çŽ)ÞõâÝO”ËF…Ï`AíäJöZ¨Þ�«8ýoú‡ZÔÈÆ<G§ãïoû(Ôza¤ÀÖ3æ€âòÚÆ xÄÅè.ŠÊ[bºƒ?=QÙm“·9vÇó3QŽª^q\¼ £ž”±÷›Ñ³ÔÆÉTª4Ê[›ÅÔËMi°B6cÙä—ú4MÙðªàŽürü. $¡ˆêz25+FîÒ,aí)e•¸ &ºU²äl½0NÚ¶À 5ªyên™FÈתŒ¥ÜÛü®;"WSæÌÃsÚÊ÷„”©�hà ¯³{°×§VLô½ù>™ê«u_t­Ÿ‚ k¼ûŸGBº­\öý­&BZ‰“^õ±P+oÃgC mZ-ö/yzëßÎûð–à=V°ê/·n€½k+?ž Eà”¢½Ã×êsž�ogŸ¸žb»}–�%ƆJ¶â`F=D Ëà?¢™z?r3ÝBæ›%¬†my®8%íHÉœs~Æe�0;.šjúX9_Ò•@e[ÈÐ/ZáŠ*7•±Li0桾õ­pÌLÌ}’GÙ=>uµVx60wGqa¯Vï×z"’Kc!­ `õRB%ÌMÞÖi°œmcÓ‘³˜Rå7¤m1.o„¿Þ¾%\1ãK�YÃ=ÒÀE�ðÛ;PÑþ¨6 @倂ƒ;-øºlx¥Þç„ ­ìÜ�ªÍ›²Ó©Ÿ©â—¼ÍözÝ~ýø 0À6ã<Ð"ÿ£ºÃïXÄ~~³W7·~á$Tn�`9Áüœö�¶@QÎC—:$”?%%)œÑÏ.«%;ª«ÞÊ q&å]v€·–¾2œ`±Eæµ4³£XýG”93èêNÉ,#|Q¥ÁÄ’Âq™Ö‚oÌöÏY^ªE>t[F)%¯2º¦+ØkÆ ÂßRð¢VÝoŒìKž�"´)ç¹lç4AK‡¹dP‡ ÝÝWDÅO^ÒPåý$�9c²ìÈ+!~T®.Y„8³HÅÒ5¬m¡FëÛg²”Q�.âQ%d¤‰ › •ÅàDÇbµÈ{cu½lÃ5®Om«ð FÚÉ-YÃ`.dã#ïV=UZýí²[4Ý‚Q¥³ósûnzÌÖ-ƒlЩ�³c^.±+ÊlknNYk80âbªEð¨llb7Ú&M)ñU¶i¨‘.¤u̯b1Ö1(Çoi©Üþ>Ÿ1ê}ªÁ€Ú‡´î¸•ké›6·2œ Ö�U�ÒI/¢;n=ºÖ•†&ï~SD%LQ¥ùhQ>=àÇöè".µèuF±å7~^î¢*’BƒW½=ç­Þ³­®öb ˜¥¾URÕÓÒ†;kä™gw+’2â]èh‹}f9Ãáèò–µ¨i®„BY«w `@bqÛqËgÓÝÕõ¾tV¤€BÖâ%ÖÌ5‡�ºg–NÐáÖNÛÚ¶[N—Öñ�›ë $ã/·Ë ]�uëäx¯ËFÏ8�bÛîŒ6fß~Xȃ½ÜÓ­í·Ëë.y@ª Ÿ”îÐZÂÖÝâNì³É“uV9ïNIø’e¾ˆ.õ—0+¼á˜ìèø†ÁÓ\�°ëøþÙU ‘›hL¸ñˆy7s%ƒ)<èÞor£ç �ê|XƒH@Ø]·@ÝL ÃÉδíu9éònŽêgt–~AjÌâ�%1oSú°©øö§[,Aœu«Eî–Œç]”µ9SY0#ˆþ�£7ß�-ÃèÔÛÑ> °uߌ¢ªk Ø—b^ “ŒR¾‹AIÐó{‡«Òâi(ƒûÖÅ…‚ôåúr_ @9"©Á Ú4wþáÕ`š(°ÿ«Dšjùì…”W:]}x@³·åƒ±®A¡ÿšÿÄÀP¡ÈúÚÊ/ÐjlyÙÖÀáYo|‘ªe±lÞNês7êtêm]¢…¼´E†1³PÑÖH-À& ÓKÒ‰cƪè9ãm¨Ðjá~m®q¼�¬nš:Vº²Ü/Œ=×J2 ŽI¿ÿñdoš+³<ßµ„�˜Ù”Æ*ãÞ ±Hmoûäö‡"e±Ÿt«qVÉB9P)¡¬¢�ø†¯ÛÌ4Á�r“¼´�¼Ã‘Û;ïYo;Óîד’š:4�4V¿=í[maÛOVòb�‹…ÃBƒãë]�j€¢Ï»D߮ڎ�õfÇh�ü˜ç!µU…ÿ~K2—oS¯Z„%¹Ü†Ú hY–æÅè\Ó,‘Z¡©’äWKŸSKr)mÖž:;Ùb^P#)üp`ô$ÔÕòvÓÏÆ`I霑Z#ŒU½ƒ8Øý À<š3€¥]zì„JN÷æT„ñ6™Ú4/&ÚÆ�ò´ÉÆÍÁouÓG2ž>IFá¬!Âò2pïÿ/?ÝFsía“X·äÒôf�¬Ó|6×R½§çp_PÞ]µ•ÕßÂjÌpsd­-þà0G¤ÊÊÖª»AyÉ ³°Õ9ŠèW@z÷w=Ç?(éyYw’ ú/Y*û|ËÆ£XÐX®½®=èu:ç”—íìÅnÙ/‘lׯÏt…ø²œ+—†n@b’ò�§œ/A«4ä W8åfSƒãHÂm4õã |g3#ÙŠdG\Khö O‡Ò¢åÑèTU‹rèÅ-ÒOW«‹ÖòÏ -ÉŽ@Wßr~›ðÖòÖ2Á ì5«ñr{(�*Ì™)÷O±]Û;Ê75�#6øyK6Q§-…ÀÚ¥Ô Y03SØæù´2ý’Û¡b.á,WðBL±;fœÑ>‡YU¼,ÖõÀ„k¼>ª6Ô6ÏÒKØ é›´Â†3x}ø¯­�:’Lqqº”^Ù+1Q0 Á¿¯ºu”Ћõê3e�PàæÔïíê$³Ÿ½1™a ”ö¼ÙS¯Yµ_O2}ZÍVtVUq—O¬ª‚س͎‰™«îRSUœV®¢‰ýcÑMrn…#ˆoxì6ú›aH z,ocZÅ·”³¤î3ž[röa+A+ƒ2 5Ò0o¥�:ô®8 @ïp¯ÕôGfºÇ¨^M³äƒöCqÆ÷^ôæ¦þüŒ|€�Æé‰¸¹“^å�–~•Áé“Üó‚éxAe¹¹óf (�êÉë€:Ì �¢J銠�Ãa–Éc8�[0ÕJ3–·{„‹™xc÷oäè­áÊzœ¬”D9‘ÝÚ }£èînVìK²f×JC¶Àgq;B&³­Ã?'Â?IµgA–�Cg�úÒÞ3[ñ Q‹–›¯>déèéÂνÇ`Ò� GlûGŽ=º|ìC›wnr†èúu\ñ¸Qk‚u×säTü¡�ôî§Šû×ùÃ/¿ûèÅLùºÁ�¥ÈJ6(ÊŒVͳxÃf­©™|„X‡�\°]ùSî̓Wæ!±èÎy •¡…‡RGE]úq¸,ÀW‡ÕvÄÖí}h1 ÅÑEØ3òµ2Ò^ÆÆs†´Aas´„’Nœ,fö’ýK žh¾¾î«ò˜Ø¦†lHû—En>Øp�xòÚ 7ZÁ…RÑ–C ô•ž@«Ns²è\$ÆüLlh e Ñcž?ûƒ?qÆgô放~×ëbûÇ hL¥jeÇ x_$'¦@ÉqÌ8ï:Ê·ëP:áÓ'ÄZeöpRé‚×ÁõøC‡·” s™\µS“1/½è†™–y?Q4¨w´96Øå®‰6X• êÖÌeÏ©[zcHç sWèoùsï®Æñ’«¸0{쇋U+˜†Užx{dËo":Pè÷„ 9Ω¬ ÎU¶)…®¯>Y°~³ãÞTñJ>ÒOޏ�Ÿ«�Á­Ç\f&À-Ð ç<Øõ­¬}Ëü?¶µ®è2Á`ç=òüÎlÒÙÃg‹hìjj·Ím¶Ê¯¡Œ� £1 ç¥SôêìëÆ(ÜäŠç_%GDì?]„k÷Ù ‡´¶é”û“ ¥)ÂaÛ[À»=ÕO ‹µ©˜šØr™>Åõôý¹6@;ƒÆ°êÚLUö�<׳Æò˜lÕžèÝfK#,C€µÂÕ)D‡œjÉ‘ù8Šë?b‡¡'*±žzÄÏó6»¹+"[×Ãp§yÝØšt=¡7°êõ‡¾³º“ «a€’!²ÇØ¿Æú¬3ß’X��8ùwÛŽ7Ùh„„t–—h+Câ�‘'3ŒZmÖy©s⪇0È¢çö1àÚ9qˆ2‚NÛöûÛµÐZ‡¹ÆX^?­fû÷2cØê'؈ƒO�ûð1Õe�몃Öf÷+5}údù7 Ò·iöÓ7^“¾4�@äÖý¥ Òc_fÑk�ßž>p7ÐEzÒAmÀP;r;7²m`#£Ê²« ÎÇíaÕ ‡Ú Ó]¬e~á™Hpâ#Ó}t),®‹€…ß/P¸íÆþê±€¤0¢js4À™ÝÍI‹¬yÖ´ äxל-‹róO6�É5zY3C®ÈMÖóíÜÞµh¸3÷OnàÐsA‹;£…<Šì‹eø¢Çuy*Ê(×ßaÍIVíûÔRhï�j!R0R@P�|Ðn«·Ét ]øÎX ÕN0ΜÝá‹ÆÈࣣ*¹�Óí“JT3dÑÀ·jŸ«ëXPNÅ|‘iqw†�éÞWÓcŠ&¼kz|y,+ÚÖÿ‘ö.Öm=KßÑz>D DÝcù`~ÛQ½¹L #kÔ+b‹|ˆ“9$ªJ¢¯hïlf‰¿¢�ͺ+í 6HC›Í@Â|Jx¥É ï)IXþ±}PÈ]†lú³`AÝÀð…¿ê Ö~«žñQ|g­À¶ñv˘`õµÏ»ü±«M¶ýŠý°Ø»ÆÏµ&]ÂÕgp©:è’ì7Í$gUÁOÂÍÔ˜ÕçèB�;¬åÎö©ÛeÔò–Ð)bçý4°ÌðZÃÛ¸Q—Ö—÷•_4ÖOÄYü¹ßQÐ� [4]KPS‚R§¸”Êt츾ñŠï5lN³‡"%kF”nL[…³ê#L‘È·\×b›[É·e÷aéï¼Ä$7[< ‰ ›dt›ê’ÐÞ²øŠŒudm]·®ûmi ÏyìràøCˆk*³v]ƒÂ&oŽS}÷NÁÄûn8wW Ê¿~|ß*§Ñ›d2ÌVXå^˜Üs¼Qè¶oª3õl‹‹*„ ™Wˆ8×Ò*�-ƒ.Y¥Öêèîœ:V²go% PL¹]ô˜>AÔ‚ÒÙtYÄI¤¥øÍb§Q‚Ÿ&· G·¶l0&¾ãâ¨`"Ćc¾d /�³À\ �Ã÷[á ,êZ g¤V0Îj^8e +´¾ƒL. €Ì4g.T¶ ÐW"ïP\;Þµ£aŒæ¨¾XyÃnáÌØNͳÅð% ß›>æ`[“Ì©]Æ-X ½êâ·–³=5]bƒê ­äÀÐ+³¿[Ìì´ˆ–µwzx<+|�DŸ´‡ÖñЫ©¬ÉlPó#1¿Z1#ZÅw²7\q_¡’ÇòÉñûçéEÀ7EO} j,ÆØdõ<ôŸ–õ%£[U"ƒ«� A@à';ç×UàªN/Œ[ÛÎ8?\Æx ¼V~ œSí»E뻿iä2Žª ãQ5\_åW¾¯‚$Êm¼�©]ô5é[<½Ðˆ2¾Ÿ÷ìÐÅr›·áÐÔ1Åäl/ä²Į̂­z´�—…@êÆ”z–*÷%ȺÒ?-­¹ w8æ‚nL<¤'mÑ3ÚH>Þx=î8˜ÊR%‰G”s�?ëÉ ]»©}ÝŒ01¤ QW¼æÕ¶>„þ~ÅgM 2jAĬ˜d£\FÅ›é ¯Õš»·÷(ÐÚlÂbÔ(axU‹¤[P€²5�æÝ%FñÜR$ %BbÆòÇöBË6Ƭlñ÷R è Ö9l�ï0Ì—Wï^÷.^¾€/,1ÃW K¶Ðæ>å¬#»·Óæ5);²ÛGƧ˜¾9I|ûÇbes@ . qWÐîÆ¹Ð»3|ðÓ¹ç ØsÃçà÷ƒߌ€ÛKp ²0öFõ\-=tB ‡Ù[ø e‡Â|pu|fÚÕÂr+ j˜[%_�ŠD|…§×†ªâɇhlŸÇ°Ô �IeW®Ã~ʨŠF)éSšF%ìêùqüúÇ/WlÙÁ†ðl�è·3Ê Œæ.TIU¼Â…�0ôöð;fU;—Û^¨ßrO‹cÜÏ L7'Ü8-ÅA<åé|…Þúr@϶ؠN®»Ûfz� ’Ô5Ù¶¨Ãr 09<Ó6¹…�=1]Àj.`çÔ’QÆ-¼õâ_– ^ʃQxYý!ËIÕ›ðe•p;`Pdw»G¹µ7;ÎéÍ%µe»Éˆ°†g=`=$t�õÊT3u6MFfK\²wÐ>×IWdÑÜ Àù0ÐãUYë'4ýÁ^éL%°§GÄÖîÆƒ|ÞÌ[f>s2w²–æ&ð( .LÅG5)ƒ.ªÒdHw�:/Tò×ñ#ÍT�æúT´Ïˆ¥+,YI‘ɘD£ Ósky[°Æç˜‡{Ñ>B6ÖB]§|x‚˜pRÞ‡Cök—ë3þ´rßdÖ.GÎp[¼¸´ø,›+D¡þ®T,èW‡Ÿ¨o…F`ÕrØ«2G³�ÜÏ.Ø'Ž®•F0ç5½6©{ÄñµÎ„'Ñ ÌÀc.�»ù&ßD+ô�ðÞ·¸eGF¿%9Jó‹âôù¨qíãL<8÷8�Ï‚k8 ïëø¿FÒ±Áád%‘p0ÀÞ+årþ‰YLÏ�öfͲ`¦f.7Œ8�%&Q5gé¸�QSEÄÚòs‹‚[3m¼>�žv§¶ô®Ø|‘¿YÚøøµÒÓû—Ç× l ¯×[Ž£3æX�ƒ›vÁ†ÞýÒÂuoj … g©S�ÈÞ“ ‚‘±ÖnL6 Ÿf~@·/‘<�³ÏB�'ÁzVÖw’ßÊD“}u)K/xë3ÖògÉ*ÝÈTÉÉ„U;ö¶DûÏg}¼¦ïŒäî‚ô—)+6îâ©2žg[€É6:¤ãžOw�a­æªÝµ µ…z³b"Û×’lºÞ©×”ËNÅËwTíËàVþŠ[ÅÇeÒä �aµÝäak‹ÞòP3ïY°eByÄPäÂ{„êËÝn¿9Xóm�Þ J2û…YÄ Æ1›|�ß­lÍ?†ÇtÕs¦—tÜNñ’k|ÀâÒ™YÆþÅü·k… ßYa{XÖÉz雇ä·}ÝùÝ|ë'JñÃè …ñK½O•‘¬³‡‰„wwK� ãá„Å­…ÂÚýlíÊß÷[�¨¸ˆ”|·à>òá1Ò ^ÁÜ2÷ ’ÂçFe� ³æID ÂF‹ÈÙ9"i/ÆHvÕñj,òÊ6°ÏGš\9ÄCk«<2&f6Q£Uë³qJq“Æ£Dž97€™4� #­P1È\ÐÙWb  œ£ÿH82€Aç|#£lð_³eUÙŠ?„kƒ…oÒßw׳ò·"¢ÿymˆgl& 6 ƒâsE ÖÏ/{€Ê=V%`VŸq¦êy—%”ŽÅVCíûg‚´Â&h7žÔ›Ò_w¶Q‘/©•¡.¤ dÒ,8º ™ÅÊ3¶ÉC£µ ÃU JóGv4EalïD`Àséðî·ùðne‰É�IarZ¶¨Ò™¼K`,öSzé/Uê”\¾ìý/E+„a­!³æE‚™×¥Õ†-²š´î k,:�tÚ)Ž#ÛfʯÍA²ÃÔ%vÒ#j󇡗Åïkô|š:GÆ¡.jš\é Àšý€|bBêz±ñMŽBÊ:±µU[ ·¨¸[ov.xh7à ,üɯ7šè½€ñ+qÖJ¯Ý0¼†TšO1‡£µ= H@ÎBÒŽFÑ;ÎÑnl!©«nÎŽV‘h,$ÆÐ‚™`+LOIŽõ¦Õ›æÊÅ”-ÎNNDxÅ‚L£:©Sª'6æMzFäu™9ÜÇÙÍ]‡Õ‰¯“#ë\ Ãý �Fº®7í_¢jý"‚ )ý{yï)Ë ügHÐG×%þ´jç8&/ ôš8ôïm ¨ló\p×uœÞ±À"¼ îpú[ΔLÉgä®»½QêW)¤‰�ªÇÁ6¼šä„4¨z$1Ú¸š¹�Â'!“Z } ¥¸áØÀí|E²މZVÔ"¦­8g¢¼Ød0²OqüÀöʺ3ƒMiÕô æÜijJ½É¦ØÄù@õùœÜj”™HÙÔl�ÂZû4™ü)Û†Y¿² {Ë«©vñÒ\rÑL»sîׄI¦®NEœŽÖÐ+#7@�ÿ5œ1Ðe¦Ÿ@wJäÀq{lÀ®jŽ'åÓ5ÀÜ#PÆÐ1°l„È:ÑÅÛ”×$ÇvþhE`¿Aw«Ë&�v�ÓÚà‚6z?*œ�8¹Å¯ã€ ¹H‚Wޱ˜Ø䃔ëKïÂ[¸ïRéV$?\-ž· sío?Ë—;8›”bß³'l9brWsEMGƒÚú‘½=Ó ZéÅbÆmvA>¦þº¥�Kã qGŸ†ŠV¥{ž:¼b5Ìf¼_f&].Äg¯d­X? µuøâZÝ€8Dš–Jél‘{Î[R]Æ‚nYjŒ(#Z+—Ò”¡å]«&–ÓK»lÜ�Äá¾›*íÍý`'N%ªø'G¶sþgmǶs<1 \�&Ô€¦‹Ú,R¼Oš¡YŸ¨�º /Í,Ö �]tT®–¿ÖdÃ"pì&çkv´žÍójné.·-˜lZ‡t ¶œ¸„� Úä[ÖRNÄ?šÃÇìÙº ìå_ØM.§X$®t¹eO&¿HGì˜?…Sh€Ÿ›½'T°'‹um1Õ·%¤ Îä7Yz؆+…­rë¼9=ìáƒÍl9›nO|õrž] «)QÌu¥Ž�’<§gK3¬¿?Eã[ï`"ÃZÝ«¼f&aBjՙΐ¢ÂÞVÌú„!Î!Y"ö 2Ýå [¿T|,@IÀ_‡ŒI…FîŽãrã8²š¥œN 3Ê�´¾öæÄ.¼³qs’ Ã{„ìÆEmÆîM0±„QÀ=‡Í㘯tÝØ/>‹¾;»øL4ÅHÃr¼/�¤ÛÉj£º……§ÈŽ“‘ASº ¢ º’F[…[`¨KÛ\$çl“”0¥ smO)†5ÓÀ4�Nö˜wß©³º›#¼&¢ÐA«F]¢¨$:€¼†$ô%Ä}Õ3em½.öÝõ› ƒ­Í«£¡µN9·¯th�I¥ê‹èl¹XÛ ¯ˆª û:ˆ! b·Zí¢|½ˆÅô!¼ÐKänùFý,±÷´âÛÈj.üûŽÊHSC'x»ddM8‹)w)FÓ�0¡™)$�Þ’{yÍ ‡¾ðù)xÔæší³(÷h#vì•’ø=”nÐ=²˜×\(ËŸk—ÖÑÐ>üD´¦=úD³XwU"%pöþq¸Ì>Nià\Ò®vŒ]pæê]*×qjóo!èkf¼¸[ž7„Å3á´¦òJ©¼®!{,D¯Žµ«(ç¡IKp�#̰‘«;¹�ÇY¯ÀÈ¢ÜÙ�ØÒ"ø voŠï;‰Ãl v)^óËÎÞCŮ²à!ZgLœøÕ5ûJÞ¶%Â÷^YˆTG¤{í‹#nÚÔËYÚžûؾh|–ÅX’;“ˆ³ÃjÏ|ÓzÛUká+ÎTþ „¾¸á�&üu£EK6ð4¡1°a“PÖ»ìU»¢µ•�qälÆžñ>Ž[ÍiüálÏ•Kð¥¼:§°Ù}L£øu¨Z*…5…Шâ ÛKZ,Ïë.ÄsÞ†ØêüLj¸õÝ`Úƒ‚I´äs8™ýí/’¼n7WÄ›%ŽÑãàРøõŽbÐ+¹¡#>Úp6Òð•—6@SéÍâQ+«eáVEt„ãÛï1G�ÐjáË éðyò£‹=Õ±L�˜Àùq†åî7š Ÿ%_£:ÿ«Rã)uËÆ•æ‘­Þæ´½Âß79ÒƒªKÝâÔ”°à § ˜qÑo |"�ü`ƯÊW×/XxKÜ3Y¼²�ŠèX,×ëhö}ãk%PLžÍ‡,Œ�p³†. ûΫ<ûWdFCFðe*+ݬœCٗ٪ �|¯¢p$~䟱ÎäÁ3xµý‡©Æd7—@[ˆÀW½†LÐd”b�]r±þÁްÙBüî©ØšÚ½�ØC”šŽèä¥w7®()¡ÂÁðGlþÙ«ìµÑLàå«Z »4Qb5�òرZs@ÎF„C-Ê"FI…ƒW ØÚŸÍd-×vL\[•I)FÜæOFL²mÓ–{‘ÎoÆÓG~‹‡<}‚Fø}*øú•’¤Ù‰ñuE%ÂS3áëÆ•†që.[ÚÓÛ»4;ÓÕYì7´ÔÚÖ‚ú | «»bÈOÎ¥û@Å<€@|pëx‡B­hâRÏÑØ“As·L¿Î9Ø85žäÙ^ y+Ò]†› ¢ùMÁ8%ç8ø—ÝN>Òõᤣ³» ¶[Þ1}›^‘+D Dã‹øð™úu8¸Ì¶Z‚-0€{idJP… ²ìý½d5ÅØït÷N Aœ(ÖY‚جtî¸è›SŒ8Ž;�`ãÕÏjƒñâ/I—ébx¾õ^¹jÇͼ¨êþ²ñQ÷ 6)Þ˜lQ.i$aª+³½™C›PvF›åIáàëœ×9WíVÖÕË.‚hÎ YÄ�Êöâ+WÜó¨fÊ Ü¸C�F1[äû¯ÒGZgŽÉTõ‹Bè»T!yíëvíã^æ÷ãÒ“®J—”蜈/d6¨}ç�rÖZÃËç»å=Ihݦ/V"ìÝPPù×lž4‰ÌZ=^A„Â9k ÉâBœ—°ц½�‚ôiF)Û¦†ÖÕ£7}Ñ–ÙsƒzQIã÷\…Çk�W½HŽp¡¥@Ãw}Ö ÁT—Ù˜¼ÅÑ,ŒΜï{½Ôf&ûÊTV£½=®"uˆBméŸpá² £-ûƒl5±`G�@AĽ÷¥k�ÔsQ(©k Ø±{ u0)Ág«xnÓΪÚF˜û!j ëÂ¥m�*Ô_©ÔÎÏÜp¸&0„R^šT©´=Iuñ¸�‹£ßõºÚ½ÖBjú{>+fÏ/¼MT|Æe³Ÿk\I”‘èÙ@ÒµtM½Ö^‘V‰ãçSù½»èFÏ`âø�Cu|)JScë-u’מí÷^ g <²•›|°Z3Áfò¶üñ*Î¥mpýn(f›6_s¥ÊÕNEéy%˜—Å׬c×ßžÙÂað¿öòÅLڞ«n “{‡L*¹¡Ï(7*úY)ÃÖÄI"–ɘғ–Ý]9¢1M �óÆÈæe ÕLÃ>„Ɖخ!Xþd%£Ÿd–àe¹ c„ fL•Rþ’]<'ìŸSôÓc’{anMUÏnŽ£)æ0ÃóÜó€m€°r/øõ„ ÂQ˜UÍñAŒ¡ ¦!ãERÑÊ{îÝŸÛ7·T“ÖÃcE&¶©ûBç¬9dÝÃÛÅ�›®;ì¶t�¶äþ㎋w�CˆkæžXQƒ•Û%q²&/{þ-u"­¼1¥ÍC¤r–r]‰uÏL7?M•”=sÞ÷ÑùÛæ¨|7Rèª|·$~Ùj™Užcà;ŸÐ¶Ä°Ì>™²ÎËœä9qU2¥Â³.¾Ìk¥G½¡”@ÌÏnl/k‰k�Rt—¤A;_ol¼¨ÕÁË£fgûæ�—8«*Õí�ݦ`2йó=T{–`fz=BûwXŠálF�"¹\­b”` h&· ¯B!O'ø‡ë­ð㯑h¾p†\¼�ö‚Ûø®õîsRk- T\`t{=:µCß]TÜ«L_El®èÌë�––)°s‚Ö‘&öàKñëU‘ð„Eï›aÏk3�![vÝs¤øŸn$avM�PC�õ4ý ¹)òWëŸÖj%0rñjäÇÏn�û1mZùi~q,Šh7MuìX Ñ�ÅM¦��ÒëÈêK}À:®•zémïF}ëÖŸ϶i^öøÇnïy)óù‡9<±«fwÞ˜8àšešë½¡÷Ë/w»ì²h:ðg}-)ikv x)Ÿ`~Âò·jÔÄ3íï#œ²åô¹ì¶‹ÙÆÄÉ&Ex³„qæU6r1qÖ0"Ý�p& e´>Ïfg@Ëv]W!–½Ãu~ÒŒ~ ÖGb.;õë·FºÎ¥¾Ý—x¬ƒ ÑíC?Žw¶¸ÔWÇ”[OJŽ]ìxCynáÍ÷¼)>¥ú¿ÇÙ—.‘˜ÔóÝk¢-»ÂÞi潊‹4 n¶çWs3‹œê&¯éNjòÈe€3 ˆ›[Œ3‚2€…ìÀ[ô^5«ƒûÌ<¶aF…µr^æ”05@8Z]_È�á´ðÙ­9ЪÒ±µÈ­ÓBz`³±@&ûõûï‚–^:Å©^wÝPú>›÷®œ /‡Ÿœ¿.½%mVDñ’žsͺY1è§Ã4C’–z«™z¶>ÂUþ!è†^‘'QŠ*Fµ‰“b¢�@ÿl‚ƒÞ.÷’ …6¬ZûPÎq|ax;ÜA£¢�¬GTw9“HRÊí¼¹Ë‡w™×Îs�H@|üÓK¯&çk=ìèTÙð"Ð.í «¡�×¹¦t­fŠdÌ$ÎÏÛ8ÅÇrºÑ‚µ¦�*NÙ2ÁbâY#"XZè:$}U�Õ¬Ùpæ’²*� æÖ) © ÃëHƒ")9±m‹Ü¸ƒ‹º�ÏH�‹–" @3« ó™ï¢—‘­†Ï×ÏuÕÖíÂÚƒ9êVô{ܬæ•$h\885à ì Ô’Ùõ"ɸUÿ‚BÉË¡Œ•sš�n¦ŽNÔÄB0Ì@’ïÄŸqn^5 ÛFÚ½ªx¹ üv¶�ð¥ÕÔaDËHñ6\�üttè/®C¤t´„ͧãú¸*óV93µå?q×Þ5ñg;Ýœyi‘7LÖj´:ò„* 9†º·¥<¯øð=i"„L^ȉ@92È×9o%ëœÚT,UPFv£$¨ÓØ"§ýǃþ˪ ̓m¾+ß"|z8NÒXa2b[zèæÿÖØJÊ�¬×Þóþå´¬ö ±² {•��¦AˆF¸7–Ï0üѧò]­”ê¿ÄËxé,\F²s>ÕVñª„´V‘דư`Ñ=_‰5h÷ËÃ6-s`î$ÀšÕ$’òé/|é‹ò¯ä§ÈÙžÁ‘¼¶eyâ|£»p£Ik!ýÛ€ x¼1œ€}àZäîúweÈeÔE>-»Í”n`ŽQ›:Ié/>9ûŸR6ù{[õÝ«GW´Èäwvf!£ûž:lB]„·Å4Ég Ýž6ƒ2f{Žõ�Ùžm‘0ÁÜÌòcÀ,† DIÖœñåù�ûsd­7®ÏGq‡,§—Ì ÏÐ_ ~Toý¬(:Ź\rC³£ÞP:ž]ìA'í�æÀ²Ž˜ÖJµ'{·É§¿�ZÈï@ Ì^³�-sGžš^…É“Œ®“…qãT$NõÐÏWV ç{ê¿yÊão’<ðX ¨ 52à–üÅ »,á°ú;ˆYlˆq”�¡žý¯_±¤Ü(Ù‹!sS,¶�­íÐ&]^uà€Ó÷8›Ñìï$¤ûÏ–ókõ€ˆ5$μLmÑ—5= ÃÖÐïHé•#Mós$›êº‘¤àIÄõ7‰Ô )ŒXHlVáþEÕšùЗP�2D)H r|Í}½ÇuWø¿vš'¢Ë½–Ã1ŽïY¸xƒEË¥Q6þ0ËqÈ',•p3½d •Î>F,þbµ$å{õíòGšÛ饞. Eûª1»+®ØÎ‡j�.Mû—¨ß“¡â\QáÂ*-÷›P0% ¢ªø¿»¥BDsà_jJÜ"�3ûx§�»`"#ûú ¨ñÍÃL·�íÒÛt4 kèÃ;º;]eÁßù“~ÍóC\ƒÌ kR@vØFñ¹Ì3¡åš z¡üB›åáL4Aµ7ðÌ‘³Øðâä¾p®ZÈøÊ~J ‚/t¡‚Iˆì$*)ËF ¯A»dNúû�]Ü_ÍÝ".Ýq Ã\<Ù}>Ep»¾´€î#ËòÜ·âÆœ9mWt²œjd°›ÂBóêÌœ.Ü#�¬gÃàë¼ÇuÊ€­”†/¼6–áµÁÊŒu‘ ¦ôÕyÊŠ•×ï¼½¯¬»�X?ÞD €¼��ý¬˜Ù{€JMÌ6zàhQšmbqÕ™�ðß™»�×e�ió¯9hfðÚVw� †ÉáF�´‰÷@¡¨ßxs’ÉÖÇK¦@V\Yãz{Sfö˶In˜]¼ß XÁ2é�§8³m²�IpÁoöibœ–ÖI\à%nêë‡ø!Óe'™+©ñ„ÃcÏ'µSçÊfÝÚàˆnEÀôOOP�"=]*E+}&¨#·°²ÉÞ‘lO£†vÍùí2D‰Â´­)E¤¼›àî<º}¢ZÒy䯻*g�JºÅ•…MÍ›¦¢À7¢4ð±Ê§XÞ; "ããÊäòŸ˜F½’úñÙÐÌswàªcÒkbŠÙ©·¯™ãXJñV?_[ÙyÅ+D×äOÇ�È<>ìÉó–õƒ#�Ï2n·ÕÔSA¿�í8ygrËöð¸L¶íéÇqºÿb�ªa$ȃ>ã—‡<ª�½iˆéÈàS¥ù·¡Ä¥�4/û·ÖuT©k®�IKñðŽÙ4&F1Šõº:¸¸F*í°­U†( Êÿ– Ÿ¿¬ ‰îŠÝ†˜%ůéë<:Üäl ¼~ …`§”d$Õ^ö§�`Ü“WBl”­±ƒ‚Læ U‰¢ýbx ®si¯áhý w¶ n¾w ÚÑ�"ŒK†«‡�ù�¿ zάêÐÂl)ÿA9„V“Q‹Zô©¼õqŽþîƒìã8“¯�äÝ}¬¦ÞËÄ,<~× VÛ‰CW‰í|ò´É‡Îý„k�]>ß�Ó™ÖNCNà ~Z}�öÛE­¼†òˆbò–ñ“ :ô1Úbqm2o+/nËA�1^ÇÖÍ×;q9¢íû®Ù%†qFUˆw=t×]¸Œý4¼o‹6�COÌ„‰W¢Ô‡PzÀ‚R–옕!¡Noæ…Ü¢�õëó€ï�Þup,Ò;Fä*`÷­m�‘¾Ü3L¤�´t„9 0†öO šÃÈŒxÀö¦rðÀ¥}­ýF™JƒÄؤ_órÄg§‹«¸ îùH;¡�bnCã”î2œá­õÄ6HºiùÄ)"–‘w‡ 1\5tâš\h/wâÝx±«·p0­ÆùmÚ‚éÏyL0½g¶¸»!a,;½¡t^Þ0#"�lJ ƒ>Î<€NÞûÒýí sM«v¤¤€ªOó­ø¡¶#kK×£¸Pùtù/j],ß wÑáhõº¤4ò ]-s5Ï^)'j¼]óò¯&¼væKy{,¯ 1ý¶ä6 †:y{ã]x4°Y™�¯K’7€s ðµ ‡›¨Œ�¹Í³· ‚~wõt‡WÜf Øÿgw!Ê*~CZ[óÞ•÷ã/T½�ÖSÅœ… {´ÂÛ7é~¯.ªÏIp)ÛËØÀ^(¶Ué��aŒõN7Õ²Îùò¶„¢Ôæ;Ano{Oj�°ƒFXTÎ"wEårF¶Ïà8†fs›‹¯ .¬ÌúÈ>4Ân7 \ã•ðe‡e1glå�M!HAÁÍn%�WÊ$!|yFiýpE¾¨Ô>%¬?GŠÆÂbÄt Xo‡[¥Bà�#…¼t}¿ÈÕ”µ}Pžï dlo°\˜ÊbA‹JGü[B Æ©�k1uíbQO糆Ø�Q¢fÕˆw”šõ˨LÖ¡�NgdëžB‚Xjü+•©XĹB‘È sBaýÞñkËíÚøxMG”oÕ=ÙŠÚõÑ24¡Ö l�m„”áŸͤ�·‘[Y¬$3’hÝÑ W¨S7pzíú…[hØ3¿»€ãfž¢–�QZ Ž®T¾j”ªmešQ0þˆ‹r´8ì­jâ MÝr*ª�êJÊã£GyS�w—ñ­‚ ]Å2ƒ§ûõ€Uy€ùžÙTL±ès8|ea�¿oEœ]ùk/�ÒÌ%Oȱé¢`‚› “bUÓQa`“&ê§³¬|X;À5Âv÷ûòÓ´á�‚óÔFúòÄ©nã)}ä¡C,GMäÃH¯MU‚¶ä4¯¬m¥?Tn]3ŒäÛßw˜šæí��5÷/`ï‰Ú¢×Í–Ê®&¢ˆ²,EPÐ"H¹€l’Zy3ËΆ´L Fއ¤½cò ZX•)Q ÈÀÏ4$+øô`ÐKý`æ_Yô‹:ƒñ³¢Lb0ÄÜ%²&´P)`ÆÁ°ÊvÝDÎãA@8 páZ–ºÃ&Qý{a’¡°ØÁaÔ3¿sªâm•Ýu¶Ä¡åöÌ`¯Ø™Ùò ìèé;œŠÄ üìd»}b¾¹Ì\w¦mŸÀ…Þ‘êÃq™o˜9&¦íÄäaÕ³öªD1Ÿ•�›¥¼ñVû<^ ÷·y·m��…3'ð®0z—f…rGü\�öê˜�~s‰BÅØÊHrƒÅú«qbƒüð¨m­[X‹dz ‹×Ïh.à ÷·É. pŠQ’·Ÿ*ød/‰zUùJlç{e¦Õ²¿0ª`Üù<ÖW [Ö£äWÈ¡òZ¿%ƒ:@”QĉôŒ�|wço…M%#Ÿ(ãõêÿ“áÎ{¥kÞHCöb˜¾`Ǭ%0†áZü§¬XQìÒ*yYÆç EÍÀgøŸe#p÷„÷ùƾ³Ÿ¶Y_…š­a­’ûß_èÚnäwm>p"šŽ°BõªX‚àRýŒ�ì~’ÏhwcF"½˜áº%´8Uø‡»E•x1«›°á}¹�_À´ö¸¶ÎmÅ)xWlrЀ`]œS ¯¼óz¦Zþ$�|qñÒ&ûÔ[‡«”,xn>èø/‰ÍZJŲ°½Öe ìàbø0.ó˜]ꪫ8ˆd¬öÖ�J+/…~)“ƒ9nXQY/òð°k»;.´ÿdøVÅj®Åm¨~ M/){§œ/†ÉÒönƒ¾å�’¾T›kxl¾EâÚ¿ ÛóügÓΚÁ#÷%ÇÉ“cw;‹@ÙTÖÁÑk½ÿZÖ£~º~—'ñ}š4é�õI߉—C® ?B+çôzpW(Ÿ²Õ�€úªò¥Wß•0øqQMJsª.Òˆ\[{�I¾>,C± ù0ÛKÚƒ·Î3�n¡v �qŸ6+BJ�t²ÖÉdB$T×»ñ†0÷ßd<Å®MqC0,ÀŸ‘=¨Âò6¶'?MQ½¶zíç$'UÓ·™ÿb`“WT;5üiòü�3âÕ¬ªsÅ%êàD¸¬¨Í'>L<â9‘Ýuû�ÖwD*m½¬¬I¯G]äÍ'I˜çŽU¯×îy-j%Ù¯O�;¹’`Z·~‹ãñ޸Ȕj›óRñû¿Ã03¼¥Îp©8Çzä–áH¸=V_0Á³ Åp¦�JanÞc ¿�o®š¹Ñší´SÞˆ[O¹ÓªÑlö]_Õ4dTó›—Hˆ‹w“³^Øz�â+@·L½ôhŽ––o_4%íG·ÏÅØçÜÚóí„ÃR æùúQïÏ�Fõz ’cuLô’òË}l.=½Â3¶&v¼H‡ÙýmoÔ ¹+�A†ÙÖk f.¨Ë¤Ï’èߤl7A¼X̓Íã§åœ–°’UúÀ¹´¤Þ÷9f œ½’À$‰óxÄ…N·±;ä3ÓhoË圶 ¡>eÍ(– ƒµããoú²› 5�|ìvVyµ\pÝP:½ GTÕb˜kaôYÔ6CS—––ÈÕÒ¶%�./Æ -3œ¦x‘ð•„9T �ÔE ] ^qA3c@%~ ,(oÏ]ÉâhØb`4W ’ˆ$i«º3&B…µ•2%ÊÈQm¬f­IÞk4©Y×ô-l‘#Þ®þןjœGì†ZÚX£å4çS`�hŠÆ÷‰ÜòHñ"aP©œâc½Ø±üÎðÌ»bÒ¾�[²oû�•®¹žñ'>ƒ ­¬¹ONëÈÝÔ˸Ô)Ä³Ž ÊÐÃ!ÀVŸéÄ$‡²H0Ùà_k*S‘ß”�‰¶¶ð�£á ”ý›ð¯zU׋’�#ËJ莻ÛÅàòæ¬à V½‚‚󙸆R¡d·{†2ánfóèNíðà˜€�¿qß=ÏM]_t§¬M)´÷´à£l#§¹(½V§P¡ v7ð’Y®%Õ¼ (bë¼7‹AÅà³Éõ6¼açÁ�Ïœ/ä‹Í`Ç̺,Yß6ÇEtzÕïAÁ^s•r EnGu¿‘LB<> æ?Jv,&öä”ã¦ÉËïᮢIÓ#Eï6\³œõÐŸÒÿ}ÓÚ–ê}ÃPÏ¥ÌÀ9Zþ¡¸®¶¬\™gÌӌǪõĦÄ*yÐDbä…“:¿­ÐN7y©û&#Ej•íìE×ù·™q:ÍþƒùíùLZxÖ´$ʆœ Ä.sžž+C}6¼ÞçÐ 2”̧6X-ºá­“.„ Á–tÖ]Éš_„íW%]ˆ­ÚzPͳ«0\xí%û)‘ê½Õ™—V| ›´Q/X2šœ\žm¾¤§Þd€¹ä€JÅ¿F�ÅÓ=¨Æ€5l{¶‹ òÅl°!ý‰†ôoõ¹!Tö`{åHy8%L)ô¡ù¯Ž ©¹)�Ðç IçYÀ1áõ6è '(ª³ëûMwIûï"H/Ì6Kƹî—YP/‡ †QËF 6óܤºß§,~Ù½ñPçÿ+C‘xm鿺ù9õ‡V õö!•8‚Ç#j‘R8Ð|nowÍ(³X0œ-c‰(û ò¼¢¸Qâè.’#~£n6©fZ�ØÛQ»s˜Ð†«¨µª(ÿ®ÇBÛí…¹-/£m�|Èð.ÞŽC5·»÷`7‡pC‹@eýÞ7‚ìy–æ<@$Ç3^ñ:, Ûü› ,©j/cÎhkÁ‚(æÖó~<¥=è]Ó¥ï™A�b­{ éí`Tšºk˜ëÄôŒð„BEk/N4ïÜ$µÑÏ,Añ2iú{8½÷ÚËÖ>]àEŒ­3),[³jø‘`Ó…�ko$æGÙnúÁuX{3AÆjƒIi¹<Û­³†�S*. cg›C½¬eô—Œ„p0 ,<¾)ïdÇ/ÓÐsWÚù0+áÝv üÚË‚n�¥öfq<~”"wÕ­^òñ“p²=^°´'rUQ¾´ÕxwN®¼×%Kc®Ö�!úèCØ%[Ëm2&g‡ÈQ1XdAl˜wœ5ru¾6ëa~.O{`ÝbѺ|b¨„ó ƒ«Þ\µt Ëd�e¡Wƒ^œ‹Åà[?¾îÇÛP¸ãc¹Cã4I5 æ¡[‡ÛH`bTO#¨1(Í<Ši/l.¹çNd%u Aû©67£î5Ž^wP¶å&ØS·ÿ:Ö§êÝ¡›ÂK¡u�­$i0b eùÎÐÌOT‚ÉagÌ,:@¦ò̓�%|̵ݹÖ-Ô>®@u�ÌmGIn¾‰Ç¨°³…d>NxЗ1E+$?Ý s† Ä"j£/ȦŽè“º«IñÏòû¡¥ZÜsÖA^êÂN™Ú�7°IdarµÑ²×“|4ç6)õÞ(¬>…²î�ÓD±PÄ`EÒ] È�pÉ}=)Ù«æÆ³“è-atEçC ¼KÁ_„ÜÔ©Êaº¡èùRâì6î¹lmÆõ›ªÜ˜�Û}7²¯ ´‹’œ}÷ÖØ©X2nµñ>š|äà Wì]ÃA—oÊ_bÞn'�Œ�›ó£m à9ã©”yo|JYç{Å‘¡IÓÙ'±pìÆû&’Ô‡\ ¿JüÔ½ªJœ¶‘ãðàÁ¡ýúÏ/}mI3T2É�áµ>µÅ¢Ñ¼&Ób@Æ}k^¹kæžàfpÜ{èb£n㸜¯õ Á™š‘ýsþ\}¶ðJ¿XÅÏÑíµßr÷@¿¯– D\þ ’Ѭ]¥´ZÃÀn ÏÂs.ÈHMÄ r*|>¼8¸3{¸¡T¡�LÕ‡p` ã³‹in™ýybPü¤TþœÛ¦vL?%ùG si�Øø†§PØ%0sœ»Fp)“’¢{ù*%«ñ"FGws ÈiìÚ{üŒ=¥?l�Z“âÆ!Ѩh¸$'F8“9…ZæX†\È©@×/õšäv©B]”$ãPÃþÆþ=óÁåçû,N�â\�,Ö\½¸÷›ó`ŠÀH%d<2Ð’l,‘†hfÍ ®ß†÷ì µËÊhŽó|�È¿¶ŸˆÈŸÓ6æo‰­¸ŽQÍ`T»ÖUwç<²©úAm¢\Öþ-ôËO€'Žã¡£žTyGvzž"\ƒ’y!pk&°fÆl§„:�þø-:l«ÊUY„¥Öºé5/ñÏ JíД/ä½E““ÒLŠ‚¡‡‰^ŠësCõk/Ž+‡0d)ÁMâ­Áh…„¿è†C².PN–ÂGÝ:Õù¶«7-¤+%ŒQd-uncí±î×ý‘@® Ha_¡�°3‘¥» ÐjV¾ø7©ŠtGx_[ïªXdÄÍê+#’—Éüu²»Uf É÷λ« ú5tn—ìeŸ¤£Ž6Å30Pѽ…(õýw2 NÐÁöu¿•pñAñŸDŸ?nÝP6jtµg§.OêÀÈ…_~Q%“ɽ¯{bÃ̽£Þ½�;¶¨_.}´j3Ê�¶ÁíW–þád¯y1•/�,‹eT·ÔÊXÄÓ#’ïæò34´ÚQBùå°œL}µÂ^¥D~4ÏÐHáêo‘21h¸ÛG÷$Ðâ­=K8ΣG«Ä™¦³—´,¸¾ŽÛ�í'T¡2ûç|•]âÒ´e˜Þµ³æ«¶û\6ÊÄèÍ|� µ¶ÞKZÞ5ÄD}£æBì é!7«³Vd‘mŸ‘ékd_V.3 û¹Ï×nM’A«Á¡¯Â¿7ÆÌq̽ôo9íóW(HÀd_䯦$ùåWçíÇ<'wÁƪ]c257{�ê*Z×U(¾~lŽgq9û°f¶˜XçW<" $x·Åjßµ7åý;ËV0âú~EKbòY$Ͻš-ÔmñÎ�ÇÙÝ]½ÊàZ¸U¶ÎC—ð}‹‘ÄàYÔPÆ�økéœ]×Z+F8Ý«åÂã�Ç à´„Ð²æ–ÁìZË¢¡0C¸`ø¯÷wÞÞ ðÛL3ñ:%](Më> È„Û ³pI†ê`!ùº\OCÎAŒë^ÀÈÜìñ|ã¼Ò¼#ãÍ�jBC+B¼+Ò@+7$/>ÍNˆÅ­·¿†«¹Ü†rinë9ºG€Ç·:[·¼q"Ñ ³žC»Zú¼ë zü�,™]ILls¿TJæT† skˆ¨Âœ‘~žµ'—õÎ^÷E0쑦èx÷�˜› Y¤ø0d¤�f�·5´š`ppì��cXŽ‚‹;<‹ºk*}€.šjó:Ë!Í…\ÎmŒ©n\h¸§8®¬O  d^9;£ø®2×�H\"ë Ï@Ç<[,V»SÏÞˆ3¨à÷/Ǯȹt‰Ý»(»v °©K–ÜZ�gÓ1­D–Œ¥’ÙO/! jö÷pvÞnjVC-ÌÞd4®Χ){šP˜ÐÉ}±½¦5¢ÜÈw@]+‡}< ¿‰Õî!Ô¿0Xc¤(áï @átÍž�ù3ng�‰ÊÚ¹@äø/ü lÂõEé|Yºä(òÀ›×½ºù[Wž÷’,óÔ=ØÚ_†<‘Ð "õïºÖò­n¬òÔ7Lc‡EÛY XÓI-Û¸ÞA�àfràBWaCJ¸K½씨@‘ÎmA4ÅØh`nÛ{HX¡rÙ'UbÁY¢ÂâÔ–9k�ßA¦Q Âk‡Ãèõ2Īi8Ì5,ðèz#5�ée=mÎóßIõS4ƒÅšÅäÓì|ŽÜíta´W$ &y�ckªŒbA¢ŽA|îA½c�`»wîÖØb~Ë2¡®•5ª£Ÿ†Fò‡³�s¯„o'vÁ/�Ú/„žX[sÒË7Ï‹ ]¥h)’kó@óΗ�÷+HÅÑÑÐsµÔq×Uiuª™-µ‹ÚþÍCÜÄüÿä2jkÓä[t#vrÀcjKã3Q ÷˜)¸NÀ@€wHCøÏã§í·Ãæ"O2™ßǨŒEÈ`/”"$b ôQ†v�hnå¼Ýân½–‚ßw„½¬·vß©ð´ÎÄ‹ÔÖ/¬\¯®ßl¨º<��¼;{ ô¸+‹J: Àµ`C‘X˜�ú8/iYÎóÛLã¾v[ë¥d*cëì ^Ê™ÏDB†Äæ™è@\Núô'Ö}ã|Þþ2T,I묹)– !ÝpÒ£UhÅŸy±‚ðè±VÏCu§éð—ÖÃQã$gõ«±3¡ã�ƒSˆ®·¯«¡éä$e7Ù‹¨âàû”¾îï]W_t•ÅI�+:¨r[ SÖ‰‡w½è•€QÕ¦æ²Rõ'àKqúÙîŸÔ>:°,†7‡5ýéß»õÓª ,΄œF›r |/Oã!o+ò•J~œK2ûZ?/¹Ü>b8íÓÕÿ�Ž „_Fh'ð#`çkZ8®aÖ6WíVø·`’saÊ}xc|p1LdË•Ø)³vkwlù@Öó÷0ÁÊžÌ⋟Yµ-¯3ì†ý+n±Wnœ£îOÆEzÎ;7™yT`¸Xš;ÉÔ¢ªËÁ©g(ZÔŠ–<•íøÑf¥–ÂË`ÖP¢fj�·Dá�9|„@Fp)²["dƒlb‚`cãGª„¶JBJ J]f|\Øù‚&g6�LÇá…º'_n q4…£X6qzžÄI4æ3œ üù… ÷�„ÉÕ ›+µƒáÆ’ª´±ã?‘P\Ý®û'Í4‡S*_­à*ãË`ËVko§ìvC½pÈ#‹ˆÝ7䌇.�yãCWm½1T÷Mœ±Òå62çÐxÛºª[lÍÌ]³MÆìgl”ïDV,½ã!Ïs.RVåóY0Wq{múÙk5o³��Éô>Ú%‹®IeÚGŸ1Žœt»¬�èíjyŸT3¸šô¸ 䤉¼- ϽÍfq5ÍÕï‹Ù€¥›ôz‹É·l뇿\™×ªY°fÆ.:Ù“÷Î-d�´±kôdúꡪ�ú>åE‡çý¦&ýM»SB`Zý±Ú·–Üþ°átæó»Ú[‡b·,1=^Œ7³dõz1ÿc‚’2ª×>dþåÜàŠÍú ¢Òfúº[è<Ò“ª–T¤¥EÞ˜×wý8š@|Ÿ§[ãÓÕ…›zÒ>Åy¹Ö©Ýô¯º“Ò-‘Q­FJ˜ïZö¸°9Ö#ª8NÓ×¥¥TjÈn/øùªåYG!†V=Ö*üJ…Õ¸o]˜ç#ys¹�lk‘õð`߉ŠW…¨îù "x4\è_vßxÔÍ}9fÆ”ôI`G�\.›Œ«ùU0:LZ®ÂÝ(MTnÏ…m^JP†ØÉnlðáçãb1[¼�!`3‘ñ¹ SccïHMݸ=Ð[†ãJWm¢xÖ·IÁÒ˜e=Üæãå3ÔYlªa§ÃÒÜÁ–ÈÕÙ ìôE~±­Á6²ú±§ãd ¦T¨J8Ž Ó- ^f4ϲ‹³~u1ã ’HÊeËK§U ³Q9¢…JáROqwð¯-Ï/õùkIê餿Ùéq•$ÓZÕddaÈ18íÈQU‘¾õ›×KmúSfH¹v�þc6Ÿ3ë"«@G0ðMúÝÃXBwóN·ÒE9Aú†íÿ‘ó�p¯ÕsÏ�� Éß»·&K©Ò�ûÄc=æN´>Ò¡Ÿ×@xäÚ™˜Ul¶¶Zߨ((ž^˜)£>ÆÂB ö6óD²)—¬Ë?BÌÕ¢5Ä•ÿ;f¨¥2M–Þ“8ì«gD‡@ØIŒ"Ø;dù˜ãÃ�–"AÕˆ‰ô硚zÿm±�ãCÞÃ[°•n•˜­­-órI T02G` C ªº03¡¨ÌÂßGŸeÍwÏ£`“­®Ž&Ù=Ôž4æys†­Ï ¾”„›ûVÉ…9BCƒvði5÷ÊÒÉpÈ]¥XGhdDÊaÖ‚ÑhV”b>]¤L2Ààјkˆf&,²)N�QZ‘(ãÓ°ÚÓ]»—-…ðbCÅš–`’±|—Ö=Ï9» ˜Žövêè)'m"ù‚ÙÆ;ÆËË)\˜R¯_îñåtg›b÷þ´÷1Þw �G¢iY}ËýZ*·¢kÍÝÍQ^à�<µfkÕî—5mýtNmŒô8y¸w ÒÏÇì+;ÜI/Z÷ÊÍ ê�?²k©µÀt=Œìxpâjï}°ÀñÈï3žé½ÕÂV²ôô/¾Æ•sÀM².rœw-ç;L¤€Ófü,OöP¥CpCÄ’¨aÚ³ãÃX2r¬¡7´ƒ¡¦CpF.ÀÍAŒ9min 7Ä훽‡D¾ŠÞÇÈÆ¡�®VÁç˜�Ák[öæRƒQ/‡Z°Ÿ§`ª�^ñy|ß:¶ÜÁÅè;eÐð*Ï[Û&RÏbyu,Âfâw$½áP[C¶±ÏÙ â÷±@wÝž¸2¿¦ÁšÅ q!Ì8œÖÑɬ%¯c-�˜ëèˆÆÑ©_ˆF~¬_¶N}œ&áïrSÒºíØeíZ›•YÃ0±ë ŽéµÔ ¨BœVɆÞÜÌg`�Òõ{½ò»M!­ÇìÒÆ¿aÍ(*û�YfàÖµÊïÑn+–_ÅÍ#à#v�ľè.¡ZꢟI­¢¾æáÀÞÕÒzI¥xÃw�Óܬä9ŒÊù\ÈäØâlÙŽ‚Žõ™†kmZûÖ§úëw`a)Ä3Æðæ¨I[j´¿/Bü*>XÓË|´ƒ¼\ 3’Â3 ±TÝ3qÎïWE ƒnážLƒÖ7@ÍÍ`Ås4ÏE-¢|s5ÂeÒ2Kím�]À(W¨²pìȼ©"w,վ꒤ïxçÊì‡l�ö>9Cµ®èÇ«zlz±¤¾-È+‘:BÒÛÈØ¨�\1‚­Š���ÅÜ¢,{_põœ ïn e r•tÝb¤¬Ç»×£ŒÑÉêÈïN&ÓjÏ »‹.iûÜþžàTï“Ç/øQölŽAEÔh†½ Èïy ÂÏ­KSt‰Bž‡†‹ƒÃ²]j¤ ©Rjˆ®f7<ìœP®£Œ¡¥gœå¿>pŠLá.ÑyÃ8͚Π±«�Ô�fWªÉ`ÀuØ-Rˆg²­¤bITX9jÀ±úÎMÌc¼Õ¦Sf ?*m�êÁP9Y´'43A~��×ÛMâû‘û™YŽ}ÉÉAËöÓ%”,�«Œ¥|¶ú¾´ïa½v{…Ý'´6�Æ�Mæ,?¡õÖ ePœ�.î%b¶JÂÝ‚)´idæ23¤ýUDhøAžЀ}-¼TZoÖÖTz °VÆ·"­ õÞDµ¹7h@™lK»z‰zµE7aºò⸻"`ÌŽv'{�Ög@Æ:‹P,ØÕ¯At¯,ýÚµ‚£2ἃ¶é$GøÖÐaqAf,ã€Îå›0Z±ðÙ{ƒÑ)˜Þ–pú–f›K´… ¨ 78O~Ý 8ÈòOÌš¬MÓó�™1ÎàĆhÕµ…Ž=ä3Ý4 éêÛ´‚#ïuë×"6£±0<—ØUGCA1F-)@èÙÓ6e¸U¤tu_bìÛ|5�ä±LGsuc(÷?¨¢g¸ÊíuÓõÐÌõ‚"i݉‹–†m©ƒÐ+˜å8Bvp{s~Ö´ã ±¢ß[öºè 7²>&h1s†§$mà`9sƒdÞE¦–ÍîØ± >ו &T¤Íc!(„³yÛmÝÒïºGæR:÷LîÚ§I×zÇcê³hFK�­iÄa«–ÀÚÁ*kè1÷[Ø9ŸoÌ q‚Ô©ðƒ(Q&Ùn ³Ïsoňg"rR÷õØ‹Ç-È|o�i��™!p÷Ÿ3ó‹Ò„·I8ll8¿yLnÆ­6ÒÄ ßÙyégVl¤ƒu{Yìd�›8Ù° „^2Íêáy´°óîœì`³ní_)e÷Îm(ËùÔŒOÞ´s·…-¶^”öè+Â0ÆpxÑ…Ó�h–‹—Äï°Ü?¤L‚ùõÖ2åÚÉ“·äQ8[ Á‚¶½4ÂŒŸÞ:¼‚zƒ*6¶ÚÀ°Å×—�î>ÕBXb(Ùò›!í?¸6Ö$dð �ayLºQú™®(�µX(ý9Íqcn+¡šB­Æ6‚èÖ`ýËuÁ³4¶V¢Ÿ#,È/Øœ„2s;½J±þ‹tÐ BÙnšÉ¬h‚ ´: ³\9ßÁEŠ…tFy‚øÛ5¯Öf×3Žã½ÓˆW?튞ð~ê�iÓŒ¿ù†f`³ò§÷´=×¹þõÏ¢ÙŽ¦˜Ʀ`êcæQ¹'ñä­` uñ¿Éa„>kX àݯ³÷.2jàÏ7GµŠ. ÑîÑšÛ=ÛïCc¬żœ'ÚëuBîÅøöèqI]¤6' –àos—¸ßWÊÆýš.Ãà=¾« }”è7Ó+ìéÕüãûBâàE ½�ˆŒmgm{9†kñæƒo¡Ž]i1’* i³çèaÓðÛç^V”š—Ð÷)y¹ê„ÁBö¼A²sÜwe¡ÖO(zð¯¶á°†êä÷5 ª4©ÇWb™Cª°ÖGk~±BäòLÕ&xQí=lÑ�A?.©.ßrä ÚgØ\ðYîÊ/0QÓãÇdy• Š{› n†ú¦0¢�è¹z6~Æ„„´ûB1Å7Ï}pÔþ+¿º€|>M6�†/u¿` ¡yXvøPÐT,óaõ5²Ôc^uË{n#¢c�óAD[\~¼½E‚Eßx÷P�Ê’ ðý5‡ö•!ç�*DAF¦È�$~u¯UYél|UŸv1T+^�DÀq‹ªŒF[Ð笭† ccÙ½Ý×emà.µ¢/2ýŒü| µWړdzˆ­0€äR ÕØ©ÔDœ=&ìŽ-é_›eQ%]DÝsà…Ûãk��a÷4íEoç .D뫦 îŽ×ÄáåÖ×ÚÓWbïAÇ’ ÖI¬GªS3kæî¼ ‚§9½Íä¬ÃÍEî]Ì\”~Æo©«c fP_«ùzÛÌÉYÞ÷ßw׺5…¸åF#Ndp¬l˜dsŒœášnFLºˆ¶GL0¯yl‚ ÃdAs¶o12¿„D'Îq‘±Šêæ�\”±ÌËæžÔ;�½ÅøÕ‘À½ŸN²¬…ÍGãßµ¼tü¦iÜ=×6¢–�º/1.«^_Ê\S9ʘä¸4AV># ¨Ÿ¬3imR }i%dMfÍ‘A"¶ObÁ¢8ßAÙ­ì¶8¦¶ñû½0åùžþàGwQPt8¹¿/ʤ6Mÿ®ùse\l1–!°Ê‰ñsbÁ81�Ò%õ?¶(ÐáLHÁµ(Ø^a~xluv<íÐÿ.ï:í4R«ݽµ/88¿|@ÿa¾ñ#FÝ›‡×Ò .{“ÀÐh%Ó IcõLø°ìý*“AKˇ9ÝÏ8nKÐò¼ÇwÀôç |º™áa5ç̇‰‹üoC\­î-“'c18á^ó°Þšê�g`×LŸ`{ï…[Ñl1aUMhL½¼›(ËÆÊŒÁñã@²§×:ñÜlñ«ãŽdç,À"@¨Ô÷�nñÝ­€p«óÁãW^U0 1r�é&´köÌo€ÆÛs´&É1â¾>\‚B#Ùíâ:w]‚{¬Ó&!ˆÐ¨;–•åÁ¼�ïéØéÕñæ2/Ô¶#=Æ¿—¿×ù÷67âUûÚ•?*ªÜ„v+ööJjÛc· ïIY‡¸“k‰ö‡5Z¬èÌ¢]òÙGä… ñ¼ã½™ÒS�ZšÇê×vÌ¿!E[èë�ö>Þvœvxs¤°@­®0¿|!§ÒÖ0·KTC„ÝÐDC·²K6¶‚ZlT¹ó@`e‰Û͹ºÁñûò°/zÆæ,:ŠҜ̤­Þ1›”±t|G@w1kFŠcšF«0Xƒ…¢jp|8Ù°M};¶ÈrG¬·Šôº�1ãЧ‰z ¸¹Nò_ �OÚÖyŸ¿¡ïüò—.ìw» !C¨r”#û Qu÷U°(©Ï*7 €çj¡ôQµ¥$DtNœ€±Šš…wˆ]w” ÂnùX- \êí´¦Ù¶©ÿÓ8€y žbtüÕµ-´uØ:…’Þ­.?ˆ÷' Ô‡ Gä=Üxn At e·HÛ†òw{äÎ;®«dú}µ×=Ýz#�nµ9é¸À㬵ÏCÍë(óþž%VŽÉñfÇñìöb¦cJ¹\’šÈ’ÛX.ßゼ�ïè¸@pÜð…gÙRت'½œ‹ §Df\[Ù¬a˶þ/†^¦]mï·}”ëu‚1ý{ul¾7¬À(耘5º½|ÁÐÒxäsŠc:� øE‰ÉD”B�¡DÂØ.”ÛݲpO�-�‚c26´ØáóhØÁÆ`Á5s±"”OÂ.Z­;ßX|xEo…«Ÿžåì #F­xÅ£­Øöû�:Y„%ô>¢�)YÚÀdêSvÑ×Ði â­ Ó-éÐÈ$Îa�ßcŽ¿:û-w§³˜8F­’&ò´«‡1Ì3Šž=ëªsNHWØüQᑟPk–`KwËTû#øü[ÂlµˆáÊ[?>t@)Òa¸gجn€’‡~nSÔ(š)”‘ mÁ!®‚y¬ØFF¾¥ýËè0Añ)+�Á.yÇ­ÜÍ­h(C˨åA%AÅRðÏ7ÈÿNÚ³‹hbFëû1‘™»­éN*ÇiÛ1žD2ïü·}–ÁA)dÐ |[ ru¾$p6( Ú±+q‹9°4NP"íC`<ðMàsgÏ›Pµã‰ìÝMú”/B}ê3g�o¬�j¼²NLšH¿'é·3­A‚ßs›ßóEó+WyJ�2¦ÜÄ\ðnE�`Ð] ˼ò š=‹R–ï±§µhPw” +ûÃîÌ{¡lß2âˆá½@‰øó¶ÉïZÈY— w ™k%еÈ[kn‹kÁ­ßw´Ôk:´îBU BQ®—¸Ê“ƒ ¼�‹{<9.4“`Ÿ¶ÛÞzC¼„Ȳ˜¼¨#f Q!ƒµ±'©L5Þƒ8k6Ó–Ñî'o ¶ˆm½Ðð“›í;qQš¡¨A'ˆ/£ÁI�=`™ú_¥œµ¥É÷K<ÉC¡åðC¥†£]³2gá½N0{åõ×¢“Ôbã“( î×!Ÿ;Þ®?§·¾•!]2#Y<ªöVtO=´†î}Ù ®€¢;Aæ´¹ðŒ/Œõ£¸öÏ|F²b〆óŽ=ž¶‚aÆž£€°Ù§2g æ€ÊÄ××Ê욉¿FòX/‡À+Á$á° AfR„K6�™„»œ1^nF!lÞ:’£�§ÈWƒc;(®Ã½­ßô«™î6ï×Ï}ìò½éÓü{îÛ¸ D»ºm~îתi{¾´;^öngš�h. ¢ HEv˜¤Õ2ïE°Ö¤¿Üö5�‘È_€7iË Òšƒ¤ÇH¡›z;²ÕÁó7î’lÕ—¹®ÓY+½Ûáh–Ì5Í�Ô¦Ä>)>_;/‹Œ†q¦²›Û�Ý/BͶüxðpT"n¦¿b”N¯�f9~i5#u ŒÙq¬Ç= nÓ�Ÿ‚ææÕö…âK¹ƒ·º˜~}««¡Ð„¡ÈÛ|üœ£:ÎppRô2]œèÖr'k¿ÊìËîϱA<_¹ñ°ol†�ógâîëëÔÃ;yž”va]¤œó0Õ÷�Já¨@Õ.e¡àîZ®ÚÈÆÖ´hES’ç3º}4ýï±ÏtÙ¹DE{¥íwÍÂíf�71½Ô¤£ò‡I;�ÐpZÃÏUˆ ”c…`Lò!B´:ç›Ãí± ±Zf/Å$º°’òQýäõÌû Ä$p#§bþ«ï�@öp€óÚÔ—Q�-ýó_jô Ía©,ì÷KöÖ µ[Ë•3›Fƒ°½¸PîDTS€vÅÆ¤,V}¸î¯1h¥Õó{yþPøƒlaÛ€P8¾{ìÂäN˧5i5qU�TÜ DÅ\ù`|¢@;¯IƒXSÎç·ÙÄKo0›‡ôe‚6‘ ¡„ jÜ›‘Ÿ_½×ƒ‡[ÍSOàýøKÇÃaAèžCßîà­dù‹2˜J¬êËl†ÙÛ�]v¦ëmsJ+f^h{†�¹Ï•"GÛóãÖ¦îlÉQ´KJ!v3 PâsøÎ%Ùìnj+µÌ Í“ÍêÈ瑊ÌÝ%Þά%ç‘È(W…¯ª¾°(;³X ºvC”Æ'|P“T„>ÛÏ´‰GÄ7®zòÆ‘ CK}¼¶iî^µ2f¹²"i;©±ûÀNøjÅÎBG¹|ÙÝÿ±¿˜ïñŒÜÛm¿r–Êš8;5®Æ�êi–.xÀŽ›Y´zct¾æÞ€ìö[l¥å»t{ŽSìˆø¤)×®,# ±sÕ¨Ë+2!d…áa%ôÜÈ^� �ÖÉ(½ZN‚€X™¬Ø4>4¸°H'ØÏ`2¤òŒd PÚÂîÅyÑÄΪ.ÙõH €ÃÚ_(гë1pè�𯫵uÐL+r•®qÌè—vH‡”P®]ï¨8£a¬wv”_b«'…Õî`Û¬áòè{óO‰S×ÕØªÄË:á6ÕÏ[é.†š˜(|òÒn:†2��Y^·­ß¹¾àø±ˆÛeòµ�>^Çb‡\a«\ZÍ ð-ehŒí¦žæ<¡À„‡"á!o:&7M]Ý6Ükž·5g¬<&8…VÑ…<_©{ÞZAlœÑ$:·_P3xT$ÌŒ;¾ŒxÊÌÀ,]À#Ó‰œ{y$r7 tCÐÛu5³†¡í�…o�áˆßÐ×­[97ýÂØö³�Q^ ¸ØŒn3v‘y|½Øå�Õ[¶ÝiÌÀl�»Z­–§„’�ßs&&ÁP ]^ðcÆø�m{"8w;�'¦Ä8Báö¬9†BçCFVݲÈÑÃv„½„Q:úÌç“ C%™µ¯V´6(¦*rëë|Kæ\µª³lÝKQºÞÖg©ËrÜŠ'Ë“½BdÛÑŠ¾m¾s*;ÎõµAD‘B�ÌÒ·jÞo¢¦gÀ›YNíŒÐãØsJ‚Å2áÛ”?º ­‘läl¡�38<¶î#©œË$0hásSid.&,™C6±~&kâ".Õ™»©n¹…‰Võ�’Š)fÜ®ÑøPp9]F•²n úõ §Üj…gQT0Qq0Z•UnpõkNP·;‹ $Ü™ëG�æw8å®o6ã\ö” óH“sÉ7.^½‘ó>{›ÛqÀ®ð`7¡§êìóòÏç+ÊS¥NZµ-uš2½’ÉRPtFN:ymg�jïT:ŽÇz±lÆû­]r“f(ÍÓ8‹Áüp‘™ÆãÍs«Yõ »v–ƒP·lc6¶m¦+O^ZÊ „¼ü/Ã_†£#¸_‡k¢¦™›Èa>³ž9�wk*e‹ð‹¯2çZè ÄB�a±;š¹­feꎛ·ïa�ÈpÞÇßâ#íƒ0;#l!Óz>p�§"µsÓ ODv(Ö³Xï/t±ÅWUX™79Ë ë0ÓÅÎ~×ß$Ç[y/ÒâÄÓìÝ‚ŒÒlzlPÅ”‘愞¿®4œ&윿VA¥zY|M5½˜n j ‹X@�Ù‚8v-*ñ Nå¯x´�‡ø¡üf5Œyoñ÷)ÞÉO�Ù/ëÑmuŠÂãêªj � C³\î[Ù9ü88‡°ïˆÆ»œL÷ ÊõZ·zõÕ¿ÖÆË†W6¿Ê™-wŸJ�8�ý°÷çùS*I‰ÐvöD$ùg î%‡“"á7�ô� 눸Ó±o<(FŒÊäÜ-»�FÛfΫ#dÇ ¬<Ɇu+uÞm`ØÄì*™qÞ ½!E’T-!øºÛ�œ€r;Pïy9¹XÔú*ë aÙ.hƒÜV­M½¯u/¿•þÈrm-×t@¾ˆ%VÝ Lg8Ð]I×ä„[Y;8Øu�ëY(Ç­5ñÂo5ÉØ ñÁ(µó°næÃÛ¨‘<.•ƒDÀá?"=a>rºšl,yöïwµXÏIzŠ””Ñüºµá�Šöæ„è~jyµò’??gE@â@\a|ü^ŸF:½½Î¥¶µÁ"Âlʰq©{mûÜ3g&êq‡Öw-œíÎl‚Ÿ÷`G½‡ÛMnÂ㢅ïwª±€ò�ÌEç†åÇîæÿ®àh½ÍónñhæKÛHÒY�¯†¾]£²�w,Ñ5ϼ¡¿‚¹ž^�Oy’qº~žžÂ¥ÁˆÞyÁ«šÝ^NXùtOš ý9õª78¶G/Ð}:ôRðÖy´™U]*ŸMªd9'OETuEµWÓ&¾ö͹V~3„ž^ËEá~Ü"÷`t �_âGš¶EbÃgÌ> È¿‹¹kÔú‚w‰MìÌŽfõ7¦èE‘¾†‹rðÆýwÂ…Õ·9�Xºý܆«Ws›bZs9t£[³™½A ç8ØSC”>�‡y^Çð¼ •"Ú.�ŸOwj¢R›¨(À�&A”3<®”_v¦©¾g•éB}Å`°hFùDÂâO¢ûž¾!Iå1‚|ç"ì.¬Æ�³ t(£Ít¤Â¹V°«Vß<LLzÐ2´q8Úpݧ«t„ŒpžãÅ)m~° a�0´?­l™Y÷L„¨3lÎÝÍ©um(ë“ܸU«yÈ_<—)X‡è ¦�C <2õôÜÅT6E2Á‰„† �­”„+ ¹..}TñÀ°f'¯`Õ@Ä1Ü­Aä.ø&„ ÍÔ±W2¨+#¥‘À¬à…ÐÝ­È<›d_pØSw^`î·e¸KÆqËÆ W–õ€«ñ.ïöó÷J„8–û!mrIM96ª"xóP  :¼CµOÒ·~RÀí[ƒÉ½±ÃŠãZLb ý}+¹L¬‘Ô~½\ãžÍÛCЦëÞqt‰M�&0æEïYHµ{ì ÔpüKU›¸¬ÇÕö~×D×Cm4Î5‹÷Xö µT’C߆xA^pî™iÕHy<¢s×\«‡Èèä}§~Î.9²Ÿxk ¨°*8£ÛÄ±ÂæNø¶w°g�ž³ Ë5š„µdu,�‰‡àngÒ¿|_njÜÚª·ZsÖØý–ëi£µ§öü¤Ì1HݶVc‰ ³ àÆšd t«µŒÃò!X/Ë7Jÿµ»¦ûª‹.·‰¾�CÀLFÄ2y„{uZAÉp±ƒ%,x‹.‚Á�Ї¡ [¦_aXiû÷Ð笧ªWׂ‹”ÕxÔŠÎÙV6TŽ8[8µç;Íû´zz l®&>-Hæµ a'ä&éÙÎæ{oöÓìÆ×ê‹EðôEBJiï¥Ô—Ð숡œlˆ¶¸^nÿŸ6�+á¯Z2óÚ†µ¥’Šš›‘¦Øs¢W)–ðYˆyü` Â1Z!µghöÞ‹=ߌ+�|zDÒN(¸W�‰eк—š-·~ûuš±Îöùn¡ƒ]¡‡a�jìOÎß¹b‹¦JþwgZU>#^–òöÀ_m »´ ½Ë(ªBκ—ÌռήäÐ?==ähèÊ5@x†Fv±²Y}*vµ�a‰XC’(U)Íb_®Þý_>Lë/ÐÏ-7M²ˆóC1VçÃ8Ÿ» Àš-û|íê66–eÔÒŽçO›¨7 P¶iÇ8i²Î©gíã¡åê"AÙPTv(”% KÄ0°�Ú†ðŠòϯ×êβsËòFÌ:N)ŒÔ>àQfùì.‚ÁÆÍ£¦]»iª§k§É52ë(™ÝŸ 7 ÜïÔ'|Zur©¶ÒTçÉ‘°Ç;ÎrU‡xßDt"=¾°Z]p2rÔ²��!ËÇt¨ çž_aÁ�6v=�ñ¼/c…™—¢·-VÚ†ÿHe_›É…Çv ÂÜH/²ðÛ ×ël¸¼¢V}· ¡Þ^ËŒŸ�cl«mÎ[H>âëæ©,&rÂÙÍ,.‡é�kc™è•ŸÛ¥áÇìÚiºí½>-o¾{,0CxY¬žº]þß<Ú­ŒY¤:aà4 î¾àfÄMbìÇ\IïÌcdWC[9‘ý_l8yhÞÇ¢Î!æ—4‹}»ËÎÏÌX¼ûL®ˆÓÔµc´v9Ƭ8¿ÒNì Ýi zU‡;˜àw�㕯;›,± ”vëÖê4‚<#vg�:aœ‰Ú"ù®®óôm#Êßµ¼ QØ`È-¬ˆePí-}�¹Í�á{îÖ‹àw®Öòà3ˆöS13ÊòÚ{í£ë f\=[È|a¿ú@ZÑ<Á,ÈVQx½6èÚƒt¬ª"AÏ8–:Ÿ~ÕM¨‹ægZ÷ŽUp…ÛuhOÁ|¦Ã8úü�&JVëžõNwo–â;c\�–¬ÁííCPÄ6¤>ÝüXÔʰh¤—è¹gêW–85 åìü´5R6m…º¡¢ [äU°æ!Ì=yÆSè–¼äéZkóÜü‡½Y˽⡵�ÒZð`–û€o­èÍ~+øHŒ5ô¯òÛ¯H�îf¾q’â»ãMf(À¸û! Ùƒlj`é ¼Ä˜î—ñôf7��/ÝhúÆ ›6�w@…b Àc³Î\9š5"‰ïˆJL¾•#_ʆ:ÏÃìy;ãýû;Ï$Âþ'wdJ¸Êl”€²寨�=‹¼g%ßÝ›%Ö[ŵfnY]"ç ïXAÚiíÂÎiôÍlSâ²D )ûb@mO5Šö(åìd¶\ÁSó_/ñ_wÍ•”{²Øcª” ´ò†š–Ó‘ ‰âšòÁà 54µ¯zÓU‹Í«åðSfÉÁ2íÆ;Þ‚ÌÛ5WäÉ5Œ, 1Û„DVŽ jÒ.8SwÍ¿j0|�þõ†ääø ñ_œ×cif üç¨CÔ´¥X Ü9õ�;K«onv³ˆ è.ßÖÌo¤7(gÖŠ?-½’ò › -)ˆGSÍ Ì.e7²]ÂTy†vmB#E‚B¤«‡ XÉK‚§�öÊ!hÆg‚9iœÛ¹q$¾B·VÃ;� s©}¿Áy\Å…Zdé<�Ž 9�g¸ Žâp¹ª‹­wFøw¨kÃ1&m‰ÐO‡LMG°ŠÚªÖ0û[eëÓy \‹�€6`uíËÝ= Tây#çyè#gD9-ÅnûkBõF§‘¬T2:uÉÔNÌ•f…;•£voÜ)Û27èT'µóFVÙ×oÐéÜWºLˆ%_½llt´á³KœÔæ=SÛ8‡ i {¶ ¤fæ¾<é°á Ôù„»5°¯=OUe³ÌJÎѵU³ÁËäÓ­x²b{]Ú2‰\@벋X7&íРârØ9v `,pοF—×4óW è ÛšNd æÉp/“ {bÝZ³Åým$‹Ö)ú¹½"ü_¦¶+öÈ0&¼1ëõqv>%ave�°ƒí2;ršX ý¡>®Â±÷Æ>Œà»¬^a|+ôƒ2�镸ekäÍmƒªÛ½¦ïª!2æ'$ÿ3"￳ÆqGå�ò÷ h˜,|Ñ‹Û]_Eq�=]Ä£´û¶y‘¸,ßZìeN\ M笼ëÀGb©·1e'nF S* Éh×W.. -gï¿_ ϾkÁ§XîÈÑô‘h@ÀN°#àŸ6¨š³Ý?ŠC÷Í÷)k$XšÀšŠð!€õpùûs#ã,&66V¡ b;.ÄÙ(’ÍÊt¤¨ÐœH= pS‹w!|V�h¯E—öNûJ¿²ë›RãXF°€6@»Óf+V´õÜŽê–<ê'\¨UÑp~~Gê_Q_[PôU>Û‹½“^Rlaü3A®îÕ¹°¿X-Íém¶ɱç¤u¿,œO‰WÖ;vEÎÂ\bìt@0u¤éc-3bÃç�T²=Zé´âI(û´·ŽàÒîÌLAÜdæY„¬¯ow…†‘¸i°R¤¬kû›½ÓZ4úÒÀÇŽÂj…᪛;«Z ´ ð¸¸8`-\2@ño/•uz HcÅ)ñ¯µ~ÕÏÑ|·4ž~„¿O"…dDu•¸ù”«nÚõžíH@l³¯†G1ÀP¤)k}N¦^Ík®jÀ³ãÚ%³@‘ÁîuRÏ‹ü'¹<6�­g;á­gn­Ëäv‹DÔ–Œ³„C7)ü˜/ª‚üÁßkÎǺœÓîüGõ —F�'”æ÷õíÇùÞ>� Ù™Ðm½Lú<‡·¸n§“kÙøìIœFcQù¼ºLmbµX³2G8ø¯ôi¯sŽ£+¹\6µkB2ŹW‚ëc¬d]BL<çö²áŸ71FbÁ[�½\F÷íw4à¦øÆ=Š�*ÂãÃKˆ/kÞY‹÷›O/K�jª�½¬øÄ’+¾0³ÀN ²-è³­k¾€\NyX¸Öv…SxÇPøE@ØY/º»÷þQã<‡Öwsd%ºcôár/ÜÅçm_tÀÄìÝd}fZ0æû_§,™6³<¯oø§ïÁE~Aعnàsˈð^ûǽÅ&Jâ™ù÷ôË®ü‹Ø@ïbF{½-÷‡S+þ",9Õ…^-Zoú‡àÓÜH‡)å€û�ëd/ <\—»û‰V¹d3½OV�;_\¬´�ŸYf9X/S)“­¬|Èrš} Vþvã�½¿}CÈ�é�œm@Â�ñŸnp"ãT²å•�ÚRd»‹ãE�(`ç’Æ'ÖÊ•¦ÿeï™3‚ùÎÚ±r;$Ķæö5¢tÄ’hU3µÅYr½º÷�Žh'tç¹±ådRoklØÕ¢š tv•²á="XA½Î÷í9p‡§>M½Õ9m׳¸Ñ€¦C׃t¨YQš_†þáîqë³0 f™« tøYÓÏ*µSrÓJr0v�è×Tr©{¯Hæ°Q k¹Þ÷ºä¦À·�F­D$.ŸHðÃ' “]ÄvÛôÆãަ:ã†î&¾ •ó‚…ðÚ­ >È�µ¹Mõo€~ˆdÚ)‰ÐŽøsö½Œ§OBâ®^ºŒÜ6InÏÏóx¶A—ÇQÉQöèÊ¡]d¾åklh³Œ \ÙgÇŽþo=ÈžÁñžþ#”çí¹}ZJ{ëm`8ttÅŸjú=-`;$¤ô)býžq4¡ž%Úvz®~…|%²8 p9ks|– [�¤I-k92,‚Ùr]ºv )“ÃÛ{l(úk‚7â^ˆ8aò:»JríÍ·9âȃߢ˜04Û¤¸ø¦ÚTÁãÖn;pKîe¿4éÝ<Īn£’„�F6d(z…Ö€ÂÝé¸Ë‹ºJ©Óq·ü@ÚGH(EF£Óä|¼R�Þ»«Ijd ›*¶­„ˆ&Uàxô-%N´.Ië¨UõÄÌĺ„ãbDî 4€ãtá‚2É«ñ|ÞУæOy, â¶X �ÂBòó.vUœÞl ŒV¨¸¨ìð{Ü|g‡zŽÃvfƒ³ôš:Ût|p]ÍíMîN’ SnXžÍ CI†<±Ek–P1Úè{ôô,+Ù1e&¶¬äû�·¯’Ð%1_¹ø3ø„7fkÓ�üšâd­ÊÉ«1» 0Þ¤¾¸;2ÀÃÚž'e2÷6Íc¡g͉¶Ul<aÒq áW,ZµÃ¶[ÅšàÎ.ŠFØçÚ6ÏÚõìk÷'ÂgÓãbÌBæž}_+Glð)ÍäÞµ†koòØ;Zô2?†|x¬sB ¼±•ä6–ª�۔ὡ寰6}4­©­ˆ¼‹3¦,¦ÍM¢°ÂëËŸSþˆ¹=í€e‰ãÒçpGÄãàK¦ÐiÖæ(è §[µ†pÔ³ç$ZAM„Aû/f°®¥î¢;þ’ý35•Ð(Ã{{>±ÍMT½«©OÚÒ¾Vð{g÷4¡E ìÛ×pHZâ&xy¦Âûdž§õ†¡lZ7:ÄÒg¡0‹ÕÝ ô²cÏÆMpÑŠlcÀ–ÙV�Å6êÚÏÇ£²é,¸õ˜M±Ñ9Õ²˜€.OÍŠCã£W¨>3Î]ÞÞSœz@$µ‡xZH© 7Ð�rsiÅõ€u "Ø™ÈÓ°hxµô°ôŒ°sª=¶�â Ú²¿B^÷Yvý_| †¢ÀÂï»¿ÕøcÒÜî7„«â~ÒßGôr”2qVp$FÐl½Ä�9•¼6lcq›°:Ö»®>÷JË݆–JÀÊLwŽ@}Öø{¬À•Õ3à �R{\d'>©ä[€š|Ÿ:غÑâÕÇp¯G·ÊŒ{5,›é¸ŒX÷ÂcÉxçëÝñD�½žxzAý½�å`¶°ÂC5:]ÙßmëäÎ’÷PÌ©1~ϵÄ@+‰Ý<{2iüGâj*ZÚ½’ïhè >ó¤ŠÏK"ä;] iý—¹î³·Ó_b?\sÌ:i¯·ä†«3ºCjÍú--,…ÙÙ‰�¼t ¸žl#'ŸÅ‡-\šFUÖÁa@�7X£ k ýKi�Bôt4 ë#Ž’Q¢§£Ä=ZË¢¢Èw÷Ì j£¶z*¬Ô±µ.»�»{£à'L'bJÒúä�ýÜÓ`H@ ®HÊl6ˆ4|[ºñfΓ«©`÷9ÏÀÇp7ãn{ê×ËÕ} ºHPµ€‘ÖêŒÔYî|Ïöcß[÷7LOÙ>ZœÝï÷={k¡Ž0�èªm¾útØ’Sºcš¢¦pr@å¥Û Iè$K¾îÓÅôÈ:DJï_Z¡¢³JfÙ4|Õ¶;ñ›\Óõ.[‹9ã fœÑø€ŠüzÂNƒeø^˜„×+Aѱ¼–{TaU‡¦ÑÉ|q"ËIðØP¾%©­,›´¢d˜»è”ß^7Ý,íÁ&V#pÔÎrÍMX£“Ü’Ûzà;æzD!~ÙeF¦�Ö– 8²š¹»§@òé0¡Í±�U°êÿ�²' d-»Å‚²¦WÍÕ1-vƒÒÆØ£îø1ßg´9|@`�{PÆ«a¬Î é@çhíq-ÄPÞÈ �tÚMF^ɬ7ÍߥÅuµ6�†ÿh3ºîŠ Žsèõï<  ³˜Rylýy/uCÕ¿t¿d'pòW=°q߈ûé¿êZRÙ&öß'°¿c*áËÂ4wlÙÒm ú.|«eù¹«fú£rpÁ¹}fÄo'Ån\Ôv»P 6` nj%MøÏ¢ HTtùhÛQ!l"pY·æmE­õw‘ëØ&´^¸?CjÚþöU±Ábê�%s|ö¡¬f—¹ñÄѵž;87y–Üÿ«6å ÎOãIò¤¯Ìw¿²“ˆàþdÆí<…–tà²Tý'L̪Käð׸p|XÎç8¡qwx¾©Ç-JE¨Ë¬SžU,Â:å`Á!Îöl‡Ö¨yòŤ‹X²ë;R'"u‚zÅ¢_kTã™oÕ�Ëmì®W®t·m�&z¤ ðco{Ä‚5s!Þ£sVaÈo‡+ÖÇò²‰}ÞhEr`b#¿O)ëÛå%�èêjâ5ê0Æt¸Ò†GâïÀ»Õ™L€Bz(‚Àáf§}U·ÅñŒ*^ãdtG¤Í7žS.æg ¶š[³Oúÿ¾M®­c©^öêA,0g�PÜÍô3eñ�§šÍJË2wg´¶Û=HeYtùmÑëx§ÉhïH²qò+ËWR ÙS_â†æý¥Š í´•·Ì^~éõ†W›Ãt4ÓìZÅmm°šúŸ¢1naç‡ûCYÈÛñž÷î% ¾+dá2\ R\ÜqرLLYŸ\ôžRäT¾1Ü bãÀÍä�…Àñ{~1ƒÐ{�mo‡MB„AKìŠínÊX*±ì{š¬…Q[ žGg¢õêBèÜ àûÛ.�ZÙ±�Ù*ζncz¼Uˆ�µZgÌPVñs@$‘þϬçW�ÃÉ—Ž—Ò^"¢Á^£÷]˜Ù÷ÁЪvmøe­ V=n/½»wÖ¢±ÉIófT¼ €žÏ¢¶ž®jm+…#Tbv%86Òt1%ÚÓ&>Kœ=þÓhCï“£Î'R³¿Çž¹Íàö à~¾ { £O“Ú—¾{¼x0ɘV8˜Ür6Êœ} Èæe˜sín«“Ñ;nœ|æ6O‰á8%†ÊîÐß0‹û¹<%&Um�ÇÚkm[§‹‚ÍÁ}û– J8Ö¿?y“øÒÔl¼Ô{@§%‚ cåX_zªHá‘`)/LbÛ�ržx¦e¹{Óû8”m$˜okœ®â¶ŠÇ™' åÝcÁ¾�Í0Ý2£>Ì…Õûkâܲ�0 ¢×Yh%#§*&PDlˆ»-ËËëbS½ç™@í�–¤nj±d]؆„•±„we6c[©éaòoè¿~Äv¥Õž¡¤=©2.0&X› îá1 p9fgE' ®µ¤Ô; nåÂ�´ŠN£ðè WN!Ó£=;äRû¢¦£¬è�\3 &†Û�iyû— Îs°Ë†6Û¸�ÛÔ‘²¥¢ÀÄ.$ÿ11kuÖC87»Z^–Œ¼€l�j íS¥¨Í�…mŠ[§²lF‘ûlš�]y¬$Ÿ†¬Öˆ|ô㈠”±®æÛ5Åâl¶"h 0…%u˜ÞˆHïòÕ9œZß\(B tÞ‰úÞ´Ì×—¸ ¢³ùΥ뇙¡°r™Ã#…€ëGí�™ƒå„Ï–}Šsõ�u¹¸àVà++‰ÀÅ6ó½äV²FNH[Lu¸i ˜û�÷ˤô»^¾Q\üõÕo–VW#†0W—£¨óÛ}7»ß8[OVêñÜìp•ÞsÁ‚‡ç&7£~¨ú˾_rBÇ �€óyf½¢àé’¬œD-Çrl€ýzÑ�œ'¡¨>gm—,Í®Cj¸s’U¬yÂÇJý²hžˆaæ¸2ÆZKζ<Œ[‰dÍDyú‰�øR0Ý{Ú™š<9µ­^Ì·ˆ°3”0ï|b·tÁƒ@qAÁRçI·ép}7Î £>\øüϪ:*ôgÃb0{&Uvõ¢®Q«—Ï¥»X�±Ìü€Ñ¼Bz¹y8‘²a--߸ùLÖÏe~IÝA‹_ G;¿>ôz Ä-}*Ý™OÉEAôÇݵùlby¾cÕo*L’òŲróGàÖ/öò¡–°�ò½ Î�+ ‚ö¼½>ž§ÚÝ·Z¾©@ö.ä¾,þäo´ø¼Éø‹Äƒíûu¢•w©¯)k­øÛÀ.<Žç½åƒS=²8ËÉ(®#´/ÄG\ÌÌNñž»%´ÓÍ.äÄ+šuh®ŽþhËØÉc ®¯! 7IÉQGƒ†Ð ¡sÐk´ÀƒÚIã¦gK´ݾe¡çôK¿.%$6µ©šÛþv2Ý NœçÞ#†:-ÖÓk�uSp宨¨<ð1µx$ÀE?컬$ UF!V)gq»¸Ö4[ ÖñzSk-¬è5Íúoòk¿W­‰Êx–Éß�üéÈwqrä8doûgø»;�ë$(@ /FU“¡ Š—ͤ9¯“„¦õ1\ÔnÁâ½êDpñdù±JòQ%-œU3>µ¬é.ˆP-Aµâ$“îâ3úº¦Âêôf±~½õ“õÏŒüÊ¿_}Ø�5qÖÞ�!·‡µ'5}XñO'`å²¶B²~%°ºË•ÔúžåÜ’D�¿äëa|óW |‰å Ä�-0!¡XN5NÝNxÍ£×K H*@\„PÈÇVCàÞȺÁ¼ý÷)#P#Áü>}±çžúËär_9=BÓG¾ŸmJ}×QÞ¿ÉÐ�[æ¿£rlÓ>¸˜\Üï_";¶÷0„j â5qÐ2Ös²Ëæó�ÛH .¡p¦Í’¾ìܦMÛ»¢ :³¼e/û8rÓÐP»ÕÂNíDg%¬U´ŠwÄqß!©!ý¶|í_°õt¬ŸâØþx„ÝÐt{æC¹HÊuT.!Z/v5Í9k‚Ù˜ÆÏ¼à˜î £yۛC›½¿°‡q|ó{Tü¹×W03 Nå˜XªÉÏq¨.HfáG†Æ/]…‘tJpÌa¦}¤¤ú']Ñinud—2†"?<Øî¤½rý:NOÔ÷×ë¦lð`3:"E|ÖØáÊÎtiz«h<¤ ÆÄ…ZS ÀŸv{m"âí­ˆ_[á‡eÕL¿_·QÊñ“Uœ3eÉzΆ̑ÏíÁmDÆæÚ {Ò!mÒBÓ‹üÁa²¨ãc»]¼ÌÅ„´Wb渱j¯ÃÛeч0¶’J5˜¯NÁD®ßp²Á1®jäÐDa¶4ñóIÂϸí™1T×ɀњ×ãGª`¹pð‚­ƒ¿e>Ù‘#‰"7=ê e: k87“yÒ(mVQ}/k/à„�'Èæ¡: ¾£nXNiÆýÀZ0Ôjd©kÙܯfµ7$eñý/CÅìÛãÕã†gãKêåQÖ½(Âàç�Ö{¦A�q¿ë’ëJ‘å+Ø‹KìóYÑ?ÐaÛÈ1�äÄöf÷-zÊû½ë.ÕN™w [aá×x7ÌB)¶” 2ºl²ãƒ½´±T AMý©öåcBljE.)0Ré=±ãÑ£à»]“i¸+–#ÛÝ¿œ,0W…œÜ”€ô¡3uX±O–‡Vû;Æ.�Fç8ÛTA[àQ•.ý´RÐmÙ—r ÙǤCæ�Ûç;iyY3!eŸn5u� ò*í/ÛìŸ:Øs%Ϻ¯@&‹Áb�–n˜˜1ç:±×õÔAChË\B.”yIË�®Ro×pTnäµ§äZ’µ¿”íq{îÌj·Ÿ·°JPü? 2â¾ûÞQÀ�¥ú i{îæ=‚�,í –¦» ˆü¼À ðåîB*5JÎ|@Ös=V\dÇ…ø’ ©4 B®:ó†ÓyÅÑüÖl«+c‘Ì^iW÷Úxó9ãÈKY‡f }jlܧ·*Õþ3c ’ôJõ!vZ‹a‹öÅO°‘ÞX¼0Zn¥ÃUxóV®õ×·NΫ‰ ¹lñ`¸<_r7¾wtŠÿK™sG x¦7Œãæ°¼â�Û°¾'è÷ÁaMÃß—ˆ£oÅ7úÚ°�n—‹æ”3˜zñZ $äÛÆ`U°Bã�’�4¥c8t”Sò‹pP�“¼Æ®NÔ!µèܼN@ݯÏq òÏ 3@¹‹B9x®w¬.^4NÜ�»‚ô]sb›^Úÿr+z … 1~³so±¹¦Fo Ÿå ÁdÜå<Ûý —å§U½´%ræÉ¾[*‹cÙlÍôïÅÔ˜Yd±!®âÊh›Ÿ£�·8ôO�óàäuœ›ß[×�Ô©µ†Ï%_ J^^(o‹I�Ng†,˜ƒjëpŠîÅo¡Y$ߨ%ÕÉŠ®š±“ÞÛ@#Ãè_4Nñò¾vHâô(�Ë5•j†íï>¼l!¹­ÕðïF>#šW=6ô¼)¤Í sù¸¤$¥r-@5hˆ0ï‹�âÛ×ÊFÁy©d¿’ÍíAè@¾øGx¨YõzQ¢�� ;€Œ¾§r7+ˆcWñz÷ÄƦµ Výcª.ƒ0Þk=ÆŸeþ¸zûíû ‹û»½ ¦'ÅN”î,:dx,†€­K%rS}#ØÀW®i�q‰mL¯ä¤«º¢-ÚsfŽCßC#cÖ:­|§�Jë­6ÿê£S•˜<²m–¸Ø[û¿OŸE Í«­ÍL�ŒäZpÚy¸]\0ä“) µÌúâ]n¥¡€ð%ngïe$8à�J;Îo ×á_yÀj¸J�ÕýÛzûÖ+e;f=RJå¤S«ì¦T@[¢z­†Ëê%nŠW-ÈîwÞÌï’3Ûh3ºÚ1iÊ *†ß!½|ìâ¬Ý÷JzwÂŽ4—q`ŠK˜lYúìj£Ù{;K´‰-*Á!�yu²Š ¾.ê<¢ÓW.áKñ?¸·sµ¾Û…öÁëþ†pŸ‰×#Åèçc:Û»µ2¼?%ê±J…=¤Œæ� åç5AõuÝ´w¯|Æõ”`(XÉXeGˆ²E„ÖÆî;áý{�U\aÖQf& ¹ ê³cWáÚ“Ý8î6CË#•¦À± ÀÙú^g0¿8Æù݇ÜÕúõ ÖöôÓJâH!äTeÊSœ…mèØ4E‰ñðdmKç{™à¹;aOn4$ìÈÖ|Øß){ܵÛ?€Ÿˆ‘¾€ôŒ8ô6nÚ�÷ÁµQuàœo\Á@_ªö…ÚÈg+IÜNâvg½� Û°·²r·uˆÉ.ôóvx>;ò3ª Ðô‚EÄhû|”„«ËÓ°0¬j XÓÔ�Ž€dÃ!c¸ñqȃñCTaG ] !=�# ÖŽ]gc´Ëpû¹èìòÖm~¬’©ëˆÕ¯×t(t„ÓÈÑšl�4µ±ßZU°Å6:¤>¡}¸Â8jg�å?½pÐWC;I�yCËw†û6ȦJòÖ�Ÿ‹€Î¨g Û'DÏ‘ùóµuœáÈ8“%I¢ãw¹²+�²ð÷ká¶^wЫ83žô�,¼bës>q³‚Š28‡n|;{ò—$žMYw�e@ˆÈÙ&}dÊw\úÔÀ]Ε4 +:í$b”5BÛ"tP\¾] o\Æ-¢¸.¦Ëm8Ü[Öp…$˜dÏV DŒŠy¦û4 ä«mþ1zD7u §µ£‡ `·X¼õè$n€šVN ùwÕæ°ðjåŠàI¬V8ólׂ2l‹(Á1q|*æãÍûJyË`ÉÐM&5îøð»6·:Æ�¸äÆp!=4Æ&•ìï´O͙ꈎôa‚;Ôþ|ýLB0ÚÐx4ywè¯� 0E Á_×Vão·ŒÊòsœ2¹¸Úq2âù`‹I½ Ü(ć8Œ‹mèÃ7|©ˆÜÇÄâLWF÷¹ÐŠé8‹Yï;èÈUŠú¸#A;`ªÇÁŽPË’iº|€ðˆ ‰C´ô!領Ž0hœû ±ícê^‡RçIbóAÍZÒ3©êó½¹ÁEï±M¡ IÞ¯a;GWƒ÷Ü•Wø¸UEÅ.»áª&ßq|dÚßÀ†ähJæ,ãVØŒ@úÛ¨ ,·‹ïÓÏ¿¿´„ñ£ÞšµB9¾ñ–#ô=ù¥i-üf·¿‘u`u„§R\= LžË”@w­nº›ÄÝPÍo²$[4Þ«’£aé}zñ{'µñmâúI“nÕ©m†Ão;‘&¯„ I|³ç*&)™©^cŒyLØ…æû¾jFˆKÚGÅÆªŽ”‡uˆyt\¾]ê@VJÈ.&ïÈÆm³í‰±'Ýò¼w�œj¸Ÿg½d3KJÇ|»–÷ŽÈÁ–#h§Öyšwºµ»Äì£L‹�”,ŸERõ;¢š© uÅd•ÖX÷ØÞöÞ {9?¨<'£ ðÝîoÌJ·>Ò#Fn0ËôÑQ RݯŠÝ²ù[EXÏ\t«Íž#LŽV£†¶¹îãK�[^í ÃIã²umù ja†[�6™‹ÃþVI‡’£z6³¡pj!½!>9+û+€jµ‰+À.¤atËxov˜•ûxÖû‡ 2¤=)÷´ÿAÓSÅ=r&+Ào']læ’Þò\{¨·ßYq°N-ù'Ù 'à÷¯¶‡ü‚ºdL@Ì/Ù*†j_fm½ßQÏ®áË#½ ¸ZÐöêÆd2¶_ØÄ«ÍäÏŽ½µ¡Üõ†© ÌñjU� ÎÄ jjø>ø^«Uí†X¶3_Fñ¦@Òœá•u†ÍK‚‰,ã›ï#¿v^F8p©S]r¡¡ms–à7B'ìèéýZ½þáv6ι^Ðõë“fò•§’ìz[ÎˬÜ&ÐÁ’uÖ"•šÌd{nh*]£"k*Œ×R·JñV9- Õ35A£Â?*°W$ÄW@9f! IŠÄå+®¢„†òƒDXZm>]‡b6h¶^2Ã…Àñ…B¢2‰Înâ÷›/æB_i¸z ÆFmZ<åFÎõ¥ŠåŠ7[|¢ù³€ÁCT@�1 ËTÙÃ30H#F 6©ƒîó®VR hÂ*ͶO©ù¿XÇ“»¤dMëKŽçðæØâàG±”Öžö$Û?"YfkÓŪwn\HܬŸ1¾¯O7ööëè¯_poYÖFè0f³0aÿÌÍøþƒóð>~~~ŽZ×b‘Ž/—9¸]îÛX3m àÌ¿ƒh—8‰,X'Gó8Â�«BeH9G½STý'Êbd`h-Füæ¤Öà ¯jÿt6c{؇P ÈÀI>†ìCÑòK[ÑÓ4$H¼ò� s¥Ã°ÃqÚPß7™jYy¦®Å·ÒUÄ~Ÿ¾iPèËŠƒî̾Þ­ü¸°‡Ù‹›Ü[õn[�êwÌ}|j… «ËÔæÓ¶ §Ý.M/µ�ß*¹ Í ér[˜‘¶$ö´D:i}IÛœ\H¦‰˜Ë·è`®C¼è�îânB±yÍL:.®Ž‚6_98·Ü Ękã÷gG£�Ue+ççô¸åÌS†µŠ&‰#ž†X.-E—ÃA[Ò”÷³o™Ý-oɱ@O¾}ñ„`fÜè%̉9 Ïhþ¬5/Mk@:´Úp·ÀldÙ‚9òãŠ\ÇS¥Æ¶Áƒ*F¾2kŒÌ.*â^HÊÀ‹fY~Kæ÷ž[‹Í}µK~ñâ ¶43óx+ÒÌ�4ˆ3£Ë—‰û›[èÜ£�`�pkM„ïr ûîªýéñßJºUãgîc_Muà\O> _˜g¸ŒÆY»jEð. ¯¶}t…FòЬ�§g&Â#ˆ\”_B‹¥L"×4˜ö4ü)îÊ{·öŸà³Ät3È�Ðáëoµé›( ‡$jKfŽž¯Ž9³\.²p²„ôo2!‹’¢Úk6©ÕpÓg+W�Ž.@µGqcµNVMJžêæOXÞ›TõuÏ�ÛÙ„ã`‰ìÍ”P+éCé °¡–ùþEâ-­b­V+||04½û>5¨0Ýß$’Ö7Æ'0¾ëPH(;ÙÌ/Õ¤HÔ{^Õrß!3‘�ŒòÓmÌE”µ¢¹gø¶9˜ ØŒARÆàJoD–¼j–ÊþÖP~ˆÛIqÛfÄÉï.ƒ™ðÌbǶ_}Î.ty­rž"Ä �7ù£ë„p>Æì›«Z¦†p<°Šüɉû#‚"ôlœ9Û]okYÁö0#€ó^cÌY"ŨQÖôóI¢ý©‹<]ã£ÞüðÞÒQ]%ô�+E¼÷×Á.R¢Û[ƸïQz¸'kD¯…ã…Ð9tÃæ2„õ@h£j—P=¿t¶h³Ÿdúy�xz¼Î­ÏxÂý¦È<ºÓÝn-µVIÝÆ±ìc?¨‡KŒ .µ|èÂÖÅ‘ånʼn5ì=+#ÔÔTf€õä/€þ ø9X²�o‰Þ©¿\­ò†J|�(˜¹ÜKô�)Éù¿kkt¿ek­�NÉÏsµo»‹úÔ©+†¥¸rË{Q†ÅvIHgY´œóP“”£[“p"üƃ€x§iÊÜKó…uã› {}À °.½V\µ£�ºåÞmð:wg¤�l,™ûžùA"[ä+†ýlZƒÍÐCL#Ï óGl„Êà/—�]+YxWÔÐ4@^¿-æJ¹ªŽð+Üßó–° FˆúÏÐ%/ye°©ô-±u§åfÓ/~Ä×¢õ€¸Z,O#_+®z§¼°Fg§!Ì?\ÝÂJ}£Â×/ x~ÒRïC§Ðûá¸FßÙKÃ0.�ÙèÊel_= 2P#ƒû{ÆýáZýSá…påíÁ‹ðþ›ÍæL´WÓ�&ò |Fâl0è®f¥œÚ%1k£Xžû’»½¹�22„¾Ìž)õt´©³éÞø3àŽò79Öã1/vÅk42ÙÂXu=ÎsÝ÷¨˜Ü¹ ,é˜ËÆ_¡8˜¶Æºfr]}·=KÏ\›:iµƒ¥kj<µÃr5»{%‹î`Áw$¨�`Í~ÅžÔàüÚ'_�§éãöD6G»kc�7widmdÑ!€�û»hh3ËÎÞ“b@1ܨ,0ƒÇ<ì[�e˜põ©®¤=V¨z¾A¤þž�<«» Á_qrkºŸ^ÈÙgÄ€‡B3ȳ¤cRþÎ &Õõ” ÜzŠb¾Ïæúˆ]þ3 î,Îø4ýnn6îRÚ„—äÈšùu×›qZUO6TÀZ,õDm�$KÝðÄbE²Êö%ì›ÂN0WÃS'Ì×>Å¥¯#Û_0ç<B!ÕÖת*N6�Ù“]“ÕÞåIòEwKUô®¿q@ó[([:=ü˜�—&±Ø¤ùx¾é¦Žn•²Óœ¬ƒ«d¯¡îB´¦{HìG#�‘šbqP ¨¥õöãxîç 6R‚E^Ï1xŒª¶úx Š0[ê;éÜì5ñ)Øþ~&3Þ¸ÖS]r;ñ.Åh zÌXA0+1nQX>{8=Eþãúõ\ÝN…‰1‘ìSµúWMôyû­œªï¬Ä©�ÀÈ5¯ÌÚ†báì9>dkY �Ì҂λ2eñNÐöcYК1°i»°žïðóFË÷C²ÙÆ,|5ݵ”ˆæè4â50Á$à2Li‡wfå €Ü�‹m%p²t¥eÛozKÅh¦X§P‚ ¢–o�ü-@f—î±öx!Þn�¶�È)÷n‡•ÑÞyŒ|ÄÂ?vAƒµØ-[Ý��o¦>s:ˆ³RïUR[«ûÐ÷Ì$>÷´ÐÞÍdNz³ÖÂJRýhèr•¢Ëœ¡Ü³ÄԳܺ^ÊÁK{p.„®+'^+¬eF‚‰îaâk›ÜøöùJe¢8\½†“0×Óp��=s5‹|—Úkk&øûy‰ÇLY«m�myHgg*±pÐÈ›ÙF«Z7ÇÍ8{ðÞµ}»!•ú“Švˆ§ÜÈ��K-Îén…ò–*…Ý=£UÎL̦N¨R"¡A= ¸*n^в1°4¢ê®…½ã‚WêZ8ö\�Ex\øàE»¢k½±¾+�k¤ÿ­à“önVrÄ¡ÓÀ._œe¾/6¥¼G+z »5F4aÖà?ê¬dL[Ù½®Ñ`öî¥ u�„€þ3R{Û.eqÊ�K+>·Î�r€Y `I¯m##Sºb_@j²½{r87~鞢õ™Ï9%8î¼õev–³^Ž2ñ‡úpÂ3Wbmîçæ�vØs QcZÙŠçÑLç=†XïÞ`I¶K« 9ß›ŸZ¤ç#ÙtA¹úç¶ÀEÑ@A¥S9Ϥê7#8j}ûm<¿ó‚c„Q‹[îo¼lGK‰*Ô²n–9'cNÑj'K; æè àg�:Ӛ߈²mZ’L$‹èÈB­!GxôêH³õã™vp`S/¶oáüº¾…º"5ñ±ýbk<öý­ÐÀìäl£ Àô1qÙž µG+‹Ð/Í¡dƒ�†ãí‰õ�«¾¿[¨X½Ï•aÖÈ$ȹlá%Κ; s �b”[*k¤d_»÷m ɽ^·ä=l‡ °­�H™ :^âiš¸gŠn/r÷w ¹ÈGEì0Ô°>2–^ÅbÄùÝc—©N0Ó¿öüû½”æe;;nw¿÷ð~£ì"ü|}Ÿ¨„T€RmäDòFNެ óø¿Û³¤±¥9Œ >hÛ÷7´ ŽC‹®\ð@‡p4`:ØgtÔêìüX2ܼ*`S kgóúïS4²³^¶á1Ó6e³s|<@¯�ÓÇwg[e|"Ut¼îÖKr®ÝƒÍ,e¶<ö¬…¶ [ã£:˜“Ÿ¸uÁÆ÷ Š¢Ùî¢þ ^_’â�m_b¦s™—nñ1gŠÆHTñ¾>è5%§SX=]1È…õÁcö½É«Pk^÷?Ù `ÝáÑE;„Ø( Îf|˜`*Àå&¯½[w®Ð­ô‘<Å`ËL ÷”;V‹|ÆÐ5ŸG;eü³þD‘uE�Ìÿ0f`Â/›Ýuœø ~a9#ìmm × ·kí׿Ÿ< `íi®Ú}ùÔ‘ð4p°‰ Ón«�‰ˆCiÑ�Y05I!‘Aˆhø8y”õ�OPK•ŒQ¬�kŸf’ÆöîfÙXõv CûA)U_=‡d™W%=.–ä q;¯¶LýÁüƒ9œþ÷àÚ¼¼ô²½£êÀkçÕ² ïdÙÒüW›¿ž\`ÐïÌð}v*iåç†Õ ÚsUʹqJ°îÓ:VR¶o VÇ?d"IÎIJ“Tóiü�‰Ê¢ $Z‚+Ìg"+ò Á¶yÒ¥ŠDs‹o`l÷GÊ=¢\böÝV‰¹'Vq²K5†Íî5WÈ™¿ò¬U“&y µ—àônG·™R2zJ볘û õÍ_@X…hsÌ·V4¸¦^Ñ#Ô+E�íµ}ÉÈãÂÑ~½9d²JuÛ>íÚ NN,Ö÷Úr»÷± \}P7*QË.yÄz¶Å =3TÀS&�«a\´õ1 \=9@bkç—Sõ£¤Î�åÖÞË=7Ht80ßpÎÎù¦ºœçK̰‡bÍX¦83 éy¢¯Ÿ•.0©`iÙhµ�êèÉ`…¡6Á¯Í]^3RÛÊgL‹§ÍT0.ê¯o²YÎUæÕ/:‘Pùîçd#|bÂidÔ1÷„`ÓÝaáø/mÒu?s�„¶ 3OÒÇçànQéAÓ7 ÅÍÕv\^aƒKÃ7ëèRÛš?r,ëB¤Y׺4XCWÓ¼òËSÌÒ�!³Ö6kŒ$j±”ŽG–*7S•8‘Š öèÖŸÖ;Ï`Ñ´ÙûîßzÃ<[†üô}‹#n.¦8]ŸÇµ6º%»>x¹£â—KÕÚÍœÔ䲜L¿0ó– Sêæö�ƶÆf $v†¹7‚¦}hõgI·ËÖÒWmWC•c0Ø©ä]ÎKÿ›�Ö5ɾ˜»'¦Â#­òÐ�¼�àZsÝJÉ݃ &?C‹Žò«j?¼©°:=a\gjßmyÓ::'µ½Pï¥}†�¾¨é5‘£¤~¦…—ÏW.6…PƒWí†-㓜Eê=´ù¹PÆ�éÒmœûa$)‚N$ÀØ„Ì9‘ :“Þ7*Xðþ¸TO`åöðâg¨5Å€øŽÖèe{ Mt÷[6KSïˆ^ßp½hŽQw„½„¬0Þu«h캙Ëë…c×-åx©¾˜]|ì›údž�¹ ‘ÙTâH!¹ZíY ɰö^Ã'&Ï\;æÜ”ó(R�ÊÁ•µyÖ�¬ä ‘íŒV%¯71H–Èô·¨p^-:ªÈ]h+qp[´©~°&O7Ú#Ó% 2 Yµ‡¯l/Ðù£bÞyâ�ër[8ÓS¢$nÖREœ¨põ•ŸZ+O.%5¯¶æäó$;m}›˜Ai´v{qÓìHºg׬²„í»¼èà„“�£FšÉWjËöÑ1\R²¶æ¨ê6ו³÷|hÜ|o «2Mi½jaj!áÚ«Ø ÷´œtòõVG‹Â½¯£N´µ:ˆ[I¸î0ÙC%÷êºì—k¹IŠbZÔÔm«¹!tëHïådA¡³êIõ›‚Ô¸í<Í~ÊtŸ›ÎYÔl6ä�°pI+j;šÏÉc|õö`Y!˜v½Še~!´mOògànFJ+žÙ“6Hh©�‚sÿ{¶ü¶½øã)=î_øÀe>¢äüìÞæNý#pËz0¹i;`=àÓHJìZ™n¼¢èà¸obžß¡�±kf([eîhƒuŒnж/ŸÞ븒�"6);ªdä>1kµìù‹Z;þÄÑQàø�¼!QfÈÊàBj”@RÍ'C5ƒÃƒK›‚™—JDqRr�·OÑܸë_-”m'DÃ{N6 øU@ºƒ\MÔvâF°ÐѦuòSçé¨åÈ6ñŸ¬/~³3³(}G\�²jÕ v«¦<Ý;ƒ»öL3Õ#àá£Ý\' åtƒ­Õ(7 @zæ¨gŸ}ßuÄCæÉóÁ7{ÍJÕ'Ζê·ãù+¼jæ/bz´eóë—]qÇ`[á0s|䮵ª†?{“\ou‰¬™Ùq¥P«Mß»¥u3âÃwvÕ> ¤š-8â&Gò¤�†E=dm2T™8Ï=¯Ö2µêÀt=¥\ŠW²à#=Œé‹šÍϯÀÝ$þÓiX�Ûÿ¤>%G�¼tm'tiˆ}Û…º;8²ÚÖ«é0ƒ“ f_Š”O@Š€{>v? e¾Gèdx(„ÍwIë  7b\Eah1È2i ) 2p‡˜Ù8Œ…ÇЊ½ 8_ÖÛzÎÅÑÑ,\{(ayËäØðnN•Qde�ºl›FSiç¯úh¯’ î�Ïð›ÙµÁ¸jð•Yl4ÒßWtÙ5\[??|ƒ­o~_�0Ý]ØdV:á„Р|.Ó”Ü_šLÁi²vúyãxç/‰Ÿ»½§ö SC‡¤Â{ŽV•Œl0éø`‰�Ëo†±•Ñlma+›ªXH›C³�û>MàwÁÓkZ–tzuÎë︱Þ1söQä * �èPØ"ü»”ZbÊ>Ey½i ¯E { KdÇ͈¸g©kµŠ³� ÕÖeËÝ.·G#T¼¦p†xžHÁà‡§,m‰€,²ˆõ¶ÕkxË4i63w6 œ^ü×Öoc¨ Ø‹|úÌ úö·£ò‘èÜ Ú’æ+>3!œQü»å÷÷:[¾I#å“„»î°™ÜÓ9Öôe b\¨i"F”ˆÃoi�n¾^&5À³êÚ6½8nÀœ,ÈÁ¨¡¼Æ¼Ñš ù†~kmÀñ½÷èÁOËk0VÚã;—ª¬»5íisî*ãù¶ú&sa}©gUC2àͦrE.žÀÈ9WȪœä}�Í/"Ø``×ì¸ö×ï1ò„ë&äÒmŒf�ÂÀ+/�‡¢�Ä/±ÏjѯEo3a½sç ¥ˆ°��K|=ÜjËlíÃ,Ò�hãaë¸ �Õºu*'-[Þ[Àº¬~[ÊÉÝç‡Cxx¿P¢‘GTq:.á…Ýý° �Îqö{56œ^˜—æcï”ÑhdNš¾ FÃ#Ê.úKÍHfSG75–ùÊá¤3A ãÆ\ÊGÓ´`_«±gÀŠ™WŽs±•[—6 ú"›�,–‚?<ˆZÌT±úú]VÃ\Ø^·%p¾Ñ›ƒOÔJªMÆcóþçT3œCãö·GÞY×Ók½ã�¼S~s1Ô¦$c8Ç¥é*«Y¶M½ántª]Íc™´H=; ú ›¼;¦¸›} U±O.+Àã„@K,6¥¿ò¸ Øèx\› A."áâ•«xLMž?O6BéŒ÷;—a[`}ήà®e®1ï–›áz·^¯wwÌ idÖ6Ãk5!Š"°åÊÓá”®=÷AL የ¦´««¤ê—˜¬ñå,iß ,kw°´9}dEÓèì/oŬÕ7˜Îÿz‚Âν mögwÍhˆ�'6«¸öC»µ“TÒʆaC‘°Dr[L¸Øz+…ÚWÛr¥ˆ&>°QðŠÕÖ+%¤»ÕWo3�kÈï´]Vk6ç�r™ø*Å ÌCûŸ| <¿k™)r›äû7Ѱü—`°xþº0,CŵdÌuÁe€—bmÆ:ŒøÓÇYpƒ«'ûØïm›¢x¬wÅj¸úÀ¹ê¸ã¢¾r é`»Sa†,É ±aÐ} ßs åÊsDÁeœæÒþ…è¹Ä}bót4Ÿbñ Déà‚ñŸo®%úcöio¬Äµ–Îåò°ý¹Èüp¢´m£±Ø áÃùHç&|SÁ3:ÆpxfòmÄÐÍDœ�d•qÒqé†pâº,ì•l‰²£œ`ÑÙÄw›]qG•^ÙüQævŸ4ê:1Œ �i 6ù´(Ú†‹pX¬þÌñjûLKMg÷Qµ—ÔŽ¡A'ªƒ Š&±em\k ÃßE•¡©¨á%vÇŠ½U[“«S¥ŸîŸCŠÓ�.¢ñï†nz¾ÍÀÇêú¾ûàác¶q·—Òî°Ft 1Ⱥb[÷†Y/^Ãävàš â¾ –o?´©t½û⑉¹gr:vÇU4ÆÅRÙÊè”I1ŸKêØÒÃDÿ×}FgÙKù³dÓš·¤7+{¹­b-ëR¹à¯¬˜³@ÏÒ®`ûZc/¡ø©Œ¨aÈvù¸�§�ºg"nSûlNå•§·Þd~bÖÜÝã™îŽ”Èô§Fû›b°j6o�Ž�™+`~;unï�èÙy2u˜–kñ¨ª€´î?ë½2“P‚¨~öx?@·_s¤ŠØ‘Žt ìVùõÏ£Sgú/Ñæw‹ª´a|mÛªÀoà!bòš®u`efw/•&$µ;î!róAg±©ÚJx;àßp»€�žº]‹]ÒmÌ[_à°ôâ�ZηÀáRN>W+ÃüÁ�T"éÝàëCŒ}(¶r`¸De XoZ …c•¼Ó�©Ù-úû°µsUQÀéÛƒ±Õ˜<�]Ä+ÜÈ…¾–tœ3gHÑ+�´¼B>Uʈ¶Ùk=7vú%mqÆ‘³Á0Ý�ƒ}B¶… ŸScD qêXhaDQÔd5{Nv:´–9•¡>ì–é®{ÜZð7ê FƒÈÌl$³ÞwÝ¿nSàR¢í_ˆ dÕ²–ç"¾¿×pÞÀ¹ðU´IXK›uKõ}9‡¦àWÄ»CŽÍ%;ßjƒ:† måqm½ÿ[eŒnú2 2�ˆÅtão®µ¢�‘Þ†ÁÀn>ˆÕÇÕQ‡‹*èI¹ ‹m$0FÑó’‡âgñ 0¤“²AlÛk@9ège3¬HöÑ¿Ôv.oÛz¶ù8Z®ã!„#0øˆy¿‡°½´à)9}½­<ÏÛG±0_,Ú¯dò±èÁ1í(Üfi¿=žYäeuËЦ˜'O«NôúB[×vÐ8ö<þÊhy۽ܾvH,C ò™9ñ@\£ô‡×óG„B‚ªá½>´¶»>4;ªàÄvùàDNhJó+¥¢ÜBs%.(×z~�ÿIoŸœó€ãHo§ûA]~Ù¨ãx«åž òyþ�?ej’× 0‚ÔK�9�¥Å–4�ÞNëëe#\hq}.4`æ;¾ÃÁ½Ê¡báö»n)n0c‰»>íKBä/nèv¬}hÞ.:ùïæ}ãR|ê`>ÝF˜1a_™ÙM7æê®D) �ƒÉ@õÈQ¬Aéá*€‚ ]u*,‡�6LkªkÜ'ŽöÌ«ó¨S@C°±Ør¾ž›6o[�«¯Ör�ƺ�°Þf ¸çï˜4ÇX3Ìdí8Û~±Üåå (Ã/öî Îk®Ùû!¡ô8„i¦½oÆña±È�;ŠY,Ó/1qû·n±CYÌYŽÿ˜^7Åßí‹àCªƒ¬+¾±Û0*‘é:ãÐ_䕲>RâeÜæýÒíC3vŒ•SãùwwêößNgm’ÑV,‘ËS† ƒ]ΛW­Vº°k €6±ÚN,6²+º‡/¤PXøØñp˜wÊ-ŠrAÔ}¹œWG\»ôñ%=\=²Šç ]XÈI,‰¥k^[\ç±)']µ»ûër3!´ÙPB}4T2' Z¹›æ„ƒáqkÎ)°ë`moëŠ'÷º8Y1>dÆzoÊ¢F+_h…;üM° ¿Íƒ3ØfÓø�‡CIµæœ¦âWG�\`úå›ýDŸV”ý~;†³w µq+ÊGýƒßlta‡„ƒÈhÌ®¼Ñzøä™ù‹N±°¼N,®ûõÙb·*šzüj G26›uQô29ü ·âQÆ|ÉqžhVNÚ+ÃLv­9çršäBžJÛ÷ îÐ ùF`óÑÌH³rÕ´¡,E…oŽFhM³£“uJà"[w¡ì®B΀�#�Z—ó£– ‹nÝç4 v³¡#Ù¹²{¤®0ÌvN›läŒx�Ä�AŠÓó–næâÐ]Å0áýÖ³Úˆ’·MÞÛ0S&åݼ£ÉkEo‘zOב¬1TÌ�W-n¬—— q2‚ã|¢^)œ˜µ®qmœõ)íÕ %Ã#¾Þ/Õeá~0ÞñÞ „ç¥K ¡g áq™8.¾G%Î¥�‡VmÔZã9‘¹Zv&uÇÊ>1'Eà´{AzPÀi!lÁ“Ú_LÔždZëC¹£qöÆò€ ×_[½WâÄêøL;„ÁT'�Ñsð ÉY¼ì—î^’_[™&Fj(�Ùmœ &†”sJ]xÐ4ú4‡"š:ÀãU) ¾`8 üèºe_XöÌsÀmÕM© ÊãÂÀ¿9»`ý+QW,Ãl¶31–R`7ôH™� ¶ŒÀW±p¸©w´6Öe´ãÂÒ)¢ÛfúÅo …{ɤ­àwõÕw°A¹Ï1w,¤Â�‡3ŒÀ ìyj¼6Œ!8 ËIw�ŠàMÏx¯ø[FÀwµÕ¼ª1瘪¡w²ë�‹°^ØK ÒÝCM\ ºH™&©L>2§pª¿J¢Ÿ¦ÛR¨Ô¢Ü'÷ð•5’ÌU¹zm»bGA {"¾ƒ¹~(À�Û y¡jŸÒ�Ê—Êj)ø|è܇Ëås?É`vS[Ov]¡¡p‘4í¨ëwQ¾ü‡ïÀ;¯Öˆ×±™×M®ÿXDà`ìëÛ“ôÓ$È:Ÿ5¾‡²½ÜñI+0 �!D).È�4á¯uÅN´V¦‰j eISù9ÊØü…ÔT÷3ªÿœG¤èö6úºIÇ$u=Fç=pÖŠìÚÅŽùÃS‚Í*Ó äØH´?βÖïB9 "”&Úß.¢÷ÉÒû§�3pL³¿‹Â‘åã¡\ná$œ§¥Øì©h/9®Ûf´,bdg¸­r‚Ûý!.i–±;hÛã$jÄÆC[„«ë»¶¢,pŽØÛ&ù¸,Œ–Ou&éÔ—‰nin�Ì\L�ÇCˆîåÚξPK ~š×.ûõ…óÝ- -•ìo —dÍeVÄô%Rñ pKPÌ…Ìò4ÔžëȉYázC…Õ7ï0{¥BÆqôqzSÈ6J-4õ–m`yÍ�Ýc="ÂæÀ("ë—åh¥u§Î­du�5¥‘°‡Œ¥kÛÅi×Õ¢®÷ÙÞW¹Ûut°Õš½9qJaÛåªÙÑØ7šª\6$¬n;c¬L?k™ É5žð©É ·€ô®„èX)$ekë�ÒéX�ðç07/—ö1C¯tRÔÕ®dRç?œhts­}DB0Hd¯ŒçäÑ›X™ï?­A�° ºß,à)ÂÀˉ ^ 7ÀÖwŠQ™½@ÙízÉ…³ Ú´Õ%¬ÉY>µnW–…O·qra Û›´_NÜ}Ó^r%”QÚAíºœ6�ÿ&êBÄ·­ç€¸¹šnfHÅ,“‰C¤­|4šöS ÐäfÔ9K¼gwBÙ`FÄu2‘qT;Ô» t)/ë[÷9Š©æ—x…V,†¸üµR1 &5åWÙ,õ9K—C<½g�®oàmÚóA�5?a§½«¬W×ÌA¿#zåÆÎ¿5Râ÷Ò/7ßcÖ»˜Vž,‡ iÁ¶Ù=‡®ý¯°ÆÖÙ÷Xo�ùœ®íˆi‚h:°8èMЀã|=(QÓX%GDZxοi'ÔG‡/îªöÞ'¾±Í¾@ö¹Í ï!Zð"ç³¾%íß|(õ�n騘ç‡ç ÈÉO3š:Ëò'L«Ü^1K)1ùzRa;“˜@u·bǵqQN&MH$¹w¾Ÿ:T¢[@™ó)v7+.L¸Â'÷w¿ÃY R¾ÊXÊȨǤÉeµkk 5Ä Þš>½¯™fß6~ý“ n«jÃz°™qãîŠ|d´J6¶zó!¦ƒÕÒs~o7 ÙbI:Í ¼ ¯ÑF-Š í¿3$S�Âôû¨(÷–âí—¥òiþü¹442¬�9üotátàˆˆë/„ñÆ´×Õ¥× ¹¬¶™>Ó+�ØîŠ:˜ô¿£¸Ü߯i+(,ÛŽƒJw´­Â Á‚ÒXE 7z•2]¾ú÷�‚XìCUy¸Ò6A…äœyÈO†Ú©Ø/å_Ëœ¶¬“º8CøèÙ¦È69‚�—/¤“t�‹ê^Du¿Æùû^L³¿¯\…3A`IŒ,�Ïðu_F òÕ™‹îÂ^þ�îIsÙ(ä$Bí·})aûƒp_6™§jN “ÊH›Ð*~ �ùc5VŽ3d·'t3$` zY`ééK9ÊõM§:*õíc&ǻŌI[ Íü½nö:L0Z¤D”–òã‚ÑÜõ‘þÊ…­I�wz],V¡#ô… ùûk‡ð¨÷_vtéã¿%äþÜYTÚÀ¨¶µ ¦ ‡öã3UvD k›ÿ‚ñ<½4"áöDãõÿ›].ITÇÍôù�·A¡%æ /¿¯éõïÚóTÑæ#ô)�L f NX¢ƒ‹tõ‹(,¾‚†‹WRâ qı Hh€q â‰ÙæÖy¹jïXIÛ�€Q“/”TQ4R¨6L –ØP;æ¥ÂtåyŸGŽóºÕUŠÆ÷ ÖÖ�EeûJâ NíÇ`I#˜ ýà—,^ð§Ó½�ýžÏÈï¼ÛŸ>àÆO2û„Öà÷~`[ÅkáCgîîûóðZƳJ÷®mXge>X°¯–ýx\ãö-Þg¬Þ�ü€¯4²]÷»×�wÒ:kåÝ®ÞÀ^iõZÊu�˜-€ÅvÕqI­!PCœ î¾§t–Ñ4ìð3Â8‘œCùÞúàúÞè³QIôR»¶fð™™!X¤B؆mi³m‚Äî~òó!v0º–é3‹ÊƒªKº‰„hÀ¹ô7¹¹îáyͳ·VOmŸbC›žèS>½tŸ¯¶`†/{>KÑ@*–]²Yû„LC˹Ï÷öjÕƒ·†o~3] dÒèDT"TêQ~¶Ò§¸T†ß(ä¤Ã—úB{Ûvš9(Š/v‰öÓâû‰«Þ?Ìxë37lÔ„5IÃ:‰È'¡EY ‚Ÿ¤9ÉŽ× ÎAÎ0}¯×Å‘w;­ÂfgýQñ0¶T}À‚‚#�Ž/-Õ¾3Ïc¯Bè€À§·*è‹<Äžù´ÌU—�àˆˆk˜”ÌÖ®¨ŒÞ7�AÞ±íÆöÛìX1 -S­¡o׬ >p5ß['/Ýn”¹Ùù÷ŽÅ�ªl ÷~ó2³}(ÎÁöQ•Þ¼�„¶M �»Þë,ïUˆ ^ÊNœ6rõç0Á²¬är ÜF+ì®ÆÄÔØó-wèÄp_î/�½ûPo9GvT±ÂRq(9¥dϪÐþd%똜 l]ÌÅÈò�”&ÂÇÐYñƒψ(·«â£! $Ì·ánã]@êþx•sð íey�u§O‰ g¬ÌarÀ›O„ø†c‹…ÜÀ–õŸnÿ]Gµ¬s–5ûÛøß©wdïn¸§{SLiÝæp X+ѾŠgt0÷!®o˜ù¤À¶Œ ‘¾qBQß(==ñ”EàžN™ gck4B—êj~ØÞêa4ËK:†`@I/é;;š^]+¸] Ú2ϰD~ !ó¦<:4(–2–Ãišk?¹ 2-˜ÞèÑê‹cY3 §—Ê€èTh°š †Æú§ºS=[Oü9Æv;[*ì¸2&%~UÆ— ¨Ý[fš}úÌUc›­ÒÁgwÉ&Œ»Û¥àAˆ#Ei7 B ð�5eÅ1ò äÜ^ä*×yò£(†³v~Y.;ò®+nð9'L¾¸xoÏ9õ±-gB0Ä Sö‚ð„ÄaÑ}^/¹DØâ EruC~Ø Yyµ}›bÁ¤Tš¹9`B[˜ñïU¨_Ž>«oZµhÀaè;ÃÚ†ûñ ùó ƒb²¶!{­þß3¢p—WÀ>©Áè8Q®+ß®îŒÿ_øœóuèSæò-ÊÆTA…åtøÕ» S§ŽÞ¤L %9ÁÐ`'Ê-}×½`‚ºÆnìvï}ïhß ÌFc–�¬¨ 1•“ŠŽ‚”QƒÔõ0:v;û²£}Ö gIYîé~Äejv;‡ÙzvKO>ÃÜþÓçn®õ¿‚ß3Û‡”[e‰ˆ¯ò¼—7k6ßùüÍ�ý\›Z3‰·ïh<�PöøCžù`Eó‡¾×ëÀç‘¥*\—fQE[®çIq!ÈJ“jÓ/à)—Í­½Ã�íJ.袢š~Êk@ L~+]…1¾8RìÌöð‰|†3{ÞFŸÓ¢S98¹-¹FÌ7¡&ˆ] ËÍn‚qÁ‰mmǸ}°8r쥌×rÚ}(ù¦•µ„'µ€¸,"·]Å–æ!•ÉÝiñhÌÃéíp¥0ÛiEõÁ`g­À«.Õ�&ß#–õð®ÙmÖ½”»ÈÌMPØ9·g�´»dµOÕ±©ŽŸñ' ¯ ×ÝuógÎ×kÐ} ¡R�VµgæwTÆNUrÂÆ«5ŸÁd#aÄúŠÏ`µbð,6—ø=X4tÖƒlùÄ�ø¼à2؃'½ö'Ÿ?{n tTs;·=ÊÃÔr�2 Ežæ×½YWk÷CÁ}ø\—Æ™ ÎÜ_µßªÒ×V�^¼Ö¼Ø�s=:M7F¡ÊýÆî8€/�mzoW•p€ðúléEΈwu1Ÿ,MÇêÁü±}f-3ˆ'ùá´`Ž9º ^ÿ:÷ÕÑÒþ¥¢Ò5S�ÙÁ‰–CŒÙ&|1„åy ð°ù±žñ~mw˜ìó—µÐ}êÊi‡Xó;ìÒ�³V rØ`×Ju�’Ò´½+ Ìq5]Í esq’)lž.íÒu§ÌjîãÚº•¿G’¸‘®E·(½¹s\˜Nš5µÂ8:³E©™œwíîÆêòEqj«Ç;a°ÔæðÓ¨Ž&q&Ÿ$Î^×u³°!ü¶ –Á8÷ÅejÛ·VG6Üû„v=ý›ð¹–0@™«^á'‘�+5ù–šÐì eÌ&ÒŸ&@óM8ÙBP(ŠÐvl]¤ÂKö LU9®¦C™"°ÍàéBêøhÒ)÷âOǬ›{�t×"Z3øùPÜîëa2œ ¸"ê üz^11~˜öø¤âàÛ³wL¡M¬ó‘b5º¤ö"eø$zKÅ_\§�ÚÍJÆ‹(«œi¼6ŽÖW4#`êžÀhv_‘Í*`Áß3)óZ·OȾlÝß;„ôbxiªœA«ã—£Ô8˜Í„ª¦$-ñ2ëßKo¾ù⯓ëqRÕÉúí¼\ûï ”ïØÝ]HC+vúîw9<à,¯¶¤²0fÀ� …°ä¦�íì°èfQ÷Ádæ]*°§h¬n•/`¸ä›�Z#‚úW‡ppÀÚ pvÊõ[vLÞéá ÌøºCµètø×šã>8³T/l]jýd ’iõ—[[¾HD3¬ƃŠ;GÐ)á,gTßh¶ÚJÍkéÑOLª~]g7Q#«•NîÔøŒ e„©ËÍa‰aæ{—”ÀÃÀƒÒàx¸ã9”žy] fC™\ñb/UzAëOî¡_o:_œ0õ)jƒ…²öñÖ@« æ¶eHçñ Zù¾œÔ¢Ã›ð‘�Œ Ö� �¡��oÒÆÙ»ÓzX8Ü3� ;x0¸à*ìiÒTE<¥,@æ3¿ŒL+€÷q>ôO¹³ÉÜs-kkQï:x4áÙ*ÈìHy©DAÊüØIóææ “e@È^2]Ó¹)··MzÜõr×Ð=Ë^mPÉšç´Vƒ]º¦Á±|I¹òá™§¶+z— a×ó-¸ƒ#å—›€ö’ØEW?±;Œ“up§à;)œ†(ôj§�ç³¾ÓÜ6ùd/Œ zšóÍrÚ«ë’(ùn–yNP¯]+¶ -Óᕃ8æ4Ǚҹ4[ÛÄ[?H,©³\ðöÃóÔ|Èçõ­K è$˜øªÀpðR+ô¥ØªÏöp”PüW>\‚òˆÄ-» —¼mÒžÄ!¸G_Œ7W”÷Iwí^‹ DÇDÂ|Ø­…æÆsv{à+:ä̈VþË hK]9TÁL‡xÁÜ:ô—ð˜ƒh†0ÝËÆá '¤f¯%åÅ4¿¤ÖÇ:Âo�ô­mHÛ êùýËg˜8¡š¼B²qpÇÇÙ§ ‹ ›(†‡gyÏ¥—/ŽmUJÚ¸5¥wµÖ‰y˜«à^~¦²ñÃ19Ø@Ê�'-�oœ€»ãŸ¡û^Aq={ç%ì¶flÀQÎ[W³õv¿#zÁh(à{?MÍ�Üê>:’Y¦°1«ó-õ‹-½N¬Æ¯¾ 3+ˆ6©|“"aŒæ£˜.ÀqøÌß9Uó@½ÕìnG죣Ùs¾¼3Pêrä4xM 4©éØù„œd_A¦3‘�n¹Ý²YÉlˆðò-º·¥q³\ôñ„ýÁý7Íþ_Õ}h†ÉßunÆ@œ“�™µÖ‚ƒœ�-]´öÞ) /s–i»¯²¸ƒáH*\7›óN¢@®ÿg)‹c>ýõŒË净Mu˜ïVúF�¸?aq~h¢àz¿Òà ¾\詺֚öí$2cc»|Ôë28p˜[_6F~b~îó?HîX1Q7òÜ70´‹ž@ï¼|ÜkócÍG“¸}ˆ÷TÃ.¤�J›:!açbõ³Ý•åñ.Ê—Ô_R®6wƒ­ªY‘NÖ?aÓŽû“!¹Eá³sr0R%`SϽ¦¦”¥$òBK4Y¾”Å[kË)Ј߄õK7¶¾ÐjÛÊ«áó|…3ßY¤C&[Ò=°@ž[ÇSӻ Õ­{;À˜Û­Á”Cçˆ<7ÒÐu½>Ñ g–ÖÏS¸' ŠÝ;&ê>•À ó;vºjCÚÌîä ÿNì {|ÊïfR­m';/cjµý¦�j\Aônæ~ŽY;n+b“^,<0±æÞ¾`ß`Þ½ÉË�ýœb9ˆ6©97®,#S¾'r€Q”=,êð/Cú I ÎÀ‹Tx, ¢Û–LÝ@°GE—Üö‚òpJ•`¢ÌEâ¼8•€>¿×b·JØ6.·ƒ¨k@s «¾\¹¢´@…¬&W¦¦êÊáè.„l$�U;t‘‘\ÈÜ€@ñ½ÖPï7Ø{ csm/ò:wu¬ÄGK©¹eG%A³¯T9)�Òat¸àcî{мVíÊäÖÓ�_}4òÕ�Ô+yIAÇóy¡±œ“‹ 6ýïJ…tË\àᯗ»™#ð-ë/ÜlÁ!¹`Ml¶lú\ žo6;µÊÏDyÚ'ßDýú‡i n‰óØÍjC§òI²–F˜±.ƒ¿z ΗFØzñyïb9|¸Æâ‰#xYö´Yæ°�05xªàÎ5áO™Å±êõ¡¹ä µÇä&¨%Örü}]›?BôÌìáöZtjÑw÷zdÒýSÜ“ “†ño~µñÀÍÏͳä`>i=xñ„rœ–]d¶Û'Ðz®…*…îY/­ 0»EÑ<‚ˆ,W�ؾZ˜3†ª%¹½Ï´ÁY#…+`ô‘-»ökÞZöš§y� Ð]VžQ1Ƭ¾,¶ÞfSÌ»ul‚ïŸS§­™®sYYŽl{c�[©l­|v¨9!Ý)g** ¼ \ç¦,g3÷œê¹@Â`ËøuÜú“W(¢Üª[õÛ6f_fúô«C|k;1>Í·†?×äs¸•QY×`D5,‘Ï@bsT.‹ë+)Cá,sgÜqN÷.mIÜ*¶íü\fSpêdÏ�]³.>ÝCé“C|î±øî,¢„²'s¨µi 4!7þÚ-{ØÎëž%3–+1jJÒ\�%¢�ïi¥þ_ë]¿+¹à0>®¿‡äÕï?G>ïšQ…GkôX¾ÏpT‰oðú Œ])þútøØ—wK÷X^|0`®�_oSÅʇcRVò_3Ìê>ÎõC£ûðéå¶¶m!y\åuay8œ\~aOm�†Ë¬|µ7°À3^ñõ7 íšIR$™„ä]õùÄéRýb Öáß]Þíc'°Z¶‹Â�:ÍÏxI°OtëéNïpnVP™¨:öîoØ Žuñ®tÜÑÄ£ƒšÃŒ’¥!¿KKæÂSc�ž¹eU”s)›úšÁ™¾÷ZKÜÁËÛL«�ÖÊ�<3›²·`r‰iä*f—�]N…w=޳Ê?t�GG¡Áo-wݰ1Äm”ZÊfÉ9؆sò{Ö¼““’¡éîëŸÜ£0”*­© ¢båkµ�·á³>¸o…Œ¨4-±pZmÆÓ°uXy}Ø(ò�.l ^Ê8½;Û&’› ÊäÎŽ%ÙGºlæo÷© R ÓüÇ‹­Ýr 1+¼�Ußo°ÁÕ†‚²\:{¬‚^¼Jöî™ïi½!ý´¥�3»´L¦ƒ&¥z µæßg–B©æ™[�–ºÐi€ª_¡»×ÅpØß]S`À¿ïTì.J­ ��iƒ�Zß*Û »4ò6r ú›d_³x”�Ã6ÒXy¼Q?ÈNø„­n(¶º@†€¼7 KØJ$ÎÀ•mw·2TƒF�Wwã37›|¶hXÐà„4îŽmA:!½ºk‹ÍêȦ ¼–Ôý™¢³þ?g ¥ƒãB’ó}‰ڀá{Md7Ý´=�bÚw#ÈlÌî@«“ÙÉrlÁê£ÔÁ­ÓJ åìça¹�\`*m%­!|HF—·uSu‘ßà4S1žÅ!ÃxÀí½TUíŽNQ7‚‘³¶m[Ò¿Ó4®bնć?‡‹rÃV—¡m[É <¨îíçqt�Û5Öt°p)Á%�.ÁOº7»Øq›e»Ž�0oj>Hh£¡Ü\:RN>:YoY�ØØ³^¦ÒÝ“oMVéq×ð2Êó×iÍþ÷;Á`ZôIüeÝèøŒÆÒ“|ÞXä}g^�æ»&›böé�ûÖó¾jÔóq¸+¢{¹+o„Ÿ­¹½f©Âjšðun=ίŠ…W\;! OÉ� ŽŽî�U»¸¥fäÚ \ËËë7^Èžæl¾Ph¿ AÒÕWÔ¸ÙÁJ/u¶ Öž�°†å‹• ×3s‡¦+ÿ­ŸÎ\NÞ®ëÏé«�L´`"û�“,~R%eõvØbU…ٔشW Ò”ÙªÙïÓÔÕ’#·rè¶ ðúþpfí[FÖÞ;ü­jÞþáw­G³™ûÞ�‚¯=B±sÛQлìöš$Gåºj?…mõŒÅQÊ�l…¿šéÀ玣|Ý(ë™Rã©kcÄì0GpÍä»�@Öt÷�J2Y|án\5ÆÉ’·ÍºãSUFan ÷¦jž€’¿áKŸì‡~­¦û”»n«œªØ¼ÖÌ&z›ƒšL80lµk°¡o‡Þ4Ôuñ6=bѳÓ:sw}?æzD‚DFϾû·™ûÉ—ŒØÜ<Â,E›3)¶faäO5«8nª®Ó¼Ý/"ÞvfØá_a¨¹F†ÇúSK½È_bÕë��ÖãDÛoVj<ªíÇa}Üž›˜¤öÊfŒˆì >8'®ÍŽQ¥^Oæ.çªÈ/8(zóÅ|cv~õ·¤Ðßx!æñkåŸYÙ*¶—8ÚÚËÑÙ“?´öå]_©‰æ6âĺÁL‚acÓ,�@V|}¼œ[ ¬ÍW#E›ÏG3½†GYžÁÔÎñËÓ�AåÇ~pXȉXDÛoŽ›�Œ�*¯Ï×­“lŸWÜj ‚þ=4Ëe�ÑPz3…¿â_�ÅnÁ¶I a@vtUÌêåœ"�"û%~FÛqÙÕñ ç Û­&¢ÕÃ}Д~ü&A\.•Çs؇…H>Е&@e¯ÏZþvÕÆwn7x Ÿ'0Kƒ¿Ù¡üû"ö (Æ  WÓÏ­øÛ`£¶ýS?X/fñR^zåh¦|'“ËÓÝd—qÏÛnJcö[�š‡¾2,Y%”‡– {ä Æýb@u�d¶ö´?€Õù8\ß Æ#by 8 ,�¿4;$ôÖ�½µ|ì¿kxè·Ö�-¸ËªÉæÄ^ª“½wÎ\˜3Ò sÖuÑ Æö{JÂÆžïA Ÿ»°ÃÝçªÅk¶¨ÞÅ9ZA ôm*ѵëîc˜�ÐÔ¾¨Î~†�¯ÝOGœ�[¸Ñwä½pü$½/ްжaï³¾ÆÕõ·ø‹Iôý0]¸!îPŸ˜O÷âÅú޾L9ñTʰ¾ã¨èïe G¯´Þ«Ú®t�6ƒòâÄc7·C]¾$4ÓrÁÍIÔ8‡?['M˜Ãô‚«>)r|ï(a€m³l³:²÷–¿y�E4E èv?f£V«w©‡}‹{N £¼¾Ö„×»óý½öu Ýf¾-Mê/ȱܘ½Ý.pÛžµ êhsx4»4Ù¹×׎¦U]ý ¹dü7rTÅ=ÆIOŽ?{O€Š¸K™!v¤{ë£_æ™wÛ þ,³pΉïÍúóºUÌ�Î{Ò;¾bî®Í‹àý<¶¾^ü½[Ÿ£Æï ›$— ïƒ2Œïö¶ý¬ïi“3Séè™aÖ»Ü uOˆ×/‡™D«¿�•]¨h÷MýÉ´­»î±8ýóÛê „u{×fùËØûîú@ü+«NˉÙ¹ +ÜË!—bL/ËÍ0¾ŠOnDâ=¡òe…åͨƒÝ×H6· L Έ™È!Þ@§©ËúÒä½ÝY=áãмm«’åÀM‚o›�âªNü¥­pkuûš>Bñ²KÑÏ8Vwâ^‘/8*ÜXÂoÇ®²×­ Bx¥Œj_å!1Γ ¨ÆfÄ´ç¯UÖ™|æO¸kGÇòàœG†ÚäÔ]9Ù00…þ�¥ÇÙ˜–•Þ\1kü!ø|zbiŒ6ùwDý±Œ·&ü¦š œ.ؽÀÿ'ô¥‰õÅ*ÄÊ6mƒ�o›æ=…XæçÅÇù”yg�W¸�'~ÒTšŒfÖ�›QBŸ ÉÖÍŸ47|›²Äk¥â²؊¼yv$ôöOà¤ÍôÔ%ó7ÜЮξ°(.x‚lÉI‡_¼ÖGF c¥Þˆò� Š¥6Ïz/˜hÓ„˜”$ƒû÷}nùÜyYðµ.v@$Çd6=žVsÞ°Js;…²µ­�k”øÈ�P{·Æïëø)_ò»†‰3°›ƒº€ð ¸œšX¾ýê…ì,&Æ.‚3m+ƒÔ¬âãîë ø Áñ9(&úÅ·Ž.‡¸Ò_67Öa[[k#q$×LÏpr³m ¼»²dщöM¦û�Ÿ­¹ÝÜ]p¸‚Qµ£>Ч±û¸»RSöö%î´Šk‰¾,>!©Sg}Zí à2>N'ÁWÞž¸àç–œ-o™òšÌ »ÀñÆ êVD#WwÓ*ŽF›MîZÍž€éy»>^�oa÷ŒX/ζ® @ºáÍ#3-¸×Ô·æêë¶ÅXÄó¸sB ~·¾´Ù�_„2{ ð¾ãH§Ã4 ³÷v ¼d”r3óo÷ßÄ�H`!ÍÞ ,¤þÎÕª ëQvÜz[ô¶¬Ø.2|\tnžÙ‡pòAõaÕYeü’Ý“E]" ã¿»ñ¾{ÿo߃÷æ ’aŒ¡å“§�œ² `‚A�D E"E¶Úßë^ÿg?çý=^ýg"Nj° $1,CXf ­`kÞ�¤qoÁû¯ÞQÕüʉ¾x7ˆÀ~ ¸MÉd°—_œ9š°ÏRþê$¦Ã7L*aNoðt1+ózåß=îMW•¿L÷ë÷õÖ£uç—‹ØO9²ºå"‹R2ýùîX0ÎýÚ®Ž¶§�Æëuîp%ôÀÓƒ '„85`Æ·¶Tb´â¿Uï,œo<+ö'®ì+ÍEòÁ¦KZL”6*€¿~¹³áþ†öL½é‚v@ÍÑ9kJä‡1ž|?vÉ@1sš‡[ù™Õ£KW·»¼Î÷òûµ]àÚÓÍ¡*†m¼wÒžâÄL#FÆ6¹Ç嘻âëÜà*å4œcÞmÄaD×iÌ7T`¬ÃnVW¯jÛŸC°qlY#¸yq¶äÜ.%Xí k‡åYϬ\“P肽äÒ×Ôô£q0Uÿh/_Vû»¥—”ÉF}9qäÄ�1£¾‘ôü\Ðû7„áZîGáÛoé¥�sl ÃE›|‡mŽ¡ÊÖ[�§Y£…˜wÏ ¡ðˆ6®„äx…r¼"+=ñŸøEbʸë--cª�•bþÊ/ˆÇËTF%P³ZGem�r½}Å}{Ú³®y®bçÐÕ`Ð;v<×7¶öT}žo¶ ‰¤[DŸÖv×Ly÷8½Ê¾¨!1H†¿%×Zy.AdsôéLJt’30ï~ÞOŸFÿFM;€�jËZ³j`êÇÓn¬¢7}O$UL&Ø·U›\ÛaìÄüÍÉ€ŸNc Š"ù 4‘¤Às¹`ÏÏöç¨âSS-CíDG,/:À* ®ÌÔY\YZéÌ>‡"0<¬ß#ÍÊ.BrÑ=Æ`O—üŒ-ÃÖXµUa‚-&ˆõÐÀFfˆÜ“û›úé}�ý �¬[ÞÃZèßç, o-<FÝëwþEÀMs� ˧´e¶þ Å÷Âé•™9u¥tYÝÞÉUƒ!ß×<‚ ^w„ÆÑ¸µÜ0ù›–,WVó£t›ý‰û=µè5–ôÔýѳ©–RÍ�/9’ˆ¯|ª'yªHøÿ°¨ÎiJŒ DÖÃáç4`²…‘ ;¾U+|ï*âs]x1y3q+¢bíÑ’ë⬈ÕÓö„¶\«5¥�Ü7•`½Úp²ßDo¸ÕVºZÂ8„²9•¢ hz†DbŒ;T"ûâæ|Æ„õâß·„à.±ÇX`8€ŽC¤ƒ6Έ-˜õíV[ž�}Ýž €‹Ã:+ö ÐY#ç ÞhC‹(1™�W—‹bî��[¢Q!g̪PwõÁ8×z••$¥Ï1,t£Û‚ÂýØóìƒÎÅï)ñÝ3.A:lSí‘fD+ÐÅôÖ�åE_9óds'ïfêþ¯†‘¼¸Vy=žÒƒW 2½Çh¶GÄü,ÝÀð^�f_ÀÕ]Ô-âDR`nÀL¾9`+uã’løW<ŸŸ»ËÚ˜ñ½°äVùŸ·5ÌqT²&Dààí—ZißÇa»ßªú +œ16ó¶ŽÆËPù¶`ú�‹M2eöƒ$ÇEÈ´ïº<«ömpÏ`¶�Œ!%×¶Ãrl×Gäd¦;PáPé’òñ´Æ×¼¾ÍùB ´Õ|gª_“�Ë«¾�Yç:k¸�zß½Rˆ3ôg c®Œ�šçuD!ò–±÷(�©/÷j€û�¦ÏZíý;6ºKaÞ¢ýðu—Ê­d‡$å’ì}nâšöÛe×8oŸ·²}°÷Úo² {|ÒRm¾$v“=Ï¢¤IŽ˜ø,„†´Æó@"2AmUÍbU±Ü˜xcˆ‡GRvŸŒ•×å»J—Vþ½Tˆé™Ç|kOœ=íÝò S9lTßÇ!P ™I ÖîXÐ"^Oø†øÍ..F§FE>ecEÕà¸y6w·ã\0:&štȲƒàn¹ÖUÎL/mª\WC¹9*Àq¾Hb°2o³¼ýªûœÀl³ê6ç_¾çýlZ޳³¨€¿ÊðÍï¶}÷š*ÔÇvÊ5�æ:|ž0{b1àÒ‡v´CsØñHxX§«ðÁú;µ;p‹ƒ›í‘�¤Ñæ/&A2#½±‰y­¾³ˆ<–(uà$~SÄŒPX…Âø�g-@A·ç¢ÑpÑ| b& ”ÍÚbùQÔÿ ±Á]…~¼|zmƒÄ[€‚‹Ï„Uñáæ±éšÄL²£ÝL‰T5ÎVo GdŽ ð¶f-•ŽÅ£¸×œNi·S¡­�F½¨÷0unkvÒKßDUêá„^ï¾W7£™Aã�–й{´GQÔ5˜çAoœÂnâÑ®\CpW¤\3¸]Ã[ÎC6{7K˜}�rVXrÍ¥4¹O'‰Å`Ò~.S$\ òˆrŸªÞ û”ñÞùQ›}ÝòÔÈ?9\À6£¢Gœng[ð[–ÓIˆŸžXõ®×‚àÙ)é�ÁïÈüt-´GáæóÄ{zó°¤Ô~nËz;Ÿ’ÛR€øC»/¸»•ÄtQ\~¤ð+—×ú¤AüO“D±e$ =m>žƒßxÕ6m:œ0“Ì®¬VÍuÞè‹�ßçf~g‡¼òÈeä¾à=iȮ¤¾;)AÑ'ÂÕmWŸ<ú$foˆ1Ý÷b¤ß€7IXf²ÎN÷-� Ì®× 0›ø³Ø\ç¹Ù·E²ØYDr z=iÞšáÐ�¿^RêТÅjIø!ÓÈ+Óe{‚¿€Ds+³ÄPA_»èl¬$Å­ã À\Op=i[:QÙ¯çM{.{M'/'Á ošb/4ÚYJ\ÜßË~Ž×”fŸ|ª0rÞ/o“kY„2+k誛â9ÕÞòÐ_Fqƒ2<§ÀcyÀ=±"#©4£³¹ÎB·tdÀ©¸ËÙƒXòÝÀ|ÖCFîÒl0®wåHPØf›Ðäq=>Ú·Ù7µ‹4‘²¢qÁV´y{²ZG„;;Ë}ñnÏ/jáøcY$³\q~Öñ ”º ¤�’Èüï-¬Ž¬D™¶˜�öV®Å7¯™Æ}:„C'‡‹ÏÍWxÊÀ ? Â�#*ý謬¹bµ×¬®ÃϲÙÀ7·Và^i€Ãâ÷ú/nÇnÓ¼§bRÒ8áÇÊ™qQò�å¸ö�´C1c·#…JŸ¢˜�QüuºúZ lsÁjƒéç}Ø«¿B‡~³cM9³�ô—¥PæyG Üe,pl·d/‰à .¸±ßAÍHQJ°€?,O8½Ó Â×c�›º™ì¿läS{r·Ä¾öXG?|jêÎòد8ÏvÌb§OruƒÐ¢ý‹õ£i“‹ƒº äÆxäz©Z±Lú7�u ¶˜O1Úëäéè0»µ^ׇR»ìnãÆ{—‚=Qï�¸í¯—vø¨þ ¾E �Ú·¶@èïúGy³/,¥`˜·Ô‰›ü÷·2xm(7×.Ëè+‰‚ ÍwK¶Y�¶ØtðßÝÉ�s”Ñ û—°}d×/EÌD=ýÎX/ßSX=7t6„Ô­¿4n äˆ^E�u®kôû|ÎòÖ ÞñŒÙÇ%p�ƒGTöÃ*™qkåęÛŠ RÐÊ�²ïõÆØ’È®CžŽSjƒQ½aVöb±òÅ�ïGŠØbTä{¦bTdÚáí`¹ÐüÔ¸] )âÍkaö¾ó$p-Àöã^:’9ŒßoÔùKî‹y£‘žë>¸ÜÏŠ¶ŸŸ�Íâ|êX&Yìä@ž1rþ®åPÐÈÉjw¸;ýO„rO!µ·éÒò¨tÂV§ &î*é3Š[«TÚÅ@¢6tM¨´aº3˜ßBõr$:uÂÎÕlýÍ­½ÞOÞm!ÌAUÆ•,ßp§ƒ+¥Áp↞ cõí‰y× �,-J&T—: =ò`æ¡q‘÷l&‡QžÙÐþ*2€ÜÓ3TÖ-±^ê:œ•æ· ú¥ƒÃ¤µ“&‰¾˜‘P��œ=VàkVz¾Ö-,‹Â_^�à剽~«Y�9nÙÌo©Lç®:Þðãr_sw¾ƒ)›¦ •B�!tøÝœ]#”VÞ#¤Ád½W æã÷PÉ·€neñ; Y¡c›K_me<‹üˆÅÉ›öHå~ÜOëððc~5\üßMÖ_çSŒo¯ 6üŽ˜5@ï !Ž–i•±Í]™ñ ¯“¬òÝûP1 iÈé™{ºh<*Q ŸìN–- õؘ8½Ç†5ÍÛaÍbÁð ,¹±ŽRZ¥%4¶™a�½3SCOouîx°Q%!DtŸJFwš‡$³BÇ ç½ËL|qCËA e�Ð+´õ’ïÐìϵí,"©ºÛÜ‹I‹)6´wr¿lÛñmnNU8XNÌv}Çå�ƒ‹¿´Ö¯Äö•í9ž½[çv9]¥�†,¬0@ábýbp­@-{‹â�kû?:› þñ#µÀU¼. gŽk…–ß £Ä&ÓÒîÏ@»æw¿¦hòNÉ Šžm”|£ÁŽ~[ÞÏ\P~ìB'e|à‹ÃåcZªU’Æ9°»Ñ�b±÷8±² ÐI5Þ€i@´ÆªA®Uuר“,u׿ñe«“Û%öè6¹ûgœ�ME¯x�Êû:ÍÍñ• ¥èÝýºW؆N¸w±³ûw3�Àésm·ªºaðLlƒ—©c¦¬¼* dVÅ1“|ܳޖØÐqë¬òB #*.,®šTè ß â[ΖØ­“P#©§òÈjm»w�¼E˜½È|Ž÷•–Zô²NpOí‹ØòÛû9Í1.…­ÙyNnÀ'XeµyX4Ùæ t”aã¡°8ø0ß®öÓžÚʼn|j6±>V� ÀBôÖ;«UößW‘aég΃غN0Ýe·íC†y!8ãƒNŸ;¸´�¢ð×j1Éjµf׸®W^kX“šZw>ïÇZYz¶rÍ•ñÀµÒ·€»Y†ì´Îü‚Éä.ˆP7Ü}óPâ“wûd;~öõ´ÜÛ](úæÞc·/�ÇìUÈ’Kù@±À¯„âOâÞQƦ3ÛAÜÇ´ëðbõ›x`ï,2{¾‡+f²ºðfj N·ó4�˜LîWÑÒRþiÉ+ó%6¿t^þì�·d­å{oŠXïcûÚ6›2Î¥’3Ù|øûÄûBkF}Ëk«†¿°ôJ �îÀÓr(Ò;TÃÈ�Ž8h¢™ÚÛ2 ØÏk ®Í}u…jýŒ*ò†ß­õñ�Hd“Öׯ†j­ qž1±i½bŸ²Efx± \)5÷#0å:\šæ^Ï”ƒ1.ÕåË-;W'ìÎíÿ§¼]ŸŸïl딫�3íuµ­€ŒdÅŸafºlàí‹!7µÌÍBòñJfcÅlï"sæ#ÛÒ>ßn1B3®Ýþm.ãj°k=q’T¢Õòôf„°3SŽÃÂð ?H¶mëÄ]Dy¢²&8Þ³±Ó.„.xMÆ[Þ­cj– ˆ wv” ß³çF¶�Ñoq›³˜©6±îqALÖÚëvÄV�µž·Ù:íb¸ç븹—ZÑÛZ××£¢çkoN‹½zЧ¶ ¶ÞÆãÝ�Zñ±v§®,kÛcV‡isvî#kà÷½Ù“¼j<ÑQV÷´u¶��^Ú£‹b¢»Uk­Ö;uÝ�;[A­EUU«:ÖÄV�±h±ŽãŽ ½iÛ­ƒlz;qÚ»toq¯G®îã¢mn‹XÖ¶ƒ§N¶µ»UÁm¶±lÕŒh¢ëMïuÛ±Š ¶õžtlQ³Ö�â½olN�]£VɉÛuvnÉ«±ÅºÙŠ=»±lFÅX‹Øêê1ˆÔ÷Ó{»Å±®ñš;[ÑÌu’;®â‰‚»§ˆ#Ø×®#ÓëÑîÝ‹]Ýu×q=qk®˜˜ˆÖ­VŠ¢*ôwX·[nŒrgDF �Æ�‹çW{qPãÝÅï{Çz³ÛEv§»Dkw»º÷fˆ÷gÝã’ ím¶wl\A»úí¼tgm£®8Æmj�nÝ]“v5¬cw;ƒFѶ³Z:ç±£V×Zž«\m=nÚ*žžÙïGl{ÛÔGt[­´îë=<Eضz4tÛEcjÆ;ÝÞ*õÓÕkgNÅQÇj#µ«[nŽöJ1WO»vÚ ÆÆ½œG[|ò¢ð%�…áaÿ‚*¬*©¢¦š(¢(‚‚""ª"Ц ª¦Š*˜ˆ&Š** ‚ˆ¢f"ªf)’„‚¢ª¢ Šˆ‚ˆ’ŠˆªŠX†(š"¡"¦ ˜ˆŠ(*ª¢ ¤¢Љ¨(ª*ª©)ˆJjŠ(Š@!D�UU ‘Q€dT¢ªiª¨ˆ¢b*‚b"&¢Š Ši‚&(Šˆ&¢*h""&(h*ˆ‚¡˜*¦&‚š†¢©ª˜©ˆ•E$…‘?€@Š$B($¨(¹"`$UXT|Š+‘þQEG„  ò*¬ª!…BVEBA@òà 4‘-4„AAT4P!BU#MP±A” 4… )T”�CAE %J!& EANC Â'9URPä2‚�(eT xÕ14ÕEDU”•UAIE!AHRC4P¥ TUAAKT”ÓM T%*MKDÀSE%ELALTRÔTIDKTµM5IAE#T,T4%DSE% MSA@PU5T”%- 1 4T•IRQÀ"å`~CÁä¡)¥¢’šh¦¢¢ˆ†!¥ªhjšŠ�™¤f Z(…r%%TÅ114ÐDAE1E EHQDT5DSTÕEE$E2EÓ4ÅÒUDPU%ESUEQTCAMÊ < µê´h(¢ÛZÛ%iÕ¬ÑTi4̆‡F¨¶ª"¢© ZÖJukMkM­€£Zv­ZĆ—ADA±µA¶11:JÖ„ ¶uh55l›j6Ô5ª D´QSIA«1б„¢“gkShÑb-­¢¶ÚZ5¶(Û¶Hؤ±ˆ‚ŒÍ±FµI¨ÛCŒ`¡´`Û8´cm1±§mciÄF3¦“ThÑlbÛlÁª �¬N±.µ¢5�QÅ4S‹Tºv2lDV JØÖˆØªm­ˆ«N-b(­�:¤Ñ¶Õ±ˆÛkHj-4íŒF´E�5Am¤Õ‰›6‹cF±2‚�ûK¶¶Æ5DÅE°lDÖɈØÅTI[U�[Iµ¶#k0ìjš©Û&³mšqjÚÚb¡ªÙÛjÛZÓ6±XŒÆ±4Å£%mF4˜"ªÚÎ*¨"ÑXÖÛ$»9‹cV͵µ%Q¢Ñ­kV4è1[¦¬mª1¶ lÅ£cbØÅQH j ª©"bhš©*Š &k (b±Š£=±£QGjm·g¢.¨±ªÙìÜq1ÙÀZ»n4Çms�Ó­´u�²ÅQ Ó±­h®ÅŒöQªÖ"ŒM]tµFÚ‹°b.�k£š–­�ÄiÑ¢Mj¬F›n¨â:ÌQÇwFÖ*Ɔ–‚† »i®(�Ŷ‰)«m»uvØØèÑM¬nÝ­ØÕLÔuÄuÝ´Ðt÷³ë¢ƒ¶â;³Ðèõ×M³ ¶kOZ§�v8 ØÏZ§¤Ö‡^�OŠ“Ýî{k¯^Û®�Gv룫`ÞØ«E!¨›Ù1Rî0uCÛ5l�)Ý“ÝÕ·{¸=>Žìè4UÖ+F´tœuº[·½×£×mAlíºMt=‹»ˆ î÷¼Rí�{tuÄ^Ï­>ƒ½îN»Þã½—ÅKNºww'V÷8ŠnÖ·¥èôí�Tv+Aجib4ÝΓÛݪ^„½muµ´�™¿îÉÛ™ÚDÏe& �éNŽ’ŸO£Ÿ’«nuiÑkV«öÑ�¬Tót�7ýÆScÌ@hrèåÿ¼Ö5 a 5œ@ùHÕ˜‚ÞC;–apvÒF;µ(Oäw·ýwaRbANÄ¡H0P‡�¸Õ?1†¾ïœe!_Ës5_ÔÛ÷•1òÙ¶O ša0M÷™mØ5Ë,Lè•imß5&ã&RæŽˆß3;Þô °G½`O¸HZ#œá³«öoÖtY)‘\ _HïÿtCÌ�¹Ó6|ÅU(Ü¢ÆX_dèžG‘/òÏm´:á9a¼,×"ÄÚº½Ê‰ÈJg>ìÁΊ­íÚýÈ.»Cà {>±nI™´uþmñ©PÔPüsePí²÷L6°!Ùxz�ÁÔæ¿ë OM:Ñi0Í¢‘Eˆþt¯ãǘ¿’¾Ï˜»níQ€¶ýéÙI\ –(ÕÕ—r}ÿ'Zð×,8nW\à�I 4}n“÷ÿ¹ñ},¬;6oé·˜d;í‚æõü7ÈýÿÆ?Ë$ö¥8üC`jPÈíñÞ:=ŽU) Ä€’Ž r¹),…’2Rß•TýaÅïhˆ­ˆ¬‡E­L-³‹Ý¿¯TTšä2¿± id ˜](ðš«’4†+ààÀúAô31zò${T±æ±z‰ª¥/ìj«A±^ã“{p¸üÚPÍà�ê\Òìß\»oÞ$æÞgÈž'xÊßÒúë�ñ¾K§‰ŒŽÇ)+�u„õJ�Õ=ÒSI:Íú³›SÚpÎ6I|a4Bô[ V¥¢õ‡y¿ü²E›[ˆžØ «áÞ;~;û+™âl¿s+EËŸfEËO»ûïH»�u´Vö»ê+Ÿüû¬–ãëT±9âz¾4Ê�€g9ÍC¥­³è;ž÷Ûz7ÔŠÚ]õ8!Þ íÊ%|mÒNËEŠs3ÈÂauÛÉ0É>ó`}N…úZ>¾\f÷­fö”ÈŒ±°TªO÷U2+‘Ø$WÇL·qgMöý>kEìDÝÉÇIéßSm¸Gµ¦Þ´ÜõA7Xµs4ú˜ùWëEt¹ÚÕ·Í+P¥—tÍê6:ô°1×&`¢Î*ÅØsÊpÌHrúvÊ1$ü¸çÒèá×.ËX:ƒpF‘6pšÿäjxúÁu欯Ӈ**f­…­ßÌÔ—þ+‹a‰5²4TOë79å!IÈÕÝò�¬ ÈŽh—â‰(ÐŒ¿ ÝÖdÖ­WUå›Ìá\Iù�‡æ‘ =S$ÎDªuÇçbO¿‚tQ‹MHHíjyãuTÆý/‚k¾›†¦Ú6,—›QŽZyi¾[ˆ’Kå˜UÒ÷|ÿ,uÖ9}bíÀäwUàfiH¾hUÄ)µÜ— f\V4 ªWHš¨âûÃ:³“¸¥|÷Æ:Vã<,—FËÿ³V½u°Ô½Á`óCÆÙØyÕ¾þŽÚ)&G{m|ÅTŠˆÄ×½Îö6r-ž?¬\\�ÌÇzè�È?¾oƒËeþ¼à05m-Q5 A«ö¤nNä6RR²WûŠù5AãÆUâZñ+9ÃWphæ†1½qY»˜­œf¨?¹ÈWÇÎçM¿c)‹#8®ñ{LÂÉ&аh"Iþôðoþ_Ì}±^‹F�Óõ÷ÊøÉ.‰ æ—. ½ŒköS&ûCû[Þ.äèõ?Râ¬Li½ñWS˜¶®áQGÒ�Éìî*5Ìí¯.9â¸VE\2m>[‰~ŒèÓ}„媋”ұŘÍIkÍ•ëÒ ’bõkM‘ÒàZ~,Ô�C–v�4ÿØ€qÿÆ?¯^z$àúÁ´&cÛ°ù·×Uï-–¯G1¨áœ³o±¦7ÇX;M{AË5˜�4~ ßW�¾Úm›67œU¯ÉþNùf™ÛdÅ´ZÁcHÅ­QªA<¸cfvo÷yTÆp‘…_-¬wX;þ_háH~· „ryÎOùæC`øùo«ƒ_ùS�†pÓ8Ø Á�ùW‰™öË{^&‹ m_v¼1:\¦3ð¾Ü�{WùecSî‰_¹´†”»ƒÝ®¦ù¶Ã£hü™×"1]|÷�R…mn;Õ›¶ƒîü� §ŽP]oærÜæƒœÕCÈ¥ñsHŠ˜šÃâî2ß¹K%†ñ�FTØàî¦ùA°ÔïÎZÛ0„Ž *ãw´o`>ì܉D¾ïWU¨œr‘/ ã;[.„ËrÙÚ/r,7Â\ x8ÃGD­U•©M’¶6}s|H±28EÚqm›X©HQM¢×% fÃVw R¦³Ç¢-x›#>,×¥ª1 �C¯é~Z�oN(èý‘Ú!c Æ{Ï¥`’ÀwÒƒàꕦèýêÒĦ]�;î_¥qÓRLŽ÷ºaeÆ`MLÇY€øÈ<�ò“œ¶Wv�ÓµÉk³îÿ?_]©M­ØBþD¦¤µ¨ÿ˜-µâÁdÕåZîˆ IÖ‚ä:8éœ@Axž2ß3Ä–ø%~ô‡Qö²|}×C·oV®Q ¤ŠüÅëY:cH ™}Ù#GUÀ9`‡lÌØÔŠ‰ã>FQÀV©)âiy£”;&±Ã@¤Rå„7à·9¸MêÔþY0´Í hÑùÌ*¯xMfÃ×’µ;•W_d£^'Õ þW©(¿×q>ÚÁ8Šº1{Yˆ)êØÍ@Ù§¹¸,·Z·øÄ“ÿ[Ò÷“ZèÃgùß{ÛëЕ~^o�£Ö©¼””™‹í&*åSº÷Þ¯Ä'ÏðÐߎê}ë%µz£‡ˆEó…îoDjj‡VCÞÜ ¼˜=–˜&ñŠ{$·iyð]e@^Š©;6N”¦í“Nlˆ3’í•» ˆ:C®’CGÖU{.Ÿ‹¼¡®È„_å¡HŒgÙ¨,ƒ ½ür;N =ЃôÏïñc®y0|™Ó†°®ä&£]á×w‚ÌÕÏ'[6ÔË­wÕÃÃåF,)ÂÚ$ó‘'Ú‚…™&ï¸ìít1ݤþÕ² ÷ ¶`ÅЫ’ x+2èM=ª gVT¯ƒ‚�ø2«Îµ|m!{œ7ÌøS59!F4³G.º¥¨3héÌ÷o-5®u3 O,ˆ2eKáœl¨ÖþÛg< Rï+-ù'[�’AgY+ñû4¤†Ø´¤Ûßté8~KjjòÖ!zƒÁŠCÌIþ¼ÜÛýløs�Σ|îsoÛ£gwï윽¿lh ö}�M‘d]Aê(+>QrÇe‡0F¬çgðÁ~fýtónÕH­zÆ'ˆëWx§ Æ“lX1&ÒA¢}ž^%�ÐB éÿ¿ÚÁ�Ü�IyjîL·Ðc9\Å&�ØÛ‚�&ØÓ÷-ÎÙÃÚYýñuXäUw}£áD+¥“@*Ýzµ÷™6üT4`�­`gIÚxM¢bV­¸H›aB^Ë0­ì÷Yk'Í`? ÷Õ¡h™+Å‹WŽZ.VÖ µùHÍ¢·†N#*Q“X‰ÄCÊÿ+ f_oëíR˜£ïŒxöI¸”¹´õÓIÈ 0D1 :ò' ï6úŸ0DÇîxéíâÕƒ¸s×�«‰ÒhÒ½ÕÁ^η¦ÚtW@¹[ÒíÅÈë–C¨rœÞlŒ…ó¼É§fˆË�ó÷ kÛ:Z´;‡§C Þ1ÆàÚõ6M!iKñg!&Ûãû8Î2‹êöbuëœUÑ7ª~Nã@˜âT_§ NÕç3(Ôø3�Â{d9�ÜÓ­ÚŽÌžt�¬Éb¤¥æÂẃŸŒ­ZqœŸ/·•á¡Eþ¬€íc„0‘uòiÓ¢1X�Ú$ÙžŽ·‡ýWÿoü£çº>MXj-æn¡|¨—þ¬‚ÛßÛ Ó«Õñ�¿ô%‡åÇÿÞK|˜s_ýµša¼ÿ?.ÚR� 9; Î]²,o,ˆÿñ—R�7IŠ£0C ©!+eh]ÇK! ïé•©‹À·¨0áé)E1¹(±âØïž8�5¡J uâ°0û«i{x6Œº&fÔPI4ù‘ñÌ“·û+¿¸t•¥€‰ÏÝ©¬ÇêŸ`<›!äüåî°ãºÓñúu…î·R%¬Mí ÷žºy_•øÜrÔeL ]!œ–)Ï+H¿°=ò\HL"#?c¼æW&õ‹;/Þ�DZVëO©­¾G§M¾ˆJ“¬UnT^Ýl>˜ëõë(tä*�úVã5NÐ=;–\-â4£ Ù­­‘+Ë�CØs»Â?+æMá‰×n ý�ã—9’à!7]NP»`FÜ^±‡pgr‡•D�/ÖË®6ûðÞ‘0¿*¡<××3Ë3®kP—±{><ttz•b༿\xõCuì»ãç~²¶Ã¯Ýø ÷tsxZP[ø™6KãºÚ·Œ^×FX?ƒe‰_˜çëI•£:´¨Þ Ü—ÏÊCðÂùc}ÛÎw)t±Bo<TœÞ›ÈŸ[°»-¦Ù DUŸ~G* ·Xd?™LJ�kAÚjABÚqjˆâé8Ëðèo$..ÛÐ� ³¼ý.þ�Ž,P;é!Ω81MÖ`›ioYYrΟ2ý”‡AÿâÆÿí°mùs”èÉ×Òö€Oãrøï�K¿òSøï6¡!�Y6â \ r*ã"æ”Ü0°ÿ6ö¼©yáè9ùi£LË´)“!‡ šd-ñ˜Ü(ËH�«}½/8p;²N±ÅÝ­–ÛÇöÞÔ.Ÿ}¿"ïÎÜ9KT[�ÝæØñý熶?¨šYÚ4^‰²ã¯‰Ñ­ãp~J0wò/¤Dï?�|Ç)ÂîïèøÇ¬€ÑA™2¹è^"ÿ?`Éý·iŸjä‡h¬÷r÷Ф,a•e`]×£n–†9k‡$íR„U{‚î&ô1z„ç�<âJ­&,€ßvM.×ëϳGwžÄÎ2QÉ�Dw8ŸX\Éýð•¿…HÁö—_(Æn—8þèºJ³9F{¹A‡1|cÊq�8çQ_ŽÒE·E"b¢·ßNtðÆeúâÿýá á~‡Á ¨fy¼U?œvßÝSž¢È¤ïX©õR*^™`<¤3†êÐUYc’ÊTiüøpWÕj—ëíDfzfß«v9m÷kb£ë_çKüçtÁNþÅ]ɚ̮úv��IäŸÁFI…äâ ­xoæ|O2½L­3õËSÎÍó)›Ûˆ *ŸIK±$ÈŽ~'¯0Ùºh½º�´à‘/²G…Fá ^Eà ‡À É/##hÓ�§MºDpzu2ŽW�óˆ6Ý9—Êä\ü›ÂÞ—}�û�𳓫AyÚâ{(>ë,Þ}_¼æQ>o(€Í•N™Þ/ˆò¡&D•”êǵ->û²éõtÂŒ°pf=µ¶ìžxâ]tãÞ'ž®é4Õ¸Ü;Éaá7ã´?ç*æ®ù@Vk©ñ¸‡�Ü¥ ¿sÌ|;šªé…v'oM—R*Î`ªác"Gh¦/.¥é…žÍÆbe¸Û}ÁÎ\”8P`¯nì¯l…WZÖ"Oô¢×uø�\C vŒ¸²Dt‹XØ{2/øV<ˆcµ ïl?_œÑ¾ˆlùÈχÙ;=uxï"çJä€[Ô$r¬÷<½°}>hèÅî;ï€Ë å�+‰2­adg,o#K Þ\x•ŸPa­ÙT° £ûÞ¨Õtÿãê…Mÿ �ÐDüsºÈ¶°ëÌ7ØÉ±K”—ŒZ±œÞÿ Ù,Äj}/É ²5Ìq•!ߦ«Â2l…}ñå¹ÑÌ�ØAV±„e~³Nk¹}ÕvÝ‘Ÿƒ‡î{PŸ¨ÝJ›Wñ–±ƒ£‡•=œ9.2ΘkÖs'ÈÕ˜¶Ü°pêÀ£v‚Gv¥Î4yÍŽ{:ŽÃˆ¶‹Ãï[7?Vž¤¸ËÚÕà¥.Œß’Ðé$€, Š73óqÕât\g€k�NˆG2~³ÑÞh7Q!ߌ“y¸jµ“7ݧ®-‡æ·¶Øˆ5£‰9(ñTObMŸu…äÝpIë ¼P -Ë Nm ™ðòѹ^¢í,X”pŠ×�ó?ú¶<ÕŸö°Ð¡ü Äy‡�px)6Þû�ý…ºê _¢ø?l ÷Ýq][õÕÖW�Øü® =píâ/-øøNå¶BÙ Ö·ò²æ�ú÷7o$Kкþ¤b3ÍŸ”Öƒf—ÕZEç` ÖMJ±­Ÿ…ßÅp+º1¾üÎ8\ÌÄħ) úã³ã˜ c—·ãíÕáXBCkÅ–²MØEŒ½ÃŒyº;Îñ.|© rC†_"¬9x4£û³Ë6ýpšó´àÆÈhÒñ ÀoÎÁB�rPgù¶<æ¤;¹TÏþù÷ùŸÅpþz$ü%T=þ6õ½ä™ãËe¸leòöNJrêiœ÷%úÀ‹'â{Ç—ZG TÛ¯ÙÓè�îmÅi®¥ÓZ¢õ¦‚ëæ5_=�n¶Že€S.YbË!ìUòËßyM¹vØÇzk€§ÜXëåÁx²¼¿�·±^aPDг<ª•ÆÛÈ ãŸònº<¹ßû:r˜›wës=ǼðÜà&Ñx�A¦ú<û`³‹›vBÞ"š‰‰BŽ•,´‘2ÃVÜÙOÅS‹F×H²î`ui"æ ßùϱ¥ôoÍÚékYlM\TëÌñ%Ô:äŸ+æ|ß9çt<8gÁ�ß¾uIrñå°ã=›äEh`Á¿)Àƒ;kƒg˜MÙKò«ÿÖ¥¢Nr©å•ÙëÕ•"ܺñ9k1×_ç]_ W¸¤!²‡¤ç–F“Ç�YT¯ÏŽdM­&!i "À_4/ãnç>„?5¯ {«w#uó“I·3éTðÝJ\ïIÞ³ÊuÄíÕ ki,;³Ð…(?í‹�1ªj¥o³Ú=à>0Ýî¹û@à5(óÈÍÇ¢ ¿d'>7õÍb­æ!ÅÜ2ï§½±¤(ûé“wFñeœ5ñ±š·#Tkø2‹86…a*E?>'y¾GÜ%| 1“‹,_§?óëãFãöå�ú? oüâÎ.]úòç^Ÿ©?Þ¢�Daœf_�£¸H™»”ù´6\J¢MÖîåO¶­!ÀeÈ¥…G³Ùù̹ç¯x„‹šfä=!2lý¡tô^«(nòÍÌœë˜Ñá¶}ÇIºeã}LÈ*!ÖSŸ9»#|.µv#¸7ø»ƒ?†³ÊZÒ'?õw%,™.>DžÈñÓ*Z› 7yâߎæÿ7Ûøý½tŸ­–Jme”w$ß ö0¢G)úl»¡ùæ]•o%ìc[8­5:¼¿y⌌J�î6¸'Û”wâ¦z‡(o¤èll^â¶©1(Ø|´å…A¨Ã:o̯KÆ=çÉR4ÓDc j7võ˜}ßNUæùD¹º q ½âueg‹RXù#I—áÌ3R.èÖs4u¾osÔ�¬t|qóÝ‘”®O?_~Ö¢¶' âÏt{u8ë|<=�^Æ;a�7ûY,v;·î_‡FK-|ïWǺ‹Œßç.`­�Bâ�²Èøbµ20ožÀzR“+žàƱ›ýð�x6<Ú9௴›l@�ã{“)¸ÕÑk˜l»ÌĪ7Ë^†è´z_¸‰Öfb ,�†¢é "å¶ÍÑUm¤QÙö“f•ú§ �1îÕjÑ(ò�&äj?ˆÒÞ¡g*—|$ÜTÊÄç@¸ñ¼;ùìÞàÃ÷¢( /ä8£nØ4Š ·½GY[×»kp¸geÞ�§uDzhñlÞºã‘ßàôô–âóé� dv³÷<�B§Á‹çÍ��üõÁ0›;èx-1¹'qeüA nÓJÀ8*ºEÔ! y9£$Î"l¸e™}7[qÛº¼ê¢p¡‡w0^#0+e•o¥1"¹ÁÕÞãHöâœmNs²fG^¿Þ"7Ê,`KŸaüâcýEгÂ×L>…¥Ò1§Ï=71¥yêCòû9'‘ùïP°Þ2ë|­Lø`¸™ha�˱ê¨{íZþ{3»ý›Yà× Ç{™…äÚåM˜†›Wʤ”›cìV—2ÐBOòã$)T‘àm³¤ ù¹^í­y¶&F$ÊY!HþôÖö^F¹‚v÷Wú}¶áÿsç~¼…³\Á\�ÙCü(h°cb2¾¤ßŒˆq39¬óéyöáö‰¶Ð\$l]�Éý*ùÎŽô’C½GA• Zl³cÖ~Q½„Æ’ákÇU¿…(Û¼qal9æ—ÁrÌÝ:Hå »ã¸�4ZãyK¹åÒOKŽdˆ”�Ü0в •þ ¶ºÌï®ÏWÇ®rðºšuug“×…ÇSãó±Íž­üÚn ·çÎìêÿ*ÿq�ÿÉ|¿MÀ¹óŽåé4Г ˆÇÎÑÔ}dã��Œ|ëç€á¥$û°Äú>ç7¶èú¯Ÿc´Y5+?¬Õ{|_PË�<{sž­–,r8^(|.*Ñ–ëpÒëáÛX^íîè;übÞL<7‚ÄÒŽ,Œ±Æ[5¸Sñ?ÙªÛË"-„8eU›½R,�*6å´¥¥’I«(²ŒcÂ/x7tñ-M< Ì6S gf$ù–½†v\޹²é™7¼eãºÛÃ@aʼn9Ü �”Cç)x÷s:Ô‰�»}—dÑ(êrnW÷U{Û*jîwykèçVÔƒ×ýu ‚Æ~ùÄ<Óps#5ì½ðe6WŽbZÌœ<ë¾\ÊwrG«,–Û¹]5qÎá½�bʹγè×D�¼E«2œÒ:œvß±€9�¸!´£’iž¹Æ¼Æ[à\â]c> OäzG>5âÔ [& }y¹IaOq·«x·q·ðéÃõݹñÙic@¥˜Û㲡#ìÙ��EÖm걑Ü$*ÂÛrwmPUiÒ³™ƒVêÈÞ =Û¿ÉÞÌ‹Ëu_’0»r?â­'Æ~Míê¿9çHÏøhywí˜àh� çê@mg;óR‡N¤àûãhêÍίøÿ[x@oÆÝ%wŒøõóGï7Ÿß&Òê..*ûB8娻ØVó–wTûÛÿçÖߦqÀñýN×Yá¿¶jä_)@i.5âź`>à±*‰Ðïâ˜wB¸ýð� E¦�ùwÙ¢ûÎ,‰‚…GpL^*’“`õB1êÄl|!vÈ[É­Ê:&¶ØØc;¯Ò¯>×úè?   ††„’SDU!UTÔÔTS@S@TÒESTÕDSEEKUSDDI1TËLÓUQTDÄRL“EITÕCEAT5M)D,”µQDUSAUTÑQ1PQMTTÐLPEME!DQUMÔUTDQTM54ÕLPEMUSQMTETD”ÅD“0DDQEEULMRÓQTÄE500BARÑE$ÔPLÑLQDQLAUAIDQÓEDÓU QQTÅDSTÕÒRTTЕBSQ5TÐDÕDÅDKUIUE5PÄU%ASEU%SEIDQDÃ%QUT#U IADÑ-DÄÄPÕ$T1A2UUÄUQPTÍ@UR MIHA%ILÕRUUUE1ÑQMMU5”PSQ0PU5KDÕMQE-4DµE%QQ%PDÌÅ@QCSU$DD%4TUQ%U5ELÈÅM K1DQUEMUPQDEU2TÌÅ4ÑT1QTLDÕRÑT”ÒÉ LU RTÅDSU,U4TTÕMTAELÄÄEQ@S$ÁQ5MDÔCDQ3AEDPETTÑUCLL4TUC5MIPE @U1Q2SCTRÑUDM2EDÕTDI4SQK3M%#UQSRQ5SIU5E@SLMUMEQS•Ì$ÉAPÉ̵Q SQÄTE4µ$TÕ5EEIDQ5S1QTUQ5A4PRUS5C%ÅIQ5DSPLAUUDÍ%DQ114C$E4ÌSM´±ÓST”ÄÌLÓTPCTU$LPAUQEDE$E$QI$QEE-3ÑE5AE445Ô�DM%%!DÌÑ5STSDÕÔM%QEU0ESESAU0Å%A4EAD4 M35CAD�UD•TPÅQA”QREUUÓ%UQAA0DÐÓTD“MCDÁÄÕSI3TRTÅ5D4ÐEUM41RÌÐE2PDÕ Q4DRUTD•%UUQQRU3DU5TÍLQKTÓE5ÐÓUMSTÔLÓ5Å5ETD3DÅAIQQ2ÔQ4DU4D%EIUQTUMP3 RLP“% 4‘TÔSMÑE1DÓLÄÄIA ARMÁIMSPTUDTÓÓ5DE1A4ÑPU13T1 MQD2ETRTÅSQQTEASÄ5,MDD@ETÑS5T”ÒD4UTRUDDÒ”DÑPISETDL“,QQ%45…4QM EMDRI% $TQ%Q1I54ÐÔTÕUEQCMA1QDUUQRQLÑUETPPÑUQD4QE4$ÕTÄRAE4QQSAASEM•LDÑP5UE4DA4É•U54DÕRUQSAAKTPT±15%T“IAUAL‘ADS55EÑMTAETETQTDÔÅRQM 4LÓ0ÌRSKQ43DÁDÑ D$ÌÄÔ±DPQ3ATERU4ÑUEMTÅKKTRDQDIMUDRQE%4D•CTESAUA LM1RATÁREDMT5TÓ4AUMRMERTPÍ,DÔD1DQ4MQTQ4”Õ3%%DLÅÍ4TÁM3)ÔÔSTÀÐI$��ôÚâÛ°ü}Ý~x‹ç¾­"§­Úÿ>ø’‡6ÒóL«Û&Z öÄ÷ÑæKñ�ôƒÅΜKåsZÛž�ªYB˜©¶¢æ òæÆo_kùñ¼ „j4„žl‚”ÙUŒ4vŒ�œQ¦y¡·™9>ßž¹oÔadÖØÑQ ý+Љ ÂYª‹ˆô­Ê Û´`„ß4¼¶©¥gÈzîB;íÂReoð�´†'Ö#0Ю öZïy†�š Ñ{‹�gŽðzâxƒ`W3.šÄ5 N¡,¥N…SHÓÍÂîºWa´k¼øwþôß¼Ê=¶GweË�[ÎZ$¨æôfîväTd.¾È Öö,É2ÑgëíÑ~÷ë†^àúãWÇȺ 0Géú0‹T?é×õ¶:ʧßÓéå1Ô(Ç3'ÈRŒbÂýÏŸ)ÚWW»,ŒæÖFeÒ‚§B`m;÷–¯�9Õ<“ô à næÊXÜqÞ÷ò5u>Â+{² Ý·Æ�Ÿ.þyij^zdï[b÷‹.Üç�œ‚¤OõÌrS¶ë¶÷‘w³âyï� ¤mÇÃÅÞ~Ž­H&Žú¨eÎ ©Y=Ý^¡Õ¯›¦n2¯”¥�ÕÔÒü½è/�r麣ŽÓžñ9—óAÓ9Ÿ_Ïuwx�yH¿âüžºƒÞ+ñû’÷œv|{O¦[Ìåë'EÏ•ÝñI(»Îëg?6tÊGœ³¤îËK7ó–©Q=cêùyÊÜ‘ë¿v¸Šôã†|ôœËžK~&Ý»§®«1|ÝåîÎX/i€ä°‹�!¸Q°óÄyòÙœâìÄøèÑ“Ÿ3Ï2¹í•ü4ïÿ¹®zSªf•o,æÀËü¾t¢õ•%B|lŠ�gÃ2’Rýy6r¾C†iJBB0+N�W]Ó¢’ן,zy¯MÀIÃút¤{ö6§zJb/\·Á9“sàù9E8ÔãÈ ó;‡ 3�^×<ÙçPoL£œ,� ÛÈ3 X¡¾G– i¦5µ³Ï›ÈÇ­B9Wo1.-šÁ‚\jÛpfÊ Iª2€30‰£ÑO§ÏÌA½4û´ñ~»?ìWQuó…Ÿá/KœævüMMwçX¡Ñ½® �u|šEâËHWƒ(6Þhë�…f¾­pÕ½e•cYt�¾pl~û�� ®ÿçºJ[÷É$]› ù„^P�ŘŸ ý9¶$(Î-[ ½ØCW¶‡06h[ÒZˆtHeΔeÞ”^,¯ösÖ"7üdŽp_BP õéå*D”‡Ïíä²ç7e;Ô.ÛøéÔŒz¬2,�±(Ú»ÄÇÜû^k¼ê>vWÃY…Ï®cr…š°@ÆV¥·÷åÿi7‹ì–Õ-pµ�-ÿ›‡_å):É›R¸69*تï{”ßÔІ1?½ìÁü=Ê$ŠÎv—¤QøxƒFk·låi}k–6ÿ|å:¿^ÂDŒÔ¡ðÜ¥Ÿ“ëº^1¼ßói·¨KbVÀª(ÀƒÛ-É6O;ñ•Ne~–ð`É×”Ûo(Z‡Ñ�‹�ø”œe8c¦»ˆg™âM¶ a&\Þ×ehê7ëgÇ]2ÏË{5»˜;áœ3ÃähÙF/^-_c>\”OÉ+¸‡,—UìÚcaÅ9•‚Ž<ŽW«_k=ù‹&±“Ð�Ú`+!Kä¤èpÆœÂÐX·e罿˺kTzaÕèøè]†ùÒÉ{î•Ä\®è¦°~<Ä›bóÎì"ØZÔá¿¶ÌU�† -pé"«W}ÊÐßxÿ“þ6KÇrþ×Îåñ¯0ü)"ð‰ÆUª›8º�=—¸{˜½ ±yõ¾¼qÚ}BÁùݕ倜àþØ[¯;¨wbÅ"o©mèxÌJÆ&žÕ˯ÛSC¨;äæâJ5À®ýL.:²!ܾBL¬=Ö2Üq²—ÅGävuŸáÁÈÎŽ²ÓÃÌïmã�œÀ³ ¸wêÝ·‚…ø»• m¨“ˆXSxŒn7•œéÄ[À��ycpE–'fûœökúRë-®—�E§¨L�Îó˜j+Š|¥oÆÒjÒn¬¿9y®Æ[+|ºëQæÚ&IŽ–ýÏ“.,|Â0ÂÝv¢›ÜHUÁw`Ý÷ºO‰@tÛ ˜Þ··”U½&û‹ÿ'ç)/”o¯ BÆLuy@Àã}è.=:°Ã2&ÙQ ‡¼ù5ÎíKHÖ~lˆËS ¨#Û}N$MÇ•²…)i{VJp“¡Ï´¥ìνHaj\÷ D¦Þ÷¨ßMGŠ?¬2 Êë¨n‚Íݰ®ÞÍÍLe´Î:èæ›©„IFÚåLIÚ MSÉY¬îq$|c½¥*Tä¿ä»Çêîù ú�[ÎñôÔ˜óe|–LUN¨æüZËóž+Næ\%7b†mþ: ŒÚ×Vv·Èô…+\š°{Øg×:M妄—M[&¯êE”yrÇg®m¿¥.…½²Ì’¶÷,ß‹ ZxZ›±£=³¤�Q¹fÏ`³ØÞ-é{â¯ Ž¶ë"榵¡ ŽsPßtœzJ"mÍnÅg<ƒâ�]ÚÌEÂ3< c†c¥håÕª¼ãÀ3¨þéÿ™n‰ªXýΞÏ(B r„:‰åïªu§ê´])9~eðßl…³ÚÇ.S/pö\ã[äõ=Î8_HCTJ²lzyϯcJ@#ÈÂÌöuÅK]BOL�tKt» =ßÔFN°q÷Ö¸†ŸŒVÄì©70ÃÇ� *ïúÄ{¯:0ý�InÙ£Ùþ‘šÈ¼wq G#@àf„Q-2wHÔÎ�<#ñÿÆeĶ-&ƵæˆÌë†lÑ‹îöTlÚØ¯‰� qÃ_v¶äì¾×{*Ï`‘øy€‡š8Íaì¬LQ�œŒ3PhUù6]?ˆ¤m({+ò¸¿Qñ|°*Ï`aµÈO³îÈÇð[ôͼA¨°÷MïçMNH2t:wÌ_„ �=Ûž¹žÖqâ~æÍ6¨=ß/Þ§Õòã Ïæ^EÍ ,á¯&5ÒîLýÇ£Nf?:‘vn…ƒËG1ß! 9¤éN¬›˜qt*T ŸˆU£îµÔˆy—Œ¹ñï”La„•x´ß'ÇËÉ!‹0Q�ÚÈ ãaåw4c¬Ê¤;ýiÕ�á)¬ºCÇ|fçÔÛãˆòCc׋'g¥Möóg€úÚóñ°qb©©Sg"„ÑOÏFïs ñ8©CŸõ~u?ô_<}¦óÛ>nJU“Á� òÕ�ÚPõÁ Î*ÈÖ”)Fý/`À#a�6ú¤núᱡa³·Åƒ$¶VµïºáóùçµRÀƒFûÜ“ôA••Ïde ò‰Õi.’�Ñ)Í ©ÜB,!Tgz±?îCÈN�Ok‹Þ¡À*KóÁ3T·[¼8é×XÀ1Î¢ŽŒY]½Æ.ðG:>{,ûž,¥bã<žü¨–îËä%7/ÞyðóÂtˆêV¬‘Ì5ƒD|%Ù¿#KN|iúoí&ÏÍ ›Ž›*¨ÜѽµÞ¦ SYÞg¨8ZVo?Öîñâ0Zf�0‰%Šel-ZXwÞцÍð»ù Š6tNÒg�ݯöŽzP0áÝeI¹h­L3ä¤XœŠ¤K”&ÐáUc‚®i4>ñ ê–î=6x¿z” ó-?¤nb\f2óiQ„Ä_§%R‘�«a­z�-Wº[ŒâЧï O»:ªn,ýöOÿž«9=³Um-,Âcò<ŠnLë®&{ÁÅÙyræJþzèM¬‡¸ð�É“ –ºiÉ’F9T�…o\ay{'æ|K›q!i6–‘xŒ9¿$âkô$L÷çŠ Iƒ£8´lÉ;àCN{z€8~c@Ù2ƒókÓžÚÐ÷—ݶWö�Xe½ì;cº=ª:4õíDÛÜ1TG};G-3 ½é&öÎ¥Ò¬³Ó�JáJN¹Mj§Sü…&ä#&ðÜ:,öä˜ÞùcŸ �ñh¢pÇýÚÌÜ/Å,yÛ�qßúý� ³/uñí.Ð4E¹ÆÂÊ µ²N�”™ð®4‰qÛ�ëV "Ù˱èq Õ&òFïWë‚9÷8^½³æ`á{Iér.¥wÏÞCŽ:UÚª�ëuI äO† "%á~¨÷/0c'½N'g;`Õ¼l0ʯ&lKÄ’î ‘y⹌’º/è«1õV�ëù3{´;Z?`|òÜUÝó©­x{õMWÖ7Øež>jðž÷e�ˆ Q«"½ƒýTÒsÄÖãîmÓaO>"à:íŠ.öo¿¢}{×R¿Œ•J7èçlÎ ¤@ß7ëéíhÖùÏóD—²Q9/>;O°-˜<ÍÏs@“ØEšn2œšv‡¾7ë;gïn„'Å7»1ÜòL}åU½o™Wu_iާ¯-ܵôy^~'‘8ÍŸ3Î]�\Dþ.{Ü%ÐÀ”mT]Xü·�’m‡ â Ó$ŸX‘×1¥�MF½:qV‚†h*°¾V[o ºâÉð ÌI€êsm �?ñõgUó\þÊ;Åé-²5—lf‰­Ù÷RU¹‡C§ªR*Êù?5AchDú_;¹Ÿ½ýæ%•üG†d;Ýï®Þì·¾SâÛÇKì�ÏA6W‰Kc]üã.óZšO®oAó{j1C)$vÁ»Ô¥ì¯s½â´�·!4qqŸAïß��±ß}¼ìÏ%oä»â_M/¢ù]õßI6/²…Žxæqõ,ˆÃ䦕�_›öÙshâ2�EÔY¦/ƒÌÙV¼]¨±HÀ¤û·‹ûŸoN“•rÖ \=ÆFþžé=„g8šÆ �q¨'—M¨^¸ÍóP¾…G›@ƒçMk~¾µ™Mß펃©„jË »SÃ|u†UÇag�¾µpÎøRRµÛ:`‚€(Òù ½ºv6³l¡V8¬uûf ä/|}6{˱«YÌW]“¸ù¹ôâo"ƒ¬;ê³uIç¸)„dËù�ÉÂÊ}Wè+Ýzeÿïfü:Þ×c'z=§»VWäl‰(k‚—ëcáÖrwä=×LvÜþünz®W‹k÷m£»x‡›‘²&'ƒò®y‰JÒ(—š÷r˜Júèæ¹·S¬ÈùÛ©:äp#�¬ÈJÑjõ9Ü[(Á9•”9qRÔSîçi`»¤×7ŒÇºIî¼3LéfÔJQ[¼wÛ¦gÝ lÇÙÁ®îªm|gÀMèüKÃߙ֦w�aßÉÈÈðP[À)ê†_FÒ…˜éH>äþqöò‡ʦûûÅ£æç¬+g¯Ê±“äIÞ°éMf£ómÌ9½&¬á[lUîaò�^)šU“ˆù¦·Ø9Îcþ ò¢ÄÞ­Ÿad—<ïٻþõwtmË ²gó®c[—.÷ØÆÁ¾Ð´f·`³Ä�aÃ[aQU·6QeLНüÞ‘À¾¶^ÚÙw·&è¾Ðú¯÷‡ê�kb{`ήc5uõx»¯ÖÁùÑ<~æ1ÜÁßÑF&SèGwWѰ~º=p?ñó¾cqqýé»üiõÇY!° NØ#Yóø4Rñ¶ž.¾<ôk"ÓŠ'9E•a4,)ñ5láLêØH-þ‰wf—»Idz¿[£d¶S¥ "âÙ`�:G!þ24ìßôjb�ÛˈÈ9Ž¥)Rž> ~�H^®ÂÞ’k„A�•èñ˜sË3D.L*šuH˜4„y/ÜC¸‰ÅÓÐ]¤–¦Eªÿ•‘żj™»ý“ƒ-sÒF—=›è³­‚r!1éóãŠâûkŒý‚.B|ÙÔ]]3‡#Z…m)]\ÖøûI œБêHÔ[O†Dé5¼5�óëò?íavÍÝåoI15~ã^tÝÞ×Õo€kª‡ùÇS±ÜŽ ´“m~2à<·«3Š Æ2�<½¼PœrÎ8Ç€º¥bG}Gb¥  _Ö6ŒUúlp2‡8�±ºåâ:ñg«7 M÷—–ñ²ï«òÝó©såxc›ä£¦U'yoSÃÅÝ@Ús+lVsj †’œ ã/4‚«&³²ÃŠ·¢"]-åÈ™œ�g{„M’é”ǯ½OrýOËr̶Æ[øæŸ>®�ÉÝkהּÂvŽÔd9yܬyB»»ÎgX Kü˜b–lé�ë Æë–úwëß~㟢«ÂE�¤ºsã»Áïš?-Õe¡%dæÕk²7ýÃïìÜz‹úîÕ Öhõ!ƒ—UÂ+¹»#±5<ŸÄJëº×ý•­{a-»çÞ(q—øžçªr°yp„ðwï ?óLtÐWe…ÊV'¬c¨ñ㾋’ 4;�-£‡á½½0—øþL/|wª¼ÃœòÿõRkWóÌaʱ�d®a—ξâK“»‰W¸xïᮊfËëq힣õ¥ã‚“>¡ãÓúË:‰°”êû¶ÐòµÚ§m(Õ�~Ï­»i_"íUŸpç?Ù» §?õq�ãˆÕ�ŸÂþ6ŽvÞxÏ>¹Z”¤÷é&èR•lÙŠEâõþü¼¸"VŽ%r´ÚMrü¬_[ÚŽNþMXƒ ©+¹ëÌù| Ûð[ñÙ9ùòü!V�áü$¡q8´óÈdô'‘$1dºnQ¾í¼"šåN¥81gÍðÆ„F„l„¡›5™l8D8 ±·£\ɽ·<·ì�‚Á±]ä6ÞïæäÆÞa:ôì­á-(êð sÐÏÇßË�l>3©Œµîzdðð|¡&vï³ìÀëÔÑŒœÎÄÏ`ÇSøÇWb*JÏù&L2Ä{ºîxӦʇ‡úaÏÂÉW¦ó‘J×B0ª:à…OÇ+ýæYøAg'Qƒ[Æ'&:\‡\Ýjü�Ox¸U3Ì‘»Óë³on›QŽ8VÇ$_¸É;e'ðeÓ4>«aÚ†ül&„ÇÈ.8‡ŽîknnzP‰ûòy׫°æT6ëdJS‰%–¼€©ö…Ðþa™¶?Š®äÂsiýOØHÅñ;‹ÛÕÁçGÞ¯Aq9êm¼z¿¹l\DÞ!L2ý¿äeYNÒ$¦P öQh Ë[«v/lD‚Æ� ,61ÌJó³fbFî�$ †¯6–åœÉšvèù³ $4m�.�Ü!ÇQË� í+ÓÏç]Nq*é•«”,¢Êt‘Xæq­æ[ o•˜îŽÚÐùoµ4î]ñ7Àxêv@Œ R@fí�ï§vßçχììÂë(ÏGÖ/Ÿ7Ú¼qš�Ù„“t5âêµätG¥O¹´ûR‡,Ã|û½=¼�ìtÙ-³ÙE.)öç'&cË(ð}Oã˜9ìòâtJ©ƒ“òxã~±ÀÚÒî%ÐqÙzòRã<>ߺé‘k^•æ!òäï1Q×?[Òv}IÇ࿵âË·‘ÞôøæTu…?ž}Úøø¬[2V%5O|æÍ¿Ð$T‹.œØv³g•Žž8Î076‘þGýôîL½/\ö6€ýÉæž¾¯Ï8ÜèÏ‚šMÝJá«S@ÙUÞéß“ÙL¾Ù]·OÇ'ÿƒëXÉCg^M”>8¬pøÂÍ!»÷ûîŸÇ6!ó'÷åßpãö¡ÚQG}h7î¯Ãüà{»vòý½ßæ_\¸0ŸÈ3�JæŸ$ýZ�'…Eî>‡{ãŽ[œˆgóAµáѹgxÞ-i¿\¶N>!ç7ÖJ&“Ã-„¦‘k¿™Õ'œŠ™¼âÄä:‘žšnÇÉ!”A—’<^&ƒ¨gö0’Ÿ¸¥™Dô\?†"Á«�†¿�Flj¦÷ã±­B�Ž„ÞÉÃ(ëP¸–ÞÑ^£ßÃ*L›COŽö}úsž¢uýþp?W‹uÏʾ۷›*νœÄ|“.k1\ÚXDå§ñãì[ª‡¦SP±ïÝÀŒ=€ø‘O4Nô¸iu0‡Su1Edâÿ]«ùò rûÏ5RµH)þuÓ{»)kõqŸ�°Q‡E?{aŠV›¥ãã>œS  ÑêQCùïùv|ûòG÷ ½jñ$ÝtÄ«“–½oÃ.ÊÙ¾SI?p|{¦-$xý` ¤ÊLéÊ{zù¤†UÃ"çÁ¿< XÙ:Ìi7~K¸ª±r<Õ”y@ÇpûÄ <�G~&x®é¸àÕmW“Dƒ‡Ûå]óeY†>: ÕÍÏXt gWC°\\¿ �íF·õyÏ~Õ‚‚�Ì칯X¤?0ò  š·c’~8º1Ú<;ÛÏ3´ð¦;ó#ÃÃߌÄIl\ jÇ&ÂmWä:|‡~¥a!Û˜rØ6õèÊ„•1& ªâ�¯S¯(�~u–¢õÑô�Æ¢WÛuÜù�›”e6´�B„ˆ9›i}8~xMcìCº %:òU”ú "0KO¨ö|²·¢N4ÍÕ®\…Â>-ÍÃp㳂׿ü DÜ%ÎbRb—0ÏÊ®šnË3ÎÝù±ü62ºG=õ™QU“-)AkF¸ÞlmØ ®za„°Ö|”^�géÎ>±š�¥uñèöˆ³ØŒP‰'=D)SÙÒ¼¿|Ò·‚ÈËóÝæIŒ|‰fŒ6ˆhoÉQ¸i§Ç ›õI+�Žõ.rL|–ÜÇâcºÑ$PGDÿh½ôÓsö~3bßrý`Kx2žÒw…ކ§U+_ðlµ|ZæÊ§Î_�²A¶ˆ4w ß0¸Ú!wñn~ßTNm¯h+£“¸ï¾žº&`ã´ùOÄLÔZ¼�R^Q•€õã.°k¯‡uÇÏžB­ƒGø9mx§_λ6é_æ[„£÷ÝvÂ{Vü§íƒ»Ïž82‹Ì€�ñ¾ò¤Òªür¶ÎÃBN71¿Ó¿Í5°Ûlë1Òå°@u®¥�uÒÙ'æ>“¢Øxªu½eF¥Éóò­.è´Œ{†iYæ|D�ÅŽ.ð< qûËY �uBø¥?†ç?¤¬Sú=×�ŸkÍ_ÛÏïÉMA�²¬±…x›/._¨:ìî¶Ój0‘|¯ðœ3g,y ~aË­»Ö@âæ7m³­pÞÞê:sřşUœ0¡’`¼w ã—kâ�3Û7«ZˆÊ[‡~“b1±ŒWvcÜ>µÃ®S™}�a+wQª©ãÜïÜF}Ž”ˆ:£õ7»öý{ó�™Ù†ñÍ un}áHW=g?½w/¹öW¯!ïiO^fb”�xE°ô´ùõ¥æ†ÓõÊ";�¯Ïد3ìø;¾3bŽ.wº8jp|•‘Sª¯Î=‹74�Ý9«„ð+fnj:~q¹jÏ‚#I›‚é•Y|7º{¬Av¡>úºÏì¤ÚìNývêïe“&ž½uC6›È\=þ½£Ã.2ƒülí?Èz1,ïvâ^W¸C�æ%8€‡C†W zP›"qé˜Js6Є¤|4“‡C sÉ¢ê^›¡õ è}IM›…ˆmÕ"Úa”ßF¾8îLâ,”ÙG›¾h4ù{­ œó;N? È1–®"ú;«VÄœ}R‚È{U!ø2¿ô'·MÈÉ›-Æû�<".Þ¤Ã)¶ q7>B}|¯‘Ýí)3‹\«Ó%å'c–Ý$õ�úNx>ÝU*ÒÐóg*åÁÊé”ržQÇÔP]‚¿ÏÞbÉ:VˆáœSë�Ÿè¹ê|çž1ýa¥^Þ�»o&~ÇCÏ�OkRt÷jÙ‹­7üwpð÷x�­nÓ±+4ÿ‘Ú�âÓ†÷ÕBC—ßÛ”&÷òr�Ðñ´%´³9±éº&ÆZl÷Ò×>ÅîŸe(Ø�"²:é™Y¸œÛA1¨¿Ê˺ס'ã–Á%yK©ä�J„Lo]AG¨"k{ñ‡G‰ú{�b»<ʈ9=Fºµõ•—ÅœAFâ£ttJÙÛŒ‰ú.2!�«¿÷÷ÏuK -c—�«ÍÝžÈä:ÿìÜåägd¥YH¸�³r¤_ù}^Öÿ•Ö•è‰ÀùÎᬧÐC»4ɶLs�Ðn°êssóÖî©]ÇdP#³¬Î˜ÎâÄõÙòþbç8½]×…ý¼Çˆ}äU ´Gı "¤àŸýLÒr›Ÿ§S‰„J²÷tHE?a•„EÑë.� óØ]ÄÇ¢¸¨†BžfgÂÔÒ¶üã`ëÎxãŽ?P&±XÍÛTƒ¡�Ϥ?ÊÈɳH­�m'®u\ qýïž;—t·�ä²°wF/&Ý÷ê׌›ƒºm;±ü=e²µ¡RÆ·bö®�úÊC Õ-è�Â>=<%ë¶íŽw]«ÇC„8ˆj ãsxÜÊ|SÞ·�ÏR²Æþ9å0€´nþZE‘CÄBýk~QÛ”ñ[åÌ—Çå|~8“E²Åx|ï? HÏD~{¿½ÿÍŠ©¢ˆ© hªhˆªBŠ¥j �Òªžý”C÷EUýˆŠ ÿ0@T @Ý$è ÕUAA?U5IS Õ4ÄÄ“4ÓLSSM%APC0PSUTM2ÐENP?ÈUrŠ(&@€A•A\9U@p ` *¢åQC˜QAy DC‘®Tdþ€�ðCô¨ ��ÀAESöQEP>?¿ýGøœv0c»Žký]´qÞ·c»¦*í§¿[Š?xü¸ûnß–Æ×~`=DOäúêz믧‰ãuùzŠõ¡ÑíÇi;Áï£îúî7Ûïµ^k0ÖŽºöÅöøŽ�ƒ5E%:+¶?8î~¸âk'Zè¢1ŠÑ6õ×W_—wŽŠìj‹¯½½êŒW{·7±Óõ¦ö>ÙŽ÷;�mú‡u±±¶£´U}äû½¸§Ñèîî;FŒ]4x¢¢ ª×qÅùçÓÞüûuí}ÛˆÖ5¬ûcó»ÆÕ}Ž.1Ö½î`ÞÝçØöÇÑßz{kÚ¢)Ö¨÷wFÛÚ׬_žë§èÝ¢ï¼w­«ò=öúûvßO¨û½ëÆ/ÝD?Ö€¿Ô !ÿ1BQïDÌWúÀý¨ˆ¿Ö ¿õUSþªð  �?‚#ø ¿ûyCû¿b* "Šf„Š€¨¢J¡ ¨’&¢)„ˆª‰¦š)hª ˜˜€&ªjªjŠf"––&–& *–ŠªŠªŠ€  ˜ ¡ ¡h ¢ª¨fB¦))iª¦H¦*‰Z *"*¤¨†$¥˜ˆˆšj˜(R–’¢(¢d &"b)‰hj©)š’‚å@åUøðU T©ATD”©HP%45@ #UCJR…PÈ‚¾ù(!ø¨¤A9@@þ(ýb"yT¹‘D©UL*BDyE0(À¢pÈ¢”¥)JõlURØpâ+.è=^³1&\„i*aÓgi-ᨂ©JL84f•g€ARÎIfI'd ЪÁé Ø; Ä;”JÆ „Ï%ƒ%%Égz¤ÖÑJ™V,ÈŠB%Iz̈R 9‡�†f³¢”V+(Àª ‹ùoÏ®×ÆÇ·®ì|€¿ÉWþÈúCúÅAþj‚>Q?¢ýUþÕ| €ú‘DS‡û…Að 'ù€¯Ê€Ä@?U�Y $A a�`@HA@’¢"ÀŒ °ˆŠñÿçþL[Gû»»ÐE½àîñµÄ×»u×nÄv­¬hÇAmÆ649íÖ ô{Ù¯uíÞö+‹¸Ý{½ïu£]vÉÇmmˆ¶ÕŒj61ÙÔuÜtÝÆ°nµ¶«ˆÕŽÑ£whíw:×E¶Ž�ÝÚx­´ZÊL×ctšÜn‹FcbĆ‹­­mÑÑÖéŸdë]u½ÇW¼whöݽŒ~*©”CöCù+¡ÂªáÀ ¬ ¼€Ôª¦DQ÷Dþ¤‘AYUH%A Í?B€.U”HQF@1¢š ‚¢¨()ª¢š)*‚†¨ª$¢–Šh¤‰˜Z ‚š"(Š""’!¤¥¦�ªbZ�¦šJ¦"¦šH‚¨i¤(ˆ¦˜–™”ªøUþ@±LŸè>DrÀ«À«••ÿR¨†< !úTP€„¤R4)AKT””SE R¡HÊ€  ÊŽ*© Š'ñP<‚ÇãÐhÛË�ìoo£ë¢/«ìD… ï¹è‰âw°{¶�¾àô}/ßZû‹²4§G§½ÑpRuÑ Óï½Å>�[ë—}‚‡£ÐRb}Ž€¤¯FŸÏQod×IÑÛ­ÝwÝÝ뮚/±ºÉà“v=tWE>ÚÕÝèö÷  ÓѧëÑëâìãè;µc¯»Ç§¤½U‹o_{Îq>Üpzh¯¯Ñõ÷·Ö÷Ýݽí_G{hëè÷±»[»Òk¤=±CºÕ÷¾7S§G¶ }·Ä—ݹ(=uÝ»Xq£Ý¹7½¹ñFõñï}w{ÆšôwÙ>iÞûƨ×ÑKöÞûí¸(­»µÐýÇ»ÅC^£ìý3ãmíÖÉ£§ Û‹í�{zÑö1v=j— ûíA^öúì{‚�ÐèßgHoo¾Û±Ó÷¬W£{&�zÛ#¥:hÝ÷uÐ}ö !vôúûƒÑéúwÇÜb>Æ4lëÞESöDSàU‘åDùX_•„@ý"ªÂ< ~(’)JiTii„Zi ZM JRº4-Ré"šTü…xD÷ES•QýÅ�À p¢0¨9US*©€…€QBDd¨^Šôî:Û‰tWEi(j‚’¡ššinÁº14TL5Pv0EAkFî{XŠ#¬NŽƒAvÑ:kMŒVÚìÒmµ¬ìwkµµÛ¸ÚÑmmMkžŽØÐb몣 ÑU]GX�‡QEµ[%ET54I]vè"k£VÉU£ô 'éYþåU8UýÀC(~ò‚D#T @…4´ˆ~ ˆE?BŠ ýˆ+�á+E·b6bÙªÄ[U›c¢ÛhÜ]¸ìFÝ6:�ŽtöÁ¸Åk ®å;Œj€Ñln툨�ÔÚu‰êºzÕÈDñqpF± ˆÚÚu�E³ºîÚ;¶�vÚÚžîNÛZƒn´vÝ1U4çSV΋¶ƒœb,b;º8‹vÇ;QcŽèØã¦ˆŒN�¬›liÌèѳ¶kº�ØØ6­T]Ïv0Ñ�l`ÐQ��mFš§E5Ðk‰5Eض5×l: ²ZÄljìc‚ÄÆ#UE°mh‹b­µF,VÍ¶ŠŠ‚qmŒVgEƒuÑv‹hµqÙ6Ü÷qƒm�¨´Q·sÄk ;Œ›�Ší®(µ8Öµ®í7Yâ õµª;n¢*ŠÄ[\wvâ8¨ºimˆ�m‹V,EtŒ:ÕØÅkWv"�&鸎ê-u[�NíÇ5U¼Š•Tý &QøIUOØDò#À¢p À„(¯éUQ‘ÙAà�ÑT€R´4œ/QT•QPP´D¤MLME $T… MEQTЬSD…4дQEÒSÑDE%Yÿ`¢TL¨¼DÓ•K55AE%QÓAL44EQL5@A3AURM54�EIEäT€ˆ«Àþ„T`H@C€eÊ�") þ…9äU2 áD$#ýH*?¡Aýéih )¥)¤HšH†‚( ˆªª!h*)‰‘™ªJŠ"Z¦ši¤©**�˜(&$‚bš¡hЦ( "R&¢RŠ)jŸ .Qý”Cäý”õ¢ªÿˆ"" ò UXTPý¿º¯ÖÚÖ­µlYÍûïâxö‰í:ê½=Ù¯ç}zÖÞã ¯»Ç½Ýµô=׺Æ1Ž»TXÖ‹¸Üí³hÆØèíÆŽë¤ãn®ý®}k[l{q˜ÅDxÙ§NÆ ÙÛ8ê랈·c¯^®/qÛ=qu®½zºÞÝ·×[·çuêÛí£×»{ºí�g»­DvÖèàà뢻gëÑÚ�i§Û޶îÔíov=k·q¬Oˆî¬Ñ¢�WAºã»k·×v�»{¼QëÒrlQõÑT?N>û�ÙÄmvâª6÷½ïcÛÝŽ‹Eî}GZ=[}ï^ûn�¶œíÙ­›Õ�ë·n¨Š×¦�½ÝûµÌ_}ÜW¬[ÛC_žÍq'®·ºî"{¶Ö×qÝ�Ý»¦ØÓ§AÁ=ÝØ‚Üsgv7uù×]í®Ûm¶bǵØâ5EÑÕÇuŒïÏw½cœlm£¢7ímÔwbÓ»µ·;Û¼÷æïF5½µ®¿=îÕ¼nÞãvÛCîÕG\NíùtUÛEvã±{»žçÛz)Õ·uÛŽúÍm�±{»;s.¨¯oqêícPh4jÕÜ~{O§·qPuWÛpD{ž‚öõè¯]uºÁF�íïgÛhh¶4z_ õôoƒ·V.ì]�¾ßG{îúû½Ý AŪî×b¨éë«cóØçEWhÄ\TF0h¢¨º±£ªµµv+Üjõ½¾ž¨ïmÚ�ƽgm£z7nêâ"îÇOZ«µ`îµ­¶ÕcA¨ëwq«Gnë�mk»ŸXŽÖÖqž�{Æ�¸­ìꂊ:··w×Wb�44}îÞ÷»b«ÕbÑZŽÇs˜¶ëºîë»o½×�m]cŽâ7öÝvÛz÷œÞ{-héŽØÝ¸¶{­ÄqÙ݈ÇÜuÅ{wdö;Û}ß{¢�6+m�µ-µ‹:ÖÝ»®ëuvbÜnûîûØÓõ®ºã³_lu¢½k®Æ7绯WçkšöÎÖ®Çn퇉:"+ÝÇoÍ×Ðnîê¨èÄ{][¾øÇ[íÛ±GF#Ž3Ý·níZý�Ò ì9Ur"’‰"� À£€W*†@%`Q0#•T”À™\ ¨†DÊ!�p¡�P„B*ŠdÈ@€’(¯ì(„¸jš" Š&j –)ŠŠš¢š* ©Š**XŠj¨¢¦ Š(– ¢ù*®EJ*Šh"¡¢¢&*&¦ ) ¡ªd 9A   €ý�H^DöD÷ ø ÂGÈ¢¾_œ‡„A9Ȫ¾D~Q”S")àD D�9D8àC þ#Âñ4SUTø�<+ä2ð(Ÿ¸(œ€�?‰D5D„MEÄÑ1JPÐÑ53E•ü$Q •ô€œ€òB üˆþȪ¿(#û¢< &=�¬8‹ÛmYˆ¶£X�U°hÍ‚ 9Åµš±ªš‚-m‚(ÓŒl[V‹dÛD›m;;¶,V‚¶Œu¢´j¬ZØ«jÚ5m ¢!ÀL0ITöÍ:1QF³:ÕU£«EFÆ"ª*Äè‚¶uZÒjÕ53DQ;£F¨¨‚–Š™ˆ¨Š ª¦ª­iÛh4ÄEQTÅDl⚣F(60Em�¶ÚcC1[:(* ÛEµÓD:Ä”ìbÛFÛF¨¶ÌMQÔÓ  ÌUL°lcX"ªŠbµ‚ÖbZŠc6´¢JjÑŠJ clUAFÙˆ¦Ó–¨«l­ScN-`ØÄPëS4ÄÔiqETE³TPMbÁDIVΊڌDÄLM­mTb¢Óª&%ØÔTEkQUDÔÓ‘UU;Z± °Àyò ²*’ªžT}~÷ï§5%EGlS¬A~mE!{tuÐcv6ب¯ÍžûTýîÁÍ]µìšé4VØÖŠ"‹F£µfÞÝÛM¶îñã�c^-³DV1ÝŽ´—£5FÆ""+ Æ´úõÅ?^öO¾7Zìh·Ü{ÝÝîñ÷Ú$�}ËÓëDÓÖú3TݲEQöÔŒ‘w»¯½¹*©Ö.ƒ�ôjÑqƒ¨»X::ÓˆúÒ]m¶Õìf¢"í¢"&ô}Æ*�³èݳDÓU÷Ö¯UF“_G­Æ:1¬mºt½mŒI±¢í«¬z뚪"-ëº J(¦¯;vªõ»ZÑì[UÛÄõ]/]EkÜbŤº5öÍKh5vÞÆ$­`÷·£»vÕUhÄQö¶Ž�GÕ´$õ¢ ¶{Žíìhúø½xˆÑˆ¨ŠˆøœÐU¶ÛÑÓ5ÄnïrxŠ©ãÛ€èÔǶ ,gÓÞŽµÓE]´PÇ`ºîé1z£tõÁEÖ®ÛÕ¬ãÖm�Sv5{»dé÷g·®=»í»ÏE6ÛN»;£}±ƽf)ã9¢­Øèƒv<{ÜÎ×c¨ãií�¯QQ­ëEu ½�C×±�[Ú½xãªíŽíÄ=;ޱTãaŸ¡ñÙ¶3¯£¨â ý#×½ë�RMPV­¯{íïE±­­ª5�¬SI]h§®¸�­{xíuëq¢`ö1Ù½ÝI^ƨ¦�´vÍ;j.½ÃƒmÛ1ª0E[;‹Uö;µ5v÷c¶:ôúôGlÑ[1ë“­µ·sën=xÓˆ4jª(ÑÑ¸ÆØÚÖ÷:�±íª=ŠÍEö4Õ1}jÛ%¤Áë·FØÆÕŽÉ™»c¯½½4k¶*ƒéÝ�V¶�LUí�¯q×I^«{±¯½ãß|!G·sÜÞºj‚´Ÿ^÷»A»ºû6ÅÕ^î7h“­Evûíé»uFµUI}±£×wn{5PUcb­ŒUEéÁìvãÐúc«“Ý´z:'Ý»ÛUíX�²U&�\Q[wf64LN؈‰¯k»­b½µL—­ßc¨ª$íëƒcèîsôn-±‚Ÿ±îuW£­Ù݃j&‚�h¶Ñ{{´Sm÷uÁGÝ}Æ"»»£`³¦5ô}ïAÅõë¶MDE7¶ôâ¨ë lâ�Ý»î3 ÑŠt¾ÝWcv-º4Fíj6èâÖžƒE>µèÞö:b(ˆˆ8ÝußwÆÚÕm¢Ç»ª«ÞÝG§Mw®jš¢íõõ^$¦ú˵Öѽƒ�_Іªƒ*ˆp(ä Jª~ !€@À) þê¢$Qp¿�À� �A!C…ÜW”C~ª¸ˆ¨~çþö´f  Áµ%¢Z1lZ4m[j6£læÅ«F]6ÖÕŠ­� 4h6ŠÚMElV+Q³XÅ�[VÛm­¶�µ�:u’4h*¶ªÄZ¦f£[mjqF¶ ±F6Á­±˜,m¶Ûk‚ÎlhÑQ6ÖÕm¦ÙªÔëmˆ´YÆÉFÖÅ ±µ�¨¶Å6Ø1Û5[j b±hÖ5±�QR” ETA~�Wˆ  ¢…¦ŠZ(¦˜ŠZˆ"¨‰¢ˆ¦&¨ ¡w _¾tm¨h(ªHÖªj&––’"šªš¶4;8ˆ�E´eu¢ˆ¦ZbÖb¨ˆ¡ˆÛSDE4¸«4ATV„6Ø«F’¨Û UI;"’© ˜)§c:ÍQPTÀÄ%MÔAIT´ÐÓlj "63l”V&‹X¥ÐjªŠµ¨¢ŠZjŠ)¢’‚*Jt´Vš4˜‰‚ ‚©ªŠh ‰X‚‚Š˜¶ÓQAÕ8´EZ %;f$¦�8ª‚ˆ&š¦Š+c/Ê!Ê�žè?PUAA¤ “AN´”ŒÔRP´º(Ð4&�Ť t©E%%D¥RÓÐ&�&­Šm�*D� ÅKEPPABF#@št… M–Ú¤)+ZJ %©�¦�™&š¤(B "B–$ª ¡¡(M!‰¢€¦šJ  V£e4ŒÊkZZtRP”Ò4”ÓBS¡¶¢�Ð`ÐDÒPÒP4� R´KPS­%+ ÒÒ” "RPPPK¤Ð”«BSM4¥%'èQÒ2ˆ¡à‘E|Š!äU$8@BTC J!�*©�íCDÔÑE4ÕPLTEU‘U3%´SCAU3%U$Í-DÕ!QDSMEE%D 5”­ÌTM3@MAT¤IQ@S 5AUA ]B€ET`S÷P9D(„¢�"ªåøŠÉDüüüÏÀü•ÿçßúäQGƒ_úk@›ßý·áÍèR„º@’'ú4l˜„«C9XÚŸXRbÿÜEˆÎp(Ì_õƒÝ£y››ÅæA\¶ÿû(÷rÒ+�N1¬VÚR_Â[®ñ�Û4ÆY¶p…Á.-â‘ÆøÓb¸;ÀîÙ ãz® p˜íY DÊ@>[8Å—þ’È«V„dO„Oœ bðz«,JnÂX`º 2žîªç|¯a©˜S¯|Dº�ÈÍ‘�20ˆcƒ'ÔDy.äí/Uq&P½îY+ªX6‰93eÀ3ÖÕÃXî6âêŸÂhz7F mU¡KW”†sÂn (3g}½oEÈQõ€­Ú¥.[[ßW—õ O-Îë N{bªs®¤ñÑXè¶ñ�ú˜!Jj^£â*â¶|¥¾/qÎYäX\¼¾°³‡ª!:Æš&ÍŒAW6läNJª×f±›¨×}¥È[…:º¡Øiœu 3Ñ]cTqOÿÅe…Êš¯a¬Ð宸B¤@ †<ÕŽ�çƒEY)G;2†`9®½›˜Á¦ Ê:m˜‚]CX4Öšõ|Kš¬Ò%!ÙPõ›žÊõ*�Ñí¢žÈM÷õ`âÈDº[N%õ³!Q%Õ7\¼qækðé+G«¨ˆŠìOÌ£®›Û Ï5»z–5mƒîÝ�tXu(ýÄéémí—¹Þ¿�Û�/_À{»ÒvÕÃ{㯊°½ PZƸ޺--'¢.PÚM¼5Ƹð¢'K2‘ÏNâ¢DÎ G:†íÁ1Ç¡Qnèü+Âö ”-µ#=µú LXìÓÔö›zE~j¶™'ó™0Ú?RÎá!A+ù<³û¥S«M£w´a ‰¬¿9áW�úÐ&·+„P8ËœÙèl®9k“a¢yxͤ²úÀ+d2f{¹^à|Ëçùq@DÌ”"Æu]%Ÿkr<Õg!÷:ž8Üýµ©—¤ µ|;ƒ{6Ò˜ê|{^rþ3$9…Í މ`²Ç'zéð퇽µËHîÍzœÛÓ+xfì—Yœ/3‡¸CS¨›2ÝWmš“˜¶ìõq Å2]¤äÁÛA,®¨@yM‘…íÉFW7¾(í€)!\e‚®1Ä ¢l^iHÁóWP M¾§V�ΡÏɸU6¬†8§1–™¬ÇK©Õ…ÛDÍ)JP (1AJR”¦Å(ÎC’Ô=a_T˰½FÔ #š”E±Ö%™1PÖr&†ÍMLHˆªôc ˆv"‰²Ä±g&Y œgw LJ¬„ YDŽ-ÿÙÞôfÞÙòFÄ8»ù= ]�G{8më÷ïÀöõÂ*°Œš.-?Þˆ¾üäÄ¿m#ËÈò8Èd?'P$`×dztr-M4áªE¢€Œ¤#-P]&E§ù†µYvýk 4ná¶u‰kC»´,ß=< žû.&ͬ@¾ 1m`«lîV¥Ág3â ¶\Ð ô÷œõP{…ÖBmÍÍfHõêqr‘ì&_ nªdeÌŸ¸¬bu=£§q}‡ê‡_.3!FËÝ6_æÄ&o˜»ìœsøZ~ìÎÏ>H•"lã“Ëa×U¶AZñŽ-ë“’ð èÂÔ z)^tT ¸r8•wQmûVÖ"Êg_°ÿ¼Î±»BF©íÑh-Ö.³€·.wÂ(tIZ«Û èV~籺9NØuO¼ë�`ãà�® CеæCU"\èwh žy n[h ¦›Z$ /‘¯‚. Ï£4Ì�—òpíÃæ†s<ÞoQÇÚ¸?5«Œ‹Å±vlùG4|i íÃÂájƒ;—ëšÓ‡Ü4¨Ü°þ»I#mþ[½ppá|U]k"tTÕÌ œšš} ´Ú˜ö@Š7ÃêµZiÂÏá–­ç.¸T_m¦˜” Æõt¶”J¾“u©—…h¶-ë§µ·GZ~2a÷°µ0ß: ¹mLrŠ’2ö:eÃËh2²Õ‚ãå7:«6ZЧÞ!ìfäCY*³@a¯&DUúˆöAÈÓMçuFÎgƒP�RîíÖ·–ú12¬¦5de-LÄçñÙð�sQ# !Úú߯L;{±nÔ’(`D胦ð+ªk sH•#ùËòmL¤©P²±…{¡|ÎÑzß½ÎÖƒ;-@ðù‡»Ê="¦­�!­€Ü 0H0e< ¦"˜K¿�‘5é›è£y �q�‚LÊÙcì>wü} a:bxéÔF î¹Å5‘Œ¸Æ3÷VfÚùÀÇÜÞ/'³&~š§A9Buü†C¬•°××Ñ;À…UêÄýz"ý¯‰Ý£. Á¯@æÖí\ò·¯x‹®&U- µûñ¾ùÜSñ�NÀÇ%tÐXQ³bîVˆ<¡�´¦Oùñ ý‚� 91è÷ïJ4@e¯„á&Ð�Ytr6¡,9 ŒéA]ˆ—C±Y±ÓæÇÌEVgôEO‚ùþõ)öhÎ?ûò}!ÓNC¡b°êûh’‚P5acÊ{x±,X/ÉÌ@}ï�Ý#Ç Ÿ»{_ÞÃ…YyÛ†$@lmÕÞÖlãæq÷Û³‰¾¾ŒÞ:4 ¦È £šPSòéë”þP�óþyì”?Sþ¤�ã%(<"‚Æ”]*> Rƒü(l=<þ7_Â=¡Ì*°dLBuã¾B“$ç\®¡üJˆU6€1ÁÏðFÃX.SbÄyµíõ7¢7‘äÀµ_jØ„¶}à¤LQN]?§E¢ “·f^NîÐ:¬b{Û=eӣ̵½€¢å÷x–pøoU‹ñ0x°ˆ¾TØ·Àå2»ZÑwpœååì#:’pb¶¸ÊÁ›ånÏÝ$½%ÅÈ!ƒ�FaðÞìÞ´}è@`ŒLÛ‰v{°¢ŽšV2Ñ´!zKºB”ó€85¼­´9ý—ÀÄýf÷}hÙ`H‹ïµÄŽ„˜‚²�qïî�lV–亿œ-XD7.‘+üp~kÆ4‚›fZCQœ"î(ŒçÌ#^CæºÊ€ïŒÊÃ7;tŸŠ¤…!1‡jyòm….#Æu=ÆX¾p_«·�yïÜZ6ŠÏ·îV6¥uUö±¼±@Ô„1Ó¨ Â¤ë· ˆ%Ê ~Â"�JÜ|VQ0�m¦wuÔë�VÁ1Û4¿;wŠÊ I¬ÂÚÞhõŽB¡§im©Í‡+J¢í­¿|³Ê†D¦JPb–êøÒgW­øØS[áƒM�{áCó;vùâ÷ɰ<ºóT=kw"É—BAïÈ�è·PãBæ½»ÞT$W‡„>Û!·‰)Æo°Ú‚ãƒX1ü�z«ûuìé%l#íUú�’ž•è]…EP®Ü¬×n[@實 _qLéZÚ`á¶pc¼f1Ò‹Ë)ÁOïqn>>?lLò-Ëõœû¶ƒü廀Œ—-ˆ(*ó…„R¶8"ò¶-†‹iŠûó^Ž]ªOZ�LË6E‡« �Rô¥�ó̓¸gï,ëÙmg[ÓlhÍË~¿7`†=¶*ö¾ÐébÎ3-¢²ŸN õÅ“½·¨¼Ù¥VêÉ—xg9 Û« K´'?aöÛfÜ7ÍŶŠ!ŠKµ›–•QÌ,æ))¯Ò�5å‡(?r«×y/±´%õƒV†Ô°ûL*+¦_›zÊAr?*�O‹U ká—²MTn)Àùˆ:q<óÙî`üp™ð‰q··/Ö·ó^Xå€íZÙ3÷*öÜ-jçÌ¿b¿JXÍ, f3(©þ3·¸7ÕäÏöbäXá®|Ö¥ì T{4@âMjóÀ¨ÒX“äænt¼Ù´8)ôD_�4{áC¹(…üc¡CIþ— 0¨2è¼Á½9„„g)kFÅ®Ì;�kãG%�™ýA( Ä*Ãö+�Œô­áç.eD-~Û›I5üï³z«¨€ª8º”gºpYÓ‘•Ç…$Ço) �,Þ T…¬(œ'“?á�…ŽÝ,Ûqtäöãïf$òõ¹>óç·òÞ„‘†âþ«W†Ú `ƒw©ùj÷àÆQ/C¯)ÀA¥¤ò.Êr¯ÐW˜Ì÷'‡Še‘ ¼V© “LCññÉô™˜6¼ë øcŒÆ®­“+¿Öí+µ`[yq@Á’•hîª"™l“&F ™P4wê<¬Û‡úádáßòû¼ãôÝišÚ˜UØ^B)Pí‡%[jHLO—¦,-¨ Ñu¡ IL¢o >µ H¯zpùüa!gr(`Ä¿IäÑô �x<¹jìœJ²YÞ›+ÑÉkJ ‚Tq£·ß;ÀÀòá ¾Ø¶\`¹h^�†2a1Ì 3#\~pA`oϸ±ño)럽n wVyØÕ#[ðš]›KÔˆíïxÀÙ¶óLIœ‚O ÉžøHpa�zÝUËDP Uª³�¤fÞŸrÃX•2HÊF…€Ñ.]者¦®¯o 3z[¥hÆCá$&ÏPq š½ˆ³äá3Jëㇲzád Æ$2«ß˜ÀÇR¾¬ún®Ñ5È«²Eór¨ÚЇ;æ«xO‹Ÿ [gÈŽúr#p•\@i¶k0 +á[ Oã^_K-ÎÀ÷:{þå°>㣎ÿ¸uxphà&Á�îužV‡ƒM�Œ®;Íà´d’X–àƒÞqõÇÜ{‚Ø…$�5Þúf8êaT “ »ÖfÐî�”Ã>/�ýÙ#FpN:½ÖVÁ`šg‰«ßnl…_µ7nç¡3A넬òv¥ˆŒ,à” ‚ãÉÅDu‰Z+�sê`^ÒùÅZ°`6áUEÝÞÕÐîRu½ècA/§Ô›û§Rlè(²±ØÈil—ÛN>Ë«GÞäP¤�àuÇÚÈeì ê”p;ÂÑ9–õ!¨²Kp6Œ�‹eøî¤—ô½ôÚ›ç•×i+Þ m˜±ßþX„ 70±’mƒ*=¥ŒÎƒ´zŒÝÖ”äŒ)�C. xoëÕÄŠêÚk>æ¹X2r ¯Ã �Ÿ°yØÿ¤ûñ>žMcÚÙhVqCënrtYKç>¨Lµ lv†Hˆµ÷;ЬVHØ«Hbí *ä�âÍŒ±`4 ê¬ÖDp}šþT”+²=,HS‹‹1Øš%Ç­s ‰\™ôã,HÙô˜—ôS´ŠÇi™d}ëDp“½ÞÔ:¡ÎžÄ�ï‡B¡ú$~\6¢C c÷͘Êw}O#P÷½ý‹JÞaœ_, -¨„íVS«~=ù8wŤuq dºaô8%Ëüºãݰ " #L§OÔàÞõ{Íwî×éø O¾5ïÏ #ïs ·­nGëðÕL=èV‡¡B:ÐÛ¤æ2`#kÙv sv9r×…[îà=ƒo’¹Ûf?ƒzzÖÍŸ ÕÒDbm$¿i&÷ ‹žN^ẘd5s´3\ÐËèQ ³Gp&ZuÈ‹r¢ÊûK¶ã¼orH¬„?»Í¸�†yŽ s6R{”)ŒÚÀËÞ[c<µ5gP:p¥¡ŽFPƒ¸Þ¥&>œQ¡åþa¤.õ\~{WÕ8úO~†ÀcÆç�¹+õîq{�•Œ÷‘q¤øÙdPù1ìcœsÀ‚äÈünNõù]lðÄIc+�=nɪžÕ(|Óng34Å^3Ó™�g‹|b"Ù° D*$ø*eÒPÐUÇÖÜÙ|×ÈGpg€á� mr�Þ .ìVÛâd¦†ü®|”ºþ¼æTÔ°ºÎDÚ¼ö hE�Q€ò¥ñ n)Üå.ix <|º‰VU2²Ú4X¸åŸ¥£C ƒíüëúÀoËŠAZõ:}ãïv±bÅ-”ú¹ÉÜ«Û*ýAdú­ {à¼ß.oX«jMÄ?g&{[§Ú;þI͉°Ÿ _êÂ^Ÿ´Kêv{#ªÚxÒ(:¾ÐQ]Øî·R æ+¨Èë†È:bÆ56- *mZ¯ŒoÃ4¡J¬ƒ™¢Z»Muyï}¾ÞJ3æ§–^ò½„—Mi×òÉE¿?I.X=„ ‡Žßæúp’]¶Çá–"Pp¶‚kjAþk= WÒmØíXq‚<ÞÇQV×Èx Ì_ˆ�1è Ùykýl°ó¹çùÓ¦‰lcl ÃÛ –ð» ¾F8ÒÉFóø½Ûëŵu†\}ñ10‘¢^¼¨Ø›¨VIbŒ#ÙÐåý)v,Žð¨ê¾œø ££Â¥Ìâ-Á�üö€-Ê¢¦ëigjV%­ùÊsg‰ÈÚk7±VgæˆÓ} z�Ìíð“Ñt¼`£¶™6\l*÷=ÌDn3?<^ ¢!¹ûë´Rç ±ó³ħ–×2éoŠ �<ÇɺùÎýã;‡¾ÈÉ›=5>Ñ*x²rKïèn°/†ø<¹�¦ý`ï9ï7 >&F¸fªÆ$“¹LärhÂLÐ � ä’g´høø ßlÁwη3§LÕ"#u'Ê]øuØ?Ò„5ì$T^üPÀ†Ní!JZ°jYy\Ï4à£^׋ Òœy¾c *¬–ÖbóÚ¶N·{G·û®aºûï2®¾ûÐ+™QnŸ¾nç@Tž¤~ÌÛ* ÂF<\®”4[é!êŒÖ󨬭ã3E‘Fº]dÚP#γ•`¿·Û æa~wÎÐ1¬æ|ØÒÝùøÖ¤=iü5… mn'ˆ/¾g™e K£“g r~qûk#g€LL|RåHÍÌ.º_ 𮱨è͘”©`)n+“¨µwajp¿Ö�¥XóݦS3Ï{ÙÆ˜ãq¦Ô®;)Ói´+HŠ]„ì†HLè›k6)[lV÷ž“� θ[»ò¦;« ŒF-B¹Uc�‹€ ðɰLË{LáÏÙàë�}†[è•!!÷ØWe¬”ìãb}­}.ö‘k8žrFíØ�ˆµ® È$âÛ0W[“,!¹îެÈuk’C–¸3sÖ ‡Ïœ–‰ƒoŠx¨ÃÜÕÙìQáàü¸»vÕÙ>ê›…�ÞMl�×ø�ãFo[h¶2X™2¸ÜdGŒRÑDr«©ÒyÈDńǙÃ-E(eS�NÖa\-†Ãƒý>¹ÓÔµ5ØHKžkU€¹iz§Å^RÀe>(9ˆ~DM Y¨¨Ëˆ9Ù‘ÙÄâèt{ͤ˜÷¹½˜¶<ÍPD™þÁ„Õ¸×\Þ0ëúÝ>N�·�_l®ú°èbàß)ÂP åѰw¡‹£‘lj‹·yý.þ•ôcô)öŠéc‘zCFJƒŒP°øÁ•,d‹Íû°$k:gÒ,ɳw*®7áó¿ÅÇ aŒxÔÄ¿G–*É!àxÏD:™µejñ kLSÇ¿ÜØ @ØFÄqúõTá‚X÷˜ìDÞ¿ÎAç €Æ§_˜pQ²Ÿ§åh…3ÉXãBdP­,xÎÿNËò«à¾Es ±Ž1¹�Ù“C(#ý 0Øùæ(ìñè½_µ@#»ÛŸz“á”Àøü²ŽïM¸ŒÉ¶ñ¢¹� 8Åjv¾„”ˆ$%¡.®*�‡d9~=’¯Ìžƒ=Sȶ,oåÌ(émÉ †h+góáŠÂÆÙB,Ô*`}¬³Ër€¬íŒÖVR×Ì€˜’Ó�"n …+Û¥ a@K>û^ÓÀOÌÝŸ��íÛGeorWX%n½ºK`ü]å±´¹èúþ)vð1ühí:(VTHùdŒ3•{\}²ƒ‚~�ÈÁuZƒ�ÑçÔ|66@p}V•­•Þ_7† ‡G%t ;ÞŒo|Z€ñ¶›5ªk s¬U™B¿\»{J€é“ú_v ÖÛ€Aƒì^õ ÎŽ÷«�ŸcÒ‡Ÿ[rgÇùñnEè¥9«Î ^ÂSJ¤n€Òzï3°,� ?Q–ð† ŽÑ_a•HŠodÓŠ ×à~ö#`½z½Êò8½³s,�E ``TÝ‘{å�ßB%¶évá„ý¸+u2�vqÝ£‚ ^Î Ü%êò o®#„t¡ý¶iy¡B{¯Ì©ËãÞÚW¦<¥K|̵tQµ‹1s8KI�ÏÔ±ÛaÔž…~‡¤0°.Ò³šà5Zæ"Wên¨$ŠäËVÐ)ì±0xd‚(ù‹m®À�Âåñ9»´aüf ËÌxgûؾÞOj‚ìEV¶Ÿ·•Oœs¼î Aó. )•VØ%!}ÊÝ[ý'u‚qª27QÅÝ7‹W%¼­´QÖ�ŠŽÏ³›à|»äÐÍæ÷ãRÝsì¾YX�¶¥À‘ÒÔ¡Isc¨û…éV ÜU>l;ߥúسÝRíÖK¹‚%É¥aŽ�i&äñ‰.[¸ V²liöØÏ)È<_|O¶¨¿XÕ®» �©¯�Zvëƒ^1{dÇ×N1<ʤ]q…û�çî�+ͶýíúIÝbá!ÍœîÃÖ£kp:}= aÊâ½ð&ô%ÌùÊ4âóÖ‚€úzBWY¹o‚áé¿™¸í¾Á æý`õ^ÚÚˆ|ïðÉfáæ¶ Ïg|Xð.eiÃ:n‡M9û¯ì �îÉ�ieÐFÕ­‚¾ÔÑÝš<Á(•ŒÕ=�/cdüèPeáQZÕ[oßMà&œ(n'è%sšó6ð‘  ¬Õ/s ,Xo¸µé^°¡s{RˆÐ�üþk-êûÅ›8-à M_M¶% Ê5¸™)kãnŠ« )™å©¥ðý’û®øãh*Ö®)5†_r=óš.Á%‡- 5�bù¼‹ß Ä%8]Å;ŒnŒÀ�ý ÁÝ·Z* ²S§Ó…båbºi¬.BôTOG ߺBï% -_Ûò¥)Jçvýð ¸ó �E«ô�uÜî+òÖ,ÑÜ0ן<Ÿé¾–ùc«ÕÄ~û[2^QVÑñIò©v4Òð:„´U¸Èëúm¦1H;XƒÖ˜­ëÇ­sZßw®f�SÝ÷0y×|÷ y,íƒ,Et¢Á€DjLjÿ“¡vND=(•ÞškæÉæÖvHaétÒ¨•Ð kg\íhŠ@Ã" ‚üqp¡È@}“�€¾i�†Õ‡Ðè|�œJ¨ÓøÓ2Ç—_�Ô ¨8+… �æ6m¾½S�‰Ž¸Š%Ô4'àjžïªö ëõõ é%`z1 ¾aŽŒC”Ão�¶J¤Xü›å—öÀmË™÷E„ ‘Úë&ÑÎEœ'¼Ÿ#àÁ™·±Y¬Ûóšµ£Âu3мõ`-`óÙ³Œç+Ôxz|Ñ·U _Ó)µpEa³‡•Ïäàª.xžÐ�ð³¡ÁÈ1�Liõ¨[iH¶>ÄèF#vûqbWY9]:ªÐX1/#éÌhíõ¬WÁʵü;‚öí®O/ðS±(Ðc[DpTMë&�!£.Ýa&:5�y°‚>ããN×ý›ÛŒÛ4ë¨.\Êh™›p–’‘éžÆÙ¿�„NûÝáÓD‰ÊärùC\%T±ù†Ë·.v×hgzéˆF¬€Žî7höx ÚL½è"[„Zzo\Ä}ž°-­�£ï'(h¡ÑÜbÜÛ;¢=ÒM €kë²p!³³]xrš^Ùwõð¸ù $ ´êz”‹�pÎo½»1û|Dôa9-¥ SPzÁGuà�Áè4=È)�Á¹ª·¦V`â3Q[�÷×ÊuïÊùzó3Dé±8ËãçR{"%ætå5´x éóY~Û C¥ðè³?IN[wšsedØ‘>ž.)Iù¾Êƒ£µŠ÷vr+ #Äd°F¡RDå3¬>’Å{[Ѐ™ùÓç;�\$P5FÃû�Bþ_ŽO9=ˆàaÃÂ<Àìˆ~·¯nѬ�ÍáÓaЇ‚J=–ƒ8b•ÅΧÚv Ãv¬þÈ',w¾y¾nj‚E9‹„ø“…v´EÏçß¶ûZhæÏ¡ÇÝÑIC ‰´Á«à¾l¶*�‚Ж j9ñ"“w^Ó<ñ1ºú[såtÒš‡7Œ,f 4íNlûÝô„f5ùÈÅ„GQ}åSÚ¡gù4í[x\u4X€ÙØr»�gAAq»°é©‹Te�M¾Yô†»v×~ÚâÌ}žÙºÚ'úïÅ™ß[_ê|EFx)'öÅß5&M8Ã&,ÅScüó×vð]ów|î“Ô 3sEïßE¿\:<†±@;ƒä‘-Wßq†±1`(L¸‰¥YO¦ëé¶czs9x§Ø…Ô�Ÿˆø^d£8è3ÿPìGƒ¨ËV9üÒøç]¼pžtGÂ�,¤ w«b×fŸ_[6.¿5€(&‹!Ç5EŸ“!äVÌ숖ۄ`7±d¤h+¸ÌüÉzxÆ~Cø ~«égJ¶Å †k/Vñx »6 —¦*bùs&f yp¶¯öL/h ¥Ê2Š2Ç.ÍäçqœyeH'P`~y¶H5𬒧›Fè±9e´ØËã@Šå¤_ꀽx’‡>ª\ ÇŸŽÏƒ9N¸¿ �rÐGÀNZÂ<µ[<ù¶cÆ3"p\pâlcuñ`ëR0ºŸ¼7ÏXÎôÜP=¯ÌhKý²oÇ|6Ñëw‘ÀÕU[6za"g*T=#¡ÑÁÙh±6õïŽYµ�VQP¥e 6¨ ]âÉà-|}%lôÎè uºÇ7pÎçä€GÛšdˆ'ƒŒÍÍ—ýö=%âU)C‡¯Š0Nµ•wž¤ª ÞˆÏjËz:H²N DB3c£`¦¹v ��H¬&‰ ³Ø„^�¦7xd&ƒLMzî®b쬦¸&ü�º{ïáKòïV؃.}Ú ¤×ú¼<¼v•~1�g\°”F÷š½ÓëÖ9o°Ú¶§) ĤD³Àt,ÃMºT©˜]>>¢Á:òÉ�+°IÛüÈï­ª4e”&ÿÇ“ Љ’1=ý¶­p÷ý]¾MÆÇúfߘ/ QGÑ_Ž„ì…€Ãv• Káu —IÉùxcO«*«D†¸3"k÷N6dg87sÌ®Àn,5v$¶o åÁ7+:�° Ÿ²ËØ?'L%(�v¾˜ôväß;Û›¢ÊhÀRt4uEt°®÷1oϤޫß9¶N¶‘œ¤üß\•}ðnzE‚ýv¢‰A+™x—‡ZZ篗Dw8#;™H©՟ ¥Šþ#Æ=pÖë.õ?%ÔØt—'Ãriï~X*ßÞú29wŠÃä wîŒEvùí�uØ@ú=<�o«BÈ}ÄÎkɵùuaÊÃÒ±'+€¯|>ët éq¯ ¨eC]”„EHºdE „D hÒªû±P¦]㢤�x®öÈ#›. C}½=;ó—§R-Í—V¥Ñt¥•±ÔêIN‰Î{ËãföAÃj´c}3««}Þ.ìqGUK±Æ4»›ÇÀÎ*ч^5»Úç­–øna¸ ÑY—øý/ -ï¾GI�ÞÝ­;Ý£¸ý©§Æ–!ºO0+eCkÊÚ@£I–b5Ù"¢øuýñóÕ®oÎ>#x¦©ßÎñW7P, caYCö’ÒrÞ·ÌCö­D Ýçk\ž¼ì'Yâ0(²IÞЮyûvËÆ×¦©úQW›hV1™cRÙ}$­¸4ÞC»Ñ :ÖKF­Þ“©Å!“G}ÚÈ019fá–‹²mðΣó…´ÌãÖÁp:ĉÓ8E�âP¬G?"2Æ-žol š”SSLÉ2¢ºþÇ{™ˆ–…Óä£D�vÊfùÏnÚ_1’E Ú>ø†Â;æþÞ9©HEÄ)[–G�…öaD&³Œôg›ÃÞ2Ù¸ú‚Qõ%ÁtØzPuNÜȵïšsm—Þ k_LÆžkÏS-¼Ü0Äü º­óòd¡¬_Å‹,FŽ*¬“ ŒÞÒ#mã°§]©…òòQ/’\e†s&×+ÝÏT�è_„�_Ö൷ٺÞ?0 zc×-Q¸´|´� WºÝf²77?Ïœt3¬J3Û áeºQ[¬`±bžE¨¬Ýô8ûñ½oì*¤¸E�ÑßJ¶tº:˜‚Éš„†�Hš™/ÚÔ/Ð?«9¬ýÙí•ÜSúÝ!ÑÇzÕpp(àÕ$¿óÁ§\Üx䃮p-ÇìͱyÒÁ¿»×\*Õ2Äi¿ôÜ.!<žÆ—�V™Ç9‰ Çxè–{¬XÞU.—F«8 =ƒº‰?$�­@wÂdßÚ®JyÑÔN‹ª+��ÎN;·Lƒ‘Yx‡7¾ÐoÌÀ>qmq§zMM]J˜‰ó§°Ž)­B-­Ù�Ä]-‚Ȫ¯¹¥P“ЇÆçWÐÊ~o|úùø×úÃÚR€ gܽnA|¾Ãg•V¬YÅ�²…c«c8½ƒå<%%Z,¯Õ’v³ü¿¨.›ÅþgCvžÞ{”EK�ÄylnùS…ÓöÙM�ެJ¡$T^qÃAÌ6!UY†[ÑùζÀ@›“}ˆ¿§g­.æw@ M ¦.ž(ÓH\Î%Fß°ARS @ºXÄ jk8Ö1† �Ö+ó6/„gü7àØTm=�d9¨~ëîE¼líÞÓë¹``?~Ù»yã¤í0ÔÉ?u26*¼ÐðßœRí�3lfÚt„FB`.O¡²ºø},t±;âªx’Âãìì!}üÁ¼ÔÎÔ�ävufAõÈ`M5k礪¿¯IùÃGÔÞž ¸Ú€OÑ ÍL`tU4Ô¶Ç\` rI/˜©âN¦jyVûÅÛ¨•€ÆË½¢.ŽÊ¼Ýl†@!ÞSí{`*¸¨²/Ï;5GmâÄ*9E,R‡¯zñ7BÙ+ï5ÍmöÁÚ�^Ãê°Z0”SñºÜdæ­:’¹ I¤Oh¯$ hŒë³Ø…íÇë^v.x¸dÃîuïN0{\¡Â.󯕗7ˆ^‡÷í#àå× |õÚwÁZp­Ü®.µÊ—~D˃ÚT][$bŒè”� ß�¢Ë X3L¶Æþª(]HþŰ„WÛÔÝ gT#qÙÏø€Šj¤!©æâs JÏz û*8S |·) 8ž¶·=�Ž&¤Ö©V†õsÓ�ë”)b"È}J÷Éó HÂŒ>`"Á½4{“ÕÐi,áÍË_gÉ/e؉ ;tuM„ަñw³`_ÑÛd¼L–=ùUÜU}¥à£]Ý#+Cmöá{DÒ’âœ3$âO©´i§m‘ÃPõø>²°€òõMÓÎ66K. Y!Þåî¹è –£ÆNP,/{²ã i…Ô%KÚ2H!g(pΊ•n”°Ø¡¾²sÕÄ&ðâ—¥šXª?EÕÛêÒœä†zaqëLÃÌÒ}¼½ÜϹKô+.-·Cr€z,€ ÈVùÄæòQeG”/CŒ?F.§¯‡–Söìwn*lÈöpÏ/V"ìÐJäˆ4Ûë?ìß{Zr¹FóÄ©†&/ca°›Pduv'£GO¯?C8ñ7ñ¥@\CÊlâËöL|)èÝä7ÙTã–þÆ÷IÆ%ØnŽ™r6ic£s‚C³s}¶Þ÷žœ]€w'.®Ós¬ç;èX.b�¦Ðùž1„Œþ,óPŒKÁ3CálrÜPªÞ¸·Ïí‹SoÕ)%7KäÊ-›]aYru|‡op0‘lëQžb›©U­ŽUùW›7¶»w“?›!||î„Ô…†´²ƒ&´ ~;Iõ»›ÃêIépÎù¥Pà7âÄåÄwÏØÂŽ¡­®`Tç­ðüëwÌÓvO­@y�ký€R‚”ö”€R䍿€!åPGû?_¨þ˼/éý½÷ëwž¯n¬1ý%¥éž¥™ê‰ñŒÃ„0ÿXàÊÿï7þ¶¦?ËçÛv‹{Ô=´© Üí·‹€ão­äŽ‚ßÛƒ„.!ø$C‚9lx{4D\‡ " æèK]›¥„¸iJšI<•cÔwL@üõ`�iW¢œ��1ùP>U�1½50vG·Y;"–m°¾¯Û9Ýš‚|B’hä""ªƒD �j¬"¨³L‘áˆbÉ b1eNÁÛ¦#ÃMžó¦£îü`5ZöôÖújs*¦�š~ÏUp.F š\€Œ‘Z½o>áK­qI”j~Ñ®ÛX4’ Ø�Ñ©º>"hj˜˜ã B^Ê7Ž�\¬q 4¢"ƒñ‚æœ ñ+ 8ê”İôõÌÐ\†#&�ú©OÚOÖÏõ—AÄTÿeéý£úöŠ.úy]eP²F<É÷^þuÇůlD.4\ÁŒG Ô{µÂ¨…ãawöW´X©³º=¯2ڃ˖>SŠ€‡�ÏÍÎíÀéZ¨´Îˆj£úAæ�…m|¶ËY¿<¿ïË~÷ÉÝß{q5DáÄ3’ÙxÈt3£ J§Ú<ƒíæ÷÷ÞÞùñ?}ú¹ØÃE„�Û‘±Øq^|„¯_0 ”—•E÷ð̰?Ü ðívCüUE‘ ?B߸¥¿}œã&Ù62Âc¤ÏTÇ¢ŽØ5¶G# ­Wv .¿ôD(çÈuŠäªÍœà¤Êåò®ÚÊÖ�ë–ÉX…@„2…áÄàËò}ªLÎ/��®÷��5õñVóé'ã§qÒI›ØE‚*Ÿ4LR@µ®�6}ŸšÃg?Á¾ ø3ІÆî›É¢”}ÃÌ D�Ãw­H!âéo¸ÖÜîÞû[ziè«+å³”Õ½IKþüJòßÓ¡Œy-ìÜÄE±ZÇP»-ôÛ?"ÎŒŒ\5—Wq½üÞp*ýùhJ-ǃÝ�ÊÚ0«X'úvh)ãá6“71]Ó¸+¦ÚYïv¦í¥æ¹ózÐpÏ02p°Nx«GB"$á¯=ê¼¾¤UÑ]ÞÅE„˜âñ>�7Q’s^nO7¿Ý4ù±q,†~Yé¿•9#a;PZ@K�«>õá­ŽÒþSó:v[‰‹x ÁɆç:zëõúùS[ßUPw{`÷ß)ð q'ßV"zÞ´žƒ¡¾�‘êÝ#î|+ß>¥iªËló¡ûÓ¾lŸ“«¶oɇi5]dAP€$òpÓUg�c� µ‡"Ð_‡4v´Vnp Ü?FÕ”Â%Ü:/ltUÝôE»÷t®JLîœs lÚ¯d°s&š€­xo=ä�Íü@ÀÙ0£Ó¥íÖà-Áó’šcà&zºñ×ÊzÝùï†ñRã¾pûž|Ô*¹ò¨ÇXò{úŽM‡�ë—Pù®Ä„šæVw¦ÍÛ…Ñ[–ß•tu`]‹äTŸ…z8é:iôg_^R㹸[›nÎQª)$›._E�Õ.é�øEëÒ0i ·à3»ëJzm¤�ƒ`ì�d']1931e¤{�)òæ\Q1l<…ò{Å­ä�Ýçtê›E8^}|r°ÃÞg^JŸPr8-Ý.úÛqÃÛŽ;ômµ–¾P¨¶d ËÂ×A†\w ˜@½¸þíœÆ|žíç‚¶p~0c„”ʬ;Å…Ä® ©jppšsÌTù<1×3 gŃž×J¤û/‘xsG¡¹×gA�Åߎ´Wѳžeϵy¸eû6Œ9ÏÝÛ+1¯$ЊcªyM‡o;t}¨ ±f>„`l>Ë,˜�ÝœªÙj*oÁ>¬·rµg©…SÚ�öÓ9JùQ“HÎL¥€Âáž}ÛÕÃb!ëר¿hêƒèÑ·LûL¿2ø€3�ýJý4 �|K‚ùÙ~Ói<—_+¡^1mîd“ÛWFhLÑÒJ�áç]JœÛÏÉáC¶¡ËÐîÒ©å ¬E¼Ü÷NÈmG&*Ê©3Kí0Áaµ³På÷.¨OYCrQFWi[Ú# Ÿ.gx ˜À`öˆÉ7\a_‚ɽ ¤öù|*³Z|9íÇ1묦½ã»z«ÄÕb Z 1ù2™$à%›}Þ=Íqõ–ŹÏWL§p©¿Phƒ+»ÃŽ„*ãºì=b‚Ìì)ÊÄJ�«� ß5ÉHÁ;¼[„ÕT:þ©JP(—O Jï ìsk¡Ýw_Ç�–¬×oSKŽrÛ¾tœÞ³š7­æ©× •·Í®¶|ÿ¯ß¿‘�ú‡ìz·ªDwc Pßö“2A»ƒÂçIŽ™—¸i…ÈŸ‚[ÿK¥ o«K¬Bª�ËŸ T5 ϱº¤ß=›û«!ׯí@~áþW¾rQïw‘Ëï½�7oSn�£ °d ¥Úä‹§Õèÿãð~VFZ†›˜&?Â|z·Ðþpªž_ê´¢ñ‚Á¢,�CÈMuc]oÚãþXƒëø R”¥YçèMT§Ü•þT·/ô(#,#òòÿ[*�ÃB¾”ãÓˆpy!ë uÊ6oÛ­ÃØïosŬ)ȪY õÚQõ‹w¼Þuͼ‡µ/Uí0~Y úöÍÛg¨~§abÊyãôj„}RÖ®¤ÁïZ欧Q³ýÛôtõ™¸ žXŒË²vp+(îÁq_)ç ›>5ø) ÜòÏJ¬³.Ý�.¯Þèç^Â…q`”Æx:È·¿¬SËbªùµ =¢† ³"t[¦aÇúT1Ÿf~@X¾}¯ 1Ìq>èl÷~4Ö<;¦wÜv\«T%Û­ç}²‰­?=lwž…¥ºäsèÛæùmºŒЭt¤¸ob¤ÜŸS€£‰uÒTfþ6ÅìiãXo6½iÃY¬N<ÌH`)Ÿ}×B/€aß@äøé’-ÁF6{º™cH‰îë§ì—$€³4G¢‹��„E×fÎ%ôÕL _Ñ‹º®9«ù_Õ=åÁÇbÃÑ÷q„aëê.¥‹Ï0ÏK³lÄÀxÎÚúÝô)éè§6g�í*‹î-¸Ú®¼àÅ2|éŽýÆCªÖð`n¡ÙsÕÆ…ô[…¯ÛTmòœyL`šKÕÉÆ²‡Šc»½7×R{Y”E�BÇ~’«N¨�²O�ÉÉ~Ú�cΗa®Bwz iïvéàM�Ö>ÖwšçJ$›ô'7ÞAÞ1ûé6J} Ó—/öx•¤'1gck·®/…MRý`]Ýq£šÕ©2è}îÉÀ¨kmoVžd÷ñm{3{ ƒÅ|ú·“�½QìUX^(\ߘ§»È¡4¦@z¥!S5ýÁLÞze…¶�c".Y9ú²wpzxž±ÉYM¯_ i¶k(S·æ°ÎzúÁɇ0YÙ÷œìðõÛ(Z5Ê\þ�å�Ëå 6´yvôö&Ô( â , 'ܾ<ë¢ øÀ¼ö¾W‰n+m¹r׺ŠGŒÙo��í…ePtu¡9õ¼›ÆÒs[¸ì‹¯ejQÑdLM= ‚Ú2�)‚Á$§>ÃD+’Âo¨Ó¯ÍºD‡s÷¤Ïìôuk¨&z*ë»(Òh$B�Ïî=Ф ÚŒ}v{îÑðu¦&yñ“Ac‡Ùn„ÊaUÙØ†g?G5Lµpd°üÙÝ49å�Bvï–´�™GZ›kíÛVŒi/hesttÎxS—Ù¨#ž°¶¤` .ëd`”ͱ4Ï?7̹fséiàmXm©‹˜‰ƒò”'6gËè f¨Lrku�‹á¶¹fdlò_+r…—‹f´ûޝ“Ý̽ƒ0ý�Ø!ÂPÚÝ áÐîêiÌ]´SªëÎ7ˆZQ¯g6%šò©]¬�9¬ÁnÄvÿBh0`Á9¶‡ ¶U‰AÆ4*Åf”�¹È„ \O·V…”±E‰Kå÷Z}y Õsúq¥r¼êŠáz=Çh €áùÞ%Ûu1a.êöRãâ4ûF0ØsÕ’ää;T½!-.4FæE9R|›YäíÍaO6“™£Î­�@ãu_–AyœrÐÅ«…Úeå±\à Þº�µWöëS¯rÞ5ÖhÀÒø‹�?$‚4¢vï*k�Ï�æýcÉ45Æ<”¨M¡Ž-Zë5NêFE½­U×Ék·:u TȈd”¬ÎG' .c vzÑ´ñóq ¨’Bpõ�*½Ø¢0*†FéJíeÖÄ4« ™|Y¹V/Èëžwâ€p˦…}Öqóð@«¬7ãxË‘›¼¹¡w¨òNÒ~9{”W© M?©Â 2In£os‡€Œìº|ZîQ­žvÏÚgåƒ5“>ºúGkL¶z=Àã}0ìVˆÆ­:+nØˆËøs{ÖÖ‡|:-5Tj”š¦ÖJ2 p±Á£ºÇtµØ4±œ„q£ÉÆJáЃ B·v-� ÅUÓ6ÅÕ@àŸDä/dÂm'î{x�T^÷x³5ÜP@9JPºüŠ"ÏAøîÑ»{�•ù€±c#÷lw�™c~6q'+Tlc7TþùõKâÉÍ’Õ./>A`Ôž¹l½äÒniÐÄäúÆ|¨ü/¼KÇÿÿ€?~üƒÝ´-ÆnߨEckBTªÍl]gîß 4E9ú<ê|ȶÃ4@Ϲ1JÇqÅNÒ®øBœœ"[¶­ ¥ŽGƱ’>p÷G/v±.݈t�˜D\I`F‘'Œ.ƒk¹óm’“9Çt`µôD�„Ê–°VE§ÆÌ áö¥‚ã’%a˧‚ž * §0�Q¿Ç¸í"sؽÙù îý(ß$9g½ãN|=¼e•¢«?{¸z5¶rf^y;w0.¹‰î,£kùÍ4Ô‹•Ú–:ùk“¢ZÀ?1éªØâ«E@ÑShÁCÁrŽ¡.ÿ®þ�{äÊë|bŠ^À¶H9Ü1½-á»_¢ÞárãnäxL^H4ÃØ9Ñ+¯>z�j4õô_Þ@ÜË�A…øf>Ý›©ªŠÆ0ÒÃc¿e©jˆXL}1Ñ+Kö˜äMGïG"Ù%Üêq“ª(9¡&ù á‰ïjel´ÜXº¾ØÅ[Ä(qlÉßx­åeðÒîK™°"åV5ˆ¾uÛC`·D3õlÝZÑÜ:wö¹F9N³�X‹Ö79Ý—§µ²ôAä™Û1^>¯ì·G‹ ÑUn¸XELº�ž`e}/Þ8þË-ÙùU%sdÏŠá¯�³$¹Õ¹Ÿ®ä<ÑdgTîŸ�Ÿ$/-'‡Çå'ÕƒîÂŽLqb!Y¨=¥:|à$o�WY_8f*»_wä@[ïXáo8ïpFÍ’ùD»09k¡eÆjþc/jÿyuAÚ8�¡u��¸[ p€2ÖæL=ˆ÷ØQ§…zAH7Ÿä,QD\�-oå?³'ÂÕ>ܪòwG0«V8î>Õ}œæÛî–B[ç5 f½Ó.ä°ºÁT3 1)!†„Ù ®×wvN>6i²À¾LfÖF"…¦ì­³gœÎ#}@6 ïÞFž{ek]§ÌuÇ{âKu÷/¨;~bËná@Îùæ~¹/#CQ|>©ÖµtÝO]�ü2çF岬ÔU.«¬s õÛ–IÐÈ®TûðrÌ/_\“Ú¼ó«©ü|{‚Ì6®�¥5ÓüxÔ–P*ù^ëwŸw¬XGû/ÑÈ:+ï_²b@sæ´Cða¢+â¼¾M\_G˜/Æi�Ôü©^ˆesnÌRþÜ$Àöš¶O+XÃW[?KT\ã/1ãvL±SQhÐD&EHÕ­�?‡F4lãôÆ1ƒ¸èe¨(4·¢d×§f (Ð ¼V,{ÇÚMÇèÖ?�àhzEŠøù#bhMX¶¿úÐP!>¼Þ„-.ŠŠ@KiÚ“R ¨y­%ÀtŒ´£ª6€ÏØ™pt :Ý‹/¤çÀ£¢T � „/ÏÅü³núx?#áÑÿ�:ÛÒƒçäßDvh¢þüÁñ1†ÂÅü~F…wyð_¶-ž‡˜�†xLÉ�è–ÁØ®ùëNô™L™þêºòÑ-âד`‹¡fñÍ9Ëp¨+U¤¶O¼h~ý•ÚN„ôSÜã¹o¼œúÓ×’jÍò4,ôìmN�tvÙ-b÷²òÛW2YÜÞ¾ò·f¶\®‡-8Åð|Îù!À‡E9‹êÐ:Ãyþ!½_¸ «}'Y�#W3`n•c³´–eì < ʼn ÿ`fÛ 4Lž(”l»Í¼}¹k]jEþuúî™5¶·ã1‹O Giüèw!¬ë-#°ÐÝEÚ†0ïÓý4qÂúÐÅIZÞÅvê!ÐØg§;`l ÷!CJ Òª6Êü;•¹ôÐ&c« w\Å+?âiv&½Y>²ÏéZó´Ý«Ö´+Ðâ_ ;…—e°³pÀ‚7¼¡ä²æ¢÷ÑfR´Ëß· ®¾F  ô÷¹†PwÞàV°Ë;. ˆÀxNXï¤2³�ܶ¨÷|‚[„Õ I�* dnr!2Í.‹ÆfÚ€®d>Å–Ánë®ê˜Î‡Y]"ú·0í¨5�.mK�‰ÑžðK8Žp¯Ék­ÅãKy1–‹.xKŠ ËÒ9`P®óØ–¹�y°޲åþØ6ÝAt �‚þj>.Þ]ë^»‚·É.Ö·ØN2,2–t�·Òèp08°”Õ!†ÔÔ‚‡ƒÄÄžÐmQ®>ØÍ*{€¡û!l­…Ìk%[“º™äC/}/Lœ'¢c²N1àÐ87ýí²í{Ô÷!BgIm?©w‰cÍ¥ñè‹X{œ Øx/u…°ÀþôZò´×a‡üë4½QèêÿZÌîo¾Þ¼p;ÔÆø¬‘ÝF ”€AEãä‹`.�œ�ÝHÀ·z­ NÚˤ˜:KW l{î¯+ŠØ"è䥮>Ä&‘LÌÎð˜v›'sÉà¯+˜‰¼¿ï’,¼ã眜_›œ#æØ2.^8ñŽœç%‹üWe%è…*ä¾xóañŽEh=Ug0wy ±öžpU¯¸¨®b:KH<¥­Ä˜ì'È´£ÒÏ®`ïZ$µ‡®3›K?ÚX‚MnFw¢ç¨¹¸»Œ.<פlX ÷qãðu¾õ¹Ûs±'g3ŒPJÚÃ�eô\»î0Ó•6Åž}õ²Ø:M±Û­FaB_vÚ´2<½ð®vž–ƒ6x †Ãæ�r@``¼#ç\òDÖ1{.5Fm‰¶@]ŠÃP/·ÉظØ4¨(›³Îy̪âʃî f9*+·§·7  ±dÈUDÚù‘8 +µ¼_VØp�õ¨¹êoÞ›…<ƒ²O`Œh-Ÿ�‚}j|w§ù®Y¬›á$½î±³âƒ¯¦Ê瓯lëNÃ&묓; U«ý+ªx›\‰-Á`1µá/9{oÙڪ䜞㭷[Žû€ã¶}a´.AGΛra¤SMâúÜv×–,hÀ¬�Âè]N³°²·”1¶¨ž IqöVq˨ã'¨ A0+ÅœM`òä• ä.Ÿ‰) j r¼�WòI†®Ï¹…:§õóûŽ‹ˆëÝáè´²m$a¶Åzú*lCe1Ð"’Éa™w�^êìiK yë‚Á®Eqc\ z�¡º`×?t¾ˆh�öI|V}¿Ûä~ê}øèlö˜úßS ™\ ež,\Rer� b/Ë�’¿}¯–va*5r­Uœ0–¼æŸÎðµÙ‘Éu�ûšìéVöù5çþ­ˆlC×™‹�ˆB·ÍØC ÷¶…^—×ß‹-žM¦×£ÑÅ5S&ˆ#Ëö¸.�ÜŸò.ó\çÓ‰±2µ½›?ºd\aµo= i˜õb£6Ù ¦Öm]Ìܬ~À» Ùž+p×ÛSQ-ÊRvÏL#m—P|ÆÏ£Ú)˜°u9ÒÕ‡Im%pWIŒå º%µárÀ}õ3Ú‚ŸJ?Ío”žãÓ^ñ…Ë¥Bv o²œ¸Bw1Ga„ùùÂBÎÚ�°£ÄQKœò¡oçÙ¶ˆ&•°qßjÛ×Í”€ÅÚrÒXLüNi|Ññäw²YŒõBøïÛTmJd™sÑ{�Éñ’G;ÍO�¾ŽF( ^ÇWvêúý‡˜!Åw«‹b'6·8ÁLWÎÐ�òM¿6"ŒøBÇ�pr¬Y>Ù ˜á8ÚµÊZ†æeˆõ Ëb彋è´ÒÏCÛ=ô�}Ø�¤¡n[D*KÈk–¶�ÎÀï2ˆˆ1”/ˆ}ž»ë1ƒh‚ N@²~¾è ÈCˆWDVGºèåBÖ(ÐÕRÞM°œÇ"î•ζ™GxîL­áæ›+F¸±»aOõÄð¡Ç»68; >#VËaI„Ž’Ô¼urFÂÉŽ¬´|šûÊÁö°ý1©B¢Ïì@£åÁÛké �­š¾Êû‡¸WŽƒ?’=͘› ç®•L BšËPZüÍÌ™��`îiœ[¬Ô—Åæ±RÀ³V;»Eí¾¹µ'W êØ~Oc¦@+ÒÞý‘ºðW#VspRÛ¬ÿ¾lt¡A |5yÁï„àí´÷'·aµ0FølÐ{ŒßM­liø%5º¡Q‚˜F|úð0œCÙ…]ßbÝÄ:Ó~ÉÔåv!8°BÙ1�?5WE•à‚ßÈÏ›ŒšÛÀ¾öÛ\Ý«ß8â½d¸£õói¨û}ÜæÂé¤ÜÙ™òÎ,"žæ¹Æ¨]D^S¯§2P@© ž=Y¹^ÑHWÁb's©Yß_™Cîî�‘€ª=ðJ_<ŽÜ-]q½?¥¯&22¡Çb«=mÊòÍ�‘ÁaCÊ�MAðñÙ{_ƤGMt‚�¨Lc—d1é9óxÒù³_ó|.jFàÐkЭs89/|×$}™ÀwŽN+]͈R´2Z 8Â]ßy‰¢ƒÖDŠZ8_/ß=Ûšé:ž /Y–ň,Ñu÷é V‹é¼Pk™y¨£�ÿ_G#¿eàøF©? 7�_Æ:JNа‡ÉàW­@íÛÞn¬]ñ©˜â1üåôfBéù¨ðx ²d•_*"*¶ *ÙÑŠ8ê“q[e1€èåoh߬Ù¦vúð¦yá•«Ù9~ý¿mÌBÈ8§ŽaÐ…•=)X\‹2ÞÏd…˜ „lG:͵IØë71MŽ6áž Ùž½/0‹ž^e¶<ŧäï:½�Ñ0yþúØñ�é3÷'ŠͲ¤ŽŸp¸ßeР Fx‚Ã_-Ç]×pŽ+€¶þÕvb˳<Õ5M#o’Y¢Y.ñ¸gËZŒ5lp«\ÜÊÈË}5!!qÍco¢=ï˜<¥-yÀ„¥ J¦†Ùæ=ÜfCr—8ÞcM£/Ÿ:¿PBá i)ЋtmTNíMBìÕ«Úd–lEaĵæÄ5@ËBw»Ÿ«oô@z¹NT~³ª—(½ªÙ°]®•rdÖ^öCúО.d;‡ÜZþtwÍzÎ⦯ß\WtiŠîLä-tœêØ["w?6~æ{€Âµµ°qˆÎjYZè‡Ô7w™û�¡ ÈÀ¡žˆ°]g‹î`ArÒAn‰æ"Éöv²¶Gß#YoÛ%6Ü’O`wbˆK2;) �n�xÑrøsPë`äM"å¶XhM±PóF ҔƂx¨Vù‡ZÝ”7”ÉHqÆ‘W<�ɹà-ªDW¶ìºNJ PUŽZ÷~sŠ®-‹hóóäü(AuPos0ØÙ��jW±dwqŠ[´ziÖëïÍí"žíüÕÄÒ³òHýMdèÕDtÜr·… «î ä,Ü8 {k23¾†`Ù«aUlõjŠlZ^8çqª„ýø…À8ŽÆ$[dß[]îÀR×_žÉÙ“n·PÃçš=ðBò¯V–k¶57çŠßYq\LÛTíÕÆ¸`Á†ß7î1ñÖn’¡6Û¨þÁkXíy;.h…ŸŒæöô“iЃ‰mÀ•N±i)C ôÛÆ‰ƒsŸk|¹à˜:½9„¼–°”°l̬NjëRAÍÇÚÛGaš#ØsDÕôw¨ Ùž1C2Ï 1@<‘ÈZã…s:ržð¹ýÚF÷ó¨ƒäÈ JGz÷Ye¯wCô'oûîæsN.�é? (qB¥Â¥ùËÍÎÑøÊ›Yæ�H5 -‚ÊåœeÙÔí‘s¥ò¢©v?ëÄ2èÎàÒZáyz`ª®0c�ù[mÐÅ&c»Ûö—H#±éOÀªðW+ò˜Ñ£A¸ÀŽ6°xl.2VB™ŒáYF±œ06C"òîX½}xзKàˆùä'fTŸ€í$$(>³…’5ìã°Ë¦|c$Býg$¢,ôËQ·3sÁÊ=ÐBCRÈ!vÓB�L9üÞrØýZ¶ MwA0,&+¸¬P®ógi0­˜uy”%û‰XvêˆèÇAœj0]·+M=ËÙñ³$!X œ)nãowÛÞ©ve¯¯×Ú¥q¸#‰å ‡N.¶0É©€ž‘.§P>ÕßKpvšuåh$Qu‘�†í(X™³gTj´tª­‡R çØ6*×ÏvèáÿUd{å*ðî'{ðó ðÊm~jÌFaRÞÜ{¡À³oy�Ôtìü,¶†&ö™, ¬¥®$÷amŽQ³¯)~@¨ ®åù†´Ÿ.͜ތÄ�nŸªÛB“Jü ÚÉç²öZþÅìdµ0ÊàåneÎa0¥€ÙäLÂ9šËl W²öKebª5 ¬Çx¹ã'-gBÒ`—Õà ØˆU�´"æ ‹»èÊ,ÜÔ; ü˜\„Ö9«ƒw ˆ0WôNãšÌÙjìW¥Îvñ ê¶ÝÃUX~nå�Ëuy¬s ýàNö^Z²·3[¦U–>įτû¥ëNÐ0UÍ—`‡[£,–侮øºèÝbÁ¢?\–+ñTP¦ðsfÅîÐoªUÐ#]W(yÑÚxzÐÒÛY#«¼KmD*påt)°Ô "Ó Jä:µâ:WêÐñͯ�ƒNÝG-öµ×Òýx€¡ð§*ƧëÄ*Y{ƘÅbëÒ‚-[:­òàý�‹V°‰@¯­}óýõpg´�Pj¼­ÚÚ¡}Ly·Æ+cð‹C1‰–.ëqºè¾€…Ù|÷}¢¥rÅ Z¬+˜ÁºâH8ŸiWâç!°és|»B†j…#ÕB>ô™ãQ®9èÉׄQ¿[�ÌU K–®ÚAWøåñGà …žWú»ÄµˆðRT—»·“TÇ�À»£Ò¶I1¥8Ða”R÷ q.å!äL<ë^ÄŽZ¾³.=Zæi¢[Åûã4f¼‡ûP%jSõŒ‹×wEjtz+Æe³!Ϊüú·€‚Íg9™+AÖÒ”ìZ!á‡ÀÌÞn†ׂ°¬�^ €¨¾…”àYwe€¸M}vͬì¦vêíiáÏ#Èk!Þ‘ömÚ/ˆ±¥Ä˜fnëÜ}�Qe«žV6sí&]G˜‚GqIw¬®|j/]% œz¨/©¿^|ƹážiw§Îá#~•–åD_âïãÎcu>Š!ä–c~tWJ¸³š É™u‹?ºB«máÚ�“X´E±!mmA\*—Õx@¼ÙšÆd(ܱ¶h1K¨¡ªNI[ëõ玊G‰6�×nçÂ<ÔÚÒBwMÝË‹0â.v’Ç-„ ”´ ^*³Éµ ¨žÈŸKj¹"(~Éâ±ÀK�¹ÉÝêS¼ ê o²Ç�o%y½×ñ�«s»^Ë„¨~Ûk›ÇÐÊYÖÆi©· /ß®ÛúÂ8›@_eîsÂUvç7�}ÝfbûžÇù)>¼ØÊ@¡1žÆ„%/ÎÇˬë®§›‚€Èôn}î@à—Yº)]ÂõB,òGã‘0[ÉÊ °¾ÈQ,uTUz(=Ë Á¿1ZjœB3Ÿ:Ø¿MÐÃN\•ŽÂîO¡µ��Ø@ö|²¨z6Wsžë;|Ì nÌÞ´8ž÷l‚” v±ûo:y@žLÆQúê Ùê”Ô³×!?>3}l—3›‡dƒ“‡ÁBì2\èY¯eö�»4‡Ã¥ƒ¯6Í¿«à¤}úŒ ü»ô^CCëv=.ëŽçýewgˆînòÁXñW'WL=Œø×Š yüêÙó^…BÈa�Ä2Z´·Êþ˜ZkßJU®ÈvGâEãVŸÈ³…ô÷Ö J²fNÈŒP Ütù¹]åaÔ/·W¸|ƒ%ɶ�ñ óz”­®f<Ãèz}°VÕªîó!VD@(YÚ`´íÏqh(·].˜?‘Ï+*¶”~Sx3‡è¶’P©òšÞ¦Ê.—+/0ì�÷ظ`ŸÎìÎÃo«¹Ÿ>óþÔæUhviéø;j �Hð�†vŽ!GùN üußÜ©€HF6…� Á9Ë·†ŽE.h=4¹>mPyg`æ‚mûO@ò©øìàŽÏ›@E¡€É§D@:ý�Ö5î†}dØöí©Cx¤‰ñ1²�s·Õ¸Âr†H �².i²‚GGŒFJ4‚,li¡„=ëæ¤ 4hÄ 9§Þ ÑŽ’,~*4Üžõ¨¦ˆ�È2{$ÐtE] ³O°…ðBä~4¢4b¹ É¦Ÿæ~ó¦¤ùÛPk¤;ñ ˜.iå•‚ ìÔÒ糃á'w ƒDóY´pEGÃA’(6rFoœjÉmu@Ä\ˆ8?ösædI v@7lÀbqi_È[µÂ-nØd�áv€‹úÆ‚¤Br¼@i»`"Š;a@ÚTßõC³ÃAsL‘¢-ù?gžÿéNˆÍrMÙiS@?„V5~Z< 94Ѧ®©ŠþjQú@dÏuÀ €� ?tҽ̷{bxiNŠÝPDzG+’ý~2("©] 7Jƒ¹TôÔÒÆp©ÞV�*`Ò•HuÇg¹ÉVaKÙI h‹0¿Œ8xFˆ4£{ÆL$±s@ÇÏVÈòf[­˜@î_îäAEÌšžøº1Ò®Wf�á&>—N; ›åê‚$VzwÇ¥ŽHcS&(ÛRM0@ò/g±#Â+Ò#£JºF!s­^.\øk ‹ÎËR–•£A¾!Ù ’’Ç„Ê Ë VÎ75/=° EH¥æ×¬ �^È u¶¥>!ÍNˆÖ•‹$jÛ` …'$Yá‘Î×Fl‡Gà` Ò (8(£jª#BrvgŠM(M-ù#êí„—4©J,†È“‚�Œ„åD ÷¿íî‡Âf’@ìÓùÄò‘%Ž{N@×K·üöŠ*l€‰ª§·vâ| É@Ól£+ñï_š’GÄ{•ÙÁ²B¾ � +Ä)zªQÝR�©jPšA¦M$•Xq„G!Œ‘¸CF€—„?žaAÜé¨MPŠ®�†¤wêþ2@ðÕ´ú�“DDu’+Á-JnèoÆʦH“Ù xæ"<Ë0ÆÐÑ¥›þX9ߨ„"P±5ñTàŽOKšcĈèÛµM‘cN8FÈÖT˰Ébð͹w4~ØìñÅËÝœ°ˆ£BlÉ Wå$jD²JÆO§Ï “’&J²7í1¯pØõOˆ | 6ÛÊ�~å!¸9œÐ yå��zh:d¿¹ïÃ4ô�%�H4üX�: C„hPÛBLœ¡Êá'z§òøVÙµõsvR´“bJAí�BsošŽ#+6u *ÎT­uÛ4éDì(‘´JYv™°A$=AÃÌç>Ö°TÐŽa§ÚaAè r‰Mþ�&²"‚…8µÚÀ: …5¸íqE¿Y9»*czÙë"üë†k@Õ@+�N¢a˜Q„%û—õ­§yö¾\'Ž”U ±ím^_@BkRíR¦1áa°™lðDº`_:%3¶áô4¶ôûŒ˜žÝçΡ±4@¿îjPFr2ÝFÊäræžÁsBÞë=~õ �yf=±6ê„WqXõqã¶Ã’KÁh Ù÷3¾{/´î¶{äeC¼(+Wä²uÁ陞ÅÃV¿¸}9ÆwKò??i­eÂk-Á\òjû ™XeÙ7“¡rØÝ‘zá´³Ú_¬àO_¦‚Êû€õ³W#{²š–̾%,GÖx/ž!&î‹…ã‚LÝT›ðº”•‡ÈWà’ƒ?+ ä"2Òv1ÆvÀ,Ïs©ú¸»’~7‚ßY½ëOwI|UhP¬Àsnvà¼.ýÛµ²^Æü³+Šíphˆß.%Z… ƒ¿�¨B:æÁñÖà÷v�Ê]¢t@˜o‘¬O¬ ¾³g€ÌdbÇ# µ€Î&ôøÓÙ½iv¼¢ôoëå,Î3°Ð��YIP ï´‹L×4ú;Ž–[­|«˜tÓ§uŸðv¡!Þgú˲w �ú„cé7íþmÀ@æo½¶â ƒă%Ù ‚qGle<�¯‡»3úVŠÙÀ»¾¥næ X÷Ò²·*Ì¡ý}¼A ƒ Ž‚A,§,(·A ¥|Z²ø ¡C®hC§‡š¶ysj&?᪴\,$¢¦ Pm"º��žë›*Æ9Ì7¹3o�²Éåçë•d�<¨Üj©¤ë¿€¥4-¨è–„}È¡æù%­„Øsë6�ˆ“}�|;â Ÿ(0XuJZKçˆ*NU|=rÀÉYÂù`Æç³r'‚Þ·*€¢‡=Z} Ä:›m#ÞVÄú+¢V ­°ÚDZa€OiìjùZÔ/g/X;~‡u§];EF3òÂ�q:Èoquù• k»UÍ„ûäØkQl¦JGˆ|í0Õ>nËÂzˆˆ³�é³ÁM²KÖÅBêsí$X5Ë4:oÏ�«šÎßeí¤÷Ÿ“ܺõfç)pon.ÌD¨ÐBRà)¼sĺ£Þ5\­uæs�f�6ßA7?›o_Ž?aÏñÞæ:sýÊ3}É• –À¿d(ëBHLb„ùLpÞÅÐúõW=j]þíÀCv ÌU°BAîçÖ¼‡» Õ\GE.óÛš<1nD€3‡k'^ÁІ5cý,j§W¨„­¶¡nÚð±Ÿ%®¦ø¥KiU¨‘5‘¹ò]2n ɲÆkÛØ$ì)µE»Û%}®•2ˆý‹ŽÎPäJÓ³ M ˆfçÊjÑÌŒ¤82é�gMÚZ÷ZfÄâ9î;mòÖº…et 2Æù êw*�)†´zÌãô$ÝŽˆäû=´ÈS”Á<ëP„™´@õÑ¿ÐÔwã6*TƒwyÅ}QNeMK4ágóx ¯ …¢¿yÈw2ø6Rk™�3¢Ôp-¼2;�Î{ºoi�ÎËsh]¾"~Å?hû¾ø,P}ív¶Tq�᩸× ηÃOf1 ©¿ƒŽjÆXE˜zég¦sA¼ÇaùÚ›faÊe"¾_‡È?ˆ´Ïx,èÕ­Sind%±R�1i½F¢¬˜’ob`„ œ2°59v.eø�¢Ú žO%ƳƒU•¢¬îÚ-ÌàYÙÃ'—Ö ñ²°‘ð¹¹`帵g|%^1IhÖuz £¿!‘[¤LÅ0d¢l9¬Ç=×¹Cšðr@Èc ïÁã=óV|\°±QM\éK`u©½[ưZÍêÌi¯�;‹¹9€Ï#XíŸLŸ¯™ ë7ñi;Q#ºWÙäÃ3 ”¾ð!ÖÕâ�+¾;ߥ_\ÿXc1e R5ʾs Ý®®ì¡?­ˆ ë( ƒoqm¶ñ>pî¶v`D¶UÊâd„¯j±2Ä-{Œ1UW½ùÒíß>¹ÈR§ Òåy‰]ç¼Âg=�â‘Xâù�…Þî ¤ÕÌx®ÖòÜ9Z΃{QÕæŒ‹ Jô@ï8ê`LÇ3xèøÖ¤ígJÈØK¢q…ë.KFá,¾vJ„cõ!XÀMÛöUdá�³L†€sú�\6û¾6~ÓºÎ'y'p€+JWg±~U2.(ºd�ȩ̈¿M¸fÆ|â¬dˆMÔÃç^;7=f/ç¾¶F[Yßb­!É;¸j"±v³CòGôð]yä݃•6ì‰÷�tY�ëk®¯OÈ·‹HêI.b´~Á8Â�ÂŽG#‹Î8ËøY\ã�±3Ìâ¾,Ø�âpûWxáNm¾ë#n>rŽ+¤> ÅM¸€4©Z£Í’èö¹òGJÄ!–R7}•Ü<þ m÷Zê(µËgÄ)³r•²!ŽÞöŽª§—-¶uØ–¶»†´S(=1©M× Ûø““±¢;°[—^àÀ¯&="„ŽîÑ!¡Ú¶…Éû‚]0þ-J¬³à{”ßK—/F¯©q‹ß8U –pm­P²«¹¼¨-¨U»Êð©„(d.·¹2þ‘.„m‘EôA¶LB}‰Ô¢´¢¯h<^ä;ú�ó~>³¦±*bE^gÈ¢Ì ¼­é“îÛ=½ç{ÝÓȪBš²èè7�’ÃðôÏCZ�l6r¡Ì³±¥]÷µ]5½n�ÌE,ÛõmÓØG¿g˜�Ã<Ê9£ù±°Æqš�OËæ¦ü|uø�Ue².í'ðOi¡Ý}VÏ/á�°aP;mîð”9¨!³éT`³ëà ÒZG·„Ì÷ƒÊùÞïÊÃs&»},e²M¹Š÷*ÆF oqÎlݰ;±ÐÂj}X¼†¿gÄ|êMÐÞNl­ Öòà„YÖˤq�‹ê�ûÖ É†³�ÓÀïØW/Ç‹¿ iœ,�â}.ma!¢y1S³±Œ".Þ!1€K4ÌWXHJŸI†<¿¼‘·Ì¹ôƒjÕ�- øW›à ÉÛ›!Òà©Ä>Ù¬4ƒôò·…>/ÅA®½ÌU’&M$ð'Ð0>9¢Ü€nïp²ý˜`ÕÃUɵ¨“˜·W_6™Å]û›¸D%ÌF…ÜчN›õ›²·ºìvÄ©� òxrÝr9‰‡’#z«•ÿN÷Yï‚#.hù‹ìݶ¿žlƒsŒIÀÑÓWF‘ˆ£DFº4ŽÌ(8j@R. àÇ©!l˜½yºÈjÔx²)i;7>Z)¸àWZì*sÉ¡o!½À3ÙßﱨxÏ7­¾‰aXÕ8ÂäF«3aÛr£3s„#ስ’÷m‘yËuMtu:伌²Þ¤47Ø@±,{›;®¢ÁÝd�è¶ZLf;ÖfÁxq«¨mL7­ËÖÛjqß©¬ã=ݰ:¡¿\3Ä ÕRìÜ7¤懳1ª|!ëµ”GÊiŒHG/v™EÀ8ô¤®.oŒèd®ï–<=:‹6žòí¼P1R¢UÆüÆ• ƒ0+I—ìË›.–~ToºTÔi  ‡D÷N+_ Šm¼¬`=ÎõnÚ{Ž:ŠPÚ¥ŠWÆî&ý¦ÚÌo‰T²'!µU‘ií:ÇÖ=“NjµxWØÀ¯fg7VDÅ… Qô!I¹Úë{Þœ_ÔŠ[ƒ××eµÝÖi(1‡*hN¸l4IV“åjØñIÄ fOHÏ€NÑ4!6±çs^ë¤ã‹hn+ 9q²¹¸|Õ}VÒâ8öÂë ›&<åׇÎì�¬o*Ø�^ç…µ�ßœ¢^(],+7V½tŸŒŸL:f‚Ó÷í«Á]þ=sí`<»Ãl@ñX¼ó‹Œ¨2ÈïN^”§»8„SÒ’ï‚AÁSVÉã‘®¾æÚs�ðoÈ‚š»cFï7{†™QCdr,у]Å&÷(5K�p3Aj)¤‚Õ†fq6mïHìùÓ\:Ãs3k°qÐ=BJlézÜN4ptèœX۪ꇄ^z–ËÁ‡€›Ç}nï7åªyÒw·&?à÷í]Ò2 ÿ Çø*_ñ(.[ûKÛÞâ V�ºâ> Ì� »ƒÂ+]iÝR¸áöY>ù¥ÖKö¢�Ý.ʺÂÜœ+6Äa“œÕªí¸ ÌW«,‹­V–@|йE>mî!Û¶Nó¬î1Cz»? —˜æZIPÖÞ<›ÞÑ[i‹+úïD?_$.ä·¬þòÈ}÷·ˆèBÞÖ 2Àˆ—´D•‡¹Ãž:›py áC»sByá@þ²·ìü|³ÐÜŸªª�Ûæ}@is³ÞWU ~ò 8x\N7fÍîúœi\Ïܶeƒœasšžaùx–Éï9±¿§à¿EA…ô<Š˜§UšíB0<IˆŠ×É,q�ÛÉc=£ÙòÿÞÅQ|yš:Ðz›—>¦W6¤œõ‘´Õ¬äã^Ò† ò9Ÿ�…¡[p„"�dOLðS>_?íŽ ëhDï¡ÿe.d=%;qœ Þ?c™Øæ¸¡½¶.1­”\‹ˆ€Þé&rybˆên¦º2 Ÿ"%=´`më©*z´9Ê&¯. õˆc=yÍU½³ýa³ïš^Gf6SWxYA†'­2Æ8t) �<á (È.ñ{»]ŸÆUàóâ%Ö¿’h C¥à`S„\yÇ‹Ç+|gu½n f¯£¹9‘ò²³Õº‡‚·Íã…pº^ž$í›4ç�Â?×/]R”h*=ɧIÌ6Ý&†?{Ö}Ö_¦°s̃³mæKÕ,kfò‚ƒØ¯7XåRÒ1½Þƒ«—TÓ÷ê¸ ôyÉÖºŒ1â�U%Œ¢:Ûùã–Ê÷·ø5l¤2%dccÔäq<ç5Ò²íÌøCbÁ½÷Îo+v;Ïé^l«L2Œ¿*kt€.`¥(œN†g�Åá÷ULèÑ} ÃâP±X¸HÆëšë¬oó²6Ý¢yPa mx,!œÝ‹‰Ûù6èÌœ–û]÷ÏÚß7ÖOKŠ?’Â�‘êP¥_¦:,Šm�@;*>á¾Ùg�oÉbV¤Ó\ 8�Æ[S†š¹ýpZm“` ÍØ ò¬ª7xò}%4—öSLg�mâ Œ¿ÓЇ`CÎóx·T_·µ]Š�Ÿw,ZÆIûHPÌ«¯Tø«øÝ@`0’|YJì¡<ÇGM½�oXª»èTA"«è¿î»ækykÞ�hõH쟡_ð4€ùY@»6QMg(eŸWqÍ�\¬A@üæw`Mû5Kª+r=€�©/%¹‹^"ÒdkwwÓX*«DaïËoœaï�—æ«cf{LEÙËêFÁ®øª’$ù©$3´Æ–çôgØ'•;ãþmt­�ªè¾<1„Œ8âÐ>6¤š[úv›È‰ðAšÇëU4^*’Ê«ð�"Ê8Ù–XMÅd°ÈtÂÜïsÚúX$hs×Ó¦´Pè`âFT|Ûñ7ÝLh.ÁƒûPÙ1‘Fzü=41´ã’P¿˜v5šl/»‚^¿Ze2Xv¶ƒ¾F�“㻀¥Qß{ñë–¥xÜ�æÃÇÓÐæëšq\ ËRRïVuû…׸ákÅÄLîëÖØ.f~ÌЬqêࣙݜã6¡ %¡´ÝÁ‰û–Gøì`�ƒW€�jÁÞlöP¯›õ7Í]IJwbK«²‹Ðiv½õeÜÕÖmã¸DZïë¬l@ôólRUĆäA{%ÉKÄ)“j“ãB3ª§Ù0àhÝ!Ê·›†J�¦)D@ÖÙëäVøñ…Ìš^¬TÛ£*†ˆíÏ‹�K}îø(�n·—ð•ÀZoÐʬnBy­|ù’¡)"Î{L/^ NŸÖ·ºD‚R|úC¹k0(,çÞ;OÐõÍ÷4CÍÕ{Qv¸!h"Y±ô_+z¯³}ǤüÕ'$ù°õÝK%`“úçkDTîm†a°ô·p#ècc+z¾ç §}¡û?2®MK‰ŠìêÊî¶ûw¤Ó”«îåÜl‹ðÎÂCP3·gјäáˆýÄUµ³16!xü$ÓªEzÇ{¨Ù“Ž\Õ»ç”-sáI±Ž›åÍñÙ¾h†×[”°+™ã´ vÖW']\Á;¸‰U`æ~Ç"1eû8‰Ñj+žk…1õfÝzÌ$„<Öêê»®“ãfñÝ´]å¯À_^‰ß<ÒÖt6 ©gwR›<ÛLØÅ÷T­|éR×»(Cm�+[ïU÷ÇÇ3œž•¡�³³m mŽZ.²Î¬Å cÑÉg3ù?R°Ö +,Ô""f3Å0¾›¶Ó)°ƒŒèÞq~2ژ˳cœBÛO4ÅS«H²+LÐæîg’‹kZö€Õ(�Øo�å¶ÅBF0O&Fiïìc¢`&<¾ˆ(Š»Ô�EÐ$À“É~TM·-wkF¬™è˜ [aJê Í˸^ò͹Z‡0fÅ™+ß\kþËáÌÏ“‡k&ÊÆ¥ÉÕ¨'—ªQAµÛ©MCwN›§7åv“œ6œõ$!‹r[½Ž“2ø«rËV¼â!Z 5hÖ‚ÅÀ}—~5‚‘˜Å¾;o°¾´¿ÞNp¹RÌ®Á¼åµ}GáÑdÀ“Ô¶Íåîyòý4ÚÇÕ� ;Y0Btfú`׃‡Uºô4ª‚70æ+!~åÙQò˜±>ו6ºc§Å¬KœvPÞæ½Ê5s˜àXJ¶Êôéµ:ÛûM‹ÌãupŽ·^ÓÇf¬÷6Ì–´á}èÀFãÞìtÖ¹XîêkPÉ›�Ô¶E‹%;)Yõ•·L€d² ¿exmÁ YžP£†Õc ÕRäβý�Öoœp-r/¸ ‚%•Ð�&À ð;ØŠµøóÔ¢_&Ò™î%ð5�¿Y�P(<ðg½^pýÁ.Wய7`£ ž£Y�o“Fg²O«œÞP*ÅkÄ&û\†²²b†�sXR[ØÆ’÷8„�¶[f Ô¹+jÎöUªçÌk­ç*$ŒXÏ4(üµlTAoÛòõgÀõ³¬ó´£ŒmÐejU§t¬Ó6O|ÁѤKkÒÌ/J[0‚Lë1~y¶î(«XÃô± Vé†ÜzYÍ'Aù¼Íd&�vÜîÃf9šàekxM#Ç:]òý5oI§|“”æ´h©ÛwËû¹ _Οeµ&ö:ŽÙà HçÁkç諾q9NNš4¦‹Ò´ç³­™³&©»à¦Q'z ìIë‚w ¶±0ë,yÚƒ=¹ÀÇk! äŠ<“ì>V\ë’ÂlfE…�K‰Ý Zæ�Ø©ÑçÐuÓÇÈÖ[_T" Ò†¹ô_ %nêy-#Ì‹rÉÎôõÜP™Æì«uÐMH>ãÀlr\ E]§‡ëz-ª$XŽ©ô£Eù§Hù'~�éï“ÎXÅè‰vPAÄÉû)š+ðr×*KÈVµ‚È;�ŒÁ�.pP®޳Ük‰âä}{jB%§EÅÒ”k¨& %ÚŽ'®§éWSƒ µ~´+‘tŒÁ“!²lò“k¶Ö­vË×X!à»´æx{\•ïhO¬á8ßK‡:e`8ð3‰ K—®fX ^Ûæ8 Êr�ªq°EØaŒ—@A³~ÌÍ ì­°(\_X‹£‚ËÇãSÜàzno•k®!C ,ulJIbv7Lî÷·â�©ïa©‘é¶ímö¸ñË  XwµƒÁ9·‹õ“.ê"‘G±öƒ*"­î. : äÞ½› ŽÛ“uTäÜ^ùc©¹ùAX$ò¦~«x‡˜)ãg²©2Ø¥¶g”OŠ]ÂrKÂö}{*½ÞKÚg» tR-HI'¡³\]‡uö:y<¶¤²Ø¨ò{Dƒ/Ä Éví�“¾6AY½ê³$%>C¦kCÁÑT‹hvÜMÏIÒ}gukÅ´§­ ]‡ÀØ(F³³)ºáÂ,z·e៉Á4QneÐYÀt=\•àRäxˆ¡~c‹ ¶å24?Ž„܃Y¦xÃ'Îä7!¸ã©8\qFdme>�Wr)Ë…y­$š·×ª±r­`‘óÄú¸ð a™K‚-ø·P4xµäŠÔTaÕ(xüú/¥Õ.ñ`A9úuŒdá†âœ¦K^vµ¦ä+c¬ÚÅ›yÁ‘=.3»,%ñAð°d³¿" ì³ÂWÊ&SÝʳ ¤Á´$=udz„vÞã€5°ÝCmd¥s]ã¿r ¨„¹ÎVòÿjÕ†2[aŸ˜®Q`wpëÛL$‡hPû.¬ˆwÞöç–ÓÀt‚ÌD#côÚ«¸«Ø†=ÒQ.s„Tè‚ßûœ`<¹|¨�N¡%ù Æ�AvÃw½ …—¡¶ÁŠN`þkV¾Í» :¤ymë]ñéœ±ßØæ;¿K×NOžþÍ4C±±åb½mûgLU;m3‚Ì»›,Ù6áЦ¢<‘9s—¶LhV¿¨i\¶ØÝ‡O;Ðh½«ßèá'¾[˜:Æ�ÞUô”®CG W£Ûi,¼$”:!L Ì+þæ'C£ÊúÚ ŒS• V”¥(ò½ý^kL^9 > �q/ï<�̹"y=öX%~ªŒÌ@õÏŸ‘©‹`Æ+ë%8®_õÍrä¼?Ïq�8‹fùµm”0§0J'pn}c }÷³õ’¥Ø ª÷ªýPל ÓõS0oØ,ÆÄÿh(è/µ L›…Æ…Qt¾¶G*3%¤?©8Ä—éö`¢9s]|༺Ê=™üÒ¯Ÿƒ_<ùÿ(�z{¾p“™2]i¢î"X7Òp¼ÔZ¶Ï4õ3UËt¶S£®‹6‹–ì¯æ}ì3Á %g»4qÙ_Û=2VIV/œ‡pÚП1È$uv428��ÿ.‡YÈn Ã me„­ö�Š_„`;½â„æJÈ7蜟Â5£ï“æÃµù�BL(’ ä°þ×ÀxT·Å4àqpq´m®(!FÎiX2Ûè§.BRÓpetÀ躻6²W¢'4#ñúÉ#}{Ë`YÓã_!ýP\èØ|®–®<½m36+Œ³OÏYžóXyØ_V&!0a¿düpÞâ-LØO›7,/'ì3FÖ´Ôåb[…¢íŠ=�àq§ �îÀ£Y��S׎'Μ!r�8‘gW`· Ž ÇëÇרYõï% l¡u…-àgus¹¦IƒÎ»zF�h˜2Pû·¡Q?Ø™pº{ë¸þLbv/kÍp{�ùb,ËZK8Ñ`Ç¥¼ù[„ùiƒÁtüé»]„øÑ€Òdš’�VÝæƒB™+îÂ|^F�³¦]~æHùÙ{9;e˜#|3‡¾“<†ÁZŸ—g~\Bµ�~· A5žm™x:C AÍÚ—h#u+ ©¹'ˆ- á—düš´Ê¡Y^�>N^‡;ÞÑóZ¶£„ŠÉàÙò­ÇÝ6)²ÆŽ¸À`ø?àM !èKêIS`ÈÍÞX> )h«­ã{(ð»½X§òºƒŽ×;iï Xƒ Ĉ؅gã&ähá‰â×Êm¾£.PH ‰W[À�÷û(‚ÕyP“-a€Ã4Y·ô%L÷fæà“Ï}�ÀùvùxלöBÁìÿû“JŒ;›ÇoymI˜„.6¨wÞóïa‡u‡��ÊÙ3¢_æù4¼ ¦¶ÑžÇ‡dMõÀƺ]SöZ�“¢ -”C&PCO“báX‹Õ³Õ¨tÜׄo·^¿1ábykì39—ÙÝBŸ'�gîƒÛuØIïZðƒ¬OÇäщþÀe˜ñ‹ÃÀjÇœ¹áHŠÏj±0ÔÈ îYíYr4Ñ9ûÉ2§œ›ŽE÷1¹T”燂 @»0qµùо=¼ÆÒu�œFøŠ³L9l@uª³ÞpAŽ1m1yÈ®óõøí™Yý|ÇÞØbgA£ —{–†-ç@F.€ë=œ$‡:[�™ /=àÜ+v×,y²Ç2½:$‚hŽ(  l¢å"*…û-�y–θåKâØÕƒuª('æ°Ïçå»k …`Ã,Mšû#jƒ ¢åÂ@¬ö’ªÖ{žM4h"²äæ†Â¾^ÒÈ{ú9z>ty¾JtC�c ¦Æ5iU}åå‚/ò�)¨n°!‰<Çìùpo¬ÕœhI‹_KÌQF„/!BC ¤‚¬àq4¤ÃßYº½”¯¨±ZDrÀ O­àoRbl›_0Uœ!¥V,/*uUâ†ðQ´Ç�ñÊŠXL̯ x¸UYɾÎ úb)xiÏbî1õ²¨§óíá-©ÄºÌ ^¾Ë1«ðWï4Ýeï/ZãÛ©Êýº…Ù–xŒ‚!×<›�ŒšÜEŒZc,6�›Ò|7Z ïrw<µ'èLš '½µ0áî<-ƒ•®A” ìïãPoaØ;,ªQÊ'ÆÙM‚¤2“ÝP­k›=°Ž›$7‹æ8f¼¦¯ÄÌã™Û�ûH Y¨ÅN¸ÓÀ “Žh¯ƒÞÓÖ®!Õ å÷ÐÈ nœö0E³Ï×úõŠ„RPÙXü¡Y ×+½zA/†ä…'V ²Ã—y}÷@|ˆàd¾>¬œòäcå½É ‰L²àV©mžë„DçšdE¯v @�^+R³=z5˜½F‹w¶0KœìŽ`^ÁbIuçºÀ”V�Ówð1<ìHa™“cEÓ´£W#ÕÓO Ñ8;c!|‘ ÕšÔI¢`‘уۘGõý¶[®O~$ŠžN×·Žùq]/nf¬etL£1pf©¨¾ §w¸Ô"×µ ²w¸®3êæ>È7Ѹ>ùô±ÛL¹Í­Í$JxT¾’:C¬šˆØŒBeÑ��ËÑLÀ@ MËÍ¥¹jÊ­¶¨¢ª®s[3'OIqÍùm¨§eM0 JÎÁm3”ÞÓ€‹ƒ�põejû›ÏZËëw}3°í¥¿@�J°Œ èÄhhÌl^¸uÌ‹JãLû‰›�ŒÏK®S­€Ð—-:Ë]²ý; …/ÑKˆ1e–n–מ&·¯(‹ò6±Ã_FI·°¯Ø)¶CÂó6èN?\ÆŸì&ÖùUs¢x�ÒiÉ…Ð5*ep®�-î¢Å#w7 ш‹A±´�VD›LÙʶÃ/$ö,{©yøÿÞ=Ã+3…Ú�…´�Á{! w^öö\ùXë×)½ƒP¹£AÀiƒnÏŸh&á8dÀB³ ç|î0È'»Ê÷Z„ˆIȬîZa<ÁÖsº×1.œ;¬ZúÜ<2¸T<|TYÔ¿}hLÄX0)×7Øw“Ü�Î+´]TèÚ¨â¼ß‘÷Cˆc?G‡œx¶<úÐæã¶umA<~{;m÷7 ƒù1õDÔ;Ç·~lKœïšoDx.Á+¤W,à²A ñჿ þÎÕeœmcUùà'O};:ò3:埳XÖÙQÙ0Dq»ƒHF­Œf,„wgÝ�–Ò–¼qj¿h¸yæJKáL›í| ì]>³‡w+{'lŽ­&}ÛáäÿDéÑFôáÞ%FV519€3²¤á†³¯ÂwÚW¨Òðƒ WûÈØ ‘x.÷Âl~Á—#Á¥–Øh6攩çé?˜;ÕÒ .Pû¾ŽtIßÂGƒi[¶ oõQ^#‚ã3)‡JÞ¦>ì_d<&l µét}›‰›9»îTÁoÙ§üø0Ò*Û‚é$»zôˆ°’c÷9—,̦oß\Göÿ9ƒûÇþ Në "”Á¾Ãhô?µÄ¹¨÷ÝlÝJ\¥<èÅjµ·…ûHiD|J®4Õ04†z)=òÓ“ûÉÑ‚e9G±�—hÇ éùÀý…ä�!C `,„PŸ®äGK7n»5ŒßÔØèæ¬>'ÈÂɶTKQ­$ Xm·ˆRU‹n\VÞCµë¯3,ÍìµÜÎû™Ô‚¯vŒ’ {Èt÷ŸÞ ²Ån°(¥Dõ{V¹ Cv¹L Žº‡“7Ì<úuî‹W&“…;[h$×XW8Àl‹7g×K5› âÓÜÞ�E^Õ3Ðg‡ÝKe†ÎÆÄ� à··~ HDµ3ð±@.8ÉÜSþ‘Þdùm9É5ý̘ ùÊI*0"5„³kdq;§º:Fްj8–• ËYõ«Ê烟I[B‘ûîyJ8xMúž,¶rÇ8•Û{x¯\uSa%ÝÐ f–ØsOY*lj(iL‘^ëÙ¢§uGdÉþ)0²¨ž(L ;>Ã`»iÛÀì Æ‚�¨g}~^á–E Æ*sö5q¿fR-‹‘EÂðK"H´ç ÒY½ØQäV Zòã8’ã&„0 å¨.iY­’íÂ,Eºc‘ÍRáï³…Î ^M=!Ѹ˜Z—£—Çp¸ŠÍá”é±"cå’·qƒ* íÞa�ÖóÑN%(%h­7#=˜NoG@àåjÙ/W«c€ÉŽaò‹³Dìõø½Ñl¢:a!•Ñd¼¡û®Âx�±´g�ÞÖé} ´“ëæ…CÝÀU€ˆ � )vMb"èwº^Ð>ÊÂ{Ò¬^öYt´\�ŒoygÑXTtQ´ek2; aqg;D;Ó&Ù•µûd¦�¥Q�º`ó—5~vµÊE Lj ÔT½™�+lÝ×Az"®H%_’ Îì;©½Õp³ Þ]ha±õílXš8Ð(Cƒé�Ú0h#,¼á`!fÖ0®)¶áÒär¶nmãy‡Vjrµ°]ÈŸ3 )\KRѨmc/^WâÏ@¡i)Ö+eÅþ­«Ç¨#†™çZ›—ùn`øfKÙ¼°Ã»¬V{ßË?�ñä{×;ÎÍ\*óSü‘j°”äo2³²©hÌq$[Üæe‡Ö§¡Þö–k�wuÍš£Çà1HRKüó^ŠÈvô§ Æ^ÂûFsàŠœ §]F¿Xþ\A>ï­ 3 páNå9>ÏBý]hð�òidt4„@›ðK¯Ñ¤*™µï·NÖÛw†,,ìþò͵Àðy{“\dÉø­V¾þŒÅ c=y?uÜìM�ÖÜß[\æPóôº¶t긷’ôöt¨¡]½6zÏmÑi”VÆlýίêN‹­fËx±£aA±WQÍ ·²$ h]©,�yw›÷yµq— ­.å—¾�úXvØ–=ï§ÁG7£ÍsÛºbm”±½Xë&ÝÙÕÿàÅÇ��èx1<_~~[½ýÙïÍVäâ„òÑ-b-H�K»®&:@'_EvÝYnÁòØíÈ¥í—}PªŠÛ Ìð“L¼ì€÷h!Ve$ÌÒ´ê�—_Må.°h3û^Þ7OÅÄëŸ]]»K\Ââêà׈ �­©ÀdÇähm}˃¶àšÞĉØ�yÄ«µšÑW/-Uª¡K&Š%¦ rÒ;®l3Q¿I¶q�|aÍŽn-étô¿¯eŒf‚CËB¨k:“cö][Žw ®ÆÉó(Eäoð““ô~û�ïÏ*F—Ê]€öP˜f¿Îå|õ®­7¿Ødº¿Ç Ѻ'Þ+ŒÚI+Á3ZéèÙå�†.—vÝ^s”lÇÙìû Hk"�ÊͰwìW.KÔæPû…îD;ûRB^}É yµ{Ü{‹CB�€-|om®±à‹®ML"•ŒòÂå/tÍ-¸XŒ6¨2»fiÓçǪ‰§Ä©9õ*׳�§Ì�‹lC�›ª�‡…{§•ݶZE 65>ö0xÙ¤ÇT>ÞN/k=ŸOGWçõâi›_˜Îµ m�õwxáì±lY/ŽÛ-ˆ&^#Yn£*¡Ü$-›Â\ Æç̘ÞôBvo¼|‘•*Ö€³eÞnUR5BÅÞF·E&æî]Á tO>Ç~.ÐsáÎ§è§ }Ãçd>:´{å'ÄV€[L¡¦£cå½>X0–¹n&^s«L|zØSþ¥Òµ‘i±!³“³/˜UÉoO~±§89¹q›˜\4X±{ž&\úiÁm=ðî—ìþÞž–\¢-e–´FÏOÇÕk”òP"X¡˜ mÛeoÜ“t³Þs ç¶1MšòÝL•`î}Uõ¹]ÚFß ÃV$~²í¡sáhPïg¦Þ² í³˜3¹‚�­¢oÕ�íu9ª\®Ã>ùÛÝ|6‘cÞÛ`”²á€†ƒ2+U´æÉ‡-^@aÇò¥¹?2†#€Rn·�G¥O‰ÁÈÍÕ3 8SÎa07ÎÙ§q•@™Ð�0�¶ˆ1ûíß.5x´Ê73÷Kë ‹wÞœ[¨›&±ñÿ71öd65OäÞ¾*Ѹý{‡¹Ìl€·}Ø>Îí5\©û #˜±æÕ*2ChˆÎ~ÄSÌãK)…œ®þWrÓ^ªÝœÜ÷WW³Oq•†Iïnåø�â¯p4ÓtûîÐ�`îSúŒ6ÁB– ›‡'Ý–CãÖÛØ]:LÙTr%µŸÖq=>~úŒy2âݘÆ×YŒë¢á[¿»“ƒ"R´Äþmø öBBmE—Þ„†O¬¿ZÁÌ"˜ÊoÈÎ?ÖhÊä�Ñ;k…†Ôuñˆ±w�Áë\9¹¥'Vá_\* 4«ÒÎG8K\m¬ûm�Å®õ¹$ßSeêî›BãÜ-õùO½ý\üt½Øa!ëkÀ…eµÞÛµ"ÄO«VÉß<Í�®Ê„¶0¡{í%mcùÕ4ÃPw þò{½[ØA›šqÊâÞê¿/1’%Îú k·+µŸešiÁ5Ðjæ rþá÷y‡ígñÑê勉7 Ð.+_óÓ†?Üa8œ&Ȭ0©÷ùlˆ-­þó{Y׿êVªÈ4“­uë�ƒÊ’¡ IQ$LF¥ÁŸ×jó�ÛNwó pñåÆ÷ÛMŠÚPöùÅ÷`‹Üp~þÕn£#86ýU7w¤rƒžì|`¶?} ›ÏúõM�E–Ö¹ÿmhÅ2â9ÛËR%ßû'�=àc¦S·Iîý«u컵¶{Iˆ?ƒJº60µEÞ¯/¢•ÏG\yE¶²H|ÀUö~¯ßd#6ÀaÁn ŒŽ¹_›sÏN,Šê«FjÞ¯£Ím ¡ýª-df[æ•7KhLsãË“.Ƴ¸ ßøCcjˆ¾p�®‡Ï?w7­wÒ RýL4LÏÉSJ»]µþìã÷Xóã8ܦñ�Ô ì€ˆvw]-]}«"Ú„ÃCÌ]˜ýÄ›-ž_À».sPz"¡¶Ùã—¦És¨¸ãúäõͧqH¹—{äå¬c$yû{Š1ŠÔ¶ùéôÂ…WU{)Vg»iÊÝÂå ÿV]®õ¿¶“…$2Φg äС•ð‘ñ+]7F€ž·jÎ5dy [¥ø„Ó{І˜#Qº ^\¤h‡¦€§¬qûZƒ+?× ûaðwåÂü}ÑKwã?¯dõÜgv\þl8¶P�[“0V\´}­¤Ï;âÆô AÌëA¦· ˆfyÝË•@ï˜Ýò¨Ö[‹ñíR>Ùç;�ÅcÖ–åU–ÙÞ÷ÇS8YOrL¡°u+­¿)JR,‰¡<¦-UqÝà�5˜’›2yM`' ®F’ndÕÎÚþšÕ¦…®ÌMªßw® Ó†Rk©e½:}¥Éà2~¥ŠÀî¸+\!„56 C†Å¬êcÒÂÆCGn:ûæ£�íÏ„„­µµô! žI5¤ÖQÝÖCˆ¹a,òDú' ?õ›H4üüqÖÉÔs6¬¯ˆl¬$œë »Ì>£xjˆ³öó9‹w�ÀääþÈ ÷;j�KÛ¤¶àÆÏ1æs(ES÷C95ØÙNÝòÝѾÒÃ#–‘9‡p´kSUÄ„íd]ñ�m»’Þ+¢Èy½ìU‚ŠË¥™ŽìðE&�oÄ1é͹€Qâàõ¬Œ ê¿�ŸèUÐæ$ýîjÑ’÷vCG‘T %õ+›R^WÛž,H>ˆr“¤E©¹°XyIh¿‚þ¿ï½p;Ÿ‚Z™£é9çx»‰j'údmé6`¼6´¶t:ãï l üçŸ\zÔRâƒìâÆ¡Z¨{’Þ€¢¾PWÔ�®/”ŸˆvJÐq€£‡·‡WzÌìp¬@‰¸òŒÑê÷";:ðgŠÑç}aÏ­vo_{ó;ͰA&ˆ<[‘±¨S_Â7�ï¢8*g’FaS(Ót.`iù56ÏÜšg‡º”Yíûؾœ2kpøúg¦Ýœ ‡Ü}-A†öeòçÉm �ä2›IЉ`¬Öº5ŒaƒA¨µìz¡Õ;9|øÀÞÒ3:+¢ì"µTCêøæ¨óh[­*V88±\ ¨áW çÏ„Vgž_ËJiŽ_d|ns놻b¤p ç Á 3xÖÅ�3÷ ¨­ Ñw"o«7Øß/(\*¢õ‚1x㎘·ÔÑñw‡Ñ�0¹ýA$,¯R0ÛÏuÍoÂj—PðÃQω%¶ví¤­¡Å>¬knùÊÆUaAžˆëôYq‹^5PµÀpò.-ìOaí/´é6©i§ ÝÕ³ËÄ�¸åÆG©¯cñà0y‚Æ`ÞlHÊ[äÜjÀhñ–;Ðó>åÉqçU¿üs¼N¢ñX#ª— )�é÷7άÅ|�¾]í)>OS¹Ì»Óëä6úpš+usçjŽ@Ø2òOÜÏ7Ì»Ä+§ˆÃ7@RÔ½‡îu‹ 9¢Þ„™µ^€*ñÑÙ«rÿö—õÛŽ#NB>ØM«7¯‚Ò"œ,õ0û8¢,À"é1ê­¢ ™”×vÊu-nTtv§Ër´-½ò;haÝMˆÐ»56“‘¿ß¯®û¾knmözÉ»óZÐ`ý?1ˆnõ´£.˜él¾á4AÝÇÉ ô¿`-ƒëçÏñϹ4J,Ðøg<*JvÑò1ÄåøïÙÆ ã«È9îÖ¥ Áù×½3ö³H¤�¯w—]{ÛÞ׆[s'1º¿:ÏX—+«áɬGl÷8ï©‘¶Ï´ùy-Èžj­åÔ›j"uÎI 9&–^¼jv{j l¿ÈpåíÛ=ñO7¿î+™ߺyöõ<î3ÆAY¯¶¬hÉ@@£ÄÈ¢‡%Ž`ÚXÖ¯!zr4 çΡº7-.¶Öƒ ’¿QóH€œ\¨L7Göº^=:µn5îϱèÐ t‡p²˜¹âÝ›ö7˜êe¡RÄBÔ y«ý¼»™m0 ´šÖÒVG*w�™%;4<#Üä½$!� »_´fvZà6/k°©•Æô;›��Öp2]+>Ŭ�v La&jö¢ÌÙr�gžjÊ“°å"5WÇyáãgÉŽ¸{FHÀõÑx³ÏMYyp@¬6�ßd2K»ëÅ.}_×ÖlC«R­2ks@s7LµXözðAK–‰™íûM‘×�¸XÚD7±µƒÆ™ç:w RöÅÈü{NäÅ:bä¡ÔzÝ6;'}¡%$ŸU%¾j6iÇ‚íúw�;N\ |.á¬0l¨ÚðÞ°lw4Íu`!Þí°—O³{îËÉóÓc‡dÍû�mТÌþâ:ã.ñÖÛÙ¦h«>€¹àºw; $ÚªÝl^·JÚéÍ«��‹�#¡ór@ó^.—Þºëwkò_î[•‹ü«`mîfàeõ}êÓõù;Ëž;ñ0£d”¾ç´¡·¡ìG|ë…€é•XÀ.Ën8Ǧ4Ø÷1¼è=`:¥l8Þ¯8Üߨ69\ïì¿sG|…wߢù‰ÇÎIVŠó²Îy°ì•uèÛåü‰ñ{¾ÕwF§Àe^‘ï£ød=õß‹½(ÃóÇHégwVA±¯+Ö®{‘¢œÏkZÏ{Ì PÝÆòzF!¨jÆ5)wN^Úʉë©JÀ³Ò÷ Y ?vÈCJÜGr°šÏÄ #K¢±Ûóî€Ë�‘Žjßœ^ÔøÓ€ûìÓP]Hb˜å3«I§5%²ÓýJ^—�æioèïË�–L…—ï V00´Wî99i úï^'àÇ•œXæ>e}‘ûÂJ|ÖÕK†kÜNB6¦<Õ°W›ò�»^ÆÚÑ�Ï®o ñ‡KÛ|„ô¿<¨â§»:-¯Ææ8p'cÀulÞ¢=He\ŠªÅ§?26ûÞK/'bÆÐ·­¥‚ólç6~qÙúþ{_¾†>îšošÿQ²¤n �èÒõ'v'ø:UÍÏAåñöfI1ÊÈD–EX.ĵxÕk¯Ù{Å0mŠm8YÖlòË« ˜NÓ SÈ–/7wåk¿wMï°õ×�ÂÏ ÇTÕn€§ºî;G A±_Ž8Ìë×¥1$Á[\1tQÑŵäa{’n;(×|ô2׎%ºÀ•ÛT…x†ýk,âö&;hPHF(3Àaqd„¨«jT5†œ é+¯cÞ�|Ùóa#D0$[9ÞŽ%Áµ¯Åý»±v>Òš«ÍúÚì0ö>ßC3å�W½‹€ìuU‘¾;³Í¶ ÊÎ U¯‚ìDV/�R¤­a{g·Ëµ�›9n¿Ÿu2 nÚŸ�ßgYÙÉÈG‘ˆ1-r"�ý˜ô‚ªlX�,úúÛ\wP¿?Ì!~—­Ø´¶;VÖ57¯„ž–+ºÔìŠBà<ã1Î7…ûá3ØÎ=ò Ç\¯ ~’jsSÏaSƒb ¶šÿ½Õ'°PþÚR”¥+ÆpGòXýfOM>âÖ¯mn²ãqøëaéW‘#¨OŽLq´cÉ_áTÜ7�;!d]03ßçñ›9A6;®öú¡ µ]±«Í G%“ü;ÓC~3yUÆ_ÄÍkÓ„ÀÝlØWRa¡Sj�íù£�…lwx1²ë0ŽðÙØý¿©ãš¿pr6KòBíð¾=Û³ägR_mV$ˆÓÏÛÒÙ}çr�õ¸Ý©î4¸¶óyð)´ <_ƒ›êî•§X¡WyÙì`‡›å±¸âüHüÜ”áåtd/D†-¯U»R{‹¸Ü)ò}�Ào­J��5‹ftÀíŸàðý·0éŸ †¶‚ŸT&ñC=Äbç_ã&¶­æäB�0Èë ÷ͤhܱ£¬hïËsYëwÞq¼ÜOyâÏ]ózºzMæQ­ü��Âø­Ö¹KüŽÏrRy9é,¢êè i&w¹€ÏÕÌ^ĽYŒ È".”Ö"ùýáTå%Jí•§îB\®?´;¹rG,îÁ Ìê ‚Áv,9¶u�IÒ¹0çvtÔ òûñÀÒIch ‚?”mPW »T”x[¬z—q©•¾V…,�}í3b‚ÃæSljÿN³â¾{7pÝÏ+%¨UõÁÇc4ŽÐijÛ ÑW(NYP'sT¸í,†{b’š4�Âï5_�ì7‚/ó[œýNY·Û7Þ/±Ý`C·Ú3q÷Øí4vû>_‡£»4±R 5 ¸ÏÑÅúçû×<Žf•ùU:bi>aov$NÒ·Îwigzî -XÜ÷Ú }^Áp9Z'�h.[l²¦ý#K˜…僆s]~§GIÆ vø\b<7¿inÔÒÙïRvƒ]5 ‚ÍšÊFNåá™D.)ûæ´ÚÈ% :õ6¸ÍU{©U¹ëÒ”ŸwÃUîWˆlTôÓ3²&ʳuÁ»©±EÈfRž�zG�!ƒõ·x·xÖ}º¬¸ÐêbÃðìS9eXÖ4€ê8& (*ù[€€‘KÖM�²%V„û[ÊÙïÈaç¡â|��+ÉYQé1kÝÍMƒ�£7~¦¯º¡MÜ”rhVC"ÍÃzÍ<ËÎp]õ;­‡?à,…¶ìÀ_‘¤‘gRKLÁIõE�Rö˜ Ög–u–ÐÐÆCŽo�|®1Í÷w!‹%ûÒyŸ‹^é‡lþë”vïÃQÝí´ .FÕÔï·—^ðÞh9­²âá´µZ®|'H} œ1”ûS’}âosQpfm62j:"Â�Tc‹poÄ0a�™M[b)½�CM¯6�t´÷Ÿ{|÷„ßG­è) XèIQa.2‡¿©Çi˜‹IÚN[øB§LK› ö•Ä,ç�·P>б.@ÎZøêßó*ðA£ÓÁU…-®„;ÆÒ.¬8¡GO�©-ñopÇŽz�´GÓ¹ëÓ e'%éÂ×N@ò-ÍÆA¼n ¸+âjµÚÜ•yÌ«9�Áã`-$mœ§ºûÝÇ,Ö€1 œš¯$$W½ìÏ®ïS×¹§ PåUlM’ßo‰M&×N‘d%ѧƒ…q~Õ>U¬,o„f½%¡D'ô1ˆ`×¼´OzÙÖÄÎ÷Âuq¯à*]O› ’–:ò5+-uùXÜ›s»–Ãã£È 6óKk¯§™‹ v§¿º¬Aú¯&p> lø¥ eÀîóê°Æ8Y¬ß Ùè,Z)2Î I¤¬q¹wùqƒ©fÈT9¨G3Ñ=ØìÙAÅï‚&þ¿|ÐÐ\÷|? (ó�lè0 a=7‘öüê.ò» µ+·(¡Aú5b2{I¢q5e{ÒðÓbT6 µ¿—•NÄ�n‰ÝwiÝjØ,|+7tÎ̓‹AÙVñ…Ë Y N ,•¾«í;8y‘®•ý d ¥CÞ-ÇÓ£áŒ1 l²z rA)Kxf]ÜöÏ(f*>ƒÙDÞL2ÐlWèµ®m�õ×#€Äö �`ƒ§Ôá÷jÒͺ¨6{ÅØºY7îK^±ã¼]Ý¢ÄÚ‹NJU&¡æ�K×ßY„5û 6;½è¬àÿ{~ëó¯L=8ñû‘tÁå²\wC€z("iÁßY¿DáQ'‹æ2OÜ|UexYau´»„eÛþÅ ®‘C[‹Ö夰8Áÿ"7D(ØŒ�L…\¯Êô9&ùxïU]�Òág±_ñS&íXt{ÍéÄ\Efw!àè&ë»h3¸ çAi…%ØØ6`”‚{* F:~ 5MµdÜ=c»ɼŠ^ òÇO}[Jêû�£Í\ÓXÇU|ÿ„9…Ó�}LCóUsÑ…Üš ”Ÿe('ܥȮz_nõŽΪåû5ï[�Þêéw~Cæo`ùKŠ;ÞÒûEeOƒÚ¸Ë«ÕAç6»V—ù[}ÏÖ GÁhº0µÄù¨Ó�ÒSBXè-¼‘Eô`*Ó¤l…™¥ùS¸²{yÄX°@DßQ&YTönGÒ�Æ}`qæsõ"(=ð€z+7d™ù–YlúWM¸†ú‹J7¢dèn×6 3éh¡Sª-Íz3«å_lc§ÐÇu‡ðF£ƒ)Ï;ç-�Ùv ¹�\cäæ#áTÁm˜Ì(£&°*„ÏÛZvðS®�ð¬„+:r[$ß®×I�1ydÜ4}b›·]ÿš¹£r’ä(Jat!4ÈýÒ}VÉe€KIa�òJ#3îݱ(]Ì,úcµÆjÁÈ w¸e£åÓ�à³�“1�»|ë[gµZ¬Â�;vüDz²®ý17óæ¿¯'œyô¿½ŒwD–yxµÁrèx“aYâÚä$�Õ@úÁLLnÞüh�ÁtwmY±b(œï ÿW3Pº2ø®–lqqÌÔ-³e£ýªÖúT  Ò¢óœ†QÑãÄ¥e‰Œ£o’è]`fUL2ꚟ˜1$AÞèÚÚ2b�‚ždX@{A¡Ö-pvÓHäopžiÝ ù˜µ¬Â«6kêy£›g”¯ï5jÂË(Wr¡«£È$h!8ÕÑÜTˆN�xK~èiuIW/Ä�X(Ï�òÝöÞxôdvp´—OKÆX€”ÛÚ—l‡¸Ž"“¨€Ž p[ºˆY×0’èü˸ìG�º¹’¿ê%ñå±½{j fmÞ€Á$·íN¶DvñYý€ìeÂT'~#ÏAC« "Ðì¶4gK•’p„@§¶¹1©t½bh¤5Lq¦…ÙóЏ—.üPܹ;¦\n­‡ÍAÙúÛ¦µ 0v×¼¢–9ɶ O*HUJ�EžîaÜôØ+¿Ìh¸œ›“F‡Ê»Ë9þXãv4êŸWjPŽ ÏBA=a$.ùS ›µ¾ºû=õ&ø|^–’àˆÛ?&7®ÕY8ê!ÎdÒÑörèÅy¸só‹ƒÖ<·C#ó‚f•]©p¦ÐZ-«ηN~Íÿf áòéÆ18÷mñ3yqc Ó®¯„¨vpB˜Šm¾“Þ®¸DÔµöKm½óðá�NW ÅU{@é|z¼%÷Ýß½JHÆôðL™¿² ÄÜ�€Z8Üp³w‰‚mFu¶ÏaÏÁÑœá;FœOÔž˜Ÿ‰à«âÖ4Y…›éúï›*âü÷ÏŠõ»m‰"LßÀA +M2é1¬?æxa©À –cKL›à„Šú4=(φµ¢}ZCH,»¤„œIËŒ¦„ùYÎ…�}h�!C!µ¢È�C{3—)àÅÜZ_þ¢cC_)¡ãâ.$^C?² û)·ÇÎuß°£ÑDµ½e,bé�¨z,âåÅtäÿ1E¼Tù|ŸîŸ?͘=´$eHÄo[a.ضïy3µÎUåYÞl ûƒ5]½…’úC€sE0ÐãM§ûa¥Ë‹0­ÞPþªD…E¬WÏžóGJ:àtýwK_¶þbñ`¤ZÞ·±ì—i@m wsy2DÞ“/37µ“Qüå)d±ó5se‰²› gÄ‘?¾ïz…xüDÖµIíj*ã}{ΣÂ?›´ •ŒPSÙ Aïiww®IÁ+ pÛvð<&›‚ÞØ;6%°“¿î>>î 4#ÛãîšPŠù¯“1}üø`4€™ñ/èÚ³ c&aÄ mÜùµù*Z3åŸZ¢Úì÷ÑwE”„-ÝW0;ã&�w ¦8û—Å`º“ %ßì|2jK,Û{g6�ã­íÀÍM|9Ö Fú$²—ÈÝÔ«lÄébbÔõ¾à£y1Ö9‡;íñ‚¡²–ß„ï7Ô½ÚT‡FéÊB¾aòç`ÎìŒ�‹Tjìví³`©­†>vdyÆèC¯Þêë�;îQ‚rÕ"9 ‡4_™Öó�_3‡Ú:yŽ c#¤ÐÜÎûB�w+¿Zw€ÓÐ5® Y“ÔiBV_ –ÑàGCc­ �ÇX~5›æÅN‰–‚Ú¹\´¹š~g´[×éí·|¼…ÖMë\è�­Ðax+7á¡ÐDÛƒe>O‘{H†T,âÞÄäÒÉ¢­fb>ð·„Ù…ñ* ½­-ln`ÄàpBŒŸBž+Ù›;¹8Æ“Û>WbÖWë\Î0wa ¡CÊM/PYÜi»Â8ï.û“vúø1¶;Õ`ªÇž½®Š!A¿â,}7ª�>{6ýg?€ýè¥IŽððkºþVÈuã¾×NšöÝýaÜb}ª8Xà¶Ý HËw{�»PòBÇBü pt͹±x\Ë|iý�MÈ{™r™ÈÞ68Çcv*\íï“°ÂË…òÓSº.ã'Æò×o¹q9ÁiCÃ/Ÿד< $ü«úð2§õ>ZÉ}fÚ³–vÁiÌ=[väšÎµ;¬^g±…�ã]){Ô[5AÆÒçlõ6*˜ÚÕk _“ \M°%ÿ!é ÝÏ&›Þgx¤†27û€"~¿®&¯Ê¸€¥ëc©í¬"BF”\‘ m¥.Ð.î× c?(655›\Ò]Á­|p°+=ôêµ½Ô½ø2É`×yP s‰ØlÚ™̵âíélÞÝ�²$e’FCà î„ßÅå´3ªä| Ú‚Üz[ˆo�¶Ú§éz k{†Þ$,Ÿ«¤ÉptY‹Uæm}TÆð!â^á Ö>¢;©I›HµÎ ø~I³ˆÅÏ „6žËºd�õÌy}žX‘°CÞóx|¼N2fÑÍrÈÒ5ù÷/²ÁB (RmmÑb©vxÑ-§èB]÷ººÀ-vx x‰+þl®ÆÐyjÃòÒµ”+ßNdïšødKG,@¡ïLäG0Á²¤ìáü�Á™)Ã/0½&¾0ÙXZ“›Ü¥NxšêÚCγ½.HÙJÑïsæ'œWívôAƒ.žxs¶<¨êó,Ã<ÐjÊP†F�AðƒÜH* ¡gÞ`¸$nOÌß <š2ç¸{Ú¸÷w>‘{¹Õ”|J ߀œ{:\ÛñSÞñÈ–™¢†úúœmÞß­ÎcÖ¨CôéM'µî_]íÑ‚©3úÉbå²wYRe­ÆØ­[_wtÏU©9.Âb°èwÁFìSnßt”ÀÕæ Ù0Jã Ÿ'¸H:�ôàaP·ç_%‡o Ò¤–rDkP/�…=6ÃYݪ ³´ÕêîÍÐ<Á�àP£F!í¶_�jæwàBv+Ùorve­Ò‰Buû~ˆì�xܘQ¶ƒDgN‘áQ.î‚É!±¯T-5VÑïuk„È5qƒ?ˆ—–-ëÚÄà mE¬¢X¶�$•Žr\=`/¬F5Ï®~Úžóv¦߉o£…F#…ëÊ«�Žóc¼Åa*#"joì'»«Ÿ‹ Œ}Îê“ !ã U·\DïúB|1Ö Y. ýçöÐ�Ô4ïIfòšÈ¡ìêÍkd?‹Çrœ ¹_b-·ó jñ•„בŒò@VÍc¬sqvMBOXD pé§ÖÁcgLz]jÁ–,Ès5y»V7a<„ì‘0#¾=Œ¹TõÊM�Dž�u�¼_œzæ§Ù–£¡Å¯|v×�s�êk¿çR%R|`öu!JÔùpÁqȯ»ÿ_>÷7±È@·ì†P?œ£äÖ¹Ÿœ™�¡¾ ‡K^B9ûÕÊU?®ú�‚€Ü”’-«ˆó,Àé?›æ‘ÕØñ‰FÝÎÄŽ·¸ÍòUÅžf«"dÅQU¦›ÝÛeV¶oQm’chõ=C!hQÙ‹Zï LSŽ�›@$@ëJc㬮íözaA¨¿{ßDW7­‡Àæ5uf Ωkí…™Ãg·J��´ü#`‡pÆ ­‹æhËÚ}¢Î¼¡BœcbÒK%\—/nû5ûâm5›ÅX;™ðoòù͈ _ðOãG3ô@@sdW] ÄU—Äuš´¥¼¶õûŒGX%àCrŸèø»2…[»b0ú»tž'Á´ÞfÂÜ&ËÚÉ0« ¦Üø¶™fâXöû¤>w!~ˆ(ìÀ»´Û€™-ÙX*ã2ÚçÙx�:i·{ÑB ï›�í ñ´ý2ˆå×b lz­aM-ì:ò±ˆ Qàb§åú¾ ïv�*0Õ qV°ˆz<±0¶Ü<Øølðu¤Ÿ�ZPNo.a:=Õº“²åç�Ø)ãrØN¡QEµ ¬âÒŸ½ ™àÌà%¨±íÊûmd § »µ²Aø*"G”þ�:È/Ïó09 a"AˆòxèÚ퉴Õ�…Yï“;—Õ»{:Bö_Ðtûn�*z°†có†‚Ûüah;a˜gºÖ°µÊùÑ›¬áºž«z4ã'ÖÚwƒõäËaß½û âˆ_P[ÛªìsàÞá®Þ ø‹Ã”ô7 3ò¦õ §7gÂÙvî|Ø,2øÓù[’7 Cº#¿­3éä¢K&A羈š �„ÀÖõóyòV-Zጠ6Dªøráä?®‡A$=þR�Eþ¦¶uC¾¢÷Û>w׺ýYnûgå+¥a.Ò�T™ê߯lÂÖÂn¬óŒM·~¬T÷FT¶Ø°ö¹\3 Áž´ÚÒlYÒ‰²âuz“ /0¨wIÍÖÔf)«ª±‚$è»ëN-RA%ðŽÖ–FüNùÃÐwˆœ>G:Û„ù¬º0|ZMB,¿Ç_@üÙÔ%9ž—:Ϭ&»¡R gB’½Ã"Ë,^u¶ážŒ™Kãʧ-4 ²é�wòoV3BØ%˜ê¤n'«Ô8‹Z¬3±‹ç�‰’­#Xà =qp@äd!1¦õÂ×4�é[l˜k…U78Ö�×^åå`Ûóy<¤âaóu«wYy†óz® sº{P>!lg:Å™ªÇi}Ø™ä_w�ìPH.x‡!l\c…Ì‚H’ô˸• Œs2�\Âö5ÕÑÎ;€E¬6Uï±¥ëÀîòq²ªűQTd Žt˜VÑšð’V×e‚Áêß,åÝ1š-ÜÛ |ÕU²5¾·o‰/½g¬›_zzzÜãùoºÍíÂÔÖ#G å Dv²¤çnÀo|f»Ð€'×0o,ðåŸ>TÅV•mƒõîä 4�s>>.gÜT઱cÓŠûÉ ÝÚè5žøãË»u¶ì#�œ’þ½Fºm*M¼k"XÓõåôÞª£w<€îÆcmh©š>t°ö蹿%ø'ì:Ž÷ÀKõ¶À×[š±±_š�„÷Élu¢€§åêͣǰÄ4�à‰‡MöjÙÌ}’‹×ª‡Y\(o[U@à�4³�9Yk0›^�0F|IÔ�Ü£?º;M×µ�•ñO<Ç=…Ðq_]áĸ…:ºÕë0BïPÂt`­°;ócÌ<ÒpTÌžæ]9ê:ו æÏF:6Ž‘lË1øÛ¨(ï Ù§Çe÷ç1W<œúf•×ZQ®#áÎ ìG7Ëœ9^IÓ×_ï;¢Oã�T!”€PÙÿ <ž”Ðz„‘fkzm¡p~µýü·É�öNÑRÎfz<Þ|.ñü!¯k„ÜyN-Q7D—í¯uÜ8ñÒC9úõÉfŽrð“õŒy0sÄšÉaµèò­¨"bö½¿Mô|¼·oÝçâOU½¸2[­Z½{É+Sóõ�ö1G_lÚëh‹ØÁ.mãDÌk±E “p�0“æ´)¿X$wi7ŠM~³ ÄöMh�²¿g (Žó[:‹,t0ën†±ó…؈+””Ùsh³pt¤yˆ¾’Ì ·ŠýÓ�FºÖáî…›t‰³â«3¬Õ"Jªž%Un´7ë^ĸN…7°‹ý}Bßò¸ q¹a>^0úûÀYh;’—}b¦åçj¦‚`¥¢#½­m¥8÷uE¼ëY`q°ƒ_$ºP wi°W O)å2G®Ð,…ÁçmXæ#v¦×+9¨çÑi÷ݜΌ,Žõ¬ÃiÒÄ»ˆþ� ~Ê{Eú¼‚v"Îîhý‚O…2�C Î!Sø‡˜<+t­/å %Wµ”�Qó.�ÚEZïO{„Ò­3zm»ä~[fÍ‹Èñ†ÑÞÂÁ"Ü]ïC. ÝÎëXí®¯±�´EôÚߨ�›7Zåc›[¶D‹ HÇ+ “;›÷[ˈjSЬpj\®>Û(<Þµ]l6C|¹í½Çhß>#•µÖç%cWñ›Ès4 Ýr·zXxWÀÁÛè%AÀ‡"•çž÷.­z ÕYçõ- /ßSù»Ã—H^]ÀNèmq� Ø.};Ôz\tlóÂxRûÔñ"¶S ª¬‰ÚÁ:ûg:ß~¶ß¦GÌý— œB;w*ö>¬”ÐÑ'Ùæ´R­…Å…ûNùñ™fö¶jš�I£úÔJËOÄ�Sý{9 6‚x.ù¿é¹„ûãfåå¶qÞ\§Ö¸W=ÙjÝÈ=°ÖÝ�±¤|ôÒ¥�‘ÉV¥&›Nµ/­Kä²¼ƒÀ-5Ù-Ɖ•Nέ i·€Æ˜ÈÈzó©‡ I-ä÷Ìc¢¯X½ï.V‘œŽi×Þ’ŽžÀ^“§�°#qÓµ°i Ë,S˜ I¹–´ü»Þb%Áéíß0°yu�Xqƒå]"¦ƒZÃèzÌóYî‹­\ÔÇz‚â¸5â/ÒÓû�­ÊmWÚC]d�ÌË8N†Í"£&Ö)„É-Äð»ç*Ï‹ùi=¹V^x#¨åF¯žä7ûxCyÈMü1)kø'Òc‘¨G„„;‰®rásœl®~äðIͪ÷Eî&ϲàa çS‹ÚdÛ«õnn¶‘T»²åz ½“¾áì…€—K`dÄ;”îr iJu[͇Þb³^ð 6èîÜ s¯Ð|py½ ¶!cµéò?¦¿c‡n‚ЈºÝš÷˜Þìî‹n˜m$7TÇ›î€óNй5Sk3îÉ7¾ Ù_g˜îc{rÁ´– XÇeúù ^,µÜP3…O�fÜúfùm-§ï»²·~ˆä�Cc•ï&¾Y-^Á„dݲa @¹žº(<Ý6Ô¡ÐrL= Æ~ 3�†îPÎí&Ö`£½1x9dL|kb†¯¬®I]¬ oéeÝáwß8[.¶{h�]§É1ETFñIà!½2ÙQþ 'Õ.§<$LÁ?ÙãÊ’76Ø+…�F½ûŽ·º™áÈZ¸å ¦~¢pg�â#¿n«ß/rwßEß9ÛvôdÉ5\žŠ0î*pêñøñ¨ac,J¯‡W¾åÃ�‘Îj¸deáPšÓ·†í7* n/kÅjÄ ¤;yÒ²ÿž® ¡rÍíBlÔLDÖzž†:Ñ6Æ,w}:­ï%tQí‹«~D›¨Î${œâQD>ât/�ÄoAzµÚq` ’ýžèðoé»�nÁf$ÅôÃúìŽÿ†˜€±{ެ Ð<þJ³ýý½è3ªw�NŒËv¯¬_1³íæÚ,Em]çV®ë1 [¯=â.Ø"—Ó?&Ó«ËkœŸ×ÞhD2“ËrhŲJè–€¹³§¯5ߨ\nø¾_÷Åø£­6C©“‚;(8> -Ü<™¯; =_pÈ­QqT±RýIBV3JCˆÎÉoå mÆ]ššr ]J‡F#üq�(HªOø—y AÈM0�‰¥ÈhsѺó†ëStÅ,_ìK Þ¶½Õ wÀüu„÷>Þèk½šAS_ŽŒGãâS^ìHévW¶CçeìjšÏ)ñÄoÎuM+ È!ÿ­NRÂüü¾”Eb÷Óûø–Öï“Ù.êDz 0 H.‰¥o±ÈkofÁOWbojf‹ôŒ=÷[㵡¶Ì$oZñÞ¶!ùÛŒº°*[ }÷šð!`¬m÷{pø¼mÇ)ˆ‚C�²cDíJþNàk¡ešƒC»[>1 ýé;E ­(œS+Œ2ÊFBð÷5a ¿´VQxmÍa³ ÍåÛia?MåÄè’R¹Ç\ hÔˆÃ6ñ“ï‘q³„‹î–p¸D[Ôø¥#yejF6®Úån¨Û–ÆXƒ<, ìÜSdùØúÕ~r€Ð2Ïxà��¯EI 8#jé^1nÊÐrj ¢Û ¨y28 =lŽc0ÀÄn·Ämç×4±á }šfšÚýWµüBÒͬaXÞk/—üš Ê tx,Úzé쩉-Ž=kÑÂÇRçfr–ŒádI²Üo!°/Ý>pfá}³f÷vlçq08ò“!Ï+Èp€ó7Û§4^Q%A›ÚÛdÞ,g¼°<\g½C“’¾óÓRöÝvjÀ±²©ÍV€ãÍØQ-Õþ#8·v±�û¬Ë¼‡AXÃ#ª“£E‡È¨M+¶èL»u‘¿RÀ°ú• ¦5¹¹µËŽyÈÐäìqèÅMŽŒ­¬E&ç00 üI2½ÓohGZ=º¾mtJj cŒÕðŸ-g… ”'’¹äM×Q­£ û{„ÍÏTþ’mL8tˆHƒÙqº•± m¦ù;j†Û€éZ¡AN^‚€,‚ŲÔêÊZf¤Û� ˆž”ðJ»¥ÃÐ^Á}&+s€Ä¥×[g¬Ó×uv ɇxWá¬^ÍË�(kÙﮩÈá¶xKùÉþ쟼7ëÕ «Iµ5Œ0¬çX¬·œÍ°ym)`WÚ¶†”AP»2•_wo˜áË`G„µíÏy‚�n"'ˆ‚ï´ÚãDÞ PIçdËÎý·\ä†1†Ëy¤/ˆ5½~$dQK}•dî=>+'nƒ�qCêc 5’¿¯ôB†k[ú– Ww……ïd5ÞX6�ê£h¶wÉyh�²î3jÅK¡†&ÁÂ1¹ºÄ�‚ÆfÄ`âÅ;4ymößI†¡¯ R¬Ê=_Ýç¸u@lžÎÑmVRS@U¸ñöÁç‹"B1ž1¼õØäYÃL*ÎÉ06UÊ�ß4á‡Ù_Ø'u7wç”1Ї o1Ë]r8ô¶ê+’¶Ûš@z,Ò�ôÀåF†Á…6³€ów,cÝwû¦V�Œ |¯=¶�8_{Xñ3„øé»7üBóFÃL(øpa̾\1|Ý2DÊEv?tÄê]L�~‰Ñá­3ÒÇ)£Ë,9ð¹ÝRœ#yæD�³³} S¬�ÅÌz‡`dì¶0î=;SÓvkyhPÞÏ ‡î‹®×ö!¯QNIꔊûOcaó�ùæ±&Ø\@pƒ fó~A@¶á6—1Mꤱ�E›Òd3>(O¯É°ó%ËØ3n¡Â�Šx X`žç©{õç’<ìØ5 úÍ;†0+*�™»·x/†µ¬ü cù»”³¤5g¦ ®VDÊwx³ÜØàbØbùœmO¡VG¶a…ótØnaÉ›mšg·€õ 9°•½“1�TªbñkrPŽr0GbCˆüÇ­èuw 6K®¤ uVtÊeBꔞܜ¹òw}6Hó’Q\Ò¬öàløÌ{ž»3æÖÕ–ù÷¥¹Ø¬”­1²<§y½ÊۮР½ìãsG B¿xóÖï0~^T›Æ\ÙRê!˰9´Â‡¯°¼€ä – 89}ävÚ¢{rVdNÍÃõƒ=Œka»43-ìW|˜›²®òÐo’–­Fö>° R”§û -ŠQ�/ÐxÕ£ˆ´±?}Öà¾uŸìÐ�ï­d¯²·ß{J0ãÌ�X˜ÞåÖ¿Éáï¨FdÄ[Ãõ¶Á^û: ð;Q®:þ@;6œ.n~ò •Î0Î÷+Ÿ ¬žÚžàŒŸëóÙ}z¤'®Ä{ š*¸Xû¨oÌÛãÜÅÙg-ÁaËo±ÔUÁT›X5ýÏm+|V  GžNu×d@ðÊú,UËÚ=Ï}°•(W”â½V®íRÝÌ÷.»~ß¼ ž~�q¢°÷_ºŸ -zBúï|Èý±ã‚Å€ªkæ/È>þ ä3ÞqÌ�@gœ¸ßzC\ÔR‚”󱌡%Ÿ"ĉ³Þ 7úJÕøÀz²;ǰñìÞð‘°œäÌ�ïWÒk[ÆJQÊ%ÓÔ,Ú/0��5Ï¡JQ˜{¿ÙF«2ýX+uÛh~NïÜúÍž5D© ×miŽí‘ÖÚÈN‚®ÁóÀþ;ŸxÀ`P&öÝ-¹�p�hŒAVw{�šÜ�æ¦1!5šßpôù“5Wæ*äˆ6u2ƒŒïˆü@sçÊv�ÚŽ oÁ‡¶­€¿òcê‹è M T¥št`–󫄉z¯ëG¦áö“U/Äbå¸&Dï|gqa!´!‰$}s’ÇME�†Ç!¸ ÃíٿʺÓä*J²š‘Å—Ÿrðy}ã-Ú¦s"¶ì9ÂDö!":‡ CP°e¥¾ç™¬µHTHÆ£V:íð�³,šAì ¼4´¸‚rÇ[¥6)û{œƒÉ`κÔ÷=�sûaÇKý²8¹ëÀ9“Õ­`iŽ,ÇŒX³soú%;ÿ>NP;Åó†¼è‹âDi™‘­­W™®OçKý½ÜmÌR¾âjM'Ó= ÀÓϹc "ï“â¥{xǶ U§Áñ8i� ®'$¨OAÖ_µJ„�§CûU$@½>¸mËn° ¢Rs;´¤¢|8@¡öÓß-¸m–Tä“ßOø—¦üu…Œ=Äñ´Á¢½~Ú7º28öé/U›ð@ÿо|8{ûÏ }÷�¬‹nð|5Š1ÞÀ æ^%vÍ4Á­Â,?¯p”÷/à‡=C{;öž’rÖk âÝÖ‘³íWjÁ=ú^Ù£ïÉÐ,Ÿ~yfÇP;ëúLß­_E§Np8­Õ†y�lMûžÊfŸ/uÓ{|Z )Ï‹ß7å\+;_ôß·ìz¨€ö@a•%•�!E„a E„$dE�„…D”A”iA¥€ )©µùØ" ãzûJë[|%è@-xÄrÛ�¹´Ðd‚ë6Ön©‹ßx6ÿ(*¨ÿ‰êÓ‘4Û_ƒ\ kó�nuApol½¿ˆx ;&èèYYYnýº`àƒG]ßA`0i…†\8d¡êGK¡�íIU,Bß8ß-)ò¼q|�%÷iP¤AG�ÉဋV Ý�dá•Æ7+á÷Ø bž¤RnAr|q[ñ¤g¤-´úÁ‹SÔüáøfÞ  ÖCï\ø…™Ù.較tckXþÍRËb2”WX\'|�’ï ¥HI •¤¼wBs­ßW†‹û@?­š‰ÒÞã�Ä$VB6}-pppYás® ›ïÕëkw ¶t¡®((sc±uïH¦¥Ú�£Nï©2k/“ÙjÓÜYbëÖ"òb–n÷µÊø^ùdbÖ \T¡Ô T"…˜+´lц¦wòÏÓŠübÏÙ×>Ýa¶ñªÑ·6dÜaöž× (#Mõ8á+ÇWX  Ž�/Œü»[X,Núø˜u«®þÎÊANÉýåÈ|ý�¸R»ÄPN«QvôâÍoAk;|p±½ÐCV|º©2*àwd™l·3Œ/�%öÙzGÕ«Nãy�p¸`NaD,@bÛ!ƹ´¨›ó93žižïMéEœ”8s.qC;F`·œ£ö­bªÜòæõÛc£5´XÀk7æìg#ȸ¸»le3TÜLÀ«ê€ˆvħ’EÊEu©ÙµZn–0+Í¡’ré¹ Š¬¯Ñp]�´W­ßA_fAùÀðq^ÞÍ-h6Ããpà*S&ÒÄ­ÆÕ8•dY­¨×Ü´‘3à`oh*Õ8‡ YÙ?QøSòh78]JþլĄ3¾oKÉé†çǽÜ2Qreí×ìK˜X•Ø ˆ6‰·éì[‡¨[5Ï<ê·*ÏJX1É•…§ ¼—!ìÇͬÀnht!A¬@\6Î#½že‘×nÍt«ÃJ|Øes%#üê!ƒÌF&ÊŽ;gZúÙ[p:¶§Œ�¨ "5ŽY—�ú]}`Í@}»&ÛÄ!¯y¸aGНŽz¡Ýjóøâàý îøÒËÏÈûšVå°Ep+U¤h(¨ÜèhÃÇ�èí¸lŒ}iå?åç$¦œr™Oœâä×Ä�ÁÆ›#¬ÑÇŽ ™ºº«SŠ™3Þš0k<ð*¦ù:\‚ëo(ß§T M�'xÝÔñÚ³`ö„'Âw>4Ä̓Hˆ[«UL¢j¾qÆ&æ™°`Ûå ËceŸ»Ôc ,7/È/ò°]-3�; 18zôŽã;3”g°Ÿ¡)ÅЇÙÈÐëý\~ó#�.­ïlo›§PW�wõ Nb²xp—˾­îç#ôP1ä&gÕgJ-vim¦5Ž¥ï EL›H”ÑЕìßp-¬¨™Í”�%+8ôV‡D}à�gí„»¶U�ÖKznøo¬�½t;DïoˆÔ)„TuvæX»Í4féh¦áàs/® ©4„’·��‡‹$~ÁËk*šSÅ<©OÐî±a}\ì`ŒMò˜JÍHo!'ZNžÃYld3+£Âh¦¢Ý¡æ3[sFÏn|ÍugÊ!lî©Â9µÞæ´#¿5ô6<öÇp�)ƒòƒ\u‚%ÍþÕwà·i~öbÐ[Ùç³.T/' ë’;ˉU±Q“Ëp"Ëk¬Ü›>ø�SøY?[¿ÕPÐâf*±�ëäòÝŸ¶ÀJ‹Êü:æ¼9ÔVI.¨úá¼�`^êaPM½ š¿Ñ“<À4AmÚ¶Bã¼è“Û†`¶/Œé$66,–ÁÈ�Ã/Ããðã™°7Ú‰¡Ýtî%—ʨ‰ {Ãâly4 EdŠåGyu¡/f÷Ïí†÷ÖÂ8èÇ? ³œÀvÒÎà!¿ÛÈ&åxw>;•¸¦@Ø榸©Ú+›�u­Ž.~&„+Ô1ÇJUð<Ú •£�mhî?f,p÷~sέ ¨wÚÃlñç ¬Ïgw¶úκ¦ _Q@&ãðï´sˮچ¡RA18ù g:§o½¼W9Z»¾[Žä¢ƒ†@Q.ÂG¿h.Ožóg ‹~¹¿AçògýÏ=ж~ƒÂ$G~ð8WÏìI’†7»o}o¾Ø×�Áູ1�hF7‚½žÑMò„^ìøEô/Ñ4ð(È9Î,ë§ŒY‰×Ûµoܽ#|ß]¥�Q(xÒd\«¾¾oO%'™â–„ßI¾îqñF礴9Ë›õ[¸µ+l*~å#•˜G‚\.¶T= Ã`kSaÆ/Gݶ±¨¾;‡hEëé/6D‚#.™$úx7yä߬:¢€]ƒÚá¤ÛêdµÎw ²¿½žök3ú^L(ß¹ ÷�&g›õG3·ug8 IY°÷Þ÷CnkišÐ®xÓ¶VvK½’HP�uxVñêÑÚç¢$R~ÞƒênhÁƒ˜I÷ÈQ�çŒwA‰íî/yøa…·µñ{n�ña.~ ^™¹—&D«ñ±¦ýo‰ Px2$›  ë0ÙÖâ;ð½Ø9�EŒ�Ë”�öáæšª;+ét�‘®å`„.!VPœq9ܹ6’q¤šØhßA�NŒa ºIÎ÷s›áàç½½¶¶QƒÈ{4à Äëc¨ƒ¼þ4ïŸÁÏöм˜Fçp|«ú2v {•²:Ö"c&â“§{jØêçÞ?íÖn²À,!æôõËWî6mh[Ô7Ês†?YÁP»gÎ÷wÐ × ðoÛXÁN¥@Îhò\FvЦëb²3Üȳ_[T0ît–Ä7XŠZ®êGd ìoê“™a^û_ êHm޶tM|Þ6΢gÍð‡Loôä϶ˆ÷ì ã©/-xÌ«¦XˆWĵK{’J‹é¢»5 Cè/éZÍ”¶¨§B”À f Ì–©­gRƒö+¾¢ô(K·=Ó)O;s žöëƒåöS;ê¬òÉ�y•.‰�}�ç8Þéd\:”þ–{\›’z\±f5.WÈY³…ÐÓ[CŽNÊêécRŠâ›»Õö¹[5Ï:Ñë©þbJÍ‹l¢ô�0 „ë\*åÛC;: 6î­»ˆÍý¾6Œ²N$’œ)´Ï1jJÓâx"¢Ùœo¨¦w‚®YÉm)̼ Ž<£»X?tÑæeTiï�>èí ¶·Ø€ÿ7™ÓÐÁR´j¥‹ƒ°éíúªªa¼@3ðß =óæÝŽ·,¼p¼Å™ß9ÆuUŬöÄ·Y¼Ë0Úݺ¢ˆ]J­‰Àq¥X^¡œ>ÌŽf:_o%dñ…J( HM!öÅ\’Ö9ÅÊ ox`¶£ŒäjÓ‘“Ï[‡q2†“ý,ZÏ¿µõàZGèúË»Bh3y·E—x•†^‘çÂ÷ø¤F0bÉ;:…úêõ­�Óh-Ç-—Y—�‰¾¤X¿4yOl·¾Ú.¯Fîˆ{³Ø##± Vœsìeò¤‘&_HÃ…6ˆ:‰ 4»aäýx|,¡–<eûº h¾“é{²v:ŸÚœð Qï§~æñp6±Ú¹’z+À±>oyã°?S¯n�]êù‹1é=,Ðfô�Iö�¸ÇˆÄ™÷o"A¹ŠÏãk2±êCÚiÕöÎÌe ñ–ʯÃÒ&Ât¢v`º.¤aãïªÁZ÷Sç$\õŒÖ�”„°‘�Û Ê-”²ÎiÊ‚ O©JÏz«h¢I_Ó+�°ÆŒ-—µú ]ÄO™ºçwð8jíè26‡0™ñ—G3N|C'^šÎ7ú¤¼‘DÀ 8ª”Eßn Ã îžåtæZî{AwÕH™Ñùy/»Ý{è+ünbð Î<ßíÚ/|çã ô.Ò"öúÚgÀÜvaŸKÕ.ÂÝñ…Ò÷TXAýŠ(Mm¶Øâ:º Ùó‘+gب[ÆÄŸª W Ðj¼Úc5Àž€« êõÜn¢ÿ“#M HSƒ}H&AÛê°>Ý¥„Oë”w4i?=bܲîä;½“ 3¾S*X̰¡Úæ¹@�(»WÛÐnÒu,C©°Ý´/§V�ÐAo3tÁ]!ŠºÝ^˜Ü+NÚ¶ï¬�È¡yÅ uRµ6KÄÀŸHZó´Bö¬›ÑìM}[Šyx>�:sNÉîQ"-º.•ž‚„ÞÔŸ#ˆA¦9ÃË­zÙv yÆþ˜:AÂì†"¦ÙÆt°<h—Æ–Å·Cø¢‚Hƒ ”ÇÅÀ¢³šçÀ\dtU§Ð}‰Jí‡Æ½‚Ûv¬ÁÈ› ÆÓ�¶ÚB%KÇ{“HÈL¾·ën«a “ºŽ+Œá`¢Ù ¸ì-¬6*öÍ�6uÓ§YÍ_›NdÖUpJ!“z�ýŒÂzF]ëÆë[±c(€D—W˜³ÁóöT#…@«†Ÿøä;q†——[t»�“a Ôlê…�>FQ�ÆÞž¥òdóªíÒ^”-«Ñvá˜]ub‚¥=`åh™à@YýèÓ²à ü¡cMo}½îÒÿN}—4"p9ÕÒ‹èü d‹T‹õVoɤ�>ìêË_Uñì~yæøá×ÀbÖ@Ò— ÇCÐ'ZÂ\›|H ‚(¿ŸLrhz¥ð5±q\bé,p¡™ƒ—7©1ìö“¯ÐÕZ¶$D]›åÕJ=®¬ Òþº_¢ØÚ‚ÏÙÎY¬báÊeaëŒnA®®¾…xS­f¹�†PJÉœþ¾•ì×–(�~��܉i�=§Æ³ð›j9p¸7«˜7q"†k1!µ}ËX¢y®ä�†¥h1J6[ô–g _©¶žV/ºÿgª±ã‰8g×pw&ð“çä}÷ÏÜÝÃWÂ(ƒ(/ÞÞFM | ]`½¼¤£ù6Teï„ñ ›¬q¯Ê!v)>êÖlVÖmÈF°G„Ü5õŸKYœÆü« n8WðUG7ÑH·IÆä@ÙÎ4 6¿Ö£²f­k=íÀÍê¨�‡š©zV,êQà €V›ߺ×Ä›áp˪c»€àùsÂY)9ÎÆ“Œ>£ëÓÑôûÌqýB„�nÖ�lÆQ1´Å‰`ì¶ÇY—.â9˜&V"ÿEöAåÝPïÛó/©^ Æœo}©~#cæ×V¤ÍdëØ¡õ«J�`4ÿžc/F~}˜ìr6¨®GL4)!p¨§Û ¼¯Ø°æZÄ_‹ŽRã=n•kôßÁ|1$ð–ÛS›m»¸´YùVÀ¬‘Œ$�p¨›6OsVY‰²HÍ V¬ivŠSfÅò©½¤¿5«£¼ÛSy Ì:m÷Øš‹ÈžÈ†â§|÷[Ìyìé¼öR�…ñ;ލVµæáÓãvìºî‡�€š�Êr�bÉ$eØ|)пJz¦:ÎZl  R�š©­¡ô–õÖXÐUMj' X­-ÇÎ]­¡‡@ÊàsÀC{QbP'MfÐ|ß1¬_5T�M�¸úw–$#%•�âòP¶·un-U»%É Ò ‹xKÛg½°þ»Z«+§©§×�°·å‚¨¬yß)U™ŠÀ?"ð4k£åX,)¬êd‘uÌTÓÁ/WUwP��ÏÎj>MÔi!Øökßs×=`£`Û‡–Ù<ã·²F3{­�ÚŸx[rªçͤÐt�Ⴢo/¶˜ ÞqÙüV{1­õ=¾Í¶5àN‹ÍO”6bˆì¼èðÈ3a½ôJÖ£}{)œ0îHªØgQdiÀÖ¦jìïÕg£ªb5ªŠÐ)±Î�Oì›Ns]¼ÇÆ[“€·¬éGì^¨ÌœM›¯×ëÒkYD_¶ÒÇoyO„"ŽO÷åŸ ‡¼´£�uÄ©‚¾®]"x°ë›Õ‡áT²{¨^?¢?ñ÷/?sx÷pšÝ¸ÐW:U:ï¹xí|ߤ£½l‡‡�7‘¢t�”ÔÝ÷cÎo’¢Øú³SvŒiñiéfeÙ¬¥Øå¹ÃÎèGex>Y’÷yÃä~[†1Œ Yb…*ðQƒh7>tô½µúì¹µÖ86)òæ0ظ5è=%¦Vàsô` ‰¹�9T{¿ Õ»¿F‰í­©(ÇS.¬µégŠxÑC—ß8tT �©›ùšºÛ€Åkäê1/ËZw<ØFæö&Òï–DWÊ^Åuy‘DÜ÷™AQµ ”LóYÁe�ˆl(ålÛÚ8[fVB)@>¼°‡²ë‘\!Ðy£ÖÚ›Òk®&-ìn“~dɹN›íŽ‡Æ£{�êêíy;)i‹Ø#�BÅ™¾:­û|çaèf‹Óö èj?y;)¸k [”H9kß|€€È˜ENÝ?(,­kåc«¦[H™ZÀÕ÷€®¡:Õó]p¸‡vÁv7Wíá¾�„DoÎ2$Ñ=åøw«rùYl¶.ˆX,¬W›^FËQ\áÛ.”}ܲö�Ñê’îzQ-÷‰cÎGªiæ,r~Ïul…¢Dn;ÞÍI|ójÚ¡ìç- ~cìèÇnöÂÇ’6ÉY€-0Œ'Ò°@§T½,¿ ÖTÇ~îØUƒ‹O¨|+ZÕöä]€ÙlU Ã�Có·¹û`¸øãEí †Áä'䕲|om¸Mi$ï§âSÆïP’Îá„Ss»ªN*”~^ÃOÙçÂô�ÅÀ@ícý/;áøÇ.Ô^ÿêò€õ›ä–1�@øí>Àân2ß1°`ŠL÷2ú-á:’ñîR÷õÕ~²G:k· ç1lw:¶3ã€úŽŠ^ ˜ïå,°=Pº[?'µvMöXY'‚àÌ>§×Ë«¢yW=Ž,†YKDŒv´ÞD-há–& âíEÙ¤é6Ê àm› …UÏß$¬Yà ¥X"ìÉp0û«ºG^ã› �ì¤ãÝŠ›klWÝhû½pù¡.hdš+Š%ä…T ºþôÊ}ÁB³fòtý[þºïl™Ü a7 î,i‘ØÛjµ>–‘²ÀG¢: Z¿_PÄ.•:‹RS(S,_ 'qÕ!ö÷håžæs¨úÆ!-ÝÁ± !ãÛ¬{ÝGs 8¿œs$|ß7û讇~“9Ì2ÂhÃÌš×ÉÖ ù¾M˜[Y¹ÆÆ'˜,*Òn‘Zõ_1óé^ùú¿,vÇ-R÷fKû æ¹Ùû,û>„;ß�ƒGŒSj­öŠ“b‘= nÔÈ »[8h¤¢à™âs*’ßï‹Õ’ ?xÀ§7Ö #bÔ˜ëšurÕuõ™½ËMºÖ: lAòd&™[íÈ_à¥,>wšäžh»tmûlÈ­A+íéz¼$`[fŒì“!‰·8½~þ€¡W•6óÓ NEÖ¬hé.Σúª±�$³ñÒjöv7"Û¸6!ÔlG[ƒR“`ˆ�Ò9æ£Lvý”Õ(\.¹%„4¹fˆf0•7UcáÝ­a·HÙ_÷�GP¢Ë ^^x;&à£gÅÁæÝt®á€ÓºÖ)C¦÷Öu‹ü\Öîo¢aÚI¹ì¼é¾ú¥V»öö-6I q>@Èj‹­¤ Õˆkv»¥šÅ»=Bï‹7×: äšÖZdÆT;R„ŇB]*âåñm¦—Œž ³«A%YumØÇü]ù�~Ú�¯#¡ï;–¬ ~Búýɘã}s‹ã§tÖ¢ûî‚é#ÑuþônšI«oyLðÒ1ë�.17ˆ…·³à¸%/�—–.R·e|ÇWš ߣ~‹HpUÊp±æ#h‰ … ¥(6ÑõþŒƒï-uêÎêèu¾››Îæx¡Rk¦ÿRƒª�Ë!²ÞmxY‡¢æÁX�ܸ\‰4ÌŽÝî9PQÚõmQ` h;ÙQ’âçcçU‚á»U C¢14]§ÈõíHô7�¡lo°Xh¹Õî XcröJÑ¿O_‰jŸ©ñ7jøÈ+#™!2¶Jê�<ÉŽB›ˆ@Žçv¤ ³Öµš4­R°ÆÈ,‚hÖßsYÉò�‘Êð;³o|>UÂÞ5 -ÅÓä$�k{,ëî[î:ÛfÞÔDìÄ‹V'nHÖA#/ŸS…õÛ€¦€|gûä-ޱr¥ùŽîÎ:G|f{€“ ZBûZ|TULƒ. T®WËžlóÛÑCÔˆ7%]ƒ/Wu莑ÑõÖKcÜæëwÙë]û¼ú‹°¾Î2™Þ%Cu}Õ* *Þj‚ægìäF\1Éм ºx”]2¥@áRO½Û ´WPŒ•5öQp³“;íó(⺂dƒrÀàú æ¶ö93[Ó–l0=ÛËuò™\š6 ´70=Üúd��ŒF C§7Ûƒ¾wUÐÛ�>í[j�ÚÂJs|]¢]/çë{iîUšvø/XÌo·îÁ¤5‹éq)�ì&p/,aä¢. ˜,r·ê¨™ôï —°uðEÝ—\x;Û�@�@!3“š®m³D£2ý-XýÚŬ6«±å¯:â˜Hd훽í M�ƒìhNùÖ–ïåƒí³!õuíS²Ø0šÚ®ÁW�cå -IR¦sæ÷Ó/ë¥:¶>Í‚ÜÒý¼3S´uÏѯ7R\“3‘�6°6ô}cÓ‹~u4º�x-ß”ü_véÆ`ZÁÄIkÉç×kÝ¿EmÊ6¥<Žió›#jòpTKð–�]Ž9Pó�‚‡Wh4:òx{ÁìÕ¨îR«ðªpB§‰Zœ-¤:.šÕšöùu˜Ê5æêàOŒv¥† Ón¥{^¦r ʃž+¿œ4+&"ÈBÑí6µ�0ä¬2’q&-mèöæE†ÕsÐ÷NÈnó�ÇaE×)H‚*5ÁÜu¶â®ì€ôyî¾LÚö®p|7çN›ZðóT]ÐÎ\ÕôûQÑz=°˜â¹E¦ücGŸrýÖø«»(û¾—œ†%/C¯‹àæá¬o–J³=sÝ\W'ÉŒâ·;7¼ûEÇé ž,d ϲKÕ!‡›AÍÝñ—ƒ› (ÑJ¾¶äŸÚ¬ ‰ýt+š®a"žé–ö" 73W¶:áq”«Tˆen•¤+ê ®ëÀåfP–ÎÕ2jxUc¬k­ÚÓªúóu¢ôší·ð_5Ú¬ôTÄ>ÁÅÒöL $í*{Ù (°c‡ñm}Oß´¹ÁÞ°$_—-i[Žê¯”JÄâF~£²½gâgÉ_ëà#Žv?Ž4Hßž{iö\ö¨ þÚAí(1âç ò2orµûÏØëf»ßrÊ�€9/ÖEþªœ 0`vÖWV*Æ3þ¼¬oÞá¢ùt½²ŸÔÚV™•§¸ã5·¾kPoƾ휥 h”y“zÎògz9}=cg^ô”8�fNž§’v!ò2ÍRf€XË^ê_7ÕQ~ÝxYÂ)÷ó,=f.qVë‹Ø¥Ó•AhsKTbnÌ~PÅðKîA©åÎ~î rà\‹K¨ }]ûeƸÐYÊrÇK£�›´õU¡®ÞM­pÉþ‹U)A…ü«nÙpÙYËáRÉ\�îÖÀ¶-¼±¸–�–nÈÜ3¼Ï øm›.@&h—¤Š6&?tñ6élr7×nCªš¤²ÛG£Mi²0Vš­•+"ÞIâú‡nö}ÄÍì^òj<=›r)E¶¼}ž-ãÛyNÚ{Eè÷"ñÛ‡:<~žr(^]T@fíÆ¸º„ºÅs«sÕ^Kƒ6¡ÔØóDÄlÒZÄAStÂg)·ÞWS~â´Ê_ŒÃ�¢§µ=˜ô»BMvÁ B꾈ƻ Ðj=!Шóy7‹± Æû Î? ¤æñcØ%ãF-i—˜ób)z¬âÐéKtZš „ÚWªÓVåÜ1†ÅlC ÉXü�}mÄ »Ûß ËT¯`½™Î£OËC;eÊÑÞûC ÖëtgUÈ”wT´”°!ÜZï“l3�Ânè`ÛY[V‘Fa £eV�6Êd“´º\ÏÞ'99ã3x{—9ÜBõÜÖOÚÂ÷ƒ.jÄ™Êêlöºq›ó=¸¡—»‚bÞ;R/YV±â„âc:K(N硈êe xyÝé –¼äãEÃ’„GŽ+™èÅ9wàÚC…a þy7 ÚÜò½ð¹†£NEö€ÞLÈÅÌÛ9'�îç*8©‘ƺÜÖ25K‡�N &ŠbÖ:ß’bÊAl.܆,æÂ˜�>V [h·{™%DÞ/šk‚N5Ô÷'�6SÃ-sz½ö—BØ€�#¢«oÎÞ® ^ö5Êã¹�¯0·’‹Ýc‡-�Ò”R”á=§].«4¬õfÒìÕê’w&ç/ÖÕ¹Éò¦áZ[¤å7™=RZÒ}Mo ƒ®âÓªðÜ  Ñ fâÀÂ-"·ú-±@K ºˆ60›š�âÃ�ãXɾE°B§^ÛJlZ7P±Ñ·dôN·æcð]�è¦ú±~ôÑúÓçfŒ *0kµ¨˜5<½rD˱‘ù·s1ñŸE:�)Jñ(>eÚ;MÝP~@ˇvþÙW«Ç4i³©E‰—Ïží& +Èï¼ú>oÛ�K±ß5�UNOyéû”*¸0…¸A6s®X…`M¶ÂÛ¬«è}{}P.¶9L “k‹Æjé)¿Y‚øás%"Àµ3GëßrÎå`ÃçögÈm¦ {­!QªE–jê�Ñ+ÏÊVà…¬žŒ,* ùc˜äóiK¸•Z ЪAˆØ°Ñ²ðíZRË¥jVü8;haôF§Z¢Û¤îìŒ~8©3ĺ\u=ÖGlbAp¦–DÆbø#Ç&&7Êj[bn§Ò–fçQ´¶eAñêáÎɹ~~Èžr½¶4JÜñâtÅ[¯ G­wÅno÷žãÇëð‰è•]�ß’ ÝÛI2òNãëa¦ÝöÃìj±›%ÞÚús.” %RN¹™–øõÐs ÞtŽLûãÊR“ˆp=Ëî¨zÕ¢ÕñËÛ…gW~³ld nÙ$äV*G®PL<Ý„ª5ÌO­¹³•œ2à‹¦ñÉÉ?Õ‰-e‡H±uòQž€°ÝݢɶèfèIÄW$š©ºJ»^ëc§æËס»®ƒA øNBªOcÃæì¼J�,µï{¨:Šk©‘êW6ذ45ï©Ê¡;f8rl{Ò_íÆ´Xê`¾ þEüMûºVZQv|Ë({kXoƒ·ÆÂz˃)†- / §„�¶óQˆh½n�ÿIÓÐw·Ä¡'tb‚¹OfCaäÐ1µÂͱðœ1!ôN ÖË ™œåð™ó6‘¯Â{Y ¥þŒîþŸ º† ,sç•Î{?,c wéøKºõ ŽñpYïzŸáÚT>g¸¨Yä‚Ô~ú&H{ì[:lµφ믵F̹çÎh¬iw¤´ãïÃæäIm¥“÷@Tç’G8‡uÙMªBlÀP�»~­§ “«¤vgX¦Æq˜Q»1a]‡ƒ»�hB�²•Õ�È)PZ�x®d™ŠÕí?Ä Of.Mä°JüŠš7È9ì‹ìäB[á†×’,ä¿+Áj�W ¿º,7k{§v¡;ÁöØŠ�ôqµTiÜñ˜ ~Ø;Û<2Ž?áyšz€pÞªÚ <ꘙr˜pëíÁà¨Çgèä^°K}ëž®½\¼O`VƯ?µæ‘ŒÜ ¼¤Bñl¨–÷—žOhÊ<²é™Õõi–Ó„‰ËcBu²ÛêŸÄâp–I@µê­àlèy½»6ç}ów“Ý`� Ò¸ó)[§²V››ƒY,þrÖ¾Ñ眵øTº±n�¸”8£·ß·©©&°±h.ÐdQÎpñ¥•Ъ]SJ.¶-¼0a‡‹Žs6˜{&žlŒÈ>^€¤Õá ‹l#=]uÄOV¼¡A5É;·òh^¬:£ Ï×Ç×´jûj?´�@&Û}h:1“0�G{™Í?»¤ó†"Ü4Dàe°¼ˆälö§º } jFê8) h7ôÝ¢ƒ"‰¬8š�JäO%õf‰�JU† HÈÛ›\0á¢UèãÁÞÍbÞÒpS„hQbÜÝULÀ¨×qoÁ Ö9µIäLXìݯ¸|q?è ‡ÒB@$#úÎbÄï—Î_O;ÝkÔþªeèIRž4 Ïd\@1vÑ'@L¯:Ñdƒ0’TýCìÛòFsM! ‘YŠœ©ií’cûc¿â{û üßÚ[—`ÏR #É �œ4øUÇwù1ƒêJF¹îWæ°Ç¤Ù[&ß$Y¹«&Aƒ"ì¬kZÆ-V²x8mɪ}0]— ~k”@ôˆÐÜB P`Í?W:Ìwg¢ÐvÒÚ‹Ö�uÙy`Ñ ¬âúê{:q Cjýö11޶f?Ç£Z�\ÐÀþÚ¨Às³–q÷€ñÜ[K‘£ 8{%kf$& ÊzÁ- Ý-Ñuw•Ÿ“Fó0'ëaÉyV|Sè^ÆR*<÷«²ÀÜ¢À^±~d›–~ÇEï…‰²Ü`WJ_*“8eæîŠ%LQ¢áZX¾o˜¾P!�¹wÞ²mÆRH�°—3dW6,S#™‰Lˆú#…Å ºs‚¸õlÄA÷ƒ¹µé÷E‹”³ý�;‚çÚϬ«¸T w'Ø Ü‘ßÎÚ‚ø[9�X€±(ç Íß_¢*t§8´ýÅÆ"ß®œÒHµ˜´‚ÕÉ}Z3öY¡‚æ+À 1âM“:ÐR×ÄàŪ’0»TM¨¤VLólÎõ³Ô»öd›Ü|KÈn&jA½!5ûÀg¡0N�Ò‡ù¡ã‰lSµ3õþô|Ée>c¾ð}4Œ"‘ Ëä†È Þß:ë÷¨¶"/ Ž’¦%Ú»Ú³­lmœŒ�wî/zU�´·H3©FÄ7•ï–¿Î7ÐÞ×ß-§=Vsåk2‚fÕvc!:þR” P b9UŠàkjÀûÝ"››'ç׎'W��Ó{êÑq7žk±ú�l\ç ‘Â³ÙM™�E†®œîlÆ1Z>°á]7CzÓžANIÂ1*ê'ˆ´&·Õÿ¯ëfK RÛùš¸iuõ¯<°µ¦RÅE›ÔÁŒkŸÛÓ¸pƒ9<+}ûÝà6ßÝ;ÛaPIÔj¨NÓAÈ?=œTÒÄãk�àì[Ô÷£IJÐ*©ü‘•ìÅùš¢^]"Ç1mØT®ažœŠ-`)64Ƭy7©Â®pè�eb´ÍœCiøF^Ø…QÈõOtŒex/Ñç‚g]À˜0ã9¬ìcpØß_å¹ù³7›{§º¾{‹±s _y�Xà;×_ï4ÚÊln®¹«îZþÐÞ¬¶®É^>O“9nS­|~ëØwg{I·¼»Æ7ŽëC':½„Å*RfGÚ½m<"r™˜NA1lO«Ð¦y�`ë@P÷Y䟮%«£À6°·Þ+Cš>•×ÚêxH0�,¡&éYÏ1ŒêZaïZ×[U{›a…Í]q †ý}m©�o‹+¢U›bÖVIØfÚo“¤í;§¥Ëºì¬·È|{‘ Ù„2ÄaõFKýVóÞvr’|Nïme¼?ñž„W–Ë5ñÃ×Û¾¤eTȾ„µRC92eË.Oì63{“lã$¦á5�Úól‹&Õ?jÿtÕÝèô€8}�Õ *tª‘×e®˜ =ǽæf¸n¿gLÇaµOvξúÚÊÇ >ëÅ(û2lëߢm#A0ÛÇZÖynÂ#ƒ­Å�âË=&^fß-8F~^ DÞí¢¦²ú%KÖ Ýð“6¶}Œ{0eez³™sjn Î6êµ__â¬nf-CÊÓŠ62s$€éªb°ît¥Ûþû¸…g´Ýÿc�†4zäO™~˧³h TzA"n%ó/¨wçØ Q%Þåiwkfáqøºô¯ñk°ÇZÌ|ÆÜ�]/á Pá°Ž*×#ºdF‘¹ÈiŸ³x±Ã|¹–êÛǶ¶]MïÎ8ЇÕàÞÞk0� \\fÙO3·Ç'¾¥¾Ï?¥þ.$]è4¼Ù‰Ñ,º01”Y¼ û N�¯ºÂÈ\JØž¢�–ÂF/ R)Í�Þ‘\—º!V´b_¾@ÐPT1ºî³Æ'éÙV×ÔÇbî³d‚Áxó36¹R” P `I ­Ÿ�†ïIñm– 0&ÎpU~ÆÈÃCÃK߯°J§ñXlžúY<ìzXëÛy¥@M ¼)êu¼÷ö"é}· «Óp–ÌeÌÏ ÆÍ>ŽK�áK®q�äšÅù=[¶'\j¿Éðý»GŒÜµaÂ|=c†qd™ÔOáiŸÎV:H¨-(Ø-™õذh{Œ^3Ýç0 Ë¥3‚Îq_ZS9ÓzÐÞ>x‘ŒiënÃÒ¸€êY$yY3,½¹+ÈnHq/ù‹òJ!í³¦”´è�E·ÞBÛ  H–fjÒ±&}ßÑÛÌón)²ç_íø }ú .+'›±—òxo&È…‡®ô§BVÙd< –©­ÖBZ{çr=Û[ 5Uú¶'¼–ÒÛØÕ†@ËÞ-å)’qr—ºñ˽MêsGXï]nT�oÄrEÄfÅ»YNé8»€nmQ"݆ÅÐ=ûtÁ«…ÚìƒLapp8Ç ˜´  ù·)ücÖ÷:-™Ý-ùV<&C”x-eQ›aK‚-›Ià¬'¶ï8Ë`g‚Ú9Á@$×bG€o‰g³É¾õ3úÞÞÑÝfáæ]ш§‰<Öæ�äÈTLÛ_Yƒ\C³Ï¯½.zyzÕW!�#¡äÝŸç^µùûðÇR9åsÞ®š�4pÞà�„14{~ÁCi!€v{^Å�‡;�h4Š¥!•UTËÔƒ@Þà¯w…ÀCô}Y¥jÎ=Y‹|¤…â‹`] ör6¨}8 Y*}ñïéµ.ªLÎ ~'ï+žµ ˜À§ :»»†  áÈSú¢÷„Ñ„ö¼ÇU7ŠÑç—l ÊìAJ† �&]W:kH@.ï:h>ÖI{ta~l0ÇeQ§ˆååyÁ›îËsòtHÚ´æåùiŠ¦Ó x‚Ì¢ôNauëðjk÷HŒ0ýkîàÇ¢l;¢â½_r·á°¶ø{á'îg7ÍŸG¹ Îòr,8ky¥HùÞwî;ÊM×4ÊFyŒR$]ÜÝ [Ѻª! ßoÙÉÞO ÃÒ¢xAö÷U»ËÑ­=ÓÔ´ÁÒ„|gâ_¢÷ òب_¹ÍO�øþßX³–0ÂËZ’¼}©ùPï¶Ú·Xß¡¿Åf±h*iÙ‚¨ÏÄ »tõýIÔë ¢ãöù®2PL;ïÔ“Áí�x[Dh±x®DAÙ'@ ìNвG19K(3œâ_ë9戥஺7¯`0ùX#‰x¥Ð¶x™½ŸÖ�ïuÑxn_#3 èÓËc÷â�MÏÞçÌÆ¦'ï¶åÊÇï3™šuáº³ŠŒ,húª^â·b†Å¤IgÄh¸g©«¬z`hCÖ,©LI–LhXÇ.døj+5÷�ɦpNµ Sߺ™lg2Þß5ÑḗGôZ:à�ƒ¾n·R ÂL•«O•àï,v.Â:ÈNd:É—`Ƈ³¨„à~�œ �^<âx(h¼�œ¼†ÙƒvGáúÃröw\Lñ¢»ÑÈ ·‰ÒœPƒÞÜ(=ö¾ÁéA1`1Ãûk6 ÷©mEÀróñÕ¢µ:úÐëÛ»ª(3¢wÃãµï�OK÷Á£uŸ§×ðcij1Ý¿Y5=,O ÿ8e¾dÕ‰Ç\S¬ˆç_s2¯¶¿W‚ùÈpu|˜Éˆâÿ|ú('ȸ&{D;�Ð`%jôÎB ëÞÅw@òÝeÙM:]Âf¾Ý2Ò�ÖÞ}z3óX2<4¿™lÛ`AâH7• … Èk‰²®Ž˜�2�}tÿ;EÑŒM šÂª– dµ&چΈj¦Ê�{ÍïƒWµQ‡5»µn%ЯÎiœ-Ã1XmTÁý´±rÑo}X\ØZ £ª9­v&æ½—4 ·H†÷ˆ÷k¯fÅ‹ë§�z=f§ ‰¬±*\ –XÁQ>íÔI>Þª´ö¾|ˆœhùd)te„˜@Á�›‰÷^/ä~¬5â Š'ZVBttqªÕË…{³ç±~/N^�½ÔéÛ1ñ*졸*#†0žf,TÂÖKê*èJuÝÓ$@ÛÞ6v�y޶ß-ZãËÆ ¿{8ê©øÐëŽ2�ܹw ÁÚ-=,ÉõHPÁ™kã›Ç‘…Û·ÀÕTjŽ»6Qò®°túmä°ÚNØ€F†î˜@Ìã µ¶ -y�#7©K¶cÊžæó¦~¸Ä1lŠ4V>0-Êõ@ç‰@ôͶükûçÏ.ø)»Ìß Rqw /fîç…Ø}`\š¤J„¹—ÒZ°œÙt¨ƒ},¾€X~Š¡µ¶©gBøçÐÀ¨føÄ'““‚Ø’°gñëáÙËŬÎ5ó͆}'Ö•é| €¨Å?t1öl�›Y¸ßGƒ ž™!Z'ÇŸ©B«$&já±0f‡ÐÕÉÖVâÄô1D£›w™8~è>×ì6°Â… ±0—¹ìl0í@CûFÇŸ\À/¥1¯¦‘@¯‹*W¤T“Rùõùîr\Æ~¾QB؆c—#ò•ßI�o^°þõ¸ÿ;ÙÑBõÒÐÛ$¦!*å÷À¶¦ x’ ÜÏË×ÜFÁ]Ð Ez â!,~t†ZÂ;««BÒ›H„©uw.~õ6¡Z¦¬/ÚÑŒEoM$�r¶j ³3ü¤úSúaÔ�Ä+¾{æ]ÀU“ ;æ¡Ãë&OSÄF*ø�ãWïC[Ô~ba§röøÝTÞ¬8ediÚþ_?.3C…Ù•¢p+b*`3xÂ7á:ðOÿî¿Ë3»ð>�×c³9«n—šñÕ¬IÙ0GéÕ€wùÌÊ៎׿3»¾ÊÊÑ"ƒSëáÈyÌݶåþpP� š‡;Kl´2w®7ZÜ¿¶ëëo»f"ÈÕóbPÎöQcGÈq‚üuø–*r[öm̲Kk"ð@þ|/¾æ¯æCónv� mN–t7lùÚÈ­ØÞ&6�,Ð(!«;ßó.$Ûjs}±�(ë8 ÀæT–Ø fá—[ ¸¥Í‡"Q¼ð۳ض mx„Ú£ÆiÙݨvÉÑ_ÃÅrO:ã°o>zœÂ†UD-ÎΡùÄvlOÝgöì·Þ‘ôànÌ·Lìšýl¨QZæ �Í�£mÎð�¢sŒ!}Ë%­+#À51ÔÂèL+i<‘<Ê'Ú”è˜fÀ¹ê$¿r¶f± w¡µ/ˆ-CT8òj�ÁKÒjÎ]³Qˆ^mX]Áuo¢™µŽ$ Š“\°ð¥HI²e�”¾þpk^8·,^oØR`¹ÛSƺYiÔ0ÁŒ� Kà2’wÑLöôK?oš¿ª _{‹Üg.ŸÖ‰åÖ0ÔŽÌÏ%rœXÁÌÆ'z©²ƒé§-02©-/¯£4±6‚A#Œbw}‰}n¢ºà†tòsÆ`V{†ãIÙÜ-…fI²Ñ*©í×Ðk“¹É�ÉK*h ‚�ðàüÙm­a.àŽG×}/jSëàCXÚî{뿵vÑí<¼uˆÙ/ÕB®á²¥Uçs�PF™îüf‰§¹½¼a3jd…¦}…¶cX¹ž€¾Î{Ej îåÏR©\F;ˆfª¶ªì˜Û«jú.2P�6^Y–äˆÝ¶ês�ÓéIøÔZq).ÚÞ±¬3òoð`l}µvï©b S~Í*L%+7Õ a|ÞÌÖ×/ƒt[½÷Œ\>¿c!BNå½%[¿ZeÅ<¸Šð@]‰dXù$§9E°b­ z÷iÅZÞ°&±¬vÎf½8íÌJ.ÅRá”0Àº›g[‚ cxaËëvY-‘‰¹Mkf·k=œ”[Éç‰cÅ®àaÐ$¨^êÛ�j& /»óÕ}^2ªZ5ŒÊV:~ñ2úäád&Ó%aKw¸[@N¬•â¤=€ˆe[å�ÓD>‘ê«9×y€·ÚlzØ´ïÜŽˆÒƒ æbV^p`ûÇÊYn”J}óhQ±‚‘ò£Xµ©ýóó+”}N¼#Sׇ7ï}«ë O’^¬öœn©»[çrÙ[ä?@u_³| ÖüT½=¾…)I!V0H#*ün‹5ôž”h(8­¥Æ’Óó3=©}D…¥ŽÃòVDâ/J9§‘Åúßmí¬ß!wöõàêûpb¢J©ô&,oˆq á†Ùk?ëHA~Ë$0ä©ÂÂÖ¾¾2·4Ó’ÕK¸5´“ëB¦’Ñw1H·ê8`äî‚Ã@«©�Ÿ.ì˜L&teWF$Ú¦Åñ—š-Å 0¶°ioVSðGbD,(Xýö~J»>üjƒ¸&WÎÈQ´Ÿ>½ÄÕr£–Ư¯š´ÿ˜Žµø¶‘°eõhï]ìl¸p7�76 ¸1v¥½ŠQ8µS¡ou\åc²A'u„0bä,©X Àߥ}pxÉ�`˜¿0²tãq<ÊÐvùÁÕÏ8 ß.Ó×âèȬà›è‚Àjt, £€o›ÜÄûô«~ï�sñ"}�Ët½Jâ±#"ßÄÐÑUµ&eeÈwL¬Ô�í3_†,ƒð‹•9W޳븥|t/ß«z™¤ÕbÇgع²òÎÙ­GÇ›°¶M]T´H ²dfsËØ §ŠC.âør\Aªœ ØŠWÜÆ¸ç'%ËG² ñ×�ø6ÖŸuxÆ–ÌÙåòî ™¶òèj{ŽÇƒ¦9kÖ¹{&.ÉK7¶U"'ÇU| áÆdöz“|YìxQÜrÊâ¹]fË Ê õêöáVÏ\µA®ÆIªÜƒß¹d·sÓâ Ìë¸&.ËMú¡Y6{uÚ�ز©jÚy-WÀ<ã"öÞÃmÁêaxv"_+vðùîûëz–±n¢`A‚ X2jå¢ü¿’¼ïz›k³`ÚØ_ÓÔAWÙ µÊØ,ðwŒ¸›ä¡H¸·rÙz•\XàôVÒÈ\RÜ ò=móT˜:påÑ.&,„-™�Š#öt×9ep§`“ÊcÜ1ˆæ­â+–äCµd¶±ÑÔ[8nàž£26ãÜ.#wf½ìÐŽ‚¹Ô`ï⾚Ö]àA´Ì-6†ö ±Xæåì#Bx®µj\�‚böÀVű¦¸Ž#¹p¼Û9½˜PÕQÙ 5Ý…Ïe�ž[=š¶íø›×kp@ “¼¸®{’êhÇ݃­®fv'âÀRܪŒÜ‡Le±žÞdþ^ò´NÀ’)±åa›‘áöëÕ(]Z¸x™¹ˆ8(\LŠ@zè¬U=Û²ÖV Öl» i±æúÕÌ„$\n³e%»Å¢�ß "3—*FœP °®Wüàµ~!tk� žÜÖÇb6)Üç†JKkzÎYrï5`QÅÄ�¡�—Š0uk[€F‘¤€±ÜÝÕtf¦ÂÖ­DÎQ5ܼŽí¤ U(`¯a™Mn¤Õ¢Ï„fjRÁ"ª°\v{x<°U,½Îá“Érõàµ*_‚Ú ‹ÃùÓLžÞÄ GÓ±�t¨ÿ¸žI�ÌjÞ;''zw®é3¸¹Ч"¯bU/«Ù:]Ü›Þ ¾–j ÌQ^èÃbbËÅÏxìÉg/…^¿_�EèSiiÙBAÉI¨ár.+Â]�Y°õ¤„õÐwª¡¢|½ë«á_³ –ÆrnmÚÞ܈G^OÌ·Å[AˆîŽålR©Í)JP (>óÙ¼g},·*Þ×]¿ôí‰~¥¦f?¥ 6×,à³ãæ�³¸‹LÛ'7öJܨR¸“‹A£ÑËŽÑ–À‰ÜœF¦èÛ]‡}Wˆ§µ[RœîÍy½¼„àMª,&8Cç\0òNËñ‰õ‰¤z»81(®Í݆6Z7=cOØbºö+¢Þ)T¹à5÷"ø‡¸U.ÚØß±ï³é*·3WîòoÂÙóX 8²)&ýȶ³Lßš…¹i×fºf�Â1�ç»ç‹.`WJ˜:6ú½´Feì}4$+Ÿ‘í(UÙðšmg6ãŽT9 ¤`ÍÖûxò…¥ëØ2î +NAËã‚™9q·x/F=Ø%ó9'øACJ©ìv:ºXUëÈ{-5W‡ŸÆØ= H£M y SñkàŸ›Yìií‚)^•ÍÕ̉‚ [Ŭ—~=sà¹O1 S½ëoåw´>[MkÆŒ ÎéÂ)}d|f.ªû»„^|)ª#óúÎÚ2pHè�ò W:8ÊÎËeü‹r.Î5„¤ùb W{S´Z²­¶¸n�¯XvÕÍ|äËqåȼNV5«”.�Ec[�Yœ”€gý~ôÁ6óo±ø:€"¢”Œ>P KÒ'ÖìÏZß ¬zn¾FÛ°hq $% Íš)|¯{\ß�±”Õ²é`úE‚2nq”½”-QÒ->D2³¥�I"«ToXãÁ„Åhcü$ú;©34éc4¬"sùŠÚû‘²,¾N®Þ!¬63âIÈ™¹ð!—–|Áhu)~'Ú¿\>w'�¬Ë(hr¡�Ýq‰´�¸Á¾gT›Ò<]ää-Ÿ8`ôDyrŒÏÄ6Ù;97Æ•Cí–n‡M¡Ã…¢ÕùÄõÂÉö�Þ´Xãmu#r?Ô‚¾ â£h/2í@OÚÃ[#ä½YàV>kžÊ¿–× @ñ£ùËPÈïõÉÚƒU«r½=zIKé¹Êýó4lwl·Q“},& t@÷ÉÉl¡7ò­Ã•ñ§å ×^﯋¬•÷Û3’ÍížjCé0³M�º…ãïOÀ�Ÿ òÅq’·®Aˆ4£.†8”'€L„ÚJÉï¯g�u®È\¬ÃÙ´]­qÒÔ.:Ùù=Œ ´#Á¬—q5µ ïöÿI²WJù?"’³›fÖ•ß¶ur±w²²ð6om JÚnîÖ=³‚Èz(ЋH—qÒmÇj²+§cÛjZ+§kÚVéð“âÄ>ùS–'ôž@1Œ»p°Ã™VÙ Pã©×â—=¹éìß?=NJLj#×·�^ï}ÀË{O­^¹išâó•ÐÈA)Uôk:$Û0 HÕSúhE@-:Û7üÑ&ç¼_ϱ@ NV.‘œúú`¡}ÎPE³?.^gè¦Ë~|ÀÓ`ÇuXNwDvG�ˆ�ÝRr�e Ñôbâ­)”d*Ç ãmB��÷“•lG°ðº�÷±×_³ìBHàÀ\½À`sÁçÝ=âyÏyA7ßå)º°Bµ4¡„~å.ÝËb| ‘Æ ¾";#réáÁјƭ®iÌ-ÚamÖî…Žëwa‡Aî^wЬÄ7C†#[‹Ec:ãìs€ËÙ¤)¿vm(ñ—¾]m¹âŽ¥¹¿½ñÿ€Ä÷ 5×Yš0 Gç»öwíøm÷9óßÌW7³Ÿb1ZÇ_[W¯�<ªF';ø£›ò�Bå½ 8¼ê‡¡¥y‰ú…ü«³lwaƒ”5 ±HNàÁuÉ~ê„ñAqz(Œ›IôÆìa¼¥ïZx½%k[D1¿'ŠBLxß5éû6׋e¼5Ή&@tzJÝCõ{µ6.Íë–<ñ¶z¶YÊ€rC ¦pœ©°–eÌ7Ë|¸z|÷y{Ô {Á`™�U0ƒm.÷'#ËÝ@²UQÖ,(Sï�Î/w çHyß®vâ’ûºm{ä¨Ú}\m7Ÿ–¿‹óæãŽQ™Qx#}Qt™Ð÷gùf‘yÎ\ˆ›x3·�pI ¦Ç™žÖq»éguRg@É=�‡ÌNôÓºŸ 1«A—Æ@/`Št Ûû2v|õtK·Ä–-áÒ2õ#¨e£™šo=_9]ùòú±Û›F½ý€rŸt÷6@�Z1ªÑVÔVÙÁ�v§»¯¥áy4ÃR ݃Ȫ5g°I(–BëÀ°5£§íÿ6Æ?nþNg¯n‚UÎï�úÕ~¿d‡°Ì¥ îw; jÒ�E ïOØT­æb@ô”вû�јx@,{3Æ;‹r'náór¶‡¾8®Kyƒ¦¦ûÝÄÈœVKX6b ‰‘QS§É´L1Î2!@jRNj‚�À ܽ–”‰{Ó•w“«�±î0–åì‡VÂå8΢ãixÐýN_åHÁу©Ï&'ÚÁÕ——³Þ\öûqä_eg‚è·–‡ tAà3¤_Û²Õ‹óHØÀxV0n”X`³Y`ÞKØGÕ'Žþúõö€‡0 …ý!WùÐ)íÕ*Q³¸à¹;û;(ö¨ñA!Ûålq™?-‹ƒÉ ]þWÒ¹ 08X &Òù?Ñhf Kk1‘Y¢ÌÑz«¦,_Yïâ7°%bHʇ6™ŒÃ”ó ,Ö_®BÚÝYæt@—“ ³cd7ö4û[î±.è`(Çj­h.‡ýM�¬H?¢´ö}$1ÂÎû¦ù$tÔ0¦×ºáÖ5iÌó×¾7}élTy>_œQ®Añû ÁÚuÇNdD$w|¼‡BÔ\Õ ØäNíù/ߺ4fÏE«Ñ‘m,K†dœ›¼Rlƒ&q;žß­‡P;s!ts]·BŠè�-5‡æÆ¨ ï‚|Ò,½>Ú G 5>U»èö© r¢…LkМÂaõJԥάC:Ieo³•«­\°ÔÕ2ýs8þЀ‰¹Vë©ÑcwHFÊ’*‡ßÛåHÈìN”ìᦀ‡¸[ø¶ìÞ²u»6ÿnÍ,¡M[ÿ,´ÂY¬ã›`ptêØ²ÿ…Öþ¢Ãˆ†ƒ³ý§þ±:o\XZ´òV¿¥ÂÏhŽy!Áâà*—¶íí³–^†— „i}Õx\ã^Þ9–`Õ´9¡«Dæ+2ÊlO˜FгàAþüGíŽþ1°¿Zj€�S‚¸3oËÆ(»! Ï~®Ùªœ q7®a*,±{D”È™Ûî-Ñg~ôès3cÕiú{‘ÁH7Û76ÕØñ-µøk2§�ä–âñzGÔ0¨OŽ €õí½à;â‘ ‡ÇàtëÖaÅ=wQ ¸¶¡ÑðþA›ƒ¨ÅÃÈ¿’Ûkµ—’·ïo½çQ§…šÙEZrDðŽbYäÛn¹5ÍÛ/‡Ã‡ –9ªÅB±ßOý×áEäY"ÂaS}Nðü£vMC.Tã—d¶ê°°à:k³‹�Ø#¶‘ÞÎÑÒ%ilÍù:t$îž{ß¹ŸC‡º¹é‹¯|G2QºPnÁQdèHteÂm[*Ö†ˆOžAZ8mì%J›Ö“£¬0{'£( Öž>ªâgÕA~´‰@¾3`·íR„Üdm»SJ ,ý­¶WbÆ!�–�r ÍVÊFH´ øÏ®¯ùý{;s×§ ÆjxŒÏ&ñ�-Õ .Ûâa1…M¶À-ì¿Ùk�q•�é)"gopIÒܬ%›5+ãMÎK8i¸z\æ0RaÂ<‹Eâú#óI(®~·lV Â$6ƒï}½“}J¤o Ùý¶]Úù>Lžøå lÆþø~ðµ”J¿W¨ÌU̓ánËä=ê z¬HX3"kW®hÁCs—Ös¿�²§`½Ky=¶yçs"«§ ÅÑM/f ¬´ê+ÿèy·}|Y(ÇSl;w=ÈœX˜5“ôM‚§ué OaUu›%V˜±¢FÌ(¦‰²ï®ÿXÎÜ^™ ~ì—{±Ò.'̘éXø»™e5èiHi`êqxÆ¿œ³êņ2wìäþ»ô¶ ÔYº]÷N®y H™ÝO,ú5¾±…¯3®I†ƒ¥ÆVB‘� ‰8£<+w»ÉV5ú!ìC¼&-ðÕ—×Þ©0Ř÷N«h‘ÄÐ{Ý×XÈd, &/°êµê(‘Äæô  ®*B^ 9ñ˜-Z;|-ÇJéѧòÐ^S%Ð¥ÈÀ„pÒ4/÷݃³}ÕÒt´åm ðvnÄÞàð‹¿’fʸ±àÃVa³;B.QS‹olŠebäúqª£#»~]ö0}_.«GÆžê(^�Ø.ÒÖkZÉaƹi1ÀÁY±C¼Éxö™ÜßlùÌÙUœrDɨ.)R!ðæ·feX30óWo�ÔÆìÔ˜ìÖ7b䆯¡ úõRÈ—ZRºZÕyg­ªÈ,Ë?à#˜¥Â„%oﳤ+òT3Ü[‹Ÿ·¿Ÿ´O:Ýë#ÖŠÕý›“ASw¥[¯L¤,h;<4cA£&”`@rLÃ0�^×Á‘vTF”+�N­8U^œõݯáD Œš}T3vôØàâÜÉÇ‚Ñ »”PdÌø2gŠÌDþηŒ/+ÔS¯“ñu?3UÒ Óï�óß³KƒªØÎ)s�CyŠÍLk™,¿ÕÞvî~ÄêzࣗÚPé7’à ›ä)V¶ú»´üXnŸ®ùùäms¡W[xSÍú Å(ÑÙUvFé…Qä.í§ž\ú�Ÿf`$c­l�§×ì%ØèÆ K}µ×ˆuw-r^Ëx�Š×­nnðÚºý}]'5¹7oÄ_p½¹¤}ªø¹Dê˜R*95û’tšäNN=Â6Îeë•Ù+#¬œÏÛYyúaÒð$ÈåÞ8ÆTGÝ™ &ˆ7|Cšéa�qì TÞÒùÄñAïArä`z^pê­—lã×öîw¶Ä‚—%»‡ µì/õÁ�­â è~úРžì_Ø`(P ƒ÷¸[�9k\ÖqÖâ§æ�mÚÚIìM�ƒ†Ò*Ž<†'ÒLB0ð7摯VNL# ΕäDѸÖÝs!fÜQæD�öïÖÆ¸+‡ôûŒ¢ë«„m´»õõ']ÀF¦Œ{Øyˆ»ç oN€S„Pòêœ!l�:JÆo‚1î·ë„c‡�_Z4XÈl:^HDY´ºõvò-Xpuˆ¹þ™u@óÕ.à5A€¢ ¸4Ð[üæG?cY�—Ù…¼ý½˜3éË ï³õH�#}9Ûwïkp]÷§ï\so|çnW~ÂÓó>œ� ó#lxܱ¼×ÂÌ©üñ»p9›Lü²û¿öjyí…/hK˜¶-�;D’V ŒŸB[Y·kˆ<·‘r¿ÉIòúïðd”»Æà q9:Î]žÙ}Œü·b¿¬ùù—ƒùù�\_<î5çÏ-ô(w“vú¥ªß›†Um2Y·ì/² ¤›p¶Òã ®DQÝRo˜Mqä»—Ù©à__·­‚N$­iXP÷Ç™“ÛK‹X“öl&[z~ß½4%‘œ•‰�¥¯}ª“¹¤ÇP­Ûoó¶~g¼3üÉW Uö èÐèþ5M…÷rÙcñ¾½ñ/�”öy|s+ͤ6vò˜dwõ[7hij …ûºO¹B/Ú”QßÀ©|ÛÂ�ôè-™€˜&Ki¸‚ÓùøxkX8"Âáh¾‡POë g÷šÉ³™v ú/5a»°‡ >´ )ûEi�À‡âß%½˜˜ÌÅÏí˜ng8›~'@£·Qp;Ž?suÓëÖ˜ Î`’>'·Ó±��í±!“Äer<}gá}…ÆCN³éцHvYz[Cè]–€¢.’ã6éÖo�ËѦ›³ònÀÖ÷/¢ˆî˱3ZTõ7r†\-¹“g9BDÂ%'¹³Fy}í‚Ân·ÔŽ>³q„VM,�¯Y…½QеC±x4Xñ׫§9 GØ:šÚ˜åé_ºBƒÆº¡`õž ƒòºm‘|Ú7¬î-U¢¦T°?t´‚KX›÷v;È•À×7`ÀAâ›vφO×r‘g”P¢�íÔ³{,[fýâb$+´ãÂî"x×WÃm­né2H‡&Õ¸BøŸ"µ—2¼©öYs.}1m]—\×'Åc�ª~Ÿë$µnå]AζD*{X Îùœ)¹e–høJ5ÀU¸ûŸuC bmì‘|ÂÃtoP>¶Í|5³²’Ø\,¦ö‚kubÂ=e.8XU™»Hœ°Qï;­ëì{�)›ÂØÓaò8ôÿž{ÒÈßy¶½½uˆ Ìýèõ¥ûÊ>جዠsÇÒ Ž}¾âQrÖ¢„FhÈ{£Ý±^ªNG\$nÙ>lTIô;*'�1‚y·‚¿ÂKƒ,u0è&Á&RÍ®– û85U!$"†—@ŒQÒ©Q ÆC<|9ÚmrJÏÈúÀh‰Ð›¼ì÷Šs”4Åx‘›j팠~Ÿ�=‰:ɉ²o²è3ó ³�ùv÷ž¡g`E`mìïÕ‚“?sŠxòµsà ‘Ùêï-Ä¿ÈeÆVñ–±žVÚïÚB@„5C÷V>ºÆ¯‰p–£uêù+²&î·Ü.9Ëo¡*‹ ¹‘¸6l~*EƧ�a7Œ-«‚¼¶CIÛãö¯�Ù\�Ì¿�¥Î0]lC†Ž ¬/ Esª ÷ò,-*EÌP�d¿smöÌ%�C™É[âŒ÷¸ât7R­ò-£YR˜�siëz»ÐZW; ,Çbq`—�©Óªè“V¥¿8D‹Œ¥@wk/Saïõì8䆗"*ä9W èy¹v®‹”Lî²ú:m ŠX#G׿¦Âœ‘(FŠÖv´¡óIÅ=âxí·Ml–>ù€òÁ[‰þ¸Ø¨ ŽîYi¬Ÿ�Ǿ¨Æ¥"6ù«D²á>/+ŒÐ.“é5ƲU�ËÝǺt*Å�Û5¶{²Æ�Ž ™…J��K±ó™›ìÁÉ:³t¢ G¸þÍÍ3;Á hbàÞ´…¢ãp Á�ó»à–3°ÛŽƒ— }¹°gë˜r ¾åa‘–û;êOÇaß(*4�*å¬ÓƒYÝg{`³‚.µC’KV‰/ +’Ç�M@4P'œä?)`"£66l,Tu­Ú®’¨éÓ‚—iV42Ï�Bâ¹X ͦkú{Ÿñ¿´ùú}Ê¿ÚÛf¥9÷¡jØ Éì©t¿˜wWeÆßlyÓMö m4íA#µ|Bßu#/¯ÚÓ<ŽŸ6KsÃ�À½»‚î†ÎÅ¥­€ Þ‚R¶Ÿ§åRÔ„`OsNâ1.ð®™ç–Á ke|ºûèò\^�Û°{ qèÕš¼íž8æ¸fµæÃõS@¶Í0i>$4›þw¯Ë®œéñÙ< ÓÝÓvœ¯s=�úÈ5CèëÅÇl¾¦²£QÆÎR}9ÌQ5•‡w«Þ+rëÜ¡rdé€iˆz™¸häñÛM;ƒiÙ ²ñ¸ÃDðLC'ñ¡e7W§ÐÕèLÙ†°æ7Ý_R}™Ó¹y»X�0c;Æoa^;\xâpÜwär@7¤0ZÎÑïvA)YB�‰®A{î˜Í@®iç�ÍŽÔU„í�ö,Â%¥wèB�½ØŽW6qܬÙýŽF9¶ª°‡° ~Ék23šZ(C#0éT�8ñí¾œM/-µÌZÇisåes]^Ö<6íuåUž[m9pÀRìX`A42“Ë”T%fW6|¸Ù—‰¼bö¸Ødœ×u~O 7iØËm­’RÓŠ2S±}‹"Â_Š~½&—Pî:«�Ø|8êø_ƪ«�TVy2º/O@›  ¡R™õÎÈÆP$z÷®à, ]DŒ!]M@G”³ñTe íõ!¤ R Øuás£óqGëü†ô…¯Ìã(;ÙO>]EòÿÖÀ¬ÿEú]dµ­qÅÚA/6pá,gy‡Y�Ĥ2ý˜½¹­A!´fó/n©·‘Xcfm Á}¯v-ßA‡È]ΊõvÝñ‚'—`[ö~üæFÈÉENÛN ær–¶û'¾¸Ýu}ÓÛlìê¦Ad>?;FáZýâ|ó1ºÍI¯¥ ó™Z{J c‹Ûá?·¢Z]cϼÇxC‰»±ÜÓšÐ.ûKäT×* âY®®«°†;XØïº�f³ª¡Ž½Å>ô»Œ­êÀƒÅ�¼x�Sbã›2+‹�yM aqtËâ³ë�uñšvà§Ë±èI�n§Þ�‚‡"Ö ::ž”ÐÛt€�¬ñÚ×s�ëf•kMŽI†ºH{Ó_È9‘Œ$¬ N°J%¶Ð»*‘0ÞŸ>ÏGíkºÛk(Tnˆ¡ÅTSeüYŠà�‚èÔíŸûATNÒàö@úòjjµ"Ãä«gPàÖ'ìiö“­[;n^RXühÿkÖlæ§ãâZÃŒY˜Hú õë> –Æ…ë�CÖÀÛ›ŸªÎ€§åÞÛú·<Ö¾WwLb>�³`˜$Çër”™�…sÁoNðÆz\`žëŒ/g>�éOx‘Ó~‚^”‹@3‹Iu@^+͵ÕÓF}rÇSµ(G›4Ÿ¢Ý§ò›-‡fû¤ÚŽÁò@ }”&ñÐÆ+cð­]¦Èi˜såôPƒbÜFu3…‚áÓÏž½¬ä¥ô ˆu Ab 2hÞÍ®ò«[×v8ÉîÑ7Ã¥˜Œ Ô]U¯xtBŸw ÏÞÖ‘x<‹}ÊæY&>_¤o«ž‹Ïsô%ü¥ ö_mjÐ µ¯¹�1ä+ÐÃÄíòt'Ö ðsjð"Ž÷¹ä¡ë1*ÐOeêã�/€oIkN2žE©q»N ;¨;Ýb§Qn]¥¶ö¥)�1D¹:¥xC>�(R?„0}a»¶ºnê¬:ÍU ÎSª_À#‚ßGFYÜÛ%ö ¬Ò7ˆ© oH�…DÂŽ37þaÙʾ1î�•E¯=«IÊŽóib~ç5w‹áØ ‚Lh·­Ó^é1b³vò†˜†�mKÎYÝØãÖvJk¦ñ¨6à‰Ú<+¾%^Ïæ|…ÛCÖ¿D<Ó�€pï7!A¤]b5;ºÛó>áûk/ÝUuª™�1‰sL¸öm“FÛöÞÀ@qxíÆ¶Þ½Œ¤@âðʶŠ\ ójµ�÷(‹c��Ù™[½–Zë{_[òn7»�0±±ï/mŸ�½í‚á¥ÜIm²íˆáÍŸmf¸©…j,�Ûé=E�²;«ã]Ê Þ'£%Â]¾/=k(»@�¾ðtÓd’p,ÛÞ„ŽG[}BÇ\vÍb9ümgì×–hú†ÿ<# ·ó^¡?½ýÄ@u[MÇù¦bÛ úØ`&÷6`:o[È@¾Á‡U`H‡êrµæÐ>Í=¥Gœ‡ŠyèŒÇ€úÕS0GSÕ”Ö,Þpåß‹­îÉÅ, Ÿ2Ô\ÿ*ϸ9òLš_&C c=5¹C‡ºE³ì=f+»`|Û,MZX*ú&ks’ςج�±oŒ¢,TóM”aÂ`­?¸Y 1¡.3íÄŠ79 >)G t˜[Õñ* ;~ ùyû†}Pç6’)¢„ÛG=½«œ& Í…Œ’tb®.ã†ñÑÒ _|ÊB~bÊñª�ºrøœªá²—–³-Ü퉆¦OðÑlŸV ÉÂTZ£ÿ¬’/¢Åæ;H¸ŒFmúÔÞù®P�De³b6Ó\:±ÏÎÕ…áË X7ö®¹i«wDAæ Ó_/’Ûç�äî`¢0vt´ ŠÍÜ2ßëîÀF~Æêßã*ªîù‹m”;¦ P}™ü)ðXœ¦_ »okq‚ ¢5ôØ{fl„Ø½ÒæÃ¦V@6-à6¯ŸÓÎæd9¯,ˆÖl½6øâLû¯]™™3�|B%…±~_Ð|ýòiøüš Méâ¸MApëüIÚÂÍ@�ð´) >³ ¾¯¡ãÝSà³b·(ÍÚhì,'Êm}¡Q~øõ¥¦±lµwú]þãM8Jš˜ÉP‚|%XÆX�/!’ªÄ²ÒO_l;[\ŽmÑ\Úra±óŸô+Xk$u‰º]ÃΠaµ¯'ÂüË�ˆw�iônöb≤àóËï->;©W4œu˜k[cœÍØQ5%z Ù¤*>Ã¥»�÷¸‘DÖg;b° ÓuÔx¸�ä4úÚóx î„AgºžSõÌAÃŽû,—w½ÂDôùekâä7+�&fûË¥Uü[zRŒYŠË�¬ŠÙ”d+àÌt`{WÎ`!Ÿ¹'�†¼¶BgÁhÉ­û[öÒ½2è$’žérW63 ö�4dSÇ&ÎO®#<0æ!D3�ŠÕ!è^ïR‹ÉC¢Á¶¶R‹mO*ÞÎÞöCt%$¸áÖ]²=èWU«–÷#qrЋœQw: ó%³i‚†'W•B_>×gáí“—Nãî»9dUSƒ{ÚÙ©š?8ýÍ-™­?.`3‡ñ›¾÷®»¿›!�ߘìû½3­‡êåè^$Å“Õ`ÝW&Ö©oG–¼Â‰ª½êDqÊúˆÛ…a m™Ø·CôkAƒíÈd,\E˧ˊèÎY´©Ñ¿¸Ñмe3Ëæ…Ïö ˆç3H”ü •VÅáѤMb”· %#¯ØÕ^Ø#]®GJéåòc€Uò/óÄ“(òTÏkïÀtÍ�ÄJ¯ŽÀ’`ó‰7¼ß ®:0*wæ!ñ“lƒöžNûg Þ¬åŽVñ㬒]‡…UŽi>å•Fgà×Ïx”˜¾ÅtéÛ× ø3·a‡ε«{"G«?CX³Ü`ŒgsnQÝ$˜eöö“0»’ÞN{aÇ¡ñ|S…’40Nõ› ª­­õŠ—cP�ùævkŒÑ¹2¾éÀ̓d·#ãêFRÐ Œd¸€ Ã|AUwzi¿²ŠìÕdÀk\;ûÏ Pž4ㄯ`Úÿ[œÖBDåó×€ß]Z#f•r°1Ò+dkÃëfØ l&Š˜"Mžf#as% ,u2mf�ØìÞ=àîvÞCy¼X, – ¸Þ°¯ñÝËAsºMÕð–àFË™“à`kh�ûõQâGºx·5fåå£{òÈ:e*ç!¨áÝvØÀ¶®6@ËâÞlyyª|ô®ƒ†À¬«}é„€E,Û³ûF#¼½w›˜:ˆOJY°É¿n©ö <[3¸<Á²FZªW^s2bVÞ›¶­˜Ñ(a‚.µ K…»µŸ >·¬5iU¶_ÒÇ!t‘³q¸U�Û&»›ì/á²RþÝ—~N×ÀgÀòLLM Ýú¶9Ëy~)Ú"[äÞÁÏí’YGx’ËÖÒÕØÏÄŒd—ÅËîj¶»;B=©{F]-Û†›¹ìâd6¡�¶’ýŸp@ó{ óB°8T`}K.ö§–1Rk‘7:Ú²l¿^»íc‡R–�d©p/íú}Ë] ý±FûoÑðga|ý_96+Üüò<[¯R¨ä´.·¿<:}Êt*•zù‹ßzÒT݇®Cç¬t5Å}‚:xq–x×Ë¥ÁŽçt>}– Þs¤ž;d¯“ÒÑ£W¶…±ª$=`ÐC h~Ÿ"ÁíDæx™ì)Qû©¡ð¢~Ì»ëÓµ›!Y•µõ�7®Js›¢´2´†¶ÕƒOgËbïµ�‹2n…­zbFθ Šp�x¬`1Ú0ÇÊf6ß@Ë‘£ ÎÆyÜ�ü¯m†SËÑ­×5e¡ÏɾôÚðVJÎ{@/SUæe­†·)si?3t#%WE­^äÕo Ê®ñ,ƒlÍ”|*a³ƒ&-ä6ï{Ï/~öcgÝñˆ-ƒN{ŸmJó�ÚÜŽÛ+¥~ *Âm�Þ|þ«.þu˜»Ö ýäméƒYIîB¬Y¹û»ÎFy·�0w†µ|<¦~à¿SNfç›éæw­NzÙC%` ¿ úkU"û°QÃlã?…ÄAéKç²+ŽÝ®•dÃdŒË›@w–«çu2ûhJÜá¦Ò€ïbrI�árs\˜…Ç#SzÓ[7˜Ú‚Uéö˜¬!^"ÿ¹ ?ž0„8¨7ɽϷ²|Va',Ö¬”àÙáÝ[i³}ƒý-ÈNåGVUn#¶>>À¶êävOjNoù×xÇÌû ÓyÉïÅx½Á¥±‹ût͵ ÙÆ}†¸Ç².�Ó?Ë_ � ëÏ?u]óWŒ`Ÿ%Ér- b¿¼ÊºDdÔ |ëDZ sÇÖQn'Ãn ±írá{ß|è¤BB … AŽ�¹0nu¼.”ÓΰfØïOSëÞƒ1¢ñhpo¾${c=´Ö ïSͦPD¯3…ì¸Jx_²8G(ó�×ÑaŽßGzâ¥ßwŠÃ¯á®ù§8Ð{6´(1Š[{cwK­^—Vs "ø~2VüA û‹éÔaD@GϩիDkRûÃhªé_ÞÜkkUo=®¼/˜~Ù^%EÈU°:sV”´$uì¹¼Û\yž§”YWŒ•ªSßÜvÒ8ºÊÐøÛÒ³é�¬oA ¿´ùì¶òœcêìs1–ñÑ<‹š¯kÎøIŒ|¿Ý5Û•¥Ò/b"Ê- ô\ª�5\©Tç+«oV6á�*kî²'5 ‡ª)#ñMŽS©Drz?,9RƆtü§­…��aYÕØËÚջʆ}my©ŽLF�edÉD #“NPâ÷:ÙÛ­Oa Ë„^Ê™±ÁÜ7å}Í;’Þn�8hõ¿\d°1À'¥¡õ¹†Îønye>ɶ‚ÿ–rŠéjKZñ9—Ä•è(_<ͬ¾3m†ußÔyUQÖyÅp‚¢<Ï,¬í°õ8>m~[°1ÛôKA†>úÙÃç^M«ÓZJñÕãR–¬÷qF˜€Ëo €Ö±¶0mø¦’/O qŽÚâÚ³›™†(uñ…]®“’²£üYœè;ÚÛÎ"÷n‹nê‰ ƒ _?"øCÀ9šÈå4à—ô×Û†Û5ñØ‹\#5���Zü[Œ¥ü6Œ‡L` —`JÁZáSê‹…½g!»½%Ø7œ{xSÂs|®zŸDÚ«d]¸æîã¡´àþéÖßS¾£é– ªèÈ{*Áy>XµŒÃR•ë#c¾ÃY±ö�U¶Ž >+‚ZÍœ…�JES‚š€\ú¸ì�-'!œ,®‹÷#øž�bã÷Ù·ú7óúm·ã@aB ì|ü—Ù™3/ȺÑßÿàèå²¼>éÃ䎢ŠÿjñòôÅÎ�Ãî9ÛÈ�ˆ£ ?i7+(ÊTÚÍð_¹çÎ.8ï6âg¸æý}à5�øôžȨ +N|ŒcÕ£Ð|Ä·TX‰ ^¢ï�lïÊ`…¬¸K k<&q"bàáö¼Ýïµâ‚{m‚Vù‘làaÚºÙ%FC£R¬ ÷Ü'e�~Ãiz5~Ö»ˆVÔB¤²R×qúÜœDzò{x¾ßÜ”!â™ .¦¿Br7ÍêY¨*jÿ sßh1~Í`…{”$rͼ«aÜ~;�¥ï_+¥æ¸§ x²†.¯&cÑ Íœ¨1zw¦¯Ù¹��Âh5®j"]VK.„Çr^:š¨5¬z<ìøB–b³¡�64þ¤ËȨJ.]Æv<ÜŒ³¹ðrEóa4ε}¢×\ ¶þ™ÌØ7¿|[3÷äOY3¯|È>ö‹úͺ:KÈÎã4—Š_�XoæÅÆ¡!-Q;F>j°ñ sÛävór}kÝÃ@ã0÷Ns5³®&|^½­ ¸¸Yz+¢z×¾sÎY·ú‰¬d¸#³Ï”�ïX%<_s×µÎÔ­8³ÍA.½lMñp.F�œn¦ Ì7åpÃk;¥„¬ ê„»â¦ýÛƒg³k,��nXrÆé$>è“„~ð÷׺™:Œ<ªXLXDaš™¦\¡¡fh%JêN“„ç›ÞSáÆ~Çwú�ªŸc"ã3ýé÷0çÚ@GpÚ>ϹRXèųZžD–¤„']�þÏ ²E5s«xýŸ· ’jØ·ß&{¹! ZÃÉ™¥­)»AÞÄfNö º>ƒU­b­haÃfžÛYÏ„54³I»ÇÝãõb—œâ|øœ/’öd›EýÂVvÅ ƒ¾»ä/SM586¾×9Ü–‹—ÕµØã±†ÅçY"YÌb3[¬Z!£Ã¡Ã£J¢¢î =%°%ó8_1LªfsÆ â§£HÐ0Våóv¿F9̺ÅE|¯1%"Úä‡JÓãmjžá Ûæ #ã(îî5—,ï�ôr.3˜a!é/2[ij1 2úëëç�ûŸŒ9Û·6>ã™8ØzëŒÂQ2žý!“BYÃz,�r÷»%}n•䧦_‹—_W hšúC\t+‰UUJ_¶.yÈR‹£�‚[àŽz‰¶nÕ`ZØ�B³—ILK;t×½Åc©U…9Î8zŸ»7�}zúÛ®t•ƒÕ n|…m�„ópTÝ”î5—bƒ°öÒۛ߸—jYBãdéÅFÒ $4 ·`ÅöôÐ%lðö6úÕõÚ‰ÆèW¸ÓÙVˆ‡ÊBW}ºæ±ÇiÈîlªÔ+>PéMX‡'ÀdŸR_¬ ã5iOm1xN¢l‚`ð¼ši€\·¬l] Žrt¨5]·-W+ô)wšX¶7dõí¿mÊÓ½²ÒÐ3©6â™yÂ,è•&’{�{ê .21ßTMr&ÕÞ®Ø4 9Ôìí´ »ëm’Î9\�ÞúýôOy)P=ÑkÜ‚°S… çYh·YùV¡“̆8$×1< åžl™†sï�;|q$£,½ë!j÷æ6[Ëo¾•áèIn‹– éþ¬„r·h¿GÈ’×î*ì߀ D8'›3ŽÔm„¼ù“¯Üá½³À>à¡”õí÷ZØ` A­"•»ÈÑU7!®Gz`ù¤Bµ—ÁŸŠ4¸lz¨b+{XrÚ£Y²Â¸‰ÌË–�oNîùÄ�J.Óæ¼ÆÄ)€PètíÀ>%�¬ê6ù÷ï½Éð74È;ƒ²pvÖ E^~ÆS¬ Ë+A’îèók°¾Ås7ûâ!â}åAû…ÛÔöü¹­€ãïrŒ»Á¦èUS>#wὉI«§«Ý7hº&µi¦ÍZ߳ƫŒhïß¹ ‹Ñ£�£ø »zO p0–Ââï? ž»ßu…u˜^~®.§qÚúG¿7s�$•°i â‘•Ô*ÄûÓ±¥€¥zÚ…Õ™Û“tñ×=vƒñÙË9[¯x8IÑ”î²üÆ1 ìÝJ‘G(]¸aM9S7d uú1&‚¡�R³ð#–\A`-œEÈwy¼Ù—‘ŒÁÞX+Óï�u-ËZülµ³­8Húƒ1W2ƾZX|‚Ly{›çÀĺ*Ùòe{´0×$=Swº Œx…Xøtö©$¾sb–}ï­£ýïœ8\§ÎzGü�VmßMÌ|”kwå­a­Óì9÷½³ U´¦ )F†BO ÆÃ¥jðIáÓ<}9{îlq&wdeì�Lïp–º×ÉA^bª ‹›ñä@¢»ëwyó<-î¾lDÄÚ­×ò"o1§«Û$¹'u¸…˜%s„^úQJ1cÉ9N´”ê‚ü44<ûY››+šA^ s�¸(zmƒúf(Qiã…ù½<äÍÙ°˜­ß€²qwsdA,�ǹ÷–s“0SÆérn9й§�&¢ê.�TI5SëáòÂç“h” xäAþwOV¸¬CÎ…ò\�TÓ€¢/K¥OhÍó^ÍNb~=kÝËñÃ"/TgÁ º÷ãß­ -›´²@KTøøÍ‡ê4ãëä«fÎiêâéõÓÔ�ŠÀÖYªFã^­«” ’ÉÕ¶ãrÕï’j<1ÚbS„÷HCZ†° !ƒ8ÔÔkœ³ß í5ˆH§ëmz½¬m¾Ëaùª–áð›hI|[: úN¢Ùÿ=àG/Ù|ŸáïѮ߫¾†˜öViíöÙï(í�…‹0‹€q!=vÒÌØ÷úé~ÛÜ/= Æ‘yYî¶Þ¹|ÚÓʸwJ¹ù©»Œv0¯Ó+ч.ùû8….9múè{Óh>nó×ú@Ê;2 ¹Á�á#ã¸-‡¤ÒÎ/Ù´Ã�Y(*0ÖÐë³™Š 2þ�»Y?€R”§´¥((3Vjú÷#ƒRßyAá ÿñ_4f!Œ¶ …É~\PAÙáP?%žé²yÿJ>ÿõÿóõßιQú ²ÿEM-®aîdÇÃ>(Pyý�?¨”þA'¿’ŸìÉÒ¾?ÿ¤tGpÑ…Ãk—ì?±Æ2í±h¸.s+˜Ì4±)Ÿ\ת«-4<á JÀ€¿�(P7wï ¡Æ~ èäè~Ôªf‹g.æçÔ_<â‹£ù^ ,Ò{³ Ó>f¾#€i³K.ž�ß6ñ»+‚›‰Ñ!h�äJ(äÚÚ-#¥ÎV`N!ÅØ_–wÉ,˜¤äÝJ/ Xîõš:šâ‘kfÈñ.8«Ü´Ì'Âå� þhŽ·‹¬Ž²KîxID!WŽ”) ï-ÄéëíÔn°#?©0m-úö ðÈuË«.Ò0Šôø¬^¹þìÏpmûÈ%³öyëo÷>Ìõý@Ÿ÷R€ £þùÿ{¼‰‡è ¿gZU3^;ûáˆÓ9ª¬d Œˆ¢ã? Äéݾr¡x ˜!±ƒTT·�7à »„2Æða ž‰1QÿÔüæ7k­*]”µó6‰¿�Z“`ST™EnŸbp±3ň‹(Éá+®u­£ž^mÖóÞ÷@ ÙŽäÓÂDÀê¼Î –3CÎì„N—j¸£bß ._L<Øc$ ÿê¹ÊÝìc’P&Ô¹-à Фö)Ðñ–�x±˜d‡2�»„›D†’ç' #Þ *— -Ç$­¥Â²sâ÷pèxtü¶]Wȳ²6`.�£m¦ð)½ëˆ0¿óFµTÖ÷ˆ�öÒ×ü¹É0ç~~ìÇ{µyu]mð»Ð{sâ,yËMùk¯9¾6?ôt¼…“-á6‹¢s„íŠJ ¬� ¸KáMhGÜ@ä§Òs™Þ®�U{ŽÿùÄRðŸŒfÞéVՎǼ'ù q JÕ¡p�n80& º@–^dvdFŽdà'~X†÷ÔœÐŬ�þGŒ1™S­W†d@Nùv+çg5dGöÔQÍ�RåmÁ½¬ar?—hù°Q¤4Ä3¢¦³“{¯ýkzÐÊÅ]_Þëk¼þÈóϽFâbeíý?�ù�±Ü73ã}   …*ÛC»ó£†Ï,;bÙ•ÁÔ'ÒÙ0a(Õû€>oÞÔ„\@KQÆÏüæ2á¦:n\>ïU-vÎçàÖC· ,ÿÈíдÏçžuc`,Ϝـö)îbÑnౌ:^XgzyvÎOýeu×c»g�à û#¬mQG¯oˆüõ5¤Úë¿àÈþ°Ìù×±nÅqwwލBç8'[ Ï�ÁN61Ÿ�sø�ʆµ4¹q’nàæÅŠãm« ¨�#%@5vãD«ÄäƒæT^MZ&¯h“ç›…3]Ü`ÓUÁ®¢ï¾§.XDƒO·m]ôG®EͲ>ˆ~9–—«BÈ'Œ½Òt*Ÿá]±¸ÚX ,´ß·êH�¨=Ù‹6vëdßii�Lá’Áà7)O&Iþ@,-°‚“L1[5mÚ �dÔ‰”º¤9Ó›+¢Fë.ˆqtø8î;÷9Ø2MkMoš*™šæ þþ`Šc¯•˜Žca<˜õKš£Ðè ;"íÍæÎßÂ9’î§õW /çVÐ_îNP¶»$¿ghT{•¹|¹Øç²¤P%L�nÒ¨…ùðÈý˜UÌá¤5 !K�áu"ø(}€×¸·î7�Öƒ"¥nB5}‚;~î}�nY›ácÛä×V°Ž€d]æ¸÷‡ïâ]è!�ב9Èj)Monfè–Ofòî=æÙ«¡õ_ÔÊH·IP*i>C[¿{Qvíÿ¸j›,fáWÿ=»S¿CûÕ ‹T̈ {¥‹„Ò´›Þr€“ð1srÓ¤`dÀ½ŸÙX'ÄZù…#ŽØç{[Ù�ÿ0â2kª�XGs¨åõýÛtYàn1�–€ö¥IÈØTrÀÒ¸cΔÍms–ù,eö>0Æ,4̲­–bÞlônF3¨ì�X{ÿÈJéV¬Pö¿î}˜ýjþ6ŠÎâíó¦.£�Ô2ööêÿX¡ó8%úæÿçu=ž ®8¶r½RH gñx¡°Ë˜ZyªL8 u3'í·�‘b" /µ¾r#aq½G‹†ˆ¹ Œ°°÷4µž„öJzPÅÆÉ“õ`q³°‚’¨ÀÊy¤¹Ž®IÂ!\ƒ^À§™ªCnuAjòÁŒF­ ·4ƒ ѳfÔŸðâ| o� ‘(sýÀß[øGÐÎ}¿ÐÕJ·s|þä©lbÀÓ×rç@{kuo4½³¸à†‡pAbýÈ ?5´‹ƒÖád¨�„,"~XˆD�<»okòE–½ì¡Qs†{ÁšÆ˜}+uÄ3ÍŠPp1®CªLâßkƒ º-\òªvã÷ïÓlr!-PíüŽ�0­t¬&Ї‚ïd»!5ã"ôØ$¤¤çSÃRÍãAR8ÚI(â|Já�¼€Ó=p#3~âÃo»œC¥sw&ÙëSû£©C™ êÆÉѪ÷ü-†c»MðŒ¼ê‡ßùàg³cƒ¤É¶—Eå§Ö?UÛ ×bn}Óã€�´GYá]ò_Ú¾&ÿàÑÌzl™®$q@�ÜÔyÔmÛ+8ƒ[þk é¨+ÏBÊ |�Æ•U�ߟÀ„"Ó³é*�ø»!5“U"Œ¸ŒßÝ÷cIµ!·|»fHÏS×úšHRZ¸�¶k7{~ò¦êöíùÖ,éëöf—�Úïk¯ð4SüxÊ–�“§ÈµÄå­±¯3P Ìò³á®7Tb (Û¡d™1åvz¬aÿ®Õ¯ò§üËxÕp§ñË­ÄÅ$=p]œr1ÈÈ#ÍÎLçAj2Mcä,Ó©. =YÃf‰é.WÌa»œ¦ÑþAë{»ˆ>#vgïÃ|iy=azéò»›[rqç{çNl͇q妮Aÿ.˜ ¾A‰ÊÕ‘Ñ­µsã_#{à<ÿæ 3iΠ¦.¹Ø˜<:ÑG£«Çó õ]Mß§kòŒ˜Xšˆy‹”ìbŒPÊnï#~NöGwÍ®õz±áWA¨ÕÌ*¯`¨6PV|Ù¨�ûF¸¥LÜë}× 0ƒB¼r7�?¡ ã�5û{zòCi¤x1ÄEVèÙ¨2«caÇïR$0‚2—à¦çÚfŒóçg¿´.^Õ Àê倜ï"uôäy‘™h9÷k'6�dqQ5oyþ¿¸èï¼êVœëò]•o$`F,;BG${ä°ê])G#@Š^b?±IZæÌ<£òx Ä_‡m°ÐrÐG¼r€Ìºñf€ßƋΠmäæ:5M­Gù4 ÀH¡%Ð�'ãô¼-Y; ¯œÈ+*Rz¡©xÜù!ƒyàC#‘Ä(ƒ:+D!©º1tœ­Ó3€†!¦XÔÁF‘[÷UV]·‚ËÎ* `LÉCUcë52›a>±k�È}‘ZtÌáz¾**çÇ©÷Å‘yéçþc´ ^*È… Êe3XqŸ&E‚îIàó ]󎀃ÛÉšŒ]Ó³f\`Ê„ïšLÚÊk&V^óüžÑ=ëR‚ƒ'OËL^£ö†ÔÆ…³2о­œìï7¡»�¿¦ÍçâVÉ¡Ðt;× ÔoÛùÉÇÙÉ­6–Äܽ,Mÿµ·Z80%S¤ÖÆ…Ðúý‡5�†>‹Ph)>„5 cã|í:¿î¶5cùÿ@iŸùi$UÕ‘šW퇾¨f/ŸxÃ!ñæú1+zõóûìñ‚üC*¡Gœwx«i|“ôP{Ÿi–Ùf¦ÊÙ¾Ò˜ý¢ònãY2ô€îØB�\Í‚9p„B}4ì ®T±À,ùì9×=Ã;gr2×Üdé!\›¢Þ�ÐL†!ºÐL|´vI� Óšó.7‘E ½ˆÚÏëbx¨àòyÝ—@[[C.ãæÎ,Á¢{§‹´IDýò æ#°@�¤ÍºúF¢Üß³§‰éY¯:\w£f¦5uÊ©XA‡7(MGwXF€á5•Á é¨�Áy6±ˆÅÑ�Ø»Z»äÎùÖ²}Ü ÃFÇ­»NlÑ/œÐÞ»´ª Ù¦zâOi3wt˜°æÑNÆRøKMµ”Eæø/W¨8ÙsD Ûƒ{Ù[±\Ùr@ƒ(“7��� Jšâü$^Ù³‡›�%¬Î·žnîË»^,A—¬°†š°ñš‚¸„s°îZ(±ú›;d3—7Æ)XŠÚ¯"0=Šo˜M\‡—=¾ÂBøW*H›®.e˜}¡y;ª¦>{Ä×I×�ퟛNͬ‘\ÅÒúÊ}T¤=ôµ7·ƒ|p6ñŽ7¸)�Êg¶h‹j<Ð…€¥(dKëÃLñʾï°ßbÝP=jÚ”,Õ�w:‡ú {¿rp¿ ¤˜5éæO™F{áršËîÊ,!e~åðó] ��oÌ0K dƒ_«wêDŠ�KH-­éþÛÄgOøµôß/¦—îsbËqo°¡í\ã8›”]— A·Ú–d¸Y+–­Ã­·t¶»`ãª7wažÊ~Ci6N Qtü3˲OË”Þö ‡‹(y'á=‰ÔQ‹«i :â1V7¨| <ýÜã~Kåƒ!°ûû ïQ�¦çÁ`ÔæÍƒÖÎÈïÊEâz9�ªQ iÇX\]xÜ×yE¦Èg�®�ÜBà(\?Ä«´¿f0]'r¸ú]­`éǽË.›9/'Þ¿;-x ÃïoXZÌaÌ9‹„ÐÈ8³í²ª#|0.f›ï³Î„?lõÂçÝÀ}· m2.-–™¹YÓ‘ †õ§Á¥ÙæÓšf=ê°YLwNutŒ»?§È|_Üô6h\ewVÆFئ:›™Üu”‚ØËƒÔr2 ­Î®n0>Ýà×çÑÎã"óóü/¡´³ÐžªV5´î5zÕd ¥1Àï"`ÉJcìÍïwϨ诠Wí²CÌvêóG©&Ö[üÑ}îØÎ‰¨5[ì½³îm®8Ñqu“*'Ù§I¸ù\øœÚ ÐAl0ÛTù¹]+¼}7Þg6œÚ |N²wa»á×ú´®ñ‚ðŽqè1”Y¿{oª�==Ë%}3º¥rÙ=-Üú…!ç¹è®˜ª`ñ©ë³Ý(Öwíæ„2 Æ>¬ø9&ÞüãûÅ{—c-ÖîÐÔó‘$9õ !�¨m¦¯óß`Q³;@êã9Všÿ*�aèî¢0›îRñ Í@’ªŸÎ±ì¿ö`´ë½òÚø+½:ö®mMǯ¢8¸néQÈ„qf70sqc&CbØ¿+e*'”pÐßC‘>,¾[0²jZMož±Ó�M3Òr—_g±*u¤î øg¸åËF$¸³îynÃc:qGؤ Ê%9T�°2ˆYŒÑJ“€ÜñdyDÌ©Q‰ooE�œ ¹hr·[s'9yÌçÂ㦠\£«nƒ\enx€1¬݄J½á®¯‹—øj[ó­Òål®Mßša?1…Úw^ÛüžÆØÍ5žÏ4(29¯º’hÅŽº‡húl¸z…2é…ø= ü¦ ©Ú�ïÑîØf.7&c·Ì´ôÛ¶œ|7¹Mð�v� ¬ñ£ÑkWÆÔwJžœ�…^5Xb?”ÇÉ˶Ûñòl�õ¡×U÷\³Œ‰À‰Cí7Ÿ…~Î3!ï ß�Œë‘+ŒüòÐ «K£„MÄo—&~ÎP±µïK‰yæð:ŠA_„‚̽¼<auq»Ü毱Í•Ó.+m¬’ñS$G&–G%G·kè邌pYëxûøxÛê:Òô `;—ÌÚå?[(û­š”í¿Xeôó×¹~¢D÷ºW±Ö(¥õÒÉ|ÄÞÆ+Êþ¿ÀÊîç·2ˆšäèÂÙ s·72ÅöBD&ç6Ïæ­xÔᜠÈ<ƒrÚË2YÑøR’y¾•L¡N­Ca¼&šøÅûº…F8º§îãÏbâ»ûG¬û�oï=�0�¦É8Guã,‚j€µ‚~}š³`þyÜ™”1ŸÇ¢SéZʰ»_LŸ±Gv|ºŽÚ' „2ºúׯïjF2 µí¨é�Á>k¯‡�³6±dX‡Ý¨5b¼ËƒÑãVž´€p„lÎÉôÌokÅ7ãGMÆééMZͦLо—<š+wCæÒ×ìcƒéA ÔF�ÏÑ,·{5)Ã�WqÓ¾Cª÷wêïFOvÎþ<Œ¶=Þú õõâèáЭ}hèræÑ´€LëatÉ#Ør´Æg|Ö™®¶+MÔ^ü�ÕL‚%®öÓ‘Ä“‰(ø� ‹Ò«’)äVû[+´1mþŸË¡µÞVöîùâ—g® « ‰~õ­¢:�­ù ØÁ`øh�eõ¿!÷DøœLv® ¥wqmÇí÷GØæ¸�°>Y®è\ô{IævEHÈ£{—ðåÙ'$m†Ã(D[Õ�TÈ”Vï*¢À]<[<ªê-¢â_¦"÷˜ÙyÆ(ÔéÕƒif¯œ-Z5{%­ù4 \ÉûO'ñ³ôþn·Ü®)íOaTµo¤>eT«W1&@:æýúꃉ)­ AloJüê5Ô¸Ö¾!^´ ±lt:½ÞãK¼ÄûsVÑNÛËšNê2k:(KQb°ø!sߌ’ o3© µ©¬eW6¹W¶ ‹�‰hYyÍšùraHƒŽúöKn}È"˽à×)B1 8‘ÜqwÙ©ÂÜ Ë~Yo.:yï“JýÊa.c&[S5`&ˆàkÙ‹Bè×:¤&]¿ î!ˆ(%†Ý«c¥ *øVÎy'=u¯r¥á;lnÒ.¬ šDðƸsq �N»·Ý[·4·ÐC£ œûháâ »Bs;¸ÆøXã"Ú�Ö=ì+tÈ#‚Ä¢û«ž®K6ÜÆeXÏL*G³^]ÙBô†ÉãÕ«‚�Pb'‰[ªfBÙÈ} ö7awÔ®¦ŠQíðÚ꿈î4)9.çÎgõ³ r¯`‚iãï€�Ÿ^†¶(”oö@ï<º7éì&ÏîàþxÚ, 4½¶ìEês¡Ä¼è”°PÜT@JŒ>ABÎðö Áï{.8<ß&ÙlRJ.þP"xLw»á]ï F™ùÏõ!hŠåBäÑ�ŽQ§l³üºx¨^H`•ùµÆ=½F°I�Åþ;aÀɲã: �èìñ�u_5ŸO@Ÿ±ðÙ&ÅYóð¯$`¬ú[½£¼¡�~îˆvsôóÐȈb°9¸pJ{ÎiÏF©&M¸Œ„~m'Ó†VN™˜± Üò 9?Ùní±a˜ð Èw�:Ó/œG3�X6±iÏ?‰cºªu¾uà8C ãÞ^˜ìb¿DxÊâC#@°UÜY´f*»2ð)I±ºÆD_)g?$yÎrôÇÛã/í(ñ]Ã|ŸÄ˜ákYñøË¥xbÑXâ”ÞW[ÜO¼1¤Áqú¯ð#ù¨œ¼XÜþû.”±ôò¹¬S¨4owµ:Îï0ÚŒ|a÷ÕŽ\äKwHNW„§%£}gš€-º‘%2¹ÓÑžŽâ"õÇÖ£ìwꘌÙò}[Int�Ÿ`'�^‡Š\bû¬ko›÷sœêåÔEà}Õµçå=oXÎsÞòÌÕ©øåùÉúËÕÝŠû ¥Ò�]Œ(_%ÂAY°î WØ2ÃÏSáñ‚Eì[sÝMPZ,¬–Í¢ uɬ n0ퟳ/Ó~~©Ûò*EðŽåy`Fw‰3U;h‡ar= xÝA,¹¸bòüî¦Ï¤ÅƒÐn1\Q]î7‹èaèu:9-ÂÑtÜì—tòåòÜ‚£Øã@ríX¬­ùäyBn55xº�4¼~³m»˜‘Öò®ÀNRÀb8�z½ö»@^Ñ],Œ ¿ 'Ö오�øãÁ}ˆ«7› $QA¤—É´¸íH> ÁòC‡—ªÜ*OgíN[ž}bñÏUPý ¹Ïß#·ÃòÄË•LTc:·Q"okõn€ø5|ÒüzŸa´µKÃ&€Ò3CÀ¥zÀf–K3!×^ªï­·R@ñõè¶éœ…�@c}¦±Ÿ)<Ç=‹YôjÎ ˆ«^§˜¥5вÕN3hÈE&Fml_Øzº¸]d�!Õ_XsniŽ‘ôûâ¸s/ê®¶Þ>ŽëÁ“Má­Ê ëÎd¥Ì�zwo8JA…«ª-¯1ï*ãNç_jWÀ’aбû\Ïxó“1E¾¡EÇ›CScm]ÝtÂÃ|ÞJWŒ(¾Ïtó¤d'eŠîñ‰ã4]ZCCï±È š¤ñ_RѪ­LØâbK­W•+ÿâß/�|x–Êgé¯X]³ÒÄÌé97‡1¯í7÷…Hh3;÷ uŒ�ögŠ6f: LŠÅƒ…ä˜[¯¢RÜí+g�àä=ºö¡uý¼I%œñ¿µz…¾Ây|`x´6ììú&Y C!‡>4ȹ8}@³l°‘€¯ ðâ‡ÏÜ81—@£Yúp£ˆ抭rÚE{=–g„÷cÇ.õK‹UÀ°÷0uË‹ßT ¸“ùnÅÄ3°¸^iCç^_UåÈ[·z¤txñŒãëíÁíO¦0+ÙîÓ¶Ýú­öinʺè>¬–6«Z7`É=Gí˜õo&÷¼Y”äLèBÉê÷æìòeöx¶6[ÞöXmaz{{­ðÈ8OMlÝëã˜~gv®F'+:×ï^Ðg#6“ ,¬1lÜ6¿%!­ƒk{w¤ãVµ>Q(>0}™sÅ¥™Äž²cõt=ÎãÂMI5zÕ çF€Àùw5C{ƒ_ã*ìâê,*hl—ú1€–ß*ĺ�òÀrÅWo0$ OÁºÚõÇð$cCNØa ü©qö�¿­;~�·Ðá;Ø�S!jÙ±”MÚ½À}·"F…kgóvc€‚#x›·Û÷Á¿+C(mHr ÷�î#Þãïg½§ ýgä> eƒMÂÆ&­%¦´‚»¯ÉfÅ»ÅIfʸ.ÃU)€CÑÒ1ˆ=¼êüz`�ê­‡ )‡>êEúß0N+�‡¢»d< >+{N}mçc|Û€p”aZ$ø¬{˜Û•„Züˆ°3@|&…lÔÝ-©àà×°pÆŸ Z¾f(T—1WŽ?®ÀS63ƒ#l´,òÓ{Ž4§z ¹ZçÎ1àYþ„¯’LvúG›ÞCéJXÁؾdEµõOŸ ã$§`TÆ7ÛÎâO{ÿ>þ´ADdE±’ä¥_¾Å̓iŽ6”¢íà�1â5¢ã!ðsEÐæt=Vª_êëM�½‰ýóÙÉ(úÙïá Ü ºƒžHF|”ÎΖâå%—ÌL€q¶õ±g=Õýç\Ž>FìÙÛÖÐy >Ú8žæEÇ…É-òÞ§RB éåiyÀæú|«Yâ{m#7æ9äsÚðùßIý«üÿ»è~Ю�õ(ȇ¹{oLˆ"4¨$j±ÀMùãrÒ`; X÷ôc|â8‚‡¨Òe„϶%B¿nþ:•r~ƒèrÕ¬è˜3}�mÈ|ný&ü"•®ô˜Úèj×:˜‹!!JþÖsn�þÑ9¯~^ ç§�üãqq2-"5g ÓñÓ�ÖÁÙP ‚ÑCb³”å(ž ƒ°ë ùG±�Þ*pA]‰$/•ß—˜† •½c'D‘ ¨t{ àYP‚‰'²jÐd³…UÏ H·aBvÍ k˜U‡Ð.Ž¡­^Â'GM(–>S— ^Òí�wÔàæb½èBæVµøÞ3ÿ·à^?¦õúÝO?±ÅGö×Lµ°Å(²¼ä˜_D»ãêýgÚ^êN¡¤5±Œ¦µ•?¥öUÒ.‘ Ÿ´zT&¶Îæ#�þ˜¥Íz³¥�7qŒ'ÈÁZÞçÎ+ÅÁIryF“³]Ch�•KÙÙjm‡·«@v *8—¹© ¤ýÀ¾c8ÌS[c|ó·àò·5QúSÐÑ�{^ûïIÑ÷lÙ²P[Îø7Þƒym+» ê ÃÑéî§Ž–û§„ÔÈÁx,šH1IwÃG[™KRŠa–sÌXŽ4¥‘ σ͎-&ä᯼ANG¡h‡‘T<ŠÖÞªÝX–Òa†tÙÅ'ÐdÑ.A –eÇ5ºï7Ę ã¿u~‹þ‚³{1ÓºñÕÞ´±+)– õî5Æîƒºn¹\ 'Þlrß»ê5f6¹=šP�ŒG+Ìã5㣢#šàòùÄjâx>ÿ�])ÌoÕóÒOîw‡ø^³³Íõ°›&z},!z¿äÚ;@“Ç>ÙŸ2q[ÉfûÜÿórAìä¬?Ko�v�‰%Í\�G±üS¤ë9খÓ-s]9�Åë½úÆXàØ<9â’È;>"ƒÖ°o4ÐÇœûÀ¶EB€A»ÌàzÕÍ[˜z°/«ÇÐßÁõØùÛäb߇œ‰v‘‡ 3W­¹û5£ÆçWj>䃃WÖcó.z— ¾è¾ÄÃ;�W5#‡µÖûk…cc¹J�Ÿœáˆc@‡#Klpm$†Þ¶Ÿ°1È@0M‘cpr€o̓¯;gf&Ö¾ÓÞþß›r[çóPì³8Á`�¿rw`’”Íëå‚¡ñeŒ˜I7aàzÆ”toZÌí vü]«)b-…ÖbÀX¬²ì–úoqa.¢¹]×9µæê‡-Êç�× Ôe‹¸Tu ûrá�ʈdöà:õô 2,=¨©lù¯Z~Ñ6üqÚºíß«X iT9¶mßBl²@'æG%j,k`Û ÝçâÜËsÝí%:á‚ÚxØEû5Ôl‡Ú�±ç61²+mÃ=�š^|]G»Sw.�)@ ÚP÷ï߃i\ÛޏÞlÍ&w“;؆ñòÄ[ÙÌ÷Y¾U4“K,Ks;¡Nµ ðÁÊK2„À‚Ûìk«.¶ÔÎe.¯ñ9{ûî og¸Ÿ ñ•ló†Äd󵃶Ï./&åÅfž!s=àý„8‘µŒƒÕ÷\_[Æ{~úPípðXi=,ÛF|àš(ÍÏ5( ´f­©4½ë‘‰KªOaÑ)ˆp`÷5ËÜpF(åƒpœZÖCMµ2%"e7_�¬¦Ån€mb¶­ø²(Ëîíòä,üêsç)+�ÚŒ+bh©S^6Ü€Aœj\踂^ýyKþ;Á—Û5‘e!Pü¯4Šþ ZMëØ×ìX¾¼ß,ÚªÁ™” �p�AK‡U³—ãM³æúMEÜtÌÂ'8P9^Ïö¯ý{Å.<÷<²⃂Ù*Æ3Õq±[iÍ´X¶¥ö+@ÈadÁØ‘·0òdzÃ0ÈwJ e¡43~�WÙ6ÕÁ„���, ¬Ï�§n�{¤$68¥^ëkÝ«—êñkìzÿ¯ñ¯¤2=Ú9‚ƒQö¡6 ¥cú�CJš‚c( ›€¤S> ~|\û¼Ÿþ+1_o»KšI©s`|²¥ë,FêzÎs‡&Ðkî§_é [;TFù.·ÃÝÜ8 ¬Ú˜ÃT»ÜT:-À] ‹æsæ¿C"n§\óF@=ey�üÁ©ž¤9Q¹au`ÐÙÃÕ‡>Mni…UÌ!ÀÎܤæhÀ)õÄlàÍÃb`À-f¸èmC,vþ‡лòiqa$K«s—fgÀ�¹¸ÂÞlí§wd˜+:ƒ_I+cÃŒˆT{¬#óšjÄeu–L+·.™^<{‘x¹ÞÃÇ�Rgk®2Þ¯#s`l¦6™mîÌPmÞq~Q[ OB ‡q^ˆ;Ý2m,3L¢ÞYT ˜©òÈ}y;o Ö;5ò“–¬wDÙ‰ìßXÓÒ+‚…@ÿŠR€ƒõs6‰­Þ¨¥'BƒX�êáà±*|ƒ‰y(pÕbí´‡ïѽ]ÚrÄó¡é•„r�c¨<%¯„ÿçð@|4ç«?€fñö¥"‘MËÞiV¾1~BU[4v¿5 С¹¾]CYi ˜ Hì`‚[mºô>ªX°¢ž¶H*úÖú1¡»O½ƒÓ_1Þ ‰D¢Qá�¼›UÄÚÂå=¼çÑq¬zÙ‘ªæ’»�Ù(x)G„tö~“y›È†®}v ¦³Vœ{x¾6�J>ƒ·ÐÁoä%¨mÏ1YGžÊãƒDÂ1OˆŒòLø¸òUIq,»Þý ç-Ì~ÞêÒpõO9î:%‰»åõ*�sËçe× þ‚l³ùI†MtW£U9CåÒö†9çƒÙAö3ir”ÕÞAu‹”²W?Š'X%±GREUrá"À‡xf>yä¹ÚmbH\áç"¨Ãeú§lÃ3áT‹»Ø§e6G¡{éq¢7ö´¸#â'S¥6ËæºµçË}€è±Äg=�V[ÛÇ1¼rvM@[N È.ÑãîƒL‡:uç½F;ÈUu¬ Ø@-K fJ3VûîÜW]äbm¢N O{Üòwñ—Õ3G¯˜>;£U› árËÝs<æ“Ú ÎDô •“på4vÒK�Ö—ž5pÂÕØL{ ¦˜úuÕW_e»5Y–êö+ÖF¯'#=h7ÐÚ`ôH9!'tœaSY²—ÂIÎѰ¦K-õ ѳåÖ*e}…ϵB?LÔZ²·0‡?D�àuÁ!ç3l` 1"sÝS¸Å›— Ë? ÝZc’]`ߤUJù+އ8G[ç ‹ � ¤IÛ ÑÎù ò¥øp­Ô;û§å¿zX+ìöûêîÐÊÕ̳(4H%€µ�¯G*#Iê—Feù\D\¬�]6;ÏxÊ¡µgÙwft" ±)™î½-š‡{x¬öC²ÉG¥Œ­Ë¸çW#`صã!UméÙìpNw Êý¨­˜˜³…Eö»‡Büî`³þr™™Ä〆MEÉ:ŒLîêŒV{YB�-‡C×fÌ.„ÿWÔ³ƒŠSêöº]bôž7"µË¥_¤?ÄŽÖ\ÿ(U÷i¥àfû’±ä®ævƒV;X°aBïH¸væç0ûûóÂ?3Oß*Ølg’ñÍ‘¡µÅ"ˆÒ{±Ù¸*¤ˆO І “å™%øÝ'�ݨ¶ÿž(lZ„/�ÙzW�ý±ta)æ%„,ÌÈ…¨ÏXìkHLd/3mN¼< Ç/Øæ;IïžþA¡î9j}ÀëyÆ÷o;ÌNð°ûQnEÁ«µØ@2¯‡ØÕC�)_6€µþ€M·ÎgÜÊpfw f2ZI !!²ÑU[Ú§þ5 ¨1ºm ÝgWÅ6Œˆ‚­]fAÑdX°ø؈«V$ù…qúý`[MˆÛZÞ²E ãG7 ÁÎ%‰ñf”Éò̘ÊŠub¢V6íÂ;õ÷b¾»9f‰Â0&V¬,éóY:¤KÉ®@zÆ›´t#Ê÷+�Hg‡±¾*Ú=²‘Š|Êăbû×Än^KQ‚,Ø-½,¥;M¬i:Rã-¶ê± Ù†7Þ"÷¼‡¼ÚwjÔáfŠÃoîÅÆó50ƒËÆ£Fê·kækÃ/„f#=·5È‹ÇÇòf¨á®2L¸“Ó~i²¯é«ñ H¨/?Ô£@Âät“ºçjÕÕE½¸bäÿ9«gÁqÎh üù´ÚŠÕkí¶VFÀ76Ï>³¸H¶!¶ÎÏœJßÐm1 Şͯ…}™@�~­cËŸš‡Ä܆ûy;î�9F—‰:±Å¹H`÷_šD 3«ÛömR_p§?<ÀÜøÛî{æFLù¹âKŽPŸ3Þí{~«ÕÇ6çkÄb*V2û:9[@ÜDúÊó€®îÖÍ#}ÑF‚ÊÒí˜îYHGk.Æ›;uχ¾Õ²Xä¤s"¦Ü gJè-I³x„÷-í8Ç~±Ÿ|\ðÁ€<´ò¸.{ꪀ[3}2åÍÃõ'M´R£†o(cCn‰ÁïïqV2SkGaüËVåÜŠÅ®v²ÃoE¡¸æŸLøeþ%4�¿C´�»Fî˜erˆ Ûx›þ7õ¡¢ñSŒ9³ÏNR[ÐUš„�‰ôfø �únv¨v¼"+!my¡¿W KÝ!‚£tUv‰›mnvÓMÀ¢J– Tš%¨äàà'9$ëØhPè`#ŒçŠFÐob¤;Ñ ¸¹­ t‹>°c" yÎ6WÙ«@hª6–*×XY»1±˜Q Ærøñ  ÒÙíNFšXÖ=½&y»æþ¹ “ÇpQ¨Ø‚h¼™…ÇË:µ¶à{YtM‹…艻¢fb\ØqÆnQ2€ dB¦J™»Ý’àc›§+Wu #öÖøí‡v탽&ФÌú×9€œ–½ÚË‘^Ì5/è÷Çá ÏOœJhrGŠëý”këaRëªi§BCëF÷ö×} lÃ6û‰’ܤ_zãŒV^,¶ÖéQ:é ÂÑà~'`æÀepÅmX9¨Ý[´bKtd®^ CaœÒ"K”!šé×o r¹²û|èîRçFœÀ­NM½ž4Ù°m4È”raÏæ¦JÖY.Y44®Ç^Áü�– ðmÙ/a·È¯¹tÌø24ÀÝVœC¤ƒ¹œd÷nóÙ�ü7`Rá­P S*'{R ïß¿ˆF¬†Œ­8aC|çæ:³‚cã¤ë'Ð!sQŠˆˆÐãHèêuÍß¼¥ïXxjÅã §B6lÜÂÎDA�¥ß:ª“q›Å³€ÙRJ-I‚{ÓJÿ¨q:iÎz½Ïkæ pJ@æ7¯©PNö5é_†¬;a}Õ÷¸=CAÇŸ³æ)\éðKo:& Ô¯­;&±¸Æ ZŒ™‡Ïɼë{å¾¢Ÿ8rÄü´,·¹èDAŒ.:Ü`+ÊAéLjÐHqÐ2O#jþ(aï!íߺð­;8‰kBè`Ÿ3 W!4íÂ<Ï�r,µÖÐ">ÆŒ~-8&D™Nñ,} ©¡¯Õ]Z!ÈÌ [¦ìqOè}�Ö�’äðí¿%7Èl•Àyy#á’zJ¯N¦O6á—W»^ùΨ۪köNÀXûÝN�ƒü˜ ªàß ˜Ûj9·¾¯{ Êb�l©xh#+c[–Áe¤,;§–4ÅSAŽ&ç~hÂ�dM+ÙËOvæg˜£˜Hpo·±†öXÖ‡ušR”»‹_ƒ‘¨ cü†„د'æž½²€Üi˜õ*{0o¡Ñæñ,Ÿá\rìzϾ�¥~¡ÏR¸*ƒ�ìþ² °0‰ñG˜ÿ§q •Gˆ;Šåp�!•Ÿ-ù f%é Ivÿew£kV»€L#+dêÐ6Gqð7ù E…#_¼y 2;+Z1ÐÆS&TRÎKx*î�ˆä·A«ÉÃüMû@\ÞFnaµ°�¸÷j© f}dY)G §æîàý¾]JòÀ’™ºÅl�g×ÛaÝÚWõ ½œr¤%ŽÇ{l_8¤¸^Þ­À6P0¬Þ ïz|kw'Ը餀é®?a0�ë�X Îï÷<¯ó´Úu ùk™â™ÚŽÆû wƒ»­~Ö{<…~Næê|Ñ-¸_`Íðm¿3öoh—} �²"dñ£ðüéõìNF›W hÎŒufw0ºÍîŠ,Áà3}ó˜îÂÏšÃ5Å—›Ø „iL—íƒ;˜sÇ„šµ^ø{*(d�ݾýÜôÓËaxƒü�õ³…%Õa-¥È£\Òk>ô‚ ”¿“v¨Úß¾~_;u›d¡qa³ø¨^ÀB1N쯴�|PR1µ×Õé|¸jJ[îßw+è v¹ó‡ÚœÝˆÐ£Í»nœ2Hw“*UYù–1Ä xJk\Ý­CæL¢˜ Ì«c,É…ÔÊbwºÉ„ûö5•-öe­[ÑË2gÒÎÛP¦´±¯?6»z F@ÑÇ/' й�ð7w�$+@zz?(/#N }¯âÞ4·úôR"J¸×>ÉQP-­7+зiÄLÛW‡<_Ìñ=ÉÜñì,—I�eötï´‘âï;kàUq¬Ú²)DPcP%a¥!`D¿SìK«‚{G[Ã>TÉ@ÄÍ»ÓÓå�>„Ƴ˜È½©z,÷“jó:ð�°¦?e<Œ–‹òñ.8—�ø2ˆœoÔ ¥ÉÊ\À^`j ÆViÒF²ó Ç÷£’e+ößrÏ�ˆÄk“¯f]ÀþÁªs†vxSãœäD´[.…žoí"Kk‰f�ßV×Å>¬ê<ìA‘Å€ÊÜá‘ìõ6’øŽ;•ôźÁvð•\5¦[¨m-[ ãü[beóÜ/¡ ÀFÒA4DDƒ“èe^òüóë©ÂÖt„Y ôp«°XêÌ·¸¨ ‡—j¿§°ŽêÚx-âEì€×1¬Ü;80˜QaN‹N×#YÙØïîvu¶OÓÁ¶¡ð¦-&bç4%î<‚Z5ÊÆq¶Gëh.˜ÀþÕùnÎFO’ MÖëߺàòæ Æ >Ph/ÚÕ' vtó†Áõ¦SdÅ…÷`ÜDg¹„�V�ù9–vðd½lø;×ÐN°6âžQ˜qÍy þ,F´Í3ßUßõõòߌɭd’7‡Áº”š@ßZÄ=æVE%û”Ô°’ ‘å÷ÎÖ>æõƒñÖ™#:âµD¨XÔ|îœ{}ö¾rðêòÞ}7Ü××Gtp”'âæ…¸@·Â%ô�øU›6Ç¢ÍS¯&í~ÚE‚€ËëÚÂ5b¼¬Ë›§�¼…/}áˆI9<Ø/�“ûE«¬žžQXœ'ïm¶ÄØ·7•�j¹×Eè]Źm“û úÓåæã�¿u(Ϻ+�³…}/C5Ó-êC~rú¡—»ìIpå~@Kâà<á£ú±öËa:¬sœ13ø Dó— ,Án†›VzWq$ZÅþ=XR—ÉÝC"°‰l5BAôö’g¾^d|æh›¨#æ $3�³.=…q�” UË —S�ÉL’I¾Wìí»žíf˜5‹c¥ÁË=·Ͳñ+ñ†¯GµÀÇêµý5u+U·P!ÙQ�££q ,ÉãRã$¨Mº=¹8ì&w`6”<>ͱØå¾5_ª¾ÝÔ¤ï™|èèƒEbM\U»šÒP%XCß$2qâêEn]%\TaýRÌ4OsQu‘¯�¾¶|þ“zí–ØC�0×ÛóÚu׆>6Q¾@/q³  !gäcH}lÈJBáÁ){ã趺~²,äÀÖ…÷4ðuæá(]�Ñoƒ™ BuÝíÔH.p$(¬Éi`8Ëmg…|Ü‘‰{v·f�Eì÷Xê©ÆƒV …\`y†´qKé:ã"×6Ê×|’d¬m"Þ"¯/‹Ò¡.ᣞr²»˜'€ÒGw^êA†ö-Žàœç¼÷Þµ±á@“œŒzüÚF XĽl[x&ËwO ˯�PöqÎÑÅÊSqR;xNRlú­ï³2˜+ã+sÑÕ]"5Ó§wqeví8.õmeÙD|a{þ´†ëƒ�¿¸ç�àÁì¤ ®ú“VÕ¼�´’!„ bn.ÍмÚhýÒ=îã�4ü¸è°h/VährۃʨGÇ�Oz jÂÑ?= ^ßÃQWŸÂ;RÖ»œÍŒT\Ü}§}÷Ø µP^ÿ¥jvß!ë´š@8§ =¶nÕŽÍ“C-˜;yú3²ÁÄÎÔ]׌\_+Ô³·Twg1Ï-­# ž÷ÞÙ"²a1ÞmõWx(Šôšç\;ukXbAÃj·)$7¤Æu°h3‚Gž‡ ã[Ø“çO ²Ü‰þ{3P𠌪XÁ&1Ò²d†ö+UÛ.ÏœúØ•t‡¶ç§œ€!`’¨!û7 »%PMð¾|nÖù|c—çZí‘ ˜$×~è§vØAx.Íø0M¢¤å—=²¬�yqÝ7ÜTTïŒBpF›ÎÎmïÜRGTõ�ç�aÎÄì�pûÀAÕ‡å¶ÕñÎ"´;å”Û<0 È¢¼Þ­çnè¥$–ûl<�o)~®QßÌjœê–BÊÔÐg¶åø²a}‹>{3Œ×¥CŒ£�›Q� ×�0åÙ#¦'FD+¾ÓY4¬$]g9äUí!·Ï>Ò°{-žï`„€øŒ4KQ”ï®Õ€¨áÝÛ·æ¥�Jq€ÆÛˆ—…ÉôÔ@;íuÚF˜Õ@Ìw‹+¢sßæzÁlR«6S„Ý–éµ³‘h+‹¹nå YŸ Ø|ÖÐø/“ÖeZj» yëx¹­q—Ëv<&úU-¢7ê[zÔSE[œ3«1ž‰ú;‘»œ2oW«Š÷«`[ƒ ß ò÷ ï'�è>G‚6בs¢ì¥2¬�é†äå´>­¤dtý²Î LQ³šcÕcŽqÖÒãZ0g„Eœ[‹exH8ª •Pœ¡[ ãd¨¿b¡4˜€‘e 8�{?U¤¿¯s RC«ØL>¬Ví˜ä ÀÙp©EãÛ5óQ÷O™,_ôåÍF|ÇÃ)h}Ø9MÓqœw&|šWžð’H¥ûÔãÞé­c&¡WZÇ8*ŽÅA8&ËjÁ2 O\P¶/{ùb²VH–�-ª©qº‹nªÀCq ’&Ä»M®oÑH†ËÅgS@� Ô‚´Ü»Žcü¾@ìs“ÐÉÜÁ,&q¶E‘"3v(—q²BåîFT²¤˜…´½€1áí C©”x‡kšÚ%_—5îN«­Óëû­#ï"ÕE¸{{Ï�ÐàZÀ e­³ß-ÜÔÝ\ÑWš¨¼lU…�\L‚y¾ãÙ×lR³#e¯»pûœ8&�˜/uµÕçXäp�;(öŠ�·.?¸SÚìêQ»„ëa³È·(0W+æîÅŽijZiõÞÙÛ˜h2c}ÜÖÄ[Ø“ôqåõ@D ÑP_{1¢!ýñ i{ÇfΣ&…¢©²Š-¢º¿ÉÛ7ßEŠÚàÉ÷^mœ»²|6?O‚ûç~µe0µ/ì%¢ýû‰m_ L)‘ÂÎOÖVÝ  É3zßš‘¯¥hñ¢Gxa³ŽÌò«6›LéA¦Ý,vè�\AdÝ_/ãÓ 4ì<Ø0koš›â¢øŒÆlD �¥µÍ‰²z7ض…+C J¥\ï¬@±Ìâû©ŠÆ¤³ZjLè_›µÁ¨€¸®/ƒ ‡ rÿ¯”­ƒýŒÅàXi…Qq+éÈ\xŽ´²Þõã®k‘¦­KNŠ¡Ä)µÂ=Z9q9€‡]!\}¿Eß^å¯Oo žºL}ܽIŠgKß\Å]³7årwŒÌáÆµ¡i7œ ÷œézÆsl°Œh¹{Â~Øç¼éìÓÉþ:Ú‚¯ÞTŸ´¼Ý‚÷IeþÊ´ ÿOÓŒT›æð9y[Ò ÆIû�­²wê4™I…Ãø.�¦ ¶ô~¨õ«.³T Ûë�’ákŸL½4ÏpböÕª:�>Dø$ŽÎ»ÆÚ#n‡/ �nCñA›ÚkèÈâ'�Òˆ©z è íÙÎ8;ÊhþÅ!éµ[Ù³fÑ.ßîº÷Ѷ”ó¹Á(µs=xxÁ[N?c~KŒ‰00Ñ]˜´'�¤%v!�sW |r¯˜ |D®²| 4Ž‘}F;aÝèújÈF Œ’L¶Ú�*âëAŒ·ÚÆËó‚¼d­cÔéi*ã7£»Xt&PBW0Èë@£?/%|–P¨þ~m�Jކ®ˆ–—}ãpùoæàaëX®1О†ÏÐP¤Ó”ÆÄ)fGó}äž¡¶Vù¦ /º|±ÊTÇåÒ„”’üTùÈ[pz¹à„-XK"&ò.ÌÉkˆÐ…ýürGìµüÈTØ¡ŒõGˆu¹´í™ªr5kq©ø|ÆB4[Î`w‹3�b”)ÉP²áG¦çÂð½r^ê¤7©Srbt5â†ö”qÖ2ÏIúW‡ÄjàsErìC8=†F„v�]±û ò¹\mZý»(4‹)Kc+V svÏ£?LÆv;Àƒ~,Ö^$6"µ(ƒ -§�öU&+š¿µ§æYv„Ób˦mIémâ´y*Æ1ìÄánR¦BgNêB™;žv] C2³xûvÑ<ë÷PËõÂCÕ˜\Yº¨p6‚Ž]ë¸=§Ú�ncv1ö‹`e¡Îx  â£zÏÝ.%…eªûÛ^eTM¥T1!Žß(�/ú bª+:>Àr±»Ñ™�7츠•Žç9“|0h™q õÄCT°H]z¾P2;-g7¦j X£.Ÿ„$Mîngù6×&\õœª´P¹ñoä§ Š…g›õ•àAúB°<]ŸQ/–iLàmYà?kC�cÊFN-'?§>ÀUVþæú Â©nmk¨°«­áßÈIm"ßßLmXrKdHÝ»€æ<©ÒÙ–öÀèæ{Þ ””ÊÞÕ úS+r¤øÕoÀŸ0åJšGî:!Ý–÷g1âkó:2+Ò±ÅJÞ‘l’Õ,9D`çïnÿ!¶þÅÁ†ÛYÁ cšûȤ÷|Õª;f4lÓá2öÆ,Ú°°‚óÔ­€ÂÙ1uøœVR‹Êó�µÖöe4SÎ/ W茶v]iÙ7ÄXšOFf×p0Ù ƒ‹ \>@¬ÀK‡GvÖ\¾Æ½^j½c‡q]õ»Ið�¯/JÝKªà 2Ÿ"‡»x@÷GŠ–«’•OyU¹Þ];�—'D“ß/ŸF9NdÜt˸(ÁKyÅzw*Ô91ð5¡ ¼Š]z�ŒIìÃ|×6{»Aéü¿ª>—®¾‡® «þaUx Æõ£ùQj=vÎÇ哺“›è|’·*ÞD~Ô¸ ®þÃG R×ð!:Øœ£ëå?tô9%õfÑZÕ€¨õ2Úgláí¦ôyA[Ç·¼6-·ï\I½c¦LòÙ"G„Â.DÍ�ÆÐê ÜfØÅÚœY­ai cX±âòO‡ãœY9dUzk!éÖÏ›°«A�nÅ�‰øƒF†`xÁ¨´Òâ7ÔÂQz)´BÉýìôâÖ¥‘^Æ;kBo€ùÀýk´dšÇb3í~Ò¤+Pª¥r±.Öº6ö~Ð fO¾�ÒŽ·wî>ï„y“ÑßáåÁï?ƒ4ɹ�Ù0ꉴǙ É)#šñ€dL˜&9Bk ™´ÕSY n+›‰ØHìËzØå섪,˜:¬ö§35ý ˜ð.èkþÒvë%éÔ~œ!„g §U‡š[½Ýö‚ > =Ê&B·:‡k9� +�@BÅ®­7ra­ØÖÈð'¸Xh·óë«Ô’ Ö0—§äÙÚW&9Ú:R >6åßíð^}|N´$ÁHÖD[J_ÕA»{¯nZ�ûÈ’ÿZºäà@5ckº¥¡hÖUüV¥Mïqv± œåÙ‚gÞ382['ÂUÖÜüaŒ, !ï† †2™Ÿ>À²¹Øœ”®aI=‡³\åË@ùØ w!'uÀð¤°dýè¤T;VìX†~>T³šàÅþñ¼þ øÐl”7‰×‰ü¨©Ñ4Z½.½Ê¬ŠØ†¹O”ãã[¸{4�»È^!/Å¢·oª• À|‘�á¿Cn,爳]¾§±{�LyõjËŠ¡Þ1>õ7”±ShAÜ;ÛÆ¾Ã:ã³ÏCçm½OC©IV¸ß§ƒ�nÓ8`Âw—’å÷)M¢ù/8y %%¢ €S#b=õ¦›P‚†CœAU½Ù}dÊø ÐÐÉÊ.Žb¨7ÞÓ8ï.R÷$†�c{)ìÇ¡E´ÄüdMÁ ú·ø¹0*Âdù‹X½nÌ\›€Û°+ʹ}‹óâ-Äý³ÅqSŸi¦T7EÐû“�j[ê{cš¦éƒTi9Ä}‹Cèlš4á<^ž1_7¥XlÌ·gCå“�=Ì®ÒqŒt6l€nöâYw·6©adq¸ÌÓiKî®Gºóxj�sÞ¤îíÁeG Œ]ÉyṴ̀Ÿn ³ß¶¡r:èLs–$Mˆ¿›]GVÏw7ÖrÁÆÂèöùO}¡–Úd(>úât70ѲOÎ=Î.è¦]Ú`‘�M %Zãø¦Œ*¢0—ÚáàÇF@ˆAí‰N÷6Ë\o½9V/ŽÕêAt¯VŸX1ÚÉà=%p!On߈¬Ä‹Â‘äMáÏkÊ€„6YœñbÙ�)DÛ7—43tQ‚#  yö}í¯{† îô 7kòŽé~:³‡KDmZò„‘±HfX[þm星!}×ÅX¾ù³YÞ$~W §4רÊHÌŠŒëƒÚ°$EÇNF2«h¨æa‰«aW;�æV!G1�>^Ð@¬–ílΨ4¬+à04á»÷„žÈ îhsö“ “3ÖÚ D}€Îˆ¾s”ñ:¼‘Žº_§£Ï^õ ù�‡ðO\=wÞ™ Å!›I8aË}È6q�Z1SÙ)o¸À^_&ê·¬C�ŠØ�o%ö 3ûœnb±ÌcŒïy¢{ì ¯^›ó8Bóˆ�Õ3‰@ B°h9—\ÈlÕdšrÁÖ0‘Å÷u1kˆÃLjé»ÚncÌZ¿Zû c÷¸¡°U è€ß+ëÀ…ûºàsÁÅHqó’¿êpx„Œ„ó2óÞ5‚"ú^Õ™ä£'dœÒT#¬J!4‘’NæìD4&Â*ùÀ…\!VJ†ú ùPí�¡@Eé!46�‰ÚN„Õ&²ÇÖÕ«WÀñ[vÖÎÍÊz¦«V¦$8- wÚ{´é¬'%ï •‡®æ͉¸!¬”ò ™­«~uÓR['Îo5ZŒ~•^nù0ko8è?k(Ñ Ñ^\ˆƒn›ÎŽ?ERµB1¸ã'hcÅi• ‡¦ì›ßJ¹ Öñ ä�Ó2™f5ž¤[’Ó�ÇUc>™òZ)0Dåë7ã>-!†/ëo÷/pŸÐSsL+‹ØÉÝFy ³­™ô¶Ã\P>‹„´g±w§Ï-ÄaÜo '|³FŒ¢geÙ°‚‚ Jkw ¶V‹¹³‘@k)?IvÖyŸØmR$!"æÕ÷ëû%OÜÎÏ‹°�YÔ[\zsÏÍ•sîæ·øw¢#B½«w­À:‡¾ºýíR–Àø|— Na 7æ ÔÊç/7Ź!Œ¿ÛQDŸ3�¡ï8áÎ!µÈaF×B›°`IÊêÚõ¥s›ôìå4ƒ§ËðÈ@€U‡#2È C…Ý'>¶[œpkÃ�}4òZ ÆyE½Ùz*aÝ.ƒR CÜÍèëËíüSà¹�cºöÚÓZÏ"Íg§M¾ŸG“äì–gô¿ŠsíC�Ä�œE:ºõÔ^û âÛÌP(�#>ù2ÑkA_M}aæý3¥ZÁÞŽ6;>[`½-GïL’dy¾l^­½Æ#Î�¾û�‹¥Y^å�tÛJ®ª|sŠ60AC$T"8 Úòèÿ�ô,šwÖ»YìÕ쫸¬WH" ÂЇÀ陿kN#€aïZp\ÍJ�µD @:l�¯ €¹ì»Ø³~ rIjtÛœÁ_cã+ˆ]6™ËÑ 48E�Iê"’^�^¢\6rðÙ5Ø“R„Ð"ÍOós‘ “Àé,†\˜=I0ô«h«|ÚÚcþ©CßþÐi>V×LàUʳøÓ&ºù×ë±Ì�†Wà½`r”Þèó…04;Ïf6¹$› Q1Q€wÏcãÛõó¢}¢_¸}ÿ6Àñ�Ï¿5w’€V‡¯Í¥q 2|(®ÌòÆ›u|(q/‰Nõ@°œ/-‹»_ÕU_C¹¦)‡?žÂ}ÍŦ-Ëý­Ùn3¼ÊKÒ鯹Ù¸ÜCÖ½*R“ü8Ɇˆ1DÑ»ƒ@½ð�<_f\¼vAÖ.ý½ógëÍû³ô·dZÁB‚Ëìaj¾€÷Õ|#�9�N†GD^¿¸)¡㳫I ¸Øuc3¶%Ñ`œPP¿ �B!q”ŽøDº¦ù„Æ*ŸdôpÀ Óç@b`#¯ðë)?áH;ٳ˂˜°ÿ?ê¢bæ¦ø¹`yß}»Ñ«¾x¢ù#5)—-H ü²™¾ï¡ �¬¢ °Á h‚NEеþŸžÀëÈÒáÍ™ºú�Ÿ7kAã–Ké[•37"êùÀû81>D¾o8’– >ÉÐÈ®;ª®¹%N# YÖÒѽè³M&XÈ 2 w�ÉiB×Êî«r|ŠéjÄEG2rt‚–«cÝÌsØåu9¯Éu´È’�j†»ÜØmE¼Ÿ«ƒ}¼é7u 3ÝÿÖÓ˜ÒÉBõ·Å°�öfü (Tv3æ ºêˆ<e™ÝúÎ7¼÷Ì.M#J5ÒðÖ¡rÍxç­ëI‘²’†Éóe¨:g@g‘K^ö¶‹š¯…1¨ÐNιaõhfG–ãôAÔ@•—ðàW�U›'ôùfÀ…Œ†qw_ ÒÄ–ÿy[ì5 rÀò Ç�@|èO`uW KÉ“ý�ä°H²� DòŸÐö¾/Ù?PgŠ"ó‚?“k®FæÁ}ïJD¹Å*A îÕL*!Æé-e1wž‡ŸÆ�ãm å÷{2óínÃßmÁ£Ä@~XŠœÛ Ûó÷|È3––á=îHÒei[›Q©cMmé+]ñ ìš•0WÛøÀž$Íþc < pmYM£5:æb‰…É¡…âØº¾ -íõÁOÄLózL: Hÿ‡ñ84´WB§•YnÃÛ£ùD€h±�°�'‚�$`8§H9VÅ�¹È+-XYés*¨åx¸UWfïOÓ«9ƒ¿÷ƒ±¦úçÁ‰oVÁë^A~Îð™«/¸2äø±ïúŽp×X ]ãcgˆÏ7?Ta«wà‚1úƒBä�ºœßZš�܉5~ÆB³Ž¬¡'-A Ó˜~ ù1õê¾Ðe,Š;ì�ÐÔßírÍsÍ»j%ú?F›ZO1�YVäer|KƒŠ~ ïR…{á'ExÃ4ñ9ô 1†tÖ.QŠ|Dáïª(~BK7/ò(]m»Ê• �¨�» úìeáµn.8cÇ$þGQüGâ¸Y,Á�í¤†A†ÿ„_mô(þÓFM¯FF¶ËEð(2¶I§öËk¿`€Çéòe¬¶]ȾÑàœQƒj,Bc÷I½pK¡^ûb‡Çu`ÀǸXi¾>î‚®3Uµ7sŒè‚m`nÖ³»üÕðøÜgt=¢ïºú*[Û0[^µtw~Àk“q+‘µ~öËë;;;ÏŸ*ªq“O›m%­EÈó|^.?û!nÌØ*�ÆNßl¶C|BxA°hí.h45´Y¸"6`óiP!ídþ&eãHe4cêžúùbyroÔ£ë÷ª; Ü/æYÝ«Òèu“»ˆÄB~£ó󕨴¼‰ !Œ�5Àá[½UX4&_|Ï;®rÒí2гÅî;ØfØ»ëÔY;e,~Ëäǃí'®Û®òp)L!«%¡ò'‡1ßÛhÐú¶”Ì�¬Û9݈¶‹!ÁP¯/  ®\\™ö°�èç>­vŒ(¢@h#Ú»Kâ]kÞFÑϽ>™f¸=²·%+�â6ñ¹ª¸,äE͈ÌZs›ÃÀ"ÕbÇÇÑÐI¶0–íáD9@?U�û3¿>,0 ˜…Tƒà�g 5KlײØ��Ù`V.㙾­h)¶ÊajJÕ¬Ô„óîñm"¾.ë5‹¹ñ±‚ 4û9VV˜;±Ÿ™¬ ]·b“ S»�šÇÕ`�Îx'ñ7 /ï¸4b¢&$ù>»c߯~O£Ý‰ ÔØ 4Ã?jkòÉïe�·&†ßændä @–zÖƒ6µ’oY·° þKOGX§; «»/‚[ Ýq÷ÑK„I ki§onuÀ4þ ÿRYÀ»u1ÑbaqéL)Žïa6 ¸�%€Ý’hù`\c›a½>*Ã<×™ò^=ÖÞ 5fÊÐVd?ŠHëÃx,èz‹Ë¸pi±5Ö òÎõ":B›änùåóxV:s4”©êÚAÄŠ’-Zò|3÷›½Ñ=`·wLÏtÙ½Ú(�Ï mn÷¯I4ö¹<©•×—Jë³ÕÜöð#�›§x�¶‚PÓˆMHŒ´Ú¸æ;oܵ˜:ú¶Â(0wŸ9†JóÑž/½1›yÁ½ÞÜBGójpÈ�œ¶¾µñP2fDÿ.}é[{†—ûS�:>g#Ûz¯dDU8ÙR’û" Ÿæ‘ùšz„x¸7*Ö§ã¾ôö½íìr¬ô(˜üŸ¸‰.O”ÖFsFÐ\¦4ÀApÞÕLÌ\1jðaóžq  iì»C}ˆ”‹o¦P§;r§KÓãýXu¸Qf5ô°?ܱ(¥ü�–®µk¤½È¸:bè¼DzØ+Ûp}ÞÙ»K÷gm»þ¬Š‹EáÏ{¶_6ô-$y¶[°¥7È›¾ñS�òî¼ÞEö¾–Ô„\ÜI[ñ›_9®ÀÀè3½Ž³ÌCO@_4„šúþµ©nA`Ù�GÒÚߺ۠Ã�!ÞI|ǵí€tEòHv–¬‰Œ£X!¿j‚ó`:1«rc’aÉìí§Î*>ÐoxžÜ(¶[˜ì0`…ÔD�4j&š¼/IxcÂÎ Z¤±>°H �z³]·u,çh1ØÍýmY <¹�äX¥ï·•Kê ìi Û;\Ž™‹j0¤;I›à0 ÛgÅ �6”Üտ5^Ì/¤‡Ï/68­oÑžÔÈW8£Â$ï"®ø‚⥆0˾Xñç49­óöÂñZÎK N8ˆL-RzÞÀºß“Îß’IAbŠ™¡Ûù¥ƒ.Þ†jM-�ò*­$áàçnY+þÐ_I•oqî&éÑÃ÷Þ–MfY7ÿN3½1�zˆcåN¿.!¨sÂEÉ ÌÌȺ>%œ7-†È™îŠ�ñÝëƒ{ ³rK\ÂuãJo�½åRŸ¥_’†ÄXÑsÍxʼn[GDLZ©gH‹ÚXÙdê3½ÐÉWòC>ukn>Y9“Ú^r(í¬¼·ÒQ!f#óæ–‡ÆmŸzöVÌÁc=»gk¬"Ü žé{Ø"“åî…'-è·E‚Øœu󊡞%e�»Î$žá¤Œ�ì1Z—*k>{b ”›:„Ö{Pº½¼éÎ -?ó«­ÏÄ÷ëÇÈaÎÔ™NÆ,Ü�!Z¨Y¬¦&Ô3» Øbåë%ì•€Aè«öü¦_â1ÏõtVù;Ê£|cR¹·*éªGÎŽÏŸËÕ06&!ë„æU«³Ü­xˆ¿ç¡š8R»ƒ�vnØÐŒ¾l~ôs«{¶ôÚ\Ï¿ƒšúØ<~à·/f§¤¶À· Xë˜Ü/‡.â³Yi]oÌeB�©iZsåc^XW¾kfÇä–Û˜@[-!wݲo^S¼ønŽ¥$]Øš*€ã‡mì¯_²­ïͶ¶·ªp5~k×±t $9š69L|IÂÞãSåþÜzäÕ ›»+…1(Ýõr×oÞY ˜OŒ8ÛØ06AÞì­ŽÍ“u|S$–M7ôA_ÞÄAÓ.ƒd ¶¸säu~j<±€ÛƒRI×RÞ×,êfÎLj°<ÛšO^UØœåóŒ¨.µEø¨ñXÅÅÇ^‹‰ÛÉå~Å…’}Ÿ¹§l %;+Ðñ-ù)�ÙÏËÑë'`ðÜnSôB+²£7sÊn+ïq9Íãv¾�9:œ#y²î´f`®?_;e¼x^›º¹–Ÿ‚AÅ1Ã�o\M§YLEÜê²ù ¸vqex]Žg)¯$Â�ß±Ñ>_JTm‰¼� Ãð~ü&ÿnÐJ·SJ¬³že”K??"ÖW¯�ùtàçi›v¦�5Æo�Q|]Â#ÆÇ&Ñþè¥)JW8•Pß:ŸÀt#BÛ¿“Õ—J³r­¯\Î÷Œ/¹4m¢{ÎÝÚ˰ô·»sti#VúÐëèñ;­kÙð ÷:|3RÆ{ø´|™�›À#¦äÃ}:/âhÑ6þÌoë0†µ"|²õ$~Ét.اêÓ©LéFæƒ :b±‚á ïˆh�çûâQ’éûµ ¸QŽ�ö;Ú¦€pv³S>¸Î¶ý¾Û_UøÅ–µ…$9�C èK%úP|kÎ� Šw“›@V#µÏ O~û§ï-zß^,ªA‚Ïvݘ¢Ýpƒ“cª³ãh¶œ‹MÓª1Öê¸I]LÃÅÝЪý¬Û«o’3¡F MŽ!†}DÃgÃ(¬Xö»³åu“ |Å5Ö°@Û„}¨ÏÃéSÇG"¶æ|©ÝZ]öéÈ3vÑ»\ѳSg{xzGj–·ŽÁ‡ýO9â ¼÷§Ðlœ�+V{¥`�r3]ëõ©O·üì�Ï›µ¶ûf›¥ÌD1-Ž5`ù˜…ôÄ@…ÆÙ â£"t5R©·çh‰’R²™Ïc̸i×-¥zæÒqBþU ‘.ZüÍ^s-‡â\¡ƒZu ˜ù—¡cÁ^w»+Qâ½U…‰ø›(‚‹zAž³�¥'\Lt?Íã›Ãµè^¨U6Ù÷g<¿Ë=À|ó“ÑipEÄ žzmúè€N_P-,¿±{`êä Ò»óèà/ýµr‹Š€¼{¬{0òþ!@†ûìý_Žtp5ërs/«Ù‘3ޝ(Ùe‘¨ó¡DQÀUËaK«âÃ6ý@j7|,—¨{bÜ<8L;œ‘ ÜG5’è@Á™k,Ö{¹h³§Ë߸ùøØx¶‹‚œÁ꺇”·ì?ÛרñÈ2_!ýï�ƒpÖ‰âU£=~’Ýo(ˆPÕ\?/mO° õˆÖ1p¶tNìÿ[Š Z@á£í�¾¶V‹†Ni1²‡ôDñ²ûh×r8‡'YÑpÎ�ø͆¿æ¸—„D©`úZ±m1@ðü¿ßf&šÓ/ªÆd?l¾ïj�k)jy×J½Ÿ¶ð9™Ÿ"öé=žFRk¸N­–´Û¥À\9‹V(ÃJb´'�Õ6{¬Zq]õal=�\Y˜ÎJS».Ã6Y±öÿp�_^î-�oE âÒ�o{æª"ü¢œÊÒMˆup£Æ ü„çé—¼çòðoƒ‹eù3¼| S£Ù]BÊR÷\~ æwÆ^éq Ü£ËÙŸ:ò£Áî|µ}¦¸?í�hæo ôß×É}¯dÞ>žõNŠ<›¾Ïdèßo¯�è۷֑Јý¶CȨi«Ú=e„‰‘ée®ÝŸQc!À\atȼ‘î¡|fÂÂð¸Y¢¯¤æP#¥Æç ‹|Ì}Ÿgî1Èçx3t_²Ý;�¾\Écp…€¬YüO†¾p¯°&ÞGB)¬.þoÑ‘ö°ú�Ù…Ä! 'çea+€¢‘sËâÍÕnŒ‚*ñ°Gü*ŸdŸg;�ÂX‘å†\xZKÂèvJ’!©3„ÅÉ"M®‡ë:¹(oáb€ƒ ±Žd¢±D¥ÁHŒP•°}%Õ @DDt>Ý.O´Ã³Æí\no«@ö�ë†pi%·~Ø1�½£BÇœÅö F1U@wž´ðm±çA‰‘4�“c¥ƒÎ³‡p€úl±p͘¸2i"¿ŠŸï^áz" ·r(+�ží4<úËúæõ™²?Õï¾Ì.B)6M¿µQ¿‹fjî_Akººž$F’,Yý£æZ2(­´ø¤þÄ€²#“ÀîÌ™#{d}ÅËY¶ÒÓboU‹Í‰ßA\wòVk¾ Fãááþ<»j�ãÔ™ Öé`„ nðÝf•½‘Õ7ï^0o‰6�®wö^>˜‚Û=´‹âý³t K&§&€o8šªÃÄ7¸¸Ü"®ß.ÒPóÓÛ=ì\!x…T[Бêˆ, šY,oŸ&Í,óYæÊxö#gÌPçÅßÇ _¦…ÓO´AƒîÌ�.ü¨«ÐaDAãDmuF3k=o^¢¥åõS„ƒ‡>ñg»ç%šÍ³›%áP-Âðƒl‚†äæ \Â5‚LV‚ÊÙÔáqK�@Z=ˆ!•êvÁ"�b®2k2Zº²jó ¡ Ù 6 ÷/–Æ-XÝ# b]¢αF†á›¥Fx¿�êá‘øc-å#·D¼>x^º õS|ã}�?|øœÖ�לñy¾(Ö?cáS-ÑuÕü~àõíŠxÞd¾zN••åâ»@Æk¶GÓ{èØƾæÖd¬$ËÝ,Uu08Gd¸m™ÎÃŽ2ý WƒÆ¾ ãúõ;Úð~xÆc9;åZfØ¥íÕF¸6€gš+–× ž�pÀþ³÷L_O@ì•Ú{†×ê­4'¹#Ž¥ñ�õîÿ»°]gTY¶}?Dﶿܰ0óâᾕ{®9ÝnÕ�ø¤£&ß*õP¬Ð„ͦO}Ǹ8Û êèšØG“+‰ÔE¾ÆÞFç£ ¡N7yÉNŽ™«þ,ç"mç’¼•ßà1gÖ±qqåÑâÕˆ�3Év¨¬i�Œµ[ŽNñËRnÙJÖ„þ˜Ýj‰‚àú‡íâÙY¾+|S?�Ûzï>€ÅâVÉ«Œžž{$; ´Ou$æ³Ä’å_Qƒ²ÃáTq[A7ä’5t’øgu3³fø×b”Ç*ôÁšˆ¢I\W �-afÿ¥ ²ÎÈ �¼bE�Œi˜:A,ƒeQäŸÁñn\b}*Œk? •<[KÙ߆ÁüWŸ\ð�%ƒßš\M°î˜+h(vø,€ª³n9¾Žˆ‚ÇG1x}>ˆ4»ø ¼5™ =…bÞì)F—~$Øã!–œJöm=°>[¢`ºùåö8 ‚�xgÎîøøGxvûPWЏh‚î¿&\Ýšé?Noo¯eÙ~ ?aá�g‘Þm…µs²ìo < @)s�ÉÛ¨¿~jÐlÅ‚“w{&Ñ�‚&x¯�ô¼Ï/çóU[ÜãÎxn§·®(™šrÚ”·Ð�¤Á¹;N ‡/iTSí´›“=ºAHª•#¶ŽH}…ݦõyk™~ã0+‘ý ʧš(/4�Øbõ kÔ�¡§àc4[ yñðì�ðÝCÏëÍ¥/®vâß0Ðd“îÏ…S–è˜xÃV“Ëëx’,Äå`hŽÐ3íw˜ç�ă2ý�—ö^Öøïò{ÎJƒd?‹Ü߈Ãå;ZÝ›ŸÉ™ka IË;„uÏ­ßž÷lß�ºÜ%9~Œ–Šú:tåï•É|‡Dî‹RNvÃGœ °<È4°nïÕ«…ÛqœÙp–××â«_|w±��š ÛoxÑý#ËyDåÔØÒ®œ–7ï:8•£äð{œ|;l:ùùè{{ík4 æòÖ¸3''O‰:ØŒP¶µœˆ‰H÷EÇÍ…7†Á2SžÞì»À—ÛïЋ·+Á´ìEŸŽ1V‘aqÆÂZÝmŸK´¿cœ¿Ý�ïÚƒàÔ�JsÕÈÀס`[Vs7>2倘]ûÛíjKÉéàZëŒU+²5_kÁ‹Ö² €gµ D{jó!øÛ�[YOÖ\»Ç'Û ®ÿT4ïŸ;z•Ã�³ÁZ59׺¯YF·=ñ|D¾)ÑÍŸOÊàós‘2ìZrˆz#ð¼±Õ€H!cP#yYú.â×\†6ÜìwýÌô¿G{™î ûlR&1nÈéíù $ ÷ðPF]mØØk8¶äu1焾›¼‡{Ò¾¹ö‹cx¸Zñ!ñê !s5«í9‘¾_�°tV[­§ôOÏcËŠVÈ—7K…4� aØsØXvçÅC°M~<„-Ì2>8`\š¨èàÑ©½©�éæhç„•.åWãKB0å­BÜ—kÅl[ÓŒî³M¸Ö5Ôz_´oq©njªú’›sãÏ0Οwž^ö«ì}$&0ë¿/¸Ùû—f‰Åˆ'ÓÏä¸-÷½�°ïö¥fuÂÏ ÈÛ Òü`�ÛKÁÁË‚nÙ³ R•ã‘•As(Ì-Øðáê{¾|k3ƒÕªî׳B“Wß/ØW {-DBV5í†×IÒi²>,Ü"™ò÷~!ØJ¼Õ÷{Ô,mþ»qÚõQnj#6¾ òQq˜^ÉGîKMùËPd)Ф‚o¤9(¸š’2a°ñ*˜²�‚ýk7³íêw\¹d«©ª{©êáÇ,$,ºÇ4áÅé�Œó³¶ãj=âØ|¡ÌäþÖ>û‰—.ûîoT%:Îm*¸hîÎ,Öä…Te2ã�Kü¸ž´/º·Wâ~­�~Èw¢Ò篎ûLW(÷9•‘p¶&pÚJ?¹®è„;ê|MùZ¨Ä=¬í‚…0¢$¶Z|Øva¬C…4å¦F_C�ã-¯–¥[ß$ #”8ôûQG@Š"a&Îaã4žøfã`W¤{„5'[ý܇RdbÔa” ½…Y'™¶#!¼W›áË)�A†smçÌæ¨,²·öùŒXJprŸ„·Ûföoe›T� ÏH±WÅ2¬vËq5E~äRp6À­p¿?£ƒ`˽"%]Ä!çKšF»-&H58›±Ùÿ%À³–³�É(ë|s“T½5´|­ËŸÑb'äÓ®ðN–ï%z8!ë½ÈÛßÍÛ2g˜HÉP‚Ôµ1—›`ˆû¢vFs±°.è3U›§·u¯WãÎ@šœêwÌ~nÛ‰Û¿ÜÜ�ÒAtJ¼ÃlÎKY è¶ß©ÉÙÝ-Rïaõßá{XB„H�*7£~óe;K¹·h7À»Âݼ˜º)‹çKƒ’Ç-Ö̶¥Y‰�d2õp[ih—“w²&¾V•" ó”«ãs!Ãrmç(/‡¢×ëØ‹HÙUR@«þÑ­iM6–·héÔ�€Ŭèê.×l#àñ°B‰»€ž×&Œ€'y¡\¹¥¾ôhÕ0C,"‚6ò6û ¥~�‰ØRÀ%æq]7®JtyÃÓ'wHÂÇÆ õŸ:îˆzsV}ËcžZ ;ǵGÁrÂ(Ù=žðKÙƒ*Ä2‹ª‘ËŸ«ÙžQêÚIŤ6vè*ÏÂA¿{©ú "òÛw£äÙyÜízsÛ­�_i1¥ëãØõˆ4y˜¦ ÇO&å¾}M6A‚€™�Í­£cçw*.âV¡j\Qž°Ø{‡jDzìÆ@u\t¾’¡X3ZÑà­â¯Öà0X À‚u T�3$Žݾ§ZL‡2Hai̵M¶ùíãcš�à,Œf¡7–]+‘†¼9âgÀ¨¼dY¥-¢�ÞT„ò ߉ \ª×†?­.QÌ£–s»&dñp¾ÓnD펬Ð�7 ñ¼"°®UM�’2™KòßÚ“‚�E¸‹ `Qöj¹3|=t%üµñ 0'Ôë!Ö[â;m2Óè!ç»|Ûß+uÖ·ƒìÇ%âɤw�¾Ug#·]Žx(¾ïè98 ò•ò=µ¼ƒQÜ·©jÄÓ"¥MHŠûÆâÁ<·×Ìç¶µï M‹”’A‚ðÌŠñ‘øgµö¤xjtEðÈgUyä±pºUéÏŸ÷ ðQäçOî¿çÒòÖ«w�>¥oVQ5Ϋ½’Ê€ä¹Ã:÷ˆ Ðq§ø&>Q£Oß;s€Å8÷¾•°¿Ý\qxx«â©qômØà¼q™ƒG�sH´Iì^àì-§VÎw¬ýé‰Éh óaYÝ>^2Àº.`)qö*ðù"j/¦ÚÞF:Ó¿3 …|úú’hóuÉ@&& Ap"ÏœTr¥�“QñCÍÊTµ“Э¶gYÛ2|¨å¦'ÒÈ'í÷šÐû0“:0¹ò™õÞ*x{º?�¾o›÷g•Ï`αäãäÂé¨ß0¶{�º¼dXIÃt?´õSÍÀ‚=¨ì<>ôó BÛ!<{Ñ ø/€ÛjÎc¿HYðW”ÀÞ§~{™É_ Ì•É->~” =ÅZI[`‘5Ç“QØ# ¤âë È�"Úê·ç7‚g.•bï¹ýU”E©b fÊXÃ…uÐTц�P“øÂÑô"Xw‹Þ h?B¬°êË~ÀÙÓ„3oÞ¥PÀHôDá)U£]�ÁŸ^Ž?iT»{ät†Ûš¾ =܉RÃ(hJw+vqkÙm~Η ×Q¾WéøÊôÉ0¬·nüÁÕ‚ëó³=+ã0;¹ ¨Ýö¬üâgS`÷Ù>¨SÅ“‘‰†cw×ø8Ë.aòtÖÍ7ÂÈ»œE`¤·Îç*Ü À‚ÝT^"SѦø¸Ÿõö'tƒëö•Æüœ‰]4[ét»˱ Ù·íe+y¤â_í>×#"a&ºÆï �À·*zl‰Q@‹¡y´Ùv‘&ŽP{ý3�2ø±H»J$Ù9ƒÑ`ˆl<ß°·Ë;‰­d‰ ôF›)lØwoÏÒ�7.¤­4 ˆ¼þÙÐKr㟠{Øfl‡¯:½*êˆON ãSpdB~3  Оm•¢rV¢ÖtÈ}'`-x1ÛI ä“(ÎkU^ZŒŒß³F5îß°=û?‰ÇÂw’+ÞÞ;O›Œ�d úÝV@T;�KêÐ>&ªÿ©„2|ò¿ÖÕ§¾¿i�w~2›„`¯ylTcÖTû ….�çYŬf›¤ü™ííÈ>ƒ( A„:±¿t�²Ñì2C® Zˆék³'žô‰ñ:iÝ(Ö…Æ ]k¢z[°ßM‡ž­{§°ø[÷ÑP^«¿»ãy8W]QÍz·ÂJº+ç�ŒL¬”‘ÛÇcã¢ßµœd®ã¹D¸Üá–|MAý±•û‹J ØÞw`•ZOIYÎQÌh<Ñ 8+2…öÁgøË‰¬60Q2“î�ºk-{ÙZƒáQq�<é¢G<Š$V ™å4Æ‘¦ÐnöpÖå2•±?ß ³·ëS >ƒ!õÈÃ@íS*Z»J6ôA¿0Æ?D©ÈK€…ý´ºïÕ‹5H`Ér«í+œ‰{ Ê��Ö6‘ðsHÞÚ =úÄÔjá%† %e6oL$ÄçD ÚYÙ¯<ÖÊÝD«”‰Ð(ò¯ì¹¦r|¦¿Fpê¡BÙR‚(£ˆü´b6¤o¶‰qŽ D Æ®¸È #z±FV7çfj€•ÜÚ*×Tñ.ð^dÖhÌ00JøD#£ƒ6˜PÚ’^ —gsÉ~I›{«.#Á3p¾ï”|0�ð8‹Äil'Ó`?½¡®ô¦ï#á¬~°.gÏÜ`~ÝÛv>£‹áÐ {(°»ÄQÊúŠ*Ôõ¶Y½ëã_V×¶®‰IEa 4Û§Âáú ‘7OkšÝhF‡GJQÜu$2äç¬Señ z’'l½µÑ‘NI€\CÖËHjæ'£9ȳ$hÍý4ucðJ0à€³XàÚ^“ëfí¼!f‘ˆ¸œVK~Kz¸\•>{Ü4ñí«r`Ç¡“ýŒ_äøžöèÅûÐûsåßööxÔiDÆ&ìï«^£Ò!Øîo>pâb0þñ“ÖŸØÖÍ Û`”$$÷ˆ„`³¨m?4ÆÝà€�/ë퀔«Å[ÐùøvÖ9Hö�O+’XÚHÛ!]ž@{æ}—¸Æœ³èqU×tij< R„�Ú'1›gÒƒœjWª9ç–á=sÈwÙÈ(xÁ¿ j‹Ö£Õ¼ðB¦LB¼f¡ëç-8vr� 7?Eu÷5�{nL˜/§âSÎð韈Øö.ËÜ—fæ>튓ªæ<?…nã[ ,T¾¸[âTÓz¹ãVKžìÍ߬Z½Ù1È£"ΦÌ0¨áà×v6<Ù.¢YÑúÅØƒYŽ~]Û×ÝfÎ öÕoتÐT—ÖÎcîÌí²‡HtC~|�ZÂðfE;G¶øQÁo/Jk2]ÔÌ…€�.à¡)ô%±1° ¸Ù/òž÷ld´¨ZÀ@p¥j¾¡â-YpŽÍ-09©q*»´n[,$åÔzÜaAañ¢ã]³Ç_lý›®û–AyÝ׋þÄÍå=t”x‚Q˙ֶn@÷Vpˈ‰U`óð&È×1x®%Ó‰¹î3‚Üi®†ÇpaÛyª™«Ï{àpO4&·´ÚödÛéQè5°Õš�oáß)¬Ó–œ®�¬}\r*$¥ZQBkið¿%Úñg6xKÎûÉÜ0<}h-†›"åaÅ÷2ѬÆ_î!è6è�$AÇðéÂ×)tØèx‹¿Ny­8ÖiR7ÖmtC¦«=æô!d >Q‘l#Øbà"Ô vâ¾ùÌK5m[`žŸÃÂåÈ'î,./t1n„ ç¬Þ*DYµ!Æ]`Ð}*”s1ô@¾ýØ9HgB¸ë�ªyLc&ËlÜEØrŽxöA�µo¬í5Ðú×,‡ç¼&ï�æíÛöOH�²ã¡ ȱS1ƒNx–÷’p‡²dgz6Qî8hçƹØÇ«`µÛ#¶: ˜-ª&Îõ+i…kŠ‹/ØÉþ×yœXµôr§éß:‰Ÿ¥µjxÁNÐf>Im|Ûˆ=ïÔûrÐ×çÁ�ƒCa²è° ³S8#A¼Ï‘�’Z°‰’ùƒtqØFójí¯&8±ä2_ââ+Ç<¯ÖcqjEÕøÞ_¿%Ý ÖU8Ú¿s»ùC}|;`£s‹h0‘hJ2è¯9Œr:]¯e-¿ÞmvLF°SÔ<–Çi¾Hå‡m꺙QÙ/Û„tJ]<ˆ tQÝ]X¢Ýd¿vÖÖï¸Þ'{iÜ}Œh¦>Ü%ì!,jz‹ºó¼G‘>vï\�¯’Û (ãcá+Wˆ3 F|›£c_ôFHÒBÒ•f‹õÕxN²î„(Êvg;d|s8R²üÈ4n¯›?²~[ïTÛZ­¼HMšWp0U£ýlܶHkùùU“K¾�ôÀmhƒ% V WtH· {GVNäLw‹¾7/WP« ŒS(å}qš‘lfÎ0)ý—8(ŽÈ[}}jáå‹›H$!0ðWÐÙVd…Ëî{†Yï4›ÁêIï³³ �ð¢^®®[ÊÒ|øMä~´`>ïQ*RÈ“‹ƒM mš~W{�*©±tçäÕêüú²6íösÜ'”èT>ÞÕ/ˆà%¯áˆ-<ƒª¬«ÃöõúÕÒW9›ä$ Ì ‡3©°f0�f¿i�ó;Åf¹lyr8AÃ76õLÑ»€ª>·óE½öAs“}Çm¾F…©:ã°oЏ··pJëØ@À]ù2gKÁ•™pNL!AÔ1aDËÖª7oW9°M3&Z Q¥6¤“ä,F&cÔõ´L@ˆ¦eøì*ôg»Z÷Ýó˜jÒ<™êž Wn²­œ¯�ùV ü5©]h³¡¥ï*Ѩi¦�%oê¢M7"êÛØÖ»T³Â-‹±�Ûz…ýpŒX44Íç¸hƒ‘ås•V,âÖh+BÅ|eÝäÕ­mr«Ì™) þ ‚ãaßUõ¹þE¾<OæbþJÇÇ#Ÿ¼=p[°�²ëö¢ªCÓPISf™òàÐÛÈ.0YC3,\³~9:âÓ.é0Ä &ÅìÚ1ê¸6Öp§j�K'2á˵½ŽsóØ–ÅI’Ѧže9²°NΈÔÌõò¿Ük*�öË|úÓYól¹*kC #cÅÌÎ>«ÍÀ~5@€Œáöx×ÞìKôy¦µ½9ªý!m‘—u¢›¼ˆ‰± zùe\ãw|x›´+­�n(÷ÜdzF¹\@Õ*ëËoM¹²ƒE˜Û'_bS¾Ó•âr\¶+±Ï^¿—ÖÒ½XÑ`uÙŸ —9A_VôÛ�½ü€QRÃëÓ€å)JÅYu-‰–Á�ä+�–�+’·Ö·Ë2,Pûíýu­lÈ8™"èú¾ûTñª§Ã÷ŠSYø™/Ò¿Ýf¹4ùMõÂÂ9Òàã|œó–Û¼Ô5ôÌs{ˆÕcã–ˆŽHm‡­h!°./Dø!Å F"èóÜåRˆ‡DÚ-ŠËq0ÙËãg\mFÍf~àqG‘Þží3m _6ì¥ ìûŸË ´í¥²2Á^§­ßȶ¶Ð!{¼Û´¶ÖÌ»gâg‘X§½êúG kJ 'çk\‡Š›¾O>q°b)‚˜.¶úOvdÏ›$²rq„Gì�÷–›Þît¿ªt7­¹5ÐÙàôDØn$Þ2Õ~ZìÁ«§Ÿ‚Û8W cÝîêÜ—å6Kwín"ïyÑÁ`¦Üã!)Y‹Ó›uHÀÐ;T¦”äÚ&[“Khê?0 SžcØ·Žùšƒî;êÅΙïÇêÿ%w?Ý@)ôÞJד»¢�bN½×�nï{1„|÷Z½ëšëôl}ž­ìbcœNóȪšI�:«©’–ßIÀ²1>É�ÊžÒÈ—zC¾(îÿEŽz'|rŽ¿·� OúÚ$RЀ…þ?T²p@t Õ=þÝⵓá� L˜,46$üèl­“ñ%”Æ&}\Ïw -W·ë¥ÇåõƒæOÒØo‹Nœ×…·Âd/é ÎWä�`YM9ÑÝÔ�H¸xBÌ{™qÁ è?—ãÂ[ƒ°þ›U ΢’Ï1mìù;©¶%ð•ŠCºš.‡o˜%õŠùr‹3‘Mºý«¥/¤ Ó»™Nƒ¾ã|6Nô0Íîô/½ÆÓ%~^È|Ðæì)êæ7OZe%%.x(NåèÚ,÷6AÌ�"ÊA³Ì׌oú~»ø–ºx›YÁÈñ¡/ûi€V§¦_ãD½ýá�jû 0 : �€Þ‰áiܾmÍ Åx2`Õó%›º8 ŽîRwÑ� ]e~ ÇÈÑûχ\Þ6o‚ Ê� b¬Ü[�äŽõ·ª‹B?Ð ¿bÿB4;]sl>)Å-kb—á³g]ÜZʸããPq“Vëj«§äí-Q ÂlƒnéÌœûê+33o¼�ƒå“6 NöÂ`wAïÌ{ú×8"œúO ’ÇÉ÷Ø ¯£*aE¤FðN˜qˆ(S¡óDØh%éõË—d ÿ¥ïìú1¿êí|¿ÏK��|ªk©Ä]Yþó•ºí“ÑèÙ\Áí£·¹�夑Ï6u=·Ss/˜ŽcŠcÉäúÞ M'è»w`u}.ñ¶Ëœ1~¶ ˜ò„·ÎB·†({ž9�êíjRóZŸ�žƒ»ê¬ÀÖr=ÜqËÇÞ5›A¨äl/ÍFÙ~˜Æªx—­*C%±cÖ¤­£呌>�PÕ¸ZÙ6{ÑS5Qf ..itphÖ¶`ü*~"O•½ë[@B„h¦"†­CuÅâø W¥ÆÐ™Bïp\  ä„FÐÑŒ¨3íƒÚ _lçܦf÷/޼K¼Ÿ=�W�5]ÑHÂÖn%& :Y�"`oÛïKëIÜn–Ã� �˜æªàwàóK:U š"}МbO8£ÌYñ˜<éÏ» :2Ë¡µÁº2ö]Ô¿rüÝUô–Úžp'ð�Bl‘æšãa¥p´¥Û ¤gMUÎ6¬ Sj¨¿½˜ƒÊØt �’JÔ—0åéJƒ‹d­6 ÿ ƒ°ènµ›ÁåÂ:Úîþ³æL]™]g)I«ý¿]f�oçw‹i Àl\ØUƒ8ŽìœÜ΄„¹;º\©5ó†¥5w%Ð:×ÌËikQ#±V`(�z/Ť×[—Ñ­[*H£ƒTWN1)�„jÖ;b@­whSÎÄ;­ˆÜ$ÎiéÿQ:Z<ÛÌv§XQ`~júQ°Çƒv³¯x½°@°pŠPÄ6J kÀtý†½ùÄÎÜ=£ÔÖ}ÂB¹¥Ô`Êb; òêK�QÞ ³zµ÷ìˆ júäDax[¡½~#}?•zÅõÈ¥8_$¶áæóž*~^«Êñݯm}¨tíîfЫ-a2k‰ý«Ži—åW3‹%³Ûüf£ Éës˜|½È°þ¼C$S„ÝYš¦‡ÊsL–;¥»2ô¨wõ1òð·‹�«¼ÛpF;X±œÛÌäuqœ�YBšI*(Á½s€¾/ö𷉊Ú>Ûӛܠ9\ðžµvU{oó‰Wél¬á1Ïá‚[;t<°o¾Ùü-<™|ÙÍg狹ïïšÐV yA×êÞó?Û(ZÞ½â[|/áùIOFN!9¸vopñÂĸ9Pìâ –dµÜ‚,ö¼¬Øgè°u>>:�uºoX-…èv%~.Ç’Ãcϱ [”•×�Ãz}{¦·Ö+¹íúFZ¨ 8¾_£XÄæ­gÐ!Ȱi¼ÉïÖ[¸E›�²ö{—¶Yh=蟒ʼÈ.]åðþ¢Ä)‘€ë`ÿŒsçÑ�K{xÆ›G6<6‚Ý7:¹ÙBïuZ>'eò(Ä켜ªzv;ÄÃ')[M[w (µÝˆƒw›Ù‘Ãp4œM®Õg¢?ÛJWÒ-ž {%pvÜý[m¿ ˜:'û ´]¤Ûa¾ìH¢¡2‘é")Í{L2ÐVËΦkìÕt—öw‡âÛ¥›<;�5pÞÊÇlKÈ —Úy �'ž®í“T­Ìí¶Š>¾ªºA™ÞqÉŒ§yÕ‡?F.¢z¿. �§ÛÎ㸰s±»ò¾l56ÚMõÐ|\��¿ZÇfM¾'ŠHaB\¶ð�'»V±t{ÜþM´NõŠº‚Õ]ìvÃ?ÈÊ$È÷E¼ŒÐ|vâéLqß ùª^Ó¼ÝçLÄÚÔû9yã vö â ö+Í�ê{`YiÍ£·àr\'ÙWAØfÅÐØ£¤·ì¦6vñÌèj·w*Gn"·Œøˆi€4ÆŸ2b…Ù¡'Œ{ûP.n9›Ôç%͆rÕ.ºŠ&bëÔKÊX�:u‘Œo×À¨h…FwbO4a�E·ÀTy. o=�?d\�œ½¯vÚ5« ˜Nóò†»lÑ‘„¢ßØ 9�„q:Íôú¨›°ˆ´}qûo&w^txmÊâã¥`»«~§d�fÙ(_Ň,ò�u„µ\ðC\ÐjÝ<8@DHi:„Ù†èüï—ÀR’†®þ¾\›T‹.V°¸|J•â$†÷…²†ÎÍÃPŽ76·ß]s<Ï;†kúÖ{Eã¨FÀ„‡ñ?5€áÛí³5ÛV®† ®%…ÙŽëe}c%rSôL§Go°0V™¿¢(ë ÉÒ^ßMû‹ßâèZ°Ó^P-¿ËÁˆ×>�`¾õçõÁë†a³p´ —XKJ?VËÖâM&g/¦2ì`í;Ÿ°mÃh &Dm…'sGŠ%Ã�‚;áõ_¨05ªÐ¼žö Ç# áüü͈Ålâ+'gáþ§WD¶„íQñåÞ=°Þ4ä¡bkÎo>¦#Ä.›ë«é¼#†ÈwΠüý;ÇL; Ç+I^0±WÝ©û4Úr:­>ÙzX“ãÒâ�8§–²8Vu,RBhÂaϸg'¶–æÄ¨­/�¸C@ºàpÂW¾Ã$FçnMç³–�ßÀq'Þ)¡ÌbùØ= 4,=Bžó/ôþ%s»fÜõº’¢$Þ†´o@ö ˆ\CÞµujöÝÀ™;‰z�’“M½y«Ó¾­iûÒæLÖ”*ð9y ‡O�0ýàU e¢S1Ê6¶×:®Îi@ñap¸)�:6Œ÷SÁ} rÙìMò«—E7¾ w–k\#uczãß+>¸§(1”Þ£ÑÚšmÐy\÷ ¡´Üñ€3`Ž ¶)P-ÓžÙ‚w‹­’_ðÏ)lºh@kö>.ÚŸY½7)L=1o™×1X³Ì€ùÔ¥SíkÚ—…œ) xŸÖ¯ü¤Ú#ø8Fòêë–ÃF NAÙïylØR7Aw-´E™±«|Ë�¬kRÍv×Ù-/ÄÉ»(0|h8"˜©cñ2~6"Ÿ }}…ÖÞüÕËÅ2gµ6Ä…Ëñ ç}Åúx¬×” CgÞâ6ÎÍA"zG+õAoҘɾ«\Wh,Ú‘ a.{S~7!1ÝÌ3_B ·[â\`n Öý¤Üj¯ƒ°uùu,ËÕNò䓌Ï}§Ú£ ǹØðê#»|Û@öo4QÆÖˆWâݬ ~ çÜ—Ú݃îè¯LÑ�Ž-,À7»ÚÚ {HŽÀýDêM­[\Pº!R�ëXhÃ6pÓ|- {àêªsÉP9¸ZR�Ò˜^ŸêÛÿZxâù’D¯åM1ö`ÁH‡cž6ØÈP!^âfÔ~X½íf–¢A}¨ ù7Á;RºÁQ—Öc�Mo)Wª0MÊ`Ðëq ;ú¦fDGÊY¹Éä»bƒ\ò op' ’‚?â-¿Pýžâ¡¹œvï­kçäsëÂÍÍ�wc1›ˆŒ}ð3¯ˆ£›Çû北â£Ù»¡Ѓ¼ìr˜nábS4 �[2]×™ÅÚU½Im'o&ZÙ‹+ªÊäÛ% ™aº­2‡ç^2Æ 'štaÁ޽XKrä3•Q7ÍÙ Ñ®é¤{̆ÁDá6ž6é_â.•8pµowë()Exá-¶i…£,§×Û“tŒ¤Ófk±+„:8­lìæù¸¢Ê_V'‚Í·kN£ ØÒÀ8Ë?¤lŽM6‹–ÀŽß¯+~�®ÏµÝdÍ“7PÊBw32cX …GÝÊä4—,´µŽ3Ö·Ý~ œŒHU‹ÖZÚY9Ë óƒŸÕä<ÈÊE°£gÓ‰Á”…©ÁºÛL®Ý9/ÜÚò„�Óqï<¶ï&ÄoÆ{‡‹©jRAµ«(L`St‘â\1b Ň«¸�Ž2åLöP”p=sà‡i¼zqˆk�>l›çªöÀßsÖûžÓŒó¤ájÎN1„ öeÐܵ“É�>Z1ªö¾Y¸jöwVGöØ9'æ$0‚4î”étˆ#lò1Á#”âá5m�×e[uóú÷s¢Ãåþ„Ѓp< dwŸ¼OÑz³OÜÄÑÛÚê^5Õp··h~.üfÞEfÙ쯆T¹ÁƒoX]Am™=´ªæ 牫G:ˆ‚niŸ—%Øì42�æ;vÁÂ�Æt[Ìm;3{½ËÎxó÷ŒDvCfÝúa_WÈàvB#æ‹ÚÑù •8ó¨Åòj¨Ûðn Û¢@ab 6¶5†_iqkÔ­æ¬W²Å=ö6ÌðȆÇ9Ó’›¤†H­®^i}qâYµîW2;9 Y®È–´ï9è°3 ylÚý�AõP–qœåi�t¤yfí¦oaüJOÀ'[=Ÿ&¨í‚6OèKÁ/:Èš½ù!Ñ·"„4µÚSp覤 ê¶NðUC̸ŽÓ¹Fävš‚ÒQ�4^S¶Œ±À•ƒ tX ÄPJ(9R½¾�<ÕÐä<�ˆ¯>õ)­»âܼM=»¡í„!³ÌÚñ5)•Õl—½GíÄ›[ŽŠ˜>îg—ú_Ñ2ÊZå�ÀÌ8‡ÁîCÞãg׋—ˆ.rŽÏ Õ×d`KqK…ÀÇÄ™^‡àX]ù¤~òš\ÞyûPôË*¬p3§hù:xñ«;JAß%v÷†À†åè¥o#Y} �1¶8túÏû™õ(3ØÀ$‹\ø)´m�#öÛeLk3¥Í{ů1eqáºÌÚ@, À{Ñ ï%Im¹hÛ*K׊†ÔtÖhc4² ‚Úµ‰]©]z–– ´.îÐ¥NÁë\ žXpyÍE!XÌ'>`Œ‚BZÙq†çLæ9L;'÷SU�SmØoSWûzÝ{k1„3üÈ¢nhçO<€K¹– —™fq;¯”éÇQù³ ™Âæ” €èäøšôY”®GËNy£¶bÀèá(CbÉí-ê#2Lû¬ »VÕ«ÔuÁ<…ln|¬‚RÞKw[#fŸ¹E;\ØŠàg5–Ú:¾à3mÐí.}ì>÷úÌX1�Ó åÓa$mîô :êæf'îÓ DÁ-&ªc|Æ@WŒã%É�ߟi–©Ð†~Æð6Ò°ñåóôΞfÏ@[Ψý}àC\#»+ðÓX›ý‡ ºÞq³RýlªN˜,n8LHζˆZ \é±ÖǶ/y•ýÃÜæoÌ?§Û ùëÍdO(Õ}ÙF«àëãï;,Ùyˆâ(û¹ßlfñá“8ÕñË©¥IívÝVöv8Oó›´]ñl“Nĵö;�ÖòØW1²y"ÿÓ¥¦ K8>÷Ó4–ÛɃ�U^ +JdBr· 2ZüŒ|îë…¬Z.˜–»¯8UÁbرË2^~£†Õ⬣íV#ñŸòܵåc Ú#¤ù•sÇý)Ó†(a§®×0a�$°I){ôÛ ­«i°åsŒ„,Þß$Jfg}d¢¾!¿.KÏGÒ·=™°SÙ ô†ã*`åcÜÄÜ¥›¿d¹v á§îÏh²¸w5 æØ¦œs³í)’,Ë+¦ Y´*>`ãs+¤Ê€ûš~ãåÀ4_VÈzç>_h‡ð=¦Og0L?5Ç¿.æØ »voÁIFÁ”hÀQ`�7ns›là¼)bÑ#®µï&âä�ìóÏá8¤vV÷×?¯^‰æNP2=½¬õàÇŒòîSÅ€|µ¤¢o™ÕSγhEÑ]Ón|5Ä’[ 7ªÒ�>Ö}…b̧ÏkÕ�zŽÌ6;%ŠÝV§&ío \YÖð6LóìfwŽÛ Ùàt””ÂáÌœh~¯OƒYà ®NÛ³¨©i(Ó¸: mŽåÜ2M)T=»Ú…åóÍoS#«ÓÖ ñ¼K[·îÒ5W°×Y¡ºïpï4é̉³Àfw™n,µ-Û³h1YŠTÆ(ZŸsº\[5 iÃqA5�¸géÐúÏ»‰C/Ýkê®Þ>aôÏÆ.Xþ¸k}E�µxîEÊÖSí¾�w ãm <¼~ã2”ÂoŠ2†‰bS‚n–�|wbÚãwŒ­¼Š‘›&t(2+�(ò lCðY4È ko®·Ù/Nµ’À�8?¯3�³òDmVàÃ2·$¯5vÑDò\Žo‰|eŽ�”ÕzEæ¢ñ†ý.Ó^ZΤ¹†Œø1, CÝMVÑk3ùÐbø²ZK¦‚ÍÕ2­ìYâ™!²T„Ìš»¹{' á¯ùQ{Æ*Fö°·k·.‚€Ò[àB7’ü@‘齂$½¶ÅŒ6�¹+Ç7Íô»NØÏzâÜ­ÜLŠ©Üx(5Öô—Ø;ï‡uêŠ(¢ ¼]N¹×æ2¸ìjáÞoî>Ö'e !°ÞË­keC<¬|¾™�ÇÝ\Dð /ByÚTl‘®}}ÚÀÝ¡9²]†FÞ«®|§‚¿ª­o-.î¯àÇ$·Øcwè³&<‰îPJæZtÏU?jy»Óâýï•×ã½ä+¢ü÷ëµ8»'žØßˆûñóâÈG±Gß4~^¤¨�Œ<ÜhÇ1ß5ϯ‘{wKðù±u½{ØÓ?� þÆúÆæÞ9[ƒY`ÃŽ=â<;>Ä_{ød5UÓò�Äo±äÁ›‡Ûžzáåí¥Øüp,7í_¶ÚÔºÇn’"¸êøSzLJx/³bš9vsŽ`0ñ¾µ®¢Ìt}¿IÚ5®Š.¯ÉâƒJ BkyT ÈEÿa™ 7ÝûÄ�<§påIŽâ4È`Ä€ë~…•¬\Bþ!ÕìÐý:ÁíR=¬?qs·ÈòðÙS|ûŽ»±¨®3ÎÎ"~Ñn:rxçÝÝereÇÐd)Ɉ!îk�©�Þ"Û,bMЬ¿FÈã’+˜%–ýmuª6žKƒÖX8ˆ\R7¯±æ0;r ó[²ÊËÍÉ’BQÄñyr¿Òh*�¹ºHœîþæsNÁNvž¾÷ël¦Ht)˘¬ŸÖÃ$2ñ ÇÇ3´õ7"sŒ9sq˜Yè÷~—Ól˜Zth@/®9_²2hÛù ‡¦ã¡³e¬Ó£È±r}»ý7Š÷� S㔟¿{߬ÞïÚÅñYß� `@]㒡ãÀí¬€ÓÒ*Y§Ja’3ªr-ŒãvO =ÒO&£Dv»ƒa[Ac×ëŒòß+4ö&0®Ñs?º2·zŸ×!¦ºz'Ì»¹D*êýº‰†C–ƒu«Èá &úe~¾æøj”õ¿Ö×Í–…û>‡Ö¬TŒˆh¾°�™GE! z,Þ-‚§të8¸÷Y¹+Øœçë=}m ¬«÷7Øl¾Âö9¡Ö`&ƒT[bɘx²sH29s“¼ÖÕ-ÂÿX±û]œ:ô.ìŒ—Úªì½Ø#T¨'–�¤°×Á¤[ªÃüÎU#²ñ&÷¿6ó#×Þ¼˜jói ‡bdÊ“^ß0=íßBOx"ÛÜÄzîìÅdØ#ØÐ’ú;+_æiiž$*îïúðk—øxÖ½ŽyÖHˆ‹�«Ú‹‡¢ƒß¥§‘ŸÃ;Žˆß‡�ß"¹¢VËVnû؆�ë‚\.LŽ­Pp³zíêVˆ´*‰e¦MÛXwiÒÛ—_×k9·«Îž§$÷±¬ÈÞêćñ,¦Ràˆuïlóv>PžÝ [Š-mžÉÊ»—9h� !ÔbS¯£Ë3Ÿ“#Z<D>æŸ�£Ý¬¤íæwL&#ÒC2>.Sc�ígÊÍ‚Öt½Æ¬'ÓØdWííx@ÃD“© }ØÊA†'ï–û’rÊÉ•e`6䂿 ?‰0%…Œê² _.£MúJeæKÚú1‘, ¡=À.§VÌãˆí«ƒVk1_k¦[ëv!ïjíøŸ<ì,OxVN]ê{«b…Ðë|Ñè³úÞGáê„Ű–â(Á‚Àº‹¤õA—}»°Y¬�Ç;ÛŽ»ôi"Õ¿4ÙïèäÚ*ZVP)wù/eŒæ×R³]d¾ïžˆc¹žÃ'ß�äUø[MéŒþt°Üuœr£(J'!Ùƒ.›nµÖ¿ÌÒ!º®Û�`[ç¯Þ¨mNu }0«ü�”,ã¹A•¸ýùË ÂÒØ¾}¨Ðyç¶Fñä-Åî°é}Å —˜èßWeæ*ô÷Tè“ {=|=¦3¶·!ïÊû¯ ÚpKõ <”Ðâã¡å~½›i½I™>uL§îЦ«‰¼ï[ómng»…çœ!)ëà±¾ÕË…ŽqÏ|;�F)ëô)&›… &R@Ó䤖ôÖv:ã$¿gpÉ@¦<‰Ã1±á¤ù}Ńí†þ+üHSû†¯‹šz—ù€ïym.3èñÛæ¸öpyŸk¼˜GÓ麰ó�´Dj1s§çol�7íq9¨¾¶Oá(éˆÛ¹`¸¢’òõ?Õj„&˜ ^uëgó†rzA«É£»ò7E!;V¨t¡Eúë.Ô#k0 ·íNˆ�ÊمíPv´¹½·tÉ;WÄæùÎE�šictÕ$EáM¶¬â"ÓÞåi_¿l á‚.›Ú0tb©À|ªß BZÓ&ŠuŠ;Fn}.ÝXäÞæ`6Ìýl£ª[‘¼°¡ø8¦"6.,÷´h©££´ü¬7Ü”h ÇäâÛ©z üêûðƶRÑ€døA{_¶OŒ¸&šÞË&M¤GAdŒ5ηC9Ï‹oà­tcí†eÀÈ,ú¬‘/"§ý0>Ú-nA,l�%Ý¿ö,Ù¾qݯB.Æb-™’öEpÀ� ‘w©—ô,[�ˆ@™Ø*µ¹ñ C€óYµ¸�âZLdæÄŠªLá|‚–òEò|MŠ&µ6âs~Üz,¥¬o†Š,Ø^+vC§sÍÈòðä§Š×Éíš�r7+tì—�æ2AÆÞÊ;–bë-œÂÎý@�£x»œÒ$æyI©ƒ¡EÓ ¨DpFÚ`§3 óxauÞØ†ZyVç1™Q{h-ÜISÍd`s›õ�O|d*Áw§×&Döø% xh}›Óîá7ö œ‘‰ ¾$ÆÓ»(¢æÏ­0:êoW]U„U稜Þáív̰NŠÁ{S° ò;jAZÜœ‹.ðvâFc¢|éuÂûC°X¶•“ò2ÑËÌ7Qôç¼VnÀ{ !æZÛ Èšk-r–PaV`Ÿ/1½÷/‘|�’fÝ8é�fÕEŒ¿ÛÍÐ…�Y�êOš½Íá…>U¼ï½rD°<ˆ¤:!? mò餴3•H`COG‚õÃÚ¹Ô!€µ±]áyĨ[Âc nDB0P¿�Ó šgö5½ÖÊßç¼5Õ[CÐéåLPE„yŽNp¨&1D×`ÙÍ>1Ë>*ýu\Ëbè–j©_ôl˜a=f*ΟLäÔ¡¦ÀÌzƼÛà1|~ŒŽ(û­åƒ´ñÎÐÁ1GÁan¯ˆNUäŸD,lE0Ï|€ÜCˆË%z �À^àj”2n*!Ó�|×\òo|áÒ…š/ù„0æyV<äoäMrS”LÄ9[Ûé,â?k›müÑÔšm |œQB¸0@ÞÃ(ɺ@€ÀW> ‘æ“©…K¨“¯Þ/¯ì>—Ô}¥Å�wÃïÎoxk�Z¾÷;�õ}­ÑÅá.¯1´î-gW ­ bŽE7z²–¥VÁ9[Ð6RÿŒ”l—6 ”rŒ�x&ûégyšÅéíðm^Ó‹ü·nê æèNÑcñk³Íå²nÑ%?Ën°Ôü?1®ë˜Æh N”X x?XÏ ëì°­.Ó}°[(HÂ}u¼½ÂZ/úе˜•!y "dMèKÖDöÞØK /Ý.·Kf€µ¿fgá øj$�®¦pêÃÙAµZsß‘çÖ¬€áÔù­÷}´×µ�!³VA�LúP«Ü9§JÆÜï=àÞ“3¾48¶qã@PeÖ´À[åš³³×o”´_ƒ8Ýž°e&óObÏ…ñ<’Û鮣Ÿ&ö…yás8QÔ£wÍ,æ·–ÌÎÒÙöþ\cãÌŽ˜M¡â#Jl‹ÒÒÐͺ䄵ĘÄð4\˜ÕðÔº›ommÄè­†è„Ñ»bg’S0à¬ëwöíkzÉ{Ý”áälDå„|!a{Ö™f©xÚ’Î'%éCâš0<ê�ßÍ>Úl-•4¦ro[YÃ&¬TCn%:¤àÈ­›)�HG÷Ì a 2>0ðËGìäûwL=I5HßÝNrc„F%ÜÀ=¶2{‰4]r !®ëNÆçÊ ù>Hz^vŒº½d$AÁ­ C¤pðÈ»ì;ÏÜ–åøÈûm(O䕯÷­ì‘l`¦‚ú)MòlWCÍÚ_wVÚÉ^k¬î¥Gˆ Åîá:þ¬”^qÙ 2Ó\…6ÁÛ‰m){¼EÇ¡j« ÏcO;AK�X;>f­JR�ÝÆ+!)»cŽxæær¤@›,2ÑQ¸¥ÒýˆºÖ¯RÏw¾G]²J�ôM"çœ qÀß_¶ÅIå´t+Â8±N¦Ñ@Ú·D5§w[¾àEä—»Å[Lî[(µïo×ÖÜ�ë�ñuJé ë%Äºç« pÍÄá­q‚îßÃéÌ Hû¤LÞî°j{«~Öª�ÂuU«–ObÆÛ½1ìõ­ß[ žº"Ͷ û1�JO–WT¤»KHNéíÐ_Y]‘XÀªÅ°Ø… ½·7] AJPhvΞï�ŸãKc<"®‰r¾1L+JÝ´²ÛÙö³Hi«d¡Nÿ–w$l~Ø‘$¯—yUºÑÆÐÐk»]l c™)ÁK³´n/‹Yåt $V0Ú¾#íùµ´¹^"ö“¬~Ç'´ç9B¸fuú Ž®Æ¯@Ƽ¯.û=7 äÄŒt·ÅýË?P1šÉÅê¨i«_ïn R˜*-cŸ·"Oå5Ýj©ö§†W�ÝïÕ¼5‚Êw&óµlÅökŸ†ÏŒ•`Ó"b·MÃÎÕfí{"ÏäòÍŽ1`< Yk&CÒ`›óuS©sö÷h«Ú£o¦¨#@PÈÊÕRKr·VíµÀÀ6§]Æ®ŒWÒóvzàà`Å‚™7¥¼�k’¤¯ÀO„ûk‡eû;®^»òrøfbT ø�t^Z¤µˆRöÇVv^ˆsbÁq¤ŒûFÆ*øÂ�ª°,fÐ%Ý뫨­õtnˆV#7äs+QÊ•é"C&$6æåîwÀÓn€´=:k´šÃFYI¦¬Ðª'Ìh±ØµÐÐK "Ú+$Ô’&t#WK™ñ!C3|—v °cÔd}ü?µa'£Š¾�y�b=±Â GW D«fyòÖ!ËžÕü3¤šî9šºpÀtzœ‘Ë ½©‘ öƒøÏ^î¤,_ú< ,¶æ±ÇtðY:ÁoxµcBÈPî·8Îw6¿ÒÑ/ }0lêE<ü£•¡Ï,â8õ~M×Ù/¡ì´…· ÛÒ­!ÎÁÊéÍPm ¥' (ðY ÔäÏ«¢"5x]mh<8ÏvÖ Ö2ï¹Xêµp=k‚1 »— [Pi!ȰÕöî �:@°u¢ÍuÀ  ¢2i*Îy.=‘�r¯ÙÆ46 7u PFÏv}Lçn7MA–ô[ú y"Q¨I9jÚ´,2ŒŸƒ’t,¾¾õÄs~ß5cÞ˜rž‹ã&íNéð¼jkÖĬ§‘¡ÇUl€(¥‚ý�uJ7‹©¨êOS‹�fÁtx(;[gð0…»í  4T'á†\%k/�Ȥ賑q±Z…Œ~M¼oÖ'9PIî‡CÄ}ëX„MÖe µYÀ•­:ï¾;•¹WKY¶¢ BˆÑ•ퟃ kܰ,Þ�f{Ptf5Fosæ{g0¾qañΈHY­äz¿]ÃÝÇÃ÷�\1$ÁòèÚÌç‘ü<&�H¥@µƒìCßS Æ=q¨ÄH&ƒÛѪ^š"0†Y½œdKΟ]"Ö5¿*õçÜiÁ•�ª>XµBºPƒÞ£gMHYÔ{–ù{yËü i0›Üö`‰#ÄL‹Á�Ý`_âº^,ºÂéH~éí=¿Xj¥B0¿1ÌO˜1ƒ�•qL±ÓŸ3]|GÀŒ�£Œð ÌÕ¹i{[8;WDòó³TÓÓB¦8üBXç�Zm-Œ_ G¹Co«lÜ[ƒP±Ô%ß‚ý†¬$K¬*kˆylv@‰mm7¯³«öx‡… zU‡VöÂ,7Wï]�ñKùñܵ˜E{¨à_@ì+�oxÜ…Ñ\('V^óƒPäZþ(êöóÒÈX‚ n£M‚¶ÐT6d|Pí�ùÚº÷Rã””Y   ¹ìa&Ü”£¼ º¼Óçw·[¶º· g�[¯½·ù³¼ó3óCUým7ÌíeÕØÙÿ·<âáÉ,P.,>”lò."û*Û=”á…­èÀ àú9ôsìÝŽ´Z°uIû¯4IëÆ!µzrä;½¢w.)ì®6W›w�uŒ³²è×õª°ÓôqÏ¿CW]Ó¢ÆÑVÙyØD8C똪úÉ®ÄþˆcKj�±|ü6�04frFÏpùh”PÒ¨D…g–Ø…§Mˆ>ñ÷;k„Ê3Б6 w¾*oÍ2æzúl.€ŠŠØŒ]^Šï@7I—˜�ÆkqÉqjYHÎÇ¿k–{ O2‡óç7…zùaðõ›í¾Z¸§çuÈl[fg5ò Öâ%hà…±Içpø ƒÊ«“ÐÉÈëM””­íÿ.Ä�~ÝëXr¬_!Fë‹í÷^„Þ~fnmô*˽:î?NG#ìfq,.¶ép˜Íl~E´[ƒÖÃ` o­„ám׬Ô�¿£K:k»®÷¦V­ñZV?@g»S½óhš“‡�dNÕùkøL]жQXXVeÜñÎw%º0«%²"&!a¼û†>v�•‹ÐgçŒzœ±Sg§ì>Ñ7ÁÍêA4ø`î�J'´9ä¾èe3ÑØ3jÁ¨GNã"eçÁÚî“w[;^É T`¨¦ÆD¼b{_õnY³N|Ó³âÇ—ÈpÍ”\‚m‘î T«fÌ¥“(9©Še2ü~Áõ[6Ô@bá³D(|Ë/Wz¡E,d[.¢z·ŸagÊ–=[ò#ÆžE­†xج+[!’+CþoY1мØäMA85dˆÅyj9}�òÁu,�ëQáÞÓî²&>8€ˆ7#8öÖæúåƒ*ç¡C6ÌÂ\æ{Þe²÷[’KD-¡Å]٢Υ“Ð@�𯒠Œ“ª-EÿtsÞ¹vƒ†<ïli*´ù§@µß^ë×ï2Ai •ô®¡Å›#ÆŠr2aŠý3+züðü™FRsê-€Ëž«ÜmCœ»]ø¤O{f¡¦]ƒ® ìx&O1±?Pk›*´ïC¬u®Jw(Ml¥A))ñH�®oÛÖq[§YaJP z)J΀@?ÙAOê ÌK!ï^ÛÕ2#Ï…žä¸÷ÄÃö-ÉÌ-ÐÉ®û²EÒxܸ�?Øàé± $‘ˆZGŒ«…* �àÓð„B¨\‹ù“|jðAÕ+é»ZËG� 2ËþãA²ÚýÐa>ð�Ï®e�M•¹õcµ:¬f=�sZ9·*ìLTjò Ö³. 1Îc÷4*®Ré:iÚÇŒ±$üÿ$"�1‹ž›�‡øHÈ.» oÉy 6"ŽtCwSg’v¸ÿe§ªn2jðFþ§,M‰�¬†aŠîG|‹jþíµÇïÝ\Í7áÌZWÆ'Æ‹�7˜¥ÎsåWr\fÔ,Ÿ¬D&fÅþVðš ÷ŒO„xÏîX¿�> @GblÌõv ÎNô¦’ø‚0 ö�ÿ¸�ýwgTÐ8n×7ÜMíÓ…úý{E-MÎgyÆ·ùq]"¨Ýß}¥ËåQA(C ‹H[Fê ÃkòÏ4"DɈU­©‹@l#”|¬6FÉÞI.C&¼µÏ¡Ü ]|×—ëŸÉçB½ö\æ¥,|Ç ]U¬ÛýŸ]C"å´í™åfš‹5y´–Û,Ê7ôÏ�ÑZG†Š(�bÛí¤MªÕo>™ÛÊ©µOlmæ²g¼Ìr׃{6˜Œ£bì²ñ2CÏu”œü=Ö<°ÖM¢®Ø4:÷-"ú™ë/´�J™›‚Üã_‚Ûã>½Î/*°Æ�•YlFRîdä‚ÙÄ9ý² îº©ÝØù"„¶Êæù®u·{¥ÝžÔ ؾߕ“àõ>Ë*�‰Œô…îm4 Áá¸û¶ïßwÌaÚ÷/›syš¹B 33Z{-èí÷€�мZó÷µ{KÁÓ²©ƒÇ–ÉKrWíDsHg8ï+¿˜ýŒ¦Ÿ\¸]¼8ÄØÂ~Ôƒ2fÎéFrÞ&�f^²–mk{(}„ägŸqúŸ[ÃÊýœJ€z£áoÛŠ2í8—Ãì$Ž †NÓ`ÃÝôVô„ʉ¿ãøÊÁ­ à ÃÂüÝnãKâO›Â¤®*˜æ<‡°èòç½­?q³²«å,ük»\�(dØ‚Æó˜ ¶7ŒÊüLv8*~ÇÌI€zµ¦z£Þ~ÕF•öwÞ¤ïg@L¼cšLBÏhü±mÆí˜tÓP[—Œ] 0•f|]¯óõ°éçŒ5NÆrT !¹+dz÷;À(Gë\ ïö«šŒ[@!  Î!vñ’9Û!›eG æDHésGV›á~]Å޲㠂¤~ûyªMgúßÚ�IÞH÷®Û`%3Gúó“8ûû4æBŸÈl­öÙÞÒÑNÅ×U[]FjõpkM˜CÂl?ÚÕ=ŽBBš3™<–Ò}íØnAà)ÂÉ"âΚþ N�Q�x}[œïÎç?xx!=³s﫸�”þ®+ÙWò—·³aðKŽ/³¾?O®ÚÙÛì#V_�’ë�þõ¨Þ>3Ä„>‚¼øRrµÄÔ>~ø>£ÝOØ&ÆTáÝr}¼ù¾aŽ�ZÙ㪞áGÐY„õp* ¡3g”ÇìˆlY,TæUî·/TëWÑZÍÆ?Ü@V~óDï=~;µwãþÐq¬Û _@ÿ ²ëùf2j‘Àï¨w^‚o`ýºÈ£Hï¢^ïBÊÖΨëy™È((•ç¸�γvÏMpÚÈJ_z£Ò=ù[sl1Gr¨=0@ļßÍVèÉìðàÍóï9sìsnÝ,ß~³µ_àf û9qMûåKgnåIxz‹aŒ(™àwfWJƒ#`;:üPƒ�–^³)/I…¸Â;‹ì€6D&—“(;3©Ãõ´„´ïs~­ÛœÏÀ,nó¦ë‘ S{©`Ý�¾)VpœÝþÇß296Šƒ4ß¾=×»#ù:™\ž§­Í×Oj_„û¾à澪¢©‹£”RÖÆ"Ð7ò×äQÝ( ¤°b ÝÝG ~-áÌ�NìÓI$Øæ1l< íÃw»e^p˜æ:}˜L˸S¶œ£¶�§ìÖú�Üd7MÆ=ð�bÙì}ìs±I—æ™ôXÒbP%³anß—Ä«NzìµÖÞÈG^Èš«#q{©NÀlØy„Èþ=2jÁc“ÆBÕúô3²`6©Š f³œãVЈföK¦öpÈ·©¥ã¾¨™“%*Î@—£šc²$>¿9Ûä[u…Òhwì Ûqw’Ó²¢_;º ÅpüBÉh^*�—*¿xëÚSÖ ŽðÄnt7ê¤ÏO-½šß�Gz°¢ö�çç*úͰ_UK¼+hoLâw¾ÕS‚OJ¼ÊY 0~Ï6µõi(OÖt®îBÚÕåóY·C  �h€©Û‡ˆ�ØP+íËÙ^bÝ[ëøeûpËÃG—3Ü›}˜¶ÙТÃo…ÂúǺLµ@@ÐÌ,žÒæ ã�Vó4´×ó¨cW�€Ò3YL\ðt#¶7Èäåë?# ÃÕ$ÇÉ"�7Gƒc­2W°†Á–y0Ã:Ç5hPÒíïj¸œŽwٷׇ "`>�Ð:9]Mÿ\O¯ÁüøsD~˜5·ƒ[ £ªv —,¸Ëgl>ÿ/ß]/bÜä•éÃ5ªqç×N�+Ô®£DIS ] EKÆFÓƒW�Þœ/”�•u§hjp­ì*ì³ñ#ÎN%¨‡e)òІþ>¾Œ_ëílÜÎ-WO:m,TÑ-lªÞò[Ô¸{W_€(¥w•ÌMó�x/ã„(m&]¹#5ôáñ„–Ã�„Ù_ïZ¥Áƒm�¯5y% {ävÚæF¬l�†•+FÀÔÕ¤Ÿ‚tÀãýk úrI¥;§ÈSÅ©¶Æ�-iÝñÂ÷®8Ýò�sÖÑN¶m·¨@¿t¶”�Aù�¶7Çø R” ]^¸Ç$Dšà6×$¨²ã^8¶A†féa ýq²“{,{3bX Ðï–y‹À¨ìñ\ëÄ=ÀAp Ã||1WÆS=vÊMEÍ5×Îñ¤Ð“^3YJ}¦ôÿ&ö-`ÞÅÓkb„Dº'ÆŒ¿½p“ÎØX½°Ÿ³ŸX¸8ÊÝJï-`[ Ò‰¯$Yì÷*ÿDyû;ì]Ój8ú�²¯ ²�füQh`yùÀãõ.ÅÕ~¨ãÁÖˆ.ý oíØ£—Øgëû“DàLU)ò’Å5µhíw<éV©NG>æÕ ?–wˆ¶€oãß�ß�†i1ó{ƒ¥AÈð+Ç<ž+ÃD´šµ‚m:;²ç9Z €—+zQ�»T¾Ã¤f2,tÊX(_ÖR.îp»ŽÚŒíƒË@j(@׈b‘s™=¯ja%ó}@!Ê*“c8JX;Éùh±�¾Y“`q��…Û\à>¾xåËSÕÍ7B ÕKÞv϶f%,BjלöÅítnÓš¢Á¢m*NSíh16p cnYSÐ�: 4ù¬ål¥wý+{˜#¹ì±¾4Ò¡ Åp—WW–1!�Þz¡JIZ>$ãxVÚ{±Þ1…ÞZ;ŒöY²gNÜAŒc¼iôZà*“߃ ¤7ú…«|¶Šµ|¢Î×ÖØ1‘¦„Ê ‹„èŠû侃ÁÜÖð¼/—z÷;šiB¿0C×k¤ö«¾¬ Ü]9IÇóe’Ô>MŽß÷ÝÒþ +r?�ä,Qa·ÎªÊsÈÈ¥HÌÒvAäÇ®ôWÆßï20¡)Žï^/dÙ-�`ZhH$“RÀû·RÂ#ôã2:fgyžèVn}Ñûh²åÓ È#—’×ab�Q|K"»y˜‡˜DÛ„,G†}èÖ©.Îj´o¼ìcÝ�;ú#m\òvˆë$�ÈKÍ|úï,牌H’€o$›ìG ÈZ¨ÃÙæTû•ÎäŽ÷SFë5eqCaöŸ¬ ˆP˜?"œ�Qùð“×{—p1’u5-¬î#|måk:™ÔsNco!n1¶'ç‚æ©îŠi÷S¸Ôò˜&�—íƒc´¹’¸&wãð_™åQ÷g€ƬÍ#æ�­Ààxã̰ɞ2lQÎz8çl �0ÂûékËÜ9ÜZÁ36�Yªeû€[kxeT‘±-Ïdë�{uA¸ ˆç�‚Ý«ì�Á_Ç$¼0y[�:ËR—3–1Ö‡÷õùv; :aªÊûÀØxµ.®Ž6¹Ì‹^´ ”‡6é:¥4)ØÅ^’ôçÈÎ']dmìŠíIªNæu"¥;1ݸˆÄ �€y„TŸŒ3¬\L8¶·¸CŠJÏ Í-ÌFReyÖ7̦ÃÐZ©»æ­“m'Ü)9ìí_XÿnÙí£Bì²%N<ÆPFeÅHH…?Mn¨Gœ7Ÿ–Ã8,÷�^xÕº„6N§¯æ| ,1ß÷< nå¶É^¾…;hkk°®DxåØà3±.sX±l/Ù|Ñyæh¯œ•–û¨¡蟀³ËX$Bßj0Ð …¬–‰A€ayæÅçz"Åî “›ŒàšqÖ– ÌI·ØlD؆ûÝRjV4†ÉÓžäzFE '0tÓ�X5À[ >0t—ê�ž3,G†këetQ Í…îár|žA₟ª5¤ãÊÈ­¹µ×Å °'£×³s@Öíuî‰|Üðû<]ç+\¨!⸻½%~\zÕ¸cÛãÄoìå³nÃ…:qnO9Ô2©j®ÌB+¸ 6l]KÀ‹­Š•RàLÂsŒáøžÒƳ5�/œƒkIëeßað] wåîg1žìŽ‘ý´ <¶æ£ó}÷§TûôÂ-î¹Ï> ®y~üÃkçÕhYïA–ß¾0kø²‡sð|$Û÷¨˜ä묿B½Ø¾þÉi8‡DëÇ(tjÀ0fßoé­óy«FÊ¿ þ5v|7ÉöÒ­>M‘y¸×ºñ£Û} _šæ>œçÎò=àa6ñ=Þ½Õ!nQ�6w6+­íô µSê =±²ßXa™Ú[p�ÆAÐõµ!Û$'¼ZAçÉìçî…trºÈîÝ{·ÖM<�IòÖ±RVßivk¶†ê !Œ„>ßN.íØK|ŒœÛgÝ’Œ· ÐF‘DçAÉ6‘’û¡#¬¯c+DŠ“}3vÆöa¹žë§�üAÐÒ hûRÚç¹�çµ£¹[b.Àa¯÷ 7ï�cJÚlÜÁ±T™WñYŠÈŠ£¶ìƒ¾ƒèÆ–ÇbŸ¶Ž«æu3WKÈhož4¯_L‘hAÊWëYžDËhݪÞÿ F¤Îl/œã ÄïiA‰î㾞¸áZ@±$—;øîEsƒL~›{Æ£÷ ®Xñì(Œ·:ô&‡”¹Bµ5¤ˆ‹ÅÒµì™HRómÈ-³‹‚ªj½€ŠÌ‡Ñ+ÎIïV°§}Œ9`�UŽê/U€ ¸bᣠ¹üÿ ÷žŸÞñ§—ê?|‰K‚à-%÷l¨JgêëX\$ó›î“3‡!{ÎNÀmöíPÃ…¶çÛã}¸ËÚž‚U´@ÈJ±d™Âž4¹ì>ú°áÛŸÙ àÐÛvÌÖ_‘û[ˆ„± Àz,éΪ$º1µ8Ω´o¨ÇN€Q¹ƒ(³/n¹Ç-Û°ÍÄÚsu°«ØA°ræÔ…¸gm G™‘Û'j‘›ȯ¾…YÈC£³ôVaå4¿‹æ âÍ^�n(6: ˜Oı�u|¶8¶¶,À–2EËCÅR\¯žY~õì0#ÌyòDý©ðå¾%ÁƃÛ:Öo�ö�ì:ío½<¬§ ¬ í+fÁåŽpXçÍeø‰{qß܇~‚´°fõ²¾¬±¤äâëí†r¶ Í$ý†c9X7öFóJ~ùm�ß1T²ƒt›y¶˜Û/*öå.Ø)b¥ñ¢nF1!Û Ñh$oíÕ bU)ö© çsÁ�W,­Éˆ‡Ê\ÜOX<ãv1µyéƒÍóÉ!­Üyôvܤ ºÓ$TO;Ê÷$!” y±ƒoˆÌdr[k¤’„ßëåw˪„J&M-$N'å<>œ¥?Ïîzb†ÆgiœËÖ±›à×±q¬`°]ˆ-Ûž,NKÙ¼"Þ3º8ä �ˆ \Èïbcðñ÷.0ê#Œq»i0‹Ïc·|.,%¨Wî ZU¸¢¼8ßj�Ò‹�lzŽž"n7s‘,´IØÃíHKúuj¾zVhgc7g5;r戻7fd/Ô™+ƒ]§ ê0µnoÏK”Y —ìå�ï/˜T± šÞ×}‡Ë£G‡Ý~"Ó&óZÀ6˜²]̾1°V§¤c ›‹ñH"(¢©°xeÚæ!Áîi'`BMÜ@tª²ÊBl§p³…–µ®?\±¾…Õ)îK`øÑÞ]½ì–µ$Âé)éc ¨�o²«¥XΓu°™.ë�íŒÄOO†â¨™•Òƒ¼�6ÈInF”ƒßzÏ ÷‘xà�o8ÓîA»�Åd^lûîÝFy«IÖnXC0MIL0]j~ M®¤?!dâÙÖV±­ÌÎqï·hOEUöúˆ1ôàÇ­CKmØÓM¥z Í¥g·EžN…/B7�M n�}«z�ûuxÀ{+¯^ðå¾ÖÈ87¸m�@~{ 1Œ㮂’�*Äà7¤™š}q—ì‘·RÆÆ9Œ»d5ÇM³-Ô7¡�ZTƒìÎ¥€Ã˜e�ü…rï‰Â1®©wlx¶B�§ï¢Rß �æUî~“:yå³ìï×!þ?Æ:®® ×iÙz©\8ŸŠOa]Ö5ÑV;÷Ú³8h®Ì,2G Ïß$í÷”^ê¼¶ xZß?ÍIø®÷‘aÁ§5å v3rç%< ¼ÄLƒº‹W1 EÖ¨,uûÁöðÊÛÎö§{JoäíøY¸'vÚçÙÂc@¡ê9P† ”¦K?L­›: ²þổAÉØ ŸGA*g@ý™Š¶nè¾(UœX–8”Œ"�î�‚[ç0Þµf3Á¹9õa0:"júÏ›Á´rÍAžºÏ‚Š…¹³–ÏÜϱ²Ôö½ÔÏ…Á½§î¸%±ï=%ÓÌð¸éaKý9Ô°,ij9´uÁƒæÇ³ú—]µäüIÒaû ’×6&½)ÙwìFR" hÙãS;/ç$çj‰§!ÞbÜ–¤áh`š?ì™RxËH%lœrž»§M(b :ØZA½ºEýbÆ8MÒªávzW9Üòí¾Ù1sK…q¥² X…Þòú¢½^/>дVƒG<[¤Ê Å3]JÏÓ‘ltá°°Ú ýÞ^kZߩᯊïwñ“§FˆÇTσŒÅà“¬…N¨/YŠY½nVxÖS¹�=f °u„�Ù‡ÅLÈ\Á¥¬çI“ŸJoǹåX0J¥gåCÏ•\DXóbç/ÔÍ¡“ná¢/­ ód/ú‚‡Ë«ø+iÓzü^Ýv0p÷sÅ™ òÛ3îèH <(±gO{eݸÎO4FضX÷£ÎJX—–ì.`(… §ÖCkóÛ!2#ÇDÀ A9üÃSyÜu†–§¾ {{«Ø[Ñ7¾œQ�´ªÑÑ/ug—Êl”T_i�øVµZ5´@'=Æ5‚@¡5‘Ä-Óâï’ûŸnŒ×ÚÙr\h°ÁÀ[\ƒ÷Ù¾Rc" $ká¼~ƃ±hMëŒ�Ÿ\~ä…˜p°ÎË”ÞeÂé’ä-Ð'<�NñMB‚»ŠÑ0¿À@Ùg± _6XÔ4(ÆÙu*¹±À3Œ¼�N­œ©xš€(ª‡ªÆÁÊŽh"_M�7#�vÄŒ·ûÊ AD¹‡††ÞYU¸^²DJs&•ePÝ1…ûï’ÿ åÌ0H@œ2âk`â¶gÇWQ²É$"Ö(—³…í“!9ædMEj¸õ�¦ÿ­F¾0È‚«6@Nµ´ý  1ø�¶íµòMG©Îz¼úò®ÉñE”9O^¡€-Ù¡~#‡×uŽKšIÝê"çÆF0P’¦£ SÖ ˆÓ¾?õ¿€îzg™À¸ÖÍæ/¸B›�ñ|_N)CgxlR,β|ƒÞŸ]§L~ï28þøöID­ØgLw8>µægÄåÖ;Ø‚-¡«¿Mñ1u·Ê½Ö ®\03è„Ã_óæ�àeÕßD„*û×LÍS»¶‚Ë!¢j-y‚×'×S ªš¾yÑkØôS¸Å¡([P¨wœ]™“\à/­·Z�»‘C´{ÎM1`�ªç{$^KZ¾PIȌپHÜÓ­ È(Q¢ïoW:ò©JAOó R€RE ¥(€÷™öàÄýú%ë.ÄôšI¢œ> luõ[Žk–&å¹/á ‚Æ eŒª ÚK�Ì^‡YÔF5qˆ¨” ^Ð19ÒŠ¢üt¥¨œà&KûD{ÏPœ –ÙÅÆsöïVnàT²[í¦ÚÝ„ÖuK}`ªfõUG’‘Û<àómäõk˜L^纂t¾Žä÷v PȲÓíDÔBç£Ù,^è± ÜOÐZ£é=U;Ÿ:ý°6š5ãŒ{®ì´ì6+zàuNUùG>¥0“®F™ËnXåî>fîêóZåöø-1GÙ‰Ž<¾�}åSâëê:Î(m„Ã8Ü7’Æ•‡Zâ› ”ïv*2Zª[Õ–AD0èˆï›-–FÉrÊ…ô=<(ê€F¬ïúç&—š§Í˜žú {*w¬�ãÚÂÈÃ‚Æ ÜuK¼‡/�×6“„5¬5ݱ�DºßÑY¶Kõ@HÓ d�N uM–[Ozò…¼ÌbÊjøQxË‚»-A¶8BkEJwÍ”jV#)~AŽÝ`cYwV"{ejÓ@;aɬ_TíÈÝÀï99Õ)ë0¸]Ö8RÅŒ*½Çí#³É‚è´ŒŽžÆ¬x&‚ ÷ýËÍË8Ký¼]êÌ» cµ1£íˆ6`oa�8Æ”=òÆ´`j×D ØÙÑÎ÷�#¥±ÝÚ#1—-çzÎc|�0-:—.ìZíÑ$UI½E¥†p*Ä÷"®Ú™ÇŽ¿î”†AOì\ç`Â[f{é(îÇŠ’nÀØQWÑ…‡$'Õ€S:¹â¯ÅóªzÉ�§mhÃ|56«£SU+9)¹šeáT_ Fo†ýÖÅ�ó›{Ý­FúéÄ\£Hsb*/•lù²î RS'ù@µ¸H¹oûaª-zZ§‚6uCåÏ•Ò~AaÁ¾Áo ÁGßj+ !’S˜Ü«h·¾nû7|ó:7ÝðKÕLJà`½ ##á Ú"3»Áƒ¯åµ¨‡ŠìÍYÖK¸U¯ï7woWyÔîû<,dÑž¶ÉëdØì›¾:³ p«>XÝI­°ƒ¢Ì“J-µ8¿qZ¾ö½Mƒk7~Ñc�õw\îÝ*éUZiØe ¨Øö6æoÅú#NA~sAa¬ópö{ ð‘ME—0ºä]€r-bÞæ}¸E2>8“ š¸�¤½|&gÉ…ñáåsÂÅk–p²Ž›±Nö¹F”´#Sí"Eäàáó‡ …Óhãqí_ Ÿ5™àÜføãÂËM ÔùÛYȼ«'‚êÕgKÚæ7Ž%OÖ:(®¸_У•%šY€ÞV÷ÎþsÏ–l‰;› GZ–²WÁ¿kT–( 6ãFµñ^£ oX'¡ ·îjš Gت¼BÛ,¡ÛÀ_·“ëžæOƒâ·³j®ZÌESƒû·C&µß·•�÷èö¹ü*ÞÂèº7�Ü"RÝ?ÝÁËXˆÌlõ'¼]6±ý VœL¶ª©š(Î{¢3)¥´÷8*ßì>w€º†^µýŽÓ S9ö.€¯é÷¬zÙ/˜³Åj[„ijTÑbám|{®‘ÕÁ°ôg7@¡Å”så€þ»÷ “ڶퟻ•Z·kƒj…±Ô(¦îéXí¨ œ�.â%¬ú9ŸuZqí…¡×Ü�!·B,¼èMá?İžËípoá.ªüîHÐ3Kþgï·dó¢¥ –nhÃPûx Žqí 6Ã¥Ý_8Þ7:!©8ƒ™ûÁf·T/mãAÌßÃ3»­µn¿póҙᮧÇiÝn¤…^rƒVÓgw<„+Hý‡Óú.�ÄVO; êlÛ�"åà ÜzçV„jÌ#&J×[Nòçž(ìp`ÁÓi ΗÑaÈý÷›Xa‡�„ôkÝÎ>¢Û^5ó41:u’Øm„0„ïôÖwX*­XvÕ2>5„ã¨å:\b£©#Tì‚W]¶ Äo:�p7ßeûÃàߢL<émp© ZbÔH/OVÛÙUmMc‹Ü€iÀîZÃ>ôj½Îs¦_žm˜uÞEŒ‰Iþ 3Ç=SÏŠãÀÞ§ïk:Váž#:Ñ=§|ÖžšwbÑŒ5õ‰óHÓ61Ó|ß¿¬8rc?¬Ü�V&¬š~>1µõè\>+wÇË›ý°Ý¯tœÞuU­rh/¨)íCƒÍ¸ÇŸEä6ØÅ5®ˆ8'46ºmïÎÅÕï\÷o·Š,eÁ%,Xi-‘ŒìâÇTlƒ‹5°H¹{Ú ñ…(§¬­»�PólxhÊìÀ ‚·N8ÛNT Áz†ï1]ÒÚM\KZÖ ù%€æÒ\¹;z™ÄðWà–ÄÍüSk,£[ÍA”øgzÖó!šï!ÇyÌc«¢}\€íCp¡4«bi†‰@»SŸ#¯:!,,%íéqgkÙ’‡£ñàcòV×:B˜ø˜â‘%Ôß´N²— l{iÊ~h·}^ÓM�|õ”CŽñSÁ$+³ß7>+‰Aº]ìmd¿ÔiÍ•gaíèKsuÚųA@(6›ãh€Ëº‘£G�½5•5A{¶2©Bç3ë†gÈ@‹ýгäýߪ#—Èvð„ƒ°]­¾'„ÞJ«¹BÆ›œ¾AÂ3‘¤°Í±«8—!px…ÜÁæã¹õ+‡}~l‚'W¸mkK<“i�¬Âxe6éåôÞmÜâµ|$™×Ï,½^«Þ¥§ÖˆBa¼™Rw>*¢”c­mß1uóPõi"æ ྾uø¨ �F/‚e̼ÔUÍ–,tþ ò=ŠèÉi~#qêæÞ[Æ” ÅB9‡³‹�r/ƒw�ßjÜ –¬¾ÞÖ¾­¼¬òÃfè)Ö>GWçdÞÉ´Ôj%bÇEZ¹AjªØ%‰b†{:`dí8lzE²œC—úøã5±o �LI˜){³Aé~ÚÕBícµ¬ ŠS&¶.ÓÉUÛW•½�"­mYª¦ªoo[y²S㫽êÏ£ ζgmà°ø? , ìÓ½–o7Á’:Áád¶ßRB�µ:LÛÍ«œbÃÊŸoló0j±U°×Ú{çÈ.îÔàP¼ª,–©qñŠJ†áE[QOe\ÖS –s e™{à¿Qƒ½¾w‰ókÓÉa±oìId·† [B,ŠÍÁÏq. Ÿ*u·4^§O0œøÌnK(©m‰ýçjîsv¥ð«�YtàÔ|`u6E·¾`¶èTë[[§/î"¸mU-søoÌW&>»WO}Ï`Õ¡rüÙÇ,Óœ[eú1{Îÿ ,¹¬ ̺6­´}`° É«`j÷ æHî<¡+CÚkBç矴ý…€zmðo¼dÛ�Ï]cB·±Qñ_غ&CE¨·04m)‡ «I·`ð>Ó;ŠØ¬¤W–“%o&a‰Îž(æ±k‹…ì ;.ˆdõ/ê§œ’L!¶)]"ÎmË,2¤%€dO¼½Úû‰ÈCámÒ$ ‰ ä�-²IÄ4Ad2çnhg`�Ý[‡9 ¢ìÆÆVÛï'ª^%¸ºtèË6¶ëXËnÖ’|;ç0ÝÜ0ÀípÚ‹¿*šúØÎ/Á–b¦Í&™<"©(\žÉfÄ.[EoZîG†ßTª¯Ð2X/‡*°ëë}ô­àÝÍ„4Ê÷&�½kËÕ{Øí(ƒyA ÉÚ Æ1>/´…�…­†¨+¼Kòòœåƒ=]9 Z•4Á‡›z&«B+9rçXë‹‹°8 ÎâǶ‹1jÖßÔ¸@ •½>É×Re¡¡0w1®Öçi Šn§ÑÑç8ŒtÜg¨Â8ü¬ûtï0ZŸz³Tmœç\åâxÁ›üFµ·I�P,‡ ÏñïyÿalàÄÓþÑc<éÛüç~¯¤³ñ”  Hú˜~ˆãŸE×âd�lÂúmËnãX›9XÊIsÝM䎿 OÊ™Ct Àc}��� 2{Ýe¥_Þ'@œX®ÕHSÍ1 "–ÃðQ° v¢Èðfø-yò 4„Q‰Q<1詚aÒRÀ0&ç%[èÆÞGhYE¼ `é©�¯¨}$Ih…­²îNÔp�C�éÛ3�†�Ö‹ËÈ„+­ÇÞíñºƒ·o/q9µ¥=¤PÔ@J{œ·"�wU¸ ‚\HÍÁ#�Îo ³½ä½†ÌaM÷Y[š;\Ѝ û¤ÚÁä®5Á\£�R6¥dÊó­­¡Tü\ L\DqÌž9QávÇqÛ¢SÙôk˜ã®ÚÖý­�@`ˆpdÊ:íš™Ñìc�-EóŒ [÷�.Zdq�û©¸•“°¸ÍñOeؘjõ ã¸ÍñÃFmÓ¯Y°#¢+oQ¾½†*‡”TçWŸÆˆ\›rȅ˜Ý�Ô^¸Høpª\¦ÏÝ]ÃîøÝ¨Yy}ñ�ý7íáÁôânÁŸAÙˆt)Ñ]/x¯²ÒÅ»\ª” ì3”D�)ðƒ&‹óh´b繘}rNèéîQÇÇ)¥Þ[ØË�—²²ÞCÝ 3¢ )ÒÛ|1Zt�‘Êú¨Õk{äEôE÷]¼d*E³¼s FÑ¢XO¡\^É„GÌD 8Üe`LÁ­�ˆ6ék®óÕkµÂÆËJ }O;ž!¸L‹÷Ͷ”‚¾ÖckM$Iº³`¶íônà4¦TÆ´}ò ï:ÝÓt•ß[Ëõ¸«&ܼ••²?ii®Ñn’`=©®“š$_çóÈ‹pªÿ)ŒõR>$ Î%µ”0õ›B¦Œf‹¸aÌ !ÂcÜ´vŒP«Õæäîä(z·oî�r¸Ì&|ôð2Á©ã³ÄÞk`à ‰§“h ÎaÛsÁÔ‹ß‚{ÐóNæ×;-"µb9]iLUöe´Zk£Ã±âàC[Õ…8l½Y…BªÆÙzænÖÐZBà°S<²K:íhª’HÄå�ü´®šÅ¶—šm ;—ÙçD6_¸~¿9‚ÆèÜáû[DD³ gˆ·åÅ ÕéSÌÀ�‰ #ÑæØýÂS9jÓ«]|�Ox�½YìÔM¢ñp]OÙ~Y(·˜õá8b^¹ðK/´MÀk0¢Ç³ŒLÛ”SY0‹ÛY+Œ&Š˜z6«@9n‚ô–ƒµ69 �Õ™Grà-ï‰ñf{©éÎ 1ßYí¸J�Œ*DÃ(s™×vǘ1ØÙ÷9 4B^ãæ¸kêå6uØYô ¦�*_ÛèÄ© |œ®>Ï,}\5n£Û�ïÎR»g’¹†zuû@ôæÒ’½�Mp±®‘‚Ý»¨ê }+Þc_·wˆ~Xþ¶ÛíÚ>3Ÿy]{Ëòýƒ¾‰Wö¦3}| o¾PVŠáÒ‰…�Åv7Ù‚läD¬ƒ" á´òo$íÕ™m(“á<²¼w…aoÖÛð¾{�œ5±oj½Q$ÝÕü@‘aÌ™îÍÚ|¾j4$UJÛS…}4L™6¸unôtŠùÑe_Eì•d/Ä Ð澏쇵"n¿}Ðev§°²eÇp>öABT…^9í·Ž?œ¾³G~ùÇÚŒïÆ »ÔRÎ3€÷ÅX K&ì–ä>v šýU]åö ¢•¸Ä¿ ì:ɾDµóMd Ü3¢D'ŽŸ/ÖÏå‹=ȳ¯ŽÌI™0d`D|kB�¹ n½Ý�Πiãô!›7æHl—dM±KEÅo×àÁ–®ìͬla>¾^ј¾d]/ÊÄêZÓìAaz@–ÓªSaƒ Úì½�k+[6¥AY«~#ûÖÈæóXä*-=;Åc<Û…ro›Ÿv„Žj"²Ò|]×r³¡Ð)6rˆÊªÛÈFÒpåß§�-ÿ“vDA �눂·úöúsÑ ³�m÷ò¿ä;\þ' «5 …›" —ÿ’ø§Í­ _jâe«éL¯ƒ~eeñBX+ÐG' Þ�ªK9Kžï4R÷ÔQÛ= ÞñoÄod ;ÿoÌñ#��sl¢;B˜,æƒ0¼è&œ” æd+WÉ€úìñ:%ZjáЄL 3ñŠ/й°¢eu1±…©)!ò Ræyø²kî1#WÆ¡aJªÛ쉽ö÷LÜ`¢E>UkqSÛ>À`ÆÒ€ŒƒÆYKºHmñ­ q鬬Ô�!ÊØÖLoËË|»…ÈC—´Ì‚èïJÔ·û'ˆç%÷›¾ñ†sÆËÏòΟÚdð8g# ɾÿskɉ1p¸�þÁ!µ&wŠ4Ø`¶áX¸�)U¿؉ÆNÞƒp×í|�,¤Ÿö7„Àa§šS}Q}±7O¡"1¯ï[¢¤RVþÃØüèf’Ÿ›µu®vek³¤† ^Ÿ {ö1P>UÌq0KÍÈÚ9ÊÎT% q‡±ìÙ]>å4Þ¯µ¼KxhT�„È®kŒ¯i¬n‡S°Ž7´ $/’«I* ˜ûß¹Úù£@É`[%Ä.?§ý u°¼ƒ˜yþâJòÿj#C;ú4Oò?eûK`¬ŸFÔÎN}K~š2Iú5z¿¹Fc*"²Ét†¸"¹®õŠBÔpÕ†êäQίp³»âor´õ¢�AÅ<Äã¤G ß4•áçFì]}Û¼èêN$[¤!âëº ß“<ÙC}~°xZ°Õ»Y‚Gå?xþvp×TyݾÆAoËM‹t'G$1úp¥Ûó 8.kìsr ‘‰}ö§‰—�8:x½�̦$3¤„v½ÎÛ6JzÌIÑ?EñÌßèoªcWaµ;©gCÐ\½ifͬV] åÆÂ;@Ûr_׎i±ò©õôâ½´xpmuvèó|]¸_ešc¦½2HêÄš&ÛÛÜN*EH³èîôrPéŽ�/u‰0€îÂâú,1&Ð>ˆ}–Vá» 0 ^Aš_oZÝVê[»#m“ZmÌéqm’ÐYm{u¾­Šä3½z ¶ú¸ÝîWUŒ\¨Æ¶|.N¾hC›ªöœdÇö­E"÷ȶ×… Ÿb4>p`ñæ•»µ�£[™5ãøue>}tº‚ËÐe~S·•Ûe*´5h0fø‡`êòæó«u±¹åJWÙîqŠ·×ÇÐ[÷`3ñcÚ�®“‹Û°tô�®NÑÏÓ1]ÎŽï¼ûtÁhog/‘XB;Kd±îwÂ\“È7ýE<Þ™?ÔÞaß®; ÙC§ÀÈsð­÷y¾ˆ©¨£*B˜¹{ô‡=ë´Õ.�ÌÌ�ïÝøÐD+9u­þK*O#Ýèhõ ­ ¾K¹Pl6ê[+×´Ì æO»îeBÿ/Їr ìû³&ãn•¨ŒÕоñc¯Î9`hâ D€ïL-F¾âTi5€Ð¬=§§s¼õ�q±ï»»`ï?Ko¥“�ߌ¹0…ÌãÒºNï5F#Nzô‘Òx| iÌ£gñÌüy^¨èSp#ú-ð=Y2g|’gbFr=ÛMi'ïb³˜éò$õcq¬÷XkšEê3î>m5›ƒÝ}ÒEØVDù¥@É|¿T<–§Ö²wèO•u–´Ðyc á÷™¥h¹FK©ÏëšÝ­bXÅQÄ„ÉÉóÐcÆ!ì;±ëY¨)Æ=R7Ú>BÁËúþd® Dƒ)ðɰˆT!› áwˆl+Að‘÷Ó Ûßµ"zH,–Ë‹ f®åŒeRòŽ—Ž�ÓNE�MNð¤½{gâÓm°¨ŽÌãõSú·2—R~ã„ýB#ï~ NgfyÈxn~Ї‡ÖÊzjÄl\Àó…)WNúL¹žS0þcà|qåJ´‰¤ë‚òiö[ÏøEu ™t{±,ÖH ÁvåoÅÜé™uVÛ†8d:àñ¹÷Ú <;½Ë·§ä8΂º¿'i,¶'[°Pƒ™Î+ï^êàø~§JSL§mçÑ£ ¯mÅq|ZÀ SË Ueehrk×Ôø›y*‘5À…|ÕËy½¨e?·«9©nuUªy VN2SÓ×ìë_ð¨Ù²³ ³&GûÕð¥­Ý$�q´,Kâ›*ô2#ãý³»oœjºŒ8®Ä‚ ïF—rк ¦7ù™©±¶.×\ÀornÇ]úÝI1ŒÊ.A$Ùá€4ñI ªÕ¬b‡TÞ,Õ�·�¢a°âò\iàÍséâøVâµm“ù=óÙzÛ&ly»î“@cì�ÙÜi‹5¹ãQ ›6$qpôm!Î|H/DÇ¥´r¬Akb�zÝ \„»6“´6î4O½ÀG²1­m³6©à@:�ÓV®ågµ™Î!:�jÞᬯ�³aù™!õŒ\·vªÆ§á°4¶CÍ�8,í'ò0 ±¯,]=7� üŸu>ß+ï;|Û< ÈËV÷~F³Aþf)�Nu÷,Xa¾Kû§„¢Ë>¶Š7{ûŽ�îb+ùC+Š&ÚÁ]ñÖ¸Zü»VïÍh”Ôx¼‚É��ÏFþ»×yœ…NÝI�îC¨¾nÑÀ~`ø�g°zý³Y•Ï@ÇX�ç‘'a¯ŠGN êUí‡^1òÂá¿ZE´_€-|ó»3Á ì0§ÝÞ¤õÕÊè嚃ÖöWc�+j3€Þ~3·ÔtsËñ ö¥ùðAˆ´þ&ÈôÐêhzQä"zÜD™Ï´ù3^©´•pÒöÖ4:2Å�Êmɬf!�¢ô…Ï϶M+�lGWEÜ6g©ò=nwá=D$üƒ»¶Ç¢ó‘Ñt‹EXsÊ�\¯8 †Ëмc™,Œ;n(¤@Û°1–ÃÛVd6Þ�£Éf@±Âfi2‘F‹ã –Rëó#!µ¯Ò\b7­Ë.6(¼ø¼`;{ï>|üÓ.~÷½½á:ý¦¸Û[³uÅy¼¦ÛHOE‚ [ˆ?^W{Z+ÅÆ3lSÛÒÒ×+rƒ_xÜÁîuÛXҥů˜Lª1Eã>mh{®Ð8C­âMõÚŸÍ�Eºp ¯}–âÞ³êú¦ÏUÔ3* eŠÅU]÷‹Õ¹ _.ûÚØO©ýä;3s¼ÒGL+GFi©*TÀ7'€™Ù‡sOÞÞWîn¹�I°è” v“©¦Üdz™‚»ã®, ŽÕ3 —Ù ¢&;«—�2 ykÚ\nú¡ �Îçš3:²h–k –—aTƒÍ™WOŒ¶/E'•Ͱ™x±C­É‚<Îxl3RP�¤Í3gRc–­?/‡½=„Œ%Q þέY=jW¹ÀnÍ b³ u°*„?Ç‚sºÙHæ!}6¨A»êɵG¶Œa-_&¿‹ò«ö‹�Æõß[lœ|ˆ«®È$ ê&�f­€ö\ A_Sî÷0¶¾GnuÆQ÷µ1v ¶qÁiÄ™�nմ߸ñ§oŒ,›Ô�n=À|Tˆ!ìÜ-¢€Áxîœ.°:WØ_¢‰Z ä*­™iíç¿lÛ–ˆ¶q�á`@Z¤#l‘Q£'Ô_(d–Ï%&±jÄ–¢’�Üq‘™UÂ#&-ÀH¦ù3ËÚ”õ;d}­Ê|èù:•ä~ îW‡�‹ž=“#j­²#l‚æüjÆä²ä9|üZIrˆˆÔH1ØJnî³Íà´ûä^Rd 1DÛ=þê¶Ù» nɳÎ+bÝE€0§5Í1¥¤¨*Gì—QnÖij XŽ›TMgÆóÊm¨w¿vìýu™Æóp–†òPS,­?#xZïiŸ-G`1<ÞR{Câ�Rž ;lˆ0gΜ¿BÁK%7ÙïfÜ œŸáÂÐŒ)Å 3kÜ?{‡áÛ�žgáæ’ÿ{€ÔWmlpV cõúÁºñ478F�׸ЄáhÜ„°YŽã1³ÑýÕåW#l…Â'«Ûï¹tá°�Ã,‚ÂÍã3øà¡’gkâÚ Ñaj8d™ÃÎàìð2¢Y[ºeÚvà½BÔ±kÈaVùzÔbùùÄß6‘º5p«Ynt«V £[mC0yGJО÷qB&Jú7ã¾ì]G=N‹ …š~í5ý°n ˜\ÂèlcûŽqÆÖ(:C…NƒSäÀ>B”Áð–WÀ#¤•ýi²M�ô­±·ª-uÝŒIä×|[-úß=áð¹ïÛ{øòÙÏp]lr-[þ’¨fþ/Q^ƒäÿ[ï Ô¬zÿzxÖ]8좘htÀ–ÀxhNÜøÜCâZÃýз4…‹wÃÊÎy[§ p9ÍâkÊp Y¼¾½nâ}ÜEðØÚsê|˜V‡Ëºþ¸INW¬JÚZÀán™õ&‰|W²1¥¬z6{­)Lê¥|š„Ôõ×<ßÇd‰ [„®©a¹ÊÊšŸ%†Fˆ ÷šÅ°]Å…çØ§ôbšðòï�mªÍ£ˆ@wÅ›u©¸oSÈæd0|—Um¿íù‹ö¦ÝË à1Î…:g‡ìUèl†ÓøòäÓ‘3€Æ”W' W›îR:Û–“¶ôûÚKƶ€¸e‘_Ñ zu•{®ñä‡Þ‚H„‰ö·ÌpPÔ…±»0h °LÉ7àlÐâ•; AYw>e\chÌŽ/X�� ã 36G‡ÓcSÝIõÁ+ ÀÊ*~ãŒjóáÛ¯ó‚º7‹ÙÈp�™vò7¨Ž£ëÔ9eÉ^�8b¶ƒw¼ðS«ó“'7?}³Æ‚„è4’¿=³Æ›Ià¶<ÆçôÍ”CÕòö.?†Õ}Ó’|vK�E~ì]~Z0@ÓeIKRxH+XæeVKGΚ¨Æ•UªM°ÿJ�¾ NXÔnŠ×¬aé¾ûÏ�Ä�&Ü"p�òß2xP8853G¥85ƽ»ŒÔMܘ¨,y]EÝ®àiSmxd5À¬ÖÞ‰ a9x· AлŒ³Æž$î'›ªàõ×�kŸ,¡¡ŒÐ éx �¯ Ë^ècQie!_g06ýd•€+Æ`öº›EøöÔ-‡=ɨ˜Î°å«ƒa´¬êÁ~ÏtýUиÎ0_k‚–�ÈK®}=Ýõ†Û€˜J¤IØ,ÎIÞôùžwq²³òn�aÚžEe®7•GRWÑ\ùp„P¹Ö x\°) •Kó»"û,’2wù–QÒñYÇ=¼ÚPl3î~lRì*Ü22½ÌNw–]”O¨¥‹`yϹ»©c³óôûgcsEƒx‚PÃ`QÕóõÍÓWý}9[!Èá‰"”F…OFªuîy¯‚ú©�¢6ïà_cÔêûßmñ´ VaãçQÇß ˆÝujˆæõÈMÞ#ñE œ„�Ï·¦(‰ ¶:xöÛ|�ÈHî8ÏôjƒŸ2Øl5=`ä¶fiä�©á|MºkàAÍã#æÅ�Ê xÀÂ<‹:A± œ$/ ÎŒõ†^ ÎÔ öËoiàÝ›ÛÉ÷ŸÃ„î-wgg‚¹éáø›Ã�M);¥Ûüú½² åç`,o£ zâæ÷]ˆÆß¶ùùû¶=kY3œ¥>ïbtž@\ÎG<ê�ñ‡»“Fû4ØP-ôA3†šñ£¬‡t�(>9•%áb-¬³ÐêÁá[í&È�dˆÖDh>×Õ»ƒƒHoA+ݾÜäÒ�±HZõà<ý­V5§ŠÅÍ;ÑÚ 9Úf â >˜�˜3~‰k. lŒ¶Kè¦2”»|VbO};tëj˜Ôèý"= ö�‚ÁA:ìËFA3`73ûŸ@?Ý Ñë 5Øms‰b=™MØ5† @ÉŠY¾³dn´_S§Ñû�²Ì�j¸ «­[¤¶´ÆA©øAòõ‚5ì®j’c.ž{j5úÈÚ:åöBž†‡Ÿl"5Ý¥loÒ (-–iƒèzañ®,»‹‚y÷'ò:µ²Þ”Mñ¦3mÃ! �:ÅûTõq¯;×c|i;ã*,û‡ÞE�löRÅ–6½æ+$TséܸaõÜ_@Ô9¸|uòú–¹^Ûú×Ç>b<$¢ü�y”�ýiÜ6ýþê¤ðs¨›;\9óÛ«Hžì¾âÚmý©„ýw �-TÂdz¨Æ‰¶†J÷Ÿñð6òè.Û< 6ãäR×ÑÐG¡õóê�îRÖÝç?\¡|‡uÒw@Ÿ!Òñéž¼¤™£†ÛK¿[ëQóAÒÃE̘û(Zê¶§yçòsãìß\ ÕçD³GË>¹¢»64™õtãyg`h‚\EV;äf¡ÖžBÞ,>ÎãX/Ãä-³Y­›,2ÄLƒXŒ;yû¸Î07K®,¼¨—ŒÕÛ·¥{P�Á%ÒÄË’ˆ«ŒYÛ“áq¶>UH6 5.–Ó]Ëjp÷kò•í‘z1ÆÃÒo7ööˆûιwû×�mB£íÝà C¿Œ$ã¢1—9rûíÞrZGÞaçQ �¢Êè¯:BZç.N9õGS��ù’ÈäˆÙÉà6+IçÔ61Õ¸ŸdÌîÙfã7À;šØêŸ¢K~”2À5° ó—tÕd¨ øœ'íRýÍ*Ø |£ŒdÏo¢}¥F®v×Vð¿ ‘J2Bê¤UX âw£Û,føéÛ¿E8#&Hì»M„áÛ)/J¥/"UYí= °Ê«\fø *o>Œ÷†S´HÜ>ð“¦4×ÕS&’n¨õ‡¸@°?GxíÖ°8ÙySK亗 | ²XHãÌaÕüž¶n=A4ÍdÓ¯çðO,¹¨vŸSfâXL Œ¨hBFÀbÊ4cB¯\þyݬ eíG1Î_Aoi½V£Uòê�"¦_:ºžwй'ÌSD8Àݱ»T–©ÒŒ²+»IÂå4 ¼Õg%g¡M÷v÷ž®#÷¼MÓŽxkëï?YT“A�ÐoÇŽæªpñSb f¬ çÏ­q�’eˆ‹6Ô45Ü„�º°è;º~àføXøsÜæ«V5wº¹”æô§Ó¤M£Ü6Ô£¤û}#@@›¾ÀòœDBØ at%+»_uIB®s`sÍ÷©pr±á˜îoÿ¥)@ÉrÇe�\B¾ª+!Ñô¸i'—Tè“JhIЉESõý¸ÐùªjšA$h)J ãº�Sç—&ôÑ×]/Z¾bàSÅâŽÕß0¬ð œ.Ð(=ÝUÿ�ø77ÅÂÐîu/Ô ”ÅmJRïœ-þv° «|í@£²-SdÒG¼P~üþ¬´EPPîbÄí×UéøOË¥1©«LàÃÚ”a’òþ˜ †ëï‹\^nËý]Ãêĉ˜±â,¾y~ç–¹îºÓ£¿{Îêyæ�­ 8UÚ‡•’7׌ɭ(T8Æm.N´Mp%›©ŒÜ†ŒwpÉ*6ÏCø–Š4÷šiÈRÉÿĶRЗ©Ø&g{¸ÝÛœ®0â¹ZÒA c*Ú§:Ó<ônø;Y�œ‡¹,f®ªº¤Ÿ· ½ìùím<»nëiÍEÎömòÛçPH_zÛVô¢yÙÃmPiïW0áS‡Ki ûÔâ!ÞJ;œnvUš¿0Øépžv9C}ª6óVv¾¼úòÁËô¹ Èd†©4§�� õŽëiëP&Éc·AD»£ðØñ‹Ú,a grÍôtD×m*cƒ&n¬?dÙDGµc]z1¸‘üß§˜>­KÙ/£`‹a÷šIM-Æç¸t3Þ6ƒMáí¶{ŠjWsãà†6ÜÌàȸÀ)W«¦¹Â ¨^r4[AìhçÙhʤtbqÒ‹ÄÄ'{,Eò9ç5žØØB(€OqN3šaK5ü¶¼SØœüš™±ñ9–û¥ÂU×ÑŸ·t¸îL8ùzÇê¦90Û c"x˜d^ƒåKƉUzÝÿa'JÙO6œB,CÆúúLÍ �omá;a±{=dYò üèåü R�Ó›‹ãlc§êª0ŠdÏFwoñPT¾~¤g ÝJùD”xiޱwBrl3.^Ô-jx$ÖN:upÛ¢¾ê�=%[Ñ��Ï�ØOœn0ní³(Š}dê7w€�V§)cå«S¨Él½Þÿ�À{î¦L'Í¢;yŒÈíÌBú+¼ãOøqéÙ÷mS+H�ØoÃs�±ågóÚ: m|zbÖ½Êg—ÎKÛ¿$,; ¬Ôäu«*¨"ØÕ1I…z™È³lm‘� Œ`Ù¯UeeÍŸN·Ke1¯Ñ8'c_ÇÉ\Ht?‘J„Þø–e€Å <�¾Ïy~!žû_Þác‘Œ[—œ7›Ò˯V¡"ÐVj±�O\ _r…g<;_šô"d*76þA%áapÛJ*æmö½Û¨Út¦›J�]Ìó– æGOu#­^£M½ ›Å¥àГ³<éÉèZmÃÝ‚äö%å>õ<7…Dì/â·MˆmÂ*EŧIítÐ4Þ£°Œ Ì¿*¡PØÐ…KKæá¬I€Ê�ç§Í8ù6Á¬¶õ°~ïiú=]%™�A=ž¾¹¿-7¼k5pÇìñ£©éà^³z´Ú*ÙŸ*™ênz|,Út™/jÐÒ1«”¦=øxóuƒ¾¿j®šÛÕN\Ú$XôhçiÅ—£»hï×ÍÙI𘺂úŠ^Åvó�]‰ëv,„ÀYtà;ôáñÇ [-F† ÷1t&Mk··µPÆ3K»|jÊîÇWÍ0ïlEs£V%*ëEň/ŒÉ¯`¬™}§{R]˜•6Ö3Ó|n{%¶f´%Ðú*ס£ûÏ6/�ªìB£-YsàˆT=õûC÷=bÄØýªlÓºŠy1ŠçmAr{ʾIìß¾©±Ïº¼hÓ‹}°Á› ÄÖòÁû×Px¼uLœÍ®g’€ì Üs Ûüüaå·Ÿ9ÚwÈ";æ}ŸÕ:=fÝ;Sqé}ñîÕÌû9mg Ï«ó×Vðº©D_Æ/¹-�[2 ‘i– HPb¶mËvÓ‹zß? èç�!=u¬N{šüÙ×Ý�Øs©a?\oVÐŽF£mM­®¸@k£¿R�ñ–ÚÊ)¸7îÊ1š„ÜN°‰zË�_¼Þfµ{óÂh× ˜àä/ž!ü7öcßµ ØpDäx†Á®¾“j>®ûUa•=xIŸ›ùö2ÖÄ'Æ“ ÞR> +füc§‚n ï.ƒ†2d»D,¼1·Þñü,sGas´ý]Ø}+¯¸¾ÄÎk9ÐçÍ™´"’¼ :qºŠÍuüþ(ÄÏ6R÷‚AåÒ,Ríj˜}¿Ø³‹²XÁmoÓÀ˜¦}c+S×ë[€é;’ ¯Ë´P«ãI©?Zn¢½R?»¼²dŠÆÿ›$Û�½ÎõÃÖ¶ñrUÎB â=ÝoîhÛéÙž)o¸ç[˜OÄ·J°[ŽŽè¯3ç'ÙÀ ‘6y›ˆs&ÇÆ»PG`ýßk­×Ôö“¶Šl(@\>²¨ú±EEð‡G|ÌW]J,¿É÷®ñ�å0‹Ý[ÍmR(Ú€^Mk0>¹š¿ÃK�²]‰¡‰B¹gP)3r³6Ýìúîװົµåû/Ôú8FXhìæxèeƒ�Ìn—Œeù Èš¡JXÖÙWK Ó¾-HØ36Õé>^-öq¶ ûdM©Ø½ÚúÓpÆ+ra_¬9‹Ê¦’À�'6\ÆM.'A]8ý\ÙV@w¼dPD9Ì6C…åíÚ/r`6L#‡)Ñ«JÜÎ6ê¬9í¾•õVñÏ–¶]^inží)ñ{w.‚Æ¥ŸºÑÈ1­ó} ;Û}ÓÌ@Tób±â\RŒvqRíDû´ÕÌiyo Љ~ñ‚ÜÛoa‡û`íl[àcŽ5W–DÍç'¶sTÍÔ• ËJ=÷«UZÂæÅ­¡¾Aš³1r,âK¼#ƒHn‚¬cx•‘Õ¾ÇgwüwÁê%?\ö¬`1�¬ßC}º1;°Íº*×m•1Ç;’My¡GüíµÁãt‡Òðj5/ìŸëžáÇèç7@¹¶³ÄÀ4gÅ´9 uݽbaz,FÐíB¡lP:XwhhÝü±je„Ö«…Ù³¨V1loHle¹C¶/>³t5=T–S;ÄòÇ_¸šÑ µún7{Ú{@ò„*!m·¹¸ ê{X¼°' �`&­P^âvÇ B®qê�æ–/©ÒFø¢Í+C+«¶F°™Õ‘üôc§~ô{�4�gt"ã¦2*¼Í Ew{î‰s·‡²w|ûÝ:i´2C†ÔdøÚâµË”›Ãø)Èôš2~RGwªžÓ—9kîÓ!Ýë’öo¯XSúvA1ˆf„ÝûRñ&cÅ�Ú yr6ÍQ¶í]Ü{dû M!~|%�ÙÛ%CO˜ÌëÐô0èq› ¾èµÊ|økp   AýñûÜð&0·‘Ö ÿ ÷ã6í�9–ð'ÐÃãA6o\íÔ{|õ‚CY™¸PÙíà⽿‡†ž7Ýì-õåþÂVáq°=N†-o¾Ì¿FžôáØ›œÓEÊú‹sàÀó»Ã­j JÈtzXµ¤Ó³#ÁJNk]¥²I­KºJÀK̵³Ux^¿Ò ÖÜÏÅØ†ÇÚ¾Çfå4ü ù]3¬»ŠiAÛÌXm¦ra’´2ZŸ%…1憟ª‘•JómS±Ëô%>yœµpX¿$ìS–äL àÑÂÅk¤“ûc«Vq›n€xq™åÁ)±™GÖ¨&ÙÁ#㈶ÚBï\î5ˆß2âL³-±°æ·ì(ðt¡°�DïÌn¤»�ÞE(ç ¬Ëà¡€{Öí"À>Å ešC.q¥ ¬1Få3{tk[ßv‰žå#<ï{‰½*¦6p½@ë®÷~<©˜ß“9ÇqÖOè²ñlMÏÛIæx³}À#Y€[uqDì¦ôa–ñúd�8ƒrц~Þ�;Ç}aýxÇ�ë7=W¸ÊvÑ¥¢Ó\^G�5ŽI²‹] ÈŒ²ñ Ã@Õ„tåñcMœ[sgh;+(™̉î³]:}µ•†±MÓçÜ»6\/¸÷—ו¸�áÓõBÚˆ}®·áÝ/ëŽnže�©üõ‘Òû¼Õɽ&tf7ãmÃZ¦û ƒ¡�#°c5ov�|gR1Î4¡íõÃØŒN„£AžÝs¡Üì,ó~Ç÷ß�¯àsŸºàÇrR8å¸GÃêV_7ÿ;„gàÆ\´­ÐÄÓN&>=¹êÞV¡ÍñŠóe ïPó\õÍÒjÞOñž*ÏjZCkN+iŒEdböÄÍk˜QÕØ š ¶ "ü8”ZÍ<Ñ+Îj ~ïÁ±­ÈÓ™ÜÍÄ1ÞÕ:¿ä# óËÞ"qeá¨z d„W OJÛ%Ë#àr–rdG8æÝ,“ýnÍÚC¹ïÐtbÀ�ØéQºûã¶�—â”&D/íðQ”šk$ì2¼@¼sPœ 3ÞóO1x¿ 4¯Ž“lýÎç†yÍ ÙÞ;¬ò6AmE4 €„…gÉBODñÞ`6³Í ©ç"T! ÝÉQK×[M›(IÏ› x{ëMB¯rú»ÁL\‡N’dl$BÛé:/‚S+u÷e.Áíü)Ë5¦6©mª¼ÂPY6n¹îhÄ_©×}D×7  8Î%ôhÌ”ŸÉÆM¡Ø»_ÇøCXÏŽ‚Ùi& øçŸÒÇì¾ÙQ¹Ûq÷´&u|ÉÃCÞSIŽÝà·b�c¯µ¾µk­.0™Í”,+;yÝDäâ�«¦¢±V‘u¢5+záß-6Öƒà++Äì,&¶ Õ…A­Ugš®�…õìa²>ÛôùÓŠ*QÉ$ Å£©Ûk„bì´>@¨RP`RX�·ÓÓù®<¼HÍ�1 ”\ÛwÀòš2xQÕ^’ÎøP­ JÆï'5mT½•á(Áx¿‡EZ°!^ÙRËá:%åáãi¼XDs ¤¥ÔŠ•Í6B¥;_Äk¬¨å]{æ%ÍØ�¯¶×‘7Ž·BÛNL:!wKd¡i°^{{S;Éê«^mˆ!¯²˜ÉÛ½U­ j’¼Ìßló½€.(«/¼VׯS¿Õ×94�Óo ÜKÚ±HŒÜ—êñ¯�žúöHGï´ì”`Èo&ò�X¼N¾³}‘ö¼Ø[Wæ´kð°Cöþ04´S™”�ç‘zj…Åè}½æØZãš'ÚK^7H¡á ı§x“®ó¥®wy A¢‚©o82©ÙnÌ»¦{H:ŒZ\ý‚èê/øŽ›Ã¿�í…òeÅfh;Ú�$Á‰§å _2Þ«…xC\—¤û¥ö_ÞÓã·ï/ÅŠsÂ9r¦!¦¤% .)zRû#‹V£<Ý…Á1 zµ‡>Lëœd¶°ù,Ca*¯�Gq¢N%}Øä‡ºc¹¿[r²×犻FbHåÞ7+$?¡j¼¯Dƒt¶‡d9߆×=Í…âT;˜€ŽOÁ¤)¬'¬ÔkM¡¼¼�ðjV×ñmߟ7?‹ sIæ+“pŸ³±I‡¶è=:{ŸX›“JR”¥èÿˆ*ÿ¹L(< Bȃ2„(¯üTû˜ ¬“)¬µJ¯÷‚c/?ü ÿøÿÿðqÅÏàÏo´nî³[:»»®ìêÝk´§nqhuÜÝ™v·23':ÜȪÑA@R€ €€  �P  ¨(P@ Pï®7€((@^ñõD•QvКÉÛR袺ó¸ 4Ò{œví͘ jZÕ*›,Ŷ¨’‰ TWe k@ÛJT…Û(•;nÎl9–RêÀ*ÌN†Š]cl¤»0í®ÌUÖªQ%Ù¨”�SÞ÷`¼ê»eÔC:J J]k4LQ!IDm€ WJ¤€éXE:V-®š‚•h A$’wqÊIE*” ¨¨¡5I�Ͷ‰))%Ö�ÛªŠÖÛUP•U(¢’ŸFz€6Fš¼Nº¯ZU"PºËcJ(–�4»)B¨(ª ^»�¨J SÖES«»š[J´Õ¶�J!¹wTQ­IU­IA!l5%(R”±Ó©¶¤öÊ%^¶š…VÁl^Ú­´WF¤m‚¨’‚ª!$ª…9»´RR(ª‰ÛPJ·aÈP.†R¢¨€€ ‘JQ*#³R©²�Æ¢„¨u;:Ô‰¹šP]²)6IÛ§#64]i)Pˆ%]ÝÙRQE*…*]1HhÉÓªèjª…UJ'-.Ú…)Wf´iAlÉ%QJ¥ !ÝÚt¤»j’ÓU®µÙ»áqÈBUëH(¯¦õ§°2!$¡IT�T)ÓWVÒ—M]™)* "©Bvjë*¥R”‚ìj@¢AB�7cP"%JvÊ)Õ)J) ª«�‚Š:ÉTvr‘ªR¶bP’šÈ�(ˆÓJ(¢ˆ’¡"Z5Ɉ¹­�Ýœ¨'m«kÖ€4PI5©EsjVìtQ³J›n�‘]iJª*Š«�ÑQ +Z"ET U(‰£Neš¡ljªv«kmUQ!@�h‚@µ®Ø•BH)Q\îSŽî]»dU-`Í ’TD©¢©@–µ^ZJ¨P’¢¢*¨€ˆ®Æ*½-•.ÍQPUJAJW[Ù¥ Š•B…íªˆµ’ŠJPzÝhUQ U")W½¸yãÐ…=îªóoKFE5·œk¦Ô».Þ†ôz$Ûƒª¨�Ö»„¨½0(Pi×@©)RU!Dª.š�%*T•R€’ìÔŠ¶3aª¢]²Fµ*‚�t:‘T(B�h¢UJRí‘UnîJUQ&•ˆ»Qª"JGC=Ûª©TPTjl½²HDë+¦­¬Ý2DUtF±T‰#§]R¢í‘R„T[4ÅJÕa("j̶ ›M¦š ¤Š ]˜•ÖBR¤ QB�CZbimMul‘IÙ­”M6È�T•D‰DìÝ»jè5ªìîd ®�$”µ» ÷qè´tâ¥Pòj*¤KÙ§yÝUOk4 !¡R(;°æ† (R±šUTæÒˆT… "B* “f )MŒ$ ”‘­Pt¨’¤*­mªP’'MJ ©ÖK¦—ckB”£¶P�˜Û$:Õ) TØÔmŠ;¥Isiª´Ô*@Û¶Ûc (®Ì’ZÓ›PÓT’T§^¹•öe*J$U Dz0@¤¨FšÛJvʦ°HJRURµYRª’‡l\Ú:kR„…IPH©*T([hR7»ªQIP£ÙªCl©)£i¤#Û)+[[KaÛ%U TˆÑ¥Glª�ÛZÕRª”JT‰P • T% T@DªR *%jÌ †°©)¬R'l ¹»šRB¤ˆŠ*«›8:·VÌ5ªM´T”¢(… EP R‚¥P$ ¨ÛA@›d¥*SáOð€"%4Iå=@4©øƒ&%)†€ 0�? ¤ª‘£õ4õ4dj©ù0*bÒ‚2Ó@€JIL"ha�#hM$’’ $Ú„ô54zCM š2×ÿIþßù«*†(Ÿ÷åÿúv•Qÿzº­\3(?öt‘ÿ"æ'ÿ3�êèhÍmÿ岬̅ïÿô£Çþs¹¨¹uš sG ¨¥JI&cFº5–´ u3*ê ʫҕá*ªíV…PT9Xw½&\å vsC²²bojË‘PÊnÅœ(ôÄ�‚¡5VPk¨–Âæ´[9QáéFV�üü]OêF®ü»øþÙöµ¥=ùîþ½úâ„4&„hOÉ¡@¯ûÿá_ðØÚÖjÛÖÛ+ÿmŽ�SÕ£qÿ½ºv1¯v8î;»»®Ž‚ö=v°[W»ªê�bÆ��DÕPWUÅÑMÛÐFÏ»ók×]£wtqéënž×»»S{nÛ[Zm¶ŒÔA·³ouŒöÍ�ì`‹Å­·¦ívÓŠí«¢ÆÛZvÕZln±tQ®·'ŽÇkj«{nÝfØìqˆèâ+zî·¸Çmc³½œvÑížë¹½÷›`Üw ¬õrn“j*1m¨íÕtZÝ»�klÛ8öêž,{84tsvÑÄFÚÆ1q“®‚·nëj®Žê�“on½î:ÄéÑQ[;¶omÑUhÛ{¶Ž"*Ö+ª5Û»[[qžÎÖŒh½Ýïwvã�µªÛOcA{ݸ6î«°ovêÖöèè 1÷<�Wuž:ÕÜb¸ÖÖŠÌÆ*¬”tÛ­ÖÖkÛAÛ8¢öÜWZÖ«­®íu¶¶;[mÜ&Š&h)Õ­´×lÑÑÑÓÚíÛnö⋟\ó³8³[ ÝZ-b+uvë£qÛÞ¯G[Që¯xÞŸEvîÝijÛm¨¶Û¸ígvçkm`¢ª¢*“mÝÜX«3íÓÚ1�¨&ˆ­^ÜÑq“·s=uujØÏG]‰6ضîÝÝÉq¸5UÑ¢ ‚�]ÔØŽÕŽÝÝ=Tv Çn)�±¬¬»·oqº±m«z.¸·vŽi­±Øéݹèèîâîîº:Ý¢k×q¶w»i1ShÞ´�q�±TÝuOn»�­9£è÷`�j6ÉZs;»vÝÖ¦é·]]iŽÛ¬EÆ¶Ø¶Ž®î6u]»«œu×Þ5£ºØ§Yªš÷u�GcºÛ»u뻣kElUm�˜õÓÌØ=:¸Ç»¸Å[7FxØÝ�Ä–5³vê»·«§7ONºê8Çw»qÐw]ÇcE,vj¢¢¨ÝÜGlSmlíŽÚµ¦Š(‡µ¶kF»Y´mFÝÜ¿6Š:õ¤ª£§»wFK³žÖ×dîîÎÚ jtTÃ]Åu ¶Ôv4ûsÖ·m]èç®ìqttbÝŽêî5¶±´±¶ã—§»ŽèèÇuDZë§ÝÇDw·®�µ´k×q¶c]Ö;Ž®+]íã¸ãÞââ�QTìj“lö÷’»b½Û©Ú­¶ÑÛ«ŒlbªØ­S¶ˆ¦µu×j7sݘ"Ú(îÇ»½ì[°DØÝÝÎŒØÛ®Ù:7N;tw8¢¶2fÞÉ»iÑ  ‹Td˜¶µµ`É뮌[ÛEÝEØÛh:ÖŒMÄãDMÙÕÞÞóîµ³F»�Ú­Z ×mÔÚ�º5ÚÚ'ƒ°]¸1t5A]­n¶î+±�A»w4{µ{Ý·»ÌvÑÖ‰*;ìAATtjH³XΨî zÆÞ=�x ¢×»«Š,ÛQ°h··]ƒFîwuÜmmº11u�EµZ�cj3¯Îރݒû&›×­vØæ³�ÝØì÷zzí··uÖ®½·hÙÛÚµµLÆhíŠ/^âŒ]ÁÝXÑmÅ�%u]Û»zÞØŽŸIqm±±ª­½qggm�lÄàØ¬lûÛÏ�‹tà9‡®zî. Z+km�±F’6wc‹°vÅ<Å×4Uvë=­ªšÍ{·u·¸äè6µE¶Ûmíàö¶­£^ç{kxîÖ›äNÜz õ—ÄëGMÖã­ˆÖÑ¢ÛÑžÝÛF6½»»�sZÜI»ºèÆ&5V³V4A»v�K]�íÞ�c¸ÚÖŒ½ï>½¶6 í’#µYîÁ\k&öî;ƒGNŠJˆ¶ñwc:"ˆíÜnãž³‹Ï][UV;œõ­]cO\ãE³´kíª˜ìQ�³{£hã®îÛš.îãµë«gˆ‹£kcOq¢JŽÖÕ±‹ÖÛF‡6&¶,ê+‹oZõê¨è™Ïguj}unÇÅÕÖŠ‹;Uµw`ŽÍîîc½Ùîä7mtºÝÝÚÖØ4»vî9Äõ�n©»ÛÑ·qƶµPÅNî{ªÅÔw¼ïiÑéz¨‚=œv5ìVÎíºmÝëÏo\Ö«ìc°á ªëvÝ��MRQ^öè}&ë�¸ã±ÁUEÖ-ìkI»vz"z6ÎÙ±îNš(ô—°ÛO£{º=Ý{oU]€ÓÛVìœÔÞ7UG£¯G…ý(®D<rªèbH©"(¦ˆ–* Š J6Å-±¢Š6ÍQ1¥ÒDRkli¬F†ª–«Z cECIAb¶©hŪ-ƒClj6Jh�S ¶+A¡Ñ@Ú �&�¢”Š+Z(„ iÄ骈¢¢*‚�j*JuZ¢‹cF‡TÒš5ÐRâ¡-ˆ¨¤tâØËDTD`ˆM¢›[ZJ 6ÉNÚ›cT‘PRÒiÄƱ ZC­S@QUJQMDÖ6ØÕI ÑF¨¶B´iÒ(¤¥¢‚¢¡Ö ‰¡ˆÒš§N«VÅ–ŠXš$1•¶‹N�³M iÐÑ@j�,Dm‹FÙÓ©*ƒ"‰…WH�T…ÐCJTDQEQAEQSAE2UMLµ%0DMQª5kb‰#X§ZÐ`’¶Ô‘4P1S¨›ÖÎÁ¶ŒC¤«b1ˆ˜Ó�ŒUAµ�­K¡¨6ßÌEù‚Ê Â€H)$‚$¨‚*" ÌT(Z)¥)’*) )Y a!@L€$  ¸@E��@Q�…@ ¨¤(ÈŠƒ È(�¿ÜÿËþAŠÖ¢ÔY³°ZÛ:ŠÙk.µ6¶Ñ;XÖØ³d‹Z]Z,¹²kÆØª�bÙÚ±´c1ŒëUm ÛcF�­QZ¬íÖƒ0Fض�E´�δXÁ¶�Œmƒ:(Ä[Q.1¢Å�‹Y¶š!"!"!/¦½é¾ÿúÓ—ð½Y+ï�mTm\€ž}ø úÖ¢4â4©h»1´[¿a)¢‹ˆ¼é{*”Ë©^®L΋§t'{_z¼ÎE.¦;¸æ8xÇ`¬BJt[;ퟄÇü剟d7ÿ¦÷–ùÈ�œ5ÛuŒ¬žM†ðq°è•›.¨¿•¥Õ¼“ ¤ ëó†3¤dÕ,.•…÷"5˜Í±…Uûy—H×çx$ä¥E†ÂÇúyÿîÞºö4x¥½ ·üü]µŒ?øÌ ,™¸äŸü*ÈœhÚúŽ/Ô@Þ ½S¤-¬}°�”tµlUiH…)Æ�Ú×ÄG!®\¦tñ Yÿ,¢‚ê”&dD¿ìm® Å™�÷ó†IÏ– Xç˜âNÊG¬�•æCòè3XÁ@hkƒëôÌWHj ª¼€åÿ—œŒ´Õ^Ø<¶3¯ ùqÎéÃþ]ë-0 ¦Ÿ£¯ëc;0LG%Ò­½�þVÕ6ÌGg‘l^µ$–©gi6„%ì!+Ï`/„z•ä–³”dDëµYtž­{öž µ§�hkü|eÜÜ–_™|ˆ3ÜNXÄ8tëkÔc‘‹i+RÑ,¼æ­:¥‡í¹XBSÙPP´´E‚[�VÖTb­°ySâ©�Õm¬xª•Xîá;Pÿ¬m¨Údß—ÑÛ3ÞZþ"»éyÛËÇÿ¨¾ê¤\Ez zE#^¯™àí©( ÒÌ©F-üWÌy¥±ÔK5‘èµ^²�%áY–àî�”^¥¾e¨•?£Kp3ˆ™Úþê÷7b0•zN�ÁûzS�¸CV¤³^Ë>® ï�”W"˜Ùë>ÞÌ­w"×'\Ïü%@T:4êq7ÍZø']`Í#dT~e° ÷Èyôñ— ñ©V%¢¨Q±U·³Xmãµ9±éýPýòúàœjTÍBzïÞr� ÇÁ.æ<ü°56tÓéªò~¨¥ŠîU^‘ÝMÄ.¢ÛoýQ39°`&p3cÖTt–T8½–S®Ö ½…niü±¨3øùúšój©è7â륭öØ`g5Þ,j¦db§•ÜDº.õÚ"ÞÀ¤¤-û¤#°Wh-c*{ûs‚OeáøìšÝLyñÏõÝ`3––Ž9Ÿ€›Âÿósæ67—÷’qKüCbŠÕÁAÙÖglÿìñWÉkë²/ë}K=™©ÅäÎãÖB­s—ÄÃÊ® 3 ¾Ìò�W@Ø®ã¿MŒ»kÑB}ÝΊÔ‰GC6ûDû…ìüg¶ rJTŽ 9Á¡U³;&ü!Bƒq‹¦_µÓ $çç™?^†Ö|÷g­agùãb·y(ið±äòTºÝv'2C•—éã%W¶V:Ú;Ó NàDð¾!øó»=¦ìI ýªÉ0…g–�¶îÝ| Ü,€|¤p±VoÈÐ* ù@›k?{]˜ª•âQB„¤f4–æ-;‹Å`˜`\u¤HX�ˆúeUã3iݪͯ*ƒs >rG¡ÏJîJOEf ºML=•— ÉC·lâ­Š9?4€Š2ˆpSÇ ¼¥‘3)A¦O¢¢äz\‚J5QßÇUÏ8ÀJÿg^HjÛ}³B�µ¨…¨®€-REóhþâÈÕ[éZ3%¡IôUø•— têj¯2 ¦Tºõdx ‰x ù‰ÕŠšßU7>èµ-ee‹ X^ÐBžЬuÒ"³íä�ÓSU¾Ð<\ØgÑ_¥_Ø�ª+ë{Ã:ì´MP”Z’é(h¯šFš–ÂF+ˆõCî.øÇPÂ>sú«Œ;‰,+;�1ëg®”óÒ¶P,N»cC¼ÚKOXG“Soè†Á„m½§�•Eq=]ýoÔ¥±e?áÍU­þ#ÿŠ.O³c>&õ iR,¬úÀvRWûÔÉLˆ^~aVÆø,�\|³!ˆ{KÔ³ô?\ºp¹JÛ|}œl݆6÷?ïx{kCÅÈïy¢ÿ"ém4bkþ¹Ð‡«‹P \$°)ðÅQZ¾éeØU�ž¤D¢À"ÁBNçkc;ÉÂÝ#|ÞX-ƒD‹©ï�Æ ãÊ6ð^u¢«^Ä©[d§Ú(ÓéŽ 6LJäJÆ‹WÁI$«6ÉÚ©Yœ^N£bó€û áóCµC•�R»ÿ>^ÅØöB¥ç§÷Õ®ç EÜ¢Vù™s{·� ð÷†�³~Ž›ÐI™.1ÕÄä÷)#Jßæ&Ã.ÂîžFÙ”»·¯ø#T$¯wßjh‰^p· ì_ÀYÊ�f;G±þ5ßÈ˯Ç~/X®3“>ý}Ü-»R>ÎѶ÷™Z _ų[QZBÜû÷„ÿ¶I½ÞZÜjÖ©là3ÄC¬YRŠË%v–OM^ììPÃ7J쬥�qw«(H…¿ÐƵG<Ì›�� &Ó- Р50ƒúá&»›Ø÷gÕ3}~Úò[á«æÑªxUßöª{GÝ#•é¬ÝíÛÍ�â#ã½à„hß��”~êã~µ,¤¥¦<ÌS£Õ‘øªÔÑí:¾LTÁ$?m_­MZ�%ZpøDïþš‘ŒO�¤-ÕT{\ ìØÃ)OZG ›•iÚPèúgK½€›‹µ“zÊhu€4zâF+< Оת=°Ðm5w6„ØýSB¬þ°Ú÷L&¼”È P®ÙtÞÝ5º Ú{¯õš¸ô½3òÝ“!ª æóQÕð­]ì9Aº V\­ÜÀB “»Õ'�U›ði¬J­xÜb€‹Eáö™9[õ¥+cl¨$g'ÐJžu«>Ľ”‘à®&Përòéë5JÙ¾ÒÑ“ltPµï#ª P©¿rÜݨKýþG=R UеÝVCoÑS½‰âz<œ‹¨-ýÝJ{Vº+jp0œé»ú¥õݦŠmòof½|}]*_]ãõæÉN}ª’¼‰Ëa`%üdßúa!{Ö ±?I: 5Þù¡[´i†ÏÞ]A0°ržÄú …—mþsÐ°Ì „rÅ©[ï±ÿ>ѯ§KùU:_Ô6é+ˆ¯Â\yû³Ý5Tgü½ªÕô[]‚®6Õqù['ñÎköê,3çpöÞ‚k(Bºˆ%^Ú Çú ¨Úû§õ”›'¤7�Q/{„~+Û1åÞ¡TƤè(O$à€2ª"¼:îpH"Çgðã=Ւòm”Al`›K­gDòÈA%Æ= ÈMUG»¥Ô >„öz í”=¶ MeÚµŒnG<º"‘šøˆj&�X’£¤„³iZB‘•Ì› nõÃYŒÓlµ¢N6ߺ¬f%Â_ÈÚh¾F[ƒâ‚ R*@0uóý¤é‰ÖY„ö©mL‘c¬©¥ª„¹”†tA×¹•"Ýæ*¡g‡gMÎb/VÓI9­“æ| ’OâÒka£@‡Û}&b&Wi|óØ:ïþß÷�$±ßüÿ¸ÅLˆ‹Šhnwþ% µT¿åªüZÒååkÒ_ú=ŒDÿ®‹8 xÓmÛV™Ÿ ­Xzè¬[ÿ‘1Q#<+:~¥Ô¨¥š½^°Užv¤ d«ÆßOÿãä¡ÿÑYdy²fíŒe*? »ÆËJQ|oÝwÓuÑTVZ‡m]+ÿž½~äÚ~ÃpbÚ#ó*÷âEØ3? áí™”üPðw€t€Š«oI†[µj \0î²Æ`Ô#ïΙ?L=Gƒjd|dTKc)I¬BcéqŠØ‚¹?XU&¶k¿’{ªâ‘S1¦ ÕÒòÇ MRÿ[w$|ÛúZžn�Ã-VÆÌRŒ˜èÃ�èBKºx¤µ"~$\yž�Öˆ‹ÖîÍO}V€ª�]}–M튃¨ Îj<Þ‡�±±âþwh¶£Q êXÜÝvÇ9”•’‰çÿ•ÊKqÒÞ®ñ•7½Ò4D,‰þn’§œ¤ün�ä¹*"7ñø¨­ì9VÉYŒÔŒÿu/ÕˆäÕ¯hæ×îh°…ÑÉ9î©qñÑ2èÝ�4$¦;Ù1Õ[4|õyÔö·>%Ä{m;¿+vН�Ä—Œê« ±út¿y5ÛE?šÏ¿50ÄÃß•ÙÕÍø•3ºâ(H*u‰ø «âß\TëÏ©‡Xj2–Gdp8Ū˜éçH<Ã×ÓíÛ ô¾´·ê!/vôV—zÍ]¸Îš×¬ûhЖ6êÊO1¨–>¹ƒl@%,�[2ʱ:sÕ¹x(ˆ5Æo’ͤÈocWÕue’¬ªBsJ=r«Áu‹ä\XÅ&PŠò+ïäc`“‚t&ªþ»š{¸Q=鄯ÆÍ`óýÙ!Ü…tx‡ÃÅ^ÍiSæ+™ì¥ÖUüù›�¨X}ý—⾩~¦}¦Û£îg[Þ3¡“ÝýÃíÎûgÃöI�œl`ËGL¼}ŠŸp:ᦽª5TÿÈׯ´`‹�š}*»„£Ù§Ìv)¤¿²‡ßŒÅ3ܺŠþN!±òÙ¤:YUP€'Ë=Rr~±ÓYI€àøJųš1Òv½¸câµRåå�} 7D‡7ªˆÇ­ÌQôy_}woö\²R‚ñ)KE&^˜™p Èê·ˆ“ð~ÎÔOªš¯…£ÊF‚ÞA‰B‰ý”²èÿ:‘æßÇwhågŸš•Öù|úšëá/jò¦·Óä-x�ÿrÜ#ã¾²}<5 C ú_‡•bÊ jˆ¼Ùö|ØÈiÞ¶ß Rä $±^ÊÒ"Ô ï0ì~0Ùù4 0ªü³ùV˜ÏÜuô–¡ëq –Õ_¾ÍXr [œ`©?éÁ“?�tátaÍU8ÿÞâ}4ŸÕ}°.´§Ø÷x~²³m;Ϫâˆ3?ÞÚðcõ:ïPJI±#Ö/'‹ý’ ‚Q'áK¦|“}y¨G+”V,�üHÜ«ýs^›0>ÚŸuoYÖ©ÖܲÎ�nìglü×!Z\Ž6ˆ�'™ÃâEœô/tß«¨#ƒ¥z¥¸À!²Žäùü¶ÅÒ¼ñ=^—â,š°å¯'¨Ü‡u•%Ñd¥F .[Qm}fZ -Ë—gTБdWôŸ~ÖÜAŒîôû3ÿkõØRHo‹=‹{´8÷ S%Áw« οÞI›½!~Í* &¹�˜_Ñ´`qáªM8?J ‰ˆQz|ndLyÈ¥FÆÇSÙºy‚Ôÿ½«©aüu˜ý·ëdg GØâu�p v›Ú»ªåu°Ý€zÒvá~é¡*ô�étæ»SåþÍð÷+š…ný{mftׯƾ¶@ŒÊœ@½Ëí×ëá®üOÁË"¾ Œª�dC{—Ò¹�Çf«^ERt|Tû‰�*LHýK¶öâX1–ûs™.œïµÆ *˲T'^N×IUÙ´€ò¶šŒºÝsÓÙœM;ÚÉŠbÄm}q\'Ü {ê3ó8ÔòtȼN¦¥b¸»QÜÇ�BÔ „k®6ggÜKÕÇŠ€Ç’o»ö‡Ü¦V1d•ÁÓ¬ C¶:‡.‹ŽÆµ„—v�?‡³•;¤G­Õعz½Š'Ïöõ2¿°ï¦y©uÁ­|j`zŸjïL–W§ñ‚þz‡Ô—ïØ³í÷`’c¯c.ããøæušiK`a¿4sê>c�Rœ´æJZ~:„}w"ÓW&®Ÿ:Z°eX�^Äœ HåpS?ÝåÀºcâϺݱ�%7·ô¦ØûÊÖuë³EPˆ½j{eÐ+�ŸwÑk=úÈ?Ê;Üÿï+–4PUÀhà€£×Ùî¾XçB/ �!é½|Ó¡ì¯\[ IÑð›ûR*|¡ï º~:?UÓw½ø œÀ[¡ô•E©¿ùV?jªå{毳éEß�'Áßì=œ9Z,ü_‹ð~¢|nè§�rƒÛ•Ý_MÃQúÂ7—íW„I¿'t\˜ÓLòø5â�u{¿p ɯyd¶çº½½kªÕ6ó]}Œœ¼ðìÂa÷Çñ7ì|î2óÛïй5–¼Ù*)$msw(ÿ·(P$å€ÞÕIvË�Z”8ì“Vì?‚ë|UÚ8 -8bÏ“‰_*Lƒã«Qÿ wtl@Þ°ø\ƒ':‡/;²“¸KP³?ÍVl*cZœ bóˆ»Ý¦gl]Š´·LJò¥àWW$¬§2¢éìÙ_´è.J˜P«u'\Õy—”5wÂX~ü&ÝFÑ&²øwnM—p,sU]˜a23î+8™…G*&Où‰q~ž?˜ªãˆÝJ¬Õ�d\¶¹U÷‰§ŒZœ¸›B AòJÚó-©ÔêÒw*#ß[RÔ8ƒ» 3Â! ¬^ãÈõV,b¸ýú¤îÖ—ãB=iˆö­çù‰‡k%(lüdzñå)á¦x€ÍfLkœÕ-Ê�©°¿¾¯xøØ¨'"àÃC¦Š/Œ>ÅË)aŒYE™³úÓld™&pÑcö<«A|@¼0µƒ™Þó*éX˜[áhú8N4½™ÒIÚYQÕ8éR=}DÃq“’À¯T©i,6¼Û�TWÛ{öø«=´�êéšQý÷¤�¶dRíý‚©M› œ»Ó‘ð+k|³º �o¨ £@’×8ðõ.é·ï¯xìmyê£îwá1fÖ¸”*õÝ7âͬnµèu~ÁÏoYò1Î7#Õ?1ñ™— +˜5ú“·Zópãã*ëv‡Â˦¤$þ¿sí…¸°Û_.ü;D²f„«7HíÒ™0õm¯^ÖåO‹úì›;�ZZ»,‘g.Ó¦PF”ºêD”gÛ¹ãNÚ_/¹©R¾!€eþAÏždÔ ÷£¯d †eœ^Î ÇBWé÷PYx¸|¿xlÅb¹Hú钞̷P‚ðn> ¡ÓÈååZPe%¹$®Íì"ú�"Ç_iwqxU�æ@¶,‹æš¸(9)âÂèÒi� ôÅ­kgf«&øólgë.öSÁ,_�‰p"Z‚>÷>Éß›—¹‰‚Ê Ï XÏÂ[�‡�ò‚§B”5ãÝér }wât柧£m„9¼œ1 nwrª:i>BAÒÙW¨úúæÌ«éK¸?,‰×¥Ì3)HnîaI?$—Ø$ÛQœ‚ÑRäÂZ”iâ—rò1“¾0 Kô¶MwG£?ßœû#‡J¾¢†O±¨)N�3ZCâü…•»ë·póLÊß/±À Fhx)î‰Ñ’Ï÷£k­ŸÑ�øÄ𣃬çÖ;£Çÿ 0èæ@7gò Ô`ɤåA«¬ÒT?Y«ktÙºÌçîZ¨Gì 7¡ €þ3S‘3êGëbUš¤~Oí.J½Ëý*JY{4£6r¬• P¹¾¡ý‰ŒEþ¦¨•Eé‚öô¹� ïUxÑSr-Mr*˜GÊî+¤:}íút:ÐmÏ–Á�K¤à8åRV“çxÖŽ¨ÂD¶ÿ\¯lzé‚þµ°„Qõ«êmtjoúEþžÖoÛÉܾ|çøØëµâ�/H¦šâ¥5„üõëaàJo&@ïû«5‰¬˜~m¬>¿�‚©‡ˆ�|çRÊð…W¿·÷ü¶J„½£–Áirã3Õºåòue™£˜óã˜*»¦‘òàó}U û”ow„eö:`®èëJœ×pS‰îƒ_MlÜS%àE‘RÇ/ˆ³> ­„ã-!h!¦cTFQm•7)o•!äÛâ Q"ÓL9—0¦«§XâÖ1zu"ë7¾…ÞAÖÈ#1áÄúizÙV„&½Öøï0^Z×ÈéoN8ó”ÛâìJ@�¨óe$sEÜ9Ä&å¥ñ•mO„g²[æú8êßÑ\17Z]唃eXãNd0×÷…ê¡'Yë\¥e\¢V�¼9oWc\ Çû”Þo—·£]W¹ò]N^Ò�F‡yÒ°¿®g™?€©Æ)“¬­çÞó~¯¿åÙ S]¶*oÒî,í³‹z’Õ¹/j mMµžŠŸÂýr9º|�1/œ‚:§z}S_ÅÓ¤“è©ý+é‚JSüÊ‘¢žÑOs4¼SÙ=Ï䔑;õHÏÇ‘í0õõÃõýYóPÖlÄ„á.Öº>ì¾ù†2‘m³*�5³šÆ3‡ÖÃ|ú>4(ËÊ7ùåbnWD#$ë¶…>×ßZ'ØýlîÏ!‹ulïíŸoœ›«&swÒÖ{Þ£†½�ÏPÁMꊘg:ç+p%4Ï1ůc½&‹†Ûóï:ÃØí}¡srêö»ÅwÄìE·®„óO?—â.~º¿Š…Áw¶£ìj ‡ä”-Rî©�ií¾7‚¥Nå§_*©3æ§ÕG¹%Úå¦;¡±†ãzºl«\E²! Ðí>&нƒ4GÑy¦z\Ïž®5 Xþ[UN³MX‚R^¨ôÎnÁ•q·Màâ»ÌZ¸Æme6ê¨åeŒé6H_D|rèr0µdZ@‹kZ=y¸b©0eK‡v·°)Èí[)ôáÉ;¥0 ç!¿�Ã¥%„&…V¡dMcà¶�Ó¥_M�‡õ •ÁÙ+zZ`5üh˜5ÑæXKëPP6ñŠbÀïŸ�‚š¢*B¢"¨) hJˆª š$¦‚*h)ˆb*(¢©–¨"* ‰jŠ "š"h& fZ"HšH*iiª‚‰""©¢ŠJ‚(ŠŠ¦Š¥¤ Š ª**) ¤™$©`"ª‚šŠ¨ ¢&Šh‚hŠˆ†ª& ˆ˜ªJJi" *©™¨ŠZŠ€˜"’¨&"„Š¢ˆ"𢡦¢*bŠ¡¢˜’bf¨’ih(ˆ"‚ ˆŠ©"*`ª¦ª ˜˜¦‚¨*iš¦šj(Šhi*¨&¦"ªˆŠJ)š‚¦¡*©¢©¦I˜Š*ª¨¨Š"ªi¥ ¨¨¦š*‚˜ˆŠ"Šªšjb"f"šJªj‚˜‚„¢¦"X˜š¢"$¢š*šJ ¢*"fˆ¦&") Ф*Š*©Š¢Jª* ¨ª&Š&‚ Šh"’‰¨ª*ªŠ"*¨"¥¨–š ¦ª&¨’‚ŠJ*f$ªbJh*bb ‰™(‚I*ªª‚ª¢ª ¦˜š"&¨ªˆ©"ª š ¨¨Š˜š*™¨(‚*š™"¢ª‚*¦hh*ˆª&"†©ª¨”Š‚ˆ¦*¨Šˆ†’¦¦Š¡ª`ŠŠª"¤ª(©š)ª‚¨ŠŠf¢‚*šHšª’˜(š$˜¤ ªRfЍ©""©„¤Š˜"†¨¤˜¥¢ˆ*"‚©")˜&" !¦* Šˆˆˆ’¦¦&¢"()ª)¡hh(¢¨‚Šª¥ª(¨"©ªª˜*š(*jJ)ªh¨Šiˆb*š˜(ˆ"¢¨¢ª š(*`‰–˜©ª¡©" ¥¦j¢b*h Š"™ˆhˆˆª)*ª˜†&)¦"ˆª(Š)š(iˆˆŠ†ªaªªh¤¦‚"&Š(¦¦¢¤ª‚ Š (¢šŠ ¢ ©¢"¨&Šh– Š’’‚&™" ¦¦"¦&Š’"–•‰)¦†¨¦’¤™"ª*¦Š"ª‚¢¤¨‚ š¦‚(‚ˆ¦ ‰**(Š*j*  ’h*¨¢’Šš!©’šªj(š¦&˜¢"‰Ššªˆbb‚Љ¡**¨*ŠŠYŠ(( ª(¦¨–¢¤©&"Z¡¢ˆf™”¡hª¢ŠJ() ª ¤ªš Šª¢ ¢’‰¨šŠ¨&b‚& H¦Jf"H¢Š""ª"’¢Šª ¢¢&"J"*™¨¨‰ªbª*)*–fŠX&’ª‚ªª&(¢f ˜Jb$Ѝ¦b"*&Š˜’ ¨‚€ª’  ¢"‚&†¢"¡ ª"Zª¦˜‚Š*¨’ˆ™ŠZ*%¢"ªª�‰" ¨b’bJ¦©bŠ‚`©¨‰¨ŠJ(ˆjª"ª"šª Šª”¦ªŠ‚ &"‚‰j„˜‰i¨Šªfª"¦¦hb) ™ *‚™(ˆ‚&™ˆ¨ˆ™¢&‚ªš" ‰˜š)i*¨¨¢(š’Š¨‚¢Bb aª¢*ˆŠR*jª* b¨ b*`b Jh¦Šª"I ¨ šš&©¢*Jª˜`Š J¤¢˜ˆ&"¨h‚š’)"’&‚¨š &¢™©‚‚š*Š"Šªš¥¦€ˆ"¥Š¨ Š˜Š)Hª  ¦¢XŠj ª¦&˜’*¢’¨ªJ"(hˆJb&Ššš‰¨¨Š©&©ˆ†ªj ˆš¦*¨*J*š Š&bŠ’(šªˆ¨ˆŠJb()¥ª ¨‚šŠf¨b"Z((ª¦ˆš‚‚)*jŠªB(˜™ª ¢"j(˜¨ªŠ*"jŠŠ©ª(¡ª( b"¤¨ˆ"šj¨¢‚fšŠŠR*d‚*B&‚š¢Šª‚ª¢j!¦"&ªŠR*)ªˆ (©(¢¢¢ ¢ŠJ¢š)‰¢  ¤¨š¨¢( *€ ªŠ©¦˜ "ªª˜hŠaª¨*Š)˜ˆ&¨†*h"© ª*Šˆ ™ª"˜¢‚ Š*b©)ªˆŠ!ˆj¨¨Šb"¢„ªŠšˆššªh"ˆš¢ ˆŠ&¨¥¢‚ ¢*ˆ‰ ˜‰(b¨š&fh¦¦¦–ŠJh*Šˆ"¢" ‚Š¥*H‰‚b)ˆ¢šH‚ &"ªHŠ* ¦**I!¦š ¨–™¦"¨¢Jˆ¢€¢"(Цš (ªi‚ ˆb"¢)*&" ©š ªh’*¨š©)¥íy¼³ô ŠÜb¹Ç­ï×ߥ5+ÉÄ•Ùÿ›ò/~3Æ2húrwÿ½`~çÙC+Ø›xV ì+ƒâÔ¾»A Å®mý';D•¾�/¿&¤�óñN×¹Wù§×È„BíBìCßä~,AÖeÐô¥ãøÇihž QQŠ›~ˆN½ahÿ—ü­×Èö í[~àG¦©ØDU3H,›Ž+Sk]’Œ¥ÿI8#é(«ûmšïîRåF\ùí'•{�_™R™Öb¹r³€òÿIwªþ?‰Šû¸êE¨”(ªß?°Q ÅüÔRÊ¢¿™`2Áã7ûa¦9ÓýéCÅÈÓn›—?VìÍß ï�4(åÏñÞ[3¢+×w$^IÌ]ù‰Dý}`S!ƒäáÕ-º¾¥OûݺðŠwç!Þ§º|éš^;Ðú&(»¢Ç ¨U`�/á°žz¯”][Œì…%®|ðò¦IÐUWP¾ëf ¬†6t÷)ÑÒ}øÖïdçùÂûkÀ $å#Îcü8…É_:„n{ë“^ÿ]_¢ª73Zƽ߻xø>bªèÒå˜Ú^>†�%’¤]eA³þ«wÅ¿t‰ú–u¡Co"Ù; Sræ1o‡Ê°&!y–*É_Ï’I¿9<7ÚYÅ6,m¾—U@ÕãÖšêp’�ù^\ûYòc¸Ùtμ~•ÝÛûP|å*#íïM—�å* 1 ‡y�xªˆIùazÙ�H–�/Áhn§j-Œ/¡­U LÎÅ Ü(Q]oÔf�º2¶qïl»Lߟvh.²p—ÃÜa,Û¦”ÁâÄ\K~-ïbטy ¾º$Bëm�Ÿ‘VæÌ1åÄÜ×¶º;殂Îÿ�Õa‘1ò†éX3G(7ŸÆ j¨EREÒŸ=»-Ax„£eûÕe8X•Ú¡ …¹{«µFv;X`9£�úã_Å�~kÒôË›5À?�ŒE)ÖsF tèz²ö$†œrÿ¤Ò/ÒÍ^rëÔÏ>ø:ê_áOOÜ¿Ë÷“•n,îó„.ZóØÕDØ šŸFæ ÏëѬü{¿È\R±‰¸Ï a\,(“ýZê¯Þv´e©LYéF‰}tÀLÿ‹ê_ºbÑOÞçÅ3Ç}øò#´ôÕ\˜˂ֽU™t®ï7Ü«_>lÅYaÓâ‘à̸p<–ªPéðn±;¬Eœæ"ÖbÓØ�Øæ�,O’$)ÑŸ¿4ª÷ñ®zöÑ(aÝY€Ù{Ç5Ô�.*Sÿ^P)tFöN~u„DÖB$® ¡„‰A�[ü Ó�–ƒg¢'®×[—»ÈŸßL¾³kÏ~Ä)žî´@/ÁHcš.´ÓüñC¸FLÎ7¸Š°ÛGbRpkt¹–’[»Fµ,]Ú?iï²äµ¿Vrñ´Ð·šIy�Üs›÷Î�‹•o ø7¯’'¥‹i2úÇm€)ð ]J›ëM�–‡„Q[(ìZe Sxf¯ÜÖZj‘ûÜ“¥èÔ$JAäafsŠà·éŒ_wV©§Åâ¶ÆnÎ?ä•Àu«ÌUqŎrÞfrfu´°�'ôcw;©÷ÔûSp‹… Ó©æ`cÙT?Î.‹Xtô€þd¥ó§ÓÞØø?_�'Õ4ߌWÕ1̙݂ì¿~ûnÀË}w’ùåƳ›þdFþ=�÷­ÖVVÛ”XõÌ3ížæ|šôÌù©ò Àþ•A�áÝÊqÐà çêúÝžr’ùcÊ3Mš%T[Èft‚Û¿Ò–«>PÌ{ÔÓŽŒFþ, )ñ‡¤”ê � jéyö9&n+]éò¥“ßÉ»_õwI-òÃmJ÷­³§IIÁiýý×Íè¸ó E -HyOútóq¥Jž•šÉ:Z �ùä3‹`Zå¾»Z{lû%άÜõ-“šÓóýÓWô/Óxz$åpù¶[V½ Æ(sÅëŸòƒõƒþ5hç7ý’V†þL2öçí_9á´ž¼«¬ þ*õYm)È5·hK”E»üÿ)Æÿf”PB[7~ÚÀæþ+[{�µF5É¾Æ á·P§ìjÖ÷Ò¦!y¹MÝU1ŠANº”²ŠÁ}«†Ñ1äØ Qk#÷�£¯O¯€Y¸sþ.ÛÚ­Õ956ÎûázWÃ:ñ�{|¾ýx[ävGÃâôîInéŸXƒ…Ì­³ï¼DŒ�õ“;q¬½ƒI�nÖ û¿]UUÇ�ßE c]ñ`×�vÎÉØNù’¹uÓàÈ@e–ê\¿ƒ}A”¼!§8;MåÃYÕâì.ÁÚ»Éy ¢w?ËP†n^< —ø÷$ ¦öPCÝ‘÷û,‚Å]e-ùoÔ’[èÖ‚B Na%ÌÁ¸}¥ÖDLMIù%´s$ˆàr—> ÎjÁ� =þ\><â"æú®¡Q¢Ág 7"–Ó„ì–w É®N&en�xf´lðûÞ-9Õ�IÑ£²9~,’ç™Lñ‡s¦[.’+ÆO¤ÇV¢˜RÞß/ë™xæÔ±Æ¹½J¢=6PäuSå]›zàÆþš£·iSºbj =êàg.:C”úž?¿;þo/mا[t÷M QK1=·\¼ì)^ÑÓ—1V(Œ¾Â¬»ÙQü‹w¾4ä —n¬ìãA`ªu³¤0ÇÞÒp½Îw'WW¾¿é.¯ÞvR³Ôð×ÀñÖUʼƒÅ�3Áçzü[Õ½˜¿ônòoœ Á–"û:ìÕÈ~¯ÏOžÖRu^X¥CâA®—‰gãUÁ5`1ù™Aùç°Ó¸ê­™9sŠýž]qŒú vŒêy©~Æ9Q|$’27‹š�¸¤OÚ“ÖìÆÐÏh2DÖÑÌE£Zó–lû§æ=ÊÚZšÉ5‹ °$ËÀbý0ûøÿ<¥ªNoW]­Ù¬Pk—Èk\õ3˜™bçwZÃX@á=i%~Ãö¼÷†]С-`RúZ¡€¥ƒ™g¹)n&¶Žë·×ÈÛ �â¯�ˆ?„"wÏ1”`éE`äaÙ=`I“4 OH4ÅÝe&ôn=•6Mó.(¯¢_qè·•¼ø¿^Ön2ký­ç(»`jQ:?5ƒÊØ©ì0 ×Rûûן˜.ò¿ŠµLóA0ˆ†~l©¯—¨±ìsîÄkééÞ•~ƒÊG±ØlzÝ%¹Î²+µ"œDé%ÞWÿ}{¤Íó§HÛ3ù§çNŽ‘°UÚ¦ÑI®zc;ž� Œä8º'¿a­;¶6Ž-*Ü}¢„,0bÛ…Jóü½š¸iÒEÂoîD¶±|4UÝÝœL×ΠÜ�/« m96Ù“BAËç�ëNƒRmø—0¿ìä½vag\q¨¾wt4å¢áA5õÑöÙÙpš1ýÍ­¾”§üì�·ZØýL&]ަ£/w%':矰͵ò:Œ;¥Ð†< Ýyê „k´m¸Îâ\Õ&nâ„�Ï´ÔåÏr ¨~GLr'¬¸ë«¯ òÄŽ-ô|~_^7´þ[*„¥+j�×"–²àÝ8ª�Õm° ›�=¼¯uy.éK|~Y£‘êÚ^;›Ûîûèg¿«¶žÕ7V’™„�} ܵ‡Bñ™~lÐ)¥?­Ôò¨A°¨¬9uÒÓËPßñF‹éù§ï�XÑÐàæê9ˆ`� }n=9옩'ÂOƒâ�Ò„�Î)xndØ,.`‚®+]tºæ.f0à4“"Øùx‘×®¼ƒk´¦|^ÁÐ3åPù>¹ÇT.ÐCfmê=aúa Ïn×-bz�V/…ë31Æ"êQËJZœ `RÆÜ©kfÊ}bŠ '�w¼�…‡Q�Ä=aŸ� `3VôÛɰAÿ§éÓºÙGüãÔ»5DÕ>}ôªñé�q�ª…ïN64,êmô\ݾ°Âw–XÞþé™f”@“šÔ¹jðD„³ÎKr@&êͼ N.†lF¥åsq†®ÐÔtzÞîÿ™âÞ°c3 Ød>ÿ)˜k*�SÀÍW`U Õ² 2T¿Yd™J«ÊÖÎÇ‹ÑA¿Œ¿LŒR¿á—ÊÉÍR‚~JOÁOP„`M žäêÏöHè̼ê�òu˜ÖX=(vn0Aë }¡’~ ÀCõH¹É !7E‘c$Ï�vÏgX¼¾ÄæÔL&ðý-ÿi��uñ«\1‰¨ÇÂq—}…X±·¬÷Ó°MVµ'Vc‘#hO1úqæ¶Ñšœt8Cñ@ ÛBS‹r¾†*Uß «Æú¨Gæ-L'•Üð×”’nçê> ­�݆߸ç±P=ZÛŠ(<š+Öڵ䦫5íå=ÀhC_ç!†ÿÛκu”Áþ#›J?¾ö¦IÖ/º¸„Xí8/µ 6ªíLuú‰¥¾–~ÓŸUpz(èýŽúÿðmæ5…Zl…¿Y3kþK�սƕ ZuçÀºõö³úN\Ù5›(yŒÆ�Þ@çoÉ2³‰…l³º‹á8>zÅ׬=pZ|_7é^%³ cë) 5j»-?Åi˜£$ÐØ ;zö·ÍÿËèhŽß›óä±h@¸UEöy„ ‹Ô”»Éщ'5é8ÈØ¤�BÐZã f ï͵Ãê žÓÅÿ ÙÉØ1G#/™Ð?|Ã&ï)aÔ±T‡=emz<_ޱܔfRÊÜàõ+'w›€`ÂOÀçFÆ:p›ÓøÈëàB&8îqå†"Þ}› /v¿;0»K „¹Ê„Žëa] á‹Õý9ÆÅ6³ÆylÊïmr­«Ø1)íSøq¨´o'`üûœ>:7ÿ&�S¹ÓÊ3ç¨Ó"ZÐØ´m& ôY�pðç|áâf"÷=)p(<—£±÷õ ÛHì54ÕRu¨?\…rA¿]‘@¬¸€�OÖ¦ ñžS“ZôXuVÂët˜AÒÉtô˜¼™-¢m“š«./k(¥ùPd•çïfºAïz¹ŽëµìmƒZF3¨üª0¬PóH ¡¢&öì±KsæYŠ~°?a›‹ÆL_rÜܹÏKí_F‚iÙ“Þ·ç¯Flå�«÷†ää5òjˆæ`tEÕ*öMŠªÊªÒqÉ­¤FÒÚ4OÕÄüÖVn�¹çN,š„ã=^fŒ¸ðñç$·çWV¿.ˆ…YÂÆú™L•fqåêªMÙ“œÕ8¹ê¯Âk+ˆŒ‚Ñü‡$_£ßÚmÙCô„:_™·+�ˆæ°ò9÷ìé*ùýí;¥ïÐĪX »ys0ûÃçûnÝõRxyî}ýÁªCwÓF }`Š7Ë è|Ü]ÞZ¤žd*gj¿ «ífœÄ\¨`î—ó ¶á2=[ª÷ÞæÍ-í)ÞÀFLzïXê¾hºJZ^ÿQ®u+bë?}¿”×–/È‹Zn¨îR€}íËwY×¾åÃÚ�i­Æ¨îñˆhK‡[u5Íb°˜ëÛ~øˆ9Õ5›þ�i�ø¶ã„K+Ê >¾¿ˆ°ç¾!(‚ÆP4ŽÒBˆö·£nø:G œ96AÅ >Ë ç¼¯ 7 n\|çOîÒ�@�%™q2Öì=¯P`=ó¾Å H-^_­¢Á+iMË�ÛôkÁXŸ1ó d¹çc�˜*ŠÇ”q´>BÚj�!'µÊž¬§*9‰O&"xÁÚ!aKEûiæ±Ï—�}f�`ìh �ô¼òZ¾sË21¸¹g^ShŒ•U›üÂDѰFÇÅjHÚöРFI‡h¤>®5f#,| :yÈ@M¯B” Ç+cåíç¦ëY^-Á ‹^�Ãíž—xC¦ú·Ãz–ÝWJŸ–ñ´Bcy[ƒùê$ðÜÅ^O~TÊïÓ¦òøÓ¥¶ý²).˜µ�÷‰IÆ’ö¸ïŸZ·åOTÁ7åý ©‡ù}w»mµcwÐÂR/Œµz-Û¸�3´Þ·«gS ª{±ï1Å,Ö‹J)²cW�ýmàµß—Qvv(ÍŒHmdìkÍs6ÅÓ|›–FÿÊÕ1Æ¿ÙN¼œ`�)Æ¡£I„à“îå´† }Sdò|1¾–¥b©/½.wôæx¤GmI¶™bÚQõ@3”{f’nœí|T~F€¹2ˆY ]»%Œ¡ý¿ŒŒÊ8`÷vë-Òã¡îl·g™ýãp®Ô÷ÒÐL7];ÿjæfbÎa»gh¿ÞÖ¯ãã¶ë³C.K«r^Yš$« _…ûú§ïÚÓ?Jµl¤³ ^¾1ú¢Þí1ŸGTb×s«aÓØ鉸k¯úÓõ…F“•Cò¹FnlÒ*òDÞü}–ض›³=\Kb“+0È»+ËNÓ q‘Aõ²ÀóÞ,�¤H34‡=ò j*"Ž+ñ®>°{Oý8&pÅY†š…ÏŠÃ?n¬¯÷᪒`óv~ç�¶l×)?_ zÜ»‡c~Ïü(Oh�S¦¨’þÖ£ü3m¸XúåÄ·o² QÅ_½jΉôqÓýÝ4Üä* bx¢zúµuVt¢x §J$·=ÍŽT"ú0•K0ðŸÑ[�òÌþ7y@cÔ­2feh0U —D{C÷ÞÆ6Ó[¹ºê˜‡N"—kælç.´{\LjokÓ=ßWÚ´ÒdÝÕúÝW ¶Ì‚P—ÑÁqsÊq] ¡ýKYjè™!ö–áþMêùêïï!‘‹oTNÐ\Õ»&FD5´{{”$?I£^ ŒÁX¶}å˶;[¡»Îœ%‹Wp)"µƺ˼�JÏôµ?×#+Æ_X~]¥\RF÷$M4ú½VRœ?Õ“–冦tv½êlÁÑG>ùQ\Åó¦¼ƒà‹‚ÕKÏxŠ_••D½V¡¹¸í7>P…KÈ £º5_‘S½zŠË° ê, \aÈ®ØbPo†MO>¾šÜÙœC0A ²®¬²Ç£ò �‡ëk`SP{¨þ´ÞNþÎÏq$z´ö™£’ðQ>�4ÿa×l”ZöÊNñCmT(ÈÉ>KË¿ó’Ç߉â9�¿~_Ø4öN°?Ÿç ;�Û騎Æ\�ÇE“E‹mš_à-Ù¦{Íó¿z�é` Më!6~I�¿ÜÁÙîP¼½7¬ˆ=åø*ŒrÔü¼'<"ßã"ë K©ðASë ·T“ôðŠÂáÕu.oùzæl(Z,ÑqªeqrÉÕ)�{0©E›ˆþd"ÑcñxI–¼œ�V‹Y´ÿvó ÒO;,ˆÏléiŸë�åÔ­iábü¸€S»að¯zp4:­Ÿi³ûß~/¨5Âr¾e¹Ãž¬˜L0™¯ýçøli�W(UÙ‡ØADÕ 2j0Á�:k$â}/:î?n⯶îJlß%j‡uFP¨·J‰³ˆœn—Ͳ…R´à¤ÍdÆ8Ÿ�VJ^KöªTiGö2ßÙõ0Nj{;$r€ÜÃt_oð(´éXO Ë°-º‹¢×œª}3ˆt ¸FƒU÷0ts©=îâçh¯ ±éh¬Uµ‚bK‘“Ú Ù†Ï ü÷©în¼ôA1 T§³‰¿�JÏò_ƒÆ>œ_Q:@ߪӵy�·ÇÞý¿Û€ Yê‡'²#8Eê¾1<¶½ƒ½Æäo©ÃU¨äÊê ïÂ]z±©…>Æ7öíÔáWk…Òi—g³hí\ìä—êM™=?ëy²Â—.Õ6fÝ1#,Â…mY"èî”c)B@#œ@Þ¿¹Þ¾Ò!è!ñ0¥÷^E)XÙNg¤raS<Ù"–(Ü'h¼_"ÄQDnq°h݆ržK ]¢ü*8#ú•i»àXmëP’.˜xÂhÓ¬…€�u-¤¨öA�yfÿïEÚ¤½¶ø³=òªKh±{ÃOS?Ôu§i¨Å^î9’e­2ÔܵÝ×\meöŸ(;«L$¹Ì›bÑo~Ö©"–-0nUß6n±Yß<¬c&ÚÊr9tøÑô/c�j©^Ô£*Ͷ5=¨-¢¡ÍP0šøiˆLÖXHV½`óÜý¤góûSdŠƒýä⹑e¹<ž™OYýãßyö߆ΒŒ–8íå´°êhsªÚ2­Hê©öJûdjûe_ò›·>AY¸`GýC¬XG¼PI9§íçñ}§åkìý´¼>¤¬r.+^–u¼òºlï©©ëª4Å+0<¾ók–?ë*†»d·ØÑ·ökM…²û‚Un±ÁxS²Ã¤˜qÞÇ=WNåÈÛOÉ@¯¨…§ÙÖ Çö‘¤c·¢7ò“m�Œ tÒ���QBm¡+®¬qÿŒ°õô-k†ÆÔRÀ(Lž_,¹Þ]ìãÅ�Žÿ|“cì6R±©j£5ö°’ûˆÏ2òS 7.¿. �½uÙֶ⣬õ=-ìC›ˆÂý5*Ý*ü4îäÉŒä^Àž ë}~Ÿ¹0ÖÏßÏë+Á†JÀ)YWêÿÇ5hLÏÌe“ë5!†£Äå>·�p>:ezªÛ2«×Ü«gîÚÍ7±�ü¬mS/w”œ¶íÁ9ñvÊéwÛ§Æ5“ò'ÒŸ7jL°,ø¼�ƒ¦V}G#•l?v¨¯Nï &µI |Ô¼TÂØéóijãÖ,”ð¿ð[Ëy-ºT–]¾îð~ b>_qBÕ\Ù/ýL*c'1u®ðm>/t³¼hs9ÚSð†í®’TºÀkSúÏÆVØüí’´Àoç«!ïhDp¦A]± ¼ÒôÀ¢-sÐ�zYŒ†Ll*´Vöª’¥yû'\VsxPò°·Ïw&› ׎Òqßs:·»«y�´Ýßwî°üP²ý§Z™«db:Qètï3ˆzpï¹TÝz´&qRÇ5}±¤å$ÔåDzƒ““l[�Ó¿|£B´tÛö%šCï|šé§—Lu�¢ƒ:¢OÎ`!º½¸Ð5Péo'ºÊ¿¬Ä{-aQš±¥e‰>àÍù³ÒÃÎ[K"pÈ¡pÄm‹GÉõªy¡'S_7°éÇ*O òíLÝoM©…Þ•¹CÌcÎv‡kÃ/óK>èMa[Úwg+pBË!4-'ÕR“ØöêŠ�ZÌO¹W«tÀêPLµ=ˆºæPLÇC[ýÝž½kj£@¡ëáÉG㪈VÍ7àO¤ß~6ô’^‡p°Íš”üÇ lò†°­FöVܤdk½ÿSõÄþ=ñr�Qa¼ÀÒstão—LÏÑïòØÄ$ýi~ÂqrøYt"äR‹éÏzGÎ~y­ˆ¦qàË¿žtè/Á·Îû£)ªÈëÏcÚ¾S·˜(®m×–­‘öw³�U:¾H”lSpƃzA–æ™Û^�0¢Å.0óÊy™?1ï'WØiгxwÖ¨zUU3k+>á;£s!.‘æÌâäf£‘ïì¥ÒR.m¢¥Wò¿´n�ÅÁÑ=c·&¯U…2$öÀС$4hšamRÏ`àëçþù§2KÎ&�jo¥öK¹~K²ÿ_œ¶5Ô¿Š7àLqkZ¥ ´7Ñà ˆ ‡”­Õ«}u„<ú_…oBmø¼.gë Ÿ·3ì¥O±®°‹býÔéW×7kxéù «îoyùd}“@³—‡+{±Ï`“”ªe�9ˆŠêÁÚÛÞ¤©vîö¹ lºÚ}Ô·Fa»q1zê)¶ÂÊ\éA¥BŸ“ùEã9w‰Êâá§]ÇÚµ¾†ÁŸHæñØÀWzLì*÷co\¨05}QýPÂ&à›ôð–/T¾\áA#�tá„>ŠdùÆ3㑨¬øÐ½n¹QßWÒ bðD²LBÚ¾�gÆzëöB!ízß’_ÖTj�\Γ„Üú£Uökb³ †: bEd·…ôÆd½ÿƒXö ,±³ûì™árZgžwE*¤v¯’W^\¾5¡ñÿ—ˆËŒïUñ)Õ >tþIfÇ©A°¸Ç­ìáÉë«àe±¦ ÿ)>�¿pUh—öÄ»9…¦d½â58J¿^’-0]âú›Â_gå`ÂÄg6…q”!½aGâd{d¨H‡šûhÇr¢D£#›¥îà‘é‰ Þx�½Lb¬Âjšâ.±»H £/WÜÏO l]Ê^ÞŽ×®ŽŽš‡þ!ÒñVóü|iLQÞL�ófƒð›-Z¿ë.chµ3Lº^ß_ÙöÚ|s3êZ’õç0ï;²ƒqãK�pb”h‹qT×ñ½9„ع’ÿˆä·+W¨A¯þRw‚•ïWX+ŒêߊßÜ2Ê,‰@~º ‹»h f·š·Y>VíC 凜ú癜òÌ MDìî²b™=I€â¦¤·°5áÿ9Wy•¿ÂƒÄ¢žW̵BPSW"{ "˜Þ–³éPÀ±aF¬Œè“m*ò´¨Þ:¢âr¼a·SÇ“‘êr©9žf—ÃÃê2ô®nÕY¨¬µ×éNë¥@zjÎ+\=ô×w’»ýŸŒ}gš«œ|ÝÎ\Žë +6ù Uü¢ˆNKo‹N�ïØb…%fðd¢ÖŒ‡òΡAl[NÖ¦�©ÁÛÓcù^dö²W ‚¦›ç׊\�ãˆä{–† �/CÛ›óHçÍK>KÜ&V î}F³c»À0Tnd]¨Ü'Íퟑm;ãåGC®ÖÏʤÿÅ zæÿ�¬ÏNõôÕH êªû’Ár· Úhy©f´¸M鉲½ö k±fü4wÎÎ]ÜNÃ[ìNöŸ½Ð5ÊÃÙ˜j_]ÜQ7"Sø„h Zб‹þ.‘GKU…äîup´ø¡ü¦ æ×6¢Î¿ã_¤�½({-8Å–íÌìE˜Ñ;·½”…Îd)s…iaiá„ëlÆeThÔèòõ�vòá¿U(ÜGçŠj§È¦¹uÔ%g僗'¯®Ü»�ZÐE5Èø‹…7÷*†õš8)H˜4 J‚°Íîsi“Ê®|+“Çç;¬Þ>Ëã³™æ®y…Ú™Ã�ä+a…uÇQðŽ©®‘°D­ÄbŠ—Ç] 䯻áð«V½mW­š²’Ë9£ÀÖ+›æê=ž?®ãmŒ ¼>�]š•4äTñt‹©Üÿa8lžUËxp¨ìbògW²ÍÞP*r]Œ=Tn«¾´e^qËïê•únb�æê 5d#ùö„â«? ¨_âôÉg[è÷ìØ·D>L�ªùŸq&oDÕX’Âó\Ò©ïÂ~|ß2»H¤ÔõVð³ÿ�Ò>Ä)Ñìë{{ÿmáÊ›OG£Åòx�£¸ã—¶fuq�¶¯¶~´‘¿¢ˆœ'AÑGäoןͼÑê }ùsßcó¼GN~ûŽö­h4jûcóxûoXëAÖ�qùÞ¼~vªú÷ `£V;±lý{ówÛóg£ÐuÓùuZñ¢§·­öÑê¬XúLEk‰»Lãk¿|ûXÁù±~{¿6õjÚ1�¸¦ëi1z= í£ùƒ»Z {\bƒ¶û±âï{pj´wç¸/OÜPqÛòÕzѶ=~â‰ÿŠ ÌAþJ¤„(ŸÙAÿCû�ý$  ¿Ü*‡ýQAÿ°‚¼åOà þ ¡þàA ~ƒûEAPS I@ÅLET5E,ÌCA0ÐR$KKCTMÄ4°MÅ$C5-UMETÌPPÄ5LE¤IA„DC@QT4Õ%DÁI$UTDT…ÃLÌ̱S2URÒSE-1LÐD´Õ'<?<””P4µ2¤T�- @USIM JÒP4”4¬T´+M )Ê‹þ„|€�òQ_Å@ý‰Â ñïSÀª#ýê +üÑAÊ/ñ%�S*,§,Š ª«ý´C}¿_ ãï�X½oÍ¿;2«Ÿ‚Êò“y,å’%™Y‹…UUÔ0rÁIRªI©†“9£º–JKhZQUTƒ%™¡Ø½j®¥€òÌÀ«eZ«’ÊÍSHZ,3µ]Ø-ZUƒ©` ¨rÌaÔ•f«9‡,ÌÄ–f1IiI¢¥5`85TPä9†V@€!E_û�Dþá  ‘úŠÿQ½‚¯ø ‰ §/ù„„ò‚'ø‚ð ¿ÄA?…DRFQQ”%AþŠ *¨0ª€"ú•_ëØ"Û[61oîÖÅtí¢*:âçŽÅu×v“k]Å»\õÜk[¬V±fÖ6 îßïÇt{uuÇ^ÜvÍîæ&é÷odǶíÇn¨ÕÎÕ³×q¹í­T]¸ãÜïêNì»Öµ»g‰ÔEWC®¬íÖâ.º®í[c4îã¶ï{Þ60ÛÐqMR^µ]XŒkÑÝ�w‹zÚ=øŠ*ì‚'òF@„Ë”P^æŠA÷þb� ²(’¢H@ˆâ"þ�\€("* ÙŠ†šD¦‚ˆ˜©)¨š))¢¨*¢†ª¢ˆBjbB†*)")Š(¢¡ˆ„ª!(((¤¤‰*‚‚©ª*�¨ˆ˜‚&¢(Jˆh¢’¨‚) ™š)0‚¾@äû„DÀ€�òƒ‘@C…PÈ'Èÿâ „~‘@�”þ°P… J”%%U)AB!MPдWÈ!Â.D\Š ˆŸÅPð* yˆþ0ú±ŒltÿiÒ>õ]v��üíÑõ¶êŽ�mõè=5ÛE°uô0m‚Ø:Sˆ~Æ­ïnøîæ¨}�×Õ/võèñ}uè7µØôt}'}´Gv7Ö½½=ö#ÖõâôØíŽCª~÷_{Ñö8ã}÷iøö}·QìõG¯¾â¾ûŽ£ìg»ÞðU¯W¾ï¦¸µµ¨öëo½é=ª}·×н4Fw¬õ®6˜»wptXÝÁïbŸZ6Þ«»»VÏÓë½´õÓ£èèkFïv!öÏFŸK}÷:¦‡{~¨÷·n'ŸmèÆÞ×½ê¾ÃŽÏ¯®ºH�¾³Ýk«±ß\G�j:÷·]ö=ï}xÐ{V«×Õkàöô”u¬ßnû/m}Ùé>ƒM«èÕ£ÞÞƒ£ õôý’ì|‘sˆíÑß+ï¢ÆÖ=ìôûcÖ-cmlINû¸húÜ}pQIu�Ùú_¯£„Tý”áT D| ŸˆÊ<¨èQVQåCð?%ùJ4HÐ"Ð…"DÒš�[aR�) QàC€A?q8OÜ@øP!ʨÂäŠ&AE A�p¢!äÚ6�þ0b ƶ�hìjJJ¢ÙÐR[±ËT�LT]€Õ¶ŒmZ¥×ÜغkE1´Á«jÇ[®º›®íiÔÕQ ‹AM=QAµlhÓ­Î�&º šƒg<šv»&cFcwtM­3mƒW:›FšnÚ�‹gldª:Ó¬’m®µ�úSôŒ+ý‘Aà@9@÷AD ûÃBÐ#H£@R­Rø `Tý•üÈj—ñ·nÜLqÆ×IhűÜèÇçºâ.»uqjKM"Ø:ÓCÖªÏ]tc`ÅE:µ4• ªhëv�ºí¸ã3µÇu»Ö6¤¢H6ØØÛhìg­wjãi‚›fLêh§µq·h£5ÅÖyØ«6©ÝÜÝ»]kT§±–ŒT–ìIÕµ°jخۣv5Ìõ›·vÕN‹kcM©ÖÜTÌTTqµU±Ó®Ö4ìv⺉J*ÛKmÝžÚ¦ tàâÌö×X¢»níuÜ”•Ö¦µc­Dq¶š6£Swk¢§¸îcc®î×u£¶íÉv®ÝS¸ç¬gcE6ÑcF»;c¬TMXÕUDmA -˜´ÛÓ± ÄÖéâ¨îÛ»=]±ˆ­cVÖµuÝÝžî ]Žºª î3ÇF{ yЋ„|¤Šì ùAà8 @€Dý 2ƒû(¯ð¢•*‚� h8:Z"ªˆ()bˆŠˆ•((ˆ¡¡ªJ(ªФ"Jh)‰ªJ ¡¡(*¨‘h¥)ˆj&ˆ˜‚Š)¥È�û�Dð‚d=SQUMA!RTQ,TÓTRD•MM1U)IHSEPPPQ2DÃ)1MUE4ÌžT÷Qp*?¡URPàLʈ@‡éTå•SžAT0¿ÌôïJPP”E CUUJ“ET�A4P‘-P±SS50US %4D´QALHÓC³4DARÕ5M$M!Cá@2¢/ì¨ ì¨�¢¯ûD8DO•ø *È B ‡öýËõ_Çœ]»vßÓ»�Û§qØã»£˜×¶ãu©¸1Û4´[Û§m×ñÛÇo{z«ºÍvçŠë½ç½«>±tö÷>o^ì:-ªŽ«öº¤ï¾û½÷¿,õ¢u{]ÄZ8×\LQ¦ØÆÚíÛ·twmE¶°]==c¸ëwtVµù£³�îîbÜq×V´¿G{xì꯭vôý}öúO»QĭŧQ±ÜwÞÔu�ë:×mŠÕ8î׿=ío\uݵӷÝùQïo»®4qh»º¶Û·EÆÖ‹´NìLFën“ìc«Xã³ß�¸7¨´vÓº¶ÝµÖ6š¶£|{uèÝÖtDuí¯mowtE[mØžÔq°tûo_—×Qê·EÕ®3TS ß`ïgш¬h¨YW…W€ÎÁX(U.]ÀUWe* Í*¯ÚŒÔSÛ»GÑ×^»·f±kFÛ=Úº£bÌZ·ŽtQîîÑâ6ØíÑuk{jÑëÒGmã�DmUFÑlF÷uØ6¶÷c´ëUîí×`ÓÑ»´è»n;»gQ4í¬nº¸¶-¶ØÛ*ª;·{>¯}Á¦¨¾ÞØæÚã·ØÛ»&#öãÞ´dëzݧg{Ž(ëLCovºÓÑëÄj½ÜqvÐn;�Ñë«Û{c¬vÐcdÙÆvÑôŸD~}ǽœÔbK²Ñ®»c¹îîÛ±ÜoÌè¶7{¢:.±Üàüö<^ÝÛ[lRvî­�TTößZ½Ö»lìf¦±ƒ¯Ïz»FØõÓÛ8ŠÚ�Ðc±;Qöïyè+ª ?6‰÷»‚ë¸ÑWn-Ø£¬c8ŽŽ+·zîÑ¢ŸNÚ&;Yü÷~_}{jf»Þî£Ý» ÑAµ®ÉùÞã[íݘÖÛ:û9º=Î/ly´W»½¶½^ºïf:6¨ï³»¯xõ±[F=wZÛc{Û·_^=V}Ù¸ûÝïÆûµuè nî,`ݺ¸Úu ëŽ�×WX-µÛöô^ó¸×½ÇjÚ6Ï£vè7nîîî8îÚë%D}éöÆ“Weˆ­û"? P_Ùp‚åD$@…@� 0 U²08È¢J+…2¸% !…*äAC �$A€d”!Ò� D " ‰Š")¦"¥šŠ&¢*¨Š&‚&bŠ(¦Š ‰(˜eP’ HáTš *ª˜‚¨*¢ ¨%¢"ª*je¡ˆ�|ˆå�0 ’©åHÙP”8DOØDOÜL �à§ €x_¨ùD<‡€A8TоP~Q�S*!á %NTQWñP< /âœRUTÄÕ5TÑ^ UT\ <§ì§²¨?…TU4‘LU4D3QU4ÕD´5JPUSQS8OÄP•àô"ò#Â� åöUùEOÝAà2©ê³F³´lé«lN±¶Ú¤’mlb* §ZÚ­±ŠŒVˆØÖØ£Fµ2Ö‹+m­X£Z´VÕbÅ51¶m‚œŒh«DXÚMlfª1SŒíjÖlm[DìJ€†P4s±£[Z´à©ˆ˜h"š)­-:ˆ¤Öd¦4d¢"�ƒDE5A”AMQ;h˜ˆŠ‰˜Ñˆ¥ÑªÙÍ;fJ¨ª©ªhª¦Štê-Šf�ŒU4Ä;kcK°TLM:Å3:ÑQ1AEUÚŒäÓQ°j4à�f"Š6£ÁEV0檶�™ª & ª‚“mTS¶Ú´FÙ¶hÕ´MÎÆÖœUVÍ‹†¢‚656Ɔ* ¡Û6Ú˜ Õ�QT[.iÙͱ¦j ªi"‚ª��ꛈ’�³§MhÑLEA¶jjØÚÅ-²ÀùPò¨°Š’(žh¯ÜÙ¥‚Z«íª6¶tvpRUzÅ^î9‚£�nŽÆ£‹QWfí·u¸÷�3èÆö{­ET[h¤Ùî5zÑÖ{~]}½nµ»wj¢õ¢ª)˜‚*ûª*7µqGlX>±]îûÎÕîz�{=Û뎴hû±Ú:(ÑQuÑv5÷h‹·qƒ·sšƒ½�xÔ^Æ`¡íŠö7ov §U-UMl€­±Q{=öë�¶.œCN�'Ö’ë½qklj.Ýq:û´]oX¯£>œk0QUZ"�j¦×»Emã±ØÁ2{ÛÞï{¯Z¯AX�³íÞðnÑE^Ú=µ1u�{séÐk»%ë.“ ÙÎÆ)ª-bš¨‚+Äí�-[¥âØíïk¯^ûº=ko]'Ѩ­�¶;Q¤ØÍãRb;&)Ö=bšìc®íÚÎ5ƒ×®¶,š¯[‹ NÝwÝ×±¯£}k¯{ÞŽözÛÞã¾ÏÞÁy­SÖ¢¨ï³{½ÞÄvÌE;[>ö={j:t]�,_Zh+íè8ŠÓ÷'FÓ{¸h­jÙÁWgîN÷‚ãF{{ŒÑG¬E£öu?FØÛhª}Ú¢£ÙͶ£Ýƒ¢j#F6öbª ñôæ"�kwU£z>“½f�£u¾ÚöÕëÜf§¬îâï¸×{]†£qÇTQÓQkTGÑ€ŠÛTMØÉvÑ>µQ{»˜®ö=ï{Ül÷ï'SPDX¯l›¸’¸¨ÛžMb«í¢™$ªê»Œ"ÙÚÅ&ª«Û'XëKSEv ö1ÑôuíŠb(§Õ¯]íƒÆÆÖ6:7=ŒDÑtkXªñ©‚+ÛkvÑkUQtdÖ¨ µŠ¨4âÛk£Qv;·³£Aݾ´Ôý8ú¾×& í¯­UQÞÏX÷}ãU_Z>ûµÁÄšj¸“ZßbÆ»»�š£G£I�î1´E}±EQ^ºï`£zÅUth«í‹Òf£­±¢Šˆ®7½çî5í§DýÖ: ‹¾Ü=­¦ûb*¨½wÞ~ö/Yõ޶´Å{}ÛíõÄ�œm¦‹m×»èê.Ø:_­Ú½³Û[i¶ ÅõŽÞº××£ÕDUí¢ª}î8îÚ.ÕôzN£ïŽïn޶Ñ[š~»ŒÇ×sM±EèÉm¨ÛÞûïjìé§Ú}½ÛU�mGG¢�ÖÏ_\5%ãîÑßmv7mTQ}´EìjK_]I¢Æ‹g^Û¤½ÇSÑgZÝh§îÉÝ�o»Ÿ^ª>#zöÝ£mF½´_m·^�Ö{j’"6¾÷ˆº5 æ+‹§LE4U;ocW¬VŸGؽkŒj#Ø1¬Å1Fö8ñ«RDŸ( ˆé.T”>AL+�E‘DüA!…PEýÔ0 Jªå‘…Y@€ ª~袼¨AðýÁà?¿îE�³NÙÕ±‹l[bÄÑlmƒ:+I5©¬MœM­j5±Em‹cmVÎØÛ&6bƬLlm¶µˆÌU: TU¶ÚÕ¶1‚JÚÄE´EEF ¶ÆÛÑš¬Q ¶u±¶¦ÕƒDQ‹[F6±™ªÚµU¢Ú6Ö­ª¨¨Ñ¶´êÕ�±[j,ÅEŒETmT±bͶ-�¢ØÑY53¶Ù±µCBRÕÅ%úQ‰¢$ ¢”Š�˜©‚$ Š€)¢‚š¦˜�¡E7~ñF’©hˆJ& Š£Z JJ"iÖ‚© †‰- i&ØÔÄUF«:-Š ¦jˆ¦¢ˆ¢‚`)ÐhhJ) )jƒAˆJ'Xhh(µˆˆ¦*iJbcgKVƒLTULUMU5QLëASU@V±Èj&J*X©Ñ›mF´:4ÐQEQDV±¶Š šCM:jªa£ZªZ+N¨™¦$ª©�Øu­QTV‡ØŒZ)i¨›X7 ¯Â‰/Ê�êJ¤Š€ˆ*”  ¤¤*‚�Š‘ª¢„ô ¦�ØÅ°hh�5¥tе¥¡¥‰E:‚†šAª£T+¥ˆ(‘Ö© �”¢€¤*€¤h)ªh ¢ŠC¦’´�¢„Òè£l…AUMUU!¢–“C¶HЦ†-ZZi Û1 MR”:4i %:ÑE�--)ACABUU4…$E3:4ÀéR† ´diJ ¨ti£HÛ R�Hì`‰ gHEU4Q@E5RD lš4�І&‚’ŠÒ›ô‚'ಂ¡åP„TxECÂ*J‹Ê ä€Q$E‘DÂ,ˆ±ñU,ÂÓESMD´ÑUC•STIERÓUPLL51CEILT´$LAPÕ$ËJUEQDUU,M!EÓTP””5SL5E%5M)@•J´£Ê‹„ýÑDG ‰(€Bй)€�Bˆ"ÿ yþáÿÔÿwú�ûÿºmì»ÀÙJ0•æÿó¡—â™ÖL?êÿæFôeÄÞ/{âYe Œå¿æ¿ò�Gc–N¤âØ5ÏEÜÚ*Û7½ö–Q· ›(¦Kç ÈyØS)Ÿ!eæ HA· kV=å‘ìçQ‹^jˆ 7<Ë 5sˆ³x*l’ÙB„ŽÍ:Î «X¨Îçÿ}ϼ�8 ¸g›ìÝK¶]Ä7ĵ‚6=ZIUëÖÑ´»º‚ _}¥ ŽwKÂÀÀíãXã"B¦s;2J¶�ÝÅU /ÿ¢•C`Pù¸lCtÈ!s“¤#Jà4GT¨tcs¥î\ífÒuØtêaY™Ëh“12é$ø|B¼úÈâ³%†>¶ÇP#¹­æ b3c!jÝÙ¢³¤»õÉïTÇVÑ #Úó2BA |Ú×é`(r±´`1Ö¯‹„i¡¸Qõe@G+h•´ FLƈҤ¬û®PNï"àáz30q"Ác³Ïß·Ÿ¼÷_•zBÇň×{êÛáÔôá(ý€Pª’ ;Íïo£w¾·}ºÀJ_U_:3m�e£öúpÏ¢ÀƒTÝu[ÞÅ•ÉÖÕ‚%Ùƒ  dƒ'ÄB>AŸ3ÙŠÁ#ÔY4ÁqµŒôéǹ†œñ0¼eªõy´“A•µ£ Lu’ä±`\5ðP¸R¦MÙ¸Ó!j!l‘à‡EÀ—VâïׄÇћ݋0å7¸ð‹;á³@k÷uLøöwWÃ�Š~8ñáå"ùÉ5´ жëNÒè à§•¬ÝŸ(¡¤µ®8á8ÝŽÀé(¼Í…¹’ÊFúîöüZ€¹•Z›q¢oQ-s¥‡™ÌÜìprÝzt­ /\æÑVuà̲žZ9ìß^6…Å5csÌe ûÞBÕ•\Ö"¤fo—ÝyA탫¨6ô—‰v¸gP­áÇ,×ü©}%—olJÃ,+@BC8�\ "Ó42�•MãÔ^L�܃1wS®ØkU lnp6 žaõcAËâîEÚE JA…lt\s”NÆy4Ÿ­ r=3êá� Ñ`®Èý�k×\匹vL¡²RUç P“÷Zö`„ŒÈvÛ£‡AÐäQŒJå{+Q¬,3Ø.�a+ÄÆ¥HA¤¾6ÍŠ>Ëã8æ¢wÆ÷1í®9$"ˆˆ "DFÁø/9ŒÝ’(*s†F<Ý3ñk%°ãŸ7$NH¸£Åàû�âõ&Üuù ¤�ˆõŠ®¸G6Ö=!�eïºÐ;±ª%·ïç\BG10sCo éö0~öLŠ_è„üƒ¡—k�¨`pÿóއÄ{ž£ƒÊ>qNx–$‘/ã@"p§²Âÿ$ /»3£Œ®G¦-TŒ/|Åó,‚G® …Æ›œ®_‹ý‰¼æ—œ¸ßÓ!äóHï±ï'�™8ºÀîD9á.ÞâãËæøkˆ`øÔ£ í7©PÒæ!´Pà %ôBe§l’®¬ZRSŒc ³™8tàGùÿic¨eø8ëŒ^5¬ó°¹ÓÀ#éïG!wR(œŒˆŽmùq ¬Eí+3aŽÇI8Ù²k!ªžúNÓÚ»k2HJ¡À“Í«åÂOÓQšöÂÃÒ‹¼á?|ßeñµ©CM÷ç÷u($>w~ÊåÉbÝb;y(ÛŸcw „ ²‡6ŸÌ›XOyç\°ýÛþ‡¹Åýö̓ ÚÈwîµ÷Æv NõÍgÒ+ˆ@¬×K»~åå5ŒdWàÎPƒA¯“–U;_J· BÛW¸›Ú‹Œþ`×)ý(9 Nä‚­¶ôuñ¦@'ð„@ÊÁðÝ‚H5ØgÆX2³œ8c=Ý2T„p¾„]ÛW‹`œF'Ÿ¥L+éñ’x°¤0÷Þª®ÜT†/k ÜÙ†ðp{à�î¥n¢W¥C‘á Žx%ó“ gÔ W›>¡w‹°k+É·žd¿j²{ù–Γ>˜¡­äJÕGðóìõ~j¦¹; ¤Ù-.j¯´K1C¹³ˆÈe˜�|<ºÛ*%”NTbвù|6 ë{ÿ$I‡Ï›gFêTý]>ÊYõÛþGµî3 bG8n?4ŠˆÒ’¢läÖþ~b±d3t\NR/Ÿ*_8*âhdÉ ¬ê:=š;ÜùnÁ_OŒ])7Ü«¼ñ0öÓ~ePhª-ž²´¬jeiŸåªÿšFÔÇ’M_èY?^9�vAt¸ø1oGd1ø�ÅœàWxX`qD ×þÒ^~W="ŠçB{ üé#‚p‹ê{€ÐfñžT¼¬‰|¨Jld¥7›2ÓŽWx�b¼½Ü¢¦9ik|ùê±¾ +Y¡»¨À=ˆ·¤ÓtÓ-—‹�‚ð“姇1hJ¾P–Ú°€¥sløB[¤õÐ$‹ŸÅÄß.3Ë ƒêû­÷¼µn«v°ñ‡ñe qNÑ}…0DÁS0Nx`©ºœ¤>Gõ±�Qñ¨í…ëê]w»rØ?@wúÕ�“¿çþWñÿ2ú”þ�ðŸãÐéGùÈÿiþùàÔô‘)Ð#KüãûJ(ü>¼§ ¾WÞ¥ð»EãT³h ÚíZðÁq„\-é› Åž‘*­ƒÑåœX Ï&ub;¼“I63t0ú ƒûxš »àpã·+Kð"r£:¹îçæ 0²cYšÁ掶kYêE%tÀÃè�—Ù¿["�®:ÿ3kp6P}‚•óiÚ÷Ÿ}òÈÂ}ƒ|åíñ›©7cG€Þ”O ¹ë#Uïc†ndì¾:=6•p%|¶¬oNí1ÚhÀ¾-�hNCÞj@'3«¾¶1wÓÕígQ>\ Ó4ËËúþ‰Ï "´²¦êH‡Ÿ†5.ãòw�˩Фtgà+MÈ„¯d�mšáuƒ€¶dUÄÁÀjãmj飓O Œ¯gÅl­­û´Ìè>ì³!à j&Ñn½Æ|<ÝèH©KP{}5(ïrª•ZÐ_+ɆÇX2 ¼T*doÄ^Óã·E¨7Ïq›Ë¸®±v£°ß­ëV!Õ‡ÉßfMÓQ¹äÑÜ>[NOIX·åƒ¶æ‹FZfÁÒî¯,Ì_à„°ñöO!0’"Z­ö¤RÅ íûPrô÷\`¥˜åƒ¢r"2<âÕJÐÑ ÷Î:AÑ7MºصÏT;PEåæ.I­§-ój?Ão&bàÞ˜r4£Ô·<@±Î XÛð £A;ϦžÅ[Ë ›ƒáRÀé �ù¶cµ•7yb—ówJFyö&j&&‚hÿRGm€Ìqý¼Àô-eÒï'læõ¶½ƒt èÌ€bêyÊg«~®‘åõ ¨ÛÎw ápß+bã P4“©ÑFSÀºhu s£ŸŒ.Â2Z^cÑ9û¾Inüî·Ü{rŒutor,;C1¹NÖ±èΰ’Æž¸ú­wL\²Õ]Sצ?skÛ%í£øéÑHº­4©¦®-UŽšNAþ•må»rSÃá|Òµ9¦W)Ž_“jCÖj?þûÀŠÀ;&è!A "ˆ«˜1ˆù]! ìðÅO£æf`B’­]¸Y¤ukß§_›+ÐåzýF/â;%è VþØzÁ·M“Ǫy¯}ˤžܽíµÃ¢älçm�¦Ê'‘xD0³�ŽÛÀKÅ‘¡V¹€øj¹�DCóÔØöž÷S[_!¿³D€žxç�Ø�aÎs>EŸe]ùŽ;Z�ÄýšÁvÞ¾zöö¡R°öµ#4§”¶o(AhFkóÆ †¥,^’q¢Ë�.É®<3+ëR2šrÑøùB�­Å$)&[}q¸^Èkw Á ÛmÖæ“2YŽƒ¯G8Í‹¶æåz "À+p J|‚&¬,˜ä\ÁM¹êí_C lÊã�4…©cÆcéõ¼Ú‡mÙ�:é1NN—@Ø…µÎrÌÑQx€à!¤[0fb .c† áåM‹P¬A”UE Û†u“<à÷žUë7,ó|i „díøÙÎÅl¾;2:V➇õmGˆ9†º‘<Õ¦xתwY=šQq5Ùõ϶È_M6n‹ù TÚOÃl=%‚_F±;³fg¬[E-ÖajnÙa¯]ú¹i™Œg®Úi hú æØ'1pÈ÷L”R�ˆ;,t‰·ÅòÌ7¿—’ PEº\B $¬&Îä)Ó`„N³ ¡÷!=(|°ñ*k°ö Én‚�ö`ˆ‚f›iÂ^qa Ï3š,Óg‚Û{ixojo çFŠ/U-"´íwJ&”�*˜€±8€^êÇ?@žÂ0 |Ö߫фF!AÛ‡Ù…Ç›5‰Â\YóYرœÅ–wá�ZÍýšü†ÁOñúS´K®gI¨+^ïŒ7%£'sÈ“Áž§�A—D _ÄY0e \ÂÉÜØGL1dÙ:¿5å�m±�·9¼{ýRÅöf\­µAWL2…£žÏ)KQîf¨‘EgL¤òˆ�¶Ö 2½í¤ãér*ÙWñèÊþ+V&¶{…K¾h¦ZÄ®ËI\Äu ȧɇ½Šâ)ôš‚Z¸UÛÅqŒ±”®Û÷L«%‹àt2†êJQ­ÉD•-ŽËV¥L,È'u½† ²>êÛbË.‘Ü>/.éœÜƒ!Ù‡¶à`õ^þmºÐ"8ÒVê•ÿµáµ „f9ò³´»­�“$bž7Fpþ‘ÃIîÚÂÜêøû'ZÖLKú®³f<�+g�¼FB î§”W‡Sù‚²uâc`D~-TˆüWŽºß_�¹–Žm�¯}g™ãïb�,ß5 øâ”"Ž ²©ê�¹W½1iÝ4R<®`ŸœÆf"ã¦+-Ú×{³‰arkññNÄ´§ú­J§9 B L|ØyuL}%ݲÒâ~«è{Äç¶Òkž§¹™¿`Áÿ0sݪÆ|)Â÷�r,"¿Kê’ͯÁo+[{|Øäpü¤°3nxv£Ns×ì%ýâeŒm£w_w�7nw[t�g'ÀÀºåÈ®ï™CDûƈä=±í¯aÌ…D>"ke_V íì ö1�ÅÞ©äG’ 1‚éÌŽv^ÊìþP«T1ä�\XŠ öÌ�”Z›^{(1ßTñ"î‡ËYÎ>³gMq][X‘ffá"øI§•klAí4”© Ù/—ÁIþµå6dß뺶+“ˆèý{Ùäñî±é~òšRÏ~»¨¡AF©ãoúÓ" {�d[lOa¡ .fKÇ0WŸ�D‰RË WBÊ :bKWýoá&¤8¿õ�lÖšñNVø ¶Â�¤cí`ÞÇõ+­2& \¬.0KVJq«¯GeŠ…›ä !”|.ÅR„¹¦ÇŒ‚à²0lÆmY ÄeBAø¤ö3­ég$-Üá¬X.“ �Ð-‹lQIpLžS×2ƒÇUþö­v„€¬Ñ€8|µ×^ÝÃ9Ã0*çjëvsÝ>̨U{–Ú6Ëö×Ï•lÚ¢îR6=È%Å^òóXùµC–¨kz™HCF�­1‚þÍ\õÎ�ˆÕ™r¦´ k×÷4C7ž|ùÊä]ó»¼1•Àh5–€ps@€ÕcLò\l<îâç…û;¼ÒFÝíõ6oŠuÀkMðèÑ,vq5¢ÕØÃB—Øïao–á¢,‡Ã–\7 ‘\¯q†]ÓÈ, �¹¡„1ü'CF›…ÄãåÅœ,; Aƒ 27¶¼ ©,3.ïNÝí@¸�ß-?”š0±5Ë5•z,‚EÛi%w:#ØEÅÎî¤ „”@�[xhŽ4:`^¬6?m(SXÒ‡×y_qÜ».S_x¶:¼è8ų�ëŽñaÁLÅ�Þº³;¬vç‘\¬G²x\Ø ªâÏC¸‘~0_I{ïYO>o¦qW?û¼¿bð©#¥\kð&žˆù–H(žšköˆKwïQÓAÆLèa¬!ÈóSSÎE´óÂ׿]<&s/‹FèÎ%;Çöèµr:Ô‡Yˆ¿p"Û �;gÇmÁFB¤ìÏå_{5ÄoÇÌå5¬8���\1ÍcÇù·\ e¬S÷[- ‚­qÇN┆ÛÝËSÇ»¡HÚélQOKD×@x¹+Ò¸­ù‹§â§q'¶²:O’Š_VïÚéÝr�RH$÷AÉóÄho­×->ŠÙìù·{õïè9E!=ŸRn r½œ¹FÞè«…;Ð6 ûVÞ«¦Z0ÄÌ1åÙñ‹Š…ØNœ³@µiR5€®=�“Úoœ°7}°º_»4BÙè{”¬9 ü[LM.Ðû© «÷láÈV÷³ø¦\¦!ÄëŸ^�Š÷¢òrî 5%Œ„;8€€Š=¸t¿§7bìíJv�ÞxjŒ$n¹ö ÐA¦¥‰ë$údÝ=Tù[•f¤”2ãš)³I¶©˜ö6Š˜P7âì�ö¡NñsÍÊ®T6þ]|Þ;ó.=û´Š nÎ]ó×$µM<l’y!ä°g€u튈sµ‹ÒsÎuÐ[À¦½îר�µG:ø+ ¿SJbùê…#È|oIïJ·Ô�üÙ¿ ô^Ë­g�Í}’üšºeÖcè�Šn€1Ã9�°w:jȼ#”‡_¾¹³g†c¯0s 3�¡j¥”z'Õ©’‡?�…ïFíbewÊÝBWÑ»<¸|0V 7ŠyBÉgCüû®_ Y I�æûaópß‚k³Ú 8frý/¬öq^5Ö×ÕfÀZCê«'´­Âxä=3 ±2ö,.MÝO6ÏâÞ_CBáÂ]m 5†¹ÒÞ� ÆÆ÷T•â»k“ÁƒaC@¿ŠZ柌ÀÑ2©Ñ€Þ cÁ*Ξ$'§„¦ Gž×PÏQr’´;è㨙џZªÔ•g ý{\Õ±µt�õúøJ‡Ú´ ?êO[W¼C8]ĈT±Ð2åÍfŒ§¤‹–Ó¨78æ·Ì‚¢ 2Cu­øï�¤îiˆß&O$*ÐZp§]Ú zXmW%NÆ_ŠñwÕ§–Ë‘†Rò›SfÙQ’)þ C{�Äýå GÓå¡™ÁÇ�pæI_|‘±Åßí�ºgÂhÈ�‹qø¶‚õtg…�í^0U«d©ž˜K³�zù-à€øZ2'3 Ä2k¸´ãƒ\–q9±>¹¡�>¸K;Í(Gƒ$À¥} öeß •\,;Ï:c°ý͘O}º¬hR†_;ö/}©ãùsžéö$=#Ûa£I‰-9tºÉ’“ysc!“Maƒêïëô{‚o×ÙóSgæZ‰±Æ„L nòu¥}”nB Ì™L±b!øBü–BLwtkÛïE–·]u:ª…=  E®öPÖÇpb™X:Í�9Å%X”0Ãp¦>0†t8Ö©�=bLÀæÂ‚Ã<~ëUãšòV ƒ–P°ë;iÛ¨(®�>r™¾œ¥O$”6ö,3ÅUÀèV¢ †ˆ6aK¸|UÀÐlLC¼½˜èÛZ¶Âly¦[ÅÊ-H©zvK÷’•|ð4Oò¨ {ìH‚®¾í“ )Û(*pÖ­Þñ†“æpqn/É8¬�íœå2L¸q‘­å2ÉoÝgÂ>mÜ / ¾fРg9¸ìˆªŠgÊââÏûGú ÞÆûü'•¹÷�.#kO(=þ,®ZC>íw°î£{‚ån«ƒõ¦+>à@5´ãlP%´k#«RºGë ŒJgŒÅeë»™áÞˆ„¡A‚0BöOsÏ–ü&tù:wþ|C”ëZx5Õ†a¹éš7�K¡Ð¤=6êYó:³‹*­,Jñ1–G¿H…x+ë\¦HÇV íI§•c;«UÒPœ4•t=•ÊZ0 ìù–›Ž*®JfÙò k yÈ&SÛQXS•c :¨òŒ(¬”{&ÈzÇ—b™È¶$ø)"Üu7%õÎüÝ®˜ Âï)'ù+c¥7YÛ­µÆÞg“Ác@�8Y›7Ij#b>aø3eÛ[™ì{™wÅ— †© <ˆÜ~£‘E=ô$*Ü’O7##5<�EÑ~ÐÀJm®‘˜Üìéë3O¦ãPº§{trT»,° ]§g|·/Ÿ<Ò7ñî NBh3:Ö>¸y¾¸d%NpbÚU¯Iᮘ�Ù'E2H¹Ü¢-zô«ã|z7ü·Ñ@¯:×^­êXrýÕ½^sm*uŽçaVts*D8 .gª‘˜Þͦ�sš4Ùï]º[Ÿfñj¾÷ubTªÆ°\óßÜ}úJÃ_1NrW\�íòZ.Ä—rÖÛáØöv„{'ÕX3É1ÝŽ]Üg�èÂvdO ˨J÷,þ4pð5‹8×l‚Z—7Ù9‹°ô=»·ƒÓÝw>0©Ï<÷¸ˆÇr}·2ÝÛ¼)‹Q®NDz:;ˆcæ‹Uˆƒa*kß^®†ü½F€ã{ä§®K¬9·/Ã×�ˆd6NâÎr¦Äžpp¥û¤íÝú/:æ"PXyЋ  ^ÅÔäÆr|pÏN“o”BÙíÀO�šdé�†Mû9M™Haî–6ý{sÛ ½cRÎ ¸¬‰Ë¤Ƕ\Æ@þû}¹�}=|¨U\ /c>¸{Îͱ‹KƒØ—©·´töorÜ÷´µ›» { úúÆ}û?9@H•æ†på9û3r|ÚØÃúÑnOÚý )F‘´Ÿp CX€qÞ,²/Œ{ÄQ×ÈÇ�‹¦<„À}`ñW·Óèb,> ÆŸ�ï½÷&á$lgänwç1,â�¬áÀHåSH6s¨„/­¦ÇÒî²hÓ�qÜv˜Çq±q44j©ókÅ á…+¹akœ¡Î»þÜ‚îädtÛ¿÷>ìÁ‹ÆyÆpä_qW¸«b‰ÆM–ÙFOÔ'|e®O>aK‘£x ´™EŠL�ê‹›QE­u_É|{ÅŠÔÔ«)Kf¸YòØùîsJª‚raÖ+¦Qû‘Z¾^Ã6! K×I›²�^©†‡*x¶'i›ee? \AÔ/ŽuÕfX jX`˘çxÿÑÀ¬[ âóÎW,³*ñ�­t††:¹Ô U·áŸ˜þ±³‚رö`ωñ�6j."¡ á�$¤Z5i–g‚£íž€äŠAú¾´þd2�˜Wp¾ë»óײÁ¶8[\Z.ËÁúÛhá­F}[ñ —Ú«ø×`ç½îT$Q¶È´ù€Œ-ÚØ•ZÙÑ6G¶éôð?%ìk#j÷¥ãþp€àg¶-\©æ»Mñò}?EX‚–—$2Ñ‚Íy�ˆ`Á=I¬žÍ|B4(!ÛyèvD¼Ãºa©BJâ3‹ÜvÉ¢ÈQ‰”ž=J‰Ö¨3ǧT(ÌjiM|šÚÇòåך4›Á5v¸Å¯]{à4› 2E7»� ¸ùÎ6†`úî}Îì9v�XÂFèý ]ÇÇ®hxBFgtÙ¹QpÂå‚9Qc‡¸0^µ?•z}Ö JÓI¡é‹Þ¯Ý£•-Ú¨IN±ŒŠXœ)ÂÂmt^`5Ô²vHÃEý�éÖ%û÷_=‚ÎztézÅóZnÕ|ˆrY1ŒFF¾q2pú×&Y›ì 0²çjÅ/˜§M›¤ ø­µ ²4ݰ±`›µM½§¡CŽs¤VsCÐ{_®dAä›] È òB`7L/Ë“ßéÅ�8"ýÜJ‚S…½­ûT\-pkfðéÓÀ Ã{b‚ØDRw�=³ÈšÂÁáò9ÁGŒ²Æ!G{C-ö¦gC;°ß]«ÅL-æ6£07ÝV+ î °g:&„8ÎUó~šÑg ¸!ý'�Qá"m­„LNû¼V~‹k®läÚÓãëY¦Ý⾎­ r/!_›´Œ”ùb¼\nâ’¶#k4ÆÜ)w¼«‚™ `2§‹É#ªµ‰+lØ�(, ›º çÌ—“ùŠ|:j P¯f®l§¬�®ò7U'Îæ°Yð³/¥Mxw�Ì…_Yßè8Z许҃b4áb¼'8àÙA’E»8Òç0¶¦,¨!¥ó€Ê1öª¼¢>`D^.í·ÇæüåÏÏT„Ä]¸‡¹�F1â)Ël�¥ì®q  MmÛìO,¹/IlYÓ_ŽOÀ1�ˆ›\ ±�9ÆB9ùÀÁÑœd;Y‘ÆóÛîížhïIâç‚Ø�oJ›De¯c1‚î:šÌƦñ�KÖÑWpªZé(�ƒ[[Ÿ6ŽÓ9F_[ðe&mÄa�Wmö8såUíÒ÷àSß âºlOh›óå×D¿HaÒä ð‚\7ߊŸMt?€¨å |øx®]ºR–·!G–ž˜#6‹f‹bÙ �÷Â೎Às}cr’»׬"æ¯à§w¶¬cÊé…Œ2ñH¯Š…°ihÁY»JŠøÀ}1½cI‚sV6L«ò3Ýì±TÄr›;‡9#¡Ào‡´¸¾ÊˆÙS>P‘7|{A”X „P�í·ozÑnÎreˆ\Òs®ß%�—ƒøòCpññ'¹±]îá o¸Ì€�DMJñ'avq€!OdoX²�œF@_7l§ŽÐðš�³ó@àlàqÆ q¡³¾FE@Kv0¿¸ò�q»ßrpÔZ•NÊÛjÁJ�åè1=MïòuB;`>*ÑzG˜+3 µ™´¬æ½‹ázµºÁ¶{�~Ž@ÅíH ¾žá�è¬�$lye‰ "²Hz‘ 峟”7ö~Dîgh «¬žÜ°0Éð‚…WLQ=Æ\ë•»âñˆ"B PE¡ �k�žå�Œ-×DÇL¹@[á(âIbŒ¹G#)b«Ð„©nîÍ®üÛ Ñ›Xôcï‡/ôdA¢SGF�`»HÄ4«ZÀ+- –Â…·ŒïÖ«ç�Û–®aAÆà&¦Dš~Xúd&q^N\©’[¥BÑ\6iA¨ ÀŽ Öèn¬F>�G£+Zš™V‘ì±fÁèYïÁo�&7Øbö5 iš›˜o\I¦ŽUÆÌ– Z£/Kºsí¬êÕÆ î9°Jj°dê³ax®‚Uû€�¥Š ‰êêì„õ$áj´•BP!…ÇÒ9ôÝæ(CÄÔ±´`”Á¶¥‚qÞí™™ßó,ut* K.¢á–^8êïg.Ô°*¡Š/®¶V´“¹~‹-—!¢Ô% Ðõ7 Í^UA.Tºü¸^úá[7kV㋇l°Üþ~[‰O_­»†,ÞF¯ò­¡p­Ö¹´hÁ½ï]´…½ŽvQŒ8" %Óð_ef*;•\¾Æyo¯ÏÖýºÚ‚žáÓà|¾R³úW z(·TþœvÝëK‘x¢N½æj¼bç¬dšŒ7`ëJ\;­0‚´‘^ÏõCéHTƒ°m«Q² ¸+FÇi“ÁMM¤=§'±#ƒX£™è|g¸‘•Éà ´«`¥G–Õ4e´l¬Gï?,¢šëYÇš�5Ä4´åuë[‰¸Â´‹‘A¶ö.-Hˆ Ü&ا¹„9’XÜ2vÙæš[Ÿ\²§ëÞ+C¦B.2  ×)Q­¼(†ªŒÀyl%—‘†+çë^,/ÌbÇC*A7|±/7ÛL‡ŒÚ¡üP¿$�«‹uÆ3»ööÝj†^]ØSغ\!¹n&Q†éèññ`hÈ>·ÊŽŸjsn�' Ë/üI©="½ä²X\“@`š¸ªÆ·¹Xé ÌûfûCçÕ}ƒõêÿ(¼¶ËùûëæÄÛÖ¸Æ Š�†‡ŽŒ™ü×”³=ŠáŒiCÍЋ "/E:¡mF¯ÏZ›6 _úà�÷Ëi§ *n€ÂسåØG¦±…ÜmÅ(Ä–À·×Ñ3ä�±ôo‹œ×NµoÁ/ë…v¬œ™ -Ì�A ~e»nÊë ¿ðEð°fùÎ]€t͈”€W£›^1¬8=ÑJ£ä›.„!gU.ϳëÎW5½¬¸z�õ—ÚŠÚxéQåâö­zHÌyÞÜ0ƒ³ÉÉ“–§0[ÿ)Ñ+KHË…½ö›¹÷rÚoæó+7°ö¹€�4—ºœd2¥& þwN‚‰÷›� =á{–´í89e%³œ"ƒád÷œ»V"ȱ œá¹Æ]3Nmò,ËÁx=èˆqOÎÂ’Àhì‚ܱÙå÷ØaoCUÂC±{ÒäOIÊH`Ýæ`ÑŠz;dJvžÑjL%‡öof�¦ «G!� —3V:º‹Ï×\íM}mæÍkv ¤¿6ÊÁ±Ðf ´P;¢–±Ã½µ›‚tKNv™+9ñø�ˆˆé°µ€À@óƒ_È�´nËXÞ@ÈŸ-z…5ÐáDÀlsxrÅ€™,%Ä'}3e�ydKÃÅŒ¤Ïd £á¡O |Ãî ™îõàŽôÚß²B0Ò¨â Í m-„`.`棦kž³îà0›º/+�ŠùüŠÏµÆÑ¤l×ÞÊFDÜkn0׫lû²ðªæ±Íåa©í)Øœ�æ-c¹­Ñ˜ å)pyOÅJŽckµF¹MCèöïî×C¾xñ?sÜÞ²@� Z«ÎûÈдjäþk¥#rNË;s†¶Éî�–‚\2*ü/8O¦ãèèàîa—ÌŽvŒä¨ÝE0Áx ù{%âõ´Í¾Ç%C�Ô�“ôÐÎ õ‡ÛÃRüñ‹Cà ZøÅ&iô¶Gi^èO·êÉ­[óÁ<®„ddz7 ½›(ZÚuïå„ÐVñfn ¼Úòzë… §�ÆçÚ\Žu*Üb¿…r¹›=»5€wßÏámc§ägq[QW`Ó‚Á1läÑó¤Ç«½ÂÍèò»ÛëŸ5`?~ìðÌÅ‘Ÿ/»Š]/ã³èê36—êbƒM¬TÒ/-xEÙd˜·µÃ_=_¯oÙ ºØÖŠ'Î.ûä�³/©J¸^20ª¼æn¥m‘¯{A)2“°^…×ÚÎÑ�¼°5Û¿$q]ò£:eN øƒ¶lßLŸ½®øOÕÇö6ù‰" ¶àiq7È!²”diÜÔámº'ÌÃo©Ó~Žzä<H’¥Tå ·¯×|¶Œ2²‰­ ì�ÀUN;ˆ–‘Mý“ý§»?—9)ënHz¼æ¢6½ÀÙ…‹H‚‚>4Õz€½-“[oÙÓ„ZíO ‡¤î3%;óˆ�é`ížžCÁº¤äúPÆ‹i·¥ µE� ïå¾óBq e™Á”èЕ©ooãÍ…RŒòRÍtœ™„élµ „K¥–�Æé43úà50¸=²XxË{K�%dÉÞ@å'Ÿ1¨R†Æg$L³l‚Wm�ümÀ %MZBÆûÈY/³[cÖf¾ÏqZ‹÷`I1Ý *COPË*Y-¨[�~Á¤PŒ4�µ<‰ö—›0|Îkt$µ˜ øÖÃ~’lÛ×=Õ�áj<5Y;å¼[QŠIUÚö{’kªS_¶€i^·Vá¸XK)%Dòx×xµw ¸§$&•�®�ó,®«v»BÚ/×Ï›qÍåª+¬§®oã½TmÔ9*<ï@Û8ô)Ž/Ö¢Þ\Þæ7ËØ^&íf ;eÍ+‡ˆb*œ¥Óç¯B›MþN3ßv®´0Ûf{2×2Ö ¼ÂH`΋ò®JÍÍ|˜%ÅíZÜ7ÍøËæ|Ouòñ¬k±ñ¶ó²ÉÂí͸X\XÂöû U˜OÈ{nIqù$ÀÒtQòeŒ´cu�¨–†ùÂ5y.¶ Âϼ°Í¦!ÞšábÐj0 j&°ñzÀ°´‡tOw¶E XÁb�’ä¸UÙ#ê]1r‡{}…¾änBâ~RN¿l@0+Ùðïéø|#jÖõóÛzëm}¼8Onþ(i§0©æ©æ‚Ú4°YG3R&&`ORѨ ð¼°-þ1ñ¬>=,‚…˜YØÈMì$§òY_ã«¡íú@Tloz½hŒ°ÊÔ^­Ïn« ë�G˺ݢb5Ÿ"nÕíTÕiAëd«p} '4J»Öα¬CãJ¬qßÖÕ-a›0¶ý®$λ¦_`*Ußߣa¾y6Ï�Cî�7ß.ˆt<ñ‚�ÊÍÑ5ìž¹ËÚaš÷»·’Ä-@n¸�®ž1Lc@¤™G ¡=8;FUÿØÃfódÜcwá^÷ð~oª·¾1GJ‘‚9è7Ș‚¢–;°'åY5ï`�¾<ºÎ¿3ãL ¡"íyÅæ ¹i³2L±D²ç$#–�aQõ™(Z ÖNTy‚# nßnÞ–å�xC>*Š´b”J3?~*¥äLÔ`˘>²Õûö™XZòKɸy�R5Û[KÝ®®S3l1•öÍ~ìóAÙ@ê`r4{”ôÎ¢ŽˆkˆÊÚÖ`4ïW¹~çŠM &Æ…oW]í¡º²Ë„¿àÓn„Ÿ_6’¦Ü­þ³énº×„+jH×ÞvmdÆüøÁμђ܇¶]0æÝ„Eë€S�ïüo„¶EàÞ~™¸°åöÍ�©XÔà#ª^. Ç‹'z¾Á\äÊÇOk™‹Õ¯Þˆ8g‘óÝò­òy¸j_aP’¦Ò+õø²¦éáž—˜Œÿ⥧GÆ�ýxå:gú¸�¬5QÖ_Ã×&Û…®.ÐëܬsäXæ�¥x'î”\k{�ú!ù©¿KÌX 'ªP˺çtÙ1Y­ÓOXzi6Lj6©|¸ˆ¨S²e—ºÜsv5”N£u-ÊèØé�ä�Ö�Ðét 6-Î�éoù�²¬ù³ßªË€1´ËHïXÉ8¡•l'­:(ÅÀœÒBZÐë}j'‰ˆµöÄÂ3‘îN<8<Éó�îžE Ð.½5|J´ÎD֓θ�æ]2þå„ ¯:kFs™ÏÝ÷¯Ä«+áv1n0ú3�eí.^ !Cý~üo9N8V¿cY0jï`±h܆Û@P¹‚¹ªþ‚�1P¾ÆÀ:½1ÿbò¯úÅjòæ/�†O¨Ù¿žî×+ju#Õÿ¯ÏŸ·7Çg¼ƒ|ωlz!íK&éŸì8á‰MÛ ãZ,Ô.AŽ‘æãA»Ö†¿®öªv Ïl.èɯA¾SßðÓÊ—ß]‡<<Ÿë6`“E“„&ªçãìmq[@f' =”gL;N<±«\×ì>Ï”AõÔà SÉî~3•ä�ˆâ‹T^ &à’ó¨{™ðd·ö�.ÜûÁø6u€• Íû[ý’jÑÖ`a>^óK$L�ô!gG|@9ÓÀc]å™!52yÎëZÆòYŒi4t¦HÐà ԡ§×5ÒõâÝqp¬NéZjÓ(�Þ×2’a…�™ã{ðvž{ãÏ— .­}Ϻ-̤RÁBÜ++„%ÈŠíuåXž\ž*?¯tµ}ƒÔžÔ?ŸçÔ;é÷¾`60œzYÄøü†cìe{Î0ftXsé†[DKîçf8tü³ ¿ .V}•4££`†¶Á+_¼àêoWç|>¿O=�aø^&fJï~bâ=ûÝŠn0P(ŽLþ¸X©:œí¯4ÉÇr¾÷Š·sû0冾*Ïkâž"9—$¥{�ATš�ð€o+÷–|ÁçV:L}Ñ}›]ÐWIÒ0ÙK1©4”‘Ü ª,�Þ®q"ÉôßãD~ÜÊw›¬÷±ie¿[™Ô$VÄû 60pÐ&J岯$8J�®]ÞfC×ÂçØè¢¬”ÃÄÑ,•F”žzœÎ8“ßZ‡î* �v‹6�|Ü–ó®H}ƒ úHì5.ßH™TßÜ«�æ�¾™IPØ.­ð)o³óßHMɶTçp2�øjÄDJ{ÏËOž5¯Ðù{ÎY>çpñrÕ¯ðà°mî £ñZ[èã¤\«Å¿Ú‡Ý.·¤ »SZC”ÑDŠANø·@0eÏ<3Ŷpá{Ÿ¯q­®‡!énéäøpnoMT9®ÕÙú¥¶À\ ¤ù!'¶¼Y{ÂØãòèWu¼;†­»È§#ZáìÉŸ˜ŽWT7dR«@åíU·Id’3õÖ§¦ÓЋr:x Ò—ÜÎMá+¸ÌÎü{¯7Ò€�x䇉²X»®<�/ ;{¡‘å¹|P„ýÊp}ã³ýßeíÀáDó·K�Θ¯Ñ®Uw F™ø_œ™_§øù–·Ûöp^îu×¥TèXÛöu\6ôy+èûí™ i1ö�œŸ—_²¯ŒB&É T¡Âù½ap%Eáò}?aX³rN;s�Îï�‚>ìÓCvé™ùi\¼ò1hìÃ'O’ëÏ5ƒUU­y½|;Q.¾P1zùa‚9•^pƒpW_"âšë‹WëY—íZøß®Ó¥>¼&¼ÇÚ�‡HÝøúߒܶ—œýúYHð'�¿WI^P«°ÌzX\ÅÓŸä áhûœ%í�¸‹vÉÞ”JðM”;Y1lƒ†k£|Wé±Þ¯à€È‹4ÀV¹OdDz \eF'<�a`¥Òm˜¶oV 4¬ïœw 4zbs“¼ŸÈç�Ç6ŒÌ!IΑÁ•ÕIrø“ù™Özjè’[½{Ûš“¡4½öfmob*_( ‘1wWK�™»’–ÍËH²eq�¶›Þ¹Äán57ªÆµhZÂ÷H¨ ¹¨ }ñ\ɽ?¸jç”ϵNÚxöÞÑ›˜S°Ù$‘p„¤Ç}—!š'¥�Øtô7ŽêTÆÊx+‹LyQn½Á*³ë±ñ}V݆A 7‰°þ|!Ž;Õ‹/7r„î챑*Œ&ƒ%q*õ¥¹Žõ5«ò°y�íç,ð��ÀŸ" Dð *´½ß³<¢¼|þv–Ãá)mÑ«ˆ(WÜx ðÒk%PŠ‚aìE–.|ú¯ß¹ôc>ÍÕ@I O¼R¾Ñö’Ä;ê�ÿÿ~DK94ýl‹~džö´e§”ËÊÛùíúa«mB‹½k8YÁ?ÈÒÐzöÎÀb¿ØÛû@ø ·NávçùšÉï°SŽ~½@½h>PfîýÙ ”FŒé•l6<Éyè—Ò×-@ðysv~¥T)/Ln…Æ×£îPèƒO;T8¡ÊèLç9vkªÌÜ-1ÄGˆT ˘ÉIß,Ãcc¶Ë&¬A�©%³6H…àp´Ëv´Q„†0˜8uMòr¥‡ê^°7•‚)d»Þ(7£{Ž"x÷±ézé™nøú@¹ YñKýiB�ÂÄ¢÷ÎóÕ¨-8V{pQk|\¶HÙ_Q‡±rÓ¬fðùÍÏ'Gfni²÷ Ä8JnT.H¼#�¡»ˆ™ÑÜ 8º…÷u“ôÚ5ݾˆUp÷‘{ñe[N@‡Þ±ƒì[°½Ð¿RÔÜ5¦8<÷Hÿcó6”Z/á”Ûè6¼Ãä¸À™w�õ€ð)–v0ÎŒùi#wWw-àÏ6)"æ«(! ŠÓ´ tãl\§ÅÐ^3ÏÓ'OhÂçÇd·a-YÄYI·$�A#/cq4÷Úìü™Àsm‰ù­±Mdí+vxg'1$N ‚äµaÂ…%Æ ”Mm d¶…"Œ¿©O�Z�ƒdÂÝÌï{…�s=¦7�ÃZµv0ãmé,·#ÝmûöjH ÑÜ•" ką̂÷ƒ-A#=ÈÌ3bcµêƼŠR«·“¢[gU¼L猚ýù9¾Ío�¾:˜ ¾î‚IÝåÞ8¼ˆdIVG+H�áB×Ò•PÁ…÷~x…èA ¥ .Ï®~¶/cZÈ�²¹U7nO^uxb|ãŸD"r«‰nÆRÁe‡¸í�l¸rKa‹ê¾Åa®_¡ÉTGÉlVûnc[Ñ]Ìkߦ�Ü]5[Ú¡†0¨âÒLÛqèS¢b(€H±mk™_�“·®»ßÕáD®��¼ÐeÜ÷Å ~ƒ]|f} ·ëˆ0\8 ¸gîcÅþYeQ—·é\B‘xóTWöbBaG“@À&™ÀEŽüiLî u8rðÜqµ2iñ Ö;]>¼¥°2$;ŽUEøWmùÖ¿,¿]pf"‚›®înYæ¸ÏálZr§’ ]ëfÇàÑ­Õ×up°¸‹ÙY¬©--¦g3o)m>D g ÆOéSÝøïIiݳƒ^2Bµ�~.! !žÕK d8˜‰Ë.†Cœ‡S2˜s'\­Y±—;%¨’ØÛh'9ÛMƒ‹�vâ%àBê�†jmä|%¿ºy¶õ²›ø{¾†^oLªÔþªÏ¿VÏV‡§ª¨Î|«AÁ’À’þf'DC€b¹AÅ $¯½DèÄ<¼¦ñŠ"‘Rî¹¢€ÁVþƒ[UNZnHþцU•25ûhÒÖ¶3s ç´’üÕAÆ!ø¦x­4‘9«xœó¹Æ;YurK7ÖŒCçïXÐ=ºéWz§ÄUƪ tŠ"&RfFbµ-”'åßal¼‘è®&…y|â®O–>‹üSi~­/Èú5¾F±{û›¤¾Ãf>¯…1�4øŽ·a™2Ôí–qjzÞæGäñ$)Mópu/x¸ž*k[—ðÏ·‘.; |›¸j�¯Gµ¹æ|Ò¯UlcÆ•D Z”zyÁmm® ؇G¶ñø©ö'}|qÚU¼À ò÷°† ¡ZxG¶¡àNé.%!ȸ¿“%Kañ®Š…�&Â-mÑ8 5K …s¤±‘˜~܃ҶU³v°vsÝ7w6~ˆìÞf>h )Yc•²Òânqz ¼í|9ˆ»Tn‘Oød•ß.¶D7j„ŠBê=Åx@`bjâ7eýã´e"ÂäpLãÚLu×�zŠÍ¹aËpéßûáñE¾±/1UeZÕ«+ ÃÕØ�iÖ‹T¼ÕŸùð>|G[–·;ô:õÅÛÀ׆`¾Ro}¢ë$–û ˆP~Pß8Œ8 '1bA kUye!Ú¤…’”Ÿ¡_س¯OÙϑφ[w;ÎÒ ºõÕõ/·ì;k›ˆ³vïHÓ ½¶fR*†‘wœ㲙ºØ ìzT79;SÊ2zAëˆ\ëÖíš·Ëa½¾3_§�ävß�¢D„¦Åýv·–ËA'«ºœ&�KÀ-ÀŒð“qõªrÙ½bÄðg?]õÛüÅ}êPÇ^ðùïœ øvr¦;�bM¤�\¼5âØJìU AmÏK­Î‘– ~\‚Þb¸VôcÃÊœc!²Î6R8 »ˆêÃg¡/Ìésö²†+ÏÆP“& W¬MoDÕyYe#C$Ñ;c6Ï¡s«Ê�¹;sÐ`zjü¾!؉�®ñjÉæ5¤sºBûxÐ/ÇJ[¼xè9“ã:Óq´ ½ÅÖq äÂñˆ­×{~áxum“îàtÜ<ò»ÃÜz) ]›¤ujC0Š `{i–�„—Dµ*æ:½Š­ˆ]:¨À¨X`f²›ÓÚ¹’ûßË7¹µÛ#{aë·ƒ ÒvæV)Ø)�2—k9$0!i_Ãl4KÈc7�¢AϾ+¾žà¬Žyh¨ýå¡nò-YÐ̮øé2ücmËÿ2ùës÷9“€©9kZvª\äBÂŒ~ß`nMúÞêµþœZÌͽH©Î*éöYd§Ú Ü‹ísÝ?ºñ8g²�€ïêô¸|^ƒ A\zá«È}°1©úXˆ†Äá ¹‹‰€ÖIãæ…µšã=š‡,JB�›¶ƒ{=™ð¦C&èÙÑÔibD­n¯«ç¬€+™”hrFÙœûõ“½U0Ò¯3 –…QM]�†Ç¡U1|X@�gÐÐ'50�»´«',ܳà_™¼�Z¶î²,Î.A-Ÿk¦´ÀeÌöþïS4]� Ás}µ—"|U¨Åîñ–†G?~ôÞäE`É‹'‹u#¨0èÈq1Ðbà-c(! {~ÚDÉ•�]çõê`\8WŒŽíex†‘—Â#l3ˆKDô[Oy¦Lèh!{nÇrâhòË}zÝ>�¦�…ê@« Ô¦3„#Ä ƒ0KÝ(pxB¯XA|[Kß)lÙd’µm³.Õ%ÊvY¬ÐõO™‰šÕ¡? ^¬Óª´Øt˺ú ð´òw6Þ¥hTÞeYzgØÉšˆ��Ÿ-ÏØ�ë Á¸{·íI¸©ª§‚îœä”ØO8ð¡¼]�»l.ELÔIýF®8žPqÇš³þ«ëµÅ�x}Þ6 aÌ‚q×Ù00\e75Á$A&…}ç·l†éc½ôò4“¦U™S²µ ÉLðè¸ÝUä /›Õà [hlçóKÌü.—âdlÚXZaaŒNùÍ5ª\Æ¡‚�†%›•N@ö]$~;ÚŸ¬ñ‡ï Ç1šaä¾í \öuN¼0´‘WR°‰ß5<Å錳Slƒ€¯lì¨K]KY8€ãËÖðÅpçA”.[r'ÄúÓ¸ò£Óa;ÌmïÛ¯�€n<Ï44]8m¦&Ø\<Û�§Xƒ >è~‹?^ÓËTDZ õµ`å{ µc‰mMZ�‘@ùWÂaÌ¢펮zOÃ#Ìý’øaôŇ~`ãÍG¼„_nó`RRrÕŠØD•hÝ‚Cç@ù�¯¸�‚Ôä[ /„Ȉθ_³�Mèð®�(yzfׯ…"Æß- dm“A¾_—fÖ`å6uîº/@ã:ûÔ‹Ê~nàb•6\âTÃáeò!û0m(†SiúºƒÕ³‹v‹£¾F­��¼­¿�ñŒŒÍŒ+LÁ`5á¬�äÙ”ûp;Qâóá=·D•ÀSQË-‹—Ýú[-yLå0ÓÔ(�í\ì1�dªÄÞÁ>ªŒg{]µÔÒÒh]Îô¦£�n×�z;è>]©Ø¿BT´�ß÷ 8æ©R�™åîÇטñÌjµ Zƒg_C+ºƒKµF2 m¤Õ�ˆ¡¬6dˆRæñUò~0 ¼ ‚\L©m03רøìXœmõ˜øv˜ú¾–ì}µS9F%&rÑ)ï—Þ×Dq×Ì&®š¼V„^³€›eâºàÞÄT/5ì˜ÉÚËÙsÅ�—�”êŸÍ�œá-¶2š!M! û}—~lÀ$ÖÈÑgEÖá9$Œj5ÈýŒæ¶ ‘\ߘTZ+¯ÂÆÎ/qûg-êŽS„ ‘ñ®7׳Öë|ñ3è2uJ��/"qõþollÿS—LC9¶”œ‚Ÿ¬´íž-öËR¥7PE±ƒgè¸Ë(yRßW¹ºGH’¼¿ª/‚(=Nß~æ%Άó q V›Þ, aö=r�sy›f¾˜ûæîr!ñŸS ó½0N¢NŽK÷Ä öáñìáñ|‚‹G+Ê£“Ý.ÑÎÈ_· ˜€¡ÇPPJ›V�ïr•1=¦°A·µ~yx«GBxé�8]L£ SÊ,Ðà^K$Sâ«ßpþnµß×È5 �‰‘�Sš`ÛvXÁSßìrO7^ÐðhÖ@äLkujŸµ¡Æ1kÌñÆRvza–;rÓ.íǨ(ªJaÞã6[qdgÅ”ªlÅöž§t2 +À XwW›ÊYÁð]«Ë�nÖ¿,ãÜ�+ìq NÈí5>h\�íK£œ»‹'wXå2ät£Ê Ï0Í­j>&pbÕe{¾}÷lü" fÎ@èáÔZ%'¡]ÈHoXÚ 4–}Èï̈́ц‡çéó]N%M¾/‡³{Ûn¤Žy¼!²¶­zÛÒëp 0†d94«Cë‡gYDâòù$­d•‡›k‡‰[N[cÇ _&–¾Öº68Êi×ä¶2ßz*ÿk²ŒÚÎò}‡ZálöÔÓ¡qáA5|ý{×�$³ô¾!P¬-û%?Öå¢ÎѺV¦Q6JéG¶>hÁý®¦«Γö¶íÆ÷J::iDÏ"ØkNXA­J�Ãs ÷kbU´£™DÖ ?Õ\òwz”bÐ#-%Ø‚´^ãëž6AeÑumeA¾¸"‹b1%ð^íLÓ��kö°»šŸÑ’¸åL%eM²�š±éš×úã†þ´ˆ¢§bW×#xK¿*òœ FHÁ&¥“Ší䄹æ²ÞëåuëzÝFol�°™x8ÛA™¡Ý€Ç®AÕO›(uÿv°ùòeŸÒãÍ„âFîà¸)RËܼÎ�¾E’öp¸y(ìMü{œåÚÌ¥SÏ;?.XPd[=#ôÈ«û0‹µ¯h•aØ´YZSóÀjå¢Ã¨†ëû5Ët!ŸÄ…(eæBÇÄ0Ù£¢úË™¶)Òë”ÀRTEiÕºã"­†½Æ°¡q dl0 ¤ Ûȧ.zÂM¯×l¥Qcö½°V§æ­¦ò´Á ´#;ý-Q7÷H“#4Ÿ'ñ±0—:w°÷|µÛí>^_£ Ì×ßX x(9��ž…\DJtêEX_¼ÃÁSÝ·Inc&7Óo2Çù 3"Á! “µžð¢ ¡V\¨¦.Ffìkl, ’Ì3oV‡ ­›}|Ðô¦ðß{î™^–¾!L~µ‘¹Ï„†ÚÜîáè‡ å^/Ô;}Øu«(u¹¨P*C¹rÿ„F. €%j¶•”Ùt÷‰¿ÙÍ@¶[îÛºV޹'ö ‘pfÇ×½Â9’`x®äºñkÿÉâf“ÌúØÀN€QäI¬� Kg ö»œ¾ú™Ä°Î®öblþXb…+¬¸Ð×üÿ4š`e>[s m�dôNŸ*Ô’èò¢ÅgÖ•©~Œ…7¬ôÝ?}ÀÈ|¸‚mÊÞüM\lÎ*»¾I©k1 L "Mo&mŽÙsq KF:X tŒnÃÀæc(-~qÎð ­í�CÒ/xh>›ßC„p¬@a`�2H¬°±^q¸KÄw82(ް¿¤™Ljâ±_3M8jÖj¿È•ãÚ Á¯ Î·öPñð}ç;‡®r êÀºõ»s~Js*;"Ç?bΟk˜èï7æVù%M†éß22Imî9e?«Û: ìþB…͈†$ðF� …q˜,öÒ+ô¸lV˜Jl*èH³�ç°¡ñå�ûíø5©´ÈÞ½|4bo ’èÑY¸0LbµÓèëö^wÙjfÔËè©cLÔÒ·È}g{¸R�á�oºésÕ·±.8>åîÚLÌ@©¾¹® ކ3Ý‹¶hðDW{g­ u¨õ½©„u"4›•¸/ÙåÑ€dJ#ƒ-«A@Ñ®<¹Yì7qðØ«²+‚<öhü^5Å÷»÷™¤;�¸Ãš"{ØútÙN4^,�‡ZE²ÞE(4ز¥¶ul_SHgbÎâ´GI·TßlYV2l�klŽ:ã_ŽØña£?|F.IkÅÛו‘Mß·÷ÍÆ¶K%Ø€ì �饤ò‡9º“ áo¾Š–BP$ü—¨ï·àÏl«|{�¿»õu¾ D.KaÒÎWúb® Ñq‹Q�)È3©h&Ú _Ðà͚)Ë%½.w§�@ÇÕÄOsmjö튔øoùïYcñJ7N8äævÄcj.†¢y´£Ö×°}BŸ "wµÓúëoyÖ÷$öŸ"ÀT{ö2G£U½òÞØ0œç;׵аáñOaü5(‰2z%��EÅ·¦*u�‰:v[„‰M¦)Ë*Ž ‘Û¬ïó›" W7…wÄ%rúLйˆ'?¬”:¿>äw?«µ‚ƒÂîQ…7SÚèÆl¢ã�ú{š[n¬‹i*6·#Uð0=Qò1s +¹ fß2%¹>ž;ÀN®×SÑå~»bêoÃo×EØdÔ©ÌdE|7±+"Ð֯풱y¶[jñneN^žg^{Óöøo/²0—] ÁCßygR̘ñÍ·aÞ,d瘈LÎòë‹„AI� âòªzN´z[8ŒS÷•{-R[xQÃHËc;f¸ñõ¬C—Œ�$q<Ñå¨_!;Ld‹1‡0ÎBž'Ñ£w[T+‹ÅóM÷¶Ë°nä¨êýýÍmÄœú_ƒàÊ3Sˆ¸Í|æ�ß\Bç¬^ º ±¼²ó,d²Ün°˜|«ÔQ€ØÕΜðØ´�—³åžríÒkg#p‹0wnÁžu¼óŸá|èûöŒAUü¿—r/™%‚i4k¯¦³$„›ªªfÌ–¢­¹Ã»½³BÖ×¶%`Wv;g÷ض¹ü�yžT¬?ô(ž6fœ `ì“T 6¡Á/@L]õ)òT{Cç[>.÷|÷zFxô ƒDÒ¼’­0¡ó7x¥ÞL ),ñ_µwfßvoó;wp¥ÈÀZc9­¦Ctª~aÇ»—;>Œ«&9|n{>ùøƒðL�Õîb+5e+˜_è.�ΰ¥"ž»š1ä ~|’^úd³:¤ ¾ÎwÎG4–ʪZëfâ­VHH=2(zµn„°|ö{†çìF:Zµ'ÚÈŒ'œ�°ñ˜°/•{å7_³)`åœfˆêãÞß­ïÉ5âÇÒšÕ¾‹Iuœ 6{"r ÞåÝ…OUÔRâ¼ç±-b¼ãÑÞ@Ús*"¢Kè#•ÇÇÏ»‚øûçù±2l‹¶I‚¦±uWÔ¬&ÿ5^À‹‹ãÉŠ·#�ÕÁ‚ù>ÞŒ8^n–·mb_–“è_×.ªº%>C‰ÙmÁ1Z,Åož^9VÐC¥ð;@ÎJÌä1›NY:4`ß³ÆãBîÙtÍ»7ÆjO€Ì ƒL™³„);�‡Û£¸| “lVsˆasø°»ævQÄ.B–²�¶œŽåGkXä*bzVÅ¡îPOÆÈ¡ Ù/–¸P3¯?ãÑ­«ß™|[—üaÓÚÙ5#GœUìúïG�q÷ Ožè©pOMT²Ý8ª�×Àôº½Øæ¬Ö�0AèúE¾~{nÓ~Òý�¡à¹|@Å ðVÕo/Dï±KHЂ³Ðö=ó¨ŸìÞ߇ám"÷iœæ¼ÄÞå…ÿ+3û#ð™ŽC7�5>í¶~;p©ºµØ¶É6¢Æ3´{À=_¾§¯¾:Ÿ›M矾‚ ]×­|­ IÛ‰LÀLßv~X7_ŠkéP‹Ë."¸¾ƒ�Ì�ë¯ýz…4€[¸�W K‹{ƒ£Ž g>FD5Ú™Äg|?æ}Û¯Ó¢›ÄórøX {‚Ÿ³Í¬Ks\ôŒžvží[ãOŸI�ŸrwrâàQ-÷p@Û¨ç4œÃ<ès°SÀï–ùX3vá&yíàØÚÛ'Ín­Ö«L÷ ºÃâ÷ýÀ¹¤ègÀPÎÑq´Ï…OÂTNrL+j�ZÀý·ÑØ&Éø®J�Áøhu\[^ÙϺ_¹åÀ˼m¥…,$ ëµsÙ#=pË ¿n4»ƒAb–Aºbä^o²á¿^óåÕËY%îëWáÞ °…$IXÔ@GÖl±7%èze»à~IÕój_ƒA†«Œ™ºâ�ÜØ }¥C‹ê¬`ešÒzjó´\í*Ù°V1G×vÕ¨.K.m»m¦´ùMGmñ˧´göëD#ªê0ˆùW Є"Žá×6øøá{;ßñûw·Øsî‚…mý׫®/©"TµëÊHL-©]x‚‰ƒ<æ ¨:Ç91pο­\Ûý!±w”GÚ~Û·l’ „íH5byÑÛ ­¿O)£òVo¬ï‹¬e¯-Ù;cwyÏÈã �ÄÛ×—� j *ß"=3¢•oïé ÞcmÁ*+GW%²Üe±ðáaù·ÈÝ#í}«¬·o½@õ\¢ß–SªvøÂ¿…Ò£ w;³äPù�Ùö9pßN|ÝŸ£{Ëð›U–cÍO5€ÏÉ‹Á™@íèí÷Ø�W,ÒÚd沓¹ ‡:Ò«4A_Æá¢4=ÀܾÇÒŽî�X¢éN¡0Y‹µŸEEVw;!©Ó±©2‘·"Ío`™»d\¦om�Y�µd)êñŠe8AÙ ?;Ûr—](}½êˆŽo’‰Û-ä3ë“éW \îBØfµÛz8‘«^ìzPê4‚ÍØ*Â×ð L4A¯#Æ%õ Ýgp-ºNÁ€¡5’\’õ\ÔWn5ñyºIp) äFt”FÀ=­ÛRK©ÞïímWyƒ”Óè³`ÙP �»~Qf˜V[�×äÎ4È èlÃν¶ôÌ쉼á±üù>ÕÔ‹#­£Æ±"MésÚ–d7ŸfÓ~ô�oÄcòwŽÊ�~Ο©w$®‘ Ú¿õðþý’6Z¥uE¥«W]³rŒ@$)èŒ*܉!ŠzV—i•‚ÚÎ]*ª™ñI*š lÔ¢”É \„Ác%¹Aë(ä(0Ex¨Î¬P`åÕ'ó+|Tìþ*Q4RçÅP=>� §•Rk•¥Êtüë�ªd�sS2¨'ë4�>;ÕXØPÍ58¡NÊi” ¥þU'йª ¤m…ì¢Ä ’í7ì8µ �+â¦ÊQV.ŠÂ‹gæ)ƒbHc¢ §ºTsBž5û×øÍ%†)R”ÒÁN”±(RH@¡Db›)éw– Ùk�UF $Â¥ˆ(™êÒê:©éó* ŽNX íX؇ª„ípÂ�ö\>GD^ìèÄi±R–ª€J)Ûª%�¬¡4DÉ^H IÑûKé‘z(K�æJ%(R� h¡) :"„zm¥Gz0@áE |Q2P)‡*  I÷Å@.@•ìÌBtˆ"¦OAÈUMž”AS0¾óÕðÀÂ…‹eÉ{¨ g«V[ž”µ÷Oc°Fn¨Hì­Bõ®lB �$ìÇ_Q VäPRšê܉&×`äbªƒU*î,oót€ä&ð¾=)b*G„|hle(h©Ò €Yv[*H UD$x 1§ãVÉ úWJ²R¿C_ÕJ”{(í J¢‘é(�D‘ø¥%|o=~ã�X>ZUS3ãyZª70Á£�äPÁJ”cÒ?†[”Ī1D&Š9=‡&…„–†7_\t† £è¢zE ¬ ø¢1’ƒG°¿]Øå–ÖççÙP‹�šUºªdùÕ­Åüi B u]Åœ(×rî‚: ^Š="ajRÅ<Ü2hùED.réƒs’Ʀͻשø¢‹a§j‡j1`H_,0\ì´ª||8…fOÉI(Ê‚D‘b(Rv,Âkj¼nì(}eE ê¨1…M(ÄÏXA@£wa4m(Bcåö–a�Rö»%Õ_j��¥)š15•÷Š‹›þTBTüBáI¶õþi“¯U(@Ñ>¤‚< #mv«ƒ¯Ê|¨¹AN(˜È—… B¥6@¡%~» ‘SÒZX9D…ø��…j@ZÝÚ’0%Q¤ ²ÆSJ¨N¯Ÿâãíå�­™YªÛuÇñ @$ 9âùiþ?â1›eÐ#èü¢¥Š·ÎHe¡‰¯_K²€ð*P�%{~=Ððô�Jýù@P œÝØ>”U Ú,ƪ !?„N”9+…Ab.ê1?«õ°¹ÀH#ñKi‚‘TP˜…  Æ Â�àaËp#B‚ë�êóǶ ffÇ~G¶S6`ÁéTð.ý�ú0ë±Jâ0 Ry(Vט¤Ñ2¸“ñð—ŽÖ£ý9Êî×<ZuDç³U\€‹Æ¡3ɶ ü«?÷5¬¯# G[ƒ�™O9ݶ³¦Õ®jjÖKøéK6‡D¶Xf.Åp¸ÉD‡ :u=ž\D·ã›°°X šÔF$=Äb€oÉIŒˆe”@>-ùö—M[GY˜"O›…ÁÀ¯Mª¦‹ÜÔ�Dz‚$3ˆì^-ÝðʇeúØüAe’ Aß3wÉ&²Œ9GfTÎjl¤ºõ8¶HŸ@‚7 =ÃB«e•™å©J¦àË “pÃZ„­¾ë1·¥Z.}¿›}ÞÑÊîÃ[Û€)¶-ýñã3€g:s²*g¾q �-} nhÅJ¹ À­ÉU&¢|Qž+¨u%í?±å* æÒ0õ½å´kºYl£D}ÔG"óUl|°X!d.ž‡iP?j‰g +Ñ�šƒäñOw&¿|;GŸ*¡éêr›*s”$s�uš¶� �}D®L,SÑ|]åIhþýtÃ�À¢Š0I¥üбAUPÃxkÚÃOEZBÀ/æ2ïO!è¶Ô•+ Ïe‹ _k˽•Ì W㮀Z:fågZ{ êã³ý/àFqÄç7ÁéÕáÛK@ãܥŌÚÊF;o†®?r1‘>æ.„$YeDî÷ÓŸ ]ñ{žÝ¾çßZ²CpY,¦r!÷=ºD ×4aL�š¥Væ È ¡P áðà6 bê½ÌZ¼[4Z°)Û&]L€Ìît|.� „Š,R€̸îÄ—QöRû Pû(nŸÒ 6“ÉÂm íŒÙ�‚K¯‰Õüq#`ìÏõ‚EóÒŠ×� ¹ŠE$\Ïà’Z°¸³üÐY[ヱ¦Û6äL_ö… ?aNÿ”PU$ƒG£º’«ibá5ÞõWNµéÖýµÐ>ƒ£�»k¸c㕌enp\Ào‚øë‚YŠB“‡õÝ1ØæXl–OŒ¬ ëKdƒFá¼æÓÛÔ¨|¾ Éî%×bæK®ò(a¢Øuõôg1Nñk‹“àUÝ'ád“‚ÄÏS@IPOö–ÙGú Rrž¥ë×ñ7!œã‡* �îÔIöج ÎækYÚW6–îœ 8Ò `õjhΛ{ÉAÒ ñا«î–¡#6åð`×É_pÚk©”zŒ*öAQ¬“½yõ¡s<¥Šú~‚~X{·kïc‹6øh§`åŠäýúºÜ×Ä÷”ß2nÂN$cÏŸ¡|µD :JžˆLRÖ¦ÂÒŠyógŽT¬qCÖ¿çl§C™«ÂA”þ1㤕\Âúƒ&lÛ—iÞIkêM¹F5sÀð_ë—–Ïи\ß®¥ù.îh'œMhÆÚ«Ðè«Æâ÷§Å®N„\‚gÇ‘2З�[ßž�‹´àr>Ñ<•ƒWÄ1�:ãè}‰ï êÍùßžæà£ øGõËö{Â&ʧÜÙßø³Ä䵊ûãÞŽ¡ý?å§Ñ½´†,è2¢uqFÓ3QUüeÓ–°Þf óõh3ôŠ®´ N!B8Øök’îÀK:X�ôwÖK·åÎèöá�÷êþ‰ýñþØ/SáUlV“kŽ5”çÙ! …ÅŠ� ÚSpm¶ãë¶„*¥ûï+]:^esѨd}vîx�œoËÓ¶#ŠWŽg{Ó„6 f�N¿åû´·8Ī•ÇØõÔjN¨·ï‚ƒ´I?Y&œË&É“_9ñ;¥q¹écpŸa<~ú8".5‚R笳¹0nÓ×<\iÑl #$S¥.‹¯²ÙBåF'-@¤=ÀÁócO!£ëˆ”pu-zòHõÀ¬¡vZÒ‹-DÁœAÆÊ²Éc>]‚Ãpвäì·û�v£Œ}Õʆîl%»QÚ,"­§¦ÅÝÛÀÀ!ì\Só. 0ß,z#7ZIb¹È+Y›7Oˆ‰ D>0a×"J,™²‡%ç:1Sª"[Zw‹NMTc÷-…Èä÷È9‚ýi|;¸iž0½ÀTñ 8 :‡�Uäêï‘ Q^«çÞÏ[Z<³æH‚²kÓ[P~ÑçÞÇe†}7Ë_¡F}Ù.�`… ú–÷1Õ²�˜� 9£@¦8÷v`«‚Å‘©i •&ÊþNgí7ÑötùZLÝ@±í¶,ö÷�éùŒ™‹¨Øé�®›ÌiªyÅèÿ†�v“¯Ÿ<¦b,ú¦kq6¹®¬K.W[`Œ‘´T›\u;Wm �Ö("¸8ðÑÆãý5é¡{ʸ@×áu9yÏ6YýÄXÀ\L%ÎWyF¼ !r1=@‹éô;ÐE‘}ƒkRþFW¼B�ï·õQZŠTæÅ¯�cÚTR!0¬½ùš>ÎR´ñVÿ/BÅÁ¦àÂÀÅÞLb /@nɱvJ \.ûªôåë3]òßÙ :–>Âï(̤ C’×I>L#}é×m�ŽU}ªQáPVuY¶sGƒþ¬�r�¨÷­PB\ÀsÔ°*À«Hµ¯[‘‰$î›6o¯jÞ]a³h]9¨þ±ÏF~^¹­˜Ì4FìçÉfÑfòr'j~Æf>T¹0P‡zÉ'Õ¨}(�³F{I�Œ•mã´Z¸?z‹9k„ýÚÔ¸öÀpüÀ�Â…¨$d~nCF@ˆ/ÿö} AÓ èTã^³TÏàõ •QÁR»¬Ï° {µ…×fÙìW¹0ìj9úÙA$é GÖéÝò¦ 8-~¬ôä)Íx/„úg¶\ûÞ%Dcn*¥´¢ÂÃc<꤃äƒHb˜ßâeÒîu¾EÆÜ´ f stËÌv€[Rws=c{ØÕ´ß05»Úª ”;&†Á§G:ÒFðaô$¬€àžÙVù–ÞaØŸ™¦›ölÈ_…˜|g tï¿6ýïE¹lEM�þU ˆ4g\ÏÙ¦€= €Ëœ€ÚGï”üZØ KZéwÏxý\|eÔ±!È‚i°`�‹C5’åÎn°–ad� vñBó–¤Áf—hÚš~Žÿ–Ó½Œ ç1 ÅUb ÂŒï†J¿-”uÃæq»lR‰IJ�ùbýkmÓcÊÔ±üÔÑ|bW‡ÙÛr®±Ç´ Í8>Y„’¯ƒ¹¼X¾X 2HÅN6…19{‰Èõ¢’à‰Ém|Fü½OáXïc?=̧`:g¹·Y¾µ„…dc[0@C’ÏÐà–k3lÛìEB:!Í-NQ³ sÙå�œLn»ù²"½­qà�Ti�¼N¾ôQ–1¤ÓkswÜ ŠK(ì&DgB�H:Ç&Õ‹Æ©ÂßKs£Çk»Ûk!xÕÖú£{R8j„:€•+ÝjCæJ_Pä KPC”É9%ïˆv0úh+¢Äc0îÕ“öZó¼ÏBùú·½‹ÏúÂŒÁÑaWÌ�”ÆŸÝ|®àžÕ—Ù<�{cz°µð2ÛQXOr ¾0½ÔÅD†dÌýˆöF —ÕŸ´·daRG‹`Ïð¨32/`VÓÝE`L4`xœ`oì5øbpüÂÕ—SW«ÐG�¸Ó#× ½Å9H˜�.ó�ºAÀ ‚Ř (U$‹²“þ`sáœeî÷úü²DRJ�(—°éŒP#¬Ð´)©}y¡Œ`Êüë]WÁV¹·ßvv(ÏÔÒѹZS@AbC � håBL¬Ä-…>íj\#“έ ±“Θ‡Y°J¤²õ›�G�lšêþ“Ìé ÙI+ÅeÕžnÕ8°: @pÃÝÜöwttÌaRú@jXÌ ÀäIpót?D®oŒP9€æ(OI¿S¥ËuÜG’ÿ\¾ÇݨM6ToÍ='OëAΨ,¼Ë¾Q”ónÒÝ,Ä–WÃôeD;ŸÈ`KcÆPc–mèQ„>¤‹wé@üƒl#OòûYŒÃstŠX-mH¼-�¶ì>˜bb#Ol¢äñm{I‚1¦×Ê»sß@[ìnîX•úåq¸óH™?»{¤žrÓE|Ëì ´?'FmL¡¥Ä‘å‹Ýµq+ZÍýÒð“Ð*ì0E²¾B#eµH²ä× ~T|\íaäDî¶ €•ÊH>Ña^èÁpúi)GW{–ìüÚV±‰Ó!_9l›˜¤¶^À¸éä5ÃüÁhR‘»wí]u¹µÌ>6¤î¨YØý?¯µl�cvÆl5gÛ} ®_#/A»³Jg±·ÊN‚õÉ �³Ãðtù‡\.1 Ý\nW2ùžé\ßC�âÅGÞ#3Nú=oz¤|)úÜOŪ‡-þÉzzÌhûõ˜ƒˆ!ìˆB£mÄ�ÏCËûØð�”³¹oÖR 5Øn% WÝÖ\ЬFwÂp â· ¯”ï9«q˜Úmhï^×û沑à/<œïçqÖÜk‰iÕêC=ʾo(‹©3‡iÌwnØkf<ŠMûÞÚ‡:çÛß:vtñNÏ õ•@Ü7ÈÊÛÈ/Ãì•!}ì\!m t ÐÀÊ‹8°.�±³¸É”¡ÏDw@X¼,Ïorµˆ½R†9”V²;6ÙðÙŸÅKG�{ÛÛnHúÎûúÌâ7ÍW ½Ul×ÊMR¼Qáà²ÁBèæÂç«D‘3§³¤˜p3,ìªÏ“%ªÏpƒ‹8ùm‰Öatmö 1»cÔ4°VT3ât�/é„ìK%GrkÕ�îí2ß ÐgŒ¸À �€–ö™Ìä(q|*+ÖIƒ¹7ÓÇýø÷à p$ÄUrôPî ‚Ãåƒ ½ñÔÄ¿-�”fû×T/�âÔK»ï~¡˜ý@÷R>oKŒ8Uä7mà šD ‘e�åñ–½‹"0)ÄûmÛ+SÓ€¨¬d®í€«(p®m¡ gŒé‡Úêôn ã˜^8ÞÇ&ˆxÞ•~t ß.Ö;œuk,Å­@†öµ–Á¥øÉ²\žùÝ‚¶^·G�›Â´ ]FÛ^^1*Å«\<»šâhA1e¢wð. /Í—±âg‘Ù ×–ÂÆæ„zR)AƳ§™4¸Y‰‹]âÆï ë™l*÷‡˜Âk~íAšgIOöõ—�/ñø˜,’Xñå5‚J‘ûpU€é<ß6±ž²-¡Û&a _+ ÒÎcM:C$˦[¢VÎ3Jpø–cÎÎò�(Ú$P±K“Æ¥gN¨ÛŒþœÜ„ð[ÚÉTü¬²ï"ð\ª ðs1´G Ï[Ylzm^ö[\ÞJ²! ·�©”�(-Y`Õò²Ç«gSBGùn/›Fð !�0±8öÑ�3˜¶nùKtìÚ½ Ï*º0@ç½{ÖD‰9ÊRÐG¶Rc�²SQ–·s@¤¤þ––ëe—rA‹1¢�Ÿö¹ ÊW#¼ÙdïíwÔ?Qè3cå{KXöµ¡wQ·� 6ѵ¨3¸YtÉü÷oÐ.Ä79¢Ä¼iƒŒ£[X»5ë–ëmÈõ.ð£‹]TÑ9îw×$ïé¤ OU–ôz%Œõ먾v\ç ù° »�I%³–"™†Á›ã"u[@$ ;àÙ¯Pšé}ÍnÏœݯoÓ#”®B¸º>_×9g͉†OadZ¤Q2ᣑâÇæÁ�«„L s8б ;Âí ´H�Kaœ“ yW?…šqGçmG¼�ˆË©-ËÐdÁ¦õ�Ct“ÔºíÌ#’JrãbN›ß©¡y±&U=Ha•q|›š/> §+0è­K±�`?�\ -×®2zÚ­?6Œé®VÄÕeƒIZÐ.­5˜WÒlŸ –»ÆW3ÐþŽö/†ÃI‡vÑ<³#S80òîOÍ—Зý (TÆ–Í‹uº–湨.jà}hœÝ�,"夣µµLW¡ST•èÿã׬–ð½^ø Õu‚ü}×9èÜ9Õˆvu12ZòâI}…LèÃÜeubÄÂ^“rX…ÖWŸÐäGî«*’“+³þy)L­ô@"@µ\†Ú=Dý³W­Ýý|zõ¬[AÒ쌆±å¹÷›Åý>Ä*÷�QÓŽ(ódž-÷ÎóÆlíU¼HšéÂ`Ë‚[–¨™Ú02¾S瀠¸Ú•IdˆÜŒ£ô>zÎø¾Vë&ó`ð{8½fg%L€¬Q< ‚2ä¶—:0 “5Ép�8˜DÛ�¶÷5]—Ëõ*tÅs·“{µ þs·]°Dž‡44 p2>"Ô)„¨¦ì}ªœóŽ3ÊÊÞ¤!¨÷&ÊS$.÷–eÞ–Ø¿ÔÞ®gZôh@€%¯&d0S§vuT=Ò©~ù+WújücLçüü _bñ1�‡]Ї[G™ÀY—GŽ(ñIl¦À§_}9æO´Ï`¸$†[+g`#¤ µ÷N;ñ¿‡�¶²švHJò&ñz:7´"޳›'–¤NƒÍWW–P1ÅoMÔQ2¿ z_ÞôÏìÙ@ëå ‹biJÒɈuEÆÖ[4wÚU­É’´ç‰¤×nMàóN´@õ÷LòÇ*¹n­�LrȈ"WÊ £òÉÌŽYèïAm?-àº+·=¶‡È¡†ÍäÞ�`ñk�nWj‹iq5§á‹ámÂÊæ FŠá«•¦ÛJØ<-Óž!ÚÀFR`ïÇ'™Ò‹˜ï`Ÿ“O¸­©í±*€ZŒ1~³Ýí Ó• ñ9>yWÛ¶’ýh7­Ò®SNÆ&{ ÄLî�à³)§¨�gè~ýø?~JÒe-%º±®LÍ‹g×»=½Ès† ¶üýXÓç—. Ä ±2<ÂT§BÔÝïv$ø黂-˜£p+ û_tž1 P+)ž`°¹ço¼M±VÁƒ°¿ÕI‘¸Ý왌UüóO…¢b‹cLØæÆÂÏ�{»@½Xi‡Ecz×µœUäì¿+‚D¡ŸK\n.ð¶â“ ìí„âÛŒ@¸)]ïY8Ób…NÏ) ‚îÊL. +]‹R"0Ê”$µ½7ˆ^IXCçËþ�iñ²ÜöB‹ÅÒ_Ež”\;>4Uì¶öEµ¤ð½Ç—Æ>v²xž¹I.OižÜŠ®{šÜ-éè>¿™Íu¦ÍUÙUø—€mûܰ;ú-ÆÞG/S�R ‰œ;g!LÈOŽï6£~B@œz¢W¬æò8�sA¸¦ö3H4úºýµ×;U‘ÎH ­¿¬yXcjsÇc6|žñÕf‹óÀï×-¾ ¶fŽXÆϰ´ä/‹“×wz†ÏnÍĬ©¡ã‡¶Íí•mÅþŒ—±k€³ÃC6«PÂ’ŠvÚî�þÔ¶+ž»¤æÓ ðÕ­_›x"PÕ¶ò÷�[U¶��Ùês9ÖÁÂùZ0­ ‚*=†'û ù ÔÓ.$þÝÔç$!sá±ÈÝj™ÙG¡¼%�ì)/ƒŒná|¨0¦ìfQkV—¢2Óg@€4eLrËÉ‚ùÃç<ôÍÇcÕæ30—Ú¬·÷x4Ýaïá÷È\ØÖ·÷¯JvîM¶­›Ž4ÚLPÔ#ìH¨J· &œ-r®ö…¨š‚À©sÎ[­jǨQDô‹´k^PBÒù¯/Ýý)åtúæ'!¼º~ Ú®‚ ¶S�®µy:ìîÖ5šTÜŠàÇ4wÕg:¾3w9a'°à¡P4Ìâ®bZPÐJÇëéñ"¿šê—¢Â\«9)&s’S¥¶Á7Ýá.5¼e\B/epdÂ×Yùb«É…Ç21íõ¹Žãšç»ôdÃÆ]­ƒúXy¦ûiñü5½åÆ1˜= )M°L�Ó 7@PÙ¢s¤Ú4˜¯ž�'zG‹ðKÔtÏ,î~ˆØ !ÎÖ@Côzþ.Ü j×ÛÊO^³„N×ÇŽ@GyœM.ñ£ézjÜ×™"ƨH ×ùú´²Šlr�Ö‡ã-º\µ±ÎÀHÖVñ¿H¾ùÂöîÄÜC ,ÝHùØýY‰–¹ÄUèêÏúz¬#m§Êk’.�ijç<-°ýÄ7:­µœºª»D«³žî§ êa Êóÿ¥Ãëpõ׌†�ãàì»¶^<¡¨iæ-cd„ÓnÝÖr2ép¶xaË¢²´@ZT¥ôÿ�dáo›îà÷è¯ #®ô`ðPLØÚd ¼@^ð³WMÿk=ÑákÂ~¨„ÌÖ†•ò6ì>€AsË/¡î·{=º¬PùáŒnù]Ö#!DëthŠ"ü•ÑGvQ·ñrÆe`Yx;~¶P¡tmÕÈÝ ä·fá²¾ü¤å²ÔѰû„:­�÷�´»†a¯tWÒ:ZÀüŒBØ6>Î`«˜¸>¥ž1œ4cD|X?Y{E[Ó¤_eÚ<÷x·M .òÓgÀfìô¾Ã” £�’û¾´Yˆ À©¢öì¹+’!…@¨iêÖ|>õwçbek §sØÔ« Ž„$q÷0dÄMƒt±Q¡›ûðßÅ(wîïê™Ëš�‹ ÀŠ@i ¥ 0¨* }Ú Œu§· ô]ñùÏpàt v¸è¾KЦÐÀ¾”Œ5}oYÜ1bóܪ,–qE‹ 9Á÷ )âæòñdÍ]Uèéfxn¼”õ—ÀE‡@ž&{&["®(¸v¼íNtâS_6Þ^7ðìËõÆ$l šÁ�äKœ¿ãÍôe&�‘\&0ìM&›A9¾W ‹ÂÉòtÚzÍŽ1 ›¼óa ÅŒŒSKÚùÉ­��*ÂþN‡P÷½ÞV9—Ql&/ ­_Z¶£kÏÒ´e{«ÔÉÓà‘l«v-™OÆædk÷ CNÚý’l•ÛLw=#ÛTï|úü÷¤}ØFÜT�ílÜŸŠ@ß0°Ç³›.ž®— ´±æÅÂÆ–gJ¢B+bz—l|\mÈrb2É�J…>øõÙ¦š†Ãcñíõž =a‰D0#F1AøómUÇŽ9aV•5×kcv*Ù¶rù§òTþ­•fpÞ· ò¦`Átàø–pÀ)ÜoQ¸«k�>fœÆâZOŽTpp!sŽÇ£È=î>€ÑùÕaLz¥´æ84ö{š½%Ø�J–ÂJ’M¤#cóŽ›» öÓ˜ ­X-jŒnér¡¼ËÓÀ‰¶|`—ǹÞåXnE`£ ?:L\+è¶Á<ÃoqˆH\¥ÅºÁŠ¥Š$ ð'î¿(Ä: ­^O °•Æ‡Ü eï {ÎDòfÝsÉí$“ôUÚÅ`QG6v÷3bZ ¡Í`ÄÆê}:Û�×*nåÛvõ/U)”Œ5|\ =¸8åY掛_UVšþL„ÞtbC#�±¶÷CÅ´ü3v÷¥$N&²V•g1K-žö T €…fŒÿXH�1hËƒØÆâ°´á� Óšý»wæSd¿A‘�Uá‘8ôÈÞ6Ag½–ceÁ­YaÁUïÔÝü{ ‡\†®7C°ê ÁlQá˜!}æ,¼ûBøâ:@ßåÞY^òî”+ã¹-ÚÒtÛûj­±»Ó6 2-_Z3Š“ƒã™€è7�>6“mírøߺa`…ã9Æ[â¡'Π-ï” ¾a¦¬5æñç@ivæÕ£zÙyà>ÊŽÐŽ ™8bü²„¹›J5¶v3±V®‰§e/­{id<{>½ O6†nÚ³ÓÑ;¹•ò¥·ã @ÝL‘ùWE�`tʱà¯ü?BM®�1C¥ŠèwÜ¡ö‰„@ÍJ‡m%(÷ëxÔ›oøªÁ‰à”¦Ò"köQ²T"?‚ØÄ�=ÁÀ|iº¹A›€Á Û™³ò´¹`léÎ%“J ™,ù­es ³hÐÝÁrWqàê�Ì`fŒL©ôo™†étð«ýf(»k�Œ”´vâçÈæI ËS÷q®¾0Ò·Æ® A#r¸Võ»÷¢zO©õ€ÕÞz+&�ç‘ôíÈoO�׋ƒ‘.'67+1Ï�W=Z»æÉGAôüKÆï�ƒžùvÎXªP<úÞviŽKVJ@Ms:Hâ,c~1̉¸6 á*½æ`ëmë† &S°0Naöžàug´¥¬cFÐÊçÁGâa¶ô°@´jà· 7vº8ìCpLJs�â~¡�|ɺBñnÄ bÝ­ –ù¾‹±r ã\ÌØñ]Å÷³?Ú(� ˜ßÞB?ÚüÚwÍ“"Ú§'ÈŸÌëy[åÓT9yt€}_¯ªzô‚6' 1,ÈâˆÕ¨ÿaÿ«Øgå°€7³$5YˆÚÑ¢.x á” 3ÒfëÒ^(è‚-³„>ÆÐðk»Y"'L–ÃyŒ�ï–½kàMü¡8w-Íâ šb…Ì!L,jŒ'ûVbf†¯&ŽÔ�ÑA¸Zì+jü4 Ó­‚&óôûš´Yº)ÒÙ‰ú­·Ô]Ï’μn5�óÒ(º��nÌëò¡BÖÚjïaÙ–Á’¶8nÓæOJ“á=<š@Ÿö÷² ºâöÒWGàÛÂ%þ¿ ´/ò}F4¬œ$w³é HE&.mY0FÀú*DX�ÜE“ÔЖM—ü0+­ktÓ@ŠâáMîï¡Â5¹+|¼öÌÙýbnzöÜœrsÎF I™FîÌXPÜ=j$ö¬IûÝË [³®8nw<ë*Ÿ¨Œ\hçì#D?q«’V'ž¨ß‚ä\.‹Rµ\ãŠ9æœv°fâgk�üß�{/ûjý[ÞÓ‹Ï’d66h‰µ?[­ 8Z:øó«Cß÷�LôQùKlóC…ƒ$æùÔa¨—‰l‘@T‚ ™¥Žb�]3&ʘh…ã꣰‘ì`ÞxöZ>–¼‡fã¦ù¤ÑØXn*Åû¯ÖÈ Ò·ǘìê…ÖHåV¸7c”‚Ï{MRÖ»3¹á^. ƒ`k… ðØFÒ`@òܱ iÃqY‰Îóp�Ó5Ó^+=ÌaK¸§C1ø«8½O Wy•ë¢Zdtåƒ{UL2CšCaýµ² ±X ÃNC<åj„ÛVOL‘X=ٶĦ­€ŠL¥cYÕF(ÌNŒÚÈ_ Ð¹ *Ú,ýÇd±VRâ×"ú$s[ø²öºßð€üIÂ/"Hì÷ªî·Mi¢ØœŸ’²Ò•\K½¹]•8Pæ-øíŒ˜<,뎰25n-¨•±âŒÜh‡E€ÚIú\ ¼lÑëïy+(ióü[Nò„ÔHÏùÑÈ”ÿ´sS€ß¹iË2ñÖ•õåÀµEnRÔâ[„e˜Òxá§€Øiõýfý§� ‘Á^ÇM¹zâ¡¿ÆýÌκú�¯Ô5cø�º~Ī�¯`q¶€ÑâpSW�2�9]Ò‰­ß¯„Û›ýšÝÕ¶½çe³kd®º¬Û¤ß+�©Ùœh^ ‚IM[Ós&Ã8Õ± Zúvz°¡…\íHYrÁõÞ~y1^¶åZ?X9$ÅùÜÅåku£;½×Ò2Yš/n°æzã`ô»„c®¡pð½¬óÄ]&ÜU/7YFn¢$%QûÅxsâ+à)³£ë(ºŠƒ§¸•^¯*,®œmÌ9\µÒõɸ‚B¦iN©÷H;Øæ8ùr—ÀØhïR]à”ŸïR7¾Ô cCâ鮳•óîØ8±Ù”%¥iE—·aYâ£Ìá_B QaoÛ’bà׃­ùBÎô¾x�•“Áw¹Åà ¨,£ùUÕž³ /�5©Lzòs8Ðkœ‰Nj}ÒÀ "‰QKXt:}›ä%h6¸&Ĭ�Bc¬]˜Pf:Pq#+¬)๠¶“!ŃA²„è egU¡­š›}àsC¿8…°²•.éo6õPÁK…\6ùjµX´�[: íc<¢£"䎿;—çÂÑ´wtk Þ"§W­¿'qW°_@;çn®“SËàævåA�Í)±*8 ºbçmÁY·Ë‰ ƒJt¼7gÓÏh¿:À’ ø°áÛT–Ô) îÏõGÃ]°MöšÂ•2mN{§�ϧ¶‰¯Ã¨Ð9~Ò’€ÝÉã-kNn¢Lh;Û’é®ÇCösE­Ãž§Y-.ÑG¨Gi‚HjÞ®?Fä!®‚ ËäÇ�ÆB· ¡�…†!¹Z‹&é!°n&*ÌmV3�æq'gÝhªcîaݧÒùà’;HxåûrëWãB±Žw‘F†Äñú·xLä®õcRé½d,já<Ó{Ÿ�'/�Oï߀[9a9‹×I¼Èž�äÌ&kz³c±Ü½Nºá�ÈLq y@ë5î}r+ÆDQæöðôùvqê’1úáQS‰�”òÀ'½víªòès…ÝjôqõZgÕ_¬`t®Ûß×óxÉîI|ɸÈ�½Çï‘X†¬÷�Þù¸_N:â´“óµŒ:ü9|bIùÀ�‚—)ðv^mœFÛ”pz!´2 UpĹhIÂMÒÂÄ�2óš ùÊ9 Äm÷H6íÕW»êNç'“ø Ò{QPK»bÏyÝòP¡>KmX”¸× éo¡óqõ¸5 �y‡ÃÈm*Âgm⥼Æík 5G‹ÑÛ:ùS«(®¥û•­Ý’Aóï£!Ü#ûªY+ ðÖæ‹R›iqøa1Fd ¾7idŸf²�ýŒ³¾o;!f¤|)c …‰'"ìS6¦þ† E|73{ÕÏ%I«@9m˜^rÈóð -®Ë(]3«�ç5p’;`M�ê^¡ºKˆLܨ`û}Pq …ñ†¯¥9Ô ðí&"ÙŒ®/ˇ=™í\f CK(�²Á0ŽOj¼´E>Îü°­ÛŠØGˆ[cDw0;÷~�HDÍ %2Sm/kßÇ 7j.8±è÷±­´Òµµ~qhA@ÓÐwl›SÔ9— üb2Ãè‡zÂ× 9WK™¡ ŽU0»B`Â&¸¨îV¤<ªÚ¶©&ÅÜäÝDddìp/£§lB¹èÇ”á=1Þ÷n]S¢«)+sÙMÈ1­ŸUb\«©8ª(Œ­]G;E³6ƒ' €÷eòMAzß#›np¢€’&\õË äz'µß‹mq6Ê;„†Ÿ{Ðã+¦ÜLd-©« 5@ ˜i±JLCD2wVVluÊöPÁq1DÇ»­ö:¼Ô¨–W£y¶P™–ím­AÄ<7mܰ4BÚ ÌƒXҲ䷜^ µhsD¡ˆ¹çx€]¼¨.X�˜:¾ë±›= €ˆ˜ç¨´PÀ]W}“®´²#¥0´Ú´ÚÂ)¸‰ñgƒ‘­–…—‚0u<¢:] - fëÏbÝÜw/Ýjõ½¤‹Z¹’I·Ô4v± ]fT!Aƒ gŠï8hÜPØ×7ß/vÂìî»’†¨šØV=?Ïà ·'½\[¾›ìtoòÀÈk«zãïàÖÛ{Ýã�v\BL„ï¬a€¾.�ó•š…ê¦tlãõHˆ»âW¾+srœ7Zavæès®8.C˜Oc“¶tkðÚáÒ�*e({§üHツóâ{½Ç*£˜ P.8,@EñfH¿•;Kc'_é8LŠP¥B2\è^›÷Ü´ó X°MíÛ•ù®- Þ‹‹Á­U®A}ÌÞ µñ_uüjÚãx•Tfl²Dê¬%‡j8ƒþÎ2Rß¾3FòŸ‹AtäÕÀ­ª­}^óx ß«ƒ‘´õ0LcUI�½`êäÆä´íy²¶ãÄøs:Ï7sÍã�ë0&OÏã·=ÙyŠ „߀?mü�j¿±*Žä ‰\©ôÎO›jF§™ÁäÃm�±,âý^4Ží ¥¼^rðŽ—«¦X�ÙzÌ@�T›ÖìX¦7Ël×›ÆC‰åøìwû8K9XÑùóýkéêDÄ£¦ Õ^¼6£¾¸p¼sÇaä=wŽ­ùÖœ <ØÚ�ÝßZêq–í‰ÙF!Æu'c1^e+íCüãmHÖCàæšÌ ²W‰Ú½hê„ãb­5ìz´÷t G¹âÖK�HP<5ÿcCóC¯,Zjó¦ 2_¶E¢:Ö@ps3=:�óS|œI'f…¾ß§£¸±8`|%±¿É\úÙ¿cî.4PŸv‹¼Á§¤Nñ€Ëô1CGБBÞÀø³è€¬\ÓÃÓØÊ\>t®EÑ{³æç«R»-¶8)Þø;9Ýù÷±ï[4a§°%°ßF‡_ch ëü½¸b™‘Ì­Zþ6—˜©¡¿�Øê.B× Þu k’Q«{v} €Ä Iˆ*Ê«|¿¸K`ÆÄ°Y1¸q}*ˆT÷p­Õaxyø4‹¹ù5ÍdlJ#0ÚA×3Ïij8“†ã£ú+Ûêð|GÖ­,>óÝð>¡÷‹ÇÈ3r8´t|»†__e�»Ÿ#\Sdha•z@�[ˆ{!ÛïplûF–~Æ…¨°ïºMÍw³y=½”8·7f ôB˺'GÁ-ùÖóm/…—èÖLÊ(WeRRûUåìAÛ­Ç~^Ê] dÑžMébCz<Wk|¯ÞYü§òÃhiOnø¾‹�NR/{Gn/¡w¯i?FWóþÛ8ÇtŸ ç ô?~¼`%Ô™GXé-ƒlíÍt= ¹¾]Zï¼­¤ÈKÙ�­°gàJ�ðMq“´_”‹?Žo^q§_K׋±AtkØBþ½y„å·;‡e솿%—‚¼QÈàÕ?Gz×V¹Ûˆ Ý+¯À3MàI¯Åt Þɨ˜h»µå¬Å…»k¸ƒJ�o¡`W¹pAÊÊšÎ:éÀK®0ZJVÎ.`Ã5éžý0Ã÷¨6Ù×™ª»…ç<0A}q‡7î9=ï-ÕFâ�L›zœ{šC)yïî—Iœïõ;~ÓšÜIiõê�†{lã6Qo iÃ9Å{™‰LY=íÇÊ >4U‹CÞŠBŒ°¨x¬ûqŒ[ç‘õµo›ßv<.‰Xb€ ‹%€ÄûvSýÙúRüÍ9žÂ²Ó˜ð:æ¶\¢…%�æô¢i\Å0Q2É“ìå,H#çS=—òéQÞ+ÑÇ,êF—ÜQ¦§þI™ásŸ=Q`1÷Ä÷&‹�OÝ Ë!¶5³ºîï_^:’uÉ•ºˆ|Úôr2G~Eí¢Kˆ!{ê6šYPx‹ˆ¥rcØû‘flçö8îÁ®(м¬¹æjø°ø"9)—…k&`öŒ°åί= ÊÆí©´vì$�®Ø€ûf®×¼l)psÑí•Ü^ÃùV¯–»Vö0Ä„½Ú/œÍvÚÛdÊ©ä_ÝëÆ 5¿ˆŠe× ¯ºcR~ñe¯(€Â->L@`wÚ~ÞúûZ,|9xú÷f¸^[~ Dr2;ú—yæþ«n·¶ŽÐ«Àr ȶ~×`ú�-ôºu/ WíÄn‰·bWÁ'Þîòotî¬ßV°¡Úöªþr¾–¦æÙ¢ß óLÕè»Éù¸6ÔÌÓ-¿Ÿ>ïß•à{í0[޽†ï£»Ã››>NdÈZÕ¸…Gf¡š6ºsù4ä8?A²À€ê¥l”]“ Ƙ¨ˆèÖ,®ajã†ï©‰S¿(±×´ä)ÀöZ=,‹c¦¬QyͤÑÒç _À—Dõ~õ�øüÀñ샠ˆvÿ_k¢czË�ZXƒ«}ìk Èü¢÷úÔ«ç¾IÂòƒg‘óltéi¾GHyÍFVp{E °îÈOðÅ» âêêéí*7/¼Ù²Ð¤¨»YZ²dmŠÔÆ9Ð2£O_ÒøØ1vÜ…Ã[¹W°—Ë•¶kÆu›>¦ÉöeîP–��Úyj!î6ý[>–rŠæWŶºúà³Í¢ŸÚqFÇ)—›ä ;X¿¢q6móº27¾óêS.Üyaé^º\|&Dw„¥À,‰´ñ®; ¹ø1 ®ù¯´µh7»+XióÊž¯ŽQª†ìæÀÛ,#“î7ú¨©1/Y˜Z±eøÙ‚ªHs°šÜã¬Ó{ƒI~ •ÍŠÿ Ž•CeCVòVò5mU½1tô)ŠUw]¨Ük,ü·õOžl9´ÅmƒvçÍÐèú\‰£0¹_s‡�fCRh¢ 1ª—&×¼#[±xб'Ƽè®× àorÎÀ<úä7åQ¸w–ÆÃÞÂyþ³€M`EˆÂÞ`-cz$�Ì?°9Ÿ4aZ X¯$déøö�SüÒ‰4?έLa@ôøsœÆsgq¥1¶­ü!…e²dm»€Árß~´ Ä “Ó­í¯s Ž_:\3 ™.¯';]w úh\ú7ßñËÑÉÏç©ÆD*a–ôá…›˜µìwNçú 0†£€Ô)îÎ"5±Àá�ÌÞ× "g™Gz‹ƒ}ž�ðñG¹µÑ°9�¾Ð×]ô]bÝ8B—%53EîiV.ñj0�˜W±²n„þFïtÉ­ÐâÀ=D ËåNëìkc:¿É,[†œÒ°Æ•tÁßK›2¨zžï }…­Ò¡}“ÝŽYü6¾wf NU3ÃÈËtcyÏI±i\/_ÀüÜæâ„[+¿,Õ{!§W¸ k ǯ7  � Öö,¼·™í2»áü<)pÎ>ñÐ傸Ýc‡"Í;°ŸJv×Ú~Ïì!º Æ’v‹Ìòȶ®òöaϸ”Æ4é»Åü}ÄÜ›+o]¯ê ¶àN�sG6ýÚµû•6ŽX „VÖ—ªÙ×éµjì·x)”š¬Û¨_‰s­&F˜žÊ7ÕÞ‘Y@&·ØÏ9õôöçÞr=¸ûQ�½#ž¦XØwãcÈsNãKV‰‘å_; Á\™åU­’Ân‹b÷x%{ûîÝnC‰dcåð}·ÜOO ø4úÊ*›úy¶¸lû;ª}|ùóç`õh´)Ùy Û߯#·»ÞJ�Üë!óÚï73T¨1ë�öyôRéäûP!ë­â®„é%¤AÌHHÜ0/T©)x L»ÐÃl/:·p* Âd|˜uGʤÝiƒw±SRÏ—«\¿x÷dAo›žM¹…îØsn'’dÞ[$,ìe$®!ñ­´�°³i5š�.®¦Œr:›vYœóíû¤ØPªžF­ ð}RætHaûﱨÅbªfý.ƒÙt›‡�<³æWëdS½üŒ¬Ûkå·gµ{£'Õàú™½á¶.›¬²a´=¾AŽõ¹‰ˆ�"㣮ûd9RûE¦~¦Ö¯Ae.6E„©•ÐK7.,¿“¸„yw´}¸].¾æA©ÛMêî‹î2\XïkNýêøwmäTFƒz¤hmó‰î<8JÔòz\is£bÁ¼>e\…[¿e=÷7J%c&Üö0ûF` ÕÄ6íeÞ¯½Ö�OÌðíFÜnZýø‹CÒ‡æ}·Ç´iS•`NeË„H —_w1§LTwËËî¿8çuÈ‘KÍs’ŸX#Yš%{„ ¯T)šÍÀEsšJŒwVy8‹íŽê–J5×´aë÷we7Ìóšßbƒ›1´VgØ Áâ¬ÒLç�d.ΖBe�{ÖéáSq¸4‡ÐÉå:tLáë8§†ëè‘‚8Íno] î¶øÑbúóc¹E(²ï¸Ïž¾ À÷Ün¯˜ãíøþ„�WÁéS¢@®·ï{}Ç£P0¼Ë~_2>‹|Õ¢DMxÞÉwäñðÞ²{sÂJh-{ãÏ`ƒw>¡RD!wœ•©¯@Cð'¡ŽPr^âDy·ºMë—•´ßå”AV ½œ·ðæ¢OÅ«[ç×”3ºÃqn¡vtÊ …‡©ÛûSÑs'¹"T©_õ@4¯ÜÕÅ2à2O³ÐŒt¬X¹…–‹œ.a ¦­´[þÛ|êynêïò‚…4eáÕŸµ@ú« ]W²vƒÁ]KaKóoÅ^±›�BÆ0œ0hÔÐL’Á�Î~1QÛ¹·ÜT�¤Ì†õå¾ i7a£Qû*ie|mlÇâÕ3ÆU_=’ ¹”û¡ÀÚæ:T £Z¡8–gfZl'“Êľ®ª#š{ ¦ÅôÉšìn>ã¾-1^¿ LÚŽöÅmë¶-˜Õ òA±q\ü\6‡l=¿:pЈî8Y¬·3±»ØÌqÝÎnnøfëçýŽ{ '+XzŸÁlSÛT … 9|äÓ=uûÑþø:PÎO˜Ø!Šzù¯çûõôG?]Œ:¿Ë¥ð èg.ÿc!Ù½zн÷~ñîÍÏ%@;¼–k¿T|”Ÿ:±�ìǯw‡À ÖÄáz†_Ù’½úµ’ @ÍÄjýbϺ§`�LÆíéH'$÷¡¸{ñö¸�5ƒßyct9»L-¥ \»/]pXÖžw/’kìд¼{A„'lŽ�ÆÛªâMÊÄÝ^êРÙüï‘°`*“µ|Éy”`\–À¦ÇâPòpÃå.í@ /®SNð@e›ä«Øùdïïm`)?]©�ÃA&Uéæ¼¡§ÅqJËÍ6ùÆŠìvßGÁ—Ìd=®Þ€½Öà:oAÏ¥ÄRÎÔ£\‡¢Ñ8óEªË)wÌ6Z«�«ÑpAžüâÍs¹0EâÛxüm�Ðí¸ÝÈHk¢ ¶ ,),¼Þ[”ÆÂzmբĜu‘Ô1”u¾Ë† ùðî7Ø„ýnãPAgÔ–| sW¨¸i ±¤^örÝu²ÇLœ±O�I²z1Æ%.þ°1í õ,t죟‘8èH÷§šž…cͪ¸FïjÖml½Wg‰FAß`hÏ«ÍüÁÃMÈç·1ü®ÙÐ.¹R dîãk|ÓZƒëåAYÁ~¹ëGvÕ¶Ó;ŠhW…ì�Ìù¥¤Oiýz Ûµø‰rßѰµN5²Mé~@?3€ÊM¨C~øMŸÚÇ;ŸL›@6¾…Ú7nÔòÄŠN™�y{Úaƒ®ÙŒ�#j;�¯F3c[5®™M÷8tŠúL†!¡Š¢ùvÌ�)÷ygÆ2=°±$¨HÌ™ù�â<*ò™k@r$|U›èÃ3ˆÙ¢Õt2¼j·Dª> Tó¡ì+9îÝ ŸrE×´S xÝqعbãZáêö0!"õø¤£€îÁ¤Ç¾*Åó€W3ÁÐÔA|}¦ †ɪªê`2’{ǃÛ+ÛÀ-ø‚™O¹ t³�UâÒÎá!!‡`éX$á,@qƾˆÏ �¥þ¬Mû‹µøA¾DiއFˆ“e˜Þ¹Qŧ}N½£ІqV W§Þîÿ1FM�g{v!þÇdÑQ¿{XÙŠ˜œ‚Ôç]ÈêkÛFñ;$¸ ë꘷bwnu¿1adCÓáÆÉ½¥é¥²›,Ú� RœMó‡# ðj’²¸C ýÓÒµPÄ™yç�º7úg–ÆŒ·�\¨—ËÝþÃ˶¥[Œ}{ð6îŒ÷H±"†Àj©c%õc˜Çt†¢ÿRÚâ9A}’þíXŠ)™ÌïtZÕð@ÚôbAËØ ÆðP– n¡`24ê±@*­A&ÿ+ FIìV…úîýéYÃ5 6>Þ´XË5 Ôå�Uvèß�ŒÇE®ìW0�«¾·®ðš{¿.ùãÝ&ïåSîé}UŸ4a@ô½ ØLB6Êû& „ ·nŒãZN_žã6S–-ÐlÝ—”»1<=>ŠO¹UÃ?;{˜ÙKbo-<¥�£OÄÎg¤(7y–ŒZʯ*Ââ3GÅ{8Ã�ϸµÏ9š÷€2µ”9γUfï�¼E�ÉÑï†óû™ÚÀ/=t!Q‘Ûë O‹ÚjTò¡ OÛ/—jÎ=aC[@?Ì oŽF}ý/�µúÝé×KÎóO·AZA&,‰Ub¢3ú{7u[Rª¢+­i2Q”éK½”Þ4šÔiÅw×[ü¥Úpn·Ý ñÇÂYáÉ£ïp-š[k^sÙŒ=–Íâ5ЃÈg–âÜÐêÖ· *Ñh¤²wæDBˆÕb½¥ãfY¨í©×¡B„†ë㸠ÑE0îÌÞ ›Óç‡ÑªÀ¯”�´²¾xÞ)½¢±ùë̘ӅröÀ… Z‡ùöMêN/‚Ú2½ ÑÄAF¬òŠ-§9!K_¦aÐöbÑðU½Ž’õ‰ÍÃR$ çeTl¬³)Y}­Y1„¼•ŠÅ&Á@×ùÇðÒ6v|{ZˆÏ l–6nQz¼û•¥ô@Û¤Q†¤=¯Îz›=„4^ìX+PSp¼5Ô²54g+Ç…�š”âW kP-ˆ ÒÍŠüÀòëx0ÎÄ#Ü]€nXa�É|�JüÝ;ÌŸd7ä°¿ÇPÆ<Ã}®[‚ŠÞrÈÙòl6Vb¼ýäon’àþëé¨JdïkiÌp«TÛGž’)ë·åe¬Í_Um� mŽyýwíM®z:¯1[°Âýmý;«]¬cIs2=¾GKj_–mJe¢1» î<%¢„šK+1ÅÖÔs{¶2ß=óC‘õ8eœ×Ùü™<°ž.´-#qá˜ÞºP¿ hAï½ó[òTÇ/ ÔÆ¢PƒçfšiJ‘KT\B=´·šùû&šü›JÉûG(»Énƒ͵´^=w»]·`UsŒ–ÇVætJ}ã–2‚îéÀØl—ó)qÏÎÉÐ5Ú” |û ð\�V¡ÕvWŒ·$/W‹½OÒ-úÖa•>÷Ìx ß±œƒûY`~ùK„J6Êp©N·™ÃC>O«ñzÝGM{nK%Í'&9‹ÜQaB�.1MQ×í¨ÁÄéáâÃ2¯"μÈa°Ám_¿,®s¿\ņý&2@[6¦*jú $øÔ§¡ß$®�¼|ZŒ-‚$XQ= `r`å>‰ÿX9[ͽýï2s�ö÷c¬¼L§wÚ�ps3ˆÑ ¨ß˜¾ý³xsÉ N‰¡¯u'™Z>¾,n&<Ž—Pü|•Ãm{–ßç\5üÑx'Ùñ`Ó�qé˜DH¾U[‰I}†Q#szü×T\°[+kz±0·¨t ˜(]…Ø+êuQ½‘çzÄ. ¢èPöÈ�Pf)«lslvý\†›g .* 2¹œÅñ#éÜ Û>æW¦©û��O•IçLÐ�—ͪ$9Ú¸NT Þ²·<'^t }Ú@ÑIˆîÅ'·ÅX¸èQ<|Ø#T„ó3´ d�,1Ü$Ú'œD·åå¬Ò�q¸LLLé*ûÈÜcV[¹2wª£oÈ\Áîg9ñ£î¶™ñ6i3Â_·f.¢bÅãú)z 6×ÖµÃ^O´Ë~�q2ŒHÉx½êiÐÇ^Ý7 `z\ëÓ4ˆM‘ž–2ê¶âZdn²—‰�)qG¬àü8ëU¾MèìO¢�ïLIÜé±@­•pZÕXî}”=Àô,ªîÁË=pNä– É®:�[ ßÎ”áæ¶W�E-ŽùvÐbå¯FOBw&(r‘nÎÀœe¹±[ìÓäDq¿d;NZŒ4ŠÉ}kRɶ¹ÌŒ^HnÓu“öZÝžÀŸ S"vU.aajÆ÷+Ân�µ •VÇÞ²o�Äæ]¼JÙÃÂò–¼ßÖR¯1-‹ZŸ¼+ »„i˃üePðÿC§0uòk2úµwâ9G„Z›!ÈO«šYq­ΘDÒÞÔ‘ØŸòŒM¾ÁÞ‘žŽØ@k–½éK4^oµœ|Çï�²¤×­¡zwPóéœÓ¥ µm„K{~V5cÆ«téz †]V¤qFŽêÇ}> ~À>|ÃÖ‚Á8zó"¿j_N³߇‡O²È?nÎÿ€�$&:_€òágˆQtL`Kp¾…ÀB_vß“XYàs„˜Ô<›rïÀæøA‹Ö±œÜôpÔò¤Ô#B}ÍTVèyNxl‚ùwlô‹8“¸ghˆ7¨ëP…gL$¸–ÙhdÝ*ÙN‹•�!�1/ÞÌ ø6X¿'n`Ee}r§‡ˆo.ÄÉçÁFucÝ[IÖ‹³Æ¹O„ÑÒq[óæÑÄæNË;Î/©©X¼Ù¶/¡ÀÜY%ìZŸñ}Q�ˆÏÛÛáÂ|àÂ<¸t.¤nŠß¸°¶ 0IªHø¥O:Øúžæ rQ2ÐÝ‹hˆ�»ŽnÁk‚cš±§ÖNº�¾?² �"ù\e‹áAß~<ŒTµºsÁ›fu {+ˆ¿Ô¶ó¦âdÆÊ�±«Ëß`�“{(ïŽ/ô(ÞbçÍÊðoºŠÂ‹l]‰ž1Ÿqìç^5ׂÛ}•Í Sp´Å¾ã±š( ™²Ùi’�±ÊÌ Ü‹B€½W€¹©ø/Bzf‚1±¼1Zô¶Æ«Øàbo�¬âÜ!æ±ËÁ5ÿ´…¡JÑÓ““ãRÛd0u­œïZÌà“ºEå?/Œã¡ÔŒl 7i´a|¸W@v Ø‚)éíL� õö«’‰1ƒŠô9ks\˜¹ï侫Ío©ù€�’Úó³ ùÂ…rW07ÖdÄ3¶ú˫̤ßíÆt™44ÁÉp';«À’ýñ*}Aðþh§¶a¬&:(¿äÊà«e_èòî/I€G…Ô¬jÆË�¢ìÇŸs]J¶µ“£î0¦ežP2¦2÷o¾kü!Þò§[¨šËf±ÞnSÕ¶¼†H-Ü„í¯ûv}iBãkC*~Ptà~¦ÑµªB‡XË4 ÈmŒÓLçÚÄY£”ŽNq%âÒbf�Öˆ'ƒ¸Ä©›VŽR`¬h¸Z7²+½×÷-»Mš¬*Z-gíòÁ§ z¸"ƒó´Ø›FU(‰ö×3 G¬60/ŒÏ mh¹ ·¦Œ®VfÿLðÀP¦G:cz�óÎXÆ�mÜÀ¸!ë¨[*†y#±,QO/còÈbº5Åàé¹Zú°`G †JÖH<}r'òï¸m^µ1rzU²†êÖ8° ùå fImO–+…ühˆ X+ÞÞT7ns\LêcÏîq jÖy·y2ryúÕn<Œ“ª»õ¥ÛZ*®�ü ìã˜v�A`!R!Ǽg  lòY=ùaAðaX”yD CÇÜXøìu†WÎ-ŒT=æÛ¯³U"ΓÜ€±‚ØGÖkt¡Ìz!¤¡|v­” „ahȲ�}šß5E·î7³bù~É_¹„ÎQ_+AÊ·²:¾†¸�Ý.)9¡¿—‘϶=²5oÄHÞrÖFñ_ ÐçÝ[|A Œ‚—Äçß`]©�ÐTÐuiØŒ×$HÆ–GÈÏÈÌ6SX¿Ð¶&¶pý·i¼�¢Ê~Ov×ȰmÞò7Ô�0V‹åÜ[íeƒ2u^oÏHµî–àBÝÆëQÁ;𫧤žIêö­gŒìOA»>xÐv8aÏ#&sŸì<‰lô¶–MÒb-ªÜ+¤tzíQÕÁ%¸’��½P_ñó|ÁpQ�Dû!Ø™âü–ô«S®“Úâ,µ4•¼×­/*kjªŽAxé[6Ž.ó�½ûÎÞ+…e}®ñ÷À–ŽGO»uáý´öÜ»è®jËA¯¨›¬áð©ä‘g·JÃáj«œ†|iÄ ûª©aávšõ™âÀó™§€iÔs³’çæ/l:m†µÎ„®ùŸ´±û Ñ�®&j$l¥ á7$ɶÙ׎Ôó�bÀšæñ{·&ìð‰ïèòC&±£]­ÌþÁ^ ƒ�í>]?�vÚù=5ü»ýç¾ÂíV\7Aï=ÛÆø±ë-µ ^S§ÌYq®¡1Uœ•Üy�âŠÇhÔ‰H“+æ J¥‹g˜B[kSµðìó;|?Ô|œº(È¢Ö»Åî q fÒs›Þ—8¤q<6hÃ(¯¹[ëG„x½§'ë4¯F7®móƒ”Å\¶Ò9Í� <‡v[d>öšîÐítDMöZ—xék Hˆ4˜‡ ¶ŒX�i0÷ÆcÇk½²Ž&‚Yy+ˆt#Œº¼ˆ\‚ÊaÄ Ýf{9ÑFñ \•Izg%ôÖJ{góÁó™}91ÚÜwAN´‚ î�Š[‚“jN¬³�î' k±!:„ùŒ ÐwvŒ,ãÞÚâ\ÇØˆòå‹ Km¶Ž†{o™¾œŽ¬wŒ ÒÚö!'îçÓñ¦%ú go%âÆúÏŰ÷9µ,šèj·˜p1ŽÃW1Íò=n.d*E¯´b^­{•£ÀˆfC-Áwà'3Ùôk Y„®(Råç´\Ÿæ“éûµøŸl>^çîþ½Ávó²ki’çø­Ïªäå­?µ&0�¿í« ᘕ`.(åÃê°‚‚•h,y?yÚš²eFø€Y}!ªÕ´�cµ¬ŒQò5~ƒ¤ÖØd4à.K\½„sVî¢X Ó¸ÏÏ�‡ßK ’,àà9—ËgJN‚ÍY¿›lÈTDÊo™f±fq„?ËZIfYÍ7éºZÁ®aqm «¹'��mD�+‚Õ*d—Ò*S@UÒÂôùƒ{rØ®Òöå1 }`yVt†ˆžLD¶U¼^·d‹ùV>Mð¿76N„$wWü˜rQ ÷n 3ÌÂVþ‹'Rà'¶ã?³  }ö}Ok*"i:§r¬²‚›Q§å‚Hg¤D VC—ƒxÔÓþ_lŠ!Ïé#Ú‡êRÙöGtKc¸¥’ÈB1Þ`Aà8Áó.pNÄ8c eCA¶^Ô–# 1ŽRnùcû3üÊŸ�s_™A‡à¹yt—-v™K‰ ¶¡ß0äà3�WúÀ‡À•2y. ;p6Ë„ŒB͘tö¬Ã pøúSéýCöCѱÎóAD†ÞÖÌkW˜ U±†""¯dôEå1ì÷n]ò[td[‚1¸l5rœ÷èûÜJÂo*\Z”þžP–jÖ¢Fc¤BA<`�ú´+q“µF�žë:ÝA‘å¬iI öjü�u¥ ™ÝøåðG}iÂÄ?–¶.ùÚaïq³Hm§aÉp¼$9Má']]«ÇÁª'݈Ýúé-0ï Gwh\X ×hmmWÃm–ƒç0é�WW\œ6ÍSð1áþèN-­píe×e|^H0W½“µH ÎíPÑßÖ0ÌgicïUí½ÏŠewå¾ dc‘ÅÒeÄɪÈW=Ó|b•²†µrrû±ì“ŸBôÿp§�2sK!wÕúçaÞ­ë"[bU°¶«°·S§|hO®‘nŽ€¹Ùæõß3h3l]“°Vr)b3½�Û[®*_)w|fÌrbÃËS¸+Uí×6ñ)„Œ³_–çm™.?fâœ0á¡èC‡œ+%�æåÌa‘ª>ßßh°DB¥÷¼3ƒGNæÝk„¦ß¹Qb˜IA‰ÊF.¹m•VèK÷â2H£:�ÇŽlòw65ùµ}Êr!¼˜k5ò: ÆSZ=¥‚œ2LØ31kNlP "–ê˜`¨Ú²Î]쀒„Epg� B:ЃݞԺ‘-»„¤ã¹âe¹Ž$ø'Š€ž[ ïYx…ÇÌ¡‚g£îé†,„M½¾vþÉm¡;@c†:ì< ÀLl<“Z¥ ÆX9ñ^¸à*û3g>:}m ŠEù9·Wì‡ô(Œ}މݳ�îð€I{× ›ŸP°qjM¢R?Ûw�%°Â‰,O¥IÌÑ=äFB¤ë”H?4Û2A•Tpʉ6XIÅ¿‚ößmé¾,9f?{æmþÖÿ­›vB5 Ù1üÃÂ{2�çÉ@ËT*O¸×Ú°cÒ`Û”}J÷ZQ#¦”‰·ÏÁ[=ñõsŸløVÐÔPÆBúÁFi̽¼Òçvñ˜% ¯{dãíeKŒýÌõ,…¾/®»–4Ý„9ÆK.�Æ£ nVÑ˜é¾ ÖfÄxɪ€‚Sü@g†Í%E§K55¹Þò�`��¾] ”íÏC‹Mç@mNibàü¢x¡BT™°f^ ò¸°Ø�ùÈ',�–ï°€×jÛM±Š¨Æü8Úž³Ýý¥Lží,Äënq˜h °[í“Ú.c¨¼£°ßxSFì9éò<…z ÷ä‚TwwbÎRX•Ö:6\=ñ»ëÔ˦ÃIGĽÜCPœ£vk˾9RX(u$HÁDÛ.êÑ!Í^¹ �](†óƒTå èJTí0-:'T?}o£^Oèï{‹rQ?)mUˆY¬ÚÝ„›‰ÄÈ·´q®kñ\ ‚Jä½n*OÓªaøÎWÜ™$Ë”Våäìî (¸û%©ÊÊ–+ìqçìú? Ú¢|.1¹Ö2㔲}õä/�µ�„çYÆ¡lâ¢nFߺ—¸%J~´ä«êæOéÅø¨~áæþu~`iȺõ0÷r�è�rãÑhj›N“ãDZ²âoU‹sœ6l[MQtÃæd8×öë“Ý$VOYŒ$"L3òÇølÔ˜ÉmTà§÷™cpË^\0¬G&^Þ—]›$.¹£¤UT®ØÅŠƒƒÔ•j†föÍ`éì‹)Í5¬ÞC�3ë?ä��À¥e0ºTðÖ8+‡Þ�˸Ã2i7ÌÒ¿Ëþ Ö¿°fóýdºð‚$ŒÞG{ m(•Oñínéƒ lí>ÓÜð£ÇM,S6SõUvÑ^e_dWÎþò³ÜõM§§æ¤¬Ë]´g•]«•ö9ÈnI›;uñ ‡ÛS‡*)ò ÆOy&]‘þ0;ZÁ>òØÜðYýˆÝâ†$“-©Ìh’»$»Õ˳ 4Çb°Àº›«¹]ß{ÌÐw†.bŒ'ÄÌ&¹±~¼#[%7£Võ®[úÛ@›ÊͲùè�eFÔÝ¦Ûæù fsß4ãgW³…hˆU!Þ±Ìâ§�ó¿ ý¼¥ù´Ÿ =ÛæôóÄ}ºZÎßœyb]®^¶Ñíø¥'®4,¡9¹Cb~Óˆ éÇ4Žƒ­<›Ì›€…›-PÖŽ›Ïß1Œ¡¬þàè5°�æ5E[inÕô…Ü¥·~xÑñ Væ… ©‹2C•›L¿.$‚b7| ^‰bþ‹±(ÍCµöc‚ôrò…!oeB�罚áe¹Û ]×›É]=gSåæÏ‚¯5ïÈ»©�\,y¼o2 ×Zzø`e1Ýi {¬>Ik!Rª—¶¦. h@^Ⱦ¯‹/oYr ’•~@Á%Ó~Ø.Zí£Ã�ÙNH`œr-•Ãa˜Ò Tg.P{Nqt?-JúÀ *Ä `±ÆÅ é¯ñß¹âPW»‡A«SÕãæÓ܃Ì�û²áT`Ç\ü5úS§C&ø€ÈGDõGL삹y³ÑAÓsÇy¡sÜåud•)SÑwÏœ5“]û¹´Y†Bëí bF7 dêúÎ�êÖkÐ ým|8ÚC�®—Úûc‚“ÙÂçí•IàõÈ3&!Û4ˆ4Xn–¸ ô*ÇÖ ZÓgnóÌÛ âõyrÃ9õ³¿ øC~u �¿gOÙ&¿1¸©åT{šX-õXÓd͵ ›�u&ÙN«9]}ËÆ¹’–êàôg °èåûŠ.Ì tèC©Ëíôí}jµ1Aý²½Ëho(‹ž�µÛðìÏ“•!ØðþfÖß3›™ ë eù‹KªÏÒ�VT\ö$·†ø¶¤×«1aš÷ëó–Ëh6�å–f¾�˜zñÓ²ÜÿV¯�é'ß­Êì…ÞîÇÛÞ¬‡a€°• ­‚3Ê5¯pŽŠ„öYÛ( BÑÞ™zqHË@ΕÏ8É[‚Í­‘a°Í‚¥�½�Úe02­ ±LÚÀ'¶qÂIÌ‹ßÅnxjÎúçÓŒð€·Z—‡Ê ru…¥AÕÍTH]÷ËÃc$.‰Á² Ñûì¿8Õ~cHHôøŸ%l ­Dî$oSVŽô*³h�Ùë9ùn¹Ü y?kb Å÷z,cMœù¼—²ñ:Ñ’¢Þ¹xôíÈðÙA@g9Ç´ zÒøJïrNÄ˨%Ï”Ì*Šà™¯BÕl¹£Áº�ÕÞ$¯“š¤ ¹Í´ïJn?×Ì#'ÿwã™Yå ó÷¾†wQs„ýôpElšî‡˜Õ‡„_¾hþþûÇ sBÍÓWŠðëŒ\KHšÁðÃ) -cï(…'Ü<Àr€ÓËÓͪÌȹ5|Wäæì­-Á{%A” Ž®þT LLÎwwÎø#nbóh †6{š�\Í6 2„ý�å³)-!ºÇ`„ÙµQ9’¾sgZ'þAjÉ1gOB ):à´'F3.CŠ,å)�rŸ¤z{˪´\—ªy+¾)nXÃ'" 6 ²Q ›A ÖwÚÞT3YØ Í5:F²“?‡�H#µ ð¶Ì\ð1ŒkHåG$ŠCˆ^Ís ¸Ç;�=OÏØÎÜà‰êôŒž³ )¤²_¯!€~g‚Å• r'Ì17·Ì¥pzå„år¡Ìd›UÇãl¶ îýâÁÚµö»ådv&64üÈÊ! ‘ñ>¬£µ[1ZŠâ-B݆E3H)çýž[† ¦q×[‹súõæÒdvMö¹pú Ãêý�±CJƒÔmY�ÊêJ3ÒúR£‹m¥¿2Ž+¿2d1nox$½¡mÚEáÎÒQu²U7Ø/p@*<„ Ϙæy´Ý’˜gõ18]VÈ»Ê$«­>,‹»Æ‘ï�vû1PЙÂP7ϪûêÏé0ˆ ºÊÓaÇW�°úâ9ÓY¢¬‹ceÅêš:O÷Á5Ç*î* q›,(VRöb”PeÇÛ eU2lì°+â$Ñê| uzÓ†.�îÛÑ•¥/E8Lji'‚nªŠƒ– ÏŠº ½ µ aL!vå2JnáJi‚ ÂÉÁƒfƒ 9e ¿oïYS÷+8áqÖ7£îFus›à>F}ñ^Š Ò+-¢¥[Ÿ|žÎ0Uìïïœp¯ˆæÃ)?Ññ,7¸Öû»ýn²ûL÷¬ÖhÀŸYÀ`JÕ±çšÙl"S˜ØYɹŠëBÃ�cŸ©$Ñ *ìfYf¦ÈÌÿq·xD`?©ÿo>\-ÔX_2XÈÚ~Þo ”À/‘ÄÞFÑ !Ó©³YTMŒßPá1ËdD²tAc;Ö§Úœ:Ðgh×Ò°u¼äêrÕ¸°³`çp¸þ\aHÏèýÀ­3£ÑŒÀ?à_â-xö ~+ÝŒÃÓÝ€^žÖ{îpcÀ+ˆ?ÛDøÔLÛM;¬J‘[cühDç,G|‹!ÝÚżÐE°z)ßòaœ•?Ÿ½ƒpQªÍ¨;Õ®›™ápLÆÝÝâ­b‰KuË0i=ç6õ.²bRŽR]¬ñ>tóc«¢‹#Ú<­*ŽzhÞWï®0Âý¬†\ è¼0› ™É6]¹;Ԟƻ²Øñ0,šÛ’¼Y»¿ÎÛ�›}úåÝ\BôdÉôžãždR6„Öq?Hhõ8½ÈØkÝO¸#™}dq€Ýù”OY>Ù)y_g74|gTdú:s“í„g¬Gbý"ö&x4ÖmjÂ?àmi¬�xMeÒÅ}bNgº#æˆÅÆ¢÷ Xºä‚D‡²u]�íýèéžv!v¸x«È¶�‘àD]f|Ä&\æyöŠ›ò‘‡¸ütƒ8Úh4\aQ+¶º{Ö|tðÒÛ˜¡OÉj™µ5(×ÀáˆtC_Ãçàû‚lY ýÂVöÛ´¹Šô®5Qµýîk-×�=`냚j}œ67¥ŽÇÀÏ™t™õ xï|ðŒC@?N°"‡ðxÁÔ,&^c›é»§Ÿp €r%²áT>ÕÐÃÀ�b~+æÛnqæ½î tÉÃÖ—¹/)µÕ¾£Çiû¢­�{alüÚd÷U¤ékqêÃ,hXƬÀOc7zÏÍàh½Á¹ú‚ûŒ_ÜÜ{º»Ò†Y±ypЂ[0�[æ‚�në]R[9sp è{5¶ƒìù½@z‘~j6Hµ´Úöžùã+…ùwú±öÉ ð¾cÜk½àV;Þ¨yÿ.>ÒíÄr\®ó~ªyÙ:Õ1Þ�¬¬}WSíø�Í®?FÊÑšóç+áêó͇¯éyp#¦!µµIŽ­Ur†Ö™±Ì ‡9×±”>°é£lÑAf׈P(@ˆ�•~Xë^º×·ôQQw·4fˆ)Êß…Ôàñu¿ÊÍS ™ !Rý€ºã7¹þø]~GdЖKYTy­=£¥+ÑbxïÓuleVF3b[f�¤«HV¡†vhi�?�G¿žAus5Îoæ•àŠWL¯¯_gÝz8ƒ‡µ°Zóp�FÎJŒ\&°vGºG«×x}¦Ú½„‰®ë(Å2v\Ï6Ûb­Å0è&­z½¯£†…±j×�½^Ä�„B/\ÌÈr¡¶*w•@Ís.oS‰\ÛÇÈ%¾çÚpI §Qgа´m^¬ßVᬘU¡œ ˜²›Ö1”ˆ×1yœ-scqÜÔ†”ží˜IâÛ]¿4ÿ™eŠ%òt3*Þîm›Å5Q‘EÖßÙjæt«Ìn�ÉÙцãqUA44~âŸï4¸�u]oÅ´qH«Òâô¿_Eã(�€~uXé…­­IâG”ÁJ ôbηʼn҉÷зßé  'ì¿r y2ŸcýYÙ}~nÝ¢ÀoØë�*t]³ õ½g”·õ�Lßch¸&Z‡XµëÔ; ò�ÅìaU’áýҀ ÷V¸‡FÆY&¨…ÃC�Á†`¤bmc‡Y�¡²“…LôS4Óø¢F75Ÿ¢l0A"+påûpbõÖo¿¢ï—ω‹í}µAãÕï÷Qù�l\cc’m¼YÀqʶ‹áR,šŸR´vwö�oYÅÁë'TÎ!¶Ä}µ·�3T‰s]$#j‚½à½Î(£`àœµË%[�jß¿~ƒžÔñ#å÷þ~ýûð‚(ð9-ÍJLKëÉåM:mýK²Ð�}Ž& 1ÛȻȃˆ7oÄ} æ÷ƒ¢÷˜÷VÆî$e:Æ7™�JB|»ŠXOЀ4Ѓ|6ýl—ð/ݪñäo GÆ“cMĶYE¶ŠX .uƒáŽ6.8«ü gªò«Ò¶, Líz€]ð¹ Ü5º› d+/Þm§¶³håäƒûu« 0&º6š¾±c}y¶B±žÂ¹v<üß#Òßñºøø,4JƬ¿Fž5é/vëø· ©-]¼¬© U(ž«ªšÚ¨<'®–Àw€¸a˜F\.ë¬Qɺ³|ïhÿ»jíÒï‹·+pÖ£"¹5|�^×`€íÿÕð™Ê¦¦ÿŸ†f§õÇ`ˆ‰>O›FªÞ–Ùø‡©Ò§ž¯—ÎC± kþ¥Âpäw/5¿ÐÛ¹ Í@‡Mðæâ`N·Ï@ç3L3œè+9adÀÇ—]¨–‹5 ü�|Ú¯ÇQ“K¢ý yt Äp¸T¼�–c¼ì à(Ž4úÊøô,õ{ Í�6‹<+'ÀG�Û¾Q_ï±ßB …î¢ûUœ¯u¼w*ˆ§á§_sðPtbí»4E‚g–Šå—ܤ§5œøÞ®úzÀ‡0áDŽöh 퇘—0ü`ñ–ZW¯>ô°6ÙÝ‹q«…ðeàD�kÚŸÛrÐo~–Ê?Q»ãöÛk°FÓy  KÞ³ÿK˜o7 õ¹©Ýeõ ô²Ø�Ö¤¿,9%Ú¦A„¢®”Á!šôþÒJ“Z“ƨÔ2Ùà*ùªM„¥ú6ù�ý*.�™&é°Ybéëq�ØJøßW{bj�<š ’wÇdz¤±1H"+òú|®K5ƒÑ sWç'ˆ‹f·ë\~Ú¢MÙtçà}ÿ=g "ÿ öëÇ€A7ìÆÛz)»d�¸‹ry…±mZ÷…ȶšmo¬–|Y²NcÁ9D”ô |¥ÉóªÒ%B©¶»{;„»Ó7»íuŽ|eÇöâºçHá¯7hÉj½Þì84f‹<…Ó_ž¾q.ý¯F÷C9k<úËs,B Þ¦Ú’@»«ž¸*0�ÂÚ–lÛ{Ÿ-Ï-SS�èq?‘ ÿ´‚$ €¬‚Œ*À*B"�("¬¢*0ˆ¤  *¡ƒ £ Œ(¬" ¿·çôñß¿¿—ßÇEywÛ({Ù~þ>c�Šà¨}(â� üp»åe Æl”„:Æ´®b9шþò(Jb§èm¤?ñŸ(2ZÊR±•ÿJáÕ(�¬¨€ãQ�ÖÖC<€´ÿ‡]aÊܧ«dÍ›áºÌÊ…\J®Á¼ÄýÀK êP5⼂ûa‘÷nëßE×jjø«>�'¤µ›•Ëô‹avÈݸéoTâ¸á+šÑàœkóÙR-Dö3Øwu@ ÆO3 àša1žÞô 9ÂqªóÆô!0‡)�ø½"�êõÞ/Aϳ„'éÙLN] ûSbЊO� 7R©|ãTùÐ5ìyî-_©Àãb1 5‡r¶>$¹DUh:Ÿf:vöYh°´�e–+Í´œ5rî órãlçDÛ ñ¦/Q«U–6g^('È޹‰G8¢‡rÀ ‰Þ~ÛbÆÃ<}–!sð÷bç‡E—õ»e î]¹ñßX(7› 7Seh‹TÎ U[Ñ'Ð me,»”}ÁjTÚDC{îóˆ}GSšKmÑ¡ Gò0!‘�«"¥À‘ñæ“I=ׯڋ ª=|SJd²•À�ˆTNvÉÏ56lUÓÆ‡­Ÿ†}ñ�ÁûÊM}£îErõ)0E®FŒò-׫ž¾–1��¢ìÍÚ«0{&F� ùìµ2£œ'XL S·7e4Ne?]WÝ®ç¨ÐCågx5¦×OtwÊéÌ/²ÐOóÿ;VwØê_Oý’{¸*,nž§$çkÛòÕ�·�Œï@­»ï,ûh z¶rp0¡–*à¯4øû²½�4 Ëáìr;ú§�ó5 "W=þZÅ‹ËÀ eïþµ·ÆƒWfÀo·5ýC&Ú”ÁbËÀŠ‘{E=š Ö˜bLÓðiW_œµWâÌhYÂ�ZHÃ�ì�U­‰+Y2ƒ»EÍ÷ ¨ã–¶iŒ CP“ו;‘mïÏmRÊØ#¯v(Áð ÌÞéPÎß•¡å„ðEÝX;Ê¡’àfë‘vhMÃq÷®^g�!!$ú!X# �95µ9‚ƒÒ‚cá®ðOóbÛ>ž„S­;÷‹Ÿd÷·ªÀg0¡;Kí�/…£Û޳߄IL®šëâ˜4?}°ŒÃ®ZÚÙð"Öš ò2¼ž©œ¹ îB™Ñ‰:òÈÖ«¨µ÷¼¾=GëÁ¿JÈ|`d´ba›+ðZ}³ Is¼‡_4‹�¿ œÁ!íÃI¸ÆËõ…¾±7;k>Bhi™ 8H‰‘£ Þh+š¿‡ Âë¬5E)W�•4àõ£ÍsþË"ÚOÙ�¼çÜÆÓL·ÜiŽq0‡ø��vY7aªŠÝöG%m9�q=©Ó½Ï�З[F#¦0(ýfÙ Ð/âˆÍ² ‹è€..òe²àˆË ‘kÙÞk@â5Á,ë·Q6ï«9Üûœ{b@ãê°q!ÇÃÏJ'¯#¢öõù…øÆ|£�u&¸Æÿ¯Ô»t è..òò'‡F/±ñ¬¶ÿDcæ[Îæé˜ÃÅÆ¢¨¾þªŽèÎÂôÓ³°áܺK�…jÜXòéÇguÑÉ7t¡Æ\À²D×½¾ý§+jI_¹q¶h(" ž¨§× �š¸‚÷q€D Ôã½Ù¿¼½ï^°d—úÉø·o’§õ6íâÓô°U‘º{í\Óï2fïlê_Mó¦‡b3�ôl›D±çJÈ‹Ãbø^Ñ"±Åí0^ý Ž]uã»g_(œkäl<Ô(û4z‚QÈ…ÏqT�qÖc´ÜlwØæ À‡í­cí’ì÷6O¡0+ŽyÂ|rÙ’v›³¥Ù޲·»0éØÓ°kgÔmËØî½J…`mz¶#nÈÃý bø—^N½Íü�VtzakÜ·ý›ŒôƒŽX’üãV—Ìq=˜[Á&B7GyÄåÁh ^"s0#ÁhÀ.»N´ˆ†î&ñyH9t#^¼çÕ„ IÞ,Ö:AFN/ØjÃ�ªÖpá+¯Þƒœ®afÌæpKðOË·)ÚðÏYØ.Nmë JeGd}Æ~{.»A“*{9j»�\ïR9µ�ôn {Þ´Ô=Ð;ç¬mmPÒdhòU�¼VÀºlm-»xŠý�d…SÔéºBQý‹31è2:H¿Š3¶ÔßÁñ.™ÒWM{ª­9ód[É�†s›î¥Âè〕�ˆ„_ð°Ÿ�KðꦡӘ˜Û_‚)?/³é�L-¦Å;º@†h¹úöäßÙcß3ƒªÉ§p¤Û�«Œ�8áy™¬Š ßg”Çt|Ýá�bÀV-¬eð€éÕ,3ÍÛ #½:åû(4ã~ @Á6Ê?9¸ÀÊYÐÚш: ³îØQSÚ›…·ÚθE§ EØ’ A¡¬Ð‚‰œñ k¾ˆÆs²ã„ac§mÀ’Цô)BueàŒr�.~°§Ùå¢NûWÌòClO³3éz‘­ï_€æn;j ߟ/·D`míymË•Àû8=­((î5^ŸßW˜BåßOeS¦Ï· h¨0V+6¨«põ¡´ù±iM¦ëÊ´&ä_o±ýë_õ䱩È„ò¬“áÅôÚ’Œ%øR ÜUÆÖ § çüýÎ@ùÑ ûS/ „V­·$Å9O¥-…AøÁl¯„�BÕŒ<¡�Ž|1óQá¿ÙÛI�‚µpB±c¿ÀÂÏZ›æ·„/‹|Ë7oxM¡ŸLÚ>Z¬$çÅ`@Îã<ÃA=ßÔn”j »{…hw£úvÍÁ‰c9>#ƒå4L’ÄÜí»S{½nË”¾wüpžÒjloi„'è…ð=2,”ݾd|u²!²bvp>±‹(om\ž2èØWîh>Ì8ÓXr,ÌS‚¢kxÀˆ'-ÞŽ› ‚8!­$HTi¬cëJ€—sH¸Õ´3šxû¥+�®÷M,…5nf#öƒk‘ÍW« Ö<~,é{ŸyùèµË Šþö< 'о¶Ë¦âr1”|õ¬�¢¼I¶…W]á¸�¤)©à\ˆÇ55Iˆ½v`{K°Ô7n˜Å¹gÏ `Ê1VÖªÒ¸ ¿Inšî™YNV!¸8•´ëg§Ýúå,Á¬EªôV½†Ù$hG×vgÓd¶à 9¼GY¡FÏ ßÜl»õ`çáõízKMƒ('…kYECjÀ¬il»sÀqk4¸æ/gÔxmÙ“ÜêÅ«Ôk y,�lšhC²‡¹‚÷ZR ÷¡€ Û’ÒA8q÷?%yE@ß:ñ—5ßrãé+òO¾ÙnmiÈŽ•…p¸¤.ŒÇp$Ù¢É請g›$ÊÝ1¸“—Ó_eZG¬T©VxJµP®¢ÂªÞ3©Œ®¯µ·E� \Ó:ˆ|‘szl¼ß’pL©’Ònïmž2S´qL†,L‰*B]· f‡RÉ"kŵç:6|vSeuD�Àpv–šÖ÷ÖÕB€¾S†jÂy2¸z•yHÌ fd/~,âîp3m \OÈËWÝðw§¾ÑW9}Óˆ=Ôùâ{ Ü&§Åæ(s€t%åÜü¶Æú @š¶¸5�9‘…m±æl0›äÖÑ5™ ,‹®’î}Ñ©sÍ¥ ·l“{ ðãGo~Ö,ÔÅ� ê�0q^ú¶“šï¶ì¦’aYxlz”·&°eŽáÛ2öwÓÖ&1Uk2ë÷xG΄vÉé猛êMö}éex; I-Öj›�xn¼^8w ìu¬í^Fn“ÑÞ÷Ù$|g¡Æ‚îY8 \£;ï;«ª¤ñ.€[oŽåUåwö+q‚Ý ž@± Îóy°É¶ZìF2ÅÉš,�ÚVãª`NéhPŒÁyú¯nd)½�)–bg(ÌÃÞ„{Ö¼$é´µ�â·i<{ »ÜÓ^öà ­�¸�è­j„ ù,‹¨SeƒA}T�*<ëVËËç\yQW4ÕâÝÂ=ô,ó gª†Îá0V õÖí”;•ûªàxGoË_;ï�h¢57ïRXn—ÒºyGA órªc‡å|¡¨ÍBäaëÚ࢒,âàE ý}•|&ÃÝa’?à^:ûFj 6 À…h‹£¼5ÇÖ~‰1¤Jø™+2JW£¶w}ûÉTßQƒ �ê.NòîYõÊ/Ÿ´¶%81ª�ä³ßíPé«ë‘Q;¿ïßžúè}Œî¹Î©çb�SZ á�²¡ŒzÚΨŽ2œ$¨lÃÈccèõ÷´�2qê}d§ö1“EêúÉb1éÀI"wR…` + eƒê tIÕ€ÓÍ+óý÷¹Ž&??‰‡RüàÌ· ë`%ˆÅ‡qq ô“Ö€Ç7eW)fŽøƒ‰ú&§§}÷¶©·8õZðavëF\;l5ñ}^i¸&‹ÍôÀûÛ\ÔÝs>xÚüˆÆßa�b·öÛ¹êÿ‚ôO‚§aýÚ_Ðã­Üy‹¹âÏ}A¬ÖÕ¤C Ç ¯Ÿ $ �ÁÜ蕜ÉçQcª xI©’¨< �aÎc7ÑäÃt¹°ê`¶e:Gvê5•§aëóè¶·½¶2¬/P>×dS•Aâ§C³-8söI³c«Üv àîáç .sü1Š.±9¤$6r›Êƒ|‹ŽFÃï[͸QMv[“Ýþ”SÜ-Ûd­ñ¬Ù›:Ci ‹Ï„Õâíf¸Â Ñ£m™¯ÚE„E9(8Dw_ž´¬Äõ—}ÅùÌýÑVýÀ»ÚF—õ÷~Üí¸ÈL´öWvÍ�î’ÁhÐp ]ÓdˆÝ0i„/IûÍïo…m­�ß@u%Kðç�¨VÙĶ_TÚrÈ[PÑl¬�Í_{ý0ˆòVg;MÉÙÙ ‚ø(™ÁToÐwéTÃbr• ¼U“Ã<;E�8½!Xq,Qñ­�-‘?¿ ®!°‹ò¨úèBµªŸ90#w6mõÀü³m‰�¾0óNQ±©K‡ Öz'¯•®_$¯BL ÍüY«G-å.p ¨?((ÎcoôZ’Ù‹®Ç:­Ö¬DD À;X o…b¯¬jÀ³zp,°q¹ËÑ ¯ŒÇJ–�"Ry«‘!ÁÝ1§0¢-‰½€øKH5bCô×å§¶w’®U\c!«¢íˇÝ( sß{¾„AñÓª›DëéÞÁ¬S犇›ŽÎnsx� _¹ÃuNpõxãïÜ'„¬DïY¼p’Î(6òÆ_r™nå䳂äVúSÚÍÆK‚.i³*gp+2‡AˆúGÌZ*øDÞ^oþê XuÊÍšûè,Èæ!_�Jô„º6ùÓœêC3‚¾a³.ÜïªH,#Ä´¨voqåéAëº]åµ × U|,:Ñ\¯ã a„«'[‘ée¹f9“GC4á˜=²9Fa[¾}°§ÉŽZ½¨o_l·ÕMð�¨ xœ/éWaíå� €ÉcõüÄ»qè/±÷7åÅkEëy“±†X�OŸƒhçSák[Žj"J‚ôz˜Aؼ-�³«>-Ðs¥ÝtdVrm6ºpͨfÆ4r8Vëõ®Û(žZ6YÜöqûš; n %#˜¢Þ+Š·ÝjÏ¹ŽºÙåt œbõêÕÔÉ�óñY+_ØÚ(=‹p%Cä"‰$˜iŽÞÏ}ºÉøs÷c�kBÏ�v‚ÞȲ°;¾íi“r6+5ú'~?æ×=]x㱚YvNøGbÞt“ŠŸF£/n•xàÊ]Bá¹ÊÙ­*"9,vFÞ`Ö³{¦^û!r´óM,=2€›E=¬ªG–<ùïÒTþ G_Í^î1yêꊇ€b!Ô$­Orxelãà-ž’—ÀÕSÁ8n\oŽ�ŽÑªäÜ&@¶m5SsØ{[ÏB–'�`ëÈ'„;>³VS=uš bn-­•,<ü´g쟹[K6ÄQa´{¤�‚æ<33¡4ë!6æ×L”îðyî§Ax¾G!,|kPu²@qùæÐÕ\Ø/Pï<ãÜç>Zà84=ð<7’ÁèV�NGÉ5´Êœà2ë(Ûk�/2B“¸ܬÁœYïw”¾w¦ÅJJžoÓWíÛvFÇT®‚” óˆP¯¨À €Äj�‡ôÈIž,¡•],E�hYGzê†öö`-Ñþ™.SìYœuµ œhQ8XhÞ‘ª¦k ;Þô§x=ó†d¸­?ŠCTi�—‹JpS"¾È¢Òlb œ¨é a6¥Ô‚JÊËY…EöáÀ_�Œ\#,¦•;58? SÎݪ•aTш2Ý<Œÿ$;s³“�jH)Ò…uFi}wµ9\Ôä’H„7ƒ¿ÌvûwåÜŒ£÷u3!»çƒQpOkƒ�l+�”„ŸˆBå¯P˜ÚhEXÉí`7dÞÄ_¶Ûö “U£W6±|úØÆxøÖûçzår7m]4EÃŽü_�½Ì¨A2—� þÅ«YÄ·8,L!•Qn7YëæBÿ/ßÓÑD9ÙÕ±‹¸d]qüÀ¯ÊúÝWÌž$‘œìV4ç}Pù|ý7i�Í…/1FYÓ™RtXp�ÚßÝ�››}[�Ë òñ 8K^„±vÇ{DzuÔYm°(5Ó0¤¸ymô¯Ó!@†ƒ¯åV.1¶¨— ç5¤¾A²2ä=Ò‘®N˜7£%mÁ¶¢Íeu1 €zÁ8ÁnP>ðñÐg†As ^ùMÒ£±ÜÉ0{%kë:¾µ¼JÖ­í× ïb Ðò%¶ÈÙ0ïÑ‹äßÈ{‡týo±ånµ³ð!nÒD® *vv@ƒ![Óì{�”›8xm% ·6£ ·0)aÜèàÀÅ/P…Diz¤³ƒZ)â^îØ ^›Åf�°—‹|*ðƲ@—¶½èz¦›ŠÂ¬`BíôwíX9w F¶X&ç#¼ŸÕ7ÆÕŒCR¦pb[V4Œ:ýk•?fÜ$1·zLòA³!+qÖû›a°õgÊÙjóóüå¨<'èA+tÌ!7õV\¾ç•l},š¦aD¶%Œ©Ÿpü/Ø—œíirj"Ù7(Z�0V²6šž/¼>¬Ÿ¶¶Èc;êùµC]³†^�³­f‡’�Ê5Œ° Õ>@2Ø8EÀ‰m �Ì¥LOJÏiÆ_Oàdó­€]6se|öŒAøH#a£ D²PÛÏwÅÞ3®Ð8bor0#ÞÌ݈/aŒÐ2õ¸�½´Ÿ4}ŽÆ\u‘tKiÞ|¹ˆqof"ÇÃN{|>8$·¸è—;ºÇÕUab˜¢œ¶6©U’»âfx €ð"ß ‘•p²èïåºY àeŽï‰ª|¶C'Â9+ÌÂý9ÁW¬jQ¤­0ß—5 hÄîz3¨uWiµ¡ÉÊôÍ®|)FY1¿ÐmŠ™AÞÍyË-N¬�{üŒ*“Îxȯ«>c€ûÅíäa›àC“Û«ë¾n;Í]Ù|অOW¸­Õ•žXèîÿa–ÝæQ¦(ÞʸüǶëw霥Õ0¼÷߆ü!ÑY8ÚçŽC’/·î.°Ô.H¢¡%yFÇWŽªœÎ5ÝçFèWA�N»kõ¶:Ʊ1@»¤G‰°¾óæ*§9�±k!º6^e„Š^ãé¸WjTa¯Iš.ÚÝpù¯çëpÞczqSÈ5qË §¦{Ô_ÞνäϹVµtïÌ̓| l¥f¦ÙóØqÉÍ_ÆX J>ÚkveËm*îŽß…\ deÓvîb0wíÖ,ZÌa*¾«i²Àé-ÅI. ÇD,ê…9åŠY}¡^3;Z!4ØjÊ%¾Žó`³yÍâÿ¢¼Œ(Îà8#–¹¶˜+}›+ò0À:›`’GkgR8\áõ¡~Y¬1V‚ü…ªìðs@öÎókÀ^è㽂œ¶Òí ìÐuúIðu ÇËÂÁ„ˆZÒ›£¢UáUêÂ.#œèbAâ᪌îß’æ¶q ºaîü´;b9zÄ‚Éo*j™˜ˆŽhE¢çEsÞxŒs.wëãü¶QUê€îd3Î#tÒ¾&|M(tL�çS]$Ý´¾=IƒÝS{”‡m{gGä´ðÖÄzAo^xî ß|kx‘W°…¾ø5ÉõѶxÄàXÉeñ»"¼¶áüáàf§)… Ò´ÉbÿN#Ø) ïx  ó Ú£$¤]ºÂ¯ÖŠ@FJµö¢Ú=÷8½s…Ž5�rýÛ|~ï(Åê3ÐÅÁ\i¤Ó,ë–ܵÖRö"!ÁÆý~™.£³`‡6SʵñW“f¥¸œÑn@šá�Œh’ìÛ{ªoE¤}ÐVœ6ãÍÜ<}¯ŽDȵ¼õ¶S•ÑUË //#óÀù6ïÄɤSŽ\#£ÂýmW ø¨©žd˜wÖêP}øD:Àµc0ô±ï±Ž­o˚ǢØ;ûä¥n«Ð¯`—°_ ëf½3Y”>!ç7H]HF¶¹ÈÌØö2�S½™‡…ZMWÖi-ÙV›5Û PŸ¸îºAœ»!#�÷_·ë(8¡ã9X»É“ŽH“Nµôæ“XØÕÎæú,›‹ƒ Éj]Ø~l\�xz}îcõçö�oÈ€AÔÆ]φÌÜöBÓ•}6¾Ëb=!]ÖŸ¹ö`qb5böê­¶ä ïj­): ¨ Í Å_É.�óYx7+í å7§Å‡p]ÅÝCÛbJØ÷+);ï…ÐÖ¤,×B MïÒ�FKW:w@7]dÁx]/ ÛåÁ¡ÝG‘nBÏ/Žª@s�Ö-ج�2ܤ¬A-BþÀ¯7�å_¼ŒÎ2‰ÆÛ” ¤½lŽ™ <ê3é¥Ð]a9QiÁ9v ¹úrU‘EÑýrZ²oG JPŒòÃX‡`áV-ôêÆ�ÆØ™ïkÖï­‚ëDjÉ ¡[ ÕaÓ�"¸V¼Ô¼õ«@{^TóÐ `ùÜÒœYAoËšƒÊ£°"k­QÜã7µK�¹{õR©ã.k.�)šV/¾à#1fAùújâï¢ükaè¿m¿›â^…_îÒÂó `Ëô�^k‡oY 1IÚ@“ïMÊ`·Ñ™F³³ÛwÕÈ/‡¦I<$ÛëëÍc"fÝÖ¡í­ýwÞ <Ú]ì…ÇBÔ]&äø>æ¼óBÑ.ª1H1Ä['?3�åx“py¨ &èc{¶®3b„°gñS _¥ÜçŒߊ”¢¹Äëí׈l=�ð2{‡¶BßµÒN­³Ë‹¥YűZpå–®Ô¹ æÉVÀŠ�{€æ#i"wð²}~Ÿp8¡?"ovä‚Í…Á”î©/(1ñxJÓ®Õ!æPaa°m÷.LKAi||[» �%¨˜‰ù“\üDv8²ô�ø‹³^Ô–9ñUÖ-nlRW†>�ñwÜó9âϺ/e·,G7ØhãwH‰B¸U˜,쨗ÌÎÞ’Ç¥~âG³>õ·% Å•º@Íý“Î~Úxý¬I³Y¶Óß±çtT íäår6ø~¯BKé;öÖY[‹‘Ï=2…ñ޸Ŏa¼¦ÅdÐøåð>¯%2�?�êûæWíî0m®Ttñý"î·.÷–åì%êè$½-%±S4Ï|zs‰‹Ž©‹Ax[½zÝö$1ÕâTÂmïÂs¤òá WY.ª¸Ú\¿§BúU#›¿·èŽ Æœ)­×‰Á Áß ÞO;¦šŽ[ŽqÙ3)€;VL/ ŒÉËý3nq? º65(,v„¿é ,ìk&‹ˆCî‚-M½}þ¹û!–5;lõüæöÓt_Zûƒ†Õ‚Ut?¡Ì+>OW†�o†ý;z .¿?÷3ÜÏYpP F{ýµI¬hKÃ](Ë.¾åÉø{¾þ¸„¸Ä΂ýhgû¾pé+÷^Sò­ÝëaàÙÙÇec£/Œì‡Ç‚Ü^«!ô}{�Ï ãV‡êwâs h/DŽõ‚Ê!®le¨V€j8|;®Ò»/ ‘oŸ´ÒsÁµ@«9WÙfø¾Œa8 ¯I†îø9 _òø¢ÁÙyh¤G™ž}mšœYy†TÉUO·7�OJ›…[g�€3Ý�IÄþ�„ïLrí´A ¿ïÛ*3sk�,¯êÌ^6;({à>¹�WìpºHq¦SÚy5Ëb/³Àï�]Ëá/§šò¡rÛ‚vÁ†à,0!bÀð·lT{Ö¹IÁze³rúîÉŒ°u€›%‹l3gW4M9Õ÷  ×y>§½šdâ0_ÐaÆâ`k—E’=ùïLÊD¼“DÀƒð~Lóòøu�+5ÄÐØ¾<0¾’׉cÌ&qóSo>¶D.^�á4L¾%Ólâ‘$%RŸuÐF�œß{1ì”U¢šO…˜¿µ¸¹ gZ;j…e]%8i±‡Á+ãz’Åõ‘ot¸†~“Á_¬hë-+ Ïw ¼˜]m‡)\lÎ~4¡¥°†8OHÇAÂÌ?Uxú2N*Ù÷gSËäÓÛg7Î.Ö› íl¨È諹öб°«�¦}Øè™ø…GÔ¦Ξܹ8ê¸ç÷(} £é¹Ê׫åJ0êO°Ð¹Ð6,x4Zº^É9žp°´ŒDQ SSÕ³òš\Zèbõ†Ú,UËn޼oN¤ÈØð+@Ñ»J„“àø�'é¼+UÎO|U—ÞÁáÿ ñƯÝ(^ƹ|ÖL2¶ª †VÁ³È-MgDé]7´zb,[M¼3ð 1ƒ;y@.µ¾ (Tkv»ƒ°î>¾óYçÄ–´‘­í¹3ž›hSí³mÀŠÏ•ê60ò&e�Wc'ܧpÁ�¾YÚPÈ�ÖL§†W­ÛZ¶×–V³¹ô3J.<.Ý ñìºÎ05¬ƒµ²|½Ó³›$ô«,yáˆ^•Ê [«èW[s»»:�EÁ#(KJö#ù5p»G(@= ßm¸§p{yõó£çï£~•ÈxJrV·× ›<ï‚Ý›gÐ<œ_Ð ÆÆ|ך÷ŠPãh½üûႸ×d&Õð)W'“¶îœ¬“xa/й®®Yì³ëÍ¢ákvüš¢}«´úp‘ÃÙp91~�q÷ƒ rjÝX¦@‡«{äª"ÞMÞt¸X9¾¨(1{X˜U¹hŠƒÞ[5{DNñ Š æœ:ô5ºÒr0‡�ŸÛ¾ì†1„æý§nÉ#Š jÚ8sN+)…�í´"w,dÖVL ÜVÝÖ*ÑÚ‹Ë€«a®x›‡KIªD ŒÇã’xÉ&ä’r•ÄÍ¢ÿ:uD�åvñqš{‹êûž.�ØM+c)ãÝ=öÞXâ|TÀ#>›ëif×ÙDs5²wSj*€¸õƒ2†ëJ›ŽžrS$×@ã/D(Æ@ÁÆ”kÚ¢oŒ#°p$‹ÛSî@Í›îN3ß\‰›ˆ6'Ô¡#Ý#ÀÓãu×l6M#"À] ÒŒbøK ÷»ó| ŸLkƒÓ€†é/—9 ¾H7Â~f÷3€Ê�XSãຶR2Y$úgÇ{ÍeoGá|KHMå,ð ÷žXp¤é8Äô6EÛÜá¾BëW>%ФU„ò,a¥.ƒÈÙ8,›în{AÒV;+~šÞÌÖkë4¸ï–;°Î)GH«c]À͹’XX#³9ƶ\ÒŽ>£®’£ó:ÓmÖ™Tÿe6oÂB7áÇiM¬C4šW‘˜Q+Ð mNâkãi¡suè|�üø>| U®1ú<ãÒëPÈÃÑQóÛÇ’Ì8x›ÑTÈDÏÓþš¤È1RoÓÒ…î`Øc6WÕ_YaKèI¡Ëì6‰™É²_]Û;\¦mëµ€ Bb=S•Šõ“ I­t¬kÍñukïÜy½bŒ²˜»›ÆÊ<h=*“wvv§‘-jýE¨'�s„]ä%®‹f¥ÄEÒêÃS©ÍhŽ 7‡Þ3Rzó6ܵԇ¢½µn�-Õ¤pKzRÚÈÆÌca°æ¯{ ™m^C¹ý6}Â4xc´9+´ù@ÄБ3Ò|Ð¥ýâ¶ÍB÷±¿5ÆÉôSa5•÷º‰��hðæÏ6Æ Õ´ }JÃ<8£!t­�Þ¹(6Æù}Ýbô² É«E£ð�kô ¢­À¨/ŒuÓ«›�g®á© ×øÕ9‡i ß6IàœGß¼ÅCÙ�O]ÂhŒÒhNe¯�X srzí_ƒE�šÊg9ý7· ×,þÈ,¹ª;­€”ÁÅ�u¶˜F_HQ±¾¼ˆ�¦¡�*G$Þã9T ¾€lFbxY¿dý®Ôà ∊ðhÕ BŒÊšf>÷Ãðg~-©l.ßuy8OºrxÙÆ)]ú*¸=^lxßrüA�ȉ`QÌβÎîØßXiÂûÀ¢á´it{.[<ôÕ^§d ¿Re¨ì˦7+øšílpQZÖÕû…k⺺6Û�ËFEæIÜ^×Å»ÖA/{�–!ÚüR`nØg¬º¹WI{ÒÐòY±ÇYKzñÓK×2(g„ *ÆkÍÚ¦Ô’ð¥\üûõ~sM&TöÁlDŽˆ«ñ 1¢# Ñ.Ž�ÄW®*J\ÖæTý�éƒlÓf0lB-�½Ó@¾÷¾®�çjB ¿Ôë'8äÑë±Äê57Ô ­@ëÚçG÷C¹.ëh£¨ ´3|Sï×®iJ;ç4¬© †6Æs.m’·-J0ÔOƒè÷`HÏ ,÷Ê–U¼{õ£³i¸C6XÇÀ§FÙÁg!p: +Aå‘3�ù&²¯á�dã+ºùYÇlùP²^l˜ˆÕ%áÓŠ]Zð±Ö ü÷îêÔ+ž^;¨|ª}¬_;w‰�d^ÔQ%C¦·³�Kµ…õ.B4�K�4HJ“:ü2âX ¸kfËŒï Ų\Ʊ˘`9§¸sЭ°Ü4ïo-Ê\§�ƒ[½Ÿ>Ú±[ƒdRÖ[tçËB&{ÕÞºnïò{î2àG¾�²ª€¾æh�A4„‰3Y. š vI´6( ,„æ[¼]‡%7î–æ˜’pCÓ¹®mÃS¸4 Y›ðÀ_°s”Ü\4¼6„Ø`±¦ ~RNžUP� 7p€ßël|39 ´˜`ãU7؉NI@’Û,C> nX­;Ž‹¥¯§UìC&sU¬e±ÑØ‚óapÑ= ´>Y �Î\PQýÚTQö´«&R7…åPã[íX1·€OÎ(ïaºné(¥3ØÙôH<Ä>ûjÞ 1‡œïQ‚Q ´*í9ÕQUïõªÚ×rØYÚ ¦Ê647åßÊÎ^£¥j’Ò¦ƒÛn�sCìË$ úYÎy‰ý`? e´x Ls:ì|¯×š|þnÂ�·!»Ikðc^�ªüذ{oÄ£�;ý%íðý\´Í—ƒAmÜ>2‹üAç‘É:bâØó§ÖøßA¡-D äÞc~ópÔ\|äöÔvèÖaúÉVø!_ê è^í|Çá"qfêý&!íÒÕ›qTj°eÔ”³(€Ùû¼v ¼³Û¼ý³ùìÇÏÐÑÙÌè'FÀèdÛ�s•kPaõz�VÆ/ÔDèõrØÅ0æ ¾‹ÏpÅ›ƒ”ÉÚ2j+Ô—”Æ-xk ™8òÕðÆé�<¨SÆ18Á 4&Zº•³±á è Ò†—”¢œ×ÑÅíP@Jò&{wï ÅúrïAˆ]v6?”4/p¼I=ËÖÚy)â [å�¬æˆ×ؾӟ‡>³¾±HZ«·î2ð‚6Z/!ë«V¼i¸+3f‚Á »PØÊÉÌÿø’²“k^<¦dñ#=MËßë`MæOkµFøƒ—Zeü^ e:‹c®ŽjÅ!ÆïºÆ!s\„‚Ì>ØÄp•D+|Ò+i+¸ÌÑ:’2·³`5%sÓnü&0‘Z,'±¤bJ;¦àøE8"÷êº+ ®0Ý#É�§~ë |ÂUÁÎÏFxê(k\ æ9I¼]QíÐá[r"9®`vm ²ÉìäîÇÒéRíE⵪Œf�wœ*0Ä‘1)kãjjθ›ÊL”9]È7«˜l/Ù”ì~’Î&¨êøó%äÂ.¹É!P{‡Ì2!�êC‘r½vnÚð‡,ÝJ!®ã›üŠ>¬8 ¸mEZáÜ’ØçÕLfÀ Fàpø²�$¼›Ž-¶êaÜï»ú"®l´s›¸Ï²ø ÷9”6Éö D—² Žíµ]KZ‘F ˜w7³ù*´¯„æšÛÃ1ï ·Ø˜…'÷Ñ…^�ôŒ³ ¾ÓFMb�ˆs<0(ec ’¡DoÕɺ@À�m›ª…¢ . [ŒÃ§³«œ¢d'ì¯â÷¬+a¼c<�Hv‘GIU{øøx`†ÃAÇ:@¿\älqy»ü½!¹µiºãèâ( àöpóŠÌ:‹Ó°€Ù+¹�Îk”-6û¡Þ@æ6�¤+ £¢H�I?Žfê�œì4m»»µ·Ç6¡aòצçlå-VŸpÛÁ£ E³.{ÑÖl$€€™ƒš@8) Mã8E�Q­U,/Ðù-2"Ol$šà®jåà¸>2) úø H.¶š{bÛ®•¹Ê®ú~^âbÑÙó£±g©7–x‹§7Q:=|–ÕIªà^ñy0¢«’dóǺÝúàwŸ¥Ù8Q7KºG*†|Ÿ4K�½²,B{DS<Š|†‹WÁµ£ƒXz¤ö±vÕe™¬.cˆ²ÙÊMàˆtðBulχð&XáÄ3EN#b¹²Î�4Š—Ë¨ÝÓ">y†½�cŒž N}§õ–üŽR÷›º-9¡žSJÔhgÌíÎdª¹–zÆ·nsTpyÚù{ôã3„l(‹Îð•·N.k¬ ß�ËÆ• ì´¬@ì`6¨�#îR«ÉkP-¡>ް?"B�7¼H]I6�Ø^mG(¬Úzvuµ® YŒm°Z¼7͇8ò?7é;δrTvœ—cž"�j¾C…è*í1óƒÁ5ðšÔè‰-`ñ5¯D�ÖmE÷•$úí’›^ö*£$«ÆQL8!cBzºI^�²êšPŬIÌ;QYÞP.y²I«­ÄCê½vÏ·ºZÕ€‘4h3{ü“BbŽMúAGy ž3/FâMúš†]|õH¬¨?ĺáÃ{?¡ûÝi5î&žßÐD" C_Åãï~ÐR6Þ㶆¥¤Ò'»X(ê*Ýû(Èöù”nW²§ðM€Ô&xhÖUm~eÏ„›Z)^´^A €Ëk8¶')Ú–ak¨äS˜´;ì±eU5ý߸t_{ß{€å¿Û՛ϳ? ú×ÏKôÞ 1Kòæá†ûa ðäëÁ®U@ K >Ÿ ½ªà‹ð…“LÚ@ÇÍ2&l{‹ J¡»ì…R¬¸¥×æ9ËÑ6Ä-—™³Ð-‚/F¢½¢;aišxw>X eƒŸrp)/ç{&I>¯­FF.¸ø8ˆ$‹  ò�îž9ÅÈÕàAžê³‰¶c kS¯l¡û\¤µ'>Í>{6Êrš´£Oº+ 5]­#™ÖH.4Ç�ʃž:¢; ÕÁ N6{ºŒ=>Ñ‘½�5𛼫í3·Ømê]wœ”NZÔ"ÃîTÒ¶ñòÒý(ˆOñòªÈ°ãâáº‘Ì iaˆµØ?²j;]® rE?*Ø5[ wÓ豂Ø“¡L¢+' üs7-Þg&½¾µú&ët‚6³…\¤�7ÄO62œâj¨SÛCj÷6ù ‚C¼‚R}}ʺcgdàlv½hýœ{x$°„ ²™Õår·€8§åŽÄz&ÄÌcË©²¥ÛnéxƶËÖ”’5¾‘¦åS·�uZ%® ¾sûk�uo$ë�J‚DÆXac`w53m‹b{Å» ˜<[\MžÒÎl“¹®°°D—`ÀÒl‡]Y|~›¹)‹•²ÜÑQkiR£¤·�0L^ à'@ï·í³´É] »·¤-KÆã-O}25¡u�Á>ËÞMˆòL5xbÆW\Ìr6mÓó­&Y·|0PFZ^ý�N™¼/ŽŠ3#ìQŽÀ¹î(òªî膑1Q-¬¯ßÅóOA¤�$d<Éñ˜ñüÌÅ]Éfú™iÔÀß‹nézZÒ’K�¸J–›†Év�˜Oï&\Yõ}1Å´íÀ×W/gs>.¢øHæ«$#/¼”büi¢�œ‚Œ®b7äm&³�HÁŽd©Ø·aâ»­0�˜šê«È®\´8D"Ö|‚bËrG¿ë9M®¤’e$ñ¶PKÒÞ¡�}`½eå…Eͧ 7C}GŇ]˜=° ­ èF\qG$¡}Z½ÌÜ´S;UVÇ+ygCEÈWïžrCA@‰k£èˆ�Í1ý1¶eŽ�rK5½Ò8gF‚$F¡õ-¬h=[jªùÇC£gr¿E½n̽–¥vú`;>ÃàŠ÷tõlßoo¾/y¬¢ {Ôè«ëרŒ“^ýYh$!÷9“öbþí¥TCºÑœ&¬WÇ›è ø%ô¡Yq#oÉ,K³KnÍÝÏPeð¬€o‹µhÝøÚ4;1c>úv®–Ñ1Vã Fssº[D§~ÎÜ—Sis`èT€ãg�!÷ö!X/]ûµš¨r)¦8c‘dM–íØ (€ÐÜž¦Hñâ ¥÷¸iÄÉ \ÝŒ9Ýg˜ 4ð®¸&ü)Z•aÅ-]X;ePo§žªpQÿTd¯«ãês =Jº_jZu¡)Π`v GÒŸ^¾W_�Ïë5ÐU>Dç´ ›kÙ@t‡‡Þ±�¿\^ú¬Œê/à?=DÝ�M6‹F•ºUíú –” Ðmƒü`vHa¼ ]µ{䀎Ô�GQhL†Ý¾^ÖÃR aÍÊáóàrSðB[õqä×¾2µ"‡ùÞA7~A8ök¹å± ·l‚†/¨/jÉ‚P¼R—³l SLM—[ÚÅd°­c{Û‚ìŸèƒëM»ÌØHMˆ·J 8• â ¶B?dþÏ׫ )ë'âØR˜ÛV Ðxgü|z÷­L¼âÊÛ nÐ ¯·™×Á� ì··Á²ý¯®ß¼'Û°aÂC» ÇÙ‹vš‚Î §XL/tẢ ¹eh]ÎÙXìŒS•¼�)îÖ¬TØô»S@äùí]]A}‡¸ ÛôX< øò–L¬yp«£ìèôðà"(�É@¸êÒsæiA+‹®Úø®qÚ9“ÐbäÖ~z±ý‹†‹ (5Ö«Q·ë.þë[f� âÎ9OÁÛV z Õ­>%½_mª<5Ê,ކx(b(¡Í~‹]�>)¶�.f$KÈTúŸ˜fqQ°EÝ©Bç¡Æ^|èH‡vÖ' þŽ-”zOS –ÅÀYìlÉä.>ÏA¡\{é趾ς®dý²§h„Ä7p8Æä¾“Æ®ÿ+\’´A$‰ÂvcÑ9»‹|`ÁN¡ôýÛðíÖk=(kå¯p°—QùA� ªE©êxœ·�˜E›‘|+œmÇÓÕµÖ×4sE™2¹dÀ©ï‘)i.þ8ïÚX�o¨€Z#pèíBçû;qôæÐYïEc8+0(iÛwµh+Mà?‹œÃ¼…"€ºÖ2 }éÖ÷Ëõ¯6 ˜·Íã™OÔ¦÷–s³P6"WfKÃÞµƒ"[:Zl!1ƒ~–_µnææ‹ødpð|{<\ÀIϲ¶³_­„ÌPV5.Å<àÅóˆKØ4¾úA†ÃÄXê˜Õ1¨¾ÇÜòXFĵã:tpàë`ì»c,jÝR–üGc3i¸Ë*YW3Ò�vÞÎë®9�g0)›‚w|epnè™ébÚ|¼²[rJ�‡°è½æ�I…@Êeh?ª 8×Ê„è23¢€Ókà¬% ¾[�%�L‹bØßÍ×>« wmµ–hÏÃíåžE€DºÜ-]öã…È|x’L7|¾ázkÛPÞ:;ž#wÖ¤t � ,â!cúúɸ�ýô$ÏÅ4 Àpz½B´˜ß±{)°€¢þU­½îžT‰p:¹Âņ×9³cíÁ–á<}i‡48ÁlLÈr¯Í=›ÔÍiû÷aYNÂ�̨ƒdéðfèø³‡ÍÔÈsg?uÜ€ÈõŽž‹¯~KÕËähiݽ¼n‚îCÍìh€@7ùgcíñ­ë`ÀU|e`r¦±¡©n4JÑ`ÒÀêÃÁ‹å +ÖEÐþ$÷‚ü3§˜ë%e[ ¼PºébQ\…b3«眡üùÊÛ’c:Þ÷h¾á¤:…ðyŽÞÑá)𬅾ßÊ´cM<ÑdiÑo/�²«²pou¸UZ/'áK:¬K+.3ƒ¾ü-l»Œréš± 0²Ë½$=¡äDÑÒÀxºGØ­×Ãàk€‘‰.ïÅCAÕ†ÌÃJ÷'N.P€Ñ± «¸Ë‡è¨\<T÷MÄ\ž–¨\T—Ú-£ˆ�àî–)`r–Wí¯Ä&�eSoY‚å0žà< ÇÍÃDolå|Ù~‰]�!¯¼^  šP��qâ/Í"—0f)ƒ±hJ•WŒþÒìVØÎ«8ˆ%z¶Ã{~¿lÎ]l¬ãy §[8-ͳôGGø“*w½*9fµaª3΄ø 4?tùú€{¤.þž‡´ÌÀ>FVDZ–õX¹‹•MXlóÎð„C;~‹bà\]æ7a<‚øfYAì·Mtž]T®q«…„&è34é)“[q»LhP?EcÑ©¨#F»–kŸK¨®¶´¥¯ÎYNålGæ€A‚ÀžA·ŽhÔ. hŒÔ/~}y$Må40à½5àò¶ì$ híXÜ7ó½7Ì~6>÷1Ã`ãé Å‘·Û•iŠ¿{S yó­]�ýŒ2ZB›¼ð‘U²Ue²8&뼓>�¤í”®£\�$ C+Æ[µhºçz~?Ÿ¤}§Ãô,úÚ 270ÚdP½ì:h|Ú7ݲÈràÀ÷—ð¶tLç.XM¦Ýq:¶ê SLjƒyGúÍŒ8µðjLo9[V%% =7µŽú׈ŸFÙ@ð[Ù¢ÁÎò'ãNwn²¸ šk|̺ü Ô¤KgX=Êà­Iº?\Á§âj-dƒÌ&PÐnz'ëÈÚõRWÈѯ*–‘Ü=¢4i0îöÕ‘÷"Bö@i¢NÁSâË®:lv|á¡7à‘ØLi=¶pÏuýѼ0üû&§ Á:¦‚S!ÚÏBÞ‰Ö±¶²KÜ™¬]yЯ"î£Óã~åî÷&7`„–˜ÔÞfŠQÙäœ�md2}°ü­”�ÈkO<ŒðÉI¸¡f~'['VK¾nF�Ÿ¸Ý „"ÝŒ1¿S«¬ôÉëÖùBµÀvÜt-”_d«!„·ÐðÍ|ü&—Ÿ±‚Æx_qõgb 0µrá)$·lÎv¾®µV0é㓦ÑõÏTÛì€ò»Ÿ¼33ñr=9s=|zô¿Ú*@1�}uÆØ�Ì@sçPu2‰°`<Ê6Èäwy évpîã=ŽÎ:ñaœî'Ò»Š¡ÆÝÏòF¬5qt-3¸UYy@‰�NœfÆpÑUs¬jíqh{—ÑÜ&ý· dù!›Ý�s7AÈ"tsõü):å0z` 4¬fˆ·ð�ÃïÛœî¤J~C ¹¶å/ûRDÙ>¹û^ÙÉ«!ík¼‹öœum‹ãìªùŠóXÖvci$Þòñ¬3Ó!2XNDâØ®®¿B–�š'vy;Ø nj ÉÔyÏ- |µsœÏ &€½â_O\R4$Mß×¼—(X| #òùÇl¶q¼ÜÙ}6ÞK%]0Q.SD!)lLv {ŒÑ ‚S·òK´>YÉEþ»)RðQ¬qôX,w/’îQ Ã+j†ý£´II÷žI¿·K“úß›ö1wK©g¢N£s®øô€›C‹÷Ó£9‘ŸŠ½Ea$"!¢ÑètØaj4+~EÅ:ÒÉU�($,U@¯ß;ãmx–Ç/Šg#ŽÖæaŸ‰À‘tÀ……Ö•uABÁ¶y­Æ‰íè4u;@F~yˆ� /ÍG–(\<×Cd¹\E€Ã4WñweÞ,aI°cÍžpï¶3U¶©Šä¾Ò v0‰ÞÆŸS,«fVÔCð»}Øp%½�*)qÎ<í?6 2¼K ­÷#}�‘+©ØOkG8}�AqfPM±ÃÂå[z^Û+>ny~<Ûû?z2ó`=1w 2 ¿cÃTJŽеÙÐÅí� â/³>?�ïkð`fÿHi}³hYA�ýóh(OœÁ¸CsUÒ n~8aR§¦Â®Uú’Ü&ngÔ œ±†sQàßêðú7ƒ¦4î�$nmhj.õ m© Dþ:¢çW¡Øó”ÂPä¹¼þ/ƒÌGÄ hXYûTý-«„y¯$“µ>÷ê�I0¼çîÑݳ–µÝ÷tHXMX<™øu!]¹\ž5†¾è>W�‡n¸ùÁ=âéC­ƒ~pú.:!{lt|€AÇ.ÈÐ]õŒ~`ú£ �ûM#€«‘'ìòx"â  Úuó¨…ÂÅ9xÛXõ4Õr6c ³�mxU�UªM2Zá…1g�Ò-<³ÆL¡²Ûr:iÛóu�[‚„ŸóÈè BŽ/hæã ¼Pt@`YäõwÆíÓƒaÒº �Ï©¹ªy-n0<{1ž©!¢íø@ÃGµØ#Ci]“BX½@,+‘U¯‡��ÆêädäRÊÝ]Û9'°‰<|ñ «©’-‹ cƒ(; f&XØÞ7Ÿ³OrŠÑã±X|ïò¡rÎ ”Õæ*�1{ê­kÚÿ™ØI äxVâÉÚÛ„Xi´Ÿ´Iç>lw‹¨YûÚ²µNÙÄxÀ˜Z¥��¯(—ÈÉGfÆeð¤ð(Èúü�­�Öùòc ]}Åé9­mš$zÕvÖ ‚ò�GÌ ‚¦QŽ1ïîß«ŒèœÒ´NÑAJ}y”"G>O$BVÿ™tå.'›:íõ«¼iÖ}‘aLÕde°ïRÄòûÖs—†Qµ¢†�ÆàÓ\H"1 -5lYhõ›–dD 5’‘Ô¹8ƒeÏ Þ´[w}ᎶÀ3½m,‰ÇþâB#ë%Œ!²nÖ�† Q³ÜÎC‰½¥ÃHíG¬ ÔU/vaU `/‹Qüר}ŽöŸF•2&CQFù)ò+Ùâ8éØÜˆBðïu|÷Gº§Èß{`"½r©w•Ž#ÍÈÃiÑ]Ÿ]/±šçI¹­cxù¸?³zÙì…@?Š”#”Øf3©¶®‡¼í¼ø¼tرպa „‚ÿn–[˸i€k!Õì)Ò÷zÍÆ±˜kËŽÆí›Ø“ÛùLi³`ÑëÊ�ÐÝJd.™‡×ѹ öo�94HPÄ)×7PÌÛx¢ÕÏ?׎ŒCBÛÝŽ vj%ñsÃÆ…¼çÅ îâJ'k¼#Ö�„©ÔùI>Çlƒo·3%w{]C:¯îˆGÕ¾dhyiGN`”,åÞÊÌû¬¯Ù�ä"‚«à>ÎŒ,[–{•š7Pœu¶ 1v‹²]Apjx#T% ;]O—šï@t&s!Ót—õ:Q†› íÁ&‘Ì›‰ÙmÝ%ÔE»8Ȥåñyz[éB�Î#W¡‰ÉFp>0VËânlT�‘AQÅ�yγ-;ãYWº�È–{:Ó­Êáb“ AGéuëGV˜ÃŽØk@7™+†pqõ[ÐÈðɶD:…iâ/–,;ãrRuNͳiÑëFL,0n9"ÚK[#¤Ö#šõ½DMæJbsÞ*M¬nÃÇ=øs”eÄÛ}6c ½bW#“«Î�)—|°Þ�KÁžW|¸ƒ `óãë¶µkZ/ûÒËuwÚ¸í,à›t¨Ø·sðɃ …óÄ%®åß “¬œÒjwÄ©Òá'Ö')Á‘ëÐî°j%O(Ó‹še 63¤¹ùaÕ›$Áb¸jŸ‹gPA û�µm;iÍ?aqGÌs0'êi”tͯä¨××k@PøA~i�úÿ�9—CÐãµ+2ë6øË­ß;K| ú$ ¡¢> š=é ÀlQžd„J—&„45îe~bÞVo=íþ µ¬N¸cYâZ«BšáÙH´Íp%ÌÛ´! *Æz0Í»SÁ¡ê"|L-®­!®Åü+Ë(.N¸DŠdÐç ‹†®ó¿Š%\èØ­$å1Õ«¦¾M¢ä>ðn¸¼-Dkσænvz `<¡ŸXå~¾—%.V³‰}“À0Z@FñF„ݶ€ÿ héÙ NÅŒˆ-”P«ãjuKö‘1�J…ªå|/ÉÄÑ´êÿd� Õ`®%z<é &ñ`yû`—´lÊ(ìÀ�v$4tªµ»À©…Ò9åBˆñÎK·n_eˆpó™rÄî9’æAg^k6 �9y:…|ôß:â‘Ó`,ìÈ%ÕÏ=κ/Ö+þÆšSø:hØ[gc VÂӄ߯»ð­À³a�+ÒÊ:A©ðÌTqšG&Œ•×gwò¯'W ‚ª½O�_øðÖµµ®`÷¿nõ½¹éߘ³Û�æÒ†¹W.Øòë™æ‚[‰ù’^€È(jâ‡vŒ»pÌÂ3´€^šèÉÎVßЙ FhØ=í`8]ž°§AYÙZr›L�eMAعhÎPu|$aÂ<$ðð’´¦qãÊÚ`7mE¶\n/²º´^åv5¶E S%…C3ãÐû¸Ð¸s§\ä[m¸¸‘vAe–o¢q}m¼±Jý�Ÿ\:1¶Ä‚è9›U"æíû˜¸ ê׺WoÚILoÜ yW«SEBb·-�OæyÜ0·š°$óÒV€«µøý*Žcyïu �ëužÏÃ\¥N‘ó§Ë»/xàf|Ødsø´=S>ugÏp»EY,°=a[ŸŽ‘@o;}ÇÒ_uGì¦Ñÿy¤=³²‰Ó6ø½ƒnlÁíêw+–Šò#>P-RóÖ8ß™´’/=¾|Hñ ÐãÊkk‘²ü–³¦ç41q@[…„{�]eïåšÊÎxÊ 5*ÖãÜÆÒæ–CÁ“[WNêWî™Ø ëOfí`’rÉX; [ìãÞ0'Y—.æ $õá1yÍ©‚ý³M§k?·\¯H0™�ÞçâÍ¢J�0‰ÌýØïÂYk/º¼Žê`Å{7Dðüjž«„%КùÂ[µ² ý8ùó7�Ûδã Ößd¡ÿ0] ¾ózÛîn‡«ï†(\ëÙL;Xî~i´ YËU¢lJ1j–s—+VðTMmžô…FZƒ³†Àüà{ÍýœìØKˆòº<Ýv(Õ÷æeùûJÖ×Â9n¹ðû½Þƒø3ß«xŒl½ˆËC?UÅXÄ!kñ~Þ!ÅÁô¶´Êl�h^@Y'²¶Ol®ß3YÖö;‚¹¿&ÏP ºÝ—H0‚¹uâk*Yb‰Ë¹eÿ^­I±Ø·>Ã'Ññèÿ&ª%u0*ÝJ¥— Á[ô[àìDP3ácqZs½ô¨L8ðµ¸L¶�!uíò­n°3ŸŸ@œÝy ®£¥} º…Ïk±£¥.C~#E·ß}Çåã< ­?~¿<–žŽû“ fY¦ ¥–G¦Å•ô\Ö?uy›†. �Ovšú½ÆÀ’Ÿ^?*§ÝYÍyÕùšI»gå¶~ö'ÂŒàCð~r€Mðe3ºZÈ¿N6»J ðv£6àEþÃ¹C!Ö("0fK“×CPl–>䣱 òC#®…†A’Ã3iUÁ]Ðtîv¹< ºL¨Í\ —f°‡h1å½xyºó›V�#jѺ֒¸ÝcšQëy‹T¨]áYù”±Äžœ¢Ú¡“=‰ÆXÜéõxË[ˆDéj0Y¬ôô|:2à¦<3`$,†�+GŒR²„6 vO�Ã3^í-…†µÜìåusZüå®Ò\ mЀÚsdSJ/Fä 2Âr!M'uª N�‹s}ÀìÛ5°"œPqô;·3º6m¹Û‰&‡z’?Ö³‚,Ws°W'r­ž bB¬µž]-vÓçPNóŠØIû7PÇ™µ­;ûò?:·˜²*‡½€ã­€‚ð.ù*8s\è¸Î‰µ}¾¯Ð“ÈÈ.x‘£gØùÝ÷qpÚc&xéíÈ –D®Lú;"Þ¥hBûbSwÂ÷ýúÎÜ»s¥ÈÕÆ˜}‡7�½5nÛã�‡g Úk“Éš³c�ÖÒ!ÈÞ’’æi=† ¬K$lsu°á4iZòªÙGØA_s#î;åk™|±¦ò8µ3»Ù¬6‰~CJLXç=g²[¢r}w'"È!MŸŒ¢àYp<.‘û û–Ìas7ž^»SûX2 ¦«‚ÓÜI!ºÞ"·i°Ù$®+YÖ5,%ï*Tê–niKêÀÛë†Äa¯>Ô?0G"²”˜ n¸8I\“W{dŲ;7âèª&¦úÓ]ïZüõ`vï�³�«òÄ1‰˜¤«ªétjå�š¯R@Ë7¥7ü[2ƒ+æød¹LØŠ¹\Ý0œµ“•s*Z )ð›9 i'yP[Ê_­¿eÙÜXpÅ킎$ý•ƒLé�Wfƒ{i„A:ŠeŒ�…•�utÃ៪ ™Œ)DK ­É 9|S›‘Ë’ÂJ;8eH.ò`@0Ö™Bv;Ýo±¹®ýM<-6g½,íK[•þRGÕÉúÈQ M84Òi“>2bNBئô2+` -÷x±YA!ËÛíîûJ“¿o%5I¦1�‰0·ébÖº|¬ö´…� dîCEf=^œ'œËoCsq™¾KJÆU� kÅ€WGŒ…ÂŽ…®â3Ý ¨Z'p͇ˆ�½^ëÕ áo¥¶ÐÊubsáÊþ–š‚ðUåED:UHŒ1žê¹±_w¼V¤áH:oö‰:¬Ùn´!š”jM\tà–!Ë[gÉÅ)uפ#ß^U\›¹=Nkq2–gS,ZàûÃÞhJ\,7rÍâõÁý-;N­Ï!MŸI#,Ã2¸Ýų�³9”mjlÀôP{v*m¨((—e|]n·ñß¼s,50aÍ·Œ$öbtÖöÔ÷‹!�P9«BhªÂEsèë´ îæÜN¢-‹JLKÉÅ’¥j«ŠÐL>03k󜞶kN3HçETK€ (@@¸h· ´˜Þqàö×í 9ÓÐ0àùe+9÷Y¤=…Æx¤¢•­~9½ogž-)Â?Il¶R'‘­nH·ÌÛ!ÂêÝAraÚ×¥¦l5ëò–÷Qã:Ì@$Ñ–T�9ÅïCþÿ :l\±o+E]à>«½ÌÍd„~»|¾Fê ¸vÏËúvö1~~äÞ³Œ-µjð °ÀWhA7ÛÙsÆ| –C€à=zä�Ÿ¾Ý e1Ü—ÜŸ¨þcùÁcd»¯.AFjFv*ÔÛf­€m@æÉwÝÃ[µžsz¦p×Û ­P}¥÷&ïñ sv• SUÃ#2j�¥1¥¾á c_jí½Ñ‚Yý„í4äg�äSòVè ''*Í1T8Ó ÖÀ’Oó›ñ½ru8zËlƒ ðW%Üs¹»×›­x©’ÿ±w›^„ŽøvÂ0? O‰r÷Ššþ˵»Û9@jÔ�ÞÿkŸ½â Õ?¢ 'Úª)î«^¹Â)±«5�’r°F…à¼[×/\æE]ÖG�¸ê†`# ˜»mPèAïtf–#½£@EžÒejc‰ppç½2ÍÁ î ­bˆѪR/"9Ý<3W@•,œK)`ŠÛÊÊ"ép㥻<\&œzfxúì÷ôµ_òy@¦ZÃï1aÊxôŸ7-ò®M†<`ËÇ· ¤tMpµT0•fCéCë…]Æ\ 7mÅÓ}kr¾çî|Ì:Ôr!ÎóÍcúy¿€Æ@A7ÆM4ê"Ë¥£*ë/ÅÆ- õsl.{ó‡Ùõ•ä“iÌGyL!maí­´~½x ×Ù”“¨ƒÀÝg(© c›ª\·ZÖ“Hâ›Fû.9@žàüº\Ý., ƒE¥ˆÍ« 'd] [!Öhˆ<�„^n#¨ýzý<–CÃÍäö�yZ¹fÒµ±„p®Eø—Y²÷6Ѩ\ÓZ\éÎ]/Œm—šœƒg]ÿÍÛ*%ê· °[Q rÊtXŒM�òuOfò ƒÒa� Öà$|…¦– ÕJ@Àµå“¬û/ôïXv¼X ˜mÁQ„ƈ"E—J@jÏx¼î ¯ÚÈÊûSÍ=–¼*º×ÜÂMflô× Õ²Nk5Ýgû/§Ölç1E—PEŽK�6_9’[Û{É-žÂgØ Ù [% „á&�¹pH–ß& ;‹2k‘J€p°­q9LQ’¡=jtV�|ý?êøòÅÛR^ê P?—æi§Eúˆºµgök…×¾çöS£·â$0ZTÝ•èPÊñVƒµF�l¬v+“e›#Sv²]ù`F$…eÆÍ½G®Ý‡0¡}¶õÝn3F?޶–ö­2à»mOß/ê‡+ž÷ª¨É&ÀAžÂwÔž_UR±:7Äî´ ±`«®ÇdÔd°EkŒæîïó�‰!spr¶jDvâ¼®q*Šï�Û‰Fø¹/%r.ZÓ—.š®@°8?Ö6~üd[æ�¹øêË�hü¡;Ù}ÐsÏ�Õyd#¼Ab~ºtž"/ú,m™Yâ_;¬]íboN;YDö½{Y¾�˜¸´É_ öBð8^‹º›ïâÎD 5ä4Îöú±Œ 2ä!ÐÖ­ÊQXà ­:×Ý~¾]~´©c|§ÈWV_ò¹]O+–¾óo˜¡Å„EŒnT–ãÝ7Á¢Ð9Õ#X¡ÙŒ½šÅOÈ7ÝÐ /„™|€‹?Ö¾°‰“9|Ã8Öï¹k 'ëRBSŽë!ˆãÌ [É¿Vu[<�>n0«ŽLšÚéӸׯÏX[X+?u}ó›ÆæÂ E7{7¯îÑurhœÏat3ƒ7µ%ŠoBþ+P´ºZær”0òÜÞ3¯UðL&bâí*ÄøT‹Ýƒƒ.Qú¢ÒBjÈ’2ª¹·!pF9ïàq£‰ôa#+�Á’�(z�Ž+iVùëßž¡Ü15�BúPŽC‚�`™Àµ~PQ�ňké#I¥E‰ú*àœŒ}о{Ê+yÌ!Û66±åzÓM¯~=âíËΆÿ¨nf$ÅÝŠ;WÃ+Ó(Âߪ×4àö�ø"W�… /¨ùÐl½ñ{£(¥XO„^|$Ò'Ö¨·®vm{l0A¿‡¼nÙë±W~fM®ûëŠrøÒ‘càè6lP%ç ‘RßVχœ¹ ”­~$mqA®pºÜÜ`›8œº÷½%W–`ß¼Æ"دX-Ì ÷JF¤}Éˤc,ž—ÌB…°÷ÌdäàCÒ£V$f·H à÷ø‰ai弦§T«ÊTßî.Ñgª!Ë_ˆixe’¤ÆaQ´'÷»oµBžÙ°pnKŸc4“c´u¾_›#mÙé¯-Ö>Ç�gÁrw,ù�;"@&@`6"õcõ“ò |/±~3sÎû³Mö=k«ñ2€æªíÔפ7}\D…ø'ËGK<&·—ŸkìÇÅU lÄ8"ã\4Ÿr§"…§L´‡ *â- 9·Àbp® !ÛØ�­ê.¥OÃ?ŸdÚŸÃêÕß4¥"qñ,§ãxçÏr˜¶ö±Ýr`g^¹�‚ŸYÚ?ÑŠ…!äÙ-~xžb5GgK:%ªuô[XAtÚ‘É¢„Ž�7Ë#Ä«Ø÷É{eÈüa‚ÎÚºÊkˆ¾hN`N@ë ¾vPä[ѬÌ*œ(cöSãü,7µõjK¨†U܃OQ*X€RºBªä7ìu8<Âà‚(+ bA¥Äá1 › íÀÍu<ÖdCO^Lv::ðo �˲±8R=ò©£LÉÆ­ñTs•Z¼và!ÜÊxïáô˜#.7ÑòGciµÐ²loø¦‡°@†Èhm‚Ë� ©^ Ç¢°\• >�.`AU3dV題9|€Âî4[@«aŽ«ã½™¾™¤iî$oŠNBÖ.¹'¦‰l0`¨.‰D&§šÄt=ŠÌµîRtÿÓ¤¿ÄõÝ%ºý·¥ k=~˜A0(|- bàB@’ –\Ì 1¥`Ú{IûSX·ö ,k6ÓÞ�~ÝrÄþtDíñ*õ÷*»cgô9®£ ”áôŸÛ¼ŒáJ¯mE‹�eÐ âÒÝ’\=ÛÇÂGw©| oX r(Ü ,�¿Ž°ÈÁ\ù°÷ÅêDÆ ê»`ì ��9Þ=„o.9–¾»ee]˜5Õ•íÊs‚Ëùíqe^/¬Dn’!ßÂßÍÛ_–ŸÙüæó>M4”c>¼ˆc¢þè�å™RÞ¡OÔ�m�k«Y»SOµ‘îQ¢É|°éϵ]ÇîNñs¿e­{ Z´¿“6î’FT^£}ˆ¾égÕd¦ÞÁÁ>oœ†x=ëyôW— ÐV´è�C¥‹i–ÿç]4³‘_µêàJÇ—øÖÓê�-Ù›"5mY² ®†2Îèv—ÒcSá…äÿeè e¤ºòƒÖw[…�ä ÆDؾ}î·üÌÕv«í|¸(9‘|.›÷zA0oÚ' ÅR§žÖ(c…YN†e;@#r‡4ñÉ�àh(07¯x#Ü n|r|dû¹ÊvMga[J<Ö0Ïv¿Í™Õà�k‘V«„¯ÜâÃo›xÃåf™w–YJÁKwlëvV±väyšù6Ø3"±¢¯îÙ$�Ø­ÉX˲ ½o’+Ö›µr·‚Ê�ÒœÎîè)Z«‚ŸN°ÈÏ+të†Üçs lÄâí;zÁ± Ücdž¤”M󞽋€ Møæõš%**S^–jǰñ¨{Uš1g] 浃ÜuË.ìya $íÈà]k³‰j@±-š7„[_‘ƒ·WF.[wV™˜È‰»wµ›?0s­9åªYZòÆ(á<}‚QésŸ‡&ê×l…ÁÑù8Q‰µ�(ôPB˜43¡kìUhLŒ ;*¯"êÇéªe^Òï—e9µÄÐ8¦%º”²ì" 4F{äÈ=ñë4àA,Èï„цàq¡ó¯~â`ot]»o¬“Àk)–®IÖ8€› & å³}êIÎQznÇDgm=Vo1¸jÖ¹7 _uƒ>²l Vκ $ö:B€a­X%J”_d<)çJšIÀ¸ÂŒ¥}mÑ\sœ‘‚±­¨ÝÑÉixø(å"tž‡®Û×\!Mè¯e’ (*ÖãYˆL˜¡æ²,šÔª”á2î[”VãSòÜv<¬µ%³±%f?ETTv¤¼…!KeÖ)y¸�ð©ãK½‚mÜbÝ÷ įÛý‹¨ FÂq¤)Zbq ¹LÁ®/œ_/°Ù†²ä9s:°9ÅqlŒj@¹:·´§e°›rUÁÔ^êý& ^Ï*¿å%>ä8¬ƒ³]©oç#?Ø‚û¶Ùõ1F°ghÜ2µäå5³l‡$®B×Fë›–E ÍÞ =nzýw¶VŠ>YóUíFÄA÷ˆ;:Õ —X­\×xÃã†ä#,ø[jî Ãá .¡nè�é@Ûa�ô%ôt $õÈK$.ë M¯�óæ‚K‘©Þ>ƒÉ&J诂râ¯*L%ì4˜µkª†ètd†£O(M°7Yø`ôd²·;ׯ&£�êúWÁ }¾k‚µ›S¹e|Ò5Ï�{6öm·Ç+°5ûv½\¢°g/Sœò�‚.¬w.²8Ní‰íĵ@X;vÖö˜+w¢}žà ‘Ð4¬‰…ˆèJÓ’`C¡ý x®V^Þ-íï×ÆÄ €äÆ·úòHE²¥¢ÛtÉ]ŸÕT~¨S½í�!iJ¸]¨þjqozºWóy�^äµô}¾‡Â¯,cHrLæ:ã%”Ýî» È�ˆgMmâs3ƒƒ¼ç•ÅÒ0ˆÏ5¸v{C~ï¼ÊLpàáÏ6,Ö'y9Ãl¾ì_#-CŒÌ›Ýut>dxʯ×Y,ð¢9Š86ĵû¯gaèÙ¬Šâ±ÍbÌA¶Kuâ>�Ñš„aœË+ èWYþ½ÏMn’á¨ÛRß$d[e°Qu*ìæ R®¨Z⸊K VóöS ºLî2‹•çW»ä=²e°ÁPÜÿ4[rg3ÌE ž”6l  …ÌÅ¥™Å?¯•³JŽ’pmS¦gÛJP�œ‘ë~vÁB¯v®"—|¸ƒËâ à ß>Âç,­ÕÙ„—{|]eÕ‚k¤òÆ ð5K¼ß; 6#;Í&ÊÔô  ¢s½ß®˜c¯÷á͵r>ýmC“¨¼ö_–É3ë:׊ØWÐÂye\Ã+t[BZéÄKb·;(ì­Å“‹•‚ÎqdTp¶ ÑÃ�mß5÷Àª`0‹ÔÝgO5q«<>yál�SÀò~?` ¸á·~”ESï¹È`þÍhBW{º�Ô[Q zNEíŽëôš®ŒF3"Íç*üÄ·0$k�?1 ¹Ø"S0;L²¿µR•z[¬öö(¦ä÷Y¬¡ö”˜ ®g¯B}2–“€~ç¢×™0Æ?SQ•YùÞhÆÖްcX³sYž%[”uq¬íòï}�ò˜YZ¬U»yèv€Q’,Üï· pfX�®QM+“�åÿZœcâÑ„z×íðž]â€]3ñä7Zâ®$­�<çx œgÌò˜jsïSL' ?ÜÎ�8–ú§� €Ít+õ«î¤ÃâÍÇçÇìEd@ƒŸaX`\v<=µ óæ†î~jaêÑw˜³Êhf$/'¨öò…/']Ö£os��¶$>³åêðΓ‘q¹˜“u æœÊš@ú©•虀·¿êço `D¾M¼"µ^Ùé,iÂÐ2*ÊV´z€'¦?�Ô³©Üd'í 1Ž¿´ç¢ÙÌ#s±¾.Aå KœÌʸ6¶ ›Æ÷�x<è_D¹K±†åÛ¬ªà»n#öloà�elËÃÊǹg‘f¹š*ÎGO!bqÆ‚µ®ç–òë(î {E0dœ¨ÝX�ÚeF¡JÚVw<ë_ús)Nx]dî¦ñï$­£ÌûvB! „g£Š:”ÝatX¡…¤³‚hb9X˜s+�·¤Kˆl'pîeÐ�ó°ââûÖÓ(VÈû‰æ‹7;Àofƒ|æû †ŸÉ•… Ð(—EMÔþ_;³.pL³5ÀÈå-ës[à±~ ¥müƒ¤ñÑ%ák«°±U„¡ù*Õx]47ûÆ83N¡Þ}½ï(8î€óIo[I ç3[Ù=ׇs/Ù{І#¦ÁÈ!ƒ¦ÊÚ¾6 ¯>ixô/ŽBÆ&;’º¦ˆ^S>O#,)GUÏœW˜IqÙðd•� ÁWC¶Çž~J‚W®´HLÙaªÇƒâÅ¢gÕhêôíH¦lSéîò1‹%ÃJHN´‚àÝû.c'Œƒm÷3™�Ó´&cfÓYD²~ËÐO ³6«îüŽWé¶€‚Ã6HÜÔèm¥,‘ È=(¢ 3wM«+ªÙìÊãõp·�²°t@ʼnMD*pn];}»â½kI–@¥HÓ�†Ôt­oa†�–§ëÀ¥Šm��‡^gj„Oœ�D˜dÛóâÅIz‡¼¯RÛßÚ¥‡|1ô ÀH~ß ×°dÞ.R*´A¤tÌ(3j²˜Kë÷{CiýL´ÁËÐOAœƒx�"L_XU±›‘”N½�ïr”8¿mªøÕFàá{bvë uð*w”³¢ÊôÖ�›‚«Òšý7ç�mÉ+T�\ g Ø“ãÂûlÖò €ï¶½I²„kB«ò7^î\ùÃDØRôv¬!g7ñI­S~åhÌ+�ÆNõ44´®+… û ü"Uá>Æ·“ÝV¤ñmš°6‚S”‡Q0à÷QÉ¥U^öϲ s,î'0€¬�[›¶ìpŠh)l=GT³rh]âÇ—âݸñOCÆag, &õ·<Íõ�A^!Œì‰hj#µs�RçUªWa³ý�u×5>ð\ÚÚ%¸2œ¹¤=ªÔ·T¡P†KwoEã7c×q+ß­§")ßоûJD�6o£[·(�-9ÛÀ>m±»}À¹µ3¶€ì•êæÂ·Gé� ßËöÛ‹%òòÿNókìÛ„6«àFÈÃ�°û) #¯lÅj2:p@ÊY5óBð»#­ú‚Âöìµc‡\Ül²Ç/­ŠKwNa¾®ã�º0`ÛD6Cƒ‰ãùAô"Äá-j¤Š×¤”½ Pµ?7c1«\O9UL @ú�™’r] ([:eç21e×ê?Ùkƒbïd’ lªÛèñˆ‚€�ÈÌ/”ý¼.+K[ÚÀ”G–‘hr?}4ʈþÞ5TœŽ}�·�°)›zÔëL¢/þ|pœÜùj¶Ž:g0¸½ô“BzWºSLnÁž¯ ^;`ÞHI+1´ÀdëX]ÖU8[κ¥æ¢!h ^È´M’ý†>\O"öˆÕ”ì¾ã§=øp–~>4€aµáI.6 ¢§ëÔû‚;Ô6'—ì ˜¹‚ýs×Iˆs|Ê\¦ßQäÀÅwti]0c-|^n»ò„ß3B Êúx¸^k½‡ÎÕ¯oË0ŽCÐHîªS¼°Xã ü<á›ÝBòkhœ¶²æŠN—´Ê…ô pªÛìp‰a¾%‡D½¿rutÄ(ž|/:î8:jhQcéƒ ÅWáòfú�J¾… ï˜|g +V*ߢ–žU0Uñã??£‚Ì]üõÍj*¢2¶ý¾ê�(PƒÑv5\�ªå“�;ã�tY%dëòß,õl‚òÃf(Pþ-âÍ[&ìÎT.ÙÐëCû”¾n?,ù£L´¥avš/|á­"½±*bb²©¤^—­Ûj +A�lTtÄ»5¡ ‘Àë%ïS»)e<­píWk¸@˜æ—ö>‘ϼz¯ª'åŒqD–>$u±–δZTîEç3$¾*ñ¡ÁåAð¬Ôæqß«•˜ÕgÀ¹�u¤J¯O„ ̳RBE©Ñª@ +¬c3â$áHAW0“³(}Ì^ÂÓl�G{“-÷3Z¶]D]'©ÿ0Ü4ˆ \ã÷qࢭ�×Ûsw3œ»ðFNZF'è[ôÓp†ßtËAƒM8âõÆtXª›b™�GNÂâb%ZqoXM‘!°ÆÖ26’.DÍ¥¨°l®D*¤l(¾R3»bU$¤2`¤}ŸcÚÛÄÎHjOB‰b…î°!VÚN /—hÓµH»ö§/œYÛö‡ÜÂð¡6Úß;ÌÜàoɽ™Õ¨Ap/Ø…ݦ*×./íÙ[‡<­Âž2z¹&“Q$Þ!—@_`÷|»[ÝÞn¤²D6€ÄVÆöÃjá|»WLÉWsƒähÄŸù!D«¦B}îÞͽ!Û(Œ¹Ý—jow wâŽÐ¢éøEœ€Óœ o42ùI¸á0ü4ºp”ëÚNë‹�<œ¡i”0vLçP Z1`6�Ö€L£cÈyž;Ídˆ_�¾0ßC…÷"ú¼$JUù² ¥ÄÆ ¾ß_8Ú@UtìÔ÷Adé9À ¸›ŠQù‚øÃ¾"^~“ÙspE®¨g)cÀßo·wJ÷‘ác4W¢^ÀAœ ë”¶Ba¬*�R±o³Üpy5\‰Æ4{�æ 5šÍšè öæsP s¡)!NŒÐƒ�î‡`§+ ˆ‘å¾êýÛÐÞ2íÌ�¹ ›#ð6Îá锋ƴtÍy…ë?vÀ®¶MÇ•Þy>%Bý±4Úa9kHñi U�@-Dé¿_©¶°ùüx¾�ùÅɸCѲY1¶ÝNéì,rb„Š”>åîÆ°š¼Ú»¢®Ÿ³…ü8?]R©[ƒ™³šÁjy*øÇåJ�‘Ý9n ý ³£ëÁþüæà™�Ĭ¤–vÕ®�åÙí;…�áex…¤+i_9~«BS¨˜d­Ÿ 9` ™šÙÏq‹=Œ'yVض߂š-]Ê�1sÛa3T�+n ¹>Ø4ÙáAfû¬%Ú$(å"ÓÄa>ÜõÒ ³* !d06ZMÎØ"âä=¹c’x F®jO•VX3Cédù�e޼`µbV”ÕŽß¹¾ýËã)aÞ^càžç/¢ƒÛ°9ßÔà–O9lVñ\_g{¾Þ~·({Mãw�$ëlÑ�#)ÍâÞ%Öô�·˜CH׳(Ñ×Ñ=àײ`¼Ԭo0ƒ}¶%�¬Ov¶K¸3‹S’ãäÎoju3ß{lÌpYâB Ö(ï6¶Û*/ÌÞ‚LìÁyO¯uÞ�Ÿ¦gl kƒüâ4‰s˜^°cˆ\G°Osp®Î+¨"æ‡ÝÁ��²ËpÕÍK2yBEÚHúL ð†%°âá*±F&…1¢ªv\Tž5øX¬°pç|ïw´ð耯‡qÉïjºŽM½ŒâüìïÕ$©Dpñ‘š ög1ŽÍ_Z?xP)EµwI rÛM�Bc2ôÆ×`‹˜Ø¢ìý}i:(š×<ă˜Çy®5!nÅ´²„‡­}‡OyeÅÿ1®Ñš&Û¾mŸ^&ÛpÖ8Z¼S²ºë|AŒqkÒà~‰ÀõUÝØÁ_§½ßSi{·l«ù«ñwÇÆ�á¢~áã¬ùõÊ‚Û߯¶’¾C–EVlÇvýØD>Ì-ÖéÇæ’„öOe½cõ±R#5z>«4#mÞæ€Á»å+®c¸pÔõØÂ\ÇŒ;„×ìU¤¡“xë‚t¤·�‚š„åg7ÆÀE˱v§�’E•�qápåãµú—Ãóq'k‘æ'‹©J�/ÒX½Ë×.Š i6Œ& ¤LSQÛ[`²SÊî7i܂ٕe`´ÑS˜IÁ³«bþ'̵Ý‚£Úí�^ö¼£Žsr(’Y»dÇåÎùo”==ðl ÀR·ý"�„Ɔ†Ý=ë+dÞG¥ùö]¸^Qâü¥;,P=ì½w¦¸Ú¾üqFàµÇwÖötµ±�D¡ZÔ�¤àY³Ñh^þ¼{NŠý,XÖÚè|g‡ üÙB | ”ûûyl�yÀÈ«ÎÃØjKX¢v¤£ÐVi\å/šâ¿Ÿ(¸¯[pAHò·VY–L9Íq2¸è�Ey›xÞN‰½KÐ-Î{ŒT–»°•Jë!íß�Ô›ãnõòÃÒ�òê%—jßåêÎ_`éÎ÷-MÙF¾É6ªK@`—[¶îAÝ\)2ìn4QcG¹ {™_ ìîNP;„é~öƒ«L•Ø»ë6>�p‰‹k­Œ�TVnZ½óW{þ‹–ïÉËêÌù‰ŠXJ$Gæ�γ»-ˆÔ!ÒŠÌ%±òÁH«¤÷Ûµj©BCÅð@>Äw™Þ¶-PàR±š"à�-Y>Ý�J}ÐsìÑɪgrÎ4¬µÌ# "�Fsp¯µé¢¢Ð kóHñ¥ö=HüÀ!´’A^-'r ¶ô�€%T áSÂÃ…³­xÈ:Ïál�ã¾ õ«A<Âk—n1„‡“¤Ã»ƒHŒéëÜkG¯Ä¹‡C�I,“½_Ë`W�@,ëo^Iá†�‘ØäU cМ¥wyÌù*_ò£Ö·èJpÉáßëPYGYÖáíƒØAñMÄ»÷ºª“ %<ÜüXžÏo Þ?b!väáÐÈuj ÈÙt:$¶þÒößÞ‰‘—_F˜uçuŽêcyƒ8-÷HÆ“Y¬¨)èMª?·öOŽXþÕî âMÇ\ɽS6ÑÁ€A“œôY^pg­l°Ïš��ùŽ\¥IxÜʸm&[c˜Î ê÷ËÝvoŸ0xI×Z1Ùv<äyôóÏÛ6÷»"߉ŽEûÅŸ t}ÞÂx'sÔø7ò”Ì=•Wk+é¼Ô}áâtxÛÑÂROÎÓ*D-¿õ˜8Á ÷XP NÊí÷>ý¬ÌIbašÇXVÏ'<ÔÐ£î´ `5 Þw½æØGkÙtÒqò­õ±ÒÔßR´¶’¨½J=hêìQ’²ì£x«H¦óX+K;ÃÛLˆãƒ™Hª™ÓnvŒ»UØ%Ù¼E½ÚÙ;qÙ§Ë�¨b#ºúÛŠ—[åTH® UéÚ”Bc%�(å¨ÁRnëŽ&s¬`�”GœGÔÞ¬H("únoQáb©é­¶N‚VÉXÚmÅþ‰u²·N�Û”ÅÀÁTiÓßiÆÐHÍã BÚLïcC»l;»Ä ük© vå¬.5¦ßxÖËŒ8�DžDvŽ�±¨ÞŸ2¡u¦Ô¥ ZÇA·­õ´¸œÁ/íKr—M¼¨|J!ÇKýh^c5vºnAã±÷wÝÃl$M�¡ÔØø>uøë8øLý¨Lo2’[UZ[;*~®·»u‚÷úùåªê0Z6Tw½�Æ—o&ïÎucpí5„8Ô-­öîø\YØï’kÝ�é9�1q:E l³‚Nd qsj¬|xt5ÛRC Ú’ƒ9¾›v ‚, ðÑ�^Ç£V T4Â`w…ˆ�F©ênU½Ü¬s�V«Õôk„:Æ�ͺÍ;'—!á\)Ô{Ü"é‡ Ph°büp7LçyÉÁwÆj�6~´ï8ß_EÃÛˆà¹D!¢ÇÜ\oâ ƒoWArÀÁ�Q%­žíuá&^ñÃtz„;2¤XÉ–úšb“ÒØ Çó•«äÁ¾õIe[¼Â Û aÓÚíc8U6×&õ™¥b�R€ïï*dñ¶*®™…FA ª[åaËÆ£úÌó 8•¨œÖÙb{ù..ÝŠmçöò„´ÙµÁÍ6¡nN�ŽNÁ0©Ìà7”…›åªnpåiøò÷5Ýõ¯¢v#ç­Ã²íCF‡°æÞ›q°´ +±0Ê �¤ÛûˆÞ¯´C‹ÅÅì442‘vvàcŽ9ÙVP~¿ÃËéÐ^i6ÐVmË¥í&5 ªöcVƒ¢!„ lS#Ÿ™Oõš{§O‹8üøCÐÔ:‚Ü^Ý�ãÞpˆ’¦ëºö ý4Ù«sí2$BäPîápˆ«Ql3nlCüÛD³Èiq[$öΆø)I •ý¨•âÐ�ŽºLö›$vÅhG&}P¸ué4>�üú;zY}³À‰Ó5ѶAÉdÅÀÜyÏ òºì¶ÎªÐ€u¼wQ¨æ•%�ú)B¦þzW×¼7ˆ»•÷.c–Û ÅãÆ¹„q“fp6Ô%] ÊÅ6SW(² ¢ÏRÄ–¶ÿ–Gºeœ®Ë¡œiÞçö 9‹ñù™aæåøèerW²�KÓæcTdÏiØ*ZØWKßñVl<:«°�ÌýyÒe;¢ˆK¹§·>e�rêÖ8šæÉpøn>>ß7ì­Ë çZ }Iá°Óå;WšäÂì–­W�ã+Îx��Bd ÞèúòÕvGAñ»ã)ä&CS`�!oŠ1œæáuâkGî ¼6iØÙM-î�#‡!¾¿”�ñ‰½h·†ÕÞ%ËIjÒ‹õ…1ì¶´�«˜ w �)Ñ]9ª@U½kþfäèZ;H÷çÓAòZüž~¢IpûWÅìv�¥"o¾Ž¸hñg%Ïb{ø_Ôá v€úû‡ n„ŒFo3.¤ß:PTÒ7Íçݾµ$OêM¬>VbüÍVzþ»ôêÔOTn?ZÖ�rÎÌÆ%Eàä†3±Ýû¾ž)¤Z'µ»ÿ£y»÷{WvêÐG5 +:ÁZv™ýë³ìn&͘0.:éAì:ö) .U*zÂx”ÈVñ‹ÿ®gWe�×L:+à™“·.FÑir=õa|°xÀ?LqŽRIáë\´},® Ó¨ N ;P){& ž«ÚæBÂéwq=àò¦ÿ›Eïæï¬D —ÁvÓ‚Ê÷fæ‘~³ë‹"Ûý "ö.¹ûø=Ž,mBqæ8¹?}öJ�Q•iA�ÃOel—'ö:!—‰Ðuµa-ÚqjY.ïíµÕ¦cï›ÌúZ5su-h�¸©!2‡£ &rvÄÌÊhÁ¿+ml8Z#U™k]²Ê& u¼�ÎÒÚJHmÎ2‚,Ö¿ZL>¸Ž ޢɰJÖ¤C9\‰ÓŒÒõB·ZÖè.n20u”d“Ä.ôB'$•¯˜2ã�¤ÈC\`CKt&‹¼ËÒ*Ãù¸¼âë„[§y S”�XQÈÐÀ;6pPMÞý£´vü±Ž,ð8¤µ„^P•+ÝeåkÊæ]bÁvö0¹i‹‡LN6ö,ŒF@ˆSÑAeYÓ Òa�–üˆ÷ 7†öˆûG!;,ë�ûyÌ] ºLóáM†½»Ž3gR« �+E\¼åÙxA¼z5G™Óã iåë`Ü€ÓS½rùäÒ}(¶3Õûº�†-M[9gx²c„üø °“X?`} qÜ©;ÞU.1ó{³·T{Ôì0²k˜¶ê~ò+ñB Eà]åY2äø0¨­‚¾•wP 1wÀbÀž{bèôUÛV-ŸÈ3ÛssÀã$WSCär4ŒR œ÷¢D<_ß=m³Íˆ]ÞÖ\)Jå×áÚ˜Ê�ë\^c ­¢÷˜l¹;kFü¶¤œbíš9HÀjÒ£вás ƒRÛÈ8�*ü÷iá£À>×€�G#ÛÇqÔ¸¸„i4-{ï=â#¬ ÚÖõïܸ„]p 1Ö”úüá'´\L¦V’Ø ¡RýhãËuíôÖgÙôÝ›{Áëõéíõì…σ0$Ò¡™DûNnX¡ ´ºAPʆ˜¶TdÕbŽ;Þÿ sl_E¤«èê�î³Q3&d²&Ü·%lˆâa³æ� yÖéLBå”;¦!¯ ;v»‹bÞ±50ºþÝ81§8B1TXw`�Ó=îθ$F@ˆ­0F hŒ8ú¶Ú˜Vqô›SÎòÜÊ™àyÆ&À‘Ú)Åm¡á~Nd( ¿j#’Ò=ºéɯØ[¶\ðú¶07=}·@¶ï¼Ð<8„¬0­ŒÙ ­  B\™%ÏiùÎñ$"'ñH\8ÜpßÈ%¯”3( IJ äÙõug磷#ãNžtªl åñ¶Ž˜p¤çÜÑíõ|ê€ÉŸàÂ̇ܗl6Jq­^ÛÉG®JDÆiι»Þ€LäÎNzâ!näTTrœ»øŽm¥¸ ÐõžZݰSampá‡.¯7Áâg�µØ}Nš\œ’_”!(‰ƒÖàŽ+œ²¶ìÉI|"Lϼºö·Uý•0G¡¼Î‘Hò iwDz®õź±/#hX¤¯1⳪)!¤&å:s°÷u7IÅ€yëïg«ð¿ñä`«ÖÅ’ß{a±ƒýv"îbgغ+-aq¤{YΈ:¯ö«õÐíÝqJAȈÜ%Éïy~¯q�Ä!àbn‘’E—‰Å’íËíd=‰AƒxOÅö%à1w%I[ŒÞF²GK¿{ßjThZßä'÷t;Þ˜¿;oAòz‹uiJPíF ¤MJ{ÂÊYÄ¢ÆüÏ;Ý8‚޶§�4£“ËÖþ%¾Ù�SWÀ!�B§¿Òºö;˜µw,‚~!à¤K ùù¡õ‰Ê³õÄip£bžºã@to–-C}¶Œh¹Ü½Æ59ÑŽŒ±:ÝÈÜxÜ5"y Óü"I1}Öõ™ß#·—/mä.»Ak8šDïD¸kœ–¿O¥�“'ŒÑK/‚q÷«¹SÙX勊*};Oä/ÊÇOçÔ‰únŹûëòc‘þ>^2^ÕøÛ0!1—æÊðÞŽ¤Êpó¯¾ †ø÷ÏLEH;,7czÉ0sDñb,ä‚Íì3?uõÓwú>ÕÖk±Æìý�S…Æÿ$BÖÑÐÎ_P‡›;SW]\÷!Î÷°gmššR+`#80ÃÛ¦ÓÁ*ëdó‰bÑÀ EÇ2ZØ?o"<Ÿ#LU‡––Œ#0•þÎzͽñ¥> hÌNò#r¸·ÁÁ¬Êž�™À÷Í8ùÒN:Óæß�HÕû²ó]€ü’žz{Î)FáõäÝí´è…„©™–¤2?‹¿)¸nVMÐá³óaþÔbüSÄ`dm)Ì%3ÌÊvô€›ñeÝWíÁ¯­ìn޽˜êINàýœd•A×µÆ&±‡re³Ð”.�®ƒ¶¸p këaëÃ0ÚV¬jíHß ªÓÐÆJÖ«\kÍti5/#þâϽiŽÞv[)ĵø ðÒXŠºú[É%þÒE}žÛ–âìweD±�Å· ¼¦Úžñ»‚ÓÍÈ3ÍmÓ=NÃû®,ÁœcOºÖòr�Q�eÚJé.‚�}šïûé·@”Zé8Â1&ãö«c<£®íİ%ó˜�HƒçRËl ôUˆ �ܱõPã}Dϯ;Ü¿{pˆÆÉŸ# ¹Qî1hnìé/ý;]°`»|&-H¶K,­@®ZÑ,$dsS?}Ì'ñfw°L;éA>œè÷§XÖÊ<»yež½ë“rvwÕÛû6^0yÒÐqŒ�pnÍ ‹RñðõI™ç†­Z°Èò¶µ-5‘!•ÿ0ò4ÔSÎ6EÜ£Ô~ÊÙý´0»ß>î´ò‹™“–jXã@뼫¸�ökØn�6HÈ%q½§?[!}69ÃJÂåû‘Ð¥Š¶©yÂÜ-Ê@g›¼÷œ4 t 33i†½Ç"ÏÅ’Ee7Á¸à1t°ÁZ ~Ƽ˜�]þW¤×^>«…¥:ÝFÊ•£2qSåÈ·$5P&DÁ߉ښ›·qùµuÁÂ% Ö‚WÜ£µ�T<©7 î+¿<ð=çFïÅx¼ak”³v¸û*}[ßU‹q/¬mí¶Ð奨V‹™[õi׆V7­î×Ê-P[He;«!Mßé¶±ÞÎÖK.D7ÅE¾ÅÔ‡ªœ½©ÁÁc8N½‘0›ÎÞëñ%(:0æÔ‚ñ ö|~�…v‹;·±Ð«ëÖ8aX|b3“g¯£Sb›�šDR"H ù˜f£|ľ¥ÉÍöA"ÜÚ^ØrÌF.¼v(,Ék²ˆñµ÷Ìzs!Úî_zDò–Pskn‹ÔAÔݵ¿“Z—e‘R¾L„¦ñÊ’hIÅ[˜Ð_{¹"Üwh7ósz"6— Î 3Ó0…oª÷ 3·ŸÉ¦ðxˆÊ…ƒ%äq:†ƒH:N`HùÄÀ%dv´ß}QEZn£mìÓ #@Åp8xìenÀÿ¯{Ñ�> †ß |Ô -Ä|·x–ç»e<w{·X¯ÐȸyñÝ78ÛŠÇÈø¬nÂg1Íü©6q-gS0ü oEøÑW²�J�: ߵ̤~¿Ù·�ˆ«1#»ô¨ï>ŠùþÆ3Œ5¼^p7v ËF¿m âûÕ/,7ÜBÈÌ!XΞÈDÕgÛ†È4X›ªF~ZúÕè…¾–'yP m|�¼†•º¸ÁôÑâM†÷'PÚ�zr`‘¡Ud=$/�=oÅnèMé>ßÂ7Xl_QmÂïn]£Ú:=RÀò¥¼3jd|‰ˆ·E1ÅÆMÐä%ÎÄø7\]}Øí¹I+S˜/CX­KGl£ =«0 Zö±ŒV•ëL(2¬Æ  �Ÿ@Py­WÞ{Ÿœ-_š>׬åî+þ³ �–£ XÅEOß½+lkím~­ßY•-œëÕ$Ì‹¡{l#€¿_Ò.×÷·VñÜ�C²=åsFÏßLyraz³ÑC#êo.İ{šÃë<úbôì$<žÊ¤>¸õê  ºÙOí:è1¦Ò b¨ðþßµ›ƒCÙö6¬smÐ>2=øâu¼—C¼OªØìðiF¯p•ÎÖ/÷ƒ«¤Ã¯,œœÂJ'�ÜÚ +÷hÔJ°"ÉÃËëO%[?;j'< W'a«*\éÒqÜÙÀ»E^/YËå|ÜŸ_cZíM¾Ð ~D♆G�y€ú‘zÆÏ÷ KMÂvö>yÑßqã¤�Gœ®Äüñ˜uÉáü¼�¾þç%¾wz,O7n6šc(Ëï>Þ‰5Öç­çN�pØ”¹³ ±,uRú®5ûÒ&b öø®w¼EÐS”f©[5Ñ èW]ævd¬Ùؾ@ü ⊭ÀÁz÷¯U_N·ÆÔ®Zò0©æþxˆ,=š¼q¡s#Æß®A¼ÚDjÉÓÃÏ……ë_ÅeY°=ÏÆ¶®©—€îßÑdcïrFÜO�fgÖ7í·–±ßl½€y¸w·÷F¹«ÊÉßzƒ@(rzE®>™ÙÞ›Wî5¿\?§�W×T;ñÈÚˆ*#zþÔÉ‘¨Ë˜VÓÅñkõˆÉÔº7ˆþÖdiôØ–ÅpDôŸk8±±ýŠì>>Áöϼ�÷ùü�#5"P×ô|""¢ æ¾VÜ4u…t `†#$ïdüP1K††à@F’cÚ}z*_óÆþÒ­ýYŠ{üÙmŸôöÜdëo¼õå ¢ýý_°ìï»~ª3éý0-kÈÿIo„‹nñ;åý—v‘ßÖau’üƒ¬Õ!á`¿È�ô¯\·¬Cc—ï•Y©äºôÕ1] Q+økX%:®`ÐÊɲ�á…êä¼ÌçsX½VÉÅ¿§1S£˜JÓŽóEø©œ{�«=L6¸_GO"ƧN9fÄG5Gƒ*È�Õ_ ðæ lKú2FxÁ R=ß�¯ºÜì‘Çj¬uPq–ý8ï+˜ÕÎz‡.͑ϬI? øùg¹Å­[D;zL=±€éÖÉ�ÖÍY¯ÿ­ͧÕPC M?Øë?æåÔ"©@mÖóçϵ�¾ú~¶×¡Ì¢eõÏ«ÜÜ×’c×$ëÝNž·m+lƒ”ÏÒƒ±ÿŽø`‚³Ëö ‚s߇tn5†Wê� uµ±wð*=†_ðNá#…!™rÆõ¹Ð‰4@Á¼ÇÉþFüă3|cc…ΗbsbË�¤jP¶`Yek5OuTùšÉ,d�65¿âRÊ_Ñ‘Ï�µ×šB�3 €pÊ 'Êž©Ô ÷ÅYMù“NvÈ3áµÖoàñ…Ÿ^%å{ëå6ð‚·6í�ë@k¾_s-Çø»M&¸bJßl8Èu <5&g�ÁHV£/�\•<¿ÜÝÌE±++Ƶ#Énƒ×ø’ü�›Ö|»üêù@åªþÿt±×U ‹Ì…Ø@ °7×{SÅ!°RÇŽ˜z~�³P…`vB¶ Šò$ÈHr`¤ ´%ìç ´@& ô+ÀàŠ;xÈ8,é«{ËÆÈW*ÒÄhÊ•½ Ñtã?!2~]4zö•Õ¤Ö¬¾Ó±åqO:Ò}ÆmŒ/ø¢ DDä€"ˆ" Ç­ç•êâ×ú¿Â¯QçßÛ÷íícüîöÊèÝÞÒVküôømF¿ ˆÆÝ2�­0±hi±€Ô:EP6Õ*Àœ2!Ì™ÐÓƒY�h”Øï—žê³ëá÷ÙÂ²èØ’=�¢ËñjiXÜÚz l�oík2ƒ ÕEo:ÁL/êÓ-ïóóðÎ/´ÿ0‡tá™Þ¶!ÇqvÔN>Œ›Xæs¸áløÄš¡�©k-ü™¤Æû¢lÿÙ€“'¹úîI�·÷¹ÅÖµeö&ØÉò¿Š�¢¤Ù©­àp9Wµëº£ùÏ(¿ñ?*Ýp|øqªÈmµÅ2Av_Z�ò|Kh`pr†pI[¦ö‡}P%¤Y‘Íu¤Ë¥ì#FÓ­‡îϲó~l6ywPK}rŒ&p^ìŠ}õã­ôÉQ¼¤¶¶2Z@U¼E’XÄÌÿmÅ"�:©À7S€—×£–ÖØ®ÜÌ&Ý?‡½Š"” {£–JòÈ .Uÿ4ñe²ª?R�š:ýQ",+Ú˜ Ñ{ã%ª”Z°*%­é÷1ò�_n¹-PJRÑœç1ŒƒXqêhD‚• : 8ÑAŠ%ø(÷Æ©7ÖS|òõ#…ã6ÈÒ¢\jSÅ•(ÊJéü±;m›G»³ á¹ù ´pž½Á Ç—Mgê¿>ÀMøß®æê$˜ß›òwTÿ‘·×1Ć‘•¾wöÙ¯X#§ ¤^ÖÀ\+ïÓpFDŸa.c×:Ãæ5›’›Ü�JÿD;ë†[@Yä­ýñù:¿b�™ç9CJþh:h9Î<ËRâLäÔr¨­âQHJ‰¡/óšÏRkšç²L’‰R†5>dȶ„~>ÿ¯{O¢(¨?cRy#ý÷d료U7Œ½GTRç)Ûd_¬{~-%Å#Ž9W œùÅ•³è®‰– ÷3)šª¸k¯Ýï?w gr ÜaÄT4êy]nµ˜øZjG¶5øa±Zc<¸Y�á›;ži¡ú²vË à8¶Ïo‚wëêI½Ëp+ŽéÎf8¼É S…gòïyÞ*F‹v1ûÌw@ãŸ+Ĭñ{T5ŒêûêÌÒ‹ÕRóe=¤¯ŽßÔz6±«¯ü˜~¢z-„ «N2~)vå~—Â*û#) ƒi� ßÄ_åpö_z±­".ã£nJ€xúWàФÊZ|b¦l¶¥MÅÊ[sN&Cy¬­“ ¼5¿tvÓ�th4Ï€¸0H�¿œ³á@YæÝÂ.i¥Ë¾°Î´§ý÷²ßÝýº¢˜M Di­;èâ¹ÇÒH­î�jmÝŸ‚¸ß$ö˜f™ütFe`rI%þ_7�‘èɰÞïz]ºZ§} ·ÅQH.¢”¡(øl¨6Mnê“ ¢1ýSÑu„›kÿVàÕôPEF,¹™çñ1›=æŽ~°�ËÔíUG]1cMŸ#�‘ÏïðÀ·`×$ñ&îNÇ#ý9!ž9>ž¼† ÿ!]ÙQ½Œ7ôZ߯žü]S8¥ÆQ”f�ª¾5`ÏyvG†’mg\µÔ�@³µQåf4×¥¡dŒŒÿ?ˆ ‰‘¢-M²;¹FX%m5šJºÀ+w´¾uM}�°¨õ83yѺ®›€kŽÓï¿#×ë[ÛÆ? £“ Ð9ƹ‚XÀvr¶$Í‚T5PI&ööYeAÿ�Dm(¤TB±µ¤Ñí®>³`HòÞî&UQb°§–÷'ß×_E+ßÏÄ·îÅ`.¶�*ª£�Âþ•ñ­e¼z\èÕÍÑþ k®gªHi!€\‡ù°i0Ë,1â‹19’uØ*A,Ÿ�gFÖ‘"Ã}ñîódÖ¤ n¨ò¹4)›a%õPki£‹S»†oŠöÈ(aëß_Ç]ï�@+Ñ÷"ß&ˆ§zSï)AšŸ_¥LOÄ Ù+àÅâôé~' <=ÁÌÅ)K¼m›*-þj¯½æŽWGÓ{¹aÚ'Î9—x'…3¸Ünö!Æ€ì£/¹Í©‚1ïÖÅ1^Y´ñ½Æù1ÌîöåR³@4-q¤ÛÁøáêííê‡rš3.âw?vQwYØj·¢&#Ƥ¿Š…ië>Fme À¯ÈÖ|%>²¶ö.ú˜5 wÌ[®îÚ…½Î40‚JêA S½­A 9òµT¨'dI˜]½yÏÑ×°Ä=Ác;î¯F›CǾÁúÔ´©ÿhݛܛ.ñŽõ‰W1b:¾ÓÜX$7‰4œ6L .PuŠ”,UÁXßì1ÐŽåÛ ],v[¨$OÑš¹% �ñ÷a—¨ ¬œíȇõ*rŸÝ•/¸°˜A]‰¯ÎÆ�/zÁ?õV—½ekùÕ‘ G«Ÿ<9¾ç(€\£–;š <ª¥.y÷�ª°h'n½û›m��aVNC§J5™ÀXpdõb¸³¿I74{ÄG¸@Ô f¶¿ý®Œß´F‰‹Ò#}|Ó•6MoR_Õà$§ì¦1¡30‚ïxp–úëab\b¥M”Æœ'¸c��•ë^Õsœ†\Þ‚Ï«K†û…jn‘”ï6R½3å.ÜBaÕ~CO°´^}ÉÞåªcó‰†Véc[ù“T!£1¨9Åh-'°"ð‰wñ®+B�NO&àk߯°+¸²¼‚üѽK¶hg�]j:ðYÄ0*o1©�laBî˯䜙+å ÐRšb¾Ù¨„Ï©µ“‰s&ÇþØ‚–+ð”"Ÿ…i«'b©~‚³ÉxtBÈO¯yÅ'^‡+ ´ +Å¢’z­¤©œ ¤Xîó&”ˆº·2I9”š ºûº^- ÎÝ¢ª‡•¥ØS‚z™Îƒ˜7¸£]>¿Þcxr»JÌÇz]ßÌ,€Ò�¤gÍ®ƒÖ2¾,²ˆÉ’í¯ßØúJü[çÙ#9?i_•�¨Z³D·×·cöž Å §?R\Z}ÕPhULî¡©ý$°þªtΕf¡íùö+³b-¼Y-.T6!t:,£ý`󩜣²B‡…‡NmzUc!y$A §MOZæ(fJ­:�™£/Ya¤®¹z1QeŠÂ#Zã× 8­SFcaBoå5gE�~¡—˜§tùe+Ç©KTv:w×ö½z½C»X®¿:È�š–ú¥7gtlRÆâã0íL0NoÖ}€û¼ÍSA Œ è,à_îT=Z°V”–ÐNß¡òžÅQ¯ÄR U¶mo3“e½Í8G 'O‡�ï5!¤s¹ûsZ‰5[Ù2ãž*6Rnþµ¨ïpD€ò&º‡Lbq$µ°¬·_÷3ż£”ƒ‡è5{âØš)‘ãRo¾Æ-Ï*Op[OQàu6�šå8†‹‚”¹’GšÐ0ôs{”ŠÐ(ú‡uº¥ŠÃ\8ŠäIj‚¿lF�‚¦4%¬ó�öh,î¤W×ú¢ßœêŽ+>w¼èl)w¶Å¢³5îaåæüéÙ¸XŸzú-».k2»» äw›# ÷ö�`—„v25¹FÞõv„`à—Ua$ëº~�»µ÷+#ú7‹ùP­}g¼�wŽf²àœäy’awWî½Î«Æ’Ö«ÞBŒåªÄ[F¹CÐ^Ü08áèf³~=É«q~¬ô9³ö|ø"ˆœcšÂ0˜8SºOµçØfóƒNÖÁ´GÂÌï¼×™»¹ž.68Ý›=eCÔýµamºÅÓ/¡ºŒØà“]jÛwºEõF¼á7ˆc�}^þ!n,¦sxÖ›oܶaÄNK#êôØòh;Öy¡D�ÞQv‚bP¢ ¼f9 |䵃åíö÷·3({U,lÁ-U¶E¨IòS‚gº„ˆzÙÆ©½FÚš uÓ¸óIº@͉1§5Í£2ÚÙ6Ä.hÑÍë›,½ãœ˜î$_�ëÛ}ni|ÃR‘9®ëo/Ü¢ˆ‘‹¯@ «jz3œ;ή·ŒPâc$Ç´E,Ĩ÷Awpþ’¯³vØíŒ\–Æ•U‹Ž+ÁÚöí§ ÎáÂÁ‰v�åÓåºÁbfçnà©0j£Ú†�D—s»ù™›*ô×X Í Æ-Q“¤~ߘ ÝC_˜–H6¥QÉÓ�©¼ÉˆÀþîžñ¦æùrØ+¸›Åim?Oíë8 ð&ã˜Ú¢zõ`÷(ƒ/\Æv¿Ûnð: }«ÜWµí=D«¹u^]n§5‘ý|–ùÛEm6˜œ™ˆ¦¡KfÏŸkƒÑP7²ñÖ¸\q9�ÌÞZ!å¬rÀ·³‹¬ÌV˜%Ä–QÏ—\ÇÙ+sPaVç>ú1¾&$©c®ü.Ú—ÇUæó�:æ¬ó»IþÀã‹_^T¾ê¨ËËšƒ‰ÚÞM%ž ­j·Ùwñ?rZûÜl> ìžfÏ7½úØã±Fél&UŸÅ’\£aÏ/aNö–ö\"ä©Az—%È[§Ãu÷×Ò븶«Êíœum]î´ ¼:Ìè¬FC�K‘Ψù–_dmïv¦]°¹Á5éYï±µÎgr‹ËZ× ¾Àž±k¼±t €;‘Furl••ל陼::ó;ïî8èŒæ qj~.}™ì‡DͳßÞ·j�B:FÃa”r;vá´èËÕþË¿dtó˜PÝçèjLàMZhù¥'öQéɪ\+öçÙ®´J÷‰/�¾¹–ø“ÍîW¬<‰Àõ ë%mË |Äóa…bD,ùX©<óYfl]§*a‚j8/�ß J’z“Õ>(ÝŠGúÿ.® µ+¯hZ7÷¬xEðg8Œø0¨ÚèäÔsÓkí¬ðmö]Àç¿c6ÓûOZ¸&‰|:·1ž„ó X^òõ.ŒÏ+m×é oNNås�^²háÕ‡,À„¹Fw6ÝYt¿Íl¥W˱¼@¤.¥<8Ò\A²“°Îa×3º¥/® H7`²SïÖ»Ýxøœ×*æ\ÊãŸ&íÁr¤Ì:�`g®[§k¦cn÷ Œ•=±kmˆÜYqÔºemX1� u³_%˜ˆqõõo"‰ è,Ôr{° ½j‘t,lÚPû :ê>mŸY÷^Ô$¶9†{)2`*·lD'ßNÂà8ZùlÕ-’'¬eï�Ýù|y¼8¹wÂÛ¤ZC~kJÙîõDp@àë�j®¥h2μÅË:¨´¸<Å #Úò æ÷—â„DâUÍÆ4 z‘ë¥þÏ:‘Ò•,d4ýFppöÏHJû‘@&2õ�’Eþa`t|jK@Õ³õãŒÜÐkØæƒæº0X=�W[�a­_wºK ÚŸŸ‘(/ƒV™Ãûå Ô½¼6Oì «#(ﳕìopùÞ‡¡«®0ìÃ…˜¹odNÃ}p>r«Ù’bCeŠ,�–·™úx—Š»Y>½Y€sjü•"4ÈP“ÚÂ<æ~¼GsAØ|b¸ÄË^û’¡ E?5%ðÓÁªœÛs`6;•Y�õ,øcN`~‰ÊfÅú/DÞ¢Ísía$5âù¾�À‡‘+·õW¶lÓU’³ðùÍÚ™ àØúû "•ˆN tÑN=šB1×{:>x·­G6Ô¤iYH;Þ:Ñ€åç"1žÚ\ ŽÄJ»Í”T’›¤1Í¡ †Øë"ä/0ê2½yfÞñm\GÖlgO¬5Í£&Ù±P‡{ç„>hƒ“P0BòÅîùoË–x™´ÕÁ¿ˆÔM ŒöÅv2Dm²ú@,å:+Ʀ‰:¬$9Ú†ÎÕz{ò:E6)¶Œ@ƒ. öñ�Ö,zVöΦހ˜7ãqè$T3çµ…åüË{¡þ³œ}c«žÊ¯”¾®Ö†;æDÐ[‘ØÙÎp˜Æ3aMPû9§wQ3Ó<‹&ÇÕ|rÇs7ksE¶Âyµ¥³| wÀZUÔß-ÙäBT‚xÞß­‘EÔC5›Öª,ûÂ*?uˆV ·Î¥žÏi·¶ër[f± Èd:î¡c#"� juu¹EQcÆÕ§ê<¡ãt½Á¯EaȃX8Vá &òø›¹÷�’$¸?q^ÔÖ�ɹµØ;>M]ò`<ðÙ²ð�o¶6$j‘o"ZáaÖ­åcÈi›lqrsXCcÉó‹Ú ùœàŸ·Õª£H†ù,Õ¶Ü¥pÜJèKXÍñ°öÌPC#‚ßPcÃf?—°[ ƒ}c7çr蛂ö@<ÝÒˆyàò=?è“q°0?Mo¬V…nX£•¾Sï–ª7+ÛH3†‡cP:¤¾\…åÂGŸ©!'Jõr-‡\Öà&p4™„×íßy=Ê®þ‰N'B3£ µiœä[ì¦~Áã'\µ•o:þ3—_&²=¶¹žüVž²ˆç¦p;â¼ ú¸§¯˜¿RvŠ˜ë÷õÃ.…7Òз숟w|1¨¶Æ.ÉZwð’büeͼQ÷«@Ûɱ[@ãñÛê¦ÏáK¾Ë«ªqç§+Þ‡iÛ�»A(‹Ðõ$.55&ûŽêܹïl}¶¦Àí£ÝŸpøÚ=¨™ÝBvŒ"y<>c³­C;H6šÏl¸S€ZÙàxfà(µÚØŠZ"Ô~µ7^hæ@®{Ë}ªbynj`8;® ä¼×ÁâôÝ¢ÝÝÆ‹xÆ·iÕìËA¸òeá© _Kk[é; ˆUÓ_s—†3u]nþ@/riÓ2 ¥رvä6D Øô2™jöþÝñ×L$¶ê}á·Þ ‡º“sôxS¹ë}Šouâº?vìØs3ôrüÞ'ä¾ÓãPŒ�ê,#�ç·÷Ùz½T,*óík<·(¿%¯�>PlŽ#!´—@ƒºîô²óX™>yì�½¾{o˜›¥Škæï»u’üº™êúA �NCå×½‹™W—ïV’ÔÝÌ´FÂ;kH8¦8Vá�_¹±�Í¢Y´ó×6ÔnùîPûn aÇxœ¹Yî¼"ƒ÷°ÐÆäõ¬˜QZp%ÍlS8�…ÛpÅ·´¼­¹<=¶O¸Ö¬�šKx±n›Š„€±40 ‹é{S‡X´û´àQì¶Q? Ä |ÁA‚bïÍÂٌƇ©–¸¨´`ÅMýf7[o¥‡¾®Þy —.Ê$`x1±zx¾PÝL2‡½Îq£Mûkt×<ƒ9å.Âè¤á,ó±±ÛK6#ëžêé!%aŒÃ³Šý/¡–6ÎH°AnÓîÙ�–úÑ·æ,/„1× Ç(VÙLˬ)…úÅt§éýÂæ�Å¥RAhœ=lýfßStfwå+g�¬kZÈHnºh‚ÔEŠ[‰;ºèë„–>ÈìIºxh Š íßËY4ŒÁÒÖò�I˜ê`í›¶á¢p $¥Ë7ðǯÜ÷¾Ð´^-;éøc}U¬_$ûµmÅ‘Àv�¡BX!dÎ @ˆÏÛ�ýZÇÀÝ,bÂñ ÜÜBlkkK,ÚÖ Y$FrÍcžw©^&ø^0>†Ð÷È~�«œ²mXCà®îÁ÷¾®ÄbÓ}¹äµóB –fóÅÕd¿‚g2¢!§ÏcÎQ~Ã=âA P®jYÝ>}‰§¬Þ…ù<˜1àN—öŸ_Çu»IqB^×wývÒ½ÞàPëgœK„PóÀ»íð‹xÏÎÝöÚS~ íêþ ㉲§õ€©„àÌjdýŸ£–›Z¬TJ±ÝQ‡ídeèŽ8óÊÖ@¯5mðÈô) 9:Ê…ñ—EæÑÜ. ׊ÎIÜ’£%ppÐmH@Aå6‚Ù��ñŠÆï¶�r‘s¾[�dÓž´Þ�©úÌyˇT(¯ãq¸\‡nAÞy2Û‹4´·ÇÍ4ñ練øñô>·³[·'yMÀ¹ŒêÒ±Ø}n&zë©‹¤ #8Ä5™cYÀA¿×™™­X¾øæÉ6/™Bh>kÏDr(ª‡¾óD—½Ž2¹|U”h+ƒB‰‚¹�0 °  Lü[:ž^^;iÚ”�eS¿u–x jÄ¡yÛˆW‡K÷Òô:ôžyC¬õ}6±)^Ûcœ!Nƒ;�ì�Ñ]æ¡ÕÙü™ŒkÝsqçÞlt&•c¸É÷-¨ñb.Ú`!ñ•®žö^½ƒNÇ�™À÷¢¿ÚLkCË,²š ‚JAÚÑÓåN÷`²¿¾?Ý+ˆî-=* zan`�h'o`³Öv–‘õ]KáðõœËßsGˆ§G—³1 )*�N;ˆ{)·?^[å:¨pú^b�Åêé¹€ßgoÆ´y �ÜQ‰:ù~«"­4Žuž9 Ëi4ÂW!$qjµŽ^ˆ(ø5xÓ˜Y ;¦qÖæº¶,ïÿ,O}—ºë˜˜µÒ G¯­>áq}4®¡£4 ™Rõ!4¯=üÐHYÈl˜„ƒq½k¬�Q½ŠÿÓ~ÞePI ÎzП”191±’… ›1A/Þ bC*í¨‚Ëà¸Úû»JД“ô†í7.Lzâ±»þDËkV·¤%Ö­š±'Îêûã…ƒMWùÂ{mhC\ô?ÜÇè{üßX{ÀÂÍDHSƒûï=�}ªHñu�ÀºèP¦•’K«+gÚ9¾ÜÝìmšéÏ‹_%OþmìihÂán>’M�0ß²D»ŽåWê/õ'H±|ÛõQŽÏdÏ~:”¥Z[^aóGÝV×ìz­`!N™tqiA£T‹ ÑÏôä ƒnRz£°ßOMf°0Ü(aU—¥Ýð_Óg‰B‹ð‹pTòª€é“¨ÙEdåÑoŒ#ôºéd;ݺãÜÀ,Âú÷öw¾U³¶åãžÞ˜�ŸµÊrå¨s”Ö:�)Û,ß¡t­ãBü“éxxD�f<ÔvûµÕïñÓ $¥¡÷WÖàæ××ÇÄÛ†W»�pµ¡í¢Qü{ç9çͧ´OQMYÄë­I u3ÄT×wßœX*ú¹vFwyLé(þ2½ÂÓt3𠜂–VÞŸ $W>íŽ��êÃzqéA‘^ ;�Áï*Î(Å�=¯æ`2~ï[HAGEk¿èÙµ<«º'-F}Õ;ïQ×Ñà¹En‹Ö¡ÍŠõŠÖcL±â!Øyd¢Xü �Õ®³o�UìLöêg™a{ ÇÉ0˜×¾æ¤QÖu¸î$Rð õȤ¦Ê;*)Q”M×–õgÙœ¡[­jÿ,ÿ7 �Ò©$`ÔPN\ �§ì*2…¡#ð~üØ×œ×؋ٛäísĤ�«\9!øbÀ“6Ÿ"n.o h)göó4ÁýÐP«è…Sãõ×}\–B2æž7þ³z?_/ zÍ{-r1%òeú\5ÖùAƒÙ�xÆ»ëò-¨ÁxSÔ¡V÷½Ýúü”z®W^éq �Ÿ9ÛßC˜»Ø6ᵘ­±áÕ&!#›«>Àó+®�íIƒ'SnÜÿmèËzýo¨øæ*7Wæ£Îs=Á¡s*‰?—q· ƒ›[ÈÑVŒ-iKë©÷/*Ù†ÆøÄdçIŒ7Ô†�9ªóº-…Åz®©Y_Ü�³9È¢¯§{娓|˜¥ÍºÔy®%Kd’ã÷6ºà Ÿ�ÀÞiºdòBpmtÄ—*çæ% ˆÈM̓2»¸GuÙ“N®ï¶ÂÇæ®u þ�5\nùÂ…ßðù¼&�ÖƒÂu£aÉ`^Έ«ÌU ˜ÝUS¥ŒÞ ßBæÉÞ­c�gø¶Êr¡ ÅÀdWKñ6“ÀÜ @!óÁä5e3FÞ—ÝÎ<œÄU»3?N°�§%}‰›óöú¯¡òßw'•qœ‡ˆ8Y{=>t÷ûoÒãfkíãuû-G­Už¨IŸx9€{&0¦=5RË¥¶õË1÷:ïOÎ^ÐOœñ:M þËÎF»kÙùÓßüÜ È)Í“môíåÂ{%9% ÔzÅÕº±^œ‰Ùœ+çãâ7'#,sbR[ª„°cAR �ÒlÖ|—ÔÂ{5­kÁº ÑÔñÀtÚßLŽvÔ{§ù­�ýâïi*Oîfþ%‡ïskùfOqàè((-±_¡ÒÁŸ´äëMMA¾¶�5õ ìîlÜ,žtñhìáh~égçº@‚5À”TÛ8¤8ó–»f¥NJƒ¨w특vïßi¸ UˆŠïܾÁê£|ûVÓà(hæ'¬v}oÓC“Ø!Ÿj”<Y½V)Y:Ó{º^[EÍ4±: ØŽÁ­…>cÐKiž/W®è7õ>@õAYUÎ%oîÇVáĶs#‹$2êÂV³uAõ�5SÊC �§ÂÊ÷¯AÅÉV9!ÖhcNµí1 òë¤XžI˜cÛy…u[•„€ô·B›!¾ñoºÖúÜ€Aê"âÓæ«ÞwädÅâñ—†´’³9`x[ÖÒD…³³Î®¦§v&ßÈÂä,àT¶ÒsÕYÃfÓMľå3¦¹¦tEK^¼‹ø` Å¶­ª¨Õݰ°öYBQøˆæ½íš™ä+” I‘Ýšz6‡Té$OsÚ¦[`ïÝŠ!A\Èmeµi±©1Íj¬nÈϧúƒ�¨'‘%ËíÕŠDgU‘ lp"ù#¨¯S›ÔFõˆiT׈Ph%Q÷•´mªyB7Ðç"/»êî†.ÛÆØ·.¸}#©�†_w õ½.t×®rnäË»Tʉ[[•.Œës^âÙ)TËÆ7Í“î½mz^6Þ«j£ÎvŽvƒ;ßk#|¸QÁéÖú…Æ»…îÜçH| ÛµÂ^ñËàB[²8kØ‚m¼"�«*Ç6xÛ°^*œU…zJ^µ¨ÕæÁ[¡@Ã3¦»ß·p[ÑeX@€Êõt2~/´�Îz‡å£K@ð7å^®ÆEÞom4ðäEá5\§74ÂV\µ!{‹.(zÙª\¡Lr­~VW{³`Õ›9ÊþW{gÚ;ÙoY•Bä,¢J|Ãú¶#¾÷¥»ÝV$K·Xsê‚jÖ•Û·~9Ç#�ËVWD°hÉ–/³Š—¹‡RϲüT-æÕRÎ ]´ˆA7cJ£Î´_WŠ]xÿ‹ ¦/}Ú×¹e{z5 ý)Ëta%µÖìm.u/@ÑŠL›Ù‘d°sBAÃ;&}H-%Ï•7)¼e‚VDcÚs0î¶Ù»í-fÂÑ|ZÀ5Ú |lt1�BËÙ³ÝT¨àÁûôçI.ƒMéà[Dïh'’Íš81«æ* ’ϽXo½Úê�A0¯}ʵ0Š-L Átc‘Œ|Ϊ6îFr˜þ£W Ï~�A«Í Òå.w]øLx&£a œàæß†‹[ Þ*ÈÕW¨HÂ}³ki¤W3* L5‡úöØ„í­ª‹Ÿ Â%&¿s#y?â Ðþ≊ Í_û¢å‰óò ÜÔ!4 aSB6¾#3gQä_k½7HïöR+êÈj÷æÜ+—:íÝ··ÎŽgQI6æïèâ2€Y Yü‰÷ÏJ9;"T‘7X-é0G Í!(d\’Þ,Ëkl ù{ 㔺¢ÜøåA?EaSàJ7{†]Ò÷"LqSBx%ü�[y¾2æ¬ÖKÕõRõ{¤]3ˆ÷æûËúÞx®±¡@ï†ÒI_vÆ Ü‘1+X7¾¿ëûNÂNï€í%Ÿ ž•¡õj?ÖQóìÉUzbbŒù…\]\Pæó5ûï¥ ‹v”¯k'ð0E¸ùÚ}WÖh«N‡)v!¥ŠÖõ83ÍÕ1_pT’Ë‹@K”M¢‰ØTÐÍ‘•â) ¥´Ó� yX{rP ÂÜ~DU€=G¤v*XÉ�ªÛ›YËóW£ »è>@…�Ê ÃÚŒL¨‰þLê¥Ô–ÓµŒväÔߨÖsêX¶½ë†¿3 "Å9S“¾tPî #­}®¬�n{‘¬{ºJñ»ÓµÜòR÷¸±¡Íøûê»Bˆ^ùj[�GBŸH!«•âiÖM*n'‚£ìNG{‚Ád‚‰£T7¶õÄÆñÓg×È•4ÝÐûÄæ{×n*1åbÁqMJüÓ�Â> V:¹zyÿÊ@�7ªíomWJo¾ö‹”ý˜Ïrz€+*Tü ^Λ‘¾í\úÁÏØ! oÍ/ \ðg…£'z¥�þ¿g¶ô—Óc™iœf>ï?”ÑÄ}Ã.a‡mÀþáÿEÒœL÷ñiå56:KᲂiÀ¶ú©Ã­@³‡² L{š¤)ˆBµ(dbqt¾�AÜÏ«ñG—b °pú¥Ñ\=;ù±îûÀpŸd†�éQF†£NÓ’Ò‹òûÏ4ãqmäÕ˜mñãèŽ�Í®·ü†M+þÀØ bþ½‹ïÚ°µÄ’è�GînRË ñ”bºiÂŒŠëB(O“&4V>{È|\«BÚo®R�µ÷o�Å\ư%ƒz~ >¡Ô”þ¸%Âz™ùß„…$Lµ!Ÿg9µýE“Ï_¤s�ÑÐPn…Üa‡ 5™ëçj½˜8¿Zq¼fÐÈÝïÅyÝY*+'·a«¼Ši•X5•—Ñuž"#%•ØH©åw¼ä5í�‰šÆ`•ÙKP¬[jU+ɺ¿— 6°Ïn ‹JiµÖ¯ožhØc.aÅŽ­œl9 ܆úc`À«4îóŠ —Åv[‡WH0¾ßõ­"†`78ÙÙ¸÷äí�ì€vÊ’® j$S…„ìˆâ׃åñ¼ãµ2ØQa1!{œl‚Qôʽ]8ΡÊëÀê¦Ûg ì¸72c& éhêeòì��mŽ�Ë‚1ÊHM�åÄ,K…�·xæ—Aüá�¹Ë•iàm:�3æÉ€ÁUUL‡iãÖ÷LæŽaXR\àŸÜ®�×�²ÿˆÂ.¯ÚÙ¯“nµJž3ùи¨|Ã8g°41¶!¸ ¨!ÆtDC´ë pM•ðÖÐ^¶9K›…Åœ¬%áóiFv3K@&‰Î’WÓÓSKYbý=3ƒlˆÔfÄ”Ÿá�<3…ʰaVÀÚ§Hp‰’àœÚÐ6“œÜ:Î×ÞùV]êăͳBßlr"-æ4ò]õd¤%½…Œ‹€8}8àäÓ™mE× ;XonñåÄ0U­îúƒA`§ýnì�Pr Á‹gG —~½Ñ¤û¦U¾õö¬‚[�§ �ó䫺÷%B¶ÙߦL+7LâÏ] ?’Æ yÍ�>» Ab€í©ÑÞDpÈÌ6´áðÄ,à^³ŸArìdƒÝĤÔÙ€ùs~-Öm¢ñEðÏÿ•Ž«t ÊÔ+¾|Ò¯´ë âþ¼2ßÚõ§Ü:Õ,=�ðaÕhÀ»½Šø÷¡Õuª}/*#œf©’†¡ÍþÀ e½ò{}œ¬nöTÈ›ó‹) XÒs „j™®"�õÊÙN(ã·iÇŽ­5±ýŠ¡�uÊqIá0èdŒ�hU ë�•üÙ´e_ιHÈí«Ó &ïž‹ x®ï¦_Ñpµ�†LÎÏvQ¬UÍÎøï)ÞÃ[,}¿‚°nåôw?O/{S¥|¯>‚PÓ½šb"^Ö¦¸»u|[Ú2Ì‘ìV³5‚ÈÄØð“K¡–惫aO¨˜¶�P³|'J�­J÷Ê-‚u„€Æ�"Òpcà=Òe�¶vH3e½EλAÖÕ�$:MkÆ!FQpÓ5ëõ4VpTÅ_[ñ_©\ ö«Ìc××@t�È·µ)Buª Ô[°ƒè騷Œ>¥sî>»ø_]Ì߆›35t,MÏ�êîUvzøÚ³RˆÛ{^PbÖ—_E°6ýO P@v²s"èl!êÛ\ZØAΔ�á²N�#TyÜ9u(EFO îëóÞ#ö¦ãFP"–½¬ùœþðTTz]�#Vžò>í}õ°°Ç‘™‰¥"ÞIýÊÏ×u —Ïæ¾HÞƒ‘4bÎpw¢ê/K·MZäœ7×`!Uz–E3&³�Ap6J$K†>³`¹Nzªæ†q1!°‘ÈTÜ(sNég;X�óûp„ ¼•Ç¡˜‰Å›ÄÖ*Arž”Œ…(mo+·k]žÀ´ '@hvŒ~y'c�øò)‰KÞöÁ�Âì.T¤ä›·m7FZhU«wã]VÅ” ý<0öuøh¶}yçÙI!iwb7çô7+Ãñ€‘s­©˜;X»Ï�Té†È4,{g¾Wt¶TÓ�‹DæŸ/µ*ʉÃoÆìF`0ÐÕˆÝ3ç\5£×Ä[��mÅ.Rñ�vqMå#Ìk¥pÆwyÿçËSÉûI?«LÑ’ì¯{äÚ²Ÿaw‡Å¸,|òFbiQ››ØäK»‡Bó[£ÌkZò>|ñíš$íÂ�Gøí™Â~ý°gìØûu‘âYØ1-û:ú~:Ësw�f¿!°Ÿ7åÈa²2M[вµ§C¬¼šBýjÕ ®[žÍðæhϨœÙYÆs›³"êÉ‹\ÐÄÌ’ɳk€ ¬Ùb3 !äÖÜ» ÛÁàÎX,¬2eªIr”üøŒž?¹žbånØ7Aµ«�¢Íº]ˆˆÃÈdj£§D&_yí¡¦| {ËÄí.€‡½9 �Ò H+rq«w*o«ˆY­q²’bÅ�G*~3�Ôn2mxÆúÅÅ´24õ�6ïw ëÉŽ²ŠÁà}¨~EŠèœ<Ü_¥Û~N"8dÎÃqèÀM²Ú ‚AS&N6ßÙt bÒ°“vlÉ@7Û¹úmh:Éd ½*&q@é� sÌö¥NgfÙKëzžJ�À¬ú̵¿Î¶µµ¹B—·xá™NlÝÀc×M?ÎŽc�œaPn_�¸Ä¹S”x›ŠCrˆ—Öе¸´A\É�XmÒ›˜Tê³µýr‡Î¤¸™eº:f…ã@Ý݉Zµ,|êA|Y/'m;TëC-X4#Ë?pس³l\/<ËYôù ;¨öd( 8¦?ßEãš3Y Ò)èú�¸Ìòù›¤òmÂÕÊÑw&¢ŽÄ a>G¨�‹2^DxpÃ쥉–-¦øs{_êhµ„¤,*aå4éNkPTÃ<†ÆxL«Øä×¢T ÊYÀËMh9ox ¦Ôdã Ä+Ù^ Àái<‰„Þe˜<7Àðf|¿•9Ç’1ÕÇrþÄþa'‡8ÛYGL˜ý ÙÑ"}c¸]\‚úË,À>�«H=ô) 0S�GÎFùôn=Àâ13¾õUèÀº}Aµµ°€à:º­aÊá}'mZU\q P "Á“kg%kñZ2ùU"ØÆ ˶£§qåÒ@O˜©g ½ÆyP“йÇ "ӥĪ3@í([ˆ*åmKhM±( }`Ùñ€Œ6çí@^¥³wÚD�RÓê7‚A¥85¬O`*³ÄÛ¦ïá©Áþ¿‹Ÿ{ÉÚfæÉëч,e‹¸ôí̃®È(ëq€½%µ@?Û@÷fLˆÖ°vÌS;s›~t NÞ¡½ÙÁø?4LY·š{ÕñXÄ(.=8 +Ë †ÂxÇöy‘ŒošQ­‚ín¼Í/(Éõê­áüPÎÅIA•ÇÒÛ(³ûÁ:áK©]ÂÎv³¼MN4N‹ÝðWaä+M§—^…¹UÄý7Óã®Ù ‹ˆ5ç!ÃÌD¡YUC,o´Í'ûî+2ïÌe¶žÉ•Ä;“(¤Ã޶¬¹¥²wÅ�l |ž"‡»•˜$ÎË8)T&O£5ªÞïmǘŒ(I Ùp›ÐpAà $á¶J&¾ýótŠáKŽ�}½JZ©£•!­ÎÊq*aÈÌ]Få6€¿Ñöþ?Õ]ëŸ ƒ– xwÙÐHa–Ÿ�Ú 9äË›îø-�ݼfÍe :… øÄ àD‚� ëÇ–�Ìp9C¥·ºŠ}²õwŽ; ººøÃaá÷ ëg¹) òäÛæIuh½[5ü€!ÂåEñÀgã¶í–Ÿb‘HŒŽ-ÕCùåbèbIõ¾gª�ÖÃzEˆšb¼^À³6Á�W©BÄA¥6»#^˜DÆøIÀeëåú0v8 1Kbäkçýß&®¯”½®]Àñ—Ds»¶>]ã}ç1ØÒVãÒþmÙMHDgÝ×”Ö5|áWQ»R¶ï}‡¨>E¸?¬üWn-ýwÄIŸ5'êzƒ¹�Ci¯�`:Ç'Ì{PšG2#¢Ñj1—ö’€nZe¸KWYo�°AMÙÁæR ñO�€cŸ^²Ö*ÕÌ0L Å|+&‘�ת‚ƒq›ƒÛokHLVðU¨ãAí´˜¦ Ž}³æ“br 7®A\¿|�‹ÆN)³Qƒ<‘Qô-Ì,¤ j”ÞÆsØ…¤†ß›H�|%^DnŠÐ^C±MÕDc[„Kj¤�‚ç»_ŽD~¬ƨ.{bÔ%e§àj3¹zPhÎ2É66¥é‡9ÐË1Î(0A‰'Rü�˜š ðæB~&�ÇÚÇX¤G«»ÛiZ:M!£w›ØÀýôï ³æ<¤h'æ#Ïn’`vYÚÌ©‘‡V,„rÑjßsNÀ#•f| û¸ÆˆÄrü«’Ó ô³»ÝéÊA +F³—29êÞø¢óFÂù_<›R,¯ â|À[:èGÞ\&‚¢à^Òd;šÅ?D¢ýuĨöË®,‹oŠuÍ9^hn{Z=ç³\至'æßHêd-º�º‘’ë6ùŧt¬´Ž-žkÊÃ# ™F¹•¾3(忦Íü Y~˜_‚÷Íî�V:–žQü¹›ªoW¸0_R'7 ÈÍóeÃUäìÒ?¬NÌ–úÒÅ4†Q¬ÜF𲕥³†„„ö4µ"¹´èΚ'KœBhr+ª…g}d¤µ�·#)"É'ý5vM:?&DLqÒd°XêÛÁ~€/CÐJÃPR"킟²2 ­: ©Ä ÎáÞƒ’ÙuiÜmulíµ Y´L¡�¬RÁY{ ¶àñ�Ê/É‚ý¡ iBçÝlRuŒ|�÷=Ú¡°õÍýFxÔ•«G‘Á~õ|ÙøñÍ {�-õfËyÆÁÌ.õŠEÂí³8Þú¸+;Ýõw­íœLæÔªØ¶ÜG<\— 0ÈGnls°´~´rôVplïw&Þµ¶›sÅìa\Ø*æQáÙž*zÔy«Q?‡È1æÆIîˆÚŒN‡¢’„9§ÊaCQ­C�Iìì (l! ¼_¬lS̤âp€ñÄ“±Óãlq«±n•uŒD2/š‘óe2va«W8_¢ÎÚpÁ^pZŠÕÎ5e1q¨“g(ýµ½•FüÅ_L'Wû•¹ «X°Y~g.G9H¬œœâob˜Ù™$l]ô‡„E“k~mP#°ó��óÄŠ#èÐã-Ž ûŒ9nüsU 6DÏJ,Fyƒ¹~!ÙäíÓži›­;ï4ðï¾JöÍ”Jƒå¸7ÌôO4;¬{±›ˆ9’qê.'ûW~KËÀÊíêøÎ†„;vݰ¬œ„®¦Ù±«L.©æ.Âk}a’Ì{�:ÝTMY”s\°]H’ÔQÖi,X6+S!ÕqbFOÃRK¿U øÁ‚¶q`Öñ"z¸Ï9½©Ê†‚°% L‡ëEJBJ‚Ñý¸ˆî06 (JƒõóvJ›•ÊBÑt§ÔyÄ>“‚¥oÚhƒ1}`<PN8í³Å¼ëÊ·üÅϱpgÄh&Åwò™ß`eãÅ›À4<%ˆ `ôÎ ¦º¬wqïUn Ük¬ò.�°k7{¡¦}.Ìo, ¶Éª5VÑÞì0”5Æé *íQʆë“Ûµxåñu¶a(®væø|¾¹9 áÌ•A²¯ej £GfÑ~@@±i³qÁ¶Òøº¾ux¾Ù®¢Lý©x3½-(ºØºZ>"ÿF‘öÜÍXñZ&‡m¼EZ àÁ}$VÓyÓÔÊS4èC²Ø±Õó`ˆ$ÆRÍce�ÖÆÖð˱=ð4 XØ>Ó~M–ª3S¢TÇoˆ1=?ö‰O¿.ŽMY@øò¾ ®¬ kZÄ '_Êí©3¶ã� Ú¬�%m‡wR  fòp”L“± ÈÛá]M`L_ÉÐêmKVóˆG}j‹–1ž¡ªWRݪ×y�‹-NGb݉®m �+W÷¬Òƒè³ßNÊÞˆ½h8š¿séÈlÒ®Fê"JÑŠä~nÃçülÓ+4&º?œ6†§Ðmkº1âú[Œ0U´²Û>ö”fñËïÃm4›— r0'‚¥ô‚/J•É^´”÷´èÂ.œxÈÜnö,¡çî—Gf6 D™`¦ U‰§¸½‹Nj µŠ‰¡ÛºÈåyjÔ«ˆ¯_G6î;ëk"‰cvd@À•Ùü̸þ�q!¿Ûµ«××ve®¿“wö!î䆖�ç¿¿‹¯éåÚ·Á|œk'¶Ç;£Í°›©o„ñˆÜ¿lõ;„_� a{Ο¹Ð(1Ñt¨4·.Žôé¡7i¿ci€˜Àôv#bÖOyÚ=TÓøìñƸm‚4ÓcA#­6u¢+,N®äŽ4\9ük*¥’[b£hà@Ž»5&'*0XŒ±¦(";vÆwc ut‘»s„L¹XÚ‘ÄÝ•=ÔSèšmM½\úû…¨äUì'¨ù¾sf‰Õ¿2]“ï™f×îvÓ}ÉÉ Ujˆ½pŽI ϱ›²F½œÕ´†áµìDWaÀ×2¥ é³nˆnçç©Í†l¨ÚÉ®–„çZèËÕ£Êõ‘² L>˜ˆ¦#½6GL9ÚÝ2)Û‘mÉ®žNžO•N·mŽæk0»¶¡BÖ¿b�¡Ç[C\–"”|ÅBöàWÚ§I˜±p�S�o²–f ‡-ÌqÑA…"2UÁ\Eú‹Ê3`N{Å\-ðn9¡õHÓy5±æ¬'ÅäÖÜâ%=W´´"—{Þ²‹lÓåõ„zwhVÒß¶v›/xcg-»hã·îlÀ‚¢1¸=ç;,Y‡#VÏ)›µjdËÁAƒ,gp82:#AεP÷oó�€`£%l"ØKèz2°¡­·&y¤Î\NHúVŠíñAÑBéÞ·IêMqßÂfÅ4S!j�D1†"o>%±3šµüdùsF�Å­/8qr~Ù�u\ÝÞ ä+¦”A‘ßÈÝnÝ€>ýæÐÚ©l~�Å™/€¥pú|ÐÕ­Ó��Âiôq†ÀÂÈ.L76oo™‡GÜvÊowå;’\¯÷à>|V�ãvä’ý1Üç P!K ç­G:Wh´U¼ûäú.÷vó'•”;8v|!U˜'l› ~â�, Š~TÔ’ŽQ!Å»N"ÚN15ÔÖbÔ°oÈ[´Uª“MyPVØW{¼ëa˜×�ö‘Ï+G‡á˜¨‹ë�m¢™E-\ËAŽ—>#�S@�›Iј�èñ=ï"ñ¡Àžá6B¨È¤´—¥áêÉo"A­qƒù¶œ õX䳈õ$9cßáR�Ä…¢%� -‚ö<Ì—®ÆÃSÓ÷-½·/ÐÜ@pï_¨åu–pH—­Ž®‡¿ËêE šw&.ÜÏ 61ðŽƒ8A®c� Ž+ãÑ�ÎÔ-’™²ZN:øöÉ•û—åæ9èt<6Xûæõe‚ú=Ô/ƒ`h$}“pfúêdà�`Knû?v¬‹;À<°�.L¬öxŒY¹Œ·ù{ŒoãÞ¶{AÉ ��93JS|½ìa:Ý|,)ÎH(õÒg'»E –âÑz~ïtãª+ÍÌÏÔÔ²ú“qÍ´êªc�Ž÷X �ÉíÆ$íªmZ×Ý)Û#weèªÆóàܹ{Aíyc ÐÉCÇ´sûÔKŸMN$±í[_I»jí8û~°ÓæáÚe¡ �np¤³ö�,ãÙm‚· !oj£5 ˜;[™¦�)*~µ�^s‰ª'ó7. 9- ¡ÃXõ޵…F�4ͨºh'R¥Žœ³ç IUòT–r¡qJ*kY×b±f°ÎRÄŠ…åðǸòvù�îë{áìQó›ÎÍ\n“œepÞæû²>Õ[´›ð!™"ãÅÕ(5Y‹ ¬×¤† ¯kw'YŠwƒÅb!œk:ÍÉ|�¢›!Ymå[MlwžÌ./¥Ùå;¾|PdÉ#Rô|3a…'ìÏPúÇìÞ¤Cz­ºßgî‰6%X9öØñÊ¡y²óf�[Ó79À 4ˆJ#oW¸bÏâ¸bûß÷u„õkwCÁ¢]vü´6ϼTmÞÀNceËüzYßÁdømZúë͆­W–!q�vî8ÜòûÍÌ|ží³ðîùßîÊX’áõ¸ÛÁ G[#hy ^žV-¿ÔAÂ{5ñô xe¢Ö ãÒÈE—²P ]mHð¾~Aš1ô‰�Õ}Û9õy€“ÀdÆÃ!ÄnÖ¦ÍD?‚@àÌÅîzÂÀ -[,ð[C|•›"7©—”Q¶ÑÉs‘0ÔYŸ–ázCØ–XCCûõÄNýì´_�e¬8ö# �2�²5Ð'·¥‹$ùÀý¥Ï´MèÇK€ÒŒÎ}�O¹¶Nî^²|Þ}ªæÞ‹9;ƒ­êÚ@ô–8#C6—�uìÙXúY²äö­u’BN²¶9þŠmC¤G0ðþœQ{›Ç8@??íhÎ…Z¦J²Ý߃"ÍçYŒB©¥J<$uÄ,aÎçœØÉÀCÿ#ç˜~î"mÊs6~ÍçBª«+ή+³úÙž@2K\%ŽiÛç31+—÷nï<ÔEãß�Sû+Ž^þrÝäÔˆ8{¶3BhübßÞȽ�z8’rD@ÉøêaªÊW«¸"]qž47éUWmw¾¼ãÖÎB˜‚`âT©Îú]#wT«f:K²MZ“º”Þ߀üÅÜïi»aÙ€y€7vÜ&<–ÂDåhk®"Ùlƒ�Ö#x£ãó�‹ic$8›“D0K°Ýõn³ ›âÅÌ iBÞY¢`ëàøø5L:sšÌðì7ÅÆsÙô”_t¡¼ðm* �×*=تvæVÙ÷—Ô¸”’Qôàù‚¥…‡JéàLµß¡!}rÐ"Aë\¨÷S]L%Ù� ‡_‚©zé~ú<Ùh\ÌšqŠι¸dŽw2 Wî…pBäCo3\@�ÓCÔ넞¹VÅtÖ¹ë…hYÜŠøÙ‚átÒöËÁ•§ŸD žß÷†ƒ» ™1yµŽc=Þ@™'‰ÉQcõgÙ‹`,Эg÷»Z' ‹p& ctpìøµ/JÆ«å=ƒ¤ùshÎ,©ÓöqlÆ+ûÑ ª1‹fÁᇠa©" ;ަ¹ÎO®gºøú—ÌrfÛáæU|-:UQ%QÃ@Çßf.üáŸì®ZpÛåÊ`#©¥é ªúÂÓS\Þqˆ¹Qꉄ!l26¸|fÆãχƒõüÒîðhžõ¶ìt°À#æt'kÛ}gi*ʼn² 5‡$<~œ#6ô¨ü±û &[)4£é„ÜqÜ…®!šø# Cê/}ÀöÍ"ÁÙ±E©íÈzŽ!7#Шë‚\ã‚ ju&Ôý½êB^éN¡$ÇÇ5(Îo�ÞÔ³aŒügöú:iÏ®Ÿ+Ûq䃺ÁÊzÀê8±Ó Ý#O–àûm ³�ƒUAüö¡Á†;në">s ìœÐgã¢OˆÜò%gçZ(”ÛÛ¸-Ø-�2V`{®à ‚ß°€¯ f¦Š¿ ÇvÞë½è “jÁŠa8Š–MÒæ¬AvÛµ_¯páj÷^Q£M壽4Àèò0DPd*TåÝVüÃH›O·ŽÞ ½Äî¬wYeË×¶¹q"‹+ÁFïyKfå¸çÏÕ�=ª�*.¼G—&�Ó¯µápè€Ô™‘‘I‚SCo‰;„gÖƒ³í‡[> ŽÑÞ”£–"”`©�ò[å¾ÉáP¹S]˜|fÕ‚�Æs9:Ù% ™Ø„má#Yµ¯ît$Ã7xµi�ÄÄŸ¡Ž’hWT°ë�T!S;¦ ÿuÌ UF1ÝëªÚ¤N‹¡…¸–ÇCì?§Ê¯•ÐÃÛQèYœTŽõθï¡Ì¹6¦xÐòdWÏÜJHî‡çÑí±¯®¿ŠSUmx ˜¼@Í�†Y@!C7`¼OCnÍ.Öå”�`e�˜„¬WÀ€Ñ·\mÖDtÂSåQCí8QPPô’�CE�›¾µd°i˜#ì s³¨¼=‡X»A‚‰Eé^…==¤ÎìPðRŽô„ÙÅ<5§ï±Ë†)&I7´ÙoTÓígr­³k·$MС}0)ŸŸˆãÝ’6ÚÖPØ£‘³:p›;±˜°‘o Òµö æ5°c+îÄ©Ndø*[V û±¼øqh¤øC¢i|“äDoof}.ÈEÌà~£ºwh‰•ó71 •W]sž‰ÐDA‹÷‚È¢[Ô—»äÍÎÑ%B,À¦ÄsO•gžãOh¬qÎQ¥ÛE„³�iMöBwv€ââ‡[R Ï�c|FtI‡ígãÃùB¸Âa%K&^§‹I³WsP˜°�pÂÞ/É„¼éioÖ°Æ:c¬AìvBølÕriî-§Œ"µ'Ƨ°*ò³UÔeP[uM–8o ¸ÜL+Öy.ërûÇSü’Û·Þ‰òƒü%ÕCGoXlsyëŠõnËø¹ëïíH†³7p¯Ñ/”ŽËH̦ˉjJÅšÖαæÈz Z4áXÂR^ã�´�±½²™VØ’ur´Ù¶Îwb� ûÎ�D!Å \-8ÀÀ’5 –[õÏØ ŒžÄèyÚÏ9¥Üºbp) êcckatJDåÍ'6‹y3Ê!¿žî'CE ²eK»Ž³ûUó¼ÑT1ò¹e©­1(þ¨˜QöÃM=Vc¥¨9ñ¾íF_„4Ôj.BàY^¼ôÿµm]š×{¢¹Hª�ð²–ã­¬Ù¬îÎv߈$C'd ²m^ãùé7m [%ŠO®Šà00>©Ò7£cm~hyr14 Æd.ò.=‡R©{G•ÃÓ)«vï¼Ê¾„õjÞOŸ‡ƒn“ü¡¨ÁÞ¾�mМp¯¡f퀯µÇí 7��ÎÕIój{�À/äôÕ˜­n&4òßÕa!ÖÂ0è|¼nýûåh(\%g Ìéa%ãìuŠð±^{¾œÙ‚Þ=ü¸’ÂY.BïÙ=š–ÒU– ;Ôâƒæ9/DÇàbÝO€–âÜë§�¥ rË5[µõðÃ0ô0Àœ¡[¸ØÖùóJ†6Τqò¾ b·7Çu{›WWæ[«d èMWŸ‰™ ¶›Í!Õüñ’Mßü’@¶ûŒzÝB×xžRû½=ŽÜË×À=sF–¨Å0žÅ�ž'“Ã@�/ŠLâΑ˜KûŠe[o´ñäŸ×ØŠXnù]”ÆWÝÍ;9Æ hùIÂ%º¶2Ç/lóŽ~¥„_€Óiˆ$¢îë(` à?§·ÝYä®®æ¨ýg÷]²Z€S‚«` &cô¡Àè:² 8Aûm£r *on\äÈ÷ɾê3{ÑÃB¯u ËEÎïÎ9¸´hfv€pѲ¹¼Y1~@�"Æ‚ W@%ÆA,‰›Q·)W6¥"CQÈù0ÖFѽó R‰Âöo(Z5QÉïÇÁ€“%І°‘u°m6!¡ Ë¢üGt Êåðv„‘j¯Îº|ä0ðnKoáà‚û,EÚz`ÖÍØ2 “É|7è«—ÀPEz|o¼#Kp*ãÂf«|µµs@ ·q¡°fg7mžúg‡"YpöÂYËæPÌP³Œ³åâ�Ñ7ËÊ?0P­Oîq̽ºq¦ß¹—%cܳà/"皇‘B-”!¿JPæK5˜x(ŽeG¤°�PJ \î°×ÐâÔ©¼ðÂwƲŽôŠÄ;ðC€®}ˆTDì'YÉ‚ñ·Í+HoîZuXRÖò 4¨üB°üý‚Å‰Ä Íi‘˜ŠùKÀ(¤r^êAh�¼Ï„Ò‘OJY^–·ý?7$EÔ&'Ùò½Ð<'A¦Dì§Â!Ü’À-aà9ÜŒ„~½�âÝfß `Ö_Ú(ÚñŒ±¸”o‰PÃÉM !†ô<_Úµøú}™òƒ¨ {þÉ}]7äç¿–`�7z»÷–A­ÝIlew ÈS—t4d2uFYÀ/ÎâÓ4‰8J»†¬EîK{ÙFì§1YÖÊPÀL‡%zxÄâéyêí¦á´ç°Ut òƒ,Ûð‘“å?w y¡ r.ºLâí~¥AqpÌ#½P¡isÂ$á½;:îì„û‡€%½Ñ`äö‹I/³˜¾ÖXøÝ]½»ºwo°£Œ9[¢$[{éí.Ül&ƪߠ—xÕ?sí:–U5`-êôÒæ$SW¬É[DK£¸Ø…MD‘›7p¡—f:Õ,FEÃA`•_pZ¤�l—K£r!„±`à\Ôþ«Ü–²íòMóÈco¬0ëðjØb~ÖT×$¾b5Å’6HQj:ÖøA×F¼’æJ3¦¬ÖbËG¾\-ì«¶bîÂAägø†ý·–A¾0‚׎ózå .o\uÊš8¦ wgèÝD¥¤eÓ¸I�¶]Hí”1ròpÄóK@ÌíÔ1Ud�½ðô3Ö¸ÈûÈzä6 ‡–l&¡ïÂ-@sñ+ýTœwZ†âŽN“53‹‚4*aX'vÒ„»äo ÉçgS�o@pìîÀ$™ÛÖ4¯Vƒm!\¹¼qþF¾«ÝË„Œøø¯ä˜,9Zåöð�}=;lè¼ÐßY*ë7°gž…;[ëƒúŽÉ' µåÅ�nHùÙ±@»!ˆ�—`}‡´îÍfÚÝ4`&;ýo}ÆÒ9‡W`øPƒ¸Ú}Q† Á4ê»_6ÔUÛ,ø‡l,ÞËÝöÝ™pÉ“Á¬¨Ñány Ï‚—xÑÏìHjDJãŸ/¿�†¸qn™ç!ô"™ð$ÿwâÞ•/înKÀå` fm6½opÆ&—úÅwšü!ÔìPgfÖìœ<ç¿Å�^qm½€ù°“§m¼•žàìÍ{ ßœù3ÙCŽ=¸ùàcUŠÉk�‡àm6�Э8j¡K. ½, ‰µò‰žàÂÉn°VÝl†zk¶õ!¿™×vÅ2ߟ£& 7" äYètu½‡e;ú`´¸/øÙÁÿª|BÇÏ�PÞÒñ?·Þ~¾ijßo>ÉX,r6H\²9=§>&u¥¹Bµ›�BËD¿kF3âôŽ^R¶Ó¹®´Õ¼—–.$8œÿ*ØìGz¾"ö ,žÙ2zEk®nÍ!jt¸~ãe¼U«Ãêãpt–Ôk¨ÏdÔóù5R²}@;’§u6µ€G[„«BeÅ÷‰µ)ñ§9çÚ4¨�2mÓ0D²`g~¬OÝ&> -ÆYD¥EjÖDPi�\� “B–£1È8¦níf�eWçJüa^XÒÆ¹4R‹øäb&ËÆœ •uw‘3b¤“ °Z)ÍëÇ·«v]ú¤|Ìœú®"Á~ugPÖq$óµôØy<v´ŸÂVqÜýgµê·©kF=ë´¨ªþãŸ/¤j·Kêt. d šÖ½½<ë…Oi›Í�þÂws?:ZâôÂ" |›‚_«»õÐ6�ú=±Þh6|·t� “Ù�ƒ°�°Î’üQ¿ùejž&ÜyjÎtÒOQ„Ž£ͦÀ+ã/[7í;Í“äN�kš½R4¢a/›˜`C.“ÀàsÛ›ÝyQ�»Ñôl†G2+Æ*H(Ã+õm훣ÛcyÙo„�5„×R»ŠÙodYD‚¸ês…¼Ù6W@/Yûvá?î`48`¿™“kD 8y¬k–[XâÜô>IÐÐ…2ukŠÒ†§·;[‘ÆR‘Ç6q�íõ=zÂ*ôƒ‰¤€BÇhJ?l¢…ek`gcŠÖ5–uÖOöq¬!ÏA0Í‘Ò`à HÓÚw¬É_}Ãä6S‚«š^ÙqÍ é5±9º3Öh{¼ìôtk„ä†#k¾N”Ð9"뎒U—¯<×"„5=‘ ™ÌE3‹Óv¢y"竺Ôpùˬ¨q°ãzžLâÇ)ÏQ ¥Å„À¸—˜{­Ã)UGÌfî o¬ZÜ-Çìj¤cÚf_BèµÓŠ:OÞ(E©Æoc±N'¥¾ï@OÆ£ê }­Õù.ma¤°×–Sìb„‡[/xë°rà+orv�{44Õ(Æ�‹ô]�šÂÚ…3‹ ÂÖ J?7ÅV:aȄ̉ð7\€ˆç¸‰{˜@»³©Lõ/Kb08(dl黃¾×”j‹«&3Ÿ¢óAƪα|ÃéqmÆsñÖ®¨ áDŒ`G1+`Iu˜ÃJ…åÀF§/™Áý¾+cJ6Ö6É‚bús£$=L0Èç–›CYc`<‚ Jûx$uH�Ôv” ØÙ•ïMMìé?@w…äg&¸úç_µ}í‚7ï@<®~Øp»ª0ôÚ›7ÛöùïÎG“ÀÁ8€ËÛ|º[%ÚámƒZ3qöüé@\Eݯ—e@¾¸×Ý󱮔ᴼúÿ$A!J¹$‘óšBÚ&ƒïJ/ÖRqÇÛe”M©(UÌß3¿›=ñR*•º�wÐÎ:<Ûmg)#ùxhOµê»nUþ&„5ÊûR0"ÝSyÛ~l¦vvüù¹1òW—áeÙDè,9.‡w ½~ïpn®ˆíaŸ÷xË€B®Nàƒ ·0Ò•ZLX³Åfa\Q-­j"5 üÀ›ôæ]Gl×оÜlÍ�5Ó™{ûšÖÕ’¯—r·~=Ï—g¬5 À°¹GŽ@¥Ý ¼æ0YÜ œ'¡{cëŸ ¦ÝË \•�É„ª6|x^TZ›—ì>t/¬„•Æ2œlp¸}š‚I¹Çmè^±#¾ïÒ[�_sî>pB]öãaWPUBëäí/öž×À�ü!ZB\Ý ÑÔ`'T¢î7İ H4±UççäYš…I©ì9äÛÒŸž¸=²˜Â{ãë '®“e¶l†Ã¬}—º1_´€;_åKÆËš}Ž/·~0³ä„ÉB•­äÎ|E`eòe§^†ä‘`‚ö„�øþÕƒ‹˜»Šª�¡†Ò0 B_Y„ß»9‘Æ>¶)•1�Žê6¦Å=Q‚Ž#ê€]å”°–q¨>ó?HÎAª¬�')Nç! €¾Pƒ�‡›ø‰ç¸Ž&žÑoAI²æQÀ'Gö²!ÏJl„õ®1Xa …Ñ`LÀEüŒU¹ùyEÙ hŠ»˜CßAJiýõ¶=¬†"–èý#@îXk†1uÍ�oiè~ü>ŠÈ;¾™q”:÷@û8Èh5<@è¦Ä›öp‘{ÈÌÚ²Ëê— ñ��ÏH 2)§Õ‹·YèQP«¹«8‚c´³b¶tªaŒûƒ€Â��EçǪnÖ°…�òQ:¬Â ›îHÌoé„¶ÿ±Xð{g ÚeÃË®¹,±‡¡ÎgåEÇ‚”*[~v8lø­rÙõ•Ô/Z" @8pÍ K�»Í.?‡\KòÌ+惈y’'O-íÛ OxŒƒ¬ᯇd+b${â ˜ÃÏ»ÉQ>i²Iò PØ…t&¨¿¾ùØK 1ö»Í ŠR²6î>GÁ'„„ͧYÀ å-fLgÙsÊÏŒ1ª2¹ã$ìüùTm¦òÜÐÚ±€³\åNT ÌÛ:»ý³ËU2ØÆœÀO)ê[ûdÏéÙö\xäªL­³Ûyˆ«šû§³–0£íR§gœ·ug³ó¡ß�Û©‚. :é„E@X3M‘gñðq¹i.kðÓ^g®§%øõÅ3è¶Z‰µ ·÷ØÚôbó°JÉôŒPÛ¾mão&Žçq-³êvtªuA­ V~\FL¼µo³š¯Ö,¬…�AO¥J¢~5¯�žömð÷ðÜb�0˜'ãÙsfwg ‘dé8^Áö-û;Òì#° êö-ð…]›xk‡Ë-‹tº"72ÍÈOo\‰¹áagL}i [»Ý×Ô²sw^>Œ,Tb%âGfƒ6bökô=þi4bVG ‹›žÚÖÁ0 .7ÑfÓ=!lÜ"/Âñ”1Ââ®8qýq~#B‰ã©‘Ä1]‡;ŒìfÅ5h>I?}'¦:KNr9`œ*[C«%ŸË8n|R 7b¾¶`y^õóüI7 OÀ9 fð*úîñáSµc- vè¹!µÄ.`m‡�±m âOæ+=Ú¯§"Û¾½ºpA€Š¥{Õɉ’Î1˜DÔ�ŒtÖþ£Ä�üŠñ¡s¥¶^'€A\(ÖuÅjQlùú6— Ð;‚¹†¡Ø¸û̼™oä”+5Àps·}„¼ŸàÊÛgh]CH^Œâv£ÈÙLÊéÂ03®L |nI*5ЛÐÞÝ�°›þ·�HŠøÞ !¦^mîÏ�įÕÊkd¨:zí÷Éàƒ*à3Zº 4 ‡ãäXìm ÁMŽT44F6ì€MdöWOQ²°áUíÎð¾in-¡ñÝ;Q�|÷/ip�ño\æ5æ)†®qHH¥·¼ÐN�r–¼ ™€ÓïÆ²Ç¤=�õ'ocH�³Ae•5L; A,@Zºz]8Tƒ¸0ìA×~Ô«Dw}ÚävéÝ=©¬3À: [yí$· >sÌž8±+±Õu˜îׄ§•eq‚ÁcÒ�¬Ñ­«ÇX„”ì8‡ YÓŸP^‹ƒ¬.%µ] 5$a‹ÌCkÌ…†À?)U!‡@ë§[gFÚ�s¯˜‰õÍ:DY±ëkùÃ,l±ûÄ;<ÈA?xÄg­²3mA+O·KÈ<öʲó¼Õ�Z|÷ZµÜ’m¬*Ü´0r}¢É-"Ø §îÏky-Ù5ÈV¿(@Ý‚kØ ª—*GÖÃÇ'¿³kËüú»sã`�²ãBÌQ/LqØøyÞËö³ˆBÍѾ`«Zr·ò9I6,)Å—é&epƒKmÕµŒ^詉&É©ü¨oÈâíÇšIøïmnü·*×’õC—a%f··`Æ'¥FÑc�ke2‚Vù6„õÁÂæü>T‚­/ Ê>@à¶(ÀvD0¶èrÞ,¸ä<|žÙ7©O@G_ܘIèu€åo°ßy}"EµPKè#@&[¡÷wCpb0vm%Ô¯ºVĽí�Z,<ê7ß'ƒ¥ V_£§Ü.9Pê$š\ãLìOzŠˆÀ³Ú;Œ‚'âlkxi¸= Yƒa†~ÎAÒ0§ÐÔ:©¶!�Ô'Ê|ÅsT8c®Big†}®¶Ôpàž íyºÌà£l¾,äg—’ÝÁ-Ë Bè.—Ðã¨l8I5=£3ͬÀKZ D�6FÊÈ’¡›A̱‘Œ%BÔ¬Úû ÷]Ä#i Y—A↜Dšðyé‡Ãw{Šesœä!×I ÆBúò¶kR]kÄö‡RI>0yév{.x,¹Ön[£pµ—Rd—Ã^�p¯�SŠŽz,N¦Ù~™ÒRÑa9l©±®@ÿyñÆwžzÏäÀxNüñãøØB«ÛCÁŠîôs«‘=Š|gW5µk¦‚q5¨Ò?ºeÌr îpÊÙWÉþª´]öTã·°¥ˆ§Ô‘C¬(`h üõ b>r"ÍŸ–Âö�c@úpM&{+’9)¶m‡éã "Dþ¬Ž^ºO}?Ù¶ØôÉNa¿lS891Ny{Xó_œz„횪Hù–Ïa¿Þ@ÊÜ7ÂŒ=ˆi6ú=�WNÖG›ÐäšÈàŽ.E¡F&] Ý×ÍB/V¾PºlŒ­ÁÃC �ì]¸š=ü˜p•lvâ„ç]¶W&Ý|qƒ�ÎEÛƒ­h`˜þÞ  *õ.uÞ×k*’Ú©(^y®ž ô»Ù_¥÷|ÚÅÑ>Áó}×D[Ýø3χ!=ؤtù­Ü&œoãíÝÕÊÞ Uõ-�ÄÛÖV‡Æ@ˆ~Á[(ÑÍñ™‡9³�til¹�PÉC½åÐ3ϼö]~Ù‹ô8‰O¤)Ò†÷\%' f}ê0ÆC{_[Tn¶{¤¸zN Ä�7€âí±äÛ)‡Ëma¼�ò\tÓ<.¦²³ðˆä¬ã;²¥šá½Îi3dÕ¤�bÄHdÉ/òí‘ÀŠÖ`´­îÑÇÃÉuÝDÆ7¸|7Î|YÁnÇÇÅ-v�µÍ®â_²ÌO©Ñ .^bt:|šY� [-V´§„Hµ›'«¢êùÍðµbã�äb‡ j€ÜŠ·¡lÊ*7¹`Œ��#�rÓ÷,_Ûäë×<•s†S*ç5šI+xUü¸†uÇBÙWÁãë\7¼ä«»ŸXåX¬k±Ìoª"÷¬¸S&ä¥Ig»l“bì3”xX0¶«EÑöí–Ô[hÎío U¶Ä_ȥѻ]lclÎ&òÏä¶# ±Â’â¢w(á"BƒöwM¬]ñóYÅŽ,-Vô_ñ×�WUn+weânKóÞ۽R}±‰"n¸¶�œm6€=ûºÊ‡Wj…E9_ ’Nö�¹!â8|:îýl=±”¤Ï„ 8zŠ#Ò´"9žç#kâ’¨{gíŸAôÆ?Pgî_?�[kÞ~ýúÑDï¤ò+:‡nënØ”Ø^Dp;,+ñŽ:÷4·Y'ÐÎ�Y�Õtç“û™'b>p8ÓƒV5n˦z·e¾W,*¥â6\u¸ÅF¸�çMpb7cÜ^ØT޳‘oÈN'|3¸Ò“#j0¯Üju“¢[¿u_· ]ÊÝzÏÈ^õsÙ 5œ 1G›E©l6±æÏòæ^ÊÍWdÈjÔ–ÍbZZ2éŽà†¦Æ³ËÚÕÈׯ®È|û¦ #g7»½rž‡[œ*ÎKuÏA&Š F TŽ&Šp# ±�ê|·¾ßGvÿÇ8ï#”Ã6élˆ@Aeˆ”šiˑߩ¥ðb÷’ƒ]BEIîßì§>ðwŸ£Šwj «¶6H^¯éŒâöó� ÌcR°ø å• ™§À›à/oº®å)ÌúÖ¶Ã[`3šRË !oËæ@çÒÐõ²„уÜÐF' ¾]ƒø˜*JЀ’ì RX \T \Kß´ê…~?kÅ;Øš±¢:ÊüxÔÞjkÓ¾w½c’ƒ”¦&øú{@_°)[el›àq= ™Æo¢‡[¶GαÅ¿ &R$©ú´¥Õ;Äêégò7%ìÎíX¬á/~«™o@§ôú£:bïɆÎ�·åßz <»Ìqžoî§ad‰î–S‡Ïe¼7¾æqò*'Nx|Z°s•2xçRM·Ê:³m>Î$c,ö!+9²“›«ãÖ#ÈïGSm!3E›m Ks˜.gÚ[YÞõûMN ŠpõÅc¨×ÄÙOm;PÞ ¾üëó" fu�RœŠùHkmì;#aEr1`¸)Ži_²Ù*}hÑRrù·¥dCì»’;ß%ÉÀz*ØTÂÉÝþ¶2ÜŽa9—„ûEm‰6Ýì5£uÝD@¢?µDƒã^@ˆ™m5.ñòh™‚3°ýø?dËm�âÿØÌ._R[*=Å\x§̶È]Œmb6ºm/ìñíí'Èq»0µÏ´å»/ˆÏwÏñ�Ië¬<2ÌÜ`�K1Âÿc¼ÿ2.¶#èbÇ\ZÓéÆ*¹¥û!ZÞw]Ù7D`7Š×AgšÑEö t,› Æ·,Hkï›hê›ÂFdQÑ+­:P"cÂɨ®×NChõcÏlÅWáÆÂO®+Ç[¿¹Íªs˜¢¼žìºX‹+Ú¸>K§söá,âkøðXUÀ1mò-}ù™.e1»ÒËÎXðÔÈêT"HŽqZ1Ã�¾gs�“¸ ÓË[ÚÌ­½à©fÅ>P-9�¢fu¬X>yã߈�ñ•ÔÁÄ…<·÷b¿@_-ì¹Ám¤(<µ©p2û‹×l˜àñÂ4¢Â&,9N ãAÓÑ8õ–¯³sK¦1Ý~1p,ÕšÒˆEqR½þĤK�…šÅP‚/ÆRïEQÑåéT9‘_ÂmǬ˜ �|1„fr’ÀJϾí07¢1BG>t!5¨{«²‡Ìþ+÷RC•å8g†»&t/ŽT¤Áª?¶´š”5t¾ü÷TÐ$ÎÎ!�k�Í�êöQ ÇÚLCÑÙÁ8äÐ&½ZØ`ã›ÕÚ£¨Ç€�ûänrÁQàØ_b~S¢®ú>iÖ ‚Þ»ËTÏÓr…r)ö‘¶«ë·]¾tÃ}Å»5À ÈŽ;\D³àÓCšÅb•ÂøFeÓ$a÷Õ~otœ¿9I—QíbË}•|@U¨V¸�©ú—ª\ܬÃBØd¸©´/K÷-Úï8&’§×ßÂÈ<ýߺw§H0­6ŒT¶*[Hù¾RÕ`¨^E¤7{÷ÙˆXô6‰Åã†p9Të ®‚£ ÿ“®V¬–ÏðݹR`c1´ /�޲ư ØjGù‚+ŸE¤Â‘#Ä[-�|Áí‹ôò¤ŽÛ%¼2Î/QªÊ£›(><³ôÑ!Âó<™6Qh(%#kˆzðà×6ªŽm¤/¯R—û–aNé!K†•ÐIäÄêý;]±Úáf 6ûo;òæmÊ Èmª¦ýG;ä 7˜¾ ±’ :9òøŽ@aš}‹ËÂf炦ø '±‰d‰Ü< Ç~=®µ¢çÈù6[­ì §‡öu@3ëÕayðËh§¾wî‹ItÛ•¶s:Ù†Ì4�ÏÌR»½±‰ê‚Þlz ±›¬5û¤:‘ã`amé°®É5…b ‰nூEõtÊ¢0%ø“o< ©y©»h5œ¸áq”J�vÚ@Ó-ÏÄËXp¨£ÚË€º‡"ÙÚËT ÏN®z,8âECƒç•Ü—ãk7ˆ�¾2¡vÞhaäX8íÍ(ljHüi-JB–Ì¡‹Åj4Ö3.ùÚd}ß¿vÁ§—ÔEËšç[§§Ø\¤ÃP,Éš”Ü1!Vðü…öµÊ`º?¨ƒÖ=Ú�\‚7=CïÂÆÞT4 Íσ{G�•ÝhĤ;Öª. �~œky…#}A�…•q—ø�/x�ìH¤$ŸLÍ`Ži¨{[z�¢žÉ¹£ƒÂÚEéH Tl%ÍÖ›âtFÜâö¨®g#{cl=Y¾í\À¢Iw5n վkZ£G+›—ù'‰–e¬]µ!C`WX¤�¸”Õ>E÷Žò­ÁXíÆª�‹…ÜÍ}OÚ×"⿪¸ çaŒnþ»‹6¨ÖHùŸ`‡?5`¬óä,à¥G=ÆA'W Õˆ\>>Ú3½}1A ¥ã£êÕCcÛ%ŽàzûOeøë‡sOX¬ª�p !Å�ú3bð1;=ƒ|¸To4Æ`Ȧ ¦AþÎÕɶ¿o¿¾“,¢ÛŸï¨ý�à0«]"Àå÷,k±Ž&,1éŒ0Åçàz#G¶ËDÕ–#ƒÖ/YÏkœ†ý$ÁËJú¦Ý½_Ô¤]•A“^¨nœ¯›Q”»Ñk:.„¢¬�^I\” Nœ�Ã-¢¢×Š™>ª%Üöš0Ìœ¹ØSk‹Û[øõ~¿úy´¡U|æÑïé’”¾POÚœ/î2Lâß¶¥áWQÔ„RpŸÂ{âÛ«VÔë¿s@Ô:O,pbé9ʵ¯iõP=†kôF·«Ö¾ûÊÍ>NîO˽?7‚tå ‰s&nPÐ ñšÕÙ×XÊ·ó£íO?–îØV²0þæ~øÌü†ÜÀ^‰{¥œ;öÀè™`;×D+v× ®ód�Ó@Gw ¼¿,ƒ!»ÜÇØ…ªå,¸="ïÓAàˆó‹ºC#ìq® �ˆ Í‹—"Û{wÚNq¼|Çöd´C¶4Ý­„hÒ÷ñíøÅ§PÈþ�±2~»ÐUjžR˨F4…ÂLzäÛë¨]÷8ʼB\ Àæx¼m RÖ�Oñœ×2)ÇÁ†P:˜º�ߣÂγ{ƒ.ÎÖp!Dzñô5;•Ø‘[=|Æ9s” HAïW¦ò�VtCk—+©@µsÂi4À— úÕæn"Ö/ ‰! è‰Ú¬y5Ìg³¸Çò³EÝ ð"‚øºUþyšÎ-޵ÁîȯE‡Â„»n±ð®,~`ïÙÅXä}å›ïØ*¹ZÅk“ߣRÐêah*²ÔI- 8(Ÿh·f6óë§~Ø|4Ò]§P†swAƼ�_�W×kß7¸H>ŸW!gN¼vO, 7µÄøÆ2cø¿†ˆ«f´h*zGxds}–hd�;[÷µª�NÀ^5³}>$¬b§• IÂ)ùͦ ÷빎aܬC¢ƒpp¢¾\À‚I`+î=±ðNmò¬@8WŠ�‹ì–ƒnÕ‘]MXßÈüÛ÷0¡õ¤óÁ�0† 3,&ÑA¼<¤[b�ZÚb("cŸœ&7½¬RD�´°±£ žó­”ä9à<±ç®�¡¸V', V¼‚-³dTu¼QâJÀ!bûM#Y=Î`ñ¦ јQ{ó×Tp Nåìíјw ipÚ~©¨�P ŠÀ‰ \„×Ý]Ûq jCŽ ‚Zš2fƒ÷•cq()ºkþAší1’ZÛïpe9‚(•þ'ˆâ÷-ɱerßßo"×#„TŒžŸmú³{960A!³ˆ<�Ë|5A»ÁFþÊFôo¬e�S�_a‘¢²­Zûذ€ÍAg›_Øóë:µ‰¹ÕqBn‹¡˜goOaÍÛøá „ –^á8·“+=g7YWá›áÍ_–ñï¯Û6€ÎoWè Ã쳇&Ó¥šŠJ䎤ÁZ%øehÊiÂï÷´†ÕfÈo€`i¶‹®0´e|Ú]m¡TÁýó£K}�zNŸflÕ›êM  .M[ 4 +˜Gâ jåÂÏ Pvügú%õ°KBbÍàߖŨ& MlB.^†f\8¾ÿ>”XÖD-g¥ÂëÆq}n�ƒŽµO†í8Ù©Æb©BVøX¼8lðÃ-Mkâ Ö¯îŸËOŵ¢í…êâÄ}XFóyÎû@Ø2=µauvß‹âò˜ñ+¢—¤0´»?ØiZ½c2 �VÐð±ù¼Cn/{­Z-:±aàC A|ß2åÞåWµmÅB{öñY}r›ê3ý ¼¿E›mc�È ìl˜;$µ·}lÕÄ©UUÓ#·§3úÄ 0_½Ü" ®ÿk³“l‹ i¨è�: \Øuhså†vâál0*rç�y¾YôhákAi¦ááÍ�––‚>€wo´ÙÊ­q2‡)œ¾Aÿ)¡fk½ÍY¸á A‡AŒˆ5»²:j}�Ã3¢\­=-ë8hó`È ØA= !y‹,A$$>ž²‘Z5<¼iì3É.”¹ãYòòiΨ- ¸¨äÃÐ^z\÷mðÜÀr“¿ØÖ2ÚÛB®¹} ±³  4äC²æ8ñ¬ 5' 5ó� ³†Kì%i¹2 7¤ü8¤Ô‡¦�ó‹nÝ/™h›B ©¼±d4 Nž›q„†ºõó<Ói t-qmý!¾½õ péD”‘TèïìØ`ª)urlØß’Ü!TÜcHԵعóÌ„ˆÌAsâÛÚ›õ'«<ÊPMG0UÎ6 !ä~dÄáýz`0Ê4{Ãí>xAÉå9tªot#6>)%`Ä…ñ¯æùKǶȆH&8þíå‡�Ö •ÖoÝʱ˜…Éw¼¢¼œ+’‚íÐtë¾y�±?¹¬zZ°Y>ݘúF%„³æÃŸ²ò¸(‚^ªP]Ì ²�ß°Ûõó”G—´©YÅ{œ‚>SŽfIÐkǯ'›=´’47.øóßê-æCëQ㈻…Ð0ø2›OXŸ�Û`2Ï�6õ‚¦æˆ6~E¿.ä™°}Æ]†÷,à½_nÉ­®ÞÎH¼Sï£mÓïË@H]”‚iELŽ.I°Ô9Á> Â' úºæ Ë}åd»šd³y‚²Mz-ßú¬¦x›€úå� ™œv”ú«"EkPï³çäg…Ý\ÑܪA7]FpÖP�˜jùâˆr÷Ô×FWšƒ¸O+‹iÕt·«Án¿Z/ç{Õ<µVsv/N3ŒÒ‘"ß^7„ àÑSÙ4É,¡²±P°Éòµ±È‹dã–¢µt$¨Ëí^Jhç¼:(ÀÜÞ�eÉi„PUÝŸ·FƒsѦ,`ÒfÝŒÌ6@4”×”ŒËt¬:(Ýðl¤#¦uð ÖSP¯œ«Î“Ô7±N¬¯¢MgÅØ§†KkoÃ�3`‘··˜“ SÆcÄl(8¢kkÖ ˆj´¯i$u2½fÈ#^ h8U”Ul¸þÉ�°þ@[ˆib�—ãLx@3zZ¶òKFæ·hºD¶'æ+6­s0qµ�‰ŒK´oœ:$âl7g“½ +”{·¼÷¥d-É¿Ë&2@e‰ É)vß@mÞÉ‚²ƒï»pç>|�Yƶ÷š74Ƽ.$©¡îëÄ'XÖ&óœ"ŽgæáþHÄo"{•Fžcù^®b!à£;ÖþÚUs\.¥”ôƒ§ã³F±ÐñÛá�ÖQxl!õŠîU%s½‚�Ôl®amjÂB®Öâ¬Ò,Þ®؇zt °7"ës?f#óŽ{ü¢üÄ“ß$.Á“¨�†OX`ÝÎX^Í…Zc`\† Ê3LKóéJÓ›cìf�ÀzdÖ*eÞ›1äØw@û�úÙw’eP¿Çn�›UøçĪ|ö*[�EÎ÷cØ�¿Oš™$�ß–²ÚÏçu„ R.<Øèˆ€Æ`°P¡<÷1©NHP÷ò=�‹ë0}¡Ÿ—å°b-AÈŽ*Qižò÷›Îã¿q­à‡”ûZÎÑ@ƒB ÝŸ×EÚk>±9ɳÔ¼À NT¡±ÀõP9à-�ç�œWÚq³ý@€‘K$ý5|$¹o¾{màªåÂü¾l˜±#y%ôÔŽy¢ïºOÑó…ù¤žs`@Ëwjøs�Ó&›çÒ}è¼Ý#%�}4ÿ }€äÇØŒŸ5õç…•@/h›é>ÃA±®Ò†.¬¯–‰? §–z%�ê8~_°kÏë(½,¨¶œ%{Ì|gx"ç_¸dWÅ[:Û¯ˆ'fXÐr(ük×|]4AÇ3^9}¼b¯súŠâ–°VfaÐÂc¬îQPx¡#ëAóûD®<óVI¼ÜÆf¸šò]~ý¿ßM‹[îÏá×nŸG‘%|�g`°qÁ°*_qÙ$åG~d,Öd4‚Ý«ÃО�w¨¾E>>ŠÃ~]U÷kI3ä/×Ó86ˆ899Ž ¦3/ ÎîMÊæ]¹)Á&ñI¸µ¯H"$ØFÂÞ±Å�¢­7yègÕ|÷\ßÓBØ|�P‹E‘€À�IæÙ’\9ÁC[‰óQºæÇOpÛ nÕíßìƒ8Qa:—ß)KVzÛcÁ_`úp³åÚ7¶é…�6žæ²Ü•¼Løèü¿¾NRxÕôÉ'”«·„^mSaï׉›=ë ŽSšçO€npvÙ½ÏH0w–sçíup¶?AOº§f¿˜QÏØS ¡çgÖ¹Pm¢É”â„cÇ?”3DL¨t�‚oîžyîö ÎõÍ hx¡Ž_šCAŽ®Ýõµíá­ã°o¦°/–ß5ò8ãNë}Ž*ñ©.ˆ}÷Š<2R׫éOZn’y±wÅ‚MFÓÀ@>}dôwx% »ëu†Ìþp‹C–­±Å„-cåÐä‚g!+�ÒÃS œ~dD‹þ¸ÍLP‹]½´u�fò±O‰ŽÚìô¨%�’Ñ€^À/ñ7œ&*#'”ãçNíyLãÔ a¦rÙ±‡ •ÿgˆù\X2Ô Ík‘ÞâE1ò>-8á÷4*ì•ݧՌ@pH@¬cŠ;åö‡«;{x`''Õág¡‘!,›_¨�Ž‹²em¿µðD†¯º¢,*§'ŠãñÙ¥( ì(¦×˜Â±3àA9/°´™¡µ…JÉâ/MödD]%ö†ÌÖ{À^^ê ¿˜’P06�ût³ßEwÇÚÄáye¾¤ëÖ±ãá¦þ|#÷'ûåwCP£ÝèB4F›FÀ‘ÿÌbFÚW¼°`p5û `¨*�-鯬Á7±ðVèÐÌX-\¾ÆÎ<ãü†!Þ-ÂÜ¿*tw„Õ~Íup;;<¯µüø¬s™Â™‰_ï@OÄըɩ>”b‹…Mø¡¥P[~ÿNž�”(„¦(Tz?´5EXy�O[©fæßßÏÛZKV¹€Ä àîÂh ?ÑŠ:$ñW4ÅäV¹ß(|LkùJù)¸‚ß³vàR2«ªÈ…r­àS¡FP)½,a ùY*ØQ+Ét™)ç.£!�ÅžK“‹U.òó/�R˜²�L\Rm¡ËVŽÆ?\P¨»°\)@3ÿ3bíܽk@‚ð“~“wó^××m |Ì]‹1¼ŒÉ�„n¶ЀGâ}ÎQÐ$šÇ„: &»�EMBí|’šŠúá¶÷V"Ÿ/;²TçÀØØŸi’NS6TÔÏ?L(Lw$]§SÜ¿Éjž†�“_œƒ`•í…��¾Fê ¼¬Ù«7_“ªµ½KϾy“ûêźPš Z•êJùºÄŒ!Ÿç”4•»xZtWmŽ6�{e[aâ¶JC8\v=Õás+K�‰ŠPÑ^ø³™œÙ¾�£\qÚ…¹�‚Úâ�º”ÆMZå³¹ßTç¼ÞÎý¡w¶ýº¶ðùç5ƒ´§c­µoµ}©|LXŽ£»<3™ûž.§y‡" _¾~'[ ûEÎßèîh dEïmô¬¯$[^›cÛ,íþ_±¸Ú¶é`hO­ð—Ï #rŸ»”;\/ÛtÍiƵyAÔ3Þˆù«C£%>¹_²m¬6f²Cµæs!%؉F‘.ï 9;½-Jq˜¬ Ýg}²ƒwèx;æÝ|^óÑß…�Pa''ñfF‡ðöIî9‰Á‡Ëûê™râ6‡èÔ9÷Ó`®ø¯g<ûŒ=#?·ï´·’èã�4¸Ñçr4⇧4†c×�lÙ)HÍÞáb›~Œe]˜·verØ¢1âò,<És�Çã`ñ%}ø<@ 3v†IÉäY}NÞßj¸…|¿/ì„XíÍíäJÂ…ù?;îËõtõm¤1ÛYœ˜ìüÁ�ñY´çœ ºeO$5Ü…Í^ß•et)BOžÒߦ|³r¬²…k5®]Vû䇚 |÷íä$ÙHƒf†v™¶êC^ê g_o}ãoÙGŦŠ'"Pý®»‹1^Ò@8Ñ“�³xyUf�ïH8¸�‚�˜øgÕ#ÔŠwXìÚ63ãÃa¸Öw°í¨ð÷a“ëݵn#ðô cÒ qI0�k�E~6gœÇ(3_lï‚£·*NƲߺ»¨ÁêýÅû'XÀ�tØc9ÞµÙâ½H!5^+¼á¦tÖ'Vm(ÕÃqÏÙVÂb£­³¶Ù³<ÇÓÁq�ºþiâïÞ;ªÉ}à…4Ÿ\ù­z5’ØBã üd¥ 7´µap«Õ?�T,>Þ½ÊÓ� V ;e|³ßeB 0ÔÃÎÎ\oÍUíCaçì%—¡‘Ïéœ!(*àL Ÿ§ß{¼ùèylÜ|Ø ^ûžÆ†}«¦{e@¾|Õ–ï~݆�›w †Þ-Nà"ƒ„/°¨¼}é sîàö»’°®=Ëbm:ù5édÄ€ÊÓ d~Á?Û.�‡¤¤Jçª5\ÐŽ�No€¤mªû³Ò=qq¹�ÐÈo8ŒG`<6ùgè‰�~©|øðf„† 8g,z·Ï ¢·càVžéÀß›v¼»ó—å�pðHChmÎEÞá.�ö´Õ¶pª‘XÆ·³ÌêeDä8çO{Þ_ ’…îzÃNŠH¢”�Aðhë ¶µ_Wµ„iŒö@è —r[/º‡œÍe�G¸\H;‡�ÍÃf)q0ð�=ÍõK�ëM:PµX¢8Y�ý¨€ÆÂ× X¼Äý(H©Œs—`š“ºÖ¹+&щsM»7¹q,QÔ—5Ji^2k�)€‚ijÙÚûËÍÚr=„Ö^``Ò<ù¡¾ÛBxx E9î�Å,º;±zÚH.Ó܇vªÑVps.Ls°¦Ç1f&e~½îæñs lñª£k+)Ztü"ºA‹»M§¨Y«P1ª©÷Õ†‡pY»x;ò,EÂQ»(×<éÞ žÛ0·a«‘QYY«‡ 7äÎÀå:5Á�U’PñtáßÔ­q^Ÿ]»•² —sØ~ä5ki©èoÓu�äp_qÖ{kºæ¥yÊ_O…ƒìJ1é¼m«=RªÆñ;ŽÞGØN¶®1„¼mO¬@}µû‡4l¶„`Q¹yýÎÚ3k2À—•k†¬b@„²O»¦ ´kÎ!øÁÓA¢ÙÍl7Yc>§^¯ˆí(³Ò“úüÊn÷ªÅºÑèQØ>üŸ™×V4•á…¼¦x¾$'ûzã3ÛÑÊ k¾[ì6rû¹fãauc‰´Q9–˜+GÕÇ£åŠÐûÈo^gLlú;ÆÁÆ_LÏ·J¹9‚rß3)ͳê®R™Uµ¯�qöÇC½"ˆÖÎÃoA�ƒ!?¶ûãõn[qù\‹zA*ÖìûÀÈÎ�vÆ¢…]pU¬«GåèmÁªn%{Öy4r�Û†&xgëTvZ žpÛ@Í…Èk°¢^Zׯsö€¯H7¸¢ÍÛA›w¹ZÒ¬�„¦y™§ „â"ç6Ôb—Ðlñ‚üBvtä4íÈó¨WÔ¸]Ë&%h\;†y¾á^³Ì]äÚù�Q¹½¥OȺXÈ0Þîð�|×¹Ѭu:Ö×RwžA…èÁŸŸø~ÀDŽîU°³ÇP¡s9ÌÇêÏ+Nkܲþîc‘PFïH„y%/�ÆÅ¾ZÞÝ„¤uºËÖ -Œmƒ¸˽D�ÞãU·Jn×@U·nbXö MQ«Ö8?Án€ì¸€H÷Šd’Åc Š6Pc· 0DšÚZ<”qp˜rÁº›BÕ!öBEY¸Uùûw··f«€Û2 ]´;KŸôÑâK+ŠàÕ–‹KÃß&4Ëw"@€'åø’ð}uTDø\ã‹nâ2 8IÎÅZ8{éd,J’Åñ°©¦W:¤N�êíª «?ãžJÏáúØí “Üäv{\²n颲fØšO_kMŽ\&ã;åºv¸† Š ,²<°†*³~î9š›éÎm“ÝB×hÉ&nŽøÕ0<Ãé5—™Çäxî­t`¹ßز®ë«�ëÑ“Œe7/MØë›ºmn_¢Ù'ä@¶Z´¼-õŠXs鱬O« !öж™Ø6jÞ±¡Uu¤Pâô<Ö/ÑêjEi¶ìc�~šÄyûvœg;>×o-41lò;VáÊÄ*X�+„C:ˆƒañì¼hŸ§)ë3ŠvŠê9²žû ýÑ`¸n$íÕ¥,9°fÆA†^‘7¶‡ñ!ÑÉ…$�€e/¨Ø@Fþji-Údqq©¾­ò‘†ÜùwŸg9Hû¤)mÛ)˜9Û…rŒƒzÛ�9½<“9 ÒE4¶ˆµ_ë�{Qσh w¿[¸L»SØ|Ž3Ô]ÈüŠDœ4]û·×{zÞÇ—Ï/]Ï9ô,ÔìëbS|-†®†ú]ä:'-•¬£õu´¶~žð6³ÔÇM!ç”lZ1ϽªûèË…SLˆQúvêªgš6ôm{Æû_¡—djâÝÕ£nðŸ;O�€pºXŒJåL`�Ü•¾ÎÊz¾z(A‘±Ô«o;´ŒíZ“'ÝÞ7·wÅîG•ık?¯Ý«[¾¡ÌÔ©œåãN½ª¼²Â:Ohªó!ºú±Hï:Çc§¦.[ _w™É)¦WÑ-µ–Ê£RW^%Ÿ9@M°³8#¸úJl9UŒ ·Ê° ¡~z§Zä„_/7ⱃ¼9sÆÄ<ËRw w^\¡$BiºŽƒã…sö`zν‚Bp,íܼX?(뎪�ߟ B�N*“!0÷¾<F¦{Êk[¶ Šá~ܯ\f9$NXáˆBšž�Æúå¯}Ò7Lµá¾ýèc-¶¦¶;~{šŸ”R3ËÎ ÍòŽM„E¶åVçš?Œ ­§7EÈ«àO¿†ê«…|¨ÐÖyLXÁ´…×N=ÂÚ­8)dK!Ž¡×Èáâ�1®¼$ç |¶Ñ#•I€Œ@¹¤µ“qæ×ÂÑÊÁ ­¥¶ íùÖ.÷¶êá’`÷R·¾>9U7k’Á˜,à\SÛpÖ˜6_,¾È܇ UëI6Ö܉®‚ÄW«öìXÈ[ {Ø�à=›¿ájÇ-ZÅqj϶ˆwéG‚(2-ßÔ-‹é,æ³oÍÒÈAÝ£«lUª1–ß�Ç¿qåöWQË)æˆâ¦ÂÙòýQØ0wŽAÎÓûwÛ†ÄwÃMv5íSפ3Ø ³QÞ§ �Ü&©03’ $j×dÈ„:AÊ VutbW¤ù¹]¡.*Ï  U€Àió¢”§‚ËÝj¬böÖXnâa™|i.ùy|HÆiÈRO6HÚ]ÅXFlTVF6 Àþ¹ ËEÆ ¼íbÌ÷I{þ1ê"{šçIUZó_b=‘¶�h.ª!î–ËB˜Z }‰jìœ%§v|*†:¡W; õÑÒÚ\’.,©�°*(ß¹Öð‘ �)�øçB·O”ðÀgcæxÕ¶‘€TàFŠkøQ» § r*`,A¦›:äJ}ï4<†ükPë[BªÂž˜¾„ëXaBza$¨—E”É·®`%1(µŠ#ŽÉ[4æ�™Ø|“¶ô|u·«µ®I$F8±¹ñxåPNµiÍ<, ŠVö&k³à´/FôQÂÞÝûI, ÑÒYû®jæeFO{_¨cBiÑQûe´rvj�¦kO=ÂçÇ®�é“-鸆U×+Å”|ý\¹cØËt0lt3Š"MÃm‡.ˆhȺîsNjôqU‰‚-cM<¹ýyªùªn�à LÝå Yá}b÷C+8"{7*|³q®—m£3ƸˆÛ qáÂd ¼<¸*Û©Ð(­�VïHÊ©ó],+×Ç‘¤/ykFhL „m.\æøÙôøÝcß×…^ܤO×aî4F ¨º×‚ðÒš2ÅA^ã�f ­RÜH#-;—QÔÖµ7†vŸ¼’VÒCý5wŒrre°�NC<2æÉS‘Íó?'5!œš“_ÊÒ2"gúJŒöŽ;¶ š¬á·k^ÔÓLy.3¥g׃´é¸*CmtË  çVP ÷¼K>VN冽b¹§û“ò¬?[c] S]‰�jc»„·½z¸¦„fO[ªÁˆeÜóÃoÖ»ÄÇ:wRÐc7NqØ*Urs7õ„w¿ÞEøXOEô}=H?®_ŸÈof2Âå~…´ xÑi9ư p‹3¼ŸïœÑ…ß Ü0µ ðg…§î7Û¬º•�J–9ßd¤8|ìçu’·2Ç–0ç{Ë¡¯7nàxÛ/�·¸C‘ÈÖ­v ÀªPöJAµ,¼šÛï ­íé ,–øý÷¾0؃gܱ¤Ÿ~O1Åw¼ +†¶f²žNyÖX·3(™ôVĤÕ>=*“|åä,É>{â„M¦çŸã„ä|»|�‰ió�ÒÆ?–»«nÉ›ó@8Õ㶘¹r1ýlÝññ5my©õîüævÖ¾Ò<¿�œÈiï�½ÎƒŸ'® {ž…ƒÄqí"G£IÄé):nB±‚-Ò s–Ìg.Ñ™Lî‘R—S…î×&±orùíì9¢\Äñ¬�ÉŒ^³©Y‹»&Ç+‡ä:&e��z [yhаÅï’‰Ì.´½57�ÊM³;>lGKÏ·dqÑ$Cç¹ñaåt%×i‡ow^mÜFÌðAÇ”×ÍÏo<¤&.ÖÅÅÝ*×î) \24�1Ð êE%î ÃÙ©…û[Ø)ŽÑîCλ^¡©žO¸·w¾Ogö ÅØ�,ìyÝXUÌC‰¬ÿ&4Þ”YuÎ;8�öR óg0Su* ¼t�ôc,»gÇŽ>z“ZØl%·7ßqeãô ` ,y7‚€.ÚÝÀ[ñ„A¥ÓU’ÉqÂ@ïwx³ˆÓ~ü+•t2 ÎAêZۯРaŒYÜ‹W¾M<æ6ò`º #ªdÕÓ–…Ù…4\ˆµ×}ŵ…]%Ne;äÙc&XNù1@{›3 ³`гšôde„uÓŽÞ$㸺dÔó« ±`•Çp«±Ä_øa‰VŽí‰í8ÿKóüá BÄçB_ŠM VÖQV(�ÑO´XE½¤ œnlX‘Ô€[·ýóg‘1oÒÛîîk<�‚ J:&Ðg‚°<]?35“ó�5Â[v‰»‘4¡Êj `+Å�Däâp™TIoam�Ù‡BÆ:2“›aî8 †Lа÷ØúÂ4Ì隢J`@«Þm™ƒv婬Êñ€#Éw=´Û{ݦ{—‘@¬«ÝŒW¹gïëkl\}kt wÖ°È›(�U´ ®õ´À_4kž.�Ó¨&vªBص`�˜Œ©°î$h¶T!Ò=\­ÚHà ’OʼKˆÍbBÆŠ1!ÝØ9èè5¶ÿ-•ÿ ¦ö�¡+ZLYZ wø«�5µûD¿Л̼rå‚dšÅΖè1k_ëÞÜ¡�¶PǸg—;Iþ¸„/îãÙª6‡Šf?” ñh åøIÂqhÒ–lÚ7󃻜C- 2Ø€þ›Ú±T£ñ‡V”§ zÞCJ.Ì*~?|Ñúó¦YÄuÀÊMCž}`ôV-½#JëEEÕ�,:_z;¦[¡Œ á&ê+»Cg^!ígGZ’²)‰»@4=0©ûN«€é4 °d3»êÁÎïÓ ¥`»¬qBjù»8uG×§Ow6<ž£z7¥$%:ý“·k³ÖÜÝl—#©l嬥eaw\s˜ù¼ûm{»ÅØúyÕt:{ÖxyHôuÓÌ�÷Õž¡Á¦XÅþ+Øî5vœj/A ¾®:Nõaœ+o¶³hwÈnë¥�¢ÒkÛ« cöÁ¬Mì+èbL§ò ½m;Ý•îükiƒ¸a¤SQ~Fw8`ö~›@ô~»EÛnÜ PxX{7T�³gøø¶Õàr —n“¡Îï;WWè¸' û ¿Ê?a«¿]¢î‘ê‹ñ à_XÀPô—õ´pÒ˜€[ô˜óÛÖ—=�q »fÚÝi¥àª·¾©Š e:œïÇËÖ ù=Mí3û ùt Šp+*׉àÞ_¹¨ªCÐúÀÆiîuykVâ#s$”¹U�”ÀCŒäëó¬'oT(¦J”U�¿Ì¯ŸƒÇ(†I'ðÆŒ2ĸ»Ã}Ëtô)èp ŠLu®;Wòàò}!CÛ½BʬhmŸ  æ˜5d)‰ð¾ -äUÙ’Øú˽Cã)D Q`;âõ”† I±á¸{pÜáR 0¢â—+�.¢Œ»«Y¤ö‚|ÎIßõÆ.¶ ÕïÀÞ±Tx¢M#L%saÙBæªÌ�\¹í™Ž‡í3Ž�ñÌÇ)”î•9gúy&‘J®.°t¿±¤OzÃð>ëcÚL«vyÉŽ(Ö¹õí¤"£à‰äôœÓz·D¼¾ç�l[vT¾k/� Þïîð[³&È»,uµ-�Ež¶ØŽ§õ/ÏÛ¶,H·Ø×T#Wp@¡ç™Qt ‚܆ïŒ&‹t½«�¹ð,ÓA'|Û)ü—¤ �mBQ:ª= ¯¼ ¨ö ü`”Ö6Ì}²ž¦TÁ ’›Ÿ©>¸÷îuùÝp�˜+Ó n‘†Bb™ûß%”UO=ðiÔ ¸í‡2 ‹#Y¡²09†ðž¦5dÕ²Ùl·3å¡påŧnèÙÂàsQæ¨nÜN( .´m´ƒ^ÊSeö Û Œçª‚¶¶$Cé�m¬™<í÷U� 8Ys:Õ·Ç×¢5Ì‚27 ²×Ž[ëñ½¾Wê¹ÊI\° ÙOo¦OŽwñï@³ñÜ?[Äà 6pߣ6¹Á¨$Y›%%b¡O´žÔKÝ®óX;’Þϲ¯ž oÇ�ÃÇà߉—UŒ™Úµ“•cÚ–{h¾ñQ·±í¥pl©Í¢ 2•~ÜÍ')c¡ºº—'YÚeÃ1»2ŸŸ_w}[ú:œ&n‘îȬ ×ôok¤ÝžA5evåZCŒ ý!ç·ÄFä Ù.f>Ç+ËáÀ)ëh]gë¿Ü-EÖYÖ/¶-~Xº•ný:§/ÛHKnc™Í艋ºhš7�YdÒ©s7Ø÷"Ф8…¬ ˜p Â`@�é›ü©@>Üš ”3}Æ{Ú;~`HD@ Z·ïÔ°]SÍ‹Ö!~Æ"™_Ñ’¿(Ö®F¹ä“hï�4ø¼Sdï., mq ¿d~ÛšT£Ñt£(ãŽĬ‚>¾ŸQÖC¡gF° {¥‰y´•�Õ Bdzѩò½Ð;.õ\Lö9 ÏŸKt,ZùiDì‘n”�Ð|V –Sm33µ4bÆøº£“•òÖÒe¶@Yu«®€q$¨Üg¥�¾í†ŽœŒè¦»fÛƒ=(pK)ÂÛƒ 6ð˜[ÖÅ“0�ìá‹ôy'’DcHÉ„·Á·™Ä’d1 ¨^*S|ጧƒ‰©P^ý¢ìÆà½Õmxv‰Î¼×}ftj›,^Y5Oˆé³Ú'º@Ä�ë6´”öM‰îÓa {‰�¶j4·· ŸS:ÞŒ°«6ÆŒ„ι¦ÀeU€Š]…åž7fð|7û,…ØsŽND¤>µ‡–,*ú[6½Ž901„²’t-+íùéŸUÎjŠaöŠ,®¶Ób÷ èAòì¾­;ø‘¿¬HwËÙ–Ò!{.ÁGv¤7I.CÊÉ7ncZ/>eÂÖÎcgBÉ8ÉÁ¬:–0�b¼¬%°¸7±úÁÁ‚‰c°]KGsÀ'zÑrªéDöÄ{ƒ îï@°W-ѰÇë±1žm»l4ÑƜꎭ׬Z3„2 2A™jÔß hôÙq?á4¨ü@Ó»c»®à“G\®ìåÕ¾§Š%Éiè€z±áé,}@1Þjܾ y®"±(ã WÃK�N4ªW)û»rë•jŠêû|Z‚L«6†ä[ã»xoUVãØý�ßõõ€J]ÐtçnéÓËíû{­½Â;òJõóä‹Ç®Xþ7?²¡!‡¢â@ã{Áì¶øzëÌ=Ç ÈB™3•<°m¯ š¥øµÞ寛?yùÝvêÏš½Ÿ²ò˜½Í±Ç@@KQ«oO¤c©÷ ÕÃn`m‹â¾ú‹«—€¨NÈÙ³{/§ Ükb‘e€²h Î8胳¡¨6q˜òIìëGÙuQÄnMV^s»w9Æsg£®.3‹˜ÒÝ :] óÇêŠÍB—lLTî6Ð.çJ邸㋔ŒÝp±ÒìËßl�ac‚¨"8;Q «Èo�Dé»&ø”šÎFø0ç'ñâÃfïP �±áñÓõˆÑã%~ó«ÀQ[ÞW6��»ëб™Æ^nY…ÜÍÅ«»œõ™ Ða{& ¶¢™~XÖÀ„‰@ÙíÂV𖳪G_šØ‰ècUñV^J!ñÇM¯è�E­Š¥Bñ"ÞÜì(:,{+Î`h‘ ýÍì<³äSîÃé¨×yï2újn»ÓÈÍ…Øc±a4–Rcª æV<ˆ!¡ˆ D;™â9XíáœÀuÀW‰~>ñZön…@|›ßjM\7±Ö´—ˆ��]r·G; D«Z¸¬,s@†A& ¢[l•6À¼¼ëå("�#ÀWÙ´-gd¯˜ÒïµQÒú'cÒ¾]Î;Ïk':$+ø¯×ý êŒ).­p¬»ÒÉØÇöÃ\p"€²ö Ûà6ñ*>jÉÑÛÀ°ãO²¾è'æ{W4%6 bP]®à+Ϫ€P& ŠMWºèû^I‹ßÉÄ+K.òÒJäˆ)  âÆ�ÿ[n)†ƒÀbp#w"‘wƒ>9�ÃË[­p´ƒ�3u,гÔl ‚Ûäv”ó�Ò3dÓö‡À6@¹VØ#¬,ôÀ²½Ä•sîRÇfkpBß~·¯›Ox’NhÁÜc RGò ¹¿(ÆÔ‰èà3÷˜ŒÔœ×jZø¶úBéîãõu��ø¬D*½ð`1n•m…ú÷Ǹˆ›« ƒ¿3Z#éÉ«òîí¤ ³©g³àPtTÂß�‚ìû¯Y=D¶q¶U;#;¥bç”:K²ß (Ê{�igüt¼át¦-'ŸbáPìîFx¹ZãŽá§b 嫯p@ºQz”.oo|¢ˆDÃêêèÀk5ªü"CäÅSË–^†®›åó¨ÖÄР’œL“áKuJ ;“úy}ämÞ9Ä%òÑMnì5Êám›pvÙL¼5 ôî*äî�ËÙ^³€]!M¶EµÑÀAðwâÖt¯5#öó̆g~mšEü¡”ô¯?$µ§l¡lq¼—��[Îg[lÆr€\ ƒx ’”ÛEËO &éã�vê;fPÞƒ“-’›<Üù˜×t m@3ØÒWmåAášRÕvÄ•˜¹QÖºµe¾ÆË}Ù´Ûƒ`oÆQòÍm‘¥zc~ ìö gh½Qi8àÇØ<¾&¹ÕC «d‰³ˆ•íÁŒÖ” @¾@ƒÉ™�áÅ'©-Ã;r_îôa÷Y®NApwâ­»‰BßäëjåÈO›Iáéo|ÚËxíéwhOk™.¤ØGs3løÇn­ u�胙�¨ÁðñISƒŸ�2xÛû† ·9Þߺ¨@D‚gwí·Vç¤q •Êlsx _ÜÐO¡ -ª�ÄœíT€îÍz-úØòR0h‹bÂÆ<žµ/ª/eÁƒp¸ud@eÆ;Á%V (¨P’�WÉ� ±ÚÚ¬þrï7Ì(ï"gŸ·û“¦…ÍÐÆˆX¶nÖFO™]��$ˆ}ÐÈjøbõþžÚù@€�UdʶšßÀÑ4†ø³äXÔC^¬°Œº…Î mnJAØTØ<üP zÇÆ ¹f-N7ygÒZpÔ_¢Ä@©Ù4k ß�w—7Ù­ôFå³^iP4J÷į]µOÑh£°ò—¤©P�˜LŸŸä³yÂßbéÃ,ŸÕ~@ce˜rÖwƒ£3ÄôMÐ,‹LŽl³|£O"±‚uFc§hU�D‡‹— Çzyí®emÍî’Ì´ª|AÚ_¿ {ç.×°¨oF_A'¾Æ¨|¢µAgSÉÖ…Ä@ÜRÖ±„¯ÃðS+}&¦DÊ«JqtôE6Á ?2ÕqqC ){“vVÎÒÏ"â ïU…§¯&$q Œ‘9‘“[IÐ2mÖé�„â¨eèäj_îͼ¿`g=ŸHk� îwOQ„ V`ï“ÄÎ6Œ!åqˆƒ·Œâ7u°.“…¿³¥ä¦ûo“JC‡aêAå\0½¿Ìûnœ ¦ ­ˆ�4Ú<ôŒëÂ…2gÒüÓ(‚ô )}ñèFÓ)¨Æ”™Yrå(a Óþ»›•íe³ÉðÒ¾«Q[îÜ øaYLX�dDç[ «Veá¹£èêœl�CnÖ@ÞmyÎÄmùÝ­í‹\{UdŒDDÕ€ßgMž2Ä6û§n#Ì+¡ÐÕzó‹¡Ûmƒ³7]ÕA³¿‡5Œc^k&ABß í�l�#.ªt”`v&öçlGÙæPjÊ$çsùXæ$ºtå½)‚I\Mú„Yϳ::Qð£«�1vÊ€Á›Ûpj2í*Ð8ä‡rµ~¶L™`–𫨠HL´X†`3H\šóÛ#w´hñÜlô¨[06 ìA3nÐÀi¢ÇL…•KØ¥Äô@a³w -Ûž›¬êKS˜±Ä€6á&�#;�b,T,ÐBWÑðQ»0`†nÿaÄ ] E 1‡½ßé£eg­ßï!%UîÜ YõY†mà7¢m©¾ŒÓ!v–U¨Ë®ìhþ uÕ^×VÆYZÆ+Øâ•}ïÛЦŒÁôRî6w¢ÆuohÊÂè6+áG±%>ΜÖ0•CV€Åk�Å=ÍrHòaÍ×ÅÍÖ@»HvÈ)±Õû² <_vNµ�MžÌ Ýö%X ì€úzƧ+¹Ü '4½H¦Â];i07†•.#á>à¨&vmy-Ø5f %ïØIΕÌö¶ÐÆ­ÍJ¢ &®w0FI´k§Ÿ„†5m" Û;'‹¯Ž/]mÚݦ@‹[¡kÈû׬¨É›�Éa¢ 9¤œ<.'LŒ€$>.ZÚ¢B d"—§ÀƲmZ[{äŸÅ(¶’ÊãÉ.ŠA—PÔVuÜû‰½é#=ëD ¼‡n¡ØéP$$ݶ�O7�&•{ñ5“òŽ"„F@Œ¾ Zk‰c*?rÑ‹ïMj®¨{Ú‹$K¾zsMẈŸyH<œ{{ƒN‹—0™±Xƒ†S¶,ÕìEÝàÒ;E¡Ž&¢ùvaíº|ÝXßÖÎMº°Ã;§˜c'¬ï� ƒ€ùΑj«WÊÕ ¶™g½ÞN¬Y­–Åð‘©žðõòÀÜc›1hí¬æ›³€�iì«:œŠ7-¨àmT œœ$”à—¦7€/Ðü£À2’\‚°þ¸-ì¬ç, ÚŽd&âóåY Öví°UQ*†E† !­wy#gkÇ:ÄéÜd\½|(s¹e;¨¬¨z¶ûž±ƒ‚`#»C×äNY®TwíÀiôíѽ&ÃÝH£órÐB@×ΆDwóou~ãë\$`sèbÒXídÿ�ÞBãάcuƒ0ñÓ_‚&2 D¶L‚ƒ[מ Þdƒ»¢BeŒï¥äSÒæ}bóŠÁ;1 B�ƒ6 ¤Œå ©©1ù¦þÇ®zzò0ý°^Õg;ÐR¶òãèôC6‡×žˆö1úZï4QÆã‚m›i¶ô=˜0¹5 '¸LµÓœÙ¼óž€€ê­H ½Ï_¨z±Ž:wwpšJ¿õJ+RÝ;nž7 ¤È}:<±æéåÎKò%‘S«Çni¯³Î“¼{×eKý°h/ÓGö¥›¶°ÚÓ¾<6Ê[©³£YÅ®'Ž:[ÞæÓä#Ôð€7FýÐ9ü䙇/”¸Y<ê‹m¼ÖÖ&ÝG°€†‰.¤*ø¬†1(j£œÆ\±+S:0¯.ï1YUö'–ðf-Ф¦àt:þ9Cö 1ƒZLÜyݧ8¦O– ûyÁS¾€m­Í´±¦Æ^ñŒ>ÍpOE<îcbT‡s�äí[&ß&¿Nƒu°QB‚.g%¡™ªÒKk(É¥ÝY.¨Ÿ„Àe¯»á®€½© á\#Y75²r ]bÙ‰ý›šÊ�ˆ�;¹e¸F.¬©—·æS°¨áyFTÛ35‡÷¦ÀW¾Ûyƒ\Öˆû‹ƒÓô×Xe!k™­ÀkS€¤=a×ç¦J×!z ¨â7»n±ÞIì|›TËËÜakðèòyý®€ÞÚÕdrËgùjô;š¸Ú×¾r˜³ÃK,é‘ö!h‰§¶0ÚFõÃU I�ž �Æ4Ê $0OGèwÓì­"`vŧ41‹}éäAùb+1“fª·Dù» fúÍ?ì ´ûµ¾Ò13VÙ˰¼Ãïu4+zŽÑ} . cΆQ6¿î½g3´Ñ6°²ð=6~%Õ#…(jÓ)Ò¿Ï�b~ ¢ö–B¯’·‰5mk¹FÎsè6›ÆÈ4>¦‹q>„W‹ÁöìdE˜ð-È‚ýÁf�ý©ÛVu d ®G ±Vü@#8‡™ƒ=œ@x‹)½øSÇV×Ï–ù€�BòJ9²�êD/pǸ× r¡ko¬Or@Þòbš#¸‚�€ÑHIØú�ésJɆ ™Šk:eÊ�”°V8V°Ã¼¾$ØtyÊUýI|FóGjÖ@ƒA¨(¸êYtoj@Pl·ž~5ËÕ‰ �¡ï©åEtYŠÚ¢´®{ߨI°/0ï0^jØÎÜ÷ naÙ Ž‹M‡ MN¹Ñ©u´ ö"RQÙ=N6L|¸è˜®?q‹¾V·(�ÀÀùW@(Eë^· ‰d¿ Þn—ìÎ'Sæšr7ÖkW{ŠÃP K.åªÆ[õŠÛÉæœ q{Û>Û‘Kª€Ø‹¡ „¢oÍ¥ÛBâ�z ‡’ª«bòžŒÛ^ ›g½¶‡¢t ±/nÌQìÕ³^æ5`�¸I`î1¥›‡›‡ÞéÍ&pªï“J êf¬yÀ=ݰS#[Šéã(öˆ‰½ÚÍf¡1 ^áB4@¢w<ù:”ýãa}í.p­¾´ððà+g“�Ül ��+M2“ä<éW·²ÚËó·Ÿhän8ÆÌ!^Üp'A`æLÍìBã   JAåtNº¢_vÈiO ó°<ƒì^ª²E“›ë@Ó€ÍWÖs\yUgÁA ¶Y– ˆƒcf¶œ›ó•ÕVÊ´>d¿ àC-ß8­f™#NµOrÁ¦ZÆ÷ 3†A¨â|g6ÐGY¾éïغ¹ZÓŒ|·/È?Ej,Z'ñ:YkÖú®6]ÏÎ}ä–¡W´¿× ›e»VDÃÆRE+ƈQƒ¿?~Àø™J® ŸRKZÉ[ƒ}Û4J¾ýswx}=óÉ1ʳÑ`¤ n#<+³¾weIuÀÁy«)ÚG€qÖ{b5[ nÊd§øÎ/jÖ‰#½¼¶ï_ig±¿¨#*ÒçŠE„/‡QÓbóoÜ«g<Ð3+fX9cí‘$æ“ KˆÇM‹¯aX%àÙq¨-ˆ6fä_Mgµ³¨ÑØõY¸Tq}%�¬2lÕÀä%�š¡ ƒ# #²f ¹[�¬¸'ûìÎb-™’˜NŪù«\ù‹ TµðŸAgÇF,Ø~jÍvÏüùý×åÔSf8Ó� ¢¥¨.c×[¹H­„€äõÃSI«ŒuMy¯5ÌzUŠ\…�÷Ä‚7M=Ò}Q3�s'—‰MØ‚B™JtõÓæaÛ˜�s]«z@‚3ej m�Ýì7§™odí´¨Ê�àÈÒc#˜ GîqDKäùhùb�ç-YzbF³0±o§"jLĉ¡ä‚ÙÊ ÈÀço“¶éî¡=‰ÏÂÂÖ£èux�$‹¾,ˆ}˜ç¥Õøå[†ï2oJ{Ú¿¸›@—ÕŒ/R!ºjB¹-‘­ âMÆ,Å­1ÚÂ0hˆž7c {lŸ(Œ=åEóŽ…Œ2ŸX¡¦[ÚT6¢먌îÚéD°zéky1§âÝJÙ9¹‰uðä•¶¶—å¯Ý‹ÓTz°™\å£!ž/)­lG°«‰ì Ql6m0¡3cÆšÑRX -~ñ�Ép¡[�¹¢îɬ½êD¨r° ¬>žx»´Íh‹Ê�I7-h÷F¶Ø ŽÀøI æä“e¼þ·©»zq|œ5ïj¾6»Gà L×/—‹uÞF‰ÊŒÚÝ®—NÒæ&[)änÞÔ~és·š)|Ë75î¬{[÷ xZNg*%ˆ#úÿU£(Q#fVÃ>ü˜F×7¦ Æ}Öû×¶ ™�¶®B–™ãsp¥`Ôá1§ $JÖ<òÁp¾¢N„Ù¶i�æîäs…éj-ÔØu CY1„å^O5 9xE#Z§ Ã`—`Æ@­F~LcM‡½¹³¯ o"aÌô-ª„ÜÏ[Ì.¹Bò¡sÔf W¦¢{ˆÇ£]€• ¢õÝî͹r¦ à´µv› n‹I»~Ùâ r;$O±³2§ßŸX\µí4ñ¢v&dìHÜ^~]ÛCf›šy5¨ÓŸèØÐf£²ŒoÉ-°[?•›§ÀtƒžçU±b¡:,¢´à1V]Ø—$Ád[A™˜ªˆVÕ) ¹Ò´\ÃØŠsù:tP0Ù›¢¶•aå Čٱ‹ÚrÔXê÷‹ŸÂÞ1ÉŠõÓ¸ Íðú8äܵ:¡^Ë Œ�³cb^»Fs~_U­I¹ÍrFICXÎ$ZãJ¤èw^ßMz3.z ˜…ìÝ„6ÌfH8»#ÊÖ{A­_®ªû˜ÆXnHªbSca­±ˆc )n?×È5�TóT:-FQRÌ7j  ˜‘²ãy6¶Dé.ÇãÑÎ;7dà_^GgP3®gÇGA#éûAMÍUVºÛ�v¸ÓÕ¹ƒ€šô18ÆgÁë2.¾`”ôzÆ�A:õàìfß °Ä‰5´¸3 Ñ&Mcs"™ O‚çä/Ú¢¾8ײèt=äΰ73}dAõ!­P“XBÿÁf÷FDN¤‚mçþËÇjy±w|ß9Ï–|u²N/µ°¡9¦¹y ×Û>D`ªôÇ™*ð'#!± pe½I±åŠÁßíÿc$avF/·r·­I{Ø‚w`ì¬;UÔ‹N�§T©ÆñYÝ­h´Î;­|X©ÅÞ¦GjYË‹ç; ý¾O#î|6íºÈmþ·ÐP”?QgÝø‡ Jœécìóµ½}÷±Ê¯2ñWÒYˇ.X¼uÝWlŒ†g†g=埿�Å€Pˆ¹yzµ„9Ò¾ׄЭÞDSœA‘oÙ¸f×?7wqÙ :“³¹¦Â@0óN¨ûlE§œ@«˜��^çùu>Gœrþëñ�M«}­ëw;·¿ÜدpîÍ9Mß$ß;ÞüF)õêÓ›Wµö“oÄ{á¯Åµ»>9H*æQÚàxÑ4iŸmðó¯ÔéÀ�H9ƒ­?�úÕÇ+mèç/Å|áôR”Ë­·“¹Û5K¿LÃÙʈ§kXÄ-¬Å Ìøº°Pe°jšÌI9KÉF‚ÕH{Þ¦ÂfîøâÊ„p;ÆGĽj7âZµÕUæÈ X¡i6�·0|GFÇv¡¾ño$í·}=ጌFÛÈ�Î —òŸz‹ëòÚ4>´²I>mÛÔ{*—#òíË•ø­_Рœ‰P¶‚�M4"’§zÁ®ì™7ÔO¨ ÃFÛ¹äMÄ5…33r<…§9²1šii‰»üÀú‚ÄTd#Hú…�Ô3"æxlзr¸\`4&š½C´ßHX,XÍ“md3Ql5DLeqz-9žél!R-¿jÕ“b´_@øýq�¯ÌyëœpÌg/”úJÙ9�lŸ®…Ü{°Ç•]Ž<-Ü9¤eeú)¾ yh5 €6>¥FI¹W|„gKYÄ0ÍÔ\!ðJ›rFgF+²Á˜4Ñe¿ 5­×J­‚Õ9åù«�€®:Cqÿ-9�ˆAn+_¡6X'Ëß–Û™ÈeA Ï$Ä­ÇWÐÏv,Ž…„Âám£ ˆ¹z²Cœ³Êñ&ú‘4iŸ*�_JŒgQÜ’Ã-à3ˆ6 :7 l\0A;è„9o8t#¤«Ú\ðÖFŒ‚§Aİ…å8D9Ð�âÂsl·ßDt9jX-10��XÂSë:mR�‰Üª\Û‰o»ÖÄXé[¡Ÿ€˜AþЉþ‘üý‘_Ùòµ1œ{vJûýQBµ fdR¯k—&£‹�ãøÜ5z¦á;Zð8Æä¯Ã˜Ìi2]V2„ÊUB}»; ˆ-úÁ�QçªÖ»Frl”Hf]µ0»¨òšUó}¿ÂÙøùæø¡�ø7„È1¢÷Žé3^_8ì7ËOv�ûÜ�Ä=üIu2»KYïVº2„Ÿ¸W®˜‘ý®æÐû?¥=’BlÞ©”Îq~Ͱ] 1QªaðqrÝ 8Vt|[ªsö î\ð%üÒ©ËS̆;½b];íÏ|Ï­†ÔÓ™É9¢oLµ§šMbPE««¸ç{ÞñâJ!9]½)æîEûˆ›íw44Ú³¦K4X›_õPԮµcï]Bü®Uø/ÃÕÂ/­®& L=«¬ªc0Ô¡§œ=‚�1“¾ªïU_ ÷=Æ÷ˆ;º5IüÓn¡$ûÁ.�€Æî/…‹VÒÄŸ‹´×ʃñæ>Üs"am—EH¤ÀÚ×± (o‡œË`¸¡Û›·#K>Žéþ¬�oŒ~”cáNœÃÚûš¾Î•óÆäš%fÂ|€xðû°5¤¸Fö� )Þë< Ž’:Ú7e.…yÐÖp¨¼|Æ®ÄVuµ`eÙÍÄ1ÜârÒúe ž©�]¼»Íß ­Â0Y X°ôF®ä Ÿd_H±0ê{Î Þ€X4Gˆ›Á^ü(9àðf9ËfôB`Ai©¾à#Y Ê2·Óì(@€…×-Ï�Ñ91 WÒç¡´9üå6{mµéDóÝ+r}ÆU>MæÂJÄPóõN4`ï1“†\²M1dýBÃÌШóiœ�£8M´úš¨ÚF úÙæOn'³š@käè-¶íõŽ{è:>záÁâŸ| AöܵFt¸7Í>ÊxáC§›rLtÌ%Ù6æñ½2çå²÷|È¡=±†(‡�h3ºô(r»ÒÝzz™ÏrR `Ùù9é�Ú í>Ôã¢x.Ö•²ÿ[…Kxä*¯A¾?•Åp=ÂA c˜\¡‡Ö;çã+¹ìx`y±�5>y~]¦ÉCî*beÅRÚ@œ­Âd¢µ¢÷ä}æ=z'06ÚÐN¼¤ ¯,'±óߢøè†®˜Ü_ÞÓÃÚž zÑ‹OòlÎ1ˆGýÅ�XÐ] 8üQF÷²ýñ�Š6ÑkžBZÞ¯oÉzknô;eÊᯣ‹ �×2µ@÷ ? <;�‚óª}ææyƒ½w�ÃðÔƒNò‘V¸y‘QÖ™ð!×KwúÕ�‡Á\6Ÿ¼+żd†I€�B Bˆƒ�ʳ_}ÅÛžSßié�º–¾/ˆ¸@Ðoã!Æîý§ïµ{.þ¹XL˼ރnÃ8‹�{ ³ß9®‚a·G/½ÎaŒì—Ó +ë7·ÕÃfxÉZ_-Ÿc:±¨Þ¹�Uœi-�û½]æj=³¼¦ µ˜ùß¡^Æš0Tj°]ÖEõ®J’ÄUC‹#ÝhÇ�Åù®Eû[3Ö߯ýP|j­OnÞóº�7p Ô’Ï5ÌæŒ¡½q¶,Zëµû�ø3³§ÀrÌ$.�OWá^жX Ü2ø�n–dè7UÌ °¼•„×1Åó°|î‹)™œ bytv ÷xïj»’ü>àý>×m¡èjÈ ê,o€š›xc«×$A!‡�¡ö= �_® Ôl3}åV[›ÙÅ�jg¸Þ>öX\Xa؇ĝ޾‘rºÚâ"]£G~.t�oµÛ[è@4�xþ €Ü¹Ob ÚÆ02’ÿ"(Ð(ß�ðÀYª±€¸¡Ý¨e;HmšwD=ëÁB�mÈ(šuh_?CIsÆ;Iï×>”™|ô7i2`ؙܗÜi.'º?Ô×û×EpD�ÆÃ·ÁõÞëQG©j]€–ü�‹Ñ�cõ­¦) é-<øëOXü³tä“ãöùÂFÆOãa· ¨ÍmŠ«Ü�˜Ãä» æàª»µÀËQ6®ã)1ˆÐ5XŸ` œbCNˆÚXÝ™‰S­5Ÿ5ö—ÊSƒl]¯n1¶ÐR­/³MFƒ\Íó¿k+ê ›{yÖ_aĬ߷¥†fŒÓ‹ï¸‡ÚGã¶æä²–%&™Q+yF+Îû"Žpû:³'ƒ·Å,ãß7o hs ìêù¿Äu€Å­0fjD>ǶÑÁ–øw·`ŽeñÖ¹O>ª›™Î¸ú¸%Ø÷.â·´A&}‘Æç7žw‘˜¹g:sK*Í^sy šjPßö `‘/ËÎ2ož9÷¬eÐP~#®üRZw�‘øü6ù�ø ·VСëíäˆ9˜¢2~<…¢ub§žx½�}öi:4?LGÙ¾«oÆŠâ_ä_xÃïÌR–õ`İ?B.‹]VÄR]� z%Ô”MÃ;kaá�ý¼ÈrµØ�tW!¼ú¡êŸ¾ —o}ïŒfÔÜr…v�¢Bœ„J;„ôѱfý‹Bîˆ{XÞúß|mðã·;㸙Ÿ|$# ã…X”É(šÃNØÏíuÄ_éî,&\V‹ñ÷¦5TG�3?`&Í£ž[•»HZp7aÉ …Üóã|ÇÛÄ\à·tÀ 愪 z78¾­!6ˆÑf릤ƒ¸­iYš,{‚11V3=�.»ó®¸G\©öåˆ -¨Ö¯zAœo'î¤ Á�‚‚Š�â»È™ª*x„KXþ½Q4¯LÔ“K5#ô8ä+Œ&”,b³wÈ… s$Éâ Ôœ²Kvè �ž/4ñß¡lñ1à¡16à ñèQQ¿ŽÔhƒÑ(EÃÈl®ºXîG˜0É£µ¼ÿš,q†µ«ì°«ß¦ÂG·Áˆ8\ _š*/ŽöððmS ¸YÎ#àÕM(Ðåv¿ÐÞËnkÚP³õ:;<�§@NÛimO;§=œQ|é¼avkº`�)'‚¬d67”Ceƒ0 zl¡¬d#‘ª6_íO·ïPmþ*øÃgV!^ÁJ­¾Ö-¼+–ïê°‚ñ÷4€µV 4]­À5YCæ/7ìÐ Zñ8HõcîžBÖkg’ÌÙà †­™©zw³ŸtEåpãÒ(*fÉj¼ûůՆýmI̸Uø÷9%¨‚+Ô¶mÊé0ö®ªó}v ®aÇ4 ~s¥±tÔÅR‡/@+ïJÝÖ‰cNôÅj÷Ç´bí¶€Âã�˜ç Ò£ñŸ®8©8Æ}-?€ WìÛ8þ/‘AÓrÉ`êàwëcæjB1œ¯œãcÙ q ùyDZ·mh#ÞÚoZ4›As³ö­�aÔªc6íuý›y‡õQ›ÝAêË šH¯»pµøeТÑ$ýš¿g¨Ã/cÚ8±ûÐk ¯˜,4~jfáp�9rS•™Üßo‘�RÊhÛ0±m–#Áˆƒ�ó*�9Íl&Îjk´_!~aáæ×[€ãŸwjSÏ›�ªË¬Ð¼§pc6D%0ÞÀV®a¯àÂ(©-[¼È7oÂøÚVn²¿p;ûÃëí£}Ú #]ÐÆñì&^ø»°0¦®×Ù¹àwlgMY°©¾dPoHJ´ÝòåXrÒÎú¨•mÚ÷äúa˜pæcŠÏôÖŸ>»ø¸S³t.PçRóƒÊÎ_® Å­rû€;fìÅŸ£\†Ùþæîñ¸O†?{B%âgd#­´©»‡N.G" reó*›=Þûp)%³¿ÊGƒ† K g™Ü›WNg:@I¼æÆ±ˆÏNê?£@ê–Gx%³Ræ@nÞÝÎÛ¤ŸË}”íJp™»i§ \î„-u®íC�…=Ó�7Xàºö§Ðd»DV¶úØÆGh*›4ÙôëºÆ‹æÞ=t¾~~· [ÐØKÏ‹…|¡˜ˆmA_´l·JyêcTƒ¡6-`‚˿ًè~Àú1¨.Z^­\qìå°#¢{…Œ«– Оïõ¬åö¬½j,“FÇÊ)fbé�·ïsÍz'·»7Üí«}½´íY-r{5´öú5°)Z(A÷ÊckÔ7¾…º-¶ v˜—8%äý.riÅ‹à´+x¶Wa´½ox¾q Ä!yÅHBÀµ�Nìl?Zærò‡6JÜPmýÅËk@¬ZtfäÀe—ºfÆa~[w� 3•³fàóÖ{…®5\ÑÔ‚UÇxZK]”JH Bq—ðDUƒ¨€ÐXÊú^ý™%k&µ cGìs‰E�|&6ð¡ËôٸϚO˜Ãáz€ápy¸íú—ÛŽ‘°„w�HÕìJ·7¦J^0ÕÍ´ËLÔ“E€Æ±7;Ô‡²6Êì`ÛqZŸñ©û¼>ï°¸YÖ3Žo˜VÂf¸-Ù]7_·.{ojíz™®wM°.7«�¼ 5V_\©åUxDÅlMtô÷·mNusà dw 9ã�º ú>”[X7̳̉ˆ�áìUç 1H\xx”ÖÎZØeµÝÏ[x%ó)æF ]³|ŠÜ#©´¡Áë»;f×7]Ìÿ·ì›|€•\õ›” vé”ÎÏ >û×5Ëah1îcg®Åõ”ßݶ %_ºûîÎt\ô«¿VÑÑêâ� u¼þ‹4‹'·•†N×íÖûqx‡íˆ�¡øo`úo�†ùÐŽeJÂσX ­‘ب1‡Not¡¡eµn÷îÓîN,¼Óµ_RͯPÃ>*¬�ƒIì$›LO@ÿZüÓÝ<°#, nΚ§¼žOÊ ×°vÎùýçˆ;wn uôü?µÛ[|( «Ç-oÙLÝ@6âŠ÷Ö³ñãÇÏóÙæ¾Ù œñËò»DúßÎ ,—•Ð5—̇Ûp¶J[¦â‚ÅÙÀd‚)/œàÚCC ]Æ‚ý—}‰E ­µ¨ƒäÖ÷N)sS`g)‹°á-òs`ûíŽyƒ~ç«u,�rBÔÄ5 è°mr¨úT µŸ�(t­á åò«C¦`|}Ànq ´©}äœÂÿ#¬‰;/ääûMyÍ Ž‹öR »ë·6º¹Ê*Ëž†.Q¿SÁÇéÏ� aÖ݇²•Ú¸¶~j?B½g¸ÝšVÖòÔÓiì!å·‰ÅÂÿl™eY°½mÑi‹éèWXYf u3x¹ 4�¢g–J�˜'|_±>:Ö'|Øw\€› Œ©h57ÝxÚ®’0Ûõ„Ó¦¦Áæk|7›úù³*G èºêohÓâ÷fbvƆ‡èËÄI_šó�®nP¨¬6’W²ú‹%à3Rf['`¾K\½­€Ão£É»Óà¶Ç#øç˜ÀéyÑgZ×oîUt°‰CKÝ.:Ã"ð–ðöG60Á�Œ‰+œ0!© á¨8Ái¦øªÚ¬¬B;ÜÎûËd6ÐÐ"ÑçÆš%›@°ƒPÙjÀÑÓ'+ÝkÐ›Éø¼£Œ�½ñýëfuwf)O§P…’Å׊¿xï%BW^ö½¼²ßõ�ñœÏ[ä—m íûÆ( ýt²žÀ¸ÑÐl]h”ºŠçl=³—û¼¼6WšüÚëõpšvÈ*·WˆØ$] ØŸ©qºKÄrùµóõõeX æUÏ;mAP橵ZÏáÖgAq�ýš²fˆu#Ü"ëvÇ7ÂæÂÎŒáÕ”¨Bp+�bœ¬k£…)ܨÀý‹È!¯mª^´§€¢ö÷/`¤æ^1¸Ÿ^ÊôjÙ³õf»Q“ý[�  Ö†íÞ-¢üLÐ%,ã)<Îôïk]k·Ž1©.²ÅüI�‹ì\lI'ÇÇBj“Íê!*ôj“oÂ, kmð´§Íhmæá†íÑöÕ5±ç¨C7ËÉG²@¾~í«¬ef÷ÏœÏ%ï¶wĵ¨Z½DQƒfès8£æ¹I“™Æ lOaQ÷ë­ jäÔpå;‡Ú—wò~Üì8`@²ö÷…jéŸm)«H²`4.ºLº²¸]-†`�3¾ÎÌ\ŒÚ„ç`;À^qMž—8P„Y°Á0Æûk£.³ªXU±ð2¡`]I&�Ö^Xw�):AäVôe»o¯ÁñgqÉ¥YÒÂÝ4Ó“ÜòMTN c˜QŸ(v¸AÆÓŽ.”4x„ýl°ˆ„fèî9×í¿éÞ¬×À@ψ*Ê ¼Õ î]áÌãÿ¿Ô—ž5YÝ�#8›2YlûƒkÙñm:{Ü,¾.;ëh8l"¼£Õp=„ MkdFtàœÔ1Ý´»\Ï3‰ Ð6³­Æ´8ÄâtVø–K±Ïá–JãÚñ/—>ñŠ’÷#ÙØÎK"Ü<±ùC±-IÊîÑÏŠvK®X=ÅcüKÇâÙ8]þFpK[Fœ}yl;ô®ug òßìp;*°nÃâïõ, ™`yˆ¾}«­¢‡Bm'Ám™`œ…ŠÕ8Dúa;LËŽ cÅu�° ¾ôzq¬ÖGøØuƒÈ•vú�°¤#ŸTÜ0&°¼æ¶çº] 6£yÝU¿·{üÁ`ä†ù Ü*lŰϽZÀS~ ˜ð Z÷=¾€â77§©Üwï�€yÕ¶ÂY¹açÖëbhqží—² r4]dDKËgâ_ZÆŽ«u§C $ícR‰YµóÊ:‰ØÖ.ðÌ·¬Õ’¬®†�U›5ú}¥È›_~*kO}¨]ö¾?×öî6Æ�uË~â’íE�{PªÖu�·�d·Ù·Ñ€�"h% ,‡hm!Ý�~"cÈP‹T8.ö˜ôèÐ} ½9ßž|Sòa‰ùt28ZІ•ul=ƒæ¤ˆ°k˦~C–¬à­…Î�õèf¼öþœs£ÖàþRæ–XØ–UîvÞÙæîLÙ_«v¾Z/´x¿}céÙ0¶ßå4Ë0X–hê[Uñ;ìïl˜øÃ\Èr9鯶;r‡1y�WZçŸwt–„âß!CÄóÔ(­‹ó h Ÿt©M¾Ì„Ÿohˆžvm’íaɳì°wÎ;µ�‹–.o”r×ò‡Ø7¢B<]æò s›ÏÀ™·î/1bÖÕ¼*»àÛbÞµñ³è? ”¦EDzw®hÌ1ž7ÈZ#VL&:nõµ™é$ï©R #hÜ< ¨ƒß ˆ¡ª®#?ßCã>œK1ñåÀ£ Û—P/¿˜:©Ì²³gXÆ%èôžÆD ~*{Oß~q×ÈRgé;� c‰Ì ¥Q!âØÍø½]ªÛ"îTz)wxÆRA¡ƒìà ìfÜ4º�ùËBXÿ§S©y¦Ý�Ƹìâ5sÕî°ø³«æôÁu ½·G Êù!°þÄÎx ø•l@àuAuãT•¤Ôè'Ýl"—CÝ Ìâ@yYƒê^7+—¶0�(ÎQÂ,‘bIkIZëT·«Ùµ�ÃZ´“@‚áb¶ßÖwÚá—Å‘Òò�*Îçšãbƒš§ zÊjW8ÂîTbÁ¤nÔLµ`�huDƒXfu�~åR°×TN]Ô”©ƒ6Êß.a{ëvÉèN £˜à•# ”ñö™Þí¶Æì˜n„É€LÈlX¡bòƒm¹¹ãâ3XBmñpghAŽ]€ã¥»•O¬�ÉKÂYÔÃ=£ä˜øù´MXl6† c0¿\+­K¤%Ì�ŸxwÎmÃsiH�w ÙÆ`!«„p’âZ0Ѷœ×ØLZ­oÆZsWÚ[^E·4å›Y–m,½óêÔM¿J뺫íkÊ%AÆã.&k6¾fŽÜv0è±À`!L!0öÀŽÛª[�Ljà'cÙ³ ,w„|óß$ô>²�nØ ctȦ¹f�n61M‚ò5Eñ œ!0ºYw唽G†À«Pf‚d{”&¥A¦‘B·KCGÂĹÛ{6ýQ£koÑšâ6VvxsئE7Iq?ɇSA„ZáHe+d¶Zf�Ossý§KÀ¬bõ b6nZ»|·K±JVÂ_¦„¥ =ž(­£dZ�àW cP¡¸†5Xs&|‚Šrr�ò·-±'{z½SËî…3®ÃÔæIl-ÄZÌeÃíbnÃI66Á& dfBØ[KÞçX­Û$…JðƉêâŽK ¬¢�:¶ôx]IÜ�•y�^f—a›,Œ)º°.ŽxêÛ¶VS¥¶¾2V¸â/¾µ¿- €hIÓ1Ö7±Î%FvP ?ߟ>O#�å94’ê Ÿ“´ÆCb�'cXè-úOlh衃!’›ÌÖtÍÛ8¶mè!{Ä—Žy+/üq_ÍVï Ð=ßFú? r<¬¿ëô¡]ŠtVvk_¨n$ºiirÉÛ¶4Â,æc®à2™( wmwËõ¹­«kí4$ Ì(´ŽÕ™¸;T;€áw¼l:‚Ü~‚E™†x¸•hîI�ŒÎ6Nv½O ¿f¦vµøÕ€$÷Vq>Ç¥a}_ˆ¼üÖU4`j¹v%.fK²cWö™¯Ì{× ]~ÕŽ­RŒ&é‡î4°”±eÜ iÁ i»T÷ÒO£M­ýä>”Ù‚‘q€¦ÙZ­ã4­ _¦ï‚�X…ï9á�–Ž 9þ=w ¨–´kȶk¡ †ÁçÚh´zœòHeµOª>ÈAE¿«BÓp2¹X›dCØûOå9¹òOÞü\ú­>û�|é Þ“‘õxù\„�x¼É6÷j¹Ç0 m✠³Ö ™± Ã)�üØÌ‘;‚åû›+…a½ Ã(ØX˜O§ &zOp.Ä<ªÓcG>r™a/.L ÷*›Ðf3·;ÓÛ7â“‹‹9öÒ&çÅü²”œƒóÜ\�{%xƒÅ‡[ÆÕlNqù¯C†Þ$Uï0ÚSc+ØÜ&÷R¸G •i¸Æ W¸þÜ®’‚òZL…plyø÷¦ÀDµ²õT؀׸Ç8¢þŠöƒo;± w!‡l†qЃ•î‹gLHöžìK{éœ É>H\«s[ÀΛ¼p«˜üuuÊê/Àa̪Ñäswûx�'éÈ¥1‡£¡Ä¸Ûk¡ü%^XˆÐ•ꩬFŠL Ãß/9wc��•¥q“ ë…»6 ¯°,ñ‰‹}½~#~ËÃ%Ú6í–ȬfÛËTÛÁDjï ¨¦¼ã57KvA‹”ÊŸoo{À Ý�ûù†Z[á~X@p(7?‚.~+ånÓ_H>Ÿ�ƒ‰MáÿŸkæhüÜç·¾^9|j´¹WŠ% Óâ*Yó�ØT5"q‡º¾yº.» ÉúΖ—ï Ô�”=ÆÑ²] ]ŽÄ8àz�[zàîT-A`$ Ø‹Ðg¿É縴¦ŠØîþšÞ@¦xû±JìlH£‰B ®Ví9O¯ kðZ*sð¤œ`ØÐ|®Ð#K¼Øa¹díõvˆ‹ÛY¤±¨áÔÈ’ŽÚÅÌ5½º€|!o˜4}3†ÕyÝ­Ñ "ذ¾qî ÁŽH¬SçÈ|ŒhÚ2ñ} ¹URG 6V4ï¬öèõ<?ì¸<ô*±"ô8ßnïât4Üà;âÅ%�µ”¸ (|’Ï 'U#�´5•`{LZát“éß'1†>íh8i”Fû¿`ÿ5¦)>`#KŽÒèRK÷§ÎU†µ8è[‚¨èì‰N¦†¨r5«õòÞ›gÞA ?~ûßrÓ~ém�ž=¿S=—æýmîl°ÿMm£‡oc3n´�wkSpòc" ðÝ·ZL%xÕ´W?}–Îj\”rÿcéJ8ܪ»à88Ü‹R'µ”?m—2f*·ç±ŒÞW—Í×|ís‹¼û0º¥Xæ8Ý+°§Wz¨í1÷Ú‰©¢FZ¼z�™ÝÌíF¦ñ>ü¹E0 P-(°F™òE®vIVfåhlñ[b~ÖÞ î߯Å(• Ÿ€„z€È‹vzaýTÅvŒ«áÁÐEÆ—³§”È|ŸFXýÚksE‘ †1Zgq<Ëï\w{¶3jÜ–µp®!䛟ÓË%,rýÇ’÷›QpþfÂ\¨˜í�$;ÅäìfºÝ¶bˆC�E_?v£Ö +Ò/ßáK–OÆ4øÃ”# ¡\.R}pnîÅ[bAIdù˜bãd8¤_£uÃÈ6¾�×4­€�ȇ8¼í$_B1šÃ1êö'€5¶;�Ã…%ë'žô¦�ûº¨=L=¯)+$ó‚tb³…uß*ù±y�fŬ@“kê°ÅÀY¦zÓlë6VZ?hÎõ| � &2 PŸnö¦Ëù}•èCÇ¢�nZËîW‹Ëy7nœAEÔˆ_/·œ]¾í×Ýþ\ú9Œf{Ó,²Ö™{à/²¾¬³r6ùý?�= �’•Xüˆ/8…ÙÙ(ÄN�iœX¶£ c:å·ó»aQåÒ¤3þìÀ¿�Ó˜îÇ|–™i‚ì;.E 4ÛïJ|ÅåâL2m÷gY±ÞÏt éfËêq ØUvá©|BÔŠ·L#Š‹6ç¤ œüŸh�gzä…«¨Í¤×mâ瑹 ­o1Î$» Þ%‹ÔÀÀ[ az=ÑSjˆHýB[GÏÑôc©Ÿ8<Ò`¾¼üÅ�–àoÒØ×cÑǼ½åÚ”Ä�½ŒKØžX’Š>ŽÅÛ¸`A[ ð—’Ÿ(ª¾²ò´ áø6ºáy‘ë@2=© "®Uˆšá€ÔÐÓ¾èÐlý\÷œ_mKûÑÈÑ›‘2Î'89<Û$™" ÁÜmó5éì ûÓÛ™ý-'µ^”¨c[‹د²PÌÙg ácrìÚÛÂV‘[®Ãz «’Ó¸Þ»Îû³ÍáòÀmqÄ.|É{ÅOVž‘|¢ot& hU7³Ë`ºŠU{,øº–Ç,Ü)uªcõ— ú%Û”Á‡µàï©ë¸†d*”Í®ìè_™'Ložƒ�X� ÒŠ„�›†~å”6¾÷}¸”ûN‘¢ÖÊAá|³c.§=xßmÍJXÂDö^‹$U7C`þÁà:KÊ—l™¢0^t˜¹*L‰CëοÁe¶Hçp½`ަ\¶6vô˜*òÚªÄ�§‘‡«<õ_¸ý2ÇíïÔû¶G¹Òn¹yÀoÅ*£�71Äß ‡8@ ð Øh5 î½Æð­«â^Ñ,yÏNÚóïÝVß7öwQA*šÜ`*)s‰¥ºvM4Unáp��s-c¹&kefÛ úÛÚºÛæõ“!Öyüz›Î©ªOu_&8¹k��cÓúÖcnvyXayÅÙŒ1õ ŸÕ¦åÛ]¦EίÓZÆÑÜo’¾�̓¯ÚÎ1 “×Ô¼ l‚×wŸ•G„º“AÉÿ—™nŒÕRý}Äcp'»]ð&¢Æâ¯‚ÄmùÈë’ypSU>«X£îjqàܽ·}Y¡n9šº a­¢-sX­ž²�âÍ�©<ͱhÇÎvÆúµËÈúOâãa_§GÁ+ooŒ2êÚü6-¨F÷HÁ|úT~ªÄt5ħ¶#K`Ê´`lE’´ígŠ¥h/´w8#¼»wÛ“V[.ôIŒ„_J•“Øì ·| 3V¬·ÖšFü„¡e¢1öµ™Ç;å' ÇÅþ,»�1ÁxÖ@° íù~ ‘KôHì4 ‘âsWغ6ÃÇ<¯íÃ%['c=Ú[Ž)D”*1@šIK ð°ó`�Ñ‹6&\θŸÖ¥µÆt0wsþ´;P«9î×­a¨ÊÙfhÈUís{3­­»½Œn8ξZ¾ÔÛN+íÛ.ÔIР*}'çž!Ëœ×W%tµvømEÇê­S¢‚+}öQJkh™N—WCõ¯–gí`C7é:pÖTLÊU‡S‹ÚXO�è—»¦SÞ´Õ‡I‹„ÔüÅRýéžÄ0ßT�v¦_Ý.Q¿lY‘.,È[•ß ŽÅï`U£à�ò5±è ;ÓÛ Ç¸$G«h¬™[�—£Ñýf.Ð îÒ{®ë]@Ɖ‘GŠüfç=æmÜììï…}¶«¦Ú‡,I|©<k5­ÕÂí-½°±å×¼#Þó8φû ÕM½õDä.zÞ*®µ )3Ê4Ø�ÑCR4RAÒ{@µhâø Î¬@ž�¶oµœ#u„qõ�$|‹éa¢RìIzÝgÞ­¬@NŠ$ˆ×êXƒªãà €pžäÏßx�8è| Ó|DM¯ä=�7Š-Üv¹[ô!âkHÈüÞq×±  ¹ŸÚ¬¯Ìg¬ÚXpQtq^›k¦–†zDµ�DmÎ@:ú™X£÷rkg…tÊwÝA©ò|ͪ'Ä£¡iRÌJvLs3­µóŒPH&lÉn<Ø?­vˆºç�œŸÄ\vÃO:bÀV �L�^¼å¶¶ÖÄw™Uï­ð㋃٘:š� — ËØ®F6Þ&#E�†§8©¨ÆŽî+ÅΨjá L$2p3m2�S쓆Œ:qbÚph×à.¾½7¬IÎg¡àK¸Ð7©L…§e2mö¸µ«õ- QÖ1 °Ocנޝ%!«ˆøØ=;æˆÔO²TëÚkx&ú.ó“CîrïÝŒ#¶íáòĵtÍH 6?HˆÊëõQíúa¬Õ°4ך�a /�óäÉ­“ªC¢fôVqºlÉ¢oÀz„öb‡­´\Ì5òüiœ®¨(„Q0Ó"ö•ßJÁ¡ñãäQ¤…—E³¤eFn¹s‰ÂÈÇ�nœw9¨¬>+1”‚¹¾ëL‡xUaUE ƒº1㧤Ïàµi¶ûÎñ:ž;Ùwkö˜bÕ¥$4¶A/@¾©lß0Âð«KeñÕØ• C ¹�ÂH÷¨ßw»¬Z¹}…ß8všÐ:äFY5ÇxW(…˜È.)dPúY¸.Nb÷L²�Ÿ· eÊ÷ëgPÃo>†£»üzÖðíÈ6na¯�á*¶ í øÉj‚øk�1ŒŠ{TJ„2åótTÀ­5rÖÞË-¼}”´º°‚’‡xåž›-ò¤¢°9Õ¾~¼ý¥ÖX�Ü—·wŽ�'Æ;í¹øT -.›½Çabæ×V”òâ Ä AÅ>e5¤®Nõ5‰IL*íó.ÁÄ#¦WDSÑ–rB±uL¬g}Ú”8ouDŒ›8»\¢øB9Ffƒ¨#}ç ÏmÆy‚ _{=á$ë6ýÈ›¢Á¡f+xK³®ì€ô}Ê>Txô©KÛ]Â1_@÷Ý×�îIÔc{á#uÐùSÆK¤û3kŠ/c¾ßÚ�^¸X >ꯔöµ�º€3º÷몣ÎÕnYøÀ¨¤ƒXr@|Xýa×@U[–÷´×¨?¶öN¼¹í{§àzy?¦“<ò—vPÕ„šàz¦ƒn³g3hY\/!qÞùÃ+.˜t]Ö ;hU×3|"àöË#owµ�^âäØ],&¾¤Û›·Û×Ûr%ðŸVÌ5�ƒ 6Ôƒ:ZõéÒ¿ïƒP%O20ö UiJÒÒÊ?^ÇÞõüÁ5Ì_»°û#tË—`ÐÐXoOƒ'�þ–^˜s°—©} ËÕýœ l-‡ÉÊ_}pï¥ë Þ]¢sư†¹íßÖTd)KÞÜ®d9wܼ$á…=vƒ„ ™âcœ´à­n�õgÔa8 þëâzØÄ²R1v9ðémé Œ|¢~ýé:5sr¾bùš ?gA‡HÝd2Éò#8Fè®F〉à¼Ñ¢åôñh'“|¸| “œLU>ÎÓ¹èñ6+!‘‰É_ï%Ê·•+ýGÏks0ÿ{¯ ití<8»q�/Ú¨TaÎ2¬»Òþx‹KÅ+H_*õl…ñ·óE-¹—g„â{låÄoX¿Ý»ÍçqÐy��¨ïEa¬ëÓ&5|kËé|n¯ºÕ|»³»Ú¬�ן*†Jà3½^]wz™ÔêÛ„ÛsóØn©‚Œ¯‡K÷ÎÛ«W#Üð@í3BX3ÀÙÔ;‘ÃS öCx”Qã9È5V,î)›ü«b²¡�ëÆ‚A¡tÑ¥éj ÇzV�OrГkÎ\$ÙúyõKˆeK¸�Î<=¬@¦–±/»æŸ¹1yBä û—êzÿ�°€1nA�-l2š#Äô+Û[›‡Ïx�-…ÑðÒ®[+­Ò²˜õ®ÞàaÛx¹2•KÅDrŸ {õ®Ô… 9­�ÅÇËeò˜&±»q•@SÄÃHì E+ mto?ã Ym‚}z’ãi]CÝOT_–ªœ^W¸ÁLÕÆ6Ú‚tæ�1½£ím‰aB0rçzâÕ{Ù†¬ö,o�õˆãéJúµÿý`מ dÏéÓ¨‘£+ .>ñ•\&oò™ß—D á ÍÍJ3VnÔ�˜È«`FFøt8âLAˆ@‰¡ò *iÕ …ôqóÀ„ e›E»hu�ßkZ±ó]ÄŒÙ9/¼�` ±|â(ØFÑ ›ýy¦q!–®}¼`›Ô�¬;Dø·|x¸ÇsÛ]M ßCu †6dý¢o"~ÊKm_xa²$–‚·u×,¯z*$Ô±‰?0 ºãýÍÀ¬bµ¾ç€ÇÚ0M¢·ÒW¿¥;(ø×qëÏÒULusbÓõd!ljR@d\¬~dÒÝmûç¸pACq;¼UûY·¡ü³õч)¯G¢EFÿm—W˜ð”�=o ÷¦ç‰Áxà ò—]^dóˆ"ÞA™Îåm…âÿ(P`ñs:À&Àl8B^f웈A/‰¬.ó° `:]�¶¼VO½«‚7}:îžõí㯴çö Ï4šf´²°^KkwÛù*ßhŠDV Õ”îý´ŽcQ3ˆ³K‡A�Ÿ Pð)�UÇJ>”Ç¢BünE#–7¥yrW"¿¥�C¬]á“§¨ø5nú¬ý€å÷z“?Sax¾¦æ[ãøI(>�@•U÷…9:×ìm¾ÐSÚ= Ïà 7Úß)¦¯ÅõpÐzÙ>Š[áã”Tðú gð÷Ôý`ïS�èX³ˆ˜˜)t þCäü¿µßl#¼]þ”²bÚó�±Æ ÎÆKªÿzÏ™À_x :JÍÚˆ])Ý©RÓ}'¶q9ر©X#QÍâÏ_w˜pù�:�ý·‰A2Üê¸{µŸ¶Øg‰gCfÆtñüŸßxÎ1vÉJt£¹Ú°E«L=d AS›¼_nÁïEl1?Ý“Õáét÷ÂÕØR‰ŽGÛ°´Ü¢áFï/ZŒ¦mPg=Æ÷üÌ×ÅÌ�q«£åT[ 7�>½ÂkFÓ95 ÿ&0[w÷M ŽjÐžæÆ±:«L}k«ß=¦­›ÁrSs" W›ê¡6TÖz Áo›ÂœØšVívíÀ›I�. :ëXZ4Q l€ö–y޾…›K·åŽmɵzö»Üe›®93r�µí2±[ÖæJ5è��ÖýîÙ×{�bÊ»y2zá�¾HÆ«ëŵЩ¬©Ö®æn™uMYí|kçûŸlQçA1MÏ6²Œ‹²Ùò`:ïe=Aß÷Ô©œ¦ÕÝæØÁ-°¼øÿBM­ÊWd�Âr§Œ6š�µÛíó2sƒ+xAÞEŸr$$«æ–|ˆk|¦þ˜vüpF+ÔÕã§7Õt�I9cºbØ‹NÆ+`:I2"¬‚jÀ\mÏ‘Þkö;¾°3rÙ³.þÏ^ƒÓ�y˜ñµÍ˜¦Ÿð þF5ñÞwMn,ì8$�Æ<<7ŠïWno¤šÁoY�æ¢ÖCSÇg ÇW²Ú€¹§³ÞO“:/M\EéÑ£|”{Ç3±Äߺ+�’ËÇ|ƒóÛÞ+ƒ O�Á Žîê®ÛÎôÙ.¹0 _°Ø ¸|¹\ø"Èïa¾–ø‚Ñ=á"Ú ôʧd»uÅÙƒLSy6îî7B¯ž­Ûw˜à~Q<,š­d-†,�¦°RÌêó|âh²Èr5˽ƒµ¼yÞŠÝq¬ÊµE¢ÅìI’£aц.‚lïT©²»ï…Á•ÉšôuÞ84eO}¾fò¾mõòY”7¼­'}Œw¡Q-Û4ØmÂ3w\éS¹�‚oòå´Ù‰7q”:%¡Î—0¼y4Ò•R:’C™ðŽÅx©_†m†]UX/ãR‹CE§Õ²«M1Æ…¯G«&Èc¹¾Cs‚'qF¤8Ð Ù1n ¾b�0Ì€æGSEïÖ.¯ºç ¡'Ű;AZ¯ñÜ�¿“Ÿm¼K7!fk$ÿ�§›éƒc¾¯70K6)¿ô1ã}®'sê"%; äôùàØî08[“հɤO]ny³5‰-0ˆÆ¥ƒ´ê³¸—(£¢Ã…M(lj¨?¥1‡-'u‡ØêÇf0·…q}ÐðÛíÞØ·A3‰±=e1‚ ¼IhXµ±¥FdÌìî3ÇÓñZ„I÷g×'â QGQèë”w8Œvù·0å@�ºË°W"ü¼žƒ»Ô$6µŒ°�½Q�‰^ï ðR@½Âl+¬'ì¦÷æÆÚý”‰ºâ»Ï‚RÛ t™q¤áú' …gËNÚ+@ è_…ø­WŠ7Ž’A|PŠ|öû}"5ÿdÍjº#ùÒœ¯Ï]jƒ’ût·.ÊÜøû¸qiì¡%Ò8KØtŒ\×*nÍ嵓¹ZŒr×Ë-Š»”³;º�ŠK“€¨!’8ßË+c¾‘@J.yT(%Jd³Sºèe0ƒÚ‡‘²�vÒ®D¼”ada¶ =Î,ä1y¶ìHK †#̪ݲgwŠÃÛTúb~oo ¸z—ׯӓy|=µ¨5|¾ð­Âöý*ë–Ú9ö±r"cÌÉ5H;a)JŒ((‰h]2\ ?QH[³ëÄ g9_+Ü>sòâó/Ck|?5åÑXäŸè› ‘)Ñ‘ÿÜûU×Íoâ“iò�v$ihBlF�Ç$~Š hmÙ´¤«�Ò?ÞÆ4|l5¥¡›º˜Y˜>´voW#qK54ĹãKCÖê4£x/òÜ1�ðݾéǰÌ>®bº¿…Æ^‹¸HƒC,ºü—›.Ìon,÷ÇŽm}¨Jåc‚4Ŷ!ÚzZœ©þ¦%D‰Æ9ÛpÅ:Ç�ª0Z夳9ŒíU "�{ÊPb/šÐa£—J¾€ïI�Õã>–èÄ�… ´U†yM–äñÇ^9ç*I…Såî†dîêà°E·¡Õ²Åø$ŸÇ›l4`ßkŒ^2ÙïäѵõÀ1ós›;ð2sƒDCßd=©>Š˜kàñ“çlp¯³Û;�¾ñú¿…/0fƒÙX ZÉÅŽü9ßˤò‰S#ÎAë\è§7Ž…¼kųêØo -¢“Aeûênûßh¼Z ¶$v@!o3} •û×çs22 V(4—À€ýóƒrGƒz�Q;î"}¨_¹=°x¯¼¥T×Õåïõö„¦dkœßM?´ŽÛ ÀR‘×ÍXÝý€4¼îÉiX†žæ0sˆkíж°ba^ü‰—v¶Úægù¹Au?_óŽ�—ç Ô!óõË@"Äÿ}KèÑa_ÞÚÙQ+\�ø³6ñÀT…b½_:¼­e#XÆ2("ƒ>TïÎÁ³ð6þl­Ò¥(YI3ÉݾÅõLÄñCÈ›\�àVÄÉ:½ö~@Ý÷7ÓÙ¢éty‹keen?Vê—"HcsE5ÓŽrYƒ;e’Äó=~•˜>'HÎXEÆò¼Clæõ±™krÖœW5,5`�Igõ¥D�ü?r�mg}¯VùùÖîz¸Ò×щ.½…Êd0l»1ÕùÿnïŠã„øúïžk?wÝ÷n8s}QKûŽ—o«ç•æH8›üSÞ>гCk�×Êÿ$ùu‹�ÓaˆÓF`…Kzó}½öSkÇ– 'öÌ(D4½/sY7Ôö.ÖUòãHÅ1�rÇyôkÀUË/ ºÄƒ–SÕ.•Š•»€¢kÆxBoXê³h�jòèX{ø&-F"Ñ�»ÕÀªÀP¥”ð…¶‰›þË¡q>ùzÏä²' î<æåx=ß9Ÿƒ¡)±—žrø¡ä{½pª³zýdØ0à.C¥¿ÖK,JˆûkÞãŒbÌŽŽ:ŽsñyznÔLý¯ `88Í“)¶_X¨CáíÁù²ŽeáÝ` ßfÙ4�µÙø¦Ìg™ª^�BbÌQ ®ê¨!uùéÁWKY3¨½Ú¬Ü@b*Wf¼-ßc¤Æª‘dx«À4mâxÞ`«õg`šÁ自]pÅÊÄSµÅi¬Ä» œ¨¬ØÁÑxƲB½{ŒX ”ÍѯƵ^È×Z`²æÌ›a¢Q0‡¸�Æ)7/�k ßYUšx‹å=®U I„¾1§B!Ã)hÒ;š€{c«Ž…¾Ö뎒LÕ<Ò-UÏ.7L[» 1˜dk ¨ØUÉD�žL¾Ë !häJãgEì¥i~`í̯r�î}Iae¡ŒXß$mp¥;épÐk£¸òíBë“ü÷^cÐ×WÇ#tîÁjI礀å·f|}³z §P÷•›ÁQ6©íá�–�ÅÕé‡}÷SžvùHš�ŵzÖíâ�8úÑÛq©–VEjïï߀ÚðøËޱZóbù³hâX}{3jØ@¿äm„yŠ�/·7ƒâH¢þ \†òŲA ãŽV¨«Î×N £+ëíXø‰¯ëüÝØ\ ö�Ø;†±û^P÷Õ�ž»Lx/Dá¨Èý+w¶=®5¢fËÒxòN>ìÍ}°Ã¼�»õºs¸’±~Ê–9Œ;W`È‘mCU§š&Ï'‚ñºÈè2¥”3‡8pÏã·Õ ø”±_ÕÚзəÊW\ k»l±‹á½DüŒùŽå|¡�¬FwKž c:¥?fµl}uîp–BÜCýÌ•V�©¾YóX6�p9e"”¯º¯�c~NÉ+›æzò9èàÊå$^t«ent 6ã*r ”s½¦}ðXìä\¬uNݽ‰†�C4~ÐrÊ 9Zr9Kçä¹ãxÙ's̪‡WÄ¿n9šÜÉâøÒÕå,–9ŸªL ?“<XM_g[2ô’,oîZY¤"�Rö…vÑ`xD'Ó£ŠçÜ £fµzIî�òÜ7íú£qìE‘FžÁŸ·6 ¸“qmõ„üJêíÙvsͧÚ÷x Öø´•¼á8ÍXqø»iSø§#ámê\¯†ºt"`�vytĵ/2da?Mc3p³]ö°iÌ…æ2À<Ü�…Q–e· ¬dížo�¬Í5îðR— k†Á›ÊñïÓõZóÆÞÛ0 ­|ž6¨‹¾µ¼]ñϳKI •ÈÄ[÷ñ4�«·ý£ÚyíöïÏØåÙ~Iäþ®1ûü"" ééAB�O¿>H¡@ ôŽ~T’Ÿ:�¤$ $”$¡%�ºÓ šaT‰!$‡ºÁóŸ ’”DD&°±üí÷ÎrŸI@ÿžäg5·�Ì ±ï;_µ÷_Ìã¹Ò xÄuúô¢-hºõÞê:µ¨ÀÙ´ßhgb6Ÿe`\ÆÓ„º…ánˆ“ÍŠú(±a@·óúî¼5•ÓÚôÓvœ ùyÏW¦‚lpq ?>{£¶ˆ‚ØÊm›T@[|–ÐQsYÎÿšÜwüƒ�Æœ}Æ¢O\cz#á-u2ÂÊQ<Æ�×ûlàü?Eárºd´³ÓfÎÖA®·W¼]…š(¢Û7Ñ­šBŒ. ¶ªæ6´µܾݭ0å¹Ï üMúÇ"�]1Œ½zz¤çœ”)[Ë@µ&·v;-µ¢Û¯ݶ°[âvºM7< äæÙ/¾4 |Þ±ôÂkœµ£®vÇ—Ôùê>â,å÷]îG‰•™¼/Ù®aΘ)¬Fa³zYø ï‘C±9] Í]Ë]s–wà‘e`é¶ý/�”E�˜Þ°{Ø´ö0�vÒ 5ûžé#4þã/.wCMc·Ùÿ»Ð¶¾©CŽáWG`ø³üÁ¿,f®I!�ä-.õï{ŸKK=ù•¨ã¶0¬¯Æ6ÚŸjç¼r‹(£MÒrf¸’¡qõ¨'¸_l}BsºÕÃBª ší}þ) )43³ß”�mϪÊ#ìÈü´Õæ1¯(ºUңإ;C½èΡ“á�ø•‰áAh6‹¾5‘½‘ÿ=ª±n=‚³¡Ðá¶~Ü]‚~•²2Œ}0qæÊ¸—cUÎt—Ö[ª.û¬.A3Øn~`µ¯ö pñ¢�±sØ›Â%°´Û„=€ç†à]“e,R­ˆÃgnçÍR…g»HFîª-’Ø…¦Ú .®öÁ4m® zË £ƒ:VâC·1Jíi‡Ì¼^=g�»Os­Fr ›Ìe®…Ú*÷mØS�z f1Àl]ùF|^WÍk÷¾r�ÞÁ‰”Eû©­üg<ô8­÷ÏíH,ܶ…ó��Î:MqΔëP˜=·¦·qÚvü «ÎÒŸxêvæ&kì2¶C®¡¬NóãÄ3 m½Ñ?btÒÌ5£ß-uw–+n¶A=/Ý9  ’3.bX¹:…Êl™ÝÂ,Ë�‚gÅ`ãâÈ1P(;»†®¬6rÓkÖ�‹lhô† Ð`$Þ®í±�l‹&E©Ó%Ô ¼l ŽÓ @pâù²#×:Š?e»k×8A¼—rúJ×y©®Í-´A"ÿhSŸúñS!xA±�}Ó×Y¼p@L)�ºŒLÝêÊx�†v{Wºàú�ä™^Àwpð¢^»eZ­éo*TºiŠÌÇI/û¼!¶h�ñáïI êÜ)´zøÏã�»ç,�ŸŸT\Z®6Hô)·ë73­¸keKïFוú•5¨`°ñF,´<ØÀq Þwt¤'!¿rF7Csd*wq«wqdÜØ#Å®ó—ù0ÕÌéŒy¤­Ô¸Qácwæ$÷Çôy[ë"{9·eþ€Ú™ ãéØ'™/f0׈!¿@+à-ŒîãsaŠÉÍäŸç€tB –RK_@`˜ ߊµK§ÅàÐÌÌ!pð‡"³¨ Z^é16°uÊÑIh:ê$ña÷ƒ:Ú¡ÞžSÏ(r=Û…wÈ?¯°J�2g‡¾`–×b<5@‰‰°V5ûKíi#-'ŒùEápá“ØÆL–®Ð0¾ö;I(¦{=Ð)þÇæP¼(,i±jÍËšŠåFWƒ½»lð4w™re²]øn�Æ­l~ãÉÌαû7‘ï.¦î°ÙÖou¼uÌe%sȦÝfk‡b6��;ë{W–6µƒ­_²–¹Õ½Òç_7e Nfâ³> Ø(xŒn9³Ûa„¯q<¢%¥³/0¹ 4ME&dVžÁÙ†%Òõ· "�±cU¦ÍÌ ÏñÕ‡ ò+²[¬^fW\<3ˆâ§¯û×ZiëŠc8]`©Ã[Ðôê›Ε·Ý \(¸:„`×gÇ,Þ+‡š��8 „t»ËO×ÓO‚9—Õô¢-z[Vuª V7@®Ù>;ý‰<ÓÆï«ÈˆàŒÏó8B^ïª:È{jÏÇfß±c¸^3€Ša`í¢³îê½éìiªóI ¸ã-³/øÞ)£Væ pNËU°)ÖèÛ‰ø½wn-ÐÒœ!_©‘É#KL¹Eê_]gùµDK×ÈÀ¬iÃæ÷Y~L¼EaX$%ïiÍñ~nßD4‰2ZÜaü&©e°©ÊKx€a; ¶>¥R¾(¦6ø·\†ù«o…´‡«’Ðô_8�ºŒº�}þýÀQ‘À‡#°]Às'MÐOË™<ж¡8ù¶Ê8½Á'#lBq¹#•ž”�‰Ÿ.ƒfŸ®b‡6e¼”)‚ïèµgQÞüëþ·"×/iG•¯o‰Ü;5¾«Cãn Ö¾ý “ÈÆpxV‚�hº§ö¦É€ÖB¶ñ¾# XÄ¥ðže(¯šZ®…½·"†€ˆ‘Û3óªŽxÀÝ¡"£%± �N² {˜“jr Ñ�èE®;ƒÂœ…f[œM|6új‚V™“2¦eº�öbI# «Z²¤»¦Ã³e\ßzÇrsp~ï¼0Úäe޽묰?r õ ëµ¥Ç]ܶOS-õîá Hd{ò9º³ÿk9¡pû`–o.60J!­€›åæâ ‘z7@fS Ù/Å™œå8ñ~çÖAÕзj‚/;2ë7¤ãá­ ¶Â[•Ð`þ}Q›Ÿ;Å#é�¸zŽò±¬ |>¨ñ¨Get™P×>éNCË~464µo‡ƒ#j(Õ2äÚ^Ö/Z=vG»d[_*³z5k�å$þ˜Å2æäµÛÉK2c†˜²aö"‘=�Ï×ÓW½20±t/­Þ¸;å¦s)ˆ#Û$mO8n$²sŠœ-pµ HƦér>öM37‰A¯�>ï˜éçÁWz°‘©œ‰ÃÞe@~щò½š²”ScæzôÊw.œÎ¦‘ŠOhõ/'?™ŠN$ä‡�§HµÎó€8OÕ/—ŽÑíôO$Àg`z æÅ¨Ì8ðð©†*Ö+‹,ó­sV×Ä>6bi"ƒÂ\Z6a@÷°¾ÊpmKÆ45ØìÔwi{'vÅ YÏÃ{ÖÃz`iÌžæ ËqâKhNüLŒ©†kÃd6¹=çe$å­«Ë™Þ7�¿tœ Sõ‚†g¦k »ð*ïvÑÍûÖÊ7Cx+�XžK©lk¶:1h7îa¿s•û¶õ¹0ŒÍÛÓÔÁG¾”¾Æ¤¹”¯{�8Íò¯\†,ܘŽÌø¦3ÙþbÆ rŒ@Cb4†[.|›>6— ‰Q,{ZtYpÇ�Ü9ܘ¶Ü7´àåÇÅgÖs»ÑâÜOÆrfL“£Î6W°4‡…Óõü\±¨‡)釱ÜvéW¾=Mrˈ^~4>@sX¯_²®h}ïè^3v¿Mù)ÕÖ3¯³�ik&ȆÍä"Ù#:¨KëÇi‚r®¿C÷“ �~B&‹Ê�ÑCÊ,WÎ9úÏŽœ‰+}˜ï–Ú€u¹õ%ÝK˜ {±`�<ˆ(ï”ÃàqgœÅÔZùƒ"rŽmýÒ>6‹ù°zˆ_°®�E Ì|i‹wbßV­ý†µY€jv)ñD^¨¯lã~–t´Î9lÖ �¸Œ=²ö«ów‡lc¯Ð¤¢*ÆIà|³Xæñ{¹±ë­/g.xjE˃0úËeÅø64f íåQšÁÐßh]M¨Ÿ;h}7„‡¿¶{�¯)„"cî"»Œ'P¶s¬F‹%~â&3~`È@/VϹ™‚VÀ /Æ»È= ƒ)ì]–±VS¶.l$×¢û¯Ä¾q4»´ =¾+ýîÞŽXk vR;Âå>b€èçmíÊx ¾ßÃQÔP*ß2­gF¼à¹§¬†L* òœô&0'X2€¯.Öôðb¤Ø°¦Ò8öcÆÛÝhܬ½’¾W+ßÕjÙ21è­ýä‚ÕHúY-óôÝabôtçvïŠÇ�¸×[)ÖZUú6kji¯þ¨lòø‰ßþº³t�_2=³¾1zxì¹¹„u–0Ë›bëj…ѦZèËÎ…±§£'à‡5®ae(Ùù�‰/Þ`òóŽ÷´¹Æól'zØy¹„�Ú÷) ÑœÙl#~í†Möš¼Ê?rÈžà"®É#Ì-KbøºÈfij!¨{î9ê¼…ò&@·®¶“鸒AÛ«PájÔ˜}Ô·®—X…NÜ|•�bâ Ú 8K޵^Íwö'¼´Ÿ8¢;èVÿiÀ‹XÇëwÀX§7_è]v.{ÑvÔ›Ïv‡r Ü=ŒfwÀÓ-úŠŠò¨aD­ƒrbæ@yèD®cvw*M¾t«:·plƒúøzký„[U¯ÄQ×Cš,‚…Ãôd'^™> °î� Û¸o¶‚�UÊ�«t‰qi *ÒÃ]à†ÏQˆÓÞŒqFÈ@OÅÚ^ÜŒÀ »Ê]W&0�…¸’ä¥ù{§4={z\8Ìdç°º®Îmº§~h4 »îD ¦ûÃòQ•›æ¼`ïlfÙÑœ“ µAc))X€2÷´{èÎè&ò4G°Üà =©6Jd»išã«¶[õê¶¾–͹�¬Ÿ„H_)ì”n ­›ýG~J'–)kÐÆ™lí³È×Úœ"K(x§(´‚ºö"‚ä[®ýîŠ[ â^ò}.¯ÀµÅyl®Ì�Ô=€Ï@ýg=):VA1œ�<¶ƒ�°lýN²Ô±ÛºÏrVLj*îÞvÖ0•Û66Õì牃#N˜î™ å Kö…Ïmƒ½Î؇¤®«1h#ДL·5jcJøæŠH1ÐôñÐèrg�ìÙ=y°þÃø}úïdÿàUýDD‰ʄ¡" @ ’‚ü•ÿÌPVI”Ön�=€#§W€þÿüÿÿø8]χÀÛæžÏ»»%:ÝVvî³ $€€Ð `ø  €øzŸKª;‡u½³ÞÔ(ÛU–š¥i ëS¶ÙR�ªú7·­»”m…icUQvt:§=ÚöeJºöçU‹nvvÍäͽí®ÞpIáj“ÛM°t+&˜ª¨–µìÖw«½=ίsz^4ƒf%Í“S²Ør*»Œî:94VµÐ-»´Hžš�+@´m SLªDl{nÛÓ]h)¡{9rª!½Üö ZµU%¶Sfj­”©T¼²JTª6Åvj¥ &ÖÍb‡®ƒ­š�æwÇ};Û”’ÝÊá)ÛkWMI¶ú5lFër–Z„ ‹Z‹l%HØÐöè]g{Þó-4ÌU¶²½nÙ·¶§¦õ¤öÔôÕ=±¶ˆ¤³jÑ’µ³4Òƒk*¶Õ¶Óuf@%\̆m¶ F;etÐ*VLZÉ]�p(̶¶µ°JÉ›·(HVöõå)(€éÑÅ(´Ã¦÷ìë{{ׇ½Û�ØAÝë«­µbÀÛµØÒ¨U¯v‹ÖTöÎÎ.wvì;ºÝ֨öTìÝ»‹h¶eleUjîÕØGv#cBSZ¤Ô¨Ôôj•$²”¶¶=2 vÃn�Í“f�µj€Õ¢�+�rrhPh5T ³e–d#l4Ô�C» ¦½Ú»0 «PEvtê%m„µZ)‘U¶¶a)ÙµÜÚÌÄ�“Lš+ZM*¦ÔÔõ¤åéÇg9¨vh‚Ì×{=íJ•U¬©¯mÊ»w.÷wµKej¨µªÙ J‡m(tËUY{gcUT¨BTm»·B•R˜ÊU$cM¥V´éÜm�C¶ëU³5“¶ºÁJ¶ÛoFtÞ«µ�FÚ«k ESlJŠ·|ESü! @D‘M£Õ0OB*~ É‚ JRM¨õh41?Í ¥J�Ò�Õ@ d"§à”¢ˆSÔ@ 4Ð ¡¤òš§”FzL’Rš!¦›Iå4Ä Ô2¨ÿ±ý§ö)þîãöÿ�õrÐçù”ÿ+×þ*ÿ¥ÕA†ÊÿɵFZÔ" Þ Ì8'@[T¶–Èml¸¹²³Låj´\Kœ"MíTPË+4ÄMfBCGû•“J#b–{HTnQ�%T+ª%ÈJ""7íü¿r¿²þã[nÕŽÑ�wUu­ÝÞî8�klN·«vîˆÖÖ ÚvÑ]Å­£qÛF ±mq]î÷½»»b¨‚Ñ×4E15\{{·‰Ö‹[¢íX¶´h½Ç£Þ ÖÛ˜ÑÕݪ:ìmvî'½½{Ù·Ovg{·¸»;näë ¶ÓFÚˆžµÝ|Ý´XÙ+Q¾ݳ·>½Ý�⪊¢:6ѵÕ Q£;®ÚÙ®µUÓ·˜.µ¶µkhöÁÑcb4è5¶4[b‹릎ÆNµ]>·m·{ÜxªŠ5¶Ñ6ݹ볈íØÇ×n‹k·c[ˆíwt3>Û¯FŠÑˆ;mŠºµ|@ûßEñFQ耊� Ÿâ¨¤*&b¦*¡¢–¨ˆ*%Š¡ˆšjˆš"!‚Šj*(j¨‚ˆ(¤¨"Q •P�D!d�P&(¢b¡ªi ŠJ" **Zhª" (‰E dD€DI¸HŽAV$ ‘XL@Ò¢�©äU0/ýA`@yEd�ò¢�¢áAHdU�XQ|ˆãTÐ7E+HAJÐRÄ�!*àe@!W—#(py"S“#Àò¸N@$G�%R4�AA2ÐÌ%4ÑKMCT-15%4TQE4ÔAIDÃGE_€ ï44DSMET‘% 2"6h*©(šb*’˜*ˆ¢&HŠˆ š("J¢dŠ"j* ŠäA8D“g[: Šq‹j’ )¶ ±“cQ¦¨3¬kkŽ+b­µ£kHRb5Æ�U³%§E¬¶1§lÕµ±F-[R›N¢‡ZKc9²c`¦Ö fÖĆ´ÓT'M%b¶”�Äê&(*¢+PSVÖ"¦ÚÓm$Z"5QDXµ4‘$IhÃm­ŠÁFŒN6 F"‚ĨÀæb€ˆ©Âƒ¤ˆ-aî;v"‹`ãkœwmÇ]�»ºqu®œÅlw.-ÛlSvu££¦©í€Ž1»»­µQNº;bÆ6ÕE%Ø3-—Ilê‹m6Ψªµ§A«§j��lÛN³ÝÆ¢"»8!¨ª‚ˆí‰Šš5ŽÛlhÆš5�ŠÜbŠ;»»±‹€GŸ©¨"˜¢f™¦(’ˆˆˆª*¦ ¨¢Šj*ˆŠ*Šˆª¨‚Šš"ˆŠšˆ(‚&J &jŠ‚ªˆ!¢&g{Ø;a+»®¶íÜtœET5£IGQi·rnî5M'FŽÆ6Ã×Gv ‡AÓ£­7Y0)" Ó TÑÒx�G®»b�ZâÕ­Òé½»½Øö7Ý“löãœF«¬ln×Xݨ�´Vƒ¬MtŽ’ *8µ4é5]»Ž·h�]=êÞ´èÝ�·±è÷c{q½tö0U“zÂhwuÇQî¹ë¤ÝgÝ‚ƒÑÓâ7½Ýï]ëÑAëIîÆ�GTzÓìkm­ëE/¸ÑÛ¬w»i÷µqã=/CKí×ZÁíŠØÁÛ»®š".³Å�8)¢ˆƒÎÅxŸÒ©�áxÑ °†±b�4šª¶4SUEDi(t³-PS4Ä4Ré¡ÚÀ[“M°bÛ: ­PjŠSA¶(M !¶ Ð%  ÒѧTš  Óªmš(44¬TiГiÈ,’ aB (TÑ5DTS10Q$Ij+j-ˆÖˆÌ•£E[FƘš ­:u¢«ò@è($ª*#( ¬ŠÀ  0€ª?ÐDV… ¡¦•…•YR@À Š™ERT U`E!D„A€!(ªB¤ˆ   (ÿÜ?ñûãFÛ ¨-ªd�‹LÄ5X1b"Ûj,cm´b#X›¢bÕM¶Î*Ö͵¢·Ÿ»7ÿrïŸZ›†ŽSmZ~þ8 ¯ÿ�þÄ?¿ð~ÝÃÿûüšýŸº5ƒ�çÿŸ(øÞI_†ýÐOø~ÕÌZnß^gœˆÅÕ?á­E« Hæí%uÑŲ`âo—è­ôÊÍ…cÕkŽé#ý¾tŸü¹e-¢ÏúW¾z¨½ÖÜÜÕ/ýKÉ´-„˜ó«€OI­¾…Ž®çÀÛ*qu±ç „˜Ë5†ÖÝ ‰ŠNhD�r�évêò¹oà�;­ø�ûÞ÷�Ö+_ýaýC±¸•ˆìÁêÇmÞÿÁmuõ/I@G5Gæ‹ßXîc4 ")+v$ãM”`¡eC@YY(ía«+ºdΓ+ÛTCý™ö˜z8)¦WÁãŒrMÓNÁÉuk,lþ×xÿÒJo|ç¾fgühlí {�.}ÊÖxóŠÿYf:ø&þ­¤j*1!_þ´Ååò4"æ¼;kÿZ’Äú«·°â1btå1�êô‹z<)‹‹–2õìßìå7Õ†w¨eov±J§BcP‹ :›/<'k6¶N@°×©VÊsÊÅóØÜSŠË!ǽª§ûx¿­›ôKz[±f¶�Up-¬Þº¸•¾¿ÝNëÌ f½Ùâãš¾y½D%Û‚ê&ÔV—ól†)ÛÃ3&‹�L·(Øï3ÊdãˆÁdSË¡WPÛƒd…¦ø!ÃïÂWºv‘_d«XÉÀ£¦�¸¶*¦ú BÔ” !Ñ …|\5ÕmòQ 2¤L㨧µž–~S6¼FO#Ø­æá^⤑æÍUï�; Åá·%HµqÐqy†{�pS«öRªõVÞsk¬�e[Adytà ×`"'BrÖT¨3-žþÑ*Ð�˜«­× :þT'y9í8ƒÂýã|†\¡¼x’W¨GN )…¡üÍßS„ßD~ R£?d×F/CD^©ÄIïBØŽ5Ñ·øm‡š7Œ˜d÷׉`a¨]šÙo¹SaïB‰È<š1®Uìm+|\’v·sÅ:¨Qδ1Á´ÚþñÇ[SåÙ8ª�>ÏÆÅH‰ìw.l¹î5îÐɾxv�ÿ·½ù*›s€ngºh“!ŠPe'iacfüÍë…Ò:_È”ðj wøÂ°%¼ý²š‡‘³ªypÖÿ‹W/ô‚þE¦3‹2 (6-G £\—IþµOÍŒIõ}0ȺÃU�µÆÑB•aØ`ÂïåíÎñ˘AGã,è°ö:. áƒ:yn/bú©NMÃÁ$þ‘84@G[u¼u]»G‚½ÓVókJ’‹“0˜j6uÓæ‘>ü½�€Ï¶�:u’cY³­²R^C�ö_øòåM“J7)›‚Ù¿ð‚ÿ¦ ëióf¿í®cžH¦Ð'x¼·ùÿ(zwI¾‰Ï�ôaéØEV礔9•)‹,ég9+ßÇCŽ9y, "/»ËŠ…VÉÿ3cˆ)N›`@Æé¡´‡üË&Mµóª�Ó�Ñ£±b°qÕUÅgúá§Ñ;í¶¸ŠZðÏÖ,[ëÒ×|ùä¿,$''>_çßà˯cI£×©7]ô;éö?µ¼­^ÓæézþŒl$˜+ûJqÝø¥j>Þr�€ç‰…ÛÆá-¬î>«;Ÿ5�5£öa+Μ�œÞ]n[*‰˜9Áþ…ôÿþ]µlF1’›;^ß|V§K¦»"“H7_ÇC¶Â6¨3k¥G}g5ã¿Û;Ú”­—„éÜŸñÌv1;›pÒïùn»ö#ÜίväËë*ÑzÇ@v½ù�g¶1«>FÃÖtº»C!¼u·ÙŒ%�Ôþ5›ðÂâN¦ØÕI[–˜ØÐÙÞú²¨¶0ÏEnœ®(v´Ei~n¨“é]ÄbÒóÃ×;3šq Vh†êÍÞN‡•S?ž›¶X® >6û£›>É5£`Ö›ú ñtsݺ›¬öºCæYÃÆž Ó0·](ÃíQ×å³Ö£NàÝqaƒù8�e°gǺ÷Q”.ȳ†û%{ÝCcùönš~Ä#Î\ÚWvjc˜_ã/G£áBU}¾iÝ\<<=U\_>%µvêŒ�»ÿƒ�¬oˆ\*qÏEö-qy9&{u²”ôîÑ%äàÈûgë ã?TÂ… �tÉðŽw—Ó0wÍü[^Â"ZÃ&[­Ù„üª‰ô~y§!C�OóŒè©¢ëˆ2ˆ¿K{Šwzó ·Än{ÇaA^¤ŒÅ?g Ct—Ñ)ôH®%ͦžñJ[~ËÁL%üí.Þû�êLú'¬gÏoóu‚°I ð_[rÑ®"Ü >]Ò©_¨wÌK³øÛ\–±ÇwgÇöpØôíM‹^ÁÆ™F·ˆ×“\|÷wÀkÚYös�ºUcƒîWlî‰ü<¦‰,g5µ9õtn £ÎèÏJ7"9lâÇ&Ƶ‰åêòGn,¿�üÝ.:xîþLší±"ÖÖô˜ø™<´! {Å_IVš(JÛƒ¿n5gX�‘qycAÏœJÉGY×.ˆ<�tlÆl»v^ÈêS"™ù¯rÐ6x7º:ÂýÆ;GT(*2¶ºx]ýÈ qÒ¿Òä;W Ö)<¯+¦Íœ~O­8§bÅ�gë�|^¾,çó””_C™WPâÌê:ƒ±¦ÑÊ ú‰écŠäAÍÃ{¬\ôhºá>“\ù¨QË7F5¶q0D‹AS-·¼Õ¾u �R–¬uZÛ“û/¶‚†:ëxáÉ»²ã�±`rÒù¿õã±{_~J·Œ?«õµ�F†ÔÚ>$ã'×î (ùQãW5£Gñ‡;-–ñp‹j|ùÛ—‰BК¨GW(%ÞŒÌçIŸêÒ¯ÌØsŸì.ºYÏœáfßG¹ƒK0‡3¢ÿi|#‘ÆàÀùéO¡ÃœÎ[Qph“ÖÄDI­×²:3ëJü;ô˜- !»å:³ªÙòô›8Ìï‹A�õo3i9HƒÉê"^÷þuÃó1´*Òodï}¯|·ˆ±�ˇ7Îq@ý(”¿ž·Wè–�g»ýÌŸ¸jBóN>bÿ〃©É¡Þ·Ûƒ~Ê–9¶~Âð›A‘}¬p�4ÿ¼Õ‰œDze­¹�ºhÐü~²ßº!Χ2bÈe~™«@Ë9ç)3Aª¤#1ÓÑaŸjŒdº7GŸmªôÄŒGI× –õú‘mTqá¶{ÁÑï6µ>Lßûpã‡ëò¦Îè´KRwËê�— l›®u©VZ9Àçý'Ä£8Ä" V`O]iôlyÔà÷�®„#<ä‚Ò“äÂ�çBñ„ïfzÓcÀé­wUïIÀ¦ë;KˆçgÌéïœáÃúÿ+éÀüú¼û÷:Ko†Oý,\»iûß9*_Æ ÐG–tQ Ð/Í3ÛoëëÒÑ¢êÄ;…b·pØç&v¤? ¤Þˆ3-Ñ0å¬�œˆ-G¹I•º§ —ÌoéÜ«~ÝË�^ ?sdžV1¼Ã<¸´ú¶Eï¢e©43^:s'\ãËœóFo=q@”¤ú!�<Ô'%Ѝº”ÜÛ9éÜÝêqìïžpé.ë‡üÓ�2èÔCŽ58E¬—ÉHØ�LdÞ"sétÄi÷\WyË’Þ&I¼ônÝ0Ø)^�_™½î_žbàóïÞC)þ_h…•‰Ïãju‚v�MÑc†ºŸ*|Û/>!ú½µŒ(×É2028Ô:Þò§°wâ¿"w<{¾ Ǧó:@=�ê‘cïÇ�è>‹ ¸PÙ–6Éw¯+DŸ,xç®9æG®JÓ˜‚`ZÐ:ܯ‹"Ä =XNô‡îehÑjÇݹÆD]Á2ŠÿtÜ:®úKÅ8Ô8fI,£ÈÛŽ®Ox#e)H@³ð6¬‘¬Ó“ñXÙBâTè~`¦Ö^ÌFÏ�½ì¥§³™°PÝGpd¾t†,x¬"EÉW‹å{ÛúVÏV;3N˜aÕ8l+ÄòÈ çÍ#ÝM«ÔÒ#Ž’'LÁaK'E%óÛîì `B´®]ÊÕÙl¿›þ�Üüæ úD9߇>2Ûš}i÷Ä)&þDƒ$œœÒ·‡‘³F=¹>(äMô Bõ†,ÿÛó7{ÇÌÝ&±+»åêÇåp­Œí7pD?G˺5uv¾[gYÕ_tˮͺ}ë'±9„"(ÂÝØÎÂ;eñ½Ã¾<«l ¤’gã˜ÆôRˆçwÀs*{fÓÌ, I$6O=†<¬xàÒx�¿ª0¡XN\”MÁG¡±òU0c)Çõ63Mþ™IÞ‰óŸŽõšä§] …¯§ Õ_¼ÝGâó9=ïž±ÐYþ·ßòUâa±UÇ“ú§�”¾eî=Í9¼bJGñäÎqáñõÛOïçÇðìÎTØÉenwüãtš›žÿ‚ÆÅñQ¤ÇcvÛàúbRò,Gyä˜!(úŸp×uCÍ Õ!×uGŽÕ-†—çíwGg“õ2�Žâµ$jOá\Y©)ù¦cÖ"­ôpÉ6„örpȟ<ø‚þ@9‚„Å«Møë“;Uw�J´]¯iI¹UàXßgý’‹êÕ4ôٻٟ¤;mnþG¤ã˶×Í4ŽuxñÆÕþµÙeLч·™ö}Qz¯ŸªÖ¸t¹;§{0Õ(eK�CÜ�ܹ¿ ÉBÔ½UEü•hÀ^÷t�QŽ={ÙáÊò`iäª@ŠN0  öä7ø5ˆuÓœ厛øÄž’ÐV_~õY ‡,ÞWNa‰O �µ â6S•]bW¾ÿ¹ñ9åbfø’­õo[Z™€þMK¶n§¹ûg¬†œ9 )ÑA˜±w¼ë+ºòS_ñ§ñæ®ÏÍÐ">|ÓÅ›‡,“:²Ê¹3Öûm:Œä¸§(À£ÉUÏöçß,0½.cfÿf|+×õ•à:SÕ®¸w �x6e‹³ä~ûi}šñO;”æG –fm=?×Ò1ù2æU3¾›oz�µHÍ“Œ£„mr§Vžî•ËjÚüò[lJZ x ÎR{%82w“ž1O%F³}¯Ël\ð¼zÀ$Šaoã­>ìÞ¿Ž wˆzÎé¶¥x”T.kxáÑcXÕÐ�V5ˆ¸ƒÂáÄä½îlï>ñh1–ÒOQ‘â||.^ƒ·°ÀŒÓD~™!Íœ0;¶ëãŠÜ³u¿fSÇÃçèb(ÅúUª?Rcˆ¤£y/Žá‡Rýx½Ì-Ž÷*ÝÌÄ»ŽïÄÿ{‰t_žL®·¸ü×}ƒëh÷Ë+<Ú“Ž_ùÉ=ãá´PàÞú°´äk,BI^¹ööóÝSÞ±Ó5¶R“ÎäV×ÑÅQ´gËÿ]Vu¯9l<àÑ‘d m2Ê,¬õò‰ q. Ú7Çí>\:x…OžÐ笂GZc’uOzây”$L¡ÂÞ±_­ŽKñ³j"Ûñ‡jc!•ñeÕxÉn—Æ^ëO/íð â•¬à%¼ä›�gÒKSĤÍ7n�?aÅA‚ã„Í¢ÑùW•1ºwIœ¢sŽQʆ  ¶•…ìzþÝ€ä�Bpò `o¤ä_éf Íñ'GcA´&V¬ŒÐ*”ƒA‚îèsÊc-Xä–)Â9žäUމ4M„·èðv�õÆÕK<ƒyHŸX_«ûjÌEøe¦3½M$=rñâ2‡½»Tøo‘nÔå œ§¬~ØÎ;&´ºß „Gó.‹`%Ñž±Ÿ‰Ã009!ÖU¢Ø�Ö�:¤–ËÙç¾~NÜg ~Ss•ËÈåàqµpí±$”Uœ±~Ã9sZ©ë{üI²õGõrûÒ¬‚ÿ+w7¦Œã)ÜñâÆ Å1è·æó¦›…o1k5Š3$¬oÀÃsaü�>0)í <}»‡1]<ÚÉöÂä8|yi„|åìMIÖ€sÖ'òÊÉ;ß}Ö¶]4åÏA ¶^�íÝóÕ»¹l¹^Ö|3ç¥H£8AÏêTOhx|ÊŠ¡–gcP9—qÓˆãûÍG¬�uËxIàý‘£×l}g–o¥ÜäŒëäÙ†•¼ö¨Oqû丅æÌƒØ’fÙv1åwôà}ö�€Ó…¥\ò,9w$ ÐØ‘VMg8Y¸FÝk¼>Þ—½:/Ô{ǽó®*¸˜L¥{·.×4ß.;³‡¨0ѹÐc˜£ �Q–è �›üòjÄdWÎ5×MUÕkúY‡ý92cÜòaJ9vÎÛò]Y;�6e{”Oz/¸æSµÚ9ˆµ—çV�N{“9gÉ¿.'+¥¦áç$m¸‚ðìù›Ž{n•Ó„E¤ŸÆ+8´‹í’Ù�'{Ó±Ö¼X�nx©t�¼tø‘Œ·"’§Eò ­¯PѲ3×=¿˜|‡Å×w<î*ùG¤ƒ'ªnTß'v•z»‚ÖŒ­Õ_ö€þ¬÷öË3«:#g/×­BOƒëì›c£(n­Ûg®tÆÏënÀ˜ ¼¨wwÇxÍFôŒƒ×ÓŸc¸:6ƒ!x,Y^Æl,UÇ…áãO‡B†KшONK‘³§.>;qÅ™§ºÚÖ#å"®“cúÄãt¿þ×ÚH7v8ç~×j<ˆ~jƒÏ*–ã¿ß·¸×Ÿœ6wÀŸºž°q‡G®¶úúš?äk¿"}ºgžÿtÛɽ„�ïtïô.ŸÉÿ‚‘å¶æ±Ž™kjåfÿ ÐIN­¬ ‰¿öî}„åM®/å�¥ ñ«m wI…ÜV «2Æxk:8f_)^çíÿcKRdm×0Ö Úh³vÝÓ{u¨¯I:åU­bíùÅHýà[JŽÿRIO›� îiXº5¼ÆI <¡Ãa§¿óÆeévÖ/M¥­ ìæ�»™ÀÏÓËÞ퓦ö®¼lú+ß§Ú±u|´)E�Í·e_�®e×*.ó�A½(2kJÐuºJUI”lÿe]Y‘xr¬Dms‰Œû]2ïM`Ø_ˆýd��˜Hg¸ï–=»ú·S�‹[+à37RÝyÊu@è}-KzÜ0ü².Œnò~›¸²5söâ`îÖkµWÍ�ŽÓÅwsæN‹oÛæ UÀ»¶tÚpØT€û9bÎø2|žo|C¾Êaªq®`ÐY{ß8t›*Äü�ãÇ[>±=âÑ¥;î˦mÕýºUÞâU›1™Íž4%³Lˆ5zèå¾9ö¾Šñ|ú§ƒŽtîmÇÃ3fû©7·œ'õÜ 3'Ÿ*‰²Ž»a¿£é¹©@ê1ú ž¤äv9êVüaßÉÿfÌñÓ®fœÞÏD™Ÿºç¬¶«7 ÁîoªÃW…¿˜ã®�ÝË�ÖóG”Ô©d·”8d¢0Tôºlµ"í:xv0ýâcؽù”Vâ'9Œ"ZóŠSÉ¢ëWü]ÊÉÞ8{Z_±â«¶ü%‹z£ß_�þw ŠA²š�5�UºŒ2mÅu7M®€“Q¯ê·Ü§˜üi Â%?Xôša|܈4ÿƵ•�ºgBÔêâì©_’óÀ�z>¿¶&_±µ©Ú43UoLñ2Œ^¢ [šl @*€]}a„'LD´†ÕnÇ5¡OÆQG«@¿^`(W'][zÎ�ÇÊH$E™úhö7ûÑì}‹ó‰_hæóDïkMÍ Çë7òk]–©àõW·ú‰ƒÿ~Ww—zðÝ5öónêuËÖc̽4c{‘–ñ´Ïy¡úäÎãÍãqÃ%'@YÕ³JºÏ—}§fнSæ(1aÔ‚µ…0¥§ëg[G‚¶Y„ÑùGvÎõ.Ü­þóŒÃYï#ihaÇàX�‰)))¢ ¯Ú aX…åQ�ì¢Ji `¨¤¢&Hªª¢¡‰šš‚*˜"bJ‹ì ûÀFþj‡„Â+þÑóQIGúÀEù %ýÿØGúx¿…¿Šƒ ¥IÉVæbJ¬Ã¬!”Ä êd2±‚!YK‚ 3%Õ¦Ix˜,AY ÊÑ/ˆGg’!•¥d’ „LbC KB±‚åY¡„«¹u12%X9bUˆb%`«+<« s.Y%˜9pZ‡†’ÐUTˆ Ð 3Q0²ê«--ThXB˜0êê¨L™*áåœ €Ü•PíɇnøG¶îݾoqxøO޵óã¾{‹çÃr®ÊäK‰*Ê%† bTD…G—`Uغ©u/ Ê]‘ËC#P³a\«‘°òЫÃ3L9rX¼©TÄD˹cJ´LDL@— ZJÉvU•P1Ìγ*ñX9d;$xî>uýŸ×5%UR} ‡ÜDŠ?…E?±Sÿ€+äò°"’ˆ?æ¨ þ`@D}A %TÅQQE5$J‡ù¨‡ ˆ!G*”FUI˜TPÊ‚¸Q2ª¦QÊäV@^È«…$Gö€~` ÷2 ¿`AQÂ#€‹ñþ¯ìˆÕ}wÛÛÛÛU6ϸѶ-¢ çž÷\ÖØ®Ø¢zß,A°>ÝÑ£åÕhª7Î;íëåîô_Çoœ÷ÍÖôxØ®êù½ìó&=�òÆÛå]tâÖ‹Ûˆ®6*#I]|�Oâ×o�Oàþåõ û‘þ¿ÍÚ@‚*~Ôÿ4ÿEDàEL"ä ö@ï_Óü"‰Š¢&”¦jI**¡¢–e¤""J¤(J¡¢’* ˆˆh¡‰ šŽäUCç(P4�4SM KKCÀõ áDýO²ô "æû�Ê(§ï€ýH!€?4H…r‰ § ‚€gúÿS CÕQØ£°UPU„˜W.MØjDQ^M ºÑeL—bhý¬Á0VkG--ëo”vß>ßJ訧úý€ö€�ëC¿±b¢~ñ<ÿ”?p!À#á?˜)ñ5_²*Ȉ2ˆR€H² 0ˆ ‰úÐEH@ ATgéÿ<[Ñü·n:{·nÚÑ�wqˆ÷Ž7º;Ôˆ·O]9‹»wµbkZÝEcww1ÞÛw]£oÖìlÙ­°mF²r�Ü?A åDÆ@E¤S€R`ð‚‡ê„$@• ”Wù¨ý*eTG…`E%œÄ4¥DÄ-5T”ÄÓ@PPSBDR°DÃÕTO ¨þŸà ø©ð"¢r`O‚p¢å¯Ò(¡-/놔¡¤¡(JJSàª- ‰ ` „ˆ ~bxW¦ý>Ç£q½z7»ŠÆzÛ{Þ꣈Å^ìEü"ö¢ö_’WI¶ÞãZè½|à»wd*ºöÞÚŠ|·¯©6/[«_.ŽØ1!hia˜1 Cª‚‡e‡b¦ BÁ‚—S ]Oz::*öt÷Y Zj—¯G[å½ðÂhé»%-Û½¸–½‹ÑÇÏ›š-ŽœýÀ쀈}�°“ðC…O¥E$PxOÓ訔1ZZhÒ4 ¡t!GÙ9D_À ¡øSâ#äG‘€†D $ #°,¦Q÷òîìRllXƒˆÕ1/AŠ"��1tñÖ.ÝEDI£]±uš"‚J)éÕ›G`×mSÚžãºíhŠ.±DUô‚ŸBKüC„^_À .Ä ÓBR/Ø\+ôŠ€þáôº11cmN¶Ñ±µš"?;§£®Å5‹ºƒMÕ4kE×Ú£¶Ž+nΞˆª'U¶ÖµQ¶"n»n`¸ÛmݘèÅEm§v7nŽ:ÔwvÆ$Ñmš5‚Û8Ø‹tpöÆ—5qÜt6ׯîç&.íÎî;œímm¹5ÜYÎÚŒàîÃÚò+äúQÀŠ|AI>êäàRTO¥Hîª~Jt´= QBÑ@DQTÓ0U”ÐR´Õ)@QaðO咦Р‚†ª’¢$™¨�¤òˆ~@Š™~�„”W……p„ ?Jð(!À.À !€ýJ ý?„¢*Ѝ ¢Š ¡ŠŠ(*d&Š&¨h(J¦$Š* (*b"‚'ÈŽSî£ðî'÷ª)ü€@åø€~JŠ@! }ÏáPQõ¶­‚�m´~dqc·A[w4~½ºóÙüö½ãÙã�Mj7GÙ4VíltšˆÑAqƒ¸ÎÝqÑ­n+¸×Nµ ¦n»çz8ñqН—¢ªBf·�ž:¯|ÚíòMج[®(ãDîã{{ÝnÛ͆¨ªëîݲ[i͸Ýv7vê»[GWG�¬iØÖŶڊ:Û¶ª{¾xÞ ãïÞö­³êÝÕ5nµ·vÚÝ}¸û{{gä&««³®ƒU»Ñ�Öæª5¨+çuÅóæ÷½ÚŽöî¶·¼nÛ×kbÄmX»c³gäqÆMî¶çå®|q·hï�ÝO·tbë®vÝw¶6Ü\oW»½Œq±»4n1£¯›»»]�½ÁÆÉltÇqÛ·«Ý½ÞÕGu¶ÇZžî*í÷úTY>à¦r€B²+#(Â9a À%S ‘‹•G@"®e‰‘°ˆ*Ÿ@ ˜Q‰‚ "©©fŠ’ ¢EÑ„ÀÕ!AEÅEžʤ‚8@%|"÷B”é@?�ì'*'€ò*ž|¡ÉäEäW€GÊŠxà 0®P�  r�(ò*ý”|¢Ÿg„C¦ˆ«À GÀ9?)Ê0ˆ}ªj‰(‚¨¤ŠÀö€V~}(ð‡À#à_º¢Ÿð È)•öbÔ8Û:�œ–Û³kc.ÑUµ™ÆmŒNm�9Ѭì ,¯LÖ¦(ТЂ`´˜ˆ©‚"!’&'Aš(ªØ4ÐDéÌQ3³N°Q4¶«Aª �¶‹fŠˆ¦Š�i£F©Ö)¨¢bØÔ±§VµíŠ˜Ö (*¦Šªˆ—î^CÈ ² xïWÈÔÑU5òt߈ÕWªîçEÑè8ÓÓÕí­ÝÇvæÑÜzª¶ï©(ÛuŠ.Ýuu»wËçÌ{æ~v{.±ÛZ SM¶‚½{nµSíŠ1j‹Òwjiˆ{kØÌkÜf=íÔhÁÙÆÚ¡©¨ù½Ú6Ö·£Z4wwN±Ö4m`‰& mGcCÒ|º £G¤1SÛ¹7{Ž‹{q¶÷µÚ·¸à¶÷j ½eí¢c`ÕŒ1‹ÛTEESókå‚÷cÐy™íã´–ÆbƒoqA¢’¼F¨©�¨ÐEV«»1Ë5PLTÏÏ|óí×uÛTÜ{hÅöÝ{Ž‚­ƒÓAÔ±ˆ‹×vŠöW±¨®Þ¨»GF6ë¢*i§Ñ]Û±ƒ¬ÚÄD^÷dѪ}�u¯Z* Z#£A{mšÞÚß>zñ£ÙÔPQnçásEÛPUèÑUí¦½ó¹ù¾GD·ÎÅz4>o‡�­|�GtbÛØâ(ŸZ½j*;öîkÕëEÖ&Š"š‹½ÝèÌMÛW #‘Sèe!Eò�— ˆ`ÈŽE%?‹€dAÀ|xB ¬§+ø@”pˆa(®>ìŸ�³­ƒ[kkgV6ŠÑ¨ÙζÄYÖ‹j¶³¨¦ÖœE�£EN�iØÙŒAUVÚ“"kZ+lV1¢f,F¶ÎŒV�Q4Á?@DÒSHQJ�ŽŠ jš¤¿ÔIUMÓRVÆ‚š4æB€¦ªªJ¢hªÐh("fš‚* Û&´U4ULT0UR“± "¢)©*¢H™’"ˆ†&˜Škn>ñ…å>¥ªДb¡  ¦—Zª4HiM°PU%&„ÒÄëQ R”í� i¦¨)#¡¤­:ˆ"X©Z­²ÓÄ:AJQE#@EKIJD @QA 4 'Ð}" àYO¯€Xå„ p) "Q€áRUUE4¬@UA1%%!I@ÁE%DP´SUE#áÒ¥*ð�U$ªð(à�TSDÀ2€€A ¿×÷ú¿gþ_´~~ßT×øÞÒ´-„äâ±|?þ CÊ·2LŒ‹?ý¸#Ó«åq·ò²‹¹+j þú·NFM´jjèªH®×SºÝª-–�·§kÙ‘ÿêæÕ3%š=Ð+ÃwŸºûnKôlSjeÏÁ¦Ë¡¨YKo½ÿ¹ÈSFlØ,=¯ ¬s7“�š^lè,ú#u µŽæd¼'pBíÞÄrì5j`þ4ò(Tž§£2ÁíÖ)d‚ªË\Ã2™Ü ô«}Z…åÖò ù£;•W ¼ëÂZÑ eb—î¶æ�¬ƒÒ`åú|¥­Ž¹{ìòTìs‡®2Ž3p|iZ2±£P$V Nyžs<’¨�±¢Aâ!±qlwEú^aˆ)2)üî¬û‚À­"³WnRoM"ÃÛ.‚9':Tœ‡^–+�ÔkÛ Uv,ºâ×lY7®Óïþ‡Þ áÌ"°�Û�'kÇ—ޱš�8ž—/I´ k ´©Þ€tD‚àΑ””Á¡.!,þ+{äAùp®Ô6�*ƒ©±ß•/«€»½3lºøº¾ve«‡*«h–[é–�ýÄdi&’“ŒkÚ• Ó¥‚áu{BæP9ù{Ž{‡n]´þÀÌV;gÄ øÑÄ¿è¯à,.…l£&hyîòã{I�™Fû ˆmÛf=Fä#YØLƒÈE�Û„|0^�è¼T]ä•ô�O0ýåI·)è–­}´\iíÁÂ÷oÔãpˆŽ¢‚^75Â;j «-ªã6éPät$‰ÊsF}u�ªÚPA´½ öÚÁ6qPrЬ¶å¦£‚õV�E8†€úg»wI‚YF |eTM|iö×õƒ›Žc$_µ¾¨‡Â™¦(©|ÈîóFÅF^üvl…$ŠŠv[#M ô¯mpO›÷Ù×-Â$k1‡`Ô…²¶qq|bñº9'—šMq¢„^˄ذrAŽaÈY8dÀvÒcW³v–Îì³ö?'ï÷ï¿ævúð¯@”ýäþ¿%~Ò�û¢]ó×þ-É9Ú«kœ·ésÊ%kÒøuÑÃxú£jß"RÍ8“Ë3Ò(;ˆÂCÈ�£%)*aRÿÙÇÅ9ÜëÌ9cºã"{a<wÂ�O¡K�1Eø·�?½÷óS ø ýfî"áÞ —„­‡ëð+@ûþã™_×YÜei¤*-aÜ÷©³ŸÍªB{²m8�†@àpMÅ2.¶\ºð�uÝP|¶Õ«Â›¸YE'7eÇö�̳ºÂ×Ö�7škïb0ûѱÊBúÚ�4¿'Í¢Ö#*$�DC¤Z+~h¸À5aF&Ò‘›Ü}š½?XõÕ£1¥Äð±y÷±C�–#1†jŒuΔ€´ò„‘„ Ž/«¹÷,à©íä(DÄÎFÉ Œc(Õ˜¾(­´“}u Ábâ=`@LrŠ®—ï5»_¬*á-g`½Ò$¡D{g«(>3¤Š;ãGjƒ-ðax-¬ —²œºa4«ÜYZó@*r­²¥—÷={¸[6k>#&ÛpIgrÕØ3땸R±¹TQïQ™\€}!rkÞ¸8 Ö|³dGnÀàYðßDï³0×1y²-™­?W–ÔY¼ WÆE •‹üÜÀº–äÕ�ã¥-Ýñ„¼3 YGë&'ጪޚ؂‡‘PU³ l´\_æÞ ý 8+)ò�a ¾Ñá+ëžÉ×`k?udò€XSúºyÂEíMïvAÇzËy~¹e6[§öÎøGÉ÷;vsh­oLâ¦Ú`aD�º*`W@†ÔÁ÷@ÆuºÓÑNX(�ã¤`8jTlZók«Jk1•—kp�´²-÷bPk :¤–“F°‚¿iRûwÅöF�Øi¼÷Œû(¶f͹·H®Œð½ÍòVEž=f¾:=+* ÝRKŸ¹��üÝ‘¼]�àmïz²o޳ÚÍzÝ4\ì4;&Bókß’p®[ [Ф{+‡ax—\Ÿ/®}N«Ê|W:o�ŒöïÒž¦C^'`‚Í9JôX=�ô¢Ë‹®4LÊh·ln1Ýddpâð¥öê!V9BG“mŒ¦å­é%B¶r‡)ÈU¶)õ1eLOd±Ê}oöe’UÜ6†ÝËÕ£ù7k¾O¹ª;FFÜ ¢³•� ¬zjZW®³ÏÄB`Õ>Ã7²A†ñ‹øŠ_`’œ€×¯·»Zº<„{?<©2ÖûìEyí·ïê4Öœ`Bÿ[‘uEíªØÕ¿�‰kÔß<ú-z›VÜã]CĉÈ:\vöéK%æM&ÄQëä<ž±CÑFްfŒª±„ÉV[fÓ²EO�‚9Š_ðúÅí·‰bCPú�(F ì©—ÔúH4¬“•ºF˜âãDÑ!ñÈâ¿AöÃñâ#Êâúüñ¼¼6ðùìH#¶øòçö"/ÑŽMR¾=qÌS[B$ôv%5Rò#ɉh{ë™k¦ž®»Kô Írs‹ÍëœÉ2ÑÚNêÇìz0 ¶ßÕ̘\}Râ–Ú-� ;û˜—H¾FÍCòo»ôƒ êRVtÜÑuùt‡ëbKöÛöÏ&�o²wïP»ÎñpWu~…zo·GÍÐ-Ì ®CÃ›Âæ*ȃÍ:/Å�ú»½7!°œ½bÄ+[)vÕ:…»õø=ø±ËxÐG²XÛê$€…o²þ“­¥}Åõ–ݾ„ÕÃ#Û" äÉkáhž‹…W²AÝýÉ!ѱ¤ƒ/6‰�3àÔ†f—áEˆôdÚØâQôëÅê·ÆŠ“J?O®¯l³¿½§>à½pãåÊÝ}ó.�WBf×pÎeÓY‹kÈ»Û6d>BÖ°ÙÉz ÎÞ³ºùÓØl[ÌzŒG PI/¶˜ †T³–#º�¦e ’­Øš®ôÓc;Œ1˳íóF;C³"ƒ£O––d_OHɉ©¾4ý9M`>Ò¡(Ü÷rkÑgªQžMºz 1ã7¸’)w½04 re çR.²p¤@]"à\,|­¡¿ÝYùÐNvÇReÃSù’nB{ó㯲O£¼î„5ÀÂ0÷-ÆÞ;ò%ˆôSÖ­ú÷­½ÏzuÀ½Ûx!¶ßy´˜ü¡-¯Â`à⵫õ°^Eaˆ¸Íñ«-Ÿcm¥*ÃFÄc”ÏjùÔÿ6.)O|Í—VñOWs�¾å7õ© Gº&Ê};’è¯$ŽöÛ?³Õäóz5 ZA²6Âíšþêcb¯ü¸@î—~´bŠΙã|¬*Ï–`¾xG“¹EÜð &Ã)ù?„ïy¤[ð˜1d¦;‰[G´çÄ™-dSâî/1 ï/ЕK›#;;dÉÖ®8—®âœpA;§µ©�ØœÀñ5QlÒU® üT¯†1ƒéÝü’,›kRŽ©¥Ýù d�[5ìfØ©> ôw>6tØWhWÎ6 ˆ1&Ý eÅXAïŵGÒåHÌø’1€Ž»ˆ€ä@ tÁ7h‹,àšF²ñ6ÛigoòÇ×ãÀ ï¥ag{°É~VO�`·WÕ˜'„·wfD¡áÔ‰§ÂËz v­eæ]ýíH0ÉWÐ]KëPš’…<™¡ü�~"º`"¹7»P8&8«ÚÙõUÛFFÊž·ÌÓÝü÷qϯ7W·1ˆ*ÄTQäÚLz•æ#xª×J’1œ>øÊ£°Î Ž{ÃÞ û“m‡zú®>’˜¹§á œÉ{”k–ìd–5\µõ†}ûû÷àX½ {ìôà·9\ŸÔb³èø0‡åU•;;rÒÃk‡€¼£ ºe/©Û:0_µlq€¦a|šVVÿR4o‹AÚ÷Åóå²ÌŒ�bO‘ 6î�ˆ€ƒV·l·Îø¹|¶ô*/Kü½ØWÛ“„}#JVlΚBëþæ6À"w£Z•;Ù4¿ËCæ,mžµÈÔ`6 œÚ¬x�\ßB €Z/S®\ðÚîAw´vŽÓfAþÉÉõ™÷c¬¥ùMl–‰Í[|C¸IÕ�1Ñà'Fö ®»³ÞïS×à=f×gä ÍÃwÝÞö±ïO±;âí�õ7F@ÂÖ päñmï~î¦;‚êÛj¡Æ]JJ#”Àë™Pã`/¾˜L\&FKö²‡£@�b¦Ö,î -¹Ò6Ûm”Ág{Q”;>±Ñ9 ÞÙõaÖVÊÜÛ0 NwWW¦9W«_Ò 1këNŒÕOBM;Úðö{èEÆžë0_kk/3¼àqÙŸ¯€Œ­k“y/¯Mn¶_K=ù�·»^ûæGÒ}üJÍçRÆŒßCðu–ðƒÁ³¹�ŠÊ9À"ê•' «pÆtÝo±×[‹?}}f ~Jõê¯uùÝ7ú (ˆ‚ÐDDD ßü>î~}߯ÑÄ…ºÙ�8åÒF±AÜpà¦/t@p­¢aa Ž(Gù!ü :¦ÿU,hÊ‚¥ÈÉ9•Mˆ^*4•’#ÅF#Wä¸ÙK“‚2 #¯Uc�sáOœÛ"FìÈŠSE/•¡×*﫵r €4PIÊlÉÎ4À`ÉðÉÍÁ±Á©Á@ç­ÍÝ,G†…6BªäŽ™iŒtàs°€xdJûÕ5‰lï–¡+g_ê­Íº"øžË‹�Z ª៰µ¾à¢Í-D!E ÊÔYÆÖfÿÃŽÜ»„¼ÿ�#ƒ÷¼¦œ‰ÕXÂyö:á½â©£ôœ+è!U‘MJ‡Wcþ€~x½Ú|íLqÞHèmßl÷xþ-×pëŠÆbÜÚóÚGÓò”a¿“œç8öѼp”9þKiCÏÞâm¶ž6~î$ñH(IJ~ÇOy:5RÕk;šÓÀK¹oÄ@•ž µŽ:úË6ÓwXž¦&ÐÌvm[ç YQk Ù,”bã‰ßשkäR¾�ìG»ßÓº„êxï¾Ó«š�ðï×=Ø4œAÞ0Õ«½ª.÷ kкèuñ�q¡~ M çQ4|œ#5­¿¸rx/Ø"I›NšË}¹iOòçG�—§�&œdk³ÆÒù¤0W¼ï1K@�"›Ë–h æHGa9ËrÚJ2ѯG®ÿr©ÔÛzEÃuËd~sŠ„S²çSÅ¥f®òÕß¶ƒë­»Ò¾(Q¶²¿c˜»Œ3ÅNAî¶zàæ=A˜îÂïzm}|Ž@™‡,£sÙè5ôσ‹­ƒìî¨ôž(Z:ïV-¾r{DTWâNÎwµœè¼�5�<–#A)+¼ #ý±Tõ½‘ÏÀˆ=ß|§}ÔÙg^n=µ»‘VêhÞgè4ôÏøþ€4ÝXjõîÚÝÞä•Òd·JàŒrpöޚ̢>ê-rQµáiVAŒ-%âËqÈ~W2½–P´‰«§¼Ãýa^è9nÚÿÁ"k{®š±{ºíõ‰ºép0æ�·òßãÖ�ÕÕT Ϩ¶k§Uoâ¼Ú¾‰„ âÕõ¢6ö5-'Ì•xXN.GÁóŽšëÖ×,Zv{‚ñÚØúx§Ç¥×¶þ@ÝÅð9uïDfR²�1jÄø¤C ,ÇsŒ$·•ci8Œ1wÝ­Îl©S±çÛŽ@é—�îÈ–áN2(ÛX×s«o¦Ù;­:d8¥¥Ãjí×¢Cašƒ®Ž.ÖzGËZçûQ”0d:îvëÎÊ™Ný8ÂBÓ³±pâ\ëy —Þ˜S鲯™‡Ï&û Úñ8šÇ¯ðÛvÖ°j]å“I¾í¡u1‡ë¦$£ƒðìxï�ÊrJŒQÍWb¬XSÒÔûž¿»ÖUÊÝV€Õ‹�»Ÿ¢.ùÐæ\£¢“ñ §Ë}Òsô‰‚®í‰û”ƒ ²÷ÛÕ´�Zß@yLe ·lþâ9M¯;Å[ ¾ƒP ¨pžÉ�„=ØÆèLÄÄ{ÑûWlѼ)#ëyWžœt«6%õúÓ.‹ñfRÏ.Gd¦¾Ó2™‘)aÒá·…ù'qg±ÍbÍ#ãóÅà´Pdn|»ûçí© CC]ÔQb0}å[™›vQÊ–ó[?6û�X”³„å”Ö# HŸqó.ÛS1ùœ¨¾ñá‰>Ñ7eõtƒ6\İ8¼-»aâø„ }æ¾0ö 1Û„$»'œ2]FTöb#-’£ùòÁ~"õúöè'PÈp7)œ�4/ËoR–Þ[‰Û3R ! ŠÐ1ëGÿfaˆ<Á‡Ž ë‡o�›Õ¼8i$‚(y½£ýíÜ �ïö*ˆÝ‹gˆÉ¡Etûs[nÖL`â”ÿÀ¬ÿ±ø³W,e,ÛÉ6ªç†"ž?°j�Øâ.þOeâ}Äl\fZ$²‰÷ªLW,cÞšh‘£ò9d·Ò .Bþ MiZß&Úfs¥k…ý†,,nn™Ý@ójLY:¡ W͵’ QÂ�yG|AååŸÇ–S¯Œ�M¢~Ni}§s&+/ÚåÎ@)eCÎ5 d,Íhà+åšC|Ðêr3ô*A*™]ú¹ˆ5ïéÉ,÷8HA–Ì[ìòêÀ'mݢеÿãü]û‹™çkÂQöý4ðnÏ3 rw©ŠÓ÷¹Ø™›ñ5¬=O󎙡¹sŽŠÿ7W Ÿ/Ž)å”׊ø·;_B“ó:B{޹ʊçÎ÷ÎÉ ‚4¾‡kµ¾kOzR:PâÅ�Áê›Xþp¡2*vëFê£ÜY™Y†'Þ’¼È–Qú{¼}§oµl>»d cTe8.v1?êœÃv±+ØÑúìÙ©5æ°k6}ºcòæ=¨:‹º<…Þc“±»b¹ÊtÎÓœÈSýyV°ã¹P… �ä—ãVyãÚ©¶ïê¡®ŸNà}ÌmÚËm© `p÷ú¹+Zá⢸F(bƒ =(ucW²¥£U[m¹>†ˆâèJ„ÈA½žè$ðþÈW´.’Y¬vÄ­÷û„ì�c´ö/ž48>)4‘É<—^ɾI/ñ®¦Þµï1!J«•|Gqùsg°ZˆD¢„×@ë¯k¢«%ÙQ™-»ƒ©š�U˜™°XfÂö¡Ã9 vÝÅÏV[Ût,ÓûL¯Ÿ m5�Ûð¾ŒÙ Þ-ñ>ñcreñq'AÇ/¹Á%,òˆ¹¦Rk™mm\sÎão·Žv厱€Ü㉔ˆ»/"BµÓ­°Èf#>O¡¹Ö4ËúÉðZÒºÞåHæ‡n½ã%ËÄõ¸e±=Ê f¢¤ü†. éø MÜÒÅÂ+T÷@¼ÎP0£üBd`n×oC°$ øc¶ÓçP›aª‚ižÖµñ–âk‚ƒÄƒ0=õ ´Ó.Ô.ÿ®/ _¤lVf_R¿_4>‡Þ‡GÖØ7Xø�5½å•ã�¾óùЮŒÅªˆ ]8ĸ‚onxª Ц¶"¹?2€•!Ñ[©m{‡8àÔ5œ\¯È-𳘵v_"ö[öZÝóŒÖ±bBr#!«‰*áïWö¦Ä!Í:j�úE EÂÀ.æR�g-#à(êAð<+~¶ƒëú¥ÖôÁË^f꡺ÛãœèéÆˆg —½k–¸¾ŒøÅ²Æ"3\ÕGtY¦Sæ˜ÉåÕm‚å•ÞCC®[Þ‰…û$XÀ©v ÝíÅ5Ã?dàrˆlRÊ©™ÞÔôÏ&m4µ™ ˜¨Àù¾JmĦ†T;-¬O†u>ßFB°wæÚ2¥îJOÞXn6IŒ\Æ›”â¿Ñ°]|§¼�†7äÐCI3!®p+§.?bõZf滕ræ‡w£Ö�šû# ›Ò°ù¥�qݧB ^á\¹ÍÎ5ŽcŒë«:Ûyn’Î…Ëþ)Ôoúöôƒ2=®~Í{ö¯&žXú¹…n[¯Î®\Ï 8jOê\) u1ËÌCÉ{…^—›º÷Z爦É}³¸ÀjLÉnŽ›d›‡p}š±D±iìëEƒüáëË墳†xKÀ™‹ÚüU˜ûºù[£_¶¤!z3 ¶<€ýÎÊ5­«æ Âaî±[nU•×9óÁÙ$Ðæ˜“[»Ñ†<õËe@_’7á ×Åyå9Ÿv!Sã×P>ï­7ÊoŽfþ¬3M Ñ v€ÊÛeû°EE�O�GίÜ Æ¥_%ó½ñ9 së0;2{†m…Ä.«š’W+ c¸ú+¦Ç.°‘™¸cåü¬Ud �%ð8flƒRñ¯7LÐlƒzxë5ÖÏ!båa˜t ¤ÍîÙàÒ³kÛ*Í|—ÃYeá„V®Vµ¨ FüöŸç©É³5XÇÍoi_ôå{G†x3^’²&EîÅbá{DÝÁTðH€£ÇšB ßXS„�—r�ö†ïU¶u¨$Ý;¸(©I~øÒĸã雹\jÈ}kÇÝ"nçA‡ßfüi=j .]¹«õ7�ýŒÀ—09ƒè%É.‰Ö÷„[Ê»ªý‚Ú­Åm†¹“Ø­ºšfŸ�¶Jû‰Ui¿˜«Â÷¿£Zå³hc×Ï_Nt_^¿eÉ®ÙÖ³—nÆ%Jß¾·"Ô}†™Æ“ã=y/‹µðàVkÖ̓ƙʰPs;ouO9 Nš}€Ê½]z?gì„¿ñ3®Ö†³àz>_©ù^1¿)b¯Ýaqâó_Ëhtç8žç<ùÍó¸LHøü^¼åã¾04F5‹^W—JËcë[Ükû‹õ˧‡“ „Q£Õ¿±}ZA°ê—ëF‡ö Òs®�I|uvÒ%÷ÝTýNg­ ¶õ¯BS�EòéDñ¥ÁfY”“´°hÉAtß«# ‚œâœ2“ãjh­�(�Adø QŒn· öäK;哯�ó�S’¦´žS®ô+qÙÇúZÊ’p~•J‘ÙdAè£�.]Ô éS‡W3U •ø¹#Ò}5a’¶).,Rðªz:!0¨=5"Ä‘¥Û œÕ|u2ªF3qS7<¢¾L‘ÝÔ|î+˜Ù×P’Bx\�‹%<êÌ<¢Þ!‡„ É('0ÙAc Š?JŠh@Á&¤1U©“ᨛ(*Ö`,P±’œ(˜"ä"�i@sR�Hêd"—>‘ÃbJ t©PÅ­Få×éG=‘Ã’•? �ž˜!¬©é'Gâ­�ækXëãh’€oáòEw–BBCéCœ‘�a®«‚ŠR¥ˆ_HÙ‹‘X_„[ŠKs“„£CúR¤PèÉNÈ_w_!*P‘ºª<³fa„*ÔÔ¤áxøâá¹! (ÅÔžˆª·�ÀA¼,Ÿ¸P‰"qf© €9@’厣ÒùÆ‹¨Ô/¤I0°GdÊ€¦2¢¤ßÆQ1J°Nˆ¯kO;`*{#$`ŽFP8PT¢ÕBh€2OÅ… ’œ)CÂǪïX£�Ý_€ç²çd ɽ:êísÁ˜nIl$-�^‰¤y¬ÇÂgŸ'7 ’Â[]êb.ÏK²çGmNù#-ôdbú”ã‡8TŽá†p~æ03Œ+Ëd®ä8êˆd�Vg:s¼OŽÖ† $�-q©$äñ„Ÿ„j]´9½˜“WÖ§¤Ú¢BMéoxŸªÜçôÛè3:ö(�¦ùÃÎoZÚx+jÛ†?#eÌ(ìò×ʼnñ—KÖ²Låg¯m÷}z„*Á{¤ž5úgVØ9�;§öG]ÁÕGt|Ešçš±$âñoDí㘗*€dõŽ¥ûÑaÇy%îºý#ý–+®ÅIŽu£r�€p¬ª§²ŽÉp#A½ðvî:ƒpõÀq x>=»® T¿ ÜKSòÝæÆó9Æ#Z¤&Š÷—oÀwG4}gYRåicÔþŸ ¼á“&Sdîu܃[.yü7;÷Â;yÄABÊg X¸ûç,4o3¤¶w‹­}5¬1&9Lnl‚{‚ ÖÌÜ:ÓDµë'»*jò´É° 3;ÜÑ+‰Bl™ƒ,¢~‰� L•°þwË[€_QÅ Ú~ì�;ój¤mü4ؘ ª—·\2~¯Ñ¬Û¸fK?Ìqüß"[Ï+Ÿ³TAßñ2d•�'ö¸ ¨�¶O½ý< Ù“xÁ¶Ê�ž–µˆø5uË"Z��\ò Ûâ–}97ž�Iêáa£1ÁáLC±|€®iFï³ÚR5ºk¿Ž¹–Êí8±zL‹¶f4"˜BÝ=Ül·¾Nì¸Óý•|ž-±: k2²S¡$ÎL")UŽ|¥7xfp‹_À­"(751›3Qm2·Ãdl" Z[«ýU?V%ñmñÕ¦)·ü›¸zþß IZ´úB´«íq«²ŽÂ$ «.#Knzç]næC ¡b¸è³½Ãæ'k#‹Zòã«,UµÇ ŠZ©½Yçœ^L—ž;ž-áàÓ_^~h x¥mÆ÷à~°.5‡vWºËã“yÝ•ãKúo–™ "”eY½ŽÝŸÊÉ¿>ŠÆtíQš­UJm@vÏ'\ÌΧ/¨–/�áM63àÖZ6W7Bøj^‡B„GîÛØH`½Èöv€ô¤õÒõ$iÔa%ÙBL³uGÑ€°Í™Yl_¦Y“¹Ü!‰”º›Z Ž2ÚòÔþ�hJjÊ ·¾4¨;õ«—}Y£pn ½QƒÒÅV3q9Ïœ–^ØE´p=3}øl«%ËçŸ�ŸÜ8û%Ζo:Ç}ݨ0Ùêž²êÒ°±õÓ`”î\²¶ ôò¼}ìâÈxl¢z±•-Öç:@\ª¦:F Ê�–⪶S>YãáµÔô¾Ç-1:BŠ5¬ DÝÌÓ s¢l“,D´Øw;ÿ]3÷c!çõºÞï�À¥-á©ѦßI^äB9ó+ðÂÚ“Ã~{~ëœÄµÒ0ÇøiÌpgÒ.$Z¼Û¤Å•hòöîc/Obš-rØÌ^µ«ZPXÀs0-˜"° ÿž*%ç§¼ á]/’î¹Ê{¦Ñ¥ º_(××LƃQ‘5Ucñ7™ßÓK»÷Ú%,žãMà ò¤öµúj\cíl·ádK §?–ü°ÃÀÐ^öÙ&¸J1±óx3¥ÕÔù©øù$…žÕ¹Í.åÞ…À½=(ü<õøàâwCÈ|·ÙlC�±Y¥i@‚z÷õŸîÐN#91ËÁÛë`&å5º—{�„jÐ>®›F,UAcvãi§¢Â¹]%’ä®ÓoìÅËy™z5Ø5bÃ÷‡én8óÚ lιôì)FêÑö{'ÛÍÛv}"k­±o]Ñ{{…o4.Å™ÐhWµ=ƒžÛ{ŽÍüL~Íœ`P¡Ú—JS‘;»;æÖÃ6èãˆø´6×9£;YlUPØã9nàšñ“E“âs‡�Jnæ$%`‘Hnîé§Ü!CÌkfK™€Î\ü±YlÀ²T‘,t/›o8è£ÖCH&½à®™&”˜`všzKèœÈŒXàØÈœÁ�JZ4ÖFA½²%Ž#Ãî(í’|]±6|ÁWFèÄ ~WÖ@‹É†pÁêÛ?É´E†t„u_3ž�ïb乨Çt­ZW±ÁÊ×jÅš¯îîS\¬h4G寄²'ÂdrìñV7òp{Z,!T|ûœÖ¢Œ-ö+ÂM×­`®Ì¶`T²ÂÆ•ƒJD!tÎgÅ“&«ÚØâèÁ€Z .H]G_nyz’?»Ñ×�¨éÕ×x‰~®?®ÉT삸²¦ÑjÜ{h-k›£i�ÇS¥ãŒ¢¬p#5~z½ yÕéKÌS­Ý¢ÂU^ù<’‡Ÿ³Ãøn9ÆS=_®¥«Dn‚ÞƒC§žöõ÷{äv‚Á÷— f»bƒS[ÈtM>Ä”.ù¹œÓƒwãÞè!ô#õ†aÓ †¤ù µfˆ±�qEMã3œØïѽ“¸T- øîÃŒcä_•ж«ì/Þ <Œ5Eõœ}4ü>/½æ'ÖOÒE‹‚ó8öq½Y³ºTÚÝçÖù¬§ùò~fWâÂ~gŒ$h]ƒÖ39ôW6èó ´x“Pl(B²íÀ‡ÀÀÓ¦¦;�q¼ìT•_»xÝú�Ó¦‚Ã(¡`š¿¢¸etKËØ£(L?d�³ ³b²e"S¸jß[>KLöûˆÜ·¯”Dx"-Dzræïà�8-c®›_‡«¦Eps 6F‡Ö_Ü,Œ9h‘1É[mÑýæKB}6§6qôÒx~1&2å ,´Z!’hÝ\;…²°OëàªÔàÙ¤Ä1`Ñfóí)zçˆ,í[ÓˀƇAQÄjITÝ»Cè«ë=ŒG¢äGU<4<rT×]Hu,��ZɧÔÍè\¯�õ]M€‘¸vTšÄhQ$î%fÖë°¹¸`õF49wÑ"Çgª©µ½Ùlå‹.73¬­�bIš�Iîþf½´qV-Äöͱ„í--ùÍ*nf¸Óå}ï̈Éu#ˆ«l]ï›É«/wà ã>d‘E˜ô‹#q»Ø™Îg&ØìÇu�ŒªñP§%�øöÉ1’›íÓ‹æ¨É6�Rb­Üµ÷žü7wÜd=²rÐ ¦A Äá$nad±Z‘œ�PÂÂêál¾Ñå´3¥Q N§‹�¤©G‚›ˆÍ« ØéË œµì8å‰àhËåžMéûe"î¡Ø½A© ùwˆB/5Ž]i£B�Y©�º¼.݆9Ì]ZÈï`Áè–îD>ûWu7äaÊz—$°lAÄò†v3”Æ|¹@ãÝ� %EØs”±ã¨œ˜6댢9¥¶¨ç” â‘óîh…œz{\áÑÆñ5æ¿M#9›b±lÙé{Û* —”äÚø7i쾎©JêupCÍÀ\ÂË6î‰wEmãt £ŽØ4ë,µˆ@m’ƒ3[6À‹ä MØïfkØQñ òFIq»Y.ÿ{ø Wr¿Ó‡Æi�@ÿÄótÅÚûÔ|뎞kz;ÂyÂ,RZÀÛ d�/ë6%˜cÕaÉÙ¶4•Øcl¦æF,ÞõaÑ+&P€ ÊLÝv• bè?ÖÐz<™c¼ñ¢Æ“ý‚Á˜*Êä��ìD¢?ÛÃaÙ4 ¯Ìè~·s£ �·ÎøÐÆËn¾¹C9°AÕð›EšÊ ?U¹ñAàÁýløcC#9×s­8kNaCÍFi¸ÍéN(h¶ú ê\ë,ÙÇ g«÷)”Ä«øéS™Ñâ[�JµK¶É’ m .*·ä« ›zJ¹(âQšèˆL €¢D‰Rµx½··Yîÿ&>j]xüÓ™v®ðò$ËÒïH>§”]± ζ¨ .!›#_Ê5‘ºmîžAç·íd­¬8 )[òh®íÑÞ³^·`�hßæ³­íGÚãb­»ýø‰‰toœýo“ò\Tu汯 �¦¡Íômô«ŸHŸ 8°mP§ŠP�iWŽ Ülˆw6}¼°]YñÐÊCrÓs־ijí G0+¶GQ‰·Z¸£šÔ�Sxù„ƒS+Þ;ÍžCVËú1±¼îÛ\*-Z…,Ä+{&ò g&Ê_ž*æV‹�×HT~±»o“¬ßvÒ (÷¤/l7#r=! Úc(‰Å< ~OŒ1€Ö{ÚÛ�)ÆIEÅ»H \B0; ÚÛoWÜ’+%TQrÆmP#~æ�zì„�MÐ]²—€¥ÛXT£š±[= 5ÙXŸUñÑÏ»Y íP[W›!—j�Ï µÿe¥±\'À{;_‹½¦ÙÆM÷�ÀÆëtñj}7ozæè¯—jk·ÜÝ�ô|žÙÔ5[åË»ÝE�†*Ø{'\™QNêJŒV`ýû½áÅ]ëJ·Ÿëé2DkìS£�ž™V”­Ü¦6i<sW9Âè¸_äBeô^ú›”ǽ»V`À;¶-v’ùÓaɪª—½Èµ¼¸ºÜ$­].E™†áÄ„0;ÜOmÇJ±çiÎO!`ÒtiéíûÁÞ§Ë÷¿Ç€™žmøÓÁÃÖN¬ +öqh�㢛Z»a=¶ÜíÏLyþÅ›#Cü)&ceˆ1�F£Ôʺ/;„V2þE»™ÚØt”Ïj«oÚ›Ž#-¶¢›íp=îlÇ-}ëÓÈ!P1`‡á¬ ×ø�iuZR¸½3ÞÙ‰�šæø¢æ ŽŽb—¤ß²Øå‘¼½Xét°4—û$‰Ù#—àIü=0uåw¸@»‰j×ø…­øæà©œA´î»DWžØÖt0|Œ>Œ™)r§e2q �Ú(^± K“ ïWwxûÕÇæ¬Ç¹£‹ŸÌ¼Õ÷ªGkôlãYºCIÉ‚Öj+{ÂvÌE޼÷ŒOjÄž;ê$ýH¯MÌyÈ\¤†Í#äg" »?:0�’Ì¢³éúa�·Œ1»Ìh»ÌÿÀýÝŽäI„j3ókꆻüã9,^üLé8�„Ú)š'rÉaÍ�"›¨ÜËf÷�U»ü™åñ3­÷u ññÊ$­æáS§‡,ãù˜-´V,¾ /Ò:·w:/¶*ÚWÍ�ïîi§åΉT”jné'}n´/Òp£¹)Û¿1Éû×oi"¹ Ð8VŒd—L§3ì/‚žóÀqNÕÞó`\? ”[v-Wñû“�÷UDÆÔ1Vø½;_`š°o¶Èë°ƒ~¿Å ²=ÕõâØ¹>§Ü}US¬.( ú87‡26ôûŒµˆJ•yóòO¡#Š4%g‹Cg¼6³:µÅƒ˜Œ�)…²üÉe gA*†Rà¯x{ÊúϾjä6Gâz¶Š0ß¹VÆgé/^å×3ðÒwßb¾´œ¨qcÒ¼(?9WªON"XzŸÛ†t—Ü; ó“h¶lRÄÂvLñ®BQuJeQíí™Õeóz7Æ«´ØÝÎQ¹î¦ùŒÍh’Ç€DF¸—Y‰ì¼_\¸l;y僚qKYëiY­«“Ásï”DssËé,íInM¿Y’ Ðcµr�*à¾ûÏÊůEŒnÁ q´8À�4©¶;Ÿ¸72ñë›êñlŽ[S,ÒÂüˈ?'Ôƒ²d—/Çú²%²�Pmwš?p Êö³=¥�…å\ -¾*ó¼ô¥~TÝŒSB}.Õm4ù„Ò[ ÚœŸžÚQæëÑå¥{¤â2®iu9Ô†‘Ó¼8ß¡tΩ{$À±¸vw|j·Ü5X7ݨdt¥®Àï`Œ,1"°×>÷še²%´:§u§l¾ïgñYÇ=àPOõwH�¶0åfÌ ç¡SßY¯x›Ýú4¸UkP®gtMŽUãœ�ž¯‰¤£a$º[õ›’7ÅãÈ~usªÜ'ø„¼ô²)‹n¾�MÚý⛜ÝMlF†ëe©cÏ–°õôÏòîűéyË„¯ÛèÆÖ{ÝŸ+ÖXÜÑË"ºñÌñ/‘(ÞÂÖj‘Ú7yYÀ®E÷,)ßÞf!;ÆV¯h˜›!xÏ,7õJV¦Ô:Ô÷¦2®Í\L 6‹æ>z÷Ü\{ë&ˆñö‚²A ª@¶3¶ó~ý>¿Ä—‚H¬ç4ãñ¾•—’«·Ó¤‰g¤ €­–ïûÒA`rAaÖð{ŒsJQ¾Øñä�D0,uÂîê˜jíàý iÞ0eú©“:ñ,ŠsTËâ_t¹\f™±òR+_ªéÈâL?‹ì~ÃûÄCZö£nôŠõ€/ïSé\ðËP@[Å&௃PÖˆ˜8ª IúÖEBÙ÷9iS¿|à˜fÖ]�4Ù3Š?áù‡KJû‰²QË,â’íd ´r`ïk¶ø_¢lªÚ^Ê+»¥à-'<ýÇ b¤ð�¬öq– Åiu ›„Ýp÷Ãêê˜Ç›»úù›H›ÂCÍ‘îÌcŽ‹éκš×lTVË�˜ N­ ôSâH•œîû³n;#ÿCæ"°Ü�íýëð¾ËTÉ�Jð Õ‘|qÌõt‹Ü£ ˆ0žä¾5ñ6¿x¡§Xµ×õþ˜OFË´FVÞW: —•L‘R`‡EM�ÜYÓã™ÃTA²ábU ˆº:ÎípµI“ÙØ¦mèš"»Õ`í³æå½I2“dç~Íù»o^�Hú�Ý=S訜z<Ö!²•Œæì„Æ–$v¹Wc‰«Ö…ï2邵ޏ«mz¦úM¤»>Ñœè”�ŸÙ?îf¯ê–Bˆ áV6LDÛ®ô|‰°ü@PÇ |®#H‚?‘õæU«¢:˜? @ˆ�dÛ]5ë÷y«RzPY©¥ƒ<•û{fbþÎn¹Ltšå”¹ÔËrÄ¢x}Kã>[/¿ôáñKݳžÿC¥�*øœ|àö´8ó)ʾzß^Û¶lõ;¶¶§«0Á&ñõî8od+2IMá)>Ì–8~0.2ði¶¥Ò뢃š!ònnˆVh_·¯žÒº;ÊÆgªÎ}à-£xáa¨Õ`,ÏÅ­@ ¥œ²Ù’ÛM �«�41j\«§½® EËÎ2-0{œæì1|Ç,.¸ß“´ö³ÈtX]ƒö[üÍÙþ‰\°VŸŠýþ©ÞïÝ·Àw_µƱò¯t³Úæ+*úþ£ÛªÍ¶<}Ÿ[dD(&qvÇI2ò�QžO Ì\�‰l’™:õ2 ±ÓíÛ7VÑŒiT5¹»c`ifrãÒÀæ0!óúº–¬«—àu¶¨9œ5‡§t&FÌrß! &u¦·ªÃd÷q]cªã ‡â©Ø®óíA¢¦4ë³ZÅI–[6KØ¢{ ™0”}–ÂNÛßÑqml°ü�gk¡q©-»î1Êæ÷²§ÒÅÜ>gˆÎ[xPÀ…2Ô½©Á«òW™ óuµ-¢¤¬Ñ²sq«é3��_±Á¸dE¾Ëµüó>kxÐ ¡=zöŸŸk6ç|NIÙÏ–•µö.Î5àã~–ÒCÏVºî¹ÐÙ=|† 0ä|ß®ƒœº×qɱõÅ”’µ| }3zÚdÐ&}Ül'’žø¾NòËš˜/{a_’ßg’î‹?UÛÙ¤PxC8Op?\®‡ÊØÏoÛq²°d|Ý%–Mn[ç,¾\fU†xÄì_¼éokkVð’Í®�ÂÒåSÙ�/O™ÂŸ íÁy¤Þ-õxò@3›<ä§)¨mkyÙ•2û]=•#ó„ö=2XWõ…ñÝ2{µkü+°a«ŽEœ#w@++±µæ`Ë?oï0^öïÅ­§œƒI+ÌŸz�‰“Þ)Üc¹¹Ùs¢?™O%&†Ž¸’�¦W•,á”’Ð6AÁa ß‚îØ`,Ðd^œÙ-HVÕ…¢¥aÿz6›ÁEáJºV¥´>lÛ·Š�<7ø®Ø¦ëzM~Wò}«r(YT ²ðù®uµæñÁµ‡íù»—³c¢³H˜?8¯È“uaG×N°òâCªe¥[pØo÷‹WPLê²B,¤k‘#×/tÅÌóɺÅ{â©¶Ž¤‹[¹}ÓzÖ(ËK5¬}úÑп œ®—M¦/œtà±²Ó�Õ$äWlé4+¤°VJÐ-m«0ÀVY~�¾}¥IÕ6D­´4§ ²A2šUþN�“Ö�ÞÉW¬YWÎfz[½˜Ž¯pܹ]ì÷¨'õõÃbÞ4ȽÉM_ï=ûì”V™P=‚6Ã¥£@"ñØÓ›§Ñ`dJw/–…¥vÿ¯!Yóç7€]tçÜvøù”°NX4Á|*a«K¢,Šaü‘As �º7z�µ±ŒHÎŬ–§70@)”2v÷\T¸Ô‡™¸”H†ÿû+mÀ¢X?¹;Ý,Á9nÓÇvð1“÷0°¦‰Ûµ×w«°»cèë_ùéˆ[1Ç[§~B8·XÇ7àQq vnö;9†œ5p¯vÍ¢|øe){˜L¦e¢]‰ÖÛ{ÅŠûO¼Õ~÷œ°ã™+/�úQf;÷+CÐ) R.LfÏ7j\”¶åÆrD�Ÿ¬{ÔfêÁŽ¥`Å«Eõ�â©S�/­žÁ¶¡Hèh‰Ù᫯O‡S"€JÎ<�™¬@•¹Å&ºx·Ý“‚ØiL>Áv´wuµi"Öœ´‚ª96¯lbµ!‘ßc / ¦�fRØaÞîúA…¡=ÐSΕ·¦x!ÅXð?ê;•dÃ}L}]½—+!ËqÒ/E—ÍžK&,€e$¾¾uÈqõ>Ø]m"!…±œ,VBpg˳üþFýrVFÙel¿?5$Ì‚e}–ɶ‡„ KR‚Î),,´¥[0oÜÑ�Õ÷�V†lvíÅ»TzâsÞI•Ñ¿•Oâ'¡Šdiœ4ça@ÉÑ¥¿í÷·Œ´Ž( ÎcȬprý.{h†ut²¸Z âb˜0—Ðcáx(¶rúá‹N–ø�¬q~M¹Îpx…w}òÄÎH.7D›‚ÎóÈWð70œÌ÷¸dÊ]ÂY­¥Ów„/Æ+•¥Rw\¦Vm ¥q ½Sªž� •êÀ#ƒØÝYËt ¾x$®áAV¬;Ã¥°P8ƒ€Ìé`TH¾6zoæ†UÕ�¯yœÞÚ”ôÖt¡¥ˆü‘<å ³@Þ.e¿÷]6ô3ù›�׆«!Ò@ç7ß\bÍýÌ:p>¼F}N¿MWp6Fü|±�-áwæ0¡í©ö(ò‰H ‡±ã ܽRw =éXz¿³Þ÷Kô®kçHÜ‚F¡ Ê$)Ë‘†»æ¥)ò@ï:õ�d<îlªctÑ0—¬«ZÈïÎÞ]Z΋k]ýäÀE„]²jµx5°ðX�ÙÖXX¦vA’rTÒ(Ô^À:U&–¸ï”U F§$…´Ká”ðçMæR}Pù ®¬Qä 5ÁFí¢¹=ÛòÕé‘¡ÓvNOqqaCÀ/ Fï‚Üb0 3jlZÔ^QÖØ_ë0+6OºÒì‹XRÇñt²79¼’¼¥ N†ü³W'Ô©AöãW‡Ý}²ÁéJ¡>“úz±eh> ç Ó«£ìÐ|‹C*¨íONaÌz:<ÇU’7‘¢°]~\ÝI£öRÃq�sC¼�ÙÛ+m¦±îï¤Øj¨2H±Öm� .ɱÝOb5¨ ]r–{rY|q¬ôKw nú~"\É10­`ؘڤVÎH¤1d:Ú…�¨¢[¶�ÂoÛ*ŽÒ°7�j(8À†k£$\ö8©…ÄeØø�phø›ègMªl¥F—sç;PÓ"º/÷Ö….)|]`¯ìÏwðçx{jÑñä%R±Ä¾Ada¢ eT¬:µ’²hU‡TD ‹ _‰º�û ÈŒ†�GÃ}>/cÈ�ž�8 K[�¬ƒó¿Zp®ëFá9d^æ´æÕdtÓ§!ëYÖA^ÁAz¼³•¾ý~Á`¾ÆR�h/¾¹ *»ë¡È{øN‹@ÝÈo;Õ’›{´ë"YÝézAŒÕfÛêÞ̤ë‘%J×ç1ûQsú{™5úÚ ili©ö1íñæovü2|$ÂÎ"0±.,¾¢7—ߊÎ+nâã�{,ï°‡J%Žèò�f8».’ ¶´uÝÆ©ÏI…s+AzÆìýë(îÿùo"” |\Â5òýmýS9¿êïÊß?Ï…P@,y¼wÎ#Ö–Ä¡¾™¬Åóà1�&+Döª&üð�ý´|�Ééñ7LW9.YË˼ѫۙ&ßÛHùU|c×Ùޚɯñ¬‡­G0î%q{¡¥®¤W°­MÝb¢=Úö.<«™æfR„1¸ÊÐàqPœƒÚ@rÈ»òÊæq)}nP$=×ÚvæëËõÛC­¿n÷øÒ"YÒ´P }’D½F2¾é:†JšF°ƒS¯åKg4éIžº(ù=‚@²ý?N˜ÊWƹ×pVO �»ªÏU÷k»î'·~½¡éô¸ ¬N‡.§k¼¥èòŸ.›ÉEþFgeû{-_·øHàÂü¼¿7Îîù/Qs¯Óæ¹dÃk”�‡Ï* žN‰;“‚è˜WÊh«KÌT#cÆ©‚Ø4P\ÖÙXoËD<¶Þ<Û½[Þ+Šá°‰ ®1êšYÓm@Y8õë]=G¼ö†¡/p�JpeÏõïžé.ýÝœþèÀ<â»ñ4k÷mð»Uó¾Â·HˆªR!f«œ:öÏWp,%¯‰ÖîÊøärà®  ã¦!Oª£²xØœNÓV� f? ¿q™/3r°äÞ¦ž»x»ºñ³#c�ü¹ï�¬Vñûnâ÷§®û*X#pôtU‚›rIpܤsÛ¢f �Ÿëv"Ða¡C g¤º 0[{¢ì°ž©î7ΤÇ9¹KHcç;kÚK�w;D�ÏœJ_ž„ý½.µ´ŽPá¼Çœþ“Sk2æÄ^êÕˆ5ÀÃH~ ÅGÆýû_Ü´\ã8FÙ§Ùm!é|ÙyÖ\¯Q‘ç9šd“ô¹©“øtšÞô»Ý΢áÜ °iÓ½V¹Í%Ÿ/Ï7öa“IÑqA²GVdz^³w.+Ð-Jȳx¸ë»Ï9íD—ÊØÝ¿€?~ û"O¤�퇲wâÑæÅ·§�}¸þÆYïnÐ¥áœAïßž´LÿÐgÝðÍòîbépø¸�»×J:G°·5žIƒ½²+?Õ|Û;U)ÇçØÚ¹µh‹ÆtºVdkñsjÆùGœÔ2.ît§;Ì�íˆõ;Ùô#ÏíöK‚~{q¬V¾ŽÚwNOk:�'ZråÈõ9IÍö–›msf6'D�ç¤yº5st¦ç¢òP;(�SØ6OW?rø\û2úǸ­J¦Ö{D»Ç¶7nˆ_JÑî'5wNí»6˜I¾ÌûÝ¡í ²úúèNUél¶qtjÂFìÙÅàLTI [‘e¶wJGš> µbða“ã5›ç£@+×6¥$E'?S �ãZ©4Á•¾>Ø3oÝ€°| ¥Áˆ2—Dv]Fn*,Wˆï9VànT­`ZJˆ ¨tcØ}<í ‹u«.Õq¹ÿGæ*ÏÓ¸ëìÆØ†µÄ”êWúÄ¥ð¨k·"o•–壨úÑ=2ëËgÌ7`¶ëlÿ·“ÆßÍi³oƒ-£T­ãâs DBâ5 +[¹1Rw¹zF¡ù=WîVU0]_“±’|½¦ß[k׺üyùa|¿âˆH@Ÿø¢ YT‘…”…P”€AD•€V`Ue@„‘VUD?»ŸŽ–J�²”k6ÿ1‘åÇÇ)vQ–Æ,_â` WÞ3(ްõÀžîÚ½0 67¬¶n{†…âj+‚É_emf[ åØðVÿ3½=é” Õx‡ÆgÒ“áŠÐ÷F;W}3^èÛÍó«êÐèÝ©®¸ÄEÅ#ð‹‹¯ÅT,bJãS1Â;ÏmYï#g+ݼ¾æüMï~ON×b^ÞñÈ¢…¡;iE´Ž8ìFŠøw×ט�Îböôâø�mÁ…y*|û˜­ØZöúû{[Ȇ�µM–Ârï΀팖Ӭ>nÄ)À`¿ä‰ª§L|C­#“˜%áw¬¶Õ›s�j͓ז& {)WþîóÆ(çàü¾�¸¡÷£�/Aúžg{OÒé«`=îã`b«½í|%’�qC ‘ËdýK1¿tš…ô»^üé>M§}]Ðꕼ¹04‚à…ÿ˜Ò3JR5gú~Î@è~hÇØ~üBßO?oËo¥"†{Ü%/î™=šÎ¥�Áé™'£�”0µ©þÖYE·¢ÄæxãíÆ— eiê–£ZÛcuîº$íÞ›9n4¢VJ�8 µwF,9qù—¡Ï§QxïÔ(9‘m …‰ïÈ¡îÒ:Îm¬Äì«%¢hæïQ |?Í×úþŸ¼ËÏ¡FîëVúÏv•á!*rx9Ûgh„Úƒ¤] è*Ö½ºxÃ� áR)«8DÑÞºüÓ0÷Þ^Âû•~×yC´ä=rwK¤ ;n¼¹?�3œWC+¾�·9†UH<ôûò”JFóûÆF‘ W°û_ˆƒX«üêkkŸu}ÜW€‘»¢C”Ž$·=˜wÜÇ¥~žk»Ÿ¹zÖ8Ú,^£ÐƒÂÙ{‡-¤Ðn¥au«u`E €¬±¶nØ‘ØÏþ®÷±½aªÂ%u�-Æ£ñ=cJ-g™ëâxÇ µ±�ì<ŽÕR›Ã$ÿL¿Ùßmc§:[Äu€»P¤™6ËWó·®þ£Èz‘è9º²³†ŒèB×ÔnÊ»KVØNãoׯòí‰Ó‘Ø+Cã~â(y$,”:q8¡©€½‡×ìž\³šÅ.·�p( T›Uƒ…�me7µ’kÄäJÝóÕO1Ùú¦VÕŸ€Óy§®ˆ„pÎò‘œW ˆeýZ>¿5ÇǨù¬©!/›UÆÉ䊮+Ãá¸ÓôRë¬WšÓ�3ËÞ÷ômÕ\ÆÚdæÚC…"øføÁŠ0'ÖÅEßÞ~&ï8ðmâÀ“Ê¢˜%ô2øðEä‹2?ê­n§}îmW:OÛTâ YsB)�Ž�w¸§Í‹· ��nÁü%hfB#~ýûðSí Jî Èð\p}ï�©‹z[<†/4àRç‡|Ï�°ë—ñ5ÊÂAg{dku uúù¼Ù‚ÀžÇjªáGS 4át/Ü—w±¶¢~Ä|Óo4Z  ÃÙ|ÖŽ¼¬¹î”ÃÖêÀàOÁ* î"»³˜SÞcfʃ®-Hƒ»Š4¤€¯!´Í²ÒâûæU·&¢6¨ig04Ñ`»[:6¢’ï¾EÐHÑ.fĉZLF¡ ck¤Ã%ô·=Á|('ö4£ÕŸi$¨8NX·�®Ô»ÏØõɱlï×o¨šÉ ‰{ñ�i¹ÒjÛÐÅïŒP ûÞ-~{0¢>þOkì6 [›Í�Ü&ï²¾hýëkñSÂ&ìVh@ÑFvÚøµêkz ƒ ¯6®¼~rÁmÚBƒÁJhCH‰'b½X ú†c<£O>ï—ªNd_{3Sh¶1nz0ÆûÑ~ .� vø·^"L³Þemy‹­¯ÇN…V4¾¦’ä`ú�Žùù¨éVX)ú|¹_t7m ~×bÚ=Íö¬^$çœvý¶~%é‡ÝΩĞ/#íFä¬mN­žéàÌÇŸ�°§ç.X>uµÍ �j³  Y€ê¸¢€}0·²P® È¡ŸëÞµÀ>%³$>~ÜÚW`Ñps˜•Ù1bÓo¬ä_”ÿg!ÆW¹ù¸wÚ!GYÕbÞKi™¦®|&èìÝ1ôXYì-É7äOEô`q`* î·>¶©úÁ]Ò#^âe,Ux;,|äu°¡ÀÒ‰¸yá­OÞ-»´ì\׿t/S(áõµ†ëÒ0lTÓ|Ô\"9(‚7ÝÃU WZHc0Ñ⢈Žê“o¬Þ&¾ózø�ôKd2Øz=ÆÂÿ5‚7Öß5ñZĤ‹+Š–y°äMÐ}Ü*Ü“[�ˆ¤ÕÄýPú<‹ذ î=åΪ±˜µ×:(çø˜F@þ¤= ‹¸œà¿¹s–t„” �7�)ªéN—õWz›)!§�Jö›P9‘²pµddTdâk‡ÎfqVL‰�.&aͯOÛ�æÞëžÊ\Çkj SE„Ó>œ|Pàðòë{Í Ï’%Áåc"8Cüý8įˆK£^¥Ù6Ò-Mok¹ à†6H3{å"!GB�÷_Ñ)Bëf‚ :nõñtå®t!,�}8hï_„÷žG¾£æ_l¹p¬DÙÂû7+Þ‡Û¾ò¯æul‰w>»{8(4ûàO²ß#àûÌ\»vÏõ–éÖ¹å1dƒ†·ß°¬}ZÅ¢ã7N ÍØÖ@ð<·ß-ýùt-Ñ¡9óœ±×ap‡×æ³s¢|ׄ.Õ=¼“ÍÕ¥ÁR¶Ê él…½Å·hsgŸ*û ÷¦vD÷ÎÖkLí|]ÿ>Ř㽔 gå^ªÇ“Ò'm•½Ï&¿d³–ÄÝJ ñ»cÖ¹ÔÕ2ýœò†úËD¬+¿³“EZïÂ9|m{KDâóÝ¿ÍéöW>ñ\A:yªëVO­N·[F£ºuuÝbÊ®ýÍuùŒ²˜ýÐ?”ùÉŽÜ»äí×>â€Ù“öå–ê‘Éqé¶GgáüüÖGpÔá(V°:]Þúl63ùM°p—/¸~žT§¶êߺ"Doççí^²Ô®Žc³ä1ÑÄRðJã¤G;6Fû=0À°IrÊ*€ÒÚjõŒj47LOÃZ©ìÜ2¼,Ú²1¹² Ù ar��=¹ óH>Y™±‹[më�TêmUÐÉí¯—i!W xÊRÜŸM­`­øá[Åz óÍ4]i°ÔÖ§YõÁ_.¼B2«~üÐçßo¿@òߢŸL‘ÞYÕB®m˜ùì7ÔôšóöýŽÎyôô]]ÖÙ�'=[}õ‘7'~4h!*5k<9Tg °ˆJH€w‰ã&—#ìVDtR~•N†YÇöë‡út=„@¶w®„9‘¨|β;âÐIZEù5çàë–üÈ#¡l£¿Ï¨Ë¢v×ç�ùù­Ðsfû†™­a(RËsÛ$!öºJ³©y€Þù¦Þ3älSéíð9�Tì´¦.e®ãëä_»—$š°¹sK<Í0&e0[,ÊœíuLßcE%ɆËÝškrÄ.~—}•ï`K§�¶ïqƒ¿Íš^ue3Íw¢»„‘‚®»–2ݸd»r·/œ£*�Y–˜fQi˜2!Y0Yјàëö~ojþÙ¤ïs~mšícÚ2\{³âQÃ~iL{c®ñV#Ï}ô!=ú>\#ß®˜�ÁÐe1Ì,7wè–©Ž:jñæŒÜ¯)¹·fá°}” ¶kZwrŠÑlj™yxÆIï~9ÎÚðÇé@ί{ø>ù¶ß òçÌ�ÀÜßžc¿>óßÛ^£±nÇÝê–nW’�—ÌŠø{–wó<Ú/s_KQIÇ*a¯„í«çοq¤‰ÚÕ€fý¾"Þöß#q¸­|»psDz<»ÄŠe‘¬†Å„5\Ú‹ÍÃëOQË7異 7©P" äv†û-»¦Ã€$è<]Ïol�Ç{}ï<ªíÅõŶÃdÉ9fÑ0kS»ÆÖ®7rª³¿.× à0Oñ¯¯ò•°‚ü u·–Œ£¹²“ߘåÁvç3GdëSÙƒ2W2(©1¶è^MÊ0³ôn0xÿûìKâ–ñâÇðû­Þ?Öz<Hïàü¿~üiôҾ̕þÔÙ?©þ{§-p­35. ùÁ½Q~>DÞÞãÏ}оóp+0åiy~쟻­[¦@÷ð˜(ç¿*ü¸ ä={wz꯷°^ˆäk— Íùµ=lÙÙ|vl÷3ŽÛ›Ë Äpœér™z’O…çÚ[lÆb Ï�7ê? £_iúö>‹fãMî–1Êï¶ÕŸÜz’‘‘:GÜ¡‘×]à ÓÂwLÛ¨;äÒîü.Öh€‰ny,éX[*[Ñ¢&K�‹À'æ°k¨ßucf6î› ’OHä}cÕƒ Ýá.Vç_–†Ý� {Ç=¯&Óo>ø$èÅ r›óƒ]mãV7N‘õý¼(RÀìæÜcõ�eÀ´T^‹Á¢[Ô>!�û§|7¯m»—RkWcÎê3‰Ö¯| vö÷k¶)>÷ quh=ÙähWNÀÏöÆÚ[0�àÛ™ö°ž =“£¡wÆX÷ƒ˜ãÞ-Í‹ä&Îѵž Là�RmŸ ʼˆerµ}ê«÷C9ˆ•ÞoÌÙ?n;hè¸ÎK }³ÙPU–1Iòä.÷ %oY}¨Ç1¦KƒÇïYÞâjw®FiÅýQ~¨‰õ3N±æ½øÖùùù~Õyùœ_.ùyÃÝU•—ìm¶×0h:Á^7—zÇù¢‚þ}y"?��ô0®’¹™ÅõÚÉÛ†yºžÀ6¦� eQ%ç<]�—©s´Øà¬‚k^VºhÇR�yª9ðë8Sõ;òÜÐþ� “o ”‚.EF•;‘E‡¾à[ÛÎxBZâ±ÝÌÎ趤åºÒ~ zÉq½�nw/Î>²Þ|”®j¸Î¹y1«‘⦵-ïoÞ^/€Øs$ÙFúæ){Ì-ù 4Sª6ÓE�‚pÕܵÁ£åÞûÖW;CöÔp„\*gÃ;zý�w‚‰Þ ÎØ´e:)9xén ¹–2Ë…mº #v(ó‹ÍìÔƒÅqÒ½­kî¶‚ÁBD5Ê'†˜<壭Yç9Ü×y™ÕÂãêæÓý0 оP´-öúL’íˆ^¸Eþ±Ú…ç5ôشØ^Pm^¶`»‚¶¹³Â±0l¡Û„C *Y†Õ,P2×QÚÈoªÎ£Yèý}VšË»aô`Ž]±;H7JÔ=æ~Ž”Þ%*I.š}îZkÚÇåÙY0�Ç1(Ç¥Ô5±¶î݇ßÍnhQSݰ¿C`XhöQrýu­–<û§Ãûp©>QÂFìM$òt!dB@µÁw~t h»#’|vñcÒšë8ÂIåã èÍSõæ“u£¦¬¦È•U°CñÚåÄÁk^›pëN1Ob›�à™5T9\=»‹`µ ®Ø§··¹† ]Kvy¸Ësy]¨3 ÀÛ¼IŸ\(CÖ¿.{;–pïÍ+Ú>{�j#—íg½š«iœ/̦»‹íRÜÞ÷,éL'}?¾ÆmÕ¶Q±l7(´}¬ub%–Q¦í;òíJSèºÁiâÓ†»nŸâX§€±¤›Wå$­ÐÈʧãñ�ÜGÑ !ýëâ˜*JÄ Ù*Í^Ƙ-âñì\slÜ’ÜÜÛçÕ~ÌÖØpäö�îí–ý"DÑHˆ¡!1—‡kWW3‰E¬]8½<67 P¹ n4á÷ȶX±ANî=eW6—BÑ)ý�kî"kßM_7è§—¨[B/K£öJ'–ê’:ú8å.”7‰{x Á¨hÕ»�ÑKn¿\ôgí�7BõR¶‹yƪ‡¿J}÷ç õ�ÌòÖ>ÃGD¥Ç©¶vpæã?Q†f½G–(Ë660ãYO¦5xåÒ!¿8Ñfà™ �AN–#ðñŠÉHWåÂ…ÇR5]ƒmq„`LI,8áBÐ#¸»FBÉÛÿ "ìoYjËl“‡Eñß9¨¨ÏØz­uÞ«ìêE?§² >-Øê1 )BÏmvA⫹¹`4¿FÍÍšÏÉαQ€x7J"Ìm’çrM®h(¡÷rþkâ�˜z@€Ðùxæ”ñ<î§Ùö÷ŒÃjö\ }›ÞŒhÀ¾;Y4óDd­êu yæm8SYå«,»ìKÛe®Îæ‹9äV¼i9l×ãÀ·¶úøûjº¸p.sïi6LîZ%»"á’¥Õ›E 2÷¬/•EÕ뫾%tEØe¼ÕGï“€¯uU¶S\‚ u6@+‹áŽŠã\”éÈP±Ç¦µ¿]å¦ý~wÔàÉ:FYVŦʱ^ÀïÊ/ØËóQ-o¥þUk¡jÎUm!]Žw<ÆÝôÁ7Í”ÜúÍl˘4h¾Cp(P*…9×%ë—‹ûŒ}æÈ©¶Õ‘½ 9Ðvü²üº&Ÿ‚mÙ§|ýÕ¾…ÿk1rm‡†6#>j¤ ùÊ·©nÙúª}ÅmX™\fìyf—8ûUzúL]+­Úμ纣Aóé¶» X±«P=ŽÂBècAˆíÅÁ³º|}×[ïp+?s’]Ù©\3NŠâ¬k¤P2Å&ùú.�²zcI°ê˜XrdZkòLRAïÎ8•ç/k¨JÚØVØµàŠ¸Iƒ£ÝüÖ~ógØܶ9)Þ–ð—3 Ä< ÷ÊÞíoÏEை öÆ)s_’>¦û¯yéňÒ&X;ÑcÀ¢äZ­„u#W[ƒtØâuÀmmáŸh¢å"½Y:H"Ÿéˆì®zö¢‚ì—ôéA9oåà"Ÿx~³:Êæ­ÆS2þ‚g"wÈ&›(WŒ?¼)‹,ÕDƒ°Ú¾/oxÞ` ¸|ˤ¡¬3°>s “n*_�páe…ÝPoJÙé&Išç#±ö]\0å6ý'ìÐä9­Àõž R¡ùl.0…ˆ­‚÷Úµ`eð“�y•}œîü7æ‹æ"³�5éåÌyˆ„Gtq·E‘YÎ`üŠWfB+~ëÜ&ª¨þÆú�ˆøÎbJÊEJIøVÚµ¯¥óY‚ÈwÜ?Âøšñ zÊ1âÙãuBÇ{?Ý©¶#––Ë“)ø9 /”bhnÓNƆʽ}äar±Â«{žhíhΚ�UoGvL™Å3³ßºÙkmÉ(ÝN�ܪÁÝœØÜ\qò­ãÍuFÄá­Ð·2*À"á!Š\ <Øõ¼ov™8;¢/2\ LcYl5�ñ´ºlu˜~ÅÁÕ6Ø�õ{§Ñ¸[Œ°—d¡BfZб“ǼÞzÔ䱬‹æÔ¸Ð¬/‰Œäãgb£·Ã•wC³u‡Rë÷‡ÕÜQ�zò�Ãtz¯Î±�È^Ð G2:CÔ+…Ž�yò ñ·`Kêý¬]WmrúQ©æ�îyÝ(”ôkÄOëYãdÚÅ$u JñªµÅ]î@[±YMu¨£+æ•ÕJüUÝ;µ¹µ€ A (À=è9ó$ÔÅÖÇÐ1¹c¶Ž¿r�Îß}g4µèrÙmØf¹ DDöhªä[®×CŸ�eÉÁÕ„<�! ÅV²h«Þ‰¡ŽÖÙP[Î>Û^š8ÔáÀ×q�,H{íÊ‹vs�y3ì. ÊÙŸ.Àª«»Q%Ú¼G¤¼ºn>í]MŽn‘¼÷oãôÚê7yÕ�Ù¨â þµ¯·ˆà= Ñ.`ÄÕ o�ù1{à½é&ÂÛÙJq�y?3“0ÞêVù<‘VçÍ»Ømæµ`d5WX6Þ ½9C’�ëFÙR0]·ËÝ ¼6ÀÄJãs±yìÏ�¦ l‡ ãÊ�êUjæÿt4�ø/AŸ…Ю4öð|{Ç´x&¯FM2^—Þ„U ÷k…+ôþ´`2›vå€HÇ�û[]x{v§'êÕ‰Ä! ´þ¢®,õæ…±õ Æ÷|%ß?B’v¸ Œã|ñJí’^¸ŽB\ç˜ÌEZVç�«4-ºVK›5€ÒºBÕª1äwã©~t‚ã4ÁI`ûy;‡¸–…›Á^‡¹£¬sq9Æ e�굯¯&ï/Ü`šb<Ÿ{J;£ÌúõZ䌈1tf'8=çaP·´ ®ÛmUT`B ’}�aZ};§M_ «ŽœrÁ¡¼[æðeT¸ÅÛ¢õáõhU‚ïöL°Ç4˜ø`YŽ-™Ãf�™O›†ûúÜ0ß_!óKÑAg¾úØ6 1ø{ue±ÜŒ]-ïM` (z¾™ù ÷c+xÖþ�µ»zÈ'­Ð÷Xƒ`¾ü•´zøsî;½µh9ŸyøºÙ�U®›C‘Ò'e´V§–gÎ"rÌœkÊôiR/Ç=`øXä5�­±éïuc«äÓϯ¢CT²©àá–D¸,|&Nk±Ä[ÜÙ°”Ñ>@½ ¤ˆ HúB�--öyD9*òô`7‘ƒï%K¿Äø£1¾ìˆŠ ÷篞�¸1ârÜ Þïq!¾ÖC}ŽÓoëï–Þ!}ïu:ÔóöÒÝûeõùÒèïœQÅ(kJ<6˜«{)èºð]/E‘Ûv=än2Ó~𾓠Пù"üEúèK~ý|³ÅÒ›VÓÜÒÿ2y•ËÙ¨Œbd<½\‚8ïHÚxærÛÊ ŽÖ ƒÎ¼¿^–Æ®.jI¥aQËŸ·Ô­bÌŒyšËoo®ÄÅX�¤ý²¶fÆ~ ¹Éh57°K:ç%fÚúó>)ǽ|´éSK;Ç;Û&UÕâ÷÷Ú‚Ê¢¹><`»“ŸB)RòuX Ó4Í€N%i�W,Ñk6®Ö0Ù•êºpõH"`YP``XĈO)N9¡ ¶ñ®›©è DË^wOÂy„dÖtÿ²ÖQdn­‹wÅlŠÊÿ öײe 3š[|o›Y~ŽBÈ/ZáèX~Ö~YXËlwñ¥»ž® Gw?l\9Z;_m.VÑÓ]»9vk™ßÊ6; õaHϱi‰ˆ| ݨ<Ø„„,mšë¶£^ðÏ-žm7”lb3H†Zںݩ.&¦Ö†ƒ±}…XH>½"|»š�%ÒŸC”ü›�ô#Û¹€úf¯‘T;êðÑ.nón,F°pï£õ\žÁ V-·Ô†C³¬­”îIÛÝZD„NÍÛÁò m€’zóg°›üßG³óƒþ.š3­ž-à[ÇUϼ@ Ý× =š…ì4ø5Ñço™®•�à=�Îe…>[ÇÑMb™p(S*½žµLZÆ0½±iËk°©%>mvˆ,Þ(B)$ƕۖنê¾9'“Ó�êÚD·YI˜õ4ë‚ú£ìö”h ávø¡D‚îøµ02ÍÛå¾-Öûˆ¥ ¬4ÛüÅׯ} ±ëpsN_1o}©¾�ݪAD®™ó;¸ÎC; RÈfŽ£OaЧò©ë¶*Qç(³Ÿ£‘È‚£•tÂ]…ñtv|ãËL�·D^,j�±›Oô×\à‚ës¯9½—”‰ÈôÓøu¾É¸h>àZFL‹[Hg_tìä©n%‰YÍß ( kj‘ÃXO"W7èÃH>ÎÐAzÏ’ùêÌlÉVét4¬ö瓘îÏq3q“÷MG]]×&à|﮹­L7ɘ ¿³/o’v)W‚µûbøˆtØ;bvÏ÷“-ðù4¢¡X«°„à Æ�]™ª»<Ýœïé'mÓÌ•²va*ÈøgªoŸ: —S Ýz÷ã›àm/w ×| ¦4�ëƒÅåãC÷ÌY½©7}÷{èêþàSËdFŸ9sãa³õ] ^À€ù‚™±2“B&I|¥yR:W @Åì ÚSMd|;´_ë�ÂSlSx+^£àž§Àhr9Æ#z°5fB“ˆ·íF¬" ÛçðW¯�虜¹ÇLw\¶om:¾c8ãE€°EÞq£Ÿ‰tÌ=}/u?aà‹r>ÕOFÚ?ÜÌ X#=]w 6Ã\ÁƒW�œ�ç/Â}“|܆B`‹Ó�$%-Œûòß�œçûjXpóC¯Ë£z…,T¿KþÀøžXÏ›7¹“·ïŸä¶d>J X픆MA:m»b=íÅKZntà5 I©êŸöõ‰¥dÖÙêý¾�°ÜÿO^Eª·vÍ�j[\S?#T�×—·þ:°@;ÜÔ�_ÃNˆ…šûEaŒô!xÙ N>‘Ü ø@c=\šüØ$\‚ÛÔ�éQÕ”š0õ©š&湘¿÷ 8[ÁöZ3{ +o9*{£z:š6ƒûïm6Òå*ð´›Ä2^¾÷‹rY²QØÚ·¬戂·5Û§ #h¹8¶ËÂ=`XS7Î Ý*¾[:/^[›�d÷¡˜å·¹¤ª}E¸Âf0ó;¬.¥ö/>’Ý;ÎÓãé¹/Iq�æïèàkª"º³ÙuÜïÀÅ÷°™Ã\6øÚß!4µo€–^4ÏÇ©|ƒ§GÀ3-ÖO##+uâ,ܨٮ½™+eZžÅÊž-m„?žûØÚufÀÙ¨áQ·[%«Ô�À^iÙù[Ü#Î �ã³ú«�k�fÖ ³ŽíTë²7žË­­‰N\–<pC¿yvŒs¥uj,²ã+¾y¤1ã \om:­ÛüEa àYÚ†¸È ]�ÕëѼ¶Z‡7xðh�Ù!Ù û 'Ë6³‚íì€böF}ï-³.p®é•‚æØ1}õ>ÈÿÚ‰\6õÙé·4mfüÍià ì×0íþ®»oaÓ.±WBab¦£û±v q›¶åá”_‰ºùtýj³ZùÌ=†Ï„,˜I}ªÄ«÷‘ÙdTtøî»¬â“›§šØ‚ÀÒæèïà Uë:¥lLã BšÒ(a»– aüÓ1× ý†íœÇ˜wçóAÙƒ¼x#¿Ã=ak¨kV‡UíÇ»Þõ½ –!w%hÿi±uËäµ›€JbÙLg›w/a?£Ú±—ò�RãÃÑá¶òÖùsÙ³Ï#“Žðä7î&'šÞ{šÙ:æoz!†ñpƒ>Õïš?¿pjµSS°‚ê /©ºŸ'‚ówr¤j0¥}ysŠ¿;ËÀk€#=±Ç7ò~�ªS¹�õu)Óç-Ÿ±ˆhÛß“Þ@(çùƤrnÏ(aÿ°Áöa®FÊ~+d0›.{;þÓ~´.‚ðà;D"æYØëìÐsßì ù™ÁƱùéê’¾.¼õu›ºK³×¼Ü:>>Äîe+©Û\v7Ç=esòa2P –Ë÷+¯“« þχ&ú3ï,l£Åÿ ø?JëP+m…‚Çæ:qÄw ZþŠe€ˆì\_·R[š~_Íý,{.q1cÁ0^Y†qžØ,|ºPòo=þfGáqW“uÃ×åßÕÆIróãhG�оK<Œ�ƒj¦:}øx,Y4à|p6øW!¶ ‹±íƒÆZáMt¶E/·/Ñß»Emõ[ßñïù/€X¹Ôž¹ýäà¿J»oæýþZAgöަ*YVô9ÿL§ì¦ä®1€<èW+êì¢OéˆjÃgÏC|1ÛÖ$Üê°¡þ:ر|ùûŠÀÚ¢¢”d¾í¹Òçs}ûeÕõ¼5œ×ý²­×„šÉ6ïXñÊ�U�ÔòQ#$Õ¤hTÂUJ” !^,D˜ó |Åÿ•k8AÚÄ´m©±Qsl -HÍ/¼B6.¡ëòø\=ZAE×öxp>¦,&ܬË›«Çm< ƒ½IýV­ò÷sª+>!shdݶËGqÍHþ†ºéTMŒ¨›¾ÒG!ÎqLœƒè»]ñ£tNPÏÞ‰IÎaøõ`òqÕͤë¸]y óU©ß-/€FK�‹ Êùù Vtq˜QTœ°v•ƒ63²ëÛºG¯è F Y U®›µ™DÞobãÎk=y7«êß 0HÝÔgV]vKáæ‰�·­¹rð&DÞR€l�Û«N, žaYck•É”gö)áªÕÜ¥´\N6ÝÀ‰Ãc²·ˆ‰�/!nîîŠkBF—.µjûkÊ̤¥U‡¿rÉÜëǾ‡·WÒuùë ;rªqžájõòVs‹½bÄç “Ž ô«à_>0µYº¡{ݺDly¹›v8\,ü¢§ÞÍûy`žë]ï…·µH×b–òª°(ÜÁ��<¼‹ô &õš†!7(¦F¼ëš‰Å‡’màޝnžã‹¾àB6k/šØggráÑŽ±•®h„Áu…P7DrÉý£ç¾Ë²1‹À¤0b(™¦ £ûÒ7!Q¡Õ‹‚„…“�îo­J÷aJð-ÉMèJǘ‹uyµÈ@Äç<.nõ³ÂŽë�.dþžÕ>¤�'îiµë®͔۠®þÂ}¢-�maÀŠš‹+,7Óc?ItCPNxœñ/èjÜ›ën;K[ŠåÞ§;’�ç9žc$æe–´³gYTƒìx[аà[ wi'½o³f\ +Ž×F¿RÜEpÅl1^Ø‹xÕ  ¸ÀXž^ý…”D‹Ud1Þ~½}¿=ýÞá_Fïvqàù¢Yè,W ®â[±ïedU‡³nýuêT8„ZÑž õHÁAÌÌ!\OÙï!³8fWƒˆ(w;÷u[B–+ˆ¿ßÖ˜•¸„�Bå�g ˆþþ·6Ž3b vÑkç �ÒênüÎ�*÷ˆE$ú—S|YzSkT6í¶�­ÿ�3¡~Eá³È—ôÞÕNKqͱ» ’áÈ´ÆÎ¦BÁiù�hu¶‡³…rð./¶dáÃSÝ«ímÖõš‘&——ûÙÒ[6ÖZKè·;åwÁ�_=åvž~Ë�upÁS�|þ< 6·œÆÜ}l˜£÷˜wPßez}Öùœ1(“à˜Ï:ujâðçôÑv>»näÙÒnB¿ @ˆvÙ6ÞÏÄ›¹Òâ†çœu%ÞÐûÞ|Ö0nãÍzÜ] È»Á QðiÁe“écAWÞ“Y-(b”kF(…‹!ì°èäB˜À%ŒÊ{H D�zÊ„JdM¬ÀÛ~F÷‘šn Dä· \À%òß—6¹ƒõðÚÚð�£¹÷pkMýâC²›­ïÒe)ë·¼|d]ö¢öÆ c�—!’®7<ê|‹c{rµ:4VxɺvvÀ©­^Žs ¯t´çë?�¿ob°n9¬¤´¢©"¡âº¡‰Ç½Uí¦6BwµÌïЕ � C4|íl›ÀHìãB¡Š:¯xò"dٲt•Ì.ÕîPîýC ¢�òÝouå3Idþç±Þ¡¼jûL)3îÅ`T•ǸbK`ôj¥·£�î R‰Ì%3sA掛¦Ï/ëÀ$f÷Jy^üU†æê~¸}ï}®öíÜ툕 eGH;ã¸Iüa\­ôœZ*+ãxß¶YRÖö2šbúrZ;ìPPüœºä/&xFúü 5VA³90f Xh ú¾å®ï~±sç�Qîòy/6fÄWRü´õéÒÌž9AqcH:–©y“¤ÉN´‹wt¼™îÊ!#lC´±m‹°ÿ"Y9õ©Ø…øí^M·/AÝe˜®êVOe…ªÀ8Êc¦R¡ÈÕ"<ĬŸm5 ,µ�¦8:‘£„ÉÐÖQôˆÕ8Qí·»²g¬œÚ*ÒÇvLI‚QWÐβŸÞ›`öAÞ’Fµ‡Ÿ�ö¨Î•08ág¨�ƒ¼Å;èR¹_[Àÿ¯H¢öçR8EÌ}ŠPŒÛ�|u íŒ1æÙ@–f²KÓ¶…Þœ„/8ºÝçØ¾<�G·2Îúk!†¼C;ò±ñ?+gkJéÌgíåpg³‰¨®¹%ó 8Ū=‡ÎÍV²<Åò«¼™“’^#%¥Ê:3r°Ò¦Gêdo@m¬•¶ô PE©7íE š8Ó n6@Œ4Þ fPÖÔï˜ÅçËÛFøjâ{Öá­v^`ºz‚3W+Ú'Ï‚í8À âÊH¼@ª¿YÉOfÆc—W-“=Š…h¦1ÃQÅ¡~géU~%¼öñtÏ Ö,sDd~›‡°Ü‡±»Øµ5ÆËèQ­ƒ{YÄmœèI56ËÙ‡iì~Ywè=ÏOP»'IÉnÜ)=|qC<·ÛÎìPýDm?AJ%Oк²ÒàäŽ}ÞàYÜ9vbù­G±#ñiek†¢ÏÐÐS ¯3ºÔÝ¢�|Õ®ú\R,Ð�°e^ô=ßVNp’µò�ñ›¹Û�èJZ¾¥¢Çðƒ™A¦-Û¨Ÿ2\„7¼{è@ûÒb¹Ñ5`�ìä}ÙN¾Å‚iÛ“G´æÇ‰ÐâväÇ£3CõžþŠ»M½ñóUƒ²GÊ]J¯3˜diSݸ$ßÏVŦ"@0›s�˜|Ôòâ˜Ê˜^¶û,üh,qp±Eb¶\_ÇIÞ™¸’g½3"ƒujIYC­[KÚ s bí>1Å¥ òÅ6œÁ¯¥áÞélÞV_Õº—ÏÓÂÜð¢bÖo³±±¼6’+Öžr…ýf¬_#xjÀÅ-Ÿ[&Ÿ^Úw§q°U¹ïu-të²x× ímivëüãø?~ Dò‘îÇ·[oÏ"„Zê=¢äÉÕ}µ°?ž}ÍGQ{[¡”% ¯ûês—¾'Þ7ªÊ§^ïþî²Ô?ÌGü̃¥üŸ\ŠÁ{=†?W]ºø)ÔƒËj>6–iâ¬jÍÄËM]“™ˆf‘Yd…Ô¦¿«2ŒþˆÇs¢Ø”M?¯ÏÏÀcÜ–ÝÅÿÒ¹‡±K%ݾxÍÖ•düD� +t•l×…Ž#"UcKAøûd Öžœ*ÊVÛ¢‚eb,ž¸zŒ2Ó¢ËUUWùü)#’ŠÙ/„Ùfå—Y?ò¥ûYê’·gý#{'Ñ¥|B?|ñ¬c&¶q±î™~®‡�5÷ý7<á Á¬‰pHö“�”ôG+.ùñÉT¡¦ÏWkøpù*ñQìyÖ¢™vµÀ|zGÕýBÜ"€Ã7ú¹ÜÛŠß‚z© ¬ßä�Ãá¶@{a»š…j¼p‚ÊÈ£GÉ´Œ¼%™ÆËuAÿ;k¿÷à ¤Ù]n©,õ¹W¦>p¥2—‚e!³]ˆgÅ¿•ŸÕ¨ÍñÌAV ?«@AÅN0"bâ¾Mã2ßrCj® Ìui7—B¹½�7µË/ßJqœ�‚�1Š™ »‡ ¶ 8ïͺÔê‹R¼{+,ÄB GB1Å[fm¡7<+�u oåï–‰\4à¿æcᆽW¤•vÜß©·~cKjë¶Èˆ¿Hì´Fÿ*CàQnv³GídŠ»™ðÃ[?íÌ×ÈÔÝ‘È{‹�½¥£nßǧxx²Â�³Ÿ�ÐþÌ7Ý‘•Ùëâ·¦nAÀŸ;ˆ™òyìFüÉ¡J×Ç;åñK}„È‚&T³AT"”½býM½·ñ2¥È'”7QÚH ¥¡QW©ˆ>šg…%ŠÙÕ¯ø"ö“µ¥Ç¡ÁËÀœXâ'\@™^PÜ=6LŠÊ,,n„3£ÞM°ßQÑqþ mXŠÐк%�ìPkq eò-c)@Êá�+G3ДF\EÊWÇ>Û!úç € áá"å>ú[FÜØŸè»csÞNœè.ÃvS0ÙÌ­¾»”ÿuõ>¹.ä’_ÂX€§5ܹbm‚…t`¢Ã«Åøªƒ„¶}ÿ¶vÅxOòþ�ÆS××${=Ö®ÀUòÞ}f§´?ö1¶çžØˆ:VJ†4jÿÖ¤Ly^jÝȰ؄v8Òˆð`ðgmmm§3ñ†ãLEÄ“6&YPú˜d«Àºsém©ÑÿF�î)I³6”Ï4Lõzƒæ©9þ¥ÆI*3qPY‹)™£Ÿìü6l5&ù|yÜ$fû2Íúc¿ôî# #à¿+ƒ) Y}¹îuoÅyv®4îæä=K�> „~¤DÜÈxd°Üµ”¸ÅÛg˽ú  xêoti<Ï‹´ÝÓñ—B”Q�×ì/7ûÊkl6×@½¦qE9«do½ø¬FâÂWùrº”€5FvÞ|_‹ræ^>u­e¦V çlO@Ï�zE·ÓmVާƒõÄ âvnÍÜá2—N:cò…Å�hZº?×Ç n þþ–_,·ó¨_õÍ)nhŸ R½G\ºcÖ•ôkì´Wü š‡¯¦Ã×øD‡èÕí ÀBì0Š~>õŸ*8‚:ÍêFÆòÐ@p,8R¹ üeäŠD4X·¼ŽsM]P[~©ºl¶2€U•êFSqp`üˆ˜IŠÀ�Ñ�§ÁãžÎw{©#MM ¢d£7rLŠ¡¦È–ég«“9"Ö®Âç\¨_ì–PfÞè¶´’ÒÞï›lÒÙiáÞ¬HéÿV/mhXË–SÁÎk¾§‹•’ÞR¤[®ïß Ri÷‹ª¬/tš«å™rn6%åšër=FË,®�SHÒ0åFÂ(¾-6Ú“0n’%�_‡w,1^w“à´÷:K�õpXéõ„7¿ i¶©_õí§€µ-Sa‚´¸ö1¢9yï.�P Ø'�­<=-âœoÕÚ"S2ï·\çZ¸/J¦¼Wnî¢ÛÑ�Ôæ€%Ð+ÃG¿\ç«ß›×�«°6Hþö™ì”âžÖ4êpÍ�ú )�±‹ûûuqÓ„‘Û`�à¨5}~by½îä^Â(`ø_!‡Fÿp5Ú„X\Ø \¾×¢ÈÿF|àû0LW 1±Åø9)ë&ZÖÃüAq:P¤…ÝÀ½qvMÉŠÓcqº}â…·z½®ÍÒw‹†·Î‰¶ê`,0+³Mã%¿ƒXÇ/Ûk-€¡Tx<Ý2ÕÇ}¯ŠšÙ«»¯˜û¶‹å3hND 34ÛN¥³¹,4äö;¶H~CÃZÁv~o×k^^ãCÌ*70ÑÙ饹“>ý‰lðÃ%�Ò¦"�>b¾ ~!?eåSpmŒ&U¥cÉußÙ½ã—`\ßO-±Ó‘;Lsä¬ìꫬ|¨ÆKÎ90î5 Ú’ÂbìÂä~O •Í>¼¢½fß癬å9Os­§#3à¸bïšöâÒËŸßDƒ¿ZíÅ8ëº0d`wt åqª FÛp¶10R+ä½'´ÂƒŸb�BÁÿâºÏh­·,yþ�ƒ?s'Ÿ±”²9S›ØY¬–ó©Yo ß ¹YÀ¬XÏæëþZiæÞ Ÿg°ðoŽ—Øg7æîª#F�)ï)ŸˆÔ¡óVPÃ6IÔfÊ<1Îp”ly2¸Ò‡IHJÅ(µïØ|¶gC›Ä~Ú)ŒŒcIÛþ¼%j·ÔŽ":= Ïí.r'Q"A•1Ng\ßG�nïVI9VÐo>žóAã0ÖÐ-ŠÉ2ÈùZ²f ô¡Bõ‹hùÛØRB‰¨v½ÔsÛß/”Éœ•)k{‰:@8� Þ§æ›ÊŒ…}Íì}ËÚà öî¯JݰøÒro%ZôM› p6!Å®kÇŽoI¨Ècp™ Ps I]£* =¾q‹"ÅS+ÐZó3 èz‡6BñÃøµ_NuÙ £ý”»à%±º‡ÇEª|äÓ’U•²fÊú,‡I$´/ ·5Õ'ʨ}jë%\ÆfsYñ¥¹fªƒš>_ظ@èà3á‹sPõ¾„Úó•°9âZǘ“DÉœûºÜÑ[YSôߘv#W^?U9!bQ@»”ÚÚ“ƒpWÉUº…sݯ]³0{\ú‰×¥9­4Ù~6çÔ�˜ªãÈNƒË(¶üÕï.³}ÙoŸäª^K�•Ú ß]¶LE3fé~ã$dhúB~gG›*9TÔ·Á@j‹OÌw!n-–�é©ѨSó¨Žòñߦ�Qƒ…èËr¨Ãçžò|À"?¹=òþR‡^ýÓ¸=9ˆ�É3ºÂbPÉú9·HÃbOq§¶;MhÔ¨ò"K!ļH“6vd3bû¸�j°�£æ¸E €‘5£üj-«®^|Ír‘{:ž��~l£K—cgìÚy¥Þ7�1ÔpY?"°ßûvà†ïž á½Y—¸ýÜ»à€‡Ëõïß‹ª 2Þâ휖ã„Ö#ÜBzb*çâ5—yfÿ´ ×VE¼µ6ÛBµþ'…kìèF 4µïVxŸ~0Ó_Þåx|#•’ÿk6�îÃñm ç¿–èt¯Yû]VìÓ•ôŒ�|øâ!¯ÞªgëÄ—ªá¬;֛‰»¡ycgº¨ÍÂÙá5k÷ú‘ÿ2wš¿²•1Ö{4@j¹Ü{/tš‘6ºœŒ‡·`{62ãM+0Wb«¸ÎMx§V§:|j'}Â?ùXr†ÀÅ/Ïš/Ca³Ên0ZÌY§2Žz¹¨ÃÉ€c½¿˜z‹>À{7 Ü_Æfö°^10``±è p ¢k��ÕÙOg`¤þBØF„�³:ûf²q²úKÅñß­XòÞÒÔôªÕÓiÁ/Öüé ë×/™ì_f®Q~ݶÿ Cà=ñdž>¿049Ž %]päÍ'¤è…·Ü¯ùý“ýÕÚäòýÚù=àäËQ°•Èû÷Í ÄØå*2f—,!Ι§vE­�?‹¢R—óËÅ’ò›€[¤Üù2Ñœ fÙ_èFÈûkdí[ÈÙã_—Ùl¥|tdÆ.äàoŒõ  ‘|�žc,å»îéÿ!û÷Ñ)“¬¡óüqUáí›ñÛ¼ã¼.‚Ü¿PB¥±î%åuÖz1ƒ�R‡@›˜oŽ÷ç¦ÉÍ,ŸøÚ× wÝ>îS ø�ˆÇb³™ŒK„FO›µïX¦F ‘dFaÍĽxmVb±¬áFؤ5(*í’þ¦�šãÒ”„1Ñ@?ÑI=ìnœ.úF°'ŒþÆ ‚"Z÷8ëjNŸkyq†``pKÙT/‘%ä¹A‚¿ Z{³R•‰ûÚ³ìn š0º3dÿ\{3pŸ`“S{Æð7›{¸»£²ïE=•^RÜ�ˆýÍÆ:gÃÅ·~Ð@Ð6ðÀTXš\V|ˆÔâ óî5 ®ÖJ«íœö»H钉ʙû›>¨¨¨~i$ß¾-',[oýì“ë=êüØñ¤ùª³ê\ŠAýïL»vÄ ˜íV/GA„ècÁá²zrÑ E„“5†d|€Ê›ŒgkVÈN,Àµ!óÚ³Æ<]°pä¾/à—ô÷Ö2/ké"6,­ÇïyÃÍÞÆFÂ…Þ¶û÷ã÷½d6éZ $T"É'¾_¼š7Ö—B¥w¤Ò†Ž×[}Ê,ìhØ-b›�qgšgíà/­yšÞˆÎ˜³ÊMéJ’¨¸¡lÿ¿sŽ7˜ð³’ÁÝ„ú{nÏ–gç;$ä–zx~^O;œr%Ö­]ì0n¶ú–Õ€jõ\íªÓ¶níÁÌ¯щÈÆ~­å ÛŒåÍûîy@|Æ-ëg¯Õ\t¿MÃO,X�Õ˜¤îWü3å°þ¾/¢Û^³œt­!º¥Ã(†[C&톰X€f9~ÂX,%?Ê\Ýð–óÛ þÀ~ÎÀ¶Eõ0±e¤k4U‘áa`J\ôî·<ýûze>µ>³C¹×7Ž [zHÕoðˆ?±™…i%i«ò¯™HPf!ÝivÊAüéϪ‡±¡SŒï’TqbYN¼zß-…Ú¬_‘ä£\6/¥Ô=F³YB]îæ Öi‡‡D$›fëk@…lœ¾ù(m˜×J¯vä-el§-¦B*¶Ø€³b{ j`î�U|á@C"Á£>÷1k•áåXÙxá®áCíWd_Öï#ÆfCkÀ8a–âUÙ ‚w61iᘠØ�Q}uÃ>^^+êÑÐ/ÏÑã_’˜¾ïgË C½êå3/ïrZå«Öl#¦²Æt`$·£–Úb \�–:ÃÝ|�ákQ›vônžîåì÷’‚�p›ÉQVÜîŠøžkaÕºtU7C{bÝê•Ú ý[ˆªdEl-ÊFå¸nÉqºY.\ví»Ìu§EV±í©�‡µcz´Â0™"•CþA m�X¿TFrôǾ·à½r�eò,Í8Är7žJßÊ)WÎÜœr{`Ú ‚Û¥W�“Þœ»ê综ö…FU.¹ÌÏNæ‰È„öE왩‚¦ÈG±^0ßeâã“<ÈÌg‹y¾5=p[ÙøØYÄ•ÝÔðÕÔ¦ž÷±Ãlc »[ç=ÍI¤ÄsfyØVEŽÅ¼†qÁ,ÑYº Jøö¬òŨ ʇïÁ´y#±Eãö ›)ÀÍÜ¡[',¤)Ž.8"e<ÕQñHŽäHàö÷e`æ®É|Ó¢Œr´0džBã-Ë Ä1ÿ^­.·fB×ÛŠ·Ð9Ì,|�Þõ¤æ4}»[¹t¸ˆhÎÍkö˜¡½Üý6 Œ?š¥u0Ì%×bb(¬4+Øõ:Oyß©‡Žy³ƒ©ãÇŒñ»Í—žc $⺲ŽúÙª ç–†S­sJñv‘Ùxl�ö¬ï ¡ PK$™~JÉÿ,½Rb÷À3+dë#ëå»eÿÓÅÊi<òù·Iœ†Y¨~þ`^‰ºÄ)RZ,Aˆ ÇŠ%¹„Jí¿¤ Ñqâ™1Ìó»<‹dd­ˆŸ+ ™¯ß»N9{D!úÖº:õ7�ñ�#µçR¨ZÅ6%Ê2¨ ¢|#pg· a3®…Ö›“WÝ´Á+±Ýƒ%€[Ìl6n:³$�Ÿöî˜óXбÌ5Ÿås àà±H‚Šä]�ŒR+× jÙòØ=Ϩmûk‰ÞÛXµpë@€ÇÎ.ûü-¾xËA{Ÿ\�`keª<ÈNÝ•k¶Ò¦œ+"ºE>ò{\Þú,g¬�°§g¦)ßA'áM©G—Øu¼Ï7j›¾=ª¸>�66½¡{¿Ý9Yi®˜T 1ä>œáL”I ¬ÏZ ·Nª÷{ÚÁ!tŒ�ÛXø #;ŤHÍ&i¹#b§äW`Mèvî¸Ì?Ž·,d¡ÕÜŽýÇa_µ}º� !J°É�R²èw â¨×]°*A@ÍÈòcr²|w(§ãÏltšñ¥ ®Õž‹ß²÷€.ã.¬Öë!ȳäᙸÆL5z¹ÃÌ-¹t–”äÑÇßQr Ý[dß ‘V:ÏmaN]·½{+.SôÏEM®æ\Ð{‰8aÐApøZe[ÞÎñSo\Ìžº´7t•"?dVÖ dzÓÙ)Ú…}h°¡Y‹þRûg«ÂmqÔudGÞQSjcÅ;'Fõ`­=°qã8&zö�:-E6ly;�póâü´*€B)üXz¼[®G‰u” •‰ïÉщÇuF2EoÛyG*q0£õ¨ã÷‰ÎCf±Š ÞÊ¡8cÉi…°‡ô¿ i°©#e]- sÁötUà¾PƒXÏzƈ¦ý£}D^®i6ŒÐ)²†ÂuÕö-œê¨ 1Jê‡jR½�[Ãæí@#Vl-nõnÓümš“ ý·ø²!Xí5i‡á÷�´Oqî¾ÌNu ˆ¥“»|[ÈCÉͪøÞ'¯¤^™Æl}ââ×ì} e|û˜j*¬QãB–A2³Þ­]Qã;ϰLŒÁo'lÈÙægœ7¢·pÚê�|ÜûdÜòw�¹æàç_q~ƒ¾Eû×ï4÷2«zÃè»@sYœ'ä²ï,šìªTp,šä둱d¢ Æ H–O+#Õ“`Üö™B¬`ÁÓ{ØöË ’[ÑX‚Áz•­ßdo–dól�m t„wÓ«Ê\ü¬ácñå>/i!5“×wfFZÂ4eG�+7ƒ¯6¦z‹Ü�üF�žìÏHÈÎÉ ÕŒEÊõmb\•Dì­öës¸«ÞB­Êçå9ÌjÙ…ž3\ZbÈbÅò›ÝÌý‰´¤›d ¨©½¹-³�ß™áZÆ·Iг0.­ #ìV8ï«ØâÖAî–ƒç›î]�½Ù�òװ똨gcªS6H\‰õïœß- Vé%’c-�`Èf ±J¡9ÒÏTq˜ `„DAdFÔ¸’) ŒZ.Œ–·knê7¹ë öÌ*"®Ù‰pÖÍÂ[\ÉóÕ‹ š@�cåH1ô'ª‡•{x÷s¸Òô5ÑY@¤ËvöŸ³òñõæ?’çœÎGÜ Kµ¢iüýøÃ_i¹ß‹›â>ö«—ɪ™ï°Vòy8_Zûê׸}ŸDÈ(G^Ú‹ÁCŽOƾæå¡ÿyþèr×Ün;dùVf¹ëï”]ãÎÝ/€¢:ˆªFbŽ@êý_dê¾mïy¶ïcÁÀ–§ˆMÁËå+å_Õæ×OE}¥¹Ë­pwwœl ½ŸŽ q”›$¶Â%’ÔŮҬÇk¼¹œ[pöÔ ÕÉ%•hÊÖÂn°—>b4(‹e/‰X�K'ÐÁrˆÏÕh…•‘!³Ð»+Íý�4M^q57öix·Äð{›|7Öëö“Pï´Óƒã�/ôªp“ìïý妨?Âá¯õŠîªƒ=Á0,•©A1¼xᛎ€F_®?+Fßúr#¶„þžƒsR¸èþŠùxïÑ×~é_4t\ 9�ÝÁ†ñ®11ÒCiðÆ_^ãgÅ)»oE±J®ÆkóðjéCˇv‘w!4ѵ­… V]®s Û@#iò…Î`“½c`�í0eæ­oÜXÅŸ;ý½Io)˹9m§|®0Å�(íËkL­ò•uÁ�“T›@ŒÆZ¢¸™D¥ñÜV' ëù]²à~�î¸gÛðå¦ÑkIöÜR¼o~ß¿ÌßMM‹«q}ÝÈäº×cÜ8ðîÖS>ÝØ®«ã—¤¤Aš’tØ`�INU[Ê,bH8ÊVwdí5ñ¼ý>ršgË·Ð_¶“dâÛ×ã1˜Æ'5c_ƒ5?]ë^ov¾OÂ]­´>e2žË,r݉ òE¯C¹ºmÖ®¬€2ÈÙ^Xˉo †7A*›ï':콺Þ]ëØQÛ©JÍ•/8¾Lq×´�ÖO$éí×äc©ÐróòÆe¡{ý:¨|ë‡ýeö1�"Ø#  â±,ܘæY¤�“zX/ßo·Áz¥±Ä/�á¤m•šÙƼ¦ü¢œ­œ(HU„ÉiŸ+þž6ÊÛ§Ô\}G“ÍÊ~&¦]ŸU«b®\MàGà×ÒiÇÏÜMøðŽTBaZ£0µûx¸MÊ ðú|„‹yl%¬ò’Eofì¤Iâñgã®5?¬Z‘݌ ˆÀo…xL�,7²+�ì3 Hå˶Öéh¹½\ávîP>¥^ä^× ¸Þá’pÙ$¢Î ¤—¤N¥ZÊ�ÇÅžW A¡{ßZ˜0‹14Ƙ2·Ó×.¤«V6¥n�Û� !Ë‚Ýzˆ›X|+ï²W…Õö•Ž<sÛ]«öbæKSÀ"Žo\‡… žùЂŽ)<í³9¸‡ÖMÞáq@¼¤ÖaímžnÐeŠÍX*¯›ØRïqÒœ.p1± daïQÄ0–Žiû}íˆÈì�l7z%†>Ž}˜éžêÙ¢z  >7[¡‰Æ—mfÛG0M3³Æ è¹ %ª.±a…8:UVÐÖlœ¸q+AVÐ'k¶2)™rñ­*¡´c5º4}Vt¦‹x2‚,û�JÖ³:£¨­eG�3¸6húˆç˜®òõ‡�5õ5w«…ªºrdâúö² '~o0*¢á7A!éq]x�ˆV«`Õ•² ²W¶Bß–¯áô5†ÅÌ@¾‘a-“0Œiª,ÈÈàN®#[ÓÉñ3“€ãû}¶â5ù,5˜d›P+jK†Ó³øn†j…»ŠJWìu¢ñ9•%�¢M8 C)ñþxÐÅÎ_ß.æZÝ0î®(÷Ü>Wx³½£ŠýÊæÂL~êé¬Z�F®‘€ú!Rïr_bØÊxx8øÕ»ïŽP*¥Î¯‚ dý€p0uJùM<¼â_·±¬p¶o ×/œpmŽN R+àJ™kõ¥à÷<2�Ÿ© šiSœ )íËzHa ‰V¾'�‡‚îYŸá“}Š7mLk,{EÎ]>rß$�tu¯ÒhS†R-€½/2V¯µË÷Ëe1xÔš¾CÉuĹ #™ºÛØä|ë)�Xi5€Z�B&?%oø£bø6Ú®I)âÇIûkª×#„xºÌÁ­¸‹ 9³ÜèqäŸ.5Ó%öÍÇ3ƒmÚ–ÄéVØ¿¡fd$×£ŒXk¤½¹yꯘ IZ+Çž®¸W×"�pÿ]¹j� s'fò–âÌãF\œ8°×इßqR’sdòx*$Ó@‹6ëXJèsdkãuÒÒŠjÉ ì$>JÙ#ƒÏ¼�¡¤µ‚¨“^§»±¢:’™u¥)QÄ…þ²2aðU¶ÚíÚº7~tL ‰9®¸ûÜ^ªðïe™M)ø=i<çºÃŽOózÔ¥!¦×¶/H3¼ÜA¿Ñ¿v6yÐê"Œm3ǃ�š‹‡µ!UÚµ´y$’¬S´âGïpC•ÁÍkWìœq-•ÄwòE­Ë‚°§—¶Áv°¶ùÉSó9\Bj�ìö4CèNùŸ¡«w_FœºÖm~ú§©±LÖf*jn‹ ]/úÑ\|0bKÃXìžq âÔôÇlͶJ²£s’¸€@g•¹…á¿̶øúuþ¤ev;„¶Ö=]V¹—îâ·ÜðÐþß!µßb®’Ä«–üqÛKfñò°ÜêKe?{Oüîv÷@†Ä¿J¡�¹žD-á8ècâCdËÛEö®ª6MŸÔ–²Ø2ÂÏ8²Å£à¦S²³3F|ËŽš™¼Ðû©¿¢¯Ë`)`BܶڷpXÂ�ÏÚVvå‡"{’ì#óœÙÌŠêûø¶ê&ñyò�œ„ÁÎD@éϬxÔ�éÒ›.7g,¦Î.Ç|·o¸Â¼ý˜Y9öÁôøå—=4Ì=×ë™ì„CÇá8ñ!}ÇÌ´Jݱ©‹˜ã•áw¶4‡{!1Ž"Ø÷§è~•\þïY…Ë•/dØýß%k"ñYŒ‘ŸÊ¸ 4þ™ç§Êæ*“ÎT¤¦ezˆVCµž>Ÿ'MrÁè5p$r]OµFÉql}Üàæ(^Èÿñr‹… ±BÖù¼3øÞ×ZMåûk¾-¿ß»éÏQ’Ô¶Ö @áƒÃØ!2aõ%,`9¦k»Hbÿ£\|†[Þl�›š;Åö®[JÍÔ…^›Êý'"ÇÍ|b3M>¨‹Ž|8äe(#©œK†sq �bÍ]0¬|„spÚvzò6‘§ÂbFÿ1)!ºwÕ_ŽO{/“gðÅl`ï"Í'­0e¥Èö")¿¼V,æß¿VµíVxÝØ"�epÌum-¸j8І®«qlÀHÓc뻣›µÿR® Y9�×/û_B=Yé0˜óë›ÜE`^ÆM-ˆ}hï[²¤í?ŸxÙµ|bÓ4©»öÒ-ΟL2ªpÔDè´¸pèhF¸úKAꚈm’ÌŠcM(�¡½` ªetú%õۛåô LսܩӶµ¨_}ÁЍ¾>S8vl÷ÊwCð@;÷-öF­8u‹qÎÂÔv²–ón…_Wà ¤n÷½-÷Ó[K´Ó4V;ß«(ésí>zež1wc——,ÌîÜ>ÜEλpW� 2˜kABßvöF³A¥w清‘–EgÐâ /±¼ @.îqš ¹&w,�¢“±w�bBâ5FÔKeÚ4Vsú±œPÅìšp9Ö‘Øm”òñª÷4ðÛWz^ò.)8l×=|þý¯';7†ƒ GJJ‚Ý“Œ˜{�—z k€M‹—×ê™�# œÞp�¨�Ê«µõ>æm™Þ¯.Cixͱ“¤I—:†-x0 lÆCœG,×­sô+nöXº6Bö X­—8Š}í”lÀ`½°Ý–ñ* ÌJ �ZŸµa ÿÓ6ùsñCŒ)£f>‰?@bÔYU ÙEÝywj<°øÄvÚ¿Ñ•ÿcçÚg%ïh•9öÔ=]ôH¤¾É]¾×Œ¥w½}‚1â��Ò³y¤¨J®[CVùµ<N±Ø-)7DGch1gXË—Ž�Á˜.Qaš7ºÉÏ ÜÞrJ]ËZ;tÕË™dÁ;sŸqÍõ»ÌÚÁ�Hv.é⫳¦òÀ²½¾·jŽ¡ud@ÇS}äµm{áÒw,1‹�WúQ" ­µÝÿ99àÇÜnËÏrþ]V°ôŠh·æ`ÉȧÍ9 T ä¾剕¨€¢E»rr×mtKF#À‰Ñ:F ÃZ¤;Ä}4‘û&Ö¶\°“4 Ä.N÷p�5Û›ws£u@b\¸q^,¯›ªÛÂXÅ5úP—õ _܇kÅu\ç!°¿´žF $µT‰"Ðk—ìñsc¥+¢&Öµ€^Âî‹É¹ åÌiBsQ9èÝ7NOÉk {;Ý£¥Ó£?¼–œH£,+Šîë�ÒÄB�›<­$ü<4ÜpÁ˜Uš¡Šã¢%u×Sò0ÚÀªž~j\älO†f=5½á=ê×3•Rª„?l!‘U‹nÇ\“ìm4yÄ8'IÌ»½¨‹}¨yÖ¸"Áû”¬ Õü�¦èÍøy v-äs>näŒ(e‹·%ú? ü<ýè‘}•k ½vµŒ—œäî?=E­”϶?mJŽŒŸ�,1Ô´v<}Æ,‡šäèìõŒÊ9%� ”V¹7‡O0Gx²…Ÿ5J›½ÆÉã·&móîÌÝßé½ÂHLíZ~°4vÉ8ÔòÜVç['Ð6=õ»qstñŒðL* Ë…4týbOOj¶á):ð)>�,d7Œú=8†ñ(¶ù/’{’�“�é.n §Üùw8­�X*Ìh~Ÿ¶�Œæ‰üí´æ:†w¯a`v ñÊêÄÜÈ:-0È}ud,´‘¢×K70ÙdóA" zfw=å ·÷8'iüa7ã«ÛEÎÂyH‚fçcñgÔJXú€i1Š÷1k§tˆ×>áêò=b ªî ”AQ¾ÝaM�Lý†¸™%Ñ©k´¢OIjX!-Á9ÍßM`ùÃÜoRx6A!aÈK0å<Øi‹lykJf$lvȽUïoŠS…¬‚0\vV—'`&ÝôWv󲋺ղ�$Ý› ‘Úïó» }ßÒ+�Fþò7·/u—7H».“�O¯‰ øïÜø “-‹/{·#殇Û×Ñl^íb ge¤#•¤Wy„ŠCæqÅ]�qJ­¡£´e»Ro4— $³hzúb:¿\¯ÌÛ„ù›Y¤ÌÝ\©oiû,×–�ČƤ×—ȽÊã��ØÎhO>«ÛìO¶þ÷À‘bá Í]×|Ò78;§ °[N^½ŸÅÛTý”Øø±xÁã7dÛa·Šjù��jz¥7°HØäs@DÎ÷È2—œR!a?a’ oìµ H[ã? ‚¾ÇDæÛéòµëNûÄLè5šL‰o¿½èú×úuœ×GÄC¯®È”µ÷ž#>Â%†˜õÇ^ ½JŽÒ�ìPeÊÆÝËB¢˜C‹-ï™4CÊ.ÚM´ÆŒÖÀó�¶:7Aé ‚`8 çË— ÝXŤ"Ç3ÊqúŸHϬhÊ󈑸“lzåaeN«ðÍ¢¨ò‚àY®²«²sèDp´ ‚oªC\Ó(G9÷­—@M¦ží[ZÚXYÅÙ²Û_p�Bmì5-’rÞæQv¯ÙÏÛÖñf}÷\PT<#É¿§H9ÝÁ|ZñXƒµÕÂßf¿¹'ßñÛYïÇùç‚ÙÖ7g’ëÕ¨8Ýþv§û¡‘-,µªu¢p�lSß¹ÐꨤÓ_$=~tÏö2¿N¥¾>Ý9ñ|¥òÆ~†ý�j]oL‚ö}¾ûÐ$-Ð_f³¦7‹ƒžc—džAl/Û;_TzÚ([Ï€vd° Iã¥åe×N>¸¥ã-UÜmÂ[�‰=ñªD¸\<‹XùkDh'½@°c{ )žÕv�çAÇùO6-ן÷Å4QØTÙ0ãŸ[ÌÈrù¶R¡µN›§g‚ mu¨˜…bü€0·+Ë®®×LøsC+#ä ÷î5›˜‡s2Õù©C†¶I¹§;Éß\U¬ kqÝ× ¿–ÙèÁ¶µ2ü³ˆ s2 Åä F–{­°Z}ÞQóK€ÙíqÄ·SM·´8˜N‘cWè¯9†DÏK †¯ªÆ`߰ޣѲ•eÿ^ž%è=ÿ²¯!q=ÒøþWç#Ÿì   UuïôÞÀ©YLå>/ãÕ�ïw¦ùõw1‘Íc|œì—°ÕlΞ9X’ð›INÆ8±­wЪNãFÚ[þà �­“‹–Íòó„¸�Ä‹Sr v Åð F§ŠIvýÍòZÚ ­/ánì›êH_ÊÛØQ¥›ÎvÔ‘ëMÁ“Uà8Z½ÀÏ«>®õ†PŽµÄš±¥/¼š÷‹�âµÌê¬ôI§w%vá#y-Ì!�,«EN>÷ÛêݲÊI«¨ü ÑG~™Œ—š‹9m‘Ö1B”¹ØÜqÜdžŽ~]—ož ô™•@|*‰¾Ú uõwBÚwç¹òó`@,8ÓW‹fV¯/Áï2 µÈ¬qúQƒÞõ¹e¹m•ÍŠt¶4/Çexo’à÷Ù†[Ź�Èò7\ÅôÅaô¸·y™÷Ö­rÆÁ#‰#”óô¸tH†Ü D_‰Љ\f.›¾Úƒ`Œuÿ5¸nK‚‡þºO€Œ8Â÷ÏUœ1ÉH‚qÌ\=!ë S\rŸà¹‹†ŒZ9§ ™kr±q63³D=3*EÝqc køÌlBÿÛ¿’ 8ºo°ôuanï’ƒŽ¡Üƒ6P<°XKWU…ú Š]mæcÛ4à9ˆ³¡Í‰[»ûpÂÖ ha¿Âg„ÍÀƒÚ£˜¸êÒ{‹] ïötÝCÍÓR Ìê샛lû+¯¸ò|‡Á' ´mìÝy¿#›Êƒ’—Üí”­žP-ÁJØÒ]ZÔ‹ª•…Z£ìù·ö 0ÜlŠ"µ™Å]‹H>`[2ê9ÊÉò¹âð�ÛêeCw¬l_R¹ l.°+Ìë+;C¡µEgùùT™ö!¥¼ÉæÂŠ˜OF’ŠãÑþµ¬ô‘4ÁõT‰¬Í¢b/áûN!Œo3|Æ�GÏseéݺñ¼l^¤9WZR!Ér $›”ÃY §æRı:1ÄuSúÖÍ5uk;„H"˜ßóQ‘r{G޾Èòš;ø‚CzŸ‹5ùå[@¯a‚\VmXš§�í’¸]¡ªŠógŠ:1'=êd¿~JþÄZ`$«¼uÕˆT+¸Þ7ÑíF¾.ñÃç…«~»ü¬ªf’€awÉÑÅ/ß]´o¬µ:³;ðáo¤ê–6ÆÉÚþy¼÷¥VQá&,�?�æïH#¤vò×&Ùƒ=ŠG åm¦‡ð…‹ªâ¸=è¶;¯@VЄ+^ºÁQ(°Wé¡ËîŸ_jýΡCX±á‡WŠsiÊ®¾ 1÷!{‰ H–®ª¬Ùù÷e�ª¬{·¹Ü@3DÁ÷†ùqZ2Sü,w�ñ@R+•Gºõ–Ât¹Ü*øÄᇡQÏ[#±ëj냽’·�fÒUý„lÒY2P§ºSnŒœà.`¾°Mê° áõ‘V¯<^ÅÇQÝð×±u½(âœ*b®w]7é¤7Çuå©–\ktˆlçmÅx:!Ÿ°CßG·wæwž..j‚ù${RÝw¾F§U~=/OŒÞ¨ì×OúJ*Pcݰϥa‘a  Á]ˆUS7ÔˆX/_w*ÞÑI¡ÿ"„·/ƒö°ÄŸÜNŽ.T u Þ1­�ñ¡Š'Z—jù{Þ¾…·ßT<Ϥ×Þ9r\"[�kšêÒL+‡U9†¢ãM‚GØõ]ÚÆW0[9F¡kÙ–O7äÚñ¦•ñ�¥éðú§!ñLAã³åÔ} £Ñ€UÛÛÒÚöÞ$Üã”Ù¸ôhÕÀ¿£¼ŽÊ–8—,÷ÃÇ@ºè;`¢ ¼açP«g8s¨º°ør }êHö?R&,œ2ß ýrüàùXZ:-°ªÎê®ÙÆk=cmjS%à1¸ä„mjðZï²3@&ü·Tòðai(ðÖ.êãiÖ·¹Ñ“_Ï]A`Á=Ì»s±S—;r¯­fKUm%Îêe¦´E-œ¦ÂmO´L’&"&®hÌW°Üjœ� A±�:Øpô¹Ù#tL:a¹*RƒëÏ17ÅYñ˜’ ] ™<èñ·*¹>¦Wx­ƒöýΣ�˜ÅkÁ×ø"›ò˜·xv}.Y³Ž7+1( p…Џ…+Ñ¢8ß©Y`n[­oXÿÀ…Je@öhßñ—îÃ5~ÚÖ‚Ã1ض´ëg·¡ Âò©üF,ÄÂW›•ÆrµÃS¢asg~©]é¡û‰¿‹†ñªÂ»Û¥?9øÞ­ÛÐŽyŒ^]ÈÑþvÅFØrM,�;X~e#[° ðÁ% ׉®nÖ�wäU3Â܈?®l‡®ß=ÈüïH}–˜­†6%Š÷¹�ïåà.Ü äJ÷dtd%O�Ê4þ ÃÇ�µÞ{­ŠµŒÖ6Ä¥àêõtÛÑbÖÇKÕ|‹—8‡¶Wú-û[…X±�3 F•µ>[�Ê_'*5Ò iªzXö¥¾H-{ß"õ7ï¾—¹ÞGþŠò°4?Ý¿?_Ö¬ÓDØ}š³.òi½¾ü×—]f¯f[r¼‡¾sçßY(º›}“ ¥5¼^Pêf´Pq«Ê‰ßžÕNlçôFÓKyÃ[Q­Ñ±0�2„7;˜Ôu­·×gÈ2 «™Ø3·R®{äÛXù¤ÂòòèxQ¼[@ë[žæ…€�‚ÇIÏ“V£·¬¹Êü€hÞãqr’i ç§È6zö ùfF³¹^ϵ¤ÙǶ?“!¬¢åÑ8apªtð•õµÛ7—Ÿ£L ÃéÌ“��ï%w�ËeÓ€G·¨t’´šcÅ÷dï‘NŠ÷Ò¼‰=ü£•M�•ŽJÁ5½¡ôB¸q-ä„Â:·ª—õhÝ“Gt ý˜é õÊfpw$2ñ`Gˤç!ŠëMôõ‹¾µ÷Ô•\ïßZêÇÚÓ&^Úpœ6þ³*H«Xû#{(?²™ƒM�^Åíœ%›½¬Ó&èš�Ò¶S¤HÄo€0 I™:_5‡(ŽyH{ä½ÛWTh¼•»gTPº�FopèFÆ2m{¢;Å&…Þ‘Ôdî­„ÝÕì;=>£ôïQ:)bé{¢ž°ët½î_ñÕÀÆ‹‘Š2˜M¥0,Ø¢ˆ|çËú¹âþXûË¥¯ù{Ñ0²ÎcÔ§~RÂf®7ùƒ¸ù™‚}S¼’¢fÕœ øŠuz–<ŸÏu`]ââÇ1±Qï.¹T`[¨qÏ:S¸í‚Ñ̓gÔ.ˆ“žòûæ8�yØœµ¸n¨³ ‘}ñp¹IôpѪÁä£v]M áœ8CW~æðX4åŽ1ÃHòêþžÚül Zû}½i•Y1Ì;`ߚ᪰ã áØUö¨¥ÍjÛŒð!q u�0ÉqÙ¢»=Ì\ËÏ…2 ‘„†�–ã;I>à.$öî߾̑7 OõÂDHYÎÅFÚEéoçCaÊyîyRù<£U¨èp÷è%à!‹‡ÛL}´Äç¸rú2^`þÙ¤†|�{É}|á¨yLªa+;Y1�×Ñ–øqñŸ�‘æIÄ’ÀŽà÷ôùŒ]þf$ßÝÉéïfo‹Œ<€Ê†<�cV+\õ®Æ”ô« ¤šÅaÌòT”¶@È칊Zg@þ\=1¢®C¿,±Q‰ ˆ ×°Á¿á]ôˆž²å½¤ …º¦÷4Ð/ù“Û_Sõ <¿C×ö!¨‚¾Ù½5ÇéÖþQî7ºÍí äP·¹ÜsüÅqH1@†ßãù~Îj 6/f?ì¿Ù±,)„ÃÈ] ˆ­õõªö·CߊìœA˜©º>zŬ}[ÙÄ[z^×4ÀËî4g÷¯ª º’‰QŸåòbµÀâ$ Ç/ñbºrî¾Ýq¶«©ùk;Å…ô�Ãõ}Äî]Þ±áK§,<Ü(O/øÌžOf ]îHR1ñëmK¼t5z"š¹&çy2ÂÎeS!÷�Ù§Ð,0|ؾ››<í›P垯‡|��œ�õÔ\•®ûÌ^ÜhwMUÆ ;g˪z ˆ¢êÞôúîeí씄ÂÞÇM†óAÇ(æIâä²Ù ÓB»¦½v>+iŠÇ)t”�j\_Ó–â;;|¯—ƒ­ù†Qô;ŽkW¢×´ñ·,ñA…¢ÑeÇQ$ã&4Åau ë/«˜Ë W<ó»h²©ëUÚd}�3ARÞWjYÀ‚`¸†�rÐívhH‚#æ#ÎÍ|_7.µÍ¼­?@ˆ5/5ëçSÇ=ø=Üø&[ºþËíY§¹‹á¸Ïû^å ‘8ŒrÊ��¬ĤŨ8ūÆ�‚¦ö�ÅŸë謑”âêŸm*h@8:>…èúÿã�õ£Ã°Ï»åP5øÓc�qªÄûŽç[3½5:�¹VöÐ3mstä>,B0H8® Ìšþx ·4^;y(çb»}g³Úlî<°¾µår©ò¥sŒ�ÕÅ+\ý™#©òI¬HùNh&ûŸ�5µ#™ÌV°isBZ ¨/b×ø�+¤_ŒC¡[zWVS­9½¶ó¬ìæNÖŽª ·{Û#hï�Ê£eçT´K×}§c‘�â•C¦V6á_Õú½† 4‚Ô§|HüctyTNh– b~YÓJMNè³7»:—­`' Ûæ¦ƒS|å§5‚¥s.&˦©i ŠùcBBú'q2ŸPSÞ¹²¥œ“‚Ó{½ùcBlŽzM­p'nþÆ‚JÅ·Ä=è°¶òP¢W¹mw½Dé=tWÍæq”|Þ1Rð¦ËÕ± ÇNgs¢mãê‡Î³ ǶíÝ­gz½ÌSw5BÈÕÄL&¹çáE?�[|È! ú‰¹<àP¹øK÷<ö›6©`ìÍÜ–úä2ËÒºûS ¾1F3�:0s z{Þ-=ܯš×#?:ÂJ}Ó5˯c}ª�+Õ!ˆÞ²=ß®dzünY…ÒÃψÀŸz}ªô’¡^˜&n;ƒ®g@±Å„Øgv¤±!ñv+ª Æ×‰{Q醴�šM0|Tw¨ê&ñÄÖIxù{ÙaØ®3Và�ñz† "y•§­v°ì<·²é«a×Û*rh³†â9 ’1áÞ7šs…§}Iè˜MW-–^f1ëNÂî7á`ôÔú‹_µw¸•uYl ‘6*ZsǪþ]6a/f/x÷m‰{·%‰}ÞÁª„¿5úEÔfT¸†1wsÍ©CÒ ØBXj]4a±éY¬Y¬ x­€œ‘ç‰áõ‡g‰äиŠú zÖpöñÇÀ<ë^]�ò¥sæ]ûùœt82ÏO¨½Ó ¯�g² •†�7C�ı\ù{«[6]I†›N±!ªòí ŸDÎã tuœ@?˜Ø‰WÚF÷¹4ŠÀ‘ªr¾u-!LA‚~­xàN AW ðÁ®Äl¦!Œû5Å`¥LýÐò1ê{i.yK{á ë~%²šƒ ÝOÖêæ+YåÏňÂOœ m®ÿ§c9x±‰)m&zæ1Ÿ%OJð)�ÓòÅÈåïW>h‘³Š—æ[CLÐ>ò>Æq¸é`vf†#Ï{ñD†TZ¹ñ ë·é ©å móç�7�©‘dC6Ùò®šH>ƒ'uÉ �_»Iü×ltß�»ªŽv)ÂÜi¹k¶f¾œ¹]˜ÄÞ™û�$ú·ŒS=Ò@$€°¬6ß:‰<�-a¬ Ì`”ÂÙ •¯w½¾V¸ `ë°®)‚: žÓ:��†§ 6ð›Xg¿}Yó Ætn%}Æx™û¯ ÇOùýû<ÅRý`ñ¨Ábg“"É4&éÖƒhwÈ^Û7R€™|±¼ (•Q퇑,¶…òa¾]_u‹úîûôk•­³.—˜³3×w«ââ¢Î5ýò(#8÷V¤ý%ܵ„„f‡‚B·ë“p”Gæ¾ÅÞŽP†P˜âž&�›oYS�iÖNRþ]ÊÚU[’B\˜Áo§8®XqYfÑkì^Þ"gp~¾Œ§œ5—<>œïJm×® 'WwÄVë€Ù›±‡7)¦0Üžj\ÉíÉUHòý[>ù1nû])ùx|ËHx­ñýg5o7|ß$ºÖWp´ÎšY`„è­R¦Â¶2íQ% >™mŒ_ð;Èt½”Ï=)�˪V'fc{ e0N{1à¯`:3È›¢ 93Šâ`�‘O„¡a¬bª*5«Í^´‡â*µòœ'5„[ …ù#]¶ôØ•WHWîi•û…“öš�Ýw@`ôQiÆgØÞEï YºNÉõÞ¯tû€xªÂˆï¯6)üøûß›®È€�ûÜᑇÉîjÓÛP²–Ñ`¡�<Á53|:Ã}òýÁêݧƒ?] /2‰ª)3 k`ÐòpE€.ÚÁˆuµ]<¹ÈU^�óêú¡¦(q~júñ�RÍHÜšÙÝ �³áÞôb>fh߸G°XÂM›DwØ8œ•cǬúÙÁ3<3:.ílæ$ [`t+üΛ3¬ƒ@(xùÕºÁ+í{¯ˆ!I16ýá‹6ynY/_Q/Ðö5lH1ýª!.Œá (N6Åä5Zœí5Ôr/k/-´(SÃë@µŒ¡ç†¸ˆëØÈ ™]fÚ>öm{}ë9LíîΣHœc3pf‰°Üt�ƒÐÀûÌýÿgó÷†ùõžÖ,0ƒô°!êÇ`9e»zqÊ3]Úy3ŠN.yga„Á=‹˜h7yØ ¿±†pÎ?Â9¶jÌÓl­vä�H{»OlKŽw |Œ,�çOtø1“:ÂâÌL$æ ̦up 3Æ\¬�¯˜Ï9IÔCïçkÎÁ£Q~+|²Tða™’‰© :Ê‘qe�Ó!@\1<ºãïbÀ�Þ¬×Ùý{±§]îî9×ÍÊÒn2–÷êTgÙ$¿/ì Áãm”»‰ø%Æ_ÃÝAÚB¤0uË{Ý%ÅIc3“c-ï®Ö`óWVXõ½V/&+{5]5¼·j^ƸeÖIC†ŠÙ²T³™žœeŽ{-¼^‹]³ÅòÃ_\›Ÿ6YüÙOŸl—$À— ¯ŸÞH× 4�þUçzwð–VB‹8¨Ü½¦ÄìéˆÄúÉË�ª™c¼ÔPr¾4ë7wËÞª3c΋.äøìc…ÊÙ4P¿*âÒÍ£¸2w¹mR¢Ãý–Äõ®(Pk@m++Óç¤Î>luÐRìX$RÃf�¯D¡Î^8wùîÒvPëé¶\ݤp€cM‹Æ¬æ¸.*»ƒª7{ˆŸ^’ú­+bôË7ä!耇 pÖøânÜø€};ïX÷’¾÷ãcxÑ÷zÖÊÿªlÐBVóvž±f1S¯Ê¬YêÊ3�Ö„$Ým×µßÁ_YO]÷[t#�—±ßúι ßÄ5†�å0{ ³š’C—’'¥ª€SOrNáüiƒmVoîÑïÎÚv’ÌWw]Òa¶ZHÅ›õÍ”5 c�êî’Ѳ«¶h}ž®òµ�qß©ÙåØ —^åoÓ„jÿ.…© ¶T<…À•ažÜuóˆãU=~©½=GÑõÞ2—͈>XŽ@�(>ƒ×Fb°­Û™»|ºK ýØ‘µð|nÖvQIœžŸËyu±t¡†Œ,¬�šßlV/ÕÝBa�ùmŽúr{•⦨×KÌæ«¯yhÑÀsbp ûÁeãn]ÃËvmžRç  „ þ@ `ð€ sxÆM¸F1ËìÔ{iÃ-(JAÀ« ìJ¬$yêVg(oáêʼ ,÷ômËtkÞòÇCùÚýn¶#x7+\C™´áó’¶Û>cÍòî¶ô|dÐÑœØôÇ�îá±cCQ>g ¸ðCñ�³cU0‹½ë�mÌ¿ wv0ÁÒ×íXdYBÜÖ&Õ’Á‰ —ó{9+ˆ˜`°/¯ÞqM¦v o*fð�ò»–6 nqÐ�$z,¹–‡ß-±_ÊYü—*á_©ì@üR'·Â^Ûk·Ÿ‹ÙH‰‹\4¦·“—§�§YÛ2us ÖHPü÷¸kz*åœZGudCóù<ˆY€û½~âó†aßÒóœüØ>©ËÚäÔ’ €øõ×Y™ãž†gÚÔjªÍš·ˆ¾LìÙÙvd=ÅÛl¡|PèâêÉ+QŽô홲؃óŸØ³Kv/,r•nn”¢Š¿0Cçy5G³ß1–Àj½´M÷Þ¬µsê¢ègémÉV‰@Si¯ÆÖÃ0‡áöI-©Üf‘ðGûsuíÓ×ø7¦ë/nTA²KÀGv‚Cò•�ß"#É¢úI.œó×ïfûû� vª«(6÷£Á+ZÞÉÝÇAâ{£b‰‡”õô¶Ì{5âÕ*H/¢\3Mo‡97¡\BÙÍÑIF ¥ß›!‹H&f�‰PлJ¯Á};a—è#=Äsƒ¼m$?u5ÕãI¢&û{!P’åÐBÞêÈYe¤oÜ»FPBø8Á¬Àá7¼q%ƒãÎ)ÿG{ÐÔx;Žk†—,Ys×—…ýAKgtßžJÖ{¨C‡wº5MA2ãwӾéÌ*]6T±²ûI¢qLlã£W…±°CZ—å™õòáQ;;QÏ=�`:©äÊsàáy…Ĩš+ÅÔWš®Ž¦Ø °¨hÅG¹õ®¿wvíE‹ßºi—·–„ø«š|plÜ!�/§­sÕïN yα `¦q<íër‹8~�õ)ëD“§;8Áîì턱Áwsð$ýôqÏmŠö5Ý7/nLJ‰ZdX�d±=Þí}Ú¢À'Tç5ÆÚWÛpø×_˜À{Û–[H\íi«ö(uÝ·í½Ò9–6u›jõYYÝúw’úºü…mÛK¨s8xSûjh5¡çŽqeÄ�WöSh?L½üdãXMRio—÷ïDx@Fío“[� E]ëÆÜ’Õ+•ÐýËù ¯ùêØ)�Kj~Å…›�…TÙ.»'ÉE éÈ÷Úêg€¨¼ËeÉåÔ-‹`DS¨n£2fQ ëÆ2þL}Ò «5¢»nûXç62ÖŸ‘¥2${wÂ�êð$ʹ‡Æ }¢Ò× ‚™|jÂ�{­ºùÒîé*ôÀöž×…�qÞ(²ã·â ÷Ë)’ðÍoí‘õÂøÂ /¢¾ÇvÒf -Ì94k¹ŸÝ¤Ýù Òhá¢å�Äò6÷ˆ¦2=M/Z>;jx`ƒBÕÿ§*Å¡°ËÙq Ðx{<|28ô^ÚŶöÖïg›j-—¥ ×ð~ J¬‡ßiÒ¼¸}e 4ÞPòÆ5¯DÝó"þ9­-û~ö“"k[æ5üBD@-¨®µ¦ñsF¦7Ó6‘9\K �,t‘×à›0'rÀ<ºÞ/9tÓ´’Ø,åÝ ¨�c¦º `.¶„ÝšZÔ÷j„¾p$lv°¨»Å†y—Õ�0ÎÉ9w6óMLúöO…��9\ßHßglHoÁ²|å %ó”£9¦N…©?& ìܲÀr£<ËlÙæGZ\F__¯?zÍ%x= —`óÁq‡Ñ8«ìM7¥ƒe0ÔpêÊÈ‘5»!JF)4%ð:ƒkܰx­{ùƒ)x[Ù'tù°r-B[½ÙQ““^":ÈZ®Y4s<Dw†Ù^œI UlKaš1�Òô†LÂHUò°VbZø–?~1Þ¡-DSÙ€Þm6g& poc øƒÑ:$@8Æú×%ñóž}’ôø'ž,ê}3m¸u>?Ï"nß6ÁA6û¬ü‚|øîÄ–opù%Ë_ÉÕkÇ»9Z! 9×ZÎ�û®“�¹ú–€×¤O•9Hûêzç{pkÜç?U¦g[ÞMè-óă@C–~ÿ¸zþÍl$ˆNÿ‘”úA *yG ½´|·õ¸Ö#?ëÅD5’ͰÍy"Ü:¡†¬c‰š¯JrÚÛž…Põñëd�y[�Pð†kªä©´®±œ‹r0w XËYú5råÙ,�grÀ8˜Œ´@ïEÀl–½8y” `Œ_5+*ý÷cj~°�R®ù�&ŒÍ¸ äçŸD^çõ'3+¶øƒ5pÖ†¼A•Ýö˜ÂbÄAêQÀñŠB@°YÒ;€€§ ­‚ÜÙPÜå>½ßÞ0¶ Û ;á¾U¥ë«ñ1‰ˆLǸ½±0ïzzF5®ó0BöÆ™.OÛs|h£BÕ û¿ò]é~ï…ã5"ƒV7B×÷×é5Á±®Q-ŒXèûø£øk:¹Ú÷²¾n˜�}Àîüê´ÿ(%z­¯;iº¾2𸵄1¹rºÉÝõ:Ht‡‚±ïn ¹:Ä)Yøäî¨Ñ»:ߪ¥;mM`EÕ±)íö×J�Ó·ÜŽÞAG¸¡õØ%Œ‹˜<�kÙûM©él°HÍöñ2«Ý6zmè¡]heJM¬ø{1dÁ2yG‡¯µ­‹Î$³k6Æ2VHµÙ €P¾�õɈ �|Æ7qkVòð¨c=¿_±¥>5yúâçO‡¹7µ´ç6·×PªÒ(tÕW§�{y§½èK{`t¼+/Òî^íÃÀÜ S[yTØÛ%ÔÏ‹>‘½÷É•‹ î½4ôð8V÷c 9±1ë­zs=Ày¡zê'¡i0ÎN=hÒ:ZE‹ÊF®ë¦£Õ“Zs<üÛ³A;æ®3¹áÇ.ìZ¢¨•$ÃߎÛZ =ÍrØj¥˜pcçõðDV¼ƒMô”Ót–(ý#-ý-n/ñ%ìÔžJl_ÉåF’xøK„!Í0mK]×óª™w�1@|д8“¹O`L¯oÓd7x«Î%±C;X±©Ð(�k¬)wBÁÎ/Ãé's³•ï÷¦;êà™ðú ºØ² 6@¡o½»{R]yÏÕ)^â‹–\Ú(IA|3pçý™µù´°*ÿy{³Øs·æ4ŠïàiöÀ�]M¨å™˜w[�%r B6EXÀGÓ¼pO©‡0‚SÈ7W½¶>Wà�Å´li Ñyô=tÖ›„ ¢Ë(¯)\±Ø`Á…�îÒ ñtê¤Û‰;þ1ÝfåÎ)Šu:bÓÂQíØŽÕ±ãXµÙe�%ddìÄWÕlxË!¶CÑv4„éZk[ûÚ\Ì´˜d#ª“cfáÍ5.™”XŒZq©m`÷lÐï?žƒît¹zÎÁ-óìsë.›h$'Þ‡äÙt©qÛx‚È£l”€…tc\=6ÚæÒj— N¢ÒõX6{q³„3À³Œ]³ �ªs-`´¿ôlÓ^–÷êëÐwÅQmÑÈ9ß~ÏœkTð’;¯9£ËƇjXfù�ÍE¬EÝÖÞù%|VT<Þ|¸Û‰@ïë=“uëZ[2y U_cW¸égÎí�îÕ]ÞGC|AÓØH¯ŠÑë:y6§Þiüúf©`L;s8Kã’Y埊ÿ?NÙ³Œw€ ¾ƒr»Öê+tvÜÛ&~Ù[‰×|6C·ÁŠâa«mçÖwxÅŶy„ùò|¸øLgE™ì-f^H ?Çi0³Ó‰z:ý gA©,m²Ûµéÿ„#ç{8orDí¢Ž`n§Èl|8G/=µŒ`°;hZ s Ù8jM'Ÿ…6qJÇØÔ Ø¤6f¹ò&†Á�f¶Q´øHî±íð“zÜHv»‹-Ò\ùÛ›;òŽk$<&[/7¾”rrý1Tgîɳ½ï4«*X‹g¥9ÂÇg5ä#«Í߱周Ô\ 4æë‡ºUYtQ»^»šëKÅ5ž‰ç» %͓̦ç¿ Xº 1›ïÏ-Wtµx1€ÚÓÏŒ"¤S®pÜ]ÜTYÍoøqÉpÃ|'}¥ž~|ý¾Ÿ#Î`kfE�á¦<Ïß0.UÙ®f‰õ.H–¢ö¯{#€ÊíïªÞg2œîíÞ«ò‹Þ!ò¼võCÒ‚0ÆÊ:)Œ±êžj#óõçç}åú³÷ÞbØäz4@ÊYmíœOÅ4…Øš’àŽ 2«³w»Xnðz:h�oN¿c�ógf½´ÔT…5m×­ÍgUº‹€"èD�ÂD@<�b¼ß™›×¼{^ã¯j}–ï‘(ð¿;Cý“U=žT/mÖ‹�tÕ`c»Ýg­Q ûað8)2²•J)±øÀmZÒ åØLI6Ð�#x,�Çz“”¹æžIcC Û­úìh†û¸ØB:[“Éþ^Éd¯›”³¾†!FX’/¬)$ÕúqµãŠÄŠ£;Ù�\´wɹÚÝQ¸;zØz¶„Û¸¨ôÄŒø¸¨b¿›È&°ÏP¢1ybÅeå.GÆ×,-a¤`\Ãc«ãÈ‹²æé6ßjèɽ Ö8Ma4aV`=T7d2‰so'fF.éµé5 ´°JœM¸!ÛS…SÎÈ:,DN¨aÁ0w»Ì\±¼©€çwËlž ³¬¹Þ�›X~Á;³L­Ý€L½m^Ì6Ùûia(Û—­ÕìxÖõþ¡ø+vE×IçåyAøÁR@PRå] ¬wlã©™L±ìJoL_ä5ÌßÍ×ÀDž­Ù[ ä¬ù¹Ê>gé0‹×ºþ·7�Ö‚yeæ™[a·^âlÔÕ½ilxcÀ#º\RHó²{~—’qõŸ1¿zÁwŠd«XÍ{Ìbƒ©¾Ø€z*[Ÿ¥@5}8¦O �úöîÐ ¹ý{×ÀÍ Í™»\�!P¸Ö4üØQ뙸ë7©m‹\*¥ßÜ„ÿ›£)‚Ê>L:Cšå0εýÝÇt@¬€wGÐ…Ç׋ÃGÄÖÀN#nx]â»Êzƒ¹+Zèz)¢N½c¨QëïGײçûuŠ$jÏ~põÖÜæw‹Iòs�Ú~6-�@Üï"ba2ã<|v(Vãmë6‚¸r4s³ÈUż:¦‹µÅ€±‡ CÞ‹-0XåX)"ÛËLÎ3o4Ws]}°ZÖ+ˆ–ƒÕÖˆêé×å>7õ£ÓË=£íÝ%ý§š—-?ŒUqnþç ¾ùXCNFí¶ÌîAŸñ†•ê8çëÊS¾>�/ƒÉ6áïuWw�µÅi >pÕ½‰ùýlÖý¦´~ðoÐ[g Qâ'9Æ.c®Ôå~œžÂot†.2æmµwfQî[S8 í¬«=…�1ÛG¤ªyÖ!Ö×ÍÍ³ŽœÁe�I·3+®p‰8aI•-Æ\-·/v¸ÖMžÒ.³{‡/œÜinOïpò÷ž±�˜ø)œX€µÂ¸ÕédÇ�pϘ½•-×+wY~X0BÚî×èãzʶ5/š1- ÆI�m,CŠoÀG{ÉQ£¶A!ã¸òò±fŒ’«?t“¨dG3åýŸ·<ŒøÉûûw Äyy(}\ÂGà òçä«¥ù�FÛ`;:\¨ºBãUwÈg ›3L’¾FêNIßoЉ»Uü¹Æ�NAÚ";^³Vó”j\ºsïf‹M��¢¯n>ü^Äýtà;®K)%¤ëαÓ)?!"Áê½�&ö;Ýlƒ#úÞ¼v 9z[KÚɪAµÞ�X—G�N�éu?Ž¡ ;)Y�VâÚ!ƒ<ªÛͰÀ ‚Äžš ˜-sLŸ<6øeøÉö3¤6Á¸‘„ÅôPÄBÅ¡ViûÛ¼ðïBî/}{ž`“uúÉŠ œ“ ë(SØÏ€ûŰv“ m¢ÎúÝöÏ(1o¹Ìƒs]3gY Õó¿v·ì^®á�TgÜov/¸”ˆ~ä&5c€¿Š:Ax4|oV…�ãžÛß#íÂnè*›…Ñ´òº\4­ð—­žÉÇ Ý×U�Fp�¾oo)‘ …H·� ªèƒ(/£¹Þïê›— síîW¸öÁær›M›à lBþ ÖI²þù>ÏìB'>–dºAGÒßZŸµÂ Q7Ÿ«vòÛKløâ@¹À¬óÁA°ã†u»ÿî<Í _VJzûߊ™v‚ïÀu–‚¯P9dÅ:S½Ô7ºKÙ˜Žû€°lD‹qsÅ3¸3m#DZâ2°í4ˆ27Īs+d1k!±•ص·tEͧ³1ÍÐa‚0ú¶sGwUÖ»Þ@Ìl­—{?R6ÏØüð7Ӿ̋Ç'yŽõí¦Ç#)ÁŒ…»| JhÄ£.× Ãk«ÅÚÝyÏ‚Z�ãæßÐK°ØüA¦µ¸sÇÕNKpF]Fî}«òB¯–à ÛMw>*¯oÛå´»«=‰ODÄ2±ïèßÛ÷z²áG´,a”Él€ùéSˆ»ÃÐì¬ ƒn]ÍÁÒÔá/�V/" vD@læ,¼6‰ï/ku·ÂåÚD[˜—ïqMYRÉI=2vМæŸÐÛ¯œ‡NÈ—ßža/¢dèSoºÒƒM»8;QÖJ¼ûd¬ÛÒ+@á»lˆÑ("åÑÇ©xJœn&òö”ø|™<õÛø›wäar;\&Mìr9Žº"'¶š…=sû�žG¡øMrÄÇ$9‹åv£bºZ•#<ë&ë�ó壺Ó6”ûµmTš»Nâ’án?•«–ÍÖ0Œ{¿ìf—’㘂ÝíîžáÄ,ÅkÉŸ#²3-1†Ymܵƒ G Øñ×gg£…±‡¡Ï’®Liƒ–öË2C"žfîI0½‰`î0‡ÈH»äþ`.ÛÇ듉¡ù ʰhs€Üo‹g\œôR�›$³™e™t!‹œÕd'W- lÏãŽî¸�l5T ñÑ>ág¼Í!åu›jñxQؔ͟Ţh>0EdÉ’zZ~TQ&µÕ«Ý¿„7d#Žá"å~»±(œx ðO>9-\4 É©Ïä«%J¿ó[ì(�Æ@“¾ê/Ue É~d·‡ºÜóÌå!"óH¿ªdut׊’N©W ÄÚµ@�È‚• v;ÍâG·wíK?ñ⎭Ï1¯1´Œ´/Ž`‡GZ¹|¶i85ªWylÐHpz Xµ“ÎV1EZ¡�žÄçܲÈïy}±E}^nþ-Á;„Ý€ñªå›Õ÷Ý×Z0ÑÜŽ>°5¬]�«óµ¼9{},Zï€%Gf¶ßjmA„¤_¿d€úºÚÖV+HM½fpÝ[a ´ÇØ+Æ 0€… šo«Õ2. 4ü|ñtÀy—£fË9§ã£àáw%øÄ]6 ؽµÜ©aÚÝ×ãñ¸—Œ!‘é¢÷²ò8½·Äû®””Œñª5¦j´ëÀ¢èdêwµ³@!6ZýXæ;½îšZÖ> Ç'”mxä@+¿|o> ¾›Yâl²Cî—Ë›§yrèÞ²Þ’})†A âÑ™÷�wÉ�‚‡³ôgïÊØïó²÷­Ü´Œ4„¢äÃk»¥mîª'gÑz^û›Þd%[80j6gF¹k™ÂµØÕy7éeJŠÏs~ô‰zÜŽi´ßºOâo·Ø��ôÆ ]Á iÌI|¿Œ¹ákòL1 ’‘àã5 ‘.™=ƒ¥0£ ÉíZësN-c š¿I׫@e¦w•騜ÎQ“v‹£‹dîŒÄJu×ZR†r ׫¬"æ8{…dP¬¼—]Žð=»ÛaëV6F˜–-žÝÜ^Á] ŠvŠã�c|3 áó*ý°Õö•Ų…Ê:–kã$½éÆic\tQÚáH,/OnÄy=†­QÍ_í0bùhöä‡<ìMYìΫ™’®¿žîîDzÐf›mèY&æ)ãx_ ب"7æz³–»´™z(ñÝÝû-¿{¸–Ïiá/ÏÖ·dÆ ð›?3ãYmºëÞ?µ[D@BÊ]ÃOSlÍ ;>òSÝyÄ¬ŽŽÜßy°Ùr(ŒÀòHHÒánG�Õ¹J�€Ê%»°§¸NÚöb3½ç*˜M>‰¬³šÃV Oò YM®ó¸æ§ÃHC2 ˆä×ÑËfÌŸX�=Ë6CÈKS¢}†BQ³�vÉÌ+I ·0Gz¨mÞ09[©v=dù€¼,Þ°¦sßYé =¸+û§Yð}ŽnlTðkcBC¤ä‘í iðe—V¬]BçÒÆ)Løƒå×ÕØ@ûy ô³žön};%Œµ–§h$ä3ð­6‚œ»†/óý{Þe¹Í2�é¾Ëö;&�*‹Ï6ÐX²êÊ €±Óãz©_�qÚ‡•|ºÎŽðÍ‹è»Ùˆ4ò1ñ£sŽ¥CÁÃ�p1F†ç�©ð˜ ZIO_µ¹-ÛiX3…3Iaò“5±z@°é -t2•#‚ù%7•ÞêŸúR|­�º�R<‹<:uÃTAÞð·[£Õ}ž·¹c èšÝë—Š˜„¾¸÷Rö†ü 7 b¬xˆÄÚu4bNm„‹cÐRú*ý®ïSY¢ïbþºkëmð_™ššR%‡}ü€ZM ¨SÝÆŽ˜ÑNë�^¶ø¡«.ª’{%Tþœa…ò×å5Îã)¶M¤‡Ea‹J=V.aCÎ[y^…—&M’ ~«[Dã/Jø¿…žµð\Ûrn6À[æ3ö¥¦\�§a�pÜyÒŠÛY5ˆ“Qhéó~f/Ö”¡åÂdo,Lzý`ÐOIyÐ*Km17Å^á@/É– Ay»­Uª,— ‹¦�|jxWÛá~¿ºÔ­'8Õ•Ë–¬ÙÖ;öZ©ú«�÷žæ–ÒÚ¼z2²�“Mè·ýŇ²ß¼?ƒi¾Í*ƒ´4 ¯Á;¯ªô2Ɇøõh¶±X çÐ5wMR.j],8àcvÊOÑí„¡zÜ À•…5žµøà:¢Y9$ÁrL8öØûzfß0{žÉž‘T«NÒG”|úˆ)^²gÕ� ˜x‘°¥üûùÀÁî+êR>c°õ jåi"’ è³*ß’©nÑkóT*Ûª”ëmä OQ¦ŒÂ§ 9ž…uC*mí¦ÔZ›9Ë®k­ëßÑíëÃÁÀõ{{m�õc-T”Û\”ò2™Ò”®ì ¥¸ðm4 …[É-ªôJ;Þ§-@þ íf, AÿnG¢´@дŽ3‡Ñú[ÈÀ4~æ˜Ô`8Ƭ0�JoÏ>ÑZä™äÕû¥`÷_ì(®±1¶é6Ó’yu:­ž“Ò;sý,Fø•A_ l7£]Ræê·ÂT4á8–Á° /„©s[i_ùÆ] wÌç@V"¯†nýRò,rlK‡¶Ê| æ '4÷O{é$ÉZºv-Get#Öš3G^<(ÙÃÁé2C1ÕµÊxFêBØ@Gb7:4ZàÂéa7µ!wG€„œÇqÁØ:ÄX©”ä=�,bÜÊc|ÏÀ%amÇïDqEñöjѾ‹Ó€ï­ÇÛu¹ì¬G{òkÝ64ÐvC6ÌÀ81ÓT)@¼Jµ´gówvÎ Eã¹,M:V²w¶�K|Þ²»|sñb«�Myµ¤�œÞt´¬Üð3|¿{ëýŠ¡ õÂ�¨86ÉÙ0NÚÕ†K@«_?™Óc’è·¾~5óiçÛßÞï9îs…~ óE�Ò£/õœéÛ�šþŸµ¸šÚ=ÆVÿªÿ^üÖ8÷z4ÉF*Ì<IûÇç Ŭ®†’a”96µC¹0²\XjÉ�έü를: ØD B&ÁpÜ=wi¶pVÍW}¥ë5ü¹XîÊŽ¸B‹¤jw²S n£»^ÜÀbDuo®ÖÅv1Øl2…Ü}ÔexáÜå]D k¤·$U†+^ ü¨o'GÜþ¤@ù,0¯CxÒ5JÌÀ,wzÀðã $°EwƒËZȈ³9°d-g,`½Fú³ ;hÃ%‹-€š¿´Ÿ8Z/øû/}ˆW¶íc2Ÿ'—ŒKèãñoïµC‡ÌN,üõl~Ýæ>½€ÄË�û‚¦S¡»êõ÷ãó×wq[­XÉ]+ëÒdnü^öêFňd…À{â=0jëqL†12½Á9(iËâêON+‰gµˆü~Þ”ࡈ£¤ßݨL½U·‹¿U B¶§zè}Ö�ïšÉÆ3)ÛãS¾,éóár“Ù`q‚Èô–øBîÚM¶Ey˜¶�]¡mv]RÄÐG®2m]ÊvÛjœÌÒÐ’? ÂõH˜\”‘ ÎìŒ�DF+:àgÏtÝ�Dí£»ÒùëæÚ9ý  ,oÚ„($¡ �€ íjôd¡@ ×î­eê Zø¥°Ì/—_+æqu`5ñ‘:g‡µilÊÕé>åhˆù&�Îîîƒ;Å™g©@Ý^•*ÿ¿ìÏj1£¶(�n4¶(Ÿ®»‚¿nŸó·sõbÑžÕ©€_ –ÞÚéi�Æ—9éå¦Ë†ÂŠÞÞý}ÕÉø,kq¸)_ô©Þ–¯Ç� Ry|ñ²Ü#¶´ÐV½¦Þ^GÜÇŒIOË^&C\ã-çM”óŒß§“»Ò†ÂÍ¥™Ý%õd¡´èñ‚ᚥ ÐÎ¥ šù=žlw P qåìïŸ÷UŸÍhÚés±”#óÌÛ·ûi½täpØÝÅK`È?D€ÁQO†?ľjy:Ê> °kçÎÔÄ;¦Œà�üû;°,ž¯ðß¶_± ûsÉ ¬ë ¹lý-¯oçrΓYv5—-}ªÕ(QÀ¨kÞ»@îµjÎ^à7´ä¤þÄñ˜†ŽÓÐ´â¾øí!è¿ÛmÇæôì«Ð€:Â$§»W9ó¾ÝÇæœº°}ÐÌ%�.Þóè�³|çã· +Jƒ»¦*ÖÅÙX�±h)Ü}˜Þ!¯Ë¼Ì‹< ô±Å~™S€Ú5›möA`}Ù[E�ó˜<à:¿�8�‘ú­C‡1Ï|*4y?ôÖe7ü@j‘/ ªísïƒIa3§t̳é IÅå7D9|x Ÿ“wO„ílóɪÁmp\›ó­·óï%6ÒžÍòM¬a&W¢k‡4…'Ã�jZÓG¢eÙeß–Ìq-"�á¾aPÇÖË�tÖùNÀØ€}�a:>䣢çA½‹§?nóx1îµ~mL=ãvË6d²ÜM=SýgÝz{”r nDX¾n°ý«�WZÔ÷Ž— ³6j™¬ä„`wBËo¦}¥ãÓã·…HË?Ñ|Aô(ÔÂâ™°g•£S y`@Ò´ Ó㲎OmŸ›À&µìl%†1‚ ‹”HŽYpàÆfÿG[役ʢVÔV1ƒH+(œ®ð“ãµi5e™ÄÚÏõƒZ÷zÝä ÓœÝc¶°OøAá¹´Þc�º³òUˆÔÖ„h½{â� ƒGNK¾[±H«øm:Í…,ŰÏh�ö<;¹~¥àcˆ[Ü»–åûXP°‡y�Y»¡*t®ôg¨øýF¶�Àj¡€Õ¹œû¤y|žq—ÄévØ£1ÖâF]̾¹AÊô# «z°çÖ¦©œÒzä·Ž$!¼—„‰@ømÖÈw™æ¹ ':¡�ß­ ¿uÅõ{U:ñ5wÂБ[7—€ -ùç”Ä^ÝK4÷$>Väö/æùþ_d:·ÜÌNÝ„:ü1ÝÎ]›«äÓ‚Ù˜ÛäÝóé­®ž�B/‡Ûðì>�PåcŽÀo†âF¼³i3²ä~ �ÛwêkmŠ;VqH ì8ô~lñ—w‡´Üîk’Ç2‡‡S¥ŒÉ~ê W…õ×× w´›Ò…²k-ŒQMÕgZ?�–©—© êf3ôã<™ÏNàÁ¬X~ØFób}l–K£í/sÌI�yS× W_º°Ûæ’P"ô§ûW_½Í¼<ÈZ\,5Ç[&�¨,À:{Fʹý]Œ±{­Íëh Ð?¹à® Ô2ù%œ¢+îa9d¯³“úáâÕ³¦µ áN¶½gÑ#hÙ¯H«ýÍk%q—“j\�µ·YhiæŸÎ�çaˆ»uZa£|³ã%õk’ÿ_4½iõ¬±ø�ÓV°„/×nƒ?ŸÏÛ Ðç�sf`á¶×°d†l®7#»÷ç£ÑÓ ÛBââkkZÅàodÄ`}c¾ðŽi8 FN!3ˆˆŽl‘ëG¤?…°�Ÿ=×?s7Yýzªf–÷÷4Q‹ö·Ê{¿JÊ7ÐÇÏ�ü:®ëAãÍ’.¼k–Ó˜11 ØÏl©YXÜ>J§‹ ó æ¹±Ëæ<±WSô*÷,Œ=úɱ …bÙ]pWvEºk½Ë�a¾ï[vm©R×p­4@ö ï_Ç9—Ë»‰•áèþ[cì–ÍÂò^´†ŒíŠâß>Y—jÝ^ß0ˆ�Dÿâÿ$@P€ %B�•ú ÿñw$S… ŽÞC`mhcflurry-2.3.6/test/data/multiallelic_ms.benchmark1.csv.bz2000066400000000000000000074344541525677230600240710ustar00rootroot00000000000000BZh91AY&SY+sÕ5ÝÂ_€}�@ÿð?ÿÿð®gÜaS|‘|}"”>” Ñ¢€ @tªÐb( @@ð0èsàôöÀp 5¥ôÒ�°@…zƒ’ºžƒ­@‡¡ºÀ×G¼ÊPähÐrpeëtÕ)äpGU¦FFƒZ>÷ÎôáϧÑÒ‡@=Pd:h @@ë×½£ˆú£tNŠ4�5AÓ@èÓXk:(€€Ó] (ëL€Pç%´ 5ƒ@]º Ù×v9 [�Ó§HÐÝ·Af€tCHp…$t  HYÒVr®Ò¨w09P.ÁÐq1‚ªª‚…#ëÞIã¶îÀ\€ èB�Ü:šîŽR‹[S» –Ú4 Q@¤†ÛN‡\ÉôÁ ¶¢€[4P¦à Ðt;™Ð Ð�§N…ΩÅ( ÐØvY£ ²Ý�º( @t-€K@­°‚U ·V;¹ÒÅ[l ÜÀ€]l3]À”î Ø 9P:5Jw` ØhÐ0íiB΀(¨l[UlZ:@èÖ€™¨Ž™ &š EAˆP©€@”I$óSTÈ@§“ ©BLP1@ž „H’žJiúz*1ÐIê•I�CA¦ž“&‡¨h"‚II¦j4SC@ÿoèÿç DCð%Ñ'ìÿŸü™ÿ#ñ@ò?ÈBŒï6¼«Æzøíé{}¯—J´6œì®Ýœ2%Jì¡Fš4¦uÇI4Š ¢ˆšS2šê)Ì\™’ÜdŒºk¹ÉËvQ]ucwFMÑn.äˆîæ:î‰E�×\ë·5Òí$»›»ºî!ÔÄ“]Õq ˩Ʒ[¦ˆcœ—qκNè�ݸî[»¹ÚîèÖ×—ëšã•ØRêvD–îÝ­Úë]®êML“’n�§upírdÙÂìÛ¹ÒÊ›®®§u:f›»»«‹vîë®ILR»»�I4¤’Ü"àuÙÙ.tBí»vH(£Å7Ræ�ÒRé®;¹ÚNÇuwUËvthŠ”wsšé6¹r;¸7eÊ"�—nÝ]Ô]+”¥ÓvsFí—3·3w.73ºÑËvÊC²-Óu×W;+—5(»œÝÃtÑ´]ÚédÚ+Ù�Ân—:WJåv5wK;Mq‰tÉ×ud$„â—*iËs ›™×&,íÜ’é¬ÓI»®×) É“ ‘Šœ»šéF‹�•Ó©\i ·Ltk»’Q¢æåÊáÑ—0d—r[¥ÈÓeЊå혻D-É:b6º1N\ìíºmÙv;w .”¿‹‚Þ×Xi)WL]ۺˤÈ­×t›©sM”Dw[­têFéÖZI›�®î̹Ë3¹ë¹Ü‡nîáÔçww\×evh&ƒºéiH"¹ŽkŒØ—r»“´°k¥Î—s·#]Û‰ÝG2Ž®îº3›ˆ3-�»7]Û¹¸ª ™wvr+œ²‡2†uÛ¹u;¶vä£t®dÝ»¹ÉÝb™©›%JnY»»®‹¡Ü»�ŠîÁ¡)w+¦”m]×®î:®º;Žîœ»£w;4ÝwDæÝ¥Ýv®Zäš‹¥pÜѹ™ ¸«¬éÛs¦9C®×:œÙ)”UË„ÎNÝFŒnl»´›²åÆêírîq\uºÜ¤®›�êìÂCšwdÛ—·hé²—;wsdEw]ÔuB×!5w]n[“®î\sæ7…94Jºç.ã+¸¥ÇEri·.$R&åÆn\¤wG �îähÝM‘Ý N륑"BdC]uÍ™.îk.Ö4��;¥Ü»�Óºn캒êrMÂgupR%C—Sf×Nܹ:îæ]ÓºwvHÝsºeÀ99%ÝÓ¥Î]ÜÆ„�Úé»±7nÎî–"¹v%J];Kœ¹¹Ú$.5ÝÝÓEØlÓMQ&:Ý]\�(îiÝrÍÛv(  ŠÝ9œë\“˜îëšê»��uus¤g¸2Ë�²qeÖnm,Wnác®è‹§-×vêŠ×œ¹ÒËEÝÒk—mÕʺ®ÆQMsW@ivZJMÑÝr-víÍa]&rë22#w]§;¹Àš�uÎ73)¹p®¸×2î×]–èÒJR�víÊláÝ—v]ÀS¶vÇ`×»t'NÑqºâ€ $ë«�N;·#9ÖšeÔîuÜÑ&äÖIÛ’]Òâç;•Ëœ×ÈRîÜw\îë§Ü΋´»¨Vi0ÄÓŽã˜×w]F¥E,î�h#5;¸œ6ásu®\X’uÔk•;”îî«·'n»»wsº©1¤dDÝ»t®»H©”\)ÕŹI·uκw2â]¦»¶æ—R¦†í+¡¤Z6k·.Îwnœèç%s8š¸»¹2îÍ,Ò$ ¤²îë'\wv»]Û»¹.Î+ºçaW;M®æê§wæì‚M×fnç`Ê»ºC\»SI2ÊsŠÝ ‡:îàS»¶)ÍչΓiÝ®éÙ³5ÝÝÌn’ë·A\Û˜®\·7s�ÅÓr:írî¹®»»PÝÉ× „$»®Ó.vW:‰"9wvb4JnܘîîîJ�Ë¡uÝÝvÆ�‘ÝÙvc›²à4ä‹—RâŽîæ¹ç6åÊÇnë—6åq›©wu¹"ë—K·kº¹%ÝÈ™ºË®¦F"˹Σ…ÑuÖîîZ1±F7M�]:TnË¡!éN]ÇK�:)E&âîË»·t]g.\îÕÛ»µrº¸æS6‹»µ(]Û„5Ù®¦d¡spw\Ç8Ç\˧(Ù:K¹ ¹È’»w\Æ-ÝÕÎFFR›¸®”çW Ä�™$˔âhÝ+¡wv»fÜ\,Ê2t)�çºnÍÝ.ç9™¥®E�Æa™tÍÝŒ’ë®$ÒänæáµÚ\®»›3“´X¹Et‰2ŽíNšíÝ®XÛ²‹I£®è—;›œ×¹wî�¡\Û˜Å]-&rç&—7wk©¹,º‰ÀJâÓÝ]K•Ü®ŒÓ¥Õ7wuݦÍLî[®É#—]×w”ÈéºUÓNë�‚éÝÉœ –3¤P+–à�:®pÄìNEÎTi"s«œ™EÛ®ˆÌí­«m¬µ«U›U­UÕZÕ®¡Є’M €7H € !€!"Â@„m{­m¶Zժʭkk^ë[m•Vµiµ­j×UkV–¶Û+kZ´ÚÕ­Zñ­¶ß’¶µlÖÛdIñãþóý¥Ïiÿ�|ë4�I�ü� ¿ÚrÏÕÅè¯ÿOöŽLÅ4X åœ4)‡”(Ñ@9¤Ô—"&�Ô"Ðþ¹e¡lÿX‚óÆ/Œº¾{„‰PÎfb(eÛþ·£ñc|VùùU¡Í&ÈbÌ�µ¤D~ŸO§ÓGjÄz¾óò’Ò§.€;S`’B-•²ã}ºÐo0n”:"y>+¾ó‰ê�Tç^Õ¹]Àq‘07T"®Z‡©U™fÃ$fá +>]H¾Šë{犣£ ì#-Ð&xS•mÕƒ'†×0vÃf©À̉k§ ɸ˜°L¦ÛpæpøñgË�c éJá.=@z²KKQ©�nS£!Ì)R#»¡SáÙFC§fPÔž¦Cû%—ò¬÷XsƒAtlp_Dî×Íw¡÷¥ÝPe‰(¨R²ÍÐÙõ•$´Q¥z–}ñD$D]lŠŠ ¾ßÉyiù–løhlÍ´„jÞñ|´5qËprÕe\„Ú“/Q4$׆ò·&ÎMϳ;�Zš„`ÚÖfÝC¥T'¥¢:µ¯=A.ýL:•®öLÉNäy¡¡7?öefí§Y嬚yû,5D.©|Õöç�oQÂå)¶x<9T”ª“S6ÉDGÓmïÅ;qÙû+™·ªæÕøÖ“IL�¨¦~U˜NÄœž`+¦èî;ëñÖïŽ÷:¡/š€ÉÈÞx3\®¶¢›Î²Ó\ë}óÆ÷¼Á[ͳÄW2Ž_"O²*–ª#oªåDMÔú±<éCž¡>¯O³1Pfa’cpòy#<ä�Ï>N{�AƒãVt�¬.]±éÿYmv"Ó²¥Žn›=>‰«TÏîÞF^ó°ø¨bU˜˜šâu›š?²¯Iœ2%Ë�!b˜È¥ËÓÍ%äî¾§»¥˜7îϹùVÎÀÖÌ ŠìÁö¬D¦�ÌÑzÏê±$‰�éâ>_ôžMiï§¾í´,îfø›â«æ„JòÕ¢¾ �xµÝþãD©ˆÜ(qÜeóQDÃe:йeBP¸§Ó¿øá¢ÉfªL1*Ì83ýäî.»�S°T!6¬R®Iòž¬±4ŒG]7[«S,ÕÖ”\P¢¯?®µWÏ7¨ç…ÂñÁ«áãŽ;lÕ¶:íqÕ¤z�ñxàÂ:¸ûØ|Ä Ö…Æ]7ù/ÓòôÆÿÂÅ™ñrc�ãq^Â0D´<[Ê0Ît¨ÀŒ®üýñ»ãE®_Ã'q09Ÿ‘ÖÊúÛ ö ™®ê<9¿Œ�_‘P;ß�Sã·³úîGë®ó¹÷‰Í'ÂU¢Öé˜ýH ®N´uYžžå–γ••ºZâø9Ìœ‘^ÒªåÇ-Æuž]ƒ$7ï0o]Ý‹ÍÄg͹öžÊeUnªˆUÙâ7´\âïwd5{¿d¹·l° ñãßU]Ã…É€Ô‰,óí�Ÿ—y¿LÚ"¹`âDÔ‰Ÿvòy™eÆ®.—Σž ü\—ªñª¢lßTz§Õ…r-¾PF_Þ&*Ò׎®í(rÒZ!‚.U7,—ÝÙYŠí&cÔõiø«Œ­Ð¼¬[SDG×<,µI�4oµ7æbÈùiõÜÌŽ+æt&‘í¤WF…˜è;¿}Œ#ŠHÕZŒœq;âp/«g›zFKñÜé:ŽXɱ`22q$�̬LšÒÆÏ$OhNV(}H“ª¯—UÛó©º1”„2fWÎnŒ9á�»�FÜ|½ïƒ«Ö“cëPU¯ 6OŠÎ>uö罫ÅÃgÌ®6¤ÉÆÃ®ü˜ÚT}H;–ÁÔùü?+®´ð”÷ò3ÊÁ*�ëÙU›¹„­ {$õâÁA%j_uÎêI�š¸’Íë;ü‡íÔ 3MͰó ª[$A$3˜†bq¹Œ•H*Hæö-“Ú¼ËHÚû,þ™õb¦Ä{î°�ú4Ëø´úZÈ*¿tækâ-I”†ò `þÛ¸ÄþáÙÓHÈ$€C8[ÚR‡ƒM¸QK},Qýœ"Dçò'5ÃF6ƒ#ö^»oôhÄÈ?¤·§úµ1§ a ¶Âü0m2(bä¸ o÷§‡”yB?#C¨‘³…•=+*×èÏâX8¤±œÙk¼�›vh£*ÛÖ“7h“|¼RÝ ,Eà•à콋n�ð¾t€-JA.«§~oZ�;^ò‚"+–P¢? PËEýýL”z_KæPx¢b:€vpªd�NŠŒDfK^›þÊM«‚Ëe:}iÜ« J¢-doLèHVSán@�KŒ^^²„ç-¹í÷¼Î75œy½¼#)yq™ÐÞedR!A§·&D¡WOÎÖuoÍ�Ê€÷™Üˆ05/ŒÑŒÏDeÃ:ráÑ„dãO–…f÷}UMpa’ d°á’AišUU÷Tˆ( )²‘)‚Yõ8P¡)|h�ö±ÃD™•›T(ˆ%%Ús‹Þáˆø°Ì`µI‹šßá”qÈm„ùRµ \¨£ä®z«&¢&ŸÇÞvXE*Eá HåAepJÒ1-ÈÑÂJR˜…†ÅÊ&Ô½DC â×fcÍ#˜EÝdNeR]»"Ø)� ` «MŸ%íL 뇙ҸˆK¯ O·b¬ÖDj)æ’ý¼ÄðÔ¨Ob#R6£Ž2½B �³Âû%Þã:åÕŠŽ C”õ~ýst˜'½”Ìó¨�ЉÛð†]Q9_ÓÈš¼fßäÍ`­ÇÉ¥Ö—S¢ñRž“x%?4ÝUÄ D?É Š\=ºäÆ€øÆc(0çeu¦Éš?„CÖó1ø©fj#âüaW*¼RH‰S•,Â)˜eA mô¨žÒö™ˆj�Ìñ5ºWÙlœ»9œÒ?N[@¢„½ÊdBÃeí|��褋¸€à Õ.œ¬ÎüQ½ç-o» øGÞôsRDÆÔ|â¸IW´3Ú@™äî#G­âƒÙóLIºk]¤ÌDé\lšÂhá9¹‹—Vê°’à¡4eM‰d2Lî”,¢O*:‹%íê šY›ˆ Êw4 ·µ…m>©fB��¥1-A;ŠŽ ‚̬տ”»+(•ß5E" Ñ$˜„„'ê¢Y_nŠb�>Kh&‚�tkM �•ŠD˜„p´‹øÄwjûs¢ؘ²¨U9麻¹�´„¨Ns¼¸²•}Œ [‡9X§H™ Áí*�\ÔÜÍ3å@·…Qââ�Z}¨ìYÔ'¦">k1i–¦!f`qö³ÞQŠŒÊXÓ*‘÷ºtJåê$8]Ü8*{›1#a¬q¿¬NŠ$^Ûá.:#äç© ˜D̼—“ÛrJ�&<€°N�FÈ»�ˆûÓŠJSa¶é©PRÃï.~ð�Jÿ‡¹Âd�#Ç ¶G"´Ó¦�üz2òÙ&ƒ%/À¨ÂÔËLüÈX¥:t¶¿!Š?´”–åÓæé%Óï©@°`[æØLà›ÕQaïÂXUß÷¬vsšå¢äL²C“Ãâ|”Ej„ tg¤¨¢M2T82äãï7©pb‚•Á½Ô`úÒóUYóZQOL:’çqZBÖŠ "íFµUuU,ú­Š_ãÛò^¥Ðí²àìÌbK'M†-\ã-|Íd�sôŽØGÃϰ7ÇŽ� �P»ãWÕ –µ£H˜E œ#\Ë1 3u_ é\A%�V‰q �þ \بas …�šÕ_6ÅißÖâV(L9�<ÓžÜÌ…çâR¬�~;&!K\Zæ­Ù}Qe’‰ ¦ÔcЄ‘ ´ ûu*’ËÚu]À.OÎgÝhŒö¥‚g1+ñ'Mò¸™µAõÜ M¹NxÐÌâ  �ú ³öîs8ŒÛ¨d„̘ @%ÐÉn#4Ûl|19—�ü7*$ýîw+¸²ãq‹B͸.`Á$ô®©Vퟪ�ÙÀ£>¦+¹¹ÔVù£ö[Ž-¢Ù(™, ÃâŠ_ÓX0T5ù×RãM“…k1`¸tÐ-{˜æl³Ç9‰�Z ;0x{h¢ziØ)jæ žª dù\—ƒSM¨‰Pò‚úŸ)>ZÝåŸiY*½{¼$=VÕª=™²$ÙPš_^ÈBtf ²�IA;ùPhwbÁ±ÍJVe¤|!•Žv±zBjG0=Ú¡Y¸Œ˜1 ƒÉp¼VCÊ�íá°Ph¦¾CªÆn¹Q$íÃS÷‹dBZú÷¹ljÚ…öDTN–y� \sˆ8…¢øû*2­IޝÌÞaì˽éL\tX–¦}jwqB á~Z›ŸÄÞHY_gë’ä…GMBÏs3jøÌOâ Ö"0)„ÉÇŠ!"¡Bô÷ÃTÒ6`9ZïȨ#¶ ,×Њ°Ï×êä¢pˆ™¤VÇJ"ªgl9Ža>[p¾>m²AÙhû 9ahÅ&;•ó—Ì h.Nž”†z‘‚„B¦ 9(ç¨#šB…Ze‹$y0*X>žZ‘–)±gØ®x•a*4DÊÆ¥— ¦œ"¶ýpI©'Ú¹’+#äGÉDöP À(gĉ‘£íÕÖÆJó-ú•@V<â 4žî CªN)$�|oŒïK&i-/�Y¡á¼ë!»ãÌÝ'`Æ&ÚÑ v¿ ù4LeÉp%9(ÎÕ ™ˆ þTÈî™dŠá•,?�&%aQ,b6&*e¢Ò…Mq‚‡¥áÔÆË)5y«ŽÇÙ¶ÃUu¸r(.¨â&¬¾Û¬ËÖ7wjÇ"hæu Ð!è5E*i_u¼Ü-^mmŽ”î‘FN8‘Jý²ª¹ŠÝo;�½Úçz%ZB÷–Ú¤2ùwc µhòº’óÊÔ«¼é€Š®J…3œ«4v©�ubªXàŽ »±lžÖ„*¨ÑËõlÉ/˜/y�ŸM±—J» †îš3XÞ™r£ó²+pê³ä{S\Þ…´wªôŒÀzî‡mîB{[¸»�:Λ2Á²Že<—OŸQ±ÏÛv3ºé2.ˆ ™•�]ÍãÓ«V¯x8Il9æý{·‰MáC�Y¦3±A‘¢úU?VõÝò�ng•gpÝœ8‹Á º¬ è:ub,ª•sHÌë;iMe›ÍY”OR!Å{€ºí­°"º±N­Å‘ Èfº¼#ßÛ�š´Îj+¶æÜ5BÕ§ÍQ<^5”–Þs|»e»Ô;¹‹FKÐHêi-;hc%‹ç‘ko8úö‘Ë91Š8wÉf¬ëì—ˆ\«·y”,®ßG�¾öû³‚c¨æY—¡G;Æû­sÙÕyub¬d�ò§ÛWBᜮ!3 ÄjðÁSptÌË—µ™�DŽ«}<È´Ì4²Á½åÂýÖ¶–ã²1½4w.;f¸WkÌ¡*  Y¸{vµ¬8Û’¬7¾;cl åL)ŒÍXš¨` .Ó5õѳy/sm«ñ§5µwîâ¦ÑÍ1]Æ{nèŒaLyÀÑ}w/LßqÕsÝ�=ÕD=FªÍ¼t«¶˜¢‚½²ÌBîº]“E_»YC «š7¥oKß<íbº¬U;�fe% ]Tr¸c½»Ðw”×ÄUЙն+˜h¥ÎúW€´+n­lšÆí±VƒqÔ²¯Gz–ˆH$�`áwÏ+©Õ¥“uÈ,kffßrº>Ðx¦Ž›dݬDArQ·H„E/\^w ®FP«\¼ y·ºH¢ÆÏvå\u}V¹³]Ô³”H«íºkÎ…Îfû&륱 Š0U£Ø¡õYÊ,]K°ÅéwØ:ˆ×°‹·tgeÄ”<¥a»˜0+&ºµ�¸öJV]çݵÒr¢on÷wnŒ4 ðÊÝoø1DÊŸÇ(¸õ_-�®è_)½æÙVmjŠãM´›M±ƒiµ@a ÌØD1@1 Ù�F“)¦Ji 0¢ÌR‹&D™¦) Å ¢K¤,QC%‹EDD†@ÍŠD²ÀEd¡,EƒŒ1)1FJlL#"6c"™²Èiˆ˜È MŒ™LSH`�Á"™$"f)C 4†Fš� L’ ¨Ì›ÈM”M‚(¤ÄÐØ°Z`aDEe¡Œ D1dÁ‘’Rad’›2aFŠ0É‘ÌDÁ¨’0X’c$)i M66RŒ”Í ¨Ù‰³‰‹(1%1#BjJŠB’D¡ƒ,R(ÔkVµPÈÊ�ˆ±JQ4 &2l•%’Ch54ÄLÙ$©fɲ“)„ ”™! ͈Ì&’"‘4b”˜¨Ò6Ä0–d#-�ÔÑ64dY“¡‘&ÆÉe),%¢B”Ø”Q4™ %(ÌHÍÂ�”F†Fja3"J%JE!�ƒ �ÈØ”Á&@J)$%I¢#&ÈD™Š“¢0Ê&h“Iƒ2£RbK#1Q2€hBQR&ÒY, ¦I�)Aˆ£2d¢‹E¨¥†�1de 2FJL,ŒÈÈšŠL #aBR0&‰MÄ”šjI� ”%Ed4ÑED ‘´h(!˜Í–*" ¤"(D„˜#E*6i2fA›†! FdF”‰If4�2Y36RTXšŒ6"I±“b³EŠP›64D¥&(#$RH› J"1Ä0+)$%AI!bÈ IA25ŒQ lS‚dHÉ�„³Æ(ˆ¦MBiLRcbž==}oêx2êP×$çtw ~Ç];|8 Ÿµj¿mHxPƒt<ÂõœÈuí‹ÇНmg!V�>; Ã�·o&ã�Ì;ë­È£\„½zk4u”ø®¹ÉõÖóÞsª ¦WVbÐ�.5œæ_, «“bªä«G&ÅvMÚ­¹20–Sí+heà”(Ô›+s)ð[`ÝJC:®+3C4¹Q¬¡ÈÆéåP°RÃCm­ã&×fÊ®•N¨·s"yTt:ñS-b¦‰òA=IÝÙaûs…PÎ�ËÊPÚDuG*J‹ºÃ¥xœÆ»P9¯³“…,RA˜äÑ‘xꉎ]ÂW�£í4æv:nÑΡš6÷jqk¼tÓÁ3˜Gº�m*çTAtsG©I{2_¶í|3¥{²€ÎÚË4Ç´$,aÉÑöß]Ó¥�Ô„bê¶÷¯½� ¶Ên·%šdp(íz�îøŽ.˜›°ªt�JÍŽ÷iÑô*ÆÑ®Í£3zÙ8ôË&ȸ/Ã×`{2©õ ¥£G[Ë>ÚW™–­1}²`ÃÖöø¢ PpeõW<ç~Ü»C¸i¤$Öî”î§Œl Æêðv%ê#®¹17Õ¡xêä˜w"¹�)Bmn\=K»($b¾Âz5RY:6°‰„”»ZJ`Ùopµ¹2ÐuÜÅVVëX+žÎÁºåg:Ì;ažÕðl~Á ö±ÓòøœOJ«Ë(^ÅUA¾ …iѹ 4øõ‚(2ª&+†àT7.­øB—«zxM¼�å÷¹ ƒšê¼a‘CqÖKD2Íë®\pU³¨nJ÷7sBmâoÆÞq”jc*dË­œ93O{14¨S©Û‚4Þ&³r3kt�íIÏ (¸Ç•0.ö0+Ôgi¥â{9uŽÝµAõlß]f!wšVî ]Ô2´Bú¬@úMí/¯iJ¬ì¹�FɾÉßnîíŽQ,9W•(ÙÓš}’·aY �åž°C DÝɯ nh,»çƒ53½º RÔ®ÕÑW^¤PÜÓjn‚Õ,hhh_‘Øò½IÖŠÊœÃ;”øøÖU‘Zz*Áâ13*vT£qW\ììD“^»¦8g…ó w»Ô†è!Ððï½WÉ1»½–}l6¬¶Ä#3Jê%JݽGXó²“�€÷Nå‚ýÐ^$„$ê{µ…LëQÌ{n*ް;ÄîÆê KÛg­äÄŽ…~~Ä÷Å‹-<¹ÂYàEèèž®ØëwÇ/²ë0®ådÂ#í]Œgvhîé¦ÞŽ»ººÍäCÙJ¶…”²5�W5É×l.ÖZB•1%£.sÞU1o,Y ‹ÎmçÌ_+~VËñ±1–òe®©3äWÙÒ[~áíw]kwœÏVñCmîIIóÁuv xN¼bê°t¹#¤]=cD·1n$Xge’-†Ÿ3ÞÅ™bŽ&/¬.°Êõv y¯YÌT �ÁŽíZÁÍ}GNÐVëzÌ…J½ë4IÛ½»šèJhË·¯„²»3©±ƒ”B§£«PµRuúæ¦Æ¨Õ@¸©t,À{øÜnöºž�–GWä잪×jÍLw]lmA¼èdôA—7­L¥Áž¬‹�«aBw�ïÁ.6,gËÀ«I@DFK=Á‹¡�dnõ†o³¹&ÐìÕšV‘O&I””ÆáãÕP-ÙÝÁ&‰Ç²…òÊ·†²ÇT¡Û„i¶mÁ'Z•ƒ·G#y]›ÒðædÀéŒW/ ¬ô )W·«76\­¯nGº^ÝmŸX˜8> ªÉ×;lج̻Œ̿³CÉFèæ;å]ÛY Ô�qep탪ìÛNæœìd9t£JìÐv#ì7¶Õ��Y�ßM9P�À"98iá)ôVC¡PìÊ͔η«®éfÇ�âèÓÝÌݳ™¡b˜áÁHaU¡½£hÙÔ%ë­Ò=ÐÍápá›b�ä%Ñ}‘ O\*ÆKÉIåçTésµ&Ó8Åv®�}¤g`Ýrï°2Ú„±;:Û§­"ÇÁy… ÏI7³“b²Ò²+qöu\ÞãˆÙ£Qå|®´Øv«n_X¬Þ:G†ÂùjªÊo³Õ‹B»®ßr¡YEã¿óÿïúÿo°f!‚#€Ip%  A9 __üuþ_t4ó�Ú×6Ùj‰Ù¤ª2/e[ORYGáŽô£ý;ÿ›p(&ŸŽ ÷f“�§,Oª^7þñÂßøWÏ�»ŸûŠPë|Ýå°h¹ƒÀЃ՗¥¼¬3Kïícl÷ëDÄp{ø¿ü…�¸íÿtAuë6S–½’«.ÍlÙ¢FT×'nˆô}´Ø4[VØ$çPž$òé‚ýU9æió¸ÿ—¤Çÿ€€ ÀoÏWÑ“øÝS¡ù×ÏZòåöܧ¸ºXOm¥»-C·ÿÃÝ«|Ç/>YË­væ|«�`­Ù zÝòœ{;qm¢ïÙ·¼º½Å‰rYáRøà'|÷ûwEº<´­ë‘¿o–²gT®³z£]M>Euw;Î$ú©†šsï¶·ç¨�“I4–í Ž8bµ�{£ÌÕzó›#´õ”Ûv˜ÙËz¡'‡o.p«VkAIpRI1&˜˜à:k$?ŒeVaAûmëäÃRHÃÍ2/7W£÷g¥tÚóÍØ1º´¾uP4§Æ·Þ‡6PоÄoüXBàJ[†¡}t핹v]Úm÷ŽÛ eä-uÊ%²ä×n•áômU;¥ÔòÌ6Ñ%RÓs âƒæÙøã]{åyƒJ”�Ç«†²öŸš:g4nÿ¨'í˜�AwÁþõ¨ÿõ!MC §û1©D6ÛI£b³#«(»6¤H‘üX¹tT«Ì¼œÙà ÿº#-?F{Ú§­2ýÑv÷ï?Ûýü~Ìé¥þæçeÀ؃ÂEÏ/&+Zл¼‚`Œ/ÔáJªh›—š&­SÑÀQì!$—¨„$�9÷úg‘a�N”â´c'íïçpB¢Á%¿>Ð~÷ìý²‚½A1á³&MCH”Ø2D‡ù'ò!R±@Å‘²¨ÒÚ œzÂXuj3!) µmê$BG¨I ,�\e¬]ºPZdrNÑþI‹kÚpêÌÚ/DB½’±IC’$Ǻ8aÕ°ØýF2�ØÁJB\¡!$ r�@Û@Ï(!{e´”Q¶&Zµpæ> –ÐðËÌÌ)äÈiŒM²}aJ͘‚1g¸ ëÚ®u—*Èd¬Û�®¿ÇA%.ä]Rf1 o4‰ žV Ð ŠŠƒ¨ª R �I%!áŸ[Æ|Âÿ[@æs³÷üØFÌ\äïmqd\j´˜$†…}¢»aÌ °”Z #)Z²Òˆ1˜ðjòI €YDÅ s ïG@¯}œŽ 7›TÊ ®ƒy„«Ž–QVÆòÙ˜eW��¥´¿¿‹W†&<5úÞ2fw‰Æƒ5„f$2¥Ïœ¹\Ý�Hœ¡g íB^�QKCb›R(¯ò�„ F–ÇC?ŒŒ\Û ï¼ù¤V'H›¹Äyy×å`[¤çȵtŒ¨ú‘²Pg vW`ðà†z$ifQµ�kŠPw’I/Ï}7{&8åèÿÚ×÷¥ò^$ç�<åç.ݬnÆÎ{j„j\”Ë�Ë’P•-9™, or Ú]T‚ Ö‰Ot’H£ J(¯xìã�ˆwÏLJÿjc÷Q�ì\u0¿š‰çK?5þñoÖI¨!€† Ïª={²‚�Ômh ŠíÀOÕ\ª• ^‰'Ȳ€£5ýå"¢ ¤| Bå¤%øhéZ”Ö_¹Ñ A ¤KûÂÅ*€**M²œ¶HW%¦zˆ@×±˜A÷ytCºKµ·ui¤:$$oj1ï6ŒD‰é0liƒLȵU;Ò�„�p’S„Ï�;íO“öAPZ´Kv›@˜�·> @�ÂI{ýÌþ½dµ»èeúä�4�õm¿6#Ù�2^¼êß›\TŸ¯ÏÌuïÇN\}ÎzW'¨'pðçëI·‰Ï�•U‰29cLï£|ôù:­5àµÏjÃ;ôýÔ½úÇË+¾m¤xV›l/ýϳKÉáãÇóÆ|içûó1šùO©éï…]Q $sØZ½#o•í‹{L6°©õósÚ1ØÄOÁ @/½‡µ³5?DÇçÖÙ{ºvîôg—Ÿð¿�ÞÈñáñ+G©.ê§?j®õÇ›C˜`k1Ï©†©kÓK½Ü[Ï èc:é•Ñ’J´4¬¾-�Íoj¡VŽ"e%µÇb•¦ÐT>lµüñ¯ž¦�z…Ꜻ³Ç‹LpGÓ‡êÛDâ »¯Åß5¦kÞˆêì©Æ×|Jý{Ï:£óz�ݸÍåÜ:�O‹ùDÃ|qÞ˜O©ûc´ª²NþüÒÁ[Ï ñÎü¬®Êý+°1¡q§PåbJåÐf{,?ss·”¤ÆLþåÎ7`á¤7|¸ê>;ü�þ&ájBUð©Z¢ìÐ-#ù®ÔÃ…Ð� 4ýô¾‘ùƒÍt”Õ´€~Ôýê½ÊŸ‹~#uj€—vû˜š¸?D¢ß‹Û÷ï0a_¹ÝWê>µ‹A¯©-Ý‹çf¿ó¾ÒÆfãûj¤þ/ßó©ëŸ!4!Uï®Ós)6;ÇÌàÄ<࿘G†ñ=!åoÌÀ3Eæ;)ê‰Ú´Öƒ ƒajÀôvu,Œ/L¼�ר­†¿‰ËÙ›– NÃ�œ©–O�áì‰ó¢3«yÔ®N‡¯ô+P#ZŠÿæ(6”Q+à–ˆK ¾ìY2�~´�½» �‡°•¡ ·ì•¬À?s=Rÿ’S?´NA„·iŸ ‹ˆ^€hL¥Hï:I^-Ý">ÂŒ! §lål? #lË8íï2�GõʤšKá˜F|¥êþüØ%h؃£›6TÌ’ö(�3¢EFµHØT XiKÑ¡iH0HßA�›I `Å� 10FT‚¾„Ñi\L{Áç´hÍÕõhAû­'O\åßýÁÎܶbF‹³}$Uõ0$KBënò>*¤Kþ çx%Ò£¡—¤Phi´óQlêIV1Jï¥QVÉlÅV‚‰TUIŠÏ�íÓñö�›þo%z3÷ʧåÓ•fnd–ø—CB†öyñxdc[)ZÎe ip¨œ’4†4›éY©�˜‰½†C–Q(Jé¥)0WªƒdeÔ�„ >~ÈwN ¬—u'>«GN‘gü4Áz?¯ K–fD2H §¸ÓE�œÀ° €ì¤j*Ð2ÎÈöŠ\B>²¬F ×! $¡$wÒÙQQƒaˆ9F¡‡5ýB9Ôƒ@&e!�LhÈaÖ€‚ã)ôœå¼¢Ë<²Ë‹éÌ.ÇW÷uî8L7A1 Ñf!‡Di$þªÇÏùßCÜ´>'ͧãhŸß·Á:$ÄG¸n7_Ø7+´ü°.ä½#Њ„ijÀ}p™€Õ*›l"£ai£*ôê¹¦Ò Â¸®ÔØqJ8ddðVøšk$$’W!ËøI¡&à¦Ì?ÏÔ1ŒpZÈwÚ$÷3Ì{ìYK5zÓl¼‹±“ö�®à0C•@ÇáÐ$ƒ vöÖiö«rÏ“†´�ì°?V'[ï¬96îMÙ�³XÐdý©:¡�«[(ù0ñö8ù÷Æ:iÁqIÍOà”F¬¦¯éiãî–l_[C;N½yÚ™û,kèUtnü‰º¡ök¥÷OÙ5r™w÷´h¬›}Y¾9l•–ERÆî>žöº­ï¿ŽG6¸i3è×;ì–bÞk½@H@“3çóXõýúÞ‹'÷’2Î?;EYÑõDˇ)OêÏa¡±±´U((»´d{A¶\z¹–Aº3X‰Óµð;Cö½ï8am7®ŽögO˜Ô©,ªÁ¸gN ~y‡Õ†v2']yŽØŠ3óë3ï•åÊ~±Ýs #v6TkLCk©·%œ’²F9´u£‚à´,^ÈR¨TsWòt?2KÉZápܘ`àÞ ‹ &@Ì”ä€g*;Ûù�Ù›­y›l’%gI´J xÄÕE{5²Ìt!\ѹsOÒÿyò7føÒU‡-™Z1GFE4âô³Òµšü´S:I¡jFäV84‘#Î×JZX½¦�¨Ú€ÏýI%]X§Æ_|[ý!l“o_ZöÎì_/P›*ÄÒÖ¤‡”�”¤^òd²^")Î�Å@Ãs%\›B£4^LGû/üÄå¨ÕCºR¬Xù©Œ!)Ûä:  ¢Vqrà^¬9dZ“”`˜ †*+H4›0JaÄ ã¼J—Ë—…H»»Š–’™mJ6a…¾Y£ÚÑ¢¶+’¹.¤<”&æ—d-V¦d75 •œ¥J³YýgvØ© ãÔBI/·ycí©j’Úp9rö‚±8ÎÄÞ?W.qdPrÑ r¤ºšª­�ƒ.>¯è®£ ÍA‘æ–yézöjæq—½©â1Oh-¥£û<þÀ�IUÛz b*V/K”’&—­š}^á„R«Â™¡ ¡€À$!*€„’R!=»‚Ñ} õ Îèõu¥Os\·Êjg -™–t’…ý~÷±[—€`Õýÿªš6w‹3Š,£¼ªZë!* 'îË¢ÝH"ÛÅ >ü[ƒC,d`îE(P½!؉¶‚þ…iÄ�ù=P $$¾{³¿jIŸ6Ïß±ùÙjwÞ›Úýÿ~]?XŽ<{§ÄÓÏÊ> Š`æÅ{Ÿy}!ŒÊŒhPèŸã´³Ã9ð¿cÃ| �†¡Wâs�ëê5CDöóÏó' ]ªáyi¹Cˆ’WNÉ‹[%VýkåýùëJ cúÌMÔßLo+sj79w¯ ´#öÏà& §]s§È)ù¯ÛÉQmOOá{H|Z¶ý%ø¯ÖJ y6ß]¯#Ü Ãæ Iõirlžfº f-.¾w¢§võx§n¼xŒ=6`ÖC˜Ò¢Ìjèäe½­�³kU½Þ[Á€³KqÅ“ßËLu.ØÖgHޛ½úKWò:oØnV'êŠW�Õ¸’V½.ïEço[Ó9_�LË~»�Ùœsë_©Úç lHkºrØLNKƒx w¨üWT†W.$$:{ÕÁ`…f¾â¸†9pÓ@–@,òÃp›Å»÷\pP?�yzÎnùA%kÈB$+¯UaiùÊJNؤö]u«#·¯eß�~ë¬ã²ˆe;t'�ÀªxùxÅHÎÏl…µ6Þ)Œ69�¶¾¤†ºA°×èpÚ¢fËW•…ˆìòøíS¢}$' ^nËT¦¡ØûÎ[B÷àFq"#ž÷©Mý] úÏlØ'k hÝX¥=Ô®©Ä߉^Ï>÷²Gìšÿ& {øë‘-6õÝfËes�‡Ãî÷øéeÏO*íñR8_Ì›šžqîÄ@šm¿Ûê¨0ˆøØæJ sÌ,!(L !g«´P”P&Ð’UÌBÈ)ú¿´M0XDÊYM5’J/Óæß~ïmÍçwi¦»#l|^(�£fhúRÆÃ&ŠÕÇB ™vv)M]d?  ¼Øã¿¡œ3ÆüB–Qœý¦U8mV�˜sú¿{+a.Q¦e™Ø!vö-ü�Œ÷gS ö™��((Ã@ÇH �¤ƒè]ì�CS'଩‰š¢ Þ¥L±V¿ÕPŸŠ9È«¶d~g,·‡µ6$T3PËwˆCy6f*VÆpSÞÚ]}bb�ã(ùæ(¸÷ó¦îëv‹Z 8â|Ãè ¨–$Â-0ASOµ`�æB&` FwUÏ?Í>»åÆ+F/ûÑüqþ„1£–söN¸õDi—Ó�›å{9"S¥jzQ€þktîÈfQTZ¢QÐÚÜÙV|;¦†>TÒšk¥ùÐýÌLW¾¹-æç½ïcâfšc}­ÙïüÊxËmèw5‚91|•Õš¡àî‚)‡*k\BW-dsª?L.÷ÏyÞ°³}ê^h˽šÅ�KRoælèm»½xJIm¥µºº¥N´¿¡•zŒhKCèq%ÊÌõƒg=¦YŸ¥6Å‹)�T!\ɈûPyÐÄ�½¨€=êÁ„7( BТRU¤RD @)HB!¤±‘Ê£×ÇÑî�#ìŒ&z[ô&³•±S8Ð)ùÕûÅuzý»Á‹íûBѶQ {WQC\´‰WÖK/ / Zi•ôkám^ÿ³v­iá•­ãZC¦® ¬h ð—ÍÑ”æ�çeõÓä)Æ‘n*¦|‰€ÆÞî%è�@uÀËŠ®÷Ò®|§¯�ÍAfèš+o$Ú7÷Ç-mjzZÒä2ƒM9Ç�] ³Ò×óì÷¤7ô´Áÿ _+’½yÓÍøW?|Ú#jÕÉQ§×‰»Õ¯»F!K*™-á"|9*öãq|�šÄPó)m©ç§z×î$–Ndñ¨êKFSLat†ãÖÊ~ß4ùñmQµ(Êj¤¾ßKFIÜ¿žÆÖˆÜs-'¦±J*!Ï4µÜ·}¾Q°Ï.û˜Î­kÌvЇëìàQ¡ºÔ-õø“Ñ¡.—p‡»¥¶OIçÔÃ7YÔ˜&P¨ÀM’dîÿ=&±8»ýW¶›zó1a 6>œÞ ß��çšB—†4`½'@ªŸÒ]²º(þ>±ò¿I;G©˜öpf3àeÜßµô½!$Êü|¬—ÜmµòìåñêÒvðù÷×Jø\(¨Ãߺ-EÎÀwáQhøJ áÞµÔK:FƒøýS@H ‹+Ë<›¾ì÷À ÷‡Ä€hÂý*Îí¼ræPô»çæèÄ KÊ\ëý ޶wŸ“Ø�\§Ñ@ÛÆðU}{®‹xóÒ½è'ñ¾SáPιØ;SçjÉXÌ%˜Åµï }Wµ[à*Txvj;¸;Hƒ¢’ûí–s{Zio_ ã}+-;t¢�@«›Ï3CÙúüx«¡®5ªôŸ�ÜÚ°7úÄ}8âk¦•íÎö7> q('±ùD P{úLÎWÔû6Û°Y …²�ˆþ$RG›{寝-fSýÎFrˆæ<Ï[â Âb0—«ìóJ­M& Ì"Eló’¹DY j2�ê¿Ó‘ÓÞ£zÏ£kƒ4añ,-kÀïmJ’™:ަ˜M�GÇËÈ+÷�lÈ×!“ý%¯ÒvSI Ç]u «@\ ”8v¹F'`?È€¡¨d0ÃP‡#JùRJFv×2mg²íi.Å�™;Þ$*hõ§�š\ï]±YXK-¿—¤©÷ÏOås¿¾+[[û KtÍíQ¼ã´æ’R™Q.©¶C°“Ïù·Š¯¸#ë|©ÌèðÞÿºvwÇ¿¬~}ŒëÛû±s6yãe7†:A,”)sTKc2îÌDM¶½sôÓƕʴ>Ñõ¬9ÖçÛø˜h!$• ™æ�|ƒ#˜ùd¤ÛsÚ$PÀÚV\`gs#Ia)ÝëJf`æp{µ›ÔžZ¥’ ã½7Ò¸Zš„ÓJÉBذUæ2Î.$¤ TFصbgoìÉ‹é�IÏ^­ƒZßÙûê"ù³ˆ)òQ3e8lm©²  )I) TÚæž•�L†‰zåjœÁÚ|¸”Ÿ«¶�­H÷¥!ªféZ’Q,öõ½˜7²HUîòKM³ TOI…(Ö55r¨fã?qP˜"ëvýQ|(Ð�¥3Ì‚%€ƒºi "¡LΜJõIÓ>�ÁPiÍ ¥Rì%ËõþgyþewÈý’†�ÐYh/Ô5\S×ñ´S2Â7ói¯Î\ªc! $žÅ}ÏJŽcû?ð:ëï·íŠU·¼URÁ׋{NÞÓѦ¬`ñ…/ëÜI¾�ö.ÓŽ¹›Q°~�°l×Ggý÷0ªifNþ–=;Åš¿XoC±¬×ã0¬—�m\z’fÿjÃÈÙÎV„*`ðÓŽéë_š¦.|ˆkí¡$ârjfÏz+®§žh©7çRŒ–„4,ÃÓ3‚‘CÈ1’!JW\ WÈݘ•?=�eG½óÎZ‰¼N œ#>;c»ºò|æ{*öà’‰¡i§¿*Ú{ñ¼û·<éôᄺ—h—¸zÐ/Fp‰%5»dÍË·èÿyÑôZ ¿ð)oÅ,=CËf¹æ­ˆ$PV]zçÏ !ú{%/VòG§‚@òA™LüêÁâÖ�Êê<ü<—>5š£/ä}|Ãö{ò­||¯¾ú΂Þô�=övšWªÅm—.ØôÓpÍr(÷—Ÿät—ïãü2ZËW—{Çe}ÚlÑ0:ù4­þ¹œ(ä!'§Šùt)Ñ@¿}Oò�£S¯ó)þI}¾(ñ3÷ãLù[ioSn´_Ÿu—‰êÉðspPy¥_Ìe¢çŒ&Ib”ŽWÚÒô·xôô‰>¢[õJÏ‚�‰‚ˆuÉx_[*|7øW%ýñòP6mÖ]Ýh{ª=líÕçlRäÚ#pµ27`°‹ñûÁBçò¼–~Πrp³2ió(^Á¢$žÜ£Ll†}Gß|®Xã/ݰÆrŬ]cÇ)5PŸò±Õ›ÅêèÓðÙa IøñƳ×�kÌ¿hµõ’‹l.\á¿f¾”/Hþd¼<}’Ä=Ä�Šqú�`Œ@èezd&~]%̯­%¹G ‚ßa—žÕ‹8U.K$„y`&Ôîbŕը”ßMvˆ‚�ÚLg ߪzàÛT�*ކ3ÎV櫰ܼ ¹¸L… §�€øŠ¹fSiW„EÏß�ýô¿{ûŽÝ«/ÕÙƒCÒZœ¡PPJŠ·Dæ¤5d×f¯:Œ­(Ûžû"jü.Ê4®Q¶4˜ý&#¥>>$Êšg–”ô¬—8¿mŽ.�’J”Œ¨tý.ÚÈÕ 4¡4Bdi´¢Nd¥ ¤+¨åuè…ÿ9(�zÅaÑÇÙæµlEf<`@9ýCJ9� D±@¡šl–‚J�ªpLŸcðÄ‘Šl{ª[0EŠáIŠÙ7È9*8¼É`×x¨[²ƒ¸ —¯®µ’ Cm¸Dq¤ùfýë]£ÃFFm) 4؈;ž¬AMhtË1¤5‰y˜ ÒM°Lþ4¥¯�®ZÝéÝ—?U6¡~£0�®½­9/Hï%�<Ù\*DèØ˜ÌÏ\3Á÷Öãµ0éh—Ê1TÏí›Ö!±™âdÂ£Š¬†Ú"ƒTd¾ÁÓ^YÓ¡m1«‡tVZ6­´Ó­·¯›ï®•tý›Q:žv¿ºÖö û‘'¬4ñàQ“À°gdËÄM}]Oè;xË}uøs’ÛªQXtЬÃî«ýW {Õ{n°åG Vùp À pD(<  ®axc°SJ'�#ÑPõa„†{Cî’çÚ”ôW¿À ˜Ð›TbR…è:™_‹?Д‡še3Ų(]µ§ð ,cS›mÕxZÜ==|øÖÞ~g€‚ A>JäCÐB=zç[—ÒæË¿ óßô FÒkÿf¶î|kÜ5l?L£±ËŸµoÊÞ¹s36WReý+…̆|ºz—%·ÍX½ýÞz2Œ¯”ìí¢HÏÛÊ�áðSûËXÅó+ÿ#ɱÖ&Ñ_½ßã¢êrÏ©1x‹žÖ”_ÃzóâpÖ …‹Í™˜/m9Ä\K¹$þ)+Ôù¾‰=àéFùâÌw) ºeµ©¸¢Q£�¦��¢ñ…xð|³—ø ñX8è!(øM´MþªÚÎÛ·žÝÕN_za|ïck�´À½Ô©xÜåÆ¿]Ýøžÿk1:Ó¾4)æÓ© !|wÂS aµè7ÐÎ]ÁÜh§ZRÝ�O<ñ—-iXÛM¦ß§yªyÐô£çopâ¯öÜDç©ÛG�Ý$ŠÍ¡X—ç¯rB%Àí²ï2}<Çuð})Ŧ𥳈·Tö>ùt㸷oñ$ø ÷/[sæ17­*Åê3�É~uÚSï n¬è¯·€¿] ;ç¦V —=a�êþ°Û¦ÁgV¡î]ªäÄá%Ýi�zRš(ê5ò±Wîž\ ¨×á_ÍFþQ7 ¸ñ«ì<ó¬zn÷a�õ^¾Ê[wn üOrÚÒ=÷–žQ™Ñþš>)æS¬Kå´`Íò"ŽT<ãÊÃ#É5pÒêÜk™7KÒë, ÇzƒµþÉsg©þ};`�G0–O²¾¸¨¬åÔâÀõ‘̾íΓ©ÃöÔ)ÕêÇR�¸vâ›'õ‡8Ù)²•i!®¡‰¤Ig§6"HŦ{â2=/eÆÔ ÿŠØ„¡†Þ®UíhÉ `šâ¥UHa¡& ‘#5;ÒDAÔ‘¥’âLô¦rzJ¬Íw –Ž%ðH˜Æ16œB„sš„'zToKĺ‰�Ú¼¢XL£"Q9`r,�$’‚PA!jhCÌ"Ìg9÷üRgíŒjž'Ìá%@6WÉRÈviŒ„‘Юóc�) ëœ‡S$»B©Uñ"†„]SY›½ ±�y¹y&Ð;þ:¬4ÛÒ9Ú”Ë8a�ÜA:âÔj‚—®¾¿¥gÒµ³Ùu¬Öãƒyõ’—lu�T¸×)ºmƒ"Æ I{ÿ?çñl¿³º©WtJÊ%á ˆ26á<ßðÃeRÂ-î\Õ\³‘S ·êÜØÎæ×¤ˆI%l­Á@EËDRÖ¦dúqCŠ`׳Җ§ÏÅ„ª^¤D¥wùsJ{V¼—ÎMˆÏžp§G€ôdd�…RmB†¹S.èv”4ÚNøz7)‰wH´PŠÐ9 /Mn&JC^Í* 9)JHÀÁü²¯úFÿ„̽ öM;•Pƒ* ì`2ë”—2Z@µ- _àÓÖÇ(5t.ÉBnKi€`›!Þ“A¡�µí' à 4˜ØQ�6‰#ö‡(ˆEÔV[^ZAF¶NÆÓ*H…a�KÁŸ© 0,ìê/ ÂNyÖÚFpчvœùú£ª¬+öþxr‰ýùxp®’ž6ïeKh¸âšØ)¡ÓÁ6a¶O1Ü–„ ‡‘èl×|à®cà ¦ÏòÎ~|Ø€ùyŠzÕ"£jr7¾ÖzÊþ>oë3šàq [E5o*õ€Ä“1âãZÁ¯‡�鬞´ìT�I<Ÿ�üe¬c`ïžE´êÛ)·­�_hÕqãm$UõÞ´�ß§k…ßë~G>¤/àoÛKÍOtÏEé§2¤ãAŸšœ¬ækáõPO¿/ ^î“Ë^`Òôm´Rš§vð"µŽ×.È{͵ébÚ¡l=�ü%—Îã¿oâþ)‡)"ÝÌL|'¨K~S7oÅëêÞ¾×ózagÝ]Ð]ƒ±¹á&�¤ºèvê6êï_œÐ9äÆ*^[½Ùª_b®¡4)·ºèHö¾åÜþ¨éòº¯®}oµç­õÓo¸ò>Ú2wOйùKéä¬]óo¶óÅúË0™í‡¡ Æ QŽPý— ݈d²,³Œ�͘Ì*gI‡-#/¼{º?"7„LÆù<[­ò·THû¡VqMéÍÙ•….Œ!Ú –¿q,I ŠM¢ÎIcñ'²`ʘ#Ñz Ásð*~maÅ�Å“—CÄÁ+S)�”tNà©�Ž1!¯ï* å¡CY™v�Ùp•·GK†]åñ~øv…¨6›MjBí4ϵ�ˆfDôZU»)¾x+*†ê]k/415NN4 áÇ$¢)zËtGF»2Œ˜~’{<Ùz¨³Ãø�âe! Ð.Ô š®z¸”ž�‚Æî�èû‚ô¿Ï4êtKÇ×SQ諼ƒú™Þû ^u‹�©¶è‹U�”ç7]çæÎ+ÆjI”Q¡´ÇcŠ7“K(Lý@uRfþšÿ^cügü½èÏ#†¬Ór@>qÚŠ¸ûÁ-ÓZs%XC�.fl|·»Š…!ÕeF—Ðg‹Ë Rù]á)Å‚/ûsÓÄ=áŒÄ•Äcôo•zñ ŽŒñœÝŽ¥ Íè�°ƒRóÑ÷%Œ³ ±Ø¹ë‰TWv›Æ6=ê $’T’Jý¨’ÜüÞ<÷ÇZ¯¢†¨b›©1©Œbi%’¢”„ÈP†1¦i±0ýÐ+ ¤âýÑV•>ãI@Òº+$Òå(~Dˆô˜lýcÑ!$HÃ÷ž—²5Ci ¡¦†Áƒ ´@ƒ×o�H®š­&­÷$p”%†—ƒý�U·s/X6ïÒ¾\y“³wZ�oˆßª† é?Äð}÷úêèßçëp4Û¹G‹ÏÐÕydúÙF(Õ"¬�}Qñ*³¯>Èš?;ÁhµéŠ0ãÎ~¹Yf‚¡öÃ\éèj}÷ï¶ú:ú˜jö©%Ôf°5fÎï›­ò5ü6eú¶UìZAþ$9ôðåé”ã5w ¡ÝveQ篽}•Ð|û9‰Kâ}hèoŽb÷Ë/õÕx.zJ;!ó»·ÓUUžºçÕ½•2!»½]Úò®"¥éžöÕ¿»Óý«Ù!?Œ¥»)óX§½ÏNvµµd¥¿ÉïÎ0º§Û§ì1<@7ˆÖËÈøa¿!ù;qåš|L¿lߣóûql~‹Y?ÛÌ©ç:éäzæû³ÆÞ~ÊÒœúÖñÍÕ¯ÛÑ4Èí²ª'µP‚õ4ëÅ9 çM¢½éPç´Yçn�¨È ÓÁ§¯ÕOrv!O8;´‘ÝãìÕ®8´—ºŽw}© ÛI¾ZxÒpôíȆ½±š\âÙ²ºªöž¾“î"Éý~ÿ5Òð¾ÿq™‡=õy¾•i}å”ÒXǽã}{õßcÄhQ÷çÈóïF |”Ôû^™GäÅ>2fjòT'Ùì'Á›Œ,,�D§kyß�™„Q«DCR^ª´�Ü^M_ÂoÞ+¶–-±Õ­Z‡T0ò%Í‹JVó%ɪ£€«»H£Àº¦—]3lL@¡¶ Š*&¥¬Ü°!¯l¯K&Š$€wjÉwfuÓžÏMå�"O.=+œÃ ¿Í(~½ —†P¨Ä&Ôú>N¬»!ÇË‹ãÒ7üämNLæ�e�H°g\ˆ.†±cå�ï¶ µfì£n™ÞgÓÑa@–fl£z8i¶ã&°pjGñüÏúêÃÏâ&ÚôH×±"!h8Q½Ì­6ŸSS’šqq¡*<Š (Pª&eĪõlëzm358&ù‹TðCõÏ�QÜÔ†}+*S©¬š†!3kªa»±BP�$*úö�‘dÖ_‡Šz¸yí_ÁõRÖ¥¶4]ãZ4TTd}ïrÊ$’Àçù3ýrëýT%:"±ßRûs•W†9ŽCäèd@<âA ~øòA«�Wµº|æ„^˜£ŠiMŸñ͹¼å†“•¤þ¤—1ùˆ{±6:Xc¹FcÏÚÕ0Ãy í¯Ú{×ÁÑg'ktÃ5µ¹³_Æ•–›ØøŠìõêm•pšÆ¾?2lÆ�÷?wa/CË+³Yë¿7S«·œâòžÌ`b²Õ¬)�/%_ô¼F;–}”mZÈÆ¡© $�£Y2Z÷j�dÅw=ñö) Ž"þ"²´Ý*3-™ Á´Éjþ±ÕbC!±§¾YÖbì·¬×kžÕ®8ÛñŒ½á,~¯µB¡n̦3¨Ê#Ô?g)ÍüêÆØÚàâÅ.)yþ?Q�ñgQéí:M¥"0°Sï@C(ÑPh Õa0-›C¤JE)1(Z⌨Úúj?vñKzø™Á©ïMïºAëÛ‡Øç±‚‘V'a¢|"-/«y¶uŸ‚’e}žSŸµ??51”dÈ¹ÈÆÃn�þuŒ›7¾É«,P aþ%Ù$*ß"åCøs!…öÇ’úKÉÄÊtæyµ@ $�a¹í÷.Qå‚ð@ÙÄ«¿f”º¨R´…§gIH$Œ‹d�±ùF?ìª>w0"ôõµÄ¯ºJí;[Nûk­rQºÕ†hÍ9ª„’aÚJt"¢hg]³Ï"z2âÄÄí?'×¼?ZqOÞÚÕtn4ÙË7îö®a¢ºº†5ãz”Š}þ¾+“ÒnaÖËšl¡*ª;�×,9x¿|åßùF9­\–ft#-1ªd3Ò”®–¥¾; öÖˆ²6fóYY)SF•Š7¼ ÎFBP161­)O¸÷ùDyýÙv$uù' kÖ˜íÍþ€Í%𘠀,Æ$ƒèÓö��£€Ù‚½D³�ÌV2�V„�T’ývû íLÖI '<,ÙF Pµ —@'X"ÈhÎP$Œ é,WÈ€_"I|!=Á!Ä$’€z¤¤ÀI„a $¾Z­j×½µ­j×�-¨¨ŠM´Ì)TÔ´m¥›‰¬ª[%)Vh£52*&RflÊF¬‰`ilØ•0Ȧ”ÛJ*˜Ë(š™A¢dMš4––›bÆØlÓKITSSfRÄÙe‹)e¤ÖfÔ•¦ËJ$©fÉšÒ˜”©Yf’Ò62Ô¤˜V[")3iY™ÆKEL´¦É¨´Ä’±±"Æ”´°ÍPLµ*hÑ2R F‹M6™iM›+#£f™ˆ–™S5›(¨Ó6™¶5¢×Ь D!=€� D€B¨„’_ÁÄH~ß�>Õü}_Ϥ3oå½ü«óÏÍ…ÖŽ5¯åps设…<Ÿ!ÙR?¥/Ó'�.8}LÙDȨl“(•£©¤ÂŸm¤èM(}—eLî° z‰ÿS·dGj…6•Ê«¼Ê‰êöÒg(µ%ºØ&Ê!pk$QV¬¯j¹ÄµÌèB|ÿv{µ¨OaÉù„ì õñ �/oç¶Ö³ki­µ²µd¶Õ~/¯÷8õ‡P¬&�¿ØÖŸx(ÿšGègŽ~ÕÕj i m‰@˜ÇíÚÍíî?:цK <üA’N�0ûÅ­RB?›µ¥E~>wáÑÀB4†;E/³¶ †–ˆx×é;“2ä‡h"Nçi!%ø‘玓%U#«n:/6rb~Â=×Í>­ñ±4þ´]køø¨�½ëúÉö @Èž±¯–†ßÖLH±�Ùv*Fª€cºœ ©ÿ¡@-vÜÜSKÄó­Äé‘´ÅÒ¤�²™_)½·cÒÜ®(DFf Q½¬1Çœ ¯ŒÝBßÏ™ÎÒc—¥8 ˆ_@)ˆ¿qRUZ@•XÒÏQ×�²ŠfÌ‹B B{¸ÃIæ×C®ÈRÝj¡s¤[U š67‹g.÷Áƒ>ÃkÃæ…è¨ýFÜb�¼ì]Žj |SQ £T{®Et¢�ô" „ HL£ �N×YÒTúk.�Ãþóëv–·´é;DA;u�öi¼«EŸJhyœõðûX¸ÖND‹’:N3êzgî‡6Ší™ ¶]“yÆÙ“LáV‘hÛ]!áò[L:½?­.D6pfØÜX¯B¤ÜEIA>c[eòõh MéqŒë`Êý¡»� ÆX(V0¸€)‰äV`X md EbQ|Õ‘þŠQÇ)Òî;sË*…Ÿ)RÄ~?Ä*CÕJÄZ÷õ€¨(·Ñ ü+ Ò=`©@Í?ÐÍN™ÞÄB—ø'·6Û|Ò€«¥½³¥E™i…@€À¾¬¶ïwÕ-'©Žð6 Üy.ÏBm'Д7¯Š®mÒø>,}]ey ë¦Ä\¬.x1¢!Z�£ê Q{‘ÞÛõZì ûC!s-²c‡Ü$ÞEqˆ³#r¹~ÊéOcüc,käø!mâÄÉeO&uµë|úÈü;Y´º%TFZ-æ¼¾íÿưàöå%Od2ts ã5¡k¶8†qûÍ ¶Æ ’:‚‹c*€‡ò^É‘"·µï\Àí¡îÝÄÙ¹rg΋E�ïíIÅ*¡IŠ¡âkÖ›,}éY3ĬÁA#ºˆr$Ü0©{(6!áþ²5¥Ònã ¼œcî Xú›¤2B(/ŠF_¿ ¶F*7œ}¬÷×�´»\ÛmÛÕ™èõ4´FIužÒleMì-l–nÚzæ”=�d(‡@©ÒQ7³¨*+Éiic^f™k%Ùc&U•J8Yç·Úúú(Á9›)zf÷]l=iËPÔ+ø¹ãk˜Õp”¿¯€_ÓˆŽìͪײ){ªšz¼}Ë&…=¡7ð×�‚z€Ø¶\.ˆNo¡¤ÅjÞ{ÓÄÖumF‹Â¢ëÞÌ…Wˆ!¿P !{+›(·atêx‹+�ô3u©eR4Ïh‹¯ ]µî×W¬¾»‚WÒ„ 2êkÄUöF,§ÜÚJ誺�Z§4œÖ-%¬jL†²ÊÌNJº®ÖŒ»¡ogK‹xú�] ê1‹Ž4ƒsÎÝ 9‹Õë¤t?‘ðÿ�F9�ßJŸŸ)Ïkë„YñÛR@‚ø0ýÜ•™Ñ[<°ª©�×·Õ¿êç�“ÉlÃOÌÀ„ÿ;ó@Ø[Ö9_–­(Er�¨t)fê£^Õ†9;‘´¯ZûM j̪0Ÿfˆ`©bÔëÙ7Ûž¢Ìô8àÆ ç†\=Gg¬¾ËÙ,x¹¢Njšé;qßž×矘ƒÅ•Ƭõž)�ëOºvæcLjÒ˜6î•]í|ºÎe¤eç_�ø5Åýÿ†÷‡µ$N�µ“æä‹Žáwqh¬?ð÷‡ÆV¤åt¼.bäÎ5’÷‡®Ë–ÕU?‚õ©‘çYkj ˆ†6Y;<ëQh=j¨×äº\d’ê„Bâ�ØÿgÙ�Ò* n�Bã¤�Õ×mD°‚BÕÙ¾qý ¢ðcð3&âšs3È'‚¶M1Pd%I8ÔFÖά‚c- û¬Š!×ÊŸî¯n MGÞæª_ñ!ÉÛyÆ�Mû³çÕn5øï«ˆQìuÔz‚ü„Yà2sÍÜ0h!~ëb©Ï±L�IK㇋�–䚸„8“Êk•:œfNiO]hh�[7º°a®$sLµ†3ã¥lb5¼ÕP¿5¶q{ÜVä¥#_q¾u³Ö¢0Nà“±ÁØï›µdá ǘÒÅŽÆõ«·¥±5ž‚µ¶¼ZùÕ‚Ým)u"¶rª+©.Ùò…‘.–{TÁÇû�HјPÑ!&£ÑCIÜMŽ,$=×êuÿ0T *¥¡�¨ÏüÿAµ^ò<=þíä >Ú �źt¨6LæÒîF=õšÔåã5?½{*\>„„Ÿ6Ç(/föÂ/q}‡)3¿Ÿ˜ �îÎ/ äeñÙGæŠZà,*%3™`¾ZØÓ¥K›çÇ ÔY%Ïëj–ÏkÇZ,âMŽ>4W$¶%ªõAHdSÅEΧd.,¥¢¬âÌ´©ÄRÀZmØ@ç†ÿH2ö3z‘+½uÚRÏ9l„ůaѼ6>ÚoëØùúùcUkïQD,A ËÇ�©KÐ 9¬èÌŠÅ˨0ÉLýs09z�Ë«È,0‚´`Éð©lågÈG˜­ŽìÉœ^³e¹^ÐBªv,%vˆ‹ýéì-6ÄæC;å ¦ËÐ*CX-ÁsâsYK9¾ëy ®ÎŸË¹0ûPâ…®¥g8Çk¸ÆTè†[˜KHêrè»ÐÔþÞsä<'7\)»ô^Ãë>sí0ËI2ñ§AAiW¹&z­úƒqV±‚m!ÜY鯀¹žöqyT•Ñ» aÈ]}æpFÁüz3åå«Öï;ÎpúsZÓ ýØÿ§ø-/U ï“C0a@*dªÔ—u6°1ʶȜ¿¹¤QD}"¸}X·urß¿Uä…R7„™²‰éÖ®?—Òñ«É$¨ˆ ‰bÈ5®÷;Å¢™Ñ�àMÈ]ejdõ+‰+ÆuTÌu‰Tof»0µ ísÕMtÅ`t(RÕ|™æ»:Wf#²‡>W ¢q×î+-[ø«ë$ή/J&J âê=»iörcšíëȯ_” h: †‰�6d½5ckâ¬-!ÆZ¾#Ͻ¶¨j²Ó¶qÅ–6Í3`LÂäD*Ê…b; ¾Œ [+�[ŸC¶²(º!`äF/�¸¨ñc]Üä}¦èäŠëMÛèµNº†o¾\l�Kì‘zaµÀ&üΑ­ŒѾÆSFdÝŽæ�íC@qÅ$¤ F RC€–1²(/nˆ –]Ê=ªH[´–¨†”9ÑÒØVÖ£€4w"ÈÕ?5�î¥Â”Úðr�ÅU^Ö åŠ” ­²Å‘ÏJÜ-–tvº° ’À¤�kÉ÷ ív‘Óo½±Wò•xÅÅ·!(ýëI¬Þƒ†zitáõìISiµÞ�ÔÂRØ«•¯QùSIÙø«�’R)»sÎElœ÷:_lw.`nºEöÊî�|îØW ñ@ÛžÌXá*Ì@ÅஊÐ÷ßl»!Òë�cÒp$X¤�ḣ,e…mä¡î'œ^þ@_Oº3è7ŒûL. ú�ŠÖ ¡¥¯øx?jb&ß— µïdV´Õq”[Ùî†$ña&tåEž9ƒøTöBµ‘ä³BÃÞ¦Q¢eœh†•iŸðÛV±Ìâí#øƒÐØGœ©K�¿‹¼†‡ÝŽ«{úö™’ˆÐ"I«..¾Â Ö)|V®I´tnfw/Qеj˜ßz]ÀжLÈjŠlú8CZ3i*DzIUêÐ9Sap÷¨E™lqT©W¾Úk|ø‹øt�Є$�ïüÖo‡ÞÚ}Aüß若‡møúÑf�ªoýxx=�®;¬ïøïŠ”†Uò„-Á~|mhmÖN@’�¶·_ÍÙñ½}ÿ¼b�α©ãHn�t!2£°•íïûŒõ£”çRB(� @Qýÿœÿo²ŸÜ³è 'ä4Ô h$ˆ"ì÷ªƒhœÉ» ôôÿ�pæ. Ð Ä«ƒ¢rX ;³×œ”a—ÌèÀúpFFñî ”`4Ð0g¼âs#'eD˜Ûc(‰‰”­d£D(PÖfèÅcï‰W¢¿ °ÝÕÝs.–kàï>o>1¡ƒ>!ÇôBHýjúç㮽`Šg=© ÷4%@Dã¯HdÖ d6Çt¢@7N¢ó7l�.Žpòdµbâ×"É ! lCiƒ`îÃíiŸÏ÷ô\:Ö´eú_7‡çú{NÙš.ÇŸÆ™Q�zÁ © ùúƒ®#ñwÛ†Ïf�U�í­øŽöý"~A ¤\ȵ‰Ü‹É�qÃá!_âõ÷¤“äÍ ¹‹‘Lò‘ù^œ§‘ãAôx\À\0ý1Ù…c„ãŸÌýèÎŒŸ¿hB=Šr¿‡ù(‘gü:²�D‚H3üOCŠp`þÅ”+U´Ñ&ˆ±B³¥XE£•�LÓp¤�õjqAßéEò2uš1”:•䜷²–®ÅË¥»Üå  t‘P2ÁÒ¸�‰L1ýèK+-í¾äÎÌgÅýFÝûúY" Çï9sYÞõ™"ãp4Œ7 �i[þJóñ®Ï=ùyêíø_fÝ�rúyÔ‘ü‡°9·^oœ™½¹‚XØ:GfvZÁ½ö§g@–ˆ¹gÀ:º¥$¥ Õ[7A‚¹1ÿrTsú8ôLö®hb í�ÞéãÁÚüñ|:Ñ@y UÉo‡;}ýûÔÄA`P©RY&"[uÅÞNG…;º3„‰ð "öð´k׆00M¥J4K¶ì¼õÏJªA¨)~×T8ÆxðVìßû�À®NàȆè?U7žÂˆAL+={Ôµœ[$!B¯Å7È.|5ž_ †bÂòm­}¹A¯4�†s‡‚½N®ò€!íýUz 7±&®ø±øˆ\8•Ë%b ´KµD²\8w–ùÖÔxTUÏ(>ùÕ‘xÃêU2¢C¨²œÕ¢4SVÚ�:¶šPÜo= ,Ñøæã†Ø¿Áe£ùñˆ&¥ÿE¦ŒT z3•Öb‚¤ õLjYÍY£7>šr?‡‹°š`bÐgu�é¬îVòÕZ·m7Bˆ×ª¬±�÷|“"’xf+ø¯‡c‚i��Írg€–õû K#×¶Êejj8 îV8Y}׺è4@+~[3�`\ö€ÅíŠÒ’m9‹’ý§oD]_þœµ³®¶ê;~ÛÁ„!y+½5:æ•®„5 h³.yðÙÍ5Ä�zß$x醯åPHŒB „4Ö{ÂÑf‚*àèÃÊš¥U϶I [™EÓ|U½L¹jîk^:à¥ÕèŠZ-)`íñn6Ó«ÿ?×ßá Š@Èöñ¤PÁ‰…4&v›ÆKÙ'4 H*¢ixzÕ»z$i œÚðÛ�@.79“‚Ý`,[ûÑç.V© –@%:isá-’0‰ð§ßæw_³íŒó‚ª‡ß“˜:¥l×Q]ÚaWZE²é¨¢?hÿ¾zز˜õIY«?±¿*.ò�è~Ј²д‹s©âd§ñ�ÊrÆ›s!óÉͲ·tw®ÞCÚ„1Å•…Ê>ü~þqqõ—É;C¼`µñšð{»Å­�ýM‘?I�Ã1M<Ï{g!žÂQt¹K Ðû/°îÞ¹$¬ð%tì©’[„k阃g_ÊÞÍ”lžØ�õiκš<~ôh7¶d(À~5©Óò» ¨âŒæ•4ÈhGÌm$V,�‡:•e.mÚŸ¦ÃÚŒ™—âãÊ ê dießß±²’r”njÝÀàXdޤ6ˆc.P5ØZõGÙÚ>ôµ¹89V@f }|Gňǔ(óc,#@ H¿÷y£:×y{�ÕtÀ¦A¾ÙE®wªàùñÔø^^û²‡¶ˆ# 6UÀfÁ•±þ ¥ña„غ}ížÎobñÚGž®œú«Yž7­)vñß $´G0¯‚õý@Ô:Æz¬0‡nÜéPY8äÛwß{S÷~�Ïâš–î3±Ñç{h4™¥×tÀ~‡sê‚Cšáo±CŒqÄÞ6�óu¼ãúLÙxfÇ‘Q›|'ßÎä«¿qÙáê¨ôˆé6/žð5ˆ!XXèp5ê<¶C0‡‚ÅçÛ5g—�f-Lÿ¯Êˆ±}ª€Æ'�¼Ž¾šyQæaÍcFÚ#î².°‘p»an�b^áM©’#1¥­ì@H·‹„°Ÿ J•âš ¥Y…ã=)`lzOdl›õÀo›L+¶‚ÓÇEyUž>‚.§•eh`H-Y�£q/ÏóÞøIPT­ mBSñœ—ÒeJ7ã­ï\}©ƒ†bmZ …¤«2™ý4 @(¶®ÊõïQ×ÂFD>Ü:ŠO³B“‹÷…Òi­3o�FÁ]öšèäÚ­îU�Qº¢•òRf„®¬¥ÕPMy=b0ÒrSÇÉ‘n)"³‘«& â®+"ýnäîÔü`ëŸGçÚT1§ö� ‡à¾ŠûÕßR#Ç/É9ÖÔÑ©1ˆßˆ/˃‰f›™Ï èBߥ7¦J oíi©Ò5�ßÓ 95R~ÛXgÝ-Oô ÂÈnŸê¡LI|ÒŠ~fuN§æì”·§eÜ%w«=F;ª’e`4Š­ ­šÛbߪ/е¼àÅÌçš·­ 2´ÙJlZß5Zêf·nõN„ ÖÀoîã{d¨ú dŒŒ¿¾pðôRÖ¨Au¦ŸlÁ†¶»ý Š�]ƒ#þ\F+�]ŠdT=÷[â^gQÎ"ºþ$’XÌÖÝi<Ô}GyÖzëê¶+´ ‚ÏóPúõ¬Ÿ›S†¡:4ÇíU”�…MTÙÃÜ1>>n. $iI –±Ÿ(IlD Ä4”^öw¦íy‹wK’ò#à @Ͼˆ$¡"ÁÆ,A$Ò#€€‹z+ïÕz¼§þ.z¿û¤úJ“+¡G0�ó¸s\÷þªÿdÄãů¶Æ” ƒDÊ~›§Äý¬C:AQa�±¦ÈF®R?ÃëÚp(º%õb¤&U$tDù>aóž´µ a²m÷5ˆYš³GÓÝjÊúºtÝšð,CZ;®™;´ÿA� ³�#«\³™@w!hÃ9¨Â,ÏIškD'={FR@g�@}rÇX"ï¶øK.Ãþs‘kTAãis.;ZH«Ût¥Ÿ�Çulrf³rX™†¯¸ ÍŠNú5ñÛa5¶'kw‹®F+N÷\>r‚Ïm׈œöÆ;ŽÔd ã¸ðÅÀÈÕÄI1 ·ŠÛm0€&élQ(yJ zÚ±@þ½ÞÜ‘uåï´õ(/°�‹"ºöÁE©K­¹Ó½½‡¾°¾óã{`›ãJ–øè03wB`ŠŸÎï¥8„Ÿ°²†¹óˆ"îç#rA¤lfØEd¢;Îq¶®m»â°'å(*ëtKH�…kUŽ”µœ‹XªƒÔDß*sC ÿ’•ß"EÞR¢�—ð-Œ¡ÙìõB€Zçzs¨T*mµ„Ñ'ç"R,XFãbR«¬.‰˜âVj^ßh±Æ¸kÛ'K–>GN5Km} 0¶£8ÁÛåó›°TS€*öÕœÒÎ#Ý& ‹Y@]xÙ–e3svRrNxøP; gÿï�l/1HÔpŸvML¸óï‰WÙŸ5h\Ù÷8Ç…‹å⪟ëù+¬-öÚ›À‘·aÆÅiš¸åõ^ßuûOüÈ¿L_““åÜbÝÎ;£­†ä¸9¥ôtyâ ¸±Ïh¹Y¬6+ Û“ÙAPVí‰bàÀ*kšã�lÞ­j�ªPПWÿ6jQ ¼›ýõ6wFÖ¶*õžøÐ)ng³I3Љð\�syÆ0´¾ªy¢¬nÆ¥'d zRÂøLêš‹9Ø]ĺo댓i–�Èvœñ¸ÿ¢lv£mñ>mÌ6K\Œzö|H°èb B'>¹§³”÷²Üå=Nö”L¸`4ôˆ§wU•\ÈîÚØQ{–ãìæ |ýÕ�Y7•›sybv[õZ…œD¡µFk<ª£š8jÈn¹‡¹Ê½ý©c´�6¡´å?÷[Œ÷xŠRËÊq@ì'G\n†ÒÍjšûTĺ×ÀO*\šÖ™S¥HPƒ[?0½ ò5‘q¡¹-#}q°— ’Aå½ðëÀ†{v {ÍG›RFÚÄòœG*h¹©‹ÔÀSAWZŠ€™•›êÖ÷Þ\ü%´/º¢T¥ÇãÓU¿ëüäèkßoЭ8®?¶-ìÀóJà=Ò圬‰»‚øUžìF*ãÌü¼¥riàó]zöKçÕ›‹,Ý`_Íg¯Í=šæO?÷¡)û_xtíÅCôú•ÝëqýŒ ©ê§e§ðÀ¥2Ö¦O R w‚Ad„9 ˜¯�éò#p¦“t .T¸f×(áfŽYßñ"›ž,ï«kò> îÒ¢uQINZÕ.ÿE~äý€WÁV²Ê}ÝiA-¦"kjr‡fNÔ‹.ðö‡ O_ˆ(0.éL‘ Zp¨0®ëQj„ÞChÜê §iÙfVnv˜•Ñ䂉ú @Ø‚q-ØÎRß܉]{½U$z¯búAZ¹‚†¢ÃkÖz) \Äå×YÏì¼P-`·¥ñ1d“–TM�+™\Gs‡Oï6åM� æEYhC2¥›ÿ(T2ýÛÌj/‹–ïD™ üß�ªß˜Ð…)#çþþ ¨ÇØq¨R:÷õ¸&­sFí_3ÐÅñ±jÿ¬/"8‰rÇänò©ÑÿrÊá“%Ò7*:SG»Ï"š°þLÿ\~næ´Ÿ>†¾¼^–u¦¼G»&ôY±È!ÝxHíz·¸ì)òùFtpjdeöùÖIvU9©zøe> 5N³”ñqºê,E‹èø‹\ÿ˜ÀÉ“Ä Ðæ¨Èݺ¼¿k›�ÖRÿP͹âþ±NÁÁ,µÔq5–…¦mÔ£›jTà§“ÊHÑ¢/T¾=twÂÉøÎò#yù/—©@ Å²TÃ~<²Àо×zµ�åØ|§ VyÛy ;kM�Œ=7òùÅB�mO=<¼îµôVqʃÞk×q· ¹[îþ2bút�¡çæ[„Ö¢èÓ} R­T"x±íý^%“âþjgJŸ~×ÓïžÒ¾g[NvÏ Ý—ªÀ@EBü0.ËZ¼Ñ×bÔöô gúµ'^6×·T6y³\ Cnzœ6ÕÇ{uP5¤åAl(œ~A×HE1LOÔ¸ )Eæzro† uâ‘cÕ:Æ\!Qó°)¶¡ˆöµSj04ÂIr˜Ù•*Iµ]�U'7�ÀE^—Fœ%óº×7ÕŠ�*”Ð�náã;i$#&sµô�—KL”v¼êÏ�Á¦@LÀÉ=޳Zø}²þá ú€Sy®ôp¹ü?ä'4öúXª#ûüUß+Zì¶hùrÆJi�û-2+b¬Êu…‹yLSõŠ¥·ø®¿ÊÿP)vÚ0º¹ · ⨠õMzD � [!DØcRuL<^º5®HØ÷•Ûÿ6襲¢y9°âm %J·:T€Þ¸‡ÉvÓ™1�ô•s)Û #¡ƒs§\>â,CH°Ž0)+Ä5æ,?%8ÆL;G×Ë·žûWàÖûß¾yÀrŠš(? ¸MœŠŒ\ˆÝæ¨  ŽõÓâÇ$OÝWŸw"òoQ&ÐÈ¢¦ƒ(_¾ôi?·™)íNÁl®„k†°Õ_OuF±V§ÃœXÉ0êU$›Ö(ª÷µÚåûM!œÎ£Å,;¡ö�»«�Éë£ýñúÀv€õ€ÃÇóSÞøs €£#àš*`��£¢B™x…´[ÜyãrÔ}åزi=˜iˆM³:m�«™j Œ’óšE(!]¨ää*T¶yô¹ºÛýhwçë}kß$»¿ï$aµæÌaNU//ˆdAi³x<=ìX¨TïmæšãYÏù®óyΓ�N–9ÚkHÜçò1[T—Ù™*b³!åLüÈȸ™ˆe±^XÉ4È.2Ò†¸­oÓ“‹J‚ÀqÈ`ü¬ámdßì„kX«+Ø—ÁjÊUöS$ÁfnBUšÎÖw0nøD­î‚Y„šÜ»mÝX¦t·S|Ý$˜»­¡ËG’ª¾O U‹¥×EX±¥Xñ\“î©©QQPó¥Ù™ Êm¨Åå*ivyÆŽn—»T2Ý—+ÎPš`m/g—©Ì˼lUª%K ÷sy.N "Ëœb¤ŠÊ¼ÝÊ­h±g+ ˜1̲làl·³¸Á«Ïq¦Ùk*ÖÖiÃ4ÓYðÎúž%[W´¼Ío}k}FǨ­©c™ˆ%D&¨ú*§mË^¼„‹b0Í-]ÙÌ’‘Ï*˜twÝr¢»D(:aÑÛ"T1ZìX›˜»Õªv6ˆæ íMÄ˧6 kMU3„Òi Þ”�¶äù-£8ÒJ;³#9féÕ,lë�¶Ä¶¹„Y3¿[ØÉõNxd—ª‘cgžÕnH×v|iêD†Ì¥f•3—$,ƒ|Eú¢nü[-jšÁin·»éª[æ¸ÚÎôoaˆL8'Âi ÷pn˜m»X(ÉZÇRž¥×†|�àà²XëÝ+›“g�ÅPòk¶'B±NSXÇ.œ¶ªr»ÖàD&æ\ଙ,Î *uÍ‘Fï¤c¬ ˜º‰ÞS3‚+3EBXá!L¥ë£jË瘄xÁÌàA=]«|<ÒLné!1Q‚\]_lŽlgaz‰TÆ¢Ï{×C ˜Zê+e©Ô‚£™Ú›’dšÚ(ñMÓûð2¥å£sJGún„ ÿ?Üϧ±Ó™ô¬‰1/è—ø°Ô§Ó@`*ŽuâbQKy‚•ôñÏó«/Y�ÈZß’m÷:pÓhö|² ��ô×ü ¦¿jØÏ<ÅÍ5µ=™�Þ4çèB·ºa vñཱུ×çâîž•oß”dJ�Æyƒ 5IDO 1ØJŸisvš�‡ ç*’[Þ•5ˆcåjbË]!±ߌ�ö0¤:îqJdeœoz™ uûÿ »„ˆØ¾þí(EÉÔ´Ltk_ü<$~w ÙÚM¶d„ûú 9Š%ïˆÔ=j7 Ú…)!ZÊzaÄ„…TèzšeœÞ—J¸ª {Xv‹áŒzÙħø ”,Íì�cx°kÕO}4:?V¶õ±™˜«Ùt|eÕÌoì^þªôÌ)Óe=lè·ÖÍ[ëdÃó×Îøh7PtóT.q¯gH-Ȧµ‘êÍöÃ8Å|‰«çîwr«– x: Ù1>�Éö[ãÕªñß*ªÞèr2oRmÞBî�th8ƒÍhZŠi´º.ØM³Ó²�«�o1¬ŸZ”ÿ•¡¸Ô V´Îva•ºA•ÇØHp�³Ï²š Š�9ÍÛ�BšØIà’"¡âk£¤WF±–͉¾! Àžµ�.0´}á@E+•�C»cЯiÈðD’s³6/SV/¥©,²ïM¸J´0Yø`M|Â+zÖºq|¼ÞðZÚç¢p6áJ6RÃcžéb‰Eo7fd\[š¾Ôéf@“QZÌ Á™„Á›c ÜÌäjŠVèƒTy¨®dv+™#b÷Kîcq3¼D T¾OYݶBÛ‘œŒ`v�ÚX1�ö.–ä3Ó¡»ŽëUq•Aü{ðÆ«²ôc`Ë6ø¶ÚâÀÆ�!§ð‹A»_Ê2 "ìãA>…Ù"ßip}÷)«®¾î#Þç/ǺY™NxpÓŽ¬sÂ$:cXµ£Í»gÊó’0vÞ3EÂH ŠƒÞ'Hôé˜11AXƒ Æe*6’¡«"ØÐy+p³Êû*«"54Ö’:΢ÈFÂ+®® 3¡¬ûfŽ’àñ‘_tãÞ~©‹ÉÚ¶LAû‘“HÔøbâ:sjÜM¬Ågr­J Ÿdä;ÃiÔ;<Þ±!_5ªC÷侌+ÿ¨Ë8„Ø(Ö:ißg±_ýZ˧ìOÙ*ék›ÂÀ/•Ö•sÇÜ«·ô#Žn$²¯MÝÐ-:¬§ô€¯›ø…éÜE<ÃPåVþ`l}ÒÑxDE€c§dþÆTá™ul–UjhkZåxe\ÂÃ.Î^-Mº\¸û]@‘|&8N %¢ç«e( uhc—Ð×2Ç1Ýt8¶‹ˆ*­ÔBéP·aË™UÆâÔV]m¿,혬c½Ç ¸-ÔolyF\o|˜ºì~µ*äÔïµÇdØuqZœ‰Ù!o݃>Ö•$3ËS±¾_ê�“W­y‹fãr<¯ânŸm¸Ü¹§óQ·/ÏÀýv#ï"?”`Œƒÿ¯øè…©£§ïú®Çóuû,!Q‘ßÀxóË �è¥$ÆTbA˜ ãL&¤ŒqõC×¶æIP@–††`ÀFI%w¨_ºZÞ6_ê™Ï ùp célOF}9KtµeÿŠÎ¦VÎØ·è�ÒevÛBë*|-m27Ê5¥ËY‚%Àü¹¥‚Ï™Aá ¡MB�KÖ)úqj‹ ºz¢h>Õ3@.œv‡MNÍï €Amàw.Ñ�ïCü­à,uE(t¥\›j Y„�nÞȨìàÌúS0XãÍ/BÓ¡ÓušÉ‹W@ µ6cz‡³`Bµ‹�Ëdf1 ºÇ«xãZ¹éTú㺡�_ƒÖ½ƒÐTTB_×¢p*Ý—yåk}³Ÿw<©Ò‚†3÷m´jÄÃLmƒêÑaÄGE4îè¸Æ›’Ͳ±Š6lÒÝ-Z€X¬vuŒ©­ÓI¾ŒU頻âr…SîêÍÊæË‘eÚ–O!žDrÖ½zãy¶ ÙJÀ¥$PNBÏ"y[ 5°©Ù÷¦Fñ4Å¡�.È~§7›ølè3N!ãÉ›¤ t4Õ¥ <ºßèÈ«qÝ­Ês.xNH"…%ÜΡj¹]Î?ôn3…ÿæUk »ÆJvbê¢l6Ã4åÌ€P‹ÖŠãPbbõ×R0b…Ó½¼5]Ü;ûñʱX5ÊóëžÆ4¤j–ÆÏDÖóZÝ9\ÅÆôã|è{,�.#ªÆ;J½ðNœ…Ã7çL¯ËÖ�ðò×KduŠ6ÒÃC×a1pü(¡ìý#­µN×)\8»ÆÒ·1hXâÞ/Øb�&B�‚0ÅÈ…¦²¼nö±`ý¶¥§} àt¥j6­9¥/†®Ì–¸�eßI—TÖãhÖÝ#þµ#•Ø•…)�"ŒH¯©º2•r¹(‘‚‚j$øD-4èTA Ô1JQ�{ ÒúZÒ�®"¯æ)±øi<†?RåvöÞ”³@‘ÏÓkxéô_ä<熹û‘AcÆتVܦEÈY 9Ý'ê ¦,Aûev¿‚Q‚íסÒ.;÷í䯥×Ê/X £ð¥+|P­k3jº”<¶ækSÂc˜·/ê/vw1¶M6ÐØñ :YÒጺ9r8›_‡‹ç²3 •›VŬj…U«ìò~HÝ‚=Í��…‘"y­R¹ñ½g¶°ê|T"l(�g `T-&6ìD¯Ne0/sE¿È�Z¯D‡Ì ã¸ËV·÷¥kå0Aêm¥ íÈ%,ù`µ!‹mà�2AwÄ!ƒ$¶u•ù„n§swž³×æFFÌ0Ë,•¶2¨²ƒ{UØÌâF¨�È�¢9Œ×c&^°¼ã©çŸ/ s7»ëµ jXbW»»@eB ôA;w — Ÿô�Ò6€jnº*6xh.×ÿ%ÂŽW)Qœ&ß»PülRé’z0l°™Œóò ¤T£CõºÏLäÐ  Á´ŠƒCvflß´P·íÊß‘¦ÏûDQ&^�mC�ëÎCR’CF¾£�þHòÛUýñøfÜ©\l¨9R„¬ /KÌ&ý´�B”_íüqÁâE~o P¾íH¤ÍÒ¡Öm’óXºI€‹jiY-º3¼}¼f–p·�ÈdÿËñuü·å°b"¥¬>Ší0‰ùƒ'=ëšU›ßöDò€ã ¤ÿ-€ B 0¸�Þ˜¸AÐA9�aî<={£®ßC‘{'¼À¬Íbà¢Óœ=ùOÖ†F ù•£ø‡TŽ÷ß6º˜PiÀP ¹S°n`«Y9,sÌ0Ž÷8‹Nò1šR™B(x¦ ¼<‡lk�Œ K:Å4ºŸ‚ªÒi&°Ùýþä;ÂÕõ y¸­¬V2o�ð|MÉ ìÛ¤ÿè£�–ä0ÏìÚ¢©Z8§º)£g £ Að¶ÿ=›�Æ“K3¿T)© yȨðïzùgŽÊ®Ô{`0ûû÷×›¬ÑÓçÒ§‡æKwê‘ÐdDLf‰£3Çâfo´ kÉ{ýl2-º°äw»„¼êìíUÓ­_|E–@xIž…�«C ÐýÕ‡¼@Ó.×í·mþó÷ÞùPóc,ÊÖ]O×ç_ŠÁºüe5å”07žWÿtÓö.ØÀð±‚C¥Ÿ†c‚�Eït6Dðƒ’¸#�$½xøqGü™#DYœÐ‘ØÙœÛC m|LðÔ%×Ú)ü™AèÒàa[øg�« ¡×âñÖð¢Ýs5·ð'—þF²ú§ô·‹þÚfV ["XD…=Úñ¡,WxNFäaqT®ÍK^¸O}éW´ ]\W@ʦP‚pÚ’¢yr#�µ«áLTIs2ß-H uË8s”9`Î4X.ù>\ë/¸œìOŒ*×¶=ï:²Uï„z•滯…m²FAÃ:WšMªZå©úã³{ºë.ó–ÖºéW?V:±µWOùæ4µ ÄzŠYÐÙ¡•8*˜U�0MÔÏ3@°×HÒ’,F¯P6¦ÜKîkJäóS�ôpf#Î×7¸Ì˃(DCfÎ ÍÏ~Ñ8…ŒeÏ„WU©´gŸ{+2�ºÆÃ ŽiÔg©Š.iQkþ=êÇ“’aÀ["Ö°U©vý#{ä>ĬPfµoVzGGL›+˜”Ø8ÍF5¯å44/P0Z êÆFcʨî';]÷¶ú¸ºðÉ�"îͼ— [ØÉ²µ�´ã{–¹î\>mV¢‹]aöFPºîXØf�ºªYÆ)$eHÿ•|ÚîÇv“ Q¾ì,oXg¨Þ­JÊóàã0dcÜú-}Xê­¹–»’�Éá+�ÿèùlN¦¹ô$$�þéïýáHÕxéË+pø—Û쇓qlóhÕRÞ›X êèj°`©ƒ5ü_³ L&ö¿¯ SEN•ˆ˜�šÐ—Ävkžz¹»éãCÁ¥o½sÿÐó-ϳDÊ;3Δˆ�ñRàv�zp1 oÍöåÚ·-NŠx–- >c¨64W`u� Íôt¦?oƒ›P½sTdâ�*ú7bïj-¾_K"`YµŒ¼\IÚ,ÕÏApºe&!ld”+ÐèEjƒÁ½6ªÇï'E[,=+þŸ+C¡ ^1Éc\åEvu-À)¥ìî;5JO¬T:}Œ%_ò¨óÐ-gip�tj�B©>!%Ý/–´¬®ÀŽjuîvL:ü*g@a©°*‡_BÙ=‡.ä‹4|бZ xîŒt †G~úézF�i€ jù­±´0¦ÿôê“�lºÝí«TEpôÑÒttæ°Õã!8õ¨ °«pövª6z׊�e‡Jˆw¢v…K”Î6Y/ÑQ>3ã`ô=ZïY�oC`x©LWÙ3n`Š-Bâ3øLÍö£-¢Ó5²È·L¸…Šç‡åŒ6@¢af|å.½ëýúËànðSøDqáb9CÝÃÚSµë’(b<¯bF%Á“£tÅ›9ß –ä� ¼,™ÉȨvÅ|%š‰St°æÖè|Âé>=>놂etm+]»Ökï~ožÿ�ó~\c×`d ¯O¿xÌ­f¶ñ[ÈK¢…:ÜzÈRu‘%D. È¿ju»~•ÛZø«»X•]ù¼¡b–)øNemª+R;Œ‘ð¢æw…QÕ_õá_ªÔï1žÏPÎZÌ«¤Sï?Þe‚ƒ”áí”'À˯^ûÁ÷ÕøÆ‚Û7çê¼Ú¨HSÅî°þ§þßÁ:KšpUuÅ+Ú:¦�•Þ AŒlcmvM¾{A³F1,:Ì*­–2Ì_› ¡Þå×ùÎw“ã£kŠÝeÛi³á‘îɨH2µXål²Å/€�cd ™_-QË&K¨¯û>3–´-�ÚeþW!+:(\YÏ £‚‹3š’âõ¯&ÐM‘*óX8pæ“ùß­FhTÕx/X�YË´@ên9ŒÕk'‡Å( vx¬Ëõ–\’yœŒ�kÔ²Õ|Y�œ� TÜøËy‡Àa¥åîpo¦'ù¢@eH°”B ³,Õò£‡ ›˜¥� `×3ûq›¬åDoºš½ðãåUF' •­-šïq“V—ãã9Õ·½Ð£Ðç2çq5ˆÕ«Ï1æ�fùLÉ\­µ¨÷�èëeÚô5Ð…³$e›žër�$ñZðþ%®G™—zæ8XŒdµ"QV/œ.Fް̦E~˜×ì 3AK- ¿p·1Ѫ£èr›ziã-]÷ ×v† " ”kdèClï^`AW4½‘;|ý—ÇFï[îõr˜Ä5ߵɆvDÉž¦öMÞµnxLWì\×yôŸ¹Œ�X©}´>›ð„Œì–Aä”XÍrÃe¯jÖ2FE FYƼ²+y€yåqÆE«D'#! „M0V"‹‹1¶$ùm…ZÇ‹–k©¡n»¢º•ýÿ�Öa8š %% GUk«è5 –^û“�Y!5«%µþÞ$Aƒ0`7w]W­ Qÿª(þ^Û<­=®€¹½7á}ñÓ‚ÿd\ì'D9Qœ9ÜbÚÉ`€«ïx2,òÃU j[•É ºbN¦iÛγ®Þ™ªΟX‡ÈÑJÞ±{s™¶Q±¾Ö»»¨ÿ"k¡’T­KOã&!ûKaÎ 2ø6Ã÷g œuç�][×&hÑê.�×PóÖHxv¦—6I¼aíd8mîûÜë"]Ñ÷ÕUº Ös¼ï6Þ cŒ† ’¯+¢°V.|ÿaÞ¬2ÕK‹nð~ÊyËÀÝ<“ì·­lQÀàyÿg½.‘’)‘:Ì/Gïl ø]ŒU¨gIÒР�®øO(‰jÉ\`q9f•Í�‰«ÙrÀj–SÕ‚1.2¥*b^á+Þ@q¼×mø­v!#\6Á ÕEjØ/KÑ5ï%ÆiÓ=(ÅqÁÉb¾9æìU{Öl[ʧì¶wWIÊ–ÊÈÒ¥aU׫[Þ9â¶×V�gœ-çdQu÷Å`DWëÊ£<·p±€©}L6qºßYD³´ä‰ÐñJa°%‰õb�'ŽRÍоßVm|šÈ‡ÄU6UêEJXeA*†ÇÔ%dÎXUÊÎD˜©Er„V+‘‹‡hV® 9kËz¸��^[y;T‰Úû‡¶U±£fD.ÞÉïSžŠh(¼MtB¸dõXU¹7>ëþXsÛº½`ó–å¯ßyßo¹;3½ÌWêm£/�瘷„ƒToNõâdíÉØŠï-¹$e¶×…GªI!D¹¶ÃÚX&­³öõ¥"� r»¥´‹kE®Ø‹ºU�Ä.­vmÂØþ0× Ýæû€£ÍE­pÖˆ¢Á˜;¢–E°ã(U0¼JÇL�5Á¥6V¦MâRØ:E¸�ØXáŒ}Úg8Ö›"#LkXxf9ø“F»µÈñ©Å³;² lÇ¡zÆo'¯9«ú÷(¥Jã­ÒoŸ{Hµë4± Yk?wkŒ(Õý!eŽoNºV&+ãÛ ~û¶Î[„öÇ�Ä1¡I¾V˜ì,Ïk~XT†õ{�)~nú"B©TQ?ËÑnw·­’ßÎüÙzŽÓ„¸Áx(A=6v!¬_Úd�(ïý€&·.?Z8/Vé…cï[{î^yaÏ”\FÈŠmöKZ##*ô0dwl'Á±óµþ�v|@¯š6ŒQ9/¡Üò1â{ H…ÑÑ!ƒ¹‰Ä””žùs:ÔÔäÓH#¤øï4}'eP†1M(ä¯Ñ[W;ý­h˜ëùš;Ž%*hÙ_s 0ù|¯²£Âw´v_“ñ䡬;Òð+ô~rßM:3eÚžQx·ã”„”/uq±sýÓ·æ>þÚ.ü�-„Oy† Z‡µàÅgZ¸¯ÕÞDx„p*3¼«½v4׎$’YÛ“|ñnc»Ö´5©w’Ø‘ð™}nJxŸÑ£4A.¡ï0*/Ѱ�ÅqP2T·èG.do•Vlõ¸L^ù¾ã­ï=ÙsTÎýŠï¯%\éð»¤Ö¶FüájX‹ÛŸE¾ Óª|çLžwÍ8’“8õoöˆ>™»ÀS÷ÕÆTQ×{‹W_ �Yé˜ðÃåò@¯Æl¶ùÎS8°‰¤ŽÚ —Ÿ/¤ô¡ï9)I}fðÁh7k}>y|� …3¥/‘Œxn¸ÕôÑ�ƒø¥6T?TÆ=”_æ�g mØàjÑüx³0 OŒðváÞØåîD#§Óhzì´u%ç˦õÌ£(`nu¯ãÀA²s½ÞN‘¼Šsnmmúbäk®ºKjhKy3½·ÏÚ‘#ß*¬=FY­£´«óá™±`w(bK³ ‰â�FS·2Æ–üõ"Ù›÷…ViÞ§QÓ; Ε·fy`töhц¤k–~-½¡hÅáæð¯¨3DÛM4ëïñÇÛûÇ¥íúíJRñýß_3]¾ýÿãqàÈœ€Gšºÿ(ª1¨UN02BzdŒ¿¯Í•�Ô/ô$�°|þs;µ¶�~_8)ÐÝx$ � ¦ÙpðdšAÉjëÇ´…ìRŸ¸ò@3 W¿ÑëÖ8Õ~ nhG Ýӽ߷տ‚�û“"A¥rðqÚ=ùÁÎñèÒ,’õÞ@�‰îÁ¤ »1]ŠZ–Ó¬@få0z@Vk Kd ¡kIg˜WÕL˜«Šm²ð@ê'Ô 4Á�“‚}/%`ÁË!¦„Ýk/ëÖ�¾³çiqµWRX6Ö ÕFϰ¤”¹ª0a¸1M÷'ÿ ÓjS%è+6RÍYhKŠ«‡¬µk!ÉÏ;³ÖÄ›‚LX-Žo†WWiyg›º6“P·¼ë% ø“©d§þZåìÒ ûÝ™)-w¨¾Võý ÷ß<ør8†xç³4;|íYf¥­ém{¥¾%¿/TW®�›/ØÙ<ÙÖ·ùë½W³¦á²³„\šmî]U°b¢Ë.æâëðNyÓ6zk›ÛŽa֦Ȗ|Í�µNý´¤ Ž<¾Ú¿7 êaÎ�›<ïh®¸*¬qìûZ¿õ¬ùë;%€\m^»¥õ5%Õ]4�Ûƒ›Êk¸m¹gE1½)£+©pUf/°Ú£žë4nTíOÝg“ÍUIËZÛÜvòBß!?–øÅvÔzÿ†ÿÏhPÐÍ¡ö¥;hI_ ÐØ–¥tZ ûV’^÷ô… ¼ñýZ.ÂGõõÕ>_ǃÏs¦HÙÄL¯ÄCcþb;ÁkÒr÷Ñáë<™œþ©ë_§æOÌþ=R¿¯¦Ð8#Ú~ x“ ¢-ÔÎp•“ ïiQyŸ#¬Áì8¼@”¡Ïù:Å3ŒSSãÒ÷ô¡J<Žhö¶…ØËí==Ú$ëŸÂ”ŠÁñ± É®(ƒFid !+Iª×ããf>©ÃNyò‚[êåó[xáqµÅBlyéÀS'Áß:•F †¨Ï0¶¶”r\”®ÔÂ.üú¥´tz ßÊ¡La#D)»t^DÒžÖÐüµüÝ΃£ôe·1àSQhl(¹ýpOc dÃÔ¿Pr)À�qQe,çc7ôÐÝQµÐ=øZ­kJ‹l ífùIláiOÂôÂ�2 íCÞh…ÛZJR '"§ìs2æ*\¸ºS,Õ¾ëbìEŽjx¹�dŽlykP,g6)æxAKL¼'Êjr ouÞõ0�‘ìû<룱£Àt1ýd}ªçÖjšáTÙ]Ì®±Eí:@�8Çx0@dE�Û+Ú‹b2tA–OA�]Q„zc€ÃÀ+öB˜ðñܲLÐê’'˜Ì�bœØeþkž¹3#$Á•Ü0H\�i.ÚDež­i߆<©Ü³#ž ½v÷¾».Jø_èNõ­ÂM÷*wW}šçÆI·=us†�¶ZÌãÌ=€„3Ñd…®”�8U(`â�µ/l€�3ÿµí‘¢ ôÜ Ú‘þ@ÅM¹7¥.@ò(,c€‘êµqѽuþS/!�Ô�R‘ef08{ÏÒdÐQ ­‡êY�­°ÇŽÉdkÆ/á",ä(%dŽ˜LM(²Ð§ t+%‹f$L`,Š2Šk+oå(¥n°v–91ÂÅtZP:žSµ,îØ¢ðH™ûãÄgÚ-#½ñz‚¦òˆ¾;ÿÒÁ‡Ð‹úQ4IûÜšÐÅ,¶µ²En’–YôÄrªÊhë‹c¤Up²¶D¬ôs­Ø:bgþ€«ÖEÀËoêþb¡Àª–äW”wØ„ô’ZÉjÛN‹EéánåñV°bßjÜC»\Zðë9­†ùž$U11Á/ª‰þ>ØòWáÏ‘Ë�vª‘N„1{T¦ílLõ‚R …¦œWV÷q]‚;%Φx{É ¥¢L~ARý­Ø¼R©ù¿oSç+m¸¯DÝ ªÓýE(Múøañ‚,æ¦Â�eß§§Eì]’Mûž Í.AÄUHwÊÜ\�,·šÖî5‡g¯- ±&¸‘V {ml&é2Îãvãb…Q‹|¬Ì±Í.�=723i #©Ó³<Ê�®8œm�ç#¹àɱͳt6Ù­[_KmM^Ü®ûÙÌÍÉTïK‡7¶kšèK¥L�àŒw¶Hëqs’mšçÇS$øÝy!+«n- ¤½QX7ÌV*e½Æ:WΊ¯}»æ¶Vøßp†Ö–MdІ(] iü>܉¶WÎWv3ýaR�b‹LT\HE¥èh•3¬#|âA‹ðNS:ÄÆìÖ�Qs©°²ªJ 2²¦ˆ=3W‚* ým¥æl?`Å‚� A¦u·a×…ßGS0Y˜"ÈBC¯ ûwÅjÒ2°B°å…:6ÞÍ‹u:Ò+³ÃÛ!}s¶÷jŠ�Ž«Í àV©µ¶ÙV�aùLÍ]!¿Õ‘¦4Ùâÿx¹¶| Ù¬ÞýÑÀÜ­X�9�ÏjÒSNމ�5¨È¼ n|Ça `jÇ48ÍkKP§(Õ�ñ*mFA$ø¼Á…B“”TeªKMË@ckI 2éECQ‹4˜QÃÍF´è‡‡²Xí•v¨S¯k r׿2ÔŽCíÃM(Xø ¢½s±•ø,ÇͶÅë#ÔÐäVv°`Üg׿ø�ï1Õ¾áЊF±Yý±ryÊI:­T�(ØA’5w_m¹�ëG‘#ÁûY皣$äP¾¥ª£à[*×TqAÝl#Yí!ÀîX gCŬISE:Å(Æùâþ‡ é^[�Ö (´:‰wçÖxbz'}a{ÞM ‡N+â_�èýËøÁ‰°–Ÿn#xj¡£P’܈Øäã_ì©…p…d�除©±û÷¥ußš×ìÅ ¬…¼Ž” 8í�D–Bj_âÈþhDÄŽ ²X’¡�P•ìè&�äH¤ÃÚÃ+‡«!ÏÇÍs=X×òÂÅŽw`�N´(DàV´}Å  Ø\è½éàB=•W+[~t%‚²Ô†‡š—G]ºïï£*—µƒØZ™óoÓ¥M’ÝÙËZìÅSxÖÀ\“+˜Ðå3‘ã¥^¶8*¬1Û'.©¦×nîcuÔÄ�ŠŒ¹Ö9—ÅÛ~ê,’Z�Û�ö"�îÇ£Ÿ”¤�p›eŠ7suöŒi“˜õµ[!²È¼+Û笹õ!]úhBÜÄõ�Üî^­ÕmÉ^CÄP¤nòÈT’í»OîEq%«6Ò*P¦Þ 1¦ >ZD&FÈ0šŸ?5±à$¡½Õ±H0ÚGÍ®I, mB[ oI÷Ÿðº®*ˆ‚Ñ™�µÉU sV!Jfί|̵q<{ Ï"ZÀ¸eÓ5gê…‘t6jCj`¹1VtrXEŽ3Âéž°%³…(ú,XŒ¤’,Q¢1‰r@£§¾.%†ÞòׄßcO›ˆÉ•‹55æMJîð¬&0ùU—²îqh[ÞöuDTÛ¥U𩉲±²Û† s‡¸&ÁÑ­O3®,¼¿O5î¼7ÜmÒ!¼îòØ­)K üæ0ð’š ›;I!eq bô°‡½—y;Ž4üÖÇÎ/']+¾ùlÜ^–‹Í3KIõIýBËÏ{ËëøõÜ$æ+­k Î5ö[ÃB,fó%18‡æF§=°�'€‘�âqÅSžt#<»^]üÖª1&×{­ì12×Ô–,Žm»RlÂwÆã DÝÆÑqž‘Ìk&MryÈã\ ÓÙкÝÏP" FeùÚ}ØswËzá‡uUVgAêY§ÆU"Ø ¾ÈIÌ}ÍOZS¢'y«Ë¥m_+—“îµ.p­.üDU0Éhtñ¥¤YÄÆx·m½od¹mFxqcbdÑlÍòfâN¬ÁN©ÅÃd�É݉2¡žÎ+´J¬Zt¹…æ¯|>«†„'pµÏ6Ϲ0‡k©D¿ãqD“·oœ8Gx[�å_3)R3¬åX*t†±X-œê§žÍÄ p®ü0Íq¦"Î$;½§� ©ijòȵ4e½jòiT\^C:av²÷¥yS¨½°­œJ†ª¾ àÉö»D«àJ¼¹‡Qgã«�S3P‡~.Žft�$2hÇn®y‘¸e6š· Ý`禮åзÌmlæ·x3¶w'“»’=€hö¢c¨“ZY¨ÝCoZ<ð©eÝó >UÇej!³†â²I·tž',wÊ÷'B{–Ú–FCÓB¶w™i<ÔN:ØÁ±<›�‹F+]G`ùUrFÓ$j”Ak˜¸ÕNÇyyªâxñ âCu�Ç>ë�ƒ•]QãQÇ{s<õŽgMÚÜ·vÐ6®T’y¬ÂarJÓ7 ¬ÉÏGF¦˜¯__QRñž¸ÊøcàªÇ/³Ù÷›oîÝ/„¿ RSñ*‡%ªï½ÖÕÓϲÑG£ê¾®k¯ô·þ˜b‚Ij/~M�d…ï§ŽÂ)þUÖÏj|p *>'ÅâÊí"üpí<éë6½ßêkˆ0‡³£4aw_âÉümõ.)#­®Bk!†L5ô¶ñéõ fÎF÷ "÷–L¯ý1Ú¼±IQ¸˜IOƒI ”Šãï3­$wPQ�1ÓÚÅ”ö¤éèÿÞãáaÕqI¯Ùß#Ü�35ã#*øû~>úþsŠ^H»š~’ ñl˜S•ÿ¹ãlïšž8ú¢Óz{Óm"”ŠBšQ\Î.ð’zÐ|jˆ­Ø­tÕ†S Åê´ÿÀ2ÁˆáP^Š*]í¶ÓŒ™Î Ń 6í“gE¼>ª o Ùù;ÿÍjõ6¼l®í§¨Ô#Žšù³…&E¸ë/³oí}‡u¼…³l* W�ÕÌ˵°; È]?ÁÁG—†JɳÄÖšel0Y4Â�f’1ü&¦(8“ "#ûõ!䌓iH”·ñ-ü÷-¯ß;üèux6,2‘ôçî Ò‰CþæÖ]%67Çß*%,�¬c¬ ˆ(á¾n˜~ž¯uØ}dñØ‘º9hzU;Þ¨®m{äÎ9[:�7Y.ýTRë…² bœÛ‹JÛh¶4¨°0ûbÖÅÐ¥Ã+ÿ‡r Q†i¾}¬kxÕn V| ïz¶u` „)ÎScqs¨2'[T6Ÿi¼-zr“Í“–Úï:!LԂฉöûªú•Ðîê¸ ¢å£ìÏbK—|gÌ8Øi»•—)£µU/[`Ÿk±‰êT¥áFb…J˜ÀA#K4j ½t² ’¢µÆG“ôvsM˜­… D@©øØ�å]”c”Vé°ÿ‘¶R¥ˆ7BW̾ AàØ(rU5�©“?WþÿÆ+ð~®ó‘ÏT¨Ùb’óð_Ít£Å;4l3ÚVõ8:7rðÚä•í«2„AJ�ñ]²®.ý–°Ý÷låê1u1’ ‘…ïÜjcïIÖoÙž�6\〽[8“ccèî0Í„ß&ÞŠÝüž/x¼š¾ø×[â½¥…Y£ŒçŽ¢‡ÎN,alú<ûaUK×Ç3*ºŒÊU#+s8®Œ†ü¬Åxn¦£5½k˜Ö6ªHã†8üÊ÷ø•«š!u9gÔ_T�·`x;Ûêõ­˜‘½TŠˆ,,+”ˆµýRÛS¸åÅïD&Ùm†4ººÞC„[á{’PÛúª™¯ ¼IšÓÎ9ÑÅÍm|h­PReæ‘̶U“ºS:±K)‹­H±G”#ƒ¾²(ž½bÍÏÚ�eØ!=S<Úi�‰è処Û!CÉÒ´®yhWfvÐѶ<šEÊÜu¾{i9(«»f�ÓC§:Væ)”iç±»Cl)]´.JœøÎ`—NJa†ùqJ4ï\Qì0ÁS pÒåHK¬E|»qó‚¿áª\¤ô?µã.j¿93~Ä3ÉaÞ8'>즶™0#–sý‰§î¢«rµï]ÿoN„¼åJ¬™î7�æ×¸’MÓÑtÝmÔã _M*42ý…æñø;Ø­®÷7â,]ÖØIz^úÓcùØbÎ=ž]q™ßc©ÌÔž½¹-vÐ{<#ů›Ýï›Õ*‚süÏ�Ò†ÓÁ¶êk¿+ž7qy¿HGƒ5Q·ïhXÇ1½Æ£X*«Ld[uÊd1§z‡Žèím!A³}VÖ±>#åmÚ‹`ùmÜð=ØoVåNÊI BZ67=õÄÉ‚ÅbÙ¿.:õyFž+ðG%™èÀ(“ôa‹§;áM®¶it™ÓÞn ð°Vó$oÀÅ®� µ–¼öòµÚ>ñÎÒBŠàÿ5ÒÖê„,å3ÔïåæfFËXp—l@Að/8©•ôð9ÒûV]lnù#¬×µ9×-m†vNIÚtw;?K6­”ÇMiR³h<ï.²Aˆ‹hy%Þ6®Uh¸,0töP�øª3`äÜ‹ØÏlìw £ ÙŸÚqÉ×µÞ%\sr�*)‘8ß³3œ?5½ì»ˆÃŠëáÍ癋®Zx:òåCk ƒé˜ ‰GÙãE9} Ã8-™�aÏ�‰´ð)I:‚>+‚_�;Q¼´pÖåú5<%[W‹“ø•`Ý×ße/iÎöHKó¯Ò›©!˜-ÔáH�®Ízï±ÅǦÅ&¶ÄæÒ+ÈZÛ&¯i>‹�Ú傲¯ÜdãLg¯ £Y°�%®E*lX'Ñã*Õ&/3`q€’á/®¾^3c¥ÞŸÌÆ?…Ñ+ÓÎ7K5y¶?Rø®jÇRx «¡/ðþ³Æ�Ù¥[½ʅݫÇ~Œm”&mŽn{ƒÇ'/¨ ¶ÑKY“‚Æ7± z¦¬Pej†Ôa­|T� ª¸¼ZÒÕ¥)Öò{�ìMÕ @›·ë¿G[=ƒî«5®‹ Ö?oža¾FVާ‚´ül½‘ÓÆž[K®ã|ùü5–Fp=Ï»ƒšƒ®ýiñÞA×IÕ‹»:»“ùPiSÂ{dzT¢q,*}¾8/Ü#”OÈØ¹ò#�v’¢°Òöâ óî ›ã%‡Äfý&úòÅÓÀ÷þ1¶E‘‚lª6¡{Ì ‰ƒRPN|G¼!Ê(Ñ3ÔÊàmÙZÕìb®Å–ñ´¥Øk…9/âsmþg «x~MÌ?Jaþîm\Gðê—KMÛ›õk¬ßR_fw„{’æ £õ�¢§O:ШԿÀ¾@¹¿Ö$@*ˆÀ¹?ñë_é[cœÍYŸÄÁ´~¢ðÓ.ââmR²5{ÃvÅ¥šZ6Môd÷‡«¬<Ôe5•HåwdÕËw ×ÚŽoÕ‚‰Ù+¨~µT¢ª­ø°Ùk˜ø=Ýõ}Í0Eú3û/A$ ‡ÅKpë÷CËZ*Í�]cQá«–ék¿q:°ˆÕ:½ß p‰–òœåAidX'-Iβ]±_%ÙÁÙ…¢ö²jaî„‘‹fñ4¥f´;øtYj·:ß�ŠbÛqµwª\eÕ¢Ã'¢dßÚ„•oÍLɉ. �TqúÆüBE8Ô1a.V, (Ä¢1ÕðGüÐlûK­6¦58k@^Zd­ñ_(WBŸ‘Ñâ4Bàzåx) ð3_»u¬*|(ÑÝ�NnvÓBc[*“Ê•¼¶BÛ‰ðáVq”€àŽò¬.9”öº.cMo”ìOLTЊ«\ä†ìh}«Xh쥋ùl×—Ëðn&›ɉÔ;)w"–Û4ëNk<‹bìÖÎí7Ÿ�uå‰-þÔܾ‡?(Yü=�ß°”¬˜!%öñˆ€¤ö4%W‡ù ‘ÌS>¼ê‹e²+KO=´½ÁŒ¾˜¦ÿ)O1|ÇææõªžŒÞvã)úƒå æ7¹Ko”Šë3®»,kRk…5kvª–#c]iÏjÞ(…¢åÁ<±¹’çõáÈ ëÛîCÈ\Œé³ñ.x¡k‘Ç�yÿ€˜ñÓC áiS6*k.GÜU ÕmÝö¶¦�X©ÒÚè%á b§‚éé‚�¼�È\¸^qÔ¢±ŒÝœXš ˆî�¼Å5ö[ÌTsR}ò׊ƒz‘ haµ›òå e× êÑ[!Ml-Ès¼˜^öîZL”!ß‹d<%ô¢¨•tàT¢ÏD]‚ãåS§‰k�å|Þ|¥>êÁÏ|¾°ª»ÝÖ¦JÔtw­:눳·~.i^ЦãÖÒå|57¥üúnÿ !Ó /Áà‚;˜ÛTMË]zú�Él‘×Û¯Ýfvò½9"xÎO‡›áÓ÷ü5cÑ‘¤š0×ês"0feüy½qI" þ´[};ø5æSRfN�¹`ÿe_|l§äÅ‘Ú=�”àØŒ¹-d”!i ùß~ :³|“ÚØ9j{�AÂa€AF�#‡ýEÊq4ßý‡úÚx2qâÓAH¡LýÐáÇúŒ4×C]0º™4õ«ÝTž• w-7þnc”Þl™P8Ëf×J39ÔZ– /µ��•iXGYˈål�¬òø,þá(|�è�joÄðRÜÖͽ²l-΃ ˆÆF1u@ƒVµ‹úÖ�x:%P‡íù¸ÿÞ�µ üµÇIƒd-�æá„'s}Ä'«ê­ Æ*®BÑazQ-Ñ@“b}ÖL¨f¹OG<ÖQœîå9ÿÛp¬W{)ÀÙÿ!º+Áa㨋Ċɖ¥ý¥.õL'ž õƒh1—oÄ¡À›5Y-€0C5ݵ› N2¸^Ö3c†ÑºÊÖ@ªñM,ŽrZ©õp‚#“,6EùÚž'¨'m=QÅgì<3+kÔó6k%ñ …žö¸‡ã×>¾˃osN|{CÄ8¾§â/ã’Dæýù‘tþgûM@v³m¾¢â.á¼C…ª·+$¦¢d\9•I%µW:Ünhn ™]†§}áê:U·÷Ow·‰¿¼ì¬lr‹z©YûóV©�xr ]c ¡Ò÷¼Id5%… jk½<|ÌÛ¶¹¢Ò.Z…œ¯U,6ZøE䉡Zdá5"ê:åžÐX!AԼцIŽvs³#� ‡½êRs�Dí—ê~=´_ãTb24há‡l[�Z4iý)?X9t܈”L—ƒBŽò÷+C%ñ«ôCA.ä —€kAöHä¿ÊsVáá*žð¶á$ŤŸ÷T8�”^Ó:"ˆ 5÷»kãX OD$ϲW^eV0W~©1‘Ç<ôúiUu÷lÎA_Kê××ÅÞ‹ç„‘ǰD �»�ivoÚÊ�Mö®ºt÷? ÌzÚ›ïÅîøÙšÇQc¬ÿÖ ª3üˆ%¢ÏkÖ$µéšÖHR·±l+(*IkTÚQ* ŽèôMÿÑkÜBì…Åå6ÚÒ×TyUÖó½Èµ#®-ÎIGÆ¢{y%ØUîáÔÌŠø)¹„R…5‹°ÔdÍ—ÛJ¤†Œ*M,ƒàøë!MI °C*;H´sÎüä�.(Bž‘b/x§DÜp‹ë¿‚3�»[-Ü€âN‘ͺäÙwžÍ•Ï „š4_-þi$÷PapÁ­Å¢§‹æ·züÉ”�ÿ€�âÏâ1þV¡2Ëî¿ÿ¸9«ê¤0DvœŽ²ÃÝÍnuó¬¹{[“W[2¯Öª¦7¦Å­Ælã)·{Ê9!nO-gˆè“ {&ðÃSXl=p(�]ƒóTm(_Ä€úœ»è0¬Ö%¿-÷5 ï��Οۘ’ö;ëSš徯*ÎÓ|rp¼µc:Œc3¦)bl�ïå…­C¶Ö£¡ dXõÞæ³­+žoœì[q¢…O¦Òeá֣ޠÒ�(õòë{o½*ª?ãàjvŽWn÷¦±�dÔ¼ vøæGžEžˆ¡Xª'澬8-UFOHŒ¦Ä>dd"Y )¡Dù&í^ØÀŽZä¶ê‡ó~{sh``·Y ö×ѪÒìÖûbÃs¥”£çÉtÍ"U‡Ä<ÃgÍ_v÷þeþ¨(î %„ ZùLwʃóv’¯º$@ӽЮ$ ÖøÛr¸Z â¡úè…!ޏmÚÜìNd¦eE[ÁߎÄ�ñúî묘Í{Ïú)ñëœOfÙè±H_5pôÔH«’'�pG"½3ÌÐk¶åZ˜Gþ†.ÑŒ6ƒœ�Øе퉯F¼3E…îw³1éœ3QÙßlC¤)#ú¯w»Gc#ÕÂ\v¹¾š=±Ûx¨©ß)5Lci¬¡g•øÙíÔ_xXïEo…ŠŠ"n|áxÀ²sÏ+E‚¤5P­†K6æÑvQúáÇ?�£¬yåv7ˬÙc—+ÉÀÖ³WÎ>='WmØRšibºÓ—æ|}­Ö/ñ — *2¬)!i³Öþ ä%kÄïU,ûoèûø·Õ9:U…Ìg2èÆ�Ï,ëYsŸ+þ1¥êgßîæ¨†Âh’/®Ò w–CÅ,¯Ñž¤÷\n—z9òXS݉^³þü{¹|ïNCöØ�Š¡dèïüûùŽÚð¢°> ¹`Œê0RH—þCY”Vî›Å©õ.?ůòò؃ ÃéL‚OÉqßZ�ÞŒ�ù�5µÇе’§ç`ýÂ,†� •ï[…wË$šw�»ê—ÕMàWNLäIn*p6Æõ­ƒv>t;æh$,@l –‘ä�Š�î%£'&ÙÏß%ëý²Þê›æAýAÈh†É!¥!ôyRýD–‰–3ó§¥*ƒ‡»4|w…A•ä€!ôÔ´vï¦6—Șr(£^B?©!XÁ›¯©æÆvÄÞysœqZ#•?WÄ1¾p—@çW9Ž¢ö8áM�ʤc?ÆÂG¾º3S”…yÇÞ¿ZM­[{$´�wh{± &0Bá‹æsã~¬�Y H6LBD jæy¯Ìúí¯�kÞZßUV¾%¼4Z5%P›ˆ0w÷ôµ� l Z$d˜ ñx ¿Fœïú”üEÀ›F$‡þŸNÞž+¥¦äk’HZèá {Û�AÑ*ÄPiu$¹h=}íùÏ×ìüžÚŸ>6×î6³i%Áühê�>Yîå4Æ2ØËH;3ä(½s¡bCúd iÈœÂõlj)�ôµ½7ìþƒdÙ©c§AÝz_‰žÐ‚-(À%ðBÚÑ%%.u(õ=�®Ñl q(rÜ„Zh03®?çG¥„Ùÿ½¾rsš>)†õ}ÎJ‘J7³×5ÿaOÁÆ£øœ"îX|ÜÌ9`{}ºŽÏ¤¨ÿ¥BÐs”ÇçˆZ·�VïÔ¹™¬éñúò*5zÓÕ!°»ü™ÕãÂxÂá�ª#& ¾kD Îm[ÖB`Æçèà eêêiX†!†—ÝÔžœ–[Âê!Gª­<ÇnØ'.³+]ëÖ9tï“CÛÈ¢¹®É}‘t µ¸øØqüja6䮚 |˜Oï-�u2Û¥eŽKïãW×ÀòöªÑ+H&) móeè>˜&Ø1Éâ?ÝgÏ-ôål]þS¿Úp¦˜úT…’-`ƒd5Vø¼£hâR�x!A_šìÔ·ðMƒ-•d¤�ˆ õµ¹dp¬¥®V/qNÓ¨\=¦¯¢1U]äB„¶\¹®”& 8hýüîë; ½óp/l—p?ózg“òx^Ì]Ÿ-gJϾŠIN6†à`w%,Ÿ‡ìÔØ1 }˜ÍicŽêè-Zó÷·ò¥ú—jn˜“عøî$J•ˆÕÂ>>¢çÑNÌ‘>_ZpùJút^%:† ÑŒøZ© Ç3>kîÞÍ”¨ÿ)±Æ'›>Ü쇌·ª˜º|ãøB=dlW6…=ïÂ0ç顸êS_ϼ2+ÃxQȸ¸Å¥î2áÇâ#ðèú”ýŒ¼/Pˆ*¤é¨«›<ÑPco—¬ÿ.â�ñ×=õ†­ MÛ#ãÍq\wø(qNTì?.AÝëha‡Œ¼Û3 Y«¥(Œ®‡÷.õ(_³>¬~z¡hˆÖÃTRH_Qúߪé}‘–Q8ÿá—ñ¾þsÉš&æTóI¢¬{x4EqZPƒUÓ¿®¿wî)N‚ =¯ñ{b~uZלþ˜x dõªÇµ ßeS†aAQ Ê¦Ç Ô�˜ÆðLxã}Û°%gQG U¸Ô®„ÅHWUŒHŒÐBÍsð¹ÀÅí�Y« Í‚¥­c¡è:#ÏMçªQ¿±–W<é—AFç{ô”#®)écl›ÄÈßMœó„¾­‡TP¿¿´OT`ã vïB|nÚ:�^ϯê-óØ ^ádtÀùt6"W#À©lײA—Ø¥¡9"ª¸ÌP�Ñ `Çj”+�®KùzÚk¼Á­’0›¨±Œ ü{a«^CzÛÈÞ`…é*l¨ ón-…œoWè�‹öc[pÕ!LMóˆØx}ðx7‡hq³IÕ|K¼ù6V„e½‰·ÙÓ~å+Q€w X­ðvªs§lõ89ëÈç{#Èò¢û‡Bù¯dn�~þì{ úM+m~üßÅ‹†*Šˆ¡}sĈ�ÿ”#õ~²%[;V!4W¯Qm_ù A&/sÐo�\œƒT�€µ¬«¹S G@­xsƒï�P¸ý×RgÌ|h¼ ’µÑÅäwæ“k ‰7ÖäÜ`U††³ Üò¥È ÍqåÏšBœ�…MèØåYœÌÑ1­—ü³;µZß~;Ö{“q»�$â–7JlP¦>Òpcb~RîF¤‰Õ?SøšöÆÒ~�|1#Õ‰|&�‘ŽŸ“ë_\ªcâ»ã1íjÄ:hHû·LáŸ[ÚéíoJþ~Ÿw?Yæ‘Vÿ N -O×îÞ€-“*fy²A#H¹ôß/Ìÿb³oÅiV>Ø�°îÇgÞô¡b²éOî¢ôÅÝ0:h@/¿m6øeôºKŸ´.¦ û›nýÞ¥ïÏ6œ’@‘â:�¿˜?†—, › ûò÷ùõrN¿ßg¨§â=límmO#¢¯¼{m4¶P|HY@UìÆ �Í’Ø(€fyLoz“9ÞžZËç÷¥öÁ¼ößdÁJ¹å¬8¶�#ÕÁ§»7y¥1‘š•/‹ ®×}erÇ/u5싚äUxƒ}éHYõ‘†�âÍ`cv:ÛpPŸápJ™>´rT(±›S~™ô�!Ò†þ­ŸÅìÆ~û7 2D6:y‘šÊë­Ï�¹ie¿êÏ2;‹TœLÒ%´µ z)/Ð?íñk¢µýñªÈ­ÁJƒý^ª¤]E¨Ñ¿Ý,E›~º¡eI3§¤f¸ÎÂ}YJv×W!* Ò]–©�Š(if¸ãâ-µÉ¸:6ÑCh¶[ãñâ·ú¯Mšû€qxßc®jœ¨:];ÞˆÑã3`œ„AmãS[ãýû©¿G¯Ræ¯Âf3»îÝ£a÷ΩZXö¶´¥¬ÛË:�ÔÿO4zóÚu›ëÕÎ+á3ímÚ™û”èÚ­g~ñA°ö jdìâ1›ë]´W»5N„BeBR—d>£M=—¶úZçb¹/|Y ·&MÝuW(S·rèc›¿þÿR‚ûþßÕÙmR3E‚ƒÛ=ÈœîÜpœ+‡ øEV¬¡zÑšg?Ë~qtɰu>e®·O寺ê¹þ>‹P �/±ÿ° Ðß!ñ}6´ÚÀ kQ7ŒÛy¼]“OÇW‰±�1«CûŽ´…9·*¤%$­°b­Q©‡Ð'†5Ö,Ɉ�ŽÕ·ìÆvöDåorÖ+k™Éʪú�ÎÑûccäJÍdÕð¯–A˜®ý¯8Zµh8HpcTw»[ˆøŸ•Û™ð>-yœd«²½dðŸðŒRCwFl[øñáŠ9QÚóREnuˆX~ˆ¹ Zð»«àÍðš7èäHw¯Y«Z„²é/È@ßZÐúkW d·ZzSg¶ÞçŽÎøÙ©G·³Gzä`‡,5_½i‘Æ*Íqko޼Öïçî`u©ƒë¾0”©TÅúBÄóµÜ¨­úQ ”ìˆê£*‚Ôðå%o\÷©‹V©ñ˜ï# 8j07B�æ³ ¤&­8€ÞÍ0C³M�ÉX>ç€k¸G„Ôtô©–�q¥Dúe˜ ÉÈ\�s@D¥¨*–B^¿3ßE0{ú¿�²£`‡NÐ�oÈÀÝ<3"O\h^ñYü4è–uÕmÍ4Xù7üý¡õDŠbÌ-­ Tü ÎÞ†Öó�¯\ Z‘‡Ä‡Ì/±f,RŸì,d#š=yÖ¥þ—¨)à öE·û¿Cÿ*{òEvü²à‚¯à?Ø�ðH—a~,lðŠ?«MnæµXRUbÈôèLÐdàqÙ7Ù˜¡ÃB jÉg­‰s±ZN¾™®>O™ØT0€ª‚˜,•XŸ «Ø'~^Ÿ£êóÝ÷ë8!úB‘e Û[k_AuÆ× ƒD"¯½!G!ø± 3ô‰Çw¸œ3›ÇÿÅ í{U$\æãQ 6ÓÄ…!6D5=SÐC ÃB5€°T“ …ÅG:fg}Ð_õúDwùr3�?(S<zA`6r¨Sâÿ5„·å­Ç„äƒfZS¢júu¥–³à&À¾(!—IÁØ%kèÿØûxC·±ÂÉ^Ú�%L\ûŠ—'äÅõAoÄ9ùqûðbqDѢъ9zÖ¥X=s‡¬åíÒ*$E-Î*TTÙÜ€ X=¯Ã3¥¤Ý.†bø[±Û³¶®rkŠ­�…„©_{5ùC£dNmTÔwiŸR£­^K»êZl?ÝŒ îõÑßYnüg A‹*Ñ=Ñð V‰—ü@I9~¤ŒBÖQÝg"ÃŒÙ}®Æ&kS#±êµEoá v©Ü[�K9ôØ—Å�}@ò�4fÇA–#ÉwT Ú®íÕçr†;€‹³Ë`°4=0`¬æ‡}`]:SÁÚ�ß·WûE–ÌWaõký=š¾�(Êhï[¨Ïò'²iî_ÐîÓd]~ùØÚÊbsS©$•­«¦\‰q| ^躵ɀÃábík-Ê๼yÎÜÜqÖ^�'/ž–§tÔ\ªí!|Ö™DcYVÚ£ÞôLÝ6U‡Ö-k#ŒceuÚì÷†Ím´µçWÕ^î9GÉŠâ ja俳liVÕµjÜl$,X°_éݼ•ÒY8£Íå7[u‘Χ{jZé.‰C˜Ï­o[a¦ ®W»¿*›j†fµdEüPï{âEqQ|]sG…£«g~ë‹ãÖ¤�Ý:1\[3wû’�0”¥:{Ù ažÎÙHì�“Ž-º*Û4½ø6îá>•ÿ ðHðŸúþ¢µP?$ˆ " 4ÔÿL»6g×âßæ;¿�¯¨sôqµ:i¹i¿†�ÆåB?âu�DªÈjCÏ9êÅ4ýJ“Ëõ÷K|IOñí÷üe¶�HP6o3%ætíÞ½¾±ßHThãóÛZ¶°G „Ÿ_Ý–Ëf0‡$�É^äàÕÄßì¼Pž•Éï‚êÒ¿,| ä=æÀ®ŒÄæp懮"Q*™K±yXBƒ]—ûŒuv1ʦ1zãvñk+D­@&R íxŸ­:��²Sa[ÉV¹µñg[ ¡˜ÂP>ŽQXóõÚ3þ†ÊÃóNÊŠEsRæ0ÿ�wH"‘åøjU~E³J»:åB0xE¦à8±óÍr×ÏVdÛG›•GsrU ÏŸ3¼i¯olW|-tŽâŸ Í€Àe—Ö|šÂß\òòYú?”T«ú~›êéÿNáÁO‡‹÷Î5sŒmWa©#ùÎBeé\%ä¤]ÇDÄœd͉R×F:|ñV["Ål�âÆZp,@˜¦Ä!Mû)¸˜0"KùU²ˆH ^ nlP¤°ÈíÚ¼í/äÙR×3œ9Ën½C³Eö¶g#7Áâõõõ ùHãvCÃ÷g´Wk$‡:ƒ¥w‘ÚÞ€,¯ÒrSÿJ#C…8‰cöïüÙ`0á(��»”:I ÈýªŽÐ±whÛf‚Œÿt¦sµ*ZèeA£þþi‚gì%‘H0§ có(’‘5*!õÈÜRx³ÔªFC!qýâ7ÌÉ»^ÿ°- �>Á�²7,—c=!ç¯ûcšTúÆøõߘy,•µ÷ÖØÞ¼µKí»]Rý­¸ 8Çö·§Ô¥Ç³ a¬VóØ”,�Œáecbü“­¸¬<¼ªá¬q¾¥p�ÊéþóY£ðÝ»ûŸH¨Qü0õ�¨ø®ÄTû¿kU ¸õùû(!:»Ë’Q©Âf¼=i€»¤„I~)»û§ì�ž dšŒ«ü1éÿD«jÓð ïÃ�Ýšx„]lˆÂqDÜÂr�»Ã5¾¹Ââ–…±ZñRšBJ|ñ6¨'Càf¨ µ•®Å’SÔê453ÚÓDÖS°=ûn4À̲DFP\êƒ/ê_.òTã=©ä€á^”‚ Yf¶3&wm¬-q1&m7ªd=Z-Ðo±tþÔÚ÷Ó97à¡ÄdÕ$ò WÍ5#fù£ÏÞ˜gi­î(ê{ÚvÒU)£ S$•Ãnúo‚MÜSžwþpeÓd£úr† ÚaÓ¾/È,TÂO£ÄYT» Ù¦Éߨ~8}Ù³ŸÒ‹; ›y¨Ü¦éúTˆZ³hi-|šÔA *ÔlŠÅÓ͘Ð*nç˜:�ü¯^Œï–E¨–­¤C¤óTJ�šøm["É[ñø`Ž�9Šg®S°~5Û8½Kšð¬†¤¥Èoò�'`‘QÃP}�2F~o‡ÚÉs2£÷Òd(ß`S%»çÆ$os½eÆéÓ¸ê�β¯7J94+6+{Ó>Îo`G’OؼW±ZÞèØ�1;¥ÈV\Å@÷Ýg½—¼-ðć¡nâ»ø`D€C\¯­OZƒw¶up�ÈX1‰|¢�2à~\ñ†,”N¬0YùCs§„=Ï�š¨Áù�ñéÀBBñkVÎq~îŽZ&+PwhDHÃƘ1‘ž è8ºEá‰øAGô]ƒ*`ö×:ä¶UÆùû;?öÚü.¼ì&¬>!ƃ�_ÍÒµ¡Ém9¶èŽ0áhdA4å}n‹áÓ7Nq—�a/­DÓŸ¼Fžö3·í¾ÿ¾ì‘wÞ9sôyã~ 82¸°" H_\£,×Fi5Qˆ˜6IO3Pá¬>ûÂy”Å êè2ÌÃÒn"§wó— Ô|ë¬ÑyažÒ,Rkvož¦*ð»mÛweš¸Þ Dú· Á‚ÂDÒ·[YB¡NZÉâéoò2Rquá¨T,XàŽ†-–µÿ–__̽Œh[(©º‘ªR›²ÑQÊDèÆŒH¥EÆ›f‹ Ò{_É¢ü¦˜sŒ7Ç:Gqd6Šñ“ý£q—¡½`U¹ª¥E¡©/bíñ¯‘ùA9�§ñ i|!  %µº†!Bi à#�çJKtÿή·Kò ›MÚC jwp3Ü�¯@BÇÃýPG%&µ ŽÖlT^çÕ›ÏÛÉÐQ铱2ãF@!³¬%¤‹"cè™4‚“VXÑTé¢âs¬Yç86±k±ñÆÊˆƒ¹SŒÍ›ä«‰"Œ(À騹†öCÁÔ.rx¾L01uÞEm,èW¬ÂÔ7Ðk+| ÿ‡Q]m–=m%BUq¤¤J•æ©5Ȩ>¾¦Üå�<ƒø7z_ãäŒ0¨¾&º ®êÀ´] Ÿ¬¿ò¬žÑ�þn>Œäÿ¤eø‹¢³+oEÍWF²‰ê‹’AjÕŠ­ãGÅðTI%¾)Œ �|–Â$¢9ÍÀùd)Ìë>�_‚ýœ5ÙÕ…r‹14ƒf—g¶iq!“Y>í%žQ;Â0ÖMK(Ì>bWâá"*í¥°ý-Œ­·\)¡hƲh5‰“ŠÄ@¢Ó©„#­–Øz«éTå7™lïŒ�ÖU³"ºwRz-¢mV³»>yªò¸�óÝ3¿Ïßïçñùþ¿1¾Ûyùy—²Qí!!f›°¿he±L”�„?3Òó1§ü3ý}ØàfŸÎR5!ÙF0¦ÿð ¤zÝ/_áç…„Æs@�qb('Rÿ†ç––“¼?ÿgJWôƒI'Þ¼Zé}Êïáý«m¥ÆºíÞß5áŽô#P ïõa_ܬþvŨ¿--3QyŠ3µ‹ýÁ0�<(À+@̸‹C«3¢Š6ü"ˆ ‚¥cB¡¢âÆ€wI®§Ó%Žƒ\K…©4ôÇ>ú 9LÿïQr3äÆvõlÕ]5ê ¥-1Í-ØÏ> W¬%�ÆÐÒÉ�y(òz 1‘Q(>ï»-&_õÜpZÀ¢£=8žÐˆ'* •2 Ù W�˜åuÂhûc:n ÙYBùÌ… V”Ñøðû­möA:wþwü x8Iµ^Oï\§ž2Éùóìx»\÷ï™Q�ëgÏàO•tþ‚˜Ó Šè»Ï¤‚÷?ÑšnI è8y» òo;[(/ñ*Ö©:2Q¦Æê~8ÊV. ß¼pú¥p1Ì�#Ü[†½ h†u“â¥Kú7÷…†n£U(¡i.©[Ä�ÉIÖ·Ù‡Ú2yûê@I;Yˆ9â늅�9€5¢1lÀ<`·—%�žò­ŽÕÁ(°šøÜî–ÉÞþJ�NSÆŸ¼zܪ̨R³›Vêý Í`¦g62ïA†Y »³âõ,!nŨ@ÄC4°-*w:QW­t^ÅfЭÏ\i*Öi0§¶¢Ð” »(¡q ¨,í�=Æ{}Õä$R)�n[ŒƒÍìšDö„; ú“§úºáê¿<Ž6k5Îo�W^-�x•Óuahì1؆C0(ßW ŇM×=¾ìOî ¢ºqlò¼ª@á§Å)¡:'ï' @oeF “töš÷Ct쫯%˜pصôãý`r¼“£[-=Ýh<@ ¹>¥{|�­æ2YȰѰI—~ÖüË,-²GÃ¥}G¸¬bÁ{ˆD J",‡4¡Q“}Y®ÀÝrõ ~ ïtCè¼ uó]ÞÍlÂ))á2•»6Ö™¹Ü®M~¢MÏ7Åí 38W³RÖ¸±‚3Ì£.¢ì¸¶­ì6C¡‡qƒàlóÒSÑŠÚÆå'™®Ø2¡ôŠ�Ä*[b}ìcrúØ-ÀCn–F¿ˆY9‡f‡*©Ã� 8˜|."MËG½�.H9˜“>êÝÀd© ÄhÞ„Ã^™x�H¬ØîûAE›óÇŸVÔ¾½ÿS¶2ÏäñµoÕB¡>FÄI}1$aª]4"$-uõ1Y› û×TÒÇU?hc¾y€X]‡¡E>À§ó¢2² 8øÖ5ôŠøa䘭Ì1ë˜Q *Õµ²Ïx<€é†®/�P xÇßJZDZ�ÝìO ÕŠ•¶´Ü|Õè†/Ñ6Å™Êôí®en5- N¯]Trø÷fËÂNµÝºö"÷úP­Ãøv’UŽ™¶j² ª@ºÂb·#½ñl–‰L2»¶�óV‚Ì¿,ñVmnî%œócæXÙÁr¡±y©!Ée« ³ÌoZ»¾q…ZÀæLr s´EÓ®.…|é¯hƃ±5ÑdwnVέ‚UÛ6Õœaf0©ª?Cò¬>=¥j§7Å�y\ÀYF¥Pµ[£É[½îŒ”ÊyŒ¬4•Nfo{¸ö˜£õüÀ`óÒuT£¯9“¨2ù÷‚­EUj6yBv¥¡ �à:¹æ¬¸çó¢âcAzïs¤dÔ'‡`ŠÇq?š'ˆ¸�¥»p^·ÆæòW*T{6ÖÞX¡ÏíãkìEßxÃVi8oåá˜k^ðBr t±¶}ÕWcŽp9—B#ø§€y}7tD êãsÇ öÊ޵ªÞlsp&Û#Ä6íø¶†)Ínçgæ«»F)R¶MŒiå1¥�!"`Ÿõ¦ƒWÈT�ôâ·Á[�®ŸRž�o½¥$‰ìUûʼm%ÇùÀ·Ñ²°©|v͹M’Áx°‰ÈD< ñZ •_Ÿ¯PëÔkwQhÍ/ÑÅrŒ�˜�ßi6Ò)ûX_@ÖÏÉQaŠrP¸9Œ {×zÊ ­/Í‘ñ6ý”0DCÀò¡l9äÜzצ–ÅK�Æ©ÆÃ¹u}q–† õl0=ç¸" DDÏ:áo"2ÃJ¶.–<%¬t@ÑÑÏÅê%üË�;Þ¥w3ÇÕ {Å��£¿#®>Ò®Œ(Œ¥ïDsKêÕ+¡´ [Ã|lŒÊ�@ØDÓtîí•ûuEƺÎ3Ô§9׫Üm4>×7xöN·Vôç`ì`£ï ‡üaýz¡~Aö £F_§ßÕåÜ=¿\þ!XomÊÏ ø’IÅ'»·ï®Ù²è-¶ |™Äüù1¼9–µ/ ¸·¬G’ äMÐø šy¶|*øE¶åì:tšžÆß@æ÷vßÛ¼’Ìw*-à±}”°ÇSÿ‘/ØÎ)²ûv1‘‡±æcî±R¢ÍZ53�~YRîO ¿°äu¨­ñk™™“’§t½�êµÅãPŠ÷¨…-©+{‚I$$½§cÓm8ò{åÖW¯ ü]Eâ75¾™1¡;5þ<{Üºî¼Æ†^nâµ \›~ ÔÿFÊdõ¾ †×\”è¾3@v;ä’ʱ{U x@ÊhA´< !#£ 1æ¦|´ÁC õ'Fà¨Vãæ&d“dÅ0kÍp*–¸bq�oÑ%T‚µJö-e ¡2¥ÛgP”4"òÜ9ò(·Ñ•92þAöª+¡hæ!Þ —Å�ÓSŠÆ?‰BZ d#FhÇÉÖsv8FK«¦f”ª wÁ�4Ô#@HÍ4š^¾(¼x‹×Ò(ûàgŠìUg–*5˜v×ÒÈ5}Æn3 av–¯ÃM”w¤o–…˜#h›Ê7qX+­$â–¢)}'ÎuF9H N ¯y4+ÒõƆpþ¯2YƒÙÍq TУ<×§�Y¾�¥ÍïStU*÷%ª¶œÆ1%’X[Ë-ëØ§Ý¿žkßE!äŽ*eë‹­T«pé?¿®‘'L´<ïÅÁX—ï½/ÂAxô %�xmu3Ûû¯ÀÏáF6u^_jš³abÂäá«ÿ—þ‹âëbnú²OߨZsæóú“øº,yØûçfã»Óåc«ÐáÒ� õ¹ò¡¸÷û|˜Öÿ!ENSÁý‡-üímæáuWçæ»ü~¹ÉR1¤ x3«Ò‹×Í=6«‹xZ> xèÁ¾ÕÒÊÂ2¢nÅ :ÕÛù…h=lMœˆN˜Œ—Õ¸vÓ\F?ƒgœž8•c(YþnY™ù„ÓD#"O-ËŽô¹�ËìÎÛq¦\DìÕ(@ZÌ-x Ø™¸¼k¼™Q¿õ^~–äòÁP!l÷Qü{a‚îu®ãz¹»þ)×½?ª‡¤DÐùh¶ógcìEíüî ÛäûÙqÁ˜‰Aíþ­v%µŸIœ QÒ�¹!ñèHdÆ+R„í1<7Z˜æÈgAºµõØåk®É9“~¯Š`·[JW«Vw}›Ú>LaÂiª1ÄweÊn¯ìÝÁØ=d6ð¸í½õß/KòÅwéÂa‰:nIÊ¥9ÎÔ9ÄÒžOY>X­ß¯9Œƒ±ÞçUCóÓµïYÉ× b 0ET„àI°×:ÒºCT!¯ ­ìhmÃm4ÎxxX"çP`±Y}D…ÜHú@Úã¤x@qñù�ØÏôëk¾j¨µµrL+ŸÁÔ¨–¹ïŠ¥ö‚«JÒ9x Äj±ì�°Kçh6Ö-Y¹Ì1\iô埦ˆ²—ÿ"¾¶pWðèºÿ[ó �UÈ/`øÐ‘õí�ÔLrm�ÖAªi©ßÒÍCüVð“+ùæiqüý_ùliSJæÄ·óÈoìÁ:™ð‡êîng_˜V?�d’9 îí¿ÞP,<§å­•õIOÛD(«ý¦õ § {ܤqå( -¢=d‰p Ãâ¿r$ø0 ªèKxFƒÀAû}i¾æïPÌ1sÚ8…L^¥%þF¤MŠ&×E²­k;þ'ÑP¦ v’vv)‘d»§™N)IÒeÂ#³×KÀž(·&+D…š#¡ '²’öY ˜\ì]JþÑ-µQ^™‘|›ÇÏJ–ƒuݶí�âîæ(V„ÎidIb–`}à Ô&³wÛ­‚U�\ÐÈå©O£C»ö5m½°ü›â£sÕ¡Q©CµÐˆh-²ξðŒSt¢¶•ˆj©Ö¥•‚ÑPn ž41D»ˆÀ6EèD$ðåUvÁsLæá•¨��êFˆåYýCäð&}ú‹œ*o( ë[õ.ó!gö……ùû¼/ ß/JJ—ËAL–×”žäMFn g–ðöŸöZsÇïrW…e8½âת<O×¶ÇÉiѶÝñ|FIŠ¡.wÚ¨“Šœm+‡+ËV&èÕ‰òZר—!2öMŸ1ŽeF ”Kݵs‡LCϸ@�°\‘~l H'?Êdàè¨YäËþÀôVÜ`uêÆ‹ûôoG˜B¼�«7èõ° ÷è:7¼³âÈ-Ê…åØ "�+™ñ¶Â#MŠmH´›a I$„–ץñ½òËz©ª­¬O>/—ð+åW·P?¶±çõ´Ø÷´Sì©õœ.™ì˪ˆG+ßëÖGîûä‚ý Dcú/|¾ ~)üŸw9ÙÂÓ“L’×¶tŽvDAü.r´w4>½Ù}d2¦÷&ƒ)~æ’xÛî¢Ë�&ï¾r·šÁuEtÔM©XU“f¹Ž¨K}*„1`øªé»U«¾ÛŽ�ã~+ÀñG™R¨N·Ë'( bذ[±ˆk`fk2ªŠÓrdv/]ošÊ”†i¾KXwãe9ÙŽbsUÑiZ3¥}˜dŠ8:f§+¼lK–´ÆqV†.ÛM˜½ÊÉÝ›pZÙÖ¸»MïXÞožqk}¶æÖÓ3A¼Œ+%æ!e.ý ÓÊkÕ*xƒƒ² €A¥«ÜG=nÞ¹Kbñk™•ERÓBŒ`k3ƒ `Ã#ØIênÇ{.‹@×½½kØ–^ðw=ÝËÝÂä3ºÅ«ˆÜÇCêýé´^}èC>1Yi­ á µ ¯E�xíª´X+�¬gßEÆHÍï¯(À(…Éà×e^ÚâùDYDU;lÃñPU¨)&#~õe}ï®VÊà|âpSF'³KršñòÒm9; Ù1 þ¦ÃüŠ'èÀ–B{~‘ë� öìµ¹…Åàdd~0qû1|Ô8fo€È‚ð”ÈPµ¨€4<}ØÉTh?îðRG>å.ÔÙ �B+SèÚUã,!j� m‚ÚÀn¯ÃßÄ÷ U´­"Ú}o�Ú3´Žá¬$D|$X;]W€³›i^þòÐg¦g£»ïÆž”N³·�&h:‰Œ�ÒO¥”TmQ¶!8=+#Hß[M LÐÜÈì©|xÚñq9pèeB,ñ)Dhç‡g±Q@WËæÞÄ�’± ·bׯƒƒÅsB®uÁ��“a�“žª—F³ÜÒÝîš�§pI�Ñ@ }tÀ¹{ÆHlͦê$ËjYx«sI T'̈.(0Sá•ɹ>¥wâÒóý^-äýð¥Ó·à¨Öw^Q¾7k[6¢WÜT}ø+žM[k¡pßn’�ŒÑÉÎLßC<ø¢\|T%½UPog´êûD[·…Mõg—’ Ù`¬G ŠzSW62y M‚´zÎ]Ðæ&ØΛÜÁÛÎñ>Œ_Hà�h÷)@õ!;~ãÖ¦ñ¢‹\àÞx™^ÅUªòƒ@z…Á|ùÁß(ù±Â.:㜹ˆdJµC±�ºÒÀ`—Äaô`Q=çÌTX™yl_]A¤ŒZƒñ#ÕZR�e¹èE³2²ò3²Êb=òSÓ­F©n—øT‘âz)HŰZZP ÑO$H ÈŽhâû"š²…¨ùnWlظ¹–$hŸæa?b5»S¿«–èêÿ/y}£¥WÍà:Ç l c‰D¿Ú>�Õë¼ 8§3®èt…)z+X°>Õp óK"ÍkC<–6¶k6àÒ´ÌùM¼IÍþ諯—…ÁÛ+*¨Ñ>ò”r,nKÁYûg? ÷<óÛFM/_ô²b©Pv8yí Þbf¯n»u®eZ�ùìçÎ:ƒQTen]·µ )Ñâ|‡§©–87ôÐçÎ×lŠÑ m9Góøm÷¯Œ°KÛH¥ÇÉ]ž”Áà°“»NT†l7 iº&hpBé˜ÈpâÕÕs‡�ŒhgN‹øûüµ¨±bLrÀn›kv%â�Œ–Þ-‹b5GLâpƒU$êSãøñÁ¾Ý¡<¾Q烖†øœ×2/°Ê,Wv–#½¯‘4($ô\ÿËã|æAƒçÞ×WPÎ-UưkšË._݆ˆ›È$mMi-y5éb¾ã™.FÄ™­RŸ%©þ.¿˜ÿbàÊÚÌ�ÂÛv)°Öì¿•÷T|T!ë’š›õXà–Ça¨ïÈ? |U ê£nȨì×gM­7Ë’�a¤Ùp,e3e À›¢†¡ñÝ*´H‹çé!Û~+C3\´§bÉ�aKÚ$´¯Ø–£^E}ðCü^‰×Xb„7ï�õ—“¸Ë¸Æµ³é—G‚KÄ#ðÞšt—,Ou¿÷¯y�”š¸?l59*¦ÃëEÏúFóú1¬,}¼B½”Ô¾ TǨä+¯ù>ýé¿�·;—¿ oåéF«Þ¾0öè$[ðs,lZ4uJέ¸$’BK²3”³i Ýéó9Ьìûµµh À[¤X£&T KÙ”bIé EàJ·øG5Í Ãž Ü„$©B–¾ýŒé³ì�izz\¯­YöšÝF—[‡?½^ÇÀÖ$7ËÖç5ÍV¯3LܦÈ�#ÑnsúÜqÀç�Qâ:ÖDœ'r_óÚÒ&÷ Þ³0]q¥8©ˆÄâ.†�B'-Û)q2IË™;5õ´ÒèÎí½ø«mã £—,!!A%Pet‘© »pFë ´±kI/9²âñš²šûÝxPöL©4*‡(qlÝÒ®ÒŽÈ{„Q%Y´õjlr£2Ð̞͔g …D*flú²ž½ì'X¯vÃÌo|än7uRl™švTÚH_Fø:V§QÔAµô6œ 32}.÷ÄOÅäß–¸Êç ƒž˜æ † ž‹eŒ¬§¢3Èlª—ïñS¼è{ U ˆ‚€ßUŽ%æ:¡ÆÄl„ ž±’£QÑ’ú²lÝFšÜm5¯6ã{Û&ã§þLñ\.më7dj!ìŠ$ÏÄü÷®Ú�ÉÆ·í ¥!|ŽçØáѧ¾ä»ýëëköçëÄÿíú3ΛLç8Õ¿$¨Gꑳ@­ À�,8ué]èÊF .þ1†a¨ ïíôðg½ªѬÕi•ª9.r Û+muwý1Õçµ٩Y©$×nyÙ›OøôÒÁù¦b°ªxÀD…Ïfè]IGöƒM ÞmÕ8…�ðâJ̉0§*‰u)ÍY¿êÝœèóŽç �õИ‘žß}�Y)´bz®Éŵ¼&ïÎNKl®#UÊœwÉMꃭšamkHN�DN�ø‚ÆA¢ô¡i_— zëu÷E8Á•1‘²œgg6ÒÏk¡®AÅH¦Æ*‡°j«ˆ-Þ’¼ÝÔR%ƒi•…x™ ¯¹ëE‹ìC4ëv¬`,‹ÛšPÍm“˜ßüâßú™nö�tßI’7ñö#ÏwCYÞ¨<“¡Ýë|¨�õ°»6Ã�8¾#�Ö¾z¥bÖ<å¦HÔhÒü¶ÕN‘פ%ãfZ¦1RhXò&½äQ²»ÌBçY‡D"ÚRß. Â`*•É>\ s_káŸïÖs;ØqøŸ,u‹–ö(~9pC�ªÒ¹• ^6-X…ñ~† õ€¥‘�„¦±ä¹k#-?zk·×0òû�v¥²»Rô³‚ új;øZ+m�¾û‹ÌÚQ Â$¾~nô¬°ƒ_5ÚLyèouôïFÕ,¶l,Y !Fê7o .i•Æ_‰‹G+ç¿–NcÅÐLÑ­ÛB]�³‰Æ¹>UßuŽôi{Ûf©ÈÑ¥ì¦US•ËgS›Ø©)D$sºÓn/„ÓzRw[teµËXu9v;w‡c»h. ±ñWËÇŒE¬™$&ÖSSivm­ÏhÏ“•¤»‡}bÖWó2_ }gÿmnɘë!u²¿¦ 5{ �È|e�^ÐÇž �[K“ŃGz�Ë~BÎ’™YÂ_§�æDvü¶J¢ÔÃ=)öÝÝ÷ãZM­bÓk»œ _&$IY+DÉ;¿·Ž^v ÞQ6O³£aÛ#ŸþN€~^ÃØ®j$¼â ‚FÂåWUã ¤’ÒþN‹ƒc”Åo8]ï �K•%KÛ¾üÓ”Þܺ²ÌJ¥3í™3 ‚ëK‹F¼^ê`†…2@J÷�É¿Yæp# ÏÑ˪—½z0åm‡±ŠLÍTбtû* §ÁÉöéàØä­1}ä\‹=Yo±yL>†88Ç:+–�Šâ¢Þc�ìc~k&SÇS¾£Õì-ÀàsÝ6kÁÖ¾†7À ±:j•@å ®ÿc>eýÛ0úz൘IKº1æÏ1y¾á=¹EQå°x5I-“ÁŸÂò«¢àæÆï¨üu�w|&E¹ì\ 2A£žž}‰ŠÔc�—‡- í¯¤áh6ÆW¿Ÿƒ!L±í{·/«¾®욨?^á¡1�û: o àê„“.˜ÅÆŒpÈ5F MÆ‚ó>K]¨LW5ª�ˆ½÷€3O�‘Ë=÷[‡§G{ª§�bœ¥ÞúV¯•¶-M¹X²>ìz¼Îº«ÙrR+kWìy5¤Á{ÎJDîÃÎ�hÖØ Ê”=Tr2c>¹+²¢}jº’k@�Š„q`,Øg“áföþ`qÖdgvW¶µ¤Þ{ÆäSf&ËŠä&$Ø$ks¿.j@uõ&¦Õ¥hgLÛ=É–ªV•¾Æn{¹"³W“åN"ò-Ö‘’�áQySÛì«\3*[Ú£Ò–"¶¶¥D½¹£ÁepÜÛB¶yb¬ï5|ãÜÒ‚¢µ9Ó®±¹µ¢òfQÜ5ªÎíÈ’l²ÞµHgwbRÓJ•ò‹Ú–z¸mæù¬ ËŒƒJ}Öó¤ÄámǼ ›+¸)aÉT ªVµ]ØØY¯ß‹R^›š«ÿ}ûâÁØ´8ø/jý+Ð-OEzbò^©= 7êö�dùûr„Þ­êT¢±Ä�XÓ{<ç+;¤ÝÞ~D#N‡B¾0iÆnWIQò÷0zlÛ�Û5øp+Oà¦A”h†ÂgÙ¡iø\ð¨=ô‰+XV°03óhUl¾û:ã°¯POnÄvjIâN�Š¥8ø›?c"æc@uæ¹-¯6ö=eS@6™!‰@ìÇÌ(áõW@7}o³ÈqÝo‹NÛË[v¹žf�óÄ‚9ÏV ?nZJRôà?sd\·ZùÖsIÐÉè]¢Qª»œE^*̸]j6]{F-Å}ö=4ñÆ\ûwñyè«ÁÈd5Ï… @¨¥‹ÇÑìkµÑR�jôÖQSÉR»µv&ª~T[@)Âàè™ÈÊå‘îÀ5Ú¡ ˜eç�B§!ô¢äD,zÆೌ>°è_¾iôÁ'áøb”ZFde(H©O _q†(M}_B·WÆ6uÌQ¶Ï›ÍN ÌHü—;Ð(ºg7¾ º,‘�4é~fÏü2v¥M5È0ܯ F¶r6Û~ÏžÐw₩uÍéÛ±ˆFùÌá�Ó7�t‚€T§DXÏ5ËýÈJdŒoò ±\o�Úɸ�ÎØŠj˜}=ë~~è÷¯&ËÐ<.úŽ/û!] ™8^z íOŠå+/Î_+aT˜Nîâøákk¥;έ[†°p­ñŒï–þ'>šîÆ>ÞDE_~®…÷O‘mØ‹Ú�:™Rl9A !1!ÁR�ÄHtü‡ewÎ$U.ënŽòø2¤k‹Ïµ¤©×ûÆ#Ph‹æ4©¨]]™IÌêF ´wIEç­Y�¾å8f’ÿ\~áuÕoº{/Gòê?:|[Ö?„�A¢>Ïñ3ïãøA¹–± åíÖy¼S„)}]ƒ¿ ñªÙZñB3¥¬2=ï8ÛT “Hþjf™4}};uÒâî¢ísËÄŠµùÁ\fì>Àäò¯Ð¦ãØÀ#…±ç¢mH]Ýò�-kÚ¯Éýò–·6 Òcþ§‡Õ*úá²;SZ ?ï„-Ad®?6žä>Ìàõ·fj9m¤Î£©†’jÕЦMçðþ Å€AÈ~vS¥>*áð€xï+ò1¿q~ë;²Z'û UˆU@S?‡ñÊÆD×1-èQ{"ÿ.Ì'K�ßx�ŽG½—Œý8aqÈ U]ýmâ—ó’ÖƒQ®½^­¨ô€»;Œêøa¨Ê¡›eYÛCo•*séI9!0é…»Ö{1t×\í) ­¹¦N”ç±Ì|5  ØÌ­Æ]¥6•W¬+4V† �òE‰AMÓlìÚ‹´q�´-´[P£´#š‚÷íkêþ¬EYSï”`Ñ-`̵,þ{êrŠVÁæ¬0jd!7²sÜ“'Òs…Ô¡$â˜i– [ìÑ~þ·j µñý|êûph�m=>!ßœ¥B6‚ qv²1 !!@ÏvU„óøâ #O¡Ñ¸ñüWûr»È‹C7óêk�Bð~ÿ)8Xb ¯£Œ=;¢€BðzóµRGÛèƒv¡…ù�.çÏæ>^McNd×ÌúQ«†Sv¨‚‚Öó£yjÆ~¼$¸$x'ž»0RøØ5(,)3¾Í”x%®hŠ4Ò}Hµu!D¤¹†ãwC¶^ †î¼¯/aeÂö ø�àÑ¥$†lcÔ�€€4KÛ�Ý6Hbs” ÝöKE#„8ˆäqHLµٙFÑž¿Jò“@Í çÌø·­´hêÑò4׬†˜†Û–ŒVîM™Úþ+ç]±€T¦YnTæ�_yD�› Þ�ª3G 61±°M&0t�Ô¿ ÖBc¬ÆKÊ,ƒãŸŽÃ4ëñy GT¸ „�ʳé$¾ »úwÏÚh=ßﮀù~E+‡·"¥‡µŸ͵ƒ¶mY¾–qͳa£›ã.¼‡Žvya¢[×y¥ëí5ôîÃ*‘¢r%ÝÚ§«NÞ»©nÍŒ<íjõºÎó9ÔÖrOf­C –A6k“nébð�تf¨…²{ƒ�bʶ®HCθ¼ÑÚ×B´š¦ozñàÄÀuÁfï#0cÓ|â¨N)\%V¼6­þŸßðÏ–#Ågêxç׿}øÁ÷gÉn¿ÏÇ©äEÆhïý@ cgõÿ}çüZ´†…þc›«Cá� D-«ÓŸtâ­ý¶×Ð=™éjtš!  m*²Lc!ÀÐ4û*¿sö'‚cQåÌZÀër(""hm ˆýçë:ܬgNØŽ»4J‘ƒk°5í;»H;ʆ§ÅI°„D(MøøöÊß¿Ì÷ûëSìūį†?Æc'ö•UëØ0. oX.9­CàÙx–NÛÅ¡ÐTTÆD ¤ Òì»a’ãKå3C!–¾Ùæùµ9¾ êÏ·¶ÀˆÇòPz0Ð`-6�ò Dà:˜aYï–v› «Ì ÂÉ Ø¥+X—ßtí\6-{!DÑd}œø¼1 f›TWFãT+L5+°oð âe¤„äR² ÃX ^PÖlá´ÊQ6F]#k؈«çÓ]«—‹÷êÑÐè§°¬z�Z?¢µ�Ƙÿ-ËX"½³š¡Z°õÀSUŽšè'P çX²¬ÌMi%3¤LÍæ„¼1|æ��3ø•Ÿ½äoêô’GRq¼{Zj“´\—Ö[×#Ô³MÙD¬é–æzÉÍÒÆá[Tµª’Ü)�‚ ÿžø¥ Øÿ¶“] éÞÖµ·Bºa—7¨½V˸»lÐð–'f <�y…P[ ¹/#F¤·¬‰;·f [Q1磵 T׸`G˜ÅódóEåÒC–*<_¿'<íþª>ú'D�ã¹#'ŽRÈ*ZÅ;¾e®¢Óeª‹Š­«™<¡QsË iJà—ÝÉ�Ü÷™ž$2°Eþ‹ñRÖ¯ vçYü获]Û~à|Š×¨¬o´6¨@OòA¦ #˜æ¬Z¥„MXŸ¦v†~vu�½`¸*Êk)px·â‘`[[8�5­Â{<-à!°¯ãjˆJA"êÛª“0yùe«–,g5,‹ã#O=òªÐXÖ4áêoQÁò7BÞ2øÏ�SäìÙPXt½BðTx+/`ó Ä=Ù €þ–Ùª G�jþ>†ï­{ ¬M5Êﶪ‡YNô·Åºg–!.ø¾]Èpò²õDr=ù1a)ºO\é8ýñ�7?\‡)—¹%¿ê(‚ƒT�"i¤ö¼Sgº:pØôÖ�¼&2LÎ?Êéwo°bõÀŠ�“ ¾:ű‰;hî7c±:}£¾÷’ÝÓ+2 Õ�©\g ü_‡?Ù#ùr=RHÓ8üÀ"�÷Ì�´Ìÿ}ëQ{Ðë-ñ8-'ïDtG_¡u½†$3ÒÈòËø¬Ù:kõÊ× òe"_¯9n‡|F ®t²áy¹°Áæ µÍ õ)ÊØ÷‹TÎÃg0î>l@b öÆŒ�>û Ñ¡œ“Û 6Þ‹¬‚ªYÁãåÓåÞöUa} •€ë¥^º¥Hk„”e0|ÍñZ„¶¡l*,gŒ(ÆD(­"˜É»Š©iW+Š'ÙéÉ;ƒAžbTsTª�X\RÆÁšŒœyA�õ#˜-ÔthpwM÷Eà®éÒ¶”3ŒSl�ŕج�øø%¿þÄ_½Ñ‡ƒaÉ/°Ö‹®¯e°'4Ð(,)ò6–e ®*Ïý¥ÿ˜­5¬b†HVÑþ?鬆ÊŒ x¼Û(Œ fìbÍ@ô[Áç¤C¬ßõ,^ýLØPqˆôj]MŒ¶ÖžuÀή?ËÛå²þET”4V‹™1‹„°Õuv-ülÙªY¦,‰°ùZ–jgˆJ ½óüéZÓd¤¢iðJ]X,ìf˜¨p´íÓµœÇýÞ0©#þ·èØk¥e^¢3z.¬‹Q›Ò‡•¬–u+ÌxúaMZ;>1vˆú­z]¹^�»Õ mMì< êÈiS©ÕZŸÝÓ²EM¯Ú„xÊ' Êú¦ÏSb$°ò¢dÔ $Êâ2qö½rpÌ3…ŒböDµ5’%¯EŒR„rÚ�õ“KþŸôÿëþ¿ÿñÿÏý�úÛþ¿þ×ý†£{ÿð_ÿr?ã¿øÿí¼ÆÝæÿ1AY&SYª9͹ËÞ|@ÿð?ÿÿðaP>«à€>€(H±÷ *‰$ª%J…*„Q\ø0{Ÿ@@tè‡O@Aê� è€ Ð(éÀ�]ÜÀh£èpt=:¡£}¼Ÿ@:|WÀ5>‡ÐÖŽvû`@}ÞžôñÍ7˜Pk¡ t š NÍ 殀ÀõAê:e…mšÈªPY «*À)èl*@((ÒŒ©›®è Ç8 GB¨ä°mÎʃ¹Î¢ª�§AÖª…,ÚSM fÚÆ›`¶ Š5Ðî—s»i@m„F“E•Ðê˜i¶€ ´îÅ&´t(ë;;³±€P�( ÕX6aÓ@hÓ@€h@EPœ¥‰¬dmªm£ ¶¨èÝ€fØÍmj mŠ’‹` *µi`V€405€âGt±C@ ©B¨äè˜+£ W@ww\Ô6­§2̺m¨tÀ¨i¢€»°GE VÛ@5@5ÕrFÎW4ÌÁÐç:sµE°@¢wKº -€£@èvÔA§LØ u§M ¤2«CÀ, ³b�Òì8îwUÑ]v†¦@(R€zƒS@!%"IèS`”†§“M ULššbèƒ#&šSÄ€…%L&jz�Iꨊ›i4MÔÚž¦šb‘Bh* ÓÔýÿïÿÈ!ŸýÌG„yhüîŒÿèûÇõÆ�i1H¦?°µ’ 3² V–ŒÌ§2±p¢ÒŸÀjÕ^[mµ[Zm«kY¶­­b $ ’A HBªH¿{jÚÖUkm©«Uk[ãVÚµ$„�0@€6I ÿŽ?Þe.Ëù?õaý‡ÿÓ¹ÿ­¡cñîaÇë­ˆ±ŸþjmHz˜€Íu"âåT(•�üˆd$¥#‰mä)d´Ëî"JräÒ’É~8d!¢igQB¤ÉƤ£ªh°p¯0á";þ–åkm’A>!�•ÆR¢IÍa(† ¤N:ˆ©œs ®�Dxsš˜ à� Ô"ER™ñ0&8æÇ;ÝBY!,'§U*‡j…˜Ëˆå"ðµÄ^…$˜M¾u9�.�ÏKú©² ×¼ÅÉq[EæS;�•ó…US,Þár€Ðq�;9ƒ*�Žûy3“�|a¾Ì˜:Lo/„¤) T)k=P¬×¦Æ£,T!£’AìˆhJ¶7k5wIÅÕRáy˜µ@7›~J2¶×øÃ=ÆjÇ3nôŸœtï„K1„ÜŽ ] ´¤C ž#ŠCÛ¿üÌÁÇnbËOåó0P-â y1É•™0âèÐbL‚6؈iµ÷Zò¨ˆ½8îàF š§ OF#w{3¦`lHQ0èùÕ ‚²‡é²­n j ¶A*š� ½jCÄC’ôê"’l@)’.‘9š8ê’?±"bY™‚è¥p†MÓTÍ:õhS†�$†Fâ!K”¡ʵt¤´$4pGh›pÊ)„ƒ1tnrh2!D:ÊŽË‹ž¡FÐFN"”¹h÷/|DÅØ"ã+K7G’ ›…vÂ,»”Éüm¡|ê«Bƒ5ˆ¤kˆ»ÖsvT_3â‡eÛÁêó ï:Íf�.Ñ%Ãt&X%n,‚2œøoµ@ôrÍ¡*’˜à’%YEèÒûUº6VsʼnÅßÅôÆŠ2Ò_®uMÐ}˜³ÚbP—0‰ ’b[/ºY¼tdž+âÎfNO̦ijoýeôfJ lÉ€NR'‚(IIž‘z×t'G OmÔÉùZ»µ‹,A\K ÊE“—6Ó¤ÒûväÑÅ!Å> PûhWÔs]fI7j~ÃfT _,_*ü‹…ƒ*J?­c@¶8ÒñÐuA’Ö Ü@‰æX™5D) x™�º¡R¦G×F ‰M²¤MòêÒQîá Äi©).²UÕGKX4Pr‰¢¡—%|1 ^mU‡›¶!ÔD}™L’º7Ô� Fbð;ËwìA‹/òjbè,Y§�µÑ§˜Ë•dj©‹7#“&8q¥ ‚P¬Ôí×⑆԰wˆyS$(4ê ÎÈ™D†b%pÂD”‰,¡DOu Ådòâúfâ#JåÌÕpî}h9VcÙD’µ-ˆ 8{˜säÔec¹‰–äÜϞȳy­Î©Ò'*‡£ ³S^šµ^°¢»'ä.h*‘É"s㾪pb’0i"Jm8&8ž\‹€·€f=ª 9§Ü¡6ŠR“ø…‹*ð@éo™˜!e\L¿‚û"'�j¥(ÒS8Ì*(ñt·Y•’)29ñêk/’&RÏ�‘Åÿ LR’Ó^•8;l³>H#Ә’òiòû�>È¢! ,ÔºJ´FiySCÄf‚D‚˜!�²�JÓ˜@3™`ÂÑ’(à�=ÄRI"E¦â u¬ï�fÚÜ~)S[•¨¾û^˜L­a,J­4ƒ§–øœÙ7&(¤@†guLMBh7­æI‘[µRˆÍBEêBgE—δâm7Xƒ‰?=Q’6òl¨‚çTûã/W ñ¹î«cë`ÜУq4œê\Ò¦ ¾³URð«h" å $N™Ã² F!½ç4+2Ù¥y'âP';S‰JœÙI¥˜æ«›Pk[ÕlKD3Ä;9r*8 L!))y#¹R³ƒP$…ø¼¦H-ÏÇ«³)ÕeäV¦haX ô(à‚I%Ëlýo‹ž¤k+¢;¨ƒÆªamìÑ2½Ÿ¦êô )«-�Ûk-‹(Ù õq¯Ñ3°^1…ºDÊþÞtÐD“¤QÇõ±?Uà‡¦å¹#•„Õ�Ôµ,¼¾xLDœ:�–"IóqvC̘O+ùW\0„œ¿©=Kþû»ÙGúÚÙΤl‘Kă’;˜µ@ÉÇðÄ•âæ”œ#3µÝ#4ÂÓWbÄ+>)4e[†a|9ÍMGfœÈxÆÄq©¨h2µ ÄHÚCù2Õ&ð˜J[clA“N“Ã*T%‚Ôö> Ä](ÛŽÎ$::-òÇjYŸÉãJm% –ˆTUȘ2•P‰ƒÝ2åÌ"}(¬²ÂÙ£¹‘üÞúœ‹Èɰ�«ÕÄÐs¹œÖïNÜr &p, ©¨ÉAĦV»ê$9Z*ÜäÉ]?�:tA!Ö\™• %(Ë*9×0&Eað£Hƒ “ª¹ÚR ›”�"ØQ"B®`E[U`Å@P šáå«7ƒÉE¥¢5KTê �Cîf9WÂÐî›=.¢4–­aB�T„q`£¸Œ ƒ²ÒË„°Üry•Ÿ�¾{Äd”€]§$s1ID „µ0ƒ#™–¸nn&üêZ� Í¡T�!’ˆõD¡ "rj[lÊ\Pp}šk’9"·/)_ESÂ1„ /…- ZzŽæAÁ&H^™Òô’…ÉO}ÜÄ”‹”&[ Êø§² #ïœÌr‡æØX®*’Ñ«P pùœ´+)#’¢?Ó¢ÁH¡qož•é$rÕ! �Å‚’D|ÚP1)Xˆö%Ž79y“ÖÎwœ]ˆ¨ˆ�6†R-ֵ›a¥‚RZ—{J¢~™81Ãç¥Ö«¬ñN3P8¹ˆET¸0J™y2E±täÉ-Cû¹©—“u�×Í^yЊŒ?F‚šPH-‰AMV*y„A} š¾MDæ4 l$Ô8aæÈÓþ5Âf¹§ÚÝxìèkÔ�l!Â(p è¡ß~j'ñ˜/é 3ë€ijPÕðÅ.(Z ¦»ŽŒQθe0›i@CÆ$ù^ÈêcdA~µŒì‚$ô°„Prhp‘êN91–h‚_�4¬}¾a Ûߨ÷{Ȧ´B£™M¤ $EÌaÂø¿BŽ–J¥¸R—ÛŽÒî_«™†‹Ë. !¼\1_è¦(e.ÉäñSÝbÈ'7íAMú¹Þÿnô¯m“ðêdÑùqÅ[R8ž˜6ZQ’ã 4?!¼º>Êêd2Ùñ¨×*%­´{KÖ�í†3õ‰ÔÔ;Tk¾¾°û3ÄUfëwÝEøû!‹À… ­Œ§kn·¨‹Þ 1“4ŽŒêþS„ µMFšÑF‘dsöú�¶<‘É& év>Œ�Nûæ(ˆ÷ÞkÛ¦+â¹·NS†”DBŽÅÌ­´C½9vR»Ÿvc¸½F/R¢Ú7+2Æo ¯â ]â-¦xª0- †8˜éiÖÏ|­ñ¯‡ ÷~—œ;1ÂÓâþî(}´ÞÅsgW1 ®9T }á¹Tkf„ÊÉÄ Ü¾#nv%±¹}6Íܓܗº�ºÉÐfÒ†~¾¼¸¢Ú×WÒG#ÿÂÜ÷ «‰ƒ)Ç]Ô̺mŽØèdÓŸ­�Ó!ÖûŸç}1ÎÖuLS"©Ü|È�¥êÛÑü•e7™0 »"–DgEÀü�1”üÙCø�‘+’V+ÙÝÅyï%ã<5*ûJ^3�)0Ú`–e0@³Ä�ñ|½YUÐ|–[=»|‘Fá^¸ã3ÇÇÇÙ{C’"8˜’`PxKnŸz*"u, ø�ŒÃŒ»qP3_�‚s¾3yÚÎ2�"ë#2)ûÕ‡˜�¨ˆ^Ó@lm4™PF1⼆­-Ã�!¶„À,ׂa)ÌÎåj3Â�¢ž¢}ºiƒ�åšî'ËéBí ×wxpn°ðLþ$nfæÊ†7‰NÞ¡ì€j^j…ÈyãÙ’RÂ8¶]{O'ì_ wó,3dWJNÝG<}ù÷£´­ëv3÷Ÿ’´€–0øêid>´ TÞ‘�©]ÚÇ×I.’åµ-R¨ŽÈèÞäרålút3^¨iSÒáÎÒ×_IX- '7yÎÕS¤hÌgÖ8#–7æMwÉóÇñNËÃŽ®c‡ó 'Óœ}ÞD‹›Òãeæ…Òç=1ÆÄ0”›R¸¡®úºáÐÌé›C”ƒu-�´PA(CUOXîeã92BRÓì5™ºœPl‘R¤IŸiÕ#p>u.Órƒi)¾ Eää1vPãŒF~Lëœ×$|lÞúlÀкNæ¾!¡xG¥™_âdÀÆøXd%qZ�CËgÅI›·ø…¸c{–u,�ÐA5 ¨A—xW%"^¯إXó(ˬy;!4½æÐ�æñ{;Q’<�1šg½æ;ªPWî#f%éïô ™è*÷Ä—gëÔü˜/JÕ:]Šùkç°ÏÇ’¢™ÍÜÙ},ˆ:+døÖ>9k¯‡=Õ�FSÄ.›Áh®ÄpÝ�;–@]+—~9;B;£½Yþ€ööÖÐÖ*¬þöpŸfˆb“RÏÖÈ�yjÎ-tò ²w–°®«ÏnzÜvgJ*†ÝsfÂÔÛw`ªÜÜ[µ4Æ‚õ“.d8´27¥>â3bÌ^씞%¼êæÂõ/Õ:i>åÝžì^+{¹>žfí÷o^ØÊÑÓ«}¹0½cCZ`9»^øåqVm5Qµºé] ¬N‡t.¬¬²F—ËaÛºžaì5bVŸ^÷wfÞiß é¥NÇWZR¼§P隣¡Ç‘ÕIº1";Ï2(çŽMTDñ˜)ž™éC·h’8s­¤{Y$^EêïKg¶ú÷³}˜Fã´3MkZÐD±Àõj±¤ <”+A³: ЧˆàÒS¯¬!šµA”¯Ú=¹Ñ¢;vïÀgª®òÛöf0»x!y ;åV㙇6ɦl± ÷H9Ìî+“ãCÑ" ÛÚÉ&3×G¹”zï�w’ãt£šï»$�ÄÁ½ãb ¡–Ó¾&í¼n\„ÕϽ›š´B… B]¹y¹¾ãR? ²ndÚ<»°XJZÛ¾4Æú„Ù–ª°^1U”®-*ñvMÅNdÞŠ�ZFÓ°w˜t†{p^åIv0äy}|k_mÕƒ2IÃ7©’˜C@�`­¸ÇY™Ü�T&ï½½ÛìZ—uunéöãäO«wÕvò¹ô[Ê¢-û‘R]�Ç|Z§Õ´X¯†0Þn3Ò…�Ê;ÇŸ½¹b_/wHµ‰˜Fu_\—¬Ù‡JãíëŽ;h­võ=ãå{œ5Š�ê�œÎÉÀV $ï]ÔN´*·z༙ÈcoGet Ø¢UomYìéW“°!}Zv­fà$<¡–êu×uT ƒÈf:sÔðrÌQyÖâ}• ¨;OmÞ®¹–8lºÌ…+#ŒÍ}؆-çxoMS�\üFpÄ*î GDÚ/°å]ïªåTê‘Z~ïUç—¨{²É’�˜ÝNev2×ogzø"7&ŽIç#1ÝÞ·ˆvâÝG¹!¾Úì˜äÐ’¥S(Ó(kœ9¥‹ŽÍwïby¯%U 7}:8µw±Eê㺷Fnß ö*ëbœæÚ9Ä™g�³z@4.—pãL0Ë©UÕÀc Žº¸ïnÍcwÜm^Ö.ÝåaàÇhjË¢U\¯E‡µ±6ªB=tõõKU›¨¸úªúë•`¾öºˆÔ3»_ui§W…»HSrÎ^ûaÑ‘Ú{»®×y2š-™¬:Ó´ƒÎ3wz$e¶“m¡6�°m¬j1li+bÅEIŒ06±«¢6ÄQ¬›F-i1FÓ*4[Q£FÚMllV-£X,Z¤ÖŒ[DbجmZ(‚ÐU±P[E¤ÛF¶(¶Ñ­£h¶�Q¶±¶ˆÖ65±F,mŒcQ£hÉ‹EbÚ * lV5flX¢¶ ¨µ�±bØÕL«F‹F£QhÖ‹hØ-ˆØ´hÖ-ŵUjH¶M¤­P&±Q¨Ö‹dÔI$Z#iˆV-¤Ú´XѲmTU„Ö¢™�Z#I±hØ�‹�“[FÒ‚ ÖŒjÑ%EIkXƒm&�¨ÕÔj5Eb�bÔkY•%XÔi*£hµ‹XÕÔ[F±¢±bÚ(Ö+5¶5±«[EU‹ZM¢“mm�hÚѨ¶¶+m5ª-�«¶KÑm¨¢­Eµª�hÕE¢Ñ¶Œ–*6É´UjÆÔmŠfÂbƨŒhÑV"Ñ ‹ARb-± %�hB6¢±Y1Eª�´˜ÖKب֋V+X±Q±¤¶Èj4F«cFÕ4FÆÕƒ%ˆÒZ¨�jD*5¤©5‹ÛIª �‹QlhØÚ0kcXŒšMX¥“* k%FÉŠÔm-¬X¶ÆŠ‹DZȨ-cbØ¢ƒFŠª-%hÔVØŒÌműm‚H“Q�£[%hªŠÄ””šÂh±F6ˆÁÛF 64F),•Ådª1 Á±TV‚¤¬lj*Å16ÅF£Xصch¢¢É±Xµ�Š‹E4j,jMEQ�FÆÔ–! hÛm ˆ¢Æ£lÊ€ÚMIXÑQ„ÛEŒj‚�ˆµ¢»].¸Áv�j·îˆMî  Ó2ªÙz`’@ódx­œ1ÍŒ<¾Bo[î�;½>×ÌÆnôQ¹Ø!‚ð<÷% §x/=›S1X°S«iÔçJ–×zÏ (s²TêVêLȪæ>™5Rƒ°Õ^M´8Ùõ”ñð%ÇžÂo³lh¨Z¡ÇlO^T§nNÈ×L6µN1ël]õÈÝ¥‹o£œ2g•¾{7"ÇÁ¼8;Ë’øtÛeÛëy›Â¬ul7]}FV\3s¸­—Ýa᱑SvÙKXZaM3»ÛÜ·r´«t%_J…Ñ/Ì«ö¼ ² FèÐÓ ‰7 1�ÊsaÝ+Y†äH*&¯II¶¬ægjPÉ'”ìÛÕwBÓê84f1MêÅØ”êØEà*µµœªÖZƒ9�½dó«Yy}ƒEË�±¥ÅW•w6”Жa®ÊdÕÝëÚÞ4[•KmnÁŠÍCXáK¯kQС.ƽŒ\L~·^”c³¶[×®"ÔÛº1¼jMö.†–f<úXÅ篰ĖåŒ�gÔä­Ï´íð]Ú²f`Ì< U–õÞ@|duÁ*rvæ6ÂÝ¡@!Õ²uà¼!cÚ•´%—Û0Õmè‘Ó­x–a€-NUf\ê·ŒŸf‘oMZ¡¬n©Clvwcw‚ôÎoŸZ‡ÔØæ…n&²î�žQL6úe*uÓ¹v´ki©évòvp“«U‹¾[¹m ÕqÑ›½‚ìG^P\ǸGLo/pÓ¥$æ@ºé3ƒŠ!Û¡»‚¸Y­Ë­{cà­SÔo²iÒø¥Q>]Žðn2w�‚ärë,ÓãM ׌GcœÈ±kÍÞªê¼�Ü7¨ y—ogJÍŽ]à"¶§�‹ß»:Om]mi“�HaŒ€Ãv€ˆã¾b¨�xgn=ÄmçQr°H>{KjN#X¸ÄUÊÑæ®eîe ˜ ïU«ÕëJBÃz#¯Û0·³«¸;˜1̽ÎÄpÈwkwƒ vRúÃ�%{šsƒ§òªà.&Ÿ;Ÿ=Ò2mÞlφšøV jTTù}jlF¢Xo϶þ¯-¨–ì³b•_hí•£Ô÷fµ<ÇÐJŠ;�£~í’Uú…®µ3)%#¬w5GmÓ«ær®[ËÄ�ÕeñÞVU”¦ï�2û,*ÐtÉ»´Õ ·˜b~Ôulšm ŒöÅX :vãTôY(ëc=fÙ YxÎeÝÉvéTÍoÙ»C²³ԤͰ™³@p¬®«Â%Ò&ë„ꎠÆÁj WOFKaÛÍZpïˆj®õÈ-Ü›k �·C3‰Ù™nñÖ‘Tà¶‹�ê\:¸àÜy{½T#`¹:ï¶^Ú¡VmRØ)Ûxo0¡Kq½ÜRrÑÝ[׈ž¼v¬^n!GXuتëVT³¤ú°°BΜ®UdF+•\·T²ü{·.Œ¿=Dp¾‡ , ÒÎÌ�©.!�Ú3#ŠÃY½ÔkM�¥¦¬\ïMö GÕÂÍŒã…�@7~ìÇv½S4ªÉ¨ó¼4 ãÚ… qKÐÉÞœ¯b0Ôʼµµ´­jàv¨Vn††^lÎ5´[“v¹é ž¡|»¹b"Pö*{‰öºé[=V‰#O‚¬VX›‚ M{¡…“m[2]àª&vS¼À¸ëh#]€ò«å,†eû7•¦qF%Ù›ôè8/f�®ìo ¯4ûº€@ÅÛ¿WÓtó¼³ß cìpõ ÁªÉVcføiÏONö!–tT\TØV]MÁ[ÃE‡ˆë¾+Fï —<Õn•w½ci _š5ð̤ö¶UÙPac7)× ¤A.ÃçJ–Œenµle“¶+S»ë½|aºä‚ª‚|7w¬ë¶0-^F³…vµÞˆrÛ7VðŠgÈç« B]z¸3í®�ÓZËÙo º¼ÞÍ ‚À^lƒfŠ“’‡1Õ†ÎT¤h!åY‹”9¨«½CZ,P½ëê¼y…(ð­4nm¸ŠD2î æ/UGmVÙ»–òe§ÁêôÏ\ÍÑœ*c¤HÈAË5î Ý…î5·—™É·Õ!irJõPäÁ÷d¥Ù³·Ê:Ú0Ö#ÒälôÚÈíuzyaŠâ»Øì, ðjR�y�ŠÁ1@TC!§ÛaBe�£R�˜u_ˆ.µYK¬Àúf> mÐÄÕÆ®{ êw•ÑAlºìÃÙu\;‘ÉPòžº´Ø#+¯+«²°'–+,³™½`ê´ës:Á¼Ò»„æÀA—›t§Ý=[°m;l—F*߸0m )Œ…nS«¡Cq£BÑîâ :á¼+Mr¾Ž…ß*™€ä�ût—N¦*Í¡²ñͺ±Ù¾V�·§…åÆû)^§ÙgÔrøêË䛳Åb€K©åÎëÚ³ÞÐÔ Ü{Z³E ®ÐåÀÌÓY¥Sûª×dS‘VÓ #5*ê®R³¥E2›Äë¶²ò”X+2¨ªUÙ½‡³ŽÐ6G=��– “ÚÕ�l/R¨M<çêaƒ�VZ"ú¹àª¯*ábuPÙqöU ½…`±*«˜s6�X+𽩢«x‹bLHtWAÌ®ÉwÀ #qá�µAjñ�™ƒwÜ3—¸N^.†ðPbà¿U„긴ûb|î× &Û—g;mm—¸ó/Ï´Þc@#‚›ÃŽ€ü«³[~€YìÎÖ;§°+¤�®èÍ «‘ã™;³jPufÁzIvÂhöPÕÙƳ ̈́ѠuÞPNlÃE­šó‘x^µŠQ�…ÀøoÝA¯¾áMi¿½ç‚,j]«¹¬†É}¾Å7{»S-±œ#©PD‰/4e„$­Á4úI•�! Ð$D$€@Ä� *€„„+€!$€ÿÞ A±þJóLÿé¬ `ËÔWÚ\,ôn·ý/q‹NçKÉ¢¾?^á`9—�k¯Tþ„S{Í~o¬�ÇÅe?k~Ÿ:ô�‡iªÒE0S Ã{MÃÄ¿=TNÛ‡Š?Š&çæœ;t6þ>Ýæáûå#"~1ÙÎëÛ¶=Cœì/ žúçˆËÕÜúx¾ß9?S»Ã:»ÑtãÇ�DªÙTï_œöa[ÿ¦00~¾(:'ª·÷Í™J²° 8DžŠ¶Ÿ¥Ãæÿ4éë¤&‘‰mÝâNÞƒ2îçtx†1§þÁî˜ ÿ]:S\Ãó)u�°àóȆñt}§mMžEÏP«î2xùU.ʃe•*u)ŽåFöBùÛÈ—D‹¬îÔ[K÷ÊËP½wó÷%ó˹ëÇIAü:î"HYÇgq°r”ºž”mkà #eâ’IÔ·ùnò÷P��&JÇ3â¿Ñ–/Â8SRàý¹Î?X|#�žÔÇ"Æ ‰µ¿Ý9¦G^ηM»l1ûFfá¸Çf³¸ý‚rÚ÷óó:Ë¥$¬Uþ=b½¾•Wñß;C \ç.ßk/�c„)¯Š¤Žc¯ª9æÃ¡yãŽ�_fakqÓÌOm6f%}»zÝzü�4Òëf±0ÒmlùéO;lWé#Ht³ÎDe{XW ޹]»¾Ü÷Sê³O^»(Y›¹á<Ÿ­£§šw€�ÜÏ«ù~ÄÛ)DŒ‹ïSCNÆÖƒ D^=&×þ+µv-Z ÈR BIQ ÀI–Ú¿ Ü,ógbŠƒnÇIV[ïÚt)ÿˆH—ÖóÞ_ °ƒ´D3ÅiM£ñx 2!Ýþlr)´.RFÅ�¢ÖÞì^ZQ²¹l û„à�ýÄ]fñ4 ÔÓÁjþ HBò’u¶;ßO‰ŠýFØ!•N³ñ6d÷¡Û`}»”ÀdTW�ÕüÄݪIdH„}ÐJM™œÍE@”Ð"Á»V•1©—F(UG@Pµü!$ƒ 3®ÅÎÏ/ŒÁkAVôf\·5Œ\F©0J"Ò*Ž˜a.1Š5VàpMÀ¼‹€\ ’Aá„’ Vö¼§0ûJ“hm2x'D¢N÷+ÑI��c‹ACt\J… " *áˆ(ЂÌK“…ARú’ tEê@”Ê.Ieu]¤!†iZ´e¢­=LÄQ/ö¾1·6Ærl¯S:ÂÚUi iÍ …H5��J”K—rŵ´¶Ÿã:±BI„9�¥Bt)�R‚j»õu%–ßZ&Q‹BØ9£†ië»@+J´Ë(G³*K!Öî4þ¡o¢leJxÔ÷áwž÷àFáµýÝd¥×ªƒcR„7®…R–’NŠX°{ ’Ažtþó ÚýíŽ�V�ÍNø‚snËv�¡»%0©)5˜sR(­¡4IOE1öJă0“/8º{P’¢D „Y÷IB¾˜\m×lö�äoµmwM ’[{"oŒVÈ[Ç#ŒZ�JU{*]dº½�£Ö…`�F».’Hˆ( P¸ºIBKMµãf/I’»R´ãßiô9ê¶Ú³Û8Æ-Š‹$é­PŒÁDzš=áÃJ âmüBÝï]£HÜÔi€š$èÁjÃPdQ„’Ö$’ôæÇÉXK½$I+¨k÷ C꙱ȂËå GÊ[ßrí±±Y¬£i@%!¹ ÷7?Ä�´ÐÐÆ’¾Î érÝ+tY /³Õ­©Ë•üªH;´�–ìi$ÛIKÑ ÷ðû|�ŠÑ…-$»wì;Õ'ÑÝiö•?¸„ï+ÐChÃz�‹§ñÓ¨÷½çW¿fÖÔ@üßád&c�ž‡¼Ç¿a-›†Þ³O:–ñÚˆÇ ¢–{]G5|'ÀN³àwôÐû~[Ùgd­Ï t'gy‹lNªÁ³«Iã¢5ÞTÄ{ýÿWÖ%Ñ™½ß¹ Ñ¿×—'¯q/Ï^üC³­NÝúK^:]”ß×Ö: ۈꎱÒW}Áõoû°ãþ€1Œ`dv'4´w?ϱ³«æ_£[Û›z¸NCœS=³Þ¾7Ç3:ïÍûT?wÓ•~ß'ѧ v)qÏK~¯Ž™‰´÷Í9sõ¥r‘QþÊA-”A{7 „84õ1?TÇ÷ÛU¬»ûn<ÏàwMûc4ð&îÝùîƒkÂÔÚ”£È¢î¦ÚîãÃÆÜÎÁؘõ¥Æ{µ›ýÛ×åt™öŒwèâçuÖÞhw�÷§_î=Ñ$îpç·â+g<#/¿Ÿ¼´óä(ßÉC•Z}0yª§}Î͇]y�KŠ;Ï­ýëôF{—çx·[dLÒ‰²ô— NÇ]ñçë÷¡^E×¹sÅ«÷m÷¦‡[§E`ý3@ã§ê X¢1Æ=‘‰î˳³ÅbÑ�yx©†éo1B»ÅS_“rR¢ j½íLU¾ pB’ ËŒ„˜×…ÝBê¤"©#i 5Ke›Ó^M4¿ãLµKÎw®¸­ê«6­+rΤ؋WRêX@"¢ÅD[~à}œÂ?d{<À²ÓLÃãÊwè°ÿ{ü2fåÉÛæôýºªs2µ|¡¨8�8R„“�TÙÏá³ÂRÒ¿€€RêPêC(l�~xÀXd’4aÎ áD�ÄÁdC—Ôx³tU þJ ¿4Íï5³¡E–UÒ±ILL;Íd#_ü \%žPQ¡KL•]Ø–¤Ò2wmš2(&�w4‘)Oõ„’ =ë¦\½õ쳎!oÛPàc :éH;!$ƒ Àm‰Ga4&ÒZz¸IܶÂT¬ÈÙ¤h“?ôÙx@E¯‰Â¨âiƒQ¨¤ÿ1P‘:••@ 0T¨‡F!¦&ÛL0~÷ƒZíæ>úý¼W•ýžÕ¯ê†ßœDmà ­Œ”fétØ0Îí@Ë`çž–ïs:η³n*Ó{58›U~K´: (“AÙ KÊl$Ë)”4Û¢C8„-|(Êò¿û_æÆ“šÍ±^/WK×ÑÒiSï[³7só¶³@½áÁ !<�j.�v! ¹Àá%JŸ¨‚"‚� ilÑQ‰.Mš™H½¨Ù8h*ÅQ¸-SGéµÃò-ó ú`´½ÕσHࠇ쑊öò pL°Ò9#憌¥B*šÒõǬ�»D?òÑ™™4jCây—“9Î…[0u *(V ªJU„£ï)¤]�I½;N¤¿yÅþ­í�çÓ^ ‡ov’8’¯D‡Ø”Lk@¡Z•ÝýëKÙJ5P‰¢Ñ! M$ M$ ]Gcèô�! çb¿mŒeAF”¬Å�MÊl˜S½Q Uܯ±þ¤h}ÿtQª¯ÉM R¥<üéÜ$Ÿ1Æþ/nÔ/¾W÷ÎÜ*[×¶ÃÆuϦw÷ÁxDÿp'SÎý½¼'L˜Ÿ¹wŠ‚.�AhÏÞ×íÞsŒ) Õ¡z÷Í�VÏfæU¶ãÉ~Žî?#x›±Ù¬×[c‹óáv¦3o):ñ9vh0ì ÷jjx�8åë·h¿”~û ˆ&�8Y;(ÿÚ�Mùåè ô¶º»’¯äáì›æ~‚÷ÉQüvwºôñߣ· 0`yïvü&ô(dÄýwö°Ô÷Ãð>§= ~ûv;_�±²h™::�ÉÇønK¼áÛÍ´¾úÍl‹CÅÃürgâ'n݉û¦‹‹ÊWš¿Óiã*¢^Ý?ø,ñ™3³GâeîéfÒó‘Þ{'NÔ¿\\ßæþ?{Öôfi¬Ÿ8ëvɆgÄ%ùíßÛ®-ú–„#EâòðfQ};J cZáä{.þ¿`öðqïí÷KúŸŸÍOožáçÔâèUw�éùi@N}ËÃ{¿Î¼k‚xÙ²äYEÏr¾Û§ØƒÇKA+×·µ¯Øùñ^üíŽ9ã¾%Xdg·W~¼�â �¨òõ¾}âÖèu �\Zú⥌bgölŠ{¶D •JÀ>S ŸP_.ØJ™iuV~Z&{#ò¶ÁÆc ©Óðʼnü5ëø×LìÐâ@`çC¥'w™Ì‹áL¹"øÓ (» ²7CLáýÿSÍb€ïÿjç�˩ѼCË8Vál¤¬‚®jÔR Ê£V¸BO›½¼IM`ÑÛÖ¸á„=ñäÅk‡¶—¦aõÖ©·ÄRÃá :¢ÖIIzL®À5¸úN…¾{”Údµ‘$O8Ëq†‹™áÀw.e†P` Š‹cl±ÄX‚7aÐ5fbÿR@�…„ߟ¿Å6÷�o:Þ•gÝ–š`—éi©pÝ ÊÍ>UET2bjݦŸ•ŸN ¿GwjJ«CG‹¦ÃÊ÷¤Þ±™‹Î“Åù�N×DoO{æ–,ÍWd pb ƒIiÈP £aáÀ0aé%š*ß0�a…SD6ÆÓhÿ | úõ΋W(oø‘ŒImp7”Ôüb†š:z@ZCi‰5‰n\<”¬ð ÀÃjlVJÀîP£º²tCô"¹ mt²*ýiåmhü¹STã‚–n@ÞÖÖ ¤=¢( PSIˆZݵp³á_ ŒÂY„KŠÊV£‹›ñY²·ÓÑ× 24µ.Gü„’»ÔÐÐ’Ò¶l­V ´„oh½Å5hjÈ’;Rw±5ÈX°H*„’T�?�§i=НâÓë;ÊYu‡éj EFÑê›jþZ="cµ ¡*ö…Ù‚#d’¡]uÕT™† 1_�L ß×N{º§¶qáAøÇBÍûØ]6·Ž)ë1µææP6·±üeNÝ.¾ô±¯¾þaaSNï‹ÞP¶Ø}¦þ¯£=zŠOš]Z�=œÈý"v3�ÊV¸r÷Š+ºc´¶ÉÉdE [šHú{Ìzwò“bJýÚhÖ½½Ñ¯ÅÝ£þ€ãÁDV+®A<7‚éOEÇ�!ÕÀ±* fz×¢âNÕ™ãŒ|òá—±åˆLI�¿ø¡¬iœK«¯!þJ1È ªÿΑùÚ›ÀÁxü|Ö=ùÝW>Òí#ÊzH–“_,Þ»~AD‰¥è£dë÷×E¹Y¿w|´¹ü�„°ü9ÓÍ™=ûÄ|¸˜Fr}T[§Ùôúm·ÝÞ7Ú˜ñÕ’?^®�‹úõ’>~¦V²ÎköØ_*h6/ß¿ªŠ?§¹×]î]gˆüŽÔ�”^[(Þ"h|6EW9µæ|jeæ9ùÖ£?Rûó­õwÌ5爚|˜&ü=KÆ�ôêåbA‹‹€|2ú սÔF9/ݰîýwå] F;&7ëÕ™ßè®VÒûÙÞ¼w÷€ìw!QnöV5z~QïY™ç±�˜êŒôè ‰Œ~¶nëÓÔ¢Pö-Ïeª îíeƒ³Q:X¶ 6k¥)xs`%Ï–ø§\âÔQµYBÆÚqî,ÌkóÖ7úç¶ÇÇÖúl½µ8Õèw¯Å({/¬8z¨jåííäG+ö†öFéZ~™±Å$+ŽÆ®J!+òâK"ÌÑ'ws�mR¦g|V·.}O»z,°äÉI„nz8j�B ôlz!”§ÞÅ™½bÛÄ6ñ’ÍͰïr kûíœßGzx©¹ZÆé´\p›À Š.")-˜�@a<Æ)‚¿�1jÁ_µ)b² %dÒÝõv‡÷¦4Ffáñšb†?°áLb™¥ RÖZý©'×mj¨5Ÿ{Ô[•õ€ÉJÔChcX!JAB¨L^lû Pð¶Èô¶(¿çJIˆ)4¹cõ›£‹¢ üS´~­/m'+¬Ø$!u¬‘®°B– ¾ ‰¥&‘¾°\‰¢L�§UíÚJµ…ZGÞ�Ɉíµ&•ùu¢‡hçŽ[A¤Qh©_a>_båe°ºÛäŽ@œO8Ô¾GPÒÁJ:�2ª°©`pDˆn(ÂqI¾Å”V9j¥GAi(°«íPT³¡$�J $‰+óïÝd _d¾�ÐjÉ�‘dêöþ Ÿ2Z¦2Ò·ÎBo]Óqµ¥ ]Íz)«®ú{-¦œ’E†`IˆàG›ëXÜ(r�Ž=zžÕئ­ýƒÜGª $Œí×÷í?_:}ü¾R¶KôìëKžêÖ$¼m¼N¢?6£àn«÷_œâžD«=ŒöÿcŠÀlÂç0v>É~Ÿ¤ËúZ·í×]~lÒÜÝÉÊz®ÿHAÎHW÷ÐíHêÄ5Û8&Ö¥Íâ‡W†¸·Öâ�lhaã­!/Æ£®þ×|�]=6êt®5Ø›,þoGZI¦ÑÓ\á½ Ÿ²ÈÈ�£‘?«~öŸwžà݈°¼ëËo.±`].ÐößÍ�È;4S·<@åµÌ“Ë"ä4ÑÐüAá.önük}¯­£¹Aö*Ô=pÑVÊbƒ|L¤Ç3ó/É^Ñ|y˜Ð¬ÝC•…Çë±^!øJéQ¾ºoˆb2Ót­p¹?3ƒÅ"¦RØ8I�ÞéX½f?›¿wêu�á˜}ÁÈ»uCJÏÝÆg¸�!7íX—JgëÖ_¹éæJKŽîvþ"Þh1‰gœA½ÛË/Ç=qg“öèÍ Ôr…Ž÷ñ Y-¿Ï;9ø9�jãÙõÆ»Ž„Éü´5@¯ÏŒZiÌiÌGÛÉmêùˆ^ü ‚Õ«8d&jÀmDÁ¬¨Hªn/f,F/Ó‚ƒó*Ž_f›!£Ã1¹ê’KÐZ4whÐÔÞ­’Z‡Å8AD†XV±TPSŸÍJ ÂI]"äAÔ„Ë„ÐÛÞ’’¢¹RBËD�$!lëÕéAÂA‘\#Ø‘$}Óÿ¼ƒA5O¨^é 5 ¡E7ˆ)<›„£ƒå €Ås{ fçÚ ç>(ë>z�¿oG6‰3üë¯a ý�E¯ç?ƒñòÀ�kš||ú‚8uŽ�¹R ð=�[‰ûf#Ñòq×cpö·›D&Q›–óï7¿¿€÷ŽœBæ×2Ëø)5ÿÙ»\š xè—óñ«g¼¸«æEÏã.èO ;ûPUz <Ÿ�˜é¢å=çÇ�¦ ¯RD‰ˆ·ëœ­c;-#Éþ³·`ÜuâOï þß§¯ßm`Øu‰m;ýâÇ`úoíâó®ºbþ9oæeÀã®Ô¡–îôGä¼4µÁx8}±Qìy5X {n²êï+Õùê1"èPìS’[Ïæ’iNr¼tx^ÑM5›Õ­]ÕòÏYÚãŸÛ£Øù|k:“ý`ëÛHÅŸ¤ùQï2”»k5·5—3_’°Bßo®É30ßÖÇÏιóÏ™�t……:@Ë¿ÄLïËŽÚ…ñؼôê,°Ç)teyI(ÍýOu§»÷2¯~aqt+’ìÅ;dn‹wFƒ×ïšu~û¿Ç{g¶¶÷ž¢4Gpy=ïìúùu¥Ú»ÔÛÎóæC#x»†„ñÒmñµ›+ùAb&& _=;´sÊψ[äy¶bú÷@õ|”F�%§ÔãâÀÕ¾,;ü°Kù™}=<É#ß~¼ùÝ)ßh´N¹²°D»— †z»�Ó¯€Oc6ý¥È|Žu ¸Óƒ†ÈÓŠ MIÌ‹P\㣄„ÖÚÛ¸¶¿nOK”¹È“?§.ØÌùÓgžÖŒ®ÆÐ»8ú‰”ˆBö¢€8*/‰P3V\U±-2�U0˜É£WJRŠØ½ �0J ƒ4}¯·&ÑVP™5-;Ðdbo¹ƒ·1»¹£®e&Á*0\˜\à¦yj¢³d*‡ø’„-co®Û{_µõý”ÓŸ7%V·ÖŸ¯1Æ‘ë݈Ì-Ud.hŠ"h¸’ *eÑQT1äDz$¯é¶+2ó„‰D~‰�tgu'锤›ÐÑ©­St…Ie¹²îÒ–b‹S èâBœ-o6–ˆ\"R¢)¥IÍiwTáÆŠã>Yý´¡÷ԭ㢥¦&_ÙŠ<4o÷2‡¶�´œ¯wf•æ ëEvQÉÕÞ¤^A¡ŽYEÛ;h´­2\¶‚!7aÇú:i泜¹C¥‹."&8 P8†ìiK|èl$ƨ4& 7BË=Æ+ÁS|4‘8¹>‘M³÷z;•vàå¹±£Æ,ëÝ0Mó)©7¾y‰,¢,º”— (ö¬d¡‰° �W$�7°.ä40H¶d_¸8ˆÿ.5R¶&^Pf Fµ�y§£#’+º[+ÂÚç¬Î"ÍÑëF”. Š5 R86®7;C�Å7Í-Cê=sïcMüÌ䳨kž@–(–²q˜`¶�Á“·ü@"Ls<•þ»�çÜîÝÁÆÚm©‰×zÃXrQ™B& gT :?1ÚSPz õjÉ0öDƃXþ¤‡ßd„¬Ò.އP¤Ê}­B|xøûDõªì]ÒŸÑL0í AH¶ìJEO€ÉýE>zëŽü&yÑöÒúxè]ýï´±7‹™�?MZ‘ ŽO óÖ>Ýwbƒ|»kfô<º‡´é¬ \ð� ·j¯†=ªã6µ?-6’:ÕŒYý]B}¤ÉÎR°Ã«?bmlöz»ï©wª4S…«¬?{¤¨Ñ¼«T ãè¨A#õí‚y·Ø9#·6”«.!;«ùï�ë—‘zàÚåü^;t*ÈOmçg]ÅÖå |x]¦�~ÌõzÓ¬[̬—Õª½©ç£bo{½[Ç^Ù¹õÛ®ÛÒØ¹ó¾�]9øŽØ»~ÆO×ã´CŒaí­óx†ùõÑ2ï1%ŽæÀ�-w4÷5t ífÆ�ÐçMñütçZ«Û¾Üs¿´ðñ0Úð4¥¬Ò�a(þK‡¦N:áì�doÓçkvÅÙ³¦B·ëñ/ϽsÍv¨FvÜRší7¤0KZÓ𺅠ÙÎýÝÝz ~-kA[OÅ£)*�úQDÝw@}¥Üá±uå²(EISL"±3íß¶,è÷ÇhW+aß3h@:L$çdØJ‚ Ø!{Ï^Ô_çA²›ú—uê<�=°�vB?v“_ud×Á"ôÝÔSoìz¨Ü¶§–òéþûè=Ý‚µ£µá;5JϘ%ôê—ÒúkÍýK‹ût¦>Ë! —?±l&ÿ/QìK3~Í2�0^aX�0îÚýDAÎЈŸºq/~‰…жp’PŠÄ~‰ã’e8­éi,æi©B2}(†XP½Qþ*±U0 �0•Á#ÙˆDÂáèÂVZ.áˆÌ@¡†ŽWÀ‚@ëó°ý'|üÒ í_Ç}´¡æòQßlõ6™–#†DÁaH®,Tïy&°Gx@„�f¨órŵâ [iÀ|]í)[kÖ¢[¾ºc� ~Ø’ƒ¦%KrJ‘—hZTÖJ,M�WX|’Xµ΀‡e‡‡¯}(\ÑÛvk ÒV}ô‚¦,ôæ¡‚Åá(OKìå$Ö·À¯·ú¸IYºAoPïΈù’LУ ý"”?Q[Vj}œÐ$D)Ÿ´æH¦ˆ*ŸôñN›¤Çø?öêF8;IÙÈ6z„ìF¦§4d‘4sI¦ÃôÒÞÞÕҼ暺²1aÕ9)fMJéß~ ÑÚ` šó@U2,© kÌÎÁšÅÜ /ßì«Þ.Ì´ª3` h¬Q¸^–ù±:à7¥¸‹jsÚZ6¢É8ÕëÝ|³Á—Kƒ¿¿ÕÝ1ï[[áæ,gíäÈówï)%d«±\8H#Ð"¢G4´¢€Ñ°¤Þ.°×X»‰ˆy(µ`Aï{V«î�1'„Û¡Ê7þM²�Á¨Í;† �d‘ˆ¤" ­{Æ8v«‘ºè&È4xù Ô1ÞÂr„w…s­ÛåTo†0ú´ª˜*”;}��«.;ˆBº”H a¶ƒ •ñý‘QÖ P"m¶þZ„“C* ¦U’£aL°ºT(Ò\�G´NñTÐS°}‰]¯f0 $‚ÌÊT® 4šktÓnªù[—=Mçæµ&»JÆ“�´+!¶•ª+H|„*„4¶€%’áT˜r0pÓÞ ’d €«P+5ʼn æÆÒÁµ¬¡[ÛñøëïÏ¿}ÊÛë�íîïâóò±Mv!êÍ£äß��iX¦;í>ß(ŸÃ½øíÃËd‘χ¢¯ù/Å⢠{þíÎ)½”JYÐpŠOH\o‚ó9÷ÃPãY2^Zì¡ìx,/©·nu×ÏnÿZ(M ªà_§í¾ tA`‘�rçõ[Rðúj.¿_(þe‡ZàáŸ>< i½!úckuë�¢ˆá4˜-öûÝa%FÞRWòB FV»·£›Ñ ù=sÉT+õàëN«‚½OŒåUÞZéôxäŸÎnüaÔ<ó·M¹^%Öh¤Ÿ¶Ózãæ# x‡<¦¶Ä|ÂIÑžf=Ú?¾Á�y®:lpöö�çt åÓ«û vÛ~¡üh_Ÿ»úóÛ|’ Žų¿_ß” nëÕY;T6+Ó*�Ρó·CE»Ÿ´2th®>ýVÉé´»x¨òß×ÛÆÓ¬¥æìæý”`Äö™ï .pÙ„ÃIeð/œÓYNÔý�»mòùZ˜ô‡•ûE „£Ó—ïõÜøïûÊq_½Å“’íbwz[2NúöÁ­–£ò| ¿xé¯AAPƒ[žãݓĢ;¦'¹ì9â÷01���„…Æ£_J Ðf‡všÿ,Cñ+íë‘‹7 Ý'â²-ØlÏ–¯\x§5„»Tý‹gF ±Ñ]•�ò;©X ÇÀ¡ˆô<8°àÿÉÍÝW‹ Q�Xs8†Y3 ;èp°�óø5üÆ[Æv»´QªE™ñ9SoÌE!¬½c…KÞ‡žk(ó…u¡Œìÿµ°õÛO²îAt�†�…—%è•L GüÍ„‹˜øâʲhò›ÞBK¢LXÿQ™NëVÛÐ$0Å ÈkJÕ'I¶Ö³±,‡ZK²¦±þ&R¸ÉJ𷪄XÌ%›Œ–D€]� R൱·˜ƒxTù…ôïEX‰�ÛbMéDÇ.¼�ŠÝ“�}}²;rðXŽÔõ«T¸e’©}iAUÙ`6*Wpþi‰Íÿu/¦fŸó8Æ‚šSvŠj•BÌMQ”uRw’|Ä,Eþ¼çŠÜ2È 6µ Ù�H�ÂéA±£)ì-´cm’ V”TWXAXΑDRûF᳤Uå|:V~H^¢Æ×jФíé®#±oÆv¢*ÂwE¡�QƒN=²Àt… 1ÞÇìÀ¥Ø©Ó¹‚0Y$ _ »moª²ãá¼mkâ‹*l„YS+ JijjhaMiHÖ‰•6Õwó¯w¾¹óÕ2Ù+¹aø°E ?âÁû0|¤�/âÖôVÕ LˆÄÚE\-¸×�]¼}ÜùÞÏ·¯O‰1�åã­Æ+—}ïܪrý__GÁÅ=Y· ó½xó3ãˆTdO²9 QøéÔ;“ÌxgŽpÌvakµféMõ ì5Ù øÝÛ«Qø6{Õòë/‰)ÎŽ¾;NEÐRtÌXǧóÒÒ¿ëš¶0~Å;þÑ}ç+!щÕ޺°˜'pÑ•]ôFE§ùX»qw1Z`q;�üDul7·�´u/vB‡ÜU�>xNªý?¢ïÚ½Pü?¦ß�Yž9©÷œ}ä8uüÙÛc¨ ZíŸxýâðÏ7–å£^¾?yóy÷^qQ!Lù¦Åù.¼›þÄwg„1ÎñüÓþ&âŸO³ÇwQø]õÓ¥†‹òPïÈ~úç£>x~ÿ¿¼g¯iûĶ(Ö=>ñŒÉÝЂ,nß&¿/ëys?ÔkÿC­ }’VخնÃ�ž¹­z³›¥ù ϯѲqšGsÛë¾ ï˜e­kßvkò°ñ™J�÷oãiîqßÐÀbKö·'òßž§mì.þ·-°¢�À½ÜχØ�8ïÔL�–ÖªTÚ…÷ÑÞ»¾Üýï©úù¿Yr,ÇwúçËMýÐX˰x‡�½’SáʽíÄ}ßãœÈ³±>W“½È¾tŸMýoú‹çH`û‡_¸¶àGmáëQu��ùëDC$dÒ-¢ª L™¯µPDQÃcýÁuv½¿¾`Ö!¶‘ ååŽ ï·N�ÂíkzR$ ²‚W,¤Q gÂ-{ñ ecš$`F‰`]Ue »nFÅs6èkU HºXl[>&¶>‰>í¹·ÛØ�'¥šmÈYHhÿ¦‘•ÖíÎÀAàpIÀ€ÔhD�¸Ye»eeÄ_›fÜÚšÓ|ÖªñV ”CjnŠbTcaÒcA6H.Ã3h§»\SÅèþÑqÞ—nOªS4„Ó3šÓ„ŠÅØpÕLh²¤qy=™Ø€Å ÝK‹?C!ÕÌÕT-áÓS9tºêSbWaÌXXÁq½‚i©B‚)¥ŧ ˆS(ƒy”iE‹YÍ3F(T›éwgŽ*Æi¤–È‘T韑íö¿bê“ñ½<ÕQço©µ¡gƒöêmNÛ­Ï)æ!:…èC@èUV‹Õ‰$ Ô:$<:5š�콊Ç9‡ ¡1~ö+š\àX ›ÅH-TZ…h%l”5˜ÄÖ�ÛcÇ­€övpÂÎ.Žf¤æÂÿõTÎW%Á„[bpCrDW:°»U0¡¢B%Š@BB_ˆL¸”~ü/aóDþÈKºòì°�/Á!®J-WŠi_t 6E�"žÂHEBÞÃ:ñëÏ^J5wªôEÝ"ëòÜ4&>t#Ï쨦ó4¨î÷ZGÙݱ�]¼ôëmW㎟((-ô¬k+Ì!lsoRnlr¿rAqC¥°:þvví§Iµƒ¢ïߟO·K·~ýÇZâå6!Þ£Ïow|ciÂ8¤�fö�ߤRë¹É:~ien°¬©1ÛŸÍzÅ�=oŸ×ùŸ-ÿ6ÖUÝ?Z-LjCïJËÖ3è|—ì³òû;ï]Ýñ¾ ö¤Þ“xœ’eióônè?W§1YÌ4‡ÞÃÄ»ÒØäÞN^$*Ǭù€)ÃçäDóA U¶ûl~§æ–=ì h‡BÆôs \�ˆ!ôCØ/Ä•ûÒûÓ•»ƒU²rôýï¥ý„ç"¯YFÿž+Ç€(O—YÙµÙ3�÷ÓéÖ³´ñ¶)-úW}PC­·¤Îap¸£äΨüd´ì� æw¥Œaòw”˜D;"¥ß¬¨à."vùâEìíÓqͧÑϯ+Wâ7�­ü]NíÅŒ©6íÓ…mÞ(¼Áo»ðݶ2›ÇÛbÙøní5ûͰ×~lÔó†pÅUÏköö:´Iðì9ëšû|yóxÒèêÛß=IH]á+3Ô 7̳ïϬس(ú·Äz@µùvŸ˜Œ´'grJíîcß4Ÿ®ŒÀƒÆ {oñÄEU,BÑ�bGºxLne�øé( ð‘oƒbŒ*ÒQ™±ÉXÜv+˜?^2ù­18ÍQ¡þ?74:›Ò:ÎWÚ„ýYªèáMb�[¬8îÈÿ‚T©Á€DVƒ|ÁÔ¨tkK"(ÐkŒ %ƒså–* i¥hN¦�çíZ‰æ×0 N"™æQ>²M›zÌÊ×ï]„Šj�ØjÒUy©ZéíûŸ‡ QÆwÒ(ÔEö·6‚Ø”K• n„Ì:5]B“dz:÷E;Q–0ýr²B”ƒ]$«¶ wwq¯¥:«±6ù˜+èõÖ섪4b LÝžF‹0Â1CÉ x$CAVš¯$RƒjM£b7‚ÿµjñN¸�mœ­=605�—Œ Õ¯JH�?�se}$…¬à°ùP< 4 Yy§ý Ó´vÇf^”­Ãë0ß0Æ”s¹(Ô �Ó§çñδ6Ö•‰“I?[”zDÄØÙ› S0Ý2à%"°Ä,UnLµ ) ¼¯Š<Ëo5“>°iH4ÌãMtª±o2Ì!¹ Ƶ3E’Œô‘-F€«°4¬0.Aº•�£ÙžO«¤’<´Zâ…û¥aA¤ ¦„�§À’Ô ù�‘lÑ/SïÆˆn€À .ãû€h\BH²ÀXáPÚä!�¬’·„{$�! P$�4�$!x@!$‚µ¶Õå¶­­oµmkwuÍRRĦ–�Æ™•†H¢±"˜6lØš$²˜ÉQ0Y²k4ÅLÒX«%A‚5&Å(Š"l”h´h²Q%IDFŠņi P„Ô¦�ØFÍ2�›&T¤hJ™!…,k4’R–M±™$F’‚Q²ÂŠJš6 #6šRÍE¦”Pk–)H”ƒi‚¢Œ‰˜– ¢’Äf“bLÓB¤Ù’e-$ZM#XšBi, 2PH©Ê–! Í I²H£K Q¤Ì*4f�fÒT‘¤ÛBM4ÓZŒ 23%$-˜ÈF©”Æ•‚e$ÈØ¢%ɳdÒ”¢²ˆ²f‰š› 2ŠLi¡¢”Ñ6X’––’© IŒ”l¤Ð12B%2ÈÑXÌ”š1Íe†ÂlÚM�ˆK Ò e(’ÌH†�E¦X•(35$2e6™K2¦i)e™±bšj�ˆ±4Ñ–L¡Œjl�ÓcDÙ¨DD¤Ñ¢�Œ˜’L¤JŒ±fF¨"ˆD"Á##R•1†f34¡-ˆdXRRÒ› ´¤)¦¡S!,Œd,L@Hf‹QFÂl¢T¤¦£i�Yb²m˜’‘´Ze e$Q³F‰ ”�†”у&’”Æ&ÂÆ¤’KM 4ÉRZb%�ŒD”J(6$4 ÉTƒÄ`€ HÒÑ,jhH‚ À˜¨Ñ$¶(((´Å‚ˆÑE"š*˜LaÈh3 X²Œša&RhÆ,mDŠ)‹2‘“(±PI´cS™5€fÆŒb‚#j ²¦É”hÛ4V�Áˆ›&ËL²,Q Æ€©* šRh$Œl*i-&Í2ÊÉ)`,ŒÀÄe¶K(&(Ù±¤¦XØcPÈ¡I1±‹2m2Ö(¨ØÔ¥‹ ÖLÉM)•56 $b´Â4FÙ›ÒLQ™cÍ2†©–ŒD¦‚•I€K-&T–FŠf ii´ŠL…4�#(6L¢I%)h’™eAˆ²‰"‹ILV4F¨¢Š+£B CR6¢Æ�™Œ2’QiŠE(ØÑi!¶YJ,h6TÌ©+XˆY4ÈÑ)´Y16c`ÔÑ‹)£Qc3°cm&)²²–™°”&"ˆ¢-3ÆÍ)a5Y±¤¢2HD Å²HÅ&i$ÔI¢d&j)H ¨%a`£6Y &¢�f“F„$�4„f¡`ÊÅ%$„LÑ‚’2Eˆ²›DÒ‰‚l3h›*ÈÈ™)3JTbÒP“6 ˜‘±±lV1¬EEc$4Í&IŒ¨Ñ)ZB¦"ÆBKFLd’eŠM”HŒÉ¥"Li4”š#1�²†Ð²” £!dÊ$Ò$2�’5(fAE›3Ñ‚¢„ÓaL±2ƒccS¢†#,Hš“bL¤DLÐÆÁ’šQ‰e”Õ“IS#))…‰¡¦3#1JM¥‘i @(¦ Ì3dˆ &lÑ ´–*›5¤i‘4ƲQF¦3I’˜Ù”�D  i•%ˆŠŒÓjDÙB™ŒY …62”´‘©–„M$4iF[F�šF$¤¤"360$Jl¥%ã¶­­o+U­¶¯�˜?ô1Œ ` cn߈xøœ.þ<"¾Š×÷B^¥‰ûv%Œ©�¿ÿ[ÿ˪RV¥˜2±Ä@}£,NvÝJ›sÇ£ûçÚã†Ö×�ž<ùr{K¢ÞÉ|O3« v5Hß�uðŽ‹!°šÀ…�‚N,õ§™„+£PÅñ¥$}]ùpXƒ-j´Q9t ÐÛÂXZÀXI¶û¦ÿ±ÔýJh?J`HBÔ`ü�!&«f­µ›ZÉTšÖ®}·U¥¡#7VŽÇišF}óI~ ’ØAþÿO–—¶� Z.$ŒJ<ž}?¯¼WíI�ˆ×íS`+ËàBýVŽæÚ’ŸûUÓG�zã°ü€ŠÅ/í�¼À?ƒyŽNÖH\öB„ )^�ƒ%îÑßñÿ?"ÿ2Cükç»ÑüeC&>Ó�Ñ–s Èeî#ýC•…rË6r ÉeÂèdÒß)xDŽ•  ¡ädG”..�íùã .ò9!Aì˜APlÐÔÈ m½a±­í}wÌ4^ÿ­3kU­»mÚ·3Á±U¤2Œž@$ Â@æºÚ¶†œ²¾¦áMúI¯÷†�ˆúû{d³¯WÝÞ ª2�éE‰ýî¡åÓÞ`nƒ¿€p]ŅƑܳlµ'á»´‹¾å¶�rœãÖœÒã‚‘º0Wb/r�ª‹Ç-uhÕãªFc/,ÓZòÁ˜JL» m”D«%(5ç^ý­ð ™ýRvu}ŒXq!øŒŸAq�ŠE 8ðˆ=‰ãp ï0 Ô  `³Q×W;Z° P.›|¢\`^€a­‹^p&"'!¤^j\‡¤V�0@ùO`J…!Š·:%Ò �Êbk0ÉØÕ^βº]Üù¶&EÈNÕ°=!XªT,ïá»"+ì"­“Í ® zž°B¶ß N6E‹àÀ(dø^Q´+²­õ*ñSRŠþiìÅž jÀ`S ª„Ajø‡÷FoB€ÖQG{Ÿ¶†×�àYOCuùrͨƒñ³ ëÁ!e´­Üúתfkì+Lß-š¯ìxãZR8ÙDŒ\Óâ3Ô­z¹XôE¯� è®V�€¹'áð®=ÚI�¿l·öóØÂ6SÌüÄ(zbHÅ/ÞƒeÔib¦Ï& ­v.'jâcj“ 5ÀE~ #n«ûö³a–ë•�%fëûBéæÙ”‹'®QÆ:mWo�{aíˆß�¯xøù$6PײyǺ C­ÐUt±wx<Јж‰ _JÛàòÎ34šßn2ç¨2,$� Uùx �t„k)Â3¤°LöÑ èMf>öðXjõÜq­÷Ë&šH‘>ú}Dë䂦 1 ```ç³6ðÖ€=Ÿ‡¶´=¨À/a5'lÐ0ƒØØØ]}÷Ûjäà@X_…·‰“#ô`wKA!3pÀ^,b힊Á‹[XÅç[ £õú�Û¯†Gè� õÛ‚Oc¾FrDÅ·°íošøÄÇ c®&Yé49}0%‡úQ„¼Qˤñ¯‰Þ”üÆ5¿öàgÌ…Öâ–„…K¨ÊG~·ÇSâ¸Áö³wÔ`k‚ç狨 ƒ¹¨2´ä™ûþ~~Wø�U üIw Ã?"�B¿•ÁˆW´/OôUœÝRYÁ(?N¾Ù¦JÄ_ÛÒÉ~Út²J„Ŭû­ðxG$1•Ù|›ŽÝ¾üÝ£þØëWunÄ‘æ!xăÝ1d\Q…>u½½!d„`-6§?‚†KÝØP"¯Ê�b…7iõÓ¿›Â�Øð±/f4*ÇIÜò;b| \'˜°ðN_9.mžŽÕó+§©…`„øw¬¤¤/‚çßw3jw<�FQ_‘ëµ2ÞØÎ]‰//‹øɇž¿qSHåYŒÖ¾]a®“·Â>³Ž`Ðý|EîJã—Û^5®FìÈ3/­<1„ ‰«ÄQËŒàŠøQŽç¾nï²zû[Æ«¤kW ymƒ�ŽšIå¯W‚;¹,*Ó6û#jÕ�Ö¦Þ7.X*õÞcÿ÷Ÿbî[ç@mËám•»m÷ÌòÅ̰í»:³/G3ÔHÆ_Äô¤‡¬ëmÜG•cb™ ƒ�Z+-X÷ŒûŽ.¢lúMm1»‡ .b‚øcA­¯^7*;uDRÖ¶úä´èñ1ª\ÜWzÂXÒØ"ÁÏ.Bí‰ü&JB.véfâ ”à%Õ‚[%âÍS*ãÙã®Ñ7…É!†›Aû4ŠSŸÿxÍ  ‚gžÜÎü¬×¤2•¼X5ŠcåG½ã~ j¬4N ‹B<Ä5•ŽÝVKaAÁ=ÂfIÉ/9@x« !<õmdSÄ-öåÒ‡ âºÞ¹zwQ§iÖ†ÏO”Yn­‡÷Ñ }|Û»¸ì×ÛFD ùõéð æ¾k!yiË?í¶?Ý™… Q‚‘¹‡ K5’ß®/lƒ'ÙÁ·zº±† ¼ºÇCö‘Þ×ò3 ¹�‰ß'c³��Ÿ¨}É$Ì9úÝ7‹ õÜ=‰m#Iâ?wžùËï†KãºHe1¡ Î ºÓáãZt͓Ҋ!ÌÆ×ªµà4ªã{ãyPÕ+Î8ëq³pˆW5 ßãݼ4r\*k„<èãµÄF9ËxOrát¬µÁjÛÅzmR5Ám¦EHˆ+ŒÁvE6ÙÄÊéÏ0Ò3}�•:ÎÕ­T¦�SxZºW¦³ªïrGÄÕóÆ•TÓ`­‰Š»30á•T¨�Â&d—%V¨Ç×lbD\“÷B„#ß[¤0R@ìÓ�æ| Lïì nïÌ¡Ôö�fÀjÖBο(‰&å„b³!­Ìlñ£ê—�õ3Xtâ–i¯,Ú—{X�»2©(ÁÆǬ:YÒz"ñ¦¹r;§ôd ¡c‰”¬î 0™Íð£Ü™`”ZAI i” ÑZ+2œË=4`�™k¹ŠKUy µ uÌ!úèæÚ'•þc–ÏLnª2ÙDC#x ²Wû^ãã%ï [5™ôÐ9®J÷¨“n|ÒêÑÅ÷ hù…Þ®6'ZR~;ö¶Vf>¥1g k\±p¦â”a@ðˆás¥êQ@Ÿ´‚Ï�J_FÆvÆcÔÝ4XqNDOΰˆ:=× Ô®€K¡§>(ðÆ–Ø€ï†yPPf›ŽyÆ<ÍÞö»0‹%ž‡œ‘O$+=ÎvTùÐg±žŸ¡ˆ†ñ©[• šÒè“^EÏä^ÜÈŽû �pYžØE€3áð«ìë ûzm¶¨|Üëg²ëVö™¸Ç}\­y‰Q»Ä›<ßHïÜN2uz;ßÑ×Ä¡Lmwk¼‚PB¹Ì°Øâ M=À+â(ÎÌëë+šø©[[» »¸]¬�,kݤb$EìmצèdÂÙ=Ê„ ê5�CËcÉÈFz̃¬lW!MauS6É`�¿gÇó[ô]l6ÊecFàÖ=¹Š¿hN3Ç5âìÕp ˆ¬v¡Ï™ÅUÚ�ˆ09™¿<ÕéèV9ó�,ÑvÚTIt †Þ@ývžÐ™;EνD@z”éYð‹Â |¹ˆº7Ý)ñqîx „ã&~SwƒÞØ%š¸5ïcÁWHÒÖðÁ^ý¤ �Ù^ì4 ¬FN‡ê–È xSÚ©,ÜkâVÝà '”äÉ?`‘ûòþ:? ý·¬ÒçS(ˆ>ûÚ¹Š³ùϳïÿ ¢¬ž­â˜oÂô¶–:8ß}Y!àþ° jÉ“ÊfÒ+‹á! ¢¬_ÑRJ9 ú}S¶ëŠ…sæ“êþCOòÙ$l£kF)“²wËk -ð¾ÿ¯ ô„0-å‘<)–­z«´D;\¨8PŽ�`ç;¬ŽˆÜ ÚU©EÖÛ‹cÜò¸@¨`W€K~ãôùøÀH‰ 3<æ¿}÷Ÿe‡˜Žß|úÄ`æn*ÏÝæÓT>Åg1�ã馆‚äkQ!1—µ²'€ÉÙ5‹ª\J *L6ÎHKÑêÉ!°Þä÷©›�޶lò!oÃ!k'ÿvä†â© U+‘U|"DªWRsfG[*rÁ¦Ö•µ¥Ã ß’‡åó˜ãˆè#güä!;¨,z ƒà"Ù‚Å·›¯šŒï¿Å» ì.�uÁÚ±p[œed¬ßgr“²“Jšæ-Ͱ5âå kf”o©�¡zx+%ñ÷ß±d¥è hÕÊYDnßvÍGíè°ý+쳓8û—“Ø­®ÁOÂ"�ß…B¾ó*ãy†/S3¾øÞ[ë{Öñ/—›T ;ËãXûÇC?�”�²PU Ÿª:¸9°ß-À1•±au¯7ëí¸#‰wç–Дó’Œ^?ë~´­wé·ÀW£øð“%�º+wb»‚²G“ì‹”õ<Þï‚ÐÍÕЬÐͦˆ—]N �§5%�P’]å";DØQZQjÔ¦¡�êÞœSboŒgtm“åÁ|�»ÊPÜÙúC2éq{çX ((�QˆŠ/lÞªúµÈ±8áùS¯ÆÀ¼¡„=ñu7&Û³‹3Qèà”fBnýº�äÂü¦Çé6m„ƒ?Ól‡¢¶7 ‹Ýëœiµ1:p|èàÜÇ 'ŸEVu»ZÌ^ ‹¶o†�Î5ÉÆ€/Ó�ó¼0yŸ2L쪣áû§«#a/íßWóùíë{¤‚qÖ·JÂ=yŒÆ5àó°vE9ÒªÞöl“& ÆÉ·i°AëÒ¢íݧzelXŠo­ÍP¥Ã<Ýó�ÇļX[•–å�€Ã‘!e’B‹?oùYY=Fó. ë˜Ü�/lÚR–;îá»ÀÆÀÚ‚UµäëÔ>«Iþ¨ç ’u~~©!$O—jpÓ ( —6Ô«Â#“£#Õ) Ÿ®{–žÎ躒‘(Œ ˆ‹¨p½A�_�®úÌãýÓÒðÈGå¶ÍñJwš0Ímªþ½_¯V%68ƒðÔ¶˜¿bGo�jh)._`»DÚ%ÚÛç@ÿ»!~ÿdx(©%oÚ¢6]€ 4�ôâ~þñïüãÍ~&žœîjš>@e”„Óð6q åC¬âË�àÒ©>†Ì¹$ø¤ ¢'ý(¿þ_ ðÈUél‰Tne µ®6lU?ôÂ8z¿„dÑUS}~ÐhµÑ†»#hÞa…¸Í0¼¹ÑZ‹Òh°$løG˜x¹K”ÃÏ‹gÛ%Þô ç!¢nü> s¼NkÿÎÀîø¶ú´;›¨iýd"ãô®kË&±lÏoP;ú¢Ý[&|œºvo¼‰gâò£ÂUðúÅØÚ”C¤ Û$�ç  ²&Dî¶R€aoŠ¡W-ìS¤¶´�„ZéãÍ’h»;›mEÈH�ã-~<�L6º×í5츹¡Ý ZÿoÓ=ÞÚæ˜ðsÁ�6�œ1sbH 0ÚŠ*²‚°ÑÀÖ%ƒ–9q‘]wQ‰í¼›=Yý_Íp¯îSNv¶0™ó®nAl–àîÕ/@„Úú‰�Ô}&2�Œ»éý«ÜlÚ¶³ÕuŒ¤æÿÜcé/ Îêâ8�8w¹ �†:€ÂoèÓ÷¦úÏq8“N)š÷¢·|øøQÕ+äºVÇ8㗛߸mŒTÂ¸Ñ –Hz—žéê‰4¶�Ó‡�‚×™‹Zò0v䈞ÓÑ�| Òz ÛÐwYÅÀéÅEÒÖ½öý¾„­úe§¦!¢ÎÕ�Î:Z샚âíU 1y.`¾UGNfP‚¹÷µ’ZË—ÝU¯tœÃÔ…>9Y�(ÙWŠá8a°Š²Æ£.ò.P³‡éœ”õùÖG2¤Sé @]ŸA€¾#¶Üg'Ñ!IOݹ³�jù¶��<Ü;è¯ÓÅÓ›¥x,w 3åР§-‘R–z;¼ë¬‹* ÀÕMŠ5ºCbcFÆÕkg'5¨9êÆ…–Ëð“Ò¶®‚ð"ÞœZæU|~@û^»mÆ5‚· Ðîc�F í¹„¿&Ût\£F¦ ±\©JA}°ü€/šiÿ'ʱÚt/Šô� q¨PÍʸzÿìû·½0r%ÕÔ­¨?=6ÌtðËÙßö0ÂH¸×Œg.í”’ö¹W;‘Ø] Õ§9LoË4Ív-Ì\l‘ÓEdáº%Ñq-ŒqcS\^0—ÌŠÏ-B•üW°Ò–C^”ÏYǼ/Ëå¹|sµ–/—ÊÛÆ3 ¾§®;ˆájä"wqÏ; Ë·Õõýõ¹;r âáü¸t�™ ¯©4Ýw„�0å�Eö=§ ˜·ÚXÉñµ0Âüç<õD1Û²Iz¾9Ä‚¦ ’}¹I™5{¡ 7œñÙ vÙ#µc¸ï§‚�û‰Aªqlµ¥V°>L�'vî†È_TŒ\÷v\8éóè§Ù õë—ÝÏ•Ì8i~öµðN÷¶(‚´elê.8Œìy®dÅ&®Ì­ÅÀÅ/†ŠmAˆ4jgñS½d.C�òp@SµwQTCF57‚8CÅŸ5$£#7½ÕÏÚAþ®1ž@? üÝ}akûœkzzF Àײó;ÆI*ª¹ó䃋”lýsÌ”ÕÛ43›á Ï-�Öž÷Æý5äoŸñà8-¨Âg]ês =ÍFùj10°`ˆ¡f ¹Kr¼žIÅ¿®�[þÍÓuϼ/HL[½Ñûƒ Ô™°+[!“ZtoB!S1\¦­SE§Ë�ƒôu`iÓY1˜º-)šJ²\)ß MœÑ¡ú#@óW :6T\i^s’5Ýåeµ.7n›�æÒ,­¶Ð †‘ø§˜«áì�ï$2�!L)X�e¨ž¦Ú,ÎG,|¶cKjÀšÉ£†¡áQò‚•Zƒ¯÷ÇðÝö>øÝOLbÅQ+:ÄÇÆ•(äsôÅýHåò�Ú½œdÃk lÕû¸4{¢Ýá¶¾Ã:¼ci"°÷”'áŠ,5&fQZ Õæ²°ÎÙ94,¯)H4g›dj�õó š:'w¯qÈï„TÞsiæ·d�ˆæó”{£q–™ ¨É¥[¸ÿØ‘þéjÄ*Cq¬Ìfã –븙‰O ¥ ÷ê”ðC^G~‹Œ•£?y“çëj‘õ‚F‘/êŽxF¯1ókFÖÄèɨU{Juƒfr[h×8? ·Å÷ÛùU¥Ãš<ë.ØÁßz¼qÝÅtÜwd—q‚�…ýxÍÏԫဟ¯a,Z!Ð8® x†Ë$Ø­éeX@£DÉ|دч¸½Œ¸×Ïd¯ð¬êq\ uÙ: Ùµ†E|i¬�pX:�y‰·7M�z¤‚SüòV¤‡²¦äßù»yBÄ`Z>ðR•}(—›æ»Ên�eÅ"µ&Ád°fï¿ÚÍäl½ óüikQ ä{”ca+§N\ l•2�ñçc†/^YwŽD`×Ò„ŽyôèZÝR)½½aª¬�¼²`Th¯¥†g¹ù°¨Sâ €úË¡·’Ïɘ÷Ñž÷ÉÒç^�umhy"ÇË bù¶¹ò Íú‘Êöë–v–ýåš:E¼Ð5"ì{àFC{‘°m¶YÈPÍŠðkäÇõŒbâ³ßTÔO•Î+0"Ëé�ùû¤ãJ¼µ åÃýþµf’Á†�Qú“v³ò-û¥æ,'`{õ8ÑæùaïÌ#ÆUÞZ6^‚/Ìè1{@`Ücðk¿# ·¸¹!z9Á�}u°ýWý8n`ö!%s°_½×#í¸ûËè±#Ẽ<÷™xÌK Üyc Ûø£ÍIâ%ŽÈ;ƒ^!I­�w¬íîj?Ï»#0äMà~üGòŒ`l&ñ„fר�äý•Mî­ƒ;qoíýƒãÃu‹Ëo)’tñH— ˜!øºþŒ§1í[ãõìy*öáò52=ñ’3½¯zƒÅØX¹i㬎w$#º¿ áëÆ‰Ê¬«qm„<Â9ÜsÛ<ç ]ÐÄ!6–9·Éè�Pì¹aî±Ãœý¯p;—Ò‘w\Œ\`|:Fµ¼i…)Ž{Í]±”˜&qÜ�]½‹ºšëHhG–Òÿ¿ q°s5_aàz'“e‡ŒäÆN-o¼Àë½¢�‚á,–ƈéqú¯sIë’òe“MkX‰Ùg#èì·â½¬99áÅÆ= ³¢t×}ûuí{é~C~Ðø†ÿx7ø1ïØ·C…¿­˜Ôu¯ÕU¦¼È¡Ÿt¼Àåløuí÷4|$,å· ]ÚyûÕÁ•ÒL]�÷ÐÄÔð›`¸�sæ²ØŠ, ¼I}BÛ¦_Ï ÷àÆ6ÅïÛ­•þÑŽ-­«áMz4<œ©¥¹ŒI8$�º>ë°oè}ŽÓñHZ=|ùúçÉߌ†åa{üÝk“[ày`Z42µXƒ±C9­ö":vœú˜þ! åg³l©·ƒ¿6ÌôØ �ûoÖZ¾|ûbEáãz®•0cžÊ=¾gB{§!n<.5åÊ7sØcýb’¶4w‚³Y7æ—#ÚS+S�fÃ-�–GÛ ZA¿SNºÊVT´Šuž¯ÃÍxÊém÷>ryÉ,ˆò[©XÅ- ‡-Ç�0ØÀÈÆQÕ’�¹iúLÝúX)Sc}’¢Ô§+ÕæÒlïl*¶ g:e%.vuŸè]Æ»è·÷…£&ú:ÇÛõ¬ÂD»ähÕA c”Šà ÑêÆL…]6{o µnå=¤Ã¶)�K�HÁ {b!“¬V;$þÕÿOj0ô„Dçùâ_ËÐ[‘ìø_´Ã±‘;MD#[gç?MÖøÞ`~z¢h•–}ç—`èû ß[졵Œë<ºö±@®PPxŸVûesÁ¶ß;åÙáüÿ ±G&È8–FŒ$‘¤Xœ`+Y‹#µ^5ªU¬Gì7¡Úõñ;X(Œ°—–5ÕÈv3¹¦-‘å=»J±¶M\D„œk{Ñï‘¶£Dà;°˜2A˜Þç£Öcž~¢à&‘Ò–ÕLÿ,ÿo3ÌëÛ�«ç›"’{ñ ±ä£Ü§äþvÈÿèÅ7Ýæ_xrÿ&Ícëñü1yƒY¿�91“ÜÄ¥œƒX7g͈ΈOåÔ€ŠãžF›X\­¢Ó(3m�ø‡"êýÙϪb“(ìdzD÷½Ë?©Ÿ–(±™Ÿžî>VÔ½òË+l\ÓW¦þ$ºÝÛu~94ŒÔ‘•”Vë›ö÷Н ›^xÙ’ò8®déXœyŒê^ó©vÆ7J‡e,«<%'ˆgª» ¶’/¦Æe£ÿ‡¢%,>L½–Ò‘ Ö”òÖTZ5ÂÒn*I—&°ª|—«—0,˜˜ #SƒªlóIXŽ9à´W!'ÃÌÊŒJ!Ìf%̃`žj…|Ë6ŽnŽP³(qq…K^nî¬5zÍ)<'N®ó}{˜f"kÿ¦œüŒ±ŽÙ£I…!é(* LTê|.o^iêP2˨GSô½—3�^£Î³­mä˜|yEÕÙ¢Vb3Aˆã}|´¹ÆIu %�Á\üŽÐÖ 8¯æXÀ/×/¸äµ8rsšÃá#ºœ«‘ø@fxÔZÁÃ’„-ø!%È6U@e»µ�dÄ(�É ¾Ö(›£Û='±¿|Ök³íù*&š<øËÅ)‹{}oW­P:æ|*w2ÿ©ßÕŒ"&L÷]¡þ+íSÊ?EþïmJÒ/’èT—éüà˜gúõ²Óå”kÂ"¾·G�\Ÿå¹Ø?õÞóÙó4¼c˜"�­„ç‡ñéߟPÙ-ÚíxìaštÀ¯ü³E»çÒyÔØíF£ðWÙ‰ vÞáR‡HP�~_¦&¦€yÙ­ YÊ>2v´-+dá�o¡£˜…‚ ‘Ä]ºEùuKä ¾Ø ÿ×–¡iéåÏ€ �Tý �x¿iÀ˜ÁY5s ˜ë‹³�•­Â »wæy+ ZÁkƒk›{‚E¾P÷Ùa¯�0¶ eŒ öà;ŒeÁÜ’¸ô¬îEÿq`7 ¶ÁžŸ™ä,Þˆ;hƒ½ÍyfûzN ‰cÑ ^DH%~«`?–ßH”QôµMÿfG,[Íyå9K—¹¶Fº6–÷àçN3ç';ÈACÍ×vØ–mq9û*…«3˜¡ÚG¾ggÙ(peÖè4Zf2ð¼€ùš××îˆ ‘Ò ‚ïqðqÒã6úIìç)סöº·d¬8‡�§ÁøVó^hï˜;ÌI5¯9X³~ðÇ«„I·ÇÄ Ñ=·Á@£F RG¿ÂøMç£É€âàé8·kXlŧÐ\5P|@¦²·#ap½¨ƒÔkH ÷koþ¯ŽÕ%ÛzÁu¨î&'Z‹ž#ø)÷+2?_ËT—*ìxs%²!B`0ÅJä *¥iÎ㽂"åùÎÔ¸ÙNNæÑý•ƒ…R>Ý¢¥T7Ïqèk6íúŒ¨”Ûû˜ÿÝýœšE›i˜™én&¢Ç#Ùõß3x<‹‚xS°;ì®cßÏî»ý�åø~(V`XÞ�¶€£oð¿!b›šæ­ò‰´êÞKíµ¬ÅÐÍJì”(ƒ�1Ý­Ò³Þ@4½RÁuêYR7àIÍ>±¾¢Qùˆ‹¿<÷‰yÉ r u„LË�°�q½Ðu(dƒ¾áD-¨7�f ¸Â¨Ð"$YÓó*yß/·SÒÛÒܰõÜf›Î^®Rã¿ïûRÅQ“ž:–òó#ý6øvæ%TF5aÖ\†?¬‘ýš‚ÏÖJnbJ(¿ÍûŒ»LQ^9òš È˺ÂÜ¥«©{ªýÖÇ“A;Æ?W�Ϥ^¤©Ê²¯CéLzœÄU‡l닺Ûs1›ú9¸�.,;ï¦ür¾4CßÓÈ–âN#Þ&>é¿�2^ò¨¾%â꘲2<àn;LåçPj‰÷‰Ú®aÅÆ‚#¤3¶WA¦ ߥ¤>>Ç ò‰©ç´¿ï�5°²ÉˆzöDHËý´ÂʆÁR Bm~x¯G‡>œj{azgßúªßí¡ñõD‘º6´z0�~¾`÷8ž¿Ã׿#y =XoXˆ>nÀÆC·›müÞ>9�³=x÷²ôO¿^+ž¬ãNŠÄûòÄ"ßl CÅ @UõÌ?©9Þ¬ÌnŒ`$6¯>!x4A€ížq¶Þ+xèwk„ ê¼9˜‘Ëp5Ó«˜çÅE¡“¹£)?Os‘ºó Ñ�.ªwÓ…×�qaxŒõ»“[�È�Æ×.ܶ·ÿ†·¶j .À¸édXúþH0èW+åÇžuË`ozŒ Ujõ}bñ,lÀBÎÞ†7Ãkº•z}ç{Ó…É·�ohéé„8Ù f¡¬a4®Å»ä¿IìRZá«w%Ë®E™ëAœ˜ÄÀ½5”-ªB{|»¬vÀž'ŸþG#`ÎÍÍD6s ò·ƒ¼p‡ÃfšDrz"ð ŸŸ-ÆkÌj’ÒèÁ¡ ÿ,‡áØ'ÛmàkÌ@õ®y $ã¾Ì‡¦áØžCáydµçÀ~H~1~od Ò‰VÜKÙWÍ©ñ¶¾¡ åéw•JB³µB�ÊÆ:ûËz/Ê5ñ[½í¨/¾/•„«Æ™áÇ2¬·„Œ± Y€m;› O eZÚyÖˆÒÚÁãÔM†aänê=·�¡Þ½¹ÑÛcZµç>ëÞ F8]À¾ÖÁöH…~Ûga ]Ћ?dD•İþÝö-;ó@^� ÄßÁ6ݹx£êÇFw@àõ-· ŽÐʼnÆ;…󀎓Mh%°×`0h›‹QX./‹(Æ|Ϙ < áëóÑàÕÒ˜1ÈÆ3]í«ÔGŒí§g+,m= ®£FÆlWsi‹µ»ïStZ�*Ši{5U!ß)(§À€ž; àF>SoEÆuk1€ïÁÖÚL½[Xƒq�½kÕeæÜ=š¯J <:7œØžû÷Úù-„�½\RHÓ=‹èÇ+\f�x@…AŠÏ.�Yæ Ǹ|‡{=b™WØqD.v£¡¹>‰îU;ä˃X àÞNæÙÁD8�Àï"Þ …'ë².YSbÚqvÇ`0•±•GŠ·µ„íî/ß|1vÌf×¾RÄìððL7ªLfC Ùçu¾ƒ � U!v}k–°*�ÃY�Z1w§ yÕ™Гùa^ÞŠ�@Ô‚µÚ�keçˆ�™£¥–Ô;ˆë!HPÏ& Fþ�–×꘡ RžíŽ"±¤ØÛ<™6¥ ̃N×Dƒ4ƒ®n)]�T"5ÄÁM§²Ý?wÑ«Áê’¼X}êEÀuʘÇcVøBèq¾ºq½L¬ÚøÛ=Öëß›T/gím¯4;Ÿq”¾º%˜¯ÿ¤k�ÆhædQÄJ[¯Åž~ÿ^OèanHÚt>‡B'¨Ìpx;T#I„-Ñh¦^¬èp'�ÔLF­,R&Jbì¨N Í9õŸ ÔâOU(ƒ*là´0^ÔÃ,ý.tl2Ó•KFÑ%ººíÂÛ§k /uÁ^§—,êÎ^Zà7†w­wÞ7�Ì_�ruÓEß WV��oœF¿tôƒ™X}™¥„ lqHÍûstŽö&Û,Ε—J÷6Ê-^ýù5K€qÉbnˆpCÍ?Š©Ëêa­<¬½˜`ç¸xÐaš{0U�F+§ JVé�$kk^äXõÛpŽ€Ã–Šú× �’ ³Év-b6™ÔólÈT˜Lr:0ê @·#Â;…¾ˆ �w\;Ø"7ÞÆv8–ÃÍ—³°a1qúÒÇ †]GàvÌþ@*—^®Ä’zea­Ü^Öžw1ÈF{.v­˜º!–÷i–ÖÉÊÂ*ÿ¿é¸c æ‹Ôÿ[…µ·„ïn~Æ^.6› p›yy€óáf Óà*ÛÖçÑz›h)ËôŒp�…ƒ¼ªh>Ô“úÔÏÁûŽöÎa`Œ–@ “Í¿=Ã*År�‚1{ZjÌCƒy@Býæo!¨VCŒŸJß�a$ñ€xJ|Øç²7-¸õôE` Â× 2|m fMó¤õ!ó:£�¢Tgb„2� ¢zFgH; x<&-™ØÁ€çÜ”6q�ðšl¶®q^Û%€bõÛz|–£ž?ü"áà$/€Y§çž ½Xƒ¿’«À� õf(°Ã NÁ&Zá~ê�k*^S6Þ¾*Ó#39òŸèfBOÄÜtÄý’Ú”<ù¡T«Œë5P4Å…¦#FEùËl±I°ÚΑ{§×ÜäÿÓüÈÐÆÏ ´ó¼70æ-²ÍÑÆ@cȆÚf�c2ij Y¤0Ô‚¶|°]ÛrE·›70ž ôÉlÙv}N¦¯ÕÀd ñ„¶öá×)(‘¥»;XÐY”‹ 8?ŒùÃyÓ§{é]N:Ž·ÔýPiÝÕ�kɯV;ë5®Nèhx½îù�ë !h­Ô†ÕŒ@�ƒ¶wVPॶ5˜�´b Ö áoZ7¸­¦ÚЕȃBAÀƒl-çõ…õSÖ´¿R¢Ãl1‡ÓÁ`­bà`±Û7dzkàW”� (ÁTß–n¸ë_=Ø2¦e÷ÔµìV B?faÏq¦ ƒý=)ÁÚo�ëŸ@�]¼1÷ë FÛ0Êýý¸ÅÛ:år†UÁ«2uìEªG;¹7; Ì¸�Òÿ/Nm"4É¥ú1T—X›ƒ ­d*Í@ØñŒ‰”¨•,‡»X9�›_Ü {׋§]¿ƒ}]˜5|-,¹©Ø¯jcš@í'DÎç‚XéçYŸðï-ŠE¼-–í‘)i Ì±©îÇ…ŽpÀÁ)nÞ {oÊY f|mL_[Ö{=Áš !­ð»‡ƒ*2 €¶Æ¼öA }û½\ßÒ�Þ&J*4(;_7°<µ£Ù˜:;s&ºR1]Å\¥„ò¢O)Ó� �úï½Ã–>Ã-b÷Õ€�æL“+kÞòØ@ÑHacãæàoWrZ¢Î†~¦"�YÑ�Ùð:1q-)¤kÃï®´ECʽÑpäPËrS¯ß¿„Ñ¡ð÷ÏCtô¼™5 ³;1ý¬ ±â'ðí¦±‚ç@Ú # ñl"DP…Ç¥½K?˜°'\C d€„ÊZȵÐ9„��žL•˜²Mß9þ÷zÊ­Ìû£,RzPµ�EÐ�\ãì�gÃÄiFóÿ·+yf û3vw³ºáMBÇš>Eÿvg\îPŒoQvîLVomL ÄÏmÑA¿:7Ýïõ0­oó?'û>ÄüŽ\|@±üôÑ Ä@v#üÑ‚bÁÏí2~)s5/¬´ßWQžLBŸJÄY!Âs¯ûÁægèsgöõJü@�`4L Æ1±Ïôõÿ¾ô=iXæñ�öo;Õ� zT=b?ÅÊ(@Y�ü>Ð S¹ŸûÇïäûljüyŒ™^>ûnt»=©ƒÑxß]±½à ä€ç£Æ~?s_JV��\è€0HzƒC?êáïß·›ª ¿Lóø†}ô7 `\5ãñŽ"6Ÿ’Ø-OåÆ1ƒaäÁ€a¿d«§ûU xBüêÀ–/®¦â^\ðrœSÍ}¥[»8ÝlÔ)¾²:JL¤ãW3õã4ó�¥e¹ZÞpŇ=ðÌaþa~Gžc®zª°ÙI Úô6)¥û�ÛYqøJ¨ý´—v·±/æ"»ñÅ<ÄàˆïpOw°{å¡ì™ö¯"vw3²UÈiˆ>µXÍ­éxh“œO¨×—“™®w£¥”krµÒë"ñÊ¢Éh�ÎNúu†Ð¸àñ’ÈÅÑõ°YgC¥æÌt¯©Iøë­4cß¹"wØó‹YJÍÚ6÷´R*Î8ÕnBzAý¾ëhËb_Fœµe8[,$°b…˜ÝÈÀû.Õ[ç ¦¥› ^C$(qDIªãÿŸê/z$µ Lš7ÅH3®�QÆ�¢7ê$~ù¹äâ7ø†[ <‡VêìF@!¼VÊÜdŸ'Õ-ŽEµ±ü±‡á>f/¯TL{8ÞkÐ9|[)õ׳€&8R|wTà¼=�±6+ÈÀG»´cú[~‰¦ ·B� ²ô‘ã ÷¬‘hè[ýŸ"3V¿€ÕnEOþ'`pt¢qxAa�ß Ú¹Ÿ%>C#æÔœól`´ˆPÅ›å¸A­Ý�X®Ÿc ëÿ 3ï|躴cSÑqŒAø^ã’ŽÌÎL™óʉʦF´Ar:Dá¦Ö,Á Õ•Òg 8‰9s›0¾MÀÊ(h tm.�{m²â𦵽xåÕóŠmi‹R�ç}5·^B@€?ðH@°c˜Oi- ¥þaâ}µ˜«ýþ†Ôé}#/C�fÆÖå ß²#…"þPþÜíèf�Ê ðkHáÑe°Eár~,x(íˆ`kÆt± †ð3K � Êñ€Ö9ݵ¤»¨VŽ»=b.°7¢fEå6g2¨t²ÛÕ�¯“ü_RÄ×·šî³¨‚¬™ ë_™=Vv–ð ±8ÀFðC­†¯{\‚BÝØ“d=&¡mG˜Y(i@ðc6³X¤ø§»Í(u;h\éK©Öoþq“h"ZÊ@Yt¶í¾5¼.ž ‹Îù°ðwÆí`@çÛ “(º¸<6Y5L¶÷ðòõM ÌUYˆÄÝQpô÷¤ÛGUeégn˜uhS¼m�Œìç‡åˆP-ŠÇ˜‘å²7t7¯c&åÐ"\Ø~±�ÊeŸÓV×Zùø&£T=ÅÔ(,÷r˜7”òH'A“û»ÀŽhæõÓ�›O.›³}cF˜À6Ðó°C’ü&m.Þpüðj‹ÁHê>_5ÌÞèú“¸Ï>LF†oxÎî½Ì ®Õ‚ëÐ5Äã:P"âe]e4zUŒM\"µ¯ kDèíEÎ{ÙýÞì5»æð�ÃÐZ!é|oäWžèf\•@ô4�µ¬3£9ÝðÒoƒ`ì¸,)ð¾V»«ÂA‚ê„+N,äDé[+®»·Ý¨:�æ<�Pé¬eçI2é«R%´-Aá þ.ëHae�*o"säöh¤Â ð 7¸½NÕê~š×¦'å× šBËæÉGaÎåŠÇ>ãÆr@`䢞üŒwµiÞ;žäD•žú' mݶW­Ä¸ë˜^™2w7uw$îULä'ý²q¹Î³€m¶Ú'�²M´ë½Õx9è•»ëÇ:I®VîvHó$½ÆÍoî�L�(Uve¬!ÌÖÛŸ�Œ¨U¥~ÆŸ|}ÿ?ØÿÈR3{ÐQŽàqá?æÜ'ž†cóëœLb€ÇÏØÖ˜ÿ"c:ýàÎgmKh³SU�¹Œª|šbœ[‘«écÙ¨ð¿÷˜‘jFÏ—Ùݾ&ìÏ1wX°Ô˨-&­kâLWþ°Û¶h@[Œ•¬HoðƒÉ~^žx5˜ÀÉ‹ð:%e<‰r&Ò;¶`ŠÓx7 ËP=EÜø3Ó%ˆRHFIÎ=w; Tï8Û$•†„Y¦@÷ß’ô�G¯|f;ÏžÌjùº4kù³Z¯:Ô±Ñøõ‰O|-~ùžU“»uœú5p+2‡h—E'ÀõïîÇ,Ôá‘B˜ Ðaà#[¸jl{z“ #†YNxУ*ø,<ÍÍTë3¾"bÜ(.¸Õó¯ü8êø ¾>Ë`ÍB}¨å¼±á‹/42"´Ãéñmº™}  Ëk t:Óm…õEBF‰çžd¹)‡™‘¬3‰WøŠ¤d’(W#%Ý®�”m¼ù: ¦M�#óŽ}ÃÆŠ GWWÕ/n6SÉGïBbiGO”P{Ò’²wF‡Ú^–.Lš96¡’2Λ—_2^×õ‚ü•*0/Ö Í=Eðâ1�vRö|ûE™´Nß{ú6[;kƒðâ�Er#¾t^ÿõý‰"Ãr³ûô<¼š ÄzêT*†”çÈߤ /ª„ÍàÈ¡ôÁ�mÃçAþ£�û«ÓËãk¬Ÿ=.ólu/dð†²1qTF^d£½œ¨> •àz‡Þ®É¬¹îð`ÂuôÑ�ÃÔ ¸ÎŽvk4È㊫ȇväû¾ÞÕ/²"\–äEµ§æ�>0@ÌbÙ;‰Aº”‘t”¾ÜÙŒú2uX‹ÜÙÃö¶Ø#Áܯ¯¸ ˆX¯§Ì ´-Ó^…| `€æ˜W³·›÷{lz€’Ô\[ë!øÕH7®\fÌC}ºt€~]µ›gº§c3ç½hw��¸ƒ|¬ ôÆžAy7†ø‡&$ôÓ;zÃÙ½ÐëÍèig² s°™^¨B(#B€hô¥pëï}ôc–Äy¼T[g¤TBÚ°-–@pVÁFÓÌx<„”.�ѽëÝ»¹¸åÒ(Diøï–à[…àbŒ¾žíÌZç%¨œÇuçn1|Q™*™­Í€œT7ˆPVXˆ�ÜáÔGR~%(‹`ÅÌJ¡ÿ鿍‚k 2ú&§ ª0üÅÄ÷Y’´gZ¿Ü�ªY¶ZÖ\†FZUp‚ (ÿ±Î— Óæ[´ÚØšÛ«šM>JDœº0\m�±8憟!>2Öó)ÏÓ… ÷ÏT¹¿‰éh.ɵËAôêåÛ‰`ÛºqÚÃkÈ¥dtü]áÖLPØÿß;#»öÆF„â³×÷Ý?Ð1`›vZ·1~á>¾Ðýhá_Ö £Û2„Cèѽ5å¦×RÌä7Då/�}H}G«òå2|C z²7zj…®6ËIçq|‚Áˆ×Ö�µø&J…vþžŒ‚‹b#²ë/ï¹Ùù1ZÊ’³•uCe.XŠMµõœ�×ÀíâyÁà•Ñ/T' Oœ¸ÉÞ…{¼@8Êk}fL•�ËMŒãš‘ƒ¶ÿñÉ Ëžé,�ä ŽdIlg?Ìmxw�ê"«íÍ∯ø‘\2�]d˜js7 8q_[¡å2¨Ò�¯YQç1ùª¬cQâ½µAã)a�>˜²€¿ž¡[w¼wæãϯ ÓŸ[öcñd²MÜ€®›>î9é„An.÷/úH†<ÀeûÝÒoß4ÿ>Ïá–PŠéFÒÀð4X®Ì¦uJ‰øeÀ¸§sé?Þ>´}"ð6uçFµ3íEº@/=öŽÏ5»Æ‰! @¿~©�-ÞO&¸fÜÔ¸½©)%“u€œBñt�Þ0x`™aÆ+NÇG?­Ð«�í…¢·,ñÑ(Ü/»a|ï(H޲�Váx ²ù£ŽÖX¸"ÿHüx»²æ C7‹ˆ;@šùH�™£îx5'Œæ#çñŒó�d²à­mÁ�Øââ* B‹‹> †®î˜K¸JCS–B%êR}&U-{#�‰ï–ÂÉ/½]§¤hÕ‰†ÅÀÔÐÈ)ƒd­¬hŠ+Àˆ¯ søKfÐ@{×î|K×,슻…™ëÄC¯ÑèØì"iÜ( … c¾è_ #YECZÚû`÷kl™«Yˆ gs½ QÂùõ¯›§/½’û¦¼÷-ÔÁ‹ïc®yQ©É£'}±Åã§’¦î _g[—ÇÎapcvûá¨.‚�¸…rï"ýÖ´é> Œ ì’T°¼¾ÜœoQwü˜ÅWì²}õìÔôw|!±�äññ?×ßêÛà=4ì×�î…·ñ‚+x óÙ|E]Uåu�x½Eþ «;m‡øýEœ§˜ KÛyØ3ï‘ï˜+@øšD0rn ú‰þe«ÎÞ¿L=:‚õ€ù~p‘ 'ðÄôgÚ_àÊ*ˆ‡¼Y’ð„šFrzijž4ªV@¤‡v¨×â…«B£b³†1²ä(º0Ð>»±ùýD—…ôö÷·gE±! j“VMÂ~;g ¢ÔxwSÆTËÛ¸Y¾Xÿ·¨®ŒšDæ•øâ7ž"ë£6ž>kþT¢FóGÝÉO)yƒïPó µ/÷²ÈÍ$‡!9-Z+Ùk9ˆŸ›¤ò¯¥rÎ#>ê…Þ% ´3¬r«nDUR•Q„º¨LË%ýE‰ÓÒÎßUIurúÛ{ õ¨ÌíTÀ¢Tj&#ÛÖÍå 7=ŒCvôÜ-š£rršÄ¨6Å!mËTÆi�Üá1£(z¾¯œ˜Â 9Ëây§¸­û<%÷z¯<Þ|¹’zyåw©º22ìÏw]ÓB“­i|Ñ6Ô¬®�çÚ*¾;®lðôµƒÕú‹Ç¾0Çs,*â ÏÞ:Õk“¢\²”g7ñ÷­iÖnƒ(¿õÒÝ®w—§mÂl*Ë dk"˜ HŒ½waå=S¾ç8Ë�»V'·Äߎ‘œžQˆ°›k|RJÎ[“¹ÊPò茇‚Á6´Ü]]ù8ÝÏÕ\� o/¦táÌup:�É®ã‡:¸Ækë·Îs­ù¯�yÐ¥÷Õ&kÝ6/ß.ÑÎì1`oÝè²&ßQX!ÊofMÞ.–ª‰© é�¢³vC'™ ÁÂÖiˆÍɯ‰¼´Ä.ßI´Wmà \Íé {fDL*FîFî‘7£LuçM>…΢õ]æý8L2ð޶+- 3ã¶ Þ÷WZÝó]žjøZÆ휘h<쇕�5è·zÖs¯êòWó˜xwPWXAÂk¾�Èø±§£¡Ìmùõ†Ñ§œÜÎÉé e“QÑû‡ÐÙ¶LqßWçþ2ÞoE⎓ü�'˜^Ã9‚$5£ØäðÉT2§¨ï~“Eð…½í¬ùr�ÿ?Ø‘¿=ªS' H8ÖÿméðWb)ZÃ= oº_†�ÈVÅÀûøÜáõÛ£”ÉÅy9«îÆHÉ9‡úS�“=kÈ'Xía)ÕŽFȨ́gÄ6Ëù ‰Èé3H@‡‡cÓÜ#¼ä.#høõ3+Í ‚›€Gã¦F\x¨J€’p»÷Ur�'a·Áç,3ÚA�Z ÷>“'QÜû“°îú (åŸó>zn€sËèŽ0šÎ…R óPÖR�¦î3Ì+^Ž ¢Þ†¯Šs�·Œ §wmŒËŽ&wÜcj#Ê8ºã~á±Dˆ¾”[N`[^Š+t)™Žãúd]é0?TØ0f0 rü�š»àI¬ ”J‹ÛR ‹Ä´ƒ§ í©BcL7Ñ øHÄ?Í¥q|‚±à€Ú¸eµ‚šÔ¥8ب£�¡qLÔ^ˆ!“˜AN«É1 &ÌÆl–1ñä|]:ÎÌE´/¸Ò é=œ\l?¿åóT>ÌØp¡Å+ •1pÓ@VJH-€1ܵœÃÛ†ÃK ”0sdrÂåìä°=Íç-g×±ä0 @ìì']8†A{ÝvK›žWÕnxyʬpOï6Y uŽýÖqWXq°GJrve‰(ü)þê€sʱWº?`lˆÝ&;÷Ʊ¬Ö•ƒŒ†]ŒÐ€PlrzâH7ÛÕà{ÿµ^-GÒöÔó÷ÉF~Ä]=ÙD›±]iϦ3™—úë÷ärÑŸD«FO!x^•ÅwK­Aà'#*õ-�ÉuF$?Ð.0Û­ŒªeÀ? ÛÝbâ¯Ä. k#7¼]l»˜¸NúþÙv@˜ÛP[gÌ 0ÞSk^SPöKË·[„ðYã¶mª�X§øšŠØqϾa™ûÚ´ñ„KuúkeÏÉŸ�|þd0+†‰‹Î2Ï<À 3 zr݇ŠßM“À;Þw‡ìöðC·xFNÜÙ‚Œ-͹fϾht‡z|=ޝ¾˜Ež¾¬ÖI}¬Üdz†Ò#ÒÞb¥Íd%е´¿õ/†èÅRcÖ@ãe’ �@ÞÒ‡k•½Ã&ßË/ZC4y•›%è“mýtLFŒY†º2+±�V�¨êÜo`È:Û…qH–¢Zv+™f¬ÿæ¹ NpKjTxêð¥5ã±?¾`d»mðµñ% «ð5†×fCc!ðÖ+�ùŠk_ «íµwUJ Y�˜¤A2w]•ÚôíJÉÙ=0÷¸¾²¯M5�ÿŒè'Õ¤[6Ê¥ámß%Ø„<Ÿøý`m’|¨aÏÚS 3¶M…º#^+aêB¨œpµ2éiINˆ]ï¿\¨PŒhÜpܬTaÑ…Xó½ßö2°–îX6¶†i^3SÅaW( ´ñn*l/‘²8žÆB“ Ä®õ_<ËÉù•œ-øêOÞ=øµpD…Ú¬ßRÆùp§–(ññ“œÏ6�Rq —ñ\!—n޽FDñ»sºÎÊ“i%Œi3D¨g‡xª†ijtNŸaŠ) TzË¥•=Ä·�†¬AÖ/MèY‘Á9T5{æò°«Rð²unŒ/bÚÁ¸�(’Î.ª‹4³‡ÉÇ¡ðÃ#áàÚ¯R�wÝu Γ»EÙ�«‡H+Ò·¹D´µöt‡H.zš [7önÝžOF�"Šõ Ïøeþc÷{ˆÇÃÙ/ª£ç„þŸ šPL�G¨Ã@C¼(‚±¨«rEäË»›V5Ç[hÆ’Ñ·®çor°É ]ê®ò—Ák24´�ðâÁ�6”Á¼„›`Bš¤Eð8£„ŸL8Ñ8BÑï}*T©é¾�ÑAÁ„!‡’£³ur;‹1#­æß…£8nØŸû #Gߨq£Ÿkã Eîº*ñ7“÷FˆGµO~v/½wó…‚ ©¯ýÄãü¼îc/E˜óL»»@Ê”’^ùZ�¾NÄ&4ð>Gx”Ý:/|¥jã2c›¢¾#�{ž˜êgû=æ² {%íéÀbîµ}š�PBæm@B1R `hyO`ãU®}„f¯~Zl76ÙUrÎ1Þû³&xÁEß}¦ºsì½N™�ôÞµU;Òy´~§nÙN�Ì- š"Ý1 ñ�& ë`ÜÌÔJ£BšÍÂ'ˆ0t!ê¬ß ºñ�7º0¦3ÕÂã¡�‡yk˜¡lZ‡@8ã2�‘�‚òØÃ�r¸W_È2€Û&‚ä¥ÙŽ •‹×/¨�/æüP5 ëÎ`^˜à¹Þy¨çúýP£­��Z¤¯?F`®œ<7åd"ñ,YQ[·F1üÅœ�Â�+›1fLd”«mÕŽæOR}#+D+]q³íí¨[gü2��=S6ÞFr•ÃÖÛ{öXíÒ¶1¬µ�ÁP%c—Fö¤£aè  ŸY¥Ö /%è 5aÉòæÖ¿Q0Âû–² ÚÃg*Ø’Qš^ó–ï…è+ZÙuº^‹‚ax~(óEÍ1XPݵD˜OwÃǼn´1£&· Ô(üÎÀ?:êž¼Ò¯ˆÔÆ×û¦7ìºñ�}W&žâæ8ú{ó>`«>#Lù ˜wiÈ%ùÎø½Ã)ℯ~öÛªãÙÇ ZFPi,�Õ!­;(ö YCÉô:ÚÑÛåѦ/f)+Zú€¸}Âgרõ’Âþ}Ü?1½® ø ¼JBL5u,ö7|HÙj¨@‰0ä©E‡lÆ‚qÁTjGaÛyôa°§=u.êkW’ÜoÊ¥›�G¦[\EÖÛ5ïj" ÞE’fpÜÕí+´ß–׋‚¶Ë­w‚ßý KɈÕÍ'8à�´ŒÒº¤è«·9Þž™þì 8ÌO¢Q*€0H([n¨sþŠpµ Öböd?¡7|àaù`àÉF CÙôa'ÙØºïX‘gŽ0[ºàºë½ûí “¸0ñŽYáKT1@ÎÐ^¹äƒÒ­Ã3Ì»¨íÅŒõeõ„°Èß= ä8ŽK¹GucdÍç&¾O Šö€øD®ÄÖ‡<²#•®Ú›_+«©âMGõ—!³•Ɍژ„ŒH>°4cgésrœ¯-`ÎЀ•ÇÚýÔD'áøGïP6Ž’ FzíÍ8¾ÎÔ¿pË”'¾ŠÇuÌLf`±ÿÖ%‡×+DhLïLßÖdÉ 6%òBüµƒ[Ðûõær–Ó™ûI’K�Ñìf;—Ì åv#+×)Í:Ë ù½ÇN³šv2¨)–3~®î©ŒE!¦a»"ã\TÊI“;®øÉ8™âSô˜Vj£°‹D;¶­@dxq)ž×š(cÎìx¹Üwb%}�dz!·Ñ¢oqºöþ ;™$¯‡ÍqîÔmµa»»F]äD�>&œâô5ÓµàÍ Ñ$�øµÙ]ïw5(…¶\-ùìÇ�y¹ëˆ®ÞÔ¶Ü‚¦‘!²U�¬ý59*IÁÏ_+ h9­G6Ë¢ÓKóüY‘ÉßÒ¢9¡+†>ßÙ¹ï'˦ÏÎ)Îx)ã0‹TW€Œ©Ã’Naay3K1*8Bñ—¸Y‚Ç`êt錞få²vÁ {„†:Á[8Ú¶߯êß”ÕÜ>Œñ\©Î�jep©«Bâ³3Áæôfç1ËëztîZ†ÙïH�îµ—óÄw\ä†ç˜n»±¨U ðœÅÕKàî{wPÚK ’Â4=Êå0hD?¹�‘ÔÍýˆÞõ6bxò¡;Ÿ/NÙŸ3çÛ–¡ßá�Óý1¡eâ­â}ÿaÞÞ¡ü“œÂX9¯×çöF•=á5é$L�„3ÚþÓIŽ' ÈË^y ³úDÖ”F^ÁŠCØôErÜ›fü`�!$ù_AU eéŒÍÜñlÎä—B=ë'”=zi‘⥛=9Óã8>äƒ[Èg¸¿¾w;µµÑø 7¸N¶O¥²œðŸ=9¨»Ç `«'u£B(lÍÝ ¶G¿¬açv}e_[ËÑ·º•Ç94>YÍ&=›õµæÄˆ‚Ÿ¨68Ð ÏAm�{{X¥Ç¤éàg’ã'xõZ>7FØÚcm¬íM{i“LÔÏ)Ó#l{5›;%*›Zü¥ë“Iâ0Á¾TvýöåŠê=ÚMl¦]fiF2ç1m}oëŒVVsm û3ˆò"äbt=/6ÞYFƒÍìQ—OòöÆõzåÄlIJÂß* ór'`VÙ)PVø„äØèíl18˜¬cyJæUõ¬°šÇ_D×aC~ijõ�ô¥Òq«¨}%KDÅÛ™ÒkÞp ’laü�ÍïÝ’òh(¢u@ T5.V"´ØXÌWv"ÈA+LtÆ.‘eëAqL9œ|2|<°Îp˜YâùP(¼õ<ïl¾ppÀ~»Y,8�’¿±ºÍE>ìî6¦Àà®JÑ´¬ ¥i°�¬4NIa ÃËêÊüZ÷4ß�4áG_ùêRýÙu÷ß¾]øbÆ@ˆx¤í}úFwÔt¤þ-êãÅ¡6lßjô½õøþn}“s?åć& ½öW“å)Š" @ˆ¯Ò²†kaõk��a`\Ûœ÷õ*#­! s¥ÇÖ£1àAÀAo·SQÄ9Ïáu«1Ûo�sçôcÍ�ÔˆÎÑøU/ [MðÜfŒ\ò««ø”–ÉëpLw]ckŒgÍ<%µzI¡K®�×\.SÁdd?’tŒ/-ª P¡u’ÞÉ,íMT~zð=�*kç*y¥UZÑF¦È˳¶Ä‹ö)|¡dKxVFQFº±ÙO"[mmаYÉ¡º2�eÌÁ=îáꆧ´ñ«——1øÚ…@眃Fe›ÅÔÄ t!B%{�°of1ƒ¯,Å'9E|‚%;Wl;­þâŸ[D‘wÑ% ÒÙu4?Yq|[ö!%˜¬A28qö<\ÿW™­ñ†ç²hõ=HìÎxÈôŒaç†8÷h˜�§Ù‚¦–ÌøÖW>Œ¬©K¼K*YvC8¢V5ÞÍ2†{Ò{Ý&±mó<�-’¿U¦qÎÜ �H($É�G1¼Ÿ)¯g² ¹Ø¾üÀŽûpuê ø²LùfiÔCcà òÔ�G¤ �×3/íŽz.Dbn Í€úç¢##G·�óDcÏîïC­î/±‹¼ã–óùrYj L`Á¹Ç±ÙÑ\Š1Eë¸á Ƀœ§jod!½g‰é„Ÿ4áâSÖæ‹Öæ1~ûÑ^]9¥[CømsGI[cðQÓ± H÷ÆÒ‹âÅZÍÑö׎[!Hi`Xcô£ª_\ÂxÇbæÙðõŒ&Ò +¬îSÉ.¸?vÛðù·S§Þí1È2�· è}ø7Õ­ÑåW�Šâw—zÇlþ�,®¸Ójþ÷‚ ôo’þ¼HÎk„ôïôœÆ¨þ>B÷‹üÄå§E¸ºÄœˆÁ4eÑÔŒøþ±Ö¹ÅBMí]Ó;ä†ÎÃQ" ÂѼ±utA>»©\Üün.³¤ÍEža 1t‰än)wXÔǶôV–G1О?xê >]Ë™¶qu¤qÔ¬B»Ä—:| £Û7 ¢â\š“‘ßÐ7W<ó.=±-lHe×äaó‹â;P…’QÒ ª+ìÀavÞíu”##¨ Áü¡Ù¸îv¸¼W�¥rý¿÷w†9¦ÞPoGqÐC2þe qAÏÏC9Làº~k8s¶£81I¨éüT÷cãó$ô˜@øÕjHø¬£}ˆý³^9‹ÍÀǺ\Fð:¨¨`=t@µdÐ÷?±çsß6;´µ’ÐÏŽ ˜�ü“š1ÖûÝNÑ#Ðö;勸~kðw!…`ÄÒq=á ‡ËGçæµÆhйQáµë KZdQû'È}´ä��Œ7Ù ŠB\ÅG´¹F#Ð!(ేքaQ3>]=PɲÙÞûx�*Õ"xk°q˜hÞrÄ”oÄOF÷cƒC Çrà‡„ØáÅ 2o;@´ê�VÐ)Ût/H`gÓàiÐ6i# s¿àó¥}"bSK¨í\=‚ǃÅÀ‰�Ì(Ì •º¦ ¨ð©ÖÆkÌ%›�|$¯#@¡ñ.*Õi§Š/pµqÉÇ–õ¨ñƒz‰ wç Nš#0 F´Ó¼Ð¬Nãkáß+­˜.N‹%J‰·Dá®2È["âeÙ¥ö4‹¢Ô•œ-×XŒÕßîˆ$RÚÖ;†çí á@Žß|´o3v‹i˜¸1Åá?xMœPªùYˆ¹ B°7ƒ}K1,øúõF.<ó¸�äc¨¾‰I lÄÔñE±™ÐÍëÃ߬%̓ۺ)|eL6б»W�“ƒ]•Õ=[ìÓ¢D%ÙFlýžz3ÂB7™¼6�¥e&²s Õ„§œæ ŠÆŽ \)¡,ǶÆóð¾°{Ú÷AÀ®‚AU+-€`l¯äØ>|˱KB;Q«ÕHbtUM$Ë) Üä"OÔEòlX¥9…!î˜ JƒM“~ãZ#ÃL–4‹â­½/&òØ`ˆW«ßǚϚ1Mä´Æ÷�Þ8[”뇢VÖR‘€^Ç­q9…¹ÓÜ •Ô�Øð± {lð qHè*¢ ó¶”¾[†²Â†*%Ï%3ËSèÖžÔXº[¤8_í*h.@è´ÎCÏcQ5žž‚MNjAÛdR8úÅÁ…¤Û™¶…kòKkÓ�¦áx*ú!pM»Xi®Zì“ÀŽ÷šáx¸^DjlNÜW+gljðAÐ(óÄÎ åìÉ/MªØ¶D “¸Ü ©;ÜÛ1‚œw�K[Í¢#=)ÕîOÍ›“ð®�æ-dˆ¨‚õO½ãΈFçx/;;/±­˜¤=,n)LÁŒö‡áÎþ÷ŽNékŒ¿‘y xðÍ�ɰ´ínÇ�°8bâÈ%·Œ‚þ“òï9²Q   ^¯/›¥añN½úSÂE.?‡yöïþî~¹†»wƒ)Ñâ’HìueÇ¢úµúBÄèHBÙL·år!¹�/s�K•´`ŒÁZ“íÕvÔ·ÍWMJòçÊÓ×ihþ¾½ÆøÉkkbàˆ†”¸„ tø™·,m…ÓRJ9q'þÀ¥ÇÐ�úXL â�0×™»Œ tû|ùo¯w†0ZÒûÄD›¼Uï\hfÏp/ÆûÍ úÃe`B©dè0¶ƒžF–X¯Úг„Dé ¡A1 „£0Uë=“U�Vf±ò¥[\ìCÁKòÓ§ÐÕÁ*PêFpe‘ä÷\ÐÌ‘ ëš»[óïÐsÊLã4úŸF˜gQkµã>Òð;NÒÓ¨?Pu9Îsß!t¥çu‘¸ †g…æÃ¢>0“Û²îhfX¨°•´„Y$‰yhŒæ{9U¦;î0¨ÕU˜Îv×xʦ±Q˜›È¾Ùf3¬ì±“•9Ñ‚dpÀ�õ¦Ëêë«éœcÌC8=ß#sIê´{ ˜tQCÞ_ñ|­Z_ó¸äˆój/é¢õëåË‚ð!ýC†D {É™©³¢(#°iþ.ÂÓ©òñ¬_Ëï³Ôæ#-iÆžH?d~ýÛúZwVÉûù‰\{zBsúöüidX^wÐ/§¦gLÊÖÊì–aYA:Uáqi5jÖŃëôâûÁø¹µ(�¸³÷¬‘³oWÒ96ô9n1âÜw½-çQ"V´G—LT”ÉÕy˜ÓcËnlc›"j[9¹<ÄޞЦ� ‰­Ó釶hD¼›ÒGrPF}w*ìÇ2ÎAD0K®Ç׫öÑâ;ù¯ÍÌ<¼;t3k¤„Û!cÇýÂëòõþžys¹`=�i#Áß^â¹m�…¬Ø9[ȶæù!ÛÚušz°¯äyîU=ŒýÆ®Ìt99þ¹˜4üGK�àšGý/ŽÈÜ™.ä':ÀpúA³ê¤¶MÀ¥r\·- Û&AÆ?²dÁy¯5|Ž0=…~sÍÆÊ¯m/ÙLÃÒ0}ž6§ª°�©@¤SµÚ~‹äŒ‚Šäµ—Û5ô¬-â½¥çç°†{4@·üÏtL’X%½!G—ÍQÙÈÄ8‚ ;®eO|T©í‹÷¡ËQbº˜ôÆJÛŒœú9Ìx.É;:nyÌ5¿ô[¬žÚj’KMC ,(Ö  ê '©«š ™ãÌ„CX2³6h[Äó¦>ÎÕX*Y>A»¼Z:b®Ù¬¨Nˆæ�àJN"€Ìü‚XNßÁßOH2¸„sN5ðÊpÃaJå÷îm綘FÑiטÔ÷8”·¿¯+¬ÌM±¼þ)zLgV•ir`�Üh4D¡ )t Ž•Œ×x :m%éyªÌ#xt´ÐÈ 4íÙ›WjÀTïŽ w§kØ ev;ÚyfŸ°~Ñ|õõA60m^›Ä£Éš»­¾–ž�©ŸÊ®ä_ï'_ê-uƒm±]“Z›r¡1Èÿߨ†›ùVGTêiç¥å­šó¼† òËü3�l“�{YÀ׎¦ nåz.¯cï§³ˆ/4~ÍBþF66ù…â>y¤Ä[ÇD#úhÿQô^¿%Ï›Tû{ø‚>ؼðž6«Ä:ú2Ç¡r€iŠê`Ã6t^`– ¾ÿÕ ÝO>{l¹§ªý« ¾¶¯ækÓ:¨lM>ù—Ÿæ±ú­c0ÌiSâmNJ—cckjÔ<Ø.„ó3÷0?ׂØïwÍÞ8v{/6ø�²[bЧ=„WØ[°|H®‘h)hR~‚‰ �fìH®5 ÷¬4i…£Ï‹FÑÝ îͳوùQOLž V_}‹gæLlö6þá4g Ø+$CίÀËãNYÖl0�¯n7ÝìÃY´^éXHñ·!Ú}ô$ÀÄa©‘«]Õ‚Éz»9˜Im—¨en!4ÝývÆl¥ü¼“o !×X×¹þ™½âVÈ8|/ì ¡�Ñ|R:ÃQY{rl �Äz}¿ÍüΤ+„…�ÛŽ7ïÉ'<ô'áð489'f"ƒ,£ð:}ŸWÆiÂa¡Ÿ�4Épþt¿ÿVØeaÑ2K‘Ë f0¼©ð8Ç”—iB/ªÐÛM‘9ÓVƒ)n -€îÓÔù¯2TÂCx�l@ƒ÷v&À×DžûÀ-F�j_e%îž.BêË&y²ó6™Z0‰Æ½$µÿÔq9»vÃ]Ø—üšzàx leð‡Ha�N�7k…¦6;€ˆ±Õ‚AâlÝn57Á¼®Ì¤þþrfì–xц.YxòçàmŠERß�ck&âxC†&ün' Ôs5ÉœŽD!>²¡K Y¶(·Ï _®ãð›`Iv'o’óÊK½ŒIg†Q:Rø~“ÂÕÑ‘j‘¢6Ê›a6#l(¶€ß„tUfê—L)T'“P·€íµ,QKCºK)iŽÝ=©J�1®çzùx‡{ÜIÖ†ïUó�,ÓüáH�aµÃâ²fXu-$±¾5¥—쵕™¬~ðiu®¼dg2_g ‚ã%Í8éÒW¨„˜­ÚF|òJ½B!�†HkBç_æ¸Ó8óÞÄxGÃå›zùù¿WX›õÛ?„GðN:YA³ |p?¥j JC[PgêšaÕ¾ y_Ûvo‰]("ä3ä``Cxù(ZNuÀ¹¿ØK÷!—Ñã~¬z¾3çÁw¼éq@Ëvh²èÌÔFïÍ|×p Dmˆ¢%¦º>òÉŒŽ„ÂÅìMk“YÏÊ»P¿ˆ× ™LôhË*.X»¹[wCDܾšk=Ðkc¥;·Š­t×wgÓ‹øEá‰?-�†qQÝvÃ[ÅF [ŒE$âEJ³\½³HÿÍ­ÿ@Oe›´®WT ÂΓ6<“e��‘Æ7–ÔB—¡;ÊO‡çv×!Ó0ƒCIÒ×­d:Ðv¹s3¨ñ§¬ …8�Îq§ÕãõÎó/0 ]Ö¾9%ÞäfÒ9j[[�Ì5“Ó%¬€€8 ×òO¶<ØjúÔò)üÑÇ*¢}Mÿvà§!TÿS]5=î‘"»ÖÊë_‘wÖ¸2ŠO`§Ð|¹G ¢1âëïûö<’¡WR”£Ï«œáño¾Vàߣ€–Ä>À�hãb‘]œ[XÖ¨%‚‰³vm~_æ8 t�k°c‘Öül€Áð~Q cŸ>i¯Ù/pYµùø±` ß­ÜÜŠÏî“ñ ‘#,am¢W[É&×y޼־AàŠ¾»ßØ.ï¹"·¿n¨^üÚä;ñ‰²c£a|†öoh,PÙ¬¨NF×À’¿f%ÚÒ³nÌ|eðtÞ®Žƒ)1g0È€68A[\[2ÆÚØÈ‡n$�ÀÙk1 ‹a]°qfQLgPÓj�à›K*›Z|‡Ëºú¡$ÑŒ5Ùý <åÔ%q†>�YÕݦ¦ìú¬®õ®q/2�-mÿYÞ+õËÝýŽ'o·�³™l4™ù¿ø-‚°Éß[ò¶]Å�¤ºÊý¡ý7ÇŽáW³P.`¸"„�8,€Ž'ø(vïHh)ZH[�@‘Òg¼—©²&ÜŸ ]º8qc_ª_¢Òí�Œf>Ö„·˜uÒ{ƒÝ±§@\�Åî ÅžŒ�¦K[¼RÁü\¬Mµ¶±wMq ´òÔØ‚¼åèm\�f¬Ékv¯LOhò½7|宆(ŽT2Üm ôö3ƒµc´ «ç ›=ÞdícsE—Úûõ¢ë**ºõ¿¬Z×Aí%ÚôM ÿBµ¬ÂÂÓU½ªWø`´‰ýI,†qòÊÅ*ÞäÄÆ†ô‚JnIFNŠB*9™È‰®>’*�]LßÊM/®jR@çÐÁ·h}ÿ·Œ´„‘ì˜�ŒŒB3>§ßõM’JÌi®ìI0i€›H醒0$?oß·ö•üRâH20] J|ŒH-ññõßÓ܉¸WbIa¤„méHCûGÔ‘âl�i#Ae€Ü$€³‡·_¹¨PhB A PÄ#A¡ûë’ï­¦NÆž~"ª¼ká\Ý$„¶/ëI/V!Q€Pîêåã{¡${�á!~�ýËüu8jëiÕCvs g@®“ù×irgä&‡±>ò ¯Á„(fQÚszïñT;6¥U`â«[åÊ—�0qhå˜tøÛôA\º�ÓÔÀ*×õ°Æô`ÞØðß?ü]+ÆÑt¿÷1ÙWoø$+[‚aOcín3ð0Ø»éÈö”qè¶ìzGScäqÍŠu]/6ßVé†!‘jÆ,¦4HfuË(b¶ô&×LÒì(ºƒvš±&�ìaX;ZÈ"øª=�åKÔhy’WÄ ×XE“1¾z<-ÈÀÍeäÇ>|?mÑë'&sèÄY-¨$e&_ oU¶ùpÎį¿}ð« jD«ñ;ÕxQÚ󸟘¬k°•˜È ‚Ù‘L—g#dUËÈ0¸¥†…äìo4Ìõ8ë¸Àç¤S ù%¾KXíaŸÌJ°è–«’©"`”ñ{‹ÖÍ–ão9æ oÛjÖéV®T�öÆZ¾¢ü]~m·n‹(m‘\Ï€•cˆÇh RάQ…pûSÄï 㜡Ì6Å{Ÿw’8óÛ…œ*¢Ü bpweRæA?'WY‰çæFÖòÖ ·¼�ÈÍ#ÈqÌëRÛ ï3£¦Má´ˆnÍÎ ÂU¦6Ž‹Ïð?é›N9o¿£^?^š°/ �?ã2ó >�äfãB-š�}ÇëßÉðÏ¥Q�V÷ûv­ëyÌ­¥/©''lÏfûôÏƳT62k =Fét“m=Üøñ+6‚i �ˆx"bÉfÆ��†l–Ô�Øf±¼/ ëZìa¾¸?Þ%Èd´O\×M÷°«hZ€B‚¶/;7�ˆá+©lGµµŽ4Çf Aût.´û*/x~È †Gn ‚›€fs½ C8®cA2$PŒ\UÏÚKÜ¥eUf_CmÜúðk–9âîõ(Xà Ñ7jò-ÌŸžµw2ð>2@u­ñ˜˜%H�ˆ›©n6Ã3i½Ú›Ò±1K>¹.B=Ød4Œ®éE,)¨‡ßjG.ÆhD^�é×r&>°7Øß™7Œ?߲݇¾`„Œkä¿™¼÷Ž3þבkò¬H4ÏÞL?ÏÈÁV($5Ã,h%½”4%ÏŽ  …×6¥-,=òeý»ÿ 6s.�5ðÕhŸÜ>ˆ´×TòBlŽìôÞ…K¤_[kµdŠøÕÄN¹uè¸Xz ¤¼ç‹fYÆl3ÍôŒÒAì}ß~¡õ€Å޲äI¨5°É0Ù¦PC,Ñ�-2Šñ�õ·k´Ü-Ý",¸ÆªmÒŒù¥ü«iáwƒÇ#×p(øÒîÉdª8ê�ï èFÐdeE¥{„V¸˜'È>Z@öùﱃLyfxGcðoúø_½D^žlÊœžß²>ç,âÒ °c ?z–E0ƒKì3ÿ 󖸺Žî`U‡…lofx£à�‰q¤Pó_—©ª�Ny3›ú^õæc¾•_<Ø ö­½5Ao€:�ôFo¶€<uq¸í²ÑžàXõ¿x9ì=�Àö•ñ^y»�ßcN3É/ b@D·H&d½.¦½� @Ô3 [r˜oAbÇ{g4h7² /`»ÁˆzCžÛxÕ¯o|·%¼›îБžìZÒ˜ÁÜ xðA‚L`2 ÙnÍÔ±{l1±günDæÚUKf›r¿ô1¦è}—C$•$²þü!nÖßÕŒy˜½üóøÿl}/{8q¥°„�s�®˜mó÷PŠB‡\ì.´…o³gzÙŠtFÉ1³�`eFÕú·ûáœýÇzÙsCœÈߥ@¶ %Ó*„ª¥H™È V…†Ì¨«Á˜‘� lAs;ÓS}އàõ¾7@‰ûVÉ?E…°xf´wò‘¾¢�‡H<)¡¿ ”/K�h§/Ï™W¼"p&2ÇúÃ{jOo?é^Þß¹îW7¶î¤ƒåbÝâÅWLíEJÜv.Y³GfK®ºÍF«Y>=†˜"(:4†2Åš+6 Þ:¦Õ¤$ÈTu}ø.Šyô &Ç·&2ö©j—ƒ²þ¯¬3ӥݾ¡”dDÙl€]Ÿ]¼**±¯:C¸À{ãøOn)Ì.Ö”/6©l ñ6 †¼(²v·ðD¸ô#d»¿g$EkØÇ ñÝx<ÑL�¬¹'PÁ0ò¿êÎéϧ¼¸È§×˜ï™ÃzUè’êó£Xú{×s´ ×Ú[¹ô‰-"BëC(:ã@Nh�CôÛ³/Ûè}>N"0Æ7må–Ù�0›TécZ VW»[mêÆúw›û7à[ ±t€J FÏÁ¬é­Ù ¡¬ttŒÅŠã8`‡œâÓLÙœõ’ ‚'¥8ÔƒiÄ*ºŽàG@Ê[VØÁ·ðAù°EÏüþ†ýMÙ ø òCl#_|™+lÃ;½ùõ¾ð\}^�ø9Ô©;\�íŠUíηá '¼`!O{¬c„fZÊäš(p¿ã›_7„m(îS9û,'yïvq^¼'úppíàôavÃrnK®�êEôù‡[î�ÆEü¼?“™«¨2Æãºä… 8 ƒè²á“Ça·¾B%ˆ]oÑX*PŒ*:3x²�²Y­çGÃЖÜ[hL Ô@A3“΀&îZƒÚÌ´Wð]Ùööû‘pZ›óöm48@¬œ´û” þK¨öÁ믿Èý?±–h”Uív"x78¥VöIHS‘áÍÙò)[˜Øl‹Ìµ(Ívq¦‡fýÅñÔ?㽓»W¡ùø`ÈÐ*züÖGþ|Í–Œ`iKñãíñÅ«6§øÿ§§ùq/ÑØZJKüßýøù¡ývîÄ <Êæž �Ü/Á ¿im|¿–v½#ªQ­P.X�%__Á"á‚��ÄWV¿s›ˆB f¯Ûïf¬ýµûï±Ô3†¯²@$èë;þU¬oÖD\!ùŠöσêP÷2¡Éøh¡P(þj@…áPÎ ÛK3nXh=ÍR´†ÏøšPD líâÕ,Âî7®ÇþOÈðåŒ2¤å{+V\³nµgÇC8®ä0dð¶0VÐÐ «{8Ö/Är`{mÈM™ÙNø¥éLµ{êÛÇîõ>îÞ¥ÈfÆ•:s«�½{A¿óæ{eÆ˯�–Úóž¸Ûë5õíˆ÷¡bµÒ®Þ†fÐÝö?ÚîØÉ‹ƒnލs¢+€ðõuðK ÚÕN ˆVbæ/ß³æßÈ6µäX ‡SÀLñw¢ˆd°‘šTŸþ®­ðǤïâ‘(k©q‚H"mf¨@ƒ(3dÆ”Ž_ÑÕñüÖqL¦_åfÀ¢D|šãSùM„<22°4E 7ä¸ã�–�öw‰9�Hj‡óSD€ÀÙ[ñUˆ~Ü Váh5¨?ÃJ«±lD¡/—çj×�b&º�ûBÉ5 ÑXŒ]m\�}ãn€ûÕ;¾Á&5•ºòèúC ûí:±Å qŒ-Ý÷ ØÀ»]!ŸnЛ֡p÷7µìW'¦ó¼ƒ®JkÅ9H6ß [O ý—à” Èµ)œžýÊåóL'ÿzð ³ä 81 ¯~+×m­Ü‡ÓÉs ÿÁ»~ &,º”K �êßA+‰mÀkÛÀæ ­”>Á° h}ºâuRoÃcéî4eÒÉ À09 ^ð‚�æ{yD+�¢u4Øä6Ë¥Ü�ž9²íšìé»ÿ“iYÊ_s¬1gÑy¶*ò“£ó+ѤV# ¥ãÀ‚vþ¶즉N¬<ÞÛ%¿LŽRuߊÖÇ·Üö"ã茎YXUßV:РËØ@/Ÿ¡kÎâ:¡\_Öv«æžŒçlªöè´¸d¾6˜¾~üOØ”×½Ë&á—ÆÔ·ÕtÃÞ.ÏnétDÓ¬Wå'6©-¢¾"¼zÕîî¡\óÿ��è奈•6 Œ´‹ƒ dëTÔ:Ó‰ò ÚS�„›ºo„׿v¸®½««9á½i/Úú•ãtéÄ›z½ô»»Ò‚}lœµ `ØÇ¡Ì�û¹)!|fY'RÔ`Ç82ÕŽep�/¢-hΆèÄDlß’tX174¡µÚûÆo}³ïÜ2C×Vƒ¹LOcÍ�–¦žp¶–bÈÅýÎÃîßûšûÌ}�|'©uw”¸á1ÕÕJ =ÆMɦó‘çwu›à*– ƒ½%Gíõ5�yQÖA¶•O e}ŽF^¥­T¦:ްYÅöÅæd¾þ彌.;ù˜ƒk·.´u6N›Z*-¢­ „a%E7ï?{æh¤�"+àˆ±;ÄDV„¶=…CT•¡)†íÓFY\5‡ònb'E„óxo€\ªbÆ� éÆ } £*F/ÞëôÆñ™˜!‹&¡ã4ç„Ѩ«]?¨8ó(!N¡ŽsHå@gx^.¥NE™n‚¼ž~Ĩ×ÙÈd þÔ &V�ýû‡� áC(ÔˆHµYV½Ÿ7{·³©eݼÐÙãXÛdt%0ÿ_ìž¡MöÞ[@†AvÒn\øb^dFolC q ¶›W7›³gçeÍŽA«Œ öâæ¨¸ þ_Ï A5ûÀ»çXn ¨ „ Úƒ;ûUrcs‡�øý®{›IzÝÖÃËw¥ßóñùDô™±qœ­òÍøTrkò»€È>øIÄ¿—>ì~Xá_» -ý þ.·f�½ûw)UQ²=ªŽãZ)Ûo>õº/Vݰ;¸µ¶9ÓèóÌÌŒžiŠYHd"»¶ò‡Ï[¼Ïˆù½ôSÉ@šŒÒQ”6•Ä 12„ Cd£ý›„¨v� Nµ’¤ í¦ÚCw>‡€Î¬¨]aüdÕñßpëò"/°–.gg ¦ûÃažm7¬¦öȈK¨©ºÕˆ§SÍ jÛï;®6§üOÜýÞû;+&¤€¥ îØ7?oàå4mÐÅ�2Y E:sª¬+Ü4>—ïŒà K—¬ a[è`EoûƒÈÏÀäƒ Ï/�gWð sï:QàŸ¶xè 1e²µöŠ 2¨÷ZfEGéE‚„ó“,uÂÕV £&eT•ð(ÄêDÒH‰:/–Ù¼1„&²=>á8Å‚äPýg!Áa×pé ŽpvHµ]Ðg‹½õH½¦(ÞàŠUz.]×�ÌI~9+Z¿±‹È¢óÃMW4¬�^4¯ Ø©D`cÁTðØfº3¹¨¶MÕåádêP ¿Zùâú�í;ùÇåÓ^ó\º¤¿ƒw¢‘]»ðáßÒOvÇø“K’_.Ú�°ÄòˆÀŒò[ºêZ}EÙ»,{ÍÛîÆ�ª�=™†”–x–¦ „ZÖ=æÛ–ºwMòwc ˜¬{Õ»8½„˜+3}¯µŸ“¤R<ˆØÃì‰LcLÅÍ?†Û@Pâá·„¿‹‘œb‘3¢ûBöS¶u®gÎtêL¨En€Êœ%’϶¹ùe…¤tÎ;l‰.p+ŠõR ?Úâ¹>×jX̬ðC?ñ�7* KÜv½ât¥Wg\£]>ó�²Ð2FžI¦LÓûúx±^º®›¥¯¬9› ¯ñƒƒ…£(ÈÃkŠÄ@`öSö”}T‹UJ"ÞN²Ã¡õ’ˆÿܵ¿¿r:�žyúôÉ¡ ¥ðJÙý%‰VÓ³ˆ-"¦ü%øù”ßçhmŒ+k·Æ6&dhEÊu�#$F)�¿Ãy5éù’ffÊq©°OÆ‘Y¼ÆÞ|½Éx‚BȺd§�x6Ñà®påÝë+Îd±zBRÖ¹¹<Ã$È)–\Ÿ{8ºkÄp§Ý®…$Þ çZ=ìŠ#‹¥ð’»˜ã2ˆ¬¹ži¢ì躅ÁtÙx' Y@ý2r¹zwxeÕÂòûBŒV‘ ð”Ï´öK8’íÄ®: Ž‚ ÒÌKLíŸoFeººíÆküÅMfþÔ7ØóÞ¼ æ#“æu%¼£FŠTŒÖëðÉó3ãß �i¡‡€»'—xZºc“9µÝü]øå¨æÝ:‰%¨D, ‹Úî²myðÔWþìr+Ût ]ó¢ŒðšøÈ+Sij�G-²{&²ÂùS‡^¹¯§‡Æ±ÝÝg+©Á/v�iQÞî' ­9ÓÌà9Ò\‹|”«ŸLe³™�˜4Ô5ðÏÝe9" hí};¡˜8X-¹KW &D¼_k™©T‰C:⥫¬É3a°j0(Ä3²R.�”·SDŠØÄ“ÖÊ †H0vU9ó(Fy+ßÊò7 |»IÌ!´Y+ȃ£3)b|”,&Žû<â$¶+-³£ÕpóK_ž&ºÇ £Õ\8ÕîÆÚëþ“Ô&î—è~\�ƒÁt˜ÿÂMÛœ +UŽg)᣿¾ü°@ù×ê”;“Ãÿç>J2ËÛýHà;?Ù˜…¶ÄŒÛþïÂÇüÍ¿hæ¿§¹i$¿ †Ù³S#ò»µÉê~ˆå×ïD¾ì«^0YÀ’÷_Të…äùùëçØ}'†ô=û:˜õ�ÜXQ]V¸^â‚îsÏÚŒû�ð0ŒA éáØ8Ii;°%§OƒØÂ <–wC†ÜU—ý¨µâ³ZÙ Ò7®› öôÅ»ÿ-©Æ‹ÇŽÛ¤9}mÊÓÑ?¼l5Ÿ•Æn¶æ×I³X¶½¯¯ÃšÅB¶7ô5¿× ~=ìw}Õ¬Z«Ë† d÷ C‹ë¤úcdf/—ýà”»¢<—™ 4óƒ™>‹�×1A‹Oýùw±íá ÎfÂZü»Œ—Õ¡ü³(‘íc0=ì9d½�‚^B®{ V·ár®~ݶc�MM 4ÖXe-��ÃT?Éf×èÊ`˜¸eüh T€âÖ7©hš»nÛúÈzù4’_aš3¡®Fk^g€?JÝ´ÞÈs³Þáhº€÷:Cpž 71‚øžH¸Ñ‘óŒ —¥k%ö%ókJ!ò½$õà4&¯êÝ ¿ÎÔæ&% Ý,Ë@ƒ±MƘ÷gy«ò{‰)gµëÍÍã‡Ìx«ƒNÐ'¯{sààôM”–ËŸH”m„78á†Æ-}Iù ù½'2fù1g ¢wˆ �fí�-»­[·Ý LT;®"‘ï¬]TR8bNä› ²Í „µ/ø‡Ý}^6†ð­’ºz¾÷Õ”ò²ù‚–…~t¹—Ý?Ñ¿9ãmUólÃ;rEË(Là˜í‚¹×G‹îýMZ²ž§@˼5HÚVÌJYß¼z•¥âkÕ½»@n?´P[?ì À¶Õˆ ß|Ç«éôòMwº”�ÁZÎ\�m±~«¯[䨛\šÌ÷DGzÆÍ¹dç™0bØÐVp­ògå Ĉ܋ªwµÙÀ࣠ƇZ¢7а �³�Iî�:+ é@A¡ÊìïÐÜ‹ÚþYüëXËÁ Õ„?’è,Ä-çô?![çù]]K¿1ÉBA ’B—ïRø€%e&#+ùÆ÷NdžïªíݤsMkæ ýOÙ.Œ~îülÎþü̳²Òžœo(|"Üg?§XÁ5•‚ú(ÏŸ”`Qó«ã{2šk6¼«ókëæšr3EblÕ¿=«Ú ±µk e a¤KkÛø+¾G·¿²ÐOrˆ<wv_p(ehZH¶Þ0Pq[m¥DÂ7ú�JH"¶±<¢>��ãQ÷³õ pùÌ<ºDM³y¦Õ'E‚›<”!¬�4�ŠMˆ‰–p¼ 6±À¶p>0HùÜpk‡öƄØ ˜þ–vq©Ê;M„cÝÙÃã¾W÷m îlSô åj¬†Q™ÜŒÜ‚¯½û­F5BB…éõ°ö›l)úUˆdÆ¢tuk°ñd€É@(“ÆÌôfŒ¹Z IM»Œ”~¿kè覆ڊ䣊À €x&™>ùk Ó¢€éL‘¦ döÚj€§ºÊ”£T`Cà»R˜å¥Æî¹< 3ÆÂAG xkQ„”ÆÔ =â/šï>ÎG¦›uÚ¢á­Y÷îG°óy˜Š84ÍûúŸ—#Þóí—�_µÖÎ ¼®í„ÕüD:dòÂm(]£¥(«WŽZx9°„XfzëSu¸èB$»9ŽÆ£W¸Íôi愤~¾FqE«ç€x{ËE»×7[{äOqm_k5q’lð·íeäªþÍ’ÏŒc`iQé;IÒ¬ öïævˆ›_½ó§Œ#ËX¼jq¦¸!u•3« Œ¸áùÓÌt†•jäP1¯×å°»$V+Å'$ *ö÷¼€DãŽR±%ŽìóÈ�îxÑ1{Wˆ¿ýÏ"\ídRñÝ(F€…ÿ±óÍy”Ç‘æ©*÷•%À^œ?w`·å±“ 5÷8 €ÏéŠ|óU5¯zo¦wï×x|l›E¹‰`KJ¬¾ˆEó"0L @3Ö¹ž{×Åx¸VôÐåA° @`µŒ(†ý�f—˜Ì‡OãÅ0ÐÙHî“|?G/"û ÇÄú‘Q #¶†<Åc¶¹í-{Ÿ2 C=䦖Fë”~ë){öíÂÌ f×/Ò3ª)îVé›àãœÖ²9»p­(ãu¡Мÿu̾#Ø¿ŠÀ‡ŠÆš¥�“†\HdiCºoa‰¶J?`z¹óÑÖ vCÖGÖÔŽu ù—õqáaÊÿ-·`@|Bÿ./fÀ_]ºÊ"“=tؾÁ�-ôxH†‚Ö¾"!÷y½&ï¼Gƒ½<•údÒùÓLÏÃÊ_»×0¬0˜N®“%ÜX­Ã q&§„Pˆ)“,UxéVŽe ñ‹ÿð_ý�ñ@O`è0|‰ôc™g¹"¢áä:†“=öâ‚W—öçTØé‹åÏñ š{þ1?äþO¹ÿ¯}§†/ vÞ›0»¬PE$ ÜÚ‰¸Ÿaüeþ~î°ýe°"\ðÁÛ�÷2ã!ÄçPÿ÷°ãÜ Bn�‘·ü@sÒ$KMÉA`Ns`D>›åÿôn¶£MƦ¶À¢IÑ[Y»\Y¶U7'°Õ`û:½[ “ͬ§ñ>Ü÷;Ú‡²žeñ㘫=­¸d¶øñœ›ä†WVcmiãjípÕb D‹jÀÜD¬[däºÞÑ)hVfRÒË‚Í<dÕSËÿìáv¦à6¢“¦ �Xˆh?~20. A€Ú‹ÆõuœŒXgþÂÃû{Xù ÂËݽÇB4.½Ï–û¬‘5Ý0‘‚¥|¿6öƨ6@ˆ˜Ñsùi çð—-A «à-“�)u«”Y×xªÐ¶ŽÿùŠ,Škñ[‰M¹žXHvãSwÎO‚ãPFu܈Éì+˦x™aœeîP…V|  ô–Ϭ¶Ë�Ú.ÓHè3â6töÕíÃ"Œ �`ªã ˆ;2ù#‡°5v‹•ÇA‹í’Â÷1�;¶¸Û ­/ DÐísÅyz´c s•Û­�ðçkKb±^Ð>ì7s²ƒØ;wš�&{M�?öÁhØ1 `âÔóÌ"?­ã¢âìh>âÙ&ô¨ü tÂàí¦ÊqÙ†µp�²7î>œ3ïå²GS«Š¾Ç£—�ËÂ+ø# oÜ�fÈdGí·à©Iù÷!Œcƒ‘���‘ÔÒt$™s1V¬Ì�^ƒa¾¡ŠEDvÛ¶6?ïÌÞBU©ó;=Ö‰Ÿ'”Ù/ñ.®ä˜$Û–Çó«è½ÏÝóUNyîq¨Ô„$(Š,‰É1Tæ÷×Ê’†‘¼Axk¿‰Ã ªÀä{mœIhzºVËù¿vØ2°ˆ¬ëcgÍ¢SÎî|‡.+i í—Çq�- «æBOGn#%F»L a]|A�óïo7K…`ÏŸþ‹~¶þ-àÞ£’ÄAFØL%¥¡ÖJr쳚Mb<‰fŠz�-Úí­ s•@d`”‚ÕH~aí?æù_¶ø‡Á£º¸�~Y¼s¬ ­�ýg›ó΃ÉÈ F+]± •³“õí� Ú`*‰c†$8Ml[›¯;g+4²¬yw�Íl˜0 X\X?%‡ N�ùc¸ˆÁÖåªÅ‰Ü ±å�1³S6&t&¤ñ«X0«Ú^g Cd´Mÿ bÂn„Y" ÜÄ}å IØZãÑ8ç�zëpƦÑr: �ù 9[ëLÚ«Î/de†imàü1PpÛ{l€½!ÐËù€Ÿ•Êgµ„\Âr½îãOAy‘ðƒÑÆÈ3ßCžš¬›«>ï“ó¨!¡�<ˆ�2ÜD¿u„�âo p>4Q„Ï}\¾Ë’k<»hÈ�&»5‡>E\ÚÈlÑ™ÝjqHɦ.¼Ã è�ŠHÍ\W<ÉÔB¥ó>½öFØÕÁ!±\_‘8r#ô›YL.ÕéïŒg8V¯^µtλ¬´ƒcÑGoÖ°\ñ!ƒg]ÿÏÆŸ¤Y@FÇ}�Yóœ~ƒeLº7�Uà+-«¥¿$˜tPð‹;a¸NÆ.ÉÖ�°= ¸RXðüÓ�~ £”ªÈsS'p ±‚` d»íÿr°$Á–'~v͹iK ëjë\êCc‘÷)µp�¹3¬¦(i –�{w OáiaŸIê@ñD†ŠÁC—mÛ(.fÃ(—ßorS|™H–¸Á^cL¨+Ûäƒ!dØ;Q2™‡­ó¤tƶl)Ÿž‰bµè�zS‹ÛuŸÚÈÇê.Î#·÷&ë�Ë ¸2@Í�F·áúGAèÆžÚJA²ÎJÚq(Ûê `AÇp…‘Ï�Ø6ñÊžsñˆc]¨èŽÌ(KYh¯Z\†a¡µcÖækœja‹øI„bÌ ¼п!h  ûu1àˆài°6 ã¤O‘Šqß[Íx5e+¡G¿ ìµÃgEÖÍòµW8ÛãÇßò7ï3Œñ0�Ç2Bå-h5‹€)“ÎÌ>}è0¹Ó&?¯¾ˆ~žã¸Dª¦÷@^ûSÁ|Uë˜O]†#µ†)ö'j†„]ÊwJ=]úÞ(¹ZÖ¥wñ'€dØQ9kŽm‘qXz]4÷;°‰ ¡ûÔfÉ ›soh¦b•¯)! @uîQÑÇ;W$׉ÑïÒÓ:ìNSSzàYâY›F3P)EÌë†?Ý¿…¿âñ2/ÑãÑç\šDŽ ¸âq€Û@ê¨ yì&ËZän-”ƒ4�Y€þ¹î¯h0¢2L “¤[Nr€%Óæ�·1;VÈ�-:)>V0²2cBÇ+E.läík 0Ë‚[eÎtõÝmC{Ði™SñFÉls‹á‹-¾‰õ}u x�Ÿ§ ` Ô™Wìwua� ‹‘y�: C�¿tÜcõŒÏSHÁÙkÞå½zÆV©! @�÷â�y¤½ â±(ô�-WEáíN‹—w,×{J6ß\–£yÂ5‡ ÞŸÃmæèÔ_\O2#wèqqÍé| Í'ñö1hUƒ0 )j= ÎX_¤Ä‹5ÁdG›o9ko|BE³-æ��y�r Öâ/*jXG™ô¹‹iA€aF1…Ím?Z]ïÊÒì2HëÈËOÈË7­ÄªÀCøÔ²z½¸6õ›Tà”qñƒsñ„Í'h9ÎÑ×›Êw�ÖñJãt–ª4›xáïÆ JT“Ï,øÍ¸¾¦e†³)c#È€‘C©ùî …A’°ŒÑX50³E/Çeš²(¸ @üÅâßgò”õDâªÅ‚ƒ¸?bG_×Qauq¿ÊŸ7ÝÐRQí_×_l w΃[3(ÙÒÏÔ9XŸÆ#\ã�™p"•ªÞ�b•»È‡Ì~�‚H7F›—øU%SûÆðñ¨œG,éð‡÷«ý¬qê㸟âˆlô@@PÈ…ø˜þ̵IâŸÈŒfÇå‹oú™D·F~™%!tÔ¦ ¦;ÅÝÍ…S×óùóo …¿�Ç�i^¿¾Ý׳÷îQI<¼ØþŸ‡ m�‡Ü¼Ç^RMkŸó°HpnþWñ£^)Ô/­ wƒdÛlzÞ^T2úŸS_Ñøý±q^îè^^@å øÚȳ:*·•'ÃxÃG#ŒBß@~�� cCšÀV±À@ž¸D.öÐ{§t†D†åF†®ð†Pó=ÈJ-\·ÄAéŒ`Ížëðâ7ì~+>²6Œ'âÿ1�h"_Ÿ×f½îxd˜¥oìN7ç˜ÔIÁ¸Óh hÅ­p–aa¦Äx¶ªÝâÝkÏl6w‘toÕ½tÝã�GG\kNÓé®›Úw²Ð¾�ÊëÆÜz êe z!¦àIóÂáy­s+¼<2E(tFGK+´í!¿BÛžg^HUƒ£Ãéã@»ØN;óMµÑУ“bbU�×!¼jIÖ§‘ª%Ï‚öqoÚl¹)쾏Ϥ\í뺄åŽqH.ù#Ê Ô�Y"Åà`ª`û™†®m×ýtÏ·ý³Ã¹û^ÇÆTGê9fçæ�[ë ¿|˜{-±Ã·¤}¿š~E-ë�žk”@¤Vn_Á¢°§zê�Ⱦ(}ƒ4ð8Ô«õ*ãMUÒVTŠF€È qz@Ï7î<(ÕQ'”��ãÜ~8&% ©Lôy2O»´ hŠÃoŠkxU«ú2�p¦D Íò=Kp;zÙÜp�V#pÔi~ÓF}ôæåò*ý§Ð£5cÓkôê-^F&/¿º`ŽÖô^ØÆþ1ç‚îªÛ²àìÉ~´QITK8­ò9Ï©"£ØÔº 8FüîÆM ñ^Vœƒ™Ô®Si ¥FmMS.—'vºoíx-ýÏ#߾бéÁ®Ôná`é—Iýtû\‰jòÎ(q[þm¼X_²‡/Gd bþ0÷"£EG~a°(ÚÚu½ŽåœëÞûšßÏàDçCJ¼o)ɬN•`lñaaBcÔC‹>ivñ-a®å;¸6 ("‡£5Ï úEö2qšœcz Ç…üÒûÕ¦ÅjCgÇIu�H\>ÿàx¶?E2¦ˆ5£$J¶Þp6–k�¥|AOÄ;ù¿|@ݨ'(Q�¶  \ÇEìÞe|Ð""}Ñ_sÕ`Â5?ï�/V'ïü`Ø`áµÔ ±2"¶R劤{ó 4)R{ a9VOm¥� �E…�¬`©e…8Áâfàå¼ïup_7n°ûñZd6GÞÑ98ÖÀ-©¨%Û-ýZÖ° aoàГßb4šO-ŠÃŽûÍâL-Ë×vZiÿ`d}ý½hö¯Œ6ÔãÞNM鬘 ‹Øîæ·…¥zKŠ6º_ þÁ„-�Õç[/!µ«™Má[… ¹“ˆ7N% ¬™�}™‚À´Vs˜Óh»y0›Î»Ä v &öI›t‡iìyȹX@u®šÒ[=¬q¿t*©·ƒâ#uñ˜IW#±{ã&ÃC瀹ɯĠÙZVÝÎÇpðÊ-«ð4²7¡©]Ã`½-ט…ZòæaHËGqÉ0즬xUwTåÑ™”â}îS±Ê6»­û”ÁrvxbÄ¥*¡yO“.𢦠‰zlO7ÔìÇ8<ÊgLĦ(Í{Þ1æØ‡2yDט}6òr‡þ-Ð�汌»ã;A'˜^ßÉÎ¥*ÀÇ}°L*2„ØÂXAz� ¡�VlMR”Y}œMròÙ)y�¤Ø½^Ù©�ÃMµ�µŽ3WZÛï’h‚;P �$$AC+¿¾Šù8[Óç�*cÆÍ®Ï—€=¶ƒ:ñ0ð¼ I†cxÊî”ÜÃyQesý`VÍyi%·½æ[¤sƒÆ5;NL›Ü$l楖ÚV¦°j‡h3vSá÷€Ñùå”�ö©·/ŠN·/XðögO•¦¥»õ¬0M,óXˆs¾YÕÍ d°Îc{‚è° ;.†5]•LUÐŽ ËiªIËÚ ?;ÇMŠ};køcx_9iX¯šâ+ˆÍâV%�±’ âôšG ™H‰Ž©sÀÉ[À7àœdþ~¼ [þ0¾ünf@ˆ!ÌØœR¼/Þʳ'K¥Œ› à¢v›Cü'J¿Ç¦›|/kÕ­Â ”ØV4Ç�œZ�jikiŒÈ:¼æ„X_â] ðƒŸÄ=ίµÊàCbH“À؃t)d l”Ï…K�¸“«Þçƒ[V®‹"Ôù£›ôñ6wó�´»Õq#f*›;šH«EØšÊÑÖ¸mYRùŒ;Ÿ‡Ây_vpœ¸LØÂ×€Ù½Ïssç‡è^@áÇ„J•ÎÖ¹´�›bî˘ Ò&—eé¦S±wÒî·š·¸îÌ Óê"ðlZS�užŽumœß�t¨¡X°®™‹t>îèF$ÜÀԗߊšº÷PS",*›¢·µP[ dèÐW\]˜Üp’×…Ñ.*°[ö»cÕŒ“Ømdë>ɾàëì^лÈ÷Jäù�––%ÊÜKP­ä˜E!ßF£®<ÍÐrëVî3-èJýWåÅû@ ðåÓß–ŽÔü€d\ûC³cb(Æõ{@Ñù¹LžÃüæGy¿Õì;j{4°å^‡”ß�â¤\7eF4hM�:-> ʘ1IMÕ ÆÖ—Ž—'@_�îF¿à^¿[¦Qú›!Ç.{òfÖ›Äíü¡zE—9›êÞl×™±éD¾S¹oWïLºzûá\ÕYôÑÞH€  Mñì…ýe÷k/­�aÍ¡':S¹ÂúÒæ>Õ;rìCv©Ú�<Øû¸ÃßÍVyù„ÁXe%\ˆÒÚík ¤MíSÌåòLµâ…/u�ä*hgäsí³Ø;«×{ ¬ØßŠ�ë„àê:FI:DöóšwÂA})ã†Xœ™Žº�1Ô¡º…%»ƒV.’\ŸAqOˆŠ «.…m–4ÂWOªÎ4Emèø°¥¸÷ôËõ �&¦æÄÏÞ¾›ùª³G>ž‹Ïæ>kŸPü¬Ñi“Iô?xò·ÜM@+†�¯g‹{ÀϪ#¸õ�Zܾ¯¾›€ÜyÓË$)íG_ZØTþc=fާßžµäšðÈAËnd%Õ­¦§Í}LF?å� �@€ÉälSÚB…„‡Ç&­Jar2™ÐСT¶&O­ïcÔúRsNô�‰â¢€½-Ñ–Ž_ Y©á5´ÔòÓÔlNRUY>ut±�~<Ù4‡&Qûlqææ\?œEúSï<¶vœƒ¹X-,ñVÉl·?W bñ …¡6ù Z¦ý´Jz;Gk…~¦s³i8’2T[)Ι¦³OÎP;Ñ+èÎg\µ� Ý d*j¹Ë·Vì@¡¤‚mg#3ªán‘YV°P ¥C&@ Ù¤˜ëÑ�qíTš±Ã7ÌØGÔ±æ{ FÛ ÖÝÌ[�B-ß6´›BÛ®Ýàðå>®Ô*p¬ÿ¯mn7±wŸmv>ƒkðGµVa›Åw L_ˆ,€P`%©•‡>;�DäAŽÜ'tƒCEDÄgh°ªXÚ‡¶üq.ª ÆæîvV›¹UëØÖ=‹ÈëÑÝP£)ÊBb«“¬ó™ Xëš `–~œ!eC–ÞƒmozÂå‹„AãBr0¿‡4$O—ïŽúÐS¥udaïOo»änè8buŽ[éÉ/)'x¼ Ek;� {²ðŽtª%¡Œk®‰¹Ú>`%ÔŸ7PÔKé);NSv ¡}`ï�ÕǹWØÚ†ÅžÂl—Q†Ó²\å@�hïf5�jþ(dÖˆ|‡ãèóâÇ/þê7wX*f!Óû\L|ØÊŒë ùÜF ñ߈$²8—sGñNAצ;?}óÞÁ‚ÐÙ%„áu¨´éï´w5´OFÆÅßÀðY5¢¯p¶Èp1óMŒã&ÇFaK¥²Üo½ÉÂÁâø¥e|Ççæó+q•ÍÎñ¿0år–Qo Ö ¡9p¸ç‚>»-…ZÍ™ZÆÂ·ŠgÀé ñ²Íà9¼‹Pó,Ä Ü ¨@¦Üi÷X.æýÇ I«l)!ÈJ%[0¶q´_}u×]iœäˆ÷ÞuyÛ†l»‹bæÆ7é[¨(i‡Á¾=�7Yº gÜ t)v4¥¿†%]%&«ç¢[l¹Uæ×ÑiÏ›rFè®TÄέ,‚Ê£Ûùæ.þùV‘Ð^›%­c*pÍ¿8 €œZ¥(ˆqü°¶™Ð ~²KŽvù› ß�µÞs›Ö�…g�ôÍOÃrHòÉãèÝšM³|Åm)<ñÂÛÜy—áIz)M9ßÞm—[>šà…½Îâe[b³Öá· ã¥1<¤ÜlLL’惃Bˆë›FvÃŒŒÃþÚØ1;V´pÛ¾ÿh>˜íÙ‰keK�Æ÷c~!sÙ I.#V[f‰|& ÞXBE]1WiÌxhbŽüàMx6CS•ßHv‡ÈÙÃpUw½F§Ã¹ì9㗖ô�¶bäþ„ú9¿}øbb§“|ÁÞ⟆mj¡øõ¼C/¡)Ã] „wÀÅ æÕ̱ÅQS>ÙŽÀW",7ÅCåÀ¹`WÓëú,çSú‡úÚ[+‹Ò|Óx˜Í¢C`ùÊ9Ár¼â�À´›˜ µ�Ú¸4cGŠôö€X¨ÕÁ *,ËE1#ŒùéSß:<Ó¡ŒÌ¢µ–ó …{ØR~+š–º‹Ma�#G«óëèXl�_³}6ÁÚÛñ¼í…ùcÉß8)['Ö×Û48Ç�Õ𘼦ßAÍȯ€}ˇÞN­¹ºiå1Π•n+èôœwƒÚtÊæ3¨@çÌ3e¹ ¬‡2ŒÙ*E§ƒO7W¦3Ä#)ù\ɧ^e•ð�ñÑÿ$ ~3_ðõu©kû«Ÿ䯿�tª�®ðÄ-ÈoV6{¼ó™Ñd¥L ùIVmÂ;ë?9­ÈBÇAtД 犧Ì3pI+nf·4Ï:1ÛÀ%ð@­Tdhh‡ïÈÅW°4©s´9CaÊz®ñÀQ"�µ¥R+� >Áâœr¶óyŸ“[+c½t˜´m9Ú4ÚÕä.6|-âw�pu+Þw7œi¦ã%ĵ™ì‚íO0sf5ÖNÔ¸›6𽀡w"E¦ô€N[m·Èß`"í+œ\êÏ›øŽ€q àZ¦G5ÛMà�TMÍ›@œ3w'Ÿ==&[”CïÃÝÄíø»½³ÁKa¯ [¢äw)$XĬ ä\0š­è¿Á èÙ~|áaÈ%c¢ê(0ß'ãž;·Î9—¯¬k؃wYæ]BL™î€¤Qv�áøñeDÀðŒs@±Ê8dcd$O¥Ž´Áo˜Íw�½yj >­*Ñ�”=do Ö“XtZVQe™½¦[¼\Á¡<¢¦ K�¢@䂼L dލwÜøx›G%D•éË·Z`c¤&slìéckžgyZÎŶ9àÉh’ˆ²Qï›õy6÷ÅØÚuM O„eiÛ9€À‡ºâH ¹Ú'¡–Ú§pU"| æã @× ïÅðAÛüÛ^ <ÉsÆrÎX&ŒÉŒujF{±ÀÞÒÄT™+ñÂï~¥ñºÆŸ³…F%Ù—æv=/�£¤ ©ÛqAczL#šé¯q&èzªåmôØw3€úØiœuËÚ ü·^l-ëüÎR‰eÞ°ßJÔh!IaÛÄhlßIéÛ¶Dá\ã9�¶g �ØäÊþ<Ó�SzÛŠNcl6;q$„×Ïç-xE²ÙǧiË@ H©]ANøZÄI”ÕÝl£È‚ ""aí͈6#4s†÷“™ŠNx�Ýö¯÷`oĘLZéàK:Ö¥|öæÆ\•‹ÞÑ*;­_8D‘Š'"*Â�Vü¾R²@ÑìØ&œ6HïéhówTÞ¤Û»ðì�2¿Ýµ‘� ~Ç‹wa‚¶¿×î½LÛ¦›DHña ©�tÖ½‡FŸçJX�Aïø“ÞŒ}w3æzì29®y© "böz6G®>¬!ž¼B%¾à†�#í8Êþ�§Þ)fmêÝÕ¦#r^?®Eœ·ïÿZµØ7’gO`‹÷î¹Ä^0X,”ÐÄ \ RÓ³[Ä7ÔD§lʸI„+ ‚¿ô�€`DÐ ìât^µe»‹gëë#éö€‘ÃÇ$³6ä‡�[¿eï ?öY ›è÷²ëž¢V8ÑM¯¤(É…Ä#‡³§xîk qM횪À0Bb•ÝÛ‹H„+#ŽáCgO´ókr·ªìVù%}§o�qëÌX…‡G5¶ZܹŽy¡†3.ÇlVv  ‚Åœ²PŠ„S2R6 KGJ^ÖÁI0×�aÚY.H¤�¶d“ì±é„Ü­Cƒ™—ªâ™ NöŠU‚ù´Z±ÉOÆüð»·‡Úœ`¸Wè*BV*Áÿ»†þ+hOrcö¬iA˃�íü‰`¤!&ê®Ë8¥YùYwçûKxV0jßXÀŠ gc_”Á+ý2ë$S÷¸É à+p·í¿Å’ë˜êÍjåA1÷}µ©žÇ„H;¨T4QjwÁÑWïÒÀË"4Iø+µîäÐŽÙ–ŠÍÆk ü­±}„á¯öÙïàD§¥\œ£s�‰ØÓ·yU<ÎF^ÜË\ñ¡•öת!§…²ª…Aç^÷OÑ k>Ö&ÃH‚Û÷ >1î›Sw›]F€1�ä5œ#Xˆ¤!øh{cA6àF‘Ûs7`ð%\›‰§ ]ù¦wð 2ªD8GUÆb!ÕèÅ!¿¿—~޾=¨§ƒÓ4�û«ó:~/p¢é±†þJ7c§a¿±Ôk¦÷JÀ '7X™´2—6¯Ä„vް ‰dÁ°øóô²ÛÕ!ÿ@5W.·oB9Ÿäà@…ÐÕ^5¯àÏ6žƒâhà –ôÒK$F¼JÊËYà(ÂØ+\Æ×WxÙ‚¼ucœ\E&¸Z= fØÌ7�Þ9ßyô6äíéñ-ìíÂF­-i_¦ hýša#¸Õ?qݘÂÕÄ(M6 ¢Þ¯ìùñø>6�‡óÂîJÝ!Q †& †¿‹ßÞO~�>q¿l�zÚyM;ú_¬À¬°?r­·ùbòµøi‹ø¢3[[„²¶×´kü,´ÕôWÑyËß]b­€ ¶¤(ú#.*ìo‘‰–Ü,›¼É‡E%N+—‰¿ñ°ÎYMXùbšôÄ)Œ£¦�¡�T¿ï°ÞöÅi‘}·& æcs^š*=­u äí`¸z0ÉÃR£Œä¼Ó½ñì!ý@‹KrÓõ‚ Ñš¾ò_•e¤~ñü¹>€«Ýr·0ÂP; 7Õ�AÛݱáÛ{cú9¾w—³?Î70†ÖìǴП7Ó·]��½NªGhÏAF m¶Æ×.­Ö4{KP25™LÂM E%(½ŸµûW¢mQ¶c�f®Þpnµ¥”©¶�+`uÂ�±·ñÚ0×lyÏÎCl¯ÿså6]6`HéâGŒ©%÷0Öàf›ÊæÃ'P.Ä O™ÛÊûtLyWOôöýð3=¬ˆj�Å¥Ò|£œ³OWuVB�½‰srö“)íkIiŽæpÞשB7Û©õKÂ>‘+wç¥×*O(áùïåtx’+¢}‰³¡�ƒmÕ¼èG·g3Çœ. Áçv$¨a±ãœN)ù™¡ƒ,lŽ•ÁŒ,SD¦®åÜæëî‹ÄÓÒ½;·ÜšÿÌPVI”Öèh‰A«ß×€ä¿üÿÿüWß¾ø07ÇÍ4ª”‚¨Dˆ`2$R¥*¤€ƒT ‘kÑ |ð,<pïNE´V�¤»<v‚ò÷³Î©@ÑÀ'§ ¢—€ €ê¸µG z Íà4½÷^ëàà ×ÀC­Ñw¤ðP>�÷�8åôô» ð'Ë”†Re°€šš´ @ h(­Ø´½}pym£`”¥)³H ZBXf²4Š[ƒF€©P ­‚�T{·hШ Z-TªUU[(4­h-ŠÕÀÐÚµ5ª¶01M›i@;5º´¦€µ3"¤4 )@­5j£Û€èa¶5M° *V…4 ”ÖmTm‚ÚØô;—Û€í­†¨1()¡@TÙ€ZU5 2´bVØd*J ±+l�FÛNúå¼ãÌ32ZÆ´¤B�ˬ¶ˆ6͘Q{ƒW)µ¨)l@PHÄ1ØPÐf½›ŠÕ ‘Ål 6[…ª,};°Õ°-  *€$Œ©F±Ö$–™-«lS2�Vª´4P4H¢€Ð Ú¯›�èôÀ“TP4 i@[5lÐÉ66оç%àaé¥s5´ÑDÖB¶À‚…&‘DÔ˜’R$L�6� ž*Dši!6$hÚ€4Iê’¡Mi“ÈŒšh4”�‚4˜ FL‰4"Ј¢POý_âÿׯùeìpÿ¾9_ßÿ~8eË»YüÿmËveË“ÑÖ…QRŽ—Š”pi•cŒP€6>ÇÜ>P·eê]§]äà µ+½«Ñ¹ëѺï]í!¥Îw.ÝÍÞ�ìJmÓÝËa¹«½Þöå4­Í{Þïsk’uí;®®×ní‰ ȱ4bn€wMvJ{·žÌ›& É‹ºdè$3%2ÞzYí®rí¹Ê–GºëŽ.uîÞó§ºê)®vó]îé¼ä™×F÷zñžš]Ýí^Ó.½yºíºóy�w*Ý.FëJS9ÊeD n\MÍ{Õ=¦êïnõÚ[·“Þ¯mÚ½Ö½{ÞºÝïkÛÎT×;k—uÖ×›w·Y»Ýžµêñ]yW(.›¯S›s{Ø»wg\šçž™£°‚/wa®ëtÒl̹ Ûw5ÚÞkÍEêå8÷¶ô¤z¸ÆÓ1îºç•{»Oy.õWöîmžÝå½5ï6zõÓ[½Ž\®ã»»²e9¼á+½î½t×zwÝíê»®÷»y^½ÕλÓÍ\¹·i ·MÜÝçuï^“¸½)ÞÒõº®mÓ�²\æ[¨»¤Mré.»k³{µå{RÀ›K…—Onöºëu©®v)æº÷ºë·½¦xÉדÚìΞ¼ï5½›¯{^®OVë%9® J'»Í^¥¼Û�=èÞ˺åÞå—]zîòèæž÷w®¥½#^öéìíy½Î©×váºîé©'7³½r�·.«•×·ow¯.;¼.IçY=Þ’d )äPf7®º•ÚÝ:écJçS¥ÌL`ˆöõ³Þó/;mÞ»ÝÕÞí]ëÞ�\ñÞ÷^WweÛ´Ü«—wMuÓ´ë§·jæ¼³·«¯iîN½žM®—oS¯{Õïok:ïwd€P%Ò»t=íÛ®óÑW®íy²î»®¦ZNY,\zXiºòn½ÕtÒõëÛÒú§{Û¥weº{»³«Ú½Þ»œì½—eÑÜÝáu¼ºðï:÷lË—]Ó—.»¥w'Ww®—Væ^íïocÅs$½t¯Jd9—W\­�nw™:2òò÷»](¥rîçW½]yg]]Öé7{‹Óeéw–¹Ó³j¹½í]kšé+•ïv÷\õÚòè˜öº^õÔ\ÐI»$¤ÙinSÛÚïyNõã&éNºÉW.÷ºž·»®•íîܵæ·"ƹW{µvö÷[Ýs´™¸êàní†$Ónæí;¹çsnT'œfæóx÷]{­\ôÜsuï{¼êô¤Í½o;^7híÛ�»tL…—2TÑ‚¤ºŽyç©»®C%�×`E%ví5Îî¢*d†�×w®»/^cËÄ1„’9t�Ý.î!ÝØLo=yݧ*:�Ûu6{F1M[Øì=¼®ì›]çig”]xpÂW”n…v§½{ì.»Aus=½Ë¥tÑÝsL/v]êõ„2¯t% M½Ü\åÜó®ºã=:íëµÚkݽǯo{­ÀÒ)˜uë:âl‡%×FUî¼õKGµî­å¹N‹¦Š'¼õz®�{Öé—u]­rmÈ®íu•ךò½¹±g¯^4uw8‡tsÝ^×7suÈ=oUÊHªWw.ê»:›yu{hí—J÷»=]å»mÝ�]¼.ÞwµÕ¸ÐH³Û¥Ñs×Wr½×‰w]wkÔîÒåÜɶ™'<Ý/Si·:`4RK¥îº½wiuÕÊõâæó·®®âíw®¨­Û¨Ý·O0ik¦•ÌJéµÙ¼½-Î@X*õ-×i�ŽÝE‚¯6껯!æëzXˆÏníÒZ;µ[Õ{E(öóKØ.•»×mâ&X^î7WmÆÍâmÝërÔ]­Þº]{Öõí{¨Ö7]‘‚KuyŠõáªëÉR(jñÖëË��{uíãÒ®õÒÜ.µ%¯^½{.mÝÑSÙíŒ×­Öî�Š»Ê½ì†á LHÆbš ²XÝ΢×gZaîܹõ6®WeuÛ¦n=Õ×{uz÷«›2ì1€Hvîî�v0i¯"]¹�;A•ݹsUëÓSsg¸÷»º»ÂôÝåΧoW®÷Tí̭ˬníÔ¢b#F«Ý7nõêó·vê.·©w•âön¼Ôö—y®õyê ¹ïN»rÜ®÷\]ºîï{u’Å=®ï]ì¹ÖoM©{«×ºêïz{Ïnë·.ew^”ž×˜·¹{I±íš3z�¶5“X®/L÷½­Íå&‰.•Å·.åÞP¦S¤¦ítÎåÙ½Õíî÷X×Sz`®S]·Wºìöì©îwH»®4½îº—…w[§¥u¹u®öíw»]]ÅëÝ»Úìy¯+ÞÜ–å®§»×¯véºhÝš÷u{k·ueÝ]×»^ØSf)qÜ¡–õÚëݧu¹YÇ›ÍÜuI·»Î½™îºõÜéÞW›+»–÷sÑÜmrïuÕ×m‰·uïn¼Ú-ÔäYÛ«—¯WFÅš÷[¦$-æ×¦Ïvîwž±¼ÛÕ{;®=ç¯SuíÝì“¶óM;�£§—[ݺôÜ»Ï{y®ç´õæÞ¹Û•ÏwE¯wMïzåï7mî÷¶íÜn»�®±¬¡L©ïz6ï]·§9I�1»Ò]t÷l9n“\Å®ÔLÞ÷YÝ]{¨�ëÛÊÝ�®\¤Š÷^ïZ÷�º�¼æ-ÍËÝ�s J7ººë®¹vé]6R»�¬mîÝo´–ó˜5�sÝzX¹¹^î �é®Úñuyéšzn²*Eå\”«»uy¼²fRî½Ñ£Z–…,ª’©’QM”¤d”SbýÒ¥VêR1*Ur’Š4•U‚ªK"¨¯æ©bH#RQM)HÀ¨L‰$ž2QOá t•*± iJAI %×_ÿ¿ûñ{K§ÿµi«£Ÿh´ÚìŠ;E¥]ýÿ I x�jZGÐUÖ±›ÃgM®gÏêÕ��Y²A÷þ7åÕ@Ž[“ðص�ŸµÕ‚°Ž¹ÿÂ%Ï©‰³ÿ¯¦>®Ã‡¿Ÿôr‡ŸTäž¡ÿ®¡®Äx™˜F-âŽØ0É’§ÿË#nƒŠbtwkH^²ÈT‚Ù⺙¸ æ�8\ºíÈâ�9Œ³{͇C4,^×wgîñzGR{W9´9O_«òBS;E&ÿà“I!x�Gä7:k´ 2`jkþOø¹ªt›Q²§ÒìáŒÆ2ˆØ ]ºµÍcLÿö~b.¶f»ü�Þç4²ãôêøÄ¢Rº™M™|MMòÎE0»¸ÕÁ“FxÂX>!t®>îÁAB’Y^ßôÆUKÙÕ3©äB®HÉs“óMê&Ûšþá;ûf~z¢éÉÍlfPu)b~�%ä×VlâÓ{(ºœ&ÌÂP�sàœIŒùÖSº±º�-yB݆û‘ûëR– g7X»RÒ Þ´é+N:ŒÎo )˜¨Û<ÿ/åBŽY^j¦25aüRÙŸ¯•Cö?x‡ÙûWÚxUM³3™õ,Ä� ­_×ë⺙ÿ-8’th9tƒNè®D>+6¥…Ë2!6PhÒ+Ž4Ü0Áù1ô«UWòa~øøýpØÍÇØÿk"ïåó� ^˜Ù' õ¿„/â•÷S16ÑJa�ù=YiaEJœ!epOªaÛIç”6:“Õ ¢œ\† lñ]¨*s8“êƒ Í‘D×Q1‰4Ùßc”)9��˜bcÃ�´ÜŽ üÍ‘š:½X‡L9ùÐ9=´f‡FaŠì:Bê õ�ÅiÜ$“\Ñ2§J|hôN¨…š×Oø/!z±¡ez�î¨û黣óžØ] &êä&[Ï4NHní§¬µÄšú˜žèψ¨àÐoIsø0CMeŒ‰‡úûÚñUót’êûöùŠm¹ÓݪWƒC‘î$ øÎ"æä†FpššwÛR}L“‡JmB¢Ñ$é4ìöT�K’•¹™Pà�Ð�zkÅrÁÀ}YY]ÑE 0Þ0ª2l•ƒ²N—l#WcæÕÙÌ‹�bë¢})iS'HÑ3r|̪úŒ³ê¿¬7QjW#øC¿ þÇõôèl·žÆ¯è…"_W”[¡ 7IW°ŽÃ/j£…»Û•¸¿zóUφ{P¯£ô})×ÃPƙɰ�Ø5ÀT¤CSŠ0ø6%Z”�˜â&•‰"$æÑ© ×½pˆ�9A’ ±µ60Œ÷º…€Æ¢ê¸6¯�"1¡Ý'M2F ©è`Sj2†ùÁ("$Fs¼L;;z–`�¾hRž¦B(ÏÊrašlPjgg]lÔ¯þùÊŠ §ç�œ(£ÒpØS@¨iQ†b@E�£– &K• Mœ˜AƒbH0`I©)‘¸Blª1Ýó'g}J,Òu#izéwÝô$ŠøÓµŽ_Û“•EËÖY˜Òޤࣈ陗2tœÚ¶ ÜV“-GÊ:Ê‚œÀÑ’¡¨bÙ½> Ç—$DDu]cd÷& ÏCŠÐL÷� ãDž¹‰ÿmÅÒ1eRÊQÓVr…~#0`PKÇDÉ«Ú®Š´V0ÈÝf‚R4?¯-êNåmsù2Ìœ¨L‚þéë%Ä"+‘Ï"W×òn‘Á°D$A]’™™“ª:6?—å±Ëð…ÈdGò®¿™Æñ×L½QMÈh‘™Í"¥bÇ«cN¶·ÁÐŽóeS O– êw^¦3½MºÖ—¤D×ý‰¯µOþëùýüK�Òý¶ÏíüÞŽÕ©4 Âßúá¨nù§?×Ò±Õkr=±¼OwEoŒlõ-W;½ôã}bŽõj+6Lq…C¶#ÞPn< oHp^£½|igP�Ã_ž*û­®@XÍú±NÊͼ¸Ö©±�ÖÐf`œÝ·qp¥&Ġǯ¹Õ*qY®¡U6©SгA¼¼h[Á)í׸Öhê¹âœg«ÑbÖd1£›y~²¬~Ö*ôzé^^•DŸUN͵âD!Áʬ²,¹¹Äß–çíná8Ý&Ú=)X©£U#~»Ý‚÷ ¡fû¸$%.7ƒ˜˜øbré¶!mæx/ÛÏ8Š­Ñ…Ê»[Ž øü~ÿ„ò#ú´­§áýcÿg÷]£þ @ý9üïëî¶Ð©- >K*ä¢b¸™.Ã7?�W¥X†ÄÐF´u Ðåš’ݽ»ÔÌ•¿(|"Ï^ÿ¶¼.ôÙ‘©•)ÿ¾ÐPwÌRn;ØY¯þq‡9#xÿ³Šc Hy+!)Pº"/¤û3{$µ]!(²ð´�zE)!ÐGäO-YöôëýSv_(ˆ]• 5Så†Èü!“Kñ"PUKÕæïâº0"|Šü'Šãrí¢ˆ‘/´� CýÅ‘âjþŒµ`0�vÔ02ü’ ASÅKÇåÁ3š…šF‹0¥m2?(Ð$#—L¾Ÿ ™%Eœ'òzèZüUPþC¿~d›¤OâŵiÊtîX•õJª˜ó³Î‰ßáû�e±Ña±‹ök9|ÑHÑ0u¯²>ßϦþetmê’ ërG;׊©5t42e@dÂ%îÁˆŒå¶üÛâ”®ü}}ß¶�>,÷ìqJ²Û[¤Eõ\`SK€U6J:ñHŒ0†Ò¶þíOÒ¦‚ŸRwé!}õÆ0E‚¢÷P^þL\ÄýtÒæ6}HÜ„)ƬCð~Ì?:ÛE#dϳ$r§�/ŸÒPDÕX¦d˜ãF¡¦š´ÖÙ\‚Ù'* ¬™;•ÊÊ:FDðéÏ©³åj£t0Ã-iÕªB¡Æ‡dXQ NFð�FdžTŒ*à×SX€¤ä ¬èFE”•e?ÿ4ßÍ0Õÿ:{]‰&Á .\û¨"‰Q+XÓ`ßT˜Y[/WàØ4GÖUFÿtË+éhȘC©‡vÈ?òb­~nÏÜâ¾ ·0ntB�Ìj Þdƒ}"Ë´µ_ý¶›I|©J–(È¿¹ts0"“m?$Û ኑ4|‚¹¡`™ÉŸÎöáA!L.ÕU~ëeHr©GõIXz‘\¡°øÜ³ð¡sGLgñ�;8éè�ZTAüŒNV èe¼°@yH'¹ÆçÑÿ)9¹ì”�”)cÉW850ƒyº>ŒÃ€ç² †‘H‘�é½Ë½Ý?�=VS)À^CgGÑ�ÏDœ(N×ê$‹÷ÈÀ–PøôàGòà»5D£xÙ¦ øáƒEÒ[…¶¨(œô’'¿‰tbäXT@�©q³ƒ7F-–i ½«º®]d´PJAR¥lÅfµ­Ä˯àR]S�"h °ApéÂtfgfªÒ¼sÁ·:{Fá.¤"ek»Ì2•Íi[w Zm�—¬õÄL8´lç‚?hÜ)ƒ+žÑJÂVU¾Ä�½i™ ZdaÙ>‘+ÉdºM¾F‹x²tÖY,B h¸Çjd54ë.qîðý('%rÇU‹füÛYtuDÄjo LbŽÚõ•¹ô6>ùÛî%ûE `�âOĨÎvõÏXÜ©qoéú¸L7»¢€�£6 ½iˆ¬fþù×öF ™ `Øl´R( ü~>¶°$ŽSá°Î”V)ºk8iy€kÆ5ÑÄ�¶Žë`ÔQ¯§¶¤…š}p×UÉø¶¡Kõ Qi( ´ýê´ŸÆùÂeoJ%È}åN1%µ“¿?Õ“¬†I¦x6"enj[�! Ü€’^mÕ*.¯ƒ 2˜N²ƒ6@ úŠZÉFHp·Æ�x#²Ž�·Ýg˜7ƒ63Ù~nùê8$�òågeS¸sN�ÉvlHAö~!$5%#Úh*)¡AHÆÉ–•A–[W]2X±Ç’ ƒ.‘“bèÌLÆDÙM–.g"K-¸8&'Žæîns¢:§{‡m<I!XÈ0†¤erW;gŠ«¡9Ë]\:ª­~¸Ñ>(œÎ°Ä4�`Á�_pË,p©yȲØE<#Mq5™G'Ä€€®ÈFl·FUSP—õÔ91ïõ/^èÇãBrsÓÊm½¢Hо4)£pN§=Ľ? ŠômF`¶fŒ¬±¤ …š.¨Ã]B¦iY›‚©rzޱÑ ¦aGµ¤ÿð”�"ÖBTvf+¼ÖÁÊ£[ þRŸš­”‰–¿S9vSµXË}ñ¼‹“A†üxèPJPRªN€‘„d#¼ªjÔõ'>c©C»±Œ¥Ît�O|¾»oW®$ÈOr“¥·Öœý�›Ä©÷{uTC÷É ¥|2®¿oÏO¾Yói“/˜¢à·¶u\îðÍDøÑª™ |K88€„%Ì *r%®W¸­ªPg•¹1)BbMZ‰CB¬º½š¢ å’PØv$6DÆÿ•Cá²MD&).Q_KËYÌ‚O$…�¿;?iõõn 7ò !ðἸˆÄÂ&`’ñ¬—V ¤(}=™B� ö2¬&;ýèa¡ñ"OˆI_ Ác˜÷ëóߟÏÏ{}bRGâ÷z¯·yÝ»� ùѰР˜~˜ êó$øüÔÅ40Š•ïân(,£û“H2Iâ+Ò$AKÈGbõׇÌþüõJ$µä+ÆÐ@¦Ý"m´Ý�Ù R)b�[™#5“éöýýßáþgûýŒ±)îkñØo¸­…Mæq1Cs-UÉÕxgn êpå#ä:¯VèÃRx‡Yc+Š®¹Ö‰=“ƒf§É;X.Åë“3Å�¾à(+½zô›/:/J°ŽeXoÚ†9’á¡�ù/pÍ·4n(ugK œ{ÕáBÄ|¦ß7ÁX¾W}ÜŠàRÌž(XHE„¨æ,`ôp‹š�3{|LW:¾ïfééŒk»(óÌ^÷8úO+â×WÞþ"Àï>ŸeqXÅ—½Æv²Ï�"!µa¥’ÈF™uÅz“Y ß.÷gtK·¾€¯s¼lžŽn¥˜›ÕÈÆ÷Œ›pF[~5$ák‡Wð(%ًΛôbLå ùµ;!ño^Š6†E¦ÚÒÔkÆ…}˜”7l$ã\šzC_ó:@º¯®Eœå‚×HÈ0Åq³_W�+ÿÆfÍ;HiÏÏ£o%`üsK”—n82t(qåÓ}+Ø¿£ëÝ�ÌV æK&UÐc]EμÔÛº—H4«Ð^¿&7L#ŒÏæ§ÂQ`˜ŒîŒR}EQãÊ21!šñ¬ÔLD„ûNK8i`ÛÕ'YW…U¢4[IÍlRòþI-øœ·X~eî<ÔMŽ¥¯™©á˜Ægí±Lý çb~"’A*0h33ÍöG"šAyÉ á—«Œäg§—–9Cä&5›îñD˜5;÷/©œüšs ô¢—X9:êùs@EÂÑh'ðäIÈUÉxU¹TÅ‚’Á³™cF÷8ª¯�ù¯Í�¿ñ#pÍcÚœnt¥¯É ¤‰¾Q}åàö8ŸÏ7àšÄœEÆ…Ð-ê$»Oûgê¡mï¼Mô|š¹¼aX ±!4C0"+•#…UY§íïº)iò²’ôŽ ŠˆfçEåÏŽ’&3‹¢4õ[)bpz£®ªó„\s?>ïµô¿ŸŠáµÿ^Œj¹ç³Úÿ~ØÊÍ}�†–{+[­ºw®³µ›ƒˆBðÕ„*_¯E.Ÿ³Ê nV DyFÖogwŒ;´‡mß\ÓZò†÷®.CE^µL_¶<œ$Þ£f` n�}bÝA˜¬KÜgl ác�#y©ĬwÜ,Õž=¶4èÌìÀÞ7“tK×ÑÕ mQ´Y;6-uS*Œêeuˆ%X…r¬g-»á £‚„–Ö ¢‹‹�£ÜGÐp‹µ¶)š­©v[[O·K•—s,‚îy.vp!zªÆ†h¥µ}Þ9EX­ÇÁã…tx^œÜ´ÌY[ÇÙ]ìÁÐ�Bé#êwÞÞÚX36˜be�dçeLfvÇ‚ko qw^}‹r”Å4½®¦°E¼Ãï&.Ø“wp‘´lœëå{…Ú3LÞxéÝÝ !ØzÁ¢-÷!vº¨()!�ÈøÛì³t’Zñɹyè8oÚ}6ðPGbÆ9åšÉ{zÖpœ]úýUwfèqœ)¦³OVuHXH’)£Å=•Š:M竎[t®wßbË4ïÔsASKœœÕ}yã¯×HÏX4{,l—| ÓµˆÜݺ(Öb¾\7+^í*¼ëLZB¯1vL{TºWÆÇcà¸híÆ!;²ÞTeX¼UÞ°)^ÔC=¢¶´SвÕHISnÌ[šðf<>®£�º )µÛÙ'\x•»^«ÐsÏ'EÆm1›}( •–®…¥±ûoKÛ­�ˆ¨6ék ä7YB[Í(0PË qŒÚ¹6öï¼ë.evÍZCE¸÷k(ôX ⓺�›»Mv�jµ¯Jvù÷VsæÎ,šVÖ5,^3c£àˇj™àó5&Õùa´ª ÅÖŽ=KÄØ¯<’w2”®¤8²rª€{“¨YÈîÈa„&­s5]ßYÙ4‡P_±¸ ìGÖ¦¾õÖ„ š[– bJàì‘ôÿs“³Îbò½›ñõÚê*\*Ö@nöw:l#~ÕµöF#)E‰¢Y4Q�Ìf"‰DÁ*fŒdÆK(„à aLÍ$”Ù16DÁI!Š0(ÌI�`Ê4VRˆ€´(Ì•™•‹)¦)1F�ˆa€�(²%!1)DË(ÀQš„±¨˜#–BR‰ƒ&‰�‚LLD’f°d Â"Q¶¶µ˜Æf*M2a)(I"3 (c¨¦k‰J-F�£L)šh¤–Qb±4!Æ,U$S$Ã!h„ÄC13bHÚMeQ(¨!) Xc `Q…F%!DÙ"(D£idX@1l¢H¨ŠVbh10J ‰,Å‘b„jDÅ*aˆ“*2$“$ �(aBˆ¢†DÂJTC Š,©†�’†E¤‰´Å†bF,‘�ƒAfa˜™�–Cbˆi1b)4šf„FjB€1¥ŒH�Äh¤±’ 3mŒ ‹ Æ&HÌÐE)Dd†4Á¥Œ"CDÈ%Y%$€ ˜’–¬‰’S ¬•EFM™°Œ”Ó1,Q%Q`˜#†iF”Ld‚Ò5 ‘“e¦‰D"lÍ‹J&£¦’™ ScYM‚ DP›Ø’a ‰L•$¡› ÀÊ!@ € ’ ˜H¤Å2$*X’4f@…MˆÍ"a™¨’“QC#e2¢de1%MRšI¦6Â%(¡–Å‘M™H¡3M*³hf‰µ! d†²@&È ’’%A²1hdV2Dˆ‚ƒˆš%2Á’ba°b5,Í(¥‘•�#š2&DÄ�†33,Å`¥IJ" I X`J)¡£PŒ†1‘1@’R˜HÑ$Rji!K6(£R!¢Q4A�Í“E‰ˆÂAš4ÆdE"!˜Â$Qd “4†™¢Y ¢™‘ff@h ©¢&CfÌ3Qˆf‘óñ÷ü\zV Ì–#Ø ¬fF«F†© 1^U‹7Ü@6÷2LéKw¦¯q®X�c]Tìõˆ¡tÀ/•é?J«Ê±%*�‰Ì(»ä¯P"n–m¼ËKxÛ½^õÓ|*v�^îfûEÀD¦– [^KÑ™çhžì"_—u­§–o)”‰�·Cœìë/Ÿ]¬ÁÀž ‡·-fíÞKĉ®u´GH¬•\Bí881¢½¥ Úœ3žlªPM‹IÊÝÓëæ¯5«®ÞQn#ËØï{J“»¬zè’Š¬™3ºáºëª2†z V*×eg¶û&[Ñ=Îr®ÕC©ò²»6øÒ›ÈÓÇn2«uUM=ì]Ýy|-×vÚÉVýjÐ/41v…≠ÎWo]U{j› ‰VÊn»Tèt>°é«í½éGºÕ Ö¥» àžŸpÖ„Â{•ò%ºÌì¥×�]Ù]{ËŒª€! ÂXàa-½�c{sðCˆU@¶UÕk4c{»r›¡¹�4ã ‰¸^î×QÓ:\GN,à=ƒ«]Tó‚>tÃÊÀ)÷™T8ÝdÑÍ·ymz�(+FèdçWÌé{¨?§ÇÁNÇ…Šøª"}‚¦÷Z±¬ËI(_Sæ.Ä¿.b÷.’;:«{&1ðÔ �¬`9dö¤†õM`ºuˆbcUöó/MöGGA6HèÜò÷x‡½NãB­tœ.¦õËBN„4£¾{Îó¢Þë¡c†9u fzä]‚› ÝvN>¿j�1SeÑÏpá£éÜ(2ún|¥·åIf—ë-åL5_Û•á7š9l|7—‚[b¶½# î„r`Þ5½Éreçè—Õ¦ ¾ åôõÖÊ®‘9%X}w½ÖÇW«`¨//Ü6#ñdcwAueè}çW›Ýƒ·q½¸Œ¹t­ÊŒ8€nŒ9åWU•R¤· aÑ´7Ës*jsp¬¥ÕG+¤õK(h¬}kŒº¤YBqÌÞ¢»hpSϨ.íÅz£�žxÅ‹ºà&yÝ‚Á°ŠùZf`ס•¤ÅÃ+Bê¬áµ—†ýÝx{}ƒ³¬©5ß@�USl%–D­wl¶Þ^êÉw5m x:MW­ÎÆEÌÅ õ;‹){sWVÖy6ÉÊs`²æt£·ªŠc†àÓ ØÒ‘"Þ½w¦p n`&øC¹ÒŽ+¯X±ƒ–zŸ #—jr4ßQ$nû^ £ˆÔ„„íÁ^$„¶+Ãp,Ì•Ý/(p̹E‘ÞÌ<*16ÎfÜÐàª]Úp¡�;«:Ås¡»¼£•9Ûæ´<7ÙN^¨©n…½¼™V`­åƒ¯Yê' ½È\Ô–Ö½C§\©`Žp×7�F�¤W {ÊVf¢è“`‚ Äè,Ñ&µKÈÒ$#¨1»ªa}è5™wÂ'Vø,}¢÷~b©šJ¤óˆÎíêΤ�“¹Ï�l^ÚdFuÆÕpuaw0mUW§Ì»åÜ/ Ä5Y»°X}G;­uD6»suÕ× êÑfŒâ+DÜìËÜ*oXcp<Ëy{]½u�RŒ/Q¼î},ÊšögL°¸úîöeJà”C¹«:|GuRwËkPKpZ ­Ü#i'E¶;[½Û &[Ç&×sꪾ©B4k4õ.rqô×,å•PŽ—5!šE)C¡p@ˆ;¹(J¼í„Øfßsã�t›XL�CºÅÅX.šÜÃB­-®V\ÅÂõ |ïÛÚÚ¾­õXÆ|û‡`ßUokX mêÍàzƒb*¾ž…öv��æBÄ€‹«;œÁ— û¯;mdNrrmã;N=”k§u#¯Nû6f YÄîÌÌzø�k}W%³–hÕÐÍà«\ÝGdÙâ¯#=|îå ÀŽJ–ðBÀTvªÝCc©o5óš°ƒ�5DŒ%¶‹O "´Jк‘d*¹xna2¡å¬1RÛ ½hLÛ|"c¤Ýz¶Îqt’¾}2YO:n·Ú*ä¾8+�=rÁ8‘Ì©±[…j®´Êî)N±béJÞh• w‘ö;»jÚËmœtv)cJ¯nìv�€±Úºòó4mtfR³�BeK˜ËÞº^·¢†ËbÛ¤ê�)ØðP _IŽw÷nk `ËÂ4 ІõdF½¾b-¹\{Öë8º¾î­+žôX|Uæ¦Cy° >®à§��+X#�­" \+8f¤tLB{¼�ïi33Žß ¿9n°V÷гéeö^–ãé'´Ð»í< Ýb tUC º¬]€äʈq¤N‹JÄðï9™;,¯­<Ñ™s´Œ¡ÉÚ¡Zæ‹çV.5}žurϺ“ÐÂ�e\Ïnë%**ÁÛÒÇ7 Ö3OqFÇ#o7†ôóÌdÃ[g°Çîö¼¢ÚáÙ¬€…?=á¨ó*üÄ`‘¾ÀëÛ7^ž42¡»FhÝdzjêëeÕiÍ¿eS{{FÃÑVú —‹1Œ)êÍQæSÕ×0h´]÷»mèÅYŒo¨f –é E^`*º—m÷g-:7TÞà©ægvNedÖ%äAÊjŸ<Äl`ƒ³Z³°¦ñ`çƒ\Ç’GÓœOe×K¼Ê–/¬Üɶù9Η:×Xì#W¡æT�Ùg$÷P}®f ¥Ö³mWùåm;¢4Ž'©ðVÄ7Ø��Icá�cð�h]kPÊå¡ fõð�Ø-ö/A«=]9ÐJaP7R¯è±t+jUeÝ©IÜÆ …`Á›™{*j3‹¤&a>‹p:†¹z£§VŽÝ²h‹Ý#évIÚ|…Ë«Æ,WÔKÑK�½Ã¡˜‰{c2iè¬]g# xÛÆHëÓØMáÛ·t1ï¥ú)Uyè}µ™´·zxƒîßUs9Ô^]g„ÎÎÞ*{êÍrŸ$:õ‘ØÍ5—¢SÌ¿XU5�œòò|5‚�Â»Ä¯Š­“©^ ù3lš.|’°‘U¹ÕÆùú�ç–hÅÒŠ0Hë®±ÊFêY8¡Þ½Sršì¦W²ÏƒìŠ¡ Cñ>±¶(ݦ±>Ç=e#¶vìV_¹ÐuF�)çV¡×» gi‹ÆúEŽ˜”¯¨7š ÉžE¥ºê’{»×íÕÞËô&Þ ÐïÇ&o`»¿!¹€]^ÎÊEXʦö…B²ž`¼½¸ïE^ Û¯dvì&Ò¶øbÛ”ÎN&â…vI 5jÚ“ÔFÕ‡°3Îg\¯VúªžP–šõTÑ`\1Ç–©/h«v \å!ÍcóÀ£êK/nî¶héÇââ3uØü­ù§H6Ó?,^_rovû74èÃx{…Þ^õk‘<­Ò…ŒÌ«˜w~ýïy5J’.î„¢˜¥#‚Dyðá–Ý›N1…ÝRc™¦KgŒÅ èHÇ–“¢� ývÎ×GŠu¨«›ÿò{tþþÿ÷»¤b&6:ݵìÓËAíËO!ÓfÝ�ÁVŠlôÍ�—¬ÿøÝúß:h«PC,ÙìqÖ1Åýóþfפ;³¦L¼§‹tÛ5;ÈÓ:ûÞûžq×¢ñÞa-Ôp~N‘ÜüZ.ƒ×pÉóeõ‚TlìTªoæ¸íMµU‚û[ Ú�†_þOܱƒ°ó½¢(pÿö @·¦ŒÛBbà5žœ¸¼½ûg†¿ÞF§ÞÎÿ&>ɱLy–5�ÓZlOŽ(Óc‡õ$uøŸñ¶TgØùŒ2}¥ìñý\ñ½Y½·ï-ò,~Íß2³‡ï_�ºq…õ飰ðójý]êâJ@=ÃÕ@íŽ:qLþ«Q>ÁóÄj›;§ N» ¦;›�l `B¾Ô,=ºeñÎïl½¡£âeDÕÁO>ùâZÚqâsé!✰¯SûõGztúÓƒýϺ±ïé öšÆÇŽÕ kPyxì”QÔÊ‘‡>i.ª“+¶{!¦ø~ù¿Mñ&kötkk×õÉ@ŽIA DË·olÞc»Æöðnxl»BŽhyú@ÁmÛèipú+ _®}v —Ñ‹l躘Ä$6QÄY"wOó¦ ½®j&<²£€oT¬õÉÁ|Cl²Ga̟ιjºy-Ž+×±ñiYõë=€yŽ*Œj@�n÷cøAJÒªôxµ;w¨Xf„Œ¹ÿÐÐþU}¯Ç»Kãmñ&ÝÚì�_›ï­Ë÷¾1"”j½^nOþ�$€FV]?ÄíO÷>KˆáÞêZT¨ckHQ-r„l!o©^«Ehwc2æ×.sØÚ-MÙïÛ›úçOóR‘¼q71ß³×Ãn{plãü‚){Ð!$ $×öÿóôXïìðR‘7┤T¾•ŽXéjZÿ«K¢1ßA×½,Û"eY6Š$m¶þcL¡%Rå„.@¢D ·¥* º2×~Ù²e�™Nc›Ç\ž©UW¨BHI-ÒVá…w‰7¨J\º3kEo¶QÙ²0°�qîÌRú"·í‘¨ÚcCñ¸­ÖŠK¡$’BÛþuÝŸ(äÚµdÒ$eÌõÁï§LŸ ýÐß쥢lr‡H†¨,(‹¡ JŠ~âA×Å ¾£œ°U†”wD J�g'.šÒhѨ3Ï’Ó�Ê8»çQ¢µˆJpäª0?`HHAÔõ¨beƒ‚ FaVªÓoC_y(Œ3ŒYIQ«°‡§Ã%iaLØ¥!Bµf�Lbn}¿Øª6ª¿-yF¦Ñ¢»¶µ^F™òë›Í˜ßœÈïd´›´SÄ[4Lûb�ýi¯d^ÿ-�ð¼%•äN:&ÌÂ$¥¸Ç°">¼©H:Æ~0fhfñ>¬ÄÿoßáO�uÒù¥ eQ*-F耡ҮìÛ@ƉB¦Ä®‹|Fê~§Ce2ºä‡ú^…Îɇ¢�$[C�D|~/y¡³¥˜êàÞeÒsJÞ…ªY¹+K}®éBã+jSH½,n²#“ƒˆ¡¹ÚÞ72«Èø¶zâÏžÓ‡5Tøh·0~¶µ~ÛÒ6–û{¨ÜþdVñŒd€Bû,P1P$4?š ¡Óû¥«FbSF_¥mö›oÏ¥~†¾–ÞÕ·uåk3ûfwI?vTåf”W{ûuõ*‚§‚Tªú¾:Ûëåå·Ÿ'>»¾¿:Ùþ½{¦ß¶‰mXH¤}òŸóÕ|{—nüñë¨øïzÏðÅnÖpÝž LŒ%3‘šÂŽ_]y‡ìú *)Õb®ñ—¹Gçßx›{ê’Ýó•Ûn!Äy«b†ŸŸ(ÏN¯j'ˆÉÌÍ2;»–îÀßÅ>ùÛÌåÑŽÐ塇Àå¾sžî㿬§.HØò„G÷~ãA¾Šhcæ;¾íæ[¾\ò[Ï·JáÒkÙŽ‡Üv`Üzíž¼ù�£ÿ„¼xíN{îQ�ú·™¸xÔs×Þãñ ¹Îão Ý�[ho; ä{Ðo©Í˜†:‡ö\Î߯¦ÀÓÝJ1sq9yNN1¿�·cD¦â2A1Ÿž`}>+q!9—NA½œáìIYVb=ÅCòüê¢ce.”Cx®ÚrÀG/d^ý‡«ÙÓšQ°u•�°ò£Å=ið~p)©‹4GÔ›8÷j¦Ü$·óhyûÀx¡îø9QóìÔ��.g­¶}æ#·ï}üg ߎèÁäx�¨ú¹’ËoQŽÖ"xAΞÔâtùætñkçüÍäiºv û jY‰¸h°ÔÉ |€­a¼È5JÒÃ+>ÕÕµ:§›z:™LÎ-Šñó1±¥àƒÀ¢Z«ÐÊ%� зJÿº~mH¡lÎ̵üù©4�,øu¶§;Óq%}:M¤Pº?4(©¥†4D8(\€×ÓÆÙ£-‰£Jâ#÷û’ϽóÒ»VÔ]f o:8 ÆÛ-H&œ%6Zr‹+Ù�€3#ªZܨxñtXOÄÚþR¥W_·ƒÁÛ31ñãv”ü*_ùGè(—çü[žëö@:óZ9_FΕïá*Cÿ–!=)¸™~#ÿÁ(§”y—l7ʶtÕ¶QÙ,ONçU}5¿æ^ÕçÎûöÚõUñ_]y›M$ŸQ³ÄB?N ðÊ@©©}q+ØÇÊðZyF©Š51W~Z¼uë?½”ÍÓ×-¡Á‰Üânl�0Ø‘€fEDªÓ™Ä}6åþ�zû ÍóíB+¡$`Ä•¤Û‡¢7I¤ ¦ÄÓ1¾ÛíUó*ë�ñ·ÆKm)v¿;ô‹R­Š¿�³V"‰"ƒHk˜AT9K ”•Ù»ñu«ã~ý·6¾©]ü«vúÖTÿ i!¿C+_íÜèâÎ8Ö·¶˜LõUzêz®k¦ã zb«=1¹MΗ`?™{AÚ¤ Õ"×àͽ¶Û¿«ø¾·ÕUóóº¢×»µ{}W{jªTô!$$–áw¯�â’«ÄAøšÔõ¢üG·æ/vkÜìI®ÌË+ž~MÏïÅ7p+¸<¤=Š’ñx5¥'ßÔ)­éH¤¼‰"(G7©5á$$ Ù,šÚÐ8(·,‚LÖQT5îô\ö<¨o àÇÝšï)j:ºû¿¬Ü5ÕW#�AØÂ«æ¨ ÐЬHˆÜ­ëÉJ)’QL¤ª¯4û]}_ÍI ñZßÛÜOäµ >ÂÌa2´²‘SBr·åä€!PzšŸOùÇÎD|¸€Öixe Mão–;!$ >#g··Ëå?êãëó§ýùùoýþÏiPøðü[o?+=uø#¡v¬žY3ùÑùqía§ôè¬ï3ç{ntÜFKqOÊoop’†Šú˜`ߎ_y;šlwòÇQÇüÿyê|ïOh°wyïE¨ÿ`¾�<¸¶|e?=xâ]�XÞZØùÞðOœ1ÏêÄ»÷� ~¹kДA£m*ì8·§+4{áÛ¿âÏ�þðìƒWTÖÔ| yXÃןÊ`¾x៳õùý,ÙÙì:Ÿ÷¡ù'Ÿ|úÏ䇆y[…[îïÞ[Ò×°£šöSõÖ1GÖn^´°hEù¶ò¸F»_™þn©ñÞCü;hLéOpÞm{Pp^=LxÇÏgÛÕù ½³;þyû€²–Á=hVP׎õEwÅ~iý¼ÌÕÞcå‰(�/Í«ÜÍïèõ ¾G^Æ5‡äÇã¥*qIÀ›´»¸ÐÍ­“wsIôé²1L�ÊÚ=S îubLõ&#Ù⎙gæ¿õUÏhÜÙ`¸¿=ó}„\^Üýg´ñmZ>}»¿>Üêm@&ôãÒ¬,;r[‹1¿Ý³â–§Ú*„«zJ7®|x�žšJá÷Sh–ü+MÕW²Þû�×/ (MÛ_Äa;¾èãkj».@Ïžý`7xáX{ry°d£Ó·571—N½÷”[ž�?uÄ [™5£‹C9I¨�Ü´ÿ–>–a¯¦Ð1‰�`¤7(½–õkÜh(_ $nã©›u�ÃŒ?f_Ðþ.ñzQÚ0$æ?Uv†.Á,È ~½ØŠ®w«´C ,�…Í%0üÅ©ÞÇ,Ä@?ÌCÍîÊE ¿!©)Vã€u! ü ï´ßm}—êÛß:×´ø£ãmìù÷Éþ»ñÕZ�gŽÅ5˜ öfÏëäaîÂWÖj Âup½‘«mÃÒïí2ô.à÷˜½ùzÒ\&C˜ƒ©JšrX&ã�A«l ¤ÂìKðÖÚÝÿP„�"ÒÿÖjÝÒ�14£æ…ÜY/Äiãv’)¦Öã™)mnáW¢ (—¸ù‰ŸqÉŒÇÛéi <þ"úo§Ã:+¨´)ÜÆ´i4*¡�" ðð—R@¤Ý6Æâ¨º!"FFÞ;ÏOäs[ñ-*ËÍ¿¶¨÷oʉ“nÓ=þ$M͘�ܶBýé @SAŠÒ3¼Bœ!ø·„l,öø‹YWµð{ýw¶ó|£¿ßêR»ü­ ÔË|xô{°LþìÕëN^Û/I-»�|sãwk‘cH¤ûøoã§q¦ŒmˆÉöfÌ÷põlIãÏ®D+DÙ±ãöùc�Æ5ê=Ø‚âìÊŸ®?•¦óɬevÛ=¬ {½ì¯›®`‰a[³4×*0Ž¢±:½ë4¥/­�™¾%˜û g½Ú!oyì~œ»À^©ý‡ÇÔÓ�¤8㕬»øÇ„”¯ÍóWL96N9�c94§:u› ±ãúܹ÷ˆõW~b¹»QÃru'û­êë%Òyí^Þí�lÙ‹·^îu,>§9ÒuÕÖ¸Þ€}ØkC»ëË1´­íðüNØÂúª'Å-Ù@¤, A�÷ýW{ìwd{wÖʇ]ï¨oQFqY,$ò¢ÿyhêF£Óº0u·,ššyþœÜã9û†‘v ñ 4Cµ³wuÀâMIC¼c·Ÿ¯ØÚß�ÞÕà�$_‘Þ5�¦#Îi_:P¹{nò¿*ªu6i|Ê›oòˆ"QU¨@˜’ªè@ÒE6 _õ··�ÔÁü¶túü6ƯJˆÜ°B(¤§cSØ9ôU1Š¢ƒÀ`�µpz1« Ü«ùmgìû§Ê”T¬ÌWx’ߟ¹ªWØF£B†b7±”|‚€»BŽahm%ô±°Û%´jƒP%hYûèX»“ cCL†›–ˆa ÖüÀdÉæºO„G\W¨.¼øÅ/N_5·/yò˜â/5x�Ñß½”¤ÖŠ!èK‹å¶Û Rrx)ý}4©×½Ngw½ ±mh¯úнŸ¸ í“%7ù ª-™QåU· U0Ó8ä*\¬K5óø¬9ŠC~L9fðƒ[tìüa‡å‚…Œ5¶…‹b•)ÞÈ ’†�°{]Q&Q³!³&¥Äm¦�ódy Éûyó�©èÚúwú¥lQž˜Á Fœ“ÙªgŠÂƒÖé#TÕÉ*‘d‚ÄœZÛ߀�gÞ «©$§-•C’érÝ7¦L¥tµË�OËÝ•² ³ðYN·:øý)H€ˆMMáÖã°4ø¬Ï»¨íZÚ’5LZh=ŸRÿ�Ûmõ+‡aç¬gsg<Î›ÖÆ*ªGX÷¥žO|}�$l/¢E~)s•8~ÿ] ·7?" )möKà³,÷[V£0Žr·tìw¾×4Lƒ2H’&;G|ŠÆ›ÐàÓö�e² AÐCBë°+ýûùÓ|E¯!Ÿ¯<þT(ë»iùF%?‡| ?ó¼ã¸VHjŒ…î_®,ï0¯s¸Ý”»§éå±>Y‹ ) roe¡žs {Ÿ¬Áò‘o�jÿ´HÚZR™ÇÇ‹$IÁ®Ö—ß–‡&W\y‡ò9õQÛZüîœØW»p.(v8õœIš¿e9»·†Þ7Ïžwþs°Õ¸MúÞrLC­uÓ¥{w’öžã{qkJA£õØ vì{dz˜kƒñÖÝû�Ý™¶2�€£fï¯Ï,hÓq_�X<+ÝÅ z­`ý�ÒA“ú¾Ç¦óZPÂÃ3fK×5ƒõ( ûsý°ñÝÈ7n*¢�È£¼£³:>>Ö2-ÍÃ�”-ÏJŸž隸G2n¸x^X.<º;·ö Ì«Ýìd¢Æ‘ýñÆE1!ê_Î{l{v±¿–Êt�¸ ›¢’o‹§Íã~úëÃ*ô0cݪevØ"8Ñ<-g ù“R_‚£´šÞóìÛÖ÷þeø‚ð"+›Ñ�UßÛFò{øÏëoß5²‡^cgýã¸ñjÄãÊÌ¿g´�f¨nù3ïž?O½àýµJ´`Å×èsu÷ùÿÀëû¯¢1û_¢¿}8;�Õ¿ç±-üØeèBã9‹š¯”$ ñ÷�¼Ccš»?d?^*ÚW¶»·Ú5ñˆûçÃ|ýpÝ‘ªc~`2{ByîòæCÙ«ê:¦U0WA¸Rv1ÓÎD��Ý&TTd=WºxRhb&®õfþƇûïõaÛ`ª6®~ÙO_|WßFè*@UŽSò›ÞòT½+åHs¥~#jŒ>ƒ�Ï£fÃ}SR3S&xÏ$r˦5ƒ~Ùo×H ³ ¸™+B²­i6”´J m8¹è¹3œZ–ù´Î+‰›sÐçÆºR±òãQ³´ûT¥bò ™�®”×L+6� fÈ)´Ò‚4?%t†„}ìÇP›Ep:ˆ T^Ï Žœ¹‡y—+.î] “i¡ê„6ù}¼¿þ?ŒÙ›ù_µ“ã^¾;˜MuÖ! (%lHc­õ¦É!…DÐc"ß.ðçI î|µ ÐrÔ)š3í5’¬«¥-3Æà †EXµw“üI %¦u‹}zû|©VøxœÏÏPVucO†ÛZ„éîfD\=ñzYý¬§ú7¬uôî�š_ãÓüÑ|÷/øçò7þÂz}7s‚ÑÇÂìýn”½¶‡æÁßàíÆ ª‚ª™Ì`ñwþ°øø°Á¶Þ6Fͤ�‘½¥Þ­l�ªã�7ç«ç¾ž¿ùû^+çÌ¥Mµë«Gˆ?(þh<…NÒˆô~oO>Û73kàýï ú¿q9÷>=×B ZQ‹^­ž B(C1ÇŒ«ôª?”ó6¬[Ú˜nËã�ŸŠX®´7~­uš9�+k];Wt®Ã{ ,ÈjLÊ oÄ é:�ʥѡzzÅÊéV4MaDÂvrKiÎt^²Õ;ÂÙ¡°²4³‚¨ hpY �q …R¬X„Œ8 l‘ü—–-F¯#ièÉ‘i*±%)d' ºÁV®Ce,ë"¿&¥¸Pák—¬®�mix t—­«F"Sü&Q Øä X�)ãæ@WÄaýªëö?mÞÔ•÷­êߟÇQo�ß{k·Ú q6ÁQöÀF­“£drá!!œ+†À5˜½@‰½•zZèMX0H(o•FÜ5kJU½bljó7tc�Y¸î à|Å72·… 0rABÐA½#ù�UÔQ~#`ÿ¦· ü2Ù±”ÿ³ ·ºÂÑ_¤óK$èE©¸n$'ñÈØÓä&‚zÌZ‰Œe�H¯ÉncZ¶"bì¡–PÍ¿Ñ0œº(K 1l2ÉBÒÊÆÐ¡ EiÕ»ºaur”�€Ô¾gÃß­¯¥Ëõ#ÙûáÇÁúøÚÞ߼ݭKï&ïò´¿Ø_öÚ:çæýPׯ `™ˆc¿ªÖÌÿ?�à2Öè­¿7ûºu±¨õÝòˆJy‚Üþ±ÜÎ ³$ò|Ì9Œ*¶ñï^šöÒã©¶­müs ž^�’ßozãÖùÏn"úþgóSx ŒOžÌëyÇçQ˜¯ˆq:å1v«K¯š»5 t±ó´/Nó]v?}é¿ÿOñvÃ-gj]¦îê9a: 9ä/ᵩÖ<ï1Õ¿tæ0M}çâ}ûËnè$zX�›f16ùÝÍÞq`bq›©··NFa¢ÙgkÊp¦íž^˜>ö‰Ëòÿ‹‡uDó ˜Pê#†ïÛM9;øÏŸîGèAõÙ0åv5nâ”;·³sXhîq1°¡ü—ˆRQ Ö!ж3ÔXÖu´æÙÆ'ËóžÎ|‡ƒŒNe¶çÛ9=»§BµQ¾=Wk‘±Oº7ÿxíÌ,>!ê2ÅqJP;ýüõ9ï$ðQF?;Ý3Óµ¦ žþï}s.»?U}b¢zš~F-Žú›vÛÖò‚ãÊÀØÛ‡ýÅ¥Ì^øŠ»µ’-óé÷æ£��.žÙ(ºÿd/;¡?wêRoë–ñká*“ Á•é Û;'«ß þ@? £U¾”)”û7�Þ8·iŽ›ùÿ7Ñ’»_<Ù“÷zO·uä13ÌççÖþ1—ˆ4í͹Ý�Vð¹€±‘_Ã�ËâÖƒ gä’Bâѳ!@°×ì¥_Ť<Óó;é0"C�‘wù¾f]�A¶@iïÅݳ¸MVÓªö®úï¯F’Û:k¡ý3)݇%—Zy`cÔwÍ2.0É %1 •;H5p¬ã_ÃÍ·¹B³µ ;2‰X`ØÍÚÊbòi&Ò,擎XKÃqm6Pm¶9Û\¢ùŒ>Í´ÛM�” =n’ß5¬N4¥}­©}~oÎö¾(í~>={m}þ]uÃX×U¹¡ZB*¾Vì»ß‰Sv;½%†q\j£»'øà0ö_ †e�-ÎVWúH$VHª(,lÚ`Ú¹ï~ÌC�â”Ó±›V@nô£›K¨Ýiy«ê•{;ÔØÔD %T£ ¶œÂ+ƒþÀ¿ògÞ5™cgTréIœ±‘z’ý©¹r)0ÍU“V¡Æ”×¼©há˜Ó2$W0T_ G汆ï(´rR–¶½ÿ´T°(ÝÃÄ%�-ïoUæºmœ˜Mêá¦32´9¹‚72– c/T›1ƒ„fǰÍjs® E¿»ÿ&ÁÕŒa&ñ?ïÇUà}™‚öÆ4¯`kº@ˆB‹DðÅ ‹qe„V,(>C(©|γ?óõšQ˜¬±ùÝhõ�R¸%¸U$HQnŽñÑT6å�m"Œ•ÊAEA™JN±[aÞ8¥­/ÔKÿ� `�'ï9&Yv_òkÒJØÖÃ8’•¶,½}  ^+ñkmm·kr[ïØ¶ø[Ò+yGI¨P L$Åii1ƒuH‰KàL šëY[»dùäœØë­{#–±=™ ø­nf2uàk|·ÆÝ›½�lÅc*1ˆÌ0à~,Ÿ.«T×)âã6[b@6�Òi‰�Ó9,–�¼ÜR¡ Q  É⇶ßO·ª{–µ¿¿+yO§<Ú’twˆÿYêD?Ì(þã×fe‚¢›Çg¿W6/'ιo“â�unë|W‰6Ãw‡ÍŽvçÙšÌÃ"+ö›ç ’ÆŸœsêɯK÷f�ùj_{S˜i¾Z›¾ã°ÝËÄCƒrÙ·>XçwzAŠnÛe³ù‰až~Žòï³–—yíÞÍVo=¸óQr¯náKsÈùÆ1fÝ‚‡écËZ zfø ïÏîA½>ðGIŽJ¸h„íí¤Á6új«í<:öïE‹F^¬ÇŒí(óJ�Yk¾MÌïÏhBLÈÂHèÍ¥"ò®Ýžøo^¹ó~Ôç\~ðÞ™Ðùûô1ŸƒgÓªò·6ñ�ý�Ý8÷÷qþº�½µçkÉÿUd}²¯¢7爸6\I5j¯Ýõ�Þµò2èd‡Ñ˜tAåXfPõ¼ÝœBÿ.éˆâ©VvŒ�¥¹ož©† ¯Xbžã÷Ë©º¾ó¸–,È¥Ç~m¹¦;<{>Üëµ}5ÁAé�ɱø&ãä{«»ž#SÜ ?�_^¸:‰ú˜8ÝØiÄý#¼õê`âõQn2zÄëíýè(‡5/,çÒjÐý¹oæ©Ûªñ�™Ó™» s a£ò‡‡j¬“¾§ŸWìòeôñA†�¿Û³�/âþ%»>ñž!Û�SçrÔ¾Ž „�#YøŒ!¸[Oµ Ö‚­ ½'Z&þ–‚ƒcl³³ šÁ‰ýJ†nÒ(É´1 Î°³P„²Ýò}�hQ„ƒà’Ž-´ÄwÍ ûEÙ-¶ÕچτšÏ¾íËš¾>»ø½ýý·ÃkÃW>ZþŸk°4#°W\]hÝ70ÓAöi½ã«gñ¯ñ¡C>]T8Ïøš 6Ê} &Sf¢ø‚†ƒ:v{Xó5v–P,B(OÀª¶¤!d`Ûf~µlm㎸„}^®§Þ/Ävã‹›lÆù„‘ÍÉIŠù)Û[Ÿ ض‘8±±‚!¨µn^_U¨úÿÐ1A320˜bsH'ð€Šñ(ÜhZ¡lV+§zÓij]«ht)jsbŽîð¦±5HÅíÁ¨ª£ìG åIËcI¦Úc x%îªñJ§ÅÄrÄÂ?ر…ßô?Ü>¤½ÝÌò([„5`†KgÚd8(¯$Þ¿ÖEˆ‚Õ†›-H%Q¶RD 9ÔºJrñ4_d ÅZ•öxmƒi°µ†ô¶?”X²�0¡{Gãž0�>ïë¼úèk離ÐdjrxdûmïóïSóøûz}m¿v^!mý»Uüs_[Ÿ_SÑ˃ÒܕҔŽÅ~öR1ø¯ÞÞ×öÿujÿ–3F)°±a²”m@¶µó?éø×ûm_ìïóÞ;°mØn}øÖþ íÐÕ=\—ïGžóºú^½Œn¼!Æ#e†bÉz÷}¿?-NÐJš¼û;r£šÞÛlÆ—[;Ïš‡´ê%OCMÿQSÐvµýq«S² Å£\©ÿ’hÈóÎÞ¶‹Å :§!íß–C Çí$¦SaèF<Æ %o=Óž ;ÒòŸW’—™·§¿cDk!�ØIµô:ª^K ûâ¡Õ¹ 7<ÐèøôÒ 0'ø�Ó{þ|PîÙ@<‹ƒÝEŒv¾0Æ¿ç2Û¡å®áÏ©ö{/çǧo½¿;ü]ãóïíŒÿ'7~¨Ußóæ= ¿œ� B´˜ãËãAÞ™Ô÷?±´vk>¤¡sw³øyÞÚ•øxÁÅÏu?^ß)ËîãLåߟ{öúý³öäq,#»WóÆßœ~á¾|dXè+éÒçn ¬þñ°×O_ægÓ8=ˉ_·ßßÖй}Kƒiùï® C÷¼„ëí;zØxw¯xlì5]�ÞÐóÕ­X1D—›4|u:£‘Ž×ñ´OÒ~fÔážyg¯Ý{ÛmýL#¡î=ãüŠºa¨š‚�tÂßß3q%äLtÀãñ ‚Îþµ‡ 5ËÍ<ÏL¶'#›ú÷ö=»ø®Úk¸_CqXtÔ³;ŒOn§+w•5Ï-ǯÕ8AŸÙOZ�·®Úøî¼Ú¢yë}ê§ ¼ç,X;Û©în»ÒÞÉ!!IþFݸˆˆÄR‡Ì»Chz!6hCt …¤Ÿ)$RU)ÞÏš3û€Ž&©¹V¹…ã¤U î�ñ ¶4 a 8Þß ¶Á‘jŠId1±¶ÊD è’Ýt€LV«PÿŒíË»é„1Ò P„Æ©6s«Š(L€ß­{+®Û™j퓤­¦m406Õ‚U�°`ÖA6Q%—0©‰%tô¬k‚>$Ø&„hÆ¡½‚ ôR�ÁjÞ­EÜP™Ÿ_w9ÉþH×ÇÍ·.¦Ô ­È·ƒÉ8prµºë˜D‰r÷ëuQ"Œ¢)÷”lDÖ‘i#¦9üáËøk‹ÞÐÆ"ôˆgªhg’ È@@0ß�˜!vÐl|îGŸ¼ñgSÉÚUñ¶1®có´þÖ3ÖÈò†À±�Íu¨:ydê ò£úŸ8&1C�U‹eÍeODIsPÙ… `ÚÕ¶Ç h�0²©—… ɳ_KZU ÉKøÑ‹t|!ˆåŒ,Cæå…¹ð]6]3¯F¼rŠŠn{¾üÛ0yþ9ó©loŸq~n3é÷i9ª\Üù»Òw¼ú=•YTo#£|íTºb£oâžð·üâ�íéª~¼ýb8|>ãÏÎ~ÚŸ_ýö’æøASñcî»<¤?½xÀóßž;oò…¿xqÚï7Csèùsîòšã„ï`ÿQµòP÷6{lj÷«¶õクåÑ¿Üõ¶*æÉ~h>x÷!'DºvQ,rÞí@ôÝ2£¸‰ Å)¤ðöQí£¼lâj5,¶Ë a£RýfxÒòÓ±a‡;#a¦/„sþ5~Acµ¹ë‚¤{’²‰Þìèû»A§ÛTÇaÓ»°ýÑýúöëþ~TÊÍg“á|®a £·’÷‡÷w2—ZwnWû"†¸ ÃYÓt�O-–u MÂDþ°æãé¿ç=ĵíŒ�¶;޹ÛŽyª Øü‹BiU§ž×Û�×/Åä¹Ú°Ê{Ÿóôï=GTb‡¨}[ì¸å)$}(oô�Š=E°„ƒxÏò0÷(ÿ0NF‚GOÛ!üs]ûÝ5G'N›Fü´,d9x¤ÕÚ N™£~tüüþ²×Æ;JÆCYukºì4+CæÁµ‘#nãïí„Zç5�*»ºÙZVáêÂËFazS©ÄüÏ�Q–­¤˜6ê%áFF{A¼ñûìBá”Ú1´¶XÛÓÜàÖX'몢/}†-šã§8“¾×ªÚ%œSÏžžǧ;¾öD|·{êÁýÌ5Ññ ,ÛéýY³¼9Œ|œuýôãžÿNZ™4ÿéƒ7þåKy—ÿq9|ØÕ±Q‚k"\ÝÈJ›§rr,›¶Ø‹Wf úURÿÁ¶¢p! Ô^²¹ÞðI¸¾pM�wÿ»V!™«Ý«,FnP¦ŒÈE£JAZPÑzÍ] GNrO¥B[“²5fuQ?ù6ô^.ÎJmT¸|‡ª–€}tØhB"‡9)"d)ÃD9V`0©Îq70�sOS0–’ÓÆñ AQ>L<â’{„›æùÙ®4ø|‹¼<óƒ|>óIBHB§?ï¡#cs_ØPiRÿQ*ÀRVIY•a‰GÛ×ÇøÑ·ë¢å\ìIe’Yè÷]³}é}ÐÇI"­߇Ïù5a £á³¹ò™'åøÖV~º¦ón)2ùuó4_ÀT_9òåb¡0¤�b…'t?Óää²Ìæ$ѹ<¿áSµßáÍ[çŸPGØá �§EÚëÿ6•$µ:§™æÐÁ´cNëŸ| >Åí¯þ.šà¥fuÞHî81¬¾Íý…Mž@!�­yoâòplÑN®á6zZÖ\î— ± aèŽ1 |FCð™=¤¦žwl¬Tpêˆ}nYWŠ¢Æ“�ç ­·Ópi¾‰H¡ Ærl4†!³oÉ©#s æRpnøAZI™­h·v:'–AŽˆ™È1²9å*sVÆNN„5�JÛ SItÛR¸Æ ¬íõ“² �€&^FNòI!u\€¢¹8ƒõçÊä¨g«5ÜjáņUDZʶÔó|óÜ'�y�íÜ9!sËg`âÒä,N3„õ�ÈÖÁ€2ì{�šÎq †B¼‚–­êž¿kAr»^uºD†DRPP"0’+äò’Œ‚ �@Àò–£|+1íi‹K|�\¦óc@¿¿X³8Y�ra+ƒéýt‘ýhìÇæ‚Ç¥q±|>«`i@ ÖA•ÎLý¸Æºx|¥,Ê %ºZîeKÕ-FB€¥ð^0ßúê`PA]ßl5m%¬›²SÚ¾]©[xk¸Â²�"_aŠÌÉ´/V¬N™„¥é}‰×¶U´c¦\Œ…V(7•#´Qî<¼9äŒé‚NÅ!ëhž]›[HY´IIWÆöPJ'HJ`ƒþ»¼„tžÜÊ2×,:;…©qˆa"˜�©Jæ{JšñÇ&F¦SŒk¥(£«!Šm±oaÈ-ÈÏ(Û{ïm[µŒ¬¨ Z-T÷³|fR6¢ëÎÏïÞAÛØdÄáI‚ꆎÔT¦*Q•S©"ÚŒú§i]`~pââ..Çì¿5F- )äÚž¬JTÇ`¨>GCñÛ "LÅ)i Q!âbœü)‚6 R¥©‹äÕo‘[�z¸óy÷»‡„6 ‘A��¿�w¨CÓ}…Lä݆�ÈÌ'M¶®o×ã€àOzazâlkªQ£†kÅÒõ]Nï8 \sâÖVÝä(Ê Kâ…ãKm…´f &= 1iê%��;˜z¸YãÔom‚& {1̾{šáŒ‹jÏB 5×tÑÄ0`»qËÐK+ ÊpTƒ|ãÖŒ/42ˆ8 {‹� E¼Å«y$³ çA,Ç®(µL¢`°d#b; uq!h$eš?ó¬±M�hÂÒèï]¹JF-y�Ÿ«Ìë6®UX­cˆ©½,«‹Ôè�=ŒR‹3�nûy`iý�kÃå/ª…{6A€§»²nú¸Îp@lƒc)È X×zý¿^Ãv†×§:‘bÏ|G|¿±®:ˆÒb‰=}ûµ Ba”˜*mâ¤P$¹ì éUIV4Ì­#L�¶hg@£±}YŸXÑ1l€dLüÛ-[°— º²Og}†õ9˜)2¶Ù¢ó%.Ä&ÿßýzß‹ïbØ5ÜêTlv•m‰pÌ!-·°þ›þÐJ’,3¯ýÁ¿5l”Ce�WåÔ¤³àýóicîD`cÜ®ËZ.bøZá–rì-‘ŽáO’ó{p·­dÉl®&L.¸f8>º�~jw¾4�•R8œû­VÍÂów±Îh12ÀPÃ]LŒx\ð|„`ú^u�ÞÙ|%â¸ùv»Ü˜He%+W½ó†¡‹ãªh×C0ETÈY\]Zhú9wá_üµÌ¨G¢b6¸.'Â#(ô| >šÃnúå¹ B:üȳf¾;eÕÅ Î{ºÐzºFIocr\»HV0B$ãL9Ó7ËX- ;k“3ݶ®Ñ$ ÃÆ-É ?Cï¼ WBD°o¬ˆ 0®È¦æÌÈ”ÉâŒslÖ¶ /‡Ö;yZØÁÌKháMeå›dà¤:½£=1ú±yÖ'f·ø{)WõÔš9�e&6?‰m`‚h]¬�Òa‘Õë£Áuðÿ”É¿P‘¢�¨ßÀÖù°­à˜ü|iV k?‘Ú¼¿@ÚÏNÃaGà˜˜®o¯™be:½<íÖms)13©œawßxö?ê =ÅþÎ Î M¤ ï'f?Ãø4�¹ƒÃ$X.‹a[å⨻ÅkWêJÄY›ƒAMMbkòœûÛMb ÀäÏ�ÌsÄ#,È48 I$’]õ´p%ÔŸ›+ôù—¥èÛËøFûP”sË7FþPdf�é ü-}e�ei}:(7¥�jþp¸Áed˜ú•QC{ºã »þwÑY"W|Ör @0µÔðÏÞ•³±ŠE»±i‘ �”й�·”‡Ë-±½zŒjˆbáÄYòÖ¼Y\E±˜ƒ6r%ÉŽßoŽªú®ì�>‘‰ì%¬>ÕÓò¾Ñíf ÀÃ:3C\z鷽ȑ÷åÏÏpR°Öaôá]¾žgåK`6Ë\(ÛkV‹ÐÂ{¾º˜q‰ HḂ­]DÙ&N�ZÐ(…ïtFñ•ðã©õµ!éòÝ·�…ÕÓ 6ÞVȱ³ÌùÒ³‚Nå=½e‘ÏD�›èÂäg„˜en^ålj±¬„®²`d÷ÏsI¤ÜàH«ä-¤ÏîÝäÚÚù”žHmòCV:Ãz£àmUAZÜCöþ@ÅOäì&pÿF‹{!<`Ï Cbø¶ª†[^Ä/'�qºÏ,ˆpb¶;(™%á´ëÛ¼þšÜ…- JÐærE%&T†% �h[Yl E�À~ ×ñÐï\Uh?¿w#ÆÝ/ú{éWÍêKĨ^$£r 'óp"’ö±li.ê��«‘°ñÝ63¬× £‰‚È¿°ªÆGcœm/¬rE«9ÞâßrÏŽZÙŸJ—µ·ÈÀ.R‹úàÅ{Ïé³a`·4!âq˜8×&nÌNÓ×]Û[gHyÍHûfÀ`9#¶B%”å΀%q³ø´‡ÇíB`ÁC. [Îùä1Õãß˹µ“'k%)åÐìVig<ô‰-ö“‚�ÊÑ™»4B%¯‘Ö¼òåKÄæbÇÜ£�6 qº ª»¢çcH ·÷“6jû0ÂF–žºZñ‰ÆÇ£ºo�þ æàän˜Û£BTo«mö;)g4«yˆ8éjÎØMÒÀ ¯!dàD„À'È„GéÐGGEŸ“{Ale_ì=Ùˆ:¡ÛD4çØ@Ò³’C鵃� ù|‹rÈÔ]%ü×¼¸'4¬@‰¸¾/ªr .—ºÌì™Ì)‘Q#%ØN’ôˆA[˜]Kí2¹ÊvcIt!ÏÊÚÆã\j›£<ÞF(`œ&+`v£8k»_TVe#0á¸9ª6>+{WŒÕi@Æ¡žðA›€hsvTµò†w$ç·=ë•ײk®ë’4Ô¶iRÄÏÜü°È ßÅ Šà ŸúÈý»ÂåïÇÇ0[i!Œ"†ÙN@NmÍÇ�qÝı›@MD/¸Îš\ï\»‘zÚäPÔÖÕ ¡~¥éç+"ðvÑ”‘ÈO€D°9çb*úÚŠÏ�ÉŠ×øa__þ, ×þºWtž¿“ü˜“6ÆØ±pÜ©ñ. 7ë©Z¥‹2ƒE§7Õ5±…/ã/X¬ØLB]/Í•âÖQ­UÇvyQþ]1r1§PÂòtu•æ»Mi)Örµ#Ó#5Xn_Àˆ€+ýœÊÿd _´’?ðoÔ{I qý™£Š€­ð ¼ƒòh™>¸7üíeû‡60z”?·À Xÿk/ü0Õ¹öÿ°ˆ‡ð ý‡ýØÿXàCæ}ûG®@ÑyDzô¼�û4ŸŸ¨ŠºHþ{}yûíEYþÄÌ[HþG¶O–5†xiÝ\L]¾ß£Yú©Hçãõw"×Ä’Ò<^�Qìa¶¦‡·›D ÀL[u¢‘ôî$/e(q“»I)´ù ¶˜à¥›iˆi�Ú\@._þ� ´�„²Ùfu¬Ý�c,¸ÏéP�~Ý¿]Þ·6ýyþ¢«®ÿ«]|à‹ÖÍzäé]�"Rb�(Å2†6M?…á¢�^Ñ»} Q¥òø@mƒD4šbhÚІ6?Û"´_µ×O‘óöj¯îùÒd©¾ë±†kù¶æô�*1GÀ’T[ô /c©ùî(¾R¼ú‹ò+2ÛçõÌHù¤Güùöhr�ÂoúU?À\ Ê(ø}͆ĸpcð²“�€D†GbÐõQþ „ ÎüÿÄÝã�%r-ØèAgøû�Z09Ñ0³=T7=Rަ×aÆçS ©èˆ� ÷øá8ˆc}~�´áh½ª?FB†éà3´‡"ã€ris°ö ô§âbÎàéUO nE=ÚƒÇY¹Ðáêõw-8ÄFNHƇ9Å­b#p¿øÿsj&&ue QØwíHÖäfjª|r7þ§¾uí�ÈÀ¾Šï÷þkýó±ëŸL—‘ázøM§í#뛑¯ÔÊ—p5¿Ûøj´}t|ÊùD¶1ò×ÿ³�ògõìBá­Ûa±`tÌå{ÿÜäˆ.ñ¬?ÌÍ—1¨1 Ù ¤P$1êH¡«㌶^Jq€µÖ—ô𘠉)å¹÷ñL9`G“Àû»²—½ÈY‹ñ"—ö¼Ýˆ$y*%õ¼#ãÝ ïÉÉÅèŒÜQ|axlvF'´ÈeBÂËj0Æ ‘8°[àÕ ô·AÛ¹I$ìßÜ‹�VM¤ŸG³Ç9­µßBOëy z²��Yä5œZá0ÿçù3ÚÒ/Eòä¾6ƒA<Îx)`Õ G:O¬×*×ys/§ç  d…ôÙ]A¿À¡ô€bˆBW »!0a„›‚î/[ÀÅć¸Á&³™�þ�âØWATš³2t\'TH,~€�@g�«ƒ¹Iå?Ù5‘°v[rMîæ·õnR¿¯U¼8K¨õíÍF68†»c[M–„$ñ¡nܰ›P¬Ôòƒ\µÂÌ]æP…³ZËHd¶S{^³ÈÐbó000&4E6Ü~|} Æá;3Ù^|k4‚²sBðfyO�ƒñd㸭X*†aþdÇ�rNúŠI¡_š]ÆÇì!KÉAé_’ÇA×hÁßuhÄÁ×DªN#û#ýaŠHŸk‡<Ä—8ýH× ÍjÌ +8$Ði Eoñi‡Ï¤×LphNéù^z"З æ>.ú¢YD×+ÕCi§\%•„ù¢€Ë`óLk¥¬Õ·†�wêȧ :QÎè'lƒˆöÚ¡ðîqjݎ׎ ç"¸Ðño*ݯ‚5xEΪ¯~,Ëâêèv'„Ý¢AšnwWnÚÚ[ ÚÙýñœˆJ›Iñ]$=�r6u¤¡òq››Aýi"ÿdØž­ÁrÃiûÌÙuñ�O1ß"†â^¹)^Žfj˜eë*i[¬ŽM �4YÄoøoY§¡38(ïâänóqøb°(’}Y6Õ—ªCAÈÇ3… D5tc‘‚ùkìeú7ñIE±•ݯCh¾™“w4Öt÷|g}íÛÁ3S_ŠE™˜äíÆñes]÷p4š¾ kM�€7-ë6ñ>À¶q 0ƒìÕœÚe ž5ŒåÉE b l)|Œ�ä:L”‹%D?©Ñ±qnÿö Ï‹ ™‹(2„ø{¶S¶G›ø~/Õ8 a„S/áð«¿ç#žR [SšNHmÒ¦U¾×t�[Ö¶}´˜Ò$éyÌ4‰Æ1>°ê˜ÚcW]±8AО£� 2và{Zy•ËÑü'-�åÅóÉ9ýœOD�{!5i°výí ØÀ�Ì©îº"d9µâƒ÷÷/Ü_÷ÁÓFËCäöêÁá0RKkA�u?ïk5ÆbºÑ¢oŠ´ ˆ¶^ã#¡´j�ànÜ8t4ü&K#ZÃ¥'N¢ ­”5ˆBR¥]¹¸)—3µ§Ác¼­9[‹[;µ¼œ�+8 5È]¸�+ÞÕº�ï�?Ã~¿6nãà‡ª ÂŽ»¾<*¹­9‹CX™ÛÖSŽ‚›˜-L`u­ðQø mð/~a§B®�3ð­*vãX¿ìU²9;ú4úüå°�\ëå»g¿‡î@K¯mØh¶f½È…µZîbíš;¾}¡yåEr 1–ÀÀ•@,~Í\=·~¥·MÅɶ/òÂf {cŠKUzöé[4 „®[ïì^DOœ41Â`õ�%sؘ’=Åv5НˆÒóTL$§7F£ê³Üåh‹µê§Ww�i/iŠ mC œÁó69ñ ƒ{èê˜RFñJ‡ÔTt/LŸsŒ)ÃùwÄébeÿ¸ @¬_ì}аÖÝ—¹ Ò¤,{ß°E«˜¥ÀÔÓ·gð�&ôÐÊ€€Á¡Þ—^Óu ”ÙhlÛ«R͈y»žÈ5ªIЂ!:±FŸò€ål¾EÁ-—7íç:Ê¿2žÊ=�z‡E; ”ƒ Œê%LQ r­ûÅÛ¹^Ú³A˜RSœ §«õÃâY¨žóÖ³{¼Løì�ü÷¿?kôŠkÃ~9kðJÑ}üqÀ–°O Z,Îϼ•¨N¡=è�Ñ4ªS€Œ"6ÃU9îDpúAðÝÝŸx,Þ«£¹«xŒ"•Œ¢ˆŽ™+ÿÐe¡ˆ ˆŸh¥ý;BÅNùÄüÏ©/cHK‡š×ˆµ©§j|ˆ[ÃD}!,2‘ £%Ë!ý#GÏ'â :®"xèžãñÁÝÿÄÁûö“«+úÇ߯‘½OÇIË^?ó[æÒÿòmEv~=Òoõ5Û!û/ëP?¯ËÌ€’ù×(f>Ƀÿ¸þä€�DÈ�V»7Í70�ÓñÿÝzÁÊɆЫ*EXÞÁÂè@swãý�p@×úï §€Ûix fæ¨5V<êØ|4 ̃õÄ ú<¶Ãlé­Me¥@C€Â­Y§oA¬½ÆZˆ=œ(ÜE²\ß,Ò,‚ÈCow¹ôã,c2«‡lßJùuZ§k`† KV%ªŒ´ŠBˆMÎB°óø9c3øü2J˜š±‘bÂ%ìh†2„ª £kJd¾Eöd¯}XW¹êN ’¡#YcWz'Wë„Á†*½q_›=NÒü¾J›Ž¼zæ�6-BîUIy®ÀÆ¥ºF+ g²Ò78,dyµ2˜Dš=ÓÆŒV‚ ¥Ѿ3Rr0À0“qn`†Ä�x¾óMÙBQw¸,Ku-”Y¯Ù´p´‘ñ+˜THäT.Çü88XWýÛN‚ëÔ¬õFï¢àƒ&rÀkãÌIü¹Ø]7á‘U6øƒ*ÏѺµŒlcŸcÚµ’ù å³¾é÷.01�˜ÞµK¥u�¾ûVɆT4ß»q4 ”­ ›jkÂ7Ó‚Fg²¡ìÑ9„FÏe*w FvRW<˜O<+©HÉȜጔÍaFeíÙk"0„yA‚‡\�™¾3Ƀv¬Ç#ÀåÕœ æ 삞¡l[RW˜·”8��§Ía]½”+&•GwV‹ï Máh鲄Þ̦c lÚm­;ÜÞ¦+¦Av´‚ÉÉwšQ¦Ñ"ù¿Ø·ÈL¦PYU{5ÖÖ$ˆ\ï9|ºº&µzDÖ W‚KH~è°ù ߪ“ØørøŸ,Vx¾(¸è¬ƒj3d3nœ*:pF”¡ÆÅ¬Ù/kV†Š« vÊ3;@ÞÌÃT×ÍqÑŽp¹{1U�¤öâx·3Ra…†>-¢¡³­6×®z›Ñ¥FÖvŒõ±‚È:3`¡˜—$XO§bpÒ�^ÿÉ §ô®q¦ É7vÒür3~£¥ÒÉÏRäóÂ×\Ç/gÈ[†ûÓ{C\d„]zèï“]qïN ÁVϜȽŠD0Q5î+ÓuV »qµàŸ%1`à§m•]‰Ú!±ý3ƒÞt0¸¸iMx8 àì÷|H1´cŽtGW†¤BØuô‡šÕÉÈW»�±Øcí £ÎP2ÜqBÃKr€à�h¸Ù榲;Ë}AýÁ¹¾Iýý‡ ÷°.yO/KJ.>º0ì àú˜.èÆnÀ³ãÍcÊ‹ Ù‹™böòÿ[–ƒ|oo·âÈh¨½ðSv7�dc_èr’¯¶ †SEõ‡t1>Å®(‡ÏôÛ:f‚�V‚êÅð$Kµóy°××™?�ÖðH�Цl-ò)]ÆË› ñqvz×ï^AÔ e%¹’é5Np÷cn°±Å’<ÊAФš‚äk-™µú0ªX|qŸW°žù2.}ÖR3ƒ¶¼<›+@¿4ך/\mPuÃÚÊã�wXZIs9«p*S,–ÜPÔ°–�gŒ! M§CXŽê.¯¯6k6s�?÷;¹oáÎ/¿žì”Ä 4ÌFÝ)SË(jyE˜¤ÌŸÕ�oëwÃ2œ¦%{ŽZÜýz,ýü™]5��ë¢8CâƲ`"íµ2±ÕÀõØ\ij¡þþ×当3‘¨á{ÛÔíÃ� ¢ãë?M±Csp‚n�yTËB÷][aiäÛm’ï7XZ˹(WÓ˜T«ñfµøŒ²ßUŠÝS0n1–”ÐÖ¸œ¥m Äb3ðXÎ\^ìÊ,9³^CÐ5 _”["åÍ……Y­O6ñË|ù vËUÁæú.¨½!#'<;…4vÊ[Xi*mל[=�ÆQC3¯7³|^:�À¯àtG°€­ÖeŸý8ä»_$,µñiŸùçRmEµ PÌÛ#ƒ Íç¦ÑèÖZž](àߟaUôV�à Š'~3–Ñ’¯|2×ëä.¸U¬Ò1A¤eù[Éã.)0ç³hjÀMý¤~ºXϼš_Br$´hîx�uT]ÆÒˆÍÙNªSç|S“‹ñú²˜É©/O ½‰qÈŸý¶_â~Ø]tt�ñlø'Érµ‘‹¨€?‚&·ó–iã/¤Sj/ö§Z˜êº�}X¬}/íÓîó Q¶Kd… ÆÇ)?YîœÈ9Ö¬kîM°!f9›B–Êö±Ó:çù"W²§øvHMˆùB“!Þå°�Jœ…\àìA}/ο'ík p÷Iõ§÷Vî8œ!;AlŽà³œŸëæïjÅ·B#'kÜsÑA7[l;Y°8{`B 1C Æ6{nÃáMàöK`ÙÚäçOSYjƒol0ñ %‚�°×‘`�‡Ái Þ,ÑM†+°R Ø*°ÌZb.Yj9�G#vnˆl[j*Gõ¾Kœ½úá—õÞ}Á#ð ²?eÚÜK¹ÀÕ&ç)`HFÒ Ê™Æ(¬ÚïB¼TÇ °Aºã|`Î 8Bx{ˆaî™–hv3¶üA †LmÅÂärk¢XÑê¹òŠNï³x¹­Žýþv>! ©ó4fMÛÆû0V <(kŒ ¹ºFÚ÷�̯¼vµ!»nàæÒñeô_6EÓæÕÇbnV_-™I÷8°,�ùt‚Vµ €Ïµ×Iõ�ÌUswAÎf6J— Yk(p8¨A±c›u‹#üÃV{ö¯_[9À5|}½sõ�à{à¹-@H¸¹ |ŸG)ÚF êÂd‡ 0£¨rJ3q‰à!®NÒN4é?A•‰!x±÷,<¢12'ð:¦û!!Ïpgð÷ɯíÏò÷bN=&4Gü? ï‘PeE¾{í`n�™~¯�pã!ùlV3¥¢ !šÓô¶¿Ïã¶ÿ}q´¹`ˆþ,H€‚g�@ü”‹o0coiÙ.!s�K%êÙFÇ'Vý/C€…S*ãu+ŒËuØ=ŽÜÑç�ËÚ{Á@TÜÜ ƒLûS#Ð=÷9…|cÜq´ê™¾“á^3ÒD ˆ+\‰$’s©ßz]©ÅÈЩ´Çßw¯#ql\ü…Ž7¿“¢w“f×Ýá@ÿKŠ¿Ë�«2’–vÀyCàÉ~­{'}õB.ƒ’ ¾NünýZ`ÔÄ3t�sáïòYá#úÁg|—›(þ4úÁRå£XÒ 1o?Éùvæž®“ëNEÀyÑ¡œ[çFÃ$d+€¿ÏÓ|µXñ\$]Xjs"­btƒâw7Zö~E.á6陡¥¸Ä0öRÚyÚÒŽÜ5‹Ø8Ó .§Vä¨À0Øyá‹ÿŠó$Rv‘ŒkãÃ�häX0¯�L´ý~�Doöu_Yïë‡üv¾Ø]õÓÅß·¤¾oH�ßrÊßËiŽÈÚ©G_1ù ÷ñê³�‚²Rä_ù¤B3|àMÔ‘Pº.ƒ õ‹ÕÔΪLF� x‰Fæi0ïvI+Yï¦Ût¤Æ¶ˆÙ„Z™œÛU�8ßf² fVþ:�ÙO¬—ƒêìðÈYOÂÿj½Ú ý|`+f;üÖÎJ¡¥ÚºçBäf@�‡|vBü:Ϭb”4#ƒf6™ŸfàÙdëd´c´!¿U ~Äeø6þO ±W6~èTÉež¸5‡©sÂíhj/?ˆIjÁjÖÔ mŒ6(`¨K¼%¦ÚßžE~Ï6sšrBßÊbmØAÀâÿäK`y�RÔ«kh=.tl­7‡ŸðÿK&ŠÆH_—›?ú.!s\NT^ hȃ¨8»šÎ�hEË›ˆ€»�ä&Úåa.ZÊN(n^X ]ß�·é‹�¢þÊ ¸ß@—µFôTd`± 4\jn'=WBBä=�ò®†\[­°8ëç»»bp ÀNÀ…¯páÆŽ]ÌÈ«¨ý”-� سu§¬)_aCžá‰bÜ΀K¹<Œ"JW0¤L"î‰{¯»…–ÅbÌ“aØ»™H j–©•ÝÝK‹ ô ´|& *ÙŠð³ŠlDÍîŸÌ)46ËN]©å»ÄpX3Ó\”+˜¿ãXýžäÙþe¸ÁÀ92`G_{Ÿ#¦q.Úæ‡Kô>6òÌ—±¿_ŽVÚn|Øq{]¸_q{dE:ÊfœKw,5áûÆF»9Ô£ãI#‘C�±¸Ã¢Ô¥!“Ô1Q³Ñwlê�Oª��VÙPÁþ•[¶iPÞkškDÆ”žÊ‹5­�6» èä‚ês5ï4Ôïë¶S: ¨¡®Ö¶Œ/¥;HvÃæÙæèhcö9Vø`¸D®.¹‹Œg7þKg¬\Œß{./И_’”¶^Ö®y“ûSš”<+ÉH&sË|¶Ç—·>®!Üp ¹ªB^ìÃk–X™Ö)JyFmôÑ*òY}>,ê÷¿ûuõ8P—”B¸¯MúT/Ó2y¦9Õî^ÎS8Ú½Õ‰±•$óHŠžaÖbß0X¨z½Õw_hß»‹ß?%?¡K8L|­+>g—)cœ°.˜Úƒ™Z׃Îõª¨´)®Ê•Æk¼†-áõ”F¿Êʼn‹Ë“¸Ô"4«®ï�f|‘A‘§i ¦¯5“ˆ%ÞD½Êä! =M’2hIÊ.•.WnéÝZèTs'zkÞõ)‚œg ·ŠB‡Þ3eU´ )ªq�o8ë_tUÖXžT·w¾°3Už––²Ñ�¾¤ÄápK‚uÅß~¸^‰;éßG5¦:2ü:ÕÝÆÆd ÿL�ï†pà?Á÷ëL¨d4ÇæëȪ™ƒ52än/¡Ý=¨;ýœkÙé×ãU8�fykáÛS1¬8Æc›%ö�¸Î=¶š*®òˆÁü“v°¨IϾ{_÷à]}îaÄè~}¨©| ¸ð?l›óüã™¶�cûÎGþÊ™¿)_ʯU8D¥Ü¹å̹£5z¹ÿàîï9)¯Çù¢•Š”\:×.;ƒkZWj3ͬV÷&ük#WÙ½ì½jz÷¢ÿ;~Üå°Ih ¶apʨ%©Ç_í oWÒ*~A”pœ� Yö!§lãóÒ•§âêæÖ�÷ݸ$Ï–çÑD�ö¨DXeoo+­�Ýpe–FÁ}ld(ú5’É îÕ£Ü~À<™æuüÊðlYÛÊuä&]ÕeH•Ïb±üS_À°Ÿ2_Qs!îðn¿ón+Ö4J-½ßÜô: Ç;³™oãÀ”YÈág™'¶xãDÉ´oçG|ðNø\ «K§ìM¶†ÒðyZù·®ÝBò—…ÇEズ='®'Ö‚=ç˜#>&ˆ"‘3¿øÈ†ÙZ8i˽Äü‹ËÜY¼ÁNÌË~ž�žõ°þ¼þƒ"$õöÃÌÅßv6§IÝø÷èàh8Æûi®Ë$†/kþŠ‡í²…ÀŒîë¶<5‡å›â¹º@¼ûà×õ0ûC*â`,ïȱÆZ¢“»¸›À> ßtƒ0Шí·öÌUgÌ“K¨A;\Í2y1×q_Î×¼ÁÊØŽÜSqî0Þ0ÎÇôc¸øg9Qú_^;9¢úãAUªïxÉч«û 2ìh_o1Z×ÀáÄŠ�^úÖ5”q/žyôáiHÅÒ•}�òõa¥v"sÒ˜°©1Âí[‹ó±†N ‚M¢ÖqÓ‡*ÑË 2”9V2Xñ?Û*Í¥�!�<Â߃tz>) ¨®\M‰zïzîy¡Î HŒ+fÔÒñ±el®·¶ÊƒºÊk§rn B� *­ËøiKj<:m˜°kötìÆŽ³;�d4r ›çVÈVøSXtÐxÑš•$�[å~±6«ëåñ¦øZpÅÄbF%{!5½:¡\1©l€JZy!J6?!˃?ÎÖ¸Â?D ßY?“†=ùŽdfmÑÅ3µ�‹çxBü6-Z&áÁÑ î—9ÒËeCXœî\ |ä¾Yö1�ý¬oyì°Ø4˜´0lGë‰ÍàoÜBAZ4¿žPEpôº­Àl5îvÅGkÊ툵*h�„pjl³³ß¨7Ds-òЫt¹;°Øä†+f)_®…h)ï/CÄ5uB+APð›J«îËù2wMAE o˜¿ÁƉ[ǨQ¯I¸àü» S%\è2²Räæ(ŠàZÿ<)Û{ι¶r]¾÷d”[f:ãÖÒWíh(!E‰A$hÆ>/ äµMòÔ³Eш~üÞÖ¿]ǰ¸´M7}ëÔ>ľCµd-~k ;]}áÑbµ¯z«ãäœCÀȲU!˜žabÿJÃ7¤¦1%‘P&IlS\j ÀCù9·-• °À¡DK¯–«�™’3µ¬^{æ#‚ƒ~ßX“WÃgþXê5ÉΉµò<xÞŒ˜’ñ…cݘ@/“Â_j1ß«¶ûÒLsî_¶âÛÚÕa~éÌÒöM©�L`Õî™)ƒw†OqSü,•dÆËpê2bèdì$‚cVþ0b ¡`¹ô/‰�çLmW,¦suõ^A*;œhç@œchË 5ïýÛÚ�ê64á<�œ(oa×PC#Ç}#ö˜}ŸÛî¹ÿ¶5$oç÷‰iþÒ5?ÒŽ/·¢È�Üo…Q.ÌlTiÏtÛ“#8¼4¨'$/¯B`ȹ�pu¿÷âÐÑŠ="¯ßÏ[R{—bÝÉ©4~fX¸÷\êuý¨µ„Õ“B™o…ãšÌâtó¥…ŠÍ^»Í­ŽH;‹@¤…)A/vW™];1÷æ1’¸¶mnXù v›Ž¾‡.t~�Ú¯;f†Ï“8ÉÅ+ͦç, ÙO™©Ä>‚F—Q=_¯‚ðsàÕ­’ ùÄ`>˜†uÿƒ]q�ëÉpÙªX!…KsÂ!*»ïì(o[›:dT�\¨8ttý‰œ8éX›kc(ïiü¹QD¸.¶Ðºv4Aøn*†Ìmç™k~EˆûKÞ†àÞóÁNþ¥˜È¹âxð‚�&à�ôœhµè<¾³XK£ÚÅct°?(pî…û3£Ð<”‚b\“FMªRõ ’k¿vv^îŽ]§‡êNõ+'D/�FÌÍl2w9Q�–Ÿ—s�÷—Gó ñp•a;iwI=þo±‚á‹tŠû>™eå´ ^98Ý_G·<› €•g®1¿\rnµ9’¡ÑBû¬óKi›VvÇ7ÖxÐç4´e[‘.æY f|Лx‰þ}kÄ)å1{NK1]êw9ª01ž·åuÍw7ã(ب™*âËq@%i†?Â"Õ÷fÑŽ1°³&tƒ€‰žíE͹£c9zp&:ÅüÌ…ý‘Cõ†Ù£x:··Î>®"Y’ý‹ì¾ø†cn7Vuª¶×G?¹¶<Ñäszd¡‹�1Èæ‡„+‹¾NÐ9 Ù¶˜~ÀðyÕÄráÞI}½ j S,B¿�ÃþÕ±†޼°þ¼ç `ðöͽ Þ-]Ä$-ûîp\cÚí¸CVxéE Ì(n*Øáï¥kÍüÿ“J¨ÿ}!÷ T¬�茡T£k¤V£±oG²¡Êy»”‚3@kÙ ÿ®wƒôôh€À+¿•æRâ¾ymïªWaçfÃM�…œÝQ! õ5d ¸<Œ€2¿}œÓ÷ùuah–*üž<Aƒ>ÛK?O„Жößs_XCòß,¨Õº¼ãE,ת*3ÉÿËF:âëÌÿº}YŠê†æ°FOØŸµ*jÚüÂÝ‘A?a” ¡‚·>«ˆèºÐƒrº— ” Îa-ˆ¶žf"bÙ9FyÙ…ÙôÈýFe„qùäï7ÓÇŽlp誮 V¾ãóõú\æ·�àºô'ÁÞ3gœ(q¾�#ì¿'f;Ð kÖ ø}B6Ã=ÆôÇ‹`^øyëÉ.e¼7ì0Ø ¥A ÐZõ„¾ŠGá…s‚‹jÇ“-6 žZ°s©9,†E´iéˆÆŠbßï9&¡i¶ì•�ÀÀ®Ï5Á½)•'Èoð|áF›„6 þÑj1sñy¾ïrâAT�¼X° ì�4Q†232)"G1söø ¯Vêu«œ 0*`ÇK‹(™8TmZâÁïG£Òyl¢@XæÖV·†ëz$�VI®}°Õײ P½&ƶš:uÕQ­óœyÔ:æï­áQ°cOg�mjV×ɸÏL„Ùå{@›Øêíùš¦ŒˆA‘»ÎÌ0‘�sJl=õ8Ÿ}©ºM×XÙ•]=8[˜êÔÉq«€€!ÝGá‰xBE�ïÈ3wÊ7+:ÿ$îƒ&í•Oàg»« ¥´¯<"ÿ‘(¦Ý¤m[§ùG~‹Û =Ã`c&>‡ íƒw¬öß=ò  .Ó+]íçyÂzÇ£¾æt±0ôŒÉ2؈ä0®r¢¡¶‹T0Œ ã\c,‰«½ùžfà&i»-ÅÃ8øÔjWA{¬~úÓ«@-¦1.ôo�ò‡ûxîNÛmè:ÿnÔOéêË_ä¦7ÒÐÆ8V{ú‰Qè^KÂÔìv@Ç9`vhhk!"µôÆGm4l͆×z¶Þài�®c_‘Î w=€£žP©ÒýOàüå³¶Ô/ĵ}zrAdX @¾—LD#à²S£¡Z+ÝÏ@-Bç®íê5XÈt6Ô ƒ&…6Í‹`—¦^¾ëq/É({ø¶ºÉEWÎ}�G�à¬Ûx°?±Ýé§Üâ¾´ |Ï-¿‡+ß6’᪠¬ãgJ`nz"âžÞ!ëS�–°´¨)dåvá³ÛëÇû¤€Xº½Û„ým• hë꼞' :lg¨z«r–ƒ-G5'(ÊŒÿ8¸ »T¥€Ó¦î !éà ªQ{A§¨ ùì2N‹°ª-¦p|¨ÆH='Z²))ÖYgŒkì²Ä8P+ÜİÆnC¶¦N¶¾—êt èõ¸‚8®'.¬n]™û7�±Œò³çqˆìeOýôÀž¸d¶¿iï¨å€ œŠk¶{çÏ9îž¶Ò³bMvÛf‘3õ°wÄvÃ/pù{�fÞ%‘ÅüÐ¥Ô¿bS`5ú3Û=âÁˆ…닆۵µa&wÓÀ凲(|u¬‰°îüÅ‚à�±Ø³ï€Y##^ÖzƒMÕ¸‰ã¦ _ÈîÕçr½ÅpÀV.%6ì Ø-å¢B䨬UA€·\íæž½ <W ë3ÎåSI¯š2–ŸÓ=8°^ù>QÁe­¸&ÓÆ�âŒß°«MÑÆð�h¸õ4ß~b1ë5üÞüP "°Â&¸Á¤¾÷_îßã*[²N?µ½ÿØèÝT¤¿$®õ&IÀÑf!ÑéMnSq�õÓS^¦=ì:u…ñÊ\"R¨™¿ dxx˜¾Œ·Çä„Bþ>̱Åõ˜“blMžì>L�U§ým>”­"ú®OŠ@Y¤D ]qh˧æÐ†/Ùö>ÿ˜^‘!kì7¡ù†iß�zé!ü%±¦qû¿®�Ínb‡IÆŸrœÒÁõ�’IÉ3t&¤²hƒYåä"Ĉf}Ÿuj%¨Ž�½Ä‹PžJ;Z’cE¿Ú Öfµx«m0X«ùÌ�ˆw8H-Ce•€Äæ×Ô‹�Ó24ø-˜ºuD×å¦)Ρ։ø[¯ké©;; Mkð`çdž/œj50’æv�Ü`h–è9›„ §§B“�Ÿy€:–Ì‹aC~œo•+;�L„°SH{ÛN•€sÄ!íïb?­îŒí¬eø€Ø3ÂØÌÕÉšík0ꨅ1uZ2´�MÈhm3©§"I$„¬™f¹’8¦±|uXöÁêð\Þ!]3ŒºìP4¶U~Òfi•¥Z¡Œ9a50�ø–�˜uìdÛ¯ìÌ€g7çWwž~+[öÒV4Å—x€«úøVÞ¤ó¡;Ic±¼¯qÖ”¶ÁÙZÎ:Š­'h265×Öô}ÆGìVÄŒ{œDp–5¢`½]�!µ±)�¥CñŒX‡L¸F~âÎAÑÚI-šklêÐÂj,Ð�Ëf’1 }$]2ZS¡4Ølf÷"ií™Ñâ‘%ŒPi¶ÛMŽî¶Å{E:,kv{zì PÈAÒY¡01U}$¾¶£&{]ûáq5kê®*Y"gp‚AÜx·^›o¹Ï-sA©ê Žï†ª�;Ýõ4²£¤L„F„&�ì°TZâ@Î -’]¿8 pÏ%;FËTÉ ¹œXŽí|Ym%ŒÓ~‚w²�ÝÓ¦˜[zÎx±AÆÄt›ÛXÜæîÓÁÅ®gz…'©CP&/¢“j¢T�Ù‰UÇM(öÇdáÍ�«ål&O¾P˜‹”0”;˜Á´ ²(1¸ Uª”Jä¥[Ε0$UBWÌÛ„UC¼•nÔ|•¿° šB1Û­žý?mÛçA$#FG¾QÙÌïõwg)ɾÅmNEZÚƒÔÏŒ¥–ruPx!�ùç·cüG¬O¤/®ï¬þ ý�ZÝ’Fï†e˜ ñ1y®Üf³“~w x2œtÆ–-˜-_ J„�=q{½ÄXh´œž{8lb¡ø/ÕÈd’¿µ¡Ë¾ª0€ˆZØF=À¾õç³Ë�ÃN®ÖZ®¹—…Gn¥¡ÿ^(}ïm#d÷AT¨-5²\Y[d+AO›‹ËMn�˜12-‘µÄ‚U‹$Áí}™[ĬÎXx+cr vt)Ü'Þ­ØïÊžkÇ'fÛ"ù�¡ÄV·fͰ“Ê=Ê-5æ‡Îo(G‘]¤Ãl‡{ìOü2 ùÿ,ÛÝ|?<·ÜŸ¬|i¦Î>ÈÀÍh‰ k‡ÂàÛ£±ÝšˆÖé”x]ÎbŽË—|‡sYHÓ¾8ßL%Ût…´•åÒ›Ž b�–Tb|ˆÿ –çÁl"}í"Øg_,c8 �ŠºñæþÞž[}L}öPÔ¸{É{Ö1|?@†–2ô�ž“L¨¤TŽà^�°4 {Á²î�€Î®ò43Û#-_kô­¬Û•EÇÙqÄdá¯õÄB‰Iƒq¨×Ÿtù4~i8q•”=I«0)—Á_�òòQq¯^®JªêäwÞå%õ¥XÉå·vìšò– õ‘DxÀˆ„TE¹<7S�%ÁÂËK:Wð©È‘ˆ£HÑ>ò’°E:0Šœ\–Ò¯ÄÆi`�‡¸ÖeœÀzK¤ˆ�‰V\‚q*’´¡œc Ю«.o${‡FRT,NFNí¬Îò£åÒ"r�C¯ðÐcáQL¤©ÙhßÐSö§Ëó·éÜ>—ükÙî4Øaì½þ;ý$ÿ ¡û±­Î_È<÷ØÛ·_2‡*}¿‡�U.ÝsžÏ6®óñóÝGöG‹ŽÏÀo·Â‡ts‹ú¿âYø’öƒJH�ƒ»¦oOÖØûŠ´~ڵ﹩?ˆ¶6™Î`yÍí“Ò¿ûâéfÒBMæç\ÆHP|Œ– lÃG× ‡ÍÏÿ2Ëi·’ÅÅÄ,ÙAGs‹Ù„Àk yö\n¬£Ô¤Ã drȪj·„4ñþ˜Úw{ÓmJOAÜ$îâ3ºb;êXMæ{v»1ú±«µaVƒ"¼¥_ƒoçàÀ†ƒ<î Ûx~å£8–k2¯ú¤åùzѼ¢j_žÖ-gº[Wªa° u24pw~@v•à÷šÃ˜Åò3b‹OrPËît?û’B3 ˆ4ºT€eÃ\|›†iüJ«°ÍnéÞn�ßàwÑ •,�¤U¥ÿx‘ãcÙ 8[ €Ãì¶(Jˆ6Òxš¨â͉Âsgí]@þQé2£ŒØÛØÛKÈh¯&ìo018šž™@ æÒ�IÓR~ê-kƒ®æþÍ�úê7‚É�_³p¿×Žˆõú¢³‡¦Û\Õ��þ×чöoögFÝ mà%±ÒÃfsï ¾Þ†ÆcRá‡1(½…VdÃ6òwsØÆ/²®OèÐÑžFV$õaƒé­òĹºÐ}\f×Ó ;tddþn5}CdëÏYܲƒÎ%Ö:[‡‰·´Ý ¬Ž£\M�ަˬг›Æ¹‡ÃÍ�om>0²¸&ÏϲÉdŒ -_s±Ê ƒ{çÝÅ‚ æÜí;Û£�ÁyÇn)Ys\:ö_æÕ("lsëâ·{9ý~„?¤hç:Æ‚Œ,¸á9h�îÌ?ðdÙ÷ÓŠy©#äæ|¶+YO³¥k¡¾û[�È3$ÏâëÖE`8sRPE…6‹]H1!ËË”Qú¼l2IvÍ„("ƒ™QªtSèNgŽÛ}ØØ PNF1m†Dî×KuW‘‡Í›\IΘ`�ßpçíݼ8ô89®ˆS¦É1óü­Àî¡�§�}¤ ã²Mñ„•1'ïòÔt­šMë¿£…¥ª?ã^ÀWQ¡ÆÞ ûV¡ƒ¿¥ÓaʹÛpæêªk.ñ~í‚Y�¯lä9ßW'AÌ ƒ«t –ÓFîbªàÄ.�dîXÚ–”À2�UsŽæ—5Ìów #+Ç~”\¼Ði·YXR¼ó·¤"Ö–½šZ&×FUCƒMv—Û•j§/£§ÐÜ@ÞØ»hº4ÄD‰(Á�‡4LôŸ,~âz˜oàÆ÷Sòârh ·²kŸ"oJ£â²âÔGØ£Ö5¸#Å„ÿ_•64”ŸïjÁ²i·•k˜W·§"\O‰8gêäÜ{‚bû]â^ ŒÇåy ñ6©;þh¾ÄF³�™”öÐWdµžÈ× x1j‹{RVåhŸ¼0¤5-pb,‹I\¿‘¾1O^ºÂ‡sŸ“BÙõúu0Ö%��Ù=ŒÅî鬳7v}Ð"âÿ¥–é(+Yèn·Ë±r ÖàèYí�³äÞjú…Nƒ®ÅÔÆwµøgŒ¢ðáZÚ+ް­¸àØ•ûCpþä²%‚ßvìiÜTëgžBx‚w¤NPF[ì±l°áJ*Y'mÆ;¿mb;u½»‹’бð˜ß˜…A‚ÔNOti­ ˆ²øÌ@<ÜR\/ ?8ó÷åÑ pǼ8gø(ù> £8¹þki¸a0î íË6ìø†•§3Ž:ÛŸVDGhá‚»�º¢% E ×´;rhJÉ*6+F_˰ÜgÒÎH«‚rùIîwâ�…ÑœÛZOóiqÄ�w`Éô>úë‰9tR=n œ½îåɯ“\ÆFºç߆G&–Ö‰Pٱ寰„)<° »šÝărWr77qâmbÈd²¹‡ebûv^[»wÇ(·"?†˜lQfÖa/�ˆR üHVv\x*º¦’28ÆCcßAZy§Ù�!“D�1ì¬LÀàQ@‡Çk!ZГ1²ÄÑ�äò/ì¨Û{"ñnÓl˜oÝÀ¦²\ð€ëÏa+m–ü®Ö ³c†Œ÷�Z÷Y5Å¿ð­¨×`ÐRž¦uØ”�0Ñ Î›\É@†ÏØ«ó…£{ØwÛ =²�nlä¬Ý3ý§á+|Ûƒc¸•¼(U o²¤VôNFf”èØÔ§¬ƒ¤ÿ—6ÓbyÊb;Š6�$7RöðVס|U_“î�¢.;’”æ4$ÇÅAaþ‘©eŠáH3`�kVc­3³Íè×l¤Òº6D ÆEéãË[Þ¡MŽ=Ñæ–$·@d¦x ÀØ5*âk”âx} šŒˆºòA8TjÇL °ùuj¼�Ó^ �¹ŠÓÛÏö?ã¼Kù•„RÁêí`=ùú¬ÓeH¿à?ù±¿†D€‡Í¼r‰¸I!O¯ ùÿ$€Ê’,vÎýœÅ>õ‰�Ér«âÁ?~ò¨lßåÆþØÇøcq*ª—Ú¼æýÀP¶GìÜf>ôöÿ‘t�ªOθ¹c‹\ “•-R_n’IY·EÿƒFצ*‰>0¨“„•sôL®P°ýÓuL7i­¨¶[TŸùjíóߌ×ë>¾nÛë|ÝTì¾YÉ ˆÖs÷Žçϯ‡¿¼Å‘{Í_š…¯¶É‘]0?ÎYcÿˆl¿âÞK¶ üÃ+œ%6ÍÐ`ˆÚ·z:ë-&2ìOܾœóS�Ì.Ý�ÓŽ02h³Rƒüÿ¾ýÝN ˜Á-Ëj�g�¹’É<ó'ôk„Ú×(—…Ö™t36\ãþÕ­+Òéžaob»Bä·Ï�Ž\¤fw}>ºï Ø\oyÑ qaD’ò¦¯Îj%«o©Ò¶絞ߣ÷=Þ#�âf$·7]Ô¿æ÷±óþÐ:Ò\VWZ)ÅóM›±Á’S¥—q7ÂÕFI-e¯¬2å.CBê7Ö`®di^•ÞS‰J½¤©úz}É”ìv£3ó,m*3Ž»³£Š"F¾MÍî÷мäCþ~ýzȤ•Ill©rÌÌ'}áÃcj§HM™¢œ9;ëÏHFY×ì_YC8Ÿho«§‰]p©0݉=çjw1Im„ÙÁƒÇ#X;«ÜàÌ«l‰<¯y Ÿµ–Ñ ½û Ò¹.ù}Åå¹ySÓtƒ{ÑB˜’uæ™Lõ�§HUûƒiáí²ÝR¿ÒÅ~lóªÑ^M_b=(Ïyn3B‘×PµÿÒ"–^›Y{Íüv–m"o@ñþ}�¾:¾…{äÔ»»ˆÃ!\°W2?é6¿¯¨\pÝ"¾²) õÛ¡� #+ÖžS…GzwfºÏ»‰³âe_ ²ÄHÄgÉžàMÙ–;A¨Íð†“ ¸±Â»mu]Ì^SSœ•·š�…=6)á/­-f]°®Ã*À±«ºŽdC–I5s¨Ò·•nß�Ä-Âí±–XKeòšÑÑ"Bõ�U÷·½§'�¬EŠ4Á`‰g© =ã]¾_2sÆÛ�Ú1'ásL1, ûÝbH¯‰ÝÔºj…{’ÿeõb˜ìïÛÂ@ØUáÜú¸w )‰2îæÝÙ_²Êstº¡¼½•²{* ‡\ÝÝ$ ì]!�4¼Þõ8J"ª nßB¡ô‹:‰E4v+²ß(ÅZª¾pR„h@Nî¹pešÃ1ÙÜ‹)ÆDiŒ5ï£NI¤Ò:zë½Âl!÷º…>â*×Xa’ra�û©ïÿy230·ì>¿eD‚ùÂTHGC «‰BAj"˜–�—ñº§êÊmße¸¿Ëþÿ¯èª]—gå‹êÙ�ðÐѨfÁó—÷O< ÿ=»°@ˆ^úÁwEÏÖßM üq–!ÚÞØ’W üÖQ¯b†ø°1¿¹a„`—`Àƪ»�LA´ŸnÔ ÿDÊr"�r5­:Ùøó_¡ áµkb ‹’ßµeQN¬ÍX�ÀþRfáºÂJºPs’·ÀøRtdleÙœµ” ¾ÔÏó ûud'§Æ4ÀBá Åûµƒ‘Î@ûn 1 6Ÿ¢ØÆ¹2ÖݸØÌ›4àX<‡2áJÁíƒ#ó�OÓ® C'Wï`}"©À'ñ’Üħ,ÂJ(+šF_t³¸C)Ÿ1«ÏF:dV¥RóÇÔ3ˆ¸ß°It6È;:$Y€³33:–èü6™ÎÃsäÕ\]w›p\܇þo] �¶ ÂF�X“~À,’@ “’. • Lvúçþ´5ýÔHºÛ¤­ËAŒ,üYéÚÎ?±Ù¿¾¹rÀd­±“Z†ÃE…³5ù“¼É¬œ!Œ“×¥\=F£ˆµð…mÊ‘ÄùSI½Ìc ¸²[áµï¨b¼&/¢œ°£¹\�I°áh?\íNÌC¿Yì(Ž©Ó¿¼ �M±$§©·ê)äddÁ”|Vêpâ×Ûë–’&)ûÙãäó‰?}´¥ÝÇô *¤áZÌrX”¶&Pž¯ÛB. ¶¡ˆ¶bWf8£SkÕç=i.FrtÙ'ª¹ˆ�Abº¡¨P¨ìÁ«Z|ãS¥ ,Ì^Þ3ƒ,3œ J:[ŽÖ•2³�–ö›|·øÍë×¶9ö¦ÊåvGóƒí¯Ñ|Ö—ð �ÝíW`†l]¿’J㦑ž£‹|{9ᨢ»˜ÜmË´ R|C§ØÁJùXñX¤è�ã`íëfĸÏq»Á ^�¸0˜ø”ÇÍ ï°ØŒ°¹ AõoY+rÙ•$¨ Èìès¨èýêÜ‚!i.ã@õˈÁG¥á¢µ„ox³çW:>9!w´ *3Ҷݺ9¶¿Ø_¯¤ä¬ã8¾ímò Є“Œkw~«çséVT.6ÒõŒ áSz¶ÌÇ5gUŠø¬M­k5�ÜöXN@’:(‹‚K‡ÁÊž&Øv@Vö�Ùe±ñï�Îû|ª‘ªyŽ©†ÎNs�gKp^šaQðÒUÀ[Xi3‰[ֿگ˃Ç~”»½ñèuÁiê“;à¯`!É ÂÂÑÊ@!ƒ VÔ›¸ZK!}Wþp{Ëk/nf]lY ˆ dø0oïìj=b3ÊEÕá~8ì‡m¶Š á}ެ't›~¯(å]IÁÁ­Œ²À/Þ½Óºqm\-uàj÷Zf†¡Ì-y‚•aÜÇ1Œü„Hv?ÄZº+ ¬1´“ 4ÊOâ"ûôUâgÿùñ[¨D8¼T*œ…}��‚cþCÑ/÷³žÿNø×Æñy ÄÁ7nÿ7ë€fÍ·•þ³@E†ƒƒ<îät·”¸�[ÎßÄMŒØÂ‚XÇ®¦xÚøcÇ0ö¸Òxƒߌ#¡ïuî}�d)›æ|ˆ$ê[EJYº!Ÿr¨œk«^›c`…ºÙßjØaÚGÙì}[‡ÖlƒÜXè”+*ê�òïÕtƒ�5sU�q¡ � ý³š¦¸ö×+4È`Á=ÿùõó!(X-ä_`(Þ ¬—ig¯†”}ðÉŽ®‰~«_ò×£·C�Åú0¨1ÅÆ>Ás$ìõ»¿JK¦xhíñ³ƒ©ÝOj*²»+­�±­–‡ŸX®7Ut÷„”C-,ÂÚ�®hJi™‹÷3Þtøœë¿¥ÑÙèXCÙèu‰)2�àÎÙ-T �ƒIù"´€0¹ßE×Ga¶ ²Î^Lï"Öºâ7½,e›dh†æŠ7fö„ư»„nÖã®a_lÂXoÄYë:oÞºë·Ù\(Ò · Åç&lª[…J%åÚLï.:¼‚:耮Ç‚‡ÆaKÄ�·jãÑY£· Û@$.?Œ=…@YÛBð·†˜ÛØC ¢È+^Bú�]í*h Ä—‡äAÒ°Á2é¢Z­tƒ¹&ÜT§:FÌë+¼Ò]Glˆ\BY¤½¸&\!7ëÊ‚²ÇçŒ8\ž°k�•Ì¿çüÐí2r•©¥kkr›K'V\*x�ðÃ7¨:)Œ2&ÿ2—ñŽÿ E_OÂ`‡y‡gé¨ö¬9‘5Ï…,K2y$ÞnAI^øóžÇ9E÷øN¼ XNÔ¿›ƒçE˜YûšÃ•±O~ q`ZÉ80Ø+L-Ÿð‡}�U5Ä75îQ³ÜžXàéÛß²rÂ'd¼�ðy‰– Vì¸ÍA«Þ÷j‡ ’ߚɄ¹¸÷s6õñƒâ\j†Á <±nÄeœÕ˜|R…r¹Q˜Y Ýcs²­êÔ–k6§˜V&ѯèŠõ¶›W+aÔÆ÷Tµ½†Y®íC»+Ø /p< fÕ„-G«Î1wÈîmëF28�Ö”p _ààxHkÜ$ÁüUßÜÖ¯õʶ.]aÒnl\~!}XMdóé£K/𺜩�J>×'Ç #„'òa¼êL) [O\ÃÊÞ¶Ps‹(‹PÐNÝnYI¡oO(æÞu÷äçLØÚåR:¼ Ìîßì­mÏØBHŽü·B+p¸×øëdF­}ªtÁ¹‘Þ8Z™²Š™>à@ÆÄX¦§«µBÕvk´|Bð5ÄÉNYH V̹°HP³9E¶€Âßjn"âál2&á´WPä>QWúÐÈ»tº{Ó8ßùû¼ÈT†�ñ íðáV1}®·¸³–ôQT5¤`±"*EøJe¤¢áñ8I ¦D6J£",Üî†ùêj3"” ŽEªïAÀRµ‰ŒrÚ\^|¨7¢ÞÆívÎŽÈ~1%¹: �_²”>nÆÇ»è‡®Ï®°S�̆9à®*løj-¡¦B¦[O}ø¬x߯¿odDÏIÔd¯_Î1Ãn7HDBÓ�!Šñ4&Á s%a�bØ€X^›,HCVØÒA(�T¼Òd[ †å lˆfy<´ƒtç{�žW]¤Øö¯¡†³vîÇ�š®s¹ºÚ¤tÄÄ®&Æ ×S+ÑŽí‡gô¬BÿQP–²êHF¯É¼èkÝõ³W¸pIîAŠm·É&Œ]:Ÿ¬*ã‘lm l¿k«< ÙæÜ"¹ƒ#1Š&1z)Ýã©^M`Ƨ&£(SNã~L+ë7-àö^Ä¢‰9"7Q8`o.…µ]Lµc Ì~ø11[äÎ;‰/¾ž½ô Xò‡Ÿ›«™Rmà‹å†Ì.'X?™�Þ¢í·õ$ÿ÷ÿ 2£sÜ÷=ÐWcÝEJ¡%Á#d —l É¡  Õ¾\Ž´¿¶×ók Ñš Íàõ<¶HWÖÍŒÜ%»}�çaêÎùιÁ·¶#�½ÀfÎq˰‚I²c�ÒÐ6-ë¾ï¦Öqa!ÎÇžÈQüøÚ¥Ät¬Y’d‘Š‘3Ó½jºY+ ·Xñ«Ð!B%æ0ÇYö¬‚‹ÛUº6´ Înù´£L§lÜ]>-­´z.•Žƒh(›Ý@< =Åõw‰møð“ª]^u\-Ha…\]ßzIA¾"ùáÌrBlfOÝCCfh¡]ØÇü-œ®Z£xW\>)KëÙ<ß þÖ%¿ëtGÌ«)Á$©3¯ò<tä÷{ Ž{–h�{Þó É¡6óZn2L }ãÙó¶â OÒX�êÐ7nýOmQª Ç�³¤\ãÅ6ç󨄍±åá!¿ü° ÿ<Œn®Ø)o³t(¤ƒfÛè�¡ïM]/¨Â®W+ñ/ìrüib�$/ÛÇ×QZzsM±m©éAò‚r^3�áù¾bðûÆ‚¼¢I?X+»$3 »ÔñÑû†x�.°Ðp„÷ºNóßÒ‹I‡¨ìã’bô©‡7R"ö5›´g8,A ¸;ã¤uBf­D… ±˜º^Ï1£áÂ?ø«T4#fþHãžßE .^=ùòî}KsÔ´c^+Ï1É0@™›`ÏíË1Ð7Á`+^Ä·4ڎΰôÑ:ˆ—Þ•ïDºrÎó«Ô¦ð­vÁí7¨5®–¸x{ìÅÕ‹…1u0ïÍŸ0ø´è§9B{äÓ«Í^Œ±©¨p�‡cXÃ^¤ˆQ;vE÷%KTN*î²tð²9‰éLV�|OuܳK#hï³ít¦‡¦û͈ÁCÜIh°Š#6÷Ä)Ü|×KÄ•òàâlì°¡qÖ%xþÜè¯U!o o|»W<ý;¶#žÇŠ_He¦D–æ}�LV�¼CAP°{æ£i¡WôJPÎJ)£G,Mc¹ÊK>TÒâþJ›”-êý•<3ÍçÄèF¤M’GÁ)áwsM¼"¡Ê¡¤ o´y|³þXB%«´ôÕ _+ÈZ,±RÕdêT#J³â™ðÊQNª¥È«U êÝ&²Rn½â*Ëa�ÿSm‡(ÏhÉà�/qóP‚3Eóå³W¼žM�8Üš74¤1Œ;«@Ô³7õSPº^TK#Œ‘.‰)CÜJñë±`•CeÖœÀE¾šØ+¶³ˆ¿qÞâøD½nÔ줡‹kêdµ“¬Rè—/X|=ï2…¶Š té ’é³ëó7 |Ú°!7%E�¥—wàGL)›àŽ8Î/ƒÓ\µžèª¦CÑëÊ9£¯\wˆÔ˜hÞ\nðìN”œ§j6) Äå,Ååe¥„¤—2¦[…g¦EŸ�<¶™qxLJ×(zcåä¬PÐÔ&¨Pýã'ÙMéK_þà†õ ªŠ ÙÊ)”)!˜g’8ÄTÎHÉHJ%äïÊøw�ˆ;·8Ûæß>KQ/w«¶h> Ä!—1¢‡“œ®‰j3½cð×ÈaµÑš>cФÙhdµðŠõçñt£:‹Æ#M.ÚÛö7™•©ÓWžãsZ¶ i«^Øù/O/­b·ã˜ÀmƒKïОˆí¯Í±Ooí·­]­§ù ÿ—i³ù'?QB÷éÿçÏèªF›¼þ={Á~~\P©§×\Í’w2§¸N…OÄNñƒä„)ÿ^¡àê�¢^M¦²àH{ö‹š¬õàôÚûü·³ïl©REßöcŽ:f½ÿ-³ñ¨Ó�_óÑø~é œ´Ø¾*‹_öÈ—õ晡·Jvbë÷àBh�¢l Bµ²5^ë·· E¤¸šqXõ" &°8ógêêKo´AkhðŒ¹6YëÊ—¹?÷¨ÙB'þ\/QX{`¯”¿Î¡ rL«DØŸ¥~¿ZûºnȃšÐúҘљ?7± œd& Â4 —ø†ý—ZßRú²tܹ¬ˆ6@¸…;Ž5/xàPzƒh0C?{�ìòÜÑ#m;Á\S6[âéÇPP«+ �›ÄpwM¨þ´ ³ofFF'#uýÄ>cOy  ¬·¬÷BÑ¥!ï%­’_¿’509zNiŠâZ+œùß³tµÇFº~·ó²!¢3ºÚ’n/ÁœÜC¡.¿÷{¶çù^Jú8°kÍ’ô’´$Åd£…txi¡]ú„o¹ƒ Ló¦ÒQ$][{NíC¼]¸2ŒÑ T^ÆÌc : 7º†ùýj€›ÈM/ˆ3j@á‹VBD^ÐQvK§<È�׸>sPfÌ»¸¹ðd¯™ÎÚˆ¶XaÄ’à…,”¬è(øcXѨ°/ }ÆüÍš/5õ#‘c¨kSåÉ0å«©�!Ú¯r|Ìlg8­ÜœŒLGS-¶ä|25•æ4±Žá%”úèC.’U�6\°U�˜Ò+~·svÐ;F�Z‡tg0÷êÞ£c/ õ¶-joÁd³»o9×Q`ÞÐv"«þ¡ BÕHÑ;XQ\§„dÄ*ÝI·6¢! yV3�q��/ν�4á·_¹˜ÆþísuÀD—ƒ»ÎŠ8 úêeë’�EÐ2¥¼�‹© Â/¦t¸Éª�ç»-.A²v꘲øðwÔ¹_2�ImNéÛ³ËÓ',~÷<¢¶™á&Ç–ºK9òàŸXÆ×Ëðƒ“øòxB¬áõ¼æÜªÎœhî‘•n Ç(Å}j~ ¦’èSÀbvÙHÞ�þ,ïþ@ÈÎ?´š¡œ…fšX�X2Âx/Èì’XÖVÙLêWOÖÁ�73‘ë¸ÁIèa€õ“�~ƒÐÈ@ËÕÅÐ_7rõŸð¦QPéÒƒ€º"ÒÌÍàÍsñuÚsÜ¢�*KF0¢ >›ÊVÝ#�ÆøÌB!Ca“sˆáòC¡w·ÖÌã8Ùóá–sÐdàâc6±Y¯#ú’ <ÐnÀœ€ýâB�­HI\ð±kìuà%Z„×XƒryO¯ô¶˜ˆ¹aÌá°1H0A±¹kÄZFœÕ{á�sŸG|SÁ1Ææ÷÷±Ó²xks÷�PÊ5ÎΈRÛèõŽ¿AAŠÑÍíä6jâŒÓ¤™xûŒ*,fZiuúñm(ô(ÙŸˆÐ.ãéêä'…DÄø�¼·ÜKÕí²Øm½™b¿v軿Éãöç7=ÈäoÎhtå°C/ Ì¥„b}k �fÖÄŒW;�«¨åÔ'Üû�ø4?ÀÿžN”ýý³…d,¹Á»od±Ê•ý#òŸï³ „FÿË=ñ÷Ìc®qyÄq\å鉗lÌŽî±se¦ÞY ]îl պάãXG EF�îÓ“ãÊkšÁ˜ê™k²§æÓ&MÝEFQ”œÖ Abð×¾•¿£Ü}‚ ÆaÉ�5ôåü|SÀ(ÉYÎc%íPö¶1^øô‡õÀoOÆßilÖq#9îŠ1°i–m|ö¾«ýÓ;À.ê³+$ÚÈ-�@œÑÙ%‹­ejá®âp |@ˆÁ–3sŒ6OÐå iS¢(sëp¾I½ocÐt*u÷sqé%.üº†Õ6 œ^ðŒ=ÐgðjQZ|ý^²iÊÜNYmÜ©€™¹›·º7¸§ŒF#ÀKšØÅj3v$ªAÚë(ÏÍ6>ƒë貦1KñÁ>"îÁ<ØY\hV õŽñQäQq¹UÕë.Ñʱ¢5M© )ÙÜû°±W,øAIUO}%òÊCrxB¤p�ž7Eõ”#0“,F0vz³¨P†Kpì¶Y‘ŽÓײ.é2Vå8úàp‚Î-‰°ƒxhKV¿uÛE87e#ÖX'†Ü²ƒ›ÍÉsŽ9ï­\Í9æ =¢]X³¢È‹YH.;Ð*ÔÙ' ¥ç›Ú®úÆw‡<íÐÔ„Á…“xæ’S’²ÖM(Ñ}ë‘;“:os¸¾´èIêù €D4G´\¢+u EîÂ÷©–ÅZl‹ä𸽘·µî3»‰X€K.#SLˆP/Šp¼&=‡ÖPg4Õ”+Ü�µf$K“÷×]idz´Ö£šs†Ýôšeá½ ä^£‰v=ËÙ¹}CEÌçšóu~µ`dg�…ZNŸöÈäÛ`ôM5of€Òjñ|û¸‹e #ÐÛýzÚ^þ-BÀB+‹cV&j4Ö¿^Ù}… Òd€Å_^ ™±Ìa?¾¶l�?p!3V(«´�Ô¸R© QÆÕj|=öΦ+–÷0rë‹ã=¹_{ƒÛö<+Wá—AÚÉá7KNAèìë6gðq|ø[–4m%šb0Á3–(*p´¤Ó�Nm÷&‹ÊV—ç°í¶n%²¼²/±ñA(;ÿb�òŸÆ2«—ù´T,ùÆu‹‚†;4AmgþR×rù³îP”s‹D3¦Ù�`¡Rb“ÉLÒܾk†¹« ¢Xóán¬4»æ©xÇ�U��ËD"¯… ðÔaɯ¯l?K€¾éÝénGûLÙÀãý�‚´dÐõù[¡vØd°\!‰-nãèÙ‡$,Éâ ÿ$–ÅÓZ?ÿ¢ˆ®v{à&Õ¹l}#ˆbK¸½y#Á†seªðq–W¨‰ofní·<ˆxÕ1äScqdË$aˆØ ÃÜ…>CýÜÞ店B’!Y»Œ/P<æ8›Æ¦’åßkžcnã²úÁi®ó¶°ªŒeCH¡Úd-RûÚÆdÏ©ÉFp�îsÃRÅŸ ÜC‘�¥¸IÈȾû{F;ÐÉx ÚÑp\d"_‰o Õ×Ï»’ÃŒ_yÈ}<ºß�!Ræ¬DY¿Œ7Ä> RY$ƒÖ÷ž>]«xÝ"ÕQ çCýÿ§¬}‹Šo¯¿�²l§7!^{6 Øh¦�t�A2ÔˆÙ VÚüÿaš†¬Uø9Q ÉIéŽäóãÂ�ë¥î;O+l=ãå�Ãd”sC/æàÑjÚôÛ+épI­û¼§7ÀRÎÙT¶"+Ìïz:Ùwlë^¼ó%‰Ø›™YǧVÚØ+ÿÇ­~Ë•ÇRˆ…É:é­9Œ&Ù¦�»6n�¿/p†háÞ1©¹Ÿù!ãå¾iINs³|²€âòcBäœÀÖ¯ùpô(h³ùÂi!æw^�5Îáa &…\ëÀ Ÿ×™íñÆé�� µgbä¼a—íÝŸLá'�½Ü¸QèÎømª,[#©yÛ"Uo*…>A¬’öü|O{‚(‡L{”"qËÁ=ú×z¾nWŒèŠÂ/:ȇ4Ù$ˆ0^ÛÃ[ów‹žö±Èƒ™\fDcn?{ÒÄÔïöú&/«„²[ 0ãBW9iÃR�{3½§,+0Ýïvái¯”XÎZ‰”ìz�Ý�@é˜ÀZíÆðƒ7èõ3°Þª6+qîò¥ßMôUï5maúÅ#"¦‚wˆ2¬@�E?G%s:ÂðYdœñ�,6�úÿ<åd.kÎÅ�º˜pG„LE”aBVz9†gL±”Ë�Ž þ¥�ë&S"@lŒe`�6ËØ†Ì„gÛcʋ떵ÕÆˆÄØßdZÛ°c<ìÉ:|ë•÷~�W4 h.&‡mZîÏö{®ÈøTZÉ—c >�U}Þä¯zÊ1ß%Á°NCm£¸©Œ&šÚb”  DGáö´¸"À,™Îå3�ô±yçM M¹;7‘-k«Zà¬��R·cë^烯rÄ¡†-­U¼‰+\»|8ùeÖõú>%ú†ýq`â¸ÌsìîLúú ·½T´óa-²µ–ÄcQÔíD–™ql×C†”Ž k®·ºÅžÔ'lg��[¶NÔµ™6Ø.Ïnœß—º�áEECDB¸»µà¢dû‘e¡»Kœ\åâ içsXpê²+’� ‹ÆNÿWÅS'¡~Rè�dn}/eŽR‚ƒã5=¯©9 '#®8^s‹y��Ÿ¯àiØ´�óÊ’">ã}œ+ðUçxY̼ �ŒLðdcUN˜wŒ‡ñjïkìÃdgCãøp­¨’ËÅÉ=õ"ÿ|­r‹Ví<ñrãU®ô(aS¸‹~®ÅJ_XVÔÌ{ìÞñöøæü{–¨û”X'?ª´ì�O)7âßÐHFe¡Àæ÷»ß§lX˜êâñ �±‰ƒ"Ç%Üü’"õ„6º»f²@øÈ…Š#g5•ƒòÄÌèǵYÊà{ÿßûýÐÿ@ ­+ý¿”?‡´]—tgãòÝv¢7¦î£ùš’Lý§“ߘMn½ÜN„0_ôóŸ‡ôÜúŽ˜aþ×Nû�x�®Ã�ú^ZÁ¨Ûˆ0#’ 0­ãúÆ9;Å„óeßÃùŒƒX½/®C‰ÎÔÓöPÍóWü5à5W¬t\¹ô9‘?�Òí°ø*t=îí÷ÐiO!ÌP©cå¶Ïšk]îN\í.·q¡\„Û÷‚ƒº­] “_ •”9¢fÌ)$ŠhøÙîŸSŸMlÍ�·î`_ªÖ�÷¨�·¬cÚ.�iÖ2xˆJ8™�Ò´éšn-�!}ÈÖ®Ù÷ â¯ÓÝJ�½œê°{TéYÔA;ßyün%81z¾‹¢¿ÐRž´�#÷Tyí3©/mß…½ž½z仪 7ìŠ>�âéÇTƒ›¢Ó LM�2îÌ4q7çX-kEÉå5ÎÙÅ ½•.�‹ç­é…än_.4¡¹¬rbãÛ³øzÍoz¥Á¬[½ø;*2ÜB f´´¢žòs¬ƒmHÅÒu%GãgÈ#km1H2@„†äO< ·n2*xÞÉ=ÃM�fW5[ ~f{™A�Îñò`-Kž?m2ÖɃn\…ºõ·˜¿‘³ˆ°ˆ<  •Vº ¢ƒcàe+tc¹M ëW»øBµ[þ!ë�¢» W;.ýao|¥ö]�¿,Žo!¼ã°8EÞ±[7©£Ý%@`ÅCnüˆ±ÊA¦ÕâÁ»È% ()¶Ëk2©l›MÍ´{n§‡IZ£3˜Ê§IR¶ ºYÔ‡øoq¡§(ºÇ >…ÉÏ&Üw8×6¥ìRc_ÒHHAõç×טϻø¯ÓÙû_âaL{ÌÆcè¢@ü}8ýhê¶»ù¿¢û²[vkô< 6À‚~M¬¿f}ž˜Ñëz|ëòr"öïCG ,l6†¼ˆ| ühDÀŽ�ÿ8ß›rñ__LÙ„EŒì¬·¨¹s´ ªFeäáW´È|ÇÚ·úÿS� ~+âÿ7óCZW÷ý¿ŶCB‹àAÅGj—å„°i~EW˨`¯ VÖ�x}¬UiPÊT~a†SÂw¶Çc{Xsuíî·Hâ1¼ÚûDI]åUÅ÷ç¦ö™ƒf¤œâ�Ì_…BÌÍbr½Ï×å�%êÚM”ÌG0[¡º)qÎŒ ó¸KÃ5VdâláòŒÆ¥`àmS˜dÅJ²™mzæ.«…/Ëe‘ �A•s‘Y�4š#Îㄬ@tA ¹“(„ú v?¼¬]ª(„v¨Ô”n•ä:["òbgÍfj6â‹›$½6õjw£X1ÖM„ýXÔLI ¹/ÊmÞÄ |‚´…Œɵ£]K;e7ål¸+V40‘ˆÈ¾Æ+†ÂÉ ’žæ·¼Ü¹æ%†1û#�ð¦;Ñ«.±‹Xø’èÕ½Kà+‡£ ÃR""=è9¥c@jö¿€vÐ^Zë¯rP†Ï"AD^_F®ÿᯠ)º÷`¿nWøÛ¸¾ÈÕg ¢ ˜»32.E¿á¿†"~ýœ~Z¿xœò³žU]‡0„f4n~ŽíK(R9cVJ1TPçº �xC|ï)÷~ñ=aïˆKY‰mÂÏ®1"Wy!ˋ۲³V·Ø¼žùS¶Hg·ªÁ¦Œ/ÜŒð¿a.]^Y¶×|©�)wqœâ3�t§~‘Sacæ¬dFÊáh Ü›“®ðÓ)Hà jß§ò~-_¡�2\o êäðòŘ;ìÀ=cDø[e�•b—ËHE•o…´Ã)º"”0’Ê A‡�35[üeJ ô ÓšptØB „5%‘8Xy²†µì \ô"ish··#Ö©µÇÕdkG¸¼ÙP«D îÝxƒÙ"PÎ/(2Ã`OÌ=cC'‡œrµ�1›f¯Æ­" WR´E|�ЙúÚB(($¶6’оR-78Ã’HMÔØ‘�†1hke·³Oü—iœI&Ñ®Ào£c$5OŸ‚ÌV?‘!Öø<ÉâÄáÊÑoß0UµôYsÔ=Ùµøü¡¯lqYì䓘þGh*]U‡ÄZDó›·Ñuo„è!ç‚'Ú%ë⹊m¹�d®t(næÜki«ï¨·A‚ŠÄ.ƒRt)K{íYȪR¨Àt«€Éü¥ŠØSq1f½þˆð ÿ''éäÖæµÄs—=Áµ°ÛvNÜÍ/È›ìUÍM’FlÂJ;.C^Lî>šTÍ]•=qS!^uÜ©y[ǘ&Š ìØ€ËKT sÈèºðíõ¡zTN‰š&ñì†Ù¼Eð,2Â)Û ä4† ÐjÛhB¤`ÌȆʩ WƒuwjûS ÚÌÝj,Nº÷)nLtüBáÇòÕ4’:›aRPB>÷ß­¹^zäÛ!¨;|ôwá‹eb?QøÓÔ‹‡‘Œ(¬MñT{þ·WtÓ_¬VÙ�°(M†ðÜà¼~ˆ†›jx�¸¼ÖÚ–½ko$¸÷ä;èà�èσÚÇó =ƒ÷À—,´ðÑ'óa­1¹vö¿KÃåna»òÊ‹Îiu!Úãà¡yûþJÃöhÇùàaPò‰3käᤊéþh g‚ÅvIí*Ïb°;éTF.Ô¦*ÕßË<â“ÕcZþmtæ]Èåó€Åkn]rC�?±¿�¶jgÈh¡ð .¨oRÎÉ¡�‰ºý¬k˜‘Ÿ¨÷ZÖ(q%›`p20âB¨È[;W“‚€ç«b>HÐú{À½wÌÌAϨ. hx9ðì[pšÇ“Ó¶TCfÜ´rf‘µ\ɽj wýãÖÿÔ…a£sñ^Ëò¤b¨Å�ăœ¿ßÐhþL³Ï‘n¤óÙBG£þ’J€+kðÆ�Ë9ãH¤Ìç ò�õþ<}„ÉøÝqœájæ ÜœÏWsþ½[ª`w‹¶¿>ø¹SŸÚÓÂUGŸÐ˜;r®`~!›Ø÷øu¬^Ùòtƒ„‡Ê‹ÄCWÖ°€tp­+OR”E/l2B¡ xOEš˜C ŠäL�Ô3bÙ´u©9̱Y0à0íݵ×ÜU=Íëmß%âþÈ 1eø€ñmZ‚®·œ¯h¨aù wc„²¨T«–ÔŸ=éD[’Â÷Ü´P|ÄAk3`‚#†I¦�dšÑ7²°B~Ümíí«=˜+]ü­>åЭ}ô×LðO‚åÙÙÈšÉY¡ùÆBÛb–Cy‡×Dé1ÁžÕ, �N¹›kx;À‘ «0 5·Õ Ti°BÈö�ÉJ�%«�³X `@È…P=_-¬x”æaxÃc½´Kô]f ÃÍ�Ñ�|¤’I-b¦xÚ›bôÆõë^û6óKùzÛ~šå‚ü/¡’ΰ5<#=ùÄG…Î ±˜ ‹ó: DCC°@pŠÔ�A²‰Þ`ìÌ ’hR'ˆ±™‰èG­à «z«—Iƒ9s…ÔÕøXË×î‡VÈn�õŠÞí# °ë‘øÉ?ä¤5.Ð� �q!þ }1;Î=2�fØØ€ÜŒÀX6r®ôe¾+„7ÄDüð¾(È„½ïD”\üž%[ ¼½ÖXBÏö¥÷‰ªÄ„&!«ãßZÀdÆvŽÖ&Û¶ž�5DȃÕÒ‚ìNžvÀvüP•À*¦mƒ¬áÝSÈäê‰sRinëɇ—³½øsÞ.{ˆE�ÁŠƒ–ú ŒˆUCÉåVf¢y[kJ0€¬ Ã(q®`<Œ|Û� A'̉—ÎÂO–¯]/Eá!µõ#YîU Ÿy:_ÇùB–3¿­»NÈÇŒ6¯¯(3Üä~ÊÓÀñÿ…z¤"©?¶ðáܱ»iˆrϨÅ”Dñ_Ý|bHMúøë˜âñNÐÅTDÛ�†Ócé‚3:dH>ìaÑ/¸AÆY/�ÍÇõ�›zÍl3A_‹³Î~²À.2¦Ìòuœ°�@�§õ ³ÐÚ ¹!k𳈖ÜÙ˜ÜÎ$¦!ªÔb{ ÐÍѵÙCë,ÒÈ,PaF9 ië€-”ÑÎâo†§b» šT eß•lġРBâ;ñ‚«[›ÝÊ`0”@rÇmi®Œ4ŠÁœ°%š»´J¨Ä ”»0rC´ºè¸:¾èŽ 'ØãHÍîÓ¾ÏÂ�,.ëÄk~z›Ä¿€XÆNªðù‰ykqè÷ßSáð½FiSÕß® $Xg@pm‚XÂîÃJÜèˆ5;©š<¸�ÊH­mÒDꇹ*ªeÀþ}x?ÖÖÒ|Aïx‹D�‘eó4(€ßìr_hV–J$¿€ÄßD0õŸŸàËCC�±ÿó½:b³nýàðÍ’Ã` -ì¶ö_bh› �>ïÇ Às5@ÆG �ÊU™Ó,RC"èö‹PÙã2p_ʬiN '<ø·ØºRoÝÓ"k¦âß"�ÜsV[|¥„ã²)Bƒ X3ttÝ,¶¦wˆ,a.ï¡ Xå�K u¥­±wÎ¥ s+J^èþ=Ë ÜQë„s“¼¨9 ¹¶w{Ê«6¢ �‰Œ¬ŸgdÉÅXþþ°’þ^Ôf4§;ñ‘–™ê¶ÄxNŠ 3…ë¨yîô½o�‰oŠ“Ý2Ü£ó½rDé¡»G†Ônœ¸à=‚Ss?Ê,jÇo;dwñx «­|à>›Ø#'³A¦ZÎÉFÊPÂ$�TbSbRWFõËPš„öÒ3u\é­Œ4äÍÈH`¹ŽCå½±�دÓZN´ªŽç—ääê0Ãv~Õ‘�Ù3Àœ†M@]\k�CîÑ‚K‘˜R½ô)ø·ÚÓÿ\Xh Ûá#ðÁfü …–ÊQ2[òW;QÖ6ÖÂͧ‰ÿM&,�jí ÎíöY*Ƽ՘pk½ß¿Ëríâ¾å™G»‹Z‰ªÝåž°¦BcŸvß ×;>ð�04µ­ýQ\ÓiŒ­�ÐQ»šïŽ“´�ù„WJðíƒI"#n´0q^8­åʦ­½„ƒÛjÍÑÜ '=†ÏÖD^š©2A÷BÀÊÊ�Wm¬ßŠ_(g¡­böG:S¾D�6hÜ8œ“©]Ë�”ɶ;U ¸ËØõoop&Ã�VåÕU8¶JªNÎ3RéU1¡‘µM…x׸6{*©Q˜ À6!щi««zó•ÌFö@¢�žÂ\ki¬ ��Ƈ³ŠŒMš8åÙ€ÍÃÁ­!Çñ,•SÇAÖ€º’ýœAtN»c½ÀðPMM>­c8dì» ‹ŸQ/w®�vóE™̵¶ÕW1¯WA}vùnö�S­‡½o¾ù€Ùrð›_ÓB*ïðÝ­žùÞØ½÷”œû^6`­c‚*!ò滲4Ö›Rq“¦¦m¼¶k/mñk#Ñ^ ûÒãuÆb¨ð¹~ s“SDþF^_ûlöÌW+g®¿qGÖ[]q±Çu •w"UûЦÁ½ÏÆv"n(BÇÈ‹ ²´|x3˜Z«H/þNuÄñ�$åG1Üuƒæø'ÅíóØ‹ÙJ�·õç­¿\¼vÝËš9äŠxBúúAñ5p 9üéüûÂõû¸ü†§‘ÇE¿Ü�þëY°»|þ?¿ƒ˜ ’HÏŸ¨ñ˜¤y«×þ+r•q1÷ÐóÕ¸:I H]� öIˆŸz?ù‘ÄÔ@�kþþ›BÅ)÷¡&Ð1ÒÄÁCÔÌÍ颎F @ƒá÷¹´ËøûÖŸÊWzR0Ïñª ø'va#ÿL:o“„_aX\4¼¨cÝ Þ#EI·ñJpçzWÝ/§ ƒ¶Š^ÑDÚäj I ¥xñ9IÈYñ' HI‰*Õ¹‹Uq\éÇ.F›àJ=e`A2“h?ƒhøØ«Ø=!Zì¦C_q“K:„ƒDK�æ%"–Ebxx9T’‡|†Yíæ2C-’ßì÷NN2G“Ê‘d1’9öDh�fIü`„b®j.¬²µÂˆd±ž èjJ˜%¨wF"&8'íj!—pR.‹ê¥ÞkfH€¡•´˜"?àÑþZ¶¤²T.=|iì÷$³‘“‚šÒòcGd;P·°QIØ8Ô­*š  oåÃÓ¯Fgõ¬î.o‡þ+±j BÈÌ!FZèfª?îp°zcœ‰öxȾoùýôm³Rɵç\·ªâ5Ä týôöpl!°üp¬ûwíPýòdÈçøâî"„E%ðßÒ¦ `šäø‘¿êø�£EïÆ¿jÐÚ¤%l›¼¡ç$ÕXŒ†ò&A:ß9¾®­™ª�‹®#¹­&Ú²D:e_&· aöâÆJ×öþæÈoîµÿÖäµù�ã0wtL>¹Šm†PX$é|E%6dJWü£àPyAEGsFÕÐa¡¢m—NäÚ¶馇¹Îá Z<þÕã8Ýûn»’ën?—Rr^¦ÀwጪáI¾a7ljK„!q¤ì ´�ë[›}òŒê„(ÆñÏÀÀ¬"ßÊɱ�#±–=“S༨?;—YÜ 5uikÂX±w£ið2gBpNšRÅsêF¥UÛ×K7g ww–ð¾ @q¹ ïiâ¦uƒ†q^\ë¡ô�NYË6o­¾ZÛr¬um6†9R\ )ÆÌ¿FŸÄ8ŸäbŽ:7ÏÍœã\έ áýÕûá@qK¤UÍ×™­8±\Ï�éÜSpgÂë —Ÿ‚À#ÖÃs®0–Q²<¸+^ìOʤx5É¥”ÓGº"ïµ$5} Ýï¨Ô]‚rŽŠ’žù1òׯ�ÂYn“ KÌн5¸-¶’ ‰Í”Vƒc n8‰g( 6̆èz£ÅrËX8¨BP³ fØk†ˆ4¯Ý¯¤LK8E«“i Õ±½4è„3œBUq\V?[y�7*㦜“áÀ¢Åk, Ç*—™gœs|ƒ…b Mü.xñTÙÜÜ{æ’àé�èõoè@\^�ØðÿÍü«c;TóŸYbuðëψ� ÊtHˆÔüª3õÃQŒ9ÕG9eÊýÍëö`±[ÛþÞ¨bÒ…æ~+<¹ú Ö1dß=–ÏjÒ]¿õ£›Ô0ÄRwº{´^Õ5ޤ´Q¼ò¨!$4µ˜äÑò"©b{-À¸x’4î¨Lul‘ª4“«¤éyÓ÷ãiµc7Ðö¼ü„Òb&�.9¶kXì¿ÀfÑcv¬ã{@ÓŸ $ó‡÷.©7ÙÐ]OQÄÇ¿X1ÓXÆQ`˜›ø’ïï|¢wðþ�ß—1Ì.tIœÑ^gƲ(`î\ìM­p4DC#à †$ÓC2¯&"Z*®‰-sÜLAN:ß°ô)iñ—¾ôïÊIJΕJFì “H¶Ó»·K/~„E³éÝ¥�¢{ª£Iv¡;ư5RÙ€l7xP Ëi ¡'T¨(¬fÙú0¥9ƒÞÖ-²�g¤�VQcîܰyÙ)k[‘ðÿò m'`[çÔ‰#Gñ²h™pZCh¾5ÀP”°dõzÌäiChÚI .D‰4c5BÕìVÕx<…‡èÈÀD¾–Ûï2;á&}<¥ø5ªÙo[ؽfŰbüm �élvao›ûxÆ$EÛ‰/%slãl]®÷@”9XšwÉaY5Œ;geŠ)�WÏ®+¢ÏÈÈ˾&wÍl9KN§Ëö0�Ó¿êK¸ÞL—íÅ&ÊÏ]:º¢ShQ¥-UÔ�L•1:«à¥¯´Ö�`#)¾÷§á4À–n´:åʶä‰}Ü©ÙHƒ#±­¤×Þ³¨Á°š×òh³1Š˜Z¹VT×�Z©)lC$á1Æí×:5ZEZ|,¨¦!ŒäFñdÎ+XˆÎ'gåŠÃ0Á^Ù ¤âšy†¢æòŒBéP4ܬ.oŒM&6£e²Æ©7ŠFÕL¼BQªÿñ ºÔ1šÓmSIÅ­¯4|¹\kW‡”š›»„wÍâ¼ø$S-¾·n>÷ÂÎ.ô|0óBQáÄlذ‰U³<í.‰¹—9u]4Ê‹ˆSjúuLZôy×N7ÅgÿEfíqþ€ý5@¹~üÐU¢BIc³çúüõ�þXÑØ ËH‡Ï‡Öø§×Ä�œÜ4(?Ýéõþyú;êe1!Ú^`sóÿU‰^šLY'¹ÿ¡oý¼Ÿv|¦+�yù=Ͼßê¿§ùOï"QþŸéÞ{º|:¼ÜÞnC¹þß÷ ãôd0@ˆˆgŠ!ƒúzêl·Ã—`‚#"ÿm¡ãHLj÷6®î˜ûC‘Ð3¨´Å~ÿ´‘0?WõŒG í©þ3ádï8K²h홼–ßj}{Òü Ú=ÆÙ´éuµ×+›ºÿ˜Î'XôW1(´_ö…j¶·¾Û‡h°EºBª�Õ�ÉÊ´I8¬jµ›ã�|n=æû*Ø”Ü%E�3¥æ;Ö\ãm|bÄü‡îø¦ä«0m>Žî?1ÇS;jeî.:H˜GCQ'ò Õ@8×éüF³çtHÇpcÄŸ“nÿk"['ûI1²1e]à^XG­ä/Ð"ÏÉœãHh~NÃÂùÙ‚ÙèûLÚÙø°<<ôŠZß"%´{PrŒàl}ŒÖ¤< 1+p˜†z_— ¿½€Ulô~,àu\ýL1’�¼æM>-åò˜Õ±Û�vDC!€ûHC;Áý ©{J‹Û"ª€ži‘ïuEÒ6+ Ì DÑœ¦SzY½‰ûƒsòÒêÿ>úo Ín«7 _¡±‚Ç Cá»ù°XßÁõ*ìhÑ:†DšdM«T„ÎlÓ—0æšÃëY–JtG™ÖlØåY.×… Õ¾ƒ¯ü@d[ZàPL ,°Pã ‘�à�ØÝmvðÍس6/b…Öƒ‹Ô^À†¾Bi&âjóÏÃ!±þHbÕqñðßH Ïø þ~—ˆ¾Ö:ïV-&TTL4ž{?&ÓÄ3£ã2™ƒ`²dfú'@ÚÜ�ºÄø“�ùÞi`àŒ ¯»;dZÍ9J&E`´‰Šˆ‘3V ¶î °˜R€ÞÔæHé%†ˆM÷æ’mMH§gLÛ ÇÆAϤ ç Á€ü»q#­ˆÒ†Z hW¹…ffâ¯�ÐŹ·£¬û!]õ�o¾ò~rùņÚߨ&òYZ£› ¤e‡o¢ÝÚÙ²˜0U«ÚÔ¶‘} 9(E½¹º¶`Scî²ÿVÖÇF` p7ÂÒ1Q•”:ú” ç¬LÁ…p€æHu2n [0eá dS�7åkPzÏúË8ùƒá1²Ï~¦oC”$ö´ß ¯à„Gr\è l/p×ÔØðsy(%Nÿ«ØoEpF1Oô¦ÚvvÒ…$H»¾ žq…Æý¨Þ®6E}z,ß@@ $³¢åÝ;6 „.ÎüzÛ�é9t}fÁ}@Ó‰4óôÿ«ð‰†¾�Fe>»æÇëßrÒ�)Aiû�Û¯ëç‡X-¶ÊºÆ« ÖÂ_b$ÂB_PìoWÙß8Æ1zîÜí`ä@dí¯Çj+nNÃ3(¶¢ ùU¬ÂW•ZСX˜i`÷ú;€$­ñj(×n#@�ˆ;�`¸ç‘¼ÝG‰È\ÁJVtˆÌcím´I¬‚&#¹ObŠv˜ÙÙ˶˜ß¨ß^‹Z3D¬ ®±š�¯W±y†U“´èæ p’óÎ{Ü¢£á¥Ý6šÌ<ë£(e:´qNœÓ¼qA2°p–ð´ÄëCójSÅfÉŒ»àÇㆷaýaÖ™ºh]ƒØ%ô«ëk Ѭ)�^³2zâý¦Ó09ˆÑ‘މðÂé,zg�Ÿ4CЀžH4‚eÔØë ˆ¼!„;-,à_'~z¡ÀåÓ,£Ýã`oUȳ�Z·¹E÷ïZ0ê.ý’[Ò7_l.7æî*éÜÎst(ŠÅo2«ç+“ÄpcÝ ž(  «l1NZp9€¶©âÖVbˆF†ƒo£7¸›[AydÌ‚®€wЙ Æ@‹¼1“’~ qÔê3Ç£nä#~Ni"8óV_‹„’n@}Î8]XŒ³�ñ€ˆ[ZtÙëx(uŠ É,©HBTRf•ßZ”X¹½Ã‹&©ÓS•ruiΔ°qµŽÔR³ƒî�:Ng§AènËøXdSc©p††Ú"|Àí-ÀP[<êør ö™&·ñW?^%>3 ö¬ã×^ýîñì¤G'ÈlØÅ—ìt‹ïNy0ÁXÊc Ž »�>>gGÑéK¬MÈ‹@)Ï*×JlŸûÒYòX~ÄÖ™ ÃíºBCŒšÎù*ƒ¯âA±‹nÙKŒº# P²åÈÊQKÆÜÒÞ*¦œÝÃ,˜3Cd¦Y-ßï¢kžXZk–‡UÅ]ªó#‡0¼“™ Öˆø`+Ö”žŠ•ª.4ô+SÑ.–dã�ô9ÙÞ.¬3—ËfüÍà’âÀ’¶nM›`®ÁdºUEÔÆcs�;Ak„@\€ÁX[{Ȭz÷¿/ª++CzuÖÜö3evg¥Å²¹r“K¬a|ô?)µã8˜d§=œ†Aä3�g`®—'¸“˜  à@æ½ øŽ©Å‚ªy‚ DrFEÞÆu eþ Ø­04§ÑbPQbÜ%P|)xµ±ìók6TÅÈ{�÷{êµ[²¢Y°v±æÅ[t=Ðg I…gä©ZÕ<ëÛ˜¹x† ƒïÒý|µ÷�»ç†Jì¦Þ‡ó'f뙂 p�oÚÊш­Î<ÿ ú8†Œ2o_cšliu­à2Ó›ƒž3�3’fÿ,}œÑÔ”Äï@}noTýZgh!�3Œ@<ÌÏ-è�÷¤˜Ð[äg…è±ÕÈ8/…c}±µ|·q­=zÞEwVcÔkÜåÑÊà‰ ÒuTªŽ‹ûõ9yKÕq çQÂ4uX™<(¸8[SS3œCïy'Ñ0‚vRÍvX¡ßiŽsL�¿¤Ü¸^:÷ÉL¤zú™¶°ÜY ›œ2Bq»'à”pÁ=‘ÉR4Ù7G© `¥FÂÏ�«²aÑü*Ê>�’ZŒ<~~g©>Ò…êížVÖíaRO[¥Ô„Ï�J�ä�ø2„yx®×oá‡4rÛ2¾”Ûˆº&É­ÍÕT�4Fë EÊÒ>>Œepôysbcw;³„=œe^ŵHŒúxîO…NaìJÑØ¤ Î|°ìÃsRXdÛà™ÅÛ‚ Žä g^A°9ô}þL�–kô­)›{úFB?r-9Žh‰·.}GøKú®½¿*ß ?GùE®®~ñð…oåþ [a³j̲ƒ_ØŽsÿrÿ/Öë–7®múüÏT„îÎWóßÌ€kiîVi²ÎµÖF÷Kg'ü2¡“ÛÜ®¡u–]ÿÞ× ™Â_ÿ_‚NÁ –ðE�„RˆG‘�þð ¬Þ€2KŒØàc̓Ûlnýú&0 dÏÿ¬$_eþo'›’Ìmõ×bu:1��¿‚�"‘Þ/Ç„ �H>ð b}l݈!öN|øí¯°xþÊÏj&ñš V" t(m7ö„­kœ%hº3ÝË0ÿ¬¦W1õÐgCqUΉ…ÒfYÞƒÍ+tŽŽ1ç˜ãVpR�jö!DB„E-¬qJJ6Ä(.á§³ %ÏëéZÇRcÆÑ_ÔÃD¾€ÿƒ;` —+‚G5[ÝÆ=} %÷Jã)•ÅÇ¢×ÃZ+X9{\Q§C®ãOl÷w¤yöU“×® $®”ºO¶ ޤ  =CA¤lxË,ÈEÇgèš°3ºßœòÇ‹œ›wî‰êúFƒO¸¥ c圸ßÉnŸB(“´ö!`¬¤…3õ‚ ‚õt…ÚÜ4\cgªy—w­•|A7‰Ä#3™»®Ð%4#+‘�_ä~†qKS.f3™¨quï¶ÛLûî¦Í´?l ÛñØ`6©Tp›Wi ­ø¤¤…°Y$,¼E0×Q¤6‚ô4¹ÑØ;í.½9Ð�S AˆAê.S7Á™x‚C$E±Ã+øvÐè÷(;¬ bS˜EÑ[ôß 'ð;~�ô;Ù Œq¯’ÿ~Ž0@†5s0­ÙÖ�Xd¯õ*Þää ž¨¶Ä†­?ÁXƒÛZý—ÂþÊd„M¼…TצY¥Ë¸±>zfé’ÃV^0…€Ëý?Æí‘úX*Ì(2µöTœ—M=ÉOBØûZÉkzìõ´Yá�…xjüœÞW r†õÅ÷Ÿu1Ï[3‘î£7à+ëtŸÙs‘…ÔëÝó£ýå– �:µîçá úFÇ[T¹ÿÕFö2®-¾ôu „…�PÀöáèJ:Ü'•E  à ·P¢‡€™¦w boÏË:Øjr¹ü>U¶†\‰ß@²COgŸ\K镆Î0÷ãDês^É}˜Ô[îôÖºÌÃJçzà)@2÷ØŸ …`¼¬�K„Ÿñ팭£éh¡84Ã~¾«£Úb=H,d2">Tžÿ£_ƒo7û\Ü�DZaÒ¤³Cøgõ\NG#/†ûZK(ÁÌàògOFù¾½WÔ§î.Ÿ8æqÑr“NoCÊœçï— D5b?Ý7é@ˆE¶ÕgW\/\- \cx¦ç_ôØ7ú <+¿$[¸²ÖKr€Øûª2iÖÚ`¾ÈÑVjNÕ tÉa“³‚yœ>EI+ÇÃíxPò÷+Fcfc‰Ôß 0O&�£Kr%h �+r5C75Z�µ_¿õ½±{€q=ÓàC„,ÿáRáÌÒP†Ó¯“kCôø@]êO�üàµ5±d“ânS‚!Pl’}K†(˜žìCÏöfþábìïp‹â�œè›8þ ¯Á#z õ¬UÈêÅ­Œb;¼Ïƒêdq�¼h»¬?Àäð�~æ3‹bÄ” jºå²�Üø(dG„ßCÀMë¤íe‡³Ä�lé'G\E"-ÁAŸq•a_}‘ƒÃ¢LߦZy^ͤ3ŸÊì˜!¼Æu¾"�4ÀÞþ{ïÍ9^޳ât‹îí;ï÷€…zÚàQ‡ÈF»ë7KËžÜÆ¾@ÚÖ�=M*i¢uãÆ<úΰ.šEed¾³çFŒó8m¶“LÈ3ÅjHh ”ô¦IGŽ*ê3ëU"I�ðŽÍ—Ãb8Û€Ö°t7!904˜Ý¤…&,0VtÈ•!Í #øPŠàJ«`lãœÚ!ðm«]0.zæz8Æýá¦iKñ”ÄÍ=Ðd[‰`ßy0CÊß×vÕSüÒIdQz$ ÃÚáæqz-wƒ¸;fÙ¦'~&pjCÕšX¾º™  XsäÛ(˜c™Á¨ãUà&ˆãpŒXHB'†ƒèØ+r�øZm¥äMÁK{Pd à�Xì‡ §úAc�ë‰È•—l_xß6k“ /¾QôwS†{MÍ>Å�¬@N9�¦½¾) "OŽ €çNŒpõ– ×ÄQ+Fgo¶óû* ©¡¤Î}AŽÖ “˜—͇q˜ö7}QÃZØNu896¿Ì[Ps½hæö†ê~–ÞÉPI}£Þ|ayâú-èñ› Â…숃&ÚèvsyJ‡'p»}ŠëÛÞÊ~ΙAƱò}WÔçñcž :ŽÐúö(oU;0\‹åvt¦u �›GiV€+ø‰Ux·‘­­m‡VƸAÝû² e‡ô‡øôåÂNЂ,^ /Ùªûx7g³îè<ÏŠU°ë¦ô�ká}…¨Åcmœ ô×XÞëE‘â¿ñsŸ%�z*Zú`ÌLB5Ï×û`6Ò-‹XÆî0�úl5w £VáÆ–!4ÞÖ2ÏW#�Ÿü|äÔÂ…±öT¿¸\�âLj\¾³’“ƒÜ4º—7ô0Üvç×¶Ãç1V@\±ààtÔ¸ÀDeoòQ¸ø½†ùh+uÊÕ™žNÙT‡OÞ&W†Øã¾ùUµÒÔÚ”ÁŠÖ%6•M· J�ŠÛ�ç¿ ’W;,·µ`q¥ô|˜6ÐZ1`ÃL 7‡¹µrì£*3û¶††m‘Îá_Ôrn¹âÉ ÒÍ̹ޚSªÒacX2ßq!· îG[,“K냕{ €åbZÎ6™x™@p…ùEÈ" 'E»rS4D—")t+  À‡èÇUãnN6= šõÔã1bôF Öªø"ɨcèæÌ{ob ª‹›‹µ¿Ã¿‡¾ÃbpNz,v¾œ¸¼Î+5{Å>±•z©SCPÄyìy4Y¤9õÚyQÌш]xÍt‹sNÛN3X`kw’´ÎP€éH¢`,íL­`ü�U𨞣�1t3G+I­A�`B!ÆÛ¨‹ …*z+ Psµ…Ÿ…ÞJ1q�×\ª–¯DÉ�ùSÍHC»¤�lë;gJ²6Û:µ¨Š]Ô£·”Ö:ÁÝSÑ)¦²`àæ4HBI%Ôá=ôÕïb/4²Þºí\Rý~š8;¿U*w`ú:}@’FþçWJF�쟽€ŒÔ·®(5—Åü†ü§s]KGF=X6�Á Ì!�þÆ`P¼aë`é¿J•Ú‡ .Maí…-/»Å[!Ê©KQJ“´s+;H{œóÓàÑô'` À –íÁ>°•?ÏYÂó.…ÌoáÓÛ™}ÓLm 릀ØÝ¶ÙNëh5çÃ(¥¥ÒDd�£ŠYìlÂ̼@Q³hÚïd³„ –|Çu¾ov€gÇøà g¾j”̰AÖÖµ­kkmMÉÓln*V-Ö2¢êô…Þð©G%&a×0o9Õïr(d3×)�ã¢ZXtQjKŠ»¹�"tYÐØÅãRW …¢`á=NV¡®Xfé$1qK€d[Í·�˜°uwÜ.™‡4šš³¿–/¤¢‚×F·EÍV.÷ pp€å<�ÙïVáoc¶ \p&Y´ ª7‡/8¹%îí|CÄ,þ@øYÛ0è¸"Ù^ c7ÛÜ#ïÁ�Q69wö—n$geÔ¥,Á¡Xqˆ‚Ž™¾øˆE,p‰’æÓ±²EæÕ ý]j9QEï�,eb>]º_}ÍV–ý»ŸÔ.™>þ²Õx·y2Qðõò[Å6 ´·üÄ¡QËÚT4DR¥Rù=^žkøkâ‚•æôýÑ1I—ÿŽú}B\?þ²ŠðPÜéœìÆ §Ä ‹b%t\6BDLÍÎú⎚[Õ²©]‘¦Vž‚§–Vž7©Z´©¨‰M zÛÿgã †›çÇÒí‰×�™‡%ZkNÞ‘ˆ¹wC0Ók¢§0cfE³{¸fÙGS @‰Ngý²]?'xLulÖ ×TvA¤ÂÜrhãŽ0#˜cCçCF²íäžåø®à¹O~¥aûÿ°ÿÆ…ð”}•~HW@ëh{ÿ~·±¦î ÿœ¶Uðf‚�ö#þî'ÝËG¿×¯ÉüÛô Ž }ü¡Ji6“i¶™ôo‡•öóÈŒûα¥ùbïØ5—øV‡ …ˆÈÓû±ž‘ýd{¿3ÔF5AÇEÝB ‹1³‡1œ3pKaS?Ë"&á.• ®ñúh³xÒÜ€ÛóB7†+cñ1Í/I·£Swb¦O[ç6}À«G‹ãlxèeŒÛ`D}¥˜Î�:˜�$!„áx¾ ƒûí³˜ÒhFØMw±Å‘ßgeœAò—5¸?äê°9êÃ>= @kBm•1UúœÉ$È«SeRèsW5õdXiI@­Yí%ßiÉì½D…¥y~G•ÒLéÎ¥kІK®a޹=˜ HZðl]Ö¡ Y'kÖ°Œ–à fI°/ ߚ˯ڿKÕjÍN/–-j[‚’£^cpc�/Ö\õ9¬ í7"G,›¸è™ihm¸æa¡E�Îàs¸–ô¼³¹‹©¢›ºU® OjÄ£ÔL(…¦a A®xƒ¶V‰µö WŒI!­JŒ¥§†+¢rÍñ‘›Uì—kI˜”j4é-vµP™ª&B05¡ÎÊÉ¢úâh�C/lž …ŒÌk‹­¶äP?|nQ±©Í(ŧ��*r|4±€kËLdR8lÚ0ìé»×b´¢³+ÄN¯]bÚŽß]_Œæìll˜fœèk’P.y´ÿ†–?,°LXè1¸sB QòlÌÀÙ‡v‹Ñ/ÍÐZk�Œƒ_£+÷Ö2…é+êjK½)C] «z¢7ÂQˆÁ¹éž¬bTvÌ›e,Ä‹Q—L\L‡9“Ÿ°1¾:ìš?ìú45ªo›å¯÷Ãü±|w'ÂBÇ]dQ¿Œ¬Â»Q¥×°Ó–¹´)+ÄiŽäuýoÙ_éµ�´ŸGø§�‡€OÅm³çwÁÝÕI1«öC‚¬]w^ìapGæe(+ š8åZÔ3¤0z«)ŒÈW&ÿ'°i‚Ìå#«&GDC í³ˆn@U9\]²¼c`®nP|åzŸjÚY²—ðÕ|¯û"–ΘÕíúD‹1A§\ÊKpí½V£Æ º”{=s5VÞ(Wg2Pì:X�Œ9­=@Q(25H ˜{¾ïœ¯@À֞ƀMg—æÓ5Ò1ž ¤ZÑiLm¦0Þ)©µhn°7·Ô/\«@k³¿›€¿Ë ¾ðK¿!_©·‘ÿǰd:iˆ\½Ÿ{{)åäÎNè¨Íx� ë;>쌟Pº¾d±¿ò‹�è,­ãÃkɹ¶l™„IPçÒW¼äS&€ÄbêpTÆÉå æÊ©¡àÝVñ˜/rL{·§9û{µ±óüáê‡É;²ŒXÊüÛ ®éN»c¸r"³‡R›bD Xà¡ ò§<, Ñ�{39‰RÙt²7¸ž¦û�šðœóf@£ °t!Öä�Ø][BñÆÅaõλX­nR¸Œ×^Ïþà„�•ÚHIw;éuï`1î$c‰aßì�«îá³ýÓÕùíʳè•).]‡zF O2jLØ ÐÈýXqƒue9ò,©Äj^à�‡k¥È4å“_†óax°�ÂÒãë­Ånhè=‚)Ö�GÔ•Zæ Μ34QÐæmOU‘a1�êÜ�ì¼GG-ö kÇ~õEü¶ŸÑé÷³ð "÷Œ•)‹ðzødõÁÄòzç¢Ë>®D2r§q­Ó`�u¥ „ZÙË&¶KsÛë–ßý {tj=ã¯zë&�(¯bá¡×cwp†8ë>:�áB+S˜»üÈ‘ö�Ž»™6KfÅÖq¬|B”¯ó‰l9ëÊÙ2G~pØ�7ETâ)Ë:tLdœû}«ÖSê>�‚¦b鸄D“bš$�ÍL&ȶG®Ð‹iZ œ94Â1�xl… g÷á-@Ú-j@>Cý¥2Xô_–¼U¼è0“úQçµ hJÑ,®QŠíí_M¨l˜wCÞ±ulß ;ÊÍêL4Y8 E\WÈQ0mTFI2ž¾•Ó €x = `�íƒQ]}¶oÖ`V^Å*(ßy¡¬eÉ`\¯°¬?QA&5€ï! ­LsùW’_Ÿ€‡»“NÞô�àz‘;)(†¨Ê äÄLTöèª##<�­Ê[ì‚�p¹þ>Þÿ½ýÙƒ øg¼,�O}Þrhû{vØp°85cl¯[â[ØÞ€ää³™C…n "ŸÌ…~ìíJÊûqkãÙ‹¥‚-ƒ•éŽ^¢µRoÆ*GškN+1ű1h‹e�$Ú’$pù =´¶ZÖ+�\[Í}©Ãm_»)‹ÉÛP,„L óÜ;çD©ëè †ñÛ$®£j„&Øì_¢ýZ bCIB†Ö6ð5WUÊ Ü¤ ­‚×yµ§<8ë;ùÄj ¯ië#rû;¸Ò ´¸ü«Z‡.õ¿L¡¤í"_7@IX ÛD´;•Ƀâ"�­yœ‘`Þ ]¦M}GŠŸçüX ßDô¥k>&ÌŽ8Ìh†kª $ĬÃØVÎ5@ù�ÅÎ=ºW�sÞ\¦å™vV�äT|�Ø5· ij1–; &¨í†Q/" íc3¢ ž¡·æ2ÏýÀ;‡±1k ük—K.æžZ$ ÙLÐA 1n~­þô~-¶â/uáf°•öÚ½¥²5ì?ž›Pã `nè÷¶´ ç=[È�üJxQ˜ñãEºÂ®÷%n.pEÊb_þ[Qçòª»­°'ùaÏ“ñWã-ª~Œ§ÅýP¤õRÙ'Y;Àô¹^$/ð‡²Á#'Ç¿/¸5†>AççÚµásH¤b!­^¸ÒÄç4b3¯2€å|bê�0¨}�ÈJ Óù•Êä2ØýŽê–¿UÅád¶³GL©µ³@ÂEÐ<ë§ "+¼8D˜îfñd1òpË|õçj‹N²�q(…ÞM‹C!ûÿ67°¿øƒóǼZ#ÙôÏÝ&”$Lt^;ƒþ'“SP…± õ‚×þJúÄ�ü4§;\Ã$ ÿç¹'Á[ÎïàéUûéÑ)|„O2~’’I5>›·Ø½sic“fF`·ßTtbÜȵe÷,Ðrå}Ìz©Ï:Üúv¸P ̈=á¨DFÒOÍ¢þéñ¿Ç_¯{�?-ÃßÔŸþíðšÿe$|ÅÙª÷gjãLâå‹ „hñsh"_ú�Ø¥ën«:˜–Ù"ƒÖëe¸*„ìݵPj¨ÚÊ:U|:mÖüPÚÿ©¦³³¾†TÛYÁ …B)HË¨ê¾ØØá$Åš|F>˜‚nO]eί+&Ó=¥w8Ò@VX€ìS.’äý1!ÑÕó¬çÝ;‡Îc0ƒFNÄ.F3zDj''£9#[Õ/È>Ž~3(2Ιör}XCé¯Úæi](3MyƒJŒaÂ\r&‰žäÍ 3öš–‘(°Iʪg&Œl�D™Ÿ£mv#yÎ]³h¥$yñõ¸ócl±‡WƒÕÉ)§FÄ‚%eçqI6¹*ÍîÈYŸ?[,m†ÖN�F5F�‰¤ƒ=ù«š9µæ,ǘɶËi|oS–ÁÆ´ˆgìèØ3ÞÛå•1("®z³Ã6KxFùjXØÂNsæÉ’f`÷ÊR:eùwý*ðE°Á]¾�‘åÞ²>wõŽüOÓT1ôÉëŒû ñóËZëòAKò>|K€8+˜¹ "�pôÀ2±ø]O��oàáŸíÞáH�ˆ'XQHˆþ¹¬LmCúŽáóK.¶ü`˨�w=çÝ¿ŽOÂ6™«. \BðÄêˆ'Kò•üEg @ T”è4Ú¹”Õ˜&‰ˆí Ÿ½pl€I9†lHS wrFÙ¯¬‘ĉ÷¬*�oÚÇvÝ…¸áã^‘eÐH•DXC?ö¶²çÐéYz'Ã`ÊwÅiòå¶È‹œg¨ÞÞ ç½âÍx¾ôû.-¦øäÁ�ŸBt¶Ú¬­7º¹ *W™¼m´Ñ±b]..%iõŠç*¢^µ b0Jz ÔÈ@(ÐòïqÁ¥ÙïO6–^ÆÐXY` R3qAÓ Èn@RØZ6‹3É–�ƒËd ’Û,HQ¯fô4dUŒípñPb’‡Üab¸}¦ç™Ê•³v'�wc×0ôù^2Ö4bv?…(|ÙKs€ÿ�·{sV®5»Cþiݳ„i—} è¶öðŠ ï¢äç ·º¦¸V´‹Ä ëXl7Ì"›òþ+°ó Ðj‹¯Ç¹fìB½9|e³Ÿ¹{sÏj:¨ÎêÚBØÆ]êt–ú"‘òÍž\ùý ¥Eyú/JËÆ©qÀ˸¥;�ïÁpBIäíà QÝ·ötª/¼›‹åfÝ¿`~EÜÑ/φ]z¾‚ŽÓMlø¤J`ˆ{°˜¾~¹t ;yœV°wÒ5î´LÂ~²iëxþ�ã÷ ÌýC¼ð=ƒòØ‘³¨{¹IÉE, l*?  ˜âu=uÜÑ]©ÁG»Òå,]4‹ª\JMæ 61Äí£ƒ`c¢ãò¶†·²åØ{MŽãK«Ü ìh”`ÍÆû‰X  �®`q6›6¸ ùÕðXd·Ëk dUȲj  „AØ–½uxKì´2¡»/«¶ípç±,_û0ðµÈ ï^ðE3µ™4ÈMüïo¯(…í-ƒ é Ñ-õ®ÖŠ*Ó·J¯Lo›TÎËÃQÜ@ ¾c»œ¾Í˜ 7*¹Žá.A¯íÛ]ò•‚ï·Ü@âÆ>Õµ$ð¸¸Ò>��‚³NŠë|¨28ª \Túošíû°rþ,dŒV�öÔ›`ÁhH*Ç)€};IÆ€´1+¾àŸ6ô놭a¦^‰1~°Î—Ñ|XÜyb¦a>/¸x|,_oÆYÕÎoË›ãic·$(ÈÀù·Õħ Ò«·½¿™5wlf0i{�ŸÆï"Ñ›¡²2¾~`„ee×� âîVîÔ hbÌ:ò44uÀYß2™µÖnç²)ªvÞœÓ -ÈíoÖÔ`°3q¶‘l%Ô²ÄÞndŠT‚,�aÎÚý‘žKŽõ±â·ù5»¬ÉÀéXbãÖ�¢PÞÔ§#Eßê—rDùPw”e&aV,G®3SzÃþ«ÅJôæ¨|úΟ3ZÎ2ôŠ×‘ÚFä3vÖ¹�¾¨·…˜Ö殣ïrtõMß¼fó”\5%]S±¦¿%�lÁ�TIþŒ‚›}ÛTì6˜€–u2é[Óˆ�p9 6cݦ£×Ù¹±H­±ã=¹w°|8ÆÑ´F~Ô˜áAÞ&ÿ°é%;‹À3jìŽ\UáRÚKÞݪÄð!Þ¯}êFZ(³]«Vû.·®²�¢±çžQs™î%¬{Ø5Ú6®Ù—µEqÆ®(ÿU7÷Ù[ÆT·$Jª†Äe¡ü‰Ó›¦q¸/J™%{Œß x‘‹ï™z\þ­+,»õš^q‹¥ÇT�Ïrñœ9ªØ”æX–z°0»ª&ÔP1„ðJF<ÝĦP!ø°1M/ì;°ÓÔÙÝl­EB`%¥TÐmlPẅ‰«¥B\ŒÙ�_l!x$¼VH)nYÉy¸Öu$¤A•E%ÙsÍO/^f›GMk ÆJ[T¨«+£ªåÛ’!’|OO\5Ðl�Â…'ÚÖWÞ~íƒñ‰Œ‹ƒÍ‚i‡pwyÝÁk0O/5O…ìAW�z0¶ ªé�Àæõ\I/,þ«g"­È‡v �Œ"ÚÍË(h�ìhÌ)çˆû?·+õ\°Ø%€Bu§nA;Ć5“Õ)ÏÚ o÷Ñ({´\ª¿H\Ý€ÃiX¡[›dÖA�m-àKßµXýBs‚l6d CçkZæøf�n#&XÜÜÓˆóéx8|c¹W mËgÆÿ�dCÃÛ|ç«f[nÖi;#)eá[z}ÄääƒuØbæâöÈ3¬q¬”žþ`ýƒ‹[2ÂÙÖAÌA³pr i8æÛÞ>ùb9��'9Á[úýì3wQÝ\f|™Äý ÷ ›WÜ�óÖ‚ò›d ��XßÀåk>È A È\ßD2o3aIã$÷¦ô”+« G‘7Rd'J__û¸�!†ÿ ëXñAá’Ö÷²;Q.¦±?l@ëò!õWÅmnÿ-�æÎ.ÀùC?ºac¹-êæfsv@}dHœ}W.V �QŒ"àÊÉ݃Ö8Iµ;÷“ k'ùhK^ïWºs„„ôì©…€ÀŽ�ˆ$J ÂdXÓzÚCœnOÝõ¹Š>x‹…åeäžã »”¼ d›×¬@>˜®Z|PŒ³œ)é3”á^�kxŸžDà�­‹Î°Ä$®@ZQÄF¸sõ:žg¿sxÛTúÀÁãÇ„¸ç�˜0¥¾ 4^ñ¢Û¨/‡¬cç"÷+‹5z™ÄM¿Îaž¾Â#§.~; G—C¥utF·×M]þ‹ë¯ÃÞÄåÚaZnÍæ2 í€\€ç6Ò‰âl|ÅÙp43¿sêq£"ÀáBÀIÍ Ä2 ÏÁü G¼ŽZÆõ­=Ãÿs°Z‘¡±Šá>Ø ¤x¨G\öéÞÑ•¤aP´c¤"Ь Hñ³Á›%õ›É�3vïˆ6ï™'}Ø–\3f+zôï¶¶òþºfÚÔÁM—$'�.»qrÿ­ý‡»Ú>¸Ö(8¬¾ç=šÍýi»)EX¯�Äl,~´T™|ü .Zͱ˜?KØ®zÁ““nw5"çF|ân# ñÇ'êFuÍ ùÎÍM¢¦YBC«„ŒHòØÚØØ,N±Ò QS( -�ÍÑ?&Ïáû G8ܵµÁÁÙà;§?D‹ ÀßÂÕ$1nv ,þ¼slbÄLCîé-ãpÅRœ2dŠÏe5PÜEj_weæ»ÜËàßl_å8ÅšFê°Ä8í9¶ Ò¢›QýùÄv™þuþ÷8Ô·.¼¢—Á|¢xëW�ºÔOm°5mŒ¦òžHØ&4’ÑL4Fêî]N8�èNï• �åT"Øá’Hkn ‡™¦ºˆmÄi¶Ñ´«_ÕàLJG~{^âîA¬\õ‰~ !§éâÀG×h�]R[§'yßZ˜™2Rx!o[okõ¸™%é`‹õ~Àtý¡ÁS»ìdo``h%�IÙa§ qHJbšÅD2�ƸéËZö9³’þÇ»Óñ!uø:,%«W½ô?Fñ&öìTu¿\ňqH쟖ˆ?6C2ÉWEø�ÎUöƒ�‹xvظiб1‘,¥ìBF Ì…oÂa! ò–k]§©‰Q;„Ýó\\äÓ*@íMø@Ì·QpÒ—s{E` Ýäw~§]<™?½_-!“‡,IÂÒç:r¼â:wˆÌ@£bÒÞü§ïö°'å@©›é7“w�‘UòÀ–ë¡4¶Rµf \»í’³®·Ë$íùn^ç9·5 €5™p´VÙ nûص"�˜Ú;�ŠÇléÑékºp–qOca|H„ÙX›÷y›Vp«.û¥x Z޹Í}F¨e yˆË­/ù2¶²Lx ¸rs¦Gÿ‘´Õós(kk˜'QxvËéžï¼måe ŒŠEÚ(OŠ^$‹üÁÖåì²O¤_(Îtk¦ª#Eâ/èØÔbE��¾¦Ø>:4~Ǧšý3ôDV³ð Z ü1:Z¿Ê…ÝcÏ?�%¡—g¢wbò£Ô�qïµz8ý¢47ø(FøY1â‚hÑ�é„wCü]“÷žF½´?fÅ�à‹Çç”Ê9]s"àÓ:M”×àò‚Vä`äY#M´H~±µi^t$~äÎ+C4E“þÒ³Çö‹}/Óµ;0pBcáÆÚ… p+©Ku_!ë°&KhL™�hŽ@·„Î�Ûˆ ïȶ"²Ü¿ XZ£ªöÈ]¬ãÀ}ï53Ú£aÛ¦ Z¼Å':»è"2‡ð�‹²j´^΃¶JŽŒÄPLÁ†b¥‘˜5*G�S‹ê>ç™Gš»±p7€¡ÚV9²h­à�B LØøš¦[Fþ­K~RïÚöÕÝó½~ð³êß¿Ã}±¥š–3~J½ûÓl®þ- h³¼o¯ Ëù¹¢] ] ã÷Çãø¤æçÉ£55ùëþþ|ââßß}(aßý³¥[Z—í4{€Ü*ƒÒx0W2{áÎ 2žta�bª§Sðeðîx/ø¶ÎÛ³MQòÏc\—“!‚º"ß4_ŸÏÖÒC‰™D¨\A÷ßâl­Iûü¢!}²Gp¬H 4 *]XÆoí±3F®šëå­øò©Ÿ&õõá—V*ùù)*MÍs™æµŒ[A±Å•Jé\Ñ;áUp·j–lÝ2ØÝñ›ŠcÄB83æ^"`à˽7uFÓ©h%'.ÕÞ¢xœœ¼ï|!°2˜¼.¯Oy|àò™ˆGó2áíIž;\ý—Rjá`±î»j{!ˆ\î¬ælOv‚îj½ÝéÚƒ¶uJòETŽæØ'æ°w»¹‹­°¸ö¶‹‚”ºd¬¥Itã´¡”ÕÒJ®ÌL„½­Ð¢",9­ò!�\æóŠº8­Ou5®Ó*eƒkj뽂6HÊ0¨Â¹neI–7“YI&bÞ®O¥7Vtl»ôˆ<2ìëz£¼¼æ…pøáóPô[äNDÓËåbo¬­æ+:£¾Šé•Ì“¦ Ë(ñ3>Þ0êTIK–=éêî܈G2Ž�åW{t¼ÞýäasŒ‰§v‚ ¨!©T|1üÖwˆäÆ:ƒ.QZÚ°ÄäjhM_7zžÿnwxÆ1”À†8¹ú�ŽoYJbn]Öâ]ñRÚ]zL�‹žÂeU×>š–d8ºëX‘ˆÝ ªoW%Z¾ýÛŒo ¹‘'_OOÂÐG¬«–Ø�]Jѣ˼fÛÿ¥F¦ù»˜Ð=ýž¿i"üÃ, ¡Ÿb”<7Ê1Îr¸MÝÃ$Êjq®îH‰*Àl>¾ž¦æä…•\Ç�Ù]Öfr°§1rH<�@¹ïÊÃä£T}‹­÷|Æ VC>70L °7.Y§:Ü^¶Î\\<\Iâ�®—,^/,eœ�‘Ò¥¿ßòLCPž”X@n·c0»˜Išªƒ¹4~ßïN´‹ØblE%übkî~Yú{?óHHB¸¯í˜ Hcïú|¹–õ>'Åõ¡õyi,Ò†�á¡/¾yý?ã<æ'ãyMÄF4€£YP¡ „ Œi»øxø‰=ëC R¾ýoìß×׿WêöÉ/uÔ»;wmt«¯ßÄ÷øþ¥ü}þŸªãCMR–„† °_4FŸ¯Ý'fx$�šm=øñäüáϽo–„|?:Qk}ñþ—Àâ€ùᬬ-0Ø´Î,ç$ -¾ºÔügYÒ¥uâtêõ©ÊﳇPÄÃmƒ|¼K´7â«ÒÄ7ÖÜXþ@�c¯,QbûüCºÃ°#ä‚ç{Çf¨^[Tùz°EoCe}>À–÷O²;b|óuÿƒX wp ºßÀÌƒáø¿ñŸ&Û_ީ竜8+;GZÆR»âHLÛ R1Œ٥²Nøš±¸É6ÖeŒ_I¾d• ¾Ïk&ô“$Î.Œ¾5#Ààr9É€Oâk°dÅšÄëA"]aÂãóJ^®JÏÂ¥Hö³+�ý¶1C'½,—NÚ=zj‘Àaœ;™�E[Љö²1Âו^ÒnÔ�¢Nk–€ê+%�Êö·÷Óg¶ï¸å„ç—»‚®¾(Æ Ç±]§|Ý'±p£ÙœyɤÒ:=޵æE?€ˆ�öHÂ0�±ù„|ãôf¥MÖ�€$ê-øÈ>ÿ~Þߨ\c�LÒzŒøÇ>¿àéÌß‘YêìÁii!´p!:£UôÎ×…‡@È!i }…½Ô�ÅD½ç_¨‡ñqVà1ˆ×@¾_!ó€káͯ‹Xµãqÿ½€�òeÅ£Z�~æà¶½Á×À—ǧáÇ Á –Æø„‚–’û7(¹/„‚S,äÞ´›9ÎÕmÐÈÃfnËרêF]:L�Xh¡Iwà‚éŽ!ÜWùéÊädìîõ%Ðgš2¯ŸÊŠ gGÖ!&—!o©$ef,Xø¦ÙÀI!¯oÎ/›ý·EûÛ¿xöZÂOLü€˜Rk"EÉ‚Î�4@aF˜¦ÇaŠìÀ} ºÞ7ÒŠhX˜¬Ü…u­¯c’ Í¡ê- Z´R¯-Ã…Å^Ík û^5Í)ÎxøŸ;‚òÏ<\Ò 6ÇÃ=Îán¶T 0Ñš¦M4n=£N¨Ù~ª{*–Ú×ãÛõþS3¿§åNN�$&\ �ÃQ•�¶)"‹³w �è*0-cìµa©XaÅ*KÝá µ�t¢Uÿ/p «úb0 Uj)‡†Ý¸œ|¦¿Rµ_:.8Gá£ý1Êý ¿ïõ JR ‚Ø…¿ès Kä¼81áSâa~OôO´�S¨_+dÃW1)Áp¶cÏ$Gódzm™gëj8›/`{×ýÇÙPüø¸kF}‰<<§Ût|Çñ âû{™'¨Y1òž@·µ[WŠÚÚ­+mmkÅ«m«i[[U®¶ÖÖ”���HHz‚@$’HJÀ� Ø’Ä$$�0@� _bÚÚÒ¶«jU¶Û[-µµ®«m¶¶ëmmim­­*Ûm­¿V¡ � H�! ¬³ÿƒ÷ã’ºÓ7ÿ F‹ƒ‘- 7¤ç ïVj:YÅ¡ç íÅ—9¹Âô<¶—B®x´8�§weЧ6´ÕÝ µ·¯WIf-ô䆻¼j»z^TÈÕ¾±ÃHŠªfã+/{&åµLs˼=K|)fùÛÉ”{t§bßw8èƒs0vL}5ÙY£ƒ÷Qu+vµ�Gr¶ ˺š:¹†Ê®�]//TAËÛÍWoÚH[7´gouðL\x¡ô̲*· “\ÞÁDL^‰1"³ˆvÒESBл2ɰá<˜`è3Z»V_eÞÁ�±AÖï¸m 1VíöAT+fxq[AÙ±²Î@�•ªØª¬×@Æ÷bå5Xl° µˆðéV¯ §Û–zJ •�é]¯kYšÊ•*pdd½*^è8+*ëC¨ó©][˜óz®í¶r`›¸)èUÛÑP€¶ ȃÆÄJp]™ g­es°bXè;ª;f¶8UÔc6rI¼�BU¦”StÖ-†# eæmò'm Ì쓈äùÉ2º^ «¸÷�ÜîAä=ªÉÁS2N"?ëþÿð?í/ÿ�ÿ_÷îûý|ïRÿœ¶3÷Áp‡Õ_óO�L�WÙ×,ö EUBùÏ�Ÿðƒ;lÊvº¡ýqðѲ:1ÜHц®›×1|Þ¯ª²XŽÉP—…Šx˜ÅMQ8V&*Ô ¨fTºÿßÚ¹žH9]JŠÛdEزë'ý=ü=Åõòd‚,¾Ì3U­üNØ~ËÉÇUTâ™jðÑòÆopH¥^þ,-W°wÚå´”õ/¾«ä,áRñÔS {–DlºîbéÙ!9p¦SކÑbö½�dêo$gÊÄn2Lõ#Š[& cã|˜@Òálë5×KBi�­L (Bß·Í:øs«ºDA5í8 JaŸ<\K½ò�) "h\–ì¨ÊñÚ€û}EqC+<¤žƒëu4§® Öê 싹‰ƒ“…ÔÄaL£®k\¯5Mqž5ñÏ&‰h¨7Bdr”ûâ hú4)%z>îüáúópaSÈ{†�•hÙ¾¦’Jè°¤#h Š^zá|žQÛÙ­ëÆ(1ix :´OpV¦.§’�2ÓøB_)#‰ˆ@e�â^3µ/„ž'ºÊž‰‘ÈÈ·ú}Îk½ë|¸2—gžÞ¦¬“~¢–’f½Ü‚Èíï?­èízÝ9x"c%ˆòœJHŽ®)Kfß5Y´=†JÛ¸ÿ&Á¢±5Í}«W43×^»±O÷µäAo¨&û/Š[q=œ”üJWï06“Y„r=Æ^üY�飑SÙ^C[Òã}¼ä¿©"Ÿ3õaFïæX�ö0_ ó'âLdÅ•¿'“Ì+¿q; ~•ÙF³*É­ å„§¹O�(>ª¡÷̬.?‰ÐQúíÓçq>Ï®)…µ§–9�<-„P@taÛÑw­<ê`ʰLx]œy¨°´ãæç0µRR—2¹CR%è@mÄÍÊæë$¨h[ÏrýéNù¨¸ï×ã¸8ÔtÏMQ‘#õU¥Á‘~Jþ"Ȉm�&žI#—˜[·ìÁÃË*ù˜‹†0”kmsj‰2ƒ¿YhW˜»„!µ–Wý?™WeÃikq¢(%Á�‹ªP‹Îo„…™(¶ý,ÞŽsè4/9dé)ØFÞLÅݧÆ&0WæöÖPB;³ÊÁu!*)ð¨x±õP[WÔèĨþê$fý þPú<Ý}bU§ÒWð:F­_Ð6˜ä-ÚCib¼Ê~¡|ìæØ·§JšŒé»ŒßÛ$�ÇoéêPÑT¶Ð`èéì–%¬äLI�^a‘İt¢$Ú9¤Cp÷_—èÿ‰R:¿~]bÀEb£g~›^ùQ{*¸7è¹ÏËÔs‚Öß1“*šæ˜„ƒ¾.ë�î·2$¡ENÄñ5qW:"H®W{¿zœ\솚å�ÙÑôF›su;ÙIG´ƒ9ys? ~§—)Öœ6š6åâgt›fÝèÅKe\Ú£î]rV˜Â‚îÞË#çÜŠz~›õša_E»)Ö'+ äÙñª'6úêr`pzÊ$ÂXž6{©ÇÛˆìÇ[Ð�…-§»Í:X“g£†% ™™B¨€|n�V2f¬"�$z¥0�;néÎEáÍK Ò^IˆÁÿ2µ^=°BVô𤶇DPó!ÆeˆtD<·D’^à°ÎMú„ô+«âîŸ*{:¬�Ðù솴C>Q†ÿŽí¿‘ñ³VT«P ³¢Ìùq¶ÂFÚ»AP³»¹# ›¢vƒüWΑu^~Ý6Fis�%ÉqûN± Þvï=œÌòFkŒ¹¡û™jÆ®Ú[�0±rX®Uõ;]ª¢pÑ[kF‡»¶.¨ÞÇ7µ7³0~O³çrÓé8ij»˜�Bû�±ê,'ß•&Í)àšAéhÄA¢ÀúdÑ$(3kr'FCê£yÜkn®‰×Rr®Ñœ¥ÂC3(¼©RµSH“10¡3¨Ì·k%z3¹˜Ùè„6Eébû+=6ôWysß ³\‘UšyY6¢P¹NJ¢&¡ömeÁä-"­IPur9¤ZZÜ2jSH“£Ò›1Äân�åß¹DS|\ß"°)ÞBiÎIXËŠªk ¶‹›ô¼icÔ ”â]Àâ�2!¥zzÍY ˜¢÷ùW®Á/cÛ½Ï1܃îŸan>ÀR„g.Où0Ðàp…‘““ŠìuqG�FSŽS¼��ê2’+qdïׄê¿|TÜªÆ ITÅWfñj fž`ý»�:¨CG2)Ωþ@w ¶�By,|BZ#‹LT—²f¡JݾŹºHäÉSr'‡QYZ7™fÝé%.£Kn�:ÂÍ68Üã³Nï(ò“T²à®›ás/YßY®¤{RìÕ—-¯’nK0n«£R˜6V]þš+0JY‰Û‚Ô `úr^²¸€äœ%nsæ§’‰ ©=©bÛf8¤ê[e�r¡ ±UFcD~?m 4Êȇ—"J †¼S ”b¤Ã™"S–‘Ãà,ÍlÄ𲤨 Ë‚òQ$ &êƒH!UùØ�Ç剉ˆD[ÇÖ�*µq2`ÂÞ©È’h‚Ú¦*6îÎó�’±Ô©)A¥¹¬¡‘ê†YJj\-=”öÅ‚.8Mòþ  <ņd‰'ˆSALFSµ.Oµ ¡—Q…Ë‚LKm¬0Ïê�™`ýDîÄCŸw3âDÎPI¦fý!0 ¬C’çuGFL©JŒÁÒˆ„Üîµx—¢È ˆ‹!~·0k/Æ¥ÆL¥ÊrQ–w¤¸TX¸VqÌ Ž4DåY•§!¤g!þŒkœæL™e§‹PÌ&2¶œú§îx~·�AÈ».D"�’êéSP[ mA„ci—˜R à™Ìüþë°iÝ+øÛ‘G‡Õ-ÉQùjL•PÄ&JJXL„RF'㟔¥@/.¼’kM°@Qù5üxu3H™ ¢ÚÙVfA[Ãvi]×Çéè Šr&ÕUš×èi�Õf/ƒpª‰†Ô�ÍÁwû&Á3Ä7 Šõ‘PA€¦—.O˜KÒèÁ‹,“zJ „/¬¦níˆ .!®Ü†!�‡&ö©í f/Ü)„PRßźÓ2C Q`•%±&_×Á¹C‡N\ÒƒÂê¨#ɨÿSÌÅ�™ƒ)sqŠÅr…˜ä‚W;V3H1#«ôdKÙqܪ¡�}dÙBå»Mê·LY°”*Uº ê�• C(thZ·aØ•^§Rí…¹5&캅tH¢7~·”¼�£jÒ(X¢AŒ¯ T1üæÿ9Fé ÌÏå„Ѥœ½ˆÒnJ8•‘`’!†ö@‚CI)„ B£0 8 ’H‹œ¿�g·Ÿz±6HTv�û•&ˆ¨A§·r±6膉aI†˜5”$-ãÙfÒÅ»p»-›]± ­L-!µäÛ;H´…+hDbŒÅº0 "Ë«~Œ Á9�㺌°—�ÇÕÔV:šaIjÂE}Z¯¤Ö˜•WkJŠ%MÐäèØàÎM™Ì¸ ‰mÄ'ŠË”ÿ1,¶Z$†2rn=UÉfF/öç�R�¨¥#'ò úŒé�‹r]Ô!ù•QF�Ž*:�eŠâ®;}ß ¨.ˆ)}ÒùV©”:‚8t¦áò X4.y[wvCývªÁ�uÒcÙÞ[#(^ HàhÉ™ XL¦Œ*Ú­]Çܺ‘ É„JD– Ãaá„ÈDœ7‚ J‚ÁŠm´|¶Ñ)ˆ‚¨©¹‰8RûnA J„‘RŽ$á`„ÒD˜grÇr*š€cK å:AE4“ˆ,’ ‚Pd0Š Kr¤IC0¢! `%Ç´†K•øÛIY,–�L Ná1ÁR‚Ø£X*4Xc”ÏØn¾Cî-"—ã|ÈÝO%#Xz µ “ È`Éx$´ $­¦€8RÛÃ%³d,! ‹a9IÊh²p°i¬‘ß�8.V!šBa\–Жà á B  †šÞXbK ´L¬´`) Ô6I 8$ɨÌ(.HQÂmJ+LA!„ ¤ŽT‘��‘0‰�šÛ‡‚¢!8®‚£²Ž¡Ì-�Kðæb¥UT)„„0ÉžVjZ�‘ܬ4‚'%I5°‘(š#í¨$˜-‰…³8�§„éA"åêXq;9p „H.µÒžÐ�ä‚j3:jD°ÑGƒ!âSš˜2eB ’B¾î¬© ­FcF’+)•öÌ^,E 4'‚@H$Š4œ"‘‚¥3”Ƀ…ˆI”’(§p8‘ †�R˜D–'¢A@å§E0�'øÔ]ËÅÜ8’‰�¸!ü(™Yk  ™C†„Aá·50Ò.Xr›h�¸feäþÝ„Y-”‡¤ä˜`‚à†¢ •öTFD¤X+—CK„2Úo'ˆ”Ð/5˜) ! ’¿JƒçNÙ¨þ%ä*�©vl+«JÐ \~AÒÔ(éºh�^T‚&!Á€Ia²à¢  ŠH*lÊ2d1ÃM2Þ B Òp¡–C`°°Ü¤Ô JL„ðe`À8d"ˆ]°òf~°Ø•‚Í‘H°XEáÈ!±—fe¤ �qâ¢#¤¦Ó´˜-�QA¡N¼½l›&�°¯ÔMÐ¥æ€L±¦I!”Ö…E³D6ÞGâ{–Á(Ê(¶+Ç0d–Ã"É$¤,ˆ/öª¦a>ÌJ2$†8Pbá2 ‰"··qÝâ �¬«†I-Hƒƒ’ÒÑTÓ 4�&á&Ê$¶‘& 9dƒ‚H-°ØAà™Âa„Û¯ÉQSJ† •‰! ”cpèábJBJE0SE6ËÁ ¥Ú�É�ry�5ï·¦N²�$à�–o ”T"Óĵ ¦ŸÑ"SR‰@ˆ”avÓ—ù˜!‚B à ¬ É]ÃLKXA!q†DÛ€I�D$à!ÏøD‚:TÏŠõu † p±Á™áL .Êx´™sÛ–LÇç·ßçÜ?ÈþEiù/ùl^õ½¢ÿ´Šâã.5‰;Ôo¶ê¯{EÛ}ÎìN}¤Q‹$9ŽWLÌkF¾Ö›ëXÒ©ÜY Ê!HŽr­±ªÞõ^Wswbë›�´…9Ý  H»Ç�v&Šo og]`ºÏ¬†te`°Û[ƒ´ñ«7¢]uîæJ=\\qtUNõõnã—zá7˜.ly;´sUj�:%Jæ*­_.;Ä_c̹ͬÓXbŽ,k´V>›žÎÁ5Ö‡Û7¾;¸ï4-”fêÝê¸3¸œSæ™á­Z&‹ì鲎û�½®ÓÕJwêo,#·–<fÝœˆ¶v—rÄËÝëàÞP«Î¹s,öØ�²ª Y`¬;‹n{¥=˜°>CFÝu%½ÀÕ›©žÞY– ]»Ú˜îÞܰàOwv±éÍ’½§¦ 7vkr°×¬âœºYÞ½‹½4ôqZŽÇi˜öÆäCˆ«%Ò½®¬}šÕu{^SKÛwV.ðá7Úá�p­Ïfî®r¢¥*† áUH4d=ëyZ#òK�™µŠî7åLÔ™fÔßVœ[ˆH' ;nÅÇ›'zÏm­[ƒva7eI7}ªÉ¥Y•ŒwAÐR»2Isr;4m�t‡EcmY4zÐv&ŸAÉnµËnÝ/ibŠÑJ]c¡µ•³–ʸNè÷š_s“²Zº¬HK2´Ýæ¦:«{h°ÛÉíujÅQÝ¿jÚ˜Xë=on;�½‡¯s9ÑËÁˆvÌæ@}K¸ÑG¤}Ë8õ÷dJ|�P{OÝ›Ûy ¸]“'gk­ÜÕf0‹ àt6è»éfŸMV¥ñÇ$7«¬u…O©&K»Üu‡§TÚî�1Y‹�Ug®ûEX´^2ðZ%¡¨´ïX¡y·™BÝeà& \Fuu»]¦2sO]âÑÝ�eî�ò�®Xò:ËÙÂV¼î½£ÈV嚃Ÿ)Yžo:¦ß^d¼ÝëýÙó�œTgäø}ÃNHèºôoB4–|BÌg+ËñãËÙçä­ªÚ¼ëm‹k¶5lËm±EhÑEXÅJ‚�¬À¢¨jЬV6ØÛF¨¬˜Ö±lm�TZÄFÖDÚ¤ "Q¢‹S*ÑZ�i5cTŒ-¤­bÚÅ©(ØÛcTZ)e1"Sb�¤Ñ"LÈ@’S2iDš4ÒL €)‘ ¤”ÅÌ€DÂ&#f³e2I„”ÈB˜$Œb€C2DˆD2i±b ÂF%$ȵ4bH’LD“$‘ 4ŠP¥RM¶H#š‚a„1R”bB (°„))$¢ÊaR&ÆbPƒ# X0°¦PIhh`d,Ù“df„"bÍ‘¦a0Ñ‘Q",’eEIƒ3FE�™6f(²,& c(2lÊA4JfL²6FbH’ AšD¢,A‚‚ÑÒ0i,† !™A!€ÄÍ‚Š"Ô³ T‰#1 ¨¢’²!$° Å–LÊ(H ™ be!“Qe6b@ˆ 31!�¥"ʉ†b†"ƒ&A¤i°aš¦©$H‚F3"Ì"$&I¥&#A’̆¤ÔÈÐf† ˜(�$Be “4°dزŒÒ!$�4˜5d™¦Ab$ Éb$M)±ˆ˜ešX©L‘*KJÂM IŠ)�‚4™C$h²CHƒR%�A)”K""d1 ¨šPFAb¦Y" !FD”(„¨Š4É(�$)QD@™ˆƒ,L³M�@�ŠšV1F QM"3@³PdÀL!CQ@’,I(Q"I`Zb™DDc%Š’ )F"1@bd#b!‰`‘Di‘4Å LÌ�"M¥)BÌ™5!´Ì"Q*6MÉEI4`ˆ¤RHŒ�$)"ÉL’ŒØ,ÆÆ!I–ŒL…B0L†3#J`¢ÁcJŒ€hA0”1ƒƒ£2FE &HŒDÑ2‰TŒˆ–BBF`–RÀH…ÓB”ÂFŠ� 0©6RcI((JCFR¢ƒ0 ¡@À¥ T”Q"hÐ Ø4CÈ%É1Œ�ÄÉŠ"ˆˆMDRMÃD€B F c B“”FS #D†AŠF`„“Ê0`Œ¥6MRHDb�d%cA’‘"ˆˆÀ`Yˆ$1ŒS"”X„Æ#F'¢[w6¡]ÕÛº'w“Ñ�»¶1UÂHÍtÙܽÑbéP®çÎL‚íb±73¬pC].Ñ�3Ý9••Á�°"Hq!\e1Ö¡k«¹Öñj•5–qÓ“´¨¿bDîDoˆg¤M·ÐèÒV ík<+–†7¼ŠÅ2l¸aNØ{±öoo8$©YJ¬½2�®. ßi¢÷¬lYwµ"ÜZÅdçW� ¼÷U2hS_N…íošc8ëÏzÒê¡’ï­¶G·kµY�QL(û:—’£y‰&J®Ÿ�/g\6ö°îsÌ/ÄV»±[Hêä…¶Å<<5LÝö¶‚ÙáÐ'Ok;Ƈi§u¥ø�Ý‚!]hÇ]Ý{¹‚òe¤«yn‰Wê5”ûaô°°%ªA[a@ÕÚöÖ +ºÚwË/]Z³Ä©c‚{]Z†ÛË6˜®ÁÌPh;@Èïc¢ºîƒ2uìËÓ ÐwCpb5λ©Ò˜ 6oMÁ]JºqêaÜ™ºh0[®yU�îTˆö]Õ3ѽÐhàÅçÕa ½§�Ù~ �“$I…RZ1·YÅL½ˆ¬¬n©Æ!,>³‘ê {LpaÌÎb[�ƒC-a»l–òï­É�K Y�d¢ê©GUŠ´,âJ –(mÚhi|éBÂWXŠCذï`™›!Žó/}uÏ6ú—Ž„  gvÜÄ4îÚ°³BëÛsÕQ¬ ½FøÞt"³.Ø`ŒãÜ.;ÎôèŠÆBë¼ØËF ›8w7S›„›vŠ8r6ÉÛÓ5J¯;Ûh-×ÖoUì™Þ±5Ì+ìsNöcRÝ“yöac� £¦'Bbt™¨åöV«;bRùÔ§–ÅA­g5ÄdÍG;ƒ©Jð+§µWKÉ[¹/99»½6�X' ˜ ì]·ÏMt«²jƒl�uRØæð˜ºGNó¥®}Ö“IêÝ¢Ô‡L$î«æÅæÖ (.ݧ¬b�¬k‰¾ÝßN€ìÑ‹¶KG¸ Ñz¢:·‰ãך°^¾&]Ôq4~k.·(wR¾õÓ Í”>76üóÌ;»>ãK3e2êdTÅÞdH4ˆÍ[£¤”d«µv^u]Þ:pX턈÷^%ØèmGA†é*áÓ®¨UE¹„eì}ãB!Í ƒ]õqÝvTãU&‘³¤ºi,‰iÙ9ÐÆglsZË¢æiâ»8±nÅs]x\ª‹›ÀlŽáÜ…¢ }]^αY…n ÊÀý+ Û©bUJÜ8„¼ G2»(Ög ÇÓpû¶eQÆÄ¦O ÓŠ»syÈnݳVE\õõZ p‘½Ë�'È× éjÞ ‚*4+Ù™Ô«[]›šaì[DãÅY~ÍÐçnnØic¹¢ Qö—ėΔ3:¦C{õ“Fjì³%ªMõø ⣖‚�TÙ{Ò &ý3&D6,ëBÇZ¬ =»Úkƒ£×¦l//Z”…!—Ob¢ ªêìO‹'/FÁbv’óÆ=={×TVõYUUÔÛ˜»³W"U+¼7Cñ§c:§x·q*Uîµq¼`†ÃÊÓ•ë³Æ(w˜;o/¢|Ýr¤¼ò�-ì²Æ,‘&%gU!•‹*Ëê»Í® �Ƃ™6í—W�s·Žè#f_lª#Fs|ïz‰3�ì rn³ÎÏsã}•ieK×á%Þ¯ê¸n^NÌo«�»!”tUàŠ„4éҮ鼰YÌ]GYw—œŒxÝ=س–ÓyUGlVÔ±=£p�ÒlñsÙh[éemŽç‰§q±²ºPº°\ÓdKWj¶fa€æž×ÛëcáDä[Æp `k;¤ºšŽô®œ�p-këÔ¼oT}Ö;˜t^hùÙx|{R+¯F|a÷ ¹Mö÷¦‰'ŠúÅ,;¼2duê¥yµV…à „#v5ï3}Ψf�Ú®äÞ±… (UáYÖ8×VoflÏkRýÑPo`ÊlV$Wë7|6°W8f% ®Ê!^h§º;\vA#²©›MíÁ[uK»�oCÝDTÂà:f7ãDK�Ib·XDvº[Æh9ßÞ'&Šù*7�øHíPaÎU•}¾9Ob—Àì¼n“�£7&è{8 :"wÛSÖ^è¾tòw{k+Ý®zÝ£›~w·ÝÚ:‡-�ܪ¬î*zØ|-œ&³%ï4»7�W�ÊY{HSgEË>«¬}U<òÞÜÞ‚åVÙæw. º’ÖN�…�ZMÕàܲN„…ó¨úˆ ÕÙÞ9º‘!Ú×ÕµÞÄÒ)�œnJ:nøUª»6°×"žsÐó¨á§ÊïW`w”§Vî.S¸˜Œ™Ìƒ�vBQH�Ï Æ²²«QÛîÁ[gaÑ»‹’FUÝÃ%nÌÍ*JŽÈ%bP‘�m±bу›ÁS»+%‡Õìqôôuª…AœÆv‡ü®¹f679ZïUæ…•‹xsΗ½›Ñ꺎øçU¬¬¾NÂyKV¹l4û—Ãyc�Á®Þ•ÒP–è'PÑ‚^qK:ÝÜ6òøQ!pì©®¸Åfž¢ûjšµØti]ʇaœS‡%à"×–Êòžt…Û4<EwNq[‹Žå÷An& µ“ÚùÕ-õ ‡Ó [Ï.¸í;õôÚ÷kÅ�+µ¾/œ±^Ñ ˆétí7vö1Š@†åX9%°sFX¥–Õ®ì0p™O:ßv9Õ ½�ÉEËF·“©¼ði¡aâ<숼7Y�`Òñ9®î¸²+fà®® û*®ØÚ™XÅC´²j£HjK[^ŒZSȣΥ­z054Àhem¼Ê·íå‹2]D.v3[›yå›V}W]\ˆ„h«>†vvô­.º÷—]:«Á<«&>­±]pƒ]Þ›zx»¶" g›•:‘²œ¡¹ñT+o›ë‰jÄ[€Þ—иApîÜÂö!+GQÊÒ÷B/œ fßZyÙ©ƒ{ÁòË4:ÍîÐåEqÀFõ ˜i ƒçÇ€ãá·ViAØïàÛS…�¢´ÕoÄèpÐv¬Íé#ò÷ #ßÛà���A@! ÈHHEþÿ`Ñ×Y6¦aµhªÙqÚý•ä~Z˜Ï÷ÿ¹eÊ`êõ$qåÃ…vG^¾ôõ�ÿe/û©ŠÍ»²î¿ý»˜ó6.)þ?Õ2(ú�–­0¢kûî·d»�õXWóÙ!ËWÓvŽ糬£ðØÚ×b["å�o”þ—„•+rÆKš[ªðåû§–¨ÿD”Ÿ~ÝW0îËÌ;aÏïOèuê—½»ÿöP R¤åÃÂyÀ·?¿�ǃ a¥“ïiuõ1±:At†_îQùïÞXÈ[PÌØ[cí®ÝcÔõéü¸êçþió–töûšEúpyÁ*)¹§XLD ։ϮSÄžÙ‹f<®¶­tl„—]ö¯mýu‡æß7ëhxp…—qýmBÚ=ÁLYgÃ0â&åã¿n¶ÏXTœe]ÛÃúÏú 5úšöÏ'á‚ü–ÙìL׃ü\'ÉÏÃMññvKÞ‰½žÑZJÎ`þlCw‡Ë¿çÁ%ð ÕüꜶÓgŸsH8°·þûi2žO<á3Láߣ¥ßMÅãðªÞíŒrèþd[ã²í߯ŒzIäìÈ&n¶ø›GŽ0 ŒûÞÐk ÄAØ¥ão{‹Ó�lÏ=œŸËM"O5~‡u­ƒbGì;/ßm¤ááãïvoº3#öœâ¸Ãüy½žÇ¼xŠ:mè¤Ìr^°åNŸê³n»øñãwCJZ[Ÿ<´gîùÛ»·ØnÚ3Òk.öÁícŽ™Ì»¹Ÿ»ù"LûB,óêGÎ:~Èr –?£‡½ÛvÇ(â%{îg3èAA爃´PõÊ-Í%Ž8¯k‹»?ðŽl«H•Ègä) ¥q<çhî)V0Œ‚aHÆ®\J(Y^µºG†›â& %Oþ!%©‘ôøxäá®ó�ÄÌÖãþLe>ç¶)‹ßeÃêú‹¢S£~ô"À(£°bµÿ“4‹§ÿ!!!%Kņ ÿÂI x!ï�W\èqL¨@ègâpô§\Ã#ƒ“£ÿ9pÕðAÖE½ŠÌFHj@‡TPL|F‰²Æ©¢h‘R*¢(J )È©•Ž‚@º’I l«ÒÓÓ(„kx§í-CþAÿ)I˜,R�OM&F�·f9æåfUÖŠ¡'NÝ’*•t´Šù6Dý,îY`Et­à��í:D®½�—–ñ=±ŠRôr—õX9½¥a“/"…%.eIXÉYÔ Ã±Å²¨Þel¤†J’`‚­ aYC h�@ܪT±O0!$·¾©XÑòVÑ\ pWüÏñ'¯Yîw¿á¹‡DáΗï³ÎÐrBËA0´…†@š0šÉþyH• "Á ¾ü˜•VôaiØRÒÑ ´Çé¥1<ùÒ>Q Æ/6ü·*f¯I9íJ1†�ɘÝÖ'´¤‘þ�—€¹X‰$òÇ¢DµÊê}º:pX®²²Àb¹E7È�†�‹Ø’HJ¸657µÝ¥ÄÝ"ã¶Üým›Î]ó2• þ š!c�Crå <úÚG0 AŽ¡ug’ê.t+’„i�ÑŠæ&Ðê$„„b³ìKŒµ§õÙÚ¾’dÌeÛ·üË'ywKÃa>4³½ï©\uåÏú´DÕ"©$É­ŽVé0ºá#db,ÒAî ™@‘É€ªTgnŽ¿Þzdóak[B”]].ã‡K¼"†ÿ aÉH1)rLHÿ_@.‰ñUfç=èóÀÝ S¤©VIŽý×y¡ÈD!Ñ‚B@#òâ yÀ@|ÙÈbZ”(KŠ5=äH¢éøƒê䣪qгš *y‰ ŸŸñò”ÀwúÜÍ%ž!$"ñ ‚¤“´²ØL¿â­Œc‰iQ� ï{y,$vß¾ îªAÈ¥2¡ƒtPH i$ q`„w_«AèPPR•×f‡gÃ6g ñᾯեH�Töÿ/?.óuJ»» ~Á£éã®ÿz´êw:ê"ÇsõyRQÄ¥ öõóŠzûL¿0µló¡KsëljÆP/qV–={?÷èúìÎ'¼+ë=úa=/ˆ—Sæ�ý!�•^?0¾9dݸ¦K7ïéùº”6ãÖ:;áw‰�e‡~š—÷Ô|tŒ½Ã<[çEºöÂÿ8;ãºÁ‰‡û:´xÍ}ÿà¥)@0lé·ÆKešúÂ*?T)/�’*3Œ2Åf•šlðCŒ6ñh÷o¼ÎÕ¿çvæè”�=;M~ü¯n$|ÃÉ߈ǭ­5s7K2çÆ[Ofˆî¸lc§Ý«å¿Ü÷ÇŠïŸØôþ¾¹í<ЛÕ�ìÕê‘¿3ë#€ûåt×�wí‡Ø~„k–íëæ-÷¿KÏYè�#áÖ‡ªÍpçw<³^°Ú§Ú{úÞþww#¢úÙŽíœwk‹æÐ7µ»|ì_ÖVÿ»JÐ"§�[ã«:øÊ1_£??9‡ŽÛæ×û>ÇÍ`z¥ÿs·Çý)CjwƼáÕ;ˆïÑ5c·M㿉ÆÝ}gÆ”óóh6}Ë1r‹ æ g a¶$ [öO¡™* 0¯Ý;8qî¬øíÇ\H3öãćIaÝZ:Í¿oÕ—¡ãOës’¾9´jnC­îìÂ<ëêûË\fbd’Yó¹¹Pýƒ‡êó|Ý®éÇê~§zåŒïõcV” 'Gápt öruÛ}ë�…��ÂÔ«i‡jÇä Ÿ‹©ô$‹�"é4ÓÆ_(9g¾£ôWpd„–›êgL[Á8nÒëkkj×­¶u?�ûùþl¶ãÝÏ%³K1 äzrJ½Ù|ý�±×E~½á¹ÊÌc1&à=Ñli�¹¹‡¥¼®ï(òUbu‘ŸH%� ç×U- |ªÚS+ÜÛÙ%üÎPhè$Añ—^æ�3ӓܹg½ÿ›Ó?Úgh�ä³ÒÒg�÷Èc•8ièá4(&R$"‰PÖ(Mõ«ß«HP Š,B,׫Aº@Ä¤Ò t„ÙRF„É ‰u@Ò#˜$A¯�M¼|Ô z3(S”eü­í^N<è^Šç;Ì3Ý×ò+œiÓ”èæÅ¶�”¤¹äõ`Š¤Ð‘îäaÊÈ„ŸýE`i 0e™" m/6�hŠ$è whÊ)*¨Ï&S·ÁÓý|È�·2÷¼lóà×ù»$´[KUP«éU‚±g³4ÛH÷ÛÕížuD Lc ÀmíÝ¥v¬HT ƒHi�á�“A L&–C•]ÂIIǰ„„�-´ëã¤ôÒ3ËæÝ‹^ûò™¥}í©Å#]·�çÈÅ^‡9˜t™h£pZ# Y�вWò¶E�·D#PHHeT$]ÓrwR”÷8ÀpqúÉ$³ Êï[ ä}¹ZöaÃ0Q¦Š»ÒÜ]RŪ/4JF¤i¶5©픹þ”©ðKõÁwþ2?áÑ.Û¦Ål›?®†¯ÓÃÞB:ªšFNÆ�‚ÀY@6�…[mŠ \vnPŽU2�Þ„ft§2¯¦SCMšG–O ¸«}J€©䈪(áÓ°ÛUÕP*P®BI gèûk×Û˜„PH_|ê9J„¨¨z/o×\¶ŒÇ�#JÚ!AºRnŒjäqGž Û4ŦW=å~‰wÒºñˆ´p§€�@�ÅŠÚTJõÙÚÞ§P�Eñå×ú|OxõãzßÏF޲_{³zÿ˜µ]�;L>O-~™2þ>’ÿlí^ÞyËû:e½±ÙÕîU‹Kç©ñÎ[6á?Ä(¨<¥îf¢BÏlPU»l=¸¦/%¼=þÃ0òg¾R9i»ÓKñ®»p^sÛçW[ñþ¦9ÕpˬÁâ@7õ?}­›½½�žO¦)LôÅ{;‡ô�èkqd&ðæ�Øî¥^ãȨuh&žüã…Œ½õÕçi"û½°Ñ°}ê1šoªKç�që¿Za‹F„$ëUa—Aמ——»‹O{6šmk„ë¯uí¿Ü½}zø�Òõ¦6õ8÷æ––ó…ä9êÍëàS³�†[÷[í˼G·¿~çyê6¾Á©& ´^x[8/ÐcWô°¿{±ß#.âmŽç_\ÆZâCÇ‚“EZþÜšDÆÛÙ'Û©¯r¯ió•‹ÊÖeíÿ|t™÷e-Ís±Y¶v9L¤,Îþ>t‡”ä'IGõsÍ“F‡Ì”û7oÚsµ¥/A´˜È=½vëÃùÁm½6Åõo‚Ý^Û“ B!Ž\WÍ7ý„±u)v!yûÝb _ÞÕ¼÷˾m.ŸççzêN ×n®6r‚ùØ—ÉÁ}ïûû´¼/Ó,�ó^£q~C¤iíœ>wG5zo2t˜Ýÿ>£æºÙÚ^ø*Ép€+¶º�i‰Ñ’mÃàÃ(Ì*Hs!_øá¥«HTT ì’T‘†[Z AÆ3åÛ¹­.¥å÷ŸËF*‹ÃëR´Ö7RŽUtFÓT±¸~€’I Y~u3èâ­2í _Ve‡2LÏ­85ÙI2�êL,¤4ÆÐÓE‘™{T…Ä�¨ ÒbÞesŸEÍ‘ ÎÇw¢’þÂáüÄjÅ–¦�•¸¬“F¥Ûr,�ýª("ÇLáFPXVªCC©•»fÝbYQPú¢—�ßY˜DëL$ê8} �\-œÎ«r2 Ú»º Am�¤ÑŸ¯*U)C;ØŒÓ̓m׉.‰Dêšðö*3ÐI ðn^™?Â(9óqò(‹%»±Á>{ⱓ�ÈÌÐÌ„Š*X¡€ªU©,­¤:�gàµÌ@BÌÑë–e)OŸÝ3­QN &ò§Þ¬D ¯åDvñ�‚A"€°(‹-²V”ÄD‘UÆy!Töt­“ôBB2BB0 �0HHt†#�o~yö´±‘bC UÅ¢Eo(¸­œÈÐ µåAUå¥CÕ/’Þï çné©:”ð YÊQUá *É¢%¤”Û�“ºõ }¶HICØ5è-P£>¶J¨2þiâJ™[2™á¢¶ÆšUÓaY‚ú+ÛÐ’HKñ³×ãž¿tå×ëÒy|þù†ŸdÉ{É=~½{÷êQkß�E(¹ŠˆÖb¾ú÷Ö!pÏ'šC¯å·–ß©¸.ÿ^Þ?°-³±‡%Ko�3݈„vîäWEÔÍ_!šQí ŰøÀËÔÎm?;b‹·JÝQh—î‘ÇYE΂ zµ¯½'ÎÆKб8mDŸJÚ&ŒvúÉéË\í mË7nÛ9«©gb®‚ì·Œé–}ÔÚ¦ç¨ íl_¸²õškŠÌ¼s¾}myŠÂ(Η¥ašIˆ) Žídú¯mbœ»¤ÃVínçñô yÝEð’ééÿ(´Ô:j2¸“EÓôß:ƒ=k~Þ¬�Ò‰7‘*[, ÌÌô¾Û–m?{ËÁüýç‰pìu-WMæ3(/#ŸšèŸq‰†ÅpúÚc¡…yÜ™|ö7áÑd_>Ùšòû#ðê ýâÖ Æ[ñk޼|ó(8½Ê�û;™÷/Ø“LZ×6^~<ˆ‰9àAx‰Ñº)¬öž :ÆnfÝ—û~{ØÇËN¶m’:ˆåíž�:óûÇœü�(»°†õc?MîÔ¹9ìÆÂ0_¿/OdŸ$s‡.œ>ïZÒÎ÷F%ë í®¿—_>wýß·Hõâb4nãw·wþlÖ?ym8¬îî˨ˆ¬zc<úkÁ?µ÷!œÍU„|ênÜÑ�¿�Õ›´kçÞš¿ZG¾Òc’§ÆÂ>W¦vfÙ‹m+zaèñ gîìûëêθû«¾G�_užñÇJV«¡ù’Úóõ�w—ß®ïÑÑT«ÔåëǹÁ¯íîfÉŽ;t8±œ½¾ênÏžñ{Æluüµ‚—¥×g² —I^c³kCâ•d”^±!SÓ>ö›žÜÔèÌ%�4ä+×uP(\‹¨”H"·„¦ÅURÓHíéÅ—¯·ðÆRÆ(Òï¨G>FùŒkô¾ýXÙFá&ŒÏC@…ÉdР «8ÊSt¨öþŒ*XàÇ‘=qÑ´ Øß¼o£ 4¡¯}êÐÙ£¨¶-KsÁdftiCn•Ó2’f]hÂÖi¥3ApÉ£:n•ø5ˆ» bo´ÁÚ‘¦ÔÒš²ûŸPãùI€¡°–:q€†ð4@Ð¥d�:s€�¦åÄ@°^Å:P©®©EW`?š·²K-” j’ÿ˜Mß8Ç@Œ6‹u¼Ø&„¡Íœ³E–å¶Þ°YƱñ:ññÛmCâ#3–ÁE[#¿EA(ú7¸[ó¯XÁ�Ñ|í�Z3ÈA\¼Á)+Ü¢d¬Œ Œ(àB:Xÿ1„Ì�èëT±˜™”]n{ÕÄS,dYÝ’b—Õe™’š8‚ �‘Hc5H}·0­IaÚ"”s,U…op�Exþ8å˜7©œÅnÑËãlg¦O‹× ϬÊ+G©jn¥­1ñF»!Qƒåw´ŒT¨šEåŒ:Ã=ú^”Ox[”„Q¤ÚÙï'jP›C-¥ Y“ ÝÅ ä€*Ï$i¥±·Ç*½Yîø¤DQ™ùÖ|™Ý&ÃqqÏ׳ä¨wt\1-7ÚyK§è$@Á  „€E—¨1›÷Hþ²v©/=òD¤}*ôªüú¾¯-M�K!Ÿ ŒGI¬£� a2)HI41!¦ÅîƒQˆ¸Â\="•“SKk¶Å³Å ¹¥2E Ò¨¬{ Aù‡ ¨iQ“`ª¨³ :…{üá �¼õ˜:uSæß-·yó·Ùtk-™�zv7g¿Õ Oû¬mh�X\½ÿ;½ÿ’ö—­'³Âøõ¾Ì§€~zÓ©?,Þ>>{öÒ·pbƒ7±U¾ex>W&o{lëü¨ƒO8æg›ÞeÝÐÜß(¥{üæáÐã©ùåŸcJö�uâ &YkÓ+Oñ맬$ÒØ{ó×Ωï“%ªu-õt%êÚvmw}Èõ×Kãž‘‹zòþeMÝ�‘4Õ2Lð×VúVÒ—]ûåY­—oR©¥eX=ˆ’ãªá)»½írfØïÒíúC‹2ÿzÝ{[Ã}—ž¯ï1Dø ¾·ã眻>wJ^=ÇΡpÖð›sÒn`B y}«¼ò¿Lfë”.b‘¿Â‹Èã᜸®{=ý½òŒßºöÃL篵­´­�ÇÏ>5öTî¼ZÚ3õ?Ç…¢à<ûäöcC`WñEÚ[y›¹•üüŠùÏÊ/¾pÞzøÝîs1æ•�jâý¨6ÇGNütí‘“\GÞÒ—Qâï?—=ûÂÔ%KÍýšÊ =C][ÓàÓéh|ÓuNþz ²TuÕ½Å{ÚQßÔe oZËÊ@î& ó£ uhì £RJ{޽õO 9áx`‘Ò°–F{í¼<¹ÝÍÞkÓ?©tÖØõéÕôú½úH$8g¯Vjl�Ï#ÌíLòÄÕtô°§. Š^¬ü±¶ØùÓqM£2Ù¾“öŸO:˜Ø+mÝ-šÎK£e ] jC@sqNYõ¼o]\Õáû[Ðä?ŒÏ“ò¢ j4ÃG#N †„P))ËY"Xt)™Ç•­èñkbžšÇHŒ«¨eG *Ÿp¥"àP«h 2�!…‚ e¡~G}S³Å‰çªÿn5¡?ÜÍGÓWž2ñ'¡�¼”Á°A–E‘�¬åY†T$ Ú¢)DZ³»«ø´bæy%÷ �¦‚SAW *Rf¬Ù*f „_w�ȉ 5¨±>ZIÃ%§.žqA÷úåõ{eÌ’sg6¬ù=Ó4 ¸ÍÅ"ˆÎœ–]#ÍËÃ7}Ÿ³7zôskÇòö/û]™áŸ÷ÇOªÐñÃiº/ yÞ€ef¡B,Ê’²_¸ç‡Ó;}OG¾¸£¬ç–Ö¶EÉ{zdºì 8}À¬—!‹§&BQDŠ TáB_@� Ðe¬Éc'î�Ïg?Ýï1[M'\ç�7òÈç¯ÞT¤�9Õ °ÑhLa)K’ÜçB(Ûm��±S³•(¥™Ìôuâìå×¥²‹g2ñ<ï|þðcÛ¬N�n@ŠM”h r˜“Sí�JB¹¦”…(Ô©RMZoíЩ “·ÓZ2îþ|èV¸íH¬e_óÉ *•Æ3eu Dá(Gß"É ø„*Ô,Q „úZ%1ˆ(6ÐR@MBL ,‘êPI!,Å•!(g™€KÖT L]ý’µhgö‚¢ó'Ü!�¦h0„‰Ñ™eèxÈJìÏ"Ö�çŸÆV†ßdÇhRÍ#’ Yô½É03–‹íÕ+&Xg4~¯ !$¼¥(¡F§ÛÛc+w‡›Ï^©:Ÿc.õïÆeóÙ�ÌW—q¾Ážóîôn³�€þyí·ëžïí�uý[i°òŸ8à«×·~½ Ö¿qfwn zã¦ïÓ~ÛÞVÎÑ*ÖÛæ\ö7§Ëþv‰_OŸ �íÀí$¬ÿ?Åôƒ§#¿m•{�þÖõc5( ¥ö·Wê�§}¶üúzñû}�EŒõò_:Mð =‰ßnþ¯Ôê|g ŒXú+ _n‚ Wbg,í¶·×Ó§n®_Ç„Îý8|¼s–ñ¶¿?•?®Þ“|ß9³|³ÃHg‰ò¾‚ Æb’ôžïÅDeÃê¿wwG)Ï cz=Ý™8’ü²‰ÃhOe¹¨£?9Y¼¶º¡ý>}x�}ÜnñMx”>…³ãÙ·O_|\O¾Ì ç=ü_Ô{zwÏuªˆ„Pý–êdÙï äÖÎ;ÃÉ3Û'>•yñáÕÈD 3œuóógžy#2íà²ÿ·¹6Gû¾óóbÛ*éY:пj^Þä¸õHx÷_wù?Ä"Ýíï Þ;|ßåú7îÒǸö–\Ý~WÓ Ë†œ^6ëãâŸÛÁÍ|¯]øq´mÇ«j¾Ó4ýwëò¸MW¿<Óå*ÉnI“®<·Å~Ê’è^î7µ¸ßÔŸGi›Qœåy^ýï8ã2ÄT{Z¤> Ä �Ýh}úòD³ù´#]'[ƒòWß’Œ×ñÒýÙ÷ÑbNL¿k+ Ç^/ü yŽjÕGäûbÝ;¿ó&Ýã¨u5²¼š¼ ¿9¿~ì¯L ö6ƒ9këàEb| ãùáòû8GµCù¬Þµøê ã×W°nÞ£, =vßŽËæqš³³â«6˜½ œiÙdL9î‚5¦ò"¾µaa¢ψw‡s{>�3òdÀúD&—×µb"Si´Ö7ãGŒ‹À™F¸thc@ ²C8(;V¢¢€`¿ ��û¯”eã(—å—ÍwÉÑïJQdÃÑíRÁëÉT(ŽSU°h(«8%H<Ñ9ÄupswïQÔ&?ëýËKUË5ÌW·a€· XS v0pÖ  =BT• T !’dèRpf”Ž6@ ‹1@Àüp“ä£÷¼Nÿ,_\£*³?¯NÜäÉ÷¤b=ß|ªuÕB«lbm&™èÇ À´�£�tB7½,ª ŠŒ!.øcšµR¯sÑÉZÕ™‘(4»ˆ2�íüqÏ)ï3qˆ 1è žrøIÂE Áu,˜¼�L<©ªa›QjÅK(ÅÛxX¬ Êý¤0O:_×|ÝÜ4~•YHþ¦üq„ݨA�P”%ø0GßÌÞÚ^C“œZ»:� ˜F­€Ú"™¬2³�“ Q·éÇ›ÅÌÌl.(�F ,¢äŒ²·ú.äÿõ#õÙ”éVŸ1…<Íåé¨RòégFgÖÚR=+¡�`JJlæßMÃ( [ Íá»tÛ‹Jö&ò¾t™¶Wðé––›À©¨·(5’…½åµ',ï£ÞÊõÑÚÜ×Ò*3e‹*¤ÂÖ†Q-@Úɨ�æ&¦~Tà» €œ¸›zGÙo(wEÎqIÍVâê@ @‚ÃÒ6ÜCÐ3ƒK FJ4ŚǗxÛÛ]!ë]3ÒÍh¯Ž¶££Ü´·Lÿy>breˆ[e*!jTId4~ï'f4£!°·@(Õ]Êæ{M)q ^_^©ij&—žå<¬¨Æv÷Ë縒®g% €’ bFÑJ„€i�è„ýî>Ü�p® ¨u*ƒ_Ô…V…H ƒHI½-Bô. E9=t5’¦v�t€ PÈöí©¯�L_Z5‹ÛµC¼oïž±w¯.�¾bû?¾“æHF™ ¯N:ÎT'¸qö})Cc`¾ˆòŠ­\â“+}Îdž*þ-ŸÒI˜’u …[owG¡�Û�RÂp’ýuïYsËåúÒ]ЄEm(mñÎõ˜Ò&s ee¤0°;sÛeã�ùVðˆ’jIn­òæ �•ë=YÓeÏä{º[l”ú°•%ë ò±KýÆöóöý[Ý=²(]]O;ý®ø÷ Ázo�xàt§V|ßó9húë}ê«í‚ŽÚ›]ä?½\7Я++Ê+«W_N1ˆ–ªÕ�lésâN×”¡º[ž<’ì£�mžÊ�w^É¢uxõö"&i@b^È»3\=ýú÷bþùòœõø‚<{Úðgj×?|"÷…xï–üŸ¯wd^¬ÄoÚ”oa¿<ñÇ¢Þ9×õ‘±tðéfW­Ê$3Ò¼U£¨'$}lÏ íÚƒ>_9ŠYûËÒoÞ~o¶]Q×¥“ÂpŸ!CpÆ›ûàÕ_qç§ +óèî[ýó~žw®à§.ïŸUŒrSÛÔcnýCƒÁº¬taóèo,!‰õ–Â> >åu¼±§^ù°«s«Ñ Õ#‘Û«uw.ø'ý´-†•+ÏÆ?=™ÕƒÇëGÈËöMب{¿,€‚»õ\kà�çÉÆÜÆ~ „ZÚ,\鸌G¶~gµtÞsªé�Ç­E¼¿ÍÖLÌ÷ükôÞ.L`¨$ªÂµ’«Ò„‚Þ}™2)‡„hܰ¸þ’ +4‹&‹¡l1 �‘[‚Â'(�`ª% ¡2 ‚A�ó`X nNç‚KMŠGï|J�õWw¼ ÕMÕí­ñ\´´i²YaX\R Gv›”fU�¡°i¨üš¸I�¦‹Ý1&²ÊÊèbÏ£¶gŸzGìØË›Ã ÛÛ3;l­K£TSß…(SH%‡ç &¡W½•‰¬‰´U� V~ß1m`€´E÷v B#ý�Àï�„ZÀ¢ ù[`’¦¢3f[¥ ÔïðäEh‘²G„-äDÆ- :OÇÖQÎzðGà†:Uì~I%ûR³95"‚&Õ:òÐn7¸$$)¶ÓLúAÈ·�rýªëu#¤}~|^ùgF�Á,Q‰r\ºÉUd£k€ÍDa«*÷#ƒýSr„ ê?2cØs‘0ý9©Z·:Ôî_µ6rf¥ì“ Õ�•tÊ»%Uð )@7$驱wºƒ&:(Ê^ÆS]oL¤¦õàhúiL”4½™«”©Ó£o*Ë*h$š&Ý׌¶qƒ|ű §2nƒJ.AƒnÑ©\Š9Ñ<69¨…,aÈ�4Ðç—}§ÕîÓ;ÈÌï`¶´ã=ŽöÔ"{>ó7CôÄX£–3bÌÞ8i•k±!`3;¥àF‰`’HKï¸Ú¡F˜õg«Dî9�Ò¨Èh²`HÔ Ÿ-1¢µ„¥À0ýŠi Á�Â�1KISUd¤Œà,ŇÓâ2n9M}å l&£Iy´�lÒŒ–>~Ý›|g¶øÞå~ÆÅl–¼ÒÛ³`<8–Z_,V>HÓQMy·¦§¦›—TÓÒñâzû\¼Ùˆ žp”UV’Æê9H€$"J ("”줺@$ß>^~œ�ž~_…,±ÜÎ=6#eŽˆÕÓ�Ÿ¼ú¿›$^غ«–Ÿ�°6ïØ~¬/!бñÛÔ9ºù”h¾ez½ Ï©ˆOèoçö·rí~ýšL¬R—³t[b>ÛŽzc¯|~ó©îÄš3ot_WvñÑ:,°€ûþ—LlѸ3_ÛÍ|DËrNž¸ï+2]=>])B}uY9�,QN ýá–÷¡×QIWˆ÷êcã(1 ­ß0âc²è; mž~~Ø2> ~÷šüvïÛ¡îß®e‰lù÷·nøíØf%Š`{`ˆ—¿μ G3ÞüŠoO×l–ØÞ?"cÃ$þg͹í¿Y‰ù·u¯¶íž.î½9�#×Î9ëX3ÑŽu©ï«{¯5ýšÛí×á;»þó }øwÚ\:}3gˆ³^;tß¿ÇËîÎð¾Ò·4Šɽ�Þ>¬ó‘·9ÀóÖÎ�L ²jößïÕdzȢî—_�ì¿g¥Yî-Á�=z¿HÃ'-!{3¼}›ü;úÛCQèKè³â?|¿¿�{'^vn§~}ã~,|=ÂpõÎõážå<Ë<Ǽ§¾Ò®ñgjÊ~ÏgÁ›q°ëÒ_ï"¿éß»,.ÏwO0ëÃκÓÍÓ»<°!ñÖžió¶ÈþcçÒøëÓ}¢ÏzW«JÎðVåô²ý^R|DÙ/�\z±tô—ùÒ²-ø¨ºûóKqó ½WÓ´zjµ&ó�f‘\ïÖÎ>’Ë­{¢Wó;Ž·í׎KÖ|u�Î6ñ,ù_ ð˜oJü¹eß•Õ/ýZ½¶61|±òüÏÙ`´˜‘’y°€3p…|šmº0‰Æ!&&/ ¥Æ6±õ7t_‘ÀVkþºÏMññ&LÓéyŸ/"StÝj jn¢2—RdåU©»½öþYÄâ�ÎÑOLo•*oª‘lÑÃ2øþ…›h Ýk·œêêé´Ûn&ç›¶"ùÂ¥¸ÕæKÕ²f©+ ¬¸ªÈ X–…q±ú¿·Q†Lóƒó-«VX÷‚¾ð?ÛÔœðâr’]à«Z„Ç;ØòvÈ¥™�0eÞ9¤®ù¹JJ*±6#0Úm*+ ÇX†]XI ¨’üSèth X8蔞/åß}k~ c,°¡jQ(Ka²›,šVI2 4ÒPºY1Àþ ¥v ’`­( ¢�\Y¢“a‡à–¨¥u?e&O�'˜MìÛן#k›åÊé’ô»]]wb´ÐRëïïeŠåӺ߷TX(~òÈ©†dñ^ÍZŒF´O»ï/1Ç)WUÏl„¨éÆíãÞÓONY¢âĺ±£[c¥¬?h¸ý.4ìç)}ü­l)G”fYå̉T0ø ®ßfåK˽øÒÆ]Ò¾n,ø©}&Éç‹ößL‡�l¶Ãµ/6û{<õ`ê_gß3�[º­ýKw[s^fZeÉž«˜é6ƒÃ;§BØîeý»a>?gÛÖŸÛÎí"ƒü 4žûF­Ø'Ýk8­CâÎ ¯&sŸ{Fb“ 5¢vg[z�÷cþc¯œ¹Õ¶Ü¡%‡Ý,·íV±~ºÁß •º÷êíë\kÙ~“êèo‘îJü¬ýymN" ‡Ñûy×Üííò³yN=ЂgÔö;n6]õ�ÓÇ1œ·ª/òx^+ô�}Bêf{½Ùù {yz¹!Ï­3�Ðú/Ó­�¬]{�¾<9¯žF<›ØåÑ•¯¬sÍ9€>´^~xf˜ZNcè¸íú°¢â×§X~k‚3èƒÚMð)Ý—i梞¿^m”g§;1¾xÏ^õžÌ!™uvþ4¡Û«]Ý=}J#áæ!8ékòÍxa 'ÜøFÞ\RñSÞ> „̳ô[­´à¡�Y7ŠÆ6WÇ| ÔõóŠ9îÇ­z£mãØ‹Æ6çÕß̤ì‹ËÞ— ‡Ÿ³LþùdùüiÇ÷ûÉ ·Íâó4�hG‘¬gZ˜c¢±îVk'PGÆp޹#QŠhd’X7)'‰Þ*YŸë'Õˆ´ùÒuÛ¼ÄÏF/ýúë<Þ&‰_šSËÜPÄù PPðåË÷ˆs\Va{ Z@X³Wv¸}š£Éƒú…œF/Š8»¥)½‡� 9 $ª™Ó�¡Ì.É4Ž­*xÎk1å�)e/ÒJÍ :×¹¢*ÓaN¢H‚áœô鹌fSªÏ´FG@Á©CÌ„–Ü!±�µô®e»ó¦–)¶z»Ò½þ¤é¦÷×<�²ËGJÞò¸Ï0A¢Ô¨˜ âX¨Hä aýñy·¤*|SžT�¼û{eRÎ,÷2Œ“«<¬%7-H3&—ƒÍ$.h]ý¯Çà ¸]*¸mk7áú\“À(tg�@0•).Xh›ÚÃ%�‡‡¹óˆ�²²Î”N‚^þ–9U3Î:œT A¤ÄÉŠ?ÉþÓt#Q˜Ã÷CD^ÉòÓá‰Gœ_�n‰"AÍŒ8#ÅÍ'´„Õ£WsHx&+­É­`Í&ÌÒ ÙÆÈÁîL#rW5”d#žôŸ±•÷€Î æ’HÅ‹¢Í/ãI+ ž0Ìî0,DÈçàHbšHšHÜÉ!%åê#ê³C»_ÊÄû^ßo§Ãe*p1Ú·‰mËÊÓ±¾Þ+¿­ ñàß…³¼js¦Ù‘›'8À¡&‚ÍV8–ž·Áiþ-•ÜÎDÞ6îÍï15ÏSçÇ{ ãôö›DþPw^¾^p,öïà@RsGÄRƒ¾ÛH© S{o×{öÇu·÷Ç œ'Ó§È}/ú¶üpÎl¶î3Ó±~sÈý}Ô¿#™çôýù›6à÷úÏ)ð‹§¨sn¶Ûó1‰;jÝk³Û®Ÿ¼þÔU”â÷ï—h¸ñ¶�_‘¦Ežú ïß´]·Pk÷Îëfï¥ë-º%=rgF _~ÿ2¯û—"ã2�§}ªØü/¬�ˆ.ß×ÖI9óÓx&ÅÙgfûxÚ‹XáèÛ4j>øøÍuìËTmáÓ_œÉ÷üïzk ¼0l:à¡’ê¿¿~ëï§õç®Ûþ!sÛ[ïTökñ5T²qÂȺ¤zãÀ[óÒw¡Îy u�öÛÖ®ƒø{6�@P†É†² J».ç.'ì‘û±FW÷!žˆ°OxöÖ»ýÀF½ðÅt§Æ°^ U° Úü ðMâcˆˆw$N†µ7°'/\bxÙ’ITÇoº‡g˜mûèã¹ µî*}¿²03£gè% Ì~ß·¶,,(¤ð8X‚ý¶T£¢Dý½P]ÔBÇX®„Ë©f¬%n‡‡›!¶7œ Ø&ΪiB@[+ ÂÍ@“CHã;%ùòào6Ru¥e{S³úŲ»~¼¯�­h{oç û®­›HÓ¢NCœ“´Îq¦ô‡Fy?&K£·Yí®‹G„¥`�e*H¥+¦Y*þ‰_ȃĬф!R�mæ€@X·-çìHü*¿h]pÏ] ·AÝÒÈBJ‰TKkëè �y !!„���@HHyB@#0HHt$’õBB=  €H0$„„` �HH\I €HHTI À$Aú�¿è$ ÷×=ú5|{Aä‡w·ÙŸØ½¼£×7-«>�€_vV�˜«"1‚tÛedƒm¢?ô׋#OþÿñKÎï!rôeYp†Î§ÅpJÐ¥'Õ;"íV¸÷½å<[P˜¯b$“oHU l…ÛeÍ�ÔßwKį¾koÍ=æ©.�ä¥ÃL«=dQ…ÙôjA±“P<‘™@éOkƒr7!nFÞ¥ß[¹3zÔõ¸ÝR-ïˆà™k]é™rRË“Il:”SÕOþ”ÈewP¦ïˆ¤bÖ‰· ÛšŠu‡�©š—¯n[QMp×¾)‹µ뛉’Â�#9*“’‘•:3£…+Gšà‡:òqj5¾¥È¦ iÅ›Á;ˆ{Ë]Þõ>©¸ãb®÷§KÍ[®"£–çm‚àß;˜ƒµê2µ„9Å9Ú‹•#¶Ö”ÊŪKµ ‹Ìwz|æ‰Ê�šiò8‡|T¥ MM•ÕbM˜ -XmUèÍdÄÙ}”Ö3C‹:VlISYI•®fk[’óEŸ%ñ×½ñäÁ6HC–¬ÜÀg‡oœ¡ôƒ‹}W ¡Ž)Ùà‰|9Vd©ûO¼Ç¬$�·i&‘ß¶‚?ÒîžN·ó˜×s ¸[{h玬p ùaBޏrLžtùÍÛÌhs7÷$dwSålÃ🎵]Ò¼5RNÚorQ¤3ÅD‰gMT8S�—5· ‘ºaŠLT/eQƒ‘—:’™ó1ëšÉ‡3�Ê9)YŒÜµ¸pÌ�A|j¦‡6ϸGYÄÉ8Xº>|Þµt2,LìÙÛ2beRÌØº´˜+ÌUI3¡t»1ñhª‡¾9æ¹:>ô“uo½3Näá}Õ¨Z&Nû¸Ào𻶍’XËõ_|¡ßѸ$Ë*sŠß4ëaÆ•-U!,¤<Že9uvŠä_o{O¼|ÄqøEêƒÑ3|rµ[ÝJýªµfÚÓm­e«FØ�,³ã_ãòò¬ûnxÆ�5”’EûÛó/ÒÞg¶Þ>õA°“‚! $Æ“"3ñøw'µº|ø9z0®‚H5 ;_'òyמ#åKΠ­ú~ð~F‰žZ¯M§Vµ£í:�ø³ñßÄHÉvá„WÛAJvÏÎ*8C0¹ù–þ{ÇÐ\+½Ê Pl¼IÁ:¢üûZþ€¥'âöØÄ™ˆQÐËN%ýÄĘö¢Ì8Íž±66Í‹önJƒY }n†¥QªÙî�¬¾?·Õ?:Ë<…:/2ò”ó"3DF[^qRG ïˆé™§®k*^KÔèAßÈ„ fî´o*o;ºf^–§E0Ç~»“u5Ee¥ŒˆAËÝ-¸„ú|¨3œ`cCFÇðú÷/;#©!fDÊsFG£Ž¿ò [MEO�ßF` 1RÅâÐäçÉcwóÎ=ÓMt=ާ/®Є �‚££,‰q‰ñ¸£ ¡‘®Æ‰¡N Iò"&n™y7S0¤ sm¦vL°ƒi4’Äâ’y±w²�â8HݰžÚç[Ûºt3é¶á²¥ &ŸŒ´¯TG�y>­æ˜_E&ÂûëK¨…{Ž·�åÊcÇÝîñ6;7U³�ôki‰Ÿ»dö/èÕZçÏ«Á.VÝÌ,±Åuc”a¤ˆ‡†—[/Áe,>æ=㟪'@å4�;s™è¶uÏ®öéä¾ö]_r8œ[,NÈk'©“r(œtù½¢BÈ÷.ù'Ú ò¨ß:1fè݌ɵÀrÇí/ëißçäð _9»�öؤۙôms ÒÍ;xé°]óT8[óÍ¿Cöߎj4-Ÿ»FDP¼P«³¥$,`B"„²%ü¬Ÿ‚)õHI Ü.Áo“äW+�ˆôÇàIÑIŠh"†F¤>% ¾Ö€¦�_/ŽaÔ6 ÿZ�/~{¼7ð2éJ^»ïs6qTÎ%Ã*ųCdekéÚ)‚éjΖX‰ OJ­G}f1­¹+¢7߫В¿6™ƒ Ù$E/<ѦÉÈf¤iPwb&™Ä�p„>4R\ %‡m�¼iV!mº¨Òg3`Œà(Ik�Ý+¦šØ#+t‡ ÷Åc#çëëÝKÕ˜>äÍØäÉZìþz޵S/K»,Ðÿèþ&Ñgï~^Q=*aÏѼ#œ©B'½E¨Ÿ w&Ò~¡; ¬ -ÐwOF+©q‹•jã�|¯w¼Ü§o–"ø³ÿ¿îÒ½µç‡pÖò7?L¯�ÅÍL]òþS‚?S<Íí·æeF¶®•ܨKµœÏnþNYG<Ò[{‹­×I Vlva‚¿nrî[bã;nb¬g»Õ:è©ÿzÌXÑzž+4·\ ÛìMWÕýaýï«­lÅu؆Pw¼Ávʯw•*ë–KüƒÂ ½Šê•÷(ZH΋ÿAÈ…l|ß{´ÎoÅ+>‚>vÀ»ìsÓÌÀ)Œo ¢ ~Z†�AÄë(×Çç½N­.8ã\.6øZ-réJÊ0Öm�'긔.pÂÔ±$Îê(Y�ÞFÜòÙDRLÇçàŽí^·O\Òëqu×ü›C5Î÷§S—7à§Þ/†g#ÏkD™dD¬"ÎIÁ}èÚfáñØ=×å¨ÓtcL/pZ:Ô+Ũ„ãbã=ǃÀÃÎÜ2†b*>ã·Ðë€úbcåÉ>-ÕëB½e� ‡x‘ãòÑ\“{í"ºG¥+­5ë7EI¾˜iÉ<x0õ&Gÿo}_ca@L"NyØn×=–G+éqïÏááÙÄŒ/$”v+<9>žÝ߇ÆZÉÆÿW\çcqð�Öñwóüêù”'E9ôFpãÂÍ×6ʰ»ä5Œ¸‘‰Ú$R[Hd3‚½Í5µ«sK€g{èeu/fbºñNú ÷A‹’ÓªãYq—„þÏmurº~O‘Ûû~d³¿%ùkѺéµ÷å—²F‘¦p5»YkM/Å$É]-G¨Ì\ŒuŒ k_ûR°a­…³ß! <Ÿ�°©˜Ló6SÐ0ñ�JÙx´|b™­2SRÁÕÛ|ã—– ” ¶^“ñfXYQ ð8 QXˆ[8¬án±u=Õ’á}î8×FXÞÙÔÿñZ·or „·¼ƒ�Š ’BI¬-‡¤—ZöJÿýhÐÆÌ�Öýîþ{�þ$¹B»uzå³�ùj²Eç™tš"�pb<#^M–ÔÅ�I‘Í>;{Õ¤å¿Ï‚z“dóIe-�Ú,8¾ÿJlÑAh"—÷ŽPzÇ€y�ü½ûÄÝkâ‚ÝÆ½˜�ì©O^=鱜ÒÙ,A`„î¾oVAó87Ó¢¹—SMœ¨¡²G 9€öÄb{ool®k Ÿ¬~Õ> Š´Kè­VÂOÆtö’à(àR%ïûíðWï@­JxŒýwå¾ð¨õjŸ`6ü<˜§Ê¿uÚá ‹µÖDÉêuz¤ºÎðDxq«]rì’Hð‹5Éu„£1³ÕW¨bûFi,Z"xxfHAJ»sœÝP2(#álÖZ¿*Â]‘�è¥x %ªkr.ŽºD!yzAùÙfçî9`ùÂg�tÇÈtº¬¯,wµ˜î=¼•på01mÖûÓMOeÕϹ+ PÔ`§½=ƒYªYÂ�1Â_yêóg°ˆ…£$VYzǾÎ4g2ˆK€R�òfJùÙë«Ý‡ä¦×Ûº„_ÖÒ³BAÓ_ùí~‚îæzÞ³µ½M8ñ>lŸ¥F°Ã%Š#ž+·½¹Œ|μ‹ãmv‡|žö,7“³Ñó‹%ÌšƒÞìkæ&á, w{țᬡpê ’Ð\3ÿÓ+V:ÍLB…ëDX�¥#mþ…ÐN{{Õ´à�Û=�«Xªaý�qj}& >Ìß“o�YÙ1E@ŽK€î«v± óñèv¨“Ñ“áðÇ(o¿wÌ¢?|,è¯ocõ”ü!¯=K\�X¼Èôñ¾áJ¶CÐOw2'†ÕŠ�­ ªNÔÏÌoמ—øžmŽ„†¿¡­,ö˜“"¾Ì[8&ºG± ^¤I¼ÍɲRƪ€å7A#(þƒº:;Öœ;;EÝr ì#ÏÙ£~ža�QùÀÄÌ@öÚK[øèüGwgËu}V¿¾Ó5NyÁ¹ƒmNzfõ¦l­)©�´ƒUxÉ:]lOú B@q‘o÷ôǾkàH_Àý§Ço-f·õ¯øÖ¼=„#¾4�*âËŸIüÇý�¥ò|oÒ:ÿÐl�¿áýÊûÝ©ÿº9(¦7ðP úÿ¾ÿPŒq糧.I«¼\ôçØûr/ÖCM#·–pgN£pãM"1þëc(éáC»8„à†*Æ�@‡áß¼¬zïx,¢ýÏäœ#·½h"f]¿¨HHG!IàW&kj3,«ñ�N·3TuiM,ÕL…‘î�²€M²õynž/Ž5-ëøvR¯¡¼¬Ø‘/ôVnÉœÑBh%A(D°M4ÆÂ�e¬hhÓud$ØÀ0eÌ–¶¡ýhÏ‚ú†“BCCBËvN(•i±{±¨ÿ@��¯Ò<¹Î‘O™ï7µÁÏþ¦•_ëÌ�´!Øú÷ÎûhÃMMÜŽ©ö­°g‡e|¦FÝ¢?Øõϼÿf‡ç¯�Ï6×$(NpVƒ!Aô‰iŒcMŠ}Ö�’‘Y—:ÄËþOîQHOÃA 1ƒhhmµý¦zÔƒâé§ÃHø×�;ºäÿƒ�[ŸmÙÕ¬>�ï &ØnÒÈB )^•¦<¼¼þÃM*øùÎiŠR§——½³âL>î £×^ªRÃ)Б¦¯ø¾Þ¦sDCæ ˜&ú3µÈ2ñ‹ÉO_çïì}P�£�ð$$4SU(ìöD„ʳ¡±Ä ¬—h‘Çý?41@†ʪܢƒB·ð�°“àP,⺂&}Ž®¨þ!œÁ±0ãÚö•$2C§¦)ô(, š�¢¼åÕ-CæÑÔè)g�64¦;\ò€H5Óõ ä[b˜ËÌÓ¬®U:Ó~±F{[³ô{ªT¬HXÔØØûé6N]:$¦Žµ²/µÕ« ·Øeº¶²x‹ö…¸[i¡éù²I”cxZAJUSŒ²Îƒí³ÍÂsG xômD-Ä›8~R¸PÊðxÊÍØ4"‰ofe`ýÊ?ïTòHd¼}~+ù£êg�4Þ–ˆ:S…§è$$<¥k—ßé|»òû;V %©Õ ”|4¬Õû-àíØÇcžß€üßïÈ=Wè¯É=—!¿€;b_�™Ÿô’¯êJBî_'Û͹‹æ0‡è$‘æ~IóÁ�öÄÔ“ŸO.Oéü÷®Q›Ú¿·ÌõûÏ—Æýqå,ÀÏ^i°R†Ì"o£ÉnB-ŠÿÑíû­M°ú§�æAI=…(qÝÃÔ.÷ÐÛ;¹; ‹…¤…Z]iÿï}ùÈ‹Nv\îÀ}Æm@ËÏ|òbS<1¡°›³/¬b`Õ2úâ� °2on^Èa§F$ÁbSñkÖ+¹Uç>�˜´ e"°”„ÒÌL’Y×7ÇYy�ìÖ¹ß-‘3<#/½èÓ�¥’eF>"¸Ó'Œ(þúË´Áð„ìH¬?~íð`µø]< Áaöœjÿ°·ª84þÃy•Û4K–þñÓAÖÛ¼TM�‚2�­‘ãåχ�#¼€å—>ܾÁã¹ûh9Í‚û ÃÛÅîW}Hó¼c»Ùóò [�Îëxó’WÄì =â¿ÉÖo¥ ¬/§!T(Á¥ JŠ•¾Pªb|(2j?SºÎÁPº›´�XÆ£”\+½¨Ä"à›�RØš¥ êê“ß3‘ûh}•¸-ï(4{½Mï.|^S­v×3=”"¬ðÍÙnPf@PË}Í/“�gmî÷˯ï³}£Õö¥ =�#5dáûûÑjÂÚ-¦aÓÝQÆ8ð‡œïKC‘tW› °ÉÛ-%`ª]²MŸn­µ‹s ·Yú`kN^ïçk÷ì—£¾wh_ê?¶2ê—9°4»^ÍhðÖÇÃô½!E*°F’…H1D| ¹)y9fxk$¹J“¼f ~+?¼°…>/KEãpÚi�2Iþ~Š]+\�@OaÿÏìsQû¡A5×åTd>~&¨ä?®››ó~û¢�ÇBh‹î8¨�,óû}ÿ«>&}^#Å£U¾(¼«£„ó}kBCžðyÎ447Í |fsTr')�ƯqqŒiÁîS“³ëŠƒ<ÒÒfbuzۺ惉ÍñÎ  ðZƒôà¦HQm%å&¥ŒZJ‚Û¿ù†HÝòoAW"¥³ím�”[)=βæY/È&Áôn,?vÛ�Óü™„ž�z‚é³SI"&Ì€wŒØÛ>õ7íÇ^Âá·Ý—›ì c,ñ„ ŒfÜl})ŠNä‘sò"MÜÙNŠŽ ZJŸÊ Twef:êËÏ[�Ÿ(0ð³p~þAï³ Ÿ)Ö–zÊ4/vê2ýϾ®™½r–Þxzùç>k7¶u›“y,,yÁpq~¯°äì†Q=t­Ùî'Þ#^æJZ­ð%@m5 œ <Žx=q’#üç¾H½ �ɼÛo-ëyG�<1ìLÆÌ&e °Þ½ ŠvO,‘ÿßúxmx †¯VèWݵӘt¸»BÍÃò% ¯¬kÅœ…¿Ïð§ŠÛ—,ïÔƒ×@Ðc6\t˜Â­¥ÁÃiàY•(Z†ç à/†£tËà•¤µ C&ºÊLšÑ/ÑONØ3Lá�øè�¹|r$ê.2˜Ë\£”iø{d0‘•`ÿÊÂÂ!ÿ]5ˆÿ8ü×5 ¯ùQ�=E‹n¸ŠÏ�öâãÙ’¯ïä—cI¾ufí‹+îzc;�ª=Œ7ã̳]ï™í»6ÉâáHÈî÷M ó¦ÖKw#³”8atÙß}îàÿRø?±-¹¨sÔ?ùñ½ûx[5ó¬^ø[Sà»aÝÿÆi¡¥æ-+ÚNf²uâG4» �(²� Õ½Z©±^äS….¥ ‰ÔëW¼˜ÙáD¹î§ Øµ!Çãá(zõ©í$í0º!‡-1^™Â§KmÏ8ñîu=?t™ÞÖDÉ�N�µ8¿<…ð½ûÏ“‚ɡϽ\ZÕlxpÌÆKX[š!ØÓ™ÁC¯=ŸöófI²¤}¿Ãë«ÞÔãy…»ÊêóxÔ6÷rœGX\¢‹ÚqÅ—÷£½ºz%Ôîûœ7Æg£Ga†`Þ ðóí $ã\@ˆóÜ#ÏPøð2ÏþÿÖ`ûæ]ýµ× s¤¢ü”¤ŒZk£à.ƒ‚?C¬¢Ž0{1ö�ÆäU¾_Åd¯Eàq°;8-.ÁÇ��´ZφòÞ[HÕ¥M0¡ä…vp„æÕ_·1€Ñè) u¾’�,Ý›`åŽâ%â°vg…ß[rÇâ�YÍ'ž�ò z‘ÕÚ&LG d–¸Òë`óX©¢¦Î(''H"?z±†],`¬W›J ø!©f£¶=޵+¾APÆäµü^ûíñ‡ëù³OQ¦×ÛHG -שæ8¾œ~çN¨-ÄâmèÀxYßmŸÆîd„`íÈvš·ƒÌè[ïu窱–KÍX° ¡ñM¯Á¿NVQª]v!BPLÓcûÓaÏçýmF'c!PP~5û½�õ|óúþ=Xå˾ *y‰!!´æñ:ÄiÄW«ñ3ïNDÕr½$ß,.‡Æ¼¯˃¾™ç ÎG«Â‰0p`_p™�Ž™ÔwaŸÎPáöe>ŽcBŽÇ÷VůŸ™+_}#hïîd�zîÄ�x´œõnJö×kÅËM‚vûågo ”䯮!ÕUÛ[ŒmÊ¥[ŽùCš–h0ŸlWâó†^C�ýà�/ˆäî”=Ë ÓM�‘Uç×yü¿¯TXs !MT­*©žú9JMÈ�Uâ…Mñ|×®*~ =ð¡LsÅkZW‹5®¿ƒ€pêÂå¢Yè'¶Ý�‰d>ãEˆ(™7@‚´UYÔÂøS¸oÁ5žUð¨#¹Î:ËÂ#Àæð‡š).M…¹H@X@Ô+�F½pX¶–·�3R„h|°5ì‘ëþqDE�^¯Î6]¼‹wøòúïÍ»ã¾w˯§õpy˜îP`žÇ·,GQ].€ÿ+h°BäjE¥qœI…!m¶`#tÎó�¢!ˆ{éŠu#irCíí{€×ÞJÄŸEÓZÎDί­ê}œ+ó¹rì�“Ì.� Peù "ŽÃ,q/¥ \ð:âGzrâü[±ƒ‹yζXù©é÷o*‡ëyÄ´ðÌ$_=ÑÈ8¹®¼ÆÏ®žu˜ÆÊ⊽�ËÒVP36 î�ç»s|ZëQ¤'ó‡[Ñ9gk„uaydx6æÏ=¹ä.ˆÞùˆe&Î�ì9+e ·ÄqùCÊ=ð‚÷ÖI Ÿ+q †µ¦[¤ïÂ:ŠÞFE¼/¼Ç6 Ô_wº& îÇV°¢ø¹AiéòÞEç“,»6ÿr¬TÐ5Ž �…GÍé Z òJ÷oÕ mWÙÞ^­áëvѬj�YL­‚ÒùÞ6ÃïSÈHvÇ›$RÄœ€YC ±Hó¶ÔNÈcï_(é§´tá<ë�m>„‡,ãz�Ã×ཱ_e�=0€ˆÆ Ħ>L]¾»^ïãS둌 ˜gM�žIlÞžE¡^ÓÙ’¼w²7&[1VºN‘�� Q0wÇÂüÐt ù¦D\W˜DöØñâìÐy½Þ/$:\ÏÞ'¶½$urŸþȴɵøµmÎpfû‚B>Â|qm¶,'·ƒŸ�÷áùþi?H2"Éd´bôNî •v°JRûû <€e`‡|òöq¥)Ë$¦†½àîæ´2¹rÃØO§cn\ÊŠ7™Tˆ‹†~)˜YµXä‰4ç¹^ìZÊÛ?"µ¾KE9ÝuÒÊHzA6âr"ÚRµ�Pç:¼ìõ›“øâêcðãß©‚öIÓLåWí„•;¬jþ®X™”mIËV”œ¨œj›ï©k9M íj8µ¥1 ì–ÚeN<d¢õ¥°o8ö°ýÜá~+"‡6úÌ7‰÷íå@�¡�£|&“Æ“€6á@�SúL.Vsu¨÷'häø>αZ{1W½–,=63k ë�»¾»°þqæú9¿ÒV¬Š™~ Å+©‘_ûÇøMtëûƒiÊî´–ÈI Uö0],µq2¯VL5ÊÅ„fö�ØùuÁyn¯.wè-ÏøÐÕà>kEŒy”�Ç?00Å�²ÖX”á\TñS`bÑ~XKg3Ô¡r&aÇ á R?•íVþk‰ð£Ø-·Í(%»¡w-}:/¿i­¡cscMe­TK”±¯ïò“ÆÌzèæ¸X W?.ºÚÜÃ+z"¨,–y‰ i[>heÎaÒÑYþ'ôÆïŒ“óC*A°è\i—†û«ìH’ÿ1ì 5a�uÎ< =w·eU«²z|L ™åH¦73‰;A Bé%®ôwóPHSŸ)z{�èÚˆ¬wyÌל¸ºœÔÌ*¤¬ë¯dÁÆíÿbÂú‰æ/~G÷÷Õñ�/XÆÆ«Mô7R1ŠøVëš‘ÎFY´v‘©g*‡;šµÍ±ƒÙnKI6 úŒ³C¤"ÆR¶ŽLЦ‘µO•5Ê@ÅñæOrè˜çÖ+ªZˆI¹„Ð,’XÖRø´²«‰ÞJñY_Ë…çš[É$¡6†$ç`Èã₵–É�ʽ6µ{¼P÷åúyÏ•åú[„ÆÿÊ#µÆpò;ž|I9}½ü÷êêä(Çß>Pe“EM�«| ¨#P­ÏÛ¾î{ò´yV ûV·å>b.<íü­×Ø%_À³Žu ™ÄJa‘d£=l �´^�•™�¯rÔ[“†…ÄÏ6#Ö~½–†>2É èòÃ?EÙÔ5éû�HÎÓì¶² .é Fç*ËQˆ¢¶#ÎÀçZIÐ%¶05ˆèA@3vó) ™Þ?ukƒeƽT–d}¸L{�ÐŒ9·8¡‹gJOší6¥îík Ô ÷¿»1µºœè¡­•6‘›Œ$¡t'Ê#*‘­~¯çüG!vJø? Åïc*ÑÛ…rÕR_#Ží½-±çcgÒ׆ ך"Oí°Ê�’�7Z²�QÜž'�ž³žP‰4c/}öYsaí¿üæ4Q³ÎùQ ˆ¬Òsu¤õŽ Ì¾—J¶%Q$›êt4“£„º×YŠJ ׆~¸Ï »t±uŒ±Åö†”ÏÄ>˜íÖRJ™hCkϱ>,�‚Ö/©Þö“Q;:†ï™ ¡”k–žH|“†Þ±·¸ÌwiþFÊ«ºD:M¶ï´2Î º¨×D>ìÿè¶Õ¹¶ ê‰éœôvfð» ò¨ëx(#ȼÒWº¼kÌßQ蔥, iJþ–‚9¡nè0F÷?£^Nç t_#3ãê¯éß:¾Êjí Ç6fH2kÈU&ê ‹§[ˆ  X‡$Ø„T ºÕ8ÉmÎîÓ‚IÂÕÒ›âe¬Ú9…Ä +ï.ö“[Ñò'4åîÊ™dÌ �ÜYK»�-Ì0½•9&·>ŒMJU†æw…91YõÂ×(¬�Ã`êIË{ÖÆ%GâïãYû‰©cÊxjè¯û¢ãŸdßcûý/(í¦°ÍGûјÛàTÀWü”ºp–A߬“?7G—WïÂzPÄ÷>帪áH…Àû|í3B¸ÒÖõ�ûnù�÷ÓÑ$%亳؈üÊŸÚx�ik½ ­æ<¢~÷ãǪðÎ^‘äÌÿóë“™dcç>þ~8I$ŽwPê9—üŸ¬Œ}£¢,¿ø|˜ûú|:|÷@·“LœíÔú @?è½ ]V·ª¡†êf]P’öo”jç´D ˆœBÔ ¨_g…;¦'Y¸²Ûü˜X“ójä1ß¶yb¸!ÊN´²ÃëoåîxE™¥2_ªÏmõ!ã©ÑTÙîeÎÐ<‹Ld%óöÔ kaoÊ…%b¯™ó{–R•�%1ÞàɕÇђR·^ c˜|Ô‰5Õš ô©€Î¤ôû²³« oÐ?74š Xt5;ál˜}›i�±6ÉLâæª*0–D O¥°É¬ØA u‚óöìЬæ}’!p^7¹M…”´“Ñ RTßЊ…J̨›­ ˆzòú>õsæ< o=AÀÿŽ-ë»âص†`0,(Ï’i‡A'±Ò‹4—u=IAÁ‡…ÜÇäS%¯(KºNËÌ-sþôVj\îxªO àu©íјH×a‡^‹íŽìrAçt÷oòÿž˜f˜O—Ô,;2Êå.E�HŒ¨ ˜òé?ð?ÅmÙ…´{ªÑ#Ÿ#k¡¥Â”otŸ�@Nc¡wï;±pt—œL¥–åšÝs#v·  _‹å«eÊÃWÀôßA%³)Ÿdm¯¦«†L…œÊê†9©ÈÞrLráè¦�%é©=Ý‚”ï‘ú³éT낊£D¨©g#áKª ¼ã g_ë‹O—²U$7 <œ& ˽Ï,ÑÁŠÖ„öšÑmog�å,%• ¯Ð·s'° _'(¾9r¿^ËåfñÎhwœ¡nà­Iƒåïà6a%iI]N ‹¶÷ ä:€o^%+ÄÉqÆÉ;³3 ºœ|‘¥×L{{á (lD÷zyðM›q~lcz¾õ<ôsó38?0>çgéÐéµ™DoË‹¦¯ ²F€²†ß±–ÔåoCÝKì'åØÇ`k6 Ÿ ¹Žv_RÜq¯ŒÖÞɧe×è!ô±w7ä\F�3 „Ñå!oÕ×kíÉ�|É›ÖÂŽ/lí×É?/ d+ß‹‡·]`­ÂÑðñç�Y.iÕ„Ç#Nfî§²'+ùEF>žŠÝcÉÎÛ(B<’ ]Ÿ`nŒEò$!›É+ƒÃXޱ¤A…Þ"X8„ÅHÈ݌Ԯxx±,Ùç8áÚÜÍÙ‚­6`�ÊueŸÐÎúé°[xT9†�¸�+w7÷¯‚K†ûå—ÚöÅwWÐ8ÃeeJR í^:B�δwñžH�Ò0 að ýžø—F#ð¶6RSÚ�…=A#¨é¦òÿ =ó7¯½1ï’AmÜ`»î.w‡»Ã}ãs MxL,Ÿ@xÓ0ú’áÒ¼²�… Æn©¢B�«µÒl„Z¶š.÷¤õˆÜÅõ¯íâ×Oa²ôx~÷ñ8_‹âôÚì®ßãôÐoìD¾"xú­'Ö³•/éÏ–®L†-;²\�il-Þ0Ö\ÑÇöœò¹Éh‘üÖåí…ܘgì"ŸþÃoŸÙ¶×ÞÁŸ0z„ èô{çXb�x‘Bhz¶a`qáÇFLBV£l(íe¥g�ø`ýœ]M<²Â•Eã³t>n‹7Jnc*ÎþJŠÅÿûcƒÿ× ¨cý7(·e§ô¥yµýi¹Âíb±�Û£o¾pqãèóïmã3¼Ð1ú„‘_x×–¿wXt’Êí:æeôûsý�_ÅÛ˜”«ÖÜöºxÂéÙˆ:ñÑbÚ ðNE+ˆ € Çë™ß”Øôá7³§qV'»…ý’Ó«`ÅûlŽm—^ÃIÙ$&Å¥�²ÖaéÂIèBèÉ»;È£o¤õ@ÿp„›Þô¿"q^á ¼�ÁëÖŸÃÇ“— d=fúF·÷"øM`âÈ=>f.zG°†EÓ1Ü˰2–}š'Ss{\wE‹À¿-¬n_ÏO�þ¡¿Ÿ5?w4üÉE×ÙSáØ1-Ñzo!¤¥|û£ú^?I] ž(6U†«ï£8ÍèEø ÚÆ#Èè|ïÌïôEï=$Ó²Éqëa–ïïÅ­ÜûoŒíÇ; ™� ÄëOwÆûåÓh‰È¨ ©÷˜É½|dÙz·³D*ØÐñT¬Ž *+7#ƒQÁ„Ç&D3°RÓçþ}Ž~m®0e fV¨jhל<7Q€ƒ"zy‡Û)*�AäæJ9ñ4LœUÐÍÂådòÇþb‹™SL¹]ûÂ7c°ßi'~=EµIk ÁïÆ»lgÆÁ¥qîµ;u‹¤Ñò}!ÞØó= Í­wû#{À8ð‚HÎ RýŸŠ¤¦bÿ.m絋ޖì(PÚÞË?ϚȸÆ/zå´ô¡1,4Á³A9²‹¸µÅýÍaOû­d¼@ÓcXÁÈv‰VΰSS:í7j,ehvL×!D¢íAŒŒïëÚ¨d­jà”@°ŒI°@"ˆÑ¨}Ì ÷¡q9%ðÇ�cä¥ûVN=ÝÂ;ô¢�šÁp‰§›˜ËoR/Ïø\ÑêÚ£½.ƒhÆš¸ÆA ;%[ÕoôCh(èI‘6û{¿[À뿵p·¹ãË;�“íõ‡Xi¾@Æ¿3éÀÉ¡r®{ç•Õkk¼,á¤a¿½aX`j¾ùÑÁ’Âkßy·Ñ›VÏ{�êÖq²Æð6— ²˜³{Üeï¾Î(œ~o2ícçQ®Ê¯Ô«ÞñúignM*Ý7ÌÇ…x¢ï¿¼î9 Ðv·÷„œº: ¸Æ¬¸ôØÉ,ýš6¶ë­tùaCÆAy†dÆ._$£Vý¡†—pÖÖÉßÇð\·—¿U{ÿñd`!wæ¨ð/¥äŒ“D1¿^ö¬R@ØG±Ê^Sâú”ðØ6r6êô`¸ë,àkhœ“æÉtoGš^¬Þ!Ü—©ú&³~ÎzŽÎ÷½?æÎA»Pý…[ëé…Ö`±êá’Ö±t~ŸÒfwÊæÓmòáÁëx.‹�zô÷×s�…g5s¿¯Ð^‡„Ö\¹|‚“3:00ªXÂYn<�%.f:ªèÁ‰'üpw*Èðšåql”ÝÐ’¥U’–çŧ›»­sÅçwîœo\ƒ1P!ù6ô?O‘C*a/¨š»›žÈl�÷¿ ÝDù� ¤±U¹ËzšÏ8íiÚQÐ&…� ê•PvXà*ÕýÍ9[œJ#I<`Ûá�գ̿ӌ|(cbwû}È�¥…6H¶)¡Š²æ•ä iqC|ˆP�ÎTv ÎÈv²XçƒÓL8ꋲiuéÛðæB�æÃÒ3�Ý]¸Ök‡žúh;è9+U2dÅ#Ö ³B²ÉM¯>0JLÕQóJß™Áæþæ—•û45›dHvÂ1½›ùÆf�"+¬R(Ùšù`¼`GÝ£;[0Zz:w,´<‚þ·xÚø‡°b€3BÜ�¯F4o´�v†´Xç>#ÑÀÐX‚;¤ÈèãèÅXˆ�ÙæÁ�²ƒQbÂËuJroJqD¬åmnF½7SÁAÈ ,Lj-7/e™-hÎg<ä{@È„›|îNÉ– ¡Á´ªã@@`ƒIä%\I,yÄ$õšÌW~JFd©<Ú\7²–lr~egà^5˜@b`´/F€N6$“eÔ¢Õ›œ™D‰Šû¶ÍÈW,­˜�lcµü°/*›tO_Ët±a9¹°&øY½÷/kž¦‹¿ÈwÅþ1vÂ}oø(ˆ?Å®�2·Î®}¾0]ÓBé¬&Ù3ø%Êìzo™h "IâøÀÒÌà‰´*í;¯âí¸xÁ6G0ø^øþp; ¥°ÄA†àKvs¼pò½Ó>‘½Ñ­”!lÏtÀMh— Œ¤ïúôÍÊS SØy¼\Ùá!ˆ*NÎB{ðOFªfwшòÅö^çübà£ô¤ÊÉ…ÆV ÿ”‹ù kçeZV× Ìú±\³tä\¿wm†qâ4if1l�@]ÞI\ìvjÎ÷µÊñ)OšÆ¡2.&ÁÓ,1ϸ߸ÈÞxšñm¯ͺ„+©­G[!Jtð#a‡Ó4è$–Á�_B³W´²óÛ8ÙâÁ= I€ÂG÷HÌX]ñÔ�°Æ+Š…ÿ^~Pr~ ;¡x_‰´HƒÔÆ£�æ¿ÑÕ‘«­b2ÃI¬”Ž>ÿ–Ò¿êsSËý¤´Á±14Ó¹\|œº3p.´Šg×ËÛ)²yú#ã¿ýíÈëË\Ñî(&Jãçžý"2™¹÷Q’ˆlLi0ùŽ:èýêSãËÉÒ�qûÌLyžà€5±¶2½wããS>Fåò£Büïœ#“pûRiHÝMŠ«(…÷ûÁíNŒo?MI¼Ä@¬/˜C„Ç]�~AßÚ'©"Ö©áq „ÄpÿæÂ³È.‚„¿ô‚'ѧL`£PPèL¦ç) jt\È0l–ƒC­A²æ ö0|ÊY±ÆŸâB¬ƒ»P¬òf�Í›~Òµ a²+§g?�XµñØ6TÿøE etÚêƒ0uùô¬��Æ?»àâ� ±Š±[)>Ît‘p¸üüþnŒÎ ÷×<»\/ƒÏÔ›\Cýa¼�òÃ=Ô àŒ†MGwþVSÎÈÖˆ>mÝuÝP6hì²9Ü?» n¾3$ÏJë«ûÈ‘ƒ°¾­Ñ6§=ç¢úiƒ2 Ád©Ôå…‹Ãhi7�Üç—ÐbótyÒŽ÷É[=d:Ú Ð‡!3·]ßq»=yWËÆÑZnþz|wj\¿§æVHÌÇ·CΙø¶}>§ƒ”þ!'W ¼yŠ“™VŽ£ù~?4Ïî¯ â 4ÖBBÈÚ çp6nJ8‘—»ÀPÃ¥Z»¢;| y�Pí,áq’à VxTK§>G¹ì=ç3ä`gS* ¹¯ç5KßùF©èÕ˵·�$hÏXF¬r{NÆY3û§ª'rƒ¦úÏc¹pò1ûâß zO~I„sKw&>8ã�wzÇR: B@á$’@ Éòå¾QBœ·£ùßTÞøOøêYÏK*o©Ù)ôïÅ0‡Î°fí]áìß2I/žÐu°ÖNÃ…ôîMm…ÄÒc!ÉâHD:í·Óæ°§7J˜—^š.�!�e¹æ÷øz’Ï»•÷UíCѪX˘–RÔ^£o�,séãD^ ÙÏš!<‹`‡3⽺"‡�Á. ½÷žš±•Vj�v‘ÚÞéíðb¼ÌHYÁòBªìjînw?'ÁžG²í´Â_Ù·yåá¸þzÉØÔÄå‚Î/7 «ðÓÍàzÁu]`eÈxÛ%Hž¬xž÷»“ÑùÎ2û@Œlj¨6= Ç4ï½ø÷¼ƒìã¯Ç_÷ƒ¨0|ÙˆT 㥒¯eÄ`hà3(ÂIFÌTô�GŒ+jÝÃ$$V[ „U£ªBü�6ö›!0 ¾^¼Â‡¬:ïNo‡éR´ŠúØA� Ÿ‚»p�ÈúÞ`sL ,”Âÿ¸•ÏHÙÿ{/NÔ7¾”k£[Ú„‡aëŒwË·:g�®@OØ™þ‚Xc °w¼/§ý¶]ÜxJfÇ0f­‡Kh­²üÌ—„Ÿï`nA˜ÊD F;}I„s&:yWÆk~\d‡­"AäÑ�\KÐW�:6WÞc8о�V÷�£âb¹ó{ ¾å”Ë¡'„~6GU8hr¹ôîd‰ƒ;ú^íñÄ0’–¶À[¥�jz>L挘Kò2›UXõ}¦e¬òËG[À×�û�Dó]N>®Û.0Ž2ªGwSœÄ-ã°£èÙĵY5§F¸`H�¬2“qÅÈSÃÖû"1­óäícx[#ât rf×2b‘®’Dç¢Ïyây¡YbF ~Øž‘J>±åù—gó›¡ ¾{]mí„A!_þß2*F£›¶_ŸL³ìEç"ÏqøhyÆœ¯›|ü×’š'3v;îÃ0ÕdT„Š[ "¹ –ÈÐ" `*æL"SdüÁµ¯L¼Šc‹`½@•ïâÂV€‘˜Õì{¾%E®A Ø!�œíß@óu Ø}¡”îû{e"bÚ�çëtoÅI7ÞÙ '‘+ÓrqûWàçVoƒ­$¨Fûãîâ×éfº“Ÿ*¥+“Ûp¡«¯ºâ¹»²2lÝ|¤‚M¸F³N†â˜ã*ß+�„Ä%4‚&DÎÜ0åA †�eÊÍÖ‡ìÍ3Ûñ+bïœpqTq°6³rèu²XƒüþyÐÑ+ί�þˊz(%¦4#ÓÉ_Z\Ó¿Nžûüs¼>Õ|<¾v9æ N&_j)šümb¨¢æq;f€«'X}T•ð®˜6ûÈ�™Æ³ÛL\Œ’Ré¬hœÞ˜rÿ~¬mŸä¹Zwzli öøV˜»–+æÔbˆ|‡+HZ1¡Ö„>±°Ù`«È…«´os„kA@bc:ÇUæbqhnƒ t©/šÎ#¬ OäÏ�ÛÞ“|^PÚï™ êþ;G8&ºªË)¬´gÅ"q2è«sGÕ墕.ŠHR}»¯S&µ«òß.æ|Ú^ ·@š±a�'ÍF²ÈG“ÁõA™è¤ …÷NÍÊ@Æa9Ž“(têBwiެÓé_$3»²Âg†„Ûñ\‰µ¨«™>´bøtÝóÜ>Šé€Äìkë©Ã[9á„ §X\±a _meC—®:ArwÙeXGU<#]ÁÄ ÎBSQL—Zu¯º˜á]ä0¸0È×n8Üç•ãß;Ø¢^6UÄM%ÒÛ”¼F™’ªëdÆ.JÜ0â÷îNŸLˆe²Ï’0km“m…å™óUw�v]²¹Ï!ùòE‹ÎVR�2ŒDe$\Yļիh8•"ÄYF9Ú}~‡uóƒ %±£…½µþÌ¢äQ§Ò ¸ ø¯óG{¢j:…ØJ»ò%mŽÂ4>3Nz‚GóëZ“�W–§±¿°:oíz×gñîÇ!ÍuIzE÷š1wƒ$¶©”éoƒ¯³S}Žla£¢¬;øòcýî«øÞw°/)õ8C†WN,k¤¼'’I]³ed}–ÂGÆ&ê¼ö�§Vri‹-s:<~Az%yæ$½ÖR6ÒÌ“—A„ßÜ哜_=K½ÞB1„ßsÌž—(ärqÎiŒÌD¡Þ÷‰ðÙ¾ˆ§Lgì�<Šß"-% òíôŒ�EâHûÔ§ûŒ*ê!×9Çzq|‡n”Ýõ¢ËVA8?3^¡âJ†˜5ªWÐ ]™-NÔ  #:�,Î΀My7ŒÑQâ;]–x¥[žÁceþ Ã÷VýÅeX-Øe‚×n¯•œ{S;·ùÌ<Ä`»WÏdM–§Þ‡êà8�9ɉ”\�‹�Ü{åîÅž@„‚‰³\D�×c3±ù“P]×Оò<¤ó·m‘\ØŸ§AÊf4‚ >/„lôõxÞUI½W-7ºôsò0þ¥n‰æG-\óúë˹ïÈCç7´„6‹�¾Gô}6é /Y9ÒÂÛ¼Å�áŒä‘™ZÎÍêÀAO®"ô­±H”¼zl·¼=Yõ¨?E^�ÆÄÞ<:�7þ‚ ÀH¸y zÖz=a÷ÝJhÊwb$öc9k×ÞŽ˜Î(徭&ÞWß.ô'7›�yü�‹¾0 ©Ý8,Y„Q~øÐRÙŒŠó™¥üV¹*¾Î þ|8àý÷‡ñ2NþMd®:ó�l:Ǻ ÒˆŸýñšI 9óÅÖ+¡ÃL~Ë-�5q– E§�iF1}eB—†*GŸxI°™ÅÁ^êXÁÅÈLêýmÞW<&,‰Y×nXÚŒt¨sÇò¢%lßõ´b—Lt>l¬ ïuÔ'€\W„2%ˆ¤KSDÊã%Lfe´^òÂÂå¡A5Ð^oÌ^FQeºWP ¥Áç©ÑWn°ÿÉ æ¾Êöåuÿ•-\îôK'T­øÍƒ«k‹C{µÈ˜,mýµÂÒ½h%·õçZðù¼F÷Õ¬êžn¹‰¸ÃC¯¼Ù6´ƒòcOoq‰ôNøMñcÜz®Àæ±bL"e~E:ðƒ@Ž]Îç ¤ëàŽlù$Ñt@ÅØD–&ì.ÕxÊ @&&qFKaÍÔ¼ö–ä!ëÒ¹;=ÊÃä§ÞýMyjMïv®»”ç“Ïtc$ƒ…@£Åk†ÞNå�6ã;-6;øTâ·åÙðov›o;.¦*z �ÌDöóxôG�¦¨J‘<}Ù½ý¼ôQq7Ö6!á9©àƒÇUÿHyZþ/€£ý 'Ü*`¯ŒÁ•¥*À›HþÐÈóŸ< -Ðì$¢¥$&�$4KÀ\¹·`�’»…7\ _Œ¬Û÷̸, %ÊÑ4þk4ƒºßiÁº¼w±`½®Ü—cQ¶Ý Àö×ÄZT#‰‡÷—ÝMË�„A¶-ž\üÖAfÄ%§„8Äõý˜’µ Ê VÉ‘%áÃ{‰;|ñ‡±àó²Q‹^½$)?y̵¼._É#Ý]ð'ÍG</2ÛÕ�Æ4y+ùÙ±ô/‘#zÞˡۭL—4cßÚ{o�³=H¾,Wð‰,f@ùéœðgžµìhýqêë\œj$h¶Ê‡ŒíÛ&z È3åâ58ç8=Q�h¼d ¼~È ’¼+Ж›Ú9»K2€¼V0�ÓCLÍ—º°Õ9sÌl1-Y*�ü–~X¸¼�¡“Ÿ½ëk¤ò·qøl°Yy$šS™Ö`Iý¡ fÃbxÜHåbœfd8lû'uœ/‹"rÜÔs('}’ÂikÇ*¦ˆâ ‘¾7÷oî.ˆ¯ ä>?¿*ù^¥™yêÈ?Cn÷‡~ï<É~½Ì%È3îqO£A©k"–Ú)`†ÁR‡ì×ýgUuËd­þ¢ðG”*Œ´.sÙ‰_Q¿Ä�nçÔùy_lÉ-ñ*§¾&B¾ž¸�ñórŸ¯F&h±Îß¾½V|SÎP¸{-Á[Wé]à ܓâÖ_uê|†¶¤ð½4ß§Ýv∶€?‡tžMœ!s© ÷‰€|.¨‘ ¡ë0xQÜà•Û>å5ßV¼‘ÝÈäíŽð�à/]Es^l¯yþ“´„ ߦåGB½ yéC!©(ÀvsîNã¡IÛ“>÷rÚ¹&È9æñœÝ÷…­£1N47XQ¯6{󫫸%¾=IÞüOpzæüi,¶™x«�M¦™µ‡v[.ƒ‰¾þ\ûÉø”̰xv°B�ƒö¼¤ãa¯ó$gD'á�ÎYB)VòÚÁCØg—%ŸcybŠ/K=ß—Ké¨ò`¼.�G8oöö Hî,žcÌÁºí ZÏ«Ý{rôÛ¯�ë¿��Q#?Û-nÜy/¥¾ø†Mi›ø3™ýŸ)õ¯éùgé¤nt$ØZÂÖ£¡I9-¯’dÁ´É±*B?À6GÊÙŠxéh>¢°£Z:ìî¿&¼-l@ŒÍŒ¬q¼dyŠ®A„3cÀø ʦucÇ[R³vɹ޸â<�2Ým #*^˜éÁäæ¾Ã8ñL­’Fáz«c›–@¡iöF‚S�šT sÏ>6ñ˜t­îµòe…zOâdüœ"lr«Z«å兖𭔝.L©9-š2?›5B]Ò› ìÕIC°%’•ÿ(•¶/½¥\aX? þZà:{.jl¥`n(G:ÓA!(åb‰H®—Š@¦4¤¹-’jÁHgHYá�ŽŒ�ŒCÎ3¿N£+{��9õ†ú6FÞ³ÇÐÎSbs“W×ßäw�®1"lc)¤$dgˤ3âpÁÁ3|çþê¥d9êÑÝð÷pðDYøf á`��#ðéÇÍ¡—šêßm+š4¶8Ä›X%Õ¤nÑ-Sº„t72u4JÙŸ?Pµ1€UšýÛbën”ÿ)¡ö¿‘qüor86;j¬à¿x}Íe}·þŠÕh-�-ü™|©*œ©AmŒ±k[´o¦ùÙqH¿Ï<·¤Äþk·ÎVÇóºÂÈèƒüUHjœß;–eRÜb¥aäâûí>oÚ+û–Hàä¦Sc]2_ûò´™ó;ʤé‚U:³ìší£*Ï |�bôž3sYß™ ¥‹¦1¥+Þ JS—kw)LÔµ rôê¢:TšCáVR±‡BÆ ²Zx›FϺÚДÇ/«¿·BìÔSnw`„ªã=ñtyâíïsvÛ›Êê´sD¯õ¹¨õÄDÄq Îq{±"x‘Ê–2ãZú.ìá}.P»QûO†{Ù#VëÐ_CVÙ wŽëóCs\�Y/ÒØ­ú±Áû›™ßÓœ¶»N]——øÃ‹¢ îÙ½ìhŠäKíÊxþ’~-¦÷¨/ü8 îj�GñàÑ}•Bœ¹¸9cÙ˜nõ�ÕN^ûLüLýЗ¯x$�–·®£~‹ŽýûŽøôl,‰ŠWçQ¸gµ‹þjÓòv£uîDL,…½ äãæ£0MžŠ*b#|i>†�SÙÀèÿžåó(ñM‰eÅm«ŸÕnÏú"Ù4Å xÿˆ2 ‚ËZ-Z }ùœß6 %ñä®îo¬ÞøÑ_²qAÿìwІè®óXÀPSîÙ\p;wA;<ÛC±ÔÞlƒÚ–m €€mìM’çU¼º�ÅÝ^õæ$°Ð´#/tí]üß—(„¹¹ßËÕÎÊØºL§Ñ¤†í:ÝF‹“Ó¿þ7Œƒð€m1†èRcpN9ÈÌX³E¹*0ø‘ôgˆ?R²JM�r»èg;ò¥°=Ãn`aÂ�¡; þ1´l‘þ鋨 ±|*¶ìX·÷�Þß‹f,ê&¨ìHûÐÿçõ?@cü^|¡2ök ë'Êrb_e…ûhR¯›îIgO‚Ê16Äù˜„zÒ²A²Ëló{ˆàµ Ã¡Íý°^y¯ÜËéß?]r„"¿'$æ¯Ú��úU¬BØàİÃd×L2Bý4Y,Æ=ù"u糂ÞK‹ª³_ ›ÁZÃÖ9ƒKŸ&ú“ƒ¡RWPu`…`†+è8ç3í ‘áÚ‹#¡™>},ï™ráÈz¹ìLiìÒn–$É.4ºSÛ»¯}ÞWg¼ƒ/+^3Ô<݈�Lâã*£Ù×{bÞË'((pÜdâ}uÆhžiÌý¿Ì”øéækÈ×û±©ÐÆV{¥“Ÿ©!~^ß'‡17R<ú­ô@=4"cî «4š§‚K Û•F¦Ê¯íïtÐæ«6R+�¤PI?”È3zß)÷ÒŸk·‹ÄWXnL¾�£i�£99¤ªèCíñ©+Žßd„°4g4Wdó*¢ꤻÝ(oøˆC5ƒ˜ì$�÷ÆBUÖ*]pÍÆ�6¹¨Ú¬R1TÍœBå­eâŒ(Œ0Bä5ùS¥éT�½îàW†B7àM‚Áâ;9!v)á™üû…¨äÙyÓ¾FÏ*î ˜d+A ®z©F·j¥NýÜM‹Ó¦’pÀ7qkìé¶ê¢çܽ6\1Ié Ä6†&j–6²°”Õ®ro‘¼@s½†MP‹ðÌüÞßÇ}ß÷ß;�Ïôz¯Xü¹uÖ&èiá#®�,½Ü0üß—¿» éïT{�jâ3!ÊI0ké¡�º1¦ÛÎ:bû/´=\7u?ï˜�KÖµÆÃQ @>#,[�K¨Á HÖZ6~y³úãÎröAØ;œ�bí ¦5É­Æ"D�‡ó~f®-�H8ä RÑnÚ"ñÇèÄ�7+•{´}¢ù=„&Ô§¹8Ë9qŒ�G‹/gn´ªÔwUX‚^1R©c(E n‘ºVÔØî ~ÙÎݸÎÖO½P{åhñKˆÅ†4)8E¦„s}ma(¤SUê SEbÑ)cÝ㺸WÅ´¾° ß7†¿ 9[…n�Æ¥ð­�k—a"껞zíÆ[–cG6"ŒµÊ±t:i äƒé`fø,`t ;/Qp^¨¾N®:`쮺Á«(ã:Q"œB% ÀÀÝœšèZ:A ü´BÜ‹…zBÂHëYÍÂ`;VÈA-å<�<› €Ç“¥¶‰üÏĶô€�â žpù6ÉŸóçyúbÅIP"ì�""06+‰ùi"ð …‹‡§ª[QZpoçMiŒF’IÓ~C>Ô}†ÈÛjux±]Ÿª\f¼– À)„r°ÁÎPƒîç7‘nªPÂuR8TĘà‚ë0Z5(k>\ïX-l£0Ù¾^<¢£#¿~x®–§*1x“�à�ÝòQâ!gÉá²ip.ÞÇîùçµÈ‡�ÌÀœ]…ò< §®Žþ-óþcŒE›ŒÓÙ�ô5˜F®µˆ(“‚Ú�2;M¶zm“"]1M=¨AxL%£ƒV …½;¹Cð\Îç@·‰]*æ”a¦|m¥a‚sIÒ Ë&b^¼»!§(�C.`5HŸÝ¿Þ*3R&ss‘mðÅt¿¥£Ü_füè C¯òúõ±ôÊ0t·«‚1n'}¯[U�N¼]5ÅÁ <@ð û£å|—?CH½ú3ƒORÜ‚n;±bôc{`ƒLrçZ›>ϸf¸q“™Ü<7¨ [ Þ5Hxq‰k%Ç¥�r‡Ýk=wXÅ‚AöB‘lY×âxÂê•™¾jëNªíf¤Ê¤ˆmk§"¡Íªåõj/I鑉ËMÔ·rijÕ삲.”:0�áúmºÒöÅ£¸ëµo‡7c Ã> prˆÒA,ú >`¾-ÄoÇG’=My˜S±µØ'™2sÒ!œÙF*®˜”]Š»Ãß8ß-ùkx†ú‡$>~p–omk–}»ÙÑY îzæF¢ˆrAºÏ}ºÇç~= Q3söP̤^Bû¾—¿Gøàí¿] …²zñ´D$@+Â):G,rïµ ÇèŽRج E1\š’"Îwf)Sî`¶y“Çøî¯x÷$_s3»åòë…,Y Q¿Æw]Ù�+ò(¸nõñyKn[Ò¾e[.ÄP xHæ¼Ë‘vg*9ÝÌ»"8Ébm{ *!1]d7øƒ¥kÛ_?˜¯{!Bï¿ ½Ââ_¨Älq¹ô6G¿6÷š-äaHoÍ®»û�oư•»Ì¢'3Ää‹…ŸlzÉó¾ÀÔ¾« nÞòöüI"raînœ7ß‘É9-£…®Ú¸ö5('zÉøÁJÎØ•Ñ÷Ilòe &nc~:o\í×P¾èIM+!ó6Eÿ§rÁ ÿo@ {ÑHóÇó©ò õ#O\ ð4Š…I at§ÿ^ù¿Ô–/îÆÜðàÊ´·Ô•ŽXÈÏÇÉõ�¼\Ãn¸ŸÃ'4—Á 鲟6�  {¥fjXÌ7¦¢PU<˜' 5“°Gzþ„yvú€s«‚q y¿CãÝ¢>WðÚßÄ-ø†= %cÎ dÏzx·Hb)-TYË~•PºÚ{¤¸=Ú’=FduºúEõcP9;y#Ž9æ5Ÿ4£‰ÃœÊì+he‡ À®HwêÝó�jæ“�i;0@1×|;7w�1·ë�¼ �%c9÷È]Þ÷se¦V´¥H0Y2}?Ü� ŒAxµ[ÙewÖ”#ô! j…¤õ×E(t›JO¾§pú 7®ælæÂ†°˜Š/cÈ×ók5&d&¶ÌÛ_-Â}u/â%¦¨0[Á�×» ³X(ÉN ũ¶ÒI& ¢P­Ì´vi¨ŠçƒLôoB"çðW݃WŽKrf!f¤ZÝØNI7ddN{-8Z.3¦ÆÆ¦ì�±qþšŸQ#–,t™Õ�”\ê:$v#X)­‰LÉ(pX;$º…ó7Ï]…Äø’�«¦ôŠüEXº\/”ðU)Ò¢Sím`#R¡®*qdx øT�Õ*]«–"q,l1L™¿sZ¹ëü zwN– Üæø—fa´Ô.BÜá6]™²íÕõ;9 ²�õ°—ð‚ú•Cr%ÏÉ¢‚9ŒŸwܮ޵CkØ4Hu‡dÉ<*·&ü28Ó“žÍŹ�õÚGqÜùhαggI bñ¹Yî¹AMÂ� æO%i¼kXmV©›Z<-K®É²kÖdtfË5é׺ŠÍ®‘f–¤¶$ÕwSÁ`Moßt§4øsr¤CA§Dã¶J]ÇÅ�ì·½ŠòU]0iZî•)…�cnt„U�Ç!ɼ«í]2°æ¾òø†dÆS{¬È¤ÎðKL“U²wïæ%t"Ê‚¹o ¶XÅàÝÑéo^w›Ö ‡œDNJ[œç-Ї€Ê·b¦'Ìù=wÍϨˆ2±=Âq5Wk¦ öZÆppzh¹-^d]w”¶vâ%â–’ÈLn§%݇¦ÅÇ. ‘’§&ç=¾¦ÏË …tßM)Œ©d´´×°qíï|U«Ÿ·LŒ„E¬PÝ(cÌ{àߊx +wò#I½w4xé»íx}æÍF�b|CöQç‹ìŽ=Uì9¬Áx�Â" �^–¤…9·â³»�OZ'‚I+¦‰0KZKùp‘ª:ÙÐCË)á[›ÉFµ­VƒqÁ¸fâeÓâÿ[Îvk•ÑÕIà@A¥Ü*Îôø‰ÚÁ¾•rE ¦\=om7G�v¤pg|뚯f_uWßâîùWª—vÈ=P¶æeC½ºzØÛ6!Ô�.U°ÍŸjUÜœë šÂgYÊå3‚sâ²Ôf“Nîl g ‚ªÞ¥”ðXÎYjò×I¢‹©Ñ>ËåâóØ,6“m�UïNïxWɲw ™:Řp¯©u•Ë„“æ7‹–pUâ2js¨$×b¥%†ª'[­v¤AU’ûO?ø™Scÿ–’îß`öƒííó ¯£õJ‰C+û›ï']{{sÛ° záIŸll1 ˆ¼î F#ù!Õ÷´Vϯ�»¹!Ê»£çðœÂ*Ø¿çnëÑ*ß»1™6%±ÛáâÔˆÏP@�BÚ™ägçŸÆ³wéç¾æ„sÇ:ë—þrÓ&à *ã ÿ°˜{‚C?‰þäèwÄ¡;ÿ¬Ž_ÿ·_AÞ<Ô¥I VLø¤²â.ã¬ØR�€¶˜:ƒ½ç`ìZŸ®}kàóa³àÿ冯Þ8÷\Û\pœÞíÒݾ�S÷;{{ÈK:cØøgD|D[_V!²R¢þ—ÿ�‰ÉdG›AÁëëKŒ2ì/-óÜÙ¢†J†Æ'Üc[f6XÏÙnd7­Z¶žt¹ÅZˆ¶ðè¼�˜ZƒqÒÆ¢ãÿ×Dz9)ˆlcÖ.F—ª�“:Ul+B.1^_[ØióA�Í•X¬›®Sp †]�2ºÉwZnNiÓQAûÞ¨um“ Y~!Ó�²x�kmuþν§"¸ï6Ž×’§ël†&ð~p0�#¥ n^”\‹{�GÙ¶är#LÙ!P!Dh¹>n:<®3Y‚•êxÌ0ä;Éë÷^b4ZåêG’E IØ÷Å ­qAÂ&¡‹˜’+PŽX=Ä#ìúMÇN°²ϾF�®gÌve“-‹Û~[§†såisäùåx2ÛJé `¿È!RE÷">æ×mþ¡‚V€§’ÙŸ·×¢ë€‰Àp–Â`ÏMîüà§n¾†i¥–›þÍ|è™A|~ç'ö Ö Bµó`Ÿ^ %Їïë~mAŒIóM‘!y9‘«Þ”!ºžàÉÛ+”öçèŠÄÄJ>pÀ‡\N¤u3}`¡ËbMÙóívFèÓ½àxöéï»fâÏ&ç3RcËùåï0<èªô6·wÂmÛÆ}‹ë9{…˜žÉð“­™Ùm˜ÆK 0Ï­úòbˆŸ|(1ìÝÌÀ’<�fO;ÆÃÑ]­Žù¬"Ï€«×/{Ô!X¼ 9^nÍ·ï7è=vȾjØñ 'ckÅAÌx?¬:C£Cn5zíÆVÁÏÔ±—9HâoìW÷ˆ±­çݾٖ�Uä&sÅv9Æ]{XüHÇœ^š¬ÇGúK|õLñ™�Ý®+L¡lzê̹½ØOŸ­–ÅÚ„¿Sevé`lí4<ž|6Ç�f<�ù’J¯x[,àÓ™AáßDö¥C"âù  ºŠB ¥Ôå½XMû„RÙ9Á‘ø¸õQ†ýv¥.0Xî3Â÷eŠÑtdâÙ[¡iäBè¾w·ÏñÀÑé Œ«[/-Pâù�¡°2*Á›Ù!žTf㇠nÝ'=ù¸ÅŸ;ï2(k–r�h³†2¹ÉОç,d6wÐ+A|'¶g$׌ñ°8# ~]ÂÎã wçm]cðÆs ¾ÍßÞ�,37ÄhCÍè‘F.ë*dNΛhXk«:ŒF<ÚŽ±=¸UÿªÊȆÅÂ+úÉß�Ÿ>Á©aÌ¿¨ßIÜ>§£¸uÖQË3!³öŠû5/xÚT-žј^� y«ä–¼dî«ótþ331ý^‰Ø`fvý„xöÆ,}Ö^%]é£Ý>ƒ¹9t* ®òÁkØ&Û# Û/(t:ˆ]êкÙÒ-ɳw1‡ÎCIÖÌîÈDþÜl¶¼L4\GüºÕyv˜ÛáX5¨†tÑÌKLËï|®×Ø/}ÌľIFØÜW†.öËéö�¥Jj `mBaŠƒc£R¢(.5Ç@^8ð??w²··÷vÐRÁýzñì?¾â¤ˆz�AÕª ÷Ìx¶0ø½Š˜ß›²rô\Ì/|=C>¬ïÀ}mw:é5uö¹¿|‰ Ÿ}ó: š|µ×¥=ê.ô[˜¸xƒ4ÚGÚR–‹Îï¢`Nü®àç¹Oo4M0k¤+í{*‚L"p°8Y…œ>àûÔEÓ¿iÞNIorU$ÐÓó¼$çÁVΗFÅÜÆÁg'èÆPbO†ììš�¬Ä¯m“)ÿTKÏà—t2=ÛˆýUÕ˜èZEÿŽG°e|õ ëÏy¤’�—"&�tÑÜ‚jS1á®#òRÓܦõƒPþ4/p}“ R[}¾7’' Û^Ç6ÍuMS޵�êŒtð¨ÌDüƒ4¡6º}EÜæø¾–0²WÕôïæô ›€cœ »>ˆ÷ss#{áîr9|ô²Fç˜\Á®,Æ�:{x‡¾Äy‚¸ë¯@t9ŰaÖûÜ¿yÿ\àëlMBUë)T!ÛðÂ'±EñVîó‡|#{柺:\<À X»\Š£5ᦠÅ&˜ÑÞSž^¶¯�‚Õ3ëùnfú¾Hõ’®@’ïwàìcþJHnŸwl–²nÏî`y~ {�áÒú_H\•U¸c›A•¯xövø·#Ffx¶ÏÅ6cÕš¬ãU¡wtìßRé6áy>œÑ„EÎÊoù.C Q\ó&„<•¸:¼eГ¾¿ÀÔOoø¸rÍçU’¾>Z]šJÝLfuþˆU£qt1÷�ÏÃg¤ƒ�ò+¯¤µ?Ð^Ÿ |¿¨6t I8Ùƒ[x/Cw  à—‚£„×N—ïs¨Ú ¤në¸Â)i<¦¯/�tJü1¯…²5 çCãnÁ¬š)oŽ”¶}µðîŸf õЧåݹs�îW9½w9Ôdž4¶Uã*ô²ã ƒ ùÕ¼Õô7š€ñܬy›Ð>NùÌø�<~Š.L§0„r¢¤°Â“y¿WÇþýT¶ÕÇš¿±CƒÜ1 9?÷½]0ÎRÌ� ûMƯ£qMA«S©y10l„Š®–7i�†ü›0ÉÌ5ª;ñ&Dp3Ìëñ©’0~ÔöœÌ}Éu…ãcÜp‚hír&,ìÂLb!㊦5Ķ*˜1xñ´Fϲ¥ÊÁ¸€£+ÎgýÕ×A<ÙלÚ'>ï¢k;M5¯xÊDÜ~a”Îæ]˜Ç_Òž6+wœD�êÅ7í(žXŠ‘¼¸5§óâ¯æ;ÌÚØZþàìŠoÅ+¬…ñ0—‘½Y%œÏí‘ËãÍ^µq-ºÒÏddf”©Du}¶°úôáYxºmø•³6éí‚_f·A²²œwçó £þöóØÄÉ&/ä®çÉmmoá[ðr½P{K¾(ŠO�–Vî)ÓÜ©–RM{‚Ÿz7ÑÏ5g3ÛÈ=¹g�;˜Û® Ë¿ÎöqÀ‹¯ËŒú%—s:˜VÞÈÓ¼ê{¦·¡�~øÛ†ÑW™äHS-Vj‡T>;ƒ�PÇv ““ ck¤Ü˜D¦D ÁàƒÙ :+ù³ÿ vð›.ðÄKìi±ƒ †eïU†m7=Ðøº ”±œñvì6u0×bó<Õ>ªÓlÝ*´^ãÝ>³ŒXUÚn¹êÉ oL¡ƒW·î±×!JU."_„áÒéâ·a<ç_C�“ÓÀöpÅ «±ÎµÍBmfîðQ„Vò•0Gœõ= eyì*‹èS¸ÚÞú;\ú…%Å61¦½ÂÆ¡›�„“Ö=�ç)“Pʩ̩ø¶;�ÕÊõ€¡›¸xÛkü�4Xþ~qL¹ÁN¤)þ_Kã¥U‹ý ôÞÆóïÕæó‚µX!XúˆÐÏ© 榪ë5Œï «Ž†*7’ó×çNg1Òœk›è\�®JV'o”… ãÁnÅëj].Å�e;Ú\¡µ èq£jÚôVõå““°EÍ „j®3æ1TG»ËˆæµÑER{b~Pßk7§ÛtÌ!¥»z6ê A)¨Uç.gÓLAçJ>p®;—<¯SœfLM>cºœE:MñŒš }!zwzßiI}'îì‰PÇ�å�³ õ³@…»ï×Ã˽™-tpäzêâÍ“²»2+=Fë›)3¼•1ÄšüÝÏQ4lÐÍ0MÛV¢AáÛ«*• ˜D [.)¹È$a#Àœƒ"ÃéS˃oTÞ-®@*IgLY…j †×pTqÑ6¨Û%þ†Fý�h&�~È1ç ‘o»¾¥î¶G‰ b̃kË׌ɺëÕ-ªÓ b±INæóªAú‡u{°˜ú¯’¯¹‚«z]ÍD[e[|s]MakrTEû´Ÿ ñSöWå…%Ðâ NyÉ=25§UÔ�Vý5§g¿õw9—†NEHœðI~›úZ3ôÆL—¥_Uj=Þ´ëòêR%#=虉o†‹¯`iFÜ`{�ää™Å?‚îxX-úû¾?ÇÓå.ABat°…³TÎöF·|s/XÑžµ¼:ÆyËœëk>=�?»P¬DÝâH ÿ4�ôÔ÷ƒsËÃQ¨ÀfK=•†§z»²@L@ˆˆ½¸süM�•FODf6 ”©…Søüo°=Û¨[þ0ý³@� ŸC«¤×¿jæÉW+—^ûüŸí}-Ò1[yÿÛcXrÝk(æ0@‰.�ˆ ‹†Zû koCþý³÷ƒjô>¨EùŒ~×Ì:yÄ3Ò ò¡>؇0Wàüœ~Bg¯ÊÉ«ªuØÂÔKÊÈH8"­ù¶$¯öqSÛ&sO:Æ\°5° ¿Ƴ¬¨Óù•ÿz@0:oh-àÍc×\ZºzráÊðÎk(rÖ½®óÿäF®Æ¿mÂ2½þ0ysø…(Èb!Ö¬ŽÇ=OvÀ¶B†!¦p/{¦À‘é¢þxjÁ‹(bY‘Pû��7¢¯Kî;Ý�D%=gZ>Q$ÿ`óÃ=bè(¬+_$ªjxŸôöq³Ï›—j˜»ÝI¼ëd1Ò« /pÁ†ŽGáF,?|]M•èHùî8¬¦)N±ç¹�¯6¿’ˆ}Õ<¸ÑõÍñÆ@Æ@ΪÝDlµ¤Q«¿jßåÝT—8ëC�2û ˆ0¾ÈÒfã&`zaÐkKeß“t�¸‰ð8T€}¬ÄyFX›ó>ˆî9'{š‘ÝržçŽ9ÍW¾]Ê#L[»“9uHïIîjJc™E¹Q˜…£VsBÀS´y­©.¿†® S}ð/µÿqÿ‹uèÇ¾ßøùsÁ?õüç“ ‹þÖõî…ËêÊ%ZFƒÛä(¿Sʼ(ÐÓbƒF?®²±Ÿ0yð¥ÂzÖñluÜwçÿ@x®Í{òŽ�ô˜„àšsÎA‡ ý÷- ±Ò”_mõùþñ™�¦o–®ÝÕ5³V—(UAï˜}*×½ ¦rbòG¿:‹8 v»[Œ$ïæzßZRH‹ ð“YövÒ5Æo“xçøu¦Ùâœâ2Zôïjèø¸­¯|�8̶yëš;;ЃA¤¢JCòþi$»Œ–p¿ó»Óœ=sP8xÍ‘‚Zx Dv»æ¨TÀ‹ê!ŸE¸„HwÖ8�é)Ý‘U1â"z“»n×ÍŸúé©ËŸpØcnx|ÙAJ“ž ¿k(EX‚Ï£QIQQ¼+z±*Û¥11cVQ5f#Tz 6W¬mËvò«®!\í{œ¨5<ËYEãʵW¿l{!!!®p/ã[?ž}6_l\ü{ÉæúZgvkŠÈ<�s…E®�yéÒ¦#´Ùt`¢¹S‰™?½©j'ž”½ É ¡ŸÎg·J~mzŒR¬ÎÒ®ÄX ÅД¥oM�ðäuþ4[ÞN ¡ïý“ïVĹ@’�MíýÛs6* ýE rýãäœÿçnAIØÔò �/´Á98¯O­ ‡æf¾¿ocÿN OåXÊm°¼) *[¯ÿ”qùFqÌz¦ŠEš’ñIË�F±öÏs£Yš:X¶IùÅ{]׃ìX¥&ùéÛ…E­v½³‘׉BWØ…°é�—kÿ€â÷<[ꡯxµñç“Ðüô´‡„Λf›û*eÓHÛƒ6üÙ§ù/FÓZ�uü~^³¬?K…Нry$œ�Š×œñÍǾß1G™ÝA5þÓï¥ÈÉ †ÏNz<›1÷ñ�é3ý‡ýå«ÐcñDÝñûÄÒüVø'‘ãµë×ǼNhí¥»å¦ÚÖʪµ8ãdÉB¬±†`¥‹¯ÐPèU†SÆ)×|aipBf[Ì,Üà vi¶�0#¤í�’™âsâ½Tù­ÇÉ ŸÜýר}> ôbLò/™ðwcñß¹5ÿß=å‡x¦¾†É¨ô}ñЉOóßͰíŠX,{×ýáÛfúþÿ•çß°Å ø˜òä&;CD—ø{ðüLjH½Yô2F¾ 2Òé†U"ÅÎÔ:þzß®Ãj¯b›�ñ²=qs:-ð?Á­â�w† ½èNkñ„Ø$ڣе‡þH[@€ãë‹5ä(ˆñˆ…·ÄcöŠGÐ|¡°Ôæ˜>ŧÝ�\†ïÏê6è^+àjHË®áÿçyp€ büV•×ò©'†ÔjEf—©ß›¸ß©€±…Œ­pqÅð1?ÅëÜg§ý:ôz¾;¶·;EeÐq…²� T0¿MWû°ÿw# …Ͷsû»Þ­þbô|a»q¯b+¸Q¾©ñÂ%�)­bÅ| .QÜ.îB�Z7v >[e§2NaÖ–¦ÃP¦£IN•“÷�îFÛjÌA†'ܺO-Gåi§IEÕ£öiŠ“¶8²òÆ(‘ÔóI&fÕuj�©BÛLŸ¡¬ñ"ÙRÙí}œ\’#ˆ$ÇEX åÃI`-{c„EœkI´j ¸¤5ÆÄŠÚ Œ�\"À�€p ÿ#¯Ôö—ÀfBúb ÜoN #‹Åo9D‚ŸÚä€môæNƒpðWc‰øú³m�¼[ëšJ§ï-ÁO'ÎrŒEÂWKÍXd�ý:l62CT–Ï∽Œ»êÑê¨Ô+o énܧ�²¶Œò¥'‹lZ¬°Ø"Ùai ÊxÐ>D8”q¹4ζfÐî?SxÑ`ù¿�‹ÉÇávæ¬Õ“×áá<–LÌðÆ³¢^m1ÒàÆm�ò€;ªZÿž±ß'Õ˜=Úƒôî÷pnf>…û¸t߸ÏÃÿKZ¯t‡OâpSäïñŸà~ØØù+; î»p/‰àÌ™GAË©™z\±ÓùÂÊ�–ª°ZihVM?xäÖGЪµ‚!#éÐ(H–�Ò\Ø DÝtýåý¦>- ˜fB@rh³#O¥:4Aˆ[ÀÓZýjwÄÒ¶‹R)âÙ$ & ˆBL`rhH2‘&Ø1�$Г4Ì0ünþ´–¶š !ŒA�Â\�¾HQ÷@MˆâÆ„„G׫ç–~´q©t„µh„Ð�PaùÇ·B[ý øB<ÐÄcYÓýüù•©‚ÿ­ó³¼$ÂÁJR¡ÐZC¨AÝ lg–rßE”"¥)Q)3û[—‚F©\Ö ßé&6 Ýd¿Ü›f\¶´#zûsF~lÖʤ;[ôîè2pÓ-w±.¸=V¥E^ìÙæ ÿ´\DÑù^xØî¤‰•�îñ¥Ùð>=q'£Ò+–X­õ“ÄÿÝyw±aƒó»àyÛׇp3×A‹k)1l7þïòÃEÈÇ?ù±~%kr¯àq|L�´ÔF:îJ�êµ"âXÜžä£e¶ú‚Ÿ‡GMuÔÄ ^åRUB‘]RØLRÐÌ•©“J¸Å+í‹ XªÕ%VÚ®i‚\ÕòÀ›Þ´@Nþ€» çܯ´oÎðZÌBË.ƒâéÆ1øÚ­ñ3ñô�®KlÓ-² œÏ“êgEÉç²>ð£ÏÉ +‚ØNN®¨C84/Z³� W)ÊÜ�p?Ÿ{¦¡åŠ\\‚k¡tÌôZ²^¨Ãš^ÆÜ„pçmàK�w� as« Æóžƒñyœ FVèß·²F®¯ËLq£Ì¤””Ó|Oe±°tûµÙOJÉú¶)%ÿ¶uóZ¤´n˜Á‚±—”à2†hï]“…£Ó_VòmrЉô�ªZ¸þìPéléhzUq;¯! Øäƒ,ÚZЏ‚ä7daf gÜﺜ‹– •‡s8ÄãCŽÓ·ù€—ç÷}ÅàƒRú_å—¿S*®wv²öÍüöŸšÛXÆ¿éþ‘Béý{µ“¤Îûª/íÇ=(ä­_CÅ&¼d6{�ó�a¿³|6Ódµ.']}šl²ÕïŠëOö¿ ÿY+þ?3$ö/&NÀ{oìF´0ÁFëíîÎ+¢,¯›œó¾g ˜»è÷7ž¸Ô¢4Ö ¡‚“žÀ’‡ESGd0OØøí�r¶,üŸÅ´‰Àƒ ~,Æ›ÄIYðƒ( sÝþUBÍ€‰0£8EÁáòÇ…ÂË1WžöùµF±h€Õ ·áFçnŒ¿ËÛ�6¢2<ÆÇ/ ÆôU�þc‰ˆš×qΟç›á%õ�Þ¼6)£Ø`s QYdaâþ×?ê^FWŸm�¶kÔ“#<áÓ„þË~œÿ„- \Î`àJX°¤Í¨;i€ÙŽ6Ä}v ×0ÅSHDu˜ª·ìe=Lê‹"öPj‘ÞÚâ/øC!nü±ÖBÀ3@*úÿ, r�a¸6‰eæX{zztü,‹Üdò¾­·šÔ‚†/‘âvòqÆä›Q”UéÞcwÃ3߸½!£ýÅ¡öùån©QOφ/¹e*©ðvˆð°�$„Y»ï·�KïÙÉ™¿€Ø‰ŽñáÌ�G†©à5U§Î2 ùJæO‡ÌuD)TìŠ5ºýsy¤õ¯âs/3}¥_wRÎqÀÑ«ùÍEÇ4˜-vû`ˆ:…žö�ê.X¾b†Ñ:<$C¹)IGAGdcÓîÃrƒ¤æ3a¬¶Ö†Õÿ´_л6wxåÙ Ëú‚Ê� WqæZ׈ü[Þ­îÎðÉf¶y€¯ýoÞÏŽAdvÃ�×¾öDßÒ��}EÏI:±¬Ò#Ösì ×–;zmÂ]¶¼&Û$ÚÇ h>ÍdÏ’³baÑy®a†Ka‹ÊÁiÆ*9ÐåÀÝÈÛZöÌ0,‚+sZj7¥‹Üä± ^¾³ãQj¶­dŒByå÷Þãõ’-ŽÞ Á��áývŠ«%T4ÒÈ-¬Ë†i€u+zLbbsÜŽ¹ÂÿÀcðw0Ø›{x:‘tûòQ­eÓy\‹™Kw¶^ea@;`DV5P´,náŒAaC„" µ´ŠñÊ=¿l:G·­çÐ!­ Í Ýˆ;ÑRRüþ¿jÁïîx¥9ÿÈã4!#¢A°Ò€Vÿgƒn‘ýÖ=œ¿,Ä•˜†?Œ¾eùmXí=2¾@³iyb\m½«B‹�úuxzü@/}L3kDâ³d؃ì2!$ r^†Ñ“YñBb°{ûÄü–x/0LÁFd%› Æ€†$’6ñ¡ýãŸK†€Pcþ~~hùgß!$¢@ Xôø¤/Ö‹M%÷ÄY¢�µÞ�lü0ç°„ zÂBÑÂ…±ÛØê ÚÜ¢qF«&„Þ [Z}úÓùœRsáýj�C2/…üõq�-ÿ¼mŸô9AóÊ|LÀùœÀ_5oP¢G NýþÂéÿ:?è‘Ç©G…,e]”FZ‡³Xµ#M(’¼þÂÄ8ˆDÁZgìÓý+ãfö+ ßÞ�°ðO×ÕÛ(pDm?«eGÆ©"!¶÷ííR˜Ù'.ÃC8òoÿ)ÇØ‘»‰Suê%‚”�²ÖÜüŽ=•päâ¶�Ý‘Ž`hs/ÏJ÷"Øð�®ŠŽ2ýR8Cäã[{2‹ Þ7«^²%ý¹ãyv_ðç­†ÕÅóN¸FyõLÄଌ¬ G|¿ž5‘N zR!)ˆ†õÔ®›O­ËÖ$_¯Çcöq kV Ä cÃäŒôèzSf<1± œÉ‘NíÂGG¹VgÚ¿�Äáô‹ºÐ*JÐ-¨Ñ]ü9 ¾Èu%  °y¸7‚}H¶[ vãT\œ©cþ ‹Œ=ºƒÀxÙí°ÝAïoÐZ.ä@&�V-áPlcô³}@Ha¹±ð\ 1`8Î6ùðn÷ýo¾ŒF²,³«,,ý|å|©®šhyî|øm3XžëÛ{e+QµË –2‡5§F‡•´É‘X;˜’žMuô¸C]™½.j©ƒãlÕÄàî*/ï\Éܨ ®Æ;'bÂ!Â�0ö㟠k”C%�2«è‡~¤­=sE-¯ƒZ8TøjÐò9µ{‰Öå­ƒ;8éÂ�qRÚæ/ rI*"Fs5IÒrìK·–nž ‹’Åé^ä°r$ªëd¢õþsq½(/ûbûÇß¡¯ ŸÙÖx7g/g>ÊQNLkÕÙ`jÚúmjî�ì(9ŠÐÖHcÑÖ¡…L,U—_ó:!^±Š;6ù„jÀÈZãïž1>©Orl~i�¤ö÷Óèdòö0Ã{—[¼lr±6CY°âäÇYWP‘�-tÉå;  ¥T¥Cƒ© K%bâFpU(Ó•öJoæÅiH9¯$×�¥fc^Æéš¨à,!Ln^/EET™“ R”�…¾g ÿ½öºàh°[× ðýa$ûL2`Ä‚c½©D»Œ>1håQ97Ja n Û¶3ýkï9zÀÏÞºßrKÍ‘Êy¦W³Bf ú ×ʹ¾úA˜ÍW³v}E… . h í¬Ràƒ 'Õ”Šá}ŒøFZ Š�|sÿ�aÔ!ŠìKǧ¦¯ ­åÇ6“R^Ì.o݈Å]ËJ~gÀÙ¸K¤q�9)j[zà|ràH’˜Ôoçh�ªa¸mX]O‡(ÚO2­fÅÃxÀú  ËÕËTõ�^z›©jäd5OG†#Ç3ºÍý�S§5ËMn‰›[}ι(7…¡wÕ½¡ð¼áwŠ˜!@𚿳>`ìÄ�{¦B8’ ¬Ì¦s �ð˜Gäê qÒØ�?¹ð¬àÿ"ºF°±z61ÍŸâëßDZ²ÝÝ¿Ys£KÀ33ûS=„*Ó=_¼F_aÖÿ‹Ô˜Ù6Íœ¨½»^qÇÀHþf¡zH {��r�ï�Á‘øÑ}wE¬�I¦=TÁ_w�üò�bQÖèvß—Ôt$⎭ öº�X·Óv{�«Üò]äú¬ X±Zø7ƒü˜Æ"úBǘ��˜„¸”ƒp qgèLxƒYª¨¸ëô0$;WûÝ1x0â˜Ã$™q¢='?﵊+§0µX2bïѽÓÀ7� —»† ßÓ@£z2¹„üG%lgò_¦!Î+Iþ‚9y_ÍðÐ�Ïœà\[3t-ª!)ãß‘ÂQÝ|«²¤Û öŠÎ·]òö ¹y¼nì›fÉ¡ LA‡ÊžVŸþ®E$´)EÿÜšc6¬¡•0PäC‰c¼â�›û•è�c {�.|Ê&¢/ÁçN©ñyQ&xòž2òçÑ.�íù湊ÿŠ93äkËò[ÕéÆýÊ o³éþ¨!¼oóõ}<+©#Þðóâã«^Ödú4í”Z·ÉÁ6æ|»K¸g=;ð­‘x–ê¡|ÚÇÂ}Þ«?Ÿ®'ëØUäxÆn\z/éÄZT¸¦¡džÚ =âo¬ºå¾œÆ4Ÿ£Æ<šëÚÆZÆQÂì´›Q¸Þvw"b-k"ÐeÖM.eœ/é�žö½È¾‰à‚êÿ|I¨a‰�c0€`�-ó©S/«¦ŽÿÉ�_øU%ÝÛyWAwBO1Á£ýž v›QKçB J1Í8õl=[…ò�‰åÂû—ƒCþFíÇ Ô� !Ñìö£óc“ÚéÏ_8FŸõƒ9åˆÇƒÍ“áÂ4o ëDÓÑï¾ÌWêö(‡ƒ^x%.5­úàñƒð{r&}­k4·¹Zª½Ü2g�!(5ô{·Ž¾žO'Xðq6–袱¯\æyLÞm½øÒJ_@á ûZÌóuCž�6pÜ" Û=¼}Ÿÿõpõ�¯äz�ïîó»�ì6ëy'×mFÐÉ/+ò¹£f•ÇF�Mþ·-¬�ÑVµ}Î åçöâ®}jHA#3ý^z¸]iëS¢0CZÑxcÈ-Ê„kóšÎ—~a w)&K/߃øœK[•÷ƒpùÕòF,’KØzJ[¬Mî­Í½ûîGjãHeÁ¥Ú¢×lE.ÂÐõj·š7Î^ûÆ43ß¿ï”Q$WIõ9I #IŽ£´D®óäV2ñÔÌbæðSSî®õB”5ÑV÷¿ß5 8/öò…r“ƒ“t÷Ö#jd&YÓE¥õ—©pŸø¸‘o0#8§ê,D³ß ’?+ôŽ ö÷Ì;ÝÉõ®+|Þõ�Âø³¾Œº¼ãô2ÉlÜ>'Î_À¸Æ~Ïl4®�®Ö]Cj€—¦\V˜’\‰³…ÙŒypäŠ×¿`?š¸ï/·—ð‡Áóž”ú4YoVøh©¹1Õé:ÃÌÊ“_!'†úsHôDJ‡fSqœë›Z '¼E¾1GÆs#—‡ÆÞÂuDmApc*­qSB À9¤„±‚Ge)s˜ˆ´-O¥á`ðØ™�m1zÀUÑñ\–t.ßÊ)�^Ùòå‹bK&DCç+óØ+ŸöÑTQb¶žy£×¢=òm‡›Û'Ùf¶¼–ÜaNÛMñ¡«¯»®§�c¨Ù# º(·BåõœyÛEk)Ø¥_÷S*Sì,ìoüÔ‡©9ê%à¸ùã¤pG$_§ÕŸ‘ÔBIóÛ]‹}ÕSܺ, —ƒÒœPû‡ùãûÀ&u à»¶DõÉë�0íª@L̬k D‘î˜ê½†ýß›÷%©éG(¿üè]¤i›×|ÎTË/“åï•Õ@ËPõÆSc¶‚ÎŽH-µy[^ü5qÁ~-V 8¹›¡˜Î¬¦wÊ ò-›ý;U’áæðöì#�0§“ðö[ÇKNr6?P>‹ƒ¸\B.Œ¬�‹Ü³è,{6Àû2�ëRz+Î[yæ¸DzåoÓ�ËZKYæ!í‡BÚ† -œëTbL”ÓÃ$Ã¥ •¤·M;Àõ¹÷¹ }€Ü¼A½—zwÿ¿ÄV ßí<ÙI‰¸iš h““RQë%ãvs‰½Zl�jñû |?íøŸ¨lP¡Ô·{rO¸í�ýU M»»ötzë ô;nL&Õ§�.ŒS Ý;ªú ßÞS92uº#§N»p…Ÿ;C!Ì,3’yC#€p4x}~DëRàsÎ9$˜æ@qeޱV$Ç5¤9#‚þ ¸!g1¦Çoš°ÎˆŒA ìvB-ì©9HžwÍr5¯àoÆe³Ü)dɃŠc‹õwyž& ò¸pkKt'q�¥Žèâ2—À‚ã!€I´8…?DD¦Iûô¡Ñù\úÎѦr �ô¯¥ï­´ìM§=°¾�cßœ‡­ßBXbµgæH¼ëZÌ8ÃÁ†çÒ;ŽbOHEõèKŸ ÁV-<@¦ Á•×¼‰w×â¿5qû‡â2n&wÎÍ ¢Íõ]iÃ`v›Gƒ|r·¬¤·ð)_/`kQ 5³� /`õ—+«÷ Üã­è`ÑèBoÍžhL�8Ð�tÌ€eÄy¾$ #õ}€à€�™×6^{«ˆª+¬ëô([·‡V@#ã·„Ù1 $(öó´;ú‡g²¶¯Ì-ýO¯'!ZÀ†}\‚¸ÈRݸ­vµ†ï*4ûÀ‰ïÁö0ÊeŸ Ö…ËÌg‰æ4(ÞÁ0²Ñ)¿DSÅöÔï!/—º‡8D¨„ôÄÊq»�0Ò°5+äZêro“ö]÷À¢Ã ÀÛr¯8îM _» OmÞ×9��1±�ÝÖõ9rï;aˆÍ‡TÔ3˜è3.$šO:R{i%Ûů]5¯ÚF»+´"KÚS<Ÿ}`¦W‘tj5Íô�{)n8Åì3£»ã¤—±-C°Ãv…vøïŸ2œ÷¸K#XÀÍG†s{8lŽ[Г^Ð�ý�ð†Ä2G³ôâO=¡Ç_"0GevCê^Ý{Õ¶šˆ¬;,x ))XI1t²Ä’xÛø;.W�¥‘°(„ûuQÚ‡tÂXõF�x�lP à¼OšÛ®…¶Î�o•¨Yä/P‹ÃØŽRýbåX÷Ä`¶›ÿÿ7vdNôøtß:îb� ª…¿âöcNX'Ò1=_žáÞuˆT˜h2¹’OÞñÔH÷ èò&n^ÞÅä\¨Ã?ôb? �¥€Lëü/F_ÙÇ÷[ja—äøž_ a °ÃCþ(+ð� Öì%‘íœ(k•$^•HmÜ¢ˆÎ?ÝéPßs®}=M‹´õo÷/)a3,‘Ҩכߕ ý—”xyzb8"5²]ÖEŽý6#^tY� ºèöÁå8ÍÂBENTÞP�/þ:÷¸¾oµÄîì»EhcQÑŠ!RÝ "`•2ÐÙÜÑAîõ¨[‹�Ÿ2©‚Í$Èÿë…s¡)b{a’Ný�½&úÿü罡g�Ëücû´‚=˜Å1ë�ªêEyÏ"d~ÿÒ¢@ŠLáýÑ—.ø¿vÚ�ÓW1›Œ,a²ªB"÷¬e¯@³«Ì½Æâ×âJÁú °{Óó7f 4uâ1�`¤_×1 ^Þ‘>¯Zˆ¾­ám/aÂ+*¸¦›¸‚ÐÁµ%Ïop@‘³µ ·Ù&ŠÅÂ>òæW+`;˜ºë¡é1m( £¢Œd‹\C/¤g«�ö¥ /#1ÔÒt2,ä\•aZaÚ9_N–^å+rÖ2S¸Í…µ-é–º‘ZàÇœ8h¡¬ÆD@€ÝÛÕåµÖ[úŽ—¦í1u¬áòeq‚6¨Ý±ä¨ga® ÆK@ÝWxƯ]†÷¾yˆÞ`í¾0Õˆx/Í�E�}?1~ù��j‡�{ÁøÃ Èdb’°`T¢‚ë´ÎDž Ô'kJÉ+ �<×]ëÓ ø}Pu‹tðØìP¾ú›g ÃÝ ÎÄ;K�“h6•MJnÄÆZÇ' PÝ @D¢Tð¨P–eBŒDÚ5¦2.æŠ ¼TDõšo0ì¸*/ÊsÆOÆ7=Ucަ?ð{ððiSÆâwpÛŸÓ]'¹¯�cñØŒïªlb¢ñ`„� 0= $þýºS#s+�š¥`º÷2«aP¢çÊl¸.æ��2vT‚åjq�ÿxÖ5*xÞÞ’ä�õówÏ.g¨‰úíO*ˆEs’G“l÷øÁûKã[,\²6‡˜oÅoT‡ùþs÷‡å�–Iöŵ\†r{ãG®â PqKT×jZ\Æ–Å7kªëû©âðéËhŠón@3õ†f½ñ´A׃=vÕXÞßV6¡ò?X~; —�Ãdߤko¾fç«ÉíËœéOÎGb`ï|[ï—ðW£M�”P¢kÇìß xöþõx)0kvÓ¨õó`抣ég„ª¥„È!ÙOd-·ÃwgeÓìOöƒ9f»´�&`šñBk!VgÈ,°4 לk32OÌ(ëA@!De&ª£ÀNî=›CLmNÝ$s <”]Ú�âS¾1{“êDO,‚UðyÈÅŒ8�ù Ì.q¥›ã ’KB¤åt™ƒp†5`‡|"( ÞþnõÃxv×>Ç ¥©o0 ð?gâPj+ Hw™eW‰ü]q#ËÐ\1´¥é¯ 8õÎÁ™]e°Eœjïù.÷[üØM]A~}<¿7¬ç/2Ëé Ï—Œ9›zÊ�_ArÞ<ÌuÂ"c;­lŽâ÷6ª¥ˆ¼‘˜\×%îiFfà”±�qºð0a †¥ˆ˜•TU£Èo;[a[ƒ„dn„ðvÇ¡·nKŸÖáÇ\ˆv;gò÷&™æÏ6Þp³@)Ž@Æ¥“*ºÝ>í½%Lbã8GÆÅñ¹o9’ß™qjÊ £ìŒ�;älZ¬zþr¡Ô†=‹ô jn czÛ±˜k1ìÏǹ"l°mß=»’6JrÄ›¬lU¿„tRÈw&SÇ©ù^DŒÇù˜×­-óïN�±æLÉHé–`; _ÈP©Ö…,’N—0zm¶òA”£Çó¯VÚ#’Ïa8iY: + $s-$wîoÜk«1æö[árwã°M:bo|ð X+ˆ˜:ÒJ�Ám"¥sÉmƒÍÁGEeÕÒzfHØx$/'V_ Ö‹ÏéÀÓE›F/é¡dµæp¶Bøˆ†�ª;“ÂHÂ[%´1²bήo}pã©]ea$Äãf !–X#'¾û"žÃEu1û2ë$|sÉ`al³'½Eá¥"Àê¹B9ÔxÏëyuªé˜H£Ê `ÍG^µ¾€(€ÂÝS±‹ßÅ Ù1‘€³ 3Bܵ箢àZt¼ÜßéyK‚þ=é•\äùûÄh>+š+‚ýBÆIúDåÁz—o?ÀÙ�‡?§ØÛëÏpGԈꖌÆ^/àò™�ÕÏ:Å»‹ßd»Ô—Ÿøìä™Tíh }y6ì¹ê­>ÿà&½#ÅBƒR ®%5Y /CÀ‚ÊŒY7œß÷ƒ®f '“bÃØg+º4ØáñŠÝø~ç¢÷F3\M$ôÎò•j¢¶ã*–Û Ït Á@Áž¢.Ÿ»žT—T±²ÿšrNÕèm7ú&­Û©§—¡,‘d eŠ5užz“«Ìoé×"�yÙ¤ëÕ奞á†nÛaî�æ}¿ßIŒbVÒ¡�°äQ/€±á‘a AÀÞ5”ÀÕôwb‚ì¦r/‰cgÓV1Ç[Ë'Í1™1è &J¨™åöÂa*Oy¥äw!l¼ºŽ9®/®�Š"4P�5—”|§Ù%ö&-¥Dð½…K ‡nìjblIÔl0-9Dº¬&¨�ɹFK¼g}�Ùã§d3�`¬bg�îæ©%¡.2‡ÎöU€:Ùטqm‘I�ÒJY-o¨ ÁŠŽg¹'Ò‚ãK²(kY43w,"µð 9n‡˜+ V·<׃†5Ã+læh{ŠÃñÏ¿óþ,[¶ó‚µÑ_À }×yÖ¸$;ûnD®76*ø.#³|™Íޤotô|ޤ–w›Ã䑞òªQ ½Ù!3˜ž¦Œt6³¨îÎÝb}Å®EâUoÜŠ]óa¡²¼ËêN0*À*áÈ_n|äÿç;²j„O†Y)QŽ/§YÕuÃz 1¿'WFÊe«ÎðEdŸXq‘Øø'&}*�1'CKÇ[ônW èñZsš{mRØ^Ø~PŠŽ÷‚ˆ=ð {€†îݩ䋮Æ2Jñôº]e“DM‰Î2ý(­Ô‚@Ž/HňϰzÃ� NÔ‡Xz#´°ÅÖ."œ¬p«�JF@ÐÁ¤š/‡]8ÝMa|¯3hÑîÖÂÊœ÷ ��XÛÄ™f!á3ÿ‘¬ S?Êè¢�M¥µA3u†qÑHD‘P”v´*þƒÐ…]eÿ›RiF„¥ÚöOO�šnný�¨ ˜ù6ZBåÙW¿äx†‡º!ˆ~2?¯ ))l‚Á7ü±i3ä «P¿�Š #4hß[ 3‚/ÝTÁÂáV�ü5,ò²ë€RC‘༙43'W¼ÁŽ~j°TV*4L£V˜'-�ʸV ¢nbâi–Ér‰Q”[ uÙ+_)Ä{(F…mnËzÜùaÖrRV³·`×¾QZŠÜ$ÀäÁͳ›¢Íœô%)\£z5JçÌko/Lׄé«m¶­Ð¦ÂÞáÑ~"¡Q9¼aÎZÚ+²á�+Åæ&'Ùy�^Y:é{Ÿû#žû ú0x 䙜§°O"僽ˆE|ÅÂÿ?ÅÆÖ†ïĬF².¿ÔÔWVÁd‡Ëä{w!® ¿¡ª-UÍa-ñy~'¢Ø•“ÄR ‹ë:üR¢„�mY†ïÈYÂés?Šÿ‡3»wé�ê¾3áW´‰eg„ '¼ô³‘å¨w0Zj­¸„L"Ýc0ƒùAžéà)¿è¯ë?½<Ârf1xûkç´�ê{‚×1¢â'µwNÞO™ÍOcîõ‡ °xófÂXJ ØZÙ¨‡ìÃRpv`›M ž$ñ‘±#ræ93WÿK«kˆLd]�ÞEœ ÁŠ)¡Z¶&ƒBµ7ú�œaNLò#¢\éNÞ{²]›‹£•²ØY ‹Tm˜KwÊAÌy±D˜óÖÉ 9ðUÆ™xÿXïH`8”y9,Ì ¼Õ™QxFßëxE8;z`tp?¦c­qàÙûÞ´;�ûDórñÙ°p؆yk[b È),¥®&Õ ßKêó»3>(ˆëÀõº�¤ÝÒf/»ª›ßÛl¸ŸÝoóÊ‚îê¸tbü°ªÝy-ò%ôë³ß{¾z-bØdÙÀ“Øc$ðؤsW½kŠ_ø kþÿ>à¼eš[‹D×Ö' \=ž^øg³£;™�Jê¯ë/¸êf”!‘ØÀØ\y$ÿåAJ PP•†Ù¤îé‹ivĉŠ%Á¢2ku!UïzŽŒÍJåü™FNá¶® n²á®ˆ5ç­}"\ŽRhóÇC™hÖ™G4úÐâ¢b¼Ösg�Œ²·%¡%vÏ“¿"’à­&ñÑ‚Ô_<˜÷G‡•ô©|<σ¢?áâëåÛ•œ`�q~u Fv‡ÆžýtdõÝé¸óÍëmn†?àõ‰áhžû>xjDD3Í)»Ë×¾÷²3¬v¯}x]ÐD®1ˆnfNhGŒz«Xmà÷¦ŠjŒ·]ágwßøYRXDœ—8ÜCªX�Þ.µ³QÜeJ‰0[”œó÷' #Yæ8ÿ<½(‚´Œhÿf�·-` ‰K¢!ÎÿŽó5‘«9¨Š.2æ^þh¥F&¹6iGN¥v«#ά¹ˆ¸nk…}�Ðý˜]qRR©qç…¢˜kĮbµÔV‹óv•ZÌ=*dË“JvX 7�¸Åš’­£AÄÊ4ŠÐ¸�î,‰äøQbJrY#ÏB£såêÇú[¸ãçóÇň´méç"‘df_˜oε'o–ù~½]õ8çt¡«ØõË™JÃ?µ}¹•÷¯57Œª`p¹¬9ó 9sJ™ÚÓ�w ]ÜÅ `HŒ5Ù‰P°’éÅ@”.#„Z."�0´Ì_€ú¸Æ5%‚sj¤Ù¿3u+Úû‚ÇÍÎþ¾Ø?ŠÌËLø;ÚÎH^r|{!Ýí­Â>›ä`Ææ2X»ß¶ˆ²B¡P-}ˆê䂉¾…epCf¥îj l75æoˆ“ÑÇ1»)Äâ�KV‰EØŠök𷌺 T 6*mæ(¢žß›éF]td[½¬djœùшExš§ÃÿXYΨÿ"ÁGWòápC…Y±ŠÌó—{ÜÒ,ØlY™òÉEX_Òóı¦–Ø öÂä {î ¹éøìÓ‰Ãïµ€£Ã;ŽÑ¾cŠ=eAo+Œ$_ò[E’͵©¹þý ñs‹õدø‘|Ýê›ù<óIS "ú3/Î-o\ž ý¯ÌFÙ‘?�pºŽó˼€¶áb*l¸Ö"Ï”XTK´OƒL¹�‰6˜#”e*E”€C8/RØ·¥cŸ+,¬çÛžCwzD §h½†¶ÿ½p)ór�\1ÈWï$IdØ®^ÐÎ=lG°Ë¢e4k¯=žy沞5�ep ëÁï–ã<ºƒ™¶._´­Î%Gï4+锡÷“ϱïÑÉy�Ë>†*€Q°;¨ epZö‚1˜(Yê˶½ oí׉o@¯1™Nf|€½&O&wã{¶¹ßa¾ú‹^}@“óI<ñ5çˆØJ \)ûߟ§î¸äV0D¾x‡Ä:Æw<¿¯É½èw8¾ùçDÞi«›+'”ÿx@Û–¥ukåÆ4›è/Q²cf ÷ÞôaUÁræk›b{¼.i¥Š?[’úµ¶Š=â¬#Ú[k[¬ö{i¸#�Û–<ÝIdÉøAS#�°±ºÄ&aî2^=àé;R°™²üLJJ—]ŠÒ�1g`úòE•пZ…áBE,ÐP´¼Ü´‚_ ³%ÖX(Ê’Ý¡2|ki¸�Ž Å'fs—Ë6›KB²å ù_ùФæw½ã¶5^*AÒ‹Ê,dSz/ü‰C)M® ø5Ábúw*� ,J!I¿ûC_úΚôu¥A£©_²£>t²z¡—\w­Ù˜âibÜuAÍ4òPG!‰;á;1E‚pxƒ±�×8ŒÌ†[²«†¯Èâ¥{µ}>ö=«v~Û¤®·MCÔå,˳†Ö3RMIµ¾ñ Ù»Û‘�2o¤Õ­%âÛ£ñö#;âæH©ë·ðùuÔlB7ß5u±}¹ÌKä4Lç©B¸¡b"%\í|¹›‡ÖV¸\y7‰”"Œä:¶k(·Ýäfèïsd­%Q…YAUZŠO0æ�¬ñ/—-rB/\î|k\j²4tœ$X…!ŠLã2©0s2‚ÚìÅD¥Qÿ‰ˆÃê¥ âŸˆëæLMðõ)ŒÈ’GÒ«(Íq! §äÅlónøày¥Ö~îÉÝöël72o¹gwÄ-h¿9›œeÛÌAPœCO‡ÀFj¯ŠŒÍ*RHÍV†�„³9pšzƧQ7‚”.ò«í3µ&:Só‡BöóÃi×·ìÞõ¶Õ ,÷ZÉBfŠ ¨Ê@Ê“g.m°¥|á¥Á&‰,qFi-¢¤Êi/w�›…5G«ÜÄ\çƒ'³A.TŠ÷›–:B Lêµ<Ôή"i™±J‰‚zXæë!âaRB´r"+H°53’{³ÖM²Ll¯T�RÓ7 ÔoE"¥Êo ùÔí#Q#}Nµ›æÊÍÁs[qžôÙëE ò²ÞC!H‰ƒ�Ê}_Î’Ù¦¨?xï…É‘ÌÔó ËéÃêsf ž:’ÃÜ1åúßr{[Ü,º…Þ¬ÔGV~õÈ„öééüÇ7ñ¼òËK‚æÌšGô�dŒí‘wx`Í|—‹í÷›îû1°qEY%�ûoðÄ¢R”¾�?ÂJt`±Ið7/@”°d�áýè ¡ÆæÃ=™Õ‹œýéÜøÞ oVrÚUVvÔ®¾N7Ìbmñ¯K ÁCÒüË~×o¼­¦ïKjÈÿ#"¸¡»ÂêŠFÐEãàoù«r™Ú ®·µ›sâùÿ{r×ÿ$df¹>XÏŠoâöß±Ö¹O±Ôõó%ÛU·�r+(.ÜÏš5áy8` AÛ‰7-Ó;ng,Ä(>ž2T‹×îºoÒ{ã¥Ð÷®½QÜ$y�{žà˜0Ò ÐÇ™HyÏ¡<Ž‚Ìù’ÎS5¶@zt6œÖwÄ!=¶Å\Çšê ”¾´ú Éì[{Œ¯¾ã*Ý]I8ºÛaš“N¼ ×R¶™‘¯â6ãÜ‚8„ €S$V ÌŠ– I—<$Ù¾%±p¢K7•1&b²èü0M&&a†L”Ó~¼«u†mXySF KíÁÃk¬…ñ–[Œ‚Ãö¸Äþ¬®:Q¿òvü· @kº€^W —8›–»†Ò¶üU!�Q¨¢†’4’ã_âøi°}޶‡Ü·aÁt­À_s´?™-x3÷¤Õn[Ë‚�{�È1"t~{‘Ž× (1d&z«$ À,Ê£…å Gªºs}r¼åÁÛ5G¢U©y §?H]¸ùþ¾b*ÄÈã~‡¹“y)³ ¡ÆGŠÚ²5Ü_ Ð©Bø3Uz‰ŠÃnp\¾:»¿ ¾qìÇ]1KËU�a‹8‹ê.qX†6|³t¦¥*'¡o_4Öð+'¦“Ä�Nò§²‚ä�X„ë+˳*I¯'²N[aWjG({ch½tL ‚†¦CQtÊæ6"Zrá±¥GM 1s¸æ¢÷ã™tLº£jõœå)©ë§>.š¸ —;šp¶`<¹/NÁ¹nKïø€€t5|o¾#¡Ë~ž¨¸‡P 1éd|u¡ZåS”`Å XÞmîhmD=¹Ú¸XÉs�¦oÔk¿M@<2°5e0fXQ§DwÒ¸Õ;œé¦Ìñq57A,0ÉJ Ít˜Ì׆ҕU àÒ-;\8']å~-ü™âàp\´EoøŒ�§{·¤!ƒžp›.Ñ1n8áð¤ëÉËæ·²l’×?;ºÊ�¯Â�-¢6Þr�v 'ØÖÀ­ROq"¡�ƒ\cët@B¶Ôžc%�~¼°væùx·¨|±š­{YÍOG¾ r^ç9GÀçd¸ãwrð¡Æ¹aZ·¸z |9™¨…âøïmå­Š†RòO¹A�ûù)×W¡sˆÁîÙ»ßü1ð»Ý•…fÅt ²™‘Ntsù½Þ3/)�{Ì^#¾�#^ d*£m4Qb…œÚjåØpjl¸W�-¶^66��AŸ%“ —tæÈò8‘”V!š7ɯ´3ܯx{à)NÇ9~Sâ�Ö™x/ÝÜ»�F—wlˆÎB™ß˜_ä}Œöü¶q’þ‰'!ÝÆ'fÚZD(€çˆÇwÖ&”Ú蛣ß”Xš“ºÔ7ÿ “Áßsµa�,¸ÓF/Ü™ÃIï0LÀ§è:2ìL›T6PÒ1 FUão1 ƒù›¨NjÛ’\…4y…qÅZúÞ±8ÉB£D¢3�˜)tç^-žvh¸‹a)|` †>ÍÊÅœ˜0‡$ ¦ ³Ž?‚¢Ìf³KZ’¶�nBÞ‰).�“þ B¦mpðJÊë|^ù<7Jý;M>µ‹®ñ¼¶{.K»PŒ¶7I/µ}Ãs�-@Ä,Ç&MÝ]âè·¨Nò4xÕú/ì3ê5dÇbVô¹Á:haz0b®¦03[(<"e¯…×1Ùæ†«&ÌÊÔÇ�ïP+– ÿæp"_‡{ƒ­@÷È—Òáñ SÜN¯�pLm=”‡Çã®ëÀ“IaþÁ€¼"­£kV@aa' ±÷Ë™éI\…)Q·[-úˆ3´eäŒ_ ®c ^Õ�zº¹�=t÷KŽì^¢%,H$äY�†»äƒU*†-R¾¸øŒÅG£GãÙµÇÜãºòøWÇRÔ÷gã'3Œ –Pï4—<ëWð�ó•fo–ú—ÍÂU»Õ`wzx˜'-Ï!Ê.¼/=v’ñ¾mðû»œ½3ë×¼æ<ªÀðké�¨ _äŸÊÈ«¿NÆTA2d.,^Ê~{)PÜcö±ÙNÛ÷Ý®»@ØWç4/Ñ{Ÿ]5>²9,+Þv‰÷¼ú!­¤Ço9�Øøór³™¼éq¯ŒøZ&;³Ÿyé (m‚YÍ™e©zB‹]Ÿz*êéÍÚ‚¯ÎàݺFgWjãÇ.Œåë&î8ë­}9â�5�ãܶ* õà‹‘cê?p IÊM® Ú§&>_Q³�Œ-µñ„Fååwö²Øs“‰(IJn£G «ÉĪ6PÖ�@²“Ô#GÇÓFïŸü›ÒúT�fiÁÂÙŠÖJé>;JÃ/®Œ/Ù½Þn¨ÐVUmó-¿{{üùÞcoöîká^åIê-÷épÔÛÝÈÁ6p½L„3¸\!žvSÕþÒ²/e«Í’�ÖÙ±•Ê ˜�Ä4éÉѱí'xÉjÈ0ìã^TOñ—!ø —�ó5ÑåÏ0ÀÆùKzBÿ`¢üêb¤‚1ÌÚ×~ž³jHÊó«…„`÷4ƒ“Äow%]™õk­ñÂ]†ŽÍÌ7O6æ5[|Ö©آDÅ1 ùjRj±MðÚ¶ ?xtB÷ŒæOÇè¡â‘Ut_Òð&mïwÁ`Ü\�WŽÜ³+¨u–æK„‡Úÿ¤è%xªYΫ�«?ð• a]p׸÷†HÎX¾��pA�ÃèX”âòkŒŠ¢ õY$ÞÆE®Œ‹“Ž��h£åÏ¢¹5icå¦:%·¤aVÇßæ&-€BT]ªº‡ÿ6¥øÓŸŒã_ÊgMþÝù­ú†üŽI¸w†uÕü¸�ñäPªùg8ä�x·÷û+Kp¦ -ñ>ÈØl¿Tly÷êPJÂ.¾Ìa;ƴס«{N݉fîŸÖý�Š^8V»}çœ+ß‹náØ ôKºFÿ V±„«_„æßäˆèyRDÇŸšþþÝ_ô6y@a ÂL»ˆ×íüG�¸¹]hùl,¬‹˜K¨j¼wAÃu6üÏ.ç%—ÚEó†_ðïŸ4Õë .GXÆGb`ÄsÏ.–LÒ[ÉWqøXèJìB-·‰  âÍZ’•ƒ—–ؤ‘Ï“’|ë·bBƒ‚=ˆ�\ĺ;6²‘·ÈÐW*òCÚ+‘Ò{)`ÌúÔtàׯŸÄ ^ïiÎF£Tr>¦Ú…„�ÜÃe¶£þÔ¡X1’ ÿFü€¦{¹ÛV›nE`ðs¬#lDtaŽ „ßÑSQ]¬2:Ûf1…+"H#»09ÍE·#óñ× ü‹×w}Ú5xÔ£Ò˜¨%W£÷Ów†Mq³‹£aö±quº¡Õ©ºw]d§ E¹„]Aˆçœ¢ÕÙ¤†ŸX/ÿP‘例í­çÉ•wßö¨Fä5Ãfh,<"”;_Ï?©¹ÒSéR¢NR¿À(bilíµyŒc¹»db×í7Jåýç*Mz?q\‹¯e‰ÿÑç“䇒ŠÍÍÔÔa6°ì`9‘éêïu"õÿ-3'@óèP%ÒùwŽî—Ó#Û™ãK1)úéçŸrB�ß·3þd+ʈrc¸j½}¹t×d…¤ö˜WqƒÛc©* %B]ïAþóØën·žZdI¬ÇÒüQY-£÷Þ’,RùÑ{Á®\¸¦(Æ€GH�_ñ–�–! ðf'Èš™xUâ;�–¸,ÕvZõ€ŽŽ-õàºmµœ§¥®¶×VhÅ'U·� x)w}†6ØòA•ªÅÁ Ù¤">#µí×(íÀ¯ØÙ0BN¾X€Rmk¦Ø#ö5«Ì�“ËÁŠKìöu÷”J cW�Òµ524w}N°�U”wÎ(Î#cïÃííJ„‡wv‡%5ÁÒ¶Ú×i —c*ø²7¤$é›%1)3pK&ŸŠ�!=™ZZW„_÷‚ëº:*Ø„B€Å:�ßÝuÄ=@Ôª‚Pþ%p#‹ú'þ¯a?Ö‘L*@€Uތڭl±üÀÂCÍ�Ü+èq(TO¦£Ë‡LS¯¤Yúỹß홟ôX™�ií’”ŸZYsWù‹÷úÝ|Ÿ7ý[ýÃó‹ÇŽžžx‹ÃýÏÝõÝ�쥎§ýdÝz‹v¥£üƒÎɦ¢4Õe+«Š&ÁäÔ·[Ç0® Š{H÷EŠÂÖ—)!õœÙP½%8¤X¼Š  "× ˜+_2šPXkúëã×’É­½Ùpâ“¥F½–Þ„‹r×'½Ò6ŠZ,…±IƒK‚Ù¼�Ú2ì±*Sÿ�½p�|á9¬¥–lÁzØ2FÍçr²®—½3EG¥Íí…Ç‘o™šÄÌh"¨dClwÜë®iu8¿Ë¢Þ¼]_ó Šýtî 4§¼”ÅÙ�²*{'G³2Øìn]óÿ½4àl£O¨D¨¹e(Ê µä³©×B’ge5l¯XSå4ë‰d•TE9Á9¾=å/ “1´æµ[•ôµ­rrœq�l¸Xl«ríŽã"$š&îÝzWˆæµ†«ðvíX}éÑõŠÞ0jÑÌmÉÔ�¥%Ý¥µˆ\³y–œ–tšä�×zê!HÀ'óO²Î¥Ó j¥æe‹kÇ’YÊPÁòM˜_uãžþN{±f4²šÉ]4¬¬*|ÕKÎw#eRÍkÇqw †4å:¨.<†"i�Å/��]ý»÷Ü#k4É&9�óÊ…ækAðB4‹Å‚’O5M{t«4E.Ôâ “+’$‹AñB±än ×õ±Þ¡`m‹ÍîýñȲgÊFÁiõS—CÓ±!9�ÎÍN½SÍëi+¬šFƒLb\wò538!UP°êøreo`BÁŠ0åpl�yJ›ÅB ˜Ô¶5 $S�aþ58.ÁcLLË‹¥Ï 'ñÕY("C;òëŽè–®‚~ûœbŒF®¹(¼2ÿOñâÑ Dóþpê‘/ãÓf<{nšÄæŠJO‡Zò„¹í‚P;6ÓPá¢åyù~ŸŸ”u9Í2ÉÂ6ØÓI¶4 ¹ß;ßáö#Þþ2ì´ÔjZß§¿¾iç—…§žav%ãÑ÷×élìYýÌ?ò³ÄCš÷G„"\ LS%VÄ{»Á޽�Ó%¡Ÿÿ^P )'ýÅ×NX‘¬6VÛ'²’±Á:aw"!}&}!XyF-ìC�†¿ýNè°žn|òy”^�gAó¯²Ó:óRv0úKðwä…éjò¿ÊÕl·ÍþC–t·Û×ò‹c¶¨/01þJO={Oz��ÀG‡ÏrÞ—8h,ÅÀo` êìÙžÝ&kqP#àý~Å_úïž~ý«ü? ´²Ç®í£µÒû �˜#„ SbÛµ‹N}´ìo»Ô^S" Íw:ŠÖ—‡‰ÜÚ‚‚2á˜ÿ Uáܘo+aç_B7æiäƒl£?‘öþlÃŽêwmúRGnæoÔ=Þ2¦ƒjU¸?~Ø´®rõó�<ØrBò`J×ú À–Xá¶ûº(½ÐáI’‹i:³ÅÊ1añç¸Z3 X�e}×…TôðqéH#óaL.SšÈr°�!µÙ¸ñÌ¡z’'ßËaÿWç%Š3+gÁc´R?(©�’ÿv+¢ÙëVåMùL(µÁ‡‚ŽQMX`c_ËÐ9clUrÙÍJ¾¦dÅé•L3.\ À¶�ã¨<†Ð«Ü�[HÓ9k8X ~œÇ ó-næÔº0Ð5BÿUÔu_3½Èn_½æ;®ÂçZÿ¿Ãº€2J¾ãs fˆäk eèÓc�PÉ„²u�zfVÈÎÆ‚U4ˆHwbo¶0¸iª@A ¢Ž©¹Ñ/…¿¹ñcŸ¼}üûÄø`ûllŸÑÓ|‹é(¹…Ái]·‚_ˆ°gŠˆøò!³EÔGξÖ!:¶@ázíÑK`…bªÖ©ú ‚Ù•”GP£v!g±/OÑ ÂE²#Õ÷™W°F›Å|iÔ;ÊØ•…œ3Oû)üÚÿVñøq/‚<@+Z ±ÓÕ�Ç®Òü¸½ñµ:áî/„sš"Ë­¢Áä™íGjp�Bˆ\”1ªq>ûÊãq�–0‹J&+­®»onlºÒÖ1Í-ìùŠ!À,§VFò(@È�B=†þPïM§Zi@nwá € E­ó >×qP×èa•á¯??ïŽ�kš­¿ÔIŒ ¤»xwfðóÝ#Y /Ó'WìêÓ@Ô…ê‡è¡&gÓ'?œ\PÛv]ýoƒÆ8ÎAÕ�¨Ù÷,{!’HsÕzÅnCÏhüû©Ë6¼8»Þ{‘Âöd !(�æ4‹a3ÔõÍLÿËiÎè`á¶à€î ¼ˆ¶�`–³lµmdØ «QLñŸÊµé‚ñ¢ÇA]@dhµLl4y°É³þBÐô~±}Ê*ö®£ ÿáYÙ‡A r æû„øcñƒ§3ÆàGîP©ïßâ2ƒX™F·Å�­Ǵ¢<¥ä†'„LŒè¤ª%Õ‚zIJÄ*1Wò/�ëìG?Î'â{ý•ò¡þ›‘5¢‰tÊ(0‚(LISæ'¥å†æ'Z5·?÷Ö΄ È%SKq‡±g~?Ž›»~8¯ÓüÊ¡¬%ãß9ÛßOj1ùƒóÝ?hƒolV¯ÏŸ[ÔôyM½5H')¯ªõEc·¯Ðâ>ôÍ[¯œëåJ‰µíÖŠÎͯ=$ÌÃårËHä¯o´Ê˜™ÜtÉ$_YJ¥ƒÁ»fA†Á {)ªXN$YVãøÖ\Àž�6>¦§¨�ÿŒPVI”ÖL6ÁA.¥—€¤ŸüÿÿüZ'ßðø¾ÆŠPR‚‘TT*ŠªR€ AMA%DJ¡B¥öà|@ ÷€@¨  ¯¦€}•@€C¡B€À¢ƒZ¡Ó€ Õ¦€ €N²:¶ì}5ëT|�€Dóç}ú>QÑõ¡GÝi £ëM7}Üôªµ@é@:ìk\Œ®Îûtô�¦†€¡ÝHùé[ {¸P%i©6ÁÔíИPÐP(4" n©ŠèYŠ[ iµÇhS  íÐÐu‘ËE²‡@Ò\Ê�lª(–µMDt€(Ø ’,( “:�ÛZ&Ài(w:€Ëu€Ð °€%ç+³(†´è  ÑF…hî�h…e6#"Ëc¬ì¬€ U(Dˆ¶�A¸šªm’Û ­U빉£A@£€m£!Õ#@VÚ€D*iVìt„SA®€Zë®íÐÛD @èuÝ€h Ó¦…•@4BâªÝ›»¸(£®Cl@� .s’¡UJ¸ã‚¤€t Ð9T¥P]$Xè£p �"¨ÑFnåtT(à˜@@€!(ŠAê0j`$¤‚©æTý•<¨§‰ ©!4§¨È44©â ‰M1SòHa'ª’™(='¨§©¡£@"˜"R�N_žoÿMJìÒçÿ…?ø>ÿõýuËò¥)¤ÞeM1DMŽ[\ñçw[œœ¼:ëÝÊê=>Ì£0ÊA¢±TÒ¨(ˆ˜V,ÓFÅÒVe’™2(iE£VicRj‚©,™)˜¢‚SchŒ’jfMQX*S,¢¨‘Kb"Æ‚µ-–�ˆÐQ’Ñ#,–L‰°†ÔVˆÙ³Q’ÉIFLÔ[™5 ÀSa%’²Q“%•2�lQ£LÕ2Å£S4I-¢É�4DÚIš™¤ÈF–l%™“b‚£Q%£R™›še’�ÛFQ3LÉ14ØÙ Éh«%$Vc1)‘6“F*³EšJ‰5V5“iƒ$F£eŒÖ‹F"ŤÆÅ›B’ Ô›‹"[3S4›LƱ‚ÌÉ™Jle* $ÒY‘ŠÍ4ZM£Da–$Ô¤ŒYH¶ŒI©¶Ôh¶I#ETA¨²j4šfÐ L¥I©–Cb¤²h&R"HIEQ¦ÊKY¤h"ÈiF•$b¤¨±b£d4iš‹J`�%4I©4šÅ€"ɉ@’MI“aHƉjD!™†cCR¦Tj„M)´š†jc3*0D”*J�bCLÉX„Å™EQ©³m“lh*4b©‘†cÉ&,FÌÑ ±±¶6eEcdˆ”ÈlRe*S F• i°¢ËY³f4¡M¬ÊZi¥©H[36I…-fbR¡Y¶&Í&Ë#SI –¦RÂÓ+fÒ¡2lPXIM#h µ¢ÀY e�³ D‘EIb“bÅR¦FMJT²ÔÓcbÚ0Í£d´ÈTªHÚ£ZQ¦’ZÙ1V6�e±DD�) 6*Å´jÄji±�´IbÌ’ÆTÚ6RfÖ6¤ÅF(Õ™dµb„Š�JRÑ“JF¦XѶ#Ri Íe*–™*¬ÐmY¬šŠ)dš �ŠÆ¤42SEBÖFÌÖKJb4–Z…+e&5±©6ÓK4Td�¶ )m2¶,XŠc©6(Æ*™ªJ+%5*1 ŵATš¢#Q)VSY-‘•!šS4Ô²e4QYM“%Rˆ¬i–e¦Y!MiSdØÔ0°šMbÑ”ZeŒÊÅAb²F1±E�©+F¨Ù(Ö%"�QD!¢�M%6«4ˆÕm”£EEDS#&Ôm˜�ŠM‹Ed©¦ÂE�£H‰j`¦H#Š4Yš1!�ŠM°$XÖ-32ÐmÌQY$6‚¬m2CX¥6¦V�L™²Æ4chÑŠ!`•"#+ ƈ’ÒY•„Ù1˜j-Œlm`ЖÓ4–Èh²Zec$)¤Æ[ˆ(Ä“4Ò*M‹I‘*2QQ¦V-³Eci$�™”Ë2 ¬XÚ¤Ûa�kM“ ¨64i˜–*ChÒš ª’ƒEŒi”Q‰˜É)‰L&”ÛJË2QšQ£b±²XˆÑd¢*"£ @,Ði²ÅhR‚‹L”Å”¢M"l¢™‹E•­VÕzVÚÖ¬µ­­©[kZ·žµµµ5­­«í­µ­Y[kZ·mµ[V×ã­mmF¶¶«mø !HBÄ€H>A !È@ `!$“ @}Áluí/î,⿽P 2n¾÷�³›b'×.ÎpávpUûF‡{¬\5d;¤ Òêd‹«3oLá I*ðåqµ´îôвßP�öa¢¡ºÁ3²´[Bªö…b]44E=ÁϦP˜!´ö-Ç�–*7�hoVžÂ0SOÄÙ2»œ�phÁ›u*ÝsåpV"¨ñ¬dvš;Bi 4h$sî±ËvT«E Gsèñàøsà jWö/`¥WÚ†Òå¶SQ†2žñX ÚÌ4½ s„]³ÕÛ·pËO‚NË€Ûâ�ͳœ†,"ñuf ³ƒãìÛ ™\-ÕXÈ�¦(CÃgX×»:• ª[7HÓskWŠaèeG ++™çD¹nº¹¸".øC²Ã²1oº›Å·‡LŸºü�ˆe¼1£Ð¡_!ÐD>n…W±%¤Aš£{œ0:BP©P=wFéÜ=¯AHsƒµRÀûs+Ö ¨²¯^DH°‹ºê^S¬”©‹ÛW×2*ÒW×ê"ƒ,Y,pÄðÞØèïo .°\ëfÓ6mz“tHf+¥6äÿoÝûÿ’þÓÿ�ú±Ýþâîä¯ÿ—ö©öÌâú;»¬Nì/ú?ÀÕ;?DàT¼@ä¿í#¯9B0uœ“³;XÍ­™ƒ½º�‘þOºžnX{g0%&_'§™DTÂ�\”rD´¦ò~‘º²,$v„�I„³,�ÑÁ!Ь¶a¦�Òþ/œ¦~£ö�óv¾_ ÙX�]ЫíÖ¦«¯rx ê�¨2©]P`»/…8KËmŽáS}ifÙ×.DiOVÎцú€�¹4Û†%,‰©á©Öcšª æY[p&¢ŒŠ,„Yd+>È"Š…q:ª�r„·•Q²$@�çó'íZ®�º3çϽíÝ,ß7õŠl¸º+`¢È?dA–%‰OFm.¥íVù6/(fÍÄÄ�¶á’E³FDêóHH¯<�£é@†o<ŒWzü½èg[u§ËE”Mm³nf%Uh7fé\+k>•ÂØvk*É«¬2-Aßp"¥½BgY˜?7F-Wf#̽+£‘žåÞKbŽXééja‘šPê³-�²¬ªšorÌÏÔ‹9FØü*;WIk±ªµ*&$‚AnUÔÏĹFúy£=œ”dø¶GSš m‰Ã:bà=Û¢E#µ˜JIçn#õPA™–¾§º{6@±ìCï>gF|ÎïE‰`Ù@È¥¨¢­d‹¤šSדFã²Ü jx¦ªy&F÷lèo½eƒXƒ6±&R Ï™X®Åó4tt­µ¨žÌù°3Ÿ�Áý�Rïõ8‰_)nf3™éÝv†H'¹Ô@ñ+–Ëš1;ÎãwŒœIH- —ǽ™ÔŽRƒ¾]´²ú.b¡= :T‰u¢UKíö©w¸VÒj*4P>Ç{wT ;kgÂñŽÎÎfZ®Þù(ë`C”P¤õt¢–˜»¸Ã…le\ce¢2 &«“Ä:ÛwŠ…ú‹ê+¾L §*‰3>P.ãÞÓ›ÑB¿†¡@ëj+KMaK=vw³ÝèÍŒ¸hƒY˺y±O1ÒݱDT¤�Ë•Eiƺ Ê¢è%ëI„N E�;ʘ]³cFÌW°Á�¶^Û¢ˆGOO× ¤ÞDAYW;Ð\X’B¯ˆMCç ö‘A[óç½bg}L÷|Xfú¿�z®ÈˆkcêÂp•É}SD’p£§ÊÃ_ƒ­Zõƒo¹_Þþ�n¨¢:‘�èÉg„YÉ’he"ÍÄ?¾P³Nê$ÓNWãÃæXu[1Y4 ó9y£–­í)ýš²'͈ˆd •ôJ`Ê\ÚŽ�–r›!«…W. wi&¶jzÍ ¼·Q÷Sm†iþ4Õ^ÍÆîæ_ Ýeju”ylP5iVËdL8 –*•N‘¦A�oNƒ™Œå‹ûk—t?[N5ÈÔN¸¯õJ&xã"ˆ•J\sÇ™BÉ º€›k;õ«ú¯¶×æîüjlëB]ÖÆ!WR“�ˆ[œºÒd�5”±•3»¹ÙÜ(DcY¤S®&�URóêê¢àoš™)“„Ü<Éo0ƒ$œ_ëo3Y¹S)°ŠÁÜ'm®$xQ˜K+/)„oF êP¿Õuw^Kx6Ù,¶ Ѿû<ÕË‹YÏ'&P„Eßã NlÛŒtC#9‹sòií¼å^ï7̬�d*2Ðý¡ Ô},Vjæ%�úy3‚¥Q®¥‡þ."¥ÜÝ— ÿT„›™bZöêærGËY¥ø•AMñ¢rxh�ÜýQ{ºs&åÃŒ,‘w9›¨)æ#¹ ‹2„Í&�² !‘[“V‰¤®¨l[>¶ê·¿^΄~)�Ú¯¢,ñŸ"ÝËÕg „[ý´vygÞá­¿Át„/å#u˜"Ì–êY7]ÌTšõŃ!š†»•ZB‹è/ªdwÞiIY¿™OÄ׳-H²KjeL¡òƒ€E2HÕÃø¥ÁÖ(½¤k›ŠÊù'yN�7ÃA¬u•Syº¡ Rtã¿%Ÿ TjÍåQ) —™J“ü¨‰ø�©‘ÓR²A5TR™n¸ŒS$A*"u^êÖšz½rߡڤßè¨RªÐëZEÑèüºsD­Ëg@�DÈWSvñ")Ã…f;W§êDÔkØ$ +ß•cæ]\  j˜Z0òbáRRm~ÕA«O“—™L†õ=º"�™/†H³†r–,ý…DêT8?]q<î 3$©ü/³;«u(äž+©û ®~øõ¾�SêIE [•U‹5-ñ  VŽ˜�Ô‰‰\ˆÉ�®µËhW eL£§1¡‘¸•I¾\ãˆA[¢rö]Lí Š`Ÿ„MP’{ÜA”Ũžæ ¤‘pÃ\‡æ�f¿)žLio¶Ñ LHž;5JD�·œZ(,<†&-¨@ÐzÓŸß™ÎÎpnŒ´Ì`xq;Ž/ήò°@²!þNîjðH@™o'3áö{¬h¯ÉääxÈʉÒt ËæÝM#Lâu&ÐUsÜìCQ–Å4m¦é‹ˆƕ̵a«dUCÁ�Rµ¨kÛÔÆ�"!¢[At®*`ph,œ¨Ð(%3ùÖ äÚC³¨TÓ(B¥Ã&T»A؇Çb^ qs(à" „Gª5XqÓJxu G¯XÌ7kÕíüõeOèŒêf¶Rxóña÷Cï2õ~ÚèÈÅ »uŽ憎®UW¹%Që�äò#qÑx™ecVOÈÄ?ŸÂºœ-H•“ÕBȬ(ÔPykyåˆ';½Æ¶•Qº™!›=º©dË,ì°VéÉ�“¶µ6*n`%¶˜q¤QEa ¹ ’”¼š¹SCÚåÌ6”6õåÀH䦿 6aœ#Ú@„‚xD‚™d6[tòÄ´d®($À$„$pj"!8 "-Óƒ$AjRäÉÃA®Ü!3ÆËÄ–ÉÏn$™=BÁ�±%‚`œqC‚Óhନ®'ŽÿÓ¡6²D†Ad&†b2“(,ë ½$X\o´¸rQÁ1p dA  žÑC†‚’ÅXTÅ‘ ! œ¼Pû7‹R´ÖL�Ђ¢U Hš " ™Ò�À”¼F5`âr aªf`K€�";M„ /Ø�jdà†¸¢5„Κ �w @fËePM¦’ 2Q$áIm&Ëxô€˜EBXÁX’=™ ‘eQ@Çé N„‰£†¾D\�¡H$!}Ú ªãi ˆùQªF�@ˆH¶Jl†8!„Yì£#„ò\(Ià*1˜ J?’ó"­Û’pH X@�J+_Ò7)N`–¢8‚D†d6!úòà2„¢öà´J Âe>GðÑ$âAE$„T•)„‚ÒmÜB$œ ûä‘%Gâ !†Cˆb7˜ÄBISâ ŠÜ2~r‘Ná‚›$°Ã´ÃEÛ"”! °ÃII "¦4Äý¬6Hl…DY0Y‚TMÁCot… à¯Âæ—²�`†I y…©[‹˜â(‰N0ÚN D LN'Œ1$(`CI²‹�‚cótQ˜«’õ",™ ÔCR mC Ä,6E@}@�ˆ‹xöèâH%+LZŒ2 Ð<Ö¨L¡IÊÁÊ%#²†â„R_ côdÉ©ÂDö¼‰G�f E!Þâr�=J&ÐF– &ŠI6‘D0�ÛIƆ¥eS$0‘FÒ£WJ©ù ‹Dd@ødîêÉ ÈKA „gÚQ‰4VЖ Ãi¤¹”\,¢ÛÁ%HµmòUR "í¸ Áa´Iò‚Jä† ”b^P{6j0•CM°‚G;þ7t ÈK($ÐLöúˆ%ËêÓ™MÔš* EÞXŠOÊ“ú®e"�Ý9V+£ôUî«Ó!ÂÕîFf#õDÇë§U¢'«bëL2º�EQ1‰ìáAF“'u1Š“ûv{ª!2gÈ]ÑÀ Ê¤Iòœ‡1•2c)Åýò'rI YŸ’ ¥;ã�Â�Jñ¯’Ÿ_Š…ñ¼Û¬Ë¾.D²¾W›ò¸óòh祯jîi˜­R� Û[¨"—-ÊŠ£½JÈ{ˆixM7¹ÝÃ>_ã£'Ýæ6šù]µéëÎr)qóêÜUJ³sîl‹†ú�´ptFs1ÝO«ÏäX¯¹ˆt%�0·Ë¨‘$Ú¢ýPt”„ùLZ±2a:[’‹q¥Tµn¥Õ‚.ÊúÛu!¢5<&inÀ�–0j1šÓÖ<¡3X N¸•ÜÑb¡2ÕX–fC!µçãž²¾4ò‘d7Âúc¸ùC–O®Œæ¦ †Ü%Õ¨Æe€L�‘Òö¨¾[hп$)‰ˆ�fvåH¶%9ªhb·|Óí_¼¦54'UL¡qxƒü¹„¤Ñ™`K^VI<ŸEX>W9ÙöúÈ}u“XÅø¦ÇàUN— ÌÒ�s³åg/ÜeÐ" gÊ;öD£—˜e‚ŧºÎoq" r�Ʋ0;²ÉH§F`ø§$KwÜ+–æPFUÓ»˜boU\�Hük¥öM*JÕ†œEÔ´VOºÚ,eÆÑmHŽ´Óv%žWÈÕnÅOäJ;&(”ÔíèæÔ›–ˆÂ[w«gÎo;¥<ÉÖ�ºêC�×'�’ÈŒŽ¡ØÍ¾&^ 43.W—dFïOÝÂkw”dÑL�Ô},³–ÖÈ”›t’ÆùP³ H×ü×*�rGZ•Ö4#bä½ÿr ü{z½ÀÝÕ”hdÔŒ´Í=_v#£æ»fz;9ÎæªÙÛ¯ªŸfË@‹«ùCÖ)g¡LÏXs`Ä¿Œ0*ÁíLÖÒbꜘ҆eŽrH4{—Ö£½<Åe’;”KÆ‹Ã<’zç�ðÙʶ�L9q*'ß¼ºFjÓÊûáDYΞ&>MúÕÒ2$ƒ_¾ªbö””N¯‰¾ŽqF ¬uniY2¿ßáøH_Ìüÿb'ýŠgýuþìÖ†saÚs`—fë5.Æ�ÍÙµ {>Fl]¸2¼3.;šBÛSо¼â«cÎÇ\qàn娩­^uY¬ª°´¥œ;¨Þ`B[²rœã37;º­sØMƒW+*kgEuXdÖÚ+Ës¡»»Ñ0IÃ4+YÐ[‹øo3qû­¨—1”²Jø�ËugçWfÚ7º5öR5Ú)`¼Õ­ë)ÕZØ¥êšÇ*á‚UÝ„`9¯EB' {¨K¬"{cWw¡paxQÖ)Pŧ!ˆÎ)›�"·ºzî Ç3¹]6ò£J¹"4•èÎ:N‰�2N݆E+@ï…ï]̽ך‘oÖø]ØLàY-Ó»¿s€Ì•5Õç–b¡¹NTᢅI‘Þ\xlUØ¥äpéËÀxãn°dKj̇ §gaï U�mÇpª#3¼›š6Ì jÜ$®¼LæœôÎ�p] «¡!¡//®œ´�§™ÁYÚ3i¿nUrÍó%®î—6Ú4oÜ1E‡s;e=…Är•uj½v3/Nufš#³IÒ6UD9:—‚­¬´ÇnÜÙp×O‚kG\—¾¥ÒnŒÌÊǦÛ]ˆƒ� ö*w¹×·§À¤B^iÝ(œYºñYº·bUÌR•,,NPvØáG™Þì÷ °Vå'2kÌ+½MÕXÏqG¹¸‚ ƒI¡v¨_mgZXCÛ`ï1y 74og[èöß§�Mòž®©"#t™^Þxr×q¶ŠÙn±á”éO*Ø™åa±CµÎ̼ìK-Ρ†õßNÎ<ÇJ0©è+Žî‹Ê(g=ÝØ2˜N Û=�)2®[Ëí:ª�Ô³V7–^Lv]i(j½c†äÃó«º&`êu3Z)ªf÷6¶˜Ûw¥›/�T²I½í8¨sºv 3�ˆrøìtMÞnŒ‡„(ºCnÐJŸGm‚*¼UÒ±sC^/P¨{�tñ�IÇ=˜ Ð3ƒÚØ ëo¯{ "Lök›V5ÙäÊê;ÛÏe9Õ¬X8Ñ›µhäªÀ:q¢¦ÔÝ#–yÜ=a‘‡/]| ¹¹[u]óä¾ÏœÁã‘æ2;ªÌ·/7œíÞéÛž>vï{ÐDT•%¢#b‹‚’1“DAfEŒX,[µ# 2!´Xɱ�ÌÑFÅ$k Q¢£Q¶�bÁb±FÄQRT[¬hÚM±±£D• €ÌÁ�F$ƒ�FÆ,TFÆ4™5@X±1ª1˜iRÄ4h ¨)1BZM6"¦b’4XkˆÐQb¨Ù"Å Ú”Ô*-¤Ú5mÁE¨ˆØ,!ˆÔdÚI™4Fˆ¢4¬H“*),Z’Ñ)dÉÄi 1˜Æ6-„ÁQl ,, e”±RQ&±´‰"A¢I(£Q’‹"cLÁ¨´[Eƒ FQM*dšÉ±¨‚P"@Ä%Ô’Fآƀ‚ Æ’FÈI�!EˆÉ ”,‘�¦D")1&Â2ÈcbS$JT’2Š2š¢1‹F$²I £d %ƒK"64Lƒ&„P¢6(”„�cb¨¢Ó$Æ5Í3B+(%•6˜h4Šb(£`Â`Á“  @mi‚šJ i„d£!Pc –(ÒEbÌKTÈ´U3X� #Ьi"f4ÌF И¢Ø ¦,’VFXÄ’ &(¤ÈɬldÉcF5$dd¦–’´Q ±3%))Œ‚P– ˜¢E¦ bÌ M‹AA"Be5˜hØ,ŠÆ"KbÆÄh¤Œe0”–#%£$¦ˆ X"-’LTRE%A(ŒL1FÆ@Ò ¨É¢"kb#d ¤Ø X”‘B[‘¢m3Q‰–M’š‚‰E#i D£Ñ„ ”ØØ¨Œi4˜(,%%&ÆÉ©&i "’$4 b3M2ÁI†cA 4 A li 30HÌ‘ ™¤�LÔ„ `BL) P‹h$!„¦È€Ð¤Á� ›I0Df%„QI˜fe!‘ ´c31&D¦XˆDÑcdÑ&À&DÂfd¢ÈˆB�4ÂL,ÂÂ0$4Êc#D ‘%( 0Èa6#E&)2€¤dc)1�DŠQš"bHÐa„f(1"D™)¡¦„”ÐXDQ$l  ‰ÁŒÑdQ…¤B3( ˜h ÈÌŠCQ†&Ä¡2#& Ħ”Æd ÓHÊQ°PR@a(ÔH˜d # ) “QdÙ2(4”b!(1 #%4Œ›H*Š ÑQªMhÛ6ÐÍm„ £@lš‹b²m�bÄhª1bÆ1µб&�i1µIEd(Él+Elh¨Š¢�£hŒk%Ô$EF´Y*Òb) bØLm3kEcBi** EѨضÅdFQhÐšŠ”B£lI„ÚˆÚ ¢°E�±cQ¶KQQlbÅ¢Ábµ£3 &,E¬h´”kQQj6KIEHVLi6Ñl$–‹ˆ+Q¨´QhÛmŠ*(´T›F4kbÔ–6«FÆÙ#hÖ�¢¨ÅEZ1µÑcQ£Vf± ÷‰›$n`7bÔA¢ÉXvêÄ^àCtÈÊnž÷·beœº“ÀræÜ•Šy„o UY–vÇV�ÎÔȕÇwË<±3G´m^º²ižØ�|"¾TºÁ#+]Ö_§,»º’ÉŒ›÷Í•ÛêZR÷d©�”ªÑð·š{$xŠ> òï:,ãW]Ub¹áMö‰7•Xªê9&:îã�†�éÌîicYªý¹ƒ&KëCjí:ù„�Þ�‹.UÔ‹eî‚Ï]»5«ÔÕÇ6>áo*ûF+7‹€·ëN…AvIh1‚`1:ÇŠ¹]„Î Íçº}­±I¡¶Q±rû…ffê!Ñ…ò˜q¸j¬mP꾿gZ¼Þ¹Æ©N5]‹¡ÝÅDŸ.ºÄ P“, H åíÉ´ª»:“«¬‹ŽhNùÈ.θc½ï<(bÌ¡,Þuè¼À«`µÜN¹x6ø$–×a­L‹³¾¥ÒJ|º³¡Y‚&™Ï­Vª9‘Vv�¸ý¡¯zòeSCPÃ} Œ¢±qÖø]^5ˆ ëÑîÊÇÚ´kê'fÞ±K$ìC+F½À¥š¶ÅmG'f‘Îè-ÈìÜÎ}´èPy�ŽÍÝÁË�, ø¡r»ÎS(âYìs³.Æò!¨A^—tqæßµs7¶u».Œ»�š÷ŒC&Vä+—Y<«so4åå ç[yFI;¢Î0ÎÓ•Bïîê)všœ5Vƒ°eéçmÞájéQÓ.„¬Êì¦lÊCÁSeE¢ùAj½•w /H¶ÚJ‚b‡<»á—o½žÝ±·˜3\Q×@zpÃ;Ù½£•÷,ºàiŒu™0 ­ËX„t5rƆ±»åÞËĘºö•w¸F«+2r"Þ®ÓŽ±ÕóãèloSÀiKåíÊ£Úk®®%j÷¹ß1œ7즔ɾ`P Šmß1ÛéXÀº‘Î@;”vcˆH�Àã�Ù­BÝP§-s­À/X»tºŸÝÇ8Â$˜;ƒóYAâÔKÑBÅw\íÙ˜ïÁÄëÛ‚»t pÊ6‡Q¸�Џl+¸#Nš­Wx©Um¯êžK×s¿fÊ>Ÿæžtܾÿ²ûäÞv#B�¸Ø³„Ô2ÛñÞ…½£³ýS ãtA¡|nÌòñÖÞ;RT7ƧόA}uþލ8ožÝüC?éJ<•ÿøÀÀ|!ú E¸Õ�ò <›¶ëÖþ¾~óÚY™ï·H²û�ü˽?ätÝPv}AQwrkjêTrÆ[dx_ÈKr/ Œà‘X?ßõxÓwå·¹™’­—hž&4ï0¯>‡ø¿#Fð¼:ŠÏ?у«ÞBÔU÷*¥NÛà×E¶µ¿Åù—Ê!.<6­™ùNÒõZÝÃÑ~gãÚUÇ®Îu;�Ý¢k®ö¶G+Æ‚¾Mï•rÙŽN˜w„¯Þ±ºì¼ùÔ¦ì·<Ò®Æ%•ÿû©¼S¬¦ÇHtäœOžb7^]ù›¿æôü÷VׯìýûäåéÑæÖÜêâÜÃ×m:*»Èüþw9-º ï×óä_ô»ªCSÞO-ðGàGž7Žãu…/4(õghÂt®ñ�þÝÖê]³Õ Rë…à¶7™µsŠ_ÝÛ0PÞFM;¶~¢ ™ã,8©´�H÷&‘-ZÞäé/b§þÁC.eŠ  0(ˆq ¹ p]ðŠ¤ `Gë­Ø.éòd*Á-û@$žonß´ÈžñoËÏÝ#¡MbI}u™í{HÈt"Gõ3HŸ¼©ZÚuëauBð!Oa�unK*�¯`˜d"!¸¨RP¤”ü !tB{rËŸç*n|o‚•¦óé�—5Ìè÷œ'©œj¬&ˆ¯ö$ª®n(>€•&i,~dr0# °‘™>H‘åB²ˆJR¢ ÆU+Cò@—�$„ VÑy8bˆ¼Ú qÞ‡�R«Í«AÈþIB´z Ú¥©‡ä€\*U+ÈÛm°�›q ŽˆèèUY, Ž뜓͠kJl÷p ãÓÑýçhÿ>Ìüñrð‰±Ë�“oTh"ê¥ITŒ*U" ÅdC4ÿQ­n± r(Vâ–˜å$Ô(DÀœû! d!! �r;H6Ii”8(ô¢!yÀµ$«'ˆ­c&0˜Þý&å#�š0âb¬J�Õ ªêÕº•¼¤­RíTU& ”öÑÈO†ÆÛl @I@¹O(XˆOÎ"HE ¥MÙë±Ul{EªS‹1£4Ó¬éÀÛ8ÂD ÍÒÖcmèHZѽ(s'R©",%!3:‹À$„ [Nßé†éü’+IÚ™Z måÿ±!! ýäd®™È4ÉDr ª•�›3e)XèÀþ’Ë Öf9 ˆÉ%D¬·±–qDúÒ$ÁÌ» �hlN>!ut~xÀÞšNrÍ9`®ãe úâŠÂpM�†²lîý£;ª\¸¹7S2DÔ�¬Ê ä‘:ÙP)@ ,ïïë§=-r?ƒ™¿D-Í ÆNÿ�ÏõK‹zy¬%:–NeÛ"ù6×#3›NÅnG"ê…e BÌ5t„šL|‘ÞÂ@$¸jÄñdH%$"l1#å'FmY}Pev93íiK°T¦†‰k6 ÑLè,é’8Ù[Å¿¢Ý1±$WKk° æ  –†ô»ƒlÂvü¶ÒCbüiWB@Å®\~kè€Hy�OFoªö!éä>'› ÇŠv½¥ì?ì'}“ý�ü�ùw/®ç�Ås‰ç�ù$YñÄøæ0–MÆÜÉ׌zÞ]¤{rVü=†j��¤RÅúè:^ûüçU±�BXëó+p‰cg[uçÖý–@™ œÝì3øï-¯¿�Ía‘Ù¨j„ ÌÿϽ ��âþ8û*þÑ=3Qï·çŸÌzðu‡+/¤ñçíÏ]^ºÃnýSw}ýG·;Wz¾þu½Ü?¾ÃžþÝêÞd»{~ê~Ãs'åo™Ë¹tŸé¡ =ûyH~,¿¼~rÜÇ0¯Ò|ȵý?KÔô1Œ` ˆ¦´ÎRüoº³O—®ù£7„jÍ5˜.ôÊð°“µ^6FQò.þn²m%—ÿ±Åqo¯ØÞß?f´@¸ê¥ïãlÑË8XýÌ„4WÄú;S“Mš=�Ž\ù‰Gæ¾qÏ®l@7Í:té6ÙTü>‰]¾,‰þ_n)}�Dgž¹·Ý�âìÁ÷ëý!ý·ÇþþÎÖë>©Ÿõ¿q�¢Ü‰Ï?W±rsUèôÎæêÁÿ9Ýoa¢]õÛ¿1ó4ý-´¿·øØ{ïß±¿�Ý&þ¿©÷¨‡SJ·¼ŸŽpù®Ú“|Àq½+Z[·î£Ô­ÜøÀÍÆÓýwÄ¥¤ÙÕ:'Šù§ç¿€�l»îîÔ4ì7ŸÅí%þu¾¶}¸îÿ–ñ$÷ÜG³¾Sû„yyñß ž6Gä­ãô=u?0û!­·ïtjÌ 3ÆîÝâ^ºj¥Ø½|Ó×A;çÔâÝWÇ®é6ùï�Òç÷ßi'nþc_x²›ŒI®ØäÖJÃaºñ}ûÉùó꾡•‹Šv´c¹ _“�Õ*Q¶š™µšî�h[V굄ˆ/†9üÅw÷ü9Ôï×]|;^T�I´š"{8TFÍ8(�Q1Ê0)(FÁ‘@³oÍŒMÄS•‹)@˜êU�¶ä”‰�@Šð3“(¦ñD²@s?ØëþBôX!oùöº»\Qˆ>ѦÐBOX“IÆ ÈC) ZÀÄ`¬ò&‡Œs½Æ0+é ¿?±d#6œ:Œ°AA43ÊÊÆ<òÐ,¡9Ðz±­áŠÒh+EªšRYºØ�4&ÄÓ„±¶ IyDÝØ ˆ‚rw¢èDðcŒ|:ÕyX@úD©¨qÍcííʽç_º€¤ˆˆ‘hÌFÇ-4p¬Ó ±P]�Mîobs_ÏßÎŽ^¦=+œ²Î=ák_R v:…XMjB[*G»‡¤%a×)9@$„ Qæ.È=ý�‘è€'Wä«@…Üòì¼/.23RÃÄì:BŒ<ÖäÊå½r¡oåK[)�O¾±¢v83?·¥>,Ý›ŕ¹Ñ *^ ͺ9v@�$!žï§óËãíŸlû ’ôô³ÿÕêÿŸ?âW3ÿšÿ³·í$_Šï¾ËÄ77[Ôó­Í¿ÝAþû©Cï´pÖ¨üM©šþy÷Üù„íÕõbÛ]úwP¿½åû�£×·Â¤çC}Ü\w¦¡Û�~mû÷t2ä�e|—C�D¾Z»èœ!ËÒ¨�͉ý÷øáä½Bï…{%D&�ß¶ÿ$ÏÊÂß¹�¾½TVœÐ™#X÷Ç® ¿ë_Oi‹´{þ@$Zœ~s)ë«;ó¼“y�íÐwõa>Ìò¿£ŸÝÙïØ)»Æ±š–j³Ô×Q´šúŸ:6Ëf×?°üŒýß”t^±}pì«~r”ðœ‡}C»;¿ã).ù€oî3~kì¯|j~°æ­½6Æ^qŸ:Áxè8Ö’DÚ�ÃËÞ³µxÕ{ŠŸžŒlìæ€¶&hO™ 5bTPŠŒ ß7ëE�Ö S h¨[®f•¡XÒ(2`’|MÂ\^ËŽôÅ‹XšQ‘3–,R¿qJ5‹ÏÍì±”°—õs.E�­Á��Ð`ŒУåEÆ5�e©ü+âT¨ØñLV-ù÷𖆮ÛÕñš“HP°�Ìà Žâ’@R�Ñ(0¨S xÁ„¡•cÄ›Äa�Ò‘Th]¦ƒO U"3ý©¶†äÅTÚ 4k"£æŒ 勜¨Î¥D©v¡”)“%‘~¼.Š–>ófb~)Ý‹J¨´ëAÑÁ:Åt¢aFÍQ�–,Z[‹îrÁ5Õ’&Ío™ägª À¨ÐI@¶ÓûYqýÏE„�¢‚rŒvßôÀàx‚ÅÏ%Ãx$ @Ó`Ñ QfÆ]�6ªœ¶J�Êñ¢TGž½ùsxÏð«1çŒ&M ¥]å9ZZrÒˆ±²Vg HÍD+–[4¢” 1ƒWaP»B«ZY@šìê¡eÖñø¹#A„!åÿ"ßóA‘HxÕ¤Dm?Ü)Ï ½ªæ· 4hõ•IMŒF8›ðÇ%YT,P ¬ ‘XTK ¥O'vòB“lù[M>õ>~°IŒ‰|¯LËetDz8Vi:JÈ^K4ù%icz*O�²Wm�²Uª¨“Èû’q8'órlúQ,£HãF�p&Ë‘*�ÆÚ“0 !©.Q¦Ý‹%¨Z„E."dÜ r¬óÄQKh�¨$„ [žn¾p ¾Ç�|ÑíC½ :ÉÆUž–[’%¥Â^´¼(VÄ')}øùÚê´¿1”pÓë‘̸K3}ndê’©¯D|H„‚W[±Ù]*ªûšªY…Ud®ÅË>Á 7ú(XäÜ€}y $!Ÿ_P÷ŸÞ]öøä|ÿ4qÒ=à s¢&iß0N!ò¶meφǕ‹iy«ò!@ä $ç4üÇÉg�Ê@y8&@ô}Ù¸†Ã_+ùÎ|soOh%»útâáëB�h)9y›ëœ†£iÌ¢äÒÅ•Ÿ4|qµ‚CQ•JÄ»CÏÞ4æóT}¾ÃTÜ WÝaü{^zBîWáêšOß¾}Ú²-Áyõö=;·XÉv)yß™¾JüªxÕø«u1/g-.ÅÅΪ? jøPBF{ùé6>~‡ÓÞß{.öñ«ŒÂâ‘Ç„h°é€¾Zž_ìÒ)}î3ë®(þ|t”õ àbP\üæCƒøœ¿íMÓÁìïpNuºöß×ÛÞZß#z—”œxh¿âK¼ºíÎ%îÅý™ö„¥0ÛGÎ/Ó'â#Ô#$´ Îê!Ž‹ŽVµ)ºßÅå}7�¿‰Úyà­·ëUöýÝ(b>÷¬F‡®ï{¼£ºF—Ü»­:PèÄ~¯¿ŸÕ¯Ÿ«>KËûf÷—é�üW�û¸—Õù2xøÚE±Ã\†<¢¿Ù¼û½žÜ">ýlÛÜÅÛÌr�óÓ‚9JD›c<ê;„ÄBg| »4MÇsŠ�m–Cˆmo<V§ãè½]YÖ˜©â8ð^^Ôå ‡©ÇÏÞ(g\JÕw:LCˆü|z…™ô¢Ù5)†RÓyK]“nwש3Ÿ«ë÷ž}üQãûo×ï¿ßYC¿Ê_os™~ÍÄ¿pö¿°øë ¢�sVöï®lш'šUûëëen%*�ØS1üýk›dÛ\Üwßa¿,Å@ò-(7ù½Ç3ÚYbÑ=·ÛšÝvýndù¬5~¼ öîöm_Öø$­D”Y|{>ªFèþzìÕí¹Qb�wÅ?²eû÷ÄGL¾d凟½ råå6¨TåèÊð†4RÕ:ш„q@mĈÀ,1À£GX‡AM°ÚÇÁsOSO¨<ýo• b�;O¡óÖ9e~.k½1Ô©ëó’ö33—óÐ$¿ÃMƒö[.M¦â @5ËàõB©�¹–À(FulÈ Š®œÓ÷±J³8�ò­÷ƒ£×_ÉÏ@¡õ²n‘0Æ ä»3kœsE …«¿l›%âá‹«ç(hÝ¥ é#”+¬.¨ÎÃ×^0ü¶ê°zÖȽ�7òS!�ä‡r¶ zŠÜŠì¡¾.�ÌpÞ�}5G .† Î"$¡ª”í¥#f4ÁÜ£cvU #¡Æ±®´‚&/+³Z[XÃûfM­Å“m'|¡hÄäqaL"Áе„�!¡‰À¯# »“ÿQžL· :8ÿ¡\œ\™.Ì4úõµkŸT3R¨ˆ] Òªi@Ípšž ØX(†¤˜R1düæ�Ô!! Æ×UŒaª³Jýûú`¥«�¼âÖ©­s ¬W¤�îi#dïÍ,C\DÙQ¨q)¡v”xÂ+M< —˜¢¨Ÿ¶ 3ó–[S”dë>—Éæ>¢eÎë)ŽÉ# ±C6fÄ ÜjL ¢£K±�B3¡ º�•Ô €lg‹I‡ˆ·½$"OD’‰�9�ÚŠlƒ*Ì^iÛH�(£MÞ½åUµ{�A�w`QŸ¡Lõéõ¼ú®Ëe‹tg츢ÇñA¹S-½Î}]›×º�thx÷f¦B:mLbhÙ,•EV]›dHC>"¾à’�0I@®�Ð$|G Í¡}íNrËz{#Ò*=÷9%°©›³v6×M þ H�Éo2kRÉê 1˜r¥–ð·*,›f^½¼›kžu{2¼zª3BRºÁN@2/ªª°ÑYÄ„ªÄŽ~R¢EdΜß3f)õHòñïHûðm§3Ù÷ô¦ñ—ú?îKm7®ßÒ¸<…íÜHd�ªïþ‚ãé?îëÇ �÷ßo§#¾~.ß»·6*MÆn¬2ë4ã›qóï~ý¸«¨ûïa§íÌã÷H©a 6—ííö—FŸÖM’±�'Ÿí¸m¾Âß‘kÎpqŽ`¶üMuŽƒÇ‹Zÿ�ýN®³jnö¿Ûm°Ëµ ¿wE"ûÖ7"�‹B8D×e0t•8Oe¨ý·„¯&¢ØvÄÕ„15‚õèR³ïs„úhŸÂ´¹÷¾ýxþà'^ÞÞÚ“ª£òÖþ®×LÑIÊÛèJæØÝ9�E?¨ï²‡ï㦬ýãÅmR÷¤ñÙNõuk¢‹øjªÏ ½×ÛÏó‹züñÄne·Ä‚g+Šõ=·Ðm^_Ú}_ãgž€tyLðþíþ]”§fÎP®£G¬ùHÕéÕ¶õSµnæâ»æSÏõ&þa(}m/qžú»5>W†ßN û×Ï¿žw.ÝGš­Å_Àûçû]›ÅoÈx6޽H}NÕ1·Ÿ?´àfù‹ÿ.>4þqã� â!x£;qÛtéöÖ�ÏØ­Ýõú iVÛicï‹°‹Ö‹ÉÛzWCvµ©ö‘³4ß–òT‡“®ÿRïïÍÆ}hûwoOº\ÎÞG)>ϧ†Y羜¥·oÉá®Ø†?º²•~ð͹ýx¬P°<ÒýŸÌ_ï¼ Áx�0ž•˜ñïÏ¿^á"ß.Gu(xµ}Î8WÈùðá‚Rõû¼=ÿkóŸ3Ù¾=Ül1v¦ÖZ騮Q±6SúþqD¯µ?¿¹Õ­á?‹¼)lˆ3íQYÚOsÜòyË•¬2ùuAMÁ°Ø÷AÚM‰66†Ñ5 qÏÔi �E@:�,(%ˆ'OàUÉ1Éh¶„üþ_Øêïyd›Òrb@ШÂðørP<4ª4›àbQÎñ xDNŠfïßèœjº¨iÅ×ê/"ÊÀÀ-Г¡‰b®ŠÈSGbU‘Z*M\© µ`�>¯®D'ΰ9‚O¸U§H¾µ×zÅ5€ñ–s²Â_Õºi>Ì!#dÀ�Õ« 4ËȼHߣ š»VšDÚìÍž™c:G8=OÈœ”V®"hëHˆ!Zµ’˜ìÔvHøµ(õ­Œþádr­ÖÇ»Úo Ã?6^s�ñ8í´žûkŠR JÓ¨ã68�ŠÇ@¥ÐhvU!¹C†7•5bh"F�g›åµëü䛽Kw9e/×?ÙÕÕæ°�Ñ4P«F‘u$WG¨$„ LTeÀ $Ä‹ø5©v¨ÛŽ�¹DÐ> "’ˆ˜ /¥þ&ÆÈ3ü{s’<ü@ƒa`!%d!As%$YìÌRÉüÆÜk]1n^P¾2Ç猩g”E´‚¯~mtÅRÆä‘¨M “244 �ߘÂf¡C©8"BZ CPdäê¥4W;FŒø˜¸q£³_fصê¯x­nüLn¯v˜Ò�–HPÛLÜ"¶C1AP”ƒµË• <ÒB¸VŠö”K'6áH‚é‘ ` `] ¨‹¡ $!çª>ªá, »„ÊŸˆÒVg·Àª6’mŒG¨BIwafa�Ré(5ô<\T5Ú«{*F9H|�Òhþ+;fO–,Q„#6+8òì„$$Ê?ü«BÞ½4èÇKÖÔ�Dp ËÛÔ$ýãp-‹£â”>Üo¿˜Ä<@oçß8"§å,K.1½&ôqvH:–ïù­çxXG½)ÄØüËý�¶ô/àîßÚÝ�‘sBsX(ô_.zµÜŽF‘v‹CvÑôV~UyQˆ>^Õ°!ô™-zqÎ'ßÀóÏó»H¤2bEBlØóôû9ïØó"ñõ%,uÎ(Â#+öÄ]Ì"„žwüÿ4KLJÆŒu¸B‘²Ÿ–F‰vçóñÜl#Ìbü¶ÜÛ>T±âÛp%uý–?Ðu¼Oï­WdO^µåyx÷-¢ { µQ­•ý'e‚�¶Æ|x)¦ôÿ}ZÁÉç‹÷õ¹ÐûjWÙž4øÍä- ç®Ù �%ixücfläÄùèúm_çSCÿW·EÆ·Ÿ`êþ/Ëqëç·A¾)‰w߯“á;×ïq&ü¯;yéµ*c;[M o8=v*õÚ>K—w>|Ûâùããc™‡§´Oscü.ºøy�0Ÿïà™N#¢Á¼ëáÏ€ÞŸ_™ÁÅ*C-n|¥|P7×Í4fO;p‡ƒ?¨Ä–Á«^Ý„ç«vÛÏÜñWñÉcÚ¡Sdtïϸ õèkµoÎiËiÚòbgã틼Æ^]ïÖ©á­]J�üٲ߲ŖH¹:ÞxûÕåêçRœi  ƒpšdv+y°ˆXøpçÄýªËF�«¯ üÛÈÅKõ ßIñ2@w hpSÔRM~ÐÅ�´í-™‰D¬(š¦\�Š!“ hÆÊ²¥ÕÓ$ÃTMíT¨¨« @¬Å$DSNÕùŸz»›ÏŒb¦­J›Ö�×{Ü®ö*Â6qÅ-Åo`º*,½” ²•l˜M¨ZÍ� B{0•:´}äü·'J¼ïMd}b)mã—¸ŠÊ08\h¦G:‰ Éhˈ‘Üì(¡ r„¹X…uØ �\ “‚ÀDBøL$C$ÞW%•t§gGvZÄp3¿ò“ZÂŒ¦�U­-KRÜÂõiÛžŒˆcEʈ€5RÆÙ»‡[©P‘Ì’�P*¤4¼ÙG²}ô�M£ª­ÎtŠD|fžHªÿžE¯8ÿ2m`dvQz�î:(4œiÜA“E6Q–\Ž’*/dP§+—D`Y É<ÞLt¡’eX!M8Ò_ÔS¤µó+•ãmÒê;äYS´¨žþ¼‹”z!à¢<pàv‹½+oGÉ+ƒm)«vh¢¼X†Þs{€-«\ Œ�ÿèÑBÍÊ´t!’ „„w½_èI”1ÿ,÷r«Á“µˆ¶.…í Z,«Rõ.ž 6ój…ŽXt©·G_‰ÒµÉýÐ’•­^,ž$úï?’ Ú=&űRî Øù ß¹›Iï26è1„04¹bÍÄ«í¯Ét˜€l�ü’µ‘SFÉß½Ý׳Kè„¡ûI+ƒ­ (Ï]Ùfr“3µ …"à~š#ž|<÷*áÄ$G <7Qbs„Õ\U|®UIIènø8ÄT AÑ8 ô.w¸w*òd#_ü賂°ÿ’0ˆ½v£eÙ,b*mó¬ÒUÁ@|�Ti–ä¨Є„ƒ9³áÜ¢m®›OÌw·Ø áÚcå$4 ¤ƒÒ‚D0ï ê*çÕAåœÖ�‹}£äPÓ Ð!ŒÒLhm$“ˆFPŠ2è9˜±Ç¯Í´*Zß ²Å)ÐB/O¿\�O?’�ƒØéLÿ~ �³mó-º~ñRï¾pÖɶô÷¶sù ¯uÞ4pw&]ÝÎÉÝ¢1OÐn÷íüæü÷û=œQÓZGê¥O’˸ïXîV_•jðø6ôX¯åLªöfæ¸süT�óÓÉÝlë˜ä¹ë ùû—‡é’—7×Þvo¶úýÏG+^^úìϾè ;U§Ò¼W�¿¶XÐáÑÓ·o®ä{ÜvøÜZ~¿>sËëµöº9BÏœF’þûNãSïñQÞ’w}ú*zù;}—¬C” …©³g×ÎeiB¿häð^aev7z—oÚÏsäüDÿ8Xõ;~…3ãøéß&=ˆù[IkËfû*ÊÝ ççŽwZAëølyœzâ²£{2"-ùŸwcq‹MÚçïËÍòÜè®—~:JyLh\�·zÒ¾îÉØk³_ßzú¬E$5iCÙ¤¥ºü‡g:GÆ?1Ý8?g©6•Ù(ì_jçÙCÐȈ[wÒøükã_‹½"Øë]-…Å!¹ùE‰×æðŽçÔãâ<ñ�\ö÷Î8ë–sˆ»gz{Æý¥ßhDqп®ôí.ñ…¥2*E"O¡Ž¬aÊq4'ˆTþO–?É9ŸùHÔå/ò„\Ïy ±ÕûI¤"ÂfIy°7È É „hÄ1`+ §Y¢çG–‘ÌŸNܱ›�ׯŸQ�)œÚ¶æ�†›GA‡ Y̶‘åóêŒ §Æœ¯3¤XÕ×B==؇—¾`v‡… !Ú-(ãã)½]r¦÷ζ�9�X£ÍÙÿ7 4²=¤à23„‹¯ÈF0á*î#&Š·T¤äs‘4•‹�Îÿ¦½Î‹Ö�á ¨ÎfDÆý�$”l4y¼a c äã¸X/À´d!H'’»M£Ä¸(OT²oŸ�Üüpyìߟõ&ºÿÏ5¨m`Ròy^à —LÍg»UäÉ¡I'�ª~¿Ç¼ëW©§8ìÖ^¯5®¬Ñú°scPz§Ã±N9~.hèCÍ­´z(•;.L¹¡Z�$Â5¹/óyÏ×)ÕÆXŽ‘ãŒÆ¸+$gš…7°„øÌ¨ÆH‰i ýLr5ȳ冕=Éu‰EÃ&„8µ[ƒË„Ž€Á$!­¯yýƒžÖÖ)ó®6{iŒð[ŒW 3"ÌíHá›-s«Ó=±z¯�s$†Š™åD¹47»uAƪŠUív ³ˆd1³�Eô÷¥çÖ�*¼i·¶pKv©±8 àp8… J`\�ㄸ-CTcºˆ£ÊƒTÓ“‰tŠ37ÖO­q=òš¶bÓ,Ê/ëkÛ\Š©d8E�‡  Ü�¹ œ¨˜t\`’�fŽ�Š�Ÿ0JhTwjK`bÕª4p!¤1úúÂTTa ÀÐé“MÀÚ9¨ÒY ]_t ¦$u‚_4 ‰�–ÍšWkœ»´Ó^”òk«Ë³ÙU¾å�ÚæÜÚK74¼ySyÜ«•+Ö(°€1EPeY�€ÀÁ’Ó�¡¨nùu©UQg#c‡JËD¨>b¥.`’�}SÏÒoõoM½}­íZv�m�OëîÚÎÄ*_&IV{nn¾\:íü–óÚ øØ÷nwN6ÆþÈ~Ím©.Ò¯ÉË3ù.Í¦Š”7¨NÒœ=•Œ¶®q¹bñýœ?Œ•`Ÿ?yõŒh¢#mñ°ýlãdþì,Þ´x{û Zè5MßÙ“ûÐ÷ïÕ¯ÔøÎãr³m¿§~?ç:cŽ^<@zag·´„ï/wÌ6ûÔúlxB›õã!Y»„¸—§®õeb¿òTVò\v.�ÛÅ<ò'ÔËóÛ·'Îͳ»:ÞϘÄl}rï$šÛ�»´}zC×·Z8§osz{¦RŽ8dK�0‘Beã=únÉÚu—Ö8 ¯RÏTûôæý‰[ßœå…â’Ú žðôdkÛ�bYa Ešn?ŽŸ.#V/¡¡-£-Ž~ví"BBAì[Lv®»eY“¨ÌZ÷¥/vâÍS'lt¾TÄ,“¸ÆdWcÇW^¢³Á�¨�Í�6P:€:Ÿüe–v¤dðo�:W™kãºOR‹îN*º�˜îã%%/J°Óân „¨™ @Þ†’µ¦®m‚ŽqœÈ86‰B‰'â¾­£æ¾ðb†íùXÁ!JmWÏ—­äEm‚‰D6Qþ͘¢àÅç_î[·ç¢£ü2  ÚäqÌ»¦ÚÂ�Ù5ê>_´»Ø�ãVЭý.¼ííþúºÞ¿¿T§½P“áò~ Ÿ¶ÍÛåG£ßàî£4t%�õ!´–¢iJ$‰eE¥¬(X™o.KÀÀ½œà³›LÀH�÷L•Ö“X1i±S¦z\ÐMM[C8˜ˆ;;ž{±�·àg¢³ T6»§kÝB«Öbºa…mûñ¡òì§ 5jÑñ­ZTWl-IŸ×?µâ�ܲ¸¥¦Ý]WŸííz”vŽ…¢þ1@P'a¢ð¢¡ ï¢ÍëjZ•eœ–ÄØŠ|:R–ÄÅ8aÖÐ+·‘®øvSm´¶™Zý’7KΪ= 4�†ØŒMÃB¤ P-rä‰ ýŸ1  ÒAø†ÀtÒT/ÐH¿+e–‘³SF‚–šY6chmƒ` ¦*”ü;ÖïBËÑ Y�<²V©qDnXŸ”¸*_ܯ € )ªÉ4²bC`RH—†¾àótðš­™¿Ñ3ûí ‚þ‡rw·„ñ*hóžd‡‹|þ£o·mKÎ>'|B>˲lÛÚrí¶à4¬Oå=É“1Š|!þˆQø uîr-òmþ ·«›žõ¥}“øSHž-̬®4¤u@'÷âQ�,¤äË©HúW’€ä0{' 1ïðÓŸs—è›ÞÒc7�«òNcÎQ5dµYoüë›ɤ€œP¶üD>~¢/®1™rÿîô¶AÖ^|N\Fþßð©C�å¼dWÏêZÑã2ýçñ[ì�7±f¡ËÆ;ÏŸŸµ”À¡Ÿ´¢üOéôÏøŸ>òQP—&�ÔVA§ˆýh¿ìy`…òƒYËÙÓ?²ðŸºï¶ïq­>ãÃGrãrK 3½üvïžš%ØŸ«»°¼¿I ÷\$)N:íH;›" Ý·¯Cï¥_3Þ·¦›ÚÐáß./ÎVg¹W¯t� oÇo¿Š=O÷¼¡ÊZÝ}7ä¶{^Ý�¢ôül[Ÿ¥÷”l\Z›mNü{†¶Xxëjì?˜ûˆ?»È¹è¿¿©H�wük»Áé dÑÀ¿ãõòÊiEöû{¦ç·�ºã»Y_ùOìZûµñý¦·×Ø5±öùR™ójr<.m_È[Ÿ`ßž-°‡8ù…‰b~öLûwõ¶í_5¯ºË®£Ï€ÕÜP[IP­Óy¤ÐgÇ­)UZÉ@šAìAÐË'ßR‰±TžNø#»Ú�ýkޤÄz_wÁíF9å6© FT‡5�®SgAà­ôݦãQ°cE£ÛD”ÀùŒpŽijÖ ‡~±“5}zÅù„W”'c9F…ì¹4P.ÁRÇj’¸QsâØ›0?hˆ–æìQ{'#D\`]‹ŸKÖÙÆ%ãTP&R¡0º¢Ì!ˆ¦t! 5ܵûS»NT½ELÝ5HÍ4ÌwIŠÍÌ@Æ1¦6sĤ™çЮæT¤r‚Õ˜§Ã•8€F"aB`íþÙ¯õPXáIP«QbÏôëéÅ�LùÀª 1Qhª¼²8‰',"V±D92†Ó\qŽ$gÿ0älH�Ä, pÆ�% óÈŽÍ*¤×’I‹ºñ^2Å3ª‹Ö碷r‘_å¥ÒHÞš˜A’ѳÚ6Ë6=”¶e²HÉñÝ@ôHïé±£zœXÎ]¢³Æ/C†­¾dúì*¾4×:là ¶$†uº-jõÕCš˜ ¿ºþ½ÖF¯‘gèÚºÿšëˆjÂWÍ�Èå!77«›ßKÓ¹•vFvv ìœ î»ðGÚô‘CÄAK…`‚€J½�%F�t·’% v_`w÷çßÇ9òTž¯Ì�K·—r�)x×_†3˜xL“¢~â?¥7­sqa†ó×NùëÞ„†î¥Ç¾!{òósu«×xNm1ëÔ­³¡s©œ_xë�A¶ëvûu„s¼GäRYТ\L~ÏÞå´ãƒñÈünÞ·ïLµ%nD<”œœOÎþ¨=p,0Aõõ>ï&sû×ïÆçûÏݼŠ}²ñ]æÛY8�˜zéÛTõÚR� ½¦öûtÅÜo5[<$wú=ÆøJ¨>-+ç÷ö«'”<Ûûݤïïé‰õ?…_κÃÚ·ß Íø÷üÖôÜÒ\ýÍGmkóid¾ �#`´Íùœ)œ@ûQÞ«²‹\ûuëœçãÆÒcúùWݦþÕwçåùïh”ŒÖ��Æ ñýôRûTó¼[Òô›DSÞ0QG÷þÉë§Z6Á�ûµ{º«wÔ@fdx{3qkfŽÚv¸ÿ›Ñ!Å\i«‹ r*”§‡ËAŒ5Óœ�pfrT̴̈vÑpÇ\ÕeIô¢ Ÿj:ØpÔwÏ(rèÛ‰ïIž�¸«ªçBû£#$V³¬Ñ¦¯SîÖÊ¥›Øyï”è ©]Ê›‚'—æ.] ûÚ¥Gn ð¨©*ÓEYAý?7éL•©œAéÄ‹šgýTD"›’ÚE"g»Š}&ˆ³L„Îw%)Ó¯Y'CjµžAµ'ZÊÚ :ÿ§?Û{�>“Ô¼Ï'd•8üp—½M—B¹Ä¼Ô—ö›Í®ù2>+¨Ô2<,õ¥&®ž�ÞO™Ô«ë%\™Yyå|üL&.PÕãÛY8« ]­Ì¹"‹tá�äXósµ;u9™j&2Q³êσ1¨ô|û¸6µÎòÄ­S©�ã´úh8°§s_c!u"é€Û*”Zž»úwêÒà$¼�ÏŸiéõõ K$A Iÿ Ufª¦Õ[5¬lš­_W·Ï·»žÞÇÏkžfB ÚŽFs"!ý¿É—O±\\’_�’@4ÀŽmüCí3L­›|îZeéÞÿF¹�$‘¨¾ òñjK;Dõžtë¯|`mÞ0bvÊÕ¯§ß*Ò�ʯn5-efY¼�uòî×6¥Æ8\½°’]üöxaoŸòö¤po`G÷­jz|^eÇ©—£Ïߨ[ýþN#i¯²mÐ9}3Cˆ¿þ#®ÿøL›©EÍÕ_›ˆ¼À+ÉÄ*(ˆW¦(€eàñh°õxbáá[o ¶ÿ¾yÔH)\@¾ÜeRMù­kr‰ð/÷ÿ¿¾ dDË™mlœvÇä�µæroÅ{ÈËs`¥ð+<½F¥ü²ÄˆY48°ì¸ÕŸË¨÷¤ö.ÃS+�Æ!a®yÀÙp;_áŽc¶2±’Q#ù£ç{“‹;ùÖºxÓÌg6«�´±uî™”½E°¬ø Éç˱"Ž­öñ£5TZ¨eÆ\Qñ÷‘Ç\sÐ�)Ù±ÅcÁê‡.¾Æù±vÍcy±Ëö`k3±“œtk…’[I 3™éš9~`¾/„îPÔ3Då'¤eá¬îµå¼<ÝøZ½†ˆ�Qá%Üëf“ýVþ˜~QîÙ‘Ë"Üú5²·¬Ä)tu}Lœ„·Ž9³óIšÀéâ,µ×K‹ôìN\ð8+WÒYñÅpäc\Œï „S¿6>¾œ¶wz;iãÜ—¿0UÆ/v(¨¶ówvÂ4°ò„~ȧ� Cžg8uúïXcºæqä[©dÖžJŠCû¶Ç�!P}8»µ¤W f€¿ª"ã%¼ù±^3j3ä‡ € ëŒ©·ºqÚ\û´÷J’µµu“wKøG)M𬠭ãú–Ãw} Frjà 5Öaç;¾SÊviuÎ+”ϰ7R«ùkwc,Ø!f‰9¸Á˜ ѤïHó®ßw�=@ ‚¤�£ëYF<üôÀ >�o8 C×å8p¢‰â2^Åâî¡„f„²”¸ÊÐÝ[ra®æ«êªl˜ñ\»þn¿]íd£ÑQX7}Ä5�â ¾«Pºí¹«;ÔŒX³F¹0V—j}D!Û'•¯Ü*7†ÁÃz¶ÓêáOF Lò2`SH£\šs²¬È!þ;  Ad†ü¦!�d‡…½—p$h½êôõ1ÌÞ;HÑ&Ò-ƒÒ¥3„ yqç�?6Û@sÙˆ»hÂqvê%ûQšä§%ª˜¹:ð»˜î´8¥ŽV{¬€…Îdhªˆ@£ ½.Sÿ<€zˆã¿›@ÒÜÚ‰äfvAÊÆEïëfŠ_Þ�ô¹liœ†çW^Œø� …7k@dÔÆ6÷±gøµiÀؾ½ùØ…SZ_Ä' œSív+×;X­�"iß(1$£d#8›L`ðïÔ[!c"Pݲî¼n¹åMi}7¨ÛV–õÌÒ…t×ZU™46 áÍȶ3dµ®9gWªÈeŸðßñ±Z{ÐëάF¡}>ðWjÇB|–ZƒÖ¥¸z!áfä@'ƒ‚›2úJ°ÍScW¢EÅ)H¬sâ”ËÛåmo×>¸Q�Áù³öð1²$m¿8Ñ€LOÁ[±l„ý¡øZ_w@ÌCvêìP~‚_z�Ý… B´‹ôKÆœð¤ŽMï¿KØ!xÓ Ñh‰ð©ˆfé ’þq¥&祒ÑÉ€Œ7«0ÉyàÇ�¼&qYÈ6ÈÁ8£º¹á÷èéý�÷žïd0¼ç��߇Ğ~Õ%[6on¾FºË3ü¤óC>aΜs{ÂÆÅ»ž"�ÈÙ9 5Ä÷`ë~=å�2-Ô\µÎè CâOŽ/2’ÖM�Vb Ž’PA�ÄëûÁ²Ð?|ã*·KËæ_X©;à'¨>mÕ¤T®?¼�˜SÏ­ß^çó¥ó\¡ˆÞˆ–Bä;b½ ÉŸm£óH>y@ºqÍ5üìw¾=6)ÁW¶`CîñA\¬fí2=× u*þ(òa´ö®ÕÎS�•°nozW@ÞæË¸³é©à n&Ëæ­Åq¾"‹ò4ø *} ø[§à²ÿ¼¾WÛ]x…laÞ~Q†î¦·ðˆeƒ›ú:JªuÃÖ©Ž>,1¸Ê_†êÉã·Ý ºS¨a-ßH ÊbJxI&¥—I#eD8•ŽÔ¨8�vN®V3 ì&vA$ÏHpíµ–Ò­zk*™³^tÉuхڳr¾ÄñPÕ½!P#ƒK§áÀçª z‡ NŽN;8Ö£½du¬ÎUr÷%?5’}X)0+1ü©a¡<ÜŽÞQˆqÐfÖ¦÷˜v©!’ùÈõ­¨šðÆ^pvR’K%�ÃÜ‘Òá-ºI¾ä³ -ĺYÁCÉZ¬7f� «FÏ’m›ö‹Øå&ÖsZ-b¼“]‡°öY# Ê—fø‚BróÌß;;¤mkˆÉ×µ’Øìh÷‘¦;2`޳mcĈ–ôŽßÌœxìäîê¡P^#Z½1gâ%ã?eÌ”¡äqä�ó°õÅ™C€�<ùßîFU“sQ.ÛK¥HáŒ_27SFß•�DèÎ û[™í)q«'é¶@�«¨27»�7¶ö)â„T|ßJB3˜ßsH²ž˜®ãààlVN–Æ-’ÿˆ qÞ‰˜ …Ó»S‘Y÷­ª�ì¤7Ð1O�.6«ñ}¨³“ÇHrȹpà†àð`�ÜšFT–.³’ü¬“É!°PÛÆÓ!ö ž¶!~G¾ËªÏ·Ö´ú]òýÓ–R$ ÚIÊ�á?–Œî*z¶Ä›A8 hµêd²n[L÷w£"rÒ[UÞ*à}ï„Èg!®Ûtð·lju*ô÷Ø­�Æœ¸Á~M]=µç6Ͱª[¶ÿX† U­<‚#sô—¸MslÂ^þŸÞnøô·8�ÏίÆLûA/Ï�¹0^�ø§¹XÙðì�ÿ`/סnXÊÚ3"öøß†iBé ½Î(�í Úä ƒ«:€…Ϲ@N WòÇB¶Æ/‹F™ Þ:ˆÎ‰-÷- ±„ƒô¶áÚÝ áØÖ®4N¥�iz4Íg“|­4eÓº‚'w·¥kó¥�§¼ˆ§©rÃxä´ýá2AQŸ?zçÄ>Ҿ݉ûT+eQÙ•�z¤ôd3c9 Ýaw‡M¥G‰³¯—²TY?2{�ø L ƒ\ÂüBˆ"ñ-t`Ù� sÍ·¦�Ö²1}l´ŽÉz¯W_b¶Ñ’Ä�ñ|ï} 0–¶צpÆ·!¥jföA ]ò½ÕÛˆ“+®6¼�i´C øùÎ�D¯kg¨”*7#à/AºûÍ7Û^m„‚÷?`qq3ñ†ÈüŽÜÞ=×Gb‘qñqOñ¦¦.ˆÁ`a’�pR J†¨~¾Æ_ÙÑd犬oŘ霬‘¾®‡Å0HµÊkƒºþDšhƒ%à€SºàÃú޳¾k!æy·³Ñ¹æ»7]K�qä‚hË3ˆ2Yž$-:Pj9-ÙzI‹¶% �LÓfQ C• $™(°r_yØ¢%� „O1K¡íÓ!’4Ö„¿»›û�ŒóÑ#ÿ8‚¿Æ}Ê1*3z ¸ ^!:“�T¹¤•7è÷ :¥ÿÎ)Vú—§G;\O³©Þ™±ŠW'V’XåÐ;¨&«‡¬8¿WÛæ8G{ü>{é ŽäDÆá^{GyøâÒ@—}º �½¿/²œF–FšM­ •ÄÙŠ IvMŽ4Ç-`¤²�¤¢µ8; ­Ž`™§sÉÓ:I”Ôg’]by²öòžWM;UØØ#b6+7H“½i!vOÏ}\¹J£\<ÿâµ~Ç‘jg$>!•¨7ÜÛ�+…½PƒW°Ö›/À“ëµ´ŒYË êùÍÝÃEÿX…ÝÈÁéÂ=aãnÚÆ‰ÌVÿÏ(tÓžSÁÃÂèa|�ÎØØ9R½÷Æ”€O ê÷žÈþÄ*ZÿuÔVó|ú^ª­Á^$‰RUŒQçšœ»¯¢ú|­k.¨—¥j½ë›Û^JêŸáHVl|KoØNeÑø«íétd,Ro‡‹I皘] À¥e³�õ�¶oTïÑ|{8GõhýõSÐg>r+r.÷ÃÏ?þ 7‡ç›�3ˆúyMýu÷@‰%ËÕ·_xûÿˆÇ ƒgºI�Œß¾Ly&C¶cßæd*®èt÷œÝ³?È4IáÿÕô§7—ýJÝea½¦�kT!w [0vÈô½pj={ðÆ-XÊ0sàÊ$…ïÃT˜¦sÞ[p–=èluÂ@F`WàÅ=øÜ‡ŽfŸû_Ÿ”¿^QOŠÒ�éŒáW�%�ëØ�Ò誅ÔýfKŸ†wGWÚf×Z|…ó¢5–I´%ÐLL¢pÓlBžq `m§(ØÙJ`  ò·2ͺ�›ª‡”æñÒâ»ò¹­ê^z¹ohÙxíÊ\¹i*W�:ëq `ÃÕ¸_‚�㎼Í"¿ÈèßÖ'ï*:¼W,xÇÝùmON|Á¶÷‘ÈQ ØD@ÇíÎÇáËîïœ^ ¹X)#i&ÛÒ>ÿ”½©Zˆ¯í(` Ùê צ¿ë5oâøŽy¨þz’¦!ÙŠd˜ƒ›¤ÖT� «½îIqwš¡¿§_¸óªÎ|à ŠW×›™Ò‘#T�ä׃ÛûßÃ>»ÿ·wïžàvëbaÏcþ"ª&!ï~ÙÉY÷%PðÏoÿŒ``ÄÂl2�‰ÐÓ¥â K½cþ‹­ñÙ˜ÿ, ñoW(6Y°rR?õÈ5�<Ì¢&g¬o…þ�„ •:[&î�êÓŒh$$$+oÒ6r$’£Ý*"¼8iûÆ"r§E¸VõgºU†Ë—RTØU_-æ°W¬OÖXÁ·:à~�Ós§kd…z¯é w5.%9IÏ0o!”‚ðŽi+Ôù�.šG´d±¸÷賎°^aE^xÜ›"1 )óÓƒ éOp@·&s·ÆÏñ@ý5Í>­ÔáïêšÛý7¹…©¡~~¿'ZR9Ñ¿]º üóï|.Åy9‚°÷Áá8ý„ˆsòÔl·xÙ¦k¶c!¶Å�ë�o¥Îf6;™dùÛK8 2V4ýÔ]ƒ~,ßãçºå.Û/ØÝgé€?w|Ç9^æ<T×— x×nÝq‰ôs+lÉX†w¯RÖ÷Bâ@Œø=ŽjÁ‡*k/ŽÉŒð+�о‚§Æ`¼¤p¿[bß�p?£îäg ŽCóÙ½{®…Æ^2YQWùC�žxÂ;/uQVó‰o"ä ç@3ssåÍr9ø�bÅ­ÞäñlØz»Jô˜góÄ‘óÐ�©Zåɪl” 8™¦‘^yµWÙàð†qòúPèádÞ‹ýÀùúéÎV¼è¼QŽ‚;R�“f� ±Æ—ÂðîA£ä ÀvƒM™ç6 BDcr¸&ù=üʯoæî!¨Çá@¸1ú ÒúýÈîÂÍòCø­và©Á‹Õªø-0e¹W”]ή[ßf1¦ÛÝiD@þxØtÒhgø[|îÙÐiˆ~#Ç�<òþýËLàïní‘EV6´-›}˳9]L˾M ‘úL–ª“½'C­›À ›wÌÁ¨ÔÒ ´"�E%ÿ¹ÄØ’3Bš;@•Á8óè·�µÊbÒN‰|5esþ[(ùÆõ¹ _¼ýô ‡™O2"DzKrkåQÃH‹¤oƒßrö„ôHVlƒIÃ÷Ô†÷2úfÑg‘+t”Æ*þùˆpZ÷.ƒW;åKéÃ�õøô=”Y'®`W„ËvFø`ž{I÷¿ïÄ=ßÀÅñ ‘áfà3nO7~Ú^~†‚wƒ‡_2 %j.rÚËô±¯ŒWÞá£C’'·a£'‚8�äùÚ&ƯØ?Gø>ØÆÁùûÄçß �¼ŽžóË}$zKÈï7¹è猱�¤ .Î�Þã‚¶ù³õ¸nØðTÜJåj?�ÌñI:sááÎç-b5åxÂ;´.SiŠUÑ��6^´Ül›Ò €?tàçß³‰Â»iB°ó0@Þºòõˆ<•~†kwàñpH7"[¼Ašeýx`ý�η·›zVß|�v;kj/ÊIÎLÊâÅ›êv~Fµ�J)àT\^¡I÷(%ûÔÜ…޾ñü'wï3’¬g>ߨR‰c Ö&‘œ¼þ•+\�0ö¹?Üvkö[öþ«(,k&r0þ¡{ý­‹Ø0³gé@[ q¦�6oæDq%ž m¦žƒIM¼5uºaJ9'FF%|Á¦'·Ü VMêã�ù3°í�;çS°9­{?¢¶¢6ŒžÅÄ?ôi×µCZ\ÎKìË_ýôîÿìAD@3â{bèaç…eÞÔÇpø-¶ñ„Ÿø†‚;4e)fçc5Ñ8(UϧÊòBé9Ó­÷( iWžûNWÄc‹ÆK;‚PÀZ¹^ü÷ ãfu�´rž“/<'LfoÛëåG%mÍqoª÷£-…9�zf¹°›«ˆŒï³\Ê‹Ä- ™˜Ð-†˜Ôß_ÈÈrAË�¦˜§ìÈó¼åâÀ¶\ê”�¸ã¹³dÚ-Ûz̧ {`í ,@4QŠ»®è"öìÆtLˆLí“”ª7ß …q!‚ R"%@böZ°1¡�7w¸'Ï?jmÓèC³‚'&6M@³fçú-à$G|1PÛ-kP"Uåx‰ºq²ÜÊ_wO/²°¯©äÈgr7¬À‰}—÷½/Á}ƒ,§ÝÝå†ßWâZn¸&ö eJ†*ØË,Š>Îj“ ÛMâïñ  N‡‚d¶mg·ë™9kljR üÁº²Üò±þ]Ê΢£æ_Û?øòé’Õ‘B­@j7ÙËUžÈùônÆÐ{Ž ~<h¥ âñ _Ãîpò×Å×Wµ´ËéWƒkùð=f½ˆcðÕÆ¸Lî:J¤H[ê¶ë†!:ú�í—¾jGüPþhfÕqƒ&#&oC¢ <¢=ýx'1å1rÎK§Ogu88æmÇQÙs�Ð7*4× J=’Æ/$NláÔƒ¢…ÆḬ̂N½/Í üŒòAÔä1�Œ `œ·žïʹCA2’–“›¤ï„9%…Ѝtiû¥r?ððS8I ðªöÑ !…?ñv7s2ºfÅÿ „LðLú†iÔ²Íö»’ßµèóˆün0ç,N÷¯LKŸ»OÄQ·6þ)ä¿–ïÒ·Æõu7 2h~…C¥dY£³áŵ^ …Zÿ�?s ⻌b!|’7]H–B$.µû�ÌÎw¡¿d]Iÿ?uº"Pûo’»ý{QX}Dd^¦@™Þ„%‰óãÁøð6=èXhð.eg`×è7crªêDé3ŒÁµ8!­Ö‡yeú|ïRm“ÌŒ>3®x…�"ªa!–NÎ,IšÕ,ã¼£3-i‰;4ãîóX{ò³'¼.VKË`ñËÙ 2HѬ +ÚvQì UôB‹ °C„Þø�¸|w•dÛ[ß廌ùîˆ$�¨ÖÃ�U×Գ߰¸FÛÄåª�]¬oJ=g±y¯{a!¸ ÆÛÅp9qéçs4DiЇ´?·déP¸1ÞàöüÖ§Ü >ÜcÍfú‰ó¸\Ä Ç· ©wÛs{Ø?p¾bWÑ=ÛöìÃya’;‘ƒÔHô†mDÝÓÿDÅs'öá >~? ðƒ`§ïi ¦£í7¡ Œ£çŒ'á#•º‚2MÚ¹JRDàA è[ÊO¼ ¬: sÄRÂH\(<�PB¼¡;»Û¤!Ì.ŒNeÔT–ÁŸâÐ3ײ4.*KSqîã ®ó+îÂhŽn6<²×$çWü›$Ñ…Ñ¡f ŠÚ… ·+Í]ÍW0ÇýY°æw˜^qEûÆ€ax¡‚Ÿhõf¶u S3šj?8t 2ÿz4í™aá¸|ƒ‡mn&OÍíbDsꬌZæcEW^èÐb O�O¬šäÃr@m{ƒ®yœ<çmŧ2ßL¼o3Ì—ŠA°oŽ•Êé�§6ê:áFÀ^ËI”³ù¾�Ù‚Aq“ëÁ¦Ž�La (Z†­Éñg—¶ãßRá {3ŸCÆÖÊÝ´ÛZ_[Ë´&“nÛSjm/ø?ô,¹h.ݺ»ÀÌ�tA[õí%‰öÅÙùÏò”´…Î9ù6c:—!ŸõÎâwªÐ?õÖUØhI“Z~¶Ó]c×r—>¿`®¬ý*Ç¢�È"]X�Ç6”ñ_ÅühÔúOdfžT&t�éêù×ø^ÂvMéÏ¢’Ú¹Û¿?7m:•¥ÏíVlQÇ …jiöMN´âB|1×àYA¤îõûB/ 6�thöŸE a3Âl?Üfн*ÉåÀ™¾v9—`îñ¬éˆÒç0>>=a„4[ßÞŒ¥Vsž¶¹eÊâ9Ñz¿À<)4ôšÅb!â*—ï}ñ�•5»O—Ì÷à¥A dkù7`VóÃúóêô\ÀÈ@Jtç>m-š;ëÚY÷Iç†à_”8Œ‡=$Þþ¸O9ƒæU‡Ùq‘£"à![ÌÇW2×µlÄȽJˆ°¢Ó½êÞ�ó~ø¦c긺® ÈhÃâã×·I޲ þåSÔñÙT†ŒpS„ÌÛ²ökÄøõ1UoP!$ u'¸»x†ºŠï9ÅöᄟÃýÁZÂÁ‡ _ßÓî�¿¦d“L}äNÊ—±¨Áž±LDYT¨tu¯Æ—¦â”é+ýÊi»ˆbÏMÚt¢Ä+¥9Èh½òü¾¯%My ŸÍÏÂÃøðóu¥ ˆ9ç7X«xà°ƒ„3¼‡\=‚3õÞÐ8FúŸ´X‹[ˆ© 6`ú^ŽÝíFýØê@�¦j'—€¦DæÀsñ2¿ŸFt(N_—ù‘äÁy¶ è…^#˜p‡Ü)Óþ“` Ì4‰`Oí»¦R7¼óÕóf¦C]u0R¯õý ·Qo³·o¼AÓ¡£5ÏwF5ð‹nÂ!œ$ JÅK†™ ÇVÍÌd­}ÏÁ� ÌvB¶‹ø«­˜,D‘¼].u?Œ(¶Ë6°û!VßmgB í-!`¤¼¢Ï¿wšâ�ëÏÌeO”+—kœSv…> ‘f|?D{�àô?4Õ«…œøFG‡Ó9mÆ¿ú²C›w »)Ö5óø#;ÇR=%ÈžhüäͱNB‰Lbîú<ði—ÌÃïª ®ú½ÔæÇæÕfçßø" +»Ñg‰ÖOøEºj‚V*�£Iâ§,eþ¯äÿšR€„›Ùa³°Œ¾„æt'¥sfœdÐÜi'Fèà·3BŸ°õž ï©>®ê'qíÑß&8§ÌÃÚ÷ÎàG¡3z5ï«;ÖâÈ«©Òý½Aå(©dùÚò'"Ñ[Óë5¯“Óó$w8&.ÚË`šJ,òˆ ýÄÒLŠ*w ön�È–„6MñÉÕÓD)R5'âš´õ°æŠØ,à¡Î\”¥›’Û¢Ýû 0¾%�‹i¸Z­9ž\ðlÙÒíÖ1¶3\áÊ·ÆñŽ%6�X`úWºHæMŸ¬ï&þ"d¹•WtbÉ�k¿Óß3uÀ¿°ú>‚wø|"ð /î‡$ß(dú³`5 ¬>èì vœÅß=úÝêÜ!×lödcn*i z®‚ü;Uðà $Ì`tè »rÒN{ºh¬<ÖÐò$­*+lFŸ»‰ /ÌB÷Á–H~F@û=K&,Edáõ¿)ë„ï›òñÚ¾&ÊB�OuvÄ^uÞ kë°HÖ­ŽEåç^³<ض ³c æ/ÿiôKûÓÞPÀE8ÇÓVMñD+Þ‹ÄÃéØÎ’3l3PÐcZÅ©Håõ"®¥Xìí/²Îx+�ƒÖ[„y¼ƒq±š}J]†ÄH•óÛü±>oó£ùûîŽP|à{†‚r¤ÝÝ<(”˜žeÜæF¶‡õñ¿c±ÌDi›š×ì¶õëháwÁ�}Ã7æ; ÄcøÑÏu– r¡<[eì½c~FîW†[›ÀMœêÐM°ùCFÊ6Qxˆ¾a´±"°�§‰l8oÓ)‚ú¤8œwàÒ:8ÁAƒ-ß/lòÇ2ºóÆ Ù;¦3œ¸ò1­±ã„ªÒv TÎsÌDxí@ÓnÅËÃó—ÐÖ³¨ »Üè†î= ¶C§ÿ»+Éoú9Øj´†¤¡7-¨¡".ùá7­ É Ä6Ã#ùP±ÂÇ+B…´u]Æ»Ùh|u�í«ŒùðÏÏn`‚AMŒcÛŒóH¿žm O«+Ò¼›—òμy"¶úÿþ¥üÐHÃÞ¼)éÿ}QèQS'>È»!wÄÖEÓ§‡ffí½×mc¿Jã![C0 é@îË×à˜f6�£æɹ͖èdI¾ÔyÞ±«òJ¼ë¹­nñ%�…ä'ËOwLo©y:<Èùÿh¥óþŒòˆŸ?é·wdFÃ�ØÈ†A3þèø&*ƒo·—•ëQ´íŸ{éñÊN/6cÔÿHíüëoßÚ‘ôšs·RÇ«¦QÚú€±|᱿[þÊ£`ò=¿ËW¦Ý±²ì¿]Ç XñÛ>«Oo|ýbÔ¬Û×Eû^Wý>òcdû/u¥»J¾ pÿ®vYÙLè¶ð×ÁG&¯Q¼®§çÛÅêàûU0_ÇñîÓq:OHÓ«¸èÓ˜+§3›†ÍÀ‰§³à˜*ÅÌ„ç»õ Ô=Ù�‡n9,%Qþ7´�·µýá_°ws¶t×¹c²¢Þ08àTa…ÓˆVA‡±�ZûÆe{Ze!Ë ã UõD gŸ³–V>ï JÒ'Næ¦âIa=76ÆJ¼oA¥c†JOšÚ™zËÌN;Íëø?Ó�”óƒ1Y–· wHt�%Œ�­{˜ Z žÄ]cÚ˜ U�S7«¡1³È#m�ñøRyÄc?;Ïà˜[­½°øan?G84Û·”;Ðí�dÙ3�ÝîÙ,…øwWî29ïÉäfŸã$ã¢ò¡|샽P^!�¹Á`Ê5!É B~aç(h°C„ ¸ÖælÑ÷­(ÁC ¡Ì@˜ábÇkã·ÕxŠAüÇ[|{æ¼í…ÃhX«5#:¾w}ÀSc¡j(À`Êp-FÑXǹöó#VAä„à#õåýþ€ê$üÃ_A‘Û$–ûØq„hêñ®·ûÏuxŒ\‡6 'âاêXb¾�cèkPÔ/FmÐ45cÎg.~¾î �#Nƒ}ÚBìïÝÛnü²ï §ÿž:Ûê1n>æHI ŸÐ"ÌWåþ¹ê'ÜÖqúÙ[+'¹ð��Ÿ ïáGbî¹Um£ští §œî/y?›àë/¶‡ G�KÁ³mÖPçæ4™ü>þÈÇ£RÎn`n=à�÷cê/}º¾øÑçD‰L)eçBÞaÓHZÐ×�0uêDn©»È<H™íú—ŠÔ8»+²µ&¯imÿw$üæ´î7ü'}Í}B=¯m×…Ã(Þ šÙ¸ëAº9Íö k C-¤Ü±Lp!~1 ZCº™(BýÖÓ‹æý¬ÔK¯ Ù>é|&Q#4² Ïê Þ§µ&|ø’5+ª¥ºå ÐºcNµ5EZœ� ÁKb” ðÍm`Cž@1kP% zwkxÓBÃÊæ“8ŽÙã{€à©•]7D!Kª:{œ Kkµ]&n[6“Lã1`(†=>ü’À� ‰�ÿË#[_—?%‘ }A±qê2dxXÑEÐJx”û½ç»õƒÚàìÏc¡ÀzÚúÒÐ0XÁ8ŒÛC¬ÙãoêȲ§¿ÆërÁþô„>.ûnÅs8‰ä\›öEM_?ýk`cëXÈÁ®°»‚ —Œ÷�Ò·ìƒ{U@æ”ÍÓUýò-òG­ýJOu°�ÛôÂÌ"Ó�X("!“´HÔ�dDÇ™•$Œ�–‘×ÑÛâñBä(|ï¡73µª ¥$žë·ÃˆÕ±v‘€i*Â&ÃZ·w¦½Zx®Ö¾�œ–ÖÔZSܹ+03†`GUw¶JØ`g6ÉwVȼôm½ôÇ¥èÉ•Êüìã-çgZо!$€””_…TÔÏXÀßþ¾<¿˜ÃZßî†GZáï-q•û�ë 8]{ôŒ 3„´?Æû³÷®Ô yñ…�£CÜØ°¹Ÿ0,0ÎgÍ�>çÂûµþÜ8Êéþ…ÆÉ¤MåÚâÉZ«ž©Tûöô16xXÿB‡€…rö×SÂúëæ¼O€+�K²øÝÙÄ@`�µ¿âÕCgóx»w¹uC|lBéàÜ5þ³id¡RI/9ö¬ƒ]ÊVЮrÛh>ýÑž­ü‘À»�Ù=ü«¡Ìˆ`ÆAo™cóP A•¡ÐõwiÙ÷©¯pﱺ§ÀÌ^‹¹Ï3 o¹qÒÙr�«E480T¥íkŸ$mÒ:˜$–”ŠŽF‰m›zÁ»8é\gʹ\DìÍ ƒ½h¡³£š¢@ztƒB¡@��ï_-‡ê ’±cR·! cZ`–³7ô¨r¢ØÑÁh¬ŒmæiçÉägik1d¬à†û­(Re¨Pnh;ÞVJ‹Ò>Í­d�Ͳ¤ÉÊ”tÚ±�Öm"´Ðš‘’Ù3"0Ý®`ÈŠ u)`—Fê%FºåÄý2jè›a:ë…5·Lá ŒŠÀu½¤–ï·OxNƒ‚÷p ìÇX qÀA¹Èƒ,ò¥SÚÛ3�8´ I†5–Ж"@a©­vÆ1�0r†`òÇZõZ¬³Wÿ{Zdµ†Q¹¦Œˆ[´C<êõÀm3�)÷™‘¿]$‚φWíKhz?Ë—0çf¢š$3 ¶³”eªG.M×,Š*$Ûmã/]¶·³Qð=W --a��ˆÑ.Æß8ÇEiÒ쬰7ƒHXGºò€¾Ó$níµó Sªßx¨ãŸûTX? fqÅyòÌNÞô°ì©XÔ‚.­ü1‘Âo´°Ž}sl$Á@bj¥R¢DEA 1b‘pÏݼçœLëÿDß䇷Ói¶XFÈD}åüÊ®1ËŒ¢Â:Y‹/²ÃYÙ kDs÷…8¿ç¨UW jÇÃû6°ô†] ŽÿÜIBP�UMßÁW3c&Mâ¾Ã§µrWD¹Ì@îØZê¿[§ÎscƒU·/˜3“‘8ð“øý tÑÇÜûë¯Wá�¬úŒMNŸ–tåÇÔ¨¤�Äe6aèd»qÍ®q ;9úÄ_yˆ'.ÝQÅL�ÕïΠ ƒÔ>tpÿ—ËŒ–²@zD ÄCUØà‹‘%æÌ^�–ò…ÖOB;Î'4¼Ç)™ò¶ÞÏelMiï®ï#®FØ~õmf‡…‚ÖƒÈäϼà“ðx§9ï±È²æµ³¾N�"ADžåæùö[<ñÃÀHã ±�#RÈËž1 0õ1œX�Æâ¤!èc'0L !Òû79Ê�ý0±„ðeóü�ûíUÆu^AšÅgÿ/o-c Û@cî§QæÑ{² §“»G£å=‚NŠ4ÅäüÌLUàsxLÀ1AS4x,‚Ó¸¨¹BÏmo$¶øÉnwÎ13}ÑDÁÖÛ¡´�ül=T«‚Ù¾ó­¹BœµÈÿ]¶ø3! €=‰ ÉÓÿûþ§£*Ý?é9HÃM¯êI$½6ÿgâ'ã×&‘™˜Ñ°|¿ìã|S?|ø›Ä†¦ 6¼v)¯È¡^ 0»6wñåËÙ“T•NÇ/úgb—ÎðB^]õßç*ÿÄÝÞF”ˆI lLÇÔe]ˆµ#ïÆ“l£|Îé! h›óócwÛþVEÆ�·“å>Š>õ´–Kó¹˜p5—Ç—÷ꆞž¶ð=¶<ó8ÚúW9”ÿ½†Ø4Å¥$‹¬—w€ßHZÆá˜ Y6rÕ3î]Üwâ®{^ë\˜”¼robðPtîdÕHcQÓÓ[Ð׈ºË<�üÅØ…FWê.!°º�·,‰tA\祖é ÚÃáaá~ &d7þ6F”F7mB¤wFQ‚œPa¢“lnæW'Q:üúæ®^$&~]–.×Þvn Þç™ö˜ejg¿º†Õ+ãù,1æ+Ó,ø=†ÚkÞ/;(!†u|èãšÍ­¨œ3¤+š@”Ԉ‚SzkØ^ó~ãuÍ´þMßs¢ã‘d_åÆâ»ä‡ZqLº{8­—”=C�_ψÙ>)̹ ùG—źÓ=zÞ±ò©ÙøÔ<Ù^ÁA–·ýc9¿œMÕªÞ"Yh hùâxñè­kÃSsëxˆ‡V½.c1ª(¾hõélé è9ƒ}÷|1)¹kÁ�éäY }H6Èí\KÈ«ŒÓƒÃß!<¬,0ÛÏ'”€¿E�.ë{Œèêa†&¦q‡Á»éì³UóRšW÷.3”±8T+&ÁÙ€Û¾P}áé�°sý�KÔ\¨´lpaGqÄ€Â;B–×ï9®|8[8CMn�þsv:(·Q›$ƒÚ0!™˜úà âQ·óvœËÃ}¤Øàw®Æ¤'ï?}¬ à.jÿy¯^zÉ­\o±»™Ëçc¼¾oßwuå´^¨ºtã’¼!V:Ÿ ÐÚFCZŠõåO�¼lQÙ¤7þÐ+}Nk(7”Ö*þí`ýï�6F‰ ÒÞÈ´=+åó•O“žhÉú§çuè|YÕ†ï¸ö¤>gÏc9t_G¾cIYEõUáÅöÙð_!øü½ÅóP4ÚrÁmòz^.‹tÛ*›lྯÉS§'Ÿ(Μ|™w ÿbB’B9ÀX¿}{UTpÊ�ø$­¬uñN"ô’u%åü:4´V£‡¬$Bd‘^8Uˆ=�‚I ¥J$0ZïCª�K«&¶c©–~(eWµ´Iƒf4BDxÙÖü™Ãï, —Œ<Þ„r€!¦›‚-èâyr¦Is /[ÛzZ«¡,Zçå!2ùîBæØnÈqëâëÍ;´§¾|:9öO€¨¥÷¦>sÓ¶�B,áèók㪢uîZ.“tÖS’ïaµümÆÔ­¢¦‹3Csž¸Æ¼ðO‹â¹+Ê#{ñÛmåË�Î�l…¿‹9[!l9QíÎÒ]GMg�»�Kef+ ¿Þl0åã :CJ@Ë™ 7N‡ÐàÓÏc€/OO½Ãôˆk­¹;à—³ØðÄ݈\Tì3à©l¸X±­;Bq$‰�¾T˜´F~Q#Þ¹1éî·WÛ¡øWRä’¡¦1Ãô(­ÑÔšu|ÁFð/ru�QW¹]ܽ-ñ’æcd~^c¡ ŽÈažÊ‰+e!“œ/›º 󑬑òÞémšp1­ÈÖVr›UOÿ=´ØSE×CaõÅŽ²ýžüºöôc…§Ax7=s\  e2[ ŒBu¶YrU"ƃñ u4°QÎ1Dªö䈬T•¬ *–xÔ°fÆÙ­Â–ó¾s�»ï[,ß[<óˆ:|Bâù�Mœù[gíÚ¾jƦãÅÞÑyíö †I©ÅzTÆ‹ ¤øØ�;Í€V�ñìüá߃DºW"ÛŒ‹±@÷I”œê-î³’äìm‡´‡op6B[ß¼Ì.Ýrç” TEŽñ&ï«%l<ݬ¿°›œRÙØl·w!¤!Upz >#ð6-a|{XÏ— «ÄrÞ��³Å×[ІN“ê x0<1“¶ºM´PÙò¥sÚ×¥l,éó“—‹P}[Äc}â—�ÊîoX7Þ4ñ�ònё泪áu�‰2fÿˆÕvBdçÜeV˜x©+6ÜR§ÀQ(?Rœ¼óc摆§G¿ÀAtëøyÔ5Ók|œtáÓÍ�;¯a˜,Ujåc ú“ÿO¿y aTÉû`…6° ß]ÄEœ=Äà•Î̳æûH§ñêìK‡⾉jtKÈž:cÇËßC?åô1"¶§iè±¾Q+ =6ZòJ+c¹˜¢ÙL¶�`Ñ•=\DÜ6—),�9f*<ó™æïÔ>´¤…èÊM�‹-’R8¹\‰Ïù„E¸Ä6tÒpÎHfs4Ùøª³˜Ú]Ða'à Óõ'zÞ¾eE½u‡î­îY TëÓÒCìë7u““DlË›¾8Çá92Z/’;äÜó‘QÖæ�ÍuëÝ|9ÓÖ¬mž‘†í*îp™ò%ß =¡Ô+·áž>MÕo®g¦óv#}�æ–k€¦Æª”#Òž§¢%% ¾/»ås³›¥ ²c:¬KQY È•áIÔ^ó0ä«P_Ó Œ‘Þ®har<ü=ÌG67Õg0üÐpåçFÚ}†Ç|†{l‚ðòëmÃ=œ•ãÑãÇc³ÄÀºï× ä+òeJÏèéãÅØÜ“ÍÖ·ø]\ů¼®lÇ„ßEhâi7©1Þ ê�Dûöƒ‹Öo�Eü€¡�¿¥ø~4pšã98êMíÛ�)+åXf=Ú¡^çC¬ £`v³×³�…Õ�D80Ú@‹7Ÿw1çm –Æ4ÇZ¶ç`ÆÏV_þws¦ “ *��ðŒôâú®«c|SNýÂóÌ RàJ}Ã÷A–÷=Ra¯µbó:eÄâ®ÃÓåЃ– ú¦÷�/žîú8“Ms–ba~ŠÛ‹.ÆÆ¯±�—ŸÖ³ÔïS îkÃüsGî쨫´N¸Àø™ïƒL¨¦f8Tþxâ4õÉä’©ÂîÆ5�…_¸Yº½X.3«‘P0E‚a±ï—o�<\tND¥ÐóG2#ñGž·½®ySÔÔšs³gœ^ðÆ žƒZns|'²P<Žs>_µî9ê÷žI^øÄŽç|EŠß“¿‚ø7ÛûûØfgá ÕGk•¸0àçóÅ•X_Wó4H¢äôý›s¿bגЬHtü5.ù³´`FJâòøè13²Î S‹LëȄܚ z¥ÚÙ£G‘ÞI¿1Ž›çú<»¿ /À¯f&ŸrȺ·>XÒÜ»oäyê~ð�¡•ßZUÐÝÖx�˜ú óðv¡‘Þ¦¨jH$�‡ ÊW9}¢C>Ôû~?|MgÈíÈ Q~v�üž¹x7ˆ(DemÁ`d¤ô€‰\œ‘0}IïÌ�c\‡V�9Œßær{VB,(šf? füð`Vù+V`¼MaÒð5íóÉêtJ‹ˆ"å”ËQvÕ9­Â’O�¦ö(ÕØ~ÍÊüªŸS¼ÿ=ð&á�‰:ó+¦û¹,¯â"ñÁå­â(Ø“øgR)-7äñœð˜¿˜îz!Ò>8= “ÏèÞy¢Ò®0#ר•¾?[|Ïx›¹¢� R÷|“Ö- †H¶ÞmŠ•œ¿…Uе¶+0χ�NY �ºS¶ûÅ®:ów¶÷hëÔA¾· é¾óHú/ 厷�½['’×ÉêµÕàq™›ÔKÏqœ‚ºÛŒψ48£ü©rï=¿{¨Ãxì•¡¤a§/.9 pojHCzgç\V:8MæD�éÊNi¸9§}Z­²9!Œñ¹®À‘5£íÞN�@kÿ€i•§ ±#ž2EÞ@‘—§QI†¶¡l^ÖÇ¡•X©ø�_a\½ýI=eV& ˜„&Ó¾À.Ž$bÚZ¹ëÏ¡6 �Òn·9A°ÁvfŒ¾Þ ãh#EÔÑt‡Iá­à2ïf lBaI+�„¹uñwEæMlô¬VÕ“z?6 îjöFF¿¸Ñ(¬0EeÅCÛâš5Ï´­KøÙUÁ…:ceŒõíÐ óeêµ®p§$/•Pºs¶IµÎí|±\!+Þ–øùÑ^4“Xê�Æ5Ð#oà,zL‘º×ÉÌO÷·ÕyÑ\>sÌF¢ã%ïVáA⚘"À2&IÀóA‹ Ú¸ðû–«I‚Oqä³VƯÌ_o±×Ãf(ãtl†lÕÁß¹(«VÞÉ•|g.�е±C‰Ïˆ^©>Vó„0“~R¢æ�^^ IòìíèÁ ç¼ájª.Ÿymã}Á rNgÀ]<†ðÖya«©¯P_­.pˆ±olÂçÈS>ÄŸLÇðÅ ã$ü)´^3}-‘¨ä} üÎ\¡3ã7Q—2<ˆû9r…7¢ôã:Ôaõ@` —ÉvßžØ}ÁýžTbÃë�òSœÒ „Q·k�2KóÁ&>Õ˫܋ø�]X%û>6S"ãŸOñÇš==kÑDçÃÖAáwØ®½çÖ¥¿¸Dèâ·Ü DbŽz/8óÒNÞ—g´S¯[�ëS1¨Ô ó~:gÚâ髟i‚Üg|¿P\©s¦“v/>Œ©[oŒûŒ…2_®ÖTL{Ãwе…¬-` _èõ{Ä{† ¿ ŽYÅã?}QCF[¾ã)¯GtŬ_5°Q²Ït,6þ©–±Í7¹óXMŽŸ< Hîüp�ŠDÁ*n¯MnyËÈJàÅÃâØÝ=ŠÙßmö—¶ì¡ø,Œeì¿bmÂ~§v¾Èˆ³çÐNð­‘“ÓÞøI{jj¿a¶(dò­d§J¿þ8Êz?5†æR³Íà.÷ȰC ¦ëBèYs±Ö"ùÛNOÎy}¦�/§Ö1„A<êA1"BæVå©d,8+Ö06 OEŠ49íÐÒ³[8ä6«9‰t½Þ£ ÐõÊŽc]º�næ‘“¥æÚû’nó�+q »Âg³Ì™íVñKE’uŠâŽ ìgÌdr]JF„k…½ß¥UŽ Ïm@Õܯޣ^çHt‰%)–}ÿø‡Ó8KÂ7[%Ý$5P׫|›ƒ8zga,þ¨iÔ&i³ÏàÊÅPDz+Ü2™«¼ÌÝÕR6MNJNIâškgX˜ÙŒÓzèLÜÔ¢.j#0 bpN{�ˆÊ®ŠîYºÎgRg¿cW,¸+ìš–ê¬jzËÒΑò®JçŒ÷±¨Îa4r×ui¾ÆüR¡e)^hE"têP;ÿ^Y¬lylå+¦5œÁÞ›®ã Yk|ÍPrγ"è˜?I[ÍlEù¥ƹ=Úñ¹ºÀ¼Ÿ„kž]¥‹=Ú{Yæ0ÝÈ»ª7�¢™véܽà†ÃoÉõ24üç_<¼b_w÷ƒU%î=Ö4D|KÉŽ²¡â¤5«wÏÿlåóáWŠy"ÆIÛ#kJ­-Å4M'q§Éßš9]j´õf¼é%h÷*jÚ¿^pµ‡|ë"ø9¼Ã.°°å´Bøåñø¯÷kö¹*ñ«Ç�Éøó‰ ’Êžê<(½úz¬!ZTrÕ�û»Ç�9g 5¾ˆË~?à#Z9UbGÿrÜD)q(;ÏõAˆ¥Jdã ôãè'ÝîÍ¿Aí¾Gö<îŽCoûï™EI7šŽJ@Û6Vºø:Â7Bê–]7áÃnmËÐóø…Ý�¦×›yÇÓÔ—­×ã©ïŠƒSD¯³WQígTF�SCpª)™§`¡ªw Nƒþͦu´]# GChvQÐå2?ý³ì>õYÛÒ�¥’ùí”ßT�czïòùq6Œ£R âê¼G ×! tvF¾ë&ãg‰ëîM»3zö:í€vþ!«xYc$n-8Ň!OÌ_+’æ{á½c…u)À܉-'‹c¿6EaÊ4y°�V =ó²ø.Ðb)6iÊ\„ëÒµÓý\ý¬gÀ“ÚÌf:PÁ]ß�¤´Øo½÷ŒêspŽáBó<7ªÃ¬‹þP».ŠœÊd÷-?2š‰¢ÑAF·}÷T}ðyƒ]M–½ŒÑ^cxb׫ipny6¸¥¯ d€¸Îà¢�À�½O� æ jËAIW÷x¡-ƒÿ p¸–›¢zh%¬å²ñ"Y� ¡î„8).Ò™³*ϲ�m€ò]C³Á¤Ë,Þaý3¡â”�I»¯HêÆÇòjô‹s: [Fp]Ô˜î’6À`¬ ´(¥W³aAƒÀ¡3äû>}í.‡šÙ‚˜àzæ0Ž¥‹ êâs)_O-{M¤"yÒØÈnél[²ðÐgm+•Q†5<Šc2Lf†$‚8!¬¸ÚM&UñŽÀHìç'MÛÁ}¦BHâ,y§×Ç­=¥àóÍw�Ža‹Âf:>4¼˜Tˆk…'#/jêPÏ#òQ&bu1Nxf3~Dq��C]=ðW P�ëxìoÛZK|x¬**™ .d³¶,dU‘™œG/–bé gHûÒ0Á›ÏaÀ矶kŒD2„ÍÊ|ð "Ùîâ8sfØ�>ÁiÁp7JÝ4tÍ^>ŠXe�®»gFéĬûPlüKq~xÛ—úÔ1ý¿ˆp:_ìò/»–Xç%h›X`+6îìþŽäDR1µ·ú?¾ 㸪³w5›DaÁD²�ž�¹ìåß$Ш([{Á¾bD&x¸.(󃧊Ch =1­±Ðä¶©'/¯ž%ø~u«¦Äà÷'¬Ëçš-t;dÿs™¦B‡sz4Љñ†áõpoòAÎCõˆC¶¼šg<ìÅkÆÌ»Á¨xCÌP]3Ü«âø6@VF à–çã¡G»ù¥Ozql:›ØÔyWa­ N‹§¨ù{#>ƒŽôRݫ ˆÉù#Ä-Øé ÇsfÃC±x†?ÿˆç¹-j{×[œ³½5wÑk'ԢЖ&ékC]àOXËx¡¶-̾]î‡yVM)ŽáË)±ÿ[X\E¼ÒmŒ¸©ø¾ skwž=\gÁ;¢s:‹ Ht=qõ|m ½…Üý™c’êë,œ-|¸ÜKÞM›2·´|&Eñžx¹G�0ùöYAð²ßaàIš`5²äínL!*,–'éÉ`®�ÿíÝ ZÁÈmu—Ráô€O¹•²¯ÌÍ‘Šmú=Bwûc#q{Œ`F\n$Yâ†?MO ¡¢1À£¸ðè‹:¥¢ùXÎ@›Iß6ÆJ–çˆ�UîÄÑÆ¶=×»tȘÁÍ�f&{Va»üNüÝÍ9ã)F³M–ØfWS1ªêõpJ–,†ô"ÙÚó…-iš|³ƒcg'(½øÎ�Š0 Î…änæF!!Ãj]-´„#MÁcž(pÍ­*íKØ Ê{ïÁmm ¸Ò]M‚�-Šf ¸ ðLàŒ”ÏºÛˆœµ!� ›]%�°ÉtCXÌ[‰t¾;ìWcòàÞÄ8zC÷/‘;%ël�‚\]nLt¬Å“ L½’ƒ�{�ðì‘èá�xx›nâÄ6kŠDFÚyZÈA9ï>Úz¹NcM½êãCAûXc¸¿ÈÙ KÐA Á–½`à©-xÓò8qšÇŸzÙ£ø¬1ËóÄÓl3\?Ö|¯ÚûµúUó·ÛxžoìÎ|vöCºgH }| %¶>šP ‹F �°I[4b´oI¸¶×tý£ßvÑ °Á¦în!þŠNà)Ì—}éQ1] •XâfJÆÇ ¢^´©ág:àb&Î…gÀ— �fóÕ5ådòBâµÒ°ý— L,ÖÜy» Ú¼>HÐïbBnë,"Í7þó„Þ`Àç¸ïR;ï"6‚}ír†ÙÍí�E¯¸rgoû,°0àKÅ•LIÛ$Þóü=’î¾Ñ�ùg�Û•J£òú…æjû‡oÙ¦ü‚õù€Ò‡K73r‚+j¬åÕ�Z}èø?Ac) |Hʈõ½We7U!² j“wý½³8/‘(|4Kä³�Ãúi‹ãZ{ÌÄ{êBÊÈ)k±œÎ ˧�cœ!÷ÁÄîÌâwªÉ—C(N×£à5qæ‘F cL9¯0dö•jçW2Ÿó2‰“·…J¼Hpª; Ó©¦c’…FHÁ댑c”ÝÚ?]Q)UO¯?ËŸãÌå7½åÇ1]ão”t/Þg?Þ*ŸæS3(Q‘oꀒ(Ùy7t„¼šr©4}uo1…+ß’šh%pˆa4î×:¼ÐxV]‚’![ŠÆÑWÑ:exnj郓FŽO38”Û®i M¬™áRîÌì�ÜÙ”V´’ÎHOñžyÈŠËêu|ÒTѯŒšæR‹Ìi‰…ë)â… RÎçD(‹“Ê–Ù ªÖ«‡<$xYxlJ):=Ùü|ó7%ž_ÆKbž¢î{+´k�¤m ıï&‘,g;S nÝ9<Ó}wòµ÷y®÷œ£õVmÜëžnG¦iÛ4|¾â 8™Î£ ¡ËX­ûx¡à|ç�nÑRë›N¢ªZFR/§ËºG•Nþå› %áö#±Ù¶žKCȲýÉË�3K&ˆ®è$å$n¯¢½ê}HÔåkì¤s( ¸Ê¼Û,'H# ¼ro1�×ÙÝkz„tº)�,á!µzîë±rM�Žåµ4ûâÆ)¤ÊTƒ¡Í×� æ3@Öç%ÚŒ¯9|É^*÷6Þ]*U�KËòí£\QO ¯C9¹= |ìòÎWÛN jóŽ3>Ki4GŒ63ª �æÕ§0ˆX>J°Ž#¬«îrVzcåæ”uÙ—IÔén ¢•FsLøÔÜ�Õ))]‹7xwì)UÉèòd2·/zŠïvŠZ.l)tÌ”¶‰|‘ë[kÂÒ"ׯBï²îÍåcT©%rt7iáT4jâìâŒw§�&ÐTÌY,àbs7L>,«5 7˜ +‰B¹Ýž2 ΋:} ƒ+í¸Ñîµ,àÃæŸ³{�q¸åSñÕ'ƒ/¾×c™¥ŸÎ§uÍd�ýP'7j/åÜ¢žU#Záaw[+˜ÄêUbŒvSKœaRù©ÅBa8Á°sÜö{‰gH¨*T0ìs»•fãs2×¾.%3eI¸Yçf’܉½¡+ÙÞ±—Pfbã”:3}_Ø^-Ý»Ïp¸ /žAãWoš¹ IS(�ZKÒeP£Ot&„k¶2ĵPÜŒ»°¹Ñ¥e8çsͶ˜"™ŸtI0oÄ8ÏÆ0ë<ä5ˆ×ýÓNõ ƒ)ê+NIÓíåZët�ØH¥&╚~Æ– ³ŠM»ßC>b2wÉy“»i|žÏ6vô3bh\ Ù™¿c-k÷JèóÎ#&�×\£žÚ¸³–)%/[#BX(”l؆_opF˜r±°Q 0þI©sešþ,äÎ7‹\”_ Ûå�µ£Æ�(Î=„SŸÝ–ü}@éHöù@„ŽMßðVN‚ËEºqõW<€oÛÆ<¾¹ïžacºB&Âj–}½üe›Ô ¿„e�újLȼŒýâͱmê@¿Ó›%óQÍjpWfåF ¯%»ÛÐ烻Œ·µVÈ+ÐÐB TV‚r"³ÜÇ+:sé™iúã�í�ŸŠfq‚M™}ìžña&ŒÄ¢é¨w›†¸¡-1$Q4ƒ;qÊÑ¥]ˆVÎMpIcU? a.¯þ£k<Æ#äÚпWÌô³R‹…�Y?Û,ã&–�c!ƒÉ&u汘æ±m�TzZâè¬; ^çICO*¾og, YŒªúÉb¤b=µdc‘i?/Ëú‰ÙŒ'v1h†ˆF2NÊrõT¶wÑ·PCþÊg_v½À£Ãq™å‘�xº´T{†j¹Ãå‹çôÃ;úÑêÆ¢Nìʹ€�÷Èkº½NöyÞÐv»;Ü¢qVôÚàô¯q|Ÿ<�-ãS΄X÷�·¿䱨„ðÊ©™¿&•rAç,®‘ò0¾[ÆÅ¡äÎøÐaSv¿µx`+̃<`¯rà GI™âêÜã ]½¨šãcC¥”dm÷¢‰F’¦Ü\øo�Í séX_ù¼qöõͺÇ×{>üóÁ•c#Ô?H`êéëãôÝBà�%®KÖE¿Ú:Këe  _¶èT¹�bt×Ý÷.e‘³Â9yκâVñã¹o=ÃS©]ßp`åSÒâ0ü[Úûq­Pá+¤òrK»6kŠAÅE•ïK¤xF”‹Ëׂ½Ñ›@+ˆƒÝf鎨‹@;g½�¡¸¯Ü=vPé„N!Ù¤æ@£W�; ´˜‚ú+ÌêÊ]+:n‘,mc\¶Qd3†Æ Ä<—˜„¬·ù"_û ÷Bá KŒ“0åìŒ66Ÿ¤V–u^P¬|k¸ÑóG¨w�Ç'+À[¹x¡µCI’Ÿ±­ê·JÄžTcœ1}Z×{çüJ¿s}íñ}OŽàôG~QCô�~3mì��Ûkqž/o¾x˷߰Є*Ã¥6$÷ ¸BI…Ñ _]ïYžBÆ!3°óÂ6¿Ô¦ŸŒó¬� ïÉÙc]ŽyM«c�dýŸqÜÜ=xçà¯ÞmÖÈŸoÏ`$oeÚþß0`…æNûå¼ò—E�e4Ö¯;z(·‡%qD““Î|F[a½î×/5IB÷MÎh÷)ö4 7¦¿àê,ø¸-�"ÈД0ËNxf�,x¤íï~æ~¾9¨à”Æ÷¿µ¢([¿80oÝXê:ˆ~ß»GîîÔ vìä¤ÄÜŽÌ4Ô4§°°:6I�Ó�ùÿ§+o•ù>Jf|Î PöOþ�!MHGC‚Þ*ƒÁŒ¡†Èmë—iï"IqX/0Éz÷Í\S÷•¶ÑY«eÙ8 ÐýmÓœ�OWè�™-®2�-Ó<å³íxã}׆In8AmæyÍ?pFãõ‰L�×áü+Ñ'ŽŒþÙÅ­!ÒØà5&Ð4ý% 2}+wF èhc`8¼/½ìOÇtÊk{›%ûc%ˆSgq0M{I°R¦þ!é—!ñ^)=é™P÷xÛò™�N”ÕI?ÏWãhšäƒëì—(ryl1•²„dç Í^x�#ÔKø™Ñäu ª4JBÒA{o{i)yhTʾø vPˆìóW®–ÓÊñ}·ú�=c¤9C.IÍøkÈ׫e¤�´qŸ7vSYZé:í ñαò1}ÑîU~Ï}V]}^jšlüœíã8e÷ÜÈ�{ÝCŒdž-wµ&pWl—a›d±T˜ÂËïDœ˜=6eW9n3ª$˜Ž@æÃ‘ rD&k²t‚p¸¼“e²ûßÖØ-sÅ»`0h;[ rÐ{®YÚ#£ kvè˜uÑÐÐ$-¯.=7[«c8üWv^;BŒ2î6ÖMé’Q1Ð]´ÖF°4'µTéDJî<Ó_›WÅîYówÍã™]æ¼óu$\„I^1bð*Xe%ÈËÌÄâ°¡»Ì^2+7kØÂžD¨QªŒAàùØØ×4«�±ÄN7ÐëfíýŠ& éÝAÍϼ²ã ]+ »rîÐQ‡´è#•¹ ©=!ÏTº/Œnr&áÊÐ’1"�«Em_ @ȼl‹q¨Mº ­û§�Ëß¹ƒ¼y_ók™Õg­¾Ó,�´•,… “�ÅžL²OÙ1¨=/”BÒ¡‹ÎÇÑÜ'�/u?t@LJ¦Œ`l¡="‘ô#2zsãY £ç´/çqLQ6~âÞ.È ~‘¼Ô J<Ì k¤™’áÔüºUÒs|DêüNÆ oªÌdj„Güšé!Van¸9äóÁ}8Vî x±yĬw`²XÁO:¶Q/¡«ÙäËåÑGÈVwŠlÚÉÓß2<Ÿ¼t!ÅÁ'„VX×¼>˜ëG�€˜ÚÃŒm/ØpM¡Ej‡­S<Ç¥Ÿ9N¶Xs³¶™©S(:ÔÃ�K^® Ý!õ~?•RÍëÙ4q:ÿè‹ýÜgWÅçÃë'áBŽÙ²$3ƒ†ž×™jxó"úÄïnE>'ÖÛ �†ú#Ÿ±ìc¡Õá]k|íµq=Q¡cÄi�maz‚îRÞdàtåSÚ$ÌÇ4V{>®�Âìc…“’H>§¦ð¥ÐÝÆÉ�DN65| w¡�±3­O¬—åiŠðòÿë]‡ôõç< ¤Ê8TØy�htÇ»ìT䳬 IÞÂð»rbM÷>Ùú&z9Zè»çµ“Ò:åø¼cû—ï•[¹Ðb±&Sº„ùñ¿ K«>8�\õÏkØóW¡ñkV÷íNʵÛè+°¿°^$Œ¾ oÊëâä(ìö>ãÌ,çÊÕµ\è¿gsxn:¾[#å¾|[ïÅ.wæÜúîd4 A‚EÞ�i˜q-¿W½>)h?1Ñvi\ÐöÒ{`¾O3]‚ð`Q ³î!ƒ•¬/ò]·äÌu+üîòÀç9n—lgqLDÄ­oœz¦¸Ò‰Œy¢n,JzŽê�Ñ®„Žˆ.Z¸nˆ“{êí´=¹Ël=TË_¢ë ù,ýÄçxæà¸ÂyÏðXp*õý)~¥ÎÛ@{'Í®ÒGvð³Ý„D"2�Bh¼‡�ÝÖ�ÎO�Áãï§Ž¿ŒµŽÇÙð˜ß„²^ºÊMÝÉØüÆë|)ø oŠ( ÂrÏÓÄË]-”ö›®}½å:žøù ü2ß2;o;\nûc+:aO02öé^ë¿{ãs ^±ª2¼H~øŸu¤i>Tîê{Ã߯ú'<¥XvqÔB-nøh_©¯ôý<Ý+çðÙû¿ßŠy�”õÊ”cA3¹<”žÓÜ¥ƒíѧýçèØFÖõ¿Mö€Ä0öüáÜv6ÿPä=¸wÏõQœwi¡Òn¶—úáä’}ƒ1Ü ‘“Þ¯Ú°|t†S¡:8 =vƒ<0TÓHJ?„Õ�›]øa:�xŠ«Z„Xe¿+³GVBGÕ9^O‘‚™1áÔ�`´p8b´˜ki3ƒXÐiÒâûJœbIe�¨= ­×ú$™-êøM¹pŠê•¦@Ç·¥Ô”31Ùi©�M³¶�㫃ÑÕ9¸€¨¡‘Zõs…oŠNâ—¢re+a­g½ùypÌûLáõ€¬ÎçÉcsݰb…!¶”V”¡D}n�JÞg'ðq§Ýïûº)Øå“­ŽÞ(úGÙ- +Gþ(z¥èœÕ�軓óOÆTa* eO*D–ç…8˜9áø°Øçù9Ñ“ì4žÏ ÒHð°ò\’ýøÎHFÚÆLf7íü£- ç'˜Œåu‘5t¡†`P6Ë JÑ÷²p©–RÈnK Q{Œ¨b‰D·}†ŸGÑ`xºÚ.e€Öÿ}E¼ üwŽ„+î1½¾fBÄÀ4Á¶R-x5v¬r¬7¥Hå—äó}Z£2kw™jO!†“´ó˜sVi|ÍôyËxÇšê.4Òoç•ÿ±G©¯ö5·ÁZŠó/¿N››ë¹±ªk&�2hÖy8N“%ln-¶¶• -2_ŠTµÄB6Oõƒ„Ô/`a®žÚ”A3ýd’°6~É�µRÚc861kò!@-gg³Xe8Ø3 _îŽRiÏÿh.îƒÆ‰°ÿàhò?zaþ؃ÌïgŽ¿`†21ªO1,GÇÎën9ãç}Mi.˜Ä1�]82l1$¢9îMÍ:4þ!茅 è�li¼n×”¸ ®àzx÷‹Œõ”}îô(½SbN]’mʼfTZæf×À”’2vÔ—r¬çôÈy ÂHã‘ëí@øeZÓŠ”ú!#/ç\£ÌÙ®&ÑJÉE¼ÛÞ»ÓÊ=§oOoögú)Z¯¤ž~Äu™Š™&1‘ð­Nãe‹ô­(†4\x©†|auGëü‹±™‚�VD Õ€™º?kº%ᨋ!¦µ¿½û5~Ë(˜ >½Ú?¿:=È€&{n¢¹Û>¦¬|²¿žÖœÖæt hk966Ÿm…Ô'žŽ/¯Ö¬eï\åŸÝÂg0×Ê©ð¯£Ðò“ÅúÚ彡¸¶ýõÓÈ%*¶¬´è¦0JUïnâ9r°›—Þ5üêб¿®Eî3”ÆÌÛJBµê³‚0Yo<©¹¤œ�[tÜBæ%^ fCpB;‚à ˜r9B¬u»l)ãÄOÞ`+wóð~1ë ïŠÛhpŸî«èXbaà)”NÛD<ø'�œ“'Ë3… Ƽ9iQ7Á–;:ÊÖ#q‚ÍV±Rƒ”^t "[˜üľ– *€.·Ø�¡·´¹Dî_O)ÞæV÷—‚Ç…ì ôïà$“-ïGbs}n‹Šm’ÕïUñ»2*LÔŠ*1³YFavH¢ `¹Í$ùJ{kL¡þ)/.¼·Ìè͸äу"n¢Œ¿�ÊÑØÙÔcZb¼.°à±=Œi;eÚûU$ïaÜH¼, àˆp#`­Š¸xî˜/J‹Ð"×2??.9yS°¸ì÷…x�ËyŽI¤@÷ÖóerGÙª¼AT¹ÁB1yFÞѾµ'c¤uÏIVí yJ…0]ïÖ!–_4ñ/••vÒ>FWk¶5±F7pç¸3ã´Ý·8s¶^¼Û}ÉéÆŠ…£°¨~ƒ;;€“¯8bI †Cì¦Dª÷ÄúhŠ™ÙÒ2¶?Z×ü,O¥~Ó&Ÿ˜=ö¬$¢ù-t_ŸÏzcטTþŒÖçB‹¯o ò0yߦžÑ÷¾-–áÈA`x� k⫳�ÖÝñþ†ïi ‡k£Vý˜bÑs‡ d³á0wŒÒoH¸¬Êüïê£ÛÓ$Žþ»0ÊI È©_šèꆙÁjNÎ&Ô�»ÆÏy�Ú]ð³×ç�Y¤k¤È9»øÙŠÚƒ‹ý–q9æ§’~Û´mò‹{OîÆ|ÑTdOx»4Œ�hß·<üÛÌN5–gCÿî~P‹ŠùÚÕ£ü�Œ:™§-”þÅ%Â1æô÷vd›*|mÁû¤€»±Ø¥E�§EÂq²Áœ�ÝÓºI~‰3Kj/½PSÉ%ó â’_Æt=^|_¤v—È© ™b F‹;74¸‚²i)ˆ”ÅÄs|¬ ÎÍ*·lt¿JYÊ ô0Ò3sèlm*3lOwN.Įĵ¥,8ÛŸc7fkÔ»±Ÿêla]¤<ëcÐ.üN6ËnšLŒ‚‰šÈ:E ›ÔØn«…éʉÞFßç¿ß9sjM{­›§W±ˆðd o4ßÞŽdg?ANþ@‡2“á+Ô�µM„4àAé³^²¬¦#±²nƒBtÿyx 2Ä·Á‡É•¯ê�ÈAè…L^5×Öˆ�‘-‘–}‰p7^ ÷ÇAŽú”üÅܪ,1Xˆ_×�EÊ ¸ DK¨»†êL~7†óH;A3¹Ï°Npe�Ƨ).þ:£æ‹ê¬ù¤&îS�/F£ðÙ½õ§·|ø˜{®Ã|K?zÜIäu�¬Ùß¿W· ¯VœzIZñ¨Ôx®õlØY¬AôYD÷�€ìCÝå> oÍ ðz ·*Pc¿NfSÔ{2­˜½îAÀìýÌœuYX¾ÀøDenöÒ�þåŒýUŒh÷�U²[OlFGÚuN}E°)[F\Î4Åê]Äå^꘽b=Œ�¿Â™~ýŒ3ðßPß¾®6rùR¡½]¿¢sJO%yUËœ]Zeh�§Š›e34–f1£ ‰'4 åË·ø0}Z¨¡ógÐW/ªß–H_‘÷Õdþæ=üIƒ%ŸÚ£ïŸ­ ±óX[Ÿ¼¹ •ã7RY¹Þ1#¥“%˜!ÕúUJåô¾dO€w·ÙŒJ…zo äðwEFha´*e¡¤m˜7ø ØLNŽœEmø[b y·½ZGWšµåXÜdwâܼšŽø'Lçù›Ÿu g�“È32YYqkµ•Á�ó:,�ä⢭U)×aõ«"§tàÀ Ûçûk÷?{Ï/ß¿{­u­Ïú<žü=Ê�©ËÌ_N(…ÅÞ$© [NTž—ŠÐ<6Â-Ô@ä<0v‹9ƒKVn"ôÔÁŒ‚c9 (�28”æœ-y7«nýžH™äÏUÃVÅæþ!UÙcå&LóÝϘ7< øÓg •°’¹Rð‚}`Bа=~e´ Xÿ3#‡9�Ô@H…¿7ÌåÊ%mWmâ-²›$�=¨¡6”O„@í�ê¼BEgXTˆ¸z 2Ë:V_)‡Í—V)i!*4’#Ê�»(^ùe‡íÿ¢ž_>ö®ˆ3i$tb›H[ö„ ®¬ülú‚~iåüª›vÈHY ‰€µ’ÚY‹lV›nᤚ£ÌÇ7û=ßãè$l͈gËã«÷o" Ø‹´� $ §V_#óý‚ƒ¹t�DÐ%ø¿…·hûéZñšŒÆ’m =z}x“û¼WâÅ%ûu5ùø>Þâ³Í!fú±†Ú ¦«†�¦¬�-S^o]¼õoû«9 Òbý“"é�×tËßøw=Ïßó¡ùv¨óIeß 2æE$>Þ?Ù\ð”ùâSþ‡aü-ˆ|ýø¨ùê¨ ¾Ñïq\Ò „…»OüsÆ«…'l½Š=æ†oÍÓÒ fÄ׸Êõ\f|A‚BÊn’mfoõþï72ÜHÍŒ&ùÆyT¹§¼–ÂgbÙ_5%²%{¢ù:7}Epjšžl_„7KÂZÚ �‚±*?'ëÿyŠ#%Õ!üCûM°µ RíE8 œWoŸqôä5†ÀÀͱ³¹íÊ6¾q¾ó÷s‚˜¡Ÿ£~_¤>!�Ï�Ãð(œFF�v;„éÞ3ÅqJ`Ñ-š^ÃJÞK¬eC¶"X-š»\WnÄØÞ|ñî Áßóå—‹‘[ã /£Á/&Z™F—ìðÍKòÿµÈtˆ {˜H?´‰:»yþºÄJ)NBгG·•«A®œlJpá¬Ýóœ$ Ù³1£·;=!�,ô"�¾ _Äq›Gêv¿Ÿ…ÞŠËP?Á`9p£°_pïæ· ËöOÕ³N-.’yÓŒ… k=L(á¯}¸òç'1˜> y¹Þ/mtÙ“^ÿ-€ýsÇÀ‡’\á¸ðeø£R1t÷aÇΧà Zù#Ì^áÑ(7i ¼ÅzDhÙfÕ¢òËËK„½Öé;09ij¹ëÈù‡Ÿ4Y³‰ö�xr7>”RØñï° þ·¯¿«AkoŽ'®�÷“Y¾}¸5´�ÆwßãùPÉã|ßj®—…ôø7z Þ¨T/ÝøNOÙ}˜ô�#Ù«‘96¤}ð«5ãw"Mè ÖTÔ°Aô€M•6{`ã¾x¥›ºqG{ÜÕt8Íc¹¶¿UHKÑþmƒ�ï¶>�Òý�UðÿÚ²D[ú«¶/]f-zÞ°�KjFk/éUep,LãÔZÈt/tÓân? >,œn�õf×D¹¨˜â5²¬ÚÃÀ¿ú�‡£ Æ?ˆÝE ç4_bøÇu›ô°oÏŒÝLâÒž¶Æ¼×[”¬ÒýµÒ×£î$$$:æ #r H&91³‘µh\ã*Ú3l诉Àâ¶o¶ÞWŸQùö ÎŒZ_=�Ÿ‚¸©Ú+sÝþËdõ’[„ó™Ø~rÏóåñ¦qЏî<ÿH‹ ­fOyØ3xV_ºKgƒ}6©=ÅÔÚ,@e©*m»‹hl¤µƒ ­êÌ�°EÀÜJ]U�±)uÅ÷|ª:¹Í �Iš¥QXÄ_�%ãsŠ‹Kž3þ’~Êu(q®º�×eKôç*7ØÏm’ÉJÏÊ…!’+r°~–ëJ ¦ÎR80J˜ÝñÜVÊÔ»ÊW¹$Ñ\µ*Ã]©WIBÓOQ/àËYÓ·…ISÝKyŽE ä óî¸6°�I¤àpíKüCÞböå¶€ ø'Ï·€üÊ { çú{zà?/nEÌò–[¹¼îPõ#Å£{ …Þá„—xÑ<_fÓ¥ Qåpu7‚ó3�¾õ{sßéI†¸)°Û;Á�o<<ú�ÃÉÈæ­þr“ ½»V#Ìf ¡�¹è®ç6,âå=mŒ¿wyKIc[IPx½£Ò³…qrÕÅÔ”5Ñ“84†ø%·«°LÁ|�ñ,ª' ôœRk¡ ¹ÆiÊPúQ¥¸‚› ¶bçMCÉ+¡à•››U”¬uu ¯±dqžiTÄGX°|ÛiãPyn±®×Û;Ч>W¦Þ©@Øð“k£³ÉøÃà¶´¶„˜<�[ÌDï~(©“ÜX 9ô³»lš«‚W €›CW³Ô%ˆž� 3IßõZLœî0ëcþ9 ”7æ±×ÓÞÍ›\ИÂΔ¦hñ™ ]¿÷±Š€ï,ËÜwóødlcp5êEä©1s ð;æy8{G€J3i&Õrµ¼/g‡óÓäøä@!Ð5¢¯[1›†ìܵË^œU0…ˆ4^bOF\X[¡Óô^L¥Â[ÅõVH|ª¼¿#(!`ÃÜOaÓfþF*eWïÔ¥”‹?n_ yÎä\|w^cÆ‹å“ø½¡³®¹*=»î°¢ÚÛœWyLæÊ9~¹%‘îñMå{–ôM´*³zic8*LuG\5ãÃx¦ �¥\] Ù Ö¶ÌÍ•ÁÑYe:V��eÆÎ¸Sʼn5½Iîø» Ö"…óúØÀ˧Ë;PeÀßÀ9�ŒS=ÿ´÷Õó_¼‹àj$.„~ö›·š+SŽ,Á"¶ÌÛôÉ2q›%ÆïÞ\ iã. D(w¾9á´–h”]…ÙÑdZí±Þ'axÙ÷6¤Ä.®ªž_S²‡ nv$Þ°YeDÁV�èz±³ÒKBqU€€¤¨ñô�+Cë4}{»Oñ!|IæïúAˆß—óñƒ0}Íí†|í !÷4?gà¡Òöð†:XfÂ"7ß8K}]0÷üf±öÉõv¦!½*þŸÝ/þ êx€U¿¸Å|~E‚2?y�yÛ…hÖÌ{pæF øŒì�ãIt¢aîlÔil@�ÐÏ—™ö9~ÞI†�Õ8ÕÔP$  7oáA0µÀ†VÀ};&sݼIµðèŒëú~Äþâ½ú¢ Ñâg�>a<¦ ƯÛìiøt@ªAINI�dhHqïÌN3–Ñ�Íc#*3v¡5=“tÉäâë¤ñ’ð™KâûVºÑýÕpžPÞ&OÊy;]ŒQJ»ž‘ 0l©Üž`h\µ¢ó&^�ƒf(êÖ3*'·�Ù•Z:9!šžì/ï¥{cÔη_ þ‹_â1òÆ¿{Œ1¦êV¼Òûølò\Îü«’…ßoã#çFÀ.ï>ÖCÎtvY˜êè*ÙN? P° 7 Éì ňq¯ÌÚ‹mê²=ÆÞ¬›X«I„(5ð½§gÛí>„p±¿”g™…÷nAÖ�AÕàÜÍ¿Ûø,\Fs$Ó+ ‹†‡ÂȃÓ�ä…¾38ðé/ «•±qx3“®´|µùùà ª½Ò·m7õ†>š€;ímK~%ü}†^®gëô-y i7»�ŒÌ:õ´§z Ãס‰˜ê+ˆ¶�Ÿ]­6™¹F�¹’cï»`ïïsdnø•ãªiXè]›°níÅýL…Ç‚CóÛÞÁøG~Œ W Ê"Rs½u¦6“^F“–çqM�®£IéIVsá7¸j|?P‡à?{!ÿêEö¸™#—{ÍÞ@Àã(,\Jè(‰›*Lm{Ïö,>ßËüºŸ ƒ<²2è´#y»½DKA1¾éÿ±;Òw dó=Ýé*ùÅüÁˆ}ÊÇ[¨Y�24cv¶zÁšç ã_Üó­î±‰yKxX ¥kg­'�&40çÍÇŸ‘—ÊGš`�$6�#ËÑŸžMÐÏzкI ÍÐóÆ^ý -Ô¦_žZG®nûG&RÇ—ûýéO-D<´Aßíùº¿ÆÝEì°„méWõ>.¶»n HÒHKã«W‚Þ cÃK¿�ó}Fˆb!4 %éÚ‡”Ç^\2â L.m ‡ûÖ½·Š}ɧÆHI0`$�ñ£ô~�v,SŸ¬^¡f6ó3ÑÂBÛçïßæ$íïéYò6ë�½i~ÌÞÑ0{HÊ�‚ŠW»øŽ9Ñ´ˆcùE1&¬]{¶õ� &éHÁ$^bù÷ë­ÃG®zÇ>H*sgî�ÜòAH•äqOmo)¼Ûc ­®PPv•§*¾‘¦8\²^B4æÇªÊó}»b�nLþÞòÅòùÃÌáåc[}n—ƒ‹Ÿ‰ƒ�WÕUô•Eú$ã-{œŽ>';�z½òFV߉ŽG^ý�¶Fû„HÏ‘qŸJæ~7û ¦Õ|›Y*l3W6™Þ⫱ê? @~µam;,gŠ Æ7‚2,Ï*ÚïUÝUs®6fLU Úëh_ï¸Q�þËŒ:W\fBóªzì5õœ�ï~‚Mz=”ì 'ÞäjÊ«ˆñ–i¹B wýdñ6�> Dá ¦ˆþ¾ã…¯0òC}æMܳœ«ùäd¹°»› ¾B˜r…7¾£Èc.‘ÚåÉ2Þ}n± ž/=‡“�Í‘ÃôÕ}¼ûòìllÃ9!-DZt–Ú©�:Åð:K«#Ú5/+áÏÂkÝê>q‘ù¿»oG�E(vñæ�±rù·á¿»xÅ×'F{Ò…;y¯9že..ysÆs‹‘‰—GFÁ¡‚yÉ(ÿ¬¯o�0ÒoÎxûû³/¡¨w鱩é±kz'÷DE;|‘@[|v°F êÓ6�— Êý‡0ÌÖ~¤§‡Þä1¡¾ÚEÀ\å<‘ò/˜áQ°Â•UA8UwQt‰ŠIQµµ€lŸ|Nâ¦LhîOI‚'Š"G^D𳉟Eظר Üewfd/@°¯þ ó cw›’T�XçžkeÄa)ù ÖIš«ä„L„˜Z6f�7L>7›hx=ˆÞÔTðèf,žísÑUàBk ß¡g»\E…“&,é¾ý�/˜Ÿ"õ ™ÿ]ÌÙt¨Z=þðëS%ãZJŠ66«sRÊúQGf+1óÜe}ï³ÂÞ+Eù>õëÜRcº_<]ô±@ŽE÷ˆ*AQM ÏdH`yâ_A…,ž™­4zo®´.b&~�Š´ãbÑä”þeBéÕ7ô¨8aB Iâ¯î€˜×Ø&+‘fúövx¦ÖÎòÁHaM"žRܶ³‘eG#õæKÞž…+.�™�ƒ÷U5žÀ.Œž%o48ÄÔ® A½îå� ÖAÀ"Øœ&GMr]Ñ�Âb®aG û®¾îºü6.äáy¬c%KWTÝ´À7¶ôÒz1JÀŠ}]ïÆðåþ¾<š½™ ^­ØV�“8öéßž:¦¯IBüùWƤ}~%Œ1ÒŽpÙ´úW—h6e�\³$EånùìžtéÿHcÛ 1 ̤ƒáo~Õ°¡j^]. \ù¦fÙ²bˆ=gwίD;ƒ‰H×Ë6�§�EŠÈîn G� CÁ�#sÖçžçÃÁ9ܬÁ PL® K6¤Zà1t²~¦Áݼ�½æõ«ùnCÉc„raX ÐS!àÂâ�e³=iä¦(Ü" "Ä´™FJJ:+r»9w‹ŸÈS‰ …  ïý >í#—G?/ŠÏ•Û7‡É×Zòuß•ìŸ Ž’¤”:BØ”y<ÂeGL£K"»ƒD+¬ìBÛ‡ŒKrì‰ßìt‘½.\ëÉ…â ßÿ`(7 Í°·j°M'5Ôo¢FOºöÓta’˜ãg07-7eH!>|¾,Rú˜W� ”¾}áì;õã(OœQ¯¤þ$è#Ö�bæpA§GísÚ¶u†~=òåÙìæ±‘Ö®â�$·ýñüÏ´k¢©÷)¼'ÿó¼&ûü{zëm’ÿŸ¼#~táØ'êÝÒHò˜–òÙ_” ýÉ™QçzAÚRI"‚±˜äwåÎKÂy‘Û�7ŽV>÷ŒyÍóŠ',–« Ev™wó?Ä>P~�ø—Ý�ÔÐkS©¸9÷ß5›–¹s«äñ›¸–E[¡vúǬZßà‹�"ƒ[ë~Ó^e¤‘Ì sªã£+äì!.W¨W}G›4}âøö.ù�tZÇ7�Æÿã6— làï¬G¼–©Z‰‹�¼å®x&ÌNEÿ™£#ðÒ ¸ ±”÷wN@›t·Rõx¶ÖM+Ÿ0XyœÉ2�\f¼+ÚÓ¾Ž,íNÕñö‘"|Ý_‹ LZ&RÁ-av~Õ’Nt·5÷üƒJº'O·…Ë_ª8³‰lÞeíEØÿ`™Üzù!µ¼:7»Ú8|q¤?¸NCl§F » ª%&0{&­åT^‘?,kƒ÷·:߸ U”Ûáâ¡+Û ÊùæQt(™Ü�ÿ®2°©> ¶;{ú�®^§8-[È:SðIÆ1÷¥rôë áoˆ‘�µÊœGç±؃õŸ�¬l̉‹!€|)¦Õî­µL¯q¶Ù{˜ÄÙø[¤…‚[ Ø‹R)s~,�^ßi¶@cœÕ>àµç nýجv<ׯy1ä›:æ®u+&@z^èm8 szÇÖÞã™TæÒ•c‚å«^wÞˆgj=P!¬”b[.Ñ>›JüDYGi€µï+^ǵ\D|eîœÖ¤¬Je+"2ÅV硆/yÈÆš¹-`<úlÄj öªLD·Œ\8cð];,3Éí{Œ5î±Úµ'ÌŸ&A¾ZÔrt£y£�vh–r6m6U‹ Ùs N{çt6–cœ°ŸYFÅ“•Ôˆó‚O1quÄìî˜À{c#EñIÊщæî1…Ò–´±«ãÎ5>õÁÌ—Ï,ý?ö„œg@ <÷S± –ḵ#+•ktøÏ){�.*¼f˜¥b ×öÐÉG§?�õ„Öö·Á?^Uµ®^ïmùí–iÔúºïz­ƒ¹Ÿk}.Ý2õ¢a‘ñ‹ža2�±l÷¥|?ƒÂMñ@A‹×|¦íD<Ÿû@œ¿RM2Z·Ádï½ZqÆ[Ü€'0e`c—UI”ŽVV'Í‹äNŸ>KB{}ÖP¶9†#Ðl裞íå0ð ï3‘¨hÔHÐ=vùÁÛÙ_7Ðà²0%1³ زdÚ-ïä9ÒY»¦Ó_wgÅ>7xVV×—C¯Òíç¶BA6[Ë•±ï¥p‰°{¿_ eŽ—ðõb¬øÆ¡/ÄÇ=Ô ¼™Q+Ç•°¬:ì&O3ýÝ*ÏuY|éÙÂo_•¯¾óÓ'�™� ¸{:³¹´e$m#'S/RŒ(Ö…iË%8Ä�ØX –Ï5Ôl‘·5»¹àà/® D@j¯�T" L—|'’Ÿñ¿|ý=Í•é6Tâ2ÖÀ˜¼Öüs½É+ ­á\îŒfñžk0Ú“f½b4ë£ZÚeŒÜªáÊgwÒŒM:^&÷„h™i-'ëßxÞúù­S!ñI6ÎùpØÆÈ]5Ú½Ë{L•�•wN?z»(M˜^ÓŒëoÁ¾ïÁ3b» �%Õ³4¨Hy‰œ]Ç]&qpÍžš–ô_ÏwÀß™þ}ÇFI8©¿º©´È}m£«¦§-Küð�íâ­�ØcĦUâE •…òqq(쉃>æ“xn±6ÙEh‘ï«·7í$óžÜó‹óÞ^x£$OOœŽ�Ë»bwã{„{�÷ã^¦û”V�¦43Å&\Rû+ÑÞ’µôö7é «®÷8D˜Eß6ç¦Õ/�KÃBZéŽ^»r—>Ââï†D&NAºå&ˆÒã�‘6{[ÅÌzãß(À t]˜ÿUƳ+¿¦Ö´ŒbÉÁk´ê6šWñýö~ lÿÊSö}ûpeë¢G'ƒO]â}<£¯¶K%–ߦg ù9¢#΂Iéí×þÿ’O´A–èF ÞÏ´ÆøÖ¦ }õÜ ‹¤é¼Ñ%ûð.X9oëómú >¼÷Ä‘­7=õ üá*Ô½ù‰þœ»þ»w”uÊj Éÿ‰_qýZîæ™Uÿá•ož²úBf9@tpi R­$é=޳ÛºÄ&Ã1DV¯Â·‘œ¥\ä~ÞÊötÇ‹X1”Y[ä»®åÊ×�—PQ†f‚r 'ÉÔ1\´æNŒŸÁ »@£ã ÑætP²ajA¥{] JÒ ~1á ÷k(¢ªOþY·õL¤çŸ4Ë2â|À²ØOÃ/ý„g Ñ)2Ï�é-EQ&æ AJ 3ƒØ+²;ë÷Õ&âÏ20>®úÎñaKg¢Ó(…‰x,á�$Wj贉ݺIžqÚµý‹u|AÊÕ3óò0dIa KŸÁ‡£{Ý|ùÈ=;¡¤¾~ºd©@³Gñ{–ý¹Ä>L÷‹O»uöX X“ãÞ Ï*ƒŒª°P÷0ÄCGá·3Z÷[µå4›þµ—�rPÌ«HêæbK+]_”]ržö¢¥ ÈóM-7&ëŠpÅ€’o®ÆFw!¨6ÝŽÈØn9¼Æ=+ s&Kkÿõ�ôQu?ÅJU‡úgBñqáÿ‹ºéÞç–ù=´½ÿ2kƒD•ŒÞ?,F”Iï7 ïTÐÁ2Ó¾ìxbøLNpK´÷aÖý:§߂ܨ,±µÄl¤2áÙcšœhÀaîß�̶“ãH‰DÂÕûPHó”!H–$�p5”‹2 )c*dNXå¨Ò¼jþÌhg|ÞµæOüå¹°Z’°ö·Øl};]@Ñý OÞ·Œ«2`Sm=YÙÓ•�饔r÷wü§2·Ä ¿5 vÁ�Îð·ž ›éñÜ}á±Vk´UÃñ=öqër0¯_Íñ?ÎM�ïtoáÖœ?=„ï ”3V=ÃäN‰pªË—]êü#¦ñ(ÎðÐP}ɹlF,i!�©2zÙ*°‡’¾y`«1Ã0§k¨‘ p±ü �¨xTt*LTŸÐ<ÃkÏÆ�?¬˜ÊVokŽíRK¹9r­ Lª‡#“ÒT³D±:PÖL$¯s¢â÷Ìç +IZå°få¢"߇¨ÂXA[�c·0ú0&‹©a‘“@¨ÿÀ4KÒ ¿¼bð7Gr¢ÉN¼2V$òô4 ¼£/ƒ:?¨À÷gb ƒ¶qœK¿WóŽ ç›-ûM3›-ˆ]ú|œ¹+�ÒHZ0¨-·s ¾ð4;vØgÑÓÆ�m Ì@”¼6�Î2‰·Ij¤…r6á¸v‘¦ àO¹A}ŠÉ ö–Ã�Óœguë7±»ô:äCÙYäÐ sN¥2©`ü·ª�};j°�¬X©«rxÞü6¢án»öm¢$}Ü�|–|‡õ¬4××Ç®­ }û¦j†öf^ccB˜àÛc*/µÅ­ß…°ÏÇ€–K_J¦ÀÄ÷{"·ù×îE@«ì!qºf%§À1rêæʉÇqåjðz »0 h|ÌwR#‹Î¢ ¦>ä1ø¹ÙAõhSs�¦-û¶ÿðÖ2p„8B§¶DB»P´ˆ«�¦õÊoË#À¤U…XfûË\ü -þ€çiÂ2?Ü]ˆFÌ[¥oÅ⋾oŠc1Si8…]rN $¶jRå"N lÌ “±èƒªr@~´b˜²z£ñ ÙýQ>¤Rb»[±ïF!²;íp_ÇÞRÒ%b?LK�À²2©Oü^ßóu>D¬ïÔŸÀ Oó È‹¼_û:?Ög 2!êééÓJ_‹ß<]®G)“Ãþ2â�Ôb�Ù£ä1É\„®’Pâ¦ÆÇµûNtf©6à‘¡ÕêzèOÓ@ùþ]èlnE«ø¤MBd9¦ve2€q´®èýÔ…-þ±6ôCÛ�¾„Ø?Ò-ðhsƒ7 }îŽoN”@­ª”ýÿ�SðAزfVßÀð>~D¾ÃúžT`”L n4Ë_‘E~(VÎ>,”ÍÍh IyÞ"ˆX±Y ä^FŒ°‘˜vÊœÐC¨t ¿ýżJÊŽ»ÃÔ:‹f�÷ݦš%`¾È0Í«}rb.sµ{¹A˜y›Ç}.œ·ØŽ¿~òdÿ ÿ3d8ã$ÓÖ¶æÿ2£FñðßÉ ¤žÁ€ÚþMoóšûìç%àÐ",`—{¬^�|ãóXŒ®ùñÈà½Õd·ó>�± ‚µÅŽÎ!´ƒ3í<Áukä7dz@«å†FǪ¾%<Âò ãáâùÆœO¤A{CRGØ@6×âè¾Ýv“‚¼sK*„¤Š1Ø�.€KE¨†C ”¬ä'âTõ-¸Øü#Û *¼öv"–â�·{ô(náJ·•ô‚�Ÿ3ÅâºôŠäÇÜ:mT“婄 â^›/«å�?ü.‘aòNvôʾ÷/jç½B ^ùK¯‚¢/‡Ý5ÑÌÍ/ñæÖ&DHé„.’½Ô &�N'Œ[zó�¶H=ÒÛUf{…ç+K|]H¬=ÖÎå Åíë)!’‘±�á ”¾UÛåS²À©ø­¹zfŽ£owÂÇ-XÆÞšÝ˜Ž’áÝ*óÒÜüTǾûßö?ˆ…ýÒIW_LˆJÍ/]ªUÛpáüÀ<~þèà. wÇvßT¦¢Ç-(üúJëpÉËyl�ÓúŽ"AÄO ÎßúB¥ÿжìÂ�ï‰g·ƒÞÙy@÷vßÄ!@¥8œõ)þФ¡9­Y*ðÒŒ«ÖÁRQg›6k‚(Õn`æ¡ÿ®7]çzœÊÕß{úy΢n$¼6Ø8ìñOËé*NØc¿ ­“ÄŸ22‡¾%.öçC‡óÀn Ä2ñÕDÓ<Æ™ôñ>6 ×Ì®]ÕIâx=Ö"æ3pT%IðÓž²Nz!>ïœ2ÿÒ9{=xǧ¯{›ºöd$¡¥é¼vrÈhÍ¡öÁùè6Ó\ ]!;nkœ¼N1�O÷†+|ûÅeÕ™ò£~K7§î½eЯu #pÃîL�òCß›Õ*h‚JéLfã* M#árG(�±I¿'Ã�(‘VÜØvA eoE†k÷•"_Ühè|ÕôüþmAX¯¬+‘1"bÊ¨í­“AË…°j‘ªÔ†ˆ¥kÔ‡½ÓO¤18FTJF‹yÐÉmø÷ÕpªŸRÚäôN]xØ/!�„„3k !=‰™—U)‹.vky$²@U\R!h .dæH…Â�D“`£ ƒ[ÊZ|1Õ-0`l–ŠýºXO�=_x ~n>ø3ƒÓíÅìED‚I±†D¤FK%q\±Íìü�7š2Yt†cµ9Á‘~·6ƒ…�ùÏAP}.XÔÆQ_ÈV£Ámܳ:h8$¥² Ã=ÏþrÎÕ¨ É [E<щ¨_9ô)ZäõÚéÛ:à�Ô5òLNžŠæ”Vÿb{c^úq{�ÿ>®�³˜±™(nÆÍŸJ•Õ#•;Ô]Ò7CÝ$ðÅUÏ/Šß¤¼!Ft±2¾ò$ˆ²¯ð°ÿ«Ï[éðÄi„¶û¼u¶‹VÁ 'Šz�-ô‰ ×ì"ÐLÐÎ=æEñ©éð†/«®ÅÅàÓœ=äÃXuF‡ZŪ�|#9Ûï{o°3ø0N;¾·Ðýaêå¬ ÊV-³ïÛL�qÌ’„d)ôBñŸèù*¼»ýž—÷gñMFu°½û£_ f 8Þ4�Sð/¦!@|ͦ§bÒ{â`YH¬;³Þ·šÞ+~Ü``…—ÐÀÑé ™Bý£Ò‘:di¾7°ç�äœ{| Â0Xo5±Zî&ŒLŠñXñõ›ó™ ¼µœ%õåÓWh*ÏšÞ�æ:H�\ç�»cbþ•¤µ¼–ºtát‰rɪ ‡d6"^ñk„òŒ%±~°¼žAAøìÓÆÅ‘­o_°­£ÆWËÛ<´}.w�§ŠE ]Õj.ðGG­|3Œ+ñ,0§;â¿5Í02Šã]¦ê±¯Lº¨ëX)‡ÝÈ2¹+ÃI!QTPrMÛ�|¤b䙚†ëÂT·9‘ú(„ÅÁÛi�×Nè,lŠ�Å·E.”Ò5kµêªaá.·�¬yT4…z…wT²DYmÛȘxàÁ¢ØjåXNÅÇ»ãnùÒ}û=ϲp—Ì(óñþM¥É‚^ƒ �+±E±.4{ur†oÜ_¸?¬|¨ð\!Xªˆaü@O/<íû¡F¬³ôÌ7¤¬î«0^ªÝ™ä:»"M"¡I9£ÀcRÇ×Ó×û_²ÃVÍÀœà`§äÿ1Š%¸Î’Á%äÁwek‡do› NG9K5–¼ c\¥-cÞÖ �í®LdŽï® ÷¥lx÷¬¾ìu‡œÎæž3áø{‡�HóGÞ¸â!ùŒo~d°x:ã»ÄEå+JHÕ ¹à¬œ»��*&ªIÂržnEž%ò¡Í<\“Jpã†ÏXã 8e敯<&Û%.w“ñî5y@­ž^å“ÿy×áï1ZœŽûu@e¡/kgjÔļÄs‡U¤H„a:DÊï×F£¡áe×�ï—�Ç’‰PÏG'ÝV˜îÚb†)jqÎé°Dw”ˆÒY -¤· Q¡CÙØf汆¤½ä3¶ªv•J&m£¥Ã™nðä®,à�â/µ`Ã1–è ÚɆžy†#É�oÜܤŒ#x Ùö‹Ô½c|èèóÌÆìW^õ"¸p.'³®?PY‚Ï}ùªK ‹˜rDVÙ[œp– Ùê��P±�pˆžhP:¢êh¢ž×À+¿}FôÛ¼ª¿É™ðñR ØÊâ­éÚÒ^�Ì\È*—´/`˜ M4õ•¦ñI´W¼ÖKeªI™užâä‚"+.jøõòD~ D܈YÊÊaKkæU÷~Toû<×6˱oš²¶^œûöObOO�lÜzÚ{�Š~¯šÄ÷seU+ޘ躮 4¹p¯>æÆ5�`{ÿ«Á vÈ8„£Žp ©à†ÿDÏ¡æŒôm‚]Ô°=µþ+ŒØ­%ô°ÒˆÂŠ„0Bˆl«í¤~;p¿K‰È_ìyóöägæË's¯œt»I�µ²ÉZ:f.…oˆwgÒb‚�‚ §^š[ŠkË„ºŸˆ·ÂºÛGüfÏ6-åÂ\çèÓói[Ub fÇðpp’ Wä ’Yv×V¨†ˆª44ãTG½ž‹3ïú¤Ñ>m“ãÎç#ûÔ¹y”²oå¶"Æ(zýÄ[.qôÛ0 y´ È;‚S~kðõ…Á[�Ü 9Z2Â-Cf<>ã�`¢ªþ3·,5*ØÖÖaL´K i÷%‹ Ó3+ø”_†ÅÇáæÝPþ%-ÈÞÖê|Fo\é­¬¯¥/}�4fåÑ…\¨ð©Æ£A†i€B¯Ö¼¤ƒ”ᱤæøn'| Ñç1áÖV?®¶Ý°Þ‹Í€ñ‘ôwÌž[k©É Âz'§G¬¶Ü{})5B.dŸ\–-÷?´×³îýçòñË{þ*kÖ„ î÷㵦ڻï/îjÊ)°�û­PÏTȃû¿§¼óL«ã/�ƒ<×¹Ìg%¾Þ¶èÖÖ UUkåÏDgÇÕCŸÆ”qäœg2V]çîØ$À“žè…¬-ak�Bù‹ïÊÄ.GžKí7°yið:¨¾tîzŽäDÀç*yÀø!þX®KÆ“@s ƒ§¹Å.#ÉôzÁ5fûõážÃãy@Ú·<„qŸ L�tW8*©:¥qÏÓ`×L;°wߢ› ^ÝÕ·9�„>¦(¶one­‚/niÃ-2ù!�´›ºeL‘ÎöžK›ä¢|`ÎcXµgggC½�OÁ§8¼–Ü –º8G~.®WÅnN„mžTâ0oH—u¯ ì¼ t®$$$‡Ë¬q�b Í®ŠŠ·æ{YlÊ÷6opÎìi|]®§>ëëGsª…Äášøsõ�ÚóµcQ¬ÜKµÿ&Õ®w©Š>%I‘³øÚX~³fðÝE‚d·bé|êZ#ýfŒ…�šÊ—÷¤7.î]qÐí/¡ ºø)E7Ýôk‡¾1%šÞ‹M `¨Ö2ÇleGÄ,¥®œÀ�äíHêÑѩ뗭ô›áÔ2ˆ£½à VR�“Ú …3‘ùæKsöL`˾ÇçÛ ¨9Äaãó•ïàéç{ÛÓ OW)7PrìóøŒO^:QÞ¿…ëÔQ¿ â{¾�‡Hæ>Ï'´Afé9­o‡¾²„*ÕÏI“X¼=rƒèæÚuÌÝ}¢×± „µÊˆÑf�»«Ð=[M’ýÆ.]ë)PIÐÐ3o ‡��xÓ‡¢Ï¿âËwG¦),�vùŽWãÎe³¹a¢¾h¯›�N^K¨ßzPg»#ŸÌ Íó›*Er”xµ\ø ´^„ýºE0œí}>}\9�Ìs¡¶£:™å8S€„À<Äê¤f)“ “hÛ<%Ýý ó'½Q"MQ Æ€"µNe|lý o[yDZÏ­¶½«Žïž#Çr²xz’ *ÔÕPQÀÛUæh–$�?©Æ§Ú9/ŸÎõ�[ÔŒ’7�·ç� œ¸»m=qIÊã7X#UlgQ:¨ë=…G/ÆÎR¸ x3^N5Ê[>A³s²¶ÿ9&ãú$xb?;®WL.zÙbcÆñþ¿xW½§áµ¸�IÛŠ#2âTr¸|ü,qâëá¿!Ô.Ãg÷æÄyÜX;r1RžäÞ¥ÇÛæt0~Eó€ÒÁÙX ”ôȲïz÷ôX¥r¸“ 逬Á’TgkдŒ£›z—&`ÙRú&Á'OØâòe6Ž´é^ßyÖLJÐòÓ“-¿Œ/AFîx1¢pmß;ñ– {A&Çq[ßÞ�y¿R�—MæOz¼©ªîÒÆàþq¾øÎvaXÊo˜Òß°¼íõí1•¢ÚVF5UJèåw�44Á¬¼ž…· ÝÛ¤ų̀¢WT]Ê”s º{¿BÈŽmPyº�9Naå�ñ“ŒÑW6·Þ®Ì€£R%†0EƒŸËâ¾ ã&‹J x$êsËÇn™ï2¾Hw}ÅËþ?rçdnäk&uçÓ~•]s—ŠfÀºÄg»¸óXÞNZ°2^Î]pDDâŸ×püCBTÕí'Skðs ’ë%J5¨Ä¦Œk EpToóŠ7b× ÏYœsCíRÊuŒuÎ1qò½g—¼ç‹£ÝYO¹ð1ù^ù§·°VÆ©(Öé+�Ü?{ä=¬6,BxÁþòu®Ù­îŸ�-rñÊô=™{³Ù¬rp Öƒ2dßzÑ}ïNñ~Ö¼(/*ÄÖä«}ïž.+¬Ì— €Dåfõ î\Ø~“ÆÂ­¿Æ¶Ç¤Ð|Ûχ…^ \G5Ò1�¶næQ¹;ÎJ‹ÎWÊTWr�Âbëϱ¬:·”æ~>ôa«›!�ŒZt�ZìÇOƒï¹¬c¦òx¨ç&\øð]ýÄBô»…AD÷1J²j|ñíe@QšpØœÿR–JÊg‡Ò�"ÿkl•‹Òìðþ˜h¢±18aÆ]t‘+ø@öO½míãi¹’:ä“B-༸®ãMËPÍÑ@[ •ÁQV Hº…ĸ�áB7ÈF“½=‚ RN´Å¦¯üøg¦2Xc³ò\¶¯yæ“£pàÔÒAôMØMîÍD¶S”¿žñab!l¬[ÕH'ûnJ£n«< Á]NwzÕ1/dŽûñÝÆ9³¬;èÄ&‘¹ù耂?ß}œû‹‹õ‰üâú0ÃVô¬ì>Ϲ�Ró;}æ¬7d5ìù ÷÷Ï;z³·ÐóŸÏɳ½Ô øè-Û˜E²~¦qDi%iý]ÄÚû´|Ÿ¹°1 ßTµ÷ßѤ5!'æäþ÷ßz./9Ž_È}zhq I¹òr¸ią̈›:1ÁÀ îȹ‹Üõ™ÖG§™P�¶4üdî3:¾m�®¡-ôÔB|Åg%<îðÑ¥™ 6™´¶÷€Ãl%ã·G&^VŒú~yÐ)\O:žýçB&‹†%í@�¬MóqÚ1ëçÃ"6d¶‡�~‰D(÷Ñynµ|î•mŽ.Z_„É4ÒÏ!–d©  °r�r#jÈh§“C}p# Rz­z¸È#€ÖNF9Y+ß;»Á ñCáÁƒ)AÍppÔô<]c«‰ÊžÏ©Ý¶6»M¶Ó×Zë[ôÜÚ›NÔäÜoñûã ¹…@œzž«™µ7’¿»ã©d�1ù™˜ô�MøpÙ&’O‹Ü Ú„Ç#ÌZü7IŸt�é q¼Árž`×=Vmx=4À>“ Úq–¥v1ÆæGÊϰë艵tÏÏ[zßͦM¨ñ�“ܲ %ÂC®.þâ¢!Úømíþ?‘)‰‡ÛtŒÏ¥³"/1âc¸@/ˆ7À6™\;“rë!CèÌ9_Fšœ½ðóŒ:éÜ©vjxp��>�pÅá�’Ejä#FÄ᜙ÜЇ þK]àÐúÇû?X`™•º±¢dö–Kïû­–Üf“˜ëÏp{«[ @*X‰A �_ mß=Aã4DˆÏ”°¦lì EuîátMEÊiY¹í¦4¿×%ëûIëNŸÊDº’Cütˆþ÷Ǻ¾}_W>Ó0Ò£)ME~^’±ëq»yÒ=/ÿiH:ÅGO'ÿp~ãùûjÏäë–Ûˬ¼­1ZÔsç^KgäJ=µUmè—a!! µ{*§� éXóbQÝ ÎPîp@³HͤF’ø*´JZÙi)^Є &–µ,$¬˜@¥ë.si$�-2D´ÓwMtwŸ¾úyüu§òÒÝO÷7yó—Æe åz$V2EX9ømÿ,âO�§$£íO YI£È+ÞW&®ešË˘®åºŽ§œRldóS©«¼¨,ÿ›½ñš:éæ—†¬Kï©ÍM"†žÌè�ªÆJU_WºÆˆÛ—»2ñÙ1�¤´«iu‡¡4·sZs¼J«EÅÖÍÚbG“#Ä(Ã@Ä÷PØ­äçߨöilxLÄûöTËl)iⲺ")ÀM8TLÝr½þõ×s¯·îgqêó\>ëVj÷©g¦†tåE÷‚&–,¡ªà È)æV�Î]@Sru·'¡rsüiv¤g0TÐ9ÑŽ$ œÌ'Ták4�‰ÕXÍ\pÕ_iÞ6↌gNÚdCœÎË×Чvi*„å”9>EÄÒS;ÉC‘>®YÃ"äÐôHÀã=<3¿¾÷¹�Êæˆd1pÙMW4Nj$®æÞºÊÊ–"eò=Öo5¸�fÑ–fPêm"Â�g¼ ^s~®ïODâ†:>ªpc<«æù3\É|ë=Ò3—a˜¬D •šÕ#G‡×dŠÿÚcM:TZjä,ö¦½Ô/q–¬ƒýGò?Ð]ÿ~áÃ]�mÔJèP0Zïz™3ž_÷–{$ÃïË®î_œ|·/ñÑú†æ¦{k ×sÙù¼Ÿ‹æ¯“~Ätk|{zé5¤S‡Þ¢Í3f%àêýÓoc0ýïÅEað L®|’ƒ/œÙÝš>ùƒ#×Ìî�RÆÞKÒ…€Õ{U^訑5àÑæ´üÞpqZ~*Ê"=NÏ{Í i•ìo¡;þ5D�ˆÃv†6b²ž ,¥A+FTê>c`Äo9]|¶¨®3ËV„†nÑOz¨9�­ÐòÓ� ™P{\&aCÕ2[M�ëÇ$>ϵ�ouÁ9‡Ñx!|-m+E¢±Ÿ|³\M£ê9 0=»\Ú³á½Ç8}äóL£Þï´AOÍ‚­ÚgÇÔ�èä¡õdHe~4q¼+Wâj6+ÌÜÍ¥%™&jÔ˜ ²†n^†¹ôû>»08lCn鉚××éèô/ÉèØÅØÏ…b¾éqÆäGw _¾©R "2¬DiÏ{ Œ0¿•kÂs£©ärèYÚ: =�–%eØO µ—Ïgb²íö¿¸0s_³;RìfgœÊ"ç)¥¶±œݧ^ò ûÇúïçKG7&—:™ÌÚó”Â1+˜(ݧÍÊô`ê¡FDXz`aVÈÅ7ìbܨ‘‘@Èv|Î&eI�ß²÷\=¼O# Ûç@üÛ ßž’Ϻ¼QùÎVîjgži›Ê°°ómÌÕ%ÛݵSkæüÕ^g]!Ó?gI0·«oÜH^ûwó[½ÞøˆËÒŒa}†ó‡>&êív.ÄðS3ß¼XK•·—MÑ0Ù_ϱ{šçáÝr×ÞÃ[Úá®±ÊÒwì‘áôìŸMêY¶þp°‘ÄKiÌïäæ•oz—Æ*¦ò×1bn"yÃoRÝ9èÓý(;óÌ%Ìp¡vª'G†ìöfž™.k*ƒ+tmå9Òµ'4-‘\‘7éÁ™¢ùVã6ón¥ÊÓVeC’fK^LÝw}Yâݯ�£“aSn:¸Z^+@B{§q‘ ’4Òq¬EX¹jIyŠ:Ï0z¬ÝÍð|7ËkG†òœÓÑæ©<ÁßwÙÙoÞjaD%;˜jsÎ|q›øCŽ´â/ Åç§Û�£‡²§G>péÀlÉBÃxŠ€-å8d�+3òíQD�o*X@Ü;ÅG„¬·¶ÅS^n’uËŠ-¹ú¾Ð¿ œ@” ‡�:±y ûîzÓbÑÚÞ[®˜ÖýîmµïÁµ|Ý'nÕèExg€’Û£•U·<ÆTȱešÁ3Ú1MŸwÈ`eòù- Y,.DoAo¬ 1©ž«î¸YÊók«�rú¹¾� ôÁÎ7ÑBWÃ7‚PY]‚Àe^²§§¬tªU-ü:wl‚*:’u¼‘EújKÑ«2Ù1î2Ÿz,�;¸ªÈXo‹åû­è»˜RÆ7×!Á£Áàb�2 õΪ™†øÝ2-­»g¡€A½$™pVeü£ÏÀ8² W3ŒŠ?–}¡ö�xckÁ[vbð¼Ó³ )¬”î2-ô ÕšåÛàŽÞ:hó†/÷ä| €Æ½‰Î®i=iÊãYòçÁÎëk_—g¸<ïM?÷Ÿþ|Óæ7öGr;ã�…{u8u9¹ü»µp"Å©Ï$·bÊ!„={tGºýøÒUû¤ðm­õ'Ÿ@òByß;‘2Dç‚…˜¬m—FÝôéÊ87Ïòð†´kjÚ‰à]¤ åÝ(ÖÌH]C›xí¸u;Ø‘×Rì›Xm ¾wÔcy3ÃgˆyúTÉ#ýXXE=Ú2—0k­®‹¥,y‡ Ân£ºá[C,Büˆ)—Š h^f±ysÉTPHG�{Š$ïZül.3˜a9Ñ[™ûµ½ g8.‚#–éFÁ6±Ë!�©ófEŸ_ËÔµÅzœAúÙG¾'ÞôÌ„`«máÅasÓ[—»Ö ýÙoíº0Í�ŽÖô‘q£ …gôŒÂågä?=|LÊ ^0EΗ3ÀYû¦¤Ku�5x‚ Ö|­gký\ÆwåR…ßQº õx¢G½±©ëˆ(!n—H÷taμ{ @“ïl\O/e÷‚O‹ïÌù�J'Æ‘…Ûì08EV˜ê‰ãô•è’Eî…%‘ð�ì7oç*Iöð<†Ÿš/ßcêÇÆßdƒcjÌBCg4È{ˆV‘½îå W<žFŽ2ò<íÄÛ{V›Mn¤û ‰aòzfoèJ<îìk§ÂLÓBæÌs ³†HG8bçàž�>â=WœÈÃyíý$w|��DzËsÿ´ŒQßûÚ¢þ6X¶ÊŸ˜.)=þâÁ_Z›-÷‰kX0é} Æ6:›ü�róJ‹Ó‚¯\YÕË„=½Xv8Ó•ÕÛsn¯˜ax;½ákßi[4àýórˆjÜ?:Ùì˜ÈD@.“)–;-בà$·<›ÌÜ©PR0/ÞrBóÉÁ…EçÚf£2GêÓö/…ÑÍ®úø"ø^–£V§‹$�áÛþû~ãtÛÅàq±ó뤡ûr¬÷LâRþ"ˆ2¦4*/ÊN;à£&{½ÀŸc˜M_”^HðBŽÅm.'6¸rð‡ÌU%¿´ƒ;Åò×÷­¿AÝAÝG‚Nψê)�!…ò•\9¥¬«{•´LCØÞM{α¡È\^Ï Fav[wáãSîl¸wþùC¯¼úW’“®©ÛÔ1‘)ƒ™×Úã7‹!€+AôíŒ#�7Ê¾Ü Øv®\¶9Ã3še™3ô�q ÚIy‡À£„ìA+¶5t m.rÂtEwߔݸÑ™4yD© Žœ×_¨K+µj†’¾0e„@±­LcGÇ¥Ó^" * "ëÚÎËX¦$FŠ@õ¾J?¡çñ�ñ]#Dbk•“yPyâÜLÚM¥q@òGÞu XÌ¢qÇø<Ѻuµ|cê}’³q… Xuó¸gq´òÔ÷n%ž÷[–,ðñ!²‹¦°ó§ù�óÅm!ZVµ“åZ‡Ü¦4%1v¿/<᪋y.DÛÅlR#¸¹Q˜êÉŧwM�hË—óI6[^Û§IžjûÖ;��¹!”¶â]¬02ÀÿÚ26÷ÝðÄaÈTRÔÁJi¸q€ UÍsÃDêöL™Œá™1bŽ“}e8ëoîëb+~³é¾;Á âÿ\:–?Q�¡«\ ë¶±¡Br…‚|‹;èpðCL=PHÃ�}iôª™ô/ÕµîÆ‹½É~õÚˆ5ˤŸýœ–'R%´›ØþÓ¼š’§ù¡._9£úy{È) °Ôúk˜?-¯ðeG| š�ž‡yaé!ò¶GÇ,mvOÝ>Oh© /ëÒ:LÙ9];KÒ�ó�Aµâ¶Û+�e“LÁ0â,JQ‹Ò¿ÝPt�L© é)ÎR �Zu­–o(ÍpÿbbkÊh¸™šâ…"þâOvuù�–³¹f*cõü{yõ6Š]+Ò?õ�ŒÔbÖßE áY¨\ËÙ�Ü ßðÍèÆ»yk?éþ” Rªµé€$;Š_‡ì·½¨ÕÜßó#¿‚«¶=?O:–ퟑ¼ý¨VÁ©´$aòl“ó៶í¸>=´5XÓã™´m°0l¬sèVrA—Àr—¹ˆa�åˆÌ +þ�h}þX$° ¶2&†’BQÃy§øöl”ƒ$už_;UÃ5Œ2!W¿ÑË�J—ÜgÃùIÈ”8Í“Æ\m"›‰áÚØƒ�=›?ËaÂIhvÚ鲿ìÐÕXé¹£5=cR†1ƒ{ ´ª£z?u@oxÐV´É ‚«Ü‚ÜÒÍB„+ÅР’¸6r½¢uOëÈD HÚܦ;ã]«RúzR“SÃðè›I± LÐÃÂ:¶C�äÊ—ŠìB[WyïRdÈ“a¨AåZ©P4&žÎªRõbéœ.ÖJ]ŠDc7çâ#g=p]¡æ&‘åü:Ç?_/Žtµ‰Ïó—m�FùÉøÀÿÏûøh Œ£ÏE€ðÐñêü£ÅhâJÿkõ z?ªLæP§ÕS’(ÎN+±útþõ‚�É‚ü.h%ä½s°Ÿš�Ÿ�åËÇÓçcöm¸KÅæö_ ¶÷®kòÝK㯭¢ÜqOŠe6*—¨x -ä‘õü£®Ã#á)Z÷i”]$³Í|�‰)6?o…£ÈЛl2^ÖñJX7ß(©_sö{wåÛµËÛýO½ýº+Ú&ÕvÜ61ìÕ„Þ÷6MŒN ª0¢�ó�&ÜûÈ€†-%(»B!?Ȉ7Ö“â»FþÙS,d�ˆ`òpD(hˆ†CŸx>sN©èÈ2240l  $À¯_?lµzø�”ç-4P·&ª„RDdŒˆ !‚† ilß7Ö{úКVÉQàbI¡„‘ ´3É6TÆç»›Åw±íl½ó†Ûb ÿg·Jš¿ÇwG—ÇteR!ßܹG—¿­-ÿ-šòøœéõH¯Ÿ—¶7â$cýBðÍ-*[j¶W@N‰�³Ú$×fØ®7[o½+|ˆ¯ ÄåkŠãQ”kñ‚'¹ÓbŠÞÀK– ­ÈâÐy®Ø@ö f¹Äj&Ûóñ̆ 1š03†6®fcgLsØ•’Ñ04—E½â‡q"/ ãO³:/é Öœ®ÚU„jÑpªC“¤&ê�–‡ö›ØhÉ<ò\»í„Ìü_Xy¼�·=pvQNâ|#CnR0g¬:áøÌ5¼Å…¥VqIaVíÆÜCvçCL逥L€�ÞÚ‹ÃÉ/fÀêáÅ7– z’øæ½t3©KË)9ú¿õøÛï;Ö5óàrtÐþõ`8¸‘Ñ‚|!„öVOü_R¿žô¸D”»Ïæ�yý·[jâpô.žçZ—ÏúÒ^{lÎ÷vÂô¶Å’³ÕÃäÀÙ#„»Iˆþ6a”öL8Ë'7)쥾 qîd¾À¥BþËx»e ¿—\Wrß(Ô€#K^÷Yé'{IfF½¦ÍÁ>�Ê $­Øm«¥^h|½b ̈½NM‡ÑÀyFÐ +¸¸Ákuék唺Eq±²·º„Ü,õnIAÞ$ÛGÈíÏöÁÕö߈|E�1¶CðlÝ“}­½Ô‹&ØKÒ¹ífŒ¹¸©Rí\�µÝ�©檘߭½’1 ýSÍ�m¾¶?~òçI|жêí–¶/'‡ÑÚz C؉óÍuá¶ê¼ûEÓF¢ÉzwðˆÏØ”’\jõWÜ£!ßNa5�£G½�,u6Bð¶¬o�ÄݦY@Æ0iÄ`®»"…¯atÚË^.hófÛxÝ0,°Ib<}ó­¸a),;ð¢Æ€ãÑàiÑì.Ö»a d÷÷í<|�·]:§”êlÃz^î-ÒQ’¶ŠÍïNéÈöÏáÛöÁ‘ y›HíÇ\}-áý`É®à…àŽ˜f×Ý_a‡ðãWò©»Û¦uÔ©Š»‚Í'OÖ´6É;&!§="`Ïw.Ó%øدº:¥Õ°åÇ¡ÂLçŸ9ﺎ9»xïÖ•ˆZ�m—1Ÿ´ðÇ�å$ø pÅ›âÝeÖ¢Vn€5?ëýAeë˜tCLÝ嘠ÙžºÌ ‰ÉLJ­¨—á=ÛÀàª>mÿÖ q§·ñ—mî&»,Z؉SIDBðŠØ½=oÞë*îÏ9îý˜«©�qÁ¶yæ¯Âµ9]™„-9sy \l¿?ÔU}1ž¨ÓxŒÂÇY¹�EŠHćð×j-†�©›À� |¯Ãÿ㉯à�·ÄíÜVé†ìk~ cž÷å4¢Eúd�úJ‚¼kÛEôöÒÙ™\ÚwO‹{¹¾ï° {/X…Û‡"õùÈ€#ˆ;æWÓ,àýf!i(DA;nþIð0Rdábá´ØÆsö5çÕÍ“¥õ϶8Û1\3C�;Ä�ƒ¤Ò¼dØ®&-š@–21&Òö톤Œ>6š©¹bmmw`&n[Žr|1œ‰Œu1m¶L‡èŠf8 ÝÔžáÔ„ø�ê-ÅaÕ#jÒÊœf•I“î l}ÏÃÚøH°› âÂÚýKÈ‘ ? Î@·±gêæd„AmòÎ? ÕsZpžgûkâŸÉâ”\­oŒpt+‹×• á“1ÜDAž¼”*�OMQ‰ÿ9|GôÎôð],sç¸î_ñÄ �„6õÖL}÷`|oDšLWhšÙ™?¶ý‡èìrS`åîv¢À$¢¼Ÿ²ë“)Î(Ê„·éÒ>z×ô�>(…øF�žŽ©ß¿_ç—7Ïn^«®§ÒÁüC_ÞGGøjzOw™—±˜PXÔàŸ³€Æà ¢-ié(ÅHöÖ-ÓÊÛŠüÅ–›—ëBÆÁ¬mi¸1�@IVNiCP•uOåK:âkôEVÑìÿæ(+$Êk6šù^ÀtƒËÀêÏþÿÿþ *ß@^øÈ@( m”hÐ@ P ÜðtA@>ðÒ‚€ m�€ ´õ è@@h`útPp¦¨ :kGA ƒZNµäÐy C¶ š�è˜îòïÐ俬) ‚€¥t©Í!ª”è"@ÐE½@)®ƒ¥lN¸èt:¹�PR€¦€v€;³Ws»6Y:èPÜ‹¶­@h'N€iÐ(P(ÛA˜h@0�@hR«Á éÐ(Ñ�"î3¦£§nº€nÀ:ÓMÚ€ 5YMØ9 }4 ¥m§½)„€t� hÐ †�h³®¡@ìÄt- *ÍAР®�4chú8ѪУ֔ꂀçBβ Ì)@U ªå,¤Ž†Š:fíCTѧZt`„ìu#@Ò€@k h[: (v¡¨Ö“˜]€€PÍCºŠ3™Ò´Ž� 9 B@UmˆrTALPpÙ©&Šª( L’<52€ (” j`$¤B#Jz€ÔÆ™5Tš ¦� Ðž „I"ž‰éäL� =U¦Ôš2ddõ424ÐHˆ £B ž¯}=P¿—O—¿xõ¿®ß§óÏKöUá丸»ð¾;§9Îtª/Rd,g E I~Ûhi 1T›Ò˜Ó"¢b›3Tb5clÌ¥�HllI&�Sj"˜´Ùµ2¤¨Ñ–Rm’Mf¦Ú6hÄšHB‹SBˆ’´`&j6 †dL E*j1hH¢d4Óf´Y6e£̉KI «FÓÔH442‚QM€¢Ú†a& Z6YJj¢²lZ�BVf¥‰¶‹Q¶ØÚ‘(´–KlU‚Í5¤Æ¦i¦Ñ��I’ET¤fÊѪK4¤­&±­%� ’ØÑA¥´Y6eƒiJ¡K5+Q‹%±a›dƊŦ2(Òm’ÔHÍ�RE¢ÐÊ´TÈÖÅdŲ&A$µIb™¶Fh£C5F‘LÆY*,–5³D¶-ŒÃl›RËhØÔe+4™D’m¢–Vm*¥6,ZŠ–Z(ª(­bÉ&²”ÄI-#4 ¶- ÒÍ™¤Û!°›d´I2�°¢chÒ–’Í60Z‰�ÍRj”$hC*,V™&¤±”ÔVŒbÁF‚ÒF ¤Ú2[L£63(©B“hÕj0Z(ÁfÓI™°S5¢ÆR¢‹@”�M Õ‘! E‘3DlY6`k Êj’´Ó"aU µ (̨@ÈI-¦m‹ 0cS*�"2D6“FÊZKdÌ!–Š,”#5L�¨ÚjI±¥I4T2-�c¥H”%�R´a$lŠ“%RmI`Â([*dEl[RZhÓ%¶ŒÍe) ™­%¤ÛBÌV+IV4Cj¥6i dÉm&ØÚ³5M#"‘´ÀF2c ˆƒb)4jŠLD†ÐÚl&ÓiFM„“X¶6JÅd–lb‹¢+)F´™˜˜$j5b Hf™l4Ò•)FØÖf±L1dŠD¢%¢ÚMJkF¢´¦ÒÂØ©°e˜B+I†[ [Ñj5%L5Š‘(Ò Õ£,Û�˜‘ ›¨–"hš(hŠIšÉd´X“X¶³Mµ±‚ ²m†X£jMb¨Ö¤­V¤ÂTm±F5QšA&²S- Q¨Ò˜ª*"ØÕ4™m�fЖÔÍa6J‹L$ “I¥ J²F±¦©6-bÔ†±²Q³6’“F)•’ÒQµF±µ)FR© cL‹d-ÖV“E¶FPQ¶±Ú‹E*eU�´m&�$‚Eµ&”ªf°˜BɨƤiTVÆÉHÊBBÙCj4›QJ01hmÙV4E°Ð6Lj�©˜«LЄ! å I ~P€HBY‘·Â­µZ©kZÚ·ÃjÛ[-kYh@$!/ø@ ðþcÉœ™y›“z¿›(,Ï «Èý¢³E…e¾*辑LÇ)i–C¹jPb^cÊ!gF±(t¼æ-6»¦œ=z:¸gVJi/UFÚ:;ÌíZºŸŒ�«z‡mzº¬hí£‚elÚÕ§ÇûÅÜöswnƒ ”Ž)¾TÓ™0ÕqÑ-­ vŽÅw¯xæ«Ù´ƒh•´tqBêè>È´M»omv>Ý®ÏGšŠ¬­¢�Þ|ÏF/ r^‘¶±–*X¹EÔïn‰NwR/«׎V‹¹²åÀzÃ.†îó6·puNÓa\É�m5į1u¢¡Æ:Æ{é£6¦è¬yÛ%Ý\±€®›x¨æ 3{«®aÑÇONc|í´7¬é vkz³¼¹jw¡±³EW<áØ"uËW֚ǫ޼¾ÝçQbÞè´‚z)�F嚣—yºkjkwïªÖZìø{!£ñ‘ûaÜ&ë-‰[5æHù:2ï&w¶Æ^äH#Ø——§K(Ésï÷õý_wëÜ™÷ÚßèBÿmXYþ¯.s´2?õ§ …Dâ°e â/émÃuÄ¢N¢yç4,Š&8dD^EÃ4Õ0°ëÕ\è¬ïšÂÍ "5 °×Œ›Þœçj Ÿõ‘ÁÃþ¤-dþû€ä&× “Êýê±j¹Ž|†j9÷÷¬DªíóÄ·0#^;ªO§&Ƹ`òr2jU!ɧDñþÕ'G7u‘òã+—¶�؇11D�λ®,‚LËb¦DuW,E ÒWr�œ»£Õ‡�žeÝž�qÖž–‚gÒ€gET@®µ|çYU7u•2Ñ IÚä®Ztä0jD妞]©ôp<3gk hr ¼7È™|Þšä9Èubí+<†Á•ˆ–à‚)¤ZA–:‰pn6Âñ#9W ûª Û&‰Q)N”ZáÕ! u³(�&5‘ãÖQ8‹Ü»3ÖÛ³“ýÈ]Ctž–PQ3gšš�2Üibš… WÍùY®7�¤Xy,Z�¨SIyž nj�SC͇¾ÿHÈhŽ <%ž��LÊ”·1µ [½zÛyPãËîf¼(�Ñ–€'hjæaBÔ,~µLƒI Ô?5ÙÂhWB«"¯ÛÛ¦g• $šT8¸…8:£q#Ôö^Ìå�:VH cÓË•ª‰¶îß2Ó`›Íו»×&’Ú. (œ„CÊMJ7ÎW¦b¸‹�0ªß·%­Baàߊ2óÛÄß+^-I“Í÷<Ì|ê"¨iS(¸dðD‰ ¡ÛV€ ¢q ÐIÃ0OCåÈ‚ŠÈpÅŸ‰|‰”f=N¢o’ò²ØÌ3^LFZ{]½åJ\œd¼ò¹6²šÞbV‰ç,8× U²u¾«•-®6ÍÕQG\2bdþgY‹¢&gSÇk?9n4òv]ÚÚÌÙ ‰bá²…$sé®uzUÔMÕé ì�÷PÑñ£ã9ƒyã*MtÕ%U^@ûQ†CŽœø¬ò)6»:‹'EKÿ<¹ÒÎ!ñê;Üg2ŒS1Ee'…K5u j5ä 1œ�Òe„Ž^ޱ=1—%’Á¾ H$4!Ðk"^#OŠ�­½ª;1Áö,±!rø~TA25Ô!~Ç©WKI„Ûᣮ] ß/Ùð‡¤DòïfcÎLa5Ô§úlh󷑸zм‘¼ªZO—¬Ñ¬„BÒXœ‘tº}ÂÔµl«üs¢‡¬ñ§›aê ¿š�'yGK«f<ÍAfžI8`ìˆ`Œ«Ü‰á° �–Š8¨1b©f$Àׄµün,çÅÏ«t…¥{A2‰‰ë©“ÚÎa¦Ém$E$ÄGqÙ†í¹raÍTrDÍ_�Ââ5»Ô/·Ô~«$1ûüHäòEžJKL„Ar}pÁXŸ 7 qD1uB%r+qšŒâN)¬d»9–Ã2ky޾*³WÏÍl¹|u§úüá‡ÌÒé 迬7˜MÀ&¤ ØÓkû›µ!ú›«ZÙš‹¨ÄÚ¥ ¢ ÇKžtƒ ü¸²¢ÓÎ]dm<<™fè°Î帤•åªEõ•°½÷#�uhêBð_åÏ$o^{kå1ÒV*½ %í0Vh’5²Œ¨Pª�¹Œýä¼ÐdÝ32r„™ÒrbÈ1ý¸¯ÖæfU÷®(p{Èê—GtB]®çt©åW�aÊ¢Ÿ f¯Ad¥à!Ö‘Œ  Ék?$–p)˜$‹Ãb!nT&Ç.{1³âóþ}u'éc‹ž´¿o—šª0½PÑ%æ!É”;_‘6®//å\"Q¦¹üLDíF³n$ß¹ŠÎnF~4á²fmÄFÜ›zêa!¢¿Og óBí›w¸–éÚŸ�žÜËfÎù—*šU§R ï}Φ�µ�BÖ_ɧH*ÊGf å{ÿèyy„y,Q©ÔûUPö„x¢yYõD’¬%ÚƒÂQµ›F錞5ù{g,èÙ™F_2á™É£ ’¡¾ŽŽ¡ FµOz¶I&Öœ¿Œ"µ£„mM×K¶Ãk) Hð†ˆ)cl!sgMÌE’ƒ%¬\CÂ"¥sÜ¡†HvÿdLJs�K2Ô5¬¹…O\6l�M˜ó[̶p‚g]Χ™U'‡ÉˆÞyòd íFuÇŽpGzcÃë% 'E°KT:’xê]@ÛÎh5oÅy©oƒí±V÷•$Ž�„¬�ÙÄž (ŠI¾ô8þiD°l.ë ©'$…ƒŸåe›ÙVÄ&&XLGUey0Ç…GÞ".Û8êræ¹"Ã\�XÌå‰$˜J!Š+–†Ì]1—_!ÖÌf®íš � +í„ùiâÓb ë^Åk•d†¤_ä*•°™Ôˆƒ lÌ#mT¯+¯Š»Ó|=‘¾’ ¯A¯Æ9*P–×Qé�¦³Aî=wÒ£5ÂÜ!"È\B8e™˜u ÛÛYCEŒÛÉ¡©$2YTúhÝŒÚ7,è=82 A{ RZj$$–¹y0�dÚìŠS:Ö`S=žoƯ‚,ƒ‚*D17P&H@wÚ«Aš8ͬ5©œñ¼¶¯‘ÉFâ\J¶/êD~u«�$©2¹Du0+Õ3ÏXQŒÄæ8@ÓOµ†uG‚ÖÈ&Òµ]7¦ŠqG†H5§Y±͘M#QÎ`F*#\˜úâÖ;/Y·ÄîuLQ!&WR8¨Òû(i.ùÛoˆ*¹—wÎnx¹´Ñ¡5ÊøZc°6.éa’†¾i†œëem7(´LŸzâ`Qx"P©çáÍP ÝHƒ>&3 !¤Hh“ÂL|Y<*wBfÏ.¸â÷»òç3`ö`è·s¾Z+„ ¥×N $RYäçÌ«$w)˜''1©úÑ2ª§™Ñ¤¦ñ:ŽàKËù;ž'$ ñ!¢\±-;îç¢Læ­$´ýÄÚHL§ÊDH5ôàs0“3õ ¢°�„‰¿ ²R�,"ÄŸ,I³>OÏjC¤JŒÉõµuóÕû7¥´�}és&àë…ÜqgOulDu•”̈™¥¸Pgo=æâzõo4DÌâ¢9HwÞhÄœÚ9ÜLã’˜4èŽ&$O—ŒÙ9™�²äè1�®arE�ËE QBÚß*LÃæÞ–î»ÌåÜJ¤X_aŒßSÛt®F̯‘sO+ÒîsðÇ6®’e·(YyZó,ÂÁѪRr<°�ƒ7¨M›=ÄäЗ—Ò¯*±<*¼^>W5Ì×öâ© 45?…OK"X¨f3Tle×n�ÉÊùQ›rVˆC¾&r�¥ æ#8Qý(uY×ldÚÁ#âľå‹3 ˆƒ¤œ­±¼,…$¡Ðû3ó ø`ÛHù#PŒáZ@ãIJ‡"í‚�B,² ¦#/¬· ’¸@þ¸¨'~»¸�‘8Ÿý(|+ˆÃó=DIPSÝ\I3‚ˆi ÎXÏÉ3“½¹ï™ß7YàF¡˜?8ºS„Ë ú†[JömÏ=åšX’ ¤Æ~yvìP6h<±RÄþÅ‘LsÊßÚäÀ'€²Ä¶"å¢a” 늑&I ¾Œ2Œ}_\êÊ¿œ±ÔI-8[03ú½sÏ™ê»oYùÄ1Å7 6 ƒ”�áû®ìG…XLI êìãžäyõxw¿^œ.„6úS¯†ÓûÓ¢2y#PrÓ)¤Ž$ø~s](ço ÁGUÛ¡˜Gï®ôë+aOÚû~×™ìê§ŽÈcä6�‡�’ž÷˜½â,u§K~ÆD¡ Ž 42ÔG½F"2E¤%'ñ 3 $z6ž €w Èbb S�WRAÙÔ¡ÒÜ›x¸ê#(+…“™�qtN¾¯„W6ÆŽpNŠ{.á‰JJÉÇË5(�zA�zÊq­ó³²Öç¨@Ê�ÁA˜‡Q¦]h™ÔGÅ“ô¨¶¶ùÚђθ†=¼Qö˜ŽØ¨ñL¡2>¹/'hy˜î8'+â^ƒ²½ê „P’ÈãÔ6Ì>ªôjV%n»2>RÑ€¯iÁ=ÕÄ-÷R~N7µyñàô‹Ö¯$¯œ¦þSkÍA春? IÇ›Th‹”��DñQMù\Åq ´h€ÒDW-¸X) 2c„ˆ¢�> WŒ>úºê{æEJÊDÁEQpWD˜9m¤2¡åüH=­õ±Å*¾ýcŒ<‘ÏÅ„3.üQ™Ò- #í Ñ–@FÐØàùÍë0FMŸ�š"÷xéO%•jfÂ7�5É+oß>ÿ|?ÉÿÿXÔ�VÂ&·[MÕ½¿·�K)æopÕ'©Í«ÁTó…½Tö¹è·uË¥IŠºmð݇²%BÖfk·'U×{€çF”(DûukÊ N¸ÏOpCFwI›š òhqÕÐ,W>îï&ma&N\Õïm²í)›«• Ë� H;Ó]×{3 7Ý™£UTåíu¬<éÍÙ†_u,o%¤ ”çZã§»Nô¢E » d’vo;µÙ çk#,V"¨VIÙöì¢ wµRhæA�$Ui«zUn º•Ê‚OX^'z äúkׯ6”\îÂÜ™Ê2F�áev{(+špа{y¼t{­•OvßYs™GQn÷˜×£�ÕU¦-·2ƒ8zø‘G7nd}u@ÒÊã±Ë³Âµfî!Y·JØØzçmz)¼ù•LjÚÌ7yc;÷nuUâé’Ç8V©Ú1õLéBu…Xl÷pudäÐ�»pÃ"¬°I;#‡zÆf¾MõîN�íâšåÑ=Eyޱ=îB«Dæ,uö4¯·{w‹Ê Åc<,nî»Ú5då,«[/¦öÕãá¸öÝ©RÄ1å^â²úö$êÍ 3:ó¢Vë ÷m·Gr ÅzµÀê²ú£òáÍžQ*¹rüÞF9mDÂUŒ’Žîvê·uy'1Uì””÷$´ÛÊà„U˜XmØ=‰à§{·g�è²M&¦«aÞ®Ùx)Wgsgo—­eËÖ;w*¦FŽÖ±3K¸KÈêfz�¤›VVåµAa›Jtœ1õW,êšJ¢heç]JëzÎÐj¹×ODèŒ!Ý8º­YW¸�>×וb°eÛ[Á6™½†'¾tºÏÔ lÝô„š¯R€'¢ÜceSSj oKÁª“ÆAuJg1Ï*[ê”C�&pª�k%f…Òw½{îÍ1Õ Š¬q‰—G‚\NÕÝ‹ ®ŠjÕ–fõ]>UW¹GŽ MK#/,Æ,âðÅ2Þ ê´Q±oV‹|ëóΪ¼à«ÚG&z÷eW¥×-[íy Õr®&\¤Ï”37®)»¨¯;ŽAxöfäæè¹KC¡Äu 4°ÎÊǦ…ôÛ�»Ë¾*\ÎÚ�ž'2�»X/‹»¹M@%Ò,`/¶Ãå (dÏ%B`¡™HXàoSÙ¶ï|CX&óÃV nðíª±Ì{-Y­pÛ£§Y“½ (lÖ ­2;ºªjnH +ÝêœaJåU{CÊÓ«ƒÊªJäcZ*•³Ýk&.lwD Ðòé *­xëFhÛÓƒmäðnõØà�Ig]sž�·ëãlâ}q¹Ù7� ïl $tõ z®mWKúòZ­�„ž�jXËbGS•ÙÉ3¼aŠèìá3�¬ÏL�;áå{¹8#"z©K»am]Þ5§*–#ìÉk.˜bÕdOà½à=ï{¨W©±bB�°1ŒP’ h2V“bÀX�•šCH±ˆ”bŒ–4˜(БY(‹%hiš1a"ÐhÊQFÙ–±™¢,Q‰Rµ@Bš ‹f“M D�3&ˆ°`McE€´l%±’ML¬‘3QbÁb-„¨¨ÒPd$Ö̱FŒXŠ60Qª,…Ä›Amj"“bب¢ŠF©-Š*M"$b4h±&5EˆŠ(Q–6‚ˆ ¬–"(‚“Q�’Û&’À˜˜ÈKE-$k–LTR“F©-ŒI2Œ–ˆ¢A,ÈÐ’TbÅEck+#F¤Ò ’ÄÆ(f±£A¶�´lh1¬bDÒlR–“Ê1�#K3,m¢Æ+bÅÅI”ØŠÑEF£Fˆ-d(ØÒh #i#PTa54b(ƒÁcÌj�’)†)6�d­�a,’Y,I´V˜ R[ÉZdÊSXÆÆ³1j*6“+™‚Bb$ƒ@È£lj Y`5#1“I£FMŒm)5ca´ÖI±a) ÂÅHQQD4fjÀDhÄA±`Ñ2Ѷ0BƈÒh5ÁfcMlFÊBj$ÄRIµIˆƒe5DÉEb0Q ÉQF*„ÔXÄL€ÆI6’Cš2c@"†µDl˜f¦k±"š6�™ŒcF„Ú’È1$Ó6aIfccdÑc`4PkeYhÂjK$™1%¡h¨Œ2% - bÉmF³h²3fXÆ4hØ… d)&È´…db‚ml&ŒZ*Š+IcFŠ1DV#B•š%­�¬I£DTAF�hØ‚£,š�64аF!‰aš+Äh2TTQ%F š&Te,†Ðm‹ÑE¢�ŒP¤h£bƤ2˜Ô $Q@�&Æ+DmQ­±£Q³5¢)(ŠŠ6,)ƒl’…PQ±�“Q&��S6ˆ°T”Ih*-ˆ£LÆ3*4E�Dš"¬kV5%ˆÚ"¥К"Á`À”l‘Pš cH™�h¢ÊHcBbJ"#hÀh¬"EcD²5FM!FÅ“D`«§®ÝúÝ<|¼öà8¾VÞÑÞ× _eØT¯^ ë]¬d›�5wdôö!RÕQMDmò7º-+ƒ´µ1Ì õ kŠgK—ê)Î;»Ë0l«eZmÓVÁxöe_vmqé)÷fÔÇfiÁ:ú¨föŒÑŠÆ=ºâøUF÷˜¡ íì|:—°^[åt+4]Ƴ“~fg2$ìVEs­å¨A]*¬X%ì±™.ìØ­U†Jv3lo±[ÖIúu bUÅÙ“zý¸Øe:ª•îÝ�x\)w•«�b¯*=[aÐ vðç¹]3¥ii*ïM—ÞÚ4B l,އ=¡vu»ªëök®®çåT{`ÙëË̹¨(Z­õæ·`öÖ$/ÖSIgrÙ˜uP<��‹é)®®!:´â%èJ9ÎL"-«FÆ ªª¬+3mÎÍÎé\1jdÚ¨/2XçŒL°íôæ8·ƒx,‚-FvÞî½®z)±o{êdnÊEhwež³ÕC8r ‡¥kò›×i^½Ý4]goSm¦/“¤¦=æ2=Y°;²ÅQE;ub�+ʆéFéh¸s]Šu±Tœ²Í‹W—O0à²Ïô1[‚öQ˜ÎA”›îí¬ÖK'fUò±Õ)Ös[Û•Ô•LÝG´k ×CÙ+1Õq5x|sw»Õsº8�S5†È뱊{9PµkS^¶1^EYãëÎò‡.f òVˆžyYyÖ\±$àY;xPÑ·î©™\ õø+hæ©Ùæ(±æÑï,®+2 43=SwAŽs�ôxá뺸â:ú¥›¼Ä²³R.†bø3¬X*Ѝ­¨ÌëÒC«†º+Úˆ‡Kܱ*u£Ð�"µn¬g§ Y¼RÜŽ ºá$Ythdã áCB;YË뜺7¹/f+;«Ž.=Iûîpw]bM ,>šÉȤ~‹ =w†;�»zíDØÅ{Ó ¼Í¾Œ`ìM�÷[Å ÂNË—»™2mÔëÜàëZʺ̆$çhš²TÛÑ=¾º‹Õfû& ìtÁM9œ6…k¦³=: �^ÚcTP’:ÔÇ=¨ÔÏf(+.[~UB¬^ìÞ½Ub«ÏaÁ]dË¿j2;(f…ÍD†Öö p?m ÂûŽÜªÒ)öx¨ еQú„\'íw1ÓË̺É̾t,3Èálîõ½,T»#z_o £å¥aªB–=·v6ùRÞYÒåeÕƒ†7vmåŒÏvâ·ÓÛÓ”WÖ{›ëɲ 9·¦òéUG²¦ ÚÝ´9];§³7 ö<ÎÌ°Þ î ðœÚJÅÝï9ñ§He!* –÷ï4M‚22ÌÚÙXÒsšaØxy-Òœf4Ý/ZM�Ü=—5ÉŽ |i�ë5»uÑÁ{Ârh¿t ˜¡"*•ÎOFíËt,;�‰á›Xz-ã  ENY·[y•¯K•™»U„h<Ó¥¦®´;ï;÷MÆ Aîöa2‰¤õ”Åq¨7ÌF ‹q]Ò‘$q:8ãîÕD”¦û¯xŒ–#V*¢˜ß<6S7|;XÝÉ)Õߟ•Õ¹¤ÞE�Ëm&‰Vu$ªªÒ¨Ñ¼UbºÎ±·í!ç*Æ Ùƒ0õn¹»�®´:„b8A»ºCr—†VõSÞëÖêÒU�›‰Œ8½t�˜ 7Ær#yá ö´#’ìßpÉ8¥¾y] ñáQ\�á-C‹Y€ÍOÑrÂ7ÝaNƒk-‚ c®*tìgsA±’mÝtêud%ʳI!ͦ)1‚pëèÈÄNöö\×ÇvƒN�­øÌnç! ·dËi¡T·JÔ=] ¬–'¥–Íê·«;®çeðÝî"?p¾½yÄPˆQ¦-…záÞØíè€Òê¤2ÖÐÔ­ÎÀ÷t9Î[£ffX®I8îÓÅᵎ8Û»xlN šUW¥vB\ªv³y†]÷k믋uΎû+]× ‹áxLšw!¹§ ,æHÉ�’N”ªßÇpÚ±œGrS/â´ñ‚†{g>iލ:j#n\ò9Xy»S±åO0‚×eE¶8�£°ZÆ/Ž3¼˾—(q%•d¾ñ»±ƒÏ†Gµµ‚JTD–«ÈãQF©Hw «ÉÆ[®ÒW Âøïšê³XAê±Ôó§l]^nÖÐír¯ÕŠÂ[´0ïpVži¿`»×0g’zêó´:{¢¹?lyÎû Ý=ÐÚ˜Ed¦a^+p,æ;v_¯8ewp½ Û¡zCÝ\% ùïxÝ䫉׈FØ“W®W OŽ{°îyæU�CGe)œE¶¶Å9ŠöÐá}tFòÞ™£k°]Öš‡{ÁêË—¼†Ôí•xåš×]]“¦B™²uãšá}Íõíƒî!ÛLêyv" 5\¦àª»Ä¥à á´q,•Ί#&N†d-;‚a7-:Ó½Bä}~7×6î �CjÞàÔ´ ÙÊòˆBô4òæŒëªªÜÜ#76û²³¼jîxÏqÑ]-ÖÔ�@Û®rT!5Ù½°´UÔÙ½êßqâ‹Þ #\ä¡Aõ�îîKY-ìxy{}†øÔnZBl¼¬šY4fqÚ‰eì‹8�ƒÂºÃg+Uí@k�pˆ�z± !eA�Ø8c‰ÙAK¼{’Ëš¬ �yW¬Ëîs‚"Æì”ë·HŒPܱ´ ëØ÷)[µ—§$¡T鸣ué@eÝau/r°®i!æò>¡Â†y UåWwÑ©Aå V§Hgjõmâ®ÐØ<2­×iIÖnªõhÓCY`­5ŠPÕ½´áUí«K2‚�TÁ©é5Én<¨+]XÂUžý̹+wCd©�\%¥Ž\«eöâå¼ððeøó£y¢úp4±0Z/ÂðèÜ2î~¬ ¤Ük÷†Æ0ô/ ñœ3�¶q ~œðÇqëæð]üŸ¨-jÕv5¯:±£¿i]f–Ú'š0^ñ´VµúMש7µ½±VDA‚K�ïqOvr8=b«+2fQåÚ‡êÛ_*7}u^Çúœ±V––4²ïO¥´[ñ¸•”¯ézŒ4¹×ÿ@B€¶\ñtuÁãoUzƉ¸Ò»y)ª÷)¡AŸZ=«ù5¦îÅYÒ®ae5ŸëáüqHoWÕþYb—Z§ˆ:oŽ VV¨h8hq-ÀÖk–)²Û“¿”jÏšw‰Úy@è_«x ~XÄtÖË¿;~ƒýÙç0Sº¶i^ûh•ZI_ŽáTÈÏ*>Üß�æäú{ì7h¥â?�/ëª^ˉæøvC"U° Ó¼¼Kc"ý‘–úü¨¿Sm®û]²ãAÊ¢)ŸÚh’ÐÈ'®w¶\q^c˜~©Õ7Z¿{eóüE-T†3/pÖ´‹â̽é£Û�±Ôw´oïj–3œr[\%MbwÓmP¯Ö×'iµ-<*Wýµ\Ýá¶²j…Ãâ…îžÓX¼²zoŸk“œÿËÐÝ·)ÒâfRوĥÃ:V[V%×1îšÁýu ÊQõ°tc剗]å+Rœ#Âsâ¾%êzóØk?{êI°¬î¦/l¢Ki¡DF“$â9-Jn„“býþÆæ´„5�–†HÒ§vht1¥üÀµž!¶á6E « ÷€)]„^„A.GäÂr¾>oMl×Ñ6+âЫÝD¥ä¥>-SúºèÉß }A(!)”kT¥3bá2P¤ŠK’­x˜?}6Ô»FÏãõjКå&³‹”üDS(:fàöÉ„€n $�‚k*Ò=¢‡î·¹ìÓ Yîb°J8CIQ„HË ò! [Ó.u4ˆuÚ•Ûó$â•þÇ¥¼N’`ÌŽ T�âƒ4?£Ób¶„ÐmˆÓû•4¤­hnñPÆQF¢ãñÝx%Å`É…/¸iŒ�¡ú cT ùC€ ƨ�KcF…÷4ÏïYPLGïYÚÕêo}ãc1é�ÃòÊø´­cÃ�¹ÃT‚ÙÉÛ²Mþ�1ÏŒôd%F1�“D6øäˆi46}ìˆÍ“´�+(j„ƒˆ‘ÁD„L4&‰hMžÙÃ3fn…#Ï¥©§xV…J`Ï;ÓmìE…³lM¦‡¸ÐÜ6Æ›sÊ-_¤]JÍ @š%!ž™]+ª#vºô]i[óçMNtѾP!ìø¼MYˆ©êè-@ò-í�xô¬ÿnÐû[Op>qþ/5@îý$óÁ°Hd`9'XK ŽöŽHR@Ša~"Y!Q´)i#•Ì"ÅL»þzƦïדÄ×ö¥~Š—ª¾±1»Í÷¶W)Löàð,Ùïâð@XÀuâÞŠU^UƒšÂÿËo妅m$kw$»þÊd_{:å&{ÞVŒˆþW:w´ðÙ͈ @P”2 (EîTsËl’ë¦pÛ¾MÜ-‡SÍP”× NÊ_è¸  šä£PPïÚÒC³2—y(54À°göÃÇá$Jµ�×k:Ùã·Î[¯øBZH³r|i©—Ÿ%h_>ƒÚ b�\ˆkGC/Ò� ½ƒ­3�� 3nÆÅ›Ùÿ8ð„BF½o÷´Q|aŸ“ðôïäTöúô{ÖK�ÆÌ|²ÊD%}<õ(j¼¥n¿©wu�—Åóú¥«ÒGS ™·3%ýÎÕõ¡uš$sHw§‰Û¡�TÔ2¾>Ì^)÷."m¦~‹˜~Û-³ùãÎe;î¸Røõ¶Er3E²cŒ<¯ÛY”5šýOžíÚÃ%{ʘžë¨�~ûf™ûŽ|Œô£Ms‡0¦ÙEz™�ç·õë…õ•êØiãóõJÁºõ†PÌ2¢‚ÖÛ«!·¢kvº`}Îþ>*àêµþXòÛûµ )쎈v“ÌGµ#¦ ª$Pð¤Å �k6X ËTíK·Œ­m,¦Ê1vE-”é:kõ‘érú`®±­‘i%ðÙÔ_ é¡mv—ã •1pr§ö¨²*£ç¾ê|áÃã‡YuÄ/�#»ÃGíã8VÄä×v8�µ Pô˜Aƒ ,B­ Û Í%I§ãoëÚoO|²£E[+´þ5Ÿfp]¶žûä0/„¢¤8'4ÒAJ8¨U¼!´2!ýN%Ú gÓNjXΟ¨_©ø”Ù[BÆnÒ}qc™–¡¿®,Í;Õ$¶¦]®Ý{Áa6ж=ûWÅ€ØÀ+ë—¤R£t~æÅ(^ªÕš}¹¦Ô½lîi¸O0îQNÃ�´Mˆ˜ô±V×�‰È¾x‹D>¿~÷Šç|o]4¼¢/xXr“ÖÒ`¥&{ Á¦ $8!"A>‡¢°âe³±á0ÁT‚̰oHkIiú«l¢«½ÁB@¿Þò¨*¸V%Ÿ,Ÿ™Òx?Zb•¡O¹©S)W“´&Zy’Ì“&ÄPìˆD%÷Ûž6®Yh\¯ªgF0ó ‘—Bf§ Æs®IOÜáHûµZmuO2„—ŒÂ�ìÖ„#åDß„�~{ûK!b2©3•}ïIÕxÓíkKÄXÃ0×y·žŸu)âåH±÷Ϋí>ŠMxúfÑ~vbn¾.䇒!¼ BÍ{Ýî{ú¶2nB´MõÑš„ž˜DÛ´gùÝžG ½Aåïæ'6 é'·qÒž®·nåZ¸ƒ6¿¥Ïæ±]£Fe>_diŸS߸&ÝPÓB÷¨×ß’fú?M~¦^ŸVv”¨ÝL×bOôÌ(Yô¬ÓŽ'ë5e¤Èh�“ʶéÞƒ¶ F ®$ ¯­9@dÙÙ§º ÌZÊ^ÓŸÊ-3à¦|¬zmnðò�üj«êð€8K¿ ò:EÔXeLÛÈÑö%1„¨—Ê*²\ ÿmšÆ>¯}#–’¾ÓXþ¶£›<¤«çMSê|»âWéh�“Åe „~*ž£ØTý»ÓÿIrûp¯‘ãÖ¯ÉÀ'CtB×[‰$¤üAFöF§öô¨6©œ�«ÒÌ—uÚû7‡2ƒý¶…*éVûüÁ¯ªsÖüí&¼Ò­¶Müö–äÉI*ì½Û¤Â¡$/÷í”N•g•½Ê…“êåÞÑ�ËoäÍ>Ç+±vÉã�ÎÌ_æ�¨! •¨^Íëd»^3¤x޼FÌ[Ò®Äòw°áñ[¯è]SCsÙS'wäúÚƒlé¬@öÿ‰As”}cÓ8íœY`eßeFF.ØÿV 7bÙx€ñî÷ÛQ‡g z/MRîÓÇÊ»N÷~Â�3©‹“5†Iø´’Ì’Z”fFA,mXú–ÆŸ‘Õ2š³:竬…ÄÝÕ\‚šª»<Ê U fSœ~òó^±›Ò˜¥ëû·ØT!x‡!4Èi°ŒÙ)cj�Hì,>l[ÄÊÑØ<7¯4Ï/©Œ¦Öær{r_f¿k`žJX”³†¤Ü•i3¢))Øoú!He±ó¿'Ì|úZ¯xPÏËó&óN)gE.:Ÿ‰ wÇeŽÔJ„+#vQ[&}:UÞÞ(ÌhmÞ6’“¶ÑOXDL¼¡â¦ºl�mé’këÑkV¨Çu±Q–ªU,<‡ó—à—”E(gÔìÝ_ëš<Ís¾©*0´ºØªh�ÕHB;^̇!A‰i¾7ÅEÎÃ7>R�–5Gƒçÿ {þzP_HLG‚-Is<©V!ø  @^`Œ9™‰`Ô¶>B ÉÊ”æ´ÜADPŠ¢$¶U"Ðrëob!Í2â);¿¾W÷ŽÝ;VCk|_æ8œàè÷0Î#[+¿iS@\£X S8ÍdÅ�5±J™os´h›Ѭ;ei2—[×-K�T`‡©€™>3[‡ð›Ý«& ¸yX'Õ�/NÚdâ³ÌüÏ3UôþŒæhTÈrK(Ó� HŸù¯Î-;Ô7óôATa�Š=ƒâH8­ƒìƒW†¨PN�'Ñ|½�>ýÙü#_V«Š›ü“©ªEôòzoOê �%�ÅÕÄpÀ=Úi¶(i ›=Ä”mŸP"']gB+.„IéÕ÷ùuôi ¨Ïö’Û%E3=Ïuý7ëãøkÙz)jã]è¿�]ùùíòÿØ?NNPK iœ„þ%(MçœØ…³²ÈF¥Áv™9‹Õ‡`=À`•íßÛ:Úeúý2Üb˜u”2ÛR×V%«|Y4±Þ~9¶m+Ü7¢³}B»¾ÒJ›}ÎÊÙ·=å÷Õ´V”|y‹f0ë¬i*þ´ãJg Oñѯâíakû“VïhÉÛô½1{·:~÷MÔ¼�S÷é{I–ó¢|ïŠBéÜ'/Ò;မØê~²ßr€÷ ÷ è¼žrQø·R€´Nu’\#òjk|£WúŽú|`œYØ®ùØ,&†oÃÆõ¥2üÿ(_%ë¯l[N&M¢/®róœb¦+Yˆ•]ƒüXI¡¬2e("´}D ¶¥-qO‰�”vŒ© „�-£±VM—Äÿ$í[sçþÊö�ñ³¹t¿êL³jL1;t ~« /MŒ­�K·†\šYèæ ˆ’&çÜV]"ÚÖ˜‰j¬þÚl\û½^l„—bãY0„ !cBbP¿¿Éš´=m¡p!ø£c}É ’ßè^ S‰ñUÐÒí¼� pd'f„pZ‰)^ÎÃ)ùëi)Ôî— `ñ‰"$ @äÒÿ0Ä Æ�¸rn‰N`"nÜʹ:íˆ~Yë™”ª½ñNÑn ËØjèbƒ� T"Ài¨þ”‚nT¤D¢IÊ„ 4gHsæ@£yЕï+Ë0Û+-Ì»AF¶:>ñ ï4�Ò€Ú…JÅÉ"ÞT¼C¹ÆRY 0 à!(H2€‰Ì�D¬Ð\Â@’Ñ úhÿ € „Ñè­‰UùÁˆg²`ŽA¡OÉ_`kg�A¨xO›JÅ0cø�bÝ—ÚLbiwÌÁžWoUÔ›_êâ)h1â$þþuƽ¯å<÷·O“òùצÍYôçפìéþ!¡|f’[M*Óë¤ã-~럳9ÝðymÌz™5YxÊf-·cèšÐ²K·É¢E}!ùP¿‡QÍ;†…£ù�,A—»JPg3‚J�6õ§îý\C%½ ߧ )?R…•Žì}Ï/‡ëéº_—¡Nb� öÒõØéOœaª:÷døÂ–¿lèYúo”|¢ºK×DÃŽó;57ÕÊ4g{œQŸ}/"öê÷78ü›“Õ‡‹¤“}Ké�*�këØ‡lõ ŸXGx~Ê@à‘‘N«¯Äñ …U‘»È}Í6¶ñD~™ÉµuOl jž~ëÔåK5‰íf½�my2A$N&ŸØx`QSÅL·~L¹ÁŸ<é™ã§þ÷©= õô§†0®t„³_ÑÎ3‡�û<ñ¦ì|º*ç³ññ^½ï|ñë„hˆž—¦ì«Ž·o7X†²Ý#Îô蠮 Å=˜g~|+¹1¯–60�Š¿JC_açÕ¶›…i³5„Ä™�_säÍ”˜~AÉÑÌd_|›ÒRã×âתù]‹ºrÃÜ•ººg*?_k}ÖòSk›0½•á)E{·%'�©‰œeËa©Š %Ú3IJTŸÑßwl¶RË¥–]©É ]­zÒÿt T¯vƒBv’“ j¢²–)J*ôW:S. ƒ!¶Ðù  ½§#l,Šdn `?v¼áßž-b¹EéO{AcÌ'XÝÕÕ£3_P¨ cîLQÒÉ„™B‘*Ê3 {Å ¢·ïüì7”‘R¸="5½lxË<ïß’³<=[*û)¸­Ö)Rõ³&�#qT­új6“v.ÕDǪ¼ãh꽤m [O K<0#“²H! ÀR6†Ë2ææquèN"%ª[æÝŒÆ\¾U©,Ì­stƒ"ÿ*eO}3“n±{{ÞŽãîäˆ-z=)oœzÉŠÓ�õÇ‹wÒÙ¿¸D8GŠ,2 dZŠ£~š$ 4có…xȺ AQ¼ þåôÂrÕ6XUÿ¨¸++ýê)E@&f`z°´ðå1Dˆ6@eSÐ*Œ×[ÁžŒ4ÂÖMe›ØQ�ƒyy¢åmÿ£=î#±DFu7#æÂ‚ æ`Õæå@�ëMâ¶sS d¨4ÇXÉQT¥n!2€–EA¬ÿR› Íxãé�@ÞˆÔ‹ù³&ÌìWS3¡�V©ºí¿8!4Z©Úù°™¦=W˨Û¥O¹]ž¬Ð¬€™÷¯g®÷‰†zD|ÒŽhVø6Ðwb׋Ò6Í;Þ†JÄ åOk`(1l�ݯdÚð÷šZá>¡f ͦ¿>v�ÖB"“B.M“#8Ô‚$IQr@ñæ“M¸=šU^|’™š@’äºFøh–w|¿wûHV ~</t�ŒÓIeù” ÈT%þŠ$gídJûBû-”y�=Ýe™ªÕ%#Ch*BU‰ MhÐBu‘Qd%@=Å›%çǸP¦“‹8Ø=rxâRò:©ÏIPùg¦F5cŸÃUX;’ñ%��NJì³?вñ#}}Mšáž·ã‡l0ûÓÖm»Žíy…»Õë— õΗù÷LIò²ÕUŠzëó2c:ý>º”i´¸›åŸz?yå,zW2ŸÖqÅŠ™åF÷ð+�YèßJN\,ìïZã+Á�§Ü¥�ª¹%[ŠéM¾k·Šâ<ž<îE¬Ç<Ê—Úßî\gÝN½/%œ�]y$å¤s» "Z1ÅöIÊŒ^ÌTæ¨Éj›]˾Z[ØéR•ª"Ú×·m³|Ñkã�ÈÉ•>`•Mìã_lÔúÓ&Aª�çÉB± µVü'1Yê9/i4bÔæ·á¢râÚYøwѺ^Eš;ÉÊï;ý\vóWÞæÛÏáK~fÀ¸úh‰ZS^©UKçM¾e&“ýéI•I«àðåÙ±Õ}¼ß�yL¨ToÇ ~LóÖñè%Ê.’57P=‰R"žG&íô[Z½ôÂBùòûsޝp/=&ßm^°iïùA|eÃ~:%zÁ¶=¿±ïAO�Ð�·U‰{ŸÉÏ—B2�£š#}ᦠûç¬Ø¼w=Vj¤¤A²|áëÊÃÛÔ*±XzÝ4¦n…¢Åg>Ͳ¸¸Þ%O¥?%acÚàVïõŠgæ!Z7ox•|X9:uOkK¨Nî<2lÛ‹.îOÏdÖ=™5Lcù¤÷¿ib\­›‘ª§ã©gœRa¤“² +Q¥"«[MÊ4Úì}dZºkßÖ½9+WឯšVtó71\Ddó©•!#³7Tëš„°ˆ€pBT¤BAÜ&6‚ϲ*ÔF�`M0CÑ =Ð\mª¾|0¢l;‚Öf`Rl�…°tpè’½Ç Z‚ì ‰#H"ÞDg§geü1’)Èx�õꦃw"GûÏN©gÀ'EíB%"䪣òGD+T`ºH4$B�,ËÐ 1‘ ü¸a5^B4,Q4C  @­�D¢ŠFZKM £r8›Hø�ÐHAœزCbéÄï¶×Nk�hŦÍ-Í5ÚöñW»k¢ó]{oÃ{jMI¬i¼œQ[†¡ RÏÀÅq£Õ´6‘r¸j„ HØ=˜@ÓB¬6•A…¯IÁ b �Byð—Üe®Ûñ¢”4ïÃG·™µŸÙ¿*@ßÑAð^HQ´© ¸õfÜ`WlÎvßk¸Œñ?E§G$åÙ»û(ªÚ[(w³z÷³§Ì¹g´üî‰ä1:Ká~ο’¨S¿tP§¸3%Î¥»OrÒMùT ·MÙú},÷ýæÐð¶ù‚Âäµþ•RõÂÞwä–µñ§¢Æá–}èÉÆûB�Ça÷ßq×ÏMó¨c†%šlÞ××4×É‹[ƒ _ÇýT+Û’?vÞ{~ֳ߫šr—‰ŠíiˆèÿS«Lò•k/_»ßß™Ïߨ»¡êÛû(ïù0§Û¦<¨'æÿz¡·(?CHwjÆz|½q–jN{§Æt�­ãßØÝ¹³E¶zÃ^êîåž±•Uå›Ò­\IM*i©~Ô÷é³;éÇì[òüçŽsÏV¿ÅåΔ´Ýú[×MÝ£Ès�6Ikñr¥%£Ó—݆>_r»h%ÚD®cG³ÈõÁ�·é.?5yž\½v†d�ºV*[�_a®_ºŸ(Ìì@¶Éú1´î0g»—'ó-†£ô«e¶›sÉg%ëÖLëÊ{XåòåOtl¢Çè÷SÛVsTR÷'U¼X§—ÎÓÈü—Ž®J‡ØM%*v¾~òÁx—Ýœ[ï�0öµú“Óú³ýçq¯)Œ'‰½A$ú�ÕqXÏ_2¯9ï@[«ÚˆB^x0Õý´•üe-ZÚ.ê; s‚– §0/]X©¤…�ºš2ŒÉÔÕ¥0� ÚAûBño»2üâÇ;^šÿQ´™�³ƒìÿèEuFĘÍÇnKc!K¿ŽÙÉj¤O·$»µTÁ ¥à¾t­¦˜>ã/KúÞ¯ïÔ­n›À$‰2„ÑÑÓýtç¦+r¢“IŸ)BKB¬Ú}¶§íÓz¥e yÌAîZçb”A ŒÁ¯ïýdsFØ×±Èï*£�–êµûb‰30£�\±_¢·ÉõÓCÑß½rœCʽX�©ÅÙ¢8é)ƒiIöÇ{¦­ë\æ=×*!Úz|ýù oB k ¤Å$š›´ÀÓëõûGî\«õû— O|ïlWçÈî�6(ïŸ Ä÷± ŸÂZ�}q]zÍ>ü1Ö*êÕf,ÈæãË5»ìáµ÷4úܼá7_wÉÞÏ%6»{]�RsÙ²wSê�済×Ö’j³êÐZ¤3Sœ¦ÑÒ@wLDÔø—W/n1†:žoжÁ/ós˳H!°e“·«ŠÛ¸é2õ­7)M˹߿Ù(ƒ1{ªØ^½úO0Å0¬´y±oìýë¯ UðÑ~}šDÓ]ö=˜ض> WÀíø †|Ð59xùÃ#o|öï/åçÁí’B�/Õr5%“ÌSß{R¡ãëñŠûZ0_&Ûm–_kÙ¢€hÑB„ ËK) ïÙ Õôõû k6%âR&hiuæ›CƒŒ)¡Ä,Ȩ7ÀhÐlÒÊ­iA™ìŽ‘€P†?ÛÅç~<=K G.v·$9�ÅqÕÒβöÄ·WÍ´R©÷8ÊóÓcjˆ„�ZÙBãÁ�@³æ›!¥¼$v†~ˆY!l.½>�ײ*�ƒ2šØHÁ €’‹3Ù Ð�{[4½=>>´>OPÕèöe/Î�¾gÀ|A¢}jÁì·ËÆfÖûO9âÏ`Ùüjü"S;ºp+'æ“SRb~Ô­=7¿Œž\çÃ)a Þ­9·n8³zæ l´¦åN Îpá™ãó“c£ûŽsú³ëgù-�*?{Ó=WïV?R¯lòžòN¹Êrjã¾åøh­’[‚¯šZÎ÷ÃöhÝtüÚçaÜ?$7÷âÆ:Ézñb)øÿÞ:•ùưƔû�{Ž­] tû�“i Óo†{ÃÊùkÚð¼ÖùIœÉ©çV¸G‹Þ Yæ×�mÛ] lÙÚ9×$°µ$‡¦*So;J9sÕ/ƒ‰I²ÌéÜ8a¡/J“�ç$g7ûÇÇÁJ4£ˆ-*öpY™l¼¯ûê‚‹UçàÖ&W˜¬6}õí|àFÑy£ŸEÍQßííàT0Gƒâ¤Ñ5̯”ï¼·Åv WÔGi ‡iŒBÒÞ¾Jëì~\¾´JãTˆ&Zx¥W³Pi{UÅ ·ÇOÉóñe:|”|¯í þÇÍV.L„86Ð@PÆ#ʇäŠïι±É²ŠŠ*a_X°õY†éˆôç�íÃ$¼<ñ£ëžœhÇÓÑ*éÐè(äíµ œ�„æ<}¡²%3¼rÆÖJtx{˜r-¡äáhÖÞTZ}à¯ÄŒcç1\–šjIwÜÒIä¾6M‡®õ±©òßöcî1…'…þï,PP åf¯¬ÑÊÞkõÁÍ’Š9£‡Î3)@´“uÙËm\Ç))ôá¤"?á=›WümØéŸ’7Ë]½_»%¿w‡¬©–Bc?N˜] žÄVI;¥:ï1–­¸ÑãXã-sŸÕìU‘Cs2¿c=Uæ×ñt3ÎÝñ9³4W!²hQR¬ÖUWî€ÐkRUd p¨ÌÈ"ÊØ-ˆ� ³Eš¤^L¼Ó"ÅUO<^…[ìff6,6€&Åì2�¨  ›�¤$Äe¥ˆKF³6Ä|ÒÞc³¦y̰¦›“•Tkt@I��Ť‚L‘¦vÕ°uÅ0ãgm²+­IÄ}wÅfžÿÈHÌ {å²—v)« ¢ÇõQm›ˆ‘êÅ• œHb±à �j?ëÄÏï³7PÓ9®§—woö6!»×pôfƒ³WöifÅ ü©J¸´¥±/(ˆ‘Y6@“MÊ­¤(Ø×æ×>¯i‡ÄC‡/æu5·öœvÆTY~ZÇ#8`´)hY²p…Üq×d„F \ãzèW[gKÍo1JÕ6e1ëñ]nÿpfý¥ÙfðZ€4Ó`ŽÕzÿ?™ü‹[_‚�»ÒµåS}�ÿxNj•b9Ø1Èlº©ÍÓÚýw‹Ê¨¡ÔÓ@­ãg‹ü[pY�ÃKAN#"†Mû ¼±µl )PY‰Upm ÃÄE¨`”4~SVý›€’üž/ôøCG®�r�Áôhô1 Q‚A’Üú\B>F„¸CI%ƒØ*®ù´ŸLÁ¢©Ð’Bi1yˆOäus]©l$ úÐ-BÅQ#™"ÄT@1 EM_ÆÉHJ›Hê�$„šB­$(„�| Bì�H¡�„¾’�—)À!Æ=©†|a¨i 6,{x_¶?=¢˜9îXO;†¤C™wÕ„ÖQiäƒYY$Ø•'­1b�CŒîg'äW‘YÝM^äkß#D$+ïwhÖ•ÌÙÆh±Àl ÊMrÆZ|*<à]`v¡‰²X–šÀ};;T_;šÝñÊ645ZðË+¦Z»I±¡èç®·À/kÞ8zÖ4á á-ì¸5ÓåçÚ½×MBµï\m®� ï–Q¨Bhzþ""?YƒÞ¸UÛ¥o­­þÖÖ³jÙk[d¦Ú¢Òm[Û¿¥ôxvuÕv[Tb쿟¿óâ0׳–2gÆIf€>…! ZþדæŽ�ù0ló@‘ AÝŒÜ8kî·²BWìEO·»ÍÕÈÂ5‡YþQ3¶i-2—pjnT°ÿ¼Ýžñ”üLh+•¸¯§¯ú=¢hG£ØŒ“?ã ñ廹Í=Çi&nõÅÌO÷ /í—ý¹ «øÞ1ôÅ"¨ŽW!ç>Ý1Õc¿ uÃl!4¥ß2{¥“¢Q"‡¹f‹“>bó;˜dÐü°ø99âö;¼7�ËŽò¬„Œ�Nóañ|rr.*„iŸnÙ‹�ä³»=©A]� 4p[ƧN9ç ›¿üs#�¬BZ䔹uÍ.ÊÁÆ3†¾S˜ë‘˜hµ9bvãË×3Fü×{"´!+\e«JA¬¸æàCihšÆt2hVÞ£![Ãè ‹o ´\v�Þãk�laŽðx¼°†º&+3¾$�w_ùÎÒ×2òO0O�ÅÜð±AÊh(öƒ³‚ð®„æÜb«Òá+ŒäÚêl(�k"}ÆA³T&‘AGõm˜x£¥‚�¿èr?w•œÖ0`»a“`±¡U˜š &‡‰‚Æ„6·U[2€BÐOjmX Jžw*üÝÛC~Ë�åý¯qïoæ wÇ¥S† Äb… !‹W×À[ªÞ1P“¼ t„F!é¨Ý—fÛÁ9@^½Hl0¶šJäj¬ÑÝæÊ¦Œ�ÞT"\³£9“c1‡ yŽVBH•çÆY*'—äßq`ö ÅZ9*ÍŒ1¨ƒ°"S7Åaéé§ôéGì-ŽÀ�Ÿ§Ö§î‚óHõádƒó0DbQoYÆË#Ï�.F.8M‚uˆ2öÛóéߨˆ�g ±ŽÉ]1¶µ&;oDë ¬+Ì.ËE^†pdÊ4ÛF’Á‚ºK°V͆‘³¢>Œ«=Ó�_/y±¬‘˜7Pk£íjË,óª3d3y m«¢»9Ò[¹åÈ„ õÒØ <ä#'[QnŽÅºü¡ß9qÄ÷œoc0ÒIµêáøp‡3¦Ü¸�UmPó·£xoSÖ{ÞyŸJ;”n:W;}jÓ®tÅó¬Ý•¤îGzÿçþ(KŽø�–8æð~Ìt—{7oF²?aѵ¿Œ÷­^5 ƒ™ŸsÙIæöj¼ï»æ1s ³æqWy.¿jM®ÚˈÿÏs¨i “CÑ`[V²Š'\ Ö—Ëbx=[ +ìíi99o‡„ g[Ý•s!ÛÍÉ¡ù»Øœ†/o�߇à³K†–ÁÌ·N×Ùº=ûu¯XÃäæœåÈKí¡‚Ræ�C#k›çö¥XY2ŒVž¯½KE.RÍ6Ÿõw�d]‡R™v¦~Ê _Léð¸ÔÚwò ß(œ€×[ £�}åssÛÍøÝ!½'ša˜3ßð]VÐlY3–ƒ¬Î%뽫UÛyâ»mÉœÿÌdVm¤²Ý[M.[ ¦ç‹jfu›ó§�lãwã&³!‹|04Vµ€ÓÇ/^CÞ>Ý¿õ&äÂÓûÉjImžÇµFà'{ žcÿ®® 4«?’5„ô¼|VkÏÙkú o× …AJ‡™$ôîòÛ¹4ÑöûßãÔhTàŒ„�˜ém%+e® ˆ%hg›«1øÊAHü½/¸º"ŒÒˆœ¤9Ú.s‚ÏJáÂõší^rV ÖÞ…fÚKˆ§òþK^üýþç«ö Â/=?c«¹”xO®‘ä”—[2p�òÿǃaÏÏËÎ(Èq ½ß²›×m�’=Ö½!¥aà€ê>~hã"KU@"Åb‹k]ÿowÜk‹ª‰Ot ðØ‚Ì, Ǫ6wA×âw¡ôµ2زLF(å)A¤€Y ŽRR\ëºP°kS�Ÿ®a·—Ål‹ø7pXsYD‚½.ÝÕá08ÓÙD—�ð;ñ‚eÎèêŸcCy2¢ÖµœQýN{êßyLpi𵛌)áˆ÷t—ï T_4lt‡­_3“¦tCšÑ¶éÕBAj´„ðY¹M ÁöOE5LLÝßv\ºgs–9Þu)t›Ýd5ç*KÏ”¯ç-o|Ü�´¢d­n[[ÄíÙ�Ò±Røƒ%ô�EùËÅA„E�V“\÷Q±œ5EUT‹'Þ$Y‹Ýü\(ÿ-¤¼˜áÓcó¾–dFa†È¥ìnÎcðûÊóö?QïP§@27‰ø(QÊó­=qï™4Ö1r)pïBù@BT£ �zÕ×]ìO \^=TÏáŸ0d (~2°Ë9€ÁÁƾD8º˜$x pC‚N«u64 ùªÂNÔ-ùÛ"ìX^µ†Ðfù )vøaæ�B?He!é¬ ª‚YŒ³aš_~+‚Ü�×Û E�[†-Ûd?o”f }1%AÀ&É‘�ÿ9™ß[TåÐÐ0B0\°öoEkT^ܶkñÅ×/D;x¬ÁG%‰jâ�vùå.­dÀ¯wœ±XI3X½ñ¨É°lv‹ Æþó¬ý7ßq®Œ0A:=šÐ8w‹ùî±·Reò@z�úì��`îÁgÎ"ßÌyE`É%Ù�áPÉfq¬v0Q×{9S#ïÓ½3¢œÜ£XN `H$¾©3{¢_=h˳í“&oÿÕ¿Ò‡GR#zØt!Þ„‚6r0Ýó~ldDåŠ�_ÔØ±3Ÿyšþgf<Õg: í2˜rsèˆo3ƒºõ²Öàçô\Ïf{a×mÀÏs�× ËZ°zÝ:¦ ¢SŠàý’M,=ëÝR”â.J»Ñu¸À–ãרÎu±>¿›…(ó½è|Þ4N%xˆC9*X¼¯XcYŒ[%fá|@ÆQmþ}öÜ95d6žN>Ï÷SÏfÖNr¹ Xú™(w¸ËÞ#˜\§8vÒö‡œÆ $¦ø»Î@Z�‡¯µqn×1›ëFQ­äXYóãsÙ`S…¬Žî}`“ .LS3¥Zu&Ä/óf�8룎Ab1¡³¶Ç¿j-M)ÛwP’Y�Cù�òð‹!ÿ�œ'}ˆˆŠÖ2ï²Å“€ÔðQ#“ ó1®ð�ñBùì ":Ì» «R;¥@e‰>¨¶b×>‘C¹Ù¼ �Ú£�„.ïzžÞ +ç% ¯*¾yxÆÓL¶#BÒ0=Ê“®2ãß(ôƒX@�ŸK‡|e‘8pdø5í­”ÉØcåM„ª5×é�³©V^~”a05ð‘9Gs’æb¹á“(8ž+º?hȲ�.�?†ƒsâ¨GßïUß|KºÒÁ{Q?Æ œ?�tÅüM-Ú`ÆYIØñKtëMFÖŒ¬e¬[kw¸Ž8Zµâ/·Ïô¦4ýÚÙ¬ Ùaô‚¸•åûiS˜�0÷£E`ÈÊú’2a¢Rà#®²Y{¤V€‰�|a=Ó÷O©dÖ�×o9²�J.vóš!W ¯7<`2L"§µH{¬Óv�¤¯Gz){RpˆI¤QS¶š?ë·GæÆ6ýW[~± ø(’ñ¯*i�åį§w„AâÁ(€�4(âì(²Hœÿ v- qÆlÓ)„Y1ÉZN½Ÿ©Q Ç‚ìLŒf�ÿïê½> ^ ×ÔOçÞv÷„œdrUXÝ¢¤ª”³1¬„ØIÔ™ÄZ±9â Ø%EäyÌ@¼ ˆøV`7$Û¾áÉüLg€ÏÓ*tÏdy؂ٷvdiõÚ¸×ðÿìk ÇŠÿ%~¦}#ê~�…üB =<ü&[[\?Ì´¸G_?G‹~6¯ôIè7Ëý§ûÿ•ÿ:½ :kò@ @žÅOù~ú¢åAá£ÓÕ0’_ùÃÌgÿ1ÛŒg•¢ó:i7Üg"Ä[NÏ»ñ_ÕzuîÈÊþÚ%íÛÛÉ=I›™pÌ5lUtiÎ.´y(ê"Œ}s¡&”Éz-±�ê:8ʯÅä½£ñ批æ-¯¦Ž;9¦<™Åé«·1¢X®w¢¹å¥ÛŠð§1™ ¥çï¹æIŠº·u_›ËW£�Ås¸ÓlÙ×Ü£;�•7¸¡¦ÐÆ?‚ €�à x=#Îóæ??§�±3±­67aFQ(`ÙFÀù¬V- �­-þZ³óKR‘I“Õ‡â¤ox‰™ ,“ù€( mo_ß�áL}ÄûF†Ñî ¦>EÊK•T¿Ü=ĈѨ8þ‹£$€D:jP�ZC*àd¼(†ƒÚO§OŸZ”š}Ï¥—UÇP@s[Ô$@dy¤0†ÿ‡{Óæeϵ[‚é·èËÎÊ96‰wŹõËüËðV~ˆçüI ú�G·ÇîO\ö?ÕCP=$`ÇÁï{MöþS&y¾¿¥†(ZÆ-½¶l†0BäS°Å`Å’”à—D§èD!ñR,�ü8?ü¾7�¯®2ð>}~=:î¿6ß,c½ü÷ÌøÏÈ‹B¼£‡\ב†Î!* ‚a#ÑPWemЋ‚B±ü€ê…\f3 Aú§•n›ÓJn¶¤ÅîJQ œQ¶†í� íî+ÛŠJŒD¬<ÁË­ê÷4Ÿò)*~\ËK#pš:Zp®‰†‚ã+B+î.øßôÃ@ÕzÓAí-OúƒÚVC®,?x©3;*8àsþÏýQd_æ”{aK°�ö�š¼`v# Ô!ù%ŠGé>‘Ü#ñ ©m¬î@Ô®‚�<‹Ò›þ ¾Oø’‹ rF›edö_¾”2¯øz ň‹9â�°`Â\ ˜5z³„ôÖ5:O¼O_ZZÑÝFw5Àïo¬à\?Êô¾\nÓßDаÀ#�#Wÿª9Åî„lÇežÁ¬zW³ÞØ2`^êMȨ×~[µkR{(‘°nf.q‚„§BlIÃW"¹µÔÐO@$�&Ü',™ ˜ÁÙIÆ"YRe$?M &µŠòÒÉ«ÞY…¤áa¿ŸÚûÙ¾Œg@Q½dçy÷,ÝŒ6 ‰ô�8ŠC)Í®ŒX ̬UÛ!ÚÎÓݰ�ý«–:~ïÜ 5â—®¯2$÷2 ”­ ˆ‡ö„Ã\[÷>S\"¨¨Ñ" �M1¿7>1ç—ÃNGÙöVåZƺXºxå¯LýøñNƒÈ÷ÖWáýää+ÿTk‡ 3K÷ç‘ø6°9Äù‡µX×–k¤SvöƸc¼+Œ4Œ¡�­�3lþÍÖq„À¿,oXAÙì! ®ÀÒTÜí¡ z@NfÃ;ò`ÊÖAq³c¬ C¬&ÝöÖè-ïØ·¼bÕp žÝÖø�hØg¯Q‹2ïw�z†Æé³P—à]CÕ»�P_žß×ô&¢6[èv.ªü8Y“ì"¨ØÞ‡ãZ·È°@¡Ðg&Á¶v¦áZ“Á‹ÅþÀ‰?Çnòf±Èâ,ôŸaöž²ÄYküÿ&z _J¤´Hbývv· så¶à¿”�R"1{AÔ/ßçäÎbÈ/à5œG(žéù¬„ ΡìË·¥ 8R[u´ZÇù'gáh„[•à"îüoýE‡®¶æt€ègÐñÁœjõÉ�Æ»”Df;¬cëÞqå^]P7È5ºÎ?lœ`ç+’"{¨Åç#uNÈ™Îz¾OÆr²M¯CB¥?m‚óûMžO)P^8 pÛLé}ËPcϾ§­žŸçÙ[³r1Òîâ£ÅeÊQ0C>|EqE[ û@Á5ð²·RÙ½ £ÑÏHï6÷1’å§rwÚ8œ Ö´—b(Çÿ#éY/WPõ¦gX TÃe®’þ¾?ŽÄ0*�:Í:ª*ÂP#¤ƒ”•·Bž˜LàB�&ãhrXyŒôªx´þüßAÈöOÂÓ{�a*Æ=<3údë±ãPoJ K„R4J¶á`“­p]aÇnßA9¿ò'%û~d„ø•­A[㸟×anž ‰ÍÊ{â¶ ÀZ3­Õš.4•¢#3t„±¡]‡”SŒ9�zÒ.—0 ‰f)kßï¾æwŠ%kÆ—/¡° ùîGÜ&1�1O˜~^Ÿ•�øþh‰+Î œ¬9G¨ŸÏEÇk +Ÿ‡^(Ú?:#á—pçÓ¢Æ.`fþy6mðèÒê—Þ_…–fd“,Í�,1Š 1®,oíùWƒ˜3ñGýÞžÀòîdê~áã°Qijvcáù@Ü1ÿ™Q,v|‡¹Þ {_tÑæœêd« Ô)0=,¡6qœZ4u˜x#0y_Hv~�«Í-¾‹‹Ëê­eÍJƒŒx­jRž‰¨Ç—c¤YG?aö`rÊ"?~l@> ŒWƒ&9ëÐh€~{Á>’‰æ¯Û}Å_³ÒÜÚe–Ê€a7¥ðzd œL³Éú')×–·HJ’è…lÛ�ê ª“&ä 2‘iœOlú׌°/’àÇûþ7Ô\Èe±à�Þ*ðÊ?aG0rûJ‹Ø¯HÐ\+ýïnÇ´¡¶9Áª¬`tÿ8ðw€¯1&*´C`zZgï—‘a<ïT¿ßæêσ׶•ÎòªòY)!¡@XœQÒh,”žbcL™»#B½úÆË yþŸÔ/<&Aá=M Þ½´dóÄ=}á¹PÂ>�y¬†ÂI îßã¡úÝÅÈõ3àE×ï9×?0[ÙÑð÷ñÍ��Äv­E¿N+2Ë€²™¼Cy÷°)† {­/m´„6@džáÄã¶Kã¾ Ò“Xm»#…Ý ð)Ä®t5–#jè.MßZ‰ó¿�ä*8ÇUY‹]·à0:6á7cmä°˜_ó²FþÚ¥Ô"ÔÈ8¤‰EŽP/ ça±�¾A3¹òùÆ�™"ÁCJK�„žÚw¨h°RÒøŠ$LªHl_…\Z¨'I XFŒ}ŸÝÐá…¯|‰�¼ÒðoÞI‰ ‘!}¾ì�yYÄÈÞ0!^òÃ"þVFWƒ i?S´¢4Ò^‹vç•t-1-Å�rûí÷çŸÐöª"÷~¬÷¸ó̈É‚Ï>¯�á`ËøCÉO&¥MGC�.4¼ Æ!Ó <Þ©m—’ 3*ŠúdÞ¸ä&£ËÅ{06;QXĺåL¾Whèë#N¾ÉuØ.ÎYº£ß$RÉd±Gr±ë–ƒ@ Ápž,µ¡éé·áÉšg©šÍutù xËCÙŒ„]”¤ñåvñ¬grƒ.÷‹¢!‚+âAá‰nï’Ö+ÇàÁü�ñ·Ëh†fÇÚ뾃6„¦�å §+¿¦}› ¾1~MO½èa|Kk”®hÊ4ïƽ/{kJ<ÔdÆf$)„ ;½²¨çæt’wÂ:­Ž~Êì°M¬/´Zl®¨Ê¡b¢��òÔŸ;W[Ú7óp¯;'°7f‹’žkÿü Ô›�xP·ºU2øï=ëZ+Û�ûð¾|zxö™­âg/ãxÅ[¹ñƒìë{"<\Õ{z=ƒLwjáuÏ.Ã&O|ùäk›X¯õÃÔ„_BÕ_uk¼} Çôß½lâ]2zGKò“ÔÑ‚ |Á�_Âu¾Æî ›ÕÝ!Î.ƒ2´˜°(+ÐÚ«³ÒH¬Á @�•“™;Àîôb,Àäxi¾ïnñ7ÚWL£•¥ÌÊQ¢“fq$U—pÍ­¼­b^1+ÃK&uÏ}YÎùô›a’Á]…¨y>= ­f8FÝug¢ÅÍ ¬ØBµo™æ¯>² Ù ÈlO€Zi ²¢­Fm̾ã…�'$bOp�VúyÚçàú¸>Vz†%yØ_dy,cÂÇ—A¬³ëWQ‘:mu¾“={$}"AЧ¤=A.Ž2gÞ±F;ú¢4~Ë*×þaÀ'1GnpâÃ?ưa–B{|1­Ó¶? ®Sž—pô‘‡ t[VÅ�€A#еé°Vè”Ñ9t¢ MÞ $Ãcxò3²Æu„­|«á˜5½ Â匠ܣå7וà3ÀOK]Û��‰a¼A¸w>Ÿ§Ê‘�)Zþ6ˆ•$Â<]ÁqN ÊÏ{­?™ñ®©ú7“xÆ_�GµNÄ'Þ4 scZõÜ`ˇª›v{¥>ü®;[¢¶9#š¬;7Ïžñôþ—pèIO؇ B’eæ“�Äô}Ý«§÷¸´Ÿ{¡àÿB9Øô~õÖþ÷Pˆ•YØïƒ’œ§V;ãwC}9ðÁ³È óωÖò:�¨®YÂaù@‡î™ÞQª;س/bÝBáű6·Åaï[Ê�>æn~ÄI"�ï^;GŸ:qè±�Öƒƒ÷ƒ b_(º�Ä+‚fã²³ßã'_M„>A·JöÞμÈœúú$lñ´–ÆÝLÕ0«Í›çpV¶OIJ\�ŒÊvá G‚âñwðs˜M$dpÐŽ)r)‡Í&æN$†Îˆ—¿!P©#¾„­jýǾ“Ìc: ¤CÁ— €%Áù¤²üÕ��‰q¼óYÏŠF¾”;Y”Hþ”óç<âô§å22st‚F_è+¸T؇ñ$¡šYð†¹>H­L¦(#”JâpVb¿u>Aà§¿ ¤àÍîL ‹\Nq'ì¸Þõsp·ÎÆ©9!»…®û–‰ó Œ&ÛyxS:aÝÇ"¯(šÆ2çš;ÕØùØîš2ƒd‡Ú¾¿ì ŠÀ‡õ¶;.<,>«A›Ò8ÒÝfÿÌ=4Íö¢òÃW£ŽY”ÈùAÓ'!PE‘8‡² ­¤\Æe½,èÅ^³ÇŒ$¯òo¼¡Ÿqà›Û��à™}‡F`uáÓÞÀÙÉŒáeæ(‰³¢Ç"§p3ÈÑ :{ÜöÝ.ùXþ1ü=xÚ£8KìÁÆ6)u€Qt*¸#vöƒfÔlXœâÆJ6ðÞ'C¨ˆl #S\ÅŸÌ™îò1ÀVñ±CƒV詾b‘zTõ/WÌÓpÒ2™\Ç·ÃNY»L7áí475Ãt|Jë9tï©‹Ãç§\C—{¬‚û*žÌ‚4÷�ÏII‘ xÏÓ3ÒúÏÕDGÕFMýígËnß òð¿è·¦&JûɬÐÙ'9ûYáÛñL~Ë$; 1±6Ððì¨éÂ}fÃLú�á<ñÔ—.yƵع¢ã=ºVdÔÀ6�?€qؖ͡œBÑäöc³’8 7«ô­`L—ý±CBÞýØMÙöl¦ÙÛöý{¯±¨Ýô|6£%ïæÎg.ŒcAÒ» £�¡Vÿg<¡ûV?ÜÀØ¡à¹B þç^šÚ�Ø %vÐ+Ia;QlP¤ÃêäA–NmÈ´n’öïS—3=:^Ùô2ûAâÕZzŠÑ£3¢-¶‡AÈ»vM�´XÌà¶Ü”èd ôJvTìñ‹ �¡U0AóqÜãÕßÎÁ‘î †@Ë•IT¯p×V`V�™Föe¿>šöíq_è*ͪuújaUË+ ôÿQ÷¾�߈ øñ�8ËC<óE~¯GB$ä…o%Ì  õËU’±(±Àðqíø_<¿"±�1ïœì³Ü'È|8°æ=ÁsF5om†Ï:¢KçòúK®È¿|u8] Ò�J^wµŠ{á©­áëœf×Á0 (=�Æ¢Ü"H9‚¾ PÀ¼ÇâôÚûá7Ìþ-kì<-uábú4Mõ µ3ª3‹j•D>0¬„¡ÆëcÁIš8øŒ2çÐ_ýÒ.? IƒþómÚ9jã7Ù—„œP,l·ÁL§úÇã÷9®w–þå•ùD-ÿ{{ Ð쎒¶·­régŘ6Mcׯ—¢V"YÓƒ²c-÷9ÔþŒ¾}Ô?ú3øéɧÁlÀî aÐ?ž%®Å{žCn{P[o+9EXJä-ÉRÇ ˆ‹'õ ‚b cž49}1Â$.ÈsƒUÄ÷3/Ü[?iþ~ÞýAC«&É\~Ø.� þââ0L w{K-K.ý¬1gÈL.#˜�uóç¡=ÙjYõ¿ Ö}‚ZâÒÄáT²¿cmì(�¼³!š°€Ó¢ï÷$ìXú<ù3æ,›Àn`4Lí:„ŒÍišW–¢O…ɉJs<‰Ú<Îã1l˜’²Bƒ×R ùçuœ‚ V C…ŒèÆdImï;�W_¡—ÄòT-¾öÿDwà3ÃD¦…�…ÅÔ1ܰ›´ãAå|A §h@qŒ_�±9Îq&X`AïÏnWAO´+ÚÁl deÞ„EÊÏZq‚ZGµÆS'�ŒÆÃÈÙgŽ‹8~.á ¸a<Ý\1C øùw8µ7‡ ßt¨ô7ã›åÝûP^D.0ñŽáCž÷9•7Â’žÌ(‚±Ô¼u¥ŽrØú÷Ö¯Ÿ/½ë¯-Ý�™z ã…Ÿ ö}¾è'Ü™ˆ ‘ç_@žûvyÁŸA­¬žȬäà³eZºçœÝ"Þò÷ö‡K\.·ñöAéhÁ¨â¢ŒAÙëä2yïŠJDl±3B9 Â(�Éó3Y–”ÒÚ5O\ -$¦MÎ:ÊÒõŠÎ1O;Fµ©¹v3˜H:Í�èÎZ^Zé‹�£Æ8%aˆß(ìiÓ¯/–e†H+=Ìò1Œ|&fÌv2+N>õmíÜ_jõ§­óë'ÑäŒHæ£Ù Ì34‚ÞÔ“»ã¬·Ò¦N²B6ƒv–m6Øp›Y<º…fƒÑ€nø}ÝØK\å›cÖ��xˆS|� €iãø¼åÆ|ñ¹Fõ4^ªv¦œõ8:@yêãC”$ÑÈ8JÈèµÜÀìè성}D iä½åPõ7�GîD¾�o¾¹`"2$ÿeü㇤1ìsÊmÒpb:j¤�~Nà u–Í´)‹xžLûÏfíjÃvl1Ðo¯h—x7b¨Â—ÊN/Ü‚$S)n¼8ñ´¿yžßèòí9~žPŒ¼±6m �Õû~³ñRAhôè„nŸyþ¢Ýóë ÏÔ|Ç›É9²âû9¿iª ‚U™( Ã]WF…Ζy6'ŠÙ—ìj(ë$ŸOÍA­!%É�éGà ¼[þÖ«æ«äÉñFì7Ì3X[¦àГì¨!q~ÑÖûë•QåiFîŸ.Ï]:ïV»7ØÝÁ86 +œ±‹•Y;XâÇ=¿nYs¥®CpƒD¸‚3"9Øu[¡Ë�V" ôª‚èä0Ș¿W%©Þ÷{Ÿ+8s$ÞvDÓ³2Lªí!µ “Äkr�¶j'nÓ;ÆN7¼ ÔJ…�‚Ü„ÁcÂ]w“G©w}Kšn<ç(øûor7Ñ¡ ­²3�+O‹ë(HNfÎo1TÕâäØz©:©+›ã©ç�è·¾{D$FÔÙã¦�‘ ¤òXR{àÉžNYàÛFob›e!‰j)2MÒ¶ úÆ�¸}m[Ct�yŠDSÁ6'ˆà«!sÆY_Xá›!ôT‚•wCŒé¤d##ùC1Œ¦¹*Û&ñNHëxÝh.EhLR {Ä´çU½õà†'”°æZ^¤u¢3^o¥¬�µØÆ„¡fŸZÄ éòùÕðÇáh4Q™*ëJwœÕm癋Ŷg~oXŽèKË¥y�›eôULH…pW.ÜÙ=Úð¯‚=g¸Ýlg6&¬y¢cwÓ±ÉñÑ Hš Èšƒâ²^Ÿ“ ¬»ž·¯ŒáŠ)w¤RR9‹ð»ÜÈ{›åen¡XdÍŒfæZ½ÞÊÑ]âíX:¨A”�Jgɾ)²UwÙªA”Ë Fáô½§Ü&æùÂb'�E(ôê&¦°@a ûÍÒãC‹*l|î0ç–~¶¢ÿÍån�‹sÏT—H2UÂvá;’‰YZ÷ÉñÁ÷E¸$‘çǘ¾£­Ð‘“N®ô% g‹¦–ûP“¨»(Æ6ï;-iâZ»NØs‚ʬVÛj3zRF­Œ–2§ºØvçdjräÒüd§¹ç †çiŒ÷vÄ]Û¸l$dk³”¾Â:Ã6ž0¯¶ˆ§žêIñC‡º¦”c8Íñ÷=…YÕ‡>pZ€]v\Š–?ûŠ¢AC€ÿMWýݯ‘Ý8ÿ"{Çö�\’ÁþõמŒ¬‘×\ѾnLzAØ ÏøÌÜ8ïõøŽ#¥a%ëÓ¦¿ô¿b?í·Ô^h_àA>Õé@hTøbÝáB;�C3×+á#%EZ€+Õt _t_á4ýõ2Óg‡˜iÃèp…�¥´ÁrÒ�b$ *¹&_k7| Ž>Τâdf–ÙÊj�¾{kTy?éàÒÇ[™±½¡Uô/¸]Ë>ÝõËÝKíßûdý‰¹£º”Ò\é6ùí› T�j&®÷Qpã„Û›ËkX€0B¸Bûj�H4NáÅò¿š6yõÑmÿq`'q|ùÁÞ÷ ¨4æí'wó9@VèHÃáè#¡bàÁ'=%¦Œ¦s}„Ä�«_ÒRòÍ {»…™äi�­Ënœ›™øªí^aRqÎtMðÇ®QXÜΙEçq{ïÅ¢ÝaÛÜ®vzB.ðL¯›¦ók·Áný`�²®_i=çx “W΂+Ê—¥(<² Àã¦ò·ªÞïuÒó..å‰÷ŒÀ¾T¯¡ïe­­(­Î×bòË:wÓ{| 80FDEæ%þ¸ê ÈT�tL˜ÜkŠË˜éŽKZÄ@\�æ„ËåTjãÇË%jˆ»7Å'·èã”nƾDK½'û»/ƒ ´¿ïL{Î×|æ[p^ѯN| ŽpxÑkâºïšûä\cA¸wv¯&äÖÄÙ¾]bŸTád‰î2ë‘/Øøqc…Nà>yÌo„^.hõ² Ì* ¨;™}Á^`;¾F·p$ÇŒ·ÞGÅ‚KXÍ=ÙÖsó-­¼@µncË·ryŒª4†Z/uzvRóÄ®ó“.ËÖ×k81·ÁIë¤gßHšÕê!1 3Y]Gß…Å \;®˜gµ[„EU…YŒ„ÒÁ²«ƒ«B×MjÐäbíÁX|Ò,†J„d�úÍLCH!p~y®ãÞFžwžî�Æ�ïDæW×'—ݹü<Êcëàœ” Ñòô�œ‰UÖo¿'ý ¸ª§åýùeûP.MR½Oß´âµzGbB»âK#Æ-ûi¯d:,‰Ò\]`(I­]2Ó ö¹|¶'9‡…Ùî02ñáŽ;d€¤š²Ü.¶™Qr_N¹±â_ïn,¥²mG| Ð-Äh.7£Y_1í·nËœ|>Í„9‚ßu ’˜=£ƒÖq*Ùûìl'ŒÐŒªÅéôyª»æzJ<ÙE÷â`‰iaJH"ñ£§°I\ ¼dÒÛ5ç2½7"+·ê–F,rK=ÅþZò‡{ò&Þæ%äµg h‚Ò¡;}Ð%çàrÒÊ|gðÁáŒÛ)\Î’ÖVM–(`–{o§ ‰yî”bè&ãáy�$Â7´­÷5  ?.ñ�‚2‚ox�Eñ>¥°ìY/q# 9�ŽhÓÓ›½,óz#äÑ!åé§õû—ÅÕ¾-g\Mû°í‚Ãù¦½2çxÝ×Pkî|†À|Q¡ÅP5$ãTÄA heZÊÝI �Ôþ_ Aå×Ñî¾½¼’שOsI¾q¹U­žÉìÈðh0eù*¤ ‚“Lkõ É|“ªµ!@=õñßwJЀŽoI¥'$ö¯Y°hþLÇœr¿í/ýì¾{rÀY`„7!ê„LO¨gËN0Etõþ¾ž¿9ÅÎ4Íǃ ”¢ ‚…Ô}5ôZi²b¡©YÌŒw!Vû³ ‚~ð‡øÔ4›Îsµ’Âàöû�o§ísȵ)ÚÈ"9åOxiqkˆëaƒ}TýØ0). ³$—²ˆ äa­\Pƒ :ä“}Ƥ=#èѨ÷åpeO�çÄKÏAµB€ú,®ú¬¡h&G8E*¡¥FK¨}P›î|[y=á«Ç¶â86æNG“阎s¶×nµà¬¹…¾ ¸­þÆyÅb\³²÷u&Á¥L¹AYî0!ÄDÁ�Ræ �ÅMø«_&XÆRèdÙù ¡JÁä\3êšÞ´à8bk0×ÓaîìWßFXc§Mm®¢ú›ôˆ€åêø¬V=öVåÐ|ƒÏ1¶Æ» ±¶oÛž4Â6c¢èãœá5bÜs‘­0HF϶B€V�„Ú—¬V :,�©J€:Í»ŒQtì÷Áf¬-åÒ4� ÷€æà^`’Ë…`$ˆIŒF•гú l<ûÜåqîÓ×ÖÖs®VÍ®˜Ÿs­þJ»Öm̃±¿rË`|¾‘\¨­ªæ�ÒéfSEs›þ]ã1ûN¸‹�ð¿©·è+=-˜ŽbÜjäÃÃCËé§ÉÀyúDÒ à½Æ±œk<˜«x -Õ36eä” YЄ¶ ì¢Ü¨s½Õ²‡4¹i¤N¦™yÆ�…íÿׯÑo>Ÿ Æ%îOj‰ÌÜö ¯� .{pêÔH·ïöUÿ¿_¿r½!Ø<¬ñ¯*y¤[!Ù„¯[õÕK5‹…·áð;XŠyœq¨¥›éš`ÚÊT½ÊR& ­Žé+H·lù3mºÛ·dÕúãS]ÃyÉ�¨Ö»õZ™¢›ŠÀPú«ænLÕ`<ä;½fØÝð¥ÿúAÿÀŽËÆ6@g±)Ü蟈ÝwŽfÉÐçoö†´ ]ª­b’ÜX=¨3ƒOUA9œRÒˆXiJ«ièçëE…Ÿ|äÆ}2е? ؈ö\c¹w†iÙÁ2ä¾ï¹Âî%¬ÞÛem¹[ØÚ›H±.¿¨À±ô_�qé€G4yåõ^v…�÷ÒW­ð"�8A¯‰ivKÂs“BnñÞÜt`:¹ëD|&ŠÁ/r@y¾¾Í�>†Ø390]ö²�³Âæ!pž€—+L=Œ¬x.ô5ïÇ1"þàt° 5zMA-ªÄ¼‘ê¤qG9N�÷N»†WÌ’z»¸ÎmDº—¨¿@¹m4Að1e½S�‘ÁKwßüf5æB>ÀÚpT>’×iA@ŸòV1ïìó}§837�-¡çzT d÷žÉä/à¶1ú“µËÞ°n¾·–¸ŸÊ€KzñIé[îGÎw·rÆ7†½Ôch ½/ò¢wVp w®*´6òSèUÎ ‰ªm*»‚MGÈß�ø»G¼bf;dRÌá5åÈ)âˆïË€‘šÏo%tEàÇ(ܯ¡³4 ô³`7HeP‹ÊĽ 3j‘Æ46Æ·‹RÖÐï¦94Æ:´íºx,£»ù³�!”W°›÷°U>çwǃͽcxV-bñ´W Ÿ³ÿ7ǰ>ÚRî“-åè´@ìAZÕdÊÀ‚دÄËA_¨5s2¯q+L?Þqèî>w‰•S^7X”QüÀ{›Å„ă¶ !QÆtØÄ�D¤(¬#¡5€ïÉüÞies‡÷ iôHðÜÏH¨TZûJK.ê´cå °ØËhß �\•CÓú• ¶VòïÈe¢Â§2^éû’|DÆo+oJ|nÅ‘ŽñÀº §À¥ø¬v »Rµœn7BÚQ%dâÜ—Æta%¦ Nx˜+w‹íȗ̹>Óý¦r5êöL÷Ù?ʨzǘߴ+¹ÌX¯Æ²_aìI½N©œÉÐ%³°q‚û`�´Òˆµ_h4�Øãi„#KÂË÷x´& ô~™IX¹ô‹ÈU±{®÷–2 =ÖeÖË@ð´x}•”ã{Ù¨ç;\èðk*ê¶Km¬×;±ñO`�*wøGCMP*Ï·o"ÆB»¿´ÊýFÕgvÍŽùèØ2úí±#¼H#é(]“˜æÎPuß!ð5‚$0,DYÿëÂÏcöŽC[T4:ìö€\ÎÇ5{k›À¸ð,¤äÙ)QÝýFÖ•=~>Vˆà²OÞý£¬wÁóë¬7[¿6±jƃß<­‚ßD=Û…å¬`¬'7Ò—ȸÛÉN+zºnÀ1åA#72ÖçmÖÀ@=p�ÈÀlifüÚ#0ç;±ÅŠCÊìÞ}ãØt B‰·¡Æ€÷á •×3>+4ã:ÜoG�q ¡¼@u’óg�ÞôH«}¹\uÆ+ÆG¢géÐyrsÕ�Ç>“l·‡ ëW»ïÂÝÿf¢úÿ®± œU¡înëM”¬`÷õ달É`Ájk¯jµóû«ŠþÛ�"†_ë*n'Ìúü[àÉv¨@‚wŸ�ðoŽ_Íõ +㉰�CC Iz¬%‹€¸I™\òA!C†@F–‚xÆ Š1ŒI�¢›ç—‰Û¯‚)‰éÍuè¬éÍF ý,¿û*L¦¿kï¹›ÍÇ„—5¹ë&l©%D¶ŒÁ$ýxcj?�pé弚0ý‚^æ^c6z^ÿ²!¡ÿµçès4û?¿ù?é gø„”&‹ÃÛÖžà$T³lMŸ®y2²WaÖ·÷ŸÏsùñ$:Þr ½4ÿ¾þbÔ¯žÞ³˜ÆÛ¯A£ß××ïñ�ŠØ6¥ê¨3L–`"F�†Gïüí7|ß åè€ ²¾Ø¾xfCe‚^0Œ`¦žÿÉ> WîX Hÿ#郋˜‘Ô "lÅ9LN!–$²üßWvš]]³³ŠDÒ®-|嘳Cþ‡/¸<°×ü$3àÈ·L4^– ù…$' ¸Ó ºó(7àz,)­×,Lèf2MkõŽZ‹º‹h±4¤ °]©›˜Æ'îä¥I8ˆ(º�_w"é‘Ý\¸?ßâ¨`Ð1lB¾ðhÅ3¤™5’¾}áç¿ò‚'Gþ |§ÐïƒÄnš�<,·Ø±¼æÚ=Ž�ˆNrrYdÆÅ8‚m>-›ä��ÔËbõ�÷Ñ"5ñ­|{4–|Þ¶ Dã!L¦n mµsƒZ#Dæ— Ãx4] Þér­�+s å†ð4ª»$þ\&ó}œß4ÇìxËg$�UÈŶ͜ýðô=åeáØ6À±ØÈ0=�;«Æ‚2Œ°dV¿ vøKM_Êæ.Å ´±¯® Ý÷×5íRH ô±˜¨Þ¯O8Ù7Í¡R»ô ðiEiÛ8Ï �¢–b*dª€FA‹:2„ à�Þè…C#“ísJ;\ìfÚÞ’Û+d„ùÛäÒàžȬçÝk¸;rΕBJ-Î]Ò—~ç^_eXdÚ°×âbùp¼ögXûƒ¾ãUB³í}%€!VN@÷v‡?Wµ{ï¶ÉÌŒü<çSÝ´ãÞF×D~û¥Q̓1loÍÑ9 ¹‘ݦ~5=y3/£ÒÕÁø—a?_Ö®É,YÍ‚]ísœ:ã4þqK'o=vhªÅ|L/5åpb¶4ÄÙÝ©]ÖÈfÃަp5[5Òø_]ì° ÌÆÁÒ¨ß\>×'ŽÕ®d-I;M#ƒ^{ÕáõÔ00Ç0hðÅÉhÑë ll‰ìžž¸u«XhÙì=ô©¯~¦x­ùf\gÕVK*èêõ$É“wf”çËÅø±³£ñ¤-£º“z³-eﬤ;Ì[$‹lªvðÈ&V¾ï¸Ø �^ æSÕ5ÿ๒mPÏàx÷Ä?[mþîwêëO³�DÒÝ®6a„MV�ñùÇÝZèT"‚ù̸ ÉA¯Íd°~æ�界†Œ¡¬…]I½á|©C¬óY)C,ä+�Pè•,&ê.¾yÆ,¶7x^³jÔŒ7¼M÷«Ýü¬o·Á� �6¶B^øç§tn÷¨ “Ÿ4΂MÅxO¼ÐèèÚÎ/2¥~Þð«bë·åÍÛ®VC·4¹Î®C×0]g¢XÆÅöâk½7­¯Ÿ÷ªÕ¶¶VÚ­Tµ­mYU¶ªÀ­¦ôq@„fð}ÝÁþˆLAˆÄc+ÙrV·®?@;–‹6NËœ»ŠPß zteÏœ„}~_ Õ¼«‚a–¢Èß�7j„`ØöAV¸ŸãT—Ä#Yôn@Fà€†ÜüËç·Ø #ùDÒßL{øËBGž}`4¤~Õº ½â±ƒá‡Ø5æå¹R¤¡Z�S†¹œ;²Ö7â±Yy~�‚ÝÂmÄQ›ÞŠý�Gšî³æÇ]Õîç[‚yñÍ$Œ†É€£ý$vNWËXÖ :#˜ZµÉùñoÚc³“¶³LÊË( Õ.†9X÷e¾X@óÔ {kH&kT‘Ù«Ôé±àP/0+kåFêÈ0AÈFN:|Ìë£�4'a‘¦ô­¢°Æ–'™EæœØ+„òwƒëĬüÕðmÀ¡4IÆÂ_°" Ï3è¿`ÞÑ¥UÍ^î-›ÁÖÊTŠ7xGÙöG³t²é½kÆ2AÙnyIþæE¼ó"Ä"å¼àŸí ëj¢KXC`H˜„ÐTíçÕ¸"ü‰fbjÀ,®™Ñôb½½´AtÛ,cK%¿nwÏ›Yƒ•›2*+›¢ÄÝ Z��VXØÄ.Ô¢–_D¾âû$?57˜%ßOË.RæP5‡8m]^ò��.yÁ飙Ã_žxvq4=ÕJè8œ™Q1-…N' TÉ.›‘aÊó�ímr÷G,å®y&òX,l—4ѰËiŠ­å’F­áÍçW3�c“kÃìò!4ð¦1ÎŽíU0ušç�¼ÍI9$uo±’üý«ÏÑn“à®~'¶ó ªRݲßQ·ÄeižJÏs‘ë[1ad ‚\9-8+ÀÎK!/×È YÈÅxÃT—hÝÿ�ËbÔ³ùû×ÂÈ\|¨±®†Šé¸ ¤W\F½ÔIeèš„gêåýNjm¢-�ðE…PµŒ3ü™ßûÙèjþʂǹ=L^fý��FÅä+1FüËœ®ÏO!}ç2W9UØá�:T“Q�q�³Äá-£aBæ^ü‡S�ÍtàcsKgâwËè•MvFpÙKfT†ó¼ é—P÷x‹°6#,*jØ#gCöyá³}o è-a£iÒ=δº+AçO}·QÈy�(3ˆ�Ò›§¦¼%ÝÙp ñ-½Ø}rûžŽêØ ºëÖÛbD@ˆEX Dáߺ¡-” ³^^òœŒx.ˆÂ}ãl5³�Î3 !�›ïã´=çÉ5N4Aî³ÁV’äDÙÒ$0Ö—©8„ˆt˜VJW*HW–8)&âÀá(tÔ3h’Œk[Ë®%"3—ŒÂÏ<š ÈàÒLYᆬg…Õ�‰:jÂ'$ËYÊ:8ý©I¬¤´ÕðšJq8,1÷&™MqsÃ6wWä6 Âh¹ n"sf…‹¤ª£º˜z{|{š\èï{ìâ-s»î�u «‰|ÅðäÑÝEÑè9ç 4š*6I[‹Æ £z ýª»á´�?ÄQîÎÉâ:Ø0§”MAä³¾ò31ßZ[€Z¾9\(-‡Å]%ÎïÈæ^úÏo<¼b—Yq&¸èQ(‚cdEZ)‘bf©9òsfß_«?𝔭‰QìHÿ9eë(?üÂÙIS•àPþÿ¿ó�ø~‰*<ÌÈ­ͼÏÒÐÎf„Wâ×®ÞzùSB¶q‘n@¹Nê"@?ùÿWL ¾‘û€N¤<Ý?½}“J&ÐÜ‘¢ ÉœDy@"/ãqÍNC\�âå@Ã[ETØä·ß3`öb$Àm2‚V¯ë†Ôó¢a5¹‹ŒÍ§ cdZ"ä!a¸ (=†e”›äÀ0Bǘä‘oDŠÓq�á×;¸Ðß3¡›°WyŒKÚùv Œ˜ÔýXÑF#Òÿ�Ö¤¶„ôç¥ê.°ôŠ+œðš¥)�8šûM�¼öEþ~TÏ&ë£Ï^hpÈ%ßÞLZè‚,™˜>²Þ XåÐ~;’XÓ¡Uš OpømV¾=~5ÒÞ‚}èž·­)ÑßfW0§½…dÄœ)ßÙól¡÷¡Cý�ã} Á,ù¾+,%Í>§Ûîm/^½êÔÀ/JÔ]ßO�‰VöãA[£)tùÂ5P�^q7’ãÖÞ¶ô?ZAobE †G…Ùª3’®Ú¯”›"s͵÷йo+àƒñžU´*ã•sÑ¡Wµ"°>Ÿ�ntq*Ä!ž™dÔ#}Ês{¹ khòÚw‚ã ’½5ë ‹Æ¹ê¤/SÁ›ÞÅh0&Õпº{ ¯¤o@ßÊ_â*e{çža>ymO»„q¯f³¦º(á¨É™cÇ[¨ãÑNª©6kÄutÜN0¤ÊBeÂâ�mEEð¢[ô{|7ÆeH–ÈŒƒK0~c$[œ‹ãË”Š_·„¸ÍŒRý/Su‰$\é‘90äõºî{˜I{ºÌ[Ä8ÖãÇ]Båލ.BßTjÌÓ þªÜÐñõéÛ.ÇÔ*ï‰3¬Ëy~’‘÷e‚öñî 5—vèÃáaßuLCŒ¾ûï…Œêèzëð¬ö87$+Oú–)ò7œíaSíÕ~ºU"(ÉüûŽïÛΫ~¢Ôp*O’8[b[mk™Ï� x»÷{Êhm·ÿ²œvÅlªó&÷øhð>¯Š¹ß‹Ñêø‰Þ}Vé\xçò.•æYòþàI/w÷þçÉç“täѸGwî‹��[b�–<):-À0|A4iÓRÞ’…±�O9kàhkI2lÚ†léûò(eÓÂN�ò Ísw7·�ÒãÞõ5‡¹£k8nИ® î+·¹AG5ÖßÓª7ék$[ê~vJÞ´Cö;ß+PÒ sͯ`¸i©VTõª­O[R[‘ äø�úéüäÈÌJ� L„HœÇT+/{‚¼d�´¦ˆÐž øûC+>4V=yWy/KY¿$%ä^[�Ú‚s®\g¾Î±Œx²’{ßö³e¾§ÚÎÄèGމÑá(‘Uq¿ìúZÜnçi�2+B3,²�–Á8-ÀÞ~õã¶›ôí<Ë<g†©Ý6&¡9úÔáunKLšß%+‰+íóøø—á[˜ ¸[‚ωqˆ™L~ÅïþX~¿è¾Š­’¤qãŒ`‚þ�ç§5ÓÚ!âñ…¤ý¹ýS«4¢*óL÷Þ«k‘·*³uÆŽD�Mä_;¬V‚ î{—o:a4g±€7Œ:ü}~¢2Q®§ž‰à᭲ʪ7þ ŽGØò„ DÄÇ~¸ö›_znò­¶ o g¥p /¯´/ª¼X‰bùˆÂ„Û;Ü: Ø3‡¥@Oˆè¥ï»½?¬¦ºVǯ�‹Ôö¹r ®ó@û­�Èùæ{„>Æé¤œÅÇ,»é{œWƒU|iVEÊ,#; žóI›0m'–΀ûžuçîU×F뫿í>`žè­g ï+`‹oî9´zcívï×;|ÙÆ§8.gaó�w’î9îW‰kÒŒäÉ#.¿ëË‚­†ŽŽŒX.—Ž:ø;‹6xúLÉ×È<*�ksiåäáWE²„>¯0dߢŸëéÎT0Bç´»-ë¹÷E¤úò>#Ÿ„)ÂNOdUê�G —Â~Ÿ¾W7v=ãƒ]Ræ)¥&¸± ¡ácµ¬fâ{Ò™ º€W1ä¤všÛžÓ÷‹��/(tAàò×ÃßÑìy©Ò-®oÍ\‹S½“™�È>ƒ¡�ͽ¬xÙAúýóBª …Ü ZÀ uÆ"ÑVõœÎ.ž&©ï1[Uº÷Ñj‹gL&Ø’m +‹èÉ]�«ÌfÌ裣¨#Â…Ë£æµH¢ü~ úo´®d_¹Oök )py)Î_²èü¬ƒ$ì'§Í1ùˆŸõ$ê ? ß#Qõìãî,ì¨ð‚qàòY>?3W·"º_¸'›3½zý�»lBµ£MÏ á´G3œŽDvA¯qua›G9Ǻë„WpšÂ~³ûÏ#× ÜVˆ#0ãâí`0ÿû `ZÛýŽ Èi/÷óû �[¶…‹¼”L©öímÿ~]ÇõmGKdU ÒkàGª‹âUv§Ldå &. ¡þî±›AŒê$—Ò™V†>tžìË\ðŸ!»¯º>?;äsÞW“PVWÚùª&]æ!Ð<’Š[üñ�ÌÒuð1Ôû´žˆ+J¢[Öô{vß÷±�õqáÀ@í àø2ÔÜtëU³çeNã~l‘S¼°‚"·ýyI„�žGÞA‹T@︶a†Áxçaq¢©ðmø$È×¹{‘ó'6Rãk›Ÿ&aÆ�ÙýòßÉeö¯»ŒmµvA³û¾¤žq•y0B€€2HÇ4sæ‰C¦ô›5ú¶ÃwjÉ þó]§ï°”ãù.ŽÙÊäŠ 4ûÒú÷…Ê0�€1‰%¿¤ñ1Î?NHÊ'ÇÏó×RBÎ,â°Üøé˜Û×n¡Ê_àï”0“!üä�²˜�ñ¹H ÷êzPÚ°™ª@2f‰•�Ô§!#m)Ò5JÒCí d “¸545½ªqœŽRï© ã®¤B²iGx€cM ¬ˆdC IVèPCnÏtnkjŒÞr.O´“Þv*OSŽ b]²Ngw² ã•c‹½7�Ÿ†?´ø÷�sµ_Ýjú¸Ê*{[ï#‹{Þ¥¢[ÿ ¹9+‡M(C�Ó 0eâ™K49‘׆xº^$÷ÞJÑtŒ6ýÓVÓ¸1<Õõãs›÷¶R¼ðÕb¯ kþ÷]gP�ˆØ;¨öpÓM•¾6oŒ\«* w„Ä^é7ºhšd�WÿÁ,®é‡^“»oU:&«š1åSCeîk²$dͤ�îM(Z8­T8Ù¶ûì_K¾Qkzx­¤ÔÊ�×{sÎÉÄ,?.&Ri>Aäå Î!²6e~ðú×< üۋΛ\7sÝ”¿†"%p•˾a0¸­ Åß5RÒ.S­;ãI˜U’�RRjåî�89�†g7bÆa¼/ÿ½ÁF¸EÔfñö>hä�óâa®åæ‘»Zo49™![/(×NJÌjÒ�f�žª ¡àKÝ'·hÊÿð‘H~ñ£E{cŸ@‘þ©"„® ¦ÇÀQþçÏðVàÑ€k ãtŸ²àv\‡,%Šhª?,ÿÏçߊkøX Ï’[ï;Â�jV‹‡ŽÙñ�oéëhÊæ"Kã‹ j„„D ¹ŠÓä"÷k]'휯ÄЧa´åò;‘#•±{ÛžÎ^RšoÏþLÉma|›ã/œÛ8tÏØL¥åŸÉ/tü · Õï ó_ ÊÁŒZC *�°Ò£rhN'-®ùœf>ÄÿÙ!ò � ¼F<è–�Íš˜°ÛÜUÃ’�=Zô3|3¨_.ó¡¼Á4a[ÂĪÏ.$Ø-ŠÐîJ€—8!‘7‘<�¢ `‚š\O¦5þü3^—§¶<Ö�5��•hæXµlþª?·GÁÜ`$ƒÈêÀ÷è©}‘ûòUPÚg"6t+ƒ¡x¸™|‹ž7±™sÿ~ŽDRÚ.¨W[cîH¯ä´„;ȳÆ}ñщ¢VwÎ3vxèí †»z¼ç‰©‘-&ÊŸÈ]Âýzƒ#ý"=€Ùg £É�¯Pw3$ÈFÛWjç§7bïmˆPÈ€"°º ¯½ÅZM1¥ŸÚ1ŒYwå_Uz*ÒbyíEŠÛÂÁÁ4óK„ˆD-8¦Öa{½åT�Ïp h­b2Õ±ŸŠͬC½AŠÈ»¾vlvå—h†U‰ Þ=e\¬°ª%ÍŠtNËpˆÖ™›’!ê´´¦'åþðÇže-éY8Š ½{X+Ž2„y7MsÆ› '¿"ýàôO¯¡…1.n!ðp]?@bMgóh{„ ú/ˆ_¸‰ ÆÐÓ(ÍïÝ]4ß' Ü_t{ǹ¯Ü ÜJC%~³m‡W=ÉIìû¹»-aKñ4¯úáûÓæÂÏ­m{ÈC /�‡‘eyñ��ßÏû í]ÕŽ5À|ÔR­ˆˆgúOmޣݿ“Å%§ÉäŸÉ“#M�BDÁbaö«×ž’„Hšˆz’¤ª–϶åWéž\©+¹¦ ñfçLTæ™ÃBÇ–tÖ5 ï²FqW»h'üì†YÕc…F»¿SUƒ ›cË€ø cß-"‡¥õ±�ŒƒŽkh®Aã^‡(V9ÐõX¸L.ÒˆG)ìëm½�ÿä­?{žx"¯xÊ<Ä®ÅÏÃÊâ²°ìû £ º~0ÿ9#åÁúTh»K'sPc‚p1ÒȱXt†COøKvGܾNurƱ/¨›»c¤C¦1�•&bpéf-ÝcoÆ…Å·»`/JÒ%\í<Óq©õÜEkõ&…g lUQAØgÆ¢ƒÀ\R›'G�ÅË ¿aÎTŸ’µü©Â›bƵÌ#hþeßÖ¡kR²wÖ¢È<ë(]Îi˜¢H-õÑ‘HaáÍÁH_^ýÓc/qýüpUŽ"rqýÝü¼¿L!8ó¿½ç<`ù+ÔË—ï4|ÜBÔ]¢õº³æÎê>£ "ÉûNàI=ðcòbÚ¸T^¯]P²‚â”)ðííˆ(!›CAmó†€ÊnÄs8 —+ŸÎnAç¨�Ùqòà}³$ò. �c#} -‚RVöo÷Ö›å¶9¨8¤á*ÃQ}¡‚O÷Œßþ/³e)G²1ŠÄHK»8ß«rõ·} ‡¨-¥¬#âÞgiµü“áSŽ7tUÌ\IHI … m“ß4ÌAÔ3»Érd’†,1áÉ‹‘5”€-‰ï¦p®^yz´ìÓȲ¯½§€ßB*¶Â~~Ú/ŠTZT¢€AˆD‘cBUWRŠ®Ãs2ùjîÊÁJêÿ:‚±(àßõ/›™á�šö¶¨3áÅ4w1¿6)ZÁÈœX3ì©° ·°ñ§*Ѽaï&ö(T)1âŒÚ, Ëe`båÉÝçU‰ ¶zñé�!ø£þO V�e*U\ß�íM�@L}/àÊ@B\Ž*„˜ëØnh7»û3l0ð±Z1€-{ çM÷‹[6‘›¯5[Ñ:¹Rçdéwg6¼^`¡”öÆàö ‘Õ³v�¿xÌfäÖ×ð; ×µ ›zò©27Qç„îVÜ�¬ãéߢh�G»Ù¢ú·‹–n8©¢0Çà3%†^øÈ ærvd˜]Du6#âç¼<êê#¡ÑIí&~=ùž„À-bWëÞÛÀ»™Y-óý‹Æ_ÖºJ‡‹Ì6¼*Ýk'P[¥ŸlÞœd!´>ýûé`ãºS\‚¹ ¡sË�¯G¾Í¿Aä½:mºg#Ì3&-sCwÖÐvé‘Ù›Z  Ùš ¥Uª\Åû.ÏWKTî(�<éß4×èAq³v¡�²¬e”•ÊVYHÔX ”ˆI’,.fûÎw´I1kÁíþÉ/~-’¦l¦1“àžlaìXLSˆÓ-_ E�^Š²ßž¡¯! ›„1«ö´!Эåÿúð*öðÒÖO 8ÁÅøcí6ì$†ª�d¨ =óVl~àĘ@Ö22yº x<Ú6'ݱW;&6ƒj¼×ÐFˆy ±d½%ÈàÐJµvç3. yŸ4[¸¢«g¹ ãD*”Ü6k×·(Òè…ÏKƒ&üä¢fäntµ­øîN$*Cžê0� �‰£Ë@ªãÍp~eYB³ïêü½±–ïÙ ;‹ãw_}À!�ÍÈ–Ÿ[‹ˆLšºyþê5u=jç¼ À>>1DK®BÎߥúñWþ)ÞÒd 4ÆÉƒW&±)JUñhÕùc.7’ e9‚ü¦eNX·uëdNL7e13U] žüÖ³½ÀàåÓJú.ã˜àÄwÿ±aj°äjûÎZ¢¹w”Cu+¤Ãl“6˜¨&ºR¯Ša–$�lB�#p¸ÖU M¶y¯vó(WÎ?æ” µtQ–ÁdÑNùNko�1¢|JêyÓ¼O ¯Å�LWœ_á÷z¸Ä£¡*o@îìJJåJî!~Õ™¼»P!=Lƒ]wÂÏÇÜï+´� z(0Úáüâ}è‚_ÝöÇìk ÷äÖóW2.™ÄÒÉ@Y¢½yÊ· B––ñ:âåïX,áÏAžôôwgµ^7URy¥S+ÉðïÇÒPßSLìd)wÖÁIãQÈŽ¨B¡û®µâ0W.HÉ9N«„óÓηD[vÚß;kL¡ªdÑ=-·*Ï;S’*6[Œùä?¹º4ev³<اRáò„5Œ¿«¯çvEƥü?Ÿtn—¸v34ÈŠwc=œ:ú¢C¶‰ì¾¬%Ä«À,Œòé¾´kéôôn—ËUµ3N·ô™�|تÄ�Ý–€F�]ÍüÕS±sW}^Tie‚]{¹ZK÷'Œ±Ý2ôÔ™¡G5 ÙÎ)$¯³’_MvO¨ ss‹GMr¥+0êi½ñ™¬„VVÖ§½¨ãßg#83cîs9VºOˆ¹'e.(Kžt¯qQ™&:%_ ¥nûY Ȩ*YKÎ_Öh@Äß ´·sÑ4º}q›îm‚â§xtƒ¡«o­kMVãc8 @ÐôÂ9YRˆwÙ¶Ëh‚Ó/¯,Ù­kª¹!—9�;íß3Êw0nÍy€S< —~«¯-é.ÏÕWm ÚÍç¤kŠº žk%g‚¹ X%™)¦VâÖ ±1!U1Ri ÷;ÒÄ … ðÚ!”.×(µ¶±´]ÞPŒVúºÐŒónÙr'ß›ÃëY ÒÊeQ…¿™ÐoCÍê nï6»ÖÝž$Óü޳8ÝkÆEÀ@묤Xªg&âb6•£>“¤¤º{›ì"ñÑò»€ÒWÃNžuŽ9žV÷_s„;NWr Ö—SÛ¾˙ҮRìñpPw7ÈòVd·„É“Z‰Ù³¬8%ÔBáM�%8°‚ç$ hÈ]Æ[´!žQ3Z©ÝUê\ŠR�õ–ùlKÉ ê²ÆÀÓl·ir:FHCÌŸkK�×UÆ*ŪÔ2;+êCp^�˜ l=Öf g¨¸3+‡Tò„±•åÐÅËÃmuÕ2SL»½9ßµ“Þ 0YÃq‚ôÕÂÜžú±&Ó#®VµœÆ\\¨èœ„ ¶Æ]«—;(Ù‰­Þ2øæRåy5 wRë¬å'jjR ³Ç‚G@€áQo’Ôož´>ô¯¡·^,›“0Æ×ìwitt,‚x2šÉRë¬.쯬­Èb(Ë ¯ù?7¶y{¥Á¥Ä“#b.²·æÖºZ$áF¯ ®uî¢ã:›³ß­i2ȧ˜kÒµ³˜™îMºãO?{Tc'<—•¹¸K“2�Ð÷¢ˆˆ‡5&§¡ª•z‚¹);¼÷}VÎzs×N9ß³")tìJÛ-W½ç4™¡énz÷£ó(ð_G´u^ ¯vwÏg�®£ø{k£+hSòð“&òâIÒ˜c}ô@hl^\)%nep×7tœø²gÞF|#U{7l×P™ô”ñ›;“ì‡T'Å6µt¾Åä#A–³Z¼Eê*zk˜4Ä•ÑxoŒŸDNòÃK�¬ ëÌÔ܉•±Ô�rOÌt’8ƒ5~J�7WŠ%+ÀÈ®yD^‰€4wƒÄe•¬›¿o÷�ÓDë&FESEûù}ûm9;3üóXxF�Ö/‚õ^kôÀžMÖDÀ$#÷P)~Ê‹á™îôà�œ@í ÁJ�%úöG¶ OÈ�M OýÌÿ>wǾ§_GQùÌCÒÓp„$´þØÂ=Ó &£z„”äž*1-šJ„>Ñ 'ʶ�tÒ¤D'ýd¢”û*‹Þ"Õ+™¸Õy‡L“òDHìW³„Â[VŽrÊ,<6�…ÛÒpŽ ð!Û®‡Ý˜C«§]°X±Öî—˦ék ZóÂŒ Ž>J2¸L͇�„“˜LgÖ sBÄ ß1Æ"aD%IYܽõH‚Üd[ÑwO£0Úîã3ÿ»÷ “ ¨œÙ6(¶°YÈI(O.t§¤å-Mó$– %’ólcøÈÆycZ”ŠvPÒ¡Œ+ÚíÓ4BK²�sUOñµyòšrc�bk AÔs«%ZûL� óÿ~$6�Ò—ËVÖN¶cd>Ó{Õ& Y™¹`—ÜoŒxÚ áp¯‚o"þFf×öÐ8É­•‡½ó¹þ¢Æt˜owM|“yX˜aÉ騹’Rt7°›œÌÖDëcVòÃ!‚Ê”ùyÓ>ö™ 羄r‘mÊØ(ôlŒôßÝ˶ýæ6Áo“ ób�LƒG¡‰¹¸M.¸v¾&�ÿë(>-Jü9»³�{å…ƒ¿ Ýsû>W©5‚"H�…)æ=†fÿ‹y¦Úïâ=ú8å‰$‰Å~ A’õ=®þRâÏö�t]Çùy‡ÄÇ`×c†¢2‘ÆB Rø¬ÉI4|˜=>­`ÏÕñ·‰w²¤,ŸØ´IkaÂBwº.9hf†A^Ä¥- ­$Å}ö) L鸼(ø�‘ÎëCWbkÄ™k˜ÞÀ4ž@GÄoœ#±î8¹•H9æ0΃­ÿÎÓkrN$ú~¯9yße”�²aXñª�ªx©Bže=oS.2Áy¼¡u9þwŠù@ŸwêƒÆØ–{Þ "Ò2F“³Y ã⯗ס‰²å8?ÖægÅ ßù¥J¿!z\,°ÿJ�Vú’-啯â÷ßY¹:K�¯q^»[LÈév5ȶ%x”Y|¢…Z+Yð„#DQ—eîé%Š&Ay¥ûßGaÔÒ3›Æo»"*(Èfä�] ¦ØÙi�»Ó¶”ÂÚ—F¿´{ÿ#—T ¨©u’‘™<�€5=ùn'Åý¦ÞÓÒdp/Šy¿�+fa ­œ�HS{Z>-L`V·Ñ´nNc·¼çm°OôÄÞ ÎøNŸ0Ãq¨®<×A@Oÿ È>Ãýþjϲ>áA$�Œ‰ÿÃÏÁíÐ�lyAýäÕb JÓçübçlJòYÒÞCowè£cLOîy1wÚlé3 ¹é»6ƨaùÚî÷ýÉÛ¸÷ÎÜ›Y¼%û@£Ä'uã„oo<¹™êSºïÆÅt†Õ|%Æ ®º&>áôO7ÝÍ0_jjBý'Þæ‹ýý‹x=7pvd„-Ü«ìÛ€“î&²Ý~›nsÂyçÍ©³ö|zŸyˆëŸ��}4©úç°Ì…²3¯[Â÷–lÓ˜2榈×\+<ë †›ó]@‡áÞ49¨9)©ˆÖÀ§DÛE½bFµP&_0,!yžCÒ?m9Nðø–_ž˜×*<à¿9¹cçÓ�löþÙï­íͤ³]ÑÓ4{.T«�ªŽ¥ˆ¬¼?/ Z8ÑûXäFïDS�½q`—CÏ?Ú5‘ôdPCzó#qKvíѲ¢É4¨:�SÑ‚ÍþêG§CÈã‚B¾âTk:½â6üySâoH>º¯[j0CmÄÝ®ø@_½ÐÁ�Bæ üÌ ¤bóÏ)óM:×a^ÏZrÚ*¡*�Σ¶Ÿ?6÷(yøêDÄ6²ŸêÓc,ƒŽš”äsšöšù2dÙ‘]Áë]×ËïKƒ'‡É)vcn×Þâ¸YÜÉNvsX)tÓ]3|²NÐ"7&ì-JtmE_ÿpË�ýšMSÃÂŒ©°¥ògPÖÙž#A¬á=S—¥²†b„Ö8§ïOûÖ SÝÇ­æAß~7¹Ì;¢�û­[ÜjÐ[@ÅÞ‰Æím<$�®·³9óÆx9±„QÙ5ù”Bÿ8û”’Ç×<‚Ñy’>åPè3ÍFÚ’+æ×Õ/�L<ý…_Ž*Ǿu|óÖo·µò¾øÉ}"¡•�œ°äzD “tq‡»ýŒ�÷ìÕRI㩲�?”aÕ¯¿Ñú—´š1rFÝF<¿Ü+xéÆ�¥º²â'i™>°$E6Ö�0 äs˜´Þé˜}Œì”ö§„î/;LÔsÍ™Òsåóç7)Nu#¼hÏF0Ñb•î›Ðî±Frк6¬%Ú%‡,�ÌãK_Çás ÓÛ«Æ5Þœ~ìïÌ_h˜ÖK†Ù< ŒÖðÄôÍ‘OzàÆ_M°2F7Ј@¦ü±(›€b~.Ž,aT‰ñ½zêù;•Ř­„,š„ƒE8"RtÇ…;}‚M3÷³#ø«˜í¦9ǬüŒsÏ!#iàÿã&,íÄÒ±"Rx=Å~ã1ýÛ�‘t;·9äVçEu…#ÅÖÅaôIµ‚lª\ŽJˆ4¬¨Ù&ºLZ1”^‰ÜܱwúV[¯¢RI2=ï{²ÃŸ¬¼¢Ê8^*e…%eÂdªëßóIê¨íòë{ €ð&µò`1 ¨3�ÌÑÈÑ9…´¯=µWû©¢{¨ºk»>ÊîBL)8¨¸ðÍ®ñË+Æ}õ¼‡}l¶>1ÁÔâ} ×U׆ð Ö»‹.ô÷/?.Ô6ñ›Á?;õÀxœÖ¾”·q¼¢»$^Ž«‡³ØvÄtý*N²¾sï„sÅÛbG¯¸4Çwwv3¸�ä›Má­h.{¨‘œ�B»w¾ìúsÞk=³™™ pªMÎÀ¸$9¯G_¡½¡~Ðó³\&‰ÞµÒPÓ*† ÔãÅ ¨©ÞvQ˪Þ0+þù¸Ëð_W{¤b~í¡?ê�;(þøµ¯9•û*y,pâ2¤/dÎÒ°ü•au°ÜwŠ6q=×xw·îA]Ë›ñó·çAÕ…øýfî!“{ű“K’=Úº¶ãÀˆfCBÓçΦñŸCAž­&Ó¶â2ž¥þƒ`›}ÀÙ�ñ|Ëúe£…ÒkC™�ƒŸ.4§éPOÌ×]¦Ì±è#^ô€í)+ÚFÞOef{=óæ—p¶åÝ ¸lúBøgãF)G€�æ½ób{× °gÜ’<ú6Ìä[–â’#Ʀ|`HóTÙ`ußIS±lÕîüXì,(™ø³‡àÓß�ìÚ¾ohs pÙÒÈVó=7ͧ¨40þi£JO…xX¥‘øým®˜&¢>Ÿ¾¤;yÈSêCÅÈé‹^ÛÒ]gÒæQóìJ�î—<FÛ-ç7ZÁŠ0X áâ8C7k�¹Q{žhèµ mÏ}Î\ï®øhä– ™áèy»—7¸<°¤‘�WiòrM³q±jŽ,Q‡}2n rõÏyŽ]•¼ ~1ç—æ³«.æ)Ÿ°·àà.ØpµÆƒD©8–k ÉØ¤äy°ÎA®ßçö‡7"pû\¹y]ìÄô¨ÓcHßÛç‡<ûˆáÀ™"Mò>sLÛLV¥=tꮓL¸ÝƒŸüuëwÝÃwÒÖÆ»ÒL�écKÝVwâ©� c­á©Oœy�†ñ'¹|çû…ä‹8\Å8ûã0[â³;fÛœp7<¤z͆ù7ÂfÕr_ 2ÄürÏ—RÅU#™%jaKdnËâ@få­dásˆmc@w±Nçz{úmÆwå×Ë›O—�QsuvT �¾£ù²Î2Ñ/Kåø§©Ú�ðQ4¢± ²šåÏùNÕ‘Fk=|‰Î\_^iÀÖDÀ7�·{“¦K’Áü×q âñÅ0Õwwéσ(»Âc…Urr`’Ô2!ýÇž÷X‘šÒº¾½}ǨãCdæžõ�’ 6 &|u@ó|%Oðô½�eTôÇe-‘nÍŒ´-k]ÙõïÐq•uÒ&b/µÄ›LdØ—G2“pÖ™I"çò†ÈëU_3×5éÝ“hh¤7kAŒ”!uâFOMn¯� q6Ûž'guxŠßý±Ÿa¢0 -Í›( ç¿"–�&©UK»ËR ”Á ®ø�†x­£ü»?ñúHžÿá'e+ý.ÖºCÿ‘ðcçÕ.KÑŠk'g£ü[OêP’ƒ¢xae>¤\§(Ò++Åÿôÿê…˜MBÑ•OoÚ þif¾Æ]®�ûÅFË^%uI›,ýþ¿ÙÌP’I�¡á öŽý·Û‹ùScXN‹@4�ñ䢔�É& òtNoV¶;¢ ÿ7Bg,¼ËJͼ°?hkV ©°"}ƒº›B$Ùª¬'ÆÂR#s"xŸ·ï?ú�HÔ xŠo�ßmý–»V– ˆcËu›¨#Ô½¬£¤þa�"þÛ°ùÃX/Ag§YØ�ƒþ·¥| éuàüt. à±Ïñ± o¬çãíÆ>yEVám›à�ixG\ٓ羌P³áQ­¸ÿ§i$D‚ìÁšëk(r< B[«ìõ±wŒPµO•.7š.S·ý¼hXüÅýÚP“@•êî#…â^ͼ+2ê¡kù¯þ7ùy~‘VÔ#`±Ìdæ~Á\îø|ðîò_œK²g^y¬È& uàƒË�ÙdHaÄvÊ!ñ<Þü÷µmæFsýû‚ãRf«˜.à'„ã»=rZH(*ŠOŠ'‰!’ô× iÍööù%&û‚ˆ¶ÿOFº#?ù¶>lóàáJÀ]|½k0@øD|eþ^ÝqêNnº ?m^aV B¥ Ô†àÑ’PÇÕdfy< )WgLÛ &º��¥)I6Í#Äÿ”ÂAa?F -[îÑÿí5ËÊ]m‹Ä �¾6·”À‘Á|VÁFšø ¾E­l‚4ô{õÁžp€q þ·åüî!üz7�oo[}Éó ò;-këäÎM®K•…ä³¶÷Í B�_dð¼Ï;«(Å-šœ±éáKÑp[ Iÿcj 3™äYXÖwcV'‹`ÛW¨9l ÙÆâÉ©Z� ±$YJ)Lÿ¾Á3ÉI� ï³AØÂ0^–,<ü¦Bò|-#éùæy¥§ü+5Yešíúóù˜ï<¨Ùóì „#ûÞ,�stV¯r%ó/”_IÐ}Fnr‹ÔCÑÑ#$”~ñéAKRñ¶áÂú�� hÏ!`ð†#«æ“*›·ÍÀ{ÝTÿ7€zh°aý®Á)Ï:øÕ†N?Ú+$�!üH rbõ„ SÔBIãÆ…^ñƒ±7m´ÙÕ¸°O"®úa؉üéOío:»ïΘ5ße�wï²ÄQn}£�ö¨ü§Ãü>ÐÑ&:�pk}£2눥Ñc™£hBBï�"i¨@òž’¢… !$�R`+GŶú|ü?ÎØíÙYeü@¼A|Ùøâp::ÎV¬ÿ�@ºßå.,0c ° èúw’vÂHæ<¾Œu?2  ëÛ ¤TŒÜ´ßìžkÉîoëðUèô� ƒÎyi»ÚZ=óÍ"Á\‡’cƒ‚ @êùÞgxœ{*Þßgº [ÁJÝù?Äæk�$? ¼ÛÆøþ+õ°¸÷æVÖ@yP³“Ñ·ùÓ»1º¦­¹—©l¯ ç¿tLjd¿|ŸGb!'‘÷¥•£\è@¡­F·3À*L² ª]�×Fb£ön Ä^î„:o]äÛôQ$ó'cžçw\�„÷®ŽÊÑUYI¡›aÅEÖÏR2¢Ò„ V$¸ÆsV±h]�æ_’§‚™{kDZ”Žqt<c¾"7·=kÕ É–ϳ2LÂ`C!Ô9®�õع�áþ…’ßH{ÆFTîhGG�]Ʋœ*—"L•Î):uÓ+¬T¹ìòk6kÄaâ8$òÇšüO{¥ñRØvÙžn[Â'1]øÿ?¸ ç™ÁGâ8×Êh#ë·GV¡’‰~Y{ø×÷ÎTœ_Hæ`lç`1[÷�Ñw¸`o•¨‘"ò�îA "ˆ¾|ù»33š–,�͓ȺŽã±qFpæÎ´Þ3°~ŒÜp±ÆGC_Øš%Z�BäÌÄ^…$å9æ ÝðõAj=/H¯Ä”TÉKIwÊõ|Xorý8uK˜Ó¡yµ�=lÚ�$[I÷PGaJ]ÅÄ+#……Ï£À-øûj4ö6\­prÛ/uv?ƒMØ·· ­_{ç¡=øÅ]·ßûY·¢G==|�ôWà¤CÜrMïzÿWÚkÛÑ¡T Ì[ã¿ðÈúÇ]�@�RÛŽkrêíÀÀÖâü¨¡îLÕ:TCVáyV‘EìQ¤‚RAìœV†*– ]"V_Äu'ÿ/¼Õö~öLD>�Háýh>àžW—Û϶ô{4ý½„P^Uþt“½ (u%`êúÑ®f|f^?ÁCÚm-šÓÖ6DÝÖ]Æþ>ÞRd-•òu|Qç\�Akí.”g=øÐ¥y{Þ|Ñ ü^Ç<§d¾/N‹Ëñ3›ˆ·´ðÏŽ;”xk±!dˆUçŠ$Äí•éŠH`�äXˆTœI:éü1~“Y͇IèÏ�xw&ãLi•äÙÉNùóŠF†‚ËŨ¯ã«ú¿=͇&2ð �ŽÂâß(ö uµ_áæº¿½ûpYdͼÏ3óß«åÍqê­eyc“Uáùê�uöW´ø›ulnÎl’ {¥u!FCù±¶ž…ÏÏ$™¢öê ¢nó1ð‰�K‹²»¤‡’*O1–U $…Jò<á�,äž2š$“½îû�{ï¥Ìa¿/�^z̨üþm<Æ¿ynÕ’Ø«¤®n)‚8ï�[!V&™}þƒêÌß¹îÚßj8Ësº<´Ú]óÉÄbp?GVå17Ð|j7Æü7dÁkötʤU,Y1òQ ÙØïѺÁ"XqÌ:™¸‚°|2k¢ÙîF'Pè¡…4YûN//ÞùG‹¥(�¹­ æaAÿ¹‘Œg‚ŒÕRJ•èYqk£‹”¬öŒFäab„ä´Ÿy„‰€@$%*"ÌõMá £)gžïÔ¶j`§ . ”³K-HI#RØÔ iE‚×U¹€ó[)[: Ãô’vÉ{’ €Â@T…ÍóõÛj}#„êøžó¿ÏyPc/ø‘dßG J¦fo�šâÌÓ¯ÿ_?ì~i,7îô0¼°£BB;1 ¡00žŒ/|zé8ü|Û›?öcý�’i ŒBæö¿ì¿û÷Ã;f!hóvÞfÖáZûÜ5IIi”Qµç¬¨B–í$0ûÇóó×8B1ëÕ_ƒ_ŸÆŸíùÔ@x`—v A¿Ö»ÇzI³(‡pºá¶Ó Ië]›þ{TIdÀHÕ1¿$!çnÔ~[ú±÷U[OS@å/¦!¶Åþ°»Y´ öÁ|°þ_÷éEf¤ Ë­ýþ½?=,õ öp�üÕ°Èd¤™fIööŠ÷¬ØæI´Ö@5ÌWiˆ‰È•K¼Dž�Ê\¡Œ“æ¸v É@�¬qY)@®j©EŒi½bw�¼ßx¹ƒý W EW=mȼÚÿæÖ{ŠÆœ¸~6³—ê þæ1Ö Ÿ b«Ð؉‚Ë,.‘pV�Ü«¨Šië¤ä ]Õ2[͇ÃÈ‹ív±Ã¬�e½ïŽ#Ê÷Å+¼â•Ó^ZO yµö²Õ¤µ.7™Ÿ}|o�úÇ�\ƤJnÀÐ{òµ-Õöøú¬kg´ZIW)ɦÅÝ2¨Èxx"!‘ø[Ø�Ÿ?‹#±·R W¿[ØçÏÑ\;öõ÷Ç�‚h\ÓÅPy>Ä’h» Ò!Öÿs‹ôM¡àðÇM9¨”ÒX¶]­a>MK“¹�Á`�kti(s•½¾ ”ÌPƒÍa-¦�؃&k$Se4’$Ì%-•–÷…Y‘J•og)¹<[™��fçâ‹’n8—ò±nv×{jéÖ¥o‘(sõƒ�ò(yþ Z›½a-ûÞM†ý1iÎgõïk°¾°Ÿ7­·Jؤ>ûÍ”tÔÂähkèà×µ”ô~Î}¥8àHø©q¤7õ5°½ÒÒ5¿Îƒ™ÌHü1ö#JöÑqMÇ„ X²ö[Å3ó]¢Î¿dˆƒÞÀJE…¿óß·ýàsP½_Ï­¦s¡‚aÄøâÖ¢ÿÀõ âq¦çë «õ§!w`[ð2òÛár±x’QšŸ±·ˆò ¯¦ ­¸è×Sr”�wʼö3�Êo^?ïs`ƒãë�t~×�K�èÿ#{¾ÄaûE0kÌ ü~§áü߃Ù1u× }…À ’a�µäá�~†èšïyÌã1ŠHp-Ó1yÀÿ3²Óù«5OÓ¬‰þC½~_õÔ˜B ñqïÁðûþ]�+x v\Z­oöÄ€†ÜÜûùGëæ\Sšœ•(ô�}¸Õ€Ý¬BøœïI…Ïu«µ€¤ñK;Å%šy¤ 42Ü òÞ ¨þ_…ãÕ±m€z{]Þ¼ÓgõÛ·K!ˆ³ÞÕ¾yмYö0»Á}–�ìáyñíjËÞa¥[A­Õ±Z�›ø3N7Üt‘sß<èöØüOá�ø È»Âséü½Næp^2_Ò—Õî&òïç/{µ×Ø¿¹.�ù?Mbâ«ýiùÔ©Ýô·ÿÂ6r™™ÕýÏ.øâ 5Ÿ¶Í©Æxq‘t*ª-„yåwxü2\gp#ÀÙg•V¡ÆA(q½t>±ãc˜(|¥Çs”ÃŒ_Q^ÞÙï§ÍÒT´�û†m{ëçªSÿ k%„m!Ç�¤6Âs�¶æÆIö¬éÖC�|¯XT±¦74$Ò6ŒxáøÑiI‘5¤¹~_Š”äÇ„=�¡ªåvÎRÎ/|VŠ csËÔƒ'¥=Änw[Ð}³|U³¢Å CÜø0(Ò÷ÂBßLÙ¬Ó‹~=Ì@çˆÏ,�0k¨ÝsáðaþµafSÓÆ‘>à;Y–9qïmÄŸ�^>×âè–µ…Ÿ™7®eþ+a�}ÓC¤X k ´ã蕌„�XZÖî¤Øþ°ð2ÀÉáq%!SÙ²>Í`?œæUÊÞ’!¢q¶°xý/9ôW…ïz0¿rý¿õ²Š¿x™eO?ÄøMù?Ä”RÌõÁÛs”Ó ï|¤“ƒŸ8¹¯m‘Î!Ñ8AÒ¬”½;sǰ—×øè>³t!jõ4ÃómÖq¤ÆÏœÓ#YÓK(3ú‰ÕàÀð`ða~ø&KUíÓª–®5¬Û�Íy �ì}_.z©½ ΩvŒîmììe‚F|óâ(�ÛH?°ÂdÁx;�¤;K…, �; ë>Çóe,Ú„&®×•ö}�žg•t‹ðÌ’ £F…äGFå7²r†�È«–h’6Ñ‚n?«[P7 ô±ƒ�ð Ÿß°|ß‚\È; #[Êp¬”fBº­·cdu­ñ3Ô�áðT±YÒø¾7ϸßåêãùBC�õÅ¥]…búÇr"0„VKû¼ûFç�ZáÚöðj¦ù“9V!álùõ™…rÜàaC,yq»á”b5ÃV±O"±Ï®k%�‡¼Ét½àwã—.°¢Ž�Ó¬©mv� Ì1aµ«xVì]®FNsNË€†ˆ‹Ô[ÍÀ^‰4J�BR­Ñu¹LÏŒ·Dp†ÁáøEéM^Í~EðåæÀÔ}õôºŒ·÷xˆ�mÝhg.@Ö¹®.­�2'Ð8àà•Ž”ý,¡ßÏXl.F�üÞ9�îȹ7ÈÀR¾ìRÕŒ7bsFR¦ÄsTì6ÓBå†\‘ܦËo…¿âÞßyÆÛ1@aàa¿¼m~U9+íœ~wN}–ÔA~µd—VÍ>îø% CíçÜs÷<Ä ØòÃÓ�•¶–ló)Z}h±Úÿ‡«UAž�1-{â¨ÀŒ'tŵ§Øñ½!ËâÝ['örí¾!³‹¿‰ÐÙÞH±ôùR\bAC\Ï¥éA¿Õr°wríöA¬®…øGϯ`‚©Ðç\ÿBkEܬ ¯.i®óò_âvÔp^¿ÂHDÏ­7÷WWÎÓ?Œ#EDsÝ&z Mư3Xù¾ù¬¶À’OIiy¦ËϤϹ<$£çÙ£ oMˆµ�~7i}2xÕu+—kSzÄgÿe�i�×ð‡¿ûHý„z�$ ùûþü~iûÿ+q!ÓB¾>þewÏ߯“Çõ¿Ž3üg› öóõ4äÈúæðÕBHB*‚B¥Þþ˜\"!²±(]½}ÛÙÇ×½×€A—šmûØóÜnÄ@ÊÝ–náj€Ø_/î.A_)DÀ¬Íç”Üw@Ú<}d·Øå€6ÉîwŠÓú¿çÌo¢S/e$(“Ñ~O‡+*{™7r,ÝÄ'2µŽÌô3’OËÄ-×3�°s xã þŽ7ƒÖ¹),íž„®sbFßNœ[QvÁa“{nô ^´ÂPöÊÆJ‰ÿŠxà.k@ ¼˳Ñ�f¹Æê9�‡hV@›€¹äªA(»ä#œÝàäËÁÿéþHŽ—#Cÿ 1Êoœum¡~ßÌÛÒ¡t*;64>ÜÚߵϱæØS  Åaá×=ôä \À0(•öœÕHŸi(�à ­%‚1=+`…�†K;JxO^\Ó¤cÝk/Ú€a ™5¯#Òb S‚Õ›‰æO48ƘтæX`…÷5ëªG}[t­à.ÊÜ+b.AÌjæ.¥�´©çÌåFçW8¿KÓÑâYéV’R5>«�u£ÑþסR@÷[÷NÿgvôÙP‹Ò][ÂÇ»•·Õzðdï)žïÍFyx�”/æt€^šœÂV#›å¡-‡Ê6qð¸§[+ƒy DØ"nN5:¡¼®B­O Ø"¸ZÖHÕ)"`¡�ȉ-«Q‰¼`I SÏr{¥Ak µ€¨3XdÃÕ�o”s¤˜� „Á-%t0×;AÒ.T–"S»¨…(–Êš"Dá™A*Oùø[î+›ÕóøG®�²ºÀ°ì0�dîóõE©vÌG�‚Í@î]zu×Sû³_ç_Г…ÅÝã@Âi8 wî«�ý�ÍÓ“´qØÚÔÎÇT·Ñ}åk(œ¡6îz@:Û&™c ¢’ê`“(¨)¨›ó“1�{ðÅàÄÛó|"/ØÓ8æ£KÉÖ-f÷θ9Þ¦‡5rhìå³:B·²0¹xÎ�Î[NiÅëa"0‰¿ýK‰Ý8’V°ðyžÛP@»Xä–P&ˆXüþþË?_yÒ°ï;âÀËñoF ÈŽdÇG¿!@(x“tV‡Ïd}€ù¤Ô(f÷íîÂo¯²Œµ~ç$×ÅCOÿ6—LÐ÷8‘0²þqrÙâl³ÏSânŸ—ûÇ å†öjÅÅoVá¿ ¸)m{ƒ�ÙéâW´¯2@ÈgbxÌëž\˜g•”‡ÑW2RAø6¥Ž£©ö>CÒ|»ñ ä?À$øÛ+…{,`’ ë°6*B@2‰<’d쉂9YÖo1œ}j­­Wñ$×"Ûq¾ã↷Å>ÿ³åù·®÷c¦½gš oÚß ê‹§&cü#~ýre8õ¼0øÎûù½~�£ ã!§·*°Ê=¹ù«ÝnþÁ…ðJw)øÚm²¶úÃ)ܨZøó�ñ®—Ÿ™·W ~¹ /eYAš(Zխ𮕫DÅ&€¼Î¤Ú ˆóö¤iøtá§öÇá4cý n‘1Ðï½K ‹šÝ‰¿B[1>á~ðÛ¥5t‡Šv¦é•…xÚ~{牆ãÛ+ÝÄ,žX7Ñ tç%½ ƒÐ éÂ)ºÓ:’ Þ1›vLJÿð¿è|â¥.žsÎ’3ˆü�FÍ0CÏSÑ^¢àÔyj{Ô³Åå÷þ>p`õúe3EØÇ Lk¾F»³åi+1Vð¯qsߘ”.ä�ÓÆxÓkàéZÙ·„Ýç*¢7ãék[ãò¯Ï)r¡ 1no£.·¾dã§Ð ,%7Ô­y÷žzÙÎH @n×n.öj<ã²›ó·.6ˆÿx>üv�÷x﹄}@$EøRõ5dÇé.‚–¨Î…RMãLðoÞ‹cÿ Y¤ƒœñòzͺÀ/ Ïu—¯ÊV»¦BÆcTJì¡U7iÄn¸ºÜø ]1x»$Í`‹ÞFÙ¤�:GTÁ󾔓^xÿ–!CÑ„°Í.s¿stã©}ûõqß8ñK*B$Í5!mÁRjäG±d>3Áþž4Ò-ŒiËÜx9›²�k—äW ó:/:OÓ6�V�ýc¸ÔUó½à¨pFÞ÷1³b*eOKªåÝ^)¯å×ǼuÑqœ„¬¦—8Q5¢ÆÓ"žùÉReo 嫯Wm*È+éý7BŒ…Hž’‘'™¼mA‹ë¬¼Ñ_=žÎÛ8¼raE¬bB¹ÿÁÇäµHQ(ձƩþ®?«"p:33†Ca˜ºÿÌ¢ úΔfZ^ô!×Û×5wS·‚ÃÖÓWïùŸíåÑè¾€µÍg6ž™éD*™nÄAþ�zcŠBÿòÆQÐ`MȳýóBo+c3ôñ̸-É(Žkž«õB£mý²";ý|ÞЋíëÛôþìF�Èßv?úþݰÀçOS·T> š#“"ý7ð¯éMIææØ1†i¤�7>Wr2SäL39AI‹ÿƼ¸ïˆ#5ÿ�ÂwC©Ân´�Prô�Q�v†`1G®÷Ð 4´gŽžai¹txˆ��ÈW‡$!¡O3ŦפM‹&d\GþPÊC"J§dŠºÚáØ`�®ùWïË•‚ú=eð*‹{¸ b¹%µˆ•¼ùµØBfè®öGjÎõ£¼¯80è ^l²¼*b襴´” 5«€,Jn”C×’)Qb@O›*€œÒAd¼)/aäØf`³Âp3Œ Q ¨»YÁÓ´ÐRØXÍzw­ 5–rä�l»çÞ8QNA-‚•c-qƒoHI-Âé�÷JÓà€âÙì ²¯†ÞëÍZæ``I[¹QoÚ›Þþò¥?é÷"…ñG›$Ü Íoð×§O’{Eû踒lwð¿q·óaÁ[¶¸Ï>÷Cô MHY€iw„¦K<…˜C�”ó\QÿrûG,ÁÓ’¹¡9jûÿ»ø�† ãù,­ïc,†swßœYZ’߇ȞøÈ1á qŒ�²ÅÞ“µàÛ¯ù§_Bî÷Ãý'aíÐ[XÜ(Uðéû´YtìýeeF)Ä�¦ IŒ*ådÕyÇ.zãLˆD³�Äæ—ö9æ®?&™¶@†2Ê£ÀÕÆ#òV~`v@ÁŒ!ØÂ)ÍJŒ0ó/}9ж$/�û'6:ÄøÏ­RÇ*†_úžE´i§—kS¨Žº!ö_±|+³4rÑ8ëÒ¯Ž\VÑ‘Õ;,÷ö o®1ÌÖŸAq óB½Ò<••*«ëJÞÈ £ýUô÷á­Öÿvp¬?-‚•‚°#ÐÊŸ#Yý€ño ¹hÇÅì×ýÌwÁád‰ýÞ™|ùU<ñozZ»í•¦|ŸÆU�qµƒÄeÝ\¦L‹O9CãÝò„™Mæ3‚dÚQo¹ˆIZ¤Ÿ†é¤i¡¦„�e H¾L«ÂÒá'©òr¦ï„ü¹÷Κ\úŽÐ†Dåcè<)�OÂþ–ƒb!ëèÉjÃâYf¯x»—“`ޏpVF©ƶaæÂlµÞhPËNŠßúÙ�·Í(+Ê]L}Šj?xVñÓð¡D.YÁÛÌØ±89MLMdÁ6†…´bКlý\ý&h ŠLžz"pe´Ì%æ Ÿ9×cá%ž¥°…¡Or.E‚:è¯x rAm"‡ï`÷ä\Ú…ÈùÀ�§æ-ÈÑaÄ`ÁêÞÃÈ4Üd3Ƙ¨X¼…�˜ ¹œ(©„—P•\ôš¬Žöp�³¸ÊÓ¶kkjÈŒ‰Pùï:G%£—¡¡½�’Ô¹$÷ó¥òåÔbt€1bô¥’GÍ£uÞ4yÆ%B;<UM*Ðsj°È(ÂÊ`¯™°­T‰do`û7ÀXô :leNê/˜p㓆X´(·,2Í�=‚ÛÿÔPº‡Ô¸³�oѶ± ÈyøåDcýˆ{·ì¥Ä>.¼~:{pÄ\yyo«ŸµömrÝ´/òO§qϽÓpðøåq)×y�ƒÅ¿…Ù¿09eŠd¦HVSkÈ$¶AC#%èóUTyÐ:‡Û“·±³³éí%cç‹hëŸÖ#Ÿì[ôyÂ/�Ch–·Ôº¼�’Œ,HÍpÙ饔è’�Teô¸ÅU@ _ ³`„� Ö?æV’_áð‚!÷"7»�2Žäã<ŠÒèíŒ�¸§þò�É^ no w`�(tg…|³‹xO$Óž´ò´>�µÂäž38ç­iË£;ÐÍ}?òc³5kUˆa®�é�Oü@­ý⸮¾ÁK„c•>I(†Â`5 ÚÂHÌ:J˜k™ãI¹°æ0…mf×[žYt†™Ïéì=‰3v¶MÇ ‘¤DB (juHHæišU#«Ø¡+䤹òÓÉŒ­ç²bˆcÃÓôYø¼!sðæï{Ø6)t]§ÓµË.k¤ÖB!‡u‚¼nv ¿BÌŒ©�@¶„(�{|0jLN9ÔC;qÜ“�év¸"åÒìz9¾8»NHíïQº\ÔÛâ²Õ0[þÆ-LE�^Ø:Ù$•ÄC¨ïh„¸i<á%sçóºÞãº:ÓK{šÎ/ ;z¢\nô(†z³ÊW‹/ö›S;¼â£’ëƒÞq#ý{8—÷ͯ„¨; óÎÔÆ2¾ùšVo wi²¶ƒF®�ûÆËÒ >Õ;`r"ò ^|V_絬ž6XÓà§Lþø øVÀíçnlÍ Y®ª±n±¤ñ÷—\3Ô·Tƒ&z4<y¦}q蜞V«íÿá�`þ|cý2±`ç—)SÅÕ÷úV«?áþ_ò”iR`ȵ¥˜<{ a “w;ȱnÿˆÿŽÝL5)B2‘!×—›V¦’Jc H3Ø�¢ð®_¦c¯v?wMà�‘êj¢0œùÝc#¡ìšµÛ�LoðoÌÉ(̉c[ý2¨àWaŽÉàÐpkæ©QWò^¹æ—¬uQœs7(”±ß´?+ 毚 WûÈ Àíÿ²F×îÝÐV_·ßEò—N¶¯¦Ë!®¤ÄÔí1q$ ÏùYGLÉ_ `\@è?ÓµÒ“ ¬E9 HcÀñwÎàr›�A²‘�–8X™y Êú|¤¼^žÑ“|›õv„¯IE’dA4rKÏ;â2Ldуå5~Bn[P„(!&.tmA/ÀbRyâòv&s¢�óZdË”A'™˜¬/:ÊŒ’üü—Ï33�ø±$«à³Z°gÐrl`. WÝ¡©S¸Q^[zaÆ^blœ¥B=�*Œpû25§¦#GS¡[ˆÖÎÔY^¹E»k\€„­oL1¸©, Ó3¥äÒZè—GMxžÏ,ó84öâ^îõ`ÚY6ÖÏVtZÒ–¬9´k÷ˆ9qK† BˆkÍ}¹¶Ö`¤zËj7š@hÉ£zGa¨\é‘•V­XÊ1f›ÒC† Ó,lbªf<4u¯k@k�Ôáhû×'ÅßYTÁ§½kãíQq~�e1Gr´)0l¶ÐÅ˰c�` ÉiB“–³ä¯´yÖPVÍÖ‹h,Ø•ôχwH�¸%¯jÉøœ›;¹­�­áQ>ØNLO„3ŽI1¨i®ÿ>?§ÂG^wõ}ê†�«Â–A�z ÁXRùWK5µ¾÷}ùê¹€„‚;ñx |êºüþÈäßžhfV4Œéo·5äKÒs«çH99Z¨RPéÏFKÖP¶�ÄZœ¨´&ùeŽ\D1/7€˜¶‡R('nºqÁÔì'F;ÊLÄÓ{γL›½ÂÃ{ZËØyŒÝƳ�ÚYÂ8˜�ï½ ¸Þ8:ªéÍú‘êÏüP[ ÷<ö-°cJ,+&€§QKg>¹ F­Êš‘[�«³R»ð­«µ»,�Už´RhZH…ƒ~Ñ7Âì;kÄÝáÖéCm0³Gd¶<#ÁLŸkÄÙdjâ ÜöÚÍyb�äŠ�emíÑ�óàI¸íáÚ{P]›•ӹȽ=× LìàÉó“Ï^[i É6̇¸äà¨]‹vWAË«kÍ`Æ®3§-Ü‹»ã“¥œ¤§¾,¤ <ño,lø¤o·ÜïPY2Lh�ê6¿m|îî˹÷<–ð¤˜Ôû�£œ¢2;½¦ %AJrïæi²[z%ÝÞqr×'Dà‹a‹N”U{á§»µî­eŸÎåæÍiÄ9cËîõÿ$yÛ (A\?o'#íÔÜL7k‰$-êËŠóÓÕ¾p¿@ò}°^qèËÑ(QÇB�Êeþ'—1^÷«ÿ›—�…&¸ðº©YóÍaùðQ»äFpy¯§L:XTŒõ6¾ì kÓ¢�²£y¥äp:çga±� ú:gâ¾)Ïæ86Õ¨¬€¿jÛðâ7�¼ÚH9ë–3Äõ­èïäq~¯ÁÈçîDiQ ö7?ç¹Åš@" ¾ZÇæ¼óØÅéÊÙÙÞ3}› ]»îeákH(‹ãbâÖâÕ–Rú$T^ZÚûrSB¶.s¹~‘‘–¸V[—ÈÜEÞï’`¡wŠlù˜¨ …õ­CËô­ïL)fü›[>˜Ýk‰O^Saß…ÏP¡Ž_�Û~” LcràmUß�3p›”Ǿ´ÞÝv”Ž;ÐËŽÀÀlÃ[ûÍù÷ ùCÂÕ‚ùX´¨rI{þ_&ú.[hô³ÒsEËŠàÒf±rô°¢CÄ‚ˆÔcWÕ�ð ýþÎ#{μÙäD¶E7¼öNçlHh1x/ß{/÷:žsÄŒ¨ÿÜè�V9�„üù�D¡ÉÇÉåð~e ï€&> µ*�¤;<¾S˜¯Ô>Rø+È©Ö#'Ï Ú¼I$œxªL�äÂËkge+mŸQ³(ŠyIÅŒÜýQ™‹¿tf|»åò�‚Qn”‹Š–å—xEƒÝTdë¶1›¶ÖÒØâÝ<¶†¹éÊg0|õ °–*e­»HÝHÅ8Ès²Ã éa]Þ®¦RC1É7›ï é¿ÎŒÓ5!šœS"ƒšÂ²ää™Ómd¸JØuií&н|$$ÕÑĉÉh­ñéÁÅÇ�çó+–Nå‘o>ñÊ|ŠfbeïkÖnaÉ;‡ îeDômk1Ã2ÄWÔx,•„zi„ªµñƒ&óÙ(çÐÓVÑŠÒ…¬ñ¯+\ÞIrÜz%â‚Ù­Î�>ïŽ ÏZã0ó°~‘ÿ–¶R;Ã<Êf~É•¨Ÿyqk¨oR‹yÆœ#<G­Á¹h,‘5³a�,øb!Ÿ…s>[מzzÎVEÜœ]çÅrdJ�œ± ÒºŽà^£j8lÑlYúá2/–Î,1�^;¯_AÆ@@f= ü€ŸéÈ×À‘ÍÅîG¹½s•_h1Ød²BG¾çJ^^B�ßÔ�9ÙÉïu<Ž]ɳ®(� opîÁ4†ŠĄ̊Ç\儉ČZÄ/Ð�MZvaÁžy«�(ïçZÆü¾ûæ42iÇó„‚_s¡_ Œx—ŠezÒ_¯rÌ4¼æôæ#¿=k¬ ™^GmcgZ ’×+Ñωƒ°9¤è@Kü6„Dг¬"c[Æ/‰q°ƒÚ‹\£N[ßÎ@nÀ·³Œe ­lnËd¯Ýh›V‰ù‘Eµ9ño/rw oÎxqÚW#g’ì!êƒÍqÎ÷¸'\�ÙŒF9Äc$æ¼K¥ƒEÍÏ�ˆßfÏ8™Ë‹x£¤¡È&s{«ØOØ*Êû7ÖBö`I÷Ìg• À¢Í¹oõ}ò„àZÖX;Ï¿j­“?“÷åcî4Ù—„bñÇă$¦�Ì䓃ò}xÄ«ûš)�‰-Öb<,ü&æZÃ확W�£ÜdÁ ß4£ˆ­µò:ßé³ðzç$}b$™=wökÌHŸ âÊCFÉåaw8²òÆz t[èošçkl‹UÞšúÃ"S†ý Ðfƒ�*Áñ·)ë‰ÊL`ÂÆcÆÌ‚¼Ýn¢äé˸‚ˆ]ßÍo¶FT—Œ[eP€k<[¥>§s£w›)Ah—`ìÚqå#Æô›ö÷¾,OÑ�¾GÙö¾Ñvô�œÂ,ŸcMžÑ‹&§p冿êÉ1ogæ^ñ�s¶EŠ+½¥óϲɣ$¥Þi п¤ªÔWÛë œõ9Ï74ùEîÍ9ml`*ý>$¥+'HQšŒŸ0[Ú"äÄ´Ô)Ïbž›JÛ-V3ÎâˆßB4€¦†2_²¡®|¼YÇOe«�ξš`첆 º™Íó•†Åb¹…Ý=–-»×÷maõ°8ÞÌV…ïöþ´š¡ ø½ý ·Çsôa3JYü*ôzÂ7ºÍî0P§’Î~)z¨% kGÜ�\Fÿùí‡ï“âQ°ß�öÒ$?×O×ÁŸï<üοÇßZ„Žô›l½„ÄqMA{;‘¬óñR!hš{²·0‹ÅŸŽ*D*2ÚÝ{M™kvÈÁûPzŸâ\RaæHh`Ú;ñœž‰À¡Øö®œÅ’VmBÆá¤#ÛCzôCór:ÞY¦±®™¬×(¥Ð�h3Ð>eßD«ÖJÞ&âcÞö§3™êCëZD>ZhS?ŒÑO³C"�…Ò÷v•üdB¬Z4æ¹AÃ�d•¦8dXŽŽ]„€ýSÐð­9/n�9ÈöÎ©Ž ˜Î1�K:çr0P½h¡ü˜'Å8³pºRŒ[qüäA†´áB�ÈŠ'½`«´¬Xû\Ï÷—ŒÛü*‹~dkÜÏxòd~Ëx" Öc8õëpVHI 0åý9íßGÍè… Œ_{‹˜ °¹†]²ˆû±>$süGÏ÷À䆣ѭ¶üÒ¨[03"žø°×OvN×�mtÎh`)J´~ûü1úÏ_§Ä¶~Žo,)úÙÿG$>«9A›Î¨�Î…\E{…)fGYœä£0[ÞÄN¸Ñ‘R=Ü[ºï¥ËámÉ¢ÙV¶²:4ÑøÌ€]\-Ï%¾bW<1ë!Y|™Ý®kÇŠÞêgþwà-T0v®QE´!š�¾D×±'Ž”ƒ‰�rE -_ª°(ba· ÏV¹QBDß(²ë�<–­P† O«ï¶Ó¹²¡s¨ xCö눩éf!“̸µŽ†eV¼Â�Å_ŸÎ¨rpxLþ|íf1ÒÕé†@9è;éÄÆ%ÑúZ?…²d>¤ª¶¾î2$D OÊà­é¨-ŒÙЇ ZÁ…Ãcæn5÷Íõ/aá{€x— ºl í©ú«ÎóÈ(œ+�f¬Gë~¡‚-Ä”V”Œ ^ _Q Bäå—}ãëÓLÖoBþ!]®i—¶6c^cwÏÜ•üÛí,4ñŽ .¼%Îw’T•¨LñöêÔE$¼@Œgå;ž¼¦ð²9Ê-uÇÀ€½¯ %Ó&<µÉ—�o,kE%ú?GNú€¹)xk†ÎK(=„Uñ~¹ÇBŽ�´ä@…ü;øÌ“aßm¦êèäV+Q”õ˜ô"é?°ç æî“›kA�ÒÈ9@5Yu+oØÓsC¹Ñ¹_ÞEdy©y^Zʑ#q=®Ú�AÐUfE8ñCØ‹v½Ë�ž¿ž¥ëQˆu¤$í–Ñʶ<ö8"p=+W÷‹�ü¼uîîƒ8Ùó‰Â@žRäÆv=/xH>ò§­¬�f»¿Mª‚fÍ V („V9”¼2·yé@»2k³ 6ÖÏ#±zgª¢ÃÐy¾ å9ñÙ„—;M¨��Yá3k½«EfbЃ<ˆ)â7j�¤6<©Þs{?;À]oIC|2®®»›z·!ܲŠåÎr!7+‡ƒú©‚,l¨éãIT…"ÿÐî÷Z‡ó™WfxL#¦¯Í; 1·›Of¶×øÏÃêüBšÐ@q��“Žê@RÈ×Èr5êÜÍ“à‹ƒÔ¦­Õa./Ìd3¿¸ô]d¢8Œ¦²jERÝPR¡0î°xwtQËž‹„+ssŠ7’ÿ’Rüñµ±X-ªãnLÌgj¿t[!-§lR0‘U·+º)\í3R¦yÑŒQK'�AïÚÙm]8ƒ¸ÿ0"͉à!ªÆH ²dT)ûc¥&óQI"µcca{9 ¿ßd/%Û—(ð%ÔïÉbðxñþóÜÈš¶kÃ߃�ïæ?fúçŸé홵ÆPrÝÝiCÁÆõÑë� æ‚„Ö¾×auéœî*Pž¸�WÖá|;’¹qy‰41[]÷sÂÂ6�Y×Hëo Ǽ¶ ÓRÙ*­z"fwa–»Ô¡lš+�%'#y½,Ë)-ÜuV9ÌŠ$)[ʲ ]µî¹ÁŠ­*û¾$¾p§Ìc �;=w�o­×Vð¸è3ã·çPâí­×Y´’H4“œçšÆy4mgßhÒé7^Ì cmí|ìjúÁrO9B™¼&q §ÅV¾¿¬/b‹GÖ}òHô‹S+k¶"Ý¡c›¿ÑŸ˜»»ÞÃ_>{ƒ´ë�ïiž]¸n%žÒçl`ñgS¾è£€ÞÍ^vI¡Æ#±åæ|U¼fldã+¶MT¡‹±Þ…ôWË,ãP˜¯-G3�<‘ÑRÙõá÷ëYÝ„cy¹a‹—/mec÷OX;ðhüÝöß#—3ÞÓu b ¦Œ 8ó'µ× vÊ�ThÉËù†!§Ü¥�]=_é2b™Ùš+éϹO9Ç2ÖjÚ‡í{çƒTàAøn›FÁ·\"+@SR0uëp¹x=Ë®as6d�IàWuô‘du/‘ª±²vsÃsOŽ`�‘t•ç óÊóÉÁn¤åzJx^ë­–Á�BmÉmmÅвJš^�"�'£ºº­6Ûp/Í&O~Œ³ËÃ�œ7žqI¤SIÛ;ë¶1“+Ý�¯ƒ .²¹ ÐïC#Ë0儲Cñm4þêE}Mé ¿5tL¾0óï�ÎÍfOK+;°•Å¥P›<Ó+‹i�50L,ó°`‰I\ëÖ?-=Ì$Ÿ7€ ¥¿ôy^AçR<~xœ5F{´åDU뻨è›ßŽan¨Æ›]§ |·IÍóïƒ[Pµ rb†*óé 䱡Ѳ®fÝS+%… 3ÏŠ#0'Û¼dä]…¼vØ»]·��¨ðÅr÷:É´º-Þɺi>Rкk‰á–­ãÚ¿}›¡¡4âÀûæüγàDÜ€öþzØW*�è…‘}®é6ü¥¤Éq ñ§Ä²I6x\œ øë;Þ35ê]gj©Þƒa;5Úô¥¼g‚òL‹bØýùÎýÊÞ¨‡Æ]¹š„bР¯¤¶pO$q‡9½×[]^ŸðX]·:‡Îìb<<ù�›�a ŠŸ\Ùù±¹)6}f’HôãòÛ¼Wà§J™s±Ü¥¡gR$!þÛÄ“Ü鯟 >ñú>ÖÚ©±pî ñwóÞõ"èwíý%Ͻµ÷Ólƒl'Õ×äbíV<× Cc^ðª+v †~ëä¼–ëÉï¸ ñ¬ŒÚŽÂþOe�âÊLFÄYœ{ìq‘²Ã=³\ˆKí9 ˆBm0õ±ì«Èi¾&ÆQ6säa¢£:èri²µŸÅØ)j@ðr¶§]”Œ¥Œ"ˆÍ`é®^X¬Ù]"ì˜9cpyVijMy•Løö1wD-F*V+mqYÜ´ô£L€–»Jó¨N¼q›Ïˆ+ÏóàA6·Bòß@ÛgaÓ=O=lzw->ÒÆ¬Qîf¦ÿ¿+Qæe8uäü8ú-`IGS Ewè+’Õ×y}ã^cÏùÝy¹vå=îágÙúÚSé¨\ëü?˜aœÝ/úÇЗNH~_É1¢Ÿ'^ÈFDàšhþZ$öÓyb÷a²ÎÔEïH€ç^êlê›Áh.ÔÌ£ÚI)ÿš£”Иqùô¿ 7n‚þKêDÅÓtÖ»:o˜ÿ¢Ñýöï$y�^¡Vk22•µ©dÝw7=o¿åwüã�Ô¿:Q'™ gêlµSòF¾ú‡ýÖ®¬åk“û<œ ÓEµÛ÷Æ™ÎzoSþúÇxŸóÚ(ú¦ž)SÊ<-r»ˆ >þ 2ŸÐI€$€_L†’òYú4jA› Pªà¨ÏÉhB&Q€žv-º§¦ �?ÒÊGsŠÑ GÄ�dÄÀý4CD`wšÁ÷úã¯ÈPšüýý,_¶Züº…ÿD­S¶ŠvñÜØ…=£åsÄJ+©.‘FÔ¿ã®&MsΪV—u»]«ìÚ"4RЉ<$ß÷�cp“ÊÁåÜŠ2ãþvÙˆ LY¹dœH4âJ˜“|JáÑÎ ë¸V}Ü¡ÙÝ‘5£S½Ýc¨Îù8ÏjUöÇuvœ�<½4´à˜˜Ý›D¦ôLe2‹%³ªårvÜÌeÉ4·ÆWxÖ+‡/y7WéL¶¨õT¤Š…™llŽ3Ê7“¼Ù›"¥×�ÖöË"gS.ï"Û“þÌöýõ¼G¶H^£‚ß$7÷믿ã|�oÏŸÄw&l�1]K†�:5&1„T5ÀŽ[=©ͯÆ�ž³;]¾(oc¶ÍR¿ �ðôJÎŒj¯`BÎþ:}{ïÙ�}ƒî`õ®ýµ€OcKþ¿û‚§”…Ò ¤X-ƒQwc)$ÀÆ¡¹ÄL±‡|#.aÙF æúiÿWc=ߨîh%îò®—_Ú"}ê¢r² ö¡’Ot… ´ZôS‰M;y­ymaŸ@òÐ1Còngg] N3¿OQ|*�tÝd÷™Oˆ'‡à¢#Á\†GxÂ�ã�7³ÁäA¨@âîݘßÍïèŠ6l¤0B”¥.<ѲÁm2Òôú)©'éXsotö�5!i‰Åp q�KÔK%Ùii!h?NÌ^.Âr*Á¬Ò1|£1Cõüx±¤œ6õ}ž ½¬l~‘S,ìa.¤·ßŠÂµp‡V±®èëtÃ+j=ôzC ?Y5ÃÉx.©m¶¼'+Z…#wL¢Ü-°üÅÄ7·Ï°a-‰³C–†‡÷„‚Ow×Që§œ{Ùm$¦ùÄ¿—Ä÷[‘Ù€•Ã÷g�_ËÇq�yö»¼Zˆ´ œÚÞµ­¼Xáì‡7 ÒÿoPVcùmˆ £%…xl?eœ<ýt! ëìí.�­Ì5’ ‹6š'ôb‚s¥`/;-`�gÃô°XC z\DA ?w(’³xä}½Y,Lxà]}çs‡Íø˜ÍJ©y.›,¸Z,¬ØõuLJÖ,mÐNìèTH>k|Y£À�Bèº� Í>j ¤4ÊÍ p{b ,±8 ¬Z}ÞýµÀA"º¶æÚýtñLAb÷bÔ¾?‹xüBÉGÑìŒ@jkÞDʤ®ÆW~hˆ¬Ç`6@bú VM,¥¯ ‘¯®KÁs�L6]H,ÒTz[_½Îªœ\l¯ºn–³› LÞb÷ÍzíéW—Ï E“X¦ J^—åX§ö#"3„Û�9;�9¼Õ™5D8¬Dé½-VŽÚg§5¡}7Hˆ4“pTèwÞÜ·êÓ^ö}‡Ì]}Œ¼5żèÏ·è¹› �ô8¦—¯+Û�×h'�ö˜ “U*¸)¾�Û~7¾é7æFKf{€W›æâŸ�ããÏ7ñrúµ×ùz°ð$¨­Æ�À^ÿ¯�THPwåÎDîöu+ pQñƒSX4çÛY¼ àãZûÊ#µ¬'Iˆ\}ð×zñÃ+ðýÀã“wÉÒ‡"M¦ ÏZÃ;ÉjQ3á�`^!¨VÇ ¸‚ú�5{àÂÉ…²êŸx~Áß1ötû˜4/‰u¶ÈW/G†‡Ÿ‘‘åìz�‰�#Í[88W.®o¾ Óýåêõîz„¦8Ò�çFÄP„Áúü—Š˜k^E3Tz#}œ×#YÏ-Þþ3�}ßœÑ3ij“.F®Oº[vúÜ ÕŽÏ5_¼Ï>Æ“£™#ª�×[4Å¡.úMõâÌ5…,Éuì7™paG™´ð9i�˜h�[ñ-«ÆÖ.F—`~nY#BæÖ«Rq�¿‘^,)·kÎñÖÈWþQ¡b‰Fy#?:jI}˃^9Õèêëº™î©æpéâõóX)¬šps.ç¯0Äî3¥§…ÍYÀÑ8‚œ¿AfùCóO¡ÁÁn?�óÆò=Ü1]å1€‹lçßJtöº�вS´plÉÖç%u}LyÝgüzØå‡ŸvùKuÐ ƒ—ñ³WˆhÀ­u£þ�k� Y9;$ob%™R V!© Xë È€v´ü˜Þ_pYÁ 26¤žT ̶�ûñ·zl`ÕÒç‚�(5Ÿ2à‚+Fæ­ Pé³Û¸AЏ(9¢<{UÿYX}àÖã/Qáö¯¼.?lfJGšEÛ�B!d—ÀC`üEO¹n«•h›Â•$Ä`æëD0g×Í«oÌ«\ñEÎ0NÖ»¯ ;5Þ±«?_Û:�îÚ5„Ÿ%b�m}N:÷·Ë͹iˆ˜¬ÞHHzšbi’q/í�‹¼œq™.Ɖ.Å9“¨Ú¦ªVb#A“$̤3ŠÙz¸é$¹1� ²Œ¡‚JA¢ßH͇'ô‰RàÈ(õ™Â“wÕÙ—*™ÙÔ�}Þ—µå±ÑMJ/9’îyšH\kèÇFlª„©”'|ãÖ!Fß{��îx Þ€Bô/ ƒ´dFM^f[W�¯¸Ä*wÁº 6jR~óÜÌéª?ÁÌä—KsnXì´`úžûî#tq|Ñý¡WyÓG– H^úú[[¥e^>Ô§Ÿ�уÔ_«dÏëoŠŸËèìƒÐ]š¤;ñcÓ7Š%|�úø ��žŸã­T)&œb³ìírù5ŒåŒô²5�™QóÊsR62<]VM=L™Üà¦1v}.ù 5í.›ÕÀô¿™ @%óú~: ¸Z±ô˜‘Rg£*ûElüû'ŒèýÅö?xeQµ~HòKqXêõ<Í %.A6e…u¶HFÿwÁ¥43ޯ擘AUÃ|h‰¼ TÛã‘fqO>¹‚'UéÏ»lÛÏ3¥ï.ÝbÞñ÷ýO ]êì›+–®½/†(0ü:>ÁÝ\c6’e|á6ºÎ.ÁKÆæK¬´in¯ø¾‰Œ¶¨"¨³ø_™)")¥|\ó5ç>,rçÈñ¸w÷[jYÎ\\¥¼_={ú#�uŸ64æÇ�ÈðvÐ6,H,vüu'E€'Ü@¿Ê+Û *=ù¦SÄÄ#5ADyž"”Y!¸"+»8ˆÌ¤†clåËëLZXËŽš¬~LYCG½Z™L^p8:`´c‰-‚•äþîåå褳7|².̆c=Ù‹¡fÆ­Ò<�à�_„^Ý3åçÀ·µœHx©çмˆÖ¬í¤Ç…Œ�-=rGÇsð D|›,7yµì gW6 WžÏݨxÂZ¶ŠÛ ­€CÅN–ÖÉÓ9Yù¦q´óM[ :¯ýÎ:„ž¸Hš¬ÑªšÆ$ª“Р[dÍDÅ'$"R.¿ÉÚ�¨•+ŒT[ù¯šÀp„ñPÿ)*Ä{âŠË„Éà¶\/JK'×»=´[!fñµÌæ…Óœ\cÈ ˆb» ¿Où¹Y)…Ì.š×´óË­åî‘Û^^cu`ÂŒj#Ͻ#,…L,åÂeX뮕 oL/´È4·�ñ€èÎ|ל{ÆóM|ø®0OJ“¾s`©á±m?dMã¥ÛëÃeYöI çƒ=½UõóJ_ÅÙ²SœV²�dü³Rö‹qJ¤°­Äs 2I¡=+cÔg¸ÖÖ�aª&666…—P¼d”Uá¨ï—š!/Zù¦›Ø];SyCkÙŠ‰¢äBI®7‚X“G=N¨ˆ:9!Hžÿ"ˆ5aÞPÒâBM@ñÅÙo~�pP‰€¯E£ÐßðõíÆ°ÒsN<¢©T´þRßó1-þ¤Í=­n^ÍN«%(òW½à9'•½'Á!4&t^�!aJ i"rX¿íöLfk’ùö”ЏoóýmCΉa«ø÷prÃýð¹¼oü¶(8¾ð´ V;ÿ)PY¬‰`ºÑIRþÿ'²cJZœËÍ~ŽjŒyö¢GÜ/’/ƒ›VÔþ �¥µ@‚¥šÜã¥n“AþÚ^·^¬ZÖLЕ®Ko¯eQ�Jc&5\[9™¤|µ"ÕÅ~–"ü`çC¢ÛR ¤¨–»¤½Í¶mS¨œdÃÅò¤•7múͬ¾TÖùɱßöR˜ÊgküpÛÜdʼDFæÛŸ³t?•�‹å6H÷ÇѰE.þpó•ô9¬L³ôŸ�È’Lã«äDPwW®/c�%ËW¦®÷N) Ã'EñŒ:¾‰S�t•¹{yHlšìÌü¹Wb’’1·¯yžN89)=Ü× �êozkŽ:vE�Éäw m†s:.®ò¾ÉÞ±Sä@ñÄ»B*©÷U²7€½Ö;¤Œà‚É]ðÚu«Ü'w-Ì`Ú‹[’šö½¿[Q€ŒÈÊšs“‹±îOÈcŸ%T‰j¾;cœb°™ ¹íÙ&÷'÷­a±™‡mfýÛ<“vò›YÊîû25αUŒÆX-\aÑ�ãm.G[æ� ³†Cl¢>2Û”¡yÎøÞ/¦ã*_"oM”Z|ó,u†L!¢Ü)N)Õ ï)ÆÙkS}j–ðå Ͷò%âýÚ ï Ë2îÚâÕ:rôºFÙî>Î4Æ™/2»,çŒ<ò¦r§æœ»½Ë+Âãƒy6Ã#¦Ê*Dq›|EÛì³�É=òá.�ºhdk—ÅÉ�Eý)Êùá×U,Gãìº]YbÌvêE¸Íc�ÓÆFëH"£fà¶Ê@ñ·BMÖªpœÂaöa³‡–¯på=Ú–$� ¬æ·œI©SŠÓ¥×=>Ï{;*–_ÏOô½þHSÕsü¾Ž¹{H~›}×ãßÛÌrª4�[Æ4“çÈÚ?ŽŸ’gïÔ„ošÍm±·øýx÷÷µ8ŒÓhÄ!´1äâ!¨mÀÎÕàÒC6M�D4‹¦aC˜PØ¥€0ý÷õPü¯0¾¾Ê—# d”±�V(!(Ç0†—­«§“ÄÄÕýþrñ  ãKÇêïÒ€rzùÈègÝ‹R’4»Û^fiÓ>Š5ÇÛôb<ýÅ�Crwü"v`¯õ��¤¶ï íÕ’ÇÐj�(5òKYY!Tµ:Á›f•¦y<úGŠ#2½£IºñUŒ#/, ®/6¬ƒ}W'À>øßsÅgÀ�üÿ¸µŠyèù*‡ì”;ç¡¶\oŠœG…ú�hãZ–ªy)?kÍ1Vö…'—úºæNË9½ýÒ@V[Ò§ø‡x¹hBïÍл^ä;oúîy¹”·Ä ÞÜÀoŒÚé^¹|ÿ_Ë‚´ �µÈˆˆ54jÓ¨‘G�“½XiÐñI¤yjs7ui•S%Y#JM;6®Žà¦7}MnÉ›°ûYóM‚Ü_}Þ¦µšÇà ‚ypž1~—íÖÛÜ Ø�@é#9Ü x\ƒX‡ÌÑìù1„ l‚­Y %W ,³ÄF/Ì!M‚\ øÅŽ$Í~ÈÖnê þ4ïŠ�„ï³sPhRÙ Ñ�¡�†�lÇ$„;1 >•™è¼<ˆ´‘?†``|kÕ`¥„ý]áŽÿcVþär×¢P„¿Þ(êþÒ^JÄ þ0Àøû½ãÀ/ÈfMÒ‡ s½­×;p�—–¸¹P•ÜÝb2b¹S…_uäÃÓ5ÐbÌ )V‘ªÜ´‹9uq¶w'0;øH>:t€2¥,�Äþxë'WÜlMÁú.ÈÐ4µ÷/�iÿï`¸lƒT!/ñ„‚îùÕõþ WïØÝôžú;?a"›ÂY*H‰ÿ^æÃ4ø¾�›Í‡³äÁ”> ê/YýŒ ¢Ô¡%5n“‹¥ù}•XÁä‹/ðÏ—‡:M÷–‘Ï ,xÀAÇN²`ÁëkÑ;Ÿ£OikóïòLË$ßAÃà‚½¶@®×ÕJhQXË¢pËÍd­‹ËöÈ·Î�sæúøï¿ª�ŸlµüøË¢°6›cCm[§Ýâô`uõ~ßÑ•Àx0R$¹T²yŠöí°&þçßMGR7� a¶úA}©½…PnUô�§–åøù0Ÿ§�FJó³Å@·¢JÁÇ¡žúNl"šö׫E¯dZ“Ï#6àƒ5cÚ²¨Õ€âßMÄäìšn‘YéÙë3S—RBYwûû�q¹å¿µ~3_ä³®É>FíØ±ÚÝ¡»{eI¯=òÊÖÓõý…”&ÄÒMéÇóÐ0àyµÝíD`É&Ñú1þ~¨ÿš‘@ìY]ž:YÊLhVz–R\Y¤Ä~•ÌÁÒhâŸ�jZæ`ˆ¨Ñõ{1?îû ssMW†½näè�”bÁš·Ün¼¢Ï­\[Eîx·FVµ â2é#¼…騕¢\ �Õ fJ»Ø©–V+±TVr.S-uELÂÄg쬓cm©dÆÊв#1ÑëúšR‹r~‹•¥}|-ÿ˜ ¬“)¬¾küÛ#/?¸ ?øÿÿø0¨/ŸGß$¨AôÐÑUˆ PÁE•$ * ª@Q* }ÀÐlÀ€/ž`ô4ú:PEh@MU ACTÀ €ªè4Ø�CÓ€v*•9 ¯CÑÀ  mÅÀ㺣EÌt×@»åJ®�.ÀÕkîÕÝë×=· pÈ tk]:V»�€…hh($  Êh(¦â¬ Ðdè€.&Ѷ(Ð4Ѫ6Í5v®ƒ@š˜6Àk·poXô£×@6˜PkB†ŒÁ02w€è±ˆêØ Èb *€O° ã× @ P  3£M65,£³UÛ»0“ (Ôúu h¦¤4hi’Û-0ontêŠA ÑÐ� ÛÙª:ÐpLÚÀV… ¤i®µ§nçmÐ4vs�[ ækj P 1l:5©ÀÚÛ  ”Р@ÐZBî%@ÎL(t °­a€‚V€Vç¡§õ€JT€í°ÓÃS¡I 3@ÔÀIHˆS5==*2ÃSÈÓE)SSÉ0FƒSÄ� 4‘…6§¥= =Rªžš� 44=D@€Lˆ†‘†ƒ'_þ¿ùÿî¢V�OüŸåÿó”/ØÀ’-zŠŸå›/`¸Éj¯L¶ £ÜI ~„ ömj­ö×¾ìUÇgu2\®°…ØdÝ(­Ðbîº ÅݦٮpÛ4Õw:éK»n”æìÌP¹tÙ¨³v]9u6åÑ`Cuq¹Ä™aÝŽ®]¢ÉÝË…tæ»·u;·"«–ç#[·6ÙÝ·7f�‘×]eݺ“»]Ý\ÝtN®nmÑšéÒ5Òí\ÝLçVjf‹»Tr×usQËš§#¨7)Õ�:;n»�%sv”Wu«–‹ºä’Ül›¹Ü·Q˜ÅÝÛ›«§nk³pÛ©f±Ý:ݤÀ×]Ënë”ÌÉ)åÉM.±M®ì»ä‘ •wuº¹]ºêS©L—t®êç9«­ �ÜbÒ.TÍr‚ήì0»˜ºê建wvíÔ;Žî·Wu;\®êê Žqt�rÝÜB–wnå"îÇrEɆ“î.é;§ÄL"¹—×.Ý× £Z#I¡™(î®Ýºì 74íÒÊ7:¹£»¹Ô¹]Ý%M3»µÝns„,VíÇ]×Y+”€Í;©tGQ×u‹¹Ñvå�sr;œé™ÉŽ�Ì\”mÊuÖíÑ�®Ý®]œë’å®s;»³¦W[®³»§Xå‡qÒìÆ�qŽ+®ë»åÃ"áÖºiÉÌ‘tëœeQ™¢jåÚš�]‘ÜÎî뵺W]¸Î…ÚîÝ\ÝÝw;e,š‹ºã´»Žäºí\êdçpŽÎ£¦Iwt•Ò×fë¸L;ºtÎÝÝË:r–"3¸—nd¹±ƒ·bnØ¢îºæK¶ë·;©Ø «£®îíÈ".“™w.·E×K\»¸Ü¤ °®ëª9]7NvÙÜmqÝ—v»®º»»«suÛ—#nPíÖuÜÆåÕ5@YuÅ4¹§mÝ×9‹uÍÝÝr�»E3šwdN˜®lÊNîPÃw;¢›©wwI»¹,æäŽÝ Õvºä£bÍ6wnSÈLG:JSiµ)$ ÐÅ1¹Ð%Ìn‰ŽîÐX;¹œí@f»³®;®@cQi´4Y–ŬMIQJssJhÑbŠ-SwnPÊ]ÛmÉ#$¹Ä–Á¥¹tÑJܵÙJ¹Ù’)0[»�Æã$6Le!bŒÒØÓ%®Z®fG:©·:�Ðu”IuÖ-¸¦»«ˆÊ)22Rå;n2¹ÔT”-ÝËSf嫱F´A Ý[®NêZ%œê4´Ò¹]+»£a Òî¹c·[°«»mÛ¥uD³»±«œ7:E6é­%¹Zk(ÆYªi�ÝÒdI"›EÉ®náÖéÄ×]ÎkvÉ™®ìn$uÑhâ›nYJ Ó’I£]ÖuuÝÄÚìÝ×Z5*›»•ÝN£\¥•wWiFI¥"u·Jîì.vbÊ)e#“«›w[®îPÉ0¥µÝ·FGvâæ‹qIFJ%´·:�fjJR¤D�ILwnص‹i‘nîc32L¤Ê‚i˜ÆšQ‹ƒl!„ˆMråšrMtÆÎŽS\ê±ç ÍC,³S"Ù$Sf³u ³»vmÊ�Ûº×TºvIFÄ]܈2ÙµÝw"®Žrˆ…P ‰˜“�MÖv®&7]n“,,‘r»JåËréŒ Üº´ÝÝJS¦Çe4’¹vÝÛ¹WfÙn»•tÅÒçwg\M¥  ƒŒ¨îºœÜT×6�ÛºìÉD"æì6[º®.k²eÉ*ëM49t§+µtÜMÓ$»®.q¦6ág �¬W(hK8»«®»�% –º;¹®¦®íƒ[b»:Sº»w\(Q3Pd»¹¢»»I#råÓu )…š01ºë§K®ëŽni4,�ÝÍ4îâJs«œ4æä)svå×MÎwGt¹¢ër»9n›»—.“s³QÑÔë¥@%—5Úi¡¥6ŒÝÖ䄦&¦Mš¹„Û�Ôî»»Fæåf)3s’I¬îê`»¶Ž‡N›�]ÝNhì”×,é®lféÝÇ.réÝÜÄK;·\;±“!®ë§wRJn™ÜiΗ.æ»��”•Ë»»º.Pîhî�ÄRÝr�Ý]×Q•®»‘wWI,$J»:çkº×I(¹³·[»t»©uÑn:¹s¹u™¢Å"Ò1¥ÓFë]Úë.Q® rêGvÝ‚l®ëtœ¸Ršç]Ü$›6îÜ1Tfc']vÝ7RîºÅr䣅s¨ÅM�¦JdÇ5t¦¢;®Q‰\µÙ›®íÓråÎWÔuww7s¹¼6¶°!ØÀ H¸V­Uå¶Õ«lµª²µk[^VµVm¶ÖÖZÕ[ªÕµR«Vª[jÕ¶[jªÚ÷íµjÛ-h�xÿqÆðIë{$Ÿêp*©8SˆWʨÔ׎ÞtUŠìp*�VÖ/,Ì“^´È½³@ÐÊ\ТæwBKIºV˜±º÷Nèܨ7{³‘ÒUS‰{uÎãü½Ñ÷ G‹!cº¾ñ¶DvóµæÄ}á†é@îå8¬7ÍÌÀ¢ñ=K �‰v3{osj�—¯•{9µ\;‹!òÞ�Ò©fz»ÕÂï\ÊœÃ|•Zá£XÊïNâRy-pÑÊVeÔºjdÏ`½uÜ·‡j¦}Ü÷Ó8éÍä}2ìj�~‘â®7 oeo Ú¬<7:eV˜T%ä]ÓÓ�ö(ííP¼ ããd‹ÙzKKÛ”;­Ù×Ô*+ à`Œ3;(“{„ãÑV1Š•÷ Ñ‘ñ UŠ WÓ -ìTdå'­ÂSxåÓÔ*ï§VÖ‹u`ÖÕÖß> \Xåâ––“~™º8K [f²¯o¶¶-Ú>9låîH³aTªrWmËq›U£°¿Và5Æ*9 Ѓi–éè`¤ «“¹¤8=²òü°»¤öÝpQö³Ább5 ]ïðþüPÿŸóºÿoäwþ2ópî}¬Íºlµ Škÿ“ÿ�nÍê̘²„~ßÃ`ƒ<:%Ã]\þÿ³¿ã�Á‰Bãg~S¹x=u¦d5’ÿ3¯�ý–Ç2iæv¨~‡+ò°ˆ/õ¼åtó÷ _¶~URnwf;Õ0çVë/Ú¸dA‰îp (œ¾¿Y|O3 ®ù¡™i9­¶ÏÄ}©äδw?J„)nûòÅ�Ø Sº÷újûv³|®mQÉÿÔ æ‹99/�+ŒÕmJâ6DiPùÛæ–P!�7DF¤­HãŒÙÌ’O®«_åæàNØÔ,óãæTéÊ÷ž"f839Ip Q™à÷UÁ�Q‚¶³fCÚ Ó›Ã,‰šˆ”�›xƒ“n˜ð˜Þîq»ÞrinZù–óÁ`hðu¨Ý|50¥ª�³�ôc5—D¤&aè‡F»1=©¸Ü1 ؈P‚÷”ût\7ÌB! Õ0UEÕ|ÐVQ‹„•E—ÁØ‹sus�~FÊ�Ù,›G÷VËrÑ¢Js•ß¿Š†ÐãY¿s:…+.X.6’†NU"ÔÁa‚á#'³ªì³›ñŒ�EWn qqÙQ=µï-•NÇbDŒúíã$‹C7ý>ù }›}”KÐUÌä™POüT›m÷�y.�ÏLs¹Ò1p‚Ò&$"[AïI‹8“ûˆ:GO­KÕµšàÂÜ^õl¡›Á” Ηä¥#ïUÅë7• ·ku8ªõ•øªÆH*f |�.s 6Œ¥UÄS‰[#Ž¿,"ÚY…‹$R>·úŸâ,D¾ŸLç4ƒ‘³µEðhú¾H½EÍ Ã¼?#&Ï-_¼¸*øˆ)¦�0y®˜@âÈ\ÍMÊæ¾Wœ ‹¡GÝÎY²¢¡ÁUIå°pJ¢êw5$ôÏo¦¢óž�âfs˜¡¹W!kÙ�ò�ÒÛÙcè“&"E^­ñÃ:7Ú :=~�?Fg¾ ndØ.LI ™z¨¨¾”ßzɺôc&)„�ëFO[yãEqnb lÔ_nЮœKµÇ5‡š{ágGr¡«"ŠL¸u©t¢H€Ô£,qÂ0Å@¶Tž¦¶ŽaLr´¸ãédS „JJEÛxI¸,ÊFó«…ÂŽ÷Þ¤:¦¸ƒ£™_¤VHÌ»Üyü¹û³�ñuaì¬/ëvø¬K3,bCì9e"Û»š(™�‹ò!¤7³J­› –‘OkÓU‡?ùŒ_‘#裡&¨“ HÒFHÌN,ŠBý*"ë¯Ä;22n6è‡T‡¶Üð#Õ�5zš¾b˜”M¤Iˆ1í†8Ÿø…íuk©Ú­Ðo=Mx¡bz¨piÑј´³e†wþæ é^ÄX9ž9ç‰Í în1’ ¦‹5-�ÌAF–&$ÎwnãŹâb¼\5Ù\*Bâ&!ÌC‚„º0¿ yËßq6MtÅœjv8�÷,ŽûÔÁ›øAhÙAøWK¦ å’nÿ6쟟£¼;ñc%öPßÔògÚBü¨÷}¬Qí¸™”J‚Ö�™Ëœf÷/\VŒ+£ãé�G!ªG5-Ÿ'o_J¼ùk‚‘$šcådúZôÛ�ó¦©]nµP÷½æs¥pLÊÌ×éjp^ËúsÁ®”#“«øêgy‘ 'n1…!³IB.;€ˆ›¡ãRŽREXøàžÖÞ¬A°ÈJ#e(m„„R‡ÂŽ»5¨,tîA;õžÎaã­­‚T9;"á‚"F�kŠ›š×n;¾#¹„ÂyË‚O”š³IG4Zeqw<óQË-ŠÉŸ„F8"[9”n¼]ž£C~g{û+öt]ò¾t!«$ãxúÞ!¦œ¦H ¥ôœB`>Gf%e&�”-WOñXËöù>ÎIãyk3ÜôÍôÝeù™ÔUö¢2H$‰!‘*KÄM6DËN%Ii FîþåY|g˜ÏqÜëÎëäÝæ�% É€YV¨ïä¼Vî+Rg =Òa!�î¿Jkž´36S¶E,ÔÉÔ †¬"HN!g‚ªÓÇKey:†%>º±[ñèžY-Ú53¾¡TÈ@eiNÈq�-EV*[„�jÚ¢µïY¡æ³�Søà˜AE±È��TI=Uˆ½¡@ɋЅĘ1¹ˆ­u?Þh¼¢l’¸qºšúNPæbäL©béüsÕ)K“~Œü"ŽÂ Ur�‰Ü8ëÞ£ÊÎäM” )ùÔÔÙÜ$FN`§†I:ˆú97γ¤r~eVIƒ|¾¾ Æpn¹5É´žEÎaåÚÕgVRÙ1]À×0÷åñÇ\fy§º@3Z(åì5Þ®­—VB6bˆ‡+|¶"ª; z…‡&ÊG�ÔâZÎ8à[o2]§¢$1ÓºÕA"T Z<«E™³ hÀœÌ…rM—TÇӳ鯴é+§VV˜j«& ç˜÷ÍîLÆìgTÃ4B(Öû à‘«IôäåOº|Ћâ]ÊcÔA"í(³GFc¾ÝD†É0œE�òP|¢Éê ‚,®åŽçD<æ ¨(¨%Ëò4SOñ0rK•Ì0o�FxÜÒ�í ètFàÆbáLàí�¶ææO�´Uä¦ð娚†˜=©«*’=q霋ÏuGÍðs­?#ß©îDÆDúFMïmÉQd½—xÅ+‹ P¥¢'mʯIïtw"1F "LÕT)I‘ô¼#“Ïšˆã\îÃ.õ ÉÎzYÊ^g¬¡o9¥N*†ˆ@ò†b(ýy3£ÚoMæ>ù\ú–ÏŽŒæ|YœüYr^Câ`k™Q^H©F›áDËĉ"Eïn:JÎTÜH:¡.�îxaZuÌf×.‡¡½QËÛò3¿MÌÈüHÙ"ï_â¶~Ý¿×/Y(�¿6;é™f�_nSã}Wx_ê½I_ï›cð‰ÈŸôhëž8€B(tŽüÏёՌëšqPJáA«Êüu×€í¦n7`3O*YWûDæ_ï¿ÎºU¨VuQáƒ&®£Šc‡eåÖlÌS}Àú„ <íZ ψž ˜#h­‰êà:']§O䲂ÏËÌ¿ë½zMõ�üoóÍ[[ª�2ªÂ5Ê1wÕe³½ÏÌþ¦Yfcéë}f¶¸já&ªuÌÙ“ªIÅXÓâ „‹´Ô˜é�ªQ½jf’à…õ»h÷0ö>ùÝü6ÒèpÛS0} ð£V&ã%Ó0D>+ÚCr^MA�wâêbqW¿"³Õ±Å1X’Š2e6S€Á9Ê üŸSš�„]¾ ¤¹• ù/ˆ@HãQ©‘jÒD=>�I±}šV¯Œ,ÆÚ€ÜìåµE‚¦0î8f·�yøÝ*|›ÀpG9yÆ¢JˆõÃh?°bWÈñQY ßå5d%2Ìt˜†=¢C¹Œ·™ÚͰ/-¸ÎÄ7K1áEÕ±O‰0wÔ³B ¼ˆaÃ4f¢Ì__Oœî„4ÅžƒŒ?.–[ÈuSAH‰g é6Ø5#s^8Ò"R>[çL—²÷ñïWMŽ ö·Â÷”—Ÿõ>šè/9‘ñW¬¦^}tdNä¬�H†ª GËQ{yù«›^U÷¯qÐë+˜mp8¸©9nè©„�Ÿ!÷—5¨ŠÄ“v±ÓN¦Žùaù§w.=i:Gæ/Šˆ©h…Jßt¢áÏJ»t^tº{½8éVÁÅô‹ãȆׇC[¼™â]Näm2ó§Ü« —3d&v&‚‹CÑ�ØÚªYÞµêÞ%æ.tI½Ãäß�«º) B*6¡‘Ï/== ÀZÖwÁÀMM0àT¦î8±�j Ña¥xË�.­|â ±†5áû~ï§]ÅÛ Ó{A£ïµÍàQ?W5ãlý;…²Ã9ŽŸ©’ù?^´ål•{���¯9ÔQ®³ õèAVUânBáp—t¾vé1zÂ-éŸFîEQ�#�mo~·=Ö ¤X;ëhiÞjŽ¡H«ªÉ£‰+‚ˆÀ0ªê¥Çk$a‰ý(¼ Î:ÙD1œ)‰rÚf{º‚&9!"�ºnUÆ¢AYáÇ ƒš‰#“1³ÏH*Ya´¸!wh¨1W›˜–„ …Ìn´�µ2«éAÊùO‡xÁh²ö2ó»„–ãß*ã±WÍ_gtÙÁG5 ÃizÌõ§{‰¾ŸŒ+/í T¿†ƒ^ç‡ Ûó<ÌQ'5[E¸…üÏþ¼O=oª²6ˆÐ�ô¯.î¡+溒‹ªJõ^LÔÊLU{¨˜ô³ùÛcXYG«B›…•âÕ&MºBáïy¯×b�zb”fÇ„ezäÖÉÊzT¨¹ˆÚª‹i.¹œìíÒƒ‘Á¯…Z2¨ƒèö¯×¨Õ�rÙ„ˆ‚VÞ]©ócÄYPÝÃàêZŠé<&¥q|ºÚófѬ״µ3óÅ$‰;-ùÙæq÷íG$dÖT-t½sb;6T–þÔÇÙ½ÌÍÈ‹¾]—ç\‡6P(• o%,ÖÓï *«Ú¬œ­ÑêÃXº»UùÚ[¤�xhBëuÙÕ}*gÊ_O)æJJÊ„Rï®4'HK-Ìj‰ÂØ“·N¥Ê#ja{Œ)])ÓÂZíMÔ1úX-ÊõÚnë}Ýãƒ@…I“É‘éÇh)E× C¶ê.•ôû#\ñÓI@4G™QÉÃë¶çG<òû«ÁpYò•›g�P9•é·6Úáú¬×þV|\TÜ-Ü”¨²/™÷±æšn—²œ�- äÛ½¡èrC3�=pj×­°ø?f>}_÷ê˜Õ�Éÿ¿ðÂäBé�«”®¯•ÐÁvâÁÖ39öë�ÒÇzú¯›»Ø©ÕàkEÍ¥WµÓ�AÙˆQ¢ä Í\úȸ.ºf¢;’ÙȈ6ÑÝì‡htͽ¸/!ÁžÀÍmˆØS“¸ôŽ~ \æï²bu�ú�ô £vn—Þ}‚¯Dvv䉓޲´g•­“¥+4–ìx:î’€‚“몇.ñ_+¬»ºÂðí`#µãöeÚ˜ïpÞ›vAcwpÁµC··B*t»Ð­Éœ9³k‚>„ÎÒÍ8&Ö­x®‹( aÅveYsnƳ—ÝMe]­Ä¥CtAî“ Í†Þu,»ëÎÓÓ¤<� ¯ÖæÖHë×g ÝO`Ý;É™@ŠÆ“ë*™äFiy–6¸eŠ}š+UFæ4Œísª�cGi}ØøšÍEUprëH¼�YɧN', n–»ªxcB�£Ð0äÌÝ�lBý4J +E˜5&/kvë½£9ŠëkIP êwmkšÂH —¥8CZ #Õû1�y0â" ¢iðyPà“¬¨’B0§-‚z_·ëûp Y5½È€eID&‰`„S�ì„Ä&Þ­à\ÝÅÂetŽÔ̰R ×� š)PE°¸ fI�DƒÙ!Ðq”6õ ÑÑD$‘ôCt]Þ[¢DI”Ð$´ÙDÃl’�uÄÓo.ZÁ²ÐšNåÇ)IIÚ †QYAËÜYwW pC ÏìDz$…ˆ$‘ÏPÚ æ[ã‹�Æh°U¢ "„»ü7$îU"Rõ¿Û$x"i‚졘m}Áݧí:ïʼ­4˜+biøÈùÖ‰êq©ÃpÆ”²»šV%:VO´;Øæî®ËAîÞè. ë°e�TUAš{~�Ä œ·¬Ýmv“:·Šs#;w‘�ÊezÌÞ6àÁ*ï 4OY]½NòÅòÒñ<¨^VêÄMÞV®¦ˆ=]Kvd¸(é·]xÄ�N‡ØÉ�R=£úæ}Ó³±éì¨kÕÔÜ¡J‘=è,qàø‹”×u¤N6!Ëú˜z>ý¸L:õH>È4qCW�õ?J³z²ëu}Wc�Í·s4=^¶uWÝÚµ¡ùÖp¿ZPýçn¯·»M¥q«Ó•·š½³UÕ…Ze¡„Ì*÷j³ªØÛ�èg•Þ êV®ƒ/�ë*ýÕC¼ÅÊ·MA£˜bšªêOeõæ1=ÓO.» ©ÆˆÓtÍjν6z¸AU´HîS,õƒ¯\ˆ7OÖH>¸9VY(‹uWWéÕ¸ª\cgq´{Û:áͨ™½=¬0`‚½yÛkŸißr¡¯ºVX§ö”ŒÒˆF8ºUq+¦Õ8§¦k¡ÀàNCÏkÏ}¼Ó¾7 Áµ¹ËP#]‰•¾ÛÇ[( 8tÈ!Õ»¢æRS·Ü0îÙ~áÜ37­•�NÜÓm[t9”Ã%BHµ`ÖÆíõã‚ÅÁ—W™<ð;X`w¹Bu]hO¥íEcHÍyUÏŠv4Æólò—¯½%;¾Ô7,Š;«°&œO¼…g·'^FÙtu&+ÊÊÀFTWyyMP^w9ö®|úêi7%áº(T9ìyoªpˆPÓ[ëÊ~O¶Rõõög ÖzS4»²5Xƒ ³ØB¦Œ‰ãÉÈÕ õ.qÝõéP·:¹”–XÌË$m…)«íòã›´‚ÞÌwì0Ú¬4ÐÝš UWPçc–Än”nìÃ#æÞÖT|­V é»Â¤‚+`*“%TÎ[£´§uAòL å®[È·çH�«Ó¹Ü)Á]¸DªÑ9k#nö#Ú×R¨oRW•0FÓ»1âBÒuÐÝa÷W z,kFŠìcètYõ¬ÜG,g ÖÙ WªpÂXUGM¨t3¶ðaÌõz®“îi;u3G#Ü+a‡Ñ Äø{nÞF[^™Y”w”—© Žü`:#zo ÚdMk í9jݦNF£Õ—WK˜’ÅíЮíîÊ>Ò!Ñ{wâ'‡<»ð«t½Ýªu‘Y7tíQÒŽ |xóvлxÎö$‡pË£É$¢­0ôDj±z´R¶(›â)jÄ6]ˆl<«,:훳ÕcmG)íÜ·.ñ>cZo²œÐm/( ™bäÀ}H²´åãê=É™D1OC½VaßS3+Á$oÔ¡BSCªVo5Bñtµwc8Qw(ÖŽa¾ÔÁˬK¨.;Œuµ†ß9�Œ'×˪²Ooºí¦±Œ”xµ½2µn£Ýš*ž*Zæmmûo8_°^ÐE9Ú0Ð…UT½š$6’õRÖÑ PáLhÁ}T-å²i ·K°XKó m;“EÈ=b;¦÷5L§”ÃØ ê0ŠÎÔV¥}:úðwÂ0œ«ÚûšÂhÅZ³/iç°«C•âë,ÑAXàêg\îWc*ÃVrsv-k3pxŽg*b(“’¹Ôòz'æYêK�rÎ(k+L™:Þ‚¶-|.È«oxNy*’—«Ù Œ‚SCa¼çÒ­oÚtÊZÚì¡Og<¦ÉŒÎÛÕ”u—�ê»Woc)1´9Ù=ÙûrÑ/«C¦â•®ƒ9*D|ª‡f¥/èCªA´NªÛÍ+„Ê9w‚·w6ä¡z˜ÈJSéÓz„Ì‹VØ2îRBÖaíeœµ‘uÕrÚÊÓÙwkaLhHòäwz·:šÕy»žhEšº¬EÔÝ UªFÐuq w°o)²GwNl”]Ê»§YW±Rv á´n¦bâé„ަI˜72ñä8\¹§3Õ§h¬ìÐñ›ãUDúPrp²çâÅ‘¡ŒàÃÛ¿m9¹,ýWÒöµl™ÏÍë�i#ev×wZ½ËñÌb¡cbz¡¦,ç©‹~wXQN;Ù†-á—zΖlÎj®‰Ío6ô¾ËJÆR¿p•©û��î–ÄÒÊŽ©mO¸UÓÈ´T-ïqs¬š�ÅLÈ-&�‡%’ ‹‡W°­R$e°®½¥Ô¤r$�KØ€¨’BB` @ÝOûÔi›2s§ÿtwVõ—ÛÿÛª•ãûÍU‘r‘b#R£«AÄgâ>ôÑ×Ïø“Iñidܶ^Kb·K®4ÈÓÉÓ–ð�MŒ ‚øN\›ñáºëÚ~ã®MðhêË7 ÒðãÙ^�‹"<Ü%<ÞßûZGUÌ&î”n�o†w�çÍÓ¬¢Í¾Æ«…ÆÂ:š46úYئ…èß·vøñŠ;ÿð¥ PGÎý=—=Θã�û[zê’ëñì×{ˆÎœöÛ�¼ÜõtÏ• ÜlŽöÉ/’ ¦ÛÇÇ–Û¥£:ön/'$•ß�éïüù�Ï~w 7ÕÜP3nö‹Œ ¹Ýìîbpg]Ÿýyòñ1â‚Ïéf¦�¾¯“•.[´ìóïv6óû[»»ßÄ®›Ãx'f­Þ0ØÇ±#÷éZ@6]�¯.ääwzç(©,‹H@ú[êñ_ìð_m Ãõ›³]=ÉÑ ñdq»µ;}–ëùúþ9ë·‹gÔýÆ^ãq—S±SËÏríÜ¡´7g!:÷ÛŽ¹‘`vU{µùhóÀÚ×pß»(¸Ì'�èXÁqšgÉûù1³Îa)Ù†pr‘ƒ ®Zw錹ñÛ;C÷«î ɾ<íçÍv“?K9Qrs'×}Ù|J0ߥ=·ë¨üDƒg³ägõ?¬ÏQ¹ÏÙ?hŽZdð—å¬~9R ”àÃjï/ÀÈ/ý¡l ¨®H!Òk^Ëi60±’„ÍT]T!-L˜7åyŠáp7ÿ´.?Ëé=¡–“µ*Ž÷ëû‰ê-ŠYÔ¡¼•½&õŠ[aP[¤- ²$+Ü ˜1¤iŒª= €°ˆY¾e‘…~¬*&–tTa^€BI+WË_‰·F±hré”L[ *:( ·{ᔥItx$QÞ/‹ÈÌýôµG*Á¢TÉTê¯b| Á�—{! ‰‹�¨%Ú£ré$��’:I$„…¨»>ÍÇŽü:�166sXI_h%”pÈeNú‚�„UoIÀ ŒØ Ð¹ŒTX  À„ªz³W1¼(>芵ûtâ 9ˆ)œÉK ª$´ ÀjT‹U…T†µsUÛw›­ÍSxë­¼)­ì#!NÔäTêÁ¨sÇëyüÞŒ/HAc(]âŠCÑ„ ¿¤Ç[âùÒ²©åpS9šÕA%²í\˜B H%ŠR…2jIœ7# TQj//J…K.åÓKÌÇšóZ‰I2 °6q?Òd‘U/õVÄ'y†/y'x.:ÒÚáéPÉ�„·­^Ü2ªÅ¤j€öÅ šŠDˆnǽôÓ.lýl[θA>=©Ëü•È­Ò¨Æ>N¡UW–®8:,Ð)ˆ6²(¿�=(³UD $çQ”©n’må!è‚„©WJÒ%!¡£Ì€­wz3ßµ>¼š¸vñ[9†r1³9Q1ÿ±$��£VÆ·+„‚ æÛU`ÉK�%BÈj¥ ¦�T2!+ž�‡pBI…íЄ¡™í¢#Îob�Ò‡�©+¶0 =�šÞ`n"%ç|å*ÿÈ<¯�WÛ©§ù´½>-—˜ϯO?¢¬ú0 š@<‘rÊD™óÙK§¢I$$-°’HÔHÅôÂI¸å$¥E‡ "€GuêYn…a/€­²wÿ;˜¥‹)BIHyh× 3_‰4 ¢A–§­³4ÿœˆ.$ç¿^^«~kFäHBà@4’_éãá ìÍù>u/ùÓ¿¬÷¯ïÓ¯¢™ÿzlÿ·evY¯‰ŸËv—A³Þ­û.¾ñóö‘¿ˆÛ°«?›ÍÎ0à[Ìùïæ|÷ oR ò\㯠´{·»·f'XÇf2B(Þkö‰Qo„w×túÞö=­ÌºñÃrÎ׎�“iü.Ä «†�ìÖLçרP8ŠUߊYïtüKõsã¿¶ŠU¾8ÏQÞ\|4éÛÙ3כϯ1ÇsʼYå¡ú B;`¿�±¥ÓNz·ÇŠt\þÊÿoŒ\SoŒgHÌfÀ¤ÇvÌ]Gz¶Þ$&¿ÕúÌXµ¿{{°žÍÙý„Âgm·!‚³‡1ŸS^ÇNŽN©Ì�b‡À ™5�4ãß§®ÈÈEòùšvßj€øÏø·Cwnìwpb§A–ÏÒ¿‰}ÏÇŸÛìªõÀìâ}¬”CôÏ_´ï“\þc_h&Ú7ß¶wûòXݽ0|ý^FÄþoAÓUg8L^ùïÊ P»hþì D?˜÷ȬÉPÉó±7†q6Dn4µÑ;L¢ºÉM_ƒ;:UgŽæp¶ÓçOöÔû ãoæ*ØÀ›ÇJútö+¢ª}‘:Ä‚s㣘ÖwÊwÒþÙêÁÎVFÆQÌé q8d›eûYoŸÚ-ÛOÎôo\˜k¾¾ûIª8s½Gòî"ÜðV÷¿‹ý sØl¤�Ÿ�¢ÚæAœúŸ­qwZ3 sGÜÞ²f·b—ò||úî€kfA;u¶»8�K‘ˇá©7t—¢˜@w%³ä´Z~F-™Y¶¤žÈ(ÕFV×­ œÌk^NSÌ4VÕ]%T´‹;â0$æ<‰K6°æ0‰Ër¼¸ýRyˆz Ü ß‚D‰ì{„�+j¸ô¿:üÆÐGmYjq’šÿRI!!q¦Ì:Ó')³“è‹þÇúv§@Ÿ{AàØ4Þ•éA ±Ú¥©IÞ&}õ²®+‹”D-†AH8¢b^mCRZ&�[õ HK€Uû¥ˆyÐA� ,:i¡‡VL=b™‘¿Œõ¶UGÃUi¼:oJUVÙ×a" Üb(�ˆQÊ�5�Q ¥„ý,�¶›Bt¡�t?à`¨ITb‹€BD¦ �¦›8ý?¾4q“8ˆðàˆQ¥Mél¢Õ"1{½´Z´†˜6 ìà /¶Ð¢TZÅš$4T,ˆ% Li¢?o»™%ÄÅÕ¬š–Lýµ Q—ê-E Á°hÚĤjöÖ¸!‹ô!*•óŽ22¯ç§W½þî[þ ‚iP„ˆ–H²Ë_Ì(ôÉGáì@`„xHWNVCI@yZd @Q Z±«þÌ¿ŽÚFD~Ö¹›AKû¯WÉ“`‚ñO(éåhÎÛ� âÔµ ²àWÕ);ƒGæ°Ž‘ÿF÷#z+üDîóõ§H‹˜e„!ØŸqñmÏht‚Z1ÓR\`„ÄÌËÊ(cÉ8¶H¶9ø`§É˜¯m:,s”dDµ«’èºî $¡Â¡É_y~Ó0ìš3Râ²Í16 �/à 8€úªÔiUGùtE,vvÝw†uæH¤?„-C•+-T ~ÿÁ ¯F  #çÏ?P„’K÷åýì¿O‹y|QüâPfR¾ç×¶»§¿}p^øó‡ Aœ·ûHF­:�œ7Êžÿ+ÿ iæ7p-02—£öíê ë±ÇXôÊa©…~g[·OPç=»uÝ®çgh§çÎö¦³ìéÎ^×·0ü÷‡…¾ßºWÎ*ÉrË]ã)n9êîýà[,UäBÑ€¼BÉap?ib°[s߃íÏL8táRÚŽ–Ù;‡ß ¶¼ Ævõ†Kæfʼn+S†sæËgAþ˜�a z�’—y„ð]¼î(Rñﯹ­°OHPWÉ{Oáâ5ÙF�ò~}}eøËúvù»Z^½Î¹Öü¼xØ÷"×x¿Og@ê7ÌGX·Ý»«`±»èïL·Sõ6÷“àq²¿'õòíþÍŸmÚ–è7.þÄÇkN0¬ ÖÿlÔ{^flHþ‹\ïPááQá§§¤õéyðñ¿è0.us‡Nœy…í�)‡·ÊÛ·‘vºì"ê\Ýß6ŠöÎ̱C˜’þæÕú"¥O˜"E:¸ñ¿°Vgvøk%NHEø³-Ì�BÎÁ}4ÅÖÁ)Š~¿¾Ðz[(&5ùµ§±ÍñNÁ.³:ìÿ­:Rí¬¶Î|hOÃ),táÅ׿ÿs>éòŒŸ=Ž•™'^÷ß¹,?qÒ?Çi!Öþg~ÿz›úãóiüb~û¢G ÞíGóÐD=Óc(‰A”0x; ä¹WŦ[orù™°H`ðtļ Ãý!�"ÛµÚÔ*@(öÆ4!Э¸¶a¹ÀI°ÚctyCP¬ìžJ¯T…ƒü€¥§bqMå Ùv�rÑ.¿¨ S¬©¶yÖ„Õ•½Ìʳª¤*rp07¥'²„ ¬¤Ñ©Q°¢°§1ýÃpZ�št˜¤oKu‹¾kš�í1\_#q‚ÌÀîAªoV*6Æ�Ñ Å* W“,UabŒé!£Î•ÂI!!``I @’ºI$$.�ˆ«ùÌ<7_RM5¢R|F?´?QLÉ3§íW!z k-ÉFbTt ð ±=cú¯�°^ºAøÍСˆº,²]l—6~‚è;µDò`²¦*kB§ì0 zJ îþ‰à�•¹x:‹ ¾¢äuÔ4ͨ uÛ¬Igß·3êFíþ¯Ü5O,)|ÅqØ3Ƨa…ûm'¹ƒg™O6õ¨20Q7oÉÞS€÷†¨võ‹C~kæ|;¿Q4šüî¹ñn¹V±4pe}Cª×§ŸsoL´UãÁ_ٯݩ˜–Άµ×¨‚×ú/ _±Võ+n6Ã>ˆ÷éã¾ÜV"" ì'KgŽ ©}ß°#qþò‘k)v¼.k]®¨ñ>‚#S³�1Å~Ýš™ª ¨®0gm …Úf|ßWRÁÃSÄúè r} Ùbf ÙgÊACP‚±¦¼²2ýAäááÔqÌÓ÷—, ¿[ ˆŽÛ†­DÝÕÐ8‚ä‹T¦ ÂßÑ$XWÙK¯!ÜcÔO’3:ÁÉC6·`†ÂZ’ŽHõ˜n‘£©Z_„cRNÊÆÂ�’D–AxIvï?šA ½)IZ×ù87øb<+L âaAB…(n,¾gõíÖwç1|­¹�Lf•°WçFÜZ÷*a 7hq…F6*ˬ‚ãxEMG(´ùÒÕ‘5iþùW$~k¤¶ëä@þ£›yv9î ÛcÞ-T›%P(…÷��^hKäVMÿ‰Á-˜jˆôä¿•�qÔ8þsæ¨m…Í(Ü”¿f˜4¤{‘K¤¶ R…A+XJd°v‚cp�²ò‰4üÊ…s„g%9¢†þèI¦5$Òöj¹ ÔÔƒ}ø(R¢F �ÚI$$,Ì÷Œ,õ¬�m÷ D«²¥])÷(nhë(lªƒ)OEHQç±ÊhmŽý¹-%¯˜Œ�•„Ñ�(¤%% )€bòûÇ¢Z�t#Õ #Õ ãè}»–`RÙÕÌãÏoo´$«¤#M9hëm’_¤nÍÚÂ˸ÐF„ÚºÇ[b讀 e û$Yj¶'.¢¤ŸÁ{³lºt—¨…¥ïÀ�{'txûxº.!S½$‹r½ghù-ÚÁ¿z/Ó?�)!êwrÚêŒ ¤s¿1jˆÊó0bd¹ÿ¶ÞÛBD.Þ+Ÿ—¦$R_ÙÀVýJÓ4c†á'-É+ó¨Ýébm%vølw�Ô�Ð:1~_büñÁ©’·�0vìôß0J·ãeá‚Yõ§lŸ§€›G´ž Ÿ]Ÿ}H4ȲnvqÛ3#³Ç–ë¬ûšèµué€ /Ø á™‹‚G.üŒ3mî¦Wi©bÕXrÇ’ß,Ba‰ëÝÝ’´ïô ‡FæÜ^3¿­1^ߤ"qÂGõsï\óö¬Ö§ïž:åµÃ0ȱá<÷�¨Í¡íï'¦iÒëiíß=½m9 Óço,™á!ßÙ|2¿;öT»*(¿§5*6)NÛw¯×ïw/úáÚÇì¥Þž;;Û¦#l› ›¶­×«ä=ñë‰wó¡3ÐN¡6}CWÓ\ïb~7Þ×çI§¡PÁÇo&ñ®Ïã»8°çdðØs±FUÛ ‚ÇXþ1èv9æã~æri¾�vZþîAôؽ;göý3é‹@qŠ­—²Äd;µm~ Û/J"µ¿[>µ¨y{AÚ5ÛÇÆ›åÀütë¾â g²¤6Å-¹CÉý*ƒì‚Ká‰8yØ=À`3£¸I€Š‰û—}’G´’S˜cuAbÿÔ’HHY={Â¿Ý ïBÖ¬Çmë¥` %f'­ÒDãÚ@«EëìÔá¤SôOò…'‘Ër¯L÷¥I)4ê ~f\Ë»ï"KtˆMˆ�<êT}­Y�4ÒÐ$Јè‰nÆ_T‰­Ix˜M¶);OÝ/(ÄÙ“šŸ÷D1½ÈE @È„ˆ¤³„-�°Ѹ$n„ÛK %m‚ºÆ³KM,è«“­©¤Ø÷Š» F€Í% +Ø£­ØδÚ':k1O¼VjA¶rsH6qHe,�F iªÆÂ•Qö”¤h _+I„1'„ú_ÒA¹·ç„ƒßHÔè X.ç—0Šˆ• !Á$Ä¢š}³¾w­9>¦sÅdxwTùµ<Ù’üÎLÔë ¬Ê§Åum0{°Ü ŒhpË¢>Õ€…SŒö’G¥d–`6cmŠ÷¨˜öTši D7*MI(‚ºÅEZ¸pì¢?µïi­KIW ÄCN†Ô&¿i!ä¿Z@ÍF*ÁŠRý÷áì©f’åÿ]P4£ @À�a=R)¯Ë,2]Åp²æˆ†¼‡º°�Û`0õJXgð¾OñÁ³Z:€zM¼Ì‚·Wâë$@°PÒé¡£\ª-§žÇvå­�«õ2€@ Õxäzò®pîËF%E�vlçåVf ò ÕQÃ|µÒ¯-u[ßÀwŠêóµëŠz`¹ã®üÏ¥ùc¨‘.É|óëú ÃL í!-±º_¨Ç[äøÆ Ÿa·>¾ ­ã‘Þký”¨ú·¦:vÅaH§ög?Íj-Ë·�´�ž·IšÓè�ÇTšq¹ËÄÞ)àñ°~ÉÔ%"­åÌIJ*³nÚƒ·&.eaíùÔ~§>t­mô|gŒý«á*î4Aé®XÅûD‹‹í<¶p¡Ùwæã¹sî6MóLî�ì ²fÌÜqÒVúYñÑ|ÝöçôÞMÈßÈAxßBÒH•mèèÒXÆ´¯,Äíi'L|äŒbÆ.È'Uújüó¿7ùï‹pÌS©â»Ã·év�)!Ç€y�íù¸Ý݃wñ]ºô—Ïd_B¢¡oÞÕ÷q¸¾Ÿæ¶¯cÔUìuj Öú å/ãçí,yîÈoÛkÕ–X¡’Ÿ rbûH£8i¯ljY‘nõÏúê«Æ‹4˜’e(-Ú’oW¾‹nÛb±ƒ»ï&6Ê&”/åÑp¸‡zzOCÃÕÃÇ |MSÏ\¶n^2ΚÍßí4›Ç jýV¾Ëjñ¿kÂÍÑïÔ¯×@�¿{ýs{vW²8ûXÏÑ®�1t’SR¼ßÀëC½* ìßT¨û·çЋߊúÞ ÷B�òÎŒ5¼cºæý±N.O>³Ñ²cÅvê >ô˜{Âû¢žÔšÒÚ¨ëWÞ•?YD^“3äÐ5f†‚͵!ô†�OZiU C€¢W�ñ5Ø¢©k䦈± é,„êϺ֔;G_B'{Íj¤ÎóQà&”®vPv„ ´�-˜ªTÅ(Š…BÑ„§ b¬˜Å¢?�­RêcïôiŠDXC2¤º$fh¯Â°Ž÷&Ër¨„š¹Õ'Ý"̉¨§¼”Baº!jÂFÛm»Çiþ?£Žcyܦ’Gr9ÇÖZÀ€ì’ Hâ«iÛ"ê ÂZc œ‘ªiT*�A¬t01Öø[ Œ`ì…¸þjq!%2� áEïh›úÙŠZþæQ‘„¼ÚËw‡�¥.°+@Qð S –³!£È, 6•_ 5 ˆª�Bl/ÚÄÎÓI5½«}'TÕ…-/Ôê%€Í¡¢œf`2 Ò*MÌ·½²ˆÏm´_zÓןºÞuþ³ ­Þ›Ó#Îȶ(ÄL¡Ú®Kê²)„›0ý³Q•LSX©ë.ÛÐ^;WzŒ‹#¡¥„�8ÙŸo ÚäÏEœ4ò B1—£KiGG�|ë_Ûª­Ñ»™ãÁ±ÖXOGpÛv®xÜÆA¸¨bE�Y_¦¤ûzÈié¹û¥rˇñJá™o¬‡fšàøcÚQü`Ž‚ÍÀ¨¼/–BªÐ GÎ` ÖA„¬ô×ì1Uæ1|ÿƒ"A¯„(hm$Œ™(“éBB-'ð”~Òöߟ�ØXËÕ4,€�blÌLBaðá�@ XR”ÅÈY((‰‡?&´<ö÷u‘v��öwëñ„8õ:ÀÔøýmΞ–Ã¾mu?žGåeVÊÍeS¿Jpû¿ÇèÓkÙNžXÐî«=nÑÄnwÝÌKÄt (É L© áuŸ˜˜�Çê@Yýs`è~æØÌžSÞÚO�q$É›:W/ $Xé–·vY�}Y lúmÔòD lêSE�Öyã<ȶ|bͼäö þs,Ž™’ýÍß."·W5»ù˘–n×êKñht·Ö�<¯çºôHx÷ªO©ëæ-÷·[ó9†ë´#ÕËéoÍ ~õg9[GÕà @(FC¨Fûk–V¾ï[×µ!·§/!zd¯òGOYMÆâž9–§ØqÐE¼uÝŸšwtY€¥ùÆÜ~Üû“Ã6ü¼.ögs´›îšB(ïÖ nÖ…xòïs–Î „û|lÌ·q%ÇE·pK“nœ¾^¬;ýÇÙRŠ%§¸ðë�xÊ1Í¡o׳Øwõó£WÒ]Žj·YtÃ!ÒÆ\v>–”¯p´"¬äRüß•ÔEÔµ�­äø‚Þ¿²�¿Âõ«0E6Þ-H4/ÙªA!Ș_…׶α8èî¾oöÌýæU^0³ÒÝ="×E„áäÅ-·_ó×ïݦ¨ïž³§]º@CŽšüæc™.3¥—ªœÓº°º—N“¯Itpw1PÝügqn½2ÔL�·pdEØÄxDïÅÿ�þÆÐõz¤ØUc¬ÄU%)ùìû™Öò]ºÇOO™=[u,gÏzŽ¼Žš²z×”ÛíéëQ­ÝÑ‘—®´ôPÝHÿçÏ^ )¿®›úïËa6,Pc­¹ï;ç>0úžbNM›_…‹Á ¯ÜìŸUލ¿Uù·¡Û«½ž{Ÿ?FîãÇš'â[Ñpz‹7Žé³0�ØCï1à^ã>]íh—ÃÎþš·ugα˾Lk¡ ÝT@Þ SǽÃGM×Ê®ð˜/ÂÝ›/»~˜žü­nõRÝÞ˜x ýúc·¡ã®=h¼^ž#Úþ¹Œ·ù�н· �¸™J[í_Sõg¸»ñg=ž²ëÓ lãß§ŽÝqÒÆQð"}šš¹õÑp!¾¼a¼r�Ÿ¿Þ22E³[n`ÖðÚúôèLS†pÍoÖèïééý ƒo<¹l·´Ä&ÉõAf|­8†x/_#ˆ Ÿ;“ÂúÚøØzÜÆöѯäþkÂuøã)æpëÌîÓº�ï èË“ön#Ù~Dœ°ÈÎÖŦž"ºíHumuÍ»ËgCK^ÈÌÃÝzÒýmo2g#§×¯ªøNnåú×Ùc»jž{á›÷–{é]ºte¸óÕ™A¬¥Ç¸–G݇h}ëßFû·ä¸ã[,žcî·ÞrçàOˆÇtþ’´²$‹šØQ¯´(ÊücáäãT�³H›“Fƒ‹DZ� H6F Ë�Íæ6Æè@· éxï‹fMhϺÆMVó�h¥iUªzç_x,W{{él­aÊG®RJ Ðñyl¦¥`ÃÞC©uMòPa”£>#õëAÓâkB’eøSúR Ð¦ëÕù›¬ðÃÕŸÇX@HûÃñ(×¢>«Õb¶µfJD^ž Y€¯$¤Pá^µˆMŽÿg=˜±úVãî€O5 �=Œ#Ö1ˆÆ±�9_uÃA!yQWtÊ*½'jŒ_˜(Û_ÒP`¬0R…ZŽ�œÃ,8uç;hs!ÉÝüZxK³LKt™?ŽÓI›Ö…ô=÷¿…ÄPm ¯ŠÞÜ–”¾RŒ&ç# >+À8€:_lAÿ Ï×ùq@ XlE|©F�r@Ãë€ÑÇÚábGhIT¦ !©ÒË8LeG™…‘ÂX¡{œQ4�8ÏÔˆª`Œ°æXR)#LÌö�Ò ì›Ë& ’Š•º�BL‚èh�ûÌ'ç¶ß1™%fÀ”(’šE²1–™)1‰KPÛBö¡ûCN˜^i"ƒAFzD°¨B\*³¹î"�Ï}<’,ÅU9!´“M¦&Àd!€Ä³€æþ‰hü´cu¯§žF/åz±~¯vÿ#Ì¢ÃÙ]Î;�f¦5·Äÿ‚ïâq))á“úüFÝ—�XýšõçœuñÙátyšé¯“Rüû>�¶ýêß{èZ¥OçYpòKbê‡b>ëP· ÷W%l�ôí.>~Å/Ò V[¾Wô¼iÖ­v2‘À[o&ª[˜ƒŒ(c‚ö¹t_v…@«à­õ�ÒWróÎÓ„{$'»&:^=2p>8ê(æP¾ˆÞ¬aô›VÈ' ^ÎN³p>Ýv�â®8EÃFøFpºÖúL}ôž— Ç0ç·qfûœ8¸Hx¨¿Âxߊhy_®ý»[Ï;{õ=G½øóìW�ÎʽKÌ‹�–u&(Èýc ÄÍÌ'-�K³ÍaÇÔcyí=›�G�î�õœ§c�ºtnõ hìrxµjE»‚J½á:a‘Š È’ÔÇR—¥/û��»ïík%pYaõ„·|܃­:w&߯©ˆŽ“Üñ�_8ö”2#*X5Enš“©ç×vÈ3¡ôÄ·›_ŒˆCá6&ýú¼ß’ñ£ÅÄûc…ÿ΃ÃÜ)îÃÊ~äCïW3Öx¯zÃ~¹®•~ìÝÐ]Ñ!˜J¿Ÿ©z¼ö¢¯ûÚÆï^Îòµç9èþþ\2¥)AJ &öŒøˆÎHftñëögµ²Áü›RžôRÝ!1›TÀi¨ÆÚ  ˜Me°ª[SõãÔ¶±ñ|X;‹,Ö —éîÛï‰,>.(½¨E= ªá©3¿QHWcm¶ÞÎ¥ç¼Ãbl¥#FûbðÒ�3HEâˆ,]¬« —‡37d»çû˜f­”ÅQ!‘QÂ× ,1޵zåf·œé”år³FÉé€/ )HºÒ¨ö“M�eKŸ.9uY22a¸Œ’á†nƒiÔJU0b"aì6U’õ-Ñð(¼â f^ ´Xu`uÖîr0R“| ý€Ñ ²WãEŽj}¾C;J«wp“�x÷1‰Vû=¾aª¥Ê�¸ÁcDÙž]͇ŸDm6üšÆ÷ýó Ê©¾`‹eÖ“oÜ÷ñÝk„þmßvqXûÓ×Ô?qºë¥¡xïtm ðâ3qbÁÚ´_£¥ÇI>G#ÄYÏÏÝüj2¥¥Öv ›·²PF3£ËÞö„f‚µ„õ�Ý"¥;Ö1ËænImýËæ&ÅÜz†@(>p•š} ƒÕ�¡¢ŒüïÌci¶&2 ˆ À•(Øün¤X=c¼õ•—[2ÑL*�Ùë¨\¡CòŽ@d ¥&D½‹S… 2ÓŠÐm�ÓdIpW©Ìûg¦;¹ø§ò–9�2Ä^ 0ÖP®1CLr l}*1%)¤ÄËUdäÆ G½|Äðò¥b'ùIïSk+2ÚÅnŒL¸íJÑ~j�£d*®éÀ¼ªB¶Žþ };?ŸHÓH9v©Òb5‰ nòd@¨ÖÐ’©p¨ªCB¨dR¬P¬€ è¯w0gXïXÉÙ9U¾t¡Hid�\vh®lp‘#,’­`¾±"ö¹ ƒPÆ:ÖŽZ¿ÓÞö¦PÞ6ÍY-ö*‹¢hi_ÖœD0I^ìõ§süu|ÓÒ ùUniüLÜM�òyü@,¿^¹2>:Í]6/.¾vŠfqÓ´Ý£6†?Uà„ lÀÙ#¶¼Ð†�hyÏ–YQ¹âÞ(P½¢Ã!ÒJóó#ï[co*^§�ݶ"®õ ÌÛŒ*‹9õDƒFÄ„Ô÷„y§âÀ’< œ­ÙÏ­# 2I/@³!$¯XBA4ü–„l˜/ݤ�´$ªw+Vö 4 úø3HHZêÁ!'ì-lŠT°’BŒ‰é2¥D h6*"…|Ázˆ@ ÐI!!$XI$$(I$„…Ü÷€ 4’HH^€ $��¤B@’ @ ðGþ€>cÛ˵!Ÿçµ&lÞ�uò͉€»J$"o‰7ÄœÖt‚Ùæ÷Èçi!Ëʯڗ\©àù¾Çg‡¹êGWÛ ÆoOsÔÀåºeIºér†BKQbU™-Éá%) LÝÿ)´É9l\Ó“X•º¼ »LW$Íž]×—%¾®<4ÿÂÕGŠ”e›®ó¦Pp‘q¨³iUØ“KKÑ*•Éàƒ=ñ�Zf—+[”Þ†x½^“ȈáÌ9Ì'©�i»Å7Œ·Öï«é¶pcŒÒB$ ý`’H@ ú«îÏ—öá‡Óš ôÐ’ƒGþ„ I¡$š@ bi ŸoOÎÔ*’H³•ÿ¸‹Ì¶^ÜïÞ˘-ì 1 MBÿkÏÆ�¾y÷’ÁƒÏD 4�;~5WË’ý°é¡BA“îȃúöa-·–sß$“:v²‚Ô&(®YBþv’æþ3ù"úáó(«¨)\ÃÖX‹/Qa‡‚·}ÍpêNcÒK=iù¿€dbGùÑ“æÆ¦pSKÝwÙ¡Aêù(�þêJCVÍXc‘Ær˜TQ;—¾ÄkK@@ ` ‘©YbVY5]ùÄûÞ[æ¼q×µ¡� )h&IdãD`.²K+>õÓ§.˜Ë&ñÛ*áHFÿò‘°å›ú^Ÿ“9í[å¯`Là,¯ZAÌJóx Å8·W@»Á)ÎÖPD2X]êÖëmŃ."÷å¥0d“¼I“Þ#[Ób[y{¤ƒF@iÑ·8^„AHBþP|0ðзºÉ+{ïª(&=è—úë>ˆL¼Ÿ.X¦Ò–Òÿc÷�+z¿>êÈ‘Þo6w.�×ëk^Eyëjðøà0¢m‰ë-DqC+@ó!‚ͳ†G²ÜNÖ±Ðbþ„ ²â Uër A™°BªL‚1Í–ƒä&ð¢ß~™ÅûëqyÓ>[]tANˆí™vI›†¼ß9WržlÖ�kiQäÍ6ò”‹º´Xt –÷¢ÅÍ{IM@­—1 6(µèqœbAa›7ÍßZÁ•†Ê�+laJâN¬5kEÕÎÓ{M”,�]­‡ˆ¼ˆ;ß–ÃâõŒræB°V`K|Ú]ù 0éMžÓšùßçB ÏÈôAÐX'ò{,‘À8F!¼Z Ç�S¤(¸ì寥—E·–Ð~á´òœ=�r[ÈÓ΃_2Ö8ëúƒ½ 8¹q ^á<~`œÜ‚7yÂòK›òã=Ý9Â9úZÁ’ÐÃ&“˜ÎÊ[AQŽè.ÑÒñE<£ÆÈÿ¬QéÎ�¶ ^g€��tPåU®çLåX‡¨:X�róp²Áüç§ÿ¼wLØ“}ZÜCfÂ[<è:ßÚÁAù˜Ùin9qx{Bïd^óhhšP)@[² Ë½6güˆ´“<_vßO°i„ZZ@ã@ûÂbA¤øq×�óƒ+Õ�1…‹aoiý]¬Ÿg/äU¤z™ æ«VŸãuß…ZŽjù’†ø¾h³K‰SËäûý9”Ý8.(‹÷½—«ë£¶¸xù<7j( 8 P#ì.èÚ²�íe0+ûH îGdVgÒP‚ÜvÛ ûñQ¸È¤(æ¼5œ7L¬Cf{hzF±§F�œíd²]ÏÖŒìü×'Ì*}õâá9ÃwK‹¼§ªnŸ²ÉkÇN"f宫�ÓQRóʹ3¼Ý7F5�å>qY\éÐóÍ$ÔF.iš—cS•ÅONfSáçÌbKíò�¥|Zó©F¤òi,…—Öùg·s[rÓQSlã©ÜJ™.Ž9çk¥v¸´#¦»Ó�¹­L¨ÑˆÉ�û'�âîÏL¦p­8 ´…�&Qá*‚†O¤-ÆŠ²‘é2ºL�ðL#�1Î Ù¬­®ç-RÇ<�[=äŒw5…Aƒ«Ðæü:nï¹ÅÔ§¿Ÿvb·Äű×ôÀÈ© þ@"ì–Š0>óqÝÎö‹A?oφÜE™� uN°[~8ëMúí½3¶æÁÌ—rŒÐšaUƱ—$­i| ­°@UòÞ°÷ž°ÇÑÉry%xÞV…iª8ÓŒÝFhêÕ5cyãJuœC†ð:"í·7ɘÀ/>ïØ @tnëg&ó;Ë�«ÙDlM%lÏQõ�½Wr6 ºé›UÆSf.g‘šÏjÑ}„¨Ï”›´âƈVËâHl†mì%€é‘P+ðäô[ Œé%ýŽgNù¾mYZLÚÊLOk…4Ôý¶À$;+ÆîF£$ë†Ü‹ß“¶öpÍe˜¨�«§Žï-<¸Ù¶20j[í¾— ï�ü!Ýhú*„=�ÛàŒæíÓQ푽⋵ êе·)doLöWÇZql¿Qp”˜¨Ï~dFýÞ ’øFȽÕt;C×L,‹ægz�rkŸOÞ&•ê}îT\�È!Îb…—…é.X‰ü’F<¬,û±[$/b˜œ—jtôõjVʇf7¢p÷³1fÈ5GÇF•¢$B�"± t^Lï<.w$î†�«k�ø3…FÛíÛh§4l€Ä-üàŸ09«2k|Œ_Ù¶ ¦×"Éy…@(ªúçÛ–‘ÅѵÓû[q…Ó:B–xÞ®n4ùÔòq“ÛEš[¾¦WQîÁì.£ˆá®÷\¹i/½Äàó‹žµöµúpR9Œ·ÎßÙ™àÀ¹ØÆ�ÄpâV[´=Y*Iˆ¦#¥ÖÐܬn±ê«_ºr7èž#ÂdÁRG¼XAÖû&ÉÐǕ㪜cŸâ€×¾Ëþ¯sKOÌïé�.Cú¥(¿ÈXÂãhãüBé1@<£®­çë¿Ûç–Ø@.¯p°/x‚ZKš `Ç!ÈW•#=ŽöWÓÿ�õ`¹Œ÷=3ò@�%äëù™§4|û”ßÃßõ²¢«ì †&²1Åjl[ÇÍjgéêìì *D-Wj/Xý‡ö—ýŒ�ªçîiüÇäñ»§gRîÍØÙ*Ì~›°¤ŸA&—&ú…kF‚#þ�5V.« AKcþ,·~ÿs†+E7ìJî¾cãní“áØ|.Å[�­•ÖÜy=nƾ ™­p´Á ¥+û× ?òŒ½õ\z\}Ç·ñä�”~ ¸aâÇ_ò¼ûÓ¶ãÐBŸ>«>ý)W`»‹¸ì~˜§0ÚoR¡ñ¬Lv›ÞßÓÁº*iЏTl21ƒØå¥Õ�@)"œ,”È0 Š¥œ�L5æÖ÷Ü æãÆZ-Üùiè¨5„/—”Ú1ÿÚrÖßÖ¶X±°¡CtÓŠÈ3´FékgÅØko³åÒO­j-—V‚;ô°.ù¯Çš «q£Ò8¿ô:ÛôqÍ UØj<Ö翟«¾jçÃVŸ†ák€Üüá¼[I&·T¤ûáëû‹jl‘ó�HñÅÖºC¯­’¼SØ�À½¸^ ?;~ÚÁ)ßÍÿÜ]Š4PE„Ð,…°wÂ#b�FÆÊÂyìÇÕ±ƒà®µ ”>› |@ýMŠ7rÎ=ûFy!T*ßoÚÌÁÁî”A=l’ö$XIU‹è¶Šé\*ãŒ/ëâ²—È4*Чégò©eZù;výÁsÝá<‡R¯tò±@i@ÛÛm]6†µYmÅGTk”gãØNhV³e~\jÇa$£Ÿ‰ GˇB sB-«ëuÉbÝ>z–6k�³N,z4™VpÞ{k^ìm9Z—‘’\ì‹Hö‰}}¼ö'æ�g–« sðÊÔÏs�?ly®H ‘]T,O:ÙžyŒ³Ãü4:l¡C`3’»édN­äQ¶r5Xe�é®´0çôW½ÙëÈË_žÚjÁu©L^‡¾ ºQÿA)›Õ$¿qkÃóñ€„Ñ(„\0:‡e¼×ƒò,$-ôÖSÈàL_ëðšô{†ÑZðv’pSqUüüÉ,X*nü^úÊGksõó]�ð# �&ÎKEÝ ¸Ü�¸ƒ!†ø[ü¶çùwøUŸ>XkÈý�|¸”¹eÆ7ŽO³�:ÏÏ<[`zRžáÓ•³êò¾ö×·¾5díîaPzÜ|V¡ñ¸ƒÖ="#Õ®û õÊ=¤Osˆ¢ žúPLÅCf¡¾ñœCdGh»zèˆZ7enY¡‹A–ÖÇ=ߊl‚q:ˆ˜°-`(4¼ïz¾ºzT0J¸Ç”|Þã)àºÄxñ`[·Á4Dkf¸¼è_l¬Án NÙLBÜòáŸØ§°h´»À,w¯ê‹Åœæ‹œ%]©ÂÏÍ7‘ìûŽcáÖ+Mä[ö¿8|Ž|ƒwÐÉ*[™Uý.½¿¾O£ÜÚàvFtû¾o«1a!íG1�(ÊlnöçøCÿvÊIÙÜ;'‰”EWïÅÛ¶ÉìNM@ý ¯== Æê�šJ?÷@îGo«p„ÛË4vDç°›Î{Ò{« Xl+¿Iòï°ybéCm†o3RKóµŠpvEmÅÍ!xqkÁNyu d¨.i{h†§Rä?­di¿6¿¯™¶„÷¸²¯nµSª|éÿ¨qñk7¾65œ(V[šÛ�Î’y<">82ƒ¡m�¯C/:Ú¬:OV•O¬i–0ëßÜk�6ßÞ{ÐÁÀ�‘|¥çÖ«¶;ÙiÓ´"­œ±)�²¡`åIE“×ê•ûà׎£ø2{–° \šz1èñµŽ“ÑK>�Ü�áqöqÍyöŸlWêoàˆ¦5*Ü)Y²\Âÿpt~¯§©GVƒ’±bõ}탃lpkÒ)ÓmØKäüu}þ³‹“¥?2Ôw‡lný+y`zÄô~Q8È÷¹MåÐé $Ÿ”z³ÍnLj69ƒ5ëÒp9X;öðK6r”)üUá^ßÓdÖ«âº?†ç�uþüMp­æaqš½ÇyÉoxgïR¼ ž»×íœ(YP‡$Zæ{‘paÅ˾ß¡ô63 `º·ª¸Ò⊎W9ŠåN�ò�‰ dîà ‚tqJƒ‡Ü"!1± Ìy3²Þ¦®C„-E`ÑnÄÿE÷äØÚ[�€]ù�‡¼àŒ Ie¶Ÿœxxd'׿¬>`DÛ9+zs·P€üÚÿ_�»wèa™™Á¶¤­³ —G1}-‘Nnël»þþ„p¸ßÖ³Ã%��ï$’G½b ß³˜«|bݱòã_B Ë+•…%ú;�}þ$ðb6­~A°À–#4IbÙè‚Q*áF@ˆ(¯(¯ ƒ5�»©*=!Óœ‘QšpÏ·Vkó+tÅÄH "d¦xA ø\ž%²Ö+"¨&>[Ù¯µÉl0º@Ñ‘ÁàígÒë´²QY^ÛôäG.Ωq]“I¨‘»eªP�ÜrWªìæ±”ñRÂØ¾Êì V#}ÿœÊ/Ž.ƒÜYy‘ãMÏ(šâæ’e¶eNÓ¯3o¤÷3>„� µ­÷X¹ræ“}5‰Cq¼R×·»;Ý"ô®‚hv£9<ìDø¥†b�ð­>¿O=¯îA>ÇùOü ³2DHß=zv0dO/…¿ñ-·(ˆòòH³ eý5‰]I„Fzrè G¹çc2Ùˆ6a÷[S¸þ½Š‹Z§ñæò_QÓF¿°òxó=æ“õõÕ³¿¦é$#Móïúx"뾇âûõD\®§õ(õ*ÁJR‚ˆ¾ºÃÑùªÛðƒ·”þ4>=œ^¶³Ù£,J�؃@\lÑØ­û¨G `=İ�옗„€ôPbF"i Ô Ġ"Tâ¬?!ð �áš^BåþÍÉ'öîïœ7õxÓ¸÷Á-œ�†r¹PA‡3D÷ñÖ-Ó^Ê�^@»™¶—½ZÔž[~ú™¯ëøšÈôíüèKÞsísÆ^æ¯Ö¹w̱Zý°(e⛉�q yâ‚ͬî¨>î3ªeGÐ; 2ȘË šØݾ­7!’�æI•£¯^$d¹{+,Ha?úþ`åüT½,¥LŒý¿ÒÄ×¹FzÀyà5Íé}~<¦( `�ßÛo..Ç;ÎMöÀ(½µ{~Bæ;„âc:Å­ÀÙ‹Œê[ÊMV‡, õ�MÊǤ*ý±ÚÃX×;ß1ìªQúd:‚ýà}Ý9º®z(ôz\¬ß,8¹]½!ÿ¼(Æu)iÁÛ‘ @¡=,ÐlA‡ÐL§=(E#X@Lf¤4™\Šèƒü�£ZGk1zÀûì+nn”B2&+�ŽñuÁçÖ€¬Æí`ÖÇë„›í‡axù¤Åòsµ6Ç‹}Dá{æWóöÖ”| ô˜„.I®`�Š1V!E!Öàˆ¨‚볪{ke)ÜÍ/¡Ã„ìj=݆bÓlž1wðÛ›|ë#žž,¦@ÂÞîQºáªv$Õn>£ n/IŒJ5‘ö¹(ðØŽé®°~ ?t7œ"Šíyš!h3b)Ñõz&¦£ ¼û’£¦ú%ž#‚)‹¹³9æ>÷iG˜ÊD᳋¬ÝÁÿÓE¯ÔMþÞ¿«ñ\d——7+o Š\8/ÂÙÎ}v“åZt+û[ßk¹¹®ÓÔÓnþKø”dúŠfQÀ\ɰÌbÌšàË" ®iÅ�þ‹nÁëT!ð°7˜ã"÷B}P¢Åóq.àÀ$ :ºÝõ�× [yq kL<ç}òIÜ�‹Q­=«;‹c\Ñ6B–7ê<Ü[¤^'åo9¢Îk£Ð¯¦ôLJî(š†e§ 7a¨Ì÷5C1§ð8k쬵6†Ý‰·Jž é–° õ8eÊìÄ›D¢„I|�°®vlÑZ%SXZØ$ÄÁ8à•Ë÷®…—JPô Iˆ-îú\„9'½ÛcÞï8I'À[“‚¹å(¹¦Ö£Zµ…ôÎÖ;ÙˆœvÍû6pLÉ¢Y�ˆ¬ck­›–ÃJtµI+Œ6gßÀ¸¬¤î;µê¿K“¹êÑ~¹A̰¢S½_ãÖ&±s¦HϤ¿Ù3= ¤G@p¶½ùcQCd�ÄI.$ï”|ÒMñÿ–«èÿ"�º+Iü‘ù¾Gä%ßdÁ¯©š�•œk2?+ÞËçyÃtrï†pÇkÄæÆÂbA»2SȽüpO³; ¡g‹@vÍ0°|ÊC >qÕ‹(ÿ™ñ-o6ZÎÇž¢ˆ„÷A[T±ÏËBÅ8Lû1Ø$}™|£žaMn²tJ³s+°º·¨dE•°ȤÂYÌ8Z gr~\ëd*|ÎGÞ¼^‹Ö0ˆ‰ ”Wä¡ùчæoö¥/¡W%á–ö‚G$ 6 •½¾Âo)èžD`„xf7„ÝcÞ9Ûƒwo€oží»�T ëĪ[ÜÏ*ž>dž#É/|Ço /kÙslV‚:$�…°Î°HiÀ:ï½XY!hÎ�ÞI.‡·R¼ônˆ”é²5íÁJÖÄz�ŠÃ#÷ƒß‡Aû€ÓÔ jÔ+Ù—üÅÚÚ�®²G‘¾ «dœ‰Íðc÷n|ïœ]Æv‰¦ÜòavŸœÍcÊÏUõæŽFŽFb/M†dðĬl2SæÌÛ¨Ý×8qعKŽƒ,eïÜï…4ƒ¢û؉Þ�6±L«Š¡ÿâ¼$�mq¤3Vhc®ˆ±BôénûŒ7¯ Ì7J¼Æïê˜}…Nkxµ<€d\7‹@pÊË`r½ƒT(4f=`Ê¥ÐX;×çéí:Û† 5îd´CìÇõgQWócÆ¡…�"µK: zc€/. 6ÈÈÏ->� yÈw–‘A¥¡¤±€¶@inYþ+‚U�ÞÏ‹(&ܬØ�ÛËÜæz'J!Ã�ˆÖŽGÆ6<»{R#Ö÷r›ÿM¿nöÆÇÛ³rsüýp²1ŠK Ù¢ªYÿŒþör ³ïƒ´þx¸�Óß,‰íkdžžg`Œ·¶ØS•êî3d�vü×»s7c1‰rC“÷’ÆÑ‡Uz=Ä)»á[øhÿ¾k¤]Ø–¿‹ç&4¾½˜†AÇŒmˇòk>Šˆ>Ø,Æ64�!º:#ÍI8q`ÈvýÔ{QÛHâä-° !Œû#ŸemÚ <>ª•¿®r%9+è/ ä Éq+à1ÝU|ñA�£ç¿½a‡ocTÜ0Óõ Hnÿ¸C×a6AŒæ´‰ÅŽ�eŽa U[W(Jf­]Ìé$pj6f1ezán•bvß0½�°c• t(òƒ kb«¶óįßÑkå?cÁE˜FuZ·Ÿ�[*VdŒ -ºô:iMa…X[�ææ)²QÃñàÅ´±ýÄ€  ¬®ª!ÊyÔµÐXV…y£Ì%Ù-¯@låb2¸3ý“¡áùûš²gDT¦|YÒl%›ìÀAÛ ã11’a> ÚúAîBfˆ÷Ôá>Õå�øJXá„„*ÍÙ_(|ÀFC¸cJ/­^Òq½xyöÛüB!AŠP [L1Œn¯xë\AX±2Ý//MPì[Îü<ˆ}ÈS¾‡ï7Mifõ`l,\úù¯|E6`FÐuÃä³ï|ê†RN4ïR.ýÃï;aøJù¿Ù†ö�3OÇ }D& ‚ö5µV ±‹}ào}Ïâ¾ÆDœ5Iª |¨ôMô×.S4Ö½g•ùyñõàÙµ�Ç·ãà‡¿5ä‚ý!ÇÞ¹d¤Žü1^‰µ¾(\5Ï~>5ïy.c„ëôìLy.í·®ßà׫̚z1•†� W/Æ-ûà‚ÿÖl¹ÒàÓ�ÛΔ.ìÃ."g¦$Œ¼~è#Ï c÷«ùU³Ëžc·B%7¸;"!Iœó‚sà®�Ø×"Ï|¥‚.wÇ Á¬ùL8ü˜†~n\U{ì1K9Àâ#™å¡ØLÜÞñ¡i g²Z-Ígý¹çñ¿àÛm&®S‹!Â#†eu§Þvoy9ÆñD”·VeÕR=Ao�Qã¿ß’³?ëÕá�k0SÂIrC1N0´Ð"41‘U�ñV‰ò‚(®£ä½õÎ×4ÓˆŸŠ@ACÚÝr öÂÌw£ãè\y�å¹Ïj|Fµç©!rD‰ð…êô­‰ÀPí³{qÖ ¿ÄÜ‚ÆiäŽí»^q�}[?XC±“·í-à�ÇLhcÎiŸŠ.!† \Ý€«ÇB`®F*äΰ_: ÄÖéoˆÆ˜Wé±¼%¶~¤¸0ƯZŠoO»ÇÙ»â@ÜØý|h&çzCÆ?±ÃWîÌ cól6nÜ/Æ]5HȼI‰û¹ñW38Ü t|‡’g2fDær6uPùÚ:�)L©ÂŒebDàm8 nW*Þò¸y©rS„Â2I×eñŒºm[â7µY ê5'�…i~)à³�ß…ËA#vr±äãFsRù/qr‹ÎÃgÖèòf]ïáÓ’Ö±qã6–�Äa�b4Šùé,³¡æB¨Ä%ÉeÖž8WX¨7Mx·Á›Jtµ^x¡åî™…RIfWq%\õ^usUÁ`euîz¢{"J@¥jfÉÅ­ô›¬}¬6 R‡$Úò5Žc!°�må{ÞåtXÕ ®Ounµˆºíg½+Ö³}å´ýq5³? e�;¬Ï0mÚ«²´¤œ\,½kYŒùÖ·¼ÚjËèáá:kw72$eX†aCšm6·Z{®¥ÃÑ_guk¹³¤Ëôʭ:#¿®Ar^^\/"A;2w*BÃÈ;9 �ýÿ7vVŸß/{Bо�àñýôƒ•ü@hFX˜àÙßÞ<âc䘆Ó]²®éyúþê�o#þ>}©l˜û$ÜFmz�jÔ0pîø›!z‡9ÓãO&C^ìà Є´?ÝcÉžSÿ%vñëûþm²<¿¿ž¥1“½ÒÝÞ6~îŸäįY9²_I4×@Ñ7#¨Çž! ´pebsª½‹Yu7Ïœç6ÁßA®>s/ùž6壹bVÕVÈ­ªBcEK›^UÃ]eì°·�š©àœ‡ÞG‘Ìù�]‡ÙD¿ë>öû´ÒúCܰC¿@÷ò¾ŽF`ÅÈE±\:V¼†o<>©ÀWÏj ð ¬H†�s�×lV¢‹ÑïÌÃ$ÜÁmI¹^©aáqõÃôÿŸK'X£9!]¦{´¯8»©†`bÜþnÇðÚRdÐèoÓÕô0p¤�Eâ¶'×L@g@Ð{ÛæùÀa¦žì³¬ß˜ôÏejõ†6!6;œ�<Œúc`¬ž4\–š°â(½ŠÆ�1^8ÍËÂTîß085ËrãÂ+ÙRV=°æòRÕ'å9�Ua=:Á³|o$/žKG¾i‡\O{w³d”[sèßAÚFýßé7>Ì6´æ)•6ä;4åጴgX.â*£þKu»A÷!ðæD¬æÇA›�JxJø°‰ôV¿oX“…¯S©.7 ÇhÙl¢}åòú‰– é�Þ0F:ˆ=eê`d]¶w,¨ºyôa¼? Ì §äÖOâ–tñ�Øß¼T)€†Y`«Ÿ7b©Æ|÷î×>ÁÉa èÛxæÊÚˆ:w¢£„Ý"@^?ëS³©¦-‚M weÎSÒ\ªJǦ7Í¥Ò¼†Bq¯>¬‹�¯70~¥ÔäŵA�¸Ì¨½‹.c(„�ö[†$ÛˆC»ôGÄÎÎZPÄCOò!éØÓºw0ÿk póäŽÓÖI÷n¨ø÷‡W<8ÿx)Së™g—q²¹«³V|†JË,fìBG¶ÓÊMRŸk5öa‰0(È€} ¶¡¼ZzA'a…é{›wî¸57žÚ0X‹uÁX×rBË:¹çäÉ!ãŒ;.ÀŽ7¬z¼ ŒŒ•€€1¬sVGä g†ö�Q`´Åvk6­°fš\qØg{[Xx Â,—´fÊ£¾ |p,ÂD>>íË0w)½åýOàº÷î\]@¦¡«A¨�&Ó c¨3ДDC¡pß·2j}^9ç^”©®IÆÏBfdäøyƒYï(O…ˆ†5žµôÔ¹°6@z{ÏÏ6 JÒÈ2ŒäR„1øxu!ç)É@E0qœXIn\Èè ãåïƒBöÀ†ÅËŽç•Þ ¶ã!>zPW�ÝÁ©A¡äý ÿlÒåçØ¶kaGKFÉþâ «Åô üT”‚½¼“y©Ùý[“ Áˆ?ËxcQÎÆ;žÜíkm&û°WO·Ïlíàuð-›UÅV¶ÈÚóy6ÖBº5nòÂ5ž�Ïwow«~™dõ›�ï«‹zþb“�ÝN@1žDªbaC`Vø¯”+^xÃ�\†§½c¶ï�/mƒP‚v¯ÃçQƒé �…ý‡Æùå¹¶3an‘{tԜۙÔeA’K9ÞÛ vØÛuë¢á®üë*ìÙ›sSZ»Ú{ô{‘l½Q3cbÆ"ÃY³¦�¤÷\ k¡Ñ½±Ü±�Ú$Dy{F(=Ð嘽—çŒͪ>ËãƒÁÏNç ¤?¾ ¨¾èX&ÊÂGÃFª*ŽA e1K4i�M#Éa @®²U�Ôxû¹lj­ôeaacIly¶#a<:€.öiÃ�Òo¬-zèèÙl‰)$ÃgÒ×énh(%ðFXQ ¼c ‰r"xˆP^"jÙ0뱕î/^]1æ|èß–^D,œ¨DÆSÉ3�®2€g øÞjзà›îö(k«$ð)¹©²2m”±•ýNQHPýÂÁ2Á9çX¹Óô‘¤ðFk #S:sÖ§X¾Ûìª4¨Ì>Æ4AvÚâSl . ‚«¢ü—!`N †l(;­¯˜Ï¢�ð¬µý�”‘—}ôWž´ä‘1é{Yºt®9–k†R±Åœ"쀵Ԡbw`• Ò5×(ÉXœï^9”ö2éßaè݈Ñä5dx@¿Ãh1s¯ÓdÏlŸ„óÕ …ó‡dÊ“{dºè4qQ;›Ä½ùr¥ˆ›Òq>L¿Œóîöîi¯!gÿ› Û�3–dú¸ØÚ¡ŽëE0f÷:έ�-­&Œï@�¬F¼k9{ôuw@ì_4.ôV²’Ä’‰d-r£z5j@²� ¢;T¾1ÚÛêPw�¡”¤‘ Ò¶‰¹duC¾†]²ëþ0ôr-u<&Ã6Rˆ€Œ8ØÐB‚ÄÀÂf­b0CýAˆëú1ŒXÔˆAé©�ep°È{ge’ô5.iPþ-ËžFñÿ6‡’Šdã(ºuƒH.b ˜™œ�fb vôÚ°õ îpÎ-#Úõ%²hÞ”^ã 'lÍ1Õö¶8�­å¥Ø7h|‰ü Fhý7÷9Ë�O•gÍ®[)k�½ ¨b²èþ!‘È=X|ÖÈ¿ø$�u‰CÉíÐ'€˜ÅM/@«áÝÑ”oM…«—Û‰9y¶Ö±±u­Ôw6tËT÷ä.aZ'“;ËÂ;VúÞôHßÎBh]ˆí“|i€»æ˜ç±ž}©‘LTÉj¹m°e"#…XÁx3>ß/ŒÆM|ýY‘‚L¸¤±xÿk�ià|¾·,@N&²yåã �ïèƒd!å“X-XÌ�Ȇž@p&q�5ÌÕ`¯Ž-ØXc|,|Èû¼œ!.ž·«.oŘ1âi¢Ù!S°ºK.¢ŠäÍx' üÍ0Épw¸îݬbˆqÆ­ÆN 0vdµ°D2ZìÆ¬ Â�‡Ö9rÀÃÌs@O 2@)`y§‘².ìŸ*)aXŒfÖXcì\­°çaªzÅ•B \ICb@É^÷mÜ‘¯9\&#>IRUŒ%*@³Te ª˜ ¸”Ŭê,fyƒÇ·«c,�œ€×BÖ€Š/cM‹�0ÊÅaa/ ¦ ×>˜[01zÆÐ¨¶*p»Næ)§4¡‹Ou›„Û�h""V-ãdÕÑx##½Ûß4&È+ w©<Ó„ q! ˆ/œ¹�—§×ý_iz€¾ ±»ApÚ~ æ¢q§Ö \õ*Þ3»Î:ë¥Lc�ö¦ÉAG?ñ>) îDz xÏÉ–µ��RgÏúÎzé臿é=ÆDE—­MõžðQÁ³0RØÆ• j^fÔE)*R¢¼Ç\F$Z»U ½”ÓËÑIÎGÙ‡\/h³ìd ã0%ˆ7¬qœÄ¸q�þk¯è)ˆÈÕ  û>xë\9�¯±Î(îϓְäãØÿ�p1¡ê4c~ó]Ôþï�D6AÇ…’Ød±’R2ŒXª¥—W?Wn5t®c·8–øöæöÁÉ‚7Ê1y±¦êöþªc¼{~Ãx" î<_¨‡¤sç»ßŽ#!¤�<1‚lpX[ÓÊü[+»¯, µ\)y½`>pÜ×'dÞ|øÑ“ìÂà´ø5‹”¿µñÕ‰ÚâÇw ÀW›Ó äjÙ�¡¬Û�‡&þŒ8ÊZ`›¸õ-ˆˆÏA±Î– Xص|,â)¶–º/hZõ;SHò×EÏÕí]Ã)ãÃÚRWlÁ›Ç~œíâž«ãmšðÖ¹‹Khì¦\4aftòÆ ƒÙvÝû¯xîÛ9øZæÒÙˆU•qZªB“Zê LÍç7áÀ…¸cKþ­7²@!à_Ø�Hó -ð”*ÄBS}O£¤œ 6È7b­¢÷°A,æ¢K~Áø „ªIªŠ:¢!D TWÃ.wU-Ä|9.+£Ò•¼;i$Ÿ>ãÍG—¯‹ù;!©»Ë²ˆüØsdžœ)¹3eNIòy¦žÀ» •äI—×ìüþÿÙ½ ÷ÞÔõdžÞœ@/õ@}¥ðþ²"¨ý´²^Ëv㘚!Ÿög2;MÚljžUmÒ»¡$@ƒ/<üûak^ˇóùåíåE?dý­Y²g˜–Œþä‹yDqzoϦ�¶m5îxTgö¾©£B‚úíë{´¿-Õé@eÕ�™±åï•yޏ?%6Øå¸…£> ™dü Œ’ÿ~ÝÃvØÜGp.¸Ôã!ÃÐÒNÆô1kÒ¥¹¡‰5Ï�Pñ¡±"S×—šœ±,�݇s´¦h‰s™‘Ëz¹+,Ïù|~a÷+«–fì=—º6UNÛÕž@Sæïë\~äÝõšÜ=ÎúºÆý›Ã°Í§ë’ݽíò¶òô4êѱÜB@’ý@ ÿbI!!A¶ÚÚÊ­Z««Z«+mµµ¬ ÒI!!vޘ˩ݚñÃ-i^0vã\òÈÌ>ñ:¢ wz!Ãj2ˆ%x¯‰HÊ~þähLçºG$�oíw„‚¥Ü€ÆH•ç—nê×¹iðÇsR}Ê&±.ƒJ z`db‡I‚Öñ»«èi<ÑʘЖOZôAD^±©ð Ö×¾`fäÍ,w1]Gðɱ�`Òõâ¶©ˆ×zôûÀø•{sí‚�>ø–¸=¿šÜÖÂ[ÌæÍ›9ûºæ3¼V¦÷Â^p[¼´ÕÑ<çHŠ=Oa‚ Q�ðÎ2¶RTÝ© ž[Ër¦ýK hÀqƒ"¡ŠRÉéŽ ÍfÀ( ÓËP�s:ÕPã®Ìr �Žrok¾‚Dz�³ldÉhŒxžÝc‹Ìi”">¹‡ kø3b€Wë¾½£9Kžok’�Œ>·æ Kf�a‘âmÕÞ„�"¿²wtò!çÜ:âÜ#ö4—΋9 ÿ{ åǸ߀‰qî��M¹åk9¬�ÞŸ¦žŒŒqERÅû�ïq¨û!Aç'·ÒºæW pÒW]–¬Váb'˜¤Ozö©2Ýìwа¸N_9Y¼¬É7çž�‰3‹¨Î õ ›ñ[=玷,yµî£§ô’0á+bmåÈ�Ê1¾tZÉb°á]I—ØTÆǧ\Áq;£ãW†o®‹p·«˜êgeæO8Úf¬XßUãoo÷¼z‘ÇÃ2°9#Ëòš¹ÄØ´,Þ÷À%éaÛÛaΡ ù}å;uw`~µ³‘¬©x>SÃt­E³×220Q9ÝR1Ep\i´‡¥žÅ!8C”áÎãF7Ïùùæ}û«ZóãI|d¯{SÕŸKÀÁü7ÁÁ‚¥ª= ÂV úÀˆá�þ.ª�§ «ÑËwW|ËkÃùr&kÏû6`×F@êbÜMK¿JÂ!µæ-±:ΫÀUÌl�IÕÈ+ë¼W"s%ŠpÏu˜vÕŽ/\Bã>�[û�ú_K#á2ÐàÑ ¬^œÖzñMôÁâ¼x4Äós‘l›mLB'}ÖdÜ­´.ÐLŸ+‹ó ²º§>ómîèSpk�dc97.ü ÷$ý$ÞS›“u…B¼ýŠLV>to�jo˜Ÿ4oòŒ›JÅA¶™²Ñ ¬9b]¥šˆÎ¥ñŽ_;6d]Íѵ³vÃIx9) •V=_Þ2o0+$‰ ÷ÿ–Õë|£<RÓž²FÆúƘ³ BŠ\R¬U&¡æ<–œ6¢_™™Œ›šÝ> ´àîFo0C)AIeK8Æ”Â4júÉÉêQ.(ÚçyP°?"º“y¥fãÂ]Ʊ³&F�+»wcèS⪱š�š»—ó?¿”ØÌ%MCÃè ÅêåÊ&4»óþ Oüï_þ÷SëuæWþÉÊÁªË¶ExÿÂ(º"1?”�O�·ñÃ} ŽÞÊœûöcÛáŽæÔ¤ T½|…”BÀF#ò£§š‘Ë1E†msæt4º &A”#Gêýˆîhwz~ÆÃ`‚­¢¢Ù!CÜ¿jèψ“Õ„ÝФÖMn þf{ä—9Ÿ3Ôt*råàís/[=žMJ:ç¬ÌW~ü2ñj8œ¡g%ðt„WB¸�ÍU¬,®i‹×îh¢ù!‚³_ùС£èøÞóX´�„ÀRVôpø?[Z2÷Œ›]Ì{}ÀÖ÷æá5¹>ReÓVåt0Á·æÚya"åj±æQÇ<ÕÔ"ûç­pÃÁÛ!^²¢vVpÓÔ,›%É�Išlš�7[ý˯šB@úÐÁ Ðä.�wcIó8›iüø°MÉ|�È1ƒé1FÌKpN5ŠÇ7�ýùb’êP^aÜGFÇZâNÌT ˆ¦E �iˆb<0ãØ(Š÷Gcš×Ó¶ñ1½È¹fü(Õy”o@Þ¨Ó‘ÆMß1NÖŠ½WÙ6yâ3Š6ëŒó¢øÌŽÓÄCæ#„¶/;ﻞ#÷e«åät@"¨[EF\úËJ´óQâ2º€ÙÒù²káøbå{ÞŽX%Øè›p|çù`zSk`#�-б>UðüIºõ0}ió�ýtü£_æóC_/€ˆÉåwÕóÒ†îeíd¾ �¬ß>_€·n$ù–U–5}Þû} ÿŒð±ÊÞÌ(Øi4nú/ºç”O^ Ë®·±,i�Œ[âhÞ¼U'; ”È�q6OðÓƒåÏõ3:6Z€É¿ä8¦ð;8!¢õ>;üdÐx3Y’šM'~ê7ñâŽ|Í«ièE÷EÒÞ/†Ø3'Uê 4Bö^ù,[@ÑÜ~±Iê'¨^É£Åp ¡­}p_ˆždbM<ÈëeÅfË×z�F|C :(y®ÆœßÆîåèçÚÍÁèÀ1ßi}–ˆé[z瘯_iJ\£!Éw³Ë]7¸¬óéÄ9ç~]÷ÊQ‰C›Ùh…sÜ$‰øBzÞNëxh+'P3®ÕÊÜ´—ë(Õ\O2žÆ�èlDgédᆛÒUÝݼø.õX«÷ݤ§ìßžxž …�0Ÿhr“–oû[“C�g¿Íœ�äÊC–ºø�h`³›ØZ´9;-©‰Ÿ¢×¿y‹.ñÃVÇÜ CÉ 01råXz¹ööÅDó§C.–Õ{ƒµœAç-œóYåŸÃ<5í7¤”+ìtž|q|Âã=oež-›¨å¯„Œ>°]Äî/ÒŒ­Ë­ð‚¤?bþkT>å1¯uÚјñ‹foØJŸ4�ð~û") ä‹+{ײÞpÃè!|åâ0÷ h_ןôwòbÛZH�}{`�[Ó×ÐD¦š²½ú4羜‰ @’�‡•oÚy�-8¶�¡º�–Xâgw'røË)Ã÷ÕåˆÀz�|ÒƒËm­´”áKä$ï¡‚µo 7a¡�–Mòjƒ¿«*rGÜÞYà/†›ãƒä¿Øº÷ëýGÅ¿t§¯�/ul"ÞÜ÷Ë�l..¦TŒÂ н©^ïç¾ËA°Zß2±ç.[¾›f}觬@(%Aã«¡ø”h­�z,ƒ^‰wÁ@ >-ˆMg\·-‘$”Òâ•:”œÙ ±…ŠKˆñ–4Ųßë® ¿Š(»¾k~Ùyz<ô—NZÕ¬9K°½³8ÏÌ7¾Üë[‡Æ!¢ÃúØk/-g£ áÑö*Wjà&½QÝkgnx†ï`X';ûuN‚NÉã,“ kÕËPaê‡�þg‰=ê ¶ËŠæj¿y[c¾ÁÙ÷ á¡òÈç­Š!³Ù�¿Uñxâ�>ÙôZ¼½{âõo¯p·}丅½‚ÿWV»tPÅ¾é­ 6Ïoeãœü' iÊ×SÏ»°.a÷à{)sÓ<Ÿ›ñö.ÞÊ~}|¨Þz@Â� ½ÎÀÌa‹HÞ \^ #Ýqza§! 0ý� Y«ó=ÂÀ³Vô÷ÙÕ(ÑM“ä�À¾Á"$ì»Ë»>Fk[k¢þêÿ{;/‰Péùý}oè÷JŹj˜>×…ÜöTHÓäâM¼§1d�´¤=?ÅP¸ôêÛWhv}Vÿ5B� „@ÏI�0Ý lî%Hm{—ÒKbŸ¢›:²©—îF°…Y éš’A0ˆh�¡ƒ, B§0[6==º9N‡Øü#à™”ÆXø2ì|e4‹‘1%JA÷¹ÎÓ„c>Ë�iRks�œºÒí›mÚP9'ÌšÝÆ•BàÞ_f¹5ic7†Á6!×vŠRnàòjgŒÿ§Ív°5}ûÉ\Š‹¯¹IuÄ©ÒNåÃvÄ#"ð²TÞñ5‚£+çwëâtÒ‚µ */w¹$Ž_3=ÒëXgÓ9¦®yƒÒöìBIFƳXà=t÷~$ºúg©JÙq5Ñ‚¤ÎqÉ‘ÇÜ;6]´ï©6C1»¿šÆ´l{ǃzÎj;ï*üÈ"×ÿ÷� â³Þbò嘼Ü]ÜkÞ+v²K½ùíVe /·Ù~®�$“t•¿®ló /%ƒyb›…•,¬Vá Cѹ!#÷‡XbqãÉÄЭ l]o¼õæ³[Öïu�僻y|_S,»dldb&7ARu{º(�,Äæ8Í‹£]Å×3ñ²Djp‡w ðL¬y€äB/;aouºÐ¹–c±Dü˜ØQ)ÄįÞèzYÕüí–e¶³•^ç©E2§©2Ü+éo^�#cæÜ·¬…%¥q8¨~ šãLÉU-/k(”jx8ðÅÒpHf<"ë;Ú±ku„ÄéÜ×\»ÂËD,L.1¾¹g›n²dÞSÜèT(_9Auu3ø%wë¥ÙøÃ˜Ã¶ôÛ!çe£7r5Sæ§nr˜”Y‚½QmÍJ餺™5&´ýµÄM�ê(OÓ8¢‡5çbŠ,}ÿ)û2‹~ÿ›!ûEÒÓÑœÂîÈj•6×ç6{«9 ê~ºp4Âg¶7•4�;Ç P¶{OêGïôvð(ƒëÆÙÚˆð™´B ‹ +Q1@¦ûr•y2 Yã²31LäÕukÖZêžP"ß^Ÿï×±Ú®øÅ…ì½8p]I½ÌáfRNßãd@·šÐcÕö=\Ç‚åãI.§–X<ÉQLƞʯÈV²H!½ {¢ŠÍ³@°Ý.è´Kr³‘×QÿËN¹¡Œ¡Ñ`¡Pˆ­fF·óý~ŠR"·™Ô¯Õ‡?\NWü?~jµ)ýbܰ,’ø=iÙà°3õE°=Ýin7ž_Á•/ýß{ýÞùÛ�¥¤X_Z㎪XF^ý b¯Édb5ø¥T(ôF�“ñ´LF%ô6¿H¾H*·‡{i`SÚ[D8ás=cFäK�² /âZ‹aŒÑɘ©ðÁ¼¹¶P›ÛXt¶@Žé‹pÞ8˜ÀÀ¿ž@¿ßèg cZ9$ }-¸à`ËÞ"öHÇì 6ÍÏì¡” ƒ6m‹Ë`¯�z1‹g!qÂÖý¥ž†0û„¹�~l/˲àC¤ „|Œ‰¨�àkÉ�Ëõ}ŒH¾�í¶†À+@3!�Ÿ•VÊ‘=w¡€H|P¢?p7`®X//&b={©Ç±î}x/?+Äùãyû_Ù¾ÿ{~/¾Î•Š9P{ÍãxD¤›ñZ×'Þ°ÔŒŸËýRmÙÖ¶Øô¿õþÅ™ñÀ¼_á’î�µýêÒƒª0Mr·à¿Ô?p0U½T>”ÿ†E¬/¨›÷0$ã}Qq€Çœ`kìÚãn"ÀdÒÀûzý=ˆ ”òœ"1ÐýE®d&á’ãuûÙß3)–£Kš„ŒleCQ¹áU<¸|ÞÂ)�ÑG´h–Ñ`9í2³„iºØ\5…£¥´Ì E6ºÞ46ÒæF“œÁg<æ7X÷Ën“Í[|ÖÈfµÕÐÇŸøÂá»M»Û,Tq‰¹žº“‹ïÄ?´Ñ¿èçO‚RXì·'ÈÔ‡ÔŠ+à¨��¡÷¯Å<Š“à 6\œIÖÍè\µ(Æbtˆ{ÛÄòÖ‹“ :3}…&ç¯(ãÂw.@jdµ®�ñÛd%ÂòØ»øVt¼Wïºãlºµ±’¾h–Âô:4Öø…ô=¤ý�–ÕFGÜÀÂM!÷*•¼íÙ”ûœJ;)˜’rr3­œuí]pgW5ßÈY¡\Ë‚².š|ÅJí4 Ȧy½ôvG³4.›6õBž˜«µ`±}�Ñ ç÷îÞe+a©Ì6[Ũòúi»&µqºÇ“€›Bv¥Á‘8Řó@]ëíg¢ì/¡J£·"'©9»ï.¯Á)A±´,茼œâÐés êÜ®íŽÞ�SuÅÍÒ¢á}’'¼Ë¯y�¨Ó®qN´nïòî!‡*•ÊéÆž<ö‰.Æ©eXõá<=ꜛ5_…p[[áàF¯ÜÀ„ÃúÖ’àHZFÉù—²üV•ƒÓ@dì“ûÁ |zKhц�)×Pæd5FZËR­6á•1ñ«xv Ðë¡Pt²Õ$%Œ@úBk_Èûîé Xˆ{S ƒ30¢Àe4a§UÍâ±hµŠ…Õ|±wQÏ={V:‚×#0 ˜…tÎÐ>Kee8OáÛ¥ÂyÌ7ž‹Ø´}m¨ñ;u¡Â\¡eÚ8²6‚UÎaÚ*o¦užµÓvvâ¿Õª%­>òš�¯',îpûðPÙ‹>ES—!ÎT“„馚nJx¤Ék¡ÖÚ‡7y² ‡˜Òì-Ð?cÑ¿PSÙ7«ŒßÓçª;aÉÜÌQ]û8\+ëtä}¸û±yStâü?÷¦�‚ï£û¯ûîðìÏqù¤ÔHV5�L©–øUäH=ÓÂ…’–mÈÎÙl¬™ʨ5Æ ^¨µn8Cð훲+æbž~‘� œb�dß�fÃÝ‘¢ÒaW!€¼Çß-¡eª¸`%L�ö¸ÙQ5U—‹ÑΪ¯À )»%#Ü×dÏŠò®bSÃ�1ÀŠË›Ü6x5‘ܸîï7 #G|ò)Ã¥ˆ7Ýb‘³û*š (¢ôé`ŠL§lƒln¼Ñӏޡ¶�ì½írÊ$¿/UK‡êÊZ`�%†å<AG›äv½[µ Ða/û™¹?ïábµ³¾Ǿ½ÛàfF ½øîÏr2Þà³îíZËý¨è‹%©Â6ÅráÀ<äa¶U›OK¥Æ™c:AG �p¾ T ù’¿šH™¼Ý¹ô„ØömÅøXÈ« }É C¶Å+[X½èh_F'�4 {÷|Íy:)dÖ&Š¼è¯ŠÖ¬‹ëÒ]ضƒ(./†Â,O}‰²hÝbN&ð:‹ÌƒŸSZÁÕp€H"Ĉ W}˜›T¨i—�É.äf°»Œ0 ©-„4Xï©û|FCáÈHCU~Hð!¿©Á›×�•`?CKgDtÕ±BL¹Ú—éYWy.=Æj]¦ËÆk¹ÕŒ�žŒ]>Yq�p~L—R7ïÑß7ÁµPïàôÀxaq�`äEì=|Åš¥œ“f1#¡5ØÏ¸Ø~ .. ¬žÂ'›yè#Å5òœ.WkŸ§�E·íú•ÃUϯ²Æ!ˆÉvf~e½[¬i 4ñHw¬¶Õ©º=Ïx�DèÓŸÿyÞ²YÎŽš÷†y èÀüŸ//'ˆëíñ¨¹q­w�þUß”¡'þúŒF#†e~\I¶¸¡™Ñ ~i• TYÝÜQË•wL¹Î©YHÞge´÷jF\Ù¶¡�½šgdÝÙY ç¬Tœ'òÜoL¦8ß8È…9‰s&îaàÏ E®‘™ã¨ó\»_Nj$ñ’«Þôæîö;”Ö1R敚�˜æɯ�•ô¨†Jøïa´^lVÝà—ŠÏ*ë Þt‡§eµIæ†ùÇ®4¯%£ “:MÅigÕóbhëtÕž8›å;ݺB_¥Ì^¯1^åè$‰åaö¢õ�/¦Åô¦ÃÛhFŒ\0Êk¯±Æ®.2vïìˆßõ,U˜ÍH^û(HETá=A%�w¢š><†¨%öhªöøéÓ¦¤âòa1àâ].hÚbXÉí–G…Œ†3úï¸I é­g*¤CzZ˜•Ÿ1‰œ–t\¨‡#í ˆdL¦h²wróÈñ‚¯1>6”SÄ8M]Ëo ÔÛç2мܶMü»AÙPmUúÉ>ÑX(÷�Ç™qŒ`¶™]£ÍúÑ×ß³êî3¬¶_Ï×5X0©À]în�ÊÑÝl»Éò�Ë…Ìíp›ÞÎnÆu;Ö5Ê“Ñ& àŒF%#—¦£ÍeõÆtxR‚\Q1.øíLâwƒW=LžNŒ�ªÈ¨?²5†¬úèl{]æK|Æ®Ü^ïœóxžáSº ¯*/Ÿ3»Óó�+øy!Ê�Ösq¸gòõFÛGiÍÜä£rI²ÎtÃ3%EÂ+“èÉá$»ÊÓTó{× ×r›²:Lèޙ¬¶G‘ç»MW4—-•4d‚p©fô³Q¤G>g~½Ê¶Us˧wö8I7­âuåÄÆc›d,aD~ ‘ÂàO u‡d:â}àÞÕ)îX‡dk¾oDÔCÔƒÅ0i'®·îòÎù1ÅÇo†'z�óz5G;ýÏî´Ãäœ ¼¤§\»t<0onÂî`ˆQë¦;ˉ,œ85üOé¿ýØÌœÔ�¢445û²¹¥PÌõº×ÿ<ãù£5]‘Oä—sdÒsƒæŸÖyÚ}:tWî¢ggã?gçû�¨Êž}ÿT½Ü:�Q @�K»Pþ”f}äà�LÑ$ôJ8­À8ò¯&³jÚvý éHnåÿe±=ì':rÚm¬ÄWÍðrkÚ74›!qy¸ž¾áHˆ_ºM�ýYÿçÊ] T]!ë-´¸r{x9Z30wÁi˜74M�Ξ\µêúgÓÍP½û§NÝžxŒ�cÒãËúKÚÖò5SÏ›QO# ™ãhó éÅîj<›P[ Áð ÂH+6LHzíû¨RîØQÚBäcS&ûØ/ Ê\ í�^6ìùjá©*ì#¾ÿÿ�oÿqÝKi6„ kÆ0Z(Òê0XĶˆ{Å/³¶Ýð¨hˆŽ/™J ÙïU=ACô‘b(&ذ›Õ9¬�k ôAX 1Áyy ÊÝȺ\ó« =%ß#ÚiNZÅÏÒµïǘ~ Æã%À¸< *°Å·‚7#B¿;ÜÚ�ZýÌqL¯¾½y’^(Æ1¬¿âÙâlTIspOʨäDÛàb‡µ‚ mêUzÄo­ù)ã—éUoXvÓè„AZ‰ã ëÂW1±&L‘Ʊ¬¦ ´¨„%½½èÿŠøðÒŽÕ¿NÂ.>ómœkÆ¥üT‚}�Km£_ÑMáq@õ¢k8H�Å'6Bkžì¶Ô¬érE�¹–?�úޏÑIh Ó³uñÙˆ�X+•/yß.0r™ê7>cêªX¦¼‚ÐïqÌàV±ÅÝ€ûà¨�eS޵…ò!éõa˰¯a,ï±Ì–nP2ª–îa†}€nÂ"ñÛ�\ã)y!/C¶—Ëb×nFOs´KÛek+¨Ÿ9µS1 ÄF¶(QŒ_Wž¤!F¯}HZB-_¥Æ'!2/ñMƒ b"›ï™bÚ¿eoâ¸!Þ˜H �ee[†ÁÏÄ\œ¶Ly¹è6ÊgÕ`³[Z¤Hˆ žÉ 3çCÄ'ï©�šxIïPg¬§éˆ°Ø01Ï*An¥$Ìû{l²B[ˆ¾*0Æ|y±1 ÏdÕ}¾,­8-q-ÇŒñV %=,®�q�ðX!ÙªGÅïݥϽîÇ¥“º&%‡ @åÁø_x|íïÆjNòÊ >X3òÅ“¶�ý˜Èà�rzdž©)™pÊ-€“J'oŽg£™=Wr€a^ªÁÀäs=Øÿ-þs¡_¶Gøóß8e9Q$½w£ù¦¡¤•¼KÜÃVeS_¸¦YyAµ;Ý�|ã‡�!i'�3üi¾l¥Je>}VÏh—­jæAþô–­­\Rßž«Ë¾¸ñãa‚,ùžÂ•S œÑ\$ªå¥%! FÑm;ã;HÈ�aÆ«Á‹…nn8Œæs×[È<=Ñ&VÑ@Á£��¡Ò¬÷ùpš__="Ï ÷wõ‹rc ¬°ËÈýÇgûH8Þ½³ñè}jÂNÄ+°$tS·Æ^¾Ìy“‡É{‰"·Sy€'|¥ç{®\S*÷†ù!ÜHχ8C3æ2vð’‰ô—YÊ‹\õ˳ò ’l‘““9mûˆËÎÐìªû(Ξgý’ÑKuwä3¨w3Sê/Ô¨øKÚF~�‡M¸ék5œ7}8.Ö§­^ÅéZ¼ÐÆ�JßÖ´ã>~÷æŸÝ/hG†¾úv»GžÛp™ì{¿'írSÓîÊÚýi­]…d m# ‹Jò»€ØÉ� Y äYS³øÐry±ÛPöƒ ]ñe:£¶¹´3A‘êîký�ïž6Bpä0µX�ï‚ñú†¸i؈ÃToʳºyº½Ð»ufbƒI÷·­˜û<¢ËÕ×hºö…¶—ÿ^CÐîð©á;¿í˜.02ÂïK{8Ž‹¿¡Hg˜×ËïOå?¸ÀGvÃ{ŠøµÍŒ1¶B›„•tpݶíÜh§|Þ'qËÔ½°Y.çÿösƒ×?—ºý€Ák0È‘¬è9jŽ¡NT,&€jÉS Ýd‚ìq'½xPLg{ù€_Î%åð™î0�¿­�d,�ƒà}Ê¿Mïr³s·ÂËeÁ[È@F`£ nŒQ]E»®y?ö aìXf‹YAý¡~Bl+t¤Dµo¢‚ àß^5 5þ£Åìª]-A挺k˜®îÈWi8a¢ím·'¿mŒ]Å!¬gÀ\õ£(2ÖVBçPÆBx!Z%UGNº8X?¶uR¨˜jlÀ÷Q€Dë•ÎþO„Dì¿ÆûY[†i)‘—<è’Eònø`'4ð—‰â�öƒ7ÛQøÇH _)éÖ犢¢š�’z,^[:òÒw�‹Ðdp`›…$„kp¦jy<ÈÇ4þKÆ —õâÙ� YQ¹­¦ÖE ÂjF .Eá‡1ç8ÅÇ$Id§9ñ˜¹¦W#=èöóÿ;7{x·ÈÉe!xï‘àh�çká0"±nÄ< Âáµ{9M6϶/Žžþ`)Á¸ûÜŒ½¦]�Qu4GàFÚ¾¬Å鉾†W½} }z8šàäòRnþö¼Æ@z²,ÐHÅÖÜ•1‚•s5|ÔÄæV+™+#òøó³Êñõ¼ZG‡Zå,Å ¥8â=DØò6%�C]˜ze"[%+Áë$æŸzHöކÀWuA¬*ªÀ‹¨C¡ÂIÒ¼qÿ%‘PLóÏ¡›á‚- Z¥œùæwxô†¯¢f…){ÊT'änéUš#ßñ ñÜÂLºëüŸwy#ó¾Ž`cËTwp: p—¿t ­±–bôœÁêÔ�l\|c øøÙ:—Žz b�›ŸcÜ��ÅÅãŽQ=Y;4[Ú,Ï‹©&üŸ@­j+Xt/”Vðýß¾à’õÄóÛLF:íïR€¶tc÷JYK8�.{¤ò~»}ÄÉHYÈ|ØòÔíUÁ°?€O…�6±³…ZmfÉ[iø€“®e3ç wµ�úxGõ×;Äûû> Çñy�ÆŠ†h±¯WY@0·ôz¶OBÀ³l`+Ož5ñ÷Öl߃ÙõáSOéqËXÒý6Ï÷+‰ðR§_N!ŠêÞÂåGÛRv_Á�vþ냖L¸6ÎÉ{°À�Û¼½«W¡‘<]²”±>ó³N "ÚŽ–Lb5ÏŽõNûÍ`+kßbôZó:ê^ÉA3a½å.³´,Íí—¸Ò•½ÂÓ/šÛwE’�“œû4XD†€ŽJ�9£ëŒÜ �K™„âYà]p$ o|ßçÝHÖ¼U5§÷íîfõÇ^^ÿ·Ì…{[מ®/([º•á¶:öÌÛ#<ŸµX g\ßtHH—1cÓ¡dòz¿Œ|2éEk€ò'�l kºÆ{‘ëêuÂS駉Z3³-äj¶s‘Â;ß…Žn�&¹Fž[Ëõe{¶ž‰ˆ}úZâÚêÁù¢)s}!ûÏqÂ>K²ý±éÄ·Іxæ¹öÉ PÞûcË�p+ëï+ëô¢Á¡ðKy9Ænå%E¢ÍQyçðÿàþ¾ð6̲�¦ wI{³ÒJ¢±÷t¹á¼~/…Ÿx²±­þy˜J>ëÒÈ’_í^ˆS#ðÏ ˆ†¤øÙ»dÞ`èç¥PÖ™ŸŽ÷¯|>²Ý°0 gÆ@29ØD�çñG"GJ`%óK¸óÇ|÷Æ¥\bN³—£}Ú#B}"<ô÷…&òÕI§ÅË-»çd*Œ›j�ï^`ÙîH0wĶr5í½L4—IBW¡Ù.$s¼ "öyŽ×ú+PÈÚu65“½·)Ë}–™Dü^Òu³·IÖü½òdq·õ«Ž‘ÙÉ<\BâÇ×3›ZjÒµÑ)óÔžæ! `-Ïi¶�ïž2aé‡*X•ñt¢'ÄÒº„luW¹©¿Y1uU"±F.¹~QÆ [e8ÉÚ«D"ôˆ9ü‚¨(§ÄQˆÐ PÚ}L÷Õ@BÓÊG úCå?) ±Ù\DëÎa*^ÌÔEüêßå ÌBý‹,�Ø|?m`æfoŽªºjÎ:÷š;õÿ@r ú®½¾­\³+AmïÚjÞþîÜ �Eô.] [ zf Ã°�Èæ> Y>qI-߃åòA‚Œæ>0¹D)pñdS–Ó\]óp(§f20g]£&¢\jñ´›b,—nCOÄz&c(6ª;nÿoõ@X¯¹Ï›¢Ó~5«ˆ{ÎçÝÞÖîŸÛª¬^QÄ™í¡î6]ù�£öT\mu¥.ß)‘©.Ò?Md�¸-ù¯¦kè{t/#qg’\êQãl'¶n)ˆóùS`õ1ÁCÞ/F’ýë�D­…P_bZŸ A ·š÷ÂR®ãdã„Aqzºþ60Òã%®®úíîÉŸ�„3ùKí©AE©T=2®n¯€×m² cÛ! ¢lv5ŠúE”u½Ïô^çIªëÒXM‡8@íª‘è;.{ˆÔ"r|lRùŒVÇ´—j¯Y$Ï©ÕYÂËÕâTüÙµ®oN‹ÿ–þBòµgð…d¬ÖGY½ »X�[t… ¤¡Ó6ª6ÍB &Û`‰h6Û�º:1Úvç~ö�yëÕé¶–,ËtZy²ÈØÊ�^S&D;ä Ù~72¹ÿ©òÕ=]gá¼ ßG®ô] ­¸Œž÷„k•0TÊR“ÖZÂ’°Ìö%¤Í,�€#~ç$sâjvÈóÎûþ¤);;ˆñM…_#z„ 1Lzäà”übõbAµÂsb¬x|Þ�V/_;#Óá‘ÚKöy.‚ ü^‹–¯õ¢¡ä÷f…’ø­œŽý†°’ÆÊLJ;qÒ|³^Ýèʬoå�CëU0·êú"Î }tWH!uí.tÙ7ºq÷Í*ó÷WiÖ{l!®ë µ+¸98-˜pýH›Y'¾®?вÿ0KØ—]æêpÝ—Ø}«iË€Êßž¼6ÛÂmeÂ}ÛàÙ+ÙÃSȈSÛ.™fÚÅêìº\êTywçX±Ûa-¹1é ¡©\Ä¿¬cßE×è×[­¯�2«~óóå°º¯áÓ¬ }î¡N-µƒÔ�27ÚBƒQ\óy{¼C=ñÚ}x=7 ÷ 88å¥ý;sw†æaÂÎ>{9¾ØÏƒ�€i_k­k[°¶;Œ&;j–¤–PYx½œaÃÍ]2Û¾\vÈ„Yl¼8ˆŠxlJ°¨a Î!ÝÖÑ“5Ê(3S ‘´©D„¹6Ä+L�°ù¾i^Àr3¦cÍ’6´‡@ñ`@¯‹^æOî¹)ÂÕàfµ^»®yßâ ”²D©épŸáXøq¬Z4fV’²ì4·¡Ìk+¸ò µÍü¸sl΃À¿=Vî¯Í(û–šÔ¹ÙeG®X[JS´�«��æð:BQ JE Ø1èÒº©ï]/Y©ÖÚGÙFùl0,H˲�&10ù2*dâ˜Úï\'™YØL ÿ ìŠy…U"Œ6Ìo>ß“m/c? Ô¨¾z®@£†Þ/'ÇêU·¹÷nÁæø•Ÿã½òÿB>„‹3¼Ç¶Å»êú\Ý>Æ–7ì�G¸£¿rÛsÌ.èfóˆ]3O¯¯¼ØÏx;&¯÷%í>é ¿ÃuØ‹jÝÇÊ2ÜÜã7� –×®ÂyñÕ¤‡áb"þÓÙ�&¼þMóT�›ú=àÊnNb `Çá°™Òc²>hT!ÜÍ™ êk'½®ÂÐ!oiõ¬?‹Ö×:c[]×LÅcû uë#Þ/vN¦mŒZËž¡„¶é�?­²âHôónéýÇ"»îÖAkógm Ò÷‹ôpÎ�‹ãe†û³lz!Ë=l65¨[1Uû.Ì?èosƒƒ,ë Bm8«+¬%ÞyP‚îJŒk@Ý1†/¥“œƒ Ù³#Õwk ÷öÁ‚`må“–kbxªmüv’þî7^×î7HÞ .P.ÅðŒëöú5HÃe¼ó,}Î=­ÍtÇNk|ãç¾ÿ½ú/›ÇWÝgí£ "Æ+vRØ Q­áh6ÑY q[.wrFðâcs�å¦BŠ@>À;[b£õ·Ôý�æ ¦wåãljóãûr·}…×l†¿-„g÷�ûDíGæ#ÿ–ƒ�({”8f’ßÉ+#YZ Ö)»C:lýBpi”Þ YžŠÀy Hþˆ—„ ®3éðyï]ä¬[{WhÈBIÖéþ;aÚ¦±;ûö ›þ7-”oôµ‘Ÿýs¯õÇ×û¥i÷¡æ¸Ð�½4!#°Ò@)õ½=·õå†A§3_òÓ˜,š SI]ê½>OPómoCjñ[I¶›JÊ@xi(i!®F6’`š1÷þ�ÞbÉ!.í 2ó„’K(þÛžIöÀ€œ}Crv¹A’�áƒa !nÒVj¾_¯×%�Á¤ºi.†�£�©hÉ6M)ïH}öã1!\ X ´¬>ý¡ÅäÕ)ÍhÖ^!Ëa(v u‰Mû•®n[~îÝž�”�röÔöŽ‘—_ââö:oQ}Î\ ¤¨)‰æª „íý[ÇkNœâ�\VÀxF<Ô*GüiÝr7Æ Ò¾4`^ŽRW/3T•ah¶ÆéÌ3Øœ–D§Dfú‹,s›Fü«ò¯Ó ûv�vÙ„æâ× i´Êa‚}^™ˆ°§Arôù[¨#&¦ÝM6×ãîXv‡‘ä*)®ï K¢²{jb¶½‡¿{ÏJ®<†X°Ã˜CÁÐuL êýV )„ñî~ ¸Îþ`€ï²úÚò€€ãVté_e´ç¬Ü:h‚Üa0+$'n#^lÞÏå©þ;d·�u¹,D€“Ýè»ç·^äjŒ!Œ`F†ÌúÊkxÔûsrÃR„Çú à¶{ÃÍ Œÿ1²Øi­ö X%C;ͧ¥(AÁAÛlœ=c‡möÆ÷8£^Í‹‹iFX#Êñ ˜©\Rë·ûiœ^>Àâðª w-Ñ?ˆƒ÷áÒÆî&þlñèÀ9ïÀr¼ë±ãpæÜŸce&�÷€½É¿Å°|Í ÌYñc£ß9˜?мmâù�­WžxDЛ`^ÃüpãÕ±¦¢üózc÷ÏÌ¢1YDuºg¡?+Ëw>�ñSÏ%Lë`Â�G·½ˆ±¨ x¬G¦2\ðv>“aÌЂYÖ·¨•Ç{ÎÞ“ºÕJù1âÄÎ4Ù+»=Œô¬~o�eß¦Æ ,eˆ j«¶r‹5‡ª2/ms˜Í¸^ù¥à¾Á¯uy ¤ŽþlZƒŠ‘5al»æ†Ü9ˆÏF$ŠŠ­µ£~Ø0¢ø^Ñú¢üW}£xŠœàê/cœy‰ @’´.­žÎæy’ññ—EböÇZçmGÚj-ØÎ'` ôjÙÖ9Ýø!x¥Þ^ãÄzÅugìP«ùaxkít®¬ö¾¹ù§†nÚF”T`¬„Œ0á˜î4=¸uY´„"Ć'+1Ë-§4Ø j@›çÃ#ú¶÷ÅòÝ› º-j½’”_G¹¦¦ïÀ<_/Û{OiÛ)9lU[Ø�‰l$IvìÈ�¹Qéæ»ƒ|(�·lcjo( \v§òìcwPþ—Î!sxÜ6îX©”]툳“�¬›o½4ð=°+nÔÚÒÝ;âÛ1ªå�þÈ´=ãÀ¾¯€ü ZÀÇ59À”%¶šxó{øY–öý—µ¯¶†?di{?€àN9v{?§�®�ˆÁM ŠóÛ¸W£/%�ª_¸Æ»˜‹­öx å=±As PpÈéÎØÆg§ÜÐk�¤&˜ä�`…r¨Ê5Ž/ð»5Èl¾'ÈǨÞü��çK´+çh€Ø£ìâØþèó¾&ôÃ:ãkz¥»ÙEäì÷‚i–Ó)¿zr�¾ˆ0̧¹æû±ìâž)㾟¬‹ýí_óð[ü"oléÛím+�¨¡Ñ¿ÜBObñ‹Ž¿¦“b­@Ló^ßF+K›#[«9"ÉýB{àèI¢ùÓõ“×,»®±tÞùô�ìIhcö%¥Eé�íîÆnRÁî0Q(qص£µ»`º(uÌü¤˜2¨LçNùymåÖÇ}v¥%%–îÞ²”Æ×Q#ò N|�„Æ"[#/·B˜ýæ·z�'â¶¶9}æ×pÁE\.9eèÖª˜ Nš˜ƒæ�Sàˆ=@+l Ü ]{ãˆÆ±!=èÓi�Šš”GØÐÜB'Rš JzƒÔ8�m+ÂçÁ¸@H¸ã|Àü \7½�ô×wÍc½‹�öÅJ¡–6ýÜ'ûÿø«°j½Ïtef°$öÚÇ… `¡Or¬�3s�AOP›¥88>$¨õ¼ §aMatóß{Qƒswƒ´˜DR!¨÷ôö¤—={÷çñl#öÚT ôï÷ß�¼aè☵Ôçc ‰½ˆÚ³p’Œ(b³¡­³ªØÂ@�V8òîÆµ¸�+•¹oF�L¸äà { Ë]œ5<Ä,¶ÊYów΋Ééãúü4E€¹ßõÅ` R™n¡ï0áö‰½w|7<Ó7ì×1³îc= õ)[ëxï{~PÔ]>Ê �‹;²)7P�Ö÷ î»"ϧ¾ª~Op.ù¢´‚×õbÞ ¿L`te Õ°=ÞõöEJÐ*GÉD�ôwqûtÜ›ü^ßV¸––ú¦ë©+%PYQ>â� 9ç�4¥Æ¢Ð¦IJÚáÒ�s“+Õlé¾9ÙÊröÎ.§!#P$"Q'bG`¿ºÖ–æúfð'õÞ§rKÏêÍKÚø+ |°#oì½ °ÎÁÿ ³ŽcÀˆè^ë‡zÍ=·–ðó“<]+u‚¹>ª7^Â+Ã'<Õ©ýÆs�fîf—­à𛙀AÓ^]úv‰ÛÛ¼ØÉ�€¼ÕˆFg ™áûÓéx ›[ÈÝûÞ ù^ó7#TKXnM›ʃNzè‘ÌßX‹) ²°Ã½L‰FÇ(…Ÿ:�Œlk˦HdŽô×�¡Ÿ7bòçr�zÙ þvÍiøã*ˆ‰·3fhÓ¯$òV%ª;ˆ8æW8þšá¹ŸË)¬ŽÓ¨ÛU€œü¥wP.*þ.±}™+ã"}�/W’¾É{Ýó>æìÐöÆVÇdÌ"âhyÜd1 �esîw³ Ìg‰N凯@Þ¨ìÔJ Û¼hDkj°¯›­&!‘Qƒ~ ‚Ä(“ DG8‘ô@^¡àÁ ˆÛÆ*żîÚý€'ˆáü¿ËŽ—=mQñ@"o¸}ªåZ1žàt@•ÜܶL6žtvñæË­6·Í¢ø6&å‚+ù8A8äØq»®Ø!&±,ùÔ)†R¶gBàËß´>`ÿ_¿·±v<’Ñä'�bи7Œid3ˆ›QLæ%H©YÌbÍõ¬TPGa“—Œ¹�-P¶,Sže'΋hD ›\Ð'ºƒmwtJo´?ãüêa“ ‡ºEfѲÜß“ Þ.\~kzW¶Ùwç8á5(Ó]çÇ4T$¨U#±†Y)–„”Ÿ2�Cù¤z»]rúÞ3¶Ö YXÄ£Â!å‹kóó}ûxßò;ý‚IÏüþûÁAîÇ_Â>y¤}ÍO"à—o÷Ëó7—Ǹ¿3$}>¾ÞµS´DI圆 Báq0]ž»LŽc?X)ùYÈ…ï£ooš“I#îÉpÁ �ÿ�§ÄPAó›~Ù¾µ€é•"6ÜŠ:9ß4„ ½t‡^߮֞éÐùFÆ+Ú�ú¤¡�Ú{ )Š44xß7ÚÕg0&Càœj§´4;žy?À<`r„v‰$�‚¤ f É7•¡ãlfüÎuüÉÚ/žxÚ�¸†÷ãÌòWdS¿Gp¬L~ªµ¯lZqÄ:€�zÕÅËËšâ\™,‚à�|èò+}Oý—"7ÔÆ{+Ö�“uõÎì¬æãl“! ãD�%Ö†„.nE„À¾ðWÜùpà(ÅàâFP‚(Ôˆ{àMöLNšîߟ#1€¿®-k�æ0>â�Œ•²§55“úβ ª*›ËϹ™Ò Ð|ÿ[óÇÊú]­Ä|Gü‰æ2�bb<¢'ïÕ^Óä®U£˜ÝìÊS ˆ–¶‡qÍÐy"ƒ$TãÅ£s7êc4„1îþ™g+IÄ8 dŠîØ@ív’,Ô#tÙ#ç}>NJŠŠº@ÃSZI†™* =d#‘‚æ�bèc`»ï×ãð|P�=Ï�Þ§Ÿf¾1ô ?\ƒ�.·\ÔEóqƒUº�œ¸ßj�31ºÞà��è}pΠǵ�8ß&£zAÑÂ3¹|‹ƒp娅Kì ä4Ðé7 �)SÒz|¹qk¤Vß~Ñ­¬s'Yƒ°º´zïk]ÂzÕ/y¸ð¶€Eo�Ç•O¬“F‹0æaädý¨ÿ)G¾àhrð–aeke¦{Ž“•‚Ž×Ð;–}3韾ÕëëÕ‚÷^Ùæ ’>ã†Òyÿãi÷M†•/¸cOòñ™üí<Ö [î[ »òvKx�ën{ù �:sÞìùyB•�ÚgðË×cé䌌·É4É ™ Æ7Vk>Õ<÷\fäé+5LuóÏ3È Ô;m¦ÈÍý§ó3{Êp‡Ž  gT°–Épv¼ é÷ß|·› �GüØIð¾+ÎÅ9-¼H—/Â/ž&~O÷`Ê”Ž¯åvm"y,C[YßAS·ßÊ·~m Q—„‹°(è£j;Ó^S-Ä8ÔWÚ¨°¸ò91i“Øp¤7 ƒÓgó'5V5ÀÑf6Æ‚^o‘!1N°Ë>ËÓn{ÞèöRØÓ¼_Ç»‹é3ŒF6Kã¾ÚñCç‡�lõ—Œk]ˆÆ¦A6%QŸ]î«%Ý·”Ù& F°\klã$’’L PI1õgÁ¿.äxùu¦È‹ë–Ò}¸EÓ['1ñiÜg ø þ_V5ë|[¡ây<è( ÝÝ\­…µæÒ4`j*Œè·1|ìÂcBåY¿ÙåÖx™½”EÑ�ÚwÑë�j`HäIáWH©ÝfÕ®)…Ž��9•)F®1*:Æ÷Ä_]¯ÈSVŽImXEÍÙrfZŒ$t˜— Ÿ:¤�‹ÁÇEi&MÚ»CŸ—MeJÀò=�hÅËzrö³ãs •þ Öãû1tÃÝ èóŠûsô&*îòC× Ìó¡àÏŸýóýàé·†¤¤Ð\Ïx^H�£Ö¬„™=½æA]wß �`2«�£Í›H#ÿEoí÷&˜ö~˜�m-ºCD;z ¬ï¤öx"¶ºÅ¢}’k×V­>-x�H­ SDiQªÊ¾ªæ7ÉyÝå‚ 3Æ<¹s˜ïuL^&v¥ç¿¾óÚánˆûÉÄ–Íç}÷Áp¡Æ³z-­“p[Ìdk”§q߀ç_Øux½1ÈIÐ0Ÿr¾  q&e¥(&B;ù—:&f<ñÙX<ŸÎ�ñ�®òøÙà‹ß¡>A€4绳㽠Jx¤›ið•3Sºx{ö­t«•¤nŽg¦äÀð+0ÃŒÂoAÐJ¼=€]z^ÌÎÏ›ü›Ò Š˜�d–_à‰"ÐD‘Ñ~ÐRÎ.1}ê­Y0H8€ýûH猞G�.�¿¶ÞâñšùùÀÎ8ºùnš-¸"×»ÇÏ&5¦½GÖû�ÓïÏ^~q×ÕY¢C e~+]•ù�BøØ´�Nœ|qéc~/xp7:Óxñ÷ Ï/Ó bøôuî. P ¾¶(~iü´ÆJØ#:ÁðÜ›·.ðëq:�A«Ù‹³à€éÆ `�€ä��½i_ÝÉZ%`€áñ÷ä8cm±¡¦†ê¿íƒhQœi.*¬öþy³–¤êž’/÷øêa05¯…�“‰÷7·«¹ðG,?çŸ.yyÇŠØÈôµ &ÈüyDR>;@K£ÿhgÙuÿ)S6è3~<ý%¨cfŒ?œ7_:ÛÃúßùÌŸê1Tª›ÜÍ.�ÝJîS×ÓRªµöóÁù^رú?¥Äkü�Ô„Þ(Ô§ó]Ñ‚Vp_ðŠ EF³MDª:ÝûFo|H´{¾p›æqB ˆ¸°Uw«"H˜¯Q�Aã¹ä`8¡×”üA5idä­a䑸yh9·òœhe}ÎYèÍ ¨_¶¹Rß¶îvÎN¸zì¼-=œz�%“RXŒnJ‚Ã�QB"œ:´¨£Çœ*ûií%)ÒÝ&+ÆÛV[¼ÕBÛèË™Tª5òJ×dÅ ”�.·b{ÜCþóÑVéxü£öLƱ°÷P`ü#·´¶¯JÞû‹MФ§G­�@çh)øNÈéK¢‚µÓJ¯ƒcÊ‚–«a·U†€ �r"h‹´:¨> šñ< ]2Úà†Â7Iô#Tº>Ѐ­Bðgr�#‹*¥êª‘Uã‚mý�áéþ>ÙÍ‘K÷G�„ Še0iˆ¿‚q#µgì¿ùˆ ö¦³ÆòyÇÚæÛp{U3Q»˜ÐúÙÖ2V‚}qqÝ’�T6$©HG ­‘úuóÒ@@b-{Ç9è¿·Û>¢úkÈÿ#ʨG-3¼ Eú=QÂݾ„ƒŒsT;£ m2¾dððúæ5–ûeçCÌñÃG(a†ŒÚŽ «{­;ºãÄRm¥šÓÊ¥òyÞ†x“H³Ì²‚õPi®Òy':?vbÀ½ù‚0´[A�F všáéºVCÌ­ÏnÖq´_-òFì2à†0ÎÖ΋� RÍe¦ö 9Ì‹µq¢yƒ.c–– ±ZcŠÉ^â¼áòs˜½ì…Ul�!†Ë,cЩ$'sœ¹Ã €ºÅ»F ‡!1½{D ýòIZ6íÂ�ûçõüF'K…PݦÄ=/GMá(E`é`½²ö‰Ân0xÔ™¹b1 il"SU°½tüþm÷ë\’Õÿxã!à #Î/‹ßH³¨.Úžýíã{ŒŽT.bãøµF÷pO¦Ñ·äb½‘ç“î»v:€èhgL3íd87â´¤Ò&ˆÔs©Ý§³I!5À¶¸<¹û À ² ÞjGpH„‰8³ÝrÈå^Câ1Ñã¼&tDãÇÎ@QË-I�©‡^éc¤/´�l@]Ÿ9©‰(ñ&³’s†"2ݲH  Õ7z­'žb‚™õ⮞v+1Ÿà›· -Ã?/m&~3HªùçøçxÒõ°|ìǬ€áW‹ª8ì1DI«gòÞ×Ùû÷6Ëqw@ ½9x÷¿e;��Sï�Þí¹ÓÖµs¡“F¨&$áŸJ ž›y#Þ—’9èJ#SµÖÁP0Q�W‘\Qå²Î¢ˆŽÔÊ‹•Ó;º¹XÆâ4&66̨ò¦ã@�‰½5b!–Ù¦L¤zÀÝ�ŠÀÄ!•,¤Á4‹ZrƒNËlK¾ü,¸¸ V8·¿ðöüQðŒ{X•u†¹š„Í~H$yg¯W»µ�‘k0QcÖ<" 2óÇìÏ\xsÙl ªJ3±Í€2qõޱtsàU­Ë<ÍæÞ’Rªt•1@J™Ã`vŒnyŽ1CŠë¢5†`¬Lçžt§6ðÆ÷{Ô!¡pÛ ‚†LÞpŠ}½~×<[úcnÖRWpÁXÈ!At &̾ø^ò‚’© Áäù�Õ¨‹Y4‚ÇVp@èñÎFã²Î0‘Aq‚3G³‘zjù¯+.Ö3×"¬bg,ŠW´g_­Nhi¬T´Jå<ïɬ3Ö4óc³> ï{©<9î‡ÌCîëï¯Ë¿šÎÌ;BƯsî8Ž\«§Û¯H‰ñì™Îï¾Õ ­ºmiLš}<ëÎQmÉ•5£ nC«q´.¾6F9˜&«©¸ðßšâýaœðß7ldD<>¬G�L}h¯YB{©xìXsh«j÷6_7Cœº•}¤Ä¶F´9³÷¾G‘ gCÚØkÒn’�(_ôÃCÜ0œ¼ ›OÍ çÐ=¬�Ñûˆn`XígÞ!.W93ííkë êp„ègçih`zä#Xƒ=’“Ì ÜŠD�Eƒý| ŸNÉË¿�͆ˆî¿bÊóVºÊu|¬@’³Æ'þ\çz±ßöwÎsm+–Øñ, v6yÚ.vˆÌ[¤,+"ù‹.k“å.;«uÉÞë ŽâÖ|^OYÞ„’׺^\T5UΆϪ‰Î¤0ƒRÇa;tó0x{XÅî"NÁwØÐÒ$ª r®i,Rz›+é­‰jP98i`<¥M“D^±C¼N ¡Ûâ«Ù­çÔ‘áÞÖ‡®_ ö±RÑÓ =� ¢_t©ÒáoÛHÉ_ߟÅçÎù´äÛߎêévÛ%0š®ç˜ûB¸nwg,¨Âû3³ ¯­-°8æ×*Ú¦Kz×:Ó;™µá!ú{Ž%qaÌp ¬Lí>˜eÆÛ1»ž§ÉŠÜ—³Ôäø”]Û.Ža­î¬ð`G¹¥z¿ª3!Zî-h½¶‚ÉŒz{-‘[Ï5ƒC!u íƒZ?•+Ö¤rZ%B“U}-h÷xD£$;‘•Î5 ‘á½UÇüÛoΊKlïÍ/% i*×ëÐ Ûʯí8ø¬DEb`%½¹0æ-�Ki‰ö¯%"ÖÄå%¥«Ÿx�§øx…ÜÆ~lëϦ¬ÿ}Õ{¡ÌÆdüw²¡SÙú»[ å0ÚòÂÕö wÃÕ-eÃã#eÀâIßEöñZÀ�Rs)ÃsN,Œ6ùêñn�:ÓÔ]G�¼xÖ%†Îà×1.ØmÈ­¡ç9x7îADËèB™>‰m(w»^Žõ±ìapVñ9ÉC¹Ã3G/9qˆ½'¯>ëç¬øÞ�Öގ¼$xºóGŒ×&zÎs,oFä§x%Jwžç(sPEx[f5[йÈÅ5w‡r�pA Øû}Ìì”mÒ&µÂÁÔ!°M¾ó:¢5ѧˆ°ßíìákJï§ŸaâägÂ!†ñ!ÐÛlºm“†(ëœuÎ�âúñ@ô!WšÒ¼brÝl¦¬Ì;¢ͦ¯3¨FÈd‘ÌŠÝrE‰†;Ÿ|Ð÷òw+Ú$t¶c&‚€{ì_ŠÖ¶ÙÀÙ´ÈOPÀ Ê×[pÛÂ�˜êE€ pU%ß^Ä,X vcÍów�¦/˜sˆ6þƒB‡ÕS·†‹€;ĉÚëÿ1Y3«§w©MõÇ9DÂW`Ʊ¾ôÝÒŒîÛ±’� kt€¹áót f>ãNŽÕ|ºOÜͼz´ç¨”jéAò¥®²“6r„U¼„‰/ÆõéÒeܽ÷úÝmMÄm†¸Q,ãï�¡¹-ì��0^a±Gè"8(ü¤Z,™®É|Ø(�_ÍÍ—ÎÍñÜa"Ô±öö�‰OÍìù�޹ 6½\&‘íK„ç›´iŒCù«Óeç°?úz« v­eõkÙÙŒZ>{Û áèÌåGHȤÅ9#`ó9Ð$XíY4]PuTcm±¶òrL#c~){YQœ2à‡·Ö/ÇrRïÑ÷»,⬟K€ÍØ·dð¢äy+>ù:kU ‡Xè¥ßq·;\\C½Ð[mlQ��˜c,Õ•˜*Ã]£‡œL·‘ƒNi€Ê0&†.l6Æp³è‚e-Ê62íÁ<Ò󣺲®†C[Ckv0#N<ñUi3òY ö²ÚmöÊ¿œywà�\•ð†Î®,nHA¿ÉÊ7 ¸î€êhAëEâÈ\Id¤�°‰n½ó7( Äó¿]Û5Ó–¸@¬EÈû�Lû®ð…þ‡c³ï¶äë$ÂçìÚÀÈ=®çð0 dMdôÛ‰Ó6âu¶›•Mɇªò 5‹‡„¾Ç� -�~�1P.—_©€; ôîV>Ÿ3$Ÿæ;; yÁâ~fØÄQ ©Ü1bÛòþë°¥€µqÖ­ÛIÁr"=’¨Ò‘q‘WÞg�6<ÜÇO¨ð,KŒE  žZáÁ¹CíÄ®�çÒû3Ç�ÙöIg—Âf$ÏëH_~£Crîš °;­°B£#¯BgçI3¨|bþù8Ö×Ñ,ÄAçXvç=Œãåà´<øÓÕV+höñîܬ¥æ _Ï…4z½…w¯ PÍòë]ï…–·.ï×”i„iÆîÃ"ºìuÔ£}FÛKnÆ™TI”ÐíÇhh IkÁÛP0õÛZo[޳|Ý‚ë°æßÅàÐÙxx¹µˆˆêèÃ…l®þµ‹}ÖwÙ@–á‹�Ù £âãÀ9ÃÄÀBéG°ëEJ-wµŠÃ^¥±¶ža®�”d®$QÁ ÜÓ…qÞæ÷ ½¼6K”†òpæ”Ì É1[Á=t”E[ØxE?73ÐTQŽèZs¯–ÍÔ2l¯BÃÁÍ´ãÖ"ÓЀUÆCâ1‰ žr;! 1Eƒç¹u¥M¶È¡8Ö�ÐÓ]m«µµ Þþ~5.’@‚Ö¶²Ÿ'Î.öª¼/UxyiÁ(ÖŽ�Ò<(ý/‰ÁÑŠ/¹H“‡Î©³&¬eh˜!ÑŸè7Ï¢†÷ÑûÔ²L%‡¤5ኘðí¿IòVo†.¤�^<Ÿ"�É‹ -UøÌ"-+œõ­álxvØ“*2Ä»$Ç4ÓÓ’î_¯Ä‡á攨­%Q­¢Ï-¾öYˆÕÈ@h“á¸÷ö£¯^®ƒi¯²&!CÏéÇR;QÛdÔO`²×±[{=jìØÛV°ÑâŒ3s¸^Ó«Ù‚r°[SÈDÑUt°—,nBóUËÎT€Àk Ÿ'„óÁj™ä!áú…„s¬N¢‚Ï�¦$Ð¥jU‡ÓR$¾¤Ó3÷?¶ê÷Ù÷GòlÝ©é5+9E"p©Sòbo$×À"�šçS~hù}Än²[©'Î.zÞ$ëøz¯-ûZîø| a´¿ çØ;HDáZŠ‹‚,Û´!Àã»cæs˜¹`U!�¥‚G–d §¢HÂÐb/µ¤2!b+g麠Ðße¹–°¶�¤ÒPQRy2’Á${î6ÐT$UÊÓLŠSZG@Æë²zWWŽ“Åašç«\ °IÒQ?Ç̢ъ¿$¬ØÔç‰`傪=_xÉ¥�lúÆuàL¿ÄÒ‹úÉOÏû¨ìåÁ!p‹5ZAëy8F(¸jƒ€)¾»´˜¸ýØ2?z°ßŸh%‡É™�\sëd¶¹þ &7Ϥɼ&ÄÆÎÚ[Œoê$ ~²òú€Š.Ýο‡–Ãᛥ·Ÿb ýo�–à7dÀ¿õÃü~²ý/è|ÁæÏZS yÛà/C:çÏÇþ–“ 7ÕJÂy&°�éûÁ§]ü¯Ÿ\¿n”šúbmDV,ó«U¿ÆøÖÃæñ…k¯)ÐöV3øÖ�é;õ[5–Þ9:îGâFØó–R/ü‹tî¸ó§î�|à|ê`¸@ÒLî:�÷{¸¢â!pÇ*Và"WdŒ¸JRVÚH°–ÀUû{V†ÔÌÈËœæËU�åH�›×½Ö<õÉ…OÛÕø^IýÁ I›SwתöG‡ðö_QÒ,'é6TW”¿#•èµsŽz¾6öJ¨Oõ°_ð¾÷¦�är•k»Úƒ¨NYp>òM @“´ì`-ÁcéÑòGdlozºØŽÐÔ®^`,+¾WV¥4föXŠñÌHôÞEè ÉvØ�›ë¤5Ÿ4Ê„g�ñªfÙdMQ(€©Vç\senìyûOï•q²6ù¬1½•Ê^éÕ÷Eê�Wñµa‡B ì5–.ê]FŠS,(°cf�ü¶Š«¡‰OQ…– {Ž2c6YJkb‚æÌ“ ‹`su?I sµ«øpjÂ÷œ|+@’Ä{o8${÷¿²WÑrP²dúý»J茣ЩUùßÈ[n¼'¦èÞ‚ììŒAºX0ü¢Íïˆð�I‹UQÊ=n]HÊ/ïwÏn˜-ëDe­5ó¦’]ßìú*MÎ0§ßsóɾ7ã½ù2Þ™¾h>Bv^´ˆZ§Œåw–\ÈÚhÁDÿ¶¯¸éÊÄ.¿ -õ�ݽ jÂ_“iÒ¥…¼+à“Áå¼7+AÇTOl€�®0[óOª �`‰DS¥R¸jøå­~¶=¨Øõ@ë%V2›\{AF‹Öu$FÃýÇ?ÎÖê›�K9åȇu`gbmÅìÄË{h­tA±¾ ð {LÒhÈȾÖ7zM6Å9`8¤ ݆\Îxbxq�¡Ž¤wöúä-¸;Í’ö"- ꈄ|švKYòr<z¯Õ]�–$ÿЫ¹E/î±vjù-’°“ŽPñ:8ðãÙ¾•Ö–sïÈœF;ðGÑÊGÄÄï„5øì4ž¦ùH\ä¼;ƒ=Å®ê€[¼ÞßP@ÊdžQK„|;ôyö<Ù>2§+²˜´¸ˆÞƒ�LîcsÏ]ùïf7š$‚~?ŽåAH¥ÖeÇPoÏ{¸ØÑ¶!ƒd&�^AebLÝís* =Ì“ ½Ân °œ& 6’3dÜ� [Œ.i`(Qÿ"Ö°Ö³é×íåËÅY³^S @'eÎû÷ß$Kùº¸Öíæ9þ.{çÏçÔñ,ºå,žA7™«»C€�–Ï�ÆcÝW~å­"›àÆÙ7³ÁÙ‰�s‹b*Mž¦]äáã| ø}(ŠK™A -«vcË¥ò?Y<ᇱZÅc7åD�8©œc”F–g'Ûdµ)äwйڨ٧“©òÇ¥ç–Ü Ï-Íežîn/j‘ Ü—*}il+Ø‚¾mÍ �š­/Ì¿A€ oÚM —_f^Md…{ qÀÆ,þéuÏEÖFn9‡KvÀ>Ÿx+«°’$A¿‘C „’~nùú³£•2CD0·¶íœ[¯§~e ém6C! L-Ï‚™/‚¨ñ [Ìs=¡­òèÈêü¦’“XRÿ¾r™ó¹ñ‘ ê2¶ èô ‰ÜA�\à€2Êïל±àlà'¢°¸ûâÏãÍ1·H_{eÛ°�RÏÜÀ ºDCÔL.h‚­ºÊ-mÔyvñ2ã0B·O)Íô¨^À?¬È›J¬-¬ƒÊs�>¿À–Ü­’Ç ¸ÃŒyMΣ¤‚Ðe�YõÌȳæšãígÆšX�… a>z‚±À· (½áæŒuANç·j8@�•k†€ãÁ²äs!˜WÎÍYOs4R—CSÆó�o<Únû0’·æÛµŒy“J¼øg/b€bïøf£µF©÷Ðæ¢And v»ÃLÖÒ¸Sư¨‰æGØR¿ÑÑŒ¼�F¯vMµâBÝ/ô2Anë[Ò™c™1C%�A÷:2Y[œ2ÔAà T,4-A+¨Nœ“—¬-|öz„ëpBãÇæG)OwƒÎNFæáê×ook_éJ‚kjüH÷�ÀÂæýbIeœï'7«8q – în0I¹ßš)@ñ^;1½Ka“£^-â[èó#6 F4<½ ËÈKyŸ]ÎÂ]9Èñ.à²[¬^±iÞ[뮆! ça%:‘ŸL³¾ªÊÀw. WÆgˆNÊJºMu†Ðq-Ëí5 ‹‚Êá÷Ù!·%чFhq5€aÕ"˜I±5©\›T)XwR¥KßùÎv_þÍïï䢹ԭnõMŸïJî[ä­ïì´b÷ÆŸlÇŒü«*Zaá· †«ÄäÄ]¼ïM�—¹|»?™Þ�G.‡3‡BtZ ý8¾ .E· ¬9´î~½�¦Erí‚a=CÕ�#VeÅÁÙc.«yžá-éHöB[ ­;\ý!7ë²À‹=rÉDÂT^sQz )@…\û ן÷Zùì:§ à?ìÃú:¡ü åð€ÒŒïüßþ ‘pÈïéO.Æ_æƒ €8®hÓŸY‘ô½bÐ�ûù�îíÞ¦§åpÑÀïtÛ¿>ßwTÆŠOœ-¿ó/øCl^„Évýÿ˜UõïýÅ—TSÄVjyû‡–p»Œ•À’~y‡¨’ *ŸË/R“JböÒàŠ ¢r|Ã`¡‰�†,°45³}£™%%‘RVŽSH¾xŒV…[dŠD¯çö)ë®%¹µ×>«Â:i…˜abRcÒÜëŠnÿÅìÇë?¤Ã IÑÌòùê>]ëÅ?ïT�”e®L9Ì"$H–ÂcÊR£-^<_#+«‰¿aä·­E)©¤,ScÎ(#æ\Ólê´DoŒ¹éB1¤`8Ë­gÿ5¾ Å +�5F¹K ¶ËÇ­žsd×.=M9+ž6ç�3l¾`§å�Ë:çƒ$”ÕXn|:´„éiç·w«Í÷µ©Ëã{ãS;lP Y|\–e,Ù ¬Û˜h5fŠBñİ’g×ÎÜ^²Á6)ažu‚d¸˜©’¯q­¡¦Dm=2+×QPñ¥O ]]¶Ëw"y<÷ïRlýºJøwÁí"=Û‰{¡¬ÓPcH<ÓUzºH‚tt“½6žé‹ª�õk N Ù4Æ4H6|ç3äë$ræ™ßÙZÍ •¹Ã°\##t]1�dÏN1s‘ÛN#m†øÅÍÕ²#ìÒŽK¾4®ñ³7ç“LfXÊ_‹¬AIÇlƒˆfz¾ÆÆiÉÉ!q|R¥:IðtäE7˜‘J0q9ÉŸwWWßàÙÝAÏÁˆ¦ØZub…H|ÎÈ$Ø`€òZѽyI$¶G6º×=ûŽˆí´U�ïüëÍ‹mì �z¿ozÓã"«ûÆþÏdnuÎÐû+ãåý�EÞ¯VãøÏ§Ì}.ÊŒ ;ýh1—A<±ô u&±­¤\±7"ÑÅýÌdÖ©ŠÝ‚»9"bÖ£½[ú•$Lþ!ÚTÞ×NO}ØÉõé¤<íßWˆÄl®L0¿êë«+öVÈyW¥ží+§Ñ‚ÎV&)Bcz°ù½“bƒ7ÍÌÂPKuvÿ6Ó½‚…¶·±[�gÀÎÛ:' Ä x-óEx�^„Ž•«@Œ× >ÌïRå³wµ…}Г¢w�·º¹âé~öÝ|nŽ;—4²¬ùÇ{^?mýÅRô¶æ/¾Â üTž™…­õˆ‡Ô®?7ïÐ=ÞŒ%Çx¸àËïÀP(þÍüyEÖuÿk2ŒÛ}s<É#ǺÁh‰Ý᜶Íà0´£[ÈnYð·]-ÑX6WÍŸfuŸ—Ìy¡A#e¼±0lᯑQP`]ˆ³Ôç+³õòIÍçxAþÿÍD�ÑïšÀ ó*�«l0ô 3–ìÄ›SOºíünKæ«:ÃJC_àè ˜ñb¹ƒ«áp ÒÚ".�ÉÃU&D?�ô¢Ôª X—zÃà|š±s¯ÒCSXð„~_ßkÀFöV.8¼?>ÊY¸‚¶ãw1á>0g·Ù}ñC§¶Û=•ÑŽØíËÌå¬Î,f�²lgÇÍÅÖõg̪Ö’Ǫ-(ƒÖØý+j%×ßÅåYÉ7m.Ô\ñòà„“„ºýë˹²ÆjW± ƒ~8-›tþ'ŸM°Ñ÷u¬§PTÈÞ„{Z9eò ζغKH?34U¨âÈɢnCìHÝŒ™bÖ±7 ÓÜ9�F�c±ÈNl§m—×–ÈvŠÚJòòB³ÞY} °¶ub�© èìÕµƒØkÌQx9íÄ`®—¾MýŽ)ì²â·”æ}€:!ì„ý”ÃÓRÑtæoƒ%ÐG[XÀ(dž<²×b¬Áo�´OmVQèf•]Î?]-oT7¹Ùz”Mž-Ž T=ôSñItàˆo–Jì9«PÄ8–¥ ú£ç¶2Á�U±Ëz¶°uð´¹â�,U›I­k¢ÁØú´G%^ů�ÄuF™£×aññ›Á*ÙQ˜Ûà϶I›.Í]'‹q¦ |5Ôu“�ãË¿ˆì+Þµt®]®Ìà.3ï\Îæ%5 ü‡µûýÓ0pÊÊ>•×Þ\ä£Áê¹[‘0‚vÞû‚â·sl¤wÕ²peÆdñÁåb†�},wveØb¶Á L¶Â@Åáº|lŒ)°¡Ña7‹,Sç—ÙÉRï‚{Yç×͘±'=Ö.ž\V�É5Ë®Soí½-ókiªSœŽKÚº×O¾t‚ ¼¤ÅÜÁuxÄÍÍl£ÖêÜ€ ;·';ƒÕìátBMô´’„™ ‡LÎ1ô”4¿ØmÂoŸ~®8›à­ŽÀÉj]ÔFOLí½@Úk’Î) ên‡}ÿ\:dM *1é éètA€(Î-¸Ê7ù�ë=س/©³£ôpвË$Ój)·�wäŒdâ²µ¹zOjòDfÙ•KïéÝq±~Œ{’x¢zd¡x ùt]Ç4úN®c7bÛ¡#ëX$ªÑséñË%éTœø9²´Cx�½¯x79 eiÑž<3ô=Æ2�”Nµ«³4BïUV$]öÛY¶HŠÍFZ<­ÐèÅЉB�J…éÆÎ1&;ê…¾žŒLÈK @×'ÍÞýÇv`­²2[²ïNú"}r}g²Œcœ.XÇhA~›è5Þ³¤Ç—ºVF=↎ƒÇ}Ñ-ÞpONtzÒ±j�÷ÅÞEAˆ#£Ñf2£”3’oVøàή9ÏcnDzÓ_›3†ORÃYnLJ>åïš ‹("H+,*¹]ƒØ¼ê“…·�Ò??ռȸðG[^62B Ã1‡EÄÝÆ‹Œoîoöq;ä‹û©ÅÃ\ˆ»ÃäÏØÙYÚC¦)©moé ‘�æú±kÿ´)O¦K£"Ænó¥4ÛŸia€0}TRðø<á À.šÜ3²i«lê'þÇr+ Rº!Ì6ø²,Ö4Ví'c ö¥Jå†9c\²ïUùÖî_ Š(Ù? )ñËú÷¨ÀQôµ¿󛉴‘g½eç«÷ ŽÐÓÕr×Ç¡-îÞl²Ý¼ãê”+ ÁŽX…yfOÁ¨'®o›—ÓŽT±8¼‡µhƒ¡Ïw¦Au?u ”%"¹ì”)Kr­�YB“sœgÚE1ûš…`Öß±ö/xw#q»T 4±rqŸÂ–ÎxA/•gv.p�5t"Ñ M‘ßF1ÕþŸ”¼`†ÃÙÄ{�§v(-ì‚ǃ¹xÅÅ(ƒóò�läD¥Ú$RÆ\F¿XN»c§kroßÉUÆð€²¾|½ü8œkfý;y fáL×�XÚˆi�{æ¹D½‡¡|ÚJˆ�@°Î}(‘$èÇ›ž¿&ÅÉXá…÷�+ÚùýÍè%ÓâcŸ9ï®{!QãWcÞ8‹>xùöŸ¸©¹v×6ñÁû’}gsÂÛÔÆHÔTQéÔ£ZÛc�}í»`?ÖÎñÄù¥ÞF^F¦ s7&[ï€F¦EˆXh¾Á�tb ÊÿP¾ êúGó­yÎwÉî�;UQ;Âëð*É�€û€ "+Mü7|QÆ t�{[²›C�5q›ñ@-j@Ö�¢úqûjM±·&qCŽJœÂOš‹õ€s%¶§¬²ˆìUpª”ÒQ·ˆŠ¢¥‘1³Ü:ßž&Œ)U ÌÙ°ùŸÃ¨\Áÿ¯ÚEŠ¿Ã€•W†’rö%ɨø?‚.p1ñÀ#¦à[Ê}ϸ Àì$ŽBª�’jGŠ­`æo÷ Æ½˜°‚ß8ººšéƒÅÁ¨¢Õç"’ îxJ®�Æ ¡,ä~ ã}I ¯S–Sæ¦I@E**´”šÈ*xðË0Èx1�- ŠÐr”#4^rk­Qao­Á… ÑíW¤˜¤ëfW)d§õ‘QQ´5Â\xˆÕ p†Æ oÌ[¬–^†!S£íar"æƒêum™ÕÌiä¯�—¶%žî3Åäù‹à—˜C¥çÒ†{þ¸Vc¸-™—M|VM´˜´´÷„Ýe(R‚“±˦„(XE4†JÎÑÈÚjR“jCðÓÑäÒÓ«%ìÁv'7 +÷02/ä¢~ÐÇí²¯Ë™WÁ ,î\úboÁ�³ÿ¬G¡eEXRÝÑÝðå-Ä RnOÌÀ²Åg´Ø´Ó€=.F2t»n�Ñgg8~‡µÓùTsýg‰¯;mµzÆJ9äêþ5c>T[7¬ hâ•S~@´+ nƒ_4RµµS˜íÿ¾[¼x\ÇÈ�ñb™Fk\D†Õ AC«ŸZØË}¨Ô²–õ²ëÒ.o*‘‡nO$ãË2PW{õRv�qõáÊ÷ΟTœ6t<ÕßÁ—Î;ÚÈ› ꩨV&�îfÖ‚°ü¸È üØJì�\Û„á�toW|–‰0'â#3„“áP^”ðíÒpwcÈ6‰O‹‡äV·¢ÌCPkp[YÓƒ™¿o¢­]—¼#¶[ÍéµéêQ—A [×ÓR “sÇt]·zÙ}Ÿe‹ð¥;Œ?’÷Íðn]X"cp¸ ’y\y¼IbnìCO�›åƒÈoôPM½Í+V g*fGË®õÏUCBC¤4=ôáŸAήJXÚ¶ÕÄæÿó'~~GP@6øý?ϸ½¸g×÷ˆÊm#s'ã4Ò){ÿ€ ד0Û5'“×øÕWÔ{G/ÓÌþûwǸæH¾„MQé’üŸ¬ >e¼¦‘¯ùü|Ì×ÎB$¨ògÞU?†¾~b~#Òø÷ÈW¯6{+Xé¤ff'Óª¾åQP'[øÏÏs©½Ô"Á¸)Â"œ‚ðåAÆ#u+ÐE´,@æ€vÄV'‹ Ú)ˆµÂ\G aLKO¶ø’´+<‚Š×k]©î*2 ý§ù"Æn‹&Ê Ÿ£Pä0p­•lÜ´Ü92ŒÜ,€Ø½pÎ3»E#5&PÇ à±6R‘xB‹ƒ�·’ø B"3ÿQóÂ…©g�6³„m˜{ë¦w–DNNòM¦ô¾‘p3Ca޲à툵F-"–÷RTˆ€ T„ponÏsmr|^æÐ‚�±�ƒHTk–Pjºv“›ÏÎ[ãÇ%4Êšc^ì�fe4 °‡ ¡5)*BPL$b€-éÁ2zQ½x¦Ô¯ÔX²Àê@ycÍõï+é’çÐËzÉñªF[eqú*‹ÁÈ©úÖa„iì©ë§¬ÑúQtÎèÇkß D{!üE®„”bÿ¹ù¦)Jç£:žTZxCÐÔòÆ´Ù¿< ȇìôWÕPX‘5y¢ýÞOéösô»Wµ}Œ{ÙR¬>â¨_ò©O^¾oÉBŠcÜQ¬ažá<Œ�S²ñ>¤—M@µ£â·±¹þñIƒ½ ž^7GNùœ®¿ci¼¨ÿ�ÐÕôP‡£Wg*&¯)qÜe/w£JŠeˆÎP4*²ÕB;×[xL"¦xèì[ÿjU€…ž$ËV3ÇËŸÌVË,tÜ'¦Aˆ–Âqm�àºz™¨Êî¦ZœãS•ÏŒÓFÊTFœTºëh�vœ¹÷yF™<èHá±F»ÉÊ÷Oš�sÍ"_=c“Õ“~žÙ· “XCÀÜPåIñ‰`ùõý˜�mq�Ñ�ñzüM_yAˆ’FÉ\é4a.œD¤T\èb{ˆ‹ßÉÆã$åÎ)ÌHd,ÕN¸‰ÓÓæù4î)ÐÚ Ë¬ÇÕ:\Ç ñ|¡õ]pBk÷'`SG7†»Ï¯ì.Í€·? Bç ™¿™$xT¯!4/�Ý�ÍâýÝhlãC¼õ±DaÆ<64s“g„5Æõs›Ï×/�\ôÒÂõ“¢ês„wãìæêf4k³B7:™H5nÎæéuÞá°c(S¦l’iÓu¢ÁÞ…ÅêvÍ®õÔfnê|<öû¥+¿˜6>æ!ÊùíéÍNUQH�“WÛD]“e�•ÓT»Øt7EÒ¥Ð?t–ô}\iøx! M˜ÉÞ¨.Rc¥* U‡dB"Ä*!2.ÙŽ N:žMùvÁ„sDì º‚ÉÃI¼÷Mœm×$Gš»’¼-©G¼Â½ÏÎró¢Ñ2¤+ë¶½@ºm/ɺ0™Ø”ÑÆoÊA|nO²I¬­N†+Œ…�C<¾UtØÃŒCƒÏ†]¦öè†S}P^óàßœd+~ÞÄsÅ÷L1´:ƒ¤Y£èÄt]¡úaÃc(ðUîìîïPþôä™ÎV5zT ŠžæF*æžî¾�ò¶îˆó7ã¡èˆÀCü2‡üêÜÿPXí ~ Œh`À_£†Œâ?ZÞì½8¾O5˜XCc÷ùŸ<ì’8O^×:´mKuwE—nz/�ÓÞš¼mdè@¥"Xœ&¦%ËJÈHÔÇÌQá蔫î�%JÉ„(m%  ¤vóñóÉïGÀé6¯^”Œ¿Ý3×y„!¶3Eï§çÜúçÑŒ�hýèˆJŸ^|ï.ÿwPÁ%ûqŠŸÏôøþcâ2hòZ´C==Nãæ¹¼Býűe�„d”/ùjeœÒ›þR´ïÎpé–œôÅÆø 4;Þ·Ú1Þ×,lªÈIx%¢;?Qø‘qEzñ„X«h‚Ñ•y+8þõ>c�­õü°·Ï=Ï$k‚°޽+LÚ³ÔîxYc0C0:ÀåÄþŸ7Ò.— ÈnPI•¸"yIÍHš3<ùð|)ÕÛ7“àÀÒ$<&n†ñ ß…R�ØJÛ™‚ H¡ƒî>æÇ´ApÇT2ÐB·_ŽÖíÞxÖÛðéVõá²�!©™¨HƟǧB]§²·¼Â–vÖþ"³ç@ Ý1�XS¡*Ä@­þ«9éüýŸ‹½Ê»±<ØBöÞòÝÝà ?»¿5pXcz[5œÖÉÏZĉü{ï¸øÎ÷çÌ(¸·bcCÂÆBTSI{¡»mß4~¦¹þ±“Ïm¥¶b1Ù þ{(2('-/?—ûõüaßLêC×¶‹z0Ý[K/¦éŽãðHèg4ž‡¦?³ðÙ‚Æ<9BJ>2—[?âNÀÈËmƯ•ƒR†�£S ¿kÖ CM$‹Ûù”‹Œ?Ç;œ$‚À~C@Nt‚}ñSt¶¶?Ë µ€üÓb¹}<`ÝGW4‚Qø}¥.¬ÕÏÓ@/»”Àn“³w"µö¿måî>‘œ;ý(*,z·;™/q¥àT[-ŲM$h€X~+&ô³ô»¿dŸŠA|®¿1/{QÚ��•Â×’)ØŠrŠÕbò|àê¹Ó¹È�,>î®�¬5‚Üm°K·‚ÝÀ¨x=ñGÄ€ˆÈÆû|0"ÅhrÒœWábË ¨Îs†(‘®AäÆJ xŽAvtI\1m*Uº3ÙòÉŽ¯E¤p ÙÅ‹]Â7 ²Uï½A„f%8©ïžòÂHxÈ%*ø)êè Ôþ†êÖx౬¹Y³�,¶Ipè“r’=8å~;¶¯¸×òJ"اÀÀ A¢ˆ(¼åg ~–d¿)¿—é z•Æ ¹·��õ�‹ö™¸É‚7?}m*úËö…ÿH�)ØP¯™à˜,7ÓãØñ$dfÿºÍç9¾fãmà #+¦66%š Ôx3ë®ï¾íˆQ,!Ü®CþE†hd ؆Ëù¼¦ù/ˆ tO? ~OÔsäçKm]²ªÈÛ¹ý”Ê7!„XðeÏO‹ç,ºbg0 O9º¥s¹·#ü¹ï:Èõ‡z»ï„Ô,ƒýᵬŒ�Ë·.=µ 7O)§ôÚÖÞ™¨‰Ü:²T l�¥kŽ”d:ÐÙWX´—O7¸OÀOX{š*;£ƒWl§}T.XÇ/íÛ$FyZ/>Ú\ë@“ú4mõ–náÚ+¢'<@B/5®òÒ>Tíu0¢ÆãÒ¸žù|\ {ªNeÂûƒÏÏ_ù8�Ö X¬�»Óz¾gï…©ç·á�i�8 GÝcœ Ñ€ÜÁ)œ)uxê¡HRÑÖeonØ;ë@ÚÃ{2”¤Cm>7t‚i·*D�®f€D:þÏ¢š3 Š%‰"º •º”‡=ïÅVWnÍy1ñp�QpŒŽ’¿w¾_œA¢‘M1ÿ+åÑ^|åP´9ꜳÙ7X`ÓÏÈ›»Þv'ß©þÌm•ý£Éбi#Èô ÓÄ"ä´U¾±ºPÀþ ?L<»÷¦�«`¥ðÑéþ½ú–MRýö”/ó_¯¾÷°ˆúp®mé>ÿ$%·²�“/@u‰¼PŠˆ?>›¤?Ÿd¶!vî¨bŸLŒuy�k7‚Ü"T�Õ˜~k¢^x”z-šº¡r!vaÇuÑ@³ÜÍ_ Jð��ßòËÜ´Øq’‚`nç°~¢CȯüÅd™Mecá�@›xùÁ[ÿÀÿÿÿÁ…õ|ø/ŠJÚ‹l‚±(PèiÐj� 1UJª*¥! P `¾¸‚ž” €Ðd¡À ÚŠ(B€±­žØÀÒ€­STƒB´ÕN!Öš(:8r¦µA€*�@€gϸ={¡£G§•…(€Phóª|�¨=<$$P�Ú‡lt#&tÑÓ C +mVÍ5ÉB›m¶¹Ðxxê‘BÙ¢€Ð1Ó5 ¦€AT   PR¶@²@n`7ÌÐ^À(–†� `%m€TÐ{±Ì‚ÀjLPä…(µÐ¶Š€EP =W¸nÀ@:h£@ hz<àÁ@[5[DÔD‘oc”($ Iv,mÐê¶Ð†E *” P”À,Jœ�“»ªP …]EÝ�BëP m�£V®çR%»®vdá (F€È Q ) ˜£c$PvÔ t4: °hP ¤=ÃÑOz $†€B€*PÉÓ§@n¤ÔL,ô€À%`’³ÝÉ­ÑŠ‚-(Ì L €J(€ L„”IFSi@Ôñ4¤I¢F€SÄ‚hˆ¦ÈIC# =R”¨`F ‘@@MM¡ê�z3ûÿŸýšßR¿¿ûÿä‰?òTR6Ÿül(ÔIhHŸäMˆ£BH@�±Bø#mo£È·±ÝvS®×dÚîÜŽm¹0LæŒî‹EÜAÔ»ªêVrí@å;¹®f`—#v¹u#¥Õu×¹¥5ÝɦéÉÍÌÇv̧VíKwnDHI2K3ww9as¹F×*»¸†Á–4XHÐI”`’®ë¦)ØÙuÊCa3Ö®ÜÇ\ºÒ’f× \¹»’ˆÝÕÖåJ]·Wk¥nî¸N««» Š‹tÜ·1ÝÚ+¦ÅÊ%×\«ªîºb¸»³·m™§n¥*é®™¦ÂÎ�™eÙ³¬íÒæÆÑ\e£IÊ»!Ä£%EÉÕÌÒÝ6ì²4›»§7uÆí Lî„é¸\®[¤Êá\­Ê뻥aÝ«¦¹³´wuÉÝÉ.îî²n»µsœŽ»·uÆæ®.â�ÕÊ�Ù‚�Êî»Æë»³·'7s®î¸ëœí‚æÇ7]Öì�ˆuÅ ¹®´É—s©×¹Ó�ÙsNë;“n×]«¢šîFäi®Žu¸4âìn®ì—tí«‘u;µÍݹÝ\…3RºC·equÓ5ݧ]FÜ7\ÜܺÒÒG6îkœäå:®ÍwqCk•ÝÔQj®—:&]wmË\ÝÛ«•Å6TÕÎÔ¤¡jQ·s®bë�t+-Ýr L+¦êrîçg]‘»µÖ�t»«nq™ÅÁ]Ýbî·ns®]\”'wk›±Î°šfwX®†Üí´°®íݺé±W;4•4î�Öë®e×EÒ¹»®Í×wW\\Zë¥E®eÊîk¨f¹bG9»º3¹Û®çiºìÇ8”\í2î·Iݺfk•˧%ÙÝ.ë¦Rtës»§]A4·uÚîÝ¥ÍʺíÖLH%6Œ a2ºîë®›¹ÕÚîÝ ÒerMÌ…w;]®ŽénI®&ÝÝs:wqŽK˜îî2¥ÎF•ͺu×$ÝÝ©  5-$¤¦¤g åÃD»º ¡4–îç9KM2M¹[²nuÌ]¹¹L65:ë¦K ‘·2î”Q4SQ–çZlÑ©¡ÍÊåÉ™„E)e2S;µÑaÊí»§\6ÝÙ]Y+tÅrÑ]Œl$U-›-Έ4Û–ºÒ»ª9”*JÆ‘1aE†2bÐFÜÕq#ÒØjwh×s]´ÊÌAIRÅ…[�f’QÝW4IwqTmw®FÕË´mÝ«¤Ë)B9Ô„ FŒTRjåu-!.q9¨å(¤¦ã«²5.E®2Ù©W]]¬D›wFÝMÈÂíÚs¦H(„*TXÅÎÒEM%)¥™©Mwk¨¡®íD—YΕk•\fÝÕÈÛšæšFR¹tÆÚ–»·iÝ·eÝ�»‚HPb Xî£u•ݺ-]Öè˕ҙ!ÒÚ»M ¡‹M–L×w6î줱-f+š»jKEDIDLw ‘·$¥‚„6rÝd°›†9¹s6Nê»6šåû¢-&TŒÄ—k“!-rí¹ºnëu…Î娨›*e…$c9»Fm+ºåÝ—k´Ñ3rºX3KI$İh&3[»Në †”l›×]’"EI¶4 ˜�ÑD6mˉ50“s¬¦bIΚgví\í–Fɲ—4�¹º¹¢Úí+—.mÙ²h³:î»®×uº5f#)t«™Î¬nmÉs„€VîÇ"R‘wv¦ììrìƒSwc’™»¨»›¨”šÒK›tIiÍÈD£.trîçW$É �ËréBƒ®åÝtÊ2šœ®#º»ssg5ÓJ¤Ò%ÎÊ ¤±™J7]n2åº �JMÝnX×a·L·K¨šë´ëƒs²]'nÎî³w[¤×76(¹[…Y9Ü»7:MaMrÎÜá»·E—]®Óºâ™r¹�Ç;­Ý»e®wtYÖ�v]ÕÐÝ(�c](ÅÝ]‚]5t®îšQ͹3ràK6 ™ šêÅ•6¹n˹ѫ²vêNîIËŒE1¢›—\¹¢¡-JåÍs\ÝrvºX¤i&Hb›wjê\Ü…nìíÕÝ«©¤”ní]–î¸ÕÊ�WRS»¦2–idÉ‹œÖîâÆçguÔ»n–e0̦eLˆ�Ý ™R„e—uÚ1‰ÝµÆi§+®îsnÝÚêiw)®îÕ,�&åuLË s£2¥.íÅËt×f×P¡Nî¨b�¥Ë:ºERî+¨»·s]ºì;»4Ó»¥*`�+‰;“eÓWfZ‹srhšE˕ήpÐMs[¢$ŒÄÔš±£vÍ’îŠu·)dî�ÒFwg\lšÍ®k’„åÙ˜e25C)œÅ;s-Óuݳ­×uÚî¹6ªªÕæµµ¦­µmeªµYZªÛ­UªÞk[ZVª¶óZÈF($!Ô Iú$! CB¶´¶µµkµjÚ¶[km­¼Ú­mKmmUöë[ZíªÖÕÛmjü`„€?kŸC'JšM-l)3DÞ—®ÊךM¨víwq‚µÐF×sIÚö-½Ã˜ÅÖªÁelÙZVÒõ^÷¼ü_4»(o®‹·bï-Á`†íM4S61é› ¥î»`Þî‘`{²F“W“vUÇréJ6Ô§–ê,ÐÒGyôÀF»Æ–ÃVÃÜîØºÕ,é]E]È»;µÕÉœ`û™£QK æØÛSèªë—X—•¥I­nužlç ,û…ØpÁm¤0>òÐWQªÁ�  ø\Åï­ Þ´¶¯$fš»Æo£ )°•ZôE�¡jö¹Œ}æ„ï$<ÅœÚ"¡(=Ò_:; êÎÍÙ™;M‘bû°,›xõvd½»Sµ«…ÐÞÒ.èk¡ÙJ�¹¼“5—½£¤Ý©]@ `é–®ñu�\ÙÊ—8èÁ2º^ô¢¤Ô%[êÓb8ù^±T.eëv (!“»Ë/Vâ#ˆÃM3qpÕÀÔ¦/¯½Ý³£г/NÓ´’CÜéXÆë)5¾7+Ý• ÓNÃcˆ�‰îd£…Uòí[Ò®I|½`=›Èœ{ë˜xo«$Uq«!gp¦HÚØíîÑ{¯c®‡:H-ÔŒ*÷(öeAd0»X£ºá«ªi¹6 ¨j¤ì!à÷uÙÄRêÒ%Ýk+Ž9ˆ[½Úé.Æœáu/•a¥WNQÈ…nùõué—"/�[ªeu;ØÇq7¹š4ÞU‹­�‰zùœ{f² —Ûs›º«9g•:¾Ú³N©œ 2w·B[;»5ÞÞ‰S˜¥“’†êæ9]º¡w3w 7i@^ðÅpZ˜Og…¥vjáÂÃÛ`žP"äfmíÐå³DE]zÃk-ÝR†•ÅzÅá)4 K4Õ-˜Å™ ¼˜7yÉo-@ôqC…÷f(¦Ü�x„.ñ:áµ9›¬^îšãÕ‘9¤$AǹpçoS=‘t«"ÝŽ síê›ÖuÖp‡ŽÞJìîØÖÛˆŽôÍo°­é™Ã™ªíf½w»½ÖV"èðæV:GrFñåYºB—¾jùõ]²r‹Üa"¬ìÊׇt+�˜�–»ç·3{FwÿÃüùGù«þÌäÁFšI‘ÿsOòS2*gñÁÿÅëCùÜp“š„;÷˜É·XE›X 9úMÍ&Š¡e¶ø¼Hz^¡@Ño†“ Á†Žÿ׎k×W;K)T_ ª�Ž7·‰<‘LJ\_4nG5ù•E4šÉ ÎDA%kÇu‹ò4q¨TÁ¥¶¥Æ©°`ÝI›˜àò3®y‘gŸöì‚YÊOÛD1Gf£ÓÅD $¤àtwÂìÄ«ì‡Änã {¤mq9ÔnÙ½¿ç󻬇µPˆŠ5ýïìú†Yƒü«Ù+èD$¡ší½ÏÃsyŠÓ…‘1GBŒžÔ²”SKzër849‡ÈÒ|èúŠ•%²²9"Ý”6Šâ,õV_•„6ïóB‹êU´ÿ_ d4Ègͨ0C¿ÃÌ$¯;q!-WS/{=[dÍ<Á_ø@€H$áÛí™ôûáG <˜Q£Õ:ÃLº0\7­žê‹7œŽèVŒÂ‘ó4вÚzˆsÉÃ9—ÁÈ¥ ¢_7—ͳ Éý}� ‡ðÿq¸Œþ?F‡Õ¶ª�Tˆ÷~²Bˆ#µR¨—üæÃòe˜líÁ�-‘HÇÖÅ×%™]¤©–x�×6+k M¾2‚c Íúh)™±1àÑMŒ9©Õ0º‡ûX«3 4ptDpî,Ì&·îldz6Ë+Ôã82âÈ6Xøbã’-Â!kä>Œ)ù>WNzJ#=9�‘\uN¤.Z‚ØçHô¦ûpb¤íMÐò©SÑLÿâºV½ dFÄ…×Y�€L­¥ÇßU<׬ïó.•-¯Ç¬ô ó&B_eQ³‡¢�Uåî°>²~³»ë«d…<êH-Š5—‚y!ð­1P×:xl5aÓýÉÞÌS7N¬Ç¼ iÖi‚ª½ù)yñÕ³‹’iúNÎÑ›î¿(Dµ‹+. 2jyˆŽ�rn·¥ø3¥È;Ýñ|Xp¦ÖNáE-%¢åj�Mš8ŠY•Þ�ÝÄžŽÚÐRÚK[÷õÍ %[èå†$e@˜¾î„VÛÇiAB´frGŒàŽvÁ-†XIE ˜��J`‘"›®.ÐŒúw¼â ¥ܤSº~D¡¯3¥£®Ç¥.r¢KÑ�íÒ@Ài_Fc3,FGä5q]±„“zˤřý»²ÌÝÙ¼¾;Û•jŒ5ACfˆF ù˜y»f¡îi¹4»nΙå÷õÜÌúºq„|GÌRþ;û¾¸pYd)6  Õ±äQ%’¡>òa©ià€ðt™¥Ùxs/D!-&cP ÓŠ$‹ 2K"b†ŽZ ø‘È"M­>¦ºPä+P[)¬}ýiɬ.s¨ƒDA@´ØÊõ®èE!Î�ñFþ*6y8´‘ñû)ÓŸeDs ˆEÂ5 U~uRl¤¥ä)) µI˜TœAÒD4~›%‚�CÆÚX _<¨{¬­DAd–Öå8Lûú‡=")Q@œîŒzCVH�qÙÌÏjH’-Ñ‚JêZTrY„¼ZëÚ˜ÒÂ\‘�œÛ§ä=¡Œƒ„ .•Wĉ-K+ ãËS#E Ê’a|A´ ?<]™ô™¨Á\xßr�ž;ˆ&ÉÅD%#†Ës‹b^$RáWnŒ´>r§â·#qˆ.XìøÙŒGe—ó¤òAꃉM&Ûnê0áPÚ‡g’M`Sb é…¤&X�sÌAxD£ %˜>;„ÂŒšÛ–`†/1A¨~{œò„Ú‹x¢.B¨N²mˆ,åKè¦M·Qèõ4¡š"Ä‚<Ò •8AƒˆÁ(Xs ›x[Hd‰a$¸+ˆzB4a®eÌ.ê"e0ܰ�H1¤‚‰D7†Ò#×—�…-Ê‚K’ B$o§ –$À(¦%3˱7ÄD¨ié¢Ê[, !"RÛeáY³#ržéƒä-vksó(Ž’žSò;÷Ín $qé³ptÓ$¬Õ0ƒÂl,ô˜‹AãF¨*bL‘I‰�3 S çßßÏgô*{üûøòŒP€XÐî ’©½f§Q1dóω¿%GêX�xEò¾µøzîBý7ÇíúÌ(Y²Ú& SÍÞÿ�KýŸ­Ï ûæ �»Üú¥m;•£ !Ï>£W[Œ‚—Þæ 0Bb ¸`í#KÇ7ˆa÷Ìl»2*çøB¾nþÆû•’'I<¢F›£ôB1Ñ‘j Zýõ4n}ºvä,ú† ß4áVà0â£øæ€Gvk¢îG¨î$‹Fɧ(ãtNI£ñ¡¥>¸ãY“¨r¢Wt¥É Ï¥Ù™#£Îx‘ ó¥P$†x!™‰Šâ»æ|<œ‘v5^8¢AÙ jP+2à(8t¥©0Qjxž}g<Êëç³$¾ Q˜Ò©ÍÔM{Ê/Šë¥Gv…§\Ry™½ ÄQC %u3Cå3‚nïÕS�g5›ƒÑÏRñì­Q•¿ÇJ„ ò©Iíû¯"Óßè„É�½ŸO¤ŽL8oiëQB¡Tu§ªc  ÄþÓÕutÍþ““êAþ®æ„}ý§I«|{_¢ 9.zˆÉ›ñä>N¶¥ñ*’©Afá1ÔhËœÌD—Ú«£å;‰Xô®�«^­.{œˆŽöªüdŠÚŽŠ?ñ<¡‘až\1Ú�Þùú±“|”Hq§TEM ž$î¾EN(,¥æóõR€X]8â“ì�¨mü‹ Öbb|Ž]Ê ©s® »;„w2ûŠ¡;þ³y�:B‘•“Â4,˜˜ÚÉlzvQî“›Ne„zY¾ä8@ûmùµ÷™åsŸFíNõæ¦@ß‘ˆ~»|EQO½æŽ}©‚‡¢Î‚F 7Ò˜¶‰eßÄÎÖùòrf̘0wê@yé¹õ¨°L“¤%ã³.  �Ñ Ûâ3#’%Á~(‡ˆp×1 EiD4ׯLwpQE1gÃ6ºh›T×h÷ÕÌÙ=�:\n6:V3”ä[ó.ÎÖMCÒêƒ ,|{yÜze@•Ãè¾y§À$L›…³<(²}=ÀøÆZ¥#ˆÃ nt~B פVÞØ d¨åŠˆd•‚–}º³帄ðBÊe“qG¯NØy*e·�ܦ|¥k#oÆÉL?3..úC(ø’ž\ÔŠ%/ˆáÅjwR>£/' g™}ìÀ6BXA%d-%ÙãžJˆMËÔÉK —J ÈÚ&(»e JÕªL_ò[~@Úe‘ߌó7¶¬ý?Qgs/¦urhÎBôÚ¶k÷v ’BéUXE<¯Ó·??U²ƒýnÈAB¡ÏÚÍÍR·ÁD·³ Ñû‰ÆMZ# C6ªˆ¿�å ‹ð£9 …™B TN»�âЖÕ5aÑ‘lW»�/8¼Šb‡c.åâJ±G¬]ÙõhÌ×Y›`Ú[lQPXèôw¥Tg0ü¹. îŸO» q{ì�WâVD튕”6ÎÑ%U{ù‚©k×GPÊKTºd¦iºà—cc/,ÃDfó4 Ø!OŠºJO‡¥,=%®£[VŽT'S./MŽºP³1ã'ø?«Gõø¨ïZÐÈPØ�—øZT2ôGáÉk:q¹F’àÁj¾‘”OêÑ¥––aE?á#‰º5™¦úZ¸º’ãáašsGª¯[Qˆ"[}?–>²–(ªë"Ô+Mãþd¨Ü ©/ ih2(Õ:½� óF 5�FºÂRpR*Ï©T£‡ÖC±Õx�XqXr‰¢) 5¨© ígñSœNI#ÑlÓ’6ýV²å¦0}ãí_×ﲉZ>>ª¢ �¸(¡<»V÷ ÐqëÕÜØÊ™b\¸ÒƒQdB2ÊUQ£ûªÚÙriU�¨b´õð‚°vK|�L<9Ð÷khLÐL!cƒQ\î2bîÁ0E‘- ÇöxÕfÊ[k•¤®ÍÇMzKm/Åá�…I4‡Í9òÛ�F�Êò›šá1“uó\v¥“ÑT9’ß ™I!S3 e¢Gªv¹í§@ýñb uˉŒ^ƒ¬YUz Î’Dʪažc�îéÍý<‚úð‡dR â ÜÝWAkýõí°´¶¹2ë²èBã7Gñ_ÎØ'r­`‚ˆ'ñ/ÍaünŠñÔ>"ñÉP&×v€ÕSË]ñ8`œBL È+nÜII$��ÄSÔ+5e`A „AõSQ”[D •e7b$_‡‡õÉ€�¥d™H0DsXa‘Øs2rm0S¨²!-Áf“d‚?º*&„=BJm$*H& ÈÕuSä€2zH�úé†~¹c˜X"ÊAzQŠSK“�" ž¡LîÕ@nÓ‘ÁÉÉÁ0YJ’ˆdD•¼ˆ‚IA•ÈûBK0QfÎÌ&ƒÔT·/“–À!·$1�Ë`$8iÓc)SïÔâ 4IÀ¥ÆxŠ5v!ã¥#“M[C² ("�ç0"È!"U  ˜&�-Aˆ]L(2Zs ˆ MžKƒ[A’R„À‚EÑÊ„J —BdoœjD˜o݇òUœ¿ ƒÂL„BZb ¤ D;Ò&Føa@0ZlÝ[KAGbÖbÚ$�D’Q9�ï)J �"KjA´ÞR&˜d16œf±ÃeC$9SÌÌÄñl4kË™8§I[ÙõÿBð¯éPG496��šh†G¢Èb ¼ !ˆ¦&>Û#ä2Ç£ôc�Ó6Iˆ€‡d–a#�Ÿ1§êu-‰8عkÂ4ûÄZªÜÌfæ!N‹_U ‡j£1F!aCÃÏ©p‚"HšXa0DÜK…†pˆiîƈ›†D2N>ˆ³Ä‰!‚’Â�™QEPC,à–XYs§n>RøBÅ,í¦‘‡¸t‰*d´ 0yJ ˜f!³ôPå‰Ò«^VÈrq¸u"Z@Daç¯" $Xï…³Š"yCŽ4̤©1úý‰þ?„š¸„ÿ¤Oùþ„Š‘JÕãû²åL™¨¬[¿ï9™Ñ‚˜:—kí¸mRS¼ê á�ouÐݬÄè§D©E]íbµ˜ÐÔÞIÕfô±¾ûýý1óå6¡²gùýTÊD%!;I5!±÷D<T°ÃA‰R'íæ”DÛ3:;ŸÃfk‚žo A„šn!�Jm"J–‹ilÀ-Dì¸!JE™,Ì)’”‚›ÌAtá£?Ík1P0“@’N\BV’Ba6Ú˜‚pƒÄ'û("1ÂEàá„cõçw8:8X³s1e‚“XEÄB† QûÊÁ†©×ï ×ñlI|LЩd"É8b!¢ËÀƒ™¨™fÛ‰ v¦<”XÌûyzt*è̹[¼TÈ?Êt¡}0̈|×Ô_ºÄœ0zh‚Ï®C2Â]K‰RRðŠ€’KÂdAD „|2CŽ´ÝÌAI5 2ú‡¤¡$Ñ ¸Bâb6A©‹¤è#„|„*+¸ ‘&Èq #áÛ©P²¿�Û³;øòw45ðàCÊŸ§9Ž Ø4‚…tZ±‹�ðUï>j³f­|kFt±€ò]To´ã¾�,ŞݚÀV‹ë{)àòÏnõ¢*ë84vå�{@êQév0RÕ‘îá±’É ¨óÚ,�è.Å[�žßu˜«ÙW~^‹wµs‰LšÃ}�2t†jåAƒ‹;4’7�Øt•NÅï`»8íBeÑ«Î2eºÃ6¶ë4ƒB Ari"7½É³Z»È­·–çÙÈôÍñS:X«³lïªÆãÀC½À±p1´uõn«81ô�!º0o[žLšÝ’+w7AñÛ©/’Ý-l+vœãH¼ÄÍ‹at��‹¶Æ6“m± cM& †Ñ” c 1�0˜‘S1h†IJHJSi0hh2E)¤²D™�Ä™hŒ€&MV ‘a2(dÙF‰ ‘!Hƒ1…‚ˆ�ÔŒ6#2aŠ¡b‘¢ÅLˆ™4QDÂd‚“$iIˆ`˜¨Œ˜˜ˆf�¥#DH‰Aa¦ Q&Š%61Rj$£HZ,ÊL(’ ŒˆH¤Yb��!!&HÀ �4B(2�H�A ÑŠ6‰cILhØÑ’LLJ‹#,†&±*2Ydh©`¦ÂBL•3F$0˜©"(2"c ˆf“ ‘(¦"PE&ÒPÉ#"b‘”¡$€LÈ,)2JTÍ&ÀÉE‚ÉDŠS BÌC6˜ÉL¥-"J`Ñi¤š52£@†Y�jA© "$£L)1¦dP�hÍ3fHI³dˆÙ4 Š¦ k3!‹‘e 4&"P&FY‰�šQ¡I�±(‚RŒ@ŒT˜š6A¦Æ‹°ÔQ‹%d™�ÈšIA©²Å£ �˜”˜!1I„I"ÔI²e DK(!@„„˜ÐÆcBDHƈRÊPf"$À$L#›ØQ“LÆØŒT˜†AS ‚H�&4“$�¢`„)ˆˆ4Æ’#&@�"ed"”bD¦Ìd£*) R’ “&È d"2&J1�ÄiH4˜˜F$)"Š$Æ¡ Ãf +Bc #DL "Æ#- i�@lÆ €lšE"&1$Å H‘1Jd%0ÒȈ°Í’�ŒCBI†K#Lĉ4hM"†h�¢#"‰–!4, TP2€„„¬%B 4Bbe&6M�ÀlRÈ’HÆ$E’ ˆ’ˆÀ(Ø�`ÀÑ“¢¤Â&MD "CI�²c‚ �„¨„“RJ’ "1™É6’`FhH@H¢�’�%F±PX„¦)ƒdÆ33,$c`˜›dFk%QJÅ‚Ú1 ¢ ŒT–�†&ÒšKM +JR”i00‚!ˆÀQ!R�Rd(–ؤ²�iXÚQ”š"‘Šcd±LˆÑ€fI–4i…P)�HF“F˜“!Hi)¦–ÄŠIe4É,˜˜‰˜iE”&D˜È„i6,ŒJ dÁ’!2„SD‰0¬‚�‚LÍdŒa±‰ Q(�lJIˆŠ"eI“0Ë(�h¨Ò#6ÄFÊlšÌÐL´ XÊ„c c`ذÈ1EbÈFP”€ÙA&”Jd@ÃÓXÚ $‰IˆŒJcP² !ˆD$D#JJ(¡�ÃEш ØÅ‘ ›LÐ�´&)ˆÄ‘‘¦$•¢,PH„H$AaIb"¨Ò&£`¦ŒÐ•¥4bJ0›%&4ŒŒ‰�¨ T%6*"‘#%„HbÉc(baXÀ˜Ñ�-"�SL¤¤ÔÈ(@ ‰�šhÆÈF"”°!F@%Hƒ*YbÆ“&@щ0IcI‰I0M�IL¤ŒÑ)0�Œ‚’4–‘±#F–l©3) &0’ˆ™�ÉHF"‘ šH0¦I� BÈѲPfbcDLL¡2&š*�Kš5$�ÀI$‚H¼Ï`±tëEfM×UPX[½Ž ÕÍ›{5†.†Ç ­®¼‡¹°A�J¡Å•F–ªs0CÎòuÙZ«k�·†hË}SzèìÐU©¡0ì\×Höàu‹s²÷ËÚR»÷]´Æs€±ßë\ðùöRõƒáð‘æƒóíS»3Ó4`ÊçˆAcn ´ex*ìAA]aÅž£V®¯[)ÍïYx•…µ}½Ûîxw9 ììÐî± ­$ûaë"eÙ›�9qÐ)6Þf0œÚáSÖ²!Ã�> ñîßh¾`›uØ)Þ½v¡.«ÛׯòOu�¾¡KO^f6¬%›¹a÷sc˜6Ì£de ñ¤ZêË/7´paœMT»e“Ô:Èk¹A2Ù]�öÛ«¬“qaa�Ôuß*=7³yêZI››W®ghOŸ wÇ�Þê™C*UÒuöçE”,RÐòª³M,¬º=lgfÝ^nµp2ª �e ËêP½X;ÆÆw<†ÞÝÖÛ×�ºª”LÊW%b© ¾C›û¾ÁŽìô¡óÁ”ÆþÙ 7W²øà âjÉ4w›®Õ¶Ú¥åë;{yXøÅ˜++ãÃŒÍOëzn¶PÌØlkѹ»LÄ;EÕÞvï YlQ•ÛïG0DuôÁLß Ncb®·¢CmWW*èýAæGÛ¹æ.Í_ w1²©@µŽ» ‡›ëËœÉ{ÞÝŠì^‚ÒÝñà&¼ ßp‰›cެoAoÔ~ ‹íÁ½Ž¶ä%ßÊ÷'žŒÃÂ�3MÚÌ̶¬v¥Y*ç3°^:žÕz=—uBñÑÌî¼rJâ†à80-§Ù×#ÌîÑm²tÔ<’/¹ žÏJì¸tìÆp¡†±«¶�&“ptî鳑Ën«+U‰ŠUr\ :õa¹bófÃ7×¶Û¸Žt;ŒÝߊ(ZYÉE]ÝÒ®¼«¦=±ž¡ÓY(U]Ü㸌ƒØ{k�å·– ÇKS½È&Wjœ(jÊŠâÍ7=—ÞðDz’ÛžÜW 4*q:ÒÓíÛ¾Wvš‘s;î¨7p¨Z] w‰ìªöF}vÝfØßcêÎpL†ónAÊf,ÛÚ‚º4ÂÞÖ÷+q+Úíä0Æ^2Ó�ÈñÛ¡Ø3»›c�Ó3;N�Ò ëRc©XÞέÂX¬âšß^—Ù¼ ²¶Ý×aâpÚrôäaÊBU‘V|èV­µNwÛ×xƒÍޱ-Ú~Ûô:$Œ¯`.ášpªÚ¥u¶CÒº3. ’wOzjGk]’®•zaJVRÃÙamlÒ)ÓÜ~Ð’wÎïT…LÙ š‹Äë`%¾«¤º >ÛõZæMæ£WÑêÌÖ„¹µÄ,»>ÅBôqX.¬qª(õ4%ØÇË/IÙ\щg8 –ô20<+±ÒIÏ<ÇwͦjÓÕŒv¶t+ÏhŠU5m WŽèP,eàZ2éƒ�¯iø=G† ºÆíU«vnj7”è">ªÛ�Э îeªÀ»×Y­Y aªD„bÊo/.¨®Ìî6µÃÚiß7ª²èNщòÅÕc¬\³[Cwo(R|«uòF ¡ËñÝx±f OÙ…+¶6¸îVÙ±=²�PXtî7ckò-nð­º O1& Aìk1‡YDÏFqË(*££fô˽AH8A†Æ7‚–)¬0é-ɼ[´Ôƒ·tu(f^d–…eŽ—Ž•�‹jpc©!Æï/6êgž½¡i„ׯº¶Bë»0WP\jÍ<ÑaGn«˜¦ll6³žíl§Úw+s²" »wg³ƒQ&){8Wb©Ïn×M$M K»‚dC¨V¬ã½±Ö»¾ �“-ä8:µà$·[ÀùípÌ.¨U«5wå‚pr†9=P_a{`=’¥‚Þâè‚hÄÞJ¹1öŽU¶&›Ã—ÓFê· 9=u2÷5 ½ììBûܸjðÑÙ@êŽï]Ù«²nÎRÈ Ç¹2ô`Ю¤šñ¯¹ëW¼û-°ºPÍÝWÆ=¾g·]å)¡ªÔÅ*¿rõvKÞΨ« u›NžÝÐ5zNñdb½–Ðëôv–nßMÑ&jãvû•V;I,£}m¤ÝëÀba ÝY`JWÙÕ¢âí=^âðäÄÖ‘O­7Ã(ömÛè;E•ÃhÃǨCdh˜sB3ÒÓžÂ"/^œe߸åö–�Äë~^dùNC2AÎ¥ûíå<›¿a‹  -kÝ­Œ0Âúù˜`µÈh_}DZJÂ0=íâ¸>Œººìçw×gµ�nøºæéííS`�iÕ½Ä�âvÛÒ¹fƒ¬¶è8NŒY j-NŽvi1ôêÉxKÁV œ²ÝõnÜ<ñ�Æ\±Šâ¬åW™+,VÖ¥‡=�kA 'bܱx,^Û½XB=ë¿¢@ýx5^ˆv@Æ6`W8í³`÷^Pås;O �ÞÌ®*œiÕƒ±Ë§K©í“8WPž�VGtÀë–>Bó¬T’̸‹Îî^˜&³yŠn“Á´d6ÅÝ”k�e™j>ø£ÓîG)ÐTeT¾á¶£�Íâ–Ô–ÖoCbØ]an[h�ãf�sé×OpôܸrÏ-�Ï#)ܪ‘R—àÀÛ�x]›Ž­ǧ‰B¯!Mn6¯�‚Á…ïlkÝ—®v*·½¥œº¤ÖqsË7w{ÞAtËÆµRá–Á”ã3…,ÛÜ�„5ÙËÐc�»„*"ô\ìÑ€b¾Pk¼w²‡ õpÍ/®ôu�iÀMžÙGª FÄ&ûj¨•Ì¥d•½ëìÌ�uY£7²­ºžÍX{F)xî{^Ö%ˆÐnîU£êÝ™œ5ömS·-Ûªƒ·Z­ã¡Ý�SFóáž ¬vî) Æõ×P륉�¥)ŠÌ¬—ƒ:¢e{+«}QÃÔ>áˆì1¿j3ì5ò&¬‘={ä �ª¨™ë2GzÁL×2^ä˜S6„üMØÚ´K&U±¬ê1uw”í3†^ÔÌXVVgO¥3€ºLRÄÜgC�ìWVÇ7F¹‘ ƒ›�˜*[½É˜–qxMöª©M —××v/ÇUû¤Rçê„YÞÉØØ©i…ÕÛº4ÞÇgºí‹©°�ìZ¥�ו± dSd!¬Q׆•;IÚ¤¶º¦Þ°¼ë¶´NVÕOH·7ê"¶S§¾áÚ¯–؂Š»ÓB¬k½ÒÅÖE5˜&šÇ>hê°dpW)0#.ñŒÞ«9C·ç²Äj÷h}SšwªÓ4/ÝÛðXªÉ›H‘&ò^œs /äH$D�$$!` Ï;žšRyd º­»ÿé*³GǸ{«ô¨aÆàØç„dEïÕ]å§§=(›åV;àëð/ü�Ý.w�»Q4g¶ý‡¿ÿ;ÖØØèûU ¾:ˆ{U{¡D™q·)Ûí}ðV ºØiœÝm®øýWù—ÉS¯GÞ�¸1mÿOóÆ1n<9ÑiyDê,lAð}#Ïþ�]�x�h«cïóƒoï±sFÅ›b�¢Ÿ@Šž>¿¯G>&�·wÏN}ªé£Û­ô¿WÉ{—^£KWT]–ejÜ~nä#'eÖ�çë}Ùþ%b]€ÚÕï˜ÝöÀ€/1`~ÛþØzÔyÄÿ»ÅŽúoé¤þ៥ÝöŒ¾wÛ0Ú‹WØb†þZ|;íOÛdKáÞ>uÑÃ÷æÜþ}îsÛ‘Ü|o5ëž'륾6«ž®ýˆq}DõÝ«àç½×Òö㣄¾Xæ>æá¥ýö=¢>‚>ÃóZx ¢£ÓÏTb¶äÄBï·‡Á¬|â]©áµeytEÞ‘Ÿ®�üwšíÇÎ'Ièn:?½AÝœB6¤Ó7  Ÿ0÷Ðo´Q°N…Y&ª.þ÷ÛõÕÞ>#ð+&Õ4æñ ÓX.Ê�}›aó±Q¿[e÷¥FÝç&tè�+p<'$�à~ÆÑ£¾t�U+lKª6µp>� Ù»G±c™8~q&L�®Q\m.ß'Ý\ðœDŠ$íóþ«{ðêf6xiÏ£dÞ<¤/ƒH¼5G“÷ø½½¡Æø•‡˜�+61ëTÙŸí aÆÙ€E•œxqõ´w²EÚ•öuO<þ6^ ”Š2cˆýœU¨$Š0’0©×Þd+ÕÈÍæ-O¯ú| òxtñDWdÅá�&iˆº£cnÕ¬©ŒZNí4ÙVÕú $�€ïc� Ü·Ýéüßû…ûÇí°©Ó8^¶+6í¿;o3--ÙšAšLñ(âÁ£GTŠˆ²gßÙe¨�Eÿê��xI!$±;m¨±ÔËᢴ�úôhq»Ÿ=+ãþœGúš"*–Œøè@ù@ízIzøHÒõ¨b`(0j*@m7ih¡™(%«�àH$!! Á¿ h½·èàU ±rÄņpMv‚0Ôzbر•k®“\@dlzˆcôY™XWÜ€@€�®˜í„ ÑcP‡©a~?wƒªbWOG´'/þ¢Pˆ©I Ì_>m�šcÁèšÞ;iê,’ãþ€Æ1�ŒKÄ}p¢ÏÛ¶£‘ׯ÷O^ψyDCÀ>÷é.“rQíÄ7%C�ýÆŸë9xá¼ðúcêØc«xßÉp÷58>žÝÚ}Þ]{ÈmÒÆˆo¯Ï~Zê߯ÞÁ¡Îñ﨧T€:Ç}ïžÜ7±â>âŽJÃsªÄž¯×–õéÔëëåG>áa)xí÷oÞž“ó§¤í1â¶w鎰Ú]].©>Œþˆòߟ—HÙÄ_z®³èßuÚß6ϼÁð¿Aу-Éû˯’w�‡0û®þ;O¿Iñc �TC–¿îøzÿ§ÛCã�ÆÙíùI|Ë’&;k{Œ_°é×G×¼*�Ý9Òýùï‰Hz|9.,ß ééäqyÅ[i_·«]WÄü[ó·¼zü£ûs…úZØÿtsŽÃ%Ê›L¼º~W³ÓÏ×.¼åzç«iÒ ”ÝÚ‰ÎöóOÒïøº/]x ~ïëWö_Äóúƒî§±±öþ½]× ÷Ìzýj‚d:TG‡ŸÕÊLºB„~ì ÊÄÂMÁþ\ $É%DCÅ�¥ÑÃ&!,CCd��8ͽ»%‚2![$‚æ/9“'÷HðìbzЊS'Ì•’öqÎ]u�§Å)Ë+_�¬ÕèYbÆ0 ª2° ÊÕ²«D¨`�XT*Õ#Šå ËÚÝžŽÑzÁÈh£¸ýI­pµ‹�bjÀãt ^LþOfú駸eÕ¯Úƒ%0 þ¡ ãOKCïîD•ƒ©X¢rRqµ* ž_é.’±¥ð¤„$|°éßÛï=núªážWʦU¿Lй ®:1S’BÆÉ+‡B%ŒlÁÐ@Ý'‡’”[¸ & a�%ŸÀ¯?rïÎÿ¹û·AEXÓ±'È„.% \¤Š��¤«ýõ:‘ú˜>±óÁ‡€ð†ÇDéáv PÁ(|ð@„�­þ²úÀƺA÷m&‘wÓ‹­—IÐѸ¦W¦äåÁV¨¾„l¥%¯Ïø¦Pª�ÿ…t?/ùþáé*a�‰ˆ,"= AÉK3™ “WsÚFØÙiBI  pÓðHõBîP�”§úAÂ÷¦aa…?µ&Œð£Š:{}ŸëÅ{Ÿàÿ$Ñ{†Ç®ˆÃn€’ÞЊs½4ì$’BI}Kþ bLÓ�™ønÿ7ȶ[o1íÛä½fÜN^Ϧ?,â{ÏkO”ù¶yÄ?ÒOXkç|u?ÏG¨ªK™{´ÒZðªÙ÷‚SÄ_ã³_<ŽSìŠm…½-l�åŽÕ‰ô�¼ÿÚI ]GðÛg�^½pk<Ôö¼] ×/ïN0¤T�JÕÚ£^¬“„�Lãû™ó;KÎz'­Cž²yˆïË>䤸;ãÎ…ðèÛWxûòý¯ÚºùŠÏi‡>ô/äé?°÷F÷ï2íÓëÇxµþaé!Óáž8¾Ãº]<úë—×�Ó�Û àK§)á|,¿;Žâù¿iíæD;øG¢·ói(?%)ƒ�ß´¶Ð…jß^­Eí°ßq—Høî%óè¿|Ëå´�[²Àˆ·‹Ç ¤ñ‹f~h}»æÕD®©ó�ç¶7¿¯u¯ãYï¨}q}�Êw~5ê¯w?uxîõŸ3_~—on�yîN ‹6=ãÓ*Mð~‚Û³çHuM^O­*Þ&Ð#¾;Uñm&¤Ò‹G#Ú�á°Úº1ù�¯2í¿MýºkÉxßÇk —Û¿E›¼ vtîÝPNKó¡·Äd¾n;Ÿ¹ CÓ0ö‡‚QÜFœû¹�NìCq);·ì–¥LÒ®ò^8ïl»¿TëŽ}øÜ~vázï•üý2oØÛÑÏéÎ8Nd8$í§`|í,uQËg@sý=Ú6ù� íð?}ÝÅÕ­2îš"Ã;XvƒéÙü «çÐo|oè{çÖ)8¼Ÿß`MêIsGŠ>–kšnA´Û÷™HFÐ�“]bÆÑw§u|ç*/\˜8ûëÞóöéÚ1µ&@e¢*ú¥ZÐ�°  ÔV= ]I[,„Ô&B^ø~ø©;ã„y©€ê S™KXÂ�£°$ŒgI$ë �‹­Ï%€Âð©rВ޵;�67…1($ Bº¨©ãÅRØØzÉF1”CatÑE Ôz”™à¨/} -žëk=:a}£äÁf'�JŒa>QL’Ò–fÆÌŽŠU) 1� È îËT« # Þv-JŽª³5U’’ó’{b6\ ]ªËÅdOzC5H„Ê`C+v5Y–ÙšBj[xTôY´CÞÙÇè°P-HÀBå±X5›¼Õíeª%à̘S7�k�8@¬2¥(m.ø ´BWWµ¸øxýåiâtú)s6K‹§ÙÅ`pÊ-¨ 6&4!›(P`¢²¦K ˆd¼Nß\>±Žñç•rvÊßo9…ü®èÄ7!ìÈy€E mÙwiܽƘƸ…HÂ;SzÕ¼ËZ)Þ¸R ¥OŠE2‚¥êbŒ”¦+n¥Ã$i„CjÀ€e‡� ‹I�0Rx®·F1{ã\`?ž2Ãùm$ã9ÐÎ9°­Óg4‰`HJ,Ðl0ù!SÙà˜H¡íδ+ïãî*TÒnäú‰g{CnÖ¡‡O»¥·l¡¾9H¼ˆGLÈ_u¸ó>qÁ,oQ`ŽßˆbÁÕšÄ ÃkP<»Z(áaš,¤ðù Šœyç`äªI~4~¡ ÖžNšHûLiŠÙÈÙ.ã(þkIWei4´Ïo[Ô©Vä·D³vݧ$ÒNZÜʦ1ŽqY.PMQ¢I Bb@! öÁtBAãät%à‹x¬Pæh Yô§ªèT­{¡ ÷5T­(–(`—ÓDÁM�£v$@ÒIŸBH“�bhrÎÕ–'œ2š”f’SÇ+nÙ©B�C4µE´UZž¢H14Y·B‹yÏ+`Òò#¨ €Ýû“ë·ïÈý“¿Ñÿ‹dñݽÃ�%Î�yd—Þ.?ó<ðÆ|V’#_a�ð÷¿õÉŸ0�›éÇþþ¼ i�-UBJ;Ñ��"<ÇjÆÿ‰ç>§wõnZ]vé †šEc=Yÿ#�›'“Üé{k½õ¬‚­»u—ªã™¨r¨ÖÐÛãú{—}ü �i~P¡Ñxw·ºå±QmÑsßñ%”°¿ƒÚŒ.Í­CkÇ>=øèÞ3Ü®BBè5¶¹~£øÇ›äÆù“\IÚÏ�žp…|@›ùÒÏ”£ÁÓë‡ï¶ÔúQ�äÖîó¨í� ӻɎNâ‡EtÇnµæÚuڵ𽕳®ôâø×LZň;˜”͆úÄ,ÿK9‡æí®$r(0®…›#c±ôà®ï3"eÏïKCÏäö.ÁàëQh»¾G+æ;wsö« “¥E¹¿O.Ôi9½Ž–�ÿ#–tŽãŒ¯;|H|­�¨Úqˆî)Î`YÚ+(ñŒC —£Ñoù¬)÷ðA2'߯{OQê0;�árûWyCo�-ú½ÞþÏé×ò¸4ïœ?¨7wZ$0¾ûÂËNo©þ®ÝXà>¯™÷×c,7o;Ľì6Zþ¨qrÍþ(1ŒOký¼ìC!º�X¿•œtov(…VÄu©M]áÓój²Bíý;úo7o’¸žÚÚñ%;GˆGë§|ŸÑÇ›×CÈàGçÜÿpà‚<”ã˜ýDÒ_¼®ÒþH—id¶«9a—«À¹daÕ UDÛI´Æ ¹Ãl–’m¥C“�t…ú Äý2;½fžžz[ ç'20'S'¨+Ù SiѨj�’©°=@¼pDIËwOÍoq‹z™ˆC…�82Œ/¾IgÅ$Q¸˜4Å»ªdu|2úá?6ÂÂ�îsªûXŸ¤?³Ìd�î$jPöD^ÆŒ1cH)„I—šÿ‰NÉ%‰,Ù!)¡€4:0Û��…°m ¹Ôb+ú̱·¹LgKRkCµ«G·ä`áÇ,%}Þ*6òÏ*d„»æ×x/@[ˆÀD^Tè1Ínì|¤„’Êøuq6ë_ÒØyšs¾QÔ¤ß ikÑí¡+8.tdžƒB|\$‹«~+ó_ÏüBg†Ò|P+9EÇP2×ü˃*bÒ†é* ˆf �H†cÉ%‡D¤I¶ �¤ /Z)@1®RúL~âc¯i_̰ÂËÄ›?·2 >I!VÿV ~mœ07 FÁ�Š£²Y:*ZÓXÿ:k#7(8ˆ‚>:!Œà*ÏÌ¥`+™š¿¨�©ûc[+GWUÓ(Û ™Œ+{«šEHiŠƒ#T¥W CÞá²6Ð$„jöjA¯ˆ¯å@ï‡fØðP¨œ0ÂcM#\ï+�´@Ô%(K-ôGÓ¡UÑB9§ôR †߯œüö{ëµuê^[¯%Ž¡Á3ãžäß’ó‹íó°‰ìYÐ~Ðã†Ð?rèt§ìÏ;ZÍh±í;cq?ãLG(ÿ¹}NojñçÇ;GÙªp:Ô$Ά9»}}Ôù×­æçw‘Žw§ÈÁÚõ=PÙrìþÒˆè:º‰»ô£Ä¼ÛÕ´ýg°¨¬m(JÂÊýt¯â¼ºvù�¥ÝÕÖ~úfI~ú/ï¾üëÇ…Nÿ©Ïуoõõúî×îþ•ÙkfÜ+Ç~¶ç¬Y�cH\øá¶œ^KU4/Îüm6|ßàû_Ø¿¬e§oÅw›ë²ÝñÎñ¿ …l~£óÇ iàw¶¿ =BHú·>½Cy2µûh[’ê”RzíáùàtWrÏË�3Jdu까üÏM’Bó|Ù©m&�'ûxº·ÎÙì;ÕÛ/a: ˆ�½ñÐ'ŒyN´çcfùª3¬éï>"JÞœCnzôWnû uó.ƒÔIòQ‘.تN÷§¸Žz²éŠ< åBº÷ˆRÔÏ¢W.·#êœÚ7±¥§æò:ùoKŽ8ÞÝE³~U¸õÖc»çóÖåµ½B{ÆŸwŽ}ý�™óùxaì¤\yëáóÈ©Ž®·½O˜3’w¼ý,{_»:z�GÁi|÷ðþ½3¿"õ·_º£ßnÒ2”ïæ=ñÌ- >Ý:;P‘>ÝcLx¤ÛQFÀÞ¢wlÈÔ&ñ~-h‹ãˆO�чÛ^ó_™pmuâ|âŽ>yøÿ¼»Üy,™a2cË û ÇÀ<þ§Çut¨%¿ÚÚ^ýÑQéI…z®ñ‹³¿OÈQ˜É�‰nYÈZö¼W¦ðTÈñJ¼qˆÇ1dÄnÅ‹í„Ý�Ô}?vrtX˜„C&$lÑdŠ€‘ä< ‚à¿+DšU8D{ôô`Õ“I«¥H©nàç:Í1V‹ª ÀüLDä÷AD’(–£VCb¢M F´ÌÎÝȯá!�,ÿ²ñôlPHºvt¿Cqb5óîLƒÆš^Ö§‹ò- ¥–é5-4Æ>¶ÎJªÃ6º0sT¡¤Ú»A4§¢”Ç£VÊ‘9#¥§Eâ¤ûØ™"‡˜Í.Ù´¥)<>åMÆÞ"eXUX¢?0)AݼqaP­LɲtI°ƒðÔk¤|¿4=dqñ$é<=ýïO9o9æ{æéÃhíÛ¢1I… 48$p}2$lÎT*‹GÍdÕ ƒXÁ–î³j�Ô¨gÅÅÿu qsçäÂÔ“ÀØ+ÙÓ•7´è:ßdLíe­”$C3ÇhÊ–ÐChÀP�0€�6FÇn)äåë>¢$÷ êÙt)ŠR-®Ž—§¥(:ðhSŽ eVˆU]­)$%.IàFª#!°D_ÉÀœ¾›Y(/ÉÎ-=2dTƒ>�£x�^ƒc *UâÈd1C*H¯>ˆÂÕÌGPºÖ¤4ñ³i#FÕ“:õŠÌW™l}·ßœ„./õjBÉnWç1°1óä_IÛ28 ¶ˆˆÑ«&M6 ë­¢~«§ NR}¿Óúþâ]mz߃‚{� öy1Œcu@®P¢)˳LmÃ[ZÒtå–`$! Eq,pJ]Áœ‰×î…béîLž  E‰H‰Hc¤‚J<µô¨ý¤Z¾´‚V×BJ$Ž�B«Kc&qMJžæ¿‰Pu2OäõFz�ŠSë¦øçãoeâ#Þ?>sáÏõÁ÷³’g®!²ÏïÞûýwª‡îÿ�s±a}}®Å;Ù ø»ú7‹f—Åëú¬<çåzu�kgÇcÌ5ß÷ýÒ!ý„{òæÑ9¸ö ¨õÛt·4£ZÛ|zÄŽ;í–ÉE^VÔ�𴓪¼{wÖ˜/™=ýö.ÿ ß�ªy1U\ô‘Ç1¼^¿�¿8'ðÿ‚þú{¼¼÷‡ž¤Ûn???Sö¤!zèÿ| ñú~¡Wó:vž7”üV>¦Aù7 ŸÝUƒ×çõú×챇�ïÚݮж§SêÂß´ÔÊwýµâîÿwÍ{¦,ã®Â n–DÿwŠÃè´9àR)?%É8»66/¶pý*w€!ùÙÜÀ0>kù3ÊJˆ¹‹Ýã¿ æ{¼iÌôƒ=b>oy§çÃÛ;M·ÚÎ_QÆ“a =ÈŽ’0LË5­õ.3úÚ_OÏŸ>ôíÏ=8ä¦èHTÀ?�"éûCò-çöÕͱú¿¾íï·0ó¯|mÇš •JÐO×sý¼F·¦É7íÑÍÇI÷̾üÙ» Ý3€ÝѰ/)ë�»ù´Ý cU§_Ïîš5ßgç[ö«Ñß/�öõ¿}ˆÞ\‚ê}¥¥ª;è�Â:^Ê`Uä�^M§=q�8¹˜´½ FuÞ”½Ý´LOÍ:÷Ó£™ãÞ‰<ÂþuÏœÓr+—µ; E%ã÷…ß|BkÇÞÀßæ½ßùÝPG>¶µ›mn®Û:{g@¢¸»'B÷lñ2ÃôY‘—޶üOuà@cÂÛTF‚?|A« ‰µ{ën�rx37š`Ù2 >Ï›¦Q¸g+EXÏ+˜»·D«ú‚­$ª“%¤YôÁ¤6ÚÁ"@Ý ²I2Í&D'Õú-¥°Ã:×[ú½/3É’Ê?WzPf1¯ó•-m°ÎÚ"Zá¨d4@àˆͳJQ� € Ö@·`À˜¬a‚ 5…@Èý^hþ³ 8„‡+Ä‚‹"1?Ò‚öRU—x„-œª”3i{”•" ¦“4 ´›´¦ÑI¬nª –÷õ"ØàçOy£so²L];IôÒ¥Èc1#OËé~‘Rm´Ãñ�Mé�ƒ’µÒɳš*™æš],l͘Cû` äõøÇyä\ݘ!~[l¼ƒ'©¹ s¸E ÌsbåšF¡�}ÆÛxS6ÖfJ…®O7Ð$0fqV(Ÿì^ÑnäžÕŸÅYЇìœÕ9šMBÎsPƒJÕÖ4´8œ’Å.¬ Bê`ä]¾"v&÷øž›ß�kôjIÜ_çðhÛqø/ßH�úÞ©‡í�DÒö£ßëaÑèúçËùÖ9|;È'Yýä“»s:žõo^ɇÂ�c/m^]{l]GN§)ôzH8û7’§zvûÏK½__Ýé˽o›ZËÍXºÊøÃí/uMüÄol7ÐÂÙ­Þ½<+¥èÝ>ˆï>=(À¼LsÓ¢+ätŒûü®!Є»«nß§âùBYx[¼E±ï.ƒéžŠ“ö;ÎݾF±z$WÆq<9¯ë`ÜÆ!&O¡óÐ÷Mûï]Ü+»s(¨kÏ·Ç �ÞŒ1Ûõæ;ç|M+OÐáР:û€Üô³ü„ØØŸpfLNô='ïfùĨ=I|_ÂÛ=‡tóà:›[æ·vÇç—Bj¥c´Ë‰í ¾¶öü^«Ûÿ+O¹þçÚqòxô×È3Ä=—#)%ëœViÌýt÷F'ñ»}qF®ÏïŽs™~öžÞÜ•àçMÛC¸Œú;}oò\š‹¯|CÄ]Ø,ÊRÌGNîA-žjeNÞR(é�Š?‰›Šgƒ_qÁ/Zßã“+¢ãû—Ó‘nxlßVþ7{x‚®—¦|×MœVRôç¼EûcM¢‚É÷U×Ixåò»÷‹iv�çÚØ‰9þ•~3ë~üpܳ„ïšnç¶~>§�óå·¿]ž^J÷qÂ.ûA“8Iñj;¼®Ò«‘Ý �èáÑp…ŒÆ·Êüô=]dÿß²HèùÛ€ÔlA^!_—óަ-ǼpÌiMßwj×!lÃÒð •eÏ–J­ dÃP/gw‹¦OV‚�L@´ˆ^Ô›<Ê— iâI Û*’T2¡£!±´Ö!; �˜¤ƒT�o•~$Œ5&®�Í+,Ŧ¤};™$å}Ì8Á0p@Ñ„I$¬u�Jz?i‹Õr¡CKD˜á3pÃ�+túûadoüC KÍEd¿Ô½q/Îw�ÛÏ劢³³¤ë¦?||ú#›]/ÕiÒÂ’lðÙ¨û¡ñª,Ÿ<{â®ß#šoOºçÔ#»7Üo‘_ùã¶aÌ�isžç»‚{sOd+AkuêÖYÜû%é}�!-»o¶žç5‘Ä]n©Z§âØNwDQ±Â{¯c¨©K¯*:ó¹ü» “·:n">Ô«ºñç]ºÞÊ~}ü—� __½1*Uæ'!o°ó×ΰpúRm?% =Òú�÷°Taoµ«ÄÄ=ô,NœH7ÁE8êÔÑQ®«ÑÓ“v��»¾NÖ8Š‚ŽÌÏ=f³ëCÙÑz{°TÓÜÕ€ýåÍT(ßëi÷{>Žk�®æ8Þ?gö=>šØ³'%zu{@¹/½y°ß³-:½ËÍ­áwüøäà ômuã½yw^;v—A/œ‚+ü˜¬#8½êV0ªš)#˜sÒÆÇ˜ Ê#ûwo¡Î‘>wÍç8Ùh¯We/R­€0�`%±€|¢[•K†ùB¹w1ý%­%ìöÒ=ô°Î?©A™BC–"iAJz‹1ެçÀ”i€ž°ù©¬eM2¶`(²zó´Þ#Ka9[Èízâôì1°c)AµŠ@F1_ëùõ÷ÍO*9‘ÉgZï?•8Ì”ÌÚN"<ì-‰U�¡Iû“¼ökl|”ç‹•fÙLþó­6¾X{ʶ;ÚÒa<‹–¶­m) àI£ViÀ?º˜v¤Ÿ :»*òýõ›AºrIB|}ÄkЉìä�× aÕ68ˆÝØ`U$—˜Pt\�’É4^0¶=ºõþ§è µü$ÕåQœI�G±ØÄøA#8è�„,Óòét€KŽ9i¥g2hï'7­kÛ ™P©zCÐ.2¡»© @E5üϧXâƒèàtGùõÃë¦Å9ÁÛ{N|qŸKéH5€œc õ”ðÓmŽ‚Bp„$#Éi;QöýsX…T«Àº¡\­B‡Ô°„"·ûQ×Íx ]$–F¾„‚©¤‘ !* J×m ÒBÇè4!!uƒß)$}þg7×êyÜŸ‰>¼suØâ߈=¬eÄûl :÷@.µ�Áq?B7ªôÚ-ã3 ýõâ &92‰©nF?-1hC¡gž–ožmõï›Û$ígvpju¾ûò‡KëñoÑSµôždF� ¶Drû³Â=´Ìåò|Ï·)1?Ȉº• _JÊÛþJ«‚ïp—ôظV'*â>½±ªR=Î×¥d^£î¨,=Ïa�³Y>}ñÖ½j ÚôØ94ªu¼”}.½ZÿmÉ7¢qGöå!ù±¥é,h+†‡�3­$ ’õùî£×žò¡uç-ø2Á娹S¨U@1ÁÖ¢GµŠ,&‹ì‹{Ö²¿¨¨œE À‚Ò(l8ÑïŠÌb¬C²Y¸KašÚ,z4ÝÓ‚ d:ö Ù„S~9×Īg�±ãÅçÒœï8ÏR«\•³|˜EÌZ �îâÎXC;Œ# ˆ"iÈîb¦¢(á2ÜàY!±�’î$а�.ÔJˆ´JÐ!�Ѭ~Ÿž$ñüùÌei¦´£ø¤ Ç4V#AOëyÎøAg #ô@ùÀ•·YÞt¤n ÉAAA1߇ iw÷½î/¦X‡¤GƘ“BdÒê'#(XU³HÎnõZHÎ�€¢apý¹[å—Šwt¡zA ¹3Á ”™ÙÍn`šZ, fi'?,MÊUhE Ø»pN£d#ªf7jQM� CÐŒbmþHÏàÏpVR‚ÕÁ+lj1o[ÙÏ‹±·Í.’ÈU‚ƒ€b´.B@“I$WRÉÓÂŒÊÍ·’Êã|ñáû îþŽûõŸ›ùwÅ’/ùCŠÓ)œîëfÇLæFæ³8^ÀIBB//‡Ç¨ùw¢åø{¤4Ä!/ÿ��$À1$€i¡!&Ò@~Sùg–®3¸/,G><¾7í¿Nxi–ôìgT²[.Â>Ó! ""þL=›'ß´EG†`ˆYþcKóÄ“º¬Z%”8¾b@fš§çá{4lÒ†·b¨Âàb;/ýºøõTê:ûq2`Âýv:¡ÄŠ�XœÞôËþr]“‘É)'ëºcA€z^ê¿�ã¼#äÏã‚8·U•OSý¶edÕGóS“ø_ý_óXæÍ<1ÓÑÌ΄w49‡�߆a©>’fžÇ#Ív=QõžJ(r#�•t{zä–eô1uðn=��c)>-uèÜ;æ|¨ ¿*Y“YÎü�(³UÙ˜i”œL·šf ëÛ&q�øÊÃ#°/n¢*œ\ÝüœXñ`›,¿A=šÚ~�*|Kß9ˆáŽè Im<õÔÉC€Üv’0ö.¦Å�ü™•`siò×– i¸s $‘< $àrø§ÎÖ³þ?öCš¼’NèÓьʢVªØBEíÂb`…�ÒRÇ£vƒ!l¡Þ÷ô!uœ³s ß >|ôÆmneFE4Ä‘Z¾¡ï ›'¨¸Gº7lê­�-túLVˆhœ3m-{!Ùšì~¢¦‚”¸W+NBÀ}¡ïÌøïChµæ…õ‹=]MËêm;=VvˆÁ_ÊÄë® 투�Œˆ'–Ѩ‘.•Ó £ç8<¿�Pìäz«­?}ú(ðæ‡¯Œ8 qÐKYz=Âí°Ìê_ª§e!Ê�ž«û·03Ž,@>+/·ÐÓW„ Dø d窕Ê^ÈÏ¥‰D¦¥®ëftç�Ž®DÅÎT<+O_9¿%ôµMZÒúžÄç—¼�ýÅïÚÏñç v,¿‡ƒ¦„,Ím|_‚àxW�û�^¾Ë¯€À/5h·Jf™š!�àfÚôãÓ¦¼­JË;¤½âº\G•º{Å·¬µ•"CÅC·„WQF?mQú£7+ZHö29V«@û_Ü·éX�*á�‹žúæW‹¿›U%ÛÎ�jñ'o5þqˆ/§–À9㯆~§;ŽdhôÛFóÄ—¿»0^úsÁ²HËX²8·=yL·N}f�¾�ç�é±qy¾N_—.Ñ׉­ï�–Ç�®"�›BV\Ã_ŒɲdÇFÆ/CØ„IåB�7¼ŸN?�Í`ü[z=J­ÝD[' `Ê¿Jk}Aø„yê5ÌA^AÇ£1íõ êú5æàCÚ¶—Y?A1–›¸¨\£ŽpÂñ½y ™×{Nƒ!«œí�òQñ\l¶ÊóæÂ¡{–ãöýî  >y´â› }¹ ·Y“ÍÆªäÅ·@kr(°¸bm–ÓÂͺ æÝ†$¡¡.ï£#ç‹C¾ iH=ÉüåÑ Kx5!ã7 (ÆáÁÒ÷$cª÷x¦«ˆ8zsë ¡63Úö+¬Æ•LÆnafíŒÒÇ/A6ï°Ú�Y™ SY¿¨ƒŽ„˜.[×uërñûO›~oÀ“ø>†�üAͽŸOÕ÷éÄ�üVZío@ƒp®^-{Ù©"�!“$ >ßqµ- 4FɆÝFV”a$ŽK‘cí-»pÖ£¯Tê?ŽùÈYÄ6™ÌU#ƘôÌH´º�iªû̦w™vR Zº.v»K«n™túC¬Þ“púƒ4ÄQÇË›ù}ÕF‰%Å]a¹Gr‹ÝGy2Øße–e)áUÒ�ÂÍÙp˜¡|ÿ¢ÕvìÈ+3†4™B¡)-Ù½“E0å@l¬ŽáÆ£G»�ˆBÛÈ"¢ u`rXнˆøÛŠs`>"+~+RyÀpÐ\0d ïøm,8.ËE@b pÿrÉc…7¤5µïÆë÷“À¹ °¹'¦8’†ðaO ¬jXÂõínt Ó�6‹Æ¯u:¬˜ÕÍuCwÎo×PÞE 1X€¾-ŸGk CÚ¼¦Nàf(ñÀjZ2À|; •N[…¡�uH6"Yu/aª jqÔ2¦pdð×~wÜõUŠNþªÞ�`†CÒuW«>ᆮá�²ÅÚù­³¥¼ à GÖ1æ�A£Ù˜®{¶¯¬7XÁ‹öìêÁŠpB åš�Ûb ã+ïK…Žò£a7,ž 7óÇ2¬³ü¨³ýÒP÷6»ê �|¤Hó*ȼEЗKŽ×qäEnÒøÆÜ¬ç[ßj§�x\Dtñœ•Ö"¥9õ‚¡œ¨éú¤7•±`’Ó!¬EdDIà|ŽÛþkòd®ùÓž™†ÔÖÁnº™}F˜þ<±�VY¤ÓͰýòñ1´Ð¦æ¼4äDš"«²vaJ >o+#Þa%™g½ ÁþàE‘æFŽÚ µa`¦²ö\bÆ5“rÁ¶½Â?ë‰�ÛpêÛ¨Gôì¼9µ1Úy�êšyL ]Io‡Â(’T&ó7¹ÄBM� ëÏ|B“áfÅ$´-jåQÁ¶Òªç› c!Ë]¨ÔZós½ÊA„sQˆç{îНq@ÅìFq”�¦üìä^ÏbÒ>�ˆmä—u·u>_€¶¥í“~I+�•¬UÎ×6ÀØôoVfjÇ|3r Ö¶öoæ·ž·ò `ìÁVMwNIekñ…ŸÆ#Ûì@÷/6ÑvÙ¿`8¸¾½•|þ*§×öÜ0Ýw¸þ´ÏAÿtðØÕßn1A}÷Ø[ó-—‘„ S#X9/Zu¬¢}yߘ?s˜»�)ÒPži‰sT–V�ÖnšóïƒyäˆfÏKÏ7§§ME)ziÓiŽíÒšlZÿÉ?EªLmJCôrÌãVjX,�¡�Ñ IùñÏçóŸÎŸ÷•©Ó¹Hø“œ[8ëØPŽ�׋¤(…&@Áˆ¾É·ÿ9Ãr3'G”Ó¿¬W|{g ›ƒxàœ&„Ñcl¢N¿O®wüþ[³FAÃlêm í"ZŸä"ØÂÑ¥éY]7À¨ ‹ޝúʹŒgÞßp‰ë‰ø&þTó¿)$–Á�üDÿÄ6ù†÷ôþžHó÷ùXßo¿Ô m©L?·Ç¿c�Ä�—FOú†‚�~ ’9¡h‰øÔüu„ÄÿÒ-ÆÄ:°1CéNªÍôxII‡|¨¬”(%f‰Ž› šR1¥¬­f–Å6ºµ¬²÷ü„p%²Ð hx|f‹‘mJYŒMâ–¶yàNU«ÏvžûÜ*l6°Š”n»b„Ö3`r†Ø=ä|(XçZ¸5�—nO´:g`3þ oí‚$}ò…~4~¨w³ZÌ>ãó÷­# Iª¸ªæÿ³  6î"Õ9ð6/ã–” ’ŸžOw; J9��Œ èÅ .’2þþüCQ>õwÖ#²îDRn4ªaU7éøý½ú„úþÄýÅGûEÝg¦Ø‘äAäâ-×óH­›¤ÖôÑùñKŸ ¿1M ‡Nâ_Ìš9¤�rò}Û24ùoî[>9v�é­w%,�Šü?ç—µ�€ü[¤ì¶å80âqV—,Xÿo)9ªf�’yh1Sif 蘸¸èÊk €CRÍÕŠ w¹.u!A#“SKžÀ>¦Ï»Ð¤ (‹è{­j»ÌØ¿HD?'¼Ð9âs£zÞmžN³è°¡¯\Gd3LæXrѶÊS�nC�RÙ¡å­t¯þFì/VK‰ yö‡:ÈZð‡¸ŠD{öÃéåñîÿ°PRÏo"ǯ^Þ[_º¦X?…Á�)håÄ=ä/Â<¬�+Õ#©Ñùa®·�k¹�:$ ª”8[],àINÅ‡Û 5‚‰>Ï–;ÑlYdô‹»Æ£¥aâàfóìݱp=ðwö/ÄÑÏ•àÏÖ¿œçq=í´W2io-Úûl*]£K‚ûu®†?&×AÌ>ó0YÊîþ[$ÿö£ùx4ztqHøßƒïZÖñ¢'õXñR5f×ê_ß“»Ùñgo}þºÁŸsàš¨êi�ù«¾qûFƒA ¸¶¿Â¦”÷ýæpÈé¿o’;îÙH�6öÐ7KÎl5|™)£ó ³ûظÉ�Võ§ ér0µ¬Ž„+¸Ðn¢>âL>1»Ÿ½öW ºó@Qþ]‹oÂïSÚ¬’&>#ôwãV¨0aÆŸÁ¼ýß-¼oÎ[Ò¾¹¸×�k0Á�ópSîרÀyŸ=ëbÞ,ãÞ×µÔÙ0n´ý¥Àè€ ÉfÇ2vöë =äšQ @ͼ·÷œ�%jÓ/‡¬e›ãqKƒà’ž®&ø#„0ÿc‘©‚áþéÅíè†ÕOx~ã¹fïä’+ŸJIåûv¡*únÁš^–äd ¶Òð=NèǶðào·ò€½ÏÃe«�ý)es º�Éiì£ÓÅ« ¾áþ\è¯ eÍÒd°QÌ›Â%w¿ŸXKYå½ ’×Ö[ú߬Á¡4â†J„¨!9Èm—ÚÏ·1ö±vÆh0P<ã‰kCØØ\sÍ“[#+¾S Óö�ÀÀõ|§°k éF ²T“¥]s´íæO\Å„?zíµ`GöE–ì%�wfâ±ãyÐVz9éäñ�ƒ5¼×bò5©Ì ýåñ0„Aà&ª@¼d�ÿ‚âä4ŒÎwÃÏn¼Z!úœ6ÙÕÃ0M¹­�…ˆÜF¡j.²AfÞžÀv�}¢Dd¶gž+!èÊr 2 ò5›¡½îΡpB—ÀÛ[Q„§‡F�`ÑŒÖoëŒ^8J k¿>«ùÿ;ï”Mtã‰[² o¯„`U{åïr P�ÂZqö<qQqøõ-ˆ�*ÏUã†/²—úë–ó£—òd©{ž*M™dÏ1Í}ÐS <íC(8c2ÜÄç;±ZÙ>Êm¬a¹ÊôFjµ7‰…pä¸}‹ø~|Mà;=G9÷sTUû÷!úÿ(â+&L\»ZIÞñ¯4¾�äHö1ƒÇufî“ÑÊ<ê†Üv”Afwà;Á&G­7jºÆä³$¹IÐpØ.†jµ'2Ø�Û%Ó}cÛm�Á‘¯×ÛÞð4 6ñüå@ŒI!Â’ºÅ{myù‹x×�gûÞiöûÕñ±5 é!oæºïí)Φ�4ÎmÀ{Áþø.]ýü£™Dòm÷ÕHˆ€&„? ;l”/¾+K�¡­&‡Ö8 7½Y¿I29�Œ*wÀ=TùÙ£žs»«ž„i^É�-|䘹þWõfæ¿ÑÜ£5Ùpþ†ý¦ûÃ~[ƒ8(óæC×ú2.'�¹í?iÐ?=Ç‹~v/‡¶{Ë<0ÿàæÈlÓ~‰ýìù€ÓX$YȾâ&3A€Óº v÷7Cƒ�}ã¿ë\s›»àìI–È’êÚÃk¿orû{ ¡_ðs¼�\áŸnðj`Û|±­‹‡_¸(<ƒ×1¡ü"lEŸF2Æ�øÂÜ+e¡¶™,å§Æéü¼á°Ý±ñi/áðÇšóÛ^Ö�9z®ûñ]0Wj˜Q:û‡?È^b_%VÃN5¦oß„´·ï m,ö޸Ëۗ¥Ëœ'p»ûÞ·n_¾Û>§8×› •M²ˆEx$ Ɉd÷ŒÕÍ|‘ŠvvΞÈ;ì�`ͬù•UD­[ƒ0©6ãÓ`=‚~—@Û®ç¡.cW8ÞÒU’O§“ôoA`™öŠŒÉô=|óYãô*™ìP_µHŒâo‘êì½óWÞéîº,¸äqkb [ò±"¸K­Ž¬n/ãyÝJ)Ⱥkßl¥QÔ9ðtKMs…\Ói_Ý>é*(ž‚¾÷¬8F¶öò#tˆÍY¦aïm°fEGV‡“D¸šhŠH ‹«Ùr­)»½öÔ2:S.\!×}ì}¥œ0Ø>3¦®K�µaÒ–ú€{ÖÞ¤fk ºFÃ2j¯<¬§;Mhq„¯"ûM‹É+ó0`ˆ ½ ¼~vCxSGðF²•õqÜûkYÈ+Ø5AO)kœ¾—Žüc­ŽÿqP|q ÷JÄ{k/ÅIN'{nÈÂ±Ž§nÏùi�± ?{¶pXë�÷]ÝÖÂìCá>( sÄéA,q‡?( 'œ}ŒŸY‹Æ Ñì¹¶¼FŒÙäÒÈî@gM‰¿t¹ryߦ¼ómá[¾qç rqúdg&™!úlš±Gð¸î2o¶«ÝX`u²ômÛ‚VÔBÃø`6!”7pY#�pGªv�6¶tÞ8á_!Keü–4ìE­‚´Iš8Ü£½}v”Abüíª²j›æ»»ˆ::ë06­.‘Šp—Xà9´IÌùÁlã5þêS2öÿÕ‡ü«ääb¿`Uð4RX£zãHo÷}ßcÄÖÛé¾<é§šI÷}faÆ1I¡�ëP™ÕÛG�zÌrÅÎx˱Æÿø ¾¸ØïR{¥*vÉÊ&xl§Ô¼hÆJ¥µ‰/(m#-ec!zØ Ðp„ƒ¿÷ïÈä”Ñ;ÿ˜]{0¿LqÇö1èõàø©œÌÈrli~/Á4š"ï>˜ó©F»ìsÜÙü¡B(ÿÇèÍ«Õ2�£Ìð4Àóüw·½^^=}ø|øíL]±·Êä�çרpÈm÷�šŠ> ö˜�rfze,íý‰ `×6`i¸­GX²Ø%œÜR|‹”7ÍÕ'²À¨×ó÷rN¦d¤Y&S2Q 8e¡�¥üT†^?®÷ýkÛVÌg)·ölYqUš¤BšøˆQ'\R.�¦£6<´M*Ò¨¦êûl€BëÒ jÏE`vØÑÀd�œvYœkŸ ÔÈÒQŒgȦ×1ªÒOW|sY`ø8H[´¶J3‚ÉËpNQ„]éa>n‚èÞ¯– îWÁ»öœðÁˆ[È÷v&쌞X@ñG0¸XÏ;k ‚¦­†Ð: dä±¥Às¡ÌUÅÚ´¶¡�.¯À5Üá´c�máp¸C�øÓ�®ÕøÒ]ÂAVʉ3ÍèZIó¨JA1èÁNíGóI\cCšXv™M�ýI�5:ÀçÁ4 $?ÄèC¿C…—ÅÔ°Ïî�Ê„‹»@¨ÈA)‹V¤sö�gȈ€<àĪìbÁ+Ò<.w‚¾®ìGày »éke‚ߤ@ˆ*[BâWO嬇=ž�lW(ù¿ä4’¥±¼EmlÖEÍÕr,³»$ ó°ø"åŽT_t¢šØŽ6ÄTYkž -ÿi AhD£ Ÿ†Ó#E«hÿP>“'©rUE=ß ÅgïΩ²XÀ.‰Âˆ{£ýJ3)<||ORcãÏ×Þð7éù«OE•Xò8'!lEDrÊ8®ÉÇ:Q7Šf¹ÝJ£4â×Ñ_l·kŒŒmT¶ÙéÕŽI“go¾ŸHfŠÈ¼Ýýñ†�@ÙVøÞåä84‚øÇ7‹Oº¹#ŠL}[Ãéo~€¯÷(P€}tðw±À�]”åâ/$ _{›kò6JýNö“ÉÇ¡lä0C€{B¶Ðõ‹™”Ýa›ñ%Œ¶4�ï@ë·÷gú“ÖbµR¯/¡ˆ°¸+˜#½l}Èð¦L¼SŒ†%w5¾.˜SŒ‘§eE?&¼ôØ> «¢è‰ÐÛ…Μ¹zLê÷ñ ¾ÓΪª)èõ¿2¿+Mf¸��ÕÆ¥©Ü\H[:+ˆ;ëlؼŽâîf²'¢Ÿ¸¯|O¡~¿FKÌ_|ÈÐn�ìg"jJCæ(Ç+UÉ[Ê[e(^oË{q`w,¤¡-^vÊ›è34«°eglB”¦•ÊžId"”tý‘@Òo;1ƒð×FaãšGñ ÷ÄDp&ì�¦r¦îG�y¿¢1âñfÀAPíÜ=·;eØÙ›:µÇX_^!âAãÌã�´á�¼ë�ÿkÝ€»Ö‹Œ 3ó©Ëûß½Ö0òO“߃;÷7»»/.Êœ×u/aøt==–2`~+K|á@wèOð¡ÙZéöß?6ýùÀ€BHÓè2äàS@äÉa«˜×Æ.—ùDÛ“‘·ÄöžÎ „ejP²X+˜ôx< Ãúâ͘£CÖÌxV½ŸÄ‰#¨±�ç¿°Èô=µÂ 0Z�²pÛ6P¢XÆ2~ý×:aDž@,D8 7ܯS¹ÞKŽš"‚SÝò:G/©Q‹ÕÎúåxäòÏav[m°F€ËG¼SJ1¤©›¾ë‘(¨E›© ©‡{ ‘&‰ Ó>ø§�X…ˆªì–Ôd´?÷±`.|z&ÄÚ¿;¡#J]ŸB�lÑ�Ò¨÷x�ná…ÆX’úP(Å1âVÅçÆ€Có~ ú†H±{Æ–¿Ž*þ† �^ 6TqÍ­= ¼Ì \®Dlà3,'«›žÈZ§=‘…¢‚¶' oã5§´ 69Ðl¾ß%�¢õkðÓ½‹´‡Ç¶DT«mòý@åj,‰`ÏÔÀÅö®7;hó¼†wÀ‘ÐMIä¼"¯“žÜÉ\'U®À ø�.PA¨hf÷ß�ÜCg ŽšþíèÔÖržûï€:YšïÜÀ"QRX=‡Ôý2owóìÿݯ;âV7’w[»5}ß`Cû ‹3aJ‰Ìê½Óp]ž%ùW{+ÍÀ¾¾œß‹W/;7Ä7Gží–/ïœ,·¼P·Z<$n/µH�/q¤�=]«"½òNdeíKƧEJt¡M/†Ç2Ñtm¹šJƒy$mí“G+tŠVlž¯™\[ XEñÞ<ÂVe4ARQÝÌ®—K÷¸VªÑ¶‹Íj”„ñu=|uüî´¬âfR�t‘ž=.ÿˆ0û{k(Ü õµ¯ðÐï õÏ¥q‹*Í‚ï%0_n¯÷m @Á¡FH«ºÉÀlü¾uÓõWí=ŠÃ±c¸Ñ™@‡aèT[<ÝR¡y¯\c½Àõ¬…h9K‚¶Kü÷HÁ�é\çñŽ� §‘7¦s\Ã%�%0¼nÀøPØåÜyã¡ ¦ÑP«¬Ÿ°t#É€�…)ʺíj¯$GjCc¥Ñ!dK®¥¾<1°æ?“·Ì$aŸ:Á·c3†ä]P‚‘* L/ŒÄóŽïC¯â§ÅÀ#5íø}ˆºx_ób²¬³>¶×æË;ЫJ3�LÇ¥fëÃ/#hH®zç+Ä£sŠ4l�ñ¾‰–|\ŒŠI`z�køÛ- §‡ •vÌäSK9º¡Žý$ªäƘ¹»-*CÂÅ1v¼UXÊÕ®{ ”Xra¬—J.i'Öì`Rs›)¸ŽÀ)þ ?¼K‡î(~ú3îz±I‰+‘t­›ØÓ565K€¯‘¾Wžs6̽ë,à-ê�A¤ŽçœøzQ€wÈs‰0)6!xµ²vO†Ûb¬¥ÆE’Ìœë7æâÍgfšUZ,l€!ÆP ”i—¾]zÑu³rìvõz_·›tÆ«‚å�ôX%9s=–í'ðL1V›fƒp› -am.‚ÊŒ¬äÇ@O«´ë ¸óÁ]Oï54ƃW›Fc¡s âåëOß?B+=¡ºÏ–ýâw+^áóà ^ÿx²ó­eO}çðvKíôož†!>ñ½‹Ò ó8¶f_Ñ»ßÉ×Y;ÈG?ÞgɤB0 ¾ú;ˆïç¿ç‹û!Ç¿ 1ÎA1†âúý+üF\l![Ò´-&D³d-Ú‹S;àhTmÍœ¾SÖRïo³í³\dÔŽZþ�ÙÏ™UGlŒ½Ü�CׄPL‹$Ä$ex°F:XÁXí‰pF¸n¹-DŸ……ǪùuT3ø_— ©·…d%Z`.@þÁbW$!l¹!Ô!s>ÜSùÈgkhdbVÛ}ÂXÌ›÷xX8´NéÆÐ•ãž~zøcxÅ[]ƒÙ÷žOÂK:£úÞˆüó[#"ÌÀÑl¬Eð‰cP¥k��rªLúµ»Â<� `ØÑˆZŸ…‹šÔíÁãTf4ç¦<é`ï¡r¼@WñáIH¿aQP¥f “i”Îu®À„\ÇK VöÄ£ßÅÀ#²>5�Ã÷ Üè’½ˆ/fmK.ásÕb=Þ‹ê9�cA3æS¸Ê÷ºidØÖ­k%ˆg-áFŽØ 4«¿:½nb&î,´ÈAŽÂÚÁØ‹Ì$O“LjÉ0)z_J†�nÊ´”³”‚1�š*ý  ÞßÅ$¹ �ú\Jì+Ú:­ÀÀ—RH? ¹q-S‚AûãиîvíáÙ¥«U¬’`Çœ •àéϵí]¶iiRhtÅÒl ××NŽHâPü*�¦¼� ×8Áqéœüp߬˜ÖG~€…« À÷ä(´C#þ;ƬÐbV˜KF.¬:RËžò†R�–[@OÄ5wµ­6+ +[`€rýž¹•õ�eõµôŸŽoG´¤Ù7r«?Û¦j'ªªåàIÈŒ½�;v¦Ô`Ü¢šm6¼Ò›ëƒÉÚ3VåÍž-Tš’–„ÜeuÒ\›m Ýt:LbpRZ"3½÷é$åó˦›ûü&e߇}•Ü»=¬è}Ž!Ý1º&3¬*¼irÊrM€×½â`MéÎQ ‹þÊ?ÌW5ÇZÆ Ö58DgOŒÎÏ9û9‘!¿=ÌèJ§¥¯–‰§ ºK¬Ý`öV>;(äaïBQ 1G{Q†›ŠAw5©(îL¸B´Üß©O±Ü×ì0Ö¤ßÀ€þiu¸Ç¥vOf¹ì ÌýJ×ézý�b³œ‹¡!Òä£k—¥?‰·¼Õÿ¶é)æT¹-Q¿:X¢Ó×’†´èÔjN‰žîx®úÑ{]ÉD¨ÊDè—#ðy%*ÜxŠC>Ñ^#<Äl®wVÇeE:Hj{…¿Hk J¡”É^fàÕCò;lNZXz—f¬@;À’Ön„u·J‹ó§´=¡†$ØcuÚcÞññz‚¸hRwî<¿EA�¤­8Æß/¶exªB#ö‘ssôÏ /©÷5˜3mߘ7v,r)_Ž˜W¡�¼÷(£¡¿zuÊ�¶˜]<Œz_¢'¹^ç™ù=žKˆ@ùöå•X"GÁ8Ÿu_üw�Ö󭨇ž#épÍ—‡vItÝ\‘îøÍK0ÑÅû5Zã÷^ÞŠƒDÔ�ï…ÌTKåÎoæúÓ¶yÏ1\^&ÒV!ŽÜ׊´ôô7uP’rl~:¾çšÑSæ�‰A京Á2’é¸Ó�Ñ+ŒÅnì•×F¼FÎ\”å e7În\ð[*FD’°ó‡x17ÃËRvõ̶ыÒk”!füL7Ù4Üñ‘›eMuÅÅàò…d'yÖ'O„¤JUé $—½ïSx]]†rÊDÜSGÞ/†|_m'‡�„ŸiØš¿X¿_¯§ëó‹û*ïRéO*Èþ‰S×"úb¨Üª‘œÝjÅ“3kà Ú4jz²�LA»K¯ú«üÆþþ¤M}¾OÐåúêF\¨B~kg¼ôÅb�¼ï†/�ÕôA~¦A÷ì|?‡ü€>I!/ƒF¾/ ˜‚ŒMÅ „Xgýïqûø¬óq€ê8mä?нPžê§j[^Ú|èm—ñô?�.|š³�¾ºIR”%² % ÈKdªŸ5j9áJ² ™$“èÖ²Ò«ˆ €ê–+¸í/]D#(ßJÆ= >œûåê9ç.wþØÖõW÷ädp £EÄ ›&àJ­6΄aäWŸ¿Ö™uÄï  õLß÷­hÈÞ­o�¯º 9 Mã¿s8�‹0mÀƒ$Ú#ãJP§˜3‡T¤{F<åŹ™ZI �·€Zdèµe)]+n&\ ÒåÄÅ‘ä!Gåï$Í©*<%æd ¨4Þ‚ Õjh+ jëK9;lªëéú u‹ß'…$f"1ß[9ÆK„²™ön^0ÇsÌù¼‘)È#¿)—�Šq¼l[hSÍaûà¾;m¶üP<ŸwÏ1!j]¦”� —ÌákAù Õ²�%И˜ìá�¨éõ³�3H­§Ÿ��yK} <"°W6·¼O£àËÑ↠ªâAD6Üœ%ßQ€š¹öôÌ\4.¶^³¥íü�›ÛöxÃ[·¡ÈŠöôxÑ#¥kd¾gÎúú*ôÇqPD¢ƒ3|Ö¸!ß¹¥øRè(’F]%Ì^R¼�+�'- 2¾4˜z_rµ:íÏzqŽŽœªhª3 •!„�¦¼/ˆPAöÊâÈVf1eåêâ×êû�„¦Ñ{ ÿ;ÄHšür2ôv-8,£§ $Ë‘¥æÛ“2qÞç“Á¿&ÓVR¦Áçl¢)‘  mÆ´Ør+�Ú—§Ìnëll.yΊ†åÿ æ.AÏõ 8ð0/ÞÕò nív¶ùöU=.o×g�ÊðË4ÛùýØÂ{�ú§w,ñ¾Ü “Þûq“hÎ#»Ý‹ÖLÝ�e 2£r22†N»ÖB`«°q ¢*l±µ»üù rÄ5PÁ‚"©ª ©é¯É\®…±®D›ÎË+yœ¦¸N« \ ˜¾¿™ó^UôÛñ5¢“¢ éd�­x·@ëõÉ´¡=®cǰÂÖÔ²ÊØyx Ò‹N,­!tƒ8aŒú±0åm�ò¥ügïšD÷Ã7h+͵�´Å]°—Œ/þf�ÂŒ^ÂáYÂvçë³ÓM¥9m½ñ²>!ëLùzáô-ÂÒ^�Ëè¼v5úÊx~pB¶iJÿ§îÇ¢ …!™çO‡Â‘„ö$ ]päÙº5VÓ74|—¦u«›ºÁts^YDåŒKqcÓìt_:øžØá ¥ûФ6*j̵¦’§|°º§ˆªóSq«XöÃ#tîp£zã á=Ê=”ôåý¯�05îò1æ�Tÿ@AØ{\ir !ô5éÎó' |à7Ó½Zûëñ3�‹p™Îô4Ab~z^–Œnx>ó‹2)‡¦/åý@4L/Åî/\H6«äÃhPÁ¾�ˆÉ…r &¦¦…vÔ·}Œå§8xÒ ôEm4S9§RÆCbKÛ °½-W :IJök— ¼½c gÆ·• ÙþŠuÌ‚ÊCJ�/a™—7�Vß}zñúJ�OŒ]Ñ8~ˆ5lOÍVÖÞ#È·r·�çGWQ-ƒã"Â|îÜû¥<�Ë VÙoé1/íË­sTYpÉ$ö‡ÛÑÏÏ=|�gëþhÿŽõç¿M~<îVE>BÜ@z‹Ë“(XÁ,9�ó �8.�úõ ¹ïÓ²O�€»1ú>@"ÈRycF½Y£XÞ:ð®#øÖ×+-ˆøeñåÑ Îvô<ãS··~G¼?íDä†\ØwpmÛ+0(p£Ãà8õFÿwµ¿¥S$1&!Š ;µZ Q\ ¶5$Z?„åKMÉBL…ä Ö€a}~1繟/å-Ç1M­ièÓ¦3«/$.:^±c=UâLî×xÞ‚B3œðÐ" 9³6Ö¹åÏ+¬�„„`µ.Vš.Y Y5m/ÆøêOrÃð¶ ÓØ »EÖÖâió /Ÿ{>Ë qíA Ѝ ZE95n&æJ¨ÑôITÈ íŨÛ+�gE1Cƒí!ýîg26ì]Âq21Õµü?³¼]ìš=§c7‰!‘jݫ̶QT Øf_æYÍcDeæ;ð­%cM3AD@™â—å}‘õÖr]úûn{m‡ã\S[‚èA„ךå6ý×–­ÈˆIÙ˜6h62f¸¶B‹ÐÃ+å •A º"òI‘nÉmm† Kf9½KÓ,ï×û~ãÖ™mäß]S-Í¡xƒæÊ抉Mº\ä¯öš¸½J´cÛ¡jU‹|¾ù²sÜj:ö¯U©¡¨Wš¶ŠÛkY�T/¨_Ѱ{õšø”‹ðþÃQò¥¤@¿„…£Àd×ÐØ ÆêÝÎþÌhûÓ‘òn=äåJ{×;ž´,  =[Y�¯m½Ú~:_ˆgÆ]~§h˜^Ìø0Ç,£ªwˬ�JòÌ´mí:%Ѷ†Ûa‡GÒ6�K—ÏÀÃÉùƒQ¹–�ß´ªÆº MR›zg \b�ÃôžÉW-0Ù¯¾ ÀŸµÌ;æt ã=~øÅ"©01éE&]i9$lJ­d€îsþ§Êà›i:VJZ> 0CVðí'{¶>Á{1|ϾNóv¹î^4æ˜2� O¹©ûG½ø¬ßÄt¨Ž9Šnú¸V"c¿¾¡·ŸÉd‚ñ$Ô²bn©AetÐe¶ÑùóÏùYиLEG¤g÷¼³ØüájãêT\µ*K`°+hpœ2õšõŒ_U|‘UѬ—.t´ëŒ$6Ë3ÓÝ÷ànŸmŒuâé/œ`¡)�?qjœ  RºÛaú ]íñÁ<Óíyÿ•N�n­Äü÷Π¾ý@ÞÓ‘bLzC™„¥¹] ƒÃ ¾áû;ÉÆíÆCȶ�o6ü:£r; –¡{óå¼mªŠ'¤D±JãÆþý�­X½ø†ÈCðq¯/PF$ŸG‰ŒI»…L~ä8Èʲä>µiËо.'PÖ\6UÃ@®îšBÆp…}Éø¥ÆG’°ZlY·vv>ª›êÀ§¬„£γ¡,vºhè‰ä^ðÈ~wÌ.þ¢á¨ç%§›ïõÉ/†,”n2Knì´ñ§�€¤ô�õ C™Ó¦ šnAÚ‰B„•ûz ¡c²ÌÄô4yZ™2’çâæY”sŦƦ~ñD¦˜$Œz—òÏŠÉDVü“�Æö)ÈjO1�÷ ¸‚F|*,½Ž XGF8Ï»P„È—Û9ÛÀÖ6>KP_ Œ_¹ò!°sä*ŒÇ…”‹­tÅícªoŒê2ØQþ2ýø&K¢Ð $ioA®);åHÜüƒve8~Û&]/ðUëO®7Jd#{Mu¹ôpy¡ˆ÷SR³¨Ñú�Ö\ë4lïpu–-±@µ™³0†Û;RеJÁ�˜¦B‚û¸l¼Qò­…Æs‚~‹^ß7´×±wÀÏ‚'e§aOµ{Y+~Þ Eï=OxÞ–qPÞgYÕ­²óÄ("ö× ¾rÂ-+�"!+â°ñÝ©`ºe�$êÖ°òG¢«9¯ }$tjYÄWoï£Ý•yÝ:=“ª®#ãêfã\oìAsU¨4ˆæpF@ïÒ¨¬�¡\ FXm…Göò>‹FEq3뺪ìe¿Ið*j2í{5¡SÓæÆÌ1ª îlÿ¦»SÉ×CaÙâßÌZ >›äíá\¶£µéñ§8Åd´Yš!B¢b½„sh”äÛ7 p¸]jÎæþÜ]§Ù_;•øKÞö~áâÍ¥³Ûà`øñãp¬þá †çd™sphF�keNÿæ&ý‘ø¬.;̘5ri�Ûñq ’RëØšðn³#™õ~ô�e+¼�˜AŸM%’ØlnÀzB'O–¶=c¾Á‘z�ÏÜ/„2=‘pN Òé‹ý1{¶`gäe¬z>eÔÔLÈh4óÚ0DÐöž#2dM å.Tm�w]‡¾SÕ‹#Ɇ·uIs€ãn×{~a˜FŸ dq×2Íuòî›°²h-þxlO‹ÌÐ;Ú–~}ŒtþŸ€à»Èb ýn Øán-�­ÿÕKÔœŸÛ­QX(f@NdÆ ="�æ9äá?±uŸ²!Eiê\“•ù4#À qM…2ƒE;Ú TûÛf4€¨óáÓ¿Ô~ó9ø„›Ï•«¤š\žÓN}¿„�‡¶Ñ·@´€ñíYÛÒ>FÒìúR"s2 (á°g«8œÃXÄ�riò�°VJT`Öð­~Y:�KvØmó3rÛ8á‹Í\lŠä¦¯`§ŽH/2cq�—Y* êå’M€º6ÅÁ¤�²2£|dè{]Ÿ;Æj稛�ø½j­f$¯ýEȽ—-šbäµ79ÁL‡KVŸ‹4ÅŠÕ��9�g•&ÈË`¤0“DŠQt _«BíÓ#ƒág§„1øùãÛ½~cvª- aRéƒf¶‡42’›.¡ûXÝ'=Y$~ëQ`?¾ üš 6Öå^9ClOEáXsøwàØzÄÊ9î4Z¤¯Ú1N‰¤þ $Æ…ŠÝÃnz} º¾=“Þ‡ùyÛ\kU#�.|=#§@©y݉Œc9 é8ãJÍvè›84Ôx´Fyl'É´ãÛ^‘:ç–Ø®S¯QôvàÑl·0¾ó‹þ�@Ž�¬Pè�v앜­xbgB�&&Ê%°ÅR;´Æªw9¿Cû /GÒÅÊß•Âo™v¾Ç0?ܾñëÞv5ºþ(÷leÔµþÍØò[…òìimFpãðûØ…�S¯ féÑw­Äw»ońǰ©“Aw˜Bè¹|õk°^Xïå¾FµFtDi/Ä´^þë/}óÚRÁ^Ì6g¶ø¦÷ßZï9JQÏs¤Q6.Eyç~Ï,×^Ü:›ê2!€¡ •MÝ”l¤Gz“Ii-¸G[ ŠJ– —«ìÜU˜² ñÍÛ÷þ™Í�UV“B_«ê!Œ?(„$€Ë.Ÿ¼¾7• Å&?Ÿ}=#i:yÛ/Hü+F|eŸÝríÊØ½°.·ä“`†Ä6•ýµô;R¨²ð J~îµÏ¿éŸ¼Ñ£r·bá�û¿õÆÓéjß(ž~¾²‘Ÿ©THÐÆ—M%÷-ÕœîÜ(cOñzòË·¼ó^¸µó$°koníãqY* ¨FáHéÎL¨8wâ¹ß¡„|Ö\�tz#ÇNÛÅ8�e¼tÐLƒÃm-ªðèêÚÕz ý4Ñ‘9ô•¸ù8•o=HëÀ̇"ôæcÇ�£�FÆyÇþ®² ¾Nâù^Jk^;/Ù̵sž�íÅrR&N †Ø7Yx))�8P&À•V ‚)™šjhg Æ[³Xä Î&hípPbKúcAà‚ý÷ò†kå½þyÿ4=¶›½×G>Í¡ŒÞÄ~²Ú—Ÿ oÅÕdlcBê–Z3�<Þ'Š´éî>™Aa\‹�«ïë�>Às¸ UòrÔb«A÷h}]x½ùº1 �†uºÆ¾17ú\‹daDé^/£ÂÅ�ëÃ}yOvêØ-¹®Fµ¬ƒ)»¶-Bn7ÀA²$‚üσg£"Ù.ó*ùÏÁDàôWI£ÑžQø‘ÈâêÛµbÙ!ÂuJ§]ócÚn¨ö•¦þç;vñhÞÜl%¨—Ä9õx†Ó¤JpQá©:uË@c‘¹±¤¨œº®‹Š^¸AÎìü(ä{~“ð¡�­ Àòž|ï!†=Qï("êà™Ôä­r øu¹XÆåG ùfê+621Yæ6EçGÞ=s½.“é7x"ùï'˜`X/}~[ 0_ûdÓ c‚®”Õ£¨ÈÂí±¢qôòàb«ÐzM#M= ñwíŒTèÞêW•‹#þ+‹_Ì™08Bpn·µ¹•7Í´³ý�sbmœ³žŒ ™ /±fòxïÑßJF¯>-fµxYC¶&oŠÙa�ñYŽ‚Àú¿QÁ�å†Ý#¼ôs ¾—¬$?ï:hàøë5pÎ9^ÇÄ<⟛õ©§‚éf"éûîåù§Ío-ò•Wr錄7*´�ÃÃá•!ŠHaGw}ÓèÊ9Š(Kq$.‚GiXMãX_`P�RÝX2ð(€–^÷u÷ÁèF¹=ø›§há†)–FåÑ—Ë vb­„ÉàâÀüd�ÂùzQñc#-&€‚“òœ;·ª:Pz~\írÔ+& 3‡_ …T÷ËÙÁ AËô¨UðžUìOçÃ×çq¢cÒÛ„ã§Îg˜�s±a£”`ˉì¿K~!ì‚•õ¾â`Iõ Lçw¶¨ä@`ž›Æø¶jvUdW?ëd‚�íÿ é™/Y.œRî_¢î‚©ã¯¨b¾IMÿ¸ŽþqTO{WÂ# ARÿnz*Ô…„L‰Õ{9�X¢‰èG%büï¸ÄÌ_m¸‹è4øæ—û|AXŽdY¢<ºm¼U'š°ÓyÍïXv¨zÉ[Ì×–¾÷£=<]ÖI­ Ã¼ $¢ÚX®ÈR¸`]&š,¤wì�Δ},¡•FÖ¶uowM‰™­H{—¾9fyØ^ƒ|–—iЮ&t‘¿J.êV.X#^Xú t§…[ךCÍ‚u*8À«ÛKWVªFEtekF­Vß1°*š�‰‘E‡}:ì9§7ëzüÉYþNÖÐ;â@Ñ[`¬¯kúØåËBµõ÷#•w. Ù>° ¼+eÎÂ|+¬¿ƒµÏIGºžFçÄr±—³=µ�‚†ºªøÞ�cãr.4Kb£3A!#*›Øëد–ÊÚ‘£Q U~ðÓLXm<"Ä‹¶˜ÊëHÁ[6$NÈØÎ\UD£Á~ Å÷÷Î�ÏhvcŠ›Û5ÞlߦV¾üÕæÃo8�ôÉé ÈàŽt·9�†n÷ëËú#ÐÌava�IÜ´¦¸BŸ¡}ìn0‡�¥Â›ŠdÁÑ �ÖàÍKB‰€‡–�‰£»sIÜ\´T¹é�ßó‰Öæ¨f#»ÈA”Ú|#Û ;H/´ÚÖ䉒lÝJš¨ GÀ®hØ]|³WÄ+­>´:(“Våí8¸]A5)¬kJ+‡ïÛHhæ¿£Ÿ´PëO—P:BöúWe¬ãž\ˆ Û ¶æ—£ñQ.ã~ˆ2É æÍV«þ4J-M9žGóAÔó"ä]üË\º�RxSv­ }ã3ƒߣƒëûíÛ0Ÿ¤eþªR9ô=_„TBü\hõê» ¼Öå±’Æ4¢oLJä.±Sº:«ô·’*ë¦#ßTI�UJÐ1Y, 빜ƵRpæ/(�)}Bìä^ƒ<|÷¨e¾çj$9EÂÎYÁ⩨ƒF©K±ÖÍQ|a�ÏhY¬,Dbc'8†½à<†&Te¬¥îm�®¢ù æ—0ê.|‹±U\£ ÈàÑsixÁáSŠq�ö1^ÒÕ•`RzÝ[T5i92‹x<uÿ$"É ï/üN£Ïý«ff F"?Ãþé~×’ÙÝPf‘ˆ7m°ùÜuê_šúŸø{¯—HDnÆ1‚–ãû^¿¯i!x¯´”^GÝÍšŸ^¼2ãñ8’2˜?&df>åæQk  ÈR+î=�ä� ŸÀ8û/Ï*]É·õiCÜîß½•�qüIÝËihª�ó à*ß� Dv{˜ \ÆÏ{Ýe™Mic+9&Š€º”rÓ@f³)Ò�\Ê«Ž�pÀ�‘ +ƒëNËábDú»ñ^ {¿™)Æ5ÍP±“êøÛŠT°›i0¬¨:³É � ‡IXo´Pk c8ó‡ÖòÚ—ÎÁÔ”6Žãh`ßJºPè!5ˆ«}”Á',î4CHöÙüÖM]tÒžØ×ò&1®rš»óm¿éc-.¿qÿêü’³™«‚t3n¯€µÒÕà6—ÈÎx„°,H$y s¼m^±@2ÑW/gbå…Ï2*‰qÉÕ;Z7µ $ ©+jáSЛ¬’x[!Å<°kh(Ø�úzˆöL/N¥Ù�‰ñå_öDPE¢Ÿ<1y/ï”/q£«‘ï˜Ks¯;(1q¤×o¯Gfåž' ¡ñ‚ÝyÅ}�ù9¹qZGš@÷=y**�ÅŒ‹s^åG H8ä ÷!´"ø¾ñÐ^i�='¶�·0X¡‹¢ã>eŸÈ–µ×ņÖë”íƒß2akM¯=îã"ÞÖ–r½„6Ýè‰b/ÒR³GŠ··h¸ 3 ¾ÐÀ ¢KcÁ|' ù³®è êö0X³‘áØ@ç‰}°N—Gšœ+æ;!ô7Ó)…ÍŒ;:Ò)½°�X9Ä훥g“ †wm�P.Áô±ŒOÜ@\Æ Wס{>Ò¶b£# {wé£< ”6]}Ⱥì;ÛÃ×3‹�ò'e~/š5UÅV¯9¥ZøÍ,x2D+h�‚‚-?”ŽÊQâ„ðŠyï¶Ùo²B†9ÔòÙ.û4eáb£n\š³jÚñ¶¯}¥`(Þ05>’dÝî—6mËN²×Kê5–™œ˜Zš.‰óp† í] Â÷ÍYiH®R–a˜ŽcºÂuÍÆNü vç‰XéjêÖ ÃJ‰&ó[•çø-Œ{˜|äF•SÄbôim1àŠÇF+Þáâ2�‡x¢¾J#¬i‹Õ 7ñhS8â[‚vÔØº•pFf+‹ÁËäF)¶jVo«lçèäÐqœ®Eþx®|¶[�!�s^f52LH™EÙöaUtÑNäaù�®,bG�ÿ#%=u³gˆ©š�Š*ðßalol/Ä®»×L?¿*ሠ BFɵÄ/ uh„BþrBÑKhn gu–²‹ƒ%A†M Â�V¤¶ÚÝ~¸¤ƒ<«e–J/çr$¿ZýÞX)s¶KgÁ‚ÊÐLGÑ,›ÍI…áHÁy‹Êà h€Ÿ»™åþ /BÛc&õç7÷ÃõÑ[`¢ÏY¼[ór1Ì„i¸¯#ZŠ®™{‡}g–>õW¦9u<ÞxùÛ#N×Rº§dðeÎcøgß±Ït…Æ”\.þý?0Ž}Ë…'÷çC™×‹&^„ᢧ•‘€)¡­í~Û¡-c hÀ†„_º[‚¤uŽ×üh�˜^ÿ¼Ô|\–§ñÌ–žQWƒÒw1”­’™ò] ?Ç ÷Ù΂ÙÁ>•ÆOÏb�<Òk§ƒj|[m¯ú Îs7)­�”ƒßgg“�H¶Táâ_Ô¦ÓIø^ ÚÁ /g“å÷cµÇ* W3Y6Mˆ`¾Ú¸-=2¢ÜNòu`—¦ZÈ’Äê—Ñ…F•Ÿx9 ðA¹£••¾¹¥@|7U[œÒ‰-6]:Ú2¸«JZ"¬jõ%v”KCí†êæ5t6�ý‚8#2/<Î>C‚æqµbâ�¿†ÞÓ^öƒ@F48t(b?~™|E-·§Ìï\çç`ÙÊLêàñkùŵ•0=ÉÈÆ' “¨‘ì«‹ù~æo{³¾ýÕ¹—9ó5ã\ˆ«ð÷±¬¦£_y”òðz´VÌjF¡nÉО Ù#ÀÈ(ªÇòª6›i-ðÆ0m«^4¦D^>¥æ×oýÛHðx/•”&ÈUQ�Œðbð!Š9<ÊÛ߯˜ûË¢O9ÐmÕÇA]*¸|úá/W�¯ÆÑéIn0ùR©Ÿ?abÒe]çzù~Ìs)@!`÷‚_s®ñÉw- ×è=ȹP%"¬¿_Ã4÷t_[KÔ°¶úœzè3¢ë‰ÀÆCèlcRÔ½Ôi¼'Õ¾óa`†{å £~óbú¤ô¦ð˜¯ÛÝòLT|Ëõó�|\ë#»ÊîoB¡|,!*_ª}ìn9l¾±å ¹˜ï·�Œ/<^duêigšÞOƒ~ æ­ \âeL¨]ÁW‰“gÄ8 (‚7˜¦ÈŒúCzÄW{k'"0)Lõ™"m<òÓ|VÄcýÄl.ZðêöôAsîØù²ôÚ×ò‚2nlƒÏS(’þYÞS&."æŽ,üŒ^VX{ÝIˆÊ<)ØòzÑ+Y@¸«w[ïxľã¸�¼?îw$o‘¿´ÁŸz Xð劷q3æ8‹Œœ†Å=»[�ÎÌî/ɶæëp•}]ìüÒêÙ†=ÿÖCÉ�dÆÓ¥‡ŒQæ»ÍØ#Ñú8Á$`_¡Ï¿\)‰`Ä´­UŽ[ I¥1Aÿƒ0Î!éá³è²N/¨·�‹fÌÚdc¯\sêàš¯:f?%¯‰ïÝð=¡ÌµI±Ž�¢…º/5í{ËO£�0éV&÷ˆ€†¸ÓgåSËpe²>l)~Ëسѱ�r_²Òñðû‚LM ËŸ¹kýS2JN)ðcf�åmÚbfzEiLiAƒ F^ß'Ÿj|y¥J–t’g2oïŠá†i�§á~79LH/ð`ÍGüÇeǧ±þN¹ºH€ë±°UÿçÇßD¹9炾ðLûoÓ°7Cð†.ÐB[°HߥñÂHíñtoLôÿ6ìûë÷ï§{ÎCþ0‡iõ“Å£š† JT cØB:L‹è,«EM¡ÌŸVR¥�?hQbô'«EÎE ’”#%r'ôˆ°|„@Ô¦›EXHJ Kˆ¤åD&è|J^žþ1<’´|¯ôUN 1ü%pœº¥;òôJ5-'9sÓ'Yr.>h©ŸšIVçÿ¶#\Œ¨ÇÿVð�zôoà\-æâkÏ÷ÿk¶ê¼Õõº@qqxæÕùBæÜ|} ¹GÉ/½ÍÚøâ;yL1×Bú6•Mè�X‡Í"zó��ØëçE�RºŒ­H¢èHYˆ\ù\vŠ›ß>ëW£Žœàè G9lj³ïwïþk+~Ý+ÅMŽ’T% œ.a‘Ÿú¾ÍýÊWbë‰Á –h<çÓ»¾Vbéê>%sŒ-{3Ƙç/§zý!üôôv?8¼òĆý1ñZ{0›LX…hC•�bgÕ@ÿï_†®ÊNfÔq!±?‡±�ÏR”fÜéB`¤»DÈy÷ôywƒá›<©ÍB�Ië–^U CŸoå"™/_�,»œÿ<Û›«d®ýZÏÔ–"o7NgÌV݃æ“þv™3*1¦;œYfàÊrá%IÉÿ¬’ÊGâ«+ù Æ!·Qx”i»Xâùçüˆùò÷Ýô9–x´çWMw8òçÝò/À[+ù÷Y…À:J¦·ÏÍNL[©•ÇúE 9œššß§¾ÀS ‚1%BY°SxÚHh Ä‘5ÅmR›ˆc*tQ\ 2 q΋РyC˜!íÇ*ö8ȸ_F¤Vpü·>õKèW¶¿²J[I :zmÀŒÒ\¿Ávw�Ÿµ�|”‚FZbïUõº´ß’íW]Ýu”úø9¼MêF´öÍÏó®–¶ziN·`Wñ—“„€’"ù‘ËÀ±ï°î|v¾¬S瑾aôÐõÈ“^»šÁ1Ôçç{|`ûãcÎÊØhŽ5Ÿ¨ä ‡Ã„|ÈHš‰ÕIaå-Ö „g‚C}L€BŠÁäÔ¨–ŽÌÎj篢–" Kpj<ê§XÀ¹z€oîy}»:�Éë¢ ˜s³»é¬^j9�Ý‚‰÷Î\ ¦Õv ß l† ð7¬+ü>«í= ˜ï—ˆ '/>K¤l³cea¯†Æf†æ\hì0yð�Že÷Dýk7] ”×F“¾¼å”Åo*cØ-ÊÀY2’À“ áäì7—GUÌžˆˆ[,¨©+Š RƉ•5Ñ«¯MFÖÌì"xx¢º“ËÁôç™Ïtñ¹­"9ñ6Úuá™$Õâ(Þg#yÞ—XO]•nŸÖÿØ_?E04¸+Ë ý)â2Ü«Á6Q°h¿êüí)Äxoôžc8ºâV ^ [\lšÖò×ùÕ0ß‹E^dï�«]-™›ŒTžR¸t2—Ñ3fšLÄÑ1’VTæöX Uù=×á$ �k­íä_ËÜÒ52t%¾Ðaèq3óÛ 2<U°@(7�½b††ÄrÞ1áÖÚbKØh]ÕAZeÀÈ).ŒNÊ!µo9Í\.¦03t5êx"‡�_öËMÜ?k™ M1¡(EÒßD#Gì+¡¸“Áû:s5•=”Lu€ÿ¹o®™ð2ƒÖ>‘ŠæD €é«H?Cb ádÄøÅ>nÌäøµyªÎ�5¡9Åî%ôWÓ!AˆA‚‚ÖMJÔº�^ Ú链ïè–ÐÓdpß Ã �Zõ„;hP�³%ÒßÄ.¹KM½Èì@½¡²Ë²˜#Cð«g[CæK�=18uŸ�”ÝÒä>UM0¥Šƒò©ÄºçídýZÖúÖD·xû¯ŸÙß Ë�2·ƒ‰èlù£6vú5WŽ=ºÝò…MW4‡Ü‚Ï_Ä= 5=m º_úD €fÙß]®|Àá–H9“j”^Ñ@­c5äßÒŒ¶/�÷öPfFó­,¶ó[JÅl>)ØÃ¾é�¯¿øéŸ]õAÅYF_¼âÖé"¼ó9�1T½RÓ&”oÞ|] ÿwÿ'8Úó—xyGÄÊvè¨pò…’úó§6ûG™â)Võ”eùã9�®ý+ƒ<¤œ<+h1¬D–¨Õ£Ÿ*ã ¥»`µ¸’Æ[©£º Äq\ÿò­ñÿ FÙWÐ#™�À'D]ððùR~ˆ�e ´5ðø@K�ˆ§1Õ+¤3¥«X˜¸g»(l³29ÈåA ?€ƒñ“œï;H$¨LsLÄAÆä².ü8�sçõX\¬( ¼¯˜ŒÔÌÔfüÙ*,´%ŽÝ2•¾ZZfîœaZn=FvqµIO”c¥Ã ‡Vs²FAFÕˆ©jcx?IɲrªYŒz»¹Š¸z5ßy˜aˆsØ&—dÓpãRò8[xÀVÆL cÌpV±“TÚ?lÔëQUÿñ°õ `™”YDà þörôÀÒ(!Âÿ„3Dè°NY=ŒñJ(6"Z]ŽyáC]IzM4é<15Ó³ ‚âb§|ÖBD'aE«�yI]d›4J[Á&ñ6i„w¼G1ÞçþÛñå oÁ³ß ‡ºF½£åƒm,€=d$3ø¶Ó1 ¦�wM�:•£?cð¤>±•âM�Þx¹ ­ó̽›+aöî:²¢d|£[ßUëí› P÷˜ l“ äõæ †Bê÷èŒãé¾6vÇ{\Õíi à?Kƒ]÷§Vó+ÂôÒÙ,�%°ÿnínc…ӕϲ{øê~Öüe7¸¨úÃ�, ÖöpöM(›tþ𽽑…fÚ9 ;�Šk8 i-q˜™‚²[1šgU¼©–%òmW9åIZª?_—yÁ¥ÈzVš kÎä¦TNäá› H0ìI¯[Æž­“„´õ‚0¸?}n@BdKVžå‹‹åÇÙ{߆½)þ`«¬b§H3³¹ñl¶á)‰xrÂÀ¤d#\µ½ðXÆ'KÑs5bÑX1 ‚÷ >§é•Ö1Ã|Ø XrNàÓuæ—@™ð3eœÍØ’ÁÚÚ�~}ca}\Fý´y®îíÝÖ:&—[ …Øû*wÀ¦3=«eÜ®_ûrþ'¡ú>ˆÚë)_6dp½Aá$¶’ñÕúz í»âï¸Åy| (¿‹-ÄüÖ¾t…²2Î|í¢sþýŠ·À pµƒ}騨çÓð¬³I€Àe|~&‹Õ¯Ük:™ýä#4ìZí¿Ud‚†ØêNDÁ¼E ¿ÕGQ}¹‚ë`6GAgsh+)vg1C<�׸ 1£[ŸE±/„žo·Ï.rMá˜,®y<% F¡ 3©—e¶q›8K;�m^b_fý‹¦É‚kŒdT�5T†«“�Ýžt³Ò¥ NN•e ÇhÊrÙö„’-Ƀ8)¹2VËkˆÿÁü:5Õå„dz «{Rù¥oå0ÃüAû‡;di‡'Ñúóƒ¸�énªªw¥6ÎIÒRØ>%ŽpX¬H3ºc�iFºXO–´£u¿¢ÃA?æ/&W2¸çNäi‘L )+,Øõ3&=÷…<äfÿ43Œº_®#™ ?²‰ÿ'ñØ!$~¨Ýmã³WAÖ›M`8¾1dX¯²mº;XOBfT»‡ ÎsÅRbÙ Œ[”ÂÙYP6q½9˜&š±AVËùÊžÍÇüqÿÚ1%”ßå`ÙÒìáI›]ÚÒàEɅɧþc-wÒc³û:É¿éd¾ššÍ®›ÁêæÚ�Ñê[¯õ›GÑÊŠüªÍ91!P1©ù1r8%=µ6¨^"˜1ºŽ1¼ñ÷ÊŒ!›ÝŸIõ¿¬tnù¹�H_^?®üå=ÎŽ�DZì ó[,Qì±("í 98`à}�§À�<û‡Š?gg…¼ÜØ*<*�Øÿ'ÿ"Ö‘D¿Å¦Çë¿�•¹í2\åæÙ¨èGÙÕ ¿ÍsF QñåÐé³8|né"ôÑ3‹•¨¢0û«“OûÌfKµâ'æÁîV›( 0Œ/OëmÞëÑK´Í| êzÜTuù}¼õcç‡ãlÍ$`Ï>Ã5ã¹jffÔ(‹ÿž¢µÃÂÝ9ÉÌ_)>d9upBþÖ’zÁ8¼WXÇ—D,Õ.:˜ó5R/}Så!L³œé“.M#ð„ãuTîMœø�­§Œ^³LøD¢‹ Fr„&…{½Ñ]ñvM]jÄ�ÙÊôÉT‹Ë«^âä�pó‹¨-3œ¬$Nßjï—0d±wÝçy‘ŠCÄ.äú9"Æ8x*|ê$™ˆ“0,™™ nµOrD‡RKïG®F£h6„¦iÍkd¡ów­6‰ZäÁÙ{¦\#8i4ã:–ÜÃÄEÔ©¡£„wËŽ8ómÔ�O§1:1Õœ‹Œl¹aßW5 9ÉMïÈž2f¤Ÿ.�”vW „ìØ|”; Ás�ˆÅ<®¶ÂWæé¦2uåÇ'HW9Jí;ãÇaÃL$*áIଧ§Â]£.OÒqWŒ'—i ð¦äqáÞ§q­EA´6 _Ì燴8$~qŽ/F®æ[TzÍÒ¶/tP�g‚’�õ-”.›çÃh†ÐÊX^xf Š;ìó›œd½PqG‹kºN”rΊWÕ©[Ò¡N†öãÀÚ\¯Y0æ!=î´ÏÙ»c–õƒ ÐÖ‡Ö¹oqÀ{ÐdÓƒEû’ž w�•ãÒŒ1Ô�Íy›¿‹ôíÊOkóQ0íËÌé„B-g˜Ò¹n4›ÂnÁ$ö©ŠI Ýྗµ Hñ<òLŒÑB–›Ò^GOxQ²¯�måú7Œ£FIu;¤Ü¦ûÞb„ ëîxú.п ,çÇï�`ˆ�Ñ—Âíïü“>àG5²3} ùëU"àöרêCfg?f3Â<ýàÈðÅï)ŽÞì5¶$"¸9†ûƒº™pµÓq¾”_oì°CœÀcš7^—X2îùE‹„XÓÌøåZÄeà'%wPFœiE¼+ì%_Ž�µ æ=X]PµÌO³ˆÒMñÞn<Þôä�+†aVE[ÍòµÇFvõµ©¶¥àéc ¶y­-àýrÆ0l»dËoQ“ o“ †—ð.‘ÑU:ñ9ËñT”[É×§d4R}³d{¦› ˜&ô’tÉJH"Aþ²i)œN³óŠr½VXúãDmGg:~Z“Ç|ŸÉæ4Ú�¨²LO‹¥oýÑ»+ãkïFx|óÈãy z†_ã¥Ï|ôkqº%d£dèœãt*,�p lûœ9QðºHº'�*´åï…ñä§�/ö�ˆt¬;£°O›Q‚ó$„½*‚žÞpá¡+^i 4�¹Oí¥ÊCqaïǹ[xÕ“Ëé 5ˆ‡<îÕ%ë™îtrý,û‰…z—Ì{ÅÛy{S÷ÊÆÈŸJ]Æ÷�«ihóâÕ¸•F¡r :mT@Kƒœ±iH��Eöˆ°+Fñ³RÜ‚ÕF`—6hcaTE`ö='"ÀØ{ù¾ XI‚EºËGh) ÒÁý;ëÝF;iÞƒäT˜Ç¶pƒÝ\MŸ�>@q ä¯�Úgë.œ Ði ~ÐdbÚeùÈæw$Àø(ÿ&½Á¾�†/%·[ðô�ê§æødt�˜"N‹óËÆmWõ2"·ˆ:<2ŒXŸWÃk³Ž­+ù¸9À°ß—,2w\�} ï‡ý³$»ì ¯Ÿ„^Ó—Iä�„6B»ÕÝ‘“ôÿAB�6è~"xއñC)5´ÿF·½r;ésIÄm²ÓTÞºä*Ë ÖÌ'Sib ’A¨Þ'È´ƒ¥vT@ƒ×Ñe„Áy6´;üö»x„Ýà˜1 s‹ð` ó‰€~^ìïúDãrê’£ŸÂï¿<ÎzïŽoÌ@ò,nÖ… Ò 8öEá…–ÂèH{‘#ÑfúÃ�ÆÐ�ÍGzª~ÇOgɬJׯ\ó ÚÑ…y€9ÇL-Ÿ(检âÇndy«µ²�3æ.¢¹�sÑZ¹¤.eóÈæF[Zÿˆëþ_ÞßÌ|¹lþäÁa×Ùå-ã7uì3)åý5Ç„�B­ ྒ{«]†‘Ž>¾2€¤@Öý‚ ˆ7!ï�|K�Oš¼.�IÎ-�±§µ…U6¦¤&rÙVd´8 iq~oz¬¦â"K›Öð FM éƒæ‘øbû_/�/ ÃÉàÐýôÉü¹½ûXÍÈQ)Ú[Ÿ°¨cÞu£P&E{Ìq9"(ííǺyâa]}ì··} íE× ¹¸î½RµÅ{|ú½³à7y…%ë@¹¾±«}¸ûöŸÏHMt·7Û_¾hbðà¾TÏ}ÊͼcñwÇ�ø'·�qè1Eaj)ƒ¡�ÆC.êÿ|—Ç~|7ÂO×>)tX‹á–J AHøé ­ðx‡J¡$p�Äi•¤Ô ¤B“ñW6ÙÍ�7ùFw’±è-&µ�÷I4¹}ν{æ~úHæ/~Koκ|eÜ%R •U̓ùã¹YAS�›ŸÍ•á�qï«}¤ÏyØ'é]Æ|Œ½Ê‡lŠÏ¬â/àÓT9û;¬§©òÜ~™MÆl;NN»Œú!ßKöuEž¸õÊæm–‘‹×�žÞcû¢ù<—µ#¦d'ÍV'Û犯d3ouµç5¼F¡ÕsÊĈ÷4�½ÞÿLm�@­&=—½2ù4YÑb¥'ª$E4¤˜Á!ž‚¡�H.ÏÆ¶s#½“12Þp™){áÚåô],&Õ *)qLAkì ¬ÎòÄz3ЋçÍô't�êju¦|/AO—ÈiàñàªÅá¦B�/”$)^¶¸!¹Ä|X¢ëÓœ9îý?úãÎdp�x<-ÒSb°Kì3òÞį{hÆ÷»ì_[ß—>X·ÚA|j¥x}"Ðç_Pï¢ñ§ÎÌsX„nŸ2åpRÏß-­iºáüÆÏBpn~cc{­�Œ!@1á™*ßwL{óärÜÍ’$»70)aVT|YÖºkw2ò4[Ü�dw=ÊïcFà¶‘£x&�¢ó`sÙ{ÝýÐôn,ê1%›zëÅõ|&¶#¥ Ïádɇ,v d¯¼?¸°Ø4%5Áz°Âp·• éWÏ&0B›'ý`?ßܦèèA𸿊5­ÛÊ ö'#ÄÝ»¦ÌßüÀ¡½dµ¥Àlðõ65&I:e‰|j‹òsCÁ³’^ç£D½Í1{þ‰XwÝøÌe8ÍNö‚'íaEÍ0žíÁFnjì—?!Ù=E˜ �]P‘ ˜½õYÆ 47xR÷º«æê½Úw5 =ìÙ¤w[òTƒ„ÉLqOޱNsâk׉±€†��ìz-*i¸øÃ¦ÝmáQSï�t×áöëk=Ó9,‚ÈÑÁj$÷5'äŸG¹¿K'k>4×4�•/8Ø£+î*j[ÂÚÆS‚ –»¯@¿HPϳ¯­´·æíâïŸ×�¨ê­Ãû`¦é¬a³$¢‰¹Ú”“�_xÈ|dÉ÷q–u6ÅBLæëÊî C’ãlJnQÄJº…£HŸi·ÅK©p×oì;»@2*L£5‹RΛn¶©rÑ4·áL ·Ã’H$g‡O4ñžþ¿ä$l¾þ>$ÎzKšGìêÍì¥×36õؾ?uÝšÿRý! b⿚‰†xŽry®ßð(èÓ[OôÆÇïÂVxivɳÏ(˜û|7£ÞÁœu3’'…O7®]=Çc÷B_?]úÛCµQÀµCDÏÑøAjäyŠC{èý Ä‘"&ÔšBòÀêB©Vk@)UñVEÊÁÿ70lí6„v«vC€ÚSÁ7l´O2MFm³¾ lÛ¯ü0¤µúÀÜóð¤5’,’ú2kÄ#×4gÁUgA§N/…æø*È¿Y§<œå·ö/¯‹ì—Sô!C`xHÁªÞê3¼mˆLìcY‹“F¹·Àâø.ª…Œ žCØt¥|eèaOcYxü–æ@nÛµž¼н¯Eñ�ca³„u–´aM ð¶£e˜°„r33ÚžÖg‰jd•ôÛ•/�½3÷Ï,˜ôçó—F2FÆõao©%¸b‰T;N‚F’,óþî*þ„ÍÏå’îÓ‡Cˆ�ë_þe`ˆ`ÐñŠÊEt«R‡›$Ë¿©¿}¬†¶éSógbŒò;“Üõª8b£‹Ýƒ�ƽæV'µÎuƒt†5Á¥Ìx€³ÛïÆ éø‚xÖ�sq<ôùåÆ˜®#~=Á;§Šg¢M(p»©‹ÿƒü kÂ2ô®šðpê¿ |27À'˜õÑkØîÖ£weÎb†do¥æ£ Æ!™›çׯ«&(g+¢PÄÉvÕ  KFÍ ¡¦À`Æq&ùó�K©1Ÿ4MÉ™ípÔ+j›ÿ:*úÏÃ6r¢ÿHU·Áoí™UÐà‘'ÓXð„ƒ"K•÷1­„ûý…¼¯£MßcuBa,)ýl&\iDZQh@|ki”8î"°�ºÏäVüøJÊV@’�z¤G«4~à¬-Êúb° �¾^ˆ.Ͷӟß8“÷…ƒ øA‚+¯ïâúbÛSž�ú BÛÜüü+ID%8•Lù9ý8Ï5Ÿ‘þ~BÉX;˜8êË©¬¥½¤å×—2ܬ[½bvðýÞ®AÜŸ2”ök´.+'´ó°ºŠ€W’•£…róžÔ¡]àœ$-„'¾eeݳ[”ä@æ{n²{,ä­æEHµæ(ºÝ{† ãËN¥mê××VvÔnò9l I°Ë#œŒïwÚ01µ4h—N"æ·;wæ0áûLÎ9ŠÔW›[Ç=·Ê÷펴À®ßÍ'Ú‹ØG„¾3Mµ×ê5L_úêoyìˆAá� #¿Úè�ø'èú² ûâÛñBæ¿ÛéñŒW;ãÞ1ÊMa¬ývöÂûGd5‚Ûù!�–>ŠzþíÛï·z]®�ƒ~gç´n}wí6ËwÉ!¡£^ŸGÄZÊ>0/šžÝþii�äÞ[yÈÉ—h·?`yÄ!î¿Ð -p6«XCÐÃàÖ}º·¥f.¬c¸}ŽThƒÁ9ûb< åGÂý̳�eÎÌšæÔ| Šì†Øó^÷3·ææêå…^ ÷p#7ØÚ"È,ìdS¤ÑymEš<÷c1ÈéõXñŒÖ œ'ÌØ ì™{Çð‹ýÒö‹ü¡s“ÖÏ÷*ÖQ³Æû¸V-.Ôwÿ+`EBO¢¤mrUÏvÔOåÇâ-Îw¨_¬?Ylã¾ èÃ(üV«�dc6k9(µCUum¢ �Bbªl2ŠÊnXÎ ÂŒ¡ ˆ×N ùMÆ5Aœ˜¥fÌæI¦´ŽlvŒˆ>�X’«tÎGJÆ%*…@¥Æú ·Z!éa½‚ˆÈŸñ™I,ßKˆ�5¿¼v×¥†.sMƒü�­îÇeúÃ;%ÔgöÿƒŸ"7‰Ï¾Ìò`$²HÊÈõLÚOz4h�ÆWmIN¯.à �Ó …j²8qŠÉ„ÆõÚ’ƒ-ÄåWl•žŽØÕE3è9ªÊ`ÇÙjL#dÁsñ‘o÷¹ò7\÷ËF¬�ûå«™�¼rÇo ðCÜ8¯©þTÆ­a±í»²Pá�þz¯Øò×ÊûŸgc_N±8^î÷ÓA†,Öâ±Ä T>7Œ4åß|̽ ñ’)�î½ [4°ÒN$ãåÞæídîΗpuf8ëÒ‡‡Ñø²a¥9}þ>�àX]»¡v¯Êʱ�Г$¶.‘âê8 |]¢m 1`�±¤RjÜZŠ3w9ñ°ö@Nµ�qUäX&e‰" À³„fS-¥æUJ¤=¶­ÃŠbB(þ)åS.JC6=iå¼á/*³{Õ0Ì›xZy±bn)ü+x·BÅêuA5ÌîX\EÈE\ÎÛ[¨ÿ7 ñÒÌŒ5sʲ"¦Mg$­7 °FfèÞk’¡,°ŠR¡›A‹ûÀÚ3ÆÉ³#â0Â-nö2U6Cáj2^~u°Ãæ[ýÂ'öUåêµ0^c?“Gt;×ãBBµ�»uRóŸ-²¥–óÂzݾm�à ßkßoãHd»l.—ú’aïùÎ1ÁèFdAùcñZ&ã¶¶Gêk_´VôowúžÂŸY³ÖBò¥àk¼ýÏf¤ì «™‰P¡Ç·ß<D‘û’ȉjtO½ë�‹ ´•ûo  ì.ɉ¢jï=kV°°«…`ò˲$O ¸Æ¯�OMër¥×4VüG!ûÿ*Ú°tý!ýCÕË )ýÚ!÷¿Éö#y[]\C9NÑHöH±²C,­ä �Ip{ŸÉ±ŽÑE‡„e”0‹ÖÈ‘žñ;‘÷¿ÇY8£Áq±Ÿ-ºl"ßvúÐ؈†‰¶MÈ•¹S®œv‡(Ö¦ûê•XÙ¢ŽJr¹q×wïeÎT3òûòbÒ×ס6ºøÉ2 ~ý“Ð�y>…ô©o|ŽÔ«mȾ½øC$Bø{Ò÷“v�‘ˆÝ˜¨Œ#Ç"�"ㄾÉ"À&f`(D¬ÛA¿äÌlaÙÞx¾’›Ë 7pq“¸À —Lý(·ñí—í.îýÀúþÞt3½_vB?2|*ÄF8n]C+�iS€�‘k‚¶õ‚~a+Èÿ.Ú_:ö1ž‹�DÂ`êrÛžnûG6�({.èЃ [ˆ KuÅr¾ ÄÌšÉnæòÜ—¿-_*ܯbu�ßP=f›wßâÎmjÉÿ…9½ä›w sv­¡�åÀY mùï�l*yÝîÞot’7p¢`åÆuœw•²âMÊúó²9ÁÆ[9öÁS_ŠqR>7ï+Ÿn«àcÚù)VÓR íSn/&üáo[HP†ta0‹ˆq­òY–ð³²{LŸÁFŒœf(üžÆ# *³I¾›=\o¸„”ÝbÜÞ…ÍœVtˆµ€Ù�˜ P2(ÆFW’ƒÄõuž8À”$8殤Á¼OŸ¿Šy†Šä>CÄ3ëû‘U"Ä:_kžºÛ^úcCÓh.Îã@�’@XŽ•æ qŸ‹&®GÓHÿ>ýÇþÌ&~>É�ãö‚€B¼YFÎjô�lIŒ–�¨Ä!…ç}ãï,¦ìÁ ³HB:0A¤€Ñ�Ýoå©@‹I%nÀ`Ò�ƒ!¤ h Ì’¸ÈèdXBÒC„³}u™ùfÓd�±iF&~_¿ò�e`H.ЫH_žúý'/ë´—BÌ#�“gúßœ õ¤}Å¢�¢¡[ûä€Mf§Ò¿Õ4"ƒ�ïX�¬ÿ;—›ÑŽü/ŠA¢0ØD_ðž>YíX»Óβ²º¬r8So-;ul²M¬[#}èÆ‚&èy,Ë_‘ÂåI‚éøJ{à[r®ÕP»ÙXœ’|Nr±2ö“Ø.¯ •M#x %?ÖzÅõvhk öZÃã;_ ½Æð 6N¯p ›Kî6½�0ÛÉ%(Ò4´¾²yh ÕY�¼œ«H=°)Ù"ÁÓVÄw¡Ë{ÔݹHa’g+¸ÓšÙkaši‡�@ˆ?¦ßX/Ô^¾UFïbp˜U‘(H˜…z†Z–VÄ) ¼·°P‡ÌÃ[Δn§ÁèX[4mŠËé„ûó�H@ðÄæFäô,2>f×—ú-Rÿƒ´‹ç«ï˶�‡£wF–l�ß_°å%ÈÿI^ö�üéä|z?;(õÈRþ„)èµ"^?œFaÕHºt¹¹nDA"�Œ ´þ„ñà ß¡¤ÝíÍý²ƒàÕÏÇ5’Íú<ñz¦(ã:¹àx;fâö} Ç/ËŽ˜Õ®JS“ žÆëzbû1ÞîTøP2÷‹6w�g˜­×+sîÒëoAÇà;`@_Üv°2~îú¯˜Å téB t·¸‡}µñûWÕ(Áñˆ¦rŸßˆu ¸½÷Ë»ývN²<îÛ"·¿æ�‡ß~Ø}djõØé�­<à|h�°êé{H£=^ØÅê’×(ÜpçIõÅø2 9Œ±Œ.bº#—[�†Å_CÑaTt{koÁ%«€]–[„;í­«ž¦XGÎ}/` Á‚¥~}Ì×ywÁ¿Ê°ò{ûõ¸:¶ŽÂ÷�ühλ�½ž u1khXk4 uå7øÏ„eµ&þú3f<…PĶaÚA›œ!ÀëÈV�÷dñ=K2>CBUa2¦ÉJwÍ%² Nš:2+/tXE6¯EƒHÎS`§ûÿŒY%A˜÷0½¾°¾µ¿›î×ãdrMß^I¯=Î÷3Œë\È™U¯ ðà3œEúS¬ýÞ8™æ�a¬mr£ ¢,¬&åëDÙÂÑÞÌÌ„ ‰7:>Tûl£Ï‹T±ß—qJuuñfZï[ÖÄfý¶õ+@pï닯†5ä™°’»¸F¬ïY`úL”}%PCg¿G¤,U� ŸMËÌ;8¿��¯ðš_   éflOt f³ÚÝoÞynmŒõ¨Ö²ßåæùkã;ÁY= tÐtp<Ð 07ƒÆ˜oˆ#õÏB×LÑm_áwdì�'ùrÒÆëMŽ/½Ÿ51�üÍå0Boƒ×… ÛÕSØ[­3�·À¯U©»k•…þÈÛ•¼TÏãÖŒŠt_�C:žûzèÞ±©¡0ÂÊ–&ûû÷ì?&|׫ß9¾õiõWá;dy�ï_';¼mhNúå£ç_v°ƒyÊ�·Ë�ʰe°Ð^‚’wQô pg|Ã7Bý¡ÏÊ‚òESˆÈ ¡Ô˜�Ù„?ôOq˜êÆ©7ýÇÙôì¯ðc¤—{�ߓŚˆ/”†oX¸÷§!Øe4 χñ^wý}Ø ¿çð CìÏ0àO¼ BoÕ‡7»Øç–˰.$B�BãzF»¤™5ÕßÙTb¦r:‡ \!¡ïìIQùîÚædNˆ^eAލ|–ê³ ó¸ÉŸqx‚Ý kÔnî> õýb^–çãʧ”9÷ÖÏðÆÿ tÇC÷‰n�ÍÔ“ Ëo¸�Õ“k¯_ps©to™˜8ÎímÞó—YÈUŸw;r0ߴѶî¹-ދ⼌ t]Þ<:ÕéFG’|'—f»ÊØ[´å|¦°ÖÏ¡8öJ÷ &ù#2Bò `ƒ™y¶z¦dš4ßlb J ²¤šâo{l)9ÊØ¥J–+À Å�Jïèïž®˜¹ÍÁbà‰Ðfý¶½þ€BÙ°¸þ£LÝ“öE{ˆú�™Û‡�å|½Ðž™Úàˆ‹¡ŽúâþEÄ =yùÇoÄï0÷"Ñ&D ÷:ÔchÆÚœ�ýBÖ_e¢µQ õ›p…³«JC>2ÊŽ6ØV‹„ | ‰,)ÖñKZ�â÷ÅÍ€ˆúÿ-o_ºg]iQôæR ¨=h#à_}Ôç�=¸‚ñ9}}VR!×ùÆn@ý%2`‡íÅßÍ�?¸Â”6{»èÉàc–ä~ÞŸ//åðüô¹fàæY|G@µ½JæøQˆa}ce–¿‹d¬ròÁn7œ¦‚ÔTF Êš1¸îB2ÈÒDLn{ÜpáÅ�‚¹ú°o’X2Kjòÿeýþe8úy^÷Œf=,dlx­°÷¢ó%x^¨ÚŽV:ƒ‚x¼ñ¹EÃñ×Á°šZþÊãÊ‚°Œdß ü¡½§¼;Í]j2Ëo˜Ž,^S /1a^ ¼„ö9ÖÖb¤Â+–Ûjg¥tã{ºh}›\à< ˜;­†)�ԭŸçmÛüáÍNàÅ“:”S�®cu•aI¤ãpéH×ù ?W'@:î×ÉBµãtUþ<}�Ó4 c+ÝÎlrÃ�Þr#¥o9‚¦M(ÕçZiy°ÃØ-!šÙVŒN«Ó�õ´¶.x�²Úç@® ÿ�½z»¿ZË9kè ÈòüXg�O_Îå/Aãâ2H\‚�„„j0H>ù¿½æhÈ.wWã·÷þ}߯ëŠ=Ø€ê˜,¿?ÕÿAÁ?Ë¡ûoóœ“JÿV0 Àˆ³’W9{ÁåôÊŒ¢ŽïÒ&„[ M(\pìJÄIfôj’HÚ§=§†þ"qX s?cµ ~žçóÕûÐnYÝ\@± ä³G[:Ð=ßRß²(c¤Ä�©s$Ĩa.‘@ †±I†„� ïw/ÿãßùñ}"gÅéÓÓ”:°ÚòdläLüÛ{.j.ÆŠ]¸�+/ùÑrY•nOþ]F‰z¾z×ÂEã •o/]‚~v¹-fú¶�E7¾{¾�Àô³d¡eØÒ¾-ÃåkvÇ¥£Þ§"å8îs½`]{‰ w5@v÷†3Ë»Èw°¶KkÍ.ºî=QíðÁ³™Æ'#®U…îè@G )ÇÎüæÞ¡9ŠTèÖ>)\±æì›"µÿB¬·“¤éÇÙ³`›gµ´çí< ,³‹™ �ðô(@Øå`(´t¼` ƒrj¡å³†l(9äN0Uå úûó“Q²‚ô„Q–¿ß¿lQ”81ôð)šÁ?J>–ÖøXÛsÁæ¸Àç¾ ›k/ )P1RǾ#Ö×”ŒOo†PªàN‡dhƒ+šáÂcm_wìˆ[ÙÀ>×â—[¯ ˆùò}”fqè½,�ä@Ťƒ´UNî÷+yA ¡Ã l+ƒõ›Àœ†"¸šw¦5 ½ßh‘ÌÚŒ dŵîu{•u»–1³â¾µu“£ÑAFRö¯|ä2jY�¢?°×ô¥%%åß8ï[zká×[ÈRϸºžK ~•dg4ÊyË-›f}#𧛟<ÝÀµ†²ò hD� ÕôÀ(ש,{Ôp#Fx¹¥ ‹ÙÏ iüûjŒ„W@@⬎sÚþb?âQÄžwÛÀ‰•ã¼$ÒgqÜ)Ä�Bï]ë­%¼‚Ô*ê)B�y�VqÛñ'ü¡ô~ûǰqåñôlœkãvß@éX A¸[™côŽÏÝ7€æÁ=%;áÇ!¼ËW’݆Íu4YÀlÒ6 ;Ùê}F”R{>�óÐ_£ž»cáÇd’ pÌå-ÂÁ}7G7Ý$Ø ,‰t [cPæ¨b[Ea¢ôõµÇ§aaÃAîÉdó݃ÀLwÚá©øWuÚ¹]äÊ?êÓ²¿ ÂÉGÀtÏ•Ù}“ÌÝ~@EàŦ÷Õåþ·é¸ó˽¶E¯‘ð~J£ïÖ´û˜’õƧ"ÈþÚ¡hW¨�`Ì›6yq¬ºŒ\hU æ~ ©ÓßèÂ]Í�4žË¤ ÓPƒK#ˆR…ÎO˜™­Q¶ÑÉñ='^Óù½¬[Dº¾ûüubÐD”êzÆÜô“øâ-èr؇l;Tl! œ„'Ó›·•� ¹MÄ—Ì€…ßiÁZÃ1ۆㆽéq… ½ù]Lýne®k£cš»ØÅhŸw@®nI¯·ÉlhI°�¼Írí„áãfÛ«wL$ºGW±r䚸ô,(sBKç“ábó±â‘,‘—�Ÿ5¼xf™d:?5ƒ®·qâí/{�Ë�¸.æó Šï7a×8­ kâ¸l›ðósÑÄ*pÐ%høSæ••ÓÿMÛ�Q8÷L±&Âé›ò7šš8®xÖî°†Ù›}þ€_Ýæ´¸RöãŒ7'²ýÖ+—“ˆï‰z៺”©Jk=®�Ø6ÖCʾº/oîjü¾Gíà8‹äw©÷¿ryÏ©lt9†SkÊ·ÛˆLs•×ͳ–Ì›ØúA‰áYòc$|jÂçÛû×çi—÷$Ï—ÑbåWÂÌ^ÈOwÃ;;5€v�êô/”¢fÞîê$jŒdõ§à ·÷I’ä{Š·|^ͨ¥Øöõ`aH|lùÜÓ’v[E¼ÚxXÐDà¨<7®‡d„C—Hþé¸Y�ë×àÍðƒQa›¹Ÿ‡É>�Ê_Δa²+•Bö‹ßQŒ»¢¾Z3WÛ\r­œ˜³‘¾À‰¥ãžÇf?á㬓L×Ë¥+ËuêS~B£z €|’=)‰0ùá×ýn?Zo¯ç”¸_½�ƒžŠöÜL÷1Áÿ7¢Ø�S­Šýµè-¤¿£�ãö<ûË :ô`.m–Š®Z̘Õ�M²Ï1‡ñå{îg!­�,»ñ»"ÐË ±ÞÈW÷þk·�é±ü�çH¦>Ñ]Ìùq^˜º½ûWN…ÀQäÄ’î8–œÞKfذöBfÏðÞïäyã80?"QVö‘üdæ ã&9Ãç4ˆ¸dÐ`]Ê.öxD~±•ȳ²•‹‚«š6úäS® E)eƒÁ4#ÐìSNÌã´ç7ëܶx Ë^2ƒ ÄC©· ò«òçø¸5š$2‰xW—Ä™…›‹å7þêzo#/éçÚÓBÙ»0 nf÷¹ÅZÐ÷È;ÃN¨f†€@tÈFÔ½WIë_[ rÒ#a>i{b ‘CAâ÷Àbþï…—œ,⇦] Á¬aÛ?�ߊ Ø+@õð¾ñ?ns˜{N|ó\ÎJ;ª�ïI0—²Çœ}�×BÁÀî5ë)¼{øaÞ¾›í:_(Ÿ ³’�Ö|=ÇëïêI{z7�ˆkrÙKEu:ö©l{�\«-n?üYë0×k±·©¿½—þóÑöÌæ1…"†]tè œcþƒþÞœŽöð—Çî÷±ôÚù¿”è?“L¢ajåJ.>þ>p=3òôAÊW¥¿Ä5Â=Ý¿û£Ï¼/óbmˆáôo»è ~òÖ/y‰CÎk3¶šžÛeéu‚áÓPu½åä.úÆž§ðµu„–×E–mñSœóÙ#÷G{Ð7‚i–zä• ¨ÒXýQ.ôβ¾ÃfV5Afž�˜|\“ó­h’# SuÛ†…"ܦuOéÁ x½ «c,°:;zNÚ•4 f].%ÁçÇ0–è×qÂMH2†¤?2K.3ô¾ (Ý-ÝãwF«œ?"ÊÙ&s‹eè0I~?V/Ó釯€@y¾{Dì"—%–ŠT쮎²µÉ ÈRǪf¤À«ðÔ­ÉÛ⃠šÒ™î�Ð'ü.·�ý¹sÉ2¾¸ž6å{ôþáì¶{¤d3ôÖþbÜâÏÜkó�ôÛç}DI?>¶ýÐú5™¾o÷Òä8‹Å^œ!¹š-ÍXÌÇ“‡½\~µ¬T/þZ­€kA¯Á‹ƒ…“(ò„ýà¯dmÁaag‘rùD8sÐ�÷ŸáÖ¹8c›“™7kNÛË‹E op“Îz�¥J'¬›à5„ÀéhëMãçã~MFZ¸mÏù®¿ªï›ßª(¼4 .›ŒU½<™�"N&­Hjo5›¶á±«XU¼£ºOEŠÌæq¢ÈÖ”g‰}g!ZûÆ^0.„káUÍÁ©CëŸéê¥/=cßw��”â2 °m4ŽR'¬“” ySýâÈ[â8™Ï¦³—>â+„úi�»dIêgjÆgš„Û¹EàƒÇa寺Öë0¹eÒæg% �ÀðÉKÌV§’ºâ\š²í*º&˜ò £wÉ6’ã�¼Â^w0—×0¸Øá’ø×Ó«²ÃX¦2Üo"F# ã\‚cF!“±@˜¯@hdP#ƒQ÷¦D»$|!»`ÞȼŽà`8‡sÅå/ïŽ�Ú$útËÞŸ«[_I Ë87õäP�Dœ7[èY82ð4_KüˆšôÛ3þ!ÇBÜbýºçóÿp€Æ özÓ£Zcõªrú�gÐ3§¬vøÏgH½aìüpÏ,÷t>™x–Kðý+-@Á´ªÔÄÌË téÝyìnkíÂþçF'ÿ|/x�`j=ôCüÃ÷ÊF@e­&Qð+3Ö“ô¾–a)uë¼ö2:¼-["?�×b¢l„qµçpI=q~¿WMt8J-4i¥G5¸6n–ŸþsKà½Ç‚Ù§i‚œÁEø„†4æ!0_ EC£Dm¼æ/oé‘^Lx,�pc&Ø¥H<„8Q§> mî-º£Q_[oò0â¬/we&·Rv±éE™7Qü6ž¼žˆÑráŒÙHœ{?Î36? hvãÍL/žÜ¦)|kúé–ž™ÓjÞ4=²¾||Ú_y¦èäe”P´z¬EFvŨýAjV Ô¾AjŸ‚½J/¾<®LíïÚû³:Cdz8@zƒ³ƒ=—õ•­|aË*\êxÑl4 ›»G$W;&¬P IðÍËšº tôH„l· téXÆÉÂmR'°Îä TmŸ•É×�}PVUT´‚Ó?È‚šUf�¼³W´E'?÷}'é Ðog ûĄǚ5:ØÇM®YOLÄCîêcØÜK—³Ë€P¿1ô¢Ø–ˆ*/Se²³³«”›ûYKü ñï¯i߀ ±@Á²=@ÍN·›±yè0? UÎÄÌ‚Y·ýµ.sa¤­\D¦ã{;P1zຄõ·è€ÌЬÄC¿—ë3 5é©ò3fïsˆ?»¯ããyûÁ} ж­*OûÁ å`Xhn F'OW²öß×È=ú}h›œÒS“ �Ùÿf�"Sw6¾µN¶È‹ÿ…½ùnw!zŸu³]µøŸÕ»¿M�¹ÊPë¯í¡õŸYXÿ*+ hË\\ŒŠ2|œ„n>Y'Ú™Ô?¼Ô^\gÃ{fú¾#‘Íí3æ¾�»÷Ïso„ôW©WÙ`_ÂoWL-Ñþ'ô³%ðö �è)c)ŸøÙô]ó¼Ã“ñP·9"?ÇÇÑ_=L‹žËErVÉñaݳ¬}‘P÷{ä%ñMLeä´é³¨"¿�¶Éÿ×¹×-p5¬ÐäZ(¾ÝÑ¿²]÷�‡“*äéÜQˆ‹8VK<Õ³˜>(G2Î6oòöŽÈc†¼žµ”"$\aଥæ]Åò§Q¾šN¥–èWÀ�ð jIªHӻ؋e,Ä4@(s´‚°¤i b;°q¶[·Òw'0ñÔËY4]lÞjæÊHoݶnî�8ÈÁçúÚÖ: ".ÜïY6‹BE^ñR÷^® Ó$é¹nÚ¼àYºB}ëL#Ñ•�=ߣҮÜU@9°{NÑ�I–®R­/q‹Q¡[‘8ˆÕ]%¨³Q*:pxtªAH3€/ë´›µ(’ið@YÐë 'ˆê:qll¡CK§2/â[¹Š4Yï÷vndD¡[ºàM‡Y€–e±Ð1@¼qŠ ¤/‹ÙÍÓþ±ÈzŒ�Ž%ãëÊ÷¥‹RãZr477uç–{¹a\«e °ЙBð½¥e—N÷žËç{ ©ÈÞ¨Ä}´àÝ/u¸ÍµD  SU?K�Kôy=²×<"ºÇÆ2ß'lɬ9ÎC6© ?åÉ):ö°ýJÄ4¦!‹šàÇc�Åa�¿Ä]! ›† UéûìãÅ@/nî–éc{jkræ«Ó-¯A↞ø±Ñî2ÞÐ/zœaª­ä/›Cæ‡,˜Z¼5{Œ°Ýhõ½âLzHY@-"‡«U±Ž�4$OráúwP¼¡[p.3›e¯s ‘€ŽÎDzð=YÙò„·zðÑ7ó©¥�§"„Ê$ËXRúš}|–TÿšGþÉ ×]T¿òʶ ®ž¿êq%/ %•Ÿ |߈ùæ[ʪ¿ÿê÷MOªÕú‹Ÿ÷a|( ^_‰A•2�àÙ£ ËĆ(©ñL)5ìQ€CgTc¨¡IlµVÑÄí•� +¦©!íHÌÀß% no–vÎÇ} bk¯ZM7¸ÑYŠõ€£,ã£XÚÂ#ªnØ’Uñ—ÞÝúp$‰Ý�~ |�©”D’`³vø0FÉ¥“ÂдbqN™sÞ$fù¨Act’¯ ›ì!è\ ea.Ïtñð7ʵH˜¶cî§ëûÍ��ã~6pÇUíOÏìK%ú?J ÿüÍóŽ1ú/˹å,õäüž%¶VŒ’øêwü#Éïþpß¾ü}œëEší”³än ÿn7ã¨É ›°J_ëÂgêX=‘¯�ù©\¥WPD.ÇHcôCSß“~®|ãÛ.%õ7éÈÈ'—_F 1`•²rW÷2&3‰FeÁ´ØzÆñ=ç(XE�?¯¬D@Æ|Âé¹zRÀÃ…èÛã8Õ@¬@¯1pƩĔ�W�§0xÝl®�ä P£…Øêç!'E%*Ã.d”ËÚ󌭠b‘:3¿qÃ|ç. ©†éÂíßf¥�‹ ÅNŒëuW¶�_Å莤³|¨á„0\=s­V†‹Ç�K碡% Lí”+¨TòÑ‘­¼e) V±×Ù:e<ØÊ*ÖÐׄ£%ì«ãC™œ^ eŒbéªÀÝ3âHº�yXæñní­$‚þdäF)ób{Œå¢ÂP~v?äÍ»óc½-wIæàG¨¢»Ýl”ß�µ½®ö¡“{Ýw$¤ …˜°Tæ>Á _ˆ!BQSsˆÚZÏãi»ži‘©ŠÄ\›:O<º5'z»²H/Jí¬èÖM‘3(0ÊÐäLî`°B46SKY77Ûe[ÍôŸb`&zùÊw'4ë1çÜ×K ´G-vÒª* !I[ ¡¯v#ºBL�BÏBÛRr ß»W‹¢å¶šûåqîÏÛÐÜÊdº¾E_ âpè{¿ûJÛ^ŽW�a´Y­$5Þ‘‰À «´èøNU‚Ò4Òk{ª@¾®#à~+æ‹íâxLåà}Mj·®||ºu©YÔý|xÔh±Ž—Æ� Š…Çù®UÉß-tR{âe\±¥B'~½k÷3tT b_Ø�›‰¬£{”D Y…ü«)S#F· I~Éÿ‰ $ÿ}çö|P?/X¶Ö_˜ß†€ŸF›^Á´ã­Í?e‹½dbî¹øUÄ/m¾8ªâ´Np±ŽÚ²ñAErslÎ:Ö…)œ–œ÷V‹åúæEò¦½óºYJí Nžš„�I9¤�ü.h\ÀpmåXsšÎ¢ùÆú‡pÑå K2Ù}¶Óø:}9”ç”~@[�èWCë÷qC-þ.×r¸ËmÛìŒsii�Œ¾{øyžû4ô™¸ã?‘‰ú³‰2á_à#¥ºH]®pKða;‘Ô,kqm®è_SÑy-ÀƒâLúG£�Ìê3�‡PswlwÝíÓWšn qûqºMNàÑB5¯oGIó•gÐ^�±:Á×8ÉÍÑhbJKLAYBgë ¬‡Lÿ�š7é€Ö!lŽÃ&uçj}f&½†à‹l`lŽøÖ@?‹û8«Yœõ.–Cøò”P·Ù…1òáÈ­�é-V <Ð×–®§¼`¾ñ[È€RˆÓL©á˜ô>�7¢Î±ŠIòk£Kn+4jBùñŒWT’†Wkdƒ�…³ÖýSø—÷ëÚHà‹ô.‹ÓÂóÖþêzò§æ/+8¥;Äo�üϾój;½Ó4ìq:Æù(¨ØÓºL9×™ÁÈSd ²îsì­)Æ.–k=µá*hŸÇÐ(ÈZOôø²-lo5GÎfè;6ÚŒ¦5mˆ@dèb$oÂhi±“Æs�]�®P(X&ßLö2‡¢AP„BÞ ˆúÂâNÌÿêÜ®9�︭IÕ–bÏ5qž&ÊЌРDÀî3kj›Ó‡:#b‹b¦è RÖo RÍÇ+MV!”ÄVôh�"PPho1µÊÌ{üïDSˆ+ŽAåŽêKdV[Y. šÍÛŒ8çm HM¿$}“ñà.Ç-ì=(0d €iy{G‹¤Kæ­‰SÔcÊ‘Æf?üÁôX ª‰ØWÐ?{îeY Ø—SÆœá=Ýk¹N9úë´e¦qFö¢FCyä¡ÞúöFfMu†)ÇŒ¥ë`µ ‹‚L¶^#žÈ�â‹©�¯S|SO”šï]‹[´¤,Ýqº�?RëÎAcbh66é±Ûž7·Êð¼Ò iÕÜçY&}脙טLBÈD9]3|á¬—Ö ²›iéï¹Êñ›=_Ço~Dxp~��KÃ%ŒÄ'�D{:‹/ßÂÇ…`t¾F1¢(¯Z·ˆrf—‰°RD±ØluЬˆ}�UŽÖ 6I0’b_äSºXû�K7}Yv$¹á²ŒY-o`ÝA@±•ƒú}$åE¡™Å)¬yìä¸Df+™IP©d+{u·z53GT9 $¬ûÀLø{�äGšU�ùs9V’Fb¸žV•ƒ5Í5¡a2¨ b¸¥ÙåÛ¢ +tÝ‹�¼‚ݨ†í+²÷¯Ò ã¤ZÆSÖN�­ëÃÉ ÷jÞzpœÑ€ ·¦EgDÊð%Éï¨çu…£D¦;²�M�,zá  nH 1÷Mw÷›  ºýÝÄGwçï1¼4E‰Ë^{nìz=âaï̳Û™ù>GFgñÈdæq»—£ ›q³h·™qpûv›Ê˜~Ö"×€+ô»Œ!¿…Y\†q‚HDC¯-—ÏD(â 2¹r#ÿ>ó7 5AŒ€ÀËý…>ü²¦òÐh%h}p¶2=› ›@Ú¢d­¹d¸ `I$’ï�óšò½~¢;Û'~›³ìÄ’�à@Ò ‹ °×ò:¾ˆÚ ¹< ïN‚þþ̾$–vú×ßwyø]û�‰ÑáQ§'X½nuS�º}~+qÉîÅùÔC,‰viÒ?±�èµ%òÀ ÀlÕò-—ó=ŒI")](e,©*ÙNŠ@KD÷`µÚ÷ïKý¾½–1T÷ EæìwÂÎŒŠ³‹x0¹!­6ÿN�^Na28A¹y_jö"²Û=λ¤Û"jU¾!¡pöT_ùÆXÈlÏ�òéϦ6. w~m3®]ñ�Tê˜û#r©½â‚�;RŽû±  s˜Ÿ¦ÒZ9…‰"ç¯ß\>ÉHê£ÄkPùøù­U5áH×Ï™mÃÞß@ª ‚ÏæXóë)~ŸJ Ý`Z/OÝÖ x›(+-m5ìiIÎxE.X‘õ¶é�%žs“Û7—å…`íf"m÷œ h+XÒ›�^|aÍéË¡Ë2óI§Fk4g&ˆ,7i{–É‹´q<×Ëú? £Ôä:K|ƒ[”(?F&‹ìÞêKå>~å º}ü~lšã,ìƒAt‡dN>òÈÈþ5¨ŠÃ%Sì�ŸJQòw¸pNýWô@ÏoÒ­2j|÷İVº€-6ÞÖ}ðÏ]í¢C-Ý>à)í+pô¾F Õ„¶Öwƒ1±Ã Pž®Á�8&çt3nØ«=Ç2`®àŸ²§Ÿñ~ÓûÓܪ*­6yit½·-!.0ºûø å½mzŠ¶Ê·(yÚb'_®¢ @pr½ý½êذ""¶¯Hé4\ì`QßS¯Rl�@Ö~kŒoš&¥>‚ÆuXÁÐ|ì …wLŽÄ¬” -rj—;pg½~1¹ï50oy4á ¬tva,>›€ AXã§eƇLAZÒeÕµ¾ä?ˆ÷Ë8Gi,ⳤnCYjb.)½Xã\èŸí�_á™O?u#òs· ‚Ž{„üÚF¥¿ÅI‹¡àÃMã[Å*ík ·Ãô¢ú<q#ëp�ÁXïÉßçâ�µyÍZàŒ)²Úh�‡†§%µi2Êx#I«l„� ]ܯÊ~­^ünhôV(éš®Y¬€…¶ÉÐB.¬ü!¿VzÒ^B½ïÞk+|1ƒ^µ—&vmš™ÍÜt™KN£wM�¦ÂZÜI£$ –[ÇŽÚo1žf#Z!µAðØqÒK DfÁ,*¸Å»’*­A.o<.Aq¹r,óEƾ9'2þlœh�LdC0ˆ8–¾'MÂàÓyæÉòþÍËÿ3#.ï}Ä,dãÊݽáêoá¹ÄWœiùaM^ꘄAKþèÖI¾ÕýßÑôMßyÉákfSšŽé,thò[øôW<Že îǺãkÌo>í¶ù_Xoÿ¤ë¥C ÷Âíg [|ÅÏ­áÝY0C{ä´\Ìcb4Üð²(·«`cvè:_£Êú4Ý%€šj“GÐDÍ^£q¤Ø”ª`!· àWg�Y‚ÆB„$)òkÉæŒ;àêÏ[ýý¦ø­3�7CHðåºAsqÕ𽵋`a�ž"·¯¸|þ=½›gÎQ:;zÑÂ:xÍ�/(úbõ=>L3Óõ¦kÊ¥~@ó<+³Ž°ý*OªYÜîðå|7�-¶¯ÆçmO4I]ѵ´ßæº}xµÌã ™[ã}RŒŽˆ Š’:ÇCG|Ͱ¹Ë¼'0Ü®ÙI$“�©ußdÛaÞ‘J>°JTþûO¨ s癯làcœqÀÿÃ.¥“ÏØØ�D+"~¿ÊMkÌ–¦E.ŸT €°Ìy ճŮX`h·i/¤!~.ë‰XóÀÚ1èò»¿.•Ç]³õüì¸"¨›‘H‘³À ÄÂTšXËÀ5Dd…¼5‡:MÇJß"«N4}ÒJô�-‹q«/ÏI‚´h%8ߥ×fo ìì¼X4©¾7ƒn«¤€1šsÅWSÚ›³K'gf´,mfµrþ­¸>R,µžƒ ïÜa¦¿ÉìøãÂù„ ·+ÐÃßú ¹¡9ágÿÂ|íl>6Y\cèí‹ðÅQq3³ ÐmßEŒ8Ê;†úo‰\ƒ1vÐNúa@5„EÐÄuƒRemg9_WbÓyVò¢ÜÒŒ`£Ç¬×þÄ„Öùå팥q€à0¹í·á/ Ȇ#QÖøÄ6@þ OX{öWׯˆHÓ_<$Brù~Â'me‘L^ûè&c¡á�Z[(¹~) ÑìX€Ò6ªKVE¶•¥�Úã2ûy�ŒüßÜùÒ3üÍß‹‹aöï�îÅE|!Òûð“vK–Ä6ò˜ ~d�׆ßÝ¿7áR X].Rr(1¡{5率å6͘µïÿPsNÄHØñ¼ç³¢ŸñüÄ”*tã˜Îhг>4Ý©^9·ÃdÈÒ1¬.Ñîθ+Îóž»h�tòz<°ù2éçŸàôM¶Ï±µö*\ˆ4#º+ÎìV—{C{ú)ùÿÍðò�Ä„`í›NàC�0,Æûœƒ€ur8¸W€/"VŒ*üÙ]lÀÿ ä*Ë71ê¹f›ø±±ËÛ± 5‘þ»ÒÎhÌõ{„凤] ¦Û([ŒHö8EŸÑÏæþÞE}œ–ÊÌ[Á„–ÇÝèB(‚ŒßËŽ‰æúEnª[ÄwÀ,h_¿î|?ªâ#1àïcãËGÔvA÷J“A;ã{ÑÌC/Ì/Ÿ;@ƒAøYÐÀ¼àö¨x%`W<ÂOHeÝ’pü® ¹¦L…€QåâÅq;#a¦Nàï¾ óß[Á�±~hwȵWÙаÁH[ñ ôíl�%'×øì„þ¥Y Ê#Œg”MŽOFMå£| t‡‡Á>ˆ„²¥$¬=+@Ëàd8Ò˜`A}¿T÷¤�„*¹taDi¦:�¾æZÄ,9×.·„&FH|{…£ð„êÞèGc ÆS5ø�ðD”J])<…¼PeD§_GûlÒ ù|‡¸¤ÊB»æ¤{¡*|cS$”.èøÒ€ñ¤´†/·ë1TéÕ&ôqcUì¬7Ų�:�Þ'è$ÝO+ ®ã€±�ŠW†øM<0\@(ƒi<´ QÎ'Ž|t@«,‚ `n4®dÉle²Ú¼Ü6övRMvÙÇ]Á,;†c4ÕŽÀ�µ×iü<ÞtéWǰ<ÝúM“îç c]mš¦Te(½Jv&q]ó›<²�¬¡'±?a'²÷?å&‹>bÔŸÝÍQrg§o>±A@Ä™æBÁÎÜýË2ñ§Â¾or}¿qÍ}®ˆ¿&’æª}Ø=!ä•¶¼·Ÿ…ÈC8ù~nwV=úè‹¿IëÁüúåìû¼jsô¢_½Q±uû„­ é5vÚêï-�šB¢ê\‡YH8“Á»«Ön™9;ðÙòmqœ�Û*|ÎßpìDY¹35M^™Ý’ûÙÙ `³¤«ëYÊïdG�AqRw3.aáj ìí¯³œ¦uËiÅäî0�òõÌ 8ø f>ÎKÔ‚>ÖÁ—œs¼Û½¾Äµ†¨�2Ý �r̛ɕ·¡@^†PäùhlYN— iJ^“�•ƒâ-¶¼3\²®uíÿ—E³+¢¾Ä…ó_�Û^ü°âˆ\ðNË�?¨¥×½»{0×±¦À¢;·”i¶O^Ç Ë3  sL˜¨¡c;ëw5 FniŒq¾,ý®¶™ñîmûº¬ã1ËzDM/ÑÅJ®m–ôýÞEf†'|L¯1æwÓà•Bëœu"Ž_ɶ™ÂtÔUÔîåÃ-�¬'iaCRqmlÓ@üœàðd™x脜¿¡^ãDV°~¥œï #1¬¯vÈ0L£d†óÞsûÞZnGGq¶Ï¿l³y…óÒÙ\rM‚¨|ñ*f²Åèg�5vﱡDh‰*N,;Ùsa&†ï¥÷¡�<é³Ö5Bµ¹M3Ã.6á|ÀqB]4YÒ¸G &Ä!Ü'­ƒ¿XÃÙïÛ© iŒ…a²~­1Qδzó´îÙÑ�ÆA c¸,Sí³­Ð`ÖÈàîy�̲6:Ñ) W|Ñíáþc ›ªe3êÙ†*²ÜAz[zZL{œ±ZÀß¼2O,ˆŠH^¼›¬ëß5®N…¹bjßÄ3'[Ó¶û„ðÕd=QžæP €p¯â…/gú¹$X´7©oud‹ØSÉ4Yïíc^î¸d ]{�Ž~.^koëœÚáòD‰õ—Ë' rjÛ¼0Ç™MÙ Š¯eyðÛjëIn -õþžÞ³“XÖî¸ÖóÔ²$…Åò3±n!¿$)iÃÜ�_i‘¡Éô„ÓµŽˆwW\ÑÞÀ aù\a‹&1³éËå!ml }i~­qXPŽØ�¥i-QÅða+Ô{ŽÛÆ;ßÄd€¶�³óX @¬@ÏZ¶0äSyÎÔ“ìr“€0rŒA±‚ÉŠ‚<át�.2Y#ºå~dêßW-äžÁ®bd‡+;\ôÓ "ûð_dkd\Õ! ÿëÚ2•>÷¹³0ÑÝ69Áƒç³D&G¼kŽ }ŠöJ=a×kHé&¾ôX*õ áHà5½ŠÑìúWP�6ç­EmUhU*R�á|@ ÏÓx5 „GOÑZŠâsÍ2Àõ`šÛr¸«—"HŠñwÛrFŽ «.:ILŽ¡b-¬M˜*UÐÔ5±$S4å;·èîÎâG[—¢?C6›ûÁÏãsÃý¶» ïþäÝ‹õþÝ\·†“ñ&à‹+Õ9³ŒMïûìA4WHŽÊFtL¹víó˜©É®Ó�¦ð«¥tw¾w¸þÊîÀÚÞñ¶ä¦–ë–ôî4W•B2C?uµðÊ °É|¡h†<ýßáåaöÛÊ‚Æ À&,”E‹©>Ó s¹Z ÑxŸŽsãÙxv¹2ž¢ñÊ“p �' Å&0„H9v”Û0¢m•ÖÒ€Èñß‹PSˆ¿ç߀½«¯Çâ@øÃNÎHßt–f=œz|ÿÀ8ÙÕý²–Ä4@‰�Ïýø>Ù~ðHˆkùë�PóäŸR3Ø<� �ãc¹èÚ�Ê~¸è¿LÁõqúòlHü‰«ÿV¡ï°1nHMz9zPÙ4¬&’Ý�‰Q#!Ii± Á‹Âax!‹»UËI 4Á�¤²,Õ·ª¸aIʵ [ ²�‚lÚ�¿gÞ:ƶŸGzv=þi‡Æ™ãh�ßÓå(Rœ¶OÊÃû7ò ž]pü6Ä ±™þK¼S¶ˆS’�Ó›§ãľÈlÍÉÐÄVÎWnn©mŠ#DI|{}qp¹Â"Þ“ÿ†ËZ‰íó®¶ÈÖ§8Õl=Œ°ýBØÛDuÓ¨6™â˜s�NŒ¾y^£OC$I«…Â=ÔÄÈ;R±J±2ˆº¡0»$yŒTDÉh“&]Pa‘1Q3ÄER#©ªÜa÷¸Gk;)Æhø.#b$B±RGáCx$ÇŽ9Ýè3àËHÖ”"¨ANLñÇ£²6ô»È�À¾ürà[†¸^ºRϧCþ½Þð•»­²¡EÔt”Y´µÊœC©Ca/}Ø·n ³r]ø˜ÇPn07̳D÷JN}¾©ñ9Àçfí×¹p–Õ‡‡®"1�[tC>*�|gI²£ Ë¨*¹n¨p|ËÊßÑ/7�•'·®ûí]ÓR Ή.&ÛÈÛvˆ\6bþÆSCËUuà…«¨GJ»ß'{gÍ'×OD{¿M爃‹X9¾í‡Í&.ý³Wôù>^Ý´Þ§ÞQ[qµ´8Uwn`Çÿ1k„ª²Øß~–ºn BÊùÉa×£7ð1³ž&ÅW¾ «á%-i5l�µ­tb;�•(Î9Üës›ÈÐæa'$»Øu;I7Ñ×_ØÍ´÷UdAÒé÷U¡�¤ÉÿÐþ…_§Ú0²'BOŽŠMæƒqEÉG=BU%pc UV�¯ïN}Xãî'ú1;G¬yÌê2L)/SºÊæÝ"¶º}tìàRÜM)<á´±M£DÖ½×* ߎҾäÈ>ÇR‹†’pÀÙtËÒûù=\�ÀL"läÎ…û€!°ª.ÆÆ# i&i!"nàˆ`“½ËoFW9B·fݹGBdîæ&Bìœ�t�êN�v½±›cEÏ'[[Œ o÷¼õà  …mÝrVÓÀ\p»öqêºÄejÛqîU2LÇh“é¨ïÖ=Ä/Îoϼ †­Ñ’øI�BÌEþƦ۠J‰g‘ï„lXÙZJ‰-¬ ™ÌñÆëä,ARà€Íªb¤Ëìqk"ýøa\ª�,í v œ}µ^?vAÑ¢$ðg}Nû§¿PõáA�¾,#×ÉœâÞX4�pq·cœF1 %äø®Ýɸ ý᪕ì3¡ù®ç„­ÈQ”Ó·¼½N"ßÃcˆÜï‚Fo�7抂ù˜ibX,œa¼P²5ÀAl ’Bzž“MÄã`b¤%†yœŒòÖ�RZ{ÄdÙ!AUÃ’)E±·9M¡”Ú#Õ½�ƒÕqÑîÛÈ“¾çFYÝñd»bÀôcCÓÌÓZF–¢á"3¦ï÷‡›ð–îxx¸Ýu!+ƒÍûQ«–­š<çÀ± Ô§³º¦w©ä%lòŸó)3£ÊÉ#é´¯¶³Ef'©§8¤¯ÙΛ…Z L7|ê­³—K®±Ÿíóï¬^g?®ÂçÄ‚iõ Õ0f(LxKùSÏ´WÛ'Räªw “ iCU}¨·/t÷¨cZÉ“•.Á!åƒÊõàIPÜ@g½EІI¹Í±ZmÝ8’! ÇlQj²„Yk("9fЫ®ï“AƒÖnÊ�“˲wˆ\½® ใP ˆ + �ª à ¼ƒ ºï.bý‘„s²œ��PâÊNAP¸èP°<ÂÒ¼óV]p0çÉŒR1rÞlkcbt}'Çšx¹òþã7¾ù­`±§úïÐb±v©˜(§‹cTN¿‹éE®ýS èN¡‰¨L ÂÍ*[œ3jŠ’‰^ôuŸcf÷”±Ö9·ƒž~ó”eóÅßùÓ·©'êÙ0oîÈ¿ö[-� çÏ]2y{/¼Þ‘½«O÷ÝÏÌŒHͧ�Ök£hge+äÄÁ-ál;eÚ¥–Þu¹-¬TѸ¯‘}ÖãŽ-êùµ¾méå¼$´h2\Ûé%¸5’Çž {™¶íuÃaɪädÏó ±pxy1É7ó¼ ž>#ˆ,Z¡Œx¡u6å…ÊÖ±•€å(6ÅF3²è𪚬àöÍü±ñ{÷ÂGã._5ëç_QOc§s/GXÕ‰¹‰ÕlÐQ(õŠ]é'An�Ûá#+‰6JÖ¼Áç¿’Kópu|Q%4�¾É2'Jß^.¾$M¾Ã˜?‹um/|Tè[7‡>©|R4ë8ûÞ[=ÝÔ9¿º]hy¤Ø�[ÂtŸMDaöj2U«�2;êþðú;ûØJð!”O¦hk| œx7édƒÞék Lx‚×kP�Á�“[X¿X××îú¦žs9»‘”åå~»Roè‘j/MX7íᗡø@Ciáûj ï�ÀWu)±ž{ëï«ÈmZK&*ŒyÏ££‰Cwš$’“³ÈðÜ!3Í\ò·´Ö+ÖÌf+lÌñ»!Ì �  Äu¯ImeÂÕ(ÝQoU�°2+ÖÙxvl1�ªÔhÕ&˜5*¿M¥„wg#x=–}7¹ßOA1Zkl«ƬôŠÒwùnhHzNÍ´·�aÐ ÅúrËY n¼!Jàh„HXüb�à„^z="äÙ¾Ê_j2'nuvµî…¬ ³oææ«'•M[õÀî~·™\‹ ¿ Ìu§1(¨˜ò×Ïæc‰ž´{ ŒûôÔ4u5îœ ¨IHõšü5«ÿÜb|Üüxá_¼Ò fKnZ•QaaBɰàqçÞßE.CӰл%ü#!@§Sã—˜' ëÒG /¯±’²öß„y„‹rÛóFþm{šQ�b’t9ÍZå&Vé<Ãö~UiŒœuõ‚²0âÞ�Üê‘l¢úÚjáÄèä©a5dÝ~ßʵÿ1*÷¾²%'[åÜŒí7¾>#æþ c܈%¨·…n„%Ýe¶é³†D²£ †ÃƒžW0!í’ö+,ÀӻȞèhA[‡H'§ÁÉ‚\ðaÆp2=ÛƒMÍSavc�|Vó`éØ¹ä¡ Æ‹ ŽsR¸+8 _½°r’¯ïÓc Ít¹† ÖØ—üŠ+ÌkÓÊÂ1j!Te³Ó„b%ú³�ŸîÓ›™Wï ²Ól\ý'Öeeë¡9« “¹ÂûZFâæv8"xÌÍúãGì ƒÇ!_ß…ºZ•ǘ 8J^p`ä€áU.�ÄãYÀAzÛ�XÑZáp)C”þçŽwAN× ³·.mÈê´ê.g¾Ã‘ª�Æì$(;lgþ„’Ösš v<Œgòl—ßÈ4©æ¼[x;v ˆ4íƒÊ £ƒK^vŠéÒöÓTÕÁ£Ôw�Ç‘ù~2oõÞöW÷øÔ?ªÐÍý‹þø—‰•žb&czÌ`¹<š�s“:9µ•o�ÿxI¿Ͱš]ÝØÄ×ÈÉÛõéÇs]ú�Éc&Ê01K ‹µÎÔ?�¥¼õþ8Òªëü@àƒV`„‹¸qþ—B€Ä'Ì�¸ÃÛÜ Ì²Ÿ¬ È…èÊ(’e`ô\A�L¦žsÅ9v8Þú¡O‰XÁeé�dnF0V>»š‰ÒèÚ†D‘õÁëƒa²¥ÿþ.‹†#ñý_Î#‘YÁHûø�Œ^QÔG½ÌÑt¥%±ªNŠYÂg*_ÔÎñÿFîç“Ï5�IŒVŸDœ4,˜’!ÂB{ð,.‹)–L¯ñ�Š„ùW<Ý.¡ˆƒÇè’~/rØsjw�´@EIr}·›hÑ£gÏ%ói£ÂÝ’“Â¥Åøõ�rjÇ;Ò9_G¢=$Ò¦1ŒaÊËø^îZ>� œ{ë²ôP €"oýôÙݘÂx×ùŒ|2¼ñQê‘BaBÄ€±3’Á :~%ܘÖÒáHXLêN‘Îi_yÿ¯uz Õ°À!å«"Ÿ/¶ÖFa�· à�%6/ü7½ð=í¾.H÷ =\[k¡ˆeÎ/ã }'2Ù?§'…e篵¾uo†GNÇf±�Ü`�lKÚÜþh}ådŸ¼±|ÐAèøØÇÊ�¯–âó±òN_0ià bè.ÿ°ÿ¸?ç|¾îÑ�¡ŸSÍûOwŸ*¢sms ðD)¶qIi£kÚ÷Ÿ4hpäZá8Æò”qºžáþ™qÔ è½Lt¢R“ÙÆ2“›¹Ø:S•ûTôM¤ÒhbK>˜¾õ‹™Y v厧NïuâBBqW ÄÙ}!¤4ǧKñ@!!†1 b°Âó=Lªe¥@ž’´ Ê¢ÇzKõïL¾}æ]·2!?yæÿ®ÍÍdú­»R–úY®fi�ñƒ³³Ö2¥!Ù¼gå”ÄèMúŽ©òþþï~óð[”!ØìüåÆ>ÃW.Ò×ÔÄ<¿yE|ð òÏÛçô�õ<»”]ú;“˜nüm‰í>1vWõõ=#ô�[ÞózY´¿¶ZІ¤œøwG´àï�|ö¨|eúújé–³¿göÿM˜ë*ÓÒÛäë}ó‚qy¼—=̯0Æè×K©Iã‰x\g“\<Ì’D$kôëzÅÅ;J2¦ÐK&ÔwcX5Ô7kòòö§Þ¦z6$‰Âci.ŠÇ±”{ãIœˆ¾ùêâ{~_œÆª9Ó£Vݯy#vA‚»™anåU§‚»¼åja &‚98‚'ÔºÓCt­�ø£wÒ«º9dôä~je\ÑH²^sQ7_ºÎ®~:ç” YÏš¼-¡JLúÏßzINµÅC䯜Õù»—1× E•¥ÔfZ`é;tcѱVr‚› 1‹* +1þ…¤‰Jå7-_‘l ÷yÀMF-Ì+V7N›ÖS–Ê9—‡¨ eeÄ¥S­šþ*÷§í}õ4ÀÚ�äM¨l�ÒKÜõ–Éöí¾Nµö2ìÕä÷7¨Ä£G$cãb1ÊJ,_ÜN9íMAžq¬J*æåu—ÉsÈ·,õBßyUœ§y±GáòZ¨*£8#"럓y(*Óy,ÇR^¶y“\¼˜Éê‹�ŽÈÉ{‰5Z®3ÅÛAùœ†[ójòœ&Ý-ß(eÌ’CRŠ�âWD%}xG¿i¥+OÇë0žN4J³<éHºyÀ»Vpxί¼Æ®(d¤ñ”XtéŠX‡›»î_†8ùVdÕï˜3F,¬ö1/–ÃÝÌ\åÖZ ,»›÷y—ªbC‡5� ÍRíTjªÌ¦Q{¥ ‚ZyÇb÷ÃgA»Þt±|Ï øŒ­Ô¾v™fH"cÿâ¡Ùüƒ»y|«±Æ¨T‚<Üü{­U'“8pŠÌ·‚ˆÅ“[‡}n±mïs¾Bf8YR“ßÍdù£©’«æ3…�ÍÜô�@ºfúcPk„¹Hâ2µ[&¨³’jkD  5(!Èa 6>ŸÏsã¯ÎQyõƒB§.ÛR† kÊ"6>§�— æÉBÌ£p@|UÑõ=)#ÉÒDS/¾V˜¹iÓY ÿ±ZM;¹ÌwÖF�Ë<þùö"åu`뺓únœjJãB5›aa/ÝØv“Y$œ�Q¤ZJŽf‹26’m60ZÂcVEB”²gVPå Âf¼LØ¡&Â7X@Y£úüWYršíI�©F1²‡‰(“†`Ÿlï8E,õLXÿ£5'š’ív"Bþ¿ðÃ8Á}»ŸêÏrBÎá/ì/ù¦+z0 ]B�¬e¿ÏìLÒîÜ?Ú9U÷;×ë‡OJÒ»°Çe³|ÛÆˆ:FuÑ®—ä2…:ô_[;Ùù�„¨Øs\wÁŸžh}õŒoÕ;rò:µ¿Z[3–ÐS¼^©è¤4sÖ‚À’“IûË98¸ÃÍØ¾"Ó®·‘|±*™´l‰¹=Rø«‚bÌNb°±: YÇýŸáF�+Yî-¨ôo³…‚RrϾ¶ú}Ý�å|à®�+äÐc4©¸¸~ è# ¥ Õ-G‚¨½[VÏ ¹²Ú*ºW ÕɆjW‚ÍšcAˆxDª>Ìy¶!®Íò.pÚ<µ¦h’G§¢èþò0—ÂwR_—>87º eùÇ£ŸC‘[6˳q™µ pvU×J·—,ôƒZ„a¦a5ÔåMÚ—‚m‰Þ˜�ÊÑü‡c•Á Ü�¹Ôô¦)ƒf·óÐ!¬ûc› ãË¢z=ÒÁáQø�ö»3(5æU VîPˆ¿ötDGøÓÊàä2Œó~�%3Ó9Sk.#GÛãûž•Z¢û×tª.Ðx¢àº�kI¸[‹Zw¥l¹ykY1éŒ_,s±ÏõÃÚ!�T†ïoƒ2³jܘ`8êt¤�«p‘ÄB…VJ#ÜC¿@ß�±½-ž‰þ±� ¬ô² >ÒÞ_›<Æb–°e.œ4Ön{@b8ÂSEffI¦¡ÒZJÆ�6·5ÆoPA óµšçÔi²$œ'¼Ñºˆ¬t�ÁÛ¿£cX:šÓ±BCv­Œbν(u_Í롘¯�é¸_˜³$,!�ÊÉá>küÄØOù¤Ÿ›`õ‡Lþ� ¢ÔdÄ·n ž@g¹Ãeƒ�ñ#mzØp(÷ܘùÑûÍÈ…ÿ¨Èð¦2ÖÌOkœ¨†’ë‹·OÁ¶sWÛWé9k×ÛBÔ+ UÝa¬ƒ ¤«\ mdkOm¹Ý�ìÆ·IìûËWÞÀ¥J Að�F)AÅM˜â‰…ÞáÍct�=°R†QîÑ )/¢´®±ëß ´£És¸-ŠË* À@ñ§MM¸_LÄ*0úÎ\‡fÊ3�µkÏ´¾¿•"me#7tämlw·«#Ïã yÉ€“!ÁÉÐ!û§h™EׄŒû3=g0#þ”LÄXâ«Áí#˜)>¨ëu^2TF_í…Á®qüyæâI0+7­É¢”¢ÄWøÀâÚöD R‚|´ꔨSã*Q\íe5…#½µ­Øš | Šò¨(‚‡ƒ(bîtqþ(½§Å\¥–“Ç»<Aƒ„eGW�8Ø dÇ‘(iõ„šRã{#hÝÝ mŵ¶èŒ"º%²ÙpŒv¶  ”Á�9° 0qÖüùÕ.@Èh¤ fLïsdxtÑ<¾¥J$¶¿”®1k¢èš‘–øÿ6&öXáÞlT�~ç~ $ŒBµ›1þlP›o‚/—�`Ù¥�„ þr^‹í²¶ß׌ã†8›Ëä¹¶;½ÒùÜk.…-[ž}¶õ• X†ä.ôp~eK8IøHkjïKÜÙ$�©Îʈ ³jV»Ù.QÜÁIå rgE·�i´Nû™‚è/vv\¡pAËÕ¹÷žã‡ÄÛmñ˜µ£ÖÆ;ö\ãnyå1¶1€Ó 1½Î-—.Œð$’á .UjÄÖEhéûÙÑØ{Bô ‚¥ˆcãÖF·¡OmÛ9·&†û¸Îõ´Êõ&Vý(ùjÚYk9‘•¹R�ëf¯Žú�«p½¿�­wúÖ_Êÿ¯~ÉaMа‘O¥+ãEGœûŠR ×:»9±fbÏþ¡=bi‹µê½ä1w�ù—ÛU‚—þ–Ðä\±ËÒÙôo㎅¹·Ûò$±MÖÂy[Mjõº›¿ï¿Î~ö‚¯ò'An{ÌéÁŠlOáޘĶo(¯ŽQgÔ…ÈÒ/|Þ‡À}‰‰€ÿ_õœÝ-¼£õÝËϤ]ß(D¤SÞ�âþ%ÿ ¿ŒçÛ5Áhê Ç‹à~Z)�¤Ï¼2K�±òÿ®ûÁ½î¨J…×ÌõʳõÍ×Óë¬Ðö¸�Ï“' §¾ ­ÔåÏà·mþw‰6ÉñÓ;úÙ“¸g#óáÉܬ‹�ÂLKÄ0ôǾê‹[íÆ4 ùD½+—Gõ db¬°—vsxºàC/b¨,¬™C2}Rœ�]Gÿæ(+$Êk)¬Pòà"Ó‹ÀªÏþÿÿþ ,ÓãëÀ E€ } 4)ªÐ@ € ¥€¨P(P  øP �è§f2€5£ë¡ :N�£ë€e4 Ó ÀÖš‡ŠðÝHGFš\ºª>€'Þj€8ÀÆŒJ”A¦kÐ tøƒÂíèéUÊl@ +f XL4REC € è@P((u!X €ÓrwÐQÐ P�ÔÀ C` `@ tè€ †ÌŒ…€!”iA@ hJ�@sŠÁ ª Xƒ* Twv›¥¬c6€ÓU  $ÛZ7Nލ¡D” Ù¬ [¬  8ÀeRè@t€5,‘Z]e©EÑB¢ ­F¦ºQ€Ù@4�*X¤lÂÀ5#€Ò.à>‡�M¶€zé *…  ª’*¹cX;2à€[[Y­b4Yš ª…©ˆID�˜ (‘M)´Ì”§¡ˆ¥STP zš=@ÐdžˆDSО”õ=ª@z©$f£FŒCG¨"� ¤*ƒFÓƒø¿×<—ÿ‡ÿV—÷?¥&[¬àÔR–µW™†V•˜m¯0H H0HBI$$�BI`¶Ú¯:­­¶©VÖÛUçUµ¶Ðh�!$€¶·æ?2LD[á\¦`|ÌÔŠEîŒÕÖb² ·ÝØÙ‘Š—Eç!Zø²Íª™V%V]oKÅîè¦Øí´¶‡ ʳ¹3²Þ‚*&õ§c_UÛÆkh· ]WÙ¹¡+[Õb„µÕ‡WXÒKÍÈxΕhL"²”ööˆsUÞæÊ°ðROZ“Ñk£ âã%a�]S½”�¹½ý'ìá]½Abo¨ÛëOgÜïnë3 ¢ºdŒì:ûuäTÆV±S]º&麺uµ›œjcå[2()¦±Ò¸¡Òv…×^†�Á‚k åt5µžÜãY‘öÙ®s ˆ*k“ë—‹U{P4™ŠsbYA �ÃB60g7�Ù[(>ÑY…ß^G+v–sá¸PÜë5s!:ÇFX`¦ò–m¸Á Oá5÷¸Fõ0lõ^ ´ð3k2ëÛM®§7Ú±L;±‡onÑÒw¡® _Œ�ã­AVëµ�(®¥ÝàÝÔ¬Ú.ʧc'u·«¬gÕ˜-IÉÜ×’«¡P‚ÒÅYâ(ù8ˆ/±wrÑ}�0è ÍÝ„ñ�…%ps´>˪°•î§6½[Ã�=RÌ´CîÜêÙ@î÷%߼ع†k1aÕU,xk.¹õÞ¥{£E­Å]¤MðëÃÒÅè-û¡Ë»ãju…6æ˜*ÅnçZÕÊÓ—ÕE 4¹•㜨YH¢¨\0SÈ-íbá ­ðr^,³¼.M†ÆÑ4:‚3ŸWÝÓ¶‚ ¯½t:dï;ØlŽ®¹£¨.³:i¬Xû†+¢’ËJõTÛ~åSŽðÆ)‰¥•¨‹ãÍ/ÍÛGRãuɸø–è§{yµÆ8™Ü‰ìÊs95½îŠÅNßé(ëÊ�,£³¬Êå•c¢Õ·R…`£ÝÍk{kB8'ucT¡›¨T3�ä±iš•·Y¨^›p,qvšžÎÙ”a2¶-{SaóLö �+zU½Åko¤Ü=\%lÌÑÝ%…)Êά¥,ÌËÖ »=ÝZ–¼i]Ûkxð½W0f=Ý™{™W‹zV�‰ Ž4KÞí\tÓ3FDzWa}¹—aNÌÊu=:\è�Ñr­OXò4©û4]qݘ6geHk„Ô[®®ûL^¦�™Ã,)C§(ÆfÕ*(VÖ…—�·ˆ®– n”Ï{¡®=3®Õ�â°mä•+r9u™3w:Æí�D1 y¶%”IÜ—Ê ®æ�!E¶õ¤Q¢hôŠI\ ƒLxD/t3ëg;ÚßH¦ñ´�㊨mQËtµ"¸…Ýã庘› ±ŽUAå Ð(“Ork‡í«µQ),ë¯F_QT‰ßòç*ÙWâ½2‹®)ÞSŒyt.YBËj³IELC)ô–,iä�Ó˜ˆÕ+–©UV‡”«ž%G õžj�ÙÑ(p¥AUáš?ã¿[Æ7²×9²È¨ná ‹Û¨«ó몵»ç—Ñëˆg Å=¥F¬®—m‡Ú´^w*©³Ñg9p¢Ó hµT¤YbœOïå\¶þdÔK®‚îb1©×º¨JººÕR ¡ÑŠÙ±µGCdyrãîr›P qY‰µÅïkX)}•ˆ!‘븄,»yÕW¬Fã ¡Î>âé½áwå‰ht§„*JÎw[íÔTÒ‚ü¿·)vk:_*̔Ѳ :õGÝÝ:^#ŽÈ"}ûÝe. Z¹¥õ�’ÚŽãŸÓ¯‹6«©¯1yj•´ ¢Ë®Ăȟ|»àâ¿ íÁ” ])WZto ÷pÁnÓ'鬣j)Å€ý%Ò®§ÖUsÕÈ:ù±RG<±¶õvšÕ*SLÂÎäÊiŽ|Æ8Wf¸)‘D§ù¨ ÛãDæÃ¾©Ä‡wI/àŽºWYˆ%;¾î¥9e5L5‚Œ7U-eú>hçß:îõQ>½Vè#n™Zñy!å*E~GäΑ®æ‡»¼Î ÙÛÓ*¡"É!¡�fê�&Ó•"Љ£³'c�:–ÌìØ‚ {�¤aüªÝv>¯¹ü»yÝÊF?TÑ+*§ˆCAßµéÛë3c›y”mÓêErnجìá î·*†éýŸ»Êž6ÎÎܺ|½/„*‰Ô 6¶jx¼3)<ê¿ëNÑ>Úgdšõ@Ò×JŸLlëÛæ_wܦ¢ÉáŒúw>òb¤pŒˆ‹; ug®¥n¯qTLûr(Œ›ê<Œ‘Œe‘º@ˆ³HÊ<5 ƒ±vBø8Ð寽ÒÚù¨úÛ±Nkdú— K ÂGNFˆ¢Rõ$¡›ãº!ǹ„ɪïäýî·œ�µ…¾3j­ñ®Ž¨”Þ³Ý:ÚnÃa¦�…Ê]4;$÷¸Ö{n!È>=nª9�›¼7Þ¿ˆ9kòš¹ç«QY‘óˆA™su½ìÐ/a0”ÞÊJPiº&Ôü…/»|ÝCªn—L:ÁNü�ÕlÃd‡ ¥ûŽêY^ž÷“%´œ¡¤峸1˜ßW{•dM=/[p”UÈÈ#™ÓÆôFÉåï¹ot÷nY¢fÓFJ�Q¢�¤A’æ…ßÊö—#T辤½àNÏ:“”—{ÙÝ�Dxq«jÖ�âŸ}1Ù±¿ô܈b?faª1yøšVú¯Ø™>DBƒ¶¤{…»2X�Qt÷Š3w‘KVZ:M äá°EQðv«¢ ¶“bÝ–jU¸uåõж¤RÃRØ,Y*‘ÃvÅæj‘æ,¿�EK7åU•Ɖ^sa†|¥^ªXÎ�Á T5*Ž1Ça*¹oìD2¶+õVÞÊ'óZÿ+‡%)¡`f‰.1Ú…Ð:ì°]íÝ~‰ ekËYÒc(¬õÛµ\ÅÿúÃb…Ã$¼9:3’;õFâAmgÅùÅ;¼L ¨~;™7kM>ö¾¢â\[ñBáGÚÊ«"ë¡Õ½U 7êžÛܽ&-ó»ÊÒ’½Ç, ‹´MÇI·+RÍ‚§ÔªFÐ(.D..² ¼´D!%Ùäôèåa`´‹,Ý!ÚÓ…Vfû±ŠùÝSÛ÷ËÅÒë­ÕuÈaÝ@èþb"zó¦&«¦‰-eÄb'¾ù¹@äL¦ÝÅ H<ïï©`ŒÎuwf¬‹�R‘ j IÑ>-"ù—EU< æñdy%Æ,é“âeÊ›€’­ˆ±‚\šd‘´ËJÔê¤í܉n8â:êŸäÌÆ8¶Îâ¼cÎ!ë®^B|3Lô‘ �JbgS¦W*×r©e^™Úbûl|ÈíÔ’†BE.]–B+ë🣿®6»ç¨|­¼©K ¥�±ø–Í¢*Ò&²;¥eŸ„± wp–N«Ä »üœ7ôž+!/qêÈ�LŒ�É C D¦¨Ý©¡<¾ª0þâÕ©�6õF�Qúíï•zúå=O¼¨;¦²0ÐQQ£è³<ø-öFíD|ò\Ô!Ö6ü#qAF ES¯æ¶GWµž®ûûZ¾‘u¾*ûlöpªDÌ/âåˆ[¿ %æÓÓ³2,¶’ÓMÂâXêTš .F?Ù*Qõ½ç ëDš• Šk"Ÿª b„[2X,¹@�Q_›Zü<¢qYIH&¬†tI "Dâm( i-/‰ —pú˜Ì ²šÛ�Zn¼Ì½m°©MC­åÑ“0d„š–Ä* Ì („@ÚTa¥t™�"U4ÄAâÕÕ›`›ÅD2 1l¦,£ 2ÐLFN@˜¨³—[„ÉM‰%í�Õ3^,9€P ØüDBßGPË€´ÙA©©’¸¾qaš´ƒˆ1χ5f’HØ"(ûéÁĘ6Rí Ý&ÕãV¬ªQ RåW´f›$Ñ·I³ TôÁ0¥úIAz±t¤©"‰+…‘7@$Ü6E"+õÝ+¿aq´œcüÆ Ý×+¼¬)ƒ… ˆA™Q˜äðÄ?¢Yº‚Á¢U7D#§Å&A¤ +ñî¡”KMa2t¢ ÀÐd³cÝÔüÞ2ñtõl$IáDYø"�FÚ5@Á %¶Ê¤âš!†‘:F_ÛÏ[ßÙ­¥>\‰gRCRâ Šˆ9JàPˆSB‹/¯†6Eh�1¿½¡&äÒa 4‰,6È Q‚í|9w#0šM~'Êl�mìUQFè �’,°fåY°m@XdPú"Œ@ῼ TÒ ¥i²�˜�$ ¤[,ýÉ Ê~ê �ÄSOJ}±„~#wKµ!N› “¥¥6ª Q²hRCêÐáÖsl)öòBYÓ¤Á뉃¿Mº§ÑP©R�ÒpS ‘ŸÈ&!a ꘯Ï1Í£¦­½X¤)œnEïÓé2zk�]¬¥B½^ü¶£Ì#l†i5ÖØ„ºZfíãhŒ#« •›?,2é"AxÄ=FñÛUP#�!Dn•uJÏ·¤»H>‹‹H¨~–¶DDBòÄ ˆüñÃêì<¨äGD~"#‘ÜDš$“Ñ÷4ÿ¸oT# ú[¨ Á‰ ¤(²ºfÛ²OàŠcÙ¸ Æ £ì¹‹à‰”_YÍjøÙÕGª"ÈA”2ÿüUË$äG.Ë^`f lŠ¢D&HA"L„ÈEhÅÅBYoo5ëÆ ~[ NˆT‘H ¨b/;º²×d ‹ ´‘&1TädRéQ¤”àNY¨� Ñt݃«8DÑD ª�/@Œ•0²2S+TVˆfŒ9H“QÐ…B?U6U!·g2…Ÿ’ÚDB— ¸è¡á†¸U›"*$ôQ�Ô,†]R¬¤ÂI°Ú&G Є|(@ê|!wUt絪Ý+pH´®œ-X-¶TF4�7 …¢Ê¦�²Ð…) ›zDiA:� ØLšCâ¥ÀtQ}”Ñè'³£YPyAhm ’q7©¸*rGtc‘])Cá¨(¶�´Ì‹C©Eºr�(…M:Ÿ-ïµr�Ŧ-—"Q–K6Á…IIšnƒŠœ­:FS WÌ‚�™B”%;H„Ç)2 ÒGEŠ|6Ñ �RÑ#*4L¨@ˆŒGê¤Õù5(rèEB dFK²‚(£F¾ï—2×´�gN!…â“(ýÄ Q‹gH1EË¥Êf$-R)4P³dUe ©ÑIR5ãqR ” )º /|®`º¾L! Vž¨•"öèÂ�"V*bT·HP Tl.œ$–‰X…DjÛh“tà-*(½2�†Á¢HAEb CU•dS(QïIêDN¢tÄ~­n�“Rƒ;H½ûjŒ âÃ$ B¦èÑPéWá ?dJö\r$ú"ƒßÂò«[C†ê½$ ™Eøá‘Q é~þã‹6Ã"„{´dL¤úHA1ad�ZE�LAäd�_ÚB¶éH®� ©&‘ªNœ’¥(‚¤ÃŠšrAŒ ƒ U0oŽyI�,(mýý˲" Õ„ÂŽjo»T:Ä &ªLЂ™úLµM‘Féùñv%ä*TÃ!JäœßÅááIJ0®Zœí0í³Q“µSHOF�¨Æ˜ED|¡ðhÝ‹ à¿f¶D³…ç}Û)jÂk¹÷~žìeÚ„’D*×mC…�m©6”ˆùö™ªlµ{’…’Ñ,Ý|Èj1 ûÝ“DÒK‰p­:UÒ·J==JSmÞˆF´a %H–Qö\Pœu%i©†Di0²FÌl‹ŽÓ5SÓDP+‰¢YWŠLŽºŽZFç¹,… 3ö 0vêxÊF‰Zjd`ƒ„êP‰ÆÌ,Â$Hb©A²ÝQ¡Ñ _%ü¥Ö ‘ Hñ]ÞâɈтj7žäÑ?ˆ¬êÁ ’A·“”8ƒêРH(ÓlCV©C©"áY £OÂÄ[l�äÍÇkV{¤d©¨!_$BàZ§ë©R‹µÉ#LG(²(*¨ TÃ÷Ÿéú×?rÿKyúþ¶¹ßf.óÕ§VMa^w5Xi½Îí–…™DoR¥F–n•šó|—´'e‹{#‘[ae[mq€²¸ÙЂB¯o+©æöŽu«Ý†ûYæaZpïu‡‚W�¥ÔÁX×iÞÃ]u��3{fZâ _�F½`ªœ‹ÞÉT�E3­ ,Ö 38¹™T«‚2³ÈÕÌÔàUJ“”¹ÏqΧO®ì¸òÃà §bV,ÚôâžÊÎA^>>'¦3�WŽ�Ö%\Ó™²ñö.Á·Ý ´ò5é3Šã‡�QÛ&w•�õãAmTyY"ÛÍßòÁ}biPûéó™�™‚ƒ�ÞD…:ͦòìÜ7vzö“ g|�ã—¼ö®µš¥·QúS¬©JñÇb@fvÌÎ{.sUY¬eí·=„mÇ™ÎïMµ.PÊ5ÚN+Z×YU<—¼Î"…1g{qÝãÝáÝáßd” QiLIˆ´°DjjÙˆXl±Š $š)²X”B2H1„‚JcS0�DdK"BašI¤Eclš)AYÌÂ*,b1†B�)´ˆlP¦Ôš(’4S Û64’k6iŠ m1›$Q²Lf6)™ŠLÌ”d"!1Š"ˆØ �‘H*12a™D²3"¤Â¤ÌŒ™hZ$dJd�Ä(¦&L1£CÑ1LPF™c¥¢(ŠCE“fLeÌHÔÅ�¥-)d° Jb‘��‘€BS&ÐR” Œ™…3A É�R cJm"Qƒ( ÕˆŒBaÈI”F˜¶QR›˜Œ°‘ e�K& 4ÄF‚!¤Ha6"04DD ˆÑFšH¤f�$hƒ&b 0Ù)€‰„…ša‘‘�K™#$Á¦F“%3"“H©2h£P³HÚkJ4a11dÉ¡¢�Hd̉”È21Êc ¤‰†eD Ð-)%’P�¦€ F�Y "†&„DjJÂÈa"�H‚ˆÐ”–TfT‚�° FIiL£F™© Ì$B$Ò�“1�1‘¦lÊ`d1$‚#1²M‚”E1C‹š1ƒD"&‚ŠDSf¤D�$Å‹&  Q©"F(fC4 bDR�‰$!$(ÃÌR� )²˜�’ D’�ˆ‰’ij! ÒšI�-0ŠadÌfDI¨™„0S *h4 ”‹0É6ÅÈ�„bÊ�¤J”RA`¥ÑbŒX¬BcF!™”DX�2”$RBK4ÃJDÄ�±²„6Š5¢XbJ$†Q‹% BÚ)† Âd`cDi4j ²™’hd@,Ì"˜2 šLb%4QI£6ˆ0$h¨†H˜J0C4b1f™™CDYdh‰„²� ŠH� % � ‘EQ1K4ÂŒi4 Œ ÉŒ–  Å™BQE�Q´‰4¤ÄI‰eP‚¥HËJMY(˜(¤™0,Í0È�‘HZÊR”F("Á™ …(`¥€$’D`3$$Ò#ÓM›Id¢6&#„"�™c4lÈlÈDÆÍ$E%$ÄË`Ø¥‚dL™ ”›E)RS)!f $Á“Œ€Ô-L €ŒÕ ”dˆªMÆ”Iš@XÉDfIfT5“$ƒ˜€QІP1‚6ALÍ%"2J˜De¦‰‰ ÓI1’CM4Â)DÁLQE’jRÀÉ$Œd*DLjI$&‘%I#Ia²ˆC(³"D0˜ É`Ì¢ˆ�lc%�321&MFŒ‰‰ˆ R‘ˆÉ$fcE%DКbRÆ‘6(‘#LaŒ�6‹a2M �ˆÁ$Ò"a¬ÆI& X’�•†Dd‰¤˜ÑšT@b`"i5#DA±$À‘#2d˜°BÃ#2 E¦) 2!f&�bdQ¦15ˆ)0Ó$"I"F,0±”&"&2*ÌŒ�’LII E –Tl""�0¥4i¤I™FÄ$Í �FAc�’� JQšF�£2Œ™‚2HÆ  %2ˆ’MšR†¢RPDŠR�"”¨Ñd � l´RD‘¤‚f6‚(¤ÒP”ÈÔ&€±#L"&˜™’Q¨ÐÂRLBD†H 5H0ÈI¨ÒEF�Í�’ÈM‘”šHÄ3L†F%“©˜P&JM¢BÀÔ¥A†��I”¤“HË4 „D‘AŒ™˜ I‹£âA@8úľL©¾Öi9®u‡c…p†é.·ˆE B³Ðk‚Š„’A/Oœæ•nžÖÖÚàé'ÓY×9ÕuÂZáZÜ8v¹ÖŽTöP„ºöö×VÖ3¢lllƒIìÜ[:-–¹+gFoU!‘ÄÎÉ—œªVÅ 3â�Nb5U¸v·#¤kfn-{çîÒų*‰LõŽVŒ³Ë)ðÒaºÎUrÑ‘QµT2ï!�,èkÙ£´]mÕ†Eó­nà–ò¹.¦P<_°È:è ‹¨®’›¹`å(BA„•nï!ÐG[ÙvHK¨Å|ı©ÇB³†­ Üîªôuš­"DXyƒ%(,hYÇNö³¢FÖîÚw�ÞZe³ƒ©7�]]¹pܕӲï:ƒ»*rΈ:t[Rû–MÁ]uäWt.ðíweYÍU5¹†³ ¸ÒÙ—}ÒÑ�˜FÛE´u˜„ÞÛ\æs¦×<írá-ñ§8[é ïg{­=9Àï'žk-™Œ"íÞJÚä- X«¨Ö^ƒ,_¼Æ]Ôã’óqµW߸i’uîÍ«‚ƒ2>6ÐÄ:N„[ªáŸ'•ÝZuü9ô0ÐYmï+Ž!ˆè2+ F^Ȩ‹íÞÑ£j%=B­¨O±d2аXÊé\&bÛôz±ïr¤»0Vû%ßg1)tÝ;vQ¥w ®.,C[°«‚©mÖ^�r÷±,C(¯v{ßåâ‚‚n\¼Î2§-ãiŽÀPNónª’©µFÃÃy1ï\µÃ á¾g¸³zrÖuÑ {œƒâ„êÌHV7¹sv¸äolŽ�� ×kº Mò­"O+ë™ç/„Ù×”±”Îà»VœÛ¶C°fœÔ²G´ya·ÕY—w˜�—�æ½j‘[Ñœè C—ό͙O]LàÇUAB�"«‹nrè%*Ü¡¼2úö R¬Tay}Æ9~IgK ØB­�•©˜ét¤6UmËÁ¸ff©T˃@eÖùöÆ Ö-³ÄÍÕCÏRrŸ¬WÒ|‘½§�5™N܈°ßÙm…˜@Ω0VA78º À’VòÔ UÓC‘ƒ{ÅÉu[,#t˜ÝÕUÃ(J¾ílàçu×Ûw«¨­ D´¬žžn‹Îá¦É‚ûy^‘tñSä*ç9}fÂØÓÙÜ ­Ó”ª×&iƒ�+’ØëÎêì Ì Æz¨�#ƒ1{:aÑÖon*t×YË%Í×yZ±j+k¯qÝ6Y¢h•¢Òá¡íí³/N¸îeÓ»¼±ÚUîÌ­E×^ó°Ü–3r‹5Ç{Ý»Š«k³sŒª¸Ç×Å_,©+ÃU�–³òïŸÏ é× ]òf.Hw–Žæ³d(£ê™s®˜kªLå÷ζe6 �‚æ…œ;U—ÈiËé[ÙÕãÈúÐFë}ÌÂ:®øÍ5‰í›Î¸®uô^5Db‹¥lš‰zɯwuDrùeAcÎÑ�Õi‹sŽKr÷,vNU¶6tãvEµ¾�« ÂÖåѱ­úÎ]öîb�"÷kg¯sµÓ°ú̱+>ê?¾Bu~øIg®hS¸›ç».�uPäêª @†òÖ¬qÞsÏW*ëStíQ RªwXMà–v™•Eu¤m4ʼnqŒõ[sw1—$Ý—­NL1Š»A¨ÌqÍaÅœ¼K–«hå@‰�Ë¿v÷sé—ƒ ‰â^��RÙÀÓV�åš AÊÙ6­^èÉ-aTÃú%Ûv{nžÞ]ö’�d:‚ËÚ9qczä•¶©äµºíŒ~5�èÜ‘—tÑî´ê`£&Œ¹Ä$I°«2 v§ròë^Ö×±*Wn„É^"ÎX=äÎ8ÚÜ˰©?ZÛÇ+žÜÁL‹<3{ËbÊ#ð8±½íê§9XÀéYrºˆês$×A¾7Bé«î×®zÁ¿9Pâ»;L¡¨no�ÊsâøBœ8!Y f•åiœRå%´VrÅ¢Î{–àæ+¯|I(ö¥JmŠ¼Û¢ubÜ>T7"GrÆVØ­kQºQ«±5lÞ…Þ)—íä*ØC ¶�²ó[½]t0©ªï œøm«�r0²e² ·ã¨„–“G¨e±«õ\ÍKO¤¡dš°`ÑdMdu9˜.I/ª$;s)ÚÃf¼³š¥Â7‹®QÎ YcMëöµm«£A+9˜º¤™£{5“PQŠÜÌ­|y á²íšsNåMàHe^m ^…tñÏml«ÞÝË~è�úÞ=´Zƒ—A‰mAå!JóÔ±ïmu¡ôWŸeÓ9Ô»ÊÍä_wk'WP.]+*BîKˬ:«&:Š×” q‡QNÃ{�g­f-£··»§±¹PÒ=Šªº°);ªJ�YÖÐ#lÔ±Õ ›†RÐ�o1¡‹¶¤Ù^KÂ!=z;y˨ ËžáëÊ) -= †ÆÛôFŸTí[¶îZ Û¸%Š»ÁöwîÎ ƒd&öùn¾N¸í+ ÚxÕ Ü±�Ö²ë£Ô•å Ú½‡,õÐ}`´X¶:é–Dê¬^°µ*€¹ÐÞ EëRµVI|&>Ÿ»o-»Fè´–\ñíàw»críV³@÷p1×�::¥·Ú躜:´V‘œÃÕ§y(ªâïÝky[Û“fšéKM°]Ë­¾[Û2¶»ŽH 'Ë᳕©É°¶œÀ�ÜædšqÊrp½WJ ä1%/XÎS¡9[ºÉlëy|õ‹¼h`5iîË¢7· »öºN7zW» N¯ºçqꫪ}�nb©›AkpeÅOB{ކ7v‰Ñx7fàˆ,Òeƒ¦1…�9ÉÔ©Ên6}“}tÒÇ<«F.¯<‚TÞMŠî|EE˜ï/;¶êŽÕ¾B¡ª´»Ð»Hp£ t}1•éïW�ßÚÑ'H˜³ê#7+w!Œ\Ýc±º|ï<3jšË‚ge^µ– âil½Íå™WÑ™åÄhÔŸn¶m÷S§;…º¬J ¸g<öiÝÎ�ãì�Õ¨¦,f\›¨+$Œ&u. f:Wnf©­]º¡-DÞ‹ Îjp"k™¼¸"¥ç8È„Qœ{mÞwSy'YökHÞ¸Ga{Û¢r…:ÃÑÚ³ÔÉk«i Á¸$)52âÍÁ/‚Z:Jˬ¡² ãtÅ‘cW:ë;Hx(%Àû²'Ÿ+yÞ»ìÄž&Íîb”è�ˆc·[Ý¥qeÙétž”Ä�¶ Ùå@hŽ©Ã™W'·²Â€èÙÀÉyOæÖˆ»ŽåÕNº²ëaVlm˜òm2²æãÔà~Ý<€‹Õ6Ï_dY; ×›ŽO€a]KÚ&w ºêë�œ‹ˆ¡'[®ÈMv/68u&è•«Ée«ÎíC«I“yn^± W½G(çlÚoÕŽ«ê#ºÁá4(Ö dÞ~Þm °(m󘟙BqWæܵ´IÆ—$—U¨ðÚ¼½¦CÖ>•Œ}ÈvwÊ÷ê_=gë¬:Î=À ! .dûçŽ̼ýxã_üÃËokçkñm¶¿×ÿýù­¼kAã•Ië¿}¾Î˜éÌÿùž÷»ÝÂ^GdÙ�SÑ;Ãß®©T«=&½1�”¶É>;èðí�$|Ë™·|öaÊEâ�¥­Kú'õ/éšñɾ¤{ÿ#vÏܵæçýðôœßƬ…�FÂ}‡dÌákmüwc{‡ãªJ}Q4ƒéû-º²²Èû†Íºy/±ÞíƒÎJ®q&¸uªÝ/c}].ßüR”¥€åº¡‡÷íÔJm¶ñ®�”`ÎhUˆÕ¹wÈô8vùò%¯æº­?{O8Þ}—Ïeñ×�©·dÙµ†®é=¤4``¢Ÿª-Úï oKº,'2bQhøaêÂRÛÂø�¾Ó÷QtÖ5vwmîjZ5¾0´‡/À{~»…�(ýÐíSýñœW>=>ÜÛ_©fI¨_¶-+w@Ú<õßG’\»ÿq­ëà6ž7‘ÿQ­†àüJ ‹+£#�™|XŽÛt§k9Éæþµ•‰ñÞ>ߥðÆÆ+µ­»m™ ±̧ßÇY`êæ)òžqš—¶òî£mKkŽçG/k܇tõuU�µ…­n}‹Ú lÊAøuVo ZˉF¶o—ùË?rÿ%Īî™Ïßö‚qYÝÞ˜"^™(ylNrñ²4ºu! vûØ[¶Ó|)Éx¸*÷G«¤’ËKö3o�]vØl¿t½îQ"­BB%,ªL„¸crÈ~Œ–M\<4¿ñ>wsDŒÖÄѼ¡ƒ8*bT `gABTt���2`â¤çüHI :i¯^‡ó§ó {�ÊÌà`›Ù±´!šCý(ùgb9R+Ð*Œm·Ùp ¿§ˆ%vT,]Héi„â 0™`³¦‘ ÿØ $�BI[cf¦$iÄ2 s2ð ‡F¨¬ùåëÀÝBY ‰=×?Ûgð\@Û‘5Õ!­†‘˜�Hº$$�Ì5ÂYÄgõgCüŠÈu¬ÒÕøteb¯T³Zñ´…(Ùººš ©P…H©£*yã PÚar8‹t�šl¦xEúžyš‡÷¡:#,+¯•3¼Wƒø[þy®b}ž5ÄÕ¾‹$ª§FØB%w!  TL>*�Ñ`()E¨ø`«%2(ûίBœ^ÛýÞµ�uµâøÛ‰TúÓ#,"—€´XÕ-Ph‰DŠPêbxB¥UOf%%DÀñ¨©SeCd<[è}|êÈNW k>ïéÓ�Nš{í7ßÛô¶5Ñž‚Ã~¾u·FI<³Dî¸ü_ó{оº¿‰{aü[âS’î•J±ðoȶÿqÙþ£’ñÅwú}õÒÉâ¾*˜¡ìÚ‡û¦‡±í¦'Ýžý?éZÓZã«iÄyûó]W>®C%ªï�öõé:ðéýÇ¿6Ÿv>P`Ø™zo£™õ‰vÚÝà¾ÜôàLÏ^˜Òw5íû{Kþ…)AJX~êµÝåÇz¥½×ï>qÎ�­ßL†ô¼øé—øÏÎ ÊPc¢¨ób¾ÍgןÎ3 ›~:+Àúæ)õ¢^#¶}0YÝ—ÆÓ˜îýÇnYa ßô§üY/�ó»íÏ©óMùݾû¿]Un¯9Q=;�Em௬íBçæ}0o $>??¿EÅ‹ÃÑÌĸ Ú+µNs&þê:yÍ2-<°|H_Õq~~C™®¶[¦íÙïÖ�±ÈÀ”ô^”Úû#¡ÓÖé}çáy• ¿!—™¿´Ú9þzßF˜Ô/çòÙZÕ´NóZQó…Ú‡~³“’¡¸eB’ÛP©¨Û\%‚£iÑçíˆ)þ%÷ɱœ"F)–; cÚD÷s–ÆÐœ\=«{ÌŠqkÉoµó4_¬™¤Òr…fn@‡£PBE¨)ÕQ2ÞÖÛ}š°ªÃò‚ß,‹³Åò•Ch\¼túœa]ÙÐ£Š“*Èî3!ˆklÁ¸7Ì!ëo!%,)„±±ÐH ÐíšxÇ�Å £óJ“¥¨¤µp®¸Ú�+˱”VýëgGW÷bmŒ¢¸ál©MѸ€c^ÝùkѶj»7ŽUu—TÚjŒò½‰)`ÓI¤JcK’¶¿q�šÁÒ" � §ŠT¥œO§ÖЛ˜�û0�¨»xg–šõôg¢K’1ˆD@y°†¤º:ÍÄ£_¥w®d£[uUÎY•¦Ü®\³`[û$ ÿ$$�¤`Ìb"¨ª !±ƒlc1OÛ÷m§½Ÿ^Ý�³ÚÊjCÅßí Fõ\O™™¾­üïÅþ澎€ ‚@6’Ó�÷¿­v«3:©nl¦ËvïLÝKIquWVšV)5»—:Ì�´T'³-‹,¥ÞCæÔ8 v÷µ->:z¿îÐV±†LEp)Ü?YµÒÓh™‡Š Ð1.¶ªe»æÛˆ*í‹ïQ”ZŠÁèAHuÀ?Î÷׿‡ÑhFéü:U«*ÍÀS·]‡”í€u¡`Á(`ÑÖþ-š ;6†ÄÖ«¥xYx‡†”˜¥iåM)[‚Ÿt¥Ž„a2mžJŠsþáøqV+,ÇÅ©³r¢DF�O÷¾»ÝÌWÛëO,öŸ¿²�,uŸî_»yqÒAa”‹ö:)GA3²%gHê²m£$PUÀ„’í{wh€>’;¤�¬¥/çƒÑy¥Ø¹™�Òêd±QÞ—¡ô$F´|hISÖ•²ê�’@y}ûkåóçMp§·æ^úž{;Z6/ÞVg0ÛϨˆÕÞ©Ûvÿ~ï1ñ9Z,ìU»õû¸ØÀ»³—þkµ{©½ý4{T.þ­­äħ“¡c�? vÞ3ýãRWÛk¥|º‡c`·¼/{¡îlÍt[w>ÐËÅQ1æ³�^a®{lí¡|F«¿Îþ×ÅÇm Rlñ�ºÕø»ðÏ“ïõþ1-³†øµ/ØVJϬÞR¦^àÎï= �Vµþi°`ЙŠ³ÜU5ìž=_ŸÎ¨Ëþퟵú|Lx}mço·žÉ Q·×x�»y±Ç¨v¨.òCA«Š]óJOÄ»ïàm?ïnå®›öHõ‰QìZ¶ yÇ»dÚGLFŽŠiiÄK¨qŽr"/ÕRz·—iØø~Ãt»�ôÓêýmÃp söcf¾Û7nÞߟ�i³q9Õ •¿w"Ûßæñýàz¦œö”»sŠ?®Þù³¨’¬‡F•4såÓ4®ê.«˜Ë_^zÝ)ˆþ¶×Ón›ìÞ^È9Øù·ã—Nûåúvz2Ï×îŸxÝP5¸@MÑ¢æÒZWfö=10‚öm®ñÚ=ô�[F^¿|iÜcÝ÷`×�?õœrðÊkÖ–²ÇX×–P¼2µòl¾š .ñô<¿‰3{)‹.ƒM'v¿ŠS²~­húÅ:Ñ`†]÷å›ÕövÚ¬xÔ»Ò<îštÐ]mdZ? éF†iÎö›¥¤Uí¢Ÿ=N­¤«´…œoëO†�[PV21šÄ2Ç¿Ž¡Åä2uæ¤ÜcÀaw,» Žä²ÚÁÁ è!«V(LÏL©ƱOç}:¥É¸xGÈI(ò¾399tH– Í[°¾M¿Èeè.c†/ZžUȬS Í~ífÆÊõø¥ ªSÖš5jäà27}ZÔ&a%Tèß ´±åZˆßKiÖr®%2ŠÒ"o�5ˆ´“*[³=¾žšjÀ�]“AÐÔ«mÐJ …Ó<ØA7"Êøgaëko/Ó˜.ÊÅB·;¨ izz®Æ‰O@^½‚u„1–m´2­F�)ÌDÐFù‰aPÉ�®Uó¬2Nnþ×ÃH¥2 ²Xèß“¢QÐÅAt׺:®Y!�-+¹!ý!$€ª¾Ê÷Æ ~ë@»ÁËŠÁØÄP³D—ãÕ�Ô�àUQ”/€¥Ãi^sËžwØó¹…ó8€UÌ]!æ6nòöS„¶ Š�`Iµó.׌¥�,2)Ú"ŠˆiÅìQ(ÐÈ2.“d&ª‹x#ÝÓIJã6ö´WÇX®m©k[µ@¨ UDäQ¥§¶ÑKI»«¶1‹# i°k†=c`©+ �ø�ÿŒKÿZ0çW¹ç á1BÖÐ32‚4%â8e.ƒUUufÓ”W‘o¿UƒJéO¢j‰#ªÔ�¡D „’‚ÝdfBKØòîÏzá¶#iC1E–QTQU¹¶ÑA~Ee  Z¯%š‰°bhª­°ú@®Q6ö,IeÂ*@°• ¢´è�—$,lÌÐ’ƒ0.ÛÒ0+Z$$še¼$g½ÑA&H¦Å`À‚Å¿[a"ìƒÔòHI >¼x^;yÁùí‡búÿq¬¼Ç‡Êï_}ûx¾‘£Ëâá½½‡Z[_ÑF™±»~˜õl|§�ê'‚0EöÏÝ –ãì){ºR"ˆ7jȇI½aPB4®!3߉ɼwº×‡ÏñŽÈzà™6M¯ñ鉥b¢/A»7ê’ñ¶i2Bº;ÏRJ$ K Þ]z}=àû÷£iD.ÕÉKÅ¥:tQù‡ñÇÊþ¾²eñ�ÓÍ|ùÔ6óŽÆÜø]-PØ–Å·‡±þjuŸí>Îo¬ø9¶‰4ü+ïîÝßûÜoÄ=Ô3ñtžMÁz?Îò·<Ï×F$×b0Ý–3w}r¾w3ºæôa…áZ¤$1å~c”¹‡ ý÷g¡û/�¾,³½½9íýÊ>yÖË6ýïöÑN÷ xα|¢,�®Ññâ’�&àëk›ca­§ÞÿV¶m¬R¢Âq«vüìoES�-“ç¾:´8 ÞZóòß>nw=t§JâÙé}ºv×›R\˜®Ã»ý3�—άžͦ×w”é{ÒºÅK¹übgq@�µgÖ¢i}<<3#$«ùµ§¼¡³Ï¢xñ˜Ð;»>ߛþhT§-ò͹ù8;on½M�¿Thæ °øBZËÝt&nÇKöá}˜ëy'|~~ÓOE±/Œb‘ä‚!Œ dA0ÌdJTT4�Fš|/Qv� É€`dÛPÌQ @X ‰É.Öû~ï|·®ÒVСü1c­¦Ì£ÛZ{kŽੵ¦»„Xôpå ™ �**]&ùE†TŠ.‰" –›Š°D�ßû»™ºÂõ;V)HìÓ¿ËÍwd«þN¦£^ðr¥nŽq96t îÑ1L*T¢ ¢}P­ÆO”3fdø:¸¸×q5ª4ÐQkX PDèû5ËCïÚÒõÛ¥IœýëÖ›krLž*Ð$À€e^‘›–Û%D ’Û—O7U\ApÒDÌ:oZÙQ‘­3д59Ö�ʳ[VjÊÒc Í cf˺2L!SO[Ȳè×äq‹Ðih™¬, á,óÞ½ïW/'›¯LëjÛˆü¤R#¨ëC'qo6y`�R"‰âEDF˜ØH-frD°¯ÍŽM`Á�Œ!ió£e«º,�:¼ EÏÊNnïéÛ(ŒžE¨Q­QfØÀbb„@�¤ö‡)Õ©AAà BTËŸl®$ÅgȼÇ(mÝ%/°œšÐ r`€¢‚¦DAp‰ Ç—ˆJ–î¶VˆL™Tª)Æ «žñ$ˆí$K%ÄÁ`WR-r�ä«y[!£vµhìÏucô„’MŠå—¿¿JR“Ô�pý0í¾üóF]ÒíøÒ zMBkwö:À0ûº#4TÓ샮h¥§ytUöb‘ÈP™"R·—€I/°?@ÌOEfÙr\…€Rž¥­”'ïìKu‰ ÈB;9"5Fæ×—1¶æ›SÛUäÕêmwW&Z�šc¢Í,2BJäU›ï節«„kö P ®Ä¥q�ªÞ;ô¿¹ñ·èê„‹ëׯ0f/í’¨„¡vg´¯(wtÚF“þ/¯-(Ç�köÞ†z‡6]œžìAkèÆ� Nß#­ÇÕV1_”{†ÎøBAsÖnÝ÷çGCé·©uK1ãk?çK×õwà�onÞ5/2¦õï ÔnîÍéãXžE~÷ ö ­-¿c"»ùÓâï«Ru÷ñŒ2ùƽqÙ¶×÷F•«ýÚ!Îq\†^¥£«i·—eœ±7ºÓg©|ž®�à;Mkò½ÿR­ï‘ ]íÛä½ÕqwÙcŸ›ÛwîÞØã'˺³¡á”áüûñ«†Ó°×ƒÏ~¨ß¬MÉ÷ãz¤™æî4åûÃvÕ…J:†Ý f¼>±â–˜A�aFš{ßQFKOYŽÔ x¯+Ù¿ 9ú‰ö^÷ã�û�‰|•­Ú²óYîÃJC_Š£ÂCÄ÷òq6g4g9­¼ÆzÆ© ~¾7çVçôúé½L'®ïë"Ùú?Î'o}žÝ¹Ët…ªÕé­× Ë—ôZ¿Sg%Êå…$¼†¦ƒÏAÛ+}<Ýzmǃœ™m(JÿO,tQüÓ7¬Ñ¼Jø'÷i×ÉËg0ë¸f£‹ÛIœLeÕƒù�Yä=â Ñ úd~êŽÚ ¼Ã¦²«®uMÞKzÏ`= ñA¨Øk»~g|ÃH¥ %÷òÏD¯ ·è3N�¿>™:ñë˜,˜ÃN¼#9,–ºìTÙü¶¬¤ë0z$TsÍLë[¶M"9¼@Ž×¿Ùwøæ`T,ØRçë–øt^ó—«ôI•ƒó«ð”´Ú§’ À„•ñÊõœ<^=ð=3½Y[F6®4ü Tcx­bÇ\R„z´Á˜È’Ä»l¦ƒCa~uU±ð„"* ÷sP,bi�‰ÎЪùMCEWZB¢jµÅfÖAd4Eé¥hBât¦ÿ0_L1¤jÂZ–뉥"–�?¢M¥)�v‘]› À 0²ì8ø÷׃ŠÑÎV})4¿:Ôskð…Ц¹È�U ¹+T/è $¶Ê•‘Ì{t)�*‰b „š” þâ¶?$ïXt >$d†üJž:}n£/šÐ§m ý5¼ÔÂû°³'ƒ$[ß %ðç„W§žÑ€zäB’#ˆô 2(Фd´¨Ä”�­Ý÷÷+�•ã¼ëAºÑFtÊc>cB±–›X˜’‚‰I’TAB›Q` °!#¨Â¤°‰´ƒw‚ÕªBBI?ªð³®¿¢ëÄ.�èŽÉIçú ‘{ªŒŽ¢Ol¢ñ±˜À¹«lîŠf¶*Š%£M�÷I%°f³¡€æÁ2h`¡4Ò€„”4¡] âÈ„’À$$�#ͯG=EôLÐPi"”<¨KÐP/ê( ^¢„%@1ÞÈvùÔÕXÁ%uu¤b�­{z¦­Üæ@ø�¥ŸPæ5çèÃb”¯¤)Þ]P¹Ãÿß:þï2Þ!¿ûK7÷ÏTÏoG 7mÈWss÷ðéÙþÐÔÞöñ�&�™Wæ=6—¤\äqÅ�dbœWÇOæ#ß_>m)}O^2]a•ÖÝý~NÞ›IÏÓƒëƒëÎ=kÇ›´»tìy§£ƒGîW}÷Óî‘wаý*lÊöý«ý†õ¹n®ôeû¼„wLwkãq¤XÇ'‰šõ�+1oZîº9}¤·§­çZö8ÂÅèmã–oÐÓ¸³`ö'Zô~Ùãºmë¾û�žîãZ°»Ã0—Mñ”ü*A¹ã›3.ÚqŸQ\µ4ØíïŠÖÐÞ{‡Ê6hÜãEp4å•pïݯœ}ð¶wùÀ×ÁæŽ{_ÔèØZmCÞ�{wó½Û׬³ÞÉNµ¼æìá >ûßÓ3ÌD&êݱ�ÎX•í¢{žþ´ñá±ÆÛü/SzNWO]ç6Ô§§}ÿ{NÞkÞáÚ¼pö£®= ¦sòg¼«àË.#aNûxx8xûöWùñ}™^¾})ù+›ÇcRñÉjí\NãÇPµ_$ÇaïõýcDŠ�´·Vý?½»ó0\seŠ©Á£×êKoÚÑúm¾ž7Ï[mÒúûè[¡±ÃDí·j=ÅÜ©žÏk#°�¾Úïâ±àt£i–£Ù¿Qño§Høãꈖ=PhÌÛ×ßKÝ»Jº2E“›^Z[¡ …, H¾zX/:i ™@š^š.äôþE¸}½Ç�¼°»³ÚiÏ«ÄèÈúñ',ôÃ)¿h´=S0©°í@%&•A¨FˆI¡ýPß#(HÆDx0J‚°¨²wèU X‘�ŠÃ9¡\r(:7j2ÔÁÉVa©–‰ "¡¨þÈP­Ê´ÐM+ÞJY2 ¢A¢Eb*:´<{8ã/\øÆ–�âw�+`†Îú½0@‘IA>}ª-P÷þfFÆë`8 ‰‹‘BP`ˆUtZ``‘ÀÚÙ¤Q¢bÁ€ä…]"Yy§C{Ê>§û™Î+ûÛ‚È*ƒÚw¦Á"�441°-EáÒ!CÚÊ, F¬cô Ib’­ ÁA%˜*%B”²NIŪ$DŒ§ÓÎf&ñ‹ÍÖ–:süñB˜E¢æÔņ<˜ã�Œq7Z…”"ÜdÊP9C¿�£´*6`„X¡“ƒ ŽLè‰(d«Û0uÖ³ñLµÒO\c å8R&ð뢤Ž-êȼµU6ÏF‘-±¶†ÑMwŒ“(O£|i‹Ìµ|›m %�”Èò̹5zÎC¯h·JNÝâTc¥ ‘“®ÿ˜ccI®”Ú´Òµt!¶ È k“XÁf¸Á˜è²Ä´ÆÆ†…qÍ]©˜‹@ØØ<­‘P0bWH|ÅÝs�ÁYÅ|L¹tœæ¼¤Û( ¶Ì2 ·¦­¢ ¦à×"oDŒ²VIld9wĦgÞv\«4ΙYÒ+‡3›õµ)ìý0"±ïãÛS ÍÑÛ墇%ùÃÚV*ùvºÐ*ƒª¨G�nBíÓ㿞�ýõ¯¶³Ž˜RŽ8ÌŠW(í—[ûÎvÛNVú&Ÿ®—SUÑm:³s>c2F:Aôª¡vÎa0@üÍöôGd%{õ0-a!`UPùvmûŽ‚B’Zò} ¢#weðHPM—©ö$HÆÐž !*Œ&ʱ(A¼$ª”ÄE>Ni‚‘¨1CàP5h@ éè¤cŠ=} øª}ãât<ù£ÙnDôúÏM"öN.ýÏZ|‹8.¢¢Æ-6/cîÖໞšÏS_¶‹vî¹ôHCð†eíÚGA”–�n†^Ø-³8…?2�׳� ž�]cBÆ{§‰Öý³œ@½³h·ßªN½tí¡¿þuJ{ëqëgiè¶÷=œ\PnÓ�–õç[8Ž)ÉÀ»õ ƒm·´ß³ªßZ/ŒgœÛÇo ÿƒåÅ‘ÌÜv—íž!·võ¾ñ¿›2”ð¶àWÃß9O黸 Ø!véÖFjÚZCÇ&6_ïOMè=žßJ¬øÖ‚=mºÎãÅÌxÛ†M;ïò’ù;ÓŽ> ½û.�±gøõ£}�ƒÿ3~ììí^^u–Ï9«Ë9Îþ‚ýènsiû�-¹è¡¾ú¯æºr\�ïkLŽý›,8k=m· åÜ>ž’|É’„«¯H¼Ê@_ßQÒ\.§ÓoàE¿ŠÃoŸ¯ß™FùO‰T±1çìØÝ¼Ùjøû×iSºEcÀ6P˜%Ù67ËßÒ€\qÇéüî{ÓÏ^þ±X°ÝÞ¶V›Oï9Ú\S‘/®¦ýzä{ì¾Ò«8ñKkÛ›[öŸÛí]¶Üögî{þdØ·'Ó@—ÚVÝÿ¹n¦Ï\øŸŽÝ�ÝvsrŽÁXª¯¹Ît»®ØcêZ%רýÒâÍIøfë¡Ä0×¾ÑN5>ξu\[c*†J;²/îF ù¾"èëõ¯âgv׌¼6�,W«N˘sÏï¯o–VÖt¸äyuY{KÄ翽||ß½62ôî¡É2öèK-ô¾1çM4²à+û�gƒQ.#EøçÄÁ´Ìe�afÆ© ¾H°Ëö•z_ ž(]"ÎB¨!Òèiªÿ€*¦�bºMÒØ°†˜Ö"  Á„%Ôºãÿ3ËoJÖõà¥=ó›YlÛìš ï¹DP!¡ŒmWèÕCIº»YÂ�•ýèïDÆÍ°Ç’u§|H©•±·½ÄyN8ÖU^!ëXf4z´B2Ñ£²¬QY`_@CJÊË ìñ)LgúeëY)Ö~MXãR·—ayq–§ˆ”^Þ™ö·,ôGd°·Ö¹X�2�—@¥û�óHÃ#ŠWÖ] Ê?&/ExÂ"‘ "XCk‘ÌcÙ�°\ÐÈ"ìô(û®¾øæ#¦Â'—ŠÁõ]^¸Õ`ËÍ+J”~ñ·¥¤¯'gözÄD¤¦‚kÍwt4��’á�Õi2L6¯­?‘ŒØ—òå ãù@þ"ÿ÷˜A�ª�R=Í‚} Üð%È”~±!Q•«2Øõ!0ªøX;:¸qð褈¤‘2¥gÓ¬Þµ&+çá ±…Y E�“I„C…4(-Ä6IKU¸^ôÊ›G™WÑEYMݦ¸óL;WÖæ áö¨Ó:¢àÖͰ¢A¢iG\ 9]’9ÖóbH2=+¬¸©,ïh’?xß3š:p'bŠÕ•?dzöà{›q#0*B TYÑãR©ïÂA¨bBIC�ÁL/˜D*&› 4!„"IFi€Iª Ié ²•‰ú$P®  D ÈI„!ª5è0QBG�Îe¦Ð ‡mšjú·««rM¬íJ¹J÷5¹/=Kt¯;âšòü¯‡MQDUܳ–æÌÚfä·3i®bµàµã€ÃÕ—&%¯"$UaV<% 4™•u¹Rojº¥Ù³LÍ·6j”BJxºˆ” µ((=ƒŸS¤F£ù7ww=µííß =óéw÷¾™Êï¶?Ð×¹ënúr‡ÏxÊôÒ'‡‰Pã¨õ÷y#æJ««Ðƣܺ„¬§Ï½ÿyÚ›Zwà]ŽõÏýý3ÊËß>[õ}hSgÄÛï_~ý|¾NîóΞ÷‚v6{ën*vhùËå®ñꢘž8;b$ S-…%kˆƒÓOe±ø¿ŠV ‰Ãßžûz`Ûœ”ã¾ÜÊåû½ô"‹|Üû&øç×KÑFBß½2R¯•ˆ—¼éÛaí‚´ÌÞÎøÎaEz�wÚâä4Ÿ‹ec>7£‹½ÓÎÕïA}ØzÂ…ˆ·ÒõïIkj û¤á¹ô5‹pT,pŸ| @ J‹Ttß¡ê]åÖ¾öæÐ£ùü›8K¥îÝ´ùö5Ö¥ßyõoL½»ôQM»9uŸªÑ�äûÂ^8Íý7ëO�7­ÙŠr¶®ËßñëM¬ÞÍÄ^ýY㠆紗êÛÇÅÅVíÛ¿_SÅvs³·¥#þ½ß!‚Vše®Ç!òkSΞtÏÈyÛ¾_TXÌ~VÞ×óÏX¿†oïCñƺwãª××m¹-ýëµ÷÷÷y×çn÷“„ùÃÉ­¥¢7Ïgí&NZykÛê|m±µ¶×†¿vý†q±?ϧå8·ìÉÎ+“·H D§ñ¡<`?³–mÇù8�Mj,�½¶÷ßõ³u_œ_ôÓÔbócû”Âlæ'¼5š%ø �®ê"/aNõì^ºóÃv™Íãb;ÁìÛ¸žîîüÂN¡ä:„/FfÏž´ýž{�kž#éÇÙâzkùã²$Ä5 6£R4ßrkõ9¾«˜bêF¶WQpD�EC»g^íA Æ!©\Ç!Aí|RXÝÞ|i›�š‹0ˆY×´zè]øl’Åi¢3 ýG˜j©hùÍYy^5ÃW�aܘÚö.ÇÄýc—刾.”£oÕÈÐäÙ 4(´~|-i÷–Z˜�ñvX?™o²ø‘Œ<ÇÙÜÝíRº¢“õÈ7м¦Ùy ;Ñ€s¤0L1»°�ü¼÷?0^ã³füÆM¤±†3øìvFƵ®BtNhà:ÇÏN[ŒeñÏá HÞÑX"�ôcl�,óo)B±w AgD0J,8EÆ$TFÖÂÔƒ÷z2i®„å_º�ëW[|éS›Á£òtÑ‚\“艜œ5·8‡&¹ì²ö�-Ó·ÞWn|9ÂGdxaË¢OS š© á0tíñÎ6ÒêøušQÙø0¦X“Z»»9ˆNó‡Ãž¯\B‰]%˜‘D4JhD@QqiÛiŒhÞø^c9£TÑÛó:�p ¢…ý�éÖÛ„êúmïÁ:8$åÅD½¬h¶V=KÐ-€Ü8{Q`P7Vø\èˆPdÓ¦~F0m¡¤ŠT´Í6S%’’Ãe6�;—U²:L'è…h�‰OèÊk ÅN&g\=V¦ˆŠtA•˜+7fܲMe:n)J£Yµóxú}~¿eÚ˜†jîYw�Ù��¡é³wÞÚôæ›ô5x¦Z)8"Æ0z�xëûɳXý�Ã±ê° ÷V‡ï^W®>—÷›ïßCÒÚË×XÛ|9;ß­Çž¼÷æ‘ĺŸÜRl¤µÙºø»Óãâù–Úg)—ñŵ²þÈSÁyñ>ËïGïFPhÛŽ¼/·ÞÊu ¶—ƒ=^–óðÇݳï~lÓÙ#-ƒ�k9A,'ÎÐñozµÜV_´Ã³ï´uX>¸.¿A‘/us›úé�Ë}wøS�Ôætdk§šöùœ¯Ný¼˜6óîÛ#’§ çÃÞ5Òïï·†æòýÝ—«×ožýëÇÈ�Cl´g Qw¼²SñûÄßÁâCRg®ï!z——8çy÷Ó®£³äe¤ÓÞ«ÐoâÿVÆÂÁ}"Ykf1Æc8‚éü<ÂwÒqt?o}Êm±Ý -C_Âÿú¹K3(tŒå‰u³C’:”d±ª«ChÁ”P4Á��\ÖÎÝón;ám¬ìf5{¡»·—C³“¾ÿ::BçH3¾yòÉÚä½G˽Rð‰IN[õÜ?x™¾ Ð7 ív?²ê¾¶Œ³–¼7ÙÜ|ºD~0�­ë >äÊÿ|ÎÕÛ¶|u¿Lצ÷ݽ�ìø®�ûç¾ÛwЯäHvÍV;�whÛæ+óÕÈf™Õ« ¢ÃÂ+ÆkîÞ3ñ›³xÛ v÷ç–àõ!ÔÆÚ“*ÑNëö°ÀÒXºÒ�òÙ{l?kEù¯µ}èÓhÚÉ ²v9¬oÓºÂ2„-¸ŸÝã¤Ø,+ñ±!¸Â-×u¯¥Äv(LÙä~Í6`¤ŠÂ—cöŸnOïÉΓ¦W¾;¿�Ÿ¶÷¼jþ;uÚþõbôÿNàpÒàA!¥{%½ËãÔêÎ?T�­¯í}—O\Fë¿ÎÞ¬:ÓÞË©Â)aÊß¾»CÓe¹sòŸszù¿z‡R~¶–ÏCQuß¿ê6�=õ"‰#�ÖÐÚJ)(åÒ³÷kLTèå�Á±´â�ÏÐþ˜7£#‚®Áv:�+ }+ŸHã–,ĹL Œhɼ£Æp ñÿƒ‰Ä”^Ý¥«A3©A³]è N4¾tÆ„ò¹?n!x‰õ½yµL®Y Äåo˜WëØýï†Êë"êuÒ÷²6¿„8ýø Ðé–£(‚�At`U4…^\¡D(cóëA VKâ£+å ôkãªEAúþ߯Üê"ˆÄmH=à éb¢´¾‹ê^í)ùg&0é2[Êk»2jb߆:Ú)B7fì…t]\Rl‘*/�î—èP°V$¨Aм 0I%¥¯ŽÅü±¥´¹ûÅéj¶‹D… Á ‚ѥ݊SX&» a0…Cu¡>ê`\`6M?écr³4dc%7Ï/0 ª”2@H‚¦�`ˆ…Y$¢\Šœ¤�$9;3wbd(`çö�Þõ= öÆí{Dª66&°�Ä$G±Ç�P*hc.ΰm¤ÁU¶}>¤¹�ã›F߃óµé©Îu¡@«6Ú`4¡¡½Ž0�ˆ$¦w"°U æõO]Í#ÙÅ1ÜZojb7NØçÜÓv˜ÓLR-Q«1 ™m–3ó‚X"PÀôôfl”ªÀLbZö#ëâ©!#Ýrøûf…V=�¡ .˜„ƒÁ¿Ûö@ Ý0A HR·9i¶5¦[üÑ‘¤‘t J0ŽÀVçêHZµðBH1”¡¦ñRÍS2é! `…Üi!BbB¨`tó!$€ò!$€ò!$€¨ $$$�BIüGþ%)J{ŸÎX™©-¬N™4q5„¶›µ5›;µÿ%ø�‘I”ƒ¨Œ| ®¢(ŽYE¿çR.¤FÖvA^ËùÊž;ÁQœH)eJ3ÿ¢ÒâŸYe×¼KÓ9å£Ù¢kpÜ6u…Ã5¥’¿‰œ>H—©Âh®•HºÙÞÔeM­·Tqo¯ûmಠz…a®]*óÛœ¯�qÒ€�…‘ñ÷Ðƒì¡ Ý íšH$“M4!%õùÞm¾•ów—ü³�X.PX¥ŠK’2_û?±£c)�ZÐÁø¶±Q 4! ¢Qå·MŸù‡É:Ÿ˜þ´€ Áè/aqËg¦2Oy½,^Žì¿î �d³©Õ~ï/ù1 ’Ã?Jrb#Úšo!-Q¬Ö!Á°ów!eWµ¦«AnÊëÍSÒÎ5òÞ‚v$5é`,W=Á¼ñø¡÷÷ö¿›/,«AšAaiòŒÔ�’3xÀEq‚‚äL²Bßúþd›ZrQ¾¿ì±r¤ ììåaXÀÍŒDb3tINHã¾ï³Ø~OgÀ£¬]ñ05$�ßøÍ­öãÁÕl6æ¸<@«é¶7Ï× 4N#Ï.ÄŠ¥’Š y–³Ók ®.H|SåÛ¸lînBy8zk¸N/6ÌÈŠÖ}rÙœm©Åë"õfÇ”>J×Gðí¼Æ9bÝtÀ)‹UF`çÿxi |S‘m  'ÎÄ"�ÓdUÞHÚ⊭ú°¥®Bгì…´d*üBˆŠfo¡Ü>Ñž?«¥DƒªjÜØ7‹øp‚5X‰ÁøTZL¬ó„¯ÿŽ9×£v»£1%¿æ�£L‡}�EʈÓý¾°‘¿_wÿoЛšÇØñû«S0_”üò::Ù�×Y«�á¤Ìó7­c'e°ˆŽ{À|]Ð:]ÍuêIW„–œÙ:5åÆù�ÂÁ˜¸bFÏ‘¢iÌŒ�U¡h¬U{°–Áˆ„%³Ñ£x„�ÊCm”bÞå l†ºF³©EyÁÚðÏ’.j¢«³•H=Ä™‹`Ü€Áo`ðB´ áxVRýÄ6I”@8HX0`¤¸Š[ëen_‰*4Ûæ3z§ª¤*k``Ã4×häÞ‘~+­ø‡³Ì� WPȃ&™&<Á^ÌczÓKãžÆœHY®]„ï¹9ƒlé$vˆho|K Õ†ªù}-)pÉ‚ì³E÷‹µ³4baùÍ™ïƒð#�ÔFc�RÆ$Þ¹Ú0|µ]ÿ¯…‡Ç=°Hí”$ö�Gm&ÛA—jréFY†ms“ÎE^±=p³¡ÄÀÆÙŽ0uäʵZLlÓg,Æ2Û3k7­ ÎaeX[t÷ŒÏ³Yß0âä\y,DåçÆ‡„ðÊ N9þ¸ �\¿^wuW ïÝ„‰C8.M环éV8±™>‡k‰5¹T ÒAú©Bó€|kÎh¿ôy¡ü %¯2^=xëÓôŸoÚÙûÎ3ä�| ¬ÄèÓ ÜÇ]uwåsŸ^ë±6ú pEc2Åóh˜¦(43eÁ‰/GM�±Ü­€7¾´½Kö}éGÝDz. „ø¸,E½ñš¾ŽË%P׆ýàL†yEòçÇñSùïÕ»7=C|îÐs‰ÂµQ êZ�ôžJ>b1ëµÕ »°�Bu`ðÇoÌÊLÖ6‡h“õŒ‘¯(#»[í½V¤—à�4Þëï¦ Ü“‰m€’æDAe¬V·FO\2&¯Þ— ³Š¥FHÖcHÒц†rRb¬¨@l­?¢‹a¿À–LÍ£zóÓnîèÍþ»Ô:ßyïGþr5SnµÞð^ ¡ëM\Ž~ œX£S©´\â8wª�|tG>‘†0¿Qví±áný&¥�c�¯=Ê;wÞÍ&0^¤öûSŒ‹ÚÙtÑ ͳ·ÀÅ)…R›é2hÁÈ©x”Op¿²œû¾co¹Þ¾ùPlÅWPËQ§°w¹¦� RüAŠêt�ȹ‡‘^ ¥Á�8|c/µqäk Ã'çxK†äΆàŘq”@äz03‹†rß"ØQ÷O};:».‘–q±…êòÌ)D‘¢Åb“äFÓu›²€CƒÎð°M˜;Xïv‡¨V•ÎeœàâdyikõJ;Ãæ{–»Ø“u?®‹b.?M-„}®<‡N Ÿû½}HÍÂQ¼3Ø¥‘Â/„ž¹Ó˜r~¨”á´™ùFÛøÿZx]Ya \�¦ù°¿è�™Å4‰Ö÷Eh5¼Dužnb<:m­VÔWe·ñ}â ©t•¤Ôÿf‡«Â¼pz> Äϧ“6¼íW/Ö³¤}khÓ^.êC–7KW €'hϾöò|`×¶'˜?@H„W®ÕÉ#‚8ÑªŽµ³´fwŽ~Vý±�ãÚvÅasp(´áí2ˆ {˜lÜ«6Î*±”Àyê­ÎR%ý�ŠHCY¨w7Aµ�«¾L�*O&2Pe~ ¢½Á€Er‚´x,d M®%Ió4XÝzUpã)öLWRãŒ3qrC?߆êA�z¥ijÉ1ú¡˜Ûƒþávyã7¨6¸š*%!ýž†‚|˜¤¶}ŸÈá#D�%kXŒw?7ºÆ�_+ïÚäê�ÚÃÎ�'`{Ðþ �1XšrðgØÂ¶¤xLob[ ý™ûLùü3jÇÒS÷Õ¦„Úá8 áJ{ÎÚ=Î/}Ôä¨1é 3ò>íÐ]¿o’H„L eaü…¾#ö�µ{ éðf=’.f!bý¬¾ežM¾+m}øú£7ÎÁoB/gý‹†ö¾˜ÿg |#IÃûû7ö¤aÈ› îüIøf!I¬=±¨v‹-¾qŽ­Žç*¶`�Á%2E†ºïkH‚ã 0ÊÈ´/ÿ³ñZÄѤ¡{ 9Z²ó«\~F¯™¤M{êùÜ�Þ$“ÙŸ½Êx?¶/ €EØ@«àYzéÅq÷ËÅǦð~ÖÉ®¬Þ$;„Ã:ÞÚ™–=Ú>"Bô/¼’º‡å°.%U8Ó¸÷æ®!o£:>‡"l_­}\€ÁåCQ{B™Î� Æ[ÛîâàF›¾sÌÈ ¥a«¤¶ªï&øSëO†©³"¡pÇýã �ûž’�÷†uÃ6¿Ó*¾QOà1×^à™(‡ä,²MF¿Uõukíþb·<"c®èáû,lh·i¦ ÿ¨çir(‹‘’?_7VóX¥S¤ióySAa�­­ï‰^–ÿ€H ¿×é^ïû_ÏËßÈÁ$R=ðöýë2fçÓ¿‘Š@{o÷ët¹øþþ#×— ½f"aëmýÿ�$·Jèòô˜Rv¨€å%>cô»ìmö¸Å]Ò©©ª×?ªeïï¥ú^mã›ùâÅØá :ÿŒÏ­þß‚k¡KVÔ­£­\.ùÿ�úþñ}bÊeÒŸç7^´-�X1xÔˆÇn¿FËtB5<”¨Â‹À«í•Ò-ÐbÏT3Z^£ ÒçÞ`~a6ÉJÚ‰(LK¢h3¬% Ú�’wÞ‹•Ö)d»¹We’”Fç Êrœ²YµxNõ}ÎKܽígƒµºâSYŠWÃÒêëºæåCe’?  $±�Í4ôÛËÒ/C²µ>íëgÁäFÈèq祊‡%E …D1Œš`Á‰£m¾*é>3šã™‡ßgd,Úmƒäç�0‡Ç ½i?tI_Èýúí›0¿��õàõËšª×™I1h}réâ‘òÈ+Ðô0«KsÇ‚5! òœ]ªX8$÷Èÿ³üwPbhßîêÙà‹É£5IˆÃ63ïKqßè3ñÍß°ãò”@n&Lþd(6²Üat€Âšø5Ž )N*SpƒÓ×[8 G˜8™_óÐ,�ëÕ¤¾ØT|ËZ%ŒÁaª¹ ­Ò $]8fÏ)ò¼õ³ -_òÚFÕšP!�È]ƒÐ ‘cüãWßþ\'š'ÖrP JÐR‘ºxeQˆP<£ÝÒ`ãu©ó["VmùŒÛR ?ÍÊéëd3¯uô"O§æéöP¿à¨þý„“qŒåKvˆÍ묙h^°,7AÉ Qœ[gFËÎlZ8e ì™Öu¢ Þ¯ ‰ÊÒ=�ì::$£|E³Ä+˜;Rú "'­Êñ¢TÚ¶ã&Ž¢#4 qÙÿl}Òqø™—õÜé×ñóÉë]ÑÔòŽ$$�àÅiãßc±rh‡Àðʉ‚©�¹öCNiuÄ5£¹›Ã!ÈWí��¥oå,˜D’Q?c*—]oŠAlú̽‡º÷/²ZŸe üõy9n„ùSdÊM± Nxƒ¿ù¤+§†z4ßÅù mUkC •%}xQt<³ÞKrÏHò@¯ûûWÐßû“ðÚÀïz[Wøƒ*}ßÖ0·‡�JŒ¡¸Ñ|ÖÔ±:vjУe2öŽ…{¹L«Ã4¸l¡‘ùÈΈÿYF·|œ{Ãð%s¥\è¼¥fкy š_7¯;®Ü&ù�‚µbóÂñõ·jÇ rPí�-íN&WÈÍke.a^ÕHÖ*‘µëÆ(Ö«CT¦W­)RÛsÿ¡ÙÛcI3¿í“?×áZG?�}}Fl½Í‚�Œä|íú³�gâ¿´ØÞÚÓ±8;°ð! 5Á�ñŒQ[Öp…kZ_g|—êŽ÷U‡Bñìa?ÎvûtÞ:{xƒ6 ~VùðÒäz§@Ø\òí÷0ò:Uâ›?Éþe ûcÂþÅ �6çïÛ•Uߘ¬±ŒÆîœOLg{Û‘œ¥òãÎkÙ󫣨e—ðwõYéºþ«\ _üvE`ÕKÜY‘G©røct5Q€¤ Ci…‚` }ëÙ¿4It$¸YŸ¹æ"ý;®Є÷¹Æ”¿Ìüp�ŠÐ‰mœ}C8,ìkâ½ßb ½Ó_6ŸÆdµ“ö_ dè?è\Œ;X¿O(K�š¾„Ûûû.~—í`xjûº›‡¹¾6…qT»»·« BÃïðÅ�  ã;ã†(9Îbð_<аmgͪkĹ“8½·3øòÖŽ çx@¥N]jÖÞ]Væ~dÐ~åi€Áû¾yk±cÖKO¥¡�ÖEÃ�Ë©N=uÛŒ ×µ=7;Œ�5Õ¸ùÀÔ2HOe¿ÍtE�†|!D“êúÂh¼ýàT�2Ø1ªÑã•pVÜÖW³'Á¢lÊÐ/\ãe–êi:™à}a‰ËÉœ°åˆ0mØï�B´É²ð/êd|c%ûf…q`tˆ–sSøMs¿ªïÜêî„ oz[3îW|’ôàó+͡󦌹¶x¶Æ{ë�GÜ.+u¤ŸAú�çdéh)÷ð²åoËf‹!A„.@ÉFÇåü¼åX,û™ùŒã}Cé¥a-Âþ%?ô–x(¥•±ÑjäÄ\¨�¾(¬ë}x¼7ñã1½_íœy&ùëìcU¡‚Ñý# 9¼�…÷Ÿš|ßËãN £îxÞT¹ëËæ<ÐÝ?ÈaO:pÒ~‘ü3cßæ±±ë a>¤°í<ùW ŒäyõÆÙ¤ž!)”—´Eˆ>ñÃ-9²K'�B¶¨u½Êà¿ 2~>›xaöé¨ókp–-ܵí;é]¼ñ7œ´Ù°^ è'�mYªîFZ_(‘ús}Å¡(!q:ϰ­}@�­ŒìÀÇÏÔ°ü Tû>ÝË Œkóû÷Þ1aãå&×1¼o€˜j·|^ýëäož\yý(Dæ+>—©u�@×{ ¶•Êöüj“”¸ŸÍh‰cǾ|—­^´ˆÉêc΂f¼ÉU»©]<ÀÉëêXË?(nrO™¨¸"!Íðö{ÞÚ l'äXÇ]�m¯Ø�$V"œ[RBŸ«!÷^ßžŒi9‘™¹§ä¦–"ÑÎäße¹%ÖnWƒºJ¡,æÃ ]Æ’|�Îgâ5䙘µ‡ùb B\pŠ….ô›óÔ¹£/ mvJ4õäŒÒü=a/sÊ„Êóç ®~•�+Û.òïáùW:U®$rLY¾™æA´5º)¢I¬c1š]ùOÂfzɸ1Z¬~ñ­Qµ/ð—·ø”‚ã×p£˜hwÔG¥@Ùuà×Í ‹'¾»¶d<�$Îj�In…çžû€¾qõZ×¹fô\ ¿ô¥›)SÏG&éD9;`n‡ædNçDüÊ/|á]}Á茷ˎ/¸„Ø“"10Cýº™ÞWwŠù¨’§�ù<Ý«ÐùFâÛYÇ—Ïö ZIM¶«ZRÙ{çÏ� ™åoMÌû^s½^5MÖý©xšÑ•ņ.tX&Ùýè¹µáùáe6Nå´\'÷ÜÇ‹aù»ßìŽæ³ðûUß>5ü)x_²Oœ×±ÅÉÄ^áåF1‹L1O™©¿ÕH3Þìtúÿ§Ïî¸Ì? �ÒÅ÷°ÄJ7fFã’E>ź~’[‰§ ¿©µ%‡n ûýõÿ‹Œ¸×í[Â}í:êÔiqù¤™I?7Öl‚ֱ䆉VZ5�ï3Ü ]sW'º.ÃRPÆØÄ–>3ôF:<û@/›ÐÏ«ß$˜¸¼÷Ô1}›Ö c/a¶>Û…b ?@fÓ¨ù~'֑ËEž6­ ††³¶…ÐsY°�à—aP7ù@Šq@ŒØ5¸Í*…ùižõ/OjÏ%û–<;Rí Q­nTᘌ h=+§�’STEdèÀÒÙÑcõêé`:ä ±nù_…øû–†¼Žn’8/|X~rI"á -A–ÁÅìɵ »�ž s�&…_J®V Mg`Øe²¦1‡gb¸q()šJW¡Š4¸«Ÿ@�E(¸1hÃÎÿ¿ÃïœÅêþœx­u÷_°|R l†LK•ײëýé x÷ˆø ëj]çIé4–Û4ø¬T’o¸mèp�ŒdT�äT,šå�š�Ÿ‡d&BÔ€òš¢}¡NCPA/Æ i«ŠW?›L'=¤@§ä_ÚË ðè19©Õ�I®—ŒdŒ6x¹»v )úîƒL� Ä1˜CG7£o„7Ò â´ˆ‚® h´ÑÏPñï§ï›¸,õ»¼ãi÷Ìrƒ.|y‡ÜÝ%s»ËϸŒfÐÚO\Á\4ªóÌŒy&&®�ò ±ºK¢q“RçŒRÜD..ôn�H­Àˆ†Ùôú~ú£Ð³�cÄ#«1•¸m»©�âêäœ-Ýtúî5¶²{˜+mÁ ©Žl´Š[;ÁÈ!"É£ˆ F4ôæ9±h½ö.�[Û‡)QQ²sß¹ºœT'ØËÃÛñ«ÎGÅŠ~�µ`¯áôί°¤uÅS¦ãA0_^Uë¦ã^ýÔì+ yƒ2Íæ'ÄKÞ¥Xˆ«mBTöEq RÊÁÂùè|¿„tÞ�÷T˜/¦îkÝÂ×H½�™þó_{.ªƒ>ÐÕPzóÕµŠóEㄪòòã·²óFs€%na†»xÐÄöm.t至"ŸVw;ãɾ{—uC`ñÇ T>ã=xò­9œCï‰ÿ‰>Ï«ün¤˜Áz°/ HIß4Ôo«ünD&ïw?-ˆ¹ @xÉàðŸb+�ð�c¥ Bì„Æ^Tr¢Ž_CM*—÷q9òPŸ>_ö~“·[3†T{eÄã–ý†—8Á¥ú9èÎítkFØKVôÀ«žŠØ 7°d]` °ƒQ¿Ô~fG»£ÊúJ”–PÍÐÌþøpY,Ê×2{î@‚Á1¥aÂrù>(�Á¯Xí c ÄèK�õA°ÞUm‚—ÝäÌ@Öï'±�©Ò±¤2Œ4ÆXm’Ù­%éü*ýïÑÎñN4nÊ!-œ‹û ¦…ï +ùÄ¥eO|? ð—ÃxÕÔ¬‚*Ê7!K kté½:e2¬%†MYŽï9ç}'’�¡šÌ!´lÌZǘoF–Œ³—¶œéjï‘l;œÓê˜8¦J/=nrî|>�B".rÈ1^¥¸µk%¾.½#)W{9£j"±»îMúñð#öµiÆïC¼?ã…b"¹}û[X1Kß\ë¥�[á––Ût´jÆ<¶é¥ °k¤�o!³'HÅ£;!p·éw9!Ô}í¨X¢2ê×ÞC:_æí¹v¯£…Æãä>|(U/x:«{Ç™‡’"Æ/ú�²¶²ŠBR?üzx¡ÏCñ´ì¤Q±I›ø”WÃ[õÝ8‘ÅÇ'ÕÀ…4Kî5OWʨ¬\8«\…ñGì¬Øˆ-Êá¦ÇŒòìîŸG<2O§Èåyæ`œhŒ‚·œ(/Þà•|ȾW9„¥ÚZÙ ¿{öC©Tô2yܽ¬¸É¤åM04øË%çÀ3õ~Ñ�ì@o5n UðÂ9ˆNÏ‘Ïýmú cí‹ÇA¾8Wõ ø“F°?wHgx6h›údkŠâ ü¾,ã–öþ"5mØÓk.R;2<¤Œ[i„ýÌïu»ú/Œ1yÜ_?�Á¯ˆ–½^‡Üi‹à/q”Ÿlæ6¡§�’pªÞ{WÝè.=F |8ôn„<<5Ã.üÚzÉ ¶l™bÂo˜Ôfô:OènV„Ã"búGPeº_®¯eŸÿ }y6|&̆çb!†6� `8`¹m©¼ —‹Ë}¤–."’Þ|ôœÍ¦DLL®é†Ú’ÌF]*.§P `í%‚*ó¨=*+óŠ<õ“žðµ¼Xw¤¨w¼…/ÎÊ5¬thC&.¤›:cE†+^mÓí¸¾ó!:ù1ÔI®OƒÝíÛ“«AZ«)Ee  Ò@) – Þ�¯¯2¼S üt–fŠ /D$Qúk¼_ìŽÎÉ÷ëí­÷ºú6™Cjê—14l+¸?K ŽrùU>Óg­…Dt²OùýÏx¬÷Èm»w/¡©@Ä?Y!s”æ#ò†Ù-õ eZÇ‹í rÔ×ûÿL=.�ëΑpY„ nÙC(x÷¨ÞÔ"“]g/ý¨«`^OÑÀ�eUÃEó?tÍs¦¯äXPs}1aïC#Ǽjš2ž,¹}ê�½õÖãÏ{¨•¯Ê…Ï`©cÓKÅò’vvÁÓ(GúmHl)^A…Z�Óôª8tþËö9C!å {œsßg sª;dåñ—!¬ø¥�nêw¯¤ &U3•²l¿ºô÷íÓA�Ià â:{ZÞ¤voôìEzæÿSý§{g›Ró‚&lpNÉ|¡»†õÅK÷Ô÷Ô|f{¼õ Ö±�ñõÎý�[›ÿJ&“›‹'å�¶6¾ï_¿qpnždh¿c.Ncù mB{%XDÏ‘p_Åx½àÒ×A1)õÿŽò;x`þQôÅàq7’á¬Qn äÉsò]g§ï>o2õë¾l¿Û�0:sðy�]‘ŒGß:¢iÁ’)˜ÇtÃN`Î,ŽõÕ[ÓÞ®©û¿†×ò˜ÇσeËÏ|ÁQö1÷‘‡»?‹:óðÈg·2›¶‡5Q}ÝÜ©©ýdÅà ©Û9 û†‹ˆ®’Š®rá£Gi8oÙ«W™úQÇ„1ÓdÁž¼0ûQ^$aÃÞÆgb ÿ#Ùì5«@¾1@ñ¶üþã7fîG„ç6 õŒ& ‰„Ã6®¾ç 0f¹B½Ó“L…ïµ ZËáxç8bº"ŽÞ'FÈhê®·luft±›å¶9 ©Úì·Ì¬ìÿ¨é…e›wã–t‚õ;Î1¸oá @'§!} øà 7lk@]¶f(ŽÍÓ­b‹¬Íàbê1뎕IU~/1uÇÐýT¢) •áÓÂsÊÌ9‘+™ø½4Š&B�`¶xïô<ÂJdgÏËÜ›Qɲý•ãJ£„Ö”ÊT>å±f�Y~x™K½yòkö<õþ'â‹¢ÙAŒ�ωLÞÖ·çЫ³Ÿµ=ȺKŸ™„xb¨sð<ãHDà»îëÇíÂ=^®…ÇÞþoÈñòn®Ù$ëÏ <0üÈ€/éƒ<‡{•ky¿ì2Bã¾&W…‹™UÉ€%2&âª)pÙÊZPø7òö³K•1¼úücåº4ÙèŠO¡ñ{5ºež@­_âZÛ÷è/BJs×Iìs“ôçI¼Ï·©8ÝÑü�ë¨\¿NÕÜkYlV±�ZÒü¯ �Ì~v’шå/•´¶ÒUk*h4B‘‡nxpæ4X•?ÍF‡áÝDÊ+H~ÒÍîr‹a#ó© =õ®¦SŽ—áÓ ŸVÓ-Žºêÿ»ßœÀ>/.i�–ì5r}}¤¿PðÓ &�©¨'kDJ<ƒöá¯áp&†f·¹Še¸Î ç{n£â·é ˆßï¦ïÑÑÁai¡Ï1#• 4^§/4?†;þ~pœ‹dÜKÛ¯wK‘d,/ŸPŒö?§ñ'ó%ÿ� ý”úöÆ pýÈO>�£Ïë�eԉ׶Å$½íà¿î/1 ûò�gy›¿o²²·ˆ*øÌ›æGêÖG›òá®!€¬Áy™Î{î[$£—˜‡‰eAoð!–!�e9+7÷¾=䈩\¦\MØ~c/貇$q»­(sZ8ð$êLCvjÉcP9ȧ´ïžÓ#�?ß–5w,èÁ÷µí&úyŸ–å=¡ÑÔ”zñ; ¡Ì±Ò=Çc¡IG¾ï[÷6’ék ª˹xeè[Þv¿ÊŠÄåñ*R˜üˤ&×¾}ì‡{ûë\«5X$‹¨Í#3˜U1waxÔÞnS˘Ÿ9×|è å¤]ñÉ×÷Aò{äX®Z?“B�wôyI·9Ÿv1Ýœ�Ð<­]½ã¯ëõ+÷ÚÜ*šhõMMñ‘ ï�‚,'Ÿ``at2.aUB\rzdR„!jÀ0¤.O1b`Së�CètJ…›6¿_¿âëíßeaŽú=Ì á}ùÞÿo¹�ýYÑ·=4ƒ8¾’©|ÈU¹F¬jaØö£“ Á ¡²ó dOÚêµè?ú‹/-,#v�j�e Ä�#áÞà$ÙYÈi×gú�ÿ&šùƒ[³­ßntzìImM<·sgyÎî™Ï/€‚ù�À`Öþ*JÖ‹�—w*ìé|ßvÕ›lÁ³üNUfÞ½Óâ’o¬‡e4§œMV±8�²ï÷Ö÷}ó]ñ^©ˆ@wådgµÎßwÈÑ·º�“)î>�gÏ}%Í_î0ùˆäw£õ\[þâlË4]Ð?�Q¢ËŒåäk§�wÁç‘#öõKes9pIK k›RÁ©÷8¯ Êû&ÛR¡eeX†Mgr7¬ca‘~7¶·¼DßÌ-à•ðŒ0(—Ð^øÔwiÔ ³F5>†8�ž ãàþ_s�m�ûÈæüŽøNªý8G.÷5Z—Qš·¡“½ñô�~q/G¯5»ïY’³û>�õÍ‘ôqÚN€æN]çüNµÊ/9l–XŽ”oÜã‚�½TmxØ2h`ïÌ`ôdÐ[ì˜]Gß^±€Á{©P�¯Üò!íÃýmü¶!D4–ï.Òæ`vŒëÄ’]x–û } zBäüw×êô›qjœ»€¸4 "úü�üdžùÀ{ø8UŸÆÄ#nV‚¶¥9œúÀÉG×$ñŠdÃk3Ð×:ö,7è,ôèHÑGtÐ!‰%dc“”¡¢!DED:@ËË››:–rwéHNÇ&Q µ@ŠZ "u�2 ^PcFöÛbëÛ¤Kï7'ÉTdë 0§ëgz±ÕÈ);¼*wq ­ˆud¼¡ÉB3�ô¡‡ &²Èkr[Æå §�m”5@¹çoЏÖÌBL‰ÂsÃEƒ;k·J  +\jóYT´mگ˲ð—èÂ…ýÛÖZãúOx2Œ³5õ¹¸Æ*Šú�ä•q›Æ ©°Ir!¨'þþ±~?}W÷”éLÃpäŒÁ拌\ìúÞjlqŒiÜðÙ»)د,¹�MgK°|¢&x¯Ê_ç�Äg(¹ª>D#o®1y*ž¨Š;ôÎLU9[æõß8D5!«š��µfJ᪠øÆ«_€Ñ÷-q­¬x<�€Ô�t•°ÊB#L ï;3»êýNkyä„RØ|ˤÓt¹d»ážû»œJ¤0¹�;èM¶ˆ³LyÐÖuîcx“ºþâÍÆò óM ÄE´@~ØŒ°uö“8áãJkõ"d)ÉOW~Q‹¯€t˜,_=Ôyœ«lF�ed%)¹�âBx^æ{õذ'Üq½ãI |8ÔRô�«±pÕðŸ±Ã9*3c~fª!Œô_‹·R�¢Ÿ/z#]ï:J!ÖaƒVÙR­Àˆ@L�¯bz»Œ•v®7]óæ8¡� ´eLF¸`qa¥"C—ã'ý~Â(�_òMCtÏ‹²X/5ÆôØ\ÏܘrËì�ІÃ`�>'X}ÛðÝ—QoçT”UêÏOÇ8àBøïÏ^æ¾ –ÅlŽå¿ØÓ¿Ð ŸØOü0øÕt¹w·ï¥œ,a¼Xp=§ÍzuA]ÍÍ4á`�«<Ìîa.0ÞŽ¶¶z¢Ìëe²0ç©ÐiAÔôC4�ÁÒR ÂäÖ×G€~ItJ]D¸V\å FS>iË7uGÃ4¸Ë:if¡/ªâ»Â=Ì"e%©Þ!™Ij0ù¬_¬ eq �ƒ7¿$"kç2 ;u<.àÑŽá Ƚ1iÒ$JÞJ2®½#±ÆØ!Ç_zT¹¿Dh�k®K¥»ç�ƒ.qyÉ�•KXÿR9yÌDCæSÔ(~å*’ª{¸¾g‘'¿6œ¾]’ˆñÑ‹Üe4¹uÑ]eˆ©�¬!td&'aS˼KQ™ÁïeœI¹´:­+)S¼‰%ÊÞ´ÈW]8¡[§.4ò¸Saš\®`õ©Õ³Ü4O9œ¼] •Ρ–²cn/çEO�0Æ™©[{q”�\ŒÇº%Ÿ.žßX/ ÈAâò²¥E�s™ñØñáÁTBk:o5…hÎôsŽ‚Pò1¦kSqahø'^ÃõoQÄ3c�Î]Ùx[*9ÜòçœMA˜L‚¨Þ·9K“ŠÁjàôìçOµD¨É9ª)Ò”w/¨‚ˆL]M�7™'ËÓKžYKX·re|2J"âhàÚ {¤‘žCâ�uö�¡;»nýLÌ·8ú´ èiF�*`‰F³\ˆŒæ.å†6»!qï‰A”)„;ÐKÅoœ¸Ï79Ãß­:¢›¼¦Ð®Yãó³¡M,L5³Ûy¬ÍÆ.›CâƒÂª(ÁÉ feT ‹¬+ ¼pv±¨É¥ƒ¹û÷·üõ/Ãî¸N'¢îdÅÝë?ZT¨-<·À=»¶—¥?á‘ °ŒlX³S«‡ÑØ|©R¿=vF¿1—Ë�W£ÈI#¡ôÖ8(ƒD:MñítƒaŸßóÄùÔÓî=1ͥ˜s1Ç™e§¿6ýÝ<Ûqñ²o|�ýî¼­z Úa¬ 6¼ŒØÏnŽ�!lâzݼòÈ9SrÅ8öqJÚdnti>RªÆM ±øª6ÿºKeG:h¢hü¡²Œ åŠ8€-¼·6Tà&ÄèžÀñÀŽÉu ¨ä5A‘Ó4+‘™ääƒKO}aIšÕÚ°òâz]Æ,W‡± F4R¦ÇñhðJkÁŸˆQ)‡îˆ8ÎzY‰…p^£ :P*ªp# öò"œÒ]-¡pm},jñ}ê¤yhã!·ce~T::R�,AÊ·Þðµu½Ûêµ{´°A2Í‘=‚WÅbçrה웠÷¸žg1~õ‘Lô$à ŒÙû|µXp›—Ö¢DwšeÞ/’èWÂÞS:U6$<�Ç£´ýä`94ùÁ¨_9Ä ”èp¤oÇÊž'ÜwŽPè"û°ôý;`…¬]„0«5h6ußRHÚ'r)ÁÅ]ósc]¡õ½dhb«4ü{7¥ÒB+Q' h³ê[aÈ̆ÿòÃ~oܪ#ð`‚d¹åFÀ<�\Ö‰TN}W^n÷åìwÍr9æ„m¥´…R" 4¬­‚¹Ž)µÚq¦AûÁ°‡´žG¶çKxQ»ës"îN=ñ&L•3G2L V;Wå¿X^É\pÇÅO—ßÊ5}¬xñõÑÜêVˆ*ÀQŸºùÐÄ>AËd‡ Ö'îØ7h*1á1+´._öÍÃiH²�Ål⇳¢KÞð‹îeyžF¡÷ÿS�àF/á%ÖÃcç¤8;1@!mÆuäÄÞ|ce“8>l-ÊÅÎtÈŠþѦß=ÂFô¶B“È#Є…ã./ǶÁ+—Jýµ `¹ÚåïQååÇvwÒ’>BxÍqËÕ‚2 ¦È@ÅO ¼ógn‚¥mÎHÛ(ž?ïr ÌK8M å#—{u¢· ÎëÏrA$è TÐ1ßö&¦ ÒÂ@Jca�g¡´:3†“àá" ê|£ÌvÀ~©RW(sô„“ ýFà‡f.ì–ÿ$hØ­È7ý¨×çQ¢Òbý¨â¾ q–¸V;Î…ä¯Mè¼Þõ¬:\‘ ßÑ ÞJ ©á�ßÎÒç/§ N=¤fÙç_lƒ[+<‹Þ\FvHP;e+ËÇ€Ò�O¿fëÛ ÌÞ(³x¸¹ *}û÷ïF~ä¿| ˆCü݆4Ï‚Èäçäw!å!ng²–ò’‚¹pªÄÑ9©pe�©ö÷0ÿ¨U`®§E8ù¾aåÍËùæƸ,bd¦çƒoÚçâKa„ëG( _`´á¦'¼ãá%`³—+©™Œ0Ê)'ÃMé=Á|­ƒ¬m÷ƒm\Þ8ŽÎØÐ»k­–/Ý?�˜Ê$yZiÂE’¡*¯_{ŽMgXH!êM…²¢•ƒÈï…îí!‰cu$a†ˆ…-î¨ä6,z×=µ£+“žvÝ©õá•Ûè -oÌ÷¿9(ò{;¥½Ås>a†‹>¸¾�^9Ñß/EŒóoN0Aì¹ùÂ’ç<]¸ó’|îûÍŠhƒán&á£ò½­aN®^‘yb‹MpÜ:97RÊ$}Ô9È?¡MÿM°û�kþAjÁ?qŽÏûÑç ƒoãì`�xdvQpädÿD$Góø²ÿ>i‚õÓ^¤þÛú!/—ÿ>ónZZ†)Wú\8‰ºùøì~Â×�¡t¬_âè±]yrœ‡�æ«ÊÿÞwWåÀ··ÆÖ‚-wù´óêbº4AßocË’+Þ~^ÛD=íž–ÏdfûyAÿxçn¢ú¶ó uÖlühòlë,_cT~ŠÏHÈ.û#O;$ŸF)@ýÐ 9K‘vÑÎ��¸øýúÏɡߒý�øgNGG¾Ÿa¯`-akZÀÀx3Á�Öjóà!ºb™ýäH˱^Üë6<#tMl’–òÓœ°±F/:§,”4®rÙò!T'+&�7ãMoCt“Y ÛDÒ˜¼ž4âð$É•ØÔzJn`ü‹’í�È«/�7z¦ü48+[zêÏ85ÌþÝ·0°Ž ‡ †k9ù2ª÷K—¸,UkÂXéw•ŒùÏÿ,¿…ŽåØ‘rEµâAJ‹§$䉇=ÀØ0V$úµl:™Ÿ*UÃü¶¶ xiÁ[@Ô%.[º½�HÍÔ1X{.‹w»‚uÁAÎш=Rþ*°䘛â!w>/ÑÛ¦�D4Ìcßf{“µ6ÉVääö5”èóÄ=Îõì4ùâoÀ®¼-½#+Os»8 ýýÌ'¾„Læ6Q€s?gG :Ž“Õ["i4}­£qÀì2åmBØht¸ÖË“^‹ ­ùK­Ï sÆsÛ]÷­sˆèuª>v/-Ÿ‘¾dªKù|°Á! mÚ§¾Ü¨Ç—* ‰N+€¸ë›.’­�òKÃBF«¤gY%ÓºFz…~& &Å ~µ&¿ëî#m¢Ç chC ¬•1êÝ™%Qˆ—á4g�Œÿ×—­‰Çüéø1žß~)qÜJƒaöL{ð“5+Œ/i¡�‚' Ë­€ç$š $´D~ƒPžk[¸Ðÿ+£?Ü–¬'Ì‹rÚæ58«¹‡„�ጩ­k\¹n0?…íù5øT=üÍš‹ÁŽàŠåšðN>Ÿëý s}ãza�%µúvާˆEU�b÷шÅžh<Ç/µ<®È¡ÛÛØ®nÙÇÛýwÛgÖKŇ­úÂx©��� éÈÒç¤c(‰Æ7f%ÓÞ ¸{­ ¡2è¨\ÿC7‚õñçƒÝ[ô†'À²'xÚõvÙjÕ[]0Û^fëq=xõ,Äì_¬Oio„«\½>jÆÅè¦ Ôí”ÍMè7†yÁ3Á al Z¶­z/KD^�˜#)ô8UœPŸI«FhÝbÏ02¥)öÕ›Ý�v²¦­§�%Z% 4Æ]’†mW4FÄ É»Zv„* ODÖ„‰ª—æµ|ÎËËëIàæòÜ]£’_‡Õ•ãŠÌoÞ�¨×D�0ö;±É79Õ¼ý/Ö.ˆoyÜŽ%ÿ6�æ-¸Ç�PG• ‘gÁagl¼Æ¦×$2�”É|ôóò«æÂM%¾Ëdfâ ²¹ÿ3^Z³J—=)}ð¨ò^õžrò¶÷TÈ™+*ù{!q6ò$krAPÒÀóa�U�£„¡³Ï�·£{g‚'üF[sºè Öø}owû”z«y©õD,ú¬$î¨S°.þÃsz½9ùÇÀƒÜ'$}Åßø6?$Žù‚Õ¹­‡7A¬(uÅãøºËü(A oábjÔk0 >½€‡LchZº|Ÿ9É{{ 2*¤ÿ™ ®æãåñöZ²& ­¿0óë_‡ßðÆ^xDp`o;#¯ì̇•°!³ÂL)`/ùݧz$FjC5pÿ»þ¢£óÚýaûË×y‹)e�ÄÏL19 ”{“žb”#Ÿi³5›�d¡yn;,ÞŒ�^i&^‘Qj‹ÇŒ ôÏ�÷f4N6~u¸Nlå�\ß…ÝCpýõÿ¸2k$oíE±&[ÈK‚Ò×9Ïøhð—•ßê‘Ì{j38=~]_9ZÙÒzFÖ‘¾ ráø ©)AijÒÈ×Flõ˜ )°Lähñms½RIb•¦ú¶ÙT¦4ˆTÔñG ep范¤"Zi5˜‹^¼÷Ä¥z<°œñ0¬La‚,–.ý^��Gk™ç¤Xò"Ë Äûÿ?áù$D,8™u;÷Òþ6(iƒƾ2ú“ïÞ‘‰ßùÌ�¸Œ{ï‡[Ðü÷¶FE{PcÓ`ØØ†×未ùzã¹ßäð–f‰Š§“à%hÀŸÖkiž¤ú¶\‹† ÎÞÝ®MQUH li�ó?>¿?ÍûÍr½rd$¨Á C3ñ—·õëãwJwï•sû%C~z±¿ÏOr‡""%Ùvbó�µŠ(ÆL?ïI˹öE_ûòÌž×ÏŸO…k 9ô¤²AS)IÏ#2zxbïè¢Ñ+i#XÃòç·ÅVÊT›ŠÉQ­‹H·|]…uMJâ³8’Šáªc´#±ŸüZZF—gOcx–+/ò)lÓNާ_s©�þ!ü¯ìy³®×3®¯¿w�úbÿl·}Þµ‚÷—y“«ÝKyÞù?Â#=ÏÛêhqךãït}þ†}nù^×·ò€Ý¯~­�áCnáS_Ô­bœI#$÷ðÕü û¨t …8_�œ]V=À?ý Ïoߦ�cã¶0?òB‰Ì·ócõoúp¢„¢`Íè2ƒFÞvßæƒô5F&¯ZÝKu'$?»-k¿ùâ¥ã8mNÜ4žøz&Çs¿ò·9Ÿ“Ìo#ó}<ÁctE»àñz>ׯqé$S=S÷rçŒ.¢¶cX –ƒÐw æò�Àü(€ÜϹ‘¢;žÏ{%í{+ê·§VÇkf ƒ/ƒ%®s¹»$ïØe ÜåðÚÏŽ³Ï:vC.>¦ÄqQ#f7s;ºí0yNÑ{°BÛ°ÒŸ›Ò/q™Ó¾S„Ä^OÞÌÇ;]_X¡5Î�kJJpOsø I§üýÜn ÇÒA¿ôi䓸Xñ]n,.¿•žèêá ÷úEðnó|üD?<·>�Ø4mcïg¢jH.˜’Ír[¦ÜSQ#ú—k.^Ââüý0Ãâ·¤ˆ{Ê‘] áQ°=™æúÁvÌUÔ…Y§ 1�ŸŠDx_=é÷~laÓE¶+K¨ñÙ{Ҕǔ½Ïc’ÿfH\ïyV¬—ƧÛïuë¤àĆÏ�Aôñäö¯µ ˜3–¨¨èr�Ç¥{µœõ´*—ó-AIhÝqÓÍèf}蟱ïoq»ôU1ÑÜûwQy­cºÄ߯Àp¾ØaÞ‡1˜—+˜Ù)r”rX9i�ÖQ59W:•çÖ]/·×{rò3ÍäÃÕ”/…z’á¨sísÍ|ß5ûÕ�ŸAªï�~˜»"ä§|4ó˜ÍÁûáßE,s,"/¾ªæk2‚Ãv² �°ÙÒd s… ŪťbëŒ «ñf¸Á\âÅ”ðÂàÀèv'œÑÙ2aË„+"Ä.¬D׉Mäᆠ#f›† £3Ó ¿B�¡—Ý•j˜Fl–¶fÑ ­³†n¹ÞN¹euMñÙÛ= dÂòmÖ[�š}`.Á»´¥­�ß]oH§V°k­Z9šõ�K£5|16@ÛË 4‰_¥��)j:^mÄjy<#jKX†Ú¹™Ì„`Á‚ÅóYJÞÚ%Hz+£ôóÚæXt.ä}Å[ÚeâW6îÔfØÜQœ”ï.È#7‚ÇüýÞ7¯Î/¾îï¤|†©�™®›}yé%ZnAzj�÷êHεc°e7 'Ÿ¹œV»¡ì¡‘à«kZnÕ ™"òXQ]Î’ï#²xö‰£Äç”~sê#;òÎyTf/«ósùêÂQ"’vKþWd¶1LœýÞ9Äà·Ëá}iHþÓñ|ÈM%-þ¯òë&*ø¥ÉdÎW‹ç˜û3\áøªå”ÒzüšLÞ™8fƒ^ée.LtgÃÅÎpë}ž< ×ïˆ�’@à H8�÷9Δß,÷9ÒáX¥,£d›¥S²§Z0ÛsÖN“û¸¼ÆkKGÊñÑÃ9“V€Cþ¨§\™¤à9[ ­rø–l?WhRhý¾|ÍqTxMÇ4.K(Ê ÃØs¹òô䭷䪨XFHlQ¦×¢ÃK�*hÙ0)+Ž^8¢ûw\΋ª÷,\ÏeTyÕAA«$ïÂÅÍòµ>0ä‡�h…Ød³&ã&– .ónbU+FÌm´mbx‰ƒGDC£)‹/cªñ|c( Šá/ªœºÏG·;ñö†Hs}iGбÝ'±µóß~kü]Ë¿ù_sžN­�MÂ!‹y‹ëÚïˆÞ¿7=èK41Îô/»¦YHö:ŸO¡õ�Œ™¬Œl„éIã¾ ò�†õ›�TÀ« ï ¹Œ�r äøWŸî©H‚B[Ì" D‡gù’ÈÚõq“ß§m�ÁV8€‰•Œ8f™ÈXǵí}}%F‡„Øw,ÿƒò` �ÉÈûž~7GÈŸ-Ù8ˆw·Z^’ßÇu Q€g%$@õ’ œÉ¤70½˜M¤$ú°NÁt¶Þ.eóK¬É9híŒw%üEù|�4ìkÐIÂüR#ÃòyXµwCÅ™r4~“Ê啼“€Gˆ5cŠ0h£/%PÆ¿@Ð׉bלó^ª¢2DWôkþfÀxË„‰>·t >éïN„’U÷Pb©À”õ¾"\/¬+F_E2Hä^xÕ�ù"%)¢Š”¼Ã`UÑ÷Ôi³ðéAo]ÓÁ[œµá¦~2#[ãGø¼Ö²RŸÝ=ÔþÈŽûȹ“=1‚ C1/�ØóAqæ-¡Z»ýݤ:ckõµ憼ñx³”Ãîú*ϺÒòÔ¾ç%…ÎÙšù�2Ey€IÄ<Äóy|vÙœ® eÁéƒ ÃKå]ðm¿7[Ï™ó¬~·ŒEF�)ZÞ°…Õªzè¸ù½†¯<¯~)¢`¾é²ŠÎþæ/9šöQî™ÜɸóÛFýÐÂfQ�îÿ{t�ŸDŸU¦ô¼-•«Ã~SݲÖƒÂÑt=AZå]„Àßd�Ó·Ð påŸ(B“¾ç̕θ/ÊD%ßCjå»âþôibDÎöݧåàã ’<¶nu€ÔåÂXË.n­%uÈ£ŒõFÀx(¦"§Æä‡lÕø D. ÄóªÃ²�éÀÊ»û¶Œ¾‘Vúîx7‘2\1zÉFîñ!?‰F £GŸekYu5âgÁÑ%¢×t~NãíM.NûTQþO¨Óˆ•îã`õ+ ?•Û ªýFÇj}Ö¯ýoGëßGÖžW}þ×ò1| ~®méÊÜaÿ\Ãöÿa2YÏ*޶k|Åy�åŸ}©°¾Ÿ™¶1,Ò“®bH°7Ür³ð]rfSÔ`ÄJØ'%$Ù{×"•­b÷B&5ã]æ-§ÈÕÕciÒ5y"§\sFºš[4—ÄÁJ´©33̉,I$ºyíGy‘‚%"½×dY”$jï_œdÙ¯ [rÜ(Sϱ¶›¼Ôçw‚Ýô0ÿdëZÚÑ5ôc}oª ¤ËÂX…·‹~F°x”ªlœ`‰<¼„—òZUUŒ�¿õâŒCèég,øÒþÐ[r¹�'Œ·™¼™næ¡w0³&ÄÁ¦vØ“¦m(J:laszz½ïsõµ7uFl<>`#­.°ð�%£Ï·Î×B=»ƒ ÎÞŸßþ|0[ö! WŽþ¤]Ï‚¡�Ô1±7r޳_ÞßÖcú‡ÁL&æQa™9ÃäTÒ›2÷6¦a ™z¦óoã4ç#dI³Û§†è¶ûêPS§ì±5ÏüLyÃLjµÁJi×SzÑz[ ²:šcsâ)&dxŠy’ñØå¼eæ‹8�s¹çsg¼ow{ÚáÀÖû,¢”˜x”¯Rˆ6Ëy¶h”y£æ?êݸò¬3'ðD“"ûpÜ�(3–»xÄ*ÍÙ}_®ÎYn:ùv¶ÖŠpzÔ /'}ö~ŠçÄ|Öç¢ÌPÇÞ[Ÿ83̾v¸ŸÜ’"Œ¦|BØv–FÜVÏDôÌÀó8ÎÂäNEµMøZü“Ò�”<Å×*mBšÜ|iÏZ ÛM6ÿÈfö¼à¯5ÏÕñ,×ÊU‹ª×È÷uB3½°* Õ‹ J†°R³þ3®Œ÷_Þw°¸iô¤˜ßÆ¿(3Ñï ’Æ•ždޤ}í jÛœã pÖ¢ð®EºáÒ-ºö<|.ךÐ>¤»cÏ#2é¤9s ×æßÍön¸dµ©”$¾@<�µô¬_Q­°®·p¢£©ád랇åÀd~/>�cÍËvoìÖ¸‡�úð7˜BÁè[§âŒ˜÷µu-F‰Š”hŸ(º"Áa½Í€Iã˜o1Œñ¿Ð-·U¸Sar…{< ©½Â• ËûB‹Šë#K?cÛÒŽ ýy/ÙI{!æ²$gÅ€=µô"àð;NÑŒjaQ^újÄ|Z¸ç#/O$sr]8ψÌax?Ë`±Y®žw’&-ÙWnJ½9Ú3Ë}§|L…oÚÂǺKû�ÄNÌE•骺©—íˆZAò ¦à«’+Râ: k¡gѳ`c¥Þ�bÈøzÕØNµÎcAdW$·/¹ËÚ¦ÀÏÚ=¶)3»­'nã�kÃ+�Y †6Õçš }y öÜx<%ðg‹>à:õÞm4Ì .8·—r×›ô¥9XÑ4ZòsØ/%¶QLëíÎJhºCÉé7‚µÞûp9ùÞÞÁ›j”þ`UYÅéˆÑŒxÈC™#×Dc"G‘…÷”žm1íÚŽg7÷¸‚ó²=TA7]ÆXö˜ºB7·’9O*æÂ/�̰ ç“èßä/¶?«òA~JÒÚµÁ>w ~¹½êk¥³i>Dʵ˜7è—sç}â­ Ý‘1|ž_ŒyDôe3E|aá HŠÿÊÑ™Ç�Õê-*Yy¨'�K�È/‘Ó_2”º}˜ï!'Ìd)Âåy¿ÜóØ„ÒlòÚûï¡Ê�ôƒužb�òÅÙð¶¹zåàyËlns­,Hs;Zt¹ŸN+ÝÜlÚàväA¼ÇÈ“:8 }&#Äœz]zcó%´˜%‚EÊ@¡YÑK¤ï l‚ JQz@e}xbÿ9À˜oo� äêåûɇÃ`‹�ž‰hˆ=��!O3Î6My:Ïݬëìõ¨Ñò]#iÂ6ß7N·8Ç HU‡2ÒÝ'jÊKT°�ØŠÖŸ>÷Æ_Í�asà0žÚåuXfqâ©‘�*÷~7ÓgÿéÞ ksšÓ™bçÂ[óJN…"C @¡¤±õƒ¡Ê“Ý2ƒ‹€T³ç†ðw)×7}8ó‚ýz¼f°¹Ð,¡ol¸T Q3Ãò?NóŸ„B”0Lc– ”š—HmbL„(ÈaÍá×CpÉäm­ SÁÇ:ZaÁÏŠ%ƒxízñ=ëž·n+IÓjk|ÀÙ0è4{563‘ñŽÒwÉgM^–Áû0þ÷v€$(ÿD®ß{€.pöäÌžn¨Á±烪«²¸�~£íûMmz¼ýÕïk;Ï�0¡ÆÛOFôÚ7®ñž{¨G+» V…?ïŸÏ‘…_W*;V Ç�£ îÑl-¼Ãd»0ÓÛ»÷TzVm� Æ_øˆÆ…�Ä„�í¡s�Ì«øïZ^÷ Ð×öI¸TYÿx©Ÿ|)Ú“‘î�7¨óí]–Kf‹L?²‹;jÎÆ  y‡“Æœta¬i…£¦º[çXqûÙýF½ëq…Û�V@|2£ówÔ„Á£Üi¦.³ý FJKÍ$‚�³@¤R™È×QŸ‚aã’+:‚É ×f(m«y¾³FCL‹µ  PP MÏì)á^<94™ÚlE�ˆùk|pÛXKRN¤ÏUÆ 3ÃÎë¼4¨ß&]¯'*±;þŒ¾GÿZ¾–�ÿ]÷gw3›÷™mê ™æáj‹ÙíG1ŠË|>/7Ö2ýœÏþúÕš=娎ÑI;æ°ÄB‹e¼,9gJÐnMWY¬Æ^~RÚF~ÕÓAív¹+,…À–¼ò.·¿¼LDÑ«MåͯÝf«XóeÍÌ j²Ú¡P3-šðâûYn%büæ^0寮qDBèð¢¯ÊåòÕ{#p×H<â„›âÍÙ8ܹÜ-­q£)sE½b¯JÌ4c›láôçSá¢;çM¼d¨ËÜ6¶ŒÒ8ú8XÞ‡¤;ïÐ*\1v-Že<¯¬‹GçªÜÞÙw~E�->%ý¹èmâ´‡ñ‰ÕµÒ¨öù�° .‰œÃ�S@Ðà�ØZ;(1÷ÌHVYE×áàX2òÑ�E_>–þ†ÏÍMt{ž>Éô>- Cç>Lÿ]´dðIîë¿CU[HIdtù]Ý×]iV%ÃUýww�®õ RðâÕoxÄP̳¯*$“ Öm’F†BÈ5ɹvÛo4Rõ =¾èÞ~MHÿì4`�­lŠüKÂ9š‡w+X¾ä Q<ÿ4ëW1’ñ=+ëv'ÅÉËßH"Ûžy­×¿¼Þ}ñ²7Rì‹�RØkû¬n-i%+nƒã�ÖyÌxUãçþnÌ%ûÝ7„DÒ ò0Ý6¯±dQL>• ÷(K•h”Ò§\¶¶«³SR‚ý¸ÉÞ5õ¿¸ Ú"éeJàSm¾VÅ“Zå¼×à;†Ï¾XŽ�9áùÂpŽÎn÷�½KRH1DSœ$Y¯|gü=Hš›ùËÿGK¿Œ-ì>ôZ4z—ØÅrì�ÆN ~k8w$˜bò>¼+V®»=¬—ò°¡F(­ÒÙqúJ=�T¿�ÔϪb~Úp­p5ìÐx>'…¶+YH6Â5ÃL ·mqr÷–¶ªÈ½�U`§%¨7¾žþá}"mäô€±…Ñ9d’ãê]�$ÈØþ«`Êâ†�»Õ}hšN´©qëIg Hp8˜¼â‡§æ†«+”—éF*äªT~ظ@Ta÷¤Z#œx|xÒÇ$øš.­> þš~œw;ÝÈjh5Jªh0µ`¬ÆÏ¹Aþn•%Åt*©ëU(ê-ÿ9…Éð I1^´Ì·D'FgpÞ �ž›))‰Ám–¢ÿn–[cÍaÿãê xjZþ·wËŒ�Yžo…?SúÎß½mñ°VBéI5q #’cì(»õ<] Èï¥B‡Co¦ýìÔþ·ÿÀE„ jß™xªÅg'0ÐδX¦{énV„D}ÓcP)s2ØC J5‡Hõæt`‰Y4ë0X�ùõᤣûz¨Ü¡§‰»Ì'|a!{d’ïŒSÄRŒW[‘%ÏØ¦›C'ŸQnNËè@ÐEZðªüyUÐë> »É׊¸nàgîÕ]-ÕžÝûŸYÔaMž|òÍã2x&N2>÷3'Dé§IhŠ™[ÉeµG¬!QŒ—7vv)\–îRœ}±‡3tKý–‚îÒa#,%‹gØ2ÉwtZæ++z‚mx¸Ü=NK\2Ì<IèéÈ«¼b£5¾ï®+Îò§ïwѦ]uÕ²röøs¢ég™tUCle³šŒ]•š0g·eÍnñn§¯Ý¹ )h²q,Ëâw³½…_é­<ŒJ?Ó¨„Ö¯ë=ÕùY¾£Ñ�ÃÆ¸›l¹bpÌ dµ€·ÊAسRŒÊŸ[A N:ûgƒC‚>ºŽÖK�}I¹æ©YBÅ3ß9"»Ù£Æ z¾gŠÖÇvùV=uw=ZqÙ6œrsñK8¥{«²„ÅÝWn`ò´(Êù¹=î׬·Ò—b2ËÝHï&·¬ÎL&‰êSªh¹7-kUt…™+Óëm¥õtóÌ*æ!D"XÎ�¥Ëˆ¹§j@±Õ^.I2Éw1‚rVfË»û•¢,_Ü[¶VtÓíÑte�ÌÆC,fžúö÷lÝ5¬¾jF³|y.¤ôˆ×h}‡ftbÎà*ÎÎð˜©Ê _Ch÷~rîH×kp£'K¾<Ã_g Ë¢F(HG R ¥ª�y|ýçZSÞ®füs¨>mùÀÁ†Œ0.íbÄWc/ °Ø3ÂMÛ3¼L»!=%‰%‚SJ—a{¤€Ò>&.0uÚZ\p¹}z•u ÃfÖ}D'x„vj¦ïL?�™yÚYlµ)›mº·||ß<¾•}¤ƒáwß,¦ �ÇÁmà‰o0oåùqsF(±µ¥f�o ¢>{—½V ˜lÄr³$ª®©]]öºîX[ÝxX�ïÙD¦óʤû(²'޼xoiãEáÎîè—€¦N� UÎч—eã×R¼%’û}]:ÞkïTL¤±MŠa¥ÖµÅ”×ìbb÷�0Æ:†S×7™˜Í"Ê®GåÒá!ïî«ò\¹"µ²ç9µÑHD^Q”ºL>5_žt«�2A.3’Xù±q²IªÆJEׄ¹™ò<Ð;o{"Å EŒ%ºcÍñ�c:ÜîRaéSµ‘r—Ô+Æò÷€„�Hª¶Cr¤R1µ2Æò»‘]„Ýb�çòòÙ1žou‘B�f£ÈUò[Ž��›’¶îàõ—W'ðÁ«g¡*ĽSZÎØÖ(ïä½lÝä›{eõÒŠw¢¥ýé”ûV#e€žjþ&ŒÌÚ6w…‹¢©_Ý#±=Bæ‚-ôHEë5ñZ¸NÕ×Â*.ÜÑÒPAc ê£,¿|f%H»‚y�&úÏ—ØÐÀÝÅõ„ÊQîïQÍ&Úœfùÿûغ³Jšù„¥ñ¡ôn3'wjX•Ôåêdzës\IQ½õUDÒ¨_¦úú÷öD#ÖË%–W}|ŠUJ£J¼6S0L# ¶üÈA�pº)æOØÛª¸j.## Ôªßm|­ñ«»l+U 2I2ª'Ù|y7˯�ÍI¤šá ä™T8ÁlôÂê^zjZL#áóŽ×:{Jqðºk“qñùð½êîþf"eš0º».£í\ØCÂ?J9ž¨»tË*¥‚v¥Ë„gÆqtf»c¸2Ó–2wiZi™“UucŒ8xW ‹â¼C»ógÆþHòùã-æ€Ô:fS”F퉅Ãí'€©tù\.h©Ô‘µ ÆQű×ë›Xäé†OWþ´¼¸“Vázýü ýi|Ó?¿ÊuµJlyÎkDžM—Øòó»Â SËûÔÃù¡}ñé:+QȺ�à šâ/)çcþ­Ý¢ 9Eì�‰/+¨ª¯VÝ„{GE™ƒ‹‰Â~po µE$aÖ-�ΔÐ%PDc‚ýíìøðà&8šË%/H—qE³ìÇÖ<­ïÈ$!V«ã¥ð®˜çí �q�éâ¥î)ûR™&­ò€ \ öG nºŸ%®öɯý€r´dS·uÇ-w(0{’>ÀÉdø˜À‡}•£uªó›Žû,—ÔùèÜ©EÐ? 7¹ØÓ —8´¹Á^ÁYc7@|÷™C&±ÃØ—(�d÷”id@ÉíT±HÎ �9ÂŒg=Ù¬•”^½N™Žùæ:!õ’kP]th‚O'‘ä0Œ®W®ÞAí3¼!#ZðÓ�mqi?bÔœèAæ…5¦<…Ÿ¶kx ¥0Æ,M[gY8µvb‚@ÁìM{Á_u¹Áp†™‹lBx»©LÛ§Y#ß|s?Þ(æp {gÈ?=£»¿¢½Î_£@½}YvB¼;LaÚ•&£ŒšÏº�Háí& �t#t2í ÙˆÐ7Ëij‰.‰02r׸�FÚ½ .G.e�uvnrE⇠OÛÀðý<…�-~KoË–W Ûžç6ÿÉodn_Åp¶“ƾ*üG$e>Í3ð¿ަÿ1~ÍS—ãÚoó“àã¶°@ˆ–ÚQ„+ÑÁEõ®N£ú‘•ŠF� ÍÖI¤ÒÐÑgì§Óc)&¶Ä”BŽýàÑó6RÞ�ò×�ˤá&üš½ñ»5ûÑ“½ÀÃìrœˆ…˰˜ú#˜ ³´çsvVSLO€›§ÆÉ_±)ª\cÔÂî÷œžys|D6üÞŠø�櫃šÎ³EË Á~£‡·Á  ]Åúù² ŠD„'#vèoÏÕk| 0u»-™yŸA!v³•°HÈ8µ�²¢$;ù¥²¹Žª ›VÞ¢×úo›o)ëIp9·¯LÒ¤bqÑy*eOô[ðOš{êö ÔöïñÇÒn¢æþ[n@ñùM+9–œ·’òö±â†9lgˆ°Ïz =šíÙÖa�™ù:+Œ?ÇüºÍê�ðŸæ|iŽA\¢ Âw+PÞ[ß} šT‡)R3Öïé ³Hå÷WÄãü¸­kµùcÏ}ßhsZîxË9ßR†x–Ÿ «fw[6Þ�+³FÝåtÊ(�L�WV#Ój'pÂB%¡¾ôLn^ÊÊ¿ÆÇí>¼�ïîÿÑö{ð( m:o$ȹ8&¤¢£Ýc¥©›‘(§Ñ6¨@œû;ksÅgm—­ëÇÍcœïôX9 Ž�ߘŸnf}tù´õÖ~«¨Œã^ßr¥Ü¨üÍÕ"¹ý„¨}¶¶—^‘Ø^Ãà A§$�pQÑ¿˜-p³÷­Õ\ùƒý´Q€ ;ÍKXܵPr¯`äTo~A¯YC‰F;o+@ùË’sKó±²÷âÍíA¤6ŸßX4åŽ/»3¤Ž‡ÙgØþ×Kï©üátµ×ø‹çžÉm£×ÿwÂ_RPµþØÿóýÏsç5Á�‘^¹ÛÇ%ØÛ¥QDû�/Ь¸¾3ø«jÒ_$ý§‹½ïÈ\�7—ÀŒ:´FK®ü[Ý—Fî"p‹TqÆD­ »´“.·wÜ1}ê è3ã¾³Ç]—’Ä5áÞ™|§M*¹ûåµ2”Æk«­ö«¬÷F#Ìv�³W¾/²ƒðò3^gHFËE‚œÃ±;ó³Â…¸�Mql‡˜0ädE{®n½~ytr»v�1ÇØ6o¶z#ÁeŠ�ÄRãåijvâ÷:Æ2mpmT§ÎÝg�]ˆÖfõñ´·‡µÇ™¾‹þŸXÙá1ï�ÜåÎ)ß«3“‚+ͳD°yFIž;�sCÿò|Bû"/èwg7m¸ñ/[îK*Äy©&/øYuÉù¬–#ñM:ksŒÆõt-Eä]•Óøþ ¥ªäeÒ3`xÑ~^†*Ö*ócé‰ lXõ¡ªÙiæ(pP‰»P+‰”´©ØQáV9¬[KxRAˆ¾è Ô€™_<ÔX÷§+l§3vd3³÷JÂ�ªï¬øö]� Á>ZxªÈ äVw%e%uFòf þ‚…"S¯8x&/ZñÇ�§n÷ !Hz§êcšlSÈöÆS%åyÕK–’y¼ƒÑÈ\8„ÛÌ ©íÝ-Ê_û‚s•7ýÐÛÊF6ãà Èa «sW LS”ééˆy€²!ß Œ ,Í{Ÿr¬8«á°q¸÷…99kÙ[,ª¢ÌÁ®42n Ä/ q¾#í1=åÎðWÂ÷7v„!aëXÇüòýϼD^RÝÏFÞ,ú=·Ø #Ð[|\®Z¤cÊ ˆØ“ôtIs'ê=c·³ñÛ³8Ž7OL­nŽàï3zÜ_¼EÊ"c–ܶ2˜3$ðÃ÷}ß— <»Ð&�Zœ^ï:Í–:†�ïxŸ�ɲR¢}ö¯‘>ßU2ðÕuÞðpZ8Ãh �Íî¶\HøåˆVæ]‰ÇP·¹³‘¥bùÛA8´„ð’ ëxÀ¥IÕl›¢T¢]ŸÙEQŒ9þ+B뻵LìR£ïzÁkxéBbðwðSÅz­m†¼†ãt~o†¶SSb¼¼Ñè¤ÊÏ1´#>ïa^ €dE­h b{¢\vqŽŸzÏ~×ú FÂýYÌ8"ÌoŸ{¢iÏž Num 7ú[ `—œWVe‡ooô´W×fÒ½ؽõ<ë6Ÿ›D· ðj›•´{y Ã>ë‘»Ï�°‰tpzÓýÄš�d:!C8O£’È÷â÷Mêûïy�Î÷ã†1­ZŒ¯Šïùª]ì®X¨Ô§šß“Ñ}Sù¦-+e93UÒ‡÷b["ç@aS×õáãI(Ñrçì7ÅŸ<Ï?`´'~÷²mß:•hÅ)ù^S{ƒß°“>Ït÷ÊaÎÄ…ÎOtWaSçCÔ·™f篥‚Ä£0Þá–ðL½åö<"#þ¹^Ë÷‰7>(Ê+5™vÁ�î—ž¿.q|fj'\3ø5¾RÞç‹߽øÐMaäuƒš E ¿*ý¥’ȘԶå så™ö‚þ-n´—�´c^¿%xa˜ò;#¯k´$^Ä�J c¬ø“�£ mlN26"ßt÷”Z³eΣÌf]·¬¦UnçŠ�c‘£=_F¥,fR 1æGžF<þý6ó§]îXÇ™f†_,¨` Ö›¥ºÃ/Ÿ5ô²žgr2O@ ÑžHÅkcI$í/sÄc‚g.O°c ÿÀμÖqt˜ ïÊ- s&‚Í¢„êz¸Ê^­ l~÷Wy¥È:¿j‘ysêž}@è)˜‚ýoo:æ�"øÍäo=õöRÞ&Rþ 0›¥bt˜’\Î )ë’ç�y˶d“¨/Mmš©#ŸÎ¿ß„áAæœôG þêòR ÜÏÛþ¥’ô�0ÿh-ß­®_uÎ1}ßÑ„^·µæµ\b\žgk˜ó·Üþ¥bä爡Ÿ¾1�w=ïU<Ƴ¸Î¼ñGO¯šñxVÞ�õg#ÔÖ9¢�Ö+§áåA>KzY(äk±®©3Ç«)à�‘ë0^¼¶üÁfežá§VÎð‘ÀjþF{]s#¥¹ùŽœöq»î§3=Û0¯nE½z§ÍÎÔoY½ÌÈï­m‚Õ?g(Y)ÑèÔ*Œ�(ΣXÖOùÖNwtA•®¶3XÁsír6´lr&ýpcÓm¬ú¾qšÌb]Žºé°O`c–²JIµ"YÔ©IJ‰ïÝa™tÀÅÄzÿ¢BçýÑ„‘¾kE«üµª{Äõûÿ-R˜êF¬ÿ£ž-\”¿ý8 bÃ_áü³ÛÕÿ‡mÿÓòmÁ÷Wk|Íüf½?ï�obzi# ØÎ¸gïæ ÌjÕ­ *ü3‡±‰½8æm/:³”ùÜyçš§D¥‘ûéÅø0nz ix³~ßã\“�2?¹öžÐ´Û…—ú¥¤<•œ"_�bR#)Œx)ÙðhZéft¸«a”¬è‰•öø;!¯ õÐå!èP¾½uµM½!¼Bˆ»QzCúåÒ 32ÿÚ™yNÿ*~Q.iô5<†ô·¤ûÑ„O„#D-°Uê>}ö¤4® iúªhÓÀÎB^´4¯€öD‹ª'RÙ8� ×(£ã¶Xû)În_bÆÄ5‡ï‘�~Y`ž'ÂR=þ±Tþì¤ys²¹ŠÿWªÐíòE•;ç'\#â\ÏÉS#ØôéÜ­á1yÄ4ÙÕ£®f ½uƒ%éçVq'B+PâÕÙ¶{$ñåM¬<šØ2"Œígþì:#Ö¯õXü¹&XÕ7- RÒ?[¿ðRÛÏ—:¸ÐgY"¾s� j÷Fú6#Wâ‹ ŠþæþL!…–΢­€CÀCWœiø 7Ýo  r~2ó8Åo=~înLûÝÂk-fÇMгëé~ÿ�ZeWǵO~¯-ü“¥ìxb©gUl.sˆ›Öj³hJd7k½Mvv·p\eæjø< Ï‚�E,$Ÿ²+ó¬éÑÃ]c‰N2£Š,Í$‡üÿÀâŠÆ3op‹¥àEÍal1ëCù©ã^��C,âXΑmå•N°l�ö®íÚ«^":Û‰{½¸AÿÃëžbáX¨ç+eÅbmÖ¹àŸo%œ§þWØX1�÷­ñ-ñ¢?9ù“‡Î�"+ÕrLÚ€D9”W}%E8vœß]+í…r¹\Ðï­ÉÏ¡)j1¬ØPÍ@0ì@1\¨AQ½‰ët]:ï ¼5˜E{RœíeÎÊ®B½¼N9�¯œšñ’þت }×–2 ; Æ5€°€yC´ÿmÏý¿Ñßm‹ðÌ mñ¦µ€_ˆÇy[› yư3€?÷LÒÄ¢ˆ$Édx4„©ϸÝû“Àl�ìÜOØ©Ò ]†ò1yhÖ7cÝA«[±gR9VÕÙÊ“ŒL9AÀܽ´-‘-|­nd²ý%Æ6T乌žp«>¹>BN7Ÿev ô©0Sº>btE¡"b¥ÌÁŒéouܲ[FÔÁ³«¸®Àµ£QÓI,ÛFõ€�ÁfziŒ’–êçB§0zaðüL7øÉÍY =zŸ±yùíœÝpýjÛB ÿ}¼züVÑç?5Š7JI5<-›ÙH³YiÇ3äÔìL\¦'/ã"¨�ö´à3ßÖÞ˜˜{†ªÒj…0{AdLqI™²[¸¢£ì˜~÷ùÚG»àZ‰=BHfKàu°lùƒ&ßÊäšSuáYL ÀM£Ö0lÀRBʨß2"šV1Ãjîg£M èô+.KCn)À‘n;R‹…¨z!+‚HˆK¼ÌÁR¼¤¦£2ü³UqºŽ Üm\Šï`‹µ-"tÙ«ËOK úñÇri �ÊZ aÏþ5Ÿ‹år¹-}3¨q£xóy­Nõx²ÖRm×(D€¾op¨\ú¬WŸ™‰ÀèYñ„ ŸÇlü?ü7Í;?}�¶¾ªÞ¤Ë WyIúÿÝ€Rc•-é8þú:0+™2Œ;óßÎn<¾Z. úf^~J™LÐtë!L´N:–¤+=œWÍ‚Çõq`˜ÏÒÝép¿'á[”µýO4¡¬7òïîeƒ¹¡]øâï¼I#ÞMNºÓ÷—ÿ°<£ƒ{ãYV½9Iyß"ζúQ˜åµr‰G„Bþ%e,h¯ûEŠ'«F ùØJ©ÑذÚNToz†»åº'Srm-òë`-øA®¯;½)h°¼EáÜ cVzÄ}_ݸzX¯5]=Úât1¸‰»ˆ‘6xBÐÊø¿áÔÝ‚–,X–­jÍ7£êù¨wwí ”×žôHÖ÷y8´j5øà=‡Åk'ñE-¼Ñ²�Ï˰4ß9EÚ8× 3´<Øh×ää]cÃàà ÉÁ×É~ÂkÂ�z~«Ñ N£Q˜mìð¨q—±$”«—jX]§á(µïžI·"Å.;#×y‚¿UHRïÆ™æõ `>° ¸ò»RðÖ÷€8º- Ûû@ØöˆØŸL.�È0@Ê_ ¿Š<Ÿ§DW-Mò·oûµì¥÷¼œ"Þrúoö]Zº��Â¥,B�Ü&ï{ý,þ¶]ÿ“x¿M!¿<ÿGƒžp†|^Y:öBÝù­�º& ùþg!Þn¾.Ep»,âýKwU’­Þ‰Qnö,ð�AN2wçV(eüµÊn3PÛ˹óp†ù’lbå<áˆcm`ÔÕoïφñ$Dêè�â$ÈÕ⯀…Ô;ß[Ò®ëDþŠULrfÆ+2¯­hP–ÁãÙàn÷”Ê»SV;+aS|¯pxFÅP-åÄ$Íc“7dæ„4Å ¡™Ê$&ö‰±Ë8'Êß—ª’ÁRm×ÌÀ,¸ÉÿXÏϾ–Ÿô2uÃdÌ'ý�0x±<þAÖý�Á†%{\ãoc×Í8]#HŸXb߾ߛ]\’ú•bð0´4†F[Ï´°>²�“bƒíH`”_þÁ'ÐÎsŸ²zÓ¶¹‹FÉL}ø:Û±˜ìNЈ•l„Ö¿²·4·Ò�ôú ¶¥’6€XS€ʲ‚±Åað£•è€u7…æë˜\<\Ù™Ôe,$^[»F;ú‚íêDùYûí;YF¢2cpgXå½7½è÷i“¢Sú%´<�›néxuŠàü,úO<Ô¤K>† � ØQ9ŸyûÙBü^0NÅõb·…L®¶t_,æÅoÈeøP�¢E÷ÓÃø^‚.8úqì`»CW°[ÜìY>1nŽrü%é†D­Ýª¿½ŒØ�+*m¿ òÉ™? ÞWÄ[ùû WÜ×H†ÆG±ƒ}øyßèÝ`jÜû\ Ú?Éö¬ÎnGá‹»u5{òjþ ý†ƒõµk-įõšÖŒ�Òçë(Øúõ[­òh·`¡àæÿzÓí\üëýù“'ç¾ç†½Ž!÷>ƒ?n2¯KSD�7†jïüžsÂò²×EÜóƒÈ=cÚÿ 9y”5Vš©±j5ÛQâ�Ú]Aω¿lpáͶ­Æºðñ”m+Ø ÙÏr£$ÖÅéÁ-m¡hô[pñ±žü dh4+‰·€ë^œ{KGÛ JŒ÷"×o8ÿ&éo®ðõ?ä»å¾öþ�CïþîÅܽå_ŸìedⵤÒR˜_“<¼ y�/11k×|µ"œ_G‡Zô‚P’.IO˜  žv¨–n-  CÞȸS¼RËNt*gþâëì ÊÜ�T¾K%®îF€¹õ8 É £ky¡>;2 pŽQîï 0ùž2�L{ÿ>ƒàã[åüÖžƒd^\«=Á甚.õÓ%ÂÁß\ªïà2G ÀNÓ¾XÉ#RòkÐ’¸4~ªÖ?vùvóOí:tا¿?ɲ�^ÛË1[Ð?}º¯oÕþ0¼¶,¨×[ AV(ÜÝýStÂá#Ûäo�abØwß¶jæcatºÁ1‰P’q),ŸN8�:öàðÛÁyÒ+Ù Rä&‹d d¶À�À…Ø�GFqS;åR™uɤ L}íMjבT´Ö�E»»â h-ZI%Ù¤„rŠþçñßßæ)ZG¶½¯ršÖ`¬Nˆ3i`ˆhI6$6#F�4#ù–ØþÇíaµ‚B3hXzõËùJ¤u�™ä@’R4!)òú^ç¦ßTú´HèÊà à˜·MzìÍ�;y7À"91X€€øè@¿=ÿ¥­é�ùiŠÕS¸›#b ó¾^¾ÿPé/¥Òõ`j02ö}”ó¼—þàya,�ÑëôòÙí£Ä %/PÐÙM_-GºŸ¦î@2Ace”!Íšƒ&IFŠ_ðêŒuB�•ÊD’l,›’ñ7`Ñ=Ròi™¦Ì³¿S2þ>KJ]D N·Gh­!LV‰óãØã#â,]Ò´ïç¼®š9Æ¿ä=f÷.7ß3àyJdhÄ�yûcV�xìž°ßšû˜á™t� •H!|ïÚñªÞ‘p¸ f_ƒ5*.«Þ å¿õAØ„ý‘ÓmKsnr¦´é™ÔÙKÑ*CÍî|,²Àbó÷°nK_‚­êpn=üÈ@ås£ûo³ ¶OAÛŸ«ÍÃ4³ÝãÊ•ñ�ç=o3€µÝ ø£š1þb"WN¥O•aß²r:+Ž În Ë7îê0Ùbáë‘8EŠÑ�Ô¡±”u”÷©�ÿ´—.ô\Ͱ=QYø�£Vþ•âv(ɇH�´u†¬^Å'kˆÅ1´öÄì™ ˜‹½T×»9ö� 9ùû¿׾›ÆÃ`ëžÁZûû¦Y@ú÷”™íñ?Èý>BáO™®˜î %Ä~ �¬uº‹µ.æ5勬÷|v(vÛr«—&òSzt {ÚBºçÅc¹Êóªí6ÙhÊ8:ágˆ(S dHÁ=‡�‡>äµÛX ðA±qpÐØÒß¿Y¿k«sÏÙ´·@Y ØD�þaßõ¬ýO«é—–’}»ÛÃù�®{¾wsõ¿OÝ` OjSèÜ.ÂY9ͶÓÝÜŒx› –¶Cÿü:1ñ/åÉÊ‹ÇÇø<Û†‚�å(^Iuæ‘È|ùžÂ:qX G-V¬´šÙ7•½Ð:ùqk˜„'Ÿòúúhüæ:áJê4ÅõÍðŸ¶~ÿ¸K[þO ÷¥»�;f~™]ó ›Ýc@7ùot8bv�ùo_a?‹¬||áí\ý %±ºûåI•ú%M·bó1Q¼k Ñù-ášì�r*4Jƒ(.2FÍ©FGд›Ú,pŽw઺8B n4�ýÏù�8úçMýñ‘¯¹‹Žr—?]k s‡Ô®¿‘Þç}¦3X’®oµq„dòúݼqÂèñÝ4gp8ŠÆdÕ¼£Æ¢ð bÝ¥�e*†?T7j�òý•¨kMPþ—D±ñ¼/ªŽ÷ç‹ìŸêÆ1Ó%¯¤>.^Ó½‹¥â4YDMÎîØïmnÿ/ïâ?ïç·F¾(És»vË”¡9ÞI¶²½³yµUUhÚä0ÉJÜ%íî[íê<å»n6À4Ù@�ÿ+^F;ê:nÍèzUî…›yöÿâ·«»„Nym�ç2¢Kqs´¶{ÝEÕy A…»Mß}Û"0êŽã'i]\Kèüíä—ÃŒvßÖ±Šì‡ž8K~úÿäæa<ë?潎C~�ü^êBÝó‘ÛŽT¶Z½d×%fþù2ÿØKT߇ïF�ô²¾¯ú×Â×\°ˆ(>? 'Ȉ3ƒ!?êí[�Œk6uþ�ÃOå‚ýûyç�ª¦\çÖ' ©ä4O¢Ý �ú*Nôc“»Æc›|ÿ {ŽO¯‘†ñùÕ;µÄ‡«ç0WÞ±…\bt5 0„L5ANÙµ‡mâPy…ýÌÏ7ðȶTÓzà/›¼[^8¹ž»_)Û&„Öæ†¦Øž­&¡¶Ä1´bä€Ó†Ñj¡:h ÅRQã‘VÀ»"E“û§L*X¹îR0ÇÒý?5¡q»g,‹ÿ™æ Qæ‹ÛXˆ{³¬~¿È ‚与«ô¢K oÄëhòö²¢NåíÙ¹‡N4Ž»_R»o¼å±àï ðÃ]uw€O‡5µŽû–½ívãºpõ™60kZÚ¨óa ¬Á¶%}�=ÕV#�”t¿ð�Û)©J}IÝk Ôj%ä›f5mq‘Š£†Iïá@pÜny¡Éüà§M4•%yÊPJ8ñiâ§4ªaS]í�­;¨Þ ºDáánÜ1êÖÆ!¹Ü»PÝr5z$‚î¡C �Í ŽÊâ!K†ÌdÁŒ×\µ—ÍA+7ã2Î�ps™x×¼�³âî$éÖÁ¼áPͦÌ=%½®Û¤¸{‡ñh˜”y*¥Ã¯»7ß�P®X#¶¹oÖxI-›xïï²ÔˆÄà$ÖH'm¹Á󑯶¯•ð«�=\ÇûµiÀÂGåÒˆþÔÒ( 4ÝÞŽ»U B!Òyñ”á«Ð-èÙPìI“e´¡: òpv­‚ȯϜùïÜMÂÏ´ ì¿z˜rUû�hδßd›/w¦ö¹f/*² ÒÌ%(–Ëk9¼ BvÃî °ÅaëèX«X\«H]ñtúG›_ô¨Ùϯöò˜÷ø-�ÿ1¯F½øy¸2’ÙŸRŽ–Ÿ¨gbR¥Ø;™¼šÎ#‰‚ÜÙ„ ^™tV¢p³›”<_Ò'Äóæ×£È%æÎ“ÅápŽ"pî·¦Q‚¹Y¦ú¢Þ¡Â_C'wV’FL­‰ôUŒ m¢ë(ëL3&ÒŒå‚�MQýåÇîyãç6á ñ”.5:»¹X…»Î~LðèÅÝKá>èC}€)3œüHXV«â°åƒ¨KãW¾7û^ï!ÈOø(G’c¼_ä Å'Ç5ø^E (5Õ9˜ˆÉ]•ÌyW‡Ì û±8ônqZJ#Ë¡h_¯ñwÇO2ü#3D?愦Izº°xñsÛBxñ M€q?;Þ1÷DzÖ÷«Ó�pšá0qŒ·² Ûd—'æA  H¼¶ui©jNK]—K:‚Te Ì.á·²[EƒÎˆö¸æºØB׺lÏ]‰ä¡þZÝX;¦köëûG{c@Зà›c±ÿšð¾�oHÞÑúRŠ]sÏæÚç"ÿï…iµÍUÞÈ¢b=<×¸í·æ¤°‘‚»ª[ êñž =?pXx¡;ñÇ0UÀ±‘o7ž�J{%î»Æ4…MÌvÅã£yÃ�$�>³¦ óX9kjî[4•&øn¯vÛ7)+$]&ÔäR§#Ñ„‡›¨d)8ȵα©Ø#Y¥3f†C¼´ßû M¿Í~N°ÚZSüÍ%·öçAŠFF�úZÓ\ þ·øŒMŒ°?ÈÆÉ_aûäªÞ|Ò×-«Œ0·“ ÿ=iI#é"¬@Œ@Ú@ Ÿû¾žñþž""Ò-VTÀ!c�8I_ç>f1þ¯–uoµ;ÔšS#¹˜!pÒ2ç�û¯•9ÂÖ›’`�—±ä¸fÅÜbF>ŸñÜjh~d +Ì’¯Ôá•?žv¡KÍð ØŒ�4 ÝO–Y«%Tƒñ d0<�zûNô�C¼M! í Û€@%Šèlð˜}¦_W5„|ºO”|P±ZNÓÕ7  ¯_�LsôñsÓ˜§ç/HÂOÄÿQ;†* !'9ÑêÑ3�Ø�^ØÔ[7$ÿã‚ç¹E«&/ßÔËŽ…æºÉævÇzt¡Ž+áé—gÝpžI"`¼o;VñË•\ˆ÷Oà”?FM¼ræ²YœÎüÃÛRKßÁëúñŽd͹+ÿ|ÔØ/ÇÀËßÒ¹O»N‚/Óô^a‰’šÕeGÓ§/Ÿß"02ûm$û÷aWšêWÿ/�•wånd@¬Ó¤&÷¢ümšz)Õ‚»�å�"F!Ƈ1X¿[tŒ^mw ¸fâø] Z&/O°_%Êyr›Ý\þ=€‹hjÓ äãnÑg�@Õíö櫳X[$ÑèÍ5½õ®´!ƒÙ«2YÖ³ÃÇ ±o›„h ¤S?ãE½ßõÙ>tH2ú<Ë*š&yŠŠ­UðË2™Reª´KQ‹›œÖo{eâË™Ê�Çm(ªqz£.%l>Ô¼€o³¥œÝNÀaš9Ê4oièðm¶•Y”Ä´`D Ôk—aÍg.ÖïF‰ff‘½2�áíZSµWFlí‚3J,°á-”bãô "ãÆ[C××—·ò§·P[½›SQè5Êvãà¶,ëï{�ø».ÿ`{æÑƒñ÷µËLݵd§eoìörwÂw±r¢ÆÁ}¤»MtíkœeÑW줗Qw�¬ú›#á5ïNÒ¨$'”Ô(ƒa�ã�~WøH6 úrÓ¦ˆÁcê�y F4˜D” ¹ÜÙ¸{²…p‡Ä¶Ó9fƒf<ûs_�eºÝROñÚa¿¨ïW“fOå4Ü(ª_�ç)åWT£wÏ÷á8�qÉã6ª£+bOW¬Ýšy¥?øª¬VuæTebá‚‚Hô!ö==¯Çl(�­ž:¿H}T ¸O¼Ýï¹ A#|u vˆyH±{yÌÎ#Ìqš/wÄŠI¼¼¯\›®½� (†7§(Üâå»ë5'P*–u„�•燛²\�ð‡›ó¹`™ˆRËÒ‡aZQœ´† Û@×M—¾ŒÛã4ïÌ“§§|íR²½÷ \Æv}쯩\æ¢oŽ‚ÜvUÞ¬�ßj‚\÷nø“Õ'n³c™mq"7åVÚY¿·ý;jô=÷êm¿¡ Vƒƒïþ®¼9l ,»S*j»~Pœo![÷€ –õÎŽ}¨ébõ|$Zìˆ>þJn`é’.ËmXþûÎݯD;Ç^@•1ªé#•Œ‡~Ø÷+Ò7(ûA9÷/¾[ wëÿ>.lX4l_[¼Qw\o_?õ`/à]v·vèk²²*ð.U¼rt$|Æn?êß®;s×»¼¾eÉ(’`y¾FÊw9ŸÉYÈOŠ^¸×R�®q3yçùÜú¦>zLûÈ·½Žxoè‚'Î}ì=ÿ…¥?÷Üîy¨X¥Õ8מÀǾgߊ&vñ†¶"UÀ"`Êý½�ŸG‘õ^Êì+—¹{Ñ~]ëÄ4¸ÆsíHA¶&Ëã29>è+BƲ�Û¤©¸5u¦$¿6ºŽlwD…ÔË\Ðð¦zK‰®š–j ëŸ0aéW3²`¿û¾Ü`Ó†9s¯çQÅýùö¼F׿‚²6lˆl8ê—»ÉFǯ¬øŽÎK FãÌÏ&ðÇ�†àï1áYF¶Ÿôžþp_^$³ì²Ï(þ¾m]/ü4ÇkŠI~—6à±ñ8õT¥Éá,ë És`Ž#©,®¾ªýyBI‘Œz´ïQ0ÃÁaqòÑLWÈýßß\Óò%X‘ëQáVÏeO…˜öÞfðÑ]X³\ñäºûÆ.ŽßfFx8D ‚‰OJ+äi£q»-zæýn âømÒôoY£À¬êsä§!†bÀúìøâ„ëÈpšÒ¦`_ÕÇ©k[D™0/n�»0ð–º—&|üŸÚ½gsü×ÏÉ)Põ‘ü`'C¸ðV!xLî®f?É¿Šå›ïØ´ˆÛñw¿!ƒü»OHñ¤jÆû»ßèßì:ß>®z 2]G×><ÀJ?°.#±×F»Q8MËí¼Çi´‹Zj,.Žƒf·úù±Gƒ� ƒÖxS컸>H[/~€ßÏ÷²«CÅ?ïìø7vò© ;Q¯?†á»Ý'ô!3µÊåû¼Þ’1áÝt\âGµÂ‹ygÓNýâ; æC›júÍÔëÍK— ˆc"_-ï¶�ÆŠQY%�ôms›òbèùÉ{ç<Ù®—�h&+�«Å§GÃЫ.#ÌÆ9éÃkºSµ…s«æ*" Ùï‰'ïtSî6yùµt%GÁe½<ËÆª·‰ÉË_Õ9RëðG.)ˆûlôè¼Î¸wi+ëìòîÍÓ�3J’ôØÃ¾FŒ­ƒƒ¯¾Ì©ÕëÌÔûëáæcÊ“ˆ†$5”®¦�•ˆFQ®róÞjOœÀZ‰ºÛL$Ã'îy¹Å�L,¥è§ûã׉²�‰jù¤Ÿ¿¹PWÁ¬_—iÍ‚[Ï'K5�UÁÿ͇µï¬}Éxå|v6YhŸ�ÂÞ<Üra-%Å)ÚÿŽmŠ$NÐdÏ&0Þ[@€pŸz�äš^(Ù ݳ�ßœjìüa“s%«K·u†›Î„ ,µ[ÿ9B‘Æ}¤ÇSkm¼2$ z%Ipu5£¾0Æd^Ï#û*[årnƒ$‘|ÿJV'x9)Ùà¢FȈm{ü¦<Æ­%šyUÌæˆ’èpx›éï˜×yKÖ…DYkŽÝîXÝç"÷] æ8M%r¶¶ákÉÁH¹a5 ·"w4ÆÉœ°Z=&d§2˜¢Ëiµƒ¬ë]ÓA‘Q¶;'½"Ë7u˜Œ>‹ épœ¤Þs…=”ÍÏ7œ–àâR1ÕB-ßšj!}g×uc¥öµLO}Ýy¨(ŠzQÊŠ.¨‡ŠJÜÁæqv™V[Ô>�R�%™;·øÑ-JC|z¼”ñ§%²™ çg$•£J¹âè ²Úê|’Úo= »“ùÊ�zwIâŽmŽs:Z4FY‹HóëJEË_†ð¯Š°Xh DL x òR"Y-‚!£ "‡m{7(´/FiÁµ¼Æ=—:š°4Çlüâ?±†^µ½¢¯@?Ìäcš!‚¯ü-©jÝŸÞ^ ´¿#¶«æ¿àó6­Â9ëá‰2:éÂëW¨÷«öÓÆ#ÅUZÍŸõ5“)fóRÏ—ÃY#�ì„ ÿvõF»ÆÌ�hµm¡ö÷‘/Ïv¾–¾ƒÜà ²“x?🟞Ö=¬42rEµg„7ƒ‘~[ÂaümõBföNAErâM`�@’óÿ®aú/“©Þ£Zéf÷_ý£Ëñ3Ýiº×Îb÷-ï8VRJDJ‚X)�óh²^!Š•r¹>ׯB¤¦&"¨IˆÚ;/M\±ct^Jx€ð¤°×À¤�’ˆ7ÐÊ â¬&�…ͪ‹p¯z^xW‘ªíÅö)75^jE‡èÝìÚÎ ¤™Œg]«øM[Œ—=Žä:Gž£8.}Võï#%¾oˆ 'âkgññ–ä<ÁôGw®Õ™Géºî€é˜†A• =]´Ãð"A@h,„Š–†£ ¥µŠÀ]ÏèQ½D„r<•õB—ôø‰ÅóëžyN]Ø5M4½ÏVˆcÆ3ÊñßZ¥Ì�Ÿ& °V°ÂÑh�rX0^õÕ€^PDl­0;ÞB·±Î.HéId‚•¾+ÜíÃÐvµ”’RÒÏGFa¬bƒXÊa•Š1c‘âîØ&y}êQk°v :Ô#â�ß>1§c"÷ÊzôÐCÉÑÒ›J2z¾_•+#ÝBÖÒ›Ò¨9kWmèHQ±'g7Æó_®¾6Yäç—g%/~ÒÅs&…1Ì g¸Àáwš©$ÿõâíœõÍÎ]‹9;>gý›�Áh¢¼Î¯³î²ŠpK�PFxþ±²n�OHÞ{³S=^kV*üä!nááÔê�õx½ì‹H,pôV韺>Á !ŽæŽÊŽÞ•˜�,ò<ÜÄYæ×+]Aˆs¶�òLBò© ì…Uc|{y¯ÁUØ´ÎÜ Ø ý9…-”8°¯ª¸DZÆvœ¸báX0 DžðNס~ª~^óXÏ d`º\üLE)„ß Î|Ç?8i·øH5¼Ú‡mY«²äPÏhn¿yq�Q´ùhìUŒÿ•˜Nˆ‘ü¿—ò›>ÏPãê2¾ËC„FKë^¸fa"L³¬‰Š/™0†Š ³�?-†°ý¶‚ú‘¨Ãô„¡3YP•YhÕé—î´CBÙøfÕ½š3ý‰ä�†„µ†ÿ“‚ÎO§Ý –ØšÐOô„¢“òƒ¥F"¤·88©àwüùŨòƒ·_ºã¿‚ Ø'+ÅB¨*…Æå\ʯík2àÈš©Ñìl�Ao»ÔV{Ü ª*nÓhC… '1 É/þ…ÃÇ?Õàù¨�ùnJ¢ˆ)pxÚ�D5ôa)±^*_[æñ{‡Éá¯î…lË“ýÆ÷a[E÷©8ëÌÎC3tùïJÕMŒ¯l>¾64à_$2E¯<õ¯qöR~ÿ>"‘ÐÛl´Òµýô<˜U5ð0ÜÜrÎLZàö 5Úö¤ðôÖ0$zECH E´Û›9‰€Ýˆ=\¾PÙËßOmL.eœû²í—Ç Ÿp™žRÜûä(“{P¬Ó4Ò-žÒ†¹@í á-¡¡³f™7Û*¼PªëÐÖI«„—ý†-×r Rì£ØöÚg1ºkŒ hZàZ XÄÒÉ_cj„U«åjº‹`�”E+jo4kN²zJËù û¹Ll� ÖÇú%:Æd/{‡æÆÖã}®¸Å<—ƒm‹–ôçŒÄ¶ÎävºÀÙÿÛÌÇëäü{ÇÅm—5Ý7~ð|kÞ,ð] Z0Åy}Ö ‰û$ª’{+zI»¦”"4.�ªÁ0'íˆc.IkVPÐ\³þ�7¬°›•ù& ÖA—Ÿ‚�9aÀC¾”É6aɼÛº6.œR.˜™ë袖ò˜Š}'Q²Ð�‹0eY6¹Ñt:Nø›ã޹VÓBÜ�ªG×¢±ÞÂ�2¾-ãàPŽE+d.´èŸàRñ¢e0ƆnR»w{&½�jëbT¹:Z2.kCJ¨Ô½Ñ:8Z»ñm�ÜñÔ_d  ð–ë<ø¿ï”�ãoC÷ò¥`µ)UŠ,ˆ Z›PoJfÙ¥-¨�©„„N±~�Òv›¢ •M�O sßB#}ëcyQe3±”åß¿£Å€o»ŸmÔŽ¬þª#1è�‡¨à_Æ[`öGôwþG¢ÆŸàР׍ŽMý|àÑŸ—1Ã\í⣲†0¸äy=Mh¥/­x70wkÚÖÎ2ÿ…�¦0“kÀf½¼ÿÍ^þhß¿Öïý¥¬w¯ô˜óµ—ï\¶ý¡ý-×^hüžÓƒ=wñ[–wWDYãL1À›M>sè‘mâÊ©£"œù­o›üOÅŽFEé{lÜβü� Ó;ùQŸ¼ãæJ!Ô³‘pCÛ'ÄÈÂì©}§hA)|ùÛW^ò@¬@� Ô™s!ìï—®±\ï{—Ts}kÀcŠÃ�>k;khÊ“jYhOˆÀ²ÄÃ×,òkU¹l6ÒíÆ†¶ù9£º.N~�¿}»¡wÒ†°zây¬ùcgñewüøYDz‹Ž5ŒK¦z­ƒáMˆ.•&Ÿ¿Cæ…„¼oUA(šb1�0~èÐTŒÖT”þÛáÓÌcÒÀdë {kÀÖ |oc½£ÉX†û½výÐ W”žÉKôXÝ'±úP˜P=ÝÄó�X0Î2m«6J»ÞÌdW÷Ýȵš‹Ò‹Ò ©¥�!Ÿ¡ÿ|�ó­l�ÑZM â`7b9jÏl¸Î)Àú=0Â¥šY°ìîååm E:hHY¢¦ÑVUñ&r²mf¬‡œ@qŒ)¦ãÀ¦-"fNÓ¬@›« œ‹Qóm…$Õ,øæ÷ŽëE_Ǽ­šh¦›w…?sßAΑÐäß�Ñ6ãC Š®`“_GìṸV;œ“Á�4v‚ñ.Eañv�»ç9pehɨ+G2µ¿Êéýç?S{Í)÷4°¹[eh'£îô³ƒ²””)ØëOƵò%¨í0`x ¼1ò‘©"ˆ˜‚ü3äEôÜöûµOЍ}I-{wÏ/ZéÔZäE…ĉ�£å˜lº£qqÇØÚËF¯/y”c¸ÈSg€ÄþÕL©É«êçK^Í3å4]|нanH‘[3Æ~(R¹uÛ4H\úÖNû/ör-àFúöl4=Œná#£’‚�] ÷�"â¢íÝJ,â•ÚpøÉV�ý6Æî=eåa ©.o…ôyÚr{Ž¥=?}Ot.V!ÑUŸM:é«UÖ¢—9Ru9KZõdK�™¢A‹´òÀAïËä /tÒáƒÛ °’C÷'ßÙ¾8¬X.'Ü áÒ}W«è†y8êÛ O{»` îÝ¡|á\Jœ7éÏ«µ·W´c!B!žÝ‚¸™¿›Å·„‘§�Ùp¯Cq÷™îµyð÷lN›Zé›�slQm1‘ñ×�85æ)†vfX—EiÍ"ìCavm”+ÉÚH …1$4ÞHèw²‘–KÏ}®Ë µÐ…\9’œàiÉU­ã£:Ûœ¨7 ÙÀ̮͞PjEòت£9Æ“¾8âÙ»°8e®‚fo쇋Xu€‹ÃÑ�Œ^nv"lø˜É­§;Ž/ÏU>s$Ëb&ÖוÖ`ÆLuÏÛã­®x›Íxô+wäçRç •w�oó„|—¥M;+ë?yžmÖ°4>_'Ž»q …Ë”6LJ¨°fÌ‚û\ sÍa”šêžÕ“SͧSÜ'h4iö­‚]²N÷ä“Y×l´ì¼¡Ìq=IY6T4~ òɉÏ007†ï:¸æÓ r2R²|qÀ¡y‘"Zã~]ÖÉ*^ë¸xU×—�gN#‰¡FüÞ¦t#œ1«ãòýnÒAUœðX}VÅ“€¨YÞÿ¹ŒÀÁç×7�øµÿD>péæ1,�;ⱺáD¼<÷B›&�_¾¿u%Ügxωú|Î\‡�¶Z]TüeUÙ ¨[ï{r–ß•¼tµ1ËÍhw~?3kïM…޼kÂÕdcÌRêïÆÍ�PjÔþx¬™&éa˜;³ïH¤hÜï J]ÔÍó¸ò ‰"˜´×8TÂÄÉíŸ ×Üë+[5—äíª­] 3äç ÄÿêU}ùð™ös§‚ôÏÚ=>J…å §Åo�¯ã¾µ©^g ¯é˜6Ð_¨™éEö/¥&$]šIç;"ˆBôí×I<“ö5ìW/°÷·‚�|º�yè5„4u4¹ƒQÈ–½…còMª‹³ÆlŒ‹Íµ¬îù„-0]Íë¥àÌcmÄwC&IMÍÙnŒQ‚­å*¥Ží¨»)þ1›¼ éLºéžšÆûç}!©j­+ì—Km)‚U4(þ×I±„¨Õ:I&ÔÝ8Áóx>K‹ÇYrñܰ¼`Ȧ&y�ï÷bjBy�ÙÈa¥wE£5­¶+†¸ Ç1ŒóhFì•�dÓK§V—€Âð†3#ʨ,)[Ãñ�5£5‡ŽL¯VÂ'œOÄÀÙ‹ãb Ï}€…EÃ#rnd@¼ àîü3Â)†Ñæ ݵ¾cÏëbÁü4"â¡N� £ŽÝûqÀ×KxA.å7 ‹ ¢€D,d£ª7ÖKoqøºƒÎŒlµݾ1ÛŸvÆw?¥±)h/R[Üܘ°œ¶K.K¿§4»Ùa¶Î[ü£'¨å²}Û°|>{á=wÆ!¹ >ÿÈÈçÒô¼+ä×AcNœ¬& i}Ù\êØÕ®O÷ÍÛ,q„2\ɹ3R.© ¦þÅ�€Ä¦6C‡�ë"XÂ]&Ôc�Œ ¤Â蜭Ç9þq}›_”¨#{þ}‚º9pˆ¢“|ÊóF2BSwq}êÄö0—1h²”•´ Ö .zcœ™IÑ®qŸq…Æ£õÓAôD—öTwµÑ œvui&3"Œ$Ý‹>v^pÇ8S’ó5R<¶…Ã{ƹÆ']ßi¯[­¢�Poõ/sÍJçžžómMîëÍŠÎ;{&:‡{xc;ÖÛí ÒùùÏ–Ï|-ž bfƒu»ö~�—b�"¢Ý)âÑ¥®˜˜ÜeÚ¾X^Ó‚žcbÜ5Z*ìŠCéí<¢Ó ��®-öô¢(• &T.�/‘Â_WtXÛà/0ïàòŸK�Qðpí»5~Ì÷Çæ t߯¹…'§JZöì§ðhßlä’ê A0W¯Qi^¼Ó¨ù«îË'¨Üß7á¼ ÚGj¾wz¼J0žÓøJ#?î™ÏNú¿àê;>ã^ûç‘æþ�xø�m}ƒãQü)צRHúÅñÀBdxh^³éÉîFb4¢´ùÇ o·Jê0hDŸì§{®ncc�HPóÛ¶Á•i@ä@¸šã7«¢ž�íDZ�<XiƒÇ„Öˆ,™äñ—'¹nD‰Á²†§§†•‚ºKV\ˆ¢‡��˜aµØ+»Øl¿Ÿ¼~�h®¿�ÍU²r½V©”æp„õ¨O(7™ôcÔÀ,›œÎݦƒïd~ Z.޶hÐÐÅp)å‘*–â„е Œ2Ý+®d§šød6)0oT-ìe b½Elz½–¤€vù0” [4RÉ‘’È6Ëe�=àôXö±Í\³6Dã ܸè'˯hö…²Îí$ ÕY;Úz�÷ AÍ\Žq{sF;€&C´/eÓ·£�^�¼»éF•¡×ÏÊØ(© 6µ]c׌D¡‡u�àõÕÏÑB ãsFŽØ­Zaª¬Z©çåK‡”“«„ÍUÒ@�%%[ã‘qÿ`½¾qãµñ°Æ^Dxî�8¦zF uÖâ»D7xðí~<¼De_›Ônñ²ôj—Ý7š/=¿;´3s >²¼ù�xîDß–Äþ?ŽúGºsÕÒ:úêé×�Ï]kòpàwîW4—ïó™”ÙØ§ÎsI�üW‰ìÎE xú—îÆè3cF\ú*·6h` }A/Ù",ôçòöT¥àlKE)¼èzE÷ Ž 7¤L¿ïÇZÃ?^BÓ_Çò'ƒdt‡K}kÊýb{i3Wjǰ ƒ£¨ÞÿTçÒî¹A°gåÉdå>á¡âm\Ãõƒ�Õqì¬ÚÚå镪a� AP=ç(ʹi•±ìÖÇ#gÑ`ø™â<®j$ fåÓ¸×A°¹Ú•IM/jf÷Øv‹äÈçuÝŽ™¼m;¹—²ßð‚{š–´ÄÎzñäþÁ„Íåj×pGuÆ�gm;�J,»iE^Ç¡ÃQèû)ð¥‰öǧŒc“â<ñ\¶Î³ÅJ8y¹±…ãµó•´Ñ™À¶[D�’„+A$ÕÁHJ¥7§, áãTyd·¢ô+YμV´ÔèþifX©•^“‰m¼û^w1kåbkS`²Â‚$t‘°[³u}ê‚!š]ÐÒ¬,äAÇh�…CT�ÎÀë$+6ìŠ ”btH´lâX)&»1w¥áfr¬¾#ºµ–øˆfŒ·�¬3fÍ,ΑFv èom·§‘9avpÍíŒËΫ‚Åcʶ ؇ÌvoA¿Lg}MAÛ»‹õ¬7…d#&Qoïƒ}�4žaÔgïK„>ñ2Y+6©:éAÚºÿÂèÏÓ‘~c .FbËEo ÐÂH1vÛ�É@êg.�ÚÓ°¼ëö|�ó\çdoh4½Á“\öÞ6ÚÚ¯Ù² +V2œ·— ê-ž˜àÆôÁ$ßß�lùòŒnSײ;$ç*œ\¹~½x]‚¾¹Qú)³šœ'ì°V<äò˜ÞC¸lÖ»Ì1b�–9nY†ýŠï Ò.­ŠÙ&¢/kÑ$æÂHé�Á ÏT9+DŸø%#tˆpû}2d¿éïNHO‰ÈdýŸ¤¿ÎDÜI ÃÖ…’A†œH2'A##em¸X×�ÆíƹƒNO6RMßJá‹‹ãš[]¦æ,/1PÕØÚ�¼,ý’Lèmˆ|‘ ßºîœ3Ûþÿ&eïn|ÂËwÓ¤|éûÆ'!;”\áÂzI „gjhÂscÒŽTÿ@ßµH‚†6@ð4xð›ÊN xCÜóJ[¥Û2›v 6d@K•ã©4  ]ÒÛÀl¬(9Ä'–p5·˽Ɉ…„wv.ÈÁ �ò4WÜ|€V¤bŠfÂ/3:^ŒóŽ>,h "Œiz`…ÇŒÔå“\6ÒC”¼�³K¯$"UÎ+>t7Ì‘²ÞÑ«'°n`²ä"Iî¢}þ«àÂâ"n“>�iËâñÌ"“qïßöûç¬Üq{V>¶�N.'>vtÏ š,ÑáÍÈ.ÔmYpÓ”b[Æq°[ÜëF×Èw‘œ ÇÞ~ 잌½µÎÔ|1¤OØÑÌÚš_ï%û¡¸YKS}n­ð‘§~hc´z où�¨/œßöë*¼Ü'<ÍñÜdÓ>ŠÕ–tƒ‡f;¸ouOX„› d“ø·‰¤„ °Î®l¾i)~€Ëë97}x1Y™ôÖ’Þ3 ó׊WëUXÁyøìÞ·� ûG{˜2!¹À@,A¾){ã¡{žËØY¶xK"PáƒÅé&ØYÎ…òòH jeqÒu=ݯ¢Å4O1洞jÁy�ØVº/P˜ù í­¿WD¡;¥téz\úÌ�£V�Øû¦Dõ“Q‚Ä 1uÅêÀ ÔŠ@xò7_K&Žpç`ÆüD¯<ÁýqYÚ®‰‰•i—J“8µ�®'½4¸T­çº Lö“4 ü:ŽdoD.%§Ö=rÀ !x3£KW>Ó�)x“@VïIu� Í5‚\ï÷ŸØ'èj tÉ‹Ú7UQ¾x{ ¦t%£CÏ��ô+-§+µ¬¿[Úù0É 0­Û¨xSk¾scÒŽ�äLo �‹É&9~béT’ |MfüNRbSZ^÷~�&öÜ‹äÍF½À¶n¦ãª¬.ñµÔ7`&¤yÀž6õi>À¾îÆsÀÇÄ"®¸Ÿ©È‡³{S•µÁ_4»ÌzŠ®èwÎb¼OcaÆ’äe›ßK0™Ø¸ˆ*ù*Â~ÍâàðWXgÉO4ÄL"3ŽÐ_3¤æ<Ö°¼®~‹-¸õû½rÿZÚk¿b}–ú«vÕß`ÌÞ‘/ …cˆ.“;áTeO4ýÉ÷9#þ«ÞŸ×Mö%7»ëÏhÄÜlW?’�Ѽ†2r›.0¢ï±¯œgš¶¯xèómÊFQ"Ç“bÈØlºž=l€¸&¼«ªˆzRx��m ÏßP!þNAJôßb{�‚”cnÑ0cƒŸš#ýGqz3ûyzÒ[ �R2�®‘ÇŸûþÚ´‚Èó¶ã·î�¼ÓþÛ.茈È1Hõa’ÿ¬zÛ_i–Œ9íü%>t)]RÅø-læŠm�¢+EáššD¯ZõS°Fr › Ç~<¡‘F/k•á Hî̇ ¥ÏjbéŠKëOeoÁs®5S9, �de�]WްeºBd]Ö"Êó%ÍÐ^âðYÛægwF)peI×IÂ6¦|ñ²üÿ‚çæPyKj'ö)ŠV�¯FòûÛê§ÏÌûÒψú6ïèJRPløô·±¿ÓõYé±�º}Ãöõ™æ'·eí{Oª•öJAõÑP‡¬B‘ 8 ÒõZÂæfá«%v+)žØ»¨[»ö6)ŸÊ Ûµ§RKÇWZË….±n B)D“øåCQ/taU/ÆÉMÈaÞTЉîé-DPµ2åR,x<ÿbom5ã²CQœ[cRû�w)äE‹ÿ?cnœÛðè‘©úÜéë+ß›·Ÿ�8ÖÒƒã¯2yM™$K¡�pö¼‚ILÄ&ÕR05œŠ#áq«¥Š!ÉHÂøÈš†¨w™GEÄq|#Ú>"¥|C:Kè'—Ðîáx»Lç–Åͬ¦&Móѱ–¥ä^ Àì Î*®æ0×j½'Ž7â×é¶–=OKnš(Í[ví¨z€"P‹c.ia˜±½¬6h� £í•?FËWȹ¥›ˆÅ’]ÄüYí·1/ç!óU>4*5¾ñ›oÄéZ*ºµY{˜-5Ã266/%|õ™ÀúÌ™6!J3þ«Î^ó¡þ§¼Ð~SªÜ¿)ÁŽ—œ¸¨Dõ9‰·ñf�¯2{öñÒ{Šü[¿bÿÏxQ,DF„=æQTn«p�h? b·º/ý ü«™N„À… º n¿ê]ñôWìBg;`–é7ñ8H/ Ö ˜ÜdBA«¯Ð ûÞ^{t�8@à�à<‹–ûv•Ç/ëkÞÃtæôYH3½ÙÐbþyÛÙSÿ`ÁÚ|÷˜ÊëçÙ^>ÎQ^)bßg <¼Þ¾ê�6ж8.ç0¹�~_IÝ«·¤´B~a=š×ež¸Rë»sëÙ¯ǃ9îSéî >?ˆkYæd†�¹óÔ‰–#2'x^zqÇ=Í4“«¸ëa¬å (y\­Å+êœÀZš†½å¡¬ŠowlßñŒ‰p'”[/æÆà"È­'ös1i!›c ڜ󹰎›[du„õc}=Ž_�jê9)Ú �wÈ\8×Zê“ij·+ còoÎVã�\�.ºé†òô`Yô¡-g @€K¾Î=”/<¼ÌpMÐ…ˆ×*!䬤çvî—wÑü�«Ï[yú/'çøLJ"3bÊ(±Ã #nBfJèóÊ¥±ÇRÖ…©pEÓNfë#�ë¯g·r°{êAI}/½þÀ;øè˜æø#fn Üxöõf9‹“É>!©mjÝæw¬dVtüd @Ú¸ÚúW•F½ÚùýÛ]lc¹ÞŒï§eá¨Y×Ö‹»¡*PИÛ–ÖÑ8óüñ…nO ²+a–‡WÏÆ¤2¬_­ÓP©ÇÄ�øÏô (.* šê–ëjÃ�Û�Ý�–šäÁ›Ê/“£(Dóf¼2ctóÍZ2ø®g*³{ÑgŒ‰I˜¾ÚÚ¾@~s|N Å·XÛshÕŽÖÑ0�½jȇ}Û{ð÷‹s@Çy=–ÑЧ·+y¤îr°Ï¡v’`Tø»ât… â²uçsfÇ1ÖÓéå§.÷6|â7~©c½+ÑÓ¼¹ø®n2Sì­5׋‚aû>}óþlo¿µ™ „ã&¦(j–€€…º‹Á_¤E™q ¸ÝšQKÈh¹ûáˆîž{�“\˵ÐÈù²ØNß꺷±å.±"=`yÊ2¶œ�í'·Û½Wb� øéhh„²ÿ…ú¯sðØ´Ê·0¤ ´„ÜW`Y;ÅÛ1¶Uº:§$ÁêFKÕ.°,±�ÀÙ…-¦IA¬ YXrŽ“B7£µÿ¡<'‡JŽŠŸæ‡î蔄dÃäžÙ‰oDk[‹É,ß$JœƒM œbhØ­e‚|˜Œô¥ûb$›ú�‘qÛîu8È�¾¯67¹3æûaéY¯f-ŽˆÏ Ç« U»Ÿ»ÜP’£kýœÖ/åË�õà4T2[—š8|‚Á$>¸jm9;Õ‘Þþ<¯£˜ ¡ ‡=s~zo4�¢á(5ó~w¡ÓäÄñÎdV¶^ÒÜþçÝÒ÷Mö˜4DC.‹_�£4ø¥?Àå[�W€…Ïëâ&G›¼Øú®»˜Š26²4šOÜl¡k Æe[*;;&²ý‚*b|¸¾?µð\½¼A11¹jÚ ƒÍ<Ë‹hNñì¾ó£«žuÚ ±Hñg-fÜÁm‘Ï”d÷}×!o¾æŽcE¯®�|y-;äÿzt¾Eþñ;0Üó¬er¢Nô›·Ì%wüöî•Ëp—ó\z|_ `n®Vî²U,¸N.�!ÄÝ–�Ÿèá<`ùrÃÒ–×Kd£ys@¯Åž6öQ¸{ŠÞvÈ_Ç/Jz¢‰Ò‹á•ó-¼p£G†XZK—Á¸´ÃUOõñxº45:^IRRù[ÓeN(džqÌ)æâ¦¨_ÿ“K֜Յ†r›Ç*/v8Ü6@¿y/쟘¸[/íl}£>?þæÊ0ácºF �)r“ê‰DY]ôÇ‹‹ëÌc ,Ä)PðÜ4J2$Z™²3‰ ÙqȦø?$ŠØm:oagÚ/­‡û�¶_5<“•ÐðÏ£¥Î9{¯ëÑT@á-rŠBÃ_�…P¥´uH£`MƈØS.»*B1ê¥÷‡L£qË(‹}¦ÒÞdllÐ… ɼNG0ÖÝ*ÌÒIDŠs†”ßZÃÖjd pÒY:¹�u^ý|oý°#s¦X�sãe©å®7ø fã�õŸë¹9�ýEV]㟕ôx{±·¯ƒ[G[EMÜ6rL;š�](1Zƒ«Š0qd†…Pd´ÍàÂ,FT¡ª;i4Ãô’àÌ qU†¤@1�F huÈzšdÈ]ãø†?›HEÚ ‘á2AžŽ´\ŠÈnŽž«§ÇõäE1 T–˹D8؈…Ö>é´y–zÄ{Î?•PʤÓwÇËŸXÓíŸ9 òűœ…ö )”°"xΠϣ–Í]*;ˆVl]«�¯íânúþˆ| –‰O_xÛÖåù™¶›7oAí1žàÉpA´%9ݽíqÞåvŽŠ 4�Ë+ƒ\½Â‡[ï.rÃ7XÆ�áæÌ–:@•KÝtÂ3«»Œüùn€bËû^E[™ý¿;4î}ÀšºÝ¤�’:–·’]ñ §öb‘«ÆÌ%Å+†,i•‚¶ìYäL#v)‡,˜¸8eúOu^è$n“JvD£ýGßF`�ÿŸ\(9ú�šÞW¾Z}߃¥x­dk†Õ‹(“ôZhº?˜áPˆ;–›(‚øž/œAlÃmä§–(ó„!—5öJó7˜½þý}PkßoÓ¶‘M䋇¾+r7×Ð&k³¾ÏŸS§¸ïöCŒ+µˆµ�ùW„[Ô#\E8ÕwËÍÌÉô«Ê‹9Ð…ÑQë �(íâ±bf¥ËJQŒ1T“Rå üSi(fŽž 1’˜×‹–'ÏÌkÓ9½'³æ¼�ÁláûŸæh Þ·³ã™+‘¡¾¦‰Í‰¢¥ ×Éó“2tG,üÎÍ`ó•6ʵ^ðûÐHÏp³«ù‰¿žt¯7ˆ®/�L•ÛEá=‚ñvílß ƒ,æ<ÕT;é0ûðÒOD8¾/(¹[ Xl–þ®b'jx½ø%Æšڋ휑LpÛëísêî+Z§’vá¡v›K“Ù`d‘˜bwò–w)ëŒûY—±`äV‘�únO¿+7šåô�o`˜sÉ3ãù¿â=2‚Ÿ ?ë×õ…!ûþó¯ã�ãàm/oä¹¥`oËZÿAÂXÿ8ìkøüéß.Íbwê>#ÖÃ^æà(bDUÿpþG¸ Á.]¸oe©à±ÎÀ±ÝÛúk5ÿÛœX÷±”TGüü€½tKÔ/ÃÔ>޾;A³ù˜Ê1ßýä`Ù _ÛÁ‹.…ϧ!àýª?ŠÚ[Ïï÷ÍM«Ìã�Ü3a†É —FbßÍÊ›ýi©�JºôeoYº)w5Ó"£U±èŸÊ‹ó„…7 -aìü[$ûH´€ÿ²ý|â 1¬æ�_O5X´dÒ–Ìèå+u‚ÇŸ®Áº4 X¡¸NT*µÌˆDÁÝÔB£Co†­y7[ŒC™ XØ…­s�CZå‚#A!–ÝwHùr\Q…Á2¡æé¡Ô…>9ñ²&i8±`¶¬Õß-~£l�‰¹i+wy�ž:�pÉÒOÂóø—û]Ï{<´ñ\~cÎÒ°‰Dk¨0€*³fÔÒ{CºwJ|o,1AáTh†ÓÁƒirIR,¡vêT�h+kqRuÒeh8=!dó“-+¯‚òŽY™„×›†ÄÓ6ÉñµW>/6 ‹E³‚‰€êìл¿f‚™y­_ëÔ;\ÚáväÉÀèÓ‡ •é´ÃøÎlª¾ß·—ò-kmÜ�§ó¿±ˆ_±Êx�ÔÀàΕÔÉø×ù+¿ôõÃ@ëå¼ ÓýþCS&† uV4sÏû>�_ë¨xb¶‹ï·:úü¼Ž— ®#ΨEëöáŠ=!˜ìY-ÑJòñÎ= }&»ØªŸujN¡5³V>(‰Qg—½°Ö*ÿ„cP¡€°(¥q ]þê;Ƚ§-%ú˜ ºìÂ×ÒoMúEÛFÁÕë3…™.NkpÑ èO‚žG‹žõ ytW¦=Nô9A ©ò†GH!Ô�øãNÎLëx¢ïi7ÿFjþEj™Ò¡`?„r�ò­j<íüÉÜy›êcekXW3;¢Cù·SBÕÁŒÀCY¤ìJ/¹œe÷©D(UÌB*¾p÷zÞϾh<25jêþçONºñ¥8¢zÃêŠî{õÜ·Z�{îܽ1=§@GËù.†»yί44T+};zg ¦Êˆ`Q;0çê³^1 î9¶‚'¸ÞC�#ë}«ó’­0O¶Îú¯“L‚íÙ�‘ÄœÿÞŸ9<>·xÓ<Ñ™#V<ܤæòÒ*8UM{•\˜šRëW`MN¤ºŒ#!:KMùƼñ�–y�“ h§WËëŠÉ©=Ú& ÑßÝQ#å*FŽc3䣭 ÕÒ±ŽÈÌ]"òµ…xñ>ïŒG­êC¶¥1æš ‹˜5ð«Jùë.o‰©u¹êĶ/»¶`ƒ�_)Uˆhª4d»EàÓ ’3M xÿÓ-ÊO°Ùœ•ýŸ>à‹–QÌîü˜º#Êì”ã¸.E‚ø� ÷‰ ­:ÕïED‡u8¨=ߛލ¨%ýÑ–Ç’}¨Ñy€[Tcêa<QîBÌç8iÇ]ß÷D½ÕL¯tÜi7 „zeŽ¥Ee"ªâúÛL‰˜2Öa¢âtqHåí¥æ ÉåJof^Ð1qái»íJZž¬;¥þé¹ÿ¦—�þ #ðm¡¶ÛIyßö‡2ã·òg\‰èï_ZE}Š}j ÁŲD~uú—“µo $‚A¶Ô$A ´Ü,õG®Î^^ÌÐÀg"1#Â�E€‚@†š„È`˜• Ó»ÿ)<Ÿ�X,ÍH1hbi´&� ß¯Ã ÷Ÿi<ò)ZWψ\ˆ.† i±´~}|¼ë—bb[€Á8P ˆ>/ñ»�Éñj�ÛÚJ´‚†ƒî†¿"&Ä7¿¡tâ¡€”“ÓþŽZÖ¬<~cÃVê W€nQ%líßþBrù¯šÅØ�„ÞVçEtÒ6¨ÌV;d ±of£,â\ºéÌÇ“ÐÚ§ÄX�X}Ý*{ß¶)¿8ÿj¼ŽØNºîU÷æjcò5vV©›ºpbÉ)C�_š¼Vñ–å:³[UÌ“Ÿ*ž:ÀÖxkb–<¼2ÄcpÃ"kÓzï¸×l�ˆ‘) ž‹ÝÄA¼íƒ:RŽ]^â¶ §n›Tï«niÕVü�¥?@D%"HûÍu3ãRo rOùlð%-ªÜžgüüïµäs›•Ž‚",Årç]ø°J|”zâ£s Õ,^e`£zrûöòû�*_‚1ΫëžÚêÛañ[·ˆØñéú5�8N•Š¢­ˆo²8Âö¤x˜fŽØPnÌ¥ÜÀüç[� ÿFÂf4Bmt·?ŸÍ•5˜¹MúõËkã«Ó|;î¬Ý�¶Žr"¬ÖÄÙ«ZZÑ�ubËž2ð­µÈâ¦YB6 ´……3YŠÃ!£{S*8ãËSJS3·^üÖá[\6 ù4RÏø·öî GÃ#Ùºû5Òö×÷Ñ7µøfuûŒ£«½ç½5ó7Ö]Êø/…¿â`yao=^ÞÜn§¿<¨ ³"ÿ[�wƒ×û|!£[-�ÖïÂÖÓÄn�j¬#ã¸P©ªß*«’ü?Gý7œÕ8¾ @¿É�KÏù™–¿Âk¡ÝŒÆ®çßßÛ�‘Í8çvÿ¡]OÔþÏ.Ï”'IqÏ#9Ãz©/?›0çA1<‡ßs^¶(žÖæ¼yï½Öoœþz"¸QBà›†êœ•|îpÕ À­ S Y}§š,Ûi‰šß|õEJ>…Ù’õ�2ÁV™_9á¥|žñ;³"Ý»é·:k°²‡ W‚]¯�º¬(¾š*²X`ëz} ©¶"/çCóý=vûg}9Y¡¶˜$¸I 1#i ïŠEh™' p4þê÷ ·l`äÓoOÕgîó§Ú<#³+²‡ ±÷8)¬d1Å?;ÕÙ[%ãÐën3=ûðèõ­i.â<|+Òãy¡zZîv.jÎqß…- K»,ŠÏ ©5m[œûÿ'Ä,£:•2äOõúxÖN/ÖËŸÍoe„�" ”\“5Å‹sÔðÈ©#Ö¯�ÿ҈Ί³u7ÑH“7^ù†?ó?~õ ?¯»—7ýé­ �±]§ñŠ>ݼ-x'©N›óQ {B4!}-i Gòô‰ÁÆÌÐ…7»›!‹)Z­b",–t8^wĦ×Ì�ãã-—ò½v7áëBš¥JþÉô>Ðêíï“sC@éJª“bbSt!02!Û îø=\¹uu‰ÆsÕg³Q«Öˆ�D¡^ª ö}À QJQRR¥BªhíÓиÄU*@àè@ø@(Ð € zS¡@€'Z@pN”§CCÑà)ÐÓ€'Tžª´JwÛ�@}0ÙôÐéäp^¨éÄ0f@€ozIÀs�@Ýk®¬(:@6À[bŽ5G�jNöÕ@”ƒl  ®ƒŠj¬: JTÐÐÎÀ@ª@n�@:P(“—\QŠ#@@ª( 4`IŽ� ë:ô)E¬0¡¢Ø@�H�B` T`r€ÛrÀìP$°Ä¡¡AB�%,rê ì4@h P ØÜ2@)ERj,�$J� PEm���ž�IáldI(€R)J$z·Î(tH£RP(h” 7a äwi(v6Àtl`ìgGs:1Ü µ�(�AÓ�€Q �lè:«ªª1³Šu×JBŽØ ƒs�ÇU#º¢!@ PP (ª;)l‰RÃ¥Üò76 =dhh()Hr�©„h’R€ 50QD)êžÄÒja©é Ê•*iˆÈõ 210Ôñ "‰*’~ªŸê§êž¡êb0Iê•%<¦§ ÔÉêl€Ò2À$B J Ôéÿç÷×ÿv©#¿ªÿëìÿæ0ÌæBÄSešƒüÿû›ÿ—öÔå�”T“’N^kÝ µÀi‰Š’¤Ùa“3�ÇQW1v»€¦Œfm1Íw+³,‰Ë­×mÛD+»™+4îÁ]£0Ç:n[©3�—wK\©˜.]’‹H�N�Ö�nŠeu7sWfuÝ3!,–3R¡Ó©¹W#[›ª›r¸’«•Õ¡·wF"¦î³¸Ý-Ã�ι®RWN›�»E×]Ñ® ’¹7I·eÍÅl¹\wN¸iwr뮑c;»"¹“»™¡·8¤–©P»·i&wrQQWvã9Õ!;º5Ýv›—,ÉR’ÅÈ»7:�¹’êTÃK»]J;·HÆ»·TÆL2XŠ&fÍ›‰.”ºq±M]:srÈ«�¢”å»w]JÂQ•qÝi«•ÔÚî±t5ÚÝÛ´]véËsk™Û²ë®ˆ¡™•Ãwn®ë\¹ÚX¸j]Ðåu-ή\Žk”fÝ"ºk&“JBˆ¤%çw]¥Û»p4Úîâ“LÓ!4‘®›¤Î\’È´Ù £w\Í»´Â\é\×Zm ®6æ×vê$›¥»wc¬ÌJM.닸×W+®u„Y–fbY&8\jd(Ò¹EÜÜsrHÚM†d¤“JK:í×!\Û®ÝnÙ—uÃ;­u*FÑsq›œ»®‰1,*l� S%b1LL]܆†Z;µÒsš, 娆-$’åqe”…Ë”�uÒÆ“®äW:îì,f¦Í†ŽívÓÙ˜”¢QaÍuÝФ¤¦¹®Ónk®¹Ü‚l†a\ܨY®]suL”¥ÝnK�i»»kºº[•ÛºÜјSnë­6G(é¥Ýº�Û›¸Æëwt”®êê—7QL˜$…»«¹ºn»„»µÚîéWwXÍ¥(Ü£’"wq&æíΨ™Égqº‹YK‘ÊŒ²E)¢ÉwWEÉ;º®µ–Êi\·mA]w)rÝ7up(‹2îêÜÓ’¹A@’�"™2KräEÆŒÃ2wnY)eeW+¤VŒ‹wu&­Ý®«®¸Ê12ÝιBÅÝuݺî�³µqÇms�&š‰aˆ™‚A+ŒÃ!ªÜ®¦ÉuØ»‘Ò;±ÐÒ—K¦]Õ;«9±Üå×]wP•sM£M4‘·7T�ARÜäÝuÙ…)ŒÚÜÛ¦åw.M“*[¹Ý¹[µš×uuLn묑²¸t&w]ÝnåÈ�¹vÜwE-t×m]»¶tÜÅwNÝËjé¢ÔaJåÒ‹‘WL¤m®Î®nÔ™c›µpìC2æ¹ÔÝJd§ × G.I¤aˆ ¥s©”çDKº»MÓ“$®[¹Ú¦„f»®š, EÎ’X¹ºé»˜Ñu»®Cwv˜–s¨ÒQ+nëk»]¨9W Zæ�tÝvh]»KèíÕÎ%72[uÍu)©r¹¦çXZåÉE�Ccc ›Šs¶ ¹Ó7;nî˺£hØ»LÅsS¢ÜbHµÌhÛªî·Inít‘»�NÛ“IQ³t³¬v¢î®šS9V65u©²îÝŒBDÍBB‘dŒš7uv¦—u›-Ò�¥Ð™`Ú+¥vî¹Ý�Ù¦hs¢A›œ£i5¹¹B�îìÅr.Òå©°�–îÖ7n»™;µÒ•ÍÒ ÔŧnÆ®¹·Blkºé®[uD‘³#R.:înÉFš¹¬V*é�6ëºéµ,Í$—rW»t»¬s—$bfR¹]2k›„Ô2�…vnÙƒR™ÝnIÝtæåfe¢ÊŠ…fºv’ÎmÉ5Ýv"—.¹s&ÆívB°ÉÝv˺é¦CM’ÉÝÖat抛º»3esu0Î�ÍÔk6( �i:î–m˜.u¢étÍÝ» w[†îºIDXSsv‘LÆQ(‹��Ó,¢ËîÝ�9bíˬԱ›—HÓ2dÍ&b¹»S.íÌ·+¦nîåÙD�5™9\HA”„»ŒåÍsu›»u s´S»¹ËD& cG:$Ì#%LÚ2)´ÊJi™”d’Œ•6bî×%†Ê»®ew:º+»sºél™fQ3 nt ¦ÜÛ±dë®É­Ërfs«—$Û»nívÁ·v8ÈÒnº»3i£Jt‰své³­Ör®:¸]�&Íך5h4Û»[©a�;¬îçJeH&RI#(º×]1Kº»®±ÄÆ„� u¥,P“SL¢[ºäQ²[*ºê\êQ5¹t·;»]šIšlÌ\»—Q“ LåÛ%˦̓dMJML¶«km-jÖ´«mm¯ÀI !(@�$€”1$�HHäBH.„�µªüªÚÛQ­¶Õ­¿*ÛkUMVµ+mm]«mmª[j­Uý¤��uB  ü„�1$$)B@Ä P i$$-#R\Hú¿ß¿gôz†â—×X�øïD]š”75…»‘ïxÌŠØ\ ªé�,×¥ÇW¬l™C�(««_#waeaÞ²uæmíÈ:Ýp_t[w‚òű½ÕaA*e—vGt.ï•74ZÊäÓ o6j½=�*ÔÌoràI»y}ƺ+êU¹mÊq­˜,ZÑk5ÈÁh�¥NmDS ˆk¡Ü³»Ù¨#l›uÚìJ·¤ç ²/yUU¸C’íp½±Tlww ¹Î]{1F²Œ³™qfØ/Êâl¥§©I««³‚¬º-Åk*†§ÉК�˜%ÕŠb³ˆ¯k¤&›^Ô©-ÖT [j«/y ÔèM{y$£ƒ78Å�Ô2îàç‡V.Bm-|�fO �wMgR)oEUÐìU¡fÆdqÔ'»h彺õ¹c2Õ ÁˆsÊa^ÕIzè4%Ím°f_JEð°r”8Ö£´7¹*u\ÜåBô3Šº÷7¥A~ÞtÅq3j[¾\ÊÂmËÐcõÌÈMP&¬PC†méF£ÇUY#›Ë7j»L½Xp.ÍÓÂ’YÙÅ�­ ýX�–úïM{�7x²ò o°Ò+¬‘Ýw)A—Dz¦czvÑ0¢††Æ¤ÕøÁVí¸;È^¥W7ÙÒ곕sÉAÅ׆õg'ŽïR¥Ã¿l»º¨+3"ÄÈC{·_Ú’ÃÁˆ»º`ÎŽ¯&ë¢ 1V¥ÕŽQ“43nRÊ9‹O±ö*ºiÝVsõ¢Ö\HÕŠéFíH Aå–�”t‡%žØª›�®P�Öëþt8ÿf3ž‚¾rnP½–¨©å(Ë ©ÔÁƒT½¤’‚ @!ÈÕ¦ÐHfDì=÷ê;öïäwÃþ_ªÁÝMkÎX�oºÃN¿Vзs€|)Å•d€å•-c¤.L¡  Osí² ãJTc¨‡Ñ_'N��¡WÍÝu§ã+™«QŽ�ØRK´¦s¼c>sÔ•ŽX ØR±Ùbµ/rÈcDgn¶´ÜV»©Û�ºVœÔcáÒŽ�$ÅÚ½½ÛÊ6âÙ”9Þ†é/;[{fç7¡hñiÞWnS<ö²&¾Y½Hb]EèÏNæ&ͳَÖrÃt‚|„èKqåS¶Ä®W)sxÁîß\UQæñôksnºATøÔe JuD4ÛÏ4[ßçó·øþþÌÏP� P3ú ¿í ¿“�ê¥!×V(âZTCŽ2l¯ð˜¢ÿˆU9ÓW–©oŒÏ–ûZhn›îce�Òàˆâf ‚¹Z¨é+Ju‰Q)Ìr`oŽìÝQÿ1¸K¬­m3Š1 �KL•˜X72,Ž*EÅñšq¢å ˜xÚê¢Hã=µ£ÿº³òsêâWfF¥0Š!ù!)åõòœóÆýÜÝî*\n»�N\ÃŠŽœ1ÆÐ'ÇbÍ5N®4™7M½ž7…þ�¦w㕴Ǿ?³÷ß3ï]½iwrÀö›–WH$Ÿ)l²T*¤IÄf]˜®d×®8Pç+Ò뇉ûšŠ3÷¨™í·ÙwáÔj÷*'ÅØòT“žw=-ú!�•OZµFÇ|§2YÍy»Þ}/ÕÀ…äíì³€¡×j¤ŠšÞâ¾Îs”d8*? Ž|·‹dy¹š¬Ý”ÄeƒE\©Ù ìB6™ÿw5–Çí-õR#J8½$ ã&e¨ŸÆ¡*ïv•4DXË8Æíu먠’vâzc�‹]/Û(÷ÃuÜÁfzGZyÉ’Üðû·?.¸O#ÎÒ6i™µ%HJaAReõ2Ð ¹0ŽäYRºp(2Sl‚ ©)ô¯¬ºÁÍ�æ­î*¶£ðÑ ›´á‹EL—N 8…D¦J„ÈÍU(L&Ð ÙN ˆ,±P˜]|�Pq)à–ÑaÛ'*Š–R$L &I¤‚6js5)´",JÌ`ˆ øêé‡-“MéI0LƒŒÅN<¨ ŠÄÍAqš¬:¥Šj@È %‚0Äe&3·q.Š,“§RTñšKS…305+‰³œJê—c¤;1oZY‰té~­UU°á•f9LBâS�§ˆ¢'*Zh6¤�•�FKQòÙ÷W!(gÞ]Ê�I1q„þ˜î%˜¨�š 0l "¹¶v±G²$âðA1q�OP�ÜaœY–6–º@K90†¨a†){<60ëxÙŠ4Qicd'&ØV†Ý‘Ñ,A\04á¤�,âH#……ƒ�#™dÀ_SM§DÆ$™TGY—<ýrq#;mÚ ì뉘7w©|Õío6,ð¬‘ÑŸªÈˆ IÌö„Gp"þåí"Dåå†åf|ЍEß^C��9h‚(R@Ì™_÷x÷W“±A.33?¸ VÏg4·w’3<…D|¨æd"¨«†&%áŒ�µ ±OD üŒí]cXMfãåÌDok$á-<+N.T©%ðÌ–$É$Q¦ÃÌ9!”E$ÛŒ2Âød³ŠxäÑ`­ ¬Ü´×¥‚j˜’ U8Pó/¢V2ºF(îDúò™ršX8Þ[žŒ±‚tè\¹uL�Ì!2ì¾â�L‡PQ†Ü1f~VNFŒ‚ѯVȉÚ\Ç5”Þâ_JE¬jŽ®s_îý:ÞrGü˜8- :‚†Š€PË’bÂó–î˜`‘ÁÖTÁ¹†� Ámô �ʃû9a—–ž6†‹­íEÊ92G‘L]� ÛìF!So$! η'èÁ¦Hüš=ÂIrmŠFa�˃ˆeét ©‚@�ÜDJTiÄ3Ôrqžì;VGš‰Ú˜‚)§TpVŸìY ŠYvGœ´ÁgÖ*«52/öbî¯ã­�’A=gòöFq©‰P—]Ã(ãÒ4’šŒ|¯l«r@/ç-ø‚ü_p�27ðíü<ƒ�©ŠQÆiRF ?%²i±@Ô…9Ó’F�®×b—#3%„D2Ëü‘Ĭ†™úXˆt#ƒ5ʰ_¾~üƒóê}zgê ‚7øÖ.kƧµïœª2þê°Õ>ìòqx30Z úôtïM·­6wαfn¨·Éþ*�çzS2A0D@Zk3ñâ}â@7ÐÕÇhrº³ÁˆPtpaRàГ©4MìÛŠ·*ðó íß{„~œa±(îĤ ³†c×t\b¬ØêéXY�Fí*¨ ÈÎäåSÙ³JЧm]7ˆ,�¹pû(�È3�t±:žîІ¢aàÙ¨½7•V—Ú¹ ›Ü4*©Zi pŽmiÛvC×Kº½•.ôа´ôÜÜ`Ë#rЉñ®ÊÑK;j;²¬Y¨˜çi›°£Ã1ì™TvÃÝKí7à–�Õ5�CNu+á`½9z¯²5Ó{|�ΉڭæA”Š —6�¨8ì‰bÐ]J¹]›JP†õ!”'Q3,�îÜwG…Õ[ º`í–圠·kØ2eéÑV7Ø«4“Åm;îx. QÆ«(nfŠrƒÎΗrû¦,TzùYÍK±úÐuIf¼7� ÔCÃO=·;F ÒØ§;!‹Ãá;ª]pÞj T¯{6�E§º7¹¯;�>áœðWp«V¼Ñ‹fÏ®^G¸ö¸ êÈ+tò„¢í_qzæí^27/—K·ëæ;ˆÃì]×Kµ�õáZ ÉUV 8G"™ç§¶(¯i‚ €ÓN«K#woœ¥*Ï ‚¸Jr²<·¦îùM·kÛÛÙÅ ÏE^-BóÚ6j4Ì3{Ù—ƒhº=Ñá¬4¶Å�˜sRëâá2mÔ|*ó;Üåà8¦Ž µqÌtµãÂç›uRН֣ëVßÛ�òÕCoB}öf5¨žó3„;&×;8+«Sô‡Óy2 Ã[O±[<9e’Få�;Ü^�^îc@=àÅ¡Ûw™(É>ØWŒT';Ë=hë]Yc-+m§b.W¦˜(e[9%°øÄfàiƒ¹R¨ò-7©¼ëß.P1™Ñ°ª)FÝ-3ÛmA n¡Ñ›NŒ$Y]*·ºQ lùV(ª§o(´™Ò8KÑ[ f÷´R ô:�'kÀ⬠F;Vx±`V ‹¬o¸'ÝJPΕvUÃ5[å·tù<Ó[“&9�Õñ½@fpr5Þ:Í p´"çÙ^-ÙÍbÖuZîp9¼MÒB$,ÄxÙWÏfeù‰]RøœrÓ³kHž8A°ž;©KêîVnаUÖñ&hs»³;³tQ6Ñ帮ƢÓ.÷|‘„ÊAÙ³´ÜW‡ª%díî£Û‰ÙÍÅÌéºH>kÇh[ì6øÞPcP& ËÔ…-,|· ;˦_Ý|»3)Ÿ¬o¸={79t=dê�ÊùŒ8»»•ØSiñÔ.íê}’uæ R�híµÉiad²`C†ÕcM�ª ÝÁ—Õ)×¼\O´%éVæ[çOj¶M‹w6 ~ÚËœ±ÌO×·zpÁ7d–» é� 눸q9¼&?YVò%µŽ=Ì7µË3õEʼÔ1V#•ÞÒ¼]UTÈ›EßI¿-{xÂØAÖ Uµ¢�Ò:ÞZÙKm}l•¯ž x÷§M°["K Å#[|â'F˜ÜW|°ÛZ$²…‹4îejb·72):Õ ‰�¬íÚ�U ¬wFp¥™C„£·qìHŽ,(êíCjý0Gy¹æº¡9B�<nÂy‚ó ¤ãÓZûÁ[ÏŽÏ]Ô¾oL ÃGŒìwu±, 6SQi«íÂÞ’ž%š/ÅŠ*móF¾ã i¾ËÆkmng™Ê½}¼+8Ò¤°¬t12a&bÌÌÖzµÉصÈÈñ£—ÌÀÆ› ó’07x¦t�åéCŽ+¾§ŠP}Ð ÜxµB,féÚ˦7“¨d•+¯œ¾ÅÀNÄlõ ’êa¾&S¾n‹%m½6¥?lŒ7XvòuxƒÈíR@o_ Ë5Ä:�Þ·:«=™YËÓ~ U­4‘Mðè·®½¨¨7”Ös’Ñ“¡;IÀÈíæ\cG:^› ÊóÃÀÐî|E£›¬gQC}µ³» oDÈŒHˆW% ¢ìѤSe…Sh^®ÅûLèÔ•¦>Ú':dwZòŽ]5H\Ð¥Ù=»ÇV™KxÈ]¢ËªU§3)˜1«ÃA1¢W¶[®åäï’ ðͼ0lu �'[k,£U¢Q¾ZË Ežä¥à»»Àò…Û\¼·z(ª³jàTgÕ—{ƒŒ« кn�¥nÆàÃÒB3φf °ûCgQ5­½5‘_z•e«Ú̘vv„Ý� ³.sª³;7HÝÊVhVÊ«ˆü¥íqùÖ ÝT­öÝɹq6m�²$U„eZ6Ü^É�:Ò–µq›àέÛД÷H™0ÃhÅÒókN!ÐM‚¸Œ¹™yµ8Î8v£¡ZZ5ªîÁ•Ø7(í½�ïmR4NC°pì¹y�ØæÞßoyX˜»‚Ï&øGÙµ“sGÍàÙ>–¾árÖ}];�n‡a¸µïnpÚt4íqÕ{ÜØ®¿…A¢w^R³wj½�9QÙ¶©N†Ê¡š:盾äir³C2UË»äëÛ2^­kA9z Py^Ï;oe+ð…Ö¦òuÌL‹5‘” Bí‡CCuèw··N›fd¾Ù†Ãçº÷x׫SK™•Y®Ê<´už™S˜ÞsGDS•„ƒ®ï°Q8Ô«Í5»Ã´*ìÉCªq¿Qomó^Dd½¨Ÿ¶¥iŒwNËäÝ'F-›ºàl¹ëÛº±Hù<¬\ÏQ“†\›c š6•X#°À512êöúur›˜i:ÀxFÌØ) É€�à1M5Íêî V”¸ák®Ó®œGe–w\1³uÑ…yn—aõÐ#d8×M;®«Ð’ ÐÔ¬fFû1eUDµôÂ%]_lª ú£Í•ÎdÍXEó±YpU‰™Ø q{A‡Ÿ2º¼«ÕºÄ¬AðμÕÂãÁÇhW+«ö�yÃ,oVra’$JÛ–-¡2´W†gÖ9‘ßn}‚žv?²ÈؼÖzóž¬9�æÖ?`•^š£Pà"Gu0–·ˆWºÈbŒX8Võ v[û…µ*ç:w^|¢¡fôéÊz·Úkž>¬‰På"v¿m›ªÅ‚2{K8­{t`mû½nmñaJöܺ÷yîÝÐÍ5Î%0Õn·+o;´ܳçFôìg­>–·9yMÚ•7KaZ|3¢T–Wu‡›—òÎ?6¢c» ®¡jÎ��;¯¹¤˜Æ)Vuñ¹Š(ë¥^SQZ¡{ªÏ_¦`Lìi­©·Õycrz®ð9·sH 6#­ÙFýcp`|éÍ•`ŽÎ¶ë¸mÖ›»QN°¯»,¦u…l¡žV0rËN®·—µ,e[ÐföSÂÞÚOV] v3z…ï d¸Õè¹\(t˜œ¨xRë±°S›™ËzŠp^Ñ6o†ÕÜ9 :mVÛLûK¯0rú« ÙN·„Ì ÔBvÆYê¯ök³-È´-¥g[òƒˆ«êªÌ¼9Ì›yx‡=Ú>Cr‡M{ÆöÜZ¥ï¹pÛVýÚŸ1wvºîÇcj€ïª´ÍÎÂ3j}‡ÜGnëጪi}u8r9ùýà=ä’/ýMu=7ž ¶ê·þZoë·;pãßo;iÛ~Ÿg1:QŸ³ŸÝ�¨C�ÿ¾oÿÝßYî~8�Ñ:þï{ÎDBF3µ|Ëâ]ÒÁøé6uÀÿÿìÇ]µîz€áŒ©éÇ¿«°¥ë¾ò÷™”k¥ÜƒÝpé~îïÜKŸÂÖ?©�7—]Íõi‚ƒJ÷W~BªÅé3-é?9ëÏFðöº·„¦çýâ”Ð,N¬ï»4·ºP˜yLUXÜçß`Ô†Õ.�ƒwnÞ71o[C?ÿ ]£a+I$±Çg?mBž%˜U0ùZ±õ"Ús¿;uèÚô\ßyÏŸ¾õjlÓíßZÜ�?ÌŽïvÝ÷ãGãûx Ë�®Ö{/á=T^0{úªðß]gÔJËOÇ3ªrF”þmK¡)WrÛÛ]¦ú|Äç�Ÿ¦GÑX·ä™M9îëû92œ …TNxuÍ(ʵò‘te ú ÷s"¼º èBe!nLV¦:¹ÇÛv›HŒ¡ùJÑî¦ýå^«å9›�#Äÿ¾ûuã×_/Ós³ ‘ïÚ{¶¤{}ÜqS¿æÿ:ôá)ŸtÚZéøî¬€�.±£Xç¥�—ÝÛmàm´®5ÙO ?ÌÍ�W!¨�úKÂ?Yì«s¢Ã· U�O÷|·«Ã;ôça@ø<ó� öêõÓB âŸPQ­~æ]}ʾ|Þœ·¿¾ÓIKÝuÔsëñöà»kóîj¸! *óÚHÊ_±‰Å W˜Ã.|hvlãÛ�Ø$ï7�‹Á•^IŽ?uûáñzÑ'J=í8M΋ƒna’…­–Qb.àŽÒ97»é68?ü4C_o‘†˜š‹#µDBv…pw2Õ¬°105ýp6Ùÿ‚„$’ÖO?áüdþ¸íoϾ¸Ÿ82ýüÈᎲµjб¬Ñw<í寙æy°9£T�¸ê¨²ó†ò~Tá½\wå×þ���/AI$’ëöyÀ­˜s<|›4�³‰Ç^rµ¤0»Ç ꌩ# Áz9.ÇqzCr‘ƒ@–eAk¨$„ƒ¨€B Ë>JûSå–ºàȈ¯õYV]˜rŠšrÛû‰ÄaÚºqYR@¹)IE”ÛZ X.2 ¹±¥¨º•$$�€@$$ƒïmùÝ„-[´ŽÑøïx³»RØÿÌ·”xÞ.¢!¸ˆcæzc˜“@Æ¥±Àje.’‘M%Óˆ‚h$OB 56ðXÍÙkµÎ€’c©cXÔµ¨‚ðÁÞþÅÇv2¿…®”‹KÕ¦‡�ÿ×ûªÖ‰­h�«ûdäõÜêmÏ,M¶”€ñÔ?hQ)\e¶,”R±I±Ù"l›M¶Õs‹¢2\¸Yëe~À’ ñȃœD³¯ÕË{ÛµäÉël:k-ÇLÞ±?Y¾;ô$È—Õi;2ɘÜÐmJAf&û5~¨H@ƒc†ðƒOäÊS}8QeË3ä̶þµÂ¬{mfËcï ö\—3ª0R”§CFà2ƒ�T„kÄLÅÚ<=‰îB€ù��·ïÃR^¯«G6S³så‚÷Æ1Á*Í0è¸tH ²Ð)I"U=®8²Î¯X.ë%ˆWzèCzÌÊŠh@Š"B|&V¹ZÏœz›wŽÍêÝ*›Qx¼�‹@Vnlcd€ŸÚNMr‡úÚLº)9­Ã>‘³\@–u²WM.Âi<‹K[“ä$]hBH<2�—?­‹ª“à†€ÓϘêÐ Aa{ÝigÄ˧ùNê炃}VÆíj…i–ШB F$³{|Õg‰ä€àÓLØÒ¨±~Hì}êPv0äˆGCbæ ž¤Ä�+ B`�|ýîîþD I%ó•2C œ|+$mÐ.!¼¹k~Àn'ûpß÷¸óÓ'‡àÖã¾—Žþ?¿J'ŸÊÏ&ßgõ߉_U}?Öò…<õ1Ûy"Cûö>‹·Ïük¢àçqÏ’ì+Ù{~GŸÈ3h¡ŸÈýÏK û¾üÆ›ýÚk ëò7Ã}tƒ}û�¾ pž±Kmü‹yÔ ;—¯(�é@�Ý®ØHb˜æãcAvêé?ܬ—¯ço£´…¹&ß™k×É�Õ[¼GKW‰ºòߟüÆÀo®Ý6¯†³~{7ì¶ü§÷ëÓ|ñû°ëSùàsßõ²þ�±ßO½Ú˜�ÜÍ;î°þö>¿Äßìv“ºSIø¾kLýoZ]¡�ƒ÷�ãìâ—OW Ì{*Zûu«h÷uçƒ_ž!“Ȭ³Òr æÐVµ!–·Î4&ê¥>Á;XGóÅ�¯ÒN÷ð”íR^±ëÞãe·ê6>¾:žýð�åÿ½þÑ�ë>g¡ÁWgÃÇIù—žï¶¿º‹ÿO÷ÜÞªê¹ßOØnÚüoN=e;üóáoùo©á !ß¿x†Ì:~:r/“Ü}q¡®{;‚|F¾Dk}±ø¿{Ùü\øÊϯ®J}"VZCèïóÒ4Êëm·ý‹Ë">ø_Eó,~õOÞ8´öò�ðÎÞîO�®–Þ&+?Ê-­ïá½6Øh~ÞÈÉ.Á[aûˆ>Î9~tø»nRÝí� e_"·�=+«'~ì­Èžø?v·Y[›2›@ÒgS®í÷�óÏã±±²2tø rqP”¡[ýL×ã#µ=¥KcC=ÖËsBCcדˈ� Ä\õÛ„Ì@¡‚øD@ 57Ðl{Ân´ÖÕ=ÍLf¢bÌ›2.Z?jhéhµ‹RĽÃD˜*„$á@S+‘«„4µ��µ��zà)ìd;hKAAv�¿`ãìàÑãâ:æaè09loŽd*”*ΘÒöÂ˰“i mÊh†ƒü€B õßViâOg½”C‰Q»þ ª ƒ&Z‚Ї�½NŽ­~ÏGYk„Áí®pÍõ۬ÑUyëÔÙ&0æÐÅɤ*b\4º!É0³clE�2H!ƒNæÞ„Rl‘k @p@Vø¿^T”y ÿ\8˜ŸáSÀ•ò± k­fã ,­9"ÁöALrpiÒhH`’ä%*aÙ(Iòm„:iBd®±$2-yʯ*^/%tÚLݺöUi$@Ò)}øt‡²ÙÀöqqóÊ'¬Íèj˜…ÇØbM0Lje¶·T­·]R¤xêíëùQ<µyW–ZlÙ6C¡—¥í¢Õa„ Œ0.褴ˆFüÁ$$ |:¾3üÍ}âÓ«í§çkÖñ‹äùB–ϪÊ5¤Z™“xTÀ`fF€6ŒDÚºA7Ò€ˆàq²SÓb.Œù�²©Of²âîÎyxåk^ %›Þ*<æ ïÊŽ6­h–þ¥¬6mˆ)í˜5Ùñ@q\q#ê𨣭(Ð!,.‡�†žGƒ:õ· oÃ̘±o€äV¾Æj‹!hŒÁƒ@>‡â‡&Š2˜E…ê}HH/û7—Ç:MX»*ªœr·/^€¶€B[�’¸’Ô^Ý+„¡½×9¸£Rá­Ð��,€’¡êÁú„»Bº.§îÈùÉú.Á Û‘¦C>!Œ6�ËU+XŒ¨ö)”{áeÉFŒhåò£uËŠ1À@¹ß„ZöqkxxBI$—÷±êaýkóËóàå,cÓ}s•ñoû(6îð·‘oÏ?šïÐcü\Ž#ÑÎñÌ;v qž>{ßBZø’õÇö[ò½“×i;{u/vŒ:¼´žüì‡÷·ŸÆ±ž;”½~Ò”{›‚p‹¦-§?ŽÃjïEÛ”…(žÊsýõ—êYéÀ¿§B½>­ãn=÷ûg¿•¯ËÒŽ=¡úìîÿÛg'×ï¬úCrðý¤Ñ«Ù¼¸Gxù˲¤Q×™ºß¼òL!1$ë9Ùù{·çgm }ô(ëemðoÅeÏCÏw+»¤KÏ�]öÆþaÀ6"A{?]-¼6~¤“¦ûŸ ý3–‘±ý¢&´ºÇ‡��¹X¹àÄáàÕ÷ ïµbüôù!µ£¦HßûhÇoÚË;D·G;ßéû’_ç]yÛ‚vsŽs®õæ-†!º¹o�ÞnÏO%ÀZŸÝœuð�Ðkœ½ôزXø…>sñ0ûC³„祡ÆWÉFºÄtNiûœ¿�QØN‡ÉÁ2ØãÉ‹ïï~Æ«n«j  X¾á·íS ”LKM½l'âþ™î+Þ‚#;;�[G®Ï.”_§°o^¿RSàQR#‹—n{JñúXÉõÜuüЗP�†œQöZó˜ÂotóÕ"£eß ñû>~šBÞ·§Gqwn¡Ý¸¤~V�ﳓŸ]‘ºïñOç‡Td…·¾áIúßÅt†ù‡kíW•ߣ¶]ýÞ!³É|*̶ Ë?-o~½ß·^çp†Ê§µê÷V¶w©’xýp½ÙcCĦ\–{�=ø@Cm!´²—,v![LÆ¡›¶'’°Ùæ qÞó›²6¹þZ®jÁ’­ŠüÏç˜�_Q½V¸šn¢lÈK*åÕÑÈ3†BÌÂÀÆ0H½�¬)ĆV�e†8�”Ìz³DÖáE‘±k©¹s%£L(΄¤Õádh�ã)tæqÁ`bÕ™T ƒé¹@L«$J³NðBÚ¸zÚUbÓÖÆü,ñ‹4dý�,aË5cøú¯‹/¿]'ž‘ƒx\&ÅœOx+ƒQØ.vl`ÇK±u$"ßhf—q‘��#BGð„�i¿ÞÐLøI u-—�¨:0ÌØçž7¦´áC$f?#ž·Þ¯$7Þ ^[Ñͪ"Α¨9 `\ˆƒ÷!FUì'q�!+ »=ãÂ+FìÍ#gŠWå$æÍßD›%QÖqQ‰††;&¦™³0C̺ÃwRxé¯�°ä5dèâZ:›ÁW"Ê,æjqÄ&Âè6À@`à™Oï„Ç̪ÑüDgf6ˆ“mb¥¸âêBí�Hˆ'ú!&Î̱g@«¢j  ® �Ô9¸ƒšI˜»tYq1€¹„;˜a‚$RÐÖaQoåpŸ·ƒ}a%xÈów>3Gd�²“»íÙ´r|êpè³2À‚K¨R)ß7�†¿]ô¾óÛ+8D ÝTìLFÀu-ºKRÆå?®»À.Õ­ÇàÀ+½5®Ñ¥ž‘,Yf—‚@’‘¹Ð!©ÀK˜ã*£*Ó"ˆ÷G�c‚)QªbÔBA( °�Çn¾�mæÃ±àÌ#,xŒÔÙ#ÒÇ ‘–3˜[rÞâÃþïÌֱ—EDvçr´tH¡~ àn�lÑ®ý.=àœûñ ØVÅo³ã7Z}ó._ Ó<ƒé0@Çà¼<Äz ê$„„Ä Œ„Æ03¿“_EÛùpØUÍÏ®­¿Í¸Í7æÙ/í~Ú—¿"^Ë',,gÖX¸’ó>#?–ìUà¡ârõ5Æ:Òtxs§ø‚ÞqÛÛHp[BüÜNK�`?�ƒ9õjïO<â)ﯴ§E?t—}.<ò{5½;Žú”¹'D++Ì;OÛßð�¡ß±ãíFn–4ïÓÔvÿ‡è¢¼ïïÏ~!ë !ÖÔ‘G»÷UÈüˆµgW޽?» úõÛú~'^˜!Û{¿Ú\¥š°wεó͸„ Š4£„úùÀsû¸oG“z?­¸´Ï 覅Q4{¼º�õ Ê-Ö=Xtt9x¯VÒ~¼,ýŸzêíùŽØòGüº¢™ã·ëóçç÷hÖWðVäÂs´xÇ$ÀØF¿já›$ÉBx&t«{[Ï^7gðÞèý-÷1Í{� ³�é);œþWÏev+OÝ·Vý�éó§¹þ·~¦Ìªi²“ßùâøÅ¸Jös?cgsv�Ca2{ù‘¹Â“L ºKuœü¦Þ U¨$gfvK×ÐÕúRí\å´úe˵�o^Ò.‡�Þ©M#G<Ás7t‰³ó®Ï‚tÙ;IݾœëÔ€Ÿú K¨œ{P}üíµ!ñ4?B÷ŸM•¿ªñ¶õ‡®è^þçç§æ©ñ¾õâì wÚ'ù±Œ¯çª;ßÄ7ã§47[¿[øû¶áë°>„Þ»­Tuâ{‡×•’mB'œRdq82=iƯúŽ!ÇÙÖϪö媺£ûzÈiGŽ&'·ŠGh™Ik '°o–üŒ-_ÎéØ':íÞ�÷÷á$ÏjD'öîÖ³—áEÝÎÝ=•£JÑ?p“Î/æoçs+™v²Ï§Y¼¦Ç?aë>>ÚI*ªðRéŽ9Ë¥½>CÈÉYíЃʡ*uŸi>´…û“Á¬GäœöXô´ÌyÇÓ2 +&ÉÏ� DвÀ0Ñ&ÚÞö¤gT“`mÎ~Ÿïê$G…O“?×âj]ìdv "‚\F&ÙÁ+@”Úllj—'è|94æÜà¢Âœ#úHHXç|ôãוÇâÌe¼ %¡úÉ‘OX�K÷¶g³ù€Œõþr úwÓ£FÍØ¹RFP&— ²hkºÆ8êC6p›>þcâ”0ÇÌ2»©ªßçµgÓ�èÔ2ÑS2_+¢æGbDC0û8c…€kÎ0)«?6cj›—X.0òš¨.÷ÄÎÓ}íûƒ;xΗ8í¨ïhÌĵ[/û'–yH_ FÅ5c7Ý`"&ýü¼Mì�äÅs»ê‘’ŠáÙçkû硲@ÛM0¾ HÓL ±_ K± Ó€NB\yºU”kžà’—7�^Í¿˜�ÿÒÛ üõµØ ·_Ç9|çp­c± €$€±†'™DTÈä¡#‹©ìá�н!7‘_ÏÉ4Øå]È S&‹!$™ý˜å'Oô×þ\ã°·$U‰þZÅÌôc&3T.Cá{ÐÛ±lÓ¡šH8´ÚT©#`ç|$J«x‚HH]†y5†]ÃE9igù?´¡¢ÏÙ†f�Eƒ‘`% dÁ®ç˜Õ…ÎíÃ%tKæ@ðL°®H í[WLÆbœ>““N`JECQl(Kõ1 ‡5¶¶u~\¤ú›òBpDbÇ\¤I{e-–ÛéOz!]�~rÜa¢BÂ�‘�@Ò!¤·|Ÿšµã?#L ¤’8«1”‰r§ÞÁÁ,£ó ã:ßR>Éîbþ¨â{ïOQò|Ö“yåQ¶ø™ó×8Ú¼�¯´ Ø®OS¡Ìà°u¸p’pƒd!ZưQÍ~fÚœ…•`ÛRÿ‚É£! >ͯ~}—¨/A÷õëõž}÷ùø·¯Gòþ?KÓÓáõʻ|î!9ç��²›gÖ›ÑçmÁuïÛŽÒþ¿o›çÛÔ;ùìeów?³ã3ùæÕßrëýk»{Ÿ¡I—™¶¾sÏnöõ0—�¬žxìßa¡½¾ÊÅ¿–¶Âÿ%è±…‡><ïï°Çà„¢]uÏ„¶ÜzM_yñ-˜·õÑÒ¯PÝb0·+åÓ§³âæQÌN�Äþ~¯Yp|~5 9Û¾UÇÒhîF~Z»kk ýÔT†³›ÕŸ[H€ù¡·Ï³¨-hîoú­§Îß´!Dô{8ú{®a§çÝó¾Š;ë=ãù÷Ïhvï¸×aÐaþÉ~�‹˜ÏÊ~gyˆ2É¿áüWÉŽüvü1žî³ û]û"~»~‡w•9®«òaý¼óøý¡^Öñ ]ûþ:|Íî²C5ùÛ ü±xǻ믅Ҡ¬>I6߸ᱷ>=}{Œl»Â4s+í«ëæ¸ñï¿Ï-�‹ï�Ç9Ç™ù×{sù¿<^ƒ×Küùè9¿ž~¾Üóó¦wßðç´6í¼tØþhȆÑ9]úK^�”KÔjémûLvý¢³ƒ‚uvÏÛ{w÷o¶g;ƒiŠ\¼Ä>BŽ5ÔQBÈæƒŠ£¼õéÕ¿< ÃöM'^½íÎȹ¬å‹Ã²ŸÒ<\{׿ø‹§èÿ}>Ÿ¶¯‰ iL&ÿ‘.ŽƒB˜àŸ%õÁݶ·Öm�%g•ûNÞûJ£»‡áµwGš�Úû~œcÓ§»U¥úVJ¶hö™7Õ d8##É ´ˆPMw—¨†óIìîHI…{[ÄáÞ-{æ*¾ñg�|q±}ç5Š>hÏ3A_�‰B“í‹Îw”‘c}5{Ð*%ÕG<ÐDû¾r‘d�Š^o¯ s)tärZZRëË®“¸D ,°ì8AaŽðtJI��®bz7¬©q®Õ{à(¨p""âZ–ÝÂ�HôP‹ÕÌš9w19™lã�ÿÁpd 7%@'$Y5Ã7rµ³¡Z�®]xÊ Œ$3-±ŒD*k„‚îûbü³±ÇI-לë_¶'ùcÑí¡l‘Là½�KSjfúÍšìÒ·{${ ƒÏ–¼"3ãÊÜí»Þö ·Ï+ß5ËŽÆú¼ñ膤b„j²Óh 1ÒÄNF‘b™O0I Ý­˜52¹-&:ïaæ9^ýæ%öÃn}=¦7OQÊM®ì'E¾ wE®ß �¯h\¶‡‰Bü‹†ô7F®@� ‹ùqg|p‘ÁÊ%êõ÷‹5|SO„7‰Ûaû1ѹ YÜ»:KÊø]Å%ø#ë«�.3H�é|»ê?‰ezçï2KÆ{x^Ÿ¿*Rk«g±lê ~ŽŸ~:Ÿ/VÆCPr³ §£zœ7÷&xû:CmœrOÅ�|éÒVHoêú'½Æ¶z4QáÓµ8ã¬\?/‹ZgÔ�Ð×ÌÝðò6ýJÊ=»ÏÙc߼뿷[¿×¡|hp±.Ï÷Àü¢ñ²íÈ{zü‡I�+tk¸ÁGçÜG¸˜öž�×§nS¹gmÓkÈòÜ]Èý‡ŸHŠ—$×ÚC¥ _O�Wz­õÁømq>´Úi£ÄÚî½Z¶­FÔ°@¶ †8iÓ˜vª\µ‘Øe ‚‘—¢;„„!u×p¢‚‘*·jK^X‘&ûúã׃Ws‚ôÔ½De¢*í6Ut08 rX�w#Kôi`½5!aÀš"ÐR‘B "±3P |:ˆ")½ãü;›£Ü| ¬#Û\^ï ßHÖ~ã–»w¾�?I-’�ëJä°’¸Øs^…€(c6q,+©–�Æ‘,c›™H)_ ’Âl¿‚3>þñØ’xoãRïá\ùE.WáŸ'Óë7¬Ï,k~·ßª¿jAZ½tK› ¤Ù.÷Wæe)ŒÐá&()læn¦Ð¶FÌÐaN¨¢ıKMŸçÏkKW}ý�) ,AwÖ`:=­Ùläè.\Éí]K óC™JpÒüˆ{¡Ù,86"T fÔiWg¦˃Gö?ÜÑ”2E±ò?SºV\»,rfB x‰[«ð´—»«N7Ž;—¥aD6š²ê4°@ZŽŒá´b9†Ž˜Aª4H5La=݇¿þ>ú6çSÛ�Ÿ¤Ù�lˆAƒ q¶ àÔ­Qdêæp€hÉHÀXjÖìB/±™Ò)ATî>YfŸùÊZ»£óÌöyk´hÎø13ᤙ–ØÞ æÍnqÁ&©Ë#BåabK"ܦ-ÿàe_m,ÚɸbVÎ¥(âÛ¼m}0cPàca Q~tù2¸ ‘ƒµ*[¼–Â#Ræ1ŽD~@óßÞ/Ô~Nvc IrépËq¤ãq¬OÏG ’&�Ðø£–}DrÐBA`I I žXÍRÕÆ%÷sèùXXç9ì$—¨Ð‚( vr˜Ø$J‚ÿ(÷Š_(÷#ÐÌú#/Ä(hIìÒH¤˜æÒI|ºN¯e0$Ȉ÷¤u¸gUgpÆ0—¯Å¥çÌúd¼wñž:…|a(î¶Dìû_ÏdéN9øÆ�–¡Åý6�òßÃLêÏÎðƒ„çES9o§ž9” ~ ºÓjŸäá;÷¥KlºnÎ[݇LwƒÉ±hHÒð¯UÎ1ÞB™C.Àë½!ˆSÁ3‰zëÅØâŸŠÖݸ*»1¨¤¾5¡«•æÖ”¾~öïÓk÷·ž–íÖ?oÇxñÒ®ùJô8òMÍo��k²¦ï¶²!·—7Y,9>:¯wfÄ{ÍâË5û5µ¯ó p{WŽzûóFòo”騡®+YVõ¿%(;SÈã=t}åyï¾ûs׊.ý*Ý~úÌj(þzn#6ç®ÅM°Òëw‚ð*¸¸z»¤w\š3ÆVQç~Ÿ:gÇÞ/ú{Œ—aÍãù¾‹æã¹r'¾;¦‡½µ ×®¥ó‹óä#…:m¶u}áÂâ]ßp÷;©®üÈ—ß¼ËÁog>–È¢FÔé|@îØðœÃî¾ôïÃ^a6üÂ×ãÆ)(Ãþùï¼ö¬ýÞü‡ÓUûIÝC—òOêW¸…‹hn<‡ò=Ž!>ŽºûÇàw,~;ôµ­´›I—t©×ú�4º®Ýs{ y‡O�û„óX{[Ô­½D¥·jEa·xÇ¿ïcôÒå*°Îõäh®7{e¯?ˆ£>ÝÆ=ÕÑÚæ�M>aÝzxìŒÙ°óv§A·pìî¿•s¹oç¾µÏ^—øÑµ?%ÎóÇžœÙÑÚß„ƒm¿¾ú'I«$ŸÂç.°þþ† [ÿG]?CŽûى׵B…ÒrÑÜO=…ëxÿkßï~iÛáX°2¤®›P˜q¦wˆ˜àùÑÚ1[š Š�†×ùe‹î1‰°%H–› !PÄÚ@1­SG?`¥&Ê^ª%+$;¿±1-úry)÷E’({™q–ÑC$ K~ˆÕ�*�<’ÔrÀÜÑàCKJf¾3U󧾤A1o·¶-6QNïÜ4ÂÙn"RR( â‰B-†(o- jÂR "¦@ uŸ^9šOŸÔ|4‘¶óã�ØØ;ð¶0óÓh¥¥=á¹åÈó{7À2‰ÛM�…!*qG�ê†|¢ ö¼9:í1Qó™ìÄɳ<Ú—¯#‘sû*ni[gO8- �Îo÷9©¨sÖ å®ˆôãÇìÖ}X\˜|p=µaVµºQH§k1’<*‡Ì*‘ÄÉ § ì·!>ÁAúÀ‡¼²¼‚ûÕôð9ïxüígXv8 Ô?Á�˜(ÿ£|!ÚzŒÌ3læ¤f¢BÃICF¾&9¶Q²¼\˜a¦°KG’… šØÇ¦sÎ-íSû1:ë<æ0ç5ëc€”%ÈgS4$Z9¢ÐÜ'¶eY¢!vi€G5ßˉQC³Ý*O±ŸxÁ¡é$‰šœé€ƒ P4£”4Ù €áÆå†×FCjÈ犸qH9¥¢ ó”`Öj5.Q Ä{&u‚;9¹ ¢¡ ó* þ±—½å%d"ɪcN‘Ì!@JT èÃsX$WC,¡C›D„6Ä"˜·kI–IChMX `¿Í·Éæ4½RWb¼ÀÝ»v¹xmx’ZxÌÖø*øýû«zYŸÉRô‘&�µ¤À4†1 ªï¼¥ù Î,h8®*�8JI¡¤ÄÓ.0È«ÁàÆ1€sÀ¿ŠŒW¯¯©øpÁÁ| öÙSVλ‘“ÝÖBš÷yvöúà7óiÖ•ïøéËá·©™XÚo,}t1¯>ÎFAV¿«müêÄ_pË96ë§UÌ—Ê›X<‡½lÖ¢Ô›nÇ>Å]V’-‡qóÓ¼ö«h=ó°ã&ØþçM÷‡ ÷4ï6z辎ÔÒ6"žV±Q¼«ãzwÇâ|Ù´îqo[ k´Ëö7'sÉÔB#s„΃^]ŒNüølõ=cÖöóϲ{øÙ!~�~ß½õúìgØì–Ü>ñK?PŒåàÆÚÞÚûË^3![x"I¯oãnýP®½ñn/_^¶ž¾øØ¼Ô5^{¾è1.™�TŠ2—ͼ6”.`Ë«Åg®�äú}‡kwªî+Ö¿¼~”7žÛ1¯•ÓƒÜkmÈ6Àˆ"$ãèí\ïêædä†S×.¶W̹|÷BK|Ó»·…–|ÇÏEõÎIÈìÚuFy#6¯N®û¯²w�Ý&Ó¯ï|x[žÕÚY·3®¹ê÷üóŽÕ óÖ¢Nñ¬�>ø_tñ�±' ü�_×Ê%TIìîë·~²¡´ƒÝ}Ž<ù/\Þ*&ZñO]._ü7ë¾Ê~¯ó~ßÛÏ�3Ý­ê;�®ÛK®Òüy‹þºàßêûkf¯}{ª=Þ7ëª<Úãמ‰µ%×í06ˆëï;»ñä>•zFÄ‘ŸIR-é0}HDÇ+œwñ+ò�4ù%Üå…½óÀv„!Kí/h�?9‹gŠU¾wÿ5 ¨ö€Ñ|O§n´saž§©Ÿsòsn�ú+IÂVÎi��Óù{Í™)Ý‘ã×z(Ue…š½LÃJF¢"šW˜M"ñx” žn"ê„¥5–9±¡ ]ub•B’…“ÀD™g:€³Y~W±?�†7ô¼M¾êXfʃ€¸škO % ¿æ1‰Át'7ßÓ…'Íç¾YïúÐ�4J~ ãhg9e‚ä%0{”•íW%¯V¼Š(‡ŒQäÊkÒ &¿eZÐ>H¹h46¹õã)IT®êT×~G¶öðœVäG-gSHÃ“áÆ¨¶¾[ “r†y'°}¸ZÒX ƒ¶2;$†äʇ1Ùñ´ã9Úî4«GXÑf/¡Ÿâƒ‰ )!� âÀ#€80»�4ÂòÔ ‘�ºB"·Ù쎊Ã0âùQÑŽ^�"¡ð|5&äz"¿Œ±C–¹ó<‚6:°åß�«A9 ”|³^̯=$˜q׺ –Á–”5hi® >5Æ£ÃI4ÄPÌZؼ&.V¢¼4yL/«cn!W}Ý!*Tž�¤—™ "O¦‹3ìÚ¶Œš<×ÿ Ò*ßšK�ŸÔ‹æÃ9ë ƒ€A ·É–ß�ÙD”D±ßÂ2$���˜�$.FŸ%Ð õ þYØ!xöëkÛ¨³2“R²ÒÊ”¡JSf‹!j¯'§»Îñ¨¯¼Ð¥ %bÕCË9Î>ÀÓׂ;î;ê+žH@‹+U¥à†šäС 4À’ cm lÀM#˜$„…¶Þž¿�…íçŸ.§§JO�áä¾ô΢Aïîçwù…DÓß;¬º³:Ž—ï©dyì�4û¯8‹ˆrüe{õònããŒtïå|«gÒ3µ×z3Fç¯S—ßpï°x¨ó×�»^c‹ôòÍw/µ^uL| öA"Ž~¼~öüã¦óÛŠã®b>~JEã¦ý·Ç^¾z…!ôç\ÛnÓü¥goÇzÅ=õé¶4ξݷ£:+ñþÓÇ?ZÚ;fí–ó©ü¡öùm_ßÙÖ»0$;öýðw,GRoÓæ‰ï­�öÆ‚$Úw¿—¾®ñ瞥�mç÷¦�ÿ| ÖÕU›ƒ£óŒôg_~yã¡uíZº£lýÏŽŽO\c©N�eÂK-Û}v°ÏoC÷;âöÝ÷¢;b.Š·×^z°·¾ Iv¾»zn<|°_߉�‹é8êyôánº¶‡j{}ÊK¶+ÃýjÍ ÙÍhŽDZà�Ͻz°Íõyã îÜ–¾ø†¬]ºM™o|Œkq¥›ëYµ½þ ãSëX—®”³¬=!×ðP†�ÄïM25|Äf#6Œ)g¿€Ø·î–ÄB‚åî õLjàèýƒ*ÿ {]Ó“ïºu_ç_êc„:"ÒΆ1ê§+tGÓÁ±H…v‹0ã'°…ëbÊËOÕ[W¸Ê[þ¢vTþÈð_e’Oþ_vqCcuÅÈj\g"<ʬ+tÞ3´2ñ9¶ž8�_';§̰fË�DJ±HÝGmaø‰%ØM-sŽPµs‡DEHDåM²Sã‚X¿žP€Àæsþ8qÉì¿Ù+ÑnèíìvëE�9¤ #©![Ç:ZhW?¦»ëèÔ¬8ªé˜â¿˜Bf´¦«ãà¥øáP7:ĤòCë†ù‰ `ƒî7¢¥Ã"Žh ä ! ¼ã‡6h !u6‘I…߲䄑潾@<–ѰæH`A»ìBDiwzHJt�)HJ6HA–Zû$ ¸xùx�hÄpíåoõóéÃL~³*sÞ×ß›ûñ™ßºwk»S,EÝ�#‘jîîò¡t”* ï6)‘aGW! £›÷Ç��¢GÛpúBAfþ‘¼¢åù§Ç ’Þ­Uw:#…m-J�Ôq ÄA šDw�µ£ûîc„œÖÝ8hÄ&Ë÷¯_Ùhs §6¸ú r=ØÚ–Ë_d¾z�5Û¿¯ˆõŒž1Œ±Ek µíæ~’Mlf j/Ã!7èU¨Ÿ[BŒ›k°µåÏíÌVF�]Q­¸Æ§J#œ}i7��u8Þæj.ÙêTƒñ§ÉÅßΖ“óÖ“Ø<'}]½§¥Ææ£aµQO|~Ç-µ\óX+5Æß±‘SrøNãÆwgÌ]ð#Hs×ä}ã¡r]w¯˜uý·�¤n¿�dæØM¸smÜS¸- Б+Mý7Ÿ_a�e/#‰€¥;·˜‰ÉŠ|~¤‰ì?Ó{qj·ç¢6œÖ’.¶áN}¥¦°=~ÇKÚ“‹Ä¾k!»$²Fš³ìNßìgÚtzÃÈ­>_ö _{Þ ç³<á£â;nEص=“¾cúÃ`7’§¿#¦?aÃMí½ÈùÒÕ§—8¾$ïÈkôzªúSÙKâj³ç.Í�=�gœvÄîÚïÇ7´~K/IIÞzù¿Ú_imLè§Rúè\lšµEº_õ;δ‡W@`»Á_·¾šçW俨—gH¼ôøçë^x#Cì�šŠ¥J<ûèÛ›Ó…ë½²xEã�1ý :5 fê,ý«˜óê†d7¹Ú2&üÿO Û¨ƒÌb°Ñ?¸!|A ]epkÃcή±¥‰ÚÜyQv±k¬òÑQÖ(ó2‰�Á⩆_W§¡Xç¾úYeý}gÎûz=úâ—�~º�É ^CHu  S0x8#ƒIÀ”ªO‰ý/ÒÔÓÅ�Ù1±7HFª‚8,8‘Z§Çb“LRD’•¶Å@bÍÒm>âDµÐ%�<Þ&€ƒ Jw&NR $„�tÚÅÙõy,·˜·Lyͱy˜Qb—LÌG§)œoXD+ .ìR!$ðîHdV´Ÿ¥ok¾úJ×*�uCZW“Ó ‰cо¥-ñ åÙTÌ´Y—Ÿm'Ç5/!Á“r8Þ_{T¢ DÚ²ømƒ ÞP"Í D1�!¦›Cfˆ,&'žó3ÄC¢nÎ¥Ög~¾ÓXÉz¬•¥Zt[ù…¡f0�Ô4BìA+Å"„ÒI®DcYÃþ?ž‹HÒ31˜„µ p&.¢ô˜]ð޲�”3w” ½üпÕþ†"õj!µMϳ ÂCPÌ™Pá}WS–;ÙíùŸÝ #-¸1$-üДÞPÁÜÚEá|ü�_  �+ @IªÂ@΢ñ·è‚Æúè!f–�Cªl0¥-�®u<„� ÔBAæ!†„„�$$w��@$„…ä€B€’0ApI A$$`’7W›jB�™i±¦¦Ù”¬L¦$QµÅidË4Õ)I²ÔÖÑRT–É3l–E6†–Ff²l‘3 ¨ÛLR,Æ„"I–fŒQQFJÒÌi–f&-1MM$$¤ ,Ršc!EQI±lÙ� "ÚRѲ™š�j³Jijd¦Éµ+6SD˜*K4‹&���3�¥MF5&`–¥ QY I$•$¥F�Ši¥4)™jjkE“R™ 6•F£Y(É&Re)¥ Yf�fd¥SM1cS6™¦ÙT–Mª`Pš¬ %›f¢Æ%I5›3LÙ„‚)›e“j6$"Ä55›!™k55&CjQ¥�Ù•™°LЦLȦ˜¨YªCD“J#lÍ–YfiFL–²Jà Rši F¢ÔŒÉEM±¢Ë•i›&Œ4¨Ù5S6Í,¤TŠkJ� LÑ„´Z‘(�dA±ˆiŠT¤¦fÁEfl’iLše B2“cb“e›bbZÆFk™D6h )�±cjM†QS(©… Íe²‘Y-hJJScM²›HÍS52¦YLj¢¨Ñ("Æ*H¨´š™4šb�£)¶- &eRZ,4Š1’KS,’†�LÙ-fɦe2m™’E¢´Ì–,R͈Å(Õ#cJdÐËRj6M,ž¾MDB¦„¨¦*dÔiM±13²Š6� SihÄl�¤“2‰-I™“IY6e&„Ò™’–iJTÕM4ÓB cSHL[Lif&™¡”‘$"Q„Ô�R–¦QMQ¦²±M’lKɦLÙ61£X›Ji,©,h†Ø‚d–m–k(ШѠRI(Ð’ÃjM&%K)¨ÚYDcÍ„e,°¦–ŠTL‹dŠ‘™³hÒ£II‚ÄÔ¢4É@ÒK(fFL´´¦3FT£LBI2HKF“MX)dÖk)¦*[$˜ÔÉ¥PS6Í(©f4š(Í)ˆBR2Fe,¦�Ò™´ÛR•Œ›Ii–Òh ’I(-¬%’2b¬²Lš–fÂ"‚LšR­PLÛC#$±6ZfBÉI-%¢™¤�0RÒÄ¥¦”¤ÔÉE£&I¦a(1™‰)RÉš[d†c&©´²LÌ™fÌÄ�™4-‹e¦Êid²jÌM¦T%©S K4Ó`ÐÙlÙ6 ɱlÓ#I!L‘PQdc3LFZb³FÍ!³E*Sld¤¥YDÁcdÛ&’‰Y6�edÙ™%DÓ+RMa•%¦iI¦I”¢’L³&še¡–4cF4´µY25¥4¥³$Ú@Ôbš&A-E–K%¦¦Ð"3QcE’™QM”’ÌŠÓBM‹2‹2’¢D›&K%›&¤ÂÍFLЦjJZ5)¤’‚Œ˜E$¤FÄ’˜ÙJÆ¥%’L‹)+Å[[jëVÚÚh�ˆ@„"AtJ2BH, !!?T‘ÿ‰ BÏÀ˜è '³þ%üWiªï„ÅxÅD�½!ÞGÙbµ9IÊ2óšƒ,‚kªcÿYÿ«®È¹„ÿ½,Öžtó5“¹9i¾7XÊœ¡_ëâ¹|ui~§‡ôÑAgÁ½‹AàËrqCȇq prjÊ�·Š¶æ±-º²õ¶Jº¤iV"•2Ýñ·äWȺ•ËÓ…�Pò¬ÈìŽ<ÝYæ|ßAËFõÄCѰLL÷8½èQ¿¦¶‘„W ®b!dÅ{¡W£ç½W3b8㻸A�òce*ïJÉp—Æ’kt—\ñ•Vë$P ñ „.¬ÅP¯ ß ·¶ åDLµß.ÞÝYd#—q\P�$/f„€�/®¨õpùµÜ_l@…Å4úB&!HH©¼³øì~ù™%M B_?¯úðž}æÆØ¹s›»øyxî/Ȇ(Là_»9ÿ¿{×½|p‘¬„l$–ê�{ðð·„–€ð·ìN;=e.Gö ñKˆ¼Ñð͈õ�ìr•+µ@Ka–d__ž±nÞOkX§y_Î<®²¸­�.‡·›ó~÷�nìäßæÉfø–` í^¡¥í(¢°þ7–ÃùŒ`·ß©~­h™õCòðÚ¢|ôc´„ ^“ƒ¼©¾%‚§ÐÚÝk(•h“«ãs±œcw~ û‘—ÿk¨ 2 áZ†² +ßc2=ÆB‚ÇÝÎ,ñ0rôð qk®¥•8� a„$Ùä0ÃE8‘É>öIdBžpW»`ì‘�Ë,@=ÔЃ"`VGAw9£eêŠÄ^2][ÍÌ("änû¿Ð~=_ÀÙÃÛ–1sÊÕŒÔQJ`æb Êbo̱ò÷aÔÌ\>q)¿`Á'ã¥ÂE"ƒ-áÅ7{%)ôº/dìîg,0»@cXrů&3¢ÓÁĹF¶Xò¦$NöBb3J bŽj 5i×61°ˆ3 Ç}^Îüg½ <ÖöŸIŒÆ.�„‚ÚÊñÏ�«Ë]A#é÷P,˜ÿ&GXsãÍ�>óUß]ã}xÊÛ6>öf<VÅÉ;‚ Z2Ã,k¶�9óE‘H ã¦8ûλUçVÐr6V_¥sMÝZÂ/²€4²”Ž„À�X‘. pzŽ9ÝãA†u�k]ó�M±-Ñs¡Ë]:õ£ÎÓÚ3ºÒ°phA#ЕŒÞËE‘B­µ¨z‹Þ·x}ƒgpºlÍÜ¡"­äÝMŠŸ¼XX…K ÷ù~’`ãõâÀüÇÅ„F·²Ï_~²½ Ø—ÚlfRÁˆ;3,ði±7/;qÇË©ÄÂò§\Îç…ƒÐSÀ‚pnKààz|v@.L@6“3ªæµIX†ˆX®AÃFÊ#à8#k\)ãb´qôŠ6OÓ…¤K[ÊQ „$žq�ëºÊtȆ֟c;—Kp¶‹¢Kç®`OÅ[°�ì�$AIûHxxÚ@‡Á£¦Õ#0ͱÇXf+Ã�V¬ÖQ„5£ Ô¥�¿èãSC¢£µO5 áqÄÁÀn[pÓ›I,EsP©¥j\¼Û¥B22/•·F¶Ë6=#1”È;;h`M7¾ÉdeÛ5$r#î|F©-¤1É߬º™IÀ<ãÙs`ÍA©<àe£ìDA&˜ÕùòQV¯�7}�÷�W'x€Â;]Îè~zÈ3D1åÍ}ÓÍ'@�N™ý:o4…a�Úóc¸T+Í]G­:èœ�¶fò·³Ü™-ñò]z{E‘ÌåÀŃvýIžíŠùà ɤ›NÔˆt1ä+*À�/³ ËÅÞ&‰‹Iár ÖŸTwX¹¯ÿ’íõq’æjËê[½¤(¾t¢5N‰+ß[Vz”ÌB†í<ÓÝÛG¢{ä_Jxƒœ“ô¿qÙë58ºßÅRái öŠó×§•œ÷¬ÝÂZ§ÎwQªÓo¸ ›¯›ÚÎûv¹‡<¦h­ÿ�ñxî>±íÒR=X;Ý}œžƒ…¸Xj�ü?íQ¦à´M8,ùÚr蘃·ôâB‹ vmŸ88î0‰�‰ _%Ä~£Y0eå¹Ã'÷˜m ïÑ3iD™×™2®œp‹×¡`eb"ª [»µ6DÖ·¤‘ŽCáxD𮻀ãV<úä?9¤SH“à«(�ð'—}ù¼Åð‹áS}Åaº€TŒÜ¸µœº&ôö´°1Y; ˆFSQqkÙàÚ2Gå^‡¾k�L`¾û Ù[há…ˆ—8dÒ÷w.ö5L¿ÖüÆœŒÍË™n3qw¹îåÎa.`…)�ÂB±¬Íšc D_Ï©U×±ßaŠ]–oV[¬ô3ˆnéÌðÞn:U*Rñ®¤®ª}M5á$ªˆWˆtHõ!9÷²¸£RølºðÏÌ  jã�ZãÞâÝJt|5Ô¥ò€vÄXÒ¬š½+>›�Âà Åé%›MH =I½¿’ˆj¸){îºÔý½ü㈰€YP¸Õc¸ÅºÈ»ƒËçH­˜¾P_å¾I•t+YÐ"å×»gOp<ÍÁn¢ºâf&0´ƒ^ü‡½O8íÔXfÀ€r¹t¦Î~‹er4ÒIÂ0'Šw&½_RëP–r0ì=ƒ£ Í'£Ü ´ãÀ:flš¨uša6Gé8x¶ïÍïYÏ›ývßìõ_$¨8@Œ…^ÂÎË­&0n/Nuþf‚)Âd€Ôþ]ø§5eÙÒâ5©M ׉»!Ï•,úrÐ'3Ið¡C-vöìµ±aœ®‘l" �€8.« dvXpðíÁ%·<·‚x)9iËærž*‘r·¤¹¥×³·÷Ý¿«Ý3 hÁ‰]—z}ÂcWgIÍ5L˜¾añîhºVŸN[~êQ)ZÿÞ’/àöŒËÃ2ë:ÛƒG|¥ÔEÁäREŠÎŒº¸OÓ³9.��—ÛUšß½Ýà é¸�†ÆàåȼԉüY{>]àSKj¥ýPßÖ8ô÷�ÛÅíŽÛLHq¨ŽjtFäÕÉwË9ÄjXze»VÊʼn”ms]_œO„B£àx,y>ø¬Ãhdåˆ�Fôš£Ìbá=}imD-xØ�]"‚Ï\^)<¥ý1›Þ–à±ÒÒ°ÉêÈ4A”ïæÐÓ}IžÁv="à,fS²òMÃ[ù¶[9€pû*#¼zw¢,¦ñI9¾«‡ ¦sXb}‹b«}“&¼äLˆ3ì5HÖBš�⮘6ÙŒ� LÈÕAÁ=Â^†L‡±kâúŒÑçs‘|UfÁOÛ˜îƒAiHk½Ë9{â!Q{¯øjzÞܳ@y‰ Ñ»®y–CÉëyéŒÚÞÁðÁqJßÅâ:(àñq*%QÄ>œ3�‘óìoåuÄ3‘Vcç;räO¥1aoEÍluo•ñŽ †øžÃ–lÌs„wÛ‚›üÌıԾ'©ã/{s”õc]¶œVì4:Z$c!±ƒÌ¦Ê í£À©™öó.�Š{¿FÜHgvÒùê•¿ÛÛ®”°%ƒ¹¡åÖØ3ÎÖ‰|à|F'zôî¾O±iÕ ƒ\øH§dM’š9L“²áÄ€Ei÷ÁÎ)ÏÙWù=MO¨0žø°´Hé ç�‚„ONhÜ»sÛ�ˆ\HQ¦/ÀÃUz14'‚@DLLiv°¢IOÌ}iYUGù°…±€að~“�‰§j}ß#yÈÊì1 >6fß\Ù¡¬�ðU’ößKž$É_«”°X¡© �y ÅÖ'NÎ&“º`ÝHò 5-ÉÖ°ƒÝÜ–å*õƒ²ßü}ÚŠÁÒù:ψ‰ÑšJ†˜e~;çè!Z1VàuóZ(¯eBì>•®ƒµÁâG4nàÀ;&Po˜€áœb×ñ*áÏ)ôn`›¤«Zt{S wŠ*ƒ~n‘r&…%åÂrñDârM�Oû�üX1\­h¢¤pCóÓ©™;9è­oΈ2 úä·†€­r Aˆe=¹)GµãÛ„º©Ñð„¥ÏVåúkXÖýü$B@mùïãŸhˆBÚH6ë_Ÿ³ÊB^>¸OhªòÖõVcó•Îtëçþd|{ûÉ_·@–ðñÿ¯<«÷û÷xõ³Yˆ\v@—ü-ÿ¯]Ë©)8äIƒú1¹Z9À |s”�Hˆ‡£Œ#�LoÜãOÇ”l®#I�GúøùåæÛ·ƒûÛf^¸·\¹Ë”z*} ý™A*ɲ„Æ‘—…¸ [Ö¥ë[…±h:r±+ÏUô¸Á›¨JÌê4›Jq(ùa»B„;(S2JÐ׉ÈL«2%¹ ‘¦ ´ÐÚ[5·ZížoK^·£ßòöû´ØÏší”®÷]¹$Y²w.üm«ZÚ¯’÷ïüb;[Û¡ÕþúÃa¯ä!§‘ �‰œ<í�omS6šÈ$„…•8*€HI!*ÐÚkïHýgWdx°=þŸëú?¦qÆ*Íy3¹SjÓâ/PZnnQvÌ?ëÆ�F7›tþmoÏÏ@Il|ØÄp�7'áù©’YúÐ{y�*jÁnˆãÝ f‰Æ�ÈqÕ¨Ø úÎ<¼‘Šìcœ¯­ü€tçûíËëï§ß „„÷sŒö||­þ ¯ý6~\$�1îÕÓ½NÀàÃ7C<¸¼�ÈñXÜ:†6™²Òz¯ãž÷sŒ½ÛH±íà1Œ `ŠEçqЍ¡ø[ïÀ~ä˜ØÌÛrÙƒ‰W7••L±@”ÜÜ[ÚUîFL V®6dÚ]<÷&t/ÅáÓ¤X»¿�ô´˜ýò“´í?ÏCÈ]ƒ²¿/Ž}¿zx'¶:×öA§`¤Ïà[®›}ÝÈÌŸor_Jûüoì›Æ‹Ë¯|Ƭ±Î[_>nm‹\�Â$Æw'Ôk§ã\Ñ9 �}žýGßÙ| m]9#š#ì—¯–úoσøpÀ- 'Äù³¿�´Šî�ÎÐhsßH�øÌeò·öXkª)—œÿÃ9Pº QŒë`�Í :r'ø¼!8úø¼Õz&X5ïúòý9ák®×ƒq�³tÕ@m*�p€(dLÂhä,ÚÀXÖ™&«¦Ej59õ9à6óƒxÙ>ù¥êB (¸¨I°ÿVþ¨“�âM›È>ÄË ¸^éY9ý¤)µt%*›k›�¸!¼¿–Æ· KŠ´»ùv6øŒ¤é‰ìùiÑ¿q|TݧÔ^ºùa|^¯ÃvfÓ¬7Ã#M�°­•ZG[ ÜÜ3àŠˆbífÌÑóа)ÞàqÉé<Òº™Ë„àÜä@›\)Î]I�Z|$\dx¦öóÏ¡'®ûQ�ÊRÉ,¢²Â†ûä´à:* šñù4òèªK=‘ÅDgDZì²ã×ã0üÞ&j¢É�›Žu![QÜì�¥ž�Áx“Yüœ¶ùV0@�›‰¢aÜf÷Å­tÞ1ÕCÓÅ’Ò.!l%ßcBê8‹÷{ËÇ2“Ó×qÅ-” #¨ó•äŠ!ï¦ÅaCÛ{Šã&o¾Z÷{h¶}:» X¼EÀó¹Ž/P9¶zLURçÎü;”÷õ5†¾šètæl)ÅOî—gzÚcã‘Ç��Á—ó`Å¡„ˆü‚eH ÄØx¤\©dŠ(då´9kx¤]Á×L^ÖçÖ›}ÁA^ˆñŸvÈ qaØR–ÑÚ-Y09Ä%—ÐŽ‡¢€aè Z¸Àò~Çù?©£H;ÜÏÎ�º_¹´D–ÙN Ïå.Q�H/ªô] úþ$qçcž8le7¶÷Ä Øùâúvæ228ªg6¦E‘hʨÒÀ}hÚ ¸òpÙ”E±öÉ\8á¦×a+äÓò3³ùzcØÞm™“»˜åñ6‚Œl­Û´Hq-ü£­9ÈFÏœÄÆ³Õ ùãé.Ô Ueƒ¤šO¾^»»é][9 Z,¨¯ë¡ àÏ&4¼Ô‰C?Ö¶Þ±äœá\ÉZ�Ž2€WÅ´ž«ú×8â5ͰÉ%ùÛ½Ù·}Ù�žÞ'“m‚ ±muÍKÈ9aÃõ›ˆaÖÖ”jãúlù˜�I]iÒ_£"Øè‰Ñðu?™œ-º>ñG|ìBû]‘蘀ÁU(½µ œ“5‚—ž*ö(Jºh/€6†(™ˆÈ™ÌóÖ´Oêù³Ó~ä-Wöò¹í¹ïºúås°e“Ï-`)’WmŠ\¦Ä¡gJnp5@Š]\±wñwÍÖÃÃúWv94uµ6tV8ÿ&µÑ¾t Ž'±ŠÛ˜.Qrl€�j&îÙ4Fé—ì3”6‹o™¯ƒ'àœ§-jA–e›ã¾ŠÛ Zן¿¡+]¤Á ¼¿áØÂÅoÓ¶ "pvÒ�‘“vbRÕñ—À7àWb{é}(Ö!AºøƒyŒrámýTÞ.‰Š�Ø—"K»ÿ8qaÛDHÕ`fà+¡¥ÿ¥›ËÖo20³æ{¹Ýe|,jĶowäööó9­¢‚ÚØ‘ò´~8ÅŸÈnx fuç“�àç$i_J²_WØÍbÔX�4[Nç+¾hÉ9Q'~\nmÞñ&ãD@g…“ÿ`’C9÷DÊ |˽`h†ï�G�jùö<6AƒN`ïñÅž}sõ°Ýje?ÀcNìâÙOVÕïKì\ñt™©Gž ¡‹Z7þ”O†8cМÎSä?/>É�Þ”RfG\iâ$�…í²V§ìx î–?¼2VÁ„À¦ÀÖ.{εíû7ó»ï `¹¼k“Á,ÚXJò(tfžT«’ôX¶¯‘ú-â.á��ïÎ&rÐðÂrƒÛ gÇ�|Íò/Ì_9�è�|2M_ži ¯í¢m’ 0P’):Pªú£ž O ’ùò匄ø>—Á<Ü¿™Ù“ìûúÑ‚ÞO6ÅtÅØ7îCh‹R`a<õ°vUÏ\K¨ý«ºó˜=\Áhæõ8Êà òÅhj_�qÑ—Æn3€•Œäþ=ð‘†Ã~œåý{7>•é­]nëí¬ŽÃ²AªóÎìŒzÖ�-îÃ|MJ€°CÊj(½XL‘Lö<Ö ‹hW…àãì¸=~EHèx |껂 $�I§7L/Iضíj‰~2pHãe“K 6Ò-µx> êÖ9ìØi¯=¨Ó�k£ƒøiø‚½ûøë1|þïj×ï‡âÑi}çàÙ’ôo¶úµV;arýã_ÂöÏFÃf9åïÒ0²Ý1„¿0 ‹Çu:ºkÀˆÖF ½Ž'¾p&~÷±êZ26ëºAZÅóï�û÷L†ñ’Ö=$ªi?{qëÚ^«7Œx\Þ÷D~tìû>¨Ž€ýŒ{‘-lj—8ŠZö4ðÔ‹åBIj<…COD PlòŽ.ßÖm� ·¾øs­¹ &éž::¾ŠGy®ú~Z°&['xÈ)ïzîݸ �‰Ìö[Ïnd– Ë›ææjÇ(ÖÙµªálTÐó‡œ>ætÝ‹)Ô ÀÃÁ±Ü%Ë€¯™¹†Î '±¡Ë>Uý5B¬ÎQŸHËÜlÍáòœmí«¹ñ÷ ®Wš.q‹×&ÔîÍr¶s·Y¡êÿpvÎÓk¤ÕÛ"´®ó†¥­AL¡XŒ�®hÉg€�ˆ¢0°ŸóýÚÅ NÝ´kƒåΰÄþ"^•ÎY“Óo᥉îÞÁ¤¼<[¹�å€;ù º4÷)h¹ cÞ’‘£Ý6�ájœ³½N ìÎ<ÈrµãЂJãÒÿ¥vµÏxê;ʵüC{µ4óœ"&3yæ)·¡-…^/¾�Øâ~ï=)�ïûž.®ÓÆ�ÁÁ8‚Y=y¹æK��Þ| ûÎoÉ÷«4©Õ›y,>й-e„EÖˆØÕ;¤^ZþÍ6Q­¬Þp0§× fñ€¨xðhaQÚ×¢Éx˜ÅÊá Vñ�âk{o·°‡þÀf\ÆV¢—Ýœ«–<ÈõBW—_Ò£\K|NÖðÅ@t‘Ù0ce6(Çí/‘«�85…Q9Ãhäø\-ÎãPG‹ǯ˜ ›�z©×d”›§auJ¿“îOëC>IjÂÝÞŸ"üMµà«P‡] ÆSÛ‰ÝÉkŒŠMqÍ=Yç‘aã­ÿïþw™½ú4N0tÐ�™‚ó‡nÓ®�ºHW“ð†¬0ß|a눘1¶T·@£Imü?+�v'½ý‡²2–Ùò~S]§v 2™ îïËèæˆÂÐ ¹:ÐÌ&eU[ÔðÈ�\�g:YéVÏ?" ŽÁ:4GgÃŒvE98_J¥‰!â*¿n¾\;gÆØŽ4çg4rmš—Ћá$–†C[ö|—pÕî´:k¼!²å±Ø5 …4'¯ M0¸óÖI‹Ó) ýÄ9-6õl…›Ê°@:2Ô¼m�@[lz³¨ o¥�á‚A$ˆ×|)—žw&ch^Öz Çà=àõ]à Ǥî7âx5ÿ V¼ŸDah6Ô¤áº6XkÀ©œ�™ùZõUì!ŽÅÑ·t~º_xp°çéÍ,•k=ºO+Íý ºš3‹ð�:Àò68b$1 \FÓ~DŒ´wvLM5˜Pí,_>:Ff–¨þ¸wØðò˜e“÷ßN÷�„Ðñ0Ï”Í6(MÑœ]îžžccÒ¢µý0�oRMÜ&InkÓ€š„Zaœ!áiÙLËWƒ[ª [ÿÜgxbË¿`¾†fÞâ c…Ñ—ðõ÷½¿¹Ï~Òr|®+?bö¬Í·þicšÆȃ\q‡£v„¢ÐÞQ:£3¤¾�â*¼¢I•KGšÆæ.æÃdÆ“za•É @àÍÓáÅÏ­àrÅb|A¸LèåFÚv68½½ÕÃxÍYTº ,›éþyg‘÷�ü/ÙÙµý©÷ŸªFù±.pU\´4úˆ9­µŸë- ¦h†(»³K±"‘ÞÄ4�1“Î °8œ\� ä| 󢶬pl# /å7ý=PÕ¶Èœ—!�Ê�ü}͵ò¿ªnWÕ 3}{~ ƒ±¤}:�.}0©{’�zÌŽ¾*íPrI­;r#Gè¾ézú"¹c1ÛðÈp97p-Cx©`Bý2SQ‚3ÿmݦö…ôéKYÒ•Íþõ »Í´Y°4ÁT¾$pä¡MH©êâ7ƒÈ‘_-òðh/£ÌÏþ*ÕºJæ÷àÉ¶âæ…£¤>øö—6Ï�²È! És_ŸÂÎC¥ /íŠ_¸$ â]vž3—4˜-H¬e»£+ (­í³�Q©ˆoøó�amFyõ'GÈ1Þa ùŒT ,½˜È_k0œ™õ5™�S6aˆiÖ×ï#“|9F'Љa X´}ÿÅÎå”d-‡oÁ¿ÎŸ»x§�¯†w _ȉ}ÀƵ£oè¸-NÔ‚¦W/½Kú›“RÉ>TÓ—µù-›ÒùŠSŒ®�…áJµÊ4¸A!1\ÓŽ¹ÉGy8\0Aˆ9«_�-gniHHè§}G�yO`ðð(«[´õìF›ç'ëÇqGô„Àø4½°�ÆœF�´HPs”FïC«p&^6Óš p¡b0RåV ZÂN€œŠý#Š(}"æÑróBÎ:ZÖøeø!Ç„§k%y–ºo9c:izôg·Y�hÖqÑ:{!}íÄÝìÒGH95t�_L3`$åM‡’ Ir ”û™äObÙ§$~Q{¿¯Qg_4`¢Ý‹þc/wÍ~ÐϸÓñbñúúù: þÙÕä6"d'¨þ/€ºé…õ¥ 'ençýFõÐ{è6ä’9Š[p¬.Wð{/Áˆ+œ]n‡8Qe…€3Uî€ßä2ô¼¹§T«yÿ° øØ3;2IkÝo®—·>u4-�úo0ñœ œ.]8G§áéÖIñoñïưüB|Ó+q \gHJ­ö”Ë¿h$Žóø²d\Œ�:0Ô¦¤¡dø kœÉ¯×øçPÖ«^ÜÑzP1ª(P˜ÝVô�6ÏïÍŒâ5íÂÄ«sráÈÊå`·¬s£W¹Ô¡Çrìðþ‹�ÿQX(\¦\)eÖÊ(îwòî öŸU£òÛá�­‰ðGºîªË¼?ó¿‘Y¹ý³϶ÑùkLú™Ôû:­î0Á[е¦óÛm; _—ϾÆã9wj ;0Ox¶¾H>V‹6€•Q¹9ø€‘í÷›Ò냻îÂ÷;n�¿y×Û@YºTqŸÕçç.?ɼÎ?þºüOØG¶ÃíGbØúæ œßÁª]�`çJ˜€0SŠônË“1î›ÄÔ“½ˆ”ï宄ƒcñŠ« ÛR#Á ÷Yãô§ì}cÙÞ8q~�ï7Z¦Ce·k�Tl¦Ø}‚6í̶®ÇrÑ›Œ²¦>ôÇâ0úçŽÐ*Š˪�¤�â†Üa½ßúOý©øg_ ®‚·×_Ì·ìtÁÒW¬Ì�Sû•ÒLàlûü²¬wCS=�§[’gø~O¦ç¢Í‘h‘‰PÒùQ®ÆµÎgë“°¾Hp:A`ó8U2wµ³–¶8CÓñ¹èþ‹dwìâQŸ¡Ò'âù©>Þ0„‚‹ U¾_ðbâ¥:w*¯£`Q‚ÖŒ‡%5òѽâ×Ú_ÄÏ…r¬`¾ žZ Ÿwåèâ=Hžô´·Àé =ð ³ïW®Å|]ð®á‹«ž>áÆ­áy˜>ä9^™Û`Ú°ga{€…¨b¾R¯÷SùR-žµW¦©ÎG…¬–a¹="$ÞK,ºÇRHã~¿}3©Ágäo'ÑSïnh8ÔÕ‚�nš ‹ƒ½aúƒÚÈ=•G‹+‡cýȘ ¿-°š@ÆÖ³¥CЪ)%¹�ð~eîP_‚Éä`µRÌ ó™Çh‡Èd'ñ7"­ð<|qhA¬!·wgØè´8n�E¼Cø·oöœa>èwq‚9G\Þ —ðØ@3vÄq€ Ì|=VpÍŽ�’z\•¹‰G án€îJ}ÎìûÈ2F,6³l xütÞõ÷qî•È‘oÑ À`¶Å‘½’*%bváî98H‡ý†¦ô…_Ü:ÆX‹Cu8`ŸÎú¹ïþ›�x,>ðì»1´?xê­þJb«æ«Q×0&|)..æf³€UEK‡G´ØíŸ£¥¢}tÍšævÂÔe_‡ÏDÝä,] ˆ=V2Ñ$>-)yì°¸9„®ÜþöÌ9ë ñ„L;™�±H„T`âÓzq™—ã3Á.uö«Öyk•,€Ýà�‰<æÓþïÈ „µþäwj1éo#¸à¿á»¹)@/CSΙnqÌѱýsj� ;¸Î£ìÈÑ9˜bõMyâ?¼>\Abç^—ë —b(jKBEÒzpfÇì„¢/Ò/œÊ “áM§­Ÿ¶¦u©Àå Àpß @`?¤ãÁ­âS®µ-F£ ‚éAa#Yæ0u›‹Íà½Âþ"œ®"·œ§üGpÏûƒMþrk›rFU¡­£i.Pæ/ 8hëJdÔIïÙ‡ÖòyÊX»M�1þÞI�Õ(9d%ë‚´IËÈ<,_L&Ô¬™œÞ޹W;£†6¨³ß™¼H^1^ò‚T�²çeƒ|�2jåu„±Œ¼ÁB¶ ¦Ã|þˆªzœb�FÒMñN�µW‚»‰¼l_WÝJ!Ê®Œ“4ﬓª8_q½M³“±…fΙ�Z¥L¤ÏL¨Y®ÞSI©=éJµ´Åí:3F¤~M_™J:n5Ô߃œÊåÓll�e&b‘ƒ·HìäsŠLÑ_"Y�\'ý‹Š œ&ú™ÆËBèU% ܲ3ùø�˜”=\T† Ê}´»KR,b‡Vªûk˜Ý^÷È1Î]ˆàé_D-d„;K†FƒÛ´5CC0m‚Y#”"Êþ˜Ô*ßU…ìÓ^áPåKÔ³z7]�8fÅò›‘†â`=ü>ù²ÕëÃaµ•æó¢çIIÒ¥RýŠ�b¦tÎÅ ©’ œÁ e˜±ô±γI¥Û .d{D‰XÉ2˜Ù¦&KE9*|“]PœÃÎhtdtd58C)åИR›¨Ìœ>‘(ŸM[½Üâ IŒjÈóã¯9¼I_3JBXøk)'žr¥çRcL%#K¬Ã‰Î¬/£ÎYtz!a<“ý¸š}˜*7/þOþáéŸß±çýôL.¸Š÷îÒ6ËàßËùrüÿÓúåûóíŠ -º³Ê0ñ€(©é‰ã·ÿ?Ðs1Ï,`Ÿ–!Õ„9×¢A¾Œ9Ù(°9ÞLdU¼£·pêÇ?q/f½7cc þKþvRö®òc¥ÌÝK�Ó/äüÿr:(6†ŸÍš÷?�Oävi&þaÓóÁ¿5ÌX°¬Ûા.$�3—ºæEꨮ í�3­¢.Á³»½wª=“ À‘÷r¼fï�Ÿáãíɧq\¬ŠÞ-Tˆ‚KY¶F¿ a²’Œ“­Û*VúFb@1æŒEÊ,嬗S+Pt)€‚ÁFe�Aìyÿp-¿æÃàÿvܲ8L†#Lè×¾ƒÅ}�1Ïvåã»…Èœ çbgŒ<µƒ:µÆ¾$‰‹ ý}ïN*KCjLO® |™A~kG¸dÇ>ŸSí7nõ ½�6qê+4ø'!ŠÝ_Æ™€´øÇºøà:Ôlpê,^Ö4L[¾=ç™ÁHÙ–ý‘TdA²@Ç. mŸ1n'>òÒøúãèhš¯£ÖlØîA ßM©ây¾éïõc-Ï;ù¼¿˜¾ˆÆ’3FuAݺRƒ¸Æ¯ÂÆTñläxì=�m%˜7®�§Ç ½‘§‚÷9ÕbKX‚CäóeÈŒ�{7¬‰‰¾¦ÚñÜñÿ,}ÓLŸ›ú<‡÷ʦ[¨—Bƒ¹G¬v/§8Ëž>pþi£ì.›øÃ"R­Ç%Êñ+9»áYùÕ60\7‘ÈPÖ�ë—A[~Ñ”à®rí¨ˆò /<À{Â.¼ »(dÔè>®ù8Ê”Ø-êì·Ë•ZÛD L) )“ÝkY%•õ-¢žä*Ÿœühíà9)V›ùæäFɰ‘Æ óv�N÷1¾_ÂÃÛÔ-'TÍàüº3ŒWg–\b²BmµgÆ%“ÊeV\ ÿ~í¹Áѯ/XõàšÑ'î#/`]<Œü¨Y¸†;:XîE¤Øü¿yŽ]á—lù«¦ŽÄ|Áý©Q‘!ÌØÃÓºÍÁ_—hÔøŸhÃý© h,Š8Ñäe†–Œåˆj´¦µœ Úüã4UpnÌŽ-M 4è�ƒ<ü�¬��›ÏÈDÜœy‡Õ¡ Ž1 ñgBç‡e™”ŸÆ:V˜*´º­÷7àŽ•šWëø;¨°ªy`éºÙ¨z„î¶èÖi�t78ýžã.+>„±„°�VÙÊ2ï­æ7×’s]A.ý\ȽaSòh’Ä%bÆ~zµ»­zYDZ7òø×U0×ÛêW˜nS�¯<ì°‚´äÁ1Ñ–aC�©>ì[ �‡On�ÔñQgö¸Ž÷éC`ËÁȉöQŸ­Ú³Ó†Ác—¾A ‘ŒC…¹yL*vù×¾-ñ¦õ>6ìHy¼"§gºvéa&~ =ï—T1»‚¾ÔgÀÅ‘ÿ²j)�Ý÷ÓkùÓÀä³ÄŸ ¬=Ï×µâ”×ðæ•ÜÄoeøš¡rwqA¨xL>ŒÎÚä 'k–ÊìÈ®I¡1³ìFB†Æ·eêõªy pÁ° ¬Ë�O­.x”[ÈÆãFîàD1fʦ9¼þô{œVóÁßͯ4ܰæØyZ}ÜF99ÖŠjÛfÖhô$ˆƒ¸örèÜÖ\nS)ÜàRe^ì¼±2çŒà•¶pµ 3²Y䤼ƒmøëÔbѤ§1=8â³’t&m7ÿ[Ša|w;‹0@‰óýq†P­°­úÖºÉÛ/Â3¿M£%‹ýèòßE¬Ö¼Äïù ïŸåô”Mí^aer$R,îts•êø Üe¦}ƒ Á8Ç(4Ó/ßæ]ŠßàÐW±ßï¥üÜÃþ‹$ÛǶr>€ãéäÈSú�xÔ’Ÿ?1Â#qîx›$¸òÞÞšc§^ (^KûÔGúMª)¦×î±ï·//o–wô¿…e 3z º²OÈ$F_éÄ»þµ~{þôZnn…ž¨ÒZ¨ôq9ïz¿öƱwÅþ½Í»’Ì×!O3Y«Ã•äpwc]i�“ä$Ûg(äÔ�b‹“KŒ%]z˜ †ò ,{éñ &ô*)�¶ kŸ´ ‡x,ô:5æGT±�ÉYî8|šn*ZÕgidæäáÆ`Ø ³-�rÐ``Ù¶SliP+‘Jaª Ô¸St¿ jÙ J:÷‚Æ‚3ìÖÖqãRbÙ�U+ƒHq÷`"ÎЂ]†ÓpéŽ?<óYZò¤2pxà²^j�Õf<} mG–î61.^± Ƹ܇Î=¡éäÌ»ÏT1)RBåe€Ñ ÑŒxë½ Š|?x]`V0…Š¡Ò€­|5Òè²K|Q ù¬Øy«ËåØ#@ÎÃÅ+�¢Ù`¨ÏEalž| Yt,ÂÀEô¢™2Oæº_žPæþ=›ùîñÅw;|{ßD"Þ�$"-â#û÷¦çÇžs˜$}0ºlŽ,>:Ɉ$3ˆàŸÍwÝ vg}1@Ñì ©ãY·Hc™^ÜǦÀ\z°Âq€ãÔ@<oÁÆgŒÙ‚ÕFpWåÐqðªðb|Ðl1G¤TÛRØkiîÕ¼å Ùã�èwµºÂòåm¸¥4· ÓQ 3!’µ00ÈTÊxšˆ -ÍÇ626½ñ[2‚Xÿ�\_)ŠG¾Ѻâ€ã†F9µò¿a¹¤ÑZAh}¤£á¼i‡?zÉö-]Ùè¹]¸ÃòÖ«"¯€Z{™w¤oÍônñ£0<ÐÅ÷n•¸ãì˜È¡‹ãà=q€A² íI‚úNCž=kZ.Pú¡CXÈÑ–ÊÀ ½tØWÙö|/qáò¹ÜîýN~Sr¼óÚYQºFY J‚¤sl5¨¸5„¸Ì�1»ßK[}¶ªj{{l9< èÓ±B— /­œíù{#b£YQë+ãVk=¶*,W1à�›(̸Ãà·w¼Öp &™â”âùÈuKž«ƒ"�8né¶ÕOYÆ{Án‡Ø·u»Ž•­ß³ìã‹møØ0}Ú›éöãyo-€�çZb6¥ƒH¸ð†9ùVæÓ¥�ÿ±Ënbü� ¿…oqÓžU�®4h5w d.7eÂøÝ¿ƤZî> Onx·HÈ¢<Û95Ò#PÏçEß»»í£R0w¯X2žñ Rꟕ3Q‘ä]„i+kv[¤rÆ^�_-ÝݹtöŸ†«b cm2ø-Æ\§ògÏ#�V-_‘�æL³c4r]%yŽÚ&üº¯§åI¥¨¬(¹bÓiŒb·Všþ³«X¬ŒQ8x`…kó>õ‚æý¶´XU †|TPY݈ü 3 I¹Ÿ,wgCß°ÅLŽ:cìÐf®2q!;•ëxÚ‰eSI<ë‚ç2ºÐŒþ#Ô½rítm ¶+ݹ/<­8‡#ÿ=g ¸¹Ðj±Ž³³�߂ٟ��à]H±‚z6G-<œO…BwÍåi/¶ò‘ì8J{õ6Øè,žrøñwRz­àYhÛ y¶Íj4"3i�”Ò—.bþ4”üw¬(Èå¿k¿õ—?Õ�1f¹xϧù�¨Î«5uk½S¡`\Kª‘eΙÁv|[ñ¾6xr>,©IíÆá0<%³*5ü£Ÿ�­÷Çç;XÃiÇÍ‘â�Mµ<_CƒX>Ï‘×�Mw ŸuÄæjYýxbSµJ ööì%ÿû;c¸¶ýþTæ\ž74³^A(Ÿ2Lš4Ð«Æ ˆŒÐÙ61zU–„ŸE…·±xû+8¢·ìwÏ2ÛtצšekÒĵ‘´tv4yÙx0ß =9b!½áI?+ï\qŸŽÿ¥2æW÷x8(öH>I kmߟ{\hÆ4`çs}-·`#ýàÆ‹Æ½ùËÿy6àéZA¯7éû�›�Zuùò2za¿‡·ÚF/.8L‡ûàûtm1^kWLÖ�5Í�\ïqMžCDɃðiäÄyQ@è£Çcb¾>P…²õÆ–¢¡…œÎ4³4¨�Œ¨i&lC{Šï‘bXÒ{ÇŒ¬ÆÏÜ£2#Þ“‚¢ØcN¾ê‡9`Ýδ~çGˆtËÏðV»§G7D�"7 ‰âÛ]�jÃÌÈY»¾R°”5aaŒß ¯'ÂÖ¨&7Ca:PM# 1'¢;;äõÀÆ ›d° µ‹³óx|Ï 'džÁOÕÈצ®nͦ¹ ‹ûuF_ËÖÒo,T!= ÆMq›ÛH>nß”­�ýÙ¾9cƒ<† ý@/ý|?{sõþTÚì?”áKk¹_Ηõñá¶F|µ¸Á´Æ…ïí»~½¬,>ŒÉâ’H€†j¾÷‰ÿyøZ’¶ .}{iîèùŒ~øýGzùïG*Àÿâzç¼}µ„a6ЛC=~+ŒË£{ù�ÐK_^ þoã�ÏF�}àØ€ù>x6z¸ý!9›�aax‚tü4çí:néøáü6èr(‚`þÑê €r±)0(¿ñÞ•Ô:?†*ú5äõúî–¿˜À?aDdégb/žÒ¦�FúÛ�~=¥d>ˆŒøçÌh #‰pBB¬5†u°$„‚zo™,`ãÔ#¯mûÖ1¹p~±Ï•\o SøÔ0Ðë ¸!S¿‡²àì'¨GŽŽÈ&À…”­¯Ç¹‘®gmÏêÙPbùóÅ´œëKkkXZÁz~tPj“÷Ì#böéÄ_†©„C·ˆ:=8¬Aìu W¤‘éÏÚõ�[(¦ –2°Á®ù¬§2‰s¨öœ�B/4’QßÿÌ_©AÄ{�àÀ¼êQo3ì1‚‚‘ÈjeWfЃ"I-­’U¤àŠSºÿÆ».M'Õ»÷?“ŒÓê®GÕœyAɹ~çºýô>8Üþ4R‹ñ4£™!¶’±*zîuÅïŽÁ i(èØpEþXËÆŽ`.7Øe¨?€÷sÖ"Ââý.Î_É�½qV.ÎÇ?3q8*¶Ì“ÜúƒZ€ ç ÍÀ›¼‚ š� ãB/Fœ}WõYÖŒ’k_jètsŽž”GïWìž½~ãÆAï9Àå¡ëv·Ÿ¯¼WžwªÄnª?�9܉Q~71Îj.Й99Õr”Qä]#$"ùy×Yß —1QÂ&ýuµhtàhN¥N*oÃ†Ýøô„ à$…©jÛ[KVÚÚjÚÛSVµR`’9G1+'Yµøt¶-Æ)æóe�ÛÀÞSåÎ��ã×–†´^²iÒÆ*ÄJ¤² amì±3”åŒBÑéÙªà^~ÇÕå{‡Î†�ohJ¶0w—–ñSʆ‘CPkÝ$´Ö).Oåà)(ðñ®U¹�Óò š…gÛ¿¾EÃrù¾ËêÒ}©¾½1Ù2)Í�þÖú³(L ~ìêÑ$‚g"¾»_£Ÿô÷ î¶[ȵ ‹£9ŸbgdžD ›ˆ­byœ0‰#*T·áS_“îk9ÅpX€v¹ )�ôª ûŽ-ÃTÙ=QPÐ\,¾3 ¶Ÿòy•}ôfùO²/¥6ÁîÙÊÉ<ìdú®&ð˜[Ÿ°5 ï±u‘;Æ ËìS9ëˆXÊÒ]={Èìlõ¯_ÕïUöÛÂ;`Ÿå‹g‘­ pÐsGîÉá *s‡M¸díÒÀȧäÇ R„ËB•1ÙìR.1!fH¸Â!æ‚Ò(<ØHDëQŠïÊñŸ/*»:_'h![1V§ýíÙ„»W=ê¡Îð4(ÓÝ”y«‡V]â3ÎO6!A<Ð!Tñzõ:žŠ0cHœÍ%çbÍR³Ð[a�œmë—ˆEE¾–\æÖL³3Œ¹j/`…xƒ—.}³- Nkˆ(†ä²°Ì§VÉ ØúF„·6þǘVó8NïGñö€Zæ+ 1ãÓâ\ŸÅ³‚kå“[@Ù£6`E¨üs‹r~×nv{dyÜ `ð1U„x¨ovPq(„’&¤íÝ‘³šÖ½‰A { !—å'þ?ˆ4à«xýó¯íŽ3ú]tĉƶ"¶ã¯¾�Æ7Ó Õ�“¦å.xN79çR•† ñŠÂùÖ·ÀboŒ=%e±?Y�sæþÊŒš›-ɱ®“Õ$ô‹+mFÍcωñŒSnMŠQæé¡F4Xøüÿ 7ìÔÃH,¼¯ùº[Y>>o:¦5¾Ú8Ø‹þ�MQ�.’ž/�=ž ÙIå«ö‘‰‚Á:¿)~;•ÜEÏÒÆ.�ŠD Øw½^Dï=ëMC™¤­ÙTôÑS™Q+…�×u€Ó»ÞJç"?@W=ã&´ Ê�ŠèœÔTKnµoÆÙ­ûߪ:îzZnxuÍiöÌÓß…ô§¹é‰Fk²2¶jË´ë¤Ýˆ¦Kšç¨§‹¼í¯ŒÜqÍ÷%Ý¥³{ÊÚ«ÊÓåÛïþ?|þ# 3ÁKÝ{²ÌsOþ2†ß¾Ñ]£?C=îÿùê^wÿi¬ƒ¯�ëw¿l3<¶Sê ŸUv)w)9iÜôB-1"7«}Œ‘ˆ'D5NhQî!ùštüÿÍ=þ¹ÿZGÇFašt¼ ø£…Lß3Bú –å²ßm9†úU×^/ÞÏKŸ"|U&Æ)¿ægO¥Õ ëGß[º»ÿé¼ØÙ‰÷ÝÞís½¼ì­)îaÄ`ÇvÙ uŒžv÷ÉV#„|=h Èl×Iˆeôº‰Ð)!yn$è3Æôx%ⳞO:n¬Pý©®šv¤|›¬Yˆ›CgN2çDˆeˆ¬] ?W[ ÎH˨‡UŽRJ°1{ÍC€þ\{Df|O2{öéã6nEå´—)BAá©\†óÄëöæüÛù,tg½ì7uíŽû·Äœc³½§ozr°à0½éÎoÍ/Sx÷Ò9°ä@ï/á÷ÞHqßA5�u†¦êzW6Ö ©ÌmÜ«Üq§ ×EÎèêŽÑ¾g‡¢Þ]¥—ðãLx”k š¡—ºÇg{’#ØDÝÕ(pk5é²Z§p¾»UˆIË"ÝõsÕÛ­†ñ“�¦ké^ÌéC�¨ïQûž,#I¨ÎpãÈH²:CrwÜZïïÎÑÕFzƒ´l=lÍv¨L±'jjõúæí{A³ŒJÿÙwŽÕ!= 7zÖ#wp¸!œ¼÷‹ ßÇwÏ×^GàòɈ.¸Q }Dïž%ñ;ES;ZTQ×LÉo3¥Ë»Œ½iÊ…¼@ùÆ`¶ ŒcÍBØôχÕüÊ�&“‡Ô�Z‘9%£\À ð(34Ä*µ~¸Jê­%{â%[ý;ùz>³‹òœàd­¥¥[*Þ§ØØ8ø™‹Ò2ÖO°ŸTíPø_õ#Éb¨q�F—�Kâtn#ö.;%&l£¶~9º8\ƒó之å]©»w±ráþ—u-�ô²\¸B¤ÿ½ùáW´çÛXà °Øµ±æ1œ™,åY:�g®RHÊNhDLŽƒ[)N­Aü»…ª‰´"¥Æ¿°ö^óÜ�mpX×™ @¼T<ì<Æ™Vœ…`�t¢18kÊ—9ˆx¨úËpo·¹="¸�æw*ÂS ÈçŸ^k˜I²ìí�Þ&d/P:lú7>æÅ¨z›¯z�å\‚Þ GÂ?ÑYØâNÆØ)û°ù6ÓŸó…§IpÜN~i&l|y „jô ˆo:ý"Ä š?V ÉÙ{(?G8Û3m¬µŸ{¹maã9Oò»”ÆËŽW ªܦÃ�#ø·ÁNûì V«Ær”â÷„¬¶F· ‘øgì''’ázèîy08<´dP™ öøT1xÿ™Ñ&x5]\o¡wÞHÏ¢ê,Œ"Ñmn…¸š˜ÙÞ3×_ Ÿ£ßæ »ïínÆÈ#Õ[ð�DÔ)0?ð…àƒþZîP9@0‹a§_�'ÛâŠ!d‹„\âCEçu/‰¶nw«²z©¶’“[‚ÌRÇê꫞4±«ß8Ï»{›ñ&×òØê_C—°=¢¬å7¦AWñ!¸Z¾ ¶Dp]¤ÂÍ�CñíÅZiA&¸ ±W¾¤õŒú· ãïÌï†÷ÍÅÆwŠVןçK_/¡,˜ìlÈœ¼©Æú«¬ã,õ£~ É�€W>ß*y½rvLZ{$ž&Z�=3¾Æ�^9×Y÷a˜@¯Ü=›NFc�VãaÇßÞ[³n>ï’3cÖ=†.ÅnR*# ë ÚW“ê¿%¯¸|àp`h¡×ÒÃeš£‘)îy=mç¬c1®EU|1žÀléðøõÕŹ‰ðóÍ\‚âÙ'I&ò…l¢wi"sœªµ¬o[÷¿,g£Ó‡ÍsUg9škxq^eÄ„Å2(ò÷LC’^^°v¸×ßV÷7D¤a“ϧhˆŒxãQ‰Žë [ÓÖÎê“Sy{TAÒ1±'tvñuáÕ«÷·½ÛåN§eÒÖ2þ]’ð 5%éÉâXU?÷BÊ ñÖ [¦=ïöá·jà‹ùšŸÂùD_×zã+ûô~že 8Ââ¦5á×Þà&gv»ßzÍ\d’�‹Ôús[HšC!�$ &�ž„ˆËóÍßì žm=Äs`¢XdDØ•²)G%óB•4�6‚E9cWJÔP;OªÌÏåé]ÌZ;²Rl­³í›’I¡W "ªÃÜÅfÍûÏ+*Ðèëå„þ­Aß|ZH÷„¥æï#GÄŒ;_¯¾©¤Û¬<.2¥8øC uëú• C}¤o´~Ÿ°aÛ�/ÊCÛ} Ðéä�®8È5†¬¼B‹£ßÌÄKüÔ«¼ý𠾈ˆï�#Á…O>g¤n}˜ÕÂh·¥ÈC¾iQƒÝ!Ã%[e¯îÞ'I >æ¿•ñpi?GÛñä‡ÐÉ“…RõãÎ}@{Æî ìµÄþÕÚ Ï•–oc:«Çâ”÷𯨵ûÏÁÆ�=‚z%=Âmh¹y¯9‘Êø¦×=<¦ìkßà ŒFˆa_äa\×Ĭ�bá`ˆ·²”¤ÛØÏ¿—ö°×ô+úÃ6+$m™ä-ß'ŠñÌ`gº�-½*ÚÝ„ h� º¿Åá–‰ãÃq÷`Në¢û»A(+*iõm&}X«¾ÍL{óêOÍb·rœ�÷Œ�”ís¥ @h…êp¯®NüŒvïæu¯yèAL|w8ŽˆIӢݢåå”�V@¬å»¥)lp^ïéø&un™t|*±D†5s¿1Æé×¾¶!™¯îì7Œ†G]vy¼ËïÝ pþì ô¼>ºeœ ±sl=_uz�äx1”»™”nUl%àâ¨SÕùúTœw»¾Sö¶×î¯ë·Îý›ûÝP‘˜d[A®lkgí¶÷H®_œŒ~ÒKä_ŽÎ sãN¸xF/1¦™X`$I�tÍ”FóY¢| æ‹)?uöTNE ™Ú°F +f�’�Z¬ÉœÁ kDQ! As˜€È“ZƒBp]Í% >A¥üÂ&a1Á$šL'ÜòŸ4H€|¹Ó`Àë}鞈ñ9Ð…ñ6Ld(/ë×P°AXâÉÑ{&8aÑNÛ�¢ú™qÁ]pò6O˜ûä¸Ý²£à1[÷BJ‹O»ƒó.ïf>÷ê±´†±Õ­@Ã"a:-¯š/öÒƒy‹{¿Ž§ æY�·ìg�Ÿ£Ò|1 Ȉ 0yÿçmÚ4dÒ®`kÆyѧ>?"¾=c¾™‘h4{€2Ù¿m‹$µ/¯d ÑT¦Y´ NÄ;ZÃ)�k{¥E&&ñ!z¤>«ð÷í¤xbÛ<~¢õˆ³Ö?d­j¢€�3=9h¨&àöÖ¯ŒeU‰¬ë#ô«Khºõ÷j:u½ OœÝüŸûûYÅäÚÂâØÔž¢Ç„¥¡J•íþ‡¼Á&:PQt±®¥æÿyYÆe„˜gRÞà"( ÒO¼´r]ÕÃúý’zúŸΫ§ƒ«î‹*Ȣ佬ªÒµB9ÍÖï´:3,ã]ˆƒ\7UC¨Àާ5™êáHÚðÛÖvÝ�Ϥð�+ìÛ>Qð¯‚Úeú{ãc\f”Îó“…^æëEžÁ£è"a•˜n- 5Gg!¤M:ÜîɀȚ<'È'XÂne†+oOZ2)§Ê�4ˆ-âµ´•ËžÏÖuM]Š¥7“3»ºé°†§8�1ôB²21g°|lLÔUÊß+9|Ld× ÷ÅÍpó3�¯GD†ŠÜ½ãJè$K‡Í1¥Ô¤ÐÿûÔ·˜9Y5íÄ«’™*Ô¶$›yÙ§.fY"ŒQS¨J Œ¤êŒlÏ—Ò*Ò:{•…Æ/wk¾*û@ÁáXòñ,éq‰LßD|,gh9|#>³­%ZXóÅl¿ ”eªË]ÏÍã�.�(-.CB†›ÝÑ”¸ê‡¬’"a5Æ0µÅÆI¹ŒEîìJ»ñÏQ0£š�>á‰æ”óOž'}¦'’dr=MY±ÄQW«¸çýò3®?ºÌp³¤6SK ý2ÇyŦåcÉM¨¾UüÞëLôd’ˆÊÑÙX„,ß/Œw¾ª¾a$�yçiº®ü:„œåNézÒstšHµ%42k©Ø<ô=7iwÀȦüÕ&w[¾R%O'ÈË iÉËO!²t$_�}@+ìa·ŒÍUR·0´¹®&3¡/ ÷€š•¨n ³µñ'Jh �û˜käºYÓC¥f7+“ª»ú0áüâQoÔì«õˆ«®îÚâGå' ²Yž¶ eOíbr« NÎîÄÛObQÎã¬e§ƒT󧈘uz]—/ÞëžW$¼%SëaÔIBƒéŠ%W=4ur�×é£:,en¼Ðè�‚}‚Æ•º¬×xLKö J]v³7g”4º"û$Ç-wÖ¢ïí,“�Gw�¥>W1%LzñÔ«FiŠ´hŠkLÙ-�‹ñaiü-Æ3"Jë-ß~ùȃ|ã¿a“~Nqˆž8xîïyÁK<ÂkX)N O[yñ¶Ø-¢]ÑÑŸ= ÷÷J'Í{–qªc©™ç¼$ÈMàäuFm†»�ß|Öš÷cK¾¶¬oŒ^è šHñx»á,JÔ¢B¥Wůlª½úàÁ;ü¯¾¾ÏÄÞ~CQž;ý þÄxÙ{y¤ !"y?6_ˆ5-ÜOó�Ïê�*Ãôv{@ÿ:ŽÓ§†V‹nHÈ¿ôù«Þ.ÎÞ˜µÿ§ÆÚÿ¾üg3Äž�W¡ëóÂ=Š¢z3s{ÕωO*†È™×·pÔìÚv—½ŠFßÓq™F*efÖÿ«à"³†Ó/}rGŸÆŸøô¦Û¸ ¼@h˜òÙMÝW,²cz¬Ë‰²ÐLê¥ÌHOüp·ÆÎ½»|ïè.c¦3MG�e Ö{�4<ä " e²àóKqȪE×;ôÞø•�—¿(žÇ§z\ºXç, ¶mof­锘dp¹¤/!`ˆÁ«Žøö×0#ÙU(*x›Hú1ì>ñ�ÂyÖU9±r’°$5Œ2;Ÿ¤­G÷ m¶‘äAVš$¶‡%fÜÌûèµïP›ÃÆ% dÀ¢Ûoê¼¾�@Î S$åe\®@êlDÃyCC„ªåÔéÐ`¤Ã<±µÓ <Ÿ–°¹9ÍÚÐj–áÙÒÊNVM6°ŒD¬&m"&'Ú4›ä´]ìÐuÃK\î^Ž˜÷ÿcþšš½—ö. ãpIÈ+˜B?i0¼ì6 >ŒIÜÙØÚ,+÷v~3†ò_øÄb ý;Ó[Àà Ñg ÃKíGÅb!Ö‚ H]/ÕyÓ$˜°æÀÙ_T=LÇIÔqǺpÓñw„/mÛ–‹ô à£³Û ¬/t"=‚õõèãAR�ÑôÀŠgOà�ì¸jI}*d>¥"˜i´$+D[ïzOjJUr@sñG7ë¬ã�tHK%Ñm1X¼©XÈ'sòo˜ÓC è›Z½3a¥ò—Shí”®( ”µ 7¢Œ¼ŠæÓ|RôE çQšq²�U¯Ìºv´`ð½Øa0Ù5çõÚkglé›MתÖ°)™DUžá7ìã¦ç�eÓfÏý—yÆ>Æ£•G:û¿i0Njݎõm8rª¢cĦ=u_#7šI•!µáb(™Y{ßnPù¾~Ÿ‹î[S%0vþÏV�Ñnžñ´“¸ÍÈ2è?ìÔ^òa`?•X¯ 9?cqIÄ{®*‡%!ïü•qüƸøA£A—cx.ö©½øÄWišŒòãe£Z4²4K[¹i²ødfîóbŽÇGvµ#mHæì68cUG>àP•C°"ØÏS´è.Ç¬È‡ËÆ1×3Q£''ÑØžáœ p2g‘ßW+N²D‘‹odûxD *1Ï´ÅžO¹Cà2@ öJ|}} /’È>žŽßU†>Ô\åúp$Šæ¸�œëÎg‚'¬»9’ K_5ò0,2ðÞ (3²Z@Q÷äz×Wª�ëÑ^È>0~­ä£þûÀ°vp rÇÏÇüufßä�T¤ko”Œ\‹FÀ5g£ ¤ˆÁ2ÊV‹¹h€<2aÔmqãŽl�ŽŸÌw +7|ÛÒ§îû;Š8ævaL¿8âäµa"_˜¤!Ì k–«8šÇûàèvûù5�¯�+ݶshQÜú_DDN «í�æå_¸Àif¸´Ó{›šš ¾§J&Àæd\0ðR—ðl OÛÄùœWÚ ¦†¸ß؆¯G ÝÆ§îü' âoV½Œy݉màÔ#§‚Ö`Á!¯û™ñ@}½÷D±+Ëë곆ߊ0r…�·0doøoþöÀtàøçÔ|A}Aþ-`‘(«€”ÕB©r�À†¤cÀ› ýŸ”.ʈcY°Ä¼OËÄí“È‘Ëöä.üÂ)ê¬ïÏóQ�À b¡Ãtbm–UGØ‹¨Î&–§ÑÌ8”/;Mr þ¿µŠÊv·ÕÍîa|w¶:}&I:½­b��åˆ3!LüC#eB,›‹2Ët{º±pµZ•�ƒ¢˜Dø Á¤DWÒ…ZX`ŠN?@ ~LàoXÌÃø“…OìÿEH÷Ä•|Æ2QVö$ùJ �âoÚ�îIä.Và7xöë®uŸwÓ�ÎKÏ6‘˜æY²9n7–²<˜Î„°ÍœáBÓfÁ�1£�&¯¢´îvUµ’¢(:“ 2ÃÒ¢ÚBa!ŒÚhþ+»îˆ&ÚãdÇýge,kuøÒ0×›œMUÅA�Ä.\-–ÃÖ‚�) 0iåþô+“§å`‰Ív©ò—Š!z÷4ÝX`²³~=ÈY ·á™\ó&Í5½M9Êiuþ"�ìfOʳ­Úî}Öü–¤šLy O ½æ"¬t¤Û8Ié�錮dsÝ“î³ïoåJÀ|¶pHÚ²ll0Ðk O��8[0Q‹ÜøÔ™zñ>‡'+s ør”|‡�BäêTd½ûÐÊÙKìȰA.{@rBKøñ‘­8 Ç ÿk­§ð’Ì»\c;B~M"ç#Í?_)$D«‡ek¸¢“ufÁžIš½ 4�àP²VÆp‰¤im�yÄòUÓ6)l'Øš‰"ÑM‘R²Icfmh¤œt¾öS)Êð”¡Ë§}Ÿ0O’�k �“)H‚9&{ˆ ˜L?n6"& ËóÖ·ŠaˆˆM/o·±AØ%GŒoóèñÃÚ \öæît˜¶9;è5þKõ›Óð� àFÄ?XÀ¢îÍ@*iæý°è–òlqÎЪ¹ñBñ ‹fI }6K™vaÉŸ2óÆAsâÝ„ÒVI²éfƒ\Õžlêv˜Û)/VúÎXãÔ³?�ÎÇ# Ê�¬8 •H¤"{ªÓÁ"‘¡3†Œ\Ò`žTÖ¡T±ÔUQ—ÆßpïI¾ºíWOqÕ%Þ¹Ó… �O<›1³ÜîªÞPètà…oe‘œ.Žo3SÖˆCÛ&sf”Ì7¸ZšÒ¶î�'/YûEb±�N°¸E̘ AÖxø*™ ¹Cuó×ó]¾lCxÜhÒh݆•Ë;‰#¹Uê'-€{,$–'EŠ\V /wš[qæ ¾3Ã\‰7[šŽ2nŽtšg56¦Èèd¯×q|>ê�`„¨<"Õ8,ëVB’rº^C&•Aé‹ÒÄ,â_ †Le ·sÊ/t0ñ{j±Œ•ÉIS—Ek•Š%Žë€kÔ—mù}JNÔXžeqÂU§\+¤µ %§9¶‘v~û–Y{Ôg¨yÚOaC–o_Æ+Q¬Qy�Ô]ÙãaÑu‹K1ø†Z;k¯Îê;T~'nİ @Œôº·Eœ¬Y ¡7- ¼íV—ó|ÚlȺ/"à©g}sZâT“šo/,¼Ïq2�…2ÃbðÐ)Ê&yÏH™sÐa¢š!¤ˆ¸mæµÆh,ä\t›ÚÅÙǘ(Ëäe°BXó Ñu”«6Û-·¤Ë5 Óþ²ñŒs'£\f�Ò±Ì"bŸL÷%K³;Ýòk«£T)]Y¯7,”áe ¦�ÄÅH4?#ú9ŒÁ½ÜKÄ3dá£;qÊW»âÌ •Ò¢:is+žÂø÷ÅR’änaÌÜðY€ÛÚÝ\ªYMZYÒP j¼¥S6Ç`x1x'L ¢Ý„‡ã-A‰™oOÉ]Óó{Ër&o˜ºÞŒIA¼ÌZIšm…¿¿Ï’ú•ÿØ$v¼÷ÿ�ª…Q醃�–¢IÈ…ÿµ½XÈÕ�›�ûc_îˆê‚aRâäsï²™)iFÿÁGôçÁ’˜ûWýDóÁ¾¤=‚¹¤{ òšê>èlÙ‹sõÒõ†ý¡˜l’`­ÍÿÚ#§ç¼Éón5 ÷æ}üÇ“-;I>ÓïÅÛý<ËzøMg§Ù�?goÔ�$’�”©Æ EõÚêì€Üè? )bu$£‘–9ܦPP•ifnÿ¨†4&¥t‰s—¬"Qkª.y eB1Á2ò —)å¬!s<Û6oô2Œ5ˆ’®¹Nƒx,+Ü2"+d$û5¾ÒdmSá”hfG¿IPoÔm“ÜF‡zÀÈsP=8¡=�rP‚äf·×Ã%Ÿ÷õ §"0I—`³#<Úù("­ ¹lôakLÞ!‚Ï™°ä˜gÈÈ@WÌ«ø½xãs²G€‹Üsú��ôÇ-qÞ3é¸qûô“~„/†h8%ÏîßÁC^ô¥®F_³uf]Œ_›üìP {�åã‘7駤9ÃÕ›1ÿØ{ß>þVÙy©öøô«8g¹ôˆ‰8ùvñ“(£átLˆ‹^ _¥í‚�Ýáu)J»ˆ ü†À¬þwÀÉ”¥y/áîÀˆ ‹íШó®`¹8 ŠáÖ×ò‚×M¨Ví QuËyM«™„jõzÃw+¥˜Šr”kW6˜+jáFvÀ,Ju5ÓQǹ^]Šüïï�ª×Ûñ–“#Í‹‰’Ûâò¾äËÿ­h,ŸÇ?zx¿Q¹Õf©q™÷0ZÇ]e<²Q âÆ È<�y¾˜Es™XÙ½¢¾Ñµ°ç<Ýuy‘“ÑxêVtÛŽc«¶,—.T–Õ), ¾Rì0óíæÍ ð5ˆnîÑn”Š"\Pdq“^18ζќ¦.  ÇMqôNNHAÑ££”ë¥Z¾EÊfÿ›ȵrãðŒ�Ÿ•¿�cCìÇÞokoůoŸØe’”§]y>h,,ým€/È,7k·»‘þÍø¼ï#…f}Æœ5ŠÛë�Yom^½%ÐN�5æ�’1„ÒŽ8î2LòCXß)†Íª2L?ªcÖ?˜íýýïç—éÂà^¯8Öƒ~G—¢²À\ÿSù²ï­$Ï ¤³áê("Ùc˺�CÞØbñýêæºæ0£wôñåÄf‹'”ÁA!�Æ kÓ~û/X_2ä[¦í ô,{™¦óV@¶Í U¤qX¦·­ 7uþŒë¼ºà˜7Ä_\Ù­Øô•ü²$ò–Ì`ÃÞ�jƒ]Â%†½Öî¡}¡ïnNyÉ‹×7 ë{ïC›¯|ÎÆ¼Rðp²<ny†~b’„F'µsØŽk±:ç9‹ç%¯‘ ѯåðOû25xqîPûf±’$0ò|«ÞZñɼ?oS˜¿Ën�«X³gêvl)x»(‰� :…ƒ¼ªÈpq¾-½ïÅ/ ��Á}ͤÈáÎ ¢2ž“L37ãÁ!kúôû³šßj Õ§š¡ða[¾r¢åxdå"ÅÏ$‰¾U]“IÜdÏõ;O7hW¾®p\‘ýXÌ`†.Z¥:ö½|)ªi{œ?#1º”2SR9÷�œ:­î…C Õ~ûúÁ3T+HR÷wÈÔ˜9K3¿°þ¾ªæã|l)‚®éY #Èõ¥×«çø—´)õpœÁi4ÃÓÄiïK¨«¶«Þàü w{¤Ì.­:¾÷ºž'›}iH²B|çw7!èsv?15\ „½m¡q�¸§¥Õ�;¨÷ÚË>«*!Ê̼?4ö`”6gk„ÂÈ;æö^•Ú`qí##¬fe¨Ãyäc͹�Þú5K9yyHå�îøòv°U|îß³êõ¾!Nüõ�¼ÍÏ}òí>%¼œÝn[¹›*R¯®�ÊÒÞ­Ù¦VüÂAûÉeÌÒϘ ¿)T\¯sN²+¯P|CLïÏ� N|ÿÁ“zþ@Ùú=4Ç—mMÉHäÇ›R D^ÿ £�žَ:˜•ÞŒ-IüFˆ …Ä!wPq³¢—#ŸVÆ(mæ¤8â—6awŒPÉJ>¤ì8}�¬_-v1ÌžKdнy Í°ã7´ëì$Ò0wÎXyfϾwÕî3Ÿ̈ãcƒZp/|À1ÝßWìòQÝ�·u&Ôç ÆçæZO϶^ø§®iø½É@íߌA}Þ­Ûbryƒ¼E�4¹ß§ÃC2Û…óN°g殢úÑÉo½s#HÆÇ�ûÿ;«kbnÅcŽPö­D¤ÿXÄ3¥’“ NŠVJ’’›Ý�£“{1õ®áÝRº4ù*4á7O¤uk®Û£“pVkM�’2†­© V+ ¨—`;ø^ã?ææÑ=p¶Rúl‰7TÉa¼K¡¡*šÉ�=#ùŽ èã¦Ä\S³äåZŠÌ‹Â‡üh$ÃŒ2B÷d˜ö˼ãõwu”QC¾2¤Gñ/žú ÊÙ(l9äí(¯g+|wµí,˲GÒ�Wˆ/ÔüÍŸc 4CÐ?dH�=�å `ÎúeÉ1Y;ƒuOFWÍÔ=˜èïé\ƒÓº_)¤èߦz‘ “v…’_¼µ1ìÁ Ê cüÛ&n_›Ÿßu‚Éú5Eñ ¿‚Ž\ðÊPA^¹Ób®„$ð? u1dòuzäà”žŸÃ{HGîÍ@ˆ<È'å'y MÕá ôhwÇ߳ňñ=¼ê%O>æ"ò}}☻�îm9ÈDfzcÀ;&ÖÇ„+¦O^{–bopÚ©ÜcW±æˆ�v4ÚVRCùœºrõ 7J©ÉãêĬyÉ/ õ6Ò²zës.š£s&ֹɋÐùªæ3H47ò G¸™'?ï„§›‚,Ö¿�xu>„ÁfT1ŠgÈ2qò¢™²WeôÍÈ`𕲠×Çžòìø½® × e’wæ²HýœyìUÁ®BFv�Á#=§XÖã>¦±ˆ× ¶[»8ðRÝLý0¼>'³ç‹4ýGº\¬e³ÐÔ¶oXæ|©íÞ¼J�ÃlÌ.´üì6ñãîMAîŠlÂÞ1ƒòp<©~ï½ð\+\131ä*AÚl_û +ÛÒ"Ã-dšßg \Ôñ=ðŸ5M{Û~Îs�›� ÁóMéÊx9¿8ÏÌ øçç?~[—ˆ _Ì.aÖÙ¯Ž6±&NÂÊVrêuUðøÝëЋËó|õÔ�_Ã3÷#QâÑÉx™ßisC£»ÍNýÝûÏ®G3\¾kZËjYåÝ%Œ= Á7e÷½ÛÛ-A£"ç‚GÜÑ/SÎÇMÇŒ\6�áh©D¾(ÌÇSwŸ*S*ˆ3^äRvŠË%¾§‡ˆTÖ ‚&ÔUq gX$[:9ƒ…/xìk•K²Nvï˜Ì«ŸÅ|3ð�HÑþ#Ïps„¸ô?¶2C%š/QÄ,mâ-êÈ—­§äprzÙ°_’lƒ?[1Æ"OØqrnΨ.‰;ù=_s®�LøS¬>4ýß­}hUý¹çسc±)‘^ñaGšñgÁ�j[®Z—B™œ;qÇYÁ5¶=æO*»G¬.wt叿øNnÊ«:¬-R:^®™àŽ×!Ö�kD»¾fþ¾ fˆä[DÄ\õ§n&}o€ÐDql‚.vûZò%~Ç]S.k~ž6òÙ¥ñO‘î4MF”ãañŽÀÈéóyòÏIâñKÕtp]NÊ ïÙ®Þ›mg ¢Ùëª ´€h‚ƒf¬Ë:‡ó•#˳d·�Ѝ•qãgvT œY�-‘÷ÿ«§3¡ü�‡ï '7D¶SÆ*éãPsV¿¥¢Ô~‹S•�WÏCDØßœ1%ÈÏõë$"‚Ö0gÃÆ ü6B�þO ø_=ë"9ä'[¹×—a¼x�L^ëÎúèxGlUÝ­{Z쪳¼¸ð1]Ök×’$F¬£%Èû½ü"iïå×4‡Æ–U ÷0Wj”�DCmWóNÛÖjÆØ¡ˆ•Œ£ù5ûÎöÆK;!à›9+˹ãœÍâ 4©&Üú!0ž=: ¾EŒeHÏTCï0³æî¯$H4Z}ÆY_wÃæ¤¯è™læ7œˆ r4OSÍÑטnE`F}¿¥K¾ kÐ:ò­‡!¸¼PˆÚp/4ž¾x\Ãï3·Ñ·i#xéÕ^±‹¼r”ø/H%Lg5Ì6¦Aµ¸$ó*b–í )ž+H²3xu¹AGqAÏWlɲ`6¦j2¨…G� _�‡4ÜÑ †.<_@ÿØ4è¢"ÐÜe¶�eeì< µ<| ùðš�ÀH6?œ£¼�Óc=â2¿÷¹9âôf/ýådwÿçn‚„ÒÒ5è vj”sžs%ðxÚl­ÔŒ¼ÿÆß¤"`‡Š+†ÀSþÚgJ°IÏ¢ø°¯µÿ9>/òHÃ~ƒ¹0‹ èt…:~º1$C�8?ì UÔ¤&“ õÞI¦:G—˜TåÚPhµ?ómsþ¤&Ü]Wr¹°aKÞ gã²ñ°Ã�ñFs°hW¹‰t˜õ5>cš¸uÞuJ`°n6Þ¶Å�©s ’if¦<•[>SHo“í»¹ÚAËlÒµ‹Ô7¸=UÏʼnÍpR ܉²íy2Eýó£È¾´ÍRÛ¼/Û­´æoÍx�ì]Ú²cfÚÌX\çÿ ­é�¿eÍÌùÝ¥ÏÎÇÖî:ÂŒbA¦ÓËãÿ;ŸÀé01ÀŒ¶Z'”`ëðT7È–p™,LÓ’ ¥@ #Z_Jr€kB:ƒç´£—¤/DçpkѾ0ž°éëý!�_5]w¿7y¸Jž�§+èÉáO_zÞ·úÒ¥oNì´ÆàDoÅP}òÏO0œ¬AÀf�`9j’åü.š¡E~Þøk×ãèËΰôÎíê õîx‡-gëŒÎ‚•ÓD]fhÉ´$IǼ&ìß{Æ:Ý^Ì©\p¾¢W2§«xaˆ÷GLâK~?¨]Îõ}ÔYÒJ½\fhg|±&Ü2z€†•Ö ôIœD¬ö‘oy²m¨H ‡å¬�œbsnhRÖM5J ƒÿà¾UÕ€ÏÞÏ}-Ô�AZ˜A�Â�o›Ä<Ì.àn9ûòÝ€Ì~ 5øbÛP¢b=±ÿ§`ì8Üyñ@±#ú<4Û²4W�úG¥ê—î8ù»ªç'Òĩŀ´8ÎÙhk²í.–ðýbäA¸Þl©™º>ÆÇM‡÷ƒ^Šl)9 üÏàÌ|ÖØ3?wa’·•.ºSïî4·F+bªÈAÂ4Œg)JB' Ìo°nö:_–Þº88Vóˆ%ÏEÜ}QjÈÁEÑ+¿Î�„ 1öhNu9ÚàÕoRÿÁú¨²P1|æÑ£]?5ÐÉÝÝ7ÚYjnTÖîÐû1š7þÛ¼C:±h\Øé¶4Šâˆ<�“Œñ“É q»g.YÍðwûÕ´éÕu÷hðisi)ï/¯˜�#ÂûO»_ bL ¸pfGé³b§šÓê´°¬RÀ~²'ñOÊ"£VL:ù3`ø#‹AçãØøÊù¶ØñÒ¡‹Û{zö©™’á·æ¿É·¯ígÞ v÷÷­Y¹Ðaû#Ú üPS óÇ_S¾-Ã�fæjžˆöö3Àöͦì¯OÐ?½Ä<–fá@¦Æ1o('0¹ƒÇ,³÷úᢵßß7’¼ÍìöÝK)UŠ~æ³åyö‡zÙõiN-·‡�BK}©|NGxnB¶dU2�5oa ?qWgF×pÁø Œ;ƒ�ǶÁËÄøˆáT.öb ʼ Pm[Ì­*4ˆV†¤ÔЬä[%F̳F yÒÚÐ[ Ôy¥á»GI{‡ 8áé‚Uâ†É1øÿya|M°Mˆê0d`‚&‰7F.˜­­šÁÈ’óp Ì]ÞÊ¿6Ü‘9~ ¥‰l~Ü\͇È;�®’£øBž{…×N/Š-bnOdÚW½µâÔÊio†üó�¨Ž�(3è0`‡ï³Yów2»t½1_‡üéÂlV AK9�´N€yèpÈ·pܼÉjz·\=qWÄøxÊ8œpa�'òŠç0šáWf¬ &M[ÛHV”…G�6ݯ­|öþÇ�ßccøŸýg¶¾„½ä¯Ð¬Mƒwòß§¬5¸òõžº§}ðhÒús¦Ï©�»ú’Kwãnþ>Vðšv@0¼.'ÆÕcy¦ËøJÆ4g6˜ ˜º¦‹hp,ý»uG±Øå3šN¤L<›‘P…“dÀ¡½ù2“e¸)ñ–ýS•°…ä+�%ª!Iöü[Ö!Á‘´·U�Œ7?ì5�ö7½2àø£g]šö 6ÕÀsWjOÌéq«mÔáSDr� %A(ÞÔ<êEñ¯™‡žàa¤ªúÒ3ÙðkáNòw´áÅ`Ú3’¬ùËå|Ã}ìןÉnωĬ܋‰ëŽ{·á©m±�j3Õ(xWcæm/¥%ÔqÓþ?5‘Ó\<>^¾¼·6X;¨!@Ö;}ÛM#Jø§X=½÷]Ê¡ó<¶ÁN‡Jm8@�oõ¹üGìŽ*á �×|ù>”s–’pd§£¾¨ÙºTŸµ2Ð _8½,éœb±±�¦!FȆfà l¬«�:BÖÌãÂèŠÉh&-[)M±€°ÐðÅâuŽð¾Ž P™7:Ô2´ ÈñK#•ïË¢)ÅiFR�‚@Ô * @GÔ Kàq‹ŸoÆž·þQéLg7ý‹0¯c&hXæ&G€8½‹ná9r–ݽÏx~p\p†O­ÊÍ]EÒŠ+Cº?¨¯~»r‰n°‰­aB“_Y­^†T¡À©½ú•›˜ðV‰’w }^óÏó¢àyåø†Or¢°!þ‰)½Öùf…jüñªÉïùϵ˾b"¤ »…2¤F5-i3µnI•råelæµ£Å`ò”÷i{kÊÆ‡©”ØrÁq¢ÂŒm…œVé -pç©l½Åé:ßjXY)éÔ¸u3ל>n×g2ºœ•@+›×™µ‡À…”.•~ñý!�‹ãÚ­\‹û´Pþ—Õoœo7E/aéfÀW°jÀ¾¬!°À5ìZó«ñ{·‹dk_‚E²øcW}ó©¾ÛÕ—nOC0Ž&ÄÝÞÇès—v!^6 2™Új¼–Td#2cT™< …›IùÒÂ]§¼¢S.z(Ž4yNb1Æbr0f•ŸB:b·„ËYµˆšF½Æ± |ú—£ñn²7)àØ+qw®/:¸…€DýqƒtCk�0>˜Ú�œi±“¦Äulv稌Ú5ñÙœÜ�­]*3ãØ;áÖ+óËqÞ$ ö¿¹úþ�œäÝpKyÑ Ìoñæ¨t“ã.Ø@ÝžTñ™b&朅Dœ*ÙÆE¬Éì–$fŒg !Ѓ¢5�{ã£p›†É™¡ôg<Ø{?e}=ÎH/·´•c¿gü6ð¹¡ñ(–òÅö—Æ;FÙrŸã†¢ùýøÓö´æ»D�“›Ç"•SËÏ-ç·VÎ2+ýYälÿÛž¶˜àÕôð®H�Ðô�6ý~xSÁ²æñߣpúßBo6ßIÌþ¼VcÝ?÷ú� È0…v& rx)ncK›Ã\ÇŠñQ)Q– :°2c4@cuÌÒ£u¦®ì¾&ôÇGkTå×í(lÁA­ˆl�,›gx:õÓªSàÐ1ˆ…2§˜y@ôÇ& ŸùaEIËkBªÐ½_.³Vù3:€Ýh�ðô~ƒþ¢ªy¼OÔ~iYñIy ÐÐ�&0|Jáóõ°éæ¿"ó¦ˆBKшÕjk^Ÿ>UG‡Õñ-^¦5%b“IüÕ[–´Ä c@ FÍŒLI3÷<§;Ÿd-³+‹™îû?¸ôžÖéPk8Ñ Ðh@”®z�¦Ç(ótXCÂ@#v#¿«á ‚ûó|þ§¯ªÞì]»µ‘'@5­_Å«=ùp©zN»š'ÚÇݳÞös�=ñ×'Aôwb\´Í\ú×Ñè!e¢ZÃ,ŒX²=>Nß±“žÎ�´ïÕ}V�øÊ¢ˆKÑfµ|]â�›Šÿ•cGHU™dS¼ecJ¨dY°Ñ,ùçµX4gŒ�g6d.Ù›��Âwrÿ¥ ‘d>y´¡‘}GÒ9Š}æ�¼ñÒÆzÖ.°£HäË3¢ù8SD‚�˜v6õ-Íks› (¦ÔBB6bAaZ Ëï¼Æ½ÅyÏ5Of)È6ưY”åzƒEÎ6 Ðj��†*¾;ÁT-î¢î�vÖ^,ŽÅ{‹e=Û±AÏ÷ ˆŽœ 1ã«jŠSá&ri€Anˆò¨j±A»çÔµ+GrÞ1žô™åÑf"$܃•öÄàVT°-š ^õæ ¸°¾ÏÅVAÏÑ“5¶sM –ÃP8ÑÚ7æ�QøR×´¿™ß=�¯‚24·OeÍÁàÚsq§2òc4C‡%Îq/j мqþÇ`üœ(Øf‚àÜ8ÇßyêýÊio‡¯Õµ¹æ¤‹Š€(RÍfœœoãÛA6ß�˜h©üP�Xlû·zû—\vxGuÿŸ€¶gmÒÝ•'Cüà¼<ªýê<ÕŸÅû‡ªÅO´² aCÀV´ áa(¼£Z+ñuórS‹"ö3[Ò‚„WØÐ(çüë«@2y€åóøšÓïoØòkœ@.xømwy·ùk·Á®ÙB ~‰ë�¬Us{þDY×gû|ÅQ*>ÎŒýCîZïœiö[Ž|›oG¤”Iî¥ÿ¨}úÜeòÆme•gˆP£(“Ü‹ªøsM×�qÙ(ßÉnçã=*¯s Ô‡àðøO¤3�.=½»¯1›i·B¡Gy?(€Ñ}eð3©v¼9õt�ËÄÂfüjLg6¾ýíäÅ^�•ƒãëw8«SÓɦK·ç–óêYÞŸiÖ¸\øºYôÑôp‚BH°|0Mɹ00¿üB6f¼±øîÑ'‘]Ü&±Æè›6(ÉÖLJL�Zî%hzÃ31.¸› éJ;6Ü4JtžÙÿ,ëò²ËàÓø¥ÒÁ¤VËõ×a“?ÿ̰‰´Ý+OvÆ[tÑŒÙ§ÑæIQz%òÙZΙb� \aÙÚsÿ$sO«ø|@Å(öÞ”†`k6€ß5ïØç«èdž�çì1úÙp†.T͵n>ÉBD}üVÿ‡“xA»i¼HóŒ&aXl𣠥�Hm&<$iQ!±D²CNN¼Â°!ò‡UÃs8Ök{·Çñ-¡?Î9àòÃy/U5�è~0Óç)Ì�a4™a%åÆÄá3†/*“¬‡hŽíÐ+ÚøN.ë»™åÑöLRêç¦*¢B¬e”Åê„1�H0!¿†˜q+äQ ´Ù^ýqaáÖÇWŽ”�JVoªK�óšÆ×«ÿSJ´S`] Õ¤áYà®:vÊÔŸ]÷¾/5e¯o;¶h\u0ÇÍøù—hÑ6®G×r+þ|Òz ÜÓ �ß´Ùó ÖL5Ij‘þTc÷&5¹ySXÚÝ/3'(HGh~Ýàk˦ŒßœÏs}Õô ´{;iîP•|ð•meÇÉ`V2í¢®V— ÷·údºî¨ù[ÅvíStÃû§BÙ‹ÁÄ!û_貟|KõPsÞäv¾9«ÄŒu9Õú�úó¯'º‚œÍu 6ø@‡„Vä7‡àè\ðTqW.$&¥AIÒ[ç¶õÅço·Ð&Á •§lƒM >–<×R]Nl¯dÏA•n|Õ°Ýè�68:@Ô�<õš[ÕäìÙ¼¹ÉZm¬oþ_ºUïàNÞ‘Í�:÷´úÍ_õçÙÚ Ý—ù1ìγ–*Yû]Ëø†ÀTôÿÃ’°FØQ®kñKà®Ô˜,3QÉ9µË?a™G—Œâº3Ýìot~ âaÏZVÈ.ÊlIâIEpÎØ@NÅ¡çêÏC ÉQë&Fê.�£ÑÛ_Í衃[ž±eÝåÃcCS¢uíFSÈ�=ôÝ5e÷#ÄÈÀðÈ­—³@¾�=|ð#A↠”¬‚>ÉZmÝWJ H›�{’ÿŸãÀ*öi§ð_‡»�2Aù¨aê–g^Õû·�Å�Ã+#SkoFÞ¢ Oùß­ý1)®®Flki·›Ã¾7ÌÊ § „2aø4NzÜuuP¯Ý“$ÝÃp¿Ô¯ß˜þ”RrÉúBFç“� Í4„˜Ï?/ûÇZ?#ê_ö`È�¶BAÑ ‘æÐ��(„„|ðóãþ—?™å”#”qì{žWH´Äu�›ÿÌíÓ›ˆûÇ`÷„—ÆŸ÷¡1® ¤€Óc‰ÿuûÏòç徯Œ5 .ûÂ~¶8@vi$"ðß Ê†½.âà¼�¤xb�x�uºíùêî¿2„�!$‘5駯‹[µ,ï‹ìòÀÍáì cš_˜ì;ÂýoZ¢w A §ªrÓIÞx”©ÁŸðÌÀ‰űL03YÍ::Sƒ\#uÄ�–ÇÊã%e°;‘ƒr,˜€y'ª�9ÿnŠž&ÆÆáf”L‰ñ^�¥mÓú7>9c8ÑddËÑ¢(�â3ï&”B aIæ³w�qX‰WAsßÎO¸¥Jn ÙýÙ·y3ÖÎOP°iÌ[pDøŒ²øW2cøÿ:ÃØ°‚à‚˜d·êÜp›á1A ¦ÿyÒ‰x&)¾zü†RÜ€ Fs+aT’F— [«%Z0gèïò×g¶@âŒ\eÿ3¾á,D³•þ ¬Ô<\4 Ã)ŸÍó]­¼8K¸‚;HΈŽåÇå#i¾Ïg}ã ªRÑq�ðÓ ••]›'„%€=Pˆ1™u1’avmWŽ/¸.ßÄäx”Áåž 3õgÀ‚ÿrâÌB×u¯ß t²€\†Jņ¹–KìÍÄÆÞq¯ø‡—ÊÊ€(m#�Î�ʈ†‰ßHpÖä.=¨Ý†Ê/„ù·fÇÙJÚ'‰âßyäÛå,Q¥üz ÒãÔq' ÓEÉg®0õ³À'ʲ¾y9½jJ“Ì ¼U¥ÛE½(¹�×…ib[@:Än.A(˜¸i=t�PØkVÊ¡°÷ÖeŦŽQ�ýÇü¾Ã/»÷„JµÇ°ûW�äû›‡½DÆÑ�BBÆ;z�¢/ÿ̽¯%Î!ö߯O9N?2Œf³æ ánm-íïxOàk B(!tßìú»‚KêÄãá§™Äb·çJÐ[g¡ƒèñ}ñMÒ‰VÌçÜÊcxëâëÇÙ@Ik¦1†Í êXÛ4çÈS-ä8•#ÒSawàöñdÕ„w~rM%U¤#Ýš{—ŸU²³þ�ÐAõÍú²RS>bO–ÓZëVÿì]½¸µ hѸ"èÙ0n`Õ‘ 0% m÷4Ú%M[)|¸ÄdfËKtM„¢�¤ñ*K€ÑÌB+å\>‡|Ûc¼óÊúëŽí“l�õë¶œa^è”Bíâ ]Ñ ´h¥%¢«þ#»‹•›ߟŒ*$‡Ä„zD`XÙ6L4š½�AŒDÞòiÚFNãT¢H²ò˜&,ùÚÔæfL-A‚LÚ¢hóø/±~º†´k#Úÿv>ÙµèÿN˜>ÄùOAPe¿p<ûêjn.ñ¼/qrS3µ@•yDÿ¼èî’oàÝæ°â)ÞM8�ô°ïÀL¶ÙÌÜ\{ª×|Åd�éùéznùxßÄÞg¼úíäõÔnã“�LHÏÀþ§TÁ„Î~wûÕ™ àåü;Ò®dË\Ç(ªúU1õÏm„ÉTî.Ý»Õ< Y $Ñ›z2çK7¾ð˜¬Ó¦Zþ¦0u¾ šéž„å{"íJünÒ7{ŠÑªELž w:Ýn \þØ]yð×çðc¶T×Mìø½ŸØr£›Ÿ3{éþÙÇÐo|sÏ*¼Ç9³‹ž0Æl›Px�•î¼¹@| &´ÖŒªx7¯Ù'¡šxú¸ôøx%ò°·Îàø*\ Rôh?¯£'Þß:� æ�Æuq“Vé;±Ì¦ öxòUh :úzîµð·{O³J_¢‡¥ã  ºËFÅȆ‹{ð•»{ß׃áë'¸f3&ô°Ê]Y#hŒ´y÷õßÏn‚sFêyαϖRp»Aƒ\äÅIZ�ÓÜÞƒ˜¦ÍS~À-ÿœû—äjÇRÐ*uÇèÞÂ놇¼ G(‰·Håm§#ÌÖº¨kÃîÜm®$S:û!ª/°J†�‰Ì­cúØq¶‚ÖÆ8Ë�Ë'_O…Ð1׌¶�ô{�ì}¨’R�Å,é�u?Båˆ=¼wÚØú�h@½Ag°9“yKÅ,ýÚÅ®ÖVËäËŒÍM¤ C³,ñu0`?�Œ#,a»Yñ¬…`¼M²”±Ç DâòCD±I€ø÷(xd scnûW-mV~PŒN:qü„Â�úÀ…_tp‘z±Öü!îèiö¸oD®@¼ˆèÓ°R§÷µ‚Q]¾°~…�uŠoÿ& órr·³jSq¥É¥!Ô?~íÅ_ôó—ÊÀmæ �¿Wæ9aíðäG¦9¯%vZÑmXG ´¥“ ®XfÙÑ^[œ™‡ÄÕ»mT·ÕÊï( tæ$ÁÃ4ùÞô›g©»0¬H[lh«ºØ¿gðç=˜†¶{§ã缃ñžî ûƒƒ‰æÚéHà«É_»šéåD6±ŽÊßc7³PŽ™[K¨ÊAåýÃ^þ8ò3Íè}Ý•Cš uè-_#Ý�½ù£Œ¾¢#{Vÿ™¯™+ˆ.—~Ù|8)Üo™ÄŒMîOÆ|dÈRßï~”À3ÒaÇã&o-ÓÎôYq¯Ï?Ýi[©¬�o^çF >Y L¹iDS©w‘î6¾¹”qj p#‰‰pcMeËÈîtßáåº /{ã^ôšH!I £þáX­ÑÆz0¢÷ k—*5õTBZã‚(`ýi ådxýîðéhÃÙ�a+íUÚq§"ð/J:Eóq�«ü#ÏZrí25ÙÑŠ¼’بæÞ¬p à^�9å^ RNó-ÇËÄFq«ø*Æ €ïa1繆|oH¦Þø ü':L²ñüæ_-}0�Ì×OûkÛ¶EÒÚáv½›ü¡Œyà®»—KEr�· qçx8þÜ6&º¸›ÝßíÁ`b¡­Ð1ê–¢ÞåÅ�ó²í½�JfªiÊ=N4ÀÀdƒšÖD eô9ÝcFÔ+8;µŸ;•Œ4)úS�_>[Z+��$Ý5FcßF‚šlI?‹8iö�•ÏÔób¯Åéø†BH�²Š»hfŽûr WØÿ€-u½Âwi®A¿Zˆ‘Kh�+,Rq‰Ôë×RØÔ›Åi€<™ü “c1„Ñ·Ò´I�Ÿ¼òÒþ^�äg (œ†°`È9½®/ŸÆÅ¯Sp»Ñ ]àîRz°© ö1 Ç+ÄZáewÿê °y€"Ìo©Ë{ÉÍ©´òÕzrtû¦÷ió£U2Y=D»œž3fn¼�³ý§5žô/ù O¶4­mÆ–üâ¡6ʳƓPÝl®IææX’íuIO+O"£›vNGŠÆt0Iwi[žÝ1¨W&¤XTÑUkJš$hY,VɆ|ë5w¿ø•�£@ }¢Ý&óƒJ¾Œ_Ó‚ÌEâô.ª0÷—¼>ç¸í_¢yŒ¹ª¡âpÅ¿#:¼I_I’É5Ôð£n±Ä¬ž‰ƒÍѳINª­Wªj‰�Ëã�§ÆºJà…c‘rR|mõ—<éñ[ž's¶CWãsÜ÷}›ŽQ^�‰©i.[.÷íÊWTp=\%^’v‘QwñÝ…àä¢fór‘/‹¾8Bô’yän·vÝ߸mÇE D‰iÌŸ8Æø›_Ûç�7B7E¦Óõm¶øõôºCLj߯jö­ÚÚÐÙ¯OYOÃŒ‘+¥v¿§óœbÊÍíÈIr?¼m¶s™SÁûÁ $þÔovµ¿ßá.ÿÂø]¦¿ßV·ˆ˜…óש©þ8†uÿ»<„iða„Bž mц—ožË…Ò4Ð…ñàô†É˜.~j¡QçÇïóüýöì�(ý-¨Èìô½cÄ¿ÁÔ‘uáCE¢YkJ¯¤ªþ±k}3£ä•-B�gþÛ§`Z= Ê–‘“»z¦ºÂ�î>µ‘ïå÷çvÚµ�l˜ö½#h«vüš½ØW5„gbÏÞsþÄØ{b—£M•\«_�õ1Ë/ dRô¸G¬FÒè+ó;…°öDà¾+ìNŒù2�fdÐdBÖx»äÕŒ7¾Å¯ŒåUÎVO˜fZ¹¶eŒ g-ðÐÆˆ¨Ä&Qt7¯/±½³àÒLm,öMŸ�÷ÄÇQD —}N–†×ï cš’Ô xÏ8óh,ç+ð¾DA¾p2» Çy�™ƒó¡¤X^¬,ÖKæ ï µp:NMÆeøž4#å6·!tMš‹{¬æ™–Pðá1 ÆÞôæVùÑXÒä„ýŠqš8À#ÏØPƒG{¸Rɹ!<½?™ |èøò’ oÂzËÙ?�K'=h2:ÊÇ'b¢lN6:^žõô>å^2Û<•†-‘¥›ì(`ÎÍás ÁãÕB!nåÓ^feZÚ­{®yi0¬[’7?Kæ §ÂbO¹]• ¦‹Æò—d`×Õ2€œ™‘Ÿ9í=})>Ɉmø›Ö:n?Á= Ðè¶E³JÚZÝ‹¯Àú]Öº»d7€]*âÖú{Nb¦Zã\kʘ½+• }´üÒж­¯Ú«¢ïÈÎ$k85æ;Pð#i{8,þà‘³k‹\7_árÞÃz‹ÛZð&�“Ù&Ê;žBè*½ƒžßHpCzÙ1šº ösg©*N¸Iˆégˆ9þJyYÍñUœÚ�ßý›�ø¬¹U ª>Æ2*ÓÄüÓ±çuÓÖ`AXû/ï‘âýØÑ"çö†POb§ndó½¢$â}*ë�V\¾ºç�,I4Ä¥øsa‡É²}âxìMÛa‡1¤ñ¯ðéýYÎÇÇ‹öEîS~´9ƒ» îë´L$Ý¿]]}@g¼ñ2^ê-j€D…Añg_…àU �‘WXö†êvñB ø˜ÁÜJµ¼@¡¸Va³_—H2f—”È„‰®sÈì2w+!$•¾—Í—_¸Þó^E±^¿Òá—6 ¤a°Å,>³|Û cà1M¤¸«ä lñ ”öUd‰„Z‰²7Õk^ûÙˆˆwà{¹g>ý÷ï™Ö?~UÏû[#'YOÊ… ?/FÕa­$z3Ê¥œ[“ûþØ~«_?#Ÿù†óívÈ"ÿ„Í…õþ¥h¥½tÈ.ED6�ƒÅH<¬ØFXomÞõqââ2Î*®¯vA'¼ÈÄ�Ï…o¬eÄ ±n>ÜL™õ#uVÁùY° Vš[,4 FJŒ¹+øCíÖb @ªËFžm½Â¶D®hóí­÷ß�‡n×ã _"6ƒ}î@‡÷úÊ¿´_F—+=¨1 Åô·j¦ü¡Üÿ·_Îè…uh†ˆpŒX€$‘FÛ$¬0– H $ß›Ðã²7bÛÕÎy”³•œ­' t ãá‘/_õXù!tp;]¾Î!Æ’0™fo¹ °ð;»ê¹)×k牊^SªA¥ä „ b4˱,�å†`ñIaŸ/‹ƒ'çiûGª{Zكѹ�oP �üæ0F@<‚4+h‚ô«å °sá¨3 r£qyelPííf$c^3\jmL%¬³-i²ƒG¶fmž}zѽÉ,n’ÀCõ¹“X#-%ÒÛcϾúNSÝŠ!™Kã¹ÆZFi™«LšÐ�$d%‡Ht�­rt~–“Ö<bV¤»BP-±ßœ¹×ü�äØékz`TÛúŒðQÀºòQ[Ĭûu/Ã÷à5¿³-š'`¤VýIž}ç1{ââ+óYAd©½„÷ ạl@¬'®vlÚ ;€öCº[ÚvLúƒóŸJnmAÛr-aŸ7±– D=Ìé²Aê},,æ¤1À½ÇŠÊO›ä¼Ó÷ ²ä§ksÒD ¬ÒµËûÑn͸zDîÂ#y›8ó÷…å}> ÛœíûÑp°�ð± ÞÐúôäòè†oïÀÚ½Q=¿¨]µŸŸÛû{Ø#+(K0È×ñ�×ò™ùº}ö{MÍÿCÓäʽì™vWöA%Ùž:×°éøwÿ$Z:oëwË}ôŠ?íQüÅQ9ÐÁ5 ÕoêN%e…)OÚ}x…ÒDd?�!Sâçtë¹X¬ÈûØq‚¶uæ0_ {Ðy]ø’C&G6W#ë.G�’Fî{¿?ùÆÇãn .Ö�*K¶tÖ bˆ…t&ðßV/—…õ°éäîê6ƒï~=›/ž"+""}¹®…ÛÆ\­LòQ$çÎ÷×’ÜWfÙÁч´ŠÑ†u�²ÊW¤æ¬ÒÉïµZø¬-PXáIYš{‡øl(Ã`êÒÉÛ2PY¶Ã0ƒ�†¬ä±´xkx-íÂm‹Cdt�ßzÙ/-%`xƒ›ëq$rµÊ&îsYÁpRâ]Z ¼3¸�±ÍãBµÜâÝ“¶ªrc™ã Ì c#ÁÇ‘åÛG:„Žé.@¼¾÷«5lø+q�ÜJ/»Š/,ý•×@ží¯}&�:òV`½´MPO¤e#ž€ÛÁ-stÆ@˜&ŒnL™e¢îÜawzÇyÍ1š5Õñg~0–¬*v”úl›)Ï× Ù€p»s¯²£d;›§Œ†ƒ•©,Ëq‚ÌšÒE9k}%SZ@²Éa–nň¸Arµ¯’Í·\ô€ÄÂ{îùÝî !¡ %/ny'ïz(ò)ã °öµsf¶Î�#Ox¾Œ/y¾ªW"�W4ã¢Xb{d+1® ,á” +ðá�F_DJ ?\‹-^y| ÖxbÖðž IgðŒ!÷‡ds*ÃØ<˜.ýÀ`Y@§öúãabÁ 2`l¸¬Ò@zøA?Œ%*[»>•°©®–Fg ²ˆZ2àâ¯È~¹ˆwôÔ†¸ÁLN“TlÄjtT¥_cmA J‹b<}eL¶8íp%G|Sódl_v:ëœj¹^£š –îeuûêù¢ä¢B÷¶VÚnrDyPÂåÑYS½Šo$& ±°ÜJ¬Ø+ý…B¬|÷×¶�'¸ÀV=ˆxÔ÷ZO:ß}èo•æÎ7çÁ¦ðÔ_]ù!ö>;üËà੦£{?«ÌÆGÖã¾¢ê!(T†t&hàQƒ€¿4œžó#Ôž?ˆ=g÷ŸýF1Q; >¸Ý·ã^ \×?¹‘§¿°¿šr5vQ~ãy¾¨†A![¶P`–ÎïNß‚yÝÞw�mo[<k–þå±iÜ�.`yü>�&þ–Õ1{¼ö0vëP!8=9ûw¾‡,è«K…ã_äNk¤- �»c8jNo4“²í@Ô˜w0$)z�<Ðf2F&bÖºjSŸ{ÄÖªÌ^UO¹R}óh5˜bC#4ç�xyòQ°’d9â˜×‚›Y§k“g®ö°PÐf€ÆùÍÁÅjVã)Ô¼ø„žFŠq”ûh�Ø]]~öcYQò²gCoøï˜ ›óXËÙ9Ï{]Fˆø¸@Ný]Æ]sW;H<Ú¶ƒT÷ZÆè™#x2óurÛ¨Èàó%µŽÞû¬ùÜè‡G'KÒVÐ?‡A=ßzÎØÿSøÑ‚L—%‡²ªç—`å¢à›%È0¢ú>ý°Pá°A0ƒÅ¸ °6Ât¼{GŒ!F�Óª¿´ÃõüýézjGò™¨ôðý…¡¾'‘WL�Oz$÷9‰9p’øRËÂí┄™«_Kˆ3%:xe¢/ $á®…ñ¹ 4ãÁ&Ý0ºJ/q_=iÁ¹=ÒxÃÜ…êaÙü΀g! a0ÞD;F J˜�©§ÖÕ¿H�HùÍÂýÆ…$DûͶŒ6ýÂl¯òß«}f�*>¡7èP7ewÍëR¹oDt]ÆÖ²Þ"è�AìúWÆ ’v׿€ð9¦åx[fß…k·òAAÂ?£¼Ê„˜„ÔÓçž; *_ØŠæTùî38Œ$žn•r¨¥îåÓM‹ƒm§Æ‹4[ÞËÝÖ[¼»>5²Jh*¾svœR%ñ¿ów’Ö¹×lÅ7J÷ƒB¾�©+æ;ˆ¹_»�*èíl©6ðXH™¼o¼ç%'¤Ó¶Y™kkìb÷ƒŒ Qõ¾².0…ŒûWVWb"\Èç8àÖŸÌ7¹­ù¼ßHæî4_Ò¶´bâ2€~A’bᆫµÐÃÓ<À!Î÷@.¼OÀ5j3¹oâ 0Ó¤"FÓÙŒMŒÞxëž%o·‹u ñ£X¼\¥œ}Í—/_Ò.fò_I ‰vv ›\Nëžkµ{d€ä[ n�âï¶£p¦ÇôKİÅys#© =Ͼ<Îpm¿±ÞG+ÌS:—ÝÛBzö NÏy³!'oc‡Mý[ù%ÝöxñLvî7jH @�g3&H…ÇÅ6+žµ�X`°[¡€›oTyòÝÃ]¯Ü`¢}áëtr,¥¨Ç` &urI¥‹ Q!$=T“Mü]å=¾_`ªñ³ßgp7¦[íªvÒÙ›ÄŠà”™�TÖ¬ ngDÕ¨€RTë—Çg˜ƒ¢s}ŸxeõçZľ—k®…A·bCƾÇK×Á &¿*ð<+ÛšÓü*3]cœ<¤�šß¥�vùç¹q­c¼¶ß˜¿� Þø&lhº÷8(<#mÇœ/1'>“7?nÆ£›Þô�€óËg>ºR2â-Ð1‚"q…õ™H4FQéè¤IÉר|°Ö¾¸ÓÕe±¦ÛcÂ̧š›ß^D`:FGÕ†ÚDn }é,Èb-™bøk»§t^¬pE-P�î“×\°<Ö3²æï‘‚‘ºó<¶±±Óå¯7!Ëføì¸Á>(#ãX ‰û SÑÃÌty9<øæç>a¤<ƒõ}…ã}p¡F 6À.¾îö¨Qc¶d¤ ; (ž •¸åäa¶¦gɃrßvi3_Åo�å¿3…2‘ðÃcÉ´µNãõ 9òôš<?Þ'û1¬iÒmz6/Oºm‹‚'û–¾fІɾ žû‘|¾)h0ã0¥žY¦â"2lÃÔ4¾ãMx–ÏÂN _`µx0ÿ /{~VË›¬kã Qåœ^åÃïXÙaËîØµ[É»š&çfÞ¤ öwUO&NER´‹‚ž!"ã'{ÜÍÐo^`‹"5RÉäcD‰›«Ó—êœ�-jºÏîÉ/Æ6�ccõ…¿)kÛþðt¡Z[ºsR!-A—.IZÈOÃÕFtoá—+áÌaÜZ �7+ ´àd’Ö²â~&"¨·°ÇN‰õ­j]X¬tUÇ-`ûŸS(kMºÇkY,r~ãרĴøÀŽ|ì–ð2ÀF-lPø³©”›®Ÿ?n÷>÷+Ýg”·F0:²‚8$|O$.Lއ–cωÐp«{4”—`nl.³ØAF\!²‘�,½9Bçô¥O�Xt-¿Ó«Û û®Ì.—'Ãå9°t[re‘–°’$ó¬´tlˆMšéǧ²¶�¦;K“[0j ¤Ô�xÜÓ#Eß¿%‹ŸZ%…®Fwè3ë,ÒAXIJÉæ‹;ó·¶1væ¼Ê箇c*/®—¾'‚øÀ¼±MnwRü9'<ª�í 8 %¬Ë‹!Ftîñ¡[`/³Ê¦à‹:«Ò ç0Œ��HͰGRÉ­9T¯&½Øµ’ݰ ä #žãSŠz»Ž& ™óÎ.w|¦åÓ 4MÂ& ³RÙX1[zßQðwáÄ.wël[Ç�ÓË–.¯¢v·˜ã„iPJx)Ùr2lZ&¹¹Ö>ue/$eÚµ–^üNñW©ScÚ`Ñm·¢0¿3®Hq½Ý‰WM#�~¶k¸ÓÃHHáU%Ñݼ¨!© î|¡q²6ÏÜ:ë¢ã�~‚þsîr‹é›9˜µãy!m’u\ÔËDQ‘æùÃyç†[!ƒƒß?'MÍ•ï¼A) D>!1hþ. ŒŸ”›8åâZç%SÌ T†š0ÌÏ/øV¾ê]äÖ�$$Jxkæhsš�ä³+͵1¨‹Jf8Ú¤Ët²»ýhCÁŒ…Ù–cytî�B�÷ ÿ”Û†¶Õÿ›ÚO‰‚†Ì¸³>gá¢î†�–eÔÁ×›:§ŠôÅ!ËÎ¥2G´—ž"ÆHŸmÞ½ÿ˜�³Q¢G¯ïï‘ò¢múÂ^øGY"™FRyÞà¼|‰�„DDj÷’÷ònZ¸‰~£Ðòìo›7Qïn(0’ƒ�3”~ŸÖS÷ìDô> Ó£%å�a�Cýrša�–‡×��-eE”Ü…µµ!  T¹‡OÈ:9öÆ�‘Xb¸l çɉD$�o’ÛA¡Ä÷âzmÈóPµØ¡YŸ§Àš£D¹õ«4p†2òûjÏã÷»ˆéìÇóN{ýó7´ÎyiÃM$WßÈôæâ\#™’•ZÀ{ΰûë>HpÙ$ö›ÃïÀßI€yÅŒHÁ�žàpˆüð°9£òg*uq6ŠåÞzÝ�CÐP›±¤9ÌSð[´‹heÐz ÂÁÁÅ�î.‚¤@‹mM ÃV£øÀ��[±v÷λ�Ì ùú‰ÛÇ0W; &Ó}•M´bÒDõ“�œQÎω{ >w_˜û o…ÀdœV88Ëâ*ì«÷¬¶¹Ó;T,óû�?7²‰/ÞÜü8ðÏõ8Tó »À°AòzöÍo擨ÍéœIƸlÃË— ¶“´u#,¿ {ð«‡|dS�.píwL%‘KîcLþ—œÇIÅZɓŢp¶4•Ìbç8¡[7+nœ ©¶÷¹ &ŽÏØ<žÔ¹ö0î<„ÍywÒMgY …½NïCèä,VÒµ±x|˜v�RÐcy¦ƒZÔ�¶ú«ç}1DP�’êðîjTJ,¼Eqö;˜ó½ nÞÚ÷î,|±vì¯�¢™Ðq„ ¹Ö¼²‘ë½òŒŒ8´†Ñ.µ9r/¸÷< 5˜Ù­¹ß õykþ# :�!Gkm ÓoÞÀìà(~ã°c ËAÓï9Æz­ÇJT²ÛØ™r6$ɹ²"Á&ÅÛXÐÐA¨û&Ÿ¸x¨8·bʾ†Ë‹üÞ?qË»\¯?ŽÛæXöl~Y"aÏÓÉ3B¡Â°!�xùo6Í:ß!ؤœ6¼U‘aE®ƒsÑóÇèbLãqLÛkÙ²QÐ’ç¦ñ]+œOÒ9“Ÿ‹ػԻ¶»*l~VHíhIó½‚ hò SǯW0Vþ~ârœ,Df#EÂ6›ïÄ"óT®°^k�;ž¦-Xð’áã•�çqh—:/¬çJ]Uç%cÜ'«¸Ôï'Ÿ[koO¸tÊȯt±ëä”tÌí¼ëp[$•±b5Ó]ÀãIT 3䈩ÔÎú¦þYkhK1c’4�©Ý1çY)Ûlms7Ý¿—óGln|Ñ7n¹W¬õO­òÉÝ¿¯¬~l)¼é/ Dúx­'¥\uhLý$óñJ-ÐÇ3Æ¢qÎ8³ðb®˜ô+ U˜ÆZ$\© 3G!ßy½¯´——G±4ÏÞxu™ƒeY -,¬Yæ±Ælæ{3k>Ô„ÕHj¯T¯p>}e‚Ú½ºï£¥7Ç«a^{ïtáÊËJ¦‡ë>¼þzƒs£Q4îB÷R릗>(ÆPÑÜ.WOÁ ÈÌ—¸§Ö>8š‚>3b¬y‹å x&)1ÆÝD 'åÒšA†D ƒ+òkw4]¦5%´‹¼Ì†ÞD“;sŦ ¦`¼ÝòUÎC¦;²|>“„F6Ís_ës¶õƒ˜7Êš¨‚ƒW{±ô0H€ðdA¸/0ƒ MÌɃrg)†ÏÓ¦ø4²ãðàÏ™ÄÜÝ(àÁõ>+ç¿ÕίB¤ío•×Zûp·>Áú¿]ôã÷Ø-Œâeºíaª8€ìpîðRe¿RC˜èî§š›4s\+sÜÊ_”1“�…# Ìqf1*)°yÈãg½s` Åϰ߳�™{`u„bLHRˤåô�[s”áXyùy¡0ž,§0¿üåÉŸ4%®wØCsñ ~³Šú8˜"<ÅŠ×-jq¯Ӻý¬Ûõ¬/pº£eÏGmpjïDmÂXÁì7ßmëè êk:Q¼6a7"‹$2ÝHº[#¹4ò&2=î¼aî v�¸y‹ÜC~ë¾f³hOG\-“37V#öºâ –tò÷·~b-}ȶ`ÃT\Ì2˜†‹V]¶ÞZBüp›Í¶—|/°c_2(�;þzï}Ýt¢3!Æ-ÎMš‰Kq ’xm?¿Us£k¿¶0Ä¿³§â¾D0)á£ÆIrT„¬þÏÔ+Â8 ÃÜ?œÊ–s’¶“ëjJßà }pÓváç~´„±Zk+ s¡1¢ð�Ã$¯¨5ÔwÛÊT[4ß3€ôÌ¥1!7µ’¸Õý¯¹ssô˜»½�ÔgÆDL¨•g¼Rþñ°¯U¬úCcÝß�0% p9´s…å»ãùmM³zx[ !Z1CE”ÙA™òé}p�^5ämómÉÝ<þP™*RtþÃgŸgðM¿ªg ˜}+P¥ÌCÞéÅÍ´œÉµÝy„µÃv›Ë×ck¥¡…�¼™JÖío|^·}"õ^›UŽì~Î�xrµXy%¶{ô^,-¯[»'©;Óå“ ”üDÎüv¾<¿–2¼/3Õ«�º�üžv¶È‚|,™óz£ùß[°îëL{ð×ÍÑÐ÷Þш.ö¬®£+E{IcâéȺœ™»* �Î>å!?0ß/Gxá¿«è¥ér¶Ë=ºò€-ž‰1c.·%ÿȰîC9ZvEæN<ïP. g „æ\ëïÁB/Ð÷b°´‡2R.ˆ2vzFöo��Ø‚Xg yÞÉt¦¾ U€v<±E`D�ì_úp¿Åõf¿ÉÊ{P=oú-úéMÃyU²e3`€CÂ݆åÚ”LhÆ…µ‹ ¹Ö]Ó8\`š½õ¬ÌQe{"²ÎƘYÈt­Y_8¬ƒÎo_js;¬^¯ J3ì7¢Yo úDòfä~iF³{�,.ÎâT$ΟÆÙ ¼À¥ ¹Æ�§ÒE¬ïD^ önAx`ÖÙÃwP�vRÿ¿|ä3ør‰yû>€P¦±$pŸkŠÚŠ>̦rn‚ ª¼¯ã“ŸU½sx/ÝO#)¸dlÿÓçþA\•Èþ«¿xWB»¿²XŒx¡É„K|þ¬Xí_ð|ôɬ ¯ÏóHÓÏëó—q¼gaæ¢knÅ`SÄŒ nÿÕ}fã¥|þCšÎþã¾+ÙÜÖó&×:á°UŽOOÔþu· DNÞã…qíÛ`y­q>(xü „°Åbòr›Èáû`ò\‰ß�ÝÍbrDBõŒxóåä°GuÖ03‰ò[íúù¬×~óbÚƒ“UCQ_Ð*:di© .­¦<Þíí»S\G縱\µñgTÿÞO û׸tÖpíq³w"|¶/Tˆ:ðrtæÃD¥µð)Ýwì! t²ƒ›Ço]:ovn¼}³ìCùyxìå:yÙó˜Nô¶W¶8 1wCF^�ƒ×\ã—ú·3eHúø/؈ Eo†K¼ZxÞ»*+ãR'›’¿–=B9~èͶ-rdO”x�d� b‡Ù–{k#Ô ŽwéïHÆ�>żüþÉ[Ì“çõÛF\�ë…øöíɱ‘­«ý?–O /úÔùL“ù÷¿üƒø//ñý:ÅLmû=”‰ö6¡—æÃæ[ÑÄÈ7tiÒ8êÛò^Lå�\ÚgßË•¼ămH+ø ¼‘rñÇpîãÂÅÞ7—èP�Ñ»ñ¹ïÊ}HSêÛ èfJ>+ùÖÍ‚7“Bi(hWi#dàhWIž¦Ý¥°˜’ÃÐd $/HXr‚šH•´ˆRJ�³U>à¸c"Z #$Qtph懟 ë:ü~_ÛòTÏöþ¥Çô½¤jx©“½_ÈÝ$÷{¬èâ§µS_ޱ»{báL…©F9æj+•˜+Knîz*NI‘hñJ²Hêõüoz·ÍW=\Ögù�¹à�‹5¡ãQ98)tÎï P1u¢F 8‰azæ¹ê›î‘MIµÅt8"”¯{��êºb»3·Õ‚| (U†{áé¥�PV:„ÊÿðVg'�^¹ :6zŽu&²%.£'ž3P¸Y©’ iDà-1Z•Ì?Ë‹ Š×9é¶`Råc7NË!)Vö3“§§œd쥵Ut1¬HIÁjz�¼DÆáå’B+é¡ÌÊ£äQôî�ףljño`òM(ž&ŒÛ”¯ßoئ«yÈL~¶½‡ijKê 9r©¨“Á’Š7ÍUÈû|Ò×9�Ý×9{<²T”ÚÖ9èŒMfË(Ò '@¥±ß¿›[Ù?¿_Îɹ°z^É”-=ٮľ;IãóY¬Û2[Kq°‹þ¿¿ÛvêðÕâË 'h Pœ3ßo4³ ȶ뺅�) `¢xÙÇ” Þ â % Àåÿà JƒHRÇáû.{Õ#…"›"s„S˜죕Töiïóâ¡<~†CŒ}Ñû�Om=¾AÑ"«£2rî½èãZ‘s"8‹šŒq Á'Pî‚Ö‹× ñnÆhL™&É––ÔÉ�{<‚:´w.Õ+G“¾˜ÁÎ)‰µHHÀŽË%Œ¥[™È˜öœ¨6ÞÍÍIù+Ñ3¿ºüŠ\6A*Ž:MNFgoS¢~·8ã%;æ®î#2¶ö;5rq± ¼¸Y7ýónjSÛùÖÌt;Y*3q‹OÑçÌÐêbÿkâÞ¨ÎÅo7à‹æùÄ„†HW¯¹¨hR/ï¼ö .9B¨£K4¥¶GÓrSF®êÑF1 ’›Î;ª©”q‡º\Aå×”zÞ-.È’Þ}/$~³ÊËw&'äQç_uÓ&q¡€Pz–â<àçÿ~ón“”)T¼�¯‰AsØKf3ƒô½ÑÇéʆ¢íV`@w{b·E€2/dlR=½W6\Õoή$.Hñ¬‡X⥩=€ö¼NˆâÅ迪w+$^€>‹ùñý»ú Ü<=Ddý_oí—1‚f �ÖT ‚¬Žr§3­æëÊÆÀs¨Éd‘€Å :AX—Ÿ1ír¹ì¿¼;äjØÉn‘Ék™5•–Ë¿x÷}åDÖý pJêSŸ=¼¢©Ñ¿u$ìØÁ°‡ ío\y>o1b€@ïLzƦŇ…HÆ*¤ßùïÇŽ`›xûÔíÇHîÇçuŒð‹…Q–ãN•–"”i ‰:ÿ§÷úõ:óÂm€ZÈ�ïùú}Dk —‘2MºÇù[Õß4W ¶‰¿ÜK]0'�Þ[V®‡Ëòâqð}Ô®ãÈ üÖn”XQ`J�ƒÝ’¦Ü ÞÚ�™c‡œ ˜ü˜6½j¿8°‹tç;ý^àé8>…!òuŽÛ©Ûê[òylÿ!¨þ´´o^‰ZkÒ³<7I¢Ó3y"‰¯Šî1mf?ˆm|ˆÃËîÄßË�¯Û í°ƒÎi½HîÕ{t5EvÎByP€�¨‚^~Ùò» —o<+yÌ„lçu7¯Q;íàoŒYXºöÉ`_^",ÿ¨?6GîõÈ{\|·ÇßA„ü3�EV` ¯´x[À_§² ‹-Ëàjô 9ã#^x õ¥Ñô²<3 X¦ ¼l¯†ÞQ"~»z3™ÚeúS¥Ÿ)ò.@ô@”9„Õlz@h·œ7M1·N&ôÛ˜À§¡B AæùÚÇ9OÁþj?˜x™!ÑŸ×8aýÕK0F¦»|æYEhßßÃÀWS2G3‡�³�µ‹ñŽ»Æ`�'P& XòfØ0+â¿gOÂÍ:NÏŒtÞV3°xmñæ$®�‹®Ñ)3±éjŒ,©l6¸&½0 *áë„@ö/B¦^/ÓQ“:1€‚ƒ*`o½œ÷z¦àÜuÆ·iÃÎ1QÒÖ±ÏsŽ—o9jP¥§`—ö’#7ŒªÌFŸSO‡E\`^²[ê çVX1k»í¨%às&…²‡’&%¶(‹ x$.uò·yÆp2,8@®]“öqµd£ÅµZó]žêmŽßR3pÚÆéçeÍ›Jc>;¢—eüÿöHËË}îÈ{Ù[¹ô'‡±¤…/o/å:8ÎSoŽ�×"á Çù tE£_7ÚñLŠÙÊ¡c9÷ö;Ï™z–gÌv™”d²—È}Îf"òw‡éáÆWÇûÈIŸ4‰ïvu�ž¾c”ÙE®’âFP¡µ¦QÏô`X¡—KtB:qpz�·„Á¤eLh¶?Ä áŠFl>ö�iÄü.‚g¼ R1¸¦]J½5§S›I"a&�–Ž E© bªÞÛºí>j©®,âþÎBw>a†³q,à%àu:#üû<¸0=¯­óu®Ä䟬 ‚Xé+ç÷¹Ø0žP©ÄÁÇïw'^¯P¶ß�Cz±¥àõ|íÐÓ·š‘­gWÖ¡_¥r·Bî3ÞGV»…Ž—'\ƃVz€BV8|ÒMé5�â#]ÐÉ–9ÎÙê/QÐàr}ãq\¿$õÇHú ƼS¿X’Ÿu¨Fý{­†®ƒ:^<·šÇvî”iiÈmU˜àí3¬à§rÜxº?Ä7pw³r�½|d^ íã3úåÕøéáÎõíCö÷ôacø'¹mCŠ8î¢ß× Ã¿$騚X²ÁR jªbø³VÈ!®6Ø&ÿ Æû ퟸ„4ÛL"²þU~·ÒÏšlS ‰$…ø|—�,úýù ÊxfGIƒ¯ãb Ž¿m]®pËù‚Xt¬!>ðí²ò°öpÅr>?žÊBúT9qê‰3ó–& ºà›”)X[`4ê²PQ’ ÷¹°Ì €Öé½c¶«Ê É®áczÁ�,ô�;¦E§H B¤Š¡xôϬf[«|7.x.Ýñï7Ò±dŸÏ>»üV‚‹FgƒÖv|êOÌL܃B1÷¤Ûß ¥ýׇ²/=HÇ��p‰×ñÇ=+R}@fÖ¡ì'Z{[AŠð+Rì…&<¥ÖÔÒ—*Ë#6^P‚¥¬¶Nƒ2p<;JRŠïáÎþtüd,|AJq~„°WB¼¯¶šÌWö»š¼ÛóÛñcØ€ÕüÐíÖ°4jŠdH ¤Fvöï0àØT¢™E\LA˜ÍDœlb”�ω s™’‰Ð{†‚¬\¹Êhº?xIp.,¶Õ¿Ž#Ä)·ÄEb¶“©<Çü³ {Tì\eõú˜FP&ì#uþáP‰-]Édm†Ú Dq“õ (,c7†pS΂+‚¹÷nó�®‹í×8ÿ¹XÊ„6á�¹ãb_ŠÄøÖD µ Ã>]÷×iÞÖn‡ðߘ¾Ch­ìé¿=úÀ«¬ã°KŠ�èSQDB†œ¥>*Fa| ®´6C©¿oéÇ:µ¯½¦Ç4šßMá‚tÒ±)k�G\49œ¬C÷¶à[1?#¿ÕOv5~ü›3®÷_> ôW¬‘ÞØÑáõ%[¾ 3¥Á›àÒq?ï­ÈýËf–‰›Â�?m‡°ëÝ€ò.ƒ`�j,Ã^C6-N×0˜dÒo3+,‹� 7N3y…I C1¼9ˆW�½/OòX1áÔ&¿9®ºjJ ò¸Ø‹ƒ€¢mhœöÈniG×x:E"R©&Ø*3)[†oÁÎÇ¥°¿°CãÔÌ—Ç?Rûåó–Ï™pk” æä·ŸÍB3¥ ûÀ‘—– !•ÝsýÃb>UãºhÕ³W6[¡!(—ï÷Vw�3=¾Y%kŒlÊJÕ±± ø­ëLÚgGU[Z��Æ{²˜Üë>>*µ×ýIžæª:|1Ž9>z™Yúª©ÿƒgj’“4 ¤pˆMïAQãé÷(CÑɤÁ=4È®¡&ÆÁþe™ªæqÝÿXÍë5kuŸÞU#s?»|ŠÑ÷ð£®&¯k¹,x‚H{åÜùL'äKã}ÄyÙ‘«ÇÎPॗŸÇ¢¹+>Pà| ßß³ÎÓ þ.¯ðÖÈÀã—FØzªãã¾Äz¾Û¸:Ÿ‘Ìß�U:¤›-‹üå*Œ†ˆÕ¤�äFÕ‰fñdbØöÂÆÈóÜ#1-²`—J¹n4No)9â�M¨EÎã1e›ÃHÞÊ%®¤q¸Œ9§Ê·�‡°XH‚ñ˜«kvš4�Áè5MìØÁ›�žŒó̦ÛA£›‡b.2ú¢ææÔ¡¶Ì؉ï·»eô#£¦·öB`kí°XïfäÅÁ d9BÎ;ÇK=âòà2Ï,7ížo‰0l.Æw:#ï*Õù{+ê…@¾O�…=XLÜ£)*¬æ íгi`kSyï;ÝÈ6g~ý/ØNNøŸB” ¦†ÞöêLÑƒé ˆRp&:îˆçR­¦‘®8O¢b,“Ói'Á®ïèyÄM b8v麡¼¡Î%¡7êB;1J㘄 3®øÛsl~Ës§ò”Çß¶ gøv?;÷™ø¯HÈxôM>Ôìß׿ù€0ÆÄ>_½Ô‚€3 n@ËüD?ç—îÞ¶Ü´ÒcÇÝ •ßǺÃ^ RÒ×Ö–fíÎgršŒãLÓ3ÇL¦ñ¢XLacCÃØÒæ²sÖô&tv½Ût)Mß…5r¶Ð† ßu5™£½'_ùâ²"óçþ.ýÅÅæ™ÓXM“ä¯yÄâúœù‰‹ù‰¾±WyÉÞ‘rµ{«^Qi1ñð‹ Ž��†^wŒÀ�EeWzöî�&ô�><½ÒhÂÖRîÍš¥í/‹z}ãl.ñçMð�6!ÀÇÊÊÎ î8»1FïÎüO|æ³¥�1•Q[$e.ù¥XWt^&§x Á|¥&v…]AäžõAå`„3Dž)Ñð‰ž;—¬m‚™ÁÁ3­lØÏWmp�Âr+kAÈ}þŸ=Éåuµ§qî{ ˜²Qòå-"SÅ÷lÿùçöµ9«îîìè¡Qwî¡!%}LJûy—?Óœêå‡ðç¶â†8b¯¶„Q­ë*ªäýÌF¡ØåX�œV5'Êü‹Ã‘{†[$ÙöhºÞõ¼f‚Taó’9U¬-.$b4xòðŒ81‰ï¦Ë©É¾™¥ËQȬ.ÔbŸ{<XLµ96D_Çf=¼�ŒmÓ!•�¨”>×8ˆ\*K9–‚‰dÊ™-&H_Ë µ”Ú^ù=!r9v©Æ�ã½Ã©faàáq¥ÉþlŽÒUîÊ݈-·A&áãhïÕ“ÊåÀ.bPÛÿNÔx¾~ßí ¦d݂ˀ 0õ 0¿8ñå÷ùc”Õ—³›k�wga…1 ¯s^àu··ûâ¦ÿÏŸk€{r鿨æ&òm©âê“jån¹Ý›çúx{m¾*Òúu½ùº·‹^’¦ºÜéuK›¼O÷NŽg“[c•ô ‚æ¶„ƒÇy$PÛI�BL„0#ÓÂÿ\ Cáéó<çÙ¨Û³S¬ ¶wÝ¿‡»ëWñèD)ºXcŽ“2C§»è �À?üåÖ ÿ;}/NûDOpXz¬oæàÈû•Hûÿ…æçjWIZ¸—lMiXïOsˆ»”´g Ñå@ Aˆ "ƺΠöÓ=TA.¡ڣȆà^i–çísèoÖJÙÖzõDÃ¥mÔî‘"EþtUÙmÐ8>Ó“BWB�,›'ž$.�´ –jún5µÍ�»S5ÒFF8\ïÁ‹Í’¬1H¼pÕd ÔD[™L¯…åê& �Ú3r)ë œT=š8ÊÖ[ó+›`dˆ$Â2¸V=]{?‡ó"·B´^!&S6qn¯GY¤öŽ ´�":¬*dÑ'ÀkÜÛ¹Ý�ûðûž1HtÖünYˆ} wŸd1}?0õFíY6Âçú�*+Òˆýý'·È<[[ ¶³cø…ú¬çÝ‘­t¸ïæ j ôts¼E¨TÍ3O«ï1Œú/_çî—'_š®VO{ï•ÜÆs \Á¿¼×0½yÛ‡¿±»`BpÀ­[ÍÛ:H)>ô›Ö÷»¹q‘ Aka·ç‚ÛKbËÓb‰ÈãI±ð˜Í–ƒ¦» ˜n¡xJàDJªœ[A¸ÇˆWEÛ�¹Ò^_èáMí¿n>'Ùm™&ËcÀúÑçÅé20ZCÈmÂÚqŹLµ[#fË®ãˆK~Ç {· ЙÌ`¯Qî»|\‡Å�J Ø;aï|N^¹³µ<ž|ÜqÓƒ Ð0 »-¯8EŽ4ªÀ\ÿâÆÒÎÅGŠÇ¼©�º1]3÷yÈ5 -òpzb£ÓXñPíÕŠ‹HÊkMVй̧)j[gz2Ù˜íF2­JÓiq8Ç ÂÞµƒï¼_YðW l§ñ•öÒ̳�)‹ßüxÛÒÿ ÕýæR»Oü\‡Ú�×âxRÅ‘ìC³ÁzQ©@ˆŠÁê£ñEáÃP2›A†€cLÑ‹“ž÷¼gͯ�Xœ¯f{åù-=¥7àÖøÖ”'¯Äì•ÿ¥IºF—Ç?aë·®6_­�*1J7—+싪Ո+˜ýĶK}Ì2ñI…™aÁ‹ùËûXHãI5“'SB0n7`é‡;Q·èkD1NZÎä‰Ù*ÙœúÕã~¬Ô=þ—cö™9΋Y[¨xngšjÚX3þÎ:ÔL*RÜÜ�oU„¤^ˆ €–ÐR#©< «†ÌYj×\ÙTi£@œó߸ë%àó4/ ò—ùú»oDc*2]LN™'MâS'�0·lô7)`÷¸É²1­»@àßO¡N@ �n(@Î; (¤‚šlÓ@Q'³ ®º e®ŽŽeURµ¶ÀÀ ‚�em@8.š ê”è8�jµ¦€6š3ÑÀ4žºêvpví…UEЀÝé÷€yÞm‰Ð@*ƒE(ŽÁ¨¤€@H(Hh×` €ÐhÐÊ€@@%·G (”À(h€ *… iÚ¤ÆÙ£A*d  Á…ØÐè(P¢�@’t…€t‚Á@Р@’…°  b� ªÐÄA@zh{ÂíÀ‹EÈ4Û h� °2…QÌ2td!BT( P¶mºç5T"•€ ÈsލÐi�(  îH�B�¶ÐÔ›ehtî€A@ª 4Ó@w`uÈå`B›b…tCµ!Û´ JÝ€¥PÉ¡J �$€ˆÕ1ÐÕ@»pJ7(E’ªJP¡HÔ“†¦  BQPhÚ L„”J5&§äÈ©êFžFB¢Š›(Ð €ÐSÄ‚! šDÕ=F†Fz¥UMM 12ah’&MD¨0dëúêWþjyy7õOçþOüWþ?ŽùJ©Œ5þC>É®?Ì\3 2¼«Ñ–*ت��f%Içé„P±¶5¶¢Š¢ÛFµÔQ¶ÆÕ±cmŠÚ(�m%ÒUAm‹kFŒV+T•±­hÖÑQµ%lmi+X­£VŠ¢¶5ŠÅ°ZÙ–¤«¶ÙChÅY5¶¤Ú*(­X5i‘´mQj-­�FÚÑV¢Õk‹Eª¢™VÆØÔhµj-l[V+cV‚ÖÅY*ŠÉ³5Z�Åi ưm¢ŠÆÚKTE­IEkIª�£[EBkX¶,ËJI“5mFÕ£Z6ÚJÚŠ²[bØØÚ±mh­¢‹jMm%É™TÑmAÚ5Z(¶#Z*ÆÖHÕ±Š�¦LÑ¢Ú*Åh¶-F‹Z-­E­�£m´›XÚÅ&ÖÒVKQ±­’­ŒZ�£Q[jSKXÆÖ´V-Š‹X‹Y›j�µ¨£X¶¨¶ÅŠÈV‹jÉUdÅ[DXÚ¬j*¨¶ÒZƬmªÅ¶5¢ªŠµÛ2Õ3V5�Qµ¨ÚÆÔʰk«&Ø­¤­H–¨ÚѵX¬j5RZ¨¢Ñµ�mÊÄXÚ£[­‚´TkØÕ£V�ZJÔlÑ­´Q£mEF¢¢Å¬›UMjÛmcY@*AFˆƒGR­¶Õe«[V–­µû§#—:ʺ˗p]²•Ù§\%ۺݸ×w].t·].”ȺŽeTäaÕ+ºvn·1mݱw]n®n¦—w]Ýv®¹°Ëe‡uÙÒ"…5sš]Ú“ºÝ³œrºÊìºÎ%Ö+wvÇr]—qHµÝÝÝswN®—×lî¹PféÓ—RYÒíÜÓrrë®K·NÓ˜æ¦æî]Ù7Näd›t¥Ówn�Ç[•Ûr"bƒDƒ›nÌŒ;�&árWsb‹ºî¹ÝuŽœ(·]:ÜÒ¹NnáK­Ëv»‹3¹�cSwtç\볦M•Îäv¤Ís›v¥ÒçW\ÍÅÜ%Ývݘ×:Ë®×bîÍÝ\äºfìm—R¸ë§qÎ×fºæ»®èº.áeÕ‹®‚hÝ»»®»Wm×u\§k´]ÇEÛ�%ºWL¡»]Ów®nÎݹ‡�§F—K»©®îœ¸vºí×d†ä¹ÎXê"®HÕwhu»œu%:FWgu×\§];GtÝWn›\M]KQîwuÝq˸]¨ÐÛRM,›n\Öt©LÝdÛ¥i$Û¹pÇiÕ wfÙKnƕ۸ÍÐë¶mÝÛIwmÛ§9¸šq �wwuÓnÌ×p£vèw‹´êˆ³7W4êérRq2R‚'n¹s\’9ݹww]ÎåBÂŒ•Ú먒N™»uCMw]mºgMWRíÀ¦ÙÝ»²íÉÎ�¶íjKI”“«¸íÔéÝ›¦ÜÝ®»eÛ­Ö]‹w]u�‹—M»5ں멥λµt»º—]¢ÍÝ›³];¦æºí×êìÊë®WIÉ�×n�Õ�Ö9¸]˜æÝbL]×3»7V*›»®N™wq!EÎÅÊ)ÕÃîÛiÝÒk´§rêvèç[®Í:¹$:ÝÍÙ¹¹\�rInä»\�Ôæ.5Ý»�wwu\îéÎå'Mw\NëwuÓ¹nNd¹£¥rçtç\wW];d’Nìw7uÕÛ€ÇmÜtîJînàë®F¸ìäérã·SvܺáÕÜìíÆî:JRælæ9ݶ]ÆK»�ÕÚîwN%×s¹]Ò”»]NW\—w\N×'S®î&—uºã§Nsº Ó—'[›]ÝQ�­..tRî¹u×wMÎî¢îݹ4veØê¹ËqÚR©] ·7]nç]vá¥t�]&CB]]Æ–uuuÊk¢tg;vìwiuÍ,@[¨"€øˆªÿˆ-m±¬j’‹QCPSˆ“bŠ™(bš)£QE,“Y0R‰(­™5‘©LÖ–Jl•ŠeIaÔš”¬…LŲiÒÕ3Y6ŠlÒ²³6TË5)¦³JÆÒ´Û0¨³eM•J›3i4É›$i²cm,ÅEEY–Œm²j4mEB•IdÑ�³JÉRŠŒ³¢±T¦Ä£6Ô[)QjÕl­e¢Ÿ€ (Ò¨>€!¢¥€P²¨6D¨Šˆ×Ììáÿ¿úûAs˜ÜX.H‘?c•BuWP,;:ÓÐdÆ4R~(>åÙ(‘–1K4öÂéû°¤Ýž…ñ•½Ó}½u{wÕ¹Ì"˜†ìF0d´“Jê¶"UP…ÕS¹^›tØucu²n\�¼dwF'¹�îÀ—mÝÈ.û,/X¸-¾t}ÚŒ´0<íè»f¶Ù@Ðx2nôgຯªÆííÕ­ vPæpVô±8AG´Sä¸l½�eÑ)i�™ö ›¼xm.‹¼°ÄÇ5ÖfoX;æÑÉ£%£�2³tUH""úïÑ_;7¹BÆÞ#Z-^Kíj!±c"×+ä³wÊúö‹©/†™—uB  ;D‡‘�^½å¶UóX àe:˜z¬)~qd½Á›Ûˆ¨'ª´urYYJã»–SUÖBf•]lp¨ú­ëw—Ç´“‚„².Ñ#•×…’˜hÖN¢-UNx"ÇÊÛ³k–â¯lëÑ#à«Iª•p0œÕ庋ÅçH<Š«ê…-Þä“0CÊ•¾"ª„¨†Úª¶q¾ºâÁÚëWY©¹{˜‚LÛêä Š!—aÃÐEÕŠb¼épòÐ/»!¤VÌ̱gpCØSÌé(æ}™¬õõ‰wYüyÞm�áX3l¾bÆ×^¤²Í”ÓÍ›‚h1ÔÎÊ ×–ßx÷T®FMP^ª~ª�t»w‹aªxÛáT0I眯»&±‚–Ác­ •œ 0§<á·V®ƒ¹Þ¡x‘¤7ÊUL¿[Åjú>Ý è×>°»}ǼâÕÅ‹T;�вúk°˜¤½vš²Y°Á;¼0@�³× ’€Û‚ õ«¡ v—]C<ÔéØê Xó²¶»—eôÆ©ª£8]‹ÛÑÕ)öÝ Tïìeem†OC¥hç×,ß, Žç½š_bR×kîÇÏxïCy}Ò±ÄÃ/,NeŒÕ…ˉΚ¬ú®J…X4!Ê#•j›“¢ª—0Òìu}Ç+%RÌ¡c¶©ì ÷*ÓËØ“–EªÀMÐОk=½Ý¥…¶é9w䪧<™L‹ÀØ«ª}®Ö¤gp9Žß<¡µ·”Õдø+ ˜ˆ£mJ®yhà±äI�­±n÷4mfKÜ�!4lb0 aÑc=[Í+ç¡Üêß¡:ƒ,Êí[Á}¢ÕUZ®$˶Y¶øÖñÚ¸Kúï Ð œÎðwVñâ�ʸ^ùõV¶ù…§:ä®èä.ì�Çž¢lÅq“c™› ÉLdzœ›�io„K®©¸gbR Ü•™[}~Ü{W å×V­Ëo¦c å6ùØP·*îïÉÝ=Ü)¼¥L¬ò‚W(Ån;Z6-´½Í¦í<ÝÜ ñg3ÚÓNÖÚÚõÞû(¥]³RGá%qóÌ[<ˆé)Þe]di oQêÚ®ËÇà €4ëPA}¼}\»ªó0GØÆ¬~á:·šVMÀioìc‡H©0µfv#ìÑeA6'ê»H=˜ì�`'¡OFANRC¯V2⎷,‹À‡ò?ä/û÷ò‡ÿUñóø� ”Ë?üé�dÿˆ88ˆLeÔ£ÿÊß+™Ö„ à0ÇþHe”›ÓÌç;r¯í!Rëqú1ߺÿ2¾MUíK·¡CQV{Òy‘êdÀØYîš u“=±Yzbó‡˜Uuê-ž%Úàªñ• ĺՖ#Ã�sÓ“XBY/°{"w5x[Ñd±ðœãî-ž~¯›ŸÅ¸ü}6h oPÆÂ”˜ +6]Š¿{™³´2#[¾75rÉ\[t¦Ú³?Ì !« &•Ê`¨ÚCˆÐ’ø¿ºÒzÝ=Þ‹ .Ð :R7) sÓb1ùqj{Ï\ß�+ÎÇ$7Ò �/‹Û)8[N…¸æ*²H­èÎ�DFžM]´e×ô欶ÁtBåNZì¦I?¼¾aò ìòÙ LÌl‰ÈVm*jŒBhVCfY·Có¸p‰R°s¯3ÕŠ#²2¾6䌊1ÕKƒT·B&_¢®÷§œÌÓ³Ãm[ý„*%­Pj¤±Í§zÎóqlÊ*Æ Bz©äÄ‹÷LŒå1"ÜáI¨ÉÎÀʱˆ¸¼ßâŮ͕QT¦ìõè§É� %ŠrJy…µTQ5š¸ÛM zJi¶°ÕŠ;}VìM¶R½Ü:òÅ4.MÃfnÒóŠBük¨2e¼�²Æ0®RNŒn™iTc’á –Š -’TL¼zª2�¦µÐLgÒç˜ÝÉwÁpøHQ�Zí†úîç×uä3äí)îCÇ%m³ªÈyžzáÎHð_jXR@½¦7º«IÍAfø·’æ �Í I¼d&2-¨1÷·Œ`Û1žßqIÈ€Ñðôc…‹4H$49™ˆ$Ÿxã™è™XÛö¸•ϵÍ�¼¡¢w?ê,<ØYð˜/á"Hàæ‚å�)3œ‘˜é„²‡)æ4B/âëfY ¨¿D,”yAf÷�Dâ‘ö˜øsr…fw‘2pŠ•¼±2V´g>üz¸ž÷¨²Nˆ1á°pï œuKTVMñ œ­|oUš „Ž?ÃÃ^ýCZ Ê]>X Š•ë¶Í…Kd±£‡6=žfyá²ô°$yKDÈL{;ŽyB¤‹;´?¡þ~ÿ”ô^½0Ö=¬ÚÂO‹ Ðpât²/s3H¦Ç1žÖm}�3§ ‚Ñ‚OÐûr­p5­«”é{oh«wåHoVê@£m#Ý:ËD†sÔéRUr•¦eCÔð¦â¦H¶h�öåýVZ™vå®WYŸv f_õ0ßE* þ?œÙ6”8Lϱ҇JHaÂÄBŽ!NnÉ«vœr3Á©i¬širpŸâ¾TÏÜÕd�÷þ•/ج§C�ñÜÝ�QŒ£yóÞXEÖ/˜§°ªݽš6ûœÏ;ÖT#øÚÃ*'\S£ép³çù¾È¾®ø‚hž�óÅkyÕÊX®™Dêó©�ÛìÓ�¤|ugv³z„Þëíw/ö]v"´‹ø>U�—|+?³·ÎLï̧ëõûó+7N¥3ÀÙ Œ9R\´EE¦ˆRÚSÓœèÝÉÔµ£ÒÛ¬ñ(ß BÈp]}ÀxV‰�/3+~ÕžÌë�˜EÄBˆ€^a ËãŠqA,ñ¨$IÔ¾BAXú”&uV¾å�lï+'� ŠIæVþ©Ùö.„,—óœÀ2…8˜�QzâóZ‚A.ç™Ôü[Y+ajQ†Ùɦr¸ dµMƒžÖ¦ XL”’›ÁVÌ@‡I %@R©Á˜D“†V –!°Ëq,̈3" ’CMÊd‚P€T� šX(2d#£l2$«X¨¦‹”Í×.¶ŠÀ¢™F!ˆ0’†Á³  $¤ØH M”p<œ@3*s–u F«PH‚(aÂ� "K8e³ Á³¦Ž  ›\U¸³ˆ nâŸû.„0©Á­Í@jDA`‰e† b‰1*e)` qqL" i`¢¥�$3,Æ50Dúˆ“$á>“'Ô¦i¥E`­&q ªK‚ÈÂ" 4A´Â-,2Ãm*n`,2Z+`ª†àÁ»·w@1ñlžÔUò«"@'T€ –}KÃ4�’`— ˜@.»tlYÁ+,0 ¶LA AyIÁ÷0It˜6¢Ì±¹p‚rä„d�Xh[…X€¦Q¾¡ÅÌ(X0> T—ƒ‚Ôâ㤌R IX,”dÁˆm0Y—K•†}šÄƒT�"("Ái˜H¢ ˆàœ[�.@`á4 4p á�šÄCa0ô™ºs Ð8idäÉ« £G ©"Kn"£YUJƒì¼I0Y ‚Šœ S!!M©(„T!NH¬P„‹!B4&™”!J‡1¡2R‘˜Od¨†¢”Nh8*˜†pš¶$BBPD“ƒˆ L7u3 m$’q.$‚Dá)bW¨Ä0騂ÛM&°ÈD�Iĉ Œ27r 8Q8tØX$6¨Ãòð…$n[‚RÀ$HàÕSÊv´eíÉÃHCHˇ„`¢¬ÓŒ0HP“°‰u)Á.X�FL ©-í8ÂH2‘hœCxCNgQ"n–!# D¸‚-"Ò6ìÅ€Y£¨ŒL¹•PÝA«n©§Âe*H²ÃCDTÀr �¤%ÄIÁ8ä²åá][ƒ(ºÊm'DƒâA1‹¦˜¢Ìºv F -‰•ÑfH(I(�váŠJe:p&fj0Ê °:,ÑD’ †ÑÃ(¤Œ¶âÜC„"h„A$•,DED?fè'Ù~¡†QDÏ¥©"ªÛœ L# an ˜ ¡ ±DD¨räˆ54L@d‚QD˜A,¸(P(ÚN£A„”¼w*eaR' •™2B8�.œaÄp‰ˆn""iIª,-åˆ@†gÑÖ`Î Ba6Û§�1„e' ™1$)Ò->£ˆ²Õ†hÂnÁÃ1 &$|J…`´BR‚"!テ��’*ÿ_¼ 2h�Ȇ”dDÚI˜i$ ‘12fTQ2"ÅÃX̉’2Ij2hŒÒ‘”bɱ¡I „¤£@D˜’Å% ˜¡FŒ¨Œ$A¨¥$DILÆh22E664IR!˜RJj@CHÆQ£D2 )�ˆ‘fYš$2“dŒ "X1¢À’E¡€ÙŒ@”B“L‚ƒ2Ra RI¦šl ²”J4SX1Pf@$!I"f$4¦F`‘!%A%©(Y“ ÀÙ¨A¤ˆ£HD0’“A¢bˆš‚LË Œ„4–)EHf ‰ bB6-€¢CL™0JLH)”h†cBD… ‚R"H“$ 2I”¦F„iI€…150i� 0�²2Rh‘$ŒÑ¤%(”¡!’!”iH�ch²iIšEBDM±b‰1šPcCJ2FÄ¡²™0E¦€±4ÚÆR"‚�‚T¤¢@̃b‚a™)¨ÊQ)` ’h£@˜˜Iˆ� &Ñ À“2A”Êh¨£lؘa‰)PŠCd±¢ DMIŠ””¨±hˆdlÁB�dI…� ²"$A�™L PA ™FAŒˆB0R11…-Á¢Ã,&`…‘4b”QPÁ&“ ±©ŠRD£4DDRH"(h�J3e‘40„f‰¤ ��ˆ3Q–¦’ҌҥB‰Æ@Ô‰£ÍIˆ‰™ˆb ’‘‘FhIIfhSPÄ€Ò)%2"“D˜Ù2L™dÂJ1I”iI¢2Q$‰©Qdm”’&F”É6 &bL*5ˆ”ebA(É¢˜DBdh›J2i´R)„FÉ&$LBƒ"( T³&BiŒ¢d¥¢-Ô$“ ˆØ,@XlY1 ‚dY0”cT"4ÁH•2,�Ó,„$0Æ€„˜Æ$…(Í AQ0”SS001°�–""‘bÓdZh©²ÂŠ#fˆ# ‘IQ™ˆÚ6ˆ�™F,d„�2Hf!¨Ä†’¥Å4Ë"d˜šB“!IfÄ¡)±ÍÅ’“i…fHšaÍ1Di±R!%�ƒSFP‚Ò¢“C`š) !¤D‘’(@“ �1ˆ ²† ’ 1‰ÂFC$4ŒAHˆ‘²[4ifc(£ H¨X”#1„#@L„¦@Ã*C ‹€ÕES)ŒH`Â&Q˜%�"™‚Q&ÈCTƒ$¤4€%”ˆ@Ò$R‰2ÌÑ"dј‰Ä™¢5•$3a$”–#A¨¡dÈ04ŒŒÒI±HÆ¡d+ I" ‰ 0d@’Á‚I‚¢)(„Ó£S#A@¤ÆEŒe¦4²#cfÓi‰%„*J3 *I£² 0Ô€‰‘ !¦QR‘¦Z I(˜f&H¥*5šÓM!ŒÁ* ¢‚F  $ˆ4’ešKR &Åb"Å$`L"DØÑi1!!$#$TTH€©÷ûþ}þþÕe{Û2 ¡%®¨^¯àEfé±ÜT£. b`t÷2²Ã½± ]È(ö¨M µx.ÖwwlS_�JÞUhĦ·g²ÆÌÂLµv¦³�Ó�¸`]•C†“xªeV›äõ®ìw� íîz†Øá^{vG9¾dºrfòÏiŽuK²ó¹Z ÷WB¯3‰½6»Ô.Z¹ìGŸmäYuòq-å.²®ÅÞ¾xË®š»…Š~Yj�ì!K:jèB%Í6.çdï1È*U¸¾PC² VuèàêkG&*;U².|ŸsÊô,Æ6�ÄÇpBZÛÍò�:êË• 1ÞGlâÜmw^ÉìÝë"qå �êÆ¯HèU •ÈwCy˜,ȇ¤V^’ÒPµУ)B›ÌØ ç8>¥´Á4“Œå7X¸-0Ðó¾—æ-jyëånÆÕ°sùŸÇr�Fær—ˆˆÇ�áÆRüò‹ʾÝq~#y»Ve#ú[3(“0“QɈ*}„˜eRq™˜�Vå  ðJ…7M`îù‡Aù¨í]8¬íEâE=»“ÑHd‡£h!Ù¹G 6Ê8dBC²B"JÑ@AÆÓ¢É83¢ðEÂÀ,B`±�¥¨”ƒ–=u-IÁ$�y¤ã_K IR¥¶€5#gÒ0CTvye ]÷‰¿VŠ’À‚Þ Š"™ëÌ1µƒg7ÝVɶoS¸à.ŠF. A˜P“ŽnÚI%²-Õ£–�u¥TæÉº8kŠ.æí¸ *]úÅ«´P‰^†¿ dˆˆ2ÂHXÚ˜ñ®ÈôÓU˜ž¿Óå爰2Òh†C€‰QŠDˆkPцDf2p&%dBj,‚²�Á Ÿ“=¯ˆŽ z‹�p¤âÁõ®ØIKå.#ÃG¶×Y(.o&䣻“0[ZtÊÁ€†âܶSqˆ9P|&d‘>•íh» ™ƒ�“ÉŠXUÓp¡¬¤CX€pç–Éó(J „;ŸÛP¼¤"Ð$Aó2É2Ó‡oúþÇñûg¿é¤ÿBªŒ~ÇìŸÙ0Ü饬Ä]ì§|�Rã˜y`‡œŒt<½H;±éxcERÝÆ˜90nt�f«ÏG¼–n>–;È=HenãÛÍÇÒ7›WËE¤0V3© �}–³³7Uiï‘\¶�™”a¡®Ó ¸Ã{Ã�Í(Õsën½”òª¿Uî¸"rØËî÷vï°qWˆ±wÀ—e¤Ï]íÅYÂÂã×'”ûUq±¬Å‡oV²Í‹ì¤4,nCÖœDn\O}›�£Z- ~XùÌk&¹ÞÖdÑ äîËëóÍ£¥ÅG-P¬7®„ÍÞ™§8mX0{Ã\†SóÁLŠÞk«WmÉ]’ƾYÕYGoÕz2½Õªê™ÓT¹+4td0¡¼2ìï[ß6`º¨Æ·¶ëNyª™¹§o5A ËÍ<¨²Ð®S ÌqôÎÉí…ÕÌ£;S"U›f?)Ì4’`�°.˘Ù1«6µ|ÝNêîá°�’¦?|zä‘!•)©ÒXô§m%›ñtÂäWSBÞˆóÏ\q}Ok̹¬ˆœ&Fvx‰k1›Áñ4eL7WI† $]ªµŸjž{»”â5_r!ØkˆEH©¶TpEƒ÷©kÄŒ’í$Æ–…^’ø~R�xl帷C,1ØÈp¤R&Õ’ô©¬1$ó´ûRßa¤èÜ]zŒXÉé´„&–S7j¬ð².¬PBà¹N‚ž’‡Ý¹`UQÞ÷îõÊOGÈ×^é&Äänç,õÃÈÿëm8"°û‹–nRä’�%Òô›;»¸Æ,Fxv8±äKB„�n†Hi¦`ÛjMâ†WRúãa™ž‡ŸƒúG¨ÿOó5þ[È*GïüÞë5mØ�â`ºÍ�{›sz«µñ¾§Q7©Ò#+%‹�ÂÙì¹s%86‹\ª 6ëh\,^Ö5aO%Ñ_<Û¡Få~ ŒmU.Ž÷¬/FR"kY8Dظ$1Z1PÍÄ%)(nA6öd«îé�pq^ :ÔÀÞ·µ›Ë'WvÍy¬Œ)ªbˬØ]Ç·I„¤Ë²›Ä�]­ç�û+®Ò•5yî—–ë6’+ ÉÝ;¦_iË„SÊéŽÆ›b/cåŒ`&”¸ñõ$“éyØëÊÆVŸ;®³W5•—ÈŠsk-W17‚ærg]³ £´énW¬>•¯¹�=ÞG¢Ç0vbʾ™p¼¢ª»Ÿ`8É ½g¥Ú÷nîËM`jÍ—ã¶^�Ý¢& zo[\Lœ;&ºY€‹¹J¼šHY§/t<$ݱ|'!è§Y—²ðcÊܪZ¬óÞoÆUËêç£) ¾ÍUãc�y{Ü«{W%“ꎶ\FPÜåh^X³œ§B:ñeé]¾sªO/f›GE �Pè*È…PÂ@S±Ž²)˜,pÎ�ƒä/ÅΣÞß�£½*Â˪;b1î ¼Áua‡ÐúŒ®yµ‚2À׋²V¨Dº‹ä w¤ÓîË>Wé&ñ' =[SÂÔr� ëºWÁ\‰åajõZÐ�†÷·›LîXÕDÆ1 ±*£ø+O¶ñu×=½9¥ËW».v+®¹| Ù„*8*µ�ÛdºÂžÜT7•»¾Ë{ÝÕÑÕÝL—�eV:Λ˜rއaçpÚÒ»¦Þæ×YQ ªì®S-Jí7‚í¾Ä±˜ÞVJ½ÀpZVñfä]@®LúÕìvéÒ<ÇϱaœîFÁ¹UºêìÚ:ø…¦ð ma¼fõqyÜë¹8šÀ¦o{^¬·í­}½N¥îív6ûŸ[A:û¯¡Âdƒ4ú”±™˜7†ÇÁKËÁLõöš;uP>U˜F‹Ñ3(o¸VÝvÐn‹’ ´BzÎ䯰Õqxî1uƒ³@æùÉ3P±h“Pé-�W‡­m㋸\•1n²î¸öUEA’ÚÁ›=Lg¸9;w�K ³=̶ì"ýÄVJè°µÂf¤mW>w/Bxoª«4[£IÂÆAS,�E˼ͷ{‚�´×^©F˜koÝ]<±í¾+0Év4×(_PÞ0ÄJìp¼¼ÀÎ)mJÍ" Á‹Á°¬dÃ2VîLu 9ÜŸLÄéW¸#×]·Õ@pÎ@Þ–ì©›‰I0ÛyqLGeײl«tÓÝzp[ÝDnîà¢ßF Ù¤Åµ¤kÜêÂo^ÒdÁ††³.n«z®ÑÜ»”Í(•Q�ËñÖÖ†ØÚÝÀ° ¢yº®жµU�s´ØÕê“£º¤IFòvU Ží;ËÚ¹äB ™wv£9¸¡;^É´.e�·­ÉÕ9g#–æ96Ìñ>PbàÚy�¥徂V ®ÑZ:…lyw�Þç²ÛÅâ{u�Æ:âºvEP”V5IÖn!wgÄ%]|s¯w1g^<è£ËµE=ÈNÖ�L¼ê ¡W¦û0Ý¡u�ÁaC@éˆM8ì^:m°{|¤Á�+ÑÑ›ÜÕbÕ˜]íP龈>é·Q{FuT]—Œh^6ÔW*.ڹʄ¾á˜ººïsB@Œáoד¾ÌÊÎo´ ”zFhÛ r62‚8½�„UôÇÄÀB¼î¿ì,Ó»¹{bßS½ÕÞ塃Z4V÷ n6©n–³ Í:”Ó;aÖæCÛOðÈv¶>ËpŒåJ–¦„[ØmzHRöëxÕ[ªë$¡Üªf»©n”w˜’`>!Ô†û‘ØÏ[’¦Upг:%–3Tw¦ôAjm别må¯-jf¸o›ì4šìÁræí]Ð7ÊnŒÚ'Qvª¸Ó¤+’h_§tâÄ 6 £c�Ý/´iíT›{]H`#y´”˜/ÚK¥yÓ¶³‡!BÐ×^ÁÚ¾;&‰nUr¶š:»FëOzÆž»`fÊo»¶/|à°FUcª³]@æi�ѪœÕc(#n˜Úc3¶úÈuQïT!˜Ïní—ÍôšB¦Ø·�&bç+Û–ˆÞbñ�RºµkVôï¥;Ês`/2 áÀßÏ—ò¤0Ns�¨› ÎÓzaͪMÁÁ3•’ ¥Xª�¾²FöK°tÝdм¯± 1=|Æ6Ù¼!7t%ß{:´’3V讑nØB#�V3Ï!MeYÍpjKÏwoPÌX–½ê¡8>®>›W˜iVoR9§w§Î`Ã}‚»n_;ŸxØÆp@ºüŽ+„Š'lo]­º|Ù r*[]ŽX ™¤tÌeÎ ¥ bŽU/Ÿ7/ÎtMm‡]•hå8ƒ¬ŠgLUZîô¬Ýc©ÞMº}LõzòèB0rnZˆ×n.Ä ºovÌjØ|ï1îYF�|ŠÒÍQ±bºË³¡a©½ºH¶,aßvuîË"§¥Û·Y—Z+%åÊ÷nf̼Ǡ¨!�»BÓ®‹º… ÝYIr …›Ð0|*Í^g9ˆ8òÊ·e•ÞΞ�öV¬É¢v¯`A©�X7bO;3ŽxÈæïb.ˆÂc¡¼+ƒ !Y8sÛ˜Ökç‰Ñ—’–p™Ù´@jŽ:Î茟l³³÷øx{Þˆ¢‡‚Š(8DTO°PSš Œ" ŽàŠm[M•ô^ð(–éÿÐL¶j|6â�z[…׎Ø_‹}ñíM‹·Ücš vYÿ@heö¿ù÷ÿœ¹2(XðUú¯ºµŒðÄo›£—Ž{oÆD÷…öPäb¥ÿÇzIxôRê˜Ï âˆ6ȳ �º; täô'*mÇ]Û}Øœ´û-~e¼÷�‹‰lÇБêñ.R¼ÝÞºÞÀ»›üf]¢‹îž?ÊÝ~!ð¸É;ìþÒôŸßŽÞ]z‡è ûú¼?úPPR”ÞV4øïËÚ‚Óý�«­5ø¸Þ\�׎Z1bG™yî/Ú¶¨Ÿ>ok.Þò‚¯q¹vèë´™*ŠFö¤U7˜¸‰'máÁŽvw—ökaù�‹…âþ•_ÅÎð\´Æn²h8ïÂùûx“‹ø}5SæZ—‰µØñßo¬v²/†F^.Ò‡]AÞ´ïÇä%*N¡›-°éAÖ}p{綇–_ã¬sfDõ¾ŸüöÞZ½D¥‰IùßÏkÆ,GƒØ2F QÇߦ¢ùJþ–Úe7Òýto…ñÛs¬‹<Þ;SÇæ¬>½öže|”W×öð»_yOM›*‰™”Z Ý`ÿSìL �õ¼—“Ùå°ï¯¬øqõÐñ.´Öß›ó¿ïacÏoño:]Ý õjúx{hÜí@ýº ®açÂøFFzMPÇrç]}j¹€áÑÝl£ú±ÝMÎú6YÁÖ9†>ËéØËߟ¼ó(PÌ‹9Õݸ> ÝD±tŸƒ‰¶»Óô&ï†&6ñÓà“ËÖ`Õ˼â]\Í¢œNžQcPùÑj¥7-å;g âõ™ŽyëïÌãÁ?:¯¿êqëIJtsî ‡ ¥Dš#î`LKgz“3þÔ¼P£œ <ÖЧ$IÿÄEDÊé’…ˆ&?¿¹ß/kÛ§ëøÏÌnÏH¬y 7³’9Ü(€Tvéð˜ ç«¡ÜLjˆ•¡I‚É—�îÜ…9ô˱!hú<…R×¾çS>¼«ÊüúbM.ÔÅçoÍì[ã®q5ì¾r¸möVw¡ƒ.¹m-j3è@’]´ÐYor¾æMá q[2ðhõ˜.ÕA.<”TP<�‘i‚GÈ8ã¿ï©GtÏÞ‘•dhõ_B'W`Þª­M´œŠZ ;\÷¶K‘w>˜—= ™G½ÃI¦f”¿Ž¥ÂdI.w»·p@ÉDÄxrÇ�ª�„´áb W¼9Û‡-3TTIÌ8FÉ€bñÅÖÓ™xC!ÛBÅ”j§1Ë'@:ÐFŒŒˆµANNp�$ tÅ×Q¬| Ô½­|~Úød/çŸõcY»ñöÔok•€U0„T…N6|àhŠi¶µÉ:Ë”r½ïc2B%þ-ˆ 3"KØÞ À ôANÿ\ kÇ•ºqˆ¤€¼l0*çáY×öi0ÉÎ_�Dô'à;±‰å8DRÑÂ#œb=a’|ýšý÷€8ã.×ÿx—,_O äôeÅ3ä$$²Þ"^B_ÄPæf6ã_ȰïiiçWç•_ÆßðôËRÿDÓ„­mµÎ1íŸhNÑ.'…$�srÝŽcq-fذ\\’á,ßP|ë õ4„§`¹�&gˆ‚ˆ©s„=s1±Ú¿2¬ñ=/ócÇõÿ ׯ÷—+†ÌÃÍH¯ˆ¬|‰Ÿ•�î ;ÈÚ€;ºl Xð"[M JŒùµÔÌMKHeV@Ë<A).´FÀho¦ãâÏ­ŽÖ6‰“ÑÁ ¡Á±Žp`ëéf�6 ã9z—¼Nin©ÚŒìp¬= €¤Œ ¢(�¢/ÁÓ¥_|¬„7oãfè¥Sc½cÂ�p5iåG?ðþ‚— ½”Î郈†àh…rÐ n¼q¹óÐ.ðËçMœä’21Ë€˜:XÛ[Üåۙ䉮¨‡ {øsã® ÚÒÍ“ŒD˜AGŽÁ·š¨.°A>¾s÷ªö÷öïËÃo#üãÇ®‚}v{Çþ.¹xÌ¸Ñ 6 í¦©íg®þ©ésüZ5žýÿ[.źÆ÷ׄëߢu(®Î¬{]è³ê›—¯>c*Çõ»gÞ¼×Ôt½ïÎoÝ�¾ö�yé‡ëO#\ûõŸ¶_aÍ=ºZùØE¯1Ýüfƒ’ì8ÎRàŒü•ù+Z×ïO“ËÙPº †zQŸvì!¬Á3ݘڽµ­ëïªç¿þ()J(úäî¿7ó¿žÜóÛSÞÑà›¹ñÓÛˉ~èŸfè°M;Ò½÷‹¿¶öœO\ýý—<[ù¯)ü¸k´Ö®M?yó¦Ç¤ü?M1×)Ì[õû®²ÓË‚A™¦™øÝkÓm�·º]8M—žËc«Oxã¾�ÚvÈ”m+MÁ£—žë®ªz¨{ݽ¢ø=Òì–Ï�Ø„^-Ûˆì:þnznz÷^`g“ýÚãóÞûð8mK*»­�>ûx÷^“ztò½³Ò¡t?¼Ò>;zÔª6ïçÝlëã~·ŽýwÝ kæ™ÅEÙ³i´g§yÆYd²Ý)pR˜ïØ£Ú/|Ó¸ïÏ/½7~}‚íOIïOùÕ<›”Y>»ä¤oò¸³¾Ët­HF¡¡Ð~7÷fŸ¬zñá½GŸ".èFŽý¸5VÓÏ”®#ÆÇù4ùCóbdrõ˜áüø¦/ŽWhžC*ã»;ܯÇ5}øŒ–ø÷ÚÒgYÒ,-âP.«çn÷™;è&oÍÙëÆ™¿ªõ”ã_OñÚÂÍGC¶Íä3ž«ê¿>:'aÜ?�.HhTO:5~�´çƒ a[ożSËp+¡¾ðÃþG?ÙxÄøÐŒµ¡2'º²7‰�îµZB3Îm¶¶™LªÅ­‹}åNSÞ9üó­7LDv0q"¢¡h\ÌœˆH óÃõ{$k4Ùß›)c‚Z¼(¨IÖü9uÊe1{pR†'ÅpˆyÌD+býxù�Ö+ÞOø¨›qóÒÚòéWky–" ÂöAEò�åƒ8u#ÑŒmbÀÞüÖ3ÂÉ·—5Ü«ÜÓÚél¨ã½ÎcÐ#DÞ”³ÄS˜‘ b™ÑŽsûTK9©"¤è»\«\€BD­\yef¦±¨üN7)¼öŽ|©.I$iØOtHp8s‚Tf¸e®9OøA˜¤¤ÐÂçz€@2 Úf™¡a¢Cô%\0[0áóTJ˜1q�`ˆ€ ä[úÞyËšãæ4‹=ÿÜ…Š/VŠ ù®ŽáÒ"I„"D’“¡k  Ô ¤xÐÊøÀ‹ÌJ)K Fƒ)`°Fb÷Ép,A6!v Õ @Î0&„|…쿃ñ¡«ô¨Ui¸T‡ÆÆLh-ÐØÈù.hqëÛÎ8 #€N6 4Îȶò1ÛEꚥ¬XÓK¡53¦¦gNŽ@»a£V.Ÿt%ì;jÙpÎÛ˜÷ín_}m'Þ+„uŠìî¿õé`…3Õ§£þÌ;`Š èQ·¶ámH®2�Â@£Ê {�Í!òÔbDqž2…æX8’,Žê �b+ c¬NdF;aºVP–уľ’O#Lý!sKxžWßJ5é(2¯{mc¶ÿ—ã�ng�"£œ1&†ìpK^§&‰$†•¨(¡e˯Šû#ÎÒ§ );¸lAÅwþëÔÍÕ íYëêd"àÅ5�×g1â¿ÁüP^° ÜFµ¬U¢g$GN&æ8ÕÍœ„ÖÕ|vNž~cÓN<uëç?Ô7üqº~åŽXüŠUôÛ:ŒøÈAsâ�išm óiw¬ÖÞºÀáÐéâXÏ!Íø!}2kZËË©œúÂçšáì&S£';Ž�Cgõ>³i«¤¸EÙö€üNÛ¥XÞ:û÷÷¡ –ëVéÅýÏÜü´Ýòý¡/žº3±”;}·ƒð/€è}˜Æ?æ]8&wŽ;|]ðßÞp(ïßÔϪºí__\˜×Lz½$þçlEZŸ’ùâÛbt_˜ƒ@Z_�>¼õëÒÚH·‘ó·EÍãÑ:ÌåðzÛÛ;ù›ûW‚ÚŽ«¦ÖMývŸ‡Ÿ ‡­‡yÇ£{—ª° àâ¿é[C\ˆÉ*±�pâ …Š�9¾ºG^i½þP;ËÝ“¶{üóÊøÝß«¬¹*õĈ’^#Ôù{Rý»ú”2»o&ŸsµY¾™Mtýí%Â÷%ëÈœ;×]/Î=v¶–‡èm¸`Ÿ¯¸ð"ãüWMƒq*ú’Yyðò°iÞÚÊ:½7hû«»µ}wÌN=·^W®ôb/¾Wwg]×[SÒ7»�Œ}“©)ó�e òcˆ·½Ú9Õyã é“ëù)óªÍ¶8'ÉoðÅÖY¡1ºxíá5ÎV¦\ü^^BN£ÿb }s»Ô=þªÚBèåõÞãÍ™³‰Þm,æÃPÚë|a©[äd@à)u—ÿ Ž^öÝîjæ"¿õ¤öyW}c øÓ¡ÐÎ57厒”ÔarÛ~->gDZßÛµú€µ¹ƒéaIH„qº|Àû‰ Øp<ÏSÁ ¼Þ]LH²‹ˆXã¢b÷"d{w8÷Šìb[aÎa<ƒ>ØâØA ÈN‘_¦™ðæ{ßc3º@Íî‰ÜèÖ kêBY‡p—[ÙuŠiÃ…ñç–²O½û^¤øÊΕ’üQé�9w±ó±ZJ¾U­ó u.� Åê`‘;X¸pŸ{I!Iæ¼?²xóêgžM¦S„¼9okvþð “‹£8^I$¶KÑf)g#„²n¾lÍ@Hå -·z¾ì-_$µ0¤Á†-"èšaÛãLgXu5Cô”`yÙ,öä^Š„`xañò¤ «Lƒ=(•YàÄžv…‚pWYWôJ+É,ˆ&‹i§ý°+Ü/°¿?{�ç6¼p©;¨ÄP °Á�AíˆëÊ É®ûë}yœÌitÅV•A¹d¤áRå�€3³µù§äŠûÁk±¯ÜAÓA‡®åGª!0ŸG™ÄèWE‘ÌØÑxN¿P‰YCTÓ!Ôõ  ¨H‹t0°Q#Ë]ÊH�Q?ü—ê„ÛÈ“2±EóÏï-´¾�N!žu%fâu¯”LºäÁée”v5Ù„4fY±EŒ=dN**(*'T<ÜA´ž¡ñE½Eç­æ…i�𶉧ÝÜ ?\LÔà ã?¬V°ÆV>6ñ<Ñá¾ü,fج¤Ó/ÄGÕá #ŽÜõT6ÐÉ?r: 6 ò1¦€ä”Ž1£”(ÂdØÊ/µC–}ªçr7þ ý��@EDõ@TÚ¾ EßÖ–;áš·Þ¾d:£B+㹌ëáÇ© ®0ŽÛ3ëï‰Ü•mHÙ‚¿ß,IÒS’×çZ¤Úý¯3ÆXãìXuàÝ¢}Ÿ¿³±TC6áÊ3©�“ݱNMæÛZ õûqç§®o>x0îÏ�ûr)?Wvwë|Õn«c{|CyðÛu˜ 7Ž?»ø¿¼¶Ãž‘᮫·õ{lñÖ‰½ ƒQÆ1¿B«šåÍà—Toœlõ”mifî«}:¸œ;Cääìh‡‰®ÚG“éæøºÜ’GÃ]}üä)Ì Vç9–ñ\1‚kå)Õš”^ÜÊn�M*ì/ûOr÷¼�¼·i5/ëÂm@xµ:~ŽÝ>ñ üø¬â*�:tFõ#ó^Ÿcw¤&Þä])žj;CÜ¢ ue–Õ…úæMç 볚;Ý7m\ÆÁÎñû‚çóÝÅ™�wZƒûËfÓÔ»ú.éÆ©ÄœsЇipì–êŸ1ê>\¼Ò•I¾«=©2vëç•EëT©Ìëá¥&øaõŽJ¹‡™ûõÏJ÷ùlñëªúZ>–¼Òoß«�¨†¹÷ü_åå‡ÛÊõî~Û÷Ã!Õ'ÅvÀÇéÅc¥ÝûÀLt4|»[)ãkqñß)»;áíß4ægµ?Ó Ò ŽÖʼLZý«ÔM5Ùc¾¿o¬�¢ªíð™ðØã—£©;àµ_ö]ëiÉ훘§ëè¥!×bmÀß�œUźøgFÓ¨‡ÑØ7ËG©Iÿ‚“?�>W¿>‰Õ}x®×®Ãïimøs.ÉÜ?v“æ«øé„�U� ïóãÃ_DòѲúg»:ýÈç¼5Û¶·í¶¿&åéqûNÓý$€j5»G^á_nvC�dXxt42œjÞ\Ùd˜…^ýfÖ,0/«,2¹kp½*ðøú±�¼:[:–=N§“Ø}‡tàg‘™ ¶a Syn²P™á½‡vÄ–>HäÉ �‘Èz?7úž»Q(UêBä“zy[ÑãÅò±llS8q,ºÛ1Á3eðñêÔšXÀŒ\}QÇž&?´?\ÅX–üñœº8ÉÓWÚÐbÛÈìoÉþÎ žAÜÏÅÁ®¹.€Xl�â™q×kK³ÓÇÚÖí›üÆ,Wj;݉ Xgw#„Ád2� ¤ DŽ2ˆ5t£Ÿå2B0ÒºCJ6ÉÑ=ˆ³ ³x°$�D Í®Šsþ>Èíñqâ´Ô/Ï—K-¢X±É¬Us‘ÑŠÏ ò�‘ƒ=pîëßø~'>—3³ÇiŸîž<êò¦#ƒXÕýÝtëÓx†æ,@Á);5ÚË®Dn/6\`шŽ0x ¬ € ã‰Gù…"ý}¯ŠþcüϽçÄâjæµùHÍ�—ž§½î‡ãX€ÀÄ� :½„pÝ[@.%w25*åeÄ ?:ûðpó›S Á{å­O×Sü›ÈŸ�YNàÉü�y|ܦò±Ø€ªØ¤%*€4” 0É Ö<�ÈG‚Î9"0T&I‰dþ!¿5‹^Õ Í]¶é|~8éÓC!È:GhTgˆü¦�Aû0´€øKa�r(!±Kò‹Lü]—o-”Š!!YL í ‘g�_ßö�(Žbv#ÉÍྶôã+ÁÓVÑÞ6ÉÁÇŸ|o¾ú7b\ MÓCè5û¨óRb¯'ÀOkq jÓñŠ^a½`m–ÐTùkBç öK¬b¯á¥@!@B¢0üDsÌ ù–­xt³›ˆ“a–\¨äp( ©àmÉ3yO”Ц7MüL½ë4ÍMÃNåðK9vV=y¨èQèÀÏ[-N>›Ð¡Üõêó.¿zÛ;çß®"•¥8^»Ñ¸˜¥¦²ëKójÍ-I\øeˆbÈ~(D?§M3Íí"Ã5ÁœÇÎmk®°€Þ”{LY�†÷�ácvb�ëË‘×QLxfŤ ÖÊÖÄgcéKžÑ‚lbØa’íï�;^qû;ä:¹Ý9G0_5C—¾x¬+âëóT¯ít÷çjeòøËÈ(ÙήhǯX‹*ßrRÇ�¥Ò�ºx!ã�à¹é2ñú‰8à–»Ú‘ùN«¶úRåˆ�×»Qžðbìd��Œ’ÿu‰Ž½øÙãç¼åç=R®õ È.�ó×iúsVö§�ræNõC •»x—Ž–²nàÉ‚†7¯ÈBQé |—–õe|ÈÙ<ÅO£GŠs:‹õ—®î´µË7ºtÞüKëâÔ,ô XI‘pý¸«žÍ÷-xš¾8wȾøùOƒìï2+·äF}EÃÃÓ÷j—ìûâ�)Î{𸿻{.Xo^½9[š—âk¿~ý¾}|kŒkõºéãåøÛëzü ¼‡€ËB×·{~Ç^Coì§Å=V¾ùü~ùÔ>Š»þ^Nߟ<>ÇôDŽیÛäZÿš ÝŸ¸·€¹×Ü<ä³6kCŽ¿»yĽu\•ÒÙ}ªí]am‡xñÇZUµùÁú‹º‘T5åu” ¾ƒE×6Ö�qÒÈÂ(ýßp±ÔcµÎúO§Í6 c�àÍëû§Ì7®=IŸ'µÇ-žSÄï都ÿ'c…ÙJ�1{åCÀÀ÷ûsÛXû+ Û—U¸œ}Ž{ALŒœ•°W©5=ì`dƒ Â4âY Iëâ+”j"È&asëAµzÕ)*J(ã‚ÒÜyçƒÚe,pœ0àMæÓ„¤xŒ‚KÆkD€ü¶3�d˜I¶:ßèçE±\xÿ{_;k¥õNG•rÓo»ëÍS¢dRP0{­ìÃ\ °Ñú8‘Å|‰ ü!Ǩa{ ÙÜ”7ѱi4–±Ò±s,VËþd[õhK°‘ƒ­JÁ˜´dL¶XLïBÝ�~mµ‹d§ß^ë¬ ³ÿñNÐùd@Ò[\0‹X ^r€˜ÕÝ�œ�¸YtÃþ€ ¦›å\öá̉�òϾ2/ý÷ÀDßù‡>rµÄ ƒË ŒH€çšþ˜ŸGú¡e_­¯“ +þ¾ã;4�Ì‹«È ¶}Â<Žt‰Dìˆ#ã$ €£ |LxŸÎz«3_[æEn¯�h –²¿nh³¯ÿ\–ãŸÍ�|û°­SÿÈ‘VÇ d)xY*ŠRõg‰½ ‹äUuäy{tµê«Ê”ÛÉÁ4ÓÿE cíád`I[ ¬³™ÒÃw�UL³¦W7¾¶|¨È4 œ©í &R×.ÐeÊZÇxÛü•=¹ÛRä’bÜ•¾–¥Û€ÆôëEáÅ,tÈÑðʆÁà(Å ÓÒý«ì^ˆ1^½¡a¹}8 !p°�— ïÌxI$ˆW-…lxPôû¸`�Þö>ƒDK�“Þh+³ŽYq_  ›8­½õC,Ìp•±«MrÐÕ}–ì®pVÚöô²âÁ«fõ?¼y}y¾  0äѧ¸'†éÇH¿I[?B]µÀ�|!�öó甇ÿ¼;¡?A—¦B»*�[îU|õˆôŸ?;×=#…ôNùž:]û`gßWt.Df!? \–ËÒ'xðìOÂÚpÆÎ’g‡:Þ“²hg^ +áLÞÞ:íâÖz¢ÙøÅv ®°ö7½}7ǨßŘéuí×6g‘°«´ÿ;wN­“gNªõk«Õ«ä­C¯zQ\ºa»_°JÜrðë;ÌpæjÕ^ºÛ½Ë!Ÿóµm.D ™v|¥“Ž×ŽÛ?vÂ,°F:KòÛutóدÀ\ý š.ì{öÇ÷ßÏŸQž|mìºvåÛõޏäsšmMò^Z&+»—Ïn㼞ˆÛ2Í\gѹݽþö_æxõNìR',µúm\ù¯–lýº®Nb³¾ ˆ~¡$Uóº·êîÓÇë+�´"@Z¥YónÞùgœtq¬šGz#'>Ä>f OI{}ŸKz�¿~šÕ‚ÜŽxÇ]k³Ý™cѲŒløõ𯕌²#ßoPÜ{� 2öLÞ(m»l®±ýIJœÿf ù-v¦Ö¾/æ](/!`g© Þ¼þók9±ZoMº¿M`v;ôÚ¾™Ç¼lÛÂ}˜×ø³~»¯k¸ùÞ[9¯­¶ -R9æTŸ ùð­]Ëpl .¯,õøk®…¼þÇYµ²ÏFY—j7–F4ogn-é°©ÚIA“s»A‚ôàò¾½3\AVƒwóÖý<öÕ›Ö£‚ÖÚxÌù`¦Ì] � Sîî~#MñÞœ^¶[͘]Ð=ùA'­Ú& ßWD[K�ÚkŠwíÀ6wé²e£×$º%y×a÷æe ôñÑ“jeK*‡_áß!÷´&ÅìsÐá«Ä9Fˆ®�½d ÐZªäÄxîTS4Q¢G'Œ [Äàf>ä]iËÏÞÿ5?æ 3hÎÙp ç®f¼¨?� HtÕÞÁP¤¬¬†Ñi0¡kÝ©p˜Nµ-± ‹jÈ+ëË/íµ˜^<œÚoc»“ZF:Eh%“[gÕ´F¥\„x+:´c.™™e�Ʊ« Öæ1˽:±! \�4¤Í€Zp÷=W?- YÚü:øfi2;äõª ¢ëÎÒäÖ(p‡Dltzâ4h“´1ylŒðdB±k�‹�•³Ÿxh»¥>?îkù|§XóçU¤Û\±|¨Í½õÁõùŒ=ý&•&±²Š™``¹W7ˆh&±Îpj‰¾•»(´"\2<œÌÊ.h[Yaºg’BYÿ‰Žmü/”¼¨˜Û tvþ(�ÈE{xvÜq|‹oóábÅÊÛ™QBŽòUŽX-°¤4n·ªv}‹ðÀ$¶'&Ö`þ½ÇýùƒÚãIög»ïãW¶Ç%yØ!jÚ�ˆjó�#�`<=qù ¤ãŽ|3Æ„ÎêðÛ¦,ë…@–…Ž'2®DNVÀƒ,¿ëædM�nE [€ƒVý8e�u±o;r’eï}íUXNUïÏkõ%O‰üÌþç®9éÒp¹8ŸÌôÊfâóJh¡kૹñ�¡ý|N}Ãðz»û«®uS2zŠÖ ‚w+W¹AbCöRšk�Qœù‡t´� hw4 hSfAn�ØÈ3Ö'÷Pi ?ÓF�Š–=ëµ°¡õ"„þ C`FüoCo«;¿ó=û»×˯f#ã‚®ÌûêýmØ8$˜>¼Ã«ïÅ Uú\c Ò»Šß5ßDž9úøô×<m˜Va‹Ä/ÓÇŠûÌ:v–³|ú\6µ k¿DÏ,®ºFR/"íŸëøé¶Á݇úÖwaß ?}óD#qcÔ”8*ãÓçõ:8F0é]§1ÖÞÈûö ¡v¾ÖøÿaÝ!ä­úσÏ}ˆ™Ô»3ëG�×o®ž ½J#Ï]�qÒÞX m µ¿�¬=ýu»y™”_ٿٷyáé+ãµzü(¡½·žƒ”Z§Ã{§�èÿ#o -‡ßÇlÌ¢j>¹¦"4ã/ø ™ ³–‘oC€¾akÀýHŽgÈ’å•z¸?ÑÍoç™´Ïy,ß++MíÇ-r½¼(­8ÚÐJ Uda·+%)Y�1µËîX–-cxmbZM$�ÖT2J„5ƒ€ þWó4ÌkÎÑÐúØÁÕ9|Åî«€@0¬âT€`uíÆÚÜ$•µ¨uƒ©¾F¿§ Î$½ªÉeþ”m c�œþ©r›ðó¶Dz’k·�Ü»½vëÛ³™\Kv�¶ó@9�ÉãR!#¯Êÿ3ìáí’ ì¬ŽUoTŸ÷O5Štº/yÊu*!�hʵ%‹kz jb€Z;«g¥†éÈE<ûh¨/ØÙ¡ÏòQ^……óÚ�ŠÖV-où�k³ówÒUõK¿aαƒôƒ:tv°uÝèy5)A“éÜ€�€G®^Í]™8: èC€F+L �j É]ìØ×Lý,ùtF¥ÌóÏÊ‹¬ƒóÒyH↽*žÇÌØöÆòGÇUáÇ�#ró¹HKë[cHæ’Z/’(8„@O[°3ÀjpÁÕ¶y!2°’ǦƒdV¤�á·Ú_­sï:UhøÆIŸ~„K1Ñ…QƒƒˆÓ�Qµ º~`ª‘û‘$FAƒG84E†oŽ6ÙñÁ¹Q*¦�Au!�ò™bâB ¦±e6¢Áb"õLX60¨…ì�PÒSƒ$R¦½ R‚¾Ëçixñ°žä%ôŦΧ=Ï<òÆ QÜü‡Ë¸¹ÝpÐa3�“¦¼–h|CPcH~[ïÏWÎw|:¤ìü&?èçßÅÎMò�ºv9{ŽêÑÿtî)vÝTñUýø~¤þ‘ðÙ%‡jCôóé�Ùö �±«Ú\Mì=H¼ÍŠý'~fŠ�®‘þj1?t ìGÏx{'ÉíñO+ÛÌc⌶ÛLE#íà{XgÄ®=G]wÚ�éÓÑß]>>¥-ûÀ>z]3y(øãÓ¸Ë~á(c­8íîlwî®X×>¡Þñòí È_méínt{ý·¹Ê�á¿<ñå(ȃoqN¹ëä ŸIÙñ÷œ“ð1ë…3ÉZWªáË‚q.o¤Òä¹w„ÿ:µï�n MûÇÔ—Ÿ§”û³ë÷¿†-qíö_iã7|ç<•÷dúlã­(¿ïÇ÷øLlÇUèF”/ÇSã¿Éõû¿ Õ:¶¾;ñ>_ËŠN’mûÌñ·áÑöKö“,¼ï{�›�ÚõÄ»óÌâ[¥ßóÆ1®o�KN—6.© †7¦Ö‰³¢ÞëâÒ“5Þ�÷`ù×¢Þö6ërÏÄ1uRüöÀe®M‹åëæ4ôÍü°vñÞæTW“û×1£Ðµi¾>= z1iÏÛB¾ýÇGõ¤ïÐLG–½¬–µžÍõ�׎9XìW†ýºú««¤Þ}§ÍM³Rþ†œÑðÄKäeY/¡¹~gåmñrTO-®¯ÊµlkenztÛßË@Âg»gï¼û4wß½1¦bŸ½IVœL߆ yøœsÑüLæÉܵm7“Ý×Þ�’æ½6éɈöìs�ß߻ߘïÀå^ÈBÛ£–j‰ªñó}”°H�ïY9±ûHA¨Æ¹8O6! ±Õž×4‰á0÷ { }8”H'b1Ü׳R¼© Ç‚:Œ’v/jéÔlP¨} SôqËÎ{Ò ´KEt4ô¿´ÅY%Aà÷ŸbÊI”Ïl〠Æ#P£Œ0=Þ$b&rb†Pã0þ©‡ÀÛg{o�ðq­ò [±;ÒõNÎUC² $cÁ4+2zHNÞzA78ßR8ÝÌÊæƒÜlG DIBþó'u9”X—ôm¥Ž3•ð® X°Y/T�x�PUšºˆ±@RÅeâ&—Fá�ö>Ï7¢Â,“aP¬à©¬ë³v³ÙˆSbÔ„D  7ºâ…É’0¿…¡"A³¢²¿ÚBúcîcßçøyV äùxò´)^UÃs!Ä‘?”…Jj Y�p2.{J“:ðÓBÉ,õvÖ&(°q÷J&Hi†XÁf÷8SÛèÂ~¹Í´*×/׉‹Õ`÷µÝÌô¹«žyWöÕŸ8ñÓk�D„… mŸÇáÛM¹Â²@–Ók¦6 ")ñ¨e[ÕQìx¶2|…À‰ Æ!E,35…M4ÙFTF0b*i`“ÏÖ¾„Œ™ìe¡EH>!–ÞâfÌš=Þ ûaöÉØ‘Ö"RFBu  0ˆ1B�/éë|�U8ÚPç¸ �A¾ò8ëÁÒ‚’L‡O£Ý#­øë×Äånõ[£ÇòÐŽ4°°ço.ÌÏ$çø¤Ù3н’²SìÜh[ˆ#œ§†W5Z¼<\Š;Ï.;Qùß]\Ùn�ðÌOÉ+Gàù»iÒö­�…ñö¯x=-ÁØÛ5R‡ðuØ5ª jãË#'8ÜàнÍÄL+ /rœö‘k7Å,Ï–fò„Òæüãx”éÔBK¡n˜·!ÇFn;�æQ®®p#Â3kò*7“æ×ÁíOUh³o2¶£”&· ¥ZLý‡~)ØÙ.¸‹©|ÁZ³þV¿5Ê{âlÅ£{˜�óŸ/;¯ó<> ræ c½1¶¹ü_˜p^¬Q—³}-õ¡'ùg¶RÈ^¹ôÏ¿©w¡ÿ©¹·¢LÜÄ´™âìŠëX»‚í8|ô´ê_/]Ïoœ<¥×+Rf¾©¼>Ó? ’Ë�Ä]ëÉñ­¨xíŽÌ›zå5Í8˜”ì]ƒ¾BQúlÉw˜5Äç!b]~%6ùG7šW¸äû:»Ã5WצÎ öú.••~>óÚ…½öçòè~•ë-Âw÷Æùo"U�4͈¬74õV4§CÐ S×H™&1®ûÓ½»Ö¿{-žSbZ…·Öøî¿Ì|'µæë…_—8ŸÝiŸ:‘ø“»6`ã¿®Œæ] |Bnógt¯muý¶Á¼ÏßÕÏÇ6rßÅ �ç™3»Þdˆ¥Ëš –�Õ+ÚjBN§R&˜6 Cq¬ÃŽŠ¢ø¯ëhxÈǼ ‚»'çqädF$TŠ,\’Ž ÍŸ�¶§3› v´Íxͺ�j�€2ÎóØÀÇY‚IÒì,!éy'Mšx¤Û­Ä6Eʲڇ+®®+o«ïϽöúãc+ë)�Ì?¡ußz¾žDw§‹µœgcD L`ÌÛ8¿Ï¯¨å\©8cgƒE¹_Â�žY64¿ÍE«×¾ö¾Œ$IÝ;t / d#è[-¹éAY½´©àZÄÅ®Cï2¼uKEâRí¶ðг,öÅ�ò§üU’*ååUrQDyJ ŽáME@{Å‹2ÑB�Cg5$ø1�ZJ—08®R‡g]O}ÞWªI³YDCBÝù\g�yEŰ‹²ÚœHŒt@èNPùUÄ€@'�·Û0g�ÙÑ~И¶%ôv½¼041‚ÊB8ÔR šYÎ÷¯~u%‹|mnù±G•jvs-°”’Ž~Ï“„'²=wåç¬48QýÿYÏÍrxñ¸îfk¨G�çðùw¶&”bB‰£WÉai›!\ªÆ` ~k$�jQ•ïkuÌ×õˆ`<}9HW�TAüß/ëÕŠé’¨?Íh|+á�pE@¸((»€ïå9C4ù*ïÓ�VÖ6íú±\üKîºñÚ/÷׸f½N�æ7?1})>—Û…\w¦s=ûýGsÀ·SÅN]J¾sê†:ϹrÍyüYù×ô©�ëçÇÆ‡÷éÑÎë=%£Ó.^^&±6>]·{Ìy߬:ŽÖ®f¾ð÷ya7mGëËw�4Ííò^^ ‡}²ø·nƒŽòqWÔµ6ìÖTDwnxNýÝ[·ÏWh½x¿ÌvlØFo8~eYµß½ix1A²ouÇ¿¡?Uõ@³‡5Ýz÷ôþ¾Hš:»Θķolofoߥ¾ö÷f¯-!Äw!\¶;vd÷jˆ|Û�×Övúܧ«Q×m±.»†¿#µ6¯‡øcðp^þf~íÈñÅaK øÒð’>¾[Ú?3÷ñª{y�~½º¯¯MÑ~{_�™"ëÎ:L##À4û\G]s›WÆ›0+ð—߯­ýø�N�·o½Ñí×Aܬ–¸÷ǦŸÜࣷEù^©â8¦âM`d°Ž&ê‹nL×FõÞwëš2Ü>v_ìéé븆 ³9áQh? _‡á†ôbáqˆÅ}ÏW;>·\�tãë^þ½‰r©>Ÿ…º?#R©Wqjìæ}Ü^7‡¼‘¹ô-Ù‘¿Ÿ™Ç»qÄ…gHrëèC({Û¸.¬Ë±µKËæ:É”yÁ¬ór¡†O ›´( Ô0µ¿=øÌzV=䜎ÐZlþ–’ö‚¥{2lj?OÏzf=ŸÚP�Ó¶–¥âÞæ9éî[üÏË·"ù³Mû3ˆ‰Ömˆç±º¼íìïÙé,ýæIê^«è�§×…·B[ÔÈÌ¢pëÇ~!ò]2¥;äÌ�lýÃÓ‚Ï#ºâ"+øûêðoõí�<ÖMùxÆ7 ìÈø*”¢SRØKBŸs2ÛgIDy31œË�ͨÿáê‚Ô€$ˆœƒ�—üx»m<ýa }õfGÞp3Äÿ×DÄ�q3Û‹­Æ…]K`TA¹ ⩾)a$,¬XL *e®ºå(ª¹Êß0ÆßÌ­ž-G•/´÷ÓrB<2â#´!(øñ ²ËÝ É 7$oTÔj·ÏiŒ­-7‡¬“Æõë,ÐÿTë”Ï=19!‹GŒ÷„@¯¸"p,kÙ¥~‰ ;ÀÖaT ;q¹é–ËŽß6ÀirÔÒŽµ1’‡ãŒ`r‚Æ9( �ÊÊ‚”.E! ¢¬ÌO•¨€�êK·OçÃûƹÉbÚ*ÖyÅcˆ•bb¥P!91°CÄKŒ@Gû¾z™ÇéT »F-õxÐì=çœÇꦥ-,!CQǧ×�?Á´=‚þŽš®rƒÆ�8€Ú_›â=p�ç‚Vs›Š\ªÏ´ò~ñYùqáËLŒíUn~† ‹Ë)êjÞQ�¶„èù$ SÀS@‹a]ëFŠ»ãOÌÚÏ�\ÃŒÇçî\ʷ僗~£nÄ‘’IÁw¼×Dú=¹“SK„+%®Q±nÂÑJ�bР ±5òŒÅÌE¸žX§žñ(7rBø:{‡t&G0pç†jBvˆXŠ‚¡>]„€†ðúˆ‰© �ò¢ÜËèjË î&”§TýA³ùwArK¡Ë[Kªƒ† ×aOpE>¨1TdT€¨(¡aÀ&D3E›*$ÚbH’‘SJ62RkK#RÑ%RÉSše£6P‰5i-ƒ3i’#M S,Õ&L lL@­-„‘¢)„š¦F’ØÒƒcIZJS-K-4,b!Kd¡,Û3hÑ«”‰)›bl“ K!¡²)™‚Ê1A@DÍ5&*VdÓ‚bŠk1¤)¥¥K4³hÆ–2 ÒL¢ÆM*BBŒE%–@Ó%)4€’Ê3-(QŠ&¢FPcRiLIB$hÓeÌ‘6jU)"ÍT²l3²ÀÈÛ$šYdf4 LRÌ+6�S2L�+5I ,Òh‰Sf“$ &"”6I³ÍMƒ*Y´…FÆÌQ±i¨“i‚¤ �³A‰0)‘L,¥ 6Ri£$ÙT´Ì°V4`4S2‰³ fH”ÆY‰¦M$ lÆ”f™™RJY4‘¬­“"¤´Ìišf-0Ê „,Jl¡iKM³1‚6(³1¨–”³&J Ùˆ¬±�3fe¦T”‘ŒÆÊ@HÔÄȦK(%-6’’l…2Ì)#M £Y””E�&ÌÆ™›5LŠ iQ3dÊIjDØE&e˜Ka¤1dØÙ1I$µ,2¤Z›)&cd¬šf¦˜ÒY6”Òe‘¨Ì²6B²£)–šFÐÖ$Úf-“5%’ÚQ´¥*M˜lĀшDRÙ“DLÛ6–QšmMX dR)�Ó% ©Y›*kD2šÄÚ,Í S(,FÐ&R¤TSHfUh´j)JaE&›4iL5™)ªZ,…’™²m*&5B–)f’PŒÑ…&´”‰R¡F¨ÑiSE4ÒÊ¢jY©´ÒÒ˜¡V`ÖP©‹3Q˜–ØÔšÉ±Ššd³¤©›&4Ù²› 31ŒÍ’i´ÒȉjbI,I©™Xɳ Q’)”QR�l*”“RÚjˆÉ3T�Mš”Ô„…4Ò›)R²ÊÔY´�5% iÔY‘&±6TH“lÒ”©•6�%iªbͦ“ #M$*…JI•DmLYTY©Y&cS Û6-,HQ,¤šldYiQDÒÂR…,ÐÆ)¦’É•ÈÄ&É%™%†f‘K IMKJl•5JLË)ªmhÛ6‰š²idÚLÒBÃTˆ…I1ˆ4TE¥”VPД-´‘HÊcJ„†ËI©³IS))’e-”²&ÄɦŒe&’ÅJB€¤¦l’ÑI6J4…LÓ$ÀÉi[‘™™ ’’‚¦Jšl‰P†Ä„Å1‰”,Sf¥2–¤f@‘RÆ &T€Ñh¥˜Œ”Sh‚›fII©3”™eKSSd‘¡ªM‰LFŠ¥5Òi²Rm&f“F¤£R`B±ˆ’¥1I’‹H(M,VdÓbhk&ÙI!”Ë!²‚¤ÆÆXÚIA²ehhÊQIe©šP¦fš˜i¡d¶64Ì“eŠ6Ie4‰¤ÌfhF&4A2# Y&a)*� )T›C5"D‘L•B) )d©¦‹4ÊTÚR2¤†„�”Y¤¥J1)¦SÅhU12”Ù,ši¤”¢DØÆÍe-i�F65IFI‹4š4E†HMIfKJL¥Œešf"FY¥¶Õ[y*Ú¶º¨QB�QÀ"¢~ªŠ /_Écu¦çŽ«wBùÑos˹AÉ)‘¾DO2_ÖG§˜¿ãš|þ�"ÙåƒK� ±ü“ѓ娤{¨ÇþO­ÍßmÃXµsOÿJ±Ruyóɴ⪺·“»TlϲŽ34N—0öÅW>4èÀo“ó¯U¡Î¡§vFf”ºÎày÷] †«½@’$‡¨„D±Uƺßô‰£MðûÔ³¹V)�áuüù\%¥c¦zôšwË\r¶½-bÕ®h"( ãô;WŸ¯{g+}þÐâÁA;°è,U‚)²"?g§¶vз­žxþw¿‘8ÅS�_Þǧ‡åɦ^¿Þþ½ºBüä‡å€ "Dç¯�iÅúþÎYýã)™¦šxbV=-—~Ý£Ì:tψùéRoWÌ×÷Ž÷Zú¤`BuÒÕ5D� —…1ÏõßוyÕyÿ¸·ÕT9L�pÔWót’òfLjgõîw0jˆP¾]�ÀOÙ^Ì]¥(3ëùîZ#[T-Ùvå¯è{|*=î�uz5¬§ÿÈ-.P4A%Àš(Å+…œ@ÿÀìà h#”<¿JÿQ€ù•“©DW)6ÃÕ<94r)‚•—¸šª˜P_ð©=)üù¶ÝÚs˜ÉKcy÷ÌW¸à¸?½Sê¾KB?ŒêÊÍØ¸÷H8Ö*½×IéLL‰˜ÁÚHÒqà£J§îËïUÁçÕ=4v¨–s-CÆÖÓ»ec!ûì/9b^¤ô9&3¤VnÊÈ\‚Ñ·Ì”=‹Ë‡;“J /¹‡Öî‹F"Ùï€k¼„Á"|ÒaÊ1î�,Nf#ªµÊõç;Æx`£Ì ‡#ÅJ/qvæu²,`™ô’u…°í¾h ¶0¦ÖáiŒ™�ZbÍž>¤ì–"Y6!ã@­ «Kyšæ±VÑm°íËæxÕÉx0ÄDŒØUχІýÒ[c3ØËò÷EÐE ­sÃŽs< 8ÊzÓÌSØ_¿ý[ŒaAGésÉNö¶H=l 8Œ÷0Ùü[¿›k“üOÉ"”È�uÒo¾Pa¦• y§Ø¨Ž–hø[~~¶UÍFÞ)ØÞÏô#ÎK´Ü‡t“v`´©Â]ιìæõ™/cpÝ¿AxÈÞ\_ÅÚ€ŒGqÔΊÇr>¿$Rh–ÐÃÿfuÊ&bd^F; °˜«�ЉÀÔS@ÇÓÃ"Á=,fºCÎÏÒ�þPÇ'&ó:g¨jÑDQɽ¡ÎŠÛübü;S¨Á~\%Â&?Í*ñ2]’1§Î'V[àØ‰6€ Y l÷yn¤I ¡“:ÿ•ÒÌÉ^¤)gÀœo:£ÛjÃVùŽG‹á�$à‹G|SX[¡|ûicíõ�‡�×(ð:`Ú ¬œj$X€ü*Y`Œ¡’'Š�ÃR \ø¾ÉŽW¹«—Œ:£| Ó€ŒðHÁQ|b»­·Î¶b!’ñtDÐDC ®ú=L¯� þ‚R%ŒÇoæËýZc{CæKê¹!x(ˆë'1ŽGåcÚ—�õìÞÊdÏ·3D3×´ FÑîgÆÂã¾¶"çÌ ¥ŸÔÇä ‡l#gÊåÆý„é\@Él•ýËDÏ% „Ñ-á°Y4—ÂES 0d­‘„íN”Š)+BÙh(`ÕÝVø•–¦8  ¡Ñ²_�[U°ÐÉiüõîä*ÛïïÌמïÕ”ˆ'Dç=¥/žx`W´\_›Hnb=”~ÙXÊÅg+0¡iìugOâ-‡Äý»(øx.A‹ö‚v݃°. ÚXƒoxdˈF�èq²¬�ys應"5¼ Ü‹:"á@ÙE†çk{žœa%zÙP÷Ym—ƒñÎô¼RÔó®›ìWŽÃ%Ï.Ü.sèQÏ©à-ýµß£?ð,Ú�æ;ñf\‡±¹KD¾Ý½åîg=ž}è;Ÿã·�Åœ0ùŒg]Y°ÌÌG˜îmÛG9Œá|õ¨oíöÍX#c�·cÆ’†õ” !ÿ6ì­ ÜVhµÈ¡Ÿ›šûŸwšŒ²*ºy¸kÕßÛäüóhµànN�›%ÌFKz„/vëfßY¨’“ºus Üø‚–‚ÐéÝùb@u½#U ·ÐP‰·oŒd‚Ñtkd:MµO5Ó¾gM)L4|ÄÙÔb%ÙH,ùgÕ ñ÷—\[f­­>±ÊÃ>ý03�•E–k2Üeýç—ÝüAñ¹ã‡)âÃÜW⦜,"ìØâOÅý@æÄ7ñµu�L~Ê,ëÆçç¡b¿«G¤‰É !]ÂÈù/‹&y’˜›Í,+ðâ+ÁÊ »Úï¬à�2·ÿtîÚ1�*aцÐÛ7ÄM,׸2¶Ì�ÉÚà`6¶Þìz7”- Ý1ÒÈæecn2fA p³š1ˆ´²ý¸cäks•µ#=±á*�7è#\“W‘3ï¢цë`îfº•Ö‰¥2 áýÒSåþQßo3ù ?»TφôŸöX\{�ñïr&õXÕú)›u_þô™5“éiÌ‚›ß8ëÄ(’Ü¢ˆÃx’&ƒºÆ"Z®Z6w“r2+æ;‡¬ë™»�Î9¿æÜcÝÐÆ"òxè‡~DbËm# ‹ý¼PÃ)9»ÛpDáÁ ÝŽ**»P8ÌÖj° …� @� 9D5nA ¶R‚ïåÂØØÌ›ƒÙç¯kï}1‘íÙ†b9¥¦¸ ÄtB,ûfc×M[ôÛ*RnUÔÎáÃ5ytדÄÉ&3 C ‡4#È%å<íNàFÛí=Æ T{Ó ç1�³]ç.ĸýèá`®^îfRF-c'}‚5;Ù÷µ@§¿Œ ÷%äÜ ôÀ“ÝÀ n�šåe�ãÅJ)œSx™½ï9¸ôµ�÷„Š—R]»0JgfééO'Ñ�Kt]ù}š�É[“#[ÿ �ª›1 £¸×3±Ê6'“Á– æÙá/*ÊXq>ÁæR)‰Ïe¤KÇâ„f²rE&¯\¡p»Ák×ÔyZ)ÆsÚÿí…Byk øP¥¡c"VE}Ad±‡>f!MÌÁ¸R+¨­¢_Xöh!®íÕ�ù ºÙ—õ6çô6ð/‘½¨t¯ú¿úšgMOù†|9ÆãwSûæ¿Ðùµõ^Wëµ`°®|kŒ É=0ÕÒOJyeܰÓÔb±É`¿‹3¥œA‚°E,"åÙ¯|ñ#ÇæEdÔ€ìjø�ÜÔ¿îiÓôœ¬¥‘\[ SßÒ‰º$k ${åŸi�]G´O£ Lx¨“-ËõCÁ†(¦KõÊK¨Ð£l“î.Ì7óñ©D¡d0&Þ‹@f`Q7p†»É© ÈD |mW°e3`{¾wU›lo›ÀÁŠn®{ljì¦ en! Øâ¹µÉ’/0Ä Å�?‘4ÁÞž¨üuekÌ#ñ¡ÝÆkjšÎÀ­8ýò&;o ø7s¤-õ¯�ÎÞ¢èÒÏûG{=³)Ôy(ÂÃúØ8 bˆçòΘœf1Ъ@W}Ï´=9XœêÛa’ÀÀñûÀ±©î¦>®  æh-�ªwz$½ðÖ7íÚ|ð:zDO»Øì„Ó(>ùå"ù5„ô«’XÅA¸¬©díŠRç^QkMnG0rþg"/ëX[¥|Õ]! ‰vÙ@¼§¯ã‰=Þƒ}mUè º&}}ÓÑw/Ëa dŠÖ½ŽžšP§ Ý�‹“¥*u�HüÚ �¸'´6 KÇ&ºë†X8XHá{\‹833ó}ÀƒgR�»³!à!Ò¥a †#£°�Š¡óã »­è¦§0aÁØpϺ‡O½yVƒ=’-4¹«saG¤e?Màð«in,»P› ƒ,ˆ}­Åv¾iÜ Ë{~:'wo=£7¥'kU0P½eЉ(˜Ôžox}ø·/y¢ÃÖ_a:2i3�¤Wêoè‰Óɲ‹é3¥Lî˜gÅçõŸd¾‹‹zYåz¾äèƒ�•ŽÝÒ5‘Ðyöt}G;Û3„! �“±À$-¤øÇ©€Ié†ï Ïx—!/•F0Ù#ï§ÕÁZL¥-‚å‘x–ºc P#–9*Q«²«/ð™‘Åhô‡ÜÞ�ûâg¯‘›²–\íÍŒ®v`ÌwºØ1 8%†£r‹êòòN¶2ç�Ýl¢GÑÙn0#VD“…h1ð»"ió®üÖG¢]MpeØ­D ¸V‚øÌruê¸áš(ö¾¨?Nþƒß€çš Dâæ Üý[?Ì4èÃc—hùÑU•�7h"¯�‰h ÍÈ硬N�ãm‡¯^3Ðc»…`k°ÈÏÔ¶û7%pœ2x�eNÖ�>íV<Áo.˜¨Írcÿ­Ý‰ÞÚÍÛ†Ù¤ÝC(þ..61\Qï1¤0@gj+‚£üÆ7£ÎÞüª 'ß|§án‚töƒ¾R�— ïà 8 «�‚¯¡á}I(ígŠÀQ o†ãŽ|ÎÚ¶“­ º¹úéwïcZ<<[M—î ð]R[θ]ÿ‡Ïy)fæ·}¡9üSÂùè6%ck‘lךݧakvïk�.ÒË%”ÊàìÖp?¬ØÄŠÌ�D“êOW½0ƒüÄ‚Ü�ñ.BZ¦Éÿg�TöEÃwCËöfp‰g¿8�Ù¦ÞßÎb½Äé·vJš­}ÿ?Áÿì X((Éÿïù?¾\üÏßLûþü‚Ÿð=?¦~•âýfŸóÿE>`äÕ¡k÷—3JP€é#Ù!Ú·åqñjÉÃ?û/ÌmÔ Uëß qŽÝÛÑc®îZÂU(VûKô”­É«XõhjŸK‚ý¦è^A^€Èy�Ü€Á�0„ôãÝîªýr�T­ïÙ aæ xiô0^ ÔŽ'ß{þ…„�r­”{‰t�@‘’/ ”`•�½Öiºé¦vLGFí;U#ø§ ŒÎ HšMïƒR ÆüÚ�áy ®e&´UÖ20´(�'fébØ¢„Î_û¦—GñŒdÒ Â刄bG›À9–¾»X,H°€É=¤ý 8öõ�PS«õ'�T5—Ö³úãÏœÊݯWkkTVР* ßz-ñо·ð�œu¶A6å‹›$@‰ !ƒ�§¤”[Kùe¡zPç¬õëÒÁè€êÆÙm[:•b ;—ðÁx4šØ²9óÂ(�ñBq|U»wçÉJûãÞh\·¼…#Àï³ç`ñë]š´Åf“ÖXwï_'Ó«š]"Þ®ãÃÉP‘„ 1ŸÎ=šéÛÚ¼(()@£ÆÄ©¸!uþ[û5�c=£¯òû3Ê1Öb%:NÁÀ;+ShÛËEuU#Ô*!·2%®÷~%ÍÜÒ` Qýù[¥J®7ã=l¬6[d£cŠaM>Hõج'F‡¦EÆÐt`8umÊ–ˆ&ºY@¢FѰ"WK�B¡Ì9(,tn`ÈðJ‘Z„y(‚þ /+ÝÞLºnðÛ(Á=ÿÌÕÙ÷µ&XÖúÜÜ3ø µƒé²º8l²ûÏÇ,'æ­]yØr�¥ü˜0þŒrÄ7�dÛÒÓeÍû{ .Ûx°2$ùݦÌ`H~»æÖaÿ<!ŸT øÃsü±‘õKhÙF„$‚ƒzŸ!@+ô.Q^ÿÇ…|{:w×�»Â™ö /¤SÐÇÅÿwþÿ:±(p€©åe3‹×þÜiþÜÎE•xAbpøR!P‹Ö€¿ªc[⮞o W0XR9¸Ïn!»tÊ‚¡Z N£E‹–ˆ»Ÿ9_í{w†E¤Œä{p`íj.6ÈÆÕð�Á9”A`bõã7Ê›Ð;�UÓ¤åŒ� òw>þºÓýláMç«¶ýû�Øò¼¿P5òƒÇC¹d¸‚QºJà M¨ÈÌ”ôÍ@ßš‚§G‰ærJF ¾$�øF˜5G*3±LÈäæl 0¼Ç,[™[1À`”"pÑëŒ x`�WÌ£³ÞÿoÏ3lH%ïË^ @¿å‘ôt«µ§×6Vµ…†Öæó.å‰óŸŸ–¹ƒûÜx'ì|Û? G�žý•þTgp±<ÅœJ‹ÕKØ»ûr6¯¯‚¡Õg-¿,Ÿ†7àçî¶ïÃÉhk'Z}yü0¨ìרç›ô_{÷4uØÓîð�k¸ïÜ!œVôšwÉR-SUÎßÌ_ž°^Þyx…¥Z²õ9g+ näý÷Zao ._9òÝ�‚¡ö¢½Üùï¨=¾¹äóÖj22¯ã û‚ÑÙÌb®SÊ;ê$¶x¶õ×·uç˜+‹Ã“K U ÄÖ¡a†«Ö¿ßÝô^¾ýuHìeCsùF"ŽÃû“µïÎeÕÉÏ–í÷�Ùöp¥ÖÝIP-Ú¶¿¸‚¿±¿Ø,_*^‘áÛµ—ãùáL~Û ˜°KÚ5¥<%ìPˆÔÛ�ߎ*! ’,_â.D$t½·˜Åߺ°)±è{hêf=º&Ú(ᡘáÿ�„lYÙ&~Ksrg{ïL Ësæ™ò=ß­ðãÿp~Ž4‘¹è_QùÅnO®Þ&|ÖPkê„w9/ï‡H_ÛMèvÿ\cš€cÖ #_R™>œ3�4ɘŒèLd>×u1û=Þ_Î ‚]áËÛ›g—QâcWמ&Fi9b8˜]jÆ-éœõºËŒr¥„VÎ<ì,ž¸9‰}“±#”ts¸’Êì�gØk­°eM÷æÄ±ÉÅx 1&Õ¼óÌÚ}º!, ð¢¿ÂbE`HaVcÆ2ßà„ZX}‚îQžäŽ˜Í—~i Žø71åü¡ò?½pÓY6ÿ9Ìèd‰yñË|¾çìIï@ù÷<2/ hùßÖ2�Ù.ï?B¶ß>f°ð#MíÆqšç�•ÀõyÔh®VóO›!k *‰à×71ÿzÝü2-¹õÜ~Sæjß|ž˜zA{†oEì%‚[©’rîÁšÇú}èb»WÏ'”ù" ¸¹`0»*~Ð-êñí�AýãU÷´í~¬ýÀ‘Žsª#¬‹�Œµq;Åíö©_ n ðCm…ad”Cpv#¸âî$‚ñ²Ê‚Bã[ L<ò|H:G«®³;Æx‹d§¶J.Vê R‚ƒgæ [h÷Y}ùðg¸4û)9DÅü¹Š–3ûa0W¹ý#æ­áÑÚÉ5äLrN „†A³8ºcç‹û/¡\˜¹<ªDø—ìÂgüågbcÌwã.>€�lÎʸ2Þ9Y”–Ęüæ¶…GañCãjJOêöÆíXÚ�»Z3ÚŸ‹[æîR(q?ÈãßÈPߣ<:ÖâhCû•ßËàY;�F}>ÿ ¶ÊR”ÎHy}º„an!¾z?6“ü®AJ¸R”ˆ(cùVÄ9zúîÞzº%•e&@„�=mƒªô¢žAD¥àý×ý©pC´ñнòx(é–  -²¹Dúo|ø6™ÂÛäok(]‘�uqÆÙ!^nfצÕU²–ˆ†iU æÏ©Ù7ì·ˆ+‚+¤ á�Š›DE/Wr´#BFï×­²yÁûµØ?Æ3ñÆ=©]{ô�¾ôT•Êâl�ó5À'ÏÖ{b"Õ¶Œ<š&Â2cU¥hЇiˆv1èeÑbm�]ͼ#iD‚ñ9}燊xxôïGMÒÞép�Yê*ܼHTúþÖ÷ªÎY‹gî³KqC×� pàÈ'¢“Õô<8­ÉF~‚úè�NÓ×é!Ükù¸¼ýhûï½tÂ' ø� é…(+ð[Äu‘ߌ+¿Uú+´–+ÝXšû~E¾-m¼½÷�)`ÒÑŸýbêPz(Á�}\ ‹Œ.êŒ�ጰe$³eO€¸VœSÒ yÿ“Hõˆ£ç)��y^veÉÄ-ÚåÝ ±åzªiaÅ×ÑL³À÷RdÄ4G×¼}>�ë_k{ÏQ½1‚úDó~Jy­á®�Eq6(žÖVeW*º<̤¢á’@ÑèâJ k †{nôðÖÃã�=!¦å†7ŽÇ„'Án®]N™û'sÔXˆh¸VÉSÑuÁ�S¢Lf’ûÄSQžà:laè† õ×ÈÅF3¤Ðh`ÑÉ(8´‚Ÿ— º„ÖPœ¸ÚW+±Çkej#C‚*{ê=ʸE” fdœîBÀQ¯c@„�üœ�i1ìn»¡ ǰžñfYÇHºŽs¾»©g�¤ºô¤Ð²'Óש#ÆøTµžûÿ�m47¿>äx 9ª)KGL}ÑI˜ôóîýà³õaº–Çt�æÄ²¯6‰TWm×ÙÉ ]b‹Çç[¼·‰ã þîI6+Ïr©Ü‘ˆä=zW¸Öû‚Ô7ÖÉäk(A!DpÀZ\ƒ‚œ¼H›8Äçô€Òn¯Ì h” NZêJ�踆ˆ¸³A²?ÉÒsÔ¯R+HTE‹Í`Œñ•“ù\ÀËïU7á"ë×øÖÜǶ=�Z ýBß¾ñߊ½H÷�õS®—à ßj/ ¹õ £ cgÂÒß;O•¬Ç‚ú)sâðTœ»ð~…r×Ê ÷åÐôE辊léýZ¥úŸ gæåʸû½ÙxÙ û+oIHk88î®^ùÄómkŽöÅ�®¸' ¦œŸiÅT´åØ­’E9UïçVÜ¥åÉ\Ì‘¼•]š¾71yÛê#ŒÖÜÍžaKé®æÇŽ!"øË‘À™PD8ºµ��kXX7�Á‘_ø&ÉpÀ ¤ùp;KÅØò4ö5mÿ ?ŽH¶dÔz†#\Ù*s>§t1ïE W¨ÚÒ.ð?CñªHñÃÂa™'Äe bW¹›º{] PŒFNJÞ]|ñ0m·C~ŽdÐ\<uÙ¸Ém?&g ROæTÌïºo‚æ:nh �hœÕÒÓj¦7—¤¨vþžC—Åýø€ð°=Æ8ÚR�‘v§ü߯3w»V!KÙô÷j)Ǻ5ÎPÄFo‘¿¬µ¬ Û‰Ž=þ·òApDnÞ?^iò#~{Åcuw€…F{ªÜá܉5;b 0Ö�¢Î\æ ²#p‡Z¼Š}‚«�âÞ"üPÀíuô¿cD fÚÑh¼±a·rI .=2;’cìý•Žý"™1�Ä«ùßYrY ‹<šÞ¡ÿ+wØÂƒÆfSJÀ³ø[O xÊ¡Ž „ÁdUº¤DæŠ,©mŒHS Îs9JrB0ƒÃf¸Ë4Èù$†¸Ob£ÇPZÞåk6[gŸ ÅÜÇe3[î̤o’)Âþ^ŒÏ³N¨y86,Öþ°µáDJüH„}•Ò¶åsâÅ;¼Æ°(p4¥Ëu43‰BÀ+õï´3sÒÜ ¤ÇK1“•ÕÜ—«v\‘GSe¢xz0ò )|ʽ]TyÒæwswæÖI¢P0P…œîtw=?u�cwu¤ÞŠWÃñLwGmÍäËÊÓ㇤汞­øµt»ÜwóðYœxD(›öˆ¨¶†ýO&\²Zå¸Â—ÏÝÈx8¾oÔb·‡�ÃB-)PîAqWÖêoú¼ôú_}²R vàSiE¢õ”‹w+\º&Þù~©y1õgWù}üÚ$Ï9�èýòåÑ焎¢Dam™„3kÕ5ŠÑ¼X/ 4&}9¿°eÖ9Þ „†•>Ô·:1æ1ìä¤Áغv¿lÌ—Ùåâ‘v~ ÁœZºœLƒt޾CÅt¶û!µtógõÆ6ïu.ñ2Æ‹ƒ-Õºb&¼,­µ…#­vÕâ~d³(R…µW»þ.'81qÑ8½´ƒ:1Ù¢9žØ hň7ÀøžîuyKoØÐ¯<�)¼_ÅØZ¤ãOcýþl'ŵ:Óü—†\÷åáè’\Úç-ö½ ›Ô3ËŒ8¢*&€Í`aÊ[7çÏÃ¥ü(Ç<Ê„v]{iÂÈä!.Çú0.·kÚÀuB`ß’_µ lbº› 8Ô]lrïÓXúËo!lÛ†¦Ÿ¾¦ayÅffð=ìü*ìï¦Ø}ri·oÌõ¯jÛn§ŸR¼×‚lî`Pû¾†nOÜ´}ß<ü©3 ½cYfõcX(”c/~Q˦Õr†p<Ch�ݺÔ`Cú�CÚ#~ca,¨ñ*B¯†P62¸¢Q‡ðÏûĸÞd§¹×y½®»þÎó7W�V¼@IN»g£LófQ•|Ì\™HLb…ï†r6Àdq€œ±ó[~öùð8-;²Û�íò·{lx(bä2¶o8Ã\ÃZ?d2­µ|åxgìï÷E¹�Û°‚áê+µµ=P›È†‰uBô›ê{ogíß÷ã­Jkvã}½dx¶õ7«p[aVH•‹¾`¦Ù*‹çÆF凈«±¥òùeô‘(¥Z켕ÛòûŽ�¡èp�2¸¸Öš Ë'Ô¿0 ¯£[è�ùþ›“ò/2 cêFC;äWËB÷�Þø˜GÓ�=�Ä4ø@‡yÛ³’s ¿¶R¾:ºã²}¾»Pžr;ŒåqÿvA1- ÒÍL Î„EäÇÆ nkÜŒ~­_ æ,wï�2NØåçïÍG¦,—¡Ã±ÊJëÏa/‰ÛR}ë[×öó«–e ×–V–ÊÓïð½…®_²Ó9'Žøüƒ7Á¤d¶Ú«6§vúæã¹»ûÀÿ”6òe_±¼Y êx;¤ö7¬º—ÜÆ‘“ϳç#°cÓóŸM„iµ�-yœò6`~Çìî³S)USÛá‹uк‡¾Pë/hïG»4lèñè´keÓ<óÞhž5ëÖ—„›�3Ð[@¯¢ø‹®?6¼ø×çÏ~‡&ÞÀx} ©S;v z’’O(!ˆ&ÃÓ¶FôÈ¿vÕÂ,MeÑÁÂÛ+¢jˆV¸$æ'KãÝÙ¨ˆ…‡`'4*çy·ù¯;8˲S÷®<²ìµhuñ;SÏС¤ÀùsƒL³×^žÔ4ýº€úÉPÞÛtU¼à² ñô«L·ŠV2•w–Å=ŠE‹ r‘Ta_7QJR…¹,nS¡XܘÝx,ßR¡E4|=* µ�­mÒ­jI�bÙG°™vÑ0­bë�¥<š#FLfAz'Ë·Ë4g’äæKQ-ø­ðÿàø˜�c M’/ˆx[¾‡Eš®j=åƒ~COØjŸäµo9ƒ™b„¨Ä |ß>ó2übe²–î‡apW«wÕ})õ™V\ÏƒÑØ°ã�½+"�ãJ8"Gö³ëòŠ?ÚàóÞ\çÒà+žJÐ<Ÿ$PûšññŒjì¢ws¤ˆµ| 8ûjLd×H½_%áäÓG†´G¤<5єҾó¼Åò£‹›Ÿk¬¹±ÎŠO”Ù¡qún Ø1p¬,ˆ &êÛ¸�º Ì x2 °rWÚ©ùÒ7²ãð:ÄZýäêÿ»¥7ÎY›Óô¨ƒ.½ ¿–2<¨ÅWíÕDl°þ!’qÓÊÆæˆ�7«ƒVê�…Peû |BRA�k»‚Wüª‚9(®PM™¹±Û‹7}¿‰žqÍ8Üîë!1×2uÚ6�!.]qlRÌMßfì«¶ß“f†'í#3Xíýïž êøWôgȘÖbº‰Æ@;©¶v—ðh„¨uì7|ô+{ÑES¢%W_¯ûÍ–ºWÝ—¦�¤\JE5*0hÜ(¾‰nΞ$G58¢sHÜJ&O4òiTœ”Ôæ±§T‹ÖÙ°wÂËUæ¡7„|Qó‹W(ÒÎNœ©K}¾F³v+ç€ÙÔË›¬àJØæ‹y 'ýÖ‡n‘�3H š—Õs†÷ßy £ËÇj¶«P´ˆúY5îsYLš¨îΊäà¨GeÓ û^ª®‹)ݹ.ªûHÎê®Ks¬V]“ï—Äš¤<`é™á�Lø¬*tUªË²_¹ctFræ•1èVé^¡ïœˆ3`.zf",xÚÓ%ã­3hL’.¶’<7ÉæõOç3M�ðÜñÔ®žîÏ 9¥-Á̸Žgw¿Y£«e€^®7‹5Z�êËÒ‰ð«�õÆÎÄÑàÒóÍÑàU ìÃäå4øMÔÏiOþíKbHNLˆYc*Jä ûž&uq&Ó’)«Â4ËÔ^¶¹¥Ç) ¨“ �ùË.9é÷¢5ß<ˆ…—»õw]UŠš”Ù7×^±AÝÔ6zdk8"‹çÎFFt@”3ÿ¢;á’JAø•vÿ¿Ó^Eıչ’Eƒ‹ßüvÊ·Ò”  Ûcî<éhî@J?ð J@¬_/Ñê^êÔæ$a¥ýa¾U?܇J"ôs‰¯b=óôç8­ÅðÀQîX×”N¸¿„<¼ô0tòëbï\R�v† Ȉ �€<ÍÙ;¢ûé(Ö~QÇ/�׳žŽ¦JÆ;Ëéå,ñèÎH:œt\ËìõeQ¢µ¢ì’'„þº¡¾›Œ3beÿÙñ²A‚RŠÖ‹Ö°myC(;w }–O¤eMqAŠº¿« Ž�b2<Î;åö°D†¬à;þs¸e]Ž�î³ñ×dÿÐ�Í«6k{‚a�é­V{%ÒÎQÚF,ª´÷úJs­ÞêðÝ®6AO¡¦‹O«[ÐtZ2hJÁ “ÁNVxltì H†h@M­":Ò*ÿ|“A5VŒç8ÔjóààSü`ÑpX›ðjË_�²ÅŽŒ¸ ýÒŠ3ϼʵ�8œõª·¥i­ãþ€Ìy{çÏû­z¶ˆM Øòû0—±r]è]µç૟—~RsÏ|OKƒÅM O-¶Iôk=[ÀWõ XÃɇ1K{ÎdÏDlû‚ý<}Øýòp=/[ñ—âîÿ%ÊO‹ë{fZ»ÞË>=¢É§#݃šó¹ C âb_iYæn¥¶.sôAvÚ ¡Çn¢uÌëËt>ƒ‘‰=Û·Éàx€BSsÃÃ@X~/òˆ(.• >×Ûvî‹Røõy娥šEÄXÂ6üâûQ:p2 Úc=Þz_¯‹ì‹q7@éj:úýçëèô'´wð™ƒ2ÂduÕÐωÀMsÛáVÄzýC BâTÒÜ¥A”ü=*µí6Lüèþ dPïr§Ôê(Ú–M†š�M³›øPú{Çäi },‚¶ruçâÑF=Ùo6iå`Ÿ¢QHGßi´ã*A"ó“§÷Ïžb¿ü,‹ûk ¡Š±Ê ¥B R! ´Ç…nRyÉmê]®Äj˜¼Û!æÌ†ï”Té£FÝš�É×é §r<žKeÃ’Œ[9>ó™âëYnr‰tÛÙ5¶`ä÷Œgní…€ÕÞR³¦�†‹‹‚~Š™#6Äv¯‹ØäÃk#nj2‘^Œ?�#gD!–/uTVÏûß&oÃÆuûÑçjöõÚ‡[µ‘ŒßÃùÊ£a.ÿE[ s›­2›³–¯è× ˜£ÓhÆ •™‘Hho9>­øÛ)#=H6Î6×q­¨éá¬@€ÁBrëiá]Ae¶°=˧Ï-e—[º²õvŒ‘Èl?žQ1§ãÈ«h\ñ¢´õŠ6h 'd³Â�€WP¯æVA0®`¶ù0¶–]fg«ög2G5@+Zêßzùð[˳»{Þón—Sáá³_ú±;½WŸ(ð ~Â`ŽHᇇñ?—)°Ÿ€M•Á –\DþFüòþ÷¿? ôC�TÍêhǾ/Ž•žä9d-f¤N¤ÅíZrÓ´]¿‡³ú\IŽ‘òÀj]9 ´Ž2iä˜}Ô«Qñe økƾś|ðBÛ5t][b„\ :=Þ÷‘%b�YêuÌL³JœøÑà î6kNj©<ΪHiTó}=ECT,Mº _]ÓxÇ-,Â�“Nzìõ„ϖ€v*dPß[²ÖË'đժÈJî]á¹7°¥x˜BŒÈ#ê&ÚFÊà§t\^ØÆ‹Bm¨æf¼ç3x;»{¯ïó|ò–[]õ÷¿Õ èë¦ î)V 6¼ÍÁ„'VͰAíGÑ*Tßï5þèÿÊÜ9[uþó¹óÿQN7�ÜKC·“_…Çø`ºvCìÈeÁä¿ßéyà¥ü'̨  xþªNóˆ˜ëñWa!/Ÿå(úˆ54�È‚ŸÿP¡ü>ÈayØ"ûsÖsPa`ôr/à$X&cçÁºC€¿å]%¦Ç|þC*– oa‡/¾¯…ñ›ÿßİo-2Λ_ñ‰¸,Èšâk'y èÏNp‡?,åùXX=í2›Î ¤n§ø./!˜°ßƒ6=9ÏŽ±‘Ž…°íu˜ä!f͘Í*÷[ÄDŠ– àÐAÁ¡Ïüž­zËw¸ŽFUšâàgzv±uê UfHlìðóóá¸î=P–   Fý7¼ù!fÞGŒnšÖçý%ÊÜdzCûЂ÷ÑYº�Ö¡eþH'V©0çmø¿ þ‡Ÿ•¥7™Ä À^½®ì/ Ñ€aw•2R@O” J?³E#.é³^8œìåã‚…l°ýæIÿœ~ª½ÆËõ�¤Õ75ž›Š ÿXxð0[ ¯V<ô{AkÍã Nn/¸AK›º|N.²éÖã\oÕâe­ø]¡êQÂCˆ'¡œ›‘ª°·Ñ¨C&ìæ\HŽî=æÕt˜˜Åw!ÞížFK'%­Ýƒ5§Sá×N~?3¡§Ë&nSyFÓ…Ù`ºDUæqÉïχ,>â篠™uðÕwDY€ù��L·DÂï šÞ�¸ØCXè0“� *êç¯R)ëÖ¾c™Ë•üo/4Ú®°ĉ³x‘¶öÐÚDMÌ .ß!ò™õw»_xŠe]âÁŠ œ»\q,AkS•9È>uÚvfj‡-N¶òg ©Eìen¸2~C+_¸Í˜ÀØNõö�ö8»2„¯�® �ÛŸ‡Þë ‚^Ã(Þl0�WbŒ#ö÷}Üöƒ6�|<½yìðý¶ù3çl:×ê O¸˜OEëŠóV2µÊɶ>îþvØííu«H[ïß)æžöÚ ¥Ü�Ê h*äð µy“"È*Â*j¹›ëB¾"KcL_—Ld°LÜåK¶~{¥À žw 0¨g¯æ-èï"–[ö…“£¯C;/…Ѿ4ÓÓ©\�§Ã ˜ZÝ#²2N¥×£œ1‡ê#=߸Çîõ|¿?ƒþº¤ðz¸¿ßŸâ žv`‚Bü>OE×õÙ¶gLô ‚[œbvàžÿ÷¦3þÅénfѦca³þÓÌ<¼ÇÄžÏ6F¹¬˜»)R4?Í,(xø*·P¿GIuËyÒÐ+h¿Æõ‡�û€€–…µ¬¹;gm{á— Æá HÙæ¯ç™ŠÕ×uu-vÎ|óÄ“1±s£ EŸÎ”“¾ý+‹sÔ/ +³€ƒŒ�¥�Œ-þÚEÿ¤Áw´Z(oÑñ³çc�ÿÌØëüd„„ZÜ{l*<<" ¸¿ëGë+!ù{Âÿ�éIÁî±·|¯Jë’¥)?1­÷U†KFú ßX£Lžš­7g¦|5öÈ{n©õA”ž–o®¤d.bÆ`Dn™/—×€‹RmÉ6ò¶KxKs'ªFpCX \­”]vèøa�*3oM‹Þë‚„�Õ &l\Q†Æ„P/%¯6•9–@üm n$W74ÀŸgJNknev/iÝŠÛ‡æ™à$Ý/ŽÑÀê Y>bƒ—Ý]ËÓ�ï›÷Ío"9ËhQ訚Z­®¡æ«>«ŠRh•{ûw쎒yç…ÛøÑ²CÝÜÜ`â¨�S}è% @�Ú«ÿÅVöE(Î léª]1yÄCŒZÞõ\­jáâþHµD~×�Ž_ÍÞ2_˜¹ûéÁú“{±ÿ©z8Þ`H;ülûÕ‘únxψÈ‘�ˆà#}Ø¿b”@„Õ¸v*d�Izæg™^IÔ»¡N-FÊ.e”csç9ˆú{9[÷Sí2®Á‚!nX€Ï‘Ùð>Ê ðb)é xè ¬2Î$j„âìŽY¶i–t´xª?¢ß(>ÆW§…kw½s¿xÈkî–ãÏ`w{– sƶ0Ÿðߢछ{Ý£xl÷d} ÙAȽ;üXÆö7Õü|ý*•èF"®XLÐGDó«Vóf ù ÕÈH® BüÇH}³Œ6�Ͱ h-pñˆM_û‡ÙÖ†µšw>XlHûd›c·;ó[ �²hŒnÝ‚?RŽM€Ñ_âbëjúº¾_ê¨v¼<\m¾ sŒAxýÕÛZ¡ÇÆ4aFF�2R/ Î…» «iNØ=ßh›ºéƒoޏ’À½%h°Ñ7ÑL}ìínš8xwŽë%¹l¸ïcˆ7ïÿGº/<;ü| † m!q>"Z¿Þ­`_ó_ÿÀ‡‹b,nk# üsÁê·#ZÖø;:'„ G®Ô‹ß¢b ¡:&ëüÙ€¤3G‘¤(Jþ_‰L 6Ø&Nk/xÐe÷> AåÃ-ê&}˸'Ð%–Ê›³Yd™ çǘÄ].OŒ·ñfß^†£¼+Ȍފ¼«�ˆ ÝWÆÀ–À'×lždÅÌÑ�ùÔ ’äQB;ø}Ìz£$šÊ5¾‚|çQu ~g«ç†ÙŸw×­Á�ù�6¦³¨€EÏ,ÖŸ8\êuØ*°ÙìïÌé8r„8l<�$6Æïnk¼ñÜîÌ\ÆF‘Ç�š�øi±zGm.îW•åP™+0YÁçà ÛkÅÂó¾ŪÀÁ{"uç·6X ¹6K‰+-kßW…`=�9Ó�B§.fpüò ŽçÞ-0“kc‚nß׊ –í�&ã1Aþt°ý R`]Ð_~ô–© ˆOÉ]¶~Í\îü-ÿìA )XÅ~e’šü¼‡«âöØE`Ãÿ(Ÿ0¾~ .Û»ö�B¸iÈø±X¸eaIkQÿ}ý¶ÏŸ~'Fë-jKMjr)ãyè¨:„5Pû+D)Õ$~Ö±¿<µ’š¿/æ\•ˆŒ·?mà�  ;ZÖ�µà’2O(¯üJqÏϹW÷jùW?¥ËùyÿE%µ+Ëú|Kïý·=J:ÏòÞa»ÿ= E‘?Ð þµÿ“x³Oz�L¾�Ð& D¡ Y�ÆÖ{ktå@Ex8ßêÓÏãÚǶ435<FÂS‡ù�¾»h¤¢ .{ûM�GoKœš £ÿÙHŸôJ%°Én�O.¿^źÛU‚ݽ5-T4I#ÂzË�Kœ­•­ëŠ«Ì\ý=±¹ßÓM6™J>8‚”@âÑ$WhÔ�¬ &äß@ýøŸó™ür7Ò2ÙX X XxËqåÒvø £HŠ‚™ñÃɨ«Ä£Zw>¿Ø¦E¬ø‘­ ·ÂñÐQø{$[` uäl—TÀ†ÈoGãNhÖUNi³•›æU™Ç �?ÚT˜ÇD„ $h–^ž ?8”²K|D”±�¨Š`€� ŠnÓ‹0ë@L² '5±/g‚¶H|/Ò:{øxǽäŒ60#—v¤®È²Y»¥hPÄÉ�«ŠÜ›]µV§œo)ö£žìIóuÄN•²ˆ ‚|�pw"“Ç| •õãÀÄ™u\Ίä ó4z,}âÝ²çŽæ—¾9ç|[õ‰ ÛvPÿ¾~.(¡pE*ƒ*«A@Ó®u5‘–nÞxÊçï¦HUó"{…ŸxbªAúÔöÖ¦ ÷x$<¢ ¯qÍŒº"¶¨´*ôÝî·ùóZŒwwÇ,!n»°[T'ì°Ú‘{¬^øÜл1XÅïÜȸÚWEÃl»yóxÀ.æ†rkÆ�Õ�‘;Ö¢@3¼å2á†,ÿ÷­ EÔ=å/ˆ*æ\jÛ^r»ÙéÃ?úUÆÜ�²Ê}и#�Ëg"¶¤Úÿ�ܹ úïƒßQTyæKÖöG CÛoT·Ø÷lÍRƒZ èïc"i¸øt¨!Dd$ñƒÀ¹&(êH@i°¯�”O×ä§q¸k||Â]´PB÷;(áŒo.¢¯iÚ´ò/’À.š�1±Mr™penFûU¾27Ùˆ=ããð·ãìéK‘B2×%yÌ<s;tç<ëë¦ìC”iv›»V_(ßr:¹Fås¹œ}Cöu%º¶(º¡}H¸Å®c¶÷;ñËä6'®Ð­CWáãv±}ÿÅ›Ï|*A¢Áõyýo8ËúÁÏ”Ý+�?uî×aÿ ÿA¢W§mc¿tÌ/´¡¦T‹ÎnÊÝœ^"io¦|äÈMÏñKõƒ0k*õ¹6ÿ»eÎRõ_ <B‚·‰½2aÞéOâ”áGŒO™ž 9�œ¥2Ó\­>ÞÓ^ªO¥ð¹�±9ÊÔ{o*X„­4•ë—ÌmVwM‡©ã^7³=ñ[¯Ň•ˆÍ_{ËuîÍTi|cG£¹R”q«E˜zz¼]H,Ön‹0#³l°ýçR Ád¦³¬Îª´u†¸Ik¤¢£aÒ½+Çc9{ÒÓÝÃ9éJ½×\,Ï©u]c&ìê2ªÊ0¥‰EÓTúXu/}# t3SÆïR\g+ë²Õzi¿hôú r$Á™0!Ù%VÓ‚kMEϫμi¥5¥R®«Q“)hD¤Ô¼æ³‰ÉØ+É÷�˜Sö=¾ ,‚ÁpŽú°N6ŸüŸå®ï$ÿF`ŒÿÑ…ýš‡ù¾wñn篓[�_=aáV)Zvµá·êŸ÷3i ÷ô ¯žéÛ¶Ì”þ¦j·ï%ì•�Mê¶“"vj˜Š—p\í×�6÷ž‚q�ú[‡—ŽÝÿÙïj‡åÃÏör5l×ü· ýlàD½³NU�Æd [ܶe’wµÈraE{(ôº?þ mr†ðöë²öè;»É?�1ôZ;ÐQéH%‡ �8™Lӿɂk˜°ݰߧTªªf�î@ Ûéî÷¸Œ�F˜H5“gðŸ@�ËN1ròsëÕ ™ P^B;>¹‘ ?#\Æ.];Ýp/aµ±Û~U�&4îÛ-Ëš=öDTL­< 6ï+Lxœç˜º¸cA?2�ûÎí7^i.ø­cc¼S.ßl·teó“ŠáÈÍôÝ+„áÊ•fösÆéëÃM%¡¥a¼ö{éJkh–ܼ;¦Xñh|šÎëØ\�°¾ùÓ†µs¶wKKþ5â©C]Ü_`)kºÓ[vÒ-›É5·ík!ž/èßñ†s•¨-ï7ðhJ�á¼N£:®™,¯�¶À‰&Ev1GœНq½n®8†žð ,cCï>@s~ ü¹€KÔâàþ$³ÛžϺLµ_ˆ%£WãªÌ´Å®ü?î|–ÍÌy¬ÀÀ4‘jƽ€ß·oWìG—wAwË«‰#?}þâôsÁ«¶ëaË›¹pÿƒ0v¾1Ë‘^»ÚðôùœX}‰¥ßV-�")ßLvFäA`î2:µ³äZû8ÐÒÖ4;»øSœe9qwM;‰gÁ_¿qs½Ä¶…ßêÏ]<2¶ºa \4+<î¢MÝ_Xq³Îwd¦Ô (ÒW‹bûiÒæ¾?ucÛàX´^0#$uwÖº^Ø�Ú'Ý.3¸ô#\´ðŒ®Qqá�{›œ¥Y‚Õ‹) �6X]È1L¤E S%âx,•g®X,ef�Þú/tpغ‰L®uŽÞuù_ÕÌÀ¨Î 4™L tuHVù>5Zoîòî»§U_F 7°ÒR÷hN'üýß.ÜæŸliœöÞ ËIûõ“‡Iý·{�Ô*¥†÷QüÀ¡’{y ü{àÃû l îœ75�$"g:×^¿iãÌ_9h ‰+Ó¡ò¼°Xà0"~æØ³>ëë�–"8�+<Æ“YÍŸWEõBSÙ#È ÐâjFkÖÎdñ|¸øôRÜÉnÑ ñ[¡¬[ó£ÞíŸ+ÂHrPÍf[Úa»ãÍ5Á~ÙÂÁ¹ªSNõö><µó’‹ÑD“Ïžüþç½7_ßsÕ�öZ–fT_>èv7”¿s´9¢Áj1ƒ �4·89´úF{"™öž°Þ:žnµî³ç‹áÖï§")Âw=Ý,ÐÛøxçvŸ(¦Õ�,?9Þlú‹y2›ŸŒ9K“¯Mur½,"/+°åäok熘’ÁÌ|«ß^Ñ ‘ ƒ Ë+9¿û�|{%:kA=öƒDžw ÷Ú.²‡£!F~ÙüsôœEÓ…?w~pAÅœ¬B ^ýÁáz˜÷žn/™6Daâ›�8Ûyê>ï.å¸ÊC˜¼æ2gΡ�ÖÚ$“G‘߯Ї}CóªÝÈUñToìl ùª-c¯±U’KÒÖ<÷N £78ÿ<ÐÝ�.bNüpG§¯'\à|Ôä)[ãS&·�qûs˜½nD.%ú¹ÞðŸá]ÇÇ+îLo/ ‘õAu+ƒoÒ�Þs´ßój”u¸] b›'®n³”ÒGÄ8–Õðê>Ä— óB€E¯¾I?f5ÂßZ-åñ}ŸÙÔjÚ:Ov#s�Z䯩�@ñ“9‚pOn[Z¾Žz+ˆýÞóëýpvßL}Ó¦ëõ¬ŠcÁ‘o^~ú>ƒ¶ nSìp­ágtÙ¸×Ä„7áyLxd? Àmå6À“¡NàÄœ3Æý\„«Û:,+FQµ�êhV[¹:§É]³b9Åÿ-a�½x9á‹è|7,íÕÇ-ö=@�šÇ�í´�qü÷Le|‹T‡Ÿ:°°µ¬,1zò‹+äôǪý¿×3GüT­Íè-Y•Úã,¥ÉÛ.ä¬^Tk &Zp!«Bù¾m›·MÅúšB/H|Np…ã£j„ÒlÞ Ã[_�#øÉÕ‰íå‹CŒ^ÜoznbbÞl>z3z¥Î·–ª¾Óe—5ŠMcÝdŠÅ·äD_ƒwü7œšGºR´G–0W”^ÝK6ÈÊ(±KÁ\œW.e;‹xéW’.ø»<ÂiNr£®Nf vRæ8·3×4¹!-–ò;.ÓÂAÂñÀÿ�oû‘¨(†ïÏ�)ku�mKpë‰�nWÆŸv›BÃþ¯#þÌ3w�óFõè2}–[N�3lõ�\§L­²Ã9ƒ¸Õ/›Ñ×qr…W«ñ¶ú¹’MÅó9¼^‚Ð?H­| j¿cl2ÓÄr"ïOo6}ÂR�R;Û}îg�…—±îÛÁ[ºµ9˜,jö-ŒØÚðXD¾ñ‘ÄݳAS œÊMõ…ÿb U8ÕÃ¥!²u>Þ9ä�×PvN¥ZÌÃÒxß®3Â`€Ñ ÈrJ lŸ±»Ý‹Cr ¾$TR¨5\Lš�€e÷rà6%”³µ©ù+êÐ2 m|žRrÅø)‰#œÂ©ñdÇ•²¡Qác\®îY¢N›kóUÐâv1�DÁƒ"+ WÑ‹©}`�1TFᢠU Jvßá¹Û¸,9V%`¾MÝ L”] „2ø@\¼ÜÃ=�§–�š’‡ø"„NÞ¾ ]½/{×òvñÆ…»ç“�“7…g?Ïvü3¢B�xZÂÿPÇ0PÒ ÞB �²»‡�Õùìb(QÁ0ÊlẕbÝÄ€sûÒü°Z/ôdˆžuA!P¨Oæ ,ù”°…=u Á•·¥9ßdX{g¬ÝnÔÍÒ“D-KëK‚6¯Àl9Ðc"�àtšÕNµBQõW¿±,ñ×�KŽ [�fÚ1©!Æ©†LÎÏôPA£ìôäÓivùí–Ëç¦Ê_Ÿ±íé…¢ëì_þ«54]¥-×nr×h%liV Îúó­ÑX¤¤­6G6ìE[ó7š“ÈaáÜR¸¾±ºÉ"@+À\é ’«Y™“ñµÙœœQ11,ÿé)Õ>ñD±î§qï Š,ª¾±•§ñ5­s‚äÛæ–ôZ—Ù(WºV�ZÜ»Ë6³ÆWSº^ ]ÑáŠñ†6Ô¾�ñ‡ÜãE™vÉ�ãG«­V5 Tší*íí™|~ãs8NŽqôQp°ô¦ó.\ŠqEÎÕúÆ+Z[åÏ„ h°0Г–ýCeL™eÁ~/y�ªbÀÿ{†»Üç„…ÉMÎky"+µóö4 º+›§¿q~ b-±Wœ·'E+¢àŒÆäÉJËz‹½± â¶RÝÙ�Ò+§kƒ%áâ“Zúx‰Ø•@ Έ »+.¹á�ÐXl\Ô*¤xÊŠÉŒƒ± ‹†Q梆±RØíla.µ‚NrÈ€d�ðV#Mf‹�/G†/›hj$Ѐ4œáPV0v¡Ò£å©NBÉüRE�­Ël”Éô¡¦18w�Ö6µeLáߣ-¸I1Jo� QžfÃ6Ù5¹¶G/´¢Øa@€é]·ì�GÈd•¾6|­Yn6ˆ;±V®5­bÖùß(Š·IkÂG…¹ÅqcNŒ¥ÜkoÂ(.¼ŽŽ�Í Â^°ÑÊw#D~Q"x@ô:¨}¼f >¾WU—YÚ-9NU7öF(»Ýa†Üìúl>ØŸ U6ZbÁSj;Ǘ׈‘)]xÑròË{e½ŽÔVŸ¢-žuÉ&<0O4×,ëbL„Œó`�DÍKÚró3ù reóë­XYOÞŸµ� \7UÉWáCž²„l¬Ø*t›Þ´~Œt°â�o/‹G 0äM‡öÂ×Xg¿Þ_tÌm¡ž’î;ë:žøÃz9+ZM!KNà¿Â‰sÓ¾ýK¤;¡¬r;rZC‡é-�3âÜ”‡ÛèÓtóÌóß7äÞ-÷¢ÍÛ“á}Ó2:䲨ªÐ39\•§Ã:Áçÿ#Ü/¤š¤ŒR]|¥H2(¾P9Q›z9”õó±QdøÉíÖ{øšû~ó%ZÏe=L¸ÉUféCåW›.ŒÔƒh–bè™Ê·“%tþ3ý£Ä>Ä÷tG#ÃÍm·Îá“Ôý‚3º^C°$£ÎvïãØjñæñƒ bz2#"œ3¶qÙãØœ9 DZꘂ¼è¸[Az�t.ü¿—·E7A Û¯rËÍ*‘€X …à Êä[³0 ë£võ;s#dº{Ù²��&s,e¢‚'Ypn÷¼ˆŒÂÕ¥ãœ;ã—h UÔJcÀ½�ÁuŠˆ,h…º ¾kR€¿AlŒ½öa­Ò8’3//)«Åé·1÷³¹ûh©üÕ±�Á·¹´€)mô+Q–û×µÏ�€ËA &¿©†<ÖºZ&�‚9]˜Bß{‘² ¢1‚³ª†“‚÷ÉN@hb¥Æ„Hg0AŠÁ�ȤÊÊyTÁXˆø§?cÑôÙ1¤–;  uÁ”]†# bï~;‚²"B;ée™³Ë’âK%«ø’0@½ò¬Ch bî8[…‘¢ãüZIÒ¿ûÿlŽÿËØÀü ¾ð˜†GÉŸt>HãÙ ~à $†>8TU‚ã@‰DF¥#þ¤W’ÌÎõ‚,HY7„î,–¹'½§r°8B÷H2G ÚôRês~Ú¯¥^2ÿ=ͲÎè›= ò�q–eèôJ4"¡ã»¸]aæn¬xä¸ÿƒ`ì¶·üðű¯R-·uÌš nóLõûYýÄõpËØÇ·×£»áV�Ác<_¤ZpË¡u‹%zŠ)”*åä7~—¼Âò ¨©F»œíN®œ™D¸×ÝÉ¿F¶ú]�ÚàïÃrçàö'ŒC.+|×׸“v?廸( ÛÕÜG¿Ø-ú¹™µC4'÷„_lÆTî&¼Ší›Îí² /z�~ü"˜-ÉjŠý÷êü GêÊhÆì=]�{xAE›á°t^J¹Á°™ 6µÔ®92(.|ÎÜŽyÍœp[6l"©éëíÄÈ?-Óst°¿Ž«ø¼™¾…öÁã4 {àe«¿*æo²›9|}Hµ�— 9ã.æ$Z£¸Ù�{­á*è:PWŒßŽirÚ,Úët�Jû½�>|ðçÑ7î%gƒÕ³…Íð0¡ÇZQx…�¸×Eu Dµc" a4TÜ$ `¯U™Öîþ¯€âÐ\GÖ¥èvï�žç¦´†Þa¬#õ;à¿2Ñ»2s¼J±ÙuÄÞòË8/ñÖÖM —-là܇ñ|'øï…Î/áÿ¤òŠÀ¯:ý³õ]"ö¼@(ë9,øu3)s{`Í…ƒ —¼E’±d´hŽOkd”*Ñjc¡ì}ßžï`‹$.V%7y™ÉÖVXæÉº<+‚èC„¢g@2W`vÐéd2‹lq+¥ð NrG´Ð´ÛJÒNUlƒ" Y‰ÒZ#Ç#óf(³Gkz‡²¶Á�ÏŽÔR4)Cé“Ôw fX!ù_‘óØZJÃÌ\*(·—1Ζ� ë(•�QØQ'Ó岸úÆ1âµº×Ø0 Y&]‚²`ç\÷}¡î0îD(…Ç ¼·ûbk X­%Dd•O„Äê^ƒib´°Tzc¿>ÓIz·,ÒñKŸküØ/Vè‡îxt‚Båöýck;€“-©,@Ö[^—á\y`‘tƒ]¨KÚ„¼ ÛÓ°é[„�®UÏj=ÓWmOp-ÒVht’ÑÚ¥ûµ9�ÚG´8Mºiaë xWIöC¤©º9 š/pisïß"°’·övÖŽÝ1í�ã ɵI¹[âÁ ÑÓj³+ \Ó?’×&Èp”Wýâ@ë76ÃÇÝœoi¶Ë›0å]xÿà£;2´Ú+ÅwYç÷ßs¹ú6|ƒé­%ߤ�CEPÍi¢¤¶ZlÅ)�ê¹QkFêTí$*Ñ“ªXÊ ÎÜWû"È<?r½þÌkðì|¹q nMüïîHãÛÞy”ÏEÊÂÔÿ2ë:Q‚2âãnñ¥²Þï‘·xÿ#Ù͓̃`Jºp¶ŸÅóý ¥i"¥~£…ø²ˆµüq\.–=CØÉµ~@5‰¨Q.Óý…b+gø÷£œ6§ó‚ÎÑ\ã~ǹ§éˆ�n6X‘Õhˆü/*I�!ÒÛ#÷ƒw˜NsG�€ñ²Æ� ±�9(óCC‹Û ”¸AK{ãĸBÛðò�¿ ã43ø‚ù¢!�hÍX»lÄž°.ÿÅu›Æ¯x.åÚîž&‘nª®)×=Uå(*Úž ïÑÅ ”ÃíeÆÇHlŠ—›>;Æ…wBÂaŧ„Mñ-*©’:ñÜ Œk¢ñð«¬c%[Úl³£³–2m®·)^^SªÞ¸Îuè@º1Ú²vš¦ÁÒõMˆEmrÚFÍõ†"Ä7Xk•^Ó[¬@–÷z)[Äë¸Ê*¥22P˜ÿÞ)D…ò�•Ãpí+j©KJöÉËq~E)kPÃâõ~Í zø.`�.e—K¬«%u0¬—ý…û0¥¼:ÏÞ£™îwt¬:£tª}ÚÖ²båK/¢7L¤üH¨vÊ\…u¯7OZtPBƒEóåÂÉfüÊlûØC2)ó�o:÷ rTu¥»nê²’tHBk2O{¼ÂVH—o�Ío9¹ç4ç—Þ^ùe™Ù'¹åÇ_q}NˆÓz¦Ó–ǧ>™ÔNGVŒÎ‰¡°q“dñ6tþÂÕ[xëவB:ƒqŽêu¼Ÿwœg�Wãa²Q�vMoŠŽfgq4T@ʸ ry¹¦5¢J—Lx+;ï}w±å×T9B�”ä]÷-̇sjâYhb®PƼɪÍÈë0X9ë6Ô¿.˜ ðe;>:>ÙåNøÂ=IqspD÷¸œ% ‘“úç²[˜’Ðv,õ�²1HQ¢åLP™,Q½,Ê1Â)]ƒµÝØÂ"»SãgÅðU5Ø)hX,”©ã+v=®¼Õ gC[jp¸Þ™2tå³ =*bìÛòUq©L… IéƒÆ5œ–&V&ê¢ì²ºX&мó“ãé1¬ïSBˆ¦ŒòÈDu²”„šYZªj\*¡ÝËØËÅõ‹ÉFôxƉUÏÞê YÓÖw­"ðŒ®N&tÓ,ª…•³§G©X¨«�äET#„*ÁÓ#´wm¢s^™•ëSÃLë\Ê!œ¾Û™›ƒ¹âá 4y°ëÀŒH@dbtM–×KuÑß&ù\a"o‹\_wÖ¯6Úz“ÍR5Eyß=°.¹–D®LËÎ¥]ï†XÍN(îô‹B„U÷PD—nU| 1rm|Ÿ?L»fM±DDþW0ɦkÌEÑ;†Áf�“3uIfßP.ogÞ˜¹Þ1y"‰½R‘z4üqÄ‚\PµsRYÿ÷Âß\ÆG!¦†¯|UÔ¾x˜�šÇ‰h‰µ³Ž'µ*�ëÍ ÍÙ³G…aªx#I2’÷XC§%a3H±˜it|™´•3 VE˜6³Úc¤ŒÙÙŠöjë ª»Ožw4!ãX\ötR ¨3á£épÎŒ�I› 1–Žb¥u:²Í݈µŽ]äWB"d°Æ¡2¢é‚ÎM¦z‹hÚíô“•’,3˜ž±Ë‘–;=ÆÚ$: žå€¹B‰xv 7IuÝŠ�APß8Úš•dóM¥xñòÅŽ—V¸C„Ô`ˆC³tª1Ý��Ã$xâùW|Ñ]µáàŽ"¸èuÙK½_Jã¡r0Ü,ÈÁÎá­ä!!!�ÊýÂ1‘ÕánŸUœ¦'ûË™i›%ãéB”-ÚãÈt‡$>¤éõ-.Ì–5˜f"Tƒ›Æ1 »Ñ•ÕB8[äÆ ~ÒË?�“ÐE ¯­c…�iæééëé&ÿ·úô1ÜþeX½ù§ ®Ñ|©ÜJB¢40²zšâ%ˆï]Ÿ¥¬¸.Ëe`ÂRô (X{`ë5™]l G5ÁâîåçÔîâì2«O?éLÿZ�&1C^-ýðYQ‹†5Oé «‡ZôÓÇ¢tYÌ20ÿ–!õz/ ybbÚ[²ªP»Ï®}7çß¶U–/8öÓ/¼ÿ Õ:d‚"Š^ŽÛ?õ Hác‡ÂÔ@ù±¬FƒF‹¨=ýðó÷^§>à {" _]p“˜@à%AsKø£ Ó“æØ¸NÎ{Ü—Ì̯c97ƒ¶½Få£ÊÔÊn¹dõçÿ kú}Jš¿<:m—AׄËëÎ!böj¸Zk›MËU€š0X•ýÁ¬C‘2ÝÎr¬¬82oàó,I�—Œ£e­mraîZÓëÁ…U¾+SS’8"Éš][­“ÇS¤U¡ÖåóñÄ-ÈÁåÛ£Yæøåò/8Pí,ápf†×b:MBÌ‚ö­¼˜«× `W``+pòÑgžVîÃzÚŸÖè/­ B3áiEüy2à¬íØB¢ wØ¿ÜÏŸ|ÅâSeÙàú¡Ç$}|Œ÷èìÊ„‡p�Ú‹�íJ~.¬~ncõõY³– þ½þ]³¹è!áÐ93Xps%�2©Wˆòâ ¦e(]“Ày#*.XMæþ@d³„¹²Þ³aakXXgQÛŒ 6C§^J:Á‡".σ'o⾯±·Æ€_þ¢™ãîoÀ�EáïÌ!üö1‘["ƒÊyn‡�Ñy_w¶(ÜUï£. ßç~6ñ.úÀÉE?WÎËÇ�<Ò&±`Ø œ‡²3Dû�û÷oB~nŒŸ±¤2‹`¾¹³kÆž0 $´yç­ëÙþÖk×ëÅn3�‡cõžüݼKÊõ9‚¥GJBð‘8›†ž#W»÷µ:»ßYÕ7èõÍdœÍ6ðÍ$Ž^«¾ùx=®cd‚a(C�®EÛqíóA S'Æ£y”öü,2÷©¨å(*’¾®zU)Â]yÄÜMˆeF´}ʲ¾BR}Ÿ"¹æÇ2:YèRà»QøP;c[¶,py�ã|ä 8ô�fƵLq¸E<Ç�vßA¥=ý­–º{É{ÿ-bÁAŠï•öM™…ÛÏq¬xAgØQßW¹Ì!YÔŽ5pÝ Ì�ì{» ±³û~]m�bCÛ&rÈ‘`TKµ-–ˆ§Î;Ü7Y…©È¶"¶xfç‡$�‹jšã8 UY$ÛÆ"Ì<ùT?'zWÇÒÛÂwÈ•r+u¹Ü�:‹7«}ÕFÄõù¾ÐY»G=( ñ~Êt˜js¤ÊÃbwË”ˆƒ<4-ÿË~±àC™pq�{àü¥ïâdyžd£ÊøÕ�8–ެÉE4G9­"ýtí6Egš “AN'ÛòîüíHÀ×�Ìñ¿Ýھ㺖£-­‰÷íÀÁç Þ‡\ên«¾¥²°Áá8€‹Ö! Ϧ¸â.¢EÎÏÜïau ÁƒP�”^ÿW4O^¦«+“ó‡c‹xBMSéÏA ªVжPɘAP‰³�§|¨öµ•¤[êÏ äì‹ÆkÎb‘4œJœw¶ ?æýˆ‹Â¸É;­îmÙ»¢ÓªØñ©ð‡b‡G>qln׬ÙxAÑ%ÍüR‰¦md›g¹êmJTx\9*ðRZ(ñ[i¶–×à6jÆ[øæænßǸsqÆîâíÿö2W+-Ö äÄ`þ«ÈØñ|Ó÷-mæzîoÍnˆâ�ˆ¾®^xXÃ/ËÆÖ c æFC¿q^þ­ÅËE ýØÌ.=>u Ÿ&@J£:Öíæ•Þ”-ý–àÏÞ÷­Ñ²t6w¾u¸Ôì"8:1:PcÛá ›9]…’k‚p^mí0�@áØ‚—¸­NAóm~¸Šàï«$õ5²Â`¢û+…(%Ž�%r›Ê' aQÛÜùJ®èäèêÀ …,VÝÍYÜç8¬t?3ÎO"h±)¬T“õÉ—<ù.g‚ÑÂxF<ÍñŠ,V±æ?'�©q]ÞQÌ+òïŸ "ù7![?‰=ž¿bøƒA dú5íúq|*4ë½Åã\±L¶äOäi+êºù3ü3þïÖÇñÌ ®*À›øK?à•ߨG»/z­ý[¬ó�.㻸ÏÈ_ÂùKc0W_e†v¿Ä¤dù¦7àÙyxÌ@-€©Òô…ð2|1’á…º–¬|I á•¹åIÌ7�AÁ½#˜©®Çk×¶rã/%_~gvXµN�Ô…*ß#˜Þ4ø4�[”úWç›�µ´Ýóp�èç¯ÅÙÍóG‚‘»1�rËîÀ Å'ñu/<Öuàê,ß<ÛôG¹²@Ïž½.ºƒË¼A_ååpcµ9Îr óšv’|ª3{|3Öˆ�RKâçÀjm·åÏ�̬äê4Ë��q~ÇÄ¥t™çƒk9Áß/Α;ÕmÊtn›ÏjÂ�ª½æÎŽo‹½ßæ—+owñ|íy­ZK7è¡]cÖccƒÊùs õ¼‘ÓŒø¡8¤ÜðVd8Át­ìð»ë9O˜Í9ŒùXNFnßÀ#Y´=ñ…È‹ÀŒ¶»g|‚ªu½Ëß](ä)eF†¾}òvP�ÖC'‰Ä 4xhÃ5d2Ÿ¹‹óJBñ„´èÐx�M'lJcÎΰ¥˜¹…1…"Ø\úµ¬’aò½¬ Á ¯·`áñÔâ{¤ߘ Ó'럷I‡?eŒO†ýhÎA�eyëÙc¶´Î�Æ »tkñ0 @ñ$qãgWT,0~�—3:Ø|TËLy«ì$dp��FN² 82@鯠’àŒ³¬°E—Ói‡ ¦¢+Úµïç§t‰ƒEÏT�ÂTg{òžÁŒ…[GŽëyA?—k,Fßg|¸Lù?i“<[‰GûËfµs–¼Èd-û™Îˆv&Ã8ÐH,Í×õF%¯…ã‡á<Œ/©t&§ $–_‹4�©íÖx1e“�&w;#3âï�E9H ¨FigM»+`¢È’wºF±Va (e>Ï-,{Úw*(IJëÅk8™×-Œ^hïêó©äÝ·'Â�ù´Y“¿_‚!+0—dÉÚF*y*RŃ$ryœŒ¸/– ZÊØ�«5¦7ÀtX÷-gbØ‘4Î$åÌ'Ú‘A LiiYPc^ÛüXÿDÌ.SÄl‘6.ÆEª7«“Û Žðs4Ò¥ ‚ûåoñ}ä{L•n=§hº›Õ¼¿Ȭ?,™÷&p¥uC�áªO›Ö©C�½1¢Õ(.øPë~C 7Úè-ùB|?}ÐË}´«¥QB`A$:•î[^Rã!0W¤‰lï9Ɖ­.3¦Áa„RÖ ÷ {4ÄH&É®.÷€e�²àXÑçGµÁñ-›”–Lø•Ýe6AtŸïÎçÌùްNK}v¾ ;Ì„«ÉXóKæ$ÞP×XSÑ׊iÁd5ê25ù‹Ì6KВ¼O}OW[¦aPÐÀò'q­[.[§Ð O³½kÉße§¾»µ™ë¡=BJœô,d YwÞ<Ôê>$³à/F ­ÂÊú¶DÛµÍ[\�¯;âø¾ bäuí—†xšëS¶tØ­X0òõîö”¢LkŠ0g‘]éã5 ¦ú>úÔž(á…¿ñfÉ´¶S|+EÈÇ H~ž¥ <(/�o$3ŽývMF/´û}î‡K…‰kQ¿MП2XÄ{B �*c•Hq¬3§˜Î¶B­’%; ѳ~áм[XÁf ¤²ñav(\È“ `Ì^QÊ0{uãßsSæ=ZéÚ�Š.¡•}‰Bäe·-æC™Ó¾ aØÒZYH1.`]YZ”²5ÛñòC×yÞoºÀhªÆ4MIy6LÉ„·|ƒÜÏ�¤ thÂU/bëžô•<¼$)9”¡F¯¥MSdÈ‚SÁ–nf¥Ž+k:Œ”u"!\ �Wò“«946á4ßïº0Æ29ï^B`@–ôQêð,$ç ±¢X1£œ^Zœíœ`NÅù ¿²!Ï'.>tq^êvS³Ål œÎV0kÅX ÊG|{_?=û¯uàßYÚ*1�›Üv°i¶1)åÄ;£øÖ‹‰LDù®pÜ2å´&Æ+kˆ`dVæ‘r6ãȉZÀóyfP@Þ7ߊIïá§““ò·˜Œ�ê53…ô¯&6è:'*]"mÜL`_Ýæ)ùåEÛ ÇGV×—m]—{d§6M\&ÉÆ¬Òc\æ¶-߸-Ó<‹�“&qÃl„ÜZé  MØ>[ £½,¾ ݈ª8|˜+ ]™nÒ„œ“{®ø^Á\røéHÛ¯-�³9°Ç®[¼èǶáu›zk¾èN5ê×»¯3i;N†h|0”ª—$¼Ps4Ù ¡ÿÑ8ÏeÄ6Ƴáµwœz#&Ó&Üjti º��õÅË!9»Ž{ÑßpÎ5Ÿ¯¤32©Ô)6óÉŠøáòžŒ¯z¾²Êpßa4zøõà` ÷ÎŽ=ܸ8Žöfˆ€¤A?ä#Dç–ù …¨8“(àôèÃÓÃ!7JS6�â#¦�8èãzä=è;Âh%g«£40AÓ/ÄU�ú:æš—Vþz«ásàÐk‚bQG:ä?;N¯TB¸'·Ý„:�êH}ÿTî<Žå/¿2bvL'°3™K�?¼ò·GßùfO­¼ñ[½Q{á8ú|Õ�LÊ?&ã�¢‡ÃïrÕ±ò€Ì¢´dÍP¬\Ðço"áÉütô7ÿ?ë9KìăSÎe| ænÄ‘«çzÖ<&e¢"Tl`|x¸ÎôbÉ0s¼^êØY¼om±„á[ïõ·L7œ I-³Š:‚ؤ1ОV„à4�K3»á´+¼\f.î sŒU§ùµyö´{ˆ)à^.DÎnÙ¹“ïJF”c+~›¥©0æ Y‡ÄæÌà7ª¥ÑŸ4¹KÏ9B,¿ö½YßãÏi˜ ?‰•À´3G‡?²Ø¬€¬D¤¬ša Ï”1–«�;؆’„G·BòôÑ• ”-¢ý¬láãuÜ:dƒdï)£õ§Ãóû?àIJîS©Y©¶ñžtššÂl¥FÍ~ðw_Dœ‘Ó¯ÏçÜ¢RL:Á[ŸÔ¿ ˜áóÍ…æÝ1j'íyï— ¼}zµ»vy®k¶úÿÒË@ŸW/—…´óàŠ:8 p q™\Ê_‡?CÅËíÑ� y9Î?vCëÍümèfìv$"î3-×5ÚNÊÙ@uÑŠå@iå"²#ªÓÚ Â‚KÃLV7Œà¨æ¿?´utª0Zá 7Ãê0Üñ"Î…hË‚KSÐ!pàPê÷=Îýví¢á8—è;k»1ß=¿M¬Û— øžnC´7g¥¹›¹÷Xëÿ~¬_è¼È¼|”b<àÅx�…“æC2õºž…%69gâ?¦üÁµ2LPU÷Êæq°TQLt ƒk FNÔMŘÖ CcÔ³ÀŒpÜ&€Í±:«[*{'¡@æßÖý+$#lU„‘ḭ̂|׈·ñ_ûø¨¡ä�ÙX¼è•zשêËÂ8m›ÒW²ö\lØÌOù+n6|3ÿb)|ÓZëµäel6Ç_RÝÃè°!è¶�™»¡0Zm>sŠ…&ËΉ¡S‚á‡NA7ZðÇ“ÞùÔ_FKzü øâ�ª¬kŠÄ]ÁY¯×ñýPˆ:~륵ÖXõ>‰ôßV’ùÄ¢RsðéÑOŽéjT0`Ÿ8MfÇ%¡Ú»u¹ªãÒ÷¸EDSí`TÌù …mxGé~ÂzF|Œ…Òã³’Ž?ø¬¶tÂEÌã®NyxDÔ~òu¯ü•Â-·¸ë«W}Ó°ÄÚ‚mñ­ÛDÏwvm¢ÄcY¾�±âñªÁàð 6ñßaK‹qO ?ÜÜ/�,$å”Ì4yGDcBR×tZÁK!cÛèfÏR|Öw€Úº7ôÑsºcO–¹·›Jœ—p Y»¹ÌýL÷½ñÍFÆÛ/ÒÌ‘ìÚ6‹WK“Ȱ€„D5++ÂÄï5Pm®g æGñw:Í_™r‚¦§} ‡˜ –Ù¬&N#ñ¶ø~�èBE�T0"ÊV¶²µoA'í0§�Œ®êe+©BÝOA{qUö0h>èæ�â؄漕üyAOΘì™Ü_á¶*«[¤gWlRä\“í÷¾4ͺ3‡ä ê&ìæf辦i8(c:‰½lé7«® I­;^à…ŽëFgž2[•ó»ÿÏa�Dó.~Æá÷�¿uYtûr*%Ç·œƒõ„+­—Í¡°ØMÏö]§ü«ª}¼Ñèóìå­Ä⎌¶7·bkà 3¦ôå Œñ} ­}÷ñ4aq–þòÃ$ª...À`ív¿5(ü^ø#@ÈB0EÏ¿¬yݳ!j �Êä~¦*Ã3O‚D¯ÚÂb@?·q ÉnÏâï¸@aqûÞêK†E<¢@„Æ9l•³lþ`=ƒXù#�CK×_<ḁ̊́ßx ‚A8>rÑ©©¤l«önÛË}Ù‘xˆ:·b.oü8¨~fõø'iuìãèßÛð‹ÒÈ@cD^ïø( š”›É9€tEüÊ1¾y¼K(-þ™�=]Éx¾ñ'ÉtóvGr"õ�Û›Á<µÛ�˜'›h¿†£œ�û—Vλàï?o=Ö±²Öøýmf,#ƒ�~ `Њ�¨¶ÃÜÜ(Ïâ‚d}[•¢¥åFk·§‹äû6$—›o×nxdˆ/Š5­QüqÌ ¹ ß åJ‰pAáQ:²m LMhÇä8ë$ Ñ,L jÞæÿà€‚Vùõµó&ÿ7÷—IY­ör^·ÆZ1¦kðx óÂãD–œÁ#Fô¿Çkí`ßqíåyKm……¼NDùöøý¼ˆˆþzãžg'Žƒ!í\ƒxFa´3,ù8ës4`µ̵θ¯8_]þ©†"Lºÿé}2#ö’¸î:nÔFé·ï´@ñëƒÒ7|=+„xùκùtªÈ1< ê“´S¯±=ôÊ–Žkuï×9¥5T€Ñd„yØÂù£‘œëVkX¾¸=¬ß™d~ Ý.v2a«8"%Áe·´6%>qôAPãš§3*¬í·lcÇ–P‘ð}¯ßKËÏ»µ‰.ó,æÖ�Ûh�ù¶~ýßѺï­ÎvÇM*ØßL¦Œ:B�ð�`ª*»Š~{r°Ĩ‚ ýˆy¿Ý?�Í$•?ÛÉIš8‚íÞ„0Ü‚³xÂÿÅt-kW�[<ÅÎ)ç('¼*"ˆ s€4‰’¡óÓZrøëûŒ½8yðNPD8¶áËûÖþÄ£0:AEÑ€ ç·—þwå‹þQµ¶DCh]8XmÇß§ïωXý°ðš®äO= 5û¼ò’tÿKxþpêöÆê9QwŽÑ{Dm-÷Io:_T(/Ü=!å­U¾ª°®÷ëò÷,U(~fˆµàJá§üb.fž×ýHDD)óÚÅ~/Õ¢EeÊ€+™Ý a´`¤¤0äÀ( �íÜÊ;º†w+_¸^øšU"¼Fºþ—»Äå|ÒÉôô{vyzhõ¬;»Q¯„¡FÑoÔScÑ }±YÀ1ŠàMê×4/wOŽ{|Šò×½ñ„1 €/Mébp�@F+’"y\}�ó“¼�ÔâÒ¾[²HÍÿܺ•³ÔϸÈë»ß^Pò®y‘)™ñæB|ÎôD�F×ÞïQ^ƒ/Ý÷�ë÷}±™y@)ަ7mãDPÉ…I@½Æ¢'§Ð•E5L =þÿ=³Hʬ×�0Ý—ü‰WÃãS…ù,Þœ4 ’ª�|H:,8š^[@¯“Eð’&<2ð€âRž„g­ ßz3Ðìün߈[Ým+ƒÏ«¼C𘯀'§Ã%X}RžJó)W¡—lÌÆYÅ÷²Ë Syº¯ î?q”Rþ”´î°{þj¢Ïô·Š—ö¸«ÓO2üE<…çô ó[tÛ°ÿ·_Á£{¹žÎ~s¯ÜÔ—ì•ð¡!ö›²¨‹¦ Zôsk3Ó„Èñ|Q±ä9@ò]Ut€’¬ ‡É-ãp ñ;¾ŒÉ“ýG(;?Ý›�ë! �ë«—¦}•qy~†/…ÊæšaÖn`k4ñ‹wï:Ú®ÖFN”üŸ“‰ÒŽÜ /ïÌDFŸK .¿ÞýŒ­wÛíéýèÞG® Ùdèq‚�gx½F’´]Òõ3²Œ‡èËF¨çžXeH¤Šéå-`iæJ§¼.?k¼! ϯøÀ‹²ÉsÃßÙ²ûõáN÷ÄE×ÎP¾utûU´ó¬.´ðp¾�g”Îô ²uûØMê96Äèµìø¸Y [òþ-7;ÓÅ¿…Ö>íØÐbcMç/Ub[ßÈWãšÃ›âöâÌü@¬W!¡¢Jµ¹¾k–Ûkz¿ryï)ü œû>koÐÔ +a¸CÐdÉØòk±]ÇÞƒìã ‰fòQd2ªžÙ0órötj¾KœóÏó~`ky ך³‰ðivÉþaX®×;¹"½°T�cÓ—Û­¹É<¸½V‹ÞNoÉ]„4!Þ†]5uB— d&öŽ X1ÁŽCͺ1áE$˜&ç‡]”M~¸ÁH¨®;,+ŠU ÒvÆV{e×ÙJuØk—õ¶¢ÿ¹)fΕq¾˜ìÀz9Ô&“Xúëd ­g¤çúÎ�q�Ï¿'è"µ¬+áwqú' ÿÒ–a@IóÌ«Ð3þ|ËD5‘­hâH/MìÌ5çÄá,pŠNŸÒ|¡ÈÕ·÷6ëJœýQÚh ‡²Ù ¦ß†ÑöSµƒKê"ģƒáøÙ8`±å˜e+ÀÒj›Wq°’ãª,Œåð±þÜïúdTz åEREFdp°² UcÌD÷ È)³Ì ÿ Ù—*Lˆhr�1þ‹€|nŸ?Ü[(ñæšÅ5‡Õuëßl“‘|@÷ý�aÿ§°`Ú‘§֤Ú?Ñ—yÌ[ÞïÇŒ­àyâõ¢Mr^ÔíÇÊô7·ôírþu*¼s÷âõ± ™÷Ëuûâ4 ÓfϳîèÆ²3HĈ[$¸Xi[‚? O‰¥8\š,Ü c-‘»JÞìi kcá.VÊ©R¨�äC€¥SVK�Ó®¶ã„’?…Suò¥im�Äÿ?ÁåÒ_-|'[E}#¹xLg)¬om¶¨ÕçbØl¶Z€šÐö�†Iñ‘9úªƒ/µ§³:Šó72§Trq¶5¦+WÓm¹Ú�b¸»PÑ-ø°¾~Àçêžü‘®‡áøµ¯c µORÜÎwË´èãÕûB}·¬ñFjÛ@à,æoUÞ†A§FÛ*c2³ÃžÁ6ê?Âoaµ·¨M¨ºˆ:ÉxZùÂ.±í°â±-Ñ`R ‚æ<7à�@Ï#Å7ìßoÍ×cu˜vg¸òêÀÊêLÒ#W˜œá»óéls�éæšnIˆõ²£:{ƒ»fôÊ—æ’$6×þ‹`±ÉIj¦ÇËʧlc½=ûÒUÐûiUçHk¡)­îQêÕû­—£ä‡îÛëÆ4²¤LÜQNüÊŽñ;ß…ê®pŽÇc-êSß:êoï:-·Ùóu�-Ã�ùê ÂçêgÑuµôEÜI f®Ýx‰2HÓx•¶ë~fét$‚O ùÇ3óH&dtîsžzÜ×c=Þ-Ò¬ g-:6°p‚” Ë·¦מ¦VãxÏ¢Ë*~d×·‘IâùÄÞ>8\Jkã _Ð�úoûê�)C©ôÇ>¬­ãú§û)EÓ—\.Ÿ1„Ù 4Z»�‚NØËwÏ™Z¶^Z7©þ¦ŒOìùS"ªúÅsÒâØÈ¿©¹“Òâqý¯N¹ñw?�dG´V<µp+q°wî6Mú£"ÿÜ ûê ŒÅ0ð?;cà­‘ÜL_¯ÜñãMTÉ}ø.E«ˆ0#?.–óCcæøøËDÍ1`:â‹Â7>ÕÚÊ~ ó|¨„R¹=lGáJyˆ¢u{ÙÈ"÷ ð‘‚;ýü[àøav_¸¾K_é¹ÊŸ«š‘¢ÂøÏÓîeuÎcÚXß#hò5eÿ-¸·š<ð³Ë�„I}–·¥¹9/Iƒâ#FÈÖñO:ôÕ'=ïng[Ô=9z�kWï9—ûë½µ×Iüû+ñT~bû1ýúŸÊªíý¸^QDãAǯ·¿z<¦sð§V* UúäÛÇý²ÞŸÑF»ÃÖ�]š0”#cW˵æÌŽž+3 P·iù¹íbìÈü(2ºjPUjj¥ŠAþyÌ´µÀçP<8ýùñ‡älCÚ_Míª¾¤^¾¿|2çoMt¾'ÏÝn™:JUÿxÈxC¤´ûSW*@½s³Ó°}ÂÒG,é÷�sÛÁ7´QEM½¿žüö“OzøžßÄN¡çýì|½¦0DÿV§?¾þÛSžÏ¸ gÊý¶ôQ…€cBàx׎çûhòÑ%ÆOºˆ*Õq1ľwzñ#!œÜ¨œbt&,–mO#¤Úa” ï/ Ñч%6ØA1Ûwµ=vë]SÙ•ÀʤkL2W9‡¨Žµ&÷eNrG.À¤–™¬ì*KbåJ\2d.J g³H‹šªá¹Å×9^/ï˦�Ë�Î.á†û3ûÿ%Z|ž� ý’0“3ÞÆ¶¯w†W+Yc%)gË0©³ `^¶#qQª¸ÕŽ(œÉɤÏÔOcÛõ»þÚ­oöÖª·™ªë00MèÎÔ|V[GÏL®V0\¨Å^Éû–+HÑ8|ƒÀ/ç'Y뺟âc\�ÆV”±ìåËGxl�P8Î^T}oSÖã„.slÓhpÆœÙâ³øÎÃѤøfó�ôÌ@)°½¸o\V[Ÿùª[ÛÅ1Ÿ†³âoUå0‰qâ.E¶— ãf3çS¦>6töþËÆŽ3év6_r¬¢î¬_A™(0Ù„îvÊú›�eíÔwÔ®¾<0"]y:öE…’G ºc…©«‡¬êW݃ÉOŽc…�Nê†1­ûƒž÷OorBÖ=ߥèA¡n©&Ié¼dñFê«êûQåÑæX¾ˆ Þójÿìà¯x< z&ìËù­íœ_w¡øY°;y/‹WÆ3)ö3ž}2Ùwoÿÿ«¤ã!WߌâÆTf{—£-*cýÅ:#.6c¤?ÈB%“,°Ø, Q@yÙÕÜù øš�"‡ôk«íºà=˜ó …œŽ_ Øí §©ŸÇƸ9×Hr6ÍqÂΉ2¤ Þ}ôëé–õf!ÔÿêÂøF÷;\\ÿÁ�û‹œÙLá½n¼Ïu»ßãµ NpDÌQ�ÝmÓ¦2Š1šö)—ˆ»zÒù‚�<1·Ð+ Õø¿öžŠ¦‘¡‚qÅöÓ�ÝÌñý-×àÕb bË\÷I‚¤D+:ç£_¯øG¦`±Ô—÷fÐÌau³rX5ì¢&ª{IªÑ0'dòäÊýí­gŒÑ‡E‹“¶u«gÈÇ0ி&}!¼\\ÑÑÉ«D•¿�Äc3æïg^8Q/im�ËL�· ºËç$ß«Ç�˜îO9]ÃÆÝËÐkyùÕ¢¬“Äxø|a¬»ž |íÙ@A®z¼äj}qGvÀd¶3rÛ£1>_£jÝ6̾¶êÖ¥ ÁÒb´z;á"p[HüÂt`ÆŒ\¦3µž+˜�iâA¯‹q’jŸýpa¢]¢%œ7É/>;ïÅjŒ%Æ”þû>‹×­§åUôê ƒÏ‚o§½ëƹáZ)y¹Ë2ç^\Iô8É?Å;´‚*¯<¹öãͧ¢³u67‘Ù’î£Ûù½©Þ 7¸›c† 2bJLÙˆñ<º¡‰œ­Ë¢!ycЦñÏíÑuy�‹¹çéÓ£P‰`wýÑ:�â#£�x»x²HÊ?juóî!õ hýçÕË7OþÀ‚ÜÔ's½=�»çk@Ën¾œÝ¿–ÍÂÐ;[Ùü ޏxäd/¿Šë¯ó˜nóHÂt?Áø€ðCGÓÔ¦š,bG¥¸šÅB&%ëÊÈjm‹´¨VÆ)ÌÎ÷¯°ždd]'t±ŽpùUÜ"uæ©”Þ<¾|”&Ò´kHM¥2¼j˘{Q׬íÖ¿ÁdŠWý¯×Môù·3Nl°:sžŸÂm{ÏöøÎù§XìX>|xÏÒƒý–Üץíoˆm-‘:ÌÌÌ?“rª¹«ES#%R¨öl|gm+ •οÀn� m¦Ý$ea+˜¦i›ËFjIS¦È;rðÞ¼�…¿d,j4„”JÛýµãáˆkäƒ,Ç�t÷ ‹² ÿ™BzØ }10JáBÄ~zš•­Û¾G ùÎBP!@+¼¿ŠþƒùƒlÁªê‘# k6‚a­W“ÚÝ!ª9c-@]2œ:ƒúùsB|÷žl.—^Ð î%•Tú—Â�‰ÿÐ2OI%³ó`ð”�Ú“†<Øî¾±ï×ІlnùåñØoŠ(@¼$;ï$bxÂ1®‡f¤ñ7ʼìw“è_K�½Ùnþ»êw’eõs'3÷·€áŽÃP„485("ÉŠ ؘ͌w°Ãm×b æÕÕ6ض’ê  ÍÅ£60€2AúYR*"ä1cű�^·Î\Áä± þ[õùS dFãj„ê^ên»Ñ=î=�³_– ކa¹¹„TÞ�a£ÔwnQö܈¾Ëõ¾abõ¯�£˜ùxHœ8XO?‡¾ú²žnáÔ0Õú6º‹Ëb»¹ƒû'q1 Ñ´ôÙ²MùÕ#¸�eA¿"›èL—Úáw f�цjÞ·ÉÂÔDÛHôW²éî˜ÅæÙ‚†üÆ´Û-çõÏ÷Œ3M�ú3Îcg"\ß !æ«xg,0^1±›ôy ÎÑÉÏgÔ´qµ_ƒmziäUs8•‹ÈÏçÌÓqX®¸' åZKÔÅ2>ohwPøÕMõ½Î-«Îî¥Z#ÎÛðLüÿÅ�rÖ¯"0-û!P¹â'LINX@�Yá†cglHÔ¦1À­ƒñ †Ò°X{P1Çd×ÛM¼•ˆe•-¤—ŒaWm.e¡J²„q#‘>A¡òÌQm7B°€˜£ƒº.Õ‡+qð�Àý<î'/ñ7W%þëu|^@_ñ³g&‘ÎS 4}þgYwúñõоYK…ÎK ë»YWT‰ïëî ßLf»ž�N­ŒG�±ç˜¾-c©ö‰—RE·Ó2ÐÅî€ç´ƒSï (.çËÀCûÓÄ0WŸTzçŸ1îÞê æÃñ7–¾ø9^þ8ªü^Âñ{#=ñ>úPˆ„â‚bàôÀA‹¹Dc¹LŸ/L RÊLŽÁ¥Ï¥dTòÀçaY»!ÓàÜØn²uñH9[±Ï5ýcþc­UúŽ÷!þËýoX¤öIÑ„hâ-Ž�üñ5ǹ[»téû "�-èv¨ÈÞöº„Õ+½çwMbPßG'y�ìÅ�‚ q0˜€xVÙÞÕþ¨nŽpX%7³N²¡$îIî Â’9wh=ô‘tÝSP¬Éõ1RÚKFÇ)•£Ek½Eh¢ ¿Ã ð:¿* k­^{_ª¯³$66À4u6?¿'÷Mú@—_º/Ÿï Úà¹÷7¡¦‰£Ü™d6\æÿòVè.ˆÁ ¢!Q”ST>{ïs1÷ÇŽ}„åÍÈ ÑWÕ5õsÎKx^�¤âeñíð¸Töc‘é†_Z‚ë#¶^oßgš¯CçÂѪû·/�s”HÒ);UqàÕKìÒb¡·œY®t%’ ”k u¹S½ÕCÙ£0§Öç\þâ~ج ¬cí±Ÿ =,éÆªÐÉ˓v%ê«Ýé1­äIîæcØ%��½ÚCƒ^X`žìzB%u&Ä]2¦J‚œçhá  Ã¹G"ê‹€6p"PdÙß={¶8:/>/«çï¸=Ý�µU_x]E¶{$±NüëGT&2‚R]åóÆåbâ¾öï’¿‡l¯kü—!é…=‘€^t¿+^ߓӿÃ_íƒá7ã1® S›ëÙ¾«6Ŷ4„¸2êÛ8Ö<Ä]™Î[ˆr_4t ¶­uÌò{mÈ‚<êZå�:ñª )ÊvW¿<ŽL’4ΖÛÜ ÁzîLý1M3†'Ý?¯hÎ …ËûBàMW³:…ót>÷åÅ�ÚûuÚØÂ6#ySÊÝuók6ökÅÁð¤SÄò1âãî6Qi_:»¼há�QK…¢#Ûžx/@Û“‚wmÊæ*7XÞRW~kY�²Ä�ˆÊÃÉŒøpåÇfÃ�.5QË¿.ùðIÞàÕî¨í d;´,ð@B&È$´Í[æ]·�€ž:“¥Fé]t ~)C]l`­G|1žÝïýÚñÊlutÞxÕ¶ùÃ)”$F¼½™àv�Öè6nõŬŠóˆ�õxÔZê  Ò W8O\â0–_3cXòí‚æíHîC®[dÑÛÍ]5k¾îüæŠv7‰ŸXf[“ —‰»ø›óɼwqÓâærÆõ ¾Á‚ÙÚ+ºÄ%-<亂“`£®âq˥ͦ/?ýW‘V�õ>kܰwÓ`cãÜ ÏDò‹ê€¦¸Ü|©Bj JvÒß›×�n@þ¸ê/õ~ÓœPä¶šuø@ÀM–Âh�XˆŽ÷Eþå­¤ÈÐÔÊ·ù\!¢¼9JÍÆ·F¶¬Üt³ž¥p„²[!òŽ�]tšùÊ.yoÂúðnm¤`I›s÷áÖ2µÏöp;à ÀŠË+pGŽ…_P0\Š|]¦|‹ öÎl¤WP.YÀ*Át½ËÒJCÁØöœÃó2-²É\·Ik»€Z¾$¶r4\–j‹¾À™6jík,æÉºÕŒ�SVƒD!ÑÖI�G|;Ôø\‚põ¶Ýh íB¼ôü�dÍïVÜ"›obwF›í#Åëão{š ±Ñ`<{ÿ¡}Å”¼8•�ldBØö`wlžçÑ/­jrBq€€–ô½�ÉÜíð÷µžy‘¼’îJg@”œ·s0BÞn꣣ï{FªºZ3�`)7lžÀ=ç^'UºècOùÚX>°Ø×£·%�fý\¨Åþæûˆ]–ÞvFÙÝÍb.ú’û9}3’š‚‘ŠKpiM'óé§;<œXªôøW£"ó�m„gMÀ¹ÇjVshÅFQ¼ƒ±Í$ N_étÓ¯Ò�˜4SÀ¹~ÍžÙž.~d™6¢,~5Áä&pŒH[HÄ™µåÅóïÖXؼu£\&WÕÿ�žÚîHe½:¹CVhf˜½_eÈWAéd©†} <í¹äp?u¼Óú;þ38ÏGh‡‹íƇ <ï<œA‹÷.à”Á¸D¥¦§Z@ÝàâLƒÐAΨiÂ0c Gh‚][;rHƒ–™•Ê»øÉœA„ó‹Ô8Õi²®ðyìgm;yK¢bõ$2¹ÝﱊKÉ Å6xÏ�´±C Å G�EçÇTÞ\§í›”��D¸3±ÊÔ¹±ÏOO�y£wîk±æšS­zÐå{Žõë‘z$ðŽŠð¿öRϰQCå¦,‡´Ûá˜û|žù@ƒ7—; žÇ�Û¬Ñ�¶£¥øI«F'×™wö(†º|é.:·½®¡î¾:&cÅÏ9ï6]浟1ÝÚDZ´ÿ\‰vmÐi£¹+{™mqC=ïËzŠiÊàYÛ_€÷Œ) ")S3ᢓÒ]Yð> '˜åP�`ls—Xá¦/{…5-JÐù޵¥¦lÈ—äÙ�ôèN(…ñöÎ/k—‹EÛóQk–b&K¼�ÇO™�p±ryÁýXÉùÁW @wy${=ĵÌe)‘çž}åe«*t¸¹ñ¶—â,xp.ç Eæ|l¤ @âʈr×1€êŽúÏ1ÛÈ]�-–Ê‹L‚—CÈjb«€ ºŸuÌÚžI€€yíbØ®ÅbFÜ^g�üÂÝaG r¸T ñÍäë-h›óK}œ :ŽÚıÁpuH¾*çe匉-ÌYé�Œ™/ƒ"„È*?ót(.eHkˆÈ#]}X«šá�öî^>Á?g R|{ÝõÇ,“Ÿ³þ Ùïäå-Âó†¨b¯í¯.…CÊ‹¶¹¹Ûæ �f’³�!`/¬«iÝØ� Ïæ@†Œ*i°eŒÿœò`]K ç ymsËõÝg¨ È×�Œuä¸õ†úUð2{ãàõsç×"ó™ŽùsÇQ9¹L‘®9•e ÷­C;�BÎϸ‚¹™„oÈi™Pç$V4n`»r‚ïä¿­ ¾»é„¸Èm8â1bgÓG!RG j„’Ô6ð¹ÎîÒ¥÷zVÀ¿ËÔ­¼ó�&˽˜Pêñ�–ç°4ÀÒ«»ˆ½roô%¼5çäÓžµy8Ò¦bºlGµƒ“ñ/�°è3ô´ê«§=û]ÅhÎõ¬¸k'šR»¦¶Çƒã“¹ÍÞ5U§ðÄFá0@¹‰F¬&hŠ1ti0n«âFoº�×IÔIW%4‚÷+˜ÆJèê Ú j´4°ÞN¾¦Ð·¦1éæ@¡m~€v{ã úLŸ9Œì(x¿q½ȃ:׊:C÷… ³:@@Æ,x“ŒÜ,ÌÜL±8e=÷CU|ßÞÕbUaEÔ#h¬=ÚÞCö1z›!DàQšiKœQÄã¥Â¸%(œ`›!u„ÒÝÌGªuÂ�DæD¥9~Õö\KßVd ÷XÕÈ´© ) P4“¦%Z¶/»À® ã½Þ”Dã Xš�»Ž^4ÒôÙÛË¥šã;gÃcMÎS(µ³ˆß�4ªwìâÁï}”È�9Ùñ¶qFDK‰6ë#6Å”£ >tƱK”O1’ƒÂé$…è6¼Ë¿ƒ·º�æ°îO¥�xq’-g³pX7BÃÈF¶ü4äo�:ó�8šÂaß×úáuþûæÏÿŽ^7}Š·7ô,ÛD<î8ì›g;zªaBs7fˆ ëø j`ßün½©mg ñ½‚ÏŠÜŸØ=ëÇax UsÑ$e°<¶Ü-àÚMÍÇ™Åé¢+-‚S,¦±™� ÌUx±h1Ìg,<ö=Þ•ËÏ|à ¿¼1²=ct·Èþ¶eЃºgZsÅÕs1®yç‡pb¼R÷BA w§.M�a5bÁwÖdG r‡Ê¬Ã•`å¥ ÁõÓ Ð\Êi¢²ÁÆ=4ƒjõUß{b GZ–Rp›{)¸ÎVÆ)cÜ-1™áÎ}),êêõ yh‘ô˜ð¹|¾WJä¯Õl‘$ä¶æ.O�jV…:¬É¨Aº¤[g‹»–(pkœÆ,PZÛ•–0`˲ )ZTüðÀÉònþâ,$1ÉXS/¶•Kjz@I0á \Žäî~ÿ��sæs�=?§u >âhg“Ÿm×.|eᮟšÇÕñŒõ‘æUb=¿0ØK‡!F¢cû®UEÓ$E…÷ÑàºÀó¢o¢öÓÇŒ¤SP¹ ¶YáE¢º—ãûåGÒÇ mlSÓÖñ€ŸEB——Ë’ô>qó»Ëg)ªº5B¸ÄK쨾ޭ²K>.àè‰|SãÛ®é·K»Vç�ŽGò™£ë¶l…oˆ{ú¼Õ_ã˜Kºà�¬bÃið`sµñ¢¸{!-Ís©·‡9†ödø2¯� ±uXIÀ¹àчâý]z˜írR8Èw™a£œ>2-ñ¶?ä|¢v*;8BßžWFG[Ôî¶~î5h^úcÖ¬ßn ô5V°/µlI�7¿€ØMõ||ê3ã¡=D@E+q÷mWJÉã6°© ”Ž×u»z‹­¶U7»½ŸpySr';c÷£# ÞcWëÔF1ðëûuªÎJ1ÙwÇ¥7^êÅïô�¶-Œ¥ÒÀcIV)o?ÁÖ[}Ï«[\Aj¾üq•»½G?\¬.(“e:2ð·õ)=V÷ÚHùë˜<öþoȼmkÉbÂlW›{ùÓ¯÷o^‹­Ç£^碶ˆ¨ŸU¸Ž«sœ ·ÝmC6 /’¬ �µt“wàÁñð·4 03µpwå K¬ÝAègz«›ñ={ÂMý ¯(gâ Ä3©³ÁJ<æR_2*ÅÖøÇ«$b3±�¸…9Þö×aÁåïNWbÆßjÀ°#¼h÷Fuˆ{›ªë×GÒ:o‹G× «p™�hh9 �Y¯—‘ì�Œ2zV®-ñÌ­ïêÀÑ—Ú1xß~q°mȰ°µ¬,=WWÆ=3ÝËn}q¤’1v$`ã‰Ì«}Y$}¡ä‹‰â¾Dtâ5|%¿àã�^Û"�!)gÍåãÞÈðˆŠˆGmœ�¿�» -}ãÌ^÷6Îï�ËŸÂãb¸J=»Óz]×»WCbR?*|í{!†D]Aä½b¬ù‘ÂZ ó¤0Îè‚ ²LÆ÷dÇ�ˆ²tB^ì~ûÞóËíÌèúw^ æÚïÇáx ÆOb ´ñ"¥h­¡æÞ£dˆ§rSn,ºsý�E…Òœµ•Çté¤{ÑÁw¶/ηËiµŽÝ+? Ìì—:/? <¹dˆ¨�‡2ÌïÃW61eŠÁ F;ä¦T‡-‰ÛkA‰uÁ�eBœ?[iFGD¢U3Šnß³Þ]¹ÕjþÖÆ×Â…¹íW‹WŒ`ˆ«¨GÞÐé/›=ß_ãGõ„`Ǭ¼í—8ŒºÀÚ÷†sgêx¿ m¬ŒŒcˆE²¹¾7<@D¤¼öØKO¶åBE"jkŒáv…‚-«+9<01Ë¢yÁq‚Â,‰ƒ[ø\›öq7�q¦¼>x'6tá�ÍÆUH¼³a OsB%É2çm�Ãn�ãžp„koæ•i6™¸Ñg<Š&éFNâºÁGŠÞlµ´s´¹%ü+�Ʌ׃ÇîÌ: àÏh5M|í@½¯ÄR+í7¾ß¢N<%‡GÞ•î–§ÊÉGÁ>'ˆ]ÑŠëžK\óÑÕæ�¡à§o ö\êKh_±Ÿ¯t‹š…ñy�*?°úÈgµfÌÍÃŒ7µº?EWEòëWòÃÎý‹zX®…®7H0ŒÆ£iÀ`—ko°>2ÈnCÄÍpÙµ÷º4]â„òi$�ÚsÃ…K´ŒM-6Åó5Ù'ôõ²�E¼Ú$ŠÐŒÖ°AÖ<[xS«šX­ó�EÿÜJRZð?ê©›´Œ]:+óü&Ü×Ä‚¡˜±H5@å-‚0 b˜@ì¶=” jÛ ¹êÈSJòÞCŒYQr£Ô[°¬Çõ-¤'6¹£+mJaˆa'Mâ¸bWdR¥/.WpõudÑ™î7²‡+ý§óIè~Z1ö,ÒEU»A¢#îŽp ˜*þL–ó·ÃؾÕÞßÁä@4�çžDdJô½•óÐÕ¤Áâóðà-¹ÂÝZÀTW¶Ü¨þA$k¦ÝK¥áŠ”FO:\[;ÇgKg¥Ž–ëj•G8Þ6!ôCZ5BHf5fP­Šh U6¾°krš¥1õõ|�³ d<:ó‹×í ÜO¥6°WwnB¿?%ÔÔ@…7ª´ı�Ý@”à¿MÙcýh>Ý6¤%²BÆÅÿD¥a•WTÿ¶o¡Åå¨\­Œ…¹d¤ Ó«qt¾]:»Q…¸AÍ6\óËßZž™8€ ö¿…ljC>¿ù6Yí.¢X_j&[™/,þ¾‹k4gCZ« {£5}LÝÄ0' ˜ªÃ¸çÚt�£íî3«–&ùù­Šµu –\þD~Å–×a+ý¸QÖÖ…¡mrúó9Mj:e[ßN umÌ_Î{þÝO±û‡�xvàb�=!¹3¥¨ÀååED“,ëy«m P{Í@÷¬ÃááðUUÇ ƒh'ÆMûîén¶Ï�Þo'E1\XgðwﶈYÅ€d¢|fÿo‰¾µm�_øùŠû§\2ÇŠ~67hß6üò h*<-‰s:K+mÕ[uPÅŽ�Êe”`o>®‘}™lûlÿØ…‡¾°G`D~qIþ#ê°Ô^<Ù‚¢±çà°v²X׌S7(…7YhU� ‹�P¢ùŒ_¦äÀ_ÅüF›kÎOªd3­ï°ÕävOü-¨ü,’š™RÈ;‚›lô>?, D2 ?ÎÖÂ�Ú¶VHp Tç üùàìX¤bû½Š}»^•í¬ÑLŽÙw‘,)�ZBCŽ�쎛‘…É hÈ9ƒãǾSŒs8¿ñÉ%ãiXÓ%ûØ©–ùÀJ!áL—r&„ñçc˜ÇNüÖÁs}VÁ»_„o—ýPW:¹b15Ét8Ó½°àTCÚ¥‹‹�» [¨P�K Øo^2v^� ‰‘åœXã�…kNÀ8Ýà &KÁ¼>ºãwSôÌA�7þpT/Ãz3&¿³œ˜ Uu¤<–´yõüSîÏ™ÇUÇûQ÷–ÎHH5NøÙ!»~óg_FCŸ�í¨îÈ �[K&LŸÇò “쟇ÄçŽ3ÚnQìtë\ó&ôÒ›ªDLÔU³ÕP�­¢¬A³ŒA.¨s"´4¨Š 0˜zÚ–U8v0q©»¸Ët"�+C%i¿¿ó] àðÖ÷(³£Õ9 ×H,oö3Ö;?Ü|îÉfbqÇMËÜ2Ï¿‹Ûz|fݘ06ð”äHÄ ÝCL­�T Á"6“R0Îtßr«€u8ß–çõy°5#€ÀpãÈši#ËPn®Ö?rÏŸ¥õ˜ |pŠBÀ!3„—¢æìC>ìi-âDs̱¼‹¥cœ¶¼ù7|W¥ÃĹl¹ã{Üâ±ÂîßTÊo{Ð…Ö†�NiTÊ WÝ6Ã$Ž"H’ézÖ©H…Ññf�îCMÚJä…Ú›ïF¯�r~ÝÇß­wí²EéŸÒº'†©Y;"ÙC>Ù„.(¯ÑÞ£Ð\.¡£]íûrƒÉŽò­3¨¹¬uªªo.úÿýXXZÖ ªÀë’â‹ÎñÑ¢"v½ƒpó¸´ˆ�Ø—¨˜Z–F¸eô�mLËâo3b lŸˆYR…mâPЖ ™~Ñp‡CÄRåëߥT…ûÊLOh¿W0<Š“êF#(Œ ‰jc—zd ¸ ÐP9n"2º{€‹ ž(òFüË œz™ÃŒ{ß{Í ’�<.T„˜èß—ô/œ[žQëÏùý»v—…µ ýÞÄ—QíÕl—Ä/qê#‚ø4;ôùWÛ*šc΋¬VBÝÆðŸXœ–ïêô�/ƒ¢ÌlçÄEÊþ’½ð`Öºo£éåÍibxx˜(!u•á¹bNh©ê¥»Tx;AlñóæquÊé]Í iKÍø]s¨//äIJø§ûLë;PkåvÅbHZì#†à§ ÚRòœ,ê1ðxèºVÓnÎYºÝÝ#s¬ ÆqÒMëCz7õɳ~oN›{¦·�ýáæ5µýk�c�ål"ä1-Ô0}¬W"iKB6·ÇÏ.weQT<>ßjb=Çy�i†îÓ¼Ñ91�<5Êæm%¾�q¤O—œ;bó}N®´WOÕ�àMyn¬äí®jCÅØ?ÃHWÇÆ.\¡ñYË6Šoçó²ÞÉ뺈˜ :ÆùšŸËPÅÖF}æøèOÅ£:÷ÌyºçëÎÞ|wÉŸJz~1Õ–;§¾?ü ÊƆnþ�§R€ül0k�}ðÚàA7O2Kwã 7ôÊêœÐÚ·ÄÔ|•¦ˆmOA‘m,fZýŽ�ƒ¯ÁÔ`¶NÛx­³8pž |º­ü´Á‰4éîÜüfÑYgí7¥?[F*ÌÒZãW.Ž�¹Çž2lx÷””DÀ”I¼‘ów½A']1æ=åNïDCd>ÖÍ�ƒLù¿‘ Ê×}æk4 Ìô÷›ã+rºûëY[ÓL‚Å`[-ÀóÖóW-¾õèÝ€Ÿz6�àèkЕ;�]ê !á‰!ÇáðaÞ+7¢¼‡tòç¿8:s�õ†Hö•ÀkE¸¼íf²°³hÉHáoÀk*£$·Ž›1w®»íõÝ£h1²K{á¡w™Fâ{©Ãð4è>Õn¢êPÕx/¥»øl°�© Ûiñ-ï<Ùn]W/`$€&ÛǙӎJ¦v·ªJÑœ¦ýtµÖ†Í,eÿ^w°êø^ÜïÚ\ßn[KõÂÿ‹ûèeÎÑÇtAGœP[Ê ñMÿ˜ó®ïʵâsC©Â7·×'RvA““;žø­ã!2ùÄš‹’‘*°´ZÜòíÓ~ŽcR>ã‹‚'{_ZEË)‚OO,\›ùƒáë˲~ºž�ÞÐúŒ$]C2!¹~7Áqªðm#íh»\ñ{wáY/^}“« ¾FCÃ9ŠÂ �Ô{±O©æ'9õTR™­ô”¥g0ŸJM©ÅÍJåêmÚ?†h>1ß�q9ÜÝ‚ø2©2‘å‡<ŽÖŽá: 9Ì õ œªË-¢­o�Óg¼tœqÑ¢;›®Gå7ƒŒù¢“+yûÃc0\§NnËq¬öQ A ¾+¬?1 z£RPp{É÷7�.�&-�`Ôs;PKÝ*Ñyš¿Ý¬ŒbŸ„êòf¸ESà$!‚e@šcÍ%·“†2¢¢=¬”_™A2}I�§£uon…ÄÇ,|¸PÅç/ξçoƒ2äí¦ÏPR²$HXÎj÷"tB“ôI[6›ùCd¿azß¿+lXð<6ƒØ¼Þ*óaKG)e6Å-*&ÉX›)¾ÈÀ朩B'ºåBç¢�¬Ý�¯šåÀîä`ô†¢ý(d»Ü-¡›ƒåQ¾ 4ÙBz¸Ø+f¨šÄ k³�6#¾õ½ÔíûåöH|eQàa¶•‰ ØÞáym[e=úÊ:í¯NIoÜèÛÆE·<…!ƒàmü²%™Ù½oKö7î“1ªýìä¾Iý„¿„eóµg8‰™FüwXŸÝ_ÙK%·qTêœß�©“ØEÃgJš=ëJ³t–M£ÈÏí8'ý31¬ÕÛº·¦bHYZÉåïï§]^›`Œ½Xw|W „`S? 7- /J4ƒeÈÉÐp7¶m•²ÚÏ%c>ïØ#ËÇLguÁ]"Ù8 µÎ|,sÄ«ª6…ñ£}“!h:ùÖ\Îoê >ak&û´imÞZûØ¡™‹cN!y, âCÃR‰ÔÎ8A"W{KÞÌ4) Dù,¶&2 *ò.ß]²o É=¼®ËMíXãÑö^ûó¸ð†SH»ÆQ ºÚ<Ó¦ïÌé$åâ”Ê䎟{ˆ9C™C¦‹�³_^¤ÁÚ4Hæ‹~n±‰$/(p&öÜÞ=÷êÐë”Õ[�me®¤"gkœñîK´[r"”n±5­—$©íX¶{Îyš6èÖqyÆ· û{g%¯dŽÿí×°<Žðyƒ|¸#U{ãÕ‡?ÒÌÞnË86¶™ó�£j „^«(Wàƒ¸Ù7w—`ˆn—a¢ûJňøNì`,ặTZ9ì¦Îž&Þ‚½«ÿVþ¾­ç€užŠyúäyþzWOkÿšf€ûòñ© =Ô8Ž·¾åÿ¶òˆÐ®?ñJþ(u¸ëÁ,,ªkAþ d€•”[ë§,Êö~>,Zdüe%îb[‹ÄòŒªéûé³Â…%ÿ�^ŒØt¬•À_DŸê`|éØ/®O;<ž·þ‡ð‡Né^ý̃AÄY°¬Ÿ�'ø¿òN3Cì,…áa^¹ VùÜ,7}ÑëÏ “€å ÚŒµhW `{)Ÿ+!ÂU"š‘,B¤‚щ©lACj/ÊxÕƒL~íç^ìw�™oåGWn¾ñ%r½ï^X«×ïä¬ßú%êMþúÏ¿äfÃvv¸‘%Ï 3-÷Ì …ÄŸ ¾n|z¥"mbPÂIâž­ßšÚ 2€ˆjZͧaá/ŒebeKï­ÈdCß›»ð�Í‘$üDÎ]ÎÜÁàÞ�¦‹0"L üøæÎ¦†FéÌ-Öõß)寣wïe•¼JŃ˜7§‚ƒDÆd�Š Ø�5ɽÁBíL�ÚFJßôYžÞ1‚œ/©»¯.é°ÛIU ¦e9u©lš]¯^GÍDÄ%=%TØzxä&4¸„(!å8.i\A³h™©p²Ð…7Y’Z+TJ3«J">¢ &4îSRúuÍ0¸•ÀŸ u—ÑKÚþhôËœ 󫬆¡œ‚#× Ô(óº8ˆG�'“ç*¦ƒh˜Ë� ‹ƒ ÁŸ’ƒ™ÚÎY©º]«ª©Ï”T÷ÊAM³1GrAáÖg’Ã4Aã¸NõiØÑêéi)Êã×¾ ª#ƒÅ+ˆ/¬žh¼Ä¹†éÏ­ˆõ§Q²5ªm‹Ýø¡ ‘}ÔÄ ‡GmŽ{÷ñœk¾$étë±<�ͺ]¡×‚�ã„ ‹õЙŒ ”ùVnæô¢zkÛ9ˆåTsº™Z®Xæ!ÿCDþ§úϱ�C ~À¦s@e`”2 =v;³„ ƒ{*¡îZ¼›'co,Šóª¿ t ñ×ÄþCs˜æù)^ßžjf bУò:b æ¦Ó$‰{,·é2>PP4[çRúèZ¤3> ÐÈ5¬ïVÄ\~ ¬;Ú@åó)õµÍ[õ®/öÒõ!Zÿ}44œQaßø¿Ì©5K#¶‘‰HOÈ/„X 4s]’ té�£l°YnóÉù$qn~f££h„fØÅ�ÃõrÌ_ž/'bO\¼°¸íñªA¸×e£êßå[«ÉZ¿y½7t8>c¯dÒˆ³GŸ+GëA&l‚¢�‘`Œrü‘ÛÞt¾B Må]Ï�Zh 8ÒÝÛ—þõ6¾¨èŒ{‰ EÚ ¬¾ë·†t�.:Bµµ}=‚ÒTÃŒÜd9ü š"Ѳtlöæõ¨>i\tÂ,òÀ×eïÙ¤¿SQ¤3‚éŽþ!ÿ^`Y@TK5NU±¨Cb8‚Jïü‹˜L‘oŸAµA?dR JÁdfÓï¼�HÈÚÈ+[Öâ+ã5vþx‘ÿ@M$c‘ÜYÇ„Ø0o±¬¯ŠD\8xm%ÂÜ­þé ¶ƒYÂçåÚ‹#žM‹ÛάUÞªèÁšJa”N†jø�ìÐ+èHÿüö Ct kÖÄo‘n•}0Yõ2RU›²¦_2¦I^4[e’ýj_ªr•åXyâó(Óû�áž™Ó`Ã'šo}èOÆ1%V[›ö&Üí$]UÀðdÀÞ(t”UÑò‰m4øÙ0çóùæ†Nsƒ!Ñ®"TjXJè“ w�kºÄ网¾sß|MJmmV¾f1ÞüQ&ãØ?‹cƒg®„ÅÂ~C=È’z¡t›–kz½òÞÆÌßáÔ‹Ûî‹‚íŸxøýãOX†l �3PöÅæ³ï¸ðo|ù¬MmnÞ_Þá'Gªu-*Tÿ%kí};rʕėÞfIÞ#O7�Õ|˜¬}#·Éßg�I1\ŒeïuЙQrc1÷N�#pL[^5»ÙN¦†�ï²Æ1nk§�Œ›¿04 2–`ýŸo±=uä÷3ÒÎúbb�‰©®ï×Õ¤µ\ñ©R iÈÐÜ÷‹ê‹s2mzÿÎKv0{níiAïö¹ÙŒè¶ã‘¼��H½û²aWÏüÀrÔÞ.'©„_�í–.R–Fé‰ùn#Ý?Ÿ"+½ýç˜>hÌ ¥Õ4¦0C™åœUW;f]Îñðs©Ñ!�ßšÝyÔÅð5Í[:lWn0v›¸ÑÚ!A]S9¡½á÷¤\xRVò\yS¸^XÉâ,1©NO}”Æ‹7»d˜àħ|¤ÆŽ÷¯öµ•áQÁý Ìh·vV=X×ÓLóLžk3¦ÁŒæþUeÙ˜& bÿ˜�>�Ÿ¹íOÎè~¿åÌÝ”†1šÚë9<çd¼ìû &LW°hª3\+pò9 o¶lÌbà^€””¿ÊoâÌêšvC^DÖ�°9¶Ï†�ô^îÏ©À ÛJQt±Šþ¯©NõÅÂÂÆ ƒø¶YA·üs‚QŽkB¼CÒ?òA·±}†Ë“AoZ6Æ ÊäçnøÚƒÛ´Š£ì‘<‚çáM÷L…Ö³àÝ�ƒ¬«Ëë…Œ‡¨ï ›drÚ&×ÕŒQÈÑ�¥ ³YH.�“ñ߯S°iä~ËçCÌŽ„¡9øÀRÄÙŒ®¯ï†EhCŠöº]åVEr··ÐûC"éG‰\ò¾úù X;|èWÏÕ]Á w‰à>ºÕ`rA ’ �.«ù›å5�ƒÀõÏ;ø``žP\(%Ä@HÉèÖ6ãÌ‚©ú/¼ÛWá˜RùÍW¯~››—œ�îsyyˆ^íÊ9Ôv]4­¦Y®‰ïm¬pc³°)b¶¡¾È—Ï^5Ö—žúZÖåÉè”¶÷PÖürîõ³^®žÖJþù_OžYËÓ±tBã>)e¹F)Æ6Û÷®Pé~î3æÕñ×Ùo¯ÒP@.P)^Ä}ÕÊ=Ø‚êføÆüÎ@À^–xtd0x™ó{ÔcöéŠÊ¹ÆjËUÛ™•çÒ‰³÷�vÙ©{5øÈz^(¸d÷Ý‘Äâÿb¿]>úú•»µ†Ãõ'OdþP]mO2r[O(¶·D•œ�Êw�Û€ZM�E’q¥&TÛQŠà#«á‹ÍÝ{4XU:£ØÜ¥XY©Ž£²üþÍו½è"j�Ϥà†u9æ^i$ÅÌßiÒ,ÃW€%¼G Ó �VóB*PÈŸLì…¡Ôc”DSûAKòáÜ�nþ®éBy&Wìºõ‡ºÊ\(°à¢ál%j5,ÿ­Olç V<ïÓ¾°·žÉÊ éâùÁ½ ª_,3“+”I]±§­~«÷ÇT”¸¼=Òt†\µã˜ fªK±Ý�ô³ÇÔÕBæ¡Çô†�›;Ï�æ¯ìÞý6rÇ’Ümî½Û…מٛ‡ºï0”„ÉgLg9Æ5M2§—ÛI¤Ÿe ï�4öœÍD/¶PgcÅ(¡‚¡‚ŽË³'ELâ@j.È?%„Æ gó�%Y´X~ÜúÃ<`™.——x9s.ïoÎÜ�Øà„Jww¥“·»€I…A(„Ș& n5,w¨ƒ¤‰ÿÝ’ÀòKuEÃaŒžE£ÖÔ(p`õ?çÍôL=âƒ2O¢ÿÄsbOŒémæºê&;Ú{WžU�@27>PKrâQþ©à“fx&oÀ<�lü=°O1gŽXvÙ<–ž“Í•ï^¬GcÉÂ3¸,Þs88|r°3žL@‘‰MsY"T8ì_íŒk1PÃŸÓ w=ð`m�£�;ç«•+㞪†œ–<œÈ}˜Ùòçl2³f¦,W†ÂH¿21��@gå‚·/rã‹1¬ˆç’+èb”3ÁIˆß¹1�!´n9ÜpË”gM'öZÍ"|ñ˜š˜59ŠÉøÿx…>ÂÆO(U”#ÊI;´Æv?þ@KZ·£"RØÍ­IµŒ|#JÞ€äܾQRª†a1〰, ׌Sh~ ¼Ólúg/Úv?%à‚•i4Ú×ô¶#ºQï‡Z¼åjq ®úM£Ô ï1uØíñÁ·ÈÂ”í²©� aðZÀS`ìX¼.v&%ÛÃ2( ùm£¤®¤ùL±ýtF¹¹ªjqÔŠš(:cwJä�\4�Ò‚Ð×^úyK½bsI§;& U0§¹óÇ]'ÒM/0nñ+ ¨Ó Y�ªS Zgwg…ôÑ ®ÔK˜¯"¹q¬G¥ž>yÔ Á•T´”áð®™òÚ¹¿’osé+èćlö[DÒåLš17DÞ/Õ;ºçuI�§—rÌåæWNΰóZm¦¡dÅô4™˜žbw“:B€rl”Ä^“÷¾Zpí|§™–‚Ld¹“™-Nóï‡Âá…ñ«ãUÒV 1R¨ÔÆêÞfÖcɰ�Òþ³øÑà�ù¿F�0Ï}r?¼Ò™z8žo…ì—ÊC =F-ÕYÐÄÜ1LOÓ¸a´¶TYiGÓ-X/QáJRƒ�PoCÁF²ž˜RÁo€èhð$Þ¹…í'G|aò¾ ›Î°œpâ·)(ˆ^®33u(Ð|4ƒ:,¥CP«b»m ]z×Kú•Ìãy9Y<`e="Dƒ0ã‘Aé¹Ôx­k¢huèWló3ƒ™V}n:Ìò;mG—:ÞØÓ�36JÛbáËxô–¢3�Ÿn–ºHÉÃJ,�$„¿*¿�Êå¿·LX®ôS`Ôˆ†-Ö»Të§× x�õÖýŠžNP¹Ü¬~D¸& :¤’� Œò�:+%)ƒ…v&îÀ4@Âé•FX´ãÜ÷£ ¹£ö ®vú�àÇ…�w¦,y>Yúî¹OAÃs(µµD�ƒœ¾UW°¿lfQ#$0Žbô?ª ögçÇT2Éï góPhøåâ1E”"MìACîm>,úÑîXïîš¿W° hÕéeÆ{þQì§ãäÆ™ÑÆïÏ•Àü½U´át¾Å ‘û‹ e`kKèëvÓÛ@àž1·Ö4 ©…)JTè½�e9{ó6ÿ4â„CXäæ ô^`’ ûäŽìÙúùqQ8\­ÚŸü@œÖx¹Ê¡p§˜Î¨J‡$\ Çý±Ž¾ªùfËâ®ú¼ Ü)郢洰\8åÑô©„Ç$.ò*qÕ®Íð5Œb®¢$õõw\Ô˜¬C¥Âø†î1¥ÄåO_òúÝ]Ïj¡ŒM’šòöz,󯢝Wœk5¬Ña=ÎTì²hiD¨\F_.sYÔdSváS)ªÐy±„æù”ó[‘»õ8I–çža4TW2â�ȼlâSGw‘ 1ÝÝ�èžb)órª— ­I4»,U†ñìÎ�ÂsÍÓùt-Óˆñ*¼l$ ÷eqŽ¿zWß`ç÷‰–¡Ô¨GÛ"C²#^öð.©l&9A�«qoiþ¤— ³Â o™�@žãy}`�Ÿ 2†q)Aô3BÓÎvÂztZp HCÖ¯u„Ö«�uË]ï×�£¹m4,vòÈÄ_"'¹Ú�­(´±¼“ÄÌ] ÞØò¶AŠŽÛq´4è›ÁÁmšŒò ÊÚª¡#™b ”ZÆD¤«l€RÐÏuR�À”éÓKL¾QQk% Xé…8Nó®Î䆑Ôc­,­–9bó‘%ûáðŸ…'o¿Ã¥€Í°:´øÑççñØ%›Ÿ—þnðÍ<è¾D2­¨úoxD�¼eÔŽ;‘‹„§ø,ãáú¿dd™}•Š_³ûý‘^gë¡ß<µÈΛV¸äŠ­|…Bû™Mœov¨5•¾x!Hî÷±ž«uµ›»0o†NûæÙ›ˆ�žZÝ]n@ϱ®}Îóf¯ÀŒÓïh¬[qúpÈR ¹‰öµŠs! w›çe¿Ùå&S~aFv·_檲^Í@´ šò¢ kG3[FT­3jµ‚¯œ3:¾Ø¥Îäúã)]xMo# ½”øÈ‡ßà³{üm?eŒg¿Ò!P|ìÞ'ÎÓ¶/1Z×gš­¹qräRça8”æA¬LYfL^!wñ¿Áq§Öp „mó•`|N+íÁ+3µ…ˆìû¶´´(VC,$«`›”¨þœ Õ¹ÉC@alnÚ¸~û6@6¯¿–Â;&ñÁí6oþ€`B‘ÙïÂ߽ؿ Ï÷�¤{Se•«ûºÄ¾Mò wÐx/9‘ó]Î% ¡Çâùä̲ÖÏûLSs”A !¡i±¢‹¸r†Ã‘ÑaŠ­€à²_ÎSŽ7Í6ÌyzûçHBnKëZ�"+BÿÇdtºòm¤»(¾ÐQb?µDÌÊFWcÏcDHß�c彨S–²ŒåÉ ¤oýlÂÜ*=ÞD»0f’xìü‡ñ_9Á$ w5IÐÉìŒ*!L8Ò‚wÔ’b!’•T™¨�Ô¡,3X0*%}òþÍ!þý‚qIB勆�çãpÑw[ë}mË: ”C÷ S¸/÷~ØGƒ‡©ßŸÌ½dÆÅ}@n-<‰`Ô„?ÃOkD'&þ($Fl)Qb„¯?Ò h!2-�ª’ÈGFiFTl©OUž+[{ŸFpnßÙÁ Ïï5Mçv¸»|¦ôAŠÁzÆew‰÷:Ь,àg˜Q›7…½™éÀ ÕÍÒ=ÙËjÞoy€¶ßr-çá¨ô¤ÖGzÖÕÏÒ·¾üº¼¾ÖCsxv\àMº¡‡É ¾NwŠFökà—1ïn÷‚²VÊŒKeå`ÆÞµ4Ñ†Æ (=î&;Ób†¯äýýõ¡Gëô ¼ZÆ4|42Jí®ÂYÉÞÆ.ýÍ�ð‚‹djZ@YB@xuÂüóêþÿä%<ºh´Î…æ=|ö&ðÉ^£á9âŒoW†½›ýw|D^ÚºaÒx¢\e& m”!3 ºWéÖˆzœ—+]{QpLœCjtè.=Æ¡˜QŠÄ îËâûÍÉKhÙ0/û¨O¶ÝŽ¥ÝgT_‰(z íÿÖÞŒ]÷ÏØõE�Œ�nÎ ‡Í�–÷:[l½ºuǯÀvÜ?ÔÑÂøØf4Ô·¾ÕÛQ�$÷¬Ó.^°:³C‡UxÇ+±0a+Ã6ˆˆŠß„‰)zY½Ò³jœDê”É}‰=§nîNoŽÀð£6“ëÛçãýþ~•cæÓß÷n&X½[\ë‡0±Ð ²HJîÌî²V‰Žo‡äª¨€!VìEäiá)¸lǵSÀçe|yñž¥ê‚kË·‹&õi˜½?;Ï ©;˜4‰¡nvAöaÇ­%¸E ýþë¯}¶«Ýü©POÀðVïŠ?¯–‡\äA~�&¥5@Õ¢"ÕWˆ@4�½ãH[¼pkêC6˜&tº6¢N‘(‰ÔÅYC*©ñ¢·½™p‹…ù±Lœƒ<²^à¦ªÜÆ•ö1gQ]èºC¦IL§Ô%ÂC:…´Æo�|…'Ë¥ÛÀtáå4ß?'oSÁÞJ4÷„3[!Ý„Ó`â<2l¨äY]r—]¶&¬ƒÈ غº°r9š¦2·$ȵ¼æRÊÛ<¶BÎÐèß tJJª°½U}¼(/[BîÈ"ÍXÞâ§Ôª«˜‰Šu›s¸ÕwûŸ!t`yGrÆùIª¼ð&zd£Ò=ÊgãÕ1…®î>­G�Uaµ%ÒzúžÛ2<"Vk ¤¨nU^@sÌÄüÎævŸpƒv¶Þ(²†vêÊîy½±[ò…v�¢ÓÊ’QÙÄå2)¼ dV‰YÔå#C†ËåFamÞdäéÂ9†™µ¤©�±oÌß&æøítÂënÂW;0é‹|`fùŽ9²û�B%öÕf�ió–iÍ¥‰ðìÑV]tö‹«¥|vñ "‘¢UÇm×LY&khz£¢–>ɇv[Â7` \W1™7;Ãfĵj?;:ßW;žs㽑:ADšº½¡F�ì¹7¦C£YzP¶Vʪ–ݸíë�Ó‚r¢†+JõÞõhöa»£�‘T÷É·o;U; –¯|�NÄËN]â�¥ ŠS/ š²mè/!º<8гӦ€N�áåa¶Ý6@»gZËÆîP|õIWF1©ÍÊz›¹¤À�½zdL𙣞_eΤ*­îƒPÕ›èÛÇ1Q«Ì%lÖne݈‹ß/©g§›eRæá¨ê„œ£„!4ŽÉ•ç„=•ÂØòü©9‚»,ÍëÑ/BÞ<ªXœ)ô·'—jèUNÖÅEÃ^Q³:ÆÔºîijááSF Ù8¯1eŽ7º;k¹©¡2ÞŠÒšü£¶ü uÕÜË"òœ̵<üjùu…}2¯�¢7£[�>9ÕH†1Qâ“í&†«“‚åeœ2ïIåº%æTÏÎ"ß–(x|T‘#µÊ¡YdaÑg+xDÁ6 y€§t =P. w¶ðqub… A •¨¥žÔ‚eSG ê·Ý¸æÁ`nÖØØ"ºƒfƒ“•é›ZYH€I(θKbî YT   ‡V�AÖx{Ÿ Å‚†gœÆ¼U*cw¤`ÓÆÎ׸'^Û·hO:ºu‘g�Tªóǯ<¦üËY㼂ël$ã̯1™ñ �-Ü›•låïg‹«X«0ßa2F9PIÞЬ®¡—#Ô39v®.©ÑË—¥Ô²PIFÄhÔÒ2 BS( 2” f›$Ò0 ËM’ 0È‚�¨Ö5"† I‹0 Q$ ER„³Æ�°Q’¢ŠJ €…$˜l‹ ¢f‰0Ab„¡°‰Ba‹2¡…™ È¡±�11 eF±)HFŒ3IQLQ(Ph€5b±‚32L¨É�ŒH$…�EJ06�M6H°’dŒb)�P³CŠ2e4# ¤Í$�±©ˆ(”fi ”B(™„…i$¡"Ì£J…�P6d&i›JIDÑQLYe”B)j’Š� ˆ ±(Òd ÌdIDA#DlŒÃ�ÀŒA‘Šfl$„TT”–H€††2™P`“$)€ˆ™ˆÀA‚Š43 1 ’ %‘†4À¤B‹0#% 2H#"I"FF£DÌi*`Ì‘˜�RcT˜RÄK(„‘„`ÆI",X0b-¢$b(5D¦’cb"ÐX B@¢Œ–H�1(JY”TiŠY™”¡ †–TI¦(¥�²Q¡ ÔF“6E˜Q©¥‘Lˆ)�U› QTj)%(RM$ÂfÒF%€2†RfL*IJ1!”M‘™™ˆ¤”¡LQ£RŠE) j6,™#0lÉ"L42Q¢€d4ÌF• L‘¢"HØÈ¦ 2¢ÙfT‚…˜Ôd’2AÖ$¥‘(%B´EF-B“AFˆ´d-)±l¤Ì3M3‰3H ©“l‘…ˆHh‚0(’i” ÑŒ²#BM‰ 5A!˜–DdJ0L($‘£U b…†ŒŠÁ°‘&Æƃ„Òi–%’a�‹2F3&Œ!‘LɘBH"D-�± 1%�F6�1ªD*, › X! Æ e’ÉA#!FCFm"›! 4‘H‘ŒS5†f(”˜H˜ ”d†’EI£F’J1“R@”bA™„ Šd¢$fb&hÒA1 ¦F"“&Lh ‘,b–P†0cFQ“&ʱbbF’J˜B(P`I&!$2H ”¡%‚2% �’,i#$‹�ÉŒ$¤“$�@‘”�ËaD�˜hÉF™Œ $6£kF,šÆÔm�bØ1¢ØØµ“a(�‹jJ5b°bÛڊƪ-!Z‹di¨¨Ñ�µIAkclcEh¨)˜¢Ñ±Èm )„P¤kFL‘�Q©fÄcm ¢"("¶54b„ÍhÚMˆÚ6(�’Ù¦ÉR…£@¦4dªJJ,S E« cmjŠC£2%”°ˆ!²mÌÒPbSj" e¢Å‚¨±šÆe£FÔI¨R4j‚ĆصQ‰,¦(a‹6KE„ÄdÅJi5XѲI… Œh°l‘¡*$Jcd²BfFØ¢ Á�Š+DhѸ\ùÜøôpLl±Æ@’ÍéÛÔDp<È !¼Ãy›u„g$.ü™¸÷µÊ`Ãe:Èðš�¼� QÛ¯HË®¨.¬xwbKöò•o‚«±¹f<MM9†F“á§Då京O:…vå=í¬ÊÓuÂðÜáDIx¶¢TöàÀ®í•�:`׈X0‚û»‚¾0�vsyO01ÓF�>:ÜØ2@ß’Û­¦gŠAš³%¾ ÕÑzâÉš3X„7\ meÚ8*ù±jŽ ›~W�Vذ±ÓkÍÎLP¹#°ù´1PÔ²ï:2MÕÜót)dù0žƒ¥cÊâš­ëÍ�kÏ!Þ,âVÝ Ý·Z:OáÁǬ�©` ^ÓðS]­+ªÃ1ÎÌ•ÁçsÃqe6X‡ ¼à†‹íz¨cW}ËZ‹daœS<î”+y—*ƒ[¨ ®Y[W†²TÒ  �pùµ”ª¨ëÍ«èsÎ ÷c7¯ÚCƒßg¾ðRkÛ(ÐC2Z,Ëê‡@óOJ©\Wr¡&ºÔߌ–R'O) jO:Lûå³ÿïÿÏÿ>ÿj×ÿßþÚ±ÿëùƱ¨¼¹où¯ÿRPoO[›Ò0«§¦‹ícÿÄ?û®µÙ1gշۉ׿ˆæe–¡ŸÄÚ¬ÝÍMÜ/ÎÓ6üÍìñ×5ïn Þ¸æ±ÛiÏ!?hAì;ú¨£—†~#œ�ÿ?üqÊú~l™_0<¼ÁUÝ_˜l1ŽöS嬙`õ#ëDA´^pmÃæ©0SŒ�‘ycR�>ôãzßSRýÞèmh9Pá¡ÕN$33ž¿öò`süÍ-å‹CYICѪ¸3DÈÈJpmÖ4(6ñ긖˜™M†TeÂ8úCƒ�°Æ¹<5«>X#¦± ˆz¡vì÷Nwçöÿ¬|zñ¯¼ÿ¹ù%æÔùòïÜËs㽟Iß­#Ë.îÔ…B41mŒ‚» ¥D/u xºˆÄ#Ë;¬I*&UÖI½”–Õ"êé•#ø®ö¢˜‚ê·DF¡üQ9H*€{@ivR25Í(ÑW^TñG)û0Pɽ3KM)4  c#?ˆÓ¥)e+¢“Œw Nu-�»œ^i0ytƒt„ö“«½q×X ;U`�0ü²ÆƒdUå?* œÑìŒ)ÈdªÞCª~�ýOqW"?Åó›Sàî¦Çt´,·¤´Ò|Íå eÑàWOèð¹œçm…ti#A²PÆÒz-?ÐjnhUħ&Äu*"ÈW¼õžÌ‚åó³‘,©ÙLs†ÁxhAþd<ß,Írf°Ž’™Æ7KùˆŽÌz×Úød ëv|­ûHDu&9H(©·õòË%¹…=A ÃŠ•§=Yƒ[ºVD:0&I˜t·2øjC^YÝÙ”ðK*Âìd8ªšoÒFS�¥˜!b @–FŸKR¸åù—ÈÕÖè2¯QÛÃÆ�ãq•8g KƒB [ ˜x|P—3“ƒ5¥h.ÁÄ 1Q_žqt¹=!ýó3—lÃÀ�JYWÁãl²Q‚šFÁ½îÙô¶#äÇˬxõ¦Ÿ²ÄL­–Œ[w¥ª‚¡ILB;Ä: °Ñø3wE"|^ómÆ—I|áTlbø~%M›¸‚§L¢mû/‚ÑÂR] J„\²5}z½TÁ¤£’)ùríøïõq´b/ÐøoªûÜ`µ í�@ºˆ+}L°è@¶JA†þm3\ôÕPÿm®K‘ØFM˜†£Kô�tW}$IQ)ƒR¬"’åÓãOÜ~D¨¿fœ²eÝ*±ƒêš-Á¹ª¡ ë ¹Š—GM¯~¾ý^,&î¾ÇYu»ís&„wd¹A‘‡Ë¦7�¹%zÊ(åÞÍÝÝÈæ�¿távš3¤»(AäñS8Ów~¨½'‰HÉuMǘY”ò>ùÎd¸t$m ƒ|ÒrŠH Ã-ÖЇ¬å· v–TžÖ–<¸n°Fcs9+Ƽâ1µ vs4UqËó£Ë4ª|è'"/2Ñ(ö±1„†„ý_oE2™ÂÅÒ#K0}Â)+Áih&0¹ãÔ;›™ËIÄ,œ“Áša›lÑðržÿtñpRt¯ÖæÍ€ÐdüTЂŸód ‚2iY¹æZMüTHÉ…T_”ÂyÖ�²NíŸâdÜšd·Úe´.8»|’Î $oc+æ{¸v{aÔ ^‡ÁåáD`KuËö­‹ çù�ê/�¾ªd/A†O û½áÌ��¬ÅrAÓ¶dÛêÒÞ¡4òË�*bŒâÿb‰ûCÒÎç»IWúöîÕ&�Ó Âün!ýbýªö¿Dc ŠØM‰ûïϪ•´¤h“”%ºT3G§R¹�³šAÇ¢Þ <å0–ƒÙšdö´¦¤î…•s DX¾%ÓoäM‚C mÁ ‰&‚þÇú^O³ôYÙÐ}R¿ìÊZÖ9:è�˜‡t!::6�†"¢LèšBÃuR}%aRl`h& LÚb²ó¨61 ¤'�š´�™sMßîS€WEâ¤äñ–dY¾UtèŒ@b–%<PÐÿ�í„4PP[JÁÙl‹(¶Ï¬cÃd¿‹?hSB¸ ÞïÝ}zªow4íðí¯6ýõÖÖ keqé^&îv«Ý¾­7AXÿ¯»…ú&Ÿ† ºlzmŽwNÑ»¢4Â$ö�$×Ó¯¯mƒ§à»—q7¼5zbV B¤¸�Ý#ë ¬°a� !|Jjxkô™ºï¿äªµ¼Ù•üªÛ¶eK1í5ñ¹R���•f!c(Lˆ"§ò£™ ezhŸÑA#Z¾P­(†™a±øm&Ô,ÿwû>_§5>ì~}úì%lg«g…Ÿ¤Z)‘�ƒÃ&˜ËÆŠ¶�Çö¾OĆ4¢PîÉuÀ<å ,òbaBÍõ(­£ª ™òø¹·ÇÍYSÄŸà±pBJÀ�T¡’‘Ró÷×@éµm–"ýõ?sýr4�3û½VèÙ!��Œh�}¦ éÐwiQd@ŽMvP‹ûÎŽ}7ö7ÆnAp:µ‰‰ Ã(“Ów0L@É4–Û+!ظÉÓV% ‡N‚‘vB?2B¦W_(n[ðü-¼€Ó˜‘m~«»£õx^ÙH:ø~T¯kØ%5Q GÔ…é²"Í—ò˜7cG{öã±}F}T©fhÿSÚÆFßß³½Äûí{á¬Crk0r®O´ßÄ¢¹pÎÂGí+“ÓËØånø™d¾FW@äD‰‡¨Òi <.}Ÿ¶lS+ó–…ƒgìû÷C=Ù¥Ü.ùº¥çÊ—²ÚÄçÍ’þòmk±ëQ…ðѤŠâ'M`ý)û·sbúO±ã¬øñÑ{„¶W†“™*�ÜI‚UÖ™TZO+¬p9ku�ö¤ÏôýÔH¾_û"u0Û²!;æc5"m&eC×WgwWœR‘C2F¾{³¥óiè#–~£‘ÛCÞÕ«ï·îNÍ–OŸ£>‘ÛT=ˆjç) ˜ÿ¬©Ú4Mv4ø¹üy\x„|¹ùÐAhVîÏ/ù-ÐÛ”ª–�©I9£í3‹ú×öÇ·^#Ú�Œ™žÙ\„!ϨzXƒ\Á Îá; V ʘ*jh¥õõy~å¿Î˜|ëõŽÔ~dÝ{c¹d1ðK°Í]´©}8â¹á#¥Lž4·špûš‹‰§]W¹7¨WSÜ~ÆXiå~O`J�þz¨�Ko'×ÉŸudÏ¢’8þºŠRFE=“Êmпù�ƒµ›®™nbAÄ à¿”L8A¨äºìâDb´•a^?³‰QãVBÀ#9,)å—[-+‘±è·GFµGýªC�ñ›°“†.a%¨ä)TÃ(6QTÇ…ˆ¶ / e(”– }Êd  ¬ÍÔa?yLBØÎL_Oˆdô*G;ïÔ­>”¢ŒüÃóâãŽÍy¥CÔÀ\¶å@Ĉ!~~Ÿßä’ÈÕœk¸Wù©’¾ÎÈÐÔIûˆm•®DZ½aL�ÁùJ¡ŠÄzº„ 9(J]1c&C²!Hx• ýõå}ƒr€ÕÂ8¹c­‡e §$†DD(Ñ]D¹¸ ›ñ·Ê“t¼2!Lò+é¥íþ ®‚1Ç Ç—vOîowlÁ¦ŒkÞ¿Ð^14kãk“#–—)H!ÖØº7ŠÆV60*öù`­NʉHÛTb’´”H�õi?TÖñXb `÷Ø«ïS*¦ 2ˆ)t£ñ² ·‰¡ÍºÛ笸ÌH/�M•„‡nA1$J�NˆDÆŽ¨­ ©³9ò7Ét_�Øâw‘*xSék¦ã¤[¢(ª£hm¯ ÚÁðÙ5IðÓ¡—箈ì§�ÔúhÉ‹Égåÿ):§ô¿ËU3SgEã`•ñ¬mOîbkì´\^LmQ>ø£T ±ñŸ.ð…%ò™QÀÔJ¹“Ô3“ESì4A�Á�UË óÖ§w»aŒÈh‘=i¡}3¨{ÃI_ÌáC\¸ª†/:òµEjyÇ9† 7÷”ÌÿZÿ•fôÓhþþÓ¥a¡éû„À›'ÝE×èýù,¿ÌVD£ÎðÁTˆ,<_gøE‘˜û~ï÷j­—m´ ��«òãÅô×Ã㶨üÏŸB�#Ê‚ÁeYâ7ê˜f¥±LkT�‡dæ]%ñÔˆ�˜u?ˆÞˆÄ®ÉÅC1‘…U…2b+r·uâ”fEßo{›_´¨f!Œ!Í—ç6¬F‰ŠJÐXk«µÐ;!|蔹ÉAGw»Óo±JÒh:§GåGQÂʉ œ€ìnÈRL§_yî͵÷>å Q¯æÔá Œ�ü Çʃgt„†ÉJ‡ã¥’ 5éÀsB~õ¨ƒ™_ÊEK[î•þ,yg)ËÆ°»ç¹|•R9p¤˜aáII÷øwNÆÉ4ÄSÞ³np�Äu´¾Öò–þàd“H}û�Sùõ8Â)Ÿ^Ù—Û�Ÿ<]Šð¼)Âé¼Éy€¥bv =gÖ">6ºª¶½±"àh‡P ÑŽµÚÑ*„@ à�dÌ™s ÄÇÈHn7“æ2]/_mCdõ´!ôêä’…²XiŽ\Æ)î &ÿ—ë÷K³åÔŒ"Ô+ç®á7ü_È)•e�Î!•÷B¾Ž?ľ»r�ßÝÆB÷^¸þT|Ã)ÿ.º_¡¬°´Lã¦oD¼¹žt”‘ˆ[à××úsMX׫ïµÝ‘ÁÓ5p�Ô̇øìœ!ÆWêJðž£ýK÷þ&+áyM1GZŠ|­–Okí;ü#ª3Ï=sůòHQq&ûUî¯Ã”»úýæQ¯ÏåT‹ïØ}ÿEÌ”J7óýpúÃôƒ�ÓDSÚŸÛ7v=“5Ì?§òr$ž){�UrpRPö2FUÙ)%‘ p9ô lßêKqž‹¾½‰0zQD8Ã!~˨ŒÏÛgöiòÍ–!û•‡ùWFf"Iþ<"¡ÙѨˆCêó½ƒ} ‹'è¶­dÿ*¿n®yqþG¯ð�2F@�Ïh`�ej»·È>#+`µ—Õ�¤jLiCé[ÌLj2‡ƒ4ÖŸÌåÞú!ˆ=ÍÞïéç–A)4~Œ.¿Wm’‹'ûaå³³_£?�%X­m~?²ÈüĹ�¾«ƒšuËÛÿø‰Gõý�ûþÿËúÿ1zc(R¹³ŠXÅ"؆b¹¼V�!½ÌP¨¸Þ»W:™w#‚С‚îwubU05½Ü®L–MèU¤�Ó9Ý…€ùDvíšó¡J­®lSÀgîÍ_KS–|½­�ËËmõÓÍîS‘k—Yu\?徟HTïÏFK×Ω¼õƒ�Ðlp3uê4€ÔêRˆ–Ùå�†eê…ˆA5&z"Ôku�ÞŒ“•SçÝ™—ØÂW¼'5™Ý�]K4�éžpŠˆ>ǦîJÛÁÎdb4ÄÑÜŸT«Ì>['pñ�åYˬ‚®7O2�îÂ[æK³»,X'/žwv÷<¼ó‹.¸^º}•1•X¶žö�ì‹·Æ-ÚÚ£Ô3»´ëcq oˆ/˜e¥XB¨´hÒ6ÛU[|&ô~sÛ¬®�@;BˆZû,öiÌtTáL€¬šxôíp~gy“ Wçmà àîx6Á;PÔabï(p@i'5“—ÂeUPPÈ”˜;rY¶Óc¥åu›¬w<+|–0I½ŒH³y•z pΘ'[˜æµ(�t�Ü ç^ùÓb�:eŠU\5bãTz»�pe÷{|8åÇi@‰¹ sè],åxVÊ–ó¬\¾ Û}�Áox‹ºì»ÃÖ%äT_ ¦¨Q�š›\4ëÒ#Ͱwž¼ Õ^ÔÜ™¡î¢û ÔÌåAëÉ@É`‚K—&ö¹,]“±¾]ï- ¬Ÿ/[H!´ÔáØp™¡b`�AòFq´Awoµ‹æ))ÃqX6ÐQ:WnîŒÊß/*¯”íoÈ‚ëË fø`~*º¼Ózh¶‰KAWÂæ¦È¬w¥w`6·G æ>qé­ë©»x5M4—dxz°eøAŤÜ†Xbõ•ãÚ±Ù:\L>«¸ Ãó¯3†Ü᪠Â8*ŽnX`–º‚<— Dm›ÊÜêÔ—;!¬®äAÎ蛲lP».›¾¾ß#Ù·¢†|yuÕ»| ‚bËßÑ$Zp9X¼G¯gppNÊÈ¡Ýñ_XC•x0!Òê�·tÓ[äx=žÆª¼ï npíÏn 퇙µÙž^ªÐÊÛ Àgv ½Í‡B…m æ÷~;c pŠïÐÍXMÍ$ ³¬jíZÆ*ıj·½½¿OFs‚FAÞ·œ! 6K…§{�kå¢È¤5VÜÎð*ª:yÙ �䯶4íy£;qxÍšáUKš„aJ¶ˆåÍìO¼Ú›/v£œFÕy··x“ª;�+ˆ#v,«Ã(BQj•‡–x«æ>Ir½UŒ9Ø]Šº“ɮ΢[�¸YOSÇŠ æð²`„šË8#¾L˜Æ–÷ÎCqÔg5 —“š¶¤Ò.ïËîÕjÂÂz²ïÊ¿]¯lù}îV†Ù6SðóG^…ŠëÁ€•åy‚è\™&@¨ì[ÅÀnÍ®; «;®êó$½ÉÞ*#u hk[‚Å÷ŠñvXP1³§p;J0Û›µÕ[ÇfxÍWO/…‰tž +¦çu>F«›­+±^”ó…©Ü.Á±Z:ì1ZVò¹˜Ù©’ÙÞº¨Y¡Ù˜^y.øî!E§db@›’‰•.OnßRyRÆ…ŠÉྥQêiØÔèîÓKžAhŠd7šŽ6Rw»¼.²„Å·[4èÓ‚„¶&0V�ñÁ·r-YÅ«IÈÔ—YˆÐñA-–w+ÅÄ£ÙqíWTR]ˆn—9â[�ÞXÏÀFÄÁ+o@Å{wÊóÈÖÇœ^a/³©ò Y›0Dy�Ï2¶ˆUÑ^Ó¼„GN�ZÌÝ …ÍݧgįËvöøvï(ðƒ„®ÆŒP¬íߌÐKG:—Ã×窺¼›v9KÍÍ2Ot^ã÷½°²½ ùíSnÞá›Ô…0ÛÚd-½l!Ô+µB ¼ªV„‹Ó¥H·¸ß.KÌ‹ÜÏ,k+e“‡qTU_EU2TD‚ªÁwLa²Ô£5ãÿ¿Œümí-F™¡ö Ã[o¦B€ÄÍ�yÚ4¬²q{âÿÊÎrÆÉî¿Ø�xÊr¡B”D–믭HþëG.«x|~i‘È×~;úŸýoy îÄúãÚÑ®k<¯P©ÿþáTúçú|VTo(Á®ÉÂQ¿N:lÞÓû}¿¡L²poªçÄÛ›–ëá(l^×ùõÈ�û.Ú_'¯`��þ�‰æVÆi!OÊ—ÑÓ‰vòÀîƒÔs{+Ó�ÑB�¸QŒ°Û{}Hpõ£� Ø|‹‹Çès)|·ÞÝ™–ödôß0 dëÝíƒú~0ÏÆŸÅG‡Õ©ºipè÷ïÀú<Åï²¥Õ£7»öæ?¶Wõ­Òв­HY‹ç¡úÊé"5vû¤ßT̹«ÌíÇì-13Æ(º’,=ùH˜&‹zƒA˜auý\6øø ±DªvXJK†Ã°;׳ãd¢Y癟.Ð8‰:`$%3YJ[úÇž}þtÔ¦ªö\ɘ9-á\¾˜r¿º:Ô�¯Lªyg#®…uš·žzj…¡~¥ÕìÕ ö‘ã‚ß»bÿÔ,… ´¸…Ñ(³&ߎ�¶X¸ë»¨©2çýDghÈìô†ˆæÊ~×nŽÑÛ•>­‚ö3¶©:üa+&àAe³E‰füŽ ,‹ä4‹�S*^‰R†ÃR*ú„ý¾ žç¶TÝÂæfA¦LùJnË4HÆ/ê½#‘-ÚÛª›IÜQ¢´,6´Â.¸.Hb'èæŠ×ÁJ È#N !œ¡„Ré©8 F_ôUW�ª*®å>æã ­ZK2�PM„±Ê™@Ú†¶I<š öü౪%h‹ƒ‘ÁÛ(ª*õ2§A\ô�$ �÷¯Ý50aØÿ`Žm$²k�ÁG- I½ÙH²W,*‚ MSFJ1ƒ ‡C„�^`Jà®4T£ˆ´Áb¢‹ …°6[Ý´.àAKãž4q�ÔÈi�üR¥¨€îW·(¹á½(€¼*ÈCZŠQñkÞ¬.¤¸€°ä¢ I¥(m 颇J¡*SP‡A’Ul6ìÀm}– s3y!¡ÞÁ«BUõ5ëï8Ó ë15ˆ5B²èYÚ@ÞÔÔNâ£M®(‹iH²rêÉDÒ!alÇE�¹ (qb¯XýÓek+4 ¾&x¾] ·«KÃ󓄷ㄨ¨ŠÓ?ãæ{ùæ)u”àæýM2(Ý-Ö£KèVÖOÿßÏçýšÇF`‹oÿߪZ8Ú^iÓaçŽÉ jPªx8«©�6À…9U¢,MeèEó#暢™Ã5 ÓM5ÑT-*ºßz�½h2ñ.pªÖ_»@RÐ�ËDÈV.ÞªŒÌ1M•ºäÄÄ¥ø²›óÜ�ˆ2�$ö¹ÅË3!±qCÔ ,XÖ§°£cÐÓ_öϲk]°Ãâb¨ì‰y«ù4$ŒbH!64|!‚$ j ÏSÿŠ¥œÿW]´€M „ 0@9èïÙ¥ysé^—žyð> µÖùŠg礄} _8—ïãY"÷+mÞ]8÷󰿦ØÿÝà!A?—¯òRW^Ûû¼Òÿ˜ßäi_�×G¨oêéß½ë~ºã]ÛÊïׯXýê²´Ü=3îLë¿<„”ç}B?,õ¤Ñm¿ÏLë¿ ÇoöîÛæÞ?{щöúŒ$côÇ.¯ëýÁüJ>áKß�£ƒ#åë‡ýÛÃÝïá CÅ;߾ݿF¢%ße|¶1Å-燈þL¿ô&pÛþÓñ�ïøãy”³÷Ç¥)L^þ.Á8Aޝ]§;£’T/™Óó[/¿÷ß_½üÇ yÿwí6ò†Í(—fû‡/ãÆÛé³×ߣx?MÞr®ÛûªJR¿û»‡Çäv�ÞÇ)_¬üó&ïx^'Üw‡õ¤þ/ýŽ7õº½tH�ÄkF5—ýì47ˆsqðcü‘�2Ž-|�ðÅ0m”!â÷ZÍ]>ËЬÿ\ý‡ßÞ]™�ÎÒýŸ,Åw?Tþ�v;wó~àÇß”|íÜÔ[Ï>ø Î3XgåÅàÂí>÷ga/gu…ª ´H%¤¼~sëèwž¾_"\[ãeíŒÏ…ñÚ�ß�ëýß}œ"ìãWr¢]·P©÷e*$Üvá¶ŠÚÈÖTagýW×Í�ßë3ý½8ùÒTJ9l­§o»Ô[?Ò‹\ßv³Ø$öþþÓGÒ™¬‡ÛÄ9�D?Þîþ?¬wØløj ¡Ä#æi11,(Â;sB)T½PÌ£ y3Æ¡Œ¨UPË܈Ë#ìrA@fÂqÓd|äæôÚ• ý“™pû¨cUºÖp¶Á²R” È…])H“²-&#JnXX!¢¬›L¦ë�å1Œh‡,]L± -h5rŸ¶¢ð]­ Îõ( …‚®S�–˜J‡ivC± cQ¸…ä�èª*®fíu¥eŸŒ¼Ä~ùÖëÅáÿ „y'IyM>5p‹lCãñ‚Äfä.A‘‘"�„Kˆ­XÛ’2>LB‚PkR'\83õ¿õZ�ý:ó9Xw¬Ï»ÐX´ªÈ;Ð¥lXˆ`îÊmZiH“ÈÐá{‰þ‚ÔØqoCv„‰˜Ùµ„ø± (¦Å-& Y„¡ã¼<Ò;{VØÛCŠLxâ:¢@›  p6H ¥ê(1H,µ%“@½Ë…!ë¨IL ªÉÙ‹J®HFÛXL)ÒU$5ÄÖ¯öÏ©.äÑKÉþõ¾¼¦1H‡éðÍŽ#Ýê­I0ÊÌsÁ3!ˆUžDÆŒŒHhÿÅ2fÌ3à-aKŠ…*FÝz‹ ìÅÄ’ã%½L œS®[¸ÅæÄ_ê´–îÌ~«Îê¿�FÛ:RŽ«j�D±`êä1ó5§'_çT½¾ÓÁ ?í+I´;#Ôš0�“¨Údœ!‚ò©©Æ90 ‚ !ýïùgê#YÅ{§ªZ_Í"Ö‰qüfi¶ê (ƒ€Þ»Rþ­ëæ%ŽÒ^¡ŸN_‚(ÃvžMÀïPýî™{†~¦²’ògH|û…;ƒó­oèßêhHhüp8&=Î|„]^Q×`_uGJ…¾A!…ùÏ×[Rdýw[[è·ÇuM÷óþüúø¸w·ç1ÿ-a wŸ¿ÌîÇô6³ñýıØcé|²÷¶y|Ã_'‰^¿ToK÷^«Xƒ¿ÞÉîÓwöóõéDgáÙûw>!åÚüñQùD‡<Ëç¿\q·É?ué­>°–ª÷·Ï¨öw¿‰‹hŸóX—cx÷oÎiÏo¤Þ§}¿�%r;ªvò³”|Ä@ƒŒŒiØÝ— ?îP™9³J ¹hôç„‚ŠùA1áÃçÁWðy£Ú¤“¼Y_ŒáüV~[õÈíÝ×k±Úe�Ë/€f5Ë¿§¯o�xÇŠz)ñãdæJKÙ®Ú9ËY—Çÿ3ë’n2?=gƒç%9ùó³ãä¼óádF¿Ùoó?«ï|]Ík:÷7³ÒÍý4A^½&Ÿœß€ñA¦xþ’°yGõ�~]o6iŸìG ©¯'1֎ϳŸÎt?wxÓª¿t~¤|~9ßÊÛ‡¼Óö¶pãÇ�¯l‡ÈñÎ…¼ ?z?‰ýî,§Þ¬6è[ŸÅ½L¨ ïŸo)w˜?Æ~vp�×ã‹òúñ߇ߕ¯‰V®r÷õ¶<Ý�èA8’ftl!�Eô1›iæ¡Â·Wc!g81нG3&?*½º§˜ìAkúG·ë³ê`D„/|ª�‰†‰i¡îe³0è�b//fÏæ'xú¯M3Qøsš`Ñ(€å/×L©et¶…"Pƃà”õjÚ‡4‰9‰|ú õˆ ³ˆ.L”¤ì˹tplÑB„‡€ik•*ªÁC 2H�wΙ‚3.??zJ�¨Dê ß ¬Á•-GàjÞ«(þmLaÔ¨êÏÅ+9•i!„R( { ¶w›ž*à‚¦©ªÅR†UÈ×ç½R…îÈØs!^œ[{š6ÓzØ K@> eï‰P67„�â ‚§N=Ènñ\¨¿˜ß´ñ~»e�¾ükå*îïý�×@ÝðþÔ[,ãö£–¼t61ý3Ëw(ã°@Æz£¡›}õ · $hìSî«{yŽOÓÆ]—]Ї5IGðëg>¥ÛíŒ.Ò•siøÅ¹<}Ù“¢=ýþÚoµÞù1»ºžñ&ưÆ£E}À—šG�?c÷ô`º1Ó~Ož†j?]ð}1ë=î;pfýzG|í몵:gç”g§ü7—^°=ŸÖFˆê)Æ0-QM¼ ¨g‡(nxVUÖý› îˆoîá�µÆ?!P;7àïŒÅø¯Ëfæ+¢ŽŸ~¹@ÝPõÒiÍsBt–˜[w»ÿW5ǜƽsÈaÙHx1ØQ ÆY0ÇzìDQàÃC’ô&Œ›³™F¨A|¶›lp�'U(UONPYEk™oê¾P#Ü@ÍÇAĪÃ3[Þ»¦Ñ;œ�tÓÀdîƒllmÕF2€&VF�R"ýsê¤sø’³ÿ4�šI_D˜æðcyí±³³‡šP;XEèØT¹Šf[޾ʪò”Yಠ!�ö[$«~-#HtpÓ £b¸-šCjíVÏqo"aÁq3ŠkàÁ>]×OV›*¤Ãœ(p UVé�JÄ>saiZ*ß飖L@®YÊ ÌDá‚9’›%Mڪƚ‚ÊLVì$RG)rà @’6÷k¬K¤LŽ0¢kJR´bÖiJY3mý[ˆÿ…à\=ËöljžTñ$>�ð²jñq€Ø(Ì•Ä §GTb .üOÀƒ$°ÒBÈùÿƒbD¶ßýÐ/¨3lß;‰J›—£Ãרr’,sF¸ßóì}}->˜01ª}uÊ4!ñX¦ÒI|l)4RL€e,eÊ_o²$¨iƒEE¸Ò(Ï  ò�zÃdþäñý•çïÿ<eädé³§j ¸ˆCÄÍe�ÛCÄqÐÆØÖ¶9Ä– ˆ­ó4Á*1DGRw7ö~�SÙ-†?aÓ †ÀÖ^ƒ'À�‰µ×‘qÉõv–l =ÄÛ3ƒ® svN¼­ÜpµÂg mÜ$Ò¶n[…ñöiª‡ «õ« Ý�Sñ‹×�poB¬­¢©xëR!~»ùŽ·0gäSçCí>¾ÁqÜ ùþûà‡Þô¶¨ò¿ßkÄNìîÌÝ;« Á^[ú¾]œç‰bO¡ú=|xÏ¿õ=øešÚºžÓ¦»Ÿ:“¢è ò§Ù�æŽßÜhÏ�óúÝ[M”3E#´óÝ¿/íYrȤG™{âì”¶,x­«=Ý¥_/»â%&½ƒÅ]F{ï0{r™/A8`ûŽü~;ÔB?f?qÕºíŸaaÌ�4ÉÓ²9­2¨;·QOWÿSÒƒºÕGdh5·˜!2pqL‚ô¤(ê¸A Ð^].<1ô�ùЏ�GµØ>™WI[õh—cC)4Må/®èþ.áƒÃ=Kšç~k=ÕE<úàW­¿ŸÝÓ¯n»¬‰¿œÛX"Ü?“èp5I“‹ìÀúj}I‹ë?MÍIµ”ÂEô0ȃò•¹õï5êÇúçÔ5ÿE>âßQaGÙËàÈÑMü>�_ÍEß.È”=»Yð-fD‹éæb_Bì{øqcŠgnõJSÛÏMž>»P•Q”×Qûƒ_×z“Í“W›¦ÞeöÉ’·]?·g„Í÷�P³zxm8$wW·�þ/ÔÒÂ=pÎmåю³š�ðms„ýòá¿0-\ aã­ÏŽ›÷�‡1E8ãï·È75XÃö¾Ùh½t|Ó{qÿ< I ¡Þb9‹ÑªGÓ™™ˆ¬GŽ'õ$Ò•–¯&E仨SIîY(ž›‚¡V³’ põë9û>™›`Æ`‡H„Û§¦m³Q¸Tm…3ˆ �“xH˦ µ¼@�2ÁQ ¢æÊô+é_û6ŒÀܵjÒ¡ÿUd‘oNmB‘i"Xl#t¨¨±H4Þ`WA*•øþÿØ—,îHo²!¶¢lcDÄy¨Ú³õ¤›,Òe�ZUöŠa.²Ûšç±}š$ ¤Ûjò7‘ˆ�`pewÏÞåpêý(„Ðî_Q-Ú,Ÿ¸‹Á‰Uk´�KØ�¿vé6ªxáÑši´[�·TcÈy¸J%%p:;ç@åì¯Ìôöü»ÚˆrÊ\ó”öøÑaQôß²L.ÐU¡(”ˆ�@^u!åú­]?ٖϳ«£ÓVtjÏvPܶêá#D Gƒp�~ýþwÅ=MõÕÏ%ÅA-`«ž_Œ d ø(†7[¶�».X*í¨¤(0.ÂBE)V”¹}¿o·]¦TX„¬Þÿ©Š@ÜÌ%FPš·ÉãÄÛ�£Ùré,�%Õ‚6±dIìHëG›UM¦#��|-ädŒ�Jj(ASßrôØ(Vsè}†@H@"FH«´²w;ó\@¹¤L "B“·°;Ì ÁÅíÃW‚k\±9“—Ò`ö Óœ£ýóÃ}…>wÿ|ÿ^_{gåÙnoáÖ_«c’!Ùú»yê3Š;é�`99³€X¼‰Ô{ƒã¾éãê0wo»²}í‹6쾘#0>̬½»/Y=õî¥a/¾'3÷Ïgî\3‡V?œÎÙ•~�㉰t4ØŠ‡�`DZ(>�]žov�ñî¼Î¿ÛLE³ºâI¾ëŸ@â.´~w僶^¿«Ø~(�_o7 @D?°¬>ôÛ;áÅ„½(ë$¼$ @¹Xo¢�\2!w^bRcD™­ÂåÃ.ÒåœT+ òíXÎûI%êz¹5ui¹ †8 ã%„ÕÛW Q›�¹VQ °Ní7JEÆó áBcâf(F\IÅ](ÓÇj„—D“Ò¨Jf ɬ¡‡vkv’†8„¸ª3L€jpeá÷/Ât/A³ÅHa�\È<ô0"Ê”Ëß’(;D—l% ˆ_ÈzµËT”ý<Ô—¤ƒuü³;DL3¼J?áV`-¨¤ßü¢\áÛJŸ‹~³BØÓì+É4A®ñþ;¨ÄÔ˜_Æ@•RÐ(·=¼V±7vî_ßÞg6Vç21�s4\!‘ ÒFXl.1[†�Î�†gvͶkD F.h½ò²à˜ž IZÁ>û±zîMfôrê^€�ƒy˜W€bZe) 6ì|ÁCr †>JÈ¡|à\î›\�ÃFES…ÐòÓ›-ÏÆ"aBÙ™ˆÎLu]©k~»Åháþ©Ï% ]æŽTÌè¦ç¤ÒaV*™dpÓ\w2Z•:Ûùþ¦Ëšçûu¬Þ¶³¥$ñãñ;zÞîo oáòySÒ`  ¥å3¹ ëÚ4c°ÇSÔÆ� ‚§-[uÃZÜ2—Ü¡Aá<Ò#I€vÆ’Ö¡Ôu�@,˜÷êkõ5àžâä¿~‹"¤(E�ç�ôMÉo�Èg¸zéþ˜ë _„÷´z=0’Å¥ê&æ¨bœ~}†#ÓLgìãùѧà ǣ8Ó/L/G'ÈX~¾_¿œS^Z%,¶Ýr%*ùîTîô”ªˆ9áÆžNôïóZïŽá/‰p¯ÿ_Óæ?páG?5j¾ý¨äõ7õÚ\Ÿè?ã{÷ºòßpá‘h´|~ÑØiñ¡õ™Á&bž©â¢�ýÙÞŠ’\që×T^D¿Óó.-Lž`>ç¼2ùZ®�êÍ%½xü !(É7e“�ꜵôÂR7sÍNÓöö{îéBFnÚ¤†fùoúóxîÞïþjUŸ>¥ný¸ãƒÆÞ-Ùœvv*482�?V¯�”VúÁý5¼T@+ÀmŠÉt\DdÄ{Å5¹wïYttD úË»&ÎÜç|;‰ê4¦÷+¾°yenï~f÷é‰ùþpfñGÓ“•ó‹?Lù>D°Ô´1ê¯æ?l|î#>¸CïçÇiˆ‰ñØ-²p1D|ÛÉ­,){NƒÕb²Š}"ópLhïžéë¬>D°®V¾hƒùîÒ£˜Žyï¨ØY/êÖYÉü3Ã¥a¸eü{çñÍ}eäý·å¹þç¦K¿%c-ãØxó¯"Iâ°’wO|`+Í—Ñý2@ø˜íÍgòʾµèÜíµuþ‡æ~ÝXt#ô¾÷uØîélGs†¼;§|”=4FU™Á)·Fã©û\¼j7ìÜñ½Až qGûÎÂrüñÔ^t'7àVÄ\ÜÍC¹sA�‡G«dÇõG \ÍT)¦¨�‰!* $`Í$é"€8Œ7YÚ‡÷´W’KЙˆÝåó^†Û.ÔḺ¼ ¢‚‰Ðc-,ì(:¼8C•÷<¡llƒ!u“Y€Þ¦—+‡<';µ3ÇnÛûÞîÊ¢�B’nˆH¨´ �Z‚lÂ¥#P’)CÑÌWzIÄWWzÍìdƒCî¼P {IÅ­U‡G³ow–Ýó�-°&••QÓÖ¸£³]&ë¶ånµ£%N[³€MÒ÷§RâW£þ~ëÖÄŽÅ^&o3GÓ"bxV�÷�¥Ê 4]"�pÛyodLŽªlÈÝêgü‰­YX¥ÊÔ­IR—Õ¢›ˆ·ñÊH¥òÉ·+/–Õ‚§T%q¾dsÿc�y[VošU3RLÁKÿ9­{_˜ƒÚ<9m6ÞCl²Y0ÐR%�è3•÷Ω¯N¿z|]¸¬<2#´Y K&ÙA††Ò?t@`n²h0f;’ˆÏý*jK^ØÅÏúŒLü´®WÒàÁjP/EÁÄò‡¤�[Xûûé}=ï &ñA”¥ë¾­7"òàtE´ˆmózòw¢AJšMð##0€~”Q/Ø«@-Œhf"v P»X/Lí$„!xÀ:–RË® é-xÕȇ²†H $5%S H‘ Q – @:aêšû Ô‰€’-àã; ذ;ÃXm¬〪S!V¤¢�Âø%-eMZ©O´÷ͽ´·,=O=œô�Ýv«#Ϥ㔇ÓŸ�x÷¦³¯Ý¯ïýçºò Eš¨>?kê›�gç¿çÕê| ón$¿1Ư >Q«[Õ!ïóR“›ÚÖ¤¦·VvŸô]ô]uR]óé¿¿‘€­*_SiŒËÌüßĪõÇï»òß–‘ 6‘ªqt§×ŸÏ·wvÇ•Ö~«‰¶ž¼ñãÂûìÛjï‚RòõÂx……}:¯_´Y‰Ò®×Ü©[ã¡NY×.n^šÐîÝÿ¥“?_¡Mþæë8éOÁÐcðƒñÌ5”»ÿ6tAOI1,oÏ·¹zwMŸõ§øß{gˆ-N:eg^:€Ðî0Ê>ù¯ŸŒ;u ^+–?Ï7Ûò‚m+ìnê×å¾Ùôð/ôurÌði«*ïul;Cγþ¤kqØñ¯ßŽiïãî ·~uŽd·Üõ騞û‹c>�—à~UW錦4!»K?m™±”œ}ºëÈhã™I½y�™ìÃÙGW}ñvi|ÖŽ)yñfÏo…f½‡^bÞݼ+„À`û÷>e«úÄâ{î 7;iö„Gl+ïçÍ:ê�§×@ZL­ÁŸuû ÅdéUåãPf1–-©y¾îÏ,±Âí¡÷”ªU LuÎ/£µË�©æ”€l`Pêè;µ58�e÷>²¢S¯„kãÖSÃøp 5™½ŽàÄmᣯ7€I|ßɶÔ :s�ù^)dŸöì!ßÇíÊÄßQ@u§ˆáö¦œs;ÊNã÷çOîrëÁŠÅp!y:rǯnöÔöáU¿Q½g�ÙŒm¤µIü›Zý«±Šû_ϨÔk÷„Îyýn¿y÷æ›ïêÚÔ�IÃïÏÚÂ#€•—›oõ ÈüÌVÍÊ_FâÐÛÿŠƒìÑ&¿ä݈•¡#j²l$ˆ÷�Û @]Fo?íMyoÂ{Wž.M±­;˜3Vʽh¥�B;á8ЮèÔ2Zºc$G[,¸àÚª©~µÂÉqføˆ{>isixeG6p0®ñ6Œ8¤ 4íË R›MŒÛ…�·Rߟ÷?K«÷Ý'|ðQ»Ò°§¨’�X±)X-Ð)B.ŽÆ66?ç¸-+ošL5š<7�ÒR0lŒÌÇÞë’)û›…¼r2Ú ”ÿlrtÍ$Å�K@èè:™¬h@vi!&IJ6ÆÊ"ä¤×šýªSõÿ&ŽîÓoî�ÓrjŠLƒüÅÙA¯Db7ei’Tü]”!�¢ô RP¿(J‰0{~mýyLÚ?:’®#úÆ&ößWÀ8ZYA5Õ䤄‹¡ ±©Õ"M>F»¦Û8 ˜nVj¬KMØR·ò)@£X¬"Í8 l‹0û»‰¶d ©›¬ñ©4+Û^ü`Iõ`ÝÏ@é2ˆ…€GÖ6T3çÇŸtíRä¨pP *\õRn×ÓŸ>†þšíË3}à1�ã#Ô}ê‘þùE÷£|&×vÐMÊ£ŒöîcOr&xì´k?�{ýKØI*ïÚ@6e‹~ßê•ìRõhêŽgg±¾ee­ÅÌCÔ}Á§ª@mz®Ó¶ªöCÅÿ -øýƒ|r߯�Ïzõ«3ã]ÉÉ,´í/ëœ9É Ðç>ý5|åÞ#ÛT‡‘_.0­&ý O}º:ùhñ$(·—…öÿ§»�ŸYö~±lñi÷¼p17›ü½�qá°ýåýV½œžqXr_žüoËíÁÊL±°íó¤ïç^ëVŒî›£O—%…Lõì7²Í…ÕD’êaÝ5­»›Ù¡š�Ë´ ó·¡ü1ÀÅàde®0<ã5LQ‹åk_¯z7·�Sð*~‰2ÿ¦L†;Øf&æàÚ­Yô�{k˜kD¢ð­ï‰H½³´;Öý¯¹+/ã¯çû†öóóá�§ÙùƒG´äw§á›÷ۀ߿©C>(õ‹fƒ&?dƒ¼?TL->×I݃šJÌÈÓwÖíX­ÃÍRþO\¬c|�l»u+‰POîÑòñýcÍf<-~¾{y^gEŽ<‰ðžÃv½‡3œâÄ­„™9y¼Mú;�¤›$[˜VQùÈ«¾2$£™Ã¿ w—duL÷c˜mÌÖ¥Ç˯¹æž&vó™Â~3cïXð‘lA†ùû×­ü�Øû_ÍÑ…ç¼§äàÃgGìς׉xŒw`ïÛ\}yÑ%6ïê·|2Ðîæ#å¨%“Ú�µ‘1aÚ„ªP³•HÊ`ÖZ°•N£gñUyü\wƒÒz›Øµe¯SY5X¢¡{¹1´I?S‘™ªÈž:xtúQø;‚ÌÎ&LRqŠ•¦ÛлU j ‘ ±$0y ;/).Xƒ„²5Î6J_R°Ò·«SŠªZ3HGðåÎý&ÕUqX:¾À¹Ø2nÅ\l›J¼d ÓÍ£ïšÚŠ›™ÅPfFÖ“ F2Ú'“U?h"›Àå#x-ÅpÖu3«œ­ÏM0Âe­06 m T\=˜Ãa8AÚ„H ™d!Y€Î™»–>O?v:gÛE^#ûde ¢ƒ‹nGZ¸ccH º’*Xî¦ùˆîΦ«ýÌ(˜yƒÔѺ`{Bm%ˆýw¯ž)‰?o2æù“£]5 ÷jŒ¬$K±b®óÛvвâ›àìÔÖ.M ¶ßÞösHƒþ2hËm4«?¸…¦17"aDަe ¶`l½¬:†2]ˆÙ7·l†jzï£î≨ïÏjl6Ûr€òãH¡›ô¢@ 0v-þ¹I3Q(¨\T]‚Ä`Ið ñ�˜jÈUL³oŸArTL¢ƒ—ANh* sDTãT@€ ‚§  ‚§PQ ¢ªý!ÿ€UW×ϳÅ¥ô<õßÌXÖC˜²Sœ• bµhÄqÎ}+K:™p¤ô@®ê¢å“ůEDÿÎ#ÿ�Þí.MsÆÓ­NÛZÝÞ† Ò÷“¯ý A‡{ÿÂ!Cœ"ª«µË*ØÖ¾€À{ÿZ¨.B“íôËxÃ""ˆÉR<ê©êv£57òáoófêx™'Æ1ú�¤äÑÔ^µ ²ËÓÀl5ançE¿Fëu¢H4…¬»¡*ˆ"ªyÅ?ö|Ÿ0ú¨‰* Å2¹Íà 9i0DBh¿H¿9¼^@[Ïßà b…é½�ƒå¢�—â/ƒˆÛ ©ãþJ•1©wÌ@¿ —÷˜—{ÍE»`P�cFî.T�½3ûTB Þã|Cë÷+dKÞ–`ë¸Z²hùꌉ⽦Q+`� 2K€.ƒk×£],û¢ è»õ h0Yc“ŸýãÝ¢-S˜_m1AÏ 2X] ¾~§ D—º+ó¾ho¨T¥ŽÕ~#ã•{6VÔ·)K6„#i j!gmãß®‚ºîשgˆؕ˜Æ6uœE¨ª.Mª)>ÖÅôm’tµèZ–cl¹Ü§R �:ÏâÛŸE} %D@‹Âuv:qrBÄ]ƒ°´­œ¢ß Ûêµ…cVÑv·rîe6ÅœÙð~ÄEúåÐwëœ*/>ŒØñûk(?�E¹û¶Õèo LJÎŽñJ†ÚP´Ÿh2ØžˆTëøhï7=H,t'ˆÈyù0‰�’¥„hÊC²w‚®È™$�ÚžŸÖ²96¿-jÛ ÙFF ­’èÃ鳺֬. g8Êð‹æv¢ ц›ñÅrÂC'^¢óÇDŠ’`‰à70kDœÑ᢮¾÷Ãj ow7oÂ7¬ûs÷¹û8d¦AÖi?´†n4Vá ~Á�}¬trÅó/å>¬�8¾PÍþ%õ6ô ú5DÚ/¾ˆ’ažŸ.ì4¯¯ß›†¹Á2 ÷†}p…¾ˆ�†ï{„Øaç}›N,Éi6…O­«+Í:Ë o)sasƒ2%¸�zã7B†|¶júq‹/ҵΠDðrº\u£Æ–o6½5 °5Š�b"Zs&�.ž‹zùOŒXÀQ†ÞˆAà›C mÉáΩLä¿uÅQO7¬­ šbY\­˜HRS•”c ô#àøkrÊÝó^Ú[_Û{*™#¾ƒÁ߸áç:|=¶ž¸�x‘ €jѽ�&5“ú``Y“fŠ2 ¬Ë¦4Œ¼b“ÙðÔ{ôÛpXØúçDxù-D>Üë8{x¯Ü[Q׈3!â=uß0‰I¯žÎÍ@¾D¥¡9$vtê3J:Fj›ÄÓÑ„Câ282öØÖÔC”Û�`ŠŠë�Nx{8 ÀɇÇ�[�·§ÐdÓ¿†lH‰~nâÛc°sõ†2—¾Bvð¢H];ÎyB\xfézáõ5Î ²åïÑà i³¸Ã-…Ï~ÚÀ¾¦m@¹�]ü �‹‰,ÃŒä"].>ćÍöV¾G_$r²º?›Vkf1?/ÏÜûŒ/xU2ÄÃÐæ F(u=Vó¤©WÄ�`d("¤è¥ÖFWºDŽ’vˆs�bvµµe_�4t�5Ã+�lMˆ°0†[Í.“ò|…Rqm¼–`®J‡ºa�t¢qQ‡3Þùç›ïRjQ‰=ö2§ƒzr‡pOð)’ %hÓy-%1c³èÀ°Õñ¸/Ç®&`¨jµuæ¬Áù8úíKÝÀÀsļÁ%·~­\÷ë�ƒøâ›_ãÖÜrÊ9aÛmQZ @ ¬ yTï´ãµ½@ÿƒýRî20a *Ô°¸†–®ËdÜ·Ó£s7Õ‰s1¶yeÔš¨á ß%ƒ­^ ¶7,ŠÀPFE“þ-‚ÊÓÕÃXР¨”¬E°¦@ì5ÙÛk3 ºC$öLjyÎÙU!ei9´0f t¯a¦+ú‚u¦ˆÂ:¹Ñ3šòâáŒÛ�Ûç¢zê«X>–RÓð-Á’¡™1Ïzç¾üºXCÔ]ñL%Àâù#8~ž;Mq+�ôzϬ[]æì ­Ü¢ÖôC .ËÆð¥­§1Í£™¬ÇælHÌÀ¥&Ù($Î ¶†šP0ÿ˜Ç $�…¬>WäeÈd”…Èv7¶²äQåDh¯ƒo9_×Ïþ0ÏÓy<“›OÁMµhnk Œ›jõó¼çY]L7¯3-•r‹Ú’'½K‰B6bj–܆ªúA¦|”λ°4AJÈC¨dø@2²¿'ç½»Éü!/tu‘N9¿´q=‚?ÄŠ2C%mñ$Ã9µðÏÞ…BΓ üS\_>òÑÖÓ:ê¢÷Û$ƃ�îv©_I1x|%ô&´Ò% «,c pÑ5ç©#;èÓò—îÞ÷-Ò£Dêñ©ˆDžRÒ…¾h¯4k¶üû…`C¶äµRÞ ˜&�=Ì ÐÆ­{`¾›Üv¢:^+à×ê 4 ivB]÷„ ^ “öÃtu¾ÓSÖvÔrDTU_@þ·QGäãmØÏ[Ñ{` ‰ÜïÛÚzUtÙ]Mi÷ÚkÓØ¾ù´Ä@ÈOùù¥ó4?õ“6Gˆ>ÿ?ßQ$•ãÿ± †�ÿM‡ûö¢Nq Ðçÿ~weðð)Øè>0YŒðó{]ZG¨á9Û�I’>ê`}t@l© ì÷ #|%oÖ²Éf¦)À‚Ê>ŠäÊ"@¹U‚4BÄ¢B/{ p$ST8fEô<©…%@�–3uîücIb0Í)úQUsä|VýÅwøãÚ§é»i¹„mTA´’`6¨N:JO�¾z¤00J– ôfòe1ž><|Êÿ™› ‹]¿¯±^QAPäLaòá8�ñ©ýD£…þGËøe É9­oAåÿZ­7ß•ÈË÷¾¤í$�}¹úùQ$6iæzý«®½|y2ÃQÔ‚9Äü°´õVø¹ &aÿù°Á?½äºi#ÇÓókÛŠÓSsÍ+ÿ¶Ÿ”`97ÑØYÚoÕ KúŽ ;X\‹SñûÇÎ)?ó8¸ètoÇj땽«²�sO-9Í}óI_ =oôÆøïÜúc¥dÙ�³á¥nÌîÄom½MÉÁªp³1Ñ“EªÃ ©5ÕîJ5®s«3Œa)6.´Ø(‚¹_ü1“¿uÏ)“øÅ °gúþò¶¶>¿¹p~Wï÷§àýGɬŸÄ÷°ù@—ì0å묶q}ï?8u·ŒW>ø¾WüãâLÚÝ>Ÿê«+#“þ˜‡TßüþéM¿ÐÿoKIo"³SíûŸ!¬íP룈&o0Õòw›Ü É( ŒÔl¹{fwûÛÆ³¶º¢‡†¨3�º�WuØJ=wéxÆëÞrØ`VƉ;:§rq!¬p•²”³&äD—qÐØc�ÑÓN°,]¸�Úžì–Ñ�Ë€TÕjà¸(Lf®ž�Sß[€æ ÃmáFqm´°â㇞è X}ù[¸/×Õ•hþqüÔEúÕ¨:=æµc¶ªÃ s –Ì×'†%€†6Ì}R§c(¡2ba˜74ÉŽ4Üœž.qÒHÊfbðHíUçdHI$¶¥«ìEcÞxómÅÀýc?©å{}oש†u÷(Å£.‹n‹Åº^{ðf6ÏÆ/)ó{\ߺC¢+äÚ &{ƒ‡m`¥Ì…~x`jõ‡„Y›Q9�ïûëÝÏÊ;µôSa²óke=鞈âiW`í³­¦h(-¸5m µ‹_ÈDqt¾°·©CUþ¸¾†Æÿ&Æj~J³Ž#FN0´4Àæ�0ðÅ8à]™R«8��ˆiþŽ�œnÈ&æv�Ûö"à\\“é7Õ¨²ÛÃE‚-áúÒšÚ«XÎ)Û18�Z5¥k˜¸aðe–Òg8ï6·À›]úתikÇ™Üî.aÛÆ á'³Ñ—öiÚ0 # 0<+OSÕrÃeN §Â,“n ûþfÎiΩ‹×† Û|.8¢ R()¶¹ÔÒ29Û_+—ð$ 2ËîÌ·Àº Ív$1b‹ôÎmD;`Jã´ßõ$~+�k8<—¸qí-†u0‚Ed¥UÃb:™-_;Í�íÿÌùþ¥tÊ3NBòXArö·2|ÛTÂƘ`1Ç)Ü&ru˜]èÛú^p{f€Î„FJ¤è¥–"ÁÛð 7Å ð ’Á1±~Ru˜BÖ±b|èfFoY[5ÆÂf| ˜¡‡‰+ÎWŠ‘„‚³Fjש\ˇnje¯N˜êNÌÄÔ¹h_°?!Ûûòt§‘õãV‡Èæh r�óXgü5Õño„Âvš=6r“òúÌNÉa-» ‘ëgWŒ’©qœÙÁ§ãsàÆæäv’;ßJ³eå  õ‘N¸Éj”Gb(X×p>nœË’ê-KiõzõwΤؾ*9®Û¬!m€€Ø¯©íºî¾`;k•Û6Ø!‚;Úù]#ef®Æ³#Ñ0›Š%Ʋ6'ïS-y×HÃ&0ɺð¯.ÂâÉ Dâ£[fmiMîåô”�³'BL€‚6‚£-ßÖC&Ö»ÆsÐQ46&ÓS=¤þ±•�d±K8g+)ŸœD‘+hÆ\ò:[ãQ8Ö ÿ>²uwØ*CæÚ^hGî`È6Ï…r{ÐH a8å47ÂS“›È<ÔÊoä‚pBì®ñš 'aµ“¸�£9¬`‰™¯ðí¾‰#åÜj޶— ˆë¸xS$gGÀÞêôhHáÐ�§€ÖÌ/ê$öÆ_EåÀDDˆˆœU¼8Uen›jy¹tî×W]0sŸWô5=°Ÿ˜T›‹ãÅv§bc"i41ZN•g6-<©ÿã̽gîˆd>¢xô<}¶Ï´‘X)?ÁbøÿsîZ‘Ÿ×ý™)R 4|çüÿ¼þJrUUî+þþªŠºŒÓ´ŽÏýÒëorC¾´‹Þ†‚ €"ì>g�â@|ÿŸµZ*Û’©µÊáÜp$„˜¿õóþ<›Úû.µµ�¤ƒ,Soߟ‡U @$ìô/&¨•xÊQÒRyA˜ÆÁˆéºcÀXx×ãj—Ím|È[ñмS$=šþcÆþS|íQ‰4cÕxRÊ,°V;ïªO9=l²;þ󷢺ˆ‡a…â+IÛ Ö¤&ø‚Qj7´@ûÚJø¦‡þŽï$f µFð»!ó}™kð' LïÈ0�`��Ïë4k†"Ÿ(€vÖ0b‰qœ�ŽôÐ@Fu¥0G“ðýd[úµøŠêÜÇfû1�ˆìÙfÝOˆ5»’3.ê¼°¤b³ÚÑr«xçåüû+87ò#«‹ÒÅÉžS¯€ºƒßï3.nPLÛ ß5ðHü‰W&ÒÊùf+{ÅìïX\Ú�SÐ2»î[yôÔqîÀ|û°Ë/༚î[Lã±fQF±tÖfi3ÉåìM½�›¥c76gÞ¯Ö 1€ÌRgØÂôí‹ ¿ÛŸcŸ€òR}ÌßW× ŠÊÛçòž&ÀylD?m¼Ë`u7m[¶(í/²ˆj}œ½âg³‘ì )4²�Ä]¸Ì%tˆ4F˜½�›æEßíi e-Lc�§jÑRLwêª Bîž¾œ°Y¦ÌoGò>(Ø‹èiGÑPmšYúxc€q@‚J”x©io@ªÍ2X›D3ž°Aó{`„7ûûá—ëãÜÕv«=•Íâ6¸E]Ò°öîÖÜ¡Hï±$„’J˜¶}[¿ùÍ0“ëjœmm+­o�Ÿëõ¶Q“ÚØc ‘n"©1p¹Ò I w¤¹FŒTBš€Rxora¶¡ðà ô öy3`¤ c ñ£"ºleCÒ!k|±r§D�;àZPÕ«­*¡M#’5_×¼�‡Å¬1\Ö¬öà^âì1zm8sZ¦K–`¥÷C©‘?‚†�IrÒ¨ã™Ò\ÍÌ=Á÷Ç -ˆBTxâÞõý¼Ïöó°wÍÈ¢Œ ÿK”$Øt`ƒO±ùÛ�e˜ñ�ÌßqöÞ?Tpü-·R.\S 2`̶ëŠÓ2Ô&cf¢9IïFÈÌ8™¬Š�÷ ¨õ¸éWí%½ªÛ²=­‹@™2ž~b¿®- d ¿I´8T°!psô0m`C‰´ …ÔË.¹}c&@"ñö�Ø™ëŸ�g;qŸXóÞ‚;êê� ^m�øߘɫ7/ìuu­Û~!{T…YÐ¥»eÆ—ä2ƒVLçí¤ñ1í«*dúyÑQ‚¼q_§Ç� Ë©cùƒ�uÄiýpleXdÙ\¡MŸµmx¸ø 5'´;Æ·ÿéºÏܦÞ÷ø3Lþ‡;®z-‡÷£ÿìu}üÀ§ù1hÉO)aï—;ùª$Ö‡Ù¼Ô¢ñw]íš®/R¢ý÷’?×Ãî4A\Ñ“øC~áÿˆL‚áp†vyöêö§Öþ}é‹—"{t¢JiÄQâj m JC„¸;~¸ú¤¾/Ç0e�PL@goÕžK4ášæ% Ñ1C[Ë’¥p¼Öw–Ÿ°ÚÆT4“G ÏýsŽ�;ŒAYÅ‹«H.%ßãd›Î”Έ`AæÖ:ÚŸ‰Y>€Ä”ôjçÁ�ÇžøâH0wAð¼i5»ùU¡M;Â2¾åÿcõ€;[ÝÙûu\9¸êmZx~!òTú cìrœXsг�Ûp½#ÞÝu¹Æu»3nŸ;Ì $$’^×ßeÕÜzÀ2r¾"Î-®)(�¥MÐØÛCÉXDà ÉÍ! Ù›/x5Û¤øh5°:ù)¥•m‚#[ó*"qøc×°¯NypÓ”µ‡í™p€¯ã’²òçJqQy6µ#Nƒç¹¡I_ä%³Ã“Júø8Ö{ìÀdØoÓþ.Æ­ïäw¬;Û> 볋´‚·-TÜøX Vó‘kÊ O‰Q¸ˆ=�@ˆY‡}ü_Ú\æ712dD‚ÉòÔƒ}©âãkÚ–e‡4i²̤7Á…Q‰ç¤p›aKæ3� à2�åòÊQNÿ�³þÛ(ØûÌŸæú¿gBs@óÆ18†dâ >µ°ÑÈ„æ8€‰&›u¹‹2ú¥iH—ëzÿÚkßgëã‹çât3D>«Ý”ëù]Œ,æ*&¶6Deq1Ì7uA­ZZä?8ä�¹�‰+ont/YÑP†ÌÒ d.ã5ÃiZ ¾Hr`Éípkø&;‡«HäaÜ"7 -Çé\ëÚ·ynѰíí‚û"ç|"´Ñ-¸ÄÃy¤?‚G&øl»™Œî> •'ø ³k)Cwìc4JlÛ'ÞHÛßw® Ñö3Í»>^�"ÆÐ&?=ð!�búV´¨›ëXÞzƒSåÙ�é[]“jqôØÍ=8ØÄ@kÛªLBx,ëšÀôgìQxÒ¨�åΕºB~Çä{9ÕÜi ýøVZF(jðA•î¶±‚+"$øCß>üM§ÓoëwKçb~aÏ:æv~vxç�åÜÎòY�Š�t6ÎÙ¯ 8 kè‡È[É̽·æ¿�/aÙ;혀¶*oz‰�ž6ç²OL–Öð<Ä÷ç¹6É\2êÑVº%Á°Ñó.¼ÍëV‘ëZ¦•:¬í NbPt¢žà'ÛX�WsÍÆ®†•v�êÉÝàZLX“ëÇ„¶'?KX=Â\±ÎH‹‘�Göû}°‹ßLÂ\í©;I �¨v'ÕÜ‹h @ài±ä¹èŒ‚��Ï\M»>¨‹ÏZyÉÍEdÂl+)Ù`8´ùXrŒkÌ^t‘µçgE±zä¹"páØQvæ0YñØ)m‡t/ÿ ;•ŸóÞ#ÑõÚé bö¡�z¯8³+Ç}ízÙ1Ь^?³FèÍsç”åž‹dãÕHalÅ© û( Ða�ÛÌlRÄG†enð䃖aÃ#ÈTô÷Ï|Ø >Þv//ÜTÛyùÌú§›RR aOQA¥»T¬dVé'ñÝOD!~œÔbå2©[ `eáeîssïîëß®§glÞ$W7¶Ñ5Ò½/5�(Â̚醆U¯†·z}87ã½Rxâèú�Èf>ù¾£wmÖóœ::Ö*ä+Ëo èßã½ó{N= È CŠ´§ª-O#9 äÆXc›zè"wÚFô—®h8ßøÆTgúøÈá›oFT<Ÿ=F¸…³u¤›ŠÒ{z²kj3ÅôÄÓ@j0àL~E¨O±`ä$¹ö.$Ø—ãIŽ„vR÷ï6þß"‹­¡�Îσ9Ç ë§:ÅP8Nöæ‹ÞbªÞ[ Ô’•:{üÖéxž1Q ê½›¯’œ°m‰“r=ÿ²ÿgˆg¸åKЧ%£6´F”×F·5ûhÄ ãþ×ö2Ûlªã%½ÆcXL"ã­ÜçØÜTR“Pla˜)5剂©Ô£bÄ¥‡¥‡ 3·¼ÓdVóŒÉÁ‘&šÅD˜W]ºµÊ5tK�pñ'ÿ¢ δ5‚D>D&§_§$ç0RvñIgÁrŒ¼Ç{¥*ΆïW"Ââ(ü’…¾LVP²†¸RŠ=O ÑX†®sƒbxÂ#R—¹VMËmä_h‘2™Ç9‚âe˜Œ…Þü¾ä2&SS„¹¶’q •¹ðÔø©$¼©¿ÜÖVpó  ä&yG?¢5$@åžKë½5\!ٕ™¯Åb!s9ôgZß=Ý«X¼¼>º+ÙŽ/,]^ß~gº†,Çè{žÑ.F£ÅÅñ×™Y-6%�L©¤Úzbä”c?cq¤ Lr¾S¬\8>qxUö)\³{¦ o&€´}Ù‡w’ 71ˆûrxE2h×2£|É}Cô—±ç£/çÈÿ¡†o]ufŽ­j%3ñá£x[Ò‹Ò‡|7T3çͲ—v™´7Ýö­lÝÜáFRï€xMº$62~}Â^®úM-åx”x\]î—¹’�ú犧bÃ�Ò™ÛTõKÅI4ã+j’5'¨lÔ�^8¨¨Í"÷9"kä‡ÿ{òrËø©çð‡–ïÞ§¿ƒ ó¿3„„9J‘àYd� i#ªjí÷Á×UãäèoOT÷÷­ð:JëýcéN„Ô+åëˆw˜Ä;B±OÞØ1¯­úµ‹˜<~|¿ÐGŽiX°A„À&�ƾ{6€åƒx(_ýÙ¸ßû&»5Ú”ÎÀíiÂõR*îz,Æ^åk£º‹~>œ·F'Š˜nå�¯û´ë7碴3¼cšºÆÌO K�åLæË½ÜNÜh™õi™îŽ2þ,bÀvqW·Ã$ÙÇ“»Ý»ší÷r`§AH3žˆ$‘jdì¥YÉ `®£¦À®r5�–j/QŒ`‰�†vÉ ¡ˆ¼$äm#†�­�ä“-#™<‚æÞ“¡{˜}¾º´Ãê„X†ö~é¡ÒM·Ùöu�ž§‡¨/|6*ݰcÏ”UÀë‹g|Ë�V)ÖtÐn[AÅÒ­ñëcÎ1ZùuÅ×rà�*öi!¤»ýxY«zîÅ”Ù{Ãræ�õØŒ?òF\/C2½8�¸–H%K—XJ¶•CWc¹ ž& üœýqôh lá С<ÄI,u�zKO7—¬'ØÛügƒõµp;qG¡)é/Te�Ž–C�¤}ó\Ì\&¨t‚µö£¿õ^iĘü^(+~>Ó!—­ñŽ=o4¥øþ“Ô”˜#8Ú„&s·b)ÁlÉ.3eAŒc¤e•ßæö÷°wœÜÜ�¬b‹ `½:sûëÿnÇ�2™e˜¹´ó£¥ó„Uð Ôí+†ã›æ«¶ Ú@M&Ö.�£‡¸Á'tM˜ž¤©ö:8ÉD¶ä�€°kŸ Ü: ÄʼnYF·mÜ÷,S”7Ìö#ž"×,ÆQ¬‘©Ã0¬Ä9 ga­¾.Yý³7CÐø¹ü¿ìcUúÛÞm°Ám–Q�¯Cdvó²/®N¡\‰•ÁuAám‹ºö÷Ñ~rÜÆ“­¦ÖñXu‰¸1@ùíŽÎ§óg1¢fe×/3[ð½*»·½„ÀŒ,ø•ý˜eh½V ˜S¥/1þ°Ö~Èq>?À óOÿ›ÅÚD?ƒžlPQ¬wù’ç�Ÿ !ùñíÛm޹t¶µ¿rçúKŸ�¢‡×9Ë•9Úª'?¨U¥êfËù¿×}xs¯[·„#x…áäƒ×w\ýŠÚå·_Ö8ýO‹~¦…�ËàÃðÂ3ó·Ÿ®w´?÷üGù=òŒ‡QšÜ [Ó/g’Ñ´ÃOU�–(¶ñ-˜¹’âcdð–7Î7i}vÈX|ɨ a%`øpx`ÌâÖ‹}$›‹– Gý”'Ö““Uµtð¡ík¬ÍBÄß‘Wf–óîR‹Æ\äsXß‘|ú’ƨ0ÂÖÈ”{€ê ì9œœ­’ÄyˆQ�LT^N3td�‰E0ë& Zp͆Ad6%6å¼X$ꤊۄf£îcàÚM�øo»ãηì8z� ;ùXÚS›ã®õë~×T‰A���ƒmœuï…s¨w#¶ÄV 4V |RCG¤ù9“ s>ná±8ñÁ3§zŦ6¸À '£€¬gÁËì÷bÇWCZÙf3£®Ý8^%•‹ôLæú]'w·*'Xc}¿ ØÂÝš]ÈCÏW+Œq°dY$µÀFõ®€~ ªh€(úÿ'´û#°ãØ¡àÖ¦‘V³@ *Å #2RB |*W¦ó;,°ÔŽóF¢wÜ/ë}&QwzÊØ†^j°ù>͈·°ãïkë‹»ôû(Q¯·aC—öڒŘ›ŒVÅ p¹?Éõ§c:"À;~"ãMkjuP‚N÷+�~ ¯6ãl®BXLRhS–(’HN ¬rIÿ€Ù‚žáVÛþ)PŒ;›µ÷jlK#‹¾A²¼Ô6�™ö€Z„½¼0ÜÏÀ^W!—®=®¸=Óá¯Ç&gÔ…´ Tw¿ì;šŽ__\‚º˜Zç6É#–ø"é,y¾¦*~(‹8H&à›[qÀE]uÉŠNÄŸzA5Ó·Œç¬`�ÐRšÝù.’ gÎ�<®óWßfH¦z\— WÆ ;¿G‡†ÉXhÁÞðØØQÕ�=f�-´‰­Må^W­ µ†uàò;Ëw-`“âCº@3Ýz6:µ!X¹Œ‹)i‚€7a… Œˆ|oÒ 4_=^¾qyð“°oç'¨R¹l �´ÝÒÚp» ˜}î÷Á•¶QmÜl–”Ç”(°+i&º ™sO…]Lýî=¸bäHÑ©Wâ¼õs†®ÑP‹kú|w—¢�s´òí�[xÊ557e]LGkÅá˜éVŬ+`º7‹¼ä ïw}˜Pp 3™ÙJy¤úøVe9ó¤\àgp�Sr ÊÊ©—PœÿåN63÷6jæÆ…ß5¶Ú‡¾0Æ6öxÚv-›¼ÐÔã•�õ̶Vîv¶Åí«Ù²ÜÚÀèàçJãŠõné«”·Þ�²JÇ”bר& gjz€-± GkùÇ”ûqeàÀƒ=Œ °¯Ç×Pœ­àk¢>‰7À‡äÀvø¾ )_Ÿ�"YhzÖ¹"íE`']8›½‡yVÕ±Ônœ†N7>W <јYê›È^6Ûeߊä^Â]×üò^×q2Àñ6ó»Az]ý“*ˉX`ÊUáMªkÚæ#ø¿dÑLÓ1íoc®¸Ü\fqHvè˜ NÄ.±{ÔÈ�³J©:H�Ø"±¤ò3l‡èƒžî’¿çÍÈÍ0ᇕ“PEßçÑíþœ�R÷ÿø±J~Z?¯?ßÔü²…"ÅŒÓÿœCŸO.xûdÊ?á L’v™ÌŽ8¥)u™–ñK) ž:á�>ÿæÛø«X”z^­sQªµ¬ÕÌë÷\{¹ã4êþý�„Hó­w,Ïܱå[WÇWjªo*€u<¸ïÿHF«Ôe°Cºæìë�ØàcÖŽÙÏœ�ã°â²iBÍ –ä8J‘â7xn£G´žôýB8ú¶K&JÇ�ã:ÞŽÓÉ€䜒փÅY®:È.pmç]1^ ï9ÆdÎîÛ €ÙAºÑï‡ V›°¸4)h³7è°Û-x\"‚ëÈ%Zœ¦uñ,¦%K¦·§Øl�ÌCvÃj50 –ÇåÈŽéŸî¥a[˜º7î �ì a#¾9ÖYþ [à~<‡*ÒøÏFCqB¦Àú^ ±å½ò|Êë}1û¾Þj_L4¢(0¶M.Ñ&²Ô¢¬º7_Ç^�,vÿóÓúÂÀ ©ÿä" ˆEQ Þ\ ÊÑHä%7«q¸ñž¹}ߟ5˜R>C‰N—ç$ eP!(�]Ÿ¹˜ÑÿŠ}xÙä>\_—Þ^i€°ÚdÜÔÔ¾JºÙ_,0²Íô(µòoŠ ·ˆÕ‚³MØ‚‘® Ji3"[É`cŽ<œûEÀ¼T«Ò�¤0‚ú‹E-u4þ�| Póâ÷B›Z‹XDÜ"ë°�CØ„¯{«‡¶Šù@çªGXÉ`V—û¢›gµ}ÂX…þF…­¶ö‹º’FK-5V缩+ ´Ûê[ßÒÞ"¦)^á‡Ts¿ jNÜ6¡3¡I�Õ �˜¿¾!(*‘g:ñjÃçâlgæpn:J%ýF]ư£:CâC/ÅrîÅÎÖçyÅÊ/(‹~"UÀê*Xu,7É<.Ä¿åîõ û¸„-娅}.8Š�‹“œ1žŒ}ô�ëí+ôÞß· ö1ïOá�é 9ÔB™„-û=½LcÍñ�±;Lœ›Náüv+x<Þ9ß)Xcc{^^ýÌ:š?³/#‡kçñ–«V4§÷c7'LÃåÁÌ’vïy‚u�0:—Ó¾™59Ã"©á¯@î¤G¾hšýÖŒ•Kn¸ÌàæW ÷Üée§XĽ ¼vVùM.3­)NQÍ ù¨]í\e*‰Ž±82Ûn÷©@|‘C äNš|“MÍbX`é&™ ÚJ‰áõüòé×ÉÜ ÑãG’¥¹¹1;Uß)2ø †´b2’�7Ò^œ®F‰Â2slè®™i–—kÿÛüCÿŸëÿ8�êKX:­ézsöûþ¿�·ÐáÄŸ”�5þ¼»ÿ¬3÷.ˆ44á¬+†�³"nÅé݈{¡»Iäþ럕±Ç“ÿÃÀEC=ƒCFmk‚çÜNŠ ß÷ýŸ¹(1çÄ}wöKÿµÿÂüyºÿÒ´ìÀS|íÒJÉK¿ÚHÄ4àèÍÁÒý”Ä/®(ï'zyN6rÙ” ®‚6 l²¶œ�y’lŸ¹œ"Y…ؘÆ|$ ë¬1à ¨–ú·±Ÿq›±?å ªZÝߌ¦f£ë�Iläl\Œ¼;3�6«%þßûÃ6|7Ñ.ú ln!¶xÕy.MÜøD@ˆˆ‰À_¢ÃÈåþÿ®„^Hã‰8æ7µ|¤Ã†õð�vç¡î 0¼ùœÝ°Ó@� ±ÂæT6w(ü­Œ2”U‰Mè^0S�ç4JŸƒké]¡…ùÕÅ6IFëoŽ»Pv¸È”ýãcŒÈ/ÖYO*Æ A~IÅ”Œ%AÀEÍ W7ø�¿|v‘°·oãüݾ‡�©oøT¸“ÇÓôMv»øö¼hoÑk3 © f\³®ÚоpãMQ‰ø½ÏÅ–ÛÜý²¼Ý5»À’HM{ŽH<6›Gö_�šè¹Ìó÷¼سˆ³Ž­=ñóH·)¤UV–QA¥C908ÊVNQ¨çš�Ë0 _.«…×�_W}Á@¯_´'?á¨ÆÜ“GðûÜSõË3Oˆ[7͸� ÿô žÏûâ¡GÉÜ7M3X_Å× 1yѱwó.tÂ*\XkC$ ! í`ê¶3ŠÞ/¼†Æµˆjc¾®LªøÞÏfé”xê_£)CI”Èd|[¶² SF°a÷44"hw,}ÂȲk‘¿4/ ³v䔃¹k ±…›ïw“ù˯3(Š »•$ØÕĬ4á:Qf„yS"sñ‚+ròp³ös׳ "ÒªõÂl ïìÅ;Òf‡² ‹©"9ÓdÓ×(*± óŠ)Ã"•œÓâêt/ 5|7ˆjÔ]+Ô¾|aîN1IÌea ‹Fÿ›fMgJ%؆4í´=ˆƒ3a‡3£Ãðüj›Ì¹¯/›NÿZi‚@¾)†F ‰ Ø\}7p]{®„þÎçÒ Wu˜^\cÂÌN/oIwÎû‡çØX Ô]*Ì^[�C™Ñvİç"‰J/ ±êR¿ž�‹æ¡ ˆãXõºM“iFÖbý×.÷WÙᆴybÿ³�˜Œ‚gcyú‡Ãv—°±’õ9ïàvõkG:™2–Ú><ê�mP{ÛH#ne6wÕtP’ÑÁ¬?vF×¾Fªªs‹�!Ξº.�.Â" Æ¿g}Ï*åWÕ(Bqm¯ÁµwgAL_uŠF<¹²�%×3X×5}–TÛW¨Ü Œ¥>ž_Χñ�"ë� å(Äwß&ÓÁY»nž þoƒ¦~›¾ÚláÿÞ0ôWOô„é X¿>¥L%p&=‡1ož|ÂÂu´´K‘\¯2¬@Ûëâ›;ITŸ.ßÃvã¶èýtxh]^òzÃYÐ8ÝðIÊ*m#`o'›ÛÛÉ?ÃððmÁP”?+YJçûñ"·g1±°¾Àð%a´÷…´‘´,u ô³d˜¥’—#$Wº#y++µ}‰c+:º7‡!ތդÌ=qy² �™$RH"éÁlÌ[å!Ÿ™ ߇g•ø í[÷¿QµãÃu;½sß¹°ä¿½¯Ñ§éÍ“;qÇqPð·+ܹ“} ‡=ˆÒХͺ(?3Ëîg­H<ð ò–Ž­û¡’ç�.6ŒÔ6J;Ïž¸Øç��_­xq‚nãxr®å{5\Qn}¼¿1ZŒr—  š³Ùð½©>éØ_»Ý_%Ø4qvÄ^ø*BÃ÷î5Ïê¡{œñˆ›`£FìNrOøØ®-©EOe‡˜«´x>¾]¿î9¡3øn À½ŒãÑ!/X°CÅWðË;¨q/Îl²×Øÿ¿´ ön×z�ý¹�ÔlñØ„ëX@ öHaõç7ìw5ýÄô¿ßjcùœ/àœÀü;S3—'æµFÂã•áfûö_ �]{¦³zð˜EÎÏoÄõöé1Ìþ^ç#¼.È„ OåÑÀ^n.7½ßö®2úÕ �žÝÌ…í *§&½ÝÖâéøA²ÿ‹wÓ^ù¬ÅŸÑk[ìþÝóE%í""-XbP,¬Ý¨§¨$s‰:ùæÐæÙá³rÓw‚ùØçJAk¡a1ƒîõ_/áõýó.µ°"¶l»ÄaAÂŒ~>&ø;ryЂ{‰ñÑŸë1îfïm47£Ï3«í»Éžm»}¼;´µµ… d¡œ¾óo¼î7_]±V#;M)kËÁ];? ¬xXîù“M2Aò¹¶Á±v�W‰“�Î.£~™í{Otº=6/j~B2ôb¤’ïWœGMÿßt3ÁÆff ÙιAÉ@eî€{C…ngç6F|páÝX9' ï3«r¨Þ›ÓùùÆeðùúºè£r\>Âyåç;ûÞ÷/�ÍÈ÷–šµx¶ük-®oâ(B zÂ;¨ñ ;•÷ÊH÷Ñ.¿>’e ×Pó??¼ø¡€›½¶j- ©ü`…§@ûµ†ÀÀ´>Ð\¢¦©¼±ü{‹,¤-(%Ž!hÀñüt ‰d¬Â6$>Ùªc‘—PÄiØáM RÀP ÈÌïƒóæaT~ør~ÿÌŒšº|q…Í"¿Ñ¼\á¥÷̃*ÿÖ§ÿ0’7›£\Êû<ºûмÛ!ÔÈÓ8ûÿãA:W1Œ–æíÅŒóå+¤RÕ27™!ý“…Émq¨=ÎÌÞ¾…Œ­TÃfv÷¶Úys³•3©âÂ�§$Ô”“bÛkqIY*õÝ£™3º)¢%&7H¦¥M5Sb¯„¬ã%ŠL½c°šçTñD´›§,=f¯dÿÝî4Ú¿ÞŸID¤?Póù‹ÑŒðfNÛÔîZôÜ®â±ÞnúÒn9m¼õ”6ŽFTl•ɺ††­<ã©™x܉bã0üIÏ«7ö °|tf Òù-ßÊU|qi+Ï—Æï™ÔA¦´G&¥j-0½GÔk u5.*WÜÑyx=ë„9ù{Ý9ÁŸÅq/ÜKò¨Ýj��Ý*%’—ö©¥–ê³sqâ|ç ™dώǼÊC—š®`ž“†¨ÈDzvkÒq6ŠÒxå�‚¬o‚oZ…‡ÎÍ.Šº‰XE5Üû×T-Txƒ5ÃKyÌRÝ ’ûq.G«¬ÄÉ"9“�£æºI¼A*Û5�x¹¾Ò’–4sVÌz³ùù·�þzø½›ÙI¯�‹?™�ä+ögl7Z«ƒš9cd…'­ŸîMæ%°>a÷'éADñ7.ó·•7ácÛµX‡®µkÞ‰ó �û×[žÿ +ö;BÄœgÕj¶ÝÅúZ¶W§íêØá(«´{hw8‡Ü~¬ôž“;Õ°œ2�“›‰ÀñÿœœL4�©�ð´{aŸ_âYÆÒ…«¤#lУ¯ö7ó y0ýsÙѽN‰…lýëG’¢³>^)`L$ vºû2ç“Éd³"C›ÖÌ jWÙÀg"ù-É-¿\>o­½äì(kÝ·7¤šæ·›ÏKª n1ØxX�Þá†B÷Ý¥åOuë͉PÿŽö¢;É=æaÆÉŸ;rb÷hÏnEÄNÖ �Ûoq{ÄsD|Ïs|°$ªA9f¢8/ë?XwX‰3õñ6Žä“µAã9‡Åe3ìÅó¬ÝMÆNÄ%ÚQ›Ök}¥a2ëOÍj1îÍìæ…#ÌXŸ/9PI¦)˜*D8ŠUÐ[êµÓ5…-W¢Ú 6Œ\lÏemøQ‡¨ñyP5#�êFÏÈNxþ4S­cñ¨W"çVØÑ�^Õ6T8îx«N¦‰/J˜KºÄ˜[Ç’HµÇæÊZ:î¢Hµ”µ¶½-\}ûƒ€f¶wÜ l«‘jÖ,rÕvöÆ0cr!EýTùõÅìZü˜+Ÿ“t¬²5ŠÝÑço}Øt4÷# _Äǯ ú/zÆÁò!V�®ÜŠ@Q:¸#RÇçþüÖÐØôܾ¿Ò»½«»~ßl!†µ�*Jt„äÜXâ�îO!h ˆu¬¤àPˆNÈíL?5µ tç±›1Ëjs‘\PB L£ìz»4€…ïbkš `ŒËQÑ ñ£Õ¬ÊI€:iºu 5ë�tÉ S%©k„¹¡góR?@�Q<\ñq|_FóV�öè\lÙmê:Ë©Ü9ÀõªP¬²õÕ=,eo¢$ƒ×p’6%6 ò˜«)ñÉ´©à—²D‘¾Po2!d=ïÀ ÷òˆÛ�Ž›É÷FbWzÁÚµ­äGñêàâoøÛžk ¬×½Ñ»šM¡�|ïúÀ¬ ÁoAùÕ˜ÛʺF‡�Ä´¥Œ s3‹ ›µù�]¨�ðüL._Ÿh,yï=ƒqz¡4 ÇÑë80:Pú®™Éžº«CScb˜TFîìö»b3ƒ±({Óç;ÛJ·Òa»øú¤CBÝ) cQk9*È-LoéqÕ›Àç/x U;ÊÀ"0V…ñ÷?°'#m’Åœ¬ä�TÙ2Ø~!`ïÁÅR/žJuÅ¿hnÝ!ûýC¬ã>àk[V·ñrBM¡W�Ë—õ˜îbÿ!%Šåj ¶4ücÏqˆn§ù^ÿÀÁ³æÄÞ— çÄÒÁýþ§\Ih°©µŒj-ZaKÐá) —áEÀ¿a:P? ˆ Z;I:}ä|è@w¿ÉÆÚPÓ÷Ü÷uªçvþlúÎEWK¢Æ&"º�ßnmË_�ä[d Z< |•yÅ ¡NÁÝÍÔSÇ,j/ÖWÈ‘þÜ=¡�±—ÃfW“o°fG� ‹ÝСk_—g.�&ù¡v/hoÃ#}ª¶¯Õ P@bCt-ÌíÕù5¡ïÕ\ìžàÎÌ™%PÄÀŠ!ÛÚèåQgãņRíOm=þ7-«g÷OÛŸ`È·%¦;½k!%��:q.tÜ›Þn*èWʜïHçÅWåqHç ›Á$J'�Ær²):Ì?õ€#ûgc’¤Š²‡-¥ûk=˜Yg›qšòЬºvk76îJ¬|tˆôì»ÃéeXoãî�ŸüAÓö%‰ã^«Õiñ[R—îfÐÃÿöݼ|­ó×¹ÒÊQ:¹ Жv¶�‰HÃEe\î‡ãní/£bc°Úê®Âˆ‹xH:"ªE/êš"JW¯ÒSUÝÁK¥VÑkN7‰½JI)e`•·˜öäÒ6Áêv•rhÞU'Û3±ˆçsyÿœeq8ËÐWÌ/Wœhû%E84aÃH›ªÊÑÝ¿/üÂç «Ò:D[ö ,&k�]‚ЫP²FB6ËZ¨Ör¤¥'Ì9‘ß{Ü%à»~sãIfó¤4raö—Wn%K¸rÌ¥'/ý*ìå%õxplÉ:†áb·H¤¨äXÝ{oƒ#Ý-ÇM³›¬äȵxu"-`„Ä�ÚìÄè¢KΡá×­ÝAn¦0m‡A“ÂÐO�ðU2³Þ¶.”Ò´Š0ÑÿvÁÍüÌÇ/Ö2&‹¿ÏÍTßkÅ̸Ñâ[Œ°s”I.üf¤˜ ê ÄI»xÕñ ýÙ¨.2bŒmÚ¥is6Sæ])Ëi Ê£¸tÁ)&åâcHº#¬ çîÇ”Ái¶Á§ DE¶4û®±]É©äô‚1—Á1\æ±µ„&“3r2ìFJˆd *Œìï§x»£ r4#ž½Ø¤¢á.î×ÁQ³Æ×6™”îõ4ÆnU �¯Ø-‚PVS<”¡zwæªeôhDž;©¬(:cMuî¦æ{ô©[$!¢î×#F¥`pˆîJÏ¥¡N˜;›²ß·&‰ÞcYßkCd4[-‡JG «CÓdÙŽà¯%õÿ™Àût=êw‡;nSy÷ rÚÕA(o:— Þ$Ý™ðWbíîŠpÔŠatå­ç{'�BiÔrS¢,ñáK“Rêq9xºå2»•Ylî.ì}Ždõ»‰nÝFšŒ‘ð¨·LaQ”Ð] "±Y:Ò÷céc‡E‰�S€N|D É>`:PvÚ�zM’@ãrnÏ®Ã5aÞ%MÛŒ)Ž3y¿N/|£±—’K|Ò ™ÉÍ’ wÁ¹*~¹ Žxº×Õí[W>LºuðÆ³ž^i}Ái�³¨›ƒkÄíåÅ#<Óbà5—+çÂDc%ÏV‰ÕåØ>M|±ÌÝsŒÞ¹h¨’i‹Ä¬ÝÑ3LBY÷„­Cñp�AX\¶qZƸ³C†úƒ¬0ÄÏ]ûoʈ#bc9ÊutZÓî ä°^(ä�*«¼±¼aËÌ“#¡n.¯Ú4–Ú`KÞEÑæCT¼TT G[g§„Ëâni‰¥U.Ù•§s%sù%ŸÔ{Èþ¯'¸3?ßþ?Þ©¾åƒýÝÍ ÉS ?Cì̾c× jióìᅣ㳠¯z§Q-£öZÚCL˜þj­ÿ›e#ã�ù�»tø‰m3MÕ-î»õ›§�ª6týÃõ!�åùü>æOõBÞþÿŒÂ…¨ãòU¨¸‚‚ªœ­��j˜ýP�üÞXÿ�ÏÆ¯4$½õ½¥ÁõmÙ“DŸ‰¡¤Å¦u”n�¾åd㎠_ü"÷‰W[÷šÑöذ@#´^õ”dµz€ 2Ñ)Ì3âL901ŒºZ°r µ§ñGHLIɢƺn Q¹÷ Üä‚àÐâz�olEðÆæ€sp¸uÀ¸ÄÅ… Áå§,‡ì5Bf �)“�t¡‹0˜‚395ð“}ç‹ôWXãpTØ60lX÷±s™�Wduì [‹¢ÿÌ42dÁ"±y\ܰ¦ÞÎÚh;ë÷Ü©K1ò#ô,§ë5ÉiTA“gfÌÛ‹ë9s(ÝZ"‘x¿ñ8h!m¾º,´˜Ûoƾ¢, !§)e¸zn³£·uÉën7˜Sâê‹o§ÜYÓɬ]Üó\pæEÒªƒ)®Þ/ŠJð̉Ãà[+¹'”omkZ Žŵíáhk›GظÅmÞCMÏ Ä� „õg[I´Ýö׿  óÉËšsjg.î›Éû}ˆj |±]x½Y`n´uÝ襖²¢[VG„W’Õ ŸQqiÝd_0Çb¬m÷£ò訕I�kÒ�n.{»[Ò`âÃæ:†úϹ^³lm¹a›s­¶ŒŸg<Ž ÒÐãI–TÈ*­‹i85̺QcrºŒœž PdKÊPitOÀ¶ÀìëQè¾¾G­É£˜��ñv(íhsXŸìAþ@\¸Va%–La´ËÿZbË„ü”�Bé­“@;öï�½8ç·ó┊®.ŒºªÔAG Ë ~9œÊÓ×Ê ï#öÁŒlЇ}~H¶Óiä¨I(YÇåò3ßîº{xû4\ƒ½sœœ¯ y1fîg}Æ0[†ƒ9^Yÿ˜O'î æŸV~ýz®sr ¬ÈþìdƆ¬b-ÅÖk]a‚ÐùÚ¹pÉÅ�pf�Ø?F.Æõ%~hbœN‚Ò‰,PHj£:ž#F´i) #0bäiûÀ´3«š1»u_QÆO�9^ÿ0‰ö0 u5P�82ïzQ²l˜¢uL«‚Ä®W†®w­Ýµ¼Dü\DxÌ;ìeXïÅþÀÂõ6Ê(=æË/ÄÉf—lyçEÎ=Çù:x£Î.¿k�6þÞ%7¼Š^¶W„²Ä‡ˆÏ¥?Å«­ôÆ;•íÞW =�Ü¿Ç|Šx{â6oNöýÇùÛHsGµUÐîbÜ$Ð#CK2‡ôQi ‚¾–5'fË4àHýŠº¯o�ŠS¬7Û¡’œ“.ê’räŒFáÈ÷i:ÈáíF2†ÍxRÜVί»ÊùQÝPœÍc Hfú¿×T&ÏoÒ Öºˆo[%MþJ¦à’wÕ»�«À\uYaekhP3tFÐûñÈN]ˆVº­cœÙ¡±�ܯ Nqšê—'„å¢Ã“ §ú΄áavUÞ¦@öv…»¾/€n6»Ó{=,;§tÇ×Ë£F§ÂøšÅiy«´)ÝùÚ‚<ÉÑmxä÷ÑÔmrQ¦ô‹[–ÿ|eÃÒƒN—_þø^î\zWðR:SŸ½q]È–ÉüH¥7ÁfÙºùטJ/Œ  †Ù’eÔz®Ð3}èL#ŠÆ^›0DØÛ»Ê=ýñÆ‹ ÖY¡Iº,¶˜Žr‰±8ÅaI: gnï[0HBuS=I’J7†Mñ˜Í¸Â“0ÝÆœqÃÇð^ ‘`�à "'£™:m¯;h;ŽÛU+«ç;0±ÍÀVÖo,öÁXXʤdS®®:5ž[ ˜÷ÄfØ Ú½í|Û;Á^:g(bX-fPö¨Gødˆ‚ý²öðÖ™ÑÇÝõ_$®Å¸FKœÜé„òA}&uù8ì/¡{¨·ß®Ê{tLÄë#ò ªFÝm$f·ã ßk^ηŠ1�žŽ,uJÐs..V¾š<™®+@uvukk�yÈLeÕé‡�¡ÇLzÆ`\̤˺y¯ ',“ÕÃà+P%~/– Ò;¹e^÷¥Ê�—JGÿ¨@Ýû¹:­7$þp2(Ø V��ü ¾SîàÁO¸UnÊÕø¼‘ oLf@Fí¤ÞJâ“ô?•�_™>~¿¤¹ux×þšêjû÷r÷kß·ý3™œ»ý5´€.HZ‡à×qˆÆÕ4Z½¥½•¬X~®°~î`²ö‚ö{Lw%"`bNôˈ;©xŽ .„ ;,÷†è!ÿæØ^›�1–Á_ ¹„ä󤚸›6žúþ"@™ŸÃúé–%Ç|˜¬ó)Šýæ¾ÙÆ>š I²-®ÒXClZ{@ì$v�Ý”÷æ Ðc“qÃä‚öNHuØ«ÐA#º0¿€\ÚÂgi†041âb˜u=Ü Y[? qo,"˜ÊÊ3UÌèÿEš‹lÇ1Ú ~ ?:�w 8B7ÊqW˜Tãsy·,Ó‚%ÜjðÓcPl¨±¿“¥lkª�/Ûܱ—û (>× ëI|_55Éè1rSшç’Ö¹K¼ÿ¤WxgÆÖ'LZreáܵ–°'^[COlw]ÏJÙ¸;™°nÁf:7 Æ^¢X�"¦ÜÝxÍÑ èÙg.×ÖÞQÐvæø4ÓX_$úmJãlJ#³�I¾�z£¥“Tê‘�d!¯7W ¯à�ÙßH–|éÐ9\P8!“`­]еšÖ-FVI‘t¬YØÐÎØ5Ÿ]½C£'5~”sN\ĉ5üYXB﹇ ãYÒ/¤rBgLu�k±}Aý¾ ¸v¨BÛ5¬¢ù¬“Ê\ ÑQR±-·<-H@Î ÁÆ…—WfÂÄÝžÝüõ·;t;EAJ¡Ds� ]÷¦×&õôLll\Oç-ªúw¿¡³ ~É—r$«Œ: Éé"Ýw²ddbÁÄkXÔÀ�­¢¨?‰oß´Úœì†Wb•°`Q7as¬.î/²¾u:CÕFTj¹îëÿp”"±Ã+õ?ËÙæùæ¼o¦6°…anX¬wASo©òoóJnLª-°¬ˆŒ>£ØôÞ9öŽ ‰³u·v ©uضv!†ñG ¶v�Á¢´*Ñ”C«ž’¡Ê‰`˜è´4NÑ‹’žc³'zÈ}ÝúNä²cj¹©Á^_ÌÎdºaê˜këœHjÑ^ñ’†œUÐô\ÞuYÍu2¡“ÌY %^Ug£á„«MAæFãzÏ·í FâwF„<.B²&LÍjjïäŽñ{{ãÚ/ÒWÚ¨”‰ÒPO‚×*"ʃ¡ ôMÿU’¦ù� ðædƒjšš!¸^�DÝ'B LÌ(+þwIlo•„ÂÂ|SŠÄ:5Æ09�dŸåäTÐ4¹­-w w'ZÑD?Nã¥ÒD"Á¢%ÐÔô£ ЭhÐ Ó.ØUE d/„ž?cÚÞßw@¹JÚãtè69b5Ñ1yU’ÃíJš}ø˜ ©sý mf¿~ ~ŒÂ£¾šÀü/®âÕ^{ v)fýš­•�F£*ÝÍçÕI%ä}�*rN?S]xŽè{›¹IÂT½2 ú‚�õù÷þpæ�›\…!|r÷9‡úþñþ-6²W[Ì!jsͶ�ƒe)V24?ÙTŽM ‰Fg,X¾‡é‹`ÀR²¢Ì]¶…\š÷Y¬u†ç³‰¶¸§Æ 9ìÝ«j&‰‡o¹†!ÂzÅL”ŽI¶=Àº¨©S:}CI·M)’¹ÈH+ÖÈ{ÅâeÓKܶÿëo7;[D_æºéK~¿v]°ž!=Õ]2Õ¢5grbÄ.À—ÆP°Ë°Èr6oݦ,d{Ý8rjs¼6”Œ­ºW¼nbµâÂ%pÁUÿ–¶üÏ=%F¼o÷2ÿG÷MØ â¿ƒ=“)©}è{9¬‡Oø½lØ�Zß‚rº5>ŸX úù篡7Gï)&È!?øÍ/ÈMÈÂÐã NoN¾ÖIÑ äxË'•;o5€\ÛÁS\oˆº&J-ÄâÇE$\‚œÑÒC�åÅ^Ã=ó£GêX ¬0á{�Ž�˜¹ü$:¹S^?\MZaÔ•&™ÿÅ ÈêáO`4bÆ-W8¬¦ š¤ÄCÞ$z¢€îª_«»›=±sÃçºô[Õ@;ŠØçt¶óàDb4SoæO;Yyg3�öŠ?ð¸w¬¯Þ.ôNHR '˜€ýB­aù¬Mßêî*ÅöÆç¨à—È?�rl¼g¦íRݨnÏ KrgáäÁT®µ1Ñ ýW IÐ,r°?h‚Õ™£.ÉÖphþ_ Ð-}ȼ|º*Þv¡Y DA:ŽÞmIqE©9ÒÓGj2—e¸@Á2 SJ\éXÜ—\cqré›^¿Þ4¹é�W³¶ZÎ9C—•] °å1Ý¿<ÅQU|¸�íanN9B@zΔbÅüþ×îaƒ�_ÏŸŽ÷#Ü+i0Ç�[Qz¨&  ¡ÞÄ,sœúló~¯k˰–…M¶i’õbÇ?|÷°||�s¿?xÞT<­IÎ8�Ô«iì-Q}"çÞÏ÷µ}<Ä)·ÃjµÔd[UùxŠßüVºƒó1þ�q£ý+µyâÆØ„ÛLvQÇW ÿšÏà&…�JÝ´s¢o¯,_æ£�”Íóèð0uÀÁÈHlL—g‰2•Œ^–ºXl�-¥~9½|Ú8¢[›²lˆ‘ÓB)5(½kœ¨-h>êo'êNq¿¾k ]úàÉ \½ŠLÂù:Ñ�‘Œs‡ÿÆÕèE¶ã¬¾]l÷I�ðÚ¯;Pé áÎÙ8]Ý¿‹&4‚‹1dØH&drÞKý˜x«0 Ìfì<i‡6!¦éJØ?�(¿ˆA\¶w þ¡Ô›iˆª´q‰3+�ÚŒv¦ N™lƹœ*•zÞÕLRˆH+¶mê#¡�ûGR+A¾¨>¶‡�oÎØôbõý4E?ïڬ硺¦›™óà¢É·]: ‚©¢ÍìòŠ”.5P9¨…5:€&\Nùd&§qM„sÎ� …pßÁ’ËodÓT/`Jsà£:µ—Ø5yÑ‹ÁcE>S„]ÎÇ0¹ñr ¿‰0¿²¸Ð·¬ÿåÈÀÏ7&¿??¾&R2´—és{by$�¹´Ãxg$6ß/<»>²AÉk.Ž®üçüý} ?K%Á�ìGë÷{B*°‡E £ŽbEX¢]„ƒ¹4žÒ Æ¨E¢1´7’cynW/øÎì†rHT·W4"‰Èà.¡MFÕI®'-‰¸ Ë:PÕÄ"O³è(M÷òe…Ú¢úÓ°�ƒì‘ÑŸÝþôØi_+æÌo<ÝÕ÷�Ñ™Aèô8‹�„‘_™Mñ’§h2Ñ>ŠŠêeH ù~šEüó¶]3±ºÎ´b?­]rö£ß" 9N9¢ÕÔJ3\ºPY;…ÈFQ›ÞðnÊWüÁrš `’›_Þ¾+Çœm£ƒáöj§~“ùûV‹Û ÙÓO g?RM¾K�LÄ›s¬ÜÅË+êQ”r´!±ßÍñ•°«@ip »Ç9aŽy¤ù ö!©[®YIœ´ÑCæ ¥Û$«’v cÓ{›§Ê&»zÄßtÚòÑhKÜ5þ.ƒW�ëŸÃb\ZàÈaÏ–éÁgV”á–g˜mþT¢î ·Î5\:ð2!BcAÃ@øŽ}ïç\Á}ó²ßiÎÃ)æ¸è1£ð/Öi$c2òz#6•Eo] œ°O«ªì aÛ¬,;W(R{!u†"SÍñÏšùÀ0Îr/;È^ý¼0æƒlo›¾>ÆN2\[/‹Jx8ÊÙEf ‰öj;ñËJ#ž-c>õªÔþ›é~õ½DDÙ½û¡Âö‹B–³£Øœta[Þ|ÃØù²þm¿mÝkûx©‘Á°ç(-âb¿/$&/_�ý`D~·à£goÝyïÞø/àhTªR]Œ}ª¡�y"‘¤¸žgß'K±£!]ýßi€NÜ"¢¬†æ(ðW΃.½2�j¾“ÕýŒý˜ÄFÇW==âÅf[Ò~á6 ,ÎüX²Î_Ùý?µl!<™}ƒ/â/“,Ë¿¸ûX¸Ã„ap§qû3Ñ eÉþøx Äy½ÔW�ŽÂ…ECmmߨfÇ‚=cwI…Ô¢ìO©SF&†gM/ á¬`´‹Œ´„rİ"ÂCdQ6²¨h~�uãàob�Ŷ|ØVø!ß«Y`s°y+�0Tž^N�D£Þ$�P2²¡2BdÀ›tÆnÔ2ɧ�눶Àì…Ht¤ì1“ÞÒ×¾žm.Ñ C}l¤O1 É€”rÊÓ Á5©Õ¨ì&­Í&‰]}�jEИ€1þ.@KõZ�Ç-S5>Y®b˜ŒøoÝ bBš.ý•¹5i1(!1xÉ…XHÌe¿ü‰“;ìmUÁCÔ ‚DN�˜‡4âzÓ�ëàÙýô³�21 ˜‚�ù¹÷t\�$‚«QÁäˆdT²/ª�Ó>¿>ŸQ¾¤ÑŠ¡‰¶kOMžÑï-€ˆáPa·lü±k5§z«s’[!H£ÌH ß§½Ê’ê…Ȫ8ÄH??œè“¶II–xËŽ’Gìh^ØÚH7ò—z’·e ˜wŒ$�~½sóùˆü}ù|£$ dæ[¾”—Ã3‡@dtŠ�êÚ£©÷¶3¹˜þíÞ3Ÿ1¹ú9"ßý�r ìKp'cÖCœÔüÒÑóûN•qVèöX_�òŸÚçgì?ÏA)K_F¡~0Á€ð™HæJm‹\ô³F«bYçÿaaNö:”Rk{V™•Y„‚!Ȫ¶�º1�¹»^±õÛ…r'e°ù6U |0RÈ^i aŸ\üì;…ÒÈEeã§Ö°êjÖz ðÓ§w{0%·©æHªô¹OêÖHç^±·cßV¢0¢žö¬^ɇbÆ~ê�¢ob¿ØÅ8Å5ÁžÃ`‡Ðh@Ô„+*ÁðÃ7WÒ.âfZ&/{ßœÄsaw!éB�í‚8œ0MYgÁ+–œ;6Ô«º¤Cøê̈¥³%Å¢·+€VsÆÆãk-†1öok™[üœÍcý AXð8¢q­âN–;QЈXR¨™{`s �VêJªÁi°í�‹Ô±L Š”™y<_9®‘Ä5Öã.ÂË�„~fäbC Su3œ.X.�ž?ÚÈä¼0þ[‡¼¾…NÍãB0ÙÂîtäÐØ�xÿb׸0ÃÖž®¿ kCuCx.]o×ú2îR_ý¡ÂóáÎÄ\Ï?WzÐØ öçð¯¹é½ö 6zô +ýÆÃÕè#¯ðWþTçÄ ¹ ÒºéÁûÈ›øŠÀ£¬9k0¶‘n]öð-z§/£‰��ÔÏ[²VÏGBÇ`©kJw+Ûò=Þ¬ "±,mg � =•²èZ/ˆÖ=‘i!–ÖZ4-FèKhaû4Ñ·áÌã³™eew0îë\5©Nô˜IÌ„pÎ�N«*_–ÆÍ:bó*ŽdW›¯|Ô\=§u½)Ú9Ö_\Ô?ÐgÜûÉ�©Ö)ųkHn±˜Ø8%KŠ=«²ây�Ç7õòz)óÕÌwg·¼£¢ëhSRŒ%ø8î!¡Dv¢u¢³M">âÝB bÞGÂQÀR•ÐJr=תë�Àn±ÎýÞöÞô¥ªå¦’£|nYË9¤ D¾¨éNÜ6Õ»öc�Gx°Y{Šr”˜2æhyð–QÌjÄDVù€� oß?Ùý4@Øi¬¥r’úÐÕ¨@#ïÞ9 «]û¦AŠÃVôË�qÇã“~ègá1aûwÊÄaÓDL²Ÿ€Ø_óÃkÓ’'""fC&-5Õ–‘K⵫½{Þ§½Óû‡°„+%˜fpfÏ߹ݘJìz-Gó&‚æÿ0ü)·>A‹Ï"Ÿžt¾ˆ¿æEì§xìÇܶõZµ¬°l7®�0©+P] «ë"3ë‚îóäv¨àþ3Ž–z` \ÒBE»Íè·Ì…ñCÉ©ô ÀTŠJÅMûjÑ;kÛ[•K[7´ñN+^x¤q¿i|r—”½ó+>¢ïGè <àu’=Ø¿_{æ÷`eu±à|„òÑ•/‡¸ K‰†¦“ІÃmÅ7BÐtprƒvU@Cv¶•þrŠëÕù}Q»h�UÅ™¢ðŸ¾¶û J؃¨ó=‰ý à·­U´6Vå³ë ȧ«�F…R ߌèœú>×Ç™|òmkCÀÉ%á÷9Ç`Ç”w90ØÄÔˆ£›øqÄñžtJ§Žž¬Yœl+|œÔ¢^|I˜�öd÷ ¡Y6õ+ñfÿ¬Q3|Høþü —YÇñ˜½Quf_x‚ ’O输ê8tÑýòGÚØy‘Š¿y�rKàw.X\Û±ñýÅohèt1Ãö‰1Ûîås†’´1‘®Õkäl<^Kc ¦ÈŸN;�®nœ¿|ƾ›r¯ÓPïý퇾ÐÉ ±idl0l|ýL½_Z²Ÿ’EÔƒÇð�Ö)PœþøA¥‡Ý®ý )K£žNx)ó÷íêqÂëB³¿c굩)Г”+ ÐËžèéié,ZBM u�k1¢bEi=xªWàSôÚÖ ãŸð,‹,+= eß�Í ®>—Z:G¡a¹õIj•ÇÑÎæÂ3þ瀿süünwÿk“ãua”ÝjB�cäÇ$ƒø�äA‡�fΞ$´ð/]K1WÙgQ.(–߆¦\4$P¿³ÐI º <5Afa„4bÌpzWÁŒ¢8㤇d§­7ˆQóK>n8>A�o²ƒ;žâhO:MsoS纕uTB}½ÍTW\G�Ÿö¨—×r]žYœÿ½‰V„T<þ´°� 'ØdO9Û•ÁóÉç·)h^�"\‹'Ü rSÈ€j‚�÷¿:ëÅÁSo)––ºª¿‚hDÞÊj’B£# ÙA4"*˜ Qo‡§µjëë,[>ܱÁ©óŽ·#ÝÊ>¶(ïßA¿šzJÖvIáÝh ÐP1dƒ´ÛQ”’£S¿/¬å�Þ»_·Z•3S¼oF@ïÐhF¢I5Åαè¡M Þ&‚»$ƒïl¹Í[®~ÛœDûSu6û× y·(Þs'ޝÿ¿@®hìv Êݰ‡î݇gFð>Œ�ÁRÆÞ™»æ ËO•‘Å_õ„Ðˉw8½¿Ñi»ñØgÂaÎZÖ þly¸m ¿„²2+ðÔ!×£gÒ”d·Íj�¬8Èîß�Žò†õ*úÿæB…ú÷A‚˜²pm´h¸èô¸ÐÏ�|Øl#|}Ç'�®(ÈfýÙΠVα‘Õ0�?!È¿ÓÁ^âöS(L§­Ya‡ïWG,nÁU¿íhpÌÒfšÛsÆqµïÆq†ÎYŸõ௖UI"H'E!�ûöE1ˆÃøhgy‘}Í©J�üxàf­éý¸z³¬rR ­íÈ$Zün¹Púß}¬…{'Oàx8‚sî´¥Cî#`?õm9H=€9“@ü— †ábŽOø1@±.Iu$÷}Yx‚R¤xq­dô±pÞï|^ÂyÂß9ºþ½kÖUÚÑßDm×[9g ¶|­±E½Ü)ºÁèZÛé²zì G :R´$bshŠO™ù$ ý*?í'•Ö6N§ÞBaüMÏ-ØW;§Uåí_rõ¹ÅË�c~ìr°Îš)_ˆ±Õ1Î<Üî&X“z™¬fókñ„Ñ –°z*Ïœ Ž�‚�ð TR÷y]8ìàŠÙ!Á“Ö*)ÙŒvôóYŒ›%L:(ýÿ‹"Öÿ}Þ¦E*Uþ‹kvcFøhÊ‹×àûÛƒõÑcé´o¯zë‚ÂÕÜåî9’c­´ÉXŽS2Wz2Ç`,Q‹d Ÿž‡.õR…$µ  ®Í ç–l«¬5%ñòÈñk\cŠ‹v]ù•M�ȸµw¬«a’¯ø�Íey1˜Ö.DêqiÐ=t©œ¥ã Ø[í* Ë[ÃÞ6cGœ.jaÔåÞr´\»Ó^÷VÂBIÛÿ#ëZÃ}'Ë àßðÀΑÊä`ŸÇóÄ©ß㸹-'Ä$kf%Ó,.ˆªL$³@Èñt¦Ô&ÈñŒ:‡µR„V+-—º„øn¶*¥ÿ^Ò¥‘»Nï9É„¨Óy’ü”ã;°f}b(ÏI�Ý|Èò†$¢^¡fð*?à«è ŽHÚ|ÑËØÌo¡’qô´7ý3ì�æŒÔ(R”®óÓ¡àý¶Yù÷WôœáµËÖPwvF¡–¡¦£w+vØæcN€�øŒ´|"ÜxaàJSØ,ç·Fä�¬ È8%Zu˜Q™: U”±ÊÉX­&ϾŠy£Ô¤ô�Žf*YQ0ñ?}†år›3v”±Œ+ õ~‰ÍeÜBk¸�SαÈfºX…ïÍ-z–Läu – ¼îÑ#ëÙ™w|Ø|?0‘Ûñðoªâ”äÆ_6)ÊbƒT±|Û�Oö“CGåcBTÕ´È3rŠ1�ElÑM±™T�ó,ÚAf£d LâP£l&fXyžyR92ûŽóÅ¢(4©hÅHENZ®yµçæb†—“V]œ©Ï'ž»ùó~/%z¨ÐÅ0kt Ï‹®"LÏó¨»èwÎK�ûšxá±mBÕ²S_Ô�½N4  õk0µ'r:º~ üh“ñ£‰#M9sÍXÕapzMXS5œü ]x³{¨ÞšÉ;1«ƒ Ö8-’Ø–Ìà¡é› Eg%â×SÔùÞ/nЦ °X@—nZéÕj›³ÓG:;°häšHì62ÀX?K˜¦ç::{e,Ëá?ÃÜ9àƒ$àȈÿ8° vWè0ãeëøþËàžúS²ºˆZµ�ªVqXÒBÜiÀá).e®.þ-#7L`VûŒÇ¢±në|»ÒR˜,fÇÜô=؉s‰J6ćpýTµöbʽW7¦° Ç+�ÄÝ}{9@Oä¿&Iº£_Ø–NÛì³{)ÂgиʃºhTâ#2ë¥s©ìA3°¹¤À�Z+ÀtÃÜ_°š^À[·Ka/Á‹ïÇ„”]K ^·RžA)á¿eô'~ÿ¡9!ú ÈBEa9ÖrëæÞ¨çÏNdÎ`³ãÓŽ;”�íå|uÈ£q‚ÖÍõ¢]‘[â’}å ;$*<Õ@>=FX0~ÄšsjºZIÍFµ—3‘×-‹ykÇ 8’±Z.ù£o£ºRm# sv«Öš"Õ™°"'FÇçDÕ¦qu-’žÖ•E]uãLµø¯%å3b*÷~ÜŸsS•9ý«³¸3MßÑsŠôßÖ˜$LF…ߋބ`ä‰ÿ3ƒdÍÑäûQ‹�m_P¹?"ós¼MÊŽïLòévâÞ.™:*ñ$h>£;ÆÓØDÜß/´tˆÖbw|ÔÂÓˆ8ÐÆÃê®®‚ë VFá+ãÐûƒHs»ÖZ*ðbI°´õ !×dOG*ˆsFX‹ˆ?©orÄ|Óç˜^Üʹ^Öùñ�ßÀô zeL—µ›Ý®ø6WœE’&ǃ—ãòj$ÿëÿ'å‹ðf\E¾çßá3x†à‰ güÔIñßÛ÷3Csßv¹ÏÄíÖØ†û²kL3ì±M}î¶ÿ6bÿŽz½�–¨k˜vÈðêáøOùöó­MQV‚ÎÕ—­.ªÛ×cûí¯˜—ôÍ?ªt�ðcôWñýe¹eY~�¹¤Î¾û/h‡Gø´>‰$§¿I¶_Òƒ´Õs2ˆøxúµeGÇ_\鎆ÜÏé‰J)—ÚÂF�%(wþk@ýûalÏ3øêäÈ ¼4æ{âÉßPV]FLÙÔ!U‹š µ@6-Kô\,Àw‘¯4 7)÷ž±Œ¬q.\{§ ¾õÕ¸)¶·²%äiWFý Ë•?LÍQÙ¾‹€/5˜VF…Ê€ím�6@®tȓёs®l-Ä¥¡ÉØðæ!‘,Ú2ì…�‘Aq*"NºÇ"Î )™Ù!9ß"%l ëpÖ…“©Œ‘0B_.2d±�“�Ë¿ÄÏ…ô²~IWæm•¶LÚðí}üH_Ñm+É jˆ\›ò%QÄ Ì‘\–2G/¡îZý'ábGãÖñXh ýÆP%)þè|—Ùïßìó\¾Ž†R(  ŸÊhFq)*ÊllA�¾Ïv‡ds`Œf·åemPÃR÷ O/ œ5¯x69N3ªD×ðü¨ØZÞ<̈¾‹XõVKáݽnUçÚ=sÞôæ›BÝ”€÷Qí¡-.¨à0´þœ~1‹5‡oÈÇ6Û)-q̲Bx¢· b˜s˜Z¡áæ5ǧõ‰u"ƒf—¢éua€Ç>3åË' ðÊ̸Ù*ÐÃÏNݘj p¶hÀü.×Ó1™ä“€A¿ð‹|�¸¾¸Ta™“¤·;%b4|u¬¥c§©Ô2ÊÂP¨@›Áþò� \ÝÒ›vgÿí¬­²Cߦ þÅr«Ì”d2e·¾|Œˆ† U.FQYìç7‰,¢êÔ¢lÂ�þÞ¸ ôó;ÙÁÛfú,¥Ð%€É¯éÚÀ2¿ë°»¼ÒÒèÿðÚ­ˆ¦y­oþ_Çk1Aâ->@q _2‰ÚÚ]¸!š ILV@I·+QÙ—�£j?�O5‡i@ª›âP�U’&yéÜŒö‚hˆ¾E2[ÜÃ9…ñ1ßè¹~ÉoNKÞœçV –µ¶ÝCâÍþqˆø„a¿âœÉ$IÁ»{Nh.­õõ¥h«ÏçG€x¢ ¯q�ð°øÀýa„Ç®_£2 ˜, ò>© C;Ž`^D,ALàíÒ‡?þ¶œ_í˜RÝçæR¡i©T®’ƒ ^4&ª¿”ó×Âe½‚×Ú´jæ’BÄVþ]9JqÁ�þ+dõŒq}“ðŒ{jø!�Ã3¡JÃlD¶ˆ~0ʲÊß¶>ºÎ¿{ƒ#2@ø9ë|ÿ(‘µò¿ÐÛч¡ªu¹«}+ù» 6ÍN}$Ý#l.ÎqXd3'ȾûMýR'�ßpp’Œó¬°‹çå{ÜÏ!wFËé¶H9EŠL Þ¹¶ÞãíÙÄèkˆl‚v[;!§N×\ë¥C‰:‚˜œàqŽÃCxñs˜#(LP\™˜Å‚†ä´Ê•‡ã NÚP(«˜ þõ ‹þPÏV¿l M˜.¿º'Œ\8^)—2è°d™M–m›ËêñaÖ4ç\�í›ñd[Z@Ê1 @‚�B|FyØ&»hRö¸ÄRƒÉ\>wŽ­£:\lݨ-ÞQa—0JôŒíE«Ó» ·œ�Z×/#Ÿ5ÈI�›×Ù+ê†pú–®‘^‘Fx±æ2.ðmÂ/}ÆçKvh/bžL¿ Ù<0j¹)·µ•n”^EU²Mo¸œÑ…rÅÝJöLk i>Wmœa•*v¦¢ðfc#±Þlu„• œ€ABo¥Rü\þ!cxÈ?¥Ñá¨qôâмRÌ_5xú^”V(w'ªq±å”¹aÓjë½ÑÌM+!bÐ=Yªg �“ Èå�ïóõ¹MI[ý _ÖubbÄŸ3Œ’l}xgk’aËñÓù w{ÛWçnî‹ç¤�ì«ê3Qê{ß'Æ5¡Æ)Õ‡Æ2ÚÏ�JVØåq�Â#J�˜ÑV5¥X9(´2׊ëaï’ÇœÔæän Y sJÔ¤«Þžk,§<¥*½ã< ‹YmÉ=ì2âìâè4�YLØí† šº»#`ý)\×ç&nž¼ë‚úRÒ‹Rõ¥ëN Úƒ1k^ù™ö&Ùoq`¢w[š=¦iK´hr1 Òåú¬ØvÅ3–_œaOÄÿT‡›ŸlÓ¸´ý@¾š^m7¹KÏ…C°–ÎMÙ±A®T $“A¬lqËFJn „�Ô€]Ëñ J š9=X·ž–Â%·!IÈQ? p¬–8y`æÍ¸Õ-28ÒîÈ:›é×+Clå±²¸êÑ (›ùøZl÷”’vŸóþ§ƒ­ƒ½Ø`ê/¤Îö÷šÊ:—OïÊ•dJ¼>°ùüPº-*d×&@÷ˆy&jºÂáKUÏØ3Yâ&;Žûø—Ö@aL ›á�}õ/š¯Ž²±b²í•TÛI�õí¯jžlù-ž¶�Ï�lÐë ä.Gy–.…°°ú5½!a*çÂÓºT™.ÍÍ�¯Œ<âó#•%D ³)•û˜�è Wu’‡zZâX³0ú£No Ìk¤þÑ}ûuUoÚI hÕ�#ÄÕ¯¶Ê²Ž^ôšá‰ÀzdÕ¡Ì|@:>ÙâûË?Ç"²�o{û�•Í ò/êÝ“ëòüK"Íõì驺|^ߟ ŒÇ 4¡ü�èÁ·�îM½ÔÐ8`1Ç*=ñˆ»��?ÔmO?³f/Öª$JLr,D9ë'¼n?†6€ÆgâÁpHº}¹¾�¸û=Á1$С›ÙŠÅj€r W®Äp �ŽXõ6Ößl ³ Ù‚ç1|_7�p�»¤±�<~ò½=•ÃQSròÈãDN$lF•Z18µCœw3a°âl¯L-£²+Zvœ“Â,ÄLÄÐÆ¤4Ó3:ðêÅüŒá¬D u“X Ä£µ¥@Ösš¾ˆd‰Ò5“V-e÷Ø_R²�A²Úͯ– ‘\þ­kï7•23«õƒú—!ºX!¡l•±h¡pÞ,ºQƒÝ¤ý†´Ë:é¬5Ò†>VÍ�u²ƒr”Ìä:gY¼YéÝ¢yŽ©µ©gèœ6Ý2~¦ñ)È8µì&ÌÇ&6­`‚YÖÊ�ä³\¥S«¬þ´‚î_ ¾|»L_�» l2 °&±HÆþIW›å6_h—³8ó�"Ðlù¾×.I0ÎuÃ-â`3R XÉóë£>í¦Øé"-�ÁÈMdÅ—ð�\ˆ#ãÐ%G¯Ì†ã¡QÈ3æÚézº·n®_ÏÜaôBU\åOï›FÆœv¿Ì+ïÆ”vç�žTË}ñ1¸¤Ë7#óoбÎGÝïj 4–ÝûÊ•ä­_Åâf5„8¬ z~æ ÷“ÌŠ3ÿ¿øi6ƒýB´gKm— Æ\ö¶J¨øWñàI Ž2 µàxűð_û÷H~}gK©ãÿ}’1Ç¿|ÀÎ>{U뎘»‹c*ùDaÇ'kÆ(îøö,//mwÉï�[‹õãÁRv2Al@¼ Ðï¿bUŸ «N÷ŽÆ2CbL Á\e-�LôQÕz|f<£o-ä`\ÆB¶„°Íà Ü|ë¬ kdxä@¿á�wBè!=G› +ay…3Œ#ìÆdMè?‘¹‡²¹¸Jc—- âU~k`¡6m’pÁ7˜»¼“Ö®Ao‰¬‚)Ç“þ°±�-:æ̾nµßÅE83ï„]™Ø°4À°F2"w¡'hÄàA\;•®)Tàb 6›Ö±‚’´[žLÐue½}ÚénU¸«Ý^añÆ×bUnB5‡²ò[–Ý%„L5Ö:‡¥\ÁÛÛC½Ì•Sð¯Ų̀AY=çæ/õÈ ]?w&tÚ6J+ª™R ‹Ÿ[2g¤…2:µÖ"W°rž¶“;'v!mS¥â8/’hŒCŽìb6»+Ž’é‹ƒ0}j/’"ü4ßk³ÆTfBZ$¢üï­@£cç6ë)j�\Žë–KßòhÈø—êX$C=¼¦tp\œ&Õ¼òGÎXç'/ f Ì4½‘Ñ:¬0ÔïiׂìöV³“r•×[ç51¦|(~a9Ä»$ü—æ÷®omÿokÈqík¦“˜ ãüFU=&q Õñš‡ülc}ĹôjTÖ#åËçðlÕý¸É‹Š×íAKvÞ1äš0á%?ÅBæt™bÅ᤿)”¾TÊõÄxE¦ù!ãç Ó¤Ôghæðøydº~ìëwÌ“:º¶7Üž[dç»ÐÑ)ÜäI÷Ûád…ê3\Äñs˜kä‘Ó£®\. 69ÍïîkPåRfN"áSƒe§É,±Ü‹9Í+¹N.ꥬG«YóKËfý ‹?%¢³ä�wÅ‚¶Ù«l:éɧ P,b¤²Øg,yÀ>Yc8“!;Z†"ó]’õ…×~,X.�¾Þo=ãËÁW”uŒp¬Äÿ-ûÙðò,ÒŒ�Ï9FÙf³¥91„@<è›CÝu›~ÀàQEcÝü¶ûÛ½‡JÀ9ß3ÂC �Zí]ãñÓÃ}k€ù¿Ð‹D;�˜hÁ–…íÂP�±ªó3nTËõ)[$µc› Ù�­ù€r&<Œà¸¸gÀv;Ûµoß¼0I�a†×5Ë3n¸|Ò/BËœLiãÉäZs6ò†%V)c ±˜>P’Á6ûˆÜ—ÃÛ*4[Ûdàþq\qÊÀˆW \ÆF­Œ6\¹™¸èP…n§V® ( (<‹ÛD6Ó‡×("F-’½„mvHò.½'Lº Á\‡AAA÷˜Õ0é�½”k»ï¿U1)œ1KÓÛÚ1Í‚;‚÷pß3®Þ]Žàž÷SŠß•“ÆHÑW×Oi]¹Ü38-K€ªEºK»(´c c+™‚;jT(ªê3‚È+!˜2ùÄ•Cʼn`š)çÖùê¡;œ·ßKžÐ}ð5òiöÅËŒýiBÇf/³}¸RÛ$”ËÞã¿N šVäC¾owŒðY&ÕÈ�Ë$CÍŽ&í÷]T„ð±q-œpJ�b[2@ìV#•ø'aŒ¬n5N º»yþ}§°k,dŨ4[t5%À[¸UMýuÏà�tÞ–`ØÕÆŒd»�óçwžHæÝñx@¶qQƒYaí[ Ÿ;‡Ø;ë¨@®ûþÁôú– ýý—R«‹çpvõsÙÓÊé%á#c¯,­ÄÐûÎõ¨àµgÖ¡ÿ&¶wêŸ@k 0¥· &!Ħ�sFVI|ïRFjüDG½í9HTxd7FNJnMNp§9 5­øÊS˜8 £D1�xvÍè\iä4‚œx³3aBÙNÈðžù{óú>ÄPb|°k>­‰ Ëâ¤`ù�tžÐ%Ø®¬“c¼A5ƒÇHõŸf?õXm:ûׇü]Â×Ã`Éå[¶›è-Úõ(ÛF!ƒkêBs­…Q°ÖÃòÐÖ1¿+S�‹äµ&Š£è|=ìº ºíÔ èð¢ëhÑñÞ+Û^ëË7ÞÁŠœv×½³×Y‘$„’KŽ6�k2¶)¥ø¹o÷ Bj/Õ™bæQOÇSæUû¾}ëlc]›'“·|ÑQý}Áý…s%Ùwó;éÛZÞ…; þ  zÊœõ«u›Y ¿”*Û`÷?÷m‚¶ÛPKþº+ßÒÇA}œ_½ÚЬgýãÑb ßHâ£m|,¤Eak+XwÒ¡2> ›ÖŸ95Ièä;íkÆ*#ʼnî<ƒ %‚óðQ™;\…È%žóñ­Ãä­Ü’WÖëa²_›3s•Du'2µ¼ã&Þ€lhŠ@ˆˆV�W–\ûþ=ý8ÿÚR(Þ–^–•0gªpüEø–ÌÌ&ãkƒØ0fœ&XR I-ÔÅÈEB�%£'HC…–np¡Ö›uàW¾JÓ«ïM² _dúµÙ `ØÛñŽ�àÃç¢q4†lú#—#¯(² u“L‚AJ¦FK%süÜ­%a0c–)nshÓ¥n,È‚+­(BÕ²°K­¯²Ù7‘Pݯ,‰ˆ¡‚�…ºX�%›`ì•yϯ‚°­^Õ`W‹´íÀ5¾(–Ì(°Ã0J벃@Eyª 3³´NÇÏúår=_î'e¨Iì¬ðë×ïlô?cšiS‚qû�÷µOùiu¼ñ.Ç/œýŒ¶SÖÿ7r^›õ_ðÙ³n‡Ù.ÚͦqÏÁÇ·„øfòŒê•<8´ö䟮x%Æ5�Éå§ïú[�Že±9ÃôaF˜¹.7wѸÙp¯P˜ƒ`Œwm7òíë:&Ã2ý¡Ëæ70�n¥øË³äÊ�)œíü¾Å�#9ØÏþÿäpu·ÄïNjÀù¤­ÁZ0@ Ó˜;½¬¸üÂúKiwÊ ‰°2áC5'Œ]Eàæòrq£%í»*Òfûz¼ëìvÔ�~ÎPA“ïo\ühqK[m«-%þ[²ÄÅÍO„ÙUˆ@i)1Á‘rU–”êâ…V“YPÑgшÉqEúÐ6«R, ~}š¬¡†È‘JØ'—¿ƒ—»­ýç$LîäùÉ”ÿ~X-¿Åö‚ÜÁ#l?4¾Á‡nð{×N‡R¿Í?×Ý•XÑ[nÙÈö`[†'÷Z¨Æ—ÀÀi·›‡Óí^ÙFÑŸÔYËß¿"/8Çè…ĆZ{l£Ô—Óp�…7!›Ã›I¿Û›èh$ ë7JÏ{ªÁ`f /PˆçÙ/ÿ¢˜˜¥pw@ï0bà !6�C}èfXáI1ve/»Ê�²r^ºr,ãeÉžù/¹b¹QgßVÔƒx[´(˜`F_Žy®yV æxUc6Kþç¶Œ˜îV°k¦Ð‹ò1 üm¹Êl·õ±ºá¦Nû<‚…æ#済w¯ÄwÌNq¤\{»âiÞ±Ùç+¾õšãyü)š“„R6»,®Ÿ >o½\áÐZ”7ý }gVeW�Ÿæ²Š ›”Qëç›!y2ª8~PTɰ«ŽÆêÑ1³ƒiWà#„’‡^Ï4µBŠ’Ð‰¢Tä^À2˜UJ·9ÐÝp6eš3&Œl5SÃ%ÖüŒá ÞoÞæ ¾ao[¹ [ÌVš´I³Z|Âï~“Ž_²õ�iébñ6P Å&o€t¾½ŸvµÃº‰º¢šj^t ~ö;ë’2,–³Ð ­�s¯Ÿ>~¹˜Oð06@²CyÎ/tf�Ó²AÌ1sÛ†óq§N”-�D?ßj½ÁrLÜ_ý¼U{SD ÂŽá‚(°Ûš²®5¨ÿ}ß¹?àÛU,—hÊm��¢¥Öµ= Ðf×m"Ç�’ w)`(2$DIGSö ³ØþÙõF /îúãŸY1eÜ?›+C¤0¦8÷c_Åc`æA¾×FŸè—ù%a,àxå"qóÍÊ׶żÊ39õ�SÕ&U‘¼»$i7n_ÿäZÖ°µ­kYø ·´—eý¹¢ÓlVä‰�º6—n¼ÒMY­?þ!žcòiCm”›¤ŒG¤g_¶”’oãZth 2k²ã“QèìÜgþÚ¸´Zlƒ«`#¤µÈ÷ˆÄ3+�›^èße½~§WY€íöAZÒc�¥ ”m@‡íBŽLbÖ5ÂãBéÿjÀ¦¼©Î~‘¾ wAŒF ~ô�-ÇÂ"7Yò£Õ@úr#?2à;hh`ÿ-µ¡øqÈz_àÔ­súáR°M¥¹}ZÖ …&ËËZÔY�öøÏ¹|úìç%�ªñÅådU �;L«Ùȼ�8Æ ´Ò1²ÛŒ#¯\rõ, -«û�õ`àÇÀûô‡HÔò†¼/ù g7Rï]‡Ï»ü}¦kÐÁZ@Bß¹|<“kKVp@D�€¶3q–ÞÑR�-!Y‚°Êë‹@`’GÌ`­Y „^ß­€Ð¿aÛ–üžô«•U�Óx�ŒXÃ&p/yCðÿn|¿Xƒk¸ï¢82½n8@Ùúþ†°‹ZOC&Ô•Iz³Túö°3àÈ,yÜLç«l/êT·æ_fØK@„ãŒ-õMu¬ pä¤ÈÊа[˜�eÉxŠöÈeåê×;aWx à*ß× 1“9Љ7�x÷�ˆ] l”þÚð­‚bås¨09h¶„ú †áv%Ö-›øŽ}yÁD–˜˜Á6#0)H)Žf–3ƒï²ÄÅS(Ô”¶4Ü£b:µÂ­´še¨Ê2»Ø Á‡…<›7K9´¥±M–žÎeЙúñd7~‘�Ú™0bAµåÉMX‰�ORi’­hýk#%ÁƒÆ^Úä‘ÄlùÐ)8bOk™ˆgü� £ðçÝnT¸¶†‘­U7Ð.t…�qqâÛ…¶é�>� ÐÛl­f°UQ ‡K"!z,zZ:ÁaÔ@Yðóšè¡�0:Í ” !‡±²œ²a.®‘é̳34#‘»" d«�ʤ§„JE„ò”†ðã7‡o b¶¾#""°>{­žGåêËkØë#]é¼í¼šo¢|ì�ȵ¯ƒ dÆWÁ-~ iЊA ÙYïf.øŠ-gDd�)èD‰´RÊ5ÈÚôl·` “Á‡Ü%ðÑŽ€1'‘ÀH¥½š¹0í31€×M3y틬¡Þµ­'?¿s?ÑUl ·ôÝ” e¶ƒ*.�=¿›àRòc�,Cã6 B ³Ù+Ç4Ü‘ww�¯3}¼Àî(gHad½Û¢Ð!\ßrŒ0—×N†�wù.&ó𽌖@ Kø³kh'Rˆ¦;‡4Ði—eÉÛ«S‰çŸ,…RŠþ‹ãºX! -�&•®¥öI†¡¡Ìâñ„`‘'oÁ`¤dïsè³ „á2OXÕ°„¶ÏàãέˇkYŽù€—{×YpÚç÷m,;žÓ÷P– DEfåßÄ­mÙ5#™'¼ HYU·×¹Upd}Èð-¥¬yAÙ°÷ï5ªÂÊ|¿vm|’f> 8ûy ë>pÖ£Š^0Üf]VR2oÜ’3_[ýouƒã†üá#‚3dVÄVy½n_û{`²÷Jþ-òuÙ“Zêzâ:$n¸au¥Í¹®Ög¶ÎE‡„3“jôe�tþ|¢wÉ“Ž%g´†îÞ»‚‚×X´h¼lí“ê'GMìDA ÊoŒ¸�›ú¬§Â7 pg¦×Wbpt�|î41¬ÿw‘u!U8ÿ�yÔFËÑ^VoP°ZE[ï¦%ƒB_•°ˆæ¢ /דw¸†q—,R(*¦¦Ä¨G' L1èˆCâ"¤™ oÕDµ` ¯ÉN@¬xÍ‚òåç«J½´ÞÃQßáx¾Àõ|£o€N�ŒN‚V^w2ÃD,ß3qâ—Úïà ôòxïOcð¯okY¾cÌ}†ßÕbÖù$ü`é¾Ç¢ö;¬KóýÙY³B«–LBJÆw;þ¿[gÇm½:OèTô‡Î›Ìå¿-AõiÃßæÆL/ ×ëõÃD6\²*û�=QUh¦|RJв >YÒÚ*zÀB-å@¸ñ’‹Á§% 0ʬ 8CIâ¨Mn*ÿz•ÿ[òÆ©!öÑTa¤Ú“ì³îÄüYÙç6¦¦?ç5!5 ‚:R/üQ5]ÏùÛœÀÌàÅlðR­Âq…<èSÑ(|˜Œ›A-òi\•&`¤ˆf«†Lu1’xð_ñpøï%ÔÒ_E7mI«"> µ‚¾ozäzÚ¨,™5X‰¯ÔY+ÍÒ¹u…cDdVÉÊÕï¼b*kzh€Òf Œ%Æ'PpdÓÊMºFÙP¤UG`È:¢:h"ð‘v%Ú¾ýŠ*¬¡�Á†“ÿº6�äùU9”Ëßd¼<$\¿óŒ4!VP‹„‹*¨EØbMùPnvï dt´¼W&y’ц¨æ2ÈÚY/ó1ð%…ÙßùI†âLb1•Ã?°Ëà“Æ^1Äãí¿x÷Àèp)Ç­‹)±Š[¿Ì>j›t”8õ¬5ýXÖóݫښž�½ºúüéuaÙ¶\w/ñóÃ~_,8›9D9½ã×C̬"z…~ÝÇä‹Þéúq=´KÛ«~µž9}ãó_Üî|(ôM�•“­±ê" ¶�¿ª¥ëgfÔótåÉè–DëŸ^"ˆ'jÇ7É|÷«G9­LròV�î¡ H9¥ˆS�ßÅß¶Øû!F¶x„§˜�PúÈ‹be®@ãŸ['SVÁhQsá`g�S Œ€7àÃÊðY%²+™ÌÛJ Ù`Ë8À(±žC·š++6Á ­Ìk; ŽÑRyfvcÜUGDF5ÈÆoV¥1šêÁÅ/!éì1�5k„3ôm %U¿*#WE¼ò”�HG™µÁœ*0m$RÞ,.7Á¶9]›½èun¥Å¦�þ-Úq§¶OmqlklÀ7»˜ÿ3q·uyQõö &Æ�ÑÂúÙQ¸ø?uûÕ»�I`T.¹µ|{ûЀ`/ui@a Ì0ò©¨#�•6hô1„œ;½Þ w#¹RÏï­ìx7†Ãcäu|„{CYИÎß6Š>²  šå“¢‘¤T›t ÿè ÁÑÈ û¥Ìùó“øæÉ^#�’j1`ËÃq÷Üçòz—_‡±"eô3§«p`È(s„·`ÙÄGkÃó(Qxñ6\|½=صQŸ&Å÷÷ ÔÊ…¹k ›½ÙN’îBû9¢_ËBÿeX}’xû;úyôÆîz‡¿ØY£ ÈG¾?)æ¢K&ކ}•Œ¸×k:ç¸Î¸J¼ÑÏ?øä½ i½ÏÅ£˜¨ìA çУȥ!Ï_l”ñÀ1pñŽcÇ9´ß…raRÆy{ýýÆ]–¡ËcV7l•p˜Ôo»ßÂÕ7#,Xð/m ýµn#‚¤ê•Õ�Ê%‰fÁg¶ ĽæÖê³JE»q§6ê+¯¾ž†6’´KŸŒkü#ÆØ;ÅãÙtlún¶™ºAk‡¥­` •‰ÞÀ†ÌÀ«/ žâœ.$óëþIÂØµâ °�"w;ÜßE%&ÞÑJϘµ4OFXÑÀo¸mâ÷#DÔÖµÁ«{ä¿€!9<`m81.­†CÆÁ…•†žìm|íÑb¥Ù[ež:ª-uI@iºZ!kËÙ­ô‡©gõ¬(¹¶J¼Ž»G ,Ç«ø²:F Ì„"êÉ(Ø"h^�MùtîÞ±KóuCôN¼²ß””mòçø‰|›Oλ¿ÚÆ[_ŽyÕ²\NÊR?~ü©Ò"â/\ʫֻPŸE\ºü„;.…}ÓPä(³'±Ÿ“ìêð뀌Ä9ƒ1¶Zøn/̵Ÿ~KŽùoI€–\ž � œE³*ìý9ô£Òd¬á¿MûÈÛ^#›§^Jhe ¾s]޽­ýjïh7Ö2éÉg¸+¡„Á Œ¯W+†1  >ì~¬b/};E÷±Œ}êÊF÷îu–àÞ0†JæãËøð o™!ÿ¬s÷RßH*ç/CÆyDC ƒen»c2æBÂp˜ñÐCb¾\íÿs=¦¯ÝŠL‡ñ >G· ïõ<çB¶SZM¥U×+¶4ݸyi¤ÔmíÄg¾„æ»Õè1�"õ tÚ¤2)À�É;†Ë([ßâ0{`ã ×·EÆoK"«�k�Ë‹t-A {føAÎ7öÁ cߥ­¼Œ''L£øüZ餿M(5Oç•,~Ç”­s&7E§eñOÍ{æ÷íï�Rìb3WÕÁhéå®w�Ÿ0J™ëÆW(¼×W]à>‚ýWן±qŒfêã…ë㟃”\*S¿ÂæB É “ÔáP%°k#,¨Ù"BIn´�×Î7�܆5{.ö."bPàÌŽ^ЌڠD¢:Êñ‘5:m6³¡ò"+)˜Ü–-°Z+äܦ&%olùåEUF²½Û²e﹩vÇÛõ”Åänîdfm¢ßIbÑ`k?/ºd ­»²˜bÓ}–dêæ“ƒ¼øË�LÎlµñŠ«¹üx}lrŠ�£SŒã?p v,ï=™â" ”ä ¹F㪘*ÿ°hÝÃÙ@™”Nƒ± x¬y9%§&HÊÃ|€ÆlW/ÊÖÏa6€Û•è·â{[Wƒý5ÓØü%¾ç�Lm�B­š¡Ý>ÝÃaŽ·ýEžŠÛ"@&Ø×Û¾©t¹Z„úã1�ô»î1²^^ ½púçzvÙöjô}=«m8XßàÊ[-ÜР :îó”K\ÿ¤=È’ühÄ~’´Qý�‘?Ù˜�¥�ÒËÚÜß’. Á«uň}Ý‚×Jè!òÇÊ[0Ô?ð:<·&/ËOQ *€vÙQ· LŒ³i’ú¼ûØQ@Ì�NØ›éŽð>txúÂ._®;�–”=)w‡¯€Ÿ»ž‘ß}9Ú˜ßYRnDQÀl <'²¥ð�ͶQµGRlUb ˰ʶO»"±Cd$Ì”ÇJƒåÔ=²LHn×L¸û�¾èÎ죉¯¯ÐêÄ8Ü4ÛÍ*Ç©â†FËIα§y¬ÆkJ³Ÿ§;4ΟX’bqî÷dµ½×x‚vÒäæâ“—6fS0“¨(“¥˜‡#£®ÞúØlPÌr"†Q-É•Âü‚†CgaFq`èg§ó ññ­{òq¬ØPGÇ?ßàøò ¶—©“ºÓ“_»Áò;â$Sç?ÌØž@ÿ ;o�^—œÜA?0×xÖE½¿/;²a_ �F#Y�Ó] �VæöAÆA!Þ@-­6‰Äý‡LnfÙ¼­ í�gÇ¿ƒÇÃ8‹ŸGé1zÙ%¢>ß*\ØÁX¯ aÿ+£«xDa\øvG¿#Á‘ƒ�ŒF<’ö‰úÛ]\-}‹Þå{‰ÕtÑãçËÞåmøÆzb+šM .È—å1Mé‰ßÑlƒ�¿o@á‰s| _Q÷Ö§ð&,Z- a.Ⳅy_ê¶l�¬yædbQHblkaÂq�=Œ1F�9EAä§^±¾®ãÍÎp*»‘\ñ™Þ7œà-Æzß $è:;qj½«ƒEEŒjH1±<¬Âʃ¾øŸ«×]W ¿‘Ò0Ž4[T5ú’AЍ™ÃŸüÛÐæà�j1*OÞ†–=Üü˜M9áå9’ÌÓ£§<Þ¸ÆqÌ]ô>7úDâæ}þµü¥ÊÏú­Ì»[e‚ÃÇ–‘®ŸÙ¢bb"î­F"pH‰<OŠ l°�¦rI”x@î)™a?€„×Ü÷îw Õøø�•9–—VWbÜDgæpí³r¶´>&‚Å.Ão%„.aoø†3‰VÒg­¡ŠSÜvy[–ÉÊóG»êòÂÝIBÒ�"sÜJÚ1¨£±®‘/’t�pe'#°ÏyX½î³¾Ö‡eæ[yЈÎÕvƦ† ý¬¥–ô™C'3f$b/B·e·!žQIww†Ê`æTn€ˆ�°¸¦b rv*¹(Æ"©¸Ãg’VÇáúÌù>3�èö!c~…ï �PDi×ÚzÔ£ù´†BœòUx—¹i§þµ$DÆÃüœ†ÿ’ƒãÉ ß¹8³Ãe4T…ÇzL03l“×ðšÐØåÅ‚” ùé@¢AŒs/¡ry:XMJÄϰ=uaAo 0‡èŒ®é±8k”W}‹=,1Âåcàfñ5¦1ÛW¶“ ñþ"Cÿ Ý”d?€íÍ¡†„*f–^щðÒV«ƒ˜«ž.ÊÖ%·D.Ć¡n}ÿ5‰õùl %MùüÏÛûÏâÒO¢eÁ£ßß©µü–/âªOÒ§Ä%i08ñŽ7XžØþ>¹{üþ­d®�´½ë)¨á;xÇvu~8s#Óò¥T&òKW—÷è{ë'Xìt·_ƒïûêÌDq þº›t¨/ï¡} FÒ´xYSô2þRòO«‰Ï 6 7@‰£þ�ýfÌþÜ7ç©á2ÍjtªYŸ�}e?ზ=?FRó½ªôéoXæS#„¼TWqÃíã¤ÇH„õù‡MQ o ·!­]‹YÍ1£_1;$kœ­ÿø)¨W’™¹Î_#'¡� Þ^vÜ,9£º©l“ q—ƒxzîY n”:u4Õ‰Fd-_]i¸†Â„¹æ³[Æ7»Î— ªüÍõÈEk´A&dÖïÆÖ 37Ã)5 ;�èªnÊÅ\“%fÿ×jÇUjù¸á·š dDdÔP|+�ä¸�wÁi˺Á𲪚'_ö¥u\¾®ƒ|¾M‰%±�Q­¨¶ƒî®ô(i*=HSM‡!¢{ 1¡—{½ÒÉT˵5”œ,Abô…Dí JÙÜA¹HÁKÒÖr½Y‘U…Ãh-^�Uë). Î´Ë5 »&_Ü•îžùÜ]Û³IÂÇT–ió€�£uªƒ'DƘªÅQ$©í�#,Nk*·32<ÁT>Úp?ÿ¹Ëõ¿l‘¹`©´ˆ´ˆ®à´4ŠKÿh½ßÊm£=àΡ» PQšäí\D\�—KÁ@Ušu—ÍÎòÐËJ‡£U¡šÂl²W==]bù¼}¶ÜéR9™Rœ³l(¬¦Ý�Ì™ÕQ…R1ÍóX9Åñ,©�í.¿µ[ÃãPú%Ö ÓJŒg!¶ô•’ž»œ )äk#.ڥ̯KŽç_‹˜Œùt´P^¤n*{�;Ç�³w÷²9¦¹–WÌ2ý,‰ˆd6%ÔK’y$…1RL¯Uè(…¼ˆONåyõÏ·cð¦ˆÿv`­§ CèùUÔ¿±óéfÑw“’ãŒcˆÉ�g,%f÷Ì`¹:ª’.Êä·j£ñ\§êMFXã£æ¤e�Ÿ§z\Ó&TÐŒÅ÷ZpùšÑµÊâšt¼2š"§eV¢‹öV+&2Ê»]µJ Ê*ä .ÁÛ}¯Cáóx·sÿHç7:ÿHàæ lþžE}Å9ÛÙa"91©³J�ÝÖ.þE‚F@“Ï©1Þh`@! h>;w£œµV8Çl(�•$¨†þ}þ¼QPÃó(Í 2 †dPí®xú¢­U³'‘™QãJ´1@vW>·†ÒÆÀ§¯¶²œöãÎ#oŠh6µÿÀÎá4]_Ïä�~>|dÅç%�-êF"ðã8a�®MŽÔä k?ûŒ $Ò¦=kÛ¸@8Q„pCcÌ"l·DÒëLLóÈmv|æé#n¬G±v¼`VÑ ˆ7MýÓb}ÓôW£¶°8‡ F¡F 44úÓ.‰OpÜ 9dÁJ_Jä$ WócÌj†·À¼ÄãÞº§¨r`دOmMî`]›†Ãº4YC‚@l­99ö“õ™äõWFÄ«¡Aš¶Æ+:¯€0++D�ØÌ²—@¼×Pe;QÙR g;��œ@vdÅM 4²õ 99^}��χ‡î°Þ”ç&lù­äI��ª£˜»§žÀÜÈ}Þ‰؂‚¶;Å•¯åOú,2›),Ø+o/"MäeEÿØB«(°Sÿ;ga¹ÈÿXYH0Õƒ¸ãNh³¤5q”�—,'IsAuoâ¯4ÑÌùŠ"óÇ ª8Û=–å.%¶Js™RL#•±w¡“ »WþP[–žçÙ›°‹êï¼¶ÍcE¿ÄŸ­ Ô9�Yù`6î“+µÀÄ�rÅKD/‰âaµ ƒ §!S»¡^ E¶PLÇ;Ýg—ÖêM0×Ó- Ð+ÚBÍÍáÁ.1º±¨È‹ÂUwàÜfaÜéJ-E“G72 …é€+€æ™áŒ¢¿m„X°àÙ78Hë¸ >5£e�ôrf€ö$ÇðìZémïü|{®ÓïƒT¸`Ï ƒÓT|ó®}ÐH9Ì7x#R¿ °oUµÛ©B�;)˜4/˼}o²Vè ¿dëöµßÇ>OůSŠ}ιÐ=ú5vûŸ”‚N ðUÕ‹ÂGø‡‡ÄøÎ)÷l{=ï£^[`Fî_–Àxa£ÇnÙ #dŸ´;l\«‰•Ú£ {ð} ŸÜÈ­®-¼mH×Ô7(ÍÖmÝ4$Ì’ÌÿÁv÷ 8( jàʸ†rx¤^ûUÓÐu«Êv˜` Àèsx49g˜¼Z˜¤´øí!²>áíœ�Ìp™âNÎÆ&Œ7vî8%6l@ª¬\m~_vPÙ8M0‚¶‡v‚²z›æ(3kG§!A³ìX :x®ÑÚÂÂ>l­cÎnY:ª³¥õþ�¦ÖUš�2ÿ %ÄNãdOfÚß´ ­â¯eÅÆpY2¹%ey+X ‡¸Û“³f|ITHYÐèe� eƒy7Š1w&èá*ÕI:*r.¯ÖÄ>l4I;{U�âïkÃŒMYd¬ìú ¢Õ`¨–Ox€ÓV®9¦ކˆyœv$hì `…_z—±mÁUÛ4ñüWQàƒ uüÿ´E:�ÌMnS+‹v`q(–ÓÆc˜>µ"ÖúhüÝøøj,†–¸+.)Ðu‘bƒ6��±snÊòRÞEŽ÷»¿xáÉ0I²¡°z²ésIrÞ÷¢¬ó—Î6R‘/-ËÚ¼Ô 6ü9ë�銭‘?Kôoò�%[j÷>6‡cUªàm’vb�ÆÞǸ£^æ^1{ŒDp׫zïª+X×^¹ùõÍÆ™w¦}šñš¯ÿ=³öD#ö9 óW¯1ù}k§ßSŒÊ±ögï¤åoß[Î7ñž‡Ò8ø·ÛÛèBu0ÓOÓâ�Ç�Ó3@޼ýÂÅ¢zmœ}üê·—1’c&ö��� gkñûõë²ò‚J}ìþ'7Ÿ”×%¯iYìåŸEúãa+¬OÆð‘ $f-‡à*‚.™ÝÜiCpˆºETÚðÊûQe"páèr;B§ô7Ô¯Ö—üÅd™MdE|Ñô7xýAyÿÀÿÿÿÉï{¯@X0@½‚@ª� ÚSi¶U¶Ù¥ Ø(¥QEL‰-h-¶y€”´m”)R×}͉«¹·¤ŠPS4�®½‹ àBöB†™ö=° ö::nc  »7wt `œÛEÙ²û†º¦Ž<!@2Ó.ÙÞÎ�èð;u©z=htЀ�¦Žö$­;ka´ÀÀ{�.öª;n¶ë�¡JÀØöt\)Zuä‘à¶Ù{+º×jmÞà­²�î¸|>©kíU×w¸°; 6͂ڄ’  ´ztw³%EÛP¡Cm ÐkY/T|�}ØàB¾�Í˵$m° £kB°’­ *ŠÐkKLµl¨Åd\ê6Ö­¥@Hжµ#ifÚÂÅd6µAZ;‡DêÆ¶lÆÛ0TVËi¦[(ú½U^ À¨”Ûª š«T,Á¥4k[jd©ïi èM‰C[,ÍnÆY°³tîÁB%ÚÖj”Q­Q­²�²µ,xÜšÝM4ÅÚNvª—`ÚÃIkµ€zLêfÊk (6Š5)T’¨U¬µ’Ó-·Z‘ÚÍQÚ­VTP[lñØÀàztxò¶R6ÖY6aECL¨U¶l†¦Ú2ª�6ªÉ6 zçœê€»mµKA–™ ÕJ¶ÚÚj[jÐ 0U(ÖOY!ÓRƒvtJ®ÌÓT”�hJ¦ÅÕ ›&Å�TáÓ¶ÖöîÔ5°šzÔ6Û'¼ÐœU*«Öª�£eC66b‰M¬Ù’ÛIC&m�½á¸Vz�­Ví§U¶hhÑVX)­¦jTÛ³ÖœÒíÅRº-m4±l­<™tšÙ…l½·P6XGE¹uQ³M™¶Ìi[HÚÖ©lm,ƒJP¼E{Ól¢MiF2fÆ ‡NêÀL€Ð횺Yƒ‡¦3I3 5l2ITd{ºu�E ÒM°Ò–ιÖÐj@PPÖ×sT¡NÖ5âU·S“Þãªl£F5FÕ¶ªZ›hAA±¯MÛLÆ]Žëí ®ØÆÌšÂS=/x(„=Å@¥±j´²-›m­«jŠ#l-`�¤Míε1ji›SI�mT›j*U‚jÎÎuƒc ÃÉxÔ*!¬ÃNè ãè£wÆ•+f€ªÌªLu�€Ú ¶.ܸӊ£¡¡4”%%50$”Šj›M0S@†˜€¤A�ÔÉêj40$õIQM4j4PD�A`�ªb M�(‘šaHÓ¾'÷ÿÏþ¥IÿÅ«âÿýØ&GB2:Ÿåm ýܶ kƒÿç¨RÿëDÆ‹ ´GþÒ33>)+�1†½ªš(6 •ø�Ú¶e‹j¤Õh,X­¢«b­Z�HÕ&­±µM*¶‚µ6š¶�³65±j™UЬj‹i$­’¬UDQ 1�‰,&ÅTšÛ¨¬j²jØ­i6´VÑIZÑ[bÙ-&Û¶5bÕ&‹mD[QUIE[&̶Ö-£TUA’µ•µ£kIEµQ¶¬mª�±­£[cl[Q³SE­£FÑm­$mj-d XÚ±¶ÒV«Û#b¶5Z�¢+e5µmQUFÚ6Ô¥cm€ÛV6Í5Šc+¨6Ö�¬kFÛQ«E[E±j¢µm’¶‹m´IE¨Ñ¢6 Ûhµ�%DQU£Eš#E fd#EŠ5Š5l•¬¥­±kkM4Xª„­X­cjÅl˜¶ˆ±�mÒm¦Í°ZM£k4#jÚ�µ©5[&Ö£ZŒQE,Qj+j+I�¶Ú66�­R’`Æ�Æ*Ú4bŠ 5ZÊVÒDlPVÔ†ÖÆ¡ �¶¨¶’­¨ÚÐkkF6mH)m…6Ú-Z*Õ‰6Û­”Á$ ZŠÚÁ´ZÛ±ªlf«E’­¢Æµ%TFªÆµm¶1­�EjѶ£V£Q­R™(«­¶Mk«`�m¢Ú‹Z6Å‹XÖ‚¶Á­²mk¶6£[U‹Õ™¶Æ¶5TmZ+lQE V±µQmR%Qkb‹I[RV´›h­Uh´Í­IUhª±VÐm£mLÉQ´¥­‹mhÕVI*Ûc ’µ&«F¨ÑUm­Wõ*ÔAV#V Û2Ñ�X­�m‰*‚ÔVÌÖ¢‹j-±E¤Õ‚ÔUcm%µkÚÆÑ&‹ckEZ-¬mcXª5´hѬj´[QVŠÓ6’¶±Z�°ZŠÛ&ÕQ«kÕXªÆ¤«FÖÑj6Ь•²ZJÑ«lRZØ¶ØÆÕE¢Ù*¢Ö6�¤µhÕbÚ)5”«ElVYkE±jű±QZÑm¤Å[&­DE¬kQµ�ÆÖ6ˆ´Z¤ÛhÖ¦m%�QRj¬Eµ�j�ª, µŒMš*ŠŠŠÑ¨µb­%&ÌÚѵ¨Õm&��¶(Ö"ƶ""ű¨Öˆ‹Z-%¤Ú+TU‹mѪf-hÔmccZ5cÛ´kQˆ¨¢*Ö-£mж5«“b¶’³6ª,Qmµ´[klb¶MŠÔ›bµdÚK[ÚØKZ4mi+Z*¢Ô‘µQhÑm�cmY6‚ÔTkmlVÔTjضM-Z4U�i–¢ÚƵ&¨ÖŠ4mM5±£cFÆ¢­Š5QhÖJ¨­¶×ÆÕVµ¯ñQUÿADB�D(€Q)P( "€¢*ÝAM~[kZùöQ¶AH¡F’š (Ã3[ )*T¥1fšb2BL¥´M–A‰bbhˆ™¬[-’( ÖRe&IK@ÈÄ©¦2‘SR“XÒ’ $ÅbZP•&¡˜L62�ˆ‰…±(Š4d@‘¦È&jųL †1–M�&ÆL¦,„CfRa¥D†bd™©Š‘&ئ4« É"E¡0¦`ÍJ›(–“2”%4iQDÒŠD¢hFŒÑ–Y0�”†Éfk6dÄ¥MD˜ÌBˆj ‘’I„Œ¤SY fŒPf‰B0˜ 0�ÑD1(P), F,ii¨… a%¦4#D  $‘AÍ (ѵ‘&QPjm™A”™RˆFTÔ…,DŠd”¢"”R`ŒÈh3$„ LÊXPD!¥&‘*BD�°²b£bR²)RBÙ45LÒ�d¬ÐD1e)™L„� $2Ì´ 6DÅ�40ÒÉC�ˆÆmLÑ!š%%•™%šLÄ1’&Šlb„a¢iI)©´Ò`PŠHl’C£$™CAˆÄC ,Å5i”±Ù•0cR€´fc!LeB(46dh4HP"Z A)¦°Ih”$"Æ)Q“H@Q0Xf“@Ô„l"BT””0ÚQ J%…“ˆÐ„£HB ,M4Ä "( HXH�D£0l²� ÐÌ”–(Ê"&CY™2Œc$`,ƒLÆ 2f½­VÛ}6µ©VÕ«Þ€hfa£2#@Á!&BŒÁ#0&a,Œ!$D Ø ˜ˆ€˜˜"i¢b@@�$ Œ”ÌFA€€È„„D#I ’(Ŧ’�$°€ÈaHÓH, i’€ dA™H`"„"id`"1 $A ŠF¥f !2Fc!H Á !! ˆ0lIDf,dь 0EŒ$‚!H° 4�@�02€& ˜‰Iƒ@Ê Q$ÃE4�0@˜L ÊZ`¤�ÌDQ’)†HÀdÀ&“ �È  €„ bBXŒ @Œ�R@ @�HÀ @¦‚2˜¤‚„$@@Œ˜R4Q€&B "A(À`Â`À„I„€D@†@Hb!&X@ÆF0‰"E!Bh$ÉH€$˜`"ƒ A� @2�‚@@@&F"%$’$@“0&$ÄC PQ˜™ $ Ò$)1&$`$€BB#Lš Á&H A�`„``fD�@ ‘PC `P    ’ h0D$X !�D„1‰š L Æ0@@HRH0À€¥C$„�L„ $�"ˆC@"%† $€0¤` H€«e¢ˆÉ§uÿ;ó„ý!þàV õ½¤Á±!X"ÞÓVrƵ£4m]±"v†›µ{ËE ´HÚ‘2"ïGg†ÖXúÄåöš•Ý;w΃Ñ&£™f7�€Á!„xÔ½ÊSN‚9Ø]ÆC`/EîØÞ½Ýœ"iHêÞ(µ yÌhÁ\õÕ*&ù,­@ŒÁ¡[èÀÞïLÃ+wd<º&¨ÛÁÇf§³V×í4-ÖïlXTH”;‰VEõÈ™74mHèí™é;6Ç aXtÏ tgGt<‚¦^v»�ìé¼¼=·šŠæ õžU óUtìŽÎ3µ¢‰\Ç í�²4Ï À…)FEeذ˜xk�èØ•†eXs�) ÙyÚú€a-jÑ]¶ÕÚ©HpÑC$a8EFá{†BBÉ�Ö]K˜ÞëzyƒÂ\æJžÍ ! Ð’vº*ëªÛ‘T×Éb{‚­Z%aá@ƒ‹Âx*2ˆ¦BSâÝaä=ËFsÚÚ °zì+ ïfh«·½M^mT>¡ƒŒî!Íæ—W\Î+ÙSzì–FØžà¬IÉ;ÀNŠ“‡xm¹YÛs�xÁUÕÑr‚w–x-hi�¤‰Í‰ÕÃ6Ƽ 2™Ô Ú³U@Õ²—óšchp¿<ã’L�•tj¬ß•†�ÙÊpb„ÐÊb÷�V9ÎäËH�«®œÐë2…åB®ñèË<7C4ÖRCr(=IÖMæ]Xõ»�ÊçÛf³µÏ'c±@ƒ{•5];†ã£¨mƒÄ…"ZÙt@¡�EUï@¹2ŠÆ;1×T[ MŠJíX'jögC¾ªreRLvL`Ù$<]Ü\Šb‘e�¶²fîÜÇprëGV¤¦Vk…‘‹ âìŽV.O(UÃN p"ÖE‰žÀF·À®ÚÙΙ¸ p}ÎE£"ú»ØWË;Л…ÝÎÍ],®ZoLêÁ++»6¥Á³'�v¢NJ3�+¸)‘ftcH�ŠTçOt_R ÚÊí¹É§Ã»¦ÊÚì«©Wpµ¥%WÜnFä×L§›%7Ö4áЮ“€õ:…b†:!a©3† ;¹Òã ;‘·½}‡°SÑŒÄ�IÊ8øX¦w6Ž ¾îíº©É©ƒ=S\»˜Ñ{“f¨èU2r§ªó…QBEëÓ€C„ÞÆpÙºM6²t=Ãcs¦3‰›@îÎ+MÙ±³D꡺O•wn³&&Öë62oh:xKų£r¸`á†V!¡Èè¡Q[·BŒã¬œÚÖˆLj…Ã$S¶òä‰Ä.v*Ý`Š�™,ä®í‰æìóÐú„ä^e½¬»»rºÎ¨±"ñ÷MN�8r›WÛ›¶ln«ÓÙ ƒ‹jm1‘Ý"R0kNm×egyÆTÎ�¼» úÑÙ£[–M‚2®©d®:X±8%T½‚=8Px`rIî]Ž.ˆ60UVŽËž©äS´)šk¬;ÊÙµ¹ª¥Ä´”Eâ¹z€ wA¾}P™8E1%\ÖÓË¥È9#LèÀ0N Äð*\Õ¥vü~y›†h‘;n7Ä/]ù““Ó"rCƒ%;R3\誕Ù|M·W$G7õïhe¥ÂïT±F’Ñ;rÄàVêRÕ|y:“4÷1Êb”ÃŽdîÏ'BU<ÀFn`RÚs®ö{PÀ³h)#{sk"éÏmo9‘·r5 È�Îlú£§k°¤Q8Ò®VÞÖŽíµš•È»xððc¤à‚W6;nà¡©:”dŠË5ÃŒ0E·J¸ |ß ª„ Ú‘yØäùœh´&r÷ŽõÎèz5˜ÓPhV |B®Ø³9yÕ5$î^5a®{%¼Ø«ÜEî€e ÞË­èMíËÓ|¯X¤ ¤•öM‘V·rôåÔŽÈîà´vT‰PTÖ#|fí b`ºã¤Š;œ(»¬8±Åocàð-ŒVû¦— <.QÜN’±™G„ÆÊ¤ /6ÏM�UW¼Ô2’-´TJz2ƒÝê´3vnºÞÊÈÙÑ€‹S- 4Š/¥Ðtg5Ãf:6Nà½tqŒ»4­¾’:AºÅéÃn«®c,ê@¾—²©ávÖŽ»‰Bœ3g´íeÀ.‰"Ö¤sžS«�„“Ýq|lP׸Ø-á몚©$žÔ™I^‹×(ZêÕs¶A› k²Ñ�2Ïnw.š½à36ÍI°é§Ì^ z¨hã¹CËd^ÉÔCzN�w3Û�#4Ít74T½½kÄ t¤�›æ ìc¥Û’<‹™›]Ö8§µw.6çd àp8ˆ$˜Ð�� "’@Ãk#)¦LlPa4Q‚ƒ„Ú$"XdØ@- l”C(…£YL1Eš‘HPŒ˜¤¢„ÆR�LH$“$Ì’ÊRɠѬTPˆÈ‘D`Ä0Ò#d Ø¦EŒb„ÈYS"f’„2H³3DIŠ0¶ceBQCDÂD•)%0’ÃJhÛJJ”e™bMŠI‰¦)KЃ,l³1R,ÉÄÂI$ÍŒF�ˆI˜Ö “fX,ŒYDÓ˜Uµ¤£(„›5(hª!(BS#K $AHÅ%!1Pa À“0 ¢Šlh¦dJL�¦ŠŒ™F5aц̤hØÉ„ˆÅ 2’¤šL(“(ØÄ¦iQ#1´Í0a$„H�ÅbÌZ„&€4 ‰ƒQ4ÉŠXÍ&MDÂ1I’ €¢Ñ¢€ÒFÌ™› ¨ŒF’d`Äi*’fQ™”Q£Q±±”ˆØÆBÁM A%¤@H’(ѱ2‹±$ €Cb˜³$(,Rlc0à ÉA‹4Z6M$13FŒ¤d°Q’ $É‘)!–0‚™bÄÌJ&$$ÈhM$¡E±ŠLÉ’QŒMIl¥+%d#B,Š` `h™(S( F˜’%¢IBÒRA5i1–ŒA!`¦6b’†% &Å,‹LÒFhÅ4ËISIØÊi™™›%44‰²Y3 (…dHi’˜„™F�`Ú(£@Zc%F�&BˆI i”ÓJ ÊJd´¦Ñ4ŘÖ%1lk)LŠPM¦(!™2‰ƒ –L“J&™™’h“D„¤CBÉ6S%˜"Jd²)&IeH‘DÙ‘² ‰6HȲ 2hH”!Œ$”ÚkFÌ6MFÆL˜´bÓML¢JLJiDhÉe’i#I’“%&ÔšLIF¤¤H°m’¥�¥šcf¤ÉJJQ¦ÒmI1²m%™&ŠƒR[dhHiHfJŒjŠS ÉJdP©&”ØSFDTYT„ئ”F#QH&RRM&²d²ÊY„C2’D”“ ɬ”–f ˆ�iƒŠf–m3(&D‰0e‚ˆÌ‰µ)$Ñ4%H™ ‰)’È�ƒe¤Š1�’i$´"‘4’’‰¤!J0”P¢Z)FL“b„¢ÉY0% Še¤ÆD²�!3%"ÄÀLÙL„P¢&Q&Åšf6)²šRLšÉcl”™ 4šKQIHÆ[)JMfcI’ÒVJ“$–Ê™c&˜i2fÒÆE3f³E”b-ƒQ¶E$$‰6M)’²ŠY1¤¦ÌšD�©K űE&Ù2I’F£ K2À™4ÄJY1š’Á†”ÌD˜’iˆHf“bš�I£2† M#IŠR$J “" b6‰ ,1D,²JYšT�c3F´IŠJ"ŠÉƒK"ÄE�,”¢Ó3& e&ÄÙÄÉ3R14¨±P¢±²JlQYDÙIdBlÍ&)™5˜eRFi$ĈdC‚312m$‘) RLÉDY1d¤I)J2’…›I02S$–3I�fE2‘¡&M$Ô"$Ù%$‚dLئe2JM$DÌ„•2 LIJi"H¨iM4ˆ›0ÊHŒh”¤¨’$¤™ŒaBL±1EDÒhÒL£%"E•’2™REDfI¢ŒÍ™¢Q‹ PÅ)  ”S6PId¤1¦Ói!$Y™ŒH‘&Md¬–i°””ЀE2L’Dfm I%,’‰““$¤Äd‰ H’)0ˆQXÓ$… £fbal˜ÑLBDI²Æ)"@ 3*2L‰,$2€Æ!d›A)À6F™E�B˜²‰ZJPÊ"(Ì0"E±°ˆK“$¬˜ ˆ¡A„ha‰–a” �ÂQ2(¤Å’$Ø0)ę“2²”EQ¢10ŒaBF"Jh“@2QŒ²0ÈÄa–I†””ÈD‰ŠMBC4b#Q’BHe Ñ™3Ìd™$À¢’L�Æ`˜6�Lfl¡I�!“°J˜Àk Œdƒl¨-š…cQ¤ˆˆÈ ‰“$1�‰“ �c "0™6iš(Ò‹,[(Å�”ÌË@ €2L"&e ŠJ4™&j 1&Ñ!Fd¨a’)4RhÓDdM E!dЉ‘DÉ,!±´IĆÌÁa© &LDˆÌ�̆1@dÄ#D4@ $¥FÑ` �FIDŒÉ™&D@!#Q™"ÆJšKm"0Ú,‰$&!³% $1$“@‰`©‚eC1¦$¢ÁŠD%&1¢B¢YŠD¬CD™’LØ)ƒJC¤Ò-†X“E@&…)‰‰¢"�B��„Âlf�Y d™T£!’b‚T‘’�1 Yˆ Ò˜Å£L´Á‰2J!Š#©�ŒŒSI2H› A@dÐÊ30 BE˜š*¤&’1ŒcC)ˆ05€L$B&E X£’"Ñd1�" hÆCJ2‚¤Ð�d“I Ì��“ˆ²eŒhÒL™”¢° ‚Š4hÒ�XQ(ÄE%[Q¤¨,j(Œ ÈÉe šF&6�¦‘bRF1L E Q¥FÒ),cdÔ”F‰4†# È5  Ã0ÌÖ(âIC%cE"j$4$¤š4™Qi ‚$ÌVQ™f�Á ‚ $…™ŒÂ#$�5@ÓFŠa©š™™‚abX€Ä@Ñ’H`°3RTÐÛI #2Á˜h†f4‰dĉ±�„$dÁ” R� $Ñ“I¦iÆÃKEŠ‚‘H‰�’2’BFERÆ»Uí¦˜¹¦……®Ãšs©v‰ÓBÕh‘"tÜÖfÖlN…XЬ6x>°5­Ö:èçSÑ: ÝÊ‘Ý}»�dØ*ÉúOF:§bL0¢úò”àxÈT²@àA!Ú d¥tm𼕨3Gªôj¡µ“5•Ø;=Ünß‹Ê"á/l¼�¹§�ḻá|4Î)ÁJè§BÅõ 7,nÕQaº»Êq+¢„»Héê«‘Ί¾’ç9—¡‘�™œ¬H‰hðk7»bßpª{ Ž£Ó,š™xaÁSVvòQá½Ûoääöb×”2‡ Õ×›ÃNÚÉ)&Â’pËÅ4 eùÞwU°M×qáó8äÉÀ<§“WÏ‚eTò"¹Š€íp¾îèÑÁ\S4.¤v ÁÎú꣊íî6 C"«‰*`>b£†¾|F´0MèÄç Ø€FÆ1G jº‰:òË–D n3+-L'½Ùš3ÊÐäÜHàqÂjªºÙscu1UEÆämÝ‘)ÞdµÄe©RnaÔÑc¶hv»FîMm+ÂróËÆºåäÜ‚ø•Ñ$yÜ0Lmt—™�¥Œ O ìu Ùîž“£IÉ) *�ÊìX.Àt ¾w—–�pÁ6d0�§Âo ˜éÊÆíÑ�;„ €‘z¦ÆŠ!š,‹›ŽÆÝR«Èá”$]sVWug>P-0h†pIFµ²Æ StFD’î{Fuï  sá»a ðÍÌÜÅJ‡.rR+ƒå"ÇD€#±‘z°è&êdX.'†>‘Aåã´r¤êÉ¢(7« JRñ‡40ÃAô3zÒKlqdÐêUT†l!—‘@6+í<ÉÎÀÕÖ\Ô)š9N®SîÄ›‘Èp;Y½r'avªö] ¹ÓÛÎú[ëÑw°E±Â¶FkCHì» ì­¢ñŒá�‚YA é÷oÌÛÝ´…æ1#¥€Šà©föç ­ ‘fˆ"kmu³B»·�]¤:&A®éá³Tn”­V,VÜÈ]5çh±Ü¬*Ðñr(^©ë‚4"pŽ“UԤҵ|­u'"�Ü)-rí�ñeTÀ#¡W4…ò›æ‰Ä PUOE�]tv÷(Ï9A� 5µ¦3ž†�hoV\…K6ÆU[˜Þ3d›Žém /N#&rò:Ý H[èÑÔy¼Ä•ȘÎì£f8¾ÙTº„1PZ‘gRáï -(B°N¢‰–¹í /¸#Ýb„»Ä!–ò{i‡}ÿŸ¯×þ`ŸÿÿÛû¥_ª±’U+úgÿÇŽÝÁËAÿ‚ d©Ïÿγ{ÿªßóâdyéÊžª¼×r§s›Þ§?ÁFýs!¯ž—¤Yodž�6T»t&�4¹õu7x‘Œ L§ð˜,ÁH]3=C�1I\ÓçNÏ£ ¥;ÉbJÍ^äDhÄ ÿudNQ=Ü2�¡–BŽ*!Ô"TiÕÔµ=Ý�Áš9ç°ÎH�As PwŠ˜¤Û×n»°‡eUì;t7ufn” �ä‰Ùªí¸¿ì$¹7œ/’Ò&û6/œ¥80Ñå¶,Ì΂Œ4žuˆ!ƒ–9Ýá`Yг‰;§¯482*†è9“h\é•¶¤…–[7 ß’-S4T¬Œê ƒëµÌH®ÈXB©�nˆÄÔݽÔx{Q¬ƒšêÐú')ÖêÑÓñíØO30_•þáßýÌš#ÕÊDZ¦ÄU‘±WÃžÎæÈ}dDS2W¦[äÂþk.¿Þw§gÛ¦amÓŽ —gNJBÀÿ˜Vsëßüóç’æý}+392'xwmã…>ž–Çä“5N÷äóò‘ð–e°x��›už¾ÑªåoÏh?_¥Ø’ðØ-gÁénÌ÷Ÿœ·nÊï?L •è¡ÈI/Aúö²¬yøL¾_�+OÖ9¶v€¥¿RÌÏækˆÎ‚pçİ~wåÕhû(Íý*Ì(<õ!¯Ñ¹¦6IRO‹uWš”ÈÇñ®œº6|Sÿµ+ÄÈñO ?”Ìf›98ʱÿEÐ�É™hŸ“gÝ*1çÈ·?¥™2¦—¿¼Àj¬“ꤺP¬üå]�Š©�ð¥J¤Qþ šÒ‰òQ?�¯ÙRÜ¥”Õ)i�ý+²ÛíD²–É�Ðëyzo�÷,Z÷?õ EÈOó¡ÿuäâ Eâ‘/á‡F¶­ß»?»£wò²dQâp‚Øalš©štuqD¦Pæäóvš-<¹ÝßGèûJðùwM"¹õ×´¤UK{+ÉÉvk«µ®æ,‹ùÝNÊMPód>WG=,IïM%|~9ï´ýKÐV¤9þWµéÞ/?‰DÉ“MÈŸìpÐ¥òÿx¿bÁgøö¤Þè¿•cE)™ zË`¼¹µ_™¶¥¢ñ �KÕ®˜¼i–Ôý±ŸÖÙõݪ¼ç݇ì_Á� *=ý<úÑ™læûKåKSýN/Ü…+Aúñšf0!Í�”ðÅ„Û W3#'×ûËÎõ2R\±(•m èhPJ¦z6]¹š)íqY ˆ¿ÅËtF^xýçÄÉ-ý\ÖcÂÞ öX÷ü*ÏO&ÝiÌ‘t¿}ζK~§Õ]k(œ2…¤ET’øš$ ù~§ç·úÈôñЙdOˆBÈþ„ŸÓ½”–jþ ö³óöÇxaíÁK¹][vT–Pô›Éb@�`i+•ž©*Y�P6i¢ ]<ÉQÌ7új/Pi½œq^’€œäGˆ¢Ý² Ži\°Åþ!…ï›u²GËÒ_[\?‡ïÐ�Q¤�?�âåÉÅ!Ê'AT%9NJwÂ(º³ž,UÖ'Ô‰Éô£·ñY›·D'æé›�™Ñ Ô.Ü׉�e$üõ4B ‹Ò Yeª ¨ƒ·p”á(H&™ñ-Ɉ‡šÖÜ’Eœy§a&Ò/Ó±At³Ö'YÉeUUqu«À�ÄŒ÷áÂýã'ìúûCÍ¿ÌñÂ�Ÿ.[´Y·êKjX‚Å(0Þ­uÒ^xŠ@d²S¦Šhn|½'s^ÏÓS®m@ôhþ)ñ¡Î¦A">Ö›zlÆ}k-|Ñ ‡“úAŸv†üÖOø¹™µä¥4¦SÂL’Xö°R~C®�Ø·qìæÝ(ñê±�ªãT>uÀÌ� >cRQ}4pxì‚2Ë&ŒEŸ¢ËV^dº2dˆöB”$XóÀû³žÝ?ÏËô@â<1§ $™ñ�eL¯ÝÍö]ixD–ÌÉL<"úÓ}F^ �,3{ k•ÖW;Œ&?ûäÊ&÷ÀCçó6m|^iõN>Ìl®M†n±bi<9QIVâ©v½Q°V@‰kH²êɑ劈.¤Uˆšœ÷ Ô}BýS$œÌû�}£"Ré-v»1fÒ+HfsçˆôÆŒÌzL‡‰>R2v·Ø 9j©ÙOÓf (~‰¿ðá²OÊ}Hð°cèþNú¿;Ãõˆ¥�GßÂ�™wêÆ”‚ðG†Œ�4�ƒfZIËÃ!&Ö—*0ŠúP$ý§3g$.Qé·èÙóJ�5Lz´:N’ ;¶‘tÒU;¬äÄ�*`Î3YûXµœ.ŸØ­&Q\L‘Þ\i‰%ÚvI§wõÃùy_4Ñœ ™„ s�Ɖ9<óÏ¡CWÊ&.ÔR­N"][ŽòÏâ¼1žy¹RyÓ<žÍ &öñ6&D׿ëøÎÓ¢vƒ®Ÿ^X´BT`Ï©¯‹þi)"iiϤ‰¥êVzHjv @}M{§_¬^W¯ fj‚éjïâo\ã\�H,ÖœN*¿i°EûLjª/²su²+}(õ䪙:‘Ü<q$£;0¥¼ÈC]Zá j¦Wufª  ›ñ¿ëhÚô]/**}w¬yKœs4Îw©q�Μµœ÷exl¬™Ç™³¿[CM:x… aÊ#î˜`‚@>*RäɺmK–¤¤i ¢»Ö–A!=ݳ’þdO¾»5ù~g™ià~íÈ™Ô2…L©!üµÞÕÜ/é²=rÝ›¯?¼ªö^Ç´ÈÄ?Šõ²~º ï?VçÂv†‚‘楡ü ¥é{WºŽ¬<Ú Ayô·\ÎÍM3•rêgã˭ш4‘Kîuú4O�²8Ñ4§Ä“AdÑßéÙà¦W““Uåi¯—òÛ¸dtÆ =„evWÒ;âá!…Ú%*lǦ=^²¾hI+o®wî³sį>ó*¼öÞ*cH£2r̃õŠD’/~˜ß«_3ÓÓ4Y+ƒe›5&RrÓ¶Aà�4ÉŠv­Iª¡‹ÌóZ¹Çö#ÑŠô«òz¤ú]ò£`‹!Mó‘‡ó–ú¾µUx(ÍÕ�ßeùb]ŽZLPq3d¤––ÉȾ¬˜ðÓ^2Fïá£F÷gúŠøð׋J ˆÓ:PìþùØ~Zj)÷�Þ_Öo,\¿’òú_åzÍŸÎ/»£~¿¥¶P÷ª~µ*R/O{ºúòØî,™ýÐRÄLßü¨VnÊÙHÙ1rw¥ŽSØ §ÊJ4q³hüë0U'Ô�æ«2j †&[>Ê ÊmÀý¿G÷uMzñË÷h‰#~.r£oÓ2‘¤Mš›¥7ø?ÇW©óá¯ß ý/_;PäÉ÷ÔªÖjYÞýÜh¬X¢™°¼æÿ2*þ¿¯ïâÁëÅa‘>‡Å©º÷?£v¤ë³¼)™*ÒÔlŸWFá/³f¿‡V�<1`¼‘¦– È—Å�ºhXPôóëåÝ FoµlÐúè¤ré!`”À_:å¶AÔÂÈ_Œio)ò{“�Ï”à¼Q›³(áD "%”¡@ÄþUÀ¨øb¶Cú>å}£ü¸PÒHZ·¿u˜L“†jàõœ2�GªÈ!7j©·‚sp„m¬®ƒŸã„ü~Ói;ŽÚSZ“´Ö1˜ýª™Šû+­[�ò6c÷jé0BnMý|ù?ðÇxJ�k¾ÐE‘IqßÀöå*ª™å#›úº þHÞ¥ûõ;`o~‹² ¯–¸�ÙÌ ]D‰ÝËÔ΀²iMQ<ñ>ÕMÔªðZ«žîmª»~A—”]Dñpî‰* ²I!Ñ4ÚH‰YÈW{déëÞL˜³ „’Xä³…ÒŸ¤!R¿‹|]¨°A0+T~¾“1Ù€�âB‹"‰+¹æå{î)wlä´SÊFcnYcNšˆp±$$±.a­û}­½^ò6P]!‡“rBn8M>)I5¾òJ–Ì(œXFìæ°õ3(Kñ´Ù„}ÏoÑsž¥ƒ³òÂ<šu>—*é ”¨äÑ]^6¤ìë(Ï\ž-CÌRòjîpÜ[«›[Fìåen®v‚鲋"òš¶”N™Ý8•Kô§&šñxšw]VG4ý¦¢Åoו—K)‚Rv¢BDåÜ�x˜ÊamØ£¹U̼/l]­ÎÊùÚ”æ¾ï H𢅠!zã ª9zõlùBh²(—\‹!"ysÊ.¨ZICGOi8coTfsä�¾bCíÛŠ- „èl#„ iM^»´äîˆ}=îô“›Ä4‰t€}¡óö™™LÆ™ÄDQÜ58òGh+Nù ÄÜêïDáÏé�+M“¤4á<“ï�ØS¦¸{3¨Ò¬Œ¦têH²ü VwÒuhœ4bˆÃUýþf"Š Ú²ŸãÉúX2³ëéïÊl±f:T&ØðÇèÑãúùQÒö7¥—¤ñ­©]¡Ô2—øÐ˜°ÁxA#¹¹øJ’#<úÊsL E-òë�½¯›¯kÀÂ^ü^9Uº$][³òküN“Šj>ʪ ~½S2Aó>–R viJ"I“ËŽx-rrHV¡‰VêÜ“ÿj~î’  ÒP37Å  ÈtÄÊI{ö¨R³ÓÍzW|ªÛÚUãðîNþ=UMîÙUu÷-„pïû 2©¥Ý.¼p̽(Qîéߺ÷1½ZgN�¤vJH!6‹Æ[ﯛ«Hš5sFÂÚ¿‰Yê³*äìþª¿¿¢=âÔAC‚ñ À‘¡N�Ìá†1|$E íñ³cfžrõ·* gñÎlo›´M«ÏónÐ>Ž5‰ Ô6ÅÐ3õõ¾óT�¨ø#ó?½Ã…¼\Y&JI”¦CJK3hO«f¾¹H“d$ˆ!‡Çî|9ù Œ36œ�»Äáìí(i2´D�ª¾÷®bÆs+a2ã·"µhÂBH'l¶~+ꪉñ¬)\¸r~ˆ?M—š·‚²Êr¦E0ð¬A�ÁeBM6È–cœx}zuJêjôÑçÂÙQ¶‰�“çáù8?{¬ƒT(>nýßæX3é#_«œ�ÛoÄ4³ñõnÕ1i×ߤü¨[”ÏÑŠôQŸ_V›Ä$¯§²¡¡ò•äß]Ë£UjJ¶‘ž9í1hºø]Q‹-›mQX[«ch凗‡å–? ÉãØ>Êü)´)¡I|%Ìç»üU’GvTÉZ¼jwû¡-/¥�zv´ˆ´:�‘[2®aé1¬*¯XÑH[J«q|S„•*@ÍBõhÅ„¬ªèùú�ÅÖ¢eÉ\y&nø[œt0§„œî¹X˜÷Õ:hÇgüϠ­B_G+@øÅJÖIôœ5’Í©¨>gÊN¸iLx”“´[øTwÒB—7“²ó¦£/§f°« Ì´–ܘb�—¥¡7Fðk•8#W&ÞY3ã¡õóY<úÖz(ÎçO7íù«JøêYb¤©')Ùh?•1@µ`¢Uš#É]ÛÒ£D3ÿ0|ºjB¹*¾[¶äOúéU{æ7tJ#KÔô¡4r^c»E#´¡¡«Ùø­èd†)Í@UËíù=š£1$%;Ó¸~õj6·J%_¨�4íÔ�“%Œ±¨z›0�R•l<ϯuZ’©Ú©5³^æÈÃ4‘Òæ×�t›p”£u9y:þævuÑå.SâÏ,ù´q¥^ºXD]b(=½®[n€@Ñ�G빯uëäÑ¿~|J¢¹ûkjžŸ‚JÐ!“NA~S¥h|]V¦P©A°AšrE)„Õ)ª5eéÛ¡�\ºkÕדּyåIyrôRÌçÈE6IÓIpîwš ¦(�´� Ÿ ,ó3Æ­Nòª(WÅ1fË4d¬Ë±U�þ'=þ^Œøzz�ïአáðpºk ø2)WtåwÇPgÀGj¶„�Ôë:‘ u‰ÚŸË³Ù£Ð—Þ‰m‘viªM]Eg“ƒÍ sFF`N V‘m(TØÒÍœ †rÙ{·"ésUâ(åd£Ëy]¨ÒOιÓwø´áhø`#á"s”Aë» T–d‹§«�*!&’Ðóš$ZC‰"¾  H’=¤D}%X�cj(ƒ"B0Í -\o[Á¨“²ª9åkR§sá~ åîú{sÝÛ|·Õæ™RDMÎ/*ôSuBIM §vªÚí VL­¨¢ *ÍáBaÙYM/cT&Çrst”°�*¬owI¬Èg•4IÂTcQ©¤©&ñ*O÷>;ç½Ísò\ø¾þ¾ÅçØ×I1/«ˆ÷Ûéî5æ¾ïv÷u™ñß_[ͼŽXü›Ë_EöKÏܺWÞ¿F¹æºC²Zì§Œ´„3T=g)h•*7Šc{Ù�i7–‹ÂQ5�qÚÊfÛbÙÂHZ…mHêIÓ$À¶í¤1…u¨cH„Âű)Ã$´‘Þ%§(Ñ&÷£1v™ƒ´©*žç(¥$$“]ê´K¤aJ1'[MDÒB …4G¬l‘©I˺pÌA –a-o9pѨü~?_|üvòIÝÍö‹åæÌ°m÷MsóséÝóÝ£ñøíåÈH²!“BÅÞ!Ó ¦„ÕF!è‡BMCeü,ݵù)ô$,'ð\Oçææ¦£ÖË$Pð 4jŠ ’QBÊ.Y’™B„ƒ�Í<ŸJ =×ãPŸ|˜|1ù–$ÈTÈ›rA!Š¡'Ý#ž®uÎ2µ gäìÚUµS†Ô·jÒ$dEt…x7Iº€çZplÆÆÍçË|¬,*eFà¬�±,ï»æ]lY˜™2gz'R(ÀÚ’íËœ„Œ´È×3!c½_C>}*¬)¯]~_ÁG$2OÖxDzmO{î°[LÕßÔÕnLÆ&ä¤z?R/d‚Íýýy4�œòôÞ<*K!䦸W%…†öâQmЊw âü7fAçpþž²sú�‡>È82N«6~MTé�‡­¸;2…ßô�Ô•ô‰°‰2{¨eÙúñÙ`Þd!¿ñ©Eœ”ÿ‹>¨IÉfÚÕZÍ4Q Gj­¬cº®mb_Æ­"ûõ�ÆÄ娗ËÅlØ«‰ ¿uVg1NP �ÙjÙšS«ÊÏ�üÝH®jüçéxçX)†ƒRݯàÃ¥¢ 6D´R,$u92™D @m2ŠgÉR¥ÃIE̶QpJDp A%0~I¤š‚?¡VI’ƒúæ2•‡„LIƒðÿJ¦ä§nMU6Æ6&dÌ¢D¬¤(Šm©–fø©Â$¥ÓhKŒ ’Jq9,§ ›RÝËd†B"’‰!K �h#î¯ßÕÍé –’M0î‘o-�DY†&ÚràÔ³E�ƒ$[É�•§� ?.Z‘ƒýLÑI²Ì¹‰_%ЧR¡öi™-Hf l”ÕvE «ÉÁ!JGPL¤}bÒhÑf¹˜’¥½K³h*$¦íÉ3A"HÃóŠªìªT—ëÓ È#òV"éÌþÕjü`Y²É~5âDÍ&ôS>~HBm"¨/ŠB¥R™ò©Ó‹L3Ò ƒMAŽõò“š)M’çôýc%ü}Ï‚‰#‘;x.`1Û¾MðIô{MòÃCãÆì)5>#ã_ƒyNI§P€‚i™”¥xZù²äF �þ*õÏ,3¿äÖ k=»MN…J‰²>›õ7fŽþ�ðÍjŠ+Ùºm›¤•’ˆ·(4¸ˆÁìÎáÑ%�¡�Í3 nDÃX¬ýš¨ÌñÐ)hY~Få3ñħÒl½H(¨¶ˆ\A™ûC©¨F´äÑÍÂ˺HKiªµÓõÈ‚â²ÒMEeõ:ž)EŠÚJ$¡’šl¤±gÇ.è€teEÐè=¶"UG%8aƒF}(ƨÀIJ§í@’ÎÒ4ì�…³–tç Ì‘Æ.qF¸*úQ?(oãÛCåGºÙ¯¥ž_�fÑ'Ç¿Ÿ…å‘§íóGmý4š^x¢Mt‡g³–+"a,©JUÏ•¿fsÅ›!åI|˜[ì¯]fÿ¸î­YA�JŠÜ°ðÙ¥¢ãò@ˆ!G䯩«øóÇDtú®Ab‹ššqjJ¤ë0~ Q¢w Hz§ÞtË¿'*•}Ëñb�øh´ þÐ=3_X¥`Õ×ÈùûN6ktgþ‡Hg¡(øh¿ò}|kã&´ìú8-)ÉÛž£b é— þn\òŠò‰´‘H…¸¿ïwÙîHüßîÆ‘÷÷0¿?§¯@`Ê@’-"Ìú§ Hž!0`‘¤ ÷W$Ö“>yb4B޲È<£xÚ¡Aßóß/¯ÏrâçR_ŸÇO]/—Raç%û—{íõèa_§oµí/ŽâÝÝ_ ÇØëïë¤ú9w/£“2ü—ê ìò�¹ùôO¿�Ë…Wåÿ ÏÂö¾•Q¶¦0æÚêf{ªˆUÝtøeÞíø;s¡àXÕ—u½w”7j§��Ná�·y2`Ø�Ì�¡@B#4Ìàµ½Ž³.ndiÝîø>y¾ÝSU¢ßM‡Ù£3wC½%b˜sb¨uíh)ÔÐk…P­ÑÄîÞ}®ìð<'o�ñ×€9£ÆórÞuò}µš,ô�¸1�,ž4®Õ×G Ò+S:Eâ¤ÁC+^R£KÒbFij ëÜÜ™ÑA„ V6d™µ™»u½ˆãÖ3MU$f\»ºáÈ œàt9ëÑ™sI­2ê$KÁŠa;ž�#kžx1Œ±Úç¤T$H"jl˜ò3b•lÕTUpâ$MPº»;×o+ª¡Z.ÁËì �ð`ð3*æ-]nŽî­k¼íÁDQD‚L}½;(kƒ‚Cvì[fl^[Ó}j†ãŽœ¸‘ÂkGH²Áb¥Ó(ñÁ`ܳÖ›V«©u²°æpõLDÄ„¹Á·ªxesWgðC(ê¼\+‘�Øp ´.ÄõOe® æ.éÖÐW†èNUãÎL‹ƒ[¡Šl¶�Ƀv–ÚÉΘ 6 ™Ù´6äo1#Hʲ3S õô¡„Üò�Ì­êí½þÌ`¬äÆ Ð2A±BÎPès¹#+WŠr`áv)=S³=·¤‹º•Š´á3Áe+îªjhad)/!èÐÞPÇ’¼¤쌑�”:MµäZž.0; Çîb»2Xyz<êÓ« _‚¼9r,ªð!·sçRê µWZ%]¾#¬|œ‰Ðè,c�—®^^;âå&æï›’\íÎv‰Êª”åðÉŒÐsŠœ¹ã–vl]Çi}WK°<° Y+c30eéé°pgayÙ¯BΕÌð‘Ü6Á¼àë,MˆáWi�àÆ²Ðae[H. Ç$i)a9¢³:;* 8ðÜ¡q‹�A1 ïi[iðlq�w#Bƹ‡…'™œ˜nY»¹Á7Âî ÐC]¨í\+%ꮡ¦‹;´7¦t …wxÓ ˆ±rƨрð¢Äâ�£Â XšÄì‘Ú*‡ Õ³Ø,gmœ�¡‘lª©ÅŽ ŽÕ„¬)w¢®0:×+g¯•3Œ©³Çs'!º‹&c(&ñp�ÑÚÔ(í4%‚.B“IŠ›Š#xÓ Tƒ ¢éF顎{4‹½¢«‡P¡G¯SÁS"À1¯be¤wUƒ0z6¬h™A‘\¬L\×F‰ã@«­e oeÕW­.Aë(ÏV�8ªù®ÑÂÃ8nº49ÁÔR°¤Ó“W»TÛªöOVmPÜ U’^‘QÊ4£”jº°è'¯³+Ž”î�v¸ÖÔÆºw#*òì;°ÃìCC¤(œUÍ1Yµ¼+1ƒeÙÁ»©PàA&Ð&¦Á§MªŒºÚ &:±ê9Û¹†]±j1ÙÁK… l™™ÝÜã4$‡€«)0²JC§W›£¢çd_Xa̾›+ e·60D¾Á9W•;O•^�÷–_U`4 (í¤6¦[ ܽР^Üñ  ÜEñÁˆnM (X;cöÓgƒ*C¯­‹�,æØ›—j‘” ,«‘b¬Y±6'.„èp 1YOèØ7¶õ Nb±aŠ 5�ÁÓ‚À[–ÅØ6lwmKH0yc UP­{c‘µO·dk®Ú«Õ’^ ·aÎÞ]p‘ËV™�Ù.˜’«‰ÝµÙ‚ˆáÒ;­ªî‚8hH="È0fÙ:{„9�íé3FP±œ;h›pº¯0TÖÕ‡Ó0-b D·|$Ø#*ß Û¤e'�zjhæp_ c*æ@È7L1©5I 5�"ëp-«î26ñޤ S×:p·Õ–(M÷1Á,$V2BÚ1c;C™ l;�¸Öóƒu9Q3‚zÇG.nÄà�E­ÞÛžcfrpNêXÓÓ¡kc ….·J ÅŽŠ!á}„¢SBÆááòPê½Z"TCš?¨ÓÂb”äù �…ã²In #‡˜6úGw )tÖ‰�!) {™ª@ �`ƒ¬ôM®§aR]˜zð¤Íæ.”…H¨Â¯{¾Æ¢ò^Þ]¸£ÝuwšÜR:ŠB… ±“qH†Šàò̬ÕÈëT2Øbµ¸æ'ɱ–8,”,ÞÖß[½�±¢oZ‚p‚ƒ«5ÅkeJr† a  n@i—mX½M˲í†tM¯±%• †hê!“xêŽÞn¼'�©|)™Òç%QPT'ESë¢õ‰»å¢¹<.-pɡӣ+L‘›¤ùM�Ü&+dÞÕîám Ô Õ«Ø=Ö8b¡hTÐ��t…5yÃrð_d΄4^åoKž€¯fß‚ðy£Bªî�ç^X0VNC[ç˜]�^MoTÎ…äÆçš˜z6P!KóG ºÖî†[‰ÜÐp]*’ibHº Š�¾ŠÍ¬›“ ð²¡mê°æv{dNŠês"ÇTdò­¼�h‚w°ÌrÕM®êÖŸ ÷.AææqiͦAݫÙ7`äëN1RL¼M†/:�¯t𱱑B—$«F†Bu`F…©ã¼—•†Ê]£…T±š÷KÀî°ÒŽÞwÕ¨¬UŽUUÂdR hVÂönû…7È^@\jmé�+0p•Àk¾¸8v Ǫéì+ÚÀ’[‰b#Dœ5Šs$`'º[»ºH7”.G|Ó9|s†Š°Á*&ŽÜQ…¨ŽÞ[7�qv'¥�'.ÖíRÉpFâ°SÔ†¥TB½“|HëÉÐ0d^YdšÃŽH¹7}/.Öãæñ„,fÌìÙÄŽtá�©¾Ì5²´õRµš¦.øb—06dM �Î/‚B´%L-8QêC3¯;V0i`Á!C¤CQEßtÂä&ÝØt62Ð+€» ­¸4 &ÏAá(Õ±‹V‰C�v+† CÍÃ#B1äQg^Kyv3Ä¢MøôuåMöIÍt®£ ¹ÝºpÄ+¡5<�@PÚbÆwžH-è�r(hÄ7höÐã ÞÎŒòìUØ:;€pì®á“CnÅÚ2î8‘Âe‹¥ÌIÃ"Í{[àPr'u±aVï ÷bªCÔ±f“º:XÙ¼‚°.ë:ù Š.‘"©ËËe̽ذ‡SŠV-06Ål8Ûj0ÃÐeÝo8b늕”Ö¤‚늸\G”ÆeôàëÁÍUhãF²6ç™Cƒórï6 7Z°¤yØ 03‰Úm Ú–<Ê…3cEì¹°žÛóG�ާ2¥Ž Ç­¹ãÊ¡‡$MÜ»îêžÔr¦Dè:Ž F6†] ³©pML`3"E\Ü�ÊÑ;rUáUj¬‹:ñ¦Ðè9jpŒ9Ø8ƒ#jK¥]±œYT2Aº_ Ú2Þ ÚÅ]›ˆ¢’¹NðZÆ ôP"l9u`µÒCWHk#œ›óÍîç�ÁaXšòs‰Ü›” �ÊÐÖ^íž9›¤ ‘£k»7&Q�FéR-bXèh¥Ý4 ‘=Ý� ç é�œV ØÓ˜;+ ºUKE‡k½­èá},pαgDŒ´ lQ1c([ê²+2±ù£\ŽA�6EÔÈZÄ¡|Ö†UîÜTb‡š(âäèÞéã*+,pé‰]ÆÀ$QÓjÈ5Nfš›²5bê¥WrnMéãÜÌæMhR‡TÈzÔö™Ì´²jä<©Å>´ÔìXá5½\dVÈɾ f¬iËÚ¡ ª­ÑR1­ÆÆ©ic¬V)p»}YÊ+ªîÚ®\ÉÍ� ®äe™¡"Tí¥µxÙžÄö(�MŒÈ›Fì;¬æ\HÀPÙj™¦VÊTë'Z«™ë‰ªzp�–âµÜ,OHÕHHØ«åKž#}-}ƒ›®Ñ¬Uë—Ùµ‰¬³ÎèTk¨^[žr8eíæÎMJmc¾±¢q�…öñÑk¢{:w©r“Úƒ„ÔŽy»YÛt2ûÜî¹¼O3bÚœs£¡Õ-w9™‹BÉÝà§\ÜÅk©µ„Ú­ ÷¥M8šc2¢z³¶Ñ|lmp¡2êdÕGS„À¹�FØïz³°ÉÎr³³,©Äñï �ÛÅ6…u—…ÐBÛž²¨9 ;7H‘C] ›Î>UPó2¤‡åAdóêIò^$·L‚aH¾q;wc¯FÝÏlÑÙ$šM´½Ã‘¸ºòâ!=@{ÄUWŠ¢&›ïÿçýãU©Qå]›ó‰¾ ®Ý±Kµ­»{åÙ»¸ }?ý¶C…í�Ðb�àU4t>¼†?À»Cû?? ÍÇYO²aNLþô?s¶†ûc¤ã–צÛËɼ9ÛwÇaÜí–†ónž-‰ã]o*ˆó�ÿ·ï[øïfùð3†x3žD 0êº-pqƒ?XþókQ!ÔEE»¢.žšŸÕ“]?sÎ3Ó^ü_‹Zü²™ož|±ì}iÙÀ:—ô AçÓǪß#‹¿·jÖ=5Þ~!Ýu® v-ßÖòê^÷gÿ¹'Z²ç�bÅsÙ\ªÜG>¸A§ÁO•rTwowÓ!àvÇÃòòÙ£û¾ãÿÁ"¦kø;q6ü`Â×| ÜPTíû®1ë5XVïo¡û;lÍȮØôv|C×Þ˜}zú ±�ï=:$vÌÿ9mƒ’|öÆÙþ3× ùçÐ]ùÜç)ö? ×dbCÄ*ÑQç¿YZOÕ9­Ež#ó íþ#‡8ïÇ–¾ÌïãâÉÚé]¿ù>zO=¹d¢Mæ0Ûh¿ãÛ! â…X]ѼíØ4oËŽ›º {7NäÄmNÝoÈãŽ' Šj™<�‚JŒ¾wîÇ}g^�#�åŽ- ®_Ku§GÐâ£j´0,ºª+*£ö¨¨ÿQŒT7Á ;LJ³6Å;»‡  æÓÜr<›¾`C3��ÿέÖkÙyéÀcE¾ã nï�œÏ�: ÓëÈ1¾8' vÃ9Ù;ý7£úû>gg™è@oí£ø|Ï#sGÔ¿Éuö,>wiiFúk áô€zxì±Î¼»jæ¿Í9Åù ŒàêÑü<`xzm²ïعw‘Ó¨hã}ùåT42|‡ Kîè蔪®€“zµmÍ÷«Ø½ŽºÖAˆáîÁ?ªHÓÔ¼‡ pi�—ÈÜ »·<þ9Ò ë€Î¨?5¯hÜsá¬óíåÔØƒ�×_úúóå¾Oøm¿•áÞœÍx~üé½O»ÐÏËÓ÷®�1¹ûÅúûÛ~˜ë¿26 wåÿygqíà}êòØZ8î!³à7¡‚IÛA¾gf5è^º0�XR¦'å ³€sÛ–/‡k¯®Ò㮲0^Þq‘Ú?¼„¦Fðב«xþJü4|Å7àËÃEn½¼îug-Èdzq^–¬ÿ/_é¼O·{Û±náÓÊ=¼šPl£¯?V¾4—ÐïG€Ó¡BI#“dÐÿ]ê7ðŽ:V<Í·½ÞµYª0Ñ j¡ÿžð�лðHA)$BÁ�bÞÌH w‰ÿ…DKXaa�h‚Xcªð�cœT®0‘„ Ê þAàòïõØ·ì/E©°ðÐÇ:ìüø÷§ÝÑb‚¦¥ DZA=}€iˆ¶íÌÁ¯þ©I¾�‹ ¹VÇüÑcáƒh8¬˜iA„äüB¬ð§ž8"b, H­Y5_%è—¸ä¢úï¥��Ì•èH2.®áæ "É¡ÓàãçÁ©=1­ï�:™Ó7ˬí¹sпf÷´\SËïÀõÛW‘ךf�3`Â4å dOÊ¢EÈçH=B)ôQ¸.úÖÁ³c©`½Ö¹BGq¶¿øP¼>3‚�øhÃ$I 5F>ÌûºsÀ­)ƒûÁ Ä_‰J]çg`Ê_Eª* Ô0o p(ò“AÑÐ_˜OzxÆuNÀAYcŠee$;1X¸S!TüU»eÉ%ªƒ-5nepR„3Ó½æ?±;AŸúö‡².׬BG«¯T�ñ"Àø6¥%Ë%¥Cý— D¢g>ú#÷ w§& ”�Á¤²Õ%JpÞ+ahO¹ oàZM2è%a”ºU&/{x¨ªå¶ûäÚ{W È^'oåË륳1µî„—›"­r'0ËÅ,ô+¥`†:Àpãq\W¥žI0á%ƒFZÂäç@bê†b9.<Ä´ $£B›ñ‰Ë$(0ÑÛŠ˜¬k« Qþ¥�LDÀ¶ÀI¨ÉHì÷!ÊŠ8Q‰‚?\-N@µñ£ÏšÚfI™h´fªåW|JÎë c'l£ªbÖÉI¨˜§p ½qÀàÛFPTd`Hi”ÊÞËG©A[�Eônb�ç,y˜&ÊD>i(á»ÆAWŸüVº¸ÌLÂxÎZŠÚŠÔi`o?ê\6 ‹ØuÉ[ ¼AF\U("„¯bƒÍI©@àaÇð t1̤ï¨Ñaº�ªgéÕ.îd<ýòò�õÙãj÷BP�öë ¸ß-ûbÜQoàP4 ¨“��6øÒðsÄ-Xˬúæµá¡_W¿ù�{ûúþ [·Ÿž:¼cw³ÐbáâžýÇ qB>>uo„£%Ð_ÝLS~ŽÕ±·Ao ‘|øÙ�\œõÙc1»Ç‰8‰“„½ÑÛ$ɉÌ¦û:&°Þ<æÐª&Ç:¸�ûÛW×¢›¨�ä m­–ÿ†Æÿe‚êüü/%Ã}óÊU�’{"_¹ïŸ^a!^ÉŽñ£„Nÿ�# uõÚ�‹ K�I[ï®g«¥uöøärþo’Ç® ~¼Où@V‹š�½ Û¦›‘_çyzÆŒ‡Š uÖåŸCâ�ÇöbßzןwŒX<4ÃóÇáÆþ=oíÞŸÕqÕ9±òÿ![TÇa�~Yê�x�‰R^sfÁÖ¨±�Üuí˜üê÷fúÜfO=å †”ªð¡€òæú‹ÂÕƒ§‘ßï ù²QÖÕn 8`z_Î 8Ea ŽÂ"gäæ@mþ{·k%¤¯nÍ*Kæ$ÙMÔ _…„{6D+aá½–µŒ!#ßnrV?³Äé³�¾(¨¦Ì».Wmè¿„„–ûOÓ»Z\¯ö³óæZ§�ÔmØz`ûˆ*‰çœúíSÍÀ�; ˆR; "zŽý[óo¹íìCVÏ~ý{z®Ù^�$<õÛ£º ;Ž‚>0, ýå�¹Þg#•q q­x–sÔªeÆ™w‹… 0}§SêøD!7øGË’<`ßçèL›·÷Vql=/O?¢)_6£FÝ(^n²râ͘~ðt#ÌàqÔENà–Yý�Ð4òi€éÄë¸MÎâýå9P;PtíŽ">X9»'+¯BEâCÐdøÂoŒ—m¹ƒyì} ‹ã¢ƒg÷òÃù?¹€Î~þ|e·tãoxO �„r1ÄÛ‹°fþýë¶ÂžÛò}d%ÓïÍ{¹ƒ VìV�—æ«‚øhûÏ ï?¾…äã‰=4Yiwßðõ7uw~ždŠÐ1O`üè¯ñzæúïÛÂb}$ýƒ~w,qÚ}Ãs#‹_ô{£ƒ~<•k*´w•šøžóvíI‹uz°MÒ`íAøtq@Îó^Ã�s˜>|1ýsîS_ {C¬e÷�Ççñ[uç�í:Ú,éx P{+cüüO©´>Œ7—¾€Çó$Å&¬˜ù ÃKp…þd�$Wª‰‘ôU‹@{ýi§ºfÚfU§¿>\øçY×Ti(Íè˜àü̆‡a͈Ô!µS$D�õŒþY¬Â„ÊbH²220Ïi8&à|k·,•Ž­æµw$)¨òçý÷Îô¸ò4 ›MàŒäÅõγ�Šv¢ùÖÛ‹°hœ¡ Icƒ±³0@FB÷÷Ó7‚ax.ôö$ {¹²¿ÐAQzóöÏß³õ¥¬pÁc¯àW-µ±ñ�íiÅ (…ü}&-a´'?͆#^⡬˜h“»ëxqíï^äÙ‰@ù-Ì…´‹C¦”Nüsv»çIOMƒŠ‹”€x€¢pKm'Ï…ø¯à‚?¦�¿æó/9À�G£– ‰“'_ûÌb©U`¬‘ÓGú‘S}²6b$Š·ý1Uqh¤¥¢Y$IþXÿTÉ��eùÉÿ©óñ€ƒ€T†åë‹rÁ±1b¯ÝÞŒR^‡@ó¡ ¤è@KÀx @/ü„¥R. àIMÂ1VybX´a"$€#';2YÆ‘+ùž–3ÝQQåãðÆ‚‰$�ım½o{G87tÍàßBá‹øw¯Q3öJ $@�ÀÀõ) R�ëB5.±$H%D¨ r–II¡Ee†P ÁBÉu»D#I)}û^¾•{ÞY+ýgx`ýV2-dN2FC„â08Ä^Ø\€` #¤*0ŒåÁ9Â{V3œÐa¶ôÈ @—Ú�dH„‘‰Çá/ íIƒ$P†�AD[±¢H0Êm@(,`¦¨Hü³ …Ð!zahÙCc�$%ÓR80X] HÏz˜1Ý çÙ®b†~Gî©óˆ>°�XUtT…ÌÛþ÷("è95¹8å ÍåB§¬ÜU0RÑádi½Äxç3"b †Ä±Ì¶ú”r¿ÄL„CŽàJž}{lpX�¼€Ý¼YUÐuØ<^¡îRC‚…a€afŒ8M�Žÿ"ª&?G¨ë§ÀgÀ p ÿv.%©PÔ�÷¶ø´8�•ä•]ÓÀÒliŠxá.¥�e›ÃHÀ4JO¿‡§nÝe»Œûþë£Ï¨sâAPL7´(êØRÁ¥V�m-ÆàScÀ­°ø�6/Zuª,;€ô@Q3±¶¡¥êÍ¿µá|²X3P¦‚ZK†Â¶x…žƒ �² Õ§×�#¬hŒÓP:7­M@¤ >/Ú&]ÁD.ò@œüˆü*°Paàx§Ñé€ z@ÖxC¼šm×߃³ÆŒÕÎç瓦æ1+õÑï‡"šLOUÂÞ¢Xô7yD½" “B‰Í–Ýèßý‚ÿØ3‚sgüæë®ePþ,—ÑØáÈQ:#P«-�öÛ(Ètˆ 1Û’_Ïzzéðz÷¡çJÒý·ª»í<ù_3—Þx:æ6äeœLhr?‚§Ûog›ý�½WL{‡ÑÑÛg×´h\º¿åéXãy†8à¹O—ÃéEÑë�[¯®»ú�Ä~÷÷Ñ£´M�Ñùõìô þO¦Í óÖŽA»Ø2ða= ‘Œ”ŽSí�Ý[µ¯ãϦÍ£—xŽ:ÇæºWxLTÌ®ÉøëÏjHŠÝ?t°›ÖÞh‚cZâCÖúœgyÚšq|Ø‘Ænæ<ø–y–›þÔeÈd C‚0™Úm±‡ëa¾7ó÷¨õïÏØÛøl&L.>qëç0íÌ8Ä%1sß°½F¾�CøhÃü¦Ò÷^’.Ç ð_�|Çh2 ½Ç�ph.ϤG×ÈÕ¥È]oÅ¥êî"ü_eF&ñÀ|vBèuë¿îþ0a¡ö9å|ü�§xóêY­™“ Øëá�ýÝKµ¦äyGÏ‘�ÂÿkB¿F@àyùBÏ<ûèß·)0!·çX—Mþ¼2[¤�Z¤|‹³ê�âðÖÌæ>ŽÞ1ÄÜØRÜúõò)Ëá·ž0ø„î ?†Á|˜íó‚uÛÔ®ßó™¿gjÝâ…Vz�³éÓ2CàÏîß'Ó· ﻸÕvwQ‹Åzß…éðwžy[Ghžh&ᣅiÛðÀt~_‰6n)zê9wä1è„‚»•nÈ:mïÈYw� Sð#Øw¶"ñ¶´Ò¼^‘`<×û»Ù"ú‚<�%XëÁ±ÄæÑßõGu@ï|óãIüd:óN…�Éá#aíÜ:àè߇Y 7öùŽ{—6üwˆNšßÝçúæ}ûœÇíˆDuùÚâí]v‹FÍwó×µ|Gêý¥RÖ¾oýÆÂô(8­Ÿåá8oÁ1ü]öú'ÃVwâbF vÅTmóÛ,ʧ{¶uSá�ÕWI®á¢Ž jÃÎzßχzò(%oJEmÞƒçˆ3GÜSÉÑÈ™ûo}[¾Ã.n�áe‡vòú×kôͦw�Îø8Û�Ûo¢±ß¯O™æß5�Lê®sm¿Pàa¡ÓôÔô�䅨ЗXŸ×”ll |ÑÜuds"fE ØÇŠä´ÔѱBÐqtlc³Ð!~y Èž»¦ÆÈç‘ÏÔÜ™äoÂc´*éÈnü_Žå3²p4CØèœ‡°7~6k¸ûI�¯„�”J§1àOËÇ—Ž¾²*ôj³øh�v% SùÞ@˜ÃBÐ×ÑáÆu‚XÀÍ–�Ð$.«»yY­}�?L¸�`É„,[S)8¸Qü 6 BÝ©‚ÛÅé-ƒ‚Û�A£¤Y –ᕜË’÷Õ¤[¶‚ݤÔl%X³Ú¿ð ®G•ÂZµ“CG¿~rÛâk‚ØÁÛ_~ž^½üÚϥ除€~óÝH‘í=þÒú}`wk4,_O^„Ž«*Ì*¤µQhn3H18Bwèü0ØBU’AŒp–{ì¶Rã b�•fB]Sަ�ÜŠãµþ”C“;Y‘/ü˜C~â>ôÊ¿åÿŸC§|_ìÐãû7™5WâU ~ÆMa¢kÔ~O_õÕ�¤…ã;J±ø¨æ‚ÓqÁÇÑëG"b¿tŠÙ§ÿSº›Cº¡ñ^ÝÄ`αb„×ûößà_¸@§u6ýlùZû¯»¯|î¹#TS)}!ë¬Gné@Y'íU�öÑ·õQ�ß J‚W3†¶¢ôÑ&<½¯€Ì]³bÿSom6*žH�JPÊ/Ng*4иv�…ŽºœŒg[Ý!�L¡HºÝéû®¡xPÉù*D´Ö ý¦:X,KAç¡BjU1$�HšF$å$“†‡¤Àé8)je/YzdÜîô•´Xb!2�’@’’ëí¹„°Î´…`ò¦JM.káZúß½�·oýÖ •#»H�ZÏ*€äêçôY% ¸$@Ìx/3°ÅÍ’©.r@½%µhnZ‰à;lOZMƒ!‘4iâQÛ�¬pn€(+ᄃûé.+ûXéWûƒîW¤�ãÀÂ…ý³Žï u ¶{¯›ikb bÚ=uLðš&3w6/2¾ðÅ—-¡øUõ�Úè\6(sæ…‡²HBHI‰E4Ð1ÌuÕunWi\ÝÒŽ%ÎnFÕÙ›·ku—vuÅ@ɉ•Ý�·.nÌÙ\,n³»œº›s²‚§w)Y#šrëqMrud¦YH»®çMË·rv3—uq×vé2#¦1]Óc.�—w]§EÙ6æ×]vîtuÁ)në»·p¹”Ó;s—C·PºíÎè듹�ΚnåÚé»›�;¢tÝ›§l»¢]°ìZNij¸Ä\S4C¢&âë»9a¥Ê¹N:éÛ‹³f»¹R)¤• nº».ít›].·N´‘(§#•Žèé‰î®îÝΡ™»ºäNë›;I:ìÛ»eÓ´íÛ4ÈI‡v‹se·n®¹tˆ%ÝÒn]»º \ºÝ×Y²†ìºÔ»·rí9[¥p«°eSrÝ×uwwuu”ææÒî®Fƒ—\åw]-ݤÒíaÚ6ìçZX#-t×lѲ�”¥�.tÆè¤]Ó·(šh»œkªTÝunÑ•—*îmÚE$¥\»hŠDM]ÕÒas‰nê�«µÊå &érÝsºWqÕ›+wWFs;nˆœëbìå®”—7Wtš»›ÚS»©]w“»„4äS¥Ô]ۺ—8;®É�ÜÜâÙ db“L]Ý»ºåÖK®äçnî6wr]Úíw]�¦I»®‡.Ä×vºdîºÜÑܳ.‚Ísr’É\]·M s]Ç]Ý]×g:êm7 ®Êttš]waJi#R¤f¹®Û¥ºLÈÌÜ®‰Q;«–5Û«�tíÂIݵԱ®»n„i)µÝ®‡g`Óa7vF™2i»º•ÜFîîÆJÇuÙºæ35»»�×d�ÂEîѺ›î‡v%ÝGiÜ»uÎÙuÜ£�ìv»»ºvìáu£g79Eº��Ö»t�9ΜêØ(Š $iS(ž¾ÍQÝëg�ŽeÌ¥ß)!Ð œ›&…µ–5§LF™ZÛÐÒßgè\%|bÍ‹¥SÌ>û? 9 ¡àö@°o:tÔîÔ?¿š©†Ò*Î×�×öÔ‘ã U0�rX ŒM¦>xà@sÞ$eŽûé ¤V(X7®R@‘a”³AÊ5*ŠKÓ†ö¹e_¾DŽàˆˆp–ý•�QC¹ øïQûbPëÃËå¯l>ê?~à}õPÅ_<–µ�Òpd»'OH'ˆûxà7ô9›Æ ýh!�ã칞ö ×ù¢+ãã°ß7 ÚÈ3žy—xÅ�‹)УɘÃw–SÑHI‰Ë­ˆ×�ÏÁ(ožïÀû®$š÷gñ×5ê/9ûùE¸ëÇJZ¾ºøù2hî7¥'”{JíRb{Ÿõ}»Ô£N³êÞ­y 7di;Ýòx»‰ø ñÃcÕ¡­ät⇠r'&âÂ#ˆ&½¹âui‰âo‡ãRž ë£"2œ-ƒâËÒã~|Ž‚¾sëçA»³�Ezˬæß»eïösüœô—žØ¯­ëæV¥9£ ·Ñ5wAó(N�ùÓ�øa|õÒámj?º¯=EùæU5ºsØhÀA‹RR û†Óg íýÙÊ])|;Ï®\ ûý9¸{0Buì6—Q­|§rÀ=ê¨P»tlW�|þ6+‡í}óâ=ƒÒ–Þý–×:�ÐC°o>ÇCh>*»½ßówîïÍ··ŽÛ01¶Z?K�~—£GÚÊ0FùþÏrk„Œ%­Û·º¼@´Îž¿ „Þ*:Ðo×mœ¿$²åƒï»C¸�¨ëí�|‰*,lAØuýº‡ÿ&‡g¥ñâÆ8Øüµ&‡‰F£¤®}Ômfª7!óÚ‡NfHÂÈòêa� Y¬LñhÔv„…ú0Œ.ê1F$õ‚V¸@ÓttçS¦š%CK _NG/]´8œ%ìy+5æB«Tqé°uÞP8¤¾‡ b¨h›�9º5J>jÑŒ JP”=*³�Å€ì„.tRʼnÈÕê^ÈÙÐÀCbÉ©×ë_{Ê:૚¸ZòÌú£3�õõž¼—£ÇŒ1MX5.Ö /±¬Œ ˜éZ¡‚ìB´¨úº0’C]' Îÿ  ÷pÛj÷6%—£±<ˆäŒ;±cÂæ…Šo·£cØð¬õ {H_¦iEû�µ´„#Ûµ¸-è±IçHIP’³P�üdr@ðÐ2ØÏ[›´�: 0Åßš"_ÂuŠy‡´œ£Ö°H£+¦ªB+:‘)¸Ø ~LÛbúLéY$�§Êq0ظÅÔÛÏô&úx×ÄÞæ¶V5fÁ#Q$ŒQPyOV„àåB?¾æ« ˨]„;ûP(m\°Xx–�h’U\ÂlJFÜèë«NÎ&l’î mû;G?ïõ«ÿëAÝ÷œÞƒÈ�35šÞ‘JXQ§ÁKèz–™;TĘwy)«ˆ?žåÒ`ñ7€.öÄBʼ˜À!eÚMÝtpOm×Ëöõé[¯Ïß·½ðo™ë·À‰<–Ðt ë¨+|¹ýÅ:¨ó´³ªæðÉ,�Òk­·Ì¾8‰ Èt7!�„E�.&\*·á'b–,h¯ v„ŽØr�£M˜�aË=ËQþ`ª*ª¢’=8!MB�€Á¹¿è‚I«ÖpØ ¨¦>˜õ’m ÒÄ~/ÊÃŇL�‡bÄÂ1ÏwhyFM !è=[À\šÒT„Xv¨28 `á—‚˜´ ±Ã?õPíä„’  Ä%‰'¶Ôð&¿]úŸZšÙïŽøšMÝŠ¶)Љ¬,ÆÝ:÷p+±ìà:Yƒ¢¥åRúTµè¹yfü>nËo4’]‡ ®ôŒÀ ¯™}!È x€.¾îáü„†FÌušÉö[pnaý™àhhß÷{èfŽø}�ÐôváAì�ÝcÊt×±ˆ_Ék›²e&f•úæÞZ²lPtü6ˆ=�ß&��â9RØÀq:Ìvº½qso-ô`gÓñÏ.ßÝã�éwsͶ/RâÌíW»ò%�3¬hfÑÖmë è„bA'²Ó¹”=y~10)82hžãÓÔ8¶g×¾¼Mö7ŽË<ëÇ)?ÉèsÏç°[NÝzí.­4IÊí±€3íËq݃àû1Oæì6ý°ÇNLC6„¬~ƒ l?HZ­ivõ²û…4xk!61Á<ï�ì+qñ»=4JgT¸nÃ|F¼§{/÷"ìöüõܵ½Ž÷ŒÀðÒË!ÅòüCÄû0¡,ÅJ±'ÉBTì;ºjížçÒÏ¡$÷ý—[sÒ Æ:$»±ˆÇJ°L®Ñå]²RFìpÇ „ÇÄ:2]Ì Ùãºçšl_¼�¤ 9c+ÑÉ�4&;ÅmE îÅú¸òÙó~ŸVBÜuûçÔ¤>K§–ú`Qaáú‰/‘=ÌmäK¸;·õåÝyº¯ß=)׫·æŒóÈ£|õô+Ç^C/ò]1ã]ì€:üˆ†Ïçí ‰Õd‚žztý¡¡dc2§N_Ü rö€_½Óv>�³¥ÝDñža‰ŸÑoóŇ">@¼:½(,æ[ûAEXΟ5o1�"žè”ûè9.›ùÖ3ìy;–±Ólyú0,öf 9þ�uŸðÞ{wð?'‡¨íÆýÿ.øë8qý9–‘‡ã¨×5ž‡t•ûôˆ¶Ü¶ÞÏë„§­ö/ä­ÜI‚mPêè£ßŸ[�ŽØ'è7Šx¾à{Œpð¼{zÌx9Ž4/A°Ž�$ú|x‹çdÆžÊsæÜí,Ò"µ~6½Žª8ò1ã°ûw™0vŠôÙ­OÞ/.ö–|YýŽâ”£z­3U°fð Ù»#—í�d{ám^ö#~)Ç?ÛÐ�täxƒÇÇùa;¡áóãµÞñw�¿¶ë×ÉB�˜Ì`od-`öþLT§j8ÇöÒQ„ò™ ï½TXu…L‡6êø£ßØú›Ç´%ì.øTmaœÊÃÉÛ£´æ„BíD€ÚÚ¯§ôíµ$[öøÖ΃ü/¬ÿhyWïXa»õ’ æßE/ç�è�§à¸W6j…ÛvÛòvxÚ¬&�¨k¨S rÑ¢U³ ��EoZZ(¥zÃÑR'qJ �g1C‘‹­‡ø ¡›gxìïÒ”ÄI ;jËoËÕÞ¯h[ø{öVÜ75î—y{ºô¤Å~]o»ÔiÙ‰k›@eåô®sßu J0F½|ô½W§ú�o§¢ÿ¥›cŠÌ}CVšý5Ï_ ìø;ê [DhN Gq±n ÊÕkL¦J8Ó*™¾L$Á9¦-O7å‘«í¥#þêûæ1X£M*”•iªq Va�ØàÕ`܈Sbм©qæ‘tÐÍ%‰œx€Þe*ž$O¿ÉŒõñ{�d’ÕéšþЬ½±{ÞÚo}´Þö1 çÏø8؇@³€„�1É`�À¢€ŠÁµ;ªkCR ƒš�VË"J¶ä„€BõQÀmṖÖÑ‘b5·‚¼Þ:/&†ÜèãQØ-�-xÎÂ+u Ø¿±¯`ûxntÂQí$„TzñüU,çÔŠžH¸~˜“ü¡ å‘í†Ðàç�J)±§ $Y(ó-yF»ýA]“=M*¾¢ZõÛç’ÖðÁgºžAÊŠšÕ!¦ ˆb³ •+ûЍP\Èu*îØiÅ$áX�]cÊ“s–:¯ÉõŽBèQB`–k[% �RA vv•)º$4´³„ ŸÞ³¦¦z>¸ßm\‡qŠÍÌ`ºÿпâœÓË „œÉ¦Ä‹ jƒ:"ç+¤æyHDպꦦ×.‡a \ƒ¼r�eú ˆŒ�$íæÕÕ`øeI½ÃÃêÓoúʼn…tÁ4BGCrÝak…ØÅ—NyqYØÆ/ ô‹e€fbšõІq€t§N´–-vˆa+ôä …‡BÑÿ±À”�¼¼ )~@¤ö´ï úB’¯ èdáóƒ†oj“§^Új,êrÃG…èÓ7ƒvë÷R÷D.GèKÝè¢Çp.’ Áa 1I]¨›me pЀ¨ªðô<©ZøÙú¡ y ‘—mO@pŒ²"Æ K@y-òW?§�ÁÛ–!kßÈ :žÀ»ì¶4]¯Y ˆV§ ôò¶݃%öä1Ñí>“Ð0›BªL[ßüÉÛwИ#¢v˜gªìeçZUæ5 =}ú\õ;;Cæõ—Ÿ=5ALŒ~é®úìÉy,ö¿f·>Ê=mןõŸ¡hLuêÇØx Ñ”äËq�üJÞüW¶6¦iõy ï²vk£³Ù»æ4l!‰o–õ_0“[ø'µºüu4Ÿof[Ǿ™ëýÛ;C¯™�7o_-ñïC~}7vö ׯUd'ôt }7íw3Cµ¬î‘Ÿ·uÀ´Ù¼z‰cè¼FÝ6óÕìþ–9ÎÃH¾P\zîËtè¯)ÛïhBæ-3ðn%õ¢—½ü¶ð¡Q� èÏnÕ<¶ñÇ%ã¥[ éQ߉0>}|׫VX¿Ž�Æ úÔ€“[çh/÷Ï—û�–|ññ¡t9ŸŽÞ|¯±Î¿¼ûϼ̘}µku m;Òû93ç÷-¾:O×xk-M§lŸ�H9ñO²îÁxaœd߯|Ö‚^n‡ì¶Uò²µÖÌü¯ ¾GŸ;ËñýtµÀÒíÔwÚ�D�çèD{ïlÀ¸KHÇŒíôHo/·°…åÌÔÅÇ6 1„;5X1øGõ·uÒNjTÇ_#!nÝ~l,òë*®þj."øcëX´ ú¡Œ AZM�Þ»çtßêK÷KùÝX:·a¾#îkÚ¨ïœÔzñ�–˰ð-‘w‘‰Ÿ´p�˜_@ìds?Ší÷�¼;¹Èܰ_–ýÒ£îvgbt]ó÷ûÇ×}ì ”ô6ãûÞ‚óm¿tÍ8À@‚È1à'Ñžò�8Œ°hr=@ß÷IÅG–äGÇI*øŸ¼]!ÖjîÝ’�½Kî­-zÐp¡Ë^Ä¥^n-Õïœ$)/åÒ=q8tÕúŽšÁÜxë.‹åœ'³ç†¤ ÃzLfãï=_ß×Nñ}{áþÇó§O!¨†Cqæ¿wož›VÖAÕ`ù>Ûå}ê ÿ1oî¢�úºq4 ›ÒWƒR›^]ÇŸ8¿ß4…‹¶Ýá’ë¬O�ôdKy}ï?æ‰ë½*Þø9l 0=úiÄyiÏš1þ+nå{~ü0$ÝRå ¢‘Çöcý+�1¡p,íuêƒÍÊBRd=÷üð6WxÊ›ÄnÒ!X[öÞÞ™lÿž+÷6Ʀh©ëó{zéž�ãÇÆÂ…ÙF‡¿i-Pp§÷�¹�¼9ÂþGYË„|jO¯¾[Ðø}3”îÞ:±ãçÔœúÓ¯­{¿¶&~Ìßzf°}±w³çÜtŸiò«A:—x‘ CÐfF~�|¨ëã¶: {�ƒ«SݤfÉ„Qw…�†ûî„_ElÔ AAÞ,i HÍÓàÖ”Àš<�îŽ Y;6ÌPëLÑ¢ñÝ5ÈÛV‡[XÐÁ¡J—>zSâJÜžÒ_�‹NVß[ÿXŸÃ!óÀâ¨FdËÿ 9�¥¨„Xà ²zÔxð”bŠ@í³C”±B'�#R¯F°bÔ[†àD‰4Ë0L. HÉý¯?×ý>#§Áúcî€6!¼ d¸ÈN¥J›Ž£–Æ%¡Œ`ŽrÑ …’±#ÂøÄ†�a' Û,a‚ƒ•å�_»ÌõjHÒÂ3¾2A0Fí|MYñÆÍj‡;p/cðßL·õÉxܹIF•y‰˜?Üš aœÔ¤É5œrO¤”»ØàÌsÍ ÁtÒÊ®¥ ‘-´n¡8¬ð» `x©F„U�±#�4>økÖæõŒç>fÉ8G·†ô›Íƒ1Ñ´ÃÉÙ#àlÇy’:)yɃ&ÌÌ›Tªy<æ�ˆWfõv´�ò\MÔðyIªÞjô5ísnŽ�!À…›[Yz¬°Ô©1;ƒ‘ ü»K•qÓÃ6úô² ©»è>)Z,¼Â÷#ìúÎl�ø'«ª`�‚=Âõ*# H;vË,ܶ¦`kHZ9´Œèn¹› Á÷$aÝÉ0G �"†Ñ]Û…àÎ+·ô½±y-]—+k`òÛHçŸä)†=ÉÓ´¤Á5¯Já&†Ø~¡bx0ÇÒìA3öÊGñJe˜.ȱg類U/6Šÿ$×v͆¢x``§¶3¤hPQC³œá”,�ºÈqT•¹i½JIɆء(�è€iHvkZ†q6&½‰ 'ù›lŽC\”=óTÐíȈ+pMU  ­‚»øž!C>8ò DRãÔÝð²{—ñ×‰±ß m+ÑúŠ!x(0–Åy–)%ywMuÆJ’ÍíúA~Œ¦„rPr¦ÙMŸÀnAß{Š ‹ÐX€']Ú­³`W]Œ^h¹ÉcCxÏlÃËÐo‹‡1|ްæ1÷ A:œÃ£/kÜ{£}ˆ«óôÝòÄúCSîð¥å¢p®óä"J:ß1u¾R » ™S/uuîìwKHt¥˜zx°~½ðñÛ�C‘†¼î#9jî>òŸvúhºÛ!ÃnDÅÙ¿ò…ý�$FÂüï7å—ñY*†°„;º/æñaào[J³ýI‹sqè>1žzœ6ýdÛ.Zò^NµÒc�Ý^Œ év¾dBëía.‘¿ÈT]ý.]cѼof ÃÙ÷^+2éÚ¬!ÑÙ+uhïël›„�ÜÙÚ žƒë|𫵄&U5>]Ô|ò1ømÞ’Ó.Å3¤¾w^‹woú¸±Ÿ^)ï *Vn3ÁFŠ,ÃÖk �ƒƒBÐÖ(ßÂÈò^ÚöÞ¾9€ˆy}S~ƒaÏïÛxu¯·ðÏŸ¼;µ©Ò^=¯±�ý,gÏNÃÒ¿§¾£Ûž-ê½6g¶ Rè<ìrÁ·Åî7sÔû¨«ž9þ¨ë'ø¸ìŸWŒúá‰aõý«ãøpøŽ¯¥Â‚"ùé÷†ÞSx<Ø÷ó·²"Þ9`ïÓÐé™ 9DK°xý2oѳ©»G�ýlsêñ\vh9Ö$ùï�p�˜è�~?¯{÷“¥ÚͦÖèÙW÷ËL{Ú8.L:S`§þý… ~À}îSs6˜�C¹Þ|8ñ¾�®kr¥|bO–¾¬qTRœ¼Gܵ¸çæG1éaé¾ú6t3.áÚžG)ñe¯�Å¿¾bqäüB]¾;­c,mÃÞ<üuj^;)|Gs }±èKçû´Ç=�צ9<ú£7þÛÐŽàï2§™ËZøÁãº_ï~Ï€í‘àAuêÅ5B{„‡>»npúÅ]µó…ôöý`_ÝPÌp÷E Í;{|ù…ü¢t$:]ãæˆ êH4çĹú·8xôÞWµ®Õ‘„Âõ1P à†LýÏo]¢:Ãß›‘€Ç|ãÊ�ø<�qä:)R½& {­Ü»;ÍZÛÑ¿ž(íV}oâë÷gq ìv„Z¿qÂzØ¥žÛ¸KuÒwè*΃jÛÏ¿»ôqc×Z>¹bˆŽÇ ¸jq�Ê\údu`V�ùPó+9ž™Àp«ÇvøÔ�ï¯_À–ÞzØÄÆ4%wA}ã멱⨿ݥÈÏÎúw™(gy±B½’ù ñæâ5‡ò7úâ{CÌ'Æ‘ƒÃy˜6x_>Ær‘Wpzô±%÷¾òôñ“Z%­i³ì³d: :-¡—а0¹US!‘�éW»ù½Qp¦˜edÝ­MHI¸žãÜ-NH³O �ݸ?ÕBäPÐBp‹L»éÃæ‚§2oBå (6¥€Ú%=e�þÈòñšrß{k•bZþ¿à/|¨†ã’òþ¦=ê&ƒ a0à–ªçX]Kc^ÅÖ%E':I ˆQTBJt5=jâj\$J Ehd7*.†ðm�5bo¯‹yéògM ·/·<3SO�ÿgzùmc_Îvœú Ó¢É$ HÆI-eÜC‚–Uì; PìƒÈÖY„‰�^è%àU¨+�ÈFCK”ôáû ¦¶Á Kp«-|YrêAêªEjˆH[�ï¹#´nÚZÿ&3HFŒß½pi SÕ¢º ÁŸˆOä¨f"ó­‚麸õ³°½bðÒ}ç#„¤”{Fh ŸgF®…Ríšà7L3íž6 ¤!$ŠÁûûÂk—µV��×V¶ßzxþMt!–ãöå`ñ6àñ|¢ÓqæÈœÇ"Ï„L“·ü9»ˆÿƒ‚!/ȇ¼^r»–âãdM†Y£ÊqÚ"ý2m¡òÍcþRv.8éBtû´‡�Š@?tªåš½À36v»yZÞ°úÛêÀT.m¦„¼�ô-ϗSã…³98¦e$PÞ€Œ€@èT^Ê*W4lö ­NZqµ¹ AQcÝ)ø7e¹þןö¬Í!þ�ùî�¿ãVTÚúŠý#ÑØ 6˜Û‡g@]ÊÅÉ1Ô1¼Zˆp//$Tài•¤*ôH¶“ Ð@bOõ&B0†~uìÁrÏlã 8D騹�h }ööÞí¤€A;�¢ xÑFšÇÂÃΙh?ä›áçF@�€Á´‡�ˆ]¤Åo ¢íåÅ×c‘°8ž Kùª 2ŠP@MQ™¯È>×Ó�bÔUŽé (@dûE„¿¦RQêK%iÁ…YÑÅÅ’&bË€Âw;¦Qݬ¦� ÈÞì1q7.îÐ�À`…0„k•)ì1·pA(YZ4`#êÁ_’�‚ö¨À ;Æ•Uó+uó©+ªäkuöVéLª”ص•Œx…ÛÉš(…Æ L¤‰ %†æ¥vO©� .�ÎÔ‰‚ ÒfÁˆ0ƒ³¨Qª@,â–[-*É’)‚I©9rÒEY55|#WÏl@˜cAÁó€­`o/f!ÁÄ»GÕÌ�K…TV@ à†@±z½½2ÞÏ[â¾;|:™Zêºí àÙbå•k·ó²ÇòvzûxúiÛ×_¿‘ç>?Óõ‹MY¿ÏêT¯ åÌÍÒ\¾›�#‡ Ìiýþâ}›*¶€]6µk´}Ù/Ó�›Jþîæ�Åw„ó©v²zÌNJ>$njϣD"€'s->òC�ûk›²0¥²Ô(\ç£Vu!&ÍöåÖÒ%%'ŽÂ½WÏæ{¿ŽÓ¤ë~íJûØ—Ê·4ïA߯LDøôƒÀ>ÏÑ3\ÅAó† ‹ïË !âb]Gm×”é›;dQ÷A¶î`#11ï¯ß�q³ÙNœxg{b>HQ­ÜR­IY6 4¾Íû�Žãƒ�ÖÁ¬ãaàZt÷6TšÏ½¶w@ß4 ÷ÒÝ•`"'Ó�;wCU¬á~'â– Û£çhw®ñ_î4¤5ó‹{uEšÊK%Ÿ_£X¥o¶âºƒÔ™A,ÂQ‰2¶ô—˜ï輯e1±óApÎÚÃÁý?u{Ë;eæ?;;àRO]@¤´\×d#4�źhÿ³ÆœÈz)|1·ŽsÓ½Øoýמü£»ö“{o}·Š¸H«µÇè‹ýú7ã¡îòtxáKi–Ô»%H–ô§KŸx‡íè£{F¡úŠK¶°œ´\“´óèb¯ô,%©8wã÷Æ�0)îͼ8÷ÃÕœŽ;xЛ¥8,…€Uþu+¸i�âþÞ6Ï› °¨hØx@àß<ŒqšŒ°}…‡HÇ}t„ê ÍÊ;¯VUÜÛb;ûÝÿO÷hý£só þÞÞÖ Ûõvú+ç}¦¡€ò_¾ª\(JÁã¸ôoã³»K ›ÇKúìbòÔš�•`õéðl£i‰Û2}ªÓï¬Tt&�qWqÄàO³LaÌàÀ³iù­>@Ýös‡)§7®ó7âCò/ZDÌs·qÔuéF~k…‹”.;v8û.ðœçN·ñá|¾öê?¼3u­éßàYÿƒl;QÛVä΃jNÞ¡ï�y¤;÷¿ ÎB|п}¶OÎááO«‚ÂúÈéYIû‡¶“ëÀEéã»’µé°òxZœu—té�hÔsjï<=�ï"ãÔ§m»$7Mä,7Š è•rBˆlô�ô�1 ÈùqßÂàz¼!:úO꾆™ßÍ“-Ü(• ÿ_äiyÞÞû_¨€uñJû®Ø½þðÃ}d¡U¿F\òLj;¸jé@ÄPwY1áÄÅ3@ë¶aïÇ-¯Ã/3©A˜¡ò=d IHRíÄ®ô%F1„¢Šž„€}�>ÎS|ÕFv|~Á�Ù¢8�ŸÛÆ1$)>‚ÔE9¸>Må_Pìd î»É;Nã=³­“YµHªŠäÐo9”t˜þ¦íd͹2´ÿ”áÍK¢ôÚÓÒ¨¨‰6û-Ñ[„œ‡D((Ž’‚2MVªôãñ ¨!pÉBTÅöëRþ°óÉü”/‡ôh©]*?dÎeȲ7dzõwþzš´AW½ßZ3“9×Bæa8V6§€É$œÕ�¼aß®øÔʤR¯Ï·eÝ]·ôÕôšé¥.Q_*¼*ûþ’ù¾~¾Å"qHb5¦¦0@›ï:V¢!Ýé<.¼à©ð‘¼+˜w¾@A„F&£)Q,š‘i²UŒ6ÒJY¦i jÎo®Œ–7M­µö8Ê~S �š¤ñöÛ]:¹H ~¿SS}ïæˆ ˜/õ1N$‚’!2„ˆ± �GŸì|u›ºÎqs�Ü#ѬÃ2Áéþ"}||ø�·KL{´ý���ê<Ìyúµóã &\ HTpݺqˆØSüßÝyíã¢ä­P^Z >¬H¸ÃëÕ}Äl£Öå!Ž"GÑ‹ö!£‘~¸l†5ŽÓq¿ßÎÂQØðzë¥kbõö6*ÚU? é°J£™zì³MAÌ�G¯³˜.È9é ŒdO-—„ ½g諯ŸËo�á͈ß[˶õéÑŒ°6[Кý‹û‘ ü�ä~Â>]^Ütv~yïnµ~?A/+ÓçL�ûxKÏCÇ»±»¥üOÀ·Xc¿y‹þp üî·<õ íƒ �ˆuˆé>Ïø2ƒï^›ÐUw$Ÿ§cÛ¾ÛÈê¡åê‡nÛ°8FÓëfÀo”ýz<“Ì Œ]Þ¤”Xß=д=ÐXìbÑÂÒ2Î+ö–ïÜ ŽŒcr1ݸê¬×šj�ã'Ý6¼ž¸�¿ŽÚŲuþAeA=qÈ´|¸-[x0AÀI1/0 ~‹ŽÞ –Ͻ‡¡_ݼۉvc…•ì9^üyðŽÖK©á” Ã�wß?7‡q°×Æúß²¾Ô?W¶ÙàÛï¯í•+yß·n¶f�°bõ‚¦±gÊÑöÞõÞýŽýùfCÈùŽ·õ»i¶úle1]¦—÷~&&9ïÓó&î8P¥M0H0t¿§2é©QB¿OíÛòÛqõÌï!a¼7WÓ#�ì3� hÜþyø¾Ù.;ÊåíPnÞ–�¾8z AâXÇ#¿ ; Þp$öÒnÚAìnøúî™Þ!{˧»éèLIQ£·ÁÛ÷NµrÕuOß�÷�õøwxuƒ¨ çדÃÕ£jhPÀáGIQ¡ãio»¶áìþV Õ§²ãSñv�é(ìáÓžŽf=ÎôGvù¯e¾eé‡ý��Ça_\L!ñÙÅaóÓyûåE óÞÎî°|*'œ¬í6lÿwàc½u±´Üa{„be$þojuwHÏ৸ó´›ß®ÐŒõÖá3î¸\÷ï�Cü3ŸÅ ²xè¥1÷^X¢ÁI�Pžš�‚áµ`7Šx8ˆ(d½ÄL6p@…_3­ÿϦ`»½Õ𛂔œÙHX±úùšH‹sªk²Í›õ²Ê &’P»ý^ŒÆ�Óß‘×ÔMXMlôÇ’µ ™D#@ŒB²YR°·óõm§rûÿî„H¸d_§b� )'IáÈÅ(Ïrư«°‚UH•±’áL(ÎdzİñÛHpÖ��ÁI“ΘÓ÷O$Z�¤�j°LA'mðp’k)µ$ŸÈ,e'ˆ"‚�sZ’,&�¿—Ö™äk¦Ò r¶W‚邈¹8 Z„‰É½º­ö-Et4¦Ñ¬Ó´mlëu“¬t¥KþÞ/í>½/ª–hÿ¼Õ]^G¡ÊMF˜Â*Áí%‹¡pе "p\t)Ï<“mìË/€hŽGÐ GψSøù1C"Ú3MõwÆA7H9‡auø ’þ•iªXÜŒÍ8߉Д]CÚ{E÷9ÌkÚQ$Ö®Z&ªÙ%àBÏÈ3ËÍ@ØoôvGƒÅw: Ö¡iUé›Xáç–+SÃ,zòRPžœ*¶'Ø]F¡ÊS3ÄwÏ)ÐÉB¡#6¿:#î¤\b„z£oáD”>+a/eÄ;À~x˜;{çÑ÷ã¯Þÿ/¡åÆÿg믹ñ¿ƒ,ó3±†-|ýsÔº¼§6'îþ¸Þ1£üßcòW«ý™ËjÎ4õ>aߎì/‘PÊKœê›ÑJ1éùí�ß]—µýOfö°Ww׊C¼Õƒ÷Á8\}÷!Ü«XFÕ¿O¡ïôÍ p[Æ_*Á"ÊŽm·‘–�ì¦LmµF…‡ó Ããu(Ù{ŸVhÐ(Þú-Ïœ»¸AÖ�ù!ß{IùùÂyœŸe<_ÓÙOùaÁÈDwHe|Ø8âO botgm ø×¥füðëÞ_òð të»9Mþ0Zymõväk¼kâãê)[ÜãÑ­0B©³šýÿ›â”Ý:lÆ\cæË}Çî´w‡\ D Ç�ø)V/”ܳ¢¾%,(èÛØb{{鸮Ÿ¤¦àÚºYhÖG?Ãú(vxÄwº»xÓuI³‚§½¶©[éÔq@µïí£ÎàMþ+¼ò\õÎ;“G×dS9Gh{—àÌ? ÚQ~‡„õ¦Ú;ø/vâkPÿ=R¸fÙ—·ÿtŸ‰w¨ïø%cwôMÁu¡ëûg=‡©ûè=sa™ÐêdÆÖõ Éáª&#í`Æö¬ÐpÆLQ�ã�#—×´õ×§Žó}AäWð×J¼Hsäzm¯µ¹ô�Ï�Ð}ÙþE7†Ô9ÑêvÏ©|Œ¡»ç â45  ’T;~ë<µíó¿qZ¼#,7¡ÉµHij¸OôšÝ”lr$›]˜¬š{Å+)Ü,Ck)M&È´c xÆ- ¶u€¨‹Üɲ•ùµõTXÔ[ããTû¾==éïg]�H2Hý™Óà oÛ®¿�ZQŒïÜŽ—«Ü ±¨Ù´êöp#ì3…£,ú™Ú” ·UŸÆ$Ú‡-Ÿæ€[“#ý2H DŒnR·_¢‡œë¹Ä,U·’ ãII†˜’+@»ÖH®�5 ÙΧ¦sgÕx'„½¨xļyíEt,}Ý*ǯ±g„j&'Ó’Ü6µßnLvŽ©Ú½ŽÎÊ“¤’Cˆ0ój�%•\c%*D¢ñRá3­å•¶‡ ü¯žWlâTìÍqª.BðË8F£‰PÒ¶íÅ+z•êgMŽ�²jpTM!q`ALí³®†i× ‹TKÑÌñ±ÌPÔ2g­ÉÙ™%äEEEQ@�¬ÆØÚwÿw#Ñ5×ðEHñ •�"÷{¯ð¿ š'”„èI$$]šÍ©šc×%Äy׎‹q,éuSô’¸B9)°�n¢éËT™ '©Öú›vÍí㦅ÞUuWé²A3þ©­¶ƒ€ „Îq]1�ߦaã[À õ�ßhŒÀâÈ‚ìF’T°Hï±3UÊwßëj�ýPï¨hV¢…îm�H¹E�Œ�ˆ<9Š.¬Q3ñ‚¶í‰C Ðe²‚@ì‡j‚‘ŠÈˆ»—š&ÕtÈP?eqèˆÈq=zÔl8æÁ~^ í¢pÝü@€ ë@ûàÆ"çÚPÀŠ+G3ÂŽ>7º[`A[n‡:ÖÔ-cå4*΂ 8 I b£#±heAE(‚’S°ð`A'»LLi,]Aú½ë®î‹²r›Þõ½œsv»�Žç.œºQ ÆouÞì`É£bÜ¢2r¼Ü‰”ËW³\¤¹ž�(�\w¯rí.FÌÖºëºíÜ×Zçmït›ž”¦¹·+%®®ôõ.»–Ì Ö7:ynóÓÖÞÝ¢í®C·JRî廽ç{Ýî^ä�víW»·uín½¯hW¤ÝÄQ¹ÜδcÏW;°Œ¢‚4bõÝ®ººµ%Úmº÷YRÛ•îu½µî§ºFJ[®®�]‹w»«­Ýž.«¬˜»«­ç°0£$`"Â=Ý]ÅÚí8©r—D»³^½º“o\›ué]”îêîvΔo%ÕºÏ[§Ê×k´Êiºnº÷LwzÜ÷zíšuÌÛ�s·;»)ºnÓK—»Ùë§{{olÖy7W"Ì—¼òZë<ŒšÜÝ–KuÍêïS ½<Ðm#&lm‚;ÝÒëW(’‰íÚu^ñw»\wvSÍÉÐS¯w«Ùtîr;KÓ“›šO=ëv¹rõ.½íÞ×níïw½]FéE¼Ý0Qæó[—³W½ïjîï9½î×1æKÄÚvì{ݯJî;W7¦×½ÎíËstë·sÛݼ×vºÛÍî½Á5ì»Ý··½Úåæ½Òë—ºº’�s"Þ÷T‹†õìë®$…Ó`=ëÚ÷gE={½²ãµË\-ÕÕÚ6ºZ™Ë×k¼6—º¯+nÊíïz÷º��t—K–éæ×MSh曫¥xn´÷\º÷¯Q^ï<¼ÎÝëu®›ŽíÓsœ�)DõÛ–öé1»níä½^÷¥êæ¥ÇY•tÝÝÝÕå® ë£[¬êj5v›sš‹º÷µé^Žê•Ôê—�dˆJïu=Ûzî¼¶zí®gu½/&Z-˱ÅÔPW5Ñ'=Û¯n&çwNí Ý×:nÂìîu’w[Þéêuçzí]vë¯v×{©6Í•ÊdÍsšÝã«xÞ]].—wi†­Þï{rkÝæÞæÓré6eº¹ê÷¥—·Tºì�ÝiÁu�ÒÝ{Åw¦^õÛ7«Þ­ÍhQ¤»¹ér®¦Ýw•#ºÜ×! ®ìIr«¬îêÝ)¥®ä»]Ù<×L§´îÚ5r ‰qÛ£�\»¬.˜È»«»°÷r´i*ôÝwkŽï{m][Ë],íÔöëÍwn··IÓË×®UÓnõÛ¤¦Ñ¬z7vÊ^»¢é쨽W—^+©Í]åצö¢ÇnÛË%wbºíˆ•ÝïW"Þu*É­Ý;o'¯zwDgC­ï]«ÕÓ½/n“ÔÞ®ÆË”î5îëÎw]dFÈ%”nš¹³W[±uÕÖº�×bô•{ÌJöKzíÞë­ËkÞºÞ—iWM®Û¼¼÷kÉ]u᧯{)]î¦àv�î¯mïn×¶íuwuM9rÞZ=Þöò÷^êî•èîóª)ÝeËËÞíÚîëÑíæ÷©RîÛ×uÎn®šíºæë� nÃW®®QMtpç‹ÞW•Ò÷�sݳӽÛ×K½gžW¢ž�{vö½LÇ]b÷v·´®XöëªW®nôz^®ÎöeÏoMy�y{^LÕæ3{ÐïnöîŒåˆÄh׫Ø3©ÝÅ0©«ÕÜ$¦‚‰›®Íu×®×-åÚ^[Ë·œ7 ¼=¦óW·(ºBeÉÕN»ºÞ=Û»u{zuÈ(²/Wk�—qɇuº;]®ŒÄéÕ&1kÝÅöº{Úòm{ÛÞ½ÕÍ—.ËmÍ©6x4us³wq»»º]ÉÝÍÙ“m�Òb±l‘{wEŠ÷½é¹Éwtnl–M;¢¤“œ¶æ n4!¦’×MM6#Zék·n’1dÑ€¶$Û%]]ê÷y¼n×xÙ3)\Ý«¶»$ :ÞîÝ*ô£7º7'�n{½èæò;ÝÝÑé�ïW¦õî6ôs­zm—´7k{ÆéÝîºö�z¹PQ¦Z×]—^k©½+ ž÷–½×·‘¦»6µì·�³wh× ¹·^ïaÚ^W¯uÞ ÕÓn…w]ítÖ»»]x÷¢ÀjdbÎ�;¸EÝ®ÅÙWF<âór1¢îíÏWº)˜ÁXµvlcJ]ÓKbq»¤ÒyÛ›{ÑÔÞºð/ 2ºÍs/NÓCΩ®�¥Ø{cÍÝO{\Š6„Ì5yY]nÊ^½ÔL׺ݓ‘η®Ýj^.W-Ûd+Ù·µÖé©J÷Eíí» fYëÝíAP]À;nÂ¥š4m¹E6x³k¯w):^•z÷Z÷;kÏ+©„BĹÝ�Ý©”ºo9ÝÜéÕÕ×®åÇ»]9DwqÜéÑ»½Éžæ×r;¥™ÒT8’î))ÝgNó:öõËvT»ºê½êöÞ»w½ëÆì˜¨-½ívë®ôï{¯ îÞõÙÏ\ïYf½�ȹ¤’7•Ë]Ú¹KÙI�2nÝ]kŽêÜÒ`ÄåÚé®1ìó½\Úô×6¸š+{ÛÝÝ.“»{ÙªfÓ·lmêmy3l¦šb(7ºuÖê(èÝAvîuTc&h2�"æä]ÎBå;²KÝÝÜîIή®÷ £U]ï;·$/:®Í]u·i1›s^—^»Þ÷º”%ËÞ=¼ãÞÜéûyy5Ïs½çX§c®îÝ<ÚêY»W{Þï[Í™]ÕÊ%Ýzy7ºéi¤’�w‹¶õ½v×´9w«�Îåuηwsuº»œ»®ÝÛ©ÖíOn1�.³»Ý¢.ÑîpwO]ïK·j¹p´Ê鲸×IÚî�w]v-]éÒh׺ݻ.vZ�Ñ�oz̪1—ŽîNn]Ü+»£�7-=vÛË î­¥Ù“2׆^UuI¬4µÛ¤äémt÷¤ö˜›Ö¯f÷�zî7—� $"Íoš÷·Z½6åÕØÃÞ놻\»­ëÞh+wN¹·pmäw·.nv-Ñ­ tºîíQ=]çºuÉwMïzíy²î�z½Ýœi&¼u®öíås¥eº÷]ë»±¼Þ‘ž©ïk–¼Ãºà”S²b’‚{Õç^ö{”ºã\öïz˺îêv»œâW]Ó�ÝÝwMÖîîÆâ Q@ŒEŠíéÛOn�¯w[×=Þ·»w5ÛqïW/Hœêv4ê^]RÞîòîËzM4ö÷’»^Zq׫¶ÝݽKÜ®¹kÙç/SÌî÷·‹®ä¯7½Ö\ë·mË©;¤êw2GmæÝ·²7*.èºì×^ê{y=WféÍuÕÛ”j÷^ìLá×3§Wsr„êë.rîºíëÝ7¢É»sK—jôî÷¶{ݽ¼¼7½vÝ:›&»©.Ý{º“Úâ Nô׫ͱ4AIweË­ìñ¤uî½Ý·'gEÉ;§n㔕ë²ykÙb,\õç.ºç4÷Y×IŠ w^ò{=.™™(ÄîÙºRîÌn²¹[ÒLyÛ¤¡7w'²«ÙMë¨$Ý‘ÌË&º»«�võ{Þ®iÏzïnõ=o<ñÖä^öõzvÞÀ¥ÕÚëÝ¼Öæ»ižº×K›¯+œwté%Ηn€Ó®×#W,Ó'Nõêåâ“»9Û®Þºò‘¯L·9y´¯^[Ù!¥fÝÝÍv-�w7I*é—nKL“=-Þ-È×cÝï`Íã×oQÞzœ½bõϯ9·®írNX¯KÜ÷«™zîì�×·wºw»¹¸ïTcºJÜŒyÇqÂõݦ/ä,Ihz;¹ç oy;ª6ñššFRJHf4]–ê37·»ÈéOn»½å™7¹¥^•t½spÅî¯^Ý»®ÛËt×·]2u×”šóLÜóz&¯5ͺzž©èêô¥ÞKÚ÷—'§º]vçtÜÝ5ÕÛ¹çží˵î{½º›{+—v»3W\!ïUsn›wºånZ»×l]'nÜŒzõz{wYÛt¼õíî½­zž]ëª÷uîÝË»ÍèÞEcnW—½º§uë/1=zöµÓÝÖÏv÷»Ënç•íç¼W¥Ý{zîë×[¤aI›ˆ²Š9K×·Y¦on™Í—vJšWR¯Jóo1 9ÊékÊó)4/G‡¯us�W/{ÛÖÉ]g×k×™r7·ë·;{×�ywmÉ;Êí[•×^磘žº‚.ëµ×n÷Ev¼±KÊ]½¥x[xF½{MÒo7\¯{[Ù’¼�{ÆácÝk�®â’�½ÝE=°í2f‹·¯zÒŽ»^šyu“œ;¦í¹Ív¹×F¥ÒJê¹½]ÖòK”º÷KÎï1Þ{½»Û[�!%×,Oq¯yu¶M½IíÓ„òëÞºoe鞸â{«Û×gkÍ{yÐLêv»§bÝ…ïtÝ4 ºîºò½ïnëÍÒè7{½#7«�Ö'^zörì÷·iâ£! X�²EDJU<€` ¯€ %”L ¨„lˆ+JAQ Ò ¬DTò‰ø‰þ"¨�þ…"ªAQª(°zyüãÐú¾'œÇ×–µý–/XÛÛÚiŒ“±TØÏør=Ý\{¸Xjï.�3üûøíÜñs)"ŸU|y�=Ûrme‰Lé_̰u »ëׯ}>�Býzô±« 8B*"•Nÿ÷$ÉÀça×Fq×<êãÿ4îøÊûÙ픂ŽÅpÝštgyIª”§½„ b–ÉUTC¦P7%µL·ÿ®Qo—«ÈIÏ ÆòD”û ÂÓ²¶ß!ŸÂpžéóYÌt”ÌìôTªã=òd—ÿ©Eçgµ_)v²²G¾)‚å&r‰,ΘN™h´Þšol-gnæÜŒÑ®®ŸO2£±:Ád™=Z$l¹+£á §”ÄE�Ü'7HÀÏÿR˜;™==¢ç~§ëÏ(l°¤úW"¤wnÜ(âzîDý� vm¹1#ÄFƒ‡ÍåƒLNÌG¼Í6ºÔyLôµ Ó40·_¾¼Šõ˜UkZ´üñ2aÓè¦Æ Kã…vS*@6ˆ=xRÛyWÕéQÉ©š/ÁV›½»ƒ ”ÊäÌý!3oHMáw-í KN±êŸ@äé(Œ€\­ m8<#•&ëËaU¬wOÏ*/_>÷x^†Z¾ÿ‘ÿ Š$"ª@‘ÿO¬}[À£ºÙ¾½”^k4/˜Hï°¢À"*v›õò¶¿žºg÷çã_î8=žç`ö¨ Š€ªP¡a÷ƒÙéáÓü(ß‘ßËãGÀÒµÝ? Sß¶ŠF0n@E¥ #-„S_qä‚1®5OúŽ¿œ0fV)óuæ¨ÀÍ—‡�?¿Ž‹4í­’!Œe×ÓºwÏŒ™0Kã&|6údiã„S¿<ßˆÝ Ês«R+Xé“�¾-BäÃ�Lb�©‡c•2‚ëÓÛQú*ŠiœÙ¼ÊV´ZmLb}å ˆÏ YŒuŸTfDëÖq‹Í,õ/[+ó­c³D së0ê‚r1Oú¸ò7g=BŠØ /AO*`âwîB�Cn¥CÞ¿á®â[éŽû`Ê›¢¦Â]…_ˆišŸéâõ@�RŠçˆaü?¿v“™§`“EEœRjŠ›ñÇAûîí:üÚK]FÙÞ‚BdÓèRLʈ0bìê/X3aøc¯Þ˜+ëxÅãÚœ0#`î?–#×ob‚=¡Œ\αB(·Õ£ÜÖJè¾Mƒ0Ã+Ç_ 5á·#s�õL<øDÓðšý˜þo™çÈæ ý©[â¥3Z]û—uÉ…Ùð°Õî¢�‚-êLJZÚÏÎ8C·QK¸§5F·3èáz©#í¦;é�7©4Zϳ€¾äG™ <¢»m´;öâ1¿c9B{úýî×ÏÊù2.¥ å¢#&q>š„"4\ÝÁž•`É:W¼îû9“¦ë‡9ÊIܤ“¬IÞ'2ÉÜþ ÷%^d2zåDÕáÊú9VAY³‰ŠŠJÏØ›áixQ}¦×XnHÒ†d4;±Eu÷&C1؉¦óc¤É“|ƒ¡VîκN’!"÷�d§E=Õi Xë¹8˜ˆ¡ZO I£¹:VüLw·ª,ª’r4Ú&LiE“’qló<¶˜=·gƒ†Ó ˜AêcrnmáI›(�:àÀJ~:öWæLÌ�cìR…õÌ0là íeó (“ÑaMâSÄõºz†8r×~EÕH¾÷ º_G‡¤Îäãk &æM7…¥U^ˆ='2õì?J »3æ°â8º“Ÿ$¶ 3º¥�Ç€ƒÄ×T«9^å ]yÑåIiŸ%dZnC §ô˜çI²›î<|çBÉ‘îVZ–� ÷¹Ê— á¯ÍŠf%¼ICQæ¡$™¼wq7y™W†4u¯¹éVêÎÛ�ä“H¶±­+2“¾ QÌž¬§q³3a˜¹‘h³A›ì±u?Œú{úrsúcMïç‡þ*¦Éw~è@ú •Xï:r,�Ö_Hu¸ë)4èÕ›{ç,–ÌN‹ÌÔGü" ?ñѵñL‡ð�+µFøYóîdÜR¶îe2õw‚‹%þ,ýežÂoÒ$ô•%rj¸RÈDß%ßÈ0ß�÷ímFÈo¨‚ØÅ5ާaôv¶vøwðÌ�öÁø²S Fø/KüºB‚ð¹—ïv½Ò^N6[5x”*Óüä媑±Ûæ=Lìüô·K¿ŒYvcïog8åkù¯û®t6ˆdŠÞÑ,½†ØºuwÑÝ•­ÏeëA®GtÆúÍæï„ÏíÉNb¯AÂÿõ5¶ŒkDŠxS/[rlF‡ª�PÔ çl7ìBOÙfVdk ¤=0ý«P_ÃÂ!³æxHjš¾b—+tdíÞ5‹¶CÙj ï¯i¦;ïÛøU‘%îÚÅLÓÉ¿…ÒÃ:¯"wMG3íË•=hòèyV wÜ]Làa·ƒž)äXZÅîN ØÃE"ÂR�1‘kË®Tn~óÖÊ Nã/…�\6°ØÈî¬(Lã‘ã® g$ɈÏú?õ^UW¿1QŒzìP»S÷ƒ‹ÝôÒnü1Ê¿µ)9}%6�hækS;¦´õ›EQ…2àVª‡7âv3 ±æ•ÀÒ†eºi�– c‡Ø`…g�…1Xøó!í-+>éŽ!«¥_¡Ò©Y’14†ÄŸòܲ»7é«þ ]M�!ñÀøôùׇz!÷UùžA“ØX.Ú„ ÷�à‡ŒÕáŽÓö3NªÀG@Èèp?Фü#£’~˜b (¶ãrû##Ô/qñÀÕ lAÞó™¿V!tNË0 U”#y¶&UD±éJN¦õ-T\3PŸGĵ%õ=�'N <Ë(5š’$Ý‘c» ŠÊç£ØÁÏ×܇Õ÷öM“=- �D(Ïxó ¡h5É[¢Õ�è�«wÒª ü‡ô¥õ×zü‰¬Q´Cõ<¿ú£óe?)¾b(!Ö­ÜÊ”ñJ¶çù¦Á¥gN6C%”""-¦X›:�[ÜÃHÝ\d¢&EM 7þ!ËÞ¦×ûo©þÝÎG‚eA>Ž¿c¦?Ää�’{nVŒªkJ„ãð+>�½›ò/šÌøòÏŒPœºlyáv+ü1°m�³_<ã_ƒŽ�f…ìÌØëªÁ~½-)¿Nbㄌ©ŠÏlF@ÖG°¸S4Pkz–¦ Gé_Xxþé½ðÅ©Ÿ5Mm‚ã­…a  ·œ.dë“Y§æ·Hæ½;›YÍ“TTѯhÅK®&v4§[Ƕ-5ÚbÒmëqÖéFnÉü8²±±X”x{qák¿å œ7HvLßBÆ÷Üò•3¹Û~ƒü5Sýìg…ñ. ‡•UU¥ú¦ªòÐ Ñ�ó'èË1i–ÝܧäÎrè>uA˜‚9ÎÞ5ý§ÉÇÝrÕû2ÿª“…|¿�z© œ°!ü}en÷su†{QBìÎ7æ¯Ô·ßZ�{鯞³©y¶ê‡\=˜�<çY‰£gIH…4)-†b¹¯ojÀíç¾W]GÇm:g§1úSvcÜ»AaÚˣĭ¹æ¥ŒI®MM’DËà€y¹„ŠžD%°Ý ÕØqQñÛBl8í ?(ú™= “uWO6‘Äîó)ÕQ)”—‰T2†’(ÉŽÓGYÿp^åÆe¶/FEå&¢oÝ ¿ü™‹*qÏ,¸äýk¢„1”ËŒšÒ“ÉÓ< ©üœ5ÇäåNÿ’WÄÍd&uÂô㼂ü®6=`æ­Ãˆµ6~Лò5IÁ9î èðÁ´“jwÍ—ûÞ©z ;ñTwS.ñ Œ,DÏåbëSÛ�ƒ¢rlŸ|ê½).­VÚýH­�Mõ¢s=vq^¾F»hŒÏ¨n�Ò¢U¶0‚èkH Fºh„„’Bd„É•-9»ì»Y¢‰›93yI ¥µ"èûW†9Žl¤Ðº/Ht:8c'3…(„ÀQ$%ðÜ/§ö—÷m·»ŒÆp"‡…*3¦~É�.b¼%Ôóc4%æ›eõášZ{j‰ Ô„Äï¡™ã^ÕC?'[_v Í}~§$ˈ…öGËt™ÙuWÚæ!Ô9ĈlÞ}�±…è! Æä_ÜiÍœ&™öä’;yHø=’Q2¦GÏÄüû�hQDXbÄŽª¨ è<úX<åö‘ØÔçdÅâêmI’œÉ…dØ x_ 6ºíòù2ÙÐ^ëmv@:kÏ‚ Ë¢~"£YìlS¨™5ÁÃ6vãˆ0c׉e5…XÇ¥‹ȆÂמ:qÝMÚ9œÏIÕùš$HÞ�sâv„±©S±Ïlع#nvüª“jìd�8J’ÌÓX¹ cU¬š°B)0U¶ è/0˜ñ‹,ÏÞsƒ»ìR…´îÑÔ#(ws*·Ç®¹lI&î¤DÝ^™ ¹´½ÔÑ«øüšN¿ë¥±�cƒ¦$ÃWH„ ¿ÑÜø™tw;Î ì†�,Zé*Ë€¬Ë»äüicM&¦Öê){i�;~úµÕ‹¾Â%rÝ|ÄÇL0!T/s ¬_Ç©\–ÿsWì̳Uƒ&‰5JXùÉ ‚U6q®Wf ½$uÜO >2øT�䎘 º,Ì‹˜,¦ÔEù luW•-žåöŒ›á?3£ñ”zP™TMúsÁhLx›Ìf«•î;¯¹Ñ¢÷ÝTçêÅd¹4~d$MØšI˜ý' ˜ud²¼‚ËhñµH*!ЦRƒÂs„‘5RíÇ�$µõ©k ¤6p÷Cë”]ì1ÉŒcR‡œ‰¦ª ðOgl�IïÇ�>õþ:½£öGóËùèéé 'ÞÚeË`pŽ«µÖKõÃê4ä¥'Ü×»6ÙLan®¢«J.šŠÕg0�UÂ-+uñ+äXÇКƒâé2(®‰üÝ|á$r ü¬À8’v·¼5Õ”R¦0 ŠÆ.B°âc�¶i1‹(@(›…¶ƒ öÁù~Lä ü¼öGep‹¥° l¨^¢´Ã¤Œ^r¬Ÿ—;YA„Ø`Ùÿzôd’yêîýë.­r�HÎú¶'¿Ö>IÓ¾|½ËMšêmßbP†Å í‹Ú&Ü2�ÉfxGH˜­Í‰Žî ˆŠ—ŠânÄÊó'éæúè7¶õŒ‘´b ÕÅÄéÂmw<˜ã¡¤»eæNþ/+¸Q�ÍmBE»ƒ&[ß> ·u7©±Í˜Ñ1u~tÔØã¡&ÑDÅÐ|,ˆÐo$7iª;e¾”¨=¦ÃË©úU§jCD¬#%®WÚŽÁÄTA‰;1ªbæÖ¨Å³³©8ftA«Ï0ÔŠb h&™il˜Î§·&ʆviúû9ŠÙx8e5¼„¸«IGÊÖò›¥ ÃŽ’B\ÇÅóþ¿ªˆCSZ èŠÏ&5 Ý/Ä�ÒætɲYY¯Ù1ªlS Ž9"ïÆƒf ‘Q\ÎKÖ… w .<–¡Ê7*tX‹£´v˦›»¬TPÛ¨U¯1Ûçh_§ÀÁ±b÷»ÿÖOr¥…s£JW,7H�õdòLè("…¤ÄN[uÓ‘²ÞL}c…LJI$Ë Eý•m¥äoi<írÞ[¿}’(K\…ö¨T:s$‘Ñÿ¶·¾>u·|Å ×yhÿ4/5èVÖ“Ã gºƒ7!b¿ËÆP‘vm2ÿÒ~E£–S‰>‚Ô.ÑY½ârㇻ|'†:.¿h+,÷yykBò9Ñqp·…�«Pü›Øð®®Ê$q¦õlé»# ¹Z¾mßf;<*YºoGËoŒ»�wÊ8(É& §š|b2Ç6zu¶Üºïœîׯ�ÿ "ð¢!ApT@¡V"*DENÿöóòñßà ÁE±Ýƪi4ø¯îi´ÆvÄu@ �¾:÷[—ÙVÁ �®_'—:ð‰Ãã:é“ûŸ.'eF€ �ý‘ÿ|dØdÓa²ç±¤S‰��ÿ»aMs°r$M8Ûߥ€§™ÏYÿT^�)�4hp ÿzñ³©Š;‰ƒrãîDiîDôì?1ØOÞ>ì`éN‡@OÁãoi©ÕŸƒ'ª™7r´½Ñ_Ï‹cØØ×LcnÈö/i‘6�"¾DiÚéd3ío,dq�ô®ŠmÝý5ǧ!Ô±¶îÎ*Ày<‚�8J½¬üÆ0ˆHÄY¨ù\ŠøýzêÕ{uø¿ø«ÒCF§×Wξëß ¤,´[ômz¼sSåR* Rw„ƒ"D<ΛܴŒb‘boë&4¹9@‰�¯A B! ©Uú€€|‚ˆ«žîÿ/¿›_ïù×oC}Ý=r¦?O¢w˜ÆØÿŸé’1Y ˆ#è^\^�˜&%(USE¡„NeQï�ü·ÁZâ®X_úœfCŠ ßÛþš'‚øo$,&I£I¤—çüþߣ›üîý×ÇÏËöìÃA:0^Þñ7Óã�ƒIõœÖ›cRÚ÷V?†…!Ð ž1ãïòŽäX¼¢'XyC~êBx5Ê�©0qÞæÍ©â-(B»cÊÁ}“Néÿ©Àl9|®‰ÑމAÀ!›�£>pþs L);ɰ Ð|¯îœõ»P3Nk:¿&gÃjÁÁQžÎc;'é¡8~B«FšNÝ6Ý�—EÜ* C �U8`-Ëý"�g—�ò~ˆ[°§žÖî8“3i-Lâv:(¡�r„_üÁühÚY¨+ à4hM u"¤Ÿ‰@a”,•}�B ÉÍÅ‚›Fš'� 2ßq1€‹ ½,9+ƒl¼çbØ8‘[ö9]âœÛg^ÛjV32‚ïŽëÎå ß¹9C¬ðÁ“f­oˆÖ:,'E#V%Ø,pq\=Þô„(á¾ÊFm«nZ=)V£dÜ5´ß)­£½b)½ §½Á¼˜ûÌn‘&±OË,Q'ÎZZÔ.¦ÑÀ0p.i‚é,'˜Šî.Þ1A=ÌÀä�GÊ›IJÒ\EÔbˆ¿¿9[ü’þǰݠcH4nú#ÿã9OäF¨Ã+Ã�^®nM˜·u÷Úrœ•®ƒ§Ö¢JæUù•*+‰yŒåâh³ôµ‡’×f ݵ¨�ÀºqEGFãqÐ× ² #ìAÈχþŽ{Ú óÍè§�c£#Ô(V  -qã§ þv ”Áç³ÆŒ=[681´êp=ÛÀ8Íî€á>ÜÅzÚƒ�½ ßéâ>TIŠø6.û´;Á¡“‚% òna÷‘– Áïú¦��_?ßlÿyÚ.{š<@€Ãûëüµ|$7üˆ>šy¹ãCoãüÀî©ÀŒ˜™êîàó•øÕžzQ�Ò ™/Ÿß¾7ôµïmóTמ_·Øé·ôÓãÐI ÃÆ±Ïz‹ýˆ«£Ìÿ6éênmîtÉï±�»Íá®´sö gÚd…1†n38‘ó>Fìg²µŽŒ¸)â<ŒLF݈�©‹{—ûýù3e‡ËAdfG󦸌Óu¹ô};H³9Vô†i×ËCµ†àùö:ôV¶Qмþ&7=ÝŠõd öœ&CÔ/ZddRèhM¼lURlÁ®‹*dc¶uœ6¾-²£èÕ<ܬÿ겿c-—Oè¼;¨)�·;ÜXe‚ûÏ`£:΃ÉٴîÉ /:i–«q®ªNŸ¿KÂPϯ‰A@ñ±@çL"dÅy¨miýmd²ÄÃÐrVàý�†Üˆ%€ŠW¦ÆX¬"£i“ÔJÖñ´f17±Œvñ™ Æ–Z� ‹‚•ÕÏxÚB a¬±ç…– öOÁl3¥Ürü䜓id{`´ŒÜp“MØ�_�Üfûrr¾†?+î‡|nh²H0ä‰GKž�›�'sP{‚Ñîú×*Ô˜¯ Ía™†É*]{�üÔ§J¢oƒŽI$ƒÌ@±ÅûæÇ�ºx#<2Ó2äÏÖ¹ÏÅ¥’ú‘ÓN6M(kà¬aišgÐÄ�÷Œ†ˆ™�ûgîð<5§Ýå§[¹QCùUý8¼˜éO†Ê‰9í™,Ÿ³ãs Ç݇Œ�aQ;HÙ¬bDQÝ‹p»…wrU0\z—™ÂÙ=2²j)ƒºÄ ÒôS|\è¬ïv}ú1�9.m0㙈O�F…3s}´ò;q7›(ÝN":Ö¬H:Y Kå §éû¶—:{d¥zÕ§?«3SôN9vÃe�3 ?¨`ÝlÓD†.Fš£4ûçý›øòÍ£[›ø¬KôWWþu+ÌòL9šÌ&;Ñ·b�vCŠÔ—ö%®pO&ÖóéŸÞìÝÅÚ S°Ö UË’­ )±mwL<ç¤kµC†¿ÇÇ,S^’—âáûó³‡Msé›ÁU5¶“0#|ùYÁß ˆ?3a¾“rfhV’zA^ÆrVåýô+|·âßµÍî~ bóôxsò3Û± !¶á³8éìU¦Ì"¶ò•BQýÂÚËäñtx4µÀâÃv‰oÜ(1´ÀÞj.œøx&j3'î0jo®Âþ(‘$(ßà¡pŃ%ùƒkAÉGIÍ‚ÂÃA”fϵƒ\ª¯ afìÓ�3…ÐÚZàŠº‰±~/ZÙ¥„eÄ©&> ÃÑä˜Ü¬64ÃØÑÅñ%Ýá…Œ E@uç5¹º(ù°0®ÁšPêY<ýñ]h ÖêÚ;¦Êתt$GÆÎµWv�·xnËø‡žä:‚}_Ï·( ˜Ãz˜!" a5+Jhúú÷�£¢ê}7�G_wí%FáyJ��¦Ž¯dÙ7HaÙ¹®3°€�6§qˆdH®K+w7¼×òý5¹“ µ½g@_ÆØ€öüóÍGþN´¥V“j·!ÚJ¡ÿ_Ì›kµ�tA��V#™m™)û=g¦4|`m{Z/ÂrX×òþ˜ž›²³E£õ¾1�pÝè(x”�³‹™»üyØS‚’Nú "“/D Å–Ä€œ\S£vn$›O Rl„ýq§×�B°ç‚÷‡Ó¤æÊ;é ¶ì.ĈÇÂýßߤ8¢ú~æµû/Î�ã)¼ ¯`X*�m”õobÇáci$ ÎÝ#cÏX¢ ýJš%àìiº°�³Íôúg·µ–Ü/ÛnìÄϺ�UçÔbÕ"{ž{ıÙÞ߀.>Ϥ¸&ŽËU­î«fÔ®×ê%LU?,�$c'§\¹Â:jï�這 eú§(9ç ûéC½ _w. ÒL†3P!3áyç¿ âóî}Ð6_H²ÚKÜøDW÷žní3=²€ä'=Ç�ù�À&ò'YçD1v‘ªu¶ïoJ5¾B!qé/™ ð;'¹AcœAk¿Ì,ÈŸB˜» €ž«Vz+âøGT*{÷ÞišÈ îwÛÜ�‹Y×�p™:b à’rMøe2Ûè:5Õ¶œ J†3¢«…4ºhÙêâQKݹ'ñÔ¯îTÍ.”HÝ[Rï–á#Äp»Ípk„Ý·"íè,çÞ®M°Ç–—O�úËj­©÷Ľ7H;ì>«U7"ßò3Ù¢—ÏèñЩù™ƒ°YE$èÎǼ¸Â?VE‹ï]±¬±Üæ?…“Y¡eP#,‘—¨£xEâ¢Y©çAHв½Žáƒ5 H{’‚eŒ±ü´‹–{ûѦCJ¦E¡Ú„-àsÁõ"Ͳ�ò‹\êÃ_fkù®ØV޳Ò%ª™Š×'¸ï²ç�`©«þ>ÇwÊᓉdV«3x4(-õ¡A] ²”�‘YkdÐÂX.vÛcɱ¿IÍ®.´eRˆ�6 R L¿S'Bˆ ÚÛùJ'PuP?Ù/¾øßˆ·zÎtû¢ÕQ[ÆHÇS£l (¤+4ÓìãáÌRgX <Œ –l·{«Ê‰®fí¦f¨vª�ê/¿Moí¶®V:]õŸ f:ƒVÙ¶94SAùZå/” ›f�o€ÜÅHYrDP'õO•«SR*b•ƒêtg¹çi[#¡GƬÝ7ÀàŠøÄ¨n‹dÁì‹ýFÔ,bO& T†«\ìáC&‹F¿‡XÈäÚ?E:Þ2O[oõ{ðŽò}�ZÏUÈs¹Zœ…Õû‘]¸TöÙ!…ûX´±}Égvæ\ 0ŒºPøÐ¸Ou­Æ-ŒËPn™Ñ\™‘)� 5`VXµX \³‘®qÄÆ¡ÞG¤j.!…0ð?³– ¬i¯CžHAÇÅJæJÌÅè8Ãm›\Æô€6 Ý4ËM{)B¥õîPSÆ)�7æMYª#¾A¾8{u8NÌÕ£„m7‰,OÛoØ7-~úvFM2y00¿¿>£ à6¼FŠ“Ñr‘Nê&Þ2­Õ ´¡. 7Z° Î’FTYÙÌQT* Dy›�Ü�ý�µ_9‘®ŠÓõB•Îc�á„ôWJ ‡U“‹”fÛYå¢ã,ãýP̹t¯æ¿ªˆä¾á(ª¹£­¿Íý´þÐ]ºÉi‰¬ ·åÁÁŒ‚…ÃÉŽc Œ+ÿ4{gAVñŒ¬Xu,üŸOŒÙ±•·lÓ¸!ú$�@N“!Ý�®$Ë+Ì{‹”ëât;…ƒ™Ú_QbA¯²ú[¼‚ wÉb3»ômÀÐO-jùdþ Þûbò;�è7¦.æ¡F,WÛyí–ü{�™‘€ �4“"Ø Ö粨j]=ÊGüҌDžYÏæ»ê�ç™Î(ýó¸;µ†Ôè7dÝS*=ƒ„ÏÝO¯ü�nO8‰£4,Â`ᯠy†ê $¢ë½µ}ÎÌ(îf°…Æ‚½ø3¼_2ÙCzCRÝŠÝ�è˲‚,Êp²�ÿU�&C:c¯ :\Œ¡�Åè+‹IB#"œ_3qgpÜ[ÿRɳÏÝÞkÆŠ<ý–2²I9Û#÷ÒîbBÕO£[”L„ÈrD@�3ªnÌ©µxjµÄ¯úŸ)Ô®šO‘•Yù`Ç›IÌA!Ue¡Aëjº#ú™:GµR‹¿óÙ =6k\_8ÇåWrŒWÛÆì “^®{#W£ç>Np•M§V­P¡�cèÑþ_ÂxA3d…ÿ­Éo“>÷Ü#“Ñ¡d8‚K°?õß¾^¡ ÿÁΗþýƒº˜î�˜?ÐÀ„i&<Øø)“HØ×@ÔÚ�ÏÛï�á¿£l§”×ì·‹Œ3ßB%®{l?ß�o®á…O™,!,GòLè¬Bßæ¯wäê{ ¿^G‡¸Í5{Q×Ë_[IîFòA¼d?;óßù„tÍsö9ÂðÉÎfÖ·¯§øšœßN�úß�ozÇòÚû“×Õì>ÎÆ‚(÷Àvï9ôåùÞð!¼5Б»¼„X:Í•t*öºowÊÆ�Iß~ÝçÍÎi,õ<(“á÷C¸èijî‡BÞÝ7þÄĸ(±åY¯g§�Ê­xw~ç^yeƒþæ”x.h¬O©ü6ÔŒÿèÓõþqE £±XA×$A0EÏ wj"z ÿ4» ‚­ój)‰æÇ¡”P°3ÙÞ|^âÖªFÏQ¡]‡ëƒðZCHvÌ�ðÏ4Bo0L´«óÖ&N˜j䂉ŠÖ‹Üa®Ä“b�8®Ò„>�ÒN�«È�î9ÆÁ:÷Ü_Íÿ;¶[Ö[0<\@ñ�?<öÛÏ/<³]Ý,›¶hcÉXòT‚¨Â�˜„¥Vaýz¬Ël&j°ƒyb;vgI0šˆ²£»»>ÄÝúϤ^·ä�Þv-a<é÷í§|b©¿¢»�ÑÓ¥&ßžT}´¹Ozë)‹<-ÖAN›TÐ�ïÀßÜV¾¼W‘‡5zɼ@þŽOW!›;¹(ÔÌú:£=ö.ν'm9v ƒ±‘ˆÖÉ‚ñY<5br6°ƒœˆª,@âqkr–kK�åÍ7�+êÆ §'²ôÿ„×|æ((‹ïà>ø( ò(zµC>ó˜ŸåçKƒ”"Ú¦7’…é !ãX‘‘p0<–еÛP v£‰ ™™�ö•&nÖöW•8Ÿì—¡=å‹ÁlGJÓgUÙ¦ó!$kÇÍ ï~Kí½üŽgÑÕS25¬>µ÷‹¦1òj]÷è7�î ¼-'E1e�|¡lôgŽ…l•âj[4}ãÝã‹! X7þ&ƒA)ÔT’‡�3@ÔklÄÁ^?%¦ÍŒ ýÄ]D¨ý¯ó&«µ�„GºÅ8õ{?w–ÅF¦�5ˆ'JaäŠF'hÊ$ÄE Œ¸XÁ ’Øä¶úôvîùfa†RÅHÒ|ø{#œß™ÙCͺ£ í’DäþM ßZ×…NO¦ž8Ìk½÷x‹Ç°ˆb›SÿÎ5_^<†ö�y¿lY>1? Ã@ìË ÌfàÔžÇWhìÒ"�Ñ*Âj…®ìÑ‹¶wb⢫ U…sØhŵh¸¦ ‘Ì› È°!^Ë\£¿Ç ß8rA9ŸzÛ‰÷rß©Ròo�ÊM±æ”AÖGa7ÓombTíÛÚ�ÔZ5Î ÀÌÇB¸ržkŒôîZÅ«V_ `-ph¬’ÃX‚-唣/’³Ô•·`F¥)%n•_Q»ín‘&½ÿÇ®öý–6Fº�Ùúq/@Âþ¯à&í“݃÷µ˜Âاví�•çж{Ñ¡Üm´¯‰fÕÌ�çZjáÜgy5¤dÞÑ?Çß3ä0‚¹¯ ¼ŠZïLy³36Ÿ,•T’W‹ÎÓCgçVÔpiXQW:¸ó”ÖÈŸsa5¡ê"Ÿ=½× e¦Ñ�Õ…Á£?›wÓƒÛíB¼squ.eL^6y ]’H´žsdã|83©IfD d8åKpñїԆΩd™éÕCú‰ŠÓfï3eþÌR*~ÌÖ#³Oí ÍÌéa‚Ä�éqÝÈþS�Üö‡¾³u�ZT·ñàF„X5² TMO:çÙ3¦}P³8�b}Ïâ*b�èê5÷1N“±È&ú -ôAÎÑ –ó؉×`Û³v”:Žžù Í °ug&ëvè,h½7"ÿ� �;-ue)Ú 9²Œ51."í1@† U +µ“|þK‘áŠÆv‡ŽN‰ØIHÐ`è8èèS�W+.@Û©ûµVmƒ�¡òú)kGEZà°gL>ã5l{¼ôaa.ä@Ö:C” »ÎÍ íÈ+7üm/&3,Uã>)£ùgýh HÅfw6'.ÿZL~�0ýbR Ê ”ñ[±D2‰% È»\Õù`¨Îo€ Ya¹-,“çP¦mäx£­¸£Ÿ•‚oôob`×ñêÐ3÷Ó—sí—k8µqºi§'X]D“r’"™ì‘-·ºÞ«qê þŽñ¦£ñ©uçÂT*ò|d%.¸ŸÊöß”úÙ�.]æ�þ=é({>ÂyY2á}›{§eÔñ1“_'ahEæ )zÛ„{W¨a\*øu¤j³rì”}™Ê:uõªÔãÌÝO»‘혚¶Dtt˜™Ê&ÊAZÇO²N)(¤§07êß Ø>t”;"8^—ëa}> ”ÔIŽRCŒ]Ž_`¤p#‰7«8aqÿO¦QaÁ…~ï�' (–ïȉ:cç:Ñ­+Å6e Œ h’¥Ó™�…< ßúóÆ)S¥Š*õRÜziãï·‹Tô°X¯t‚�¼QœKÅ0i±z«.¶BÆÈx_éXöäF‹õx!`¦È¸ :N†cÙJ/ÌqL9(ŽAKDÃz«õ‚Ð29 › Œó±ê” ã¶�ØÁ´»ü3ê¼^N¹œÆ—׎i·×ÅŸLõyróXkøñöy¬{î®ÿòüƒðÝDd&<íM.#?Ç)ÀJ){O’½ÃϸØ<]ç82ÝF´ß²lg°�É(qD^«‡öm�*$»âl^pI±3÷$¨æ##çßsFøØTŠûß&öì^0¡Ðƒsáo¬Ã¸¬@æ²Ûd9[1s\ÓfÝ­¬…s®Q"¨"qÌŠô‘‰Ö=TÑæPúXئ"x•|QYÁ~–5‘Ù´¡ËNÀ_ÆHa * .-Ì=RˆÈæj¿âgË�Ù[slZÂ�`|µt‹ŒýÉ׺Øw F¢G.ýðM5¦ÖÌ j.‰¶Âz²1î†Ú[„œèhn67BŠÏK[•,Óðð+kÐç–3.–÷ùK6 Òw0V�Ç×M- «’­!,•h¯õLÇu¿W³okW.Axãò‡Ð|}̯©óçËg´_ˆ:d[³fsʶ-ˆÃµgüúYšý ÎiŽg}ú& QˆØ)Ñ›»�— 7žxÈ”@}ÓÑp�bKøa4Ej`ªæJ·ÎÆ(`=Ë«Úz‘ª? "+O  Ñ¥wÿš-s�YoÞOWj·îtvp·ë–A^Øw´ æbÍ×÷Xýü�×XûëÀÈYo„º–ý@-ŠD$*ÑK“äDU uµÿÿÉ4™¾¨fq«¥´Ýa +J#—>œŒué‹;�q d öá�|ÿ�…ñI§³ê+Hž¸cBüç1÷¾P’£FûVå�ž·Áõ˜(µh.g¬+ &XhlWžúgOÀc¬3È�ëð×ÜðÚ�çv:áœ("™­D™Úu—=:¯~•A–� ‹SÙÙÍšÀäc”eï\Ó½¾óaÓ.µcý|=ìŸ�óÝ3L‹§êkäJÖrþ}»ÊÂf ÓãÆ¿B±,¿S™‡Jä ‚–ez¢©f D¶™ÈüŽÈ8=¼qÉîw4\×mO߃ºÛ?  dû|ÕKñÅXà#ûÕ=wBêkño€úºúÐeÜ x8JÆ3°Ì÷ Фýà! 1ö“Ù»ôÐÇ àùÛaĬª8žì°fàa�pÖ$íœÚyé䈣±Æ+Þ<ëzïÌØžÑlÁ3~�ZƒàH ‚xÈBýékdçõÈ�¡zQÚcx c!pz ƒ3®çaxÌD¯ýêL±§ï —úßÎ3Ïa¡çi]º¸†FÎ|Ïq�Ã*­Þ;Ñ´&) >(¢êЙ‹ÕÖ ÷�…צÌ6ÈeòÈÓHk6É®£ÀKjQ{áDI@œ²–„JðäfÏÎJÅù¨~oŠÁOܱ?r)­=G.ìIžýI©? IdêlÁð¨mÃ>0ÉgŒ4xhÜ© Þà-j5hÞ$´I«°°2# ˆäFM‡8ñwð ‘çwÐIžgY‰sÄ&¥‰pm}¬}’ÙÕù)šçã„Í”nÚ–ÂXGMËL†'ÔèI¢“1Õ—ÍzžìwPÅ ‰Z3Яáþ‚Þ%^<7�ËÀ`Në{˰Xñ®SüË¿›ógÀnˆ?w"Ç@}lÞYôS}Þóyò{ø$^«å“ÏSóû_t%î$k¼àwcB®õ`/Ò¡ÃpÍý0D}êÇ‘pÜLv= €Ì{ÄÁÚíI‘Kv|há=bQ|�ì$¶Ž«*î¥É£†ãâúä�ÚÚö¡Kà¨+ÿ¸ûWÓ( %•t&è~ÛÙÛ"—gɦÈ¿�¹‘«WS¾0‘SÔPQû¿Ä­ªöa�6 Úo½Wó×ÓŸ�¿~â–ûuçóÃÎR"9aªJÛî¬ßŒ—Ê�™)ž§é?¸º;èó\”d1NîÅ“œxfäó|?eF§Ër/s­R¤³w+wCɉ@áÈãmÑVd´Ö>ÞÉuÄî S›TŠ‹†UO¹ŸI4/pÞ³—ÁÄ$�ëpBopóð™Ž�ð±rÅE{ö³ù€ácÒ7ΉÆ{¡ämÝK¨ò0êâI�O±oe.l>êGY1ÞÞ™øì†è)2€&e¹�MŸØ¥ƒl%ùT)¾¾íoã�ýËxù *qfžáŽZnœìí[’3ÜŒ÷Zwrõ´¤†‘ÖÇÙqxgž½´ mxÝ´µ4ç\÷fQŠÝá²–»˜CÊÞ÷ý°Ÿñ´‹­6†ö®Ô¦låÂë£9K_ýõ5Ó×ý¬•­çÖ/­hÞ9™u¯Ñë¶í7ÕöZ<9ˆÜ1´²A£bNÝ HM›m«èÁŒž~ör×è}™)Ôùšû=‘²Î9Ê�®±´õ^L±«˜%ÕK6/OXy÷¼¶yús¶ ‹þìðAã"ü/…†JÄõ”wÑ®±¼Sé·eÌÁl,ý*qF%eëúf³2Þy¡Åònš.ðòïœP‰~~v׊„mßÎoôâoIŸ�ÊæÊÈ™˜ ?òX&ÜÑã¾zŽ–E"ÏÆçO×{ƒþ.û&~ËÉ7Ö‘›¼B&ÛrGäS=öXÙ7fçñ±b-cw�ó¶Oi°Ü`°ü¦ô‰3„|Œ1¾L»ÔnD7J-%+OOùŸõ39¢òäi2cá"$˼"íí\[J°#g`ǧ_Pmv†ü(eóZgÏ–Ï^\zé©ë.“æÐ-&{{Ò€³´„¶²yíoC]Üd܇L |ù¿iö�¶êƒ+Ö— ¼0zª�ü&¹9v<ñ®Â½1–ª½!aùL’[˜÷ÜÆ©úUlV*AïTõ¹[«Pð^ƒÐl“ªÂnr$“ªôzÛ—iånÑã5_N‰àEÖÕÉÝ_pÕÛ»"ݵ‰X6š™.Qôᆲ‘ù8¬¯ºqT•V¼Ö˜•)†[.¥�½½îFá§·UhĤ.R ˜!órœ¸H%Éo›�wz œÔÁ1™8Ù²C #— ™¢xãÔÂ’w4�Gï•Lûou$÷µ�]òþžà^/.å¦Êô�Œ±A]¥^Ùn ‰ÚÖ6|Û¡6î Çë¬ö8p\Ü9pµ²ö„÷¢É˜£¯IHŠ9´©£˜nuJŠáªS$ydØŸX,‘�o–Ë¿zÌDÐ& Ê]ÙÉ‘O9j›ÔnËÌêùíº‡âœ•�žqÏÖ™ÿOš„!iád×,\G}ÿÒ‰ñU$Eµø�\r7sý�âÊfS2ARô YᤰÓÛ?j³-rͼšÁÙéL(<ð%ÏÇ^jTQ„‹ ¶ x¯jaCÑ+2¶¶jX5I\bЂ^5Y¥^·z¯¯]¤2ÁKð.´Ã„NF‡JqB~¬ÍÓ2„Ðò€Î ™9õj]�dZú2ø†\è§ ˆÿj‰_µoð‹Sêf=œ 1ÙO¡€ËýíÓКJ9õ ûÀÀŠ?À-Ùð3¡ð‰‘þTé—T9ÆúM³ûŸãèëþ=Çb®K{Ó8BÇ;ÚÖ·íÊù…9ö��üŠäÞˆ�ºçÿ2špN‘|?ó½•l>§3�óüz³ãK’²rT;tõG¼ùÆ+cóù΃»ËbÚq€¬NtáêôΤ@ ´u…›\ ´ýz„fîŒñßbéÕÌl=×—òm›dfôtù"uÆ,ëbÜ~q%Ú¬‡^ÄÒ„Þiøöcäùµð¤£°†ÝE¢Ôÿ?äžÎ±r#j?H5@¥ñ£bq†g!&ÑÇ1|L-$k§ÝŽf‰¡¶nøÙ›){¨:gc �{ÇP ó¥vr, ózžaâñCÎÀ¢¨!¹ù<?h…Lâ�¼Ú:á|˜Ÿ†}‹NØ µj†‡–Š�Âp+£ÆŠccmß¶Ã&@T,0Ð {´!/$ÞÞ*©ZsÃ�½‡¡ø|’A#—‘NN¹Ûpx»š©:yœÉ§’!YCZ1S†–�Mn¸JÒ(�,ør�†üºfþH£¡ÀÏ:÷6m#Œ`?�‰~4Ÿ÷”<ù+FH¸‘«„ˆD ¥ý·’À²U¨á€™M�Pr0±O�Äg„¾C`­Â/üñTxÛÅ�¯Ã4šK/`%—x{ŸK!Xî7ùà„÷ \‚]Ø-�ŠŒ;~�ÁÇæÀ~¿¿ Å÷!qûdVó̉{ïß#»×¯ßfcºÆØ!CXñ±€B½Ó§=1ãd¾6Fô„äcåïB<êÓ%ø ñ ß À°Âþ„)=§›¯3Rˆ›¾ÆêAÜú¥i›(HI…súâ þ!E—Ø%=úÜ cA‰ºèç‚`IëîêD�©;;ЬzVï§bkß*YTöãC/yãI„„“&;³PAÒ—£‹)øƒŽDÚ”:‹ÌöŽUÜ'B™,Sh÷ÆŒÜJõç‚ÁÃzPt]¦’„Êì 碥‚‚ÇGµ©Nu¦ËÀ7‡·ƒ¸å TG:¸ô%–c8PYa)¥•êgéØëiÉqɘ‰óéò£çðL™ÙËnHñ J¾pº �xgy�cb'I�pGž£‹¬a9P¥´1æÿf!8Œ úúÉ.Áð¡ùÙ`}^†¬ñfâ68ɾ{èƒýI‚û«Ì¡a�IMˆNÞ]ŸH„]TPýæ}Ïœð�yí³=å1+¿OM’E`²  ›¸äiÛ|ÐuÜ…Ü�W¾z@ÌÄ6ß:^-ïÉóòÄ`Ùô©0\x–:\ÇÇ£ÜJ¼À¬]½y˜ùô²5?¬f½_a5ý«–FJ|Ä r< óyú¾Ÿ¶âPÓˆ>Ü¿ÈÔNJ½…Ùå) 7„CÒÍÜF©5ª>�ÅÚ�H÷Ú„(‘ËÛ�¤ˆШLÄÒ¿“ºþÈϽæã�^á—DãÍA-^¨Ó4Pá¹”A º Òõ:¸`Ž\�’átvÌd( ­*1‰%­i°hj(Š—ç#Ô®� ¤=þ�l§�f”oÍ :³0Wv�Càõ�…¼ÄŒ,ÔnZÚÒ®'…Ɇë W‘88�ß|,¤¸>¦ÉSqN´�rt|]ú›t=grô¼�kuhבPg©ˆ åº<Ñíþâv¥chå`2 ®KZ×�½,ó7§ÔéQsîkæ¼üËØÀápÑàùúø:áµô´X„$1é/͉û£÷Gͬ__D8»"Èc²UùÏžfÕƒÎo³äJk!ÿ«9Á6)…4¢Éä†CdF †0 Ž&4c9™öÏ '¨ÊVovšÁµÊ CY´È;tèÇ…Ë“rÇÆãAT^Øä&WrÍ™SQîdÛidöÌb³‘“…Dþ"˜á 12‘$ó;¦+!ÔŒŠXC‹DEæ›Æó·h”=1ðd Š´Ò —dØ•¹ >ßÝbDþ{¶ÅóǪõÁá§凲1¡ì÷QV^„üo¿±M§D<‰ÞÜð‚1 Úçh$3�ÖŽ§ÁêMŠ?†Ò¹ìŽ–½±¦�• 4Xøße<ù3@z80®æ ¥„Œ´÷/mz8c3ŠO19L^Í]ì1�¾mW4îƒho‚�mq‡ @†°Õ£ªøtá¿¡DŠ&ÿ¿GCFºØ»U&!BR„œGVÆÁCß(Om羋ƒb‡!¡Œ'Rƒï]C1„Åê¸"{ú‹„.À@ìô0bÝ8þ¸ã>¹'XÜó!‚ïYØ:]�ÃKÈ ?z»ÇâA­·|ŒE×9°Xcx#ð\M)•ž0ìêª\3�9çVhxƒCxœÀå`݉p‚ŒÃÁ³„‹Ô ñ¤®]É—²HÉ�zÄØa­M3,ñ´Hœ{kòg”v&棲ýÍaÂç^³Ä#NVå2OHe{ hP{.5û§ÆÈ¶S ‡¼�ÎÁûgFÂ�~ÏNYµF LÌg;j&È(1ß�Md®Ð ™‚Po}ü!psšfÀüÅg¿0ùï[$ýï¬áwjonÅ”­“{cN€Â®‹‚Œ Œ ¥±P¨Mh'þ«Ë¸HñŸöè”d™˜EŒ=’á^MDŠàþHÇ à«S=Ù�3†ÏzÓ!YÝ¿•¥Äv­Ü�?fïüci£Wæ+¾�¹’YLdá±8æÛ ÒõÏ:ÛϘkÅŸœ¹h“BøSó·ù_ówÇOÃG»…’Õ�ÇÇ5�–ì\`VoÔ•cÂÎ £àc¤1€¿õæ%òÓàωòÇ0oÂ~ ׈1h˯äÝQ�\W£¯UóØ¡ÅûÐïvléÃoü$øÄ¬š›Þ&I tS„Ž$Õ“Ï‹5ÒMÃ]ÊÇ“µœå�ùß%nF6¸Uuââ„nd·!²?J‘gO¢°^»ù¹N—¸à]^81ˆï[?otòUã�Ë6÷»÷zô*‘Â{¨æ‚#ïý„ ;€#>e›ß¥|WÝó4}˜žê$Ù»ïãQÍÃrdîšjkßò&ÎÊOUfm¦SÊl“y9y;¦4nd{�´*ÅB/òù^¹Ädr¬«Úñ=ï•¨ÕØ—½ü+¤£÷NC aˆÃ3™™ƒá2¡pP ÎÃçòzÇ-ˆÇ÷ÛFyÏÉó·£6–’··@áD%ßw{1¿øùe Wa3£œÂï%`3—Ú(Ãh:5{O_û(&cV”oæZØO÷Î�ð+¯}‰ƒ§»³üÞ�Èó½clg»SmKco-йŠZ‰GÀŠ¢†d6"+´‡€v`N÷2LPÛÎ;Ï¢ÿ1¨ÙðâcO2ø”ÓÝÇЇ¤W&Ì‘À¨ÕÀ­Áaà× ¿ûë DÇ"ÑÌ„Š¡þEEZd7*ÄÅmH—!žqɰXÑž˜W Ñj"ìJ“Ðé¤Î@à‹ò;ô5¯Çƒáéϰ.sœ™™¿o†V &¿ Û0YRLÁiÅ¡•ùK ðŠÅ|ÍŽÜó}ùfÉ� ì×¾‰²TêÞæ”�óp0Æ;çr£é˜\.†Fõ¹–ògÀh‘H1ñ²sÄ"Qቜ.… Å ‰œ*è”E{œcÌšcÕw¾N3 ?ìz#h*Së?e*S®WÝO´šÌY�µ›Æg/«ýÞBUN6ç¬íú¬Yäus$ûW%×Nåü<:/ $açßžÈX.P•«lþk50ªöɱº$ý|\�v<® 9<5ÚîØÆeÆ9½ e%CpJ `¹Q~»¿�Ž6•ÜÓ—g~ýàgÎÉ<¦]Âý{,Èî£d¾fÞA¦«h˨Q§"ÜM£w=VfÔU Ø0sEâôE &™�JýÊ®§íd†Ï-N^ÒUjý*ŠrvÂß“¹Ý´åUãføÕ¨I)æ ð W2Wêšš Ÿ£S~îæÛÇE&HÙ‡`t �Ýù“7¸_Ót†·]w9î¸Iâ³�ʇ°F‚˜˜ŒnlÑK+€¬† F!1I¼º �¤…�1ý&=’€?0EP…Þ¬+ˆì*ZÚcÛÂøêŒ¼�ÐyyñOû>ÃNôW²2yõâ ×è7Óœ£•VLŸäQRˆ ãÞºzë±ujž¾ûI–¯®7†Ë1j\D©óÀýíéJ˜�…0�}µöÒ§;¾Ñóš³jr9Í'eÑŒL,óÕ¡B¬e‹�Í‘:©øXƽžæ`~á7¾ûµB‰|ËwCßw4?�OˆýRãS9ü•9…p¯S›(J={Ät{Vå�.~4y�}æ6ÅWZ£™Û�Ÿ·„PÎ&þ7äÌ]ƒ6ñßÕBtçÙëÈ4\é¨É°¦;Ìʵ‰ 8iIË?7ˆµÉIiðxíUšKȱ'ì»]œç�Ž7ŽL«»q¦!ì3Y4·¼TžÂã ±áRx±0qr Ù†ç§ (?ž3HŸ!q;ˆÊêcç3éSôÊý¬æ`!*n3Äq} ž´,èhEáô+‹.Iù5eR½wÄj´èé£aé%ηä +„Yw 8�0„™$“$$%¢ÏCêØI»Š˜Ò¡åG:z4÷C¸&ìJ À"϶î-õ,ŒUœøŠ¥!Æ”¥ ÊF™P,`q›Îdö„m‘JCÒ�\^4¯Š±ùÿ/æ®îð1�… ¸Þ,ªúx×ÞY¶Ö‚¹Çkj[×T¿?3u¸­ÌÛ:XHú"J'ÇÒ9Ðv[–ÂCP2B†Ö‹¾W!1¢pOð¾‹c‘ËXüZzBîat¹æÛ9?Æ /:_¤çˆq} ð̘óë¡N‘ @àjéœt˜Æµµž·`Î2/„ln+r]pÞΰ. V€NÅ/ozÉŽ›>«=Y9ö­•´s¬H”ÒFжZÚïÓ–©œb§M«‹1h[s³8�ý¥€º%v-}ëÀ½!àÈõP1ØõØAލë°t»Ç%ß“‘QŒ‡PW�˜`ÆCà„v°XUjÊB¸Ôå"qAC$j 4ÜXtO»V€ïh™‘Óç�85w_t_›ûcØÕÿñŽ|¼mh‚ýû§¯× ½DŒoëDUåªNëØs·‚¿¤õ„k¿ff¤÷Ÿ�—öÛ﻾=RlúëÁ$SAæNs£¢Óµ][ZNMÙe£(èEQ&RZd2BBI6Öæeã*hH†<ÓgŒú ZFÚÙ�‚&(¦Œõ©ôÿÙ˜¼–aTWF}ü({0'÷¼ÜÞ66Žë˜é“LF·L›“›fÝM¬ÙOEÆqñ6kc“7_±Íø‚{ž§j†yÑ;!ž@¬ob¬A86%Šès뵬n¾æw´ûª7�ŽéÞ`ì¼O™¹ÎŠšñå�¾Þ4ŽÛÚÞC^N•7Êž¯dÒ¨w‘Ö")œ÷ãHžŠ`òãÎÍs�‚”Ã?þùÿà®Án>üñ¹&ï³ ÂòŒVj;ÐNaâd¤&ƒLX*#ÁX„±B­µøäy†XkN“8$J šòäÜ<0È©¬ î)D6¸~ô7UùsÇÿkÊ2¾ÊÔS¡2�—�Õ8+/c2™¿øú¸Õ½]ÌêyåöofÕmÇI=”Å©0‡†Õ «v¤Ñæ7Ìwê8¯ íM�œ;‚S½|íDRÿŸïãüƒÆþ'>2æAÇ$LÝCPä3þ´¦ÝöfEQ�öFå+ÉkØìœëÖÊ !"áQ1ó\Äx‚YgkÞ&ÕŸ{Ga9e°B¨­¦×„mlÉ5›Å°Çñƒ‚bæ„�£êûÿlW‚ rO*º7·ø]©'#G|çaM™?žË3ùëX9ëàõ+¨+å×gøKâ�Œ9^‹™+nºŽsát­> á�$”yÍáªØ»(JéõÙZtOð¤jÝûŠPU½IÎ7FÏ#¼²³7†~†³Sô›\r¹)õ ,dÚcõw] ï–9þŠæ+Ÿß+—<*t‰Pk3OÞX²!h4“ûx•ý‰ý¨/�´?68AñšÛ’¢!<(""ú7ÜoÏí k‡ôŒNÆ�Q¨ÞAf³ý÷çîÔzG¿‰¡ô&YÃ#†9‘%YÊs Þ6x[µ½o »6Ô5Fà\,æ°æKq01Ô†(ÅìrU�\ŠuÙq²áÍŒšN•p»#p¯ïå›%u¾fxTæÇò †Å�|€ùG>ÍF~8Ü N¹BZÈt•&Úã= UŒX{Sô‚,0*%°ÜOüŽ’s•až…GÀ�çæ0¨ÓXÜs¡þÖg©£d#µVjd¾iEô¡dÑF�p{¢FÜ™Bu~¿•ׇ©¼+žß%kŸèÞþÏÝ„ðlºsÏ`xòPŸš€Þ]÷�8d–êxÐŽî¶=á—GEŒÚõ3æ™*x�Ç™«X¿d¯‚ôh¹å îfKxÑ^cÜ$žÉ®[~è>÷Üw!zu ŠO²å¢ž¹Rì‹�2Yò¼;‘-\×Læº9ÕhãÑXGÈ5æM)I¸ýI­ª9#Ù—¼âÃQ½�ùNAýN!PŠ…Ñg]á‰û$Ì ¦å‹Y?8eÞݼæV'g�üÀüÔY·-Iìß ^:/ÈeñÃ’ÄLÀBy3F˜kÑï`G#ƒIî»tÖEÌ–’,÷ÐñÙ«z³”ˆËa s�?Jˆþ§/Šcæßv°¢–áaÑõ.¥Ë„ĆW¾ L�É¢ô9­:C®Ð�•ƒœAºs¿±¿é>�ÍAaìñž�‹Ùê&‚̧7*u”p&í¡n#q‘̆T1­Ó2@‘vÙVWbtè•X›ÿ©/äéïPð`‹ø¾NdL�Ò~<ÖÅD5ÿXŸAI'<�¼|”0s!+Ovæ�`÷’|ÏÊÆE´LoB0;ç‚à).¦ÐÁ4�'ð„g‡›hã ªx¯è«IÍäHg€G5íHlb]p©ÌQÝ  �š †çPÞä›í „µL‚2úâcñÏ TÇß·/ÃîŠâíë›eã=ÉL÷£\ÙÏÓc³Gäfgu?«Scuó�súwñ£Ó°ô�»!Œ<Îó‚–®�Ї"v°Ö¹ïè¥A>ˆ« _Á{Ëý‹øX,ÙÖÑËTÕ±¥«2Õ½%GmÁûeŒ™8kâ�~yvÞùáì­R `]£„<Û“µ÷õíÖ8H×Ãö»±‰jñF™fCŒÁqÂɉ©&¹–#ƒaNU¸[\#Ìž Ë‹½Q¿ ¬�´1¢ZYQ÷š2IŒ‚ sê}CV (»…ô³ê‚,$˜b] ˜ ¸`@³0îèÖìD¢Tú}|AÑÑЃŒÆýŸðJ�&Ê:7¹%õøðÔ1ñ磰üx :£6@gµþ}ýƒ#§O{“ÆIùÍÈÆ¨OõˆÄN§ð”ÎøXá$mÊX¦ Ç—+õ›‹2µˆ0i²SEsÄU%�=D}°¶¨R_Œ¶€«’iñíú÷�’ŠßEEZfCŽ8ݶ‚òrdBbÜ6[Ô€Z ¯ "çÙRâ<¡F¼CE!íQ!¦tAÛ€XþÁ×ø  èüH=…§%çI’/Ÿç¹{Q#ãlí] *ݦÚÝç~+ñ œ+g$³'*åÜÓÛ’îÿÂ>wý¯ÝÍö3¥Uÿ]¤]¨ÙÐw£•O0X0ÑzXïùó²DÞ}`ƒß³– ö€Îh%'“ Óê‘Á¤Š ­7 Ôbì [o&5צª6˜Ñ‡+ôÁÍ­NNór1Û;hUç­<0«ä>5’Y^ÑË#7w´øý å�i40)—vtòC×¢Y¯Î|̓hYâøðŸ­á¼¹Š÷GvWÇ&äæúÔÚ]½‚cœÅR«›0lsPS êm$Z…|–JŸ#\mi|tÔ6}‘g—aRžy†÷kŽÐåM\ûaÈ`c¤Mk ŒvÉßK­7¼)�ŰI'òÿ×®ªHâAãÁ™°XRª^Ó8¬Ì…1ÀÜè6ÄDe—5¥\‘�È0DxŠÚ»³„½ï °�n>M§Þî®z hnasO'�J±5@MYmþjF 9½²Vͱžï©ãI±º*–øY¬ 4Tu#{f§´%y}½^ÿf¾Wzµ{MçW°˜–G`�4 §@ùᵜJ1+íxÒl¼g(hP9ØÍ>ýû±¿1žGSǨAéø¿FÆ'žY“ìߪ!6ô&÷|ÿH˜s?ÿÙ3߉¦tSçoñ½fq0ˆ¸~ñ}¥Ã–¹€`UN­Ã¡Órê͆©X¾ÊhöÓh¸Šio[7µÖÖ\ä'ý9×ycf®ñœ¸M\¼Þ³ÖÌl˜éG:�~NÐð�"×ÙX¿>¡ÌÉ4 z^žc¦g>„±§­Jžã;£Ë­¨ÜBqL묷ýù´èpåaçÿs–òµr-gÊB¢�$ˆHŸÐ�GÑã¥:ÿ•Ö_ý?ÜðÄþð)F/�lÿÆŸ–Çög>E½:ѵñ{i‰Ýw2Çùã¯-^¯BI‘�“·×²ל>ºW×Ýšñ­Þ!'JŸD(ˆ’<=¿}û(½ü{Œ�H}o@$IØxxñùç^ßrçÞ†? ± ß<à­ƒgLtyv>¯@“øzMþ¹Õ¾Éïã篹¦þpÿ Y>9–P‰ À÷ üÿ{~üjgöååÅɬÉãV <@HáÆo¾Dz;ê^A“èfBÕ�øF?Û�ërñ42´ÍRGˆ®Ê�Y½Å]¦y†™2›©C qŠŸ�ÄX$M ЙݧõÄëXjë÷±û3%i1îõ–kÃóÒ™<¢û 4nÔÏ@¸9œ6ü±�.¾‰Õ0žiBlÏð.Õ·âö˸¢š2b­Ÿˆóç·�kéó˜¡Å6év›“ì�)åÃ,—žªUgE¼Ì�U�äM­iÚrÑ,�Nx½¿˜*Q|Ñ(?g*-óT÷ë˜Ãaæ´¬’ýöÎÜŠS!Ö6‹#–]20€÷¡�+kv3­DNã$ zç+ñÖŒ’?/6>ö)ÆQߎ'›O¤g&ÿ[¸Æ¨,&-}X+é{ ¬tN�ÄÛH]ìÀ`¶‹ßßìoÙyûî«i˜GxGE™ 3ªfcYWÿÇðsÍpá5#²;™ç;’‰c„G±8ºÔ5„*ä3)QM4y)@P¹.ëÒI„ÙȉÜj±=°MÒðl£'Š!59ï„VÁ ÂÀúíË# §9–{ó–(×xÎKHò0O&O2ÝO;�åú�š„¢šÚOcüžî fFí¦•¸ßÓæîfdžµ~y&Lt5¿TyÑu#ÿx ¹¾°f)AèL¬C�Îb#Wß6eð µAXKƒ'  qºqÄB ååãp¬›Ê_ôò¶ÛúÜ#SyC& ª ”öžŸÛhFK´wÑr頢ъ0H�ÊØäºÍxù7¤«wfÊ OodåÜá6moø<Å2�(ý®¤Ç È©¦} è™|°H=(8ayJ�—ØÈ�}“?½òîf·éÕÔúèM¶:X(è�yÚW]#ò±í¬cª1.¹iu§…Ð¥Á×ÒüS‚ï¡Ì ìø¾ ò°P2¯8ÞÂ*/ãX"¯Gºk 熜it‚Q-·²Kç5‹.Éìì]qµ£?F+^>Ô;�¹v©bI÷ j Ärø=¡ÿÈ2,Úè2 =”41I‘º·@ ‹býæ«CݘӃ<ðÁ~ý°ÍûƒÂßrŽ…À•ÀÙ—ÃÜdã0ó…{›gfI¡ C¥ZÑ-UrubزSÄ­§í+ÿËdßk^5,ÝïÔfÏ4( .NH¤ãÛ•nº©}ÍŽr-“"Õn É�9Þå/K¹­ðûœË)Óî†â–µ%“ÉšCd]w¾e¸b“¢©ã"¾L‹×šÁ…4æ¼ÕsQR^FëŽ,Úl`{ß &(@ýL•gˆ¶Ò”9›Ktèã¸ýÑó"啜Äq¥I„!%d%™U¶í/’ÞiÞ,A»àé�í$oñ(+¹õ™6tùS-�Q!ÆüÁÎÏé.nì\ýÑ„èèçºïpÖ29àd‰öú”À EêÇjD ,ÎU´GEõѰ¬²Œ—Òy93_êNØpÜl̪º\pݧÂÝîxfÛÍœQxZÃ4¥+oã,qÔ=Þ¹IŸÃûó9J”_rBÏ»´Ë/Ó’2LMIÈa‚Mh Ðâ"&o5V•çòŽ �$ˆr¨iþ‚Õ R@˜à«ÓÖÀï™þ{ >ÕS L£¯­‚*VHC8CÑ À…ؘÀŒ¬pFï¡â+wÑÙ±¿,.&¸£¯Ó�NfZŽj¸Fè‘�§ÿ/Cô^€ÒòßÏ>Eì öŒ–â•mÇïæ‚6¨$ä{eSkÕÕ^›Á@ '¢«ÌÎ&ÜMëÐ~+SŸT¶R|´àX½´Oû›þ•,Þç…IõýúÀ�ŒÂ¬xZpù5PPÙ»h±8<ÚýØ�97t�Ñf:µ ü¤ë®ûËÉ4³9ÖLφ¡¦uøŸpêùYóŽeë{'Ó82ó‰aŽ 4[7ìiùÓ]í vZ­Ìj¸uæ›¶+?öÕÖWÁ¸2²·ÍfeOg\ÉMmžRÃ^ìŒöWämo'XËùiî ˜‘Ž;•ri)ƒmšíô‚~Y†ÁÒ¿„l{Û�Ïœ”ÍÞÓªI•5N¨O%‡ƒRÃX;³²‚g!¬éJBo¹Ñ¬,u�ãY0ç×33žhh%¾»=~:#¦eVù”Þ)¦7ÑáÁW•@´‡Õ!⫎Ӛ­®Ï>jo鯴>듦©ÞSš/-U~ì;£Rk³MÓJš—¡aߺ³}œß°©äæ·Îxv9×Þ¤˜ë©éèÏݰ~Ep‘LÐp—*ÄwÉBǯ§hÎ�“˜½_ŒUÁÏ]º©¬ûfVO­–_޲kP™–ÉhÛýv_×+×w¾sþ�ü/–Ø@Úõ•{¬�`P5€Ø*T9£ÙŸ]ÿ÷ÿš‰ÀÛéŒÓ`f¤×s=|§dóZà5Îô‹prgÈv¸ZrÞï_ÓX«]J<úD¿ïè6xC$×î¨ÑÔ—¿Ó·QL2.î:2꣑îýè0 ž¦Œÿßȸ̉ÿw ¹3ÐÑ ÍU.~`ƒLØ:*y7/q÷æÍg,ñÛtW×ïFÁêÊÀ±ë×øïMŽ…Ü!õA@¸ »½Ñ4ö@1ÔÞ kzÔ‘ìñRÒ ÎÇXÆq‹Ä~yág>ª­P0KèÌ«2€šQ°ævv㤜ý{æ˜Mf;ëÕ|˜ÕKÂÁ¾±&;Í%?™î¯|Wá‚vtj9T …´œØ±·°k]l³Æ ±¾ŒÈFé£)Ü%\FD�â°»áØwªÅOì³å³œÎŒ±æG6ü»š'¯C3Ο§Ö¸H[ëɇ<íz†¨°n±h±úUb°ÍBXf0.GI¡\*fKaX˜¦Ê�©¨fI �¢ÆÝ·Tø ?áqâP~âN3ã·ŽÑ› à 8ðBiòb›´Bn¯9Þ(P¤6”ç�Ø®”ãÎë5׆š†LFL{.² ôƒÚ2ÑeÝà;�z™µç<ÐáM‹à@ágj �~F•@:¡<¶š¡±P„H½LâsäˆÊ„JÔ5’ Nä¤m{rÅ´çO&ÛyçoáïêñݤYsu²6€r"Õ`¬<(MLµƒrÞ»:&"‘•¤Õ§-ƒ�¤ß…o~ÃFë› ”>#ñO‰ztÖ™F™B_¦õ“2ö‘ð'ÔqÂÿx‰‹.Ñȧe‘G�]�EÕ 4—Àõ“ŸuU‡©¶‚ÏëèטŽÞ ©•q2¾mBà §y`¨Ñ¬ ŽýE§ïzuê ‹ÒDNOà…°¾žÚ:¹~,õ†Áø9�A_ Ô³t;ªûú”Þw]’Å0Ú„Äœµ:àÂK¿<ý„DŘÜýΦøPá–ì&–DNÇ ±� ñ ×Çó^d¦±´@µ´”ê.•Ø9ƒˆ‹1 ‰Õ>bOiKÜ?É¿KÖ¶èpíž‘ÌÀ£µÐK0½" eóà½ÆL!¬ÿ2‰i�òdbOð°k¡f·“�×>™ü=_¯{á¢'zÕæUµVéX]�wÀc¬½©ŽÃꈽ8qÞ7/i€Òƒ�TͰàNÃDW ‹<š‚ ‡P®žuñ)¹Îr yîkªÜcÔˆg”ö!5p.ƒ!q0Ølµ{šYìéFû’=ä³ýÝ@4R‚á**—UÒ^e2nBÈhŒèESÉ­^lLq§s’%»@¨ØfŠêßMýœÂGk;׌Z@— RÈOï�Ði¤É7ùOþ^Må`ô^îø'Ñ+'³äÝÿWª(œIå+n•_)9žÄ¾Ô‰äƒý6͈þ}z‘ÖdxN£ÊCÙW÷­7FTãšïC¶ÀÂ+­º9­´´_‚pÔçrchâE÷vùï{ï6ÌiÍzWÂæŠàžË(8k&Œ-Ÿ½�² ä2³ÎèXyQŒÎ®0#©Ü¦¨÷æ–:nYR¬—L5³rõƒØ¯QŒÌŽL-=ÓE«mE A¯™Ómªz®éâ5>{$ëø³Yr¿Önukvš‚±¯NöÙ­jXÀ¿§Q~d±å§ÌM�ì¦4eavføxó ë3øçXº¦ÊÌ^3Àñ,kGйr>äÑWƒdîZ ,T¤-«=–eúwR×¼»IÅS�y“±×#÷gÜsñh ŒþÒó $u^—°i£-³p¥êVTBë¾±z·JhøÉ¡\O*ç¢å3±ü¨>ïoxs„Ðxv„qõB°X|^•�I×5ðìdƒ~¼SôQèæ¸R—Ck£ÊÏÆŸªü�ú ïv*ݘi²wïGôÝöƒ�ˆÄ™ùrP‰øÁyë¸÷ÄóY¼ÁÀ“êdR…�ïG,&CíOà‘ø·gfTeš¿4Dó�zwãõæ¹$¸\ÖG†ê/£»ã—E˜äéÒ³©â·(Öa'*úŒÄG¹¨ÉÛ³Ò+TžWL–hו€w¯að?Š5?›•o%wç¬Ú”Þ°•·½øfÏ:Nm0‘®‹ä"ºlÁ4Ã?’Ò/ª+Ü*Úøi*†ö›¬æðêõåÉ™‚C¾žSŸŽÒ_A“¯AÖ¦-à0/ Ö�Nn¨m¾/"Í’†^óí&5UúÛâ@P9X÷A-³´R5c7…cùâ«s{^ÞÑ7Ÿê¶~]ÁxœÚNcÀÖ�í­ªˆ%ÿ€r‹…ãÐÄ8°wòŽñæ.wÂF¥bdtþÉÖH{þj¤Í‰UGIêa¹æf’Ñå4ä›0}¦*à Øš]‚1­Å…Ý Í…ìàô5½Tð£R|Ã�êe6eá…e 'ȱ+ti.¦AyQ‡Œ‘ìAÛ\×j­¸-ŹŒ4díò~ -è™`oäd#§¢†æ´Eæ²—ìék¹I©ÙmÑç†à��5¦œdyÙÈ1|‰p7“šÓb€bÔó�˜#ÉGOIJ¡@³f°{M6ƒ ¨Þ qï Ä2–sæGÙJÏï|Œ©e}µÒé 3Ž¿„+¿™èn1¢z6[•[e²Ø˜ú�¢ptû�é`Ô/@Ú�^ Ü0Á½ß ¢OײÎs›zRF\D;d†ì»é¼°3 ˜ù≉b„FÈÝ+†˜Å $¬f îa4<,Øø#U¬Ùu9XœÞ²(ϨoΤˆ£…H›°„ß…x84'8¹Ù: HC•P³[q2­zâmÇŸMs(Ä¿)33‚CÚ¿7éŒ}ºPü�É“ÏÜ4If’rÇ�] ä>£­¦]N�æ—¥[§´ç¯·|”% á¶wÎ).ãäÞWŒÖ+ï°;>mDôù §ís½àºßP%8øâ&Õü†ÙLHÞ”Kd5îຖ„f.æ]m)Ù;ü'ü#(¾¬x[†Ló_NÓBuÇ�kô¶z™�«ýœø( Îøœ>°±œL.}âtÊF@*›("rt\£Å"|¡žr¸Ý**8;rÞKùÃþðz\)Íàå�Ráõ�¤œGË�¶æèífàpÿ*®�!Ãáý°W œ”À+ «Èè˾ÀDL¥�K¶c“vl$Å€ìÜ{¸³—ä®{ïGò%KÝ9ƒožyû‹ÞëEØ €Ó@ÿg[9ñ5Ô+UÉz63ãbôo§A1Ÿ8âËÀfqMÙ9:²yÏìyðjI*™{ëóñã•ûµžŠCJ/èõE`þ3ÞŸeŒ™y§cù-¶ÃDW©'ÖÎŒ.™ó×§ ó¾eÍ1^óËÉñ˜xú (3€xÀ¼K_ÝR¬x…rÿQ¶}›ÚjSö¸l¥#Á6š±($1Mt¯1û”¸Šd¦S‘[Eº¯±äò¾ãù“’L—7ñ~ó¦ó/GúNœ¢w80Ýq0m�pXYøÀxUì�îîTdW£"[ÛÆè�ötÑœo±À¿x O³…o_ÿ{~½š­3ràŸ” àq#¨`Ÿ c,È¢)VðË x°ÚöÕpM*Í. 4g6ÐQ³jQÉ9šñ¶‹úbWG¾¿�×<‰tæ‘pñ1âGP À•£kó™�e4¼œNµ…ô±ÉËéŠ=Àx3‹¿Åø¼UUœäcCŒû~:¯÷íñhW°aŽ„ ýX÷ñ¹Þ:_ÙÀ’.äOÎóf•/Œ¤¤¨>kLVbUý¬•;%úžz7,eaÔò¤„§¥Ÿ\‰ %ÇC.Å§È mwÊÓ&3§‘{¶–í!÷#eú¾ž‘ú¦‹¿íD�(8ÄÁš¿~ÏË#í�r¶~ý¯\‰<Ô�ORáôÇ�‹784T?KÏLÞ<�Ýh¶69AÈúµ O˜7 : g­àj�­çø6;¯ê%Þ,=DðXüÐÑÛ�wk6IÆG){ú^SL¯*Lç­5­óãWêÏ#Ä{ý=Æ‹üGÙ¡”Ìà R'›F#º—Á‰´h�7ñ.pÀýamUmGÚè¯ÛŽ€X x±ñ=™åI%*(â:$ÎÄ Sa0Û5ÒdT—K>Q�àAQJãy-¬j(vÄúL㻫Íêcg*é¤pîNO'ÇB2ìGïàÄÓÀ8%AÏ—5ü�í�Ø®2ªÆ`w‡\àrŸX=ïa]>\_±æo¾½ÚWj4éɃè‘qAsÁè÷¬_¾ÑHlƒÔ¶rËë<{ö~¿ ìlÙÚ•ðÇy5ѯ{#vÛ©×j56`R"­ß[‡1ç¼ìSµ°”( ²euC|ÅH(gùaù*“kïà—ÇJ¿RÆê<»“¶JM�RUÙ5VR™¼ÀÔ BIÖ˜  0�̤WžãÁÝu'»ôc ›9Öfv†cþÉ$ÆwÖ‹@ütÿsÆo&4> %7Õqýæ9üáô½ú€�ûAøxË®0ã�F²†¬Æ?…;›ãN*½m‹€/ÎáônZ)~£�1¼ÿJT­O$X<ñ¹Ù‘°EEÜê…Ú ¹æ¡ªÃS%�k_òWýÞãüR�<ÕÙ±ÛôµóþÞ`ØU~g�ôêÃCdèuñŸd7×s¶ý\ºi··•Ÿ²ÎÆ<è:)%J;7H� ¼É2'ßÖEïçYŸ[g»ãÛ¤Û±æ+Â`‡B&¤Ó· q¶!ªÍûì_‰à±„«AEÎû5˧ÇŃ, í±�c¸�tJw/ÛV„¢Ã8é!�˜ëÉKòÊ%é3Bkc{�~¬ ýÙšý­{œ5¿¥¯ÉíWZw—†¤lœßœ›ß–Ž˜ô¤ `ôœ~ÛçcÌÕ‚üï¯þkt1³Ó4c¹š ª¢;ÔÉNz¨�ŽË€j2x6q¡bëõ|s¯Âp7½¢3&‚Íz™e¦°}² 4X§—d¨¨Ç kBF3ÅîE´JÓîÕúÕÑdùUY¦=1üV#£Ó&‰èDN¨1�þÞí |ÍÕ¬|…˜æ+y/Ðö`\cCs‘xѤ¶P�Óä6ð^Úφ^Qê¡+=!³ßÿH7qþ§ø—™`mõ~oýþšš·ý5âŒjÎÚùþß—5áÜxâuá¯éëƒdõ!À�ïἇ'(¸ ñ,?Èê�2ô{iÆþå±Û#Îãþ CçSÜŸ˜çjô'm9É»„¢‡ÎÞäþ‹žŠdÿïr‘AÚ�$©^`¸R¨sг‡ø'3®ôëþµõ¹5ø GJ’î qÁú–@�‘£=?È¡žsþ†V\cÿÒþB©�pî>š&Þ c,'|í+ƒt’ö£ÏO>n?çP¼ àÉ¥»H:ÇkhÖkÖ B¦— Ä —G,�"^ C™TÝ-,3¸¨–¦ÕÞYLC1af»Êî`,;$5ÛÇÒâq€·C 󸳕¸N;à@µõ aE¢I%m¤¸“$æQfMŠiDÓÖ”y˜($$ôùÓS‡n¿VñqíÇ8ß\é¥~OçÜ{ýURôï)ž6ëŽæÍG¶ Åt[ε ™Œ¸d�\e�Ô ÚQ764!ÙšiÚ‰ÝVlîù,«¤E$z“̲ž¥•˜Î•I9ÇÖÿî<ÿÛœ¸�ézüžû¾ûµméG†ÍÓjkÕ›ä�VázW®2êb2ÚmÄPHÔ …‚•2y¾¶²{;]šm0nr÷;~1È­è¨hË[ç þ\¦í(‘3~¨ÿÝ v‰«ä¯@Yqç›4ÊxHϯ·’¹Î“¿r˜Þˆ”uù²µ ¦â ö|&c öƒEªf©ÖtÓ£}3%Kó£Ç{¿ÍDIœ¡EYßïtæ¹¢^Ôhª­çŒ;Ñ–HË3Jr感<9ì¬+Gž#2[¯÷ŒN„¬ÙŒÌI¡À‡0ºN*˽_žÖ¡M7Ý#éÆä3¤…GÜqÊèk²‘¨�5½lïm óC7LJ;á ‡bH^‘Hgžwª=óz½ÞljÊgFcÞE[Ÿ›•pÝ‹³•y6¾s¹,Á)�‘<&BÁ¢»�«­HÙÚAl´²oãr;ËŸSÕñß½¾PÐÛQÆ�eÍúhº0Äκ`ÔÁoÇ÷Ês8=·wëï±´ÆÒwÔñ�·Æ6�¶Úâ¾ëÏwª¹†Ò>cÔH¿þ÷oÞx†”qi–ôüC|/»À.ZíÙ�Í^ë3 E–�ê§l¤Cs¶*tRÞG—KãJöÒ ÏZÜÆÔÆ9nJ¯«Ò3kTtþL@þÏhÖÈÕ3ˆµŽ¼ŒûrºïŠù‚ï§ý˜û“è"â,¹÷Õd70ny©ç¾&ã:<í¶=þ€ŒÞ)ù¾ßœV7ëklfbaQ¥ÁxÔ¨KDúJñzñ9?s§ª}TxÐËÔ߬ù¼ÀëÆgÒì…̵ÖóË_W$y<ðÙùJje§õкõp[RȺ Pñ ¬çÈ„üÑ$L¾“ªÚF››£—m¤w¼a'»IИ²å½YúQ91³L6‹ç†Tás;}®r½¶—J¾–×~ÖÉ/hÂöǮܟ9�–‹:LÊ™ -û³dÞßqÎ`Æ’n3ÍŪˆ…×ÑW;¯9žïÝåüÖ¤wnœ7™ª:úÜŽ½_üóVé]û›_u¯c×­þדÀU»ÍhŽD…¯Â}ñÛßœ&É~SIçÝO—¹!T_/R‘�(:@OÔ×yû“Þ—6ÝK6CñË»òÏÀ™µýõ²;C±™’V:5ÃRMçÕ¹ä-]¾[Zls,³y{‘©Ì; ¡š£R(YN‘žÖøÔ3¤»†UsÇ È�B\Z U“n3eèèºÇ$¡×ËÖ�$‹U I¾úOÂÃïM3ãz¹¯/Ä?{£nçÉ ?Œþs÷ØN"* á‰Ä#içÆòè„´Ì®Q²<#NwM!3z‡ð$›zPVa¸!¹]'†Ô@ã²PÝ?%WFdóºÑiß\V.˜×züÆl}WÊ6­k°Q—š�Õý÷œ×6{ËÕãFN¦Šµª¦“Fóµü}šÌZÆwžù™Ôg|*´ÏxIê‰Ó? 摯JÙžÅt‰Òíy©íGm�ÈÝO¹Xeîs3†$4cfÖ´ÇæE'¡Q5¢+"ä´:iJa”—<´áå6ÊžŠ§Np˽UœÊ)÷/ãsYa­gq¥GãÂg,•…˜Úi:ð"XйGt“IzCIM8|ñuÝAxz«É(6eþ寧zígÍɾýû-œkGL¶ãH‰áAWÝ©–+÷gØÜw9åÓu&–£ÇF×âLølÇ™äRûº ì»±èÑþ®Ÿ?)ä?¦e¹ßªÏ2˜�œÃÖâ�øýÖâµùYÅjw½þ%[5ùsò÷"�+j\ž”vs Qs`­ªZ„;ë‰qêšËÒå¼Lâ•/ÖïŽ>}õZ|.ÊÝ‘ƒÇZÞ»@­YL ¨~ûI^ê…±EV舉uŸ`êëʾk)(Ò òM£X9cÚr¹¾÷T¦¡!QˆÒ×Q>íú~®¹»•4Nê�rq–ãþ?"Åø}GUõV(øñÛûáÅñ«^x4wö»Ãçs—×Fù­ÑÎN3óÒ±f•¼Ÿ!—Ìô®ÌÎñ•í?Cu̲ŠÚ¬æî"¨g5øçAí}/l�|–‹�ºn‰#ÂáNƒwgtd‘ÂôÛ¨!3Å•îßPy'X¤Ï»YÕ·Ž}¼¯nɇ5/²šîÐ2;¶¬�èiXtŒ¶j¿¼È�+WªmžŠ\•G²<&áG�üãWœãh÷kòÕwu^gëw2è®îUGK7ï Ð@ê‰ Hýæ†xÔhlÒèŸçÂÜwžw�k—?ÖŽ[är¸Ðšu2ÖGd‚K2ÞyÙ?}ﶩĄ̽û¨ Ô^s<îƒTcÙ#ô‘2^šFwMêê´êÕãçÝ©_·ò熼Ìxf°8yílƒËêÛÂñ»®Ü.O‘¿’²Ü:dFsÈ'ò¼,,5:mD­ÏÿLÑ!~†}Úáè_È|+ãà‹Øo4é‰Ì=˜h�ßü@CÑæÿ¦ÿÍS*S† ¶‡ðOéS“ë„ôºÀÉÞ‰¬&±›5¡ßß}Å`ãŒc782ŽN¡¢9àxá?лðcÏ îH¦?ÐÚOðdZ¾¤>±�,d¢Ï�‚ÌióVó))¬Ñ`Ìð@ÈEZí0#ÿáó4Ïï±Ô­ÛÜ�ŠøÒhª»#Õ2¶,ýó̦2Y2ÉÕ3l©-Î*$re›/ ×ûƒ?ñj—kâØy'/Ñ\'·}Ú¨©çú`�Ú"Xø«Ôø¸>¾q¦ñóWÉ«Aj5åF`k‡�† z™‡d×ÒŒ�#À�Ü/"­;go»¿³ ¥PÞè{ÏØ‘<9Í'RäRÓ*0\S¬ðîÉô¹5Ú`­`ó×Ï�däw“¹i`âÏ}“ÞjhÅ ä¤1Rò”ºm@ô;c# ¼êÃKÊä�ÍH®ÞWM8-± ÀŒhÐHîìFÄÄ&”ÒùìkV÷æ25Ø�™±�¶ð¾PÍ­Ї~MªsÓZЬOû ¦e–Óv³r‹ª‘‰¦Áîž›¨"«”3 æA¤ "¿ç8û�×+0Ê 5�~ÞØˆ¬ãsÞgâ %3²_±ÃT;"þ/Ôo;' µ2J�3Ô®ù`Ž”ûgßÍ™60šÇÞ� wSNäkÁx ÈT_{ã|DÒWúÌ4ÊÃàã¶Ì¿.ÎèQ_Þêw-½GЧlÌè%'骀ñLÅh_Ítj;õá§Ë¸¶|ƒ¾X¥7£ƒ¿|rïj?¶ÿŽUóâRë˜Liê«] ñ"$RYÇÄ_˜ÔV•Â.–×&hFÊnî¸eøê'óN�­ìsÅá£Öž%]ŒÎºýpôâóô€W77 ¼I„¬+D.åÀf^—© °d¶çn+`ôƒÜZÿï¿3›Ÿ­MôRN*¼Ÿ� #²�M 2‘ ljŽÑE×^F ¹ÊâLì¤ÕìUÃc×9nG5ÅO!w)F»Àu· M«§%×dlÃ�j¹‰›é&’fNýñÛ5¿§œ x,‰�Eጶ\êduå9Ñ‘ÕO+›dmk¨<Í‹éúh¥¡ÀéV‘²¼Ô… 3íR|¹\Ø®&>ýpÞC¾åËÿU2_uÊ2Å"²ð-æì±íŽI®2oß¿;ý_rwV†öóìÜd²;bŒDŠ&$æâÝà´ˆpö.‚Ö*Mï�”)d}pxUüÉ×WfŠ%Æ# ²é3÷Ѱ¥|ãOX#ÙNj<€sŒ·ˆ18_w¯ �‹’�†؈ÍÉs�SÕ.µ�ùe:»TAÿ�[ëáC? ¤��øø–sn? g½bß1BE¼zu·–KLÞ¬ §MÃ1é1Î?Œ�IéUG­³FÛvö®ÜË*Nœ�^&QΨ¬!(ªQ°Ö¬o�‚ Þ]a­ÓMާÀ§o ‡�‡Ù–xÙö�HõÌWtv%(.u;)¶»è‚>- BÑWp™˜„¤3(àiÛi,áy«�ZÙÔÆ£Œ‡äbâŠ<—l˜§PÌØ­'º«ÖøÚUÀð¿Ä¿¿~>%5àÁ�ñ)½÷Ê]qMR;¦¡Z_È®z ·û? #×Ð+°aŽÍ�xÞíË®È"ÄÚ( B‹¢…WÙãs²_ [q�©?qùÔEµÖM¾Ê‡d^`÷ç%_éîLëô|8OÍFX—¤õõ"T\GózGqaÃo©5 ’*™´˜úÁë¼[ežXPV¼ŽIÊx!8?‡ c#È‹YDïï"pˆc�z”Çæòèó óŒ0é ûo2es—ÀÕe‹Vg@x:/‡n ‰ ¬3ìÆÞH÷í ÎÍ{lݦۨ9]8‡ÁbKÜ¡’2ü—aœUv?p3ðfð9S\Ù"kb9—ãì¬øgî§]D­(á|´Á~�”NþÔ0 X®. e|•ÉŠ ^A[úŸÓz%v9©·(ѼÎþR‚]g²÷2PE?Vcè[/áü_i>�¶øƒý¨2us9PÐ?a@Òƒ §ô=,i‡6-¾¿—Ù;ó ¼ô|½uC±6Ã]•�ßDà#ñçïqë¾Ø7ÿ.3� � ‹6^8ƒl°šŸ%�4ÆG²l`ç»&ZN¼sêáK“ã�]ŽØ«6rn˜DžæLÅÆý¿Á_¨Ïe‘`›”w:êÇoÆ %Ô5«.Ÿp÷¢† ìï§©"Þ®[²µ+u �¬;²YzTqòO°ÿ ö‹þ£ÅÃ륢A’ˆ µE&b$I1~êî'DŽ;£=oçYÜFvb�›&ñÉr{êóØ�CøÆ¸«„±ú¯ªøw:ZT€pó;»ý«Câ†1l'Å]ÿŒÒ»˜þ…=o}ï5˜òÏ‘åœ ?ŸIÍ:ÚM–\NÙ¡8ú§ä±K9a9Þ°—.Œöj;Ïç?Ä!ƒäzT ÂaIõ9S¤ä•“¨‡£w’í'{7MýéÆP}&ý}]¾pÇT8«©4Es/Óן9ïƒå=;t«;$¹ÃpÇJ2¢§Sb¡9‡ž_‚áDÓ“lP?†¢L�ÅdÞá‚?¾E=íÙ¸&Fd7힥HîÿÙ·ß9±}í(�˜È âjŽ«÷åÂÖ­÷Dm5™z×þV`è�A¼¢SNÚøç�p�šûk0úAE:Í»Ëá;·&D£¼µRIТàðùºœß%GIƒÊ�Pð»î':å=`0Lò‰_‡�áÂ~VPzýŠý¸ûé:ÌæÏvë>öÿIÁÖ<Ï31Ð><Ê/Lôã…¸éKÕ¼''Á†“³®­À¤ê<„MÜøŠ©‡P„Ì®ñ¶Ñ̰ 2�!J1Ò* ‡šÃ©ñäHJ�½¸ÍøÐú"¯äñŸâUï„ 7Ò–ícfH‰©£å£©ÞˆÇzŸú9æ�†û9Ù‘¦UÃÚ)–Ÿ.dù%YVN‡YJ3�x”*à•À“p8ST)À–ú€€†î  r”AÏš 5£*/³¶ ½ï\nn‡)ª�Þhç”›uÇÊÁÇ¡£¿7̦¢ç|Pã±Ï çÒÆ ƒh秸ì_�ÂB®ùz© ;�ô«ËÒH%ôø 0ÏfyÒîï>UÅ.ÍÃ�f|ZÄŸå�$ˆ‹â²–ÛBÃå;jòèƒÍSÑ++mÝ’ølàé`Å™®£$8´‰òV<šR“s’¥B�.w´ÌøùFdÿÚSgÑ:U?!Ïòža·s Lž«ùÕ­ÁzŒ­7îz¶RU-[0KJP4m>Ó(9OŸá \6©DeÁp¥·äe7Îß o~Ã2*ð�¶Üæaã*åSÑñÏf�ÀZ|Ÿ ªïWWfñ²OÄ)OÌølfh‘V9¥m²bÖ· Èt"af”;²åÕKdã…P�/·Q+škî’ü©žA‘u³Þš[œµ"ºdÇŠÓÿÐá-•IîtËÉÌÏ’U™Êx\³S0z´u#ñÁèãi;.!•ò´Uf\SMn¼(²ÞV‘ýO¸v‡nÚÜd16�ï%ÖãÍ÷ÚÓÉ…*L½uÔû#1¶S;˜"T,è×0MÖôžv[UÍ îŽ5¾Š!ׇ*ʾ•�ªiF¡ª•xĕ䤞�¶ÄOu’†…PÒ¬ðNm,|ÒÛ Meh·ÇÌù~:óÝn´E”T¥²Ý2Øëh–##]¸}y&BN¹3áfH »½g(C•™&_=:k º1.ÏbŒ!b[­Ÿ&ážS"­å.XçÒ]-FµL†f“FéáZÑì+ÛÞä%–ØÒMqGe}ÖîMÐÜõ‘—Äiµ—ªçž&g©j’t«Ã2s¸ŽO†}lÔ*­© 7ÔM±ÄÄÛitS@õpœƒrƒöN[/ï=�f¦†ø×=±&Ãd´Ë§êÞÌo)gڜٵÇv£:´ñŒkÇKÏüæ¹ç “ܹO'™?ÂzK•v'ßE¿*ÚeF¢ü:Õ ’ÂEC¥òyÚŸ;1çSd¾ß„6žAoÙ­¨ÊÎt—{éÎy[»ÞAÅV]YÙ–h˜NüUSçqÜä(̶•8p·á.¥æaÎ@O9šä;éÙõµ_L7i¹®82©EôØk‡•D)á©É=’zòÊžó$^õÑvSá=/Dœ�Žo¬ìåÍmn×yÝs”{×7TO ¨ ‚p¡Õ ˆdô÷£Þé.ܲr10d£.–]íc®&¼2M5ÇPfEO‡ÈZ+²»–ÕÂOH¥A6æŠAÆV–ýµ¹3DÏZ‘¸ðC;I–¤ƒl�iñà3Ì‚ÖWWõûL\ηµwú9óúÚo²Û�·½4Eï§oÃâ×&¡¡Mü\Øg-2VZ *�ãkÀ¾yÇ)ùzÁˆ2ù=R;lŸ])Zj)|Î|ÝxÖößÄlŒ¥”Ÿ%¹¿k¹¡¶úš^–¾4VÒ'ÙÝí:àòmìç["êü‹$ë[ïÐê·tï¡ÕïçÏPõ¼ÎH"òvƬ‚;µæc,Ük îäŠyê/y|Z c�$ JNÜ”ŒŽJBBh:±Á§(ø·KáÝD;x÷B\{³­ÏÔ½Òf3ë¹ kž’½õÒû±¬¬áRƒOš÷’”Y-1­¨Ï®PºÛ¥S¹öÐ~4Vb: TôÌYƒ –ñ{ÖÌýžQM˜R¿R¥uís¼º6éçM§î–”£vhOãÆzZæO&€·/ySYq§ÂdŒ]Ì—¦í@\Ü¢Þiˆ°0\Z‹GO#ªÕĘ˜íI [j]ùÔ4Гڟ3’K(²À§�)� úvÚÖˆM¢†õ§ŽÏ^¾g#z& —jìO�+�Žˆ‘ŸÛ¾Ï+ŽW×E~|˜ÖX)éU’²±Çl¶Ùb{ ¡6xM]Yå?ç£ùôø¦ùå 2€ûãH?å0¼½ª¤–ˤá1×6eþ’ †‚#þÝ”g“4÷#-™€¥ž››Çý˜KÓ7šöqr‡cŽÐ"™„ñò¦!þ„7H&X="Œ§7™yÎRÃULa6�cÿ–=êßÌ 2ÃÕ‰‚‰iwéTK в‰ Ù‰²O;î:ùï­Ü)ÃG®~ífÙ­Uô�E°Â4ú‹š—ðú­ì?ÀÉSn5_]Þ5é݉ÜUZßÉ÷ “_¾V¯ŒR‚ŠªñOœœ±'w.<7õ';Y¯ñ×ë|grÓ;bÖ(œÁ ¬�<ÊÖ‡Î6þÐø¬@ÐOüÆ…ÇGÆe< 6”•£„¼ãÃÅVüÕ†„Ùcn<­ >oCÉÛè«Y1p릓b¥è£„Ÿþµ‚ÇS©#¶C!“ „JHS]‰«Êw–)‘Ï$€ºÏ1¹˜àZ‚ØÊ<µÏ8R|Ü…:`ZŠ“™B! Amb�ùG©DêuÇ"}~Û©M¤ÖQŒþÊ6‹�¶ò­ÓÇÀxŒh9…*8¤­Ë±•&¥�\ð‡Ï!׫¶ÁNÕ‘vùx˜@@„�£-¶„3:/˜´Àç-<ô‚¸ÞFàz�5ÌItìVÏé�ײ8�½ 7*zÁô˜ixTw{öL‡P¼0%Øî¯`|Y |ÓgÐõ´àËÈó±™-¸qABXae¥r*±°îA›\ŠÜÆêþÑØëFþɧՓ$uÙEbœƒÚu–ÝÙv¨ ñBÅD–2z!¶J“º†ˆ�ãˆ÷F[÷i­¯ôÆÝ·‚Y8[à4– +‘¡B‚Ešì‹ÞǾ#ƒÉð�ˆ°X×]×øÑ‡�<õ´\ÃÀȺÄHØÇÁ/÷­@\ �Zg†¸èä þ58±iíOèÙkàáÃýî¿oÙÃɈü�;Î^ó4XÆíÙ£Ü36IôA–=U΂ÆÏ??¶Ã–2J|­Õ0Ÿ Ý|çgýÕ¶Ês­±¼éº{SÍ¡æ¾i=’UA¯IŽ×{Õ辢ݽpï6B ªoè´æ:ƺô‘c6~t‰.‘~öq§ރί[×?{A8òŒ`Ñdx ß£ÍD‘ƒg Àn�› ¶ãc¹†MLÒÂbÑËj±ÐÔMðÊÂ$ï!ý½.×iúÌQ g:BrŽþ�™³÷‹Ã®Áy"�?»^-x–ÏÜzäƒ9ê=ÐÊ®�~þ³LÖ¡ý—.NbuÅåàÆ¬9,+ÊFʹ�JÑr‚Ù¢<ó”×»=ñéL_6F¢‡.ˆŒigœd`Ì„—.л<ŠSQE0hæ-³X¸q ·¶¨¶ƒ³Â|σæ½ÖÞó;<ÛïÜš]àÉ¿z�Q‘L0‘ëNR}k»åg�l”€œ “C 2ú±È<³I"÷,©d:ÕðiŒNº÷…;—Eô9�˜³­;Ð’ˆdzŸÒñ 5¯uR…­ !ѺîWªìöוõ)ng;¯g;4s¨( Æv‚°OcUÜ4SÀ"•ÿÈV`—ö¤4;ÝËÓ¶”:Ù4a­ìŒuaxaç(@ð´n[™ðG¬$ð¬pA¢3øN&«÷£½¨Œa¾ȳ�€õ††<=Ï]7†Wš¢–eMØè¡ìû¢òEý¸ö–ãbº@йŸ’2­$L‡ÀÍDG¡2ƒ¢‚¹<ßXk™oŒÉ~Ü#gà6¦wª÷‚”¾Dw–ÕäyëX6¯<{‡(HÖZ¢7À|{¬÷Ë-±&ƒ*ϦÄ<­Š)½[qBr0»VîFTšµ#ί©6M1^å“r"j< Ca1C›\ÅœûLX1f˜›p0It ÍF›J€¡GWxæñ‘Ð鼬v˜R¥N-ÆÁ gåÇãæï)#R³ÆÇ�ÞsYìÿÖ®¿ÈÞ9´ùd4ƒN'lB帶jT9”(ƒç�Éó„«pŧíÊXè©?QHÕ¤(Ö{óˆFü\BVM†Ún§*aº:­r§KÏ °ƒTgBñ!…Á ÓjâÅ ÛÇh»¥j‹Œb­Â·WŽL¯™™b23=Üæt�ž>VÙ¿WKN¬Ï4õÅjBe§5Êf½ÈFÿ‹6/$^ŠqeÑÕÇÐ7܈§ÆïaÝeÌ ­/¼R]d¹Hyç{†4ò% £å0øö@G D4R„osîXˆ2¡¡JôYKœÔùšîV5̉›¾Y2‚´Ž‘Òo‰Ö~jý´�‹tV?x§é}]åËî•4vÝF +ç¾ìꊹ-iTÏ?cp^ìߘýc€&Ó¢ùC"€ª~„¤üÛ/@Up{ÄÖX�mʀ̰Þ1–,±� |úJÙú\ûØ~à¢eÓÄ—;»”.}j·Œš¢Sóýð6wÇóŠ~ˆd¬©ƒ–N®t1Òçs¶�8•‹Ä�kB9îkÙBضoXkkß]¨O†^PèH1Åøöëâ܆¯O¢K+u�pYP ½*Š^›LÙ8â1"ƒP?6xèÀõKiùŒ G¦…3‰f ò+Ÿ¼ð³¯øf´åÌ›1ÿtÖÕîN¾"çp ½-ÿ²]�#/5$Pº<Á³—Òë™ÿ…=k6AWäövûnK$ ø¹PÏÕŸÖ·w å>ðññeDxìÐáUkˆ7ç§Ú‚8/Üß­£×œñ³²ŒE‘¦—Ä+#Ì'ïß³îs}$4¥üCÖßTA{:éûI,é>í$‰LÎ|L±õзÒ@öHš)h׈¡tàËÕO¡?�>ôy?“X]Ò¨a0þGäa¥Þ]—Hòë-µ²ýFп'ìÞwMVÙVI¸­ék1ÑÚ&,8è ¼æv�Ø0äΊªÿ*_ø°.~ôÿÇ*ä½L&R¡ÎôT{÷‰s¯ÙþÖÆ­Ñ+j”Fb?Œ) §*#¶YÃ8JÃì"‰JG¯žA„2ægÜñƒ„¡ß4qÆŒ*ôù…bbþn¹Ðmü£rÐãÑ×óðï£~ºtµ{ÎÙBì_ãǧ[ú,yM£¹t‡’vh–ú¥^ê‘Wí(ü¾bFN~È©˜ŸŠÂë °é±Ñ¤é$j;ûï¦DÅb`WO€Vm*›Ñu7ýæBÌÚò³µ–ãñ}Ü�ž§è°·7¬‘� (5c1÷̆,7Á„,ÐjÊp~ü~cú{Î Æ*ö$—Ï_7¢Žâ0;ê)ñ³Ò~Ÿt}Ê:ZÎâ}ëã²áÁð±ã²x±Xð' ±”nZz`8ä)4ïŒe,pÛ¸î±YÖ|†h<^n— Ývêúµ4$Cƒ­dÀ^­îw€_­FĵÞpÒëuÞZëÉËÈ�¢Sï\œ¯“(gŒÉã‡á=¦©¤¼¥“­R¾¥%CkLˆuk¬Ì“é!ÚóZÓr9-ŽÝ!—i͈�™Í/Ízï*�� ûF‡’-•y=YïXFÕ㳘˖êû f—ÒÉ¿NéY&ôB¥,,§~T†�M&¥ Ú¥É3V ÚÈ Ö­6Ç#$T¥-Ðæ.„ïKñ·BŽúcv4 (㞃aΕÔ@JdÕv(PtÜV^väí)P@Ý[Ë–Æ·,gË6ZaÄݯ!ºN6¤oì-�Ä7~ùc”;$ŠÖsÚZ’^Ãö Æ1Qz¯驾QrsihéçiGwŠN”Ržh¥!$9ƒ@» MÆù`œÜÍÓimÊÓ*h~ãZ51Hvõ14óÛþ/’bc=˜> ÖXzs8ªDÛ2¶„Q"È´P�øÅö›9¨Ê)hÑ2ª»üo%åi—±™wêO\¥ĈOϯ™Uz,H–vÐD»Ùñ\X¡–ŠÜËÒL¶„¼FÐ{iþçtäó—ì ÝøÃ ¬ß´¸¡V?S¼Já‚ÆÅŸÐTDMþsð¿÷ëEþ±ïwœ¹2äö+"}ÆÈïô¯»ó:òä0âÞ¬¤Gó3g<Ìh*cäNH–°å(£ùLwLTL€ÿìmaj̼ za;›5ã 鄇¾!³ß¹æb*ø2 '«UÑœ3(Ýûì) .ýsaPö®zn¾ç%ü$lª€›ìñ¤yÑ9´b˜Á V¹÷ç��>IN»H(|ã›Î+¹�ý-W™pšFX•#ÆÃúV/×èêÓ�!^r&&0Xž_¼ ¼äø9ÄÎgÍŽQ¸ÉTøRï#¼s§—M¦ôŽ¬î…´ËηæÀL!üöÀWm C;ÕCêù àŠvdÝ …¼Ùj€m:’²Äö=´W¤+O�âØHO ?ó£Ò&êwBº 4Çc¶4š: eG©ŒÌ�§@cïøebó¡3Ú|�E¤ý_nO™ö�£Ýßf]g°[¸§—tbÉè-;'£>”_u#|Çý° h¸2U‰íÿ¡÷£V%ó{{½>• w²r¯‘óã³ØØ¾ã®î|`sεî)Bg0Ï•êúuç%ót\û³CÆo0%½k_H"/8a²„z­™ ~¸aFnžÈ¸�¦ÓJæd³h‘™'ætÜõ‘Õ{ äøú<±œÛ££¯Üï¸Õh]ë¨60r¶$UˆøV‘¸;Õcº>‘Ö"°±AáqK¢Õû±GR0Mk€037îZ:—;1ÐTµižm@»vj?NfU¦N³ÜÍIÂAQ¾”½ç†´­:e$!g�^³dhpVÃiD"ßÁt2+-`¼_ûL�Œar£¾¡u¡/òbµJ!�ŸðÅŒWë°ï'átŽZX¡1lüµŸé­n)k˜#<ÈL•˜ÔëúÖh»rßá1ûÉ oz$C½Ö!hB�íHç·–’¤Ø�HËwböyr �zØßM©Õvw‚²j+•;%,iÊ­ ‡s “?º¤˜šßÆñü�±•«Žtn®^Úáà_•³QŸi«Á;£Ó� ©æÎI£¨~ˆë­P8Ãf$Rv *�º<¹9åߘa 5wàmáè'î©·¨K¡–[!Ú:ˆ–~ îqMà‚*8]*+œ²0IÄMN¬ÞI¶-•'nñî­mZäaûn&õ�jç n_͈ÈA– {Ø\xÍðŠð#ÄËÏfÌL§wäo؇¹“r%¼f|qü�Z§¡ëqác§~«†Áö›=Q Ì…?}#FÖ[Ÿ7ñ„zE—²�Ws„¦NøT0{˜pÜdõ”`ßt†Ó.#,a¬Õ^6¼ý™È Í“¢,hòyž˜ïMéc¢ ™EŠvÑ3d¾‚yÌTô�K¯ UÕIòƘéØyÒ?Z¹®p ŒŽo£»Ü� øFfÕ4%DZŠ$ö¬Â¸T‡�ßëý“-Kº†X9Źkïß¡ë»/Î/°cY4ïæUÈœe†E}šõ¯¼ï5³ÊáµÌ´•÷%èõ‘®sœô¶8Þ?šV hD!j ‚Ý| ó†‘~ަÕ~¯q‘Áé.¼™‰¡!½=»y�ÝÇ) oIPqKè–‘$g¨†°O'/‚´)ßwUqë<ª4™© iqƼÀ?¼qÉðc¸›â.‡×,†ÍÓ>_’"ÌkÛ 1œ ’#«JƒK*Nù£RŒÂ5'¡«6E®�6¡åÓÙž½«LBÅ(.Ù–Ns( Ð6mŽXŒ/¡ �•WÔÒ�]Ÿ¶ÁñB ‚Ö� õíO:&XÀhÖ-ey{Òb´ì™ ÐFa±l ä*Å8¡@¶mᘂq¯G‚„ž�{í9î<ÖÁ@š¥Ÿ%YAÞ…°ó3;ÃXÐ 5 Cuv[±÷Ò�Ñ@QqÓå5CU?k%La²Ðm·"î^W)AF‡>¹$z%Èo6kéøMm9Ê·‚6O$\�šQàL·J÷îöÖN™xÄ«FÙ`ì±Ü›Eƒ2 «“;]ŽÏ„0\@Î(ñ™Áö=ØÖŒ�Û…‰Çƒ’Кƒ:DöÌh(áê†"ÆŽÉNd ZnAîRY†ÜS®ML¿1åÐÚ2²™S”õŸCÇ6Ð ugÿ'}ÉvuWŽs97�ô÷´V®Eªª�íÞ¼Eç�Ãe¡êµýÞ Y Ô~ׂh U1QÍQÈ�¡c‰á|SÌM†V˘“×¾´ò6r�›î“>‰þüÃàWvÚ€ ‹ÑuÄ,Àê\ð˜nªã.™Á‚( [VîƒV-?AÜúOÞî~Á]“¨ß„`t!{�_'‘Â'ºÇÓï(ÞÛ„_2)fËzÔïKÄãºcÑûKsšªáˆÇ[¸åC�ëNËs™}ª;9EÁK± ƒJ¬•Ü~Øq�¿¬/hyžw2 q?‡r‡FR-Èã*Lj|]ð‹]€ßgdwj#Cð…ø`žå€Aø(_Ã1µi§Û¼çÜ¿­­—&SFpÕ÷“°óg5˜3ÇŠc¬è–ïVó\õé ÛãWœ²$ÎçŒdQ;µã½£ ¢ËuS‘]™i;õ1 áF\81>,ü+½k*ó¡õ§ ß5úÄÇ2…�®mæw÷„ÉžEaæ�´íÃ㌚oÛ/3ÂV䢶PsŽ ¸?X�+_šÄÏǦ;•‰H®l}HûÅ3ÂFß!Ó‚Õ¿ØDÄ„˜ŒîÒam¿€Ÿ‹³ø•:¤Ùo! ÇEUpœÙJNQ�•&‹„ѤD!{ñ˜2aÜÿi‡Î2¢«ðËf¤ÓCÄU!çn= Ž¿{Ðס¨]éD²„’+yV¼uþU=9­óðè�’ûEÜsAy¦÷ 샵¸_K,jÕ�)ô|IËÜ"‰Ù0.1U¾–¦²0V$6,XÀm�)kå*£5mã¸P½ v&SC¯ø1b˜ÄÃõÈ|¥©ÇÔ(0™ü€(IðÄÁéε­Ø"†ÆýD¿ ½â­òSg0-œ¸­0$“^yO7�Ø"£ t`áŒHd„Eó­‹gå>Õs‚¦-gºÏSÉ �|�´Äâ“xì¶|‚Å.hKoƒ¨kºO1bF3ƒ�“Æ-�ޏ´ŽÆ‘¸¾upü‹‰ëä`…�HêCpºo2OàóaQ ÿR%’«ê‡Da “Ãðɇ$öŒmAL2‘*Í$à«·&M /èt´ PÕ‰ûÊ)Þòy#a�ÇßwǾíý×�;"+Jµx†hÑηè³�´ (ºZß›\}÷|%!åøv2fWœv¼`®r@µYmfý•4WRuo ¾ë›Ox €˜�ùàë™–"�—}ó:al”¤™Œ$Åfp¼ÛRŠPªS ¹ŽKxBRÆ’«îiP‰í Þ_!Fò•¨& ‡¶"ñ)4q›k"ú8–é¸~skЮę½ànk À1Çaf2álÛiêø“f§Q²ç¼µï†úJtëžGa²„³6Š9©©=Ë,ÏÔ.(Ʊä½dرU¬4ê *øÊÔ ÎáÁà¶5ÄBBßÙB?{®ÝB3É¿Êÿð !ÿ0•øX¾L›Ÿ™4��G‰;öþ™z•i’PÐð/ÐÞ ’Qm8óR5=É´±Î�3˜-½¿å2Ò ‘ ‘ˆ©bt"È×Ñ*½(x§n(Ž!s|¨É+Ÿ‘by33rÔ@Cì0åTäZ—DÍrÆ+ÃÂs<Ñ.³€™„‡Ã<µ‰±ÔÇ+_L³PÉ)w·J‡ ÜèÐyê^ÈökHç§½ÅxîçFm>fP»¹ ZÇ66ñ-SéÇßð¶k÷Ÿ´9…#ørh3J\Uá5½wÙì�«2P�hÆÖ¦Jƒ�<.ƒÏ‰î­ÿ Š÷¡[1Aó¨BâıѾdèÇ_ä Ï6zß›…{4¹'Æ Ö'TkwIŸŠQýÇ= Mó·°û.è+’¤ÙU÷¬ÃT ¬©94ÎXâ?´tõ\*†AƒuB Íé³ Ḭ̈D™:êi¹Q³†£]5â¦â-ðÅ`�šm⦠d2G—þ�]¼ÞŒÙ³•6)dQAà´ŒÀû ›Lò‚ëh•^…†�¸-³@Ÿ,ì¯�D<ënÓÒÓëÅÉb«SÐ:=Ÿ€ lÃûF +~*Ó£ É® Ë( Ù± |0ïçÐ`[üPΦ1ˆÅþ` ~dÇMó˜ºöþwAAøÂ°nÀë%µè*‚KY�öåo /QmMÇÓF¡ƒ²@ ÛHÉ–o~�-1kþLÈ·»îÌzhÁ‘ýV0ŒÅ¹{M¬2OòÇñÌœ]<¤Z’gRÛì«:djïé~ì,ÇIC¹Óó¼x=¦œ@MÆm/[PŽÞf“þÀÈvú"‰þ)$YII¯xyNõ Þ.Gº�Á›â(tÿèºL«mß66$æ"Û‘ƒ 7Ua€º,kDP˜ëÿEú™6Ÿ—¤@„á9^�yœž=ð‰ùbæ2bÚB™‰ð([Ùãcä´·q u‚þÕ~ÿ3 þ”$%”@Çö�¾ƒÄ höVˆ§‘ E�®,\L-�w§/3Åÿw¬ò¾]§²^ ©Ã(/Š;ИM#‹øŸq8kuù0\$0:1Qb&¤üÈK ÷ùcZO*�.ÑŒÎ΀‚”F Û`!MÒ®�ËN3Ï„èr³¢sF¡zÒ¿(6  á“ÝRBT¢LÔIFóþÎîßSãŽxv^ä^’'ÌlwƈsÔ\AÒ ¾öi؆ødL.¶WLi›nÆ-#Ëžÿm?˜Edª”ÙX“Ëê¡ù]¹FQqÄMs89ÂÓ"x)jð•m¦˜ 1y„H.ƒÙÌÞ7‚Òa3A 5é¸H¦Ð°“™´ƒ“vFFÏâçMH·À J>ÒÏ È^ à¢"`0 ÎJ:b=g0Fj¤ñ€Ž�©ˆI^µsG`:Êz÷ÔÁÿæï"ðÙ¦¦"¡�%éj›þdBæÐHÒŒ¿•FnŒ|d‰"¡£Aª<ÛPàtÒ‡ì£##¹�S±÷âîskô:­íH"P´Õ‰8ôAVcÏ!FÇV†ÔJÖE n;# w›ÿ¾¿ó{‚[ÑÀÇ£lŸ2l!y 2åò|î[>d�£áþ26Áx¦”K·`Ñ„3 ±Ià!> ÅÑ"Mõø!üÂä²$Pù‡…„…EÐCÇ(×h2ø¸‹µ:/Ý[X tP¼†‘Öž2ZàçEËn±Úlôpy™b¦þò¹r–%ßÝ�^÷ þOTÌUš±ìàMÂ[X,eˆ1æzW¼L) ê_¿™Úg›nõ6nu �fuÌ•Ëþꤦ�!0¤‡.™fr?tL+â°ÌnMËôbV’¯BD‘ àªB^’�´Â6ß¶ç›ß]ÜïÜ=Îÿ9BŽêNF»ƒxn^¨Ñø0 :Ê [íqMÞúa” ­…ò¢Ó(£ß¥z8§Îs{êF‰—g3dt{O¸s+ÿ®3FñÜ3POP(bÏ”NhEZYU¾G³Þd¥² !!{ð¬¾�d מ. ÁÀ›•&oQ~‡qg„äØ6DMh¾q¤« À@ sñ` XŒpD`§t²^ s+âbÆ 8I–¿p9íÔ µÛK`šyäR‘h| ÇÀž€T¸AE�…¹/Øf×B“o“M76 ¡’ìg¶ÒÔî ÐÇ›D× Øx³ÌdFzè6 ›ÐÑÜ [Ê µ™ÆX…V‡êÊ\–[ï¡û¬t?�mµâ.,!عz `bQ,x¹4žH¿P`8yˆï�6ìë_†bQÑcòLÒ¹¢_`¹è¼Á=(~Leq‘\–àpßèì/óc¹è^ˆQøn¦D£™ˆá\¼ dT ¥,¹Ï½‹Z-aö8eÎb»åG‚•%s‚ l)þ¤2üÍ�ß½E}|qó {\E§_ø6ç_‹µLaÚ<!w›}ëW]h-ô1Ö¢™��>ƒBü�¯bd C؈qç¥mf«wK¯Fî»nŽ›ÇœäÝå�Ák°Z·I^uv6¸Zòš�šóö~òÙÇàÞÔ{JËp©Kaj`�:zõ�ÇÏÏv{_†ü>*Ép8yU^‰Äaóû‹Ïe‹ÀàÓ¥#Ë·°ô¾}nË Ù½“Ε`�)÷k ß>½Žk¾Äcò#»ƒíÊ( ŸÎ¦m‚¨ò¿Ö aú1­Ó5^zw|Xè üˆ�ï"ö˼É,Z×!íe*= f'„vØ+kúy~úý{~l‘ø×WÐæ>üÓ÷…A ÖÝ.I‚ˆ²âhŒLÐè[²ºøýbv˜ÂX£bu±J ÕP¿x~ë5‘ü‚^Ú0n=0¨Eƒ?[îQ”5aß•eOë)€AKûÿ#-0Ÿ¼e_¥N!.͔՞qºŸ<Ä{’ÚlÎaçÁ¸8YJ(M¦U >¢‡?×$j]jo*¶~)–áb p~š—Œ-•rYîJ-ÒïÓÆ«Œ¸ÕÂ3lÚ ÃÃÐ*:&CiaE¬1îÆ]B·,kŽ~ÏÝ�;~§ÿg¼ÉÔˆ“!«— A7~áõ™0‰ÃìÃË�ØFP㊅ü9ŸØ—â©Wøe†ëÐÁ›°¿Ý5üU>Á �ôoïé/ËXš¿PÌÿôSj¼rÆ. ,ýâfƒÈìÊÓi¬p0¦û›0Æá‹ŒBû$sÅ÷=•(ÿÈ«´ 2B?\¡¯?‘!Tm%�êò“vS�~ê#ôF…#µ–ÀR5ÈŒq S# ácÇ=õ‘ŸðpÌûh3•7¹JËéIѬº Pž+SnWŒBD�ÓbD5,%ÒŽÜ5¬È ‘"¢b+cÈŸ àmÌŽN1!Þe3±•­GåAÛ] áGÇÏ êÎQ¥ÖͪÁSF×L z[/`Z-].T³lR¿köž_-ùÍZŠTV—®�ZÁ‡Ø*Í "�£X3À€ vH§¡Ät¥¾é9U7ðó|3~zqŠ}®|¿Â¥Ê#ùt‰ò9M¢ÍUó²0]¡œàšaf*ä%xfUôÖÍë±åÿË™áÏ*l‘ü8Gleéï·TÚ Î:Á8Eíeª¬V* >¼ŽgÇ'=l“žÜÜT ôT»�u[V~ ô¼ÇCD;þõ²X+"+s•;Õk¿ÙÖ³ΖÜñ�…k?º}÷X êÔ•�ªfåÈNš`*ò‚vÂq¢x�¨ˆK ˆÍÏÄ1ì8†6„J@Åi:¸5Å3sô.,°;�(q-pþZðò# m\¿O°J†‡qWݪä·n‹‘�„!*‹ã› ¤ <fÎ)•¬ÔÖÒZUäÄhu–Q8í ¿–#]f½Œƒ¯JB,[ÕAlÇòІ¶´[°d�.Ã-x' EßV»oÄø>-�š‡`qMð“�ˆ»�‹×\ Ü4 ŸÜÈÃêy‡´¶Î�±Ï–Å™¥<Éä/! 5j*Žx±ÖüOŒÖ€¬Ý‡w~Ýl1šÿ°"/p¼çÂrwOÄ÷~1®éã»pÉäfÆ`}TX<†zù¡´è+3´®+ò”£A*Þ6~<8u-’–[¦ÎêI¬È�˜�Ÿô�Ù1ÛÅ«l»9ÔŠ4¯Ñ£‹µO«ØW*eªP©þÚ�Í|¡¢êq6K®žˆá H ê}O‹ù‘MF’ì¿n¢ÄÀ LÝÚ]ÑIeeUQòÃEÌ+!c”Do¸ƒÿwX‡\ÔÆÏÔ.Ì”£ީЕ�¿ÙDg»aë�s-qjJZQÿRïL^J–AN|ËYî ¾Û̆c °ÊD 2 ‹Ûs†±i.¦ÔÚ·§4–ø«NÕc¬ c[ ‹ Â@ôÝRc—“`¶Ã¾1š˜&x‚NZ‘S/mêžftÿÀ©1Ú¼ÖXu�â<Á (ÅZ¬JKJƹùò[µBÿË0¿ w°ÿ�;:?ß—uÉ;©Éµî4¿ã4*RøÑ‚Q#W�°b%ŸÄÈÏè¶{0‰°xçjZ)l5&çïø3熮Hë™;DªËÑ|H�è/çòlÛ’ìØ§'†X<ªRê�SRÞÄ8]Ë!žîFF‡Á7‡Ç׳ú‘ÖCvf5Ÿr7e­ŽÓwËY雺£f÷W^Ï][× ±LžÌ™nJJ/??£�ŸT»o£ŒÐ‚Ó'‘÷g‹õ•­m< ½ËYà^“\•F,ïKçb«6¯e„Úy˜ô™?SV�Ó¯%#Nža¼%„�bÙTÙ‡ÅQSÎëäèsû¨*xlðñƒ™êdäo2c…ë»5ÍûV2Ô%m0Šp,HûÝèß+9h~¡øz¾è .r$ë!D 6\gÔÃ,ì+{åàiÆsPŸÑ#½’æ¼l×;(­|ˆû1t<�q‘¼D^‹=7íô NL{aD†«èì./ŽäøÙå~pš3Q¢Iò-râŠÄ­™`æ",�ʃLƒ•‡Ój®T@–8`ÖçKnäJ÷m­laˆð6›„HZ™6dk�×/‹èn!†¦|í �]ÏÜ…%su’…S%ux~ý= ‹ NϹ΅:Ít„�ŒÇñ±ù[²¢z·çc¦­|íŸ~È¢eÅ£%Žìu}u‚†Û^;4xÝ”ðü@ � (7Ó"ú`¸ßŠNˆ ØS¸´ð LQ²¶:5 �ÛÐf¬€¸e÷ŽgiQ1=^¸ÃD@¥ÍøkuÓÈûêþµ„Ìv GŒ¾ãY%9Q¿SÊÁqäpq-öfí«ÅïÙ#íÓ‹^h}—g¡N‰ ,œ°±¸å½˜8WG�~!¦Ö6³…¶6ÌðèƒlQ‚•]4@80HhN£n)�ù`ƒ|e«^U,hêwm{_þ9Nºm@(ëûÍû�€Ê“ÆkRÖ)å 6 PîŽhBÙ5¸Ã™¬Ü?�{й ÎÍ�!œæÿ1[ùcü5Ù8o–S³’eƒôN(T§ßÀó,Ì)tº©÷¢øÌÆ8‹Sp¶ËESl‘—A˜j\ï4èͪU�J'µg¨ìŠD¢pÁÇ!€õ%ê�l¨ßŃ�`]µt6B| N�ÏÈÅÑòsÉêÁ ÕǶòxmN(ŒÍ*.©QÖd!÷1Ô�‘˜)C!S»oÎSejxkâþ“„óg+P×Eœíˆ d †ø�Ë—�0œ��,œz0@*Ò{¹²¡ Sv ‰O|Eìe¤Vdbþz<øgùëkzO^ß>úñD¿­ (f(�H…ØO^¿|䯛v%v|vÑÁVÜx¶U$ï 0 èE9”ª\ŠÕ!"ÈI‡çS¶xüzšQ/秆èéܨšýÞ½kžþõüó¶³p ȧÌŸÿOb¸Gý‡ä|çû®Ê‹÷}Á`‚6|<þñõoŽ~Ø9V1Ýsc”ÓLínZib¯S5¦ü‘؈/Ôéâ”">Ëxw~�Ï#Àž7è@�·­µ³c�×¥ËÏ£­Q¾Hm€@†HWåÙèÃ÷–02›õhŠ3ù[ÔVªˆ'†¾ºÏŽó…ýKËøYÙáÀIën•9éù5jü‡†yÚ4B¼‹�û†i]ô”6; N è9 $%’•#ùÿ0ˆŠœ¥Š­«ʦg 8�oÞ1|@�… {ØÿçÑQ§&áqÕÙÓ^lÃjv|�’ÈÉFZ‚æÞ ŒfŒãÒ´W©,E ±AÈj,âØw¢å�Ù&Ú-ýŠ6^[¡K¡/S]ܹZ—Ñ�˜­ï6ë®:R|6õÖÂ%B½Òx§Kå2ýu|’>[5G¾”™ßldäø:hª­#Þ‰ ‰ß{”ùRæm£ëúª`ƺ0cãÏÌ0jÊî—IÓkôNíÔ¤tXyØ¡)аY°h¼¢¶'Ïl¤å ü ‹™K Ü"€F@KÙcz¡ßW—?™?ˆ‘‘¨ÐÌ/ðVÜ®ZuÉE,g0)å�æ”ôþwœ]>,±�,Ëûc}ÍòÁ–‹ãÂÍÁR÷¶=bÕþòǧ«7/×¾g'ŒKcF„ul®ØM.~¾žßé‚Qú¿Z5‘ʈ|)e:0‰5fÿF±âºÏ¶·µì‰�[^DO¹9ÏK?N c+€Í’ (ãp/iÓy׆:c°Ñj·ÍóÕç%ùo/m�ážàõ Dd$D&¬u\§þ@�DQÿÞÚ²AýÙ÷ògºþ²vÍÞ2öÔ=Û²b„BËBÓØX°ˆÁ^“.V„¢gÇ�çmÈ6ÖVlh¡ªÎUžÄr³žUlD%´Mrõ¶ÕåM«Þ×/‘êï˜Ý[-H�N“�¯)oÛ-hÓ^H�箄{ô!Þìl]wg:!¯ØKDÊWÃõ>!ú*�Ž ûé=W£“çó0þ,H/,4k_�›Ã§ïŒœlgGaP$¾ñù2Dx�/…¬øû5¯õ²aK5°g¯õ,ÙØ0Áb²dòYl"HÍcX×J|.”fO¼Í£=ó‡öñ‹¸Žesþ(ÈŒ{ÀÜykcÈáKëŸ`7ÆæšòÉ}:yêgKYÝñæßLQ‰¨ðŽú5›ëÌ�ÚïPƒÜÿ2xg½Á¶Fǹ¼3œ¡ì×” ó;Âì–ië:�$®K¿³V¦ff³Cl ƒ Ðü¯ûVÙøÉ熉4ÿ¶ ÷rÛ%mŽÞV³ˆÎqkGoë·¶'ª1žoçò»1ü|DvEЈ£ûH†£®š¢SìÄq6áñ-Z•Å›}¨&S¥¬ä2s3Hß¶«øHÈ«:øüÜÙÕ¼{cã͈¡‚7•FúÆ®}‘(ÃáXl‹&~™ƒANñ|\{b|m`™�,vÏéì»÷ÝŒÍÈh"e˜þãk°ûÎ{÷ªž ^£ÌdžO+sÞXýÂ¥hY0Áë�p@ÔꆴJý5nÜgDé™úÍ=w�ƒâTÑ•åIç pĘqÉFå]˜u <{FgëCO²N^`ºÑVðà^ålÞ®t]Œ¸íÌ}ZÙÍõÞç~ïJ…%è–BGy'š˜Ï Ùˆc0h©z”úåe² aìÇ„æ|´`=W lbM kÆv„íV:V@ú, Ï.‰Ó±Þu?ü�³1Íࣜ@\3(Ǽº s[F4Ã!¸nëÀÓD;°4‰ò ¨ÂM™‘þ§­Ø™w'ìòýÂퟹªŸfŠý‹mŽ²Ï²Ô ­†6~;úm:Æ?3•kTÝó×ú{TýñZ§�2ÈÉžXÕmÉèÙ�cq$û–ie�¡«EÆVaÁîÖYEÉ»„J-f�‚‚a.Æýâ8  2ó¦†÷ûˆ‚ ñÃý„섵��ÍN`ÃÝ´fô^#g1ÓæQߣ¡ JO·”PÐDÙÒð‡ÿ›Uäßü½£ÛºçƱ:ßɺ�WÁ^oÒÛWsÂóè ’ ¥>kUâ¬Ë™ l«ÉDÉÛ=§%wà6ÉÊm. nê?;‚r dò¬o õ' ˜dì ¢D�Xípð�rM˜5rx†€ïÌÿ�LN§\U9Úw ¢8eü�O þ5oªÌİG­ç1%Ð� Ý‹ëXû†þã×ÞuÉv˜ð¿ò£³ wÔçM!úóͤFù»x~'§×’6Ïz}�4|¼ÀÇuïŠ^ ²¶ê5C³,c¹ U/'øQàf@h…çR‚é¿5‹Q*’{OÌGñµ£/R)‹¢‡ò—2Þ£Ÿ‡ cDÏc]§Fßø›?AümÏ}ƒ­ùîÅ^ì ßÞ9ÖüvÜC9¯âïÇ⦡a"éT¦Ok8z*¯YzvWöó2ʸ7M¬ †ìÚ!øœ�Nà SG�'bû®÷Ú!”KåZ,Àü#Ö2/ý¶"Ö#hå±Z\òÏ“…�~?ëßùT½¤W‚ØQŒáÛ݇‹+†šl²e„ƒ0áâ!CCB°^ÑÍ‘›1™'Ü �Ζ¦�ØL £w2Ã!Ôf×z‰øaÉT®»î·zâ„9ü8ÌÉÚ¿ÌÆhÃ7,fçxÔ ÷%¡ó½tÖHÔç\jÓœ)Ê6lù¤vt*¡’pCÕV�BO%ç8 ~–ÈЇ8/Ð=“æ=ôñ—…Meˆ¡¢¬‡™x7,‡’ÝÓï#ðôÇ®Ê�¼�X�ÃA1È} n/C�c4?hlH´C–ÔiÂcf 3�ªÙuêX_öáIpÛJÊg—UGhiS}‰]´ÂÆÄPΠc¥O±)ÌO8H™‹\€¡²F�p n wGž�G¼œÝ;ó4 éªÔŒÉКD‰w@ÃLpfH7£;;’¹žNôèn.W'óôdhY�Ì7p<ÐN¨î'Ü‹¿RÈ{ÉÞ[RP1þ ç]3q†`fë«uZfR©‘£hŠús+£Úúy?ˆdb”jì¾öXŠ7BiQq¢Ù¿Ú•npï3® ߇©&0áªÐª ³gÎßG~mâèÆHˆFMûÙïw'exÜ©=Z}Ú�ð³Gœu ‹ÜqÉ¿8ÜßžT›ì\(åv̦'1ÑÎëÞèÕ6_³Š)#¯.J^¿‚3/Y{©BNPñzÊ^{UÕ‰4#­¶5káì\‚’MçÞ/¯âÈÉݺthƒÎžøŸ„X÷¸ $î^:—fy©˜vÀÒ»[2ÄZ› ðŠ+?”{Jÿ.bf—ñ¤~q¨§²CþÝ5=h¥ÎiüŒmsy3ùÔûÚ¹Ú:ÈæLò9[|8»Vê_ë‡,6Q¯�~,”³²'Š[r®3{̓h nB­½Q™t\vHbB»È^âB˜ › .-‚Ädh7×®ùæGŒXYÕ0¦0|@ï¯`ôÓSÝò„w ²§w¾M…d{+<ÈΑkŸ„ìÛk‰�ŠÖ†ŒX·iæ<|cÎô¸ª‹Î2Ý|Yøìk¡÷ðó6+uÞhmåé®®S¼ÑžÅï¶¥ötzLûtÐïˆ8Ožl¶¸~Èv;†„¨˜�ªÙÊÃC¤EçŠ],#ýÓœ‘¥ËÁ4~óí^µ?¿©ÀÚk)—¬¼˜âoDIEQßbCOUÇñš~ÿÎ)¼ÖÏáÉͯ}êNca•?±�ÐûÌ¢VƧYñ#z¸æ%YKÄ_Ø(á“=àËæV eKW[• …µŒ¶ñ½�qYУ†­¦Â.�®È·blÝùåÀ^%Ä d÷äç÷È_×mûíjiåÙ·³:þ¸Üiäi­Ÿ!MN´¥|Ë.FPÈRéd ¹Fð 9ÙÖ×tÉ&EWÓ¿syùééñÇÚÇu-xMºSú—©-œg8óüà€ û1åÇ»lûBÈ„@Qt£SÊ¿ß ž#ìcUM`1Ð=9•þþéíÓß]g½öt�x¿0 ΄<ÿß÷þì÷«ã²}N~$7%÷wyÕfe­o~é !C”Añ8@$>øq·œøô®f§å³­'¯Õ ×¥±ßN`öDÀwþl–±n�žæˆzò;ì »˜‡þ~;Í«ÐÇϦ÷Ä1·¾Xž!Ì,ÄǺQÈÆI^/‰„(Á€E\ZÌT‰][=Üá£G4m‘ѸÍíÝû<ç]ϲÅàýûˆá—_?¦]¼a²æ<ð¹1Åŋ�}Ì[>I«kå‹£n9Ts«):8p¿‡²6×éºÔÏÿAI¾:I3ýîAjÜîoW˜Ê=õ~~d³A}Íì*³+Ÿ,ÖÕ üáFŸs4Aâ_Êüd¢Ôfñöð÷½È=jüçøÒ5±ô`ãõb -ãã%þØ0KÙÛ Èß0b£q*��´6 1†kD@é¹LFÏnZÑ1¢=…ƃ@‚¹Çq<Ó C: ƒŒáÎd´SIɲ[ÄóçÉ©ÁQµ3'•4.ÿÐ@àø~AðU™{út]†MD—ŽÒ‘Ïe஋'¤KÔ;·²è�¿i•ߥþióÐK.´ÎHF·e5홽RVw^æRÅÞ ‹Éräü3¢5ªÁA†#ÿo ß½h&»’ÖŸh…§êÇÂqW¡Þ‘9ú�Ê¥²íyTŸ“‚xcCæ¼wð݀Ţƒ°µìac¥šþ•&Z[ `û�.c¥êo´rÉjZ){ùNúûr}q±Ëî7ž”žÈ³+ãݵ9qe£šR­Dw:gÛÔã7´û´3ÏcÝîóÙ<³Åó×ÉT–Õ“ßݪ”ÿ-zmÀå:�[*VðG½¼ûÀwM4Ê �#Š]*Cpë¬I�›q±ÀÃÁ:Á ˜Å»`*ª²ŸÇ†eÜXÓŸnSiQE”‰Ï0¿ˆ—,`ÍEZ)‹à,urzá›,V”†û÷4eM¾íC¿ÃBr= =<sßþû ,…)àÔÉL=›Sû¿à[Ô ©¦ô|Bõ!×Eãä ]ÓŽ.$¶ è>;gÓÝŽ/Üœ¥ÇÅ{R±CÁèt`‰š­«NÜé¾ é5è*Vd³*dǪHVoí–¨ D{ùÛPûCêçC#IÐ|eX½Ùsf®HéúÞª,=1×Û”9¹É�HLŠù9¤�á_ýb@ìj¾P>n†h×�qÑÎÈl:0¬Œ¤8À“ V!,” þ”ÞýÎr�0uš¯À2DÒi„‘"¥Ô�»®q­Bæ.4‚—g3’‘+þlâÒg%û¯Ç™íü0¾è^o£ZÈ÷Yãfg=r,¢Ë(ýSì2�ç]ØyéçŠÀ`ôºS|¿5ŒÇRÑÿ@p p¢â¿À2TÀ¼Wsœ†WkåA�kÙ Ã «}ÿѤIOÔîA[b_Ëa(‰ONß™Oß–Å ëqO·<µ yù¾aG®¤.Ý´®ppAÀ»WwáÂ÷ VA¨¢Y4$7„¼êã«ô0 Œ�nê°7¼lÕÓ Â$(»±ÛÎlüШ6§„TXž» Pƒöy_ìS†k¸üžî‚ù¿¿H™ywsR8°îp‡ëŸH? åÒ'£§Ü¿’žD¤Î½ÏÎuW<ÀǪb±Ãس4¹óÿ�›jÚgb6¯œ+Ýs?Tmyöäb•o¼)…Cª$;òÏ Ÿ®ÑÙt9áá±ÅÑ;z¦½£—)ß;Ÿ V;‰3ÏMnðÚL‰o šs_±¯ÆçÆ\(@MÆV®UtŸ†toÊêØ¸•yzÿш¥i†³_ÕÐS0ÚXM,&Ú˜‹²ý6[Êáȼ?c¨k€.3�X ‚žµé8€aQ~7õb=tÿtE-;‹÷üäÓ”½øLv�¡Æe§‚!é†à®(�¨lÙÖ¸¼w.«ˆü*Ö\V9˜Û…a`7Ùv¬O„]©q£l'÷ôÃþâ‡}aÑ95¯¸£ÿ�ï ¿C~˜$ü„‰óÏÊÍ…½v3ç…Ê]ó|} ü/áü>�ã7ÏÚ�> ¨"Ÿçþò“gÇéN�a¤sÏîÁtútb]’§yÕ@Vf6H¸CL¯B¡x&L?KI„kvÉòUÅŠRRv ol�̀ɛg!íä�«Nü)Œ(WÞ˜’ˆ-6qoPýú¡K+½ù¸;8Åv€ó((NÈÝàFé}<ùùVg$v—ÝbÃhäx»Åˆ©Äyä±Në›}Y<.C#¥°Œ®-‘ ôÕ茠ÀÆá¹Ä§£¢�‰ýÓºñ¼L ó±_ÚâCñ]ˆ¹!{Zuö.”åEMÛ»ÏL©5صg$ïÿÏ‚ÀÚ#\ËŒeñT½ÎR?eð~ ¿åPÒÒZ<Ãý’e·ÑË�1œ?ùçö|iΛ™»%¦teb¯ýéÉV—}—¶tp…ÕS3 X™Âö‹ ɶW Ý¥œ‡V™3G‹Û‚yÚ'H×ÍwBòùÓ[£ù¦q¿{â tÕ\Ñ>ÖÈ÷8¸¨„­[[¦Bãmj–ÑÖÎ…øs[¹ sU´ð{ ävY¤ç< ‡+7ŠÁ«5ËÒó;;дØ2\ì»}bج å 7ìÇU¦§#fÖ­X¶-�¡ángB 3ÅQêÍÛE˜zº$5¢»ü§_š÷¶Dþ¥¯ŒVkéJÚÍD­%w|�Ò™]C4«„¼žW d“#¡7³JÛ •B‰Ù³Qbo«Ü8 á¨gp¥€\W0ºó*Ï#ØM/÷Íäˆ�à€¿vÍ1Ý8ŠNeÓT ô©-¥øQhÒ)`ø§¼±-|.½ãðKXcµ ’Ž4ÜÎʆZoŠ+|æºÍ!î�ßÊœQ—‰ÎdXLgÒ à«Å_f¡È(¿ß�!�àFˆ3G¡ïlúÁäoÁr^ï‰�<”UÁ?¯ÌÞ>!é Æ OÞ…°Ô{}¹'½(2ª4-/ý ôen? s~ĉuê9gøDþHàïçI_ËX%Ñ×Gö+@þ"�o¶ ÁÙŽåy2ÕDš£„Óq Eέ¶ÊïÊÞj2 ™…­�œÁ!Ö–#´³âfmsã{ç :mCYÍd!£çþÞ¹{Úxa»yÞü8>xk?æ¬ùÌÝ÷æÎSª~ ß”×¶Ösì½g�)¿ßy•™ªéøª…$z½•ä¼ï›ŠÁ(í¾ƒû]ø� “ˆ¥c;DhA§áiu5 ×w0‡”ôÙžK³Y–õ‘ö| Hà¢jºO¿Ž‘¤=2ï)¢ŒÏhÕ+{t³ÔìmK £“Lî.MçÙ±Ø,»*Ëå7’6cÜ(•§ÚV*°Vò¾K=Ía„<ðÏ^Ûß”¡‘FUФ UÇ`7‘5ÆÉ…&ŸI±¢�ÎX�AÝ-–‰R]àÿ¼èë¯+¸hC«On‰²xRöÜ�1ßn¨ÛÂád¼» kª›¤Ð†ÑGëÈî?ꙢŽ0÷Ç|ÔΕÚy‘à‘?T"‘�Ñ8*˜[}©±â4úeïýíëM¯¡R@à <ø´Z»=��.¹pô�fÕNœ4!òqã>ÉÓaè‰SþµWê\Ñ‚ÇëCŽFÿxkÕ‡Êa…zgÀïÁ@„S=ÿøµ>OKhky¢"N~"vžÎÛ_ÁÆÎOóÏèµ½\ht´Hâq6?ã[~9ÍÐzÿ–’ÿÈhËwHÄÀí6�ÐÕjÆÐt# Âbµ!îùÒ >aç2¯‘Ë˃�“;Á…GÀ�úò³;”ç6¶™ßw¤ö_³´ÈV]Ó XÇÜÞ/D9³‡VDÂÐäzÕœ#®Kw)LAÐ}’ðü…ѰYÌY” z 1— ÷ÑYcº¢[$’=¹ý?�2Þ2éšа.ÄMêG>È�üg>Ó]÷L&°{ü�¼wGûÿ¤aØËHžt¥É´ÏÊöoº~ïí,9vüÌ„,ÒÕo½)Ñ"ßÓŸÜÎ[T�AŽÛ¶nfG)çvf �Øex]»ZöŸ¨.T¯)Hþÿ_ã3‰K0aoÂ’íðÖô3NÆC¢Roç='R%^¦d틱æÜ©ŠšËú~¡–'×–=ÍLS$¥æqy¶Aú±öÕco¥’»×n_ò÷óY­¹®ì£ÂlºH]“‘/^eü<ŒsÂÍ& "Óg$* ÷„š�»ù}[Úuçg%fñ9–p+>‰ºžQÉîÎVßWÒ~R©l•óÈÎöKDL…´­å‰$ÁȆˆvv‚÷Iº8M#©­˜uªxs“±�+HÙÿ¢Y‰•¬È±)ŠøŠ);%íúëñÂú.®CâD&À§|#H{¹tÄÑuü�¦ï\«š*Y“`ÓÉ“*öv¯"l¸í=uÁ+LÏ(†‰H¥>PxPEÑá¯45K+Ÿ÷¬š< K ³âž�‘{¦_9<µ¼êD3+9îŽ×%©óW1ù½sK“®TëJ)(/×ódêgòe¬û_çóùc6?ÛÍCñÏšw˜Î}kýìé�ÄêÔêÞL ±Â$+¶p Ä…{ ÂJ‹°ZË)Q×Ý34�£’N;¬È-ëwç_ÃÖÀuaÛ¬R‡ø(~_z‘ 'Ërqhq‡Ÿ›é–á*…DMË4g¶Õ¿ 4„«ùâttÐ&yL¹’z“8x ³@ àü 0#Ѓ:n�!ŒåÁ�tw›ˆ:´¦¥ïæ;¹Zþ�²|=Ç�˜ÔXÐOÒ¼— 3 Ñeö°ÍiÁ´&gEÔv¥|JÖ9#ú]‰ˆ˜¾§‘’AQ²;·-*ÊH±Hc5r’'’]ž»LF—R%™q ‹šé}rSˆë½w5‹Z›’×E3„f�íýû‘ÕºƒîÊo»ELön${Ö*tnf›*ÝGÒ Gö–2ÙoKBNq‡¨çkWß²”…Ó°<—4а>nb–èç+ñ‡Çá–ЬgáE7;)£`&1,Ñï�"66Y¡E̴ͨg#ðÓ}ðÔiì¾$\l¿u„"–ldp,@ J®ØE¦Óq°9¨åfžºU5ª;Žã(ZÙÉp¸&–„p(SÚNåRMâMÅ@¨îˆRÊæš›hOe´„ ̶Sñ÷'…ÄÚÿ?èó«õo,ýòŠb'<Øãp9^Çfz»Þä1I_V¶ÿ˜*:ŸhUå…ªÕÃ9NSÒ¯ª“f‡ÕôA${‚Säµ:Lˆ ý£(oþeéÉ!š)… ZÃØß†67ïÑxJ«á#iÕ§+¿0U'Wɳy0<+rm¨oæ-`4¨‚R(Tse%E?(Ñ áCEJڳ龱¦ÁGrµñc L-–f’fò“›$ÜV•Ï�ò\µ08Mrâ+1ÎiÊc�ì*u}Ø_ ¤jœn=PÂ�¶ýj¥y§blÂa,j¢Þÿ‰˜�ui Òg|‘ uô v ®CüEIÞl×F‘)8ÒM9tÔêã8tL˜CW³|w›«�‘ä�_å›w«Ù½]ÒvÌ\µ2´ö— x )Ÿ•± &À{Çk xèƒ`››©Î‰€æ\�Œ‰»&tN§ü!úò0Ì#«³˜C´ÚÁ˜É|õ,­{yÜêYªíâ4×B3þüƒîPßS4�Õœð�Üß/P•ÞeXrm\U¬•hÙAôãÄj&²¥ö¤—4¦™V¡¸H2Ó+Y��Ú¶§!d°¡”‘Óhÿ•ÐÊ+K¤"Ùt”´\�ÿœùthîu¸ƒý™Â³õCûó$Ko„•ÅrõÍZhIŠŠ#¶LÑ7êÆ{ ¯(ªfÅZQ¦v�/uδ—ƒn´&`’üËXç­ágxj!¹>Œûr‡—Ÿ~LnÄQ‘Äí]ðój“bpXª5mñÔ¨eÒJøCØÌ¤I¯Õ6zGÝâ êl¡®˜“qœ~5IÉšÂnjû:™ux¯,t´U¯]”“’3ò8X@Y^¿ãÁN4Sdô7¤µ¹�í\ÁÐü"Å ¼ÛÄ5Î{Ï$ÚL|¨†YpídÚA“½4¨uz2:“�=ýkžE5æ\ø l‰Þ8¥ä›}Ñ·+“!û*’Rf&bYèZ’ú Hv«0v»08]ÔÓ½hG™f?±ðh¨%ð µ&^:Öz¶^̲ êB׺H­ƒe*Ö_�à­m…/‡»^>«gôìv9içŠîôL©;S!~´Ï'ù3¹ûHÝåæµÓg‡ˆBÌFáåãf@›ÿ-ÿ`wâ— Ë.ýª.S@!‚jbc‡§Ñ”9ü6×~Eÿ…Î!6[}Øy�ýrÓ¼ÃÄÉ& CŠi²‰Uäš…M¼•gBØœ/ăN%3‰g£»XO¡'ÿòä”OKÌ�ž<À¾1ÉTÖÒ8‰?ª}ƒ?ÃôþFñbSL¡þ–éM6’~r�`—G&²ªó/ÔXvx”b­›%O-Ûy‹·X8ÞP.‰ÿùt½ç!'9ÔHÑMÆyáT4YgÓ©Ñsš7Só+Ö-Áõ°xRx$ÁŸ†Æ1Îdß3c3ã¯A9k¶Ê \üÛÈAþíë•™›ÜÇ�†“@Qâƒÿ¯ù‚f?Ö½�UaËýØ22�"Aˆ‰ÏüÀlDLäæ´(‚„¡ä‘‡NÞƒ$dŽ³Ë mL¤FmÿÀÿ©ýÑðã×Føtca9‰iÇÂpôãâ}ûýzÇÌ i‹j9Kyï« …CYŸ6Pð0!¨Pž `+Àž±ŒÇºÇ€>uêþyNÿÈ(Ðà5Ø�}Çÿ3ižÍÿZzrñéüðÁ>®`‰�öÝ;F‡þVQ¥Q°þ[Z7£(­c ’T©œ�kFŠÙŠ(l–H×¼<ÖlŒ¤ÍPã2ˆ¨ÿØ¢¦@(c!¢]ÁH v{H½Zù$]zziª•NȬ#Í€íILïÚ`éÐý´†€èV"T¸óÞý±•‚~œ vìS¬´Å—~ ‡× ù ‘ŠiݪofìÝ >³¶ãLÚX0�¬VRÇB*iG³mì€ðÖCX±�,84ç‚í™,^ú°¬.¥V&YôbQb’“¸÷4΄$Æ Z}7—¯ ; ‘œ–AàPúš¸r4%TÇA‚ˆmæ2 ¡ƒ‘"SVUd Kà¦ß�XA<§m…¸DÈ6�`³X+ ;5G1�¯�T—X¹÷ŒË±„M! H�Z³œpl0|oF¸ÀÉsË'È¥ø’…'ùs„G «+ Á„I+ÆŒ> ç†ÀÔ\žŸw˜â˜VíŠDåT€ÑOBcriå±È.6ntk—µ úK­�ÐMó#­÷¦êfÝ´wš™î�ógÃ\/‘Ò!T g‘@GÔöç[^^B}±å]V!Oa«PùÀ!¥†-•dC �bžyŸ,°oL„k›ï ¢üS \ûzáLî Ó`×A³b¼ûQk¾äe±¤ý7H'ÂZxE¿ïVðúÚ÷E>î>EáÏ´\ðŸ‘ÚkL¼¥A;¿Yzäv.ïT\¸×E¨óÅ-©ÑbJ‡Ü´Â(�‘û̾¾NH‚¢ÜA¦:°bŽ4ä¯:&tÍ)ôÆ”"h¢îäDÑåöR^”œY7lGÝPJ•ÙP¦"ó*ª<™ ®’Ø" õJí ‡/¹=ú]Á.®C² >�ð0ç�¸ñÇÞ‡ž–aE§Ü õÿ*ú¢H­[Jsßìþ稽�ƒø�kr—ÛQ?ç_•RÍG ñóÚJ*™¶Ê<¦¤GÖ3pÑè:Ñ 7“‰@®Éh00©¡¦“¯–#ÁÁK‡¼põÅ}m‚x{"C¯3‰móå LöºKë|€ïÃ…vñg_a6Úú¾É0ã/cáÀÈÔDóð`K¨kše™îƒªX¨_J¼¦øP¨4ÍòšI! ¨§„ÊšõŸß¾Êe�­’+'�þ²ïçϨ�¾zœ�irÉEû•Îy´�Ë ß›ýôx¶.½q_Á�"W~0¥�»ì.1g‡'Iᵡâ/¡1(e\<Òjáðqêê�ïSÕ&FJvMÒ 48t_K|²=@¹’=`dq ø¨z>v]«âòó²c‡‘†äBÌP]¶²{ÅYß»H/‡˜Tój¡aÅÒà)ü:Õ¸Ó yAŒ‹$)2  ÆA�<œe ?Œ}ÀÛýϘD á��ÞÆ©¼L„<Œá%�¹�ˆï¦*”šwjE„Aàú}èqËl.̤q�áØ»T•ÊÖ –—ó4À;™ S]G"8=Ê›aºbdÚþ5¤å�²3å‘X>;ê6Éþ’Lҩij¹ÿÃÑo?Ô±û*Ǭñ2ó°e¼Ò™.ûR,™ Ë;*‡w>¿R˜ûR¦Ü~eÌÚgÞBx*=.üî¶¶K¾­H^d "ðýpS…3 ­0í=2è†fݹ>îþ=4}ŸÇèßñÞ½|Çgƒ´ýæ�—·«¬ç¶ö\QÂr "4V­C°…¦æ'0ÓG8ðK›êalh„šbóRÚ�ˆ{è9&}&Ot`{Ì`7³¢om]SȈ�õÇ;Ÿô¯žb§óÞ­K¶Ûìâ¥_«¤V™*>ýñÇï1˜ éŠóÈÞ˜ŒlçOA÷�ägi%µ 'E›‚Á 5ÌÚ–‘ó¯mEwsÞMËçH FÎɳ±Öœâ…«þþ$ ë�~c�Iï¾d‹n˜›3Šjáä<�vk¸þª _¢uúwÙ#}x4Þ'Ú3h’Š*mUÇÛëM/˜6"¨XÞG*Õ{“ÍBô² Î'zû^ù§Tw½�åbÏÇImZü·Î³�çs+Ú�ê�6Wj~°u•!ÒÉ5Í,‘¬Ï|Ì#;Êë¯qæ�E䥧S¥Î·¸�ãÔ�G­w¨Rò|]ËïÍïây�E�Î �'Ú7>–k5­w¶¨÷ß�4k5ž—Uë(ê:ëÙ§–Q�î Ùùäé·D©ü΃b:üÁéۤ̈́Ç¥Ô{‡8Nß;q�dRËøxîÖ{¯ÔMÏvX’t ræ¢:'y3 $LRR~¥DZö¢)÷TÀ6mGdÍVIL$ÅSwWK„uÐþ ”¹[�ÞRJ£™1�ŒqÛž¢SÌÉÈAo ÃP¡µÜ­qß/eßšE´ú|s.ø;êš"F;g%}ÄùÑÌ£`'¹¯Iˆ!Rå½XÖ_µ9{S÷œW�BF(D14MÞÎ4Ñgz[ÃÙ$s|„‰°¶�n9ɤw�ÏDr[‚’¥ˆ YÏOÔØ²ÀR„øJäz9—ÅK ,4g\%uóÔéã…VéÝ Qb…·ìê}ž\bÂc¾iG5"S“æYá{κ²] Ø2UÉ»mx$VÃè«M‘9s’ïStÈ9g¤\‚ëd²Iøt= ÒªèDŸs+МîÒ6K"(EddL&[ÃOÄ*<Ò°²ÿ‰±¼Åã´ºÙ¯-90;¹¶o3ŸeÙãþÛ�põ0:`ù¯^œv´ðÌØÚø;MÎeš@Ö�ðc�ÇTÖÑÚ˜ÆuÅM*|R�÷™çm6Ü‹˜”‘gˆ,€ºðf$êFHÐ3$!3/A±†yýã7£™a†½Íj£¡ûP»eÒÞ|qBµàÍ�N 6CyÑg ¤$Ç.ö ÂVNÐâBàb¹÷•\x¢×¹¶»1^:åeè �nzu¦è]ûcGSz‡tmÏm]êF­[è�nqà#VU³% xðo›lbDäPçetýÑu(C(àð {x¤¯V„2ü„È„w„©†j¨pÆ+.‰y=:lº!˜ÖZ\7!«Þä7Ný5ô«Ã×¾ÒãÅ™SBt*ÝãL8|›tß>'¡LÊxM„{„kǦ�áÌHÍù¢2ÁT“2“#i÷ÂA‚DY“èvß&Cî1!ÕöÑ‚X]öáÑ©q:É®Ù' $âÌA àuxQ}—Ù«ˆ°ãÃ-]ŽD[Ao9’šŒBl–º¾Ô@fù,)öIà­¹Ö”Š¸a¬ÅëÙœ�“,šW(“Š´ÅÖxEÓ¶'ƒ ‘œ®°� �5{ŽXÓ�lÃÃ�ä�mˆ¨ˆÔxÇ]@ë· Àõ5/ÌXX49`ï Œ ÈIƒR¬ žìÔXH±ù¦·} ‡|ø;ÉEó3a æ!ÁÈh…Ð A [.›‹µºµº—˜oÓ·™;yš˜8v�帚êHivuÕ·fò›Yò ~ãAÑAÞ`ÿÙÍ`ÃaF~ä�šLlþÄë~j÷ç#%¹sò‚ X-üN¾¯¡_¯—¨dä«ëN0‘õ K±lÌã×u‘^ ë¾o¢%É/¡0,› žätCt¬$–QGØm ‚ðøWǵ> ŠFÍóy ¶!„G™hÒ…ac+Ê;Ü…ƒ€F˦9´¶#¦÷�fØ®¦â‰€6Ìï$…ÖïKSF†G÷ܸƒƒ" jçüÔþÔ{oWQ�Ê9ãÆmJáÎiå0HÿAšÚæ×§c.@ÁR-bÓ›ø"£†ö,e_crAnŒÝ´P¯KöÙWnÁÙØ«±þðcs}Ë>ÏzþÌ£2lžúæOä£{Ø¿»;(%ÀGÂ÷ ;G˜šy† ýT¹f¹½O.vª¼qÒF(ʆmÆåÒ³/䟹ò�— r� zÃ3ÄÜö£uCÂsópéå§Q@COC›'*³<Üa¡$лй o€ú»6wÑÂD6/á-ÐHá€Ø·÷mŠÚ Ö^Ñ·w(·#¡@þf eÁµ"­ BÈ?¥Ìã7êäº\kXÁžfÒ0cê̸ê”5úc~±’d†lI6ŽA ¢”‚ö=æ�5 ë£ '›Œý)6û®93+Ô&fbê /÷"R}Yœ;hÙìSª¼ý6rfOŒ— ‚qÖP{#|¸ÙعVñóÓïO¿g½\nî䊖/!Äí"|'‘ë[Ïý3 ¿¦f:þo¡\‘h~Žã•ÿ~= Öi»]êœêGj.äÙaUÿ{"¿�rÿÌ…)ÛX•Ÿ}v4„³|K©ÒÌKNè’íP_ÄâC™Ãh¥t%¿Í°ÍÕ/Ñ£h~÷vG(Œ¤v«Û¸›à^”•Êkô™¥Úyay‚ók‚�D1DvªèÛw(:M9;kEÂò—cflH2¨›P?i\¿¦™i¶ o¾b�aw÷žd™ÇVyÉ®ÏÝ=œŽãˆC `vÇvð“YH�Q±Rd‘Ö$‘DÀÔ‡¥NÖ[ÝP©¾ñ ¤S¢|¥ïÐðC˜L䋯!tŠ�0$¶Ð¸].��Öz°ÃÀ¨BÒ4þØ~cÄI™†ü”ëªxöUð¤¦WZ�Ñ(Mì'Ÿ¾NŸK(¯9Ý»�n§[\'x�ÿ×x¹òcS¤'7RJê˜u6^�Æ¢t¶¯vÑöâ%‹ê¬µ� ôjÖPT²F²ZýîøDSåez|=ŽxóuËÚRvO¦½%&ýóùˆô~½ÿRCh}PCÓ½ƒ+ ·ÃÈþ»wÂMS.t± vj ¶²ƒÿ5_yÍ&ÛZô¬LrXÎg(Z{Ø:Lé˦oSe dd/Ž,…gÎ�§Â¢ Ú O�Tk›¶~г”-‰&;“‚G?­TÑÙF‡vRÕåâ¼YÎ|\bœ<«R‘ôwÝ〷Z{:d×¾o&\á´ÂÄÓÚ‘à;…uŸ$Óƒ£šH¬‹�‘ÜV;®½y $Yü GH˜™� ùrÝû”|à%ã2 ëh ˜„ÄœX$H}&$wV�jnA¥:$�¬’›‘L*N²IM–óæ Œ kÖZ¼ö¶±N¡÷-{n’Ú:2Y Û£š+ÄÐ]õ¤ÜÍ&�P;Ö)‡¯�ÑÑé"KÅÝnÞîÐ2iy§cÖL¢€’þž¹A ÔÖþs‚^d%{d.ÂQìf{õë:ªcÈ^¦«Iž1ÃûñÃk_ŽG¢ŸEÊÉÿƶ¡Ï—må±�­“ós NX§Y&om4m 2SÍó^ðpÿ»é‰YýÒœ£ôq¬�+¨LK^)(:z»(¡¦uÔŠüº�OI°Ûgñi›Ó޶¢’ ¬óïúf¨µí�2Õ¸4«„c©«/&9eEf0½Ç^A áQÖ{ Ò‹ý7?«•¯m“òߥJõ§¹™âô¡„µú,‹´I/ໃôSÅ“¿Dœ� 6$/îš¾ööëV¹Ó‡Éª(²‚Ùv¸víMßfH¾emˆ2ŒÔ»{!ÅOp„ üHES<»ð0eû˜ÃŒ—õ�`i=éz£ ÎçI~;Úf¹ôóx´wé1í8}*ÓlRÌ“À·Aä¼ýÜÞ¶™Q¹õ îl‘HÕy¶kµ¥ £Äåa“kqV��h×ê›á.Óõ̪Ãj†]¤Ng¼ËÒ—&"º¨'Ègõ£ÒÞ†Û^í9ÊGnZÔÓ˜ ¯÷äû‹8—¶ÒÕþ|ÿ£Ù2ìB–Ã:s㻫'J&”§X #ê@ª ª1,| ”‡ `Øÿàì³nŸ S }Îä<’ž¢Í€3W˜*°’û<3s„È†Ò Sÿ­?NðíÊ*Í ‘TÄüÁðJß°¼.Hð©N�¸@í¬Û;KXlxÑÒfª(�c³�œ_Ê?<©ò�y¼0ðô6Knü÷g�ûË ¦›ÈõìÉ—¾¿úÈžI®aùg&çû¼¾BZïì)ÑùƒÐ|Câ;Ïå”ÍXµÊe­ñËåpb9Ãü(þ:ôù†ÓË?´æÒí/‘p”^¡úwÕ¶�Õ‚«uLÍüzâÊb¨Õ)gû_þ^žˆy"l¬Z´ãàòhLî7:ï]žþ–ýê·/á)"Œ;ªX÷Ÿð¬TÿÛd©Y`›’†T‰±¦óã§/Nß@Ö´ð!n¾WìN\#Úm|\!–ÖZdäýkQÞ..Ê›¶Ç#:ÓŽD�šk¯«þïh5^5N§Ùb$yÑÑ2Ñ tîî,­[†”ÃÛK,ÅœÀÂÆÎœ«$´äwW‹áJ¬Ë4.Éh–£³_˜l\mf?Cv„!*ŬF”˜Þ¯þ† ÖåíôþS6Ø›Ugßò»‰ÝùbÁHZB/ríM.o%Ú3[H»6zDÅh}F&bf˜€D‡®¹5¨Û>Ý0±‘Z'ÕLçκÿ�ܳWI/Ð[Æ4Zº8Ы€U‡¯—B¢|k�Ì­H/XÀÇpdJj@À•Ü„Ì þ¹¥Ç„�òá¼�#»BIÔ@´¨°AÉ…¢.WBHº>]�o< �tDXí+ˆQ�Ñv žçt©ŸØÆŠêN\ɲçû6ßæØÕ»JX¤h{Û9�IÚS¶ìl† ÀÑ$±V�ƒ„Q˜ÑqA ’—k¨6صýÛüäú¼Lèο�.ÍÉ—-C7e–œ ¶Áp"CdÄ‹x¸êÔ 3ªıQ“y+^JÊ7©’ »ö«JèÔÐtÊ[Q»,ÉŒ�‡®Ð{øp[ÊKc½Ëä.©$'ƒðÅ€j²KþÑCA¿�Çjå)ÿÅ&ñ! wFsM/ï¿é~³+Û‰îvn!fS?¿ì¶_—]/œÜk„¼¥š¤—é¹l›ÏÃ}›äŠ4¿:ë˜bS7e»8Ó[¾ú¹ ü“5f™ Å3<ÖÌx‹3(8èbˆÊ%©ÀõHõà‹zÙ«Õ@Rÿýq¦Äá„‚ #ð;QQèÏ�^äy<œcÕ7µ©PÔ²¬'Y EM‰%§s™yRKÏÖ�Èéçxêû¢Ò Ô©'JB-C}¼± Ы ÒvA\ÁH´À±V2ÂjCXÿ!V‘_ö½0·…0î0½ÜoO9s› 䟈,*ÁJh¦.ææ=*Ranê½rÜ;#ŠöóDkÂÒÐ~˜�Å‘ŒW¸Ðî^2Ð5!ŠŠÝQöxé§ô•oòjP÷z¼£!›PHä^÷LÌ�Ñ¡£|µ”5sç¦ F"ÈE¸Õ_p°XwºV pr­òþgñ�‘",&»d~ÅÑÏ™ ‡¼Ààò´¥{J#§š|6 o­vs‹‡4Ú6ìlC>£ ‘N$ÉÎh0p»-§BÚâ±;Øm¢�Wb‡‚Nq‹WË+|ØÔû'ѦEuáëuhŠÚ娦 µŽ!ê’£°O`à+f2Z#¸}MŒ–æCm×Û zøƒ=QøPpÜ´s깜¦I˜ 8n(ÑLbÎsJ7ÿŒÁtƒûíìQæßÔG?¦‚0X~'Úõ¤ àà 1Úñ¼æÇš]µÌä‰ð0*ˆ¥-DL tsö¯ž©RØË“µß'ô¯môHq(¯/lž›‰A¼î¢ycÀñëñ�µ©Ðï/´ývá•Gƒ¹™£:*ôòìÿg=]ÓÜÆPX§ÿvfažL—:¿ÓÑÀë¥mŸRÇVÛà˦®ž'2pÞ fxô‡…Á‘Ÿïè=W¥ðàå•×ùªPóñŸÏìõÜ™?7oÙdÑùw•!rMæ©#â¦ÿBï™ä~~YòÝ}CbõLJ3ûìËCœú†´Zï2#¿'§dóú_\,é©”×ÈÛìæ ½Ké÷°¬¼Høà�5T9Jñ]Ü‘v¯As*”s4<”¥(�pËïÓÏ*=ï°ê\Ç —%ù/�ÁåZAÑS<(Ü¿OƒGÒó—c"d„™ÊB]özgw©Ñ¡ç/näšt¥VFH©’ÙrÕ=ÆÓ~¨Oé°ñ‘„ƒ€8l6yÝ9 ¡¯Bm+}þ«9=23V‘9€°†cáæBhCÔþrkO=ü793÷¡†°¾ AÁoÁÊ‘¿mäyð¨ßbGŸÝ.0� ËÄ]·¬Þg+[ ]¯BîÅzϹ›nçF°ìOâvã0¬©#¬'�?‚²+ƒž|]æ$~^¤~#¢Ýy³G)¬î—ÏTÏjÎRj�ý®)‚bs}0êéî'Nlö”FdéZU̽ö«^e)år\D£Çgñ )ß3"Ò�ïÆS$­¢Ã9¢.�¡"2j™>m7¹º‚�èæGX"ߎ�Dr•Ì 3�С`ç`åTc’ö”Xµ«k�Án(ÒȲcæ¸çžõÙ;Û¿©täœG’óoqÓ´„J£Í0нMK*S>÷³í;ýk´K  üDrSœPÊŠúŽ»˜Y5Œ=§$T–IGM&ðíËͪ•žÍBâ…Ôº}þ°ù$×ï/0îz%j©k³÷/¥–-*wc¿‹R£¹ãöÈɰySÛ¼˜®Ê™jæÖt¹c-Kn¤ÍSA©EÐ3 ±¹! !ïÔˆMh´1FM�Ï”MÞÓ/ifs#=ÜÑxФ16^`>�àŽj‘4n�ë Ÿƒ_”ÁÁcdCÈAu"…€Ý„6ù÷@R †,H4$�è’ί 2ë`ÇBVHü2ÁhBdÍòiT¯tÍÍhŸ…wBdbjílCcž”8lT>�M±“1O^3pYÎEeVSÅÎZ4ŠV¡#Ûš)¿g?S›.ì_®½#LËùW‰%4ýKù4hÀ�©Ü¿p§æ›LEœ×º3Ü",^䜦°CèÛôâ¢U¾¨Ôh8c€s¦êîcÄÅ&� ÑwŠ Ë,šR”ðXˆcÙ@iÀQYÏ;à²/çK‚ŽuOŽ åOÊ#�«ªøXöÝ87¯p&º°v9»Pn/‰[Ccƒ)Ä|ûfärFÙOíd«IQê( çS ­4ç¹¼ÖçÀü,}äíöôýÕÛ˜úÀëå1ZáÙOÄ䄚>3ø k�ùýÝq¥çZÓ¨ �¿»ËÚ†çºw` ³óÓË ˜õ„¾é7¥^¾6�sÑÛi mJV#·Za]¼�98Ï%o¢+Ù*IΘÛlþ^ô'œc ˆ.uonÇe!Øö=<½z¤õšä¨Q“_R2S̵³îªÀ˜Ü—zìÞ38ˆ÷ÀämÀq ƒˆ>aJæ7¨«„r)Y>B£;¬ð[D™¡u ‡dmãô|‚Àî7ÅœyS#Ä´aàÜG¿û¸À3nM+Š Ž.Ŷ$ÀAõœX2"pܪ’#×á¿`­qûwý7$Ì i»«_F¬»HscyŽðÚœÄl7¨’ðâO¥Ùü=À�©xðäÚDö_Í “£g#ÎéG™×hŸª´òiÏŸy¼Í×ÝlñÁ§�Ø :tCàyo[šfWž-¦ú8Œ.+eàó¨÷yó–MçTùKß"ׄ‘6@©šB�[ä>ÃdµçŽ»Â©�u¹ÿ-Ëò„‹EˆÛÌbI&I!.ŠuìÏLA—s‘ÉÖ/ \>¹ôk©½Ø¯L 3æV·Lâ7YjiÛÄlôCÎX3žX!1ÊîBèx¨c™ÐôìucªP•s-®‰úP¨ÌxkBoÜ1RM1†�š÷ ²©©vìê]wMÜðÄ H<¶#ɪõïJ¹œ¦QFÃzv§DûÑ×]-/ÈÓZœo ýH�“S÷ŸH=G3�ká"çmsêàˆÇU¤s».Ór“õoõx'}ö|·uŠÇº}pÖÜ™'”n]yèpÖn‹Ý Ù#šM!±Š §¦ÌC® JÚŒÝ0ú«n®jEðwA¾æÆXpLw‚×Úƒ6^�‡º“eüVSëÉ|¡Î‘d)Õ¦g–³ž)*4Ȇ¢Ü dçú8ðK§4úïÿ§CÜ hp©~nó˜ ™&¼Üäœ<�@ °*ÓÖîü1¯Iü·Ã.ÚriåÔN8˜è=áÛ^·¬¤IÝ�¯6w]ƒ‘Ùyb ðÞpE­oßFÚ�]³�¤L$’Ͼ£Wçe«jÏùh�*w uvoŸXÙ±’,­hMªIeñ‹C6‰uÓ‚™ Nö2½ûÙ1Ä×w �ÑŠ~ø‘ù‘òjw¨iHäq¨SüÐü#³(>¥Àô\‘T 5ùóâïÛd'öðïo¬wÑ#y^BlN kälF±þ%R&7ecøXº«,ëj‘B§U¿‹�«š^ï'åIùÍÜ ½éVYã v[¢­…Å1x �0Õ¬b‰êÊM}‡¡î{:(SÏFºž’)Ö}ûâaƒÅâ1ê° ɶo.‚d‘D 6 ¿Zv0tqþVÈ�Éç²õ…ØÍ‰1|"aqΫyÒð "L:ÀpJêduÇ–ËS›G=µø†¡A,•ß»ƒw™2!á«]òßK²B#° ¥¯[ÓÃÊ£®2f?ä$öãö*ÌI ŽJÁº<Ì4Ñ„/HÉç^Ö£»tÉÌÛy£EBÚ#̉"Œ ÂúB —r`X¼ÉêÌJì¾@Œ0ã`DaN‰Jh‡…ç“\*:ý¡äŒ¤UÉPèè€Úα¤"u¨Î»5®H*)2ìw-h ÇB”!Ç(Ü� P°§ ä¤4Ë?ºxduæw×r«³’ žzEðÓ8‡!{Š‘ÑrõÊïÚgѰÙ~nŒ¹+‘ÿOÓÏc�û��OÍîcú8\@³{Jl›�ãS[ ꄆû‘ðÂ7Ç6?^ #»(Ž|-‡‘‰l>V½²£Ø­¼Fh8Rìþ ƒ¦#~rJ‰‘cØVáF!%’)ù�¼ÙHÖQs,N7¶r�­}£/6o:§ûЕá7rÎ\{¹|¿‡š­ÍxýÃÄ“‘�pA•dhjÕ“¨†R>�Àˆj`{¿ç×òGßtÕ9Æv,ãZ›Â?kô¤fx~‹¢êå\šYvŸñÛ*ô¤äû�Z{ˆñŸLq{A áxŒ…ËðÂó²…�ø²9)•‰Ãw®–}YÊ®¹†ën.—/‚÷ý¬æqÞWt©“­÷gºž ÃõÅoûÉ ï |LÑN¬@ˆW´‘+É_î> ô6 Á21‹4Hm/D˜Q‰×îNš}ñQ”1t×íhyÝAap7ã¢0¥ÝŸ¾˜VkɉÃÎ<ÆI ~Ìy›`É�”;²`Ë&D¸ÏSmVîE/àW¸/‰ïYok”îÃÈ-9Îùœ"}¾‘ñÅLg³êŸ>ƒ/èêñÑÔƒW [4*1„Ñò�iUÄàÒ7¸ò Úe5éå�zLúÖ¿±¯¸Ê?jæ§OK•×!ƒ^ÌÏ?°òô‚4WPÿç³NŸPéÿ½'˜ v„“¡Ä:¥S#3!çsAÒ>ÇÞÜûo%Ø!ƒY½­í߆ ÞM‰'Aý¶ù¸ïÍS¿¡ØÜ·NmÕ¢Ž'دÿî‚c0uÐÐøò­xàÌ¿ÎÜsNø=Lï=}Z2Â/¨¡ÜÅ®¦”ï4-Y2‚¢&©”²¾E޶(^ ›0¬Î¡dy1Æ)^AE¥AF¢^A¨*æ"Y��¡| ¡‚REB…bA FDÓ€ZðíÙM›ìað×S%ð-í×°¹±ñ#vPEÃØ1aò¼Çú±ÿ>1½V 0àÏ!$¨jloälÝ',£·~�õãÇ>÷þþeÿŸÛÿß²å‘ñ~+ûÉ>«Ô2ÝŽP7¦Êö àÙIæ—„ø¼Þ‰´ö2¨Ù Åÿ£ÌÊ�÷Úµ­%ôŒ4|ˆÒÅ®­¨rÎ m˜2êü™r<î®ôUFǦH 0.qÖ_mhÄ´”¼|¢°«çõ”.@”«<:‡o—™)4Žn¿û<Ãuy½ó%ºM¹|²ìÅúçzZ?]³a9’˜š)ø—y¢G2 Õð¶¦ÛP±ãh²Ò?-sÎ ñ{CªÈú^ûË›-%TÜ@ƒ·|Û;Z ˜rJ‰¤ ‡ÄˆÒa­·yAnx]Xo·–c‚qÍ(K3¹/î˜ß||i5ß&ÍZ/ç¦U®Ü—êºØ¡ÛìÁÖVªéŒðšr2æÊb ­�ÄSRê6žö­„N÷UÇçÓ6?x½Ÿ_dÃgW¸AŒ¿‘ÑÔÍ,ûm²Ñy™[÷LE™YÖ[jzç:ûÞétðc`�ò?¨ªEÚ�²Nä]|‡mI›÷uŸ2< «;ÑúA3È=vâ�¢ÓŒ¿WzYÒqŸÛ:Ù3«•’í•V{•ù¢Ë3Yñ�´³¢U3ÅR$;½€Y§}åp©Â6ˆ‰+páÉ%õÒX0E2âé_ä‹ÍAšþ Þmæ¡Tݨ´²@AÆnúI{]N«#=K­éüô�˜Iáh´×ÔS�zþ2d¤õXñµºkBŽAäF­kÇMM£žÄ¶udP?jäþŸ~=?FqåÕgæ‘–`×F¤ï’41ãt—+ÕX‚?u-M%ê¬gË1kuß 3²Ô˜WC ‰¨Ñ6N ÉäB¨,íû:…^„ceúⵕáh�”ˆÝÝ4æ ׉¯¥™¹Ì!e¥s êG<-#¿KÛT£µâ,˜kTÚ±*¤U.^bçk ²«FåTšÜ+QÛ$ž˜ˆ¬ê'l¬ó,«I—Ô#Ê™Ç$¶Äd †ØRq(Ÿ¥]‡º?è"<~ŠK×ùí…¤áU¾éOp–ñÅTÞJ4×»7 dó¶¨}}ùbÿßσŸB×U­j5 ›}0Ô"œÏå‹•ñz„gm)Šäåé7÷ñ©ùûü1“Ìó±‰_»Ú÷N]¡{NÃò«Xpó ü¾ f‰î_·LѰô…ô6Cz~ ÁüxŽDþ[t‡[¿W $2Tü½™ÑÈ!˃¢ã›,´,uh0€Ç¾þ`ç9ÌÿHyþD?bìñ×ô:¡±§óùìt5Ý~§V­žó�%ùö�Öç8µQ;Ò,›‚m:‚„ºÉ‡j=§îT�(3甦*Úÿç<~q S…Jà�c&ž%Þ÷oXÍ è®Ôd²¿œ"c[¥p…8 ¥ˆ“`¿³¡cÃû,DµdHº5üqxYPj qcÀ~Š0íŽLÌ̬Ï=±±ÿÄÑX/ãhÆò—äŸh„{o&û¾–³¢ÊD[°ýНf¢ñicœ?š!3ÛJo‚«ud«§îdmvW´a@x êõ…7Ópíà ‡;®gƒ^twÒäðÐÍÖܯB#²Ð^Fú“Lœ®„®â±Ù•r9ayG(Q!g�LÞç‚{+iÙ�~¯weÛ®w½Îî§m7/’)q\¹Ó&íXôïÉøŒEŽ[vyéÚ7_;5—�6rJTx{Ø¡©1Ãy£÷ÆÍtU¸ÉTîO�Ô™"bM-.ŒµÌà7ƒþuFžÇÈy®V;67�ïÿŒ";QjÚŸˆÌJW[v$€}�æø`32ÁILõœDÚŪ߷;°Ã çÝÅN¿‡]j‘Øå{7â!}®ÛU˜'ƒ¸ˆ.i³ˆ¥�0fùø(ݶJ_à7¬ÖÆJóC‘mILd(CuîÃÏ‡ÐÆ+vÝ<�2²+Ê"öñ¼‚g;Ï�íÇmb†í<škdqêâÍκ—+4á‚s÷7ŸVK±ur*xí›nä}R[)ÛÓK�4ÐÃäÃÅ6Ѻðš"$'¤L2ŽHù-9زf©øÁßD'~/«†ÁJ‹¾´Èõá)}ô&«øÊ{‹wŽ#€P‚Å‘+¸nF0û®o¦Ç…‘Œ³Y#Áó‚3±ž¼ÇŒ€Ážúdò�O·�õX¢~ß¡ð7³Æ(3è°ÖøÃ úÀ@|åoHÔòz¿s–BH2Ã_•PVäoVK1ÆKã!lÔGC8ôà%þ�4¡•�ZÖ„‘LEÑn^þË®‚ �íÄm»ë›È¦äªg5¡;_MY±%“ÇŽ0±ô¾ë.Mõ¿O~uF±ŠC‰�6óCáSl…›±‘’Åêùm��ƒ%´¶Æ«w̰jx6 fgW_gJ»÷í¤¨»ð¡Ù³¥±ÖFôîZsu™º¼*¤ç€—T0­}3 Ùí«%5LP xì-u Lê› È‘‹ °a@hÜMœAe„c qô{ÐhB8p ‡"¡…þÕBtwJ,kñ>·mÔ¾l‘ q¥p|ôIó_,êñ×;¢Ÿó6»ÜÄ— ®CdÝÍ̺Õ].ì÷÷)£¸Ï7ÿãym<�Žþd‹ÚLÈÓMž>$-ÈtŸ�êàh}>üéÓÀ0—Ô2nµ®â)Ds�.1¢ÃýÝa'¯TÏYü#<Ç— ˜Äúj# ŒΚÃê<î¸g£\Q¬ ´ÂLÌk^bçmêágÉDC‘DZ˜�0ñlÈæö×O̲‚*Ȭ;ÝÑ€“ÅOy¡_r2yo´Ò�kz^3“t~®µÙ¢Ÿã�ÁBxÓc�í2Z>uºO¼q¹^*Ë9$²Ü-{v|µuAס]ÂáÅ|Ü®YtóƒÈª ˜ÎÌüŸ�ØÊ�~Ä€¹FP¯7«,†Ž@øFe½Qõ[I·¦|±°U¤Ž˜ÆÊwÕ‹Å~‰w·²‰a†I"ÆÜÑïj…kY«€}¹Žû>³À›å`Jõݤ7­ßX¶Ï­IË^¶œàHE6æ+ÂsÉ�TÁü,Ï9…¼BSv$ ¹ Ö¸O»Ö¤…¨ŽeaLáAÀÊ%ñ£Æ„01m40p 0C2 á|í²é/ ~Ë–Å|IJ¤åèwBæ�ö„�‡Uz-pCK‡\Îæ¬ß&ɱÓvhã7´á¦FjåÛvêA̹àÈ÷––dV)%ý-ዦÁS¡ë¤Ç_£¿ç…®Pž±åÅÔƒÁŽã5mbÇùT˜N$È¢‡ÝΦ\¸z>ÊâEïcM«áÈt̾”º2EKŽA®6„®k�@›If\ã"²y¥^Î6 U×EF1€Þ¥Áç�˜˜œ±gV.”Ž9Utï3³É4e�˵{v;:3̇ ôFe_|á>ôºÌä×ÉÙ …ù··I§Q°þ|ïÆé»b+A+Ãç|m?šÝAL±,»¡›Mºª§úuã¤h¶NC�ÿ'zMÃþñMÍÔψ~Ow2ŸQÝ1•|ëýÙAí…¤çÐK v«iVç6ÜYõöºzTϲ ô#¬jÜ,tG°fäõ�Ö'Ÿµwü^f.ÉŸ݇�‰´  Vû!=º"n1�(aŸ÷rìÎ8âÕÈmYè|Fû8°62½¬*®×nìM™‘:\ˆ9·ÚbmŒ™@gñÌüd P&–†ýl(m•RÑáw–·½Ò3'¹Œ3€âd0О›0{/t©¹CW†ŒÎµll1uÞÿÂþì]k�æüHˆŽH²RWË0釮$Êì]úÖvØÏ$”ˆ†Âdù/X£?y¤'^>Žæ¼ô†í—}lçø†¥ø�­¯c�…\Ä*$Qù›ZÂÇ 7Çœ5 ‚Èü!¨ß‚½_¯‘>ø[|”�“½GÌû¿vŸ—› š^”xc•I@3ê̺†1ç‚÷çÐ ®G/ƒÞN©—œæŽXÕùª˜É_«ÑS|:)dc\­ÊÑDÇØL¸ý]ÒP%B™Ár ücÕâ5¢MrÛ.}—ý±æÏî¨×mbÙœ:™!ûÖaê½ àò'q®±¹8þXûíÆ�>³-þÙºz!1"ì1qúDRâ|48AŒZÁCØëì ;¡ ù€§+åu’‘³…Á�šÔ 8BxÊ  cûÈè\öKJºäËïoó³›##‘¿i™Å™vE€œPë΢ ¢£ÌÄIo$ѽ«ù«wÄÖ­%I£Ä’Ø\• �ºž\fV^àHñŠÔª„›’' �~6îÀ@ì%¾1˜ñL‚4 —8QëÅ(âXO ®WŸ®Õ“7'#ß!Ç»¯Žûìt;[BÖ¿h’U¢µ:£™¡_ TŠÊÆ\ò]@©Ì-Û´WTxë LLë©·ÎAGT‚Ò4ûr*K³é"Y5–�SùÎälŒ•ö9cÀßfkh<ûYîÂdð—Öh¸ð÷·Ý;"Ž�†óTB¢ÁË& èÐØåDÔQbÆ%!,õvË,¨&nk–CÂ1Çñ(|ý OLú ë33d¢ÌÅÊšWm¿Èh4ɧqð¥þÔjÄïà :¸æ3ãwâ³2׈ÂèSø†‹eصIC<0oɯ–FÓÿæ•[›ªh©z<+éÕªuw>‘Õ& Ú¨¨®wµ÷&£…©ž+"08pH=nTÎÅ>H¾óºç<òÇÂ]SÛðê¹NaÛGq�D‡Küæ¿Jø)Dög~�1d�½œçûûH¬=黼J4)ÈšØv%FMðÔ¼û„t*ÕèðÝ—§ÎÔF6;‚ò²ŒÐä|:£t'òb$d@ð±M¥PÈN˜¾â%y™ñ*s /ÕŸ ŒÏÿžöiaw2zÙ` L*õ ÒZ&àä@ê L(¸º.Î -Æ'+ÎM� Y²á†ÃÓ Ë}¹AŤâhn¼ü—áRO6 l[ÕQ+| wØèÿ”˜õ°bEsªmÄû>‰ ýñíwùW61¡¾trw÷Í7`—Ô™Dón°éÝ¿ãüøfÊH`I†<¥;óÍu=”�IdîaÂscÍíá¬è7 €y‘qç.“1f^nª¨ð&6òþåoë¬ùÑVžq¯mlõZ±öÖ/ýfÝïhÎòð"q:ÞÅ¿ví¤c·èÕt]GÎáϼ˜IÇ;6âßïÄQDYx€°ßVTpÔ}´ �Ú6s¿FÆòòpd*óôt9Ý�ø6ã:˰•˜ cYËÒp­(+_€v*YØKøsVÈ’Ø‹åþ¯á¡XH“Mº™Aÿ—+· ¹Â¬ A©� hvF\Üø”[q�b“Ê“¬‰C‚×ó[sa4ÝWÁ¥Ò”)¼z‰æ) UÚkóÔ” ü½;m$)kÝëEÓuåšMgA�Îý<ÇéÄ7­CÁÒ@Œr|°Yšc ë~BaÔ#J”˜èHܬQ&±=µ:7Kb…äðfÎoÂå-VŠ‹³®"‡j“‹ˆ•ûY)Ÿ±Í k‰b@QÜ4þ6>t±;t*ÝGÏáù?Æ,•¨8»îßË+¯ßcÌzX"ü#}–Çx©ÔÂjõø\¹Ø¢Í^u8–RQif\{e­ß  YÓB3,Šp�69·ÆÛÔ§E }†à÷ÌÊ·(¥š±° Ò<N0À‹ÁñQZÀVÕ°Ìí(y„‚%ôD7t,PR…<ïÒ^„§–¼ŸÑ÷ÝÒkZ @‚©I–¥.4/Óy†MC•3/�ÂÍ¶Š…{¬Ð¤°T()ÙŠK^îÆðyN:¿K´�ãÏs�ç”—ìì3¿­¢~¸u›]õ(‰'UÍg¨ßGÃ(×ì2ƒnp½ÎKÑ R·ÚlC\Ñ!ÓâŽþš©Ud}yfÊÝìèb/žï{?ß(iXª(5haxw§VÇ;±Ý*kœ�z…-ðÏ8÷bFzóÃi*OJ8 £Ð_~Òõ+„@�§FaƒÚ3v½fOWl� ÁÔ*<Ò Z˜÷a—ÓÃXEà1œÞÙvÓwìe(Zš£Ôèu&ð¶,(óâÃrº\¤Ô]rÔ#G56‰gÝÀ”¼ìˆ»È ¹?1[ªQ}\©_KF`ȽCË“àv÷!êA&îD\F¾<§ÔʯuãúŽÎ Þ»Í)“ÓEOõž¸Ì|O®Õn¼âKžõ5¶0��˜®->Û�~¼YØ•i[÷ñÛŽ°þOîp,67¬;'��~h)!λÕ�|Æ‹•´ò¦ðýU��oúEø?ð…ŒQwƒîy�H÷cñµûùwöðŸ¹Yú™nÏ%x“«&Ö¢�àÛ=Ûž"ÉÍŒ¤M6›*mPæ eý‡yÞçMŽœW¡œ Œî{¥ZElåÖr@mPÎ"IÒ¤AƯ(R20Ò-‘Ë8Ê\ѱ¾±á†ÃTW?`ûäi,"͵˜¶Ïͣч]…ƒL%„XPÊ,p�à‚)„‹0àêàØŒÇL´#'[`’Áì›Ñz ÇAë_^©5ü:%åØw¸dVPô'ö`±øÙp7!19«yϺ6}Ôyÿø g»ÆVoö0æÚÇt<~YïrHƒùϹ¬Ø¼Mº¹l “° jѾèÛLuÌ.bz_l¹�ïÀ¯×ul±Œ•ì×µiÖhµ6qä-¶ýRÐtÝ—©ÒfÆêæáŽ”ê°É@’ø�®j•@ÐUd�Ò' ë¦ÎW1²î°˜P”Þg@/»bJO ÷T·ˆy�`Œ#Ùðb¬úý‹©ôÙ2é‰Çé6¿•ùþáéý‹~–˜põ¤" mÉ]«Oo3æMGjþ¯GÅ™°]Ú­jÁ¾�{ã0¿à Â_ßà§«-ÿ›_Þ�ÐdQ&þOöŒQ”�ba˜ðÔ?ü’[¢g-,eæ«LEVg}¿íjæ¯G½G÷”�ß…íSZ›‹TÈ0¹�Œj…Öã(HC�Qâ¾àÁã�8¶‹´¸ç#Bņ½ãóv¤?önñ‡|¢!&=‘J Í08¨*‰”è«Ù:•;ìOLŸ RËMÕΊŸkDWº½ °cú¾<=¡ß—ª¥cðº‘à£Ñùë_9<žOÎF²f¾«c\9’~+>ãh—6`—áL8Ô)':‚]Ÿ³9àµG,�;8…âGÞÔ­›²§HV~X´Ÿ8ÕÈe>à:éÌ7Laˆ˜Qï tê:0dþs ï$Ò. :6Ç33ø$ÑøªÔeh�¥RZtÿª!ûýÍ­zù¼ð¯¼w.°¹^-&šoýyj ݺ–y�f×> ì%Á L£ŸœZ’²Öìir¼T¢&6ßýÜkBkÊÑñ£ß˜å]—꾕;ÓïžÉù¹7)ê´½vmÙ!|i<¶Ð yæ†�yît³_ôyðŒuÏ^]<½‰®U¸ûyž¼ÁÓ>oÅ@¡¸ò«ÀÆÞWRsT¬™æÖG¦ñÍP�5ÛÓtœ�™ DHAlg&¯×˜ÃŠ]õË©™Yí¢¦ßKµ¦î°ðRl±½@øÍÚw5÷‘Ê‘öÍù˜MÉ–KmjŒ0ÈÞITÈãAHjŠ,ÔŽa>#EJý4l÷ð62.ŸˆOû j²" G’�ð!ÔÃüÈ†Ðø5G±_ Dw>øàÅTSÎ×oWô>­è`Pà° aýG4Ÿ™ùý;‹'Ÿú*2)Ã==„ŒºÔwa﷮˚…Ë×(\œk¶6=ãð}EÇ÷̬Wżñý±÷ٳ PÛž~Æ%祊¶1¥6ÈäþL¸%†þ¾5Ê‘ÖÁ;„ì‚äOæ€ÎH!kTâ4îÊ7ñ—0Œ øÈšÀê· (7¿Þ†ó„åó¹éÏIŠÛw‰ZZI´ùØS¦'Ô6åA§ÕNØœT§ÿ?ù¿w÷}v×ϨtC”>¬ÿ!&BËaIp‘iô-f^Ñ~êDMË™øé2H&)™ÂŸÚâ¿àßÝ·«¶â  ̓CTma2†ÃkÙÇDÂ0ý7m¨ñ!À³(Prmbz´{2ôPT(�àc�7U[«r—h–7€ê÷íévè�âdó#1²„!@+°.x `, c‰ vCæÔ/h"Ž!—¥©à-—˜¨E*Cc§l{“�ìn%0 ¤„ AN§u�º„+ÊmÎ!† Î„3§ßªÖ+ ñÈØ ‡æÿ»Px†a³¹×¬uUýôÖ7j�IÁδÌAå]€¼� H�ü?HhC$À‚ƈk0ŠÈÄ#Û×ÃÄ“–µš9_­�h©Ðîš_�j[¤°À�n­S‡‘>@=€ìEø�èe& OI†´M�ÍR˜‰ø÷àWï^S™ãõX,]åÒþß�Ôø6OÓos×L”ƒÄô= /- G�n¦˜*&�ľÄML©m¢W:·ÉvÜâi{Ü“�Uhú™;è¼mFl;p)Ýa1¾¶5þ�9¶x6y0YƒøDÜ×ÝàE›{"Ñã~ÉÕ¬7™ÏwFœÑË-™ú6ZIzÍlÅ­Oý¼GyÎN¤äé1_5—ô˜Á³kd²Fêu¯7ñë1Ì΂eXé‰ éwÖÓôw§’žwwõί'£�eÿnd5\OÕç3Z�ºé~—ƒfx>ÏÛòþštš ~f3�7©O«-÷3¹æ¤qó‘å*§¾Ç7là¤zý�5Ybö6—¤#÷;kävê=X>X+N”Ê1ÂÚŸ·.#†˜§ÔÌÜdô7”ËŒª© *,’‘^4õOª"ÍÉO´½hªµ„Ìœ¶{U� i^Ó)šìëïë0øª;�›Äh66éOâû«ºUK+Ú¬¼ô' š—•Óâõ¤ÐßZ”O$ÙTþÚû˽Bª-s{µï <×yCΑð¥»Ê%w6�wÅ�Iw-Éò:õf8´‘³1·ãµpíW­l“…F=\±æViÚŽï¦ö]ÞçyTÏ3�–ÉÈÉv‹gÍuEßw¶‡”Ëù×�oËRãºO»Û"Nç9‹=ÿVùwp^o$R[V+pRaÕt‹—ÊÚœ2£y�™h&\Í#ŸÄÅí_Zƒ*ågq�êèd˜‹lˆåJ£JŒ­!�—·¬ÆìÕm2JZrÌÃ9½C»ÁÄ*·©µÏ(eÍg–ìâdÌŽwe•.'È¡©£í…#].èÕÍ`á‘m½òÔí ³~«i�1 â�6ÎË>šxÈŸ[ÑÞ‹]ØgÙFîîžö~ñíASæù'ê_*)³/¿X>ŒÊ¤Î^žüŽf‰½ ×jï¸W¶G�úµ3ò±Ä™ø¼Yˆ¿k5D�ŽJϘdQÙ µ[•�hMO»»FV}“Bߺš³nô&šçâ”lçUf‹Q‘Ɯ۷nå)ªti ‰ sÉU¤â��浞fúgÆi%»ÉìŸT•OŸNN}ƒw>¬¹#'å©<—³Ç9ÝžVEѼà÷eTÏvÇW’Kw‘Õ¯5lõë”ç*8ŠÓoGÝLni˜Ü¶N·J�*Ç äÖÔÐÚ ¦riÆ|ò"Ô« ÉÖŒ®úå*pµå[½Ì‰Á®«¤ÿï#û°õ‘�·³8W‚÷ÿ~¡t=™¸ÿt˜—Ú7!ä@Bg¯WFsð¯lm�5¿r¿¬Ñ‹"þøõ…wú/ëáÊ×Ä1X±ëj´-r�sR-Ôáq¢‚ Hƒ †<ùï¿oó�Žz¶ÁåïïísçÒž}z°">1ªé¬ºìÓN鳺á™_Û¿{øà�¿Êþ¨Nžv…ùmkN(Dò9OXPX¸â 1%à%ˆ Ayk¨XÇ�ô`h¶ò3Ë–ÁIˆJ”„�Óªj[«¹M»;vWR‰” Qìz›tã§e¾¹ÏZñÓö[Ê};û½ŽðªPa1¾¿v;­rݳMð* `xìØl-¸Ÿ} È` çG¡=¼8•$ì×\÷òÁ«þ›. ‰¡cÀÏ�äóõî:Hþ”Jõ¹Råñ§\ZtÇþÂe±”nÌk‘©qÝiÃܼ¢¯ÁóÄÞYuΣ)ž±©r•Ô‹Ãm2d»/v± pBf Rô×còsíù¶›µã�!eÁ›‚>_ãn¾gÿBIv•â¢fœÂz$Õ§ŽñMâD¸^2ß¶ÙÌU ž‡/æ” r“BÐ0Tñ©Aëªà…ÕO£®³°ÕbiŸa HÖƒy é`©[Áç™”™ [¹øAZ–ýÛN}˜ÃÀˆ†·Û`±-ªÂ ±K@”Pò2(î"6,÷z_:óÛMýDÄÂdEV �ÖÉ÷mZü÷™#ô qPì ð'ÖBL²¸ÞvÅ…XaD…ÓpÍÈÈ=û_Šk“¨-Ñ à`ܻՃ0³ž"ØR›V ¸û8=¦ÍÛ·÷¼—‘sl?ë�hµ;9¬qjp¡CT0Yp7ÅA–âû‡°bùÕ/w;"¢äövüésóÿöaÇ>@õãY}ßµôf ÝÙ±ÇÝN?^cæé»áÜœqj‡-æ�(i¸Ád Ÿ ‡yýý¿•¸ø»JþÒLƒöÖëº~�ÚýøË6ˆß’k§‚(¾Ê6±4Qo£h®9MŒ;hí ÓÜïÇ·ú÷!§ýŸª8Š :á­ñGS¿ lÜ[ñ}³i“;f ÌôÙX´L”Ñó(µÍ6 ?Š¥lìvóêqÏïûØçª“.`Ý:"”mž±õBßÇ©ÃÞs,Lv¹}@œÛ!¡—Ž~Åã78�—šjg”h›x •‹O25P£!$V™ãíŽRð°XqöϬÜ8ÝIº°eá¯ýµÈ¿ÛØlwrµ¨õ;øÂáwN 6î ):7‰‹˜�L;ʸl¢á/M! j÷Ѱô­˜«ÿkN>9ïñÉ–j¶ºqIæ69#pÜO@ìX-lÀð¢Æ0²¸¸èÀœÌ`ä6ù³-ª™¤ýÌ~4÷nVý:Ìm—Zýy¹ÐQæ‡A…b!¸O­üCRæëjÙv• o—F.é �U³.XíoÍcºaf€ñ¤×PR5 Ä…¬(PŽm|•ØIX]¶AR,§c""¾÷3�ùÚûíÊ#öF©ÈÖÉyѪ‘6?»Qæ”:A0VÕ«×ü–c0ÒZ�ê^*H-Ñ�*ü ½rä�l“ni†ÏzÊ À­w,iS\ çH¼6<ÜÔ Ï5†õè˜!âQ WïD¥ãw©õl5j”+Ív?ˆ˜ dU`�Nä`Ý‹•]K€„’< «à Ð& 4g¥z@ðê¥w"˜K’ „—ÈègÈ÷åÏ­åîÿ2V~/ÎÒYÕòw»Õ|­E:7Í>[“dÁÚ�ÉÓYo6E‘,Ê,Ø‡à˜ Ú�Èé|Í…Ïòm’• aõØ1LJ¾ÇKè®÷g&�†Hd¸¯.µ}5˜ÝŒCh»›R4§©4ÛöÄö�à{2§®Ó*ô�Ú„—ç�p­ ¸çkw›p/Š-8™§R�Ú?EÊ'+PÔ«Ÿ=ýãAÉ¢ÍÕT|uR'­®&E¦j ª=oHyÓÕœSb¶o€�Âcã’ :ð/‡Ž`Ʊ—…“€ø!~³ët?ç ‘±7'ãf¡¼;|YšÒfAã,1;;NP/“6°á8ÿŸñ$8Þè±Ã\Ä»®Íº·ƒîg±(ïc�¢¿Ï‹L¾¸_š>Íñ²·JsãW¯ê²­‡c‹ûÔ‘…¡ôÊTð]9ê\´õç~o¶AžÁ÷Þ{Q$‹Xÿ®¼}Â¥ÿçà ÷U��dÄDKSÿFü‚ͧþ4™ÒLÙ¼5qó=›O@”eZ&o¦>¶O¹Ž`›ò³³SÏ—Jf'¤]‹)I¶9(Ò‹kw,™|l1¶¹PIdÜE^Šøì�ë9ÿˆÏ_=wÄd_»fr¢/6¾“>…ÆÆÝKAƒyñF¹Æ{2öUÀqAÈ7OÈ7…|Ôs3ÃÇÜù„v0ËŒ® Èäð>$gf ÚËš¸a¤“Ä Jª^^;@ºAât6 a`iÀ‘0ä< m�¹ Ð# 3àZ`cr× òäøCT¿j˜T´¬›¸äÊÿã§ æËþ÷"ñ¢½Ûúüðy¨À„øN€@à oç¦s5Í1ý•7ïoRbi£±n¤©£gµ›·)àt¤!±'ˆ=¥7ˆêTÃ!¡µ 8È•\*…�Pv7cù1NF“~‰‘Ózþ`+ã�ðŽ·�ð4Õþb%SFèÒ'údUÕc³ëPÏ›NùºpÀJò®P�Ø'3Ïië©ãÃ3i§ªT|loÃlÃ�õÔÂf"\Ñ4mÍ…Hnß]èròuÞ$@â’±&͈Š7*WrÐOÊ0ï�/‡¥‡£IR\Åòv\t‘(¦>8ªát{ È`Q-fáRÎÙš<˜Hí¼dí¨ä¾ŒÅ¨âv¯‘ˆˆä†*Åh3¾Ôil�„•Ùä #¬à†ÅŽ’ÓXRãn™jQ²¿Ú�}žøEñœ³ù"ç:ƒèŸFß*ÒÙA¹"Š=¦6•,ìh�™u„«¸‰m¶Ìz1º:Î!о͗e= rOdœÊ5œàØ®��kg™ÞÑ"I’¿\,KÕÛÁ¦½ÅçÉ3㦠rä�˜àÒ6чò!±î�fiB0W€[®ƒï¹™Ï�ï=VQàÙ(8�î{örôŽGéäÔÔ‹;óìö˜ÍA �=Ø"¤µ=ÎòÁµƒJ\˜ãC¦WfÇ€ÑvãD4pÊVÃyƒÉ™�Fåã"܉ƒ"k]©¤n]<µÐØÁÄq¶uWº&E›Á�âêÈÕÖaËE¿ù3‹ZQ#\N Ä�R_ YÔ{°�CàŸZ�ým„öPG=ÂÝž’…¶ïk5Öåà­wçe”»>ÃaîvÏFÍíûû5WŸEt›ù�ââäÿœñľò˲=â¾Áf4\÷Tþ³ùù{þ×LùÎú¯žÛò.}�„èÆ‘™=~#Ýâ çït‡ð� s‰ÒgÃ;ß33HxN׳£è÷½¯ØK°Œ‡å=z\»«âl¾Ã¨ Š $(Â">•‚�YPÍ&” �Ô½Ý0·Dï_F¦t×ô�-¨Wìõç_X’QüŸ9ãzøÎ’[ãÙ×·pHÄ…6*ñmî@—þ¯ÌéÚfNˆqÒÝ tïxf�Ÿ=ƒ›ýy…t ùf0å·®rQ|\,t = BGJjqtoM§µT ò*p ÇC%õ�±é2ùáôª–máªsŽõGY+¶1h“# ©=ŒÄažöO¢r 6}SpÑîã©®·Ì—Û·Lüšú¤Ùÿó’e5‘¦ëT°HU5àýgÿÿÿÿ�óàï€ À à§Û:å€:žÝ(¢Š¢@EI"ŽÖ*”‰D‰HR”Jˆ’ªPI €;à;}ØBö}¾‡Ðz•õ¡ð·Ø §@ : �€QlÀ:=Øh€h ÓÑÐ'Àæ^àÐô<•]ôV‡eT P€¾Vè<¸ Í@:¡Ê€ 70:(v Rªì5ŠPöè( E¤h .Πsb€:ª�Zª»lêu:vªÅ5@ ¶(44BàXD�í€è@ª] @uÖ”€€õ¸ªb�â @u#vPJGki*(((FqX(  @t€ °›h+­uª˜¥›0 e@   hY¶�!¸2Š’…B€Qµj ¥€°¥=u@Ó»REŠàjcliÈ9)Û¡Ñ¡�uk µL: m�Pè(èu@ b†WqÝ`Ö†Q 6Æ€t;tBçB@Ý)ƒ   h »¦†ªŽ�´ª5e‹( ÃÑ�‘¢L{œQб‚©SahÔÄ% J j`$¤�&&I¨0Ôð�R*™©ä˜FFš2 €jx‚!Ñ6ª~A4Ò“Õ*�L'¤a=@€dˆ�@€ІA¡×ÿŸù{±½ƒ÷ÿŸÛfì­\Wÿ�ý™›Çÿ âm(‰6,V’Ê¡(_ #á¦41¤È5l«®æëj4¥dæÛEÊÆÙfÔËl—+WeËjîí¹¶º2¶5±[v·WjºU¦jl´µÕu¹®'M4¥HÒ•±BA]níÒµÔØÅ¶ék]‘¤å&Ô–ÜÖ®çQµv¢ŠØ±­–jåËtÕ±`µÔÚ�¥Ým™³¸«.ÝmͦE­Ê¹ª-®UÜí¶æµÈ­%E²î-¹¶³c[ –é¹I²néuºËZå¹®E͵Ñ͘›§4–Õ%®ËwvKi nmͨÛ\¶‹W5¹µËF€ÛtJå»YvÊÜÕÍp-®lmhÑ×w]ÓM&ÕÀ5W6m£nj·6fØÛrÖåh¶´–ÈÍktÇ«¦Õ%«†ÔV-§]U%5+›²µ)mÔØÚå\“&ie””®ÛµÒM±A[)k&×5t]Õ¸mtÛr̪M®[nUp�WLZ£T‰µIµº»w"ÕpÔmW+¤ÒÖ¹£t«š±bÔY–ݦ®ºåÝÝÜÅPQcQvi,jÆ×Kjî›­°&ÖfÖÜÇs­Êºš®É t]Õ®š«‰nî¹Îî]twwKªº($"MHXîî&ºÊ¢µÕŠIM›¶9Ûk…n0ÄÛ¥ŒP‚I‚Ù5Í 6Ý*@£lÔ«tÚ"RÛsl³krªì¤v#®¬LÄÚ®›\ŒÀ$¥ nÍm—uW*ºLêZ’âjÍuÚѺcm]®�ÝÕ®³QˆÉƒ­»-[²Ý»£\Ü›�Ž]îw]²k*s‹š¹ËœuÜéµ²`Ê[�jí-UÙµrá¤ÛsrÜ«¦ÚçJÙMY$ÕÝtî§w8"#›´ØÝ›\’»MÙd-vt±hnîl‰¡…Ȉ-iuŮ٪@ÌK!Uw"wKkš“dФ¶6å·uÖÚKj1Z-ΚÆ�k©¶$fÙ+”\îuÒ«–ÜÚHNëµcd±´XÑs¥jšU]-®LµA[w\tÛ\¨ë6®—+¥SºåW*ÜÝM 2ÒÓ:•�9Í\(ØÅRk·wÝ];·wuvÚ™�\ªìªad£F¢i´;­ÍʊIJé°k–MjWu»®Æ ¨ÖÛ]+Wnº±®[–Ûš�Z#PUh¶5™Uͨ±g:äm¢¬jd›UÓ]•‹vVCvî£mt66¸ºîm‚¤4TrŒFѺXº›b£k’h¨*¶B+•n“·qÎå¹¶æ®[•,V W9[š»*-n•ʳM®%£G-»7-«’Z»-Òé­`·.U]If«�Væ¦E´%�in—+D[¬´FÛ3k�‘`¶·5¹¬–²®–æÉ®mImtåíÚ-®˜Ø«­Í&‹jäQµÎ¦uÖÚŠ“f®m7]wm·(­“UÑ5Ël»´[\µÌk†Ü±µÓZ+%´X ›k¥µÂØÑ¶»+2Ú»©wDªæ®×:Îë�–�TÎ2ÕÒÜ«s%¹UÍMµ¶ÖÛ­µ¶ÖÙ¶¶ÚÛ6ÖÛ[o¾Õjµ«ØI $$¿À$€$ TI*’HJ’I@’BI!/³šP§á"YþîC_ìn~•Å%7nNs4IEöœ†ƒ±0(b¬CPsʸ2Ó¾rßv¨DÀ‚®²/4¼ÎºÎ¹S3°e TÅt#bî±¼­Œ6¶‚­u�NÎU±¥Òó²¬ouße‹çG¹AȵáÞ]/³^lÊ»CfbÇzSàì¾xõà¤->y¹ÔD®}±„UiŽA]/£Þ�xX‹;4fp»ÁË=-uç.É¡c™¸Jiò²ƒ¹±ËjV¬ìÌ7uZ !×êÑ¡H‚kr·Ö&Ö=X&ãc"ª¶°ˆÚíÑÁfÐ!‘v×Q37Öh\ö>¹‚¸>ë Žãb¬Þöíß †‚Á nn qŠ„d©aAœ/t�Û¼—Ñbð߯…áÐ~LU÷Iq‘Ø]ÔÞ�tœ½wØßVõ½±¥O"æ%/7L¯Fßlo6�ìÈùJš;ÛÛÍšw†´ŸnîзdzrŒc·FÝ]ÝÝÕSÉ^Vu~5íµ \F¥¼ƒU‹†Œöç]X¬{[¸èVYÓ†dš¹[«ÕλZÚï:×½YT–\Â;jQ¬¢ï»Fð¹ŠqÜÜjåânóÔ¥X\”¼u(MܽgÙÑ/jf`=BÈ&ô§�™g…ÜÅFôvÓ— Í´óÛ·�ÎÍɆ”»Áݘ„YÖ‚¹¼Ÿ¹m�5SÏhzS;ƒh=Þ9uêÎëÊõòõóO,Õöͱ®(Ý–úîV¥™1î§äxu`–fµ‰úµzîíåPÝ»nîÆ3AiY7OO«¡àXìŽuX«Ð»1ñ[ÌÖßMæVǸÊñܬ&¹ÎG#[¸5r’:÷Ô�õw°TAE*´—ÂÊí/—p#%ÞàéÐnÞZÍ´ö.íÜìvq’z– ;jÎ_•GÙ]ã0Ž«ZÞGpàPe)ó¾k-°«q¾bEZïN‚»"ËÌ­jSã•u–´åå�ج«{y“* ½¼Sv…�òûB‚’Ý<°‘~ò|…Õ-NÝïY¼1‡U­Ú¼±VæèíêÅDU²Ë«ÊØNvé⤶)¹FöÏ< –À5âH7¦bb÷È3¼™8·5àÎ’3’ œ½è|jgUšÈAº*ësžV!YÞº*Š åêÑ×wµVa£™�{ŽèºÊg£žnlÇuS–_VÖùÒtSjÇÐ_¨,IëÐúËÞ«/T¹ÝK*§ ËTh'½Æ˜M@zû'NeâUš¾Ýë¥�Íy.<¦­b¥™T]³ÃfayÛÔ»UÛí%ââ {Çnågc¥ÛbûÛ6öÃÕźÃ´•Ækª]½+NØU0‹‹ ΑV1¤Ê·s…¡È´S»8¬aŒ¾­;×À­×sjò³+ŠYtWS¶O’;áf®÷ZÁº‡;Íéšo¶·F`À{„qöwaAàZ�s«kõZÚoN0ÆÖÉy€æÂÄ+ !€ØsNDðfMÕ†Ï] ÓÙvzÛºîw|ݤmݵd­<0:»&ÐÊ(7±¦Dã&÷Võ] ô÷²§,„Ä+G ¼gÇ'^'ÂËñWy§%HyâÜ»Ö;. Šêšî©äG³#=8˜4 »$e=ÉõB Á™k7ŽÛ­È1Þ_Uõ†–ºª¼ ;w½@Ò]êì�Ö:9=²Ü˜ÏV¾K,ö›eÁÓdzfc_ CsÐ[w¢ƒ ŠÜ©Tƒ��ê¼4`(TŒw"|8£Q½¸óMeúø™fvÜë챩]ËÌÕr‹t…nGëé‚élº¿ns ²AatK¬s9¹yVm‚7•ð½–¯0Òªë™]jò»8VŽO:¸N9¸Æmå§ÙíjñÚuµVL]³Ú§¤dt›A ¥Õݻ܀#ÐIPI£–Bu›R⩆ÆnQܾæu�EèØ¼_n쫨%Ý仺¬µ³&ÓÞðæU-&åÊœºÖv¤FæŒY\YÇ£qm1Àé±`ºÉ[`åñåKs.\Z*´Pì¢Õš®2Ê å–U¾*M m!¶ Œ&1¦Ld©¨Â51ÀÉ °1¦FdÌcLÓˆIb „3dÄË(Êf0…4MJ2d&Ê¡5CBA�3 „’À˜‘E Èc`RbŒ”I™ aA$ÒP¦B„ÔBR˜ˆ’6†6&f4M’ÄÒŒ$„ÂH¢‘Jb�ba°FŠ i`‰�¢’™�¦’e 4ŒØÆ4fQcf̆¦A2,cb�›5@) ¤LÈÑc$i шHÑLa"JLÄQ€Se" ¦�¤¡d¡L#h“)‚$Å…0¥�$Ø’eHÑ1!E1�0‰£2R@cY2S&"m’“ JTI’`’iFË!A4Ì„ ±%BMJ “Q‘%��¢RiQM’dØÆƒXL”’B˜2ÆE ¡¡²fˆF�˜4Ò¦%0ÔÃdÑ%&Š4XÐc)ˆ’"P&!¥@˜LÒ 3I”˜¢0�LPdÌTÆA¤ÅÒ+£cHa‰S)¦lÉ0ˆÌÑ‘¡D(ƒ(’i$d”ƒ)$’ƒ0,bD Ì3 ØM2lS&(‚”aH3l”€ËE�a"ˆ€™% "S&2B†Œ!HŒB2”˜€ ˜ ‰b‹�¡…0””Ú4E‰S@PA˜ƒ †5Dbi$5¢¢Á %’@Æ(±X‘³Dc2K$†$1¨(´¦f D²–bSD�¦J4PÒÄX"�R2F"c(´i¡PÐÈ–#&‚¢3„I²†@1™DRa)™˜¢BŒM(¨¡, ¥I‰�ÉBR�2HÁ1"�¥HÌh$&Á†d�(¨T™!I¦É²e@¦™ š#b‹YH±ešBÌØbe cQЉf$©¤ˆI”!`JY’DX¥” )�E‹A’1,€Â2J"‹(†`DQ #4,f ÈŒ¢4ФË% ˆHÐH3R@ &P°¤’hci"e& ¢£1( H4šXS…H¦H)ˆlˆIJJŠLBÄTbD¡l!$Èf™F)03L((Cd‘bIÐQ¡M$–*L…™AŠ`ÆÐÀ`¨,"&RdÒRHD™ÐhȘ¤¤Cfh¤%�¥“bS(ÌKš(°š)¥BRS42¦†XÈÉF6a‘”M”Ä4`‰LP”AŒ¤b4ÐÅc&C$ 2I0„(d”�DÑ!6��0&Ȉ#@S2HF6I‘ ‚`ÔŒØR£$V±% bDÈ"F1EB¦C,¢fEM0’†’E!’¦†™¢P”²ÂdÄQ“(°DYSF(Ì„£d¡“5fb“ $b0 b)ˆ…ƒDRd12@Šd‘‹EI$$,¦I„bL��„†0²Ã3 ‘ DŠHƒ"Šf4PÄÑR›$f(²D a�ÐdÐ%"†d‹,F$¤!&Id6ØbK0´)I Œؤb$XÉc 2D“,̉(Ó#$"BbD1‚‹XÐÊH Œ2m‰•°&Ø�cBVŠ�6ƒh2R±‰1`ÔVˆ-‹Š$Á¬MQF,È¢’ÁŒkL`l–’(¶1hÚ $ Ĥ–’,€hÄR„l’Q’ d$HšHJ¢šE‰Iš,TX‚dƉ”Â4”DˆÌÌ$l`±B•ŠhfÈÈfŒ‚”FÄD† ’l"Ōҙ–Æ”CIK%%TFÅ2" ¡DÌ™ŒÀ‘°hÉ)¢‹QFHÁ"CDËF"l™0Ĥ¨‘E ѲBa !&2FF3)“F1"04‰˜�$ À¢d¢‰˜© ˆ“B ™ ‘D¥–…Zcɉ`6�*6 ˜‘ l¦ÌÒ˜ÔF‘Q@”Ã4k) ¶#B h‘JA´PÆ&�)fe%Š#  ÂiM IˆÂŒKP4‘Œ† 2i¡‹Ç»ÛÜ»ž ™Ø#4*Öí×.Hè÷<åí�~ÍE^8ó$f޵&º}WĆ‹ o"Ø…É´n©•ÙÆKÊ¥¸ͼ¡w*¥Fï¦pܸ7Â!vÒ ÊrŽ�û' >£Ž–×Sâj¢Àõìê¤ï 3®/<ôG•(v+¼g+,u© ‹’ ËÝî<}ñ�Ø&ýRÜÓêZ Þ£-[ÌOlÆtÖ®E¾®¡µÚ/—M@VóÎ…!W²ªÔÑ‹¹Û|w/-»5ÜùÐ-‘=ÚŠ®áå}îdOA0%çUž/C2•˜÷j Éª ¨ŒØ[ÛgˆÅ&1mã²ê…p*.´½¥WmŒËçF÷D]eÝ^-ˆ+¤`U°ív3Dl=Gš®š—T¼¢…àÅ�PÞîƒ�KÙãM*ª†lá³l]<ÛZ4@ÖŠaÁRXLÊk”•í�{{(]c²ðØHhª3¶�Ü£7„ÚŽ"!vVͧ;î žáwy·Öƨ’kŸ·sØÌtv‹ß °TÎË O!�].ø\†'�Э5w^¡‰ˆ1è·}ž=DDF }ÃE»Û[¹æÊë �g ›Õ|C ̈ùí9—reÙßÓ³¶ßbîø(ÍÐIc+x�µRòù«W�¹b!V% �}0´;Fæy9%N·‚Û­6;U`" ©œƒÌì¿sÒV=y…l†a�)PA!¢–7�É—72Àê'’¬°"»'{[cwy¥ô}O«8Þ¬¾A,Ë„Ý`КÁ¡[‡p©(TUí9Â7á*­' äh]ó®Í檺îñ“� J¤ÊõŠt_¹o]�ê²–F®ÊUIƒ«yÌÚ»BôÐeK4ðTÊO!]ª * ³^Ñ à»ì¿>·u7Ö/(_]w’ïM“ �O,8# ðÜkp=®+‡¢¸q[•°fiˆ×RÕb�ÍŒô·X;�*¾õ=Ùr9{‡­¹¶NÈ®v'6qJˆMÍ lde�íMTûüðŸéÿKúOçüò®Sÿó�ßy¯Ì¼­æÚ’ýÖr£%u¢ú2ô%@ÕsÄ3ŠÐI;�`ŒÝÙ™GM¹m“üÓÔÁj­n¹•ã‡Á·ëqYÓÃ,w|ùýní*ˆÞ¡‡“¹ÌïX@—–bVDbLŸêÆZå¡Y¸~iOˆþ¹Ó�¢�71¸‡2ÐáØã‰Þª¹q#æ,ú߯l¬D-´‡I Ñ…FÈ$kÝÁÙ…$3”þ´°ã†ácsæù4·49(7lÛ�Ef«¾œäròã” ¼ðònÍÑd�IXiøÕe.õ¨Ã଀Šp¸&$Äb¦I#‡üÑQì¶þÊž‚Wb8~æŒAÉ“HúŠ Žw0‘Â’[ój W]Ýg¶ÈÎZþ]Em ¹ì¨tú¯?ÿP×ö~�¹¨ƒ3'ÇÄÌÇiÞwŒLŒ–)ÜW¹È“Ãüc.©—‚Õ±1�šu¾7·ŠåàLSRæìk¨‰O³só’õ Q ιâvÂ5‡‘õóŠÄ]o>C· éå?¬ètyEy ŠU¥;ÁaÔ¤;‰$êøþQÑ^¯ãS“9­Ùƒ#áH ‡H¶aˆ\´Y'-LõtV¬Œ—¥a[¹ââü·°¤ƒÊ^i¢O¿MŒY$[^óÔ(Ùã­8ö™ÇDFÖ8 ÄWÎ.=ÑÖ… ÈøoÅ¥7�Üšû“²¹Ú;Ô{õ±vêÞFônH€ÔŽ §¹—œåC?] (‹#“€Œ{ÚãY¡nž<œrA8´™¬¢}�½ xuªÕÃÞÅô«Ñƒæ–�9ú§%Û•À+ÕL%—]¡¯J/š‚åŽ \×.j¾]fJª¶¸¸w,ˆ"¾Sg…îÂ9Êr-¡ÔÄ.©…5«q#‚.é½e¶¦°…=}k6·˜h¢¸:áKs8iË &\ñ˜W¶tÅÆrõ&Å¿R£‚¬€JÉò³"¥èwÈ™åoYsíÜCMó–Ù³Phf�[! %]jgä°;]‚DzÍyéÄW0 àá¾ËaPbG¨š·£DÁжé�n¦d( 1tä‡2ËVGÈܱ);“�™`¿›Ôƒ„Å:£¨â¤B¤RžW14+¨&ÍBºn©”šÿ‰¡çÒëÜ0–ÆÊŽ\º¦EeÙTî^#¸¤UN;:#-#ZoÈX× ±P‰ L–Ñá a)–ÝV’Ýpó`ñ&²ˆòSZ!IÔä¼)YrD¸?nLtEº-œ(A†¦èmÖè+Ñã%ؘ…yÍ(û*½öá8 AA\CÓ†ÖÓðB}kR¥h!êätiH†#×SÆê <Ë—q=ž"ìšËš5µÎЈ!´ ÑhCymÂñ�Ú\󙋬dÆŸ3å1P3¹‹‘R§“²íQg¨�ÐÞT·Îî>ÖfÁ¼íVb Mβ�‘èÿª�öt,�î‰F4Gr‰Ã3ÊJ “ôèo-1ùöê"K¨‹¯U¹C0F>Kç;5§ó5ã{PÞ øôÇ–½Æl±>=,aöU_§.ó“õ Z –?MÀŠ®Yd¡Ÿ»–q‡ŒÜPÉnõWQb¢y‰Ö¤‡L•f¢å}ÒzX²²ˆ€¥¼º•™¨¢Ý,wN£^øÖÖ{ãøl8Ü]n§Yú&V³/²8/õ—hŸÃé>LòçÏ8]«$ZT–Q*�h2b6%YBߌè݆õ–*+“kØh›@Èá72XýÑÏ¥†Ö]×P’ðØËuÛ2^LÐÉôº¸èXb¨ºIL7OˆBÔ²NKieˆ$)ÔWjÿ\®q:‰ÒA–¥ÙD`Éo/1v$Œ�æX_'v�Ìòÿ«3’0ñ£û>þi‹¹<ú&�]‚lÝ[N{"uø?@¯“mrÕž·úí—$ÊìÜÃþ a\¢Â�Òò¢gåÐ<›ÌYÒp…“A\¢7¤ÊD+Ÿ%^�œ’‚ËÉ‹hŸÐà# ssè½Sy¦Ìxz‹Õñóàš }PÊÙv‚Õ„Y­sñûoögÈiŸH\ñP˶ÍO¨“v»ÊÇAÎä¤m@9F1E#†c³š—mš†•¦N{æ}Í�!^®¢ÚãñÈÜ;¸ü ÎiL®Ê{8At—ÛmDC¥kSXÀ@wºAs&Á© ”bE(Uâƒ*�ß\˜ä`¹ðÔÛQuU øwò§€ÉUK*ŽûÊüÂá×·¦i†L’Pd#,DÕ˜ã¼Ó™yÚQ-okqBášžîÆêbA;&ÜÔoêÚ"ó-q¨ªw5.ç—˜Z°Ã´>ŠÕS¡$ØJcF*PöSQíerüòæ³!r±‘^ûyåhÚZ2§È¨§›ÖæîÖ‹½Ë:lT,[1YûÀºùžç8ÃFeY Ë"¦ä6¬©v‘;—ù¥‰m€‰eøüz~«³m1ãÍÓäƒé-ª.ˆ:]—áG]£WÑáõP Êþ ´‘’õÒÃÞ�Uç8’(㤇¸æj¨qúÌ [ø*}õȾàú¶(‘0�íYvÂdµ†QÀ¢¸ª†d‰iƒ0Y AÒ’}@ˆƒXÓ žPæ?0Zò'›Qˆ)ª Öæ˜@Á’(<6Ë„×�’KBgôb F „aÉÆ¼O©ÝÛœf6æ�6€†Y¤€0€�‹I·ç?Á")rÏÙ’e ,´É � †Ú)&›¨€ã„™L AmGë""˜A.ˉñ·µ"$}­’Ò(‚ ‰�b%ñè¦�$0˜©ú¤#¤2"|IÄ-ËpA0ø#R0bmã©ä Ó�Ø 5|]J �LˆN¦Kå0$ÁCzh´‰ A(l4x/,0ÐD)"Ñk$ŠiÙ‡„A'Å.© Ô#Õ„@A‚H(™t dfV À²Å ’Bíb¼LÔÌ8¢0Ç%²4+E Â+„!ƒ 2É(�­Â,„nvಌ¶SIKƒ£@5ä¦] Qùmûè¹ËÆÆè�µÕËû~©¿èX‘²IUôO=8“%•æ\L°È!Éå°³4$"ì°ä…aE7ßFˆ'�¦™€pHmYRe‰$ ÜÄ•ÀèÄÁnSd,(‘A$` *�U±—áeú�›D/ˆ ¢ ˆèL8 @X ‘ÒºêÁ¦� ¦Q„.a’ˆ$‡î Ñ‚œ°‰�K£)a4´Ô—PÂÚIñòQf6Al2ÇkË mBZEIý 3uS&"¡’ ;.4”¨$= ŒŸ‹Kì‚íÙ�aá†(” ¶¦‚m¦B)¸iÃ&H—‚e�³SU5)q ”Iœ&¨†2Â%qh¥„@‚GƒŒ‘ !ŒHÈ™t«ënv†C0³d"g²@'¼¬<8ŠI¥DIÚ]”  ‘©Ë™(#€m¶D œ»/ ,<T] F~„¦?Î}$ ÔÂ%!GÚÄ2" 70ÉMà„ñòÓ ’C$¬%Þ³tà 7áÒK)ãf 0 ‚iIÆÒ@Bµfi �kÀ¯"‚%¬2K©ˆ¤�Æ"J•Mà°�!ãF!’&b0Áv^jL8’ ‚¥¢Y� ƒDÔÃÓBM1RŠ`n …‚©á1¶½-øDƒb±@ Ll°á#RŠˆY b³xÝWàƒ² ¢Ð!Ÿ#" /*p\¦J!" Ma4¢Xm,i¢D¸‚"ID!ÕiP]¶(U¦æ²J¨h2á2$àKFPE&ÈM„Q)¼2Y@36Û8)CCZ’jU$i…N9QÐi`Ël’N DÚtBP£Gd�ÚYB HÄKb¢vÅÓ"±Ô¢H^Má���™B�>-yPDzdò@"©@±fÐÔÈd dIˆD/fd‚œ0S, RTT# ¤ ògÁa)4 Øõ ÀͺP!aÓ 5R ²bAiú!v£ˆø…S�š&ŽXÚÍD” M˜†8n&Ñ�AÉ2š-è!„I ^PÆš@‚Lq¨2+¬ˆB(ã%5dKL5S-ZÇ M4•(yEQ ŽAx“ )BœØäM ¢Û…4Ì2¥Ë™Œ2 ¤@PYÃ!zYp|†h”,¹4F!ô\ž› <`%…«ž¶¨�v„ˆq¨�²ËˆªR¹ÜÒ¶*Ò ´Â4TtÓ AD¦Ä‚¢Àp„�Ì‘-¶PˆxQ/¨š™p¨á�È:îƒ��…�NCB !œ¦XYI¤G¹¹Ž´ìTâœ× C0ž¨D9µr�Õ9‚‚Ðo‚‘@…‚}K^Ú$PD!¯7*i¤üM´ �BÏ‹Età?òÕ.Ûõãe’°ß‰`¡)A ¦F$ÑŒ(påpTÑ –Ä!ˆ–HA†ƒ@¶H%†�`à¤b�»•jy£ikžK8Dfß“EgÏÖòQ{�Umâ¦B1�!ºnZMÁqrE‰H"�–”°eI‘e`‚„Ë/R"J²¨3Ùœ¶� £XÊlé¢K–Z!"°ˆ@°Bh0QÊ )œŸuQYP�I˜Û™ -4åÃðvàQDƒ"Sa²jX" �L¤!ž> §)QËMFFŠÿßü?òþ4?ƒ$ãQ-Ò�ªë±N©`¾žÝ«±6ìʪ——«Ue9våe‡NÏZ]=0yÔJS †gWf;9MUªKo>%^!w ä¹`eowu”±®k±u2²·nŠéóÅÚ±öä±K• ®’е¹µÛ^a ÂÓu¤òÍÒˆ ‡‡:¤nÚãì9ksöf£T�ÚÍRï5;TÞõ2d¹¹Ç-w¿]ñ%˺~¬Áqz®JИãbͦU—Kvr�k-TÕÛ‡“{¦æ=5Á©Ú ƒr=á´ý¹�PbVj÷¾ÝÝÑÒã¯^tXïÖ’|¦„ åÖpp¼9ì{éš´vÔkÅãZ„£ˆržUÝeîmmT•�(Œ©b¹ ½Á{¹Ü´d‚¡:înéC±N꿵m]rÏ|´1ü¯•¥mTªUõåuP;ÁpA‰UºÀ™†¸öÕcEÒ×Îú]gPÔçUÛ6#ÕØjnJ:øoYVÀHCŽ£×v…Öˆ&W¬í;~Yy˜áÀæâ¤�÷J®ŠáJ<« z´ ½£“‹éÚÔ;Ç­ñÕzU£ë/o/6‡9zŒ‹­›ÐèPÍo&®ªK‚ùò„ å·f”ÕÆ¸ÌÊ�Ï™™£!®Ÿ0cø÷2ܬUäÃù—ÑúabÖaŒ:1$Á6„ÛO\Ô4›»ž±»YÚªh7ç¬z®æ£yˆ]U¿nÚÓ*ÃÐ`¯k‰Å^Ò9å[bnÅS¹±œ{f:Ž{]ó»ãc¥å\Ú :ªKº…ùk³½Ù©àJ�j99i©�W£’Q»Ô÷)…^°G"væèA®ÙWŠ�VLå}ì«v‚ž]­ìw|8!Ðïb¬“$°!L3hI1‹0s¾¥ÅNÚÓƒE Ë®Ñhe«­»«`=îᘣÑбôcl�ôå‚ ä^mf{лhŸn* ­+ îÁ¶º‡ ЍûL*µÏVn�†½Ähб2øh0.Ãtm)!a„>Ì«YëÄk ÍÞÞrÅx„®GOnÓ°E¸8á`Ö¹R·8á꾫á|´NïaÉê­ …‡s\‡J/«Dë Eff­¼êºÊÌî¦êI Þ£š±ºÅ™½íVœSÆÁî©yѨ¥24‚q5˜Ð¡®s(X2÷�ö5 #\°e0¸Í·Îï²ýœ}{}Àã3©Õ+LPNÝžÞÁØ/Çg½cwEæì¶ éž1‰± óÅSŒ"‹Þ7/-Rœ¨U�èY¸+%ûq™rÞ«Që­ì¢&ÌÇÛ:É•í&÷z©çt"uŠÒeås®ê™4-ÐGfKÔñ+J'��]™Yº‡‚‡ºÛ¾—žÙUzw‘G©ñ·�eŠöhÃc%oYK²™º9Þw‹-hÜØóv•2 °Â·zÍÝ2ŒËTRQâ£,�}…i,Rà–uÚÇgxñžÎyûµîŽÓØ##]æe޵¾dVæ¼Ø…”V!‡¶±Öõ•ô:ׂ¤Ó›Um…wŒG/½Ô|Ρ—•—uw»Ž™ì{]N«£ÝÀ™V`WK¯vÆõí¹†¯yFÖ,uÉâÛžâñó©VQÁÎ…Ñ/ʪŽ<¹·LSo¤%�|Ú½�Üåz+Çj­V¸Rûžl•:nUž¡�¤@|-·êÌh´\8žWm­¡P�-ðÔ–'u}Yu^à‘»»†÷jÚËK7VŽ1Ýf¨„Õ•&l\)LëÛ›Ù­±Ogeƒ\öÞûf¤,GÀ�©›"×§�]>r½W˵ؙݳ°öºB†²gdà¸_k}˜èöd¶+¦ÝQš=›sNVÖâ'aÉ}¸"¼àÑ¥ 2Ò^ìD$ îv3m,iØ›ê:ŠaðÀ³1[Ë+È/P=Ûg/R±ÓxeÞ7C™ß,R-œîœ¡¼�•ܲêg BŒæªˆ9¬¹ƒ3:ª‹k%W\öΊ�x7Juíñ1C<$Sõ+ê7š™)z,¾•+wy–¤‡tˆ½â’j…0¶ºö8uµÒ ËéX(Ì‘5¦¹Üöv ƒ.@HZ\ytÂC8œÇ�/vÔ×'qâ´¡[sb�(à·hËµŽ«’R&OoµñW1Zo­¬ •籯®ÌŽºÝl 7„T#BÚʺעñH_vÊÑ×¼Ä)_¹ª l}ÓFVhã¾ÆÍ/&ã1k=j÷ÆpÞJµÊ+Ó·z\;¤² ÍÉrA·StÃ,%YrÃîÓé(ñƒ‰Î£.e›BXçš.®­:±›º7!,ä¶Ràz3%ËÔ®^ /x`|Ͳ.š;m3³»�™0QÑrÎྻ««‰½œ,ƒ·î­ì¥Ð¸ø^ž”D£KÞìjµn÷`º;X(mgg伸�˜ª¨æ& ½W^¾>·©Ý<ÍÆ¯7tÎäÑ‚õe§˜îm÷•ÐÚYµ%ø«9·LÐî¦t$.]Ü2ε¹Ù�í¸jzP5ÖÜ[z´I�+*©ñªÙÂÒWXE�îÊÍË¡‚:¬FS¶¶ÈMŽ'¶ Ëë]\s×¶]ò ô¹\,‹ëÐ_•KÒN{˜ �»¾Üî¹iSÚEKl¡´·()sáëÜâŠbDFÝ] ëZOÍêîÜ^+3C�·¸e­K–<&Y¡‡•é[:%{e¥"W€I .èHBTN.Žÿø¦²1!±þ�ð}¥Î?úÌ|b�Ct±ç&”ºÄbfÏcÿ›÷;ÇGŽ18ïh\q嫮ʧZZ²ûaÚËqé:ë¼¹BöÅûêÏã¼ÿõåÕâ¥ÇžËnòd)mJWÚí»šW«?¯¬áËún5-™ï×9yWÐtÓæ>±¯h*ëå�c[¼ä+ÝÍdêçÿk_îö\ Ÿ~þE~Þ·á)±óÚ‹ò^‹ØÃ™§©¯ËøŠø¼wvûEonÒþªºûŠlulþAÏ(ôÏLÛ÷ÝöÔ°.úÜxNÌ{¼Ô3ó¹^·™˜ƒþz\ÂÙN£T$¿pö>/PêÏÉ�”µCÑÉŒ‚Í\ž!÷ÏQÖ©Üà5ãåó%îgwe¾=¯™ì“èo§ÿ ()JP5jêê|¿óÁ�ë%-]y´½›¬;Lû ê�ÆRT/èS‘ŽÍ†¥ç¸t¿¸t-àÚ�32]ÝD?×húñ¬£»ä™´hÉJmb¤ÁÞ4’�}wŸUT¯1¤žP0b³† AmüY¸ŠŸ2-We”ê™n~Û{ghÆv{¤ìäWf­æaßMt\®¦yvö»¿:¨ÿ,ìAÆ’ Ók ½ØŒïÝÑkÝ.D™ò•q|�mÄRÏÏݱ�»ð_/ü÷Ê?Wó�ùß1kz#ÛãNÆu=⛇úƒßëÌßw{èÿ3£JRÛøç]SœÆ:ÔÅÖè�laPòíòà»ü»ü¢ùØh=Òyã1ýNlÁú~6mÓýy·8dßãÆÙ”cLvÈÀ{ÃaÁůkبÜ;Óíû7ºÃ¯seB‘â [ý£!\7vžjÚ2ì²ýÊ>)ºñ"mžý#àNig'�%uÍœù³X Ûm¤ÊµÏìÆMºg,#Ü©ÖKè×Î9·wf1Q¥'áB.ÔQÃxÆ;øwàÙïÅý2>ðÇ5‚I¡/Tç”Õ`¨ç�Õ¢uÅhæ0�ð�»4i¦^¿ £?5m(*‡ò²p$Á <÷¥zPŒ�ÿÐ6@ð$x^!T 2ã «V8 #tA¨»VökÇÍ“Å{{…™/Uùm­µhkÍhEÇo¡ŸÒ˜" ·“I`�ÃÓ‹ MY Ò�º"ƒH:z×ýcl‘gPô[ÝžlµK&�À, !SHV @Jò„„ 6ô‘ßu½0Ê�Ò±­$;Ï““çÜe††ò6!v�Ö0Ó*+4 ) ž§â^(ÐX¹Ñp‘"°¡B<Ží¥Z «nQ'T’’_—3VO¸ÍÈÆï˜R|úZ‘ j¥ˆÂ˜mñ’è ©Tš’0(é .TEßÿ@$„²c.sG.œW×OzE5`j\‚ Y•£þä L¹wZÜØ1á."àX-!ÂÀ©ºªj¼°°¬!ˆÊìDL(J‹sM/;N’ZJÐuÏÅìêRÎfoue™X®Kû‚ÙØ$€aB”pP-`d+beã0¢1›`c¢HI!,*ÿ$x^7˜ðJ§‰¦ñN€™�µkÜD’÷è\†&Östo+Üãuç‚?gñð)ƒÌé�P*SߨٙÅоt39 Â*¡@Š¢3š‚I!-£ˆ1ôÄ{R”¯IÚ´ËI§É%˜�=AÊÔP[2À£E7©66çaBíU¥fŽÌé�î�Å|šÚ..�鸖ÃÌeQFD@¬_4ª�€CPejƒÿ£G Á™óZ6C t¯R QÌR�´¶º Q�£HÕH Ì¢ÙØ2\ª.+ ÍK„ ªb[ ­B�n-+ÿEgIo¶ž|6ÿZ�²‘ùÎÌ‹Eæã¼�×-#•¸—)Ì™¨Èà(¥1@$Ñp·”އ@Pr"åÄ$ *yä£ÜA4ಢBT¦ _ÕHø%t—šÇT]r…K!Öh¡Œ³<˜DéE°¾J€%S"�Ñcþïsþºbm±ƒrÐa¤–j%jm±ðY{y¡ |Ð̃3 wʾ¢QÈÐ&4�d0BFÉ4�ý¶ÚÖÛm~ZÕ­lÛmTÚµª¢ ÎÚŒc¾¤6ëÑ1‹Ýæ1ÿšOºLçÔ{à{akÕhïù÷—÷ù{´/B^œhзˆ/ÀÈgý:¥npã·;òȱٚ×�;°D«7Kã•'š¨tíèñ>R “ÉTœ²±4ýÚT{|q¯?•p»SÇy6TDº¼tß1Aäßâ$¦ ©ëÕ–¼4MÛ§�v&:Ñħ¯½)ØE6üPÃÞ74›tíâÛbvr¼6˜·+ñ¯2Ñú½ëLhœf‹¬ÊEééGU½]Pwq´Vûéé;ØsˆÀB~¡bƒ~uó{‡K²Ê–Ñ«›ßͧuk9¯‹ �“÷ªq�‚ÃcŽ<3¦ x>/ˆkÛÁv�µçÓOKÒ¯s~ÔoÛù–®—óµ8çW»‚{ŸI¼!Þ}ʘ÷á¬Tº_ ¿?Ž<2rˆïÒõ´Ù÷çvêÇ*ÔekÔ_dGù„êðŸaÂ� »\ù»™�´øOÊg¥YFWʽïç׸’òÔ7pÎdßiÖ”�yå«ÛQa ™HEuÒsž±ã‹ÕÏyמ+�¾â´ˆÜ�ÅÅc|÷ß g’LJVM5<ÊÌ;Žt‘éxÊ �DùS”y·Q‹� ßYôêØk÷›ÑÒôZ!þ—®:ñ�KÏs%ïß±º´Î7ËF·%Ç•ã#_g9¦ºÍº·�\#õ¡Þ¶”NÛçìùy(ÊèeÑ (˜DK¹8.¿Ÿ—ÙæÕmf<àl¡÷_90ÇU6c;èéA–’õø**GÚAZ16Y! Khc¡ß Ó’æ™èz˜¤QÍb=¢ik±þýÛÅxtSgÅ¡éj�e"* HäK$Êžî*¢kÂYb fŠ&–Úf ü¨AsÑûFýG2E³ž_‡™HçLR 2#9´”,èàm› 6L4Ï)´šZ  ˆVŽHèÜ\ì!˜‚F#þI $%„3žÏƒ�¿¿æEªK ,®¦GOò¿¹q7ˆBŒÿmkÖT¾ÜMÐéµu ­N€¦…#BÜí bCñ¨HÃD_Ï47•PÀM€†10]„j <[SçYjþ^I£övÚµ…G£ƒ" |ÒÑ@«—•šÒå8 ’_Ä!n5jlZ#r?ôëÅêÕãÍ-”Úú›n¤–mö·i *’”B–“CØÀb -}N4µ¢“HÑœcý{T¼ÑÙ•®c€4Ó™äã¥ÄPªlb�¢ˆ@†!ƒz»Ç‰" ’!Œ¨\e�¤ÐC ,AZ$1¡Ñ¤Ø¡ÛãUµ9<�¼, \mŸx%[&R^©;¶ú–ðÝ#|ñͼÿч5%ú™©£L$é?Ópõ )€8 Ø€‚¡ÌˆÌEŠ4ØÙ*@„a € ºßê_ó±²5Þ áõ_äñ;Žx­ ;y“s é þùé!k…€ÔæS(ƒœ\¸Öp‚e0jé£Ûº]Qô¬Èò„-Ù£òÙ|ÛÙô%{‚„*g ŒÊgsó�±ò€9þ �Ù“�½Ò²Ö3Ô bǸ„$!×¶^ßyÇŸ5ö¦]½"‡o‰ô|ý~g·œø/‹õ}ïòÞ;.¬ñ~±¨èAû?FǾ=†ïóÏ5=]ròjŽ®ý6ÝOg6 K�z�k‰ë�oë2ãNñƒvÆŸÒ5fZåž_¶ŸùÙžý9z/ôè<7ÇŽû6w�ùññ~ã·Ýø¦Þ"êp½s1¼óÝ‘Çß·‹v? úÞéã´Xv�¿/»z�e»;�¬€Û§óòfyOž>‡„jÄkÒÊSáb~ψ‹—�v@a;?F6ñÙÍò¼E÷óïkF¾;¹iSäf;¯�|1þsÙbV¼¼Uáªøïßjϱ›×„�uYyº½rî¼ñ»Äø³¹×Z�_.¶ïß:Æœé)äÂÃ;s¼¤|Õ}–^¶{S”ú7Çó‚Ä"ç)|¾Ü6Pû&?«ûÖ¼÷÷m¥Æ�+ywzc€"¿5nl×à€MJ³„–‘îÕûcxXèw>Ðu¶3  ÅÑIKù=“oE~¹tyvž¨€ÇXœ!´Oñ�;ñ«gÀN6ܧ=·Ï4Ó÷\'‹_s¶ÔèO‡+#OIN>SÝ}ÝÙlÆid'“‹57Éxw˜ÍôË™uçÏhï­»yº5zç³/òŸ6f¡g¿ÝjÎÂÒ ¶íK}”–daÙ-Ýj#õ“`Æ&É®(ÑÂßãÃ;Zöĉ4êgÐäë¼Å5o�öòö»ˆŽÖ×S×Ãñ¨_ò΋íWô0×d¹¼ä_5ssà•ì«íHÍ¥Ìøíq(Q-îùÚÅ[·÷Žý¹ÎeYòÿ‰�.-õ\úo‘¾Þ,¶L…÷–_Aã¾ýÂÔ[¹kŸ>ﳙ˕–„î¶ë®Ô×–²‘.¢ãHÔçë`°e¯] :³ÚÚP«ä¿_ë£6ô¿°·�Á# DF’ÌžL@´<öQÛmù£T¿FÛP­sÂAÕ #Í-‹%˜lp àZØ€‡@ZÁ’óq tEh,‰³Ÿx*�•Hð�Œù 3Tp BŸAüµªE:ÌËF�¤Âæß~:Í ‚Ü8NÖ”d€ßÜ6cвH[í^”Æyýâ˜ë=zÓ&݈yÚšT’m>æ‡7Ï<¤–Ò ea®K*WŠ QBb”Ci]o LúÄ0‡OÔõÇòzsëZêC¡çi(K¯òŠûT¯�ož¥Ž�©å'C£MŒM9!£EQHÀ•3È(“;6ÒBEcB_w£¤Å £:çžQvŽ "ÆÄ7 äÇ¥±Ç`H=à1žÎ¤Ô1V¨.dňzfü’HIUó®¬ÉèÔ0pÈ£Zjãòø×�_WT¶?AµŒMrEȇZ¦›cM• ކ*ßÄRŒvA06æ¦Ú5Ÿ¥|üêQ™þÞÊ<úsñH©“œEðWѬ·\¬!Cp%Ô蓲²]ƒ�¨PÓ(Pºe“¨dNä:Žb"ÇhM1·€óI $$¸½šÔ\€(×1O'ü�©ï¬E‰ëûÑQg£ý$ošpæ¶,�mÒ’Z`¦ÔM��ª7ÁV2¨p×h" –Šsc2QóP% ¯S¨Š„Bd$©…×n¦|Cäo,hõĦÁ‚$Ëy¢Àm#·f‰Õ"¤ðJ7± "(‰cq~%ù™vØÚÀ°�݄ݎÕuw+2E%ìE"©*\ÕÄ)5ftÁBÙ `eK´d°0…B•”y¬šf …Å[ í��Œ´ J ˆ$U$$�’äàB<‘Ÿ)¿¾ªÁ*€p«ö^µ‡iA…e$ª  eBά!§…%MKVù-d˜ÇÀö5´ª0aˆš˜c³]Oê@ÒneŽhŒ6аe@BC-7ÂÕX2VjËÚ”#m *�\l—ó=`Kù¯ªII릧Yáùzz<ÿ´íëçïs#³æœÍüEüŸœÖY–=ð`ÚðÜŒ#YaÛ-ã祫¥Øp ,v¶8Sߦ;èךhýå£F†÷{÷|èM-ÑE9_–ý{zþÛ´4÷]gÁyïÙºaþJxîžyÛÞÍe/o¡ö�¾OY±Þ�ÄH¬öüÙŽ†‘`yá°ŸWÙżÃÊ'�Ùò؈3Ù0f¿ZïŽðÍgÇOµ>ôÖ9¹w§Q¬‰RŒ<ßöö+V´Iþˆ£Ç¡fïÁ5Ê�‰gcõ,× c_iw.aîCOž4—k`¬¶±ËCßM×4±Ÿ¦ýŸ­­ à<Í1DÏSè6Œ�"ô‚OÇyÃÕ©)Lë©Ó°ò‰Å.ÿS¯x4\`7½v¯: x=ýÑ3Q Ñ߸Îeø�Û¤{xWÎMäÓø^ `´öUv_Ì©E‚¾;üóî=F‘î͵±½¼ÍMüé|-m w‡WÇØ ogò·ø5‡5�ÅF�wj¾ÂO^Ò¤}†?ÛÁ¼w#û��=J"©«&Ôè”ç9‹i1b4j-éSÞ˜e3œ«S°c$´»M¶66Ø™ìP©¼ÏG­T0ÒÀ4B•a9*Xt *‹PŸ\'àu8Û ñBÓ½ë_”Vô£ÉáÏ»rBîq Ã�”p¢m -ÅdVDà�ú.Pæ )X/ ÑQ^�¬eIúÕÊ–xhv&ÖdTˆÊØqY4iÙ¶0¹E%A„é*Rm\¹t��ÕM³ÄRfH„ùu*£ Ž¿«dÝ<2rv¢�”ÌäÌÅ1¦`<@¬îôHÁ€0•ïD …DË a(MÊ¢¢W½ò_ûXy×*Mãk|8°cÎñ°mÝA@— ZBF 66P’7É+gZúí•'=²V²ÄEcï^�Ç2QÓ_ °Û\j¬t)¸UƒèE óÃ:0–¨%�3@£“¢UøþP¾CyÒŠCYÍöGHþ’ûw—·dè'wà xÖÜÛEønçkpþßŠ×Øpê^\|½wÞ„¹j·|íëä°ùPObx[$î\ž<Æ:|Úô¡6~~¯Ããö}Ùöͧ‚fY]‘ŒjóÔu2¸ØÏÓ<לz¾q-ˆõÝnõÄ—ë‰ï\Ь÷fIùãuW ãÆ›s°ßQzÐá³;úY?BõïÇ‹ð~[¤Ql½ÝS{]† GÅtãô4³¸×-–7õ&¬¸_œ¬ /.uÖµ|÷€ñ¸³ÓÔ&[.Xçèw[ë}}Š« ³¯ 2nF>°oÅñUþɳ~f°»3žþnüÃÖ/2�ôšÙ2ÛÐVZ1ú�òÂÅ_#ÔÏÅ™Ûî„Ýì«.‰Pk!Ï´Óªö‡n�V.8ôSml½¬)+iIyëÏ•é¬ËëêâÅyvDÑ‹0pSÔdX×½ö´emž{î6d’è¬}üu( ‡ÀuÊlô ˆ…t¨(®bBë®Ñ&™6±ï7)‰�R�gFU¥ò-lÓdUB¦Í¨Whæ6(PHË\ŒÆ‹ &PÎüké0ïI¥æ˜±õjElNºAo:¿Q»¸þ~¹œ1Á ö™Þ?Œû‹9³íhÒ6PU±XR T[„PåjMã’™ ½ƒÔàÑÔ!ö¬£ ÇQíÂÎV,Ûã´âÓ~lYÑ�ež�‘ Ç" �½ˆ’D"UÈH©í,�ײ„,˜ˆhg‰»Ó4vò’iý¶ðe½²Ë–ÆzJ¥±r†•f–ŒáD|¼”Õ5�jRÁ ªÒ75Mó|sßE.n°§üÀ¦�¡'¹¼cÜÔ{ ‘[×ÍœàTT]ªÔì)0¥rV„Ф”DP "–m�ƒc•B V€é!¤Ú®óµ¸è@õ§í)Ï­©úü¸_�¨W"Î-DsSmi/ªå�¡ Û]uɨ,Ûf)ÕdC²Q£*¶™IÁ5¡Š*P¸0B”À ˜ ˆ8*”�#I�„…„f’HI]$$�’Õà>óHD¥á¯A�<Ò{Ñ£ÜUBLbaÙ@�@b£_d1°w—A¸9Üd{—@ËšŒ2IQƒ+a—U‡*n‰ •céSnä.Âiuxp Z‘FÆ™*ê쬵d§¨)¾)Ïyç‡þq7K6ßÇáÑï/¬íáZvË»|s/iÛ¾E{ç~Ú`,÷¶´¿’H;öÛÃt¢/éG* _äŵñ·/ö~gNjŽÜéË~ÚiË�±Ù�áþ¶[{Ó®Ûñg™E§¼“ù5ëZþS”? ëeAûýžÐ÷OèãB«þxÓ焇ƒÏ+ïšyã´×Ï9û¨�xëXñï�µ£;'^1iøtI×õÞâz#O´>‹ªÞY&ü&ûnɺvù.œ{I|ë«õGÇÄ»mß·�ä»×wöÓ¤ù¶8e YuE·Kê½¶<ávõBñzxdÜ&iÁwìc¿­¹¿ÁІƒ×žÛ·Ja<³,陵ù�®4·~�kÔ ¸)ã‡ÓÓ½pí|ù—XÁ·½œ4Á_â÷œŸpÓsûiý¹•ØðììÒÜ·¯ÖC?£çE‚ÐÊÓê^·®»ÒO澩 ú¯=Æ;ô6l Ä— Ö(�@}öÕ�m$æÒžÇ¢=" ´+:‰<ôγ¼»ë¥õ²;Ö9™C|³X/Óm-Ù÷7Ò½föçYßհ휎.ÓÞns‘²kÏË9ó/™ �fªþ{fÒ¿Øe= ºò~ÿAóóž“wð3·'~ߤ^jiåNåÐY˽Í~–$Zܵ«qbþ¼E1|Þ>ü£#Hµfõ¦Ú„iN=Úm±¹IûGñ[½Ã°Æ"Ý¡ÄJlB§&~J…¨Ó`§75FI!$„—c2�6ºµ .á`שRØ#ÓÛ°%•<È(�)hÓJ%FÔvšƒ)¤ Ÿ0ÓP’´”«™ÿ SFf3TD¦ ‰¤*ÐBðP¦3h±˜ˆKâÊ z_m‡\—Ihÿbÿ=x–›xe£Æ�õÕ5½e¤CX¹—Ȥ†x¦Ÿ+I§kð\byÍã6¬ßç,j�|rµT£ voÙop)L“Iƺe¡n�¬ÅÚÇ´Fv½P�aÒËí|lÇ­¡«¾zùr\)UÑ�Ã|SªaŸúßM4ï¥g´ßò܆µÂ"}3jBa£o ‡lj¼[�*’hßî�û-'Ï]µuß*橸Ò~uìï˜Ö‰â£XZ»eU*C¾¾šÛ|’ç_ií0W£Xáy·Ó~7J“2Þ¯¬�?�|C$¿¥ßÛY«8ñÃi­q»Ê ÷jN§ýD·ß-´á²iº¥·uèçlo�N*»øú†<ó÷÷`L½—™‹éÔ7çÊ{j=xŸÈw$¨“}øÝ¥Œun<¯W�8¯Žþ"ÙR>ÊH\Ž=:Ø{Zýjåº^"�žõ~!„öCyƒLÆ0x�«jèÇÁÓûêV—¥î{6ÈèñÈõ\7ÄÔGI±°Á�~ ÿ{gØ¥|ƒÔ?�Ó×Ç`=�úßÜüïµg÷ÜãŒéöÊÍ#å�ªŸ<Û·}<í9Íá&6Ÿ7x~Žæ^ú>_»OÞñ…]Øiñ!â:� °êßQÓ*j;Õtq^mÎÕ{bŸ 9ãû]/£½Kï1©#÷é‚}~Œ)¼ ãíí"5ö4�÷ªàë 57ífÅñÝQЀ¸¼ðÛéãtOyÖÙ«+зnµ¹v“]ï¶ÌÉ€Fò>>A~]6Ï÷¯“yí�ýOÇpÆ®]#ý×.lLO¼LA×dýx€õÅ;�£}ø…Ú›M›ñ•=ÛoÜùê´ž½¹”;=eßš¢³žLy”ÊY¿˜È‡¤ãO9‰:vªº}m\ºéHØ£ÕÙôB8’üº T^õîp�î^'†Á\>B”Žz}ZøÀ¸$/ ÷*oÍyÏùã;QžØ÷¥d!�†D ³öH%Ö: é¨J1³†‡ŒZ°Ä]ãëþFq‘�0ádŒ?ù W`‰fÄÆ®+ÑX`5# ˜{¡xôÌùÛ-››gþj×퇓œ5�®nî^’ÎŽ8†ÛDA!ƒØLkNjäš Xi6¬äŠ’YÀPW£Ø”*Jæ&Q Æ+”3óâeÌSi/ÆÞA}˜éÓi±ÄBŠ ‰ 3å=¤¡Töj<ÃjD¥¼¸1-¢Úçî�gZåœç�äjþ(9áV~Ø\eàùm¶y´†“¸vDJY‚îT�’BKÀ$’ôØÊÀ`5-Âdð2‰TÚ,0^@ÅJBv% �9€ ,›P¡�‰a5H¢”ˆ%vtL(eД‘™BÒ…hCË* 0IÐ4ªÁd!p˜$ӪʕR‚übRýGÀa1?pP46!¹M¢UÚm:ÍM¯‹Í×ò^ËâU|&”õž¼öó]&ö»Æ‰”¦«»6‘BACCdE¦dJ Ð›GÈÒ€ez—Q9øŽÞ<~Çœë¯ô¾N®¶ßóÅ9é½!½b^|ìQ%rÏO—»,‰O÷NºbsïÊÕ.ß4''yÇÅN æÅ¿VÈýgÍe�ÇI+`…{uh@Vfg¾™|§ëWnΤEXÞ5×'IAöíòòðï#zâ$s\]פNl$(^8õ‡÷\úÃ=­oe9]¸ J2®l¢1'ûµ½ü£P3Úêà¦>iv.ÍNçuÝkÏj»soÒì^ôç{ã÷†Ïyi,m 7›×–~Ù�Ù±'mèÌì5” ÚËíáÛO›×-þ.ËÕ;Zå‘Cã†ì²ñ¡pºë\úߘÎü|ò~‰å:À|$!ïM3 tí=¾NlgÃ…ˆ³çAøf‡Ãxù›pÈž½ ÝvpÁƒÔ)+¨ðëÆ[3ìàpÞêÎõNˆ.ÃÚxN�=^^ˆý+ôë›÷~¼õ¼RØ´a“‡cAlxð¶;¹Š;fOa•ÝÚóç×~­Ù¸Úïç,Ra®Ó!Ý}²£ ƺ�;Ÿâ|!]a\¡Ï!OLe~<÷ó·¿ÝÛ_Ëý<«—„ÝŠÛ̃ȼwG,vÏ >ðùûGçxF¯Qùú†ÂñpçÜñ¿¨ÙØí¿Ï~a²Ê5*ýÕ;úíAp˃¥‚Ël¶éÃdÆxw?©ÜüyÛ™óÉF¨í3ãÌ4*Æ:qÛ—ÍøÜ'yø笈ù‡rÝ<õeÛeOŽÔ„—÷F—ì/>9gqïïGÜá÷òM5¦|m¼p㢽ì½v²÷–¾ï¾°õJãö(‹–Î×cð¦ûhž‹‡—ÕÙѺ¦Á_d9 FTŽw›Ÿ²³»ø´™geâ ëç«¢¶îÖ‚4-+¬Ò`µY©/¬ÞiŒz˜A@åQÓ/Ef ‰Ü¨×£uÃ6RH�g  Ò5¥çÅóúºØFˆEÞ„ßìP™§ +-é[ŠÐ±P-º©G'r¼ÀÈÇêvG¼y­ w ƒ$¸{­jy,šJv'Êàâí 'È)q…É pÙA]®7RÈ**±GÃá‚:m*—8&°ø0ÙA€Áy6®oò˜¨Óô1a 1�"Iǘ•+ǘ]»ÿ>¾Oþ~ÿoq˜³§2{Û8ÅÞëĪ®ÌŒjIÐl \š³`6 …®Ú¿0ÞC“JÖpÜkŠÜ´V)ihRª’04�¡‚.š X¬ %·|l°ã&½&+Ú µýô v6^\Ð[úƒÛ3r…}™ ¸…C.eªZŸN’x‘º>ÙùØtô¡‚Ì×LcîD�¬¹/É’'~AcEòŸÓÁ¹£Q,æÜ'LÄ‹ÑQ¶ßUš<%™\6ÆÃí%sÝ�†”^D#;µƒéÀ3x¬ˆ®^}£i#Y ÛγEЬWé4XcµËtÙ%Tàá PžP¨ŽÇ…Ä�r:/Ò!n¾üü®7ð„Žãfih–YM1šR€Ø1�1ƒ¡‰#«ŽâV;d´÷H*@« þ¬óÉ;|‡ SÁlhRjj�ÛÞKìÞáV+-PšaA  Á�“!0ibCH>ý= ÞÝzmåç%2ç›X˜Ëã.-º×Ú!‚fxeð¾Í>Ïã¯/ޝ…:ßÉzV㟿Ž3®®þ&wûÑø:ž|qnýmãíô[:7~ú÷l9í<'Ým×5«º†ÿ]ÛqÚ/zø�JŸW²z�c÷#î³JÙØó¦öDÕÈÆ¾;ÞÏ.{Kܳ“ˆ¥ŽÙw>Y³6¬dÿg¯Rg³®ÒJú×ÏÚûÏ�üZPâ“-w€þt˜¶}/gZq­ªúaÖ¿¸¯:3ÃwÝx×aÇ´ØR.…7øWÍ}Ëžudç"í¶Ì´œèÖ�sìU猜l×û¶¶mœç•\¹fµËƨ’øî±ò¥¥ÓußîŒF÷›¶/¦mr-剈..ãònî˜÷7¢ѧ݈ÐfÜ“˜Ó:s†º'õqbkßÏI§ÞÆNÙ’Š<ò�ƒJ;Ã>í×/Ó]p–£·bîѲcIa²åÿ½?Ö‹*âóCf+Óš"ïº5Ü/n§'y­»ÒÑm×ÜGíwtÝÚL4Ûž:-Çæc•ùòör.ò°³YšêÒtÝë»C3 ³ÜM�ÑÄ ‰8wF�ª¥0†ãÔ«moëÚwÔTkVi­u­<<0”U·DžQê–¯hÖ�mÇ»ŸíðqÅ2ž7ëRë´6_UI:曘ç1±Å%‹D[†h~í~oUº)ôí¤o*|ÚnFÝ=g­­¶î^úwo0÷¿N¤Ækªôf^ÅèV�ïÚ┺þW–ù«j-ì†ð§7”{kGí°óÄ,O7*Pæ´�i†‚¬täúÕ¤§‰"‹éè:낇ìYtÄà§Ä}3ó?7\o¬bÅrÚuuo Þåp––³lÞ‡œžÞåsE ]#.¼E/_Æÿ,)¹žÜæ@©©Åâ�4�YR®YÚE‹ÃgX)÷·I�Ý% uÔG4F+e@KJ$)0îV|T¨² DA3,J>l‡Ô�šš#Ê ts9Gä»ÕM"¦D‹Ñª¦$7U? #$f®3›TY›ÍÆFªPjÁ�ÀÜ“ÈÈjÕI@Rà”!•M��¡°l!]X/SÑé®?X®¹‘%uß*¦+@õ¥®RêÆ¡ 2þx$¯”‡±g~ÿÍrþÙú¸ õþ ¤±­H’-3ù®£:(¤/?0ã‘_ä€.%(ÉÇD ¼ˆ>+Œ¸û’}8—þ+è¢Ô[—¶.µø-Û°(U¿ÜQ‚—¿56Ê9OÓ¦ #49I�ÚѼǵiç.…w½‹P±~gÚü’#—„`i×,6àCDD8ˆŠŠ÷@ o±cË[S¾v´zÚ7dÈz$Jù# ªãHYð5VN'IPÔ†‹�¿á*ÊrdÑv›Pb¿ž(éVóƒÖiœž¿‡ýÜô—ô°�{!NX˜,’Kp¾ö7Mô"XÄ›éM¯‹$„’^elyu1È ‰©-(er.›;¿Sª@/  Y i\�pkuµK¤�½=V$"D-†’Sæ��§ÚKÌ?{zx4ÒO.~¹ÎËÕǽy¤þh}þG±ñ¯8õéV�Ê&œá<íÀì,-•žÚ�|x=~öœvç}4­žÉ m¨‹=á;~·ï>Ÿ½ÜGÏšWÂá×Zóvµ:xª°‹öíJÔþøñVÎçPZ3J¿>iãO¼úéo÷›.š_–Șÿ]tnÁT½3ž»>‡•SÏYJušæ/·š2¶àwŠó^ìÕ5òVH³®çZ[ïÔGƒð!]¶Ón'§ß-• é׿¦›uë}â|+å5§ÄžÊ1÷“ØÐé¿—5�Lé÷"¦ºøŽ—_îÿ[{ÉŠ1}4Þ£äspÚ‹ÜàßkîÁߟÓ!_ºªAƒ_U2ñ_¡Ù¢à¼é”WV/ótï«Î™_9¡/އ¯jêÞgúжÅ;QQ¾¼Ó¿vU¦ûÄß üèʼn +„²üÖ £ ®¹ZÏ~¢nÐ1o`xó…ú×_ ÚÜ~ÌÇmWC.û¼¶›'I`m%âéÚ)hA|c´£wí-™&gÙ+›•ÑË[ˆ^û˜naÒÎß äÇ›ð�‡vmkÖ²E|„bª´þEúnÆ‹<Õ–D²­›«Ò’0KX}Œ4Ia�}+HÃð¬ $l—žk9Ì«»æÃŒQáÕŸ!µ7C¿2_@û³Ô¼]¼GAàkHgMâÛõé�ƒëF}N*"=g²ð[ú-ïµ(0À‡ãG'Ó'ù9u\óõãó´û�‡†qúú×»åïlÉÂÿºý'IÝÁR3ÝaÙž5Òùfò£ùg×[BOPÎ÷ÕŸóƒÐb†T–�ýùËß±áú^u‚�vûÅ©5ü’öÞ~ðU’êCQX¤S_äÛ£©åuaÐ"#Þ‚ìÓm£tŒË2Å[pÆÆu‚FÚ0XDeñÇ ©.Ò‰b¿–¸¡|µ¿lì¬Ö2éJvÄ~¯óŸ® 3È…F†R3d;\✠8ÌýÕÄ3© PÒ4Tã#Mrˆß:»Cj¿Ä/©ÌPiw(8C®�ãH$„½A©ƒ`ÁI oPÃá§‚yÁ’A@5‘ZD1.ªPÄ‚„À –¤ À0;þ3?´'øae~ ‹AG¹—‰‹¦ˆç`R d E‘M%ÑBá³MDºZ¬séŠ�­P1ý+ö¯ÉCÀCzñÄIn-ãÜ`+ýŒHŽO+¤i‹ áRŽ…H A `Y!ÚÕ¾ÏC/ßž/¤Gž08´N6½#)¨Ù£«Ê4‡°—|÷,PÑ15€°Ðy�,Ê"š†ŽD{!&Áh‚4 Pîî±NÔ¦¹îVøñ|¿½t­/ŠŠÓó:ÞûˆºHܰ6¹óU EÛ£ì.é$"  ÷ØÓ(ÍõŽhR�üÆA�â,kEëÂÞÓ=P‰‘Á¬ P´CC º C�H!—@Ä*C¹Óò…JΜ}Ò·¼Ú1Ú<§@ ûÅD•ŸhFW‹Ä�@ÑÆ±�(Ú­"£HLIð|ˆm~ÕO2&A2Òzh 4�¬€©ˆa¸D´HÂ7@,�À*ša;V!²‚ ÛR,XHßQ(®d‚³šB�<„²›%˜wöH=‘“À0´�·Ù/Óiy{’Z¦�–…’@•Xº¹ýŸàò82€3J%@ä"ˆiÔLHRºëkì—eº I $$½ÒBI /4�’BJP H‘$�—�’HI1$�” ‚eŠÌ­�­4¶©™S5h­©#kElY€AZ•–ʘÛJf�Ú™µ¨´mlhÛFµ‰JÊkDZÑ´¤ZKTkQ¶ØÚŠÑµF¢¬Ê£ZŠÆÖJ¤¶ÅF³D¬TlÓU¢Ú¤Ö¢µ™­ŠÕ%Zжɵ±¶Ú-¨¬›Q¶Ñm¤¶“mbÑ�F­²UcVD¦›E´VÅUmE‹j6eµcZJÑ�jÅm²ÊªM±Z�µ¥Km3Z-ªM¶™m -$¥¬Ò£h¡(ÆÛ´E Ù¦ÒjÌfØi2D¶Ø5ˆÖj¥›Z’­)Z(­E¶BͬÍ[ÀXÚÑ –Õ4Ԗصd(ÚɶlˆÕE¬Ô˜ m*[J›Išj)‘¶¢­IT¥¥6Û,¶±`ŠÛ`�¶¢�E ѶŴQµ&­–ZÊZ-F¶Å±mŠ¥&E±¤ª‹j’±¶¬’V¨ÕTRm�lZ�ZÃ#6©#-Y2m­¢²–³5F¬VÔU±¶¨�¨µÛ2Ù4[kcj“V5FÆÖ¤«&JØ«cV̶6Öŵ�­%[VƶƱjM“[%j#VÆ�¬j¬šijfª¢Å¬‚I%IbÕ¥m­_m_ÖÛ $$¾µëéógXìëúà·�¯KùÈÜ3ßë�ç‰þ E 3µÇç1øåeȸÏF97þc¼¡Dd £”i¾]‹YÅÿ훾¦Š'<™(¤Ù2€­kÒ£Úä—†™”¨ tk/¸e¼`Ô‰Wö†Öfšnµ1»÷ÏS¹×yÖ#œ«’G‘Yݶ –?7·t©f‰Ï`Üî×­µËñÏ¼Š»í��–ÿÐ!%•[6¶Û6ÚÉ­jú~åß«§y°‚­$ô,øg¯ößÊá¬:0'Ë/çÅ}Zü>xK‘ðˆB LS§ßbrsˆPˆqOïý%YÍj€ R€ûåv"ˆi¸Œ£ÅÄ€ùß¿_­¿Ðè|&?kı’ѳ§ò§·P^gÖšCaÙÒÐâ{¦P�¾ e˜’ñðóâ² ô}?’Q�ÌuE б õýÌÇÓ²X�¥DÓäA® ž†å5H|´�pV…ûI,œI4Þßú šeŽzñùE=�Z ´b£ƒY²™â5fÄXRÑ»ç³w&®Z÷�î½á±Q[~ë½j1rÞ–|´\B&Rë„]>v§"–s´�$‘iáäzÎùì¦ÊÌ#WÊϧ7Þ{ñŸ­§Ç|û�ÝÂßÎc^Ä·Ë„bÙ\%ù„5tŒÉêøÏ‚˜ÄY�ÈI¤×Dfõ8>OS8‹™wm`ÝÅVEÝߤ#ZûͯíGsˆžÈñƒùkÛ`­ŒàG.–zS;±�mÛNà³·¾õ¨Yè9�³x,‘rÞêO*£L˜œO«tx©ƒš›o–vÏ©Ný32Ï¥ÿ:³“šuÊj¥ @q/þ->ó>÷‹5k„ˆ±k„¸õÓ•T‚ï`>­Äý;ú¡Ì\%ûA¨0–ævK'�]¬¸÷—½'"œßW(k µæ2�ÏÏ>çÌá±&�­àSÕü/ᆭäX- ¨�û§çßjFñQ�ýNyÑJCQ&ѱôŠ|ÅЪZ©NòæŒòÿNÚá¯4×|Ó¶Pü\‹ô×Ê/î¾€ø<ƒVíp%—%þ9î´èәГH¤ï5Ý‘²¶F7R¦r…×êQxâ#”m•ðösÂ0x1¬px¯¨­„÷C¬oœAc^áªé6>y Œˆ£YC±Mø» SÔ�J2žè˜"­öo®¡ç’�g9 ó×àõ„íq;—©èHò甌 >ÒŽÛdmp“é{póš3TqæÅÞ°O!·w»_—v:¢HgŒnk]æÞª1"c`¼ÿIoˆ-ð\ œ'G!á^#,¼Õ×±)æ'bWšt}1{kÓ�úsìtó|ºtÅÄ5A å‡ yÆ­eÎ6Ë].�g·H]Üé«�ΰƒ­¨„-©†ßÁ"Eÿ0G#ÓY-ÝsN øˆö­êô†o‘¬¼„±©J\8€Bp7µ ØÙkdœòÜÀFx>ƒ>$¹ê§­!à­v�½bèÅ:îc 2}Ö£ 72z h o><ﻺÝ�Y.–Œöœ8•áÏ9w¹Ú*Z/»Á9 ñç÷w¾Dùîã~¸À[Ñ•ÏÎÒSèµsÀÛ௚Mà%½�½Øg¨¶àè›ÅxÆï©šÏôëKî¡qA®°øC„Nv@Z)©÷Þ«¿JüøL ß)iÐ?³ç;7‰T.Tiü¹äoïFáºê™Ò…l§}8óý½O+t�±«!�uŒ ƒ€Ã&‘,V¼Ä1m~)VÑûbìïm”v¬j:sÛ!%ØÃß™†bYÌë:`ÂOÝ9¦š˜°C]Œ67Èðdb*x )ŒøÛÜ~ßSÆó ÞôÛã~Ž©0õ©0}>Ö0úæ·+¼4mƒ36dçYƒ±ç'’*Ì÷wókÌë! cÕ�kÃX3Ù%VyhÏÀ¤üŒ~§ÀÈ{ûi¿î ±�½¾9'CH¾2‡#ò!<ê¶PÏ—û\…r­�mý©®°é[ûJ—+X}¿þô…aΈ÷[ø\k^Ú¹²p|VÀ=•äK솤ÔñpÉmÀÑ  ñ,î¦� ÆsK¹ç±�ñ×À×ÞˆXl­¢É`%öw§SÅØ*.Zä0 Ç9pžú-YrV‰¥Ý~˜cö&³íÂ¥gY_13Ⱥ²è·à÷˜��^´j¢Oinó­ Ôº\N0CYD¢ôë�pøUÙ£qm[UÚ³²´!Úÿ_½><~ÁßøÎ½:Ã+«ohÄTaR_ûà¼ë‹�ðÛÃ1æzª“rKßÛÕÃÚ\*u¥ý¬`æDÈ’±:…‰]kܾÔMtÀ˸ëÞ àfÜ£qæ6ÜdýÇ´·¹µóÖýe–âo1Ìï‚2EwßPoͶ3¥é&Ìt<Æ¡¬ö¹YÜž‡  üù€Åk©:Á|wHHS  mÿmXäÚ–ÞIïDÛÿ_Ù^'�IƒC4éó0ýÐÈN·/¤år3 ÁEAMŽ÷mC ÷æ†qA¦h°¶A`® 1�Üêå` ò€¹ùî™xÏÔ Á!L;\h¶{åc:Åg‡é¡wtÛmTV$Áí!ãΊ.BøÄ(|w`|=ê7žèÄ c}èw­·†Á%.öÛ0‹:|YSd±{µ´ÁU²(…¦cà­�««Øõ&‹îþ6Poϸ”³^…o/ä¤&ÇoÛ[Ö~¨·8Óµ1¬ä²¢ÂNwp{Ê6 v]0XùSYæ·Ëé,¦x.“Ìem�]…Ÿ1’¾£Özõ_/z !ù“òfº…G€z£ô÷¥Ñ°8[ƒ˜ÊC�gÅ{¤ÅKGý½W¢v`mMИÊN†’ÖLÝèxø zíLw)MëÃIab×l_˜~¿<~Ï;m‹>äõÁ´è‡Ÿ�Ö(—<{äÛ½ä؈ÃÌÒ� Pu<@Ó~¦¤µìy†ßPjƒxKèbSÁˆö½ÜsØó on..›óº¦ÊSØl@šx#0ž>&O 5V÷^ O$7ª�äü)àîÁ™sœÁ)Ü<²XE¬?ÞÊ<Æ<¿S PX[JøÓƒ´ Ö¢¯�)—™Æ´žÖ5­_Êߨ1ËüÐx@xuPÌ®1eqMÀ+º tF¨j\ð9¬Ö¼™Uñ7ãzÛ¢æún>5Û<�9$�’ÊËŽ›¬¨;Ž8» pЀ«UÍÈøPj^Eê㎠@q«Û �WD¹Z*ù½=Œ„«øcáåâäÌ‚ÉATÇ<ˆ“ág·ÇLü6�ƒûîÏ=Ç’f§WSãïÖ ¿½ÎÔáÉ€›`†§÷5ÊdùT%ÜÒ,DUÝ¿®ö¢½ð€Ô æó… ¡zê¥f1K{j,iÈ\•ç\½ÑƒŸl'¾yÕó+F‰ Dé}ÑßÚ7­<L…ïA˜÷�ç¯D[öɧ+ðž-½¼!Ó“Á† pÇ„Æáºîo›ÿÕLJ¢E13Ú‰™p[”5x*w ·S'^ý9Ÿ.yÏLˆÁ�ÆþZ�xÇTÆ–³~l¶õqƒ÷`aOo�n×1J¨ã}ó‡ÛæÍðþ}¤àî.9ÞÛWž—µë³µ÷zÒ&çåoù$$ ÿü�Goø÷÷ýŸ¹¯Ñõ"�^µøbGðAô}cÁÞ~eñN®Ÿé�?­ÖˆÖ‡G�Ü}eíµx/›NÛÉ ¶Tû�Ip’þùóEÿIè娓ÏúöF@–é—m£sz¡hýÿÄTä¥+}²^-ðÅAE©‡½¡—×i>°Û�g’åwKV—"Ÿ§o_#ÍÖœ”ý¤Q”õÿו|´IUÍ4ßFV~�2È]±Üîg.®ð^áh–s·ç„M ·YÍô&Ð;–¼f“Îñu¢•³ë®ö¾_:ñ–O¿f¼[¶•4!xÔ×W!^åèÊ’Ž‡�0lN¯E04Ælúf®|5Û×�^7Y 3fõ]Ý÷VÚÕ÷VÚÔÖ¶µª[m­›km„—¾¼Ëüû züíâ­�ÔYk- a¹C`È7çüóÊ-—þH‹k穞ƒMã!4˜ÖÃýpÌ¿ÓÞŽÂïõ¾¾ºKþ·’>:ýDCo¦ ªG¢BLôÑz_X· y,-öõÿ7ä};ïáÿ/Ïûåÿ<;¦5h¯ҫܾöhD½"Œ¦fT?±útõ2úËþéÁ·ÄR¿LÓÐI×Ô^È4_T]Öþöêñ½â`kf§ƒ‹˜ý}€éï ƒa-ì¨vTO]ÿó,ëLhåOîšPk˜,AÏ+¿÷®Ï+'÷²æJÔ@&N#Eí „õ€ìQ¡ã¦íÏ;zK7„Ò¡—>gQ_žÉ’ÜeÞ7Û¼áÝ «§úcÓÊÓ÷Y72tŒš„i\Î%Èödl³1°‰�þ�âÞ‡,ÐÉfÎ!YàC¯O«n0TÆY¤ãyƒ&È”Y÷�  QèBX¯4vø~²F¹)Û-»B®N!‰+z"ÌÆHdÊ [>F �ÇìNÔªˆŠnÝÞŠŒÎ“ˆÂé®3Öc~6?IˆÀÅ-ªýÞó˜¹ ñ®~8R }ï¼W+ÝÃL�5¬€¥¬Æ›ˆÅü¶š÷Á׋qœŘ}œ3“yî�³y­M¤*§G„„‚¼5)ö½öçѯ‚¨ûWΧÛY~ï—Øøè¡±A�ô)ƳÁ­*>÷#$0>l`òû3—΀†Þ¯•Oz&š ¤YB¢ÞFÓ—Íï›á,êÀH!`E`ÐPXð&ðŸrÈ gÀ,Vn–†­Ï øà¯ÇP¼?m²”<>ôǹ¼€F;³·¢6Aýk{ZØØ�—8IZL*ì^AŒÂ·ÛAó¥½;¯L±ÝE£–ì°/­^ jâlìb˜tíÈQMÒÀsÄ£V ÿ¬M´÷b $4]{1„VØ/ݰ ½ñë°‚>>Ís…ôo.ŸŠå—?Þ�ÌïÞ[‚SÙZ�èÄèÁù°Å²•´]Ó¥wÁ]^¦j2hÇš³4ù=Hå-0—´ºùœâ—nwšÌòø&‡H? ó¸›6¸—ôуínCV)çÙ¾ƒéy�qìX²úÆUÃàü” (v‘šˆUljFÂë”�nªXÄ4ÎóÔBï±2¢=Cï΋ڌ–Æ€XÊ _X¿ð˜êì9ò8`a`àÞ0ž?ìùHzA̯±pdã`ø\Zá/qd†°·9ÅØ si%æÅÓ l[¹‡'Mݳ¾ŒâYÐ÷) ˜¥]ËÝ.v“Ý`�C5¢ºÆÛê屑2e±�Cc�¢«Xv,âAd$4uY "†  Û_$ë+|_û ±ò'¾DØp>J^þ¹G2sÂòéqüø]Ÿü°ôÚ·²ÿ-w}" î+c¤>-)ÆY¥F‘k^k÷¢F‡a·ÄÛfÏ’‘ûÍß#ë�wæQìsÒ‹6É}]'ViöV½ã!FSêÝL›…÷ ¬oB£¯™0ÑÌø"8/<á‚7µ��SÈ)ð˜w›ð•'·B'L.9¶qŒÐyîDÃ8Ï·‡Ö—øå]¶Ry’):M[…�d` õ ÷‡¢ÔûÆè qPÇM‹ÌyÀ×Õ†�›>˜<‰ x`Ð÷çê$Ø¢£¹¿«VÇ\ö?PŠ= !ñZä•‹£{O'aŠšù�6C%¿NÇ&k•°¸…�F=bç�~Æt�™„[�ƒ—ÀLhçÖ/vrC^1øæ]8&ðÓÅ€D\Í?|ò€`${ôú®;–ö…†>äùhO]DïèíùYÝÒ–Dü°†1î�ÇNå“ô(ÁŸº’É0ëúGû¼~᪸C j&ˆuDŽ™™P¢"rŽEÖ–µg+‡„Æ&Ex˜kºPUÐ9¨•–… È*gù~¯Í¤6<`!ø¡j¾ßïЊEk€E¶Â¤G¨?´ÕÇ�Ô!qýð[ÃÝÏídÔô*C#K;Hi (]Òï�gÄ㯣TšÌcaS VtllJ@nÒîƃ„kÕ¥ÜXœÃlìêá³}ŽRÐþ�é2ªÈÊ ^rŃV�uÅAÿn[óÖ´e éº++¼‘ï¼iõ;œÛTƒI âÐÅÆ ÛÙ&Ãuão%árý·‹±H.XcB$1Yέ‚ŰýÏÜ-š ^ÃeníG?ׄPTdUb¿¢äÐ6†î«+k?÷F}/V·žŸ§øð§áp„Šœ³A±k ãÀ`tÎÌ 8€Btß—·1éK”G\ÝA|†€ÚY&lÑ ™HBºi¸Zë’ð#O¥g~¯p§.‹þ:g_ÄCÙóZ…¢ÔȨa€A:žU¬ZË#õ¤x0± ŒBâ)3‘Qvn0-:×WWÐCXi-Ù}H GMls]†®-•ö2á£ÈÀ7Áˆád¶Lûþ"þø]Qý‹FqÝ‘} èfÌ"ú´s•QÅöãˆÙ %í ÍÜDâåÚ¸{‘ÞûrXíkÈ÷cÑÌ�£‚ˆ‚¡€x÷ñ40ùÑû|ú¾¢Zع7Oh,:”à”eñ*Ä·›-ûï…ÅÇvã\‘ßS¥ÎBuL_3q�­{Âk¡‰Iîáò v9ívhë…²áÑu›ÃºhÑÃ<ëGäïCß HÔkSŒÆl`µêb9è¸T¾gÜl…ç: gÔÅ/.Âm[£Õuå�€ÊŠF•àÄ �éìeòcÇ«á|÷@Ê)Ùv“ÈÏu®g[ƒÇ×g<œ�ïâ´ ‚±l­‘žX¸º=�žx¶°õȇ¡ý¾F˜>�´‰’M/Ç¡–GEr'V±VÜã<êH›‚Ä´„íñÕÃßl×.Þ(ŠZù7”Ã.šÿ�+â¼'ŽFª âÓ(=l,œ 0œ)»ïj0.±ø±‘·ÐBCT„Y\ñ¤ÜØ4W߃ÒóìéZíØ-‡ºÚö�4Ë‚Om›ìã1mãäü?´ß¯± fÆ�¦,Šò˜»¡ l5Tfí#ž¢Ö½§>‚Lù…°ÿ Æèxñ}4¢;?£š¼Í‚ ‚3÷‘,ŠØ(/‹ÐEƒK-"IÛ š¿–Èá�pe½… ˜ßªÞú�Í` t§xµr´/” A�/ôâòVù*OßNd,¹¡ö ¾oýÞædé°ƒ;eç•,1¹o—æ$Òù.Dyî†ÿÀ5ÈLÕTζ[cçÛO­^õ•Éý3N—œtæ¥ÎÙ�—Õýþà=-‡½>ùöÓV-Ÿx•¦ÜÒÙŒf³mk1ˆ]Xž€ˆH¥t¨~¹µ¤[F%-ò�•§ž#^ÃÎÖ Åý´MÆ£@f÷¹P‹¿6txËÝ< ’­q80;¨è<{¨¸?fã×ÏšñfOü6½Ž¡aÇÇr†Ýâ(F{…ÉQÆ¥# 80N”ᛸ§ïÐÞ'ýDX&1� ‡=¹ÿ=‘ƒb,¡ˆN®’º–Tõ^ÜúÒ‡]?Õš÷¹©Ñ2¾?˜ÿ~}nÈ®‘×�0~ÛKF_Ú¯h ¶ªÊÍ£L«/‹×*I5ò±§t’öùùBúÿR8˜Ò¥Œ—_ÆGóÒ_މ èrT9@%íÛhòúö­ú»_3à€Ÿ¿Ë}V\É—Ç“7@p’šG?ÂûO­ý*÷ŸìYÚÃ¥qãÖ¿ Bí—ú®Ž^]ŠÒÓ–q{6Ñ‚›VjÅÚŠóüÁo)„p)È#(p…_9¿ªåX[:"¥Òsl1ä…µÞ�†{BEkÖõu?`h“Ù ß½ödZí#�T§xô#�÷CŒßád³[¸Ï•Þ^÷Ž_‡{…|:UvYwöé¸ `\H¤¹)¦›ˆj}÷~^IN˜³y8œdyžÄ…1�„‘’šØ8ÙßK㊠Qè')H‹àzìPÞxÇb6l�½”q-l’[h'Àº_”¸½W;¿<¦Ô—[| %GI<_)sÿÏóéJò„7qŽ&» Ä@»_Göó£¾rÒ”ŸËoÄp¥®óK-¦®ì6Ç’.èÌl gœ±mž÷,:X(BeQUؾîÛØÒ1®2tn“a¯„{Nø _8!¸CgPwðy©~™¿|²œºaµ{¯-»†‰_@޽¨;)_xï´éŒtÚ»ã^*t’ºG“á,ÚZZ.ÁµÃlGQ­YÙ�ª4 â†sÂÜÎIg†s–­’Ž>m8”Mv™ê}®°,�¤.Õý¡�k¬¶¹Ì',z8vtë °ýÙî39ºÐAÉA;÷*¶Ár¶íÔX{Ö3�Èðz °[Á…ãp_ ž°kPV°¹ƒñëŽ6èCÕzx`Ì!Ì 9#‚72×h#ˆéc F.½oÝKš9ï† <Ûßfç7ZÑUØ–f�=øŒ) ™cXxÀÿ ìkÈ*"!DÖ÷H„~_Kʵ¶×ó°=µÁ�¿ñi †ñxÚp[’áË,ésa^\½mzÐàí¶P¤ñƒXé¢Çàèp eý¹©{·ˆÓÙp xP^‚bèqÀ�3`ki�ŒJÙ´DmÕðô¬rzɱãKÎìj¶ÅEãæ³¡ã7¾˜Ä¾ó O!AXS¿ÄF¼Ò+p�CtM ´èp $õ'¨0égrÜVâ3\k²‘¶è –vF· ÔV¢Q}kè�hVý²%à`›Ö²Òh1ö E!n{«¤¬=¿wÅ;—¶0I¨ô¶l<Œ¶¥¥ã9k¹”$K“ÃUfî»óÌÊc²6/”ún¯ÒÞÍ´aÓ þ{b{ŸÝ®êy]ûÌyå�Çݰü¯ }ˆ¸ ) ñ¨�îY "PÙ`És%vk‹L}²')y#OO‹Œ”®Œ}¸ÇãË ùUµB±e°SZšSXŒÒ†+žüQJô~ó‡·­?1{‹AY ˆ1•¹vgÇ­¬¾jrJÍ…<>7¼õõœr÷É ’h^:Psšñ1Ëö¯‚#,Ù—d„LBa:ؽ³ zì”:ך¤ÅX›ñÒùÌ“Ä'8DTØÄ’®Òœtx�+FRŠ×3ŒÓÅ�‹­]Ö°wêehüÜú¼†‹ þü« †÷–‹ÞÕÆW= À²3‚®›..Á†8ÀüZ†«;i¸+9–2ZkJˆXºÅ2G¦¨!‡QnB›–b’Ù]®¯«—Æ_Èql÷2¯Gr^¤ã·G)Lh�ÖtÞÂ͇6süfD–ñ \Mëìg—@°…aD4Vt¶RÇÓ’~µ‘vyﻃ>ÿ‡Ž#: lŠ%V?<«^¨j›5 ß‘DäŸX7šñ¾·†s£��@¯Ü´d‚VȽ]ôŽ@„9ƒ}ÏÍD*´W_×?³ŒC)oº\ÏŸPõsxÎÒȃ«�À¼%ɦ“Â<Õõ® Æ5Ï~u&6"Ô7zªs.ZÇy½‚¾IC Q_Ùù´ª>?‚ aëìuŸìG!é2B—¢w‘óë)¹É�±½ ï—�s»÷ÁÝÿg’ÉR´0.çe<¸Ž‰´ `{ãLn�þÍ€ @¬YÎûü® \£MÂÙw 26›ApÂPŒY81ÕùžÄK+Ü·Ø6×¹·–ôs£~úgúј˜Ãu—‰o�—ÇìF*s:ûÐÎçª_3>ާÀpŒd;~~Æ£ö~Ågƒ(VˆVOIuœÇ@dîn|džþë²î›1×£ÐìLcLŠ«ºkfº³¯]³V¯} 7tF1СÇ~±«á1¶P” [¾ÙzÐ>—ë·�դ߱äf rß¾�ß<õÄÌåÒ×':ìîI!%À£(> ³�yƱ¼kÎØ<PÒ%í÷í§HGë äŠG ®nÚý<­ŒÛÑ:Êõ¬a¬ÿ*Dß:u÷Ù<[!¢?lt|5°)gë�u�·«°¯{œ…+æà3`¤¾Ý׉¹:÷èÔÝ4y®–tDÌ:½øùé²þè^ä#d¥’®{ç#CÓ}ñ>ú4­­>½Î(²úõºÔÅðÆUG+͆þÆÇÇyûnßbÃ$Üà¿88°±`´�1Ì�r¡ƒICÊóP/˜c<À!Ò€ÁÄ�!À¼ý_~OËœxKÛ{Ú�~ç>!Ó߃T�ã¸å¿c¸¼Ü_Õ ×Ñã²cscÞÏ{díW掣-ë%ƒÿ�ïçòwzolfF}>m Ôúų.9íèMñ3sÌ&uýP+Cã;cóám|ÏH”´è#×Åtðæhc—zóC+e8b,<Õõæý&È9E‹F·R¹/*-Á�Ž òápb²Kßœ[O†5²´˜Ðе!�R¾™:¾q1ŒXƆÅ £2 õf³‰–›°‰08@ !€Ø}wÛyå�'Ë‚$XÅñäà£Ë[3V CF ƒjG.ñÄehÕ¨bm[¡ɒ¬€DNg]K:;§ž/=å[˰Nð!Ý‚ñ†ß`O§aŒ\­:ßpU‹�#_¦žÝÜw#ql9è¬Î.Ðï²Ý‰¹S˽úÒÌd™†²€Eâç·mOi¹Ä¼ ÂY/0²€`þGbã 5µ Ý’ÎŒ)lïSvhÑ#¦±n�¿Øm, ×TU‚`êxõ ¡¼ü» ÿ¾ü–/ˆl¹»]Åe�Šg!+›ÎkBošÚc9mNŠó­¶³Ëi¶Øëäÿ•çÂ4hë¬í^ïQ îðÕ¿°ÔËu}L<’ìþhøºª¨/rÂÌÍÉÊa¾ùê«¶—Ëlm\övIxKF�£Ä½aZ �¸vÛ,?i?ˆ›$<æ?Ïx™aÞ5žž µØ 騬ç kb‡…ËïDHkLe«Æ’ã%ç�ÿ0$ð�,’I±ÛQ£<žßÌùMÇÙŒ-«zï*è}VyȾ;_np­-æ<Öß WOÆÆµ9DÕsU�´6¦ø0……„9I^“\ÚåED:NZ «<…áV^Ždò«\~&¯Ò‹öé÷ˆóWUÁÀdÞʎм"sb>¸RÉÆFv|EMom²¹e ªrk¸˜ë\¢÷$!Ž· ñÌ�ø| .D‹—ÓG "Á„Û¬A3/wvõ•½æ[u‘î=ÄjMó…ɶ^ì»ë³÷�5@؇!Ú%—sƒÈ¾Ùç^ËeÙ¦W“HjÏ*èP¥(d].ÊOa6/Ý.W—C¥m+ìË�EÔh×uµÞ).«¾ßiq±›ãtmœVï+¶ˆ”\i¸ª"Õt�“a®µŒfûTuˆ*ßÜ!:Äs7†Àç†9*ò„:kÇÿi½îe®‹§º/pI›éîtþø¹h¾{ÁUœìäÙ3©g wŒ™¶„\m$CÎsRÅÉ„ÅÎZ©UÞ°®Óµ¨%�mS:Ôóy"nLÎß L£Yi®]p²ØÊš²s |ÆR®¨X‰ÂaQò23úé³ÃVqT÷´ºàÈAÔ=L2ð'nZE)’5µÙÓ¥ÖZn�Œ{’n&Bm¶Ó!ŒÓËe´ñ“eeÉ_qƒrÛ#Þ\êÔí‰í7 \¼§(£mÞÕ°Ý*h=/%sŽpîúÚž:� ]³|gJ„N�|!çn#•‡<ó‰ª|šœ¸‰%Lß�äÜ^pŠ1XiÑ,–rªJz–Ò6®êë¶dÙK*¶£:�C>Jj0�)zÞŠJó|à³ÝVžŸ,uhˆ©†M'pÙÆÒ"pG¬];´»o—E½êŽ[YÅ–[/zMÊâ[7h@‹u5c}ÊBÛh}½(s#�Ž×v1ÛáL�îmÝÇ\þ¾ï„Æ’ë«æS-´ç“™™8T4ûÖKsšîë“a¢q¤/–᦯õdpüræ|”ÃV~²øÈcoýÈHã…÷Ûìüòy¤"ðŒQ )� ;5*Ùð‚Ÿ‹Ø�åMø�„ùÿæ›;ŽQgÕÖÄØ‡DMù„Ô^¦..Zé]hœÈp¼ew+tï£ßH uk«ø“¦zÌl$ønýK±y!N×µÛ˸`úнÓKUAÁ©ƒžáÒØ*‹†€×Î|Ýcxꯗ¥îÔu1½œHÎ$Á¥ �Ð×ù©°9¿¹œúnÉ‚ óê`î:ôüÇ—°Y|vÙÈÚ kÈ¿Žˆ ˆ¨ÕÏÍêŽÐÛï'ÛG·ÀÕì=K‰²¦‚¯h˜VÈ ÷ 'À´º ‹[$BMÖæ?±ŒØ£vE±Q ïÔ`‹�æöòçq×�iè-ûïÚ1Ò‘·DŒŒCk�«´ t1¿4¬@Vó€À"²�Ç·4[3¶zóe-{t¬MÅÉJËîe$-ÊÝõ™õ“C&JöŸPa-Ei 9Iç[Òbbòe$q¢%+ç)�Ê^§Œž�ÞÀµz;šQѧ¬ˆ´À‰Byì:a¾Ý5XΆAC¾½kß³Ãסž‚öëöz‹¾ik`Ã�,‘‹å­—ŸÖÔóhªŒi±³Y;¹š/S`°¯Ö·/⟽ò®„8þ=ù<½Ë* Þúë‹ÆöÙ>΋`œƒ×ïCqsò~(ùô—ÓcŽë ­åäp­¡ç‹pxlÜÁx§íSp‹À�ŸCè°}1 WŠ3íÿ»iéšÃÂåÂA¿Ä˜Ø–:}ÌIÇ†Íææ< hÆÚ8ךR1“&'t3�ŒÉO»XÁö/>K³º�ÂÚmo»Ó×îZÏô£ ÆšR{„¸8Æ/ÞW9ÀÝ* ÎÜ€} ñŽ&‡!(iq¼âñ‰á„¥<Ú{[·NäYK�Ú9(;6ΛmšºŠÓ¶íCt;ñ÷à*g¢„ƒ¿á9'c�0$†Ôu:Ù‡�÷d¬G¸aáBzš-,—¬Ùá\HÂÙØêoH7Ëãb†xÖÄMóv§š0dá/‘AÎVI /+Û hÓNÔ4H»â Ùµà®ÍNº, ¸G�©¥¶‡\\¥¿*âUÁ7d>pƒ­T»\R«€®®8F귛ơ5wë�‡JÖ3MEý!Ïë~Â3Þ4Ä^ª÷¯ï]ÈÁÔ-©Í½ðq�²%íúÁw’Ü k@™õû=å]"ï¢3¬éç)#Z¬}�8r£{Zélª;Ñ}>uºè"ñÌó;‹eßx Œ iº«ç5å¡3¼\’’ã…r2’_Øz§­è«™S�Ü'i‚T�°£$ØþË鿼Í0ßÛóYÝ”ÝH >{o}ò<¾S�.~¦rÑ:PXÛ,–rE;^qˆC¸î5I¹;�“¸YÒN‘×Ï,וQá÷ÍŽË&;›ªÎÔc‚Ù‰ÙsF. ¹ÝU#xÒmu�mùÉŸ"\X7.{J)Šä²ÐË‘,Š�ð-ï'8BÕ]ÉúiY 8ÝuEö¿qÝk$CAQ®™˜¾õ¿Ä¸$?ÞàÇ?®ú€€µ4£Î$øŸkòx,bôà668O›lï;õaD†-òÆÃ C¹ÿü<%ÆÈzÃ|]áÂåô?�U|†!ñŽd<™ !4oi’KTµ$Ƭe^¼ß‹Á_Ý_ €û|ßAƒ<¥…�"ùæ67[]€]Ýð±ßÈý&€Z„]B·¯Ê&c¯£ë±>¨� r—÷T°b÷æüF�Io«ÅRÎïj´Ç(ZÏrSfü¥ª<âÙ¡âÖÎÖ kd½MBƒ·næÍáLvZ.×YI#{qÒ+¥ª_é»öÿ2W¬ýƒ¶Ï_õ5§Ä`(ï ÿ Ù½ÒO’‰öQñ òäýštu ~»‡Ò5w€$ˆè^ÐëÏ\{÷…XÍ~-ûúþ?4-� ÓÚÄCÕ€¦ð_ß ìÞö.HwÛ°~ÄÂчV¨7. ù˨—Ñßæ»*ÿ½O—8¢‡Ò(0-Î&L‹ô™äSüá&¸ÍÍU¾ªßˆöa<ñzgþé«D[k¾&§8t©$,)UÔ4ïÙt].(ǃ‹…¬³º‘ç?k�ä£>Ö|9qv2’ðÜaMøû§ëšµNxÖs>òÚBÊp¥B+ErÙJLDi€îà9XÃå(¢–g�$³yÚø^E¤’KJ‡ CA.£év€w'Ó…ª_ZÀF¡E*;bzôƒBU;“E×eRáï}"4ܰ>~Î…ÖtwàG0à!^/t%*GLvòFšS :·àfù;³xƒnçL%[Å/D¹›YHB9 wát ±To¾kN¯½‹ÄJP@lo›NÁò|+œñ†íÄàëR,d5l…2�“‰Ä)4!d¿AÜ„¹¹’÷vÒ§ÖPV›EÆÆsy¹2žƒy­·$w[ÍÒýIôc.ξõQgG ¢¦i‡v]FÙG*¦eŽMt�1¢æx궸 Jx̓Ýð±�7.Éó5Cœ :M}Ÿc=„¬,óo�mN•®O{÷Ö€ Ñ™o7žµ JQúôöófÍ®EE…¯SœÐ¨ñôU1 ~xøµ" ¿ ³‡ò²8(&\$È6�ˆ¦fÖætdDwßM•dö5u {g@‡=‹P‘=ðÂdÐíh·‰¯ <ô/ž‡ÛA)æu�RG¸âM“ éx€œÛßv=ÏS7Ú ‚ÐGhØØsÓg¼ èŽÕê#äõËEÊö[�Öþ6X)÷•qé‹Ty”çš»\ú�®žŒZÚÅ>+?·)1�†,·ß£ýÍñ „ FÞº׳!¢˜ +S*¡ 3Xa½„÷‡­r¸VPhÌó�}¿¶222ŽŽ� ózÝhrw§ƒt¤06bzœNŒm2P‹&+ÕŸL_�H+g?sz!ÊØÖü{ù…›WûW¢ð›]QÄ›;{».»í­�Z—–�qçBc�åý�o!X-ÐPNº’ï@ä!„/`z'�åà�?g¤#Éë ç#"ëpã<^ÓŸfÜý)sî»Ú|q`E’°bN€”<LnàwŒÎ’`FfîL 1¢¡kúé�ëö� g̹ñ!©×Uó™l¦"Y)(¹áÔ{ç#~ÕTÓw�n;%Á}WL¦¼A¨ïÖ‰÷89g¯l$€Û<>§³ó¸'õ»%öî§Û‰òÆ5‘Ü| *v+=ÂÀ¶‹>w Y7­‚¶Õ×bàï×ÈJ4 'ÛîÄ9ñJæœÝoáý½÷Õð„RyÖ PØ%ÞS÷ƒ”òÁB�CÛ aÞq A`𠉼-H‡®yÄz(ˆŽÔÌ�Nˆa8OçÜüfL‡"®¾e-k•=ÄÑë�eïo’ Ä|WŽ}Œ†ËŒ�kÑúö=‘¡˜Á›A+`{Ý¿w `©«¾âs‹b@ Z¡ºÂ³‚t±`ÞõŸ¤q<\‚^ݱaí'5¹¦â§ H¥8̾GL@ 5}ö`�žÁ`±ß+"v7¸Ai’´pÁ‹à¼Uî$ö?õ¸‹jsö½>Øùï}ЬÖû½áT&8餱³d™±‡)œÕJ¥õ®--ô‘7boù_)ޤ-î¼½²62;û,¦¶@å¤×ÓŠÞùŸ¦„O§-EϳYøXÌ ínÍÄÈýßœiÌ4èi“1Ï+ Æý¿"9Uàž÷œ¾×±˜QÙðý‹?x<<Â^çº\{%}¨&áìåVóOÃÁPÒ‹Ÿ‚S [Ïm Â<ΊîÃ4øÅå£�2¸M\ã äš$Ä8\Ð*RS�µ^ ëÝLØij«"–ÓÀÏ®º`+Ò-vì˜h¬=\2zZOå:Ó0�±aÊÔÂ/@h͘ýžÆ‰’‚=–u7–M𯾰§Áál7¢ÆÒÄÜ×j„E½]›�ß÷«�Yûß/õïE¾ï¹[ní�Xö¿·¯ë ç½;p±Xˆ¡�à:W�s‹­·£ f„X¬¬>¼ï_¹ù[ÖE÷Gê©-~yÀø‘ñ%²‚-D¾˜Êñå ¤ƒæñ•4¾—{) :ì�FHÿŽüx/X6"Ó&?Örų~"%à$üøûã‰÷×goûÙ}�ülè`À¶~¹éû£žöÞ�V)vé�éh“l#OVD*yLU3º@(Lã2 ‚:z”$hc@ÿ=‘ÿÝ­šu½¼GÐmÃÛÍ\£MM�¯Ö�¨§½‘O˜¯\‚!Mç¾®ýËÑ«b÷gï¿íøˆsØV�’b濺þDžË/ãO:üò°�9Ë&-Ø<Úè°á•ÁT�§ô�M Òí9œ()Xÿœ‘qnÂFÁS ßK‘ÌCçþúÜ!3óþ–ËMí–Õ?í¾û›ènf|%4Ö¬ç:9ß�¼¸¬7÷”ô䨬EÙË·>~¿Ø÷ÑŽæö{Ñm”Ú LÞ@0¶nšöæPÉYÈ‚k{…mnoÄF˜ÅŸ’ûŠ4/«Þ^80�«í³¶c˜Î×íû­:·îé¤Ò»MØdšÈ®[ôÇ»ÃHßû±…'Ör FØ,æ¨|æF]yqå[fG]ùŽ”,GqCûVúþe¾¿S&œ¿ùÃ�hÂd-¸Ïð‘ˆÈœ0L:N¤Ov1�Ö=Ç¡xýîçÜo­¿8.÷nê ìyÛy­Àò©ù�lÆ\¿'4{È1ÆõÒ§UÀµjÂâÔÙnÈ*^rX\T ŸyúªMß6Ö:rÚ=G9±­�Ýø^NçN•ã|æn6´ ƒ[UÍG·)˜¡~ÖÂ#ÁÏDX¢@óÓEf69(²dh‚&„!@$YŒ‡AÅÕ7EÁŽz%í‹ò*£»Ta‚–†ÓÊi0Ëþ(Äç¡B±äÆSÅ»¼òLMFöyã{IXåî÷>â1‰Ág¾�"ƒ×-¿©_ Y,‚¦Çâ2àØx…ÆÇmöÀGáG!-‘ËÀÆ‚nŒP­^ùm¢å‚ZÉ€qÀ²ƒÄlm‡¢¬õ{ñEG=!�òC| ¢¤0î¨&FRçYî[˜àÓ6$åìÓsk/™Uúö8ƒÆ“]Êñ©ÏÁÒ¢Pð³˜TÉ1øõ¹|RcØ]‚Áq‘ÆÇ»y‡è,H÷Î�Uóž ¹e¯ï˜çUvêëæÒ D%,åéC$öe“rtÙ_0m�zJÚ2ç]/‘Uɾ/Ö;]¡/îõ>?tB°]^/ ô½ç[@£²éÒ½LsdX qZÎ=zÖ²zŽÅÚ®œc±v8éÀh7ï­Y G8TJÁ&çÒ.å$,[[¬ ñhÔØ–îΆ8Øhr€Žc/â_°“Zi–1þÎ8V¥æ8Á=ù>n{r¢I‰ð´zûÇl 4®1„ˆÅ3Yȉ¼ÐúuPlåo3¼Íy¾sœ$^_£Îkîâù¶Ab0ŲQÁ‘ërÜÕRŸçâLÉç‘?1Á8í{¦L°ˆï~Ö‡!½Í‚]g÷-%kDcåV1º½˜Ûëy²ív¼"̯%è3;Á³3gNñ£2aK:PíÞòªÑ^H6i7¸š– œ4Úî3£*ÄU‡v–ï$øž’ó¥út½Æ~.|: ¾�“WK`ˆÔº1|ózæGnŽöBæÑHY)îFL1³¼§Šn@Ká–|µËJYì6Ï´H¨ù|õ��©+6�úAj¸Õ�Ðk–�†›Wz»²Ž¬4ÚÚó�6xù’bK¸óqØÖ?Á—Þ‘Æ&8–‡nEñ俾wi+çThªgîÌ}6ì²ðÐyuà/9Œs²1%�r·<.ò@£YÕÂ\g>ùu×ä]@éi½Þ:«Ï:þ7•Ò.Z(‡�½ö}Z[F5J65 �rjm´{\�ÖJ²å^b‹¯BÐñw˜ŒŠ›õ´V‰|Šu­‚²EQfê)!N²»œê<\�[�K@ä½_*3=Â'*؇«ÇžsEbøû�Wd[ÓËüEãùŸº–=QÝg擺%±HûU#*/¢ú=àc)�ÝÿXò/�±´ç÷ýöÅíõ�6TJ`¥kk†êW�œh¶&OøÆ‹Ãäôó·Ê¯î›^Ú˜÷YÑúžWÜ %¨ô¯…£u€iŽ7ˆŠp©¸˜‡¦dåÿ[km­·þÖ­µm¦µjÓmmµ¶bI!&’HIv­ôÏœø¾ÙðÝ[¡¶W½ùy+Ä[Ï®<òo´—÷‰âp)§|�Ü;y­£ïzoN yÏ6.71€PÇ‹,77uéÖ êæà*ß]>�ápEôF?r‹|òcËä»íj• å=±$�H_ŸØQ¬f*ÿdÕbœðf€¸l¸ãêš®ØÌ²ö9ºUÞµDúf2X¤ÕË0 ëºâ‰Å‘‚�ÁùËßyèÌ£ä‚61ƒß—¢›èoã T3}nÿ^1š;{n×¹÷‹»ü2æaH})©«¡‹µûX²¶Én*Î:í2víü«óQ�<÷3ôe(¿äq¾>{öê�Õ‹¼m?@üJK9±yÔEµ›—ã�×ð�ÌWo³¨s¶Ç�Þ@ë¸ÿêÊŸ�•îµ§âë ïØøÃˆão1�€EˆqŽa·îˆ'è³VG/?ÀÉåmwÊë!‚—™çÇÏ$gWNÚ_b�w�Ê!™’Ù¹¥�Øx9*ƶ%�_¹0 ¤Ègs�¥d0{׊·+‘b÷ÐW-4_Rã¶35]`ó–"3TÐì±Ð%Lê¶}åá=l¡ÁžNôfCZ¤¾%'Íûª®ñáBØ)K¹A¬>¯C€�•[’:÷ªÌ¾d’ú*ÁàA?[ �âÇþ;Azå±í\›1¤à{¹ø„šS_"Ø+6ßÄÂ:è¯ „ƒeʵ¼µtß{„|VåG_|m(L“‹½™"ê;)˜óïGÔ`\¾+l…�›ÔÝJs›ñq˜+zÇ�YK¡¿•Mn2“^¤- /˜^¢ª„—Ζâè³¹Œƒ¸F%ö {8¾fnI£ü$_9}ö!�A~Uèú$e³ÝÞáRºž]cMÊR‰™øJÅ÷Îöã�»÷_FšUôàx Ñ«ù¼#Üå[u`foRÃ}÷_[»¹oЏÎ2FÔ©^{¸f/7“ÎŒ++Èó¹ðrž„ÖsVËÔyr»˪ۼó'ƒ Å8·Ž‰Ÿˆ¸EJzðþG‹{ÁóP¯yæ×LeSëûß5¦ÓarËtT>ÅxÐ�ÚÃu›T1­¨ð�>cɺð/ ¼UðÞ»Ùêð/P�áø•Nž¹É«±y°�w†ÚoQ´ž^q¬¾é^<ÈÌëeŸ_%w  ¾ˆ/[ìöf:Ô7;؇髜•mM w)Ü^=ë&Ë‘±ÃcÎÇÒoV/ï†ÊÛÞU-©‹ôš¹@›W‹f מ �^)˜n’Ç5»¾×bi:ãä.gáv>3`U°Y_}bö÷!ä2aÅÊtG–›•©*õ½ãê˜(ØIµßÍzqšÊuðc kˆ«@7Pf˜ïi1�íc®~(AŸt s†�/ÊD½úW}æ0â|É}ݯ<-šG˜í*Åß ‹%•Š–L_ʇ[«äŠ€Ä q^ÈsÀ˜¤k þÂ!;‡STàãn&h)òLTGfùÉDÍÓÔ„„Lbè"rv¹ffæP0bbŽ_T%hÌDн4›Þ¹§ÞCbüÄ&Údßwº±.ÌSšÕv­(I�q'\¤]1šêàòw)ºŸºíÓeÞø¡º C”!½ø�K7ÞUåó�"µ p„Î {fKƒVèJd`¸áø’aÁÝ¿ì¿ÝïJ`%0µ "FÊ9^Jû¾½>×í‰+•èàˆ³n§ç�‹»—\»ü!Š(WîzÙdŸ‹F¸ʼŠP „Ç$eßeò³±šÃ=®uŒÙ_üOÛ,m�mñËàgýþoÒ_óC‰@ÕW(„µiQ f¶ö9L…{zø¾˜Ë+ça; j0ñ‘¿h-cý;5ÕÝþ�.Àe1¡ aÉÑÄ7ücßýðÁm÷Œê±Ý9å®Jb.;ÙX0¹'�>æ<Æ’‚:A¤…�ˆñ¢èD`ªs´ÕÇZ½šé:_wnsÂQZ~(½Ãv/K›ÙB•¸þ6žËD‰ÁçyŠÈéÁ„wï8c5‡‰Ìî@Äïyñ¯°›�9†£âÖò¼ ÿ?X‹G�,ÙdbÏæ¯k_ÃÁŽ‘­¥ ¸¿ú*�bÅ Æ(Þ½ÊXx¢uŒ�;ÃMŸj>(+­ÉȵÖà€¿”œ8óqqÒï¼K7a6mŸL*¥yèǾ{CÏx–ê„ yå¬X¯C`1Œ/TmfÅÁ<áÈ+6Ì£)…åf&,äÌÓ4Ìob^ ™Á³á+aµæ|L¯ä0¦¥+c�)™ ÎúÙn 5å†}»¥±j¿,·êPe›ß a² JàÄ9Z).$@îú+öía“áïÀPÂph¢Ò@ॼwÐXrR†nÖ{„éRâë0Õ%cÚ-a�‹{ L·†A©�/+Nº¹lTΛ}­#b>à!Ýz²µ[iÕïv°Áó!4vÌ„,j]îv¹Çž3p³:ÆåH·0×Ju¹w1ûúÄ@½�VspÝØ`Vð%oÐ/­j…/”»}a½]—9›cäCúàñO�7ˆµ8Âá÷FÅž�Í’çmÉ�Ó‡/4¥dûÜXó!^±Q¦AÛBvÊPt›¨n]�l±Ð®‹ž� aAŽê[Ó"…x$P¥/¨nLø*Ül à™°ÿØýóžÿV®˜ŸÒÏO„„Ýå%²† á±CÌ$¸uD8/ƾRîXÌû»Ø³…÷B„Jv:Ì �« R©+™!³ÈA5åŽ�ªp?N»#>i˜&òñ& É5¼,åüåAmÊÀk0!´ƒfµeó€†Íc¾RéM™¤éµÖùÈÁ½îdlO±”¶+Ï0žÈÜ�O1ád„¢‘ÊKÑcž�‰Sõ§sf�žJ=gæ€� W£Ë]�³±%øÍàa”£r…Ògdc’ÛÉ[þ7ï;~­ýe_ïõl‚‡Û‚îÑ¢ ý«W÷ãO‡,3¼ü.Mj0ç�‹Ž`&qœÐ{�7M�š? ÚøV†Âº ɇ‡™;p�@|y*%/·‰lþבÓ/u½áܶxQF�Ëáqî.qkÜÎÎÞoÛƒlºzëC«¤*¯9÷«ÇSzÐ.jCøL–£<“o`p¥v¬àî]ýT@¥2ß¼,Zì|î4NJ÷dâUýÜiØd´‚ã zzó$T†ó^GÊ“ï´NµxcHÒ¦]ǰ½çŽøk^ !æ ®§dÎ`g9`ƒÇÞR´kQÈšòç.ÔÁ¸:àÄ_œØ"Û<ë‘gþ«Õâ{kñƒa¥}<<{¼œýùüÇàð ¸+³BmJt¦àŠèd@|t7HX¬!, PÖ17+¾´1%ǘ�|¶LŸèGô¸ÊNd§šŸ8ï˜�#zeã£c{  u³—»Ab¨™·=JkÛxÏ3w°Ó¹uE‰ÛaEö~ÊE¼¹ò›ºÎ; urý»*fkyÄj¶³ÃŽ!µ¸½ÏB_:Þ¬˜y”cÞ-ÖÏ™1~}{ò`ôpl<ó|Ø|9òv™Î(…i¸ñ!_:nÖ·,í’a›¾±§2�¹{°±°<m¥î²}b Oáwq¥œŒÞj•|pv®5ÞöCïĹyÛÇûŽQâ,¨e¿ró¢¾ä¼\—¬.”`Â5ˆ�„`ã\|QÅñ*¯Ýöq{ÕØQAó¸Üæ×æ­—ûÿê½ÿV°‘yÉ[áãaBïØi«n÷`ìa-xñÏÔ„è?²�y/>໸=dµ|€^›~ÊžŸ[¾^'/l5ê. ǹι|6ï³/ríÕÅîõpG~–Ÿ®{UÕÐ*~°â±­æ“8K¢ÍÙû$õ.�ç¬êWý_ss+õ�s$kâiY7Î;Cô…͸ûF„Þ³:Ó†x¹§¼Á{ß2 w»òw¢“ÁÒ¯>kÂláµþ6œ}±9Ö÷¦âÕ.–——ÇQN´„&w¶Äú2œq1Õî‡âÉpè™dè|6<¶D÷.^¯¸ð»«uGrIç­–6Ã_¤w Äœ‹br…=Ô­ïÆÇ™-¾¼ÜW|Ñ0ÏP½äO»^ßš @½3"Ã6–¦‹˜KFÇ…Õ¹t§É’qÌq˻Ϸ\ÿä úTëf¨{¢P;7‘>1Ý„ÔL5ðÒ‘ä‰ÕþT†åý.Ï}~�7�l–¢ç“1²¬¹;ÇrŒþg>>—šñžî<|>-®fIŸ=Ñ›�â¦rFŽC¸˜ûOÌÚ0Óï¹ÇW¿ ÆÚþzCþ‘oQ~Ùõþ�Á[e:U!°3÷|2¹"]Yd þýn.T'¾èì¬"+¨F:D­pÈ1ù6G­Tª·òÝçׄÏÀÐBƒ&¯’Öúijú ½\‚øÎty¥á-ÊL<~×ä~ýUÎ6°dd}ë�ši~îð b.¼ë&s ¶Ù™áʼn÷e‰çû¦Ÿ£4ÞLs%Úô—„áçÜ2’®-`rNаôCÍãmÜÞ©˜×WD©¾µg÷”Ä?sZÌq=!êßWçR»�œž½ãW3e'ÓÖPp �Çx×N5�wŠíÈiýmù¿ (G‘Å ËÏê=kužã„ú¢·¥ñŒ]S0Yò�pŠÛé�81’2ðÔA{ˆú->Ç8 Íî#2ûÊbÖº·r@ô»*Î{­\ä_}KZ]ü~–´Ååõ¥ð]5©ÎÆû¸È¼k€à^w›$:&³3z6× ¤~zœ¡W,¿3¼ˆ7ð°š'H…PBµk?ÿ+Ì� b1âðy¾tŽ×›W MJ>›�sW_Ç{S&e~:Ð0±�¯ßÄYR ÏíoåðrÀxžK-�S‹*ÃÝh¸’e®sØûü8‹þÎy¬‚üè;ŽáY�6Çâ”Öke›âý†¡B6º–Àßåk|$Ð ;}¾=‰g´‚pˆäq 9y%‚$BÕ2 ³ïÏZ㙞aÓ>VÕÚÞ¨žÓ~éa ØÂaã‰T&ë¥�ÿ¹‚mý`àg—Ga’\”öêxzýóX `±kÅÅÏ—–ü¯Í<õÒuk,œiÏIe—üÔ6ƒžXãf{÷ÿ�Öa†5Üsû\G*P<ýÇ{ ~Y ˆµ³j?G„¿Aç„{æè\`|î·çJƒ#â) ßÓôÑçÑ'¨¬¯ëEÛacƒ¹ €@(‰Xí•Íd_‚Øh—l‚ù`s%÷ÀäýŸÞÔ=f£¾ma§Ðåý ïAb¼*?n²ûR8âÚ¯êÚ¹ŸÐI!†G—öU™ÍyÖ´­ïÚ+??ã¦Ù«>Îsæ&vj Æ:CŠCÖºƒ§Çyùެñþý¶[k¬òXpþo±Ú�´ëï„h4Ô:ÒtÖ*°òн¯SÊ&q´™è�0¹OÚUË”PT8.”QÓh ±ÿØ"`j>±›¸pÿ@-vÌ -:ô§ð|»«¿¢BÍ=szùo�xå»'ÏßVñÚ7ÇÜh:qRtE£i$c”…û^^<ÜZz[ò¿Óýw¸–ã[¤/òœº’¡Æ #­#OYDYëƒHލ"ÕÙÅïÿd—i%ñöVL×9|àª÷#È~]� îxI¹êïîs¼nú×7“ÓÇ®êRZ(™Új� âµ®ï- æd†Ïy<Ô½ ٨š�DSª4ld©ÈL¥”Ê©SÌ!øµÕeoÜß±ÒÜ™âq†8wºãGz‹$%jløÆ(Ù‡µ™Èž¥réîÃäÏRiœ˜©ÆÖ1ò±}HøŽmpæï‡Ï~ïo0ÛF¿Ò]Ü–½p³!Ÿ7g¾b™Ù&Y¯Ö•K“ruYíÑšŠ*·�ÊTY¼Y–]¤S°…î˸96Z,¦ å]#AŒF³}’*ãx=e7¬¨N£©òDCÃŒNOªûŒuºðCkÌaûÕ{�AVJš¡�ß±pœÙ/JJq�I+³©3`ÚqšÓb®È¡Âªqú™u=R-ÕkEcš<@RtsŸ'”ØeÇïú¿t"bÂÞœiëpš/WùÔ CiëõR¬†ºâª$l‹ž,yiñ=ü¾nºâK—­aÆÄvw¨zjˆ©�ªO¤� cæÒV{ák!ƒaFðE|åY.æ�ÓŸºÐÓ­ «‡T»ž^ÿ~§³¨>aÐ�Ÿ×4P»T ëÆð #?9<²ÌcD‹ö¼UláŠÿ>ÍFÆC@»zI#½ÎâcH5 íåJrÌ×kÿ é Vº M0­}ª®O1êß,;{¬hÂ�ÿõ)øïçþ¸WT̽ä£Ç›®ére8ÐÌ�­´£ýZlEô4ЏšEßÌ—žLÒ{‰ã†÷ÕÐÊX‹›ŽŽŠ,:0�}fMiQí5ÖŽ£Áyn¨�·UÆ¢ÜUú�àF½áFëÈ\0ýX¿‰ Lj¤l‡Å‘8æ`±× œ�°é/?•¥Þ/�y^qÐ;Ö_;xiŠ�ÑFïÚå¨8M�㞦Á¨ràõ6²B»5ç”Â}§…ÛÀ'Ƴ'ˆËÎ !9ÒŽ��…+mÇyµå@ΗgÜT‰hÜlÌ8¨ôéXCS�Ï<Ñ0r;oܯ¡Ñåc›�œí?CÞX< ´°7 óLnvë/åŽ:ýº‹åì5½ìüœ!XÈ>ù]—èE*B …ï¬ß¼îI†ñQìDëC@ã¹[j¼™úÑŸBÉŠz+³æRë'·Ó[eÒ‚ŸpVOü¿Õ<1gòÁ$d®lf09eãVËëÏas{ä¼=x^³nÏz�2ŠÒɼ¯—ðœ†to0\,\ ÂÅ€_À6²ÿ¡t1+gä&ð!L%v¥>JóÜä�w…½Yàk×ű:&ð¹´ÚNÏÜå!²ˆ˜õf iAÄ›`]ï‚aKUº†„,ýÖi¬>™¯½_ãý¾yZž0ÙþO~í‹B®+2}óTãÿöù®s1­~Ç–øû·ô–¥²æ÷eüDb̶ôó1°6Ö«hÑþ’Ê-8K¶cA Öbo1ŒÕîm3`[Á½gXãç_éáõ•Ö?‰9 �ÿ‰ù ›Öý"MdÏA—/ ,—§wLj1ÒçÉ4mæíÚ»²og˜Êc¤i¿1uÐz@d®C…fœÔ£{’x÷Üñ¶··¼} àlÕúÌÔÙ[ÿ¦{„èσKx´“ô?­ˆõr‡x¡]¯â,±¢yEn+MúimdBdÓŽ²qñs ;÷ÃBÎôÞqr¬´Yâ¾1`‹í¸ùˆ<<íü)F±näã®e¸ÍÖ{4 ^e[;B.ßZÓ¹R41¦E:6µ2wÈ*VÐ(×s©K cÎáÖJÓ=$FÙØÝ9¾ž” µî/œaTˆbÞ²e®£šÌd´o¢¡Ý—1L­{â÷ÌÄÏbÀÙäŒXUKìóEš¥jóÔ´ù”HâÔ<žG×QŽ^Bä»OÄS}>ä�…Õ ÔI!‘‚~NÜ(”D¬¨XíS›Òôư‡¬M‘�}Ê3RI  ½}ÙGU®dLU2^.. Þ�ܯ´”Ù$ë¡¡Fú\­¾RälP¨EJp_³–q•«Ÿ’Þ_=:^x6=]»[‚àE@òuª÷Ýdg\Í3k¡éæ ;À­ß¶”‰Q¯sC\L8Vÿ )­l9{ªðŸœûé@ÎÙX#ôkD¼¸QEccC7w½Î°‰ô¬;A:6bû‘ul%ôI®nP®0@÷ˆ—¨�’ïϳ¥ûSï˜öüÓ¥IÆ;zÂÝ}�m÷~ÅmÆ7Üå<.®<*&é0Üy‚Ã`½�nÈ¥qE ¦eŽ."}¦göÆG1ØüijC¶T–εq#6k IÓ9�aÕ�Ž^ARcâŒ}­_^ÛV ü¤H[`E$œ�0ÂPäécÓÑÐ! wëc“^HYþ¾ô:Š{d\úëvÑæ¤ïP_`Hp¬ö+ ÷Upˆ$�m><[‰¬–8„0ÉŽ„@œŠæ¼¿`ƒÊ–PQá‡äÇ‚‡6µ@k×^ ¨í‚?²î«}HÕ×1ûô«×ñ×îñó_«DÞFåE]3Æ}š¡#ƒðÕËrQŠ¥(csc�êˆ_g[¿þ$,^.)GG%tú3¾Ü b®lNsÌ&+y—Ü«•&øÎ겨ÝÅ ïW¸Ž´´3%T“x!l%ˆÆÁ¿©o]¹‡ZWÅÉé{,Á`¬Bèäøž{õþ¦· lQHbËL.Ñ ©Z”2 p°t£‚ðÕühÿË�?+ R'.Z»’^£D!'q£Ð*é­õÄftùhÕ}@}Mž8…’\¸Ó-wi—}Ã.j÷¹åÒœÐ6w«éo†�opS-¼óÓ�‡\-!Õ>ùõX¹Áxà�º.‹&m£­zmÁYC`î&bSò î•L÷Ó<[Wž¢ø§‹!“àþû\Mž*pHêÐýL Êú>nšRmsEEB ÒP¬w=ò²�ŠVT–¿â\娚T}¨äÐw½{åwÃÑ‘¹u+{­Ÿ»eÆ^F­¿F™Ðù8$4Η­Qr8Åäm^r¹*4v'DLÊv’Zˆœ�N(Ì®Nç–é*=øZÖj:çUél¶Ñ!™t�ùž~“gåt ÂÒíù s�«òú7¡ ™D´ù�ž ìçΑ’âDÅž¸—üzÙó(ýÎ%ÓmëÒß?•xsº¨Ãªð-óEëÕ¥“ŸW¤Ðï´ÏwAtš8Í…h;è³ÐíÍNE&]Ô¥ÛŠb Rü¬kH2£’@†‰¡�%ÂeÚŠJÓ¼“ Lí’4Q#$f­µ%Êe‹ V¥xm.!Áè“F4P±RLùÆX^nYÕa°ã ÕÙÅcsæ‘Ì76Y½3ŒFËÌKß¼ñšúÆ¢ 4‚-ˆj]µƒÜdAsoPk9”Ì$lú„Gm8½ç;�µ×g>j(¨î ‰ÖŒ¸šwš‚{�~`Æs(Pe|ÖlÏg‡ºaï­G ·sç{©¾äa$ÛFÛîŽêe]F,´äbS¼óYk½Ó¼m¢§’©×7ÈËns'•à퓤l…fu(»Çæ¾ÃUk—‹tòr+Ń¡\¿—ŒñexÜänÉCl«ç=ŽçLE9¯ä﹪î×¼¶¿|ê÷å*÷`Êîhèi½).ð‰ú(/º8ÜELg¨�žväk5ÕÁniÕêq²ªŽàÃá ä’ŠîñnEß·á4‚'òÏ8ÔÆåÈÞ£&w’*SƒåÄS$Q!çÅz“£ ¤OÐïÕÕÞWrÜŒf†“ZÌ™KÖ2ñ•[ÞšôdNôŽüÏvJ’"F‹««â"&Uޝ™Ê+ž†‰ÑS©^ðž:ç$'æ¦\'…kk—“€�ù¡.ªd7<Ž«1Š—-]!ÇG‰´|R«Vw;zË_:ÞIhõTÑO=îé·:Aûå–7Ç*ø"n¸|Åâ.™‰ÐbÆj‹µ¤ÛÔÌÖ›4„ “•¢lßzjx*ÔÄñ^æËuI\Ô>6ñŒÅïÐ&3A1Ü×+Öï£Ö·‡®6†µa.få�ÌË]ÅPc$j£jøA�G®›â³9'æzüJ`¶Êî¥xÿK½ÿï«A£ �¤:0ØH„€à�Öž�±$ dþ?ÔkÄ6)¡"i¯Ëûzñ.°¤þj¢ó14ÎÂÖ—\÷1RgûZYn³&мs{¨Ãù±Ò‡L—Z/"¼C¤tƒ<¨©6˜n°y3Ú¦K°v—¦Hô">ýaPzÉ눓ù® вhµê=Êü˜ªAÖx ’ö\!()ABÊÔ4ÝKÞ›N?k‡í7ÓÓJAñöÐe�ÕiÎó‰·“°èÄ*q[¡ÿâf¼¿í·K”wp¾õý‚F¬¢k²»Â;ÒØ3¤ÏWÊÇše¢@‡V‹Æ Ëùç¯{ø9-€bê(zÙU%XÜw<ÎuâÂécÂ÷ÍÆ•õ�%ýSK¾¶ȾúRÊÞÆ’ëz~çÌ[>"úHõzŒV¬Í`¥l²6ã�à‘K3i¸åÝ`-àn|¿œ5öú>t¥Í‚P;pêÒ±ª™…ñLÕnB¬¬%xâî×P6½JéµÈg:ã¥u#"~ŒVy Cq¾®Øn`”0„°„]gÅZ9èÑHD¢A¬J9ºÛÀeœ|� ò4eY'±&ÿÐãEøLñ‹jz£z7ž±ã¨ÄaÆ�cT~)àðšo<˜gíuµëÇ�“áÊëŠ/x:žÛ­åç^MbÁX]©×Ç<�®Ÿxòf2Ôêf䀶Øtλjè«øGœì++A7þZç†'Î Ì#½£DùŽMòr=åáÏlW‘Y7,ˆª ƒ�@ãŒVÕ•7¡Ì_[¨”e�œ#v¯Kp\ÌïSµ"~p{÷Ò ÿ¡ÎNP7ÙðÇq–Ê>„¿ÔÍáÇÁgZ’nh5&mX¢Z_YCìáÐY{¿wåZÔ{¾Yóë5ð´Oñë? ßx´Ç�æðŒàÍ1Ç©–‹«ç†³ÍH£ãTˆô®¾b#dr+£–µŒ­›°Â{³—E{÷oŒïATRƒîT'l\‘‚–ë §èÅÃYT¸«¬¯†¸æÉ=Ü_aW!%#†Å…æ^8Ë3{³‰=˜dÛ^5n/;LýÜäë/¡spñ¬®™[šÅäS|ÃaÐ\�”'³©¿D"ÌL^óÊÓ�Á,8÷ÓíÛÙi-xý¦F_5ß"„‡.[?òòÍ(üæÄf‘«Y�–Dk›L1ó³1Ì.ù3G0« wÅŸ¬l*â=ô]ÇЙh³•�Çq8Âcä� æ|v·–8–¿Ïš7[lê®F7­±ß.¿k 2\ÕC©}ÚÙ<,¥St éã;èF=ÌZá“�U"Bo\Ábw»uŠbìkNHûó.€Ä4�£ÝSãÜ[F‘«±ôëž|øô†ÃUçˆXlmu�Ðb)+`X´œÃ†G"áC@¿ò4ø4ßÌ܈ь«sÜYŸ¼/\*%ztz©¿·º×7¬+¾nCbmeñ-‹ÉfhH,!¹àk|�Æ`Àôb#T›h h$°;�¥¢Çj³–ÂwÞ†³¼�]˜8SÐQÆà\)Û �3g"D†<€Ð›„n™sì’ðˆ±|yw/s½ÙÌÛè˜ÇC¨ÞtúKi¯v=(æžš7ÍÕó:5 ®w4ÆVÀãÐY�a:*ÇU‡3ÂNp^á>ÃÌô¿(è^±ûÒõ+�7’~�yî®hÆí,Ô—h‚ðû†ÓuFÓÖÂÉ–^®î·ÌµÕ½e| ´">ûE!`¥(‚fø¼ó0¯È9ß\u}ž°P£\¨ýç¾!­›É‡(¾yÜjÍ/C�Œ<Àc“ ­lMT 5Z1} "5½3ߌWßʙĞ4Û¾%»ØýÆÌioÇrK]ý­ZI{è æ<"¿³_5±„³iýƒ¾^Ù™¿\/—— ÁžëÏ7ЫQ+ióSNUh&¾“R€ÊÊÅ\Æ$p¼~ù$UãŽF¢²"þq¼S›ë‰ÜÀÙmÆó¶â½°Eˆf xÄ>êZ”�p¼l± ê�®£eÖ ÉLa…›FÕ£ð¯·Ñ×ùWÓ?Î]s4s[NO ì º.3‚ ÞÓ›søšy¿S@­œå@|Å³Çø��Hç±|z>Ƈrá';òî âáRÅŸ ³É6L`´Z¬Ç|¼˜] Œùvv]S]Ê}Þ�-P€ƒ^—ÖˆlÍÚÝ‚æ1–eÆž‘[�¿b|%=.ä’3(Y¶¨¯ïœìøCqê4¡×†IŠl¬w/Ú•Óô÷ß»ãÅN=$Ñ¥Ä�Ýâ½Jà§\,š[7!�Xª¡å@2¸Q@\�c„L6ë3�äx R2úl”à6ØÒ2l2v{¤÷ þn¤«�øe<£xÓr&-M•Ý.}X.�]gÍw%Š]ßýÕˆy“-ª§L«œ¶ñ‡S3'†ÛÍÕ¤Bõ'*ç‰Ó¡!¾v¨÷¾·Aì¸GRTKÁ�ôöXÜ&ØÊål4B®áÝrPP‰tÎ[9„g†|¾“M%NªJÇý™�QÍ ¿N«Â¡;•%mëLL¦…YÌzxËá±ò½aßÿl.�·»üÁ.Wêv7Ny9R*ùcUæØ¾Òrï‹ò¿À£�ÿ˜³3uQ½ŠájÖëÊGä¨K¤>dÐ÷ÜÜ^¶Äï³hRÊ^+l/Š©ï&oÚÍvwP•‡kùrûQ\ðr_� :‚Å·²ÍÁ¾³Yïmn‹z¸¡æWd6y]çÂ9Ôíµr hÆ%œ0ª.ÏJƒ»¤cÇ£¯±Ö$¡ÐØÔ@íÚKc§‹.κ†·*Fî1\¼l®]uGêâ$ï:Q§„ 7àƒµ{œ¶îü·¡riÀ€0ï¯h˜N¸.ïg+(DZ±‹íÌ*¾©ƒ¢Žå±Z*ÜôÈñL”´ y†fÀp­9ˆÏ�ºD¿Ý,V±Ÿ;b¿÷*oîvurâó¦è½dåó“ ïyèt<ÁãN˜ ÕkÁìéhgAîô$–F‘–)K�Q¨�g8q‘¶½ ‚ì‚I¬3JtïÓ>¯­|d±Òã¦é߯Nù‚#"¹ŸŠ[Ãk˜²¥¯š¸6²÷Ûâ¯|$6ÈmüÁÖ«ÖÛ�ûµ¯Bïý�)›;Èb�׿öíç`pLįu›Üqh¾ÑX­d¼ó{T:EÆRàÂÀ3û™¡D1_�1¨к=õþÖ_ÞÝÿ*ó a¼¸i$Æ÷ÊaƒÜm|«Ž?1Ö4¿­ è,u§^�ú¼÷¤ êð’'mÛy‘žµü $­ßµ5eúùÏ¿wÇw«_0ÊÑ›» •]êáUO™6A\™Òk‹»cê]7ž=¿�¹YB�û5$—¶¾â'÷󃓩¢ü·Áôìˆ1¬éi¿�.4€È{sú8k"ë(2½~·øÄçû*÷‹ÁíÃyÂ-ʽC÷WéˆðÖê—1w¶aßϽ÷°ùö®Ùh�€ ³ ¡œAîˆsŠáÐÒ>„wü�%ÛŸƒïÂ×/V÷TòÄ?ó�s8æp>�uÅǧÝ^±Ö AOOÓwë¥é"#b·~}¹{y7Ù mÅ›œU™)°¯n£ef 2SAõæ»èYRÄVÃÄaÇq¿Íóú²ÊIªŽË‚ FÚ¨}79!Jp¸X ’±¼·oZÖ,W©(w Sª¢wù2y ¯~<Ã:™w¼QŒ?ÝÂ3÷â ÌÊÕ[¡š4a÷�ÅòuË“Ë(`Äø§oœ#8ö=AŠú´uqï†Â>a„lqp†'çU Tæí›[Ý®—¦iFíz9×�•Òïšv\ÉÖÑ̼ 8¾‚¥Ê'Á{ŠÉuaôZV¡Å¼Rd®žÈiðóŸ|{ˆ/½5÷ar껎åsß\¾L_Èå~±ö:Yá~÷Õ¾¡ÆÉ~·Ï�3¿=2üã¤2p\Ðá  sÒ4Ú�uƒÔ عQžXd­y2¹1ay•°¾áܰ‹�)b;Öö™…:19_ƒ†9åàÆªÆ^ kÍD’Á9UôKæmWÌ‘Hè%�ŠçBŒ‚.Íâ‘âxoG‹Zpj לÀØqngã�^µ†6dÂqÉðà%Æn<¿§ª"!–^I>ÒØÜ eAŒ¹â• ÀõVM¿òúþ`Ÿ›e tRq„ιËÚm¹U¢é_É96ª?i�äóõÅAg¥&_>í<ðDˆ/OÜ„ös”× åºxÕí=‡�1£,&ÿ/¹ç.ð<˜܃Q‚/ U®e›onËÍ`N~–ú±g÷ÙÜŸ^êI¾í±ØÉ¿¹×ž÷ƒÉ¯woGC{�Å#×¾²k$=LšOA ßš¸‹Th�©ÌÞ9•Œ¥÷¬FxËÄJÆÖw²åceâuxt¥Œ¶¤ÊXH3 ¤Þ›«„‹a²w‘]IYô—Lc΢õñý=·H[¤59tÃ¥ó¯mëÎn<ý�tɘ›þ-zB¹¶K‚¢Õv”•oIÛŠyh HLk¬s)¥¯4Ž÷ˆ,äÙ§KIAªC“{V:׬§(ž2m!�f‘Gì³á<ÌiyY Zþ�M ÍÅÔ¾ñ|·œ×84~g#ÃÓêî}xÇT‹PR"²½=Î9éðǤºîŸ{©]+†ÖUî‰�˜q³S¡�åÞú¿�g"ÝÊ�ÉÚ«¹ð¾'XýéS9pcô^¿–µú÷g÷†!wº\°ªáqqï¼om ^çÀ£Ëþž�S„2rµ±çõ<ë__Ù= !~ë+…p·7ÒFs•ÁV•$×ÍÈÂãZÁÓHΫ>¦W=µÔO}·7ÿlcàÜó³œv2Þ׺]E„„bºÙ*Þ%`o�]Á>µŒç" =u½íóOèb"Èy=ÐÇK5�(\…Åø�Ï�ö(¸ñ`¬[>x[¶·� j’.1«=Ü6ÛÆ EÒîÿ…–Õ‡›z´¸ð9Æ A� °G³•å•á3š*ßNð|e=¡ —2‡f!s^;,cµUW%\Øæç\:"tÂß’Gxë•.QòEŽ"ž¦1{ßZÔ*ža«,ö«5. u;›0Ô˜Y —š,�l|C4Ý×�š¹ƒÁ>£™Är°ÙkÛ¬ “çÉü˜ÉK8ZaÇàém6½:óè�..Z«¨ðëÖn£Â°møæÚÃ\zXìš‹Ê{×¹aÔ<ÉeýºqnDYB<Åy¸¹¬f7/‰ªTÛa§Êf_3ÂJS×Í›mt„ >óqˆÑèËNý^G£·*˜‘t½Ö+ÇÁ—²Õ†…0Z½×š7d\*Ô¶@Ú!iSx¨Œfh×7L:©o.Í Q’OnïÈdÀ X�Búh(Û¿!É^/ZÊ6'ǽЄfø/ ïPœmÓ•ÐãHÒ’GA°‚ÈÒrdÜǽ,N¿æv·Õ|[½d¯ù@�‰ÿÔZ«b‡ è…?˜±ì æ…)4É>›ÿí‚£¥þåÏSFÜ¥î—æá&C˜ã×+Ьf\´–z~¨×ÀçýíÉ@”ˆ„&7ÃàžL´Bý¾Î2¨n\ûí7 ôL#ö† ÌÖ‘º}òŸe%£·9?Œc)6L^Yñ¤âþžYëŒÍk;-í[iM'ÊÚj’á @aÒ0ßo»e9^L± eI!%jZ2¡Tuð/Ö‘[ù^HL`Iµ´ê[b(¶ÕbJf€õ• ¶’5fß—*ö¼"E¨Àá­˜: ämoøñvZÕëêBil¯cïFŒxà2„ ¢*çHsºÏã>p�KcÙî°ÎN@»¶ìÁŒ`�”£þŒ|›—ˆb4'íãí åzê=Èa¡w¾®Ï�¹ŸW��…ÓcüßH :Ž^ nÁ·R8;2BìD®TBª�&–ÿ3±˜«—£eýuÕnÏûqýŠï”~{Çj·B—uX¾,œî2QZ�{¸€å³ä‡å^¤!qÿ´¨Ù"]D /›ý÷º3Ù¨Yñ­¡3äØ8óÓõçÍ&IÒ’â›.ª9|äÞhôh¦4XÒISBáSD}âö8nO~_�öq�çÒ·)‹Š™Â%¥åZ‚ËC0Ze }£%â/{qI{Y£ó†fz°ê€Hê²v;YK¿¹ÛÞyVÊÜ!mRÂÏcçU1\z/3ÏËØOh*¤A�TpŽ®ão7|yá\ˆ z´—y)ÅâÕBàÆÆîÅD1‰Ê³Æ1*Á¯”}©]AAósÁh µ‰4©ÚÌž7äû‘Ò¶€½Â|± �ñ¬¤ئ… A×lçy°ò¾›xdï|_.ˆò.�%hƹžaËú�*ÕáØt­Ë‰Åní?6Ë꜈5zàüàç¼QhóP˜¤“[çaÙLUl#{aªTç^2z¦'¦ñ�†b={¾bó�d[‹èáÆ ÂÅFÖ�¿øµW˜H`„h”†ºx@£�l»¨*81§Sk˜°œ‡ï™Önîêa¤×ÕÞd—öb…E]6|ý;ýµ°4SׄúSÞ :Ìô(b�—4'´a±²ÒEh°ÖÀ6ºk \¬ó©™Læ$GÉ|n:ܰ9ÕX¹Ç�Â;Ie Dÿ/ƒù˜¿±%)I9 éèw�ö´'ï¤ÑZñ�Çå°‰D#{G±ïýŠÆô¡W[¥ã÷àÿ<Ÿæµßÿ™ö“çYŸ7ñ6a[_î‹õ¸¬‹0m6͇„𠌶éa Åáû�…Pÿ:/åiŽBAãÑfÛ€8üëéâb)M¬—²-ÐÒ“’¥ƒ–â3ý‘ºúÅ̶©]tÇ[âå�¦Ï¥Ü)8´ÿæFZ*WÓÜn ÷ð'{‚À6äô J?šˆ C¢œJ…É=˜W1›ùzwI#·ý¼¢ÓöYxÄ¢å;ñIäŸ%J‰æIä_|ûIŸ9qtQíµ‘Ì ¿rØ¿šf1}ŠV@:Í*?6ö;£Ñ„ÒjðO~ì¢Ó�ùíÆRiç@ñ–¤0 Â\"ÚÇ­åjj€¶&G„Êé&]K‘A¦Ë ƒ·”I™rìh 5€ì–Ö¡l*,\%È„!š«k"‚$"ÿo•Ò­«iV’åY¬› Ò1ûyX\'ŽýÎ9W„tmL£Ž��³Óúý^m,�Øx­àÒÆµÖç÷° °1^lcÞô·ÇóìbO¾íW±âÁG ¼éAŒšlÇŸ0 A­ìp¼µÔ{'ïœËw3ˆói+rÕt8&È�ÎYl[Ù#—/¡Çæužyé�›íùÛ„?gbth̵q¿¢JBc¿¸¿.ì°��lκè,Ìy{›gC5säs7�§¸Bï§9ÁW§å{�k%~þÏÙ¾ƒ°?ÚºåVÕF)mq£Ž¿À܉Ëf¥+¢VÔ{*3Ëc!¶Ãš²Ú!ñ2¾ñ¸p ½ÏIswhƒJè0­3$;Züþ.‡jÿÛ¿4$tJRöŒŸ˜c9OäðVþ˜oUÑZFMjÐÅ•{»óS»Ñ…8Ó·R½w×]¨xhÉðÈ<³Å9Ë_}n¸ä_=x ÏããÊ–\l”Sé‚¿mð±XXÊÛÞtMäìÜ1k%P7Í'«( ‹ô»qÍî¹¹íâ“ö§ño>’x£m‚µÎ5mÇ?w·¬j‡ÁÏAkeÚš×uu5ll–¸[R2¶Çv ›‘x£ƒÎw 8è“L-µªíнèÃÑîqiè”.J�o—ŽV¢ÉÅï÷ú®SÔIÜrD"®–(AõžI}�=T ‰Åî/Ú̼è7Øï­¬~®xw¼•Ý>Õô\Ø^ø›ñ¹,Cb¸:¤K†Ö¸k’Öó^‹�ø[*�3’*ô<’y¼cEð[Î{t8¿œ;qG ßAáƒÒþû=ƇGÓ[Þ½N$²Ö?d,Nñã²ñÌ&^9êMlâÚ®kõþ¼ d'à;c™Â�¢ò 0ùÛëXT«ðl…QƒG,9àyT�Ük¥vÚnˆÎMŒY¿É_ð’ëÕ–qªFûé,ÅÊnY>k2—Ÿ‹ä}Ùè{–H¬i.G¦ï{[ˆÈú´I·Äò<ÓX©àø×ø_\ø@q#ÜóÎB¾¶vç¡Ä•�}”1¸Á5`Ñ ¨î1ˆä ©wÚ�|žOí#Žqý *A¥¹˜Þm¹ê�Ð\8áz¦#YÁ@Ôê<áJгLDIѪåoãA¡L\z0€­íÎÿéH¤÷óÂ|iômîÈ,8Vâ«\ðþ:ç~]rÔ“w ø~nP�kmõY498lá0(–ÛÍ… P A-*yPÏŒ…�Þ}�eùe5ÿЋ’t}K²�±8 nRHí‘KhgST}(* b fb+žqvyû¤ ˯�ÿvA>Žõ}µ�Ck‘ŒN5vï×ögnÓ+Þùé§Yf�…À~&š¾šiTàë`¬¤\Íõë·á÷òœiM#&Ý;úp�H[9LØ¿ ëúU—Ë\%l`Xeç»”G‘É{g ÏørûãÎ] D"§eqwâ¹K �0ôxàµÞ³Œ>‹>U$F‡ ­h¾„•¿7ºQª$Ðߎ4�wÞkb .·+°F»öÁµõjϼ¨{,¤ÓŒh¼›vp5W�aù£Ð¬…[jÐÄEk±ƒÞDò 5eÚÈÐ옲.�¬]u>n`A4[X¥Ûqœc±9›â´~´®˜4x³pƒ “Ýa2Ê×2‚ò›·¹» <齑ë¤:�yºÞ6/‘“•ð?¾Wi¸1§»¬n�ƒÖ/–¡Žü¤˜ü—àöhmW?|Þ[Ο²Ã�ß,ä2ýØYá ÃE‘ïu@œâ.*Ø‚3™¤ã¶hph*)tƒá¨ ¸ÜÁn#XåBsoýý?P;,úãÌWÕ̆RúðB?×G¥aS›î¦Ð—R{àOTp¹:Å‚`±æ5ˆ}¶_ +=úÆÄç¦Tð;M�²’t®º :”MaA‰g,³ Í-6²[ü¼ÑR/Ô–æ‹<æ€PŸÚí­Ïîß¹3€‡t7×ÕVýZ½×Y…Æ]!Q¯¿ÛXûT(¬HÛnEQ:îˆb�¶'�¸øúËb©¦ªŒZ+­ˆMü�I�cHÜn¾ "8pŒkz€ÿ(?Ü™òãKr57Ç×t*+ånŸÐáÅüîÁ.g�á!±•è*AÌ^uϤÄîæ¤–Æ-ÛÕæØvPA)¦³(ƒÃt‘r70Eû]½H=‚N»2ªK!­¾ÁNg0(•1¥dõX˜µn˜â~cÇïu ß ªDª"b‰>‹{j~Jð7åT²ï,ôŸ Q ó³”!Xž‚!>‘¿úÀ¹(·mŽ8w í¦H7¸õM³Ô &ÜgçGø7î⯼ÊxðüÈÚšç~y’ØvðÁɸ޽@^‚NÚè%ÿ{mé¢Ü‹ÕøjáïžM�ÙŸ-m|Î_hpÀ¾H­? –—Z5ŤQ^Œ‹†AÅÉuoÂÅ`r$ß!G/[˜2DZŸÏúÖ�iqô¦×ßLð° ÊwÒœÎrZÁ"(ÃR!ÿ³b?ϳ;€×/AìxÐÒ:â§„´ë'¸6gþc&$4fðÚ“šVBY72çà�=–�ˆ �tGv‚?ï S'\Ía(“D£A&jõ}þ¸hœ¥ö«ðÆ,GËÅ ¿m…™|Îyúè±RéyÓÁþ°®¢ð‡/{ØýݺGqòLù|[Fïv+JY2ÚZÌ*óÛôÉZ3É/:~¨®Þ¬9Í÷ÈÓz¢Wi\…jŸökù„nm=èÆ·0 r  :+Ü\CZWY³sÌucŠú¬Dô€Ã馢¨o¦?¶½µ×«ÍñÍ}c¶ æ™aÏ;Å ¤Iä£><²¸FD,d8>¨Ë>Ö×!•?wåkað`‚��‡ÀÞ-ñÄT/<¦É^6Öâ"[«€�Üì_D±S†Š·@Ü_+;¾f·#ÿ¡kØX!BÚÞ™σ×ò<»Œžû›]½ {ýqô‡¨Ýëâ´¯P 3ɸ'Kx%rø3nHw@©ö± åïL¡z�ÇÿƒÞؤbí®ØX'ëdØü‹ëÿ½Gð1DM6_©[ó�ú�ÈÚí‡ù?Ýi·µnüW³ ëÛ™\é·€‰=Gµ©¨Â1  ÅT ž¬"7¾49o Ýo‹©eõ�äט�’Æq _-DeÅÿM32~þL_È\ª9¤[>Ÿm5Ëû�®A²j©½³ Ž«Œ¥=jO1ÌÒküL<ÑØe}Ç¡¡§×)<.Â^âÿ·E<õí=©3ÚÔ#ˆ7+Š�Oœæ÷öÙ.D= z_¤Ò̱ 5}Üx†7“Åë¸ApTPN]Ô½h¸h¾Æ‡O( 6ë¶ÛW½ê[9]ïLk^ÜJ”©ºâJ´ÄáÅœ‘Ac<«1i›5# yh¶4´`f ·…bO'ò±bØ™³$ioøTyùwÚÛ×b7¾ˆŠ:z½ºbD(Ë뙪,ÌÑÓ`›†¯ÜþËUÏ9ó·6Þ°#AùÀVˆ»h ¡œYr¶ŽcÓsçÜÉ^¨ hKÝçz~l³ˆ0±ï®˜¾64kþ�w�~oõÜgŸ¾6Óê÷¢Ÿ¥G GlÏÚë¼Î3ù1¬ßì]¸~ÃÆU°?Z-˜U²0KlX+Y„Õý﯅†5üpËnV üh÷;uþö¿ß+ç›D¿^ (ÿ·ÍßI1®ï—ç&BŽ5ê9¢…FL�…1ü?"YÛñ Ki,¤>õ¢ÝÙ¦p@ºI€<¹#xDvC颃�HÒÙÇܪl2Ðn·¼çeè ׿ ’[k—¸éÛÓSŸO_gi_|WczØÊZÂ ÙÆŸ5„IŒ"’ã½ÏæÈônÔ´aýSºï З»�x\R¾ýŽç<®$s¡f|× êg Ý!6cŽxÉ@Ô@ª÷ÎŒWžã±2­Ôtë¸ÂxjЕ˂ÕÕò"(2ËûA ð÷ $Ã-ÿúú¯CÝÇï ¬3@6¾çð\jè?_3ûœXÕÒ%¯#fI¦Škù,=Œ‹u.Z‡<þ» Ÿ@ó_ÏÏ5’\oN–TˆH¬ç8Ü©…½�Ë%’4Í—g_8ô�0¿àÍÃ$Ïüc;þULø¾ßïN—¥¦×‚í èÆÔH[3Á÷ñÿ³-¶ß¿úOü§® fùçMJüô0È`vá}|ÚÉ^ß„«Ô„� üÚMb»å¼ïGx÷a4…lx‹?gšÜõ€K?G.Ïüù<°–-�ÓÚP<õ¥¢Z™„ Q G¨�FBB¿49¾þô'Î7v®Õ\²íÑCj­[ò„ùtÜÕ!$.��"Ý:¾þŸ6ûçR¶a±|Íx3¶Û,‘1Žzõ|rŒOS@2Rª¾Ö†ÉØ„cöçLO7’<_¼xñG—r9cË»é$Š•.Ê8˜ «Ï0Ø÷‰ÛÁ76¢dÐø›|¦9Ç,«N×ó¶å±+"À/ø $O>ÚHجވك„*ipâ9¤^­WºoCÖÙøõýÞ÷è7´£[%k y�qÞ ‡ §ÝHÀÂ&yY¸Ï˜³ˆ¤'U×,^œù«r±náÑpðsÀ¥¼ÖÒ²©3l àÏîx�ÌÈT¸Ï§",-^ìè÷ã­ù2SŸ)ñï5¬XBæž�gÂÝ“2JÖp€Ñ úb3hư%£Ú+”oçdªêÑAš6˜uã9yÀnÂ,¡*¾®ÚÄ=š]²‰�x2Ì®úiÖ¹m\é‰\>Œlá¬0£ é1�8k!¬5Ë*äÚuiU¡°#(E™ÚðVå4Ú¨Ñà `'ÂDõÀ¸º‹úMP…¡Åc[¼¦5äð¹Y\†h˜ØÒ%N"]ƒß8v»åÿ€Wb±G²šÖ¼Ï��]¹O¹õ”ÕåOïG�9þ–ÉSì_3ÝÇè]ƒ}�¡°e2a.DmšM½¸®Js×fEâÙœ&Ô56º4O úÃÏð04gpVµo\vúé¶9dÅä/ÐÅ7ãü¥¶’õrjW{³i“ vE„ž}×ÕÊÂbS·e2Ö dÂwH¬"H¼ªã¸ µÃy0ÞÙšâEñÏh2dj˜L¥Ê›e¢Ð,(ò`‚yH_k›þ´[¸¿ûTå^ù6uÀ_ÝÁqÑÁœO2!Ä ¼`”Aê%›¸�舽Ô�„Ûa?÷¥˜Wû§£óGy¥Y,ÚØÖ³¡O¥Œæ ‹`üYÒT1œâÒô柚ƶ�‹†¬oÒ�À,—‡kä¡Ý Ì€üÄñO±óù�ZòFAÿ‡ÄÛ·žåIy¢…N:¡Ìz�ìÇ©Æä_u“ÍÈ`Ú*t§uL_Ø<çqÍ%-eITܼn_'Š%,)5�#¾¿n¥mâ"ކㅓ؜M˜äí çÄ’&á?ù¤Mðvùgò"Ã¥™R&ÏÇ�Bÿ 8râbPnÆkJ#EYy&•9dFXÅŽn¬™[bÕr^»‚>V»Ä—ü‹~Bm? kŠœZS-tÄóÀú µÕ$rPËcmOl*ËV1RY>Ì&©[©"ÍßG/x ÂM&×öö5dÀÙÈoÞ B̘J°QÒÇ�ÃóöàÞ5ħ)Ëú9¿M}¨Ú`´Ï…“ºzIË㕾n³{ëþ ¬Rx|`wšÑE$ðoèî¯wò¨„“_Åüå“r½{úw]hɓط—÷5vÖrÐXï"{˜ �}ÿ±”nÞëíøˆ–vÃp¬Á6}‰¿`}Áâ)œä¿Åó×€wI]yñgYN¤¢Ð[àÑOïÂözù6èCÖÁ„+ak�OO^0J˜¿ÂϤ„]s÷�zç¸õö¢ü-fÅeô`œrÞ·äù‘:=ù±›Ê½‰k•'(¤d¹±�χxÛ®µß}Ù_Ó@s%×9g‘k“p·#c· Ž”—¯Ö/Îc%!z0A#}71¢mJèòfÏ{ð]ÝÌ¿Þ0“ª„\‘%‰H·�ï0@¼Kéjn|îv2:<.ÎÐv,¬ûj›ŽO^º-­Þý¿†dØÍ³°ui«U-sn•w€¥ÃµÂø.Á�T$AÊ%×^(“oå}‰ÿµ`Ÿ‚šÉ»QG¦¦´ÐëÛ¯ŒäÌ(DZªWËâGã@ž/ò%�¿‡Œ­%"±ø™ÌÉÕ/€Œ“-ͪ‰$KÆ[ás«­&�§{«ÐëÙ»¶+�’%Œð¤ê�½±Çbð èG�òC`ñÆíÉš’¬)&Öàˆ«HÎ¥3h›‡*˜ §Ó‰æù†ã'paÄ@‰OǾ‘úß 6«)ö#{EÑÝîÀl­…Ý6Z8J«Å±¦Ö\ç�n5È)¹ÌÈ„{®ä&3áÈVõËÇsb¶rcÏQiÅï>xÑ�&6#pÜmSçMuËe_ˆ:?‹Ý;ñÚnÅu„éL’ŽQåw°FIÓ³ê%tt#(^F@„§Ñƒ�g ÝZef­‚Ì[R¼®RØè¾RN”*šèŒ ²!�År±hu”EΈüñ-ˆ¿öyßbäøá*ˆÔQ¥ï½é·ƒ} ,k–j½€cÓ†îsVµœ‹à‚üwß·N3‡neÌ[^º™ˆ÷Ò¬ —c&ÅY–cZúŠüî:Ê1¢Å1¢8�S�?d[Òù!Ó?2#û¶b-!”¦ÓÕ¾lÀˆÿ!½~Îýv!üQëˆ6Mý†Á »{æ�F†µöíÎð?¾R¿R ¨`-ŽüE¥5t¤31ä'ÞWùÀœ7òè‘Ê=Ú&t†Éãc$ ý þ–ˆø‰‡W™ož›²¦Ã‹”ÄS8I ¥¹»gß‹âKß9³Y«0&óö‹l¿7¾âÓ6?TVçú×çWñ•Á ŠPºÙ¶šÁ½Ò“�ŽE CbÙ‘YÒP˜6¬Äî4}ÝãûE¢a“žŽ4ÿªœ•Œð|â¨Ï3îüôþ²w¸eaþ~¾:)‰%ßþ ¿|;Oz9 »n§Ö·áú¿Q¶‚_>B…¼žÝGäÔD4êÝ—­mX!È%APi^œáqÊMy³ãµ„d³âáo‰6/�ä­ªhԲϑ8ËÝ�ûû˜ç#S1ÃN¦Ø*D£s¢_|‹¡K](*gi0ãMw¿]Ñ= Åɺ¨¼¡QväKñ�‹ËÅ…ÇŽ– —96Ï_8"h2˜’’íàðr1zÝeÚÏX2ñö2N0ºÒ¾SYÌìÑ–{ɈÙetpÅ5-–ì¢ä)_[Òg\_ZÝãš<³—Pƒ*²I&U_H7‹ÒÂTãIS;ÖMÆS'ŒSŸû&j„ç™V®f¤âeˆø™»F52¥M\Ñ|è¾Ï™—†Îé¾Àzds.ß{Îúµ¼ä§/‡l×lƒ—wÚïsÏIœGIÊ€$’VéèGíjéÏóØÖÖÍöÐ;ç‰;|Ê��÷Íz'¤8`H�ƒÓÿ{ÉäÎþÄzXîe\¨£·^éltD%‡hm-³×ßÊÎh·Þ²^1(¼ÎŒ8©O²¢K¤üzt9ïü¥§Èù½â·žk6×Üt_Ãà�ŒþGÄõöÖÝ¿òÒ9½0Zš«6xh_øƒe½ŸÙóg~þÞ{ÉvPòò7%+ÐÁÔ‰_öÎé˜g´5êö±ÞqÔ=˜ŽçÃõŸ&µO¾ät6±ñH~üû÷£¬o8ú¾p$„Wìf7W ²ZÐ×À, XĹþú}¼ûöÂ%B³¸CR(ƒéÍiª‚Î$8îr `1U…†2åö(ÄŽ,�¥Ò®q±uçRç¸ÿ�Ký‰ªØT˜¶å�%Êår#Ág+‘A˜%¤¸¢vÿ¸Ž¦»çÂwî°µ$¶�î7Fó<æ|R^5µ€ƒ;8–£cÚAIu#‘ãX,kLðR›bÑJö׈ÜÂ~bꪗƒgÆXD£é5Yª:{-­-ñ" 2¹ÍI�ãz1D�»¶Ã·p 36êaj‚®ÚUà×øX=ï1þ(¾¾MÀm 42ïÒ ‡õ«>ã¶é/¹�x„z…ç² Ô Xð½xÂ:_牧š<­ÃöŸH6Ã¥Üô)rÒn£!D�ÃÇÝúèG/©Ö­õã`Š:ò@06B:qíñß¾ÐY ï9ÝËc^áÐ<‹?ì—Ðñ1xÅ'­'®í}�Lv4Ê Êƒ"‚Ê,_}yó¿‚ùŽ}òýù1�ZEÏM™$d´ZÖñáÍ,Á³®Ny‘91éø/ä0NHßl'¢ý¤€ÅÜ • âxsé�èÆõ€–¬êëŸe4ã©¡éGºÆØ÷áU�F8#¼Œþ'ïáW Ú[\†ã¯�…o‹ZrÓ!:ÂÅt©+¤ÚšrPNy?Ë7NÔTâŒrµ¼^šNòÝy¾krXÄ].ƒEKœ^ú©Ëâë²Æ/}O?_»ëkg„âÆA?åOŒ\mxÐ>aCXk®¯r€i:©ÛwÍï¶ÆWkª¦¹“§˜Æ„¤!JÝÈ‚/xÃÔ{ðjDªZã �ÙýžÐÑ\ ìþ±æDvQ›ûªá»[ÀƒÝaˆBaHyšÀn¹ù½%°ý6O ç‚#Ý[ce!÷I϶Ûf:·M£ ~ÊŒØJ¢¯’»ØëȘ6y-Â`D¡j£Ú‹Íý‰[ÎÌgjŽz~·x�–Í%‡áôx¨Ëh÷oƒ3’ÿ¯ð„v#Y»Ù²jlÎbà šî÷}XeÄ éãŽ-IG#Ê’h¡"Zð€lJÂó bN7fÉv-K=´3þß?lüñEàÞb÷—#É÷ÉÃÙó� Ÿ‘S¾e3Lüë§žgUS£ ã ^=É– Ñê‰ Œ"ªFtrò†Åj«¨Ì¿pj^mi±E„‡0³­´fŽK>Ý›‘3áï`ë»Âu÷ŒeœÓÖÆ#�%eÏÆzo(Û1x(‘]Õ˜:Ts% ð… ©VòUÆø$%δwé€�a”U¥xŒßˆØÉýæa‡÷ 'âˆ<žE¥Œ‚+)ZÈIË ðŸ‰YÝ Ïš#þjÓ†Y Õ´FF°Ïg î7©2¤ Ïnÿ1À¹û¼ 'G†1ãl¸:Muô“>ׇltnô BĶÎfX*˜ØÂC°s �l!\ðùaâ½ï–äu30qß1ȱÓVfH㊋rF¥vÜ06?\aée/r®߉MhB óÀâùíÛŽçísí„Ë_-š;Ù¸>éG=¸Ý”~­·Òe’ì«ý\”ôÑùå‚}dÙ%Òå>ýìè@‘ °–bó¨4.mZ½™9ììLÏÛwΆÇq¥{î ¦üÀÜG"�T¥•aˆMÿ'ט&ù˜-° ÉuEzó­E%óÝ–¾ÆošöëXÄ”ü^¢V®1NÇìà“a7j¶}º¨ÃpäßE+¦�4yvÓ>wµ³´>{[}t$³(ׂ»õM&6îht¯Nl^Àƒ%4_¨ÁÎ]_Ï}þ`?¿¤w…¾oKkX~ƒ°Ÿª­�Rܱ¡÷,Ú›^X³{ëÔ÷^•·ž3ãyîF(�\ kŠíb=Â`Ö¡èZ]nÀý#d…ªÞÃØ1]#WîG²X¾qwr#L©m^ΔË6à%¿žLÛÁÎÝ*DJUÿ±`2Äü9[*Ãm¬DcÆ2¨Gð­„p¦˜ÙíÂqãZ«Ü˜Ï¼¶…}¯¦CZÙ=·ï¼æF6™¦M[™Æë]ÈW·wÀ$…_N»‘=/ûgíÎuyEÏ_ÄlÄôý¸üò„ð(½X|ÞÖSí¨q9_M5h„õÍ5fðSÁ)ª`=m‰æQI¼19 ƒ;n¬a _#ßõLWƒ{Õƒ�äé >–\$b¤£«$‹P›�kÃÂçMá‘�G0‚ÈÆz^:+Xáå1rñ¥›ñ\o�¸ÐèÒ]¥Ò1ñæ†A]ÀŒ.3„�–g²õh@ýpŠÌ"0£Š¡ƒâ+'ýºþþ{É�–ˆd%îOz=½èU¢¸#—·œ§ìrƒW)Eƒ»´#áwx8<êdñmÒ´©à-„ÔaO¼W@ÉX”݈º0«³:ÒÅ"k–-u$ã"ÔÛŠ5ì]QqX`㓉¥Âîõ¨÷4º!¯0y7Ðÿä V¢X t ­‘|Öœ{Ò·ƒAp ƒI+Oj’4|éÎ--(¹1�-ÙËæ;Bg¬:2rBl•¤oUFɼ&H…Y¨» [™#’1Û²[̾¶Œ©·{Þíº—+y„ê�sv²î�*œ¶!uƒð¶!Ù�ú50\^ðÞ_]qî+µäœé€6GÛâ+<ÞÇ­ÇóðµpGí‚fæ¼×ËöO®‡H�G‹§‘åN\–Q± ôÕÍÒìó+Lå †ÃÛîý¿^ð¹EÆ” +Ïzù ÅŽ”Ifo1ÀŸThZ¥÷×ùî‹E9 b"àºXs¸÷Ð|�_Òàá³qB‹ñ[x­£·8|+"|õ_kÕZ�œ¹h2Ø+’ð—Hä'@ô�l�3¼b½{ذ Y2'Ò+딆Mz°ýêUáír(rûÍT„ª´žH+â¿iôóN?¾Õ£œ€ÂÜa¥ì êâ|Ü>!©§µFWÑçÏH„âF½´¿Ë9RïH(�³ÙÄG·¿²#“v�JÙß�û­Å~—“ÕUWOôãü.½z6-±í>¿ƒq“6Zµô@ßcKþb…–KC±àÁªÓx)‰+¸ö/ÎÀÂõÌ<è.ÿõ[d/‹ëÊ5 ¦MbÓé•>)5S”µ«Õ�ÿH„ˆ}*β¿gGfû—‘’\:;Ò'l‘ìzN6Ÿü �WC‰íÁ_VdžxÞm•›$9x7É ©Þ*t0ù� B¡udË„¹rüCGC×Ì[0eïºõð+y¼Úïds¤?&‡lÛódíÜl Ä Ý|®¤h G5'dPíñu˜¾ATâë~®º®ŸÃs–Æ�ƒª—öi¾.â%õ}èwDž}«!�þû¬o¥þß7!æÅÿ`U—»È?–��m2/£GäjœÒ ËnrªBNÄv¢çó¼Rÿ0B6ë|²æ-§‰iWš€À‚³âMq�Žísã €÷èäëü¿: T2£h0)Y—A¤ îáîò jáo¶,ÐÏ j¶oK÷ÚÓ¡¸¿ž+ýàfD ì O×ò®(šTÑp‡@uÈA­8úÚ³Žb¨vw½æ=.A-qTãÈ žV$'ñ@$>þzbú£׿‘v‰ÀE éë‚�zø‰׊Ž=å˜Ú÷2{_ç¡ÚåúÒêWœ×™€µw�K6q¢1z2“Ìh:àܽKØ w.Å2vrÌ8ÊŠ÷R¾79ŒtB7ÑlË´¼$ÎŽÜ�‘*Š¡ÀÞ]m6�£L¶ çä VÀÜsæ×Ó*¬·I.hÊgÆ¢Î7œrßOjÎ2ž˜Ù‘þN<àsñm ƒAºŸæ’\{zæñ2•‡€yøb£Û¾N¾Ž1­5Ž'ícfñŸxn™DCQ(êšÔ'ZŽpL+Xb¨ûÖö÷Åö‰¥ËúÅæ“Ñ›Çà,Ÿ…ô+ϘɂΙ”-±¯Ç.ý!YO·Àælá „l.äæ! ¬ð�ÇÌ'IJ¹ÝÎoü>¥fè¶áôNE/vüðsþ_Xýîš,:'màóë5ºÖÂ�u}6<%b[+ ËI gÆ‘ôˆñ·AsL롽ëÜî¬$I±þƶ O†œAcðâmûœë×�–�MÚŸYž\n”€ÎñÎA?8{�ÅÔv»&ãh—}ò×îAÃßÂ>w>N^ ¢²­J±8àó.%’qåVŠ`ä¼MÌ­z’'ùÃÆó ¹f§ƒÅÝ�–…¸”*(Ž-Ë+Ü âêú-+áîù÷HW�ä¸QFÄøÇ¤¸\[ù…$—ÛqÙß»Û~nwÝCŒŸ1+×v.ñ�·Rc˜�=ëƒ ßÂIjÿÃX;²ûcHV±¶ƒþÉÌí.W«°!ØÆ)þõ£ »û~w»üñrÕÿµñ`´‘xè´aþ?µx–¢÷èCÔ$ýï“ë¨nÑ{†É-¡¶=ô5óõTB—4rFHÉ ÆœãÎcÕLïÚΧHe­ÆÅ±Ò(£ ¢JŒ¡ÚYiÄÛO°n@–a¦ýmåhÏs€|ê>¸˜^AéËð„·±Ûò‹p2:±Ãw$‘rµ4 Le¬¿qW0=yÙ=€$†É¶§7æ\'——u�r3-|¤_uÒ³‡á�•Ç=€1š•UÈô¯ÖæÍ[Ç#b=ÃçY8ÎS=|až[DRÉ[Ú{Ì�EðƒÁã]D¶PsfV¶ Üj‹nÖ‚°++{çß'«·:èðòÀV²>sw0öÛ…5'0ôc¶\õcž>2VÙ7ra\Ã+Š d4l nëŸFa5LiTÊ…DFžÝh&êîW|faÿqç|àg~Œý·¬ ö—Íúêž´�wð}S‰}˜ßƘEœE,q#Ô{.}9ˆ“[NŠÒûLO1u›˜ý¤ô†Û„ ´øùÿeȬN`“($~{�‚¾! Å9φd‡è_Yà씸ߓ¨ +MX­«Ý¸‰Ò™¬ðCé”1Â@fAÃË…÷t²^‡±ƒHÝšy®qÁ3ÉÇIƒ— ÌVÙ,9Þœ—…’›¥ÊÅ0ÂLºƒm)h/1^†Ãð†äg·ÈmÆ-L71çC·UÌÒ'”—–äžõ¥m¨J1ÝÛ† “sh ².�ëdMáæHrùÖúáéɉ0Þ)v~Ãh©�r{Ùȭ輤ڂ˜¯¸cÉò+aqºÿ’È@° a�ü�Ç{®]+Qèüù¹ïRß=¦ÉôNí÷§mjé^oÀ¦—” 7R(!%f> ÞsWl÷…8!�ŠÎîASȈ—zîÅy:¬=Óº÷¯Aφf‡ó KŽw|ÈÖÃh¿!ÜÎü96.�ñô—![Kù(”Qc!æ(ÍŸËÿ‹#ü�Õü°SÃ3_zòvÒRï‹[-�'lOxkß*5 [:Â+Œ�r°qµ²XªÆ Š”*šú©º-,i£xÇ…~~«Œò¿5¹p”H`¶TdœÉ7l˜p(S"RPPؘm<�°0óÂ$(Bé{Oza³âÎø•Ã]d5&ê=Ä Vumš)J¹„4qp¡5ºd1’¬­‡ CÑyጄ <†#é<kºÀ,ve§\ãLDÑ4‰Âo“²,_Ö©ì3¦ûâÞZý, ÕÔ¸ó¶2ZÐ,-÷ %‘\Ÿ Y ‹á¬y@d<ÛøúžÝCŠÆ*ÿBñp‡œ_ÒÙ{·){í¯ˆÒ¦í›Ëxøc»XrNèYà¡'¶À‰ï2Ö¸W™—3÷§=€Bü=…O½C3GnwîSù)1�]À‡k["P^c:Á�®ôc·<Ø”²él'ÐYûf"Üpª‚:öË&Ç�ž\î…¢>\JàF‰†x‰ÄXòÛ¦¬š}æqûî� úVÿkÿZã¸-ÏÙOÞ ÖBß™oÀ ¾ñÆCvƒ�–²1W¾]¾¿/Cœ9¤è;ÙÂb¥gF·ŽGD6†ôû¬ÂŠÝÚŠD�_Î!=ð8MCK˜ÄÑ© ?©Û¡� à0¸0÷ÝòóP4“ÛÈÕ”W|“ù!oÔMßo�m¢Š5·LÂãT ŠÃ œ6W½äoq‹ëO´í)m×HŸzc×Ù(¦‰"ÃEgÑhœt»Éœ$DHqJU bT�2æ·©¦•|ÿ£xé¤Ì富¢ýH+´-L®pá*ùv˜_ô>OÞ�}”S¶ÊßddÿÒÞ—ùd¸Wñ•ËöŽÇ³ÅŠŒ8Oéþ‚vÅ´Dãu²o i°d¼ËèÄà‰‘ÑÄz{ º+ c“‰ ëh#@x“Q­u­XD²|Á´'w€»Kø¯SÎ�æ¸Låu±ĬÛW’:,rsbRç¾ï�íà3ñ ó{xÊ6wÈÎdë Ë„2ÆÒµ°‘ô[g¼ÐãK,^§JÒ<Λ%ö™c›ç¦ÚÝôìP‰# “¸÷É#ûÖt5§þÖ�<{èÛ±¾MùùVÈ2øfL}k¢=Ô78Ž^Æ€l5Z¬*“HiœÏMôÝ6Œ²é�e:6dÝq¹×žl²°uv=îÍûɤâ¸z±3¡Í’Z[ìÆ‰«IPNXÄÞF›vU6'?i ¿ß–V>ªÚÞÑsYw4Ê-ßôÿT¿öå+w¡&K*»i ¶e‡óA’�  xJ>c´¶_ÆF+>nY­ÈBd"›²;¨{õ¹ã½–¢ OjF Q’¿ù%›”;ÄÄ[E“ãtöê(×ìY%ôH·Bgq]"2`ç§e-¡¸W¤ŠTÄ”V/ð¿§ÛvÒÉ.[·B#yE=¾½½¦^þw� ‹M?*Ϊž<²GÏ0zzµÚ�O0E“ÿ ¾¬¶2“žÐKèõïUó¯üR€�÷˜ZT�ê:V;‡¼/hRçþ (Pô_=ûÍñ ÌK,v²@$€©·ˆÏ!åÎV¾E»ÖÅX8ëeŸÖWéŸòo„?Ž_#Nës1~+±R¬É#ö�íß ªÑñ,ëZ4|z/ø ç¿Éa£œ†)Öáþé@ŸÀeø2˜‹•ú¾XqƒÓ!®1`ºÊïÎûøc�[F<" Mׇ‹Y-æD•o/›_Åÿ=VéU¢�Zä~ BÕ9wÆe°½«˜¹«… €$üÃT»)=ªº5qªŒ®Ð�&¶b žže£ÇLñ³Ê£Æô'8-ïƒBpý•­¯mˆË.åh,Á’»±¿õÿ\(.më§þÌç¿€ø}Ý%ÄX.™?]2Iî—ߟ= S­Üg{ýVHE,åŒ>f¹Gm J\Wv›�&‰TßÚ‰|k~Œ{n ]wCžKc™ ìlëHÙ\Ú³âßË Ç�…ØÿQo¤wëíj¢Þ'·Ë¿¯Ÿ—L~n�„P66A}ŒgÚ„Ö}<&òwÛ…×èa÷Æ ˆ¹( t]ºK¯.²]0�º2˜bSeKòÑ:{휅ô…²|ÏÖ´×~@ÒòW¸À”“�v<†ŒiòL÷ fï0·µ†0õÔÀ>¨xò¢Þ'9¶ÌQ²HäÃÁƒâtæPVé7�ŒtS"—I_w~³lôh0̵†Ö�h–åŽNnþÜÜŽ«Æ]³üÔ]V[¾o-PU4^ë"K¡n…(ý¿/Ó…Žä¾møoåÎ&Jè·¹Ô»Tq%Že>ykåøöYï�uÕúÞW2£Z3S_à¨gÍà!3ÍVÞ61†k8ÚíXï~ «³�«Õ¥M ÏyÍÑLÊR¿"ÅúOU„J}ß?q~î®4åË÷s�"Õ(߃sÅ܈n¦ìQb:&‘”€Ð¤ õÊ\ðàÖ+Òõù^–ê ô}јj f44úSTçC�ÔP‰;«^¬-Ï?îû"F;”tÆoÛùXŸqæ­€ÃCÕïbñ1@ètAoêQÞ� ­è{ócY¬X+ô÷;ÚD�¢_cPelZÃ Ž‘Mû -¼_ÇÁ^ ˜»©¥ý‘xî}á-šÉ�F�vi‰…³»îšå±á—¹Ì­™ÃŽÑ .èİ6TC$WÉà% Œ}‡&îü¦¡åWfú<Ú–¸}ò! ÍÏ$]œ¦kœ0êôb×N1NX¡œóèšl6¬x„�Ô'´Òm¤"ÌÉ…ZYÖÛYõ°hó},aÓ^!åâApeÛƒ.˜½`xš’ÈĦ`—²„R]- E�à°‘œ`R&w7�F™²NÛ‹ÿ¡CøoOxàø‡s3ŸŧgZ4,W–q#H®,< 7Ž$Þ¾P*Ø0ø?„[%I ïŒŽ£9(HÌë.µTÕ¶^6m*.¢K ~¬ë-¼ãÛ¯4úl’:Ò�û”[`5.Ô° ]Ù¨’áîLC|H®e ³�Uí»ë¥W-ë¨ÑÒÒ*©¸·®o‹>—7“ÙbN$ÅÀôï†HÖ/ëš$Þ’Ò_ÕY [|ïF‹��ý ^îËZ³ä“Éjöô†‡€önKNÑ¥÷ÞðNdŸ˜á'Fán ý-5¶È¦ªw‡>gKv¿ã…Žð!æ‚ —IÐí0Ø{ç«Kotq7‹e{";è"#çs kv$�œf¬ñÇ…z¨Ä|>hØ”Ï}�î%½MÀ¢ö&®Ê]]Pro~6‹MC&jh ›ï%Ø¥%WÞ.{*£]å£ ÕÍBT<Ö*sq’оÇúlé�Wáà¾ÎµÍ·‹ºä^9Éö“¥#ÞåHÞ³IíMûÄd¾\-�³÷ßqç/Mš.Š)ëRüž’v›Üé_™¦ß·BÈ�æhuÏzjïÅ«Ü4´£&Ñ–!Ê5‹â`ç-[ˆQÅóÎMA`ysÄJèÿÞ“ðéÉ×S-â‰E×úÄ·8†`–Q¶9g÷Ý„[¾6@§ægŽ7ÖÔyà›{ù}o»C²`Š˜`áà?¢+טžÅóY‘rÅÕÅÎÃ]2i<™k+ûÆÑdZB Û+!ŽwÖk?˜±�äéŠ%œ:sý‹CA#Ìåóeœ½Ñ®EÀÔ’\¬]Ì{ Ð‰C4ü%Œ#°‡>¨wõEœ•§5ÌÉx' ¯ãËx m‡ñ .AÚ‰ùƒ¾`hŽº‰ø‘ñYº&xë÷º/» Í˽b+ªaá�;Àö�‚Ê>HRlú§à0ÈÕŸ¶qÏ¥kø[¶£[ZÙ¤>Ú竸ǂñkóÝÛ÷{» §œ~.Âm&nj ágn²ØÐ¡\ƒ^Aðúü¼ýÌï`c'ØØ@7Ÿ…Û;”ºc–øººç(¹ÉôÚq¨’ñ�ÏR¢|ŸXƒ‘ ¼Ž)]Mss÷"û^•‘£áïÍÑ÷G~{ ÛŠÏ«ÔÎVô`ä �³ŽøáÕX¨(ÞºÝ�÷.zGUnŽÇ*d9f»¡ã.Û Ám{¬ðëbC@l^nz¦³L· ~RÃgËæäo*åÑ�˜äiJ® }¾°Q…"w/¯AÁÖîÒtkLáJ•¿·±Z‹JeÕÞÕ@@¸ˆ ý•Ñó+³| wx޲ ÉV1�Xn“ p’ÐV’M›û3šHñ1o§+8Aì˜öhßy<ó½l­oQ_Y°×l[lmÌÙ.Ñ×€ÕˆW3Ö�Ѿ�¹‡ÂƈÑ� ]|†|W“¹ÜÑu}Ü4ób:ô$áöžÕ„Q±‹§h7�Œ& ý¿ïIBÓï>i|oõ‰•Ò€¬ Ÿ.ÌoÑVÌŽÈó;Éú’J„ª~BßH~<;¥ä›wU7+y*¯çz„j“æU[ ıÌåËÓŒwŠ•±ÆßÈkʶfû;ŸØ× |.EçOwñ¶ïÐlqƒi1…þðD2FnÉôCè7N`}Fd^:³§V2§À1Œ-à×aó¸ö¶Vñg©î´‰£c2Åî ÷íÃÉ´lýóêÓç�cXÄâ`šÕK Š;Üõu’Æy‰$™ +eàA óö ¡ï†HÙuæúâ+Pò£R€€5â=.Q<ÆÆõ§@ç8èõVã�Œi_Hž@Un0UVœã©Î— Á\ù¿2Eàî£2=ø ÛðÖvó«D3ðûÞ3 y¿ С£@‡3çèוœÐÈápàæ^I‘îþô(ÓùŸ}öÛãEÉÖ'޺穵ÐÝ__ýoÏ ÈÔP5ÝÑ}‚úøóµçøÆ›^>yôGâäó£ï/}Ú®8=�hš®føâ‚¬b¯hËèvþ5 ³íB½ù™'®díC–¸­,°Æ,F0ˆ»Ìël¾Ü„ÙZÆ1ž&ˆµèÚ6a0Ý�k•1Å "U-G¸Þ]ÈG̸ÊÐ5'ÃLk.x8û‰Ö²Þwa†_Ÿà/͇áÂ!åŸ=]ÑŠÁ››]MÔøwñF<«Éþ|}£úÕ�5µ“¯2¾yâÊÅè�ób-ÍZ༠j^swk¬Xg=H`©i¾ñ†Ê56î�Y¥ óoV°ýrâ/×ì è±èÎ-Æ=¦zCÏ]h'‡onj+gèÒ >xÐ3Ä0�PûÖ•ï¸o°NF1DmÙmŒáý:Ç&¸Š‹tJDQ—ðdù1Ò<¶+z+AF‡>m˜“PWî:~§Ü¼ëâC"ðÍüo=]ÿÓŒþa5¥ùÝ)qÐè{îûöÉýüÐT‡÷O‰)’@Ïuꌒè¿cñùý4Ew¾Om¶œMsî&£*âYåŠ.Sëƒß¥27ÁÎ#ûÎ-sÞ§ê¼ À ' Ažú¾Ð�~ú)s¹îϨç5ÅJ šôE;Ú "³—…6n|Tu0·^H&¢¼Ü ¦21S½{_žžg·HY5J‘ùóž¬-ÞüöƒÓŸ f—û˜†ããP>õë©å_=°·ü 2®�èMQK# h³*©ÒгðÁÄŸîÏmëí:ö†˜bÍ>Öµ¹ áÙðäÿ­í:bê)©�â\Ç3 ãDWÍÌÆ¤¦ *Ýû¼°¶¬–pVúVÅ©¹»Ë*Àd$A4¬¯F”…Î$º@¨ØÊ’òHe®„4`#?פ‰ñHÔh )„�¶^ 4Ò4Õ‚Ê•Â$dÄxf"–r%ø°ýcø\ ’ðÆ¯±ëö†Ö­øXüÖ9iÂ!ÿä=ÖB„&ZE„þ5Œ¶HÈ1Sû+m“û„ìg!ã eŸZ}‘]6§Ñf1—¥„"ÌíŒå.MEux)¬C¸éÜåŠrdv·Kû!¾#[lX�+ëQðùÂ3„C¥~#XøZHž)©úÝÞ®êÉ >Kì^¸pÜuNZñ†RCË> =Ù ǨÉHWÄ"xç™×4PÔ•X’ Þc•·óÛë¤C‚WÆxI&7‰[š5’|]1ä*I.÷of— ~åäÏÏL hi>Ï+E„çp"z6Æ_¿#G«jµÆeˆì³q#��EëŽ8¶5Æmf)ÀvÌìÆPÙÃ�!„YJ,•D‡rÙ"•Î Wô™«£Hô°H´XYB4–æÅ-Ò$bóÚ¿4cC‘sÖoÚ¤¦„”)Õ\œ,£‡ r.†XÃ%uM0¬Xºš ÒBJž¢èw†½K\Ä®®owTÇ,ÎÂbLŽº‹J13ì´µ¨Œ¨úAY/Jø(”ÖâàÏ+I‚a³HëJœAŽÏF…çÂåÝbNüLÆä6žÙøïÛƒ8’?õƒZßHç€$AJpoeì]FëåI¥Ãf… lãÇu$ÄúRx]¯Ô¿¯©ƒæO•»—©Jùí�ݳעîok…Ô$¥ FyRBå þgÔ DÚËó?žÿì>óJ¹ºÆKÓÂã³ÀŸ¡è½©ùâ;yy?ÛU§1ž&õX¥ë9�ÍþíûäEvƒ¯[{c�uŽËœi¿Ö¦’s¥õ·!1œ´7C{¨•Ý»ð‹Eë]…Ã%/è3ùr¨Ú¬dQÆXkÉ"b‚*rÙZ ñƒ’ëç¼sÜÜî. K¢Ia¤.à„Dש0ãÅU!¬/)‘Ûße­äf‰yÈòÈ‘æÂÝ[Ÿ8<ä†joÆÇv¸m£VÓoФ6™Ðzx¦W;‰iS‰µµÿÏëë|Á@Ù.mòæõˆ9`C‘¡¾y‹ëìV`Xh�ˆ¢m½Œ[ß`F1µÐI¶c,²\¢žÄ( $½ÇOã³~¼ÿ¨p‚Dá­é/4p™·½þBß ”õû^ÙE6=fñµdÌ·-ƒŽ‚G!Õš úòó’ÖÛ½ôA±íÅïoÖóÙµð=ê¹iÑ&Mv8áKïÅê¸"¶= ëd}q›–ŠÇºÒƶ½ëçZٖݯÈQAcë=AJ©È4cRå[¸b;Í 2ÔÌb‹š�8‹~Hê༠Yk�I‚ sÂ8"2ò¶°¼ë®øÈ y-¦¤^Ý9ÕeÓžQ�e(î¾x0ñ3ÝhÝ´>+ƒ‘¯ÚĽšŠpsÒ)©©ŸLtÓ¤WpI .2Ü´DsÓ‘,÷–@c�;èBdÔg[Æâj°l,V¼ÓtæãrO�^¢ñ_/… ”qŠ ¹nk؈ò¶žf÷v!™8ŒáûuN…ƒ¬¹ÊÜ›H©¦t\"O !Þ§þt<š&å.»ãcJè@Ü×TæY¸¿$çä稣áJèû�½ûg/ÀÏT ø¢þž¯šZ‰?ÌòÜÛ\¹à,“+}Évl•ì…Ó-—(gC�ª^-ᶘ°ñÃ7Ø="kÝ&[Z‹t8Copø^Õ”˜é9:p·#xßù åk<ë,b•:ÝýÑÑè“1ÔÉd�ñø>qÁº4D€ˆªÊ¾(ïÞÌz½s÷7ä ÷fy˜™n_÷<¾}݈؉ñ·w°E"ëšÝ+Þˆ/]:µ³ �¶J`–™ÞRÎQè¡�˜ZÂìu& �å.3K{ñ_W©ë'o�^~!ξyµ* ÚA6ûy`¤6"1ßm‰Œ‰�lÎi ‰ôa C88ëÛšê3ŽÚ×®‚wµmP~’ÐÜ­%t»¼�Y×™î‘;<*\Náب@En :»™ñ;ÙC';È+ªµ+Ôé WÓ 1o8¦%©ºÕžÌž¤ÆÜïœ2ù.¥ƒ~ø™Ç½NåZªúfâe—Õ(¨›÷NY.B®Of÷Üß1bq½¡í Íæ¨~Á`¿v’P84]oñ½8vHO;èÝaY›+�x’ƒßµãú;ÌøÊ‘Ÿœ¹Ÿ­ex�ƒA—½q~ÐÀâ¶¹)cx,^4”�3t&Þèg£D› qT¶neÁ¡£NuÜkEÒjûDol‘âì¯�Ë7�#¦Û/¼�öÿ/Û$°1?8?J3˜¿°.ßE]Ò†ºÈ¹¢8Ò õû™MÖáO*Ãz.‘ÒA {âÂ9rx?ðV·ˆ/%F¿{[™Dšž>^™»Mš²&¼<6ƒ�›º åäz®ó6H�9k!Æ"šÖ Dp‚¤lÚÑ1  C€Ù{',� —Ï6E&Ñ –‚„ Ì:0ùÏÕ¶-ÁmnêæÅDªotû–ð'||Ž•· �‚¨¬b}Íí‰nsdÜÆF :ÕCñ¼V‡‹xÍù²8Ç |Þo ܹ ó÷¯åNÎWËÓø=þäûó ©ýÄôŽeu°â/úö’oDïšk' ý ð…aû$Ë~^j·ê åc²©÷φ!„ëUî‚.E‰ T¸Ï¸“âŽ{QëãpœÏ�ÎOYRIóÍsoÚ,é¼Ð^&ÿ÷š÷Ι伣mD‹}tUnþ!ãpÅ.!.˜öGkÇeôyÎPÙrig„¯8÷�³}zzì«|wN°¹°¸!ÀDÈ–þÍÜŽ€‡uç̾ °‹ö:~êRú~/¾dѶ§Ü‘—)<Ñ;%ïm·Îy};æÊ*âTÖ¸�¢)sD{£Æ•�&¤ÏFž&xÐÊ6Ÿ8q{hˆBrz„Êü< ò"òÍüâ)A û‡{Æ‹‘XQ|Îñ°™v×4 q"Mùµ×4ÜØˆ—E*É‘„ÎcÊÑ›å$,‰ä"2RGbt®Û#Üü×1ðÇ�{$¨éI¥‚mbe¡äç,0Œ¯¤uPʸØ?È"U73 ×¼ûßòÙ«'+–²ÿ‘Z#¶Aß :}6¤f9•t¤ F´&ÖÜ�¿ãrø]#ïc'9¼^Õà¡Ç¡7ë\1}«¢ ž¤2¥FÖ Ä>;ß¿‡­žÉ­cé=›�€¸¤èŸzC ?㢠ú(þtÁu&TëmQ,[½jp²EèÄ·þLw™bÖ2 Ëãßê«ió4j cŸGÌòCPvàÚÖ2€GoËž”Æ{ÑÓIÐ1Q}§¢åY·pÚâ “%18P 80@‚�WÒ÷?ßÊÆ{òZV?�I&ü÷þ«FûÆßj‘ή–XuºÒ\x"4¾ð¹Š‚´cCoG茅ò}o^ûãæhãý£¹Õ‰�¦ëkE€¬ÐlqX·HLB ´Y^Úlš{ V;¿ëF×”’tìŸÖgþjŽžt¼@¦��üñìl¦“DÄ{æö¹¨j2êYR†�/kc¾ûo£;q&7£JUH<±cºà·²þ*ç?®±£Gnÿ}ï¿&§ˆÞUŒÝ.‡Iy«íp߯r �§ �]W,›$tĈóûåÆÛاº8È4,øHþ#sÆA†:),b0ÈHÐÄ‹:âê¨ô³p®s2¤K›¹ lÇvˆ¦üªª¨„ï…›ÛMXŒ÷w9òt1¤‡!Œm±¼äÜ�W_k'Ø~�ŸXîq:}±U÷8GÆ÷O’#|\±Eà²Ö Až�x2Píä˜Â†üô€¿*‘‘ä§Í~¾=êëç—7´ÖÔÿ½-5%Í©oºÝ úg´#(ŽUNKÈ„/¤¤ àânœê‹sâ�^ùWûç$N#%vM꿽 =ëþš�«š.<©û)B¿ï#‚gúcUêáfÖȱ ®pzô?fý¤¥üRp–ê¿g§Ï€‘3[…Ç»’(yóP›ü&o𵳦}—¾ýÌ6BV‘0ß耟׾áä3Ž´s’ÛUcðÒþ¼bœkðAk§ùcJ·Ö¢n™ÝzZL›?´Ú'S‰ü‹–¬PÓmŸäóÓ¢yýï<ŽFZz3;…(ʲ×Vs!ìbâ"p,ÂöÀnÊqâ"AÄùi�€�D ÏVr€?ÚÃþ-ÞVy±•{ã­’Õãß&ðï~™‘17Á¦þ#ƹwCNAáîr…@žyߥ­¤3oL‚�¿J�o5 ÆÆ¶ˆIƒ@Ø6%Š Æ?΀ÃÛÛ{¥¿”‘×¢µ¬¼+¿#j«Ïh ‹h–“5”yGEU &…Æ}b;- %K§<šÅ+ˆŒéz¤uz¤ó€ìHˆõ?/[Ÿ“_9ÆÙ…‚‹œ?ÔgB“›íÛÀÞ5kßò¾¸ùû|PmùÁŠ|x’c9¦‰{±/m¿Jc¾2ÊömÞ_õçù‹³È«R6cî 5<2™Ä,½˜éÖOÄ<-TàlÌé–ÿh�8'oñJR°‰d#.}Ÿ ÓÔ=þƒ¨Sµ¾~{Ò_[,¾ûÝ¿˜°Æ×eS©ÁŠtøFÑMˆ½K/ö\à-„^RÅ%àPF-¢rc õ<цdh~Ü$ª¤ËÒƒkï>ŠáÊsŽ@uŸµ´1e°÷áóMæÊr¶=é"åÒ'.,�¤ÓC—ûó7VÿçK,ÎdÓF.Èp?Ÿ“ú0×ô³¦˜Ã‘W¤‰­¬VnsÉZãÂÃßM$Æõç³›ÒDKà’÷‘*Á<ß~žÉCêîΧŸ^¢RJé¹ýHƒ$Ð\?\Lg‰©�ædW]ù:�s \²±¥m}F„Ä» À„ŠTW&<¹cŒ{3ÝË/){œçÆÐ“Ã’nzµ¾o„Ý ÎΙ7;~ÖwÁ‰êª/w~(ƒÆóå´ÌuÝ×[¥ÓmË6žé½±_4gˆëܱl$Ì€¤3`Ù"„8Å„CG­Û£ï”ÄȹºP 8b?-þˆß×MŒž!§Ì’>M¾">�Ê÷È9ú #¾öG)¨ÅlÁÿŠä±ùa4\B} !Hº ôÄ›‘Ff‰)}qaœ„´K‘0èÓò°æ²!u@,ÎØ‹ž( Þ javÝ ¶ —�Ne€3«@üé%µŠú¨”Л9ÇC6½UnÈh·Lºì][ƒÅ®¬O%-¿÷´«nžÝÌOløË.°R�Ë-z#iŽËqr$ǘ^ìH— ¯/BÉÚÿfG-Ç€ð†­æ×+è›yÒëX�KšÃ·¤loåöˆ¨µŽt“˜žœb­6y0 'Y¹ù|¯µºÁù´åcW©öJ š¤µ`aŒTœŽ# ­„äZfB§-蹶ϻٗ<ùAQÿ°>"^Éðœ[³{@éIj¥ÈÚÛXçŸ]ZUäaeüœQ®ë€z Öï8¯­“%ÃØ›w—Ù†öxß­õczîƒÞ¬>õؤ©ëФ �Ei…(`èŽÛv‰5P©u«FˆÅìTa½Rü: È»T�ª™n繄6ž"b/ÝÖ±üká^W“bìcÏñ¤aãÑŽ„ wë)ãCïÃèA†·òφQòƒâç›â5µ³!œì|ã¦p8h³Fí"ì6y4ªÌ>­-ûГ&Ío%XÞ5‚&ã�« 0èÑ6æ”nÛ�¬Öov�éÛµ6z¡ìÁÅs ]�~ð*A@Y\„?\D0ˆì4\Ð^é Y:ã±÷{…ª¸¸ÎÒsÏŽ°ðcR 1’Ô7E2aÚc.c”ŽÆdà×àÛ®¼Z±ÚËJ‰Bó’U{Éð[ˆÒéRsÐè°¸›ËÇxË 7ÞD,¢´=ªÞãUð§9~þp¬‚À?ÄNfg�~ùA[ZAâV”Dª$~Úy±¤×îN_qõ¯@ýd². Ò˜}[Iä÷—Tü<ø¿äX:)qžb­e}^êvÆÚØM³Ú9ÙŽ4¸h‹ÖÕèlѤºÈÆ,^¯®8—÷�ß¼Ó‚óÁïxWÏê5Õ.©ë”qGˆ¤I˘cçBôóJ(øg“%Ùëfþë>Ët³Ôß!Ï,�N¦–Khâ…ýü¡AäxðnåÁÃ\ñ³��+u$s];…F ¬^épŠ0g…Œ––ýü{,V Kñì¯ömÈé"0þ@€wâw.§qJ´¡­#x­cMzáÁ8Ç„NÄ�oíz�¼Àfžm1½ÈŒÁÄUÅÝ€a((NUÂFþ°û*¨6x/ˆùÍÿ¶-a V\Á¤‘JoS§9)ß½¯Æýc#œ²bú1� J " ¬'¸z³¤ÕvÊѼÎ×rȼjÈ©"Þ�-E»~G9”‘›ŠEï#ŽbèÖÌ["!0áEž9-›AVÆÁJ&íqR¾k±âˆŒíÍ~LÜÄÕô1~ÆI< ¯ZãðâÈÒÜ�:9�K-«yŸqÔ©¢Ìtùö;Šn"ìX>Œ²ŒÙïqvká¸MlÁéÓÀm'¼,`ørë:´¡,,ÚX'—#‘$Vä*CB®JÓÉ8¬ÇhXðÀ—]+«¦ÉtŸnvÂ,W7*ÿ 9Ôü_µ‚'èÿݬ' Ž»£»î «$RNb©RAø«r%:�ÅpAk¶],Ý3_K;Œ\Oõ ák ŠÀÒÉõ.ØÖRGá)$ûÕbû"\þýˆ¬Ï›C‡®[ÏWTÇ3ŒBÃ0×&-Œ1ë•éABH*ŠÜ?¹†Sð�}-•Ó%vÅ?Œc�¿#í´çXHÿá´¯“ÿäŸëÉ/z¨©Ò%Øàú5¨ÍËyH¡�Y°eŠ!úe”"µfµRXŠD®âa9èK4[@ šáÚ)£…°ÑSm¹ça�.Àe_8çìw}Ä6ƛӶdÖgÒ•æe$)'лœ¬Ø}ýAVAé% 2‹þek…i”÷ܼˆæ` ó×yvåðcmX 2'í·ÝosúÙ¸ÅþÇ{þª ÆOñ� ~>$ywqP�¨Ò™uã·Þ:=kì¯uóýêoÈÓ‰Ÿ-¯"»UíC™ÑÛ®Û>ÿ¥#8‡NðÙ—áÑzARYrLí$[êÿ0{úBƒ¼½@¼©TW6�Ý ^EÈw‰¼ºÒÄר ¢+ŸÐs2Ù9ÇV¢“4SþŸc¯SbÚš€ÓH÷ν 7;Ÿq"_Ñ®iÿÝtç=~¿8ƒ�®ó6J|žÑI ý‡ïâ¦CÎ�-@ãw›ƒÊkÇ¿Y Üz{Ò�W*Pö�r�5HXüÒúÎ>Ò°uägw×Î=ëŸè+Æmú Ða`ó¶«Á“M·îôõ² \1š&¡2� è>ðf¢÷t² T!!àfP¥²1�[BåüÔ–mÙ4ƪ¡aAÙèÅì� ?ÿ˜ ¬“)¬þ&}–ï>¨ ?øÿÿø0ÒŸ O > P@$ä£MI!@=@{À»à�¡¤€@PlÐSGº`j€@ëMPk@ )Zút :�  h§­:À­:tt5Ûq´ £ªôzè§’ÀW½ÜWGvmªÑ¢¨†ñº^x 4äPP thèÊ”6ÐPm€5‰ØTõF 'z®ƒ¢€ ÈuL@ t‡·! »°sP;a£JÎéÛbŽ@¦r;s¢€MÖÛ¡Ú :B�  (g…Û`¤©�R�:ëØ Ðçl1€ ´P: m`ªHÄ ­PÈl ‘DSÖ‚‚)8°@((:ÐjØAv)Í€ È7­põ+€ÌÎÜíŽ�\èU   ¥§Õ¸B�*(PUmšh¦RTK€,¡@tÐ) ×@Ð î„°¶5$‡L!¦´S4�.Õ @ˆ€€ë@@ £Z P(Ó”P;š.° :¥(€ëv4P8\á�ƒf Mk¡®…4€Y€ݸ:`À¦tÜݘéDTnn­¬r.ƒS’ITÓ  ÔÀIHQ©¦€H Sɦ…*)©¡£@ÐF@ OA$Bž¦š z�Ð$õRSB˜ž hÐÓõ$DRS šrèÏÕûÿ¹KÏ×ÿÿ̯ü ¿ýêŠX2"S'ü×:Ð,Ô�„ÄXº½&±RÖr¡ÞL=¾UcQ¶*£ckÒUª6ÔÅhÕ‹hÕBZÖ-£UF6ÌÚ’ÕQ±¶J’£V�ضÉTE¶5mE¨ÛV-±F¢Å±µ2ªŠÕµÛEXµ¢5ª6ÆÖÉ‹F¬AX"´ZÔm±µE¨£FѪ�ª*�bÚŠ‹m“i6*ÐÊ­µQ¨­X�±lh´kV1lZ¢Ö-Û £bбhÛc[´ZÑ¨ÚØ�¨µ%µ£Z¢Ø¶Á�¬[QbØÛE«U±´UŠØª�µ[¢±­‹hÚŠŠ´kF«Q¬Uh«Eh­¨£jƨÚ�µŠ-´kX¶-±¶Ñj*�b¢Å¤ÖŠ´ZÙ-X¨Ú‹h¶-¤¶Ú*¬jɬb¨Ñ«ØÛl“V‚¶ÅbÚŵ‹XÚ* ¢Ú�µŠ- ª,c¢Ájű¬V6�ª-µ%ªM±Ö+b²h¬[£j,•‹T¢ÖÅhŒË¢ÖˆÛhÚ¢ÅQª*6±hÖ£T›E“mbÚÅ%QEеIª(ÛFÚ‹[TcX¶Ù6+Qj1ª¢µ’Ћŋh+TUƒZÅj’Õ¢ÒVÉh«UlZÅTmAlTm±[c[‹QU%mƒ[hرmˆ¤ÚKEhÉ’¶�XÛh£TV¶-kQ«5±¢¶±¶£¤¬Z�TY*-¨´mbÚ5¶Š1Ôj‹FѨµ¶5«m«Ý­­f«ZÚÊÕ¶Ô¶Û[k{ímmªZØB‘  I ”�H"a†Ê[&d&…±¥"I"‰¥1´i(�0•³“-‹+2U†–™*mŠ0…´ÔÛMdÙHÌšQ¡ 4’˜eJ¢’ÌH6Xjš*RÅJ”Ñ+),ŒÀ˜ÒÅ,ÄÌ™JHi¦a¶"flÔ֔زÌÙ™™LFfÊR’¥šb2™ªadJi)fÑ-,͈Qµ6Q"ÙSKB�(i¤ÆÍad˜ÌÌhÔÙ‹,Ó MQ”XŠ’2lÑ$ÄÒL KLM+ +1l˜“D¬a"Qf�J³,Ô3cYD“$‘2™ŠfŒÓ¶YHÖ–K) ‰RËc)¥ ¢Ò‰i›(FÙ³%-“!‰¥“*X¬a“CdÌ…J1jm¦lµ-”–¡X�©$HÉ)*–Ùšm-•2¥iilÈd1¬ÚBI6”Ô¶’Õ%𥦤©l‚Æi¤š’ii3A0a!%¢(©BP³M!škBeI3dÆÌ•EI²¦Í,ˆ�2e‹MS(Ú†bj’Ù²¢¡"¶†�VÊY°«)Se¡b”جÓÚ•JɲD)²TÒSY™c2a6QdÒL’AK6S2jÍ5’"TÖUšBd-�ˆÄÒM%4“M¡´”`X ÔØI$ÓRÍ´¦›3Y0Ò�,ÚI¦SDJm&²LÒ•ÌŠIS-¦ÓÊihfI)’Èʼn&‰K4ÉE%4¥6’ŒÖe2T³IL(ËDÖ$Òl–MF©"Ê%FI”I”ÍLAÚJQdÙ•M˜² M)+”cJX¦Í’5˜Í34Ԕ؊ZFŒ2ˆÉR‰lÔÛ,ÚM3PÊRÀÙA²È”›*MX-4Í2Ò…2‹1­­nÖ¶µµyÚÚÛTÚÚÛTÖ«j­çmm­Mmk*Õ¶ÕËm´!1$’��’© !„ $„(HI! BGçæÓ½¢Õ˜ÄóßÑ«N ®P“©8í‡Á¤Ž÷B0ÑÞU�ΰm¦ªWRg®5¤ãÊ iç+ 8¨åÒ¦g÷„gjG¡…íS»†ºßc ‡9�:¸î彿öçmÖ%ÞÖT±DwX¡®%]¾Ø+Kì{â;eZËu¶z¥3+HQÐìØíÎÛ±¹Ç—X¾ÐT•�·Öi :‡#›U—Û¯�må=»s�ÚNm7Bë6ö#P÷ª7¢>·UŠ·Z:úôŒǵàÕ Ê/¥ÃyK.oHï·|y­vÎR»zss_Uná}±€EP‹‰È2“ƒgeaýÒÛpÀn, †š˜5< gB¯dº4‰©Ý�YÀa5×Zѽ¹yUíhpÖl䬳Y„7‘Âø\ÁÔs(Ž·%ê™C-ä® îAÎW±MݪÑ`Û—«xެt•ÓÒjÍQVãõõÖ¤4�A®§jª†_d»G4P]0®eî#hråÆonÞß´_ ºÌ') œåd¼Ú†›»ë4QdLš¸·¯2¹p©Ù[n¶ÄsFó¬#¼Õ½}’ŒHðÔ6X5')vÄò^7™ r]V³gsc²æcyD:˶òÉ´ˆ7wva›Ø�Ùw݆!Vf™†ñ ÉÊÓÓmŒTæv¹K«!°§s´î·vÖ žÛ‡ÚÌ;~ržgG\×¶¦æ?6£Ç.©ÒaUeQÖ[Ít³=‡2®ÊBL‰Üm ET^±¬-b‡T,G®°VIÍgí^F·_BêzX=KwZd½Ä­ŽÓè+L ö\ᕦ¦´ùæ¦é,ë)vu£�J ‡µx&óÑ)ei«º¡u·•˜&ðÛ�•+"……wº9Ó³o„ñ™b± ÅÙœ¯s‹–;PëuU%Ì‚»µÛ»Y+w«jĽÐtrãnØ´4=vïvuuÕ'#ÙÙwx*UwUwA ÞëÓî©×™“³­Ö>Ý·7p¡4šÞ›Œ:­U¡í® Q-ðɼ±XdÎ¥½0PÆC½|°*Ù7 Á“p_†'¬Q¸„–£‰4»r'vûtH*ïTç›iÎ÷x°·ªÌòw‡¥_P63+åÓˆFB‰Ö3ÓÔp`Ðð¦•V˜îÂ\ª…�ªµšœ¬tD7¼#B ,Ž�rˆîã¢]åÂh¼ÛqÚ¤ò·xɇG!ÎÅ«feEíáÇYz®³§cPÔ¼#Q´rê0r �U°ïŽM8œ[aíçY'•ß3Ý…åÁ¬ï¹é«w®´£Ûp=¶P¹V%Áµ9b’)Á7§_P†ÜuØ÷»j‡§ªî«‰ÚK· ­—*•„T¿l»ùQ[ƒ$¬£òÛÃCéì=×·Â>³•�QmÑÙãFö˜áe`]S6ùpAyƒÙ„(Eº¥—›Ìvº.V&àF– c“®ò_�"¥ã¾vå7Vëì’èR²‘k—Ú¸§rxXÓ"lë Ô¬@¯s7VvW]Wfmjî ª<õv,–Út;,QX‘Ê ÜÑŸ\•Díay·nîê±SØ^3‡¹tVàÞ�°fœ-šÓ¹†ñV^š+rs�"ìwu·^ìs�Ì]rd< ²ßzôém`D2³$]´'©èW–:z¢Ý;­c­Vž­Ñ±º#«Ý¹Ãt;Ç7P47º6º‡u·\Üå’±ô¦¡�¶k%¸³(mÌÀÖqÄ'f¾¾™°B7rè•ùÑ�K¨0`Úí�ØÙ¶ÍX‘˼êèUž5•µ«*c[}G®Þí<´Ó^˜j»°<Ôª81r× Û¿=¹{R Ý8!aŽê*öï%Õl®ƒ5ÑêºRÅ¢Óv÷|¤Á(kõ ]½9Û†/«ìÛ&·>TO�]_×¹R¥ÃõîÍz(Œ¬Ð®·GBËõ‹»öå‹ Š®�Òì›Ô/;1lb¿`9,q—ƒ¹kÍåc ròòŒ=g³h¾ºÚåWÕ½·‰ÙÃTy\U2¯³eó°n³Nak¹ 4úw;fÇ›Y8ÍUÇlÕHñ™t3ªu#çâe�%ðÒÆÄÙƒw‡^Öy ±^Œ[y}.دY»ç+.`W¸¦ U: b ­"Î0KÙX«¥ÌŽxv!¡k3 Úf漇¤ècÐʳ~ÎW „ïNsÉ´1NZº „�h�*X)*²ê潆ŽÖ.îù^)ˆ• &™&44Í@¤d"©4II‚1L�4e4 b4)¦FY&a-„  ¡!(±DT†�(Å–jP‘‘£4 ¨¤„¬L†ÄÆÊFÑDš Á �Lšf€Ó2,F’40Ê„‘bM0`¥# b‚*QFf‹ ¡4$&¢0B,šfdшL¦Jd%64TÀÌHÍ”S„’XŠTRhL¥,$a´Í¢˜%F665$cj6Å,&Ì’)˜``Ö*Q¢HA�‰M ÄÑ4#Ð0DÈdQÅF¦1D¡…Š0”)°IRX²#Ì,j�f6É’B#A’!ØLÑfHF�*‹$Ê2,XÓA¢R` Q3H0A ‘$h�Aˆ¤ILf4Á”Œ°(ZJFI¢"#%ŒS” Ê� h¬X4E‘†‹C1` €1‚„L‘&e‰�ÒX‚&6 ˆ‚È–2™f�(S lX±,"31h¤JÒd–S(ÀXÈd‰EŒÄ°@)&¡,¦1ŒÄ¶À$ÆQ¤i’$04È£% aR"Z2"IL†Yˆ™&Š’)ƒ2D0¢šChÚš(”Ê’¢’T˜k£F(ˆIšXCHFÆ D" ‹)3BQ H²h3A‹hJ#)4RbfBS¢X„š@fDL¨Œšd”›DÈ¢ Š5a² `„! ¦)–Q!•3!Fɉ )"#)¦P´�( š0Á%# ±f‘‘&I€f Ë P4$È1(™eFH’(�ÑL¦¢2–Ã0‘!LÈÐÈ“)XŠC&d)4$… 0›IA¢de%$„‘ J�•("PH¤�›BM¤‘ALÌ‚EL `MŠ X’4) bLФ•Ä Ñ ™³R‘(²l˜ŒJL‚°d4Â5%$ÔX±PÄbfˆ“Em­µJ¶×�ÃÞöÈÂìÅY}ÓÚªÚí®¹Ô[z*¼ãÇe›„]Z;Õ¬kîí8ÝPGœ \�ÞÓEKcP¾¼kAÙo4,½ª[¸8\z/{‰¸úUYT�w"‡ =°B¥+Çie‘ß»³`æW"--œ±efŒc°„+�éçb„»¶([—%‰�_^Ùz +¨›±ˆæbN`‘JÙC¶¹¼äÛ³%OQ¼”5¨˜i)V¬=Ò3›9×d¦Í¼¸’›Y˜²ZçC:¹Ð–(B±u¦‹¢;¨nÖÕö‘~n÷Cë{îV4¤KUuÍâs+lòíÝc¯¦ÆR‡�i¢MöùqÛ­«vZ¨»µ,Ø�ÔZMè+¢î¡Îøe˜ˆ �qSnp¢ ú–žÌæ·�dák^‘Ú;0p¾z®¯ ñÙ·R:¬ÙQ#B2ö dvÔå•›Ù¶+…×|:œ8´M¥ØÔEsÌ6©6¢v‚7fjÊ¥Å+«®Ð¥óÊÒ£µÜá—BÒ2שׁ×Y.ˆ¬Ê›³Eeâ¢˫½}šàʽ5’}e®æE–¦ËÀw¤;G-›˜­·7{ºÝ³³o·P¾¤Ê}¤Déc±.i�»xuœû~׳6³µ½³‰¿pjsî®Å=î.YcÍ!S雕t÷ªõUjº÷sª±=íÝÕ²Ñê…Œº�>ÜÃ^=¦òHÂqVŇoUí�³ÍAƒ®›Ò/”9Bc•™Êi×c îAïd;6ózøSN£Í98»ãVF�­œ¸¡BóxVî_gW¤‹Ñ›[¿°ÜíP4~ r‚ ”‹yp[ÇEÍÚ û0ï»"›ÄdXo5AČߺã=wݘêLŽÕÖénv£oVp•J)]],.¸nŸ¤•tfê}oˆWÊ;¼ä‰ör+Ò�›±½›‹Y«z±ãyW]dwšwZÎÞ™–å$ÖºuSS¯Œ™½�2Ö­sxAÛ6Õõ‹ºÃVÀå¯ ©]›Y°‹ßQÈ2R¤É®8¥Ïίdº°›ŸEysëk®?¶¡2�¤¡2S¯óÐ5kr~›˜Öoã6Taºù9ÚÖ‹aV×N"Üšº5"L±Õ6à‡×äP)†­ ñ?µm³’Éa$(N‹�Â;ÓÑ$Á«˜Ó‹ÏÚ� Ó Á‚ƒ)½ÎôS¨žŒ{ôü¿­ Á¦®§åû7g$YÐ‰Ì '¨wW=ÕPô–mk3£Cªò±0¨Ñ¹š$˜fï#ú‰:´2:í¶±¿©(ç•»h˜=Èã"TÀ^TLH;B7Ÿ$E¢‚)ÆÓaeÐÛmOpR$F)#„Üü.)ÐŒç0b{~5m¿ËGÒ·–°M+õSON°¥u1 f°D®š"˜‡ŠpÝS\*e†Ãî5’¾š²Q•Ü\îCµ;ÊíëÕääð—>ß~ä=+ðõ¾MY’æ l�:CPŒ¶AuTÚ1æž\=Ô—.îÄ迎õâiW0±†:-=щÊý¼¿±¦¤8APMÔÙ—M·w3­_df¶|c1‘ª%’znó1(¶IR¨¾{Õ�u¶øPøtdÇhÃ{(“ ‡ÎNÎLœiGžH[SÚF;A›;ýCé3ä'¥Bzadü8@†�ðèÆÎ RDÚÇßvÇSëYê°ÊÍŒévZÔ„H3®”\‚úb 4R�èå‚&´ó‘÷Ú6�ŠHy[" úßÊõbÏdxz릺+Ìö^øüŒd¾’%¯�ƒä¬1*¼ŒBÏr›nœOàD!áÁ9œð÷*ÁßO'$ÂÑKAÜ3Â%¯¾› úõpý]ÀëÈpPò[íF³¶p(†‘Õ—Ùäê`xFÌ�‘×0×#‰ZŽ©ÆK"A£oŽ¿^MŸ;¦ ”Q¤È¢:ÊÄ (úÊ‚§L=SG¿‰GNía“½ â�QéHY°Þi(ÐipÐñ9VYÀg¢1’úõ{™8Es®>šÑƒ‚Ö;PKKXù” ­•T§>õ£8$LûcØ#O^Ì +PÖ:÷·F¼Ôl!›¶=Ë"Ó˜‚ܲ»8"©B%`C^Ú&Hœ¡;]œ�,‰6G‡DI„Epôí:ßSSÒŸ†ø™ÀÔ (í,Q^»îÞ®(¾!t±¨ˆ¹‚=z=�įeƒ¸GÅä¨!K¸9Jüò„dÙÔP!�Jê1i0qŒ4ºñ3ÔöÀöxpyé:1¤4@ì„Z¸†~/m äÏ­ÐDukBí�ìúé6VVXuÉê pt–$W¥ â ¤Mph©’@ ¤P%-˜yjF’ –I)*¶ûA,½/ãd™CÙƒ€N ‘¦±;Cå[T@”ZaòÔ¶úò\AB[iÛ†Ó$€}vÃ5^ffSlmhÎ 0�"ZHrT6X/L"]”É$vÑ�¶ÎêIy•f­Ý1$”P즂룺¤„‚Xöƒ%Ël�tâãHvbPX” $´WÓ xäîæ¢d‚r›A! º xP†YŒ¹$îYé}8“¥$°ŽÊì¢CH‚ ‚ÓxE`¢‰±PÉâ@ÊHzL0�D¢OᎈZÒx•÷ÇV¡’ø!4 Â,â3`’FÂðˆÙRB>ó^ªi»¦ ƒˆ–ØÓöX$E céä(DÑ$T2IxH�I2‚ $Š’?HDà–a’Dý,ÿ�ªz–{0Fi9ù $ˆ�¹ÒÇ%V f¦rq Wã‹CÝh”$‘ípÊ‚)ƒaC¤ˆAL„À$퇣sù!H�‚ð†’4“(‚Yƒ˜ „(¦iÑÃI’[xÃêQ…‚[˜ˆ!A@¤�8ƒML)‰x�TðÁI¾¡Qˆ-‹ˆ‚ $áVÜ)c9‘1%Á‡K1‚Búú ¬\C$‚$áMRõ0²Ä’‰-"X;ˈGt€x‰g+£-i"pÂT‚¦ƒ6pòD£$‡ÔÃ�õ.ˆQN,Á=ÊsÄ&é¦ ­‘Ó˜[,¼I,¶h¦„6°²¤Æˆ,¥e d„p²ž!b1öÌ5 \†`nŽe~¨/„±8é '–ÚF˜M$,@k ’‚SX‰äËÍI�¶Ü66Dˆ–©Áð(:1Å!(Tæ,„ ÖXD‚AD"A„aûˆ‚J‚Áࢩ&YL²I%$A$Il,hýµR…$ÀA0"–ƒ>Èlšh‚(�‘§CAÄ;>b ÄË$a[‹0p‰e’$¤¨„øÃ.íÌ«#S3ˆQE&°œ¦ì Y…‚|jilÄ��´)P%†È]¦Å¼3¤!„�GÑ4:+ò˜&J&$–D‚IâÂÉPAXCe’FÎ!¶‰8zH² ÁTž dAûKEûxe’ß³ÈRI%qvöâ ðI6�(3 ƒ„’(¢J@¡$ZH�J)a#ï‘Àì° }6N”{#sl)† 2!§…‚Š@�ˆG_,'HÅôÀ`èè¿G µq2©AHV=*q†°B5 æ¢h�%oÔ8ʘD¨C3œºu9Âys¥Òq.{÷ÃÛî¾w\¼ÿÆ NžèºÿDìK׆íRŽ�XÞXˆ 2åâái!OÑ’v­è|ÌÙa›±—ÝJõ]övÃæEA±°ÅÞgEn$Ý»¶o¡¯e«G_gL\,÷nçV´k WeÕí÷ îUmMn÷LÕ˜+�´:–á7AɬÉLmfξ 4p©ñ�Ó®*Ëíní«Ñª¶æ µr¹~,-HðÆ:ºg!žÞbNÎ^æÑvÕÐÚ�½�Œo$+N]™ 4‘­5’q›C8Ò… 5€ðÑ‘4íËÀ×§ßD8]Šs2náÊ8_š·~]O…¾ AÜôG#÷Y9¨=^ÇËM$5»yyp¢oºõ«ªõÑ·EW»{rööº­`9[ó±Ü“6±ÝìÜ/gCû¯âvf�„§¸þϘG¯FOª¹‘•®T¹ôË1±£‰{³Xz�«ÜTåáp®�×–{FÓc˜ƒ�>¦'nÝu¡5V\èy,k7fy<5Ež¿T’¯Av¸Þ ™�×MhŸcƲµâ¤Ý•|©¹ÆH´éÇ\æ-ΆÕ¹�p*”ÈØ)të^½ ª�è]:'&r6`(Émâ(׫Ëb&>Ê:²c¡»Ì]lÞc[›Ùh ˜ïXízêÛíÔ*XÛÜÝÎëÃÁø½±Ô z�R/< »¯={–°Ñ5;³äVMuÝé�’äÓ•ìÅÝ®´„é]ip¤Úįɺ  ƒA4:œ#Qd!%UàVã+jÛk ë—8¾x†VË  ¼¥×ÜÆÓÒh`M¦¯p.Ñ µ’L¥”÷°UÌ©VïRjäÁn·Õ–’ÌÕ\ª¸ È£é3´Ž"e'¢™Õ]¶«³h[v½FzøÕ+y!â¨ÅèðÇ]‰ã»]qñ}Ú7¤ÔWfUl¹ òöj'³´añåšÉÖÓR3¼*ˈPaíèÌ”ÔÁ‘œâ˜* Ø®©Q6aæz”"N;U·¹FÏrk%³k­ËÓy¹§Ž¼©]@¬¶ \1w¢ÙQr<,]]à2¾9 £ê©H}÷¯f-Ö‰ð—šÞÝ2ˆn¢5+™Š·�»u{]—}.ñçK¼?wOªÔðÒ×Ûº7r¾§<’¬—¹u% »‰5ŒvŠ-bV:÷³I ¯¼á/xÇ nñ¢liÌ�t‚ÑÐNÛ|’ØêiªKvÒš©Nó‘Æ 5Gr«ó�EÏÓÚKV-RÝ7^©gÚŸ]q,tZ¸EÜUíæjê{é´W0ó<8Ù‰ŽF±Ð]²TÓH­Ëà¹=Â2Õòœ¸á1A\3ÓEf¥„L½\o¥Ó׉hoŒZ[F^ÞåGu¤:ò¶î®¹pv{KH.ê ±y£º+¥J.Îv+„¾—^Lv— ã!“Òy_6´„ø.ËêÇ:h•™7 4  g®Ê�.�bC ²a¿)ƒ¶ ˜%æÛw lºLÚÖ³7¯¨Ûv)JqcNÂ��¤c]¼;eÈEx-¾™‰s32¨¾¨NÜA-Æ*©ë•È–�ËÊ£Ö�±Îªø,hŠ.»Åx^�Š›i‰Inð3+34X‡E £9_®¯èý‚±SÞ›ƒÈð¢zúìn�]‚�‚jàN°åîe^½é™‘+ØL*‹À¢ê7ßjÉ2˜;+³uŽrû9Àgmƒb¥ÖçJŸÜÞù�®¤3\Þ®ì5W½,ÓgtV’{ÎTŸBòd”/)VôT µtv�ÃέßC�;Ρ̥UrðçJqHD,s8ätôÝÛñ©¾U0N]ÚµL6Vo9@ÑÑ•Z·ÃQt7 R F¸ëÈ2^ªËòh*�øà\IòîßdÅÝz3Ø2žS¼±”®àX ¬Ìª!…Zî�QÙÛcµ¯#ÕëÃÝs¬îÁ˜ë©î¶©Wp¥mé¼hËäô»˜:>b­ Ú9ªqø‰NÊ^µX\næØäD`›³jÀGt åßuÖ̽݃e°bâ°Æo|dEÝ:ØTÁ[oˆw´—Ë(h¡Â¾YY�ÕÖª/e§‘µtÒ[·‡¹Vði¨Œ‰yT´ç‚±ŒTx)©x{B¨!!u”  ƒ?þ¿ÿ¢ 2‰]C·—QóÄñ=iI®5[Û¥5ää$#¬ì8ÛøëÔå†ß«/Ì’�Åï“Ñ›­ýýÍ÷‰ÒK¸ÿûŸýÚ�¶®ÜýøÝvë¸ç™m—y�Éåç®cݳ{¯ößÉ–ªÎ_pùá"è,·ÇLÇ/NÎñ,£ß:_>¡ ƒÌ÷&vÙšî+¾VÍšÞ 2G÷æiŠNè½í¤Ø<Ã9ù÷g�"×w�¡v»ÆÉèÇ:ïä;dÓ ~Ëjì»Û«ÜŸ^«åž qêÝøí·û¬¼GÊïŇnþ©Ú Ó÷J·žnwÃþÆ@œ¶y84‚E w'#ÇHÖ :°ì‹´¿ý¨(()CÎ�û|B;Š~¥ö߇éÛÀùmbÏ֞ь?õÇöÑ[�!Ÿž#Ï@9¥§ò&ìôQ¦Ø�+… g&àé_›þøü®yýˆ¬rá£3Þ2FÁ�”g`è>uÙ�ù+q”ÞDKx{ ±®ÍZ?©:õ [+(z“ëZ;=ýÅÌÆœã·giË`V×µ]�™ìØÇwpý`ýŸd õÚ5õ†ÛÑB:¤ “ÚæÜöèü®.¬éß3B þļs>ð™,œï–ç ž‘8?„n4W¾ú³×íÞ¸ÁUºç½]©§�5ø¢ê¼XEoõh¬z41èÉÔ#c·ÖK% Eª»³ìóù$¤´©í¾žt·Ì�-¼Ç³öûÛ¶¿¾Ó®Ct\•£Šš0˜%ÀÇ„íßzù|2G–;¿¶'ˆ¿Æ=não²²O0îø¨Z�Û~ÞŽ\èm�ž´_®[é­ìéJSI:ÒuÁÕ¶2ßO|´¤_fgÁÖ”ZÅ¢Â]àÕµb§ît`ay‹f³yÁm‡Œâõi&oWðÖ˜õ[,/û¦�ŽP:ÉfÍ‚p@oYa.ƒX3Ÿmf€cr1* òÒõA:4Óm¼8wÐ61ÿØ$’§«ý¬g¡ò(×Gâ ½í�ÊRZ³š2iKÖ4&HáCAº„;_5å}$Ê·R¾=cF ˆ¡mEq”*8ˆ„�hhucÓ[$°ôHI:€� %‘á¦m¬[”¿xúåVóßÖ³YƒKòüûп•T6¡øß9üò²ç�&foÔ¥ë šRô¬©sšU0clPщ]D©ä×+özw3K¼TRˆ ·¼Pi•»jE(óI !y¤!! R¼îD=^öò˜ÒÊÕ·ó*q^Ÿí,P)g™ÂÒ),hU. 1I% é̻ЭŒb°-°c!IŠxîò.Vê’I !zUµ/õºLÞ#ÎðyyV‡SsO¢DkÕô9ĽOäR�rÅ Ëÿvc;Çe+/@”Yd©•A”B˜´9+ ^/dR¶MXI]M` BªP+J»Vn�zˆHIƒàBBH!F+•&òF(qHXGŒS¤RQ~ÒzQ~×j”5Ô·�s²y[m½4vàIõP&˜e¼Y…$íÚå‹+À­y†ÃäÛS j¥¶[²™_½sÓ¾�8ß fûÉoO\áâæ×ütÙÿËÞaâELo©UŽF?JHö |[€dˆb r¥25mYR…°ƒ9]ivÃX¿Î§ŽÛæeýǾvÏ:ßÑJb¹ÓvEWqë•Ô×ërF,sK^ÔÊQ ¨"¡ãŒZ„µ˜S²BÄ]ä0…‘”•#ÜBB ›Z5ôôÏû£zõÅädz—fÍdP%B<Êx1¤KZ%\ð¶›ê‹‹H÷Ó¶ˆÓGIR¡q„“CN…[kO�r… ¨5o/{bQU ÈHI‰ñ³…z–‹"2"èÛ…µ°5¬ "Çú�¿ Wø±6” ÐhÄÛémA¥¤•†vs•¹(.¡z4“PêÕ4 Ms”b¥±4AÒa&êŒyd�$#&!$6!$  �; D‰ ÎP\"�"þA`E…ýí_°0ÍÉ•Š�ÝFó`ž&ÜÙÁš¶5®q‹‚B{YVê!`û¡GŽqj~!rbclLi�¦˜Ä‹4 μà§"…æ¸Cî€,€âNVÜÅ7¬çŠß«@nÄ4� A´Ç $’ÿ°HB¿´Öüÿy×ÏËl½½ïû§M>ý¯äνKü¼1ö�úÛßcµ¡O�O2 ‡Ž�Gˆƒ ë>ã–�»Ÿ�~Ç‹ýu¶ó†¥Où¨Û—QŠ;°H—®ò îMß½¨·zº5Ï®ŸÏ7ËM9óÍñÌ;]ÓZEÅí›qŠGB ¼¿½ÞÐÞ¥¼:ÿÌqA‚3„»ø:pÆù‡ŸŸ$íŽMÄpòçîÛüû·¿¿p.=S@þ$ßiéí΃»jįÚê–`bx¶½’×ö5ýmÛrªûÇPѾ¼1V÷Ös~ÃÓÅ8�x¯{kãÖƒÌø~»t0œ�G)mê½Ù÷丬ónÙg|hŽxÕ}ѫ㷟†ýCÊýÛnùžqÙŽëßxðÙxó{ÒCÛoˆ�н÷ö·y×çʵ´øýªÆ\ÇΫðy?‹•´Öþ2!ìŒ]ñÛŸÉÎæÎ‡¹ãÜÔƒ´»Å�Å~wfî1?z³žÑØÙÛæy_š¥~úóïÖ¨í\&›jHËŽf|/ãn ìÕ¼ÊüãeЉøkà;,�±{°ë1o[“D½¿�#Ë¥(\tŒZí÷ÖâK÷Ðt $|_¶](.ògÒ‹<ø· ¤p‡ƒü@MsN+ñr1RehàùUIý'j…Mè!÷70àchš! nhqÓõWùi®ÞY¬�·<Ð_Zyúœô«vvâ5 F\¾;vK!Gà󎯇æ3½ @ÉH¢î!K2ª«üà®å§jâÝë´ßY)ýB æ=GÖ´Yœã†,RO©ø·P& eÈzeH‹P+S-2ΕVü~RÖ†oFU‹÷²R¥á%(¬šHs×x P¥³Û¬Iw^öîësà ßÀÀÃJ£D Õ ä$!_Òl<ÇÚõÂ&íæPݳ}ÅÍ-e«�Ë…·k JžTÀ©â°’Õ0*šÉ (ÂX²Bav –rÐ_•š44‡Ï9IÛx2;Ú8wï£ï%¾ßýÄÏúšÔÉg"ÈþåfiçÚŒöÏsîP} �$BÔC¿¹F†òÛ8-Hÿ¤Ê82Ð�@ÔäúR¡Ø"Ãm o$̉@Ê8JŠ&A¨EÀÑ�“¯¹«Œçnõ5wŒŒ¤)¯Ãk()J=ÿ_|—ý¦m»ý´‰ ñÖL‘vt-h¡ó&’móܹ&œæåI3· Þ§nîÍ2š©Ï_.´ƒaºåëðîîÙwiÆÎ”»r*1 m@�$‚�"R͉¥1tÂðk!Mh*Tçâ?±„Xý $höõ뤨Ç|Vøßœ¸¶XÓxï—ú¤ÓZÏ<å<÷å”�ØóppÝ Aë–BÏ'§S†u´e±lìKD Z•@Vd�w1±WÊjµY£÷M<ûuùë­íªŽºWKbëqÊmE릲Fzù´rö‡P³)f² ª�J*Õ K¹C²ßEÂ¥r÷åòá ,8C–¶ &L/çf£#ýhŽœÞ8Ú=€ß1Ù¦`Ù“öœ»3 .TÚ ”³¬Š¿»|ÆÁ™§¯Ð I ׊ƮäQûÏW_Œù�êGÉ‘§�ñ=4QÊgŽ™ì]ô JÓz©óbw¾ùÔ*_¤#Ž1B�X³Å$$„»ñÎÉâ>Ä¥AJqËá¾e\ igæþƒ?ƒ>šÇûSmó¯³?=m�:h×, Bµ§Br{(‹× šp¾�ê�­”]æ²Ùo¸ µí7ß§32ƒ—^à$Iz‰ !{_ýß./5éç÷oŸß.ËîÏ>Ê60K÷çåuâ??ÕÔŠ&úv[Nÿqj›£ýhuå“T¼Âö[eÞ•ï¶çñq{dõ뿾§?.ǬzbùMãß¼?~‡†õ=¼¯oã“Ó×å:oÝz~û6Ý^\×Fö‹Fé/¿}·¼cû~¿~ÇóÌ{3ßÍ»K^É<ÄyÓÞð‚éï·É)ÍôxûPOìïŽ+NúÂ\÷”:Ó®{¯�>kÞgÚÃn¿>÷� tb¹ïÙb´ý™¥�oø©\kÝv/Wí/žÚ8ïòÓñÚ’ëŽÓçaöS*¹ðÔüxíëI_�Ï5ì÷ð]¹^Úã%s¤©ÓØA¤Ï¶yÞ2W¦c�³ ÕU펇÷ðÎ%ÝÂCW1ßßWöÎéÉÝ=ʘ¦™”Ï×dí¾]¦ïèé.c££�,yýâ+i0éhñ·�=Í#\}û½�O8RÞ}ì¸vùÉI¢Ë5µÊçÖ±�é¿GÜ÷ÓÇ�)=·퀘¶ìõ&øJÌ^m•¾ù†Å¦¥¿»8Þ›²<ÉœÆ&Áy‹<½}õLfÝo�_·`[�7„<~|0èpoVœm¬6Âéæ×޼N×lXçý뜼£ä#~°~.‘G0þeØíŸ%¿Ï]Ø4ìçýÖø tf'òÞŸ ÂÇmX¾{?‡„ù}<ηˆ³Ä×60оºïæÓÆÈõæ÷½¯K¹’Ѭ8ÏvR½e¬ón;]Š2Ù¼{[Šì=oêtîX?5\©Ú£Úݧê�¯¼í3ÙíÌ”æåÝm¡žéºÁ·_xÛGÉ,�´ù»\Òñ�C—VAø'ŒàÚHØrÈ2càª/Sœ2™‰äaHØç(Ä~Ú1÷÷Úö6Ž2×5MüŸÅÛ%ÛXþ'äc³=qáh\BÔæ„…×újÀÑÆy£œ�újÀt�#É•,>÷)«U¹êoCzwÞ6úV_Æ3V±Ü'›O±K›“â%Bß.‚ÔÑ¡ jîYƒn„äX‚£ÉÄWÊ+&VˆcC”‘‰%SÄæŠ~|üµÌ£ZÑ÷”R�ò¡;Ó�ÑÂ~ÿ>Êyäc¯šO×õõ‡Œ@gA*Ht”ìe4/W4Õ@k›tv,[ãL³¨ýíD¦/ýé8C‹-‰@+u2f9üN(Z†Ñ ã{mJ¼˜aT´Ác”Ä[¶ ƒÓZºd/âHÔKóKo›ëeh“ÓŸœ}öí–·ÎY³3åž Ëöí ÜÎ ÖÖsñ"-X«š+nö©‰%HÎk²­o ýÛ'§"º;ÛæÒCäË÷Êš[Ù×+þc2ø¶ŒÏ#„h’Vk“åAR¢üt˜Ej …cÙõ ì¸Ï«Ù‚¢a…“§âRÛ·`öBB%œ»xˆZI�&¼‡;f�çúó¬à&±STR-õnQÎìH©tvœõëK†l‚/²ÊégIÖR¾~ú’S(¶/(ÅU¢!—c%v�’çŽ~Üëôõ�¦‰ÚŠû¥úJò2ªÇbå <$„ŽÇLÎµŽ¸ ¼fjLÑ2�צ^u_©-v^™"² PDmQBNÃïi4�=×á¦÷rhÃ=÷Û7(­jZedªQƒ�˜Æ5ÏÃwE•QÖ2;Çë=P�€ã[ÑÚ„f$’B”$!yžkóXÆÄñÅmÓÄÒ_'|‚Õº"J@ŒåI¸ëkW6¾q$ºµ³�Ô(Šé¨AZ–‹X†ãèÖ2(L"ÚÎ*ôêI‰TÓ¨bk¡e•ª»‚å‘‘¥u a‚ò/G©í\§™šHY2®ì¬Îâq!Q*ýç2AÑÒbêtŠ.¾¢ðy¤!! mèzñ¿§æð|ÿ=2¶9tߘRA»º�¤Óo{ÓF·ÇW}׿û~º{Ÿ÷uqŸébºöe<Ï¿Šo1~œ>3аþ»Ô!žÓãóA™kÙÐ…ç+cDšÙ¯]«ç†0…c»sÚKíïzþõŸi£ø›'ߟ>6i±S>>pó_¾ß»]o¥’v�õ÷" è\’~�{?·êKŠñ9Š·2mtî¿pwÏ´£œž˜Öÿ´í§¦µØ)øñ ‰6º¶þi,³ué�í·Ç•™êewϰûÌqÜO¥yu's¢½»­ä_4ãyí}~i)}øùù¦.vÓÞË m´Ÿz¿Nû.~=q¿GÛ¬;í›îÕPqxÁiÐp©¿ZvJû÷ñ~�µzÍÚqøÏ½þo;Óôz‹þ~-/ïGøâ0†øû�Ú±û³�æàóníÃä‘…–ßO·ÞŸùÍôö%¼g¹YÞ“3ƈÑ-i· )vüôø[w¡o¡/j;>Û"�Y ïŸB\^íd89vs¥à@w�¡uкó·yÆ¿G®ÙÇ—QQÖYB%èÚ7ÓM¿§ébœO¼µå“ýÅüfjom<ÇÙrÿm€�à»øë§Ciñ«¨¤¯l“nZüx]Ìø¿²ªüUÁ¥Ïj}õ¡C{ãÖ'‚ŸµkÄ϶Ñ_Œõ™sN:øXûVÚ^#!Ý=v=÷–ûèÆâ“}Ÿ�~£ÐoÒ‡T`Yh8í~Ÿ~«G¿'½¶^ÕðXåó;pËÞ¡�Ìv}òÝ~¤}rHÛþêò*•â‘×9pWvï?®gŸ¿¥êÿ®î[æŒ&P`^Ïw:臶ãaNßjëp:g� ®¥jMñú¶øÛV˜¤;z¿ Ïñ³Ñ‡š{Ð\§F[Ÿ¿-¨g¦ïzͧßÚøk»öÛfhÎùNó_Û˜}¿[`– TªôèŸ^j~$€Úýd§HI!ƒE•Hjúµ9§ £™W�ŒbuLþ³ã’:Fp\Pzf‹ü‰Mðó>¯ñz)ë¤à ˆH”FP}s¿qÕlcIÒ¤RÞD´Yµª!ý°óŒEXÛ²ÖêVz2¶._Ž6ÓÛG·,c®»ýdÂ^˜[α"e°Š"�°C�JªH½h4AØ:Lb1`€ÅÔ5A®~†qúò¤= $ð.ˆd¿ÞLù˜gÚb)45bQÂîΈ bVºÓV|²d²ï&_<Ù.�4Ȱ— ð ÿ�?<!Gïêó[Šçûl¹ï–Ÿ1ÏÒ4n܉[g"£ßw@Ñ�”L´ê6›�Z, !ãJS�«ÓoËí£×ÜÞþzÜÏK7ë/6×ûêºãM^<ø£âí)Ba<¾�ù÷T›7½™ðŸr©öëç[wÂ^®}EŸ.ÖðÜñÏ>k|8üÞ…µº®4Œ—²g¼˜³AJøõ:l‰½t2à[ªZR¼ù pc¿?Ÿ_4ð~%‘J‘ûX¸aÆ^v”˜ñ+Ò…~t‘Ï­öÊßhÆÇ§� {î4ã¶½¶wÛÞõ¹¹wñ(zß�01»7ŠqÏ­¬ûþ[ûÌKKG9óÉ7Šê±óãÞ<öËd$âØiõ̶OÎ+MÑ[¹÷à9?vS|üpÓƒ×ÞØˆ¦}³Æ°ÎÓ´Aâñ«osûŸ¸ßÉ–KwˆüÇ)û­…½xç4Ù¸ìä~ùîq×=ø1¾É X{oÄñãb_–?N…|ŒÀ¡Ó¡®ã©êªÁþ—_Õdô)Ç¥Óë½ Í›V ͹ê2ù(~wÄé;oüûûÞåâݺgߥ—ú²÷x}û3ÎÞA=Áxð½�×g~Ò‘Ù¯/~jÏÐ_IÎö~>F u糞“Ö7¿®|×›™Èo d¡«wgîÓ¦º7•·Ž+ËôÓõõàfË·� <ŒñÀüáÅ#æ$M­~­–÷Úß+ëÅ4Þ²N(~4¿é>¸}ƯwQcQãÚÏØ¡9H®5â4øÞ ¶2™‹À,‡ÜøñÏñz/m oÆÔ޾ ?!èû qß^Qnƨeï7\=ñòšS.#»¹½ónþ̆6K #o�Ü“eGºSÓÕMå±×·­†ÚÜn3cÝ–_¿Óé¾ @òCa°—ÙÛ›®Vƒ¢Þ°Sz½–. ¥þ A…¼”rXÚ‹«*ÕŒ¼…€ïÖ{¸ù¦&ºÚfÖ`~ï¨ïüE€ÍóþžÏy8A&úL¡Ã„a¶’p€•†ŒÂ¤Ó ˆ¨W*/ÌGOܲ¯ç';áY3âÓ?2ù–èûeîð¼â1¾� À•N¬±˜†¸Å÷+HÖ� íç®uŽ�©1M¤ô¦×�Œ¼8�Œg‹Mö+2L–’®eêGôMŒÍ�Kâ!žYLªB„¹ŒD!çWÉ‚-DFlÐÁG¹˜J MšÓ5al½�>è¬ ±Q˜©öϨ¼Û®¹R5L²O5u… ¨‹®!ëzÄ�¶ã½ÅýBB¾�]#¯NU廵"êûÛ9иã‚¿péëyÈÀ0,ŠjÄ0޶+Ò¶ ôÜr]‰ˆ´B ïÖD@g…”çÅG„ÏÙåì}:¢ÜÇ„o7ÁÕ¢ér³¡ÿ¶ÕÇ x+}RågŸ•çŸKÀRËÊ…,Q¨P{|D´¾,$&¬�ù²øk5Ñ�²twCXg„œ-±[£Tbˆ”¢¥ÐYÝâVç.(Í š)r„ÊJ*uc¼E)KQ¢YIH ªºçöô%ix\œ?‰Áý‰s"NST’ÊÀ\@K"}¬3ëÐ"H†‘RéÉVéFÆìO» VÊܹØ\�χ þéÖ�caâ•x£!šm¶š‚ªRR¨jj)WªÉ#%a ,€@’2BB¶üÍš6�LPóx—©xE™Õ*›HHk¸†Ñ4x×É/j™ÑóEÿ—¶¬ß- #EF+FO±+ã:-j£7±©Sâ³m¯Û±±ð@ÅÙ¨A]Ž ãU§�Cf›Uâ»R·2Ψ4ÌÌ‹æoý/Mj!!$  I òHHIãÖ¾•±â¿wíP¨xŵ·o_ƒ>ÜïÛ¿ —XA?8KXµvŧÈýEÅÍE—¬U½›^ò9¥kûw‹vÎÙÒzÂëÕ ¶¬ðë}§Š2p\v‹“ŸëV{žFö[IS~]cnäÿkOCÓ9Õ±´>ÁóŸ4¸Nìûízc½¹z}ßAò¥îÝð¸úÒ^±+Çßï}x¸¡þtó©mÛKgžïÖìÇêéˆ/id…�½ì+ù‹*êP¢/�+M]:ÀôÐþ$þVEŽ[ÆG=øÑ½§ DðJ¦ßißÔ ý}U0tŸ+ø#÷ÏCÉnÙ=Z.¡oþ—„8ñózûwß>ÎÒ>¡¬˜ÿ>ßÞ?�Ç?t®å��'scÔk÷¼uÕƒëåawoÊa0ØöÁð}¶áPÌǺ;ÑKjw•a¿8]=N]³û®|ò‡®ÞdZ1nÚ0;Ì'«¡È…5Üw'oh j޳‰óuåÛÙóÖ]Kwï=Ë^ehc·y§Ökê8AÅ)eõmi»æíyCÇäî>5“vÿ˜™¡|Lo¨àÉ$¾H6ä õ®—‡y,^Z_Úãç·wë\‹’d‰‘7i4%ÆOZ¤'#ÇÉ?;ºùjr›¿¹ƒm™Á�³DžŽ²%±XûM¨^Eʼ%î HDØllat¦Õ²¶@T.[]­óùpx·wO{ZšNc'«¤áùŠûøÚaȨêS¡¹îD¦«RX @ \éà…k1R.Az‘[+DH!3ŠRP¡m↢n… óTëÒzÐÿ‰Ÿø‘Ïñ�Så§Ñ#PÝ&É#6Èuµxí&¬.VJ¤Þ©8…`ÚcQ4u‚Z•êNß¹w’5šŸöcô#¬x=Gþ�ÅÂhº«e�³°ðƒ|æApˆ š…Ub%J€Ñ(C—�*t†(w‰¥WfÜ…‘¸€ó«<ëÏ×=|½|«l²Ž=�wá�.&ék­µwxʦm6˜ˆßå ÍG%-@3ÕÒ�P¸lvd0’ƒ©hS2ÚG'b¨Ä´á[ÍNMöÏZelB+rL $ $‘>–¦*Lžž—­1ŽüWˆ{-®Ñ›å�Á¢£9“ï»Ny��ÈÈ€3N=š"?—ç—y{¦”]BŠýe5ÆsÇ–#çJ·Ö-ß®%t«º4@Κæ8hèÄÈw°e ‰‚\µb eK­ëV#u·É¾¿8ŠúÎø–wgËØº‹jØpvk˜Æè–…»zR§V6ª®Ç¥®âÛQÛ±ÌFÚ¹F²ÊúÌ…XfJ@/¤]šz5R‘ÜA«ÔáV§ỹWjÏz²÷º½*«Æ½ Ö1ÁÝój ÅÏX²Î0Ÿip^ û;M•Óú­£š}cÂ;ý»“úÔ¡oGKκºÿíjÄcá‘-<µdß ‹KÈöÉÄ»¡>eïÎ],ª“Ñ;¶"Ô*òëñúø+Â�{ɽëÓkKãz6™hGùrþxãiÞóó ?îvÓyöÛ†úîœ{íÝ+ûçkíŽÐOe¿÷ÑÓ3ݽL“Òϸ]ü’ú^èÛ”4-­sNÖ§œÜ{‰Ìдú#g|H‰ôYëZÜ{®Äñß £+ ìïhÏ\]Þa¾ü¸àø³®»Ogú|CÉzúõÒ¶|íUâ=c\fã^wm¼å¹çN ðÕ€˜é�KŽ¡·¬Ü£c¯9Fý�Ã+p³ ÷�^ÿ·ÇwiÙÏ—H…‹¼wû¿¬í¤‡m}øùr+gÏ×ÃMkƒ¦™Jù78´ÛÍ÷[5^x£þÙŒ!ò™Ã>´qÏ]'žÞ¡Íïóm6°ƒG/•ϳˆ,¿¤½œ›¿}&®ºWOvÛâ© P‚¹·ªõzѼÖïôïä7¶4ì¾Ñë`˜vÊq{›"Óç2óf‡ủö-Á`Hù�¸…í�kxöÏ,â™à¡*êª+�£FZÔWÿfÑVÓA/(ZY¦Ä )³å¥àÌÐefhÕ^tH,˸eÿˆ¥7ÓÓëîµ­¹ñZ;O9Ž2ŒóÏhÍ™yß͇'3¸  li*)av"¬+_ ã;m•«”\hÈÎYa¹Æpîjzø½qúÊ•ƒêU7­n§"%ê¶fõÚsaÄ(†‡>¶-( ´¢ ‘äà nËÇbh$¨YÀƒ"Ø2n+wJ‘8{X²³ú¬\�­èlñÄLÅàŸR8EÝØŒòågÙ%*öTÓW’¦‘+´¥ólÄ_RðŒé‹H�|Én1V¯ÞŒ÷IµgÓŒ,/Ö×p›©¥V£{©¡ LE¸—É�•èª[6…"×zœlO„‘Hê†ënc¾üÂ"ö‡Â+ßÏ#§šÇô \¢$¸ÚR+±ím‹‡²àÿp{ÿ”.”{¡Ó¯ô̺hf Æ|b`Šÿµ& Ç̘£ç�1œÒpá¢o.Oy‰½D°ÄÚc olؤ•Œé#JÅ—ô�ê•C€é´k2ø [˜ÒèÖÅšå[_Õâ…àͤ&t‚JõŒ™[jueRiuÉ®qÜ¢¬ÝÆ4ºˆûÖüZgm¼$iµ‰Â'n vÎżÓâûƒJ0Õ¨PšÔ!˜ £T"¾vó›á„^;A„˜D$$€¸‚úâìÇûëIë1›=j¼¤QÖ³Ç*Æ-Iu6´îzFm_ŠõA�\©‹J ÒµïœnóçŒÍ²ð’!#º !! )±í U&†˜½+¨æ´�÷©+pª‚ÎŒãâ©Yˆ£J¤Ð¦ÅP|0Ÿ² ´Xèàeq…},…j±(j¬)ljƒÈb�ày¦€Qµ€£_Œ kà�WQïªIUbLbmxj“`¸`-E¬m6Ø�Á\L[Ü´TD�X(½Ã‚ø´”h§Ñ-ÒI´P`¡±ÇEWSn›¤m%®ršÝ¾/ øu 'ðòRˇçÜ)Eϰ‹¢ˆÇ*CC¨Ô$0òjXÆKXv1’é$*DK�B"a%û"­'s{€ý1ÛëÉ÷åïÄøHõÛÃøþONÙéŸ[nlК-®øarÏKŽö¤ÿ± ûþ'?×z ð�™7µ8¿Ÿ¼Ó“gI%éúnwBg•˜Í)ÝÔ‚WæžœšKô×_˜ø£Yç¯u ]xG}ž‘àeÙŽ{2b}‹®H¿üýj�{Åt_Œå¿K"ŒÓv?‹yií&ê»q$íåžìÝÃvã~'>=âW¿·ï<¶1¦½¿7’ýË¿sÖhúÚ´@×YÔ­‡ý\ûkûïÎ6ÔÞÛGwv}}ž·V²¬úçݘý1v<$û¹Ö–½½s_.:N'ʺ/'û÷�^ï›ì†¼ñ “·äí¾ÏÚ@Ãæ<|Ú<:e›lõÊÏ®cÝÃÕû§«˜2ê�Üb=åÒ઩üyÚX˜*—*ø ]™Xà ¨÷e´C5â‡�‰sOÛýÛ_GU‰zâéŽ;nœi÷z¼2Ñ-ºGž¼×H'3`ù¾�WXqÀîXÛŸ'£¿l³ÎƒÏSKEe7ˆö\-´·{NžÛË^íêžû/¼[—Q´r½)érv#Wm}kñ}�êéàL½þÝcÜô;Â…û¬`k¦ËÇwê]x¯Ýp'¾Ü|ßLq¨wÉnÜŠ—Ñ«}óÇĆ`­œ|¬}J?šA¾7Û�k^{ã¹ÌØßîBíÆë!÷ï¾?MÉ…ÚÝ|<Öôõ!!àºé{÷›þu¯C õ®_³5øÍ<ça9úl|†æX÷WT½�R|ißÉ3Sö½W7À¿>f½å å:Ãñì°Ýfî¾Öiïµmà Õ¸¸T¿ 9�3çxx…ŽRÏëé[Œ÷›½³¥«›G-s?IÌ8±/Ô«¾üë„�vÔJ{Éq¥?b”úÉ|FIiŸ5Ž˜ÇP–Ë�|†/C°>ÔŸ×�Pþ͉K¢…,qš½�ƒ ëHM§x…âÐâ!ËöåSµÙq“¸Ó0îq4[ÃtYg�i$1±¦Õëñ+6V‘:׺êï‰R6îi`´3X'@æÏm[$°Ð°æYF"+LP! sH‚«ëvª¹Lÿ�TBBHÞk@¨ –’ë4ž2³ „ýj×ÓjJ-)Hj�#2ÌX¤f‚-4ˆcM4&îÂckËÞ1OTb–… Ò(©?¹%DŒotçøP�� Þˆ/�vt¡ßìç:½VÌ>F¹›“sM¨ÚtÚôöÖÛ噦ùïë¶h¶4ÛÎhî£ß¾J”Ý~¸W~�>ý1½F‚MÚÛâ\ï íâ¬f;™ùÇ ô»Ê.Kúì¸3îÿÖ=ŸÑcú>©ñöÜwþòžÒÝ£Û¾ ­a…¹½¼ùfÞ�ZSBîù¾ññ®Ô8|õê¾µïüMý¯0¯¼÷°¾ýގכÕןãÍ¡Á>Z}€“~KçÙbZuÖ¦ÞˆvÑ¡ÿå¿kïçg>XÚÒŸMýñôµ"È„Ý~¨%×]�ö^}vDŸ_ÎbúüÏU%º‘¾œÝõïÇçz§Úúc·ÎX àÄ“¸ìg~ZŸ6óWéË·¸Ä§¹ÝÓO]cb§,7Dõânoæ°k-T¤xçHœå«ð�iº— ±ç˜Ä¾ÎÕg 0†#×onñ‹¥wˆ÷á…àŸœs—ïdñâš»Uûçq½úÌîOMaVlËÌÈ©ûO,‘ë¯v1ËÑ}^º|>øŸ1ïfø«ý‹CçAc[ KóŸcmºïŸ=¯Á¨�=zwó­]ñ'¿� Ê �¥'gAŒ´bNï »/e% yÎì Â#¦ÒY¶1Œcc*8€þ•$ÃðPY$�4êÓ �ºÖa[Ã<¬,„Þ›Æ&?~5œ´å£‰+–p#ÅoM ñZ°¨pÛ7^‹ð–˜"£#©]$j=šD�óÿ½ ÿÕç"çwx$Wø�€À°'³êr§žì¯/n¿š™åBB:üÄ™ƒy4¦Ç…†°pbœ­•!?Ñ Ü„‰ÁÌ3¡›Lz¥É¤¡Y sõW«„š¨6Æ×)‚þ)�Êå顯BàÝž/”ÞÕ’ïxÀÜм{½�ø³‘ß‚¡¨p¸9˜Ð-Bï<È-Dt�`û’»åa.ãø[ÀÈ`ÕøŸ=¶�žÑÌîˆJ"R£º”ukÄDlh‰.ËÏt� ë¥rò¬sîËéíÊô?Þã{Ü+fÚ¦gé»ÒD˜u’•™ƒ‘˜{2ÙU�„á(?P%„“CñËGnw§‹Ô´Zgnµ“ÏzñzëI᎘ô¼n¼GTÆ6\ëžyÚ 1¬ÅÔ ¹üò­ú,´£2öŠ0¯]æb·Tˈšb;ägÖÁô±I_ùÐgk`Dc�t¨ð+Ç·’fÑn>ö‰›š¥‚ýb~W¦eŨrÃf"elM–Üþ<û†ˆî›ËG(–Óg VÂ@Y Z’ B ‡F®'ô¨¸Glí�þ肞±Q‰ˆŒM¦Š>„¢ªW¢ Yˆ¯Á™ ,$,ÚN1Zg<Â�t„�JÕó…ò’E†’ hI@(òBH hö’ôå�’Ë}S+Þ¿[õÛ†ö‡oiù{àc&¹h _dûà>spË'l^®“zfcõÎüÚd÷`ÄÆÍÙˆà…QQ®µÎQ}$ØäoèÛÅ�¡Y„T"×Ï¿¸ÞM�¹wîûvšnL¦ñoØû>�áמþêÖ¿Löê™ßÊb<é'ÚøâL—}£lüwµÅùðwjCh->“Kw�3<ËVoV—ß2ÑÞ}}£{5°é/ع©Œ—>7-s4½ý?ÑJ ÊÖ­¾'óט7²úýØ&ÃÖ+žòiÖÞúޗ槆yFo³8çέËJ˜iüŸo$O«K¿o=”ÿJ™ÍYžžyÄz’ƒûV+�Wžtp cQ«GyO ‡«#´ü4¦qöÅ´›RX&iâž™z=¬�¬YÂ-£"‘Jüw¯½èOȈW"öåÖçð@õ.m�«Msuýèiã™Âš è|å[{íæ~,Tûï•ëˆD¾G>+×KÑúÏõµ~�Âî_}üZþ5\­{Äy_Ú¿M0ß{|ó?uô>õù¹s�3ûÕ<ë¶Ÿ>cÖót ïfÁ¾"&ÎïZmjG¼i¯Éy±ôܰú¿j3÷œI™Óéyá­òP³È$a_ öÉ8˯GwïõpÒªt–¡û>[â“Çã]öÍò’FÁnˆc[ò L·»Êméú‹ë�W€…ö”  (ÓêgÏw;R¶füç¼ýöõ®µís„:»úªØ·ÏÑè”ì¥Ë®¨KH›íeÊÀ¡®»U%£OêÄhs§ÊÙs‘ìóŠæí[Vª®Âoý4cç3xã—íã¶÷¦Ôü}hî¼i_›zç}·,|?)}û†qÒÞ"‘ÌxæI½jÏ£¼>ö:ÊžONvvœ»¡±#bµü\}�ž9…/éÖzÔ¡; uÕÐÛŒÈq?ŸÒ¹¤YC(ã0æE £ÐöÓ”âVßòÑ|5bFñç±Ù*ýÕ±+¡Vµ×tÖ9åó% U u$ún‘…èF‡@ˆ Ü‚#=HBq2)^Q±"b–”ú`4‹"jš�G3ç æn5qIÖlÖ4³ÛÓÄD5Hú¤„ ËD:ÿ9Ï–sk9ÔüÌàÿ¾oKoÞ[o“–õѧ#c˜z`%Ü(E"ܽïzs÷¦zÙèzHQìâÅ­oðõ’b0ˆû’‚À Y¹ˆL’(J” ¢`"zN”EÓ7ZEÄ@™û yaË]}hâ‚îpó-,Äs+­Œá!5"·†åÀÛ �VeKB�Ií®”åù<46�öýsFwКÀ@€_dÉ›ˆþ,”ð22[ø,©�ÉH+ŒH‹¦@ Œ}o•:ysý÷Þ»Æq5õ¦–Ó=ÅC„‚ªL_0•_·òBA´ž„ 6ȤG£‹£<4Œ4Y;ÈáK5OµãÛÛçó,ïo8+DoéÞB+Ã8¥vh ¨¼²cšÁ4[S”Ù7 “ó/b|Á$‚HµËçmsŠÁ툌eÖžÃÎ=3+ŽQvmkM¦ o—ã›åÉ�Œ�޾ùëHeîB±¬7ÇŸ+PÊd+ñÜ•õ §+í_“œ.BqI—ôÌë.‰z¹vÓ�³åüØÝ�®8€Ã5g�¤ÝݵMYAРn%íSÏh¼Í>KT�*h¼ ‰3|ÎÄD(Éõyåím(sÒ)ó©ºè’0°Æ-Ó jú4²·¶ÅE‹båêY¤OjÊ£Eë•5Ь†‰i^›ó¢%"ªat:Ô@#=PÎ�¯áÓT†¬[Ù$@/ %͈@Ø„�<{ 0,“B^í ´ 'Lr AèæCÆzHU’\ù‚V¼C ‰)è½>ƒù%²�`³£Y!ÌÀÕj!!Ä! $ÀHª �·UåÙwöm`hÍ) I(�¤¡ªhÒPÖHm Í¢&“Ki5¤Æ¥$جˆšdI²a��B³(k˜’X¢ ‹!4…"LȲ™�š Mš(JÆI*f3-˜0É�$"S,Ò’c2š-E(P„¦²šj2¢˜ÈÙ&¤@š)�Tiš) )†E–U™Y–�Œ) 3’¤$‰ˆDÂdi‘²Ë T¥˜ŒClÙ4`3IKJBki¦2±¥4Ù(³b’i „�L£IE°BÑS1`JC2M™"%BY*›%Ƴ*Yl6@M�(Á™¢©-%’±20a¡•,¥Æf–iˆ¤H0fË“PÓE“LLI4Ê(6Œ… ™E)”i˜)&iJÑHÊC!£lm J™YXšji˜Ó,3b”�0Ò2ÅŒ ÆJ’)TÙ3"“£Èئ�†ÈŒÍ�b5 ¦4Êe’̦d¤5)0ÍM†[‰šfÅ‘¤©¦L%¥’H‘&ZPcfbdÊa¦‚&0ÄÍ5ˆ2e–4Q6H�¦M2dhP±0¥1’a*…B #&‰e†“QfJ�˜É™J0–35E6jLÅdÄ Ö-™0” E˜ (QdÌ¡5-J)b�eMM6›6b¦–ic#f™“)*LC4’…$Q… ÅŒ•“DdhÉF!ši“E&m&A$Æ‹I LHT¦(Y &‘FÈÍ(ÊEK- ²³ 5$ɨˆ´Rš,e$²¡Ê0É¡šTŒ©#‘`ÚML’Š)3I©¨b„ÃL¢ˆR2¦HͰ¥ ˆA&1l¦6MÌS ©E2ZˆÁ¢"$¢ ¶BŠ,R˜Õ £4TfÐ�’£XÃ2)QM5Š‘¢UÌ´Ñ0Ù¨Òljf’ƒh6ЄՔjQ£jZTh6YiPilY4ÒPiª33b&2&I Lˆ¤Á&T(Ò–$¤f”$dÖ�FÍ”¦™)Je DÊM)™2Ñ´T#"¤Ú ¥I´Ù”ÔØÄÑC$Ñ&I˜‚˜A¨Ö)b™™³I¥,E¶iˆ’ÆÁ(‘³ͤ¤‰°DTÒˆeŠYSLYSlͤ¤Ö-‹hÆfRËE‰²šb¥“ ÊI¤M™0¥AŒ˜LZd¤-’–TÉ,¦ $Ãh¨Ô1É!,ÊS64›6‘KIRÄ”“I’�‰ Ò�¨¢RÌÌ`)Q3†ˆ¶4,e‘”J)Œ‰&E� 4¥#D¤4 ±ÄÅ"›BÉ2Цd° ‰fK4V1™ ÒhÓ% Ʋh,j3"#E  ÚF‰f�˜RÒš™A P&(QLÙF*J‘’Ò˜´“$&¢˜ÌÁHÐFS $‰HbŠRScBËQ’¤¤–É@Ó2d©DÒ�Jb‚3JLÉ’QLRf¥4I%,Ìdƒ(JE!šM0™! ±�²M*`ÔÅ"c3„Y–)`DQ¤‚Ê £2”ÌÆ*e%’D˜ÐÌQh4¤m!TQŒŠT¢PÉF’–RÌ"LÑ’ ÓfbeI,"II‰DÅ)–I˜$""’i(±™©HL“�f@bXJhÅB"™„–dÌ1Œb“A‹1d`ŠŒ™’šSfÌ*Dh�REˆQ$Š›b“0€’–YDDFb2[3BÙ0±L¥“D$¥”¢’›2Ì�0’�I¦B²!BSIC@Æ™,dÐÊdÊf2iEŠEL(�0 Á‚hcHÌ™‚ŒÒ£AA¥�†¤ÉKD†ÍŠQ²’PÊb´Ì„¤Š!‰ £J¾ÚÕ¶ÕíÚÚÛì$$„ �$ƒØBBH P�„Ò@HB²H°„„� M P!!$�IÄ$$€ý¿à’¯·Ÿ×�¦}ÓQ|bÓfýÞ–ÎÝ'‘5°Ͻæ Ê)ê‡PBg½�ˆÊIŠ7¶…\δ)Vy+·?ü_wíRå©ï¤àÖ9åaÊä÷¬çÿŠî °÷y}nt/Z§Rä.ŒòÈpi¢Fvª¼3<Ÿ|,ÊbŒèçN-`$� ^9ûÛû_JSçØû^X“óKô¬Ï­„šb ¯©Wû¶ÕRµ©kUFmZ2L„"¯Ÿ±}¾òþr�9§¾YRM/Ÿh5@ÏäU  <÷ç÷1ë¥íåï Ih�y¨H!!ƒAýó^ñÛâùþÞ üé5¬ýgØ9»-Ñóà„9(µçÇ÷ã‹[Kü3Ê¿q{,ooØ,øNñÜ*¸G«:eÏäìíû8y¸jÚo};Ÿ“ú?ˆ×Ï�|åж'Ò÷~{¥ÔÔá$y/§¶®g)2­k£š‘ÚŠ¶¾»¯ÂàÏï¾_ýÇ©OPˆ-åÚ&E¡D„ð»iÐØåŰÍ-Ö/Ví‡ùSòÙ<0ù9b‡[O^¶<ÿÜ#‰®(Œê¬{õ¢<>”ÿ+/Õ„øpFþCÄÇš†åd©×ýÖ.¸]ušå.@¦°ÐÁ˜Š×¥ŽÃð*l!€î´3u¢E�¿ºêxfÏæ¨šG^ßNÜAÚà™ÁÕåt˜§èæ¼æL G¶ }LöO¦þ<|�Û™™›–ðè'œK^Pœf²qa:Û†Wu¢± ¼b+æâ¨È„›"ljµ>ìckÌ%9é÷*nÏ�~«)ÏÆ’Pú~E`w‚�¹ÿ�!^;-NÁª"÷Ì�žI¼›¥Ï»·2¤B!…Ôg»Ôä‚]4³ö¨XåúêWU+jtãºDâ~'+ÂÁ~…ë"_‹ØØ�@’ŠÀy̺Z®XãèØ›±¶œ¦m³ù`ÏcR+Ù %ñؾͤKbµ d� ¸«ŒÃâûqª˜f�ÜQLÒ9e@2MC‰ç¥!k‚´n©íºm?I«îq•3ÍlGø%©Ö$Â1=ŠŽS£ ßêË “”«Ý^Txíã•>ëÙ!­û�Âó�0vŽ&ñ�ÝÞÿ¾Û�#Tæš»,¶†Ñ£÷t,ÓÑDlHÄØ˜XÛý£±VüI[RÐ:ªFvfóEF·† © ^Ð{nÝH�^ßo˜<¨Ô\�màÆ_Æ^°ÊµÇaù†þ—ðQµäØ8±|�tMzæ]ÓtÌHuîÖ)ÕÖ=ÚEà<�lôÀ¿—¾³±z<ÜÅ# �l5/£I·‡R“CêÜDX]°ÒLhïÔÚ²“‡C¼2ˆþÂ¥ˆ.Iu�Åš?ÅXZ¾Qÿkk–~ì]˜»7*»–¸èŠ´ñ6¼1q„&‹ˆÓé�®S�iJ/Ei$þ”iµ©äõ´ÿ ©Ýõ¦Ȫ¹²67wÉÞ`ßÃΔ)¶a’óùr¨Ü0s_Jñ71©5B ='êœ Ã|þª¤'K},5ƒAdóåyS˜ð¼Ëqè¢]ÜötS¸Ù#0{�±¦Ôî2ý|zÖÛ[ >ÓÔ³¨y¿Fñ‘#"¸Ý‰8UòYtï� ¢òŠ33,è6nsdÐÙ¡Nd«‘¯Rèæ"8ÕRw‹µ¯¸-íEiáØ×7U#×ÿ½¦/1';¿Šœ¿²Nãü"ÞýÏêâ].ØÀ†”ãçç¿M[›¼~îÅ)ŒŸÐŒ1°å¦ ó0ã@O;×¥.îèVçXœîéMÈó,wÌðp×Þ [5fáq±} ×U¸®¯¸³^C¯ýûþè÷„ u΋E´Îè1¼IhnÊßj¶¢Œlk ü/”±†Æë‘«³ÿ‹¿óPæã¥w¬mBÁ[¥rÿe|Ü‹ºA3ûË ÜÛÖ7áŠ�ˆ`Üü•÷Èé˜béÛ9Ì%‚¹ìvoqì—ß[a#¸!:¼óIÌi8+¾^Ù= +s‹|z£ÌypȦ(—ËTÎ)G0f]p¶pUÝOUiÅd\y¼{b÷z‹¸ÂÒËõaðU)zePÀ‘6+3ÂÀÑ–LGšÈ $?1**ˆ/ýŽX€×ꦈ=`&óP —_ý †}öƒgìï•£äÿ"{(V½}ËG´Ô¿}¿ÙÎ!ßq©–áîxÆCtt¾½º/†‡jÊŠfòh-¡¥)ÇŠ<­WšJXÉàñ›ó(¤XÞ³àú™d—-xéãÔEå_4¥ev¿dü“l9;ì‘ëg7ŸO3ÍŸÏ`wõAñfo¿1 šÌ¦¤uCËPñ_ó÷‘ ƒËãßL1 k6Î}ç·_1Üž½kí[¸Ú ÀAX8˜G@¬·òµ©­G”Ú¶4ÐÇâF…Øåß E—½œ7ë!»˜W-86:ÎVšeøYâÏžb{ ³X,‹¬ù=è­ &3>ûÂV”³Žó´ñR®°ìaÐOŸ=s"Ÿ¤Dóÿ;ž°çë]ÀƒEâ¥U®¢PåOCm%ldŽ£õáÄ:q.¬Iü=ŠJ§³Œ`HûÝ@"Z�0‹^»­ë—èó<Æ©ÞÏ %sPe„ç W=ǼÖK-¦äÜ´s<ßžd×Ï�w9q¶·1‚ö6yru¥ýôH7Ï«§Æí$U?¨^„îÂ|w"!ÏTnÇ.,šòqÉܺö¦YŒdC>7–$ßÉœiº ¨«ñÂ20E‡4ðÿë¶c\'Ç7ÃjùÛÂèÌýA°GU+ÑÜeAÉÓG¯“a™—to1c)k÷Í\`‰^¢ŠŠ"’RcTŽä¦>4@n$÷l1#saGR<…Ê¿  óPɸWÙ&\m”å<&&3 Á–äöù�Þ¸ôn�Þß$j‰QTÛlFøB4ɆÔ£‚;Øó£ïC"4’*¸½3ò‡TÔúFYɶ¶n¸Üî¡n渇vd¤UÛ®Y•Î¥”rª¡rg*¨M¸ iJ+»›eu©¢¡0 õ†@!ÿÛœúÖ�âxäÌô8,;uCâ¶�^-ÉÚßr^а5X˜üÀ\AŒØýäéBãt-+…wúä).\·”œèg9Æ‚n¤N(Òy,­å9¼¤Æ³‹åZïZ…RÐÂ4õC$gU¢}bþ>øB1Ìe[—MiUnþMµs2hízV+ÛÑË“tÑäg÷çBbsM^Ý':<f�+c~Woº�ê‘´Ù)sÌ``@Æ"_7lM¹>™l±åÕ0™\´aK­lŠ1)$‹«v‚Ö…L†¸+º2c¬Øˆ’ç Ùßε" Šú„Õó�Î 1~øxm{'}¼F&¶±¾Û–¤)ÆU@©L*ÑÒxèV¸¹7»K⯽:êñl̯P:·5c=©…´þÿ¼ú�EXd%ýEàÊ{[Â1upÂ_ß²Q‹�¾`ª–¿²+ÇÅñ_ÜtÛpCú£j¿hc?æˆ{±_¥63ð%­j¾| “o¿Ul®Ês¶³ö¶^°ÀÇœ$ d rbĤâ3•kµ‚ÛyY­t[§©$a6­xu8q°‘y,k‹4-›¹"g5Hõßi™ øíË/F%~M»l¤‘U†m¶‚¶ºú-�ñ‹Ö¯½Jض1“·,PXò–Ü{v—¢W*€}@ÆAœ»öð8X9%‹9“^¾w"tuØ0ý/>ôÅ›C¥· õëMcŒ/›×½"h¨Øì8‡¬]5Û�>ÐìÂâ"§@°/ç\Ò �‘Ín®©úÔjIˆôîД‰ì¡Ã� ßHz¬Ç �éù[Êž�hÅØ˜‡BoP�s€žØ•ÒÂÉhډ̴ÆÏÙ™}BÞ×z=¨†Ñ$0¬wèd|ÉyoÙÇ­yê™GmžD´FY2GQh0"ج:QŸûX²‹zÁȾXêÎbw£2 BaÖ*ÏpI€nÞ�™2œ‘}ã(¾¼Ú-nÊw°îNnNmŠi`ÆæÓm‘‚¹ÁP† &t ص¾ ¹ÖHäMÒr0ÙÆL‘´fVÇ«AðµŒ�kwºU$å�F*µÎTÙ$´ŠÌí’°þx'rœÉÁ·¦ƒ�:€cq¨ñ¼Ì™V˜V`®6Y™÷:bÞ„¹·‹m.Û á]¶„ñhþjéw›È®¨îõ�(ÏcµÀã Hõ²ùêFæU®šó{ WØ�*ó¿¹~îs¥'òø@¢,èj•ÈÞUĪ•= qÁ:‘[©¼êS€�Ì<{—º¨²ï2vo«œÎµÞn. ¶3áQ'¨wl¹Œ4B´íIÀi½¤€VªšieÄœÝ\5”' Æ�Â}ŠÛ“ÒsÎG}ÓI¶í²@C$Ï…Gé¬�ЧÂàƒ~(LçD“^_]£{ƒé-xSgCbké|œ�1–˜n!�øcã1œî¦0Kp±·žŒN¯sym^és¦¼J¸óHmýçôõ©>ÂáxP†ooÝÎñ�Ì·y <õ0ƒ/1:\B~×Ó¨ê¤Y¿nN‚¯”›ÉJ²œ<¢ ‹4F߈YµVQªT�5{D¢“ÆV(KAQ¾XË`…ÂÙs^4°ë‰œ%Ú›G�ðB%gßB‰?´¦ ʉï."XMÊs€Â¹¿³v/²�°T³ì ËFÝ4 á“!tQØžMñãÚÝ$qÍââ*þëÂÏnûæ/å|Üã^êp štÌú›Ë�ÐÏ‘m66Úfæú `ð9•†×ƒã²Ö¢”J^¼œ¬ ¶Éø-~$%>}P%&®TÔ8¯¿oïàÙ¾/eh ¾«æïÒXÁ”r ÏTsM†µŒdÚhÐCÓbò�hàq�±uéFÁG.ž4B‡°2ÍÈt™�kEõ~!H¬,-|‡Kçƒ^a�81• d"#3-9÷>:”±Ñ×õvÁ”âöÀÁ^‘žJ™V^ÄVáCœöó—‡7[û²Øÿåq?c™q‡�™ÒŽëŸUÞIÏÉyß}ÝlO˜jmæÄ¤ïr6XÙ†,bñö‡fÌW-¶5Xð1&ƒi¨±2)ƒóã¹ùw ûD+bHŒ†|Ô¶$œ?kB+ª¯‘:ÒêO†:S†¹ŸûóÊøp_‚®J3¦·‘,ÛÝÍÎÐ9¨·—ü�€}þ�gýô¿3´q�"lÐHoËýÃç�'¿­ÿô9å¢SBϯüï}—¸€Ø(e�Ú„ŸëwMø¿Ÿïßò7}õb1 B¾Y‰‰zØH 5P2.­}5ºüU—²ìª0 7ÿÞj_ïööÞížmûK¨)VÉz3²ÁüüÃ![ž�펧ê]Jõ¢Í_YF„á«.„f½ZaùÒýÏûzPïŽs\}f ÐÙ¾RI‰‡ëÉÓõ;îõJä<Á¦.š <›Á¡‡óLW¢ÛU yù#KÆ¥àPÀÌrÀ_†Ï‰Îm0Æ60i¶ ¹JEË2ÖJ!µ .9yq9¡Q[·W]�||¤v¢€c4]�õk#¶’‘ù‘ðÏà1%à®ÿW7ËÛ\X21éÓÑKuM ¤Æ†˜ónôûë¶=±Ëãçûéë^oÂÉ‘ ¤Ø¢ €cúp7NlZ°òïR8¥;RÕãÎ’^™´é3Àáƒl(ˆ�(ým‰øw´õžjÝRŠRºVÚý¢ô-¡ú@ 8{wßÅf`ý{Ìt~�¾…YÐbB`Tå÷]ÖoýÞc¸©Ø€Ô̪ü(EÖØ”¥xóç}ݧP?Ç›cæ˜ÚûŽçç¯ (V§Ôÿ@iMIÏŠ-þXÙÀØë>Fºyµû¹]Žõü¥)AJò©vZ¿'�;šˆ´ïÏÕ?ëkXÊ�RžJˇùÑ8Â@öÑ­�÷À¦¸D7]C,q_•×�$Œ^™œ#BÌžØX1OfªI�ëÖ7 …Ø»Æ8½²´®¥c\!_Ä1€ñG“ĵ�‘’Íë¬õj�[ަËÁºsKXÔ»¨Óu*š?ÆHX—b+Á›Ó]ãÜòÉ=\g$%”$š>?‡ÞÌÙd•Í8óø³weü}ùuå·¾=îz‚’BéÈî½FWŸãÛG-ÏñÖ-R"fuÄ4§ùË­!Ûâ«û~#ý´Ûë¦'�éx_[½]žŒOaÛÏ4Òo¢Ù_qj<È>ý�1†öñ:_€�j} nËøÂÄ¡TSdî‚•ê4Ï¢ éjeü¹v5ÚŒYúêÜÁ:îõö$î5fÒ@½#˜3Ÿ�#ŒiGÛí¼š5ñ2£)•¦¹ÿt®P2Òka»^Oíq‹¹ùk|B¾Ÿ*—¥i•§Ny=¦µ@Á`”lÃÉô`FlµÍj×ÿÎo"Î,HOŽ~u>£ù…~};Ü��¤kã�ý}ˆ[Yá|!‚*ÀŠ0B­î¥š äß° CÖ¹p¡Š Ã'¿Lz#ärw8¾×™ ò¶Ã^†¸*ÈÉÝž1{I‘!žnê2 V. uù!éjyuÖ{r–ß"‡x¨˜0²V¡œò¹L/ÊŸƒ'?:I$ ÕÊõ!‚Ö÷Úh«¾°>^s�ÓvZ#Ùsd~ ÕÄb-¾¦.'Gİ"Š"Úó§åµl �ûéd*ÚgF¤9dDåq&5^%Z}CÁO?%™{7¥a‚â"r³àÏÇ^>ñ6­K lµ%­ËîÚ+¯ÈäD\Óªð¬N ´œÅ:ƒ1óýöûÐ�î3‘Ïu¼ ìPݽ'Γ³Íó5Ü%CÛ8[IÎVbnÇ-u–xQé¼Ò@m0¶È¨ÜãKsÚÿÛVýÇ9ú™¹‚÷éwóÕ^Rðî÷n§=|\V=�>Ößn ˆ~K{Ñ’c_>ùIG”¼·DÑü=ø:b¢ÝËg7­Vd�* ¼]€l;pËÇxª8©¶ºdÃjTcë Øì±|/sc¹¹ÀmAç¯Ï–óî7ÚòÆ-�x?øû^ �%/t¦ •²Ê>Kðue*ú“÷�zµ¼ÈY1áZ†H“þ¾ꪚ}t?DÍy£5êø�Q®X©*:;ßé¯c9[B~þýýaºylE7֝Рkð ‡7÷xï›Öî/¼6Èòæþ|6ïcâ–F¿~Ê4 ê|žV=T²D‡†XD€^ØØ�~o’ç~Ê1 ÛO¢¶WÄ8KúÚÁ<�ûæ× µé€y³öìO¥r°p¦`Ð\è¤�Â�RT›âÇ¢écÃæ½·¼RÆ(—~l‚§)f^ÐNá¡Îk¤£KĦ¼ »géùtQHÚ‘;¾–ûæ>ÈÎwŒp�ˆïRÿ½¡žŠ 0ë‹·m…�ù=µÞ8rñ“Ƒӯ¶ÍºõÏ¿Ÿ�š\j­kýÚR< ÿ‰§þÜÃóÖœ²}Ðì‰i82—œ¬c$W‹–üm&)eÈ¥\ö¨‚‰ædÃsmiò­\7­µI*T%Jèl'”Yº…s¯Rï‚E¯¹µÜ¿ò/*â°½Gu…´Dß¹@¹’,ѽm]EôtÊ�.d¾_Tß$¤ÅwÁ½JvÂDå†Ü÷MRøÛñ`O|^»Û)¦=ƒó°D5¨›8Ê„!c±o4Ä nÕ9¤j,½er†2JVau�¿6 ¶,€6@=H¸ –«>�ÄrQnÌJ€!š–3­/5EÅ\÷›í‚r·~®·Ž·¸×WuçÉ~½hÒ²e?3¾ì¤9”Ü ’\iVs.»‘I%‚åŸmÜHtÕñ¨Õ¼ô=T«–ÁéÍÚ3¶•��TUñë÷,"ÂD–_gCD´0â S‚QŽ'r.êZ‘Ðñz€ãže¿—­{ØW+B$ÌkmQØtV±Ë!Z î •…í&âVØ[2!rc�§²¬ÎÕHÃ�ë°í®¹`ày¾ÐÏ…6ùv#H0f\!&/üå÷þúù¬>H{·m�CÄîw×G·ê¯Ž[$�s¶ÞâmŠÞϺWÊ ÛÐ ù¶&pâßyåøeW‘Õ𫎾Kê/Ζ¸%î*;žìôM~`Ý85²˜mFyÁÆÚõ$P‡Âw‰ùò ¶A# ¬©øæeÍòZ÷ŸN¼ A<…(´†"ÁøÚƒ¿)²o­’ÞyÛ$’(�v!!”ÞxŽž J›ÏH×7²Mé7»-æ×‡o58…÷^¥ºÜÀ?“óXùaçëª#¦xÁªï_-¤§Řԅ¿ ]îóˆAŽs-ÛÊu.C¨®nÔáñûΕß8¼çà˜Ö±¯%22/Üw¹í|z¾3»¸c.Ç‚l!?}™®H»¬îìÏ!–;£×­æi Ñ‚-¨¾¹¿·7zÞšé{à%ϘÃy]¿¾Í<ÎGÓŸ¹1™{ïQ¤£ÄuL:`-®@ÝT63+¸£Öª(kš›Ím…]`Ó^2­–¥¦(¾-”,�+bäÖQ€ù_%7Ö°…î_; &ç¦ã½=7‰­™c1³}_Ucê¿ãŸ&AÏœ ¶Ù2ŠÁÆ9½ÁßÒë¿®aïÕý{[?‰B˜Î)i�vÚ§�ø4"zÆ® Ç-£Æþ]ľUsÏP8æò¡cåÿö‘6'+4>Ï»l3ga£RûI»³X㮔ū'N{uPì/§ž6}.F@–Øo…æ%qúnöÉ:îж³µôb‹kO¦~ÄäZAâûg,÷™\kµ¬º ¾(é|K_ÃÕ׊=+‡dÕ€±ZFÂþ/{š£Ô‘ŒtÀ‚RψôÞ°l{ãØϨµ‘j$YÞÔOÆÅ‹2Ç.’žU¬Å’9Ö¿|Ìô‡„(žegÜÏš ¦Ci^D¡H9aŽÖüQ~?ÇŸºfIøÀŸ‘‰#ôC;4éàDzxÐ;>�zX;ß§8«f¥ó£ÞW[?Ã{pŸ‚¯�¼ÖN…ã¸{¯ ßÝ7o/ _Šè ~ ­…íe-<½õÏ;šcJ�hM:��£]:ZÄ„en�½ØÏ¨?xt笖ˆ&‹×M¿¿, gyîÀ®fÌš?ôÍv�BR¨[Q½j¸Rd”&f½îÙÂ?ƒ)¨ÐqXìRï‡r õ=smW°~öN�T^±mö@¦ÜË}g1kE¶ GÌø–µ°-�Sï&”dº‹�HѶV€èÕ¦G>¥"¿R Æ’H…išC¹Y?Ù¬­~&¬2_¿ùñ�~»vŠ*+Á´n0PÝêOñ(ÉKôjS[ kÇÝå.‹–«ðçßíºåôþ±j¶ÝhvÞ¼„#M:Týw©¿…ÿ:¹Ï®/Å‘§nã–I¦¤yÀ—¦Í߇hê·Š›£ÝJWþ–î>³à ${pµn�ÿ~ßÚ}äzà—|‘ýÝ@(/-êùvÑz~ÞfC-—rëô‘\wªÎ1غw7Ømº,ò°À8AJQ+Úlíü$Æxÿ5ìÛ%2$uq_è|ìAÅ`0Ñ禰ÍáòËIóµä]†2 Ë ‰Að›–<ºšL,ÉøÖ“�ü^uYUs¹·ÁÁ 7¿IÞÙ.³l™Üc콆 ÈB×”,RÇá(©ZIöQ±¬x+:šÀJÅlàlxx5í¢1³ß®Dø!‚<•P¬ùXïhµ›ýqž†’®»w·aÉx&-¯8ë·ÒTâ;¸†M¤•š°MO·q’[tˆ‹Qû¬3â"Û­›…rOd+a${Débµè™ÔzŒ™µ.íó1YA›ëôsM¡PW*s{†‡ÖKêÛ]³ÂW¢êxeч<]¬ó%E%rb” ¹[×�ÖöîèGŸRÜQ!cÝ#?É�5‘¹“ñ`¸Wxè‡k&%› H ¶}¤0Š–¥�ê¥"3œî™åíª¸|T•�ô~ö=æ�ywBó•zÖð]Åî¦Ð�±¿´ü3~ï@ dMŒ|ÚÐBñße—á\òšUEé`~ò hì7w!çm‘|ðÆŠ$•åÔaØ{ßs{”U]Ìe qòG„X vÄWPp�N@êu Ú¿qí¤€ˆEfÊT]YȰçHéd3¹*U ÁÛHÞR5‹äýÙedzÅ2tâ½}ûߟ~ß’ªºÝX–? É¢QwÎ.+Þñß!²Âø?SÍÉ%™Æúɬ”å›6:™"�ÄË\ôXÒ- á—ÊÝ ¥)%5*Ë<ÇQwy¨�þë r‹‘^.›â.ñ4`¿‹ÒBÎLÇΠx$dff6â3~ã©„³ Ñ�‰8–À·câbS©QŽÜÎ(nP(Q˜Uह©/°gXÊâ],¤Dô1_Çq À¯7T4ù�¬¤�µÚ…I sË›q0@²Ò Ö±|”Њ2deXœVÖ„¬âìÃEëJóþÆC¿Î#Ö ½Ÿ9Kz¡$p_—öúàfr=@A‚æ„*¡(.øt"2Òïš ßåÉú�lÀ²ˆØ=¯˜;p¶ëã;xÛÐX瀷ÏÞ ·§VéØÜð0Ú ‘ðŠú>ÚЄN_êã‚ô±ôMá¤ÇHú?îæãLKùCµå<ðmð©2-�çt2¹ãyø_ð¬àlqžÒ4+̘-~º{„<³ßCÇx%@ê�”ït¹kÕÜØ);ÕoÜ.>úyÌ>Ô§ï‹ýÇD½ä¬`_ä’jò%’õ‡²< L$¥Ï–M”Ñ|ÔªÊ@kµU'‡íýf)¢\'¡Œ�k©¨lžI³¹‚ËL#“zŒ„†“dGìh�tñ¶�n¶#ÞçŒE ^–¤b²ÝRId*—™ñÏ …)™6Œ"÷° ‘™2U1‡Λ8iÝù”,yžè²€ƒ`¥BÓwãkǧ­« ç)ÓÑ$•ÙütÖ“Þ›b»ÖÁsj±!4¥)s+˜`‡SÉ„¤¤® ˜8ªÅ~X`„…·ž«±T3ºÙÑጾWÊ·ì="JÚ“]§­ì“@þ½Ø^²Øü¥{ß&8¤„Úô£½óJ6wîæwÁ IÊÌGЉ·BËÖãÉ#­Ìo9üY¥c [+uå͘½º;ÜéYKºÞÖÍ“á[×g8ñoiò!©¿…ZÇgèÑüÇog�èìà1X!pdÉ›ÛÏg'»bå×1}˜¶K÷;ÎÍÎ¼ÝÆÌÛ‡c×v‰ß�‹gO®sb±_ï”ÌU«ypwºËq¸ß#˘GðÅðdbSàwGù8œÔ5Ç Q .Ó¿wPÓBÞ2g‹âªŽ•o¸�¿#¼_‹Q$žÂH¸ûë�í) JcÞ‡ƒ~uvBãæÃQ\'~'•Êz�+¿óŽ|g¯AZÖÕEa‹W¦�¢i1©^¦e�÷lŒ}šê’dØD«p…ÚÈU¸õgø§™üe¤r³×Pñ€Ž½Šü�û[Ps4‰Ô �É[®R¤_ËI„�ã>þÎ9Ä‹ªÎƒ–µ·`ƒs�ã%ç¾?︥‹™­M__âÅÖ�èF¸A̳à*/Œê˜ùì5>¯¼0ôl­U+<Ó–2/÷i9«è§èÆ\ß‚uìE‹Z�O”T£ÐÒy"RNpœˆÍågÚ·³\%ý¹)¤ňNU$¢5¾û�¸„´jM7pŸ‹ s„á+mÇèÃüge9(iN=]Í×AGïð톺¬ñ¦ÄC‹æ+3³ÒôCvãW#!«ú+xrt I ¾ÈoóÅéD–›öhôøH9(á’À8ˆU ¿‡äúèóe qÛ6±‹}BAZk‚ ïmç³Òò·ßä—mzAA9q†lqtzÿ?¤+,~þVèþæßî ü Eg±ÃsÖyÔÕë‘£ˆ —zkI—û‡s~¨6==Lùâûw뙬øßÙ‹iˆÿºÏõo“äý�á­<}sý‚¦@°Å�IJÓ÷»ó×ø­w¿¡Ã/†Üäøñ§ø.ú�»q¨6þ®ùm2߃ÍÖÄ\n|,vöôƒâ<5À¢¬&~UôÅí/®ì¾Ð—ÕÂón‘s´J•ʲ„ç7#Úµq ˜œŠEfpænãgRî‚Pç³¥Ò Éû§Izº›™´†{Bn¤ÈoS&‚ïVÌ€„ßjÔïçO»==6Ô6#ª¾¦ýFå?VSd¬,-èmä{÷™-e‚óíi:zng—ëîÄôšÇ‰0bò!· Dh˜®SD;௚9�t3O•ׯõŒ{Ñ|{\�Ï“ž„ðrqàU÷ž¦òg)]Qì²FbM“]lÒ4–Û’½àˆ¬5‚_¿5Kä÷b|hÍË·nÉ¥û!ÒgÝ)°/­‘v;X„~,óLù»‹µµ¯Å…P¥s‡¼€·[“t8øXÂ]{F4WØ3€bãz PÆhÞý·oÅÌöÞa—Fù§}0�Ž ¸*åË—¥éLXÞ­ nå5clSVs]!œä ã ª¸Q¼�“G7<= ¶iÁq«ˆ|(¬mójè¤ßëçd¾2½-v›KŒñ‡=ÖO,² %} C‡• FxÃaæåÊ×9áBèëCgE–-9�ó8íï¡óÌJYÔÌÙî´ë™iÒ•î1ÌnÒ®c£ß‹­tÚ£-è÷÷ƒ#ñŸ,û�2â`_Æ×Ãp�L•r"€åéÅÈtµèªJÖà+EÍqê ÏRÁØÅɆ6omqµ”ÓÑ[ ¤ ÏzAT¶[\{“Çü#ò¬ô}µ å²Ûíj0ÞEšÀºHSLƒD-ÂÑ1ä5…ô µïÎtþß*�÷ËOWŠÅ$ ô±Ÿ'žzäüÜ3÷*x"´À1míó–9Ž;lb4 tT¶ ¬0ÇlÈÓ*�Ù[d1~-”îrÇFh šÎÉlµ7f×"O,VÍÎȆ �›² ±?AÛ=ÂVå$¦ÞÀEœ¨_JäXÂqµ«šÞÔ`Øùûiåä¡Fˆ>«{¨¢�*2fvŒ‘H:¯rÚ®/À ×iMq±ö¶o¼®\Ür\7q‡™êm…wàÌTäŠØ)‘-åa^ù•µ nBÕ¶,úºN¬ÑÛb6|2ÄhÂÔ ™4B=žˆ«Ý8Ë�u�äè/Jþßóòw¬¨E/ qXA‹ðI©ÅLú¸¹\¦_Hƒ¿]dÙÏX6|šݥפɬº=äRÒæËq¤®4ÏѶ‚‚òt¡L�‘ã&Á¾—ˆC»¿5xbcáeö¾”RåîÁ„þõöëChi Jh\£à]ÎÞü­ÊJ˜p2-P’Ñf9ÉLGJÂGMõ@Ñ Tâ�ú[¼ ?ãȰ2ç÷Ð\ é Ñ~ «‹ïåË¥‚óÆF3°¢¼=‰0Þzhñ㦚^)�è7üe¾¥õι–!:­ °+mªœ»çDdî÷ii¬&цe©µä§`¿ ÏYÚŠÝ�|?)»¤ „R‰n=D´Ûºu‚é|ÛЦRÂø@@­m¾vÑ•ReÒVŸégïJ¿§ïïê¿îuH¥�uûÅÞõ†«Äp„‡#ÆRŽrxI$¶/&½Jàš"~Ô™c ¼„8…ðàØ˜¡Ž$H¹¢jü#Râ“™[‘3)^z ™å†ÜI`„³ tÆœ‰¦ŠA“(Ÿ ß™æ$¼Ù7]¿Î—ñãüoóÿ¿$ÎJQi Wæñ†&…5,ɦ#ÞP/.'ìl.Ið„÷Lù3¤Ùµê‚vïù§ÆB77 ˜+à®ò›”Xó\ëi=j�ð¾%Ûã§œïªÒÉ+…QrhLLý6\C™ÂIm üì%^¡]QØ1æb|ÖÛs RHë¶GUƒpB\GV0´´IO¥\j/ðÛç)ï‹%J3h#¦ñžraks4/'‡RçAaT÷wœEœ-½*Ëe6ËrpÈ¢õpç››ù“¬iôYÂ�„“’’hç;n’‘`øO©P² tpV\k ¦Sº˜¦f2Ãx«»—b÷ÂÒèéN÷8¹ÝóŠgÃ$)‹æ•škÃnfóÜ=åW�1ÞÃ÷¨à•P-\fÏV7ÚÚJ]ï+Ъ‚M£k¬¢ÔŽEdÛOÆÕ1aYòÙ6Z£x3$^ÃdŒ°:2ÅŒæ.·@y<8„¸"Ä®/vE‚B:ºÕîfµLø_0Ä¡Uî|))EësÛ\CÝ?²xÿ–o&[�àSCÞ=ÑŠêXÿj(é �ýÿ¿ö~ÖµïßBoO�Y¯geØÍBeAÑ[ÑùîÛ~?¿�mC¯ïßÝ›w’|vêíEO7N^´·:x4ò’ÿS™m¬M~+µÈ¤Ïõ¶5(){z¾"a:'þJ1íõ.ª¥/þó¶Ýÿn?'óo Ç�“ü¦rj™Ÿ‚­˜±ý#SJ,ü '“DWÒ<¦¤èD<¯uøw�§U¹ËìËœ,$õß‘ñps=Oé°çp‘³¢:#ô@èf5t Q÷jD¤Ý‹ìÐ4)ݘWE6xå½­ÃÑÚ eï+ãu9 šMHÁ„µ¦<©’~ðÞžä¡m°'Ú@[èë‚°Æ5Ý@¸7êQ‡y@zéµøòYÈÝ“ùé†/ÈÓX:šf E­xk,àf&Áj=ÁdÑYÅ5⇱±¸¼jCÒï©:'0@éë{±ø WÏ ˜h…B–™¹/akë£ ÃxxAƒúË6äÚ-²Ãm?5Ê×Ê„¤VØb BФt¹ŠÐ4¡–aqóeÞl(Õã\Û¦­fàÑôÖ8`²SˆÄœšËWã׿H!u%B|زbn™ëjb¹Ì2^£Z5³\²€Í½/&m¯Ph³zM2 X±Ñ}R!müCB¯î[¤”2þÚ)sh`“¾‚ÊC'gYÃjþ¿s¯ÊhÑFº6Þ#§(7af6ˆrÔµ8ÍjQb"7Žpã7úÌ/aEk湆†ÃqË38ÚëáCM„q£I­oÜãÕ,#裙j.¸`œúSË¥rÇ5m±QA!HN¹«#MmÌr^fïvÅëœó,«”sI}‡#EçÊ+uú‡ Œ÷ª÷Îþñ#„EŸ'^´QÇ«Ÿc�Ͼí®M¼Ï»-"w°hCwàçF(µ’�¼+î}HXwMpïkó« …Èý3Mÿo=nq­ÏF.ðNȲíc›5/ฬ³‘‚²c(¶æh�Œd~÷÷ƒ;}5ïã€^²1²^Ä Ôôª÷úˆ™Š5ñÌÚõÂÄeOÅ#ÄÞÛ%c«�Øo®ªãz<è”ÜŽ.ùMù{(b6…Å(¡Â9å™È™Ð-àL�v~Ñï‚#> –-Y€:^!��á9óhŸšõA—`Ò'[A“LëÙq”›zk7.Bg½(¾õ2ÞNb§ñæÛƒæ2A×§W`Ù–4B“ð†;Ÿï3®1ð� ’¿ç¾4P]¹i=ŸÕÔ¶ðÓÁüŽ·;ÿ=2H¤½ ƒL¿dtÞ ˆ%»´-h_µŸÚ1pWĤhÐyå4½¸“Šd8{íÆ³œ•9^ä? ÷VÛÜÿ\AA ð…‰^óƺ�Ëò?X¤œÙ'·l}¡½àÕ9­?w¡³2áè\P›[+8\ý<Ÿ³âÛ5?æZÇ›[¼ÿ=Oé{ÔºzÝñé†bS¸<‚\g±:á’"aÿFúðƒÎóTMñƒ1‚H’þvôõ�S…bRʬd7–vJ/z8¸ej´/÷ñÛÉ i·±ÖSˆº³Ù�Íäʹòý|¥ñËw6íEìÃü¥¥1öÿ¾a P»&Ü6Ët"-Õ¶B´êo;iFK-Ü+çq"µæšù•ÆfÌÑU?~¹Ÿooø,»ÔýsÿnN%Áj®Çø@dÇ‘Ù@zþ—`[õ®QJï¹vå?-»€š«ñ9Ð-�?ôÊ<¤WÑ] €9Z@€I{”àÛïJ¦�“ì¢q  W1QsÅ·˜�YÂÞÑê_E’Î nŠSÜDðôS#7f óVEÔà00¶�ËÄ¥´—ùŽÔxyA³6=ø<օδ •ïÇê‡æ)J %­I׺ÝÓäÃ8b¦nF·×´¹æ_~/{¬÷VgÀÄ“v©ó aÜÿ²¿&.Cð¼iH. ¡t Å ÿqÖÿUEmü7Ñ`Í5a1ïÂþMžd·�ïý`}®BõnùQ¥IŸóɇ¶5¹õÂó#@ú¶]Õ�÷ë—»<¨Í|À 2ä­½Ó¦Ù*9;+Ub¿Í6ær�·söÇP#¯û^ùë¶©Zþ®3�ë™åŸ)9Tž�¼QXxVe´�SGˆƒ°Û¿ƒÇâ]ŽVEgÈV?抺 ‚",_QÕ+tìäE¨1âVsÛ‡�‹×ÁþÌKοmXe­“Ö®bÆ@ íõï*4UW¶¹Û Q~^‚‚Ó¤LüYù#ï“lÛ©åÊè9™<œ[qZP,¯Á­–ë¯�w#¥ñg ÛÓ±ÒñoÛcï·y‹G¼d c,B-8õô ¦ù7Ç¡içMŸue-=_9Ô§ž¾q÷1½6¡y¯½ŽÚÓ�dÉl¾½ù÷ΨeîûÅ¿ÆA›Ü{Ç¿�6yÏ@Ø Þ¨s¹—Ñ~TÞƒäZD-” ÎJ¬� gÙZã( òìWñžÈ¤³îú®œKei3�¾Ê^Ùdô¥¼HƒC0AÜc=ò*ãÏ|¸ü}ôäóº¬aàœ ðôÊÊ^²µÓŽ¿ó}dl±éèI© ›!£aÁï6ž—²s›SÜÖzŽÙ£Z?\kØlS÷1Œ¸Š 9º ×ß ÓBÖÕÜEᇆ .³?ö-i¡Áo'€ÍÍ ˆ&­ï°=úFÁñ ¾¨dm•õü×][ð�Oq¤=àVuß6)Á.:NÂj4D¼’}ÛÚïyEZA ³Åêød5IŒþÞeU‡5§OŒo$zrdïAÌM™v‰º¬™*âGõy+�ò:1¾½gŠ œ¶0úH}8l�uâ W®'¸¾3“³ø¡AR®ôˆq�(I}ˆÄ9jð9Ç]-&ÍMÛÞ¤ù?ü6-û¾çã¢S8+d‡âõ}sRüzs=" J^úÙÏÕÓ’"( ¡Ô1áJEã7ãa£¢¡É‰ fýج9ßÕ’üPB1}]0س�ææêÂÇ«+ÕÑ  #Z!ß±p ÂI8ÈÈ8EÏŸëiŽà� ˜¸ýÃ‡é¯—ËØ­%Æ…~}z+W…ÁI¥ ¦›èø£™m=y¿ å5òø°µÊ5¶;H07�¸Û«ùª·ï×óë Ò·tŒj§í™vÜ,•~°Mn½ïqÁ!\$~eû–.eõÍ�î¥8_&ñ½—�¥Qœ=ÕœÊw¥Óõ.6ìQ}ƒšÇ¹Ú¯›‚Ñó0Ê�.™æ÷|B[6BÁ˜„»¹ŠîtH=A·ØÊ–£>'Yy²{EÛ’?÷°¦\®ÀrßÕW>vÿJëÏö¶óË‹f S¡…| Ì RÉ×�‘üòÛös�¡þæíD$[ð6×ÍuG ârßæ ɘ¸ÿsü:}q¢�úÖô;ûËÀè½Ö$ãá6ónåây“ƒB5LºÅe?nYÙÿé s î¤ût~Œš2Í‹ñ…38N³±j(ê- t¥xM��¨m$Á’΀ •ÿ[–¿V‰+?„gÖ¾ï1…*Y�>¥ÏE\à~ÈÏô—9½à¾ÆÉ#c ‹cB-\& ‹¨™!ÛýJ8êÛп‚ÉÃço¨µÜEÐ'ªp0às!la‚ýþú#ÇøÓ¿Q׿ӟ_2’dxYGU/¨g©£ÆM[õ·Ù·g+n¾øæèج¯\¯_nÿî·;w´ÛcI¶Û?‰�ÿŸ¹ñŠuçÚÿç–Ú¨ùd1 `1¶ý~÷ÑœÝ?•ûÿ‹?ŒÏ�`clhl1=Ó¶ŸT�>?+üóƒÊ±é·SŸ/d€ $¡:ò¯/(Ç­ÒÂ`ƘØÿ>½|hýçÁ긟þ×딯`0.é(6î§–|g¢„MrÕ7ìp˜Ú` ±ƒclð^Ÿ>ÿ´øëK=õ-“;é«>’†ˆÙʾëö=èjù[ÓÔò4ѶÛo '�1Ÿ§«£6wˆ—øìí\7l³zë¼(9ƒVÛûçóÑ`¶¦¾¿ßox Ù1”‰˜ìV¼4ÆÛ EìÀ£�ÿ‰d§昑JTÞ.€£§­ÐH$a€Ï%´Qéçÿn#®ÃüzßB’¬ý1Îo”*øf2"F&3×ö2šn¼©ß¹M!´Â•"Õf C0«eµ«•àÔã,Ý4³%«ë·ø †Gi¿r0fÔÿ¼ 7ì'¤z>ÓÕ qoô•µÏ7~·~ïÙ}ö×�@�ßîÝ\ ¼îYH:™)¸+?¬Ær/I®¤ªùî¡Wx÷uKmï•G›”&ü�Ò 0ðc)ŽVuMÞƒùŸ{C̞Ș|£üqv ˆ[*Ó«zÌL8°UM¬1­þÆÅíÍ}YF¨y�&C0ˆˆlÿU´³±S1G`ÂRXT¢.ö�: 䩯ÃܦÉ޾$W";FÛ¶LOâÛÆ®`¸¤_m«PC œ�xûFŽ›êÑ–ñRˆ îD0Æ‹ª—ÀÉ^¬lƒ‚àV(²°G_(Én˜‰•-X™³FÄ´•̵�‹»ì£[sCJíÐ~ë^°†Ë±÷ß™pô·ò ÿ2ŠOKtÕ¶Sþùü™,=Æâç,]ìÐ>-ÝkÿÃ}Œ“+ÍÚÕŽq-–ëÖëÁÉ¿×ÄÎ.Ãû?ì¿f÷ÖÇisÂO•høæù2Á—Iï[õíl=Ï:�ܾÚ@ä_…Èêè{‚ï—ÆTeœ<Ÿ�‘¾|¶Ä_{Wlªç–[S¯šì BAÿ`€ FÐ]�vÎk1´œ™r…Ý,1^ØÃì7Kqǰ§_l^ù8NUý ûΔ¼ÙÿÙq.B T¡4q⎠Dv…žæ%`sÒ×|#|²y�àÜi?O­Žk‹½UX¬S�¶×=í±‘r¬¬&™març5DÞqN½ì’Ü÷É‘©RˆbTç-:ľ°o#f3‘X=VßD[ójí;õ³·MÞvj¼;ÜùêWJùl«,„2FðgË9Ñ3,:eå¿—´Én`Ä�µ¶Mw4ÎNòòk%oKÜ�„4 í|m Üû¤‚ü[¦Ànk¨ÎdZ'+AZÝPv«8hƒˆL«2vÇ?°s*ååG�ó{5f¼ÁØÉ©Vì�dʻ䗆QrÇç æù¤À4öøa»×Ó)Î_e{·¾ŒQö¼¿%Ž\õßFé‘#å7÷Òs}uP*Üss¡ä'ù‹ý{À¾û“þ+mLS -,ýßOìÔ±¹ûŠÖe­:%��›W;\eÁ\ñ†$ƒQ}¶�Ý®7¡¹ë¥_:)­¸kL`&ÃÛä8‰ýæ;ÃBÒTÇ�óÎ'=£pIp]Ÿ]v î Ü™&ð˜,�›–N {GÄÕÎÌøÝéú‚BèèZÚ!bQÊîsãŸj|Íð{ºäÇ[^VºpV0!Ÿ32¼¬óÀ›+7q ¤4X„A¾JƒÚÒ &+ú`{“Ëx€je3Œ  |7áŸ>b›=ªÓ„O>l×)”æµåy]ñ/;õPæ˜wNÊv’eEö¦,ååÛKÒ¾úýz'-� V`ÎúR)±Û ›«‰°¢É†êŒå°= W³f³«‘ žýOoÔdŸ�ŒÕð¬GM…S:\� œ§ÈæÄùm↮ž[¡6Œl´§\ÿ~š"¨@ôtC<΄5†õ E£AŽöE"¢6èðdxžƒô »£,—˜p�ýSËܤ�c| Fßþsïýo°ÄûÄ|ùKy Ç )Ý+ÚU`X†ÄŽÉm(x‹1Hû¨²µ´Â°¬ëe�VD}¼FSu}Ä™ç'8c˜‰2C]NQ·›âIM‹ÈÏf�‰P]‘Rm1+V,eÒü ñŽÄÿ*nèw÷~4SÏ¿MJ°_ã�ýD‰}Ó9ßšëa±u�J\ùOb©R’R«kŽRlÖ…`tÿ+¿&g“DD¾¦ª�"BµÊ'Tcßê_“?=År˹¯Íü/ø †_ýÿ¿ñjó÷âqvY)ȯ(]¤}iÿͬ®5Ô)JT|×ðÇÛ·Bgz¹‡è`iYuØÂv&­¶:—`jÛâKö£Nî“=µh ž^ŸøœÐÈÜÚ·ˆD¿ø¿ø÷í¯¯¶ö5õôülö�Ûkèîz×·„|T­jî �?úR:ßýÿ6j=£¸c‘Â,]Âöe'ýïoc÷¥ýºARíÆ 1×Zë±*¦—vÚLMñ‹CÅB—»UÕfXK‡SjÚí%D' ‘P¯ƒBÅøD™^j6‘9‹è×zÊØF%Å;à^Ñ÷œÍdŸyòv÷⚉�2u‰6BELŠ" ¶qúßãÿëKºm5o?e ¡¼nƒåÅüÿ%-ô¦JùâLØÈ‹x9ßõ ~NfCcé¤r¤º'ûßb×õø8µ¾D¶w4)œî¬Î!ßÂq‚óÁ¹íqkï œ9.hˆ5ü»ž–;0t Ä�b¡š+ZD¯Äû šåØ,¨·LÉg†¹br 7ðí‘úiÓH‡ëD±êx¢Ü7ת(Qi ÞÓ¡þ.\ãüc½Þ„V6„ÄÚp܇N%!PhúX†þÍ-ñ€Gÿd¿¯Ò¶#Ľͳ«ã•çXÿѾ™ñO¦{–Mxê�³îȇ ˆ¹ ÷þ”J¼á ‚…øùÁõ�1v`•ôm¯Š!w c)Þ¶Q%¢3åmï¹L›Êª¶Án xÐp«ë&êD7eE2}%bÿv'q!�ùt=LG§±_|Áû©´MÏÎø�}p­r,UôªÖÛRp‡x0¹nÇ!•eFT”Úº†\{Ù›­~õZNFo{&"–ö"ïÍŒÝØÄˆ9 ãAXwh+ÚKçÏ>OlL^v‹±HÖö=USY/22�Ôsn‰ŸÙðÖ ^èPrùÊ5?¸„¸åS¶²šÍc&ŠEŽ* §J}ø¦þ&Ø7’ˆüuéj<ÏÖ&Ì §…„^�`ôcÂLÔt[YoKÔ/#Ó Ø/1œÙýêng¸�1ª)g¾èëqë¿=�âåú‹ÜEVWÆ–¹_ƒ¯xR+♸|vË/x#Ë÷ÅãÓšu¿‡‡¸yÙ.1úÞ±Ü�³­¿9;WиäÍSø$Òh’þøzÌÊ�àÁçÜ'Xj‘\2íZx—³b†£…ˆŽSOÖuÞUäf ãÃ4ÿ¬§dÆ£(±¥àÝå-"æ=ó{ôðÙÉòa=ïCÍu ŒFk@¯¥nÜtœb.+P‡ÑüƒŽÕ»åóºÖË÷+.w{¦~Ž�*0[ÖuÍe‚ÛÍÍÓÓwЮm à{¦dÔ›]oh”)#¼‡]ªàïf¨¹ »ù–¦+äàí�õªÃ9@-dÈdLæ.Y*À‹eK: ÒBtm‚ÞTJoÕÖ°Å`¢�P6Xð:‚}ðò»­Ýå|Ý÷1…ñ² 2j8˜»‘¹: ÄS�þ°+¬’Ó5Œ•@—‡Ö'Ó&NHH>_½my’E@…¨ÓoÂzg®ÆÔ¢¾ËL—-éÕxXH‚ddð”ëÍ k¨Â\‘ ’;_Û¼òÒ3çß>"ªœ.‹‘Ÿ•—ÙÒ=ëäõ=cqÞˆ¾/›¼ð3½��Å9ƒA:ù#Þ’ AŠÑ6q;/ ëÊÝ›ÓÒé7ã QwÍy¾•Ưg›¦g3¹J™P`‰º–$º9Û8ÒܸU™ºã:¾±p‘²DÇ3VÌž|1Üß™óß™(Z¤IW&¾¼ê†Ts#éøŠ‹‹ÆüÔ†¿á„žRwuÄ“éá#sã0¥,5ÆþeÁ¼‚žÚíÂ6]i]ùËü)~³àaðcœzÖîtÆ{„’ê&È{Íž�2«¢t+Åæ»”Rþ²uçCÞãÎõ�ŒpÆT2`ج;pØ¡ÙòÒD›¡Us#(ËœAå1zñÚ£fûˆ]º¸LòøMÎÕ\‰,(“ÚÓ1~j¦´‚tr"óiy»ÂcGcv5§$Åól/yðÑ~+Ug>·²Gè”DÜásãNr\€”v¢*>+ÿ3¦ýE,‘ƒ„¢ yèà`.V-\&Ë7ÉY%�¸ŸßËlv¯‹¡„½(M¾%âí@Y±ü­s’O£îºÎëªùúêx-6H�†·…á˜�+MÏ0—®!J lÀŸtÖPEi+!Xèõ¯ä×LÂ_­-�É<_‡ˆ×Sä"¸ ‡¡Òì›Û:;bÁ{�1¡ºJà†×;é!Dêð¨H]feÓóy«¹|´Xˆ„¤ò昳¹Q�HÖy–½Å¾¿W˶Ò×ÍÕØ•uWo„ñ·‰Í F5­W=Y]"{ŽŒ†õd :çtNÇÓŠ ¡È °+†EíáJŒÇGl®óÛ$¦léq9ßôë¢Øünáü�3v ,/ß1Ž_I0·gËý{‡‚O_þ{-T5�ÚnÀ·`¦Ÿ¸Ž;1Š T¾íM½ˆÙµÞ‚¾f?ù`³q¬Œ° ­¸}oO=)ï�K×Ì0Mc¹Ö«úWUá ô”öúñÛö÷�µ£Á_b±M`oÆæóí"{>,tÔBûm©û’Æç¨3ã ÕÒ..]¤\}n-͹¾(¢Ñæ`³Îü– ÷·=^³¿e<ÝaÑ(�–æÛÌÊ6c¹¢Öþøž¼õr™*n‰ížôË—ß Š_­×qò�ê‡|ý+ñVQý})ÙGó[¸lU· ù¸…íÓX»Ët=~˜oÙÅ2 �‚‚¡ <áöVj æ¿Tã¹ Lîw{+üZ¶m�)‚:ݺ÷µ;Õ!% ®×<Á%W ûú ª§·‰�Ϫ“tì@Æaûv’�gG3nžVhðÚUR¯Šˆº0^4qµ£^Š]¼MŒ¬ )Ówa9¿‘˜51ÊA‹øû%Ù(‡:à6óïÂuò|Ué;¶.#^–ùã\k7‘f•kÃÓ.ÜLß@èôò¿pçy-识͹±ä`òzŒpl¶Bê3;Õ{Ÿ/r¹ÊkÈBÑEˆ‚Bù ®9pI†ØÐèd¬yJ±´5®Ÿ.yL}âyã æ|žë±”Ð=ù¡!šé’è×{kNUévmÑdd.¼çÎt5©À¾SÞì]¶4rû¤r'¶ÿ†?û± ÖìWª'·É<[5䫪ÉIâ_ëÂèˆUÑÓa¹AÐ'Ê#£öøðã ¼ï+P¹Š�G.rGng–Ã: ºw¿� ðøyC!]Òᦆ 6 “ïöÃþ5Ò]] ftØŠþЯŒòx/(½~}äëJ}H¿®Yt Ò¹§»¿;1QÂ}†öûœm7Ye8œ^}Ó½Ã.9›eŸ»>TCxŽ�¥|»Ïë¯úNIˆEÙ�.tâI«·JP#h'gœ¯M¡-ÊÛ.»I­+oô�<’æÑ®äÐpó�–Ô¦O¿]n¼¹8k¸5îk-Í]ÖÉÒ—–…ËiÅKiX·yåvÅsƒÇú·¿·5Òzß·MGËåÙ:û/f—¿$R¯${ç�L²ƒ-µ¥�¸Öw~|Bó!´Æ6Žç¯÷÷Ö†¿ðÖcâ;iÅ lx¦»>+*ÍŸwþïñ‹ `2õµW¾qw¤‚XøP„ú>ì+r¦èDœØy«B/WÆ‚í3E[”âEgS(FNé §XÕŠ4K�0„‡–Ri|c¸\Ts¼ŠðBhfX™CÓÊjKõªD´À£*‰�H ¢‚^ofbª ÅæZ<Ú„˜V�ªÖJVãžuþryX&}×§ÇëüŠz$¨ý‰Ò�Üe)púYÊÿá‚4‰%¢ùÌ~ªÿ†ä8RS´l)ÔçS»mCQ1"†L¹à£GTjÄ‹U3Ìí7Ü4ïÖºò#^7˜Ö°µ—ÿÝ»�pÈQî``Ô‰+Mt2ëñ¼î†{áð–Òô‰|_‹YO7f ¨5Í<^ç‹ÍÛ23bÍõ[æö³‚àÖ\½|cØæZ<Ù¤CSf-åY%oGÝÃŒ ®J³ÝxØ×z´º-µ9.G“:>DV8ÿû�õ9[Éž¾..GÛ�Ö÷EÁ›°ßZXÜšhÍÚsÓ—�˜º¡Î¥�µØÓ x¯V÷ÄVvïUe]³¦÷ˆ¼Z‹Úܮǫ+=؉O¸5XÒÓrºÅÚ*õ8o²›àqÿÔŽöwöGáî«»$99ž“ùwÔú|Ö 7§’÷AÂÃm_¡ï¤BßÄÕÜÛÄk�Éf§ û#ïL½[–äjêDW½Ë^ÆøTËÔ!Ž©Âδæ­×eN`�Œú¥z^G¸B¤�„Íý×�—'£7Áçzá®ÃEôóuÒe}&ó^NüŽ®3|¶®ÒÆqxFÔ2õPº, ¡Gƒ{�-®åÇ•w§KµÛÄ^ŒòoÀå™wÊf—†/fû,äÕ×â½÷8ï E$Èàb(Eç×m%¹æk•pN*m†Žbþ3c[Þæ„ˆÛ'AH§ÝÂÓä�²i?_-ååª;ƒÙõóã"— lÃ@€ÇpGaë¨ãÁ«Ù,5Øï€÷«�k(£6ѪÙXetº‡°¡1Ebp­%kDŒàübJcÔ�%ÌOÌÁ”Dß°ñP·xå«÷‹¹ß£:Îù¦åC°¿Y ¶ðó¢ä7­f³ÑfßÍ·�ð¸÷Ü/oê@½JÜ�}ÃsÝËß¼LåÔ1 G2Ë…öE®JÌ,.>S@®XÍ·Ž»ý÷*pOÑð†P;n\‹ ‚„}†loÌ=®Ú›óGýûµ·-{�xð«À¦‘”¬x·Ÿ žñ½ Þoš»[„fKoŸ<^£ÓúŽ{9·¨@³�9XnÂ�ÍA(Æ$s¯cáße’¡Ë:湓Ô÷Ÿp�W9>ðA?l”lƒ§$켆báé(aBà‘ûÅ6;ÕüÙÆëWAÊÖð+˜‡6bx#<ÂsB·v©Š³xŒÐ~$—<¬FÛ](µÈ½…Ê0v¹|lËÃg½ÙVolŸeÕõ»&:æa²È+¹-ã¹$Zu¨ñ·œÆæDZÉý¥.÷&ÕNz•çâXãýküç^ÕöGF°Ëß "í^—K’êÿòÆ… zôñh YÇ9Åœ(½q2ö _lß›:ÎÂTŸ S'–‰ÞQ\o*‡�6Ô2¦€˜énù›�ѱ¥¦'¼ØSÚ�Ȭ ;¾aUg9aݵd¥¦rêÆÉ¶ŒÔ�¨T7mI¡¹é&c `N'kQ ¶t渡å4ökÑðxþˆØj­¶¦â7»Å¡1D¶S`.fî7ÆM0õ�mv  &áŠ?Јv¸”c¶A­oÝÞ%&ÅSµùÄšŽÝxH´¼^0f8‡Ÿ´ÖˆÉóÆE>Ld|2˜Ýõî>¼]q·L8Ø \V\bÊŠBøC(„Û°ö Oqïd°L\ñÜ”•ç-°RiÂàL>ÏY<–ß( ý…,èãf§C>2àTÉg¯4Òð]<¾�[¯pº‚®-9ÎoÖ|!…%"AaB ÕÏÁ6B÷ß.U» ì)4šÒK’þîòO’ây 1÷5í׃+Ô¿UïöNø)丹i têü`EçLš]!›øŸÙ>–>ðè±üSž‘’x‹S¤ñy:Õ`>�Ég�‚ËÓSa�Íê H†wüÓžà±·ÉôßÒtq$mèñüÆ?|åµbjü¡ü¥Lcºý�ÎvܸÐýÌÀû5RTý/˜î]é�V`Œ‹ÓÚ +¾±ç¯ç¦…{¼ @§ÕõD§úýÏ­ž ¾— ²Hg´ð ñÁIC*ü 2å²Wóqrû·y¹é±ö„¨Yà×Ó/Š„ä‰r}(›ðsŠ “Q´wÛÎL;™ ‘àä»êïºËYáYИZÍw§œx˜RZ|/VZÐ5ž Q| ;Ö¼ÓÐÖù?<×/÷9¸®¡lívos$V¯®ƒÛà�‘u÷Þ¹É<,7ö¶ìí_¥=]Òø§¯PŒFìæ®·wÎçUêÅ\t„¤Û^J·WKƒR„}ßi¦÷Úî%AyøÕ¼ø_:–Ã!üœý-‡Õâ`i¬Ô‡’€�̸¾\[%id…»`�$4¤•�Š_d–µ IfÙh„’÷‘Ý«Šÿù\Äÿ#§j…¿ŒÑ謶Œ�Š÷?…Bø~˜6%7ò/1Þ蜢é>Ÿ¤�]‡D"<äG­zž.½o÷Ä4yé Å¡’»:^ÅÒŸ}oŠÔ p¥Ì÷éø>Ó‚Ÿ§Ø—g>øbëfs³zb£¨!”×,+ƒá5ú1cóÞ¯•r›-× (òïXžÕRÍK„PRö2ßh Œ¬ÓF™�eRi0Ó­/‰öÏa¬ò L´J%[¢ ¬ÕM´„Q©¢µ5)˜?àJ‚‹xCkßI W0ûCKXÕå¥6((h¨ ±¢Á½ZÚáu®%¼”Ö�ïw8Äë_·:t¾,Q}숿cñð§îˆ�¾4€¶qW*ã\![BóãÀláæŽW^ °µ>¬÷š�ÉÜp¤rôØÀ '\‘¹çA3�ÜMvû³Éní~²vH!ê)ʦ{–ÿzrBjÏl“©|E>Hñ�T‘iòV,C/5æ; %çÂÖ8zpñDã‚b”¼!)ÔHá¥ááyÜ_þ·« {·OØ�ãR´ªÐƒ¥ã1xÖºFY}DšN%:Ëk°¼dÅü¦õ’I±Ä×®9)ÖÕßöïY¯m'ò�¯g¿7K¸¨§=$#Є–8„‘Q%B”�d\—gãcy+rjö"æÕÆÿbOm4¹vÀç‹�<è¯pzCm‚?Ü01®zŽñA궤@E}Y‡ž¢^= "LE…Ék“–ÀïÙÁÅÔg7§Öì×1ÓoAãw<!Í{4W7¿d{kº³Cë…»›+Äc¬LÔ„kÅXóô@»æëá¦ÑO°å¹ÏýèYˆS~Üt¼PPÄCDe_ÏJéýá«ëöóCËú˱»¢3Û/ì�åð%ÎíµÁdl÷Òœè;–I~O¶'¦G‚Œñ×í¿‡%f¡ úÎEä|X¨nb]ûÁ븒"·ÄA³aöôû2#ö>fröä¢OB¼ŽìÐÁÇM”×CA—=ÊkëŸC7Fɺçö¤jIÕy²šð]4˜P�ÖÊþù¾(¬Vb°MŒ;fu›G*Ó‰V5�ç ÒP"Èm²\÷—1—ùΗª=ýC„_È|ÁlOÓC¾œê®ei û, Ü"„"H û{ÇxÓ’KžÅËá½�óƒH`¤ô:‚?gÁ!µ`äÆâ ·»ð9xCßrÜÇ2â§AÊHëaú1!³܆ðš²%‰³žáš=õ ;²wcXÍ�Ëh2k3Oh·#|Ø¢Y“ó7WFãxÌå©oIJŒ‡Åà ²¤ a(2¿ïÌ(@aîõ‚ð©êÈü¦Í6ŠÄ¾E¶ÿ@~sFk_º¿SH-KoçM¶»êjw«ßPÍ¢¬ŸI$ç­Dº `zªL3rM]Q>Iäñ®1ëªà(+_ÇwÆã/”vßS7—X§Ñö'˜ã(Z’wÈè‹Ì£Ü`9ÒñdÞÝr©”höÿíלM+䨧Aý#æBÉ7„˜r€¬Áý¬{–.|!éxâ€V”h|¢¾Ý¢vÂÏä˜íÐÈl¹v4¢�©³ËXfÛÌ«6cÿ]ãôqt¹)lÃuòM{ÅÃ×IrÃ]i¹s5ÁQŒ6!r¿`Öð‚÷ÿ°Q1¾pöGxÎÉá�Æ}ÙË Aì(3F04¥A-X[nìSlâf¶‹‰LšfÀ ­tkï{’§ÜïÅü}Ýdh±þºë®‘—O¦QNEõµ:œŠFRj€wë2-àa‹ •P¹š=äÁ]ï.y¿ß—1:O®‰—ZÔ,ÍÓFð�Å,•ÜšŸ�ˆ"(>–A$ѵÌI8Ç”ò· ƒS1Pwk]ðÑ÷L—H.HfžÓ¿p{Ζí„Ïš\,I/¸:+ÍíæÛùa?ÎK¸Ù¤iT*¯Q0lê^ Ë˶ƒĎòk¤W'Ñ<˜Ô¹ˉðï?Ÿ ^÷´ötØJ�D|„u¤.äv™SbŽ ,°Mx .­ÿì�à‡[î®È�A4á‚ý EW’)ËÂ6PÊõòYÜòâx“)vÅÚ„‡8…û2{¼Ï»³£ÑÕ¬¥²3w˜‚ 0@g –Õ$î Ùn¾“Bé²t5Kfõ¶÷ˆ%Z‹È½åòÇ–XÕPïÓŠaî¾Ã¦O®bvz#¾3‰šÄ¸�=ÍGpœs›š3»µ7ë�üåïJµ�û{YÒ½°ùuÑA^ŒN +5©Îg¸…òèáZûÐVkÂeL6Ol”Ît�”-’»©g9z”™(Ö%Š%Í+wf6¹Ü�rÊÒîC·ÔN©*Y×ãKà™ÖˆÉÊHëo¡Îóv&¯Æ3=Ü3YƒYûk—'"L\²',J (0p—¤ØAB$Ùa”ê"»ïy¡¬ïT•©�iR(e_j)V,Ã"”\ˆ}* è–¦×ìÈò|;ò§¬Ê.‘xÙúEó9TdÎj§­K‰LCE t�„$vÔ­;¸=v´jÖ³o/4ýÊz•Ó¹ÛÅšUu äŠ÷“j VêÝ7aer}-êÈú¢à4 >Ò¨fP€ú—ïK£Õä6› §ˆªê‹QH•ÄÀ2ôM݈¥ïˆF 6‚y´ÙQ[Ÿ·M6j%,^”•H„„´ÌФ™Ä$2“BΆ`W®S=kGé÷uÔ «•;º$Œ(f¼;âž[(†WEÌNãÇvˆJŠsS\%Ú‘”9ç¬!áôzG5&®7t Ã™U@(*5޾kOÒùøóç�ÖÅ¡sF§ÿ~=!öSþZ”¨xþ·�ÝiÿÕá$¡"PJVIŽw,\Ü_ýë·iPÃQ:Z]�I:‹ƒ˜?ö¡³§\ÿ]5ÖþžÔìéÐ0hj!‰^'¨óã›™ mßËüÔŒ(8®þ0—º«ëWkˆµYˆÛ=“ä"öÓÌÚå¾zo…´v纳’Î-¼á`û֡ö„Æ Ó;¼|= I@³åkxò-ÿ(ÿk?vV�²yY{í|îS±ös¢¨“ef» ©ß´î�%fÎGK,"òGwRžÄ}-CxUÎÇÏ�v;±mø ǘ‘vœ�? VUͧF'òà¡üs(ãVŒûZâ‘{¼¤'I„y>:VHt‹JJo„ <Þ¥'°=3 ©$�6 )¼4C†Y/"s³.IÝÈÅÓA1ØèÐãˆiÜûwôñÌÆr¡XQ:²ÎFZbCäçÅÌ"Gš{—¤�ç¿üû¼Ç†˜UÆÛÄwëˆ�Ü®Àœg„_K}sZI°|gÂ0¬5¾JýNB�u¨Œ,�?q âE~x©µ7n—›8Jëºàçö­ŠJµ6ÛQrÉjü¬¯athƒgºé >(¿Çò7ÛíWÁ‡Â3´ LÞ rÌIǘÛ*g3 ƒORÒç™·w‹­³˜ã! Ô÷ƒE¼¾ö6yŸut;G"?ÙPשŒl\i3éb÷Ë¿8ñìM8Ÿ5é>�]O…ŸÁóD^-™ï3£dž4—Á+Žd#4ÁCÝ�Ï(%Éø±|“Ô¥ô|8ih–TñÇp�MÀ6=€¡ÂîDŒÏ ëIºtKóòrRÿtL•ßœ ò.²Ïêà–+¸¾àD�äx�#ƒ}ÔïÑ·D¦ä¤ χ˵ö×ϨT¯;û¬ ÕYzaövº;… Wo)S#ì=tøwãíÚ5J»ˆ¤Ç¼^ïžÎô<<‹/n¦Üï#Xãyåm©Á]¥ý÷q±Îh­WÁxºòoµn+ 1—ºöT²Å0U�ÃÓ•r3R•ŸI»APx•ž�ׂm<­Ë¬!m&Y¹5⵿ }ï¶þÓþÔ‰ä„(c™Œ]\vñ €wÚ®— îÎ^HxËk¸¬XÎû¾ó8Kw•‘éXA«ñŒsƒDyݽÃÚ&Å‘Òæ«EJŒfêÙdÖ´q¯Q‘à—.;ÅQL™ aª[]Ï_}ägzÎ@[#êPñõR“)¼ÑâY﯎*1|á·¯wS±³•íÝËqv¯3ëkÜ•o\�ë(X<ê&2ƒä&†¹·I­ÐF»S•¼´¯€~Ê.=Ét´Ž³ŒC{çªmëóz¾Ræ)_ÁA’Œõ¬ëÊ2æõEÏT]ó 5³E„ÔêÐíCdÖ¯Ýê �È"²ÕFånû­•™ª £{ ïF]zÎëP»N/Í t7žI¦!¨(‘Í8Zý¥à1ž!q›bÙaCùŸ“ß7ÄÛµ¯‹Ny’àÇ•  ñg!�]¤£+¯œàD—wœÕ9—{ö:Eo?hVHe s=´2ìüŸ!Ôp¢àç6¦øàé ‡®«Æ1–hV€[ô’å¢ã0°ÐÕéuS‹§’yåé¾M*–¤î�ýÄ2ŸôEÎfN¸ðgt¯UÒYI.ùÜâ_ °ÈX,`Áp»½Ô‚Fæí}É”çxló”,ŸKüëÖXûÇ÷žw ç‡ßy­©s0mI”›¹ùË]®ç�Åøq¿çÞ‡Ÿ2Þú“™ø�–�5ôÁO†Ÿxy[d’Ÿx Òc:ÐÖ>™=?ÈR½eòd’øþ˜—òX}EM´üK¥iìA÷«¥ä³±@almÃ1u;ÖŸK;�Úö)l^o²IñœYr´Mfè¡ÌŒ,Ÿ‹šÜ•TXã8[–í�D].³R&ßÎH™òÏ.žÂW®>Í;°ü “(^áM ;N_K5!kw_̨xzkîµ¥Õó¤ŸXÅh@Jú®8úC;�nýQÆ�?ÞnTBô¾¾ÃûÜûà)3 åŠ4Jò¹NSdÞZz:dQU°¦Ã#ÝÚ šIÖ9›´`º”Óæ/-êÑ´IŽ'Ôn�.<Ïz-mhŒl¥p/‡Ñ5Y/(¹ÜDU˜i¾‹A%>!­�‰d9 ž¥a­}`9[ó(¾ #Ø|óZr…œbïÂ7bð*ü|�Lœ(ý¹ùï|åô«Í_ ÈfPü¾½jûu—V”M³\0�!VWB�Ž­tÞ‘Â’7±‘ÇŽª.¦]³ì½daß"ç·1eлuAª 9±íQ4 ž¨ ÝÐ+»‡ó Èåo'Y®¸Äs{NÖ)°¾ŒØ3ï¶“Æm7ŒŠRè:v(TÒ©K¹5žÒ9£,ÚÞô‘G½ÃjÎå¨*@ÜVÂæMéé5ï:3[cìFw}vãz𸑞³®Ö‘P‰´íÚ·žCöùí8"ÌG5áÅÛhÍXÃO ¡/·ˆmPÎÌÈg�Q¨ñfÂ=U©ÆYlÐFªÆVPµ J c\Šhn!=8Ú±üD5¿4~Ï¥r2·¤W A½¹èE®av4âø;â›løD.5–OAÒIóÌGE¹ D™[cj†@ò„±mäpídµ kÈ®Æ�r=ŠËAgÙç­§�i@Lµ4·¼«›ûÀÈ ´¨žöùë=²þ/ˆÕÙ|jlôOÕGÇq�ØØÆUë²9©ÿðÒšÒD!m€ó ý;gZsfÚ¨jµ‡/‚Á,• ›cÁQÝ�Í|AjA â;[;t ›º èÎ÷ƒ6s`ÊÝ!¬·WXdá—ŒKaçJb°i0+Ü¿ýš¼¾ÀÆ27inD Üzþ9ÙÁŠÚ+ª–�Xõ¬�(RôßÉ"ÿhobüI6á‹ßv×¹˜\�YFÅb9D� Th£c«ã•pi½ê\è=¥�1pB< ú(·åá63¹¡§Þ¨ÎÉâ¦È0Ü`0ñÒÀ–clèmF0V°ñŒ9YÈ+ò7ÇœcGŸªä�ÛSõ ™" ïoe�ã»ò]NÏrŽŠ¤Ã8Á8Î6Ä–pU½øÐ¡gG,« íY96òÊ9±CZ±tךvª$eN$�Ÿ½â6Žpͬ¼“i¥ËUwºÚ‰-ØY`ù&\ÞÀÅ�Ñ]ýèó×…mÈ�ÒÁ|.¼ßÎ"5Z÷fÕshÏ*~¦1½ªøÃð)k“–Pæ4WÓg‡¹åç*þsj;®V‘yþóõù½§…P›V¢e=÷�W\{³†ëhØaQUÌ�D j/·˜Ó5ÔFý°ähÆÛL3ëÒŠ®/_­Ü Éc¦óÅÛ"‚å¢ÞTïÎËË `W¢ÖqÚ±¡;Ö’‘ÆÆ{Å#y»;ºÆ:›"¿95 5Y>ñ�ëºÌcþQ¶1y´Î°¼5Š®mÑïmhÄtÕtB¡%–L,åF&Æ÷‚ˆå¤fÄH\½ádõ çé߯¥ád“,ùíV7)ú÷‰Àç]õ¹dºý¯<]k|g2¦EÖÆýÄCÈU¢`Ú5="‘0cÛáÇ„¯ %by:ºÛ¯ýÆ"ëïÜXׯ‡Ûùβw̘Ofä9Ñ«�··7œCia‘ ë~>1WµõŸyæ§| º¼õYA?ަl~ ‚xàURÈÎêÛ\…üTŒXáy­y&ù€¼ÙŒ±ø?eñ©À¤¢}›î·m£nAËÆ§{ÛߦÙãio9ÈÜ1ê§NÑ€f<É7/ßsZÙ^ ;%,`†³wÙš—té² , Š�\Â�ªi¯1~àà\û¢—0š:ÇuP§kÃVõà–ÀÑz'ï~Üìá<¾ QÁ+)ÈNéVâøÑ[ ¤Ü‰õ“£ˆ ë­³Pzð˺}¡®‰É\4Î>?õ?§ DDÛAáhs æ![r6YÈžé‹kÒø´žà;2¸ji£S9ÙÎd({Ê…,¡/§oU“i”È­ð¼Õãn>ì\ò‡Üåîïé ÜÝCÎuÛ´µ°øl…L:¤îT%Ï;öøÏWw,â¸�" œ½Â_ZÈO5’«ÇNIŽÎ±'>k2]G·7eWl‘�2‚ç³FÝÑÜÓ •hŽîµØ8¦ÅL*G$yØKïRØ^-Æ5…'½ÚfÂs>ãåÏн}Ä_©JèÏ8ð¿úEO3\,¯ÚõúÃwú7eÿ3_ßžÒ],Žb«§Ôùc¸Â—æ/QçèÌ}KÅt_êrQásÇ÷N¹± j5.A‚(‡òäú³ß·ZŸH¥=¥A.k þ  ^úùãc«ªƒ�ûºÇn³Ìþð#>U?ÒÎ[ÙZÓV¹Û'Ö1ð'Í©}ÕñÞ°Ý×äÃ~3Þ?_Lø‹ÆÝýÏÕAH;}‡YôH6({ΞxÙ#ÏÙÚßó· n²%£÷¥Ï–㘒ŒTø›Ï¸Œ.c“œ+7*µéæu|ÜÁÈÆ¦„ÖHø!Žž¸–¿zŠ®5Û y¾ôV%g®˜ÞÊsv"fžÍg� ‘”v :Õäð/ž$§G=ó+Ji•’lѦÍëS½÷µÿ01ŽîY¡ñl·7žªd† Æ�WÓFÓê’o¬î½ÒâsŸ/÷5°%/‘Û‹ý¯«…Î7«W•!ç«KéZ×N®Q�îWZ<�ã“ÝŠÓ䊼i Š·{ió‹åÝe+=šP\²º#‘Ul �g�Ãf#BŽ«Ð´ ¤×„cŸŠØÚö ‹x»J#]“b31(µÍÂLÒíeµ ItŒšßù‹ÅôAŒÇÄ7ËÝF߉ ¶%ãÑ\˜Ð¨«t•†Åíýп¸Y,ZÉy„ÅÖ« cÂÇT–1ý�"B1»ŠÓ.O‡,$@0�¥ÆHý¯ly‹ãB<]mdÞ.ÍFÝó�0DáÆ ÂÆ5�[ì‘õ M«–_Šž!ë°n›üÝíðg²¦º½üõïÞu÷ÕGwfšÑþ³RgX\Z ²Ù͸(£†�¯çB?­Ñà°TÚ�+Ú³&´qÜýrö>Ô‘ž*©­LÌDÅû*¹¨½”PT]?‡ô]¼Ú V!éÒaÕô×óXg¥¼«zмÌem¨<»©é%^qi^õjs£ ùf4çjÌÙYC[ÍÄÀgkƒ Ÿß²Ì]xÛcÿ‡ÞÚHÕÿÊPR„¿é®æ«¡}Øÿ/S@ÿ ÔàÀ%ävVž§Û�·ñþé1£°îž£Åáƒü^gÿ°ï2ŒR|¶ö@þ˜õ°§¥Oço-úUé±&Iä§éÏ?xy dÖÇûö’YpÿC”n~£;Õã±éŸüÛÍWXÉ¢Œ�:“ðÃ7ì~?¤?å�ìqf^Éòƒ/°éëŒÿ ‹ÝZƲªÄw®?¤ÖÖ“‰){=’º9B­Mrâ–×·ëëá%É– $++N9×>uŠ~ªé§…J“€ä…œ$³£è�äôc.ȯK™4ìOÒ«â×CÈ$!”»Vq^àòLÓæÈ·5h Ab‘fÚøskZ<ÿ®@ý-‡À|#ÑÅ:OúÀn�íW�Ee•cìR3¢,Eë>„Búº‚¸,¸iƒ�åm‰s>¡qó~¿�ù¼ÿŸ8²¶“ãQ^˜Oï­-T/é=6Ù+Ü+±Aw�Ìšýª‘ÎSÐw‰†¼®Cb$B»L –5”…tq´#ƒN¡êÜ’7Ñ)UÈ7† 7OÏ~²wõÎúû®›q¢0“ÊÔï�RV@ƒ;AQWfÙª%Záóè“hÂóæ{:½6F}» ×/|qF9¶ÁSý�üû¾r¼î¼ˆ$B_Ên䈄�$¿Ô°(ª¼%1Þ�Ã…"ï5ûA©qý<ï?“ß.MÍ‘x‹*îq²rƒ,L>½õ�ëD€±Eˆdf/Y7 qÃKŠf†�ÈJýÛbÚ&™è?Ú~™©ùü~†±ø.dzšÃ _ÕÄàþÃÃé7·¦x šaÃrÓÔÈú’²ËŸÉùJ>¾H.§ÏO"ÓÝUsòÍvíŒ_ÜdȃMf JR]žvòeðÔšõ ¿ÞÓ e×ǻǜÕPã’ô\°å“¾ú›ðcÀJß9KÁ±ò²å×õi3)c!ÒF&Ó²->ž ä±t"X¿8âuexÊìò‹¨Ý~Æô@° òþ<ÁÉ�§vxæÆœ/yËîuõ>HÈ­EøÓ_÷ÿQ¸¶oVà‹]FuöÌú5¢­*øŒYª 7VÿààØ¯ ¤ü,k|õ£#ÊÙY[˜�á„k ü¿¦Œ=د´s54þæú¯+H¥F'Èr j4.J?Ÿ3Û®cç¿ÔÃ!­ÿ¸ã9 Û HUûY)S1™§¿ïØkß´=Z³ž;¡(4ï±ö?Œ9\ 0ãþ†ùû¼�K�V ãÒ’mëÊúð ë?<’/Š y" DÖÉdÿ~ _üÔê]ÄÎóÊ2òwó@YÏý¯í<.¶Ÿ>Â\w0œoȾSd€UKc¸˜þÑ~pVb–ÙEÀ{ÍÄNKÞ<(ûÌa9’çb®ãU†çWY.Ü…Õ÷‘Œ±¹�uº65÷¿fýÐÜ}¶?½÷ââ5éså|Wñ,ÝÑ~õþóÒü&£ß™¨äÀ!h“ §oÑAÿšÓûùýuTZã20�ÍÂ'Ñ¥<š$9ª¡ý—›û ˆzÑ*—ùýZÛ×<I~»v»<öß¿ÙÙ¸d@/½ƒߞܟ§‚¾ö[]¾Ø SG³~™fLw7ô.‡~ßClh^"^·y«g>{¶¤Þ½ªsˆ§+Ñä(�˜mæ®Ëè2ãì`{{‚èǽKçwþ¿@ç3%ᙩµ)ƒER°q„Q‹:Á)’7à2§&zª´¦ ¼1–›ˆàÊÊbj\J'š0 ´ˆw*9i»&¥~ ¿ïÖOOžn™gõôn³ú—Â/×·k�_.ænˆ1žN‡�ü=ÔÃE%ÙƒE 2‚ ž±ƒÔ–ÒâñW"Át7mÀÁ�Öüôu|~á�tÞá›>©¦’²>àqÂt¬d>Ðð#°÷Χ1¬;ü7îÅèì¤:Hß7â±�ü÷C�”ûô�c™'–ùFyá»e ¸Xž¯�¡:~Iè͉¬¾E0Y±ñÒÉq·Ð"ÍCBëlö¸2¼½šŒ”=‚?ûPcËÏ•Ü�Ébç¹tû3HéÕùY©H”�wËh’ tÓ|,6t€çNhç#üÂÛr„3"Ý/Y°3Zà/Á¿šœ”è!”é8ü6›çœ]t[)$–* 2[!’œ˜*¼ZÙX/òV|Ýû‘þ¥Cc\«>lĽ½®—h3jùéó©€—{Hˆç»§�—¥Þ`ž4çiÝÐoF. ¯‰—ŸR/ÚóèŸúäËhïá9\Gád{ÒWïÇ‘2]ÃÄa‘Ý—œµ2\ì�›Þ€Ê6 °ÖXó:CæCþ…ôŒ×�z_1ùŽ vËöuüô¾o2öŠÿ%óɃýƒ¤aO¾;ܯ߷õTúXݵ“‰íÊ�&&àH;¯užÓC¤Yó\ž÷£’»´@`œõ¼âkkضm´á!ê0çþe½fdËH¾"ßo÷xbH<˜�`Ø“i /&$•jžýr÷¹Y6ÛˆyO{gT •_¹­ºZÕu-EµM-l· ¿Ù÷þ~ÿ£ùó¯nGÅéïïxÖ´éÐ ›M0I±%ÓÊu•”Ú4m*‰¼Zвž¿ÑžÝˆ<ãxò¦`�4 4?9øçýí=p€E–¯Ê=³#o½¥Sßò3BA‘FBI.�/lD`úíדoÚR¶É Ê kÄ¥)K*ÍyóŸ|zʺ2õM´,`ÿ~ãîMpß®·’„aˆÕ¤¡æk­ßŒÍÝ•6Ëמœ“x˜‘<•Ê ½ë6¾p¼ ›Ékƒ¹Á™©ÿßJ4­ks¹°ÃGIü[åžÓÏgÌÝlhë-"ëcVÒ”IKò®ÄÒxeôiÇ rk}ɦ0^æÈàÀ¸4.„ëŠ-Œf„¤Ñ]šZÉsC,6U™•kê˜W½¡�Õ½ìË9�¥‹D6­{¯„–î&ù0ƒþ¶5•ÌZÍÒÒøoæñ 4JLãÎÛ‡PEgí+ïe¹ju.í<`ø&q j¸!‹—ùvã `ÈY$ZëÛGIÓJQ/ §q®îÙåú7Çï5Æ-To sôùÜ5Ø•å3‚#ëP/z{Åè>y—!«èKØ/¢ø”µ‡ÏÆ TàLSMnà|½Ðb*&Ì×GiFènP´>ÚÆ>×ñ.'Dd³«¯¿ÛФì¶tdµdˆÞ]�3¿±Ÿó'¬ˆÂÞÙ;Z„ÚÀfç%@ý—œ��ü+s’{žP·çœÂy]Ñóø$�·0l(’Èz¤“Xkáƒñ¸3OŸ»íK.Þàk™©d—xGì¡P¢µ Ö¯\7Pb½¤Òˆ<|¤å©±ƒÉM�”òÚK?æ}¸¹¡ÁÅ]ÛàÖŒfÀA[|7SÞµpâ¥ö+8Ò 8Ãßrë;ÚCÎOZÏñìÍ“Ï 4ÔI}žt<ÛwP¿Bo©ç¨Ú팪/n�mâ“ÝÞâ}_$±7ÿÍòßvºÝ¯wØ"î2ZÕy‚Z;˜Xøf£œ+¡ãž{^›ÞøËkd<¬Tü¹‚±«Ö­ž«)žñ5þpÄiŽ3ø·Ø_Çèy{§˜ýŸ½üÄC°R†¡šãx^4²ívÐÝ›ØW9pÍDƒCتmUâS¨Øô̦ØG9jN0Ã1MŸÖ‰:çB='Š/FBn“·ì®¡qä∋4¨vßyÞ^’\’K— ˆŒ÷D–˜ [h”Î2 ­‰[.G±Hè¹ZǵQ‘Á{Q§I¾þKcËíÚ>å–9l]禖¨ìÿÄ1Ó-o©­ù†7Î¥…fú#ßþ qÈlgjÞ–ÙKÖó<÷¾�õ—ª ¥ÍÇ %/™UTLoò7ßÕZãºò^×R†–òPÿ”¸`Å!5bU1;�ÃLN3»’ÿ‹¨ó8�ñ´ãƒB ´q•‹Ý^ÆrÎ65�Ö©¢f˾ ЏËVžîù»Nã0<÷õõyçñþ]j°Â3Á^é}ݘzk —ל8‹å*Ýiƒ.óÚƒ®*k»ã76Å›ú�ßõ#Åjq]«5…äe‡Ç™Ì”JEi|[y.ÚÒJ޶È×{믧ïä©®è¦àÀÙ†ö³—‹‚k‘ÿ™¾þ²ŒÌ çXOѤ þø0õ”O‘C]íñ!zòa¯ÜÂÁåÌuGEZ 5q�XòË�àcßqŠÃ�ݲ dimð~ö±Ü5øÝ|šaæ‹>5V¨Tâ¦}ü�¼ @ÉŽã!�ÕR®„gž¿�~ýd‹9Ÿ¨ @åóŒïžëšÚ‡0Là~œaìþzyÅЈ\Á"µˆ†[Ðz.”©Zµ±–Ö‰gï¿ ;ƒÒˆ3µJ K¨mþoÂvÚe¢’2b±ëÓÞ„ðUƒÛÌ6Ñ6§‘`GõÄû½Ž—7ÌÉ. º1Cse¬�—®º²\2Š ¡�@¶ÁÌmoÄÙ�Ûßߨ­óÙ\[ÝïÓÒ+ ©î·Äm£ß¬IÁɰ~˨ªLšWlõÎC…$4Á¡ 49-¶U ‘Ëöz2Kó,÷шÃ}ŸU´yè¶|xî}¡Qö¼$drÒL-“£ŠñjS3‘Jj)ZH•“cŒ‰h15GgvaØo ª7zëï)‘��@˜? ‹9œK�âþf$¡ùÓ&œ`Iª?n|íIø—2áa±êÅÏ2áÑ9¡’[¼ÕVï–-Á}>srƒU!£:à�dw40<Á!{�ùõMÁ›îq÷=a45@qû�š‚)1–º4AÓä#YÆÒ¾F\í0+æ?aC�­'3�Û… ò¾eÐmwfQaþ’ÔVÎý•Z`k¿5G훼|Ë·Dèô—�’bèÆÃÆßw‹§Çˆ[Œ6µ´ê_¬‡�­úzÀCÍÛ k¿s™4é®÷{Ò´Ç—ZÉ_VžÑÛfà3Hº{1Ò`Ããr†ºÜŸKjå ÍC»ýÒü¹Áó¹¾~òg÷’±�T* ÿâ²5«×¾¯ÆÛø-æ·ë4EÜ$,ÉÚÑŸß§ó^½ÈQŒeDN7ÑÚm¹¶2ž”â¹u ç2f%.”÷:zHű�Tß²X]ª õçW”+ç�/Îý¬ê1ü‰¾†Oä/#øÌ ?Ýœ�}˜ý‹“¼XÉϼN}�˜ý>í0 n<ö:Ú‰ê ýé0“ñýxbKþ‰s�~¥èL‚üžÖ¥¹øzIˆ/�Iµ¼àcoC«ÎàŸð†¼ä|Iñ|Á—;¯2ûhºqølxþû€· 6y Í¼`ví:ò?¿¾ÔÅ�¥oï»zÚ¬i.¿½¬¯W…õüG7¦Âeq‹ºìǘr¤C+ñsK/`®‚^IšfóôÌÐÈÑÔWä_Bè“Qy*]Ó?XþÐó„�â×Ó|k×ȲùÇ›îo)® ²60û3Ï'V<´þty`p­±­ª�»ä5Ž/u­Çpæn ^üCÝR<1IÒˆÆ=MžtfÌÆŽ Òoµ÷ [좺_5Q¡–š•ÌòzÎz¬j™uʔ٦F¹¼ç+Lgo4`A¿‹èÙ€‚ä4�9ñ{C¹Úk6çöYôto=ðÄ»Ä)CP©wŒ¡�n–kfîÛMì4l 9˜¶aàìÈÔ*k¬Ä‘7®÷ n5pJCŒe_»È}r¬ÏÕ-€wö`ö¯koiªº6ó.ßê_þt�Ê9(Û x¹ð‘ý)`?HÉŒWÝ>`韱ò9›ßŸÝÐ\j4‰× „ÌkK‘üw¯6ãSüwÀ®•üírø÷FÊ:ÞáÊXÔÂà8½>SØ¿º !²÷ój2¨™É„ÛG—u ï~8]‘”þÌEr&ÅŒJÜ�²^-ö¸ÉÈô:}vÏÁOdb’Bgƒo`w÷}%ªçd¼b»ƒë£üÖîÇûL�ù¹¥Ãͬ7ìñ¶áqÃB¿©:³«ƒ-^”'<0àƒ•†ÚPU7ì„Õõ|œ�¹.°òG…}ùˆçw¿üÏm�ýà¥çRÓlÊ�W:§ƒ±+–Dú¾®!a¨?¾àäó…Åë³+fàÝ|.{€˜)@váP»Ý�„@ÿp/�2d^Œ°¯K]›[î(€©\õ¤/ІziYúûFÂ�Ûéɸ:¸\xc8\äIãZϬç´ãZ"��íçeŽ_Iwa±sàÚt‰A]mß{].VuÝòwcTúËÓâQ¤,?Ã`0@ÁOWhE1Ýûbõ¬ Å×.øws’f³ƒ†ü£ógW§ÙïS‡<òAH&L£-/†fT}R@æ[áä.-@ñ–]';Z¨ÈäñŸe.±Ø„Dºe9H°Vx8ØÊ :‚­Yñ™‹‚–“†æÏeY.6µ´=½ü(²NÈûWéxI7:c TDÅ—ž¥BuX¡óæ×O6§¼ñÜ:¼›s쇿ÃÖ£Ü{¯kš+EõäâgH¼•oƬ¦U¡ÇÅïÁ[¿O+Iƒ%ŽX*O}ÔäðC.h°%Lo'@Æ ‡Š0Òöž­ù“>¦Ò/�Y9V—æ!ü?ñ�³—.uVKŸ%ï}A�óU‡šUßÞ®áõÜX”�­r˜1ßðFî<ßÅDô9|k%eŒ8ž�²»3 ¥©áYÝ$ ´Í#ƪ¯ ƒ”¹Æ4Î¥²7\ 72&°2�dŠâj%ˆ•wÐÓjmrÞ·¥ªç­Ú‰)o|¸èƒœô—Ÿöð!lâ³µ.IÜ@òÞð_õ«®ž?’úHJFøeÝz‹‚?£7^²'M/H¾tHÀÖ@‘ÎFåspŠä8÷o¾±ï·Ø êÄ�rb@iýõ=¸ÇöÑWËêïýùw ’(Ä�ŒAòÄ 1¼/¼ý©=Ö})®žõ)½ðzÕ¹Q_/½·ߢ�zéõÞ‘¦UŸóÏD’6Þ�EhÀ~ß5ÞËíŸïCÛ]'Ó)@b+æ}>?zaäb"£ ZßM©óùí^±�´}Hlv`’GŸ-zôßâ§� û¦5ÔÐð5ãÄ Bò�Ï@žq'¶6öÉ T9òËî„ÿ4>iÙ÷÷¼‡ÁoH¦ƒŠŸ.h9Ö(¢<ׇÐ~n€ôÃzäïòðzÇcûQßjc]ã+¬b4ýÈ½Û n †2ºÓ�Å0¦Ô¬£îµjê ²ˆb «lJ/bi�­Ò„Ù¥Ûl±%{Fé.•sÙEÞ‰àŒª¢äÖxŽTKç]t ¹Œ®2µí8,r²6ù~®Ê�¤õÁÛ }Öï¥Q¡âv³¬s��c^rºàÙÔ€%‹®��|Þ¼|æ÷ë Æ7)éߺ÷W·&o¬w}mÝpþ¤É‹€¦‹·¨nB$!‚ÔèBž²œ£@ô&|»få$±¶�˜Ï¥~Ï”àÂN?± Lå�/Éò á¸ìÉôuÆHhMö=¯1âNÆbk¦T„‘ß9æšÓV°˜Õ9Ÿ5‘|ÄÃê÷ÜxPV¢ö[8oèµÁ4mR$Ä|QÒUc Ag rdŽ7¼aV*¹[‚ É_í§Î‡… zø†PoÊÉ[N‹�î„‚­62°I1KÛ^ÆŽC¼ ØÊB‘?Ym$fXÍ‚éƒßÓëùƒëi¦D¤)âÈ^Ë­nŸÁ·qÁ£½òrž;—ÙÝŹ‹“�HF:åîé¹´!�èXG£Þ‹rus8Îo�ný9œ ß5�÷y¯?ñÚ_D�{UÇ|„ú£‹×ôÿó/•'Âfcð{Õ¿®Uzâb¹aêÈ“[[®ÐbsÝ2êƒÝóI[<’™^smÝÏgù(=:ó|«–‹’£òeƒ�ÀBÖà/òà^÷olà{Íê¶¶ çRâa£=ƒ»ÿ–÷Séd®kB ï81^ÝOg‰~Þù$;{šØîçÂåܳˆ^ ír¸¥Á’ŸêñMåWÁµ‹ÍÕiÍá ¥+�‹Qv©8šx½lYÒãÍeŠçQóóèèyóMç=®µø÷¿›PRUs9P霄ތµ†!$‰²ãÒI «ÖÄõ·ž%°Jo…XS8…g.. kÌFÙÈï —y ³uG¢CI¾ÑH÷Õ�¾]Ù^Fzpå�"9i¼ÂÄô³rS˃æÃ?:^bÒ\×h¾¥ðÞÁ“—¸ÞIì÷ê¦ÏÒòî¾ßYlûËâåÞ¦)yçbÑl¶xfŠ4®Ï{@ÛÝÐxOûã¸{� ­l¢Vt4K} ëë?ã óó„Ž–v�ª©yªœªªaËÉßêòþE&pCyLÞwÍ ÄɇPøÆ~$£cÃQ•ÓÑ äß0I5-JDc£Ä¾sUy Õ­p«š‹GÊ]nµn‘T÷ÖÅ‹>�DœÑBJÄg·›Ž§›ÎÉ Veu¡³�9ˆIô"MIÀM;PçËRúK®àœîý„ÔÒ He ¤P ð÷¼� í›t„š­-¯Ìåmÿ§œ7?Ù®Ú¹Ï::¾2æIÛ!é‚s±j0~̾èv¯â b�Pm…Dr]­ú^�€ç.=ëFRõ|w�ëËœèÇ+)’ÝFU]h×’”ð òFÍb—9Éwe€À€WÀÛ¶‰.ewÂëXœnpÌf¨�†êþ¾¶™QUnq¢*’g|Ô>´ë©¼†áº&^u3v1\*�Ï¥j×;ž‘rfúES|nuœÝϼ›é²šn«'¡�kˆðçvM$îúšJá&7yÁ‘yG‹F3x öƒØM’çnaG¤Ä>àÒÐA¼ªîÍŽ’!bzœçupþﺻo†9 °Gã‚,ƒFhGá[}`Åö"úôî_g律ÒÚœ�ßU"�‹}›ø5èÐ 2öõÑæreœ| ëM±ÑÞx\Ü�"“Ö•\˜”s±$�y^�Ç»t´oئ¹V˜Ì½_|fw£Ôo,‚‹�ÏÚB-_cÕ¢×q‹ ÕËä··xó‹�7’z‘µGœÚ›6þx8XÛ¯º|AžeñÕtèÎ.­ÿmîÂj')Û€|*q�ƒ^ñ~wÚÉ_X#Cå¯Ï�[y\/½óè�ôY§ó–öûmd=i±!�òñµSI+š!{{»ï‰ƒÍ'×l·»MQÇw"¡Ðø..gÌæíxÞ_"[+¹¾‹Á«¿—ëÚ³àm‡Zßûj³à‚g× ‚3?ŲCRP£� !àÕð´VBØuuçª6d>N®úÔõYÖ8Þöïòj¾°ùb{äl¶±éø¾2ßó‹€C)šõ°®–Ä~ðá®ZCö!\Kï;E ®š~éìÄÑ]×e�xibXK‘”ÃR/)Iîš1'coçõ^ï˜Ç9ÙöêfD3œ~×$PØßûãpšÏKBÿJâõs¹JÒª�ò˜<Þ8g^£0m´£ö¬“|,/ç:"ãªF×Ù_yà;nÿ­Ä·Òw(NŒb7†°.W~H =!†7ù…5{ÍÍ+fýô˜s5�ä.œ�ƒòÁkšdK¤Å»°Þ'_›ß-LwÍÛ†>×�öÌQš_Še°eá-¥[Ùlµç‘KU Ç>çv*ÍÓM†¥h†B,)­U'̳)�Ïý” WÍÛ(ìï]¢P‰x=ÈQ²p¿¿?5p‰üsvc^ý½ù¸¯UGmáŒMbuwôŽ÷RmX�°àÍ”e%c“Z§= gE®3Þ[k}-ô~‚îw¨óÝäC- _vøˆ…£åcËß÷Îò¯.ƒËjdžÍ5öŸÕ]P{ÛÂ1`Eâjc—¡Æ…vÑ­»—pcy§Ä¬P®h= ­«Ì–T*Òr�Dl[‚õZÝã@×w�Š¿ô Wü×áýo«°*ó‘˜ÙêÞÔxÅÚ†oŸH·>œ[\²?½{æ?Y5ÙÐ|WÞçZ½š@R�C‘¤é68ô„«üj‘ç§®âõ³â™5·ø¾½ÁuáúÅs‡@F{…Õ[‡' q±ŸžD �€DNŒ"(2"ó³6�,ãßÍ£åЗ ~ÅÜN·=ÛÅèï°Q«Zä«ÚOM ´Ð Èz¢Š^H8 Ì^ÕEÑs ™ò똩qº\5ÈÎyîTB¶jãeÖ+ àqF[[U4ÒñÔªÕGG¡†(Cb(Çp"ƒ�ïç¢:š¯)fFÓõ_9Yá‹ìC$~Ë—yE}ì!YÌlý˜óÌ0Ï‘w„¢#Ç #ßšOà=ªNëkáî*ׇ)Ÿ\ÑÆpÈ—-[‹R¼¼Vn/î—>ùîoþºe�´ÛÑiu�ŽRPDć÷©^˜FkÓïͧšÓj:'Ôï0*¶³Û6¸æ;äyŠ+Q°Ñ¬^ë(Aܘ[Rä_úåZDcáü(·ý�Ÿpå9O;�h¿¿…@tUöñD4¬­é:|¯žB‚[^¸Ÿùq[·#¸È2–ˆ¥ ×"ô`S"QXn ¤-¾™ÿü/LÁb<¿ÄÃò‹2 Pk$:?)×ÌʳŒ©6¶1kç9,×®ª&/ÑåÓG¾ï§w<òýÆD\/ø`�©Ù[>¬+”­C¬ãký‰2vÎQàeî›TeÊç †+âq–ÝoçUœ+> #X¸ÉšÌ©µßã¦ÛZËCß[½kyÆ®‘Z#ZfGmÖ·Ê7hQ't«–jhĤ…Dš¡ÿC>³uÃŒ‚<>±ªÙrnD¯„z<1¹ºå�”¥ì—:!y™aÃ’ÜÂD™ª˜Ja;ƒò53½9KKf�ÑOÿõ¶¿ìý½ÊWÃU¹ýîà´Y�q$=õôóC%㚇=­ï4y xJ‹Ü‰Êò.È\)JÜ“Uí!Q™CJ¶K3mn…ˬùÙãíg EutEEäçxäÀ¹­ã/Ž9àª�ÍŠOr×@ÂZ³Î>>I,`ÜÊ9Nðk}ÈÕôG¤Âøê�“©=5 oÅDÔÜÚ#‰UÙÞ­ ÓŽÎF[(”Äùäãbk»ÑšÖ0Ç­œv3›à†¡†×.š·žÓ瓨ñ#«÷¨Ú%«è…ÊÜwéÖ:Ýzy¢òè]Wî^`à pÕðý%§åBcáòü¹víß3YÏpc%˜#ó™×ŽG ´†;yL�ÝÔoyHÄä®Y†Ìœ³/ ²M¬'™Þ¶f/œbë£.=Dfh8áÉ«0³“V»*$mÌÑzq:žº+á)ôË[{»Vžw‰çovÌ®1”ÈæS'\–$Œ 9¨òs瘊'’ Wf3ÊÅUV–Ôù†Âg(Šj¢œ'Ÿö…+ÅûU˜œÏouܬ™·¾kòˆEõÎ}ëÌéëxJCצQEvÚ[‹²LgÙê;¤÷[F¦Ç��òª3­Ç D†ù½ôíZˆ aŽsP¸i©ÆJ9kŒ5ÑK-u"%ʾxB—/Ìc›9:Úœ7äT«Ä®èº#�ŒI‡‡ ºÀuй:²GN»†'ªñ³Óf VßÌ�åÔ0õÜ‚ßwÌ­Ña[~C5ÐN®Qzê/¸=®JbU³+© s„’˜�ÃÅ5‹í`¹}#ž •½Ý¼6Pº{¤ak‹��}<&ÍÛ—ã郉¾à¦eùœòM ;‘*�ÌÑIAöó»”O›Ç\.»” 0{ètõLÈÉûÿĈa˜È4M’Ü»ðŠ�>ÛϨÿg.èËöys[äÿžyŽ~Ë_rž!'HÄMk·ìº~äNLÐÑñ=YÎ!n7ñ©]ºz˜h ôH@¥0AD-z±«Ö¼R|äpΰÙÕ ÷‹æ%ê…2¨½Ã³­¢|ïêj:Â'˜En¹,aäxCO‹AÖ!¡ùÍç;kI$[�妘5ÍB^žëB¨ÈFö¬zæ¹GäNr3ÕKç8fÛP—Ò»°Y¿_Z:iÖU¶ WSîôÒìJ…4.ckšåñïJø¦mÝ2*_{¿«>c;73(S]œe÷á²AåIa4«KÖê_ë®8L¬,-ÿ_üìßžîß ƒÿ8q!ãÒ¹Û´QBäˆ�4)Wûþ®‘2øÊYV}õ›ë¶HöGvòÖŠFb'Œæ¨�ló� 5n)^÷¾Îõ ç�,Ø÷�V#Q¨Eô¼±_ó•v,ƒ�E¥{KFxìäyý!"+]�»Ð5+ÿãþÌ:£{æÞ‰m3ÀðjT~`c@D¤!Á!d“’Â.R;Dyë¢tˆv&pcÒ3ù~Kb àÕ„÷ÐöûnBŸ džX¯1€½!øóóúô£©t$ƒO¾:É9Áïűœ•ÈK®Þý§Ó÷Æ®ÖfyvìˆW£ØO+úĦ_óëé¼Zwš4ÜüfË«4[“,®‰Vª¸O¤éÝÍÃR tÿÓ3¨Î?Pæ¬@¡*4êZïã¾1X(zÉía¥ŸIJûT7|¯�cIvyãtqœÜ O/ŽšoX‚‘±F™µÞOEHÈs“ié»zH¬(ZášøXU€’^ºú{¸ªð÷‰ÁEH óÞÀ]'@„&·­t™#œMÄ–Æ Øæb¹¦Ÿ,Fµ*^Âè(Û¬Ï�à–6¹æ6ãXåϼ™õœß|J/¦÷jÐÖÅ�•vŸpÛ7¸¶Švä¥ô†OáƒpóvÐOëáAKèþ’�mȯ¬7‰Ãí1ë!˜@E—�‡Æl ïËüÏÖŽ²šƒÓ�Ëk}ïÐcñV=͵¡�øíùtÞ�lŸkð­°ƒK±¦úx`ß�¨z„›¬å¤…Ä*_#H3¬¶KN0BJP°�ÄI:éÖ[Í4_®¶Z‰û(‘å�› 'Àhc¡ò÷©Õý¡WÎLy êÆÄ~pê¶EòÑhÈîÎ8ŽÞeQå)\ÜÖGÿ‘?§#%Eˆ§RK�edðû ¡™Ø}WÏíy—z?Ã3n °Œj�I1œïÜh›ëžO²ä,…\vê—�Rª¥Š`ä9s§:’(ÝŸÑ^ß&X’†ü‘Xµ¾-´=Á.Úd@zÛ†;ÍÊ“Ò)pf¨£‹œ „exÃ[â�ÃI¢ZG(ÁÜõÿ©»ÕƒáÂ�þ~~Tk*¦óŒX´YÎtkó£/vRiwe�z%/‰ðCV›4ŽÅ}À+9P­+ åÊÃt¬vØ"%+Ô# Ŭ[(£³´j Ãÿ¯�æößë?hy*"üؾ¾ƒÂª$¬ÿ 1ÕȾÂ}û"þ�•_‹<ý òU1êJô¶¹ý"ë3„] “%“›`«©–ÿ­(ãZÊ¡½ûm& Ok¼]»Q‚ŒÍ5Ü·¦öki¥´œ†²~ŠexÖÕžŒ»Ÿ-)÷¡óá|7ŸÖR"ó)_Ãî~e|g¹Që :ïú95kø²Ün~óÅ8Eâ›ežEß õÄ?üžU[ö·¯R¾C./(f !$//«q‡tþØœ~S¹î íJ}±³wV¶ÜÕíßñ’H´�Bþø˜4_ëû2›ï3|æÚ <¤“žO utsµš“1,!‚P"s'©‹5„ª"œ'̬Èb»ËBÒD ǃ³/³Š‘AæxÅ®«•ΊÖÃAÍX_ƒ¢õ$[`äZM¨Ø±@£ ÎsÎqŒqT gPË–\Ҋ׿±Þâi;œDe yR�ïž'|¾+®é˜BÀéÅzË…ZúoÏŠoˆõñ§”Ú8åÌÁ+VEAúC=ùëá½Å.xt¹,¯†ºÓÇ[¢‰Òfx4èG5½â—peÏ”•–Mâûq©ù’x†Wζ¥6rÞÖ5³[ÅIñ/Š¥m”(CUœµj ’��²Ì¾+Eýç°>ýü3%�¨Òew¿LQfmšÈÇDA8"~ÌU.{XÖ ×�ô¢µ¼K;ß™¨¹æDìcEj*'&"ou–þ!‚`ùæÞ�9ßKwÌåΓ>‡rC 1ˆÉ…ñEñŠ„%1P\—5jÞ“W:#ƒ÷ŽÜðø;øµE“,Öc0L.-�jšÎCx0…k™{¿I|+~* Yu,2J\b÷¤öbÑôë´æùE6¡‡“z2T ^îìÍ¡ò~ú|ˆÈüOÖô)…!=5ƒ[ b×PM0iDrÅfc¬# -ŸA§¡Xa¶øëÆî¾¡Ýü{0|Š>ý¶ëpg²s¶Tq”nݱ0RÊ�Ø¥ú½ËKûýYE×Ç‹[‡l[³()ìÕ›LñÖú1E¾–n@ÿGxé�Xé³\@ïô¢õa¼°¨.¬çÇü÷žß±: Îy,*™V–Jì7?_ˆgªå²P@hPt(ÙéÍ‚Œ®'»Èg>ïÉÈØgÎô<žXY‹·YÌY,\c¿ð§ô–¶KÃ`½w^ásjOÔ­ �Ï.óˆA.Éö©ŽÅñ8!ƒÏ�r‚«ñ1’dÑOnX=òÿp/U•ͱְ@÷OÃþ·…ЛwhšÚåt \—ÆÌ^¨šFý¨.Ñ”V¨”âí:XðèÌ0ƒÊ�xÙRW±–Í®³y53Vû>¥±¤V³mq6Î\¿üA� x÷Ë×:Êk¦ž;êA;¦I;ŽzI77ÖЊ AAaZ\5D¨EøÍQÕ®c$�I´×»a’N ^–-þÃ-†f ¹Å×UÎüq–jó1¹ÔÿÍvÂÂ^§!€w» ¡¾ª�µuù×Ìêê$èBÜ.—^¥94½G_=úyÍÊ$°rˆ²\Œ×ñ ïù5Ðl㟻|`Zì}ïþìŠÉ¬¥�µÔØfäÕ€÷63à n­”)røA푚PБE©"f<‰B²]yØzsîôãŸþRƒ³>ñ½†#¸¤ÇÊ×fñ§pêˆK&Õv<'Z,y#!à”ÚMùÓ¾Ó9¢•þ‡–¯b«;¦ä6àPÊ¥°ñP^rèÿñcW9¿UFiõ1çòª¿Kÿ?‰¥u™l¥Eÿà(†» aæÕ™T©ÚKa‘O7äØQj/4 ¤ Šæ÷~$‡‰× sˆä¥ Ð)Ëßiu¦àú �“� °š!Öžå†ûà�+ïÎè»&)ÆÌãWêc¹’qKX0pÉÁ}JÑ.û#˜ðÅQ�ýò#e®ï7Gƒ3ásƒbúu—(*gÎs�ÿÞòHñäòÁìÌë¯1¶§8¡÷Ì€�âþH²‚ÞÜ[7ÔúÜm{®Œ)KCrïÙ°{ˆ¯Ã,é¡=�^Åñá¥QÒ­xÖníÂØ…šŒ¸W±yHž0T̘7<”'YMjR#5"ÖfXôu¹•Òó]‹ŸOæÅYÈd;É­çŇ1iZ½­ëk÷\öðÍŽ3ÄÂìjÕž#»æ?À ž Ã-)cÓÄ [«$¡€Óã;Ð3¬·�ݨں˜”oDt^Ç Іefa¬EË-æu2lE&s�/04²äLvŒTĄ̊Ó;ö—7зuöóÊ3Ç„(t”µ Ý'6þ”¾~¨ëÆãòù§õ}ç-à"!w|HíÙZ¥ÎY�By'9¸=ËeŽˆaè]H+[J¾`ZM™r F$2Ÿý?NȦLØõatÒ¬D}¥Y†õOÑìTÄ@Ð/ˆ&�n˜O Sb¯ˆCª^EÂ'ÞY\UÎå™vË8ƒõ®°·)ÞJøŠK®¦LaË)½‹‚ZÇïÝ^åŠ6^tûk+ÿ?�éaýÎgÕKCe¡G z�rèp6=$?V1j.,:& Яt®] 9”©;•Ø«¥Üãÿ˜IóJh¸�ç‡oÔñ©y�d„Æ&d(¢°0§QÑ-É{¢œP[5÷ôø³BF.iî; À­ÉË`E(!u1“?JÉŒºL*Ž»< Ê(æ›Î£ÛÝ0WêνÉЋÁ˜ðfóžacÌBÛ‘§*¼ƒ°*ŠFõT)¨BRId”åü,ûi«çPfÔ3RGé2 QÏx¾a�|î î»QgL:ñÒµµ¼¼Û‡4« ‘‰šV7Ü©zòäu¦-Š aµ0š–‚­lçI’HQq¯Ø¼y‹¶ï¢²æw‹žç(E¼å@ºm6ÜÍÿÈ>×ö§$"7ì³ÿ“·½“sµ€Õf±åúšz²_h|Q(ÙEÊå·G¹&r‘Ÿ—ž½ú€³Þ »ó^Ö{ÊÇØ{ÖÀ+}c¿¤]`^‡²yñÜUãÏ 0Ù-\¦ÚºZÑc¯0�)×½ÁTWÅ�f ùƒûzð×›°a]™Ú¶¥<Á­ÊÞt³=…Wô‘°ô¶;ðKÄtçžÒB{Þ>±hÕ»ß<\¿ªl]L]¿áׯ®Å•ë&§Õ#�4)΀°�%xK‹�‘Xk¬¢-¾ØÒ°³äDZ ¤ˆ»½:J\ĈZÓ´�¶Ú[0Ðæh†Â9F ³Caˆè­?P0ÜUGã¡Rg~Ç7}O+ZÍõ?ä Ì‘DÝu’Þ¦¤ZD†&ÇwfŠÔAe4fêG_]²åck�"ÄÛP6aeª–äÚðkJïR·¬÷SÆ][HD×<·{ß…CE!õ¦È4°í¢ž»®ðþãX;ßËí ø&ni±{®¦o±6Ç‘ÅÄ»RJ“>|3‹ûâïf—;¦Ô¦6ª<›ñ–xêr˜Î{—åT ?8ÄoÄÚÇ-ÊHÄ3î�…ìxo5!Á6w¤Š�¹æq|,­v+ŒÝ��k¥¼s¼ÃžšgÎjäWwmEüªŸ'ª\[è3œ¡ešÛçù“Ò;§5’îf¾bŸbq–S‘PÙËúþ§G¹ÞÛ;“H„MKç§mFèWû€’—!æL¾& D^$¨`�ê ùÖDDl4:b:½énL¬–öãs^æ!!ƒ‚ÄBfìiІ[‘œ¬ã&o|äMÔî‰ :¤È£Ö|Ê^e4.ÈoqXÓ‚Ã$BÜkËÀ™7&UƩƦ ¼ÈmiõWdÞ±0F~©ŒFËc“«LBejF^Š:Þg*2¸á`“ׂʋÔKˆIÆÃ|ã¶êlà8P®t"&­0zlvFØRÿ%ÈWÕˆ÷òþÅ ïÁ›„]ÕË_Ä"Œ.°¥–® “ï½Ð’Ån#Úµ„rÃõQfÌw0qÌjv,+”‰›ƒ ‡Ao†3Ç'-oôGì õw7© bK‰½œù‡2¼ ¹MA+¤,U¿×lLÌIú†Ü<_Å»]BBôÑn¨Q©�Ðas7i?7†íñp±Ø,äN‚èQ)Âk¨V‚d[Ù‹$ ·M²Uª ”, ÈÙë–Ì%·wa÷S¶·{†�Ýt¸®cn„©�Á�`ð0‚9‘€ÆYb hæ�‡"ÊÔ€ÊpuE€GÜ$“S�<�Üð¨„DO^ŸÌ&kƒ;=<-½|ñ_ß}/vëžÿéÁ¿ÍGab!bñ–zú2r<çøù„}ö ©ç…™óëËwLU?™ýaPÆê¨”«´õ|Üdc“åX´­}¿HqwÈ—L°Ç; ñȃpz¿c¥Ö±žë( .<¯ÑÇž4ådND—ìê Žé éå–çœæê]Ñÿ<‘ú6Æ™á™kb£/" í©ð›Í*0Y–¼®ýIps Ÿ>L !Z]ÌÔ8ˆkxIÆ×"A Z¯ÊÕ`Ð{Í~-°ÌE `*”F`‘Œ®û¡yw2íH›¥Ëº2£)'z-KÉ7 %cW&+M'jqá¤Ç Wøj#^kެ낱 Ðò°|j; �¡,º¤˜¤ÎD°#XÕm”B@€*¶ &RÁ �~를, 4Îlq'Ș5"¤f/¼*8~ÛÑž¸\Ÿ×¹¯1›t™“}¶’±•ð­·•œÒ©jrY+l»ÂÆÀ‚óî]–?„½ZÐp±%m·Ñxìc£UÎ{,3ÄçÞÛ„£È‰«o›ÿÆc£Äð† òI2zA “V^ž$_aŸå6“ç#‘lµ+‰ûÕ~ )\i ."M—>oYLíÌa:f+�u­¶Ñjûpáp Kç•�d"fìuÚÖð¬8ñÁÌ­x­ÀÕ6àkÇ)ÑpWµuL>^éU´¤wÄiUùõ'6C(ÚÞçíÕˆ3£mnÛ®£zþq˜Èy&ŸJHµµE¥%‘MAÚEj }ä¹Y_Vy)šX�¸‚}RŽäQ6¹zúŸ‡ë4£Bñ+œÒSè5`}r@XÉñ‚mûM½ÇÓ�‹ç<>¨š›ô–š0 „|Ÿ¾yóî0f¤h=à Ǝä;Ïe:ô2ÙH µ@ç”rŠö)õ9…aëÒ-�)ê4ÓÔJˆ)q½åe\'Ie¤�ËÁ?™‹Êç”{ë †pgD1.»î ?„�D¸KC™g�KeßÁZˆÞŠñcZ_v®Zó§<ݸ53OlùH¨ÐØ5¾ñ!Eã@ܪ’¶ îf#Xâáæ�N¨îW­Ê‡¸Ðp„ņ0lÚ«ÃŽN2|¤³tAkÔ'Õ£ºs[I^æ.Ú\ãd7Ú l›ÜúgFRûøÁº4ŽÌÚ˜ Q,u–JŽÁb¬n©9šØ*kÎщ–%—ÊD¶¶M)c.|â¢öë ˆ%@x¿øxÅìå�žo¬y™¹hd•òB?+õC\²lå{i;&ŒM¬åc²Ø%6DbY®¦s6]ö›ö ˜Ýð@ʨØÔ-¢W˜¼ooá�{LNv¹1ÂÄÑ"¨�eØM{�»‘NªT„Ã.‘qV{Õ�¿àk¸ÿ>q‚üAòYÆ.ÛÊd´_Ÿ °ùâ4Sp?ªÎl(Œ›ÞÙµ¶Ü¦¶Ý$è­¢ ÿ73÷€nÿç<•Øü¢WøWçŸ÷_ïRâ%'hÝà;düIwfòðJ"Pg[yGøÊ-«¢Õ³ÑË'ÁS4ŸüQ`·—yßaîíiYõkãÍ0�Q“|x4F÷³Á€@+…ièÔ?‹².EËPUK®Œn'н íýz8nk×/çj‚�ª©ýéÛ?¨MZn”º{ÛÌp®ÊÈJÆþ–¸bËÝž¢D¦(•“¦‹!÷µ¿-‘àF½‰‹i(ˆƒ;3A”@Ï)í8+¤«§ P{2øßàÖÿÂŽ\þÇɦ  bäÕ]èÌëçå$ëýïZ™Ç½½šªlÓÚ€Ô°â;‘¯waí©ðn'6rQ†]Õð´“ZIYV8=Ï‘¾1ŸãÅ©D°"]•Qy:T˜hbœæQ÷X€K¦û{Ït=úYþ<òä � �­ŸaÀ‚a ½q^Qà'Å ý}BÙ=EÚúh^@Ëðæƒ7ÜÎÊCÞK¨Î̾خqþ×…ˆB`E¬Gq´G0Vªœ(Õ1ã{'}4ŸM¤bÍr‘B¦Î�Ér.m£Fdë—¹UåÆr›Î±)HÚÛûXKsðÈË)àSeuÃ™Ä 8%\C£µ¬ Ë$ÔÌ Ò¾›öö’$?õs~?/:å±ä1}„5žì&’/¶ƒÛ´@l˜-í¬›²ÇdÔ nA�öv®ŽÐ¤Mç@‘æi©Nݼ�f½õ3:â�›"ÝóÒkáÍ¡:yâþÚ Öª–¤š0ØMP©fR;ñžNsÖ% ´#O÷àÈ—ÃâîÛ Ñn6f {Ù™\~ ÍÝ|û¡ Ô'VÞ,cvênœi3{òmΨ{�ͽ8Þ‹«[ÿ žTsËô–¦rÈÂeLf@™?k+H4C6ý1ï”7}–­€Á·Þ†±k×~mìD[ömܱ[pLÇu­ñHÆteB³&«X&tn¶Ê]M4i‹5W�æ—'@�2çº'&i¦ÚßõŸI _¯}®å—+¸óMåe ¢·9§÷Iž”'+&¼ÖŸË~+NËúñXØ÷ð"׿(êp�jÍb|¢òïRJlýÑñÔð�/3�Üa™„Å®©ö¹˜Óym•² …ÿ=ò;–0Ñšää°óK“�á Z(7D÷¥x'ÞÐùVǪ\/ñõ¿s^‰o>K ±Ê3/‹=~˜óD9ë½­w¡¬ ~],“?ȃÿÏ+"íASÛˆkÞ„Ò^a¡EóqÔ�Ô;ÉÙ lt_1Ì æúÿ¦Àx•/Vä«wÞ>Ïj�ñr´`UåS}.&·œiÈ– –¾—�¡¤42KªIïù ƒÞ¿6Ÿy�®„ É ®×-Ôî‰0${QÆ=æ.*û¼Nñ7ö�†£ÖÆIí‚?cWöK¨Ó–\G˜KÈ~*=õŸ÷Îvÿ�mP( ¥9ÊoÀË÷n=\\ëcGÓ<ØÌðoŒú.{Ê=u;(o„Ei«]6üÞL×ÎÍô°f6_Kíxås]?L媛ªâ*öÖα²éˆ“'z1\·*׿*ûÆtàÇÐ,™N±+.��41hG~„´dáÞ³�ûò!àÏ¥Žd\ý1móT+¸Ôä?é‚‚û6êç²5ã'½xÅÜA¶Ü”�ƒðxâ#oA5ó{Xþn62/ŽjºsÙ8ç°IôS—“¼fµuß¿²E�èKzêóη£]®ýÍëÕmŠ� »sa«j/¯‹b®YÆöY¤aýY"Œa×wßo5ŸëàoëÍ9m”‹¾– u ë‡i⽺ž}¶àÞ²=XbÌ‘þÑÉ‹óÌŽtÏ>jûÞí¾>Î%î ×Å…ËzÚ1™-úR-–Ý®ü ´Ò¢:cÁ®~ aú|ñ;ç;`\ç«+f‹¡4¯i �•J! ŒLâcñÑ#�Í�§ÚW5;*[>² 9G¿«/áa ’Æ È­×¤Ø-dŵá£�8Ò�F8e�ËØ �³sér´”•Ûdá¶8´2¨C�{«ÿC¹Ï‡oƒ–Ö.�ßâ²DYãÌt”;åU�øÎS›¹ÁV !,l=3Å(²U§@¦p È׿õ³ä ± aÅVæŸ�"»aÁ‹;1±ØCŦõm%ƒ 0ÙžfÀ® N‰µÌ‹¦ÁçÆÙi‹ l¯„ÊkMOýxýwž½ºMý¹"ÊkKŸYÀºÉîñƒ¾OÀçý{ìà÷]Ô#°ÍŠÈIß!(vv;ë!KM®i‹/_0~˜YÃò­ã[Ð…Rm’2ç‘~6k‚÷ÞØQ%ÆOQ­‹¦¾À_7SC¨ƒ¿Rå’qÒƒÃ#8ólúu7ªÝ¤b©ÂàFܾIbí’¯ÜÚ¼flÕ\KhöH¡¤ù7 }N¤òÙ—’„Í*t×XÇüñEˆ²Ìé·²µ­¹mx_wØGˆ¯Ò”I-¸½(2UùÛ¢?íF qFË)»…&Ìf‹\/9~ÏPß–Þÿ>t ý óEfê`ü_Èxô®/&qñJG=>"Ö%F9Œ’1û€È—�ˆ`Îúª~Ñ­Ï9¹§va�R¦$ﳉÄä5ë„—tîI‡�¨ÕxÛ“u=Üg‰‡&Û&o�ÚgØ2àIwÑ!E¶ºÇ&iL�Ö°i²Ñ&5ï¸xé™îUW˜Îs-®UîýòtGÀû;¦äß5’Ó{@'²Fi’âQc£Çq†ÐŽûžwS;¿z@?nžlèeœ¶3ÅÜØcTqU=¤§Þxâ—7 ÕÞ†< ƒu©dÕ÷Ì1”Ò r°.\l¯ÉbóïBA!ØÝñ‘ækÈa"Hép:kú¬eM3µí6i]/dµ:5¹ËL 4›;ôFtƒ€±g£€·É\Ÿ”ì(5çæ¤¿S„7â=†âÇV+ˆsv ÈÓrÒ/š¼6ö{\eE´^š& ûM LÒ’¼E@}82Y�ž\úÀc-^\dO|ûy²¼÷…ØDÏöEþØZÖV>n>q³$ÿ¾:N_«åqß§^iTFùAº®Ž-ô©XMÈ.a¬œÙ Ó¸ÿµ/­]:1{¨cŠþÿ¾ezÒ?”Ðÿ3ÇXÏÆÿÄ—�y½fÜŰ0"¡þ+»ÿ)@D 2o!ð¦¿ß£iî^ˆe�q-gÝ‘à¼ø—¯ü_ÛyeI„z§ÄádUìZ æÿÿÉÍ4g·1=Cí"µ¶¡öx‹©“þ$ –Öž£‡/ׯ0kÙáÖìùòªDð2¬‚¡n¶o¢ŒGò¯ £™¢:GG°�‘ÚÊŠjI(šÚnÒôfÙÀ‡‡¬”ʈ4e-ØÄ¬ÉÒ4‘Ðk¤QÖÐ)"$alá#†(É�g"•/.âÔXZë¡&yiFR�â7¬n„$­M 5ñe§öZÖzìå­­ Á{G¹P¬Í&Åû_‚¡ã%ç¸QeÏ][Öõr?µ¸'gù1¸äA¡À¥Í:0"e�MÏ~¼þÕ�zY5—*àDmƒÇ-—w(RÖ埥­i0äš|¸�s›±!ÁÃ� žõ“\±ˆ¹“ïJ //§Gv B6¬µ2’égY`jˆ„¿QWK.ñ¼ÃbñTõÕVëoãY¦w­'§gFyyѹ=F4Ï+ øn3©üGùâ–’œ=¨”KÞf"=ÿ/B­«ï¡ R…™³2Eu‚p0@opÞ>VŒZ|#ë¨ÇZ˜Ç�}è³²nÿ·=ÏPf!3Òœ÷c`‚½?I�Ãn°—}pÏ¢Gl1™ŽþWÊ™íݵ8/‰ßJe²žœH™Â§ì1àãâgóÚIŒ~[öô)ü¥(n+Ûσ߹ñm¯rz ¢� ¨�â‘„WþN}ªa!eJR}ºÛb°_ñâšNÕÖKÿ­¸ÜÚ K| £jÿ,ÏÿNG}$q�¹ÁŽ�X•YôÝv»®G0bù£‚7[:Aßx¶º‚œÓk$‹iHLK4+E™ ²±0®|7Eåf#À%œ ®ïš*tÜí¸!Áâ¯æú#ÈÁÐáG„åþ,¨wcŒõ½ó­¬j¬…ròªñwVk›Æ`A �Îéó=†·­Êg"üç#OLzªÑìªÞÇ„·]bÙ!‚¶›ßjIžþT{ÄîÛo„\�B¼>½ Ì7š]ƒ "‰tƒÛvoŒ�ƒO4ä“·ßë߆àåæïá^‘å<Ó­ð+¨€ÇºL ÷°4 ŒïØ:*ÅsÉÆ’*oG¸ ð'aœÉ8ý`YÃ}kÒl? ´(¿•;\èðÌô÷ÔUÒñÓ…Æ�œ71¡D›j0î±±j½èšÑJ" Œ;œu¯mûi9S�ù|ÉRÆòûG‹uæ]èQÉw®Üt¿@ "Î+µ™X?±{ŸAðd¿Öò³À _Ýãð��_±ñ}�mêU”hMHÕ‰ð„ûƒÆ½�Ø×»6reóHè5´Þ¥ ÈI&ÆÅÂ`�â‘}Ê-aÆ+ÎgÁ‹yAP\Ì8ž‚ê�Ø92ï�l0Oã Y/Jþ‹�ç%¶Å}ë�8`ÈìŒ~ì«™½ñ�+þ1©ðÝb™Ó¯Œ¡„&…­aaká†ùݽYp\½hÎ.aë#³îACÂMœÐ·Ðm·ÑÇ8ÛÉ€¶<ÖSÀx£íû¨èŽxYà "»a>è�k½hxI.ß…³În�äæ ]é™X”Þ�ðæj……‘)K®ï?¯ðÇ'<ß9—YÇ¥{åy9Ó¿‹ï=ëëñ"ô~?�Âf‡¹Ñ(ƒô]ï{»xgðÖÑ1),FX-…Bo›f‚fqGÉ çÆLŠw²•ô‡ê… — u=ÁY H=~Ê£òpô1´3¢Wî\œ²?Õ� T!a!­’ÉþÎJø'_ÖÈÄ5{Í@1Q öì·””U/÷¬Ð=äËók„wgþÄuºq=¾Œ¤´kûxÊB=’&i 3ùáݯüX�í®h?g�áZå�É®x×ß!H¶«PnÖtõ5÷°'—7÷"êù5!K jgJDj cmh{*²2¯Uræ„Ç´¦üc_Ìí»¡ËsŒQx"gÝt—b ‚3¤Syƒ¤Ý�ÿ¿·®êõïèð_äaf‹Ìýƒ’[÷¾“>¢úDHÙ¿|Œ_TB‘E8©ÕÀ½Ó‹Eø~Nu‰¹ßÌ‘ë?_HK¦ØëGc¤IIgdx]÷ÜCh¸ô±®ÖÕÖ˜uÕ°þ:vP{oóü=¨›üDhT3ÃÓëp+1Æ@–L5{ö>ÆùÊØ1Ï‚·49¥ÄÚìvåä+µ~á+6¼žkÛàš��s‘ŸDç{U2-wDU·e*h£1àæG Òd¢�3§[òvÞg3qé“áœpÞ5fB¢8w÷°í8îVã€|ª±1ƒ#jç|ªÜ½E¸Ô’¸æ})ÐîøÎë+½ Ê´œcÕUzH–b¢kq|T=äïãVüaˆÎ3**øòîó7K�,8+F´Q¯;ýçu¯ ¥ÓæZVû×ð^ œº0/.7�Ì@SÉ”g#NêY|Xñ øQVõ«¾/Û¿�ä$·æ‘‚3‘$ʈqeF&ÝÅ3î2AË›à?ÛŒœ´ß7„º%�á·}úÚÈ8î·ÖcàÛiv»øŠ$Ö ÞÏ¥×ÙͨÄ‚N«•˜òtepç‡Ê 0"_$ö6ßÑ&¢O01Í ËeTâó�!ÔÙ.f¸¾œ§ÈRsåÇ9]>ªƒ=�¨Šü?)“¸n†º Š]2&–öK…¢ŒøY+zyˆÍüÔuKX«þÞÖSWU>46¥½cPBì�Mögiî+X¹É“iM>Ó$MLÚîå£C1|Ñ!« ½áÛ·YxºðRÈ¢±gä²ÒœË%Bèô’Dg’›Ôh�çnwy¥ÛË9°Ã=JQ^X«—‡B79‘h4Å�uƒâÈ±Š — �ç…©uÁ»4AþÌÄþÆŒiq8m°?f#åË\±EEižVß8ØÞ´fÛF,-ûtî> ö4j]å_XÕ:i¥msGÚEìi`Љ(ýHApS¹MáN6ÖV%bìÇqIiæ¬1eÄ¡_8¡¼„M÷˜Ö¨²i€Š3}V¹8«•”nîø½bølƒ�4)ß*êErÁ¸F¦† µ¾¡ÜŒó›N3èMAh —IîNï]5×~E^%Š˜Ì/t¬ÎÁ)o9aàî½-¢�Õå{1<:)†Y¢Ä²uƒeðë|)ª ”1mB1E ,ð ê-[ˆ…ò2ß®«%çÂùóìjÞ{lÛ/~X1(ÝËÝ= ü¢$‘ •¡VüÔž¢Äes…-¤Û`Ãa=áo†ÑQF‡ÛÝ~œâ‹Ciùë÷»-'_U2îºl×�yŸÂãÖñä8Ç Ó8­””ü˜a¶·ÄxnÆùèÉs=دÁìÔ�h݇¡+`Ó1̹,ûͬA{—•Œ2{�i0Éx n÷FÁ£d Nž“D†]WÉÉP1áB– °�rÓ¡QŸ÷‚‹â3p²þü�Èk0žàÇ—[˜×Í9:me«ÚQVx¾Ú`ÍžE­ÞÙx«Û+6‡™«  È e1¡™››Ažq�ztK« ’ÿM4qÚÅÚaÁ_pÁŸþ\ÔwÄZû]L�ÌGÈïtÚoýãOa|ÅͰ•&355¤»úœCúýü7¤O“ûG9O#+år¶5�Ûãa�…ñÇ¿Z�]¤ ™Ôn|*ÅðñRk#Ä,÷T^Ñb¤ Þ�¿HÉŒø`ä dš‘ÓzÏá�rs ¬“gX¾òÚ»ÇïóaAo�ïD7è�õN:X!'¯J/M‹“ ëoóe+At%P‡Ø¸÷msãmkÃLÉ%CÐÊÌ¡À]©áS TøÀ9ñÆP×8•@—£¶ �Á�¶ò"y„ ŽwÌHÅN í�@¼3^H£—݆ õü-ã v’À g("ügëä¶ Ë£z<Ê•_ûbTã–z-ÛßéAÞÀ‚— ~à¼ò´­ŠAuRï£y×™©ê�‹ëbŒrWÚ\MiŸ?Óû#¼Hõ(_„:�66¹¥¼RA Õ �‚…³=*œ' ÚÀc¸œ*­R vt[ãÀ(^mtnªð‡Râ Ê 8Òµ#(„£½ÿ=ù95N~d IíÓá˜~úËÞK'©ÝV&)Æ�×í︖ïe¤'çDôƼRÓ¯ïÄÿ®&T~/ÝÆ©±˜ñ^ùä×âZWÝZÛ¦›«©Yæ°y”zàOn 6õ±‘Íéõm»Â N� sPã"Û6â¬fkË�.„6 v£>?C–hc¾ …Ñ¿¼Uãöv=?™ô^zä<¹“u›¡«I:8ó~%ɹÅlžÉ7‘»éùá¥.¹ã¸,Ü(r 2ô{Á[ë÷—ÆÊïn÷™ú~®èÔ8·ðþÐÛcŸµü9×ïtaRÜÏœöEBíø{�ín­å¾?¬Zÿ±�GM Ã(ô DNõÓæÙ­ RþTIºo[]g2ú,l°ùe(Æ5Q}Û2ÅFú¾¡T¯ßóüc-Ŭ/l×÷y­x��y—kœK_&ËSþ+*ý¼~LnšTL/dn9¤×÷|º>"5D<2ÿ=;ëüÎw˜”%¿,dãðì×wâÉàÀå7zð<ñíé9åÅt×|R–Uwf¨Ë¯sÂ÷ž¨$}œû‘؇÷ø.Ô‰~¾Í4E8Y)eýt¢]�’Ö6ã6¾ªkÊž�±ú¹£�œÆKä2ßh‡þ�m”*È,°h.KªF'ýïwFC]2†¶ VRÚ1ÂÇyGçüïù´ÙÙí¨„ÅT«oþŸŽÊ0|‰F¿ù4@Àsx wíà�…t³�¼2|JéD,‘¾® p‘í2©÷£ówÇ|´ËÄdÉtð‹ž=;Ìe¼õ°5¸ä¶7¶ÂÍj0dÜÁé>}1I�}˜mX3ݳôÏfjúŒÒ>M�­~zÓÖK 9ë÷®Z?oƒnP¡6ψüªËÞíRÕ×:§™AŽýw,¦N (T J¤/5Þ”«æá&­ë½Uí�±®[ŽLTBv A Åy¡®7šˆ`âç©÷¼£©”ÝÅh>¥ÜÅÈj M'é›k<©› ÖúhÈAÈDJeP5™së Œù˜Ö”²…qQôF³bkÊ Eèn¸Äâ[oâë‘Ã^”Óg—#M(s`¼D*kÌ+›¹Al¥Œµ§ Äp[¯G»�5E"-Ó$¥ï 7W“NZº½{ÌîÖXÚ�•ý* so ¾øº¿ð¾–tN">ãS棓½*lu‹Øëµå߯éÍög,¤þ;)ƒ„GË}býõ¥}Œ¹RþP/BºM ¦Á±„1©�(A• äÚÄ©n(aã†"÷„w¦yE8¿ßœjŠA¹$pù/QÁ›E[“D0^¬»jÑ@m´˜›Äˆ‰xñhH¾ÞRª €F'�BYøÁï¼�ö ¯ßÙÆ*�á&¡ÌFú0´ûüÔ%‡Èà†äâR…ÐV‡êEŸw®z¤›9~J‹H(A_8¢/$ œGð×·%±<»9¶TüþtíŒ~ÛÌ _DODS{Žî«8û¼û|ÊËsöµ{bôÓÿ2Kq¨)Z«béäÑG¡b™uÁm¯ÍÇùIrnº×î¼ë¡¡W>WÓYe«óÏÌHN°ðkŸ•+@ü(<&§OÍox­/>DÇå2Ö�¨r'&i×l"Z±v©¨ÀH{9„Æ2Œ µãã™ê� "(¶±sÐL,B9ÔcdÔ±é¤Ï)òp645&öYŽk�s‡zÂ.ƒóê\›-­í S½VWt€»Ý³|ㆥ­JráoœÐ+Á#³èdï5WÊ(ÞDA°¬- ’ºÂ;‘y¯}Ç*Q’Ο\{µSýÝîÿ6�k\ç,D)†Q‘KŒï%|Öð\dkñôš�]¨êæå9µ*¹913éï N¡ oE8jƒ2æ�kÁ‹‘í�M_ý²rœFH©øìÄ øÊÐ�åfdÚÌï zªD¬Ô:ß §äqï¤CÍV;ã¶oÜBK^g³¼™Ië.6oÊfŒ.°†¹Jp{É®qy �6ÃñöwÙž÷<ÿãp%HJ²ûUDÁ癡ݢg&TÆmÆåÉë dÊxø²o%¹ÏŠ»v‚k±á™¤=è¦Ñ?õT«KØ6èËóÂα4›”eFš]FoALöD«†½Þ%Z�4‚á $9&ˆÚ]tê町K'Ï€LûMg—ÀlÖI Mæ¢* DVNhFö—{焚>#$ΰd.¤¼Î˜¬ÝŒIÞ·fÆž•.© §’¬gЭ¸;•ÛG�t�@Î�'«r]\Ú[î’8ÉŒ«-û,ªíÎö1íƒkJ—jTôŠl0‚‹(€ü¤ÇŸYs›£Ï¼jó•’Ý`×�rþ%Hª2“®dxU¤…ŒÊVºyÖyäË9’Foš}^¦5“Ïôúˆ)?ù¸{ÿîÓC¿ƒœË¸4ãsúãжäÓçäÿ �ÿ¾¶jì@sŸ·÷ÿyUuÓXílx²9Šâ\4’Ô`ÆÓKìþÚ!Ÿcök>ñZR�#ÝÓ%ž�²$õ½ÆêP6›Ilá�Ÿï}¾ý­”FØäü¶¦¬e�ŒI i°6÷;=>�Òµ§Íbi3ÚsÊÀ»Di2á‘pDá@5 `¢GÙzô�©òý©^ÖÂýœô(^R(OF!Ä9„œ8n pÓp@œmöôËßÎzÙÒ•ú¾-nž}׸ÍÍœ$]8M±¦ØØ/Æ ôΞs·Ýhý^±ÊJg™Ï¼´ÜFõÊÊM±3ÛþF+N‘_:é“=5"FÞT”ëÿ­‡°ÿ”Q̰L±ü߿ߍ¯�x\R&ðp1}…GÜÙ¸Ú©æ®_(‘ÿ·`á†OöC‡uÒÌÀ¢‘&'äoɰ\Oè?N0�û;ްÈòZ8ÉôrÆÕ6âiŒÅ4)\ÈüÇNÃ0_~„•Úã|�º1i²tÌìqQ‘'‚ßËw�'dÖY~þn¶íkƒÕÆc?ñç¨<ý¾TvýõZµçêêFjГ|J>¿øÖ”ÿЬóÀ'ç ÇÇ8?³l2ˆ4¹…‰õy6¸&(šþÃêÁ”Ò5YÈ^É*îÕ8Rr¨Éo5è. –4 Z¸¯…,´ Þ—Âݵ>ÿÓQ4 ˇï£3\×”°LK�›™�d뙆‚“ÓýdÑ€#ɲÍi\Íù¸šŠKÌÝbS…ÍTWv¸ˆ‘[“¶Ò-P¿é £v†åÿ#öp@€õðh3ñ…BüßÕ]ϸŒ[ÏÛñŸÊ  tÙä†ã‹o÷žûrUó¿…ç5!ËÌ +…ŸõÛ|VÃ�^Ð`š¾±�^±e¼v5 QÀ$¹H£'>4 ƒ>WVNMí4|ÔR„˜G|A�åÅV¶„vÚNLd鵫ŠEwTg9PL˜ŒvÚ-r=#W0  hér@ŠÄºÜø%aÊ5(+ü–1ƒæ‰»¤CçñƒþÍü¸Ä±?ôX÷faWoÑK«¢^)b¥(«ah2s°bå5µÌé— Ù>'ýU¾-Ã?ïôžÅá"ÝǤâXxw1ô[ŽÃ t$Ûwo¹mŸ†ˆXÃIß?åˆ|0¡üó�ø8ö!·/TÞ¤5ˆ…‹„1ç™Dƒ‰ö×ÿo>$òãJ»Pkm*YÛfé½ïiƒw$Àù²s‘�Æaµç>ò¼«Ür_‹ÛøQ nwÌzæøOëí]û¿´ŽŽ|‰Vkœ1T‰ªiD�TªStX b!m€éJÿFD1h< ZNG½×óæS¶f„,©òà‡qphØ„IÉ•E½™šÝáÇ; /w…Dƒi$WmÀœ82ëÑ(ÕQsïFC ›|šŠÄóƒ˜Ê±â?ë2à#‚~ŸÜ{~«n8á È/u1$dT°9% ‚ ×ÕRÃ;þ05zº<6·=˜cÉã­²æÖÊ$Bí™A‹‰LH" y‹¬9äŸ+…57ˆÑRvÄê˜{2ða²>�…#Ïÿ^yé(s4H²l½Oì0`ì±Æmœ9oQåŠi�!Çë>ƒøû³Í “�Òp¤Ø'�Æj±9ÀæÁY´ ¬­S5û©Š“Áƒ�¬ÌJNÙÖWSª¡>H;؈´Ó[­ƒ'–>BÊ„ýA øØI¥ ž¯š´kÕðA0rQ{ž/³ß̉†*ÇèÊeãtŽkö,Àìf‰|ÒY…ë…îsŠò’ÉÄ팣vÆö³è»iÎâ¥üØÂq³pݚ̭N-JÍkÑr¸ïöU\Ìj©äÞö~Ù5¸SÑŸò.' Mo ^ +pn—ØHù’ÒÀ�ƧÁÍZ,ˆ°IÁ$’=5ïÐýw?­A±¤4>o½lÔ�KŸö ‹̈M9ÁU2rÞ¼mµ0k5Ö¸ÉÌ«ÚÜhz‰ìË•—±è³Ïà}'#ýR÷ìÄŠº«€(âq¿JJ¬644Ï…°^÷k‡sX»«b/TWuk‹Êãw ©[i…®.‚Ê(ÝŠü�9皘ßX$¾{ë­RáþLYâ² µyÿyÂ@¦‰åätg3ã;exÊ‘voÓ‚Ÿœ61¦ o—ö°G¯äjûüEš?œá°ÛPÕ&Ó[{þçàþÌ•ûo¿¥ió¿ï¤jil"2"R° ìú¿žsÁ:ô‰¥Uâ*P•bMÏoï¼GX%g a IÝ A@ûnÛèg‰š¹Ý4y�.wÕ³v¼Á ,®/pž³­‹ÈÆÄ¼ƒÙü¡r×tüéãÌÏÒf­9ö‹—±¤QV-^”Šzh1“ ([âÇe,Î ÁY^ ÃZÑg¶C* g­–SEmN ’¨Ù™hÌÙ�òa”ˆV¼¤š³qøNsÊm›ÄÎaµ*±«_@þ1AY&SYsS§¡/^P@ð?ÿÿðafŸÀ ð” P A% ú€­h¥d  ¬€ p/€(‚¯¶™ÀåGÑUZ-ìhSY&Š   05G¶ª€&”–ƒÐë¶=p±TôТAè¼;“fŠ4äÀMUí‹aÀg6ªèk â\;€PkF�ÐÑ ()@(sª<^º¨*Þ: èdH7`rºJÀtµA@PP»tZÒ€BŽr@Cp0 ´ç™¢àY¶AF€(N…Î(:Ò€h Ó5 %Ž˜tl]�PŠlr¢€   ÝSœ€[€4.qÆ€*Íi¦Ð vjPP v`¶Î�A¸€è B–°È.° ¶$à Ší4€ElÀR� ¥ÐtiÈ€°˜PÇ-pÖ€Õ P:Ñ@t Ñ %¬RØi@­Øh€2«¤9ÀT±Îp   ÛC@(…IX$X° XBF«›(P�ÔxjdÐ(Š€À50RÒšŸ“"@jx@¥H“j14Ó@ OB" š4Êž�A z©! 44‘ L€€”m!µ9�[ÿÏé*��³ÿ¯µûÿþ}ª×*©-ÿv)h¢?éÒa•czZ·qJÒ‰£þ˜ƒÜ„BúHB@}$ ! >’��ä�$$IHH�$„€ÿ HH$„€ª@’öÿÈ1Õ™Z+Ò{܉¶/Is*¦ªÿ7Cj‚zöƒNwƒ¨‰;p¸üuÄå ¾+…´ÅÒ LÕØq²¡;)FMÕ�émtt£`ŒW¼“íÛÕç/…e‚ì]ú»ª1J6UèáÊ2âµ×‡nHÝ!™Î<­œ¸Ú«Vú˹'ânõ�‹X^èÒ8=iôÒgÀ5˜˜ìÞ7¬fcÕe nÂGt+wÚŠÕ§7¡54jñmG[‹|Fu¼5Mes|8SÚÜ뺮�n+kgB)%YHe0™Ü2cμfҥǗ=©®m« ¥Û秨îU†”ËÜ£ÕÞÍ£©tUêÙÜ«TêynñöÅy·ç:õ”k6 ˜§ ØÖKíõW’ƒ¯h£h·±L¼~]¶.š—¬#YuÇªÄ ™ÝÍ]7kjôNÚÍ žà< ÍëÕ4»Ý–9mª­æ·=ëí¾°©éµàÆJÌ9‹#ëå¼ÃY´e®ëÑ"œ¢ÁT‚�™ÛT|�A°h˜�¿bíåW;H‚CÞ×E™z€¦vê­hæ°õ”°ÓëÝCGsu…[Sjùu?#VÖLåN»*ógw-ÍíwFt»¬ëÄ»Nð°tfÍnFÅÄš„UÒ¯ê¼ÐµH,¾Ê®•;2¹Ü®^Ë3°Œ�¿.`ìì£Ö† Ä�Š�q ¬uT 6ÅQÌVE«.ó#s2F,jff‰x¸ÐëÛ›Y—ª²ù<΂íð;Ž‰Ç‡Ó„ÄÛ:;qM.]�¶MÊ­;WoiÒZ6lb;Bñž6ú®¯biöòª-³uœ²º·—µÖÉp®ç}Ò°ñv 8ù‹ÅZ²1GºÒ(ˆëHß›¨ätF $lýòæ|>ã¹å²þc3Ë'5åUÕàÁ5ŒöǸè#ö·z`G¸°ŒÞ·Û·š ƒȇXLyˆ‹¥-»¡¦£§µªƒ²>r­;su¶Jìl̳0¼ÖúCeÝ,Ôosºpîì¬9Lc(hÛ9b ¨$O<'° ][LpÉ `&ôi¦Ýì£,Vë©JŒãË –su5yP²�ç^ªk�Ǿ¯½ƒ/ëÆ+ìŸP»s²d­éÝkc‰nºÛå‡1ÄÚ´¹dÊÆßg)Sû%¶3¢Ö;BëÚ'áÑ™FýÖivPî”o6«�Кºç¤Tçm Óc…Ôê”7ŽíÙרRç.탪î á(‚ ò21{7+t Us±”¤éý>Ý®�¯³ëTÖª»™²óçšçXI×½<=5æÊXB¤�%&Æ&EEŠ*¢4b£IŒEI‰*ˆ ÙM¡ bƒE(ÛE(M4ÀŠ¢š+dÚ(6�E±&¤¶-h4h¨´ELÆŠ#jƶ( �¨ÕD¢´lÈÊ#4i"b`Å™�’L�cÈ4Í�I‰-‹ ÀÑ”PI›D˜�¨LÌÈ¢É�²£A$ÂÄ`,Ò£2LBMˆÔ[Œ‰IXH©6Ó#Q„£µ²DP‰²Z$Ȧ ±E¢#h˜†ÑP› Òd¶$$l±X0IƒFŠ’ÈÈÑ  h‰’‰XƃI´€Æi –(± É£$5$h´Ó±¢’¢Å26(… $e0Òj 1Œ3@b&l�™#F $L1˜)‚#cD•Š%*H#$ Di�3A© ÉDˆ•LJ4l”I�‚1´ËFƒhØŒ‘išD (£b¤¥„˜Ò’ÙhÉ)‚ÆM2RJÒ@`Ф¤£1RIŒ™5$Y™`¢’%"4dÓ˜‰(l“&LÐc&(¡2™É RКL†a¨L�™‘¥ Æ©¡,&™#H2ˆÑ4ÓL‰i0ÃLÂAA2&ÀѦƚ1*™%T’1(j�IP¡0…Š"�¡ X‰š4ZD*#”&Z �¤£$¡’¢Ñ¶ �5 #I˜´!Ê4¤Ó*R-Ù6ŬS3A2 JU™F"D”±c$ÑL[$cƒ Š�ÁI$ÊBe“JLÄÙM4LHÄ%k$„›�4!)3MR‰)d€ÔdÌŠ€Ù’� ÀÂ6H¶$)**$‚†šD´P IŒe‘£)�!¢¨£`£HcL Â3)L¡M™‰¨D”‰LÊ*Lbc&R¤›& ™Z"£h“ŠQBXÒ�lcE„PÑÆ‹"%&(©ŒÌÒj4›%‚ÙšÄ š‰"¤D42Jf ÆƒBQK•‘Ú� b ÀÆ”dD€™š`¤ÄI™Œ™0ÐÒ2J@ب(ƈ¬b,¤&I“)hÒL‹clDJi)#I„hÁ“hÌ@BRÆÈI�¨X„jPBF&Ð a$©�¤&˜–,!2)&”`’°Ó3XÁ³K& A­ŒJ$2ÊF™E�›)fi$M’Ä‘Pɤi -Š)¤I‚4h‰`ÂI��f1 Ô¢�1!2ÌÒ$b !•$Šh�%4R�@K6XÄÌ ˆQJ À@e3`PÆ$™ 4ÌB#4²–d(Ì# Šfd‰A¡•IĘÊ@`ŠSJl¢a1¨‹&…)’ HÑ ™KÊSDP T�E$Œ@à )™ÔÑ’E˜ÊH !&4ŒE $š"DÄQ&ÀÍ€ÌBAF4S ƒL¤@Mˆ’L˜Bb Å“I LiDšf”2Ê)˜Y–„ƒ&2 ˜J&2!™„#$ ˜ @¢hˆ4̘Ñ$‘±¦C#,#ÆÑ$P”a%4bdaHlÊ$È@Qc!˜™ŠAš $I 1š@(ÌÄ Œh�‰-&R`ÒDÙ!’$À4¤™I``3”F��À£JL ’4Ó"‰±�šd³X˜Ì)4 �Ê@”c6 ’4JcbBÑ‚BRÑ¢ÒË0$Ðɉ‰¦E”c&¤„#F”™0“¤d���ƒY0^.¼z<ºôò¼¯¯U�.¨_L ¦.ŠÕ ÎÊÞ·ÍÓ{‹—nm¥Û››ÜÉÔ¨UÝóé¸ks«#®»´î°Jš÷+z ¹¹ƒX@ʦ6ò€Ò ÷^ëÒÚÓdÂ{võèÅ9N±ÞÁT–uW…õ(ZD¼v<š~é›}ß9Ó~~T7¬ÕhW(ÑÐ5\P|Žpí fN•ØVN^­ª¥1Ú3rgrºc*y+ cH›c=œ U’é0ê°˜)�äªáƒ§S+}²ÌÑ¿w iYD,åŽî»en½xÂC6§ÝtBî§Ž î–Á… ÷Bm YU¹\ñRA"ó=C†›¥8ÙÖmã•Ŭ} ̾¼ß$ñö qå!Û2»;¥ãMTŒ›™E딯gdÊW-÷^ÊÑÍ˪”ü¢€õÕ-ZxrªƒtA£nÌ*`Ú­|:uv½ßeV»‡¬©yK£E ¿<ÜÕÙ]ÖÆ–öîïj««xZR´†Åê®ËÔ4(ÃÚ±çVƒQ�¾áGÄœ£Ù¸(óf¼†cU†÷ƒ¸x>ÞyŽ�©´Fä·ÆµQ Ð¬9T1Üá̦ƒ«�cËÞì¥,w‹ùšá/áˆ*ù�¨Ø(˜>Ѷ>†ßƒËöc©4_ÆeËìÖ®ûq3ûo5ÞTnƒš æ9æç[îYŒ^±–u{t®Þì¡Öé»Ç’EEÊ9–˜êÅÌΗ{ܨðãÒkn,Í­—…é²üR×;,çd™‡s[K¸^=¨/ƒªë¬vÐŒÌAöš1>æ*U‰‡ËMÀ¶ìb00£XQ”0‰Ûà¬]ÞPœúãÌ}+bhõ^_”vÝR¯ºñw‘¥¢üÎÕÆèl¬ JÃÕ�8Ö˜/&½ha›aXƒZ Ž݆/Е½n‹´E+4ò¬Öe9g/´ž2ZoÕ´ægb+±‘ÙJžW�[cF™s·²lª‰jœ5æ^s®G™Ó¥9�^ÉîŒ#;Uôg¶Ö›X÷ŽÛ{UDñÛ8FÝL³ÈÄ´¼jë¹ 13Ye·å™×Jª”˜ß,Ä,‡Ö\ã7µØq‡PfŠA+Ów®�éÍbUÒYâ0ÅkLÍ—zp‘bjCUœÆ¢ÃC#:ü}�øÿØ_þ¯ÜÒýâÿ?¹s¹,Sßæ0 ‡ ® ]D…‹oöI›j}êa´&ÎIkdˆ¥ÁfNÎ,ï=ÿñåpʬ¿ýÊÙGœXo—�\¡„Ž{pGü„$P+g;ßQÑ6–AIà¤]Æ\éVh3yê¤Ï/ƒ[­G ól( NÊ ˆ8­ê$¢Ï*؉X ®ãÿ³>\ަìðÅö±Í#�Aè2ëY™Î�o†æ&4L´/áØ}óy¢³j~²ú(›9 Äž æbE8tìF=p…J“Š×�«'êîÈNcdpu:ÌÄ$wŹÚY!Ä-–:îëý-}¹¨¦Fz›³~ ‘-a‚FHä³™ÛÌžæ΂�™w˼·0¸káÏJ8áÿÍ Ìµ¦º/ŠÌwLDs—àÉ|Z‡hšC—UfSËYù¡*|î9R§:Š©”¶ìBÅjŠË“SXt2žÞaÝÈ4—ºtwø©%ýÍôëŸ{}oN9“Ú�«\$ø7Öiâ0ª¨u�j²s¯)‘ cm„o®³¶ Nf,Þ3 Û‚}8œVCÎT­ÕŽgôŽËFî’ŠEJ€fcppåŠ:†®}çÙÙç�>cµ1oO–Án oâ yˆÍ¶Ô@¬wvï·§ÊzNÖõ3®3³ró6[»‰�Óu§«ìÑ9œ_Ô¿}ª?‰°ýjœÜ)?'X$û­º÷¤Œ¸CoÇ2 †+Ó™E‘Í%Ä B5`°æ,Õ"^¡0`+bf'Òÿ•š5‹"·øõ™>–XùæäðHFBEñí¬¡Á ÜÕƒ•ðÞs”,’$‚¥&mO¹�R¤o(^i6L(3kŒó¨õÞµç+rj¦Qä´´ÖETR1,ãM§"¥ÐŽ­‡-*»‘4gpJ˜$9BØB?*H‚ ¿>]Fm›0ùlDDtéðUÆ.�×Ú&èÑbú•y9ʺ)î¶ÍÏ1oŽ!ÐÕTÉ»p?-;žv²Õb°�õ*U&!A牒Ée¸^µ zp®o³õ­Ód4ƒ!ü$_¦éÎ )H±Ä�實!KDøaTœ¨ƒ]º†‹Ûï¤C�D+XJ.&G¤3„m«jH¹pV‰ò F éÅ’˜ÉX ÊÙ†®YP àê­­g*R¤|ÝÜü\ׯFTAƒ¸QË£³FH`Ðnó$×[¡�Œp T…0³i 6ÿ[ïÙ2nádôc�?Q:»¬ÇIÕ~Êþcجœ:D‚çÔ¾ûC<ŒÖ¤#0µHH97AQà³Eyæî«FûS8©ô‘3÷Ì;éTâ�«ê²ACâ1~IB\¢åÆ+jˆ.ÆŽù-7…IÏ­8Ó³’NŽ…}¼Säñ¡<ëM’°‹G„×RÆ„žVô¸ûœÑ‘Â�GÞâ$µ{¿t¯ÆÃö¸ÐYKv¥& ‹»¯~êà#Œ_{áÏÞ|yëz�mlèÜòÆMi”ôÀÒF ‘¨ôØ`¥("ª8„Z�¨ˆL·ÃãâZä¶ò9‚²ÆÓ¸æž"k‹ƒÆ½DdÖ®*Cz¶j”¶•4{†IŒª¸ƒõ9³^¡_Eo('³©<š:7÷ä@É&t™VWÃ-hÕ¡ÌG«±Cs/ßiÀg:VÅÝݪ'L$uþMvÚÓi‹,€¶VâJšäˆ8ºÏ.Äå=£0q¿�À’¦¾7<ÖKÈäÖî~ŽDJ$÷Û%•¨Œ#&¥A4~MDñJB…>¤#ÉÒ€_·À!öݨ&¢xB+‰‹‰ ÒŒXBÖ!´(…êéŠpaÚ“ŠIÊÄbŠŽ'¦8/WFÓ&ßýÃO¸Äxô[,UÙB,+2�‘�ƒŒ�çS—íýØ G ÒRGlpÇù,W üêø’EHO­©�¢óËÄœ´Á“©�Ö[Š �V�F “ãNO¸ Ê`ɘ. ÅÏÝ‹}Îß0¨ã:I)2\­ëÚvgéTqõÄÆ2…x:<$0¸œ¹Q­ß³‹#6ßÒäq”5JãšÜÂ)·ÑޏUÊm’â+˜«˜»fb}µ!�A£Â¨3u À˜¶££dH•tn&E�GÈ—’.Lkªˆ¤Ò[É)¢$£%Õ A¥$k-Î 2Ç©@–²ëd#$EDƒUNŒ„‚RÌ0dÁ_ûR?%’)’‹w|0ÊÆ\FïዱB6wå;É(kܫǡ!¡–k4ЄQ¯‘üdÝ[•XXED¦¿ ‰]¿ÅTfg0è�"ÊDãĶ)25Q7PÏ›‡ëCQlf!“Iirœ]¼sh‡"D@´xtqû†‡²Z[½§nHD®2"MNõÜGà핽¡Ì)”8j8â*U2öQ$QƒÂÒP¿L\‰¬TˆÒƒ>”ü9j ó”äòX'è¢8õÍÊ”%Îèq1ÖwK:Ò9ÊÄ¢ŠÍÔˆ�†æQ¼¬Yÿ¢(Iûk%AEAµô“<ЉN�Ä ˜^¡Œ¦®ÚLéfV§ü÷.U?† "BÖ�|2(2©©MÉ8"îYú_è ¢}âÔœ@Ã\ڨΰËÑ]t€ÿ³ EµgÜÌÁÊ¢ZmxáópìYAÂd²¢ 1\§U( ’ŸêÂÒ†‰ú¯›€$Ѳ§iÍÀå0$Hý`Q ’N¥’]sÄÔ‘‘Ö‡±®/Yq4­þ½v¹€d _ÃÊnJZÚ’/µ69Ò¯ž\nr �¨˜à² €b¦@¨˜OJÁô`Í$†m¤ œ¬%”ÄÁCM‘�]ýM Q†ØdZ>:¾I¸½gr O’ð ĘšlžU˜;3.Vv*¶ÛElä,#ŸÒLÇ@ެ¸[å!Ý2I÷ïËÜ'o &ÄW>xý–�eú1°À4DD ¯x#¼ÝÔñ–RUiú2iå‡i"®›‚¾¹wFÚ}±Ñ�´§uÅÕG Õ(�GÖÖÑ�¾„dÍ»Ø|,qk }¿Òª‚ƒh¯ ‘‚G$0ÈE-¦^X¤B SL I% %¢�HB!æœ`•È Š8$,iÞÔlÑ“–‹ ¢Žò €0JÐ$2a”Žš#õ„ ÇÙü5*ï¾#ƒGzZƒ‚F’5é�ÆdÅ ˜k PɪŽÌýRa!%2ÈÜBI�ï„áR #DQˆ#†[á°ITØ3ôѳ”ÁÄ?‹ñ?0jm�¶9ã$$C Sl3é³Pˆ`â›!”…Zd´Ê@ DÚ�ˆ!�V›Á)v›‰!¼ zÔK»G=¹‚$„K é7"Ñ]ÂH‰ ¤Ë’öbL#ÍùœÍ‘ÆUB•„`�’˜ °ˆ8;A ¤ ‘9Lrû‰ ™Û\”á³Ág8B’I=– ’^e\#6›-Æâq¢ˆáSXF q5T>g5"JEî80 œvÂ8 €ÑÂÇ)³OO30pH“Hà�D‰ Â@€i„È&!´’náÆ)¬<I Ðdx`�s�<7„�! ‰!pB²;J88¦šÈŠ€‰$�jd‚;,Yl�$;¦,8Êåé‡0YA"u—‚ B’J ŠRãÔd�´ÐÛ†g£4ÑgÙ3í€Èd)`�O”0È Îš¢ 0m&‘ �OiP7Æf5T\CYPÒ‘“Í¡BD¢÷IÀ(Êg(ãÃ�5RõÃB'CeòÓ Ú"†ê3“®Ò$Ù™åIœ7Ñ‘§‚õ¸b Á †V (³:PA#ÓNP$rSIf:ä9’‘Mú8Ì H49ˆ8i{~BJ|h@„�Òa”yi” )Að2QhŸk¿S$�©@¥Üº96 …¤¯h6&Y,°�–Ùe`’If’ÃÄ´Ô$Ê ½ÄA¹k2FfA@DЋ¥JÔ'ÌóA¥òñ$�í.Ï7;¸9ÆâåÁÃÛ룯9¡Û8ã1–·øÊt¢ h/ü2ãKK¤ E”™�˜’±‘-¢Ò!4 A~BxE+¸FÑ �'„ònV üb!@D G/¨d°!D"Z-D"GÄå¡2Dy! ÑÛ^’š- —‹L@” Y9¨QJ€p�$ëãŽ[4Š'‰b0�²$‘”†% fC8 "¥¢ÖpÙe J¥ê«Ic$' 2Üa§î7* 0ó „RI°·Ù{…pea`€‚6㇠*õ� …iY!Éí ‹8! Žšh$ƒm¥„6Cµa0­†Xa„ÊI"ˆá0JÒbH0�<'*X€yöª†��L Là „|…êw«‘F8)²ù!S—úcƒÂ“³Ô\øÞ ‰d† œ ׉ႇMà™PÊ( h£€ÉÊN\æ$˜<´ZJÓ"ŽClJFÈC„;•Á�gʃ!xÂÙ€Âé ÈEBIm¤íòfQQË�É Ê¥É�Ñ‹(A9i�QYNÂkP†åC„%¬wÛf~Îh�ˆÑ  mœ—³GOƒè©–X^Ó=˜ö¢ž\äèr9ÅÍÇ.s=KÕÚíÝp2ì% -¢‹o |1r‘0 KŒ¶Ò<�Î ¨xfm¤AgúXÜÃH%��=87R@*lÈ $�l0Y²/B:WžúnŠÂ‚i¦šèâª)RŸH/:5=þÿ>¿i?”�ÙVþÿcý“½«–å1ÂøRËnŠw[ˆ�ÙÙ;h¤Ú�y "œ.öêÞ½VvŠ86²>;wâ¨]5]5õm†¸º:èã˺t†rµñuUÓ»„'FE@<Õvq± | ÆûiDÂ5Ž´-À�å„¶ñ šôUä-…œøfAuº « qƪ¨· RË©onfÍÓ�oe#¨o]%¨·­=—uw§VÒžrâJ ¤àÎf<¯+€L£ZzÏ[îz«;•ŽÆ †�J²; Q’ö5—¸7´úæÞ „9!�*ˆq᱊—jîØÂð'¨u±¬ÁË6)uaT è¡z‡<í¬½µ·�˸ ÝVõVck¶fì=ÒÝ’·ª�05ÌÝÏ@}M°Þ­9:—o þ~È+î‘ü§hí?·ã}XWì™Ç*†õyõsÛ4]°^Ú�ñ(!¸©x2k)XÆgÜþ_å�·3(¼ˆ§rBçÇæs u„<·eÖz«Òã‚ã¾í7ÙÁqvÅtF4Œgsl:Ÿt÷æ>= +íCéÕjúh¨Ú]ˆvâÍǰ­çU]ík½¹jì5™f� —||æk/Í3\0öP"È 4Ø·Õ5Þ­»ÅRk¥œºb3Åvrb‚QÚ]ie/FA½%Qú†ä‰§K6a½íÅËÒê¯3c¶Ça{cK‡iM)v(2ýÕTªuæPînµNfuœ7JUP�c"ðŠî9‹¸ì<+~ÇöŸ·ª}rþ±{t>ážçî€m‹—Àg 3Ÿ= e™ õ°Ã–4Ž7ŒäÝçWU :yeop–æ,IïLõöà¬ê•LèC�sEÝjÇv; X5ϸY¶*e|·ª¹à¥Ê¼:ôm|'°t ìÔÍ>ê§î7…ZѲ´o�šLS÷howMg7…¼{ìYj¥®c_fÛŠèÖÚÙ»Ú²¹uí`Þê=�^íQ{—Ê•fËÙyÙJ:É31—(EPÐî½Õ€‚äºËKéjH+îíû6Ž.K9ª-L¯]Êr=³NÆdÎ’]¹pÑå[±aYu§°ë™ˆŒ]™~ݵZl:A.Zîç0{Ô`¹xF,¤šæ>¯.íŠÏš/«+LSܬõƒ™„5|·ªÕqÔ èů™Ñî†>öÜdÓSØi`Î;Ö1ÕÞYÅfYo�X9mÄÎé¸�µg®·Ç>Šé�ˆ×v�Í3]íØNÐGL”ÜÌy’å )ÌŽTìíÁA•Ã_W@ÃÞ^(ÊZU�ntµÉäƒzœ¡ÈãLgQ˜gJ�÷I—Ç^ЧŒS9˜xõÊÍ£X7ƒ¦++1pí̬»¢A¼ËUâûvÛ� ,Ëò°1*³›{éÚ£O Ê«ëô¦Ä]��ªÁ˜ë;oµeuVðÙrÖ÷^Ã!:}-â¤J¾ªÝ…Bô.¬Å›F×jÆ(>=w½¤ŠÕ^6ºöU‘6eäÌCö /†`RÞ}¯í•¼ Ÿo>.³æ‡c»¶0‹pa KŽ„k;S"îöjCyÙ•ã�¥wmËO•ÌíébÅë@ñÇÖÖÛ®yöœCz·T`Ùì¯y»›ÑJíßKÌ­Úm7”ºcã«#¹š-‘sTâµåwDpJìQpÅl/_ á/»w ÛÝDTÝ{->±Ôã¼ä»f”%*ÓÓ(õ¶U«È-Óåb¼Y—ŠmQÈxrEÜB–áêG»p]ïvŒÜÃwvöžsÝA‘Ð)ÆÄ1.º Œ$=Ӣʞà/½•YHÌ66Åìw›†`¨uŽÆ‘¦2ÖP¸ˆî�fÝ[•@ËY™ÊîÆXÞö-&°êìÛí¼Mfv­<$ôÎåeš'mµ&QÑTu…NU  Ôɼ-m]f�Éн‹på·Usw/´bÝvñŒY|z•tŠ«sQ�‡Þ>UËÓ”m÷^cÑX¶´Ü0×}¹¢½'\µjÍÆTÀwsW]ÒâžÎ§˜ï­nã!u‰CS�víªû®¸·YY]}vxcåµÑÝ_ D}Ûò¼½õTÑBѲ/ãÕ&[<}F6ö«�}ÛòÚöm.èóÁWkß—–U¶N/U•n«lh�$„€ò@%  ¬µÂÿ÷ªdt­=YîÿߪKv¾yðÜ!Š�c¨Ez™)±$HqA�›œ+À‚iqAÿ¦Gÿn¡êCAßêáÛŽv~Èn.=–ƒ÷�ÿ;ViàáÉõïM›=!žôЍÒ=íÝvá¼0‡”4þ†¡p àY°¸`ú�ðn�½»S¬ß‹sßÔÝóM[ÌòœüwŸ0q;=1oÑžb}óž¢ofÚÔQ»ËÔ„è‘õx¯™'?[7îø6 wùͺhÍÛ ñVoݺi" Ù7¿Içg/o¦7&c�;Ñ·|,g‰Ûo¶8µòŸâ ,þ9Ô�Q}…©Æ­ÆNrN}2-ó{hýõ¦¨P¯x?�­Ã›] öc¿™1éŽ(qÞn¿€KVð9v†¿,Pèô‡�´€ îµJê-cׯ!È›ê`íâT€t¦‹FeÌ–e6™P‡pK. ò¶Ò’YXW�®sqcO‘èü„Úè1ƒ‡îüгyƒ òÒbogãÔt^š˜ò¿p‘:v{��¹}m™å/Û¢ÅjÈâ¯äÌr(+éßvùW7á§zi¡/Çt«•S<â¸Þƒ;“%§ƒ=çåǹ—Xžû;ro32Z½5§|#9#%6Æs,Äqb÷±UäƒÿÄ…÷hhýŰ@4œ @R Q‰R*µ¨B&}¶ñuT§dÛ)ÿ€$ Bí•'mk$·WJÔš¾Õ=©ZÌÞ´¥¹™óñZ;¸X4x�¥£pUZÿ[ŠedY`¨Ï”Ò��ŽPB±˜ð” q$ª9b¢F»æ"²�$„€¡Ÿ­ºÒÀ½§1qF:ãü{!#û"($Œ19`ïsø�%ÍQ�9iñ‹Ó±«"wœµ3]M‘Ãcr¬JB)r‰4B%!–PAf›+Áø–—>÷g½J&’y Î廨 ›b0­˜Ù *&üHB@y$ ! 9ù}wŽk¯\é�fQ¶°&àleGZIONÆ D¡”6$0ÃTd��Xˆ06Ÿ8 *Ù@êº$ ! 3)H3ìâšöÊ}±å•qf§â c_Ä=?Wœ •˜ 4à„BùümºC8¼á$ºÑ) ¸*ÜËR…Ò €sS2*JpÙ0š€tHB@]‰HHdyæ[X*ÿ‘iâa–ÙþZöµö½)i‰ÄZi�|,Q`\’ M4š€u¡BUBšµDo$­-  Õ«Á%¦®¢4¤•²Ø¿¥ÜkK”‘ÿ”!‚v‹H8ÐQ�‘€ÑkDíoˆ rVôd†bÉjd*ÇÁÈ"RìØ¯ß_ïÅðÍN{Îmú“ ë²pî§×-á¯'tt—ôØ6ïËd”kS ¥e�b‰»¬OÈ-œ$ÑB@Ê9"yÒÀxÀ’�÷±ÎïyZÙÖ]ã¼ëûy­ì9Ô� äwÒ¢ËYY!J¬¢EC(j*·uFY¢¨°m«d¬5Tn’B(P‹Hhµ‹ÿF¸`ÂÐγ¯åepRÔ TˆoŽ/Ÿê¥ƒ»�äìÏ»õ DUä/L@z+J%C„�š¢KÐG\"¢÷E.� bB@Á�Oïo‚ÖHr DÊk•*‘Tÿ\¸n…b—~é"2Oé3-5ü ¿s­ÂÊRµ7m*rmeÄÉÿ Ý4Áƒi$d+&fBë:/©Ÿ‹¢vYáÒš,Í\†$…ÉÄ §f|��]:b|½ùöñ—©ë^Y!ÙÚúóÝpûDÇœ'oþq§g@¬GÎG¾�Ï/hë" ÿ=¹ùax¯Y’ïn^åqö™Œ}Ĩ~5›ÑÒ‡®ûUäÿ?t¯vû�JÚÚxšKo’-ù"å¬ü™ÝãfzüØÅzËk&æ^a–Up[!4‰|&/PRø-Ñòæî³µZo÷›ã¹õßiÌ7š.̓¶Ø| uö{YÑñêÚß›­Y<ÇN~”TÈ;õè!€E!aØ´|YÚ[³Ã1â^8Ä÷Ýnž­Þyr{Y×_xÞ1µàP PP ×JZ?}§»&>\âkõŠxmýcõçðèž—çÆˆÎÃ)Ùµgz!Z|w-é:í6fFt×ãoF¼ŸÚì¤ûBò²ÆÛÇ®oBíÁõç¯íi»_Ô*†Á•X5ÃhúÎKŽ• >ºæÜ±Ó‚âR/Ú3(í×=Eß÷[þýG�¼×´jûdUبóŽãªÖK…&8óžÚ Ÿð}4Š :¿{¸bï\8ŽÙ"&¶_™¯hÆ/¾¼…°ÓŽc.îxÌ«¶½Ü8ªÙ:äyÊöãBø8`§ÚdJÎÙý‹Ï2îÞ�´¬¾ßÚøg?eúqÔk½ Ó™C¥¹KÞc îÏLô�,çHŽÛÆn�geßwÖÎI19>Pib0YC¿Ž8ù²2sEí¶iÛLö.­×Mºc}VŽe Ð‹w†úù�­Éµù¦J¤é½n.ýXç…öðMo({WØdÎÜZGJ„ÏNx6aÇ+cR“uÕ.;Ò«»vx›‡eïn“ÞÝzÁãQ*뎙û±«;AfDÆ1›LðÒXö­ºíU†®ò˜}ãLAIzeO'†`þeæÔ-™8ƒçÚÐ%$»$óдDJ LÌ�Uò,È—»õý~{оæbÏ뼌ÊJxäÑÐ×QML\±é­<ÂÝ l ãØ V:#<†ì ò�GU¦ØC0Šñm5ü²¢¶¸´ÁóÊ•´~éùÎV<ÚÉæPªA.W¸uÕÆOö;‹ÁÃø1ðÂÓ')PTPÐÐÇa@ªÇÛºµŽé(bÑ o’{Ä7W—Szý¹Ê9;§“Qï÷+§z¹¶¤Pg–²K¼#„—"©¢Ì i-К®®^Yxç5åš¾–êjVMe›ÄÜÛ¼¼…�åÖ2|Ÿ&VŽ3gzD²—ˆmÒž�¶Š(Bc4É�†&o€®tªþ&S%2 ¢„! 84¦ÉÒ£M&Ò- í×&J™]µÒŒUãunÊ$Øiâ@’3qùÛßî™cŸ)Êýæï3X§ŸzmHbOZÜ)›‹”¦»ÞïN›±[&’„Bí½¶†&Óhèd7Û8�Rç<ëÅâ›2—�EζïË–e3Â(5,h–’È`b-^†:’ úÓ×üÿ3"n½ÍïB¿ì–\ªô—Wó½èw—9XT`2õŒÊÅIy‹t L2b5D#)¶yd<‚èFó�qTdʃB !¨JUÐxÔÖ™Ç9p1ÍÞzãêh®y<ø¥µµ©lDý4F»�™ìù¢ŒdkÃÇ©’%e$¤C‚€ ÂÄ-…©`þA /é¤ Ã6öÁù·_È*+a hÌŠÓ?{숷Gã"• îC’@\x’ĬÑ#g�üþ¾Þ^^›e®SŠ·Ò›[éÞÑlb%oíüæL»úüÖz–É@wă]”Bàê:”Æ#©p­ާîm àAãt‘ÂööE°D:©„Ÿó)ªŒc"D}Õ}×û’¹%ËÄ~o—áC.=@S¯ÒYÛù D™r_Û@¯·)ìI _�K?Ÿ´øÏ¢ÿM¼å‚hsè¾`9ìæËv�²õåcèHh¿«ç³7ìÈ>&cHí÷ÇvIÊ‚¥øÂ3\ºu”#ïzúŒoVŒ[Á?A‡'PÕ©&üSÆ=2×ýHr4†®æ‰·õ™÷OšûµÖAŒe¾YÙóçç#�{9ÚsKh ŽûùÌyùœxwÁòo� ~’õ·9ôÏ�ûæïŠø×÷+˜ÞÍìKøjÞÕ´½öéô_1æZÃj2Jd⎓˜â£6·ã»¼Bî ó:Çm®ÎFóŸ¿tùÛ©SN³2ÎM¹%÷¢Œô]Œrþ3VîG_B�2:7ér4¡CäÖ Y?b@Ÿèo=~ußäýŒÊ]é¼uK2í‰û�–;r-î3óO0 i÷ä„,Áíwd–%ê‰y úÏÇ.\!÷ÆŽ�‡È¯AE·LvoÇ@ªœˆÒ�7‰k:ví¦£ÓY:ì<ù�Xç~wá¬RÛâñÂá’S¨²{M'ùþØþݘ—†R׎úô¼Ò”Dô¹ÑµÊði¼ØGƒiL´íö(ûê³h6lØûw’��ÁEÐ '“x„DB!o@/‘^áÕ°[:ýÈüV$ƒ¨ÏóvE¢~ÓÍæ,Ü"”Òk�ŽÿÕÓ-صZ@9¡Â±Ø]¤«b3rŠB!33R¾ÝtZZ… õŠÒ½oGUL�Õ ¬D©��ƒi¦¬´€€ET4§í”úŠˆªmêXÑ…EJ"MHTx¯¯ê?¿UK+ jÉAîàz9X“™›g*QñF”63S&" àµRh¡f)‚̹:ŠCûtu ‡ÞÄb¾t©\ããÊFtˆE�߉¦ÑY4ÖkC[EˆÜºŽPjŠB}]F¤È'¢=Ç u,U1@\]3yPø¦ *L!N8Ù,g�Ò=Ñ*�¬ É„j´€¢li2d“ ­`É„0¸£“C|–”Ì°Ó ìc–œtßö´¤"@wìWþb±íŒÜß!ãßÌt2.ù\6ø!kÃ%`Â¥J™„”ÌNè§K ¬æ(*±r¶”«!à„lâ…ÿ0¢šG&ÝŸj•sb+"1˜PИë4Ù™$ uLlÎØ¬`"¹ ÄiQÚ– FBÂb¤ˆ½©˜ÂRΰeb#þ’��êcµñ·:OŒÌ¨_Ê—9a]Òó¢wW·¥-fV΋�Ù² ’Œß£�–‰Œ0_!L¶Q/ ÌÁˆ.\v  C0‡JN3h¥Š‘øO®6Ëb—…^íPdåœÿ9Hšcɨ³Ød;?y’i³.³Y6ÞEÈj ]B…„\�Ô”GƒJ†V‚ã=k£Þ¥¨Š$ ! *—4Â톇ÐÏ%¦Õe`%—ljl`²”d²FDV¦IÚ™Ä1@Âߥùúg­ŠÚH$å›ÖÄ §TÆsÍ-P¡l‚‰”„#oF­Ð¾‹&“M”MmlÈRh—¨ˆ-KCÜê�$„€÷fþ~Róõ~øüâßLÝg¥ôç°¬$ÀÿË· øý/ãu2º–)õ”…Ù–çùëu6gß;ñ+\¿1—旅`³Žþ²‰ÛGÛÀ–⥷™0§odø ÍϘîÀI@s×ÊÛUxp�÷#©OÊá+OF¶º÷¶…8ÿ3µ|Mß)û߈‘ãlCl¼þgO?Ÿ÷äù}ü޵M3㦉 Jú÷ ;´kµø�=ýxØq¡Xý·µØ;'ïo å»@Ÿ £|Þ.]zð´|•ÇÞÿYÔ%$ßH.­ý£j÷»óÇ4ú»ÖÖ&¶˜wZÁz‚Úˆ.�øæùsR³ù�.T§w¾ÞŸ½‘ñ°ñ8ÍKÂvÇ£÷M]X«MãíhÖZáÍ&åˆ,–má|Œ°_l-TÕ))S×Þôci~ݪ9aú³Š¨^äý,UÌ-ðp®ìÈïÇÔùÛIдç@è‰noÌî¾Ae”^�cœÛ7¥£·Ò“¨÷ûZOBÇÓMõÓgi­¼ö6”ܹ­y(KhyÌÝUe§ÃÍß»{ã¡ðx¹Ê^þOçM×GOP¦“ć½ƒs?œâ1L“~þòÈ5ë1•Ãmüv¿¾œ6„ÄFï’ý¯Û,åÏ(¯Þûi}ƒd°¾;nɵéAõÃO Ïv~æòô¹ðlò¤ÖÑa/·¼îšp\_߈í]ûÝÀ±óeO‹ÜW"ÑÒÿc´é•ù(Ó»·“"‹Ç¥õœþÒp¶–û}4?Ú$bÔÑ®zõº3Öñâh¾‹Ì{I®ÆÑ>Ý» xôøÉ´^é·GÛGÛ�ψö£ôJ×çïQe$Ìà/jŽgêŸx®n=·×JÅè�¾Öêz¡ý!�HP†éRA#¾KAõÆ»‚mK‰CòÂîþXëW110x‡?æì�WýWãX¡ÎÇûÇÜHÌÝ·ÆÔh{ $êÆàˆ¿ÄwJ5qFÑPœD6›*P1ÝéÐÈëe½í~Ö›¬Û¼Jé>]W| é!!¦ƒ9©TVDlT`,ŒF~õÞ”üdã;'¤$‰˜Ìe"D²õ¥ÄT»ä_g�ØÖ6¢š¢%nìÓ‚Ñ °C•�8¼¡¹D�]É8³ÏûÌ øÎºjífòË"’Ñ\s¡3 ;Aè‡$1l�:w©L 1�ÐÃôO&è‹!ó"½1m«ŠvuèEjrÞléJàu�VM¾ymšŠ –žËt(%\`âU“Â�"l(H­BÙr ®AYâ@’+Z3=ÔT“´C2¢¢˜þI\QT¥éMm=ï9�`¾q$>Ôç7g>IŒiŒcIšJ†Q*$H”Y±ºCppÝ£n¾ !É#Ÿä#-¿’¸Ö=k�­—Y¹™c”èÕ˜¥t¥U@É–m8G®à¿+ê6Íè8iV™&¬>‘ûTOÃ�ÜhSÜ¢ p)Ñœp‰¹ÙAôJÙNdº‡VhÖå#ö&£kcØÂ¥•MÆýyì_÷ÒQ»òü;Ð�ÓáktN»@3$-fyÔ¡åX«9Z ]ßdUz4AÓ²7°_T¡Ë€€²@’æÂ:0à@=@A°jϾjzrA�Š™HyƒÃël �6›Oã»7ò£}-®¡Ë‘"Áa�ÃÆ11ˆàrÀm$šýÒA!ŒÙr%ŒPPÌÓe! $X¡Å 7´"ÄègS~Kp³µ~Ò& bFæô²ðT¶«à´™õC àŸßê¶ÇŸ±àcUqBOYÂÌf^û·1?:w^YëùŽF%“û™Çì³âÚ•… ÿÛ¯.ŸO8/J®…ýlòåý¯Úã¶”¦+«5ïL–÷Ø¥â’Ìš²�ß÷~_M‰Ë>ç(xúÚ0,~‘/WÒ Û›á±Ô³O†òâûHßšù¦öÓ•%—CE·Å´ƒa�Þªòmž Û˜\<²œfjp²§\ú—U—á/h5å1Gײñ”ïÌV,ãÊÃ&~'!ÚÈÿ/ïß·IUrI!ÊkÑÐnžˆÓÔÝ×ÎÓÛÂæü/2+Ú�š¶.ðîþä-úდŠû[Œë†õ8 »ïyl @Ç$EëŸ6ó§žñ~Ø?ŠUôÛ_Á�F"·€šÝí)†�ºw¢ï"‡rއ·8¿=vÖ¤ThͶÐ1™Öõ‰¢7„õ-f9¾�xðyã{~«Ã²°òÉý?\:½/GÝÒÁC1îï]ñ…¸v´+ÂU�×êVÁÛåQ “ö{ 2]VuŽýRCpë2?[ÚqgÊ[¶¬ÇÂÙ{óø„yåä°½WÎc·WÕ*É7öÎZ*öâqm(öÈ#Ú¼ü6òõG…Ú~¾Ë$^øÄËh=ü}÷ï…aŽWßÇÈ[Aò.Û¨¶aÝ«On×ßÂ/² ¥õ�¤<ûêqËtÎý¾‚AŒÓ=«qJ$O¿¦{-¤ßÈ“ÀÓÚïoe=7³;5·ù&£Ú'f|w ù/Ï Ð3­þ/ÚÞß¼ ¹×æƒlÉ\Çš“ùN¶xŒù�C�Ǽ;5¦ì‡ìÖonúû99Þ< �™lÒFE«°-—(9§b1h»¦fí¸, �l %!¥Õ †‰‚®Ð '½(\% oˆëZ5 –o\cµýs¡Ì�QÔb„FPˆ@CIK])´|ðÖu= ÓˆÁ±¾–$UUHõÀ"ObXâ«4§¶Q:]#!‚¸œ¥nºä�ŠÔ„Æ|4Q“G§¤È3ò¹!ŸÔ©«ÙªF48�„¡ˆ‚$*BM�ep6uhŽMAAùÅH Zê)À£È'ö׿jêÿ–þ¨.ªyŸÓ6Ÿ.óõ¹K¸�¹x¥*c7uX’|´† XX—oqª�‰��_éï:#Ô¨�l¸?âDÒ© ™…GFiÆÿF<0ûCƒêe¶$»Ù¤÷{~g£–êýÇߤ¸Ú•hùl®ž“Ž�“q¸Ë“]tïÍ�x=­´ Êo×{ãòylÖ^x…1ƒm¸Fk.ž]õÎû×û·S�qÀð(Ñ™ž"M®E{c¨óØì•¬'ñ›Ç¥oÃ%áhì­wëMÝ| ~Tx-—3åÃÔ«XReëÝ¿HÒpä‚f~²Ü²ë�Žm< º°óÚwù¡[Ažïß¿l)Ý03Ï §Ìk¼|émø›ëßÁv�5·`¶?nµ½#sÚùâÚü—~øÛ�Jˆ4ù´Ý¶C@ǃËt8òPßÌqÌ:M=x“t°¡o� AãuêCÚ×>>Ý+'ëÏqIkaßÀº ¹ÒúN~»à3w‚O8êô÷žÜ$½;—uýÓÖtßçδnÚüËöE¯Ä3ç·� ¾¶–¹­âu8½‡�¡¸ƒc]L¡/¾_w¯}ç¿�léôa5ÚR{Kj m?qÛ¤xÏÆÏ¸›Š¢ÚfÚO=cÃ3Fo°šu½/¯G‚t™/$Õ­a¦·5ƒUVnæìQ)…E^"` "Hí•SJRд4E†ÐÁü£*ÍPM0jào Ü(©&öE€#ñ�(’GÚÿ\À¿j`kPê%‰’�K3î“ʆNõ7Vmœ˜NňßDÇQïBö Ò˜L½2iT¡Tï`�™²S�ßõõ³À®u7_¬€PçqzÍØÜÛœ›S‘[CcVC³(ž5\“FÞá0•R a ’‰& Á%Ž‚\”@µYe!#gÕ¿×9¤[›Vÿ0£ ~¢(’9«xOÒÏb­y›cÉc  ÅL*åb ’ËU²�ºPÒ¤�©Ràks6T%�MÍ"då•¡¤¹úYq‘fWÔ}tø:Ç·H¨*ù9ë¶›oUlež¶lfjÝË�ÇóYãºõò6�RHV´(­&€`f�cÊðÓº¬ËÞ  Q[g ÉAØcm½(�‚vwÁ>E3ó´åé§,ìõȬF¢ÂbUm¥EÈ™!Zôªˆü¸rù×âžLÕ¼‰ZH"KÐ,Rñ ¢ôS�Xr„ ¹”‚™IåQËýç18»÷Úâ2A¹˜]¾$P”D¢¦JíœÙež˜"%¼ ËeaFÑo(«Mޤ �ŽlÃú¿)×»\Ø\ÚÏ!<�x*Û•¤•lzKÕ<ÅÍ1åGŒ!��¤eš¥>à˜?Ÿys!¡þ7Æàªn2*^ù¸¯Õ ˜î„ÿ†puV£c× ºmNÙdÁ½™lÙFX/oPß«Yiƒƒšœ‚êf .b)¾ŒÅàQ6$Ö)t½‹̈ø#ØB“ KÓA®µóXÄ©I¯¡ºPï�FÊS !$$SÛáy ;‚”zP©>²§±á¬ö ZH.5)i$Md¯ÀüøshÁ;†7ü!².h·JiiwšµÙšÛÚËmÍëÜïÔ Ðl„�tõ©TÓUø…Â̢à RÍ+mËO2ݽ�ˆøçäã {DzÍßï+±eü‡;C³c«E½pQïÏV÷ÑËDß¾§¤Øâ=YÌä4µ{¾“\®ÝV0ä¾Ï\ºtÓ9ÛÞáo�ýZïùÛ�X×PÈ>,ÞHM¦½�òËû®�S©­9§ú›éÞÚ=—÷qÎ÷v·�„ ¿ò|wäK—�é«}gŸW¹XÏukKrÀ͹=/UõÅÛ{±¿pç²W|‹ˆ­ê~›Ä¹h’q¥_Ë=”Û¹=ÅO8_§[:æ�}¢_³�]é'>ðád�ì+Á~ŽÛÏàÏiaµ—jÛlGŸ;ò‡ªîz…ú·™¬xÑÂTiŸÎ—n甦o�È@,)¤äì·Ù¹Y0ëâŽî"þûª–»4¿#E?‘F|ØÍ�°œ+·¯®{{Eè�zæ>Î5‹}]'ð¾ê4ÜU•e4E-(ÚŸ×iÍÂü6`|.Ì÷«ŽÛÈU�=|³³tt.:6yù4íIÛ]{ÓwkM ¹2…¶ðlýã¶Ÿ9“~|¾7ãvã>åçWŸÃñ¾¯éøÛiÏ? [~_Òü%ûœú/ŸŸ9Ÿ=ôëCêògZȽï"ñëµ5Of1ü­w¿¯.�Ù8)ä‹Z��boÀ7`œB”¥´CUU)š.ñežQ pAF–j£i1ˆtBÑ£ßÈsVÚ¢}De³§~»íh�Ìmu×}Š}qÌÝW 4Ü~kŒÂècFÀ†‚H&TQ´Áͪ¨ª)W›EšUÉ‘$Á<Ñ*ôY‡ó=:fOˆõzéwc b:|7m „ìÁæãŠ É)np›9—¸ÅΟÑHHüûAó ]ûý.Lýå<ä‰oÁc×¼Ü •ýó…>Ó }¥Ñg¾IÝ 0X¦› ¶HA�Rè[ Á%¿#¿`Ý%° @ƛՀ]1‚H$=•Qª¿²Å Ôªî4#д›Þìe �ŒH Q�F·º„‚\R`jMHBýiXð VQ4hÆ�Q@±ªiW«J«×®®orjä6÷%@•˜¶þÀ–E ³ðM‰´ ºŒPÀ�¨ !%5„‘Ò$iã£H³$‹>t>™P³i\i™ i�ˆ„wì@]dO>³®Sw[š)kvfPç,j¡EÐ(4 øþûSxw]ù9/tïÎ%ß[›âkð~4µ}:eûÉùûPÉê`ûXJ~)Ðgí?pŠÒsãÏ?tê;qÙò°{éÀ…ªä|Vÿlpš} I7Ž>8æÖùõׯv‹ã±zo�=ÖÖëy±6è»Æ¿‘Ðçå;No$´Sêvœ–›ù³U�y X·�}¶ÅsÛªÞ¸†þ¶¿§�vuoø÷ü+á;K¶'ëVZ]wvÖ'7C#·Þ#ðÓ~Ð`†ˆíÎ]<÷t<|«ï�Ôÿ7æ^F4é~ƒ¾ümú®8ô»ß¼Npu7µu´#¾œàtÈ~mþBž=7ÇAŸvò±�‘×4›ºwáëizqvÖÉ^ó·ÈzxÕ’«©ë]4ˆòû3gŽüõ™Æ÷Ê:Ÿ¼AÚj~鬦ñÐÚ»KÀ\|]÷žÒ"ó6·ÑmÇëˆÇÈØùg#m»Ï¶ãôve³ßd¦¾Ó™Qó&NìweÅÙMÉ‘ùc_¤M›˜¶öw>çÀœ!‰ìÌÄúù�öû*3`y®5ØU’í¬ÊyûéýÈS­¥—.W4í†x8vãÆY 2ûŸ9nu×�;ú¥»4"|&?W|z/yÕ!ïb”/Ù ýw~Íh!ÛW~¦e8î;vÐkjv°Ñ�5Øvèáí£k‡t<³LÈ!sÕ ñ×¢ó-5æ��ÃXQdÀ6'Œû~ŸuÕ9~Òz©b]騠C9%¤õ\„5rËÇlÑâ%¯–mNþ>ON5°~·=èmñÊäz@O¶šUËã-áúú1sߟèóDϨL“õùb=Ëo.çò)¦Ã5&(2‡ˆ =]Ûj÷’]gä@æUƒJ¬TÈ»LM¼²CE4ÀrBûËÙÅÜF°aø*6�túh³³šH‰é×W!X`à�I¡cPfE“A*C¯.µ¯ôì;GVòDz7HHŠÀ:§Û>>¹Ú¡–sªvÛÅL‚ØAË• ‚(÷,®ETÉ7jV.›8·:ÇÍÞ´uÒ‘X¤²¥+h•�akŒ]"Ú¹¹1icZB¤€‡÷Nÿkú×¾®E–Q-’ó�Àóމ´€³„•šPÑrÐ’ˆÌ¤Ú2¨Æ ,Âê°… »+Œ}Áß]om-J-m†)Yáé|9ívò©ÌÌ ‡~Âm XáâHH¢R@Œ{lòÁ†ÏЋj9¹‘A–©‰›S¯ZAÍ€Ï| 1ç‘W*Ì+kÎì¦û}ѪV±KÄeI+�iÅn]ù?gäÊéc4P4ob�<‘­$gº. n¡l{MVM’šCû׉†NH–sÔÂq/ne«¸Èš×ã¼&æ-°=£6öq¤`%P¢^õ`mŠÓÊU™FÕ[•n«T�$$…c͇4˜-ïåÛ|×��åµ¾(�’ÉCY£dÓHšjM™¤³b1MNƒ„Ã1«�{ ¢i@ÁBhd&×¶o]u§±Ê< £I(°&Öã Á&J-jïÁXöñiñv¦ySìg–?p+M_{ü|-¼Ú�ï¦'ò_ºzN«ó€*C¾št@�Ò:íÏÛT÷¤vùÂç­¡©ß[œ»õçÔõÁ¿’�K™t½Ñt$§ÿxˆhßÃÓÃïów«˜3„¹ø€¯lÓŸ.›ðšã[ß¾tÓ&¸›îô~Ž^A÷ѳòèÃγŽ~ßs_‹»™qÚ“«œþÓ;ï�‚v)ê�ZRNwÔvrŒÃ«+`pÎ|în:ß¿õ^›ßáèš]O Ý<í_¡÷�íö×{®^d#ëÎ|üÚéÓQöýØœu™+ÇÖ\¡¦ÛtÓÍ�À¼}ë|á­óŽÒï?‚Z/ëøs¯z6½ñmvÏŽqåè!>šþ¥¾þ½më³£edkÚ©äyçX»•»XÝ©óDykmÃ,ËåÜ8z`–G[ozé4Ð:§‡™‚´ßé¾âM]9\tøÞ'Ö‰…ˆQý1ž;óÛhíå�‹ëwïûêÝp70‹¥�²JóÏÖw|Ir†ì62ký…½¹v¼Cä¡ßè:sñ°_¶'sSñWúÓ9÷Ü:F�+ÛI}¥º„»û&¥»,aŸ—ÒÎ:½yvŽçjÕ|®4!šß„fñ)bž7ÞR� ?'$gf “•“yêHع%‰wh`-®mðÖAoÃïd4Âå�K¨xµ°�]Ú(½ûm´½÷6ê/¢¿N3­¼>pÞÓ=vÙ÷ܶóoU¿{óáŽ,ûÓ««îOån`óR´6X™/â`A"Þö=u©¿>Ýý¦�{·Ær÷â¬;iëÇ~¸Ó佺¥Áùåw±Ùä‚OqÞÊùDw^gnº±Ãœ:‚í»[%Ÿí‚ûB/vº×9—kõâ=·Nrp¿i®„v~„çÆFîZ†nxòsÎÇM`²Bcâ¹ ‡@�v�ƒ˜l/ÎgI/œ5×kPŸkþ“Çï™z]š�þi¶Öè´#e]MüïÏ„Óöºy ßµÙ�uÑ™ÓâAÛ´{í·[x{îNø‡Í¾cÚéл2ˆ»}í> †.Èe­Jxf¯î½Â÷øk®¿etÑÔ×ÙèWg•¼‡½[DãC×iR±§Üw!~Öì¾êm,¬sjÌöË‚vk#Él\G$ØŸ}g”LvÈq,~¤-s?“Ä h.þ‰´‚Z‹Õf-?rœè²GÄÓw³^Dt‘�Ìd½’Â@JK&nvR‚‡íÈŒnš =Ü2àÒQ(€4¨ 9ú"É’·m±ÈÔÁŸnùïŸ~ùþž›ýS.^Õ5ó·óZ×q9{iI±ÊÚÄå¶rdtäHf]Φ¡T½'íÚˆDB¯’EÄ$­|ýɹü©Ä‘Ež$?Ð~.ž‹ÉÔ¾ÖÕY$`ƒÒÍ�§ñª2U+~|qbƒ9ò›õ«ÜÅåV?Òê! 0ù¹Ÿ):ttcV¸…¨È�‹xPX^ 2ÀPÊ×ôº¤XŒøŒƒ2ñ(tSåQ6*€6$m�1àß, ï4ŸXX´±Ã¤¬Æv¤nŠ ”ÊTLb;—‚D’‰ˆX#–b(v¤—ª`ÀÐ�ºê[� (`—°À¢Õw ºHŒÖ‰cšO5,ƒÂC9ž^öYˆ@ØÌZB’‰ cHE“ê }Ü¢Ð:¤ ! <B@z$ !  HH$�$$¢@’$/ò$„€ö÷æú|ÿ}{eXòžÃ‹Ÿ½æ¸Å6]3ò?‘‹qÔI‹©5èS{ÖOg6RåFæhÎŽ˜®¤UÇkw«��SÙZtúÞ?ì­‚‹äó˜ÁC leÞîÉVAƒ2’Ln”€®�ÈUrÂíC¦wìšÊ`Ú‹>Iï:ÖRžJ1`N-D3¶n”K›*Íá]Yõƒ3pGEæj¥¹�MèìäÄ’ùÐ{Ž7ÆïˆQµÀÎ5�¸Í9N_©¢cM&Ú7¹Ÿ^W7Zm¶§J’W“F»˜£E*.»s M*À XX }ÿ/·ûE_ÚûH¿$’7?øbšIM40Bðòûá�ýi�Š@@ 5×øû¶V³¼l8�0°}îh„D&£ëÎ?8×ýú«ÈúÈÆ+�v&ëTyŒI”)Ó´m镾ó{7^^Ø¥mwRŠ*ãöºHyð¹n$Ž6ñÐ~ ïðSîš:²éÞŠ-$ä{nÎùWÏn…`šÆÕƒ0J‹Æ‹ž�6;^}ï:?¨žZz¿‰_×½xGÊÖ()Þ�¿¢CÇÖ³ð©7Ñ6«{aI>Öo$Iÿ9 u_¿ ÜÍ( ©.õ¹Ñž jµ]‚€%Áþ#F+â¦q2‘?\jeŸßs˜ãŽß�U yÀ&[X-ˆˆüôŽp퓲ߥřSÁÛ ³ 4²ÉÏ3[yžíX°º=™r°@®!ÝÜøKÃ,½õ‹°ÌbRõp‡>bf|ÈI—¡À^*îG„±#ž>’`A=ž¤»‹�&$6$Òþåó¹ÎŠô,êîçYèr±„u¾*ÌsÅÄfx[�»-*óËî·< œyÆ8v7€Q·'’  ­bYÚ‹Q3"IŸÒi‹…âfæÑàlz~y\1Ëu7ãNèáZ¬nú½ªÎžÀI+Yô[ÅV¤W“¯$YQì�29€RË’¸¯ý^¼{ÒU» ÀîQ ËÕ Tãy/2÷B—¸Ÿÿ5kÐ�ˆMËîÝmçÈâ`B¾ÅðE“<ñd'#t‰Ã}ù ÖM7^Ñj¢¸1BH)ÔSG“bîö6'ÈŵulmÜcW¥¼Ùö`a/;*þ´*˜ˆ¸¾Íp�4#2y›øÇ¥¸}NïÖ0Yä��£Ø»�¹•ÝÈXx0AÐïŽDŒŒH�x¦l¸ _êߟ®>þŸ4èìáÉBHÁqéˆè!—乪ôsëíwøäÈI, “çy‰ 5õ¸ie\O*9Óí-ì2cÅ{è6âæNd@\Rü¾ø*E˜âÜMれ¸Œ¸+¾ºq°HÀ(WS�Ô“ÈÐ+�P7øÈKÈÈ“+†ð½EÖ}nùSå îs}[V ¼½ò 'ÙQÜ.3þibÜ(a" `€Œ/TyÇÒì`Áu6å,ûR Ðwm“°øI ®�zéÜ�qñÐÁ#ü4°WV¼¼§t`ˆ`gŽX“Dv¿×¼Å$ãrÑ!Z³…á3¹�l�¢Jw\~ûˆºMG$Vüº*òõÕ®£eGÏq£uX4Ù¥#j÷WHä¦df—\”ämq&Oz¨õ:ðñuÑsÊÈën›š¢‚èúÛ\–ñŠr=l¯·Ìã¦ø¹áÎAYÅçÔ×{ÒŠpN~1¦8¢üFÚ±}ó¼;²+ðGVhÅß—8ÞŒA7Ƹ•êr&Òw³!nyó;n'êð9!V[=DÔÉÞƒ*¬ÒA™ Kïo*ˆ#®Øs9¡|,›ó9B&�5aA%’á-ÖžjõÍÑ'óa—TÙ]¿`ÆNÞ-<¼uøq`Š“§“ÉÀ.͇ ³shRg[ν3(üló)9¬£\óÆ wZ èúbµ¿l�À¶zZ{]j\¬=c®fuÔRgo ¶F.—Þ�ì:dùS‚[{lCZLûšz¶A�F/ꦒ�º�@ÅÛž¿ão².0vR/áœûîQÜóØoÓãsKŽ¢C&˜�%¨0¶ÿöÖ싯ާÐK™mÙà O´/Œ )Ób|‡ ˜¯^ j‘HW3™T$2ÀŸ*—„õ÷Á­v¢ú•Å.¼‘�ùHØÞ ÛÌ, ™s#(UNÛ ob!æìÜ…lIÖÎoÁ·íF¼{Ñnc’‹Ý£ y{á‹™GÀ�V<3:"nÅüÞùÊõJT"ׂ?+ùä.Ò8ÝùkX{ügœÝ©Ô�Üè/Ú÷3¢Ñ“ãWÿ#›] ª�Çâ\Yƒô¦û&Î¥;þ³oÄKZÒ°ÖÂV~(Ðào5µÎE_)µÎO…| §/Ml~Ųð]¿lDâÔSóaVÄ5N€�r¹ã�o��ßbž�‹Ì!—™ML¤Jδwóö nÜF�ꭉò†¸l›>=˜Ë{O‡aî3X™&É¥ô©x‘O)U®ga§mg…}WÍ‚H£ºìa–ã´ªx©½^ 3ÅjŸaÉ ñ¦ÎWœ­-C‹ÄÊ5åÏÔ¼u±—Óå.…ŠHzqÕL1¶î}®;ÌšÙ=gs9ÆñË|MfJ¤NœæJG?Zþ«Ã8©8qÖÁ{ š'áÝê¿ÂÃh³7ŽYg¥’ÛI"Qá+íz=CŸ �¨ ßòÛ8ìÉä²Àâ邱; dz„Ú`µ` …èÖíµSÕáÔ'¾Ý5Äó{O%çL-–ÎiZL$f 2äÓgHsjaQm�</�—þ„üËàÉ4ÃP/ì%5Îú|g'+ü.±2þ‹èˆŸè�H>y³ÞüZÀý¯¬9}gŽ hÁ£ÝõF±É ³ßzœ‘¾±æY‡·•¦Þ2㞆óXÅ]ÖJ¤„”š˜¶‹G»ÇKøá×ê\—8‹³…m‰oF°k&iéÜm Óm·�Œ–f$ºnX½‡I¯r¾qZ×[$YçHJm 6þð‹ ²Àps�@¬”GCØYô†¸öc6ó8Ï…TÈI�³Qy¬æzyE{¨é4@ˆw†”'Th ´à‰ÄTº¡wqªòŸQ(1Ø»aîHÕQ]v/N½ìÿI¹xg¡¸\¶ýÌøfÆrn¥Î¸Åœ¤âmö/u«9~eGúøÕs™Å…qm¾Þ¾ߙ×?W¨pÙ áó°`à“X[’ù ˜C!F¸‹…˜¼ÇÞ8dΦxÓ|LÑg×ÃP*f~ÔŸì¿ÃYF·¹©ØÅÖQDEô§Ðhˆ¼j9úŸ€ûžè8 ­RxƒÍKÀ“�ðÙDh´2pV9ï¥LìB x�uúê²+$œsT;•ž¼Î� €ÊÙ-+‚Á²dÈË»¾5‰†3æNV¦ã_¼1tš ñ�x¸$Ãi1Z€’Kz.8c »�]xý×~êéJ~¬—=¼s[lê¡ÏÃÉU8Öí¼ =�Ä‹“Nlõ1¢Ãí4WÎ~]¦�bõ-­³°“¤*RºFõº*™PEÁ¶ÜMÁ°N™÷ � £ËºÃÉKN0¬ªÙ§6ÄC{ŽUô‡RY£Ç2?Ö9žãXèP>°.ɯ#gô±F}”<cÝuµ{ˆ’ž¿q›˜ÙÜKƒ¸v „=_±ŸÙJôêùï�Óä‚ð³R_6Ñbò­àªôøÒ\.óÌ€ºÇ1�¹¼6‹¤›;Bd¯å|rXÌoHÁÇON¾ûõÑÊåà�N]°2Úñ¿®ulµögÔMpÁ•™B1zæA�…EÖ“ØÜÇÂn�xŒL¬¡·‚¶ÒÌúÎ+úȈUßúµ÷¨Êý¾]×á…Ú´˜â¾D«—Ûi£¶ÿ ë;-./|.ÚìÃ^Æ¬Ž»;XˆÌ÷òÅœOi]üõ|Ç—Q*]ó7&VÚÿÁy˜ÒsN ¾ó˦ ï~RöÚ²�j�ìq1r±ü3þ HH=ÿÑ?y÷þAƒÆ•IÄ ýæzï'ü£�sçË5§A@xwôÿÝP½úÓÆ`At:œ­/pf†®ÍD5 Psêïþ9³Á:=��Ùæ’€yk—ýE©èA<â9¨7—üü@-‹°U5PÅS7�"éæì—$|˜ÓÚ{•ñò¹µÊ6™ÜìIp0�4ä^G©õ�Rͳ%Ú—Åv±{§@ÂþGudr#(mÀ³³ ?«HΕ©FØØ0Mâ…(Q3W‹››œå‡,å)\pR¹\¹›W¶êÜåkël�i¹´ÄÑE‹³9Ì¥&�Kææ¾ûjÛ[Uö}žÃÒ ßSóäÈçôÊ©}œ.ÄnØÐ†6¥ÒÀHùòŽ;è:pm•ù§!!u‚qø,IccV\ë�ûùÆYÓW¿Öó°Ë#ßýÝð†Dº[ч4Þ‰%±`„80°Jd[áßgë—ÃA .CÀ$5²Šü=bä”îÿ4¿æ�|gÛß¿o—œÞžŽ*ø÷@»‘ÿŠáKùàºÄP¸à.áªÉP>Óv¾½ŸCå[ó°Ï�ªùÐ?¼×|ÉÆ¿0•ÇÒ>ã[&—ržµÂéUAJš-Š�_Ež,å+†�Sô7(2yr H‚ÊÄxOv P…3pÝHï�i�1œéhM®q1­b‚IÖË×,®·�QJÓâš<è¡ èU–…D £Z,^L%¤þõ�}´ä�_±åã�¾(þ»p¾í©´w4æ®HLˆ¤óGé×tñÓeÛЫ~ߟ%ð“=eepX_{nƒzÔ¶ÂvèíŽZR÷+á ®E•|o o|‹!átöW `Œ­¨?)ùn—²~Ës7!”ÖÑ=KóB Ò˜ÛÐÞ¢ˆŸ�;€Ì;o3¥½rKz|b\e0íÞk°øºê† Ò0D·!«›Q&§bñEìIåÄó>þ·¸„ì ,z¤ ªUŽs=‰ôëä‡Ý‡&†xÌMw÷8ÅM¿|¹øçy³›b­ãHŒ—2@¿¸‘‹ªú¥úCȧpX€�ª�aš>ç�lÚŠÐ^P»éE‚ÍÈÊfwÅåuÅ·Õ®ÒM÷£ó}�ð;ZÄXMe’õﺄójø ¬ƒÄLtÏŽE‹+3¦›ˆíCà£~¬np„�BßZCù´ú¿¥¹Œó�ÞþD.Íà°<¿¡LÏX°#2�ÐÅäÇÐ:¬),ÁŽÝi曕AÓ�hÛ4q(s£·¡EWÝõ’N…h‰¯<~ÏÅÁÖûv×)dM¹1rë—N'%s®OšÙTvŒ� ŸiÑ¿+Á³\²¶fåíêŒóóQ}ï÷ä"Ä6lF& ÷ì­¿p~Æùlù9 ‚Í_X`uÚáÈo¢H“a/scŒ½}(È£7¹ßm%šÔòëÅšÎ*×áǧxæ„Ø±ƒ’6`wçÅ“¶¬T8´ÒG‘ö‚!¹^Ú»×I²U…¹è÷°A¡NÖ�ÓW>·b¬$ݬs�šY°/�Ï6Åž¦•Q™á¢ *¾Ýõfm”äD0|Í=‡°×ýx÷<ž2r¥;¿ßei†:p~1¾YÓ:÷}O¶s­y¢£ÄO¬úÇŠ�Z‡m+Ë=”€nÍî´ó¾t}�2tŠ2ïv � �[ê-à0ŒŒòä1z87³ãö^û)¾Hø…º�ƒt×`àd­Ÿ òt|î”צZ8ÏPnÇtHL¬�ÙG‰·ͩË)d^Sy ]ó‰h.2ÃLÇOm�ÛG*ë¯d CÕLag‚ÄI—�‰—ÞªÏ]¯¼Ë:²z—¾ˆž äXÀêÂjþ»jÔutÔ_¾–£—ãRh´w�“}óìpw³Ñ�Á�ÔøIΞgáàj|{�ýþ¿Zšæ¢Þ¶qÞ¯ëXwûS™Ö¿µ D!‚ô¿:¢@�¤zê˜ ±Üo�§µSh�g" ]¥ƒQë(Ž£T®!IÚ0”%<&–Û­`¨ÛUè–\N’Æ–F†?ÕµÉ�cPì�‚/´"T—ù±U¶k3®�X´�˜ËŒ>ëEé¦ôš~¾t[où~‚Žk{Ë)>_Vÿ#‰ÄóÆáWÙr€¤ÓðŠ�BçSÌí7ΦQ™I3(‹çFÃ~d€K8 ÖŠãÛ#þªŸ½ûÌóV >K †åŒ8ñ=óu:JÇe«K?Bj¦a95¯_ÿšþ].x1õ˜ˆg1ÑÑ6ì¦A�oŸ¿çíl¶ÏŸÔ½Q üÔ{)1çsŒãØ?'_)ñÿ— Ä*AùœÈ ™ 'žRçíà¼QaB™”FL ã:-¶]¡^ ¡Søe`pÿIg[ÝN‡?×ÜýßFH&5Í·Û�ô[~qk§ˆ1y¤‘ÚK¾1(ÓÛ³¥5ÂMCm³!�dˆ/= ›é³áV‹™‚¦ô¼Êlîû€zÎ{¹mýfÆ¥k¤¥çcøcL-@€„/Âæ1Ëc� j/JÞ•µ�&4âÁ¾„#ñp(Îò¾ò}!€pÊ£}L€`LJÃi©;—…ºßì»™ùР±SÁ¹‹mnÂ]Sè´%îì5‚ÂsÁF¯— &Ó4*×2w¾ÚT½9Ï-ˆé•e6 =^\PrtÖ†ù OŒœmù˜ûãq²ñíÚü/]ûχ¾vÒÄ$¨¿`ÄÝSÕú1Œ×«Åo¬Öµ°D@€æ¡å Ö¢Àúz"Ýø´(%‹V|È;38צ’`ð|!o KÎôlf›¼Ûõû'õªc Í�H(Ì9ÞW9l jê{¹$–Áhàcëáž_zk³ÆžXSm#w$܇¹Q¿O1\×¾Ù|éøDÖ±@ü5ݨO)Ù 1”y6Ö{ÈȲSE½ìA J븜›L‰ìé9‘Ç pÑêó•Ä‘S|%rÙ’“ÔÒT-Z3µ™IË"¯†©þÞceÏÛeŸ­C?|ŸrÎmhòA·ŠªÇ¨dW†>è‰zb3�²(}Wïeà~cnôYJÇÇ–j™^Êd%ýôÍäÈõ©~ðû¸ÝøÒ¨73]}±ü>„ö n8*ê�ò{ënËBrw{Ôש¾ 2b¸_ùJPÀ�Ûü4ÈÿÉŽ ÅêèÏ)ž˜>¤ÇÓ€óñaÿO˜¤÷©Þç_#]Læ~~£J�Ï=�?7ôä‚&—÷Å`ú÷Ó§µý玫{<6Òg “„™ý.§>$öAoZ,Ò¸’ˆp0¥Y•þ±žl–¿i“þ¾Ûóé×±w xÂÅzWi„E¤_¸*S©¿¶/6‚]^¿�œGñ3è(ûÛÚO©ÄÞ=Ì} “ï_¦¤ehÉè�šå9�"‡Ú4Õç°âð�™š‚ϪXähSR°-žJÌX+H emÜù@4ÛDvhÕ꯵}ÇÝ~žƒçx¦cr$ ”¸´dúÜ&«j/ÅÚm§ÏÚ«à1pŒ¦€1”¥ÁCn@´ß´teªE•:c ¼VˆEãBÙ.lö_œõ~}Eq1,ç~ê)ÖI'ì2IkϦ�Øéq^ž‘üf5¿ù07ø Ú—Îᙾô=-„àQ®U­÷{þjéhpÆ$ò ×{åã¢f]‚8‚gÎò8®ïÛ\i1’©øÓítjPÊíuæÎbív�UÚožA‹p†tvzøÚÂï]”÷Q"ÀY¿ìôu‹D2›]P�QÙ˜ù2Dœý!Ï{hÁíóÑÙõÞjð|h-m’�ª};Ïy÷¹Ä6±7íì•ðчéξ„OKÒ¾;p—�g<ÉrG6} ³‡!€ËÙÂ+ð_w•8¹FÐJ H»,sЂ®lÅËØËQ˜VÆrçA29t,’ãy‘‚IçÑqN|e ϸ9¹Lt—þóûŸCÝ=Á¹¾0?ºpžŠŒcÆŸßÁ˜; ˆB.4–7¥ùš­´l.k;ËÙ°±Qù ddUðZÃ>ç®ÿOÃÂżó/ǼKcç µ?ecÑØ/ñ5’í 7a½PÅÞŽ×é²VþVbÕ\xLåÈñ¬4_JÒ�±ïº­’¾G“¾MŸÎCœ¦ÇcÜ^ÿÖ÷…™Õ<"ˆPw•¿¨ñ÷žšµX߃_2,âþ°BzI..L+ Ñø!2%c^†ó± V•[yò舓"¹[�øÄ<óýs€ž†ñ�Öϳ2ÏDƒà±§‰†åG ݇g?µ�èÐEÅo‰né‚Dgµó2@ÔV>-–[_\ 㬽,eû!³@8Ã?ĸÿJ® öA¿èXêEwæ€ý¯y#�î1Ì&Õl¶#hBx„q‡e¼¢{ª†`[tÍŸ!íêSãÀ‰iÄ_5�|lR¸îE)y}W�‹\=ŠQ«^ØaèaÁ³±a� ŠKˆ Æ\æZ²DÜ8[ùÀô\4Õ赦ÄlÏ`k¾ú¶’"Ò¯…`� LWfN�¼ð­†M*±@û!uÌ÷Á§é4c©öP‚1iiX(õ2ûKˆÐ–w•òJÂ-5&ëy&µGñ ÝnF³?›+°ð¼eÎñËåêyG`ûú¶_î{â�¼ ©`É£(“Eíûæ–gCùÒW¦ÏߦAxo*­ñ½ÞèL UÙ�„­zÇc9Δ Ú`jˆÅ¬<üwNù‘¶LwZ-þ×Í`ñïˆWS±¸>ìA)?5è8n^ã–ù¾~^LÀ|¬ˆÊU‰¡á0±ò@42"4äTô‡i àrT4·„ÙýU–+ÖXû0•«ónżñηe&Ä¡œN®‘Š•™–jÑ´�ðtœÂÉž •Ðã¨Ë hÝWcer+Èùoã¤ÌßrþIt¥xÎl|s½*�²›I®r“'CËV$fÔzH•…�‘%ºi8çšÉ�DsOu1NA;‰àú«7 “ªÓÖÚÆ-²@’Åϯ^1Ê“Íê8ÐTŸ íçêQÒè=][í£à‘«(,†T+cGÁü×Mp"M�)ŒŸÇEÎf‡W©Ïð¾ØÆ×¼�àf ÿÂ�â,ø®y“ׯã�¤,E Ú¦åñë´ÃaN£&‰€r™¼wÚb¿OŠ>ØI%œl¶FÎ UbõÜ[ u+Q ”oZŸÁ«fn 9ÅÜ ,f"Ú»µNÈΉϮ)oÙ+&IöH]º1 ZÇ7# …ìíx ’ Ú> (!¤CDÑŽÐM—Ýâ !�ž_ûYrøÚ²û'›ûéÞúMÙµ¼Õ­‘Ж­cÔñÆ7Ò�ö*Úª=Í•ì’Üaje¹ ãDNp†CkøC£‹Ï|ÜîÃä3]K ü[3«š(7ó˜Ô×ÅÑì›d_m”‡î¼p§’[ï“¥Æö-`y²êɼ)¤�ü¿Þ~Õ®‡¬êÅŠ¿Í­Åq5ö£,Á$¥Ìîöo³¶ŸÓ}®H�y�·Pßžm¥��kÄVL÷ò×ÚØ/«E—Iloš_ñ^øêB†€ŒjÜT>3k¢÷Ùà±Z€eX˜Ì&µö7 G±…ŽÏ¬°íÁûd#•:°g×éýøý Z‘ø®ÿmBwŸ¼/nº†“Xfò·i y+R#ËÂÐ÷…)‡r»y­0fU\I”'º-]s_Ð$ °æYfÿ>òå’ï§aßiš�S{ç8ÄÊyãÔ ¼rt�—ñ–èåÃ’Žm.wuf‹z,1—“oœw³=µˆ;‡ïÆ0:9ñ0S#aþmkG·KâìOTwãjÍ]²èK9F¹É > æÙ lþ¬¼ÀzBç[ž›méL?¿Fô¿#/ÉàÑo¯Xä¸Üìd^ì<.�½­±põ&ãÿ½�â7ƒõ;ޏ}ƒ1ý‚Öì:=Æ kÝ'|‰ð™²=J‰ó5ç•;hô(Umyp’÷à  yÀ{¬ú¿”þ›ïÀàl6jõœåô×d"vYce™4FúPÎŽq 9ß:Ÿ+Ü6Ae±(ˆ -RMk1¢‘Yr·D",¬å“ «Z�䳺�¿ÆáB�$4Ö�1Ù¿Ì ÜFÐúÛéu¬p|™3 ¢ì5Û…¦×Ö—¼Zš$Ì\0ˈar$\÷ÀÙÇ j×2²É\AÉ×ͺëbîS®`cîq½@qhQ³(+o™×* Þ´EYp I šKYŠÎHCÀà5¤'��ñÇù‚ˆX¶èåé sg°õ/ŒjÕöS§?…ÿ Àk1‹çyöd§³?ß~H¯ï§—^±!Þ_P…‚]œ5mnÛÁg uE¹9ñØ© œM®óžy�ƒ·Àxæ-DS¶Ûÿ$‡ó EéøÀ3òq^N;å:ç@³œg£×¨åÛŽ‡›/Þ9h¯øÛy�2['¥¿HG Ž‚Dõ´~Ȫ] ¨ŒöL?£�sÀm†µ­Â~' ÊÃ'áã(!¿5ˆÅÈD²Š)ØuûŽ– ñsùΊrVk½#»ñWšÝ¥B¤Ó̶i�1‚þHx’žI8yÔRœH!$9ÿh�n0.D½7TÖ Ä¸Øøp–@FAÐùpÈc%JÖüöN+&Êß‹xüÊ­Ô±×í¨M4çNÄb7?ËoÝΔIX\`êŒaý ÙômmRb6~•˜‡‡> Ù¹¦)ÞÑ›XŠÏ› œãá\ LŒ‚—‚íÛØP񯁵€Ô~®n’Ë”÷ñ°òNõìÉ^Ÿ¥ûð?%½�¦_cr•ä…F[±ê“ùÜ?ïlýÈÁ÷?dN eçà6nРÅïÙ‹í§Æ¼·ø‘WŸ’ÅKcÏ`¼{ë!ê†ÑïŒåKpV@~øbà¸ØAÃÔ§ �ʦS‹Ò?Io%yb$½E8½á„Ñi�Њ]ˆ�95ÕYdµ2ÎaðË,LÉ`Êq~¾Ñƒˆ¡ƒ¢À‹”eusµ�¬Ð1�¨|>OÊvnë}f£Gv÷¾é Ú„â0“†ÖÜQðièßZ×&1¢k®Én÷… Ü.y„œá -V<îçLéé¢Ó–•šâ] é*Ó&}»ÑóXºæ¹ÆhÊ<š2C8umÀÜR+R†me1y¤#8¥Iv6%ØÊ1ÈÅ �|œÖF/Áà(–}½¨î€üZù²MŸ`âO¯‚“�õ²ÿþe;k—±ÌG4%ï}Èf¯¹s5Gé÷2¦§/šŸO�b‹¢Ps“6ôøšsòú<áÇ”¡Ð¬µ3JK¢³‘õŸÌ_<ªŠR€¾93‰ÿ�ãªmñ?Æ0½-^?ŒY&fé»4ÉÄ&LÓ’i>wjSñÀ‰S¥„„åþƒáþºžAÌÉ© ,KflQ²ÒF-ÛhÐô¯BЋð D¡.ÜDa­¸]Q$šIJ›u`‚ÜdÁ=wíWú+ŒâO†�ef�&ѯŽèÑLÂëü“Ɉεç9�emLòSÆž/FrVfn)·yÚ¸Ó0ÿ!i’dz¼-"ö6Ý€‰«×Û³ÓóÉqÃ3^l<Ç 0 ×lŽ<1=Ö§YÝ•{¶�4ÆÕ.}dS»çkrT<îX,JM9u¨ÝàWnúÑäURn&‹¯�Ç*4E6¤VÄ0зe=�9DDâ+�c’ <>(o®Œ”“±pL•�ë*±ÀðõúÿhTÁ‹ÛA¢öÅ"Šªì!ë¼�ÊÄŒÝ9è äEˆ();ØFƒN8•E¥y¼Ç4žá°ÇΚè,�VΔfRè¢ÄY›‹©Ö†´ƒUãÆ¹¿bùò–U›y¤è⺠»Zuj-c*ÕÙLç‰XÎ4T/—‹é¼˜�Y&š×Ò~1°¢…ig|òSÀ�Ï—0³MªÅï„Ô¬æþ=ÍÎÓ¼Xœ…÷Ÿ¡Þä« ¦"xÐèm˜ß#�ó’å‹ñÂ;dhøË×£Öáhz”$ø� ú¿eÑYß“~‚þÿGæ<óK¡ú-ë ù°Îk:kÕ?½?f·{V’Õ ü�áöüƒ#D!ëýwÿú�­ ôf¿¼uå÷ ŸÈ£¿°á… ð|íUÀhÅ™N�±‚Cà^?êÈëé H¿L<`–ž»ÕCßÍ Ùþ&|åãÉXþY˜þÜz¤Kè}ù‰—a¹Œ Q§—ݵ˜YOûEË9|¯oV@«Å ¤Iô^ëk“hïOˆÈŸü‚ÚYúÇZ._›€üt *KNWx¼n 8:Öès�Ì“Íh^%ä";øÔÉ|óÉ\;óÂÃLJÖ3nK�ÿõ5¡ÜŠ ‹®?÷"”mÄðœ#Ë�aÂ�ýž5#ï€ð+h‹{ýð¸×ëȦr«Gý,Ö°½ œÚ÷°Î²¸¸ô²Ûf¬E©¿çÁ÷Ó|Ç~—ÿQª[$Òü@þò}Ò"õ!ó»$×£š»ä†ðØË{±3¤Ÿ¦É”mb“¨‘œÁ WË7„îžRð­¢ì€t¹‚-‘Õÿ–.ÃØ°¾ƒyÅÏ}Fö.mj­ðƒ§M¢º‹`hÒÙÆ-Ò<ÙäyÅù¸CÀSp2L¡JêêŠÕ¡d'8}|Ï~ÞDÓ÷umq›×‡GU.V�ñ’úªö²²^ú»#o‹ëûh'R|a�ìNôR~Þ LŠéËö±Ý KAÕöþóîwæ!£¹±éîoB8÷p¾¸Ú ½^¡·U§lçI4ã4È[vc)šÙ2R ×10Ä0$dPƷȦî†×ÓRXÔ†Âa*Á+"ni"¤Q�B´œ8Y•mò c IWÎ œun«‘uÄ–"ü8Ø ùï»)?Š]óÍL§.¼À’Õ ÿüHnà®ú@s�hsÆŒaJq‚iÚ=Z»|ߺ>�õc]0z|’À~ÛoF}æ5|¢ ÛÆ.&ýÒOø.ûjÂúÞëÉ­q÷.„¦Áô?„Èc-ûÈÚºv³¡ÓÇÒZ1/­u4z:¬”Æ3þÆj”c,Ô¾º*ºÁÕòSóI ­7’qq‹Ê'cŽ}-1¹¿FÃó]ȵpùliÄk@ö¬¸Âý‰<)BÈ ?oXÌ�g§‘ó7�{μ ¼û÷Á½_¶~– ôÉ�’tøf" AÑv™lUöà_gÀúS_4ÃûYV)¶ú¿›¼8(ö;ÇÀc4ËÅ7Yïq« !‡¥p-r"÷«Wbص„Œâ¥ˆƒ/&àäëË�õ±ÛŸû°\….gšõI‰7¼ãoììÓFÏ܉bDòM@ ey°,j  2ª�U�͉øF»«eE¡€½D�¡ ¡Ö+—G-NÉ“xÎX†k €âúsgIþü�ÎÇ(ðø$Äd—Çk»ã�Æ?çðŒΑN0/_•€È:ALc¡áî2vO\KPDª„_ n¤öÆ,|û«‘¡a÷°>ˆ¡`¦�Ž(ƒ;ú÷§YœkA å :>ˆëöX2�­..g¦Þ=P¬¦»öm9ŒŸL¶ƒ �QŒù'½P&‰…TsŠ�rFþßFx.C1ÔÿÍ„ï`³ÿº  žJLdTtma3~!jÖ˜�åƒÊ€\6â¦&BZ®MwDóÂ*ÐàÜÕÙ HÎ5iáNU_Œý�z|.[cì矖§aÔÊL›òe/c¹ñp?6†-¼ Û@:•¼Ú±¬µfÚ`ø´%ÛÚÿŸçÉ=“t÷¾ÐéP$YŠÝGe÷ìXcÛµ¼šÎßw‚üÞk÷2Y².$3ŸéØ2Àç·:GÓC_þ�A±'‹6�M›Ìa¼(¾æíqöHdæâ>ÙÜɇºZTàŽpî¤ H›?!° §>3+‹•‘4v½;3W¥ã÷X$í0JË·O§½3š êõlÒ¿Sû˜¹k$[XNr_~;\pkXzš·@Öú|š¼ ý?2h^Hi¯Õ‚ü= ÝGQvš×vR\UÏà¿èµé[ŠåŽ®žùoY.‡ÔÂ’e]ZZd(lìí­Š’ƒ²G› AŠKã5úf3×{Å/KÊó\Ðd"rë•<›'"‡�ÔÜ'ᛤéV™/7RrZ¯ež&�Õ.ÿ‡ŸÃßnFñœþsÌu„X}̳X‹«äô[7F‘Œ­²M;¼~-/J©45¬óxŸÈ9àiTàñ»“/ÞûË!Î�Z�ä�8b¸NgØò1º$ÍÓÕÑ&{~2¼äFyê„Ë O1«~o§ÚSñÖ€"^ØQZ¿tÿdÓw2^c}peÆâʽ¬� úÖ*ùÞ £ð^¹aظ"Q²f2oEl„ÒÚƒ«}*„ªzö\$ê–Ã4Ë”_ Púƒ—­]³Æåã·Ç%›Ž–½ß&öŽ)ù›…¦èºmâppÊz^pëDÿ«ëèx¶= ^øô™ WÆaØõåàl³•:ëqtˆ††ŽK lù­jMÃÊÏ•8,(¹2¨C;‰Þs½®�Æ‘íúÃùŽÛÑxp]J°�rÔ±ƒÂF9+]~æT1�A–Øß‚c™`øb ú«".ùjƒ[ä‰MD‡<åŽ/ñ5×$ö¶ïR˜½½¾`h.¯¦“j'ÊfˆZÆ@�<Ù´rLì%ô´ƒ+Üw§ÉÙo"ãèî¨GA QƒÉåÒºðžYm1tè±#ÖT(\,5!á¡4ãU/n'ê^}ïC•ËÒÒPBâ så>4bJˆ®ûJ©XEóuÖ\PAe¿˜å”$}ðž6á#_G€Ó8dú®Úãâ²N; ƪ»göFFr �Þ1œ?›EÑäK®=˜ðù\-ç�â9È$¤[«y©Í섘Å×dncŠ\Ï< gÉëFk:Ê|Dlgð›ù¾‡¯?Õö3wÅzØÂý6‚BF¼ó²"È@Q +_(èÞ2|7󽄈m&ñæN†ÿs¼_>ÚÍ"qM‹Ke#z®[V÷ÐìÆ“ Öµ­_ˆƒº‹1c§¯Ë¥ä£W…d‰ýóÖ)7tVL:¢]°ˆuÿs*ÿ°Õø¨™XqyùTä£ïàÙl›j“ɬt, ò l ÿO™-aà+[çîMô2A¡m\öi¥à²7±‹²�ng%ÇÌQ}';¦ ¦ªÔ) ’ľTZ/4ÿƒ¡0«KË¥ 4›5ÿŸŸò~ÙÖ?ß4 ¥‹~qìí¡©ç6Ä~ý~åî*.GóÌ,˜�ÓïR»>«÷ Gœ5ÿ'ù½ `Ó½†îHûö}Úc_%ì3}üR‰¦†“MŠÞ;ç�·^þU¥ã ÈI!„Èò~ßnîü%£®ÿ,Â,«üa«”5¿î�­þýºáQcâÿÓo{¡´›Þ Сím“½›š×‡Q£eΰJïá+ÉeÔŽ ¥âeýƒZ8Ýßr…æF¼kÿjföu!½(E¼f<~§¡÷„~èc$ ü.‚AaÒÉ€Ö‚0ÈnŠŒSN]4$»åH™îz4j…ê©Fáu°%&‘ 6Ùº· ¦ÁÕ›žOÛQ£·Ú›>â£ü?öxà¬t³8¤Ìð0,¼8w¤)Ì_ÂÆ¹J4^H  »a‚‚°.)ÎÅ'Œ*¢ ÜÌÐÎâá?ðÔ³ ´mÏQ÷ÄÒN¹ gC®ÍÙ›™/½gŸ2fФ0>ºîíúJu„;jÜ0“.# .wŠYv ÉæGˆ‚NUæ?o݇¦ø?+l™Ÿ»Èó¤5|�¼1ëM÷X‹(ëLÂ\Hâ««bÔ ¬˜ÁR'VÓŠ"±9íl>'¤O!'è—ûï;#xe¿ú‹®ÎJ#hµÒÞ“_)dâ΋7Âzñ¯G�¢ƒðCè2ç-^·¥ë­#`׆ôºnHÃÀg'SðÄR¢óŒLº9ÓFÚRÞÏÛ¸Þ°$^äÛù�ð�Áº’ ÊÞUÆ+Æû<�J÷~w¸‹Äqœm×2jÌþ·Öë6z'Ø»˜Ý¼ÌWÇ÷'ëwò»Eÿ7—S�ÍܹQÞá]ßóƒ[-Ï;$Õ#°½\ bŠþ;o·[æ­ø„è»æ üeßQ³>°çs‰†Ÿdy¬‹•r±Î~U]l¦Î8H‡•]tÇ;w[X _ŽüŒÚîkž¥·*hø‚†“ÅRÙwÞö­·!ÖÆC7Fºä”‰\.Ì?—<02Èç ülsŒäË%EE²ØwÍÌǵœÒÛB E¹)}ãÖm²¸Sµ l™d†f¨“Gå:{G²Oi²0ƒÌiTƵ`’¦øŸ)Ú³BŒ;§X`˜ F×-Q‘T¡½"H'± s)mv•²§þ>2¿¼uÖx� �Jz_�ìb#}î|(OMù‰ÚæÐÍ6@^¸iÏ‘—»}�™*<ÚH 2ˆE±ã÷ 'íx» ÖÈLŠÈÉv½Òª+ðtí°î�¸ÍO1*V‚¶ø,Ú/×;Cs‹Q§‘ÇÇ–~†îü­º±C³‘’4Ê)‚;H1¬:l|2qÄhÙošKG#¡e.ü¹{*™ó¶é!Ä�wes½ž‰ºÒ—¸¸B#1†Áƒ³uªAŦ-L¤ä«Ë»…mgòŸ[V…ĺ<™îiÝjf ‡AÛN4Wãybô8‡¾s™¾ ‹�<3å˜ò‚óthô^.ËèM�ˆ¾´ÒWašVløZÛ3”ÐIÖ<©Æ^qpåuÄ£a%³;QR}ÄMc��åÑàåLe8–R ‹äia±"`öƒ")^ý<,¡›ugNŸ]-Ïb(éÕ2gvð1é‚Cü¼QM‚4‰Ì¦GÁ®Ä[íýò¿È¾1‹ÔŸ› Üâ5λîJÚÂLê¯�f<=”cv³”" ¢ù¤a}óB�´VƼ7¹ÔÜ Úèj³ƒVøkDÔšUhOù2•ÕUãnF›‹g[ªñâd†JîaL¨B°nµ×W9+!TžÐƆNKp»ÿ ¡XÏÞê \'�`�,èÁ„ÒÆ‡maÎÆµr!•Ú®oVýŸÏbðAT0•¾Þ½jÙo†CÉj’»ˆûÖÖ.ºÏ€Š³�×w`«–ŸW™ÅiN¼L2\r†¬×UCô½bÞœ°¸"B„:ˆ$ÙyB’½ +Ô©š«JØò!¿²(ÙFÈÇ/‹øÝÚ%æ7ý¤Ãl¹#á°}ÖüAœãÇæÎëe‚ Žðød–Á²è¬"úÏè{H#½ÖP r[×ï2{R¤Â™¡ò‡ü"3(—ƒ¡»ãðOcÍë8àœ}æ÷ÜkU^[7Þˆy\ûàÛc§­ÓŠNo²£ÃÜXEb/òŒã;S·²¿L‰oƒ¿ÉË*ms=¡–žÇÛêÚû{æŽxÒ-ÿæÅ`Zʲ;Íþ�þ�³�6bæ6†^åüWüë«0o¥xh€¨!\¨¬±ùí"s_6Þ�Š—Öx@_T™Ý—i†Î×/Ö9/·…/ ‹goíƒ'#õ<ÊKù2|Ê¡�kÑÁ×\ Ѫ˜*ÔÎÞ+ìò¹Æ“,ƒ |»_yМó³�·-l¼f¹·ù–Ùqê{¾4È%íÝK"äˆ|_ìvlË(�?ÒM²Ãì|üæ¢F�#×5޶äDsçŽ4:�“Aî[±V1uöÁÿg Y1Ýμ­ncÄûßäK!PØëùÈ·›òOG È‘¾ûWøÆË”®8É$ùƒ7 2Aú Úb¯ ‘¶E²Ò¸BtowÖBZ=ÅØÏ`@È)Cý=â,iØ0jA[uøÏý?obcH8U¡À�Ðyÿ)×ëë‡Ê´Êй ú AÓ�Ñêâ%– ïä|ò¹‘³þ–Ô#séèL/t?m Ñš™9ýÜ©2C‹RS\½|³÷§ÿ·¯ñŽ£4KÈhõš *’á�»ƒƒT >k·7t »Õ+y\ 2À³R®¾¡–¨Z@¡l�µËöTª¸Ä"åÌ©*U£”§æ2ršJKzuǬÓËÚ&á¬Ùa§©¥¬�t8y±ˆGûyVµ28IÍo׉H�ÎR¾ Ç*ª÷ÎYxOªÁ™U|i¤g3PRé™…Dr‡Çûf’k…'¾uØD1I40 ÉÏw™,�0 ñŸû*I“cÁÛ´¬òy„\9š‹Æ­•ÐÃoÿO©î&å 1I�Þò×h|ö‚;µ’Is§Y�ùðYÈ®^>5ù‹“=g”¬noL7†^#=wl}á":óžgºJw—,Ú�êêÈ'>�òOúÝᕘ_y™Ëõ çiKØéú§À7·¢ÈÞ c™j<É4èÙMU™ÊÊ1Þþâ(êË›Á½ó'�z‰�§�kªåD­´½îv£np—çiŸóeDS4cn7Î:~«™tÍoªõfŸOˆìígœÁŸ³+yA�¦É!ü­ik÷^f¢„± ÜgÅÚ’ûFÀîÅ´ö²�—¤Mñ'~ʉ‚C>ï%¦e×q~9ó19ÍBÖfí?VAaªçt�X>.ÝÖ±vËe•JÌzï:+¼c“æƒQ‰<ë:&)<茷Äà‡8¦• ¼�nw•êÝÕöÓË·Dš>³�"š>g…<Ë®npC$ˆÌ¯Y–ª¾Cºf£¥˜¾8Úž6t�¶ëÀ`Ó±]\èõw·oD&ÉaÝ £pùΜ;Âóõœ«Î¢~,d¸šг¹C@@y5@ý†›Ö™ºÇ¯{<÷EøM²0-†ß¦2’Sü¸ÌükñAä³èÿ-P‰ŸëÿݳX8D €/‡ã7X\! ùX^~!®˜?~ 9Ò²� ×™ª?8·Ôž¿¿Ÿ}ÍÁléäö¶$øµny6 ÉÂdDŸc¸‹Çø (ß!6&À=e›eeZ«–Aƒ8V4‹¤s w y>mï˜ûÓ\—‹ºÿÂî÷7?o`0ø‡Çp£/­ŠŸ?áZPPðF]òÉýæíá»ú\N�±ð âŽšw¨zÔ´Uhg1?a ¢Ã;šÕ6G’£|C‹8…r´XÊÆb’ãþö �Pô9üYKŒoË<·áòEÎn1ý`yNä_ÛFB�Þ#ðš¡üÊŸßÊ„¤}ΫLpÞ Ò_åöB_ÖLœˆÃh |æ_…çÚžúW|X�‹)»ç¹ÊÕ€©{2ZÅ®•µbòÐN@ÊÄš•�èã!¼�\븆»á˜+'¾¶nqŸP ä…>—ÚJ?vÖÆVkÍHßG•ýTÇ@¥{»}OVñç:È?;Ê�Ô`ý«½y>tÇDç~¦Êo#LŒˆÇdîEA°¢|N|Ÿ5ç¾ã’xÝ`œ­ÁeÀxSEØú8®‚ïçcR¶Ú®r�`Äëa„tzMøŠ1')/dƒµ­Òü²}Í� Bø³‡ù|muvhåK?6C“¹²w5Wsœtöiã£j…Ö}Ç™Ä;s˜iYsLÝ|dƒPÁ·ê¬niC q×{�%+�Ì|{¡&Þ÷Å•ç­�E{¦cþEéå ÇÁOD4Ù´-*�â®vj÷ „F(kIæÁ]”žøÄƒßw�ïc ÷[%‰×ëPàM�ÿaåèôyÈÐ�u>'z+kŒûíèÖ¶vÛÞ�NDç´ƒª1¹$¥@�­ Ø[X.ð/{ZÞƒ�9Y%4š8Éõäwq©* 8b zñ6Ý…÷(õ 0¥“Ààœon°þôõ­óÈΜŠÄcÄ< ¼þ½¡ŠåèÃ{…¨ ¨¢ÿ4£ügÏtðÏ•ñÅ×Í­Ÿk.Ç—n3­ñ˜ª=!ÝÎè6úKÜ€tt€ÇK$4~-•—ÌôwH½?3ަH%ýO8î.…{;�Z¨}övÝ_¿!W¯x+-_E{Û�3C¢§Ïú¸xû™,„5$úAÆÏUÖ{?\N’ó—h|}Œ´Ô K¤š"ýrž YRÃfØÒ~zÖð³©Mjß�h�Oñ³� 6ݳÔg�8æáSÜÇÁAÆÝlG^D¥S8N«�ç¤ØÁó›ÀÏ€”ž&º3¶ÒøõÓ Y¢g`Z�æ)bfÙ á6û7˜Á±¶žqv¦M3IæË6瑃§·—Þ1ÑŠ¾*/¯\]ˆu°4Ú¤Ny®îp?”H.h¦ciæ!ÍUz+Žðºon¯Wã¡êòù-Ô j¢(Ç1�gÉ£ÏÅ:]_$ mMôæ6èGM�aE:q¢å7ÇX„ê+ÒwÉ×h¦(°üØ[?ÀC3Ó†×~Åußý\&ô'¾9¸zÖMÎoºeèþA¼á›‚�”\δ‘PX †Œ7ŠÚœ-|£™à¿¼ýq÷±¨ûÀ7_\¸ÿ>!uíâ*9 ¾ðà jµúúSÈòŠ'Ïc=JxV„º„¨…õce‰i‹†¿â50æí´Y&YÈø§–h2?rcâpø £šrF ã‡ÁËYýrÑ'Î~²ÃJ†$ Úê)¬“N(µÌLcéÂGÝ`Kü;õÀ]o­·c­k{Œ]þÔ>ˆ½á—ìt¹cBÖ¬ìc��­Ô�L~@šœìÈÿ߸EÓÙ ¼é- ê-ýòNŸÙ A{ôð—ÌUh4å°µüƒû,ê5Ø¿ïµÛúvs0£Ãü¾˜Ÿ·<´ð ­¶ØôcI<ÔÀa]²žÎHsÖâHôÓÃ×±ü f$Ëè]Ýýé2– aÂawždM�Œ‰"‹löDÜ ‰Jœ4Òf­÷G)»4$ô© Ød€D<f?‚¡øDÓœ�ó�Ûâ?ÿ†;ÙòÕÇ Yí6û¤òä¹5¶!?ÃK½í®Ô7ª÷bâ_ÝÒø;¿0w…arWèaÏ h&&<“ج@eïhø¼9i¹�=ù�dœ®2T¾»u/i¨Ø­{˜ûÔI?¹(µàö±¯³ˆÌ(Ï=ÕØÃfç߉ ïI9«çsáŶàtx~…Í“Âßz=Ïq�‹ÎCY? �æIÐ&xcT¨Æ¢}-J�µãKîð!û˜ÓN“ž_mÖQ˜~î$nÜ‘£_ö6Ÿj’’—Ö£¥á1c”åïž’Íâg?19ôªßˆWXÜN$ ¹sXå´cÍi J?(’ø¬z©BW1oYM'ifW)Íq àÌrsƒ˜$ ‰Ë�PBt=b‰M4ÿ-Ⱥ=”õ½]  é‚çõc†¿@Z¦Àa;P›ÕЗÈT/|)´Z{V¥™�ž4~·ÏýùaÇÔ��yãyΣjæþí:Á¿Uüú´m…‚0¨AZˆëV†­ #Â"cú¥ÿ:›¤.².E?#š€ä¸•¹ù 莞”8‹±\aƒ,¤‘¢´7´‹Žip ¬­®q—ð}¾lo0ÆFv“•’'&•ÓAŒ£„�zK\ŒšS”}›Œêly×m›ÁŒäMËÑÕ}z°zZÌ™ÍÙU<#~„+\/‡í çWœyš€ƒ~m/ÃÄäÎ\ÒzáÓ/=O½MÖYÌ„á©;mwã¡åç"a³'�Íôs“]`'­Üñ;±Í‘bгÛæNFÍ�1ߊ!2º,�k$Ø™zð�pæÌw¬ÚêRY3ëºâŽàÈÚ‘—�÷=lG+–j¼ÖaTÊŠ÷’Ð’/+3æT#åä›;£¤n©¹™^úЕŽý¿™Ý,’C¦b39V fú J‡¸É Âv‡ ƒ¹sRéÊ ÆÒâ¦8™�Lž´˜Ü$¢ ÑÒ^«Ѐ©ï¶»2nãSX•åÙcE„ºË0ÞÎ0w§-{ï8M’“dƒèȉìi¨Ìeo2“™"“éåÙ¡ Ï`×l'UQÔËx¹ÔÕÒ -ç! Ac:Ê61£z ]Z¸ +$äjÈäl̘¥vfœ |¹Ð.�o:Ldô²—sÅhéu…£Š ®p#èÌt•“ N ðΠäÙR°ö.C3X„\›uÅM*g=Ö²/ŠÎ+v;ß3w«x†Îw#áÛ"YŽ/uÚ4ˆBV�µÕâ©{|di)�JzAJ5.6–‚ªæÊ7f8«Žw˜Þ÷ß®"¥“œé>.Ï(KK*(•1Ãn]¤Í®ØYI¼&Ñß QŠž¼±ñ)ó{㤅¹aQk1‹Í©Ìòs7T˜7�ÉÒˆcÍÞmL9ºÛn!ݶ¡K¬èo¦&9…M²ŠR%iDÜfœ’딪è`‡S>ñÎLoÅÓw+%cÔŸ •ÝÊá|RSœ‡ªÌèØf½]oCn±~ö @áVd÷©»[§;5ìó¸ˆâ0Wr̯1’½®ÓIè×›Û“Hcé#"T=âí2ÄŒBŸ\&Îp+°búæó¦¿IF*ïÍì°Att]<*ù¤£6½½ô&eA1)gGGÒÒ»:ƒœ5Ûœšœ=ô}3 '0aQu�7HÉ>›´ºXˆe0ÒLX™LödƒÉÑå0-­ñäbHê�$„€zÿÁïþèa LoÉ�~�<Àoœ�eûù³ÊÈ Š‚��¸Û¢ðJ3g7èKWź[ôôõu4/Ö”�Í055·?)�²)ekY¢ŠªVÁðªCJš$Cm¹®‚È$Y¥w=NëÉS· Ùöíîß.:R–ž-nµô@$ B££1cçæRýccz¼çG4¢¸a‹,¢a†d‰óRÿHÂšæ„ Óö–1°ƒ÷–�f¹cÚ�4â—%á¿'ŽzÇHq×X™às2È—#i<ôÒ|óÌ™ y;‚*Õ�‚´ÍŸ�æúÊß„zexeÙ…ê^ðEfœ¤kÿ»iËÜyŸÖ(æ{vÖ¹¢—½�b÷În¤Lllì° K{]S—t¸Ö1î©§ß-²¡’ðŸomøå§È½wz¹£�²»'™§‚IßD�Ϙ�œXRÎùÕ?ýq³ôD[%O0 Ý0ˆgØyr·Ðƒ4Ðñ1¬ÂöúÔbˆÑrl7\ /À¨Î‘“ˆGe¯e!µŠßy s—ÉÆ N%.š)U¶|Ž~¡¶ oSÊc_“´¼©ˆqtø� Ý®ªB•Œº?2´9Úã?g—OD߯^âö�<äöáa¶kÃσǯãEõß ìýõÃgf¤Ò>çAßÃlýöª—™Ñká >|ëa2D…çÆhxE«^�K†Óó½Žn÷ÐåºiÛÆϯ/vÁj·w¾}½­ÓË]”ª\²��•%P¿1á1ËVgèáìt ¶ôÖ+…6§š03Œît>·ƒÊX2ðÅ÷WÁž IŽ®H…ð÷ ?ôž­ÈÇ×µS¿îÔSÃsãz®\ká-J Â+üXó���°1ºÅ²¥ ó BâÅ{§ Ùtª°ü§wÊý¦úÀ 6¥«#11�¹ÐB'£Êž{qýv𪋞A=ü&©ÕÎæ.�z@eí[UàÒEìcd�ócÖ¦•PO|ºO1ûBïµrÙEü³lw̸2¨ÅÌjø z!Ùª²<�ó®:4V%ëíRì;‰ÿ�è³×”÷ž{°ÔìŠ..¦•Iço›ÙUýå±jòû±aˆB&2÷Û œ VÙl^Ʋbª«$¹î®¥‘½0$ÒC5ÚðW†yN2l>‘fM,ƒ“‚|AÎqÄËç<ÄÝwœe »�Yë7rXý TÄ3ekÂyég}ÙìbêGr+'�MŒ,c)c]ÊÜÖ3ï)ʈhg‰†ÀÓ‚2}¼d_à…ÕóÆ�t@Å„é{Çï^o ìš­"7×?Œ¥kHïG–ÒÊEÏ鋜ç�å[“´Á‡uÀ·F2©½þÛÄù“Ó§‘ç ðEþlÛ€½Žß-Î2 ¼‹øB¶�퀱üX�eChß“!ô„ÓÕæúæF¸b·è›“!p©� Ìf³¦��åï¶llí‚´:LÄbGƒátÑÀ`·¹œê‚¸F_ Q#èy6q'æðg®ß«0$µËäëÙ‹÷é PH÷‚‹%Þ„vž0vºç—©kæãµ*ZܨÑê”^Žåæ¥�žˆ'e.ü8âƒGÞ¨&S-S'+/O´¦r¾�'e�K§K—Z¦ÝBd¶ÈôÞ”¬p��ÆåS;›Ò£á0Ý)†É‹±¹›ge±žv´™iÀwBwœ4*‘ÎùƒlÎØ4Òf¼ãwQØÁÆsÍ»h³FsyÙ^‘Øâòº!™ü?áX@ÞðÇ™u7÷¬ –ŸîWÆð`€aíÕlV`ØGÄ`§5¤8B‡Â¸»Ý,GKz°»k oÚúx¬Ì,|oØçgL»¡©é�×Zà-búõu’Ä E¼å¬‚; V)Ç i>dµõÓò/†H¼–NlCÜï}î,ëLIŒ³tw%×4__ É[b;½Œ—œÝ‹\| IXˆ äW”2òD;ʯv«Je œ DDÙÕAø¸ÖŽB«àyY-,2C¶¯K—kVQG—™«Š=ó­€]ª­!¬�[}7:�Ï»œûuŒ^¸S]�^»«§fˆ†Â„w[僳û!§ãG˜1›ªŒóðî9XîAb‚ÅJ®‰õ¥ÁÖ[œ, œfYht®DSgÜ÷t}5{õ¿¸«¾È üøìzW=XøàÕ¾ü¹» Þÿ,6F0Ø=nÚÔ¹¿º’WýáµAP„oõ¯SÁ3­ï5á«óŒl×úq\oEg^Å‘‘ZøœèLQu�Eà½QF¶õö�Ù&]ÍøàVüHAüW;l5�ž»¸ôÁû0ØÀ³.r0|ía�ò�ÆŒmõé448“Ø(K¬�m }¤•¨”ö ¸Àq+77ÈÆÌ ÕÎË´g8R4=’k€ù�5/7P]FG¿©BÅ íad� |zKéOß3ÛVRÁóî÷»€ƒ¡ñ¦ŒQðWˆÄaW@ä¹Uú™Æš6½ý»Ç’ʵC¨‚ kœ‚ ÉÆâØØÀévNÔIÝ‘¬ì¬ÝÌ„�¼R�¬·]”áô¢�¯ˆó’&¦ÇzJÚ#ÁhgáGžåôÛˆoЄ×!é^�Äé:�„â=ô˜ T�/ü¬£Ô3Íò©>¶˜Q OÃJ„�Ñî=×A�D$º /Zâ½<ähY\<{!`´C…kÑâúéÛ;?‹²cmža¸oò‹t¬E$5ç¸OH’>šE(ºxá Ü‚â62Ø@…=¥Î  (Ѝ3‰˜%íqÙÇ¡‚¥ÓÁ“ÄL{”È¢-C÷Y³ A®è©sãn‚&ñ\zº;Ð_rhb_ü÷Ìö8›¸}iý�ŠõZs‚¬Êq‰L‚ðflà—úÎ? ˜Ãës!øwxüÙXºfDxëp©Î<ó)áÉörðÏ\ÁnNEù3àÁ±‰€‚1qöF\âkÈa'´Ìm*ˆ\°AûÁf=¼WÏÑ9M¢Í]5I«ƒ¦Þw Û¶ ô«IA«Ú×2R6¨§ƒrLrô †azb§§\&IEyU¼ÖIgÙŠÞôe�%0 +_ÈÇ„O.[ÚÝ¥jüåv³>*>ó”gôcì’gc»Ó7ÙË ï{†1å%« ˜Þ(v4×CäÚ­nãñ°ëSÊ_ó¾î㜿€}¿#çú…ð…WMQ4à*šæó{Ñ×úöƆUO*7K˜0ûä†HG7lì> ØÎ/& uª ë­}áé�Þk|7ps®D:1Ò8…œÆ/¥†¼z€ —w@Œ]�›·��K»ßƒÀc�o7”¹ `¢Y‚š Œä3Yü暮έÏ8Æ;5 ×m^MïÂß2ëÜx”׈56.Óy»¸% œ0ß’Ý8"êW9Ó½›UGÒnKÖÐ_røg·EÇ2® ›jÓHÙ.ö Xò(îQd4aœ×*¿®'Ãcêóf|‚2`ºT»¥‹øžŒB£ÏrͬA¥ b«5´õKh!+1¦0Vºm  >AïÇöC«–O›ÓŽ_Ä™âý‚d°‹…¼×õî‘à¤ï E|Åxþ££Ò]tk^&´aˆŠ5牗ξÆ ƒÄ^í Ù®uÎòɓȆ$÷õÞ*Žt—yËÆuôi3̉ç.>4ê^â=L”§{Œf ¤u ’ú,!ï”ä}œ׃²£c¦oùg°@ûÓ�šþ¹…?‰Å ßÞÒg�>>^éc[ý�Y‡Ýô{y ü·ƒ7 {[ó߉ijjÆÃŽ#§˜¬Ÿ g5¯t¤Ö×{ª2a²––¾‘éQi/ž£!¦¥q{·f£¯5ÐTSmuèÃ÷œ©®º¶÷/ÒÂ΋G¹n[y�›¾3†Üi§J,�°®@ M³tÌ]Ý®‡Vv1{¦-¼7otc‹œ-MÉʸZ}n'SÍK¾zÇ×,6uN@¬E„Nà�‘äÛWzJŒ†;³©\Ï€,çyâÚ»ÖÛ¸:J^¥�`ÐÝco_ÇõˆGÂçÓòÓ—õ$–‡±é}Çí©Rb)þêȱoÉä}ÁíÞ³âf¨§ P^þudw­ÿ“÷ø¶A°gÇ_hÊè>t¶r忢¡+=ÄŸÇup5‚²ÚaþvX*•îÕ•ZÍ{7—õnÀ.Å:8$¿*ù2¶½ËŽ¿„tùEn¦ Sú nøÅïøa0)PêÅ’)@PL>o”C ðy§4p”QÀaÇù÷xy» ý¡\|Žªð {–�'H#Ú¿§zå¿‚Ôc]RÖ’ÐN g¸"C Çð�œ©ÿ\†JÓV¿c¤V*ë©k& T­‰¶Uœé‹$ ! 2¬&sÝ×^qÍ“`Æ—(ÅãÙ¦ü¥cÑg\7æÏZ,ßxà{ë‹-ª:Ûô°ò3�Oƒd†l@»ð§ÜáwâW½˜7Ñ–VRÛè÷5�ˆðì~™wÖPCáÏA–Õ^Oqó8ŽŸ¤Û¦8ÄôJûZ^%©ËÌ¿·÷˜½Ë¢ÆYé8ü?·yýò(3ý‘¿·˜õÏk0>ÄÙ™KãÝ´±‹¡o°íN7ž¬rÜ€$t|;Áàg΋ö”q=öð•x\KJÄ£]¶ )Œ”S‘w£䇥Š5Ls½öþ6¥K“”¤«ÿ%­YþŸ=æ>»yÎb¯±ÿ4žApĶŸíÛ·xQ£¸n5�9ñÓókF.Ìäëº=ó‘\×dy‘Z‹d„ð‚ëg‹4##¸y ÈanG|±V±ó ˜hÓcõÝc‹o¾ö¤e¬ÏrݯœÓ3EØ™ô�«¤mH½ÁÀhÚ¶HÖK@½.s�ä¸É¨0µ qÂÀÌ\ÀÆ+ƒ’µѦz#djâ Ò0“”ÅDm—Ðlô�­i”‡ÀúwÀTD3ì ÿ™‹Ì�fãüsIS~¥ ‹Z¼U.ZäÕOe¼Æ6C¶ ºE(bçríð@GŽë-Œq$Fóß Z0Ú2TggbfÁfÌiÊ8mH¼d¬’£˜éÈ>#â  ”¡´*æVÎÓEÝø#íÿ­ Új°Ø/^%«r£åSF�6>D’ÅšëŸ(K‘cy7ÖŒîîIaÐ8­‡h®¡Ñ-Š2™œ\â Ã"¶ ¬[v'ÍhÜ<ÊîÒ¡§BE�ÚLbúŒ2_–ò']”T›ý|åSw.YîLQº`'3&§Ãë÷©ã×B-7»<ÝZ÷xçM1—¦Ÿ�¼ê1”ô¬:DK›ªe:üýÆx‰tãàˆø¬÷™°w3Hÿïß—�“OO{—ÀÏ'ËSHù�5õ&žñsÒ6höêyšh*0ô†cÞONu£ˆ—¹j¹2-r Z!w)]>’§YWxuVÊwM¢çkØ…›ã}ÏôC{Sîâbñ{ƾޜ&cÈB,å6ùRnBþÓ?‰•[ÔÒ CßÇÿH‰÷º«j€;—¾¯À~"ev�[¿�²[\Êóä';º kÛÛîŠ&üîV´ÁihºJcßRÝ åŸ4§i£jLZ•0ÛUÆÏiŠ�µ�"ÿc@¨Â:ÖdÞXw߈ï€s–tFY¯�ò÷ÉF· ±çfn�'ÑN�…ðw€ŒDC‹KsÏ~oq!æD³&bñÚy{¯—heJe|„“gL»W”$à©è“@Q] óuv\ۙ욭E,^u²V Ão�âçàÜ(/­©]ƾʥš±b1$l †@ßà÷÷Ðä™^2ÕRûÜc †2‚€L|}?5nÝC8Ép{~2Gýõ›Ö°8N }܉&.ïýg7òG™<5UÁ6Ÿ¹RâoÝ`f Ú¾c%ŽÔAWÖü>÷6‘¾/EkÀÇèó”Â+ØÛ{ìcÛW¡#��JkŒ;¦¶HxMŒŽê>€]ÒÍn<´‘¹ò|²fÞc³lqWÌ8 !hµÅ#oü�âf#ݺ‡¼$Çê@tÅè_P„©¤;)CÈ%\ˆ´(U²ÚÕO*%"¯‘´¤ðžo˜5;�™›ŽþÜ{áès}\o/ÛSˆ« ßïYÿjk6«ØpþúK¢âñƶ5Äç”Í™×m‡4Mv2wk/u]­Èål”íbipƒw«¦Ð]¦y;F^4É�(¸Òtf±Â�Œ«úËp à¡Xé¢ 2†×¼(Í]CÜŒÊ4P¬¡hÆ&×ñs6ËÖ*�$yLfÙ[¨·Hˆ=_\™ëmç¸K„üqî y Åö€ñFur(…›ft¾eT¿?ý‘ï�ð˜(Ê~*ðì?‘Ñ¿Uúäì? öäNC1Ù LK·¾|¿„±o§»•x»“ ýácZ—K1�¥ø¾¡”dòûd{›°þ<“£@ÁMpljRx²1 3ôcxkè+eÜx|%óÇäÜ(S‡ �‡üè dmwÝ÷¶Ïªª¤= éåâ#–Æ­c+/ºÀô ·ÈÕyùŒ/ô}®EÔýL^ð:�0_fسïÝà[øpâÃŒbF€- —_fpñ(' nÄÞz0}ïºCmf˜Ü‹‚ÒÕ¸RÜÀô~}äw)ÛŒÂjʸÁ¦d³rbžâµÑ½xÛÞ�eD�îËç˜mÀ甈N¸˜Ã×2‡ó_|­Æ2 v-ÚrÎ'©yÄFÅ-TQ݆¾;yoÏ:¬÷=jI¡Ág’ŒÖ¶6Œ&x3Œ“X2ʶÆë¹OB ßmÛaT„Œ/¥eÌ_NÃ9p’ˆ ýMý�ó×,¸¦�+8ÏC–î†F#Tzuž 1 Ÿä�<¬„¹ã])ã7b{ö«·l_-JvÊ–Ë7̽'ãÖêxàf#�ýOïä�[}¯ßùÿ^ÏPîR8$ÿÔS�Á1‰˜F@v„�óWÈi²•òË �¼ ìHxC’m$…Í¡1IiL}}fÿßt¡|€ ˜$›_#rlҵ歸ÔÝ馕F0C?4ëù¤3Ñß @.àÁf[ŸQÛÒzø‹ÕÙ�àHc ¯)|¹ÿkŽN�æ‘z–Ï4’F`4€Wþ”ôò“âot„Ø�—¦ ××ÒßtYQ¾mÁWéÝrfh.^m>G¹îÁì4…Ø`Wï.¾ �J°aåŒA 0Z�@'ÐtR€Ðçóœª?±+Þ'´ퟟNÖ’OûœXvÜhÿßëþN]ÇqÝbƒ—†’L†Z„žã”ÞePÊÐW$ßW”ÔÇ/s_Ú˜VbT%ÍXIæ)‰õÄ%Ýj�óz^û•µ4B¹«ÞÉ}î¶¢•¬Ny"Ís×?1í/2åWΚԋLËå·)®hûKA¢™@d¼‘®]iÞÀ8C°C¨Aÿ`zsë�Ï»ŽúCçùψ¾æ¸²Û}1å‘p3Ùp¯m ¶ÒÚ°ü™t¼/ˆâ¢üý°ÇÏ䜬׻鉳ë/—.¶GiBZ.I’§Amû€„XßÇáÖŠåÛ_ƒcÆÓÀâõ÷ng¼n²ÆÙ¨¬šç@ß L:3Ÿ$Á€±�úø½ÒÛÐØñ=Gö_Û7ltì ›ZÎë ŽùÆ0ñOαVB2Ü}í…tÔsöæã¢ånà?}vw÷싯¼sžûïÿV‘wÕþXáR3é/]öB�G~a îX¡—Ïo#¸Ç¦ñRsö]¬æákƒ#ü§mÕöÜk®¯8½ Ñpj•°‰[ftö{¶àj.Ä&ÌtÛ°Qûd ­ƒG_CÅ\ s)6‡†_¥Œb:Ê?–±�+!ÿ^ˆ'öÂj=çàKó,ŸÏ»þ‘’ówxOæ¬õŸì có}ï{‰ï­¬þ Œ+WïK±nܘÁÕy¾n£9ëè˜úo{¶i 0è$È>n³¿p+”‹‰ ãVrîqµƒL“F‹S*2öF8%ftqWg �²ªª EdÔF7f2ÀîñÂçèñ�63?kEKO¥©’B'ß%hrÖªÔ†[žÀý§Øxæìþæëv²~ÈÆ²©€¼µqÓÑÑ7 ààÈ\c5„ž•³â…ˆúÞg%ƒò¼¾±ñç<;y×è͆J ;B¶rW ¸Ô‹S¬†‡Iǘ+= *vç†÷*–7lyà5„².µçÚ¢Oü“á…–¼!òû„HNu¶ûðüJ ’öïŸKÉO·ép^]-9Aå8úM·—_ǘ1¿»äa­:ùËÊž¤ÛÛ~ãý[ø—CÙ}w³ï|!�ëIŽÏœð/§$_O´¯žñœÍô·AÈ#©gZu0¾ÎŠÓÿ¡¬Ð6kÓ·ü½Pœ•¢Žß ±ãä|>'úå·ó‘%}µ]·¯:<\›Ã]–O>?èè5A÷ññ ôŸ˜úߦýÁ>ì+G›g4¼y Šd@¯æSÏ2º OÁCŽ£Ûïz�Íœ‡<ÜÌæ7[‘•Ø"…6jŸñGÞXË?Q`»Æý>ìÜcƒ‚¦<Û–�‡ÎLM8³P÷™¿¶&6˜7zš(ÉÄdøši‹êneÎÔ÷Bw!¦EMÎòÈ„/;ÀΛ¬†?‰°3ïë=ÎO?¾û;—óÈvçÝ[ W©h@ pÛ"1°ÐÛZ×€Ù4}ï“çþùva›Ÿ¤¼ ž ¿wƒÔ¹Z‚ºíêl|7�ÅÇr~wˆÈ?M/$\´5Šlé#W]ú´†„«<Dz%Ó­âë‚ýzó¨aíÊ9óŽ SJß�¼‹Cjl˜<––ºã¢´B‹à}"cÔÆ·æG@ŽÖ/�p§JÉŽËt©›òÒtÁ”ü®ìª®z¡(ŠÐ›=4ÄÖÇqqÙ,룥ö èk Iƒ¬„‹ ”ZÄeÓŠ¥¬ê‚…£Ì‰ØƒTº_¦ Àºë¶w9t#e~©B*wOmx�0sš¹ó39ÇØ‘[*þÊhÜkÑþáu|ª¾fª?®}¾Pñ¦zÈò;¾kOË@ü3Yÿ"xØuûQ€D=ÉóÃ’+á|È]o� >ÅýÍC|ÞŠ½Ê BS±øf½-?Æð™xºoï(]ôFýåPÐû‹m´œÝÊÝuk¶2Ô½ØÒij4¾ë¥Þ¦²‹ÚQ¡œh5m ÚÁ+ê|ì¢Ðl·høæLtFV3–=0bë0¿ ïè d%¯lPoñsmaŸä+eœ åÂ>M‡ éÜŸ7tØ ƒú©û%}ásœîÚ£ð°Å:: #º·‘Ý‹Ü/KtQòØû¹®=<@ä:Èë©ÓÞ#©ØÁ`€Jt!ûv�,™‡%,FŒøÝ¹@[Òkþ-ðQ¢;w käWêµ³JJîlÁ^ƒQ½–àò¾a° ð©8 Ÿ—m³@2Õüœ&hÔSñ ¹T—Þ/?˜ÈŸÂ�X€v«Øl‰äŽ2Äöd‘¬\ëcsH‹7khܨ]ÄD°²jRÉiÜ•[À± M=‰ì?˜‘«ê"Œµ?|â&ß•Ú[ÁJ7+Ææ+ÜO¬oèbIoHG²›á×\ˆkK�¡šÉL8e{k&BIaKþˆO*°Û)õn�¥tÏ%›²ÿ�†· }(uÃô,IE2®Ek{…Œ-cX®âù+Ê6x=DeMœu°iœÄõ}ÎC¹Ï ‹À{%{˜Vé2ì9Bņx+äÅCž["œŠ(† 1¸h.Ã=%\k «ø+…çé-¼ŽzpYÃf5Ùóß|¨ì2ˆ¼Yô;c¹AZæ³¼iVúIÒi'#˜Ä€‹UasA†‚2 t®*vªå;¾j’WË‹¦dAâþ­ž6�ʇô´à˜”žÞ=JKæû=j<Åク>ǯ[Ï©¿=c9²“ìÈåVÇÞ^§7IR¾tZC(6h-åÂSp´¹B7¹q±ãFpM§&ôÚßð(»ºy��Ïí«óiy\§`ŒèÞ—_kkg›Xã¸' u+êà¾+çöÏñc ¨yÖ}F‚km$�“ÒÉñ òlwV~7Ü*ãàa`n·Ã욤ïž%ÊöCë­Ð¹I�M0™Á\i8 ?ˆV¢#²L¤oÑÄ‹ÅÄsT²Â÷5Û1}ßéSH¦„d­b¬N7Iè×G5x8^\m'Þùƒ¡Á³×—"ÊÒã(àûÛ½@FŒ•.®„ðønÚÿƒ7/e=]ìoW²•[®!MXÐSPÅ8PÜo«Cg ”g«4×H-÷€Ln³E Ö1«¶Bƒ¦ÔÙnÝâkı¥ “Îlë&Õ�E†¬à>!T9ذ. ÿ1Cï28ضËYm‚ï™}|��†­øþçC‘Ü9få›.Æ]ù'+Ƽætf±óíË¹ŽŸw–Ëcé! Ѥüõó2‰ŒåkûH,—†€a1 0Ç¢í—ÆÕ¬vüö?ÏëK—£–¨û»ÉŸ¦å�ž¢ÞDrøú-eв挡ÞßÜ{?¨²'Í� ̃�‚þ›ÿsŠD»7ºŒCb ÄÒG›H9~™ç¾Y•µ)ž›í$‘ã½àýÄéó÷õ7ÓÓA\Á¡$%¿>×!Ë>6©¹ZÇÛ³¬ˆ­ä1Wß(ʹ?‰ š@ „À�e��߬þ|­Ë‹é~ÏM#÷tóõئGýQˆ�0“h‘ªMr‰eFLQü«ÞŽ^Âqdxc0�Ãdp¥"LV�@ʜߺ6ã§™ÿѪúæzéÒr èí™F�†ºMTž0/Òõ…ÅxwDÐPвŒ £&z §Ö“~,…_CVÛ.yÆ †¶šÄÓ{š±aVXy¼E ØT’·ŒýÐ^óºj¼Y…·ÑçÑ�õ5àÎ�ÄŽ0<)ïÝPqøÎc!¾¡wÈÓÝþN½õ½¡¿n6JÏ/‰Ç娤Ba‰³@î¥0:Q—A¦Â2 ,êH€q¤“ 8°J& Їž(?DNý†þ¶Å`YW_r†•W'ñßÂÐ C¿f#v {ÛìW$DŽ¦æ®˜Áüt’*u‹öˆFxB,@e2�Gø¬D7™|T!Ü£íCÉß5Ü„Ío¤·}È¡›¸(‘íS×¶O?Îô2Odg•î%£�]ìwòÝúÂo-á÷q¹‚ß¼ Ï�ÎÝß/Ì`f±Óƒ… Ț̰ÖEj½Ï!1½rÊØâöür„µú0ù5{ܱG8}•§B·ù†ÙP¡EQ£ c1äƒðoö$ÀÊOøóuçùŒ�ï¦W)ÐV8ÀMÆ/yvãÄ_Ä´Ïów7ÒïxöË‘4é ¼k¶ é¤ýàŠm¬êÚ ¤žÕšÌèzF:ïÖÆ“9Ôo­W”ùv¦->®ñ‹ðñE¦9äcy/ê‚váb;[;D¹´„%ìÌç—Ø�f³©í&ºûÖú¸¦­ ·�ç}¶s�ÀžD�Ž-ßöw{£êþpx‘ËMYÀ ºšõQñ½W.Æ_ô˜½#6-¦X²ÔXYlã;&š35 ‚€lÄ÷ö– WzÂwÃÅâáE'Å�üL¹òI.­yVóü·öZÃ-xC¿ž0Wa'4Ùä¹dXR³õN~?··\¹©N8«ñïkñg~&€Â6öá°2޹4‚:á+ÜÑËþ¹ŽÅïçx{#óu°Ì/Ñδ5”¡ß*3¸÷݇CŠ\ÈL̵­7eÔ"p(¼ �uÕ±Ó’@”YÕF«.œ¿„Ðʈm�ù~2E¦WW§ GåõÁ"»þ¯ÈÏ·<Ü&nyÀÁZï¥W\Uh(Q­“ŽmJ>N’Æ —¥0’æ&k¡1Ÿ;t8Sàd= vV ‚Tê<òõ·úÛ2l{þ‚œ} Sh¢Q Žô· ¢™˜Ã²w:¹š¥®ðxCqÒ€B§%:§Ï—¦+ùweHSþÌ1ML‚ÈûΟ¨¹b3Ì¢ÛУ‹V�œ_tŠåÆG€ìùÜ“ëâ\ßÃ@�±�‘³îPÜx^kؾ05\�P#$¼m½¨¹ø»wYð¤EÜõ£l÷J”0œatûóš Žœ�"2XTÊ�DJiÆà[5Áë­ØfÕs�_~œv¥¡Ô_;&•pØ^ gvȤH20�ë›Þ4côŒF?'ñg‚³ýÌ ÙÇ^÷ÿƒ¾4hü)¢%_V"7ãi”;˜çØþ¾øì†ßÃ#×OHâ/šê›õû> ˆ"ðÅ ­Ë/Ioy„àű�„¶G%¢ÖæÄ B ç è;‰l�–�ì~O‹j²|!߬["åùŒ翎×a‡fì"y°Iι�ºÌ‚.ï:ÅÞê©·,^½ˆ.�£Äòì<:a9~ò„›�|¼÷ÏÉ%ϘÕÀÒ7³õLa'2ðQåüùy Œ2 ³PD^qi~3 _}娝u}ˆÆ¾ª[¦ŸÆÃɵÞ@8ÝBÒcõäŸBoÇqVSx�c²&ÜãcpèiúݤQLU>�Ôú×õˆ­³›ªhÛF¡›& A4}hb‚ßaÀ5ñÂ¥Â=?iV­ǨÒc'QÅ-Œzì°‡s¼¬éu2Ž•™�R›V–Â×é^ù8»ÖQ;Z ž�^ B`„q,kšEk¦Mj•®ØÐ {`࿉/†.‘`°�þø) Çqí.½ó?«GŽ5¥Wºm³_Ñ€ß\·â´ãwÓÖ-fð†®/Œðªø„ …¤ñç#Ï,º6 `šA…ü+@±‹_ æK®áÅ}�Ç ÔrŒ&÷Àà{K¥æO,"*J¦É$ØäÒæ«?óYF¾)‡@i#ñSñØ[•K‚¶Þ­Sˆ]‚ì@xȦ²ÐRSµLãHŠ0&Ñ\›¥ÃÇ÷ìCÛÑ^‘ ¶˜½}Äã˜�//ÑÒ`Ë"ó3áçÂæ²Þt&c�A˜ Ìs�ÊAðæuÈ®Ïx³Ë§ HE‚V&K /4¯¡ê­æÞÙÖª|�Á�˜Æ ï°V‰Ú`¤x}ûV ÙdYßͲg …Žæ½âm7ÃØÑp×^ëSƒ`\@­„”µ¬‡Œûž:ê'˜4TÃt:õ³c-4ÕißøºC1�`ÛWÏ|ÕüÞ®9&FäÞgv,ÄÑÂlùW)rÅÑŒ-®¼ÒÜãûüß—{sz?þG�鿏ì­ã0e6Íó8“@!EÜÕÈ~:M4*.v¨‘Ym «:Åñ·»ø!±è€]Jt–d—Ö‡b �ÆÌ¾¬iççÕg‘S}Zû)ÃÄ­o™o1DÂãÂS÷ áœ7›íõ}pÑ}]=|¶<Ð]Nw¯ÑBûTÇ‹Ì 1�y˜!G�;Â…ç“–CÄøÜõ}]°Õ/�~ú3ʆϕÈ*ÆG¸Ù{–�ØzÉ–¼V/²?§e½ûíî0ËÜ[OœSr’Œ�Ÿ¢¾‚%+TÀ‘R5AUÓ cÖöØ›§úQœ³dJ3O2•ÒþSÛëMËÓ £ÁFUnñŸU»¤.Òz¬Vùî‹?¼ÇΓùÁE?ÞØ¿à@Hó9hGù8Ú†¬�2®Œ[îN­Ù8»#mší¢uQ(€�ZýÂûyìœWï¿xLS’Y¾mºjP¥3-v7i‹4—h©­)l ˆ–ÿò<Ïí+ äšÿAo/ rKá®â˜•UK—n+>�”~ëYç*è(êSœvM¿ <Þ`n'D¤­²‚gz€¡™SÂãŒù2Y†ÌïGì…OËeL¢q;–æÇ�®yK�`ÖV¦†NTu“‹}ä�F~S¶±Z ÄK±ƒJgI$¤9¾xñ¥”ÃW*òù}Þ…ËTiË¿;CÀh„Ÿv~iÂQ(1H2ö]n,Fñ ѯÒúèç¢;uv J"ˆ˜ )ùPùJîbÂïÑþøõŸó ÒÓ§_¸ÛA´ŒÇò ;q­Úz;G‚0䦃?¤ÀAº«·tÿida=î©‹ü*�[^�zñ„A0FÍ¥4§Pj?ž‡¡ù¹sS)ðšÊ"܈`ߦrzÒîhhkÆã¯9)OÈÕ§­#¯p‚„•@L.6@¢s®^yãò ±õcª÷þkÚæ¹ÑPhlŒò0çëÍ•_òÊ%IRM�GðX‰Nˆ>Š˜‘’Yõ'U$*óœÙ$ª0!œäv2u®ãpæ2[Övxžq=[·FZ”¦þúíq�þ ¤ûcöf$ÎÔ†˜ãuÅÿ2P1¯.ißßnãýC.ù!á7¥çcÐRx*J_:àMçùbÇ£ëÅWŒþ9�ÏœÆ G7ŒæePÔëßì¤Å�( 7ïÃM<¤~(9Ö~²–Ú=ÀÜ…y®ö8D~ òzOëéÛÎ5,3b›\¯2dÃàl›ñq Q×l>V ]¥£^rÛõ)#¥ŸFb9󾎀^‘´Fø¾ÕÇoÖ-ë!KïªøÈýÓ?¼ÌPVï•·‡¬r%Ü'ªwlúËùãH±ZžOö_Á�þü��7þUíx¤_kN£84 ¯wÍÀ”šÙšLáW�±c­?ã+J‚Žš*íuŠå 7pDûÆ’1zÈ’6ͱ_/‘{~Úê·ò}wöþ?=¤Ê/ @‚ÄeŽ=û¨{(Aáwè`�"çÏçø4ÎüÐÎvÉÅÌ~Ü£»ÍeoI¬ºQ&�BÎ�3s^mÛ(|±žï¯ôÇ}G™â%Ù?a&oöì`PAM°Þ¨>Š/b§$ósË “]°<ú»­…HÄlùç`Œ¹ù0ô�¯v²*ô½‹Y›øÞ»uûC¢þuþŸ6ÁžÖh0j®ž}åI"'³}1àèa–Ûuº‹•ÖÈÊvü–Ru]^úkó¾lˆJgÓÏG§v\¾7Þ^ ÿ½pŸ!÷ÃÁëåüA(•”*à—Å®{Ö=*@l£ÝUp-N Óf©o5`¦RÙÒ‹üÝØW×þ޳.Žs} ÿx(ŸÖ›WYÿÉ2Ýô’W]üñ‘ˆ*K”ds>ìÙ ðäg%³+:ƒšÔl6Í+׆ã¥óY4³iŒµ÷–ÎRYø6 %áYÚøM>”Ç#q+f"{õgš:¼\?Wfç–Íã„w“K™Úø·|¹®/Ë™N�·F<½n=*kÔ¦Fy¬ú{­°fYRÏtª:ˆÏË£¾Ì³ šm²/»×oP§$ë·2h•-m ¿°÷šúÚüT%¾!~Ø7§Ï] ?F%o‡ š5™V.¹P¿®,†j„s÷e|êuõ³ �ª‚ZN°Y'Q¹œ´eŽÅа¡Ñ ±÷uך©ß5Òpèã±™}ùjž)*ˆÞu5·«Š1ya\ š!%gƒïüÒ³'½�ˆ(D†îe:|A𤳡„ uçYH¾3ÜÊC^ðQ8?ðT�Nã·›êÇëÕ~�ÇÃá$S|nöù݆IS¸û rŒ»ÞH÷æ,�ý”ŠóîÛ ]PJ_ânOúŽÂ(Œ~á„GÂŒ{ð_ÖÓÕ‡/�íØ &o|¯>­,kÔ]è‰[=l)y›qa/]Ì@:öžØÙ·W39bNg9ÉÒܳå0ƒ7¬†ÿwÖÊäÅ›ÒE—üÃAý!6UßZ« ?d=‹ÞÚä>£S%N�b{T¢ïU¯EÖ�<¸†>ó?xÃËDdvÙ~‡êg7 ôcÂ` …„öé îpÜC¶JɪJwØQqÍà(ïi@ýÆAá­è‘ Ô¤Z ŽT™´Íǽ—®ò<8Šç1g˜slÛ± n EÍá\IÈ(¦Ø“m³o[k·å*Œ!EkÒ‚Šnôíý+ê¨.fµÎO\E¤›‡•1ü§¡XÍíðR,ÆÅz½F$|æ¨Æ„eâõ×#W¸Þñ|2ÙØP¹ß§½„á®Io›¡VWÍ×Ãͼ�uׯm?Ñûñnô÷öQŒÈQáÝ‘Q\¹ë™L:ŽŸåö:õ¨ulƲd™ˆ)Þ)A¡ƒ‰Œ·a¿Ô;™•Q`¹¬ùª‹¡W¯¸ÓתÄýXnÈ»ýl��²øÜÖQZ?­²ZÈ@¤¤;ë¾àc›†=î9òqðòq'’ ŠÙuLì-JÀÙß·77à`@×"·â!á@dzöqçÄ,ŒYÉYtJ¡ï1þµž‹Ú�d‹·]»;ßfaLq*ËpŽR9Œ‹ƒÖ#/„G$è1Ò° ©(ˆ‡aÅëzÿ—gèÕ÷á6Žá‰¢í¯o%‚Üa‘:ã$ª¬#¥n¯/q<ÁfGthY/ùa�(Û=KÛQác‚FÍBÜÔW1ªƒWRb‰À[œ>}'ÏûÕÐÈN3ÚÖ™�N],4V"‡_cmÞ�ßïïý��†Öé=Í·œ¡¾�t égŠÐB!bÎÝv�ÀÕÆ…Ö‘&[dv׸ɲº0fu\¡µsÏ2x£¸Ù´¥’Ö§Ás±]}º&;ÔR¿[*9½Î�‚ê_ø‘ Sp~å¹#šow¹ì¦;ܹ“Àalª·þm/&:`ÐБÐ��*\ʆå~óÎÇt™¿šŒ}þö8‹�.3}k·|¾yDé+ÿ².nÎk>…½Ú‘®uõ%ÆÒ9‚@mªÔbeƒ¬»5øWK2´·!¡Ã<£ yÛ9X‹ÚÉÊ�ù cävŠöKl*½‘©áÀíryÇ#%û8Ö àç·7?k€"�K]›ÕÔñ¦Þk— ä-þ—1ÃÇħóé¾ìŽ‘Gp¾8)DÕò�ï—¾ZØØ�…œôËs éF uŠÄˆ¿·î3ªÉÆ}ú‚–.öØV˜2qƺ!ôõ<ÕâÝqŽL溎îÇ�¥k%”ó+ÿÆq’3cæê÷Ä+ûúw|ê‡1•L·£_Ø/—Çb=V±¹ÀÅ`M„¹X~Ïס®² òHzY±bð–,q÷†Â¥« ÈO-Û¨ ¢Øu瀱›åÔ‚ëÈ·âf"uÇðg¾µ¾_ÍÊôýïÂÐìç‰E³'Ê,š9K�=]c&™Œµ¶{ãÅ}ÇØÁ¸ùõà üdK©�°yû…„�–æ,­p ¯áÚ"júÍ÷ Nø&¹Þ „õJ�ù±Çõ�Ã?Á€”§\&ó}Xòu+w[Eùr!÷{ß�>©UL½LûÅGh,K/8Ê»y�ã¼3^~'“Fø¾?ÕÃÇ€£¶ž*¼+È~`5Í©1¸ã°ïj>-2i"׸“% µ¯Í0õýÙ“þã¡Þ³vÒg%ÚP#aÕ§ÏÍ5Ò‚Éìš 6RøÃ� °…Hß%AXC*1ÿ[Æ·›Ñœ_’DGÕF�O=Ú»c`�½|!Ý�ëçáK§7­ÆèI·8Û>CÞ‘CMSFŠhmñTâ';SpqÎ’õ¦þ}ì(Ä doܰñ�­‚?_‡áZÊCY±‡!ÒáVÓW[½‚ î;¼”ƒÂú†ÃÄnP±¼�J¼–<öwPðxÒ�ÚDanU¦÷Ãv"æ'›ÖÛ(1kÂãÂK†_œA ²sEâÁ Èe"›;ÂÛ¹eÄmÎkT(ìâá¼½' %û†…éP䨤Æ£¤7Ã¥¼ó:xœVÊõr®]tâæåÿZv%ýiÕv!ë%„R¢æyœM™uÓ¥’j¿º?±EðLx—2$cñ2Á\Ç„¹M¿’;ô…Í!ÿ¾Œ/Ó­ú¸ÔTpîÏ/Éo.”²w–N]ÝÔò�·ç7,Z.qÖäS÷J«sÕß«VÓ.Ôƒõ;Gìß4ê˜x�ÆÐkFÂH/%<öÙ9Í”Û~ö),Yt"µ´6Ì\» ¡0TÑ^²toÎ1žËqmg}V?d‰\¬ €Óšs2â0Xò’ô?_} ÔËÚ=Õ6£Èz~¸0„ºDI¼.aÊÅÐ@ˆ¿àñpñÝsÉ8GodIG¾¥Â/ˆ‰œËÊ2NÃË™îä$CÁàHVº çeÕÛ–;œ½Šqr~@ÝQ"ºKžÌ—lЖ‘^Œî¸_q~ã;RÉ©)M[­´Ä;0\†×ŠËcK}ªdÅÍ G}`rb‡SeQY—b4ÇêTö+Õóqw˜*™ršähcªR¸x… ]îeu ÄÍ$ů8Ši�k°¦é¬ö°{GÝ)ö•ò“4ÆÓ:^’ön›P¥5âÝã­Ä»…†µ˜Y¶V’¹©¡Xÿ:~Ÿ9ù§’ÉsíSºæpÞROºÅHÁ,Ûì„ØßkÏÄòbFUù“¾|4^�·]e2rQ*5ƒ§÷jqîD=Šrè¬$1ÔÃ+¶£É’I,Pµ˜�ÍAX,×Usp`ˆê(_0$RR‹ ^è.Bý…¦=Ê^”šø'ÄÛ½JHÒ€¥lCPk€Ža�[<åÚ9ˆÅî?2Ƭ äK_Åídl²Å&àê¾UQz"r¸ìvÁmÝ”Z®˜¹Ý@¸ÉÄ£dÅÅÁ8ºæ3£�00@�ð³J !¶w"ʤC%†{ƒÝ´Áàã°&* ŸŸî2 G¼æò½�þô“˜;¼ü> ª{µ€÷~Lîíî°·èûs/ü-ƒø>Æ�…Âa{å#+Ξ,o4Sl…=Ij.×ä(JS™ÙRüDpµ)^]Úž\™|B´ o}¿…Ü_¤džPüS�7÷ºO˜%F̬êZuˆLµgN5{ó—`¥´·rÙ†òï~Ó[Èl’a¨�Z@ä™#2�¸í×oz0 ¥m\ø1ë�+ÐxfÌ|ƒò”׊lÓ‰ã{Ò¡GéJUÈ™Œ¤‹‰ñ'&ѸÁÄ21D¹YÊ^Îm¦Ýk;¸Üqc"ã�¥‰Æ½ÂíBPŸ9ð·™4°Ã®b$7å_Ñéò$½¾­Ãν–õ ŠÍ¥Ã ÀP–7ìFc¡c{å�óº�ñ D,mêÜ…¹Ã–t²áélSÔ°ÒÒ"it-‰�)窗þžw¤×Pi`ÄTdE¿{FÙWÄðPÁ'Pˆ§ÕUÃ.Èó1æÊ߬=»�;vmD7�?Ã?ÇÏ~nëçoCA¾Soìö&å2£ôž˜$ ¡Où—ySƒŠ{xù&‹ô£dË_|l§ôP«à>\Üh¸„³ ‚ÌÅ3]É)àcÑfÿv¨³çM+…£UrÞu¥ï!»¤‘³—ÏFZñ¿nœ��|Bô—ãÀã–_µÕÜÚ‹Kñ}È’ zؼ² ^­¬R6>ê*âüU‡»ÆaÜ�‘¸=^>Š�­ý÷ƒ£Ô¡æøÜåø­ü,ÎŒòŸ¼Òø„â{+ÃUNÄ™Ái/æm°¨,¹`âšÆØJý�)î@î”[Ï'�:ãaF�¨6[ÏÔé¼}æx¹[@·+åš”ƒ‹M€Ú×=oÅ^ù‡S“F d\€ü£ß¨Î¾?8Ú'—hp`‘þ¥Qº7�¬Ðï÷¾ ÛæÖB7 Z†ýƒõub#Zšõmó{£f©‘Ù %y†ÄƒO£Ó’A£i`¶ƒRG»æŽ.A²vÌï�Ïo‡Bâþ0ÆÒ«ûÕ²ù¨žZ=t‹ìô[ãͲ$%ÊgB](úä[w •¦'š�¸SGvnøùîâ‰7®"ývÿÓuF½ËÝ’'ò𠏮�tFAsñ'Ÿµ‚ÍAip¾âÕBbƒøn6$§ÝÒG\#F2ÿÐÉxS¾3½}ì:‚!­-ñRv×WÆÌÝÎ$†0™8¢¨lûM#È(¼“ ‘!ÊõÔ·ñ9ZÂ�äðÕÓ0¾ÖÞ–9òa«~#¨c]‘‘{c7H†0´FeP=§÷R™Æ0Ö.6ºÙ…œù‚‚Pï[òt7â‚%Fþ�ßHÛZq’}‹ô@¦QE–d%áí-!0¼¡.Ï›j?пö!jÆóž�o.ž>Ð4%¦®8"OãVBôµæ¦l¾)ÕÁ†¶Å‹gÔÐÑÏ}=þ¡µ(­n6jµüfÜÅ^¢¬.VcÈ$³<d¼ÊðÆ×–¾È”¼Úò†u3žNeÒÜÿËÕŒ�|X.`rVVѳ_6OoëÖ1Ir È¢q}pÚÚ‘�w^`ð*9ðD˜|hÈÂ7›ô—0p=žªå]G¢õúÛÛ�ûI�Îþü®4[˜ÎbÎUäÐ~#a±ã=ò›ýuŒ–Ül|¿Åþ-1eo+™ÓöüÙý<ûíÁŸ2nO™z>9e“<.q¾ŠÖ׸dœ/‹›AÙaìªår6S$ŠjÍËŽThB\GÏ»„ûfàûtý”ã>¦ §Æ#÷‡h!D�ËÛ)`X9ï‰É%kxS“·:¶iaÃ9 „|Žã.#<‹’bYˆ¼ð¤àó}‘®¤Å5‘²”Ž—L†j kƒº<=±rœ"‹-Våpl ¯ÆCÝ Árw¨˜k÷ºµcr£\�À\±¨tÜ邨 -™Ø°ks¢þÀeÉ¿9­¿¥q]¾‹Â¶S4™ÕñáQtÆ£0 Ð�ÜÍÔgü¶�ýûˆn¾ fwGžÅㆅqê éµóç/é�/…=%F•ÒD “Q—Ák•%¯Yg(�О[ ¥ Cò›® ¿Ô]õ ³Žz\Áõ°I:\·ï‘õ" Z…h'¸Î v`¨e­œ¼³º ,¢Påz^¦konøó;E�e_«vÛ˜¯A�©Ö =w¡.‘“‚ÖGô’ìï:©2ûÑkWýÁ¹Ñ9ïì‘îœXƒÁEîÝ"ó�åÛNçAï¿ë9}ÉϬ(Hw{;>Os´VhO[Ul%]J ¶aäÁ‘¿ðæ2s‰q„g¾èšðB«Õ™8«›ÕÆÊûßw²!ø�>sp« ø. N-PKÎâ ¯j²\à†7cµÿy{ß©Éô5¸ý^…ö%’åF�²ùããlAÃ`3ów›ŒBÐóßߡΓ†Æ üÂK2³ÃA°:«þëQWÉu¤"äȹºšÍ’*IJà�¬Às™Ø†�ð°ëaе­ŠN°ÜA†cR0ºGaÀ¶¢zHÑÚËʽyq:÷9ùg H;„)ë}Å‹¾×ù·9üMßn‡”¶F³¼Œ`.§«eß–÷ÀškuFkýs7øÁCL ¸û=¹cìóOØ\G‘»x�[CÊ�ç¿ë ¹Õx‘½ŽG¸×€ª-æÞÍ]`_´Ïƒçк‘“îs�v kßMËà<š¼Ï\5‡lÂõE˜Òqm-—‹‚,(¸®Áv¸ÕgâÇ0Ž ·ù‡Žæ/&åÏ&ì ôšèSwñu òò:CXâNA�äiUÊ4<ÔåÀý¸ÖÅ9Üb7Óq1šž‹±WH�«Qé‚P™S:Èî@�÷%[@‹Ýú˜ÍÐw¥}ÚØ ƒ°Ÿa”•–Žü#;骶WUð~oi5®da<Ïyàóž : ‚–Ÿ}ÊÜF';¶¸âm#9~[û< XAï #"Ù-«%¯Þ +V|[<Ö;) _ÚüX–»gž3Î7ØóæBãï®ývù}~¨ÄÕ*©dª5”–œRé«þ/ΨÚÍf3­'ž»k&Õø[U¸×£ÙOéxÑM¾ÑIhsJß¾[áïÙ'±;Þg�ÓÖY‰ã ¼KÌ|}†R-6q ÕÁ‰#]»i//ƒ®ÂóÚ]sO�Ž^Þ?ZLKkuÒ©Ï-âdàå“Â3xÏzˆùö2S�-oLKöÞpº3œd!ÈJ­]™�˶ò¸ª¼øWZ³Ího™®PI�¡X;;uµîìÊ*óÉ·¥4N. Ñ‘ a›H‰Ž’8ºò¡xxœNñp<¾ÐŽÎqíÂ÷:Æo¦HrOi­]ŠÚmiµïl^“»{œúø47ÚOޝ f͹E¼4-® o|K %!ã]Hl¼ïŒ¢õò_�r4\Œö±®Q×ÚêcE©ªîLŒU;kcÌÝ­fR VØÉat°l³ ×U�ìu£‘»�+߈j�•rb%—™ £‚GüQOßu�ëÞz–Ž^°Æljææ-ð'eZº_¿w>Ä2ô¯‚ÿTÜ*×âè6ôÝɬùúNÃ�@ß L¿ÖPëÒ¹r²{¸¢íÙÈŠüzµÅKÜð^Ó Øè_Ì<2bå$G¬&dU}€§Ê–iÉ]†®e’�ê•KÆl.YUXÙ¸Ð7æõ�rÉ`í×§Ö‘dî(ö¸G¥Å"¥x¼É<ÏœW¡”,ˆªw*dEÍK+Qª!69îðÌÍ1Avñç:wóûï˜ÞÞwçWQzÓ¨«´Ü’ð”oæÝì”ó¬exã]Ýž!µy]]bí²ùX¯žöq…tî"$Îx[ïÛd_ø ¡úÆA�}%(iøPcÔuó˜�9êÀ½Ú»NèÐŒÁäǤè‰ï Éžy<áç©W^ì>§ñsâÉõ¾ÎJ=A%Ȥ²Ù Öö×6³tûÀÚ¸ù}b cËó(øvøö9Lj~ ­0ÞÛ=M˜+h¶Io�Ì)Q[çÎ.Šc#-5RëÇK™�?7·,Fv€ÒÅ7Ñ/Æ!0 ížN— +:Bæo†:«BÏ~ß|߉ëiÛÐ Ôß‹X‹•ŸSK‘ �gZ¡>÷%Á.‡²CŽÅû³„ôõã Ö÷qâpsB³ºžcº¤Ð)1Έâ“nïŒò_+ÆÄTŒ@vF×ÙZ_MÉÆKÖ5ÈÛì™Z=ÃÖñd5X‹QlIÃm;ï߀ðr}\¼äGÞ‚€¥è+;²ý�íÖ\�ó^”ëÜ5ÿ~Ö¶|4©ÛŒ—zü¸©¸®0ñÓ%=Îî‡t€åæ±ÛoZÉ2XÔQ›ÛÕcŸ}h¾ìÓÊäz!.CdœýÑy¨‡ÔègÍO¹Ü#c|/� èéãæÉð�‹ß]by´'ÎÊ> h°¾?±qÂ�ð{¤:'³ø7ËûŽð^ßè±öuéÒ„­Tx(ãBcIÑÁ‘V)X¤Ø ©ˆ„ë#j¨a‚ºO‚ª–nd¶…” ‰RC_n/‚ÙŽ¢Àî¼Ù 2!…ï1,uƒŒœ�Ô€µŒ-­ªt1ÔêìŠF®)h´Õ1BUÅê¢nºë^G…ú;•eǺ4/¾'ûl8}Xúe/HKáÛ§nvØ’ÑÑ56ÌYáœZJÃþM€\‘|R_±Â¦_¬©A~ý}oØT­‹à–ø#“–¾7^À«Í·ˆÔ©E ’‹‘°�†Æ¦ìû×¹Êä ªá©]c<2|…ÛRa”I0ÞnX�€âØCê9rá_wÉ6Wu%ý‘‡È͡גù^Ä'ëΦTÙtöj� ÑÇ ó¸¾6©�FÐ1�·�ûŒêólFÖöÑXkJ7 ¿=ÓåI‹á�2óK£ÑÝúÄwàSµÎ³ãñ¶gWȽã|ûíÞ5%,Ê’*5ßW7|÷ÓÁà³íÛu�C…åø=Næ.ñn`ýÇO(®´˜gŽNéƒÝr›÷j£�¸ˆ`ü´B¸·qË›ÃÊèlc^0\oÏ”„k<=…,¢–+N۸ͭÝ6ÞkÔH|È­üßî}C`ÀЉÞNÿì{0;AuÖŸ©~•�æXŠÈBó"©`Œ½±l•JPz™I:ûmÒb¹å8Bã#è[OLI&S¬qõöúLwP¤Cµl@IÜ—yÅÉmYðÙ�?œ¤=š#AÏ W.)p;"µß®çfD ¨>6˜ø Fˆo‡Äî lJcr¤Æ8È6Û¸²ŒÃ7R 9âÙx\÷ªñ»štlÍ “×6›!ûVý’÷â�ÛòþƒÐÉÁú9 „{=oöct“´<./I¦ˆÆ¿e�rb$‰mæ¯ ‚OÞ8D®©%¿‡ðê]1åuŽ3â�ïÃ=º úÙÊÞ±ü~&“Áy&_x£S�zo1‡÷ Z¼ë€Ã%N nãšÀmؾŸ·ì»I`øeC¬¥€Å<`Ê boó�T_¼ƒÅÄ’‚/S�CˆkÜõ½¸Ä©_�¼Üª"$‘ˆ¿ÑN¥¼dÑŒz©Ù̆¦KÛJòw QTÕÆa�½Åc+rlz…Ýg5«â¿¹—3�­müÀ[೪k‚�®)Á¬•‹�7ÛžF ‚–qøÜgJEÉF«ˆ ÁsY¼‰~±"•aŸöÓlÜdœªèjõõºheÀ˜öÉŽô"šøc=Ï}é$Þý¬½Ãbhðõ(̸$•B½RlUä¬`ì½…ÁOæ¿‘C ™pÖùì6R~ƒ^üS=m÷SW>ð^¼bÕ1^í…[ï¼ôË•ÝK·q´UæȨ¥.)ÖôF7˜ëº÷ º(·¸èaÞ’BŒ£¢:¿7Ã9”_8µÒÉM¤ZoÛè1®æCqÏ1ÊðÛ:†ù#…Ä»Âz“¥GÄèqWÏißÊÂXÉZ¥ƒiœÕÎ(W¾˜H»\›´�©uJŠYZM¯ËµS4tõ|ÖÒ²ªGù1ìO±¯<«K1†¶X†_T˜.ÕŸ—œFËu|¨¾œ½/²þâæç�|<ÕùxÏÿgoD®l¡ò§pŒF¬wæ¯|ÿ{Œ¹ô÷dÉb¤“߸ Ù🙷Œ’8ˆ�)LþÞ …ÏPû‰òíºŽä7n2æˆvB©ÎÃÂQ+b?‰5„çLìCKÊúÃQ…¼¯s»_©—Ó”=Nð5aŸ£/œ04#ßí’—bGÖø›»1äÉÀ9(×s°™•ÑîÐ÷U|#GzœŸ5tÁb ïd-VㄹÉO‚C‰¿ËäF¸™z_Kç�Ëë"ûˆÓïnã£2ÿV0m#Ü„¤ùë~û¬9J�"Ôè&ö,ÿ—CbÁÂH{{úëÏb² C@G(‚¿îåfEãRª™`å‘Þ0œyÊ/¶qbέyLÀ6#n¤NæˆÇ”’ÖK¨ #«)VΕ|jê,êLMƒ±{´¿­¿¾ïaÀóT"âÔL€Ÿ—©Nè N³*iödýþžÃ„97 ß°È1†FÍü[ äóŒ1 ñ‡BMjL÷ÊŽd†9‰i.ûz2!ÍÒç#»Àïk¸¡H)Ut‰ àØø@Ë `ˆ?û3°.q7�65öûÜ߆DBpŠä=D~ù‡Ða÷]¬¼V¨§Ê,:âb9n7I.õR;’ƒtd©Xض7á\½ãþRE/4½‰ú¿ªåÕƒþ©ƒð,s©S· 1|ÈÄ3äÞdå0KYâ>ÝSøµ�ß%dBb:rð"ï,{ù¤oåøÚÎÓ»Ä?ˆxSâ/;kf+˜}Ú‘¨íÚ¾¦pªkÉk5/öÏv›ÛݨZÁeroÒŠqs+aüÌ·�¾‹Ø©È^h÷ƒjÙ, Ìê»÷{ õX׆dlTöÁK6ßâq÷=¤õf~ìú+y@½‡öOÀ�T'Ä0 …‡ ÄDvðt˜U_ÌùáÒß5šw<ê‚ß(.zïęͣ(z+³.üÔ‡ª�:ÈðLd. í�{ŒârP ïG–%ߘ6Äšë¼[ýúÑ�áŒûv†�Ì_mßsyÍ¢ÃÆüöŒ¼æ|ƈ°wüo~1ÁVOÏ#Îþ #+~fËKí즀ËZ=?!y.= ×P7�ƒ‰¤›¥©g=ž m­j0úWÑ_ÁŒæõÂöìØÆÂ膣Ì$EÙ“y1æ.¹Ìöh–³kÇ2 …ˆ¬E’Ú´DHi¢>«®èºYô±Ù…b¼_:±íÅ#®ÈÆ 3#�`î` ìã¿ ~½ñçÉ�{Ê›{˜ð¼}4õ„¦»NÖÉ�Rbóêh#Áe¾�ʆ¡¥2]= ¬¡ß ¡Òª#lç«Ã.KŽ[­N ¤“Ö…!è3(zág6¾È`SxJ}ëFè—fæa‹}³vÛʨÀº²Tc•¡¥¨¼Rè(NxÆ`Ji’T¦K(¢Bi¾ÏžîÍnwåæ÷b mnò5Žÿ³¾_ì÷åâàÈ[–çÞtîC†óÔ¦µ±â¬æ”Ás�÷žÝܬ(„ÄTøÑÃÇ·ÆÄeð¹wHß[[ãeÅL•ç#ÞxÖÞJÉ¡l"o‰§#€e&w¾ZÖ[°ÑÓ&Þyé¥h¥ p©<Þ¼lçÉ+¯ë[¸ŠaÌn½ï]„\×·ñ¨ò=xlcŒÑ¯eVùÒŠ=‹?“¢�Eî¼Ã1ªx“ZC­a(#-ŠâçzyGP“\툖úÄVo–us=²gï‘5rL›Ðã-è9Ø7�¯ M†Ói«Vè‘q“ð±Šà|(¹=½šQ—&Jþ0é’“Aù®?0Þê‚’ÉCä�3ˆUá+ô åög§a£Ã™ÿ °êŸá[éÇð¼_Áí"îèqmÈÀó_!å°,/´cýrx ã{%tíé´‘Íý¾ô.ª|¹õ7ŒCXGn_A>‚oò-l¾ÆOnytó—FI: bvÈou‰Ç§Íäs æœ^ny/x·ÇÖ1>Ú&ùš["2¾´Ápˆaõ{m ûK�M‚ Çe¯m¡Ž�¼ ‚MgG¸~¿¡Æ™ô^êÿ—³KóXÓ_/}›Ål·4(x’¹ R¿Ò–�n×á¶ð4ü/m'4D¶�Xi(‚tâÄÞaŒÞw¢J'atNl�ö·@¾iŒ£%gÏ�5üy«ßá€rÕ˲½mR 7ô¤oNˆad�Ø‹:)º«‡Žqvh³ì÷rŸ9 Óyóo%(‘²]x?×ß…¯mX é�‹è¹öûýåÓ¿ÉWc)ªa`Ó÷ù›¤BÇä$C�‡ÃTÞQ¡ Ê5M·sû›J’:Á•í©©¡:ùuG}/z‚�QÝ~¼ŒQŠ“`†ªneXR.ÉŠ�_àË)D÷zÞi"‹Ì|K5Kªc-‹Ý)öi0â‘ß)÷6 ¸Íóçi·çw,å“#î�Z4]Lñ@ÂQ+µoph‹–؄ˡèÀAÏ •åþoËúv·+ý‹ÿqñÞž¾°Ù¤›üÿÄg»?�D«*.+;°"¬3þ¶ñ­œúEåëpOø�½²oνn¥ 8önl�Ç!tÕÀ˜Œ[šÁ2{$ÓØ2�Ûß×L¶N”¯­ŠÖŠâ]Q·8é§ÇŪüg’.Ñóýï*MC§äþWÅçîš~åˆïP�œ†z+ÀÏ[ä'³¬µp#§èGM)#ÀQ…�é`zj„^ã‹°<Çšñ½Qæ´cHÉì3Ôá@ÅQ§!~S„ÑÊÝâÌrn¹³¦o�•h5u*Ú�e -¥Õ�*®w^…sE­G3F¬ˆ²·ÌIÇv;„¹ÒLë fp±ÉlŠjÿôè�¾„Fël EcEÆî Æ�alëÜIxç+dOÃì&ô‹ëÈ_½ñåë+èIî² M(î¨r¯7¢hEæË¤;ãE3^"yþcþ~TÁQJUжÜõp®ì{™U- >Åpä@þÊ¡©SRM%—9­!8ÇJ””Þ±·?�ŠùÂ%b¸˜^w²œ)½ lxñè:*€íÊVñòFÄѬ¼æªX`[ÁÞQ!å2oxÀ´ ëß-š˜—¾õšÁlrD$tôýáüêêDÍÑu�òaþÞ+·õC¾Ä ›uüòîþ(©9�ÇC:v+ˆ-F”‚â1 8ÇŽÙ]Ü’üDNù†Î'_úþª5ï–+ÿAÜÏÉmØ#)ÁÿXÏú^Ñ;ƒ$Ëø¡ÁC3GJ|4\.u;û„Ÿ&²¬g¾+dª/湋z(ˆ!�·v©Z…ô°ìˆ©bc8UUT©r§´¬×‚¶º)ž/¡®F9c�sœå]õñ\~î#éðJ¢hRu4Â,ËãjPG!ÅÈ&ØÏù¦Äû›mk†™*e6/0ÐÛz•ä]o"eKÝ�eè×DË}Fµ²Bõ1¯ �«�jaåÝÓ9ÎDLœÜÏ»wà.RY3¤§rÜs7¹Jo”y<½ñÏ8·©Á ¥Ì¡&wÄ¥)ÖåîÈê_×ã´åŒµt^Ä=ç}¦Å7oW\îkÃÄ-EN�Ýjñý^u^z�úq½ø÷WàbŽ)÷Aóu’ÅR+Ô/škËóéÍÌe×˦„^[¯DÎcˆâoãö)V 皥ûX™JªUvÎ�¤Ãâ# HZïxÝ`Y"(”#Kê³9ÿ4°T—죚x¡ïž}ƒß ë>éC•ÙMr 6啉½ÞKoNl�Z噉§¹Ònù–þHˆr ›;¾Œ‘“r³ƒ›µÙ1&EÁd�®Õ®NnlIÉ)5=²…}>šþ»âûä9Þ™Ñ _ŠO 0¢3n×™¿s‹Ís×y<‰–î5ɬg(ÏÖ<À’Åë÷sÌVqÙ¼açmyÖ}DÁ¯ˆ++¾Ä¶‰3Žè¹WÀ;ð¶ë¥ƒ¹ x§ºé ’NT'or®BA·  úók¾>xFâãiÌ >¥X„'¦š\—{‚Ð�–›¸«�µ¼Õ+p‘5§7¾ŸÆWÒš½*ÕåZñ3}¼:ÉÓ”ÄÅçxR¹²«ÄÕë8+­öWÅ•75]?S[=çÛòbñž‚šÝów›9m¹ëk¯…»hæÙFͧî=²>‰¸ìD72m}n s ½ ª‰¨ïyÿ~{}xÿ»×=:#4&!~ Á«¯¦öÊêïnSü»¤/4_.ç[T*†˜Ä” &5ÓÏãÏýëÓ~¸ôs¡Ý½``†Á&ÖÎØ™�õ!Fýd´¸ÂŒ4°$Ñ bˆ�¦Ò†šh"lúŽQýò•Q³½*Z}áb†r#‘W$èšIŒJPˆc�À08ûgË¥ÛƒÌû§½LÎS´ £LliŒxYõü½YÊLãua‘'ÄžIÐxKë·jR~'{uÁBR…(4^~¿<ÿÑ´�½¶äê±Ä9óE3ƒìê–,¥%r]a˜Â6}Sœç’°Œe"»U‚ $%\4—pô!I]yú$gdF mÍc“[õízWž¥ßrÉ€ËhÄG/x©A¿8x{„6àøƒ\t�˜á«kÑÒïúËý|=¿¬áF'Ž¡ðÉË6ŠÀ6µÖÀÛÂÜ㋰ǾzŒÅßP{Á!ñ½T’Žõ ;ï+ êÌåµ1“âz}Á.ú8×ø, Ž|aXký›Ìð„^O…ŠÔOï%ƃOÏáðÊ��dÔ¸ 2R­cÐ&ÂB® “”¥0ÔÌíDGÛ0 ç'‡½pÀð�Ø£ÕF3 ©Jä‡4Ö1ƒ@²i"cŽXÖ$°¬¿z!ÎSáz/aR¶éf•Ž�£vRNb²Ö ¯þñVì5ZêuT<$[‚àEAؘø » æH|ØÏàbPˆÿ¾Š1ë'‹þf²Ðž0k‰!þ± ¯`â".ÀY…çÃðOã/ï‰Oyž‡•V!5F·¨Ãp(Å]!¨Çú«Sû€†#‚$æÒ= Âq}Ðw,§ûرk G~ÙׯL¾ýЙ‘×ÓR /ê‹Ç‘Àj} m©ô\Ä>Ó!ÎOŒšÿ$oFËî1Ê{j³!x¿åb}åkŠU÷Ãò®fVI‚�°8$әʈ� ì|±n!rù™ (@>xç½5�Åv1¦ÚA}ø·\¿Ê’!åÍ2F64a‰°cÂh‹­·tä`8;Uƒ%c2ÞŽÖ­ƒhgì„ä^¨6ø¹ÕÒ›B{+¯/±¡²’.xŒRJAÁy5Þt @ïLP‹ËK••¡²æ!h¶¡‹x¦ZŠgò( �Ïßn½ô»áßßy³Èõ¾÷ó|¹¸araUÔ´¤qeLï%QP´šÀ‹©¨ZÃʪJ ±�•¨Ž«‘¿á`c%Œ¸D4Ozcáo�ó1Qˆk»%A‡“F&óûMN;¼GßA€ß=(À"”— ‹êáÂY]j§îºˆí��q|+ÒÁX4C±îfÅÉ*)%ÞbÅ^@þÛ(ZfŠ~I¢z1f.�pà_áw^d+—„W;`(A§©¹¶ãÈ-doî| <î? ¶É+:¼ªt»ÍBÀŸ/ÍrD{ܯ½~¢<¹ BÆ—Ìó©W[#Íik>�7�s.¸Ùº»EÁëªBÆ¿F 8!hϽg¿‰šÓ%Â¥øÌ‡qåÙÀ VÌá8+!ZŸâÄ5§²Kt›¦³~¶PàK+i®õ1®±6e­›lñ†ùè£ôÁ /'ÓÁ¯# Û­;û³Àñ�Å_wÂdÔ÷¾øR€§šÿ}_6Ý#«ØŒXB (æAU%¨ -G/‰Ö­]®ö‡ `@7*n1ÈD¬ÿÅìÉ ;e…z–ÛbYŸæ1KvæÍçaÀý]<©U»MëZ8t –ö¨(óžæÉRò°­€ór»¡øËB2.æ!;LWÚ‹ßµ›KsŠ1³ïZÝ0É/H!˜^)D¿‹mÔ�[)ZåB:´ç5voTÑfÛr\\qrB ˜BÖ˜`U@ë¢î Á^Yy#,>fêë°åìµÿ˜ ¬“)¬�>v€N¯?¨ ?øÿÿø0¶»à¥€@ØpQöÅ«B€ƒT4 šh€4(p à :  ôîÀ`t•ö;Ø@"€ôr>�àZ€ ÙT¦¯�Ç  mÝ W¥Qà9ªrpr¥R´ ”4½ÝÑÀs8 ÛµÜëE 'TÑZ(@ hຜ¥7ÏM¼8$ +Ú›�Žtée-¬1�ÛäÎãÚïcª6{’–¥;»ìZ«¨¬nVÚÛ9§HP!ZzVÂÉ€Ùb`±R;0’l^-yÖa8 Y„a€ã�×�!‘@äŽ_™ÏcáØ± $®äÅzrð±Ü× %.n ÐÝf’{9NîX–ï’�(µ‹�±å´ÁÎrî·&Lá{–!Ze‰ZÖÚÝ»DT»ê¢AÞÕS¥n<ˆÒ·Õ×¹—Lg7ëYYª·œ¹æÒƒm¾HŒÓ5Nm �˜©„*÷¤U:u»˜Ò"ÎÔÑNë_a¤Ö�½¥cªîžÕ¬¯A�&í�T-)†®ñ`o��ºs [¼½ýŸM8äûì T×–çÇ7%T¦[=ÙÚËîÒŸF9ÝW»cµ,¾A\#=NcÐà·\ ËõÒÁ¬§„¡ÑwQYU»ló6#&žœSh ­Í‹ö¡ZzûÜ•õ§Bª™Ñ¨©�[­L8 ¾«T÷$;èðÑ¢,ݳ—Hi$Jª‡-»îNáhð;|×’^7C ßh³—FÖßú[ÂiTÊ�¹�®Ê[ŠÚ5Öû}°æ-Êá^íº”Ï,ö²onæAº‡4uxfD�Fçec9™™i©Æ•qÇR³3C•Cº]%vðÂÂDŒ]͇Lô¬ìµa˜,èSxkÈš=„f b�È7"|åÁÂ¥¥k^$2òönodìÇBcÚ±—§Ùz¯´ç¹bÊX ª\9œç`ÁGу˜/‡VUyRV29&¨9º÷ˆÌ¥Ê1;Œ;ºè6½Ù\k«W�£Ü×_oRìNÄ\ÖU¾›„X™G<·¢£¾Ûã—Ðp±œ`„KN‹ªªîŽd ÚΩíW\ǘ³0)w�¤¥G ¾àåš!Æ-qÇÓÝt¹^ _UØì­Áf¯9û�^NÞíFÒ j±‘Y¼–Ò7ga渃ÒÍ7œ3–ò«+ÑílšLnï‡U,£[�un×ÞÔ/‡ƒ9³.éä¸Ñ¬íT$® ÉÉ]ìî±J_uõÛD7O¶ÐwêݯEØš4‰žÛtÄó²°ÙÎó·/¯o›†�.î½Ä<ªV6Òww}Š¢ÜYr­m[ÚCݦ´¢Îl!f^ŒÓËtu-×k0uÂý�Š>ÒÔÖV4¯Tî ¨HV¢©ÔÕÅ fAÒ› ^Ö+¸f@GJU,„L>~¦î¯:jVÙÖ=¬¨— “�r,fKê%r˜¢ºjS®õåG§¸ü{‚Ã}w” â–"°f7.òqP¾ÚÒ^9‡)¢U'Idݼ‰(j»3'j½x—¼Y§râB;Ë�©ÓÒ¡’P7*óÒNíqÕè銇�£s5]˜oG*á]ÖÕÁµ«F9¸iÚ~™½ÊÞ³yfæ^aáU0ïF¼±3{ ª½7®iö.ºÔ롵ºê½“sh-ÁÊŠN�]0y†ò�êÂ�x�yt‡bRçuB±\ª>$à²úîk—ÜuZº¨‡Û鄾¥GVˆ%9HÞ:XÐ÷ª¹W]¹1ãeîÔ‹©Ü;3´Š„˜vU׬®4hZ«£Ô­çF¬çW ¶¹.ÉÝ™”$â÷…�98¾äçY]«ÀwÝfÈ´aÅ���Gƒ²“Bzì´jokaÅë+¶K†3ΰ+qTºÚ`Ž %[[̹1Ü)AÔÕÔ¼ÊB¼‰#Ä“ãâ ’|G‹ADŒšŠØ��’ Q€™3d D6MIMÖhÆM1Š0¦d„É‹E© ŠB ¥ ŒLÒQdhÀlPI&�(Ji66bbQ’ J– bCE&ÌÆBE‰È™LƒLÊ "dR0Ù± 4)•cfFR”c$&IM‚£dÆ“1¡*&F(Ò0š1´lBŒ™ ‹% @ ¤‘2i2i¬†Ê¤4fB&X„L0R�i`T˜!4Ìc "Œ€#DQ¡ 3R0b$0±A„‰¢™Fц(È‘AÒ†&ˆ¤™°R1fQB%,%I„b1bŒh¦IÄMbI4TDRh5"fV1AA²l‰¢SfhÀQAI“ЈfBQFÌ@ÚlBÆdiF–Rˆ6$‹C$h4™D! ‘1dXÒ†hÌ„i%4£¡-$�$I–aQ²i1”¤e²�"CÍ0Ì dÌL(1i� ˜˜2Ê‘(Í0Ɔ‚’H˜¤LR°°É4iIˆJP‰“I„ÄÁŠ L$¢$�2‘A2i-&b ’SFÈ"``™’1°“©�Š)‘#E¥ š†‘F´iH¢M I bÅ‚HÔI™F$™±‰6ŒV,‚H’c`´k&FI4£LM¢”¦†a¢›CaˆÈ°d²LQIQTX’ZD0FÆ‚Í ”4ƒJfņ3BCB*%Äd2…,ÌCHM m$È–DØY¤b0ƒ#2h…F‘€�Z"El¦-$Æ´”`©šJŠ %DXŠ"*!²¢¡š"’¦(†ŒZ"¤ )bM2f†¬ÒL 46Y‘ÄI3#6&DBBÈÈÙ¤˜ŒF6С ”²J@šf”„ ‚"˜«É!‘1Äl‘˜¡$Y´RdmC%3"Ìm±²&‰‰Q‰"I ‹ˆ"$¢�“ ˜Lc“š"4ÄÂLBXšBÄcLQ”‚Q�LFˆÑ¤ÒÁ“Œ¡¤‘„’J+ ±%E)°‘F$˜†¨b0)0“@¢�hYCF`”’$Ȉ„Œ, Ù"�PšB¢`¬”¢k)&ÅŠPÌJ ‘ƒ$�h`šA�Æ1I“$¡‚Ä"iŒl™&lj b A¦62 ”Œ“EÆ@dÑJŠJŠŒmD›HS# Æ1ŒÈ64Z) @ÌbÆ’@Ìd�Ih¨2£$Q¨ÂQFŠ ²cL#ˆ“1 ‘& ”ÉŒPfA%„ÄDÀhÍÂA6 ÁÆ„ ’™QŒ`B ¢FH & #„›ÀI™#4dÆË1‘@FF°@I²dÙA M)4QS3MD™4 B(ЄŒI%�“I£a,Æ664ÛL’¼<žQx½h¢´,VΡK¶J#n RÞ9�E„VÕ>YB�PÕ'µ›�o)á™é7uuîҳѳľ§gÀ„¼Á�U�Y×”PÓ­8†«2^û¤éê“D>» %Ρ©l¡½±Þ!6!|ûi!Ûz47»Âsm4x6˜|°ê!œ¶Œ²8¬·œm[œ=Û ;„ÏMç¦Å+½[Vg{Uaº.¥RíL=\åFwhê’¯y¡³v«ödBUµ2ý!n¥lj®·\ÐIñ!u=Ž;.E³«ÄßVWneΕݚÛÕ*Í4È{’íñ #SÑiÅÑ;¦ —v«…\Û â;UÚÍöƒxÖ•Ø\6ÂMìvu¾À`Ùi!ÖCãH^ñ#¼\7EœèƒÜ ‘^Þé`­§dh7W›‘nžKbµ�TÝoP¦ÐÌáºÞõ<¢ û¤‡SyG±sjé ,.x—t#v+>Ê õ¯<•㙾¿KwzR^‚±AMB4‡KvöfÎ6iLÔç++ØI†î¤=ì.�‹²0Þ›Å+X¾rÔ½gl_u> ß>•—N #�ÇNÎáß>ÈÕÏ\ºàº¶&õÕ#È{2OoßGÇáD|ùw ø;–Ãâéd·yuÏ)ðÃpõÙ eÒ×ÝÎWIÉ_> ì#O1ZA w%§Nh7†”³»Èá ‚©w²ÖJÒÆñÚž§Òòû�n�}ÒÅJ÷_!t²ßÙ¿J�CV*‹í;ìiãdo ³’6´Õˆ?¯¾äÏÝVzÂﮄÓÌÀ€Läëéz/Û[»ÈV)²Æf›Ê9Њ8çºZÙ—–mܬ•}6hצØïX öíÃOTÛMÍé­8¡ò9P]Pª V‚Š^9O›¤ðÊÃGËh^' gôõ;«ë§8ÜÛ8ÜÆì´¥¹�d¡ØÛu·“%ìrýÎñíE�Öc�œW2ŠXÆ�å¶/UATÝt¡Ü1 Û¸ÎÅÀÜňE„o§Zx"ëÇlß>¹uåhØd½PPw€ƒ�¹‹¢–luö¼çz7a³ ¡�á ß¶ïqº]•‰“½ª¦c»RR꜔upÓÒž.Êq[ÐÔVjãÿ_¿ßÛõû,%ˆÿé þáükZ(,Ê;›NŒ´Èÿ¯å"ÇðTœ’j…ˆÃnˆH[¸_àŠ£—jÝÊ(QI’S0Ä8X•ý9tÓZ€˜à¢,ê‡)âpîኬÊ2mWû¥�GxUŦ™ÜqQÿìñX%)%d‚¢VCn‹¨°¦B$ѹße+5ƒïóü·ÙŸêÇ$˜þ¶Æù–�÷~¥�ÚVøÍ0>ÝâåS?ÑVq²VY×Ó‰RDê¨g殤·þ‹!öZbëþw\ÛšPb50¶&Ú,re=LÌ 3:Uƒþ©±hª¨ú©¿ã¯º<¾/O•4�él˜¨þG¿U­Ú¹CWc¢î½›2€eTË£öœ�š+Ü�Â:¨Èˆr×?ñÑpɇn!rqPaRBm¯mÁV»Þ˜:ÓFMå"øJ>œÀ@‹í²á‚vu¸¡ 1¨x´³ãªý Ùþ«�–P‘)Z…æ¿93s6°fe\&2i„·mÁyCSÞÝ�2œJâ–jµÞ™¢ùŒ ™ß$l2ú\~GæGd;±yœJ&c¼Ë‰fȵä3eÏï5(ˆ¡F�TžÃš2,ˆ ¾^¸äI"Ö%¢AIiAÊÍ(/„%9ÚÍ éf3ùù™c’_ÇÓÛôÿ×J:«Ó9Òâd‚ðêBxKÅ„ïHFfèÌÅbžHŠ_º�ºlÒ©�cS ’:«7<“ ¦Šd…ˆ†_Øú仜J¹`_ l´Â†VSäìÌý­LŸ[NU—ÇCª÷ÝX‘Jˆ1“Äþ·£¢­±(ñ»£ùvb‡Çí¼¼©»¬‚ì,ÈŸ2ÍâÌäXO©iø˜� Ž,Ù*!�-4È1R•Dž|\kY�ö(’7hYí! “2â‚Éa4„ûçZ¹¯Ì…R9Ž9¬øWIKTA#ƒçŠ•¸¸Á€¸ªŽÜ=ªx-µ’?¦óqžµêè´Ž˜S5ý˜"6v… Âõù~ªMvx�1½Š™)ó[9fòòÂ|ӛƯ&`©É !äVáŽsò§G'¸ƒ;@)ÒpéÁÄú^µ·Á£ÉÈ#ä;ýKýí�Øôn>³å+âŒB,>^ü�ˆ» ûnaµ¼ á i¶š)5ÆcNkßêt`QlAëDSÔ³H£$¦` 1'ª`‘G ‚ÝB ‚TsÊÿo'ï5ÀHøB>G*52i,D-ØD‰2G�>'îm×èÙ³™¯Q^©�G…ëOù‡á–›ZËLX Éz\-Üâ‰#qœÁè$E¤ˆ®¤´XŽc{÷*+‹æ)ˆbd„L˜IþÌ.¹ÍÈœ%Íh¤«ÖÕdʤRÊ}Osd÷#teÒ³² Ëj¥>¡ÿw˜t#?‹P­òFYV|»˜úx=@Ñ£ÃÈb%wÕ1‘$í¥w)Ì.Éu4l?�ÜÇι+º îåS÷˜¯¹ã9Sz=©Æ¡.ŸË–p�Çyk2¼ŽW$f3ˆ!F’°Ò³,ikãpôÚï‰�Önêkw8²%6ɢİrì¡J2­ñ"ƒø3§$³’òuö'qÓŽ!ëfíÉÞîðýb.Q=_¬Å`Ê;Œq'N˜pÎ ¨á4`Žêj%ÕûrE¦Gqf³|úp{Ù¨ƒ¸˜€üYÞ[Êy”²7u£]•å„ã­@iJñNáÍq2¯#(E-Ú„Š�b“"£CX€³ ŠûÓ%Ý Õ]¢îWÛ‡žÊ96p«³T§•z¤w$ïŠÑŠ’anJ1•¹ŠDpë2ßt´x/0h÷Ï—3Gˆœ¦:+Š@’ÇÚ 3;;ˆff-[êmÑ$?�Û©*ÏáËüøV|G$µ­}—IS!·§eݤ˜èÎ¥½ �‘ò¥�-v³˜ú]ÉÁé"ô˜�V"Ù�}SÕ1gæ{¦+ë4m2¬´ª^Õ)µ£¶daL !$ÁSBÊÚhÆòuºî3YD“–-ù·!W½±¤&�Z‡diGUìÆEU™íiŠ¡�¹ùê3³<ÅÂÒÍgˆ[‡Q¶pÖœiL§’Ë�˜vßß\Æ…y½h˜§ÛÌIãÂä/ïÏ>ÚºûbÕsé ÊæåSgŽ›*éŠfä· LT`ˆ5i¸ ŒÂÅS,2ÊžUD”’„91ë\ð$èS —K˜Í¸©Õ3]©ê:¨±X„je±ÁAÊö”;B9UÙ³+jf<ÃÜ¥Eatl1(²Ú’™Z¼±¬Ù9~ê\šŠpŽÎŠ=—ÁP²è¢…å•ÃD4ŒÊÔÝ®¶žÔœ�ĸ,$y,ñA •+îõÔâÅŒå Qü=2UÝà x¥ÔÃ#VÑjDü)ÇK9æ¢!S1Ù‰—1F”8CÝl8k)sÅj|CËf+î¦(ª¨8Éã2(� H¦ƒ± À&ÊÞ¾ïS­Vц¥ˆõL=‘’àB(•ß>Þ$P§…¥%O=u^µÍ�ìÅL@DIôdÙ˜™.äd3ˇhFÒ¾MÄ‹„™N’y¾¯’�È%pZ|·`gœ:ç’Ž/©h ]/Ô¨Änp(¼¬t½¼@%¯nZpÃÍ(Pùö˜ ŠÉVm¦z1ÔØŒ~40°üÑxÑͨ0G§ecªYÍÇC7Ó¨@ç!>fϲ‘²ª3ADŽÌP¦�+>ãÍ ª\)`f¶Ñ"Ó8gÃ/’ŽÞ’†°„ F×v£ª×¢Ȳ $aêTÂT¢'ÑÃ8rÛL°Æ2Ðf ÉORÄ3Kdy9æ”þ0€/˜ÌNZ �«hãÑ‘@ÉÄéŽ\bˆTŠõî-Ô˜]«!Ò`ág…ŒIœ)QÁ¥a†C£„a¦GLŸs �6Ë`¿d²"8X:AH>ønÓE!0z´4d‚q ¯:Re”LE‘%‚ADvu(rEp %m᮵àYÅ !D Â\(:4npÄ‘ÁÄ|ו*4îÐÉ‹mè„@| û8X¨J`\ 0Œ�$ŽÎHÖm²jÚÊÀdÆÈ`D!J ,‘|§ aR¹€í„†Äi² 'FZyÑÛÒ(<#ŽˆD"œ¼ë,ž(¬S„À‹––j&I„RÓ í¼`œ±[€ò„9i,°�ÆŒÂ@ýˆ AÆR){„ BÌs= àƒÒ¯q?d"3 zlÁô–àìã%œy¥öH£ÖQÅÇØÁHd‚·¥.»Y3ÊÄ0åªyŽ›täñ 8c¢ž!bú·Q“Œ�°¡ ð ƒ+ÛÌS‘ip ié£ ¦/*å`"czReIbŒÌ:h~Š#ÑÑãÔFLœé0 à–ãgÂX'æB|¬ o”,þ"D$BM€R ÊIJA�CDQ¬¤e(#‰˜ÄÈdx¼˜ùBƒ”$Àù5 žèN¢Í’FÐí�\EÂÒÂ'ç�œHH!zl²²{pC+´< dŒ‘@øpºÊ`œ¥êP³�dp3i®dnÖ*ÝÑ˪©y"K™átYÄ'-¼Äm`Al‰S+&G ^1' ¤FÎG•:l´ ‚IÅœ$T(ülyk“�}gAòƒ¥ø@¸SHl¢réˆHE˜ˆ �OØå ÒɾðˆÄ¬3Ž I%qŸ©�#ß�ƒ™@|„ 0¡ ´ûpÉ>�ÞÔJð™€P$ð› ÊLq†Úažm{0Es– ‘ÿÆž Cµ£p!áë·'_)û�±ùà ãdp™rc?]JŸjÎ?íjÍ•+®!’OÙXï(L•‰KÆ H‡£ŽØO¥øœb¨�¤)[!ä¬G\—ðÏ´ jeiÊÆäª#õ¤4dó®C]‚+ÉD‚pÁì² £ñ/z¾„Î1âDò”ÜüA´­÷îz#v£ÉdécÍÁʈož8D3“õ,çÇz@*(Í…km›3VdÂï†8 ³ k(3£�µÜ£‚- �©„f�<%Kgùß1d’@øp©Aàˆ×lQÎì܈E�r±$,x ÆŠ„=Í,*2}y�‘–¼@fPyJ®XÞ1ã(R2ŠPÓ‹JLf�Æìã” K³3 „‘›)HBÁe›ÌB‚ÃA`$‡\)0º+,‰Ó‘Ž :(ÑÉÜ V' ;-£DœrB´ ³Ž�p¢PêP0‰ø`W³W|6%d‚Qû(<`‘¡ àÐm–Q‚EùXƒÒÄ¥„\”ά)H�p!‰ ƒ•ˆ,ˆ$ør`•©‘'�hžÉ®)�Za P!�\¥7î§£WœÄ;HÁ /§ J!Û]wÇò¶GP‰=B³Žä xJ’4Q$ŽI^œk–*�Áy‹P }§Å° XéoKÔ­�;”d ÁÃsÁ.óàþüüÇ÷öÿ“Yüoôý7k�y�ývFõß°�­—ïQCœó:Ú}G53_¸O}tZ—®Æœ•Ó>�Gغ‡e)Í9ÓÔ;7¡¥xìe"p3¶�ÅÔw×v%煮ŠÝ)a^‘ ¶¤Ã×¼õ†ÊI.êCU14¥^âã7wk¨Vu YB>³{‚úß9%Ó¾Nhwºš3sž¥Âî·²ø3.îÎ ®•ÝÅ{0ñTf¾ŒÃ0Æ ô® �PmS{Ý6ì)ä�¸Uï<ÞÜÝ@¥Ýxò8!mnì¹Û(#AÞo©ß½g–Ê­Æ÷39J¥±TÙX³Í²Ž,Ný5”qä¬UTžÝŒ±˜•óÂݺ9½»ÇEõm Ø¢KJØ&©R`À¥˜÷º–öy˜Zœõ÷§CŽ©»2“ol1joƒÁŽÄ"yF' Ÿc¢z¡½“jÔÚÞYÈqm\juã:BªE5²B„Íã¤öTLC~é'¢GÜúÔ–­jõswšÆÉ}»™Õ´±®j>¤wE¦°�-SR\÷³µtê,`3váeJ|÷ŠõeQ™ÔqÊDðªB3'Y jÕ7¨ôb�-ÔÞ‘û2ßfcBVh'r÷ª>8žê{è€\ ïÕ *¬;«z�ki ¤K‰×²öóÛª‘ÊØôRB�ÚÌ’F·®Ýƒ¨©bÎp†“:ó]P¹GRÒÙÙˆ³E ×v…xó1Œmƒ Öíw!í{“Ò™àÓéäô– ºÛÛ®—juÇR¥57ZYŒ‡Ð�uÅa×ÜQÉ´5¹œ·‹à±ëïV@� ‚Ø,÷ XißeJÛ*ÕXÛ"®U`Ua4žÚÁÛ˜*ì¥ÐRÙh­¢d¥À­ne›}©°èØ›ºÈHÓHmíg. F­€¸.‰¬'Š=£uP‹‹¹Y�Žœš0ÚYWÃAݽÓ�™£¯úK‡*Ò�êÛÚG#ºbÁYŒÓ\y 8 ~nÎhUÏ¢ÏoO˜7©¬9“3:»ÑãÓ(D.³Sª¨d.»-8É ó Ó}Ò[Ôú­gu­¿OXg­‹8/ÊmV6nø¼…1\ê¿JŽ·ƒXÎìW§·kBS§ ÍÞƒ'f îºVt¼Ù‚‹t5^åÙ·ìÂó¥û´N¶3»w§Vq4mq¹ªÍÝð¼Itµ6ùEݳ²$*ºï¶d͘ËÁÞc©{)=ÛTùŒáš3’Ô¸‰¼NÊʾÊhíj�ä4˜ìh§ î–ì‹Ój®ÌA/r-ðºz¢¡{5*ÂòƒÂîi7È>º9¯¦ýÊuwNjþÛÛ»Ufmïp1ÍãÈU­Ywi�1JY—/&Œx)Ö‘C¸ÑX:ì;îÞº¨í¬=.ùOu:$uWkŽï�Þ;ÖÎÄ*¼º ~ûëϨÒÔ*DµÖ½KïSÁ» ¼OAÚ½²Í•p}C¹Tª¾T!“˦a¤5Á'BJŽôŒiØÏtwõ‚Û—’ý\6OŸ�1¶+p¥«så%Ü·Vš#ŽÑÝ´Ö›«ÞÈqwfìÁV =¶(Õà9[{Yµ’Á¾™�.+µ33IÌéX¼·4¼Œ¨ž÷NX‡Uö«^™¼ÉLhx£ç*… ZÓÁî·¶ªoÚZM¢8#½ª«¤“‰u¹xuf1¨,Œ.½;îîrò¹lô“ ZÛ£ÚÎî#^»+>¢9²»}˜¥õ g(ÀÅK¢¢;,ì½¼•{­‹�Ž�X¥]6µ×uZ:m;—ËMó§LšËoÎ;À�ãª`©7aw€éšŽ6»&öm 0ö*Øö„S{6‚:÷®æ•^U�[™ºÊ;Cbs2‰ÊkÍ2 QË:)†s ±5Ý×»aaTð^Ôâïk5Î=wwPuYä0‚BH±ž¡{W¥môœD-UÝçà$$D���]} ;ß,ß­yxã-éØÏˆÊ1GÛÛ?ûòÊâMæ¡w´¹…Ïùw Á¹s§Z6Sïÿì˜5—þ•}žê뎆kŠ6žÖ�ñê­]��³ÇŒpQ÷~!M+.´›˜_åë õ•G-ù9Ú‡6Û/=8E‰àÏIOÉ=ñÕÅùáùEOÒ. ²VÞ=¹}¾CJA焚ĄÛu¿ÊòæOspìjIh6”Š/xôbôÓÝøUꇻ¸Ç‡£$DÁ®M� æl¬A“�ÀböëìÖµÀ¸Kð;µàa ¼QI2éž!ã./”ޱš/�°Ý¦:˜m%¼ì9ë¾Ò´½nÊóíl#º=Öò&g�Ø Ü×N$MË>Ø�âÂK¥´ÇìFÁ9ÐÓ¼´Õ !g�œúw¶‚É+ißíDíO†)i.½6í“¥ÂÒEÅŸW}ÙËÈî)Ð9iÇæ¯‹q§',£.ÖÛïjã¦1WEGW§LsÍ%ÿˆKÄ1¶ æœ=Yq kšÍ�¦Ãc¤š9Öh34˜ ´âBB!s-οWã±3ý¿Î¢%¼1ùý¢µtIÙ*#n¤Â"¤`qÆ©¶ù‰�’móqYYjˆÏ Ï®´ 5HÈW¡&ABCIÿÄ�!$.‚HBG­ŒûuìiµŸH‡Ç––|ež=¹ÚØ®”|Xl­‡×ªkßRˆt@á7½""ÕSG|&N HL%’¡œ€©5ÉBWKÂ’ð„�$¶/}±D\Ñ«HKQíOÛ,Z"ä«1±Œ)H+ reF†Õº–‹8eç&(ª’Ê©‡" –?žj�Ì’ñË>Ï|àéÜÓç½â¦ÏàŠG!°Š8´ê2ÿOSÚޣáƒþu§Á”‡#Âé×¢'  ,"dâ@t ŒØÚBÄ’©@áŠI@v�HÚmÈJè„�$®¼��$–YïëOMwÚ9ó±½G ûjMc+â2z炳 ¦?Qc¦®ÀiEW^”—æZF¤¦ã ½uÂÏ2*‹+«†œå…�’ìÖþØÖ–ÜŠR𪂊\ÍÞ_Ò…þÉn9Xü#u5®ê™)½¥Tº±MU—NIÔà³~ÀÇ£†á�È2ÂiÒåÖfGI�ª)_’_kÎV:gï<Û’™£Åíζ½ììf~Íq^°¡9…õjq™%Tu.°à$X"〆[»%"&á Aº’Bx猵áïüéŠÒ �ýÃxŒJþ» «Ó¯N˜J}VƒÙ³(K³TA"E��le fì4ébM›´ªi®À„�d!­é BHM&Çl³¹!*¥’ܷ؆$·šÓ „–@âl&0ƒ&5UšB.êÿï@6[¶´± ŠÔbȇñÛŽÖ$ìD:4„˜w\ƒ¹ÎUE›xJ[�,„ "Í$„›J(’R$¨!"Žþð: (k%½èÙ0@ez ~J膡}¤åÜG8†\ÏblLè„#AyÞM‹`åMrý ä†›hlB)|°‰Âg«ì€,€ýÜ6Óí›h0‚½³£DOè¢à¤J„#„4ëê�� Éu§Ôï¡ywß/Cï¼¹c¹oJ"Ϧð é„üü|W¬MOI;mÞ|SØãÆ0ÎÒ¸ðnÜb�oÎ÷¯^7“%s®%FWáb ’ëͱ\•Ü:ücˆ³¦ÉæŒçéU7*Ëùì�ï·InÞ<}'ÙßxŒ^pÞ²|ð¾KÝè³-±1×£^u!] ¹7Ñ{Âö¶ñøÇ7çaÓ>Û·Ö2‰ª£7j]N]ð>¸6¹æÓ¼^·î3¡¯}z¥#íwûXœúÞ ÏÝæµêÁ¤=±ô¤î-Km]4ñÂçÇÿJPR€R™Ï:7Œ|£°oY˺ø8è¯�ý¿žŠßqÆsa 9ÿÍjûùÞ¿¶Ä{²,…ënW§™>ßß[ÐÙ°T6ìåáÜQêbüôeóŽú{w“ »”Ñ5“ úrË6Qw>¥qb8Ã[ô–,ó_¶>ôgÈê»[×|»6³ì÷/޵´¬Ìšâ˜JçÕ"æY|·MûW¾+òyÊù‡þ�FÙ3^Øë¥:›“:¿2ÛáÇ­au¯:óË‹ ±Ë…uñÚBý¼Ço�Ûuv¶ïßµ=a½wuNßÎÙ³ùÆQ;Gë¯]ßEY 6·1½¢=;¦çÅaÍO‹TÏ­={ÒÒ…}éj}Û‰ûg¬Â—MxKCVpO \”oY«ì šW$½Ù›t%£×&HóÖâéªà¾± ÇÏ:÷„½‚Ï™]Ëãö]�šÿ5ÑuÏX�Žžkœ§:ìÕ–7[_£lã„ôõÆ7?Xç�PöÂ¥pá§ÌOØûO3v¯…ã†2¦`ç÷a°›�bàÈDÇä•/ñú±kÆ>f7s¿®UölÖ>¨–Va µ›(OµB¯’xC- idøùöQÐÓZ¯+^ýrɧ5+C,oKe–$­CÝ…é M.I[™ÊÔRŠ†Ì AË(ƒ’hŽI˜�Ckg7Ms ©eÿ;Xô²d*—Ñ�QÓ鳎x# ððëÓtFL«•x»Þ[o+zw›ùùûÏ;i|:µÃ7Ê8‡‚S! ¡ÆH,‹¨ÿ$� !YbŽøùÄç%I‡_OšxtEÀѳžÄ·Š„VÔjû‘é¾Q?£>R�C,ÓØñÈ2ïˆÂyÄ%l~pb¶é”†§@$2i)`•’¹ *P LL ý´*¥¨eIöÊB…V\«£5ÉDºD’D1µª‚Ä¥ÙÀl,/‹£»^³cp©°|K?D)7‰m² Ñ%•UDÀS={õ`otäʼn CŠ …ë©BõÛ‡‘žI†µòB@’ZœO�¦Îàƒ;É}`·¶(·Ë+\-ÀȬdã$â@¥iN•>‹Köq(0\±&‚Á%]Q‰s˜R³ËzOjö¾®Ùrûœÿ#-ÑÕ›)J�ŽBŠhÓhè**œ#ù@aRªmBõ¡èƒ fV£LTB@’]…¶n;®ÝW̆þ-dì“T+v1¯U%5 KÁ<°\œÂdi3Ð×zß*Œr)G TÌ•ÖÕ¹%ENEÈ’U‚J*¿ª£‡œ‚H>ºÙ6‡uŒ�Ñ`¡óT×"‚­BÅ }~€j  =p¥¥)I¯Ôw]éçÏnÞ$Ž¿˜ÙüýrcûWfáÂ�þ½ú»¡O~oõ‡áÍ·bç§u:[_f!šÃ³¼ÌJÿÈÍ´Ç‚ÜpžüsHè÷?bt_´6‡ròüÉŠs6Þc-ç/oq[VìEñüN²%5æžHx�(Q½–¾í?ß°¼÷ù…»ŠýâÌwSîšuÊâi¯a³²)Z©5ø­é†w§ø¹#ñØ>„¤ ÛŸ¶ëÿ�~æçÔ(B4f§mi–# ×±Ðá¢nSã`= &™�|›‰³ŒÛz¬æ0Ô"(G€RÆ�˜ÑÐ]%Bž±éÞ[<ŠãÓëGRxõ§•ÒmŹ�ÙÓ^е¥ ´6™£µl²l/ðy-êñézo çgøßÃE‹`ß:êD[ã¿o»Ïß\+m3sO–ßîÿ¬îWµ8/ûì5›xÙ°çH!Žãm�®Òùd¨è�mÛÛ>"õÏWíhæß nÂH_m£L²6Ò2pc\%i†,õ>‹èùšFrIU•´­§†�W®Ò“üËeÒÐÄŽÌd.¶ˆc{‰œìþ˜/zBèx ÍÔ®øuÒ1šõËTà# ñª_nÛédçHŽÃš¦ºêœ„öõL«vÎ7æqCÛKm¤+ ÃÚméÊâYI8A’¸›®¶éˆ¡0-¶×D�¿xç­¾¾ƒ´úÞ C_OÜ5”“ûþ�¬b\6»N�_~›ÇŸu`æú-Òó“Þ¶”‚5yì:^4”lÌ"zm-OݰúÕcåž"~-m-2pïßKñN}EoàK¸ü?R­ÒlÇÂù:n¼OY»«ÏyÇ®o¡kópÏ•g¯¦éUã&…É%k^¶GÏ%¼G`íÚÏVŽ5}åžþ>��’ÚîÖtàñÓ<ñ?nßÜ0e°ŒªúÛ̧Þ~̛¬°»%$²ÞvYµ;¿l5¦ú¡!'rëÞ±1Œ£®ùÉ›Ï�¸ÈÌ⡆ƒa{¨¤4"Í'à„·²!a]Qô�ÅñW·”eÕÖ½‹`»¥KH4Íš K`stCKPUg¢»ìrš{×è“:ç5+—ŽñPÄFœ�Ä*Gj›¤P"J¥%ö$U{Exz ¾U¬�WÊ…«kZXMeŒïëL^ *b11%_ðŽù£{\K•r\²5Ù·9s©½©bz"ÉÈ‚‹D2E˜Q6 &Â0?Õ8�Óíú‚~ kQ}Ûi›jÖͦ£n½5U ‚óq…¤³:sO,¦K²_æ%²kGYÍVeiwbµçå{^öÒ×½"ˆ¤Ô…„Ûl(…�¦Q´ÇËòBúÒ—¤×â“¥«ïC³«C­gΞÀ"ù�r4é ÚzÐuª¢U$À ˜Æ0AãÑL?�õ ZE°'þP®·ï?j·ª…}æUH´�§lÜY݆ô²ùRåæÌk`w³«�Êèùmƒëâ…ŸÍLgC°j˜RØ<‚’žÔ ¸÷qFPEa¤ÒŠY¸šÕ¢  Ñ 9¬èÒ¦POJÊ£][e‹�*8jñ;5†Mˆ¦64hlÖµF¾›¨˜T«ÖŒ«d‚M?%d`R+q%!ZL�BC�Ð8jdŽá¢’Ñ$I `YQ±’¡ffg-ü¾k6Ωˆ9ƒ T‚Ñ–�_”ŠÚ�ºD[Ú�´ e‘™Ž{ži� ³ÄkMvgÚGͽÁ©`ôãéuEËÉY Iy@¥)]»Äûýçéú§ÍYñ¦ì̫ߌªâˆ¿UIlÊî¸Þ[&5}̯å¥Ú‡ŸM=Ê—¬»uß,£20–)¦ÒßK—:sÙwJvò÷†íÛ°åž4ÊSwCK~{KK–+â.†]øFm ßg�õÃ1ÝúË÷<ÛŽ¶¾Í}”nñòœ7–à¿eÚDÜØc¶;±å醴ìá·m;[Ó½ÌNÓ'J3o~Ía?ë\�ÿ¢½@å!úöTÜqßám¾Ù¯_ŒË’³+¯k2�µ½4šFç7:ûëŸ~_çªúß¶O¡jBòÕù-ók4µµ‡;&Úßõ«}âÐÈxÞ¹Àõá~»ã:¾¨ƒ•¿ºàwwºÏ�v¬ÎÒœ3é¤ÊŒKÓ¤$!ê¾û¿·v‘üŠCÒž�ókµoÕÅŸ4�3‚òœD´á0Ëda2#ÛiÙ'äÉG^<§Ãõ†Õ )Ó¾Ù&CNTiâi=�¾þÂ~íï¨]¾G4§'¨ÚR?-Æ�üجÝ\y{zO¾sÜ¥:w÷K ßÔ:Ùp)6>–8î,kêû½æ~öÅ8IO½¹‹{?xþ³½ùæ\Î,Ó;iëÓ1ûUj=_iO¾¼_2ç®Û3O Ô ©a–¶‡S¡lÑé¨ê缿—¢ÁŸ<Ðq[ve¶È¦£¼¶ ãQç¸\sz.úïóÈþó%O|,¾#/ªÓÆÈbÀþ@ØÕ˜¡&T™(¹µUAz ›+%Â¥-ºm‘,°Ú4'¨Z ffò°¨– ÈJK÷z½hTuQÜoœÀ ¢A•n›!Ø¡±�nÀ8º»D(Û|+ ¨nYB—¨:2˜AA`v ýk=ßEîK�a¤óoY»#»n4½Lªµ­"œ—+;ë¹!IH’O:L˜U™F·M4§!$ÐHŠ”$�©š�šRvžÊx‘åÔ® 4B¯¡áâÒÌ|ÖÃtßB²1RT¬' Y$j·F„EK0˜½ä¨ègdPTC/TÌ¢´B{¤(¥£°øzvƒóñ¯‹ý; ðºX£s6·™š !w�5§/1C¢È;PÒí?zÒŠ„ Ã4ƒ,†×_Åt‘5‚ÌíÇ·î�ˆü™Z[²Ñ‚ ×oTº$le£oWÎ}=enœeKÊñ|°ø}¡J,cš;М­Û-‚µz,-pDÁúªÀ�‡X�éYÎpeýüJ‚šßûk�µ4¸Ë-"8Â#‘édPóÒîUÃU)B8×ˬ"ˆÞ¨²O¦!31VÛµ={õ³Ë͘)GŽü´,^Ê=ŽðÅÉ]uR&�W:Cwª$29Æ—~;¶Ãêó07²¹t±°©ÈyjuOmmà.p„Æ“S |¥ ¡DFªV¤ E eQH)`Q@£wœNUI‰DY�!mã!°–fƱ­±šÍ<šåØ5Ncêáêr{X:'”aÞÐvT5]�¢…'mŠ\³l!Tf­Xò‚¹H°M:¬Ð�$—#ÁïähÒºJQ°Î;ô ùÉä ²;^©Ѥ‘D‹�Ùԃкü^ ­ì�‘ï—¾}ÃàÒrÌ èÓKd‰` U�U¡ Š@BÍ™©@åC{CUîVŠê—¸BH^~‡ÇÏ­|ºí>ݺNy×õÆ�¿] è³½mOZ~!2Û9”{7»*÷cHµè&—©´w$ZÜøœ¹×‡Øe¾e¾ðîïÝgš~F~ÑNÛi¶‚¹J�˹|ÒO(ØNÉÖSû_� x!བྷïPGï>(0ˆ;]×ó®[ïÀn:ÒÚS#z›éŒ}úÓ¾¡ÉfŽžð 1`û°ð”ñ½î'㔓™èíHg~!†»v üÙ=SLºžÖÉO],Šž#Ðmðkè3ný¥ (nážÍëø®N kŠþY—·É›˜š²95ör‚ŸÜá‡ýfZæp,ÀûÓé%„˜½ÿiLyú–_jÕ•��)i¤}«âi­ïo¿3y®º’ÐÇßQ}'rZ€Gêª}¦èЗ쑧m3úž¦øç×~y†ÐÍ2¥Y|ï–qpÑ?R�h4|ù¤×¹~Þ»=‹¬©·¿ó-üŽÛE¬Û¿çéÇY[‡­Ë}‡Ô³#·ºröG¼zž=ÿOã¸ï®JBu7ßaºÏ§rã߄ܵs“qLA©ïÊ@ 4o-§¥Úß õÁ/Žå‡u�[yl9ÉÌÚÔ Î"Ý®›.5ghE~Îîí«¥ë¾_:÷éW×Ü;ßvAá ž Ö$Ö6$ç¸tyóçÆÁ�ˆÏRš‰Ô*£˜Î?]Þ(Øë¶ÓsxjôBÞ¤&þ¸ëgWÙâ~½ÏjçgÕ cÛ0.ûΰL ùŽ[Áý)—$ú}�{¶ 6ÈMk¶½*ë@ª5ØCmî¶'ðIR$z&©•uFÄQl°uŠ*ÒÍ?”`\¬v¨_½eWŒ¬=âô�Ô_`‰±nðQÐlR <ëI�™TA,ãA˜ÄQŸh*®\šŠÊhÖßG-϶ë¬�4ÄÒlTÑ�ÏGa€B Ô�¢—¤|®�[·\Xš±Ý«‹�®-7$ØTU„•X¬Ðô˜©TJO!R•6Ј’a5 %¡7�P…FP䀖�¨ˆƒ$�ç0*$¼«ãËÛÒž¥­¿�ëîýqë—Ÿìh§‡Æ¥FÅ ‘ÇR͇m|b•®xø²ZàÓ/%!Ά3žÿ?wïI!ÞŽà3²y¹ñßh¦ñ$×»vmû¹õÛÄïÔ ï–yì6Ÿë26«ùaƆ±½jßsÖi3¬ìû°®S£_·³©|·ï|£üyù;JéÝíçç`f®P¢s v¡<|¦\Þ^qVn®òž!Þ6Ÿ³šo¡yûÙz|^»â½w])Îo-?zF|íâÕëšÌkß8ãføŸÔT\ûiAo cØUÇ¡i(Q4‰*³‘Â_&í6bÞžiߦËCþ6¶Û²S<ä…1¯i3�uñ«uT‹tÛX&õ쳑ç¹mJ³¼:XÃ:°ÎhíñÃþ·îú/pÏ9—«i uÅYt}gm—•Éxv]_7¿?ö|Ûv}.•'p#îU„¹dyëâ¾d‘›…Xï&´¤°cÒ;2gFQ”[b_VUâ'åŸËäy]f0m£:‘Ф‚Y°#¥|æýŸ9±ÆØµ©›‡> S[éž^”µ2М®Ew¼±­B²saÑl $� gô4¿¯Œ_×þ:BR?ÅÂMòç®±|élý ¾êx\B4Y×âÊüiUÞÝ\ üPiÝihr ’7Öö£¯ é9kÞÒ{íŸhÆfùQOãù½-¯[E ¶ýZºÚ$ºæÅ^a˜rÐhm"X‹h©ŸH ~RgäûÌz;¹¸ÜÉ6¦ôÜ�ztvtzN‹í[�´þ Œ ¥�7‚!Je@‘{2d²QœÁ ¼š¸1 È\�?GšÖôZASòåÎûm²Ù,Êl“­Í*¸eÒ) И¨»//×—•5åù³‰Ì¤^Ñ¥s."êI^Áj”qáïÝéùMâ’¿!†¸Ûÿƒ©ÂÁ' ‚£"N4ÞÉ|cðWMtH,†�)ìZE,y¸6‰f­ 1×ÿ)æê$´BÿµÌgÖsÒÀº��+%3{!C$«UI´øÕ´ÙvØiÁ–ÍÖ‘‹‡RèBId$ %ã£zV’I´8Ÿ�R«ûFÊE´TXSlÌZ0ÂPØ¥™+VñÙ¼|/�mè®ð™éØI”é–ÕÒ¨ª Á$À_g7ã}·Â•˜„ØÆe ÚI‰�$0³ûîŸÎØ·¬*‡À7¸©ù°óéòÁüþ+{¶»F]ÿ2š ½ÿ ¬xy…Ð q½«¯gv—;Æ,óòšÔoŸ|wPH:©Ï�4lÒ…÷?ëŠ@³7³¦1ã W0ñJxsú =´¸¯kwÞuúØ/ŠGJR=­¤j\SMwš1~ÞýíL?‹?Ù›x6±¶,ojËÃ…ûP—0?­” �ñ/Ûz„ýUõU÷­ºõwëÚ[¼áM9}4ã«öbÙvý–FÜyùAß=¾Bö¸æüÀ#`ÒõÄ;Ǭ Ml´Ê÷Äi¾¬Ø±Ë™,ñ¶˜÷Ûóõ]'ê‰ïnÝöÞ k8$tsÙJ=qöÝꌷ�®#6Œu…ßUó=¨¼öi´]¶žQ”k+iüó¯Ìg¼Ýu¯1>ý ÈsôÄAþýZñ/"“3}jWï‡óùyÛyÞÔ³|‹¾‹O_|í ý„»¿äj•áï|»=µçi´é´þÌ}vµ×ÏmDµÐg!>¯M^ ðNJ¥n~Áí¼ògg!§…î|¨h¦Úx_y t3,ÉßÅã°Hlýs¡Ë›áÐóaÆ“'´úú]S·žÞ½tÇzmøÎ©z}Fú à·dª(—Åþ~9b°ÓìT’ %_Pž<ßjGpŽÛ�rÏUµvX!úÁß™½«ªý|§†µ‚É-ýNßYùíÅfCÕBÍm^ æ†,lI×=˜4ðžÛ´lÏâÛsçæ=ôvñ°—ܾ*È>BÓ£ÄÂÖh¹ o¢`aÙœP®OnRk´Ê®ÎÓ\M,Ìü&7º3R P˜QIVV_oX¡ðé¶sG*�Û\¥×7.‹ÝÎÄ1Eô€Da"òìAÆÓPª¿ÇŸÛógúq”2Yý™Ÿñ®> …®#YTD¦o¬n¢bEXÜ×íøVüçy=ù}É|ñËènækþ’yÕ@!øD �XM\(B˜XÅ÷‚�$n�–L/zJ„[[¨$Š7\¼&Üv¡•mˆ¤”¦’þÃe¸b’‘¨a6?ÂÆÉ;æW`p;^ÿtªh�ÿßîÍCR»w™T+Sö¥¸:ò8e÷ €ØáÏÃ[âð l®j·uÆýúWŸèòàR‹ãš‰žÈJMØŒ\ð ¼ , @ˆ/á$†‚ñß:Ko¬qèïPÅ tˆuy2€O’ Q¢„Ód‚#qíÛ¶iĽéô~zº!ýÛÖ„7žlLû,Á1÷Æ&˜Îu{ ÐmÛQ¶aÕBØ ¡ºÐ­à•p‹�ˆ¯©Om[6¶Ó-…)‘+'‹êí|ä{iBë6ƒÛjûlÏl\v:œ+ÝËså à¸Yœ"k å§EÓÙ;ºŽaCÍç^|˜_ÜÓÅåyjº‹ðm¹îÏ(ìËQ>Ú6ç]t›‚†Šk¼¯K´ìýaôu»ù¹Âá9J0jM°†º ¼“´¼ø…¢Ó‹;ùY¹­Õ55YÄ6vÆŽß;òT|3AÌhðÿ<~´tĵùÍÉâëÝ+5älW¹Ÿˆº=|O5¹Sã*J¬Œ¥¶“m¢®|(Õ7íÄZ�˜±`‚}ƈÔ�îžãõКʎîÞ²°ê+£ÑÛÎi¾¶âÃeü±&ËßxD{~B\Ó³Û$û1®‚ÄïdÁÞóÚ§ŽE°ƒ<¬Ç8£sDõ³ìX@ýÆó£¾£ðÇwfëat¥äƾ}ܾաsÕœ”[é¾°Â�ƒòµ¡Ã䂸‡¸UhDÓ_Xòïùaœ*4øYddoºÓñüa®]÷/“l'woǶUš1 æ7gé7«!¦Gž¼¯mqåF7ÞÏç¾`ÿ,AÆ•­\¶yÙx�¿hxïJ~cô{xÆžóÚÇ¢ÝöìçÏŠ›¢<#9fîp/ƾnš/ޏ½BåøE¡ë[ïJ Ü!ô‡µ¬r��+К§îS¥6ÕÐ�´ù±ZÀÕKٗζŢ ²>°d•FØ%?3¦/ Z[˜èá‹%G„™pâËÂÔíŽDŽá{„å èJ2‚}TJP¸û0»ƒ"Qp4Êfžµ5¢E•lsV©zWóc;Ø^ÑO×Ö÷Æ2Œ~b.í¬{ëRiŸ7Zn¸“¨ ‘¤ Ä$ñ(Eäûjó %¶QÆpœ|tÒž·ô®6z<üBŠÆúDi]qœŸ¨©ÈAžY .°ÃAv£Ò0qX8`hÜt#ù ¨‹ÿˆÔ?îuÎTîZeRšÄv¨ª‡™²!õ²?yie d%F®�*vÆŽHlò‚=PÏ·‰§¤W–O*[T(h<†‘ɈŠñ!VŽNÌ ÄZ’MPó„PizŒ‡Dk8T(Å_N´å¤¼Dxv´}ïûι_ÏË/7]Ó˜í‚y*P‚¬<¡µ@A)vBH €G:9ó§?ËVÞZå:¸ïNfõó|¤­´Þ‹ïÞ«Òú¬…›‡ê˜ t}ÿ!]±Ñ¡tÕp“Ã-ó5Do¢ha¤úPHu¼Ãì¢ ,a_Ê ù‚tA­‰ÂÉï^´ñêëÕÒjIjÎ…²§:¼9å •¶eW¡µì ô&m€¤[‰$5@�í%2�Kõ0¨*BP)5mÑQ% È3YýT,!%øzìW$<\õH`…ÞÐ…†/v�‘H=WF ÀÏ$&%îÒI ®‹Ø‰õÉ !U zƒ!3°µ$`ÏDsL™ FKXR hÁ$Q J‚TA±[AÕ Iy$� !y‚@’^`„��‚H’@„�šH’HKÑ IB’óù$)AJ[�ÆÌ3ÖÞXÏ{ÍŠ7ö[õ¬p_¨ðÏ›Ïz�÷¼Gy9ç÷›³¿úçœW?âßûI » ‘~įýOÈ[�4Q:—oæš.ÈÕ¦CX5ÑxHòšæj÷Y‚÷½kvªórHº2àFMÙIª¼ÍvwPÖJµélò7ž#�®¢£V¬¼x¿ÑÑ|&[Š£$ŠhoЏã«f5¯4,Ù•3›UÒ±3I …—•¶øn�øæBîÏÅø�¤ _šŒ€ÿà !1�!&“!´„bÝy?i~^‘4å6º‘¤‘� OõÞ?)¾ýûÚ÷tûí”[Jl"ûˆj° \þõ®MñqÂøÕêI%° Ç¿·{ÒsŒ–�0ß÷¶á¯DÆÂ5‰¥�.¥øúò!W'HŸYݬßDqªP]¯ú…§�»‰hhŤ„>?=÷ñþ$ÞJªŸLL¢ö†…?îù›g)A¸ƒ`·w7;³¸ ™ÂugÅ£a§VÖLe\g\î¹ï1ßíHE {\kŸþðWN¡Õ Iƒ'ˆ'º–;ˆæŠ�oÖ’:HÇ‘MŸjy*z¼Œù8_`”K»)žÕ‹Ê¿²KÊà#Ré´'¡ÒøÄjwmV…\Iª Ý=ÇzÀyÔØ,G]L±Ñʃž\ñ{Ñ¿PYÜÑ ¢Áº’§œµš¸Ï>—†Èf4pØ0ÐAm‹ÏþoP^!Óáyñ嘊ÖRµ Ÿ�âkš&„ß­Á¨áeB0Ù_жO & q7 «îCƒ#;Éö׺­€lE^ñ}®FvGu‘|ww<_náZlÕó‚˜óÜŠRâJÂòÆilT,7>Áà¥%yTF”ÔUcÐA-§,±{è_d׋R Z¦Á‹Qà³chk4ŠänaŽÑ!ú#~§ ½>Ñû*ÈùÎÖÕ`²òß¶o0"îÀ„.å: „x£ÄAä#ç›å… i•í•/O�ò_íüøé®õœ©F*lù¶J—Ã9ºŒÁl0pNߋ܆ÎÎ&ã�X 7½K��©ÁIÆDÈSÓ½�ŠÔÓi4mæÑ›«“ÆuÅŽ «b7hœÞ§nÀè” ßgK6ºHƒ/=Òü„Õ‘/[…æ�WëϬd·BÓb˛٠-–^y–êÀkÄSg'äqµ(ðŽžìÀ‹ Å QoãÆ¦EÁÀ…6Ñ�b]Aµˆ8[ù[¿iæüä®!¢Žl—ÅB܇•òF°¸ær2C+ÁµÅÅбYÙ×^ghÍHy^'3ÆbÍJéWâSn�*%Fßx�ÆB#ú£eê¸Î�(]Gøˆy–¼ýæ55lôôV}åÜv…Ëe‰•Ï ¨änò\@øÔ1�š„<½Ú2öïYÄþÒd?)GFÏ•^cšØ�V&ó¨Æ1Áƒû@Ù²ùÊ3ª刺j¡p¢%‹(&¤|·Ãß©ÓÀrÚ%PÃd𪻇ùGa`ðeÎxÚMÞg$×…>íÎÈðëÍsöõÓÿ†ÍÝyü,Žx„üµPŸ*æ[rìá§ÃÝnN›œû}ùw™ëÛ{VUÙ¡WöÅaXÉ�Gçs›û ­ëÝåúÞ*îUÕ~\æAd²JS]G�}…Z{Rât].Ý ô—�¿–Ö�Å‹ã€p�ûû"è{T¨þ‰Ò[c^cœÕ²êãfƒµlØûý°Q _nüpR«O©ñ¶mÉlÉ/ãÉKú;aÀ�ê÷d Þ-†Ø<Ò¤e•�òy‰t¹­�ß%¶�±¿¿Hðœy8 n¨ÚÉæ8·èa¿.N2uŠÎ™SÏæsñW±‚›b$.²š(ŒÊÊ„0õ˜»Ìá¨\¯Ñ†¾ôÅRˆAˆŸ\6 7<Ù?9Û9A^–z¬©'KÏS·]:£ìm=¡2â„7ÀÛw2±�Üþ_.cÖG‹�)%Âk=a7Éþ3¸Ï�F##òÚEüí8N^"y‚-O™xrñB±Ÿn—ÈÜÛh}‹aÛt¯X4 þd}Q’Íc N̶ˆöêÅ”N0j<åïtŒù� ¦J¬—Ùå–V»öè_'s!T2ù&"úwåôXÙx潟±­«º¦;ÌëÚ.¼&æï©3¼œ Mª4cvŒ$áéîP´”ä{fSSHüØM ©Bë'˜ºÐÁŒ]÷\¿¹mf]¼×PméLBe ʤ¶àós\½¼…©¯P3#$\‘øüáõÆð2@½Î’ŽXÿðss÷³5} »èžäô6P‚úe§¼žj}dнÏ9gΆ‘æ4sþÏîÿ ˆvÝ.gOìAÑïÊ8%Ÿ |AB9å¼'ÉÃu3u@憟H6炾ô¬kŽ·Ò™Nùgœiž xó)“É,4va‰ÁÚFûÅ þ¥Òé`ÊøKoßÈK1°Ai ¹: Ϭ+ëÀìU›òïW+¿Á‘4yWO³{9C‚nê©&bq…�ÄŒ0¹�š4á;x¹8R¶{Üš¦¹¦èLÇ$Ë “KïVðºVí‘P±ÈjUüÄ¡°‚îÇ¡†³EzúŸ<¸Ð†vÉCvLzÜ¥wèÈ6Ï}<°¸¡+ß>öe݅Ʀ}«�x»Ö¸Î¹–: ž“P¹ÐÛ¨Á)Y3Yõ¢ŒÞò¬†�|äó#1Ui!<4®<ãU½;Zøc±èì!£ÿÖ<ï§…ÝNüçZ¿)Ýö^`hõf� vm¸{ÚïvñAFƒÆÎ°‹+ê²þßtèjÈ›ÎcÕŒoÏZ¿öT¹”€$�Õ¯,Þ9F¦�Žeyi�ç*Œœâ⦠ؼ^áӽ决ÐCðœŒÕÎÞ ;åä­¤ínÿ¥Ÿéñ5xé5(Bv×î™^§7r¥)Ï¡�9ü°˜;IýDuÚu…°FGÄyÒ�¿xàAÁRÓ+k™áã9 lÜȲYðì‡ ….$ ­âp¥‰¬¾m1› �7Ÿ+ÇE�ÃNkŒn…[1¸¾óy0 �†¿�wo/�[ñ Ù!Qk·Hwç™�Ȥ ®Æá`!u¶Ï£df<`wK) q?™¼¶/1è”clj}‰[\ÓR~´�„3\冔ã’öPjò¬™^Êšõ™ÜD¤Wš�ª\fï0e#Ô蟽�`nÈÇ»±rQà @x²V,Öî!¸º=yä™u3�ït+PQµñUã/×êaù•b¶c©t¯ÖóLn7ƒ·p­­6€Q@ÂVsÐ36\�7T–J‘¹ED0#››‘Å9ð`û ®h½mÏ},¹r1ý属Ü:#ÿÖÃú­Gð€Ûãr665¸¹ýˆ0R*ƺÀ] ƒEÉ>dyî�Ãß‚~aCN÷§³§W-ÒX‡q~åÏwMû�«§[ìèu²÷•é R; r.A XïKoê?u�ò¿á[>/Ø�¾Ñ�œùöOÖnpÐòÑ»>y 'Ñ( °lt1\¼<²Åh@…j#kÔLPYø+$Ð`åï�)¯+ÃBK·3 i(㪙£³Òs‹�œôsv|ÄUUÀö|Ș<Ü¥±6ÏNøŸ­±� Ë=ÆîƉ> °ß!7’‡Þ¹¯±pÉã¦_-ŽÃ03‡SJ1tñrC Üx«.Ò"/Íì9N/…ÔYøWXOÎT/ ÒhxPÀ9úõmÑ›k"¢7(´[²mµuÒ§t–‘›ÙåPÕD&í¨ Conù™t×+Œ/7‚5ñ3-±w¸r:"0ϧÓk–×–¢Íˆˆ‹ Ýeí3µ�M7Exž©Š dãd_L`#;Œ›Îü¹ÍDNÁ…«Ã»3Û*K¯"m˜E ¦~‚òõC O©G>Zcš¹ŒdÄ'oïwä§a€`Vkxc¤À °v^£ÝL»h1ÜÈo¢¤‹ �‚ã}�ŒÑ/„ž²¾ûªæ–ñ59Ýa½qì:=@2¢<¸ÉJ{êü°€@ïþåß%�Y<¹ŸÜž¯ê½îd„ñL°½ƒ|ÁJæ&j±Zý\SäÞ�×õÛ/õìt¤lFЉcžñ3ˆ¾sè�šÝ�˜,X¤ð °Y�&á.UA3¤`@[òVy»/š •·‰Dfϼ=i,…m.ª~‘ZU0¶#3|�ü¬y ¹‹ÂR=ƽóPÄ~˜;jdW1Þœzk'¬wÂw½4Ù}â6�&6¸HÑ8¦ÑƯiºëª ™"âŠð ãr:ÝÚ ?X]A…"%²·AÏ›üeçaƒõôLd×ʱ@ Ñ„±vqî܇ØZ&ÅB…6Z;¥¿K¬! ]ÀQ[/.T]–ÞÍBËH´0ù{Ìòì.®ÿ�T‘å§¿ÛêK_»ç…ãyüƒLÚÇŠïí›-øÄ?Åj3"¹�Òo–°# Ó�x9¸Ð—r0¹["�£Ò+Ç:»ßåNZ)n¥à–jõÎ^Yé¡Â?èI äzcÙ°ýiÿu}û̳ùëiñýh´ÇˆK[×üß·‚ÙwògèêFµÕûp�–I/·¬þ]’Kd�JÓÛ5'ýÎÓŠ÷�²ã–›Ï/Óû”¹óæi¼}mí‚–¥'ÒKVË·BGƒŽu¡ñbÃçã߬ÏÅVëÎ\—=Aß�[#„z�Y¯L6Ê?‡_Ç]7Ge‘ñ£˜n?7/ºD;³F„¿bÆz=Õ.ùš×¦ïóëµ)|9rQ^79›7‹Öí{o;�÷�¥¸×%•é5_6‰#6½|ñº¹4^7]t¨P¤û€ú ! >zñÏO.ïõËÙe3�vM€Ô›„‡Å!¶ ÌDŽFÈXE}åÊ šr„´@”C8H„ gåŒdœì�zXd1�0cCf}ȼ›lÄ^�5µrË6/Egî~¾iåòís}uÿ£û‰Ö$~Tãë,»÷”yžHJ¥Fÿ¢^$‡)ê ×Zço? 3÷Ó;c¸»�;³QÄÈåë-ú™Qw:oÖS3«e‰^gà ÃÞ¡DAíñåû²�ØŽ:Éí±oYN’5¡äfb!ßó¶³måb�‰‹Xƒ?ºª’™¨]Ò–¿ÍaAú)®ºÕò†ÃZæÈ,x™©KÓtŒ32¿- ýΫ»A�a�˜·o¿&ןÊ‹Òóá˜KCZî׬��q�MÌ5Ÿ®¿¾Õ¬”–oªo¡ô~Ñ©«« ;uqüæ/ îƒ>tžÒ å›8"‡±û}»ÞÇ:¸kãyAÑt±ëðó%´/Wû§œùä•¢Ž7¡åJݽª?0@~«ÝüKòæŒËÔ£(ÃhRé¬/£ÕT=«ŸñKv"Üi `ûã�9P¾»Yxósr}JPijæÂ¯7eû‹ÛÓ9ò¾Yú�ç*˜ž›J$é™0AÉ?õtçýú–#;ÃÌz¹=²+ ŸãO¬;bž�·ÉôvNà åÀGAz^X[»‹²Œ·fKsbìE §º­e»}äÔ`ºŽâè�¡â[]¯x%î9Û 0¨O6¯eÕÈ7 JÝ,Å�ò¸Öül/–ȳ�Ûú9^ìKŒðÜÓ»ÓøÅÅðcÂìãö1X¶5c*ã!LÇm�ä.`O¡ÚØøÓï¢/f<¾ý=�v~æÐˆŠÍ8ù½†3{¬“„/Qø…Åy§/zzIÖ}lG·ŠùéC^ÉäÖ;væ}F,‚HßÁo€%÷G泸Ÿíþ,õŽXó0/ö2#w{D‚~Ð9þ×m‹+X«CðÍŠY>NÊb„‰i£‘­ "Âï<±[•s ›õ…Hž!CC�! þŒ¥+zÃyZ‚ûß*…4¡ƒ¬†>²ÛO¾ìžÊ :• ‰Á!­¼ì¢?u¶s|CÖÍHŠ $¤¹=çÔ«xyl-·Ï­¢CŒ�4çaí¤}‚‚„šÁ°ÜÞ¶oUây9…NyïÖmDHþB¯ÛL}T/…1®#ìÏïÌgУ}×XA­¿¤%¬„äuÄë[28!Lºu&¯�D€�¥á`�½’öÓ‘“øÙƒæ÷š±h+Àê¨I›3¡†@xSÑNÏDKÖ@ù µŠ·ºj#œJÀÏ�T·~שµî˯}õÅ®†Îr¬®¦8Àyýàá0ŠÃzz,6H[elöÊÉ‚à+fz?À¾áƒ‘G¢Ü¶È&…íõæ”è‰|[6›uGçB"¾Žœþ6ðóyðÖÛ|虩›¨kýôÒÊbßjØ~nY‹Á�v”£QÑA¶~-¯aEìm͇fÿ'8ö"®æEý•×NòÒ3⿾2A©eL9A[t -7Õy�»ÂÛ8 -ùºV1Uß§’¹Ä¶ÄÀ¥’Fz À+‚Fn.eóZ?¡%o³X¿g÷s¢óÇXÍ�`¶ÙfÜ4®�=S°ðÁíœ)ž@àkÇk¶lŠúýþç3_Õ· ÂåšÎçÇÐLQõ3Z-|™pt ×YTfìšñïXtŒí„Æ(A)Â…¨ÌQëôG%)“¥†,§º )°æo`³ÄKþ°ÿ ÆüÀ\p× },E£ŒÇx€?<øÆ×˜6µ\C±%’›Qç>ã6€‡hÙÂäß|ËH‡é~:ÁF|ºc%ÛÏl2X„TÁ{bμ„8bÍÃT2°Üè¬,]„1|¶°ŽU¶Qð^k—CÓyœãàÅu©òáCŸv 32èÌ J˜¨á=øòBZ<[/ONu›|´1ŒÍ2JÁx§eígbbþ?EkÁªÑòFtû§Ll @v?y·ëC¿_[èÇ ¹¦NqZŒ"a÷Aاãöxã‰._݉Æêñàõ\ š›ñÁÛùi8V¬ƒè=¶‡µ ùî<ñǤDY".©Ù-n/n—¯Û¸X {®°rhìúsŽƒ9$vâx‹i¯wQY‚¤ï©Âþ=Ém{HX®˜�JH!–oÅJóŽ}ð6NÙã=úEÎ××Zg¶Kæ’«llÝ»th Téª�þ2øß]¾_¼*ˆpxºˆÎYYëð~élo©iàÅ;�£KÚiÞùwÊ;=$Ó `Rþ ü!H‹ñ7ó¢‡ ô‡ÏØónAÄx+Qá\·*á9Âù‰îì»Æ‹Þª÷©Ö»Uí9d¢Þ ÈÈí&XŽtì-w\Oåóì~æVÄ@ñºƒýo–ÒV›0ž{fcdv/È.Q‡Ù§ì~}¥'CšJÉúßÞß%üïèë’ø&|ŽNÿF;úB’’tw„`»MœÊM1ÖÀž„Bøä Ó]‰m-ÁÑñ§'÷tbBŒGš|fO°»Ü�ÑÈMF³Šå–¶äaÅçbj„è™8üÂûé8r:ÑUvìd´*½Ì©šÁIè‘•JÚŽ]ɧŸi?æÌtF „¤¥s³bÿ Eåä`ÖgóØ�æ|ýðÄ0„Ž%Ù \ž†ÎM,­$¯âÇmH�~Ç\;§4Ÿ÷IêHíT«ñöïÜÙ•:GáèFOç§ŠœjIwŽ^˹ÌHÛøsòk'—×X‚\@|³WZG•¢c¾¨6!0öûÛYCçª7M™¥bă~ÑËù:¢d§¯ŸÂ 8<ĉ¿ÕËÆW^íàœÆVJ¢7VÞ3­ªPt¹QÔÃäÔ•mr¤Af'ò˜ØÙ-šÌóy–…@¤ƒ 娅¢åc±'wk�E¤¢²”í»°‚,Äþ`c·dP:‡`ÌYÔ‹Íê•a¶Q-8¨‡˜<}XƒRÂæœû m¢î��—‡DÇÒ3¿S,6A¾0×Ûá¼òÃ\hÖ�nFZŽýƒ5]ú-;¨‰7TÛ¥·ØÄ˜ÉBöUAF0„AðÖÙD×mÚ[jèÈOt)!²;À®æ}à’^wz\Í´¾kQ¦¡ �W¸ÎÊñ‰D•Òºƒ³ƒ‹S»!qb¸Á3ÿ!޶‘œ“H•uÎCæ,Å3x*Ûëf¾·C¸¾­Á"†h.�&Œ}÷Q¼þûíÍì‚/#¸ïX�N ׿ƒãó=߽׃ß=¹ò Z)…Ò#Âô�¾�´¸Õ²Fþ±_¥¬î,e¬v-¯›ÜÅ|�7@Å¬1ã|e}\‘¾W³ÐöqG¯�¯•ÓÎ$¹�£â„�NñA}bˆpb/ºÓîå #2ÁcÜòsòm™[�cXá²ÚÀµ|‘eÆØCš“É�^SY@…Œ sòØ1W¬Ö"“}X`Äejr±œI÷U �¿0oB®kž'hB^U…ß´ñ¿WLîø1¥<0Ès š50'ß<ù\}ªÃlýß\#‘ÌäÅ葬¼+ÉŒ ÊIkëÂðO¢öV:6À>� ç7‹Úì{ xÀarÖtf�Ò²e)¨júèÄúždŸ9^G„?ô›oF}Qw ç\’Óè£teBt/xG‚¥]mIš ]µÌ_ÞßcÖÜf m®M»¯OœÅô¹ÝÍ_Ñß'§E˜²è`¼ ˈ ¡±Dã3³ ш즹äßÎZ¦ ÇàWå¨ò7Á ºÄx2DB I_¶C@°Å;p…÷o«„î£}[Þ¦$Ù#ʬC“Ö¹›D$ΆŒŸH8;”›çgê}›Hë¥Ã‹œ-Âå¿ì–-&_¾É̆lgÌ‹î .{ð¼i%C§¹rÈòKSÂ�¥qÅ©Þún`ú³~yYy/¯­7›2F ÏI&ð¶Êói›ª6ÆX`GLJíÁò…Ĺ póe-Þ· < `­pYÏ?çVLìUŸÕúY¬jÞxýï—›ª\µóÅú=¸óf,£bÉÙÈÁNL3Wà’à÷‡Yœæä[gz~U_a°¢VÚv�Ñy'ºYœòŒÞq(k@¡Âî·Òà€d€Î0—Áñ ÊmyçjÿlÞÅ�\È;)ð¬-î¥þ·f oÓ»#Ô;ÈLÜ胥ÃÚÉá\G7-~ÄgˆÏö<�æf�ÚËÛùE¤™6SPš`¨ä$�‘ÍÌ)BãNÞ• ÖÑ•ìœ ½û@hH©7*b¡’0'5‰_ßÄÔëW3Å—Ê·•°^ãÍ`k\�tzÍ,ª× ­7à(Ÿìg§Ï'ÍDÞì¼ÊáG�ì¯qÚO26µè$þõ±}* —wžø©(ù3=y¿�‰ñz—ð¤öã®–æ˜Q÷k¥ÝŽ|‡Ø�6ü΄kj'^IøãwàÀO0*Zƨ–y�ûÐÔ7ðß\l»‹=q6Œòh™˜Ò®Ä/æ¹v_f“Ø¿„Û¯(ì(† vÝÚëx½æáQ‘~óz¢ÔÃÍ 1z±l•å¾²oFšÉ¡ÖÄtݾDówXdŽ$m:”÷ÉÃEçëãÆ ¹ØyÞ3B®—‰ã:k¼S¢`ÄἚÖïÒºÑV#Nñ¨…ÿfd–<oÙ Ý�s|ܲþx©2FLi}æ¶]�y#.޾evÛ¾«�Ovgð+–2Ágr¦RÙëÄbSDË—2ˆ3Q~1½T~ªÞ1{NzW’6giöõZ+Î Â‘× U”‰»_]T$‰¬¡ãsy„lÐIƒ5 ! <ö?M·ÊûoO'ˆ â ¾›Òq‚âàßÇ[@”V‚ÌŸó,ƒÅ½~øbòâæBù—GKuM2Id ³ûò?ðŒh}%�ôDøçb®FºSN‡X“VY‹‰Ý`�™¨«3ô‹0é¼ß.Ñ™˜_íHéœÍxåigkH¬ÉÞɶ¼ØQ«§¦–6¹>XãùZ ²¯Ç6{-ô™£æ›ùéŠ+ ìñÅ÷¿¼HR´¥!yŠÀCÏ»¶Ъœ½)�,Ùõ�c·ml!J0Ïbtº[ÖDXK˜øéÕÌ^E'¼£eO œ ‚KÈ~\:á+/|ܼ9Ƀ¾F-jG˜ÂÀæðºª âšécEd¼šÖ…o¼¹sÅÞ�6 y¤ß¸q# ú§>•†÷ùNÊgJ02¦ Ï äB°(#j‘ù?.±Ùp@­•0`€&¹]ÍÖ{‡·¥qÍÝÁÐÆŽICj±F ´³¬jÇUšGT=sÙÚ²Wý6°±¦h`Ûé™ÃsÜ%Ù\s!†Ô$ŽÇJ‚—ì^¸€¾°¯—ù>Œ«}ŸÏ°ùVHõçŠÒ•èñ"Èð öt½~ÇíÒcÝ¥™g)ðêfúáPy¾“œëmû5Ê‹‹ue›¸ùп£ ›lg¸óŒÂç i³¥“Æâ !®�4Ó­Ùn‡u¡ƒÄP-"çYñ‹Rçm>a�5ìä,?�BK üO´XÒ Â±tì !ê×2 Ææ{ßà0¾rx©‹Ýô™(Ž#Tå¢ßû«EÞmBRÿw¶4OÜü^ï0z'±�}Šùpþ¸«±žÄŽ+»wìÇ#O±·¶†í†,ûJýp¼`а…õzúË xó¸jô¥>ð� L\S5?÷ÛuH�õHôú,(oh£|òĸհ*Ýóx?ØÎ qªÇðÿeÆÖذCŸ+›ó™ò¥ÇØï«\!�U2ãªVâBLtŸ‡Ãü[xV9¹' ¼cC�wÙÀ$Ãs>¿‘R�¢³ÿ„…ÂR[ž©ãDËIÛÂýÄL\Í%Bˆº5 î¸CÌP´’µÕu˜v\!¤Y#ЈChÀ`9~‹oñýžþ?mÙò¿€Z ûEÄæpHØÜö–OT#dáS¥¯¤ŒËô_WlNEÕ:Œspº—ëx‹œñÖÄtA\iòd&<žR”Û1誅 5— |FÄá0‘k¡ä­aé}\oéÒ>oª:hÌøÆýæ!È�…Ûî´MÌôÅŒz8™¿Gärµ®ÓmÉÞÿ![‘»†·J4fÇ¢Køa\¹½£yæâëËá7‡²÷c¾®ÐìvŸ}úPjOÊ«LÕ¶Á°1±8¦™Eî¼¶;O §®u²CÓ×4lŒ»$ÁܶKÏnêíÃ…ϳñüXÝäVoR@¬'öý‹‚º:û8~ýôor‹á£cpjî õšäp´m¡¬RR†…~7…œu­v[×ë.ðx¾ƒ~ïZ[æ²�—üDmªå¦þôË·O7{[¸¾Gþ,’‹–‰â`šÖבɮÀ=zƒ ¸ò\¬¬HfùˆÕßɺÍþ(,ú:ƒï±ßVMô‹Áç¦Þt†ñ쾟8Ý2@Kœ�,d€É+)di½¼ät‡·Š« `­ÛùlBo�oœ7¥>›ÊÙ•Ex“hnƬ�‹^hˆd„b ” „}W\•y!8¤,qnWÛëðòç¢"ûUÀ×rcÌs_*†<¥yç/mjŒR‡1åc6–¨˜ï ‰bý �Qÿƒ;×è8Á<>î™á1ðÿ!Î/¯ñù·¼©„Abqj/‡µ�’ÛbgÝjîP(sB‘l�Yc(>+Qlj›š8;3èŒ# 6 B�kZÐÎ 14—¨!­9úÁ}þ%¿«[à+0ɿɔ¹nûëùf€PeW1€V†ÎWõ‰•[‡¸ú{bH`pÂ¥GÙèúÀ:8ì!½@ììà3{åÕu�·¦\cäåÝÖÎC{»¾�É‘œÕó `¼À½�,Ác¥Çç.™ÂÆp(�äuËDØCÅ žifAù¶{¨¨7]ãx£B0$„�¹Z)†–÷1L]r‚bÈ™ýŽ–á÷Ü\…Æm³;YI-çHOY²r”:A›Ë¸ñE†°ãÚÅl�9’Ûk÷¿Š+݈ðŠÇîDüši™!|5*hâý¾!±ª:ÅÌËŠ0-µC¹Ò 'xµˆ,¦"²tOC‰àYð2R�M¡ÅúØ‹|ò'ZÜ…/�ì/ý„÷´Ü1‡žmk#Æ� Ù㟠tx¶ÿbûÚÿõâ~ø£È^| ”Àýª4 ò"õw'zêþÀÈÂI·ç,-+)—5ÓàÅJ±Á›q4×%*e÷n—s©6¢daòA] t‡×ÌÆ]ŽZ \Ë™¼ænfèïD°“vÞ�F UMX*Ã<½LDá¤ne㊦á„"ªq¦Ž³·VÖJïƒWÚA?t°y'0Už6òa^n³œ¹­`m ƒló!šð#:žWcEuŸðŸJèH[L2ðÍŸÂÌx¼ð%lN�s‹®oT()xdæP™²WH¦óxÓÄA%‘ÕÔ´\‰œšn/WÑ\‘.gU‰>áœzÏd^ Ú«)W†(Éw#ó&Ï"Ñ峞B�›Usׄ7V˜ÞIdå!¢Ñ>IÏtšÊ>xY’œåâ¶çŠÎJ»äïGް¼ ±Á *å½^û“àÊìÙ ø^K,CèhД�X�%8Æ!ËÃ.¬³¡˜ëj’G ñ0èpï”9Yð‹†Å³£ž1±œ6M¥y{ÎsŠŽòãŒñ‰CV™¢u�B=Љ�Í x´ÛcÉmÎ�&»…Wv3�Õ+®.pÐ'¸4,o-¥jဤBL1r¥ RÀðü)á6±¤m‚mDÖæÊ®t«aI:Ht±va“'…ì¿?ãwqüN-wÑ¥1(K9ã„5—ó^”þò—ûHþ_ìmö—ý8ôµKi¹Èý†�@X to©“×>ì _ùÍevõsÕ t3 ¶ÁÐ_ šòªì$ ½Ì˜ß– µé€KÑKêÏ)“«â³«ù\˜½6ƒ‡Ù©Ç^ýxH>6ùÿ|F¿1¯œÒ‘Z“š½5·Z›�3èÒW¤|¯Nq\®àÙ:W#âO/L>2E5­ÍŽFŸ3¤L‚ÌBn\ Õ"І Ñ^Bý_%–¾f:+'}ùBêö¿|ØæÎé¼ ÑDuo³¥àÑ´²Àùbó˧£VTËÈqhèé9ök±évVäòoÜV ]V"½Óâ|ÈÐî²ÆÓÁ£ݰ‹é3[ô;YWF¦pHL»èD±ä¯°ÊÃ˰/jI%Éòa*ih1RòYÇ1á ®¢Ù³Ž¾àz.Â&Çkj¡òÚsPÀÊaEá^ê” lô¦Nv‚oülwjÐBAdº ¬½”Zc¯´–!e“A SHEl½�¾::=áoÕÚa±Ó1Ô|_€—æv–Æ3?IñNÈöÞ4ÊAI˜‹D|[W%ÔÒqÎvæ Yn¸|��m÷k!†PÐ�q3 ÕzNGq¼8ÎÓk$Å@uirv{ióà�ü©X{�:ÏL÷=1¤’! C¡Œˆƒ&ÞîÞ±î|A½oyŽùçAlw€¬H]lÝX…§b`¼¾+GLðFg³Í±{Äq69�É€‰ÙߨH�†o‘¸ÜÀæ'hAx,þ—ií’~oçž¼„`ui�&wg‚r�s©«K>0Ÿq‚ÎmBãÀ²}ÕÆoÛò(zù¶çƒ%œld«z�¼ÏqÐDk ˆgÀÒA B§1~âÞ0~ë6òšãd% ƱƒïbdUôívµ»‘n¤ÕF�8@J"s 熤�¤X‚¡ž¶¤š.ÜbÞ”÷¿;�±6Çy¤JRæb$‘1‰j+÷ìÏ€±ßh\±V&K6°;’[DhºŒECÿ˜}GœÇF|¼’žO¹a‚åÂ_ÃÎцö—ÊâRÝšbdŲE…‚¿8ZÐÆÑ`ü²óÛåP÷Xþ¼»k8aÛ]¶ Ôë&!赩¿T4ç ÿ?²ûJ+ Õ61¾ìyzgûöñ'ÓŠ¸9/ÞÂ/Z}¸u Ø‚@–ËR_Õr¼ßèôtКµùúa0rKPÛüDY„ÝàÆ‹ó²™ ÿÅ­Øù;æž ^�Kt³xª½Ü íJÀ1x2mÏ$^çèo[œ‘‰�¹©ÆFrXå³zÅâÈî5ç¾ó™®ƒ·Ê±kÅè$·‡¦Æž‡2hV~é Ü×}ùƒí¦¥z¶µœæ„å5àÇ�ÒÊY¹ûí„o“kl‘òŠÅ›ž®V´OB—„å:D(¸OoÌ÷[+d­dȰz±_X¬¶çÑÌ&švBv¸T”øŸX�m¢ºóŠòœÅJ‹"âû®˜“Úo¦ëCÞØ0ãl°‰œ\RLÆó™ízÙ¾± sLxßg`d´[Â>Æ( óè~ÖµæÌkÂü#`é{ÊÞ18ˆ È_1�¨‘&%Ðè'n`iñ�.�Y6øw�ã�K�ÚAÜŠÊ({­?ŽÌà÷y®¢VéîkÀk}6ü®v·îoí»Ð‘¾Üh•‡Ÿí?é±jå×Ññù§ÒÇLƒÑDY�IøÑ*^Ó� åfÿX¡Hi“b4åƒ�‰ü¸ÑK¿³»É@_yVï¼óÌ&�0˜V{|Æ´¸–C¸!.2Ð<ÿ�Ïè¾Úy­6ÔA~V9²²)ŠFýí13›ÀdÉoàt¶Óͧñó‰8°· €Ø`ý¥4«ï ZίTÉÛìØÛ‹Ü‡ù)ü;¨ÃñˆiëÃv�W+Ò®›Ö¢/®°í;§Ð½ñ×#FA/|žX"b�;4Ëš{ýnzrç1åþ¸�œÞbŒá˘A>Ä„£GrDqF«åÔàä¿ãèkÂ23[EŽvÚb9P‘=0ŠÁF Å,–¢Á\dõæˆFXi=ÔeýÈnoäU_$n‘Œ>âÖÙØ”IŠc[XìM›Òa0—(°'͹M©ÞAVÐ^”‚@ØÐº÷˜ƒøÂL8„JÖ¢FvbÎU€ÛÐ|3å£w÷¾\âµï1äϰ§Š•½BÆÉ¥­7€‡ç“Ι›xTX<ø§€ ³Îß¡>åaW^”sƒQ,ö�ZÇrØÏšË6¯üZ£P™ñ.g�B«¨ÿk�G2=ø¾NÞî“w}Š wAênÁG¥è]¦gG[óž—yÔ®@ñºC îdµéø½¶}£…†øÁ�Ÿñ4¬×Çl[e­­�íœçOxË&ý@”¼UÚmKŽ?ÞÐæ(”~}|�éækÂ+…_>¯´X&Ø{8¶! ·&¸\‘í5D)Åf�.î­_©íºøDÝ \]@-/:‡–· f ua߯.L Ä@ž\À¸\SÊ`W“€”}Å.Ó"aFÓ~Èqƒý®„󑺾�†‘„|ÜÖÔ"ŠM›ãmöqÐøjÆ#ÁR'÷½)õˆw7µ„ÙF顃çXm§ü•KغÍ-·„-ùbëG¹Zc ò}ñ榓¿¬,W¾ïkûÜ9fÞ.ƒBZîŠ HV?T%»f‹¦§r ÈFó«-‹&5Ê�²êé0Û=!×kôºß9%¤–¤žiõƒ¶8=+ "ƒ=W°YÂ+¢¨yu˜ŠFum.1`³gi߇¤Ë»%±al°ÉmäÇߌÂ`‡OÑAˆ MÎçéŽî¡5:¡¬xËU#a…}ö¼‚Þ)9O�Ì[ÒBÙmÚsã¼ï3Ç ë˜¼v½ŒßN„�–W-oÎç(¾È: Þ¶DZ‚g ´¾í çVÏ}ê§@ðÛÏ'N/ÙM(Æ1c`"é>u÷ú5|ÿ5§Vp[Д2qÁ®ê]u­zr"󃫾›�ÎL7ãN55zu üŽ= úÞ™â¿Òg2½ÑÑË4~iQJ%p¸þƒñƒàçççü¡ÃÓîþKÉ0húLM@~ZrŒÌ#!±°9}~?•å']]Ýì,˜Ð1�¶“úïù¯¥°ôµŽÈ¨�^úvu „Ã|ãÛÚzzz”ˆc22 &&´|»ýzwò¿ÆÝ7‚ÏÞýd½wýœ”&†�¶Áž§Ã œë3ëôa$“Q±}üGH[\0-liñ'L¡RkK�3�Ü"ÊRÁï ÊøŠœÎ“ðžçå¨ �LWèø|ZuñsÁÒ@êZº?—¥î†÷èÊ YÜÕHÃm æSFPd%ô£QؾhÕ2>ð–qÂLiÒMޤÊvëRÍ2¦dö-kd®@Y÷ïÜ5Øýƒ<ë|÷ðA »;_d„ÐEi!å[E�]£øõŸæëH5¿Äò;oís¾[¸dð ñÃó¿l_˜�€Ìx;¼^NQiVtý†Ò¶�ëÒ¿HV Ùs¾SHÆ|ŠÈ¸þŽ_ÒÍÞÙö�oåÙ·k©ÜäщuÓ–t9^Îø÷—ñw0;ÑL’�ºÛåÚ©õåê#œdXqŒh ž×»¬Üö0zp—¹:/î§ê±ï`o¾ZWç@Ü4,%¯¬úµ8*Ǧü±ü1H[¯d‡ W6g¿ƒK)�ÕòDw, '0¦yr&ÓK”äÒÙ½nù}ïˉSác}AÒÀ“%ÎËVcþX;»4¶0ÆçÅÿµq[ÃÑ™‘—V�smÌ÷×þ?ÄÍù�> [À¢?=}{ pÙÊ5 —ƒÕ ü}Íyx®b Ÿ\ýu�‰S™4á‚Á1/ä®NL^ûôšßm‡•Z+Å¢Z¡{î..t¯ÁÌ®L'6¡þnãƒ�.(Íö`Uc»˜KpØ…`‡=éBÂæU!S�æ¡Ì‘[O�5Aï�ZŒÃܱÖ�‹]ÌÿѶ·d�$$þ�á}i „¦sÆØ ]´MŽR@-íŒ$·½qd„E*b0ѪÛöP;ç'°ÁÈcšN”Œ�ÁÀìä„ñ­6j±�ßf�yà}`£�>†DZcú›}f©Ô³ÜfÛý";¶äúooT8òÓâvDC™Xsî?ËÀñÇ3A4ß§‹ë¾ã!‡h¢Þ~ô`ºG­øÍÁ½ÆòtæPŠ7¢=ID{ÄF4hC0nÚ)Ò{xåíä™ö6 ¬EnêWÞwÄPÓvžFt(;�᫊oßÇ::gŸ� Ÿ pž {@LJ�Â%,*�°gkÎ+4þïÒþñœ>° Bäãæ¶RÒ@µ®9¾‘Øÿ)<˜¹ŸAþ)Ä’zÃADGÁÆVíûî,�\±°¸‘^½‡0j=Ã)c�<(c"�ýo­ßE­Ž‚²k_'Í3COHEÃ%ÑÝÌ™�ÄRZë)� aY÷³÷"û:F@êÞ¿ä�€W±×�ºÖ£Î§T+vÚ?y1÷&|¾·ì£�mãÜhgËÍü«e|C¼Z¦ :¥n�4D»`�X“±eË ÆLêÄ�TqŽN®*ˆÝ¸�ÅñìÅ€r+SX;2üN¦ê„­EÐV–÷S/ä X¾¼l½ŽtŸÓ§YràB]en =õm6¬ø©jüèB­‘õ¿yû`d¸­òùŽýìöÂuÛ,Z•õ¦çégTø©Éà¨ÀÊY·�ª §Ô5ŒµÅ� {ÿ^¿ t8×÷º×Nûmƒ¡‚tx\>6P÷ÒcO#v&¸Ÿf¾"¼ÎØŽÒÓæßNö7–炸'';(ðhΑ°»¯Y‰„úÜŒ›¨´¦f+‹÷UÛ�tÑ(Ñ£¬.˜£ði|:¼ø22àGRx�Ð1Õ*^Åa¾; ‹z�kº�ÄœƒÏL0ðh9ÌÞé§›q,:ÊÆŽEÛRçì]/WÁz£#œ© ‘�Š‚¡{��ŽÄCÇû±µ¶±bA~?GÃÎýåñf·´ɹ4üö%oÑ¿–˧½íñƒ×m éôA0œÜ&÷ß9åb(y�kâÇHñw‘¬×\î9^Æ9ˆÿ@ezMì'Uúù‘’õÃç“‹ïËjØD¼ov³¸‡\O3‹%^A*¡Ža/î/nß—/F…xýié ÞjU E·Ÿ"|¶ù0ß³rkóÏ<Ƶ¯š·�ÂyŽ•0†(ñÛ±˜¾Ô»>•øÝÒmÂaæ3ŽëÝv,C\ëŽë”Þê%Š{CÒ>Nòùq5N¥’Û¸EÊžÑpX¢ö2§\©>(òuW®8fð�!Ñ gß#ÂkȯBë0FHZBx´TÅOÊÎÝ‹[ av�|Ä¿cÛÐQrL«x×6'xJ�ÝîìúYðÃìÄ 9÷–Œñýœâhû©íÇæ{èÆ¤æ±˜6Š?Y�Þ o²` -ßoü#“ÝV6€àØò\ó­{¥×¬ךz¬Ýü”/aîÅ) d¿ú¯ø~1õŠíQˆ4Ggé‘}¾J‘_0<ïÛ:(yžå"!•>Â5¶Hͧ�Ük Ôø²…cÞ� }©.�â 7[½4 01J˜®qÂHB¶¦ì¸'‚.¢µY–<ðk<ÎÍÂô²S1ÇœŒ²(ÒV¢º^.Š7pýÒj¢ÆDfÞ {«y�¼às¾]{Èô8}Xjw])6È2�¡ ëºr#­�Œz\ò3L< ;ÇúÒO"V³“�v—E?ÜóÂþÍŸ]±¦õfÞ©~\Õ—k>êÑDz¼KâyŒeÉ϶SXo'¹.U®Bd&Ÿ ¼>ܷ柀•"…6-U ª”í;,Xßp2¯l®\¦ùÜ81±³Ä]Ûso³‘²?ý“üGº‘”ê·ÊØaÃ�ÊÞûòà5¯àÄ>0.‚Kû.qŽ}¡Û•ð–ÊŒgkõKªqØ¢c¯¨» Î »0�œAu¢Ø‚”)Åf Ó\Ô¼÷Æ /ä"ëf2LœÊµ¢S }TÒÌÀЂ"?*\Á$-ˆµ*HgxöÖ^¿#ãq¿6ƒ"ôLP“ãKÛ~¸ØkÌ\ÕI±Ï2¾ וû…¹%}y¼�]à�ù:� KÑà»Ð?v¢·‘}aD pUôNqk£®ãBŸ Îw¤]/-›ìÂﲃ=•Æà°Ž¦è¶äørš]Jâ˜Æhɉ¶õŒ¢7Uï–ârµ›I& d€{ 4¾Û ñ-u¯Eäï—*ÍÂnäì!¤Ô�}Ë þG‰"$"Êþåü‰4Êù.��¼pÓš_,øØúÜÍÔyż}î+B¬³žóá£ûµŽ¦î¤'dv:CLo�…ç%“:úî'^RwÞ0"e\6b8<õœûß1˜1CÖ$-ý|{6±g^Ö~Ç'ÜøÈ=5!³!ÇÏ_–/H1}°Þ{­cNI`¼¼°ÞÒ›†¯RãÒû~žÖ—9�Ý~ rÝð<€Ýºá³só†™�ƾGžiÍ"÷âæ‰­#À×·ìŸ:ãŽ&Sc¨ÈàùíÇÖG¼r çqöe1à=pÿ­¶³o‡1dÉ|ßm;®~b1­�´ÑÙ±ûG×öÀd•îËJCòoío›UÆI –Åg¹t°AsŒ—WÒ%iíæÑ>yÞ•Æ´–ƒ 4¡Xû ^ÐC/}ݽåÜ&ODþ{^B¿…kbF›‚\‡N˜=d„º .Ôì¤0Ëç¨ýÙc;ñüÏo¬y6»ô¬ù¾+°šóÄhDÖϞ̞Ë"`²˜=_wa~·¢‡rØð“·ÝwA» �è)ØWî¬Bßð`€d,ð¿aªÌ°4(” gpá @eׄñ4Î�Œq!8“”E¦ZÚú·_ĵÄSùÝÈBµ¬7Àc@²Ý“Ïiòê1TÁo•ÃòöÕ„`�®9fÐ}ãõm<÷5.ó¯ Á•=)½u®‚ëAó:ó ZÁn+…!öZËÔД�±R•ÐßH¦˜ITHë†È`îûé—c°C,qÒ½ÊoØÂ]{­ NÙã´3²ð1*¢º MUbPajÁ¤Z÷’…¤‚QnLlT^ž§sÓן$ïÅ“�¹ßâàU•Ž´dÈ|RöA½¼cáç…|êÉ-NV>›ö3öìÉ.Û åñç¼h›Ë÷Ä3ý{bª�ÅaÎ9q[âùÝ4�¬³Ž†òM‰,IÔþïë]þªzS fÈ|ôßì�Ë{~!$ ËÇö|áão‹Ï+�ܼ*·'7•vÿ|×cú”j1�ŽPsY𤠙QnTß›`ߨõE�J£#;Ðø‰ö§SJµEæP�D=Þ㟚’Ll‰Üô�VQ> $ä !–’Y4¸6ÌÄ‚kâ—LI±;»UL 2LHÃ$mV±#¡„V�Rç(@åóNO'Ì�ƒ÷ÙÞàÈHJLìÒ$,(=“ƒ¤¶ÉÎz,­üQaE\Û莟üö÷ÔŒ¸}ʇ+£|Ôu(ÑÅi‡*«ÿAŒdˆåƒP%v*1F�[%1K‹ÎN¨ôÉþígÿ;]4ã·sU·9‡m\ìáƒá`ÿñ½ýTRG̾O÷�jlBz·X]�+ÇDe=ßÉÍ·SYòM9sCΰÙ#'ŸÜl¿›fˆSru7i‹¥E`)£\ö &´è�qG«§VK�kˆ.ˆ‡Çvf¡RŒ²¢úÅϹgÒBêVì�–5™! sªW2¢j2J±1¨S–'wÇŠZ§Üæ9yÊîèþâ\ÿC÷âÀÑÞþå#dzš—c½Âm»‰Vo3æð¶÷K¢¼ê1ä0ÁeÍÍ''®O$µ éÓ‹ZÀzTáZÒeYîÅâruPW|ß- ž©„Ô°�FÏ/ƒÌo/¬þ-JÝi»9+¹‘–bèͺUÅ`îvGÊŸwëÖ|Ùi °fm°ñ:§ži8Q,™ÅÜÎì!¹¸g®èk˜�K….ÝQ—Ç-kÍÈl'zNΫŸ×·¯*êäI€„\0©þ[‡'ðÖ½äôì÷ϽÏþU—á|8aÿ߸BûäÖ9a´ÖWŒzúÁ5*p þ/¯ãåãh…Eñåõ+ÁñY\!ÁaðÞEØÝGzyyö�ÖaYPPÈ< XΫ c`ÿ®¼B¿ˆ*¥ àÔ²ômFm||ìÝÉÒˆ£c�ÖGK,š_K~òÖ¾±#ôSï4ÎÒi'ãíø¦-�ºÒŒÁ Vk )[РÃÿ*J)¿zúÿ£½�<Ü^r³¦¹å¤¾�^þ+g¡ž™Œœþ�­�Ñœ¨Ž;Ç#11X3  tÏûºn Ù)ýFÖ7âxµçí{ëäŽl®¼aÝç5Ψ=ì4ûÓ_T0:kØg[+9¬ :1$‚X„{Þ€OžcüTÄÊ3u Ï€¬NîbG—<íPY´´É’P?ø«Ì×d7öë ûÍ?sœ?¿Õ>°aëzúÜ?9·àFš1Ÿ�P® ´&_¹È¼ÀÆ—^7¹ãçÎJ/S^O�aBàOt·C’õDû׌E€l„ÛµÇ} ³îqé âM � ö9Ž‚b2o}îj”Á5`Q²×Ú`².š“,APÊ$Ù4=K£Ar V¸¬kM¬^ BòÚnÈ+_é.Cè:#Ù„ gÓÉO¤â"â%¾t�ÓÏf+Ÿ[¡åqô3{�Ï}èÕõÕªú¼ó¢(ë¦x¤Ž„I;h˜Q™~< œÙ˜ifêäå7ïùÈÆ\U™RÙÑ@ÚÜ{�Ÿ+0 5z1%F88Àw!u\àk£òv�8±¨ÌCˆµ­’Õî–0×,�æÁýÃ)#eÔj#Oƒ|c’H© ­¾§42<}—’g+ž×æõ9�µ°¸'Öâ¯Æ7’ÅŸ7½B×»3ÎHðÛ*êo^÷Ôè;7[oœ‚¡»}Á}˜à{{�²ÿk(Ã,Ê©ø}*;Ì©.®¬¤|‹ýÖae?ÇÈÑ[çe§!{lCßãè‘XÚ;“ ¼”| zƒIóð ÙkÜ^÷󣇿MÓÑxyVg,!AIþÖp»¸D›û�Ú=Ô2äh¬w�‚cœcŽ˜ `ªÄ×6°…åž Ø|cÆë š¯½ìÕ–)L|Jy÷Ø×Û«{è1® §¦›6Ú¿nKÂBNsþ×¢˜ù‚ãb:@Ýšùªá)ªu¯Ò6– u¨ž lØÄ[ ä€B�½eÍ�‚¡�Í?â«+”K2Gs×ÓóÜáZ1àY·ìç—½ñ_gÀsÇwؗLJ⊚0½4QͭЀfÈsÆ‹¼löÏÓVå B!ZÂhÌXIÕÎñŒOh|ÝÇ"dǃ¨®È�CÐJIÐ5^Ý,ÐÞ‘–ÔåWÛÞ²RþʪÞ{ë·®°RwÙA§Šé1rºÂÀtkߟìK\w?q ½"¶I9'ío¨ 57¾ã+i‡#Èõ7xïŒ7 äÝÙvÃûMÿ ^ïÓ(Køeëð¬&5�YÈÇÞFYÞ™@|ypîE �ñùÔ8àÚu%/‘R'Ñã�‰j·6s 69̤Ä�õ�O}AYåâJ–”�q0¦V‘K¹ðùõâª÷s¼ÈÐ% ®;¡->ûMN­/I¯û,HM»ºßë A™ÃÖˆÂ@µpJºÎ_Ôµ)¹ZÐåWÏ1·^kq´óN´‰á58ìy=,Þ/pœÏ«„&Ážîëß3Ùi¼ü�¼úy.K°pÄ 7«¶qs=†*%Kù�Ë^�ÿ†&±ú¶³jZnwRR//‡\µ}J²b{¶,®öUK,¿´­q ,”ªÈÎé«´¤Ê˜d(r'hm‘á®­eH ¨�νþfhô>ðÌ„&Giz"g¦ˆ,ƒTþy$@O•èО®uŒ@3¸ 8j+¨yBH#“šß7`8@CïÉ@d:uNÓÓ£†;°!ðsǨۺX)¸ÓÍ™`ðV¡‹6Kl@Ÿnîwë¢ËÛ<}7ds#t¿5˜Îc[Z‹µÈкE`sXÐñÜÔ‹D%ñ[¼$;ˆ¦Ñ,™Âø€ÓTO6ù n¬ÿïe ÃËŽÝ£„(Q~sŵ™@b’‚騋ûŸ©c�u#ójv4Ù§kq²¼r>ÕHòaƒ§iS¶ÝMævëbv«CzÌ% cl7J葈cƒµlJ7Ú‹ 3•Œ² )„Ïð2ò~¸Ï†&Â8Ö‚Rd:`z-­ë nã¸qˆ°néB,6÷39ðí£=c~mí0ö­ ¾ˆ`þ-@�€0ø}bת8cOÙ†jÒo9£,ÞŒl1ü{Òþ™Ë›ù´wtŨÚíÕ¨ª51'ÂNGÞ/�ŠÈ¶½�.XÏÈŸIúÖÔY—h¬ …Á —«íq…È_&…ª‹†wYŒ‹Çjœå™s¡áª eÊîóÈv,ö":šWv8Ùô<³W ùéÿ7»í^UïØÀØ¥±œc¶(Rf² F3^’n!B¹oG�.wÀψŠB¼1}#=,C~y«ÖPW飄Ít‰=m¤�’™ñµ'�”Q PƒÁàÇ«H­°–ŽÙ¸Á»”AëA%®¸¼æ¸ m^tîŽü:ý¶Wì�í¶…±ÝžF!JÒqoR¼¤ú–¿8÷KÖßÃ#%gï¸Z"s°&_ãR á°m¨Ú,†D)HªÓÝ�¯NÉîz” ?ޝF”]]‹ùu_Å{ß3ΕÆy’�VUÌ™æÔ¬fØLúˬazã¤>û6Þ`µúx­æ�x1ç¢WÜǼ9ÒLé ;çéir…¨)òÇûضüréZ>\¢5é0Y=¿p„íD`è'”Òì†Xb`xáK: Î2^ › â-ø¬Ã`dVêÙj÷:˜Á(’_t=»\½#-ï\ùÍ&GÛq�Œ!ïUMrû&9ArÑE�·Îb5�ÒiÈO6t#öµ¹ÞJµwßOǯ׭a5lÜ7vGLåü ÿ¯?£�¿PØcÁèËA¹vQñ?ؘ¸ßBŒîÿú} ÷´°\¿É÷<á…;wV0yXØc²ÍÛç� ý´­OL—ÞMxJÔ˜ -koxP{§eÁm˜ hÚ YrR\oò+ëÄ <·vî±±é wF�Æ•Ó=_ÝÑ¥þ¶bò^fFWÎÞËvs=_MñxWÔ…ÿF1ìæãÇïË…ð.ð†a•SŠûZí±ó9{6ÌÉ$7ÅÕ­¿æ™5��væ?W§½s^®Ý®�‡ìÞ¦±û¬¾ÏÝU^â¿ï�þ¹fE]öydðMD€M먣d�uã76aÃ%DÇè²q®`޲þ,C�éCß»Òã]ø³´Y9,ºoô3×qËÆ4 AÚÐ[¿ø¶£³ãxìmäË (0}Âþ×¢®R° ¯¬ä¶[®yŸöϸ×qùÎB�Bz„h¼Ó­¤gº�¹z’Ãu®(·ç0ñ{.V†J­Aªù¿ÙiªŽÉJ@Ïʆ?Ó%ñlßͽq6&· Î&QäSì’àÖnÐ¦Š¨Ž_Ü•¸d€ýI] ½oÔwá 8ÚñÝ1€©³´�¾j2¬NZòQ< p̪ç±Ó}|+ mœ wdà™À1FY€’Xpßm-ü'+eÜ*úºàüeÂqnrâ”!b¬cÂ×Ê‚Œ�áÃ6td™8s_ZdEš%ÆE«—?Ad/6GXÎþE^÷ÿÉbi îBÉp›|©GMa¨Äà}³FG’MGYAþ'tð¯’&rjGÈ—ÂÔÐ'ÍE]‰.åR­<Ç#ùÙ˜¶°ò’ñ’.èÒìT+µ"J\@H9dU lš`ʯ­/‹0ºDñj䤂´ˆ¦É$$a��RYGvè11yºã \Œ†ºcºÓqŸ'ƾH×*‚¼|ñ³Zâ³ô瓨PNP—Ïð–ÜûëæZ/QÝg ´„¶Ö *=ÛªÛj�]bå¢#Óc¤·ñëì ßkÒ…\FÙK×ãój‘ßêo;°Gc—Ȫì8�^|GÝÿæúiÑ$�~°]m“‰µý¦ý–=�{mßGnI!!©÷íŸr @ÒïýAå m–Òd[ìñ…™œA{|hy}óŒotö¥·êú¥+¯tº“)"¹ã™ÑÔ¶pÛ©R +u¤älAŽ1G†bÐ@;h¬Þ¬g=Ìò~!½�3ä# M\dæ(*çY"z~'3/â±odÜÔ-ÊC2 Äâ®RrÓ•9 |ר'oq^q�+!Š*|Õô½Æ<ÐÆ®˜ñ«Ìø—¸ÎÆq>TÞÎwÌã%8¼ß�Þg1„­c\<9�å9¡ÏwG­p1ð ÚË\©›—œ’�¹“ ¡’Óû)�}³ß»’ÛÓúTå^$uÜlþ8Þ“C¸x¾ü°1w„\·C�¤£'«_L,Ž,azYeˆŒRWZ$ÁÉ^U½4ðã�ö ¸ E#’ú¶&%Ę›ø˜õSÒR†©}ñ§X½„Q箊8}­[™Žõ¹vÑ™/ ¡ŽŸˆkˆÜìÛ�² C|äm³våÏÂöߨÕÏç2°ØøýeMô"W‡´èšôþ³­Fí«�|ÿvÕ¬_”Ó+d7q™�`^¾‘äñ²O´9P}DÏØW<¸ãŸP›Lâ_åã™qwï¢ z#7 ÷Š‹‘­Y�Æ]~ÁwŰ½oMg�i'(A~ÎKÁ™\øÚA]Nq{JEÎͪî›óD£É=a旅2oö8•¹Jþ¨[Gå@N çcõÅéEÀ  É`~lÛ$Šü<§˜¾�‹fþPIó,m´äið×—% ÿ %`/Á¡¬¾C¾…bT“êUñäsq|1åÜ?ŽÍZ�C§~0š>[¦}a&†( †kïzvŠÔs)–ZæåC;¥C8öá×™#u~­›Ã\´B�g¼½y«o-ç‹îi;ûÏbÛ÷iÎ?´Ñ£|\mÜ™¼f£ì�kÐç§ËUÒ<�b®q…­>0uåõîO‘»bH‰î±a‹ ¤ü·nåw‹_,f–‡¸ cÎv›”,Qú{Z^B–¡ù/ ÝàÊkï¼ËYÑô¢´Kâ|³õ`T2ywMÛzî(•¥f àÆ@ãŽE,¹áegÀJ‡¦ç«fR¾°¨Ì‘nëÄ�ŽÜìÜñ�-j™ò€­aß‚>q¿5Åù=Øí#ÙÑ6ß G£Cý6ÂØšœÑò<„m[[J2-�†c;£­‰�;-Ó÷‚ð2þJòÕ”ãÖö‚±si’:¹‚dá=©ðrñ�‹Êu:H§Jñq$þ]˜^y±�ò 7·ßôö Ùн&5mNP6ÛFí¶3°{(ŽœèËâ'´1ëÈÌ…ÍÓTfÅ‚Rµâ÷aÚ/ 7Œàµ2-²�Üô=³Ä�]‰öénrâ”fõ–E|c:ÍÛW«.X�ÎHm¸ÃlãþùùEÛÀ¨6LR5c'ÖÎ+ûçx.4ñ˜£<ê«Ú…ÄÏäÅ]猔µ$–=�$B²"-ø£ê¾’É8Vç}T‹˜Þ†xd�²àY Jh&‚7žx—¸äÛí4$ž½¸\-ôöz ºl„A{ø‰#cvñãìö,},‰1ÉÕ@@†ÂhÉsí8ÄËÆTnéˆrBt¥éIH;Ðñ†5E‰©ø+á�rÅK½HÕ0°àèM­¥¦’^$�Ë�³‚§¾ ƒ©¼˜ZÆèt;û³®ÂRÏ©¢ü%Ò`ÓÓÞÆ9˜WÁ¡´bô!ãX5¶wK²sÉÔ6Ô\™s¹æÆ•pÆgÑ–×UÇÉë Ô~¤d„dp<Ö&¢â— öï;Ô®�_äIW IÌcÅïeîv‡ Ë>yhlo}!·¾àDÈ,ÃU8¸ñ"Þ@¡:°ãu6çú�Øw…{—Œï둞ÿÃô¬âáX±ýö¹ˆåÔK|n9ý`ÖB^Óµ½ ú™ÿ”MT½é`±:?³›œbâ|‡}çrcés0û3çÌ›>xJE4sÁ½×&[ÍH�Š£d¨[s¢t©‘)%ÊŒ”DN!�Ô„éø•K\1æ’D™pÌk¸/L\CŒû)’@4í^Qÿ ÞM̽,;—ñQ–}H`LU{¬ Bøì—žsSlZ²©ât>ö‰=<'ï0åÚ?~áŽN÷láïÝËù]$¯0¾%<N\äfflnɘ#ßP$ÆaªŒÕYÏÄЊ’}® ŸHËØC\…œf‡%çÆŸ/iXÔy½qŽð~eó{Ñß&�yD×5Ûƒ.m1��÷v\{�s‚IµÇ?SÍ�ÅÿËG½?ÆK@¨/Ål’¹ãFu¢Ò:¾>ÆN€Á/lvèTð;H]ê¹&8�iNÃD¸ä$ŽÂ¤Bð€aV(² %1µË ²¬B >•¶CO&Òº&Á ã}¨Ú¤,í¶µØ9HÎäk˜Ó”—%ë- µÎH¸Ñ›™=xv È÷ÃQRól^ÌAž6S³|ƒ-ZPVŒÛ$ ZrXz–è:±¾ ÐÙ)±�ö=.–ðe†]<[žàÔÆ#œ·€±ÀtÎD$Ö‰Â�õ£aìpaü¯Ph­ï‹àöŒsšçUÉX>ö0C<Êd/«·¾ˆ @l? )ˆvˆ3;—Ùò†ü‹ÿ+Ï-àò¶�àñgVN5¦à˜[†®iSx¡íÑËIA½ÅI8éÆËƒ{Tô oï(nÔŒïίAˆ‹ë”h�y5•~oÅÆUOÂ]]þÌ=vº]øW8107ÎwóDû=<öXžr‚ç¿ÎÉ8…úÒÂä"¾!{’ýaµo½/{õº"üUÛÔíYˆ1BëÕI°­b2CèÌ’k‘¶²´Vîu^ /o©ô»iœ_ÛìQ äï8ÛŠâ üæ,¶0ó ²ñ¡ ¦ª6m{`têb/‚b Dê„'0vq·HùÝFÈ–Ÿü·w�]\ʼn9—‡a­TofoêŒè�‡‰ñCD­éF>Å÷öÞVú,lø…;ë¼dŒÌ¬Õ_jþôëí ß2=ã`‡[Í™ãûÜÝqî=¾O‹ðKANlÀý†O£{³ôN®Û˜`CSÚE¶µƒvXªA¾””] >!ƒÁ®ëC‡•¬ö�ƃ•ÈÁXmÏ©‹‰ìy0:á Üá“‹À#‘@ÕBÐ1&)0<8°VLJA±ÁMr¯›§r0·¿¤;ÓE²G;ÍïãÄŒ éÑÑ<‘êï噆pÉ‹ãÖv"š»–øøÎÎvÀ¹¡\�gÑóᘞÁRRçïŸÛ¿0Ìd‹¦ª¼Cí~_1x+mŠð.è#\F€©n—ßa^Á3&Ž¿¿4wõï½�×ë¦ÔÏê“4Ü›Ë�²ÚûЀÀÐ%¸Ì ‘díðEP¦GÑ gÈ;™KyŽ�Ú�²e“Îó> £0~û¾±KÆ×Â8;碚Ññúfeç'‹”÷±ðéÎ3Å=yeeÁ1¦G õ]Äs—E1uF-Ѿé‹=º�Œ¬\Œ²/�{ž|rÙ 7/­"a^ygØÑŒOÆC51KªÛo² T!Èw’ý‹os/2Ù¾º"Lo¯H¥zÍ ~ßEœ:c|WºÆK…,•Ñ—äÁERÿâȹ߿Ê_á˜ø˜�üoÉ¢ ßÝ€ÓwÁzª �o×?™œT£Ôð_1…Ⱥ�À�ñŽË_Ĺû̵@?mGÐÉÀ¨9„îh_Â(cô6W z$~�àÜÆïÚóÁܳŽ' Ô˜ñ.c^G…£ÐÝ}œ¦qRÆ»�°œkµÌuyŒ+Uqj»G™ûy6+-®ä0'`Œbt„ím1øÙµø0 ½j¸Ù“· v.ý©î{«÷-ž Jâ6ù[ˆr4ÈAÒX¤âà &§”ÊÞ4OñÙ>nnÂÞòå+Õ|îìVo¾.q ú_b›`*ã1lF‹Ÿ´†C‚3óxz<1^Z~9¿e[9q~¾x¬¡ñæm…2&u9 €{ÆBï8’k[ü8ÍwÒªžn,_§‹"¤Ç$ô[ÉÚK%$ Ó“Ê}wÁ§Â‰88Îìp^;!7 f!ÊÜm˜„=ß�§u]ˆÿ"o©ÅVvß² '„dx©ŠLOžùŠÞ"~º¯G2˜ùò®þ¹wŸ’šO&7ZüÛ¦(Õöˆä^æœyM™‰ÏÇ$È÷ÍMïÈòŽ©PËG^�¡ZN¡ùT'¼O _ªi ¯ÑòDWÛ€Œt–²z7&é=ráßwÄygŧåÛúLBHïèÚ¯»ÓyŵºÖ¸Î[ ã?*ár$YßìBqƒñôI¿†hß2„¾bÖ1Û¥zbÑéþÀt-ô*rÁÉ“ f4Ÿ±†ŽÃ¤‚ 3•ÖU–I6 Ø­Ú¿ŒåÅA›ÍË_\iLgs‡ç‚´"øb„»’" ×JÉŽ´K‹RÆ…ÿˆph8u¾©ƒG0Æ×Ö|hÜÙ(A€™¹‰=?6užAZ)ó|*¯|•i8Ðø÷èàß¡ÝÐeÚ£º=¦üSô»ñB+-2|–2BÑŸ†^2#¿/3¦è|†ÓnÉ�†f3ž€5¬åÍšùVœ°€ÃQÚΦ µ7Ö�ý‘ã[ �÷®VÛ¡ÍäÂÏJæ²›GÓ«c~ „ÕìE©J×xˆúùØp§èVQ¨8#`®¶jÐñ–]ÌôN_åb*ÌÕÇm`úž>̇ٺóQ¡ªw"H+Yï†Ûb¨’h.×:÷5 Â=žeÈ Î[y(ò5'¾líÎßEÂæA‘ ø@«?­fdõ/mFfáXŠÞü¾v±>t{æhqÆê+˜ 2ðW“Å:2¨]ŽeÇòUç ƒ¦xÄ]ƒc>ºOÓ9“üm-d_ X×8ç¼ÅÔÔ±ˆßãÍ-uOúk]Á—õ{\Œè•æÄ÷<¯LwšÐÕÞcO­•ýaÚ‰ ëS·<@„OÂÑ70“Qç­»G™C|7n\ö"“- û%a�. +mý€d™Q0@„ Eﯰ™3Îoån´ŒW1„ª†èÏ <ïÍ€E²¶çЫåÕ—h“…OM�öZ!2eƒ­¶Tgi2|€|{´_xS‚,ùiÞé×¾oL^ƒ˜9.¿©f´iE^ÏžØ{¨Cï6¹Äɹ]¸FÛâùò ›9º¿×bÅ#ÄO’¾dëÆ›i)Z¿ O…0œ•ÍMP“ÕFg‚êèÌ9‰8B¨Ä¾Nòû+ã®âŸlÁ™F ˜’{ƒ4\ÇYÔ¹.L&#nP=Ñ<ÞM¡è z!]M˜*µ¹Ê�ÜѧI.vþNòß³|-�=¿â½ÃWÙÃìîÏ®#•¹°n‹ˆ¤ÏÕ#S™­÷Ña{äÚ:*~MTƯ¥Ðˆ’©Þ-¸tLÁjŠ×ý¯“©¨û‘«b´K�µ–XèN’ÓžÅo;­K¯Ä­ÍË¢WñO(þI þƒ?Â}—Ë�ö*{6m^Ø—nÞ1ó–-ÙúÓ=1ó}Kh’ä\õ¶H“hÛcñ\´SjÓã󊨳îý÷(, ©Ü3^¡ª ¿o@0'¼\½p^ÞÌwß"µ�ªü“.å@�§[ Gµ…¬‘GOÀâÃ@FcˆY�¨™CÎ.¸ÇÛµ|“€ÞK.�mE3ez›ÛL^g÷wœ>-°jV ,3XÀ.s» E««Ä‚J#4$ãô§½–ÅÝ�\ô»\È R³vÎ1fhjÙZ}³RÉFìúwýå~À¸NBƵÛÝ1ë„D—$cŒUñxŸ Òb^ó²ÇË(Ù™ˆß—²·vâÖšÀ‰�zÇmÑ�ªqê¼FÌÅî¨�K·§±ä©e(;ª®écþÿóôì6-‹P \F€½_n`½ähÄݼ»ÿ¾t5é–ºínΨV‚Ð�‰¤��‡ ��h:=È0Ssý©¾Îßî–Ô‹œ.ŠÐGÐKdÖÜüvö<ÆCòIè&hÃXÑl@!†®•r•’N �˜Míœo�‘=|¼oÞ¾ lj›Hü\>X…[¯5çSÝ�ºÆ•}æ-ÀÆ”¦„käOY¬C –3z¬€6Ip ‹vî*[ÙÒ‚“±�ÅMÌ ‡µÑETi´lÖÏÜN†p*±¦NVì5hJ~yòòÕ'a jR±…k•év –Àm–­ü5Áœ�ÚÏá4}öPŠÔ›µ"ØB%Ž–àYÔ<˜¡¦bDU÷°1`ÓÙbô´ Í­³¨¾æ¢ÖÊ¢Š)ŽÒ[gô=gXcÌZYñöƒÛ_LZ-X@ßð=™ûø¸Ç>oviò^½`HÁÖýwÝ]ä†k¹ Øñù`ÿà¡ÛCï*{�ä2ð�l½(�Vb½û¶ÿeÉ�¿˜ÉM¯í°XyÁÙêѨ͋±ƒðF ùäH{X�m½úÿ»Ðú¯,гG´EXóÄVv[» í§”|ñoóõûžo ´³‹cÎc³Š2=⮃£«R=˜{°Ç¼‚®@OÇ8÷°^rââ׿ʪ¾¬5ó¬ \Ϋü²FŠÖ¦žCë�ýëÊ'oȨSןêéÌûÌKôö²(dŽñåR÷#ÓÊéÓÒß�žgÙŽq»{5· A†°ãïo¼é‡.¬u°ÚTÀ„9ŸACó>œd¸ÀÅþôBç&¤(Ópn~ð{'œN/Ðýï­Î=8 ~]o™º“É6ÒÓ5^BÚQCy”Å×63}ÑII=S>+Ð;6ÑäÒð46U£?m V+�íS™º*h6Óvd„�®êi+h*T#$bQKµ€„Ä*L�®ÈOâ°Îpø[ó)ðÏ-�ÁIÜmúï�õ…ÜðM€`YÖ‰<çuàsûo¢½K"d²»��yѹ :c,?d‘Ü„9‚™r‘·ŽŸâ>Lõpd¤ H÷_¾ˆŠD2¦R·y�-�œi©’u?|‹`ÿNhì_³ìj¸%K:ÀW¤Dä¬yg@Џ�-®䵟x®Ù¥šÆhÁ«À²‚œÚNÌžìc†Â3Úó5²TB,7fŒÅÖºÅÌ?RK–· •Î4–ëCqaŽ‚¸…k¾ÕQVUÑP65 .4�ímM¬-äz‚UïøØÈ�_EízK[ù¨öŽöœà™q_Ì5ýÍ]‰ïÜ?½;ìhAV½þ-1ê6W^h@Lùw–aó�Ú½ñÊþz.vç×yçíc�ÞwÏᬮÿ²’2gn#kM 6qyõô¿eó­n˳Fì%%éyg�| ÈáÐ;R Ï­àüÎî€MÙ‚»»ó’40]°â"j{@¾rz¹�òáþ[2‡O3„sz¬Í¹ß*/BxÉæ9½êâ»f3IŽ.œs Óˆ9N„x£ü}gZÌæ‹¯Qg vz)ú5¬Ò×v”<Ò’�‘PÍCMT§ë¤1Æn‚Žw|V«®%šŠLgM.(À&ö/Ö. ³ñ;¡imVx¡ *,�űšâŠ*ªðô·‰?Qy�$‘È­ÄqØ”ðÁ~«o¡æ½xZýêù½ (]– " ®À™ˆ"C!ˆ¥Bi£6Íjwžƒ$ȉڭˆžŠo¸›ÏKú�†;È(5øÓå�•kùèLäAÀïWù� ÷´xüë$¬ß +2h\¹ìVa4 õÕ䨭ÐÄèõ¶m¢=C(þûµLf“Bžs¦tt"¹]š‘XSµLN ®è)=þïïïèåkÝâýšó•f+S˜uÏž "Ótœ{ Êà§œR+µt¶ì8-©8jJá…|Ûš¢™ó�–?sq€/�%­émÜ* ŒåL‰Ál¢½Td\¡©Ët43†/Ö&¯íå}?•gíß3¬–óqPæ^{«ÿƒ\÷£½¥V_�÷ÓíçäÚí=9£sð µúøp m¼}kq¤>,¶�Ï}J½—%Pœ×áxÂg¸á‡¶¯ê¨ô—öãŽÇ€ŸôoÍÑ�åÃÇEñ¥Ãm~”šËå±Þï!.‘ÄÐÆŽÕ¥ïß«Œ«[Åé~{]ßq€þƒçðìØÃRÞ…^þ¸-||Ú ùHeÝ÷¿x½[/ÁÙ·–ê·y¾y¯�°þ½3‘òê¥íR)–z+2'9bñ±€Y]Þ!2!B2oÚb¨V‘á(æ½çoü¿—,íÄ–õ.ýŽOÛ€þãƒý±Â´ÞPb̪Ъú’b¦ [0J Ú žÛNl9•5Mw·SFA¡(œõ³5ŽõF�«{Ðß0q˜Vº<«q°F7ïÌã“(¸,Êir^ÊE0@°öþQ¬PX¸-qFì¡íç0j!E´Ïô LÓ�ç•l øE¾¢”þ¤’v¨%›ÏMììÓdMPVêãÞð™Š!|c=Û#ꨱó“úPÖ+saM¢q].Ãü ‰‚ÿÄ6XHÜ9­…�P{ÄÆq…˜Ýñw¤ŒaDé�%­ê�jÓÂgUi cÀJ‘ÂRrCÅEÖc̲s§=éô{»­8—�¾Õ÷îÁÀÕ»¸Y/_A Ú[wÜÍé ¬ô�!Më©k åóxq�)fEX¡±N°„y�ÎTÓp˜�© Ù`�d‘zèE§JŽ|†J¶‡¥™àï¸ÓµL°ƒ‡˜¿0œS2¾&éAÏ=±|8þûÚÀôvc¦ð mˆªwß Ó¤5ƒøšÄœ�mP"Ôx ÊoȺ”¡c8Ä´ ä¶02vê5:O NünµòJ:þøÑf ±t "¾ÌØmoe'9-[WS×>ZþôGf§ÚNaCmµç'êzË@Àëù#ÈמÃþî>Ÿ ô›íýæ½`è¦Ãéã5aúïº~vÀ8Á؈׬Ÿ¿;ûøêµè¶5˜–ðó'ì}>'‚‹“‰�àÕ£obœË\XI©3à6k Ö$b´ ˆ­ÓÃñ<øï˜*fá#_¸lrçaã*l[Iï,å_ùе \zOB¿‹³ÿUæ)je䢫疤T_@þ€m‘‡þ6�º'IG±Ä\O›¶(óÂF{Η9boÛ®1�€7öÝAqs¹ Ó Ó>7¾#`sQæ3zß~ÅÙ5Ф c‚^F¼!ñvkOâN×KŠšñAV-º”²S”6 ¯Y`´~×®©—jHQ‹òÃŽ1<�õweÅÑ‹ddÓ›¶ °s×s·¶±_d¡&RÖ [ºñ7 \Ý« }#óXÿï6Ö)u1«"›Ýb4ª²a@€ÒÊxÞ£3‰cg �&ÚI´LK�Aºƒ>ûB,XO 9z{æƒfœ¤¿È® @/qû÷ðdàŒ§–&§è'��/ھŽ–ŠÔ núÚ•;ÕÚ6a{Mt�µ¾”Ò�u<à "ÅcW‰d�² ò�¬TŽ×ÔRÅ ÆŠÓmvbÊê^îiK‹¡öOâ!¯=/+_c— ‰îNc¾Ã-Å3yÃ:>x¾A²RFGKÂZ®*R£KÈ&"q+ÏÎ:!2é×Y[ì÷¿x' †dùÓè07&8Q©ÀYÖD2¡L³Á¢ª×díÇ壘Áä‰6’*ˆÑ,“ŽLU×�Eh_o%C�ø Ï»€m‘`×ÃÄÇ8M¶[|¼1ªÛ¶ë‚÷'~S‰îùuä  Z6Tt™&h í“^&™�¸ª”³ÍþdËDŒçxž”@ü\ͯüúKÄñzÁo{¸ÈQ'·•?þè“ëÁOv=iÞK ç£ÛÙ­)“fËöýÏ­ª ÐŽÎõs5kz=3ð [�«°~Ò‚­Ôí’^’ P±� ̲°x9kGºådé[U±ww¸eº ¤9ͲÑûP0˵e o>Ã[SKÞLð S½sX(»˜Ë/øíjø•H™ò¿"?ƒô4wȰ¶Y‹ù(ÖXwmfo *oaœnBdÖ>;êXVTU‹º R _qˆpðŠ !É�Ì-9JbãEèØÁn« WµGsa›T{9 ñ¤Þxãà8|J߀cÎAÁàø§îΉ}‹µ�z‘]£b]yÓz`ÉÀQ³zÒ±aÞ†C“7ãzÒ¬F]šñ²‚í8¢×E¡™,"!@a‚o–vWH2 ¢½ QÖƒ·§÷?³·%þÿLèûìEÊYÙ¿³…ßJáEeDÈÏ%þ?œw@¶6ÙÚÅûY&\gW\®·ûøì%úp-b�AíQ+ÃæAjþ�ŸÄåŠÍîW;G]¢>:ò[#e/&rËù(H̨vÉ™‚üº¸„:å…^Ë󟵽s÷å {î÷ ø)¾:̺dÊËôùãÜ:گ틂N§Þ{®TŠ; D,®0fN|CtÉ%ÏGÈ“ÐÌwÃhÂ9°B:ÒþMï;¡hçY�¢ï»ÃѬ ‚Çì„ôsNw\òtÞØXȤ'žü›l{å‹ñ¿ ·�; ~u®©^ÞÁ›…aYNïŽ9¼ââÌ÷Z¶×° ¡7Nhm8·¾ž"Âܰ±Ù »f-�6U%H�ƒõ”7BìƒÍM 2Mn¢áYä:þÁΰƒÇ½Õ¼`¿dí¸¥BàŒ/k׿|GÆÓaQö´ýÂp¹Á^a‡M�°û׃�àÈ”@Ÿß/=®næ«qbÄ‘˜Mû ­Šðо_œs¬€OÌàøAäEØ$Y–O½àñç 5ÒÖËÀΚËZ†¹2Vç=÷ºBñ¶Æ§Ø ¥åÌh©„ÖóÓ$“†®^D�‡¼À­�D­)oØ`æ' üëùy×/Yñ9éëVÂŒ²3ô‘I/ˆ{öâ.Y²YÁ®rgŒ”jÞë7Ÿjù…(Ú¥RêÇœÙV4¹&?«L&LôþôtUÜ·ËáNM1d¤;qW+vBw¿(!dúùËtŸW´î½ÿ@±Vo?s©®/å Þá—}ÝØ+ò¾Þ8=>~"!‘�ì—ðjoÉþ㛨+5^ž;Á¾�kL_'ÅÌ©x`x&DU$¥óº€­«¨±=g›�ôÏd»3�Ћóœ^æòPh¶�ÍO¸Úqó"ö(ô¿œµùî¦ö(ðï¬  tl5sl�wÇ/T¸€|ÛtøÄñv;è/ƒ¸œ6xByÇó§7º¶®o×¶êfÕ™èµ&ºUBÄ.LŪ"5ƒà{h…•æÁÝöÞÇÛ%ÃZB�X¿Ëó÷ømöEûNX=°ËfB:5×A?/˜m¥:tUµº ÙœqŠÒÁ“x6È5qjm. JÐvb”ò�n´‚ÉcKAȰLn ñK|î«‹Ö`~\hîÒ«ÒãÛÿCl_Ûÿâ±åç­çLLƒ¿ÒHF$ªÄ„méyùÖµù‚+øë+|_ B¸Ð„…è4€íòÔû{ŸÉöýÅý Ò}s@ ï™>žp¾,ŒšHä�µ ¡Þ�>Ò©ý­Å�¤ì�Ÿ_^ž˜]‘ð Ip«‘�˜Ä!<µôßÛNûfóFƒ ZI6 y0@ŠèÊ}G�!{Aa#›A‘$È$�CëXú¾¼P›¤ Æð„¹ù}÷®„×킊AF7©ßLÐ$%+†BH@§ë¾SËßœ[œYÛ óûˆïnC˜*´¶0¬ZBÿÈVÖ¹hÍò‚ü/GÀrƒxÉÜtîûd“5ôÙD‹…>IãŸÀµo7Í5•…Ø_üñ€Ç*Îÿ C�4Ä�û?ž •‰¬{áM@úÐÙ�‹Ì8´‡©_9èв¤íå,pß7 ”÷B°LI£4Ã*åaÈÖ´£4cdcÂä¿©‹p;Z'˜^)„Û*ÉÙûë¯=,áo¾“ÐQóÕFGD³Az~ü"ÃÞA¨Q1ì7£+æ ¾}ëB5¼ëOöϬnýH%Æ«E§Œ¹„¤ð�ZØBzÔ²¦¤µäíë~<ä‰ññŠP<.®Ý@ØîlÞ“]ü&!ìÛr šüáåµãr0i|.¤#¸�˜67 ûäkË6 íÙ�K©kŽùn ÷§’<$�gqåtM^1}\¯Z´[¼¹ïÃ9 ϵꂯH¯„ÑÐ$äÙG4gZE\`ír¼NW¯¹Þƒ­­f/Z§ß1žÁ`m|³9Ü­kîa÷å•5C·A®kÂR¶ Ã,ÛuÓlâ�¸@“¯0õ¬¬:Ê7"AÑ�r{h훫ۚaãˆ}BÎñ}UÒ“ç—dN½W”¤×‚v<×ö´< ² N uà@×�«<ÝgJÚlk<ºÆ·›¥aƒ3‡N}ÌUFÍ�U{ükÇ @Á‘�,�¿Ÿ*”ojT¦XÍ�é3+‰Ò‘åñKÎ:›\aëó¸ óž÷† _Ù�ßÐ×//\'hH7üž0É’â�ŒÍa  Í"ëüÁ|,Oê J1��çÖ\}tþ|Yz¿©ôë�Øâ-`-±˜1ê)Ò?W‚¼Éáv¼xº©\X�£!ÙšR\ÖæyvÚéL ™XÍ·� %‹!¦L]õ€µ³žâ¾Ó­«aiѵøCÃBÏôlÜùsûáŒÎ’‹Mâwô:éÑÑ vq\¬žSÁ†¶îªÂʼn<àäçÀ–”_£^®Ùu‘¹=ÉnxPÎQ �†s7l¦1µñ‰ŸPnÿfVø%¸v2n¥éé%u¥õæñ·fÁæfŸ^\Áu ×�ƒƒ)ñ=g‰gF±óQë&3©¤ÒmX£©‡ôý£óÌQ2¤ßï牭ëÒA£¬`M6”Æ1æh0èȪ@‹óÆ 0€v€ÿŒ­Pdgfs·ß©§d�DÓ¦�£¦ûõwçÇ,Pã>%º[ÂŒËèŽ.RTCdé+Œ!éKm[1;)"Pý9&ŽIW<‚3Ö1£¥S)h†f{�k4òõrõ,¡pÄBáçv\éI—R©fHFß0Ír\Ók<ì0ïÇ>ç4‘¸RîÛ®^ëÔµÀ‹e˱ý°á÷$hYû–És)LTtNªGiËb°«h-Ab]F‘k�ä²ÃpíRš–Ày+_ÏÓ >�ì!›kŽ•÷î|ÈÙ’V/a ®é¢a’‹N‡¶´z½îED…KiEºÜ³¯±êK°j¶ÍÎi¥UG‘;XŽ&×D 1DÃíg­©Wå¤rÌìºi;:´àf} 90Ä+dW\(B×5‹öÈŸµ€Tú”}ë4�ã¶A«Y´Îën{¥BKŒe¶XÿE8Ú2—² U¼_¬ÑíPð*Ö ýjй‚ ­¿çÀô\3Æ’-òi3¥©äåßd æ{μˆ�Èbgj·ËÙï÷ožå-ÃjÖ3AÞòýêV|éÇgÔº£Âå[¤ƒZ—ŸSüa/ûÊÂÙ Ö¤8è0;LP¾–H}ÏP`³ñ&a‘AÁ²$³_ò* ¸ÕuL õ¯}àPiÑúbKÂèº�:*ŽÚgê*å±ymuÐa´ŒÄÙðqæÙ—�éMè¨eÿa &pÏœs%�ãômõlåà „Ïr ìkõå�­0œÚJdÇQôlcb;a¹¿Wrþº`ci¬x|_9'ä¯÷¶Äg#ÚÍ´©Ê·‹s»„Ù©Š¢Í…¼t~eÁ¯p�4ò´X¼«X"‚8�D»%õ}ŠÀ,Z¹Õúi70bLÒOPV› W!ÆÈuux¸¯Ù»gnyÝ“5¿ÞŒÛ¥nhº–˜2â¦ë§ŸLþOýáWdh>þqË(4‘±µ‘¯ˆ%ɺ4…ÂÖ �Ôj±ŽØ´ª¬\f_œÇ?_2/÷ AlQö5«îœ‹øJ'Á¢œ��Ü· 4sðûÆÒà¬-’’2µÊx}K%aÿÂЉ‚�[ F<Õº|v<{a7¤40#1±\¶yž‰ñ>Úq“^NOžF#�À#Ï AÙ�Ű2„L��‚:¿ÌmíÕkÉ�!צj£¾Ÿx™Ê/Pâî�ëMh´L•¦Õ®Ì:¹Ô=³¼CŒÝ\íïh¯ ÁÚØ¥*­†ÅFM.»]3=¢ïºbØ8ù;¾;•† ‰‰éÞÙa�G·rŒ‡� § ì 7s½Æ4ožtéecíSÖF¼ë�\¤(n:¶É©±ò$mÎI�9rì0Ó™¿¼ì†±0=—:1åœp¡Ŗk/{Ž%4D0|%D Ä•M€‚:–Vį�0HP´Š$eŒ‘±žÃ+ÏVˆÙ‹°ÑGuõ‘ Rã=îjDéoö»ªÔ$F·Ö" }¯c�øhˆwÙxÎûzÉ¡ci˜Ih­_”hjšóy)ÄcË'f�öK0û¢•±R,}­ã¸ÿ› È0^yûŽþob„ógé+ÅßõyOýdÃCmWb|"�Žë?dÎñ]¸#šê¬]î¦gÍb¦X×7–È@‡ü'lfòZA„sN¹Ìk2Û× Å,fìmƒïxÉI\×—á9 ZçÓ1š�Ž&ÒïݫޡclON¾ÄøÙÀš]g{EjjógÇÀñ�’o¶\7„‹¯s­ É-å²T`Ñ{SÓÞ³TÅæÕ{§�S)Mî×Ûò‚¢b.Ù¿1¤ä.n·…óµ~’D¡”Fæ–^ƽΌ/OY�Ú®ø¯ ˜GZvb¡öÙ•þÚÏõüq뮑k÷çèƒ}Ö¡$U)»ß¹ ô¤¥=ÛîEËî »æÆÂh¯å-¾ú™ˆò¾|ì©&¹ãðä5Ï­.QC_Œ v-¡ë ®f‡®¿´�®TŠ¿m¹ÇÎAå…©(Ýxã¡û©v™g¢#Ò³ ¨Ï„ìDµ…¡åÔX;À»€ztÛ¸‹S5„b–ÿ�º¨¬š‡Ñ²@H=ù°ë«ŽQ DN¸g·xJ–Þóǘ“#ñpÔ;…#ß8"^ñ~Ž{“õ>´ÉœæáÖþ`ÍDGR±RøRók ­’@Ý—’m["¯FÌ pR_¬C§vÍó;!xüôð1jb?û‚.©"_j힇dÿÌÍ¥ jñ\ãô›}»Ï?†pÆjŒI™ŒìÆv©ªÝ×5†KËVk©„‰ ~HAªalÆ8Ú¸€átšlâÙv—ýt!�ÿè­mA‹‚PÕ ™é­Ð]ö^Ôs,7ÕŒStcÄn@Fë“]†ø’YjÊšiùuA�Êá|Žd+½:gø¶nس˜j%‰ê$¼šDü(­Šn™¢ñçºXâXtŒ2ÖÉÖü#ßÐw<��¿b“<¹¶†åvÁûÜ [ð %wû±,‘¸ê[NJÃLʨÀy�T&|�lÔc)2JQÑõwÜÃßÜNz=êáèg‘.z9!Eùõ#dîQ@à% È ×1@.Ó×1à‡$Ù‘CŠñ»}76­ö›Ïå¼%)À>XŸg\öS‘ªÎ_¸Aæ58�Þ0’y i¦ºn$op.ô”^�b¿…�â¥oÔ ¦Ôw2DD¸Å4œÖ°44“}¥¸È™Ïw­÷°£dOñBšöW»rU`j”Lt|Ä÷ÆÐòÉ ïê þÄ~\Kþ/ý�ÒÈá›[kÓùma­gÏ×|«`Ô ËЧ}Uío7�à‚&Ý%Ya7�<¹kx±æçb9÷•»þ9DÝÅßý�ÈÏ¡æ¼ç¨dŽ– ý²}¦âo¸jxþò,‰I. E2ï¨ÕÃSIàmY–Rj“Ê@^ËaX­ù@ú¬Jyà:ü?|Ð_DZ[6"½ß9ûrd�† (õ5—î^ˆ¼,)´ à¼IQ|nM;xcüúõ·Cýàq4b?´ eLìà+ЬRX4ù5=zFÞ9k�^ª™\©ˆ•¤^¦kš®0òâv•*Ï›ÝÆ=¤[ö—zÞ zÇpPª1b„[ƒÃ©ñ)<ÞJ.5ºd­5œQˆñG éÕ�r—)Bs@N:qž(õYa D D¨âæÎ5¼+#q’Æ dµÀ7e­·ßE¢º¾mEÈ¥¹,¢�ÕÈ�©þÕÓõž=B©ª{ª õ"!cŒÌI“Qýá Éy:Ña/Îó~Mhh¤†ÆüF¢ã–ÚzëÞ‹ÿ)ú4thñò¥¯”º¤GÞ–&G{ӓ︭P3÷œF\­?�K�jã~…ÑâcÉÖ´6ž(l ¤¯„2_G„E¿UÏÔ{:ÿ¡t]­…ã;”•BˆiLΔ_ævÁ;‚a´ÇÄ»0eüñ¥¼}®_ ƒFΣøK?ŒÜ)‘”u[Oxj-FÚ/Å¿âQDúU…� ôXñîyqƼ¶J|*é23ÿYýš^HrEðÒç:äîò%sð…DCW¦T?WPî˜Ê{æ~¥¿HUÔ•”ªçcüw³T>o«³²xÍí¡‹òØ\¶Cß­G¨[ªÆÉË®Ì}›ýüÁsh´í°§ƒR›§~§ÛO‰C_/«CZà«­ïåIÀ££ôpBÌ/P(% é0"]²“?¯æZl…m— zbä§cêMcÊóI7ŒÜ=yYÀàœ”:"YV+yâoç”3É\NK W3UƒÌ;0Ð8º¶G||×\F4Á19Þ'©¹Ñ§èéEgÐb 4ÂP\ Æ”û,ïÜý�—†-ñ X=¸9ŸWcS6'ð½bÀ«rbF<ÎðtŸ©I[÷ééaÐ�x‰�)¼Ç“QUßÒíY._Êy�l]�›eïHÚ±�Á‹k õÚÀß׊^ïF…¸õûâ¤óY“˜œ›Jd÷&æ´œ;=ÚÂ/jüEî‡mð2³šWlš%àbõt¹ˆ`¥`dѹkYÆXêê×µ¬DíŸÑ�N¥b׿¤ï×¢ ÑsèæØÇ›Gñº¨(Øh&73ÓŒ–»”¡txaMæ!‘GÃB§^#ž§z£Q q�œž÷+Æèé®(Srv&1'g>A¼F`7qñö]½”t�÷Íâþ—S‰Ž2’0È€�h†H{—},2«‚5Rp³^a°Í²šRõ™R쓞cÐR³�j:w¯6AȽè!�¬–+\×»kÕ § +C¨X-”¼gk¨2 Tÿ°¾7 VÏ~$À1Á¯½Âð㦔Çý›ò­þüREJmôuEÃOç“Óf¤yo<±ªj/ÌaÕ¤«ñéi�PõG×D”Õï†"¡±Õ´š·<—gêT¢Îöâ»a5 ¥¢õ35‡Z¼ �?‹�Í¥Ø'òèß{–žù¤±à,õºë<¥AÂ,rCSŽ 'dÒf%Cf² 7®é›¿ˆi¹½e ymûž˜ßr*<úÃ$žåj¯íϵ�¶‡Ì›8U±¼ç´hXÌ5fbŒÌm )¬ºP4b±]„-±p¯{•éAôÖã~µ'æŸï\™^=…·+ª«r­Ò“€Õ‚ ÒÜë¸Öfä¶ íOØÙ%Ÿ˜ç\6 m/¢é"XW[/:yäA�IËß©k t sù…lØîS­PæòwŒ–¼ÐEÙÍ"üiçµÈ"“®Fá¼Ûr}?xÙ zSôȤûY½È “I ½µc�‚<Ê3«¸B‚,�°Ý/ß­ãK}ÐÂŽ®±Ù °JY?pÒ‘Â,`­vR<âWÀOÝávAâçrY•“§ôè¤UÎ�ïû“žë ¡…ɱé0,�+_pýë| ð €�Š)”g?ïÌVì /vËœú³˜éå­ÆnŽÙ*ë-Ü2B q“¼ËWú; ß_"1‹´(7d¾.´.{¬ëéPÏóh5‰‹(|úFñhþ˼td�³OÁÎaAC(H6íoÌy+�½Ö4 ¨²™J¥ó,š@ŒcF!+!¿t��FqÄbH/3{b&ç.·Õãã+ñx¼på»unCÔÝ'¦ê©2;ƒ<¸ðbs�¯£5Ò[†(e´BÊ;‚áù�v±¾šݱuqåç!©ß†u]AÍ i¸êT8 „\{/½jï�ao¾åƨZ|i0«nh‹¶þ€,J,T¹f >Srµ¹k,µG—mmë£ëyyüþGxc:Q�ÿc{L»£4ú·* ‡ò …¢?ê²|Xש¬©xÎ^ü'³·ü˜º®ç�Ï|#z3¦j&ýkûó;ßÌ¿w•ãÙ³v}y2’Iõ‘QÍt¬¨yR:ótÛθýN#>¯ŸyÞq¿‘R nˆÆ©âú­xR%dш,\Ü�\غ^nUG�}äIÚjÒ!ðƒ¼7�Ã:O[«ÖÏ!±=Me,Eg3“¾;á“äãÍpñÂc¬JÄ,†Ÿ¨ÞÝ>!‘#Œ®X;ÂBqX£¼ $ãŒ^GŒ ¥’.m——ÓŸ5y�@»/{’â¡' У÷eøÇ]ñ±6Ýkmä.ŒœtÄ¥J0H´PذŒ2Ó[ œãtÎ:d__.þpƒæÓ“!êjÇõ‚Zè¡5Ó=6Aö>e,ph’†cUŸ"’k|~P­­w‘Óf¸À|‘81Ä@±Yã] ²¤ò””�<‡èæ 1�ºhî|,lÇ‘Æb"ƒ5ÇÔ-Û3f� ¦õ?wsËÏ/õÇr²œ6í@± yw´-ŸÓîmÎdP×!ò#mÁ{—Ñ(×§«ïÇS5øý_ÞýˆÓVóéí¶v¶c£ªs{ÊZ]SXâ¼Ï{äùCOîØH2Óâ{ûÍætRîøÜM×ä/¼®f¨Ûш¹Ø«|ã±yØ F8@¶ã–tô�¾ëLýñUÅpm×°·ðóh%K©uÝáã£ïCw÷Üsr[šË€NéãæQŒwáÀ‡Ë8Uóßu¨¾yf‹ç‡.(Éá1�µÈk�¼…­ʤ¿ 5s7î΋ù¾á�ýÂô«©cdSyE5 ¾—](Œ¾HÆö¹¥ÜãH{<öÚiú£\TGÓ )ÈDK–×#2ÄDåñ|—¦ºý½ ÝÛXF;XwÊÛ>ÁH”×ΛÒúºß,‹)sãÆ ×ßbàR¯Äðyòë’æÇÖ÷ßOt A{î#'ä„À¦qõ²ãC=Þs)€Žm[p«ŒO¹öïô®ç^J\ì’.œMåü,`þï7¾Ž÷ëýá·]¼o «»Å½þÕÊô­s«ºY-gu—Pu•xz}2Lñu³,ÕTËÑñ÷æ2[®%÷ŠÚîM¨èçÿWnp ¹Oó¢AX¬ìÂò¨áR/ ½)"s—ÐÇ[–Åît•µ|.=š]q†< !CJyæU™ùZsfMj–£UWYòù£œûÓap¸4ƒÑž^CYÍ¥ ó‚gF…×V–×ÕxZÖã iuÓ¹Z.AÕáçÌñÇÛ¹šR‘®• û(ÌÍ1ƒ�dzÇ<æøÁ$¶}A„ÖF{óCYœøwÅ_ݶ\÷CjwÏkQ­ða¹ÉÈãKÈŠÃ×3CŠÐ®QmÐ\Ý “Y3.;ÌUð†¶–ºÒ·¤Ûr¿Lãûûk>+ûÏÑçiyxõ—õ£øBˆ|S,‚~6ãis²’ËÂà1à·•ÊžVŸû]ÛWáÞ¦ÆË=½qC¿ì¶ëÉvq³e©üÐÍæ>Îáb{¨Š#¢èù ý&g¸±€zÛ’�!!fάƒ.‹ÊK Žq–}<ÒÒ ß²øvõÍ]€õ´ºÁ$ –�Æuׯ=ÎP…Ž;Ó¡ä½�c ¦PšP+çB[èì~|2y­Ø[ÃÔ¬¡Uónx<£!F‘7Û�uæSÎý°";>zîÒḞ¢K62¸Q^lù§°gÄÍîÀØS^-ð—kPHJÄ:WUó; \î*»Ÿ9•îQ„¾¡lgagç„û7ü^dÏËýMÎyVÝ?B e¾Ä§ÖyІz‚LÖK ¤ãùxÑF˜�ƒäüqŒ!cUÁÃéåÌ)p½!¢²0]iöt;XÅç,+?ŽHðn´#´/”H^Ñ+Ý_ÙÑi_¿hk ,=»pu¹,“³¬¨$Œ B`±ÎB3ÚaÇß8Øõ�½(è"QøÖ„[“ˆÄ,�½%Äe –{ž<¡J¼,ÉÄi^·´Û†³e L¶@˳ÇñêbHã=åépx—“<Š“�WÎþ1&Vs¾vqÛt VÎØÚHfô�¼„dÊ~€Þ)w2na¨›utîƒ7¼µÈ‹ÉÍå9�³ùÅ÷ã]ìbæ S7c­1î f½:»Ôd(îaÊà¿yßÞŠåxåIÆ—ûèÖAŒÑiù¤lÞóÛ°q‚ á‡Ôµçf}Ì ô&;7.¥Ë¸.êºr*�lj³A³ñç1èºñ“Þ!x9ïy8Å˽ä>�² r7‚�eÖ§)™Ãâ/þ / ¸ÀŒb!kf¶C¤Œú•‡‹ß8µªz’Z%M …ž…’ÕA©Þ�Êg-šƒÏ±`È•¥ é2ªŒ;yÓ$¼çÖý°ž s˜º¦R³…{Î%÷¾ØXt(¯„.‚xÀW޶µ¤­o<…-è휊o�Lyž;Ìx‹l*sCh‰µ/¹laÔIn”;Q8ãС‡A{Stõ”@hþ²¢ÂÉv �‡‚GÊŠëöuÔ€x m릯¡Ð}J+Û��AE´# àÜ�c;ÌkŠÉ6otIŠØ£vÓ€`°þ&°fä×À¯öwÌ×…®xÉ^õ΋§”™¢ñÄ?³‡ÖœiU8¾|c\F4b`QŽ«WÑW§�Ýs ƒüz EHjÈ�ðùtmY2m#±IƒœË“ §ÏòY2x¡Ï V¬,7YÑÈ4KÞ"<äˆ}‚¤å⟨•"»ßX`ÝÔk/He–Áƒ¼µB—ÂK­›Yö¼C¿,ÄK{'—+ á 5Ó�9E»ª\‘ôÞ^Ÿ¼eÈrbþ?œ®J-·—2Žá.iWíF› {$‘”µHkùmyÍ2ZŒe‹«ÈG2”=ÓJ�: ÑÑq_ƒüµ¿]µ­�]^ïÃ;N×v€„ Ì5äÈó9ì Ë[ßiàà–©9²ßZ³aõÜ”XNf7o?œ�âáƧdÑh¯PùñÖ§w’â8WókÙo.< …ßJ—NVÅÖùn¾Dn¥†mÚ¿&;1óy�ô�S®™Ñݳí‡Aï6´s)^™64TîÛbÞ™·�yˆ¾4ñÞ¹ªó^Ýò‹ÁlÛ¹ç•(ϯ}_³Þ1NJ0æõô~�Bö0†žÝÛó�…-4úzñåfB˧±g¤Ñm¼(+É Ùž%Ï"`šÿË�߸cœŒP¶cÍ`,`£ {!íbÍÑÏhœ~‰êˆ\[}klNß øjšÆñíÔ²Sösà5î‚�µKqX®á‰=ÇIeÐX\�ˆžú§Mµ�%¿Å²b7eˆR¸hFÁý‡ºjã|1úŠ|ð#TÈlcï?9Óz؇Õ~·m¹ðª~÷*…ãqt®7…ddVy.å“zºw4M´ÍFæ*Í%â^óc‰œ{OªŒk(à�ümG8u€·›m*K!kI£ªg]áuM7e&ƒn-a¶C8Ë’a7ž/&2k›µÿëm/’/¢  JÔ‘ @�æ4e“8kŠ<ÕjMY•‚3&=%ÓL_ö!N-)øï·@ ç…f]Ž-j£‘×G.@”j˧ƒs§ÏŒ+@©`4Ò#F¨Ù#~z~¿hùÑ9hÃV‡ù)ždJšbO›«!Y¸N½—K…ˆÝ¤Rs¸™ŽâwÕšL@}M€Åh•ýrEžyÍkéàëžÏ š\¹ë÷¼ñío‡y ¤ “ÿ.~8€ÑX¦ˆÆ  E¡š)Aþ3ÙçPqˆ Cm�³pÕ<ò˳ïíº íq%.2D7™hõžö¥xÛºô%ƨ›EGçìfK[¤Y]ûБþØ£ôyßRg¡_Nß^øw–œÃ£/dšëíÃ`j³�Hz÷Õ~YDÓk ñÍÆ×¯<´*_4jšœíì¯åæw-ž”Å—†Áшóü=°Ý†û6Dé`Eõö&‹Ò´wã��ë”. ^Õ—ËAÁ2ú‡ÜÉ}Úì7A«lzJ:-Óž4ìàê Nª‘èÎÙºì/NÀX�BÅj‡ÇGë¸ÖÎŽûœÍ±!jÁ ÁrP~…¬—”“•x²`ÍbI¹å9R]²k\ƒo]ÈH7unR샄‘Øu��`×Ç#Gœ%Ù…#Ćm§UØäì.»k¤i©â£^Õ‰»åMè1kç[èÜ:í*ž &×­þ_Ýëîå®î¿iŒ4ßQg&ˆnÍÚT­çýÍ®PóŸµúç¿å’¸B˜.ç=•)^¯Ÿ23ãÑ—CxÍ'›­�.G8K³7~fã÷ÿV™¸sà©ýàðvyÚýjþf6 ÍS¡yâl¸éG&}·]…|�#®(é‡ãY,_±CÈ�#¥ÙØÆµÀßß >…Áú¶Rw’ÆÏæÞÃò 4ØÃ ë$û[Þg ú Ö‡ÉíÅcøu|tÆ”*©ã»Òq<òߘO[Ð#º W%³�ËÙàãÃÇ™µ±%‘!|0c·Åþþgέ¥¸n÷¢²ýn×€¸º4»þ`ŸeŸw=F,–!€a{¿h~ì“�þßS2Ìãj¦S—؃çïÙRÛ_%ãྦ·;8úÄ{”iÇ!ÁoXòèXá“yÇÀÅ×ÄëÏÕƒOߢÒz4‚U{�—î* ª2¦JͯoåÞ[hK[½âS‚ñ ‘R¯*ÀÌõTÁÚê!Kœ… Àmî´cS `Ò,Ï.™Rf‡Eì€åD˜9Õ2T•/á<+Dm-XªQž@¹Y‹‡[^ ™1Xe{XÈ:[žŒ©œ¨&׊ٜ*Ry„xs²ëÚj17˜¹z‰6NÓ±»Cõ“,˜5dKÁõ7L„E¥`[P¥´×%?è¸Ã#‰ËSŠé©eoJ\ÆO+—�Û�4y½÷‚r[4Ø#×UiØÃ#f/ßZ^L.Ëlœ“Ô3P4ÃU ¿¢/bÌÕÑhÔvÙÒw~LŸRÚ—Bí‚•›íÄÿ*޶§�ü�å¢Ç=þ øG­_DZÖRÖ=„K•íÝõ;�«š¦McìóQO–÷Ä~W…þ ± ©ÆÏǯnÏG2Wª*ÝÀ‡Q´÷O·€È³\B¥¾=£$o/¹ÆJâ«3�/ž]à·UAœüå‘Z_ MÍEB eåÂ0�Ð s8ùãÖÅx«.­…é ]S-jléÃì,4ú$Hî�#D¾†-Íî¬Jõ31£Á¹fömˆü‡®^ág}�ÚŒc€òÈsõÐf|/PñÊnkW¤œhèŒÔ°ÁY®÷W@ÈâÎcšØå÷�e¢Äµu)ê_-¸Ö£Ç�KÏÈvÊZõ™£äd€�ðîgç.úL;ïØ·÷3áXœž<Ò•jè8Ê^9Œ”.2c³Ê@Æ$tˆ³{³qÉײ8ô¶!¶õu 5¬%º>QÉg¦*Ü6=CzòìPþû”.¤»&p`û{Gaïo#8½Þ·³�ðÍ42tG¹»†ÅÒ¢Cg>ÀÊž¶·R»îç¦ÑÈÅôX{½K¤>^îøm^°èR„Еs)$’Ç´–ã¤V#=ʰ�Éß-ÌÖvNË rsï$¶jåKZ­Ü6Ac�ÒAÛ‘‰ó:ófOtÖ”\ð‡Æ�ç?G ›É¾µµ_)ËgèûÈϬÞéÐQ‚;Ö™ßEå=­—³9^˜˜cé%ð=Tœw³ÞwÁsµƒxVnêX£'×É€ƒÌ¥¶°6nƒ#ËÝÇ õç‹ÛÝ,e­š�Uaë#ù3½`n¼ºw¦zÂp¬¾Ÿ¥¡Ã¼5¸Ê]j¬@0KS¢ñ8zʃŠô|&½’KÌî�QŒ²” m½§.†¬ËˆB¸Äi½ü;T½ô:ÍÖìˆC#àð)‹©jÜeèéíÙË<ÏÚn9ýަÚ8{Ž]„˜ûràî9òZßY-ÄóâûÝ]ÞJ;µ®3™w½- yÚÀôG�v–É/ož¶\Že¡ J,7#¾œõÖ0Î?©‘€63ê—4#u#®íëׯYº° ±N.¾3`™F÷îA7.± ¯´ÜÞ©µ†çQG�µÙÍÝ„¦!8É]\úß§ éŸ4äˆü‘+‰¼`.êßïÉ ˆÜs¨cE�Á~Wó×ÃM‡JÊË“´ôÆ0tôÉ»cìiΔ‹ny"14‘ÉŽlÖèXÍõäwÖ¾�u‡ Ä;°WòLù£ï„{�O÷¬�¥"$,yÖ6«7¾—Û¾¬•ë?óóî=¥‰Lh~D�?º®&ù[G1Ÿ¤ºÂä‹*oZ×�aW=�j¶uƒ½f8tÛüâ:IM#^bÞ}ë'|íØì‰±¬*Ò#œQ{VÏU-Ò �˜a™ÔHÁ9€Ø±À<“¼`¡'ÛÍ¥Bhl£�î�  Ú D•ª÷fˆ‹#{éhéùT7 VÞ×)–˜$bR±hÔÒv©~p ÐØ¹P•Žƒz�[lüðùjžsAüñ‚!˜m3k>m78`3ßñ¶$ðR×:á«{•ófO òoŽ>•÷¿N–�ÿÌÝK¿R¯7é.¤Ö\‰Íöù*½Óæ>ÏÓ>µÉZ´¯¹æWæde9ÖRóõ¾d5Ù³öQèëmé®Ç¤œ˜ ‘Ÿ#ª3ìr„CÐW÷Þ2>Xó¨D Z²%0£Þî ,ˆ)¹ èEºÔdÁ–c¾ëgYÑåUž[ øŒÅÎÆ .0ñ™½B¸mdÑ´kü=÷œf¡ëF¼[¶ü|Åf/cã‰1sN¨Ñg;AuQv_ª»!Š?«#¸è%£ÁuŽøXaú®öB$bS£“/ÊØ½]ØJà *bxÖ3Vn³Ã)_à”dèëµUshðê*ôǸd{D´J+&�ÐÐ53ùÜÉõq•�áÄ8x"á…ëÜ¢{÷v´(Aúì;¨ÜGÀ_{~F³ÜÔ>¨ ¿>¹GÃëëØK¿c_|IþîôòêNõö~Ý+JÏø‰xýåûòì]ÞVéâY2R>¸1þ‹Þ®¤9#xÄN‰ã×`Œ"\»à÷†¤f×\ˆ�¹1~Ÿß�§èwƒHŒÁ‘~@vW‚æa¯Ã5› 1Ç®ÑÊ»™1¬!c‰JF¨:ÞRül¨ƒÌ®võn‚(Äæ&™ŒL‰*¡4¸“ M%*¦�³‚h!X𖡺±˜y²`�\iPªUiÌÒ$&È„.ã’gç绵7õ&-Î�¸£üÿ1þs@ç/útÈâ:ÌNím2`-êöd™U· ¢ú·šµ»0x¨ŠßPª«žº×2´�<¥³ÿ¿<�E#²� ŒÊ}mpEd«¥ÍägùÒUÌ1�ÏÙEäF9ÔV|®wÆU̶,…»I{UÛJ÷„ P]G û(D8}!„MVçz›ß-+}Æ'òbYî¶%C×ݪìm1„jÈ,á¼'ü¥ýí׿™žÚš#æ½:M^å(=\™?> ½×G¥Z¥`ß ýš ò+úò4<›¦i3Ð6a%j *ËËS ð¯¤�„U·Ç;8/ _wœì¦Ñ¤Ñh&6m ß Šæè,Æt‚þöô Lù¥S�fJ޼ó=ÁUüLñôÑÜ._Þ=ñÞßWñ¼ ß8­hûþþq€ÉßÙ9Î}-§–³ùéÒI(y}mû²�*ÒKýÍÕu$5ñóZã]pÁüA—#8å9à�^-ôU�¶˜—ì@êc©r7ö1›ŸYÛ£#šÓ¿3ÿ; ¡·èB~^ŒÉ4Ý6ÏIvæ ¼b„RÊm˜hÚÔ‰A[Á�—²,âñ^¹=í¢ €k³YæÔæ/d™¬É`ðPV‘Œ$GýE±¿ßïá¢p^7C�Ú-'³ÄºŸEëW„{�9%°õn+î¼(Óþ/&�ížrDÈŽ\Œ0òá Ç‘»š…êÏ“wPÇ…=Ìp±­ªò”†HˆBký Z«là9Ó|ÀÀré¶ûËClŒˆÏkEãèîp?�8^ª´Ì˜éHóŽå"Sª#ÅB×7z~t·ÍâoËß@XU½šÑæüóöp…Ÿqr9B¼.É9•?+°1Ñ�"5Ê™Ïc¥­Î ö£—Øì´,ÏÓ‡’[÷årLoޱï§]Ñ �U ˆ+åzwWãà z ãOœ}ŠŸ`úš[+e’‰��áÿžŸ~áª[ó�§ò}�½/ÄÄy!QXsú�• zÝž1'›ÒSñ±‚ü© ¦ºg5¬wް{à7’Ôl+™ÌÖ½&·+Wà±1©\0@ÿ~¤“ÄЯ5ª`^ïcb� çÍp>‘:d@Zî¶2¶yX�p[±¾ÿ—ºÀà¹ÚoìÊ\�¯î‚Š(ì�w8�N5 ¡,Fä'žw.�/| ûŒP÷j'`¤«(¶…'=ʃ»:Áâô�YAE35½-I¶…CÒ¯£–·R­™+Þê¦÷Üá�J‚/K;; l¬O3¿[Ï@Þ^ü\Ÿº~ü»ãw&.Z„K?¾q†Ë x8*Õ»�ˆ¾ˆeTO’àù>Ÿ(F\2òýflpÖ.~ÅÒÌÒÖØQt\¹øö;ÙìÝÁÌ0õäõïs~•™© †3Ñ •}HG úTo.ceégµ‚*$T9ܼ]Ʀx½_ÄMÇ­þàü]Њ\~ߟûýõÖ3jßÅ ôöƵ÷©d�޶�š×LeC±96�ç¿ñF**­‰ÉhWv(fGòvÏDå»›êô¾àÓDÙÀÁG“¨á–®v=ë™�*q$å$È «%äINC”�îÃQœø®À¨i$•E§•$£#Û 1BÿÞ›Ü÷î·û ¿ÃÙò&$¤ßT÷™c-ûÿ½ˆìnp�½¶³d-3ô|ðoü=L6�©ÈR§¡ÙÊ@èGI×zŸ™à"£ÚÚ/s6Ñä4˜é¤çD«’9Ú®p�½Š'ÇrÈ4yNzÜæù攲£‡Ù²IÙõ«ón ¬˜³3­¥U¦¥ºÈ{“z-èÛ@´6Ãøq‹öcÈú¹;2£ Ž\_ÃôÓu¿}ã w†ÆþÖ‹oœùã{Í{ynîxÕ·Ê�ë!&û:7~äò„t8Ü »ž"r<Ýõ×ÙÏš¾‹ŠœʦóÔß™W¢ç›ÔÊÜËÆó2nP1áQ`܉#BãýW¢VÜ.I³ˆ,rÍ]C¤1 ÖL¨y Ä‹’AGÐÂÆ­ÐÏFàô³Š��¢l�Óa,ÍDŒA7ãC†üf7jPÍ÷ªé£È±F?xë ŽÃÒ;`ó!òã«–PD‡�õåL”j@Á"�ºˆW'4ݺ'Yƒ bûô«AÆ} ¯u¹çYÇ‘a´1z4F.‚£=�ã˜çºÄêEÎ%\è§ÄçŒÀÌÈ”¤ÓÃàžIöÈ&á°H þg[}É+@kéBào «��\²äýÂbrU¬ÀgÍÕºF6;G>F)UåÒH$÷áîd�O„f¨eÎ6¥Í[ï¶ï¸ •CA%…µL hK-cÌÜvÐå•Oz<4fÊ�µxw}ÚOÊÜ©Åú=QË©Ë0×–[•àc6+8Þ'w?†¯™× °+ë&­e‹¸Z¸ºÖi6¦cl½?¿‡ÕíÖ³#N‰õÜzßf0Áû®_„¾ÐãÎ'™õµÕŸ•ßñ<:™›öà7¨è¬3Éwd‡e±­HØ•„É‘%Ý™¶k²–2Æã B¡ SPïóZMŸ{Â/çq?“€÷ÚedúŽc êšìŽÚ‰Wø­7l±óï£'Èb).6`‡¨¿˜bÛL½ív‚¸'ÇZrvvk .vPb§9/”ñ¹{i¬i›c"äã+†Ù6ÚÔø‡'Èmò×£ £@�óôúÃUcOHÇžº»»á]·IA1fýöHgÊapžk«âÝX:´ŠûO¦4 ¸_µ‚Dø—Ój5v­&–ç’¿§º¿ZmxzÙ{GxÊ\s‰ÑÊßÃ^ÿ1±èí%‚�¶¦‰»ÒWSRÞˆ�ÝÖkç‹©ôþ›ù5šò§FXýn2¼g¶œØÞÝ7£ýx³ß�ƾ£ßÃX‹Î_ÀDLv°ø­b´=Õ[4ÁuÚö¦Þ†§Ž<Éao¯ž�š<ÀÊž³êb`xÓ(¹XÂáCçUÖù¶Vð-î#г8Àî#Ûãð‹ùíA °®2ø÷òõûÉÓZ�9Å©óðç]}�/£Úڰܰ1ûe?I -èúþ:w7¾‹¿@ñxîiè1�k˳«(x/½=Í}ê45ì<²–èä‡ Êê˜{o@ìWiv!äÀ›‘Þ>6ú#¯nÿÇ·O…Ž‹Þ8*¹Ù¬(Žgù±£…²¨V Y´û8™ñÉÂ# â�¤ÙG5üS/ðàèîÖ­~ŸWipÀ~ºž‘LÖqŽºÈ‚ÚµüL�þ Q=vbïëß¼ù•_ºkúU›9TR›—: «\ÇTþ3ýñ¬gù¹Î6œùö §]�u*s�²Y(H2à¤å&Á1|)ºÜÎ?Ì dÏâ¡öÁî<‹…Êf³Wá¹íÃÓ|˜´#ÏžÒ“•¿#šiB´h¬yi@s˜þÊ;>ÖÆ; ÚÜÛ'+.L¹�Î(,M=eÂÙBÞÂl¨£¥5Ž¢ÄÀe ɶjÉeŒz–/Á¾Á§“ˆDÞ:š°¦ÛH P„©f[Y´6#uÑ ƒ"˜-´[Ü«Îêc 饛­Ü2pƒrÔ¦êhŽ,m6*¯'dèuâÏRg•E×I+¦ñ�`åˆm¬×+Ápsõý�°3§�.¡TÔç¹í}ÊS–9Þ‰§]�44�d11¤Æ0bYé OW5áZWŸˆZ‡ �zW›Yú8ŠVÒNËy«RQ�^äŠF› hÛžÙß‹¬�8ôŒ–­dIÊH ˜FÍrL2¿›ûüаf8^„!:Ãûoò;NX¤Äv‹M4g-™ÅÆœ²Sצ˜Jù±-ÏÐÎGpˆ_uÔHÄ1…D+JÛûnyºÒkû5°~ ŒÇïðI‰, öç%±¯ÒJ–Wyù=?¢!ç8£˜Qj1ÕýºO?g�¾“ˆ�¹Üþ%Édµ£ô±UÍ•O�ÕQ…*xŒV/¦£ø¬"™Ã$«U$‹’EÏÕ—™|=Çb0>‚äþØ‚'ûÁ㻟.×3­»ENl‹–Þ'ÿ>p‘4šdÆ.J×›cÔ£(É�³pð)ýê´|ó+$©£t@èØùJz¯¸§Æ$¯SqÔùÌÈAÃëÙMz.—Æ0›|ðK>±”gÄ®0¼³Üån~Ä –P³‡VL–ºÍ}—KŠu{Œ2Q…-šUÎò0YíÑ+;Ìk$Nøâ%ѧnëÖî.8PI½qMXØ4Bâ©|T�F«Íy2xÓÍ0‚±{€fËü1òQ/?q±k[Í~¯Ãb�Ö2>b/ µº�ýûžÖáìú¾ ½Ä~�@˜õSA2s+“�âĘ(¦<ç»Ã"ÒYŠ&¤Œ¤«(ì5ÅV(pÀæ ¼` Ucmæ?–R‰Q>þØç’küû‘Çþ.µ|>Y"û†žþqĶ¥66HRZ"±�e†cäÚ¡†ÉÃèçE0Ù¾öö0?Þ¨¦S[ýúÏ¥àW‡\®ÄþòŽ4™Ã~•©N‘³ºÎ½šÞvʇ®_‘!r �¶aÛð}Vleg/½÷?O“ÊSÙýš÷‘QéfA �zhõñ¨"%€…輦(˜qËJ:ZÅVÐØßï³§m6ˆJÛãä‹…ÎìÓÞ8Q×�$�ðã‚‹ÔNÏFZŽv’%âa[ÅÿQ«Þ•øÞñë×pWÊÊ,xö}§8dhâ�Ý‘ò�FLï‰a$„‡ÆmŸš1a{dÐm=°CÆ |¯¥¿n~õÝôÞœï}¼4G½nvÑ`Ÿig¬¶¿’XB ]&r`¨eQ)¬3X'†µë1\­„É0 !hà&Ì v‡M‚W Iã`¯•í}Žnã¡›G>g¿#emNMñÛ%ß‘ž¸4âx^h xÃá¢Ó‹í¼ëtžÂþdG¿Â°uƒÚ�.‰ýõ:*wU܆î$&ðó�Gú°ÜUâ=/F±ËSú<+a"åòI%Þ�Ñ{šü¶ªå‹{"_S>bž´^]¡µœÖb¸>Ye—àÌÁÕ/Jñq°‰ÑZP–Á=;ÙÕ=ÀÕRæ£*P1l· Á2ùa9>¹,–¤1Tuôc¡ ß7®§ˆ <tJìðüÌâ³áCb`ä8 ä*lÙ?6Ô Ä~eV½–µêu‹ûaçà0xoú¥ã­™†kÃC¢.Å÷Û—ãÌ>8cÎ'�ì °cçlÅdóFy˜xq8,�êíâ–,ó×9ZÍ5Ê&H’XCÙõïl5ÂÍ\ „pþü1ôÑ'˜»ÈžùÇÜ©\¦” þgX =ý¦¸HéOî¿bÇÁ(à+üþ®±E—/.2ËC u«*Ÿ½×{Ãüþä==û_ÌÎíb0pmü8ýE�ªÖ½ðØüÎ\<¥Êý|±_�§ìa…ŇïtªÃ!9R|‹Žw2¸Ø&ÄÌ0óFßÈu¯ˆÁèPÁ/Q©Hü„›€…�_î£;ךµb³’ÍÈ5Áu>ÜÝKŠ8¡¢õuû�Û“pC+Ròb7Ö'= ´?:º¨Š�Þßk|"MÝÇ…y<ÊÌS|ú*×�æy¥Òæl7ç3¢f)³\Ý™›LÒl@0+pAÙ»h'¶Šã™ä /¦˜×µ›oÊ™|—ª:"{ïj-kÕÀ 3_ÏãVû‹Ð€ødœúÎúh�ƒM >}©úøùcU{Qô‹ùä� ¿—�iß]ÿ…��¹BÌU5ôÏ9èýñ€ åþ¹öZŒ_�,´0gͧ5)Yõ��ã-™kü#( HMC¹PõçãX­x.d½)Ò‰4d‡¬QHý\ý/‹*ÀÌ5ƒ?3F°µò’”²39Öâïȱ׬yÊ=†íqXδjÚ•R» uÉ‘OÀ¼Ý -Ïó~†(+$Êk(œ†R€[ÀúÏþÿÿþ/ãß|}pÀÊ Q tÐ¥£èª± XÍV’PÕ`\€¥$»5vÝ2» `hwÝ‘íD«À7¹¢‚”\ëM{Uö{š_[³I·u°0 4u];°¨¶m1¶à�Ý¡]g£ÀôúuÞî×c€ÝÖ ð�}T½ÊŸ'¨ÓfYš Xµ’J¬› YzîÎ�Õn–Ç;Q3®ö¼Ÿ-CI„• ˆm«lI#mkXd´%§là¥o»¤Š®Æ›2ºã ª±mFÐjH0¥±Rš@Pg@m¶±[4ªt’»os.iAhÍ–Ñ-2­Yezåµm6–Ã{¸˜´¸¢¢Øzvd�vJ *�@)v4�ÓR©I¢ÚõÙ½x <õâ»kMƒlÖZP ìͬÄcl‚V´4t(” €=ÞiÁ *¢»jP�A’¨®ÌE@iÐRÀ·ÖQGfˆR*Db›lÉ÷s às«¾ºNÓYµÛŽÒ¤,Ìí¤Ù×ZŠ"(xtç{eP €P@J'°ÑQtï^‰Å³OCÙˆJRh BCX‘£FÚ"×'79¦­­ƒ#fFØ ¶îëš»7fJ‹*5UǶv¡E!+ZE±¯vè;»¨¡m¦¹]ØIG¼ÖO†ð¬¤TtÕ;j¨Š) éG2ƒZjØ"JU¶vç³Ýƒµ3mÀõ½èZJt š’Ujsi†�&‘H @ÔÀ’‰*mF“Újež (B&¢š”ü¦ ŒŒ$õIT)µ4B È1$Q =@‘"d 4¤4ðïô?ëþÍ@ëyÑÇßó/ûÞ¯£ÿÓ…(Ϊ³& Å?ç‰AµÑw.婊X±e¦&Ð’†ªýWÚ¿5.]ºp¤ÑßUë©5×nòØÞxAAH–{ÇwuÇ]Ý®½yzî-î‰ëÜ’îÞï^´Þó­Ê6…ëµÄ5yEÔ*¼ZÐwChE ÌlÄÈ­SK7™…VåÑÜÐF —HЂâ†�9Y#ŒÃ�%ÝØÕ»&“±¶&k+j²6¶Ö‰w±”�ÆÔÝ=¤®U 0äÅÄ`ÜTÓ K�6éjŠr"…F+�Pk"÷`Û\{Ž´jNï ë‹Ì‰ÉˆI×6]Öl¸ FÒ¸JJ͸55Ы¤%äÌù±2Ÿ �V‹&ìň+"í¤.yyUpPNI<º4:Ê™äÎa7QuQ'&ãKÖļš0ÂP˜{¢ênãYÅ@$…é½ç,eiʆžaB�j»ãxœŒ4‰…¸C”g8&ä@�Mi'w4À„ÞL^ѨËH«DÎÖjËXê.VFš§06öerÖ9¥.#& w*&ô’îÄàŠ"Ä`4áÑ ÝáÑh˜¼ˆVÆJ@ÅÍJj‹ «\ÝØ• �ª R0¤Žh;{£1c×TòÖ¡‡šñÓá¡1Î�¬Xf*¤�›ê¯¢"iäÖËŠ‘uÓé�³˜èg1Óº! Š3#6*¶Í12ت‰Ùu´ z44qªãÅ‘tÎ�YQ@ã�n�"ÂämÖ„R&9[]Hµ¢(@štk3@Ã¥-º8È©¸T#–'y®EUÄÔ Èr/]´Ã±œÂmäA½Z4aÄ �TjÙ€ñ ‹ubœÐf‰Ü‚fÚ«ÎV` Ö‚®œòôÁx\R4é\h›‘0w2tÎF*§8&¡$‘©»dšO4`bBy»Zy*U]nÁLeäqó@WxE�% 2°S'aÍ�Ô å¥xv¸À¹¾1•“¬ñìkjaÂE ÐjäÅʳy¦P"³`IÇB¦†z º�X,¶˜ÒiJ™WÍ),®)KÁ¦&ÄÛmI”Lš1¨¢)Í Ð™”V*‹d0�¤4Ɖ›If"0Äi4RS$KM†*K�4�( É£1¢XŠL… HBTÒ‚Òhh4$L“1Rm‘’lƲdÈ(“4(É$‚%”BI*64›4ÑPB$Ä"IR“$h"$„I‚hÉ#$6M%±ˆ›¦RRÈQ¨I"5F¤±P‰�“APQ!%HÂAQ´F�2HX˜lI@ÊaF 3BŠL‚QL*,±¶2ˆ26 j4¦S6 ¢a£A™2–-BJ"’fˆ (Í še2°E¢3a`È4-BšF&Œ‹X�Š‹ Sd´ !ifŒc!ˆŠ2š� !2LbiŠˆ4…P#&ld¶MJ Ù$Ñ¡ ƒ4Q™31&bˆlÃ$M¶¶¡hÄf„Œb‚° ¦P˜‚&dS"Í 1A$B b0ɘ‹c2J�Š1’QHH±Fšj+$,j"E…d$›JJÄQ³@ر&h©Jбµ´`£#³™@²I"¨šf’6$K1¢DTˆ¡4¦S$­L„¥”S´L Ð1ŠC™”# fÂK‚ÄÑ$&4Ñ€È%D±ƒ 3$Œ’6šE3#E€‰¢ˆ’A”¥Dd`¤&¤˜›- Œ±’Š˜Š2)RC20&I!$F†%Œ˜6‚ÄXÀ‘ Ìš1%’(¡ah�©‚mƔݨÅ%�™•Éš(#%cf%ŠLPÌI¥*MŒ*AhÐÖ$¡Œdfd’Á›& Ð ˆÒ5"`V"Æ bZ #@h¤‹!1¬˜Š,I6+ˆKc³H1¤¦3DDŒf i$¤B˜1h†‰€ %2I ¤…š–i!(É&32 š†)2)!LhÖLˆDi"�ŒSD‹! 1�’ŒH"�…’€$M&A˜3 ¢(‹@I(Y‚Á,“&"&ÆÆ“0ØŒh¶#1±cL‘%¤¢$ˆ–I-F &´hÖ�¬kRFeš*SF“D"’F–ˆŠBlˆ”V !0”‚@*64 -”iiˆ¤Â2’lQL ˆD£h‚VE((+ D�"¶)¥&1”Òf‘¡"XÓDS2ddB4FaY4©Œ’ilÂ`Ø �¤6 ™H�’$°ØC&c4dMÆj1¤©! Æ’H¡0�j2Q Ld™�ˆLd²JM&š,6I¢Œ‚% (ÑŒš0… †QM)‰ ‘£B¦&bˆ˜lS"Zb#*P‹I%fSJ‚ˆa"e&44Y“DÓD)A†’‚Æ"“P‰„Š2PXŠHFŠ4TFHÄÅ "XlhÑ@�@LaˆÊ4D%!£HAŠ0ˆ P¤d¤ Ó C Š (¨ÉP‰¤‹¡!M,� �&˜�šS’dB‰±� ¤ÈÊÄ„j)‰¦ˆ!‚ˆÑ‚ŠQ HmD€II1 P‰‚)„Y�"J1’‹d’’h“��Z(fˆ[!#,Б©4`Ó4Œ€c"‰d�!))Æ0A1BbŠÄ3D€MHŒˆ¢C@Â#`ÊCH#™ Ì4b$PL# M€¤)…£I”1¦�ˆ²ÌÊ2–Å I "$Äch¶D"DA“!J ‰Q ,!M"@Ìi˜DO8 á„H«ŽbC�Œ¸8LA{‘5’VVéØQš©Öéé‘ 8¢A¹\aÜ<©ÌSyn�JEèË´Vu3Žš©29 ð ̓.¯¥Óš}úªŠ3`ÚêX¬@žf5Iu•U†åíN+-){¹TÎ4! +U=…æ  °¢�ÅFÎ0I¦dSæ`,ï2£ ¤"à÷Rˆ™¦î#†‚+™ª¡ÐÑ< † ‰«7CrÝÁV›Yj·dÝ€Š÷,Å\ã¦ênx¹t… ùMê¨à+(LÎ�l�…8å¨D�°�ƒ\Œ E ˆšŒÉ§ÍÙ"©_hÜ·UÍ7T ¹á›#BÑ@ÒÃÈS – „.x¸¬VUE;\8!WUuD›˜‹˜™å‡yÊ£Vv dˆ#g#^X†Bfîöí5Ƶ23IàÚàdEc'FÚÑ‘sq!˜�ˉ™QD“P•ÀÌR¸aÀ3Fg•&"2Ÿ,#˜^ šaÒbóXÌ©Œ0S”\s\K UV*lM†&E˜ ®Ï*�"e«ƒ‘3hÊN‰•‡eÑWunv¶’�Y¥‹P‹°Ãà,C•fÞìƒt3DáRêMÖÊ—*Œê �¬+�9‘-à†îÅZ\…U£*—[x΀z§š2#1‡W1ÕÍkºÓ`e{š�Ö»àË¡x‰’ Í¥´›ZÌEæÔòŠ‹ª‰ÐEПhÔ@x¤`Ì9¥ K,Id(½¼»X†¢pMiÍÒÙª©™äF^ªq’ŒÄê¨QÁTn^]�ˆ¹UŽ„kÕÃÚÇ\( •k¹Œs›�нs× ;<Ž— åëN²f¤8ãUaÐW]X˜Š1ÕÅÚ¨¡|.n…ªöÅ*3�«,Ðu µÈ7já¯,Ìñ%µ3# Ü%# Üí^½U K˜b˜¦7•—:× »¬¡Ž²Žì˜×QZHBâ'n"*¹r™v¼È­U¦2grpÔÞç$¶¢rÉÇŠàÕ‘G]Í„)e=Ö܃rœUSÄ-K!Ì Š�£³±y,uP d1�]£¤^É͉lƒT(6DÚ‹<AY± %=«Bç!äÀ†Ëþß÷þŸõØòÄd‰–[ÿíOÿBÚùÁÿb²¿ºèl3µD+‰­‘RPêÜ\9pyy‘D�"�ùí±ŸËÞó…Ói¹S®C‡LПÿ ‘;N(Xq…ö¥ê›Fd·ërHQ¥àÁT½TX]H‚‰jE¡Œ?IM¿/ bÚtïE‘í]™ªyÒôàE(QÉ •Š�TŽ«#ñ0×”ÎÜʧĮ,ª2åT4&)8íuêïg–㤗B&<."ä²àú›13â_]{¹Ãä¯|lÙ7J)y~Hõ!M(ßSÁÓU]8þP‰C)Ç'!QG•j¶"¸•Eå2""DNXò¥ÓwQÆÍœùèË[ƒ A$«˜—HJÔ]Š“®ßÕ cï�]Uÿû#»úµr±¦—ÂÙRH¨¢¸ˆ>©Ì£¤ú¤ükM"3ØX u2ǂŗ2ó_²=ØútoÚ �؈K+Ò‡DyÐ-.aõ5—t0 hÔ`˜�TäDÜ+›5$¸�ØE¯ ’ø„ n A%Àá2LvG¦£í¥¥êŠB‡áF "W –äøIaã`–¡üòåõøã¹BQÆ5 ó²ºTYäÊÿ“�"Š RÈo«¨,BEAc§Ñ³ÄîåC�Ú´€mˆ™F $u˜…5=8-ÂU¾>„à¢dáª@ÈnËûX�¨‚a!ð¬ÖT·.’ðŠØÜºÝ+¸gÑÉ®3Ä­¨„ ˆ9‰$‚F8wtˆ´ØµSr"è•$ÞzŽJú{E¹_…õ½Û³@ž{�ƒÁz{oQÅ”"ú�ÙDzxãÄúi¯=4=êöÖ‡Š/Üðô!æ¤È5Z€Œ˜1©=©¹í`wîúÁ2¢õ©^{^½m´`2Ìb8c'Þªú¤T®ž"9£{ñ5Ò’á¿óv´ AGÌ…ú…]÷DÃÛŠw‹$Ëu–l’¡OÜéqH;œ®:Üg,NÄL/¦�bÉ<_ •€³bDâ•*~3˜©L¸ÓÕÅHeñL+¤=¥¸'Y—À(ñU $*ª—©\;cm³É´-ÑÛó³91‰Û+…(„ââ¶m©U¥7%ñb˜6O&Ìü—™ÃèìºAPóÓiZ#D9.ûK•w‡Û¡”d#CÅî0 ÍÕ³?ò¬¥ˆ ÌbµQ*ý]}xÝ# `(�ˆ_´¸€‚¿~y@†�Enú7dö£¹hPÌdß�Ð�O “b³˜µS,À‡ H ¾9M<8©­+˜tÅì=‹Q˜‚ðUéfRƒ ÿÄ8F&ÑÚÕD6š'=NØÂ%§‡‡Ûƒ½&ú›ƒ&«�á}6 ’¾�먼^˜ÆÊ& ´’=¤êw%©ã¨ÙÚÊCPyH‰©—kËó³ NÛÇÛó]Š‘mÈÙò j§%÷/…¤ŸŠn‡V„Ìýõ=ûÇä™Zç ž ò{M†5^ºÈæDY^eÀ"½ƒXÕªÔ!eüh&=E% ó*f£žÜpý®ý¿�¨ñx/­.Èì’Ê)ôCuÓI&�)p¦XS5ÂJíIîL¦B\Is÷Ȉ_ºã!ôÛ$ <ôW1@ƒÁŽ {ˆxGè‡ÚŽ?¤Ø_¢J t½4!p©¡Ÿ‘`Ø&Ö×9e'" |�%ø®{au ªl5épãÒ“áÃÈöß øD1êý—÷ú·íY \¦ÑHR€ú¢ ö¹øû¿R 5 +">Fž&Œ¯²9D ô‰WÛrAᶸδI#Å¢‚(ñ#öx™‚RH÷òò9Õ¢G‰a•‡ÔªQ#W L#ΗÏqTCtÉX¯ÑˆQâ] Âli+ˆ† D½PAà€Q>á0lú¨e$Œú†HdD¦&Áæ¥ Œž €ˆ?ZøÏ¢ž G›dG©ç{!�eí2þÛe ¨®’ÁRö•Ã,“Hô¸£Š vµ¢Y‚Wšù €~¨—ϯµÔS:qÁ'�”�ºˆç¼lO]'ÂEþ‹%‚L§‘؉•..Ê„u¦ �ía�Ÿ"„{&CÇZ¸K²ô¡r‚þdÀhD.|2f¤/†é§ÊqH˜D–ÙÓ‹,ð>Ï=›"8Nô�%¦¢9 $PµÆåÊdÇÚr dû¿LJI•Â� þ�¤Ä޽HU�Ѳ`ÖhälŸoª÷ûV÷ÄÁ¬wSGa¨QPÑEÀr&Z¿¿ÇB¥�ܱµ­ ìd-¡¦ ÈHY0Æ4êa&pßõQ+ýô즋͢­B4è€ÓMþ6›‘T¬B´�ÙÁ˜êàóûl“õˆ8)Bcñ"Ú ojkkø¥Ö3ßÉ’)õͶ¨ya¹~¼‡Ëò‚1â BÅ7×U"é„´.aJB—’VT>®6D²Ú]*;4Ò/QîaÄÄL>·¨Ž^�™T§©j¥_‹ÃÈï¬öa‘-tcWy m¹}µÈLØš¼8$"1ø�…Qq–�ƒh\,!U0ýªNg?´„bjÑbàm‰ë¹Ö v•JÅ�º=SˆìÒ%¹ÊG©š”S)É'u@‰!.58K‹¹£µD÷¹ ÄY»¨1?G œ3AL”Hëî&º¬ÊKÄE»t\.�bľŒX0è³ÁŸÔâ‚ËH– –I’xUÚ0=B’ ×m¸þ“"è²ÁÇl•R3ÉښБ“\‚PmAVPK£i‰pPƒúQ$•îF(±Œ¯ˆÒ蹂±©GÑFV1O.ܺ&�$Y‚:Š£8E ´%Cq žy Âú0CÊkZ_]1Ùˆ@ÆÖÇÞHbdIõ.!¼kñ"O=¤Â9^DýRL>wHœ*—ë¨÷kÖ÷§D‚É„š‰1å}À«EC´ˆ@®$ Óø z…ZËä}åÅÏP?:–"Id MŽˆ'�P}O«Dô¾í`±k¸öâ ¢D¨RÀ‚(¥ëÔ?h ?w° tJ%‚Øú鉕óÿK}˜›žæ¢Y# ×ˆ©`¤�&PJÚvf#ôG†I"04áä¯`E™<á"’•Êmú-ŸÃb ÔÂ{ !iayö…µÚ í®Hþ†¸'ã?Á~×/Å�˜!ú/#è³#ÑrW#’ø§µ?RÌ®hqШØF:CѓܠL˜'i|Q³R6�©mBw†8Òf×ÏOrM LÌC ;n,)©IÁRC&RHQp»‰&>ÏÇÙüý¿? ­iò|^ã…5_¨­oz¹ËÈh£n2C‘®4%dŠ¼Ø‹+xv*dn§6‚ÃchdV¥V-^¬r²78õ3pŒ·&È‘¸«r‰Á1r[±lÛå«ÔÕâÛ©yu3c$ˆ¬q9„È–TEÎѺV¤m‰XëE™Q0a¡±uu ‡nî.÷D”®è@ªÊ›­I•s7)P©Å/jº¹Ñ³Rg)†n^nîì=ÃÎ"+°5z£a�7»e“XÔß*ˆ±5aÔí‰F4P*¦R,\Œn£˜�ÄÍ;ÞH»È€Dm~Þ¾þh@ýÿ£šbÔ ‡WüÝò(ÔþéÌ–$C$�íB&[Žâ)#"ùƒ!›=á£�¿±×]ï¸QçdRHÿy# ß$/›lºâ™–ø“, ¿óðÕÏ$)%‚ëÙV2ª°Sùs"'ø‘»WJÝÛ3ç�Ú¸ÔO…¦"£…IZÜ©’fÌ!w;ÝmË{Ì3¨ŒïOPŒåE>Úv<ε9õéù�^®ßf¥§ÿU&û÷—Ðò×úžýW¥§“”C¿n„í(I8u%£m°ùy˜µÆRqL†‘¤«V‚+#‡âr1NÏdâFÜéÍ®SŠzbˆŸÌY9Ü>æL„ÉEÜÌœ7l%Ø3ÊÅpҨˈ´*öãó6�‹psÜý¥X—oÁ×ÊèÚ–$˜Dþ�ÏR„¹‰?¶Óï¦ }°–dtÓ+)çÒÃbù¾êDôw¬H²‹2#S�›]R«‡ŠÑÿ£ûÙ㪄Ñ·Ò‰ |G£r‡—g{�™ÜêWPó(Î/1¦‚u3¥BXª&¢ò2æÇVP£&ŒLà+¯2© « -½bOÒáè·rHäŒgª”ÅlœiA°? î><ÌÂpñšSpíV�köní6ÓÂÙ.ˆå¿î½.n; 6°Mì<¶ŠßÆÈzoÁ¶ßžªKÜ1IL=ƽ=N‡C½âÉœmòƒÐ-Uöœ3ÍÍ–_VÈ3�Öæ™@%,¢‰üÉË9‰ ¼‘óBl—žÿï Q÷šmY��Œ´‘ñ™»Ñ2êüU(þ ™#Yô—o ôí€Eá$™øf#®îǨ´Ë9«;7y¹r/¡ÿ­¦„Žˆç²V:ÜÜ7ÌÛ<+ÃA¸Y(þx*Ëä¿ÞZ –Ê+Êîœ!T/I=>@?ü†¶\ »'“4nÕ×…2àÅd«Õ%Í´ôáæ¢cC¢ê¡‘&MaŠx¾[tËfujMÈMÓÞuÿ≨¾»žñ&Âë§¿¼³8*)g‡HQ@�Uß‹žžýT:CáÒØ\¢Ûa²)¢æŸä:ʨy‘ª !JS\#÷J~¤D( ¨[éP“L¹�é8Ÿ‹³QwÄ$É�÷«ð…øqÿÃÆ %ÁYx—FeýoÜÜéÜvÜ‘‘]eKžî rK™1$�ƒPð‰„ “!OQô`ÕA†E†ˆP üQ � ËGY{ª–òŸJ¨ÐR½÷µE+¹§Å+UþdDü¶ÇK-FT³×�ÒM¦Ÿn øO|Éé‡åuô JÂM'/ë,e�#>êmYÊéÇ =�†ypˆÅùîG›ŒÃ¨j¦WÊb!!ˆÏ)©¦ªTÚˆ;H¡ߪ™3OVÀw —M0 }¤ÒGÚw¬ØË3Y:¾¸hC>›œžAcÃýZ0{=ìNã'´ÃâCÆDÚˆ!±Ùt�<õIul~®¿eT.ãõHTÍ·@Gúm£°ˆ_Æy&oÖìAÌb­AÔ°¨Q4Þ d6ÿQ´qÂ1f/%¾Ú�fQˆ`»cò×r«#<|ò_‰A?ªP�ô±…—È�`ûî 죥~|õ+×vBˆ7*d†QÂü 1Üg¨²�z‰n!”mHˆl2M•E[4ÜS*}DÇk¯™áz5‡¨e‚åpÁ†e‚þئc­žuUу’²¨ôáô²•…O¢Ë$ò‚gív}ƒÜ"�µ’V6¢:AH°B´ë0 ÁH�5û @?J7©.8Ï…zWP> CÍÿáFþ>±A{$G[Û´húÅQò–G¤Vòˆ1Bw"(ðþ áÑ50h*Í¥qÄûÆâ\a®ówi“Õtè*‡½4¥pjÍvÒÍî�wMØ´•¦×aA?Ÿñ›;ƒU ±ÝÚÎË4¥&<$£ãeôeÏ‘c6§ŸNÞ)•ªä—Ì’ÏjS™ôFæÌhÉ#ørJ~LWkñ÷üGË�i~~’èø¿5°û°Ì-} Jìȳ B©�[J-  "›~ïȨ́Ñ7"þuûgû}ôÁ‹¡~”Ap³.ƒˆ7-oþOü'!¨¨eÓ¨ézLKÕÎ7íd:Î{ƒÜå‰ÑõWwíˆâ¤r‡A�ñžl I·õ1/ˆ ·Ÿ2»Ÿ‹ò©ÂIoG¦4‡D�sêeˆuä©:1Ýš&xöšùg-PÃ%0ntË&p?Gˆ%]™S‰x€¡€fÉqJâSÜDpsÔ²%qÉM��|šÌ ®Ö†lÚ¹$Ïî&¸l™ï6ϲ2É *‡ߣ‡(D_éÔ. Ò¥Z£ŸM$$ÑÔ‘‘I*"3–]š(Q¿6íEÍ«•S¼kGã ‹ƒ ‘ÌÁ™®:yQ™È'Ò2¤¦�¢ÝÁ€D_�¯ß”mn½-塉Ë>v\’a=eoÞ\Ä<³IGì,äŸraóui­–cýüótbÉF¤Õì‚,ž/ç<\/ŽÿÊn­ˆ”†£ä?Ž>1eÏU=#!`ÒRP” k²Aqó×ÔI¢¹ÛFéþ*èEGÄúûz±#­ã<ð„ùܸ„‹-ÕF�ð‹l~3#I©Bèˆ<ÌCöêC¾Ž¸„f÷T »É½'õض¦ÅÒBÑ:týñÞ@c#*�¶lè O{)?ô˜>,̽ø­Ã()úYBèñ-aMBÃð©¾3}j™¿ìRõPÃeáOå…"1¨ÉUç°z%Þ–”«9¶v4ì¯ïØüŸ�â— ´ýö~côþºj3×K£C^ò…PºÑ£8rï8N �rËÁ"- «ÝÑvA8Ãÿ‰èšFæ2ÄÑ5±"³‡¬šÍ»å ̼#EA§³; °MÃê'«»YÆ&hVÈ3HMÔÈÈQ5Ô¸±„(܈%*˜¥9Ëêl:d_Rz°„]h¤F˜™†³#&¥ æÎ^Ü�ÇQ”ŠÈ¼µÃª&&Rq{{sôf(ÔÂÒÆ£IMFÓr[V/9U\³[B·)sp£±s SâÚšVç!$'ÊZ7ìDV-$TÍ�ÚŠhiv·k$ 6Elâ›”®¬L¼rÉ ZŠI‹Ë·H¶ëDêjheKÐ2©FÍà[Ç—RŒ¼W¸Y˜²NѼhÉLÜÄZÚÛ"‡"e(¸Œmê:îA*Î"¤$²NPÌfEé–*EH›aò„í+X77vÃd%í 57–÷1V–àŠZ¹–�)9�nÕfؽ�®MÃÚ×QxlåEå«QY7sjæÉ•kc É!·if�1ʹÔ] W¡7¼rÆÖÑÝÝÎVÍàÉUz2b\JSF%c­Ø½„È™±©Ý;¼¦Í%ŽQq9²I‹¸ÙcLJ,æ`†r&[§ ´¸.k›AEQ›Ãnù¡4" B©²rÖæÃ‰¸7q-MTÜEš×/Q• P‹·b÷(*Ì1¦ÎeØ{•ªîCÙ A;nrMqå,tN@Ä/[™{bpT‰²µCZMh�ÓU²7X¥Æ5F4NyLËg5™” `Í('™%Óy›™T– •7£†ä[¼ÎE v´X²«& Û$ñàÆ+²¯wmb̲³$LÐt«#˜tÍKÔE¹¶„ÕC¤T³ÈB†æhYsr�ã<ÔF¥Cš‘Z«Œ±lPdª¶®äêÁ*°P…ÌÎMâZá½ÀÇO£ hh}tmà»"+T`‹.™Š -Žº¶‘�;|aFX39ÖîÌX–àBŽ=¦…j¢ #&s.âŽnTdåÌÝL¡#(舧¥P@Øjt(šUÌc$P¼á@Œ".ƒ›Ê·ŽFQ½¤`ÅR”%PLjY³;9WØ{´Ö©U†¶…íEfÄL)Ñ�Ñ�»eMÉ7j£3„=µSp7vjnÔÌYÈÙw:#±ƒ.$;¢%7‚°ªAí»3Á®xb5¸Ôsˆ\M£s/-æn0¶ó ä?=r¥þf‹{v9šSìoëŒT¿ç9<ÉçŸÿ� AÏŠÛŸ{ùßã÷A†»óõ­ZÑœ?·è9ò­mÛò/ùOó¶¸ý¿íËâVW8{‰¾Í¾Ð8<Ýå‘Ýþžf©êPð�4½U¼SÓqõŠÐx\äÇ—Pß:n÷õOïŸ4×÷sáÒ?qHf^iÐ{CØÊ�™DLJ¾>ÞQÿ=Kò4?®ûŸÕРXôÝt?F?>l£8ï3yÃs•„;©¿RI[ä@ºgéOÂþο‰ç0Á¼u$§oÇ…ƒzýNGïKùÿ)Ú¯k&û:�œ½rÅúË~5Ý×£÷h�‚süÃ`Nßs?Ÿ…ÐrÇÑôôÌÑü¢s] ¤éyXs¡Ó&ê°·obeŸ¤øb4œ(Šãî±aày‰B#´—»¹ýüùœ¾l{ò‹çó•~²4.)‹ÈþåÓhø9vR#—Ãõ’§¿�¥§ù7hç=,õW�­qîÖö#Iþ}*ÅÐßžë ù÷y~)er„[?N@aæl¯z¦M´P|KÿÙ™ìJÍU`@2PN*P‘PŸ-ù‘©PŽH¤*IŠ7šÀDÂk9øä[Éæ*—íŽbú´KdµFjŽX~ÙÁCFë¾|;ìrÀ¦UÅT}ˆ Iʲ„ i).ý@¸P2Ýñã%3•ím`©–@oH-E LÔ5ÀU¦ÇŒ(½¬2ˆÈ\°5„»úÑ[|`F&0c s¹ µšêƒš¨¨5A"âb/kR–á½U¥PDȪ/r:7µ»lRP¶bEÞزҰtJÀ‹á$Hfð`œ ½QÖ­RC¿xF-HqL;gت( Ç‹Â0&Vµˆp›Ë Ÿ^6E�íˆçFx$ó –N>e¼™ @8¼"AÔÞ&º ÒˆW�…aüÉ‘*L!(+F"„›ž0�œT¢eæhf,VÑšY¶²Ñ0óQQR¹†vù•CFB+ §F* :X‰¤5¤ª�*ðôw,˜Qv÷.¬�lB–í.«‹»r%qî)à$Ù¤là {¨W3×±¿ù �{0ˆFæM«jXn^m-Î%#Ù}îö%-#%p¹M-M˜Jèkç»È‰&zG´©Hèpa¿¹Úeí l@�౑4ùJ?W6 (ÕÍ1’Ým§fäLÊE7x(G,dö๤Ã;Cˆv¡5â‡7]M�XpYߪ ¨‘êu¶Œ6íBJ>ϪAK »:W¹Éƒ5Ò;¾€¢HN—v�“5Ò£u­8Ø¥RìNä*ƒ+ö ¨‚DÌÌ�6?šÌ±­H*ÉÛýÏ7­ï5…,%¬EIq É“¡Ûüxƒü²,q*"¸dÉ„i1XOz›©1ÒŽYñçC¢¤´Ä,(èÞM!d@þ>~XPy4‰U4/–1L’€p÷ßÀ­3Ÿ/5t3תÌÿVãFÞxÌNo丨Íô{=_ -ú'a$t9UmVÀ»–ú :ôd.÷ÑWR�º"…xÍ‚#r�b,Aoä‚ ¼}‡°d>{ÿ~¿»ü|}|OסǑ|}äwFƒß%Ÿ¨gÓ¾ÈþJÿ�®ÅËÅ=qþ÷Ä}sß÷È5g øñÜryî•e�ó™ÐMÆóžº6x÷îƒõþøïðõ땵7}�y4‰2ÓÏÝUþëÙ.Þ(ãNPùÌõ?rð«óT®õyÿ7&öúîkÌUøð0Å%¢Å¿c†‡_– t”M퀩ù(ü­ßÞ±Â3ŒòŠÖ×ã£)Ìþãï»tS^qrûöæ53â˜ÿ�„€A¶ Uþã{^u ú½¤%ñÐ�›.5:¤ó@ä{ N"pß3j©G*ÇPÿyþYÇ+>/÷iz·.ÇÇÈѵ Š)Üõ¸=4!#à»éÒ�L|ƒi&¡‘Û°„¡ˆªÿŒP9¤sÊußÔ¼Î39�<'�ßöÃ�n~4£Úû|Æmòøo‡YÒ´Ïh—¥¥ÈêþÆnñh¹z»¢ñŒ´ÿaLî}§�ƒ f úH’÷0MŸ¦¤¨AnDFHFÌ}};á¾{ÛÛkãóm>AwJ™’T‚EC=µ�€ �8}J³3¹±sb ¡‰ï�Z™†M~Î"ò‚þƒ)”kÿ*�íCB„5¸w"dö¢ø¿4Õæúç ‘þÊ´©k¥›Ú‹”AF¡”£Aå儨fHÏ¿. º3äž( ŠNÎ& I ôa’þf¤Š¬ØZ G€óJП–‚¤*�ï@ q ?¢Š£¦\aÑã~ÝüKd=·âÆ¢¢óÑ¥ÔþíLdmó�PWkC.\‚�Œ‚°Ö“PX£oMBÊ\€^ƒJXÓàk'Ô7‰oº �ÙT›Àdª©_6+ZÊw”üãb‘8 Š4;Ò.ÞÖ·ø• ‰'cp-b‚ž6»j)É+4´Øƒ  žO´àr®ÓxùÖ]”zÃ<ô…WÒ–šð§d�ÚllƒØØØí#à(\burÉ’÷B.U²B‚€�ªrHU�(�¦¬Ä¹3 ÏSï*Õ`äŸ 'p€ 'üP×·³ã×c_m¡~9×XdWñkÖØ¥‡Ý¦ÊWR7„$À Dz52SÃjƒ””ä*%�lH½ i5€xJÛ_¢sªUÒ?_xŠEi% sZªU”0[ ¢ ÅtEðQIÉ…!È…öÈJuM�@¸;­xôÒVå ‰|Ç~iÇwjS£ ƒ[.“ B¨åf•iA U¥w¨iù½²ã›} Q;3BŸ ÝÐa}tªtØä-!Uˆ7â�]·´¹V¡i“䶈‚{}úŠö ©ÀÁ�¿l†}žÆORï¼�?_­É@ú>Áîo,ŽVpsÁ9Oú_…ýì2æ¹ä•aÓ.JRÖ„3÷nxŠ@�õ+>­N½möôóíâøüõ‰~þ¿{y§ÏÈó¶ûíÕ¨wûã¼ûökEÿ]׫ ­Wìcnµ»OáãÉùw™Wðv‡ã§�-oP¯ßˆ÷ˆïã#gߣ/ŽÂ¾¯ˆð×A^þ~áã±ümúãýâžµñwòß•_—ö^þÄÿÝvÄL?ך“¼çl;ÇÊÈyßÝD~xõažß‹iùû+ÇÇ×ÄËçßÑÆ_¾¹©ªÐ�~ "ÁÏÇŸ…ê=ê_’ð³ÙÜ{ø?®aõèvÔŸøm—qÛšâîœaãò®ù×_i¿Ž¤Ã·£ 8ï×±©`[°çâ�©;°XAñúp¤:zmiÌbЯoT÷YJÂ@Ç·ï®Z�|ÀðÛu'�ïÔÉÚÑÓCûŸ^ûSržÁóðqþ—Í<û¤÷ÂÇê«_¼n›âÎññýuï÷oö’Ò.{¸%»?³Uéßù¨~ëòýsë¿Íî0QývÏãÚă§éÉ}½ ²iÙ{-êq�ž½ïtÜm^LÓê5tGÏnÿ²êª>|M>{vÞc˜×À÷ù1Ãíë·?Y}>Ñýt8”¾~h1âçÐú{œ£ tžÙއÊu‰�ŸŸÉE®8úíÕ„o >øùðî‡#�\°Œ½Hv®¾��Ï¿‘,>¯÷ŽïýÞ½[¼ƒÞî„iæ?GÍ'ÔOéF¸vœ*×^¥M/Z_ºÄ½·Þí³§ˆßîXøëëêÙȸÚü_£/xŸ¯r¿«~^ƒçû6ûù®üyüâÕX/_d�ë2!Œ÷gµï«F „Ñ1®ÛîÞùöƒåóߣå_€y^ÉÖb>÷™X± Ÿ»¹õ¿�¥K�`ËwÄ”«¡Úu½¸ª¹-‘g¤Á=ÛCÅÖ§®xiD�ê=b¡­ÂÛ܉݀}<}¶á}5½yËûßÂS¾…1x†Ôx ]�ʰ [—óPEB«äëÓ¾¦|f¸ˆŠo˜£SÎn[Áwg­ð‰s›Î´"íLœÙœXÓ†$mX6�Å [Ë&er¦(¦r‰2M_­>oA°lØ ¦‘W­ªË»sk÷ªË2Ë’Z¼6ØØ dn&†Ÿ¼À¸°ôH(g¾/åÍbÜÐôÚ•)´`§½Jf#Ó_§'²}Ï\Vj ñŽ`ÜeÏD­#r?œìk­)â°ÀÀñ¶Ø'%Kæñ8{Ýno–à5fLä€J ��E×�J\ƒ�¡Aà(ª;ÚTa Jd¨PçEç}ÌFýi¨âZ^Õ$�áMbIP™ÑXÖrŠ\jå9˜Úë—†Ø{–h8.Ý4Y /GÌZ›é4YsñW—ÓöÞ¿Ç£¬D,:j:HŸˆ«$Ã;¨Ê �à±õb½MA�99ž&Ä�CÌN/tlŸVÛvsß°UºÇž#t1»ïŠ+aXêca�®"pQ&þ¹/7,%7¢Erb¤Ôþ&J^D*Š€ê"�EQä½ùu²žm뇡àò±OK‡…+d·'ÆK�KÁrƒöX×ÜŠ»8îNܤªíº)’>R¾dñ@/�ÒÛèsH6ºVÏË,STƒ±kí’4Gv¶¤zª k¿�K+ÝoË}uþ|øÂïÇ·^?MýR°Ž P¢ ä¿~ðže7å`è~ðœ÷‰õŠ4#”Ñ )ðç4"‰Âº¶žÂˆÖúHˆÇë59¼e"‚Tj/¾ÛçÆ†�ÚIäXˆwó²ô¶�½Í9œ¿;ˆï¿cÕ)äïêñøÿ5öïî¼÷[ç×ÍÜã¸þ×oß^s§ÇêêCBÿ‚ž©u�¼~N‘—‡vЯÓåáþ…BPGÍ('ÌÑCIYý,ÏÌ¿Y8ùy~î®ÐÀ«IÑáI9 m2ð „ÌëðxOÁ£N‰�××IÇ¿¥g�õÚý¾¨ñó×xgÔ„�ìÒ 9ø�Y†oŸºWÜN#öþu�}@ ÑDÄ‚žX€¿_.bð�Q V"A9¿–àìáÙ†$Dv€ O_É2âh’©o§j¥GÎÿ9Œí #ßá¤BšNL —&•—žû·ëêÝÝß—ÊŒ^ßçóô?<ñPâ“!>ºhnÃKù>ÎÔ:øÆçà?ó‡Ï�¥×ÊüNiϧBƒÇŽÙôüy~ßCßÀ|~„¾p$ÿ¼~~w^:·Ôï…ßíÚ2žŒû玗ùã·ß>)‚!nW•™‚øØýˆpïž4úëë�ußgúÅ\ÏçNõŠû�qGOïÒ4éÞ¸�%wð…ñó°ÈW¨@—pÓ|ÄU‡0œ+ÔQÕp¯ÒWÉÖD%öi×#Þ|t?GË˽7ǘªØxãçïïž´ÿ| ù"úËCóåXLvé:ú¡åÑ =çùuöÕ‚8@/xY€‚~q�w„’tÉäq¤ Ù¬þ1 JçO ókïÂ8Ï.¶ØÄM_O=»HBr!7ô9u?];£�SëË%l’«�Ò'ª,ç˜|üú²Å\«¯ÃpgÍ/âÝbß»öA²P_¡pP6à¸þå ãG"Anô’‰B …×_ªÃƒ½ Ú.5 ¹àðÇ”Ñz0«†!Gã�×^qßë ú* 7aÜ9.ØJt' Ø$°B€y<Ê.v¹‹ÔŽðVà uû® Ù¾`àÍt.ãŸmzAÈ{´wGvHå_Fšˆ*“˜�JÀ¶H9a@DˆÀXÁü€]Ëw@ß«�ÕÏñ ]u¶‚H±Š/ô‹nŽ´17,Á©u°Í%a‹ _F’m[¹u'ôiSZèíÊ Â&·6¬×‡i§ë‡‰£*ƒS\@•b06¬Ë�ÛŠã l{¤ECß0§ŽÖæ]KA�'йÌ^)@àÛð%°ƒj±Æè¸á‰µQRã¤WFJ„ÜØ—¹%È'ÞuœC¹¤Ú·r¡¯o¾>Ù¨ìhTÇîÖäÝ4˜R‰Uß©or !@ìözITe8jƒTãjÈÜ9k½7��–}È�Ûƒ8­LÙîah@d%Äš"çÔ ßA´£#%ÙØÁ¯Æå2¼Ñsse›Í¹{s†£ðæJLHØÖÑô%~¢�R d 5ö�È¡ †pþöÁt‡øHZç9ÌMíÄëøˆDL¡Ë£bÀÿ(áëþn³‹yšâ` x¥m œW^(¦åºQߥ:ðÔãsb¶jîùD2Pô@P ( étôC>þDºK‘[ˆõ/Oh9¥°Zˆ¾ºö-€ÜÓ|7E�B‚  ~ÓR$~4£¥•>ü lž7wš>¹ùÆ_Ûæ­î^þÝyïò¿Ÿ|ýë·®Ýí¯Ï5|þ“ÔD œ~§;(ÛJ)ÃÝônˈÍ?/ ó/¿ßK¯ÉI.Ÿn|ãÚ¾¹”y½›bZï˜Jb?®o/·ÏWlº¼7 ÈãÇÜüß"ŒüG·Ï”©¿=¡º%6u?»ýå]×·]ëuñ¶Mì¡&ìÒp Ô`„Ú »E* Š’ñ(‰ÈÌ�Ä9 ðÏõÁÎúMç†ÞªhÊòÉÖ :“9UzÒmM"÷ªÁ#ÐÁD�«AP¼,Ê lT“>¤6­§¼W[:i½+€¸€ð6Zˆ[…ž $ORø³òvðn³›X´m0#toÏ]ú‡ä¸éH…!Ú¬”t¢Te sJÖ%ш Ä­¢ )8ÿ0f�U �ûJ.ã‘îYk5 �ÚÊ ¾E‚# Xh‰ÁÉ‹!"@ ½/\|}êÝühç–1ö¸K¹¼«x©B°Xˆ–¬ié¥ïq'^Y#hK€ _Ê‚—gc˲٦֑¼?¼;MãF[í%b bâØLE¶�3s0¢-K6ì4Àr±\¡§ôBVûóXýÒ³ãx~!G÷y™ããÅB¬Ë×ZDÑË–µeM�/×ÚÞˆˆa <"çsº” ��íU‹Œ.@ I´´\qW¶%.:úÚœ•¿¸=rGøC2l�Q/ˆˆ�@Ë.èÓàˆQï;¢Ålù*P’RhŠdSÕÅqnÑ{ï¹»Š z CvWp2îNpò€ÃÉÅÀ¼‘[%Ðì œqV±.WxD%!õ”ðôRý2eÝ¢jæ[1FH …`¡�jõSFÞ”dW �µÉ%PRPJ%Ô0† .PõA9hè�»ÏiM¯¨Ë f45€uKU‚%&Šx´ "ì((¤U_/-KÝ Bƒõþ‰°X�Ø%u.ìN#zn$Ôô£Ò8ßLTÕMûí Iù£™…7Kw½Æo0hå> a4õ£çˆhÙ#}? †HyTTH‡¾È¥ñóñóïÐù«Åå2w­k¶`Þ§/„HeûühÃÖåùѲ´‡—;àž/–Çœ}‰NÝöþ½¼;}Fµ¦×—jßó„á+/Õ+>}óùÄü=0ëÿ•Göž¸ß�FGúŸ¾éôÏw§}Oöp¾hû_ˆÕßLæºrç÷Šóçüýëµ×ê¨÷»Ñ¾»÷ðï `1üWÃÇêšR’.ß¿�ÀØÝSíÎ?¸qñÁ»_†T¦øúœè”÷D÷ð�äùå}uÒ½.š·Â"Èàñå9ÑRz_Hç»‘Ó£ï¿ÆüØW^7ã/´ºüùGøÖU£/Osx𜣠Å×ìÜÀüß¼uŸ>{DZ4÷ý°ê%2&ì¦rïß“ÍÏåÿRÏÌ7âX“½OÖÜ9}Î_\GærÚdUѳwãú÷ÕýúMwÁ㬇wMýËõéùñççǬÑùtô~ýæûŇçi`æÏKüvLjBï¿ äç˜ïàO^>t¼xÊ%Ó‹z‡ÞΞÌþwó¬�v뇩ñëÑ®Fl)ßW©TeÓæc=viä>˜aòˆ÷c Hwþ«®_bŒÝׯ”½ùð.µž{Úœ]�‚S¹` ï´©ö�?‚Ö˜�í®Í¾~Q\´Ä»×žá)Óûãï2={çBÓÍuï)î¨ÌþÆ'Û¥Œ±å|Â×}£â‘K—ê"pY‡“»Ùµ§¤í¶ø˜vÒöAÙì¶€^ ÀÝ (Êpþé­&–ð1¦Íê©‚U¹¬ÊHüTçÃój¶7Nä ôšÎ�$F¡êpÙ¡4ÐÄ�’ß"T44n¥ò µm­†AÍtÁÏ2îø6=qYX€·yÇQ‹V±CÌaýv´?—b­èŒ‹–—lŠÌc š})¹%êÚ²(ñnIwI õ+.õ[Nªó6¨ª¾ß,ª†ÑW�D#êä–#FNhÓJKÚ[¸êÂÈ:g’iÛa„3àzî…„Ëâ?<‹÷³ÙAŵGXh�¬Rè–.Ò TŸ\ýþfLÁ®}Št±ÄǾK¢]ÜD Aa„ã)%4F-ìAƒ²z`ÀQ2ÅzÌ¡ÀòèDþt>½.~>~`ÿPÖ_õ+æ3ùü$ Ž8pjpüÃǺÇ$0£~>×á Û ž4ÕcTãñ¿÷t%µŒ!…ýÌ6 Γç‘𽹨Î]þ;ƒòÑ>Ì?'ÀíUûö�¤ä‘iwãGþ7AH v§ïŠy� �€½àøR?³§ùÍë7â—†»EÞò£¿×sëçœË«è7Mg¹w»‚_«!üûQJ¬6ìùy†3ÑUTF_Ô �PÀ� yC޲H hÇJ3`!"©);•·>ü²þS.ëùÆ÷ÞkÔãÊõŽèHé6„…¢hoH²áéŠh°]ãk2<Ó(H2H…kD7K(ê9©å J;Ò\,–Ch$¤#F°/P†1¹ MªÈŸà€‹,ÓzÞ]VÃI)PP_^`e£ÑßåОX/Šu©E›ÀQ¨ÿB4¤½þµ,ËÖ' OêÀ)uUV3õÐ¥‹5õR¼WëÎ<_ÑÒ dD l¬Ï‡én\ ±då8í�ÌÓMmj#ºQMÂç+9ÂCñ`÷ ªbòVÿM‚ñb‰#¬3V#‚†h.s":Þ )QáÄ·8¢sj¢p͇wÞä,;½žñ~¨$“’�Ö®—R^ŽV¡3£–d"›¦2ˆë+OžÃÂ]”ŒÙîF섇_„YrŠpàè§GfdƒÎjçdPˆ€wÀ^`;¯LÏ Óx#MŽt\¨À‰dv�ð*JÝh–;w£Œ@Û'¼}"³8A¶¢  Ì”I §JÄP*ª#Â7É“nMû“2Šž•ÚÕ=Ýñ«½?<ÛØmÝ…X�aÞÁV˜Ñæ“F€ôîn�ãI “s¼C˜zæ(ª:…´$‹Ö& ´L°QpÖ4A*&/]…BäiÊ„¬Œò0¥ÖÑeîRq¾'i¼mÑ„$œ[%ˆ,€1Ô ¨‰1K1>¦L[no 4þž ¬Rm¼ÚúXÛÍÛv«áKàÑõçë3ù F²2!°”¶¼€Æ!ƒ’¶« œ±fŠw=Œ›® kl¬ZìR­{!ëÞàD_w¬9øOó¿�› òïqþ,ñƬ1g¯ÁŸêGóáKó;ö²I`ëݘpæõQïârbœ]÷ÖÓÑÒ/²;PòÛ|k³ÒêR­ûZrîqEüù›þ]^;ʦWÖ½f ííV?]~'®^ ×Ôï’ùê^0Þ{B| ‰·ß¤æ°UñÚ¾oÔøt({§Ç7.;�n¬'Ι%�–ì~±÷å{mi+Ÿsï‘Ó[ÇÇÝÿ¾’¶Û øÎ_œ¥:Ã~x¿ÏVÕ¾›={Wv4Pðµœ3ˆ~«¾°á�)K>Aò rªø·ÜaД!õÅv3ë Ÿ•Â¥ô+ö¼s õ¾Óö›iÌí ѺýtøÏË÷nîÜO‡Iuç¶ùÈõJuõLJ^rtFޞϱ�“ž.„v÷̼4`¡mP>x~’ßt0ÒÆ&•ˆ­CÅh¶-[BÕ- n;A  cLš‘§½SN}På&6Ê6$! 0 ªŠAž¨š„í>y��RÂ[öSfÌ£ii™´,ÖaTB a ¢VgØa³ž =º"ZѸ~Pí.yˆNG‰ÕO×džÆÎ°5 � H¡jCú *ü~8u'+y6mègö°wÀöùŸšÙÞ[¯cß§n£ßõâƒæÐ‡‘ŠÎÐüŽûWåò0–k��mbŸï¾Ÿ6zí×Ç�ßϧ?Ìsf‰Ú3üsƒ÷é>û2ùݦ�ty«…´ûužë·ךÅ�ó-÷¿ïqw�Œ×Ž4õÜ<¤>–�öû„:ñ.x†Ø«ð.Âoÿ$Ô7ºe9Ÿ‰;ÄJ˜b÷¥tsýHÙ¾ëtŽ¥ HW÷97êüê–—«ˆ{9Šˆ–æ¬/ÜPÞŽGÆ—Ä¢ÿS¯Þzäåâ@¿A�íŽØ˜EÔ?1 Ëãošv#ù‹ïèWîÁÄp¯·ÍâFìÞ�FÚœð|wË¥º|ҕꞎãi[üѨÕã_yOž­ß×̆l7‹ß#ÆaYö”(sÜÔ¼z7ÿ}W·¨‡Ÿó¯Rýú€O¿¹€ãCwÏoÞŸûï¼¶b ÓF¯=-Ÿ‹'5&<6Þ9àåýŽð8íy¿ŸÞßYÄâ°cûÏ?üAú_^è/ßXù›•ö'Ôpß±íèç=÷úŸÞßãk#ý;Fa�pê±vtx½§Kû�\-.îÄ <`zEtóù\Þzã݃øŽ{[û¾µ¶úˆlþ;]™åJ*{zŸ§¬ë¬öp‡skJ8Ÿ¯±ê²¶‡¬|Z™úûŒÇì…›}²Û|M$œ{ëDŸ(òIàì8Gºü[ùµ~òü—®«ia~úšöóc³pç5høÐÏïa�ÊD£Î#÷ï¶Uê6P€Ÿ:{ß4µu ÏšZaÆHU¢V–w!65êIöFACkÒá‰û*ëÎßrëþ�fÅÿRWxaš‡[i1ßà(p|D �@À+’lžZR.©�f™ŸX>JwÅáÆÂ`m­%$,>î*<”Ï3“Mõwûé3ø�§•‹»Çý(€XÕŸS9Í!Ì‘£b”ÌŽ[ Ь’¡HD¥a{C&ú¿§ƒ0ôùÁ†ï¾"m¬L!#“p[«1´�VQ b¤Äøîeô¼þa�¤�‡3�÷7©@h™JÅS±§WUiµƒ”J0Óc h{ý°½±¾(oÏÓ¾k¥ %(¸?á{ðXûÞw1Ùl!ôºë]„€Sƒ'}B8\ÓŒ‘RÈLCÉ4`pK¹ø™Ò×?*Î(R„f¤F�é¢ñ'¼ž2läï›ä†ý& ¨é(��ѤÁx¥D2@Sïùá�}-�ªbKÃkÏNëÌc=Xéá›Ö/½ç.Qf–¸ÞʼnÀI±ÉYà:µ@�Ý}×wöX¨÷ýJ.»rÀ<0…Ê’ph@@JU‚'WB“2ÁÝ<øTû˜y¦ ^…n‚%²~0�L*=L“Ùn(é¢ 7_O¢!ä¾=R;XøSärÅÙBeYO÷õîoÞ¼ö˜ùŽaïKÇXí‡WˆbÚ Ûàíõ^ç@~š0îe;íã­œx˜æTÏï®}:Ö•5¯~_ë}¤Õ|&Þ|'ùïÝÌ~7W8Ï�DòC�Œ9Þ»¾N?�N#õØ Ó”|T[¨p�tÄWofœ¨ç!þÎm ôs¬S·©{9B²Qú…ÎDÊf3óÞRï_?S/yМµng7 ´¿i{÷Aÿ?V¾=]£Üò½‘Ö‹ˆlvue8µ¹uqç—\XºþùlÜ>yó˜UëùäBsœo˜œÝ}ž‹O¸�¯ÈI¶dÕûaðä§×”P>ù|BŠ!=Ìë3ÇkäTéP!™Ïöÿž0+Q r§sà w�ÈOî–&‰X†È…Û?�úU‡B°î°y&ªóüœ©ÔZ0Kݦ£n$ˆš Ô¨eT—L˜}SCú¶“cÅàœm§ cuúrû–£S¶Ú^µ½8 N©0J$LJ„ãœ?’ŠßÏs£(ÍÁääLeâ!ø ´öËUAZ\E-§æ7̶†ÂH2·ÚöÖŒG(;¡“hVRI=Šp ”@Åã”*TLlTo5øÖ³¹!P6�|èû–±FE÷ØAÁpÞîWlH”⊢(4º[[GŸ‰ç“ˆ*òwÉŠS[Ú¶Û0ÒØlÉ–qw G£ó¹pÁ–+£ú·>•y(Œ!‚,ÒX@‹÷©é¿äÙÍ®éö©¦s›ráah ¯wº�̉ûI/Ð×1"SvJ”Û•Y"g¾ÞH´ÿ ‰xupKε¶) T¨Ae£š‹±0!öH€`’"¿˜˜�)$ÏÒ xµeK¥'{� òb ¯‚òAÂx‡é€œÐÅèé.´Š~©G^µ§—½ªòÿ‚X?i³Eå\$À6˜4Æ%‚äkékI0cuªt‚Ó6ìJd,ƒ>Šàdô—cp»EF(ãjA)öÀp—§C·˜†tÐaúsYÄö^ÍNo9n¶×¸œ`Æ(?Äw" à1íÃèÐ 1S-¢¢‘"'œð `µ,h ¦Uzà÷2›†ÛÄÅ&`„ŠªYl‡›™âÄ@xŠPQP €‹" ‚�ª€†‚Š£B 7@PÈ y  æ€ '˜€‹@+µº(¦ÐdÉ’ˆ“dÆÈ’…³-X¤³T£D›l6d«H›0l¤¶’ͦ¥ ²F¢ÍˆÀb)› bTÙšTÙšÄÒLš�¬†(J1LÖ”´ÄÛ$VYj)¥dÑŠb”Ò³ 6‹D¬²Y6Ì¥4F²Ti*biJ6,¡�IRAa±6™j0RFÒI 4²#L²h¤fÒ&É¡4ÒÑ)¡Kj3Je¤fSSLh«dšXXZS+%Q´¤™Š !`”i‹T [¤ÓBÖ“U3mDDS-¤°&Õ‹QlÉ…©JŦm&ÖKZQ¥IRE±¶‰4#&¥Z†Pi2cTU)X¦)��Ò›HiI³!¨šfQ£-+XJ™¦ µšE& ¶Ò+,”mER%�‰T¤¤TcR–*65MRj$ÖŠH¬TE³d‘RmL¶I¤•‹EŠ˜•™IJhÔÊ6‚–d³J‹LÒšE)(ˆÉPšM�™d¦bš%¬d¤J–(2ÉE4Òl&¥¢•¤SF4(ÈÚ F¤BLšJe�2S%¶­UHŠ@¨ �ZU *�Ѐ—ØÐEýáïñÖÏÅÏ{÷ëí¦gŽ:ºíZLò©¯õñÝéN�ñâ³OýØíMzºò(G¡×x(‹gþVêmK•�šM¼É–ä·ÅA?úðœÍŸDZÏuyõ4Füœ*˜èRšhÂM|kj½]/óî§ÎïÊݳ&™¡“&-5-+Q“mf (M,”K¶m³¨µ½í,ízÆhV·¿ÚCt)>Î4&=Ïr‡¤{ŠÔËOgƒÍ¢…dŒÜ© ¢¾˜Ds×°Ó×k!¥"Í3¤¿²é•AÑ՜ﴵÒ~�åƒ+Ú×ÞÉ’œ¬—°¢(fz<ò£\lÇXy6—I4’/1Î,ïŒfà’@…ëÖ—ê ÏŸ $þªDQ€¨T FEO/ˆO« g@$ýá¾zžõ”qéÉÍ©�š¯�Ä P€Q”|³ýAžÕhmñ2sw?¿%p”ÏZ}ÃâÆÆ>ú!æ=x´S±×y½ÿ9öùhR×x™ÚÂ¥€^çfeþŸïJCÊÇâ�õžù·Ö¡á“öt8gÿ°F£Ñ/Ð Ü·ìÇõ�p{H�ÿ¤½w ¿µP|~¯“YMÃéаH>ÈÀ¥s/ý ሳ*¢6`€ m6›wïÃ+{P©6MòáíX¬GUP¤mŽ'y�]‰ `Ç[âÛÞýÌNœâÚ‚4}«6V>?·xºÌ@÷ýZšöí›Ûzh£M¡´6Úm¶g™ÅsÕôC*Ⱥ@K(„FpºÜ—¡Qq†«Æ$µÙÒUi´Ìvñ„Œ.ÔbF‚Ûl8!…Æ*ÉV¸R|›°·&>z_<(>$W9·n¢åÞõw¤!³)ÆJL`„�Õ«$Ü–0 ÀuP€¡3›OyâåN|æEýh5 [qtm¼ 9 0^úp1‚,�ûÉ€>�“ì’Y÷Í)ÁkÔ#KÈ:³$íÌ*.™¬NœkN-�S<oõÞÿù€^þ7¶¢öù��Ùm½à„"Ì`op‘ 'Š�GÆžÝ^™E[!CÔFOnI÷QØZ€(ñQBŒ$󜬨·#WÇ€<ÿªÓ/‹�l1Çœú‚Á õh•KŽå†²º©,`&õ|°íˆ½ OF+3‡î³À.©asYx#Ö­È',ÐT!•Œœ¡”+ˆIïRi0q Øg�yœ tÎîN Éç%Œä(pS‡ÄÒ"]c€q€‘ðmÂj4WMãèv¸2z÷ˆ}Â1óN–ëjAà�zÊ )Ƥ«@HUˆŽ2áGAÔg ØEd¸0 ÆZ’¶ {•¶’–ßÖÁË .è¡w‹1EÖ“P£”6žüûN¹hó.Ƨ®f!ÂrDd­ùÓ¸R×�°ÏÇßÊŒm©–fn{FL°/—æs zpì™}£#¦�ÅÞñ}Gåßžj‡ÙÐ׋48¾Y,ñõ眾Œ¹á:ßgQÝv:ÐÍt�"±œc{å_UÚ •i è^,å¼q¼Ö¿ŸÚ¬›×cï@í�7P�Ù vj~=A)g:x"�¤ƒPÝw+µVâwé*sÊðhDG Kࡈ¹{â�À²ª8÷!¸Ö$غ[Õ=Ží 1¨€B'¤è „à íOþ&÷0êp^:�Zsƒ&ÎòDsª1€´Kp¡VAuw‘‘aiˆMËJVL…9Is…7àp…¿`•ŒÌh·Ì@KIÓE0¿¨²�ù~ K2OPSIo¶Ô#RZ¬zžö(wi-hM mg†ÃzÃ2q¦Z�x# ±þDe†³û)3šÍv'êxâH‚W§ùÕÐSRâ7Wª ÇvS ¼<ÓoçQ+.$Ú¼ã|Üh¦d×@ kå!W—T__T¥Ú{©„Òî1Ax™b#¨#Ù“>ŠX9‡Da1c%z[\'(ÿß!>ÝŽñweumã!òåS)x�®MôZ¬ EnG‚,â$ibk @º]QZÕ�hêÕ߇ äšzZUekEž«|%¼ø~8¶«Ö¸°Ëðn¬+Î/FXVyi{õ¤,–�ÕÛóq§‡ÍÕ_õ™;u(¹w“‚ä½jrÒdßð`Ñy'½Ô,²>¿ÚÊþä°áÒ™v0—E®ÉæBïBeUWóÏPÍXïyÚð+ÇyÊ _se¡æÇr´ÜuŒhô­°¤›�m±p �…‰>çÄk�ç_æƒLw¶ çYš^AƒÀøyÉ$ø%A‰D7õ£W¼jÈ‚ ƒ >¬™´rÄËñhtMr¥5gÕ«S�6ØÿÎy¡kãI·5¾åúÞ§«sÂËþ´Ì…ß¶Š{$.í¬ìµ7-hfý•åZÓ|ˆWËËF{¶¾ <Ò†üyÙkyõd ±lö¬{4 Þ¸‡Ï¥%Z„,“çñ&ºätIæÃ‡#ÖÉ^WXeſؙ9¤K¤�äõ§S*RðbSž�ÈØàli�kJÝ®·¦û³›Iˆãi\ DOÙ<\ñF‰ÂØ\L ÿ:H¨��‰‡-”Ê´{ªâ‘ïÀ�lÅ"H਷²†’8®›ÑæÂVÙµ+h²Uˆ»X«<.-#­¬Ê"ëÊþÙ3±ç©»jë�� ¨ïAaK¥áp´ž=‚¾,VÓI*2K^ˆ5yÅ3<õ2vŒEoQ×rE ¡��¶]ÄënJް¨Fšk¦.Á)ÂÒ¼*O*AMeœ½]l�™AoGæÑ d1cÒX@5ÌÝX#AŸz–A_€S2É ÃÕ.¨Rb3‘" ÏkÛhKn̵—²èÝê’T2×™öœÒ=K.!³#à-ôüå]t=Ó%ù6xšáóeD¹!üÞd'8‚ôDó˺Jó¶F)Ò!Ø&"*b–ê{n@kTyTO W íÑÛê�Ž#þP:í½£~BtÛ­-«?iæ½xòÒóMç|oJiàåq¯eÙî�šNòH2KuZzÖJÁhq0sXáërÊXÆVŽ�ÎSñØsLOn �çßÙ~—ÝåÓ}C£·c®Ø#ïÔ’:¸õu!Gd˜|DƒÌ@lJzð+‘€�Bˆ÷púY￲t˜�Œ3¹Ä?F²`€ûùpü$*×4ˆskq»XÛBrQè%Ï2+0ºhZ_Mk�£^má7,[ç'–<“�aÀ04ŒE¦5�û…­Yê© ±¥È©£»d1 'È,ϵÄÀÞŒ‹o_¤Ø ,0‘ò7½êû®SʾDø‘ãñz¥÷Ê#Óé·�ßCñ³áh´0@Æsœ` ;È•�ÐK•ǰ-ñ�ZDÍ7â]:Ÿ¹Æ$"–lÆ6²8³ÃÓk™óz~—™¥²Ó¾«j[@€¬m�š±á6æ<túK“–µÞ+†$z‚ÄLíp »ÑÁ.@sÝ(Ï©%  9aŽ?êtžPÆÒ‡Úô—.B¼_Hþ€Äîæ]"(“=š”x¸Úçw¸[Y"ªC³tæ@0³5œ,î&¯­rnS?À”F¨c9ìÔÆ xúgØP‹ç›}k&­æï %žµd�-­Â›:û‹9Œ>¡KTqè¬ZÄ#ÆI/ˆ$�f%ýÅMãüó÷�æétç*Vcsmç&ãC7½±já —)tékA=ïF—ñ~o[VáoAW¨P{Í_¥ãMÄ1¡B})ät¢  ˜#23Êèªiäx˵¯ÑLJFA Œºˆyqr` ˆŽÙfç(µ y5‹øZÁã)kЀê»�!ÜG-ÝøòW¶(~oÜX$ŒGjôiúϤ:¹¡Žxj� À ´i%´qU³Ò5­ÊÐq8ØOEUÚàcs™·Î¾gu+JcÖ†ßFGMÛ‹ZÂϚLI½ÊlRžÑ=Ô0¤^n‹É¾Ì†ËGÝ`Åôͦe¥k³Y7f�9‚ÅãK»íÄ"çÂ"¼<œîŸ+§Ì‰>`·R²lø&9ÃÎXýÌ@ÆwqÜ&S"J Æþç¶G` xް•î%> ‹È±¹Rûe¼„,Q–·„r ¾�¨àå>ü5çán2·Z‰Ï¦ecW¶Ãëχ‡Y(WLûÆ î—�ôíáXmÄű�ÄѤvhë$•ä³Ú &"""¿ÐM-UÓo³ 0ãH…”ަè¬K´ß·# ø›iT&ÓiKÉØˆ­!xgIK6:¹Òr¿pìÀŠÕã±·ÊFAçùãc¯ˆb.ÍwßœØä|,5vÙ{ÁÍÍÜÒ†Ù‘9?TâÞÏ ^�×i ÎA|%¹�}‘^Œ˜Œb‹2#ZêÕe¯þMõÏ{æq¡c½bå3�/JKÆ4 òÀ×äW%ÕLGäú§£—C–T6ŽÒaKl&%cW1Šö›CC1lÑs5¹ÁÖ:ê¶¿„ÑÖ+^U’U§6 4ØÃ0d`c–Q*šúï�\å 銄4žæéóÐÔk9À¬`5§=j£\NI4 fÀ‹Øý½?—ø~_äŸA"ÍŸÏ¥¿(ŠiWe“f[ûý)œÔÁ· ân«ßF=’X�¯$fK$*c.Ù­xÙb9UÇÈ~Ÿ¢¤Ë]õ¤[öƒ³ßº®ð[ÛýŠ€"ëê€?@‡-áñ û�í‚ €"*¿Ÿûõyfrb #´f?óÇ«Vöo¿-ÇÆ ê;®¼®*r_î_oZÇûÿU}t4—�Œÿ}�øÁÐ×POø|eB¨yg’ÿú!ù§x#ž°\,] ü~­D�ùÌ û²#òÊ-³#åh/©ZEŸÇ‹‡@ &<F| Ç_ô[ý÷ÿ rÇßýî<çogï´ÓðEHöW_`þ†Ÿ_g³ô�kÿ(SßãêWرÊÑüö¯×Ÿ‹Ÿ¶ðh‰Šÿ¯ß¥fAïŽ~>O(cþþ¨ ¾P§û¿o*À#΋'ÇÈŸðìVq¦þ¿9ÁS䨮Féúã¸ÌÇëáܘ¶=#U·ÃèæŽMÚ„8Šåz¾?|üòLË’}�DSøÝ õÑz´)ÞõÃÿÏèMHãþ„ÔLhV¹›žŠV…âBÓÑ^–ãHü~&Ž–ED¨úËúÉ6åé(LäXNÿVO¼ó‡™a%�2æš¹𽯰><-63Ƙ �`–Œ¡B!GS6‹Œˆ䡌Sc*¤Œ²½˜q­8J·½²w`�ô¼¤ç™37»AN1â9Ô—‡Ðàñ使6ç\Õà†öW–œà ÞÂrë³÷Ë„åZ_i›�§E)ñºwzšÏò,~ &Bÿ?Jë@{):Ôºk"v…¤2u²× !–¸ÝEö0òw´yDxß&Tß•¨÷ݵç~aüÿÅÌy¤Î„G‡‚6­Á Bÿ_ŒXQï0“�9èãƒyÛFQ hbØrØD8Ãù´øö&‡(\ Œ™«ä�Ø�ÖïW$åÕÈ¥”âœ.¹9‚*ÂŽ$@É ¶t€ª¬á~’‚ÇR†M ƒÃ^Fþ“ef˜¶$tÈã ‘—” ŽIË6{ÂqdÞÊ8ÖíQh½Ò¸[9I⛉§!Úhâ!Q˜Œ¿�î‡qDQ2RÙAêbñŽô+¾9w9ø9o[*Ðþx廀šoÄ@‡"®C‚pØü©Åó<â·2ºŽßP%ò¶ø¦1€ü~ƒà á°=®…ºq,ý¯ Xò�bO§SsÂJ©ZÓLX„s¥6WE‘å}Sˆ"Xv¤Š".é�¨ 0œM4®Ò-ËnŽ»:#ÍÖà/tð¯Éðt1S„CÈhf‡,V±±Úœ‰É�jûä (UWÍÈ`?yJÈíÅ4ÛÝÌtÚØN˜ Ïžó§;ÙÉ×™]j*¨¼éü’¨3(ä5¿=΋D=K×’®3=H�d18L�¤ž/™Ä�7Q‡äÒú(½ï–ô 3]bñvÙ^~Oú[älo!6G§x ņyâàæ\~‘�S÷Ò«A�¡,»ð¡ÄÓc�nï ¢�f¬¨k¼ÇŠîÛÞž¯H|ëYo±®ð†bA‚JSDuèZñ}Háe¾RBxè(ÓÒ“Xgog3Ò„ [¼F„†¶jeìívÄî›�²D1ö0 Çãò7%™AÏ7¡MÖ¸0öêtUt|-Uí™°1§ÕŒžŸR¹³=´6Á5Øæ&|"wAèÅÞº:‡Œ_ÄœÚCÁ‰}âΉ¡ìG.×"£ÕêÈx. ÃÅë×�4¹ŽÌßä+߈©¶ÖïÆ…X ƒÄÖQ7¸N¤ì† à×¥” 8Õka§ ^zˆY–Ö¸{®O }ÜgGÁð ½€(iŠ-œ-ÄmUhN®ÚíC.´¿-¬ÖîýP'Ãë•À®A¨ÛhS¯\ÓÏžtv,‰uq‰ÔÅ‹PMTÒ«ÂÀË“ ‘B�� Á–ác]ÖôYZͲðèÆ�[f)ð±3×{Ð <ˆ[@d€�\x©½™ý´Ô`Hs AGNÜ8¡„|-Šh#�Ÿ¡ËÄÈ�ŠGx†úà3Û¥Y«_¹?v±«ð�Qy¤W¨í¯€µí·¬ÚIU!`q~…'|Br<¼Ã5ÑÏ2–ó‹Ý\v¾ Í+-·¼ÚòÇ3àL‹ŒÂ´’0¶nËO•AöäL&IÓ(è5¯ >1]mhµP6™ù4oñ'FAŒÜÁ¶ÀeÖ˜p¶HŒÇé³^-h®U&"¹°ÍŠ„vx-N'iªn:„q¨ÉïÞ€¿‘½Ñcõ  AðmN;—©å6 TÙä+à|8Þ^8u$Sï¼€§ÇûL€ØÅO¢¼ˆ2t„6âwxŠ÷°;•osÜUt8À•ôaÉoÞæZaÈ,ìt˜¸0Q4‰%*w!=Y©Hýœ˜ˆí·é°…ƒ®@h²5^T˜Úa…Ðð@©gB0 R;Ï2c‡ˆ8ïW“ñ"òë€X"ßÅ4$°Ü®¥\xu 85\¯¿@ƒ£øç#ûøÐlð$ŽÙW©Û©ï´ãoÎÔLI9(¢Åg!`Ä™ÖÖ¹rY¥raÔôcÑ£ÔˆJ^6o%æÀOì°û¶O¤ÓØM ø�t¡Ïƒ|ý³SžÖœj°Ò»lœ¸ä<�†ÂÝÙƒ}H0ÌñcÍ_XžóŸž1¶zÈ_j‰|á¢Mª‘çþÈEá Τ �R’âÎi@¥nXrp�±6&AÃ?ew†¬Z-¡cæ µ›oÁðDÔ ûŠÁ×jTÇRD4{ÅMlXBÕQ"¦D¬Ur:.•§£:b¹r*%PNÄM~±^£rb–ÜDXS¦®<Œë;Ë‘äPC#=·¥&îD@…4I÷±?‡L¾œ;øÿ¸Fƒ‡v�Æ´@ô™qþm‚-P ô [!L¼(Th²Áêú€fsü†…àÐCÛ1DÐîä «}“ìßsVf½ÚŠhq°å[7±ÀçHA[†Ná(u53U×!òÈâu' F*nÆ©ì¨?ŒÀ£d@[ûyðQîº ü?=˜ ¾XÍÆ%‚Ò£\PÞÕ˜#ÄŠ÷LŽ1Åç;™·´Êb­-¾3Éb𽄠Fhi÷Ç �;œm„�¾ïæ¡Ñš,¹Ü �Zil5nÕ˜L5Ó�<>!CØ*0cv1Ñò»œ�i~5éšÊ�t3˜)†sBiï›ûa×ê�ÐqÛ >Øè¥=Œd�+-/ŧîís0“¬d§¿pä™MÃfP"ù†C ³ï�nn炼hܾ-�¦Á pÅܨJŸ‚HÁÕjYg¹µœAhÚ6Ü2 6ð(7¤"9ê­¹Žr9ˆÜž#ÖöäľþÑçÍåË¡§³¼Ÿ» ¬^ׄë)•£Žƒô°6€ÌýP`�py�JO 4o¨¥`wòl�ºç§uÏñRk³k:E–ý®M ƒé‚ 8‰øk(òàKb¿2ûtOdÅ‹}'/[ô×|·éÀ5sô®ÃXܽ�µ|}�­òèÀ÷ƒb£eë÷[¡æ¾û8DΧ–…Bð(iÓXfx·:á(þø .;܋Λt+�Jýcs¼»W°·ÂBC™â~~w*XóÞ”›\œ6 š´ KæÌä—o"rb늨úÄtÿir££pöês�¸.=ë»Â•¾¶:ªî,æj…v€ ¢WÜô©¿žå¸¶û¡˜�ÉnØÝDžDy¶•+‡ °‹Ì«²¼ÕÄ8£È9à°ú‘Á '¤vPË .È >Ôª=B�jLD•A} ¿V«’nX‹È¸x ·Ñbw¢ÁOÝzX=¹VÜ¢ÛÖâúú£ö1²÷¤s­yÅW€]Òù¸x{øIÖ]�ÃIxh›ÿ�œû°ñž²È’Y[cG¬ß[úîOJFÅ^ôÖ`Ùò4š 哉-«ÒÃß8ô°¬ð5©N1—¤¼ÌsÝmfA‘·oLÇBI ð¿¡ëgd67Û¨ñºÜ•Ú«®¹¤¨÷ î\=ö F rQ1«0fê±�PÄ� ãªbÐT­·íÇŒîe‘¥{z†ô²T¨Š»r»^EPX‚Ê€Û Ž*¡�"žÁ¡¦̱V0ÒûÈnÖÔ„A­ñ½Ìqևݓ¶[c•ãBêN3‘ÔMŽîey¾Jg8vq]ÎÖ@WG:ô:.Ó×�`¼rñ›¨5eLà—*˜-} 2ì±æ6l3µÛqð&5Q•©PN\¯^ñ,ˆ¾&¨íè"×ö) Ì5LjúðÕü\hž·­JÇÒÕÚ®JÁŸƒÍ@ã{Ä*óT½æ4R0a]WI}+% ZjPÓ¾ž+KÝ® *ÍŽj ÇL�ˆø Ië5® î˜v/‘DN$‚ïì—²®´9ÖÛ *�ߑ酓N�s~y;MwV#âO<^‹:\Ó{\âÏï5=aû�—ö·Ú�ÄY„þÑ•hgÓ¥´!’Ž„´Å|¢Jqßß�¸lù>l.sÑ8¬�ŠÞh_yãMýÖêH ?XŠn7�[ãZÔ2ÍsLv¢Xlˆ!`Bh1�Ú,Vœ++Iã&*Ø6›@Që/}Jù-;C'BQèbÃrå-A(„¬ˆ¹sNaÔ¿þìN‚uì’>S8M,‰‡"#IjhOs•áÛ×üˆ€ Ea^p WiÜháÆä¾¨ #!§ ¨!Áp(£jæ}X…ÍÜ?J,ã[—ÂyÈq•Šjl”)×)ªn{ÙÆÓîIÛWQË^KUˆ˜RÁœ±• ò`ìé žÒmº‹¾˜éldü៾¾ãíº×jkÉ»Šï!lZ9¬Uéó™9ëk“u`óÔöÝþM dÒfá)<ÊRn›tƒíbP«ø;á+ÈZ͈75áÜ9H0¯>�Fd½½÷»ï›”±žoi=èSε¬7 þ³ï<åò·#…¸¤ý?¢?Ãú{þHsàb±u?»wÍp'ö0ŽxÓìÖ§Ap>sëóÔnâˆ~Gƒýãél”Œû6&cf? oA?9ž@Qƒ>�y¼ O{D5U9¹³]<Á‹ì²€DTL?V�y¸>¥"�C’\¡Æä"»Fš}%ö;_ž5âz=™Ã-›TÚPÅ´) 5PÅPpÆîE(ñÀ”¢„šÀ3 l`òwŠÉ Ê;;Í«’@.Á›Ø2ˆ`Í©i7ê|° ¿¸ßë±É‘{’ ?øåÃõ޸oȱ<çž‹‹Ó€y› °ßÚ]‚/04CS,:ƒ´3Qß*_HŒX÷CÓ¼E¦æ¹üÒ(²ÏÏPÈNèe‡ô„–^qp?wÙvï#éèÆA«uÉàÄÉGŸ#qé@` ,—ÄäUB]°]âõ1Óñ3ÍÕš 2ϳËLîÎ{Ûn§¬k7¡2áÞÀM‰¡ w‡wË%†XC:“7'›Ð&x‹×¼A«v��8êBa=�[»)alF RW/¤ÎݧÁÑ¡cµÉ‘Ò;ÜβxÔ W�¹åGŸHȨ’†Jj@ \ØŠ%F3WT�úΞ+d #P6ëBl:󶹈ØÎ0-».ε›œU³\=sDz÷H®Ú.qä‚~ó�{W ÌŒäŒ/àY�Ö–~ÛµÈ9Ü=ãv’åÙ+äMFŒ ÌÈÙÀS¤�†áIˆèÑÆÚbo(2¼ïuÞ¥ú鶦úŽøPÒìÀ«@q^�^üVȱKÙgGÅfº|3ÁX 6gœÊ:rË0Yh5v¶Ò�$�ÞNÀÉÁ��ò…³,�“0³¢eNLq°jÕйbç^V ‚-\f…ÙQè‡Ü}Ã:ïw¥™÷rŸGZ=�˜½°Ì%T3q%Á „�D©Žo´ r|m'âÎ"cÕ@þRŽ‹Ci³Eö¥�Þµ³A Õ­æ ÄyxÚ kFŽíj¥‡a–c!°`dÈ×Råð© u°¤º)ÍJ_ýªý“ÔЗ+)% ù_¢�iÿ5T94I’„¢)¦‡gYÊ û>(½%Ƶ³�‘½dÕìÝp¨ÆÀ‰²Y¦b"õ{± Y,ùRîœ$7œ¶ĮAËH)ËŽex½îµ˜ó™rcÑš9ÛéØxpðçvçmc©âÑ2rO-Y›(ní$Ø5¹xD]%ìFPüiˆc³êÛò.Ê/T$Önœ…É9îÌŒ çšahz Ê}^èk±Ÿ;¡«=Ï6ÕoAÉ>+I�7}‚‡Ldø´ÔƒŒN„¿‹Ô…´¶u!Z-Ô½Ž½5)# NœêªBšCß2Û(âU¨Ñ¥Iùmœæªs™Éc,Miïª\èü¼¡íÖóåGeäÐA¼“Cƒ_«vsðÏ4èäQøØŠ) dí“þ{ÏO‘mcˆb<ðá˜Yba-t¶ƒ‡IQÉBÇ.vÏäˆ;ñMžé™O;½Ñ7µ6ÉÓ†MÛ÷'O¸)fšÊÅKfP++¡K«ýg|ÌÌŽ${¹&jÚí<½nÒlÏs×zcÉAùìdºÚHfNï,d3Íéuv~­xb”H,,¹ü€‡èÈ~ðÙýZ’º1¯¡ø@h[ýîæö®{öÿ¿¨@½ÞþÑý w0ßÇ[�»ØæȾ½ÿZ½h{?÷æ�º~ ªÑË>6…F{9üÜ½É ^6Y9Ûlžû!i¼÷Dïh¹œ±Z§ @«`‡€¨¿EÛã{Ò�Âø=UK9ú`d þ¸t¡'ÿ WüÄÞaš—‹ÃŽ_ÓIÔ‘&?Š4|æ+zR"ñƒ¼ ê‰~Õˆ'Ÿ!ï"0F(ZªÝ3hsÙÄÃJV©bƒ¤ ‘O™¼æ4‚…BLÄ©7šiÃs¶q]#õ›Ö+# Hæ¥�*Î2@dƒ1Žc‘³9àšÇ‰UÙªºŒn»�-UÆdøÒܬ«ÂSøøK#B'Œßæ�Øq åçÞì7z)úÜl)c•Cç2G7ÓNÚb‡� > ½A›"Z`Æ˜ÕØÁŒ!ë=ÕØ¯p&PÍ$$å¸ÙX h,EžÅ`㞘Q8ÈÅq‘Xj€¸©ÑAUȆi±L¥­æk„Ð í™áÚÆ¤Ôyn†')U6Aðe9�¹ 6@Èàb/’ïPvMùÙ6eÛK•?ÄE&gCàæ­ü|ò6»ßŸYÒls}C¢ÄAD}ÌíÄ@°º€'ÎÎpP§$櫲éTݘ/·19޶®Ó‹ƒ|Žë^Ákpjyî¿­m˜¹Á�£ù#LF†Ï‚þê„õí"Ÿˆò—ÜVvº5çPãC­y…Ý×}ÂO*ÅÒìµ\…ÚV¿|ŸS Èg$–2ågBH¢5JRMy¿‹„1¨ö™K‚ÝS.NÚäùƒd?4kÒ+özú,çÛú8¾0R’ÙEˆÉ)Fpâì´Ð[ªœ¤r_ö÷ßÙK÷$©²óý½ÔhFƒ“iE‰”Ÿ'Šf�YÌe·¢AzmE©5Å4¼«lóÀÌõãK–8h„” >�õEî7ã®ý9­„±ÖvxÂ$gœf;‘�¿+ësÎ�¦Ï:Œl<kšô“ªî½4©:‡gCQ {‘kŠO C¯>·ëŸ×ÂržöºåÍí ë@übª4&4A}�°•Éù(ðCé–|œ ^†<œ,l xª+%iùxÆÔÖ¤B©qÁŠÔ‘%eqz¡Pëæ }SþÒL¢µ¨ƒ�Ûé„{]K`óâz¹³À«ØyCÍþûärg×xúðܹº`ݬ7Ff®…@ñS—¯Ù¥ƒÄw >ÿ 7 .:tï§3€¼�#�¡�‡Ë¯¸0Â�ŸQ`o †â¨¿™à[ù_šÞÂÖ9Ð1Æq;_H! åÿÖ“Z¿äùh $g8ž}ô`Ù�Äêõ¢.ùáÅÔ v;ƒeˆÖF²õ¬Êχ­UYáÊHo¹ñ/ª¡<³Þ6áEž�ÿ+߇ò¾‹•®�ÂSû[†åü¸™.HÆ÷�䵤];¾âùÞ‹ý“R|v)öt°,zT`cX¢‡`u‚´„ó:àØË!Ï`†î Ñ”#Ë ƒHÎ&$¢ÕU–UÉË‘C+ ˜¥uíÇ´ƒ£]AšPåd|¯ô2{�ä“ܪÅ(ãìi—)Àô åhñ)'�Î'h?‡SŠë�Ó© "¸›ùD,»r£½7àÃ,` ‹zxç�_çø�¼˜¾ïù!!zë§Ì,Ë—|{gƒÿò�'´6[^uvŸS™ŠØñftRÎE}’œ9_@“èw7LËtÜ¿ó¸?÷÷‡ú‡ô5ñùÓ™~~]'YÙv¯l^×1ý´”­¡™:슿Ùýójùö¶?Âß»¾ÝŽc¿ý¯ýâ¿×Ê8H~—Žuƶš¸“Ó_�û>L•îý¥,8L†@�˜âš!BO«p'�Ï·}÷Ë�{ýH»ä~¼Rït8×çÀ}úHöj�<Ëä‚x3ukʶ?ÜZ¦‡"ÇzæC’ê».1j-Åir"†× !QïA:_zÊ+^qqºò·ææÖI‹ �àj›Äðã:«“%Ô•—…â*ÌO¤7H9¦ ‚n2 á…€,˜3#2¬\«¤µnƒUº‹aÙ¾3SŽfåêÀâZ]ôeð`’lòHF'¦e‰ ;‚‚À'Ú�P0@}˜‡U¢\³sÆ2PæÛ—ÄEoQPUšÂbÁ.L× ð4&þš˜ƒ¡¥ƒð¤c> ¤píŠ}[ô}ï’ÿb8–5pˆ�ߤÆÏN€D0»’ðz"‡®#~ÔrèÂb@+s‰"0 \ñ{;o3zmÎô­Uwçm© 3ÀpI§;få�¥6ØÛlfK À§HP^B¸Çþ¬Ê±Þ‡V^ŒK�‚|….Mt)£��¬Â›×r]Ì ò�Às·+ï[.)·B'^¨T ºóѱ¶njÛðÄsµH.¡ñ‚þÝÙÿ釂ÇJxq�oAyñ@ú�ÝkY�çRÞ>XR¦˜ +Aï¶è»­ÍÁm�ý ZD³I ;” ´ =3NùõsíÌ–�CøJv ?ˆ÷©´Xý&îŠA ÈøÓ~”›W´Í„øñ£ð+¾J&Èá]ªÂ¶œk¯3Õòþý„ûg|7×+î÷"ºáå«cV¢mcfd¢»®aTP5Ÿà ZÃÝ"C‘Äç(9Än‘ç ƒåÚÈfá¸y|B±¾š*£/¯-ı™3˜QAËç8�.Ü9bÓuÂþ",„»q“]G+Jí�,¡¶n™�8±©ÀƒJÓT¬–Ç9çL¯èDü«ÄO绣ؠnO™ÀN†ð ˆˆnSØÏ› å‘yê@äå¥dÔ*ZSÞݬº‚¡Ð\Xƒ_ ¯"Èч®tÌå6¯3»“%;‡hÚ�2a ÜïX8 v Ø@0Úâžï¿!ÊO웑ÆMSÛ¡'¸¸¼„Eu4´.ô?[0¢ål¿“Å8 aú*ÐXˆÃŒfR`ôMïZ õ%F\‚ŸÞúÌ1 çòúDŒ %@vãUÛËSµÅ ZTä­`Ñ’VÀÕ ë)š×zkvaÛ`Ö›7v1�oWa Qß6§@Ôb¾òn÷eøÍ·™¼à¤†àDîç­>X¿�¾\Ù`îµ&YЯ\ÝÿrÇ#D[À5Ó’† ΑYvXåÃÿnÖêèʥs �àIØ¢t[þcÝLÁô `U)Å­sC Z—µ‘Ý…îÙ¸•FEÆqaJq™@´ºâðlÐ-ÐHí,*Œ+˜e[§ŸùîT’{‹¹Qδ˜@ü›ìrªQ]DŠTšaòkƒŠSºª6bf0Ú®-‚7×­ùºˆzëØ6PtœŽ¾l1@Ь` ¡ïŠòX.u&ŬPˆ‹@ˆˆ—ZMºÃæ5ô#çg¬ë�DX#ÇZ—~k»1$Õ9pž Bs bÔðƒ•i]ƒm5A„8pÕ†oÄ �«ZýN$"ag çi×GD4aÙ‹³šÏXÛ\o£¬uª"”Ù„‘Ó¡»"n§ Û�ê7ÃèxÀÄq`²�Ï,Aß$o#Èù… !�â#…›Ìö„cö€ˆ‹X£_¨4ÜÊ`~ ††ðt© ÎÈ@&`: *x¦Iy{2PìâhR9 X¯%Á a± `ö¶¯ûG¦� ~!ñ]ÆâÛo² ”8G¤ŠÄòé/�ýzˆ½r¶Ô™R Ëùóé¾…P+©Ó¦½§šÏ4fà~yøoÒDòǧæ0+�ÕȾ‹(RªV û#æ�F”}ð=Ù.zÏã¹ ïCÅ zA(o¦ÉäŠÏ�AÝŒbhäw7¤ðjØõ¾›¹ 3献°óƒ÷b6]`xôÔ%IæuÝÆ9>�ŸsbÐÔQDu›ÆYÄT’ s2ÛØÇ�ò0k¾ÐîiÕ67™(Ø 5Ä£e­¸“FÂ@0-imUÎ)»�ç>$Q¹3¨`^yá¬G¥ "¤´`bˆ“Q1 Žä:Çí ­`N*¥Îó·x®ú§$ÁîZ9,^½èz[É�ü>�‡ñ$ /ò–t�ªc šW�MBqMjN ‘½T7Ü¢ÎܨÒ*[ðr€÷5ÉnOxŽð»±¥‹øˆ¾ß]PÞÀMàž*+ˆVRi2Ï{²™ƒ= g•‹Ð[~U¢Ë6[}¶#J÷xbK¯«Óe¥›9� (O6Ëc˜Æ®‚Ý|D?°<| è_16QüžvƒœïÚ+« Ä+4ØÆMÈœz3ų¾UxÖ{˜ò3~õ-¶Ñ‚ž`hAfÅ7$§E§%«iÉø^:¬íµ« £Ì{i1ÁÒ4¥ð‘˜™ŠÏ’"~ÏÂü%Ž›6Dãˆ÷û±ÛÏ“#9·ÔK˜L6X V¼ÀEãÄÁÈ‹� ˜ÚW“Ò÷Ó æJtÛ#â¯4ˆ¸áP¡Ç6g:·�ΰÝâ–€i¸L�áò+ H#ß„ ÆE‚ò?°8ü|ÒËH£ÑÊ€üMÂÆ,sgIµñ(3w—«Ç~Áß“€:�Ë“f®¡�å–@ÁÆdš<¢âPPµx@ƒ|;&GÐÒ@�L†©¥m<ƒLD °à¢ëÍ4:¾ëµ x¥fñTÕrâ`…ÌÛ,µf~Jf?^„õ´6àRdPsH\«¹)bœ Q@ÛS•¡úäKvÙ§/a#r¨„rÅ)™Ûãü§µÃnØøÙû‹:÷µ¶ý»^żyî„‹ H(¦B¥!„D&Ìñ¹©Ï†n̯G¶y“5�5í5$ Ùv,3$ LøpÚÖBƒ4tØW¤Á#7»T¬À;£`¢€âÑšS FVs…úƒ„ø�0MÁôžš-V\*ƒ9ž+ZN}Ý v¯,»ÜïKíMIÚ“]b§ß½ï¯ûþ#Ÿc؃ÿ! ?÷߉™Ëv �1²ã÷ôÛ·×Òßæ-{|}ñàóIM™�¥6esoª%ÂPL�sÃ¥ :½|õCqò^l%²;ÌÉòó©Î[Éë3ëBŸ¸f§Œ°·¤–O+&º<× ´-^ÑÀâ6›MÉc¤¤P¤‰LH›@ÎEØÝªì‘ÕÈUöay�°@Û0ÕÄEŒ´dùÃGºr×%�‡aÇÖm äÁÜRó‡0X­œŠÙ�g[š³N4˜°»•ÑãŽE-\ÕÜÈn' Ÿv`mj‚¢bŒ+þ²�!}0™Þ"ù³\rLAÑŠG)Ûóºõy{ßx=‚p¨Ë±±$mäiG£EtnM•6#‡Ëøð“×Ñ*€œ¶òRt$ƒM�"?ò ’Ž;Î<ù¬œÉU>G^¶‚ÿªªv?ˆ¿ªEÖ”OôÚ}˜›µÈi ÿ?â3f�P,ó6ÓΠ¶Ä‰%µ´;þ_}Èó‚$:×Zç;ÿ‡»w€Ù“é,žü t~üè?’ëEòÂp*À!†y/‚„ËH*X+1Ž`ˆ½JöÛ5±¸vý™�Œ2ì³Ïõu÷½¡›ò<¾X+}jù{¨y™�®ÜÉ5ÛæðÛmŒÏê‡×r³�ûS°3¯P‰üç1eÌAZOìÝõ�ˆ0èB»À‰³’÷™仡ޑþÈÌŸ”fIÔ=ó«Ñïí ô¼ �³»6iÞ%@¼å¢ƒ¡d†Á@&�–M4N ¹‚h»8Zð‚l-ý½Ì@®�[Áº‡YÌÊÏ©”ÁQtIÚ?óY<ù.]У\ê V¯ µç¹Ã‡ÀÉ`tx¦'³YÃ1¢ÉùĈ`µæÅ‰Á„DD0EÞ9V´H�IôÆ�'c€ô[ýÉXʰU£è)vƒÇ0ùkGh©Ë$e–±Ñ¥6ñ¡Îë܇{¨…­|‚TÈvÍN�A$å? �mCŽ1{¦PöÊo÷$p;ç�ì«�è'€G¯¿øx|Y1|ãÍ!*œ2T~º�³ß¼ÀÆã$È1l�g<>k½âAÔlÒ†qb\ƬÀc";9RLŠüôO’%VpøÈäEùQ�gƒlØ›÷ªôÿÌË$ Œì7Öà¼1’›wro–^猟ŞÔ{?ªsÍ ùڦчI3YÉ–ç\;sQƒW=Y‘ÞË a碥Üü–xŸÀ!Ñ-CqWFüÀÈ¡¦œküò5d_æ?]ÂŽ�¯p�`Ó‘„«d‚%—÷W6]÷’þ% ^ª`<4†#8qc×22˜¸|ÆÀÝEòi Ê î­E~¬óxt6jÀ󓃃\l »4¬^ UÙŒ:ÒÜ* Òª _2;±mûdg*ëEt N0~»ðvú:‹×‚Mfu ÈÁ*‘‚€5¹žË¡/†«±X5³úõ¡ bx–¾A§I ûq¨Ç›aLÒ§2âˆ",`77ž@ñÄ.ñE�éšsœ‚³?‘ˆ"#£Ä½ãêÿiJ×oæä~œÎ‡ oðQ·Ç‘–]k'Õ“p`¿K£€–`·ïŸ Å�ñLZ˜ñDÇÑÐ�JÊ•èí¹Â|7Èö‹ Xjcœ?5×/½à4°Ã¬7À=€=2Ôóz)Å!jŒÄm{_B´ BžïRÙ´eSÙlA±x“Ç�7Ñš^•�Ôû($‚�yî!U7óŠ\2B†œÖ¼Rºa‘VR„È-Ïw[`ʘ’�¢´xV9zÀäçæ9ÔY™iÔ€Ým›9ªDVýŸ[Zt. Ð*í• "ð…£B¯&¿±>ÌsŒ�+Æ|�Ë'Âä÷²e‹{ûL'ÖÿÓuÙ &Ï;ŽÎˆ›<åëïYëù myay¦œ ó¼E¡;´¬¦ð~×>$(ßõ—;�†Âá¨Ôo°4y‡ôþLyXQjB‡Œ[›žÖÇ Ë9?Tƒ@¨GÏ\ÞTK3ÊjU,Š…�È)¿:>ç�]¹ósÊ©ùí¯ÓA3z'‚Ó©bæ'Ï¡¼,Ù–$ònFk<ŽýY#©o YB�ÐX|@´w8£ŸŽE6:à”{bU²‚<8óeBáwV™/¼ª:}Õ ò�ÃióœÓ®êñ¼˜’ôÚÕÈó¸XÝL¯á›ÂÂSrY©j´PY»Ð#­Cz™K�”‰ƒú«#y 06{mhØÎ-K–š¾Ó¨mÙ~ÑøGÏ4ù|cé×÷ jïà¦ÏùŸÏŸ%…ø/‹:‹—“'”ØÒÌvZêf[�ý·Z,¬ÉZ~û¦RÜ|×#³w°…›¿[G¼ *¬\wÎ]+{-+ºNÏ“V­,ÅkdSeŒ0÷¹_à�¸oƒÚ —ïÞAo£Ûó �j5> Á¥ ¤Ú¹eTe=’]2¿p�œRøšÇ¼ZeQi<)x/~½é…SŠº¢fì=!Ÿ HPã�ÌÂŽ+ˆµ!Ê«aͽù�â5êR.CÙXôçqã�6�GƒÒ“Íä%ÿÍæW¹Ð´msB¼[ßž›ÄÅFÔx¢7¡€Å¹%$ð¶éù/Àù_CôÓÙ~Žé2sÖ½ˆ$ߢ_€†3�®uÝ—AõËÞ¦ØÅíôB85Á)¨G t@fOÇqër³ô±­��û¯œ‡‚6ìßÒNŽˆÖxò;–¯z‰ÈAS²Ûô^Å,óŽù®»‰ѱ_qï™=Ž8¹‘"+±'8RsÅÝj9Ãêñù©/ÝÛ{„ˆw5”dþqñiòh*R ,Bõp³¥ÕqxÎ' µÄT3@¤ï¿å�t%}éÀ/×4A›¹\!OیΪDBág�Ó™‡Œ¹2d!�IOê—6ÐG£LÍ…\Ï<ž± ¡£Âгiº¢M ð𮽠´wtiT4ªþLsqð²Þ¥¦{·¨-¢�’ÐÃyøÿµj) L3×È4ÝÝ#<¸pJƒRi“s§z¤Å.VBxÓ÷ïÑy˜£ïÍY:CÁ‡a¯oZæ(µ„ã[»„kÎÂÈG9¹Ì˜ÑqmѧcFY¹lCz–é|K7�¤  òûfŒlošÜ´Ô3EÌ'žô&jÙL3À—Ç™`’UJ¹}&X�é‰Î¯~¦ ÈÀ2ì%²îm¾]�cÙíMÐs÷‰U’™LZÛIroµ"Ô‰X_:™[�Îò¢Áê0<Tò{â7™ôrÇ89Ú„ŠÈa‹–ÇYñi-­VÄ¡÷Ç�™ B¤/�Ùëá�ýÆù5,©€ÓÏ.Î|U>¼3måY–~6 (‡=ùµ’]­I úº ;e‹è¹�eð�—ær´iŒh9¹Bpb«eFc¤ÁC ²êµí ·ý¨õ®9¯��šèW½ùX~ðx3ÈhPiªL¸] >EmÓyää¸Í’ä„�Ú6÷PŒwó^œhW^ô6z«oÿ†¼mTñ¹£Õü�êk§ƒ¥1:+†Yq¸Æ0Úé1wѼÆ{Q¶À¼é½J¢’âIÇ!۪Υ-î¥ÉåH fðט1ÖhãáÀ\çÝOû�òòáâcô ÓÂ�Øvù†›]ÿPòô=Ü·9Oè[¯™±ŸÅÈ‹æçN ¥"ãªÀ|Ëë‡ÆÞn±JB÷ãúÈ÷…•Síœù¹¼Öâ2�…Ïå.æj¨­ ɺÄ2!±o”±}�|Ñ ­�éÚVŒ>ù…6a!|íf!‚7Ø#$(™#ïrTFåYÜ#œÌÌ4õú¬7ô÷šrëúޤîô<¹‡“s�¼ßøôý&ûþ1TÌ Yù·tBºSe½˜=4õyÊÏ6pÕ¯ôµ®fç-g+�Yvˆ�l«&�'È̺H"Q®9?¨¼yÉ“BQ˜Ñ¸íÕêíì’�‡í<«¹ˆ†„ç #g}X·‹aP 2Í9µaNéÕMF]‰Ê9x½¹**#áéJ#¶wÄ¡ÔNŸ¾?2ÉEI7z¢Ts‚¨UI pˤ�fl¯"RÔAç;("$Ë…˜iNL•y¸ò«9£VZ´nÄp©5Ûæú‡1Ã[RΟ½yfwÚ¨É1 œ‰/WÉ÷�™n'†£V~“Áˆ/Zyï"™:¬$Wv<äõûJÎos ”.à‰TŽõÔ’n!—çÏ&èÖ;!>ëÏìø5»”ÝܳÕׄÄL£Ô76óQÙ•ˆ´0–cÇ8™�šÔ‰ø[ã°A’÷ÙÜŠýhˆGœø½7^Þºë°�w¢Ï ÝüÔSqŒ�S0’Ûª¡VÉ9kLk¶Ñêž8‘ÔÖ¨Áž´GW¦UMìÞ�—p~f3ž L¥/ss{¨³ïsö 'ÙÎé:’Óå]õ±l`ÚÜ.¬ñù% rŽ)©\‹/¨r mwî Ëåô6ýg®¤%¤¿’aÇÎfʇ¢¬p" Bε·Ý;½'L#“ŽÜ\2y«÷m�ûØáRç;ûÝŽ¬È]UzzB¿É1’*™NÉ£–’=)x•¸•9�–™î ´†cÛzØçz¼¯<Ío¥!¹ÑÕóB]´Þâ÷™Ôñ‹ µEbÉ&ÏGJüJ­-CušÊ5LyÐI¦yìÓ³•Q�æ»�®}§ÖsïƒLŒ»Õ=ä·ö|L¿4»¤ç¼Ï5SÇ]"û¤o>"/Zzk¸òŠMv]‘žEå“«GK£_"òeù§è¨“)²Í'‚ÕŠ ÍQtž&£µ*‡Ë[Ê#ÆUÑ‚æ”û[­F‰RòµÖ1½?!¤†£N Ó½ß4´QÅmBo£®Þµ6hÿ3�çGô?Ÿ\f¥�Áñ¶°GâCö{goïcþMÒdæ�Ú4póýãïñ믷}¡þ}¨2㦔~öýï ;CÌç¼$è~@ñ]#!¨×íËìÕ¾ß=ó¾/ïñù|G^·Q¤6Ò‹ó$ÍG3�*ªà¹}IÂpÿIBÄ‹!ã樂˜ˆ6ù´èBàóóÌÅ ‚¤HãbNh…²RQ�(¢�hˆ¸¯I½š9K²Ö£±Þg07Çè  àq¿À®lgˆhÆ g7-;ÉÆÕä±»¼çžœÕ]�øB<( Õ $y1l§‰Õ…l2Ø Y¾n–Žü?cƒØ;¬ð¯X‚@�ôo]ÝLOЋ¬9„¤¢$§Ž&ÂA¨§ŸÛ\¿FûŒã‰=ý=½�¹ì?’§ \2£iµ'5Žê/nê™·i';=4™<fØW;ƒ/'® ÊÂxÒãâ°1­zj8½ } ƒVd |ÈÃú1–¾²v³G Ér8¿ïåÓ‰¥_PÀÁ3­øÃc:ˆñCÕRQ¡&FÌ-ÃôgÂû–ÏøWõç*üDbQ·Ý+‡ôáÁŠÇ ¯PêÚ3á f£ÀL®[àõìˆ�“Å!†5ÑH/Z4ÚÑ'…ZúÐÚÛi1�P+HD$$ãcÍzƒ`¢ø}£øç]áç©cæ€ëf6DL×éFÌ*,x‡”}u¹áNžâõ^Òä…îÌ™P½! è[-”<�Έ@éÓ+’9Ô{u-ËQÕÉAs7Éôcd·‚zíÜí1nnKM¶1°:cË7¤–Î÷ê‡ ¢¾ëfÍ16]y÷þeãø>0ã—cQèÏa]²�:ÇžWkš we; 4@ˆ‘г.˜oî-K™zR�¥}?ϽxR ´UxD¯}ïT /Ï­7†@õòT ý¿œßVuéN²F¯ÎOØAúÀ }ø®Ò Ïíƒá>¿ ½¨JηÛý•×ò釕ýc+zâmk©_¢Ú'áTj5ëìºÂHG>¦…[º>À#;.„®¸#|_#GË»xLÛÄqJý{×–òŠÜÙ0€R#j¤ÓFcmå9"Ì/!%–t©ŠxsHoDóÔ’ox�Z®JÑP{kƒ¥¶7Â]4¯B)´ÝÈ÷¼¡“/‰7á—ç¹»|$©d<9ù;èúÁGE‰³¸Œ08@s‘3¬ª”êƒIˆ<,w±vg0“ó¦Ï øßÒ"ƒ|â�§ô&.0{"a߯¼Éú@D„…ÒÙCn×Èìð«îz¨òL Æ‹‰O–ç†lWÍ@Ð nˆ�±ñB¤K°"c ®«X(, 1b\s[»HtñŸôý+kÏÀL‡#F7#ž"YN_2wäK’öUZ;�jÊQÿ  F1÷pÚmù‚B¶¡"!…̪øövê†-2RJ\»;wg!衦£ˆbP/'9›è9¤–Õ9�ß"Pb.�̳XƳ~ÍÞ–Í…„ÎDi®öTyÏÄ4M��à·Š€ZTÍ䱯ø£¥­Áµ•i’ó»Ó=©œÅ(�H»ýÌAãα9ù°ÝõœQˆÎCº¸FûÓþtÄiHûÿ «©§<�T¢tЙû̹�ŽR•rd(“®’vrgz{(� G½ ½RŒÉCÍ ²›@*º t˨g#„ÅQÒ•@'I&—¢ @eÑÆ9NÎp× ×ËͰ�·„¸‚ Aœo9:GUJ6–*Tà\0ãœ;œ¯©¤®{Q2<�_  Žæz4ˆiöü×°]ÈF@yuúõ0ã²P'† â'p¢~,%Vû�%rógŽu”º•íËÕö�÷ú]ÄòX�ÿ»Ýk›Õé4³‘-£°çþð²rP»Õ‡c].òÉ¢…"fQdWMZiÍl÷�`‰øªƒv®ÄT©$¿î¹�ñó<äÌæÖðjƒIwfÞ@OëØÒ‰£¡Íl(Dhä„�°Bøkä€7ÍïEqruYç`KǔȈÌlI×K”–Å¡‚!­>1o¢4Á±C\šŠÜ‰]½éÀÒ‰,‰./lÈŸ°ƒ,w˜'k²¥$‰¤Í:gŽÌF4þøyÚko+×<_7_< ¶|¶µ¡°¾î¢�Hw/î<›th‰ú®·Ò©"!S¥ë¥ôt>î0ˆ¶&8äA/¢¯qǵ.XÏgsÜ®áᢴIÛº‡Ð1 žŽ2Ì0¡Îtýßy™Æc+ÖÌ*~"®Ïy‘éE¯‡”{))µÕ”>ïÓTaåvŒ�úq�©…öj÷¼É›¥Ãê=eXº�˜7õ—;¨±ÔxŽ��#ÜxéJîÈÚ6×w �ϳ²É¯Ñr»#Õ'ïºÕþó$‹½ðŸ;w8bá…}ÝÖ½NR¶(sÄ™i]NÜ9ÂzÞ>Jwþ”Ä3¥Á…vb,î홞ڑ‰ºD�å˜bCˆråÄœ1o;Õ)–L|Úûºñ�“czñFÁ=�J¦=ô¶Ê®¡f-º|CzS׳ïœÖÜÁžéF�=\–f=^å[zl·bB .ûê´ƒ'ONirF�z=Z÷‡9I °ÄFÎ?ÿm¼ÜYg™�úͻм¬*uT‚YøŸ4ÌKë]«»ÈœŸOYwØ\Ìœ4Á«CÅ¢í–~7²‚jо¡+‘Ú»Ëõµh׺V†8¼gg0dÄøº&Â@eÔM•ýe lðc(嬩²Þ§¬%3hj)Œ59ÊÀŒ¡ÃÈ9•ã„z`éÐ4`\EAE%+f¥]²zW a¡©°ƒ»IÿÖ¦rÈšVJMí¨BQ¢Éh‡Œu0K 8ó-*æzÇs('$qv¹GY0nÇ~è‘RÃA×V!b hͲ°jcob·H•¼r�–ó@ÐöH!¨�Ó;á Íæ3+y~w]‘/d{ÞBj *²´ÇQ¨yV"Í`ж²P¢wIÕ^Iíb™…”dÜqÑ—|=:?Šiy/w�È޲×ã�k\£íßóïm:×Ï�Â{~8¤´/_ÖŸ¥)ztöñéïó5Äw™e²‘ÿŽ3ñûiáÖ�:º½°À¨„•ÿ|öçùÆ "_÷ÕÂ…Ì]ÓŸãXzûýF-0[ÉçôWýr�g©Â«œÇϸt”"¿-‹g÷cq„å˜*€5ï4�¬þÞê• 4"w/ôBö(øÂkÚ Ïh‚ÿ0KFÌ \XÍ] yšX$̬1hÉí%öŒga…Í]yÓ, uÖê²×xÓ7ÕÀ€Ý]Ë9SpóâDã®ãJ?õ6{c,¸ÚUúK­$dzÚâ%Г^Ðô²Àñ‚fÌRá À(ï·êüM@Ài„ðÜP¢áˆlÌøý€@fßÛDã­�“Zˆ…È´Þ�=Œyp¡;_@ã¤æ=à |ÝGpkÒSvC7F[°|`9àLó{a†I6ȼöÎap™àPrqU3¥�ÁÎSà]{N9ËÃv´Oš¾½ÙVã-~¥`—žb‘‰  )ö ¾eœâŽ©ì^õ §‘Dk:J®p»¤÷ªæ'U™ÃNž¢Sú˜·\dä»å¾ËßÁÇÁÛä±5/ê‘°ûÁÛkâ¹ÖˆÄþô@BïS/¾ ®sp‘kõ§' °;<û/3Þ7GíGR88)¬2Ü :mÄ…Þç(àîA"%A p5�TÂN󱑊 šÚî'LÎCDéñe]ì@¬AåÕÃûô) †åHüé,ãòÂH%ö¨â²Ÿ ‡ÐJ�} £Ã†ªVäY«hF'½^ËdÃÛŸÇÌ ‘Éó9ÜÊ?y€a„¸…ùþÔÜS½Yƒ†åÀÑ<åKÖ´r“b¶ÌÆgš)\Ã]X%aÍw2“^býH Úóp×ì$„Ϩĺ/X/žžQÌÇÏÜ´�k^í5˜2_N…¹x¹H:=1}à�RMc±x÷°»¼Ýà Þ„W‚ÕoMz�.;fˆ“bjGti�âv Ð6°µï+ÇPY£ ±Ò6å‡8\n‹5½ÓÁƒ-‘ëÂÆµÌrŒ:ÉNÕ*nûj[N\·ŒKç‘@#lgIfö4CBì]ôéS[+öàð•äJJ¤s'Éè‡,ð¡»^®7£UóN«NÝHï…ÏãpKÎ&)¬šcÈ`§r#"ÄF”8eñÖì'fY=ÒkgïrÞ{©È<‰ÈIé å�ó ´!+Àj$º x\äÉèmغ[> ñ[gˆá†É‚a1#.O…Õs9¾³Y?Tš;y­†(½¶ëλAŠÎGEeÄŽS`Åþ¸ýb 1÷�æ+|Ƽñ �™ˆ5Öt.µµí�ºvÏA�ýŒ¦+�ëŸÄšå|‰Á’/h?ÉÁÏ~m š‹¿v¥©•FxíìÓOóžRÁÅm(j4Ck]çR¡²8^èF¼³ ±WÉ)·.ÂÍx(¾s4´: {§÷M½qŸ|»ñ�þ‘6$þ¥9óÙïÚÉ·¹É à߯ ¢%‚1Çm…MŽ}Ÿ¶²å£vØIJ1ŒkCu…êÒšáØràRÀPtwmè^Ø[_£«ÅÛ{;7R£“/¨O•¸†Gò~ðü…'\[z¾P7<ÑŠcÙBxGÊmåÅÔ;fÒýEÑçI3i� ã�Sª¥_t¸›Û.̺‡:Ñ¡‰Éó™¬òeÈC.ž-Aá´,âh�ÎÑ‘ÔøéÅòDç³�šÁräq6æ6xã~3¬FXõ-åi8í÷CcÔ¸3-ô­s±î›MÐIkÁžïi¡ÈéS³šÞµŸã¦Ãô+m�°ûCx(‚Yû<�I%8D(/Aó'GÂ)ÆO»ücHν¼ˆm-¢¯cÑÿŽl«»ÞÝe ˜€6´Æ�/Ã:Hçß�œRe[¶\KÄ,R’òqÙ᤺kI<¿º³«¿9ØíR'r5û”%Þ}¯IÀ­ÃN ÁÃí<>q¶ï¹ûQy¹t‰×‹ß•Ô‚,Ë60:_†×žmyYMzÅ=k¿×ŸU÷¹Edg�Iê¢f¼%$"(Ñ‘ŠâfB­Ïû¡Ÿáûm’Ðø…vd!¸‡…8*@> ÿÆ9+é`PV�À6uû¥d€rHƒ)ƒÞO¿H}Õà÷AB�Úæ”$ Šeæ*ö·ò¤VCRïäHÅL̆Cï/Î�Úú°LßÓüÆD/õ�ß µ ÆFC‡,“?„¸ƒ3Fà ìÍ^–0ºr9 é‡uÑÓNÛj4#0Å�)<]·˜ºPwƒØÂ\ W‰Pín(ìV#LY®´lüœ ù€Ä%ÔŒ)áT=oĨDy›=Wï¢hœ\§…׿7áZ;î_º§˜ Æm©Tå¼×WË5Ž”JÍs— �Û :µˆ:^2ŽžýŒïâß½}gkýôx9R!´\ó*yË>˜+Ï}ê¼ ư£§¶Zöv±(=NÊÀ·8©�§2°ôªÏû<“Ê J…Ü7�br#B n à'+÷VXã ¾U£ÏÙÄ( â¸ið¹$õøˆäD¼ËùÏü‡�uïÍf<îà=GùjK™óï©ûXÀqGûc‚G$à‚^ÝÃì[�¹Ÿ î”kDma`«uÀ«ãj.4�ÇÄÂ<în.z~vT:ÿ¤ÆÔü.Ù½z‰Š\¼,.‡ž»åÔY„9PUv^m©² ­wtǤ Bgf=&› oê<˜3¯±Zí7Ou£=#CsÃ&1Ýnx¹7æÆÆÜݧU)¸á÷¹YP®XŽ] Û¤ƒTï-iˆÅRP…ª$LšŒ ï¶'î˜w"°»MyI¬ÜC‰Â’¼Ô¯%÷ŠÇ.ÇÓº”}éÒ^‡“ÀBs9EƯ6N =?J~3³Jœ”|Æò §Õ–Ÿnì tr�¸lÆ©fÌ*²_èÐî~n_ÕâÆ¡áó­“Æ)ÑäyåHÔbáM'™ØÅœŠÓŽp“C S³ûh…ø¾”Ê ýÙß´d ÙIQípªÉtgë7=öÓÜÁP�¨v>„Ö4~QG®NUýŒ§ZFͨ¿õrd«äùyÁ[÷£2˜Eæ4‚ 6Œ ù¸¯wî79$nõø5�Ì%Dž.±3ë =ÇgÆïÒ@!E€ERüTÿ™ž'\ØÑ“y´ŠïZÇAŒóH :}x/YIÚ–y½ˆû9t2*7_<ÝèÝ@üœ « WyWã*#èP›&´ßto¿�ˆíq¨ÜpbÂÚ3�tWÍÝ'œíÄFsv$»È«ìNÍ 2ñX4�q–0_Îçí¸ø÷\D€kæµ§gYË;f;Ñaï¾wžù�Dk̈{ZW~iJÔ•Þšg%Õ£feñ÷uî„…×Ø¶½T=“ôo8óz¶0ð5ŠÝøÞT>V1+-¸‹«CW ¶ÑŒÔUùkÜ£|uݾtãuÑNó§•9yB9]ùšq·J¹P׿gäO!¤ï<ÞOê.“Ýú{.±D:»”áè�w¯é\`EÆ®¹°¿}æ�ï™.ý}Ú¯™…åk[°‚¤£Éá¶ð’>I³–ÊIÑvƒŽ¹%´4"t·ÁûæmØkÓí"ü=호ŽQº+ v”ˆI1gÕsxµeg æõ¾Puð�mp¼OZ€Іã1™53�Ëf @Yñb‘‡•^ÏV|Þ‘Èlk쥣�n­�ËÙýÞeöÈYþ—O*6CÒ¨o v›†$÷}Ö_èßï—.ryI¬¢�‡ �—¯Ýúج‹a­ßwn2m<"ɱû®9g:á½e¦pæ$k ÔW +`ýkîã¢ÖÄozÎ]ï�Cp&ø9!€D@éŸ{̼âS_ÃÙØ�­�8ßb“%Œ! `Ø6²Hø/6ÑÆ;ÎÔ×½U_Ë£0ÐS¢»l7ÓíÊsd_FyµÎî¸óJd€€lДH“ÕÖ#OBø;. xünc7TõIrŠïOŠD¯Öüõ^}æ¥DE$zÚŒ=‘ojyòÜ{­å!M“*D¡Š6„=z'½%Ió6k<®uåOw09�¾+ NïM«º^ÊÚw�Å9ÈÞ‚2¼�9û�Å}ðE A–GÀÀ>xØ·�@•?[ÊŒú%‹Ž¼ëð!ÌHãò>qù•ÿ¨ ;mú®yóót*¡åRóPnG“J’ Ù˜?ª#PðdÒÄ?¢Ü8BÕgjÔaõ“diÑ>³J¯³’42fF6´€|ãŠÌCsÙ†­õ—$c§¹�.bÙ�¢ø„R¦ý¢E0ñ¢ÛþÛ&ˆGv‹™gí#ä=N‚ëwJÆÏÎÆ y2£Sûð4lßøßý>…@z ºNëŸÕf Æp{9µù¨ÿ¾9 Ñ žõ`ø8lùŽøçÚÛÎ?²1ÞS!ƒÿ;ƒe.z>Tùñ�ÜóHÿ¿ˆm°¹‘ÉÅõžtÞúb3”„àЦâ×÷ÀT·ï&?�jp ´<Ý4#m6+Íì±E¦5ž”W™)¬È’vGNb0\z´f»,8xz+ø‘ñ^,ØÏ[.Ã[àðkoïµ12è �¢è‰)ã­+¯qUÚÑ“TöÌW›$$�ºØâæ5èpÙá ¯ã/ (e�½L±#ۜͪ«ä›Xg.] –Rm¬ZäËíwæ½¾�Þ½íÅùçt rÒ ^ …øy£â ._Lx#P0¨ía›~ %²×¤7Ì©{;õm|ïX”*^É1¯½¡4½š³òoÆ:.ö켊Âåß5²¼HUêGçEïZd 'r\4}½¶$$k–(gj2ðtoé~¸=«”k�:~ÐGâI�H%“ ¿•FÚý?�k�¿ÿÄŽÿ؉âߘJe¾ž5K9Õ‰æ‰×·K¶Ï)´¦aÚO ¯ò‹)ªƒ�…áÔ±é8�ˆÃ¨4’ƒHÈ ¤„k�äó(D§XÄÄàª`9WaÍQÌÀ Í »l3S>™¦ȃ†ÄZX8ÔOäMD9ç2»v®ÅÔˆr`#V\®Â¨{–³íÕ€ä~ÈCiM?»âæðRÞ«½­bU{ ú›ì(Lbµ´â( õ>¢„¡÷8—1 tëDd°°[¿´‰æ KÊIüC˜·( H\I\î-X¸U…IsžÜ’%äý:-s3Ü%…³Ä…RçBó˜Ùý�-„$Ø¯ÐÆjúYãò„Qõ®A “y‚Qû‹ãc\9ýKdW®ÊµA{åûevìá³'`ÑåqŽU*ÕŠÕèù/±Ê-˃CœHcòZ??.*3° cünäp’óâàµND¤–qšn¸ ˆ±…ÿ#™Šåxj-`i;ž!¾ g>øHæ„1@ä ‰s;S·Y d…ˆ!¤V«ÙyÛ쇛�†j¼¡Õž8­�kÍúp¦…�å³[)qfSè꡼¨¢æ£ØêžÄ7˜sîñÇØæjI;ˆ6½oç¬x'ÕÏáìsœÆÔ÷Zê Ã$)Qñ7M*ðç=9(ÇÚ¤¥Å° fFf§ùÚ?Qrp¸Æ #˜Gµ™ÜôÂÅ¥Åõù[oxü1«¿~áæ[ÜFr�zÉGçtôèÉ”“9ð•ãÂZ T»ÿ�õ•QFˆ¸vrãùCWŒ%Ao=<„Éf‘Ã0ÌqäúÇÿkH£f{d–÷3 �ôÊàõÕ¼ßCt¢@"Þö|nˆjÑY Þ¿ä.δ–È•Œ�.‚31Áƒís±ž¬¨£�Д¬PTŠ&w!¨]:4çoÛŽ}C¡KÏ¡HÁè&‘�ÁBj®¶@°¸ÈŒG›SžÏš½Õägú7ŸV¯P£…¢ÒT’ú½N˜.KV4F3Ev©ÎrBÓ“Z™PyÞ›pƉ{k£Û8„î^µžcæÀ1+±puBÐÕ\Ú‡Z‡a‰ð Y?&nR¶ò‰¥T9–5¥„ªêa²…ÆÐ›+Y[nÄ^Ê%¦çÓ}ö7”€†Ð+?X6 C²Öbju):U3ã§ð®ÞùIó½�ð‚ŒËVâ ?«áz«ï\è–EJˆ�|‰èaÀõ«gè¬`'æ8­#…Õ D8‡*�Ð㉗P5\�"ã@ÙȱªÄPÛa#T:"¥J&b¨.ÂØËR-YÍàÆÌu§‰UÖ˜j‡Ò¹Gœ &§¼ ȦÌrENo�.jA ¹ÜÚR|¤T“œ Éw"¢™½­›Yötx=ž�#ï‚ÞE®�‰®l!c¾„U~ùÂ…XecãæÙá:{ÌîeÑ['~`½+Ûœé! êÒ«<:4a_X]ºëM0¬Ä «¾Leö!e†Yœ=Zmxdv…ŽÄ ±Ñ®º\VA³žäÉÝ­˜«lÏ†Š—�ø±Â £t?sW¸{%,| =ži¨±ÒÆg>š‡/ˆ6f­hùg^t•¦þ »"Ä#§ÃHìD´û×Z¡Ú;k|íˆÃ´½öK¾*>Ó¦^Ö²!×uÜ |ò‹°äW‘´¬ÞØL&ãä`=ªé(hü‹B¸»Aîuêùßs½]½hP‚o w^vö,_3Ïc—éÁ}7äJÔ�í66ž/¾1!@±¶·WÇsŽë]!>äòú�M9O9ÜQšï*R§ƒÃ+ÆHY@«±@,ÎÃ�Æöבy;FJ6Þ“(Í‹Aý¯5!'ZÇò5Ñ�—KáÓ]ø| ¥Ç¬¦�'`#–2•Ƨ¬ÉQ†Abƺ¦„`ÿR3.iÛ¿nÁ®0|u·«‘ÏèÆór F6îÅ麚 Ë‹4ïû=Õ]wíÄäYò‚ýÿ'%æ@3‘$åÔ?¢*£å@‡÷ù¯ºgc§v_Ö�_àÓz>÷T¼Ì¿4—ûQ­f¿eøC.!SUú>6ÏÃóÛ1+±Mt¨;</;Àí-.êíÀ¾6€†Ûƒ•eœi`÷3�­ðÝ#3�éÎWn©£7’ËìãäPlPmÖ=?×AŽ€úoW0Z]@á–˜íÓÕKuÓ<°ä‡`¸vŒVxŠ*�ôÈ`5î>½=\Ыî©hÚ³ék�b˜Æ#¦{éfdg2l‚˜Ô†Ú‰J›+ ›A¤ÄÎÌPÇeYÓ:5¬F—Zˆ:/ù[Ì2.ÐÜ‚þÌ;Y\#Œ®çʽ€¼*Ùz ¶*Ê™qY†rûO(‹c†–¤P“Y•‰j‹9½­­ßú“NÙ^‡3fSŸýA§‡©ÌnfZÏÎÒ®³ HTãPÎÇ�—^î )ʺ¼è¡ ѱ¾lG#:vÛ*¨D3rH=±u×�žñ‹úà!‘ÁÈâCë^p[9+�ºùÏmšçk“¾¸®¢dQ=à)Ĉ€= #tþûþñ½ý>KÈ\·[h†ÑE~Š(�ôóç<ÎEòÞ&ƒJô(7‰hŠÀˆ‹½¤MgOYÍ×oi{¢†±X˜HˆÜ©ßo¿LƒÆ ‡” ȼNvÁðRàA<ÑãŸÜlþoIáÓJ×܇¨’9ú·B ·„!ÓSßõ¿_çZZîæñVù{¶ÿg D€ü÷_á5S5Ep"Ñ}¹¾~cŸË!GöK}–¡Æ•e‰5ϳí±ýÂËÆÜ­ù«E£â‚ÎK}'ä A=xøš*6ÓÂ9ÂÀbˆn%0�Ôà�¨pÛô¥-<$í…?}Ôˆï¡H¾4n€™QÅhq¿ HûÏ^G $ƒÕ§XF+Å£×nlU…n2'Y-Hõnò`�i H†µÞ‡ÁAŽØœàuI*f–ã�n©«m£-°ŽÖ× Þ1¼ñʦDQ‡Ë ³#B_«�Ôß|Ÿûe¤fÒì" ¿><7 øµ©‘7•pùö?UÜà~+^¬Ã¦Fóî´0$’ý‹±µçiÈT“Z;Í3·aõ�€‘ˆâ Ô&­+ކIÓºÅü¦c5ÓÒÇ:tN°6iH‚Ô/VäL”Ãà$‡~(T½Þ€DÙ׿±ÁÍG±‚}6ä³.cx�9·ðàÜ%a^'™€*VÖ‘Ú4‹¢ûéa™îoNëÆ8: ­mœÎM¡ùF$"/,ÏE„Z—:€é’ T`aŸò aê¥$ØÊ´ý;­k8! Žq$ÎåŒ7•øEçV®Ni+ÆñKòst)r\î¢;5ä®ûÁ–)ý9-ÖÉmÐ N8F78{× ÀO3ž&÷œt*ýg>ÃÚ!îÔ瓽Ӝѧ˜ f‘k"X rÓ¯7R©P‡F(î‡8;UFÂLë¹!Ï“¯ÝPü> 8$Zq4]‡/þŽps®qBŒ”�Î䪑§0Jß6À¸yµÈå^ȵsN{N6ÌZu{yÉdc\„p!8¹(W#~æ5zm®7Õ¯q/8´•‹ò¨ö®;ž"Pi|°Ðß‘¬2[í·ûÏUÄOCÊ¥ö&ÉâeÚ"t9M’Pƒ†×P”ÁÉx OÔß €û;÷m¿£¬0”9«ÐB AØ`¯/c#ˆ Ôæ@>$3F£åj܃/Äz'sÆ2Sò§1?�VíÌËBÈ4<¶ìà(é³’ )Cy˜ëDj{H,iŒ<)^ºC«Ø íF¦3AZÍö°¶é­ ðL$zw�Ž{smTÛ�‰ÀLbèNÊ8!+”Ö`:FfÈUP½ERÚéZyj¶C5›ÈfS^Ì#Pü†|4ƒ9µŸD36lÉ£ÕE Á‚D[7Ü»4*5úÈäR×ÌUbÌÏ‹<^ý)™¨ê4unqcýË !ö²�F­M>-âÉ&t®o•Édd�¤hÌ]8:0Ô7‚˜Vilä¤úq)é.P´¤s ñMY^k¡µ]xN Bô�è°qd[¶¢�€vÖúkÍÃ�zµzl;=  ;4Ù£E!C¦·º·�žg]ß’ÞËßš`(r¤+V‘RùZSøí°0ŒŒ/"¼‹:ùµç©yX�*‘ã| M×Ó#ÉAíAUlˆ‰0>ЇFF”fLAfì_KôHK&!YñÇ`uyÿ õ2$+g:ƒ ³¨¹´Ð]úޱÁ-a|•U®"Žš0xÄÊŽÍ'aWHY'–Í/ ŠåÕ`îÇÿ .0þæ2@vfb¤æ| ûë[&],äk1 ™v8Ì\Iˆ«~nÌ.�¤iÚPGz‚ZpâNž�1Õƒ¸k˜­‚:Cí¥Gõ•�c|¾È5Á{ãmKJ´DÀz2lv¼[falƒ}`ÒÏY4"LÓ´Á#òîq8Ó¨ŒM {ÄLkškþ.EEŸ°l8êœåv”V‡|^'ÔC./Ni¾Ñ€Ýa\Oƒ„ù*MÄ”2Vª)zÀ Z?¿"u’L; ,A}þù€p<1òg}UÍ�?q*/P*ä�Ä”yv•·DÜå÷Ñ\%ÉÜš$ŠÅÅ5!ìæOn =›D6’dö�!0PcÓ«üþ‚|ÎAð‘-$@o—FÌÉæ6`@mï nZQÜ} M¨¤A‘9§ÃÿÍ`2¿ þ,~¸þào0gp ÄÅáĤ)>ÜGpÎu×$#‹óÆ2OÓ± ¸1º!LgJb¼‰W��O4“{Ÿ,$ûp›«Z×§…¯0!1ÀˆÕy½A) ý~Ta‰4µ°}ç¡°”~þUžê5æÐµËð¾hî¢éÈ?0#ßÒØBPb#=ÎÊQQedÃa¸ž—Ó’™�ŒÕÙè) .m`Üi 6h¾¶Ä ty íRs|LškKœ:~o+Àà*YóÀ¹Å\PÔ45ðS’¦Œ¾ïj¤CAGËâÛœ”À°ÔEœˆÒ= q�Ek¾r˜çÃဘ„P"›n†ô"RüâÔÃ@¹Ñ\0örF¡~Q�²Íñ†w`ï¡÷º“Ù+¸QÏI¶C'4ši³ŽRÁìc,CuÐÈeA60 ÑòŽ;Î ¦�ø%]©éEÿ;�œŠã "ð[¶_�¡®i…yáæ÷Ç�>CœˆÅðsv"¡5zÇZr,–N¶.ÂáÖÈÀ{ÅÄž¼†Õ},J,ÐT6{Ûnù¿�{G[.kªb<#81‘iUB¡S$J B'é¼áF7~tìÈáS ˜OyO÷¿¾ÞãV Þe¸£Ñ¥�ÏìýODMг¨Wº ¬×{}áj�'ÞNG0õÊ­Hë…Õó” Xbüϱ‡Ú°kã�Œ%9K™â Õ, ,%ÀbÅ5så�KÅÚ˜n¶[EÆZ„%Û]`U6Ñá 1ú�d— …‚s‰õ¦gÄÀ‰ÞÁî�–L’¨£6ݧ»ÝÃŽÕá4ð‘=,½ô5Sƒò 'YIÖN ¢�+Íȃ¬Æê%�5˜ûºåÈ=n—ÀžÇ¡S‰./ÌÆJh9½&ˆF6šNeqo#¢¾ë™jp{Ñää br1Ä( ±»áî­ݬkJ«* cáPÑo˜ÜqÉ0™”ß =JÈÆ�v…F«wbS'&ª6p’aêá&w‹y‘š` )µ^j’ö5¤>X’РׄY›‚3ºU]oušv ‚zÀ%‘'yŠà€DË^R„§pìíf«”™ÖÓ_âºãz¿–=þªë—Õ̲î»Â¸¸€€m+ŽÆ:õP:æ3'<»×Âæhñ�‡ì=¶?Ñý+)&â¢|`…Ñ_¾rbrõ÷¸,Äj`è¶ 1ô�ÿ˜þ³ÈÿC:|F´ÿ¸ùZ×±ßu®hš¢tý@T§ÿ–M"§œ„½ðõ<ˆÁxÛÚ²5n¹ùõƒï·ü}žÜxßПÀ¢¾Ìô‚"vëýšuë�¼”Dúóûª’À‡aåoå­×ÚØÈQö!à ¬CÇç›q˰€=>{*Í»ÂB„;Æ ]zÏÚèkåókËgC!á�L—kD‚�#Æþ9ÙÔÌHGó'êÿ}îc�x(‰ÂºÔÖykb­A‰{e¥Ê–$»(¼Ë=”ù¼øñïô—<%oEg œ*òÃ�¢GÈy\Áåÿå¦òS+>QØb¯Ü!«ƒµ¢&ܬuULº ¢çªÀ‰#ž4/ÚHb½¡ÓæïeÂìuC�uÓ-É„êÈÍ“Ú·Îæ7yÏTzX Á]z=v׺Ÿ2ñx¤nÆÒtÓô{¦e‰Àg2„Í”ñYv�#ÈÈã t ­ÞÏ[œA4/mMk¤Kè+ú 5¢6Ÿócòd5PþAWlvÍç˜�…Ój¸;QXÆGXUÐ+‚ ê‹w$P?\³ è²Ù0ÛJLM«ŽÜ`ê*+$ QâØ@ê>?{¼M�lJ 3ÀÈçø•ŸwaÔrfHcâD Bœ´ûIÅj”4¶ ‡Žf{á’«�Ý) ×ýíßš„3PXÙ·’ù�¾9ú¶QüCH8�Š=*“†ƒ¬g|‰‘²@Ïy? šÒÝóŸ‰üÖW׿Þz¿”WÁSwød…¸šý¥²"ˆ_¨ß%š«ù¢|ûÏ'1ªÆ –_y5 xMžè'�ÂEó<,̺AŽ8§ !“ÜbO»b|[e.„ìAL=™½d¯³õÍ¢ƒÛöàŽ°d° á™ß”›¯¥Ý ÃŽX>„’¡àK2WƬ âòf¸L¦è!c`¼ pB(&'Y‰?[›€!%²öšëv�úàI � zC4Ø\h>@¤Pji°Å=¡‘Lš6ÍÜ,dÃ<›i-ß§_»×®ùs/[!˜iBér„Å€°ìA Ý‹*YN ±mØ—?KÞÝòÝ&"Ê/4�{±”ÑWu7Qà^¾Ç~/2TãÅÁ /‘í_Š.úRH]Á&P0ÌÏ™çz(×H¯��tÅjˆDƒÔ€7„²½a(:!€ä , TXþÏuN�`´’ìÇKµ›%H¨`“‹/¢ým«JsD¡Rš1.?󹦟Ùvã}½4 ×L£õITÍuY©8š‡MX“ýü—„¤K G0¹Èrì€$13 ¦ ‰8»TGOŒXkÏ¿ØZå¼(Ãz –üÙ¢�8<�œÿr£BIˆó­:Ý=BÏ—™ÊDO‰Ha–éù\?ìã¹¢}ïDHCŸ‹ø‡y�„îÐwÛ×1Nàyì'6+8…,_éè _Nê9þ˶0w•=’ 5Íô»Ÿ[d×鎷ºÖwz yCÍ®oºÛd©ìá¹ón­§F>WO¦°”þT’röu¬é\«K—0]nç!³•]�ºlõ5,{BŠ,êp[­Md‹uD J-H4dIÓ Àx¡8`Í@é‚ûr.ÑHNi’*ú°˜*ƒóâ<ùyY?¯?ÂqCçäy³OsÏü8þçâŸÐïìãÅ/Ù'‰d®™ýÖØ�� ¿éÓù­þF[è~cw­½�äÐÍ×ñ€dÚAɉÚ÷�D�dµa)ø¯<€=Ä”Çx]5^ˆ\ñØÔse‰Ÿ%7'Ú£ß ,ÔDv…„µ.¦é‰ 33ŒMA¾>ä>\ý„߆W€Ë¹=åsïžz”ø9F¶Ð½ûc³æ‡ÌXO•ÑêNXeŸ4vMjÙÃ2›$Ì€�<°‡Ù*‚V°%€zâ„'i nc‹Lö¨Çàïœs„b/ {ïÊy8àˆ(«NãÚ ‚rãzýᬖX/�ÚŒ„–Ó/?1Rž¨R¿_Õ?~4nDc$9oÑ�«NÙ÷ëö+Á1¾f:½çá·Ä¨< öTrt – ÀG|:ƒd~NWÿ= ¤ZÙ´„+…ž¨ÎŸ)¬ÎêBч`Y€±ò�Ey«!JLu##µ[C€üf‡ZIçQ´X>AÖæÞ4ÏM¸ðskÑã´,U`i3³u+é&äjb'‰DŠ—ëN]NïÚC;ÔôW˜ NL‡ ìm†–Ä‘Alç Ï~`YªŠºù²«Ó 5[9„�d¸©‡H ¦e3(ôAà�h¡bÒ óf^‘¨EÛ‚¹1Îés3Ýé)`¢¤0�`F3Ôb @Í.4d½°úÐÛŽ›û¥ÞÑ¥$…ó}j©D£Ú]äþê ··&ý3 N‡ªàãÎ/ËÉm-2³«ØUnöÖ¡iòáOË#,ÿ®´_Ú¶6=óÝ&à9®Ù¡ÌÈÛ"––ÐÓ!j¡rðÆê hMÖ`PŸTpé4ñ„|ÄÃbÜ=ñ'ˆ´9k?Q'SÂpÛ.–�?à¨RxÝ!^G#·;Œx9èl² z3uwæ|[¢Yè`�û>ÚçJwã*šð,C·¨Ü)tŠ˜ùÚèzy�*½õ=™dHnYàt½wkÁSrl�å˜_býçR:‰| 7�2€„ÈŒ&h‚’=Nf)\4qyzS€·PIhóÓ¥#*ž™ ß^´¨Ü:Gæã§]LSÓÞ¤’î{~Ü—‰V‹¼õ™L‰Bq_ÉKÌðò(dú~ 6!á /‰ÂAË^Mõ!¼ðFœ;ŽxxÜÃ…Fæï›Ž“PíïHΞuáñŸ½Ròãm!]Ÿ…Méyªbíš›È7#^ØŒ©|;œï;>žw ¾õì‹›ç‘Eœ¥mŸÄ3€ õZrMü³¥Î÷ž°çÚöÇt™­&‰#mç­Åˆ!Fð}Y«´4ìpå“Óß±37ÜËzüõ«îPP9ñ+ÇòK:F¿û<¤$ZFcíüØÁ±ôD®ÄÏÀíìSþàÒOÝ~e×Í6wŠuøaû¡çoð„ž’BØuÑzmÛfÞ„÷~ÏÇý‰€èÏø¥%£ûîn±ÇšSá…is8õ“þB€ AÝRE…XŒ€ýlÿÚ2À5[Ïç¾~-ð€Æ­ŒÓ´oR-ù�r}¦ßv|3ï«ïïâ¦úhónç�ø`¯“ôÿ¿$õRdÏ>Ú 8Ùý¹ïiø8­Ú½ô»1•/Úÿß÷—‡œÛOÍog®�ëâ:ÏS¡wóÝ qGÛOÂÿ›Ï!Yc3¨Yd„íiE€‹DÐIù#�é¨g2¬Mj� ÌgO…Åe'EÇÇ ¹ž]9ÚvFïº$oFæ8}#HhïånUˆm|yÙøFúçKîšFÐÌÌ ’a¡&n‚iâ…ðkÀA¶òz£ò¬J&3»¢'é…³ŸoèâïËÑqºkÅ"@îŠD(yrPÀáE”·ÆÎ+´Îß|ZP0¼l†Öá×ojöܽ: jb6 †¶$�¯ŠOD6÷§ÓOn·•ÃàNA€fÖqöýQ/¦O#­‘­<ÆÅYøTZÚ9>KÏVx!Çj.Yð£@‘`ç…µ'‰•–,kéļðßIÏ“)a¬("@×Ö»îž/#óHPzÏ51€gÄÆ^=ORs2¢îoý^Ç3²'G :ÿ ÇúÌÅ$$pîóîUðHœM¹§ywi+½j¿æþØÛ"•]–¾J)Ÿ8#]Œç4>{?Ó¢ãaxâ +„têm >"ˆm(\’#mÒ̤c2(Ïɬ¡,¹Ò± �ÑHø4Sæ'8ÑÁê®ä`°£o`wýíŒ2Aû9ÿRSÁý•QÉxŠ1qóŸjN=�LäϽM;äV¼pÈóqƒ#3+¢'*ÛŽñÚºÜÄ[©E)×wÖø{ï9о�í7ú¼M)@Â�EøœC'ùû6,½~ñ¾¨#ìrŸ¯àöÔ¿Oã!nsZòxMc†Ó)ˈ@•ê½…™’–¡Ž5g,qkdÒ…WF8N8²ÇŠnF£¤Š“‚¨G#¢Xñí»­‡½BÙ6è´K|Ÿ Ë&v‡O%-¿ÎÞOøâcd)wd^kG²ÕÈZ>_—,¨ßÈ1&<œ4C¸9!Þ‚6¤ø’�/ “i:T –C‘¡9!ù¤ìsŠÒ;ª¼‰{04LXP,ãx´×åOL­<ÀCÁtPMÅg6âG5 ˜-lÉ�î|Œ Ú1é]RWšO6nÙýé°"žx4oqééã%îá$Uùç"YHÝ%ëq‹š@Y‘—d!ùÖ_IG¤×$×ÙNôo‹+­’ˆjá™[)&nkeû¤i»-S2Òm‚D@„Lt8xv"��<Æè€¸±Å$–ˆv˰Þ¨8 •(Z¢3¶ �‘‘¶u¥w"h-j¢Õ›f BÊe£=oHURgt�œ–Aσñc@ þÞõ㯴XLj¯«>½ä$\öz;öÇ2\ÀÉ[sÅÛÑXoóCÚ½Ÿgò¸oNáÒcIÔÏáµÇ6zçÏAµ��^™ÞwˆfÓ;AŒÜî°žx¥åÿvÂ`ë³®Yw}IÚA™>ÙXGu 6qÊ¦Ž¡ÖV „‘¬¬çC\Ç ûhqaRªØ0e~n8º„�ãœOp¾ì‹ôAxH£Gô‘CŒ{ø"¶Ç‡€D1ZÆ=6ú¡Ö»Á9×é´|&Ý&6/!pïiÅ$ÏP+ž¼Y²Ÿ–HoJ>SôÈ!ÔA@%‘òüÀ xÄ<Îð­ÃÏ¥ØßB‡s•ª…(k«èJÝ«ŽÍ[pŽžóŒÂ òàÙÆÏÀ|p0?zÔâÇŠ`O}�mYÚPˆ« 6jÜ=:Ç`³´èF`›váâzüëtqó8ެ‡Ôp$øóŽz"kÌQB£n±é%gK+‰Ž‘EÌVÆÎ•)ïÆŠƒá) j2Ie“úÇä¨�zyA]ûûòЃûf™~©²§"B<Ê�Hây(£þm‚�|ùŸåí2^j�¬ÏU{[2Ar›„íçÀ§ *S»ƒÞÔ^§åñÒÜlÞ!)™ìýxø.Àxzv°áӻ¿ÀXö<áXyŠET=»/c)!¾Ó'ì;�â—Ü,�_b‹†©ÉƪgnÖå00÷fmÓCÐÁ`tðKY»‘,‹R°d­¨Û1ÅíºÆ†ë%T�* "ð"Ä Ndn„ýwšHˆ‡Ê¦’ uôl*X`¹’îª8”$Ï®Í'Ø60õlâ^׹ʋaž L¡¿û^í´ kÖ±­–�s�/½ôÐ A†¡KÆïÚÉÞL ˜âF 7Já8ÚÞÄ�>ƒÌCšÂ1°r»\`nFùI{PÛ|¡0QAm<ÅîCÓYbÛ“Âr啵Ur»ÖmÞ€ß:‘¾7è(ùÞ—Ùc´Ê0Ò3¹2òë@!3Tõ \kÒ<�$îoÍ€«¨ýØ(‹†À=b:‹_r£èp½’$Û¥ËÃ'| CTPâZ/ J8›ÌŒÓ G¥Ø…ÀÂ6 §œ7pàT‚\^Ì1ôgh¸åÖ0�ƒ,äJ‚JXæÁÀ]AÚä£`²ÉR˜�F@Ȉy—Aú}xæ8pW8Ó4��—àîÉG‹±¸:‘F3a¡/  3X)HïB1Zá˜øaêŠIYTÙUê!Ãp}�Æ&nåœè¹R •Q`ç)›©F'dO0P¸¸ AˆJˆ8-~ÓËt‚Êh[`bi­˜6m´r[Ni¤�é]¶)S�t�êª *ü R™|®Ö)¼5AMXðÜ‹p­¿²$]÷ /ÅÄW©ù < •} ¼%úõåÏD4¹€Ñð�<èð|4EùÖ ŸÞmý‡Ûö“B,G �ÞïAB8ßü;-—]0�Kæ_,qSLª6¸üz* þ>›Ìì™§ðÆßÀñp‹4! œnÙf è°píI VÍÖºã´!TɱžX±l%û|>ùJ™š÷ä5Ó“ŠîG·!¹5…xÛÎjôų·ÑGþFÒÎ7ÓHË&ç>^Grиug!°)�,]2t`ó±)Ùm‹$ü 7WwZV¹Ôd÷A£#D„ö.Åhl,ÓqŽc‰$§ŽIÂ!k¸ž‡õ×À€)2”䃔Å®jœ( ,íø Ôœ¦MU“kÖ•%­D’å;UêWΜù�U�²o¶‡ã¬‡/†kÇ-œÉùã®C¹ªQ g÷¼íÏDW´(qe==Š1‡>ßÙí’?ÀŸŸ×Éþ£ä0}ŽOGÇh§bÏèèè¼G]ôÇÔ>Ÿ>ûŸ�ñ5‚+ —æß€ÄÙ¾}§-Ûü¸}ýC•“ò—ýß¿M»<�{ ~ 7ìÿŒþß�¹^÷2ŸcK�"—:^›ÿ¼R`0Á°ÿYaL½DÅ»U…1ˆœ]AM|ˆãO*Þ¶<9mº¨‰¦3!2ÄîÚ�¼ Åô2©=èÞì Á ÀáÛeŽSÂaåš±ž³i0í.#¤»Kà—/Hc¤XÄÎë#mìDf^€š—µ ä¼S� Ê—NÛv×fìà-¼´ÆÑ @“6Ák³ÌÇ æxIæŒÝƒò�-œÑG‰*oÔÈ^†¸b¾p÷� I$²Ì&˜hqhq}º/Ç: @y lìhØP� ¡}_"ô¡€ñ�Tmm­%z/.g—2LÑ•s‡Éâî2'‰uÍ`%^ž2™ ÍRñ­ fej°sÈQ‹„{�œ÷QÖJ³äÓŠeXÃôÄ´7HWN-‘ ~ù �Ey^¤ÔŽ<˜Ö=Ð+ŽŽF¬v½çf1ÆÜâZ¬èw•¦¤på¯üÂ0>X,ýž.7å  Uô~QÑ‘t¸n�£Œƒ1›·nβô­aÖãª:¢PÐ6†Á¶[X mìez¦êöj�MCñQê]:•>umçQÚHXâ>ÃGVͳ\±} -Ü`aøôõ”˜5DÃIàF�nsXÅ öü ¥¦/à ê:Óæ ßÍÓy•@uFœi¤ž›ëß—1Ñ~# Ö_l�›lUXÌö~Œ˜.9ûv(jr^�ìx’†ŠINÐU2«+JþK{)µ¥¬ž¨RtÕôJºÚCÞ«–û:{k@FI‘d0³í½:ƒÍFË“š= dKýûêk/V|÷mˆq’ø!Ïê0S~f¬P ãpc((�¤þøoI½?n­©z¤%Úš›Lá\q†Ú0ʇ³Þ�Íur�¾ÜæÕH"œ/±@ñ£s ”E‘f*Oˆ�-—h6€áòÈ΃öânU5:l L³¡[›ã‰ó£Þ69ƪß?ª‚�<Ö¦< Ì<•q•0 O�ž¯~˜ìªPiI¢2YP6<*�í�—�Ï»ƒ’|Wå÷^¤YÉë«Mfdx`±µP |Ù‹¾k¥o—®çQmÞAЋÝx˜æÊDF VüvÑâÛ¬'MVÛ¥‰ã8�¹ù²Ç:éPáqG¸¨�fÑvÌù›ñö-zúµ"°•™"À"ô,—uÕµ21ú’¸Ž5K k?6{Ÿˆ¸9øke…θW¡ïÔ)ÜY�šˆZ,Ã�ïQ=0¼ÈáŠÓ°ð$l‹~øBÌÊYm„|˜ Ò¤a|��¿ys­�>:O~ùåó×ö_Ù¯6È•Fae ýŠ3ñ-�C×Y±¯!½ÖŸž’ÑåP¨%à&—ŽƒH¢ÈÛn ÝMZM¡ ¯�Ù‰÷!­HËŠ‡­ëÄöO¼Ð°œÑN?R <‡»S1?˜þÈ1õ±„ý]ùLD`ð+ŠÖ¼?G„ü�£¢�>9>1<¼)¹Òº«úž ßÇ=œ}<¥ÆixvGÓB5Ò1PÂ’×L3‘ྠŠlmdí?¢ØÔs^#R?XáÆ©iökĤ–çŸÑ÷£Š ÇCú0" ¡´ kà[FšaôKʹÌã\Ék™`Qjõ¤&÷¼_RÃH\ö¸j¦VüR�æt:Rº±‹a`Ó?4Ø"~%‚Ðû¿©žôã=ö;BóR&Ãï:Ç,LÖѰªüÅp ØÞc÷o´XyŽã%ÆëYÈj ? ¼^üd²N^w˜…yõóÀ¥dÆŒqFQ0”ÜøÁµë7ì:Sàð[¯Å‘*›¥û¯Còn’w¹ŸÝÈ‘yð¸kÇX+Grö�{¤ÍÄ›¾Z–ºAá–s¥×*½„!ÃÍ{ç9�>§·W–2*7UeòµÕŽlôYž ¢ÐJïf|¹Ÿ(\1ZQ5ª§0yÓyNº›}–ž–ÈÅi÷¾2ô¹4Ëg×l²Ä�áŽúUGÔ³T½û\ÖíÃÆH‰�Ä¢Û –²å’§§ Õì§rjãO‚àj3}¢�;§•!–�Ø/"�`°ñLkC›:A”íµ2Îsà ˜a›Ïë]Aá) ”OòÐÔDÞoK€ÄCU¤b÷F$®#¡gÅV=¬j¿Š”^‹G-èÞd‡sB<`Mãî‘3«IûÓÛÿgc(áøUºEš`8lgjzâ¨Cn‘¨‘ÔÓßM {'²³ÓYN4Þ7‘*ä›*!€á™!`c‡«œ ñD6G#ÇUìg|8vè=ÊMP1÷/Õ7+Ÿrö®5…Ø>Êæfòð¹­ª¿‚lt“i¶˜0нïM� vŽÛǯ ]Þ3‚¥h)ƒLQaÍÃ$ݧN Ò‹6�P÷”£µ>3� ðBP1°A�ûl$Y Þ3ÅM?6M‡v õþPâ»@6K!°5 ÅÔÇîó à¥ß?Z‘lŒh´™¿&Ý|d5¹6Ý! ,ücßRy£X$Fï9ïÙ#�·éWg3D P¨iQ÷ÀYG­7îQ¯+ñßTPÍR‘ëß»äÎѪ°MµÜ¦½ÁáP¬üa¹Æ¨ÏÖ4Àg6s�BuLÔ3µÕ¨q�èpß§î))"Ñê9/® žxc¿§®¡`)S�yé'½Žqèï)ÙNŸ‘Ëd0! „GˆáНä�`Ô%À·ï¤þœ‰ËÓƒ)O"Ä i™CÏ6&©ÔÈ\kp†Jb»Ý>XQ‡7€Þ)m*s,³ä(rZ0¥¢ÁO`�ã!Áø‘äÈ­NÅg—ïíœÑŽÏ³¼´ª‘zíñ yyaøx4Ãÿ§úµ”*Òó±æö /Re›Ý——]Ó»� èr Àé\ ‡ D˜YQ¡´!Ä`àîÝ]¤Êå×~uú#õ”ó@o"“m„¥ÿ‡ %^}1Œzz~ .3gé`–(04 XóËrSí¤m{µ̜גȬ¢(cfë¤%J¸ç)1¸bÅ�®W2ÒðI©•í�·×:ï±UVâÒ›„驎4±ýÓLæ£ôeüÑH^„Çc•D¥ÈȺÛàÄ«vÄE×')[† fs4Â' £ SÜyèF)ØâTuP®*‘HÐ!ž4’ºYˆ bÐ"« Þ.c@ßTÊF¡T´¸€�ÈGƒ‹q€/¾®ˆþƒ//Ø >ÜÂÒ‚mVw×wÑÊ ³�ñÖ�Ÿz­a‚2Û)×Eûg ^)xÑbsÞŠ£˜w~�ˆÀ;îÓ¸'“…O9 õ‚â1¼œf;”‚�:‘}óG¡pÒЋÙ6´¤ m�ÐtðŠ1·Çϯ^ÊåFdKa‡¯HÞó×Ê`xΊ’ˆtŒ�K&(Ó!^t4'Íw)ÏäË:ca›N¡óÆK¿#&dyk°h›~yÊ(–CdK)‘…³ÛKJéJVwUã"CF¦…_N 4cÑH?ÂÙÓû?¸Æ^hk>dqw]å¾ã|LY[$9VzbÈÝPf«² ¦•jRÍ ¨.}¨óðËØû9‘îñç¬>ž!$�¼)zó’£Ã>ªZž77¡Ï�½åíXGuïëÓ«RK¶tœP•7»Ýäõ (7ŒçÌß8W’!–qmº–q�QŽèÙE¼N÷IÂkˆ:Ëô/½vŒ?óöî]÷€Š9´ÊL&Í&ã9Iò0Ó‰0CyåâD4Ùèóƒ¥So„ÝÔ˜DQJ×·gêÑó}®²A aRÎ}ôXc9tÁ >d Û1¨P~n]£gÉ9L(¬:gï—Šô˜ i— ëø°÷ó.Hd1ƒ˜‚ä3Uôai9t(r³?Qg¸ÔD÷~Ê>âè<'Ch¿Ïî?q÷û›#·–›gÓÂóÁß}r|AB|�ôøÇê„¿æŸju’:�Ó?Î7ïg ·¼Ì4½Ø”±¢‘¬`À�ß Êÿ|þ=\+Óõ%8‚ÎÅÖQãÕðò¾5ãù>þû-ÖÚú;m"KåÒ||o‘’ú�ŠßÞ€óö{Es*<·Äí·‡?D¤(ó |{‘ÆòrC~8ߊÖ‹ùc lûWȽL¿½ÆØÞžK�¯;þôO&æñøñÀA®†N8ø ß™9£ÿއ|ÐŽ¾1J”Ú÷S Ö¦a?àØh;ŠîF�ó—£ÍÑLJãÄ7rE9¦öCþ¨nœ OGXHm�Oæ“Vç‰cÉÀƒ.˜­¶M¿Œ"ò qá¦îNÅÏ„õ™ÀÈU@PŠ Œ•ffyLtÜS5=¬àÚÖŠ³Hf‡4˜`\×7Ôø�˜¾ø¶9¼Z�yìGðjD;Èw2ž/Ìæ€Ø¡Yˆ@ÀïÞ@wª�ºwƒûô)[ö¶¥9íüÖ°À¨øû=õ;¾Íðr—DÅD÷ åÏÍìzÙÐÅ„�½¡ÍbFp6œ' äJ;ˆÀ‹@ïø/Jó$ºBJæç‡ó MÍ3Ë èKu^q4cñzS©;jîˆ1™‡�á`Î¥q¨u¸Q²@§„Au­ Üo!Þ|@öpr »ÐÜ ‹›Z?¾Fê8ÀȦ¸`´’Fi*Ñ' ‚lÀ\òº¼Þû62dÂèÐîÁA‰EP÷.�¹êRÅÜ®- ÍÎÍ1šMï¹öipk×l•gÆ�ïSËŸ$&ÉǶ˗søcDS òö¥œ×œÊFHl0QÏà·0 þBÊû‘%(¡skwކ"+Ôù¿rÆñóëEÆpYóqàs�N÷ì2Àe3@äRˆMxÔ/ÍÒÙnV“D¼ý‹ô9,êFñxqr›‡e{‡K�ð'" ç]m Ýr-rÔÁæi™�a�W)Çy{e nण}Y4ùí¤¶1\äƒb÷®¡CÐH>»¿ÄªÄQÓ¾™\U��5K ›…ž *Wp5 ­D;e'P*g=gI0ñß®Tá: =JÍ[m§bw|ÆÝ‚ù8²Œá^Ò&9ˆå¨>Ó “ÐÜHÖ „CÏí:p~×ïq–󣨑ÂAò‚  ¼¹ÈÈj®�w³ÌT6Þí…2bµ„^4�Zž¤ü >3hB ?)‡T<6W:`¯&30y»”m„Þä\\üÆJ³r@º#¢1Ÿû`{Xé? ñIa_tóL_*�øsfŒ^¯åú»Ñ>P�Exïwn‰Lì7ÅÐe@º ú€úaC’ ‚Âå¡?É8’ч%S+™ñW®ïINa�Z®Áz«;D…�|\ì/{ë9ñc$�ÅH9Ä÷âÔFØ�y,mC’#a<©îwÉZ%ú¶Y˜Dñ˜›ºBþ ã‚-HÙñŠ,×ïîeÏÝo=XÈŒOyÑä�€4‹Å4:Aˆ&ˆÑç*¼¥]—²ÉØ… v NY°Ôf`”¯%ƦÍY`_�Ÿ­öüe޼¤×ÇèJ3¨Ç¢×ï£Ê$1¿`Ê+T~¤ï¾xÊ3à£Á²$„�}lAú>þ¦qÈü^ˆ®±ZD’ͯ8´Ú!¨…¬u/Ž×+×¶D¬$¼4§k�G¼B9‚$ØÒKö"ã,`­ZsõE_ÜA »�dAÐ-ÆùrMóQj‹vÜêÏ× ¡<Ø<åŸ9ZONü÷<ð,ø�(qvÃW’Ò²�X×FO=ØPbS:±SÑ[¥øjûæãÂð»qûÍÛw[æ…€.�À÷ÊîºÌ!]%í9¾µ¶ë�tGé>×JFO¾8{ÙÔÖt†ÊöüIòë$FÅ&Z@}�(˜×¾º¥áu÷®ËçY|åKÓRÓýÔÔíëlDõéx[w.¨(Ö‰ ÕìpÂz#¹«ñvfu4ìFVŒ^’WzynÍ¡OáÂcòøÛ�ºÐ(þ»\À¥ `âDa›û>†£oJÊÛ�\¬§l‡ý½í+ññ¬¨�Û×x–ôÍÊ«®´HQ»£¬VzÚº#@b @æÏdÍ4´ÁZÚ—Ê1Ç0xƒX|]3!ãÂ�}‘´õ”~•ÎuÌ÷•‡pX§Èœ=Öx„Æp6>vÍõÌ–ºè¬WrssW¡}Ä#f1õÓ0—vfJ+’4"ëØÝ:5˜!Fœ�EÚví�àÉu<åZ0-ú…‰‚lh®¶�àß ú$V}×�7OV¶å¼‰íl–Ú:ò‡s¨AFmK½¸áÔÍ ŽŽŠ�}œ²ô>ã .$›À°X�ë©,'žIÍ�qÌ^üî›ó7²Pà±)zléä‹0e<;ä–kaÃ’!|¹¾3é! yox-5zŒÀÿÍÂt5¨ä_Ìfch†á:‡/H8j‰�&4C\cAøTQ£Ù+ež„`³ø ³R£Ï�¢€ý³�´ŸQÒ…1ˆ�(tOÀÈ÷KËŽ9Š÷~[x\Š#ÙQ‚I°PÑ‚v�xM=³Ô �ÈÚ‡FáU{ ”4M„³ñ/!ðP\‰Ò]°ÜLô�JÓM¶ª3HíCëäãåÉ~ÖæçÁ4H Š¡¤¿÷2eÍ�ž‰�Ë…}{Lê‹Õ¤†\÷œžÉ^¦nÌÄÞü™ ¶u\aæ‹òÏ�ˆˆà’”+ÜðM7WI÷æ_Lj)Žúà'Ô€Ily‡ñø™ ƒZ b yœÞº†L"Ý ~þo=2{?<ìš›æ¾C£ .”óôºê*�m¬è$ýf,ë¦0ðIk)dÔîò}� ˆOíFýç oÆÀÕ+¿lÂäãäÆwaÔd¬{#ʽøÜâ7e¡ˆoHÖJÇ~ÎG(8Õ$ž—â»úAu®W±ÇÉâ…ñÅ÷)ïä ²t Ã1øËËDçßœƒ¥¦¸X=ç#¹£e—U$W:ô³Bµ¦æŸâ\ýæ7â’w²p9z{Hô@–3WŒ‘ðGߣž�iñ�:.íÂb}y-æqC'0ÍÝr‹d¦‰q¼×Güø/Ó_ºïû|®ãéýnÌéÈmZÒ²gWQ—ºýŽ`Ëú¾Ãk�¿ÃÒ˾ våÃW|×�ð•ãÍp >Aé;x=£b@¥ÏÔ��© ‘¨êâÈHhDØDÁdøÞ© ò+¡µÅ\™ÞEñ)ý§mjÆZÒ¬� Öó1RË Câ«X¸nÖ|ˆ ÂO…Ô çrÀ!Ñ¢ÒÒ] C+¥>³màÄyéð0sÕ0£æÔ ×¢‘î}Ë©ÈÈÊ�4G¯7iÔºÀ@»åŽ’øÌ•w9%қˌÙÎJï9ËBšŸlÅæ< äZT5oÁ,�Ìhq¢:ãŒÍµ'¹FW™Ò‡¿Í¸Tm¯ùt‚¼� Y>Þ‘cZÛQÚ^üñŒ0bt ,–�Yì’vAµ®q«íÐroLš7µ“/ xî î�Vš’€QüÄ�’s椌€Ó™ûÔå8/Æo°°Ì@™�Åî±7áÕ¨ æo�ò>–ªû‡t×Í|ÿqõÌgÎ �­ÂÚ~tω¨")õ|¨™™¬ØUæð~R¹øÿ„ÒØ¿PÜóÖî>ˆQ˜_m=ý"?½¿:À×%’î|š÷ôz�ýCȨ×Çoë£;µ=+x4èî¬>Cþnñêoùš�¶a{.†…Üô-RÃÒÅ>°‡C;KSX¥7— #×, ò�,à¥*TWB*i`ªªRñ`¤ q¤×<¬– UÜ�PHI*‹2¼Áÿ)]æ­Õ4òäÜ>𧝇?߯öµ?Ìø‰ïüÌR×)ÄÖ+8r>ÔŽég€ô�F�€ÓéÐÿ‡ÓP½=±½_Sí9>b�ún®ªSÙsÅZßEA¾ã¸¨êâ³ßF¼ìIdœ¶»�C}žYæÇQ†³+¼=?xüÑådðõþkÂ3ýùP0hL²½g^ÒªäÉ»«ª¥3cçlÍ)¨X‘, M9³Ó¿ŠÁìSžÒËÝxJÝ•ˆM×df|<¨¶4T«*‚�öaÉG�°¿ü\Å—+\v!³}Ìáó¿3q­B·®iþ¾Ó)š>ª†2Ïøâå*“½^-831ø¸³?Ž»ûB3Üžûb/^|õ[¬!³Þˆ•”¡�)ꓳ7'c¯/à‹}‰–›I[§®ÅOvÜï¤oå˜vÓÀèÃÎä%``ƒ—¸>;óð`?Š$'ÀóR;àÀjÊšO9ìõD:‘<ãöýÅœ¡Œ%¿?{ú�GQW™†N™½�ƒ®ù|×ÐÕD ‚¨¡P˜~€\ýŽ=0íÄ÷£•‘Ìß)¾H`oÞ/O?Ü‘÷ÛOÂ-?švêüöÁ‹° bllm§¯ÆÂ͇ˆü\D\¦ s¢‡¬á?’æòÌÌã':®{°vêGAª]-^ÄdÆB"¨tÊúdèS…±°£”º×¯`ç;¥éóß8}îûïdY8ÛãÇ=?5SY!WLBÉ]ß1ª�Íóm ³CVÑ»MR*�ÃþÏÈdÄ©¡Ï|�Ç—ï™§MëVðx‹÷änR.E¦+mKÓLÚ7Ad*é:Ò4®Hh?—m¯†ÒUÍÀ¨­±»Ì®.�ÚÊhèò* wuÀ‘vø«ª™ �‚¥€¥Ü'ÎôÞqbH“€Ü¯Y¹�’WildIiÊÃé6B­ 5®»œª ÜûÏ쨑‰ÖôÈX«fãE��'¢›™V—û7\s*Åš’€ ªDK†˜Àžã$(áiõ)ù²á¢ƒ'H<¿6}]Þ;çW9ÝAŒ‚d:ý±Þp�|“ñ'¼<Žq2Bôp¸Ê€‘BF´ðê€à#‚¬Ì}gsþBu•—\7XöÐ`x9©Û`sœ¢I$ŽÓ|›€ÓF.ºÙÙ‹ëRa¹a®mÕóÊ3âÁmR ‹f¹Åó:=óßA¢”Å,Ò® F—]~p ‚e°âV¨R›Õ¢2+„]•ffঽýi´w±¶žÖÆÔs˜²QV@�¦YëОûû{ZÕ~þø­f9�`�iêðóJ;VPçî!He‰n"hàÕ¬Hçd:ÁFîÐ2ì2,8°_¹Œ {Ï�‚³dÛP� ~mQšâÀY Œå'?6¼ÿ ¶‰kD`Ž6$ÞŠ¼.à ä¥·ÜÓ�5רœIkØÁ=ªmRqÔm«£ÙŠ6\Ã;ˆ9-ÍÙ¦ð´9f8/‚Ã‚Ô ‹OØ�/ÛYÚñËÑV;QÃòòËÅŒŒÄ2‘P/ÊݳªãÄt¥±0DèÀø�^:î7;ÐÖ`zÞ ÌY8 ž;ïÑ íªÚzO5Pcv] šYOÍÄè5B •€µ�[¿ÀùÊØõ}¯È5\šˆlF+f�É¿Oàæ 1VrZ©Xñ25Ͷé›L)G,™}ò4–z¶ð†zÚæÒ{%—kPF+ySŠÄøJÈ_h†nfUaS{­Ýž ìÅyào–ˆãB⎤jŒ%M4wØ51´õþW@¡´’Z,xÓÁË>¹¬Ig3>"hÔ1 =8*¶78mà5i—ó«äŒ`°úáâ¸æ�yðRkH4ûÜ=epº­­z´«¦i˜qAõæ€Ü *¡Ûd:©Ú›çˆ #y-‚ X²"뜡ñEË!N` ýÄ& «c®ÇßVãiÒ×°Ey‰?³çxÐ 9Ï}ŸÍëènS�Ìðp´Ÿ<*iö;½ÞGÞe,�; ¼Ÿ¨é£'ñù¥*N¹XæêþcÆ@q™ÈÃk1&4-ÒÝn‚V¦ýØ>ï8$Ño@Ë;Á>D Ì¡¦ŸÅbÈ’OüÊ9—Íil¢v7¤„b)ÕoÞ7¾æZï¥_b Ý ö˜ÝŽÒR�§™JÐËX 6­�†éµpi9”[¡>æ¯-|Ñ@ú7dÃå³§;h\doŒV‹g–¾P/›+™Êçw®Ö×ü:mjI~4Ï…ÏDzÛ‰†`ÇD„`ê/¢¸q¾ïÍm�ËÏÃE<ÄÆÝê Ù�>¹’éÎV<#‡¿ uÆ~®{+«¾¤ìúZ=ôcê@~»SJÊýç¥k¾æ ‘ÏAþb¯Ù‡ðè͘Áˆ/YIâÁðm4M'ÏÍ Â,¼KÌ�o£õ­¢µÆ÷o™°çÄÙ!r„€øÈG‚ïÙ 7§ÍÑ?0…G…O–¨›‹¿Z;�ÚHäoL; K€”rNñë`ËZnšmÉ<§{FŽ×LÚ§M TÐ{˜’VÅMÙQšTáÁ0˜˜ ¨XQœáæÀA§î}éeú—½�wò68®‘¾x¼ÆM­ _RxþN¸Î,`‹& Bn /|à!CºñÏÇ/âüBf±¶[‰ÜÍ� šÔü z#œDRõÔª—Ž€UíšÜí9–<™�J¼¸QƦèì¸uï[¯-ÒV=@IËcŠiÛÆYËdû#]žcT|/Û¶À•ÕÐÝ­@”Ĉý·J˜]"È€²¾ÀÜà둜s QI s6I ÇûÎÂK>8‚›ŽÇìôÒ=ž±Ì hÌÌ:†7’æ°ÐFX9l�xF­QáÝLñ>œ-:Ò½‹!´,¼�É Ètî÷Ã�Ä¥û0ÒÔ2…B¥›RÁÀŸ€™,Q¨P˜�¢\0�rKØ“]·i¼ÁG8��vo´�G°hiÄÃÀŒCü´�%0Â=_!P!‰èô0–˜d²í¾/±(µ1‡¼JÜr.ýAÈgQJCû$@‰^´¹ŸB{$ÄWªHè;È­û˜Øªòô�«¼Idy Z�ÊÚÀã=JPlÂm›™ ¤–!e:=,á|[Ž7«âÕ`wkñ�Ûuˆá©.$8“ï&Ö:�R‡?œÐƒéØe—|îÞjIF™ã ,G¦¿�™TõR‰VúÚ/òûúè‰èÒ’þЃmyÊŽ-ö—Ñ2^ ïº^°<@ø Õ¦¡Àò=}†�xù¦6 €Y3ÀÀ",�†< ËksQ™BòØ m&ß”uõó¦rêõÃ(žxí �IʽBŠNWWŠÐÜŸ¾u剧øj‡:á ±d3a.dJyÔžx :|t9En †ÞÚ˜ðR¼ÆCàGZ×. .ãd+­áÛú _âwPeŽ ŸTðJE‡Ýޏ>!RÆßÌìy|îÏâèÀ4¾~ê§W›ç’¼YïY{xžûñáá*S¬¢Ø ¶Úl›iÝRâ­‘7¯ÜIô�…’g“ žn¡½Yж#ÅÆÙe2™®Ô¦ðk’µblI¶Õ&ÔÚñNõßJ¸Ã•YŇ:Š• rü ¾1µ¥Œ+˜ ]Ö󕽆ùâ}}¼LŸÊ Ìº×éÂðê×O…�ýÝP†ª QœÍó·Þ�ú5„÷€ñ��–ÆÞ ÆEÇL” óôèøoŠ­™˜Ý«žH2Ç? ‚uÏÆ2)©E«`¸Ôh~ r8Hl,2‡#ȸ Ÿ¦ìhboÐi¹£lûâÛ�ÔznÆ6¾çBxWï;ëêfQ}dÐ…ò¢¦r™„ U³¨Œ@Xðd,(“LË�N:�ž„|C¢Q2J\Ÿ<•Ò�½ûsÏOȜϛ[¥€bFv<¦¨ pæ  C~Î<.÷½ül#„RU€5ç0¾ó£Y Yµä0bñÍt -�;�d 'ȆƒˆF՘Ζ§dœªs­jl�ŒŒtŒÅŒÒˆ‘N15sW2B“øœœ|¬9ì.E‹Ëffa ¦:Nã–sqÈ’в8Àð@)t0Â|ó)¹àGlI’ŒEÌT Ǭƒ8C5‰!üY(ÿæ¿Ùáh^:'Ä-‘!…ÑB£Ê¢]øC†”šÓk+‘0r[uîlîÕiŠ@0¬òl �ÕÜÙ!„mØ×ÆÂl:íggOÒRi# 4x½Q §¥¯Ô!™l•D—½êŒÑ Ñ__MÛÒÃÖËÕ[—- `2 Û1Ìåa1™WhMhÉÅ÷Ø…²úâì}ak:>¡-Ð’  ŒŸ­‰¸ÎóŠ`¹×BðsŸß³:#9û­Jú·¢+­8w1eÿ*mzx2l¶jiù1´[ÃÑ}†ð8‰\å÷`�âXpº$f‚) ‰;ä€BÞ&žE�§ ´ÁñŠå}ý›–Ì”5 œnpv®w›í_´bvL”I¤µ/g §f‘�Tˆ˜çd($”«Øtbª=7WF©ä“ª;Œ£ÊxðX‹&ÿ±P³˜Éô嬛õEŠN7sD«úù³“YOùÇ‹”W�=ëreÌÞEóº%�šë¤-¡GK>¡6’_—oª÷ãÊ=Ïp‚Bô�lêÍúeV¢$äç¾ñb‰‰Z0w€}Œøª!·éOv¿L7þÿz™¹íê}R½vü¯KÉù´×´• @äͦô‚óbOã ÚRúO«þ”ûoü>�žç9=nÏÌøwþÛéû>>xušt··×{ê�OçqðJ©Ÿe­Ööð| ì(b!¿j#'üÖØptýo‚ûz)óâ6Ñ Êû@™;8~¿o—øts>z4ñøö+õäc$^ÂÝñg Œ;�wU zcEÏ{ ™Ó+Я5á[!q…Íj}Åë§jþ0XãÜßó?ÏHÓv/äûœtPÛÇ ŽÂ2=ºÕO[Æz€ì<;}>EÐ`ãåv„…ßÝÇËÀkØ•iiu9‡:ˆï“[Z×7º¾„Dˆ�@}˜¤ä’–�­Ã†�îA#“‘Ãí›™ƒ;NrpJŽ»QýÒ80ˆ 'ïËë¬R�ª7Muœ@¬µ,’�,s%ΜñgXL3� �»cnx]H±c `B;U=€xs®)~aãm©»[õx€�!úIÀ°ÓK'>Y·»1á]÷©á<®Ø�ïçäyüõú¼ËæûÎk¼Ð~¦Ä²=SBñó²¡ãõóó]kÇé¹ü|œÄ¾3>ºqíü‘xœO­)â$=}Œ®Nûƒùøõúgé@»Çãì�ïáKËxG—ùDs!¾t_ÿ>0&;ŸÛ8<8}üýY“O Ø×¨i=oê€ì¸8û®–#÷¯¿§>…ª[ëÃ"æYýÚþéŠ =éп¯RÏóÇx-Ýwg‚›-h~$˵¥âm›* ÂÁ•HýbÁJÁ$)�ýàÃ�ÃÞ|R;8_Á³³�éêü�­8”§/ÿ¢wKY+IckÏþÜû+Ò—¼î…èæ <òüÒ{0®ÉÂæöòUhó'î–Aï~´zyƒz4Qãy—Ó*Y†Î|òÝ)ˆˆêN‰—T]ÿºy–ê&+¬ÔZ~Ÿæ•£©ÙεÖƒƒ9V×ÇL5+9v½‰ö’<�½Ç�ö|ÖR3ļƔԛ I¤Vש;xêPr;pPf»\"’ŸJ6‡¼¸ONJáj ÍW’l(e J¢qR×›•¡½ æDl,–^˜É@k‚ux5GTÜDÏ-%H<·§ï™@×ÅÌÞâuã°¿kÅC?AiN;žð¹åfµ:�ÍE–o¿6Šþì]±ÂlÑê;õ{䡸´’uo½êÇ”­ ¿yši"çr›*Žu|^ "ëÎÛ4ØécÍ÷bµ2ÌB®‹&êå¥/Ûœ‰ZS“ðî¨ô%¥6ôf¥Â…x<§5·�O"ž6«“6.ZC:O’ˆ§Q×2ò(fBÏ“6 Ì;'° 3çn¤ŠKÌ­T©¤FH��]0Ü®�¾ohŽ”E£Dq¹Rò Í♸»¹¾$×Ì9kEOVšR<¢ •5‰E¹BvD Éò…î�"îû–gGæ®BÕJŒöœŠ�(ž®ŠÐºx~ò»ó Ý ¹Q$–I$#7þüt«‰ÈŽGÀhZ=÷Q*ÁMR5D^›v<‰*§¹——M¼VÜ€�—ù¯Ï“[Y�|(†³Òöªê&\G±š¬.ž'~þˆ¹ð÷ø«œ\ŒÍj³ûü”TžBmíŽKc]û«+ÐA¦³A°ÎÛ(*¸ÚmtŸÃ6iÝøa¹ìB”Ò¿{1�[�»zÎýÏ[q¨qÇ%¬ŠéÐ,�NuåÂ.€h]ádLk˜â¥jOQÎí8u®Êb!ÚŒÀ!ØÁ0™¦Û@Úv×lwl6³ô-àÆ“m¸°¦¸gû,9éyìªÎ}ÞZ�“õPÊÎ Ë;´bx¤Lv¸�"¨�´ð¹0™'Ë U‹à×:ò9m‚ÂfN®¥†}ÂÃ}i×€^%™FxÖvå6É· c+]§³œóçV@!ˆ~ 0¿&‚AUãr„#Ä84;�¶)‚NhÊ©šÂ£�R `[¾× Á°…Ò@‰8 ë—n×' öQ n^x?µêáfѯaÎqO<» WN�Öû‹T@5óQ:@gˆ8ØÒªç)⃢…Ý;2]'†–­å€ë�€q`U®÷=�:Þ¿AM_ðü”¶c "[F¨<#Lµ~E` ó@Bµí�0] �ï/a'ÌÊz� µ{¯påq¼ º´d�4HŠQ¦7hF…-ÄkÜyw2 ,õ¬"ƒ>M2þ«H?rRqCe9UŽàqÄ]7••AB0ô öF†Ž\žIÂQn–Ú\œÁìú1Å4�X‡Eû ²&¸'L€ÆÞO¬_r3°m‹R'ÒÅÂPw áe¤Y©‡V¹†L^Cô2™˜xîNê7�älGm³jœ ±>™&Ýã K¨ÀBÊúèJZÑÙ›~ ÚáŒÅÙc+|­¨üzQœâ­Bh~ñÅ4ùç3©¡ÚL8ÿ?É‚g½—XZK®ä$ÇËX©´1¢ “• ]-Ÿ¡÷&ç¹îßš¢¥Õ*]Š~ïp>Æ¿€ï­d<þö0; �O…ŒÎ2ðÄ*T:@FœdÉâÄgK0àR¯uãQËEâÖ+w¤ëÍo—Z�®JcîJuˆ‚å6Â|â.æ²Aô¼ ýƒ(3£Ç»I??ž»ó ´ÏÚx96±ÏÙÇ™Žb×í®½ Õ�¢–…ÀF‹*GL+‹Eî´±65�ûG…S~œ¨ïnß(Ö7Õ‘¬rÃfü=tIGEÛ;[!PÓˆR£žè>ÇIf�q‡þAL_±çÇà˳˫St³Ž¥Ot¼ç‡•2É|UÎí¼¨¦s‡"ì;&Dö¿ZëR?”ÿQ·Qxš 6 ¼ j3øÅ{u},ÙÄ˪›­xƒÀ�r PÎïw2ºŒˆ 5€&."õª]Åo!ùqbQ…œ¦g”@õ¨:´…m}Ñè‚+ ÿb8Œë�»KA”Ρ„rE˜9¬Èù¾ˆ’˜å§€±pãf1�¤^LhÂÏ…ÇE ¹õ0�FÓáúo6ŽA´1¶ÐÛlbÛ;yï¶�¯x‚†—ê5мEÙGã›×Ž”šŒ90êêÑ*Ñv,µ"�p Ó€%aÓ ±Üú7îN–/¥3‘{Ýêòð �=× n‚S˜ô®^;d8`ÝÑ×,±ŸlìdEÈá3 b ¨9oˆÒ[H­ò'ñúÇî)FSጠþ7¨…e§¾àv÷Êû:?}¿)ÝóþZi¶Çh0î})õø—¬W×äÆ3ÈØ†¡îñéÄíðÁ†²}OáK—µ'ëãáiìÃü¸/9?£ý7k–ßìè+ý¾ÿ’zzY Þ�âªÈ‚'áû‰ŸòðɰÂ¥A²ÒÓ�!þ²¤Uˆ(ô/CA>›úX&œlVž‹\Ö…æ´ð© Úæ])úDÚ,‚™nEõb¿ÏMŽç…XMDUÿùŠ É2šÊ†±«€ òðþ‚³ÿ�ÿÿÿ‡ 4óÀ a„$¸ À@h€ú¥°5IA}µflè æÀ; À�ˆP+­�Ðè*0îÝ«§DwvûžÀ(QC­n@@t@S£ÚÔ «VÕ'¶ˆ iBƒm®–Ë×AÞëªööðj”}5GX`×֥ضkÀÖŒ&šº8º¾ÍÛKa·6ËG\¾ƒàt€<ñò«Ýï½ôשÑcEAuœ†•_CéÐ$€´Á‚•SÓÝ¥…êC^y¦)I!iƒUªlk]`÷žîµvž¥5¶Ú4PÕµ¨( ihV”šg­*®M*©×#­Tó¦Þ¬—»Ð]S¹è÷ŸZì *‹E÷pé£F=¾vžÃN�H»y·oÝ›llÊwn* õ…Ó X` vÝØRi¶Ð� Z°¯èîƒÐ�ãíºÛîue�£°¦ê›¶KäÓf…ëÓi…TE9�GÐAJ”‚¨R*§úß=L€ÈXºÐîÍ: èѳH 4*³ì÷ß)õOK¾ó¯Q¾ûŠòö©¨Õ{ºuVö×m¬Õ·®ð&óë_lñ-õ•Ö^à×3HhÛz¦q¶Õ+[a"Š]Õï<ÍfPª$ØUfb’^´uí»;€x\G•ZÛX¦lµ&Øz ö4G–¥m4&µ)­x_yO+”B½b—g¸Ç½Ý»µõàz£{A[bˆRˆ€ ­}zîõ›YÉ(¶kk*´÷  ¹4M†ACKfª×¤Ùç¢-ä÷ßwa³hh+c(ší‡D±IVÞŒ¹¬ ±«ät–‰÷€Ð�y>ØžÚÙ3ZjõÜå @‚š¤HÔ ’ˆªmSFÍFHa©â„"e2{R@ÂOT•MC$jG¢hÐ ÂD�‚dÐES@ D@ Š#HÔôÒj@ºÿÇôý}~ícþÎ*þ � WÞc¡I{…aŽe$¾-V „¾ ‰h,‚Ô^§œ‘™h“2‘$H@ÑSû�šÍ&åW\×&T´–$eMÑ‚l‰„ÄÊšLŒÀ£ 5› Íkš®S¤îËfTØÒ´3-˦6Ò¤HhÌë®uÜÄÉa¥Dl››´×M®”JTÍ9W%$�v-u:î͹X·Zd’Ó.mÌ64hÑ“Rk#ÈŠR!#Zm(Ùš™¢eÝšÑ�Û]wV#Ad±&ÃmÊ‹k´¹u e!K®æ±²¥¤¥±e1 l'8®»«´Ø Òf�Ë“±ÉdÒ0«»£d,M‰2ˆ › A‰ Œl(&b‰1)¬‰š$ ²\êA�Úåis©JÐ�•%CI›.—+�“FˆH±¹¹P°»«»µÚéÛ4I,ÄÕ%”QlSŽäm(ˆÙ•–l»¹5Ë¡¢�Òe•3L¦æäÈQb²a »·T¥I6�×b‰– �54¹Í”FbP–"šjF‚@4²™Mrí2ë»4¢“»›,.†í¹®»ºe,SAR»»uÝM’î·RRDšÆ–ÓDF£�ÄŠeM®»pX×uÓJ]Û¢îè¶Ve2î㻊@dM‘Ý\HL3E6lRE£(CAusML¥I‹r+¦M‰€DÅ4Ú„³]+ƒi”…40åÌÄ#C•Õ2 D¢G.®Zä]݂Ɋ#Sss1Ýq©bhT£wtl�£DŠ+$“"HM‹Öå¹ AšCJdšI-É04fDÊI¦¤Ñ&c3*š†»«°RDš™2-,Ù4TdÁ¥Ö$ÁŒ$›5(Önn˜2ØÄ)F ®»mÚP³E+$&™I™k �EŠdÊ2�4fºíÚS&0PJd™!®]s´Í$e³(’$�Õ›s’r-ÝÒ9ÅݸbJKŽêᱤ‘ @ÑQRP”iL‚F4š`„ ˜L(Ó7w™‘9t¨„Áb9·Zm+6�KR eDÊç#DîÜŽmuš,"Œ“ݺfˆ–4‘ Œ•™™ŠD‘r#!¤¨h…)c¤)0‘!4‚$b¤‰23R$RDc„“‰"l™HȔ¦PÌh ÂV2&ŒdI#3 dLD¦2‘))$ËDŠBd˜¢`—w10ÌĈÍ"e‰‰„ÂPF*3wrˆ’›f¬‚€ÔV�lÆ ŠæÀQrÍS%3LJn]DÙ\ÖäÃrè„ÐÙs˜b ¤LLeQ‚9®î®dÛW+£6ºUÛu¸ÒX†h’[»¥Ë±$–RÅÝs(ˆ$HY£QŒI´˜ÌF¹Òh·.Ê4mW9‰w]ÒÆ2J•w[‚K]ÕÔÍ4ÊAFšLÓ&ØÉEd¤3d(ͦ̀ÉFŹtDL‚@"Q*æ´êus ©]×d­ÍËFçfR h™Çn¹¹EˆQD˜ÒCc 0�F»®L.¹¤®sì1($QŠ32çK»„Ð3EE�ÙFjdË1„h„!�@ÆI” Æ©¥$eš ²˜¢Rif4l”…*e¹—nÛtÎíR·u»lDÌi2“¸&ÅB"frí†g;6Œ’Òh“LµÉ›�î»nípÐÍÈÕÍšM†)¶”R‹i©“JMÝtÔ™-4º]‘5¦ŠåÛ»šiMŒ¤².œf’‚�J ÍRYbHÈÝKt(Í –3�&îé] UÍ Õ ´DÊ–j “–¹Ј†DÅË©²!‘ÍÖÝw5Ýu$Ó&3+–vá‘�̘ÐDZЈ%’IjLf•ݩӵºda´ÄÔ]ÝIS J[#L›Le@̕ͷSIµ ‰´bÄA¤µ"î®Qgv»" ¨´i0’ˆRn—’*Yc�( )b¡HÐÂ…ML!!ˆIA»®H¦&’‚–6¦›(›f4 ¶3»•)2lKDÜä(Æç4™4Q‰Hšdº»K§i�¦*fšUÊÜ#D×:ÃÔYŽn®]›cF»·dI¦Òf•.îP»®W5̓ç,$Œ’®aweJ1`Ê)ºæK$–AK…™Ý[™fÍ”iM£5HÂ�ÊdhÁI@� R`%£Ë ˜Ä¦Ä¢3%4™¥f•ÝÐdH]×0�3HÊ�%0Š5wZæY24PI\·#3dӕѦÒšîÜiJa²cT4¹¹…4Ê2"Zu®Å1364Y]ÛWjC*l£4l+ºè6‰RJ,­µ´  #Y•¨‘$¶ÒÈڌҩM£kcÛ6l¦£fU’²›UÚ6e¨ÕcU&Á­LÕ±¬b*(­”Úf¢¶l´›2Ñ£I«&¶¡53%ŒTšKck!¶¦¦Ôj6ÒX«*m°ZÅ‹d¦5,5&™¬BkF!ˆ�ƒhÑj-¦i•L-ɪ�Z5Ih¢Û)¤Ú-¤ªJ£m�FÙ›IVRɈ(‚4bÅTV“mY*RÖM¶6±k)­ ¢ÄÍ�€Ñ«ADV!�eª1b4m™ˆØÂhÒcEª”Ê"mI¦jl²Q¤1&5ŒÉ¦"H‰˜(‰”F20 #0ÈD†BLh€1cQŠC4�cˆ� ¤›fÖ’Ú›525¦LŒÌ…m¡,™¡I™­b¶ mŠ´llm ¨Æ TÙ”B‘�¥°–Ä!chD™–Ói4�&)´BT”F¦I¤Ù›3RZf–³d¬&«%3H µFI-fXÚÉh-RkEŠ ©Mª5Iª6²UŒ¥²Ù©”M˜L! m¢«4«Qe*(Ŭ‰µŠÍ6°Fµ¢³(¶"вmˆÔXÔ›-bÛ&³6¥Ke ²•°d6ÔÊÆ6e¢£TͲ›RmcfmY•�cT[QJ›F³* Š+R•‚‰"%–¦kM•X-ØŠDÖÿw S]¯w¦¡Qnî÷]±)ÑÇg«³vé^åÝ^Õê¸eºá½N¶öom4ëÛÖ¼ô=®Þµêó]·UuÉJJò®Î[Eï]¯zݹ]º˜i�<ÛÛÜnÒfÙ¯j÷­Å<öÒˆ±p¡Òë†×²½Î«½s¹§]ïVò㮩Ǭ÷²ÑhÝ õÕÚòº^CÞy={¥¹›¯ y¥íØæõë×”®mÍz¥^½×5λ�<­é&½ÞõæºFÌ©J²šóʽ—®®EÛ.·¯]ow½¼•ê뮥۩z^ÒY;rS»Ê½ºîon’ë]»ªwuî;,]=²ƒnWLuÝ»®¯7]Úd]ÝÒ®w»uë�ؽvíou×wg‘é²õ×ww{Ý1{�»Ý¹ckÓÞݺW;(·ˆT—K·º-x•uݸ�íî÷'»SÛÞé�ië{v¯@ñ{ÝïS{ÞÞÛÞ½î½×t¼õÈÛÒ›Þõyråìf;z;×—e{½g%—³zb]±©=›oóÝu»µ.Ûd™l€ØoŒ²“a�HD$Çzó^šõÔœ÷k«©nÙ·R<ç5Î{ÝwwŒ�;º+„ºëzì÷·M¯CÖ·v×d®³V“9�ÓºÍ'qœîšžpî÷]ͽ¶•ç�uÎ9ÖS”s@�jõï0@I“ID^¸ÍÙ]%…{œT´Ž •M,]ݺqê½W{¸s®79Üww!ÝÝÜwuÒw&;»»¥Îîºî㻇8»º;¸Š+»Œwwwww]Üt—–ì�¦&¼få�]dwLkÊáÇÝÌ�4í¯K½½{ÅÝÝÇGsšiUî«½î¼æèî’¹¯k×jé·²ÙEÕuzòìÆWwtuÔ¦ö§=zñêÊ•zî×zïašžÏOLØ•ëµÓmÚïz0! ºösFáÝ{Åä]×råÜ»ï/çW;’TÕÓ»Žîõy\ÑヷyÒFòouåë�æöjê÷X¼ôô¼Ý.–¼å×K—{{5Ë¥½Úë^Ïvízº{-Ù^ô®·+ÊÞ÷!è¥æ¼Ì*rô$fæ®[´ÖñÛ\t±ËÎníÉ.®ÕéY×j¼uؤº$‡žë­{ÛݽKÍÚŒ÷›—ˆÅä½¹•èÞö{S¹�tººKºŒ]s«Í[¤»·ºêê{/<Ð^˜4›UÚî›C{ÖïyÎïGn·<¯zÞ¤¹Ôd6KÒ®»"ë�çDÞ•y sn¦ÞõÚ¼în¦]Î{¹w®B¹\’O5Îrç£Ùºì4³oKn½v×©ì›®ŽŒ»»w½ëÌw޼÷»Þ÷¯w®Ý{Þí×®½f÷º¡4i5ë+ÍãÖ÷«Ñ׮㓻wM×\­ç ´b¥½n¯^íÌ›§¼ít¯¹vå\\êçMÔÚåMÝ­ÚöîË•ÞìÛ»Þï<ŠÞ^wvzítÞ;מíì‚Îgsszw:á“WKw{ÓwmÒó´Þw·WTïuyÍ“ v”£—mtô˜…{^êí{ �Ï7«×»Ø5yI½Û¯mî×+ʵV¯H±A‚‚…‚1€P…@`ª�…@`"(Ø‚*€@DT‚‚„JQKЍÀDT°ˆîª¥Uªºk‘¦“lË3TlS1TXÕ3"iÕfÐÃ4ÑSBÀSKK%dTÒTØÌ´RRlĈ­”c3IlR–ZŒkL’*fSm3cH³mÊ&ÅM*L3`0„Hib¤dؘڔÔ`¦¥2­3[6$"Z¡"F6šjTÌÒ•µfÊ•+Jm–J�Mb¥¤¨¤Â-%A4Ú&š´š¢´Y$MT¥“e5b¦Ò-¡¤’¦†iLZ¦¦2²AЬÊhCL‰M0)³R$˜Í¥%¦Í±K*PÔYC%M**)…YhÆ–ÍÖ*ñj«fÕµ[¾(d i(´2™¤2–fY©T-¦ÈÓK-)¢`**DCIRF�¢‚QQ3K&”ÚF�Šf–EHš+2³"¨e�Ú$,TÌÔÙ5 eD›"´Â„”J™$ abŒ²ÉDX$ÆLÓE&J`¥K4SD™h‘fP†kA”…€@¨ZYE BÙ*Ä[±¢Êci)%¤i°&ÄbÊl‰"‘±RdÒiDÚÅ�ÐM d †¨ÂF¤QJ(™«D&À04DƒCTÛÍFƒBDe#c32HÀ� 0D@H‰€`�1 �6aµ*jeRËdf,Æ(% ­@A•1RÙ³e¢lEM &Ñ�ifh1†ˆªL™šlŒ”’Œ(H&a RLšL¥�$¥2 c-� ™–f±Lš™5™$J�£DÃM³Ìl¦´XFØ�bm¤“$¤P“fÌB”ÒCk$Ãlhɲ›!LŒRE™$–,Ê�“ cQL–m¦2AfMM5±˜4ѳfm™”¤ÐJQlÌ)BX¥I,if¦1c‹MšFQH™TÍD•#I,Ê@)·Û[kV­ÿM¨'ðD* �hDUŠŠ(,JD‚ª0P€*ªæêˆ$D0 ‡ü æª�1TNˆ†‘]¬µ­µÛm­¯ð¯ý暔ٴ�²©B$li‰FTŠ F̰hT„fl35-i,ÒM¥$ @$Žh(ºª š‚Š¥!ª.ª¨æ*‰ ˆ©QO·Î211ˆÈIh2`PC ‘„�C 0$H’™2#2Eˆ‰ ‘#”L!®­­¿íù¿G÷÷Þø–PîH$þJ;6‚QkúËÒø³M16:^‘ËŒ‰ÿëýmÿÛ´sÅbå”�’axf.(\Ihy�Ë!úê1�PH›6ÔG¬Ï Ìß‹H¥ÔÊ’c£RàA©[pêD¥åȃ^.‚Ã^dåt\|�Κ¦P0hB)™��•wRÄÂ$e¦íñ«ŠˆPäAòÅ Ø#�dæ2ª&Q5h"W>DnÉê=V>¿àÙAÕæp·*pzÛL<¯‹f/PØuoYamgP‰5%Aƒþu™ žfדÍe|?_—Óº–¾% ƒÆá·´Úqåš{ê¨Á©‡2!„F2¾«*üs'Sé ,ˆ#e(CHˆ¶»”s仑d”xÚ‡¨† “ •‘úÕdžŽsœ+>0¥@ð©¦u0‹¥,²2dÈoNÙÇ�ovˆy¼ê‹‰�4Y…œÚ²ØŒÖû××1éè=ML é¾2•Wù‘›KƒÔ6RZãB9©rÜMÛŠyÓ‰�×q°µqfzŒ©˜êœGHL,3qÔ]Eỗ;Kcµ8lÄ êî{¸ùÓ£Hàˆt1¿'¨0(¾v6n¯Te„{]\:n$$¤ó£WN3­Ùý`ZŠê“‹"- O»x`–Ð]™d›.8hö„š$ ¦QRž²¤…-¯}ÆFjÝJþ'¥;øý—Ú”žG ø‚ìÔÛüÁè†0üKOÝŽ0­¤kÜÿÇk£—ñ†Ç¯#žx¤‰ÆüµNÀG:H†�JÓ:†´ ”zñœÆÂLR‡m=xëÔ¿ÊcRŒq"lÙ¢'ñSéãùêzýz¾ñÞô ”C%Dú¥$a¦ ÙG�}wh@˜FNb?{,a¢w¶�Lþ5ª¾<Ρ“-dcÃL éæ’ßöµfœ„øá¤ëóÕ³‰_$ú°Ä•~˜¯ÝߣîùQȪJ¥)ÒÎn¬ãÔEsÙ¶ª‰|ΰÉôó´‰K>ÿúM^Ê4Ö³u–.×­xua¹T˜T�;P�4Ó\`ûï09�“¬ AäÕcgª‡hIW§§Ke_UÚš]w‰ÀžWä {ª1shoä8¤;×ÝÕÇ!òiúÿ]½FÐ^Óƒd°j�ccå Љ¸‰¹üQìu1úTGŒ‚zQ¬zÿ+ðÏæáM±¾*–2¥Šz:BEPÊ–Õ ÖæD5Gš@ÛŒ¤àV"VQvÃXã3&gZC|A®°‡�!@r¿Q¦½X\õõV"t.íê8×Èç…ǬW3ôð�æ½\žOo‡é‚. ÆW�Ũ+bE+ÒÔìDTS==C&hó3GîW�Ùªí±Ôvæ}(¥étÓ{æß^Û«4ŸŸdLÊwžyU|ˆ|Uçmö¤CZ ~:”|íö¼ì¥¤.-?V¶•˜¿� vgíï`z�ûøonBvâ9ã–:j@.{˜7n#^¨ÙÇY9‰têÌŸQOÚùP>C¼û’3ÛõéOFŸ¦0Ìùtû^+L¾u™G¬0·1¤Á³ =.\2ϰdÌÔ¢Ñh*w³!±^S˜Ð_wX� Ÿ’¹ ªj1áÁΰ‘cBgýƫȆŻbaâ7*ÿUY!÷¬ ž&Ö™ýSŒA5Öp*µùtgŠ¡ÜÅ ©H³ØWqK*œAûÞÔ/ÈuÞÙœ¶ÕlÜÎuZQŒS´µ£ëœìçû-hIŒ:šãõê !ðñwŠ`ñMÿÆÿº3Ìz¬;ù÷ûŒÍÑÙ)¼÷b‡ 16H«å×þ—x§ýíĘ;¥,Ù�D~è¯Ùt…óéÈý“9 ¨Uj¢•«#ÿ¾s¦gº@ØÔhf(èÄåq^8‡}AÏ$,ì/i cׯ5*«ßwòêÔ}çûuUëÃXÞ9atj¦þv/ÖIx€œ{ÒÿÌÎo«_øëàÿ£cç›®×;¾P1x÷7GiB3:F¾!<êÜoA9A$aµ8Ym½¯7¥é´�ý:æÝQ](7az«›}\êï=8Ó8ÌR_!Séׯ?·_Mu„×£þ?©Ø ºÿMÒªl‚Vþ 8“ÐÍšF_L3”ŸJÛ¾½ èÓ¢X,ëZqô{;9ȇ¨G2d›Q~>z/1†h„—­¨3!³��uRâù³s苹œºµñ´æ2¢£‘Xœáˉ6\Ù‹S}C‚n=õÕ3êÇú“˜ŽchÔ™+HëCÉ!»š�Røþ_øµL(Ý’|k—~à�Ø´Æ&"ljÌ`ñÊ“ŒHÒORœ-I¢'h·ˆO¬¹bàÉÐ]…ã ž§éfVž¿Žæ+~8?ÑD@$ü÷ ${ûüTý_Ýxz�ÃýöÝIúBÁꬣf\ûoŒLñØ&/ÀÅ•Ôà<(5FhC�N!´#¹²�Nš¼šì£Ç�ÌT Ù²/òÛ²ªÔpÇ“0:"IJ\aCn¢vƒ‚z|žàâýI±~xäü@QÂ>”ø#ô‡—H·ý!ÓÊ¢ýÛ-Úø Ôoìsô½JѬLz3tÅ<�zñò Þ¹¢eªa’�6P'#ó)ˆ 碃7]ÓEÊôx04�ÎÐ.8PüžŒr•L~n„‘¤�µ(QåU3u ƒò&¯o<™ÎµºGp’ª±I[a LÎvÛª tšTeI®½ެs8üÕÞyNôVžž·ƒúeóׂ6‚Œ%òýˆ7â'œÊ�8œKçU,é/üÞ×ßfÐ}zeØ6gæ$çÛΞS#?•B�ÊAÜtååS(* ×™µ¿¥›ÅPsùÍ!¦½?³D…,Ãp}(÷Sïû_ÅïKf,OíÄM~ºf°*Qú0ÇröuK@×5Q` íµx˜¦�©¨ †˜M.Ü‘PáQ”¨4S’"$E2z¨aY=äÉ“YgÕ�ÔS)e!ÂÀ±%é£áÉŒ±éˉtuzÕ’*¡2Uñ‰ñ±ïÚê¨7±;zX31(@•æäTú¸ðî/yócuú)¥d®Bt|´.%´¸Ý°Â„Ï!®FdNSµÝ‹‡ò,Á°Ð¸ÒÁÅÔ˜~w–$]¿¹SFP…mŽ£…ûJ!ÍËYÜ„à�(L³BTÍeäʲkäˆTë©Á›ydÚ"jDM„Z%�ðc;]w‚qOY÷¸‘M—ÄYЙñfEÚP¤´ÈñM+…SünùÜ·ØóDÕßæ¾88°ñ¾¶.èB�¸l6¤ôe¬…s,I„£Ä%étÎâ" 0Õ§!}ÃzçÐÕ_½b7â²&Ö²20ùæ¾¢"÷Gž†š×ªsSI¦™»Z’vÓÈ|åv£S„�¨&”û¶`‡ZÌ�*>×Ýsä ÁŽ-ày nù·ùð·ÕÀÝwZdÿ?Ù.~ö[õ±“z@fß.Õ¦ë¼÷û·öwš|nBF�ŸÅm1ªq$üâólŸmÎÙ÷|dö}Ê&» ÷I¼qîñêTAeÕ°LÂ~—Å\(†:O%‡µóµ1ø<én2FÎiž[<ï´›ÎT¡×Ê8]ª+Ç‹Ú910±TG6'ÁÐ�í¦¨Â¨1_ú_öóþÎ @1f\>*£MšRkŽis†6ã‘4Ù¤:WfŠJœa§p´õa~�š¾ºÔ¯öPêÓˆ¸¶ˆš?…LZ¨DD7üCã×–-ñuûʱW“ ~ÈÙ‰­¯É‡iÝ£ùL‰$�B„V.be….bTƒ.¶(¢H?—.*³‘Pª )#=û¸‹¸ßQ¢/-1„ªh*0àÆê°]�ÆO}оŸ¨ÏX�‘n“ühå;Cú�þû,~ZÖóüx³ÌÁ™�nTIæÐv•Ì›¿œ 52m$ßšEÓ©¹š'¨Œ8hYâú‡ŸgíK•´¢WÓïâ÷Hü6ôóÑ�Λ°I‚ ’>–fW¯×†_}cä}Y€Ìþ p x¤�*"ë}*•/¸Þ±ØñºÆKñ}…Òæ&�ž�˜A‘¾�Ñõ*{ó®ë¶…úž³ªym)£Z›1 ÏIÝÇ'U(o¥Ww$kNù 8å¼QÏ�¶2c¹ÊUë‹g4’È5šÓ#ÜbHÕf^MªMW>‹YÆr7ì®J :d¦ž6A¢½žæ.å˜Òç$8QÑŠ<¶"íË4Xý$Lƒ<¨‚¡µèÌ̸*NJRR4œª®WíÌuUJ_ç_µW#í¸Y‹Yt;Óß?I„dô"‰õä %á�ˆ]²¤¬íæGÇö\¡Ñ>LÍdáå}þI-¢È3a>ÿˆˆëĄ̈Š`Ø‚ÌT¨�Óg¥eŸ‡ˆ‚�y£·a+‹�J÷•\ j˜›‘>¿„EÜAB ü¤?Qžlá�"¸Ì*1ëëšGÏl~‚r¤•÷“F'‘R!ºêó68ɪ~t¯«bé¼qëqî œPYaBŤ]ç!Q¹*|qì)ëQ¾��ó²&¬v`ƒB›ke/ѧ‡ÖcÄZ5 Ú¿ú9òiEºZÒz̳&Àͽ¶V÷i@ëåÆœQý„ b#§(ïÒfÏ‘lO¸oJï¥áì4¬ªÍGpƒäB£ç5ãŒ`ôé¿UBù&¡Ìº¸iH:�|âøî�t ˜Ä*dÈ# 9Ϭ=x þõ/™ë´dqü‰ˆ?~!áx%*”;” Ó_+õ$|âå Gj….꫘`‘ ó�Ƹ£&ÑÅÞýWâ9i½5ÝuZi›>Ü2ŽÖ~ºwÙµ/—v¢ ssÉÂ÷Æ GOµ*2ìzó¨EE2îìé„Nø"mvÞG<<b%Dä(”ÿ¢;” ƒú\VáÚ�1±TpÂYÖôâuR_ÏiJ_ŒeŸc ¶K|ÛYÊr!Õ¤I”>+ 2»#ÚnR'%|3mÓñgÄŒ{×çÕèŽ�%Ÿ3_º÷9˜“›k¡6f Ì+Ún*ŸçÙ€ Xëâ‰Zi¨Mw ?ÂìÝ|v¬,{VÒ€ZC¯Òü¤MuÜ à0UÌ èÏß”ãðèÍ ¢9ŠÉ%þ Á4¯ ç»F;Í#z†W·�fà =Ò( ©LtbÁ¨†~m×Z³ m45‰„PCy À$ºZ”,S²ì Iî&âUÌõ.aŽ%¼¹v­ /õ€Çý�Oö”†õ†™!n%cî¦ïšÔ'«¯£Þ ó¹ks×'–¿?± ú �3½I>í$Æn1üÿƒ÷q4ïù”OÖó_ŽË§(™8*™z ù†úgJ ©{`5õ3¤°³ÀN¶š_¾b.}ä{Ò`Ës+ÊÁæÓoÏüw �„†ÞÝW«#[÷Ü~tx¼�Õæ¶8"ð25×o°œM+.ÌGøaùµÚVÎá;Îq(ÏBÐÖQa«yšªvEC´Š{݇ɼ¯œÔÎ×þùPs÷šÿ#ºAðÛøò®g û;biý[Ÿê}{´ciùáV‡†U Å•gÅÙBñ>qgèÂ+´Â kÐ!�DñpýC³ÚØÊnSOGÜ*ÿBLy>áæoÓt�Jk1dZ-ÚySl,æ{+;<ÙU�-»ÊqsÌ r›N»¿€ÔãM gS×i²BŽ¢�´•[») ñZï§ÆÝŽ¦Vª¬úÁǬŔÒhÎA4÷§ßîÄu=%LjA0œI„¢:=;h¥ÞG *—,)úB,T@ì²v˜vŸxõf˜ ™S$|»ÓÕ¡wéŠ4yѲD Ñü¦*Êï«d‹ößcÄÂcçïùUë×¼Òæ�¸Úcghˆ}Òò°˜Ô°ËQ¾µ©�Ë"ÛfnL. S™a(š÷-Z8D�>F‘£ÕF,ÏÚÚÂ+Æö__õ5^�ªXBò?ué–4l¶³ Í2t9‡p»É”HÓtDÍšf%³+45Õ]ôí³ÁÒVX¬âМÕYy€œ» �åÆ «•½Ýsiªå/`ˆÓ�¤d˜AÁí� Mv1œ “Œ ñᎻäÚ·K¨0Ì¥Ü&ŽŽ4…ukã,ÛÝ­¹â´Æ"ú‚£>û];g¸žcMxcÓyAÅu&>Ó6U#� ¦ÓàÛ<<Ùáe¼_Ü@Ø�°É—–þMÇýïsãSž ÙD�¾Ÿ?gmÀ�žh$w”ï/P¨å‹D/0J‹.­g‘¨uÔ`ÜñqB”aC³eê7/M.m ‰Sy—²c”@Ð&v¶„rî٣Ţ�£ÂP7Nݲ0;&Lî·1.£"\W ¹Õ†Š¼n£&ÅnNdÔØÞ.o/MÕpjÔÃÁ$¼Ý‰r”[Àª§0*S”¸¹5<®n ¨ÀHPÂL݈zb'l’ž %T�4à…B)©!ÜlVÅAâEÓÝ2ä�H6*`œLÒÃÀ°&€ŒÑ�;iP;Q°äQ‘ Ã‰Ô Q•4 Ï›™ˆ›Q¬{bƒ-p‡…D\ jÁá ]ÁWÇvÅådP½C5MÜH¦ §"âÆñ¸Qaa‰Ùˆ¡ƒEìAœÄ-¦1!±¢5‘*3-æ $YÚt�¶šY"ŒÍÓǵF@rm„)̾j'T¢2,mf„Á´9ɇ »¢±µ“9Ø¥2î8&nsE=$`«t…#h&…‹âì­Úuk–5òU.B›�[ïwL[7�²ª–5ÑäÄXª5p5 ÓF�® NnX%Ë¥IÍhȪ§Z »±°$Í7 dì+ŒF%2 ,T,«"÷(–Åı ¸Ì*4^½ ÈT;ƒŽH33°�ª)Þ�á¹rLó»›ÅäDÒÕ‚²˜:r1P4O"¡Á<ä x3.­–îŽë:3¼¸95Í<æ O`ˉxfÊÎU ›Ì:“™š§‚0¦“+”)\^Ý-)T;ÌAS¸P²„í0¡œCˆØf]ï0æeNòÎcSc9�`1U‰Ý`,KÍunê.ÛThE›“4EÕ0NDN¸J·95k'(MqDS®o9É<ÄŒ7ƒr˜3s'VU6Óåc;fðÝé&§\УW" àj/2ïjrjÄ܈ˆyu„U Ì|±0ñ 034g@’iÕ88ñ>J9–ë†Æ:Ù©»{›ÊÌ!Ì2ïŽñ1#'ŠH X£)Nh MÈžD]¹¡:Ë›¬blUK�ÁF·(™äÌããT£*v6™™ D¹t°(Ž8©¥v¯6bV^Þq{UFÍ•±WRƉ"ÌjvH:x61Øw j3NÕÞì3f,$8¬VMdî¾E‰YSˆ¼CI/(»"¦‹ÓË`‘:äz7”4£c,Þ±w¤«4+ls¦aPœåE]†n+0׊DQ3xŽËS,¸Î#ÎÝ¡ªå¢Ë³2tC×€Ù–"Æí¢µYàÆ`+›r–ÐJmÍV-ÍÄ(Ð{G–&\D]쉣qè±2^Þ�Ðé"$Ý`$L!ÊBÚãÇz¨ÁÛ­©H<Ù£bªe_cœçªç8uðÑu¦ö$9ÿ×wÝ}ÀC¤:¯"w-¿×ÛýôL ÐVŠ7@|ƒô)ÈÕè¾%Óêöõ±Æ DS^}u§s£³ ¥všUòé»Öº{Ìzˆª˜‘k¦»êƒhö1ŠF½ 1’ÈZ›tjIÐd5=3€Ïþw…0e�/ýiÆ*}�ó –F6(¼;Ͽݸõ�æNëÃQ×/gÕÏ?ý�ßD‰¬±ÞÞ/|õÿÏ×êºã3†‰àwî8]4›+OˆÞ�Ù´G(øSÿ°@ˆ;I>åå©7”Fšˆõ—ÚyÞn„Ç›ú�a,sØd:'Λ?÷ÏZlôéü”»<Šuó©Â#6ÌZa{úÀ !}n¼ù4ú9[¨ó#õ³œËÄöî±ã‘a»ãðß¶Ltóéx Ö|žO¾å»[n)ÓçIŒz,¾IÏç�·®õ ëž�âá �…šE†3No#?$/Óa.¨9Úï|¢#nOsP‹[ç^ÅÓŠ�áÃͲiÚ8®ÆÿJ›#ÐRGôï˜Çš:™^¯òðû#ös³3‚úõ,ÏVÓ‘‚8Éão , 8:É´‡…zö&v™ýð/õóèKŽî¦~.yÏŽ$¡ö>Ò�3•Ãf¤‰%ïÏ«sÌ.mú.ÑOb”ï;«Ì¼�¤¢mÕ©~§CIXA:H)«÷9>°å†÷jKÂ(»‚�Û¤ú°ßjÇ,›V$¼)TTU’Þ£÷v„ÏÝc�ÐÅÎŒÏzŽ‹êþÑ"x2@æÚ[–;—þGR7z;ÔÉ< fÒBªo Yk»;…‚:Ø Ì^¤Z*š…b8Žò  €ø?½8ï�½[[˜ï(¼´r«oX‘d;ß,:Å$'‰n¸*¿�ÈMæÅv^i˜ÌŽB¸¹Ý™V˜±J&ÜrÊßÿ *ˆö(€9i\k•íiçUß–o¹%�ÛcGêÊG�*³"K( 0§È‡•)Ì/›—¬zqÌ^¡4Ü¿S5/ÕUAª" @ÄQÜ€¼Lô׎ùZ)"ƒS¤TrˆÔGW=kùÐ9Ak*DÊ.D2Ö�JarkFZK”¸#ÇE\l|Îdlm¶ÌáŒa Ø´e%Œõˆ·Ex<»)J^S¤*'IqÀ8Eá³$‘!JB„‡/º-!(›�Ú¿¥5qT®Ë¡kä­PY (üXªæ %!”Y¡B!‘l½TNŸ:^Î,ÛTm# P6€”Z�©`‰±é‚Òé­¥­jePRi«±¿† îZU¢bË&áêÀ­Êè¶OŽßÙ®u‘Uù;¦<¡EªÜ¥Ž2”Ã+��i‡Ê!œyu0@CÎsÑ^këñcŽÅ£¥˜^�¢Å²1'©L¶Hr‚Ä´Õm±ƒÞ3VIòþ�ySù¦$w§õ›\½µJÇ ; 9ñQÂB"s¢ •Ïd¡R–éB™dfD÷PÒžƒA„€å‚• ÝJJšÛÀAE¦œºU‹obâÚr$ÿ•ðB2l/�ß �÷�ƒùTdØ~u~a ZÅ.êT!q!Ž•V1þ2ãi€bÔ&™�p •ŽF;PFâyp<:Ð{L©!@ Ð/ùF�™ ¹D %R83úkhký"qÅÅ"q“9¥ÏtîÄùÐ,žG¥b°R¹*”ÂI¥¸XÙ¸©¢¢ÇÄ2Hj_d[ ¨¥ÁTL(€ˆÄ•ïdZÎà�\±ö°JË-…ñÑPˆ_©“À d>GÂ÷çË�€ð“ÎZ¹Ü>Åâ a*¤.Y'¿αè�Šd¡†ûWuº5YWÏÀc4QÚ É‘ˆ/%T>ÅD�ŸÏvµór ÁœCi ßÞ¾~}O£yõ/TûN7ÜvïlŸà¹(—%ö:À´a5ŠÂùï±°ƒÿº­ õfZŸÇ÷Ó; —,JcsGë¨31Õñcóת[‡Èmóß>¸¾÷·n²îÙ.#ÍáN›Áþîb¢Ì Ã�I ÃÁöÅ;Âó-¼§-âÜ>ß{o� {è)ލml€Ñý=ø^xã…1拎€L_¦¹¥~<ý¼GCV—Ÿ®ë.óµ{ônÏv½gÔXß²˜n8ÑŸQõ�Üuï>ŽìJ;ŽíÛm½P½ì�üúç{ÜÀ" BÈëGöÌÅ£äï×½^"}«ë´DRàPHv«ò9.ØÀëÚÿ/Äá®ÎίQü¯âŽ+S =g?©úb³ÿV}jCA±Þ.8*xž8NœÊ?aD…í88qšn%7ç€ÂNê<1wsªB×NäJpß­§?:°Ÿ¨"ðvõd}²93gÃgo�凪yo�Ó´!#÷zùæ4éÀ¡iæc¿>·¦¯ç§|Ãïk`7{¯¾ûr;ý“áâÝoa^ºqer¿MGnIʾ�Oô¥‰bÑ–ò|Àý‰B�:@sµoàÆôlõùÙ“ª5Ë�šÅÀúìÿ§rýúgØôÛm¤ûûrûºçŽ»ô_yõrxrZ΂·üL$¾¥Bà>½þÖLŽ{åáôL‡ ®ªèÐr¯»åõõÛŒÔÎy’ |žÿŽáÊù8lF#—”�ßgÁÃ&¨ÆÅ_@]vŽ©>‘Ö}tÔd‰lŽÿ.^Ç·Âvû烞™e›¶+ëŽÔ-Ùr�'O âxJ™ã­²º0Ö¥dRh<‘,àÊ2TH*˜u¯ïÛhS'SÑBÁ¼úÐá/~ÎÁ¨¦6KheyÞ¢{ˆ!ÌA½PB„)PÐãÞ6Þ¬÷ŸçßçÍx×ÃÌ¥Râ\Û—O¥(˜ ÷v__±ÿm”Çáû™²zúŒ˜íDTæÖä>¿xÅŸoåü¥)3›ööÎêC�eõ&ËÅOŸÄ�’Üu¥{u³gï_Žu¹ñNïíˆ}>O|Øvõ¶ »ùûN¾+Ãtr{�†ß@óº ûó "\"=wòÁ*Ž©�½Cœ"<˜÷ŽðúO]}k nO¾Ø^ß�iáÞ¥8�»xúøðþ¯Ÿ~–Ø÷Æ‚ÆÿTëïiÎé`£�¿ÞÒ·;Îþíu|%• DXUA;™è^áÂ;D„~„•¯ »ÅáÓEAß9P¼Ï­¾éû*ý�5^Díô~°;Û‘6öA:w—Jß·gõõÚ´�Ö:ÑqÄöÄëd�Ý85Èv}uâ(>ý;N í –§çϽϣÇ]uÕ½tA�±ÐÍÕï¤�yÔ ¸Ãã^�¯^…~>�mš³Ï§](ìmò³9#F¸ˆ u zQ�ºËJ°°›/½Âî�™»·â½vù.ï• TH©ù{‰�®ï>”aõ‰ >ƒŽbÔ{ÅÂÓΨ> ¼Î/ùÖ¢�ôžqæ¾[­»}›­Ö^Û[bBÄ{wžËˆZi_);díò¶~¿>÷ÛÜÛÅÕ¾;ÞîºÄûLs¯ì¿åÑ›@Vj ˜mÊÂ@ƒH Y~X<—*ßT­&f�&?Ä|¦M©HVþ}©KÝ2 –”Âÿâ’ kÞŠ3—‰Ùçm,|u]dÃÉ ½; BE°“ÉŒèbˆõ_ºØÂ £/CƒUB27µÞ½mŸæîã¸Å�%Bî9¨W#§­#;t� ¼è6Æ Å9ñg¹)"Rã?´ù×—Gü4}Ï*;úŽXDªa{ZWÍ›ÓÚT!’L…?À(–¼3Üò+±È÷?ÆÕÅ1L;ïŒw‹m4Œ`qdYÖ‰-üGðŠsî”:Ðõ1—ß:(ÿ0ƒ'�(Ç’ŠŸqï–�êJ2Ó cIÙ~è%ŠFØB=jBÚaÿ'å:»Uò Y4å-Z¨ËgÛŽÙM2Å´‡Ím¶z º)™Ø@â�žq�dÀ‡F7c€›ïI‹y@‡<ßJxõsþ×¾eÀFÂä H:®›)|))Eâב-•’ µ«ä 8„ÃбÒ&Žý y\9{ñÛs…³ïJ¡a”’Ÿ6*b¥d³’4‘F#€Zû#ßÛe%}!p*|RêÃ÷F?æ¸þzš£§,Ch5I¥ k¬H�/›¤@…†å¨\še�»¤s{44Øj(wŽ Û|,BžÓR$¦Á}x¨` Õ2P€ÈûÞ �ëe%w+"3#}BÙã<Öö±1XôF�O9Dâ¼OT3±À¾o؈m«¬MÄ >­tQ?' ®{çØ^ïÍÿš.J*Ö9™N™_¹TúïDTä*£=yŽ´ Z.ð—K²yuë²:‘¡ùÓíX1D!¯å{üuƒ_Œ}<Îè�gÚmË2]׺ç‹�Á8~XÞnÛýþj¦"{ûú –åë¼�²ê å]µóÓçÌ·‰§!ë×8kCûú6´§‚?B?C‹ýèø#/7ïÛ’»t>Šï¼'#íßv—!ˆÒjCý/-3(]³�9Á!þ1Å#÷YsÔG°q©MäK€v <]ÌÀËß6t‡P�€f)÷š�)Éå,|ÂÁóS¤ÅŒ;h(Á™ÓÈíÌr<(KlÀ›H¯_ïNkû�Óן�bcó?¦»à¾° ¼}Ä;w/ÑÄìû±?³¸7´g¸�?ŽJ£ÇΞù¤ -Ó‹„3Àö=}Âã\øÃøMWõxÐM®GòŒ«é¿L/2>Ù^[\ý±[ï÷Ù.Æ!÷¤PÛJ†&ºPn^šš\K,�í2ò€±eCRPr\¹÷ë„踽2<<iYhÓPo†ÁA© ò$€T'Y�ZjQ¼oS4 ‚ûÿb•5¡„Qÿ¡õA�+¶Äª5S4ŠK¥èOràÂÄ!( ‰ùÔ8‹]ÛBKiÝC‘`72±üÛ©â)ÍÙ!a?ð �ñŒP¬Ðˇ¹ˆ!­^0ÂZ §aÀpeñ`!¶sµyÛ77™SL„öâj’q¯hZH‚TyO¿ã¾“(7ÇÚí½�|]rd»¾¾Š„ò–…px7ÜK=׿cÞ{俇"Ñõ ìÏ6‡`¯¼Øýü©kƒeT7Ù`ÿ,4ø(�ä.È_x8 flÓæ2h,‡ Ö­|ð70@Å{ TñD¸ …"{ö >+Â(‹[Á=Êõ²Ü·‘Ä/}Cà¹âÌÌþ>  Ù!Q™Kj Q2AÄ%Èb&£í=ÿ5 [‹{ƒ)²ÊB+n¼NÜ_t» kü ÿ»E>BàÄ1O` <{묅-¶øZ›ºýû/TŠÛ‡¸ùù9Ê"ð]œú¸ c"ùdþÃÌ¿�^ÇÊ㧦b€îÌû4;ì»íïù/Ê;U%2œ_´!áÓè ?ærò»¾ÖA|ލô:þŽ9ï´•TýãL÷šõõⳕSÖ4~baÎ` ©�0öèt¤î ¼�¬}½Ð}Ú4`<ûé´Þã–Á\>·Mö‹ãäK^Õr0Þ{xÁ@F±ôÀmN€çAäà{íÄlE!Gý˜ë.Ûݺ¾«ËD‡n�©/¾±é½C³+·˜ Žôûz�CyOš8‰Îý<áçâ4¯Ú�œp"*ñ‡íßÐt{‡‡7uÆŠ ·¥íå`<ŸïVЗ\E¿GBoâsÜûO¯DÕ7öÎÜ–·�À¡ˆ¨’ûNþÓÄÛÇϘ­=\…ܹR“tèÎëêxÓÞ;þï�~ÁøíÄø#nÉ*ÖéÚºµy-ˆ~§yáé;‚Bë o„ þãïP‘}¦ö-íHqëëÏ.(|ŠŸP;¯wµõµ_j&Â¥ÛT#2·MŸOmôUë]…$^7éÞ `s {Ÿž¾ÍÓ,¼ñÞ8kFóémlÙ×ãÃJ]ØÛãë³qÜKDr}¾ºÔxýËu…ÖK´¥7hzç9ûjÛë ^ÿ¸[ì…ôÁ5d•nWüruÏn{Ò^i+:þ“K>v�d;V —¸xc_¾öì�¥ö+÷ôÏ•�ŸMúéGN>lý1 ÅG_|ú…ø�j?7xÚÿp|f¾=!Èu¤|Pª0äP©Ø•"«æÕáçE´Ës,ôªÍ©œ•ЋÝॕUåE%EÊ�É!$�/1㥂ÏðDà¥ãñ[9O#�TÄ´= ý�”©S`??Ù:x’ Ì9 Èt3±Ÿ�€"m(4ÂZ \�½‚‚9ç\Á HìÖ¦ óý¤·öƒùµw*uÕf6�wPIo29‡‘(ÇH!"š:í,Ê’4 na@&¼ÉÅU5†™Ü¡DâHXGúp‚rÖÔè'èÅwš~¦L‘”´Ý¯ší0S7`Êýßþö¼p˜(B7¤«ÄX³ÀíLw´BÇx�n z‚x ÚýñÊ�ÛeõŽ=ÔùAÖ(ߺèåÒ28‰R摚/TJj‰SÊé£kåçjÏ-(Ïü©ÖÀÁå¯|Ž$c¤Š÷ k¡œ½�. G8¿6Å÷ýI_ðŸL‰ð¾aLG(¿Þl1•Xzˆ gQ&`„qeŽ5Îĉƒ¢kœ¤ï_p‡åB÷±h™WÍðvpÎÃZšYN ,S0ÌËÔG "ÒS¼o $•±*U] /‰§¿«^É À6ªÇï ämÚb\›�’ÂåÁXr\šT®X½‘ÝŠþ"—+xPV–o`!r”3’è]5\:n Y‚ ¢lû@KfŠS̱Ûü_4$ƒó¡O(¯ÀéeÈì:®Æ‚؇ÖXbp‡iØÌ"=‡ç]ò4Ç�Ÿs� Ï@Ôâ}`Lˆ†ñì]žï¼Ÿ·UðGoϽûúÉ;î´®ùcã°u&Ã5þëéæiPûÄ„)", ŽÝ~ˆÅkŸÏ=»N{Æ�é ¸>d1>¹¯î>ªßsÏ3ë³äaÚVdq÷—îÝöó3¬wÜ a&Ü}Ç{ä­ØŒ;:2yS¥â^õŽÞ¶8_W¡Nwýlq"r|_¬®4(ÕÎ>¿=Ô| mmÖ·ó¹~ÐLJ»ì@ žw  ²ìò°Q¿P¶,½Žì§…õù s%®Þ9Ùè�÷‚.ݧç¯Ä÷K¿Ë/D'Åh|¼jŸVÛèR ¡õ«Þ˜Ëøç둾ä=ûAÓŸ·ï!ùAÓ#¿®“ÆÌê}/O1l³?ž+¾þ+‚­#¿ö|~Ž]ŸÖ@ûõ€tЧ,y{#¨ðTâ^N•êõÒ)‹öý~Ÿà~5WÎG×£nÝ8 ‘üñç÷Ï2ûÞao90qua¥kïûéï²(hä Í,T ŒLûÈji SyˆáØã�:¨,HxÒ�ð"ZµHÕñs°7 €"¸ð0p ÈÙÆ üHHÖmþÖ³þ$R6µ®é& ¤M'’“XSœ¹äàæ^¯!ͤ�Å%Û.5‰QÜ»«ª¢÷-ùüÉN芌f’[½®©6¹­ƒkáºÀج6@LÑ0"BÜ‹ñKB(KÀÄÒ$#k[÷Ë�HTü©4½KV¨s 3WUá¶Ù–¤,(ä®*˜YÅÀW€!l¦S"U¹IQz‚¿•~'òhÕÇ�¬ÌÁ�êƒí)šÉi4Ó�ˆÜærð„†g›ÓœI�#¬~â–‘Ó#¼¶…Ê(–Þkµ¨SW¥©š£ˆÅ*:R³b�zýt1î×RANW˜Ýò¯-�#– c4!°^6K„æn™ÈÉž2É=ð{zWwÍVµù-Íx­]JÌ çäÓ–KÕltâXsºçD3ÈoÈUGl':íKK73ƳÿêÖ,8ˆ:iÕ=\&pË“tb "vé²êp‡…¡Ó�A€ä„‘ì§¾'ws4ˆ`u~Å©b#ZÅ ˆcOü5¨u Ö‹À^ÀÝY'ö°ðjd±ó@Äà|=e±¦;¼É3#h|~×RÔ>ía‡+Ïï•B­Xb˜é2‘˜¨ Ñ5@ˆ·s½T,öƒ›Þ_פóTÉ K‡œL Â*œ5¬2ÕˆŽ[bZí¼Ÿk�²ÿ*Î LãÝ�²D€Š¤·‹DDƒ”~Ìxå¿�^ƒóVì—#àÐâ…m½‡üæê�ôÔ‡G‰˜ÇÊ¢È!ƒòú»ù™»èÀy·Lq]¨Ð‡yv´Îüé Ë=lïš¹hÌV;Gñ^-/Ï˾ýñÞ¿Ï_b×òþ�¤à®éÆ:gSQ—œ{ƹÊCÆÂ´e0÷…/&^׿ì>S¦ ú¹Ÿkj£á±`~¹ Ý^B»ýÞrš}Úiñ*¹¢³Gº£Ø¶Ð³¥yòÞßš̵Cû|ÿgóõãº"ƒ½ùO|Éêoæ�˜ÝúIiÞŠ»÷ßO«½ý~¨„¨^:F… �>yÄxÇì½üAOéë¦üó/ϸö6nÝGo?”õ¶€íN28Ù‚jñHÃ|ö9°÷OD«ðxÑw0DUÁú¥úÑÇ ›~@o¦«'G[ºŠvúð°"/_»�{㸀ëµ>Óëô<�"¾¹sΞÝž<Û¸ŽÛ�-_±*m÷€ã§$¥/߯Û>ƒ ¥`à?ÍíKñYâ›S³�^¢4ç�¾áê]oH‰“ƾËÒ¿é>rX�Žœn“žÿ×¢‡™ûŸ1Ú:s/yÔÒþÌjžFhPM–ïóinÁhuˆcí»O¶Z¥ø+«Æ_}…¾;¨9öÖÑ„ æi ~ºún§IÁù :ƒgÐŽ½²,%+}Hu»üfþ´áTnö2µIôá׆¹ùàO`äràbÒe‹|b¦;øÜ¼:à-0Zø¶p¿•yþ®Ñh¦E€é²ŽpÐ{0¶f°PÞJRX]²Ìá�¯/z¡G «Æ«ÚCÑüij!}‰ïT� Ú"r .„sÞ©¶¸ûÈ+žiË€¼@XaIdÏL‘ÿÕ¯íyá TØ€‘=)`7¼ðŒ 1÷â±dÛ¿ýÅ)ß��œû/|š…LD9–@D#£c‹TS›k¢!'â<`‘Œ øg+ú(byC€«8ó¥º4Èqy›LÈä5òh>� v#¯×W2+V¦¤”@"Ðpu–ëÌÖI6 ‡FñùÓ—¦Îb]~xiÁè^Ïo'€¤6¥Ð‹óˆiå ñÒ„�»ÝˆÃ©øÛ%iz¯–FwêxÖ–µ¿Ž£¡i\'Øúe0Ý �ßiŒ0çŸ^cê}ÿE­ûÜ’°×ep²oó.®Â7T\½û�lýp*Ø×±ò5VÝzû楯_}ŸíÃ�º—vü“9Î1˜–¯®Žú{D3G‘;Ò¬°¸N½íÚ‰ßaøº9óÇO·ÉM }à#�­Vˆ«ìb6ÀnN¬&’htxö¨ïÏShÖ€ƒëÚoì? ê÷óø�áV˜v\U¬iyGÕ=aqÖB¤7`Òt$“ Þ5ú’Nfwôè·¼VÜ/Íþ£ÎBmU{£ÅÔ¹}_G½ÃŽDRª¹úßç~ÿU•'ñ>»|w'ù¿XîˆúÑSó(zñ¢˜ûpµ½«½Å\áŽîmI%Ó¿gm/¾û± ÇÒnÏÐ1%F@úÒÖyª�€É�˜°XÚ’67H‡ÁÙ<ÂUhË£K·¦­Lâé<%¸%²ØH]GèDŸ)˜õ%LZT©ôÁDÆmyJ«ÊìÅ@¨3C9÷¤ßðß�¼\=£ +Ü0”Ø"­ îäs÷úÁ�Úk}S¬ç/ÉÊ~"’ˆ ÀD†•ëh‰À&Er° ­bDT´-Dv&çÊÎH_™C¥NZ¥¢8ib!JpÛ*Ô<5?�$PŽš¹1ª…¡%õ̰àã…ØâJÝÞÆ LʈK’¬o3É’DMor ��B*A ¨óðìEzªÅ>ÞFøþš«þQlš)e“S"°,�!Áœdûïî<ð¾‡Ê”G2˜9~voàfòó=”éë1'0(í¶ˆa)ëç”ËÄð¿¯.³¿Ë>\<óרZƒûëø%øŸã8%)…�“ø‰ßêw—'cgàq)dÖ°ÚÅÀQ‹®1Ýq^ß¡Gàé¼=­ï×Eàuâ~“M¾Ü7SP¯3^ò«¿tçI�œ�§¿ØüŒÁïïom. GnWí§¾ûè:qÒý·§�„ðZÚ¢�›ï÷zž;"xÛ±/Ù,ÇöCôLŠVà8§ûÀÙÉ'Ö/N,0¯Þ‹ ˜™“/µ@ÏBS*‹ˆ™hîq1�À AAB €ðh ŽÓ¥¬F0]éâ(�áð=GBÝ@ ƒTëøÀ ‘Œ§¨«€ˆ>LrØ€¼¸ ‰›øã¿™Ó»ÀöË=ú¹ç†&§œõù‡Vóï=•>ι~$ßp’Òıí:Õ…kE°]²ð~-wÚEÅE1´Š‚- Œ”žð%z D†}¾OXBu¡wÑ÷¶�ý=.îºãfùxS„á²îü¼qµC¾úí×ôqyo¹–þq Ò�ëÒ2›ñÄçÀå009¯¤Aç¯âÌKsóàOñ–`٣̨ &±“ðŽ†’šð±ž$é2Ôùµ„oes¾]ẼŸ/eÖNèNó{£×š*¨yvšŽ.Ô¼ªqÖÚź!˜Ÿ(ü�)ªÀ ê ˜õËM ýE[ä`M½‚ÒmZ»¤ÖA®«ò1WÊö' d€æ •:|)ø"ûœ~áèíhØ´$¼ŽÍ—†ßõbòõyÞbî/—wå»'_/¼_~’8¶´íkç)i¶ÃÒ‰J�XZ]½žáò1'x[.Sß§ݶ;‘‘ñ¾A×ßE'ùàH½}ïÆû™{út+ï?^èC=9ð”Ñ9èæáë¶±Ž¹ãásk~ˆ�|¾cŸº“æöh’E´îuƒNn� øÝ£ßRÕÁšáÒ�ê2æ~é¼<�Ò�z¹ƒ�ø‘i8Àí@�Tg¤žx”%úãÏ"¯ï-Ÿ9 Ð�¾ÓàwaÅÍG¼wøw{€ŸV;õ¶aÖïü̦×0OŒ¼UÒÒÞ3�þüì/±âVß(¸y¨ÏYfX ^²¦õ†ö.hSd;-…£Qê w¸d…ì^Œ‚lnl(îo🠄ËÌ$«zlíÚ õ5Ô¸ø½åéG¡:”>±õ½>­æhä5‰QMá>�™“#”>†1QûÁ<~ÓÅ[V%H0±Â[Öçüdóž$KJ•)’èç–e¦!2¥‘l4Â&xÈËœ"0Î"ÜÄmQÍ& |lŽi³¦qzQjßúgKRÑ9𼛄@k– –$ª£˜ï§Ñ}AIÿ”‰] ™0~m°4•3¾v.xÐ\Åá4™˜­ŽKFuh ‰æPa±�JUI C`w!@`:6¡![?ɞد´‚–)þ¨L‹…šõœ˜T_ Ì–ªà(‡Û‚8\¥ÛœÞE<`FrñÜœ+é¡úKÁ3‹Rº“¤RÝ�ž@Š‹Pƒ€ë?‰¬ Ș—Š…jÒèŠbü=8yîã}¬C¾_Mtç©z–¶›º)xë @îæŽÏmÚ4¾uk±,4…„ ˆ®ë3ûwë§ÂÑ7 'ÔØCqs\Yñ‡x:PŠÞí�¹ÎÄUÈ ”߆ƒµä¢YþÙI‡i‚ÿ>Ê%bKq;¶4‚Jv¥¾?Åô鳪l²tÿ˜µÍ‚Æq'é‚PiæÐrPØ/À±•@£ƒ@Ìùʹiûw�|¡âÞõ›bÿ‘ª´$1 \"U±X7) ·­‚Ÿ ñ{#¡(¸ç‹$rˆdq,€2þ43_p£ùº/Îgß NšžÊ@"(�ܨ c>&AƒÇ=*#—@ ðù=L¸$áJàÈà†ù¸\;i¥ª×Å¿möüÿO²”‘ÐÅ36X¨�$Ve›6„”3J’¢QIIRšf“l¢Ù›&Â&¨ÑŒU&¨dZ¤Ô–6‰¦ DhŒ[%a”£XÑE�h¢ IRJjŠÁLÔ%b6Æ¥Àk&£mRHÑf•ØM¤ƒ%Ñh™¡ LØKŒU&Æ¢ƒFÆ�R* ,T‰T$Z2Zf`¤�²AE6l’hÉ£IiŒ-’¤¬Ìl–˜ÃXÕ4PchÆ6ÉB…ÓF ¤�(–D¦ZŒfT‘H$cbÑF""ˆ-FŒ Q¬VŠÁ0°XŒh1Š$Æ�`°T¥�’™‹h´RI‹IXÁ±Ù"5�ÙLb±$mDA$DDb"ˆ""""ˆ¢ˆÉˆ"0ÄHˆˆˆ Š$ˆ""ˆ $A$ "ˆÉ$bˆÆ‚Òma2b‚±EF(Õ4‘Qi2Œ¬m&–b¤£l”E ¥1fÊM�K6KJhÒ dØ� ÊXÔ…d"ɵŠJÒZ )Z(±j Q�hŤ’) DlQ¬ÆI¨Ä”Ej-iJ1“LB3 Y�FÅL¨¶ŠÍ5™¦h�i ±j ÈS4”l�c(Ó[3– cZ1ªd¦��PF‹€²cb¥•6™i†1 ƒ°b¢¢Ó"ÁEŠHµ31†¨¶4! Û&� YI#E#L¤ªa¤6,¥*‹b�%E$ˆEd’ÅDFÓ6ÄÓ`ÂX"aFŠ2”¿¥üð|ÄØè¥)SLŠ a13DÂCe¢½½«�u½¹]]©e¬½»[¥‹yݺ”×^u¼•6ÜIíךÞmrDésovîhÞö¹7¼®÷¥åÙ;ÔíÔxÎt½²^ìfn{.Ìs½Ü×�³^îÛ³mç+rïWWºêó^ï7­Þë—½v»2»·i®Î/Mv÷¯{g7®ÞÃÕs]LW–÷nÔÍMïojadµ/u¼½ÞºîãκéÝ×——³k®×½ÝÞ—©ë§y^'›½ÚJ¼Ý¤yu zö]¯[®÷qï]Ýï]ÝÝîëÜÝ×f›žŒN†^�Î÷XdzvFŠóVå{¯jîc;ÕzºêÓM^ݬ/uÒíÅÄ9w¼éÎç¶ñ…Þî©··»o5¯6¨±I³¯/jSq¡Zæ×²“Íqív¦Þ]Þº£užë¹žÛÕêïkw—g-Š.opízõ3v+Ö#»HÞk¡´o6½.¯k®Ì—wtÜéë&W7w^f»Œ¯)zñzkÛÀ»*mÒók&§A™ÚÝ+×mÜÑK:Dšõ×y¥›¯vâÎç­êïi]]LËšé´Ou L]r½ëÏ\EÏ×·K“ÌšÏ{Õå°pŽy¥-Ê +½íÉuÞ\öî—ºô®W®½oj½.õu¯1^pw\¹{×]”îÝî¯:ï^ËÝï{ÛÚ]Ç·‘îÖ½z»k˜Þºï]r-9»NMéíãºîwuÑd9¨ô¼"ìêW/z»¥¯w¯mÔ¢�ž{o-(ÀŒª’U¨(’$<Ä  …ÀUA€ª«Þ*¢‘ (A@(@ DhUFÀ(TL¨�UE(PP  f‚�à A¼PP¤@ ‚@A�RÀ¨‚P*‰�P( ¡t@ "\UG(è�ü€¨¢‡çx"*}—óþNÿÏ(×Ŭ~Oï²|ç:)Aß�šH^æ 3¢+=¢æùúùÁÇ3ÊÍ_Viª§ÝYð‚�\êg(®Öp/:s�ø{¤£íN¤.5p†�×·ÅI ¾KU,–á–…XN£"¥$òä®8‰¶A“o<Ãg>áè½ëöW}¦C£-W J ô¬³W&â3cjº}úRG¬AA†�KeødJH÷æ½éá;Q°6¡ÄDu"爑bÜ(õ�«¡Ž$>œ Ì8‹¬xÑZÔ½ÁæÓ‘ØÎ3Ê Í0…‰t3d•G„Ë:°†ƒèî´ò#<èÎ7Ùíñ2“ΔÞÔÁé×m¡Îw60˜ÞB›qZ\é«aZ•$ö¸O]�qŠm½x-ƒwŽN1™¼œQ´œæ®§Ô“´”éÖo%†û²ûW«Ùªâ#~b³±�O"ÑK6Ñ·ÜS:£TF\æflÂlNå¸N3Ë“žûg} c!T{=ÉÓ³Ù_ùUˆbD"0ŠŸˆyB|iÒûkššET;}ÈÍ“º¬I¼>\�Í ¡Q*-S_›x|[GÄ:þÜÏ_`|ÿN#¢ñµ¿vBJuøüEßoÆ|U�´=¼åÞ©üÃˇÜw'ï!ÁŽ»�û¢|_¸¤üudÑÉo䆛 ÿÇTP÷“þiûQ¶@ö@¬4HB ºð^.×ní]Ñš±m©Ïš\qT%` vÍ^)¶oŠï¢àsÁ_lõ%ì/3Î9•Àž>›Þ¶+%|BÍ [‡(2 ˜±�HɲµX½}˜;‹>b w¤™ÍA-üÉQ«öyÒò÷'³yöÛÚ†èÚåw °¨€ÃÆ i±ÛŒ¸+ÎŒ Óã°‚Ûï+dq¾ŽžAóª7�‡ªØ@ãRZ6 3ðï[_ŠÝDÓ‡aÒLû–Š\Ó‚9‚‚Æ-rTIb¦ÜÛ�PÇá_(€äbéôJ6½ÚåDhìwõݘrF'2…àF“àð1¥ÇsåÔðéN;àòö›„.˜Çù<ŠÝ¸‚ 0ØÊ,ƒU!›à �)ˆ›ÕûÁg„;pYˆž€ž{¡#ä*T_³‰½*¦Ò>?€èèËö@WP`¬v~=g½`mMOf«X;±=%L5§”oðÕ8[ÓÖ+£øô˜GA»­È ¬ÑöÐÝLÌY:9�Œh­²©$×ÅŸsÉŒ¨ÄLI[SG¬õí½i²óm™Ó2ì3/içTµâ^Ñ. ŠŒõÜ}%|¹4†éÜégo)Mt”С¦¤C`Ýc¸tB¥ †ÕÈyy1®xªããä ¡}0oQ#Ú•*‘€#øT '»¹ô¤,°g^SíxY†öd7Äc¨õ„²Ê©`aw=¢®Ò6ÏA§ÍK1ÇŒ­6ËÄW=e®ˆÖU�’Zià)ŋ̇·•&®1ƒ>O»Ï±øá‡dÕcŽxÔ¢’ïàË‘CÀnÖ¢–5 ž S饯žao^Ÿx/Àz¯b¶~ Ôs´îbY¡†DDOð†v¬2Ÿ-ã¯ã„r<„¢J'¡…ìô‰!†œÜ�Ò±”q’«Žcc­Ú0_C³ƒÙ—¥ÅvðÚPe��gžbv­Ÿ|ކn–¦£A®¶‘Ýip–Û^±ó3Ïêi#@õo7‹Ö„¤‚“ÁH7ä¤|; ¨„$þ1¸iîàç�Ã8æx®åŠHÞ‰2C³ª ö!¨¨kZç±TR޳|÷!’ÅõÁ¤C2Á±°lMƒbscDQ‹¢Æ,Pkv«†<^¦µ=ÿd]ô¸è3¼Üa·½_>BøÌáÒ&?„ã#à Ž-è2¾_ƒøaö“ûñ‹0ßÀƪÊkm*2Ú1˜�.:žù]Pü+×fø¿ªÁ‘/êšþƆÙk7÷W‡ˆ¼FSëó5ðœBügš-Ö–}÷uæ5._@l0ÙoÅ•èz\ÅóW…Ç— i¨B¤Ž8 ÷y n²ïÎ]¡¿ŸûW€`Z#À†=ŽÁ…cÒ´í†ÞmïkA¬™¯iÛGû^ƒcŸ…í^…g!ôƒÛ‹Å4{cY¨”Oq8QkñoIšêf.�HÈYð±ûõ1—]œ—âsÑ…^yÓœrLÆ[6µ| Z]Ü챿?4 •Ðaßu‰sN/•NN#ÎB·�«ów»yºÄ¹îZ·ìÕÉÌ;Z>}Ý�'󈸤æÇ™þEžfPg¾É/©@Ǹ_¯Å¨C’OU7Ÿ2ø�÷4øûU�^[i“]î+�)’çe@S¬HI Á†PÞUøÓÙz²�¸l¸þÁ³÷�DXÆI±ŠŸjàt5¾0…³+fºÿ‡åøÒ‰[ʆ/Ÿó»�~ö@|Z_µ�Šß.Î×Y|ï2êúm�ãöé � ¶ÌÌòfB]4 Ä£rŒ8$iÎ÷ÌÉ�ïç[ Úº˜“´0ãù@’7¤®úëÔÿ3e#h(€® wŒsoZy^äÙÏþd{@˜qF’òSä�¸¬yÇG-^løú‚7PcfnpÛõïöSŠí‡O9¹>Rêr˜ïž­Fÿ+{m°è~tüôÛ¢µÀwpà"sUö'ü#9׃ùÀs1Î;bü°ði¿kEÐÂmýa*`8ÂÑmÓÚ_u¯:×57šC%í$¿2ù°Qð9o´t»d‚<�â²;޾ j!¶ÐÛB„]BH’¤ÄÊ$m°„;Ö:rÍï©V¾²UV˜ °±ŒXâ­ã–¶f�›¨õÁK=ŠÂ.ÙÝ©ŠWž±ÕA»Ú±PyÓ°vØÓm¦ÈpÁ´6ǘ$PÍåB ¾ª��$�2:ØX$6ŠwØW^¨£ïž‹uÙ{LqˆËH‡ßV,ì�Û*R+BÃaÌÅG®,ðåÇŸ¥®ïr®_©cc÷‹µgv·ÌÀpÆÆÜ®Yx-&îMÖ ,ÂÃàeÝ6›ž¢>\õ¡,ìG(OIƒýx¤}Üñ,üÝ›g¼R#ÚO¥hþ’'}ùÈÑãÙj²X*êdRXÛ ¶ñKÛËÎ#Ýn÷°öÛ�aJ·Qg½±q¬ÒÛ�h#TV¹–•Ø ™Ï¦ðŠrE(&€0ÿ3󞾋$¹¸N©¢"¶ðû„ZÑ)Â…ARnIþBà[Ÿ�³ü~��ë­Ç‘í Ð�Ç‹Ržô «X0]30lŠG`e·‰³K��&9íf%Èu‹¸O�"í°íáû# Bý?ÖÌÂD£ÍeŸèÁþ'÷ñ#ärf ?�y“¼(Ïô:úµ~¶Ø¦MMþ=É(ÝJ¼CÁX9Ppq& ‡ÀˆØ¯hžºÀV“àW4’Ph_Ƚ7íFé�1›ÑL¡yÞç+·ÀM>ð¶¸[®µ6Ö�οù¶fº=ø#K²£(Ò�Ø~É šÝF IdQý¯›rDŠÁ,õmÄm"¹ ßþ‹‚ì ¢Ó†9žºÒºÎ $Œ‚Sî×*”¾§LS¬•/±`+kÖ” ï!¸ªµ�ƒ(­±±´|FRHIL�q¾ª¶OzWE‹mÆÝj.Ú9`&Àm  lµ"âÞñmé\Mýâ­¼õ‘¡Ô>q0~¨õ‰ýqŒ‹<ï±�TŠÂFLš`z•1Àñ*:Ð'™ bÇ…þ„ÁGCv¨ÝIëjm´.ÏR“G6¯TÏ^kFŠ=ŠD˜M¿7@ίlÂ}úD€aÉ3‚ 4Lí�™aÓÞ 3]ù�´ž)/šµ!% ø‚Srnl%<Š­õ6ªû�Ò<àÙ!ÖÙ �á‰Áãû¤ð£_s7ðô[tmx…í j°{ÓüPH ŸÝ'”ý3T,Û× ôê)-_ŸjÍÌò&a†æd—3�R­tž=’”ï½sß ¹óÙ2ömPùÄ+>ªÜ“âømL�Ù´E….84ØW7â+ÖÈ*ÐÀ¼Œg†3›˜ßUKN¦ÊD€BwþU³zloÆ)Ô>ÝÙKmx‚×,8gÙ)K}°v ´6Þ^0'tàž� ã,™#Ém0m ïO™¶fWE ÚKÇ·UÇ}hÔ[Ž.¶à'ƒÁ½K ³üö¦EZi=¼OÆŒm¶Àë‰K1 [#)sÏn¹±8�Ëíß™4ýú,õçSË$êYƒTUM¡gä|-¿µëÓ{p˜»®’ZÄ]ˆ–,Òr¥0ÀYc|ïBÄÝR´éíˆP#o³¢£&“ ¬ÀmyRŠÉ¥ÌãrÕÚâzJé¶1ƒk²1]û²ço¯#†­ûxÕˡΠ«`’B,„� €s,gEpXBáÛœ> ô “b8�UݹÛ9ºËÅ^+æþwBœÚ“èVìW�ß�í„  àDõ5«Q]<<¢ruóÚš|ÌêÊîò1㋵ÔcÖÆkÊõ !ƒ «u *4ùR ç[l:­Ü*äŠL/k¯ÊöNå½ï1o—ß¾ëÿbO÷_÷_¿q‚]g…¨÷€yø÷eå¡·eÝ…}; +½UGn»ç郇TA—#jK"?I>ýe¸Ì†üOŸÏŠî?½£F`øŸ~Ut8ò)ê¼Å=yCâ7—};O9QŒýšÛ­‚‰ÅOú·üÞöm—–²YkÄœççÞîY&#ç‡ôcšš¥Xrä¬H|¾3Ç€ççÆ›(pŠømL D¦rž‘¼� QÙVÖT’8³–‰Œ8 ÑœqÆK¥ÙÂU� @û/JzÀqˆqI,”öjr3ÂbB˜ŸÀP¦SO»ÊõÚ­íí——>\8…rIU¦?@¥5omr,CóŒ*¹fJ:ðÖæ©Î-‰Ÿû‡Åý¡-èsË@Bå!øE°F>’‚,LeAnr“lYl6”5Uüåábæz"Ó8¾32 ½‘Æ ×¬kø?¡òÜcÄŒ~QS_݇ҎäyÍ ûÁ´üò½„éãîvò®ëÛ ×¸þ*Þó߬Ùb>”‚MÒÿ&:°/÷ò4ÿø—Õ¼YôR!†òuø¦„6v€m ›Ž䇺ÐðRêböB¥ý’&¶HDÆãðð¹×@0ι� Zò `bÒÈ#ž…1yj;~Ì6F üaÃÜŽ©š§¢Úe�½<0á½>8?;JêóÉÏI@Õƒz0°ŠÕ^Õ“Æ©b©mc¶բЩÿZê{½Íg»˜$f×?ð¶ðå0¿ðÿ!ÜnøñÔ�tãçï¥6Eô ÐàÞý*¸L�~�cŽQ¿·r‰¿ßðþy¡ïý»0‡¥ö}Ðü˜Â¯R%Ø€".ãç~»ásä¹ ké?˜ü1ûóÃN ŽÄ½ –A�„kçÝò¥£nTÔOÄ…}€àu?á#ÞÁí/1$%J ÍâOóQö53´X�÷á’^ï¨1·,ðþ>¤ívhSõëæ¥'À9ž‘s™ô›éHŸÅOúÖ>ç×Å(3 �Nk„(&26•×Ô…±VªýúCk€gìx=lL;¿¿e ƒ0wJ•â9þXvYð(«Ï}‡·þVè!‚eEï¿ ù̘w¿e¼3Ùß—¨-�aIŒïºKuÚnuô>X,`)‡.•3*³ÅFAÓ ”€�{«Ülm6Øg­³{cóç§MqÃú}ÊÉÊ‘97�µ0#¶�°€V;Z^ûŸ�}„ lzDþ‘tev8>…BÑäòÄa´…àãÁ�Cš¤ðÇå1˜œº˜5�,e@ì èòËnió ?3�JPŽ|ÄïÐY©’ßÐPfvæê¥aÕ ªÏÙ§†òÓ<°³ŒÄHÏœ¶Ã:\cÍI1„ø·ï÷$7îcÃûfÐPÄþC6˜L¦�« t>rC”èd¿…oB€ä¡m��͵Ýý¬Z¹Ûl~wì*¶O†õæ7µyƒ–HJÇR¿ ÚÕŸ÷@P`!\HwöðJ˜- îuìHÂ{½ùÔþÆ¿§ÈÙ��fÙ½UÉ_Ù럭,lO—̶Çu�k�£¶8ã®E[,Тâõ6T½N¥Wò"áÏ/¥¬‚$â5ö�WñÑÃ#M©” ÷]X%˜þ1–O :p³ßؤ_h”xªP rTÒ4=×\€Ð̯‹¹Hr0Qú~×@Òt({o˜IA »º¢1—¼ßB°R<;ÏEîŒÍ“5¾üâÔY ?Ÿ+k¿…C�Ýwíãá¬2Ùòhu·S–:�=çÀÈr~élSÃq.{Ó¿Ïvõs^õŽNÖW… çñÓ~F „œD¢´ÜbS¶¶b¾w|^~{M¸ÝuçÖ¿P¡ÝÖí7wª“Ï+ðôyù~�)$«þmÁ½ŒýðÎÓÜö‡u‘¡}î÷)~�Lâ¸?Ø ¿‡?Üo›¿6>÷wŸì;à ~Ð@lj­!ræÐyAS"qῈæ54_ Á'ÓºïÛ ›sƒ.8ñREc@pfx)n3±¤†škˆô©žámknw½üîV•%µ ÕE*c;ÝÛh\["Á­A¶T\Jn´Ñ~¨þeà@ºÜãÖÔ7J†7æ/4Þ «j=þg |ùºØ>éñ©-�º)°1Š9ð|Û`‹üç h2Äïø¾V`óßw͉ÔlMúƒ˜r-y�ˆ†aõ�9¹†26û"!üÃñÌm�d>ø�7±÷„l$¼ÓØÑ£�î²üwìè$�¼§ö~O‹G�àx—µ÷_ª.¦TgßÖÉš$¬�¾ƒðÏ>Äq¯œø¹Ö¡•z!�¿´MßÃ…„ÍɵòS¦¯h 9*Ò/ßb GKk–2#™ØeŸLtµÏP ûö „YÉ—§Ÿ rµ´œ@³�m§õ|Æcœ¼÷˜¾Xd̈¢(/h«¶…x®ôIé‰eÔ£û9޹ýž�€�²Œ�e8^NŒ{ô¯ Ì;)ñä§FXúPËÓìf%ê8TÛN.Ë»³F�’‰›X¾,KÏIž|™iˆ]í¤€?q½zãÑîÎß<™¹äQqeZlTÑÕsôôĺC0_“®ýŸÌùëÓ'P9#wc÷CÀ†±PD/‡Ôd›úÿrS^"¦¡‹Yú†¶ƒc5éý¼›âþU Sf~±AhÑç;¸dæ+‡L‘L*í}ëZ¿‡<äÛ‘º2ù¹f~$ì�$¹+æ=�Æú çtÛ@ôðét…G6ü•¿ƒæÄ…OÇQ˜e¿þÓn”�´1„Ì8åᬺqÂ4*P‘d $€�·7?PW\Þ8"¿¹�w"¤÷Še§c�S1‰¥krl>1â"ŽŽÚlÄ!ìÄ› u]�ŒÚƒn)#ÀYÈ8iÙnš&@„E,ó-†w›Ïa7(,;K¥H¥Ô˜(c�t™€âhf"’Û>CëhI:rõ=Ãëí¨Ð4ÃQø¤Øôc”¸½8"Ũ(çr�â÷lÀ–Àp «Rx¶‰ŒV"ÿ» BÚ³›YÆSoÝ–¦H½õ ëßçøŠ�IþûSø§Ñöü¸mùÜN<¨Ý®1Õfh»8¿ã¼wƒ§³ê“mÔyÌ=%¨C¦— Ç�ÀȨ€Å^&ûŒbIµ<{o&ÐAZÀÙÁÜ/Ó�Ϥ^æX[+[…¹í6¸œWþË×=·å·é´.$‘Ô÷£ë£¡$‹Ô€Ü¹Ó§ƒb9@Ô�vC–ph—ì‚ I_AÜ:êä÷6‹ÍBL*ôŧû î²1ç%IÌ´XêÒêY›+€v„€m¥˜Í4 ~9‘�Û~Žƒ>â/új¾ÉÜ—{&ö]JÝAXîyÌÊÚÁƒ °t}ý2Œð™!´yEN(§2•öx)´÷6ê•Óç¹`Á˜Ä!|�R1@ d]»ÞÀÅû Ñ©¬<ªæ˜²ÏìQs’(vg�äCOLN³æºBÏ™(Ã= R>w87PɈÈc4k@´Õ„@‡.fÈ ƒ°1 ndLÈK(§ïP)©ö™?6”sã ;ÏÓ’ •R”!2d¸Â(ù!cÚç‘Ï5¾sá©¥ÌO6οq¿ÜïÌÔé¤ü<˜ Øä4–г„v†De5©0‰ÔLùeEÖ¡âòÛwhÚ¨¯Gœl®¼ßJ âZl$g Ð×J~NvÊuÄî!v� „ƒ‘!¥¢Pþl¯¯=—Š�¸˜ Ÿ„£Ç¤RRuYópè„®“”Eqrlfd_:AÎÍÎjö¥Sd´eW$®�“\u瓵ŠÅ’Û%m�ï(÷^càÐxA3îÏ"àѳo¨Ëä¾wꨬ±fÅAtúù⿾'á&{ CÀñ¡]ÓúqÙä•5÷Í»ÞA—°3íP©?dð6r�Çð”¿<ÓxôM‘DL=’Ö‡¯¹‘/⾘v ‹gl«3†£¡›üuç,Œ©2«Ãm·®û�bÛzGÞ¨JC^cÉe®iOìi}óÊF³Ônn±ªTkfnŽk5HpËuÆ ‰0*kpJ'€²îØóÑãßK[œðò¥"�Æ1£ÄϾOšóûh$sIÞ¨1£sÑèþâ‰ùõ>ýX|êÞõ5×o>ÙüÙxGc+´&ÃqŠ�¼Fø&2‹U.8L$ “8I“9`ÿÌG:C©Z Šúœ`ªBƒ¯é·+–X@šõK¾åF p±ßsùÔôµ·’׈œ¨¦“`ù�GÊ—g» 1�:jJè%@eáÔ�<¿¿38¦îÓeð{f¬"�š±x`+ñ<óžHÇ�&$o‚ñ­±e&t<ÿÈÔ{Á,ÂÇžV63è¸î3NuVÐÎ*0�-¥Ó]Ÿq;�r^O�¦Yˆ²)]íŸ>ŒT„Âa$:kB`ͤpég Ú6þpð»zíqb»ý"{V]äñNí³ÂzÅ#Åö†;$<ŒùON‡`á�06(Г+<áp@ê®ë ü}PHÆL}ýÐd7 úœ<WIößã~ª]óí<ê2îžT�ÙˆÒ&ü÷��š¨Æ4ØÂBÍ.ƒ/0Žõ|GâxÜ}}í(Øü?6³‘Òá1o¾±:‹i ð…Ø7üÚPýD€Áº”¸“Æ~mv^§Ü¸%–hÎ/·¼�Ççb5 ß¼½f"Fáz#Ùò†»ÇÐÆBô^Gg»® ;´•%¿¯Ÿ –K>Áõ‰�€—EŸu�¼è›?DVv-æ€!Ý$/¢LlêeÀù¼Ê!ùl"¢ÊrÖµv³%?ºâÃñQx¾ûÄIƾñ0ùêjáWÊÎ`ãxú熺Êc»Nmm/tè¹8Sãq¾›wêu-åÍvÆrï9 ßÞÊà�Îc~þúöíWè7ˆsæ(ü‘¤šTó a· ›×^ñ-­Nq7Oró`ÁÅü¨dz‹ôßœËïàÚx€tµ³4l;(¥všÅ�¶1Tܘx²ӌäBº¥q±³MéƒyÍÁðS‹:”´¯Wˆ>,£ôs3¨sóUj–�Úl1³ìB¦<2È™ y:0oËFjGL}ž†£R<(÷GdÛfÜßf©­>vÉ~Vß € nö®ÄÃöW?8|XŸ�kª˜ÚòOÌo#è¡— ÷Ï' ï€æq’†rfË ò�ŸÐ™˜Î�8„]+ÇÆ'#öhkxÀ!&fLhKDVˆ¯&0Ç"ïJ I†Ö]¦4d)=(!@ɧ�¯j4){.¾Ðáøû‡úçí�-ζJ`»ð"÷w MaÀf˜vøÄò2c&ÈW #S�¢�ÕofаŠÊ|ý"}¯ ¿„þ'7Ð>TT&gú>Å §ŸÎ›èQÈÅ­Óç:€æ¦Ñ‡'“÷0[ác}f2ÆÜÇ“åyýuIBŠ5›'í+cïA£‰²>¢ÿZ3¯qµvö®×ç€Pö³vp7Ä0 „»U"„þ¢LÖ`<–vïQÑìé§(¼2ÝZÉÑéxx¡øÊÿ67îl^Yí0{ùX>†ŸEͨø|¼ºgöŸux³;ñ1fm˜ã+íÍã¹…‘�ŒŒÞäuÚ�üO“È×Ô0ïÜœ�‰î*ð*þ6[¼»XBxà1ºPG¼=p²YzÓ2úxïiÓÅüï»_³óŠŸ~Â;Yº=Ò¶-×ïãŒü’K¦uø÷iH»G‹ž\=þ¯ lüç>X÷–ÃG¤<†+ހ嗻!ühkÀ3¦mäC²l‚°ô ÐÍ•_'ñ™nçK@[  ú8eŧdÂþ=}ð…ú ‹›ðï ·#>$¢ÒõIá‚—�®šîS)üeÁÌÀÒú7¸š›A�þ^Ȇî~¹!Í5é¸È›¿4/¡² Æ�ý¾ôÑóŽE=(sY V»n´¯YCbu�Š�lü ¶­¤;9ŸLvwÀOâžúö¨‹eÇ‹š÷[ö¦®r<îµîŠóû*ÄY `Y–O†F¼†…›cÒº8¦&BF�½¬ßÍ}ÖÔgׇ­üÎß�0¯ïÛÉã˜ùJÅ ­¯€°kùÀ_Þ4\c2ÄÆ{²áÐfw’Gµw&Ö1’J@0àJÂT?ðó�^²£¸|ÄÔˆx8ªÏôνT›êvc&`Ì>‚ã"ûψZ„4ˆ[í°¹‚Ù Â[Ù´÷�&¼ˆ¼EƒƒT×|f#võȤ´9âwḼǟ˼I¾ûÊð€�z´þ (b�yvX¼(éëÜÖÜ£ö×ö9!´·°Ì%NøUGÝCFàë=Aû]íÊ>›BðhPÛc%D:7\Š�¬r8V`#;þ7 Oæ9<�–…»µ"sÓ–MŸÄêŽÉy‘‚!JçUc/�PÙÞ·µÃ\ëÍÑq°]bÅ¥ïNÆì׳ãCÏ€ Ãï}äÇšF¥J%]‚-µìza™ÃÓ†]ÖᣜmR‡œïÅ ¿ssŸ|'@ïi�‘RäHå¡ÇÑÿÌ0ÞÚþÃŒSÇÕI8,8ûùêèùùs6§á^Ô8� ûH?"ã@(aÉ{2f"5V5tŸó_š9[20TQîfÑê›Û—ŠAWG… ˆ Ô)lcF>Ë� 1‘ÏP5{?ËÚ†võH?‘×ë?X'K¿:­óGrw¢ª;/±<í{=9eñu®NÂãƶ$¦43kOgð¨7M¥íŠØ«00ñ�#…!$¹‰<[! …z ¾vhƒ%Ö°X܉à0ªVåSS7àZØæ½/íN‹Ë¢F�½Þýk®|̬®»Oº4:a)å­à¤?»o0ú÷Ík^¢"!¯-¤ØÆ²]ƒa{˜šó¹QË„hÍ>ãüçšÇ?Î:�ÿÖùœƒ§GVËïˆîñ5óö«LL ¾Ú†§‚æýMUÝÎ×7UÔsÙÈiˆžz=ù_¨hõK•Xd;MU-L4Ãm°¥ù¾ÎȦîFYQ x…~?ïÛÖÌí1ùˆ—Æ£qS¹¥7v×sZZµÁ�2ö%Ù"/)‰~<¬Ù†º¶´þÖ/2ÃùÓ7¬·¾oï{®rùnò§Žñ`2²ðĤK‹ní…aŸñàþ1éÊûȨÏ+¼EUc4ai“ÏžnÞõV­ï/‘G8Ý»�Çϧ€Â˜ÿOÕÂ5ÎÑ¥†4!@“¹+P2~uFi�1^ö¯Óíså¬%ž‡< ”GÖÖš6–|9YéÔÀêùãj]”>æ³Ç�‘rØSS½swq}lsÅÓ¸âï¤9~ùl93mrê‹Üá�šÞ1SĦۨY“;=\0õ2¸Æ¦ ‰˜ï˜Ô㳜ÎG|ÊÜçÖ$Õˆ¤VÖ(PÉ¢ic©ÔhË~Ǧœg¸8zî]Ï'9·6q©­ë0nÈ£´÷N˜C3CÓ¡)å!s«½oh3†«|¶Ð×n¢CxÙ—7�à ÓNÁloJÖú¹÷ÜüNÅÑ4OoDé¤áUa­ã½ Ú¹„ÁÐ1:k†×WC�¢t»~ÎQ¨xxI!¯¯ÎþoDZØÏèž“­œC°6W'k ÑX@jOú5¬÷Þë}�:}‘8gCn¦Ù¹Íyw&CÙÆ}U¸ˆUigmnœær¡´œÎ¡DLJ2·ôÉ>Ÿ%Z½ÿ‚r%þÕOCÌòž°ñx@þoÇôòöÁiÙ.æ£ÙÿÌôú‡ùÅ !`^�g^iéð{,“w(Ÿ1ÞwN�·†:bòÓ›äóRÌ @�%�‰Ä8¢�òýoÏëÐãº3ïã×>~§·ÕÍeÁxTpª,�Ì :Ê6=ÓA^ô”â1nú|]ÙŠ4Î5Iø³Ê@8ä¼$"û@Š8Ÿ”ñ®s P¨… &‡“Ð+bõøbŽ<¹È¿Ó à¤Åy¬+3Ë[fyMÞàn&m=—xULÊ÷¥Peàíx‘Ò£Œ|®ªèli�0žö«”iLí'ÓŽ�÷‹ÐèKzaþ¡Í(ë|D]ïú«gŵÊ*¯´üEðÖ(4ÎrBŸïØ�ú525–Ã×aâN‡ã]úñB½1¡ ¯¶yò|XrÚíi³Ï½ØÈç�iß—)5,»J§\ ߌ˜Ë�¤ƒàj2ºŸãºÈð o÷J8Žëû©ÝkÃsàéTZÂ'f`¾|¢ôß>‹sQ˜4qÙŽºàÜf¬ú§JE Å%G·"oÒJdþæ£U�W¨§çŸ7xÑ×VÎ{Y]pÈA[^–Ôð´Í.bÐb´¶Ù ã­ÿ ƒ„F iA�S¦IúÓGO±2£„/MJz¬q´ï‰ƒârãGœý¯ )P4/(,†aԥןÿ†¸ Ï<‚MxPsîßнÇ�d¡_Údo퉵ø�ÏÅÅ‘S¼>P¾"�š(ã®ôe�³6/¶9·G@ê£%ùµÓÊ‘\™mpßâ¢ùD½s ÁíÔ9„Gtþ!”¿9ÁõóÜybä:÷àù¤•A&¦}ø“äŒÏ2êç]àÇcó¡ÓÏ{:ÐÉŒ¹p™�ƒÜßÌIF5 SGu>v0y>hwÎ\^ƒ… „*�ðoDÔ‚P ÙõK¾`L¹ O}�*;äÁä´�Åëtç%:¡–O}ò!=n@*׋ٌ6g Ä´.FµCGþ‘s–t÷íì d|8yû@C9ò:G˜¦ø% ÓÔ@¤“"ß¡õY£øº#BZfÐ×¾m�¬q4þ•,Å ßY!ŒÙ»ãèF�@CûПŽf_#›]g8#ÍlƪdõñÁl _b| yÞ¨Ñ�þá?É­à¨Ù»È¯tÚ}6Õ>¼°o�ë*ÿm§eŠ7Ôe¾#' A-¾o&�Q€Â¼¸›ª5ZR뤳a+Œ ­êêqš2(Âö$*äº+“ó7cah{ÍètΑ†ßÔLÕYi|凓ÉfG,þ<û‰>J]“áè<Pï ì@ÀF@ýÍ Â…À7Î9¼é·Ùm)œAzkæjlsS~£{ÁƒÁ¿šéÓõ{¿Ô•g5Ù ÒÈWÉâÅ ´7M!ØêßEbîôË©S:]OÔ1?˜�…«V�=ÇŒ˜ó~ð( µqkq£'ÿ!¶ä.§bž«4Ôê ¢>@¨W¢Üײ\óOÌ5œz¬�£Ð@pûãö¾ÜŽÜuñ­�› Bq¶ú·^wn‘ØèÖûsfãË"9>¸±Ÿ�ž7êôÖ®ºÎâç÷†ÒÂÖg_%½bÄ,æ'ü{é¤j±ýj75 ¯U˜Òo†¬¸á® ï*jú²VE|{jËœ£"Ãý¿&,¨÷í½ázoË¥¬L,ª÷6&äVW$±{›¤Þ?2CÀá”Ì1—O€�÷¾Øc>œôõÐ~GJ8vlÎ7?á¾çf_(î^yÀ;ùÚSøôã¯B÷ñ¢Ïº“Å¿S¿±»�ÙǾ²DC}ùðÜ6óø<ÇýÄldW0 É€æ@< ·_#Êþn¡ƒ�ß­}ýøäòøs“‹ÕáVÌÌ›mFZªŽQåú#5ƒç¨«vIXœ0EˆW ·ö¼…ómÐk‘e,ª¢²/ÊRH‚›RNM$Ä Œ›ÿõþ^t4]�;Þçå#&ðZA£õ@÷È¡£l„MV8Ù6‡f�Oü½~Ÿ??Ÿ·ÇÇZßYPc‚‚ D Ý¬Vs…'ØIç‡D‚È :bƱ¡ƒœ>È“‡,9ÈlÑÆ á¶h�¯eÖP®e!ï3錟ñ¼hŠ£lCq†Ãq ña½æF<cÃÁ^c+ ç�´/ih+F 0`˜8 e)™üÃbÁ·Å™É)´Æ ‡Ô0mLWzÕÆYþkMf_]|²8«Ôvuw&èêzÏ‹Òço›àÞés<ú®¥Q7Ø3l÷šëz$,shëˆMÜ>ü„¥¤;_™YI¶_|MøŸ8¢šïÕ`ï¹î‘”.kž»’ ¨�€9'Ô“yÞJ=¥q&ö9@Dœm{Ú¼ÒÖ)£ªœ1[HáËl'Ù 7AÌ«ÅHtVßcžh¸bí(Ø óÔ£WB´.ö¦Û΋öÎM9çFÅtæþX�êqß�'•Õ°‘÷�ÑæŽ�Òp±DU�‚¯‹^îˆÄßµÈGÚ)í�º^cpˆæz)E¹3Ò Áš^š­‚Ë GMjý¦m]^9Û(ï»Î½:ûƒï¿0à5½‘A˜1�1»ö*õÂæ+Jkw¢_iÓˆÍ8¦ p¾,‡Í¶465pÞêQ­«]ïŸ*sìÇi(çà#°5$ 3€ +*Í)öë]Qcˆ=tú±<Ý€në\|ÈXÀ};àV Ã]ŽN®Ô´@aÕ¥á&ugYPkÐŒhK ©^*‡÷©lO~ûÈ,Ð8éB «ý±¦” Ñœûö*®ºÿ„ælnúÉR·®u§_Ù•?â,fÇ1õKöSeJcÙ1�à×kêÿ2ù‰ DE~€~ nÒãn#óg?‘ä1"©Âa”ÀÎEôê‰$÷gš"U¥ÑÂhÌ€L’•Œ(›5‹:Ê�øÅ#…CŽI#eд -;½íq(2¾;:!˜Éï&ÏoyÜy‘á ]ë[Ÿµ¢!:ñÞ€$zedŸ°:—ð÷ߌÆ/.»ñÍtÇŸ‘¾ësªO‡ÖæÌ*Òdœ» ˆ0!ê‡H�ÁH �_¸-ï¿‚ÄsTÞF7¦0\v|æAI}dÔÐM<þÁRÕ³Á€ù?™†žô%nëž[Ö¶@ÇÙ^2ÕùÿÄ Ó¹»ñ™‹f•V ”G §ä„Ämsó8C€'32€d@>çZþÊ Äsœÿn¼Κ{ÐwMÛnÉ\#�ÊSöJpn@oIý�;G1¶È'ù~Ìj|3O;ÄÀ@‹£„–sªË+ñYæ�W|_hÞa“ŠLQß`µX6ýà,¥) @RJMgÍpUe—Îüa.,‹™ê¼S4Qî€0!ÐaV��ä8Þ•H\äÇE‹ßI¥þŸO¦E2ýµþ­Û|×ÍÖô¢ `Âz“~8ÚT§_AÇ3’Àhñ�•¯™øvíÛIÄ:dhS( �ߎæî: Ò)$‰$�R HÔ*254àâÛ@¢sX¦FM ˜½£rÛßš‰XÍn`\êä67Z“È”uÿh˜¬ŒÂj£ð=Èådÿ~†×ïÞca^¾Ãrqߦ°Üžm¶ø¹ln«dáôsn½ 5@m§ñøÏ�{˜÷I‡;äñ_Ëôj;€ž §§‚GÎŽD§½†1‡Ûm`_‡œ‘Ä ñûfl„Ÿ¨½ÔùÅÚÕÓˆšW/¡!ô“?BŸ*6ldá ­Ú³†xWàÏ÷å¶Hïßq5”tÐ�~"‚BºÄíXjJ¼fg·#ౡgg‚9±sƒª¹`#BqEæ8�?f¬ùÁ@²¬‚.‰f·Â77ŒÞšiµÊ뉶—Þè<ßÈPÆÛxË‘¸“zP–‰’ˆsÝËyÇ ¼™8¨žÁøtsÈßh[ci¾Õ ÷�!_m(ƒ,Ì^Çí±œôKxæ°o7$è6÷¯8îœr t“}—¿/n'=WÈÆ6 jv¹÷Šé‰y•@tÈgÞv_D{£2ûJŸQd»HD,ĨǸ/Ô™£_Àó"Ìhê¬C²it�~uÃÂfÙ�Ÿ4ë.ê}&»�æ‹Õ›a1ÅfG.¡Ccj¶ºé…N`4Œ— 2UØ 1ÒÕÞ½#ZÖ¶á¦E®µ!°Z Ôd„ läm5óEQ:çòùF:#Ž÷‘TÿKÂŒc@•6›`Û¶£vÎ3âA®~Å6žÌòŠïçx*”±,Æ4ÛwÄŸO‹áƾ;íÍÕ¶Å«æÎ¿­gé�¿žc� à8‚åwb>œ‚À('�j~íÇ6<¨§È‰ °ª‘¿¾ç�ã?5{·†ÆúáÈ5ïüÐî?{�HuÆ0Íùœ£ô[rmÔÅõ¶@‰@/ï¶? ž n˜¢~‡À€æZ2&NVñ6˜Þ/]OM#C­U±9Íy½òßOJíPÓH7»·Q4¾.ÐÛw" ^býh ÷Ám¼¹¡ã\©Í…Dd5'C¦È`† ƒh8¶–2ÂTüÔä‹…ö¯8]Ýç\ðû@Ü à,'œ=,fb›úŸU¡”´+&b�ªÑç)Ý n¢Ï¯?'|Ÿ¯ã¢Œï(ÛQFÇm»â�Ø¿¸Ü^VK ˆÜ†nZæ;§ncš.sNí¹‚ƒoÚùùßÄïßøùÝ ä| �ÙûA $*'Œó¨2h¡W]NÁÖ¦êÄLbnüœ#Í?‚E}=¿¶&¼Wøû‡³ˆšæÞ^Á‹Pa¾§›äj°âL£9=³ùVrî ôiwXáTÞp'4äggÙÔ6r>•¶~Ô~/㕾":Éw¥ª¢”EúAýñÓóŽ×ü༠„»=k¿ò½jQ`™9„H{oíZÄéå^5xjé×DÔc}>äÊe:»ß¸w†^~\x…‹1—°ØúwWáaû.¬ƒºxïŸÃóéëöaGàÈýÑîÁ% ̘ö¬àEQ¬º04ü¢^<9 h]¬ÄÏ�­ÔôŒ7&Cþ²XÌS:.�nÉ% qCÛ^ÏóõÜ{÷þÀƒ Øä¢ƒ6ÓM¶6Ó9]Lñ�y¹ ?‚;?« VÙ*I°âÒø‡7‹…Âá鸫�`Ñ‘¸ä�78hJ|Qóâ»nùZ"S}šw  ³4’Qøw"WþºRÖXF [Â0<ëÆíH|Sp7Å%-nŸtT’–…IóÚgQ ß1GÓž'›D ™Ê¦r©Ë¼Ñß 2E«cÆ…‡�ðxq.GÌr$Âó’ö0i.àl%q›ØMÈx�Üølì¦mè·R Q]è5|iÚL®U¥µÆÐ�Õ¨´±•/–gKI +›ý�˃ò·¶ÆM©ç‹ˆŒÛ>¼Å~ ?{&ÂÞý:æü½ÁN=I¹dß“K_sþü ˆ¿þBX ¢M$€ür; Øzcu¯åû½oÍÎàÿÈ凕(P� �z<ßàñ�¿+°n»‡ý‰<,sTÀÉ 9J`V¡Âø™É]Èiˆ¼€¦©QžilÛšl ø…mNãÚç]be� µJ÷“Ûjè¦Ús…å\bƒ[è ‡Úõ¶g{N¬.-+ÝÉRE3^™FÈœî½?#º±IlPâ‡ÙrÄE37¬ó¹Òbníዉ¡u0ÁÙµ7˰Œ´Á‡çŒÁ½ð'Y\Ù>^Ràa£¤ èWô…aš„aDå”.\kEáéæiO| Â)6Ë/�ºKÑ á pAÇО¸ËdzIÏYl]LX\®qÒ‚B>!ƒ =1ÃÏÅ‹ïTJ±¢ûŸ˜Põÿ6lœ_Q“$ÔúÌ›6ð<öóc:´ìe9ˆgÇY#ù~ÎÚÔÙóKóÕôåÀísôDœ Ocè_‡�þ©x»jÆ¿«•ê_óN¯}—p-XëÏÙØ+oZªëÖM_C`Ìf}`€Ë` ,g•�èSÏ¢÷½’¸ƒ•½¯»qz¡–Õéø¢Ÿ#Ó¼;Ið$lÓ~y.T¹H†æ3Œ¦yÁ…cËŒîè€d-Ž@`baÖ¼ñm tu‡ëVÁ¾9¹âï 6u¢/¬t«~ loŽý]›ÞÇEÇ M{�ë¿{g„SWé±ZëN«æè^±ÏRù5žnOüIßž|¸±¹”8 —ýî4ƒc¾Ý?ÃQåéõ¼Vyèߦ,òD/.ã&®)üz„L©Î,Ï>ŸþŸ˜TyüÙ9Ÿyt?@O|®×ìùpûsM½­zÙïåš/Åßh2´xƒTp?5œ@β§�\¶ûl<ök˜úo!A°$Èâ|t\�ЙRQ}dM˜Ö€ˆñÚûñ©ïý&ø+¦öŽ›UÁÌjg:Ö/ ¶v¿ÃÏ ÁݨP yj¤ÈKÒ#g1ÌÆö¼2³ˆµáBH=Áƒ:Ât¹¿¯Iʯét|µ&p]]ܬ½�Wãm?O.ϵ¬r¦»Ó­²µÆyƒ’w‘‰s¤l#ÕZy"­'!mJMÅÄGk³õE“„8©¤Q¼ö´ÙÆ5j|Lfá&Bâ6× 3H×|L ÿ´»Œëüûwù¢NËg=Áó ðüª_¥›'L×™`j‰oÊò{ÊO–’m²‡X™K´û�TxèlGг2ܯU¹k"òntÃ�æ‹áÃRù�O“t`kÆ+]e?2‡žâ¯rPw™tZèá¨P”ÿ‘.m~b!ÚˆªÞmc;‰Ûa.zíÊÚçYu„áIiûÓOþŸ¯ƒúãd$ÇØˆ…ËöoëŒQê†oà¾QçýÌÀé׿Èí×£TÜs±±_‚�ŽðCÇ�»(Ϧ%½‡þ¤nv\|ÿ·7  jƒü¡Èå3¨�Ï®àÜì»,?Ù§µ®ésÓíLý�þ4üäˆêèɾ¥páûƒf :?6ÙçÇ'J­‰¡Ùx…ÿÑ«ô° ®ùh¦Ÿ£†Êã NÉUÏBï°\^‹ÂšÂÉ[ðzÃQnò`ºÄC†ßhãÿ×bE΀òÀßžt4¼`Îa9œ©¿Çð�§Ëžb~sH䉜ÀÈüuŸ~~¾Ã)ÏëÓ‚�÷³f€¢}(mbB{³†©žç`}Ž4žÐSv­Æ¼y,•ùîÓÌ÷Ï2aS¤>‰�TùÕîîë‰xÈÈôEƒ2|¦àfèÜz<Œ2 ÑÒ‡#6ÄâT&®C@é8Fò�¹Ÿ)„)ÛÁ^Ù¼× Ë¡ ÝR‘œÑ>þíïÑ´s&û,Ú…oìÆâB]µ]"¸þ�HvxG^5]ó›/Öv÷J"í/U_ù}ƒyç¨cßSVüRyð±2ß÷áÁ„|üs¡€G‚,JŒ¹¿àß}ñµdóµ÷Ý€[¸¬òÂ; `O”ïKdŒ‘šÏ(y6ܸzu¿¹<@JÆc_ÞèC>%µÌDoàK=ÈùN´wbT9k¾pœz¸ ƒ0ÆØqVPcJ½åyà˜Ksþ×+iUŸü‘9ÂYàÅ?6r'0&`M‚ÝÉÛö°ô˜ô³x|ZøÓÂ3©œóÜ$޲¢¢¢X4o´¤#'tÝÆ€s�E(çž_‚Nt;|߈¶›|ûí-w€÷kêçƼËДS ÌHaÏeñÎ_Hlp=ó°E¶Ò†Nã ­¿šÍ.ƒ�ì½…�‘ëÞ‚.Â"yåmǦúöß…Ž@Òßžpy*;¡‰àª.—¶<¹Æµ"†Ü1²ì0…$‰+…\ú´¹8žñÁƒ±éß1‘¸EØäjœsÜz±S¿bIJÁ¹>w½r{™9Ñò ¦ÍÌ2è? þ1®û ”öD“ï>FržZ#« v7Á!ËîœÚ’›s2W5%ó¹ ]ˆ^°l¦´°´MÎÙÕÐwÏ�÷^ÃÏ”¾µ�¢¾QD yªÐq¼v6óòe«Cæ`ÆŽvS�Ûýþd1•<œ(ü5ÜŒ0ù,¢þ‘_Ÿ"÷çìÔ ig­hÒv� ïb3|+‡š>_,JÚá¡�]„®¬¸�øQ(Ä3(p8Øó£óI·y¢ñª0Uccm¶ÆÛ Šõ“Rö]îRú$ïšÀÐXÒù³3ªÚdµÊüYñÐŒª° ”m!·Þg—äw@[©¢¥áJ{¢Ëާ…2!„šSiÛ+j,ÁØåÑ/±IÅÖ|ƒÆòØ3[N“&»TLêÈaL.Q´_&ýD4.]—ŒñG­°ã§Ü[Änù� ‘Vçlšð{¼žkR€H,xEP 2Ežq ÉAo~ß#êHÀ;�ƒ¢F%!—ì„èì)ôbþÎîˆþÚZVHy¼uŽÞðKØ=xïvüï“æ¼{ñ+ð%¶3mÖ—|HCoÏF4€úñ¢0m¿aP±–Ç�éôÕ‡9Üc”ÊmUrë7=}'�$'e½™ yh†g²ì�¾RØ×̰ìa®Æ F"ŒíÜÿ#‰±¯­ºù¿r0y£Å ³üÉ ÛT=‹Î‚èUzïkºñ`wþ+‹ùX"ÇðŠöÌŸ8G^‰{Þ�\prZ¢ñ;j�V!Lù •eŒ�Ü÷sÚvoòiG…þHKýη;"ÀwíÞÿ^9‡GÔ4ˆ6‚DXù8•ÆÖÕ«ÒËÕ’ NÕ98?‡_|’ÅÞÿ?SýP£Ý¡ºþÅ“òGIA û¸ç� T}Ÿi!’ å?l—ˆ Œh¯7;S¶Ïþ«Îë}jT!¸Î¤_ l‘Åf?k%í¾¡0o4f(a½[¸W‘º¤Ñ"|:iÄØž}¯?»ŽoÖ÷ýå’É'ÈþqŠ ùñüãïØƒ¬ù]þÓÜ•ÚæÍ¶›M�¤Ûclm±¼ï�RJ›}¬g«E•Šä¥}µRgùƇK£x0k¿Þ¿§ˆtü£�X@+å8¡CüàC©úæVû5ÆŽž�è£>ík‹?Þwë�9Z?s¯ï¨UŽq½ÿ ÷І7•£!Á¤a½Ñ» 3¨'@L´Øˆ!ÀÙâê»¶À46YßîŽ�/àfu±UáãÓOxŽŸ§X0êÓ†Å÷YÚO7èËã´È…_¯ωúÆýÍÏŠ7�ùÀ8—šÝÆÇG?™Ü�~F]9†,„�é ýêôDóœë˜»ÖûÜ}¡=Ï”Kç† Æ­j÷$9ôuçŠr»ÅrÉ^ñ§¶Þ†¬û~õH~h#ΑMBïx)HŽ›cci°k²™¥AàÒ£™â�x� j^ÓìàTö5€e%ÞÖ3aCEΩ™ü»'.„/þ€fÌ4*w=Ð7`T\hΓ–ì%¡!i oêfËÜ¿Ðoòd!äwŽ9z/˜Pð_‘ÿénÞ}Ä-ÇcN¾S¦Üx�€‘_úˆ¼¾Žß’¾fö¬mMXµ©ž¹ülög>TZÅw_DÓ7ð\ÿß›c¿3¡ßÙ0•Q=òŽï×fNþô·åøwÆ Ñ‡2ï^Ÿßæu"˜cþYðŽo÷÷÷þj!y½š¡»zñ'ÕÃ[‹qܦFWÓâ± ' 4Bˆ8$¹@Ü`„ZT¢¾™Q Ãé2>ÅTjøxX--mfd*)‚â©;~2µÄР(™kM¬ÊH, W²¿ß^ýþ÷ò–7¼«^¼8â� gç âÛBµâ…Ôå„ánrŒ0Ùÿ™'ÿãÿuÿmÏ8Š^±Ýl‚Fsú57Áó÷Í‚ÊZÕ¡„œq+õÕ•Ð_a©÷•×YÍ¿Ü+cJuˆ�J4åuÇ4sµ4Ÿ,Úû–Ó àÛ0í.T96Œ·¬åþˆÔm—>:g8aoÅUV„Šê¤È£UŸ)òÃoyÿí3i‰¥DÌ©á‡3µ^EÙ¥�)“*©ü©÷ª›ÍŠŽçéŒ]Y¨Y•NÄY™çÆJ¹¾ ^Â¥ß1­*KžX>�Î}=ÕKpüòqŽ37)+Gùž½à0ÀÃÈÆOyÎ`ó‹”E•Júâæû¥Ûn¬VàG9uXwÄ^$ð#‹hîÍ1BS�·s«MÅʣƧG¦SD]~¯W0“çìö›Nê óî½±8 ûæuâBUœJ< ¾3áá�p˜?•\½¢Îþ)`±XѯN÷ï !Ô­G:xÔ)ç@Ì"�‚°Þ[u=¨~œoM�²õqPËÆÆ”ïò´pcXIbÏH8°÷½‰ T}ìüâ1'žŸòöGµ€£ nâPâK`ÃV>”#(â0`àpb¹ÜݽÏ�çÀ=æÕ7‰¨d¹»¬éOiV®0c`ÐøVgŽoî(R=®x.‹%³¯ xäÊ;L‚É#ÝN·>·B�'½·™ìó¢‡q�ôß??o¾ùlj Wå~ÿ?kåx�#¹è4V`P∫ÛÔ‹2"*.pIRmE“K‰ ã{/�<ÀmÄÇù1°fñi™²¨8=ÄuÐÁ€`Íøôì¤UíXŒ9úZ¼oYÝî\7 jå #DŒ¥h–|¼üý9ïIïæD.ºèÜØ0ã[È®ŽîRo(ËßF¨øƒÌwœ X!¾�|¢@¸…½CÀutׯ_J…•ˆ‡Y½Ñ|· ‡Å’ cœâ<¡ú+òÔt¤e%mJŠq¥l�œÑá¤?lì3áv£›^Ôik;[ºèµÐðSIìeš° òŽ"¦GW¤ó槺óÞùé*ƒ'ªÊ¢Ù€×� QyŽ?D~诞¸ <¦¡Å~þ÷[wz»»Ìu|ãxÝ|<0r‘„(o—° ÿ+�òb+*RvÆ Uäo &:ÉNpâ°Grl®=Ál7ËÜòÔä8"KÍ“Ü!Ž'†zKÍ Á_›R韞š¡ƒTÞzðîoÃF,)­®nî�õ2»@†ÆÒÛo7šºÅ0tâ–Ïo(Ðn(ªm7¨*eŒ…¹‚@†q¥¸žüdEºñ‹±�„.ˆAÃò�ÆôÃÅðhp€ÑeÐk"÷H¯noÉ#Ê£ÍßÛîãä�–¿[èh³Ë´ ÇÑ\qÙ]).W8¤Žþt°£Úûà‡£#®Ì#çÔî˜GžŸÂA$ó�GÈ\ºŽsÓô4˜"3#,[c-~Á‹=Äá^jÓYÒjšÅ·Û’›è�Uƒi°Óÿœpü'o*òm¾<. Qáî4ºf9@Ôz`8Ž&œwxVÐ{ÄÙ,D{è;ЬtUáNÀ®˜·C¨ÁîµÝ»¿Æû!iÆ`BëqÏV:±$¬ÀöRIKHm0 øRþg ®@°Á´ÚAï|«Æk£@ùuÀv#`MßÞ|/“[åëà#CÞóÉç (îùé;@ Ž%–®¢¯�›÷¸s3t7˜lE庂å·lçÜ@~ï,6 +òÉhæ±C�Ìñß!ÆU ø±mõq¨¥É ÉÇ2Çž�RjøA‡gteß½qÕÎàlXË#,?‡ \y„ÛÆO�Ÿ8ƨ›s-c‚ä>�[>x¢…ëðûz|ê‘&ȰƻæPÍ×yù†¼ ž²�·ˆ; '¯xœ^¨³q�gôzP` »+rÁ£ë3¬Þ»¦ågy9# tâ›íœãVAæ%ûü$‹UHãÈõ×6! ­±�±°m´ÛI<ñb½;¿$™ïVÄ×ê�vß~G‰ÚŒÈªbׇ ;ö[ K( ].Â2Óq1ž yÖ"…zeAH "~@Ø~pZ)xÉBWwí×^WÚ ½:°S±áíj×Y¢H¦?øá[�‰Y5úB=냒ù§WZh¥™Æ—F  é(.~{ö¸²â;¹ü? øXä‰^a”Íe)–ÌiiÑu£Í\˜«,k�@Ét¶³JÆT0qdÚ³ÈØ�îi'œïÉ3«íÎÆ%Š¥•§Ñ·Ö2ôI˜;Õ£‹5!­ñ™B‡TW@æöaµäcã÷Êâ&lõì3‹5ª¼wÃYÖ|[)¥XÐ$,ÿ�*h:ŽÌÞZái„oâG›‡_œDõËÙjTC ¡µ¸ÅR±KLŒI6ÓM¦/õû€éG Ÿ¦•sìm y°}’I÷îƒ0êÆ ^(SÛ ×Äj(üàæS³ÚI�-mâªMßI™yÔØËÙ3–¶9ƒ¹‘IÆðl4¶�¡ �¶ˆ —D�õ±Õ ¾ø�CŽÒ…ÐÌ&:Z|�,ÔBÜMßC’¤»ÌľXÈÈå�"à±$LdUƒñêÏOwñûýcûp¹Yxüäïÿ//«GB$„6—‡ññ±Ôª(”Ô*$XÐdQÏ‘Zn×o,c�xçÈÒðò© ! Þpcé¡¿“/¿+vmÚ<…änþÕvEãe^{ ö-�-«JúÎmyò³Ÿí½–ã9ɸ ãÔªH�‚i’Pù¯ö“GúÞþ1ü"È;¢8þ=nšá½Iý8pš¦oTO݉ÿ_§B°>o8îW›¶ÛmuÀ~Ï'·ž²o�¯o€´~ßB\l¶'nžµÇEÝØ‹9ßl*ò5LJM“›HÆlÈ�¿Ž=Bù«\Yl#  ÒŽ‘EŽâa[üóº¿Ã™jüOâ« A½ð4 HõƒyµOðɰÞþè)Pª¯‹Æš×§{®žÜbôÃ0D÷=|¶.x�°Èrúh€Ñ·TQá!_;yñyò»aðojŽîd7Üì·ñ×2‡gX®q„ðP¯çî^T˦çÐ@Cí��¢"ËmdwÁÞ³³¬çç@ú(ó;‚O9f¨GØ^c#›éŠÞ÷×Ù¬¬1r/NfiÎ(¸Cü™!�²µìôæð–u¿?• Ìá- Òu¶Æ~k†|ÌÌ Ý8vïµ|j'8š>¹rž«úÚà$µmÒ\S:“ñ^<�ú7’˸S÷Ác½g„7)Içë( b ðo÷®3ÈØ;gB#Ò ¥»PÇiÒ"(ñÒä¿#.ìƒ1øóÁ­�=„¡™Zþ�Ž\ íÂýÓåÒ#&7ö·jMÃúY�-GHí|ã¤tÂìM‘.QŽmÈÛ»®îÝÓ³ºÝÞöåàÚnÜ š4t342g|ø9Û�Ù›ôeiÒ�ÌØðÅá>caK•ªNÛg¦l¶culé ‡„þ±D?�ù¥ç�`Ë`òx“Bm¯&_à~ý4þ¯Àø¿—èþ¯ÏâÛîÁˆLg£Î—]³ív¸½Ø4 1ýaØFbò´ãFÍ?mÊôÉ]22@¼B°£à˜šÀûïØú[n‘�/ªí#€%Á£E·øùI¶?á0´Ã´óöµ©¶ó;?–êvïyå$?­³Á³J:‡ò¾¯ÑŒÄ>t}w×›ª-ÆïÞõ]¼y'Vrr4ÍÈy!reÁ®pžÛyí3Æ'ƒ�W êmƒ‚æ°7Ÿ3,ì†�O+Ζ€sݰn ¦ˆß”Žøª¦ö—§Þ�*SN÷:7õ�SìAˆ�‡» Á�:A£¨[pø9s4qU¸ Ÿ|7Œ¸U $³)´Æ¾È”²Â·öÞ{òþÇQGY‡�ÑüîXÚ˜Ûi³ògLÔí“€`ÝÑïL?(ÿÈÜ(7é*€8é·0ÚÊqËÞÈOqåÛ  %àùØÛ³htIý‹Ø|ƒw  |!&6ÑÃ0.ó�ª�º" Ò`7Ü!ELC¯½ûp·L——‰1H„…CvÕöþ6qíIdu27¿/t¼66i`Ùé„cÈ%‰Ó¯¸[lð¼_ª„vcî)‰ ÿõóh㬙¿ß�üÌ*=ë…%4J$wæfaVNr•¬é¿Â`QSÚåR-:0s%ScaºË0à¸.iéL—ëN—ƒÂTÇW:Æ”†fê,ì˜0©Egì i@¼È!¼mF"Ž¥mC…ø†Õ³Táª_…¹½�·9W*~HzÔ ¹�_ÝÖ)χ€¶Úgi…NÜ“2�M šOÿ‡—Õ€°ƒe½|¤~sðßPòŒF L=b¬Ã�Oßä†|toÄ"ëFú}�b›Š¢nªŠATHªŠkQ–ò~ƒùSÎ.4Á’§©ü5:eí£³sJÖ4~™dc‘ÅÒâ³Øc7hHÂ.RèõÉc2|uu~NMÍÜC^>€›lžS')«9Ò+Â±ÏÆò+/ÅHœœ �4_]eêkzÒzˆ=Ò´Âîum h¢_�¶ò¶ÕÕF�æ¸Ê °í,L3½6îåQo¼º¸s°ÍP¢\òõ;™ÂMùú9œ(�ðòÑî´CÁ¦Ñ=D*Ñ׫R›Èhi3Þ-}¼ÆëŒÖ9¥ÔÝ%gï­z}J¹é Ùw�Å _*÷Çd_u›Û ÍÌ™�:šß•H”ÂtÖ­”UÖ" ‹3qf­�»£ÝÂZÁYZøŠÿ,+'1~4ÎTÇÒô8«­ÆžÒ Ò;žØ´¥:]5V�"¼ý«|,À¼¼VNîM†jF<…®Hêäðaqë^�põ³a+Ž]ËÒÀ®v%ê¤y;=ç Uîå­«]™óŒ¨<eiÍýÇŒÌO9Æ¿ ã΢p¢�g‹Ä&-¡Ú¡f¯�;¨—›Ÿ'§Ëíuˆm «³0Â�ò?+˜åïúù¢ÍÒ×F¬s~™àk¸¶øÕo¡†Pe#ähj˱¢»Û‹È>2Ò9ó¹äQ´Aar©ŸoÓn˜�GK¬9_‘w…iÀ[Ï‘Í>|xl;Lgy‡˜k™EL¶Ñ±x“ìmòé‘3æ›8ÖtvÚ™” é¦ËU×�¬%c‡ÓÈ}Ÿ›˜c¾¶csŒM«4šèîÂi”{Se)‰5ˆ¹…Ѭ$gw:.Å�”ºcõÔ½¨Ìb9¢hC4GïÎ9Ýâ(B^(b#c““|s`÷/YÉæÒ Î‰ÌE6˜mdôÔBÒï¤j øò}œÂª}ÎåÝ÷ÖÝP–¼››Q)Ç;¦f�vëg¡˜ç(í'Kˆh7Ölç8•£¾Öû�œr#¥H:wvjWq’¹38jÂOÉ^ò|ÙÔ¾ýLiì•Wä¨mOT‹=ÌԇN."eYÇ7¯]0’•œFÓ,Úš7¬k[¢|¸�K¾ˆh*©2‘A…ëÒ{Afžú]ak¸Ü÷P|†ûÛ˜œó«ßNåI7¸²DÓ`ðL+¬Õs(j)ÛŠ0u”ºÜX`€ìçÝëbysLºN½Wþ¾«R cÃ_—% U:·0ºÀ»gkÍ´È3cŸg ·ª6qA rË fÿ=‰Tã8gIg Ë9öñî³æIÇY|â¾[¬ÐGj|âöv99©À–¬k™€»ƒ4›ê“\BÔÛ³©þ8Ê6åNc|ûx]Šj‰ß›|mJ6gi-™SW•mIˆ­è»–‹iqî tzpaðÄþ�‘çJ„¾ÿôhª{§ÜËÞ°°â6’9jÓÕlSóÈÆ{æŸ�¼ÞSrê‹õ³ºUzËj|»Õ xŠÛ’aL#Šâ$ž±¿µ1àÉß � *n>ÏÙ«ä_q8wµâÈW ¹Ä]¬ëXv¶¡þCµTG2($a¨�·]ôîΜD{ìI0WUÑw5Õíµ59¬zé@Ìg^Q˲g¦¦@f|Å ÓAûaÛU·…Áº°*'ö¬œ‰êTÇŒBªVÝk)¬&ê%“7U®Ó]+­§rŠg-ymšŽº•s†þ×w«m®û¦®b›uÐC±TõéY2œ~Ý…O’³¨Å4$2XÒ4À“˜SÕL«º÷Äv±ö¯Ë 7ëjùRêÑ£Ó(ƒz–‰™S G<7žÌôøjå3 ¿�;ÃR˲¨Ue6.OÚ×÷Û‡g$HPßý ü õì‡ÙM»ƒø0AÕánÑþ;qPÏbàò/oóžûöN\ 0óÿƒ!ÝÉ p¤>ò€ ’gqí}y‡ž£¢é|™™†TSS {CêUé=,V‚¨çá‹ÕS ï*H�I[_õQŠ)$¢ß¿kÆO3œxD¨m¤ÏjËók;3�ŽáÏKe%‰T[¡g&1<ÕjÀé$UB^¸€³ 2[[m¤�A¹Å¿ÞýŸ*=o\•×ÈIx®uæ P¸uCýõã+¼#­D3›8N¢{7=½v;1üïö�Ö™}¨çç>ÿõ�ÁŸ1…”À·Ðœ!ݯè?&K{%­ç6$89Y6ê¦C;);s´@_a`‹J¸'L༱°£¹é’˦ó)©m]Œ� 9™ ú>ç:¦‹�1#¹›ò$ê–FÚXQ*ËÒÝ»ç˜'Ü ÍÊŽ¥ÜÌÒç:9‰q±�…ÂXùÀƒqïMfÊarAËÕû:‰¦ÁØBWëãý<¬¢…Ÿ‚À÷­á`Å�*der¬Ð]ˆÄΑ>W÷É|�>àÎ@àë†ÝeÞîo{ÀEN ‰ÃÏ`O‡i¯¼ó^o�Ãàa‘L£�-£Aƒï¹Y…ñû…úuçÙÔ¸� ¼c(ïÇóË8ð‚�Fe×/ ûè„? 9¥‘Z¹w"O'xL�?zÒn/�(üjÕ¬¡•Ê ÈÁš ð^Ýs„àOúdRÜ:Dyù(Œ«/¥´³¢õb” mϰO´›s7·~÷\lÄØÚlN6©O‘«SsçÕKö"ŒmõH+œXéößHícª,ï¤f=IÚï÷j›fa fÕ†ÕV_ÓË+�‘è6ýïr»Ú|¼-ysnÌ>½3;�ýÅF Œ Žòô’v|ó¶mÛN/|`þ¬A¦S ÷ËÙÓÏŸ!ú3òåÄ ù”•x†à–žIÈöQóëϲɸs ôÐ+ßÙì*£¯°$MïÜïØÓ {oÞúí¥x65ÉüŸ3OxùÝ „R\˜ ÿ"ýÏ®ûæ>™�¾ ƒ„Ðê§ÏöreÏ�ó8æ¨Xù†CŠgÂIÄlwïL¢zÛDªÇk©Dô6yX½£ã»èá ´#Õ~w÷‰1ÿžm_;&W\ÖÕþ^áócœ¼'ÁZ9mW†PnºÛH59Vƒ¨ÐÔø-ö#YöX9]ÖÙƒû�“‘ßœ]Ð »NÇêá´gz˜ k‹QÎ9¬¯n ÷Û!—yÑ&cg9W*c Ç“'Ë'²]�Úàáýûš {™õÂøèƒ×w¿ß AÔ߯<ÎÔ_H'í7˜3]`F™mû…á±Ì«J¸p®{ï!y™òãž›øœ4q˜!3ç¸<â Åmuœæôä^ä6LI÷îÞÊtK�oØaê¨c¹Ó Ú„óÑðÓŽ†­" Àã<óze½áNjóòË21áu¼}èàPL¶"Ë©Åvzíîày¸…¦  ‰“Ùç~àÕã~o•‹Þó®ú´nâÏO}­íYÒ%éëÕèó0œL@ ­=<¥öPô·Z çLg;Ôíøñ­1Ufy”ù1JÌŒvguT�˜8]ê7DŸääçñƸ1¬®eñŽƒ#ýíç4³·ÃGÅKûo ù'Õô¿à“ûÑ“Éú¹Ó�Žeg‘™¬gÆáíwc¢~u^Ì´¹xó“³r–ÖûÛRb½H’í±���”N‚ ™%Ìöï]în¹©†# ÚÎ}ZɆ´nŽÛ3ÙÆu€ ·!²Hûõ7 ¬‹Ë9À=æXÂð=ß™vp?t´ÕÉEùþš�¯@ ºízý1Ÿ„ÌÌdÝùÞ´µWdwJŒ›clclm¶ÇÍd}"ùtÄiq±ƒ*Qæxá²›è³æ•ò €îâqjG�||AZ3/`ˆoCª2k†1q%—ì®xÑüË�[6ôÍýañ÷Ý�ˆ>šæu¬)²m“þuå®ï†p©×6gØ”Ì�4†«=kºÕ~$û®¦P¡³ª»$̙ߕ×õK ü]»Ÿš]¡8mäôýVHH–�7ý"d˜Ï¿´ež�–­Ÿï*ØÎþGTý[:*ë· ³–þø3æTÕ C¹ý¡ìO§àÛjiš~ ‚€-‰CŨ|„*cï”| ƒsx:Ñc4cÞuP–#ÚÇž)Hè°Á6·n!š5¯xÞ\ æ|$˜?}´$ >ô³†­LL¢br™×U =ˆõl&t—š‘Ñì`äÿß5ö±œYÆøªæA€†�JŸpvf7Ê™MëíŒ%˜§ø`\6ꀉÌ��CÈ £oì‹>c’þ?3÷‘Û1^k"H0¬p¾åß±*^� `û¨à¥Q„OY+ˆàùe›ƒ=_ß0îGÃ^7èöR�>yàUñÿ'êàÇÂà>Æ«—ºø9™­#Èà7Î3<=ÿÏ �Iñ•1È 1“þÄJ)‡?™ÚÙR=§ÎHOA£¬Ø¿Ùª`æLcC³œÿ£qFf>d=ÐêBíñå±ÎýõjðƆÓM«²1øðSšÂsÌz@à ãï5Îx ÎÖ“çX¾B¢�û†û•�”_zj2^ÞƒkÆ®áÀÏh^ pÈÌ÷½ÇÅàÉ@á€s¢Ø^XÿÐDÒvü[g�®q3vpÝXšÔ‰{Qîì:•Á×�‚XãÊh;�m�)”[æ€;í©×¼H\o4ûŠî~:òºC–dçéL£!½�'4)ùvl5ùCq+æ3hàó_@ÌŒ#΀ ÇzªY1æìL]ÈÜìI‘@�BÔ«DsÍ«eç»:Û¢šáT7ÄÜÛݬ.ͯŠéû³îkwõj ô“0€ý>yé`{øJŸšÃõý=ë”K�£û(Èp‘3â©I³ ©‡ïBõŒ›H¥êtö $¸Û2ô´ÝÀ¶‚ô@Q™‘àdú ¿t:…Ô=PS,47õÑŠ/$ŒI;رKb:ÕÍõÎcøÞñï¼�°v‰³Ë—ÈÒòÛCãê =/1¶yš³(`ˆ Á‚ì Œ„Pú%ñw¾6.¨Ë‚O«ÊùGOBu·ƒÞMðË—¢]7óüÝî1…_õEÉÖW“|`¡�*^§ÏM�îj”‰=+Ÿµï©çyñ‚_Ý™�5%‡Ì¦³Ë˜Xà¥6ßsDŸ³Ý€bzd³Y›÷ß·Ë3�a¹¶¿˜M{G½ž÷=£¯¡<†~yUPvf™Æ&Ìí/^ï3ª%è �³®n=]Ž$Xµ&£9àÿ1Rϳ#ìD nJAP1߸,‡,�*~ô°¡=Ÿ/|ÎÊ ˆõÈ£5Ðů0XZ»ÏOUC•‡Þ%›|²XfI¯5­ÏùC>Þ'Pmñ³ù×�6ªö†ƒQ€ý½1ò�à:¬DËà {¿{HÚÛYRÒ DÈ%y(³À° "á›LoÛûödM°ð£x™ú›ïD©ô=/›ù‡:ƒBn–){؆läÇtË(Iê2Kš;Õ˜ ‚uVúgÀžVa×\àOjX �U–¡æ\±ÕÇ Î\.«Ìç“ #‘Í3u¡DÑ÷»1¡¦no YñÙËŒÈu)LWT�(ì:‘+áÁí¡bW¸×`yyæÑ·û¿ãzd!YƒqøÔàÄ—Æ>›‰¸+Hk€àç:×(3š¹¤ô�&°g„5žX„ã99O}ëáŒê5¼8Ø~o¶OÂP1Ö>{­ñØVýrQ,ñ·Æ©×¬ÑD´Úm6ØØ61���ž.øè¬ í˜#4àÅÎÊŠ=*Íë|­ðÆ#DDTl¨`7 f+sšØŒç£¦zexઠßÙáh$÷P XÅt¯a%Ø·IF]31¿s§ˆC3HT@Ê*ú1åºvØt&Í�$C‰øà Ñ kƒ4 y‘!º‹QÙºçpØ8ÊgÞ_Q_vîYrª‡êàÆîS¹ÜºÚWÄ pÅýa� 7/.´ØÌW.�žNµ�tõâ¶�¸Ñq^l0]exË–hžyäÐKž'#ÕG‹õÿû‚DåÐ�ó$c~Ÿ°]úß/�ç\_Ó·ŒÞ/&Ñ¿�OÄ™4NŠË0µË³™&v•èÄmæ¼ê´y>f6éÍþ®Ô¼ÎßÚ™a®ûo”<¤.›F÷ÔžíÆ…cŒŸ±R:û ßFçD~u�´£urâ3Ó‹#Ú~Uñ·¿ŸìV[ñ«âXŸñðĆ�¿Í^NGà#Ç#öÅ­éÿ˜"áQH'¸!FaÊc0‡+$\æ²î2·÷¡&ÝÓÏÅìç¢PÆ“H�»Ã¿P­Ÿð?øWò‹ÓÈ¿}7ž½î|znI ¼e6!ê}"§€@ðˆFn„lÃðÇ Àø°ö¸§H‚_¶•$@)‘vœ{ÛõŠàR/{½‘{˜ÅzåÆ×Ð[!DAö++¶‘R½Ô"ž‹Ôá¸uÁÌÄÒHÜ_:œ…HB²ÉÓý`áu˜°œá¥Åñ›í¬ŒM!…“šø¦ ÔoÉHàÅöÙõ±¾Ý#äÁ× g±Ù¬¸ –Ð¥^%©Âo^ôS+Ä!8nfN‘¦àñIÏA¡ Ÿ@pEBZpüáXA­„´9|"—SG äÅÑT‘tPÐûÖ£ü&–|cÁjOø£}H¸/?Êg©ëVÀB€ûDDU.zC¶ÛÖŽ™É™x�×4Pèbªo‹:V­%eW.UEæú´Éâá�n>æâw¯>…_=ÇL³/µx ¤]Çóµ�¡‚É[ÖûQå”{àñŽ©@óÃ…®°¶4|`&8Ý‚ðü)ýH;ŽYB‰ !!{„˨SG„¥Bìgö9ŒÛäj˜^�ÕuüNLûA6aýŽ¡âz ÕÀ”ÅmÝœãJ�� ÆóÈ¢=Çoƒz—Ô$¸ˆÎÙŸ‰Ä‹m©DK šqÌœwا«Py¥C{L1ºè†”ÄQ\â–y7=!^ðçþ9ÿž(s/ó6Ái¯çûh,÷¤Æ!_lÙÈñ”B‡ñ(À‚Ñç}™ž–:;Ù]"tQ+v·Öò³˜å¢½ßê·\ûƒ�î²O™Q(‡Ü¹ùŸ ŽÄdDÇÓ’÷¥ïõhVZ³òÌt0?¦í¤2d$_Þ»à.�©&["DÐ3<˜ùRŒIf….çUxîGû⽓@=Ë`.8ó3úà¤d&…ßßN(3GúÏžü~xœoñ¿=¹Ç©öK(®'¥”&ð†�ÿjj“íß„Å÷86b&P7ê“€”™@�nÊœ�’ThñnFαZûOáëå³�ç6à/4þ·å$xÕsÎÁ¤³òAÛ'ÓÒïuö6„�µ´”ò7¢&A:Ъ6�é“^ƒ¢HŠ®qì†è¨É«jG�H‡øÿg'”SøÙŒ8Ñ�‘Ž]‚xùþ#}ç÷ AÅè·Žçuôywä7“n�¤’¡ ˜†A…÷MÜsYè¿ÁyéªöPÛ£ gßFnn¯=üJLRÑc¤TÚ4p;8ФàåÙƒQ× †(¡rj†EEV¹ML†¯èŽtc—ú,ë<€ÍÓU— .r¨5ࢰFJï\ð0�˜j[ÕÐq8ï”Q �†×@jQ½uéC‡P"Q˜oWú³ýÅqœQ¡€Ê“y™à’@TähI§Ff�Žë£!Ã�GèÝ0î{ þ\™ñ´|]îö¿]ßò/áÌ_É;¢ó˜ºÙ”DdFÍëSSˆ”–ƤxÙ�#)ê–¤¾Æäy)e9Á¤ŒÁk†s!7(•üWþ!a_ö«5öÞ„ž‹2¸±¨à¾™çm!ã:jÎW<8>¡ä¶Í[IŽÐ,¸Pàð(˜LS4Ö‹ÍzWGŒ�1· -$?п-‰Å³³ Æ7ôtî)‘-Ò”v×A5W|€ 4¸ä8T6Yå¹Ûåòþý±¶=eãwm�<±Æ�i®ûð±Êü&…ÐN°Räí‚®Q¥/gèçKÿI@ÔÇ%f-—¶jc#š¼3)W|- TùcGÚs›íKþÎ,°h/T{LdlEXì5\¬'ƉLæ &*›@ÐÑ%°K]rü¯·JÈÊ€9dÐü6äyþ…•¿u§™'Oôº r§ÚŠu:¯¾Oßx™ÑkÉ/:œ®.»Úkq¢üU†uÃÊ„„@ŒqúHû¿ò„(žïë.xîcûA$_CvXô'²û;ûñðȽê ñóá©¿8’ˆvú¿t…®‘Á=y| �kúýzhñ–cþÁÍGúI͸šm÷O¤«ÛÃvÚ Ò4r}Ë©ÊwWãúx×¥ç+Da:gTY¡_ØÇ=¿ÜY{?ÄŸ_VìKÖ€üÒsÒÙþmcw5«+jë�Ïö޳ö•6S×<•ñåï\¶ÿ*b>uмùà¹`•fa¶šãœ-gmFˆ¹ª*Ú5iQE™Í£Ù³ëè� ;ðŽlýû­ ©�¼˜UhK$as¦Ó ΑL€:=š»«Nâ›ñ‰ðÆVéJPlßÉ£C¸|ž¼DªU}Ã/Åþ›sjƒŒ±ð¼ì©‘bN§Êsše¤¢Y†þíJémóŃ—ÜôÑP9Mû^ò’4º”ŠÚ¸Ü‘ú-Tm’‘œ‰Mn”ås¾^Œ•º®±DgŸÛóc~»;�2 "¡9)÷ÝN³ž�ÛÁ®(˜ˆx|xúpp0äRª\ûÀÃÎs×zÓ€?Z’z¾Î®¸xC™sƒòß÷§[rþ„øJR†Œ²v”À:¡<ÆÃºTŒRàútµûå�Á´{H?×G›aZ.�RìÅœR šÊö–åJ$Ñꦺuù0ä”w)ðb7²è`Ÿ °èUõÉßý¡ ô-¶c‰Á Í̶k�5.6oÿ5°Ê¨E,™Ë©C²ÁêpÍ~nˆò^êê¸ð£�§¿®“ƒ‹q Ûèåš"xÑOŒÞA79Ãfž¢] eæg[œÐÍ# ©£âî"ÀäaYŠÞWqÈÓ÷§¯Ð¤Ð9ËÁ P{Ú ƒ÷c,¢s ‚₯–ß|~+ïQC€„9�UÅ´ŒX @ß»¢tÉUnB E*’BD„(@2?|açõ7ÛÏíÄí©\|`)žÔ qT(ýoa£i„S¼Š'šAûìÏÎÞ?�|W™¨ p‘ChG’ÿywž�ë""ü®t½Œè‘ )zBôœÿAÙ !ï ê:üZVgcôÑè‡èÊî,,»²ü?*fšI°‚Ú$Èçþ–Ø|Ü©$0½ì阣Nmæÿ"ÑÐuÒ[ݰU¿RßëÊTÚú€#œÄí{‚”ºßWÞ©lf!ìÛo¹P[p¥<¡µ¿Žñë/§}{Ÿ­úß�õû¿Mú 00�Rm¶›lMߪc�Wb÷â¶Ì”Ö§Y§OòÆt˜D{- ÐÄM ­ˆ×þ ²tiy«;íܶ†Át¹„œyX'b°Ô4�'ÎÒ”ã€I„˜íÇ~zT1¡ÍžÂ™û�;¾ùr'O×`cf3ÊPjiÀFi+C(a“Öiþóiƒk.Z:â+µ-ü“ÏV"úuÒH E³jÉè­¿#e×"9ÛÏ«¢3·wØI$-|}s}‚ )^‡7�emrt¦‚½gkL×ãl¥¨ç‹&Y™E´‘¶TNVàiέ*¹Ð{LEØß�D.Бg©’¡Zy²Jw�ìDEÈ,„n«;›Dø*Ž›[oìx4ÚHé¥664-Šš§‘ãÒ§šk_éot‘½PZvÐ_Øws=Xb"¬ftCJm÷áäo¶:Ùä3}ñÈ0¯6 üzÒ§˜ŽÃ}¼ô��àPô«0vWèc7‘�!3¿Öœx¹ò2G(¬ ^ŒOÙCÏ þ×ï½ÇÖ¯�õ¶d!®úq779UÔŒS°ÓØ]_³„r]iœèEQ ‡ô u!h .ÓK W°¾ÍŒqÎÛQ^0ˆ:«ú]/÷�N6àÖüÿJ½«Â#€¢2ï‹´Ãï ³£†àÂ2A*JÀ=¨@uÌE˜n6µ&¤ Sp ¯ò�»|°YëµæÜl½Â�iДìí‰×Ràõ Õ¯³ŠE#¤™Z !ìáaÀ ¹ìð;Sh6W€x?«ˆ!ãp ‡èÀÇÙ:/¶'Y `~.é€(�ÉJÎþ…¿ãË«A²!�Ѩ�ð  þ‘Î>ØG~‚Á÷`zÕë¦$€¯ tt $/×�¯‹�\�MÄ÷òˆÖ˜®ü]ÓOCTV9ƒ+ìý¦eY’D�Õx•+8©µÊ@0v/³¢�kß.’žÈG=é]Ä$nRÓŸ ‹ !.,μH²'Øb�éÊbN¨¥!1G$[‹ó‚Û¥)BiÏd…vv- æÝ™ fàGYH�£¬š#Åè wpž\|gPt¦÷�D#Î윥ÆloÂÒ?ðË„þ90¾:ÖœÑÄ×ò&ïèfŸ#ƒÈ<)~Êá!Ʊ×t²8Îä§0Ie¨ífûæ¬DtòmÞ¦K:Nð¬Ïóáj"ü 2”Ðbµó�+ÏU4žðfWÚâfŸÂ× YPT�:ä ±ž$]ïR¾i´Âù­ .–Ø}÷ª“h8�ŠAV~£ÀAÏE¹!cºÆõð�­ÌòWžÄgnO ³Ö"A„\÷�|à>`‡¦yçšÿ”ˆÜ®Ž4¢–Q.p‹0íðÛs"ùkiïè·¯:š…†„t%'»V­`Y¹XÚÈÂ4Eº=§‹…XïÐ…¨@Â^�¹JŠÉËS’1e.löÀ«2rúš��òe ¿†Ÿ×¬ç�Ñë§Eßò¶ƒÜ–*ñ ®îúÿÏ¡Fs¹F¸ÀˆC!§ÿmª;’p~ûÎŒ_> êߦY�²_sÞ­ "J5)ì¦û^Õ 1|¾+a<u¬È1N(³Qç4/€Æ6óÿ¢0“îŽG47¿ÈÞæF"!ƒÇù—ì £°Pãfåsü”>ü#[ט¹ºa 3îú!RÝ„ùž� ùN¶�j/yÜçž+yŬA–›•ür|U4/ˆlm¶Á´{G„«üu¾®0ß4çœ#†$–qÍænþJÛTäƒï߇Û%Õ¡FN+�"º&k as‘jBd¨!M�Í¡b"”¹×‡ú/P—|Ç�¸mùô_¼Z¿º3ݸ‚*e–u´6]ñɯ¿•*lIgÏeÚõRÛ·×äõZ�w ·}GÞ´u‰ƒÍ’°'˲]/“d8øxó«èʲã\P"d9jXÿ˜Ëœy¿\MÙŠ ËXlQL ÇÌÊ� �UI'n¤¥㉘%�¿�Åb}®n^ÐW^ öÝ϶ãDf°É²xSt.’ðMX¥ûª‹Õ¹†á�2Ó¡æÄ’ë¿Qñìõ8•ä•¶;ÜJÚØgpç1 -*‡©ýì_{w=ùœ¹Òñ·QyY6^]½e¼oW]þû¸ý;bË�”ޅΛ7ü|5lg=þ?=3‡V>m”{Ñ{œIóƒ¿\®Æô̘mXäÌ�åûãR2l2ÂLê0G88ZÈ¢ÇfàjN±¸Ÿ‰±å2-S[*Úb�Ý|¯ôÙŸ *MVuÃÍ÷þüH: B“[/,Jÿ9`e ñ$³æ @:æ‹ Ý„]ˆí̉|ÓFH5OÔoÂEBD�áDÏ ˆJ Úòcˆgr+_ßôè°AÈÏ�PÑ(‘ †/f°¤ž€�QyG’�_3˜vça¾Ä«†0ÜÑ�Ù÷&õó/g”{fˆ â¼þXÑ™Þ>ïaÓcÚÍ,Dµî«`W#JH4-|Ü�cW¾ÎúÏ›õý¡ÒÚïL|á8b�Q–b’69˜Fé:{™—.ö¤£v«ÎkA*{51Vú端Ü·@ÌȤAƒ5¶oÕî% ÃçÉ&èÖ³ZûÀBEú4'ÚgĬ"É ÷ûJ*¼Ùg~ êzãv|©bâ=3IS‹Ê-�´ƒ-³FÍXÍ“ت5�±­†¢ùØ.b3ÇxÐ>!Ö£äëFÁP Ž1SŸ5 ¢ÆÀÉpP‘ŸÉÚ'àì}2f‡TE:Ʊ)X¨º€âAÅzʵw� Ê´],©%7°~L¬™¤nGq¬8FoZ‚êE¶¸®¹5ö‹½n³Gº ©Qš’? ž*p®€B`;Ú’ìè{åïàâµ*ã…ˆ¥äg×r ºDR ÜÌÑ1‰&÷òÂñ4=Æ<êÇp�]Ù³ømV¯š@bsÑÔuœðiC�ypçôçCŽöøüÂ-sk„"°´Üà,]«µ`Š–ÙÕÄï ô}ÔÍýáŒÅ Ò–5 M«´E¿+¥ƒ¬ÕƒŠœµ�©™‘MU>6 Bûº«*™#¼Ïð0‚³-'â”3 ŠûÕ ç÷2ž†¾Ø„ÖgÑ÷Y 9‹®‚qŽ­Ë×ñ¨Û �5ás{í½� )Д*U‡ÆPêºÅöˆUcƒñ×9¿í(ÊÀŒPÇÝìÍô©5]d~æÂ.²ù bL ˜/¼]€& ›îgAÒ»ý¿¢€áü�a{C¸Ž?í¼Q¿$yŒŠ6 ËÓò¤´ÂA–sߎ~Ä å ù‡9dªg¡²\¥SÌñ¤}a¯M‰Ó|E§­²V”nÍ4©Û'Vqøãmý쥇Én*UTÛmð§ãíO;Lɨ�˱»`=ÜÄ‚1‘6·J'¨õôˆ¡8*_äûVúc±‡'ŠLp“}—¬¤ršbó‚œ�ë\å‘þ1x“L#޳À}Žèk~ËG›ˆ8Š ´ÓìËW ¦ªñ|aŒ×«äµs6'‡e«@½[]k¯³ÖP› ¾T°0@gðpUÁ›xǨš,Ì-‰ùé\qj ÷Bòž°fŒ‰g¼A t>v³œÍ±ŒGw¯¬RÁ�ü`~Î÷ÕF�šU4Êɰ“ĸ…Ä”4ÂЯ1ÿHŠt8UlI�FÁLÇ gçgôÓš+þÕuÒ´Cî·�\ .ˆIò‘~6�NÊõd4`³7Ã.2—˹ë©ùW|Îjõ;^c‹ £_^˜x|ñ¦â(IûH½«­*ƒ�fÉùù.gìF4®y_¢4mˆÕ;kX”ê7ˆÜâ¥k§Ën …šaÿÆa üÕ±5ªF�i (&r!3ÔF¼¥€{³M„–O]÷eÙÞ)ª@³1Þ0Ê�×3ª\„ gZõ×ieÕºªþE›A×O…y¹�c‰�Ôgá¨bkû%c!Ö>蟭™¦9…'-ál`“3`YàµúÁ�×)ú)­r3(þXþr±àóÎ�k†h不ÂI†gZ¸;‡¦,±€¹&C±g¸•žž±�«  `víË®cÒaÌ(÷ÑìjÊ\Ç%G\Û£ÕC2sL±h^e¨¾‚°Å–b…Ôä†>¶;l;ß]޳/‡-oáð¼$Ù?$aü¾=˜ÃÍ4 ±|ÛšêUjsE8s*­\nf:òh·‡¤ bG!·Á  Ÿ6Å•-¼FñÈÆÖßÅ7¾÷î¶­Ö»ƒi‰Y,ê ªØêEZæ\ŽC%JÖ²œÞ‰pR ç†uÏu ˆãjm-9…¬âº°ŸP:,0¢8Nw±ˆÌÿׄÍ÷7Ålé2iZ™ suzhhLá ßjJgš=¨G¡5”Ñ å)ÿŸ ‡ˆE=[1_à8EëžýXúñR›ã½'ôˆEðD8, ¢¼5Y XÐ;seµ¸\jqÎÚ³³®‡®*~ð¼õ²š¯R rê˧2Œ¼i rçÈm>Ú±‹`Ö8J6xÅ3GXa;]žôÈK�t[Œœí‰u˜€~ Þ¾ñÜm=¿Œ/Ý“ Ž#ã%®ØCVdÌUä!8‰ y^` mª"/uÈì¿®ñèýîµ±‹·8køÛ)–àWdC(öD4‚^• b$‹ fC„ À7¿£9ió/œÆžÏòqÝøXçJõrǰAóÃãö° ¾rÌŸ2 ¯_Ë\¹fœxE †Ó 4�Ý*D‰Y¿P—‹~Œ>¸” 8]lüLãß.k{ƒIâA§³R<=xz]Œ13`OƒÀÈcYæÉý0µU¼Ø xžìf¨³™…h„$F@ߪ0§æbQÈ»ßj³¥h…/ª]ÛkàØXŒ[¸NñµDï¼­y¡MKŠñ�–O�ö4 Ôa}"t ªn¿Cêì}KMrPH ¡GRPÆn÷¸4„m<> ô™4ð%sÚ•µ¸ÍÔöº$ô þ\[;2¤™ç·æL`c Ž ’Ó‘”Äÿ°—ÁÛ*ùy³˜›FÅþspí!Áî;JSÂî´º›‚¼Ç( ?B< S#ÿDö–ñê Ž~:³øqtŽ[¨¢¥%Ì7ŒéJÑÌv²ÈkÿOà9è›…S×Qñõ2ÿ²ƒrz¿§£ÓgkoóG7yñnÏG¥VéÎ)ÖÒ1·¥míó†]éX›p¹ê8]Eo™Y“�l˜]nòqšFéÛa5–\v¸õ5ÈMäqÍr#ª“=Õð2‹äf çþ¥©qu‘Ͳ.‘�u™ÿ¹CŠ÷„ý¶ÚIÎQ’dfÏÏÜlsœ �µ�éb5„ÏtJ%á�ÔÒC\ü2ÅL°“¸¦]/çê„ÅÐÒ˜SéËyÑrŒvÆ“~«@4ûÛ§÷gÖ½Î�¬x¯˜ï˜Ãûõ¾‘ô}IgŒm¡Ñ5ríLÛ)té,¯ ·ê¾½©“}A«Á�¶@ó+·k¼#ÜnŽm™–Gg‰Bï’þvkšNb8¸Ûߘ—±4ÓÓ&<¼®OÊG9žcÍ:¬/Ï]{¬ž¶ýZ.Žù¼èþŠ®®îXGrXìÿËþ|„µ‚ñ†ß»‹ý"êf vOcàr.­á‘ ßíœÜË£ ¿‘óø�|fH ™ÀVä�˜2{¾\úÌ¢|eáýS=?ÛÉÃÊtàøWºwz~ÿ|ßRš’tÙ«T _éìçß^Ç·ÕZÒåC,^a#%¥0“´¾kñÓ*ñ%yÑiQõ<žý~RDëÝøzW—aÙl´5Øiß}¹ýúËü×�WƒNSÜIÍìSú÷/�I½SñÁoRÒ�ìá‘KÀÇY6#?§ÌM„AýðsU†{ùEíù«CY Ë™™™˜=$€}Ñó•ÏäwV7¨HÒuŒá‘Âe÷½9”§æhò£gÌ™âwAž‘:‰C©�ð¥tËÒðJíUEà#—‹I`Qc³ƒôè™È‚ÀÏ„QœÐ˜Â'žÈýðSãÄÖ–±oaÜÒ§ª{Üî_ZÞ6fs »I�ü’¹y!é"@æGŽÓ“F„˜„ÃóÏǶvóÎàU°!tAkUÞ ‡ öŠ‚Úɦi»0yÂÖ#?@·|�4¨!Dܦ†Úux:$PQñ ÐÈ’'š‘\úq1üü‡ßÌ“’Šû¶v ‰”µ\5À¬3¦µÀ˜~’á_Q“ˆ|.çCºüÖ ø–OÍu`†·ûòù�cÉêD€eÃÀm3Ĥ©³ý”Wî/Ã+û't­QÔ$@ІÛcb®1I·´öý“ ‘†ÓIÒ<òÛ…èIo¡ùÁ8QM$Ìa©D&¤ÉYO6Q†.ú`apÿênäìÕ¶&•—nGŸÂlDM ûú‡P¶,†` ×袤eÉŸYŠN98tª²7UÚüíKÔV˜™É)WŸ¡×™Ÿo¯0jµ¡†˜ÆÐØ.ï}}¿GA[Ý6¡ k6¿ñ%ÞNˆ°?âháï>eÞ2¤ôàŸ ÇS¥WüûÕ øw‰ºË§‘Hç-‘D€C‚èž9#u·_ï:(ýMzëf@xxÈõXºÍÓ.Ú?Þ¬ ¼1íSdÃ-€`÷âˆbYvQû=ݼN\\ŽÇ_r¼¬h2¼ò;GÌÎûíµÚÆÂbSÑPt]®®îÞÑ_°RçÖ…—TH.�X{µž@“Ïæq•mþ�¿ó‘gªôŠïL Ȉk}‘;P&ÝBõPÐoŠÍדo—o Z¹Q™ @çì#§t¬7ð_·ê×¼o:YR2r#àA]ÌŽXØõ3W£-*ëŒx�Ì"ÚsRcÖÀÛ6{*DíGo0Ìù´œ,ÛÕ™PlM7ͨ �Y�‘¼œlÛ¬§æÐ¡É•„bÿÍOF;߇œƒ|Ñs/»c‘5·}h+årºZJÀö§.dª'ŽÄ†˜fb '¥J"iuuáL}ì[Ï4,\ƒ:?0Hýå#ç­¸ôOƒW9©vk<êžI¯�ÇY[|ßÎÚý‘™$‘&RO·çñ÷í­tw£ ¨ËnAÀO1ñŒÀ_T ãËos‘’A‡á-![�ªqøbØ»®Î„ºÑ˜„Ÿ ÿµŠùžôúH’É7‹9´�¬__t_gØn ñ-ê“7ÜwmeóçˆÊlHK?+ âÏΧ—˵T²#ZÔwp"[½ÖÝBéþî´„$ï*”Ù hô5vþ{É`‚ú�fŠRf( y'~–UÎÖÚÝû¬á} k±±…þÑdÇ�ß‹î ä —E.¥‚ôIk¼[² Ö¤¹ ýð‡&Õ4;pØÆñ+Öq•.Ë ®F/±j£RX¶-Hêú›Sa4ÁKuq·±Þ¬¸73ª›`WÜVvcÙ+ã<È´;RP˜=Œö�A)o#JAì&üB‘¸»VxH^ƒœ>À„ôaL<Ãî$AX‡ÌBøèúç¬Öd™ï9"Z BÛÞ¾Úç Az"AèÞ¡ óÕ?;»Ÿóug0=8ÐzÌD÷­½Ÿf†Ã"~õ¼>Ù“×®¢g³^ÁïMæüôÑjüÑâÆzsg¹þG ßßaû%�_JYÀÇžò{(¾(±á:ÇUñÉ6ƒYp�¦{ú{õþ…Æ[øýfÝ¡|'üàZQ�l™¸;`PÖ‰ Ü™‘³`Ê«GY¡�rÝ·:#Ì÷Ï'×trº@‘»"�Kïy¨<Õ8ùÑqLV‰Èê“þ p¼#sQ±±’gaѰé0”ô´Œ‘µ7ʳã‰�ŸkþX~ú÷8¦fTo2wäM6ùo0;ùøÕ1i�O b%D=ìœÉw êK[òñ xŽ*|ö…”DD&¥ØÕ¨&äé�Ûíºå/; ,Z¤ÌÝøx¢XüÖ×Ç.ÄË5 Æ,‹©àT'8Î3Ý£\�=–ý±êH&Á•xô½YÔÞït«ì´>e<º „yø×üZ¦M�ƒ"3<Í—šû»ßãÉþ|ýÎÄüƒd5û°lvò#·C^n¬àÄ¥7¤~ 乪|¿¦}‚Và:þÇ™ƒÓéàð¾.EÍZ%ü]SFzÁÌñZÕÿ¿ Ïÿkqø€{mç8öËöÆ.Uy߀ †½`I!œ¶gç¬y,^ß©ðÔé¯ð 0©þ7æMØKd³0x»03'ò6žßÖì)•pp[„lòa EWÿ—ú`x2ÕÊ^PÞƒâk9wl>Ð>%½ôîô">_�‡æÞ5iXŸsj¿¯Üʰ‹ÜyH²UÏX¸ÿâ“„ÐbA Kz”¿´„œÄÆ0fʨ ²±\óO‘�³ÝÿÝS®Æíu®ñ®Ë˜ÃŠ5,6œ^>%²º®µ¢¾[‹Ô{;\3࿯8.‘øÃ×:Û}õîûc.�Ýxj7•=Ña‡ˆ  Æ`3žE4J£YÜ:_Iy„Æ> ŠI5iµAÔƒ �ÁÁ0 …‡€|¦:O5²”ÎF³˜fäôœ�ùäÞR ¬�@ ,ýÈŵÊÑÛOmtÄíÖ/?×ûE3’Ô8aß¶ZùçtÓ/žïÔqä¤?‰Y~èírªŸ�‡ÄCž8c"7fN~í³ØtkØæ¸5¯Gñw~ÏÞȯšNZ˜t†oc*;c““0<ûÑ%0=>쀦ñÑá×�Ý%¦zbç²Æ6–ñìxÿø©²ªÂ­. %ñ˜;^B9jãðÌw%{Þcj�ê`«ZØÆ6›Li&Ð ±°¥`ã¨]mý+Ð;Änó«ci©·!D7¡©/ïI0T&×v@ë56ª¾çlÈ;£8Á¸µ«¤"P333‰‘\ÀDÁï;¹³Ÿ�ÆùÓèŽÎ?4µëÛ?O˜ÎýÇC@óú¶?µ·Ã/µ/¯=¹¤žïÉœÒm£Ù›2º1‚ÊLJ:ñQÆ …‡ÀpŽ`oG�øq~îå¥Õ¼¸ý ¿¤aQ˜­ ðøÔ°q�š˜þj_Lxa(#º'ˆJk»Ï.fL=x¿®�UvxÂY•1—Û0Õ[¬wÇâl>[TAÍ:gOñYg–ìì’F}Õp»:Åø` ƒÞPjüö xïŒ&’æxV€:ñÇÒ0îFžSá]miuŽe²8å‡ûƺ·4Œ0ø|ÜÙž¢ÜSzaÀEA¾Õ XÅg}ƒÆåÊ¢¡T(|ÃNÔÒ¼Þö0žcòkc©€¼ÔÀï†Ã�êÍO èbÇ09Œ}�Oâ«Ã} %m @�d²fe¦÷ÂʰPåÏ‹e]c"34Þ—šÉަoÕMð¸à6C`^bR@d5×±Õ!.þG”ÜÔóùÆß8Uä÷�jÇ©5z˜œr4KHf˜ØÑ§Xá3[ks’ z‰5å#§íÎgf˰èqyÉy1ˆ\äÌÉó4f#ûÜ©ïH¾¦ÀæÝ‘Yë�Ù‘ƒ½\âÏÂt�¾µîÑ-íäëË{µ£xU§:ÒŽ„3iVݵê.'ß�å!<Š wíid b VÃ6�ªê”ª:yQ€cTÐeŽ]L‚`î¨ÐÌíÛ9½‹X�nVÇ1eÈ L¹[Ò}XTö :wt¬WÜ>yéaϘÁFÞq#Ï}°ð©Y_qŠÅÁŠS­)#ÔáFì^ˆ¯ õ×ñûýOðmÙO¼)¿T ŰêE‚öîêòU]F§ã•Ã@xËueQˉ¦Ý^)´'VÖÉPÜT:£ÌE‚4 `.F„-¡•¿6™ šúxñó!7¦Ó^å éÆ oG÷Ûˆõ¡U�§1‹ŠÆ kí~}·Ç¾›ò½Ëò±·åB·Û7XF£6ÛÏlXÈ0áæ¶ÿ Íè,aG½µ(‡j0Ãi”v½}R d0'Ê\ƒ|ØÁñl†¹@©k3…ß%V‚ø«á7À®×&[T°™°Ž`ë±J™I¬/v{ e�wÝ&ë³x–Ð÷QÜ=ò<}wt~ú8Ù7¿ÏŽ£ ñk[’£Ãxa°Ô·Oߌ##2g<]´ê”Ð- >0lª»®þLN²Ó«0«–�c`üx|zm2Žr7ÞïéŸ;3ôñ÷Ú¾§M¯Uàb�ÝX]ËMŒå¥é Õ¬rbwlµö8�ª^áx»Opl<éu;îKyö<ä¯?„ó§ñ ×EíuÀœÔ Ì ažáFϱr¸YÂ(1ãDÌÃ…P†<ö´:õ¦UÓÔbV¾7<4Çu›ùÆa´,ͳå3¦i3{|ï®T‚“–m¶7†ÿ?èc±fD?Œ ´=˜ZýKõôÍþïOCV °£Å¶=µI*’S>�㤠¡œ”ë—Ge4…9‘³ª"1Í·[ã“s÷ßÞPqáŒù…�ƒG™l›ï>Óƒ‡ƒ0}×´iwikÓWý’“)ñ̼Qà]@–â“kÁÏf?J6ÌñëÖgÏ$—ÎèÆ"|@QžþÏQ÷Ï Î üÀéÓˆœFQ Ô¬úÎ*sÔ .�æçœ”/ÌIÁ ’>Û_G~&4j¥ÙC{ÑÀ*ÆÆÛi6666›`>y®uóplXIÓy9ã˜ß;÷M:j…:Äæu› š ôú �1àá®f0•¢Á‘ýó¢}BÍ•A{é�¯çnŸZú1m½|9RS9õ1p€M©~?n„D�l~°¸¿�ÎFMËbêÍÁŠÉÓùûàiÙÊŽÿ°Ñ=u7ÜYÆRY•Ok‡v daŒX À¦Ï:ìÈ„BOæx9¢~G/‡äžXþÖM˜_¼Æ‚Œm ߟk.Vdn›22#!›ÆžÆ ‚Q´ÛX‘§ª¢ÒèÄ&Ã/Mu–H`>ÆS2; ¤ˆ3»…º­iŒ5p%® 4>] $­ f) �èãG‰ñ�y$rzRpÊ8©¼I›è§ !J‘‚¸’}R•cs.�m{]9X\Twhœ4cñ²„ʨdÿ¾ìh±Ñ‘º4<†æÀx7RØ­÷5ŠW5K^5\ß6FÒ¿#óá�¦x ú¢ë«pjÙ#޾=P+cú6ÓäæF�¯Ã¡r¦kAr„HKõ –¹GD ‚ðx©œ®ºWÉþݳ°6ÒÆW�à¶Ç/]MçÏ.FŒÊ”üÊ÷°öïß5šùK#&Yìèíñ xÆMœ»Á´ß¼ÚŠ—›\ ÞÒk¤M붨x“3z§²n‰Œ81 ×r‹QÂS¾±p8B·’Ò¾¹ÎÌñÏZ¯{ÐÞG/-læð¯oP¶¢ÍPŽç" R8ëÈ6æM«ilkшÌçnÜ(…`y§.g8ákDIO©èżæ;te‹Y/ÒñMÙÐÏ�á¤kÊ%¡s\õî3S�ª§ú"Ñ„èÝgy �Lß;±oüË赑;×~¹Œ¬v‡¦å�E‹ãPÁþffþ£†ƒÏ*jþÕ¦ž!A{P.ª‹@¨‡ Ã˜² ¾þêïÔ66\®£í‡Æ!4�¾Ý¤�¿23%Œö-g ŽxÀüÄç5’×HxpÚc±w‚ï,%] ùôìŸÀÈ‚…@#hR+§ÖÉÁ÷®<Ù‘8~¡�ÅÎúù‘•î5»ðÂn‚X±³¶HM-‰ó[9FQánä1!‘Žù¶¸hT4¯ÕÀa‡šß2!ô›|æórµAmG†‰çd:YDàë1UÔseÊ’ª�2’ý�ÚûÈ­Kýì`| ÅÀOÃ+Ãûl¿n¸'u6ƒ"²6ÏM·Ü k–œ{üò^äÐP;�P „D`�|/66fcZ÷‘‡fŠñ‚]*º^!w:_Q³âc¶$æ^ù¼Áw/?*úѺûóýb‡ÅæãŠì ûXÅ|¹ž-q·� ÒKÃ3ª�Æ d÷YZsEtßé›èzý2žÃþ�íÐ}ŠŸö‰ÖŽÌÞßÌ‚œvWvÈn3ÐTç‡?íž½§vz¿�ëú~ÑX¯ß ÿÔóRƒ08òÕq0í�&ö>Žž ìüUáå¦_4e©¼0ú[»§€yF«.DPãñF€x kÁÖ_çë‰Îl�Ç/½À°úNûüäÇÃ/¯ë–Qì:½“²øÀôŽ0•”%Ùò{Ì(zÂ?ÔŒÎ"u¯ÍM7-vLi’×Û!d"ÿÖºgi·ÆhsöSQXqžz%“ 2ð64ríµ¸ÆCC÷ ¬º§þذw ÆqÆŒo_ê ÉÒ¤j²d×ȳšV4Ë£w-fÛQýo´GX™dªiˆZ�vÕu‚�µ‚}‰—A¼7†m¸~ÆBpا ä<è8I^ºY�.YýÖQŠÅ¬æ¸ÂËâ JSêkéa7á𺃟|—Èþ7ˆbC´ªÿ¢J�N݆ÃÒ�K'bÂÔ$ð™GÅÖ¦Dãþ[‚?›ØE„D²*}ˆ‚Ž¡uýS‰5P ;tç«ý€ª'»ã¢_Ÿ2Þ„?À}þ ìVĪAa-\†¶5py¦ÿ„ëú—bœüùÅï£�dhL‡ [°~îj¸iú>wm�¨"ŽÄ÷y 1�cZ†”‚ðÆ‚�ñ�N$š·£ÞÊDã¹YÒx‘ÈäÔ“ x9gU 7Üó+O#K5NáÌ8ÕáÙüò·`o£Æ dS« œ {�a^`W Ø9ÍÜ\J/•6žL ГW»Jl‚ ]Ÿ�¡ã‘#]²mç›ãÃ=WÈ›d€áèØ-ÎÅý¸+ï†H;¯±5šrÐ6T^õ9uÅ:Ó¬7X!(уh�:bóN9Ôu´®/XºÞ�q�é§Ír eXžÔí1K˜ÐÄÐá9æå;à ¹éApú>óÞaJË}% 0'.ußK™ûÑ)¿²Ãz…­´ócήÑ÷Š5GæÛ¥Æä–V�;6æ£!tŸUɵô·Ó‚O]y n— !‘ÂrÓcÇîËQµ‚›íF¸�Ë™¯2D¥I%ŒhÛv:­ TÖr_ÛÞ}®97ò¯PYÓÊsR \ a2A4éâ”’4¶h0A¤ªÈü-ÀäGÊ¿s‚ˆÉ{×wCÎ<ÜbÜFÛ`þXûï_|ÅvkgÇG²´ÌÝ °`jœÍ1Ê8UhçlbA= h|:Æ3ÀBBq4š�öϧQ–o\oIÔ-ÐûÛHš3xúú>W–³º|O£ÚP¹Ù£Ëùšàòë­Èù~ÑËp)Ô¬<¿Ðí[G>#s”tú^0wû“¬AÞ€¿Æþ¯v^3=ZnË#’„•EVmŒi·YÏ�r-r3k"Py°a¤.KØõ¢S‡±À>ît•G}ŽœáâÆÜ-ÏÛ·æiWm°f×Ýæ’zÀŠøÜ+°óHàÇMx%, ßÑŸ¨”«çk(Ràzuì,ÚsØö”ƒn^¶-K‰í ©ÂXÜrcÁŽ2^•±â+š¨P¬®ÞŸubõŒSìÅ~ùõÁÐÀ�Ž¡)›>�6�Á‡‡|_ã‘ëï3&ê2ŒwÜK�Ø2Bƒl{Š/ƒ=«?˜ÆwÚBŒMœ°�é‰À6�¯Å,W¬s¼ö1›]¤“KëIp‹º¨T¡Ñ¯<í��^#¿;œc£k�ßo9ÍUBû„` €£ÄØ›m €ÚÐx­RöóG»îf–‹Ï¼ÔÆõÒHÜgÄ<žvœ¤°µèÆ${Ä`©g‰£Õˆ^XöàVˆ³·Ñ 9ïžx²£l`úÛqg7½×\šBÙ‹ø|ºq6tRœñZqÖ&Æ“×ÇG‘ïÉ•3›òº4ÒÊuIv«ŠÎ-;ÁyUÕäÅ›?—¹ŽÅ=D¯»9�œ2¨3@wì·Õ>œ$2x£õ¢'+ ˜ŒDœáèõ5´˜Ô®5ßþBûþ-§0—)�F!5�Ü…„OØ’þvô< y0 Ũc;¥Dù$; 4‰šÖ¤¦e~ãðh³Û|ÄÀ=ðoô°lŠbL†¬Ù�ð¡Oà˼çUÆ�t¹Vç €sâp�¸ƒ—bA¬¤™‘ä Y¢°œÅØËuÏ †,€@mS#é"vß]W…ó±®Á�Œc{ó¼�‚¯mqŒ)í�ÊwóƒP½ÆUÉu½äµˆ¡ @÷w)kˆÅ­-MB• p‡‰Šß7Þv7’hmikIÂÉpj£c-¢1,Æ¡¾Ã4͸"ÆîQ”Þ/Á)œÑPo6/Y?O?X0MA�>õÿP×] Wñ�OÒ‚’6Qî›ÞG!2 óûûA_7(¾ö;!ÓèNtZ¾½™­VþêëH'gi›‚ƒØé³Ù¤J.¼b:»ŸªØMyûçi–˜ö‹ˆ±ó={bÇ;ë4ZŠOH[ ]ÌkÅ[kÖ—°’.Èê>{ºnvѰtÂ×Â)2øŠcD©r¹ÐU…_ ÕÇ�Å�ùÁTqkt�‡sgÔ¢#uO¬î ÿŵg¥÷ÿK&üþŸ]®ãc£sÁ/¸¾Šxþl>Ò  híQ‘íÜÇ&ÌvFû;Ýj?ÝH8ŠõYiаÃõôøw%Û^y¹%º]oßfèØkÞÚí9þ'=ßa¢Fëhé­s$�Óœf£)Õ_ZAGá Ðó£W¯�'øÍ'¯¬kÛ¾X÷)ò¿¸ýÜ¡ý拆ã%¦àMdЫ¾Œó»?qõyÐôïÍ{ƒ¡ŸŒ&[×g¹œb´ØË–ÇÇÈo¹½dHXû'÷ÞóÓL7OÎÛ‘)ÊH) žásŒHmŒÍ«z…@�çA@/9éÄ×`d`0ƒËFÐèm;Õf°/7îšã7â}ÓÔ—~_…e’ö €o,”38]É—í)0_øZ hK¯¦‡Õ†ßx’Á{9É ñ†28ôz $æüÞĦ¾o(Àq;Zeæ¼Å¾7؉±cŠx"A¦7@§žNžë9‚—ƒ`?6–„F/T×!üRðL¬ÆcCŒŠtb­ìšEK=¼Ý‹¯©Ÿñ;�ÝX³½¦8®È>4éñ�sÅÈ<\Ï?Qgɯò 9u<™?½ê ŒNEX~¨¨z8L{w§\ ´%i»:5 ¤0*°!È‚šk"VDe¯¦¹}¶˜ÎTâ‹~7ƒ«ómHÕ/ެ‹šËƒÄHOøˆ/ƒ`k\ÝÄ&3-­±û½÷!¸@+€ 3Ý`ûнÐJõö·e+³ ~ƒèzO \O‰Ø=°ÄÚÌR™;fCkjÁÛÖãޑϯ4©ýY}ÖÁñ÷û “§ �ôª 0= ­|ðÒÞ®8fÍ+N�æ×xЭ%²I`k!µx­:¸œ>Ä;gñí¢íôøÿÀKßìï+6GMºJR<Ì÷ÐÆœ²ðÓu´ï}ÈË´žOû"ÞŽ×h!ìÛÄej-P[‘„ÅõÛûßj|LzØ¡´•1fD¿�ͳƒýŽ’h‚G4Œ÷iwÕ‡sÝ�Ì}8)™€ç¿d$ô6óìÅ 6\ÔXb¡<�ªpß¼9ªŽ¬±†=\K CÄöÙ½>CÄ#™ Ç Eht »ŽW�3„ˆQ2.LY/ù‚–RH¶«ÉCø‰hÍÊì ÍEÂø$"Ÿá÷_Ãxwë»öq‡í*”5>hßÏÈÆg‡ÊnF¬øŸØ“‚b¢-3„B³^›ØEñ‘®a{]ÄÛ¾ä1»]�R®èÌ@§iTy5?–ÍZ]‹]¡tWçÊë"c="B A?«‰HT÷*lŸ,F*qVè%x�êým6ó‰ˆ5Xìùƒu\�jýDîŸJ`A•’¯njC4å?2bŠ.�£ëÅî®ü‡ÔD=têç§Pœ{äö?&iÅ®¢nŽ^i˜…ía$~ÚÃ¥W"ˆ³Ê�Zïí_r8æûÑüxÌç5G># ¼…©/š5Hx á´£ïwgA2«8¼àêjÝ™Áè\4;¿šAG“ÖQ¿¹/éã¹^V\Õ_�¸ëµgj¢ûPb”½Î�‰ûUÕ <: vO¸�)ðP:L®\ˆnCÙˆ^Ïãr2bÜö0`ÓV�‰Fo¡åøŽ}aECûjß$;Eö$�ÇsŽïïÈð²ñœý)øÐxz1LG”�óÆÅ_ }8ÌÇ{}-e¢p]‡&¦,d^LuÜ'aú¼|ù¥ôgï>Wd‹¸�„îSÆœÙí�°½2X¹æäpÄ$C -<�¬ƒLžÁŠL¦Îá³zÈÞ -[ Cq)òþÜœ°Pk As¦$2·ªd8|¥£èN¬w·°Ýæ2{© èßýá˜g}Ø{Púã c1Q˜‰¨�aˆº(pÏ‚Ç9 Zi±¶è¯¦Ø¦$:ú­ž›õÀ3Û×Vß÷Úð¿c˜ï󛝸U)Kóú­5$«*#ãÎÓÅtÂq^ÔŒö‡lz3å®·8ëgßÀsÈeŒµÅÝ„!¶æDB² E—�7ÌT < N›nüÜü>[§ŸÈZQvöѽlÿ W"}®N ýZÃeé†ÔÞ\P¹‹i¼çû;0։ꨅØÁL€DD@Ï`›I‚Ãÿ\x8y.ƒÎ÷æÛ’9b êN+¬k¢iL�ì�š•o ðõ˜%ÑFE¬£M-sÎN¶ôÛ�á÷5Ëͨ h°mß £}jÇkŒÌœÉ›[~Ä6|Úi8cš•Ïì½E÷;™˜Á®ŒÝ1�®4ÆúÄ„ãÞ²†-rã!ùª {ð5V¨B(—J½½@ôGoÉ –è>È£'�ÑèèЬëtÏ ”?Ú!ò@°Ä¡ÖÁÅà(LĈ¯z3‹4ÈkÌ sºIõp] Hj¢…¤ci°.D«£nnßÙÈ#Íxœ+Ð=:ùC˜œWó‡#H›µ?¾‘šÅòÌà†QõùÙñ™dÏ�I–°ujÆ7½ˆv±kïT¡-˜Ûccm¦ÀÝÊÉÆ1áð7Ã0Av½yd‰:i‰l|Ø“`߉HœÒºåoŒ~S£‘�ï2Yý»’¼à½Ãd1«ÍëÙ¿Üü1Y•w7ëo kÆF fH[kÑW—–èñFì#ûÁÃ^¿)¨P£€9�ð„u«Ë¯ >fNÂgƒ€;¶¸:÷ÎÉ¢ßnû&µHfi1ï/ /¹$Ç‚ólo+ ÊÝTì ¬Å¬Ø×ùý×0Üñ°,¦ �P»PÍb…°w2d¢²/�R›E&ELÞ#†,ãd§ì\°þæûÏ[ò-LJ ¨N¼udKÙ—râÃNùbûŸÛ…¶éhRi#îU Ö„ŽxàÙÙÄ«cE`|wæd(¾Oï±Íxa†ÕýãÓ’bÔ%Ñ$®»˜�(Ú;Wõç ² ì!€�~ù‹Ý 뜌`Æ� ƒ…ÇÚóö†²ž¤´Ð™ª'ºÜ“™ÅÕ8Kˆ÷cÙÓ-_Z­Ÿ«ŠÈ3µö1S)›A xvuzö”ŒÌ ™â�ˆz„¢]ÌTèjLÏÙê͹V›1ÛÀÔG�£L¡Ïž¶0ƒ¯ [^—_uc{íŒìÚÑ/ºnäò“{33Â&Ø.‡:ãžðô‡óŒL›+Žéjó¹°g{:VÃx 0»InpÚ°™Mà1øÎ&x Xnm¦^ÑÔ!C$ß±ë]Š8@( �ב~â+6>AíWªU™œgsj `ÚBwŒ¿)¶M«ÃZÎÅ::>ÜÌÑ…Ô� ºç‹ qEÀ7 ~5¬��6“馆 �²rêÐR7Àäã.P{tô3öÿo–®›ÉÇTð=ÔÇBò Kœ¦hu³ÖóSä÷¬\Ð?£§éæhqN)sã �Ðqpz›°sL$8R/éjušžaWž¯¾?áéû-fÈ ÂkK¿ß6”Ï9é:qçð^P—q�­»U¶ÞÛm…ß<÷? ­¦½ñm²AÌ2ójF<»k1¬³X #>›«(ÕÁíµ6vjvÿp·F•šñ=ÎÕ ¼ÿ­8lzº¦ä¨î$HÖÍç.&ýßµÄèírb�œÈ…¤@Hñ»c€ÍíϦªjù~WÏ 1_Àt¤ƒ&âvÄm{<ú³Š‡Ío¾öFŸ’»b–™ÆýͦéÕë—îðuù½À±/�“´a‹K´  ¡Æ¼y±NÐZšßǧHëäûï° îhOÑÙÎ�z08õíØŸ š<>Ž%ttÎÍ%ì«ÿ?ðÅÆüáHêg~ŠÚú@ôi~µ"a¾HG‘›ÎÂŨz¸þ‘‡fr¢G™PÞk“fƒâŸVuzèÇ…¹±³ÐÍryó9ìÎé#Ÿ75b¨nÛ˜Ã9çT뮎í9<'kšö•6�Æ~X˜® í:щcVS6×_:°‡‡\FlÆ8úÍ_xEI€Âz–dÅÈ�gDìÜš0D†‘‘¢„qÔimp] µw]»9&‰Ðªš¸ãnµSZ1)¹g/n¤’õØ%lº¥£.¨° Û…lö®Ùzç{±ójlëÏÚ½ÿÎàx럨‹ûÓ0Ï_.OJEè“T惕hÈRâ~¡¼»ûzÎ^YÉHßidé¶í÷OG?â@Ì‚wéý÷Û]BtÞ—‚Ñ}‹£y\ž5 yVLÐþo³�s\ÙÐC­,¾û‡8pãèX! A¯-Œo»n&ð²D–Á&aÀçì@�‹eÕX‡k-Á³7I@œ[ Í aª q&g¶³�±ç»Û¤#Ž+(ݱðøÃ5<æÛº6=)~Y6BâÏêû·_ë¤á6l憨ÛUÍ—‡h³Ý>åõ³3ßñÑæ±�`³)Wš}®‘,ï¤Ìž»¡‘ØH¤ó*PÒ±œ¼hð™LÈ se¶LÒB��¹Õ$•D›Õ]Wk¾Ø›ŒÏ£ žV(7TÜ8§¶ÿÞÜõ]c=®†½Äf0£“…³öÑf~ñ/Ì'çNã¸9ëïí1÷³žÐŒA�þ+|Ly]•¹æWeðó½iE�4¹Œ²Ê[-CýçÁ¯´âG¡âw�wžÖ•3† ?e´3/—g¯ô£â1ÿxF~fÝËO¡ˆ‰ÃÈÁÂ/}�#'W¤tÌƀ̕Ê9!A¸òp¨ À_woÇN£áƒ|ƒÞ È'䣞�ê!ýÚÖ¤–äJ:âß±Q yðVÔÝí¿ŸØÀzx„Ö·&ûD±vR(Îgx•-¹Îs‹r¥XkzÜåÛà8„o0s\Öw¬Ž4þ:`ÅQÔpæ ª<@w+ìH:•�Ä€ýp–­nÔ 2q“ð‰ ‹ÑÂj@v¥%Á€àèUàßÒ’Ú2Ÿ#xÞ4›‹T…]È£ œ¤Cï°éT›Z:Z× �Ä)±™™¼r)‰YË#—ZÛ€§çY^U+Ìäl··¾õ±êã�ÅùÿH^þîcñlæØév¹ÔÐcm lýÞÎ�Aƒd�AöK¿B ³Ú‘˜E/ݶûð6á3ʵYLtñã^6ø¹ f<âïôJ#.äAõ5¨Ó˜]Uqý(z#Çè1ÛøŸ àkÚúÚYý'g7ùâ/׆²·þ|“öŽF½lqýSÚºéµwÚªøÓÄÛÑÆ ¥ßÓ@ûy¼çºÑh9}2�Ã2í܉¡œÏ¶Ú{WKäê&ØvÓéZÕƒ `Á˜‘@¯ûÔõßoûtA°áÝT£T…ù†Ð(SîÁ_(#°êIT*™ŠaS�ýÂ�y|7ßÏñözõ!˜jÝÍèžÊ’¯¦.äLÊ!x¤é³ú†^ë3}x|Üe£IŽ RûkæÚ�Óß"XæoX„œE2 }lÏuUÕ�^/¬¸‘ gÍÍF¸ÒY¾Òe »ª³F¥mXŽ ÔRÆ¡4ÔƒÅiÙ�çh÷µÅo^¤ò b—2ØÌ¶UoI™c}ζó¢S±©ñ[nˆùd}wYëÖ™j0©žêéó\xxí]SeŸbÝmä0Ø7è–Û7tþg&ºzðoÖäW•^&:g„´q¯/ûMõ(=’Á…Dc/ÃVL3ÿI1 ëaÛd9 ?s÷:?FgÁ×é¾uÓìkÇÀð ·âø`üþóxÆ•MO wâÈ©ÖÖZœ¿k¯£ i“ߪnÒ¼9ncuÇUÃÚx­Ç=Õ1ù‰Üéñs®óŽøa­˜d4e:sbŸ� _Ç}˜z#ýÆ1ãpÉìKê`<Æ^Ž~ˆ@×î�é ĈºW鈟¦LòþÚÅ`¤Åþîç8QvÍ(I'àFŽ¿½œ{ï =½¸j¡ENÁ€•–† €T÷ôžÓ×Þå³\ßVóKÞ FhH‘€ý{OØ[âtÓ5Æ…¡ ¬¢ [«éïÝÆµ«`¯W]á]²Â`}m¯†¹7'£KP8þ{xwÎJžVñ“Ð×þ˜ö¯€û €ÀÔ€‡Ävê£}Üø»ð΋šôTÝ�÷Âɹÿ�¹êŒxh�Bx“µ}Ò»\L_ƒ8óõl‚ÔpñÌ#!ÏÃøDý„U\ìàñýç‘ÈÜ ±B"†ö0\£€†¡U 2Ă٠û¡½9Z:—Ò0:‡�gTœCa ­É·å¬m&�Q±£h¨ÅŒÆÜwÊááŸkjÔú3´¾n_uÝWû‰y;ãðâ ­ |²«ËkÊ^¡ÕV.©n”>)Òl‡K¡i¶h\,d…<˜JÜwÎEª‚Ã`avŒ5©¶‚Ô©N��•ïEÙ77߇�²�™˜Heš\9­/¹éÒh^3ÙaŠØ3@¡Í}ëæ.þÐ?"¶¨ÿ6ø@d?$ÀÕÑk.:BOޤ…é†2=ÿw™à×5<¼—«›6«nŽYG^˜W—ÑYxF �È]öÈF©ºÄ6+¡�âÂÅ›¡Çç+Ù"æcí!by¹Íbˆd1üˆkì]ú (/«÷1]Û{3€L !è =b-a+mŠõ‰íÓ§KLX×8*ˆ`Þ.9A#;°†�YÏnl?*®XHî“ÆÃ¿/""ÙÏ�2ÓTå¡JªÒ�,¬TÆÛÿˆX¯™ˆÕHrø²l~Xý`‘tqôÿµŽoý`ªšÎOi™3ŒÇt} ïD©¬Å$ç°äåf\à„Kºõ„ãtv¤ý­Ÿ Ôw±±:Ãk}ÑZîŸó8ü©~+Ã,Í¡;«u˜dž[|ÐxÉ�)”†ÆI·ýˆÃ ÑÔACÙHÖµ§Ófqs1“/ø\"•o¡T^6ï¢0[nîÍ  ¿ˆø�‹¸µí›5çz�Èùž!x_ãõBKÚo�ñ^ðdÜégà㋲-ŸŸŸÁù.B§±ÉÍÀá˜ø'Œº} Š�‰ÐzˆIÀ©{=óÜ¡G|TqyÛ-$DS^)IùÑBôEüäG×NYt~cl þ´ñ+`YuÞc?Ú|æÆ —�g!WƒKýjªØó³Ü#3‹¼ïÆåvhC)Õ|­020~ÖˆéÛ²m÷÷W×»Žwæ Ô]BR‰ï˜ L¹MbÇÃp…Œ¹2àø=bô&p€4ãxLc®µƒ¬Ãð¨DÏ Ó·}ò�‚&–Ï‹Á­ô÷œ ø™’£HÌëþ7ãv8 ™ 蕲Xð�òíR8I1Ÿái1ÁÕŠû%âhÞw]™›a±¢ f ÇP¶ ñžYã=~<Žj�ëåÚ&Ì#! öwoá|Ñž0a/ pçàÓ|ß^|X‘`O÷÷•Ò%båJîZºŒÖ°h XÏú?±8ÇaPv—óŽ�(µWÃ9AÅtvtlÌðdùŽŠ‰É‰¢<¸âW†¡íû”s‚éž|V(¯yVÇ|ù芥¹ºÇO‘ùË»´“Ò„·ÔÆ/ƒ•ÎÓðÝ7yçîi.£ÔðÓãùûÂÒTˉæÕxi�ªô¶×¢R9ôúü¢ ƒÒ”Œˆ»|8Õ/Ü4`ä)|�SD\_÷O@uï²|äòlsæu¥FHkg3»‰PÖ—Ë4÷Û79$†}ØÓ?/,„Óz÷1¨7»–]$X@�™켋ndjß9‡Î¯ ܲFXf²Â¦Š€ˆ'ÿÌPVI”ÖgÏ�‰Hè×€äŸüÿÿü8_‡Ï€P}ð@hP>�¥´HA@+@ö`Pô ¸€F‰*€ U@UÐËT¦´Ð0”ª4¦”:0éZ¦¨N`­P SF¨Ûk@ä`µµ°)NK€ê™[4ÊÀÐÛPMÞ¤-ï¯m¼�[ vè £¶RÉ€�Ó@:ÊèƒÄ­GR 6ztC ¡@ PÔ7 Öæ(�´AÑ  ‚€ë“¡£¢†š¦Û‹�°  ¹]­€@Ñ [4"l :E…—kXícªô w°E™òàpm€   �©éntÀ€ l`ÕS¢€`vµ:P"+ÛE ¥pzã� @ =;̯]¡ ÈQÓ¢Ox DžJØÒIZÔ*(«Ý€Ž V5ÐPmQ*!lh'(.á ª€ª6ÎŽ€š©U‰U ’©Ó¶¢šÚíÚ+E×Gn°k8”»  U@lP V�¢ÝÀ뎅º�È•*�!¡@ ÈZÝ…Nb9=I“�€%K`ÈÐPi¥°E°ÓtÝi„¯{¶{À&Û &Ú£¬ÜçT­wÀjb€P¥h˜ (’MÓÐP4©°‚¤H§¨d¨�ž „DA©¢§æ©“@Iê•!2)‰ hzd�¨HˆM�%I£@;/S�Ïþÿüÿóþ\ÙR¿ýV–«‰cEicýcø@X)jÓô³­ ^´¡4q ‚®)x)EŸº!(k4 Ò›¦·6Ü´k.f»®.åmÓ[vDZånÊ»5\Û]˜Ø”2mf´„Ä“]5ƒZ-r«›vŠUÍÆ ­**N’ “Fc&èªjV›ƒD•ÚºE¢Ú¢×-‚×L›Qª¹u$­u-)ZJå]$¥–Å¢¶+¤Ø¬Véª ¹£Y.ëµ\Ö×5³6äšã+d±hѶYµÓU&¬mk´Ö�ÍnjŠ6ºk\Å«•]’ckuÇQkXÛr¶b±r*Q»­®®—jÆÖ46²X¢ÔÊ ·M±wWm]r뎎uÖ¹vmb1�µÓnni-¢å[´¨­1²¶:]ÝS«ªÉUŠÝ±ª6¤µ£F0në¬UÉŒÚ;·kt©,msn˜µ%·fÛ»´îÛ‚[[–».vdÒZM¨¹W1¨ÒÊ®mÌj횺TmѲJ¸R¦¤Õ¹·-�iKE­¹[†ÛvVÛ–·M�ÙrÎí®&¡jå£RjÌ’ Û;¶¢®UE«•©¶ìªÜ¨«t´U×"¨5ºšèÊ“tÁj)5·i·e®frÎëDd-dµÝÑ‘"nåÝŽjÜÚ».–ÜfAÝÝ%ÝÝ[©[•.»F®¥Ij S®ë¬\Õt+–™ÒŠ®D©Ú9É–\Û±™$I»(·spŽ�ºÙ¦S‘-Nl¦3cwqÙ¸]]•ººNë®ÒI®¶në®î’»»Zê&›+4ºìd4À-I­Ó\éWeWév-qk·f†ÜM˜ƹ\ ±´G.”AÎ RwQ›wmv.ëFJ—uSÕÜí[¸Æ·H&º0ÒTº.Ö¹´ -(¶+]‘GVʈ¥gv݌ոsAk¤Ë\È ±µrÜ(ÄÊÅ!Jf¨Ò`º0Äî¨Ædk³ºÝ²UÙmJZ ƒT·3­ØÚ»‘N¢æÛrè²æ®"ìÎîtuÔ»q\º¥•räÕÃs®�v¦š±Y76¹$Ýήî»`嚌ÉD% µ)k;;sÎ͵1[.h«¤S#WMªå»®ÛtÛ³l[Eb®šì5FÅ Êk¥E·nݪ™k�MnE\£\­Ýs5WÔkÔÌ›»:¬ÝÚ6Æ®jŵ˛]-­Çu)ºW56[\Š]ÖnutºnmE¶è•F²c5ŒÖ‰H×6�­Ú0nÄÜ㻎çJìØ ­�lnmÍR–«š«š‚ØÖ¹mÌj�ѹ­®íÔFµ¹­r- i]Õk¦“RkQ‘t]E‹\6Ú‹JE”JšVèš¹k¦ÎR(ÉŠL]UÇud´Z±2îâµ5¹n‘¬šÔÚ]w5“®wC�:ÝËnW6î”I-ÚÝ*Å\­Ói+t®k[š«šäF´®Œk.º�Ƥ¬›–²êv×MµÝÖ*ÅhÖáÍsE\å·Ûsmr¬m3g.Ñ[š-‹eKQ`ªáXÖ¹nknš‹©«5®ÝÉVN$E¹T¥¬k•si¥·iµÒ6¶å �Ú¹tÚ×iµ&¦%º«Z¯Ž×Ém“PL¦HU£j¤Öf¨µbµI±±­¨Ú´mm‹T¥J[XJh‘V“VMcbÑZÅ“hÖ¡-%&KFÑ­IQ¬Ê-’³7•¶ÖÉt$¾DBaI%" &ZÒÕ­k^V­kZZÕmºÚÕ¶U­µmò¶ÕlÚµmÓh©¦²lËÙ°m3cPÍlš‹be¨´›4Ó5FÉj�ƶbTcA¨Ñ”–cj-D°‘’ƦE¦¥-…QXH¦ÃHj’ÉF�32!²Q¢±iDKi›4–iA5‹hÆ“j$Å™« j6Ñh-dÔÈRØŒ˜³K)cX¶"°kL*64˜*,jfÅQZ*’�l%‹M©*Y�6’‹Q¤ƒB›LÛ˜ÚM¤ªŒjJ³MŒ�F1`²"ƒRÓd¢6Âfj)l”ØÖf°m”#iSE4Ô†ÅMdØÖ4‘j5FlŒÙa6…#P¥F£hÆ‹Z6ÑXÚU4[&�’H4QhŪ-cdKM,Z“Qi5&Ô`�™’ FÓ5EQm$$”i5ЉMXÖKYFlÌŠZe$VÌÛd±²bÉ­%�¥1¢Å R&Y�2�±Rƒ5)´±5Bc`)’Q©"ÒËFÆÑYCHT“LH¦D²1eh±0eQQRXˆ±IQ%  Y“S6Ș±´…Dl-‰¤SUaD‰F¦0¦’lÙµ!bP¦ƒHX³`i¡š S3i­5%fŒ´hÓA6415&š˜B„… Íb†dÖbÊP””Ø¢iA¢•šQM±!Pk,É2Dl[%ÒM–¨ÛJ4¤¤°’YHÆŠ4‚bÌ”a´”£Ò˜ SX‚Œ©f¢i`&ÐÔ†j(I!R2�J‘¤ØÚ$K3%4ÓiŠQ&ÊLÑF ØÚ�ŠÑ  $ØÔÁ¥i0R‰ID˜Öɪ“&Ò‘`&Zj,¨Ñ©¤©bÄ TZ(£¡ 0’²SJÈ[E$³iJƒm¦†ŠP–Ù1i› TZÁiˆ–��JБ±ˆÆÙ5‚’²Í"‹fQ Ú‚±i…Q©4j6�ØÁ 4i5²‘±bÙš�ÒQa bibd¡šÒš¤ˆÁ¶d¡¶CX©£(ØJM¬³IY*,–4ˆ2ÔL’¤ŠÁ²™›Ff£BRm³)–Ì¢Id³Rj“ •¢Š%‰¢ÁS36Š1XÊ‘£V,Ëd�¬Vf¢¤”ɬЕ4´‰%¬m$ËA­±TÉ…ŠÈc’k&SXÁd±b” Ê¶Š™¶)2i6Ä´Ñ£X(ª`‰´¦Œ†­3F%4ÂCKLÑBjŒX(Õ’ÞûmVßKkVÙmVÕ©mkZ¶úV¶ÖÛ­«m´ $ÄBÕ —ÿBI$¬��%I$¡!Kö B‰Œõ¿îz?ÜÕ#Ž»œ²¢ÆobñB+HiÄ ÊŠÄQ蕎܊ªW^å¢*àÞ$Ìós¨;É{¯Èì�{jý|–ÎÇX‚¡½ÕQžæ¼œ§u §˜”¸¨ŽÜ%·ÛÌ"eqS«6á‘MV(,d)(œ¡¶/EEƒ3Ï#>¢Ð£ˆ^šì8õhdŠF½xìVáÃ×˱ BÛ½,•z[è#Éê»ÙÍ¥o"‚Ý ji@òj¬U G•\Í¢QÚ·l»Î¹+ˆF9+:�çe¬ÕDV×ff>Rv.—Ç¡‹‡Öõb=/…P–â9•‹rë(Cp3¡q” úí3‚Yf„�9Ñ^€«ÖÖIY¡LI•0YZ«m•¢aÌê¡”tÕ g�½ëØ8Ѝ OŽßï®\úŽùc[¶…h+‰lÊœ//%X^Á•‹ßaÎ ]]Ú‘b=ºÙgqrŒÕx£fž [z¯—MXùl3S®¬¼ÛÎVôÆ„ÞÕ¾•ÖF½uÍmTä.µ¶Ó—6·™UI½  uæ2t¼#C„KäbסÞǽ¼î ø&k•t]ßk‚F_dÊÊ4¯B=¼+·7;2áBñs;Vi[t ¦T}—˜n†q¥MÒ£·EeŽZ—X¾„a’¼6Þ<ç{Ó,Aê'¯wv¶–v �Šë³– †îš2» hXòíÝ /’uzîð)±Ù2ê×w]¹Â-lb$âê¬E•õ>ìÕZ4ŒÎ7,Í7[bS¬3ÀæÎ­EV²Ä^"te-`4)Lw�Ë®Â>gT£(Þ­Åx-ìµ’°±Ýg(Ëvwmö]ŒêíÔß5zØ¥¹¶ë,TäJgÇ9^Xˇ¸Ì;¡ÓÅÛ¨wlª¤ ër]ìµ™uÛ••öåäAN�°OMXE¥€=˼…dª¨�†bÖnë»&]ômK±U£,JªzµãG¬Ì”ìÑ£U˜\Ó^w•¢ÝN{7h¢Ý,ܪ�ÅvÃÆ„‹†Q£•Šd¡šÞtïxq{x×V] ´*ׯ(T.�;ɺ©e.«¨ïs7pv‹Ðd¼Xä=}ÍK[ÒXÚR­‰Ñu3Þ踾Nö¯Z§UÌ`§´ §Ð`t^¶²A¼l^DÕa¬ãµÚj±,…ðe–Z¼à0o˜ ¾�Æí›èè�œÈ"–ð&žÑº§Ô/ ªè°]o£ žÜ¤î=s&ŠN7w¹‹ÆÖ¥œs;ŸUp™�{¹ÖÈT M`î±�c ²ÝK̼—}W[3}JЩ§%pµ’㧬A¾8²Öh¡Öôêfù ±NÖóÙu‘fËಬqvIæ�´øAG¹+ÐÖe@jvu×M˜`űqÌêJ“‚£ìÁg^Ø<Ƈõ]£½eC»5•ÂÕ[»ŠÜöly}Ü^íØÙ•‘^éžœú¦+;Ê1S+”·ì® »B`уrIhfvæ °§YÃLضú®ºm{˜ráW0e ™ 1î mºëO0+­OiòÅÜ4YKŠÈÙ§‚ÁzT®ÙxÜ®Ù�™;’X K*Žc”Çzm“h¤hƒ“2­¦ô^Þ¡Võó§]e]섆�ý#î+­ÂïçIùäá•™Ó Š#,Lm%G»koŽÁ‘Ô”v¦Óf÷£Ætƒ§á|«¶•uÜáJ±«›Ï[íá¨oLxîƒR¯ ¾í¶äGFRÚ *fïCÞr•Áer+eåi£òîåu•I+iô»Æýg ß9Få\;„®Ø3¾ƒHÊheõ6ŒòÒ÷oÓqYåV3l3¹åÝk{èÏÎßWËÇ»òªÝ4i¸+ã{>rŽžS8vÞ‰Ù¯(ÍNïœ"Í “¶ôiÑ!£Å ”-îe‘œt‡.:bSöö§®ç�mVÞ�S$�$V44Ñ¡¨6hÐШHÙ¢†�JB¤¦…Šaˆ°¦0²f“P‘L�’JdJ2(JL%"‰ 4‹b�FjFD˜•$hآرT�šL0Q„Lb¢e$È0lÍcLѤŒJ ‰&�‘&±¡1£RH™±PÄ&†&E†B EL‹Á¥‘’i˜’eD L1Á"™±,c$Á©6DÆ@h†JSFÆEŠLl’˜$5A4ÃBE $l •0˜!) ‰¢1”A¢‰3SMÔ"a›$L""Qˆ’&,II`™ )&ÄJS$†Åe¤c"QŒ 1Q¤Ä‰FŒ(ˆÌQ¶)¦La1‰I$‚ Ñ´…"a !£…%ƒ¢6H¢H¤™ 3P¬$˜#2Fd"™¬Xafc&dF¢f ±‚,!C)„¤Ø#C¤�fLTS1R”¨ÉDÉ,†#2`D!ˆ²c2„JJ,Å"Æ"Å™4ÈM1‚(bZHˆX#"�SŒLBˆ³ˆ4I4D”¨dD$DLe "H2XFˆLÆ“bµ­kB�,˜Ù ¢$XQ˜HO[Ýyùzû¯GœK2^Þ²–6|úáǯK{tc¡tr]ÅÙ)rÑÉm%J½Ü0�¶ç6I³/îT&Œ¦BšiNË—ÂÛš¢³»ÕµÃS·j³8m—8hì™Ø°õçl�½q7–Ç�ïSuèÁÏtÊÅìç ìk6ˆÓ2ú­ÐO²øÖkF¯(˜»»VªTOm ¥¨ö æu½ÎëÊ×A‹EœHž«Š”sh®¨æ‹få1âÓB‹Ì¢ßŽm z¨nÍ ¥-Ôï+•�xMïnà™\[WÃ!š õIK[Ôâ(cÙ}½¤Öä¾ËœÊÞg+¨:dÌÇ[Ó!üÈÃtó™c.…ƒFÂÎ…·”ß·ªaÍï;ܱWšWHÔ¡˜ ‡©®qc•ÎÚ"[k#u×—~9YÍ,Öö†#ëÜk•h°R³J!R«�ÝÆÕÙfö…Mo>î^©vxt)ÛxNÇ× ÆåÜ.wìÁ7OªYöL»ÅˆT—�µÙÌ‘5ã4VKÓêiÐ(déÌ ÑpÑ›S›V®l±¼ 9åfa†mvÕÎjê5—¢ÂÚ’Ëçi¾õX66�‡n8¡è±Œy;P}¶ÛÎÄ:qAÖÌ­˜%xcîáÝqgJÀ ð£™[D­¡Œ Ê c ¶¶“®[¯l™§k½œ]A܉cnvèE Ú³ÐA¦Öäí²æíEvººÝÁyÁwNj¬4Â×SLjÄ;B:‡ÂQ–­™.ÐjðwÉØ8R®¼Ëí±}¸îšmUîš¹ŠÕB²…o·ÓÛCF„&¦.«/m³c¸`ÝËáÛ£¾Íµ¸ÍÍá@ªÁ¨^!´ÞÕM–Á\qù«Ìˆ»öÁ¼&C«©ÉØì,;sG]•�Ý Ût¯Rzª ×y‹’¯’Q"·D±®øŸ,©1í³• È´*†ÑÃYLP´\Û·y–}èÌg¦‹ÚèüzªÆ«³�æ"ê¯B•6„¡wfú A Æw�€ÃËÞ­t½iäØá¤.<¡Á\WV dwãbU=R[Ÿ+ÐfØ•W)Þë¢3C„JUx«Î'³³N—Òµög ÑÃu½WmâFb|0Öâ£rødö_D†›˜êêèŒWU샶—�nn Ì<9e¡ÜL§ =Cr‹M^<´àÚGo+˜B¼n—œ³h±vP²Þ`å{¡cœ^»˜n95›»ô+UñÇËj$è­ÛÍãà*ì¶ž[•šû}[uj¶úðèµ¹P�Ifß`©`ƒ v¶‹ívÍ绪Ý,�kTèEuî„gXvì+àñîqÊíézô¾ÌDŠÝäöÒÛQ<[WÊy—U‘¢7²”[·–lwYAœYK¼êÅ*É}={ ¾„N ¹œª¼®èlÌî&PHíc‹WXÈ·`¹p_Z˘;¶ù¤Õ¬¬±¶é—x�e §Y¹=Ê­wAc\^Œq­ Ô)NuŠ2B*×6´›r¬·s¨Uª©™{F;®³w’5‘z¿ûÿîè~½KCÙÿÇñu‘ÿêy&1˜0ì(£úÔMáK_øw ªŸëtGí¸¨Ñ�ìuÆb kâQÊ�øE¬ýP ÖQûm }sÌ´^ÿ­î´ ^×ÙH#�&g­Æ‡Q2Ycƒ ·þT‘ mÒ¡Ó j=A9.K}+ÌPt§m–¤õJÏ£Å!ja¸§1ãÖò¤]ddønL…VMI ¤Ý8±Ý3çT"ò˜,'”ˆ„aãpˆÊÁ&žó3™õˆhÎŒD®qþ““ ²D܃O —5›Uš\‘Òé¬YG)neÀ޶ê(”V�ÿþ7”Ǭ ÔZÌÝ ê Ñܼ‹% s²Q8ª³&lRÅ�ˆÀ¥îŽ�AÛ~ÚÅ£Pëc{®¶Ô«ãè¦+Þo0_š=ÜY2¢ë®Vìrgv¥Aq>3]ЋhT´fçod:{›óîöÒãÜ»ÙxGgevî7¸=óxUmxkŠ•îCy°š—e­UZ£ž­’uŒÛRu.V#âYõqð*yŠuÂN󵡪Î ÓÛ¬ZÔœ­ƒ%,µPÎgyRW ƒ™·¢:_"-®U v–i€ÀÒݶ¨LÁ”ïVÐÚç”ðpÃWÜFHך¹²ÝA ™:y€¬gT^Føúì<?Á>7ü"!{B£ý ÒKLbÚÊlU†&¨$é¼Y‚DÄ£ ÃAüÓ)GôµBZÁ¦�†ˆ˜’ &ÑEt°é(�x!H¦à… PŒ-¸RÙd'8„ˆ!²|r ¡ëSuH2±©Ž J$Y³„pÈQ¢Ú ´À‚  e„ áŽ4Æb)© 6JHIÀN® R–M°Pd9PX&Ì�ÁŠ7J!¢Ca"¥¼0AÁi+m† �À³Q%5† êC™P@ÌöDµ!K†AI"‰$„‰@AÁ”È ‹HE1«–A%Ò´¬ª ÃEÐAÆ @¨Êp¨‡WP.É’ŠXa¿ßøþ?_Ô/Rýß®V_ê/õÜ’…WVØ»¶Æñ!ÍeMÚË 2é‚»+©âç^óÑË84y�á’ý¦‰öjTy»}y‚gX;žÏp¯<1í„’G3¾bÓÎҠ呦át,ª\�vb"LÅíí]^¬w3Áb÷c°EÚ¦¢ÝLVÕŒ¹5ׂX�m mE¾/� �U½·iå�uV��eÉÈ,ä|8UdK¬Äå½éUƒl½Ý=e^ñƒ*Õ1™¡£GŽd ÜçÂø:†Vr�‡0g¥Ý½çã”+_r&ï­qЇ5é�O*òÆIög1ÆtTiŒÈ/¶v‹Ó/ƒ ‘2t.ÂLG‚ï–z±ÎÒ9õJÛ]K‰Wj?8ÅtÞó1jê4o± V*�Üâk!M©5“íw•Á`Rswj©‡Œ§¶t5áíÑ=Ôp#´pC«»q½‰g ³Æ‚ÅÊ£Ã/,È3x›.Щ™† Ä!‡œ¹tïYȲ+c«l%Q Ó}¬†bÈŽôí�mC®)3 Ø!� ®4¶ð]‘‰¬®ÎÛYGk|àÎõ²å!ÆíÍè¸3Ÿ<v響ËcŒ÷fãv „iÆÏ"yJ™„rìEÂ9n?X�Z=¨6CàN½ª 6öæ°T2`^rå–ÃPƒ×œ�‰µWC–¾ãUÃwõ5ž³c…y›5C°lP1˜×2ìÜ"t9[ÎÌ“htn®eX³Î1‘öܵXΣ±êíÍhì=R½¼)¡éLmìçVN¾¹€Õâ‹rÆÍ" o·v’Íà_n “#,m“Aº ÞU`­3ƒG !X®óÍRÓAQ˜3}Ý!̪”FøžX7c£0= ³02V€éw µ€ø‰\*t“JÝ×Tk4ÇÔËNð&IÞÁk`�éã{S¬×I}„$l£¶ønêαžÞCrĤzuÐ[KæLK•sµ S9;�tÍnòˆÛÓ1›‡‹²lYÊ¡|7íÒÁJ›ßQkturtÎûFÊÁÛWV±`®æøZ ½Ã³7×a€HN`Z«==¢¯§_eú…ke®ªÝ:³ ­¢jâ†àHZ½ÖÞ&'–9 ï{[ Þ�\5v7‘»}\f†U]*Ës*ñÄÏZ'§=0¸¦-‚Í´ú‘MéÂÇ<ë+»_*¬¼Á³¸a]wŒ ѵ½KkÚ%_<®;Ö3.‡14e ½ÕN}´;¡dÀwx¡ 7yÃ4L7¸‚t^ �u‘Ez¨£¢šõ ëNVѼWâÄrŽÚ:ÅØ8ÇDo{kWVîÙiæ:8§39z«vòÕA(Qªkt&dê6D`ÓPˆW!»¡€¶{72ò¬œ›¡ÌÇ*¾·†X"ËÝ sÎ�\xA‹1g�4+jüýqí²J›e®Å.3ܲeB5Ñ.›Zª†ƒmqâª@¢¶1ÇŠ»fi½¦MïÛ{2„6†[A‘{Ø÷LV‡M;ã"¥h. ËxÆÍ ÖSw7žÎ¾·„òéí˜z­ÐsvÈ£v»¦ ªK ÞÑÉš‡+dõôÁÁ]wf=ã,d›ÉåYªÕmíòÃG³ªŒÄ&Û©~^|¤,g9kf�Ãv*vsK:yµ˜‡#Ë\½€®¨î±y»ŽXëÚ¦Ú- ÍU›¬wI“¡kænñk.X·‹wI!l„€¬ BŠÑâË‚䤫W}°·Xè^èáÖ/w?þ¯Ÿÿ¹ùã}$ÛßX’F¿ým{Oµ>º¶}‡Š þ»¶>¦ðßU®°s¦žÓvEÿD¢Ì–|��xÒÞ½ç™Nÿýk~Ö§çý¦þ>KÞºIèl®�Kï¿»-·žýñ¼¦åß¶�ÙÛKZ¼õP~`¸ùÚ»ö}ŽpçYéµg'å$Ë•}8–`º~ÞüûÝÞ¸ýªñAÛŚ݆õËÄ{˜ûo¾ûë™Â£kLöïûiðÕêôê•· §Ó½çzͳè˜ÁVaÐÊ›‰oXû“/¼k§ÿ°)@]�éïžÛqß?«¶—/‡gøŽq²Ç†/küà~ω­ŸËM4°�¥¶«›>íÁíþEÑp ËÅu‡}/D��ür¦ÿícÖÃí/£[pîczi¹­kä$þ³Ø¦úB½ŽÝNÀ„Çd¢SvSz«�TըݴëÐv=¡ óUö«|¸ù\+¦{³(Ááïob“#>’�{)·uèÐï níçoÑúò´rùI膻ìIÌßvzƒ‹‡Y†sÅiótæŠâKÀÖ·?¯Qk§½).ò¦aߌöÓ~É Éº�](c0| ®�ëŸë?;úó¼Ë šdß;Ž�ˆK™.Zív7#(½�¢ßÔÕÁi ßrcö—êÅZ:¿¨ü -£k.QMý\ÚþþÜ·âð�k'�’$Ë{³ÜF2 0ýy�d‡\Û®›è}º~u©ˆX53-´¹1Y�Žø…¹‚½Oeæ³êýã8s[òí�iè°?-]û{×ËòŒÛÞ‘³e@ÿ_ª;dõ¤áIA�‚7É£ð4j¿úR•†%Xõö ×B¡0lïWD›EU³PJ”U ÿkÔEÑ7¹È„�!ø¯ê±·Çû·óãu‘�Ï÷µ3­|?,£øØ¼kJþýw:k¾ß„„ý˜êøŠeT«a*‹ã|)/”Ê‘¼ »‡âŠs—Aÿ�T^ý.óééÿ|íOÓ<ãÍâ')·­�y䕨6œe®H $ú}ŸíõŒZ{­¬#çEB¦›a)Í]\6¯f5w[—JO�< BšFu„o‰�_õ>iÿió?.ÍÚш†&Ò«/¨BI´4ÁñIRÕXzî(:¡¼Ëž��ÜÜ, š 6UÅV°]ÖŒÌ=6o1D•¡ÉüРÂÿ°°ÈÅΓz}«%éYšÂ�7.©<™j«§ˆ½ñû´ÔÑdn%�YRª��:Ð,øÄVʤ�ÌØ ƒ[ µ@*º«dË.¢!€õ"¼Œw�f´6¯Ü×=þèmUÛNfŸv=›Ó(#èɆ‘Ú=îѪ�k&Õ�‚†°ÃRÔ=›ªBŒ²cŒQ�Ó„NXˆKxtÀ’&¼ [™'“ÍñésY_î¹QUÁ”Ú`{e• Xn8›Î!æ?Ù¥q÷y!uÔá~X2”WþcžalP‚YáÍb8�J04ƒŽÜK‰·ô-�™Ò±¬W„0‡ÞšH.Á"q„¤h°=’«b¥³�Â?Mä×xHÅÈ2´˜í®sž~T&È`]HƒkD‰!î$�7Æ™:s¤ÂÚ(‡à�°±ù¾gC¡¼£t63Â‚Ô J˜RL3HTJ'6Wsc“ÝÒé>™È ÉTî)JPVˆH>œ€xW>Ïýƒ*Ó²÷`14å$Ýt†lòÏzWS+ñÎåªQÐÛ½³±dÛ2Í-•ûœÕ” ÍI ü0 ÃÂS_ÞUYh¹pßù„‘“ï?X3$€\Àc!è$‹Z�ª t3›`¼’±+ÁC¢¿Ù€¤H$_™PÊ#m#Pö�š#)–ÞÙHÇÒ…Š4€ ÓyÄM-`Ã4–6F1GDý¦66ØÆÛcLH$LB­Swþ}’‚Û¨ÏÀ#J+¦Zߦ” Ëv´Pƒ¬i8fÅ’£„¸Ò<}$$ ¾Ä×ùßJ}{”¦^‡Õîdú˜ÛýíMm=[ÇQòW]èC_9ßKÐzÇÚo›Ö wÝãXc|Áo–ð®Ï¾|> l=Ú(¯žÓBÍ�ÙO]¥Žq²O;N·>Ñ8D›Ï,szy¾ fÞÅÞ»º?ÏóÔÛâ‰ã¾µ†2öo"¥“GsûæVtËmšn~ÿÑzÀõÍoë×D;"EÞì�‡IyÓIç^ͯ§Ó�|ÂUý÷�Q~ô¯ÀÃüL¢ �}§jppAém¶O‘£‰ß,çAþlñ#°hÿª ()AN|·hîãd)Õ»ôí}Î?>Bú#ßLàã±ýúÞÛÓYŒ‹A¢Î¬½•æ¸ñIwŸÜ�zóféÁ[�Å6ì͙󭭗¾ŒN�‚§êÄbM�°R–kw¢ÖÈùH_ŸºÁýŽúµ{É媹þŒ*Ýï¾w&Øñ.~3‰:LƼÚ~µ]uï�}ɺQ›·ï/íkøí®fG»|®�¡-˜½{·�Çïóгê03;´ûÃJ\æÃ™|ëma·½›î_z3u~_¸ãT »¢M‡Qwí†kªs{øa½ª|I…÷ �1S} ¯#U×àw|ûœJUçÞ[ÓŒ·ÒI]J8n�ëÝ©ûrƒˆ¡=‡+cý òQ÷£—¤Ø·¶¨Ög�Á[^uq%zP¯0¿]oá)ûh €4…'nÓê>ä]š0tHYk²YçY®-M_Åfq—ôœÞÎ0��Ü­¹d‘ì#{HÀ�øÃhsM¥£×�ÛOËU‹ (!…šÈeo¹½bn÷%·l# fB‘0½‡ÇCÃÿq*dÒû˜ðW&kDãšµ×›FôúÏã@¹Æ“(i!÷E{ÊY2¿¾¨ì»JÃY5°^¿K!å:jøÎ*ØÚmµ£SX(×» ¬ Êæt1HØKd6.:q"TÅ ‹}Y{lª¾ äÛx´Þ™³I=û¬BM P‚CÚo…ñé륫i¬Ð´/æ"ñý@k4+A9œ¦ƒ+IXkj]ÕP³ånà#ˆB8O«A-˜…ÿ“°ðÅ/X†Z€¥±÷j§d“i6…Úäª1Q3§Ë�£h«E- 6Œò·ÑÚ'{EzÇíÏ©z”®¼¹žŸ¹ôÆ]®ÆÂ8Æ�Ø4ÁƒC×;ìKŠ×8ƒ©ˉ¢ÔÚíåB‚˜* l5[<(›&Ïø0–&ÜŒ·7>¦(…èI§»(›�\®ÆÞ�:–/õ—ù¦~{ºÓõùÿŽg\(/KìÀˆÒ÷ðà{±XÀQ}�€^ÃÒ c)\Z•ª•hE!EÒîE† ¹@(WÖ‚÷~»ý|.(GªÊìÉA ’…ÌN\»Ö±|:‰·ð^”F)u%î1~à�¸×Z§Œås™'4gPkÝðÃD°²Ô½°4=ëZ,½î’[ˆV`èî2öß�Üü9Mh|Ù*¿,,Ú÷”‹Öš0(uAþ€IA¡Æ6Ì×{Ú{5é�V¥ñôa�-}!ðúp„¦Š¹Æ(Z÷Ó.:eƒƒ¢@®·,D"¶| €Bò$()Q‡ÏogäõÂW¯ö蟿oVÜ㯭Ö%·�ɯ1ê½ÊäÖEóéÝ8zp‚s…³ß-qê3Ë<׳W¥Ioô^8Êw*W~xõ!Õý÷^¾{ÅÛYºA½r1ÛŸqõÆÔ°€£] q¾uoæ?}Öš{Æ|3OŸÑw�[œsÁæ‹§f.8yê¹û-°ÎBÞ~=e“!çnËÝwj©W;åuFhE §ßo‰h³îìóÒ9ÿw™o§ÖÓÛ5Ú^¶Õ«àÅïå(ÍuÑŒ>µwÚh7¯r^Ýj^íë[Þÿh—ÙÓ÷ߌ)#Æþ¶ù^[÷³~Í?hÍšÏ\è[iúìþ½§Æ�]Ùæ8kE!¸ÝÞåküÎCÏ‹€ét—SS§²ÅÛ^øiªú?y| °ëJâ™éÍ—Å…’ùìÄЪ`õˆ£-ØüÙit”æ÷½Û— źõ{~ãô£ûÙ¹5ùÛÄ›|Å»åcÎ>ðžü Ü´…ü¬b)·�…×Ö~(Zx' #ÍMê˜Üa¢ø]†ÓÊÜ2דÌb¥–õ¨[Û(y`�ý5‹–¥bSÙE¤i ½’e;†jßÓÅ€H …… qÛ÷QJ–›^ˆÉÕ)!€Þ‚H»A¡jŠ—'•“’šðÁ††àÏ� ±Ã¶ëtöÖ<hæA놛4ï# ‰–ÙÙÔÒÕ¨BqWé¹8ÌY±'��ð$’KìI––ýbs ù?:³{?cäÇ=5ê¬ÎarC`Ùˆ&�?,ÂvÔÎV{(�,³(U�‹Vœ5X:ÃóB ¨!ïèV»Íb‚=!$•gSÚùN™fÅÈñ)V…w�‚¬C�Íh@ŸøƒÁÍâV\e*ãÏŒ¦¬nVÓz�îøæürÿÍi¡‡ß·-EÕ Œ™É�Œrú_÷¥Â¡JX¡U-gdƒ ý2e&“QÁÜ¢ÇL*B†šUýÑ’ÎÖ¾•£åãÏÞô·Ëë®\ÐÙ�ïzˆ±¿Sƒe%¸¸Ÿ5Œ#�à“ŽqÄh�‘ Î�D\UU¥z˜4HÍÂX‚ø $˜{2S´PgÈ!áQ–¼.zq�¾²ùžŽk”EÕ SJÖ–éŸö¡¯1ðgÝ�2å%̼bQUK&SdHvHË&ÌP2ƒÖ±+·X¥8¯mŒS½`¥½µ¡“ˆÕÁtÛm–£i³¤ÎU˜7\’¥5¤……f«]G‚ƒKN©éÕjç0m«;- oÂ4üï )«n�ètTM…ôÊÆŸd7¯õ#s‘uah’$ž]�Žþ€®&°}ñOÉðè þbWƒLÔÑq6´^Ÿiþʧm2€4,p\¡q -¿d,¾ìGHÄÈåf–U@S‰‚mIU9�š­u-GÐϨ³bïÇ¢H�w÷…³GÛ�÷æ$öûÓÅþ{ö6ÆF«ê6í÷¾ä?a>¤GíÃV[%å†J°Öôð‹¿žÝšy¿ú•ŒGR®š}3ŽÛóóh8Pƒ!£øv¯n¢ÆìüÇ�“°?2�˜~i©$egç"¼úþÌóó}ô�kÞÉ^Ÿžüźê ÙN�àãÃÙðì#M%rÞ,�odâÒÓ©øíÖþoØxçÚñ l&z4v÷¿~vã}ß6]ˆÃ<}u¥_|Sžz·Z›¸<†…%ƒU_�þ©~nL›ºù7†.>5>з²ua潘Òݳò½BçûN5àùX¯o•�Ûñö�¬i§Züò¸ŠƒnD„ŠE´9aÙH�løz/i{°øÁâšÃ†iê^WûÁøë³³Õ¤zEöûݰÙ7Ð×ãb°CJšPôO/Zµ â�Uók‰–ó¨Ö^^åßgm½uשëÙÿN¹.�ÀÓ­}n©­¿C¼]•²8}N~úÛwSBýÒVÿ¡¶„ßýú®û²ïâi¥ïô¾Ç´]wï@½%¿ßšùÕá‘EpÍ“žiÅí»°£ÊøýŽÇïËqš «ŽóëGx·ë鯮eŸ0§˜ …¹]âAdz5R¯Ñ©­ƒG¯•ùkkÊZpŸlœË—‡4Æ@?¤¼“©·œD`[µ^Áò.‡c35s›Drqis¾œ•Q¬¾¾5y6`T”¦ÅÚè¶:ýJw¢ïðÕÐWí8§a’ ÇvòãtwœDE¬gõ8[é}àËã(¶�FÂãØÃ,–3÷hEö*m)|€üNv{~Ö,¤­NÞ×pÜ}€!jëNó"*qÌ8ƒä”g¿Î�×>áßX;r§_7wgW7˜"öÓ³…Z¶§Þ_«¼â�14µºÎo*NW†Hn)]¯ê®Ä¹IÔ�‡ðel?[Qì‘i¾ˆ†¥¬°Te“�!:ž'ö“ |IÌY3ÙJ>ü,KånÄ"5ÁóÅ«×jµD}89bc_?Í^Ú«SËJõ®‘¡äÄÚ� �˜ø-7iÐU¯fap韛|ÑFqä.e6ßšêíîâIƒÖÉX­F6ÀœjÀ,ö3(&ÅKÖÙçS^3�˜%ÏÑ �Áqy[¥*gH¾}«©/ªÂF6–ŃíbÊ%3Éb¢ÏÁÔȨeRB³•¡jèuqkßAq•÷HÂBÆì¶Uæ ‘ãKЪ†U“PÈ 0¶°R½§<Û€²‡šiš$Þ7×ÂËçj}Ïg#­*:¨b˜[¸|ÿ_ªÞÿ\f 2ûâÐúŽ{„8\Í:f‚¶`ç‰ –¡-Òð‚ÌM™t‰'ú BŠçjÎzÍJAkRJÓˆ‚Oªp3åñ ,G%$qEc˜aѨVÞ•„«D¢º|\¡b(cv™#¢ÌË|ó¬sláã~‘?œA‡Ó(÷ŠQ�VJ¬.‚³r” 1ÿ è(BDµ1ª¼“esFüw” ±‚~“c:Ë_�ãÚõ–*ZJ¬Áص .¥Æû J�Kؤ®zU*åLƒá:Ô÷iËé7/±ËðWÛ³{o*.D¦d ­‚ nØ]h’üŠ{•“�Ækë†Iå©èǃ壚£m"Ér9R†•ðI¨F`’I+¯SXZÏÈ$ß‚à½üß)}kE {”¥9åj+ìOÃ.À¹yÄÑ)u6„yõÎÏ/PH)ºÓ¯UëömâÊ[ÜѶûk§HRJ–Ô4 €?Ò»K夎pdˆßMóÓÔ¾Ûå„g §M 'Þ†ùn®·U•ûH 0 ´’é±L| ºPgky�^±è$€Kó]~yÄqùƒ×ßuxO[)–J@¾Ä¼|ÌzùfÌ.¿µG»ø‚ÇÝCX1iàeôßå|ds®ºö]§>¹w“—¾N^­át;pý©Ÿ+í ):{ñšäãÄ%ÅûO0ø#ÆÂ;t™‡8ùé�Ó�wî³*¿\÷÷6F]s‰eô†z˯ï+in]¥Å/Vm¶çáygmõçI¸3³1x-š×�›¸qöjCCý¿Õ¯Z~ÆxyþÑß#êÏ–íã?®Œï·ÍGy»´.ÐeóÃÕ{u}¦o¾Ûï¯1®{‰õQúd¶&>Á2xíHçîÌq´üüªa˃‰)bÍýøÑÊî�žÅ,kágÙŸ¤#¶Ý x—Aýèÿ“îdQÓ­">\é·>çÛ:bƒl¯ËøÅ%²õÄ|oµux ð7¿ž]¾¸G²ýèWó®Úö´)Ûç~Ñï�øñ_9Ì~7�ýv‘-ºî]Ví¸Ï"½/<ã÷Ýá éNxôþÍЗiéj?¨r¾ý½LX>=‚ñ´fÇnýy¦šë*ö¤âÿ…÷ÉÁd¸ë½zxµ;öbm1¤{룄·‚SeëG�kAÂû^OÂôº¸®Ëù_vžËãêÃþé§š{�ª ·Õ|{_V§\˜óE7£|ï×°±ùø�½~ñL•}ü¯qž6Û²7׋'_¸×Þ~èö�ûž•ïã@D(A 3M›ïž|y†Åé}£¬¥¿fyß¶žú1ÆÌ¦Ç½£$³u‰ãqÓ¥=J–-9v›iæÿ¹¾“ÝݵÎüèI˜uó[íuþ¦óÕa%añµˆ÷Õ{´1ð‡[1|s¿xxƒñ b™e£Ô<›VKí˜7 Pl$²O Ï…”Àg³@ûãº(�KI†”¨ EèzòÛ¡VŠÔ¸dƒµŽ™Ú}íŸæXÆ�õˆƒ•Ò�Ø �+ $Q0¢JNmYX’ï=T¨Ã#È��%h÷ˆÐâŽ/úš¿^úÏb½3óŒ<‹+é,ÚòÝ%C+YEl¨GOZ. iwÈn£Ÿ4t¢Î�iÌ•h£…Ir¡‘,ƒ[@¥12˜�…:I¢§ü¯n$b7Ží :¡¡°\fS#dCRÔ1¶žÐïü.‰Œ�±ú˜¿Oî�Ã#÷ïo>–b$¹]w7ÄEþ’IfF�ÿ˜)¬o÷u�Õ¢¯9ã SÒU©³ØJ…í–§*×¹ô_ìÇŸoû­æ6}W\ªíŠƒ3™�¡Æ0?‘K}ã×ÑÇ*}+êÜ œâÍ W†ïˆ)DE÷Ä{ná+šëòÀ¬cxF†#!ÄÚÆØ'(¦ùàý»¹,Ǭ“.£³Í’ŽS¶~{B¦Få¼tÆU‹ö¿ak™‰l¢ZJI[øâÕl`Q°‘`›E *Q�‘5ýi#?o|þ«E«Æ›¹ƒ}ÐS.d´<êÐÑWº Y–J¨E‘üHAUi[8«)‚�+Vé±+¶ Z’(°#b!ÌBI`I%¢?Œ5kØF‰ t� WCæºÙ‰¢‰4·çÍjóð|ý.¼o°ºªHÔ÷k<€« ÛÞÇvOÂ…LŠàúuìÀB,;GM¹K® Ÿ€ö_…mŸ”t¬çfÂ!: ((hͳÈgYïí;v8&aá‹þW*õô49ú€˜o'ë³�Òšù}×Ù‘ÿ[ÜF·¥ÏUÁ»ß\öÄ¢m–Žžšûþö\õ»«Á{ÓÖFß~{køo‰ãëüûFv·ÙhÎÞߺü.¾ü#ž‡å·yÐÊ•Íæ'­úŽý£Ï¸ ÍD}{Ùþø½¹É§7Nú[{Ñ’ß›ï@åöÒe]ÈS_·o�¼ëû»Í—h óÚ�»—¯?¼¥½(–¬{‹;Ïp¿œ®«e÷ŒÏóXí—ÎR|GMEÙŸ ¾ø×ç‡Ò=ëê+oǹÿºé¿%ȱE>}wëþñ±*øó—Øœï;�­ªg£Ò¬ý*ÛMßö·‡Ýû‹;jqÕäÅÒ s�YàA߾öú]µ­¦ûiY†ëxGÏqFf6ý¯¾þq^%ûÁÌüþ~tÇNß�fv×ÇX eŽ´“ö]å:i'óù-=™ûVžžî–Ñ�X·_óªûêúW¸st� ûùÛ›zOúÇwÖê�;Ãé÷÷áê3ÝÈúÑ8O^qã´3‡‹ŽYó²ÒµŸ<öá~�œßb½¹ å¹ZŠ�v本 9�½¸Hè^«Ì!B"«bKåvN¤òßœM®jº!±–ä7«8h}ÉË ’¬æHÛ¤%�ÅôÔ"E˜g|¥�u)L(�¼dÖR–AZ]'Ï2"´d4\œµ©€µ4„ù/ «Ñ}ü‹QU’=˺Ü]Ï0kÕ÷5sQ¶%à ˆ#Þ—=iáZ�Nšþ4:%Üšý4H³@FL,u®cë’ÕÆ2VŽi3S¦É¼TÆ€@;p¥*|û¿ã31óÛã½%éÞ2-hÜKv-{¬n‡[N¨ÁGÄÆd0®ZQAƒŽr}úCv#QÞD%B§›�Ís�â—U¢0*"þ/ÇZÉš¿â÷r_Ò'õ¦3\šñ¹µQðòe`¦Ñ>c.¢GÓ\¢‚fƒÛ­}CËFS�ےʘÊ@3ÒÖ**Y)?¢B–ñ�}ãÚ™mÒ�ýztsßëÒy÷w:iî¼Gk毵Jù£ÝâÉîørå–ZÖs‰ƒ]LY äF®.`@„!š}éÏ›jo®›BgÜs�óY+˜¨8ì,Uúç&g�.þœÜEDãM¦ phÑ­IÌ0‹9KFO[¹¹äMÕ�؃,\ÍtôÇ/â.j‰É×,Ñ+t).[ÉNG3—}ÌÌêG« xEEqïï^õÕ4Õ…SÔ¼� ‡9Ëåø Û‹iÚXÒ® �”J ±¹¡æ�U§!é"Ðè«z»”Fþk6‚¿nÖ \Ë!!K1$T!G­úÇ«ö3IEÕ}­BÅáýR¦çkBBm !¥TD˜Ê2eD %GîÈ,[ñ ¢¡qÕ[ì’ª�Z«àIT ±ú!i&ĬÒH†£7RYHI“劌0†ò5õþ­<,…(()\sì¼ó¹°· >v4ÜÓµP¥°›Åùo|î[ë¾ýïq�þ.¾dþ1?æü‰m=ç1?ëq¦˜û¢öv-nñsmùdÝûe…®�ýÄ+èùýã!ñ„Mû³�Ÿçï‹Ã²ë)ùæ?¼Gßw3iù®ÛæôË}ßqïƒM¸µú§_8âq8e›ŒÖ¿ÌÚäN•§_¿'oA¿QÚüù.V[ûý¨ýªë=Eø:aê�ñßÄÉ6¸ìƒí{°ÆO¥hºÕ ¾4’K(K{¯ë¿ ¾§š3ˆm¾ÿkòs6¬b7÷Û÷¾¯Ÿß|#¦áÏkÈz !ãži¡zðîŒk«~â“&è÷GÎÎ…ÏÝ0‘ç�êìý~”ò•›Ë{düD��s®':vÑÄ»eÑö`+Vê¾Â]݃ߎ…ky”¸ñãzˆôQÓ©ô‰Šð³|¹³v�äèâ-gåç†ã/ñõ}‰@h)HÊž³%»˜ugõ˜IiZæò•y×Þ~Åü~MKcwÚ„qíÖßyê|¹>{þ%Òß6ýëGsÛ÷b’Öæ¿Ço­ï¼8zÒ+ŒÒ¿>¹:Ú« äVǺ×߉î$Žçœ|ÜJ{�öç3Hû“Õþ}› z³Ì[½Ä õ/ÉÔ{Û7¶*\}/™ZÇÑD¶{_B.îƒKL¹Qû!�üûANd:Ïköõí;[öR›õÕ ïÆ k@>t¬ | –!llŸã÷N«kÕÔ½î¶Ý´m~~×ëxKúã=;šîœ5ÎÄw`¦‡ ¹}¨îus7­ƒ·úE¨px Ã3ˆ¹±µGÈÎeîµäR�?ÝÆƒdÄ+$ªP%@}�' ³‚¸‘5oÚ@ V‹â9 2>Ð$?P6®Îì%Ø©¬�Çj2#”@új† Ÿëúlµá@9èõrßSEè­Åÿ4ÀI‡Y]Ô^Òla�iþÌ\�!Š ™8JqXÖ';´á0¬.tyúŸ×<Ç ‘Ý 8®ZŒò ~Ì*)HŒ@"¡*£%ß"�ÎŒ/­ÐE`J"³_ìÛóÏ?ŸÜ_l^:Ó\ï½12«±BŸËZÍô¹œ­UL,û:à®’²áÇÃ!·²@È®Œ¯M“ FèЧ6Ib–Š2¿È²(Ÿ•£˜tŧ®Ä‚BæþûW n4Øœ" N“§¦ÙIÌýjµG“±B¼ÂÌ^ämYä…ÒT“e€õ‘‚|>™A)ù¬ Á]’ŠZ ó¡{Œ÷²Ã¾µr.�r±G¥»Ð듆ÁzZ÷µì•Üþù›¨¯¤™Sq0á™Øu�˜´¹(ä2V!Ua—×6Xm�â°=`ToIw ŠZÕWÚêíloå6ñÄç::I»¼¢Ò>ôüºé7"ÞQvP�&×�#�C$KSX{¨^¬Ñ¥@TyµžTË7–G7Ó÷kÂÉù 'ÔÓž?J?¤Ž©Š¼¿Ù=ˆ„°àé•â8xcnytE?Â!øs¼m}ØKe?1Øèš�üT//`kÞ߯îàý n`Ùªð³ð~¯ºïª»ªí#u©IÆÎZ%ƒHÏr­oUùG — ¾HVüp°À¨Òø¡¯>ÓD5w´ääÃ6ÂOµ•„*•‚‡ˆDÌ%úu䢜笈Ê|I1éc!H4Û½l‡(Tr×#Ê ¢bÃ0ÔÒþ1IHöC`º´衦Òl‰‰#0˜†… U E!¦ßEôúß_ŸnüyZ*Å<빦Ít«•Ó¯V¹ù[u-òoh”±O*!f(cTC$!U„¸m DAßBQˆ,1K Œ’aÄ1Œ¼•PtPBKQýìU¢©À�B1¯O�¾ ñ¯iû'÷çÿ;ÿ¿3�çÐS² E©üÑó}´a MÜ?Â|”—7í¢ßÒín�š—Ͻk½ Žo|5^6_�/ßFFô<³ÏØc ¸{}h«ÃÇ«wÚz”ý¿�iê~huí?½�ÙŸ½Ãzˆ{.{p<�»áŠ­#½-_m�^w‘_S ïyqØåûaž²[lP�é³÷§ûâú/behÏ Ÿ¶‹¾2ò¿¤ê{ŸmÎsºx&À½R|Oºõ\z·Ícwâ83¥¶ñ³­ØpæmèÓ·4ý­š)õ3òc·¼S¾£¯qßO¬žA¸hÔ�_ {°­#©=šGQ�˼··¸ß’DÆ7ºÄpß3ÓΗßçÈÎÝØY6<Š­àº'a¢·'õ ÐæbOýOp˜ëϺüà{ÔylJ�¸×0Ÿ;{ýM�âŒbµïÏÛm–ë�½¿dmƒ{ú]©åƒçr»¹õ)K£þîGצE9�ÜIÁ;ÒÒ>ƒ)ïŽx~ÕÒ"$­åã8ÉxŒ£CíÁݺéǫ۵ûÉVÕZºI!š[Ç]«/›ù›|¿çÌöó‘¶S­\ÅýcaìÍÕƒßnv¸“ß{Y“ÃxÓæÈÌ¿(ÒiÀ¼þ„xÖÒYýO¦ºû§­ü_¯¸ïùÜCñ©úÙ%WawáŒýñ§ñ¤‡?œï Ô š5/>çÖÏǾ~AsÌé~}–Ÿ@D’0 =™ÙÉñÇî잘J›UÚ–®uÞb€1�ðh~³æ ýñqÁDoáy ®¤5SÞš$!šžH WÄíĬ jƒpI–û$ÇcFµ’�éõjé¾T¼ãîë½—F–K²-û¦ìåÕ…9ü©Jýôþ#Yæ‚â·wðçÙª ‰…÷i ó)®êJP^ƒ™—öuŽN ©XÇíÆ…ƒaþ¯î>ÜÚ­ßYdmŒÞ9yÒæOGÆ{�Púâ'SZ0 ™¡ _˜6t¥›ˆÃ¤ãf�˜ÉXLF †€³Af!h(Ðv¬!¤«Ô:vÔŸÞ±ÕÓ¤mÓI¤ÀØ~éjï•‹VLè êNpÑ‘/îEÈͨBr cHì�éÙ®�s‡ ¤:ǭߥowFÇuši@†mí3ß+¬ìg^�†CVƒ/ÖÄ p(�AAðhòE�RvîiÆÓò%õÄzů�U E“ºô¯ÅÚ$Ví; thÅ!7H6`Ú&#I(ŸØ$5q£—7Û¡ŠÇºŸÕb`MÄqL�Í>`{0XÏ`-Æ1$&«ÐêèÒma[*,~d:K£pÌç<ª$Š‚ü^¸÷@"Í%ÞQII*>‰ûËþ¤µó`ÓT°S1²Ò¢È�‘iÃ4If‰5jö£äAé¨H>‚£ ؈jžDI‰�èìN•çÕ2/ǤP)¸’B¤è;²¦ ü@KÚ'‡l¥�ÐÊæ·FòUíø~oÃîú|t¿/~‰ÁQ�£´ó:÷ˆÑkHÄ&-àÂÑÓdƒ¾/Ê>¯wvóã¾wo�^ºwãOk’çŽy÷§‡ß)²êõôàÙÞái>uT¾3ë¬;q®jÿ=™â['ûkGŽ iÈÛ,=úOKè‰>ÇÊ}Of½]ÙÛÕ8]<ýon­¤|ïªaïH}´ô~"šÕ+½¼ sšþ80ù.4—]$ü›ŸlZ¡¶®þêŸ>¾ÏC÷v²œG{ŸŽ]¾›ìqìM´¥¶�ó³Ä^¯M„ Zþ§gG‰ÏêçӘͅAiõ�päCŽëŽºþ”G™µÏ`·Þ«)w÷׉/ˆÅ„’# <ÇJ|=õÏlò¬b ø õÒõÍ¿³øAöÖMW=^”®[iüjÇ3»q@�›Õˆ”±ÂļÐCÁ*q:ÅÜEÑ ÷ÅÍ`O¾ݹ™Œc9´ù�¸Êy™|Óò�°K5¡šõï8eH!Dˆ@$»ej—=¤W#÷v¨ØP´ü#ñ$•íî—êx´D¤‹$€ Ò)¦n„±HZj’L/á ì]¡¾àP4 .�vbcÊLi$›,—µýR9ëúîoçpßtW]™ÂaÝÚ³6­Ö”p5È<�Ãh#ß ÙlfÅÞÂzˆ�vEû÷ËîÎõ‡šÉ?_NØ?×_;DŸÆ/×Ï“ù�]¤¯này¶ëëRù64«·ÍóÂõTüσÌ4=yñiÝÕßßÛxõ¯œöbêƒÖ÷§Îëó„.®=¼öÝΫ<öö̳�Лj¼ÂHŸÜxÍšÇ^\ÚŸº‹3ÝîÉ—–•‘zõå«sy$ÚðÖx¦žß$|ŠÌóÚ‚ž½ýîþW—RrÓÇζßmKÖ:xúÁöÐÆ@·ìmÛãð ùh ËVäñv+Ÿ1káÙšq<�q\:÷p}�ɬ.Æ[¶öB‡¾\D¶ñZ×Ã\�ˆx­E>éÞ»ˆ}ÎÙë[õœ”>kò¿FüTyϫ˞»ÓÝ|Im+1#f>´�Á7kôzjmä×ÏÎcœtŒÖCãùí ½™ä< ›+H=ƒ^OÉßjkUoó�;O··Ê‘ó¥·Çêåû)JÉçïgúPãõ�ö+qíì óë§ŒªÚˆ`Ã>—†ÖÚ2>ýãNKÄ…ÊXiŸ¼yX~Õ ù¬ìÏ>C4Þb=œbÌÝÌ€Òß<°µÃšSÓZ†_×�z}/�o&éÊçùÐ×—SÔpAxÌ=¶Ã2î$Ö³Rø¿ÕÃü7Ë ¶oMñ³Òôø+ZŠu->©�çS—¼ +Ÿ`žEÎã5Ü‹yþf“ù žðÀ!Ú�©ÎÒ¹Ho‘Ë"›¸>ñ§W%íýq´mÜ•®!u\6øêwæ·çñÇbõh‡våUlý:Œ•>š‡]zö=ÑÎ_ÂÝÍ@dFnw¤„F½Ý9bÔâ[¶¿Âä;³»Y(z9Ãþ0)gD‚BÃ"Gƒ Á18"Ƈ¯ªÝþ£‰Šçï‰Ã¥Z�ñ¾ÞÌçñªŠ»EåvâÄh³SРm70ÕÉú‡ÜÀÏàý áOù\?Û¨� ?™eªg9¹ Çì9Øœ¯&2èq4¥ÌöiåOW õÈ”4�´‰b)ž´(&˜,ò³t~… ~/[í3zGÖ þt»­kv¶Ä]ìKl°ö›2Gítg;F¨ªG,lAœµa@§3'Cj…¢b“ÝÏÏH«¡å¢TšI¯ê t†‘¿–ÂÃKcz tÈvXþ…µ€JF•Ò^ž•WëH®#O3dØ8%ˆ-;�3IÀ§~Ž’|šóßu ”¥1[+¸5Q«8&3˜N°‚ø B†ˆ6Œ"¸¡¢¤@ÈÆG�&9t‡oNm‹[ÃÊa¾“�¨b0UÓ:ê¡tý-Ñhª(ÁiG²IZIˆS~‘ôÛ�ý�î=؆24�¾\fèÊ'ÙÁz`ž[¿o‚TÖäP(W³ö_ÆÑo$~5Ößì¼Û û'ã…º97æšøñÆ—¬߉Ÿ¡¢‰¡1V�0ðÅýŸ‹¼slf7ÕtrŒ¨=p� üMzÉ�êzeC.’=45ÝBوͦšm”²&ud(R ŒTˆVhÉpÌVI�K¹ß)±q Ñ=~}„Áá±ÜŽù !Èõ½ó_juYäò%˜‚X–ìCiFxY†’Õ€¤ jl•Fc’FCF¨ŽŒ§'=©>@Qs#ù{f)(•4·:“雺¥‚H–€X°+#I±ŸªI—¨’.€’I/ „1$LI%è ! KÐH@’ò B�»­µ[5ZÖµîÛVÚ¶ZÖÛd„$’¸��%’I)!D‚p’ª$€Kñÿú � øîsN>Ñ�›!´Ïž|±¤Nƒ–Ké�ïê+úpŸ¶$�1岄J4,¬ë=¿ý/-UñÀ�$ÞâÌS?ÌÀ~S`פ±–ºñŒR=ß7ºK }ÅI¹ºw¸ÀI[4eÉã{µbuþwï‘™«8Y_è�9ÛḚ̀±Ù÷Í^çy½Õ “*›_}Æc•YeÕØ)™�p$Œ‹n°pœÉ¯v!:J%Ç’÷ήªºDçp‹†‰$‚p¯,6™{ÔûÏ9áî÷½8wˈàŽb¡Aݽ{4jV«™†‡(w®+�hDžªZË7|[ƒdñ øhÍØŽòÍð³ÀmŸ]ó×MäéÆ ]lE† d,Ã#}ó±K™‰—“ÓŽiÓáŠ��D ¯S>Sò®ô��2‡Â†m<¤Á=Sª9o¦/KY�R€ïùÑJû—n³û?}£mm¿íjÛ6ª›ZÛ$Ú°ÚIØÿzÓŸÃó\Jn³ ŽÿÝ%$�´�yóè÷Ö'x*ÿ¾`=^¯ÝÛæ=Ty7Hè„2BJN{õôÏÛßçò×ÿ»t7ñÐ@މW޾–í·£Âw¨yJ¦¶^hwr‚‚…Ô³/ã݈}ñþphäÉÃÃ=Ú'Û´P¢fë¿ÏŒçI�ß­cÇî¿­ ^Y±P¥×=Y|2Y—æìÍæõõ{žö‚WhK$/�?Ÿ®iÔ@„!͸gÏCçî�õí×üÒ”üs<òºâny_qÍ𓠚窯ןw?ò¶ZéI< â¨ÖTƒ—'šÎh£k[±”w=þÆ SÑÂ%òŽ•XEÿÎô…i™£Vcÿd²¥ž‰6›¼öʱ&Î÷4¶§/€DÐ%+p9�B¢»�¬æ¢©ù!³ó-¬am„áq‘¼4ëü+yÆ¿ġ|ØQþGé~0òkwÖyïø�³ûA�£BÀ±á¶N(€Hç×3«�_‰Ïaêkª~òûØ'¹¸¢v×µM#r¸ˆåd�>�×>×H„eCΑ×Ûâ玑ÚäŒ{“]Z E¶}�—œÃo¢�Œ‡:#:,ï±é�·At&÷Y‚v¹ƒòòCÕqÅ^î¼&»X?ìÄ–= 0/·{ ^ä’ ó»ë_B^™P®ÀNqá²`0-Ó!/~ßX£iƒ#2¬A ð�³JYúö¹XdîyC·°‚)ñ[ì¸^wWŠ» 0;„0E¥hºñòu|ÍЭs½ËCás]8 Cw^†$$]¨¡%²N)®ÔG›¢æÎw«gßu\ʪ]Š©œ_šä7Šƒ\Ò­íþ ݧ·ò÷?~5" ù¥ŽÿëÓE›4Ü7XN�¬Fà°­Xx(5"RZÅ2lž<2žÇæùkiQ�Ô>Ä"Ç‘�ûÎLó—ÞÇxxx‡ð²^sÆVâp§c„Í÷ܱ#‰ìÎ&ú Á‰0 ¼§PQtGéB—Ú•ôw½ ¬]:ÂêÎ\9áx·<ÊÎŽ”qªN‚PW¡_Þëû…9S‚ A�狇WÒ)›X´(5H ¼á†I˜¾„BxÞu yi¿še¾£âq\LOâÞñ—í¼»_ ëÅ)Ư¬. øä ‘dE¶S¼`6ûŸùþXEâÇw¤næxy®FñÎÿ =ßáP<ætú�l ë^åc’_(®Á– �\P‡Ìõ81\,J ðÓð©‘ÙòçÌé¹Ô…yO4žJ‰¤?]Cð™Ì�”�o¨íYQ%wý­Á/»Th�ìØf:´6 ÉfõhöYO€“òa0ÛFþ¥Ïž2ÜøÇøFo9$å‘þd¸^Ïë#ËÍŽ&Æ�u÷°D©µ‘×µî}ïQ ß÷ê‡ús®g«ØMeJåf8ÝÕ‡óÈ�XÚìWD£–y‡ò÷ÈÑåóü;œiÂ~)!²ƒëŽo8b˜Û—k™gP'$D…5H¤xªÿ"4Ägö\\û¯t7œ`ÒV‡ŠÁ>«�öµÈÇhóÐGFp/>w×À$ üÇ”„Èw2ˆ¢r ç hÈ9Ü ùS!7ñL=ÜNŠ÷ϖ楈>yn/93LÞšÊã—;ó()÷¡l�)z_?Ôªªœc[s¤}eAtDÁŠä}^ï'‹³_Iç�|uîÎigÆ/oôM­Åí¨ÞŠ¿ ƒé?Ø6¢6öø@Ñ׎õªý¬9ί‚‘€ù¶tr¾Ø8¾²t!êþƒ{A$‡-nË4:�''N‰´�¢èÆoÿø¼C<ìÇ?pýPWȶë’ɨl—æ´`\6­ßò·í{˜Ò‰¯ÏWìž”\Ó{,c}”4&¨@'ÓÜó4KÈí™Í{Ñ\ÇW´’ÃÇà¸lß~Ö†¼6ÿ OÞ –Tméû4'Ì?:bòõ½¼¡Ÿ×ZˆZ8J­~9BÅ峬0N\7æº��˜WÎ\áõ�È=a«¹·“®Žâ‡\ß=%Ù߈%G óÞ°ñ]_ ˆÁ&ð3ÒÊ¢‰<Ä `L‚wœ媑8!5§»‡)|•(ãŠK�ƒùð½ÏJ&!x—Gÿ+ZèÏæ0ÅfËË…ZÇhè;¢A+2UÉÌÕÔJÔßÍd.jBâ]Å#Lá+–d8×ü«rûúø×Îé‡Lrƒ’ýå}‡!8ÍÔmu{`¨h{={�Â/Ÿ·¬¾ÊØí†{åé¢ò•KÆÇnõÎ6¥ãK÷-ûX«ã|ç¡�ýwúº–wÂ`؉Õ2.‹ß>žËº¶oê^5ùQ}°o05` åõL‚±…�£v;Q ž°}fIf·¡DãDý7öêÿ#1g_��“óûž‘ªS…�8ûSȸckçñž¡©2Y!2—% ©,W|»Õùùò •ÍÓ9Ðk¤¡úé}�KÇZR®e Ô�Î3ÎïÏš$D»D›¦Œ¦´ËùÄlüÛŽ¢ñxH[Ô¯[�œ¸A7yQz�;�*b;2ù+e¾n-Ç=\p¡ž«| eÙc°ÚÅöÃä>Þ/u9jÑìCÉ4Þ žÎq‡uñ·¢?Hbçí;¾.Fã¹äê²RôŒšÝ40èÛ3->«ÙŠÅ6[ÿ½4T¯ý¬Â^[!‡ˆÛ'KYÚugaãm Œ:Z�WÆõ7·b’nx†,õq&¸/Ø!œëðï5šï–3¢@ £N.øÆ­ÄÜëYxF‚×#´{ºP±Ô¿ì@ÑGwü±�§9ºÞ³„+] ™·0&=«€ÚÞt^«à”Îý©Û’RAÐÙ­ønUæâ |€!$×}¸»AÖ–W'rëêÏbl`Aí¬fìHšñÖnx¾5ÀÒ™§>`Úû�~\FGpYQ¤¬HŒòËo4ƒ‚LxHƒvÒ&ýFÁ‡Ï d ä´ ‰Ã…Ì®' �©Ì]ømCœ™{K56q÷ðó*Þƒ†dïä@ƒÇÞS9¶lS-ú”vw!‘á!–a¡ÈÕZôcÈae4³mñàÀ‘@á•ÕµÒ¨C!v ÷ Æ´ æ*½K+Zhýdç4[TÊj9ˆmù²(ûòÉFV²øýÏh}åîø›×dÃö;ø«Ù£ÁëÚ·çsÙ&óLø+ )ÀøJIB#]éQ2÷мÊT²ÆÆ/!u>ùËÐ G’ ÷žhÄL´\Ô±î^ÿhaFÙÁ{,–\àŠ �¥ÝFCx’̸¡Be�®Ô5ˆÏÇu�o/ƒ�FÌ5G¼:‰d@3Ìc#•X8‚/,�sò ñ̰'Á`1õ©>íØ²`kq~ìz'>ÛV4�œüˆèöp�Ù_HOsß– æ1|$¨n9ä¤z +`EGaEû%j6¿7,ú�ùéÀîßQcDkÒÅ!GÊ]â\Ç|Åï¦=ž¨}»€AÛ|„[ª5Ô8Šúb-‰ J[kY…ÏÂAä–†v;Ñ>\†òéãÙiç,ËΔ¼±^…\]:~ ùên)¶]«¶œàdưÁ· 5JAJ™’<‘Œ;�'©`59X># £–Û(¡ËÞHRVµáâ°«Xö‰ ¹áò/µ˜N!`µºô4d[ˆ{sg¸¨Í•5œ»˜8úémÐ>‡?·å^ª×=�[p@È'ÝJ©C±h?K-é-† ¸;™J\¿ŒB~DÉa†5£ák�Ð�$ Y‹Ñ•µ­qJÖˆ&CÒ:Δ}äKæÎGrÜ=h´’E¢W¦XÜc!Š@aèËp6ÄA-yo<½+Æïcí^$ß e°K\ð†Ã»n³Ô;“l-ƒµƒ+ �“Œ®fËºßø(¥ 7ëËL@Þ/ýø�€}[çýú/ðº?÷ø®¼s¤ƒ®¬:7%íÃ×hÅ¥%•�ñ·ŒÛÙ¥E)òs#¿ýÿ‘ÿÜ5Ðò·ä ¨(+€þ?@ôóV-”nÈöÖnõ QAP¶å'jœSÅ¿TvÝJñ=ÏÊ=Ëþ/?œ€‹n8[.Vp;‹KùŸãAÐPPPÿ7ù¨Ñ¶< íËtmE>BohüŸÌ#ßÔûäª�ÇŸø˜‘ÀE ô��K_õ"|@u,ãþ®VϺRÏÌ’�Ä´¾hýé)í‰ÖTmßÑCmÑà¨7q{d—›GÅéðŠÇ‘%ücHs ©w¦Œòx×Sû‘¥›‹»¥ÇÙªÃZ÷ÿÞúB¸æFWìg…#›¹EÿÑq/!qz=E ³’�ÑÓ‘QÂò<îû êh(@æ™kòÕZ´F+Xg»ôCðA÷G¬ÄÆhÛy±Á¯3Y^îŒ wœ 㪆†¸|Sxkj' )š[^Z˜, “ å‹ §–iè;›�7ÝîÓýC{7¢ù˜6ûÆŒˆUQD¯õÆäKîâÛÏx�.Özåo¬—¹ùÏž,¿÷0ÖǬ{zÔ^¼–_-&Ä_Ú뮢¸(()ZÛû7åŸF™CXE­;ØÍÅ8 ÇÍKi>‰÷fصæš)AJ¥tÅ·1[¥×ñ¼ÙXm<é:H3붃È7-�ÿwÊGwÙc1‚ØŠÅ2VؘΧý·ûb"B‰3Ô†¸ý38‹>FPÙB¶¦ýºiìø,ñè~µèÁ÷áÎû¤Qø¼àÎ_wÁóz‹x‚�š6—FjI±ÉbV3Ljµ]†b¨ftH­gáÁZ+A¶CÏ=Ϙñø}si?ÁnÍcØâú�;«:–‚ŸÙ†ú5Òx¡¹°?‰�¹®Õ+ÊæÉ˜û]A÷½¾�àjј£Rq¯Äy|kÞ®­gç¼ažÊîÁ*`»°‹Êw‘ï‰Ø,aŒ~2V)ŸÇlMovz$o¼Rý îõë)õ|•æDwgù�#h<-ΩsÍ}ðóMÒ…ý`ÇFc˜øÜÇçóYCžiI㉭ž’9÷æ s/äP­KTÊþü`s܃õ¼  ÷æ�,Ñn¯ ßçk ¯ÄET[¯áúøc«Ñ6´vú»”W|=ý§›èkux7Úfê/½_üó ûëË�¬é¦ôЀ÷†n7{;V롪:§ÁÍcjü­h¥Îè^¾D¡:ÊÚñmï£Ê_ζpO°¡[Õ¢_Üpð7Ò9AÁG�½öê?Æ L ¦OóïËqŸÜÊ–EÖ±KÆ;v*’/¼)—#¸¸þÉjn¢V^à6wvˆ“‘¶–Ê©I»¥ŽiþöýŠ�p[£ 74Áþóú^Âù\ô(S¶7³BU"-‡fh£jä ©2»Þâ»d„ôþ¢;äÆœÇŒ»ù ãNàl‚>Ò9ÈçˆHAõ¦%ŒTlŠ›ëë¸tƒãePXÍ• t§@èg®Œ{7ú0ú׌¡nš¯·qAiæÈ_]�½Ì­cž…ÌÒ§5Ä—Åu¶.ái™®=_<¹ÜJÛ ±*¥h ¼}òý£Eöá5µ¼ò¥Dy†&kû{y²íÿÀ{�q.VŸÊK5eÊê¥+� MÍ�m¬Ë"UŠ&Šhƒb¹¬ßï‡vË9=õÓëp=7ø¦‹‰#–º;„eH�tP1˜h%�=G¶†<Ï¥«þ¥ýŒ&v¼o¹úmª÷ïòƒ|Ñ’‡þm|õ…Æ)\0¿¹\RÇâúçÜ6 všÔjw¢ºæå”p}ÆB7ûvÑâLwü—ó§œî¦ß/Ÿ}¥6t î­ÆÌý … a›¸MÚú»>ì(. Ô~>¯+½O 8²6�£àÅ¿VÜ~÷äèwïœI'�„4hïØ¿©ËÃŽùß™qû/lùÅf· Ëk>dîõ¾Ò5¹œf¦k#7¾6=Ýsi´7ê8å{ÞlúûEÑ´(ÝÜ’·� 2¯/_›(Á³Ñ-{|åõÅÂ…Ók›TÀשsƒ3ée8§Ã¹38”}Ñ!ƒðµ}>²ÃFöí–ÿ„zõ�Ïʹù§ì|„Â&³žªñIQc<•¤üȹã;ø}½‹×')“þeN¯jÚü>¯¹ËáW‰íÍ û;¶C/îóê"ÖkѤµÙ:BÎ܇Œv�†[Œóþñîgq¢”ñ¯…ûN¦é"� êU2æb=Ȉ¾3ýî`ì J<ÐEµ¯d_Ýl÷Ó¨â%÷ómåaF:~¯p|ÊÜ’¿‹»é ¥dØü´0ÞÀœ+s¿f>Æ5²„Ö~Õ9à_¹í9û+K?m»ê™<Ê“#w²Q©þXë0ÇÃþrpC�úždÐ.ãóƒ'Ð`›Þÿ‹ûN‚Ü£Ráú]ó�Ùø�¯Äól*¶‘ƒ^%”+kÍýæ÷ž�âáßÔª?qª›³Íóã ù—ÎŒé×ä~~1…qãZñiæÐx~;@¥k§½õ\~µ�¬6�º{°Ø£»!xy€o•·âþkX!Yªé$.O£@¶bõƈÏ|¼«Ï(ŒŸ´[Zÿ.nÅÏ'C#Ø»ë1ä×Á Í®§‘Í"ί¤¤Íöc Òw@iöÒj®{½û;+²A6ú½Ù8’b@ü‚‡ýþg…ÎX¶[ý�yd�—$ítºWNH󟫱$ž¥Ã‚¶×¯,资6¾þ™ñL:ß�„5á£LlqC<ø ¸7ßu…ϳþ&A Éãê@ä^xcÒðLE.†ƒÜˆsÝŽ‚›cäàÓ¨¾ZŽ=üù¨”ÿ.¿°þµgÆà~=»´º‹ˆ>{ÔŠŸ®›;h…€úãDâS^ñ¨Ç¶r$/{ï³ü#ç�"�"«øš 䈞 ƪl~�Á…jµ½à ,Þ-Ū¸A7ß²¤âf¿„ÿ©¸ËNmä_¿yMkHq}eȱŒ…'ûô¬6ÐT6ÖĪvâ’­Åòý¨9BZ\¥m4ŒäõêÓy,Ñz¤šhKaê±'°d¼ÿ¼Ñ�ŽÏZçˆ;ÒÚãbô�[©ùǰ駲@q¡×tAŽ«CÏ¢mŒCF �j€Å�õXþX—å|–ßïJ¡埞ÙŒÚjpŸ²W’Ò?7Ø™Bºf•Ö^Ö¬ú#8˜ì¾ßW_FÂVÂ*:n·e­Nû{b/ R”>G®ý×µ|³eíhû"zoº¼úÿA¥è7÷@¥(ïŽþ|ÃÆ0íìš;M¾åūҞ¡žˆríÐ,û”é^@@ ŸªãׯîßǦ_Ëâý¾ñ‘•]®ãÖc?îV{^m}±z“[!t[tœ«·ø]ÚêΩ´ÐQŸo^`ß÷¥¨õ#V†;äIÅ5`¶|çž`.ï´ÿÜ‹Þ7!ƒ¹Å/ìq�çÔ(¡‘‡ÀcLš×š±B’g_ è‹"Ì|WF[í£².Îuˆ ÔsÓŽ-ÇÆ æGIõÀ‡GêàŠŒøì� mÍ%Ëoß §Ë©A(OjÆQ´`¦@¶—û¥GDœlúË‚ç*в¾Å<‘8ò?ùÁþ'ˆÇ£Dìˆ$Œ°Ì $˜·Kû­C•|'öð±¢À÷Bn¥…)…/\Âä`žyÅüí ¨å»nÛ:)1q€€'#‘ÏÄæÀ¤j›æ3ÜõñÝå¦U8…;L×­£):;tjY`£4ZpÜ-±¡Ü&¼íÌðïµ{– êÄÀ­’\g*8NBˆÖ“ïäc£^—¯^¾@˜H’’‚Î=EŠäìíI-°Æc–T º.ú0%ýedâ“fG™ u­vú‰�0)lÝx#¼o ‘⦦ÕMwÐe•„$'8–Ü`ø¼×Ÿî0 fëšgc1ºX#? M úKdô¼È™uÎÊ9#|gï`¶3c·;Øå g/®}ÙíÅв+ÁNoÏ*yº·ºãŒ£�ÅÅrɶj7ÈM «¹Ãs;¤Ï»Gy³\J©}‘k´M?ÇU�èüyWk9ù#ÁÝ�YKN²þǵ7»—ò#/Ùòô_Otÿåz� y~Ÿ›>‘OyÏÙb4cŠsƒy7ºg~2òØ…Œê‡00 k`Ƨ‚ ÓP�$�µ­qy|g¨â20”“‰�ô߃6|¯9ƒ¢Þ†yça9²ÆHM•) j¦x"ÁøÓµJÒËÜM$øi~•¸7%#h&N wƒ×nmîzæ¥iæGÑ8¨\ïâç·A¹ÇÀ¢çÒ”‰�2ç×Fíæß5ÔNò=Ì,s _&ãº)Ì�c 4®±ÜÞ£TÑ]œæ‰F{¾2'–õîÀ‰'tÛ hdK²–Ù]µµÛÈ+’œÒîÃ`ÑϦ Ú£²½=t(Ð�!Ç}óŒU¬¸ß6;}8“¸øèi×M³¯ÇÍ�³Y´.‘Mi§»:Œ;M{P—ZVBhB0ÖÏ'¡ß8WˆÃ\-!uÆí�w‘ë×-žŸ×^þ¸Ëä…íaÚ ÙÁÂÒ¼f€ÏÐÆœlõ;ß/Â�Â$;G¨̓@h\º Q<›mKï=s€É™µž zñÒÝw׺È�uÓžD ¨CL‡ÅÊÓÀôdø¤[xF=Ñ�Íèä³Çu2¿5aw[hx¢2J““¿þÇ`ä½#“'0Ü{ÌODê‡}Å!ö?Ñ €!¿ß!úzŸ|Ç„å³B‚/ˆ_—o»í,vÆÊ—|()õËmßÁ¤bba¿\.ܨÄh02 ?L´ÄÇ}ÄÅW "_‘ êg³¹õÔ¾˜ÀP¤ON>Ì1;û ùÐ+ŽÐÃJbÅoÅEè"aä¿{àý³¦7æ@½ü\»H§Í ùÏgÃñ›Ñ{bÝðQ›ãÆÊù’Û!-[LãU)(17ÝvÜ�ø·ÊÑçA°¶=ˆœˆjÃɵ<Ò@ÐIôHlØNÞÖÇAæKÏîCd¦‡‚a‰àS“÷'rB,ÞƒXöí ‰Ÿî½÷2»FýÄRc†}Á€‡wûK Pöÿ5Ü¿òcD++àûïy»/«ãß·ìùOˆ¯Å+…¦Ç1�8>5ïi�Ùümtþ]Œ×A•ÈωÆÌšguzs¥GK›äÍMdØþÆhvñ Re…¼¾ÑÊôP‡P0j9WX–_?>÷ó©–¸ðæ'ÇÅÄ¾Íæ|g'Ä‚.U]ò^úÌÞ‘è¦�:ÇÙ’ná1íB’*¶=2,4ùäªË•+6M*.ge)/2í½æ²O˜LæcÜEæè Æ­”œ‘]àÂ�'’Q#È@dTyÿm`¥`\ûj {àOþ®)Cùî”8¸ÉÝç"Žž^É­Y!Œ=®É]3b €æÿ âhFEØQ þ3óg…‚€îíæœJÜ“ì¯x XŽCç×ã=»~Zås„ÂÎÀlO"�ßß|^%¬-*®¿½^ õ]Œ²VòD�ˆš>à š½kqGGšÂñ•%þ/Eı¡\fü£R,v}ß>¨öï¬}¯Á/F;Ÿ,›AU}F˜Ë+‡>ãÔÑ)`b>?uŸÄwŽrMK©*~¾Ø@qâ'ÿ‚;d…뱟½á»Ëðÿ:c>wÜzùLŸìÝJ8ž{]23k °”X€Î Ö ·t¤Ü'¸÷'nš75ûà–ÇÚóÞy‚ô†}s¢ÖÌ®~Fæü£´æFœí£åùE�ãg;Äôec;Ÿ>Æ+��Wž¶œ(é?=� Áî䈟›?·¬™YÆü6†�iu.ë=+ãSuºƒ_kF6Àñm†×™ñVqEüW×÷±×ç0ÿÿMd.O‰hk©0`P×uSXÍOgD"¯�`<¡Îj\7II¯¦éþîêðJ™,_�‹n[öÁEü Û>X€Þ?™WÿÒÒ�¹08{4l̵�ׯl꺴r×o6ç�6{Å+–Œãi²>ŒxCÏœ¼ÍÃræ_›e‚[ó4Pn c§*p¹¥@ñ׸p´O²2BÞÍÓ®"üwø=p/†ø …‘ŘߥêVóÇ;G ÅîÖjÝ‚gÄÇÙŽ,óû­ –Ã᥻…A;1ÿ¡ ‚Žæô_9Žʸ`sÅjÄÔ€FpÆÒÈð®óîì‘åª/!b Ìõs2’åvÔ‚²JË.¤®ÛI’ ü‰�6½g÷_¶é¹eq}?ª3øœ­ÂÁºÒà³F`­ûXýç$ÿ&d»~rëàEN»îŒš8uÁÒÊ™ûH÷‚< þËÍ^ó¹X°Ý¾?º>FôgãûÆ›°à+«ÞyúŒ‹‰ïï• ,‘u´Ã=”Ä ¨÷¤B¶„™ÏÙdú­{û7Të¯*�¾W£k*[§Ò’âbõ¬XihŠ÷'‚›ûiñ¼<HHBÉd­°²Ã¥3}.¯�Z…È~NŒKŒË‹![‰¸îÍ ¯Òjp xC$0[!¯¬j{’F<� Š2B�›òþÁµ×‹þŸ2ÂHY>™%jpdRfôÖ´�Bd­dòÇjÁØuõ¹ #ÍØbè†[2"Æõ+ï"èÑA–œ@�b*Å‹«TüV°.�óŠ˜`‡îvÍmŽ'ÞÂw¸>e¥üªª¤,‡,ž×Úš³F«•kb¥S6z^ØÞª¬l5x©�“ÂÜKâ^L%ºaü�ŸžšŒíÅO6ŠÞúÉb�”sà™íJ“›9X…ãTeÿž?/ Š�­ˆ ‰§B£&O¿9#Îà=•ë鿜~ûçÆüÛªÍ,êΨÂì£]JÁv·9ƒ&¨íP ˆ f;•´@6£21åÚÖg¤xc�£8á˜Z†Ä¬ ÞØ¦È¶jäÑŽBk­¶_VæJÉ ùŠª ö¶Ò¦Íï”–§Cƒ C ‹­+‰š>%!Q4ËF$Ú3…¤ulr8Y&H›íù‡\ eÆZ5RMÝÙ.ÊAll2X˸Ñ c¬2–Ÿ•WÉô¸¸éë Žó—•v§—×xl·e%¹#J�,ÆTÿ�AE犙&AÓá4ù*«ÍÑÝ´`A}ep²â¼¼ê³D)ƒz‡^Vb â‚«Šœ—@qéÜr&’«õ±ßy?ýÿÁ=7y'�s4÷ÿ“ÿÆ�wü‚¿ðPº _ü�—ä²ÑÆõÉkìå示ùMG°ð¹>ÝY1\ Ì‚»ŽÊ3-N ÓlÂ�5Ó&'óÞö= ¥KNFE�§üM5à5Ë÷-ï­0ÏR€‰#n@¸òÃ×™wøÏþv%œjï`)»?¶îjÉzˆgù”› Ty ¡’¥øÿœ-¡\%J†/øì3Yë�ê/.|L#›Ù‹dläW,™Ùú�=¤&¢ìèj3Ce •Fš¡l =„$‘Šš?ø9[RörŸÅ¸P[±9 :Ù¤L›ü;Ëaƒÿ”q·4ÐÇ0ooé“·À�fiú†I;CE {â†ögÛXWþ ~thÉ -܈Ôg�yò j&AfùÀ$ÂŒÑò±…±ÉW¹ÖÏW»Ý@fÞÝõ‰ÆÎó'Zî÷3‹o>³ˆ+ò�²)®qPE�'¼W Ì(áN�¼MZ‰G�òì+ÌcGɛƋìûbÄùï:‹°QÔÎvŽ˜Ç£.¥Œ®W.·q¡D2÷[W ÜE* XÞY±æ´%Œô:{ugA³YUÃÏÕ5““Þö£ÝÈÍ·Eï’PH@[G¤t"¯<+¨´p[³–p} ;&Ù©_p6>% ƒBHH•"iP<ÈÚŠž-WûÉ•oc<¤×;Ë#7Äc€POkñþÅyЬå3ÞÑyˆûILÝt�j*{§‘å­Þó¦…´èP�^”_“³ŸOd1‡<õ*^­Y ‘™t,;áOÅË g”+Z[-ï9 øž–kw­¸}ý%Øxî³�"ïyÆ1}Eñ„Û"né�‰E4ÂÖ·9t’ší¸CÝÉB!¤)bó„õVôg}|@8?0·¤PÓ|…Ù‘³¼ÜÒ7—ˆß­ÒìMÏÁëx'ó;I8®hšÄŠ™6ð´ù¾Fž1ßFÓ’ÞÞ4%ïÐcËê“ÔÀK¢£™Œ8ÙëNe|Œ–cXæHz©TF@_…×ü'B]¹W3®äãztƒ�óÄÞ2œÙaš°*Ê0½¡%˜Úð€  As1¿Ð)¥lõ±r�aûÊøE1¨ølòz´ÐÅ0¸}{�äè1Ž Þ†JŽ$øFŒU±ÌEýJ­?d2(­2±?x0D^f‚‘DÃVªdbòu´�íâõ‡ÆêzÛ=¬Îö„·îÇ=ÊAÙÛνò•(¥¥/Kí`VМ߉1îmù-sLiuQaj�&Úø7ü­sûDK¯;õ$d¯qû0;$5ûóK6lðG‡ÔÞšX>;£û1Z0šWj�5âFEáݧ�«Æê6û÷há£zÙÌÙh¿Ä_{üqÇ=Gì± ÙÞgyüdþyÎ×mÞì'xá×zôõC q‰23å𿯵ΧJ8@S² 0" ß?ïöT_–"Ál·€©õ…Zf|ãMæ M+¿ñD|ÀtÃV~ð_°â�ÂÛ2`m˜|9LÕ67ÅrÆà=üÍ »u …ö(°®I�3¦�Ÿ¯£ýàÙGÆé¯^$gb.üîjwPÜžc4ö£ì¿NZ„*×56?ݾ–FÁ¨¹�¡×`;lÞì XÔ¥AÝ—ZRpÜFó*¡ovP6Á´¹×tî†Êˆ�u}s¢‘¶åÂév–f {qÕlfgƒp9h`>Úcw =I0Ä×OìoÅ•ÆÛëNÁvÑqk˜è$Å[>Ëì†9ýÔ<]ŸÃðÿT‹EKáû#nå«llLýZ¿Ü™À9»�[ôçÙÏÍãl  ¿ïRÆ1ý'²²fŠ ªJñÍ%þï,)@NØšëùƒZÞ7xð~é“eà÷^©¨§½ŒÊ5!ö´TÊVŽÖ›üÞ¥ïǸ± 'Og½>GûÕ´ãǯ˜ïæÊÇ¢?âže+›1Ér›‹/u �kË…êÐ/_‹nQõ` =«KÆJÃÅáÃ|ƒÀVÏ¿#ײ.zõDîçzŒ)®þmflî€�pN•aLÜÚÅU)Âã 81¸!O«Ô •6“ ë–I;ŠÀ`¬ ü Ÿ0×–‰ø’à–¡µ£é"²®…}¡ï‡}œNt�ðn)ÂIÙ³¯*.éCúO—¬ò‚_C÷ >×x#g½ g=&NE)¯ü_ÃŒò5‚ó|ˆÁ³SìþŒia�ä¾'Þß/û¡8¾]]of ÷[ŠMØêž"P2(ï÷ÅäãÜ�}"ï½p¯�XœDGÔãk¶C;äè\±^-Tú¡Š¹oÖ�šR·«‹–C´”J ¬Ü¹m-%Ô)ß÷ïÁ{•O5vÙ‘=ÏÕ6ød ÍÛ v¥þ˜ ùö�ýÀUêBÛî8Þ™~wSžßõÔü=iŒ˜Zaì›G²ñ¾}ö±šDïêÎÚ‰ÍU•84¡ jH$„D"b¶%µKÍ µÐ•v°ÿ�—Zõ.¢ñûÕ•ï�6Žâ9ˆï¬&ý¬Á÷cL^gÐí27lc™ð)æ�zäZÀ÷~<÷¢bÍœ‡d€D'»«‚Ð�cµÑ ÒRƒ(îm¦tzÔ>´_°÷÷w½ð Æ*Û'Œ¨;õ†ù>j\µ$ž ˆ_8uäúDì¢~-'‚ÔZk�}˜ÂYj‘RÉ–°‚a‚35ßÂkPŠ€vïe›rv3 î‹”·Ã1¬Ôâ©h7^®®Öë‘=†Ÿe¼Ró¢Ê¥¡V`È€z£>»å‹ý�î ‹åNãÕbäç—â(Ô—ŠIiv¥ºÝFÓ1sÃ� ùÚí1^úgLFZf¥?ñK¡å;ä0âÿâ¶%�_WM™vx+/ÌŠ!A¿êMü éŒó¦kwv:Ï�ö¾øí/sžæÔ@Ãò?âç:@àÎ| ¢JÇÉv‹ëžSWiqt2”«‚ ÂrP?Ù¹Y þÅo1FùÙ·[Àè€H)³ø|Ï%k¬àRÕŧ Ö"¹p�çÍSüwÔF‚êUó@­XšG+² •Ûg¬d�«|p/²³¥ê¦XXœ+†ád± PVQ;k©À”S×K@^=Ô½t+!�¸ì •½ŸÌ4ó#Ãé¬.õ…„ÐGñnIŸæÿq…Z�=êz53º°Ý»)v}‹—F,^e„G ø>®€.˜ßa;÷œÂ êÍÓú�*dp‚ô¥Ü¿Ç•·¨›U\ò.‡73;É7:“�­£Ìûêuó‰È¤Á£‘#±ášö–Ì¢m¶GÉ]»O·¢™¢åÒ\Ž•¤C¼À/Gø¢ñ¹µÎ÷AÒÇéQ÷(�Uø¸òg�ÚkœQþ›Ê¹�ΕðjNĨÁ#Ð¥ã£�ÁÉÊ5¸¢ÚPÁ+u^<ðÈaUÙ1\ìp·2°>»½’ÙÍäØ@›ðäk£–ñcà÷ĦM±…áïŠJ<Ó‚ÜLJ‹+mì°ªí`�¤œÒT,+e9¿.ÚÐ, ÿ÷#ÝçB‹ºV �9<£­ŽsQ}ÚG¸¶™¨<9{ÔѲbÜÒˆíÍ8�yii�fíY;sËbüÍbáçK†U–Û¾û`¨ÇÓäã!oq£?Y‡—¼e<ísË©€í´4 ‚û&]Œ6“ðV�AVD°òE.³ÒÇV±@€uD-:×÷9ÏøCáäÃø×`géÈßIØ×­å³£³ìéhÉl4K;¾f³1Ž­öøò}×ñTV—ø\²¬µ„^tEgï×ó÷©ÍsüÕ€D1†L¦}ŠÛÐ�!½» ñ1xï0Ä…(yxVÌ5*°3tBš¼Qa³I«X�“€Ia€ƒ©Â&>4ó¬—ÈÆ�ÄØ¾{µQr«_‹Ô°w‚p.SÅ2gÁVÜ+?Y1ÿ Îó™å¼×äÌ(戽9“ÉUÐò »rCÿh 퀞¦Ák°é½»G ôÆ6J†Ôh‡ù ’Ÿï=cT —¬aÿ&Nè¹?äÝø,€öæÊ¬X¶<·†Í`týà.ö2�‹æêÅÞg¶¡’0­s\ZGPX12o¯r=Ïoách´©ï˜�%Ϭ5Œ)ëG—I³šàÚs•f#I)¾³Eν_NœoïÜ>Æš7ÍyîPUeßfŒ5¯=õÄ,�û[¬q¯mQô1Ë[’qAxkÃ!�Æo�Ô÷ñ|³ÏŽ&:gc¦ã‡:ÚG:º•ÿ:�iƒÿ?�´C{¶4 ¡šÜ"ÞZx7žð@@ЛCÌ õçÚ çÄždñÓ)§6¥ršb×Ëų´o‡ŠSÓÏø?û?ªA#˜í9v�cCkþPD$’PÐ’cü÷~µÿw·Ïýí÷¶û¤ ¥#óMo³èvöùöéé—Ѷov6îœÚi³ßóã×>hÚîÚHJÞA Ý@)@”£í᜞:<\¿ês $¢&�¶44ÆsÛ¯ätœ¾½éütòz¾ÜÛ`Ù¶{}óW×ßo¾ó§Lz¹�¨Ƙ1¦~½ŠNA¹ãÙ5Ý'F¶"‘Å–†ˆlê�¢œ°ðq2#[ñ�½|@É„ØÅß]‚y. z2=ˆáz<¥`óíD!¿¢¹ñz|¸=ù�®|I”b™Ö$P-k � gIJà œçmÌ7ûûùÌ…•þ6+øc˜ù+�"BÏwùмz³ÍèùöE^É"´�>t~IuÛymŠÉÀéYäSwH)ã2×´‰}eÑŒ�1óÂ=+c5×Z1Ýí`èlš0ëP2[õüp£÷sÛ¬¡âû½y-|;½¢0áO7+IP"W“Ö!±v“ä¼€ú¾ïg=Õ–ØãÌk�Œ-©åøüY¸kO3]rÛa¸ÉçsQ�T(ª>M2ìb±åó½n7kPßn*Eü; Š9# Ä …I­ŸJç[ 4]".Œ‡ÖÖ®UUe¢zM© àk„™†-™fAØô×>q ” 6̲–óø5¿oá;—Žœë�𩦲C—îÎtÒN˜#£«³×‰%n0š¾·¶/oþþº=¶ü¦qÐ’_›È�¾1æÏônï=|ØG¤0øk”n’³†õÊôÇŒMÜ·9³ß8m(+…pÄzu>ª3?& �° u- Œ¸oþqãqïF,û<›8b¡‚`EªÓWìÛäSR×cf¡ëxºç*{ö=1½RýßëA�ôËΪæ’Û—®ß×j¢ÊM’o0¬$)šÿÚÅzƒsl�ÎÔ(8Ö¹ÊAÕž5«dè�ÃÞ~2ìfAÐRvw½à¯ê#W8˜¸ÆøúÃÛwèÕªÛËmVÊÛjÖÊ­­µ…�Z~„`RLI\çû×õÄ~:›·ué9m+e¬èˆKãíß7'sŠ<°gZ¥Y€\N_ªµLWóÉØlƒÉ•ƒ–q´0Ä|ðnö ¬±EùhÍç×b”ñýKs~÷:v—MËú&²ÍΦ´/ÝèÚ�¡úvô±Ë iÍì�MüJ?ïør‹R?{Ðú#gë¥Í­O„V¥h¯ßØ.¯s›”ü]Ïî׺ßz–j1Õ}ñ%®.eŸ,IXÂU³±U¬$îruÊC4»!³ i�—Ï” Jšáw’ÿ·¹Ù2ˆäïe 6]ô´_¬-Ùm v'mø²‚ºoDY¥’:}zBH0LJIÅSxðUõ2•ñÅÇ7²¤4´ìÆAXLäÜa®\'{¬�‚¹[Šz!òŸ¥l°$úFTVJ;cÓÍÛ=æ‚dÕˆ±Ì¿ÑóI )4x’ŠËz_™‡‘�Ác'šDÐæ.ºj+üY@•Tz¿Q—‰¿.TS3$]ï*ëà!¿Ý^b9=߈s…é*;ÅLjÆ5*H¤bsRí€[<•x§±Ï0.Š‘H\­“sÇj[×DNùÒe–䆄~³ôxCEé Àcg¢ôŠ'_ë—Ø;°–Éx?—L§¬RQ9ðþ©À¹QŠÎýK]OS½S86,ŸßÁÆhöBöP…KËÿ~Yéø@t­ùärøÈ­ßX2ð”´Çk¦ëžŽµ%ÈP.¥bêõºAØú‚«mt#h+«ßE,b~ˆ£Þv*‚)®a<íòÏäs!˜³3íU ×’Þj/滢YàæCœ͇Pý„"whÒ =aÏB/»Õ”c;ÂŽjø‡¬½ÍK ZR™)û�ÝH&ñ‡=)Ú.7XÖ2ª²Dš[ûyVû¨«6Ó ’3¹+*iS Öô€2Æd¦r¥p©¯q*Þ} àè¨ß|#XèÖV½XîP= òpC÷]?f‹�OS4è ÆVƒ…d :Ô ¼„/N ¤2—uá9†%î0¢™A˜Ìe±å“7Ü0Î5ÅÌéoÇý[æÊZœqÜ‘Ñéؽ'¹èOáÙ±Úœ5ãŸ\êW�ò>³ò\êÇõ jÜm±k ƒBÏaA¹GƒÞÂÛ5Ç~Óù¢Èm2yóȪèB~ô«ÁÀ¡!qIŸíäÎjOÙ %-Åf)öËÑÃ%y@ã’0rHI½ ZУs ÇèþÚlD'[Zd2iÀ1¹bækP†¢¥è9¶Žœ™°-ä‰v°µ‘ês‡Ñ7–‹q”ô©dÁo˜ç3�Ië¦{Zßu ûß/A‰ü휭¹7…&«'|_ÂS'35‡6Jtòq2—éòô@ªǽˆç©êÍJ54¹0aµûÔHÕ´uÛ—)>ÕJ‰:ɪ´�‹“ÍW›‹Éä&"Çuÿz�nå&Þ»ë:ÇÃq£_l¿ÞŸo|_“ÛúÏl{pM½©ö,Õ–,?¤o¿> �ßlvÇó³~ò&í®úšë<£U5$ÆJ%­Je0öi‹ X/EýˆÎžz“Çû þ[º¯ˆ ,ÏVk™b—úáÂ'ÿŒåKCÍ2Óe#팳‡üE-ð•zèwÐÉåí„I_ð()Z�ÓÕ½,X†»âBt®ZEÌøüEØ{åw;zz¿Âk+/ØœÙør¶AÝepñÓõXò²ÜßÏFtÿÚQd û 2GÐvóߨsŸ£˜Í±*·„…Gø=þ`Y]–oÀt­£³&ÀvF¬�‡7¤Wp‚ XˆKuGEÉv—ÑD¡æê_/ÿ(ÞŒ�÷À2ùÕŒ[{d¦ÆüKœ·‚öwä…u*&rÀÂõôÝ{-ÒóD—u™._M)…‚ArÔ—`vìO ªáÆ@!»Iås;€\Ëšh¢“yÓÍfôo"µ�÷‚±SüNÛ](ðÏ3Ï0×/ëÚöV�°Î}ïºKÜ Ü…Àä'eÛ±ÓÇÉu�܇ÏÞ—ß(Uý| ©âY–s9F˜ne%‰ÈÐò‘i ¼oú"¬r'ÍøÖ}y?'›;5ü5˜?8ׯïœÒ“Uî&0<ö ·³ܶv“‹ÛæðxR¬ã“&=ˆ*ê =¹_'èY”û.ÙFóþ¥ÜÜ˜Ò 0©0�B¯‘K[ßG�œé­ÉDÖ›6ì–öô4�œD¥kçϹŠòoñ[®oÝÛÐÕÊœ¡½I…ú¨á­Öó„>s¬>ÙÅzôa» pL÷¸0fOºs‡„H}ÐË R¢©º­ØO„àk"£«Sprp]\zÑ+} 2âub–Sa‰è³jÖ¦æ,@FéE¨;†1 —‡„7Ð^Üæß.fì�¬A¸h’àªu£ž¾;p'[’ˆï»-†ìw›¤+}0ÂcÛTä6ÝÈí9fð Åc‡ãv­ömmˆ»º2õûÐî %ö?Ô[7Ùû¸1ØÛª|Àg0dDQJÕ.Å><&:µ"ö‹™–›�p·r‰§=n”4¦8 §¦éDãÝ"5u,¤þäøY.¨€3  “/ãÇ‹ŒâÝ�ˆ×3vº6Åå/tAÈ>ùþÕQ Œ ¿Äj|öú_nO(þ`KépqËÅ©,ÅöœÛ£IÒ#h•± Rv1{G}ð/­ö¦1{ƒ ‡é2o.Ÿ½>δ™(mtL~òõÂ/�BpXÄù'&uú4Øð`0”¼’s¨µ‘ Ý)0ºæ‰9°NØE ;ÄeÑ Ÿ{�…O2¥‰L UH:è´ç‰Ê Ù‘!¨oòáDëVEЯµoÏ˸“÷W�ËM÷{ ¾~ ïÚä“.ÿ{�»¹mX»ã–/]›–W„Šþ¼ÜýòxNæs…ïÁQм{âqæ Zï³Ä‘ñæYÎEÄ™*l’«ZÃöMý…¾-IÌè#Ùç“x¸ƒåõÖ¢èÁçfÎÈcÒÕÔyÿ%5Ê_.Èz„“|"öúT$ήhDÇ<ñåõèÖ}ŒS}æ¤5I&"šU'WI=½VÆ^JSi¥Cð·¼âq £{Üó—Œ&1Óœ’�ã�QçðY¸­47£èkzãýu±=ð³ ÔÑ <^tnêñ6µ×:ïjŠ˜Áº æ H4;Ç`k®yF’1�™Ðr%Ûe‚�ZÛ¸ÛTHüœHÈIŠÀ%Ÿ4– Æ �ò²ÁÌÍó‹Òæn3ߌQYA~ß'ÏÁo?�yáÄìùáyãÉ$®!M,]a�“6qÆå¼š|‘¯‹bü1o<áÄ›ƒ[ªœùØý1ÆÔ{neÊN¯­Y¹â|ãÁþ!µÁñRû­VÆÙ£|­­ã@öüc€·?ç�‰{ ‘ãÝ?±É—û÷b}þ½ËsôÛˆµ�ÿG%­åÕvvé¸Á `Ü=²SìçÚ<ïUÓñœª9ÃS}çj|1—Íôà°Ê^¼\òúC Â"H`…Ë$(ˆÇx$¾×’E³™€Ø^;¸('"Ÿ&–�|‚âP›ÃTÏ~=j¤)Ýp1ˆ [;J —¶c¢JÓy®Gn&¸L.øcD—®&ÈäÕ÷ÆøÔß_*D zµ²2 "?s°à©†®ösˆ©‹ððü¯Ä |ÑÜ7™”À‚~VÜ%µG0�#õðÊ©~ýÂÖ諜Y~ÏæàÆ��e4ಗÚ1+ŽT{~ïò oe–¦ ܹ‰Ï\òXTE�P1“ ^cÂç˜Cß•dÞöÖf�w¥á;¨õ|b8D�KsÍä°{i!PØ[ùT|/ý:3kß"ûÆo§àu –ó›ÝB`Ž>ÜTmtÙl>'ýÂðx—ßþ?xøvÜaEä‚}ö¿Ÿx™.ë‡å3òõ#D@�*!òÀ’è%fÂIâ®(\ô_öFOK«#¯¥ýüÒ>߸Ø%æ’<3C¬S Â?ºÂ�ß…êñ³:¡¶¡‚óÌ@ab èU©î'Þ¥÷X¢˜Æ#—¾£óþø¡?J3ã? O¡´q|üü'a¬W¡8þi§}àò0Òn1ÃËÉŒBƒïoñµÎ…ÉEû¨¦OÑ: ÙuL~üYäg¥ÊÒ²,_XgÂ‹ÝÆõpUö]îÏMÂÂ�\•“¡{÷ÙÇh÷åï§ÙXäÆÐòm1…”_Àñ®ãá´1¼µ½µèý+;€7²8Y-Âõ%Wž óUZj·Áåðü,mÀ| 7æv�†]É®š‡ŒÞÃÒƒðÆw“< �utšáôa;K˜Ó¯©cêÍ%å †�çôã^7HPæXñ«ú«øÕò%}¯É«‹¾åHõHX 2BÍùÍä˜ÊÀ­1ñC»kˆÜ”_‘3ÝÀd,^O5À'¼ÖÖ«Yù�í�ÅG›…V0:_°`!wiJ�ß<‡�¯/póDÜ÷{ú&Fƒ¿Áûf~78ø‡™4[�Ü»C rkÆcŠ�ë#C€œlìÿìcWdµ¾ŒÛ­%¹t7i!1ªèº5jɰµÅ¯LÞ³ÚB†' J’,BtÝ¢$ƒ!Ñ1’7äŸ�3¿·ýKÈ@ëÞôßïµ»U‹㟜y8påO|Ñ`K¬øÓ: sãAqc¼Üû7}ñ5´'nJ.çÙÔò2ûE{åÿ+:‚‡‘ûXÿ¦¿àh0϶_W~æ¹v¾øpÌeñpã½z´C„èÓrªJmïh˜€÷­(ÝÔ!Gtd ¢"�ÚQ[Ô�Œ •Ä¡ 3�Ÿï.zå°IÚ²ðIÜ>úª ‚oög2 XP iÆ›ƒYEÛ¦”ï4ù[.Ñþ[¾HФM ËòÓ—ÝWÂ�¢õÅÒaxÛ, ÞòèØ,¬MÊ÷¥—_ýeÚøÉœS &.—ƪ²†“ȉWžà—:Äì¨Dj±ÌÎ1~.üÍG:Ï4sÅžo®·ÞÿßS#Kc�´à¦«‹f 0« >âîúécˆgž»íq¶hw^0»‘�*‡¤²KÉ0–§ W„Oǧ)�©åøXåÐ2¼hÞ‰ÐDº(}Á§žrïwÆË*ìí’GNžêfcÛžÔ"�Ãø›Ð¦3ÉàÙ,zΛmÈ\A2Iñtæ­¨Ë2 bˆ:PPZ§Õ÷s–{³`çÈ^f+HL0iê2?ùŽk“[éÍŒâî#t�ª¼ýŽ2É‘å¨É¬IwLãŽH\î{õ=åtcv5ñ²Èîµ(wÀA‹žæ÷^õá×K§.™¼•ÜóºÊã�Xß*�CšTïM«Ôd�i­èyŠ�Ä?/ö/æ/�¨â�êé7Õ%ò…(s9Ym8ø¢„‘«Ÿp�%ZΉF91^ŠÛÑj1…ºbç¬R»âW`Wbx/R%DÁm]Hâ¸â°O"cwB)r-fîÔɒëhÏ3U·kÖBË!gœ�?øëóÇ£ž`÷x脌¼mª§Û¯öX°è ¹ R”­Zßi×í—&qmPvê6ÿ¦�pˆ@èV(„7©wïùXd^¿½ïS²ÒDlÝn[ËÒɺÅyW±wYßòTÿ@ù7`(„7JmåzÙƒ _³$¾–¤�4~Á¢7]¯Bž×…ÿ¶<äZ#û“ü`õ7\õ0J~O/x¾Ã(ÁÝ@=—OEvÁÒ¥þ‹°ûž!ÒÁ;�gÍ%;²ïŒSØD0æìÀ­�9A¾÷³§Þñܹzôóxĸ<êBcvé–:W]è~�Èún ˜ÂÙ2ík è\{«Îh£¾3N ‘Wï©"¸�=«në:“¶‰ßOTèw¹/Ø1éΓ=A³‹—Q„”\íÈ6^ÂbŠ.$GÊsÔΓ±9•<'w>â-€(å�Uë0+ÌV78«j/i;:?Ï�D:]VG=K¶�}ûƒúaé±Ïa?èÙ®üV»¾‹òí–&Opù85¼Ý‰ØsO³�ïFº»ÁË|Â&Dƒ—àØ¡€sk,*rü’VŽÉb/Ý1G·dru¡zF¤)§š�\Ö®ÆÎ'`¯¬¹­ñGž±‘A†-N¤:MŠ-“d^é-i¥ÃN±3«�UwœÚ9.IiW¦l¦vBtBÏØ 2†–¬ë[’Kôò"NXiÃá“ú’ô±²–R0¬2�!¸jPÿ?û`v×ÃÞ ·â!ºZ¹}öÓ§{sß(·…T�=¾Cfû®ñ»`D²£pºQ|ˆÅí´‘"øÐ#ºáJKŽŽ‘ˆÝÕû.8m³ÏãÑ9ü÷Uà4Øàn=¶Z&ézoœäkEîœC¿¬~y}•s(WRÕaøi.wM¬‘Xÿ�@¤°^οÎcæ¼íŽž�OéQÞ´ÜA%´Kr̯ÈxÀ½õpît úZ7LÑ Û�> þÁ¶®!bQ¯‚,‘D•f·5Ûù¯q¼f–VÜò¿¬¬¡~q¸ÂúV !$N Æ1pÃ÷¾w;V4`“‡5€!˜y޽£(Do­ˆ‘áë}�™Â)EÆ Âí1�¦wâÆ•}�WâòF6 ÷¨îb+V‚ZXœO†K[5[ã­¸s]¢Æ±áÇ6Ó3¿]‘OhRèöÚeKêýÞ£ô­ƒ’h��†A¾{�Ý-¬,WøŒÑ‡1– l*žÈ€Û3¸©æ åeÓ8r¯»ýÍ}œhÏŽ—]Ç7+CüÆP]ùgÈ �¬–µ‚Oв˜/¸Ðtšî[0€¤`gIÂê5H™"fyàœç¼Ãóþó`KþÉYJÑ„uÍ„õÏÕ0ûårá ñ6ÞÞ8¾kÆÝ¸ÕãHÀÚzBzD%jáÃ_X?4žx{åb¦í™ˆÍÑWú ~œ¾Jét_•f™¿½æ3œTãÇYƒi ûDøp÷5`UÚ‹(ç7ý†ãIö Ôý¿…1«øØ@6±½-õ†1÷“•ÄU$´̾-¼º`l0Èæuµ¼ÚÝcT7}ãÆÉs:óâ{è!’õ[œsáéš|Í?Œ ¯Bö^âôþF‰jþ ’³sìäýKM�øùBÆDDeç—@Ëë§[²üO©qÙGu¬]—Üsôwí�Ž&µë×¾ew’Ã.L¶�Âb8Œ†>Y†ìm6™‚p0.ÂY […Œ½Q n¦5¹‡¼ÍÙ,Î{8JtpSÈ8ͤÂuñR�ùy>Òsg!ξ.‚ðhçAäV˜�0Ç]ÝrÁô>­O ¹~ÙµsoWíX{²Ç™ÓÛ@üApzKT0>x ¿Ìœ¦Iÿ%ý©ü*ãΫG¿¿Ÿ0c…[¹•Jþ»W¬ŽrJëã^y=iòþìMî>þN·âááÀ¸ófùjÎWæ×™,ø¿)V‰}©mÏÃ^¯©Õ"#ÍÛnw7Oî7#9ÖN¢K¤ŸÚlrã3·¤"4çÿãö@+aÁ‚C8 ‚1‘1¯Ç¾õ°çÅŒ»Ò�2æŽXS^ÎO“»·IΑ£ºFèd32›k ×DÄð;û¬YD^q¯:õ‡ |ú[ë›D~êZÇV ’L_IõAÔ€ÑXl¬ç(â¬ú«¬8ã¸k8-qÒòD‚X8è }­AZ7äLLª²#ZÎlÁgáˆó¦�~1 ¼�åÎâ ÖÔ­Ï 'Ǩ|1‹”�Re„™�é¼ÕÄ„¥²êìcŠ÷ƒiD¤iCd¦ í54¬\NiÅÌ'!ék.=¡ôøÍĹÜK} É, C\1 ªšýcÒ°Ô«p~ÿÖÜ÷Ýzê†ÛbãuSœñO²›ây³—E¡²r2–t ì a% É]Öö—Œ0ÜÕZ…ÄœQqc ÉPBS˜^]Üi3Kåߺ+ÝxL¸× Œê :ëWT$ÎÅÙZ ‰o0”RNVùY8)1„VÜçTÄ’¶ÐybQÆKÑR–¡‘�sAª‘b'8Ú÷cD@Ü32#_Ü@Ê|ôÒÎY8l’uò ù«pƒW¢îMnÑÜá_©LJ”ÁSµÐð÷½Çÿ¯yæ÷ƒÒ¯7ðñ)Ôu¢l¦ÿ+þ¾p^0w¬L:y§žÉJ>jMìÞõõ5buõñ‡5B•8ÒÔKЈ¬­ÌÚ¼´rêóîÓ£Á�frÛZC*¼ç\ϧQy¥•�út(�v½Â% ´ÉRœãŒLpÍ•íâíç�Þ<ÆÈšˆxXVâË«å•õÔe<0êeá1WcÆ™* ŒéÔ¬ÅÓ’>-L§ÝkZJ`„¨Ë)�Ь©œ²öny:"<›žgSJ6jNJdW{æFiû}ñu~WŸ/u7ÌéÁwåáóz6'†’tdË„Tg<ªÂTB¸Þø•s¹w(D³ˆ¹ê58ª&µ<˜ºÕT2;…‚–9&vÑÖÝðÁz¤¼&|z{\N[„·US97ãR ¹ëqšQë�gFmU;„m×VàõZb:îXC¹.‹DêS¨l5Pä¸Åذ~¶.œžs¦„k ðoãÎËÒ#u+Ϲ‚ÝæþèåýåÔ“šáTQ•tKDÓÏÜñÝL>(ä¡ÄÜDmI£©à&Ãe!#ãÚµäs ‚5tL0�²#W1ßs›µÏ:\<|¨š>!!‘žŠØæ 2 5vE=½'-/ãß+…P¼“ZeÞÕH“ Š#E_»õ<¯3Èj|‡Á\Ò�BwªÈ³›qgÔÖ;¿qAqïsC»Ì‰CdsÃ¥9-·[q2"-CÙ(¾îüäÉ(árôIkânm¿"í�H©%T¹ �•Ê�˜|˜)–B~˲±¶u¦.œ-�y)ó.'w¨Œx£®#ªƒË:•Í]DÒ¼Ëiènuâ®b �éNÏKqèÑÔ+йUÁ¸ñõBFEö�ÊK’& '+žœÊ¼g#Ï|qfO‡"ÐFtÉÕViŽnÉ-ª=\GÐ/{±gœû¥%„J¯Të>ë;7uæ ïV”ÉÎmMMK;‹×ÍçtzmË€¹ö«ž,&ü~½TÎÝ…ë­ì9^í&�(ê�Ô¾wUc‚e*ÊåúÑNR¾UÑÇÜf¾u ÂïNûœ·]LÐ�¿JNBë4мi›ô›Ráÿo?Øs½¾=ƒàOŸ"죧Z{Aµfµ¤Å?h¸Û n‰ˆ àô‡)fì¿%Þý1Ëë~È´ìpìÝzêÀ£åë• êžàuXð“D #|Þ1Y™‚¹Çô_0¦£-¼|¿†½êr5ê4ñﯗ:Bms$�–`ˆ¼|@ &}nlÕÇž …s�๽ Á¹Ü¸�ˆ^þ÷ÕP]ÉŽë]æþŽÏÅ�3h÷Ìæ®0ÛœKÛ$ êùQ|Œc¤§ì@¼JUë%±c\/¸æëÆFú륷¬…§5¦�ÂÂMÚ9‘3]U«l®Ã�>”²�¶vßñÁðrˆK™ãAkùstÅP:ò†/ˆæî¶ïWn6×C»Ü¸ã˜/‰ðÄë¯[ÑYÀ¥"祼ŒúÅ×E,<,]/-#5„ñ›Ü£x±M•=’adm¯ä—"?= óáëa¼½q_/�ll,¡¢P5•²'YâyûËí#„¿37[QµzÙ0þ´�`½¼o ÞØ³2Á$ÂÊIþù?bVØ®Ü7ê1¤í“![ñü&¾¹Îq7±3=ÛùA‹� pÄË–è¿ «Ú´ÿñöî�¨4Ò”Eõ¯š=ø{LA…�SÇÞG¤@ýìH¶yšÉïÃÓ¾o2Ùð¬D +r•OˆöaÌo—ƒè�±8Æqµ‹ëáyL½9l%ö˜Îkr¬TVêÐËaÏ}�_YŒ-K ‡›xÇn„6Ü ¸åï¯D|‚™ñØR­žHe‰o­ º,\k¯åÊ ü¾_Z®¹ú,çiس�,t!ÎbDˆa¼@U'µ ̾ѧ‹¶ ¼Vo¨÷Ý¥‡’Å'ëû¦ÒÂ�3J¾ípMi:Î[~êuÊä:[ÙUkþ€Ú)`# ��è9¿¼$Q–ˆÃä®DCã�ñEãÄíHÝ;Î/6ñü—¼%ܳÍ`_+sU¬JÎÖÂÜ'ZÔ}Ô›¿lSYCÉð³Mö ™�DùŒ[Àœ¿I÷91§eOc.‘ã÷˜X(á%ˆ`™�¼,öÿ—e» 4¬1a6•#δÊÁà–Ec E¨’n\âøRÄ7±ÆŒšÃ™M�L±év³…ÇPkYÖ«7Ç2kr‹O­}­Ï‘5�¨Æ/þ®ÆÊìc>F�îLê¦MÛ” 'm é®QæïïúÇ›_FÎÞIzLUïì-ÇA~­3‹‰/tå̦@G.ºP d�dI Ä–éÔró²ïfàó}_žø\ûço®Ëù ÃÆ–Ë.FlÞûíÙì“™Ð*«™òG5屘bÄÜÈJ&aë'€pÌá“¥�òš„�ÕP¨±‰@×\<^hB_êmfÇJçYÎŽ¿~ U?‹¿3¿ÆÕwãûyäC·ï àÉ p,‰Ò/„ÕÏ>w<ÍñÂÇß\<5d@'®òûÿ²ý‰áê$Ñ�6|?(ÇÌÐ/¶hö´”:±rvÓû¹3÷wÇDºéñr¾Æ7=Žö0 H'�Ë.oÌZßÕi†¯< À®zŒKN—óàU¥k!8›Á{14]óÜÛ:{ùv)ÀO Q,T;š²¥È¯Ñç;èæ§ç|º7_uåçFÛ n¶ ÝgÑ%Ê7c>ãbªI7—Mf0Z-ã*ä™0[™Ê˜n­ë¥öðBq*¹-{7–ÒL$ß�ÀN&Ö&%àÓWä¦öSªë`oÛ¬\›‡ é¼C´g&ÈUT¬ó4m¯rÀ¡e¹.Yã$ ‡û§,• 2S±ƒýfäcÿ‰^ª6“Ôº~K|W¬0âR‰êÐ�éŒ`ì¤îvüY¹ß9+y:zR"u!D«ˆ%½‹Ídul€„ÑÚ�";UÏ=Ðcy| ìŠߥÁŸÍ{aYUÃgôºŒÉÙð{²½Ì_•¼ jw™÷`ypÅ J…|6ë;Û^9k_d1~_Áx3ÉFjáHo;-3J”½ù¬³StT­ô ZuÏcXÃó#‡2²ª^Á——»Gš®0¿kЮÌcƒÎ äR©ß÷4¬Šôx×kð½rö2Ù)`ªÆ‰åÇžk• px{¡6 øðy<-Òí²á¯,×´fëÀ|?=¸0¥•ç*‘‚áöO¹ÂÅ𠃇xƈXáuÁ=€R�K‚¨ÿE" ap` ‰T±[[0ºòƒOÔ\ sÝá÷±�¹s3ï¢ó«´-m÷âgWŠzϹ]dÍmñÙ7åÓ%î[…b@@+.têåáYÇvƒ�t±JŠ.pù&7æ[„6|ÉûvJ=æÚ<œ éhÁ'€¡Ø3“v'Yší¯ƒcL\ÕᮣÇ| Üh}7ëÇ:^ƒ¨ºwÓ©š²Ž¦˜ã~dºÉ®¬Ã(ÂÎÉÅæ¡']캵ˆŠ×vöÌ/~fƒX/½ãßÏ“ž#XNˆ/·ÄÏ…2ä„wð’ÆI‰ ¶KÒnŒÑ‹¿ª·åòú´z°³:ï2cxÑœ3‹�5¡ÌK‘m0Ž~oWÖ¿\˜\‡K¥t#³•úhAÛ#6‹œ5ÁÞv’%ÂàÑMQÌÌ!‰ER0ýÛBŒ­:§N© ‘Àé¡]JøëP‚�A‘›éÌ‘‰Ô"¬([I•ë·¹ o�¸…d¬‡Ä8äÞ=€Oâç2î«„Xæ)ÁñNÎ…‚ÜíÛ¹�LñƒåðõûS¢eXJIÒ³ù²RÀ² \®<½ŒÃ.T#…'{ïâкîE~ÕɯámV©Â&™î[³LsO…Ùʲ\:%\�žMØ;'n7Õ$¯z‡ä©�6¼"ȅꞹ߄LÄ:Fl¨° =ž6°pHJw¼O\rù˜-¢é÷ur»B,›ëfùw"$ebZ¹6éeÛdÞqq›í7²:´}¿›kԬ対ªøz¾$˜“&l“ �œ°çÔƒ…\u}fº‚ÚÍ`ðì=Ë ‘}Ÿ—Ëèê >(¾’ß—®'xDӉϥmОNwÓíð7)µóZië‘Që6ˆÉgÌu‰8å;‘‰ðogÁ­ÙÈ a1ÐW:ºçXMSèÒVù}\j–×<£pBŽX\ø×8\ÀâH'‹ÝXoW¾ÝNsQþż÷^eˆ®uÏàÕŠßÔu!C@VP¸¾ñ«jnPÆ3|=Óý¼Í²ß¿q¯ÄùÞÛʺ�1ôV¢”=)õ'7K¯äVÔ`|j1[Þa{�ּǧ¹Ö|u¹^oÊ”ðÕ5Žh·ªÙ]_Flì�|gnd cw^ѲžOoù×#`·¬‚ÄqïyŸ'­ƒvg&—¤§qĘPôêd•5™½næž=ØY™Ãš›C”×�"Èh9W‘(o¢!_º@fÛ0>›µûáÌ(š³^*¨b�¢5e+ÉĽ¦Ê³IºÕ¬¾&‘�Ç45Éÿn°»‘‰øúA]|Œö;z+ �™[u÷ïÂ]C» nšöó¨;û"ü¾ý¸¸‹Np’UÈ <7ƒç{¨ó”ðeA;×@Ðn?œg7LôoÝvdî–/',†ið4† =(öáv3¼›g­?5~C')mÑÖFÃ%ÿöÆ‚)¦ÈŒí/YW®+iÂÐ@ÌÝZ¤µ‰ºî»Y@Äe�ƒ…_N½ztvɱÊÂisÂ3FEÐÙîtŠ2kµz´Žµ¢ÍRåÆw Þ¬^�&º¶ÌØŽÑÁG¾#£U @@60ÉÃ{A ˆP°Ò†ŽŒ^™A_ái(rbĤ‘ȪDW�€ç‚zÈ{„$X‰9y¼h缃°÷6¡ÑÝÍ ¶vÔë/`å¶Äncï³™Ä#ŽÙi«™¯üöèõ`C�9YCr#G¶[X .AËÙ¸`’Ín–�‚ÚÈŽ,ö-xEMÂh€Å±±… ev�t@D€¾èáiÑ6ÔW΂Ãh±hh B4Ø?‡£*êÏkÑM“é¹ÇN¨¶ 0zÈÄÉO¸ësÐ…±JŠ®�W&ç¦Dzš¤J›ŒÚõ´Ø¡zŸô!‰%£?猛¾óšØ×ÆÁë©Ü[#`cl�#åÔªJv©}uÜlý8c§::Á{jp!Xw…–³¶ïP Èã uJÆ¥Öí­^4P±Ô« â"“–$Ë]Ú`s؈IðÅt`¼èëš9xZÒ! ÎÑ£ë“ø”Û誋j{ .ój–J„·Eiåxº×ÃF䆼ИߠõZ!Ò5>. ­Ÿãj¾êÂ˺A"O¦d�#P¤ÕRR;u¤àÈ=ˆ~Çu˜'Y«€x�à€ÜV’úeé4òßó”=â<•)ÝÓNHèa¡ujßåÌìÀ"íAŸÓ>ða—«:d3O%�_d»( ÝÐ)Mß±i¹@xãŒÄ«ò8Æ`Ư�CÇà¾íÒÖ u™,�·´â« g¶Š®~4,c/7»,±î‘å$"‡*/òƒÜ`Rà© �F»±ŸíþÊÇ£ÜâÒ Ãôõr:¥áëoR.7bé4d¿ŽÌWÌkØGÙX}2ý&à>h‚!.1àz ì¡òVzá0ºÍ®Z¥/€#뛾•Y´�¦l»¥­eº6¼½úÈ?šL²F¾}/öù‘ä`\Oÿìs�[[ÆMÓÕÉ¿;Á„ümòÐo Ü=û°[Ë �¦“¤b7ﲤV€§´�Fi;´Z%k�dDzPäª:àªMÉÒ–,®NjY¶“$�¹¢‰¹ÆílWà$oÙ2"õîÞÏ{isû̃Ž$áSúþã8·Í½!è†Q4yÃ¥‰‡Ã2ƒsx˜h3†éŸ…¯|£P‹³;m(AÖ„9à‚0µ =¬BjÑÕ¼L/eé¬T!X„ŠóIµbq\×oT¾«˜žîTk/劭A.�_  Ä…òf—wòÁ€Ái?~KZßììב%µ Ç IÅk--ùš*Ö6ÔK©(Gˆ¥Zd 2gh§5Þ›>)¾ùk�Ö§¬úœïƒ�«m.�ÈÁ'˜Üígáš·F¬a,ŠJ± ‹bÅÎ�ÕmcÈX�xCE&Ul c4/_`ì?±íK£x¾öy Zã‰}Ax�ñ’½_m× î�ZØýó¶ª=ÅæmæÜ-ç3‘ J‘Žÿ•‡ =óX*ÎÊïç:±ß0Ï)½k§,™ ¹¾9ßl¶=¢ê¸š8¤é".ÊîiÒæ¯�t@üÛØbe·]?ö�ÞÑækN_öÇm8×0^9¬eý\yìúV˜îzL÷ýÊŠj»¥×;Þ¡¢ñ?‹œåI‘ë€:¢ü«½xõç|OKûe­”Î,l}}¦)CRD4µ^gµqVä±äÀ~Ù”©‡»â”éqü²\ å¯9ÿ£\w7ž»sò„Xó�^–¼Ê'º¨Ô”ë-2ózƒ­±^‰ñUG�æÿ†°nêXˆ‘¹„¶ßc+ÅoÝ¡O ÀtJ Z/v÷§y"àûc Z—5ÑqkÍe²‹j—±±³&ç: ŽV˜jJ(ËÐ9`bÊί´Þfá'ì&û éÝä zÅlOˆC‚h9oç{©YXþx¸à €ð·WIFbš²7«6¸G­³Âó(‡îË0�×~jµ�0\Š_û’Ž,9ÈÌ»‹0+[ýÖ賉ö¿á&•ÿð¤ÏtαÒ�sŒË�ß+Éþ ZJ3«¦Jœ‘#ûhNTw;•�½Këà‰úÛ½*%ßöKˆˆ ZýËyláù'j'ó5jÈÇJƒúÿ'·ú—úæ1#žm¤·pôÄcšèVæÕ»Æf¶ó.¡µe2>¹o‹åA öx�Aø™Øóšgô‘:³¯gÅþ×ëÓi¼-+AÀómÏ—¸iöoJ¡}î íg=ý6>û~ùôÏî?6x¾ëÃæ–Bv-UzxÙ¤Úx+D#i÷^ÕoÝÑmøsÇÔ>6M|o @Â.NH¿&4pKÙ ÎÆ<ÿ&ß÷×<ñ“'�Q<ØÊk<¦Ù1\˜`�ã—RÛ]ñÊLs^ZÃý!m·Ãõ—” OT©†»¿Q&™GP Muä†Äèk‚:!üH#%é íž N˜þ æömÜ/¼è›¨Îã÷£.¦ÉØbÐ3øXwýC,³ˆñRŃ;Ýyó¾í½?mûE¿Ùán~ïæÃb8×�2O7Ë/(u=Ñ?‘ÿ†ö®ب_S‹„tì}“ì¼¹ÉwCÕ»UA\ÔÇÝ–äüµBDãdG£ë¢&ŽÉùMuµ¸Q¯œlêX©>ÜKë½V )Úï þú/x‹,ŒŠîmèÙ„Ûj‚ î� ²ƒì`ö£–²#ßx3:áÔˆR!a=‚Ïc«õuLÉL)²¸–Ï<{;ŤGQ{›Û©oaÐ즨 ƒ™Rí¡[žå— …,øm'»¿�Ó WK9Z¬./ï�wÃ;W‚怭7õJŽE–ÀÄD5¿û„Ç5âñ�´ÿ9Ÿ(ç×s¡� “Ò~+÷×ø[öN¯½î:hp?ÚKç(om�C]” €µ&%QX~ä ÉÛÂ8>ßpRï¾Ýö®Wl…#¹\CDê»Åx\n$°Áh«çV·…îG°ÍºÚM"º ‘&A|4bèÈàÚ¾„AÛ¢n‚áÛæ<¨©Ú�©õëä‡NÝlu¿$œ0ÂkÔ6s";õ$ß…—“u´ûÏ1û÷ÇWÔ=‚tÓÿ�,ÿ`õ–^y½$íïÓΆ]7eèé¹KdRL�’9?ò~ðëhŒŒíxE¡ò~¿†ŸñlK§çüžà=’É…bjŠÑ=e¬� IG¨ÌõˆôÛ>þµ·íüè„(hQ Ij1±$�Ñ-7ÝöÕ�¹‚›W.sgÒ@0i&Ò „†Á0 �0òWéüÀ`@+1$Œö¶ã>>#ÏÅ~¶Ç·MÀ>5„@ÀKöÄ!p­ÿ7ÿû�²š<�%€b@UˆY e�<ûw |»O8I+ %ôЖtöö‚¹têù§f¹núKÍ—AÞÊ^!ï�ø¿psŇˆ!úúú()Jò^g èôì¿ï|2®¾Ò*Àùõ½Ð@ŒýóèžÑçî´“åú˜¾Ð:ÀÄÝåÜJØÀÿJ�r+V9kƒfj3]…õ±îÛ%æ2:�q¡%×VóÛÓ<¹m±; ê†fßðG�7Pöý¾{¾_2”âܺ�{*I % ‚ûOÄñ”>²€©[Çòø Ú+³a c®£]Ea3:¡† †èÆ~^”’&�Vä×Õ™$ÓwZö4¾L¢@ä �ÖÑFA[PLû"ZRŸUÖô뤩Ä#†éǽ+jij‰dçn9Â%½:\í7ødáç»He¢ØoÇO½Áþ;'­ÁÜÛ!gÎQž¹9_ÙM� ò�~+�"ÁlÍíÉwÌ -“ð%4{¨(ü˜u³ù™÷aD9n>šæ~œ¥@ÏšO HI-Ísë´Î®}óëÉn ³š[. Ðë¿u¶­}üžu�1i°1¥ eÊë�ô¹àwAòŒùém§½!ƈšQw$¨#Ý�Ììsã=�¬#�¸ì5ÝyhFNÎV¾˜¼ÇúwYT•îœuøç QkÁ|ctÇŽlè/ûæ÷þÙî¹ÎYVýÿ5?¸f¢÷ÌöÁŽIg{McöËVc~ì¿JþŽ/š”Š:Çüéù\¼ÍZ�77Sn.‹X½_la„h¿±Ä<;¾•êíÍ1†õÏYžz£6E éJû/Æfþ#A­Õ=/òïÕ·>ß8Fä·5Û�S9»—š+Ü!Õ²·/IH§´†Ð}Ed6“NÞ¦V\ " 6MÁ@_:Únm:’ò½/;ÆSOõz¨©–“SÁ^rN àdõ sg{»] § —šL[yJ |ëö&£¶Ï•ù|Žå+D¼§Õ”óѳ—|mǬUÜÇ“ú~çoæv!Où“X÷&—ëg¥ÌúÐÏ%²ùö„ñošçQ¸¥-÷jåækçâívVòü[Yo¿…gûŠÞh²j×ìþòÕŠ¾$jn¿M‹Ü™t]?•…f&�/º,E÷ü3ó¶ ­Yà/túô Ä Û·×›Gªýø þé]ÁÁ¿öÃîÇÇ`bY|æ_,>›úØ8?¾µ«ñ�¿áU¯+åjL ½ÂoBéÃaoùƒ›½Ksf?¸íó<:ÒÐr¨²ÙBê(Ïèùû�(è©"“Ä®1æ4 „ˆA9ašµOœpk>å9�Ÿ¿á/r$…Èi$à(wxÔ7érwŸ6) G¤R bjôšý9œ�Þ‡Õ´�^.’t[d B4‰RrΠ–Æ(M�­q„ !דœÖÌ}ï0‰úxS§«^à¢�Š�¦lš>ÓŽr0•c‚]¤*ñ{7áÏäšE73¯)p¾¯Áæ�ø“¤Gº]Ö€ù‰€npâ`m=õ³jÕ_÷óÊd4>«owÒ‘ÏŸ JÅÒÊžä  38µ ŸXÜ€rÖÙŽu¢²ú4š^–mZÂ[ËF\¸ž;VÊn!ëËpÄä'Ø%ŽmÄ…Ì`^'BíøJ®¦­oøoYñšqþŽÚÙŽÖ,ØïüˆýEàA‹Ö™ÔÏØž.ÿo93V»ÖÇO ÿo‚M“Ëá”�VíÿÔ¾�Mƒâ-KæÆÞä{‘O”ÍÆOŒçˆÀzÍŠêFƒžÃ¼?}<',zTž�‹³È}¹çCø‚ÜO¼ó#åÔ9˜ ÙêË¿®¤ý„+¢ÏŒ>�2'¥x€—p¹Mbs³<ûºâ�Æá/ôâ†$W÷7­0NhÊz»CÛð'T¶©¯g'¿±+VOMÈŽÙ¿¨²<¼pÇ‘ŒHÀ�^d¦àzËÊbNÛ¾1¾Î6†wÝ’GƒrÑ3Ü„àÃ/©�B~¨'?ŒBØý Es=qH ¿Ô ��ÿy—¾<ÁÎ<¡ÌˆÃo9†â-å׿ÄÔ ÍT9�„ÆŒ &ñ¼$•ñqéŽ`È*¤dòÑð›²ù²{•lÉÔÉ’9£Èé9Û¶ñ(º?íaßz-¥ñqVÝò†1·Oý¬@ˆHµÈ‹CI½_U"˜*“ÜìSèÙ1¤WÝ�ŠF•<²sË`§K˦æÃ¡*Ev²ö€Å~ÚÞyIþd÷ ’ǽ6¼ñú·«•ï¿wfïÚ•>ÎG¸óƒ+m¥t< —¶]„4øú9 8ǶîÄ5»¨ÞìÑØ \Šëµ~(bÓÿ»8%´Œúç´²Öf–ÄuÈ»F±6!ªj©$¶7M€É×J®¤©�Y�’Õž2î"ú³^õ�ôCômøø¹Hÿ.ÚR@ââ°sRKÎ8­R§>BawzÒïÉkG-0\caa(×øÆuc·Gàðƒ=\§ÂkB\‹ñy—ßy˜²siWU³‡~N¾ßú6Ëxÿ ­óçÚó�öM5㟼kóŸÐ»{œkæ÷Þn%±bà_?\mM�Ë`œ�ý7\jþ„ÀoíöÊ"/¾ç‰�º„ÿ‡VF Ž+º\ãê3ýq1òõáŒ7~­ûïþÞÿçïdcƒž/çÖá4[s¦™þÞ1$öVOGó\Íñ½¶Zùýn^}¥rÉóº¶×»„E΋ê?#äßE$[_úÒø²g÷AËšqTØ•ñRï“JÙÊäÎÏ›²µ…¬Î3µr¶È‰l’é„´õvk˜ó¾æ@IA@ƒwÒôàï-ãBÐm´�¹TbèqÞå0’&K²?DÁ\K™¶‘B"¬dl=Çù~-Ÿ<Îó÷—ÀüÚü(XG&åÞÑ%ãGèõ«X? }¾g†bu 4ÙÜÃK�öt¸Æ{ÀÞÉßå ~öÃúÁ8€Èô¿¶¾Ðýì¨w¿ÇƒF #ò¿¥/œò·7�£ 1•ÝAaÆÁ¸Õá5IT…vÝàÈ ¡’|µ@„*üà¾Kd\!cØ ñméÓùÀû£÷Zë¯÷X}Pÿ=MJç�cTSŒ)3d¸¶�˜ƒ¨µ]qªÿ:7¥œ˜òëYO2½x¯%K:’»ßžç&@ù÷§kæ÷À( ú.ð2Ö~Ÿzü�Ô1x‚âMYÙWÂqÌ˹ˆ&–)òò—½Ï»Èî�™ó9 ?ÄrH­Ÿ+c# �_Å~»SÆÑx‰„R1óMq•v5s;?»_EzTÂñ¨�u¿FõùéO'Õ΀KÓsaÿÜBÕÔa™ï¾jbýG´—g£5 Ó’RH{¯Ïh«†ëùW ˆz%ßæ.{Ïg-nÿ½1Œ ÿ‘[(Ad¡ùæÔÜ=è 9ˆ€þR_ÛÔéð³åH”³+ˆŒ÷Ý,u_rððïÑuç�ÒÈÏŽ9A~º¶”ðÓªl%.årPð‘zÿÆQž2y-ç蛲á½�»“,-ÌèzYù¸Âz6Œ˜áßMv'Ð�q{¼”Ü©‹ÆL%9 <½ÒùX b4^‡a�÷ÒL%r¥’u¨ô±†M¤ À•¿£›ºï˜�"œt�y+k£˜±Ÿvû÷#ë²þ ûB9 ÎV‰vdš¦ÄþO†M“øãE½NKóc!gÈßÅ(¶d•kÃçÂ�Á+êá/ç„d¢ø¥Þ#”öPBÞZÉÿœÆ©©t%pøȗkQ‰pþ™¨UµJ—$óq5êÛ´ ±YŠþi?ëê]h&}½»Ðþ.û€X\™‚È„ºêwG/ ~í˜Æ½ægÐ4×L™b+]¦b´R—ÄA¹;³–KAH�-[1ˆNuÎQ‡4—ß±@·lÇÀ�AMnú×ï*§^l”ÕÔ)ÞLY6RGÀÌÜù#Ъ”Ø�Y±q•P;XÁ§¡ tþ¦Lz¹j®Õx\§ÀT¸@µ{Ñ¥çÞš£r»¬iSÜgÅÛõå˜Ï.Ò¡ríœÜpå(ï4Ö§þ'öeOÄ`Êèx¨+ÕÑÌà’6YÂæ—úíº¿ö¦?Ç^ˆÌwi&:M‘OŒ÷:m0?M"ư(°P憉“ætØÞ.0ÚLèŸD½{­ÛNжCeYÌooL媓8áe÷9ÆÌK® › W6Ib–tel; Ñ$,d§,Õ”¾(6Ë+|ÉäçXêí–›¥1NyU<""ÞU¼ïmŒÏ!³ « “žÆ•`ÊÜ ÉNs?ñCMÉù…Ë ˜eUuãqúo¬{§Ã`òƒÔ¬äË0ª±·ê¤Ôº•x˜dnH7¼)bV£ssÉóF÷|1\/!„a4¯�šåS²âื<¼Ã:¿R'Šwtå!]{�Ò6=2‘µß­}âïµÁ‘‡‹�`é­ÔãFöi„BÂd@„@Øé#-ê• ¶E 4͹—PqYöÚœ©•Æ[u}Õo ž>�Â�™ 0’àPZ]V “4ìô©—¤ÆMŒ*Õ® ŸMÊίw;›ø‹<åÒ†ysˆ « Sºæpé)IÚ’Vl`Cž<œ»éMòã«vÔÛcÎå›yÁÖŸ”RQ2ÃN+pžá\üŒ*¢ ,Šr\D *ÐD�YBMËÒæ¢q•7>e±­]:âR [QÄ÷­zªR!ÒØñÃ?ºUðŒ¥®·mÝ6ÒÈJ× ÃFrC›‹Þk·(j»º=«”5"N�sÕß'[�ßYvºBe5›¢/WΠ“;¾—f—Çýé0G'±¨Š#p°j¢Ë*ñXêÛ¼ÜÏ�™ó:Ç*X˜÷ HT¥æ¼IÅθ¶†Ê»œ9k:AQ£¹}yʉ*Œæ_/Lsêù»ˆ£z¨&,+ʽ݇p˜»„”6 ù8È4cÆc &Ø¢-â y•læ|¦ÑvOdk²¸¬jmMœDóÈG6ãøyHƒ"-—#8'.oi·5)ºÐ\J £ÒC5N•ôoˆC+Áò©†a+Ì­òIße*ð‘”D:Ô’’ËiÚ¨®EdÂVq úŠ¥*؇+é³ +“ŽVï„Ô'ÿï ]Hš0dºZ�v`®Î;Ú}¹�ü9Þš÷\)c°üO^œnè "M÷‡e÷D¾.óXÄ/ÊÈò¥ù8Œ+>ˆéFn]háRKë‹««:´²_{”d%t›Þã…#„WN&F0q�~¬>ØÜÿÁ߯ª}ïN|ÕqjšÚ²ëð}!ùkðê´˜ÈLÀPÄ ü¿£O”¯!‰(¨_މ;ì`”Ã%–I¬£x¬]ñ .›ûÿñõÇþ§çOTÓÌ3#¿·+pî˜ú/ƒÍyÚ ñ«k{ÒP]×ÿT¥ ½¿Þ¨ƒç€h_ø\Ý4ÝŸ®¢DÂÆ…€š®÷óÿ…–{‘9ÞåÊœ+Túâ„Óû$:ÄÎP¿ê;P¢W<ž?!COìÍY?D*:q¶„ûö R¥§òú9¶ñ+À_°,°¥2>>öXïür üÆ*WíMòŸÌÍ6ó†Kø@„!Æv—HM9·jèÁÈÔy�b¤V�³ü1k]i«ÄLÈî앹fûoᵊhp_ÂHhÈøþôkš_Pd‡›{=ÀÌš7@Ý çuŸQV ò¯!ÏŠãoz×6˜½ãìÁN¼ƒ"Œø¨©îS•¿ÝcEo7ž-�aùƒäÙ6ôΠPƒg3á/‚6²’X±P;;6r¾ ¬‚¡+Ž!¡ÎÀÓvÝÓ2ŽÁ’kÞi”ºê©åŠTës½®’VU7HˆJÿÎc´«• Ö_bìîv3ÐZا2ƒÈ!4R(ÉèÅÊèý#¦4…Q˜žoaÄnÑ›,¦„ÁËÉlj}û…ÎW¶PåoåIŽã�DŽÂËž0쿇j‘x:†èÝõ\èoIDƒß|nÑ~,Ur]*?­–ÉX�I¯L* ÛÝë ¨ÜP&Íãyç2Úr!Ý'[(Éþ.ø ¿õÐK¿‰Pk„ð÷_)¼˜Ž û¡Ü’l�-+ë˜7ËæÖø�g.9}ˆ#�"ä$a4¹^“s-,D̵Kî¯X5PÚXB´W’ e#gDo }ë ÄYËï¹­u=˜n,Yh �±zhZ‰é8¿¼/ô¾xž°[_5ó·Ù†¿:á"ÛuͰ×0 Om±yDmŠÁVÛ¹3hÈEþrjÕÿW¾ŸŠ;òC¶­õý?±vh�âÞõ<ÍÙ‹é0¶/†Qº4ßi¢ÀÌž?+¾kbkzðÀOì¾0=�mƒj˜A|­_>>4/Ïæ6Ëu:ûøëãð·¼€€q _vcúV/ö³“”Õ]_]Òøã+í)Î-!ÜÿÞ†‹ûáI»®Oñux,‰ k¬£¡Ñµ¤s €ÿоaŠ�dLÈAŒ5¸%^L=$äfïÑÚ»IÙû4aa’Xx³k}ÐÏÛØû>£÷Ëh)X¬�^7ÆöOŽŒp�®aƒ¹ñl°ÉpŽƒÜSnsÊ]”´cÕŽ,Y êo«¾´¼¥kº8œ‰[âl|0YU] År¾¡¾5Âä ˆ ?¾ 1ïãEßà¹rW@Öú>ÂüQ'íd’çÔ�üo“lˆÃç8YÇr%@/GýX ßµW¿ã{*¡Ï Ž%ôOõÊß)÷žWI¢úç6E«^ ¯ß½|»B„ëü[ìÄûžamÒäÇ…ì»$‹‹˜€£²Õ±v+¾¯’8H¸²†áåµÔƒÆŒÖsÆ8ÚMšéeQvµ!ýq�óŸÌÎúêhuZ?Ì"Z°71#Èv¼èRf|ÌAk—»HÒ-»ñí寻ã,»÷#�áÏñ|ó7ž×Þ�óyw6�›(v™BÀ6üÎãÌÆ7â`1º¢Ý´A³·îM5Õ€(èï¥è›¬²Ì^JWK‚´9W‘‹b¬ ¶eR-#\ð?ÂmuÉä±% _ÿ�� {šøì‰ÅûróÆjÏ>0ðP>ŠóXþ !Ô!0aK"š~kíÉ—õó€ì:l%Võ‘pP7-­«ï­ÒŠ&yÿ˽î Šáù´ú»«§zäkŽúÒ;ÇÅÂ*µí §û’¬CÛm²„ÅŸ: Å6*Ø’Nxq4VíÕfÿéÞª÷mŠ•´.HŒwÏœ\*.)z6[KICR|Ñ^)(›y¦8®^/¦z�¹ÕPb42ŠFz¹0Ù 1$£Ê��­Ò’ñ££’c¾îŸÉ€ˆ “ôö½çŽùÖ4`ã“ÙÛìàñ öyø†; Tzƒ…)Ñç‰+³”cGþª,¬ù6ÿ»'´|+jß^–#h5¸íd¢#G" ’b¥­•µÆå¶8),r!®NèroÌO“æ†{æ|ý<Ì„&¼‘#—…ÚËG/­ôe%×Ì-ô1 ˜Ò¹òÏÍí¨A‘ï�pjÖýã®–uCóÖxñ¯!GŠÈümÅcߢj/Krím­ÿÎ;³ã·aMùîÆ«ÙÒQ~œOÚ[r¢ÌiÏïxÖ÷çL‰®äù¿ßl~_?š,®ÀiîÓzØÉODòžÉÔœÿ—_�<Á¶\ñ‘°ÿœl¾W§Ñnýéh_-ñíNÙØ6Ë0C¥þл�–-ÿ€ ý¥:åëïu½ñÒ°ÔÒFµ ™*j|—ý—iìÅ7±ø!©4¿p–N.¯¾(ùCÙŸF“? 2õ‘xöÖâfáù&Ê™ëÃŒi~fz÷9,çðó^U�þ*÷mèÔbZ¾Ë(!AÃõúwï1´É1<º½ùùcàé[€X—¥ÄžÄ"iû´YñÖ›Î-?ìùWÎyf‘ï“,Îg< šßþ½s\dN"×¾C�}÷ýø)�ú#¸ì€9Që¦çä¨G >1ð±&¨Î ÍQǰ8x0ü¨$oPe¯(„7ãí‘ä›×ºA”7(¾Êm}Ç axøÍä,+öUØ`pMaÖxøÒ>9d:ÍùGn‚œ#=Ec~e²¤EŠ•@ŒââÚ‹˜¹Urú’sÖÛCÇí…ŠnÁ°PUª˜ë #ã+ìŸKÄÍˡ̨€+ä&£œãй|8þVþ—kÝVñÍ:\}Ç¥¤€¬&êð…±4€ñ�Iì¾B`.‰ÏÝ»%f˜Zg»UøxVNìò·³”Ê©zv¸…*=°ÕãÍL"¥JVk8LùÓ8µà À–ÑŒš.§´ÿ –{Zÿ¶¥pº�a²Käe·|Œ‚"Šæè=C þxkW~Áç�È<�q“jÒ,ÁMuÿBVËló2͆ŒÅ£GJÒÞù´# >•È0ër W¦b×Îï*"¥óì ^û¼+£Ö^ŒÌZ?3R¸QÀ2V¶Iû2AüVñ†B~ñgœo¼=Z ÁôÌH+vüVlbz¶hòG–˜ÍåGs*°H6e‘ûKø†yP%5˜RÁIã7üZ`|<�õ€×—‡r"V¬â5DñÜ1ø{æÄ"Ìãê§Wf¡ä$É j=¢ByÑí‹Y¦¼t'-¥q’£SØ@©•–²¯Úôk’Çq»Þ ýG!™±¬ü_Þm�¿½ŒvºÃ¾÷µ¿èÊcÞ� ôZN!ãßz#šöµÛ_Ù×?m—E¼t­Õ»çOrc³FÓWØóx–‹Õ‚`ärŠ&Á˜¾AkK�Ù?ë'] !Ï}1˜0êzõÖ±ª±lÛvÝLWžCµ€Ã7~"² µ/b„�67ªs—ìâR*bH3W-ÌP¹0ÃìÍzBãµ4ruk]°cJTë–SfšmœÿwÀŠ;³,B }\$~MzèVƳêÿkBÈHçaí.1Ÿ“‰›Û%pxŒ Œ@ŠÂ$ÔQ³ÇhÑ�rUT «ÝˆY†‹M¦ ‰ËLÄv�Û„2¨Ð4ŸR„¾5Ü`wRònÎ�c�½¼öglC}ŽS"®rn-AÛƒ¦œ5wuxX?˘ÚD×ý/Ô³û,Cv7…z7RêØØ® $Ùá~Ñgý ¶Z7ß 9€Y2¸ÔhïÊ‚Ô:T^ÿ§/Þc‚rú�ÿnæl /f:-�N[s¼ÀÔhæ‰þ?5Ù;¹ôÉRéÎT§²÷„Ê=…a~xÁÙdjB ±JZ¤Gñ-Y'>p]á‚ö45§üjª':�Y pÕvÚí>‰ó7‡tܾ4÷+Ȥmx-?Í^¿2�{ 㘻¹T>(KkúŒJÝ:‰sÁ •…ˆ¬Ebг÷&$˜bùK RGio1ÿ/¢F­´ëf�N¨ïû'Ÿ|\—é¨S–0þ¡§®8c�KeÇ~žè¹½âªí³Ž{eH.’…˜± a…â™8؃f%ùÁ‘RÍVö·0e»£k ²ÉA`˜„ñ±Bòóœ#»¡Ä¹/Z *ZÄäÜòï„j€êë½ !ye7·†DûÙ�(�¾š/ˆšª '}uõ×tìžEy­¶˜ü zß‚§�ƉT¬×ŽÆ‰× 7Du™ƒÉ‡Êd»8»¹* Î�/w.L]Ê\íãÜêæcd…7¡OŽ2úú¡$ú Ï]�^âå6mð0%cRª6œköò#5[kIc’º(Œ‚�à[_W6�gF ÁÓÛjøöšÀaÒŒl2×v˜Ü¤Õ6œw¸ÊóCD,Dˆ_w{I#ßaš2€�îQvwcUBçü‚‡í¿Ö‹ldñ–ÎîÇ¢#÷;<ã¶°¿ä칫³ë9Íãñl¹§½žõü­@Ø>©M.žÐ^l{æÎQËgý“A~èôªž¸ºk·I5îgH Ž…ôV®ïüûØËŒ®¶=O ßað4k^ùª\{èð¼�šO�4ØpÌÏöꉎ~¯S;�ü.Í�O}ЇѴ€ºöåù°"4D¹�Z޹±GýãFq•!¨ºeb!Ñ‹«çq5ûÆM6HËef-he—M›pp/}gØ‘ øõ÷5�É€rqÁ!Ø|±Ds<Ú�™¬¸ÈŒCT ƒ‚¹™•�åê ÀYm®Þw8›ËWh{> Üí±\óïÛ•L*eµœ–`Äž ûaç庸‚[UËê†"s’(4/H67£ˆO¯-æä¹½fæë‰/;ÄP ѨÃ)3?]wÝ+üqpùX°,Ù ]ÌâúaRìªV¼³(ââ¢Û²ˆ,�_Üe cžb‹‰7ÞRѳ¶²Å¥ €¨ æñz¥÷üŸ$/<Îó¬h?Px}qão—%>Íd¯¸RwjÒ¯œÄSf> uŽ åpß/ŽŽþo}ÔN«�çÿ�dz'Éî!@½záþ9ŸE¶×Î�]xpáØ&³8ï9²=/ÎûïyψcNÙíÓèÚ�Îcbiò8¾á¨°µÔëÖopQ…|IÜ#ø:Ó†Ù�ôǽóáŠÞÎm®šdx8¢B«O¾yéx º@`Ud,(æ$³´N_ÿ°-kZÖ²:0ô•pÀMäÓ1`ìä”*ýe“oý—÷i·m»loŒ\1iÆ¡Âö2\&Ï9½c‰¢§qù]£Ë:ü˜¿pÌ¿N9íô½¹7P¨Îð’ݸ˜¾ˆhPhZ†.·‰¨j±”N9H¨ˆ 3—Èëô÷'’±/–ÂÚI,/{©áÍüªå¼û²<lÖŒÏÚkÔT\:…’œy…†)0—vî,1d,%èóŒ�2;Ó–?R  =úº’}.ñn7 ž»EfóPº€SÎíùÛ,ÄMÊcü5‰&ÓšÁåêú¿æ¼‘ ‰h ¡�p“¥}!”¡áŠ>˜ /�ùS;%ÿ:�r;,ʸr>863Ç@ÀÌÄk3FD¹w|ÄBÿ[]¹IˆÆc»2Ð2w¯&PëI¼±ò.ö^:ÖK¥`m,Ÿýòl9¶¥!ªL»V%,yE®2JƘºG>JCô«Š­‘zW#ÉÍãó“Šl¸ZÓzÖ«â6Õ³%öäBâHèi+]p¯7‡O?› X+އ3u©~| ,T/J¼ë묶™ù°„lǶk„«äqÞ¦³0ózb]ûòsÛá JŽºlf&VnÄ|NÎ ã‡I°� ÀV’ .({Žù«! <è„¢úò¤j˜Š ‚ ú±ª& Qhˆ +Ô|Üy4¤tÖÓ+‹“赼݃’rcÑ´*15´5Æ x�èKè^×sò0¼Úe¥_ 8,"sŠ®rß×\î.ŸëžâOG(±q»ÙëÆŒ[ þ`•ŠVa— º­Ò{̈Õ$e3Ðuî"M©)î¢ûG£*÷ñ Y=ëÜí±iÃ…¦FtÁR™Þp@=ôɹö¦GJäÛØ}g§ n@>!Þ )ƒ”É$ó0íp§}.Vó„ Žønw"„ÙÓ8ç‹áõ‚„ueƒë¢är2§ÿvFÔ¹šY¨\µ*º/úA#WÅöÆI{š¶Oç¨}\oáN¼*‹1lÞtîî ÆâV~åYËsTµÿä:ëºÏq/¶®8Ñ p ¬©»èíe—}C®Aã+vŸÈ¾Ä3Äiû™ƒg*;é_’2EîgHÄ$‰ _Õm¯.bƒwm€Ñwð?ó§ËºËb#mcG´³üÛFƒÑCXhšïEEZ27š@ö¡#¬Ö3I±DØF(葼–ÀŸUEw_ûŽCˆAÍá{Qzi¶`Øs…¶~«zš7'<„Ü{tw|-Ò<ÄS›‹ >DA™Â¡HïdŽ—Üç>œ=~?Ë­ØZ¡ èPŒW¶¢eÉ�a’ñÁ´í/w•èN‘nŒ¶í„ßÈÜè“',.LlV#ûnlΡ¸¼©s)Òéoù·•ÿ,¼ßtwŽâ äø¢ªAQ€Q_m?íÌ1›õu˜~KHŸöëÿ�LjP.¯cgÈ/�j3ßšw.9ßô£+Ãß±'ÞVHÝð¾{QgHðË4�"ά=|ö+€SS¾_ª7xlèy\¾ìAh«Ãb>�V¿ïÚO^ëçn¤ ;Oç_­ZÖ´CHw'·ª…wòSóºh-»0]š@ã  "² Áè�jº.…ïG'¿ø^  “–›Fƒ�1pFó§†S'hòh"›æ|çHÿUôMÑð̆-ß(8×?û½mIö›h¬®Â¨Ø‰Á&Œ$ ¯Çü¯÷ù oØîý¹ë.®+  IÄ'u—^ÃÛе k>To‚„¹­_‡ûÍè„*×�k^ô©â}ožÿžƒƒ¥áßqÈÙ2¨Ó=*�Ä9wûø^¿®ŸeX»Á'¥óòyJ�~»q¯ÇÌ$þDÓæ6i8«`©ŽÏ|2¨1Œ?–6Vd?á|_=_�bŽÚL1�¾6+ɾrSÁ^$þ¤Qd‚ëOÎsçuÅÂy€~XÈ D-–òúG/r2AGJž}Z÷Ó©Ðûi€ÔÒXñt§a'e”´Ž-¦:�G¤jñÙÓ.ÿ Î6é>’�”@ˆb¥¶íÝC€ñ¯ME¨ÇMŵXüå¯cx–’¦Î5"'e…jZ3–�¦f£»tLFq |ö^Ýo7…Qøy³J÷èÍßýĪ~›â°Kÿ)~Ñs®(Hð�¢‰÷ÀgãÄç¥M³ògâÕÜßÀo¤‚¹Ÿ7‡ìoå»Ào”7Ò¤ýìèdƒ©Ö‘³ZM)cEÂ�F¶î×£Ú2„W'QéŠËhÖ6Ø,"M�£õ¸±ëyDó'2X9ψݮ¤ì©.N<›ü‚ÔûõÇÙÜ5RÀÄ.¥®{ãj²î⎅Œc �‰@äHû«3¥Æû µ¤‹……Ñq²ÆMY cù�ãhƒô±öt2‘Ðï170yÞ,pø~^gønSxT¦ ¶?'� X† ð€º’�­/ ºK êW‘4]ʬ™�Îc�A™®¸“\ÑC­Ø­gŠgëÈ.ÜA�œyî]w}û|z zo}ÂÄa…ðžë>ìôØÍÔD„Šc0ô×'H²ûo¡‡˜ËT,ƒ¶4Â-ð9÷ÀD_¸… ,/ñcTR¬q7¬Ä0ùOø^ãHGüWü nŒüÈ5ÿ t`\ l¦¢;œ9ÌEðø;%HôÐq¯ö¯Ÿ°¾ê‡1a‹ö€žÄ£­ÝïÝЯ<üõ� ¬÷/®Þ„sî¼µ³`ª  OK ×V†ÌÈhï�ön§ÍbÅ|Æ&hÙ¶n9NN| ˜t?×ÐŽ\]‘ë>ä>8@µ¤×ž°l�if³�fkDΔu‰ß{=)+kš O¦½9ýâ^rùðxÚs†xÌ›>¯’ÎàÃËg‘vldy=að,�ãv´Ú–›Èhñ´l1býïÖ¦üI7½åxifÅã:Îï�t”z%‘¶Ûîµsuß³ŸM\5¤¾Ôh¸¤x†k ˆ_[ù÷úpø�æ—M§sɃ<ñë_pË8Qwh/8ÏÙ}RÍ^mêwË€;[ñm 7ïjN;Ýú¥Œuסä!{Þy¶öæ[à.�g+^猹ÖÁ}ž©¤ŸŸ,Ȇ1�f‘V­š½òf{�ûMÚ×.x]žàF"Ë=vb<9?¤a¶c“¡Lžc!¼UQ˜Ûæ)n`h»Ú€)ÐÑA^åÈú‰îo(ÉuJb®£Óƒk®”‰~ô'ÚWWó\Gª¹©t5=ÎÃ(r;¶zÅ|V;QÙWf`o…5ŒÄ5#í�¥títwɃÞJ€D!³‡gCëb®e†š½b)¤Ô¶ïP‡xš¼e(r ’Yš5YÆÖ3¼•Û3¼æó[)S(dÓÕÈG+…r$<†¿ãLN� HçÆ¨ 3íἋF¸X�ÅÉä�S5»«ÄlüÀ¨Òg!Ûµùw´0ÿ·˜|=ïÃÖ%q⮞0d¥ù°#EY¾`!Ábl:Wf¾ 2áÕÞO)…ÙÛÄ…'Žkîš§Hrc˜ê«�x¶BߥV±žìõÅ!¦7€Ôu1,|åå…Da/�êhÿ"©Pw²ßC1‘›œbU |ßFì,+MPìæ€‡ódh‹ÆMÔ†xpÍGþdc6ârH § 2ìŒR®{Cîç¢^ÆK=îàM^áçB“PõÅÒ×^ƒ52œ§Ò¹ Öúc@´ƒòÉœpñiÚ‹cF`�öÇ”íj¿¸Ø`jÐy?°žßÏKÜ`n*–Ä IIkX�܈.ŸlSyx:_fE¯*=]ob— JH/Ì.Ø —Á \\УóêZ {‘éî:Û-Á˜É+ŠI+‰±œ–w7Ù‡:E ^¶ÓH`I �RgÉVj—N2¤&Îvn�ó¹‹ÅœšÅ`Eë ýŒ{ì'~“‡1Ö%Ky¦ŸO¥Ìy°»­Ÿ¼@¥tΗ`¢�Œ_zŠÇš4ñ/×m­ÓD1áØd¨­>,wi…!;¦"È K‚÷k2×g›¶Ë‡t‹ñÇ•Ápö�g¼ÂµÖxvä ÎݳÁ�›ÆBhÞr5�7¬„àÑG)ßaW�5T…!S*¸Þ»Ìs—æü6©!E¸ä aÁÜœ¬üÀiD”·‰ÒÞð—ÆªäZ挅,x™éçd D‚�(p~—_}ý‹\¾|´îC^=h.Ÿ8߉ðÓ¢½mpòMúGµæT³ZÌañ(}&©t2™¹3×”z7’ŠhùckœÕúé`½ÆVðã'óXI Ä£–½t¹H+I%skmxZQ��¹�žoÅð_QÛêsÌ�v‘Ò¦v¸±�ålÓØˆÅKë�6 dkF!áÛ#3ø"ï$³P\déåÊu‘ñºÝ�Å{¹Á ò½fH-UƒÒ;í›Åuh�÷9$ø‡5ø�£üÛÍúsc�4ÝåÉb`lQè=ğÇò U…Êœë Åý6ìUÛÁë*ß ½Ç - ŽO{çšÏî×tñ<î�iÏÞUËHú3 ·ìrS c º5ëª7)¨Çœ®ÈçhôÂoŠ%øŠÔy‚oG&éåÞ’¯î*õŽ”ã�‘çùÝ¡o¦„+SÑŸ\È[ŸOÏðÞÚDz\˜&vivLvæîg’"pêÃõ[·—ñ’ Ͼﲕ�¨Hטì²?€´ªþ`q0Ë|UÊ�ï¤vz+u¼Özºê®yðžK–›Mˆ]½ñ;|úT=X‹(YC#ñ©q`Áü¿ æ9ò?2Úß?‹°È\eƒeuŸÂ�X) oü¡¬ � ò ÉFžXÁ‹â¼ƒ€pFôcÙ=¼Ü d›Q$BHkCЂ)�.Évs«‚gLdÞ×ö¤—·ìõõêôÑPûkø†ÙGSa���àˆq ¶òÉåÄ�¦·�¸�¥ÃoIð0ŽˆÃ^Ž>à®sîà¬òOß&ÌTEyØÌ•MÒ�,{Ô9/ç·Ÿéçðε’ó‡Ý£wôzKÇ:"÷ô·&‚¶Iô®Vl" “K›¢ï—SÇ&)²xY(ý¶la3ŠDÀO7f‹£96¾Yþ,_úÒg}d‹+è�ÝÅ�¸öÉX¿Ád�³ñiÈH*¸Æº8q¬;fþëe’s‹'Éuv�…¸#°²“®$°ç)¯9¤&ÿn°9ÄDÈ=]yæjoåiÅñ°‚ÔfµAÜt…g?á¾FiêŠ×™núg{ø“/‹OÀ@㌳À,âùuøýiJöâåA™Ö˜AB§S\'\ šÖ„é�f·²êšž /'K[¯G+„‹¾.¨’ü˜,#³#]”—›(åÜ"–¯c™¯ ÜMö!7§Îiï”Ñï5PS�à`dœÉ¾}ÐÜ<™I[šòu¿ xÿ‚¸äój!mŒ^æaÆÐHc«Ä†bP{ò£ië]6fÄ «a¼˜Á+•ê2'S\R"S‰ï}Xª‘k@ ZP±°”ÆþÉo�3F5{î»Ñ¼]ÿ(¢Á˜ÿ—Ƚ< \Š)4£u¿ëó»I5¾‘mˆv¯±{Œ}�é/¯ÇéQ !$µÛ#øbÿ ïëûí‰5f'÷{Íë·P“÷ÿ­ï_×¹OÌ!Wêcú±üëŠG°_õÕžßü$×g2©ýÐÅ¢ÍK%1 7ê„å/úTM»z!ÿBýí°ý+Ãþ/ÙÀ²?CfzÒªãiþãAÒÊ¿µ+Ñ*ú¡–q{íßÃ]þ6®§ÈW¹2Í2Ç ±=‰Æd $ Í2r— %Ÿö¡â«…eÜR´#6…[Ââ„P^ñA À•Œy 7##ˆHP XhPÒÉÑÂÖÔ(‚ZÌ‚e'«„Šï„`_‘¯½‚š—8 ſt^P-@šyTeÔZÇ­]ºý#àó3?å”äöž„—™%X½jkôßzœ“ÄÀ�Î&üLW¢¸KJÃr %Fü�8\ó±¹ñG"yo�æ†În¢*�¦Ì]_µ0sÝg@¹‰ËE 0),æ$âRõÆ¢+IJ#nPæ)9Ÿu‰iÊ ªj¹±”œá¿õ‹‘\R=Ñ.úÎLm—Fçw6I ͹�r<#;�y­j£o4Í̳<8ÌTÒ1žàMIVj"xï?ªž<91ò2OŸnþ;8gÕäR�–pf5[vòr|QÆdn4ëKRÂ.6¶DWáhܤœ�L01|Ýûë±írúûúêågXþNyõ3Ÿæ¤»8Nqùf“ºY,£ŸŒíÛ›+]*Γ=æÇ•\râ³®‹0d{/ p3Ë'=ø‡}-åW’åGvƒ%éÅpÑUÅÄ\`–#8½òL&ðšj[˜ VEr¦šyG�e²¯ÿÎr¢÷•ÍS“9ñD„ ­6®"{]µqÐ0‰ó—'®Ó”(ðf"¥Á£µ. x9ù»•ºÑQð§ºcbyž,M5wuM|ŠýØW÷ûFŸ•=6ø’Ú"P¸‹j›”nm¤w1à¤Ä0å’�J&4VÉ=~ tu§v=ô_—ß˃¡÷ìLE+ňƒ€è¹a÷ ¥[ÝÎÄféçX )R¦ùóžÃwÅšùq[ЊeΚq1Wb/ÚxúëÇÔôËðk­Sü­ýçr2rÈ»ud¹cÓ}Út"h�,“ DÆ­¹¬;v’:?þë¤î?ï�:7|åWYê¡æQŠla‘¬ ˆ2 ͆6w¦¶XþÁŒ.s Yjžôлm]AÅÐEÉ6#<Ž«qr\@‹¶�hÉ`�lÓÍÕy‚7+¹Yo»^q¢@½Þ†±J× DèwލÁ¼ætçÌ&°ò\ñ7Î “�ðš"³s—ZâQ`e“4¬;\ä&<@´f7b²âRF]†Mø¹-oï<¯>FüN%Ù…ëZô¼˜<ßeEî ÝúßWˆ5²¼¸`öÑádÇÂí]Ôªþòéûë’®²ÅFõ#ëž‹ùÿ[®ÝÏûƒòóínÅ’Nc0ÔŠÂòù»pp¨°Ð@NrÁiyØ=ù˜ŠÓyÅ�snÏ_àH"ktè…Ô(‡o8šþ!–K÷©ý–ð–G*>f‡8(<œÞª xr– ¶s+â"_ûT !¡T† ÃrRÑË9�¸_ƒû^Ž x'?žbÙ¾9Yâóâ{ƒjšÑ?+X¬ˆµZ]®Îg¸N ÊÊÕÒž7_èåë*Š:ØÃ8r^Μ§ý<þ(kÆÁ ©P-kÈ{p1*gÜ㦞óñºfÚlçw˜½ô™ºù›øw(—Lø ½iÔw¢úê6G&žä Ó¶×™òS2j2ÑçŒÅ‚&Ö²z%.¢ ™|�b�N»ŠÈÝî.P»>·�².¤HOiŒc]5£xD-Wý}¾s1–È#j~-{wûS… Hñ›¶ÿHkïFÀú÷®÷÷Cboã—™làzòTZ÷-øÕò¨ä„ œ`ï<‘=öSQ"œòg t‚Æ{}ùS²èíþ@ï�}íËWM‘”Ô.‹’`¼Z8b�ìð^!bœ/„sL󛆄ÁÌò$“®Äƒ˜ÒWÞÍ¿ç» 3ø”k¾¯³&1õÿ :µûñ'�À|̃ƒ'¾RôµrÇKcèqå>2‘Ì‹Î! üHšÖ®k&9,AšóÜè±”z¿R´13)¨}Õ…b~;ۆ๠ +e×m©x(·ÚËsŠ�Ü�6cR)mÃñÅ·S"Ñ8Wäœv9ðžLL+܆+¾�ÜàÓÌaãèK‚/#R ¡Íñ†t;{­Ó^æöò/+[‡²Ûa<&fÞývôÝAy"Ð6’\V¶ôbdcҜà ÷Â�ÀϘe.¥°7íÄæÅEÕ0šA¤’žBØW»óÒɚ׊=!à{œ,ùJ¤0/}Œ–ŸÖ5¯ îaoÿ=Å�3šŸ±áMùXL*÷>‘øš(ËJÝØoç’!È÷�t%!³¼8�þú>ýð{hç'ë"fô´l tKÑÐÛ¬€nüÁê0|I1Vì5ÿ Ä‹]•�wœÖ‹NvzÉj/‚²©ìNFò°Ä[عaØI'©˜,Ö*… Wn¬êî%Ã7UÎ1Sxš„¹ÉΈyv{^åêy»„Aº¼ºç ÜIö…xÙmvŽÆòìí�Jh�†ò|üžÜ$ëŠ!÷œÊɪ9UÔVîE§zÅíÁç|*üSV $cZ “óœ¹ Ãk¨ê¼#—M9ÑÐB^Ó'ÍP–„ké¼Ãïa�Ý! ’'¡IĺÜØ!¯R†‰+aÿÔùFÈDœ:˜Ò]ºI ¸^zyœ'ŽF›Öñ•Ìôa÷v}ú"õ¦u ÆDíþ™k)nÚùî,”ýÊ¡(ª5y�÷­ˆŒå›†xòþ ÐÐ0‘[NmöIBýÆHé±Glߪ@Cr4ƒsì'œ¿N Uz›ªòüoËØÇ<ç8N†™ŒÝExaˆâ†Íky&ýƒJp�Mñù¦—ól­’YKóâ‹Òfÿ+UÈÍ æØÞsz«©Ï¨žo7Î�œ·ºÎ{˜¹¨GQÃzšà+N¦“‚½ï3‹Ñ‘ÝÓ%Š4),*÷,ÑŒK¤a°îwÎÔ¸¹ƒ¾w 9Þy£½,ù'¾`Õõ³7î¼ÖË€ð®&P}–MbbÖN 8:Íåß׸så½Z˜Åcp*R»uó"«½ïÏz½ôÔw�{€»J×q€ÍBü�¹EÒêŸ`�L ¹Û.K9£jص�p£m…k¥\ïä ÐóK}÷8ÆgÀ ÚJ`ä`­›�Í8I›¶°xóH ‹XÌÝYÈËx}6±[T]ß]côç¨Í“¶zS‚Qá¨ÍöIg§Nëxn³�Q‘]„•Éô î(»¨@©O;#¶›�(ûdØ7]Z¹05_2/þ×ü‡ï k'x°«n>°A•Ю‘…04ï§A*^Ð}>ðy.e–0�Œôf´.“ €c—Þ`|3X-Üy‘:p_¤Žv×Eç6e­z”ϹˆÂÓ¿èü#"ìÿ%?9ÆO9éyžøW_«30¾RÏŠÎ.¨�Ç÷æ�Ê¡7-%Á!ϧÿÇïÉˆÅØ~÷1�igä)ç˜_¢¸|�™èãw‡¼Mú ‰6jÌ%^0Ut3�˯L dLÉ}˰à42Ã0DWű߼û눰¢ é‘ÞGþí÷-:¯ÙHk~Á…†çÉV3=,‹˜¦‹_™Êt†ÿÈÎÕ2Æ!1ˆ8g¡—PK©/ÔõɆ´üþ�”=ÒV*C%)ÑßK‡páh|þ–™1TsíIgÌç&à»Ëƒž0ô˜1,,ô�Ò$\Á·.+^¬½‚À¼ÇG5{œ ºy+ß>ã±³ã²pð²M‡*a t„�Å̧Å5rÙ%¡2Ï>– cx/ókBÍ ~¾é[úª}šY þ<« ÞØÈZË øó Ì]N#f¼Ø]áæùÅÕJHÖôdÜ.H‰>•õ‹œ¯Þ¦÷Ä÷Poײ¾#ˆÚ—†5gpŠòØnQ»å'9E&½Ž½eư�Xç;‰šÐ'*,†»ª“¡pPø;ØûP:±}·5÷J«L±åb¯N×WSËìÌ*„eÚŠ#-¡-zÿñ÷Š$1š¦B)0Ϊù¨¦NK% –+øî�ª©†z/ù^pÈþ8âù=�!b¡p—€?Æ-D7cjÝÐÚÃd@Å.F+cmg¾í™#¢"Ùò7ÞÎç¨qƒÎs Ô‘¾1Œ·.¶Ñ±ÎQ³ÍâGFd4�]±ƒ œÅ:ûĺÿ{²_¤{RäÒ­Ÿ}�Ý“‡‡kú¤"ç,ø«+Þ©ÖM’ ?çø!×ÛÏømçö銸 yã Wð’U´ÇͯZdõþx#€¬[GÐin(€SÌ !tmØòú-ãÇ'ì±lm›»ûã.‡ÅM,k¡N­I� K„ÔÎ"b]Äø®>ÄKwœ¯ïÿ¯~̵ß>h[âWúU¾2¡ëzÖ_£0ÛÉúO³ú=ÝGãîõ8&düa6ùå_ln>p|*ª­‹‘)g8eÚ} )ó»«ÆG9¾±±ÿR釢 ŸÜó’+Ú6Ãyì^´ðQÜÐ�c½Ãß­#HèŒ`¥,jrØ/Ø[ûŠÔJú—µÓî°A‘ÉOFË@ÜçV\§{d,¼Š@Ð} /¥!Õ:[ƒé5ÞÝ@ €Gç(‚W™“D*¨ç SO«àßUŒâ³È§ñ5»ï �!h¬Ý¼3+ç‡X¾¥‹Ïy¹p¬ŒŠOl¨PzÃmÅY²† •–×Ã?Ü]ÝÄþ›Œyý�!½}?+¡™ÅXë;{­æåºÃÆ?¯k 2«ð¿(€—Ù,6ò;ûófþ‡ÎB*ß-ˆAR�éG›ïàõ±f*½Ë>~ßÍ.Þ¡™ºJÜ¿ÎùGÚD4!l!ɶr‡…ˆZP&£dYR….v.©Ê¬ð°³cªCšÜŒ>èJý¿xz’CÒ0û­ž±pŸl°§‰¾2WR b?bÏ©ŸøI�SÜbs}PÏð�* QF2Ç7;ÆðVï¬9�‹:çˆNï¨ë•𝫥åuåÝ&z~a}½ž5£“Ç(÷ŒÊUðÁb1Í&0œÉvµ—s)= 5ð0qÒ×c—ÊmFŒ&(ÛHÑ„c©\ü5¹¨óM¼m’èHEÍŒ !ívg,Ã!¤¤ÞB¨¹ÆQ£µE{Œ\åºn¢ø'r X-¹.C¦?¼iy\¡f4†/¸ZXn9ôwÓÚÕ¨œvž¬mšow±üóÌŠQ]–oÓMQ\pcE\L¥+½øÖCB~ ØÊ¸¿3�ÅQm+¨‚pOr¡œA¶˜&Ø­u?é-¼Ìs5B�ýŸáÞ”„›ééc|°¸^dsE†]÷ÈNkµšœÍJÅo ·J rD mYÀ{*ujÛ"¾NÒ‚¸ÑeŠœð½�a”`T*§RîÇg>zsç¾/GîN¾ªH„Ï*!ƒÐ60aæ7•u2µס=Ü� ë0€¿*Ô#É�i¡ˆMšotCi&ôÝ›�·�d× †43LAgØ”¥Fþ?[²9žÌ# ­¢¡îŠS_ýþ9?ãêê‰P€îJ‰} -øqÍöåwï0¯MJéÌð|"þáƒNOb éëŵî7E¨C¯« ‹Mד‡|ïK{ÙžJT†Ë7º-©¹ü§¡óC )vŠm[�ú {¾g­u�ûíœâÒd2½]–àòÊxÇurÒ­š�ß|Z•(¿&¶+‰AX£¾µSûªb?Pg+©Íï«<»÷ŠÏ“ª÷âá^ðË05{Rm.W»�èW,Í»uëø:)wóâ1޲R†'©/u»Ó j¦nÄ´MeǺY•¡ÆF]»äŽ^Mj+Ö¼´¦/HEÏõµ ¡y"=àý»Z3 “côhCM5×Ë=q”¼¿�-ù¼ãMV»‘#!˜ŠM"!¶¡2‚ÒQÎö9ÄûßÇ%e]æ¤.Z–D!6 lnØD"Æiß·ó®þß”þÐ}|zõüþr—Ãìá�›ll`ÐË�íûæúÿ??t¾Z34ýÈ>”ÛJVüO´�Žñ6 ù*½µÏâ(¯ÏâEŽZ½èô?âqáòÚà^™À&gŒm±â«#5Å["æÔ*šdk¬3çÿ=Kö ÷“¾v°0Ö«Ü‚&öü¶-Ž3—¡ÇmH!ïßΜXÍŠºÁƒ¼˜(Î@ ˜ãÖº°ƒfb¸ ÕÜr8âs)½Ï[ÿC+hæß-²Î‘Æ–±OßèÚZÖ?yŒ~tbk'‰�é¾Íï’cÀ9<ýà¥`Ež¿0`¤¸ƒ1¬ÆE\…Èïû™k~�–èc±Œ~[iBÝRÞ¦Ú›M Žƒ\x_ëçû8uÈ€db Á]œ²YZ?j(4Ö–c˜ÓY"²Á ¾�uT3mSLg3žÑF™Æ{N¹hªé…ªä¥ Q„ ‹£÷^›,9q·ñ.¿¹³�¢¿ÜUbø„A3@ÓÛSòǶYû?Þ0;ã<ºûÖ€w}!§/n~m¶oœ¢gWxy«=/f²Ù#knºœç»åïÉ`†¢/bƸB<Á À'‘:úëw½[<©JB é ăii­”2¯£F™T—$ëÒœígïÖïbÃ4ÓöŠÛTÓ„b¸[™µO$Óö(s>'áÈã´ŠÞ †�UŠhºÁ÷1%^­®³³^”….º ‡´0ttÔ'cÓ‘s¡Çï|ê¤ µüŒ6d´ HÓzq®¶^¥Ú› ¶‹‹¼¨šÖÁøŠQûèpŒNÒ„B´}Á/wáˆZZß¶ÓxYŽã¸‰%eòë �¤ÇhÔw1ul0>½ÿÄ´ûý"ƒ ž6a[î¨ ®-ØÚýéŒHÅß{oè‹¢Ø]€’J1 ÔóöŽòàýeºÌ>. èi» Ø÷Õôë˜y÷LEs4+/;u‚á)KEÓ¼|ÖЛÿ@:1eÉ �Ë2 ÉìÚ6È·Ò­ÙãQ9©»’œíç)Å­Â�kݵ2ßs”^ê·Ä’=ò@­ÕJ 8p+�cXèäÐë/Eð.{#ˆÈ#GÐР>>�Ô©hd[jîì4wN5©Á\\…Œo#ÄôÎVzÁàkV¨ìOÇ÷¦KÉÆ/³¯§‡½º[;Yž¶x\~¯¿�¬åª‹äÙ�Bãp’ÂGõü"�u娻P¾.Oû­Îµâ°ep¢£ÿ¢Xš©r­~uƒ+#®Z¶ ™@“6 œ(KyN zœö�3.È�2¶tˆäÞuÆßA;|a~ÃÔÀC¯€U¹0ޤ½š÷,�Bš–ë}ƒŽ4Ž4�Ž�̳ÒgÕ%£#ÿ}k�všåN¹ôqßèì¹ê†©|Iœ$R'ÅwÊ6Øx97z†¯Y;x•Ç{ïw9ÿkšŒKf¬ÑëIU‹‹¶8NM¤~—µµÙ°Ì¯&]Ll`ò¸É)@TÃY%d¿¤šñk þ\Zn!’¹}æ±ßæ²jáo“·€öß|Vzk¾Q)¶Úm_^¬ïóOØw&±;O—�©Ab~I5¨"Dj»Œû¡°o³ä"õ®09#‚IPÂyAGNÁ„zT�\´K°¢Vbð¥¹Å‚`QˆÍ-ÜAO’Ä4vw–‚ŒË…ÖŸßkŽ>ÒüɈW\mÌÿ: øãOï=åß%¿ µv?LÙË–ŠŽº(o4,¥þwÞãd†o#þ›}0VÁK¢ Jwoq ²Òß‹_&òößAû)å6„dz;q«4íÏmÝãÙårrš`O.B7²Öó�áêP§ä-kêÃ{ú®â ¿ó§ƒê=ob˜÷­9bVÁñréÎ�µ?&Þ+MŒ¤Ý›ìÏÔëŠ) MN�“-É)}V>zÕ eTQèM̵ÉG[%fdg“¢REpŠ4V/‡N¨xoma¿UF’KÿùŠ É2šËà_`:þðü‚³ÿ�ÿÿÿƒ ùðE÷À€4¢­M€­H¢”jZ­´P-…¡H¤ ‘(Œ½�…@o€€: (#¢‡‘AëÐ@�F¨u@ ¥ @À Ýž†€€/@¯ xÐèuª }CÒöO'€v6ôhàu÷»½Ø(Ö€6õ\� J ((GmFâƒÖ©àÖ…€MuÖƒ:‡w@en°M°:@*¥ ]‚ØHP7ׇ½M@P²`: °P@hT­°(@ :€šrwÑ v6ÝÀÇ,@]Ë6ˆAÐt… PUP ÕYÑ J Øh€)wHá¶fÕdʲÖ-bÐζÀÕ(¤—m´}sÒìä*‘M0£E+AIŠ“Ì“ˆÐ¶ƒ¡¡ÖŽ”@J¡ +�ÍÛ-º”€èÆî\±Bºn”Á ªwb@ ªPƒ®€ %”« Lh «§@‡T :ÝAc¤O«ÇœQ ´Ð�JÑ@Ñ]š…Ù¶ÑÓu*2ÁBîpJÌ«l’ÛªäK¦¬(˜€ @&RJ�Ð L„”‰4M4§¤ž*I¥4jRm4š` Ôñ AA4Ó)ú”I꤄ššFšh$D&‚’†FõN¡ûGþÙÿ�C™_ýùÿÔÿ)ê}~ê¯bµ­©ý¡jŸu¬ÞHE&ó2!ûðÄ“bBmXµV+EX‹V�Tl[i64dÚÆ«´A´ZÆÔlUÑ´†Ö5�±¶‹j,lj´mj*ÐVŠÑ¶ØÕŠÑŠ,Z�!±�±mŠØÆ6‹¬FÔU‹Q«m«µmѨÕQ[ƬØÑ£m�‹±Z-±ª5b­c%²[j4T›EŠŠ£¢ÒhÖ l–-¨´A¨¬mId�¬VÆ�Šª�QmFÛFÆÛc[Z5hÚ¨¢­‹jƶ�´Vª6Õ¶-mE‹TV¶Š�kbÛlFÕcmj6Ù6µ¤Ö�±±FµFÚÑjÔjÅI«FÖÆ¶*ÛF­F­F´mU‹m ØÕhµX¶Ö-Z5j*Å£h«±¶Ñ­¶*�Qk‹TU¢Ö6±ZѵbÛF¶Šµ�Qk�µ±XÄV¨ªÔj65¶Åª�E�£kQ¶Å¢ª66*Ú5¢ª6Û¶5�¢¶5­£j¢ ÛQµ¶5ª-ŠÔhÛmQV±Ih‹_XâH�À’€$  @ H@~Ä�€@�€bIö I V­­RÚÖÛUí«VÖ«ãÛj+ýzãEÇÿØrcɾK�lQ¸låæ)DfÑ2egH*û°Þè5KAëU¢¥@`uB¡†¢s/�l¶ì,Ô,åãçíÛÜÍ‚Ÿ\y€�TWh¥©Ó q@s^*šÄc4:àPÝÞÀôoG·´À1õîŠÛ]U·ë7V„“a|¨]mr�¿öó×U2QP-®c‚ÍÂ6FµtqÜ~¥§ÉYO‡2†šÕaÇ™°¸*¹bªù_3Yìδt Žä5µ¶Oy6k¥ÀƒBhè´v:﯆pШ°T¹V}JF¨6SãìQtwc7¥iÌ;UvúŸUNã×�R‹BLJEû˜CÑdo_iº;5ByZGj¸šf.«A65Szð8æVÒW%ãì^3r¼ åÕíë’iÇ^¬ÜÔ µ5ã‚øSͳ³ÆÅ««ªìÔÚA[ЗξÀþ1ðè×dªo1ø”«ÚØ4Q•ðv\¡§7¡–„=Ôà<hÁ™ž.ù¸Åè"…X=ZòÈ­­b©`Ò­NÍ6LÁy®�Š€»‰ê«ÙÓzÌ!ANl\4fÖYØIöˆó�{–*³6ÌÚk2¯/{³èéà·A�"zŠ®˜ƒóÛÜÁ´…ñ¥wYSn¬ò”zægLY·žÆ¥ $Í¢4ê–M×Ky.2ƒÁj-¦¸mqÖ)оC ùK6ŸH8íbÄí|yu”¦jø¸ZÖ¾Üv¹e',s­Í‚a�]»ÚÉŽ‚±Ô%îs¬Î«¤îÎt×x°-}:øÚ¥uÙ ÌÎ{ÔqÍ©Z¹`Wµ�»ç ,ÄÄïZ ×9TC½4¨Z[¢Æ™Œ†YbÞã”±,àªtÙ¾YÚÚŠ+FÝLº ‚Ê´M޾^Êvrè Ø�d{K.ÁT!«Ý în¶§Fu>‹‚Ü!ó<%\Wt ö­™Û@žªªð·Àœ"bpŠšé‘ŒÄ3Nç³o2ìíëÓ¢ŠÑÖŸg`U¶5bi_ C®r/"žÕµYkoU£6^"îOo-TœYxàד,]Ó*G]±W4°jÊn^<®äX*åmR l&*ª«u[ÔÛ³U.ꈫŠqNv 9Õ®YQØ‘]ŒY¬nVSUÇV0I)Ø×�gP�ʹ”ûXtEñÉdÕ÷sݵ²Wzò¸gŽ «Ì¸z/†¨Âê°nº>]XíÏnè@ʸ�ÑÜÛ¦¶�2ð?` rõf;aîŠëË”6Ù®Á¢ÞåßH+ið½Jp¦huLÙ]B÷k™å¤¾|Y}1§Ó¶• Çw‰A9ä¡`¤+³ž®ÎÐ_XzrîÄÞ¼¾‘¬6G d ƒ @Ec¹efo.$–«í4=Ç釸ͩ[Èsö ÕëqÌŠð-Ì÷R|]ØïV2²­ðT¥U朾Þ#–…Ì…›ÐAÔØÀFwUõ�8ÌnÊZnL¢¸j˜¼ÜÓךøS�™·u±;C(ÚT­‘|»ξÐåQ…«¬½]“¸óà”ù‹æÇM"÷™G|åXî�â3X]r˜ˆTÓ¥AG0$Ó–©¦Uú^òXâ“5fì²°D¨5!”Ë£cöM6+¶}fª·‹UZ]UØííOôV÷Z t)¼H�P††Ý ì¢Ëé¼ oûEç°SYÝÇ&üék¯×ðüéóvjBðål.³VIyˆÕÚÎ…Ð}¹½!]µŽ¥™@>ô�WkvD;±qê�Y›R®MµFlÈÅÑ«lÐ„Ž¹»Á}’ŠrêíKšmÚCzˆ¼Á‘*—0Y’'Ä�Q¶±[Ñ`�ª´lš52,Q± µE’ ­FÑbÒX�¢�X£FÑj£�¶ØÔ[ ŒVˆÅ«�¢‘(­$´Â�C( ÆÅE­mD•‹cQµF”ØÕ°cb±¶Lj*C(‹X¨¬XÆÚ6�µP[EF´jMQª* �UF¢�I’�"±£X*  ±¶#ÆÖ1QµbŠ¢¢Ôk‹ELMDZÄhÅTjŠØÁ¶-cF2FÖ4dÛ&‹d ŠÅ¬jˆÚ‹ØÔbƒdÛ&-%F¢ÆÑ¶(ÕŠ1­RV6+,l˜£hØ2m� °FK ‰SÆ’ÆÌÆ’1¦”QŠ6)31X#EƒKK3H±F Ć’©)*f‘(�Á$Ú Š, £cF�‚Á¨´d‹†“PbÅ“Qe�REŠ4ÊMÅ2™ 6’Ö4m@d¶-�‚¨¨ÈY*"ÂU›I¶Å¦DHeT`²T4h™ŠŠ PmI´F4Qª2m´”›E£LÑ$cP,A%&6Ñ•±‚ÄXÖ1‘E�mѶ “Z[%ÕŠ¢ˆÑ¤Ú4b*M¢KJMID,°FÄQ+Æ“cÅ%ˆÈƒc%b€¨1LŠÚ1EŠ4j!@ȱ&¤«I´lk’¢(ÔhÕŠ6‹)ª"¤Æ62dÛª&RFŠ-‚‚0X¬A´E lÌV6ÅAh² "ZJ’±¬FÙ&ÈÕƃDm VƒfB5’ „Zeh£A¨4&¨ØÆ#”[&±¨6!š‰#X1ˆ©*-”(ŒX¨5c)˜‰¢-FÂRF „ÒD X˜FØÓ(‹ÔF5‰² ¢ÑŠÅ M,lj-¤"¤Ñe˜Ø(HˆÙ2da!™C Q¦ #%Š ˜�Hņd°TZ‚6 –&a6‚2Dd ÔDÌÉJ"’¤*6)3 HÌE¤6h”Ñ’$²†(E6S@D•�2™$lBTY1b"ÃHÌ1jf‚�Xƒ$l�dÔPQ¢dIcffšbd*HÊF@6Jl#JŠ Y�$b)(™bL†B-¨Ø&bØd–+FÑŠJƒ)IF C#0¨„e"”ÍŒ”V#RQÊ�4X¨¨ŠŠ6Ì2f[Œ#&*M¡ Œ•Š,“ˆ±™h(6 P›3!E1±–d ŠƒS‰4’hÐ#6e5ˆ¤ # 1EŠHÉDV*4L‰,!E&KF¦Z,E&Ø¢�´`ÌÁE- 0¬fd@£i,‰1E  &¡)™f#‚Ú6Jñ>ñ$‚*BuǼ¦¶Wit/Ú3t[²¸v8q笾³ª`Û7x$,ŠËÂ6©V¨‹¼(¡vê�QëÑš Êdµwe]$E2«…ÏuâQÁ7hÖÙóµÁ·‰îŒe«¬ÊC0éÌÌ®ÅEL—£6†ÞRìæz"76ß]U÷©«ë¼»ÆEho¤¾çú…wK�n§ ¢()mÜæ;iú�î[ìΡ "s–iáÌQ Ì¥{S»iMDpì×îÇw'<éÏÍ"yf_`ÝÔ´áâ�´®c¦¬'béO^ñÜ« v^ˆ»8à”…­wˆæWtÕõÎzö�Žö„{ÑC6:”dËßf#ãí«Á··î#Œ7š,B³Uroºê“óÓuÃ_dã+/6mÜÀ×±f× „nóöŽZ:Œ¬*íV͹ÚùJÓYCE$3 (Må™W戤)ÙÚ§HYÞ¯C…ªçWX Y{—SÜÛòšŠÝåYaãÞæeÌž¹˜ �¶{Mß´óÛ•í¨/W-~«ð=À©Š»‡L]ÖJ…T¾°�í¥{ƃêXr;*>uš:«¥¶9fu ê(-™s°”jõ RÔÅëìbënŸ;[†Þøób”„bÒÃ�í¹¹�6¸W%»bôÌC«OB«GHìð¹/d*²ùÜ•˜7l]Ó}휖حC˜]‹œ–MÞb­"�ˬ›JØáDFYvŸL_µ©×TVÛaÇVb›{ƒ­² ­}žš·Ê†^1Å‘JºÑÔJêµy³*óAÀvè#w ¬¡ ˆßo ú†×]ÖíˆÑ¢ÏXY¾×;‡ ôê•‘K•BªöŠÓ&݆ 7]͙֘—•c;³Ó;§g%ÌZ]×2iAvñU`vàp_f`ƒ }rŸ>š†‡Æ°%Õ;у*@\¿<:Ȳ»åmb½~¦6°\äOaïe¬ÝÌV󲯔FË2ïh?A WµVE×o;€Šu4yU¼Ê.Í>Nî‘ñ"wAeÔ¥[–…k,²Ëõð¼z < ¢–;«V7qŒÚØ}kÈ�T– ±fjËË$mOA»ÖV­ÒðTöØW™³N%¶LS¦mÕ¥�\{;·Ø(ÓDV…ˆÓâŽXæ•7Ö**JêÎîgÃò´Xr=Õö㺺7ž[Ç\7«;J¿v‹Ð`÷æG=îºz †·*»C ÅA²�À®`ë”ùˆa ä™Û©Ðvé/l)/˜\6N½%Œ5«k´uF;B«ÐxÚ&°lš®Ôº›š%p¹€–YÓ=|ìŒr°hhðíÆ ¿<ÝYAð¼Ìv‰VsXLÚËÁ¦±æä2�õpN¥^KŠï`ðGVõÙá{wqóÄð[æW�IÇæbEQ;Õb„1ÃyuCºÅ1 æïT³æOåúýÿ/ÛßíDÿ±sÿ¡jÆÛÐl¤?üº˜ÿ ÿr‹C+ý»Êƒ�Ûjd¹”Ð4ŸÒ§ ·ªÚ¶�[•>•Mü[ö¯ëK-Š,=Êô´yº8Å”GÂbaKþ'§iŸ*²EPF†„‡»bÜáqVЊÛã(Oÿ7Q¼ q¹S'ÐßžTäÉI3d" ñ_K¥…«`¿òÖF¤½ÌÙ}M�[õk/|ÇV4–LÇç±í[Êg3^ÍtÇõç:"ÉW°T²º�ù< ÑÓ°Î"þDM]j`fnó" Rt‰¯ún,‹* ½i²!Gá–%úÜ9û»‘G[6älÌzÒÿ£aöïm½Òˆ÷êyU7Ñâ.—<0cNàz|Ö#Bp‡7:=&Md‡Ò¢z„¾Åßÿr¢¤Ÿl(î#»£áÍôµêùÝÖ±$œ%’ÔK`í²8Cä¥Ä£TLá!%—›(ó»üO j5#áb+Ú„ºŒµN²yuâ@Ýs·U”FßÝ~ï¥{­B£\R*ÿš®þ¨Ä~.¤Hy _<¸WN0Š˜>œì½~3RUSò”&vT½¯OO¬‹ËŒTÌÀƒ‰4)NK<ÜÄ è&SD“wnÖTLÚ=s,«Žî˜gÚpŒ�<Ž�|ùò`>àlŠä*¨>�ú¿Tú) …•Mñn!Kkˆå¸—E�¡=Tõªê[â„ĨM1ö¢N�emÏÆØ;ZH°šÆÓ:\Éî^å=˜ÔiBIè9Ç+gÔl‹…IkLE×Ùt­3u±TÇãª�º*þÌù*5>›­,¸Ú"à°†šg Ž]y>6ûr©RP×0,2‘ìµ;¤{HEÓ_cà™]fO¶�8‚†øž«2¬Š¥=k_/«ŽÑ“¡¨De¡ž.ì$/‡t ªñKâõ“í=£žTA¬N�>sðÝÝEë‡SR”l¡º˜ÍÆëG[�ƒ’Ps­èÅ’Gz‚X„QíAÍAÚƒp\Ðã•F»�Zòþæï{€Ýaq´É&O-G-–U!¨§&¡Ò‚.>ÜÌ3ñÉ‚+žhq HXx`ûL3kNÈ™ª�;»°”¤ ÆÆˆfÉ5P <“voÕô&ÒcÓÈé ”ý¾¡Q—áô[ûP}ÛÃâŸS—]Fo?S¥|$�÷=6wæ>Þú6M×ç{ý0qà —b=Г» n‹�¦z¹ÇõŸ�#jœä8XEÏJ¨øo¸u�T!'Ü3Æb 'ÄA2q5×5Y1I¤æ A^› çPªš™F~�‘û‹âùÇo2Çñ«£ÏMEé¿Þþr›ºÙïL‹?­{aZšM{zXãJ:ÕÄABÐŒ£�6µbMó1Ù0ÚHä�›&HöÆô ¯*"œæ§³~³<ËÚ1»*$¦6„Q ü)›±gíKJÄFU²›ÔáƒSå*äEIìÍÜsNf ˜—ô¦KõÐ8iÄ …Œµø!7W ö½Ø�wºî¨ˆ ~a‘Q;Ë4nèI=  HŠ�OâcÕœªîj ³ÿp 1¹ „‡1éá»(ÌÓ©©ßW"8T6µâ½A6þí?©Ø¬jÒɨª‘¬çYʱfxZ™.¡@»tË�—û¦ê‚dœ.'G›GJ¸�4¤•%}ܾ�»Öçæ89VþÏQ`µ§!=Gl*SîäzãF¼‘¨s9ZõDš-@TGï6Ym;KUÜ=ò¬e,®—6kJlU=ž'$AõC,•ºy)(6ÂâÔ—"JŠâ.­p„5 ¼Já¨#J¡-9>@A¬ø¢µók9t̺c¡ó¥ÁqÜ%|T ùê®'0p9…‰ÛlFHpÓ'ù8dBZ4Û%Ï)“¤%õ4f£¶6”d·Wù›˜�Ìd†+)ŠòDEusÆ�˜Í–DG0¤h26—(Ñþ°¨BnlÃe&œ*¶U(š,ë.>ÕL]1¢ŸÕÃêòÜñ§ZxÍ©„¾I"Jgy»zé?hÞ Œgë¬Ì¼�('5_ó‡O(4t£ÍqcHT¦šB¥Fj!è(©SjM·*PIø»·w\+Ê)€WN g?…³â¯›F$ñ% L =ÈqÛÛóx›8FÁż#;dô¶õjñt£%NaŸ—y¼ I ^¡¼C£O+ã•b)!ñc*QQ~ ³rüȇ !ÕmœÕs%¼f8iJ’� pôŒšEM+S•Âr6¶%æ°¥QB§& R›¿DVhŽ5£w6lñ==;fã(¥©Œ?JµM ¦Î�b óÀA%¨Ž4²~–ù,lŠÌ–;Ò·Ûa-A©YR4J<ÕuTɦ©Ë㌼íî¶&TJ™JÑ%J¡Ÿ�$˜pV¥YÕŠö¥©gµ2e ÆçNþ�JFÓÁ¦µäIaõ‘Ö³ÇÝ €HÒ)ޝšì+‘Íä(ɰwe5ù·ª•†Uu@޾TÐ0žÕìþЪµ1E爨º ˜¨UUS¿‚‡w‹M¦ë?EGõÛ¶.ñ'ºÍ,ü~6«2J‚Ñ<±k<¹ÜÕç{cug9�Æ.ÈP#âôrfBý&]�®ÜJëñY‚„÷­kŠ»CFÅ[$¸š G4óŸåX~n÷š*EZÉ2q·NK¹qìÃÎÿ24E"iœ;êu|å�3‘¨0Œ•$¯±F�³n=BÉ C’Ê�S‰-’Ìš¹Sñ‰Ùö÷üèvʼn鎨q*Øê¾Ñ£ ×3Rä?míocq<£=·ˆ�%ÌÛ^§³¸ �{í¡wg¤©sůÕ-ºÉÎf:Ywš“µuª6´ä@áÇN¶i¦¬ÑÔ…£“mICJ™ä„òI4°=9`¦É¢ jŽÐÜFVß5·ÌÏgyo<Óóª²f.ÅVCø¾«ê¤ë‹!¶Í?ŒyÕIµ¯ªÑû×!ÁâƒÜ5À{ÝMbÞj97ryçb'‚•CB5§¿“f€E«a›˜=rèéiѸëÞçìò^JÑT¶h² Ñ\ÜF/”$±Ÿ"ìRlÀP£fà‡4A˜)†eI�qA‡LÈá°étutêí"8þ&¢‡ê²ño‹$»L>ßsÛ«G΢(Ï.•a‹¢ÒíAZ0ŠÊLP?U²�Šeó½ÿWÕòxÍú˜ƒ­Jé1r)‚0«vJaNjx ¸H–rŸ DdŒ¹2õ½]Uí̪j�ACìÐk™sO„ÍÌ4–KáeÏ]ië¬�ñ¬Å‡mÓpåÓ�q|óÍÙ'�“ÅiÎm(ð´yº½f–l�E.³ œ^þ7*vrñFQ2{h@é•Ï®'T(²Áª‚-èKI ©,¾ß“² ¢xº™ÍØ1þê ‰ñ§Nø½üóÌÉÑ´,kjŠ"êàd.MÖœ½ Ïûï}›õÌ&+i"Éæó<×¼ÆT§¤œ¡fôàf5¼Îüuú9¤9åð7¬“†9•2åÀ�Jô�¥Õ�Ö·øº“»Ü{qOõBYƒ`ÙD?^ò M¤V��aºEˆµgy¼œëZÌÏY¨ŸæÂtqg<øž œp“gâ„Ol"ô|Èë÷æAª#¤V¨þœ„å¿sf7Gm·¤‰µK먑_“š…ûz�©àt�ó}‚êWK“²ÎI|s¹¹æY$™…õD¥DZ:ãZ¢,ŒåêªdÊà'pÆê`ûï[šßjAy•á©ây¹'ìeÙ×ã®4Ì4"8rGoön>ø>U\×PS¢é�ˆüO” §uN–×&Œ“Ç9æ¶pò°rÃÎ_FÜtc‚³y\wÏ �u+[Na^ÐP& 2÷-³LhäãUMµâ5Ë¡lkÛݺ+éïûÍ’¶œ_t¾º�•´4œ ìuÒOJýLêñ¦ÒæO¬¾¦Çăý+Fñ¥`’+æ»ê°g’$ß*ã­înNÛ�eoÌÃõZÝj1¶Ûµ„�Ð-6ŒPßï«F� ‡`­1#q1Qcr¿›^4ƒ>8‘ º{ò¼Ä¥�K¨c"†$ê5U&±Y‰±ˤq zz�×öãm)oÓ�DÁ{uzáôA›{;1ÙÌX/lj).Y*bÕÃââà\å·Ã;ç{¾ï<³Ñ]\ñ§]xeûsÔ¤öpveä´¦tpÆb# –©¸·Ì-� ED89O½üŽ2coOTÇRBrTwÇ7["󹦫6©‘9…8É>œþoÄ?˜ ™LFCÞlÑѸ]i˜$ ¥ªˆÜ¾ôÄ—]Ê„}!OD©êQÌmìäGNzøÃ·ÃA-ÈZ/4Ĉ0XpߨãÔ„fÅórA$þ¢ Câ H³Ä'¥Ágwb'Žî è>|o(k)r2/l-dÏÍUÑTv&#ü'˜þY…îþNr7ø›¢bWø‚¬öe*5‡¥×”ÜžªåpKÛ.Ö“bB!™<µoóXd|¬ï9L¤!ÂrÖ£q7[T„ »—DÂü|¬²‰ç�¸”U{‰#‚ªÌÕXÔþ:ZÊ£-ÓÆH�¸¯×3¼ìîaH0ê? D• žÞy¦.�� -´A¶6DÃ@\%4¿HQ`"*PhGØFŽö š0ÅŒ¨I¤¢&�œ�© ~&ÀHÃÇœ6‰?’œVÀPxª‚‚/aDÈ$Q÷Ö'¶á„²“I†[§’J�ˆGÖi£…n11…蓮6™a«!Ä–:j�"› )W/K•¥b½ /!jš–Ü(€M•â I"qÃHQII�Š¢Ø0d�¶I€Ò8[òõ±#~1%�PE²ÃjÙ+“ˆe,¬I ÒœyU1$d¬Ie‚P €p”0�ý˜#�)8²�%âð'Å ‚ A´¡D¼„MÜPù$)½²?"Š%§¨zâD$‘)tqf惘2Ðý$! }¦*�šÁlŽ6YlÁƒÌ ÒCD†@H´[4ŽÐ†¤áH ¢KÂ^©³ Zdcî JH‰ÍŽ5Žå)F¬JŒ—E„†d-¤2£P(”B¢,æ(»d±h0^"Ët‡áûµ$Uˆeq•­¨´Ë>4Y%’0„RF �.¤(v°³æN]^R6(áhÔœÀGjç‘ô 5 þPS£°‘ô(’q:f � H‰Úø$ØCò8†þªè¤I¤ÍL’U0BD¢ ZYq·¸äAH">$ �Öd¡�ŠÍ@1;KÐ2ß®Ôðå9r#·Žºð×#®#¿3®b€(6Â/ó”ÉFÎ æ³d§ê6\•´AA´Ûg)˜P^Ð 7 ÒÅZ’& å'*U±· 4‘Æ«‰‰y[¼H ŠM¤…�üH‘”(…†¤`%á� 5‹ô¡„¨i,‘Oì€âùºUE³I§éáÓl…H=ô”‘)0K'¶ø¤Ë)t¥ëžnŸ¯ßôñÉü†ÿÊ[ø¨[úÿ¥ ûF5Þ6vò�­¦è…Ëo :Ví å7}®´*£V6YzÍ–ts²ô³×éuÚEèÞÔ%æç[®²*d6Îí�“eõ6^Ÿò4vû7~|cq3Äg]oa�QËê—‡­‘•°[г]Ù/!_dÌF¸Š! ^–+¯7Qi»R±zÄìésªÉâh)’´$±F¨'‘üýëüÂ÷ô ˜ÿ"åT?ÑS!ªü3þ#ÃlÿxQeqM¨l0pØX?·ƒl=©fÇüÅ–OüNt·J´á,¤ ô³Â,½»îVmH†V!î˜Ñ™�lCM(š8B9U†—Ö !¢�ÒJ 0/‚¦hJ†ÙMþÿ�ßߨýÏñü`ýªÁ ‚kö}NÍvȆ󕴳aÞ!4.ïh |}�ÌËc¢ÝÞ&¼í=Õ0-uç~̦öëzÔ g«ÇÉáµ3p9Ø£Úé α}AÓ·�»iå'>|+Óp;Zy‡,¶ÅµcA«ëÌÕƒuÞXˆ8¦"hÖ,¥Ý³LìÍÔX¦Ô³¯ºÄ ò»ÜöÑ~gÁ]\>‘pb©O¯�qöÊ#;¥r†™®éOg ö ™»¡¬xôpοVáÚ úSTìWvf»Á¦Çmyá4ëRÐ#ËY&mª�ûÈëDÞ+®‹åÛ$wή,Ç6n ç5PîÆKËÜHÙÒÆ±µ·w,ƒµ¦L§áK6²ôt¼:j–ÕŒ²8Õ] d·]®Å™�·nkÁM^ÓËîé ÏAØ5÷iC¢µž§1RÌÙî!± D,¾{iLÁU”¤Ü•Úª¸ÉUróÓš5m1G/ª qĤȷÎÃÑ´ ó1k�zß^#Íëî•®ØHQ7ÄÛ 1ÑyYºHºµ}G"G¥¸+³…Á§sƆP|/É#TЦ+E@° D_ ¼1S9Iñy¤p}˜%gM\†gfɪ^ ¿"õÚ±ÁN�ˆVäl-±5]ªSͼ�pU˜U…|§~ÿHB` H@`@Ïÿzÿc/YïS3á—{h=#õÉëúš©�/v-•HãWtˆJC¿WvÇÿ¯ŒÌ«Ž?u.!ûÿ¡®2}ºá\^ÖºæH…ñ¿¼Ð}““jwÄ7ê%yˆ~õ¿hX~v¢7BmÝ6çÊ?Û#è¶³çê~/M¡êƒÅH"KÆÍ Pß}ö…÷þ–Ùt{¬qÛŽ[Í'�n wn½˜G!¬I{ó©}g]oŸüµ7‚y—“ÛÒÔÎK]î,mÔCƒ×¤Œ5üçG¨‹YˆC¨ý,…' 68ÏŸJ�†œp6ÿø ¥ R\ÿkÏLñi[]¡#?¹¼��B+³¿lúþuoÙŽhm,±«RUßVìÑþ`X«åçŸA¾gÔ^íÿ¨Å¹„ZÜÞøiq=t¸(Ãfþ­ø8»úçJc†hƒ{ÐêÃÃüaþK r‹b¾¢¶‰q^Ž«L8â÷cðç—ù‡ª†°A9—ˆ¬bÍKº'ç¯õ�ÙàÆåOãGeâÇ©8÷'©ç»”ÚòŽìùÿQžÝóà\vðæ†»?�ðLé»ßÔ+="Ù9Éñÿ¿¶Ûῤù€ê‰ÐÍo·Õ?é=ÃÃ:‚ÍŠNÜ›ýsº×Ô6ÁwÕzØ3²3½{pÎ_y ‡õ‰ ßÃO»:É*3ô]pîï'¤õx)SÅ뻆ù÷ÕO=H\ºÆß:¯®x|·�ù×A.R÷Ïl_�¼Ñ;vžk¯mÞ\õ†‹=Cë;öŽùnß�ÿÕ¤Œ6�òã﬒á3-³ËFÿÑ÷bßT{Wqüo»DÃQÉHÆÖ³‚¿P„”Ž‚áÛZ¥ÿü0òŽ7ÃBËÕ%WwM4½“lY�ÿE›0ÿ@ÓKbš�‚‰Mô£…A+ gÎTHº»m1¦Ô�$ Bóß¿ÏTÅ­Å©óĉ)ʸ|2²ÇXNÞõÒK/=­C2b†Ôt0¹¹%)’€-WÁôd°ŒXp¢ €hI�#Êሔ—Q! $�ó¤b¯zëi¦ñ$þ_)Š×�ªíÂ8K*¦1·’.PQçÊÅÕHEì»‹Ý øXê‘‚É00‚ë˜X-Êà"Áe'ÿ„$�„„$�¦ç÷ÄK `jb³ ÉI!¨â¢ 3mÐ%†[RC’I±*¡©,±*[w9³F©m77DU?Š>�Hæ†g¯?ɧ¹2izÌ8p1°´�›¸½h©ëk.œ—D–0”t—Р¨!JE¤2�¡èê•CJíiÒ>` H@a¾¹mI6¤äÔE&TÌ|â­l‡±ÛaIVªIU$¡ƒ$b¢¡QÀÆÛÈ!²�†5�•NGÖ2j«�´´fªªbö¿iô^�£ìØ2¶‡÷W¾´H�úˆèÚš<äµ/Zk“³m`Y§¢ÖÞ Ž Ì©&¬© �É!n+–.ä7㊿Kñ[UÒ³ÍíXÚl‰ÇÅã:ª™W�KÒra&ʤ— ^Ñ›ã3\"à¬Å`«æÚ¼ åÕ ¤ª�€�A:+·€,„Á xB§,�´>Gúa#°ê …Âä§’ë¿—ðWýMs) srI”œ56DØ`\"D¨‰�¯“™HW¨æ$„JR8÷Q€[vY”oû÷ÒÜWûüL«Ó²šbCÁ„$à0@»Uý¥Ø #c›ZtFË™,çä*%!.X¥$º~™b H(A„’ì® Í$�´�Ì”¢(¦Áw¨Ia Â8GЉ9Gô]{í�|]£@W™zA2—­Rª´Iâ¬m–ìZshõ Ó`؆„´, ÙÑÝ  *…:ÔëLIõ"Z& Biø‰ƒå$ ±ãß]¸>žƒË×ßãããCÓ×CÛŠæ›âc×û¬z+ÞÞïOÞûj/[:†0×÷ƒßÛµc'/·é‚ ••’1©\!ÏŒÀuÌ÷æM¿×ÔcWPé�ø’ÿ±ú½ê™èC–p;p¶wß�¦ îÈýâ¥IŠÎMX¿„ÿÄ À»ãkó†N±þ}8]|Å©ãœ~®Ûÿp±ØhB„ÇKxDâG.)¼Wxá/]:%âÓeþµûAÆ{ʵ-ú÷.úÒ!ù¦ˆºì1³ü³gžÓíÙ}¼„ï¾:�tígv \ï6î�¿¼JPÒínÏ¥³ò:þ¢ºp4ë%ùó@�Fv—@ñÈ�gÙwŸ�¢Vìü—È÷j»êìÑVä5?Æm]¿¿¯ jžîjë�ÿ€R”«M� ƒ×Ëôûvm¸ˆV†8²ˆ–TŸÕëZˆu¤õ¡lçâ6D )²Vfá šÎÞÍDCëÃcz‚°¨f³×�ºSÞÑX.æµüšò ]—¨ÿfá”Q4>À)ðè"D]JÌ<·„®Œ"ì´ŠæUdeÞ3ʺRÒrCé8ÓÏKr¥´½U#XÙ�¬ŸÂ`¢C]ŽPUøZrBYµ�4I£NOªkS¼ËÛd?W¿¶A£üòyÓa×é”ýTu:®Ÿ ;Ç4-„ØY !gˆÃ@¡4P„11 –P 0€-ÁÆ'ž#ôZ¶¤³ ÀÐY„°«P†ÍÃ0_¤-…Ã5Á.�`ÄÏòòÍÄj™n¯—¹Õw·}£R3mì×:Ý[†Í—[›�ºµÏw]iÙ ¡±4¸Ó;‹ÓNZDR�Y"~1[R`·jZ¹þâ™kÁ餆 $Æ1ªÑ¶k@¢Õ1DUI Æ0hؘn\ˆÜ¹Î.ß7{2‰¶ïsšâ®L»ÔÔŤ m U¡MÔHh¬Ê‹ü ÃÞuåvκ¬ÛlfúV�æJ„ÛhÈCKTlš¼Õ@E–—¨ë%*Âɉ~Eå "¦ ÎaTñ¡¦Ž¹Rª—Þjÿu¯”UÞÐVÑ•íjº§|Eé˜nBòѵS�PÂ.(HØpQÀç·[Â1 4ÖÜ@6îýäc�Q–!“VEâ± Ò¨�/=ÅP>Ë4¼‚Qý#÷Ö÷úÃoè³Ý¢~Vç#ÖÏO£˜Å(¸æB]Q�W¸†�â• mÑL¢RУoÔe ‹ô$H ø£ïoBð#×íw^ÈÏûèGÓMcbIõkcNjG˜·\(>w87àëü×M ù¹¯T€8K Õ¹z$�*Ò@$$¼y|Ž)z{ÐeY>ß^~¹—Ê>ùu¦–þ'óÔܲóö9gÌ;ׯ?yæü~ä”�ãÛ³ÙÜuý×îÜ»–i²�Ýê¾Z`“¼ÿF4ãw¦e q‰PîÕ@sڟƹê�¨Ýt¾ÌÆ©µðí¡„–O¼ö[KÛ lqZóÝ¿JrÚ±m"ÇÉ|&y¢ÀòQ ’{­ü@àœUÈ/ïä÷ùÚ[ã–µ!»÷Ö¹?´Ÿ õµ¡ž®INöw_«Ço“Íh7ÂüûáË.ãûzÄ(b´s¾®ÎÞ†zñ4”¾c\I¶º 3Û�G·~ÌîÎaëƒÄ�¼Öýɽº€hõîb¯�å°û‚Ø{\}d/�àk‚;/ˆ²¡Mt¥1ꟗ>Ãûú�ʽÛÍ1Ÿ¹Ïd¯/�gjÙ‚š‹4ÞçÝŒ˜NºW·Ö×jÁr‚ìãÆÇhy§xÎû° ½å¿‘´âÿ†WŠv/½®„²ÝHö•ÙžÉø¦Ù1Î_ç]oè¼ËÀõÙ�åÚ‡—7ã3ª­^?c ^»Ã´¥^|ˆ.?¨çr.Þ?qÜÃ\u˜ûöVã,Ú_Þ›(ÚMç¼Üøöì¸p,ò–z÷ý¤ó†¿úe‘�çŒÌìBÓ¬/ïן�nzd®{~½4Ïú„#›ÙüFžcüÖ•2è±%Ç SkLýZ§d¸ÒÅ¡70’.Œ‚DHÁ�ƒ¨Êc}7³&•±QŽ}k9ë `¼óè•®H+ ÇWu•§Èox|Éžh¢Ð2 ‹øÌ÷!é 7}t‰¨´"դ˯á»Ô7Aèá‚ÎEm±ú”äÞVL$�¶n¨ ¶¢DeËMUIÇiK•ÿž=±k#&îðÏó¸1« zs5Yj(h²g)Šƒ¡5E5’ú  Á(ûçÛÖcšyh`Á4Rx‡ùB�„Q %nÌ–¢ŒÉEˆN ÊÂæ¤™ 0!t  é5m�œñ4eD¦ Õõ¾¡ïe;x`GȦýa�Õ"¦°ù::Ÿaé=&EfÍ}<ËŸktÖßG<[=a�üñåžîöïN{ù�–K³é K\½¹eµHÒ[ü÷ræß�4ýJQ¯{úž/�q¤ÃðR#ÄjŽÅ3Ò»pºøí´3Rðå»3oM|OÏoœùó<‡³û,Ç swÞŒCÞÛÒÓëÄß>œÃ{Oûåtç«8JÒŽoŽWj%Äéµz£kóµømƒC±W–þZõ8JÐÇ`NV¸ª5õc<1g*A‡tØã¿£HR�Ù´Šä!°ÅÓPôê²8E›�0?±÷.s�7ÔÚ2Åë«;ô#¿ïï½ï(çlu |Ï=§ \¬Ü¿¿#÷¿k½¾‰¿ÿ¨vÞÝŠWvxÄuî¬Cßž_Å�ÞÒÖ¹.|{d—hvÑêshÖ\§o¥úußa Ëß¾=ÜíYõ¦ô;›=TÍ®Vv1¼~ƒßMIQ÷Ÿõ¡·¬è®!ÝW…C»cÁf•r{í¨@Ûr|ÙyùaxŸé/ÌiD_„ÙzVÖbü~Óõ=´$*JtB#íµlßÛví‡XÖèÃxR'ðRÎâwËûj£Î?dß~3Ã5O¯ †ÜM‘�»Î|=¬�˜L•ÏÊ�¼ÒbqŒÅôîg3¶/ýq-*“oôúEÊŽ„]eý|⽃zÈ¿bm7áe±¯ØoEÛ  Æö]ï¿§å‘í˜_ôx|WÌ™ïX ÐkE…yy☵²2¯00wvahÁ¶×âTq…îªH$4ÛA;µ«‘~¡ŒÍP´Ê…TfÅŒ`?ZÖÂìèžþYn‡è’y·VñnÏ=Kˆ­7ÃçÒ•Ì<ÉF@?� °:!ã¦j±*W` Âk”*†Æ:´vb"¢khÙÜ­ÀäÍøz+®§ùM�ÝáÔwŒb±Žö1Ø@¸c+Õ©*E›iê~ø‰Nk“ˆEÕÑ�‹’ódz\·—Ê%š?¯8£n¬ 5$».rSm%Lì…]%Ty°ÄßÅ(9©¤–�MB …”¡Q68 €°V1Qó©ÙLæ,°kýÕE‡ýµØ©Ñæ/m¯SZ×:G0ªsÜ,Â4*’Y°*«´ïÛ… &à€¡'’*ê�!섚g—­.žît¤I¤9ñ§ê+KI¹³t¡�6”¸ Ñ‚„£a ¢\['F7C« –Ô(óElâ¦]GÎ]�èJ"×�üÒÉ‘pÍxƒ�PÌÝ$èÜ ’Æ|�F¢•sÎ5^£T)=¨Qއ/{NFa´‚ás]ÍGD¿(7©~|Ì„šå’:+ñ ùùrCß´ñ ?ÇåkbYÖtða`’“¯óÄÑ{uè6›Ìæi²èˆd¼ª\E¨ù� i{�! ’À{{$…ú>=D�½‘¿‰=�A¦n–h ÔÊC8L�~¨²)ûHM¶š- iˆ³°Ð¶’†ä D¦!Œû¡+‹]çJI’áj,’UñÈ÷z.FÊœ¨¶U?AÑ‚G ËvXtt>:†Å¸R”ûþÞßÍñ×ß�e}S–û¢‹S—ñÁô›-êýC/µý›£ý4 IÊÖöË–;Je.¼ac݉8ûHÃoMa ÛMƒ·þÒÆÅãæ$�e×� ‹ú !^𢘠6ŽÒIº|s4…Õ´Û.ßN6Q› ¶–Ê^~ Ê‡wùX¦ç~Ó'› ½¸Zâ¾O[åÐz»¨3L¤+·oS€k3Ë:˜ãij1h[&›höûâ\½¾rÈõÞíǼQ Ž?§¨v!÷ÇöwH½=›„å+ôÞÝSÏB~OæÛø)’.ЫU°:Å Îõ#aq&÷Èû‘ŽòIXÏ�Ku°[1á`óÑv/dûïíž%‡lë÷¨«§AnÛx¿híþtcð67úLO u˜Ð�ì²iÕÔáqƒ0Á/ûøS(?o’­ˆ÷ÇÔó.þ*é| N+7¸ohI—”7On§Õ{;æíÏ«[áë%Û¨oñZg¾Õú²!uô}*9_;&ºÙÌ®í^‹Ü-qkõ ¸÷§w¿‰ùÛ��EæC+[ïÖÎ?�¿{ݧuÂ<÷‘sžåÎ --(‡ee-¿Š xãÃG¼×'óÝÔÖ¢®âõÛmøÇb±šö-pý´ rúw˜»:fîò=u�,?o›ºŠc'nŽËxÇ!Ý·Ü“¿ZÑdžŸ‰šü…ÁÞ5Gö´­h2}Ó0pâ ýh>¥&A3î"ÛàD÷ì'ß3 ’^ÙûµøMÆQÞhù]3Ør6}6wˆñyUªµ>]Ž÷ò Qä»KnvâÓ�Íé>xš^´(ñrÔ\�ÁvE½Ê$ƒÛ¾ËéÍFM‹�JUÞSz5¼—•Çg1Sí·Ð·³8•’XYÆ"°'¬<€±�JPXh£ÒŽgÌ= ²eHbzƾvNpÐ+ ,×A€©‡¬U€W *+Jœ3èûñú«Š!5 @H`"¼})µ,¤LÜ(…ýFi` HÝ ¨Õ˜@‘!ÏM r’O7 #ŒºÏ*/ˈ92êDÌVð*$�ÚƒàÕ�ß1Wx=⋽gÕô›Mä¸È•2©¢Fbc¤7Ù(7 ÂH‘d9 >:âŒK¼ Õžyî# |Ý~H3‚×ÚíóáÝv[fÔõ�—WzŒ·dü,Gæ»+¶ì­¿[Âtßo–ùç‰ì5Í%®z›äÙ;íééb·dšTØFhNõˆí×3=¢²Ð�%ÍÔÕ—GK³©NÎæ¿â©ËÇ&Ú‡ïøû~÷hužÚ({§ðéäúõ$‡º<ÃÉÿ{›NNw(;r–íVØïâb,î-YÉ^©Áz5UþO³O­=äïØáýýqÞUæÞ7ˉ¥fÃ\}¦zcžíë™t¾š¨ýÄí?ž�h�pâL„]ž ªxÇèÚXí/ž—ÎvÎûés¿P%hÂX‰ŸYO}6LÝ>Õ;Á;î1 _;KÝwñߪ3\\ÆL¼dòéä=ñuù�µê^Ç[éæÌëœÿqGËç=hÄoOÓ ó]C{OUÙ«7¶ì.¸ѱî3æ,m­¤ÑÌí–:Ð_kÔg¡á²¿éfvEÛ|uþÁÈS÷ßDÚãîy^~ˆ ¹<ãhÃ×U’ö�ye}Ç‹ùgήèzÖåÝótïL2ÞEE|½b•‘ô{sÁ²'|˜nÒÓžM�áÐþÒ¨^Ð!<Õb›ÙÝ´c¢ZX¡HcßÌ·Ûí³¼Šxá}O®æ!Ú«&³Ä÷¬‹±OÌnú=M‚|ûÕ^ø|·ê+óƒG\Ä%æõ¹ÿL1îx8£É]&ál%1Š6¡’`1w­É÷X~¤ÖѼæa�Ìï© TLLb !Í^•Ô¾Š^Ý+‹¡rlxñ¹{ó‚ ŒL­Y´@Ç%V¡+U¿)½ªNÕâ*zX´yÆo+Y“bìƒ�žöšmš0q�Ú*k¢co˜aR‚LG0È…UZƒ„L„A•1µmyPUeÐót«‹�èïJVbþ<ñHd½sR§lôêþ²mZt r©¶P¥7|ºe^‹Ê3z±]TêCZ«©)½C$^÷[³”ÖŽŽ×3fKbžMO÷†+*UuCDŸ!0Lp8ÁÀÀøE"™ol0jÖ0ÛCx I­Œ‘vž.·‰\ÿ´V^¼Þ튜Wó#“âÅì²;K»†·üjÈ$7ÂÞMâÃØ”” ¥ D#DÓuW‡h!¡‡ iã­Ñ’kB‡^}Šér¶<Ü v‚Ìwǵµ¥‹e忇¦áÀÚf‰]aÒrEMâ7Krȼ€$Y �ÇQŒ ™«F”a¡½,i{ýÄV˜pR ªzÆpDSâ&Ñ•¬]úbÖ®2¿Á3<Óõ;Á˜+.JPI‚xÀMYÉYg¥È<ŽÚzúϪßw¹œß´U\Š“/]Ì¥*›¹‰ù¬|g0åœ|”yù+Ñ¢:îHȆé5P2Lw­³0Uù²+e ÈîSpÐI0$ ’õ7ø€<–Ñ„&K÷=Ü•EÑÜ@ì™) ‘dÑ! a!/Eø‰ë*è¨Sô…IYµ)W£­nd’V¢Æ„6$³b 1H…ÑÝŠè ß¾wYsúHóG’IgœA¿¡ƒ?O¿^‡»­Ì~®•öœu÷îìïßœõ·±?xnF]�çT? k>Ô_Òë÷œs€Å½-œ~ˆÔw%YS¦– ‹ C³±ÞֆàôNçÜ—2‹LúZïI]9»öórßHI2º¢ úØ| 6ÿœÍd?žÄ9eH¨D”:É)ßý«}Ĺ`Çß&[íkåȉ¥Š"8�ûùë¿þí5êŸQ*:èhýæ ©Ä¿»ùËÕËx[PI´ü}cˆ§¯þm”Zêl^Wí“ùŸ›�4îìí·ßÞ.íüs$ßïd·ÂÄëÆóºÞiTùèÿVüÏ矽XHºÀAÏfüjåÑcÔ…ˆ0¿)ìJ0´ÚUråEÿÙŽ þþW1�äïD¥ ¿‰¯‰ËËââòÀñ–׈÷‡ÎÏíÒcS7wí¯6´Ýâ.ÈíŸ{FØPiþˆ¶²|Ì¢kUÌ/>ý_è_óN­.É�›@JG96ªéÙ�}áÁþÚsWDþ xÞ~–áŒ. ž·Ûü‚"¾ÝÈyv±â¬|ýÀó¼aßQÊb„óf:ò]êè÷ÄXé:µvâ%õí�êØÕ?‘´íæ#ó?‹‘/�Xe;n8Ä¿äëGc=©n:Hýgß-Àk=úQÔ?°\ ?[œ­ÿÓýè~ž ¿ÒMqá~†Z²ü„w'¬¿'®rŒ—oåœûB)¦Í=¿±wmqøß‡ônùxúØcá qôQbDÃ0ŸÏ–p—WZ³[ â}ö¯�½wŸÁ•PO´lÿ^ÿ.\¹q€šû1~N.û9;$‹¯fž=€îЬ�0öXçÖ=pGjÏn'IóèxÓ”g¡�š?o�"dnÖ«¢‡ÜR°D~G�Ju'°íûGËTÄÔ„*-X°¥+*¤”[í¬¤`b+#™ôžBTK–ÜoËöiþ¼‡þÈZÓ®Œþëø»Æás±ª Ç7›?J>Ò Á0¡® @�«ÐÚ ˜ ¬XÛn ”Ñ´6‰L»!^ö%dÐÓ œ&‘—¥²ÕEÝ Ù-Ï¥!¿7¡-êYhJ« Sœ½e%pd[ ñ 6b*‰ó€.оqÎB✊èB¤l¥È¿ïáÚBV`1Ë…&»*[`ÆYr3‡Q„{ì’‘¥¤²‚…S0#ƒiFfM6›ð3Cÿó³6V–¿?ÔÕ�=Gó0ƈ`Š’n/õ‹Ý… ºH9y:MBÃM¦Ói݈D ÿ™ée~þ¶xz6?kRYüÜ_÷/ˆ'e-o[Ò¢Ý-­ÊMZT)ƒ ÕkLÄZ=ã%r‚�¢%R¹[YçbšZ„Ü= Iˆ„Œ²M«’‘|ª6YIx¬7JÎFZɦV±«ÕH´…¸4Ò"`ˆ•„UhØÒCa(¦¬O·(/„6e$øÞÌk!) £¦�‘Ĩ´wPbG«¨ÕÎr\RZ"i/­•ÍiŠað�· lhµGP¡UVù¶ÙÑžÖ]tÑÌ:Æt£˜Ñ‡�òô§ÆT½ �\†m·ÙBá7m†±(MKR¢�6ÂII„$�ÄW3õÓ÷^´‡":W}>¿€³�ŠL­¨ šˆƒõ·òÅqh£°a´3Ú*D™Xi˜�(dŽÕg; £ÁÍ«={²”Ä2„ �"Œ#É� ³”Y¦1´¥x€ M ;•pÇ/�M™ À40b¢`º+4QH*•é @ÐRH‘¢›A 0Gâh– �# D$Td iƒBþ!t!mï^ʼn6)ÕÊâÅ[+›[» ÅÑèð )bè†P„ !44�¡Q¦”(\³„]•CJnÔ Ê „’˜ª4BJ”J!Ð… ’¡s,ÛD€€R‚€ÛÉ‹A~»h¿—Çe½N$·_Wþ—�N‹?Ô Ñ[™þy»Íã^§U†�ÙÌŠîá_}�öìÀ«LoVõŽŸ½ÃYý\Nƒ×z>2¿¹¬œÁ¬ùÍ¿¿£~zçKax�«n~�ødGpÿàæyš¶äï‡�Vu6 �©ª‡÷¼2†°Ó,ΰ׮:âûGP½ZPiýöÐmÁrTpˆ:wÊWI±¿¦÷võU‚“7Þƒ¶®ÇñÁZ}�~ö„w}Oº_îüöÚœÂ[pÁÑé5+%r¸ôî;¾5t‘#ï}óâÏ]«”îÑ ï{ö–η³ ùn¹pdÕ8¾.céÀã¨7>±­4<†ý7É5}KwùAå]sÛŒè¾ùØ`äïàºöï/"Üþ? Öâ[Q|Z˜¯†¸t1……†iVÙíñמ�YìÁ÷�¶þwwZ]ó vêžéêOÛã~%éMÈÛ‹üü“o|†zG̼1ׇ»Qð^†Õû�’Ž=ö–â= ]_Ô¦OæyÊF^x? ‹‹;ú}½æ0ê§÷kí�ùÙ·žF†ô>É„RȹàÎÈíTÀ41�˜j‘Ù¼r+PpÔ_ H¡× Q� g“ݪŒØŠ´6†ÐÛ�Q2ž<ŒWdŠTrôç,7wH™(ë0|B"�Œ>BÊ)£(ÃvÍÜãJ® öÒËäñ{Åó}+¯ÔpàñÕÆeÞ$?Û «…8ЧÄV¾÷¡'›ŠÅ/YbôçØËíå‚wóg"™zi•´ôÒxöKLÂã€ٶá#Z5YT�G_PÆKÎú�þ—,lâ†G1¨�C*i¶{ú1‘ïË <À $óøUóËqÇ?Ãÿ‹·¸³�*™7´cü I¤­HHÀÐU¥-$`i ɪ„&ÈAV“BÕd�Œ¦Ô×ãåÍ]L¥r0ФdµèÒ†QÏEB]†ØÚl»K…Áwª,òšIÃ(;ñÅ­wwƒ6˜ÃÆÂÓïí�Éf:h m]BÖTÕKZ×kPc­>ix®¦í*T“†Ý¢å)s�fHP †±î"È�žUUŠÖQ$FI¸iÃc1rÿH቎f�³ŽÕFe‰"ì ¬«ÿw‘É+¥5K&�G6AÝY� –DQaX0Q¦8Xo H@wì$)iÐùÂOážÅ·«S+FÓhVMS™´$Ñ­[¯d×}êÖ¸ðªä¼¦»zîÔX¤„Ä«…æ�¨’ÐaH*ÁC!8Á±ÙqÙœxéЖSÒÞ=|r¯ëɾ> Žõ�¿¼Í¸ÄNi̱þ§GåÞ³ï¼å%ÏÛ¬Œ„¿y¼[^éîÍf7|ü´¼¯ÂVXm“»…Æu!×é…÷ÝŽÚ_1Q�½º¼íþ³;Ok‚ÿ?Ð�‡ÝgÎ8g®Ý˜ø˜é+[gÍ"ÑÛÃÞÉ„¼¯ÎüBŸ7Æptþø˜ nÛN¯פ*¶”ßL×ÖOÓÃÖÇ]¸ÎÏaE§Ó—Ù€�õzêN‹âù nzwÙw·�Íùí£±¢ÉaÏsÏ`åŒ åØŸ1¦ïMîÐë­ºþ_J¾“´mD}Ò3Møø\KÞ”‡§=nf½×|m÷°�2ø\ûø:þžeˆ§XrUl­kߨˆY‹Œîw-ìǶ´«ÁïÅáÎàü²Qï_3g$mö½AŸ"sß�Ù|T³ÍÝÎÞŸY8UÊÓŽ”cMdåÄ’-Rüèz‹\,A]o¨�íšYº¸œ¼ ¸kyš´ "7vE˜<¯é2܆៉K%�?ÒG“Ú�‰ÄITs_˰) Ý(ÅãcH�é0‘�¸æŽÀíN|¦Œï3•láë{œ©Æj�ߊN|ª͸ŽS26ÝZP™T´KUJ_Yëp£'wÏä´ë_lLR…¨b«.jȧÊInut·UÀ`í%²âf¿ÑVÕÓH1”VŒºòe ÀéûÞ†ÝH0®mÝ&”jR&‰ ‹€”î‘Ó‚­ÀÝÃ7Êf´õµ<üItRÖ#D´CÔ!=–ã�¸pÚa¨;%��‹Ó7SO…ÁŒîŽZl¸]¯>Òl¦Ö6Ób®Áp "�¤S‚Á ÒƒŽ~ÅŠmàìÂ9‚2�¼@ÿ1{ï5ê¡k|Ò=Ý÷GÃþ6±ÎÒD ƒÐp4�$.„Cc¤?!$ i:²“�ô>ý¨}h·Y((Ïé9�D¨:ŽÂñLØ3ôf`·Q6C@ÛE®†@ IÞÙhBÆ^²‡XìÌùÒ󉩋=Ђ¢bIv§„ ä?òºÓËiØ�iΟ~EõÃ:®Û¼ó+6‘{(¶èÚW¬ç²7{Ë-ô{ßL/¿Ézl=­ü¬;U–Ôƒ6ö¿Å½ºÚÙŸœw;kè=ö­>ógi¯=´ÏÇïTO½!có�P×ö~Z(·‚Ì·6ìœ[û>‰6Ó3\—õr^›Ùk uþmî<IfqMS¯½>¶«×aî»ÝñÓ}«ße$_Þ±ÝüÉcÇve«¯Úò,ÉÙ”yuOåèPsÿ|£®†{ê=š$“†-Jž£é²Äæ4,:utÁûß±^5÷¾j/ˆžÐfìÇ�ÍmÀ]yHvgS[ƒÌOß=2ìÔ¶d%ߎ¡ö\üŽÿËrö[û}}>�BN ‡ÕK»wÙ¼Cjøòæô#ëÁqânW÷ÖãßõøWÉc]¹ç†vŒp]œÐ~23Ѹ�z{¿œfÉbݯµ�êþià< r”-žª!ÊE2æÕhÁ¶V°ß›ü=r8'i„n¿»)>=M»ê^S”þpôý3fkjL2ìÛÏÏ�P¥Û�¼)§Õ—«‚Тæþ~ýëü|?åùOÖÕñNŠP/”‡sŸ¨LKyÏÓøì Ý}fíËWøE•ƒNDnvdÿ†Ï°¯ÌêµK µùÇͪ�§I}œ¿-~Ûƒªáz¸Ê’exyZØ1‹–²+zßÏ߇ñ�ñå õˆ‚1L^Ê BH$çÊ!ÉM3*Ä6²jZÖ†JÊpb™ÑQÖ‚ºÇ$ Ý":oRûIek��ÈVÁgÿUÎ1!c õˆ€O;O‚„¦&VvyˆÍ³œæ}EB¿‚Žž„¯~3”ÑG®…4é ?�(ø–‰µÆKÊ'¤ ‰ª‡nP”ŸDS�H€9Ju'4w¦‹ øû%DEÍlšL0Ã(e¬FÔJ„C0"AîãϘè 1ÀÇ¢‚IT9ÀB0ªAi¤»Öxqʵü¡#®Ÿ~–¥--ŒëZÀØ ÓØ6§q¶ÇD¥Ø€ÑÝ/Ú23MŽQ€P ¤’¦+Òøtñe[×ÅvÊ“`Î}ml�PZ‰m 0y@‹Ívb[&)L?@�€Ò–ʦ¡ Æ ÕF<{ˆKÞuGÜݱÕB2ëþ¦¼–8˜kQ`HÑŽ�˜Õ �²”’ò—+�!"ƒ@’ßm£§}qB#3OØñ3]ò¥æ)\Fc› ©Ý1pÉ«P)60|a·&IUBJåÁ…ùxE˜‘y½×¹˜ lhk~|™­¬œõx¼O[e¶rOxiƒi�³ñ-Rä‘dÂ…r¯Ÿ'ø�RÙ$ûÞ`EîZ�Âx^Gx7œaâ�x+mj B0×0wM;�0ÈB…º…¦$†VHUDƒJi¹÷”¹Š£‘�ëšó¦.’B6 Uy¤r9 ¸�x�ÚI ø‚à`4’K@Ì>Ô4k$$…˜Ä%`B$C]…þÄ,C¢Ø%öÐ! +Ar© !¡¤…? ´ƒpíÔIy�!Ø à H@O¨@‚BH1$Ä�a! $D�ú„„$�þÞ¥=OÐ2<­¬M�ÓîþK¿ÉxŠA앆$Ün™Š¹ß8Üì¼Ò�+©zÿ„�¼å.?ñ.-Ì\¾‡=Ÿù«×—%æåŸ ŠRò´´W³¶L™âæ©RðåÚÍ[¶`£0¦ ÔG “HÃ÷¡éöü¥¼K¾&œÈF·5›Èú˜HÃÓ»�qç-‡9dGë�¸uŠJ(¢æ"2ÃaFÝèËuœ¸�ïW4µ¶ÊÛFxŒ¯9Ï²Ìø®/§=Ѐ�…ñæþ=Gæ9—”çD/tÄ’Gÿ$ ¤!4!!6�Ä�&Á/Òíôœ(ˆ‰Bû*¡$ eÝ»†â`Ÿ™ˆ¤yÁîŽØA��Ÿ#B huö¿å)q\•Äן½•¤gZ9)âÀ Â* ^Âr'eøDR¥Jýº<ÖIOÇçÌ KPh ×Y1"Çv—¿á(+­ºõ¼¦½#˜‹ 'Ô  ¾1ñ·‰‡}1µ¯X7û‹}g3JüÛÊ��*AŸ·m®Ô¦±?ØHü¾_ù®8´(|³‚é·àJ­>áp`Á™îB�À¬ü…¶ì …©×ÈW¾qÛ ­Î•t…](¶xc›Y.3ƒ0j" ìØŽ>úåDIfß9Í”è”Ø5ZÿØ÷ZPŽGµéjãKUk¾›ªpúbÛ–TÞl»¡4ê Â`7¦“MJàÞçjö< E¸€(…²¹ÖßSèsbãØ¤ò4èàØpnöGÓ–=cÈÜ�îOW a:g¥;sd£Ñgò—Õ}�J�½+ªx(î¯5ÓúÜ.*5+& »„òÜ®_åÍÏ.åžlοîØ>V,œâÈ k0~:¢Ú7æoy ¼z¥@Ó–¼—þ]7tµmvØ‹¬©¢ÝÆ­ò!5º rü¹O<ŸÙ¨0þ1fqÇÎBïĹpaqk—�(Â3)qÈÍ´B˜î‘›[.3_w­ƒVÅo@=;§}IÞOÙKY¼¡ ëù|kûòt?>žœF8â�®EÆBÂÞÉ€]Îù~ó‡^ïÌî.�£¸£ÖNŸ~²¹kŽù¯#î§Côʫ؊ïBBÍ/1@�í’""|ï‡}cìw’S¡Áƒƒ?õH„•”�Açå,š6é2>1ø�„`ÅZõœÃN�¾Ý®L§x_­"í:� »£*•X­l»x¼¯¬¥‚htd¡¼0㪜�¹ ÈcÙ­ÛÈ`Êšö~uûÇ»$¿<ÃçY6.�iWÞæ,¯(ìwpø5þ©Ã.DÅ×?yUÙÿcë£Gñ¦ºÃÉáe§âx3SöSå„�€Xe¬)©<;1ùuDc/¥Ã!¶Äñ^ðžux¦øS_sZ$~Ö§\¶m«W#£€Š¶Gr0£L»âôüB¹„ìÚWöãw,eÙÝKÉoÿ×ò~bˆ+Íü[zè5çƒÆWÝà •îϰ­GǶÿ)$q–Lßíev(gXK0ñöK«Ô¬g½Ç¹7�ÜŸUÕÔ{nvY8þŒ Ōܽd?¸›ØÅÆçg1p0Å[¢ÀƒÐâ9Y‹Ò÷4á}3´sA„ ¿}C+ß#©Âh÷m~•lý¹—¸3$9˜Ã潺þéç9ìe<`úz>‹�¶™ßseD¸Ý·†”¹lµt¬‚ŽýF#qþkeYÓîîX§§ûšÍuø0<^q̆±‹Íê:©ï ÇÇœðCê}“C¾0�Abo b:G\{¨�60ª�ŽR ¡¡H”3!1êWf|œµú¹åʃ�k0Úœ…ŒSXTÝ€ýk9mŒAaCë“i¸š;«½Û.V³ƒˆ`ì¸;š9�ÁÑ;¨áà†rc%aÄÓz˜Lˆ•\ÎF…S �&Ëì›k)i_V¿wçß{Ü6vt£‹êYÆ�Qûê@�{:wÇÐU!O h€_Lï,hð}ÓíX;öÌb ZÄæ"Rt\Ób[ëË•”Ÿ{ß™ò|ÅíAK¥1ŠÜ¹B‚¼,[-‹î“‘lظÌ3–ERAnˆh{ýó•C}ÊŒŽ»ÃÎ#À¥§%-í jâÌ‹€4^ȹpAG¯Ìíõµ|æ0ÅYHöštÆ'%ü ð˜"SÉI�Åy ·¹è…ò'áÜË�òHé¹JÕ<ð¤"VuèV?—ˆ1œ<EôÃü¿=�éóÔXf_<ª¢•Á ÆRøÐ½ZÏÑ*Ûø§²ºZ9ãÑÅî’·½Ùp§©ÿλlbÔ#Ä·“@Ê·¬6‰!ŒGvtƵ/&2B2.&3|J ²”µûOCÎcJ`³{48;ƒ¾ù4þðBºw%28G¨(œŸìÍ¯æŠ -.ÁXâ —RVé5sÑæ?o[LÉp)§w Û_%doQC�‚Œ%ðÜK\‡|ÀÇœ{-óâˆå ÁØ/U Ü‚sýºÓ€3ÝÂø@±àäAZƒOšô‡C8ö�Øêp=,V¦(„™AEÔ¨qÿ)¯\ƒ³Ô;_—^d¥Â�„ºk¢p��®Ô]ñ‘Í ‘7 È¥.ű§@DDÔ/¾srU¢ºþå¸Rã¿ÚÅ„ÅZ‹iÖ¤%«‘SÏ Ë½³81¨¿ ÔܼLoO&˜UÙkW3õއz³l%íû0†¼L”úþ¹˜\5zâ|ÿ¡Ý#?ÙBÉùÁ}&$kõ�=2,�pVJ1ø˜gc={ šÂ>) }C_k rÍíqvÌ”‹ !@Ÿ/ÜyxNk öÕ=/pz-ìb6-ô]‹ÎIÛ¤újC¥2KÓÎ9n (…öÌäQỎ ‹án)q/WaÂG<ÉJßÄ?Ä®âçgÏ 2818HÅVŸ-‰"B-1È©41Y´âvEPyâIy»&ƒí‹�Áxp¾ãVêJñ_Í"Jø[×%½Ë\™7’Ýã¼aâŽ÷ÿȹ5«À1Gƒ—|ìÉȲU§@0ƒÐ¶Z„O3G‚&^$ä#]á ®Bãù[MfK�­2Çÿ%J�b*ê¼béãLÆò3J,ÄHL¦AÙÒ6›*8÷s&×è ¼@ž" _‹¥}è›óh•¬‹î?Ò{<5°TUx*Û}v%-z2û¡,D wpK’DR�¸m¿¶õrÀ «²_ªA%^Ê‘2ôV¶Ï¡ZWží+×1ÞYȾÕã}Óiª=ÎphïxºïßpÐMnPVË3<žÙ,*…(ZD�Ú3šé ¡ è’¹ùMw¿Ú(ek•Œ¼~Üj´C¥È0…¨ñL7Nk–b«ð¡TÑÈjözðµ•ÜüƒW£sa®WZ¥ ”l‡e‚5/×e¤õRñá�ÇçÖ°3�LôƆ¶üùÁp �¹ ÂyC¤-û¬zÎ[[¨îVë}åVÇn ã8Ž.íÍú£þ5Q’èØ§B�'m-~v劵ˡ™–IßþBH gýô‚HþÃËÏõïÕv0$GòïÎí|l㮽ߔ|S¶v_YÑ è?¾óý?ÑCŸÙ>s×èí¢I€¾é�þÍ'à¥<îüØÆ~‡*¨Š—=:‹-ù†]%é:].š\Í~àì}:ªï㦞õ¥&�Bc+})6ò9ºº9á1�(Fk‹â·¥a¡•,˜ý¸È=2Ha®$ ÆùD¦44ƒÄ× Ñ‘O?¾zw]½ïFêº"Ír]î�;«r1›Îsµ¹Í)×:¥ÔÛy«©UÛ?M•4‰.iË4šø �€1�ú(d3ð’@t1ßçonÞÜ»y~hu)÷óî4èÆuˆBd lc¾ß0D@Gë‰?ÕN,̘R±ˆ´¬ <Æ% ›kãÚžOÙæuõY‚åÈÒgõãê€Pì4zìR‡õ‚™eg‘t™ú#ª51éæì¤¨ƒx�Ž™ 4/½ïùw#þßãƒì·�Ñ9íª÷÷>ú½©å[A_‹ ù>vòø½#v}kìeëü<$�Î~•èzs¯m%¯æþxÿÀ° ñ¤É:¦¹ÀÝD2ÉOüO¨q(ìZ”]ð,¹±­[„Ûúôcð¥~|ëµ�_GU¹yÔŽÏ—ôÌÜ­Šìdg»�þÂô¿¥“(ƨd6kM5UZÝ ó�½¦Ý·Êr rV»Þãÿ/EBºlê(·…5Ô~(à“`§þ›ŠêVñ’ó¶ã¶û\Õs?Çáz=õ–Ž”¦$ä”Û7>8‘?Õ~¯ê«óO/·?äíÜÐ�ôGD;Š�÷ׯƋpp%ýTkóåpkR6º}E>r' úâk;�Ég‘¾þ�ûo‰ôå4xäì·íàV4ÿˆÃOH†DªGJç o$n�Oíi� :/NâBïž—$Áß2þ×�¾Ðè¾QtWºü¯­"ϲ(î»à(*þ*”¯ü¡l~ ”ÛN·þ[t»++Ø6¤¸¸£JSF Iöÿ½„ÊA&æDýîE+4óm©ÂˆÜ‘«ƒ yd× �xá H¯v§ÇˆH6ÛÚõ²?´HÏ/g›Pþ2 ð\keø%BbºG‰½¶m·æsÁÙm«S.PÉ)¿±‡�’ZïjÈÈ@õ`¶nw fn:ùÎæcÛçÙçðÜׅ̈́aàUØŒX¬=Á³>p­eôgøŽ›A«Y:e�¶œ^áñŽ+Áƪ²T”̢ܽ6¥,Åȵ Ë;'~F‚¢0Ìhx'~"ù“¹…[£ª�[ø$Qÿ#oR ÿ³Á÷àù‚Ü0ǘ}=u}éXñ|êú8û³—ë`·}…h¸ÑØj÷Ï£WÅ&¨F1¦¶ ì;ܪDbýŠv¿˜æ6«°µ}?° ±Ïïn†/Ư²ß�ýÏ“c°š*³%)Ãm´AeëI²Û,I0àÑ!,#1zž¡#¹Üb-Š} ÚÜ?ðñÃ¥¾ëµ8uæâÛyBÞk·À¹äSY~o}½ÉlD~Wà5¿½mÞ¸±’‰ÎH½°cÀ_[ kO~|x¼ +Ìj ·€c³hÚÀ BÓe4k7H+ëŸÙûâïÔÙä@H ø´ö(óŸw·ŠT¤óâTú7ÍåÏ~þ�Þ~Ö⦳Qa°›š›?âGÃ…éI—“vpX˜”ê&+Q-ètðK\+�ŽÎ½‘v#Ô‡òÕ¬í4#Ÿs«Äé_«‚¢, è^YµÍJ¡!·w’7¼ì  ;�üüÖȈO4AWËA¯q©µXYA ëMeájŽóá6ó3^b^Rˆü‹¯{¼ Nâ]Bí`ìõ£ê‚€H„²¨&¶Ïð„pÕ„ÉV“ò¶ñt’³ hIÈ vÕ¾†¡ZH RöPZ£¾øÌ5v„vNf¸ÌP5ÜY޳à¼pLžÐž‚mÓ‘9¾óœ-Äùü…ÆO •k\|Ð÷Uÿè~�ÄMÔÔP6�ã2(£µâÇò~íj±¸\ú÷š-ƒè†7Àdý#jA«TÊ4¡³ñœ1è(Ö7ÃP~þlÀ‡ Ë—êë÷c[ß{ú?'Ìü= óuç<ÃÛ^Bæ¼°hòCàÙÓòÈ îéeðQä}w¸°½>%†;B[RsÁ¶¬É'úµ±Ü[B>÷E¸âž?àOg ê©—Ò-û&{"$#¾iÙ ‘Äé­Éeƒ…Æs|ïö¿.œ¢¸…VnŒV`KYËWUѬ[Äa/…¿}Œˆ³õ?e´w%X7Â9\Ëi~2ÖÏ`·l«Ã²sÖÛà h N¨Ï.;{“/¯îŠs�aÙ·¶º JœÖÝ{‘Ý_Í�–(-Zrªüùàû5¥´¦÷)Ξz»0V†(ÖÔðxLîÝ`¾Ÿxm5 …Þ§ë§Þ~È(Õ†hJÒ`÷�aÉí’ráž´¶ù«M§×O-ºî‚üãé¤çF ˜¯ïwRµ#¶%>§+è.Cõ×5n»Î/=ྵJ­ÕYóŽm¼?3{[•f1`™K$ôYŸ �?²àe›0~ãÅê–™(®$6©�U�ˆ“ïíÂðrÏÎ00H± ßyß*ú—� |à�YÝ9ÓQLa`fè.B•d yÍXÆá”)�‹ÎüáA î[ŸÙÎþ뎕ƒ¹']iÇŸˆ.Ň|ÈZ"3‡‡YŸÃŽPgø� ° 1.A�Ï0øb'@¥Ñ¾F õüÍöóȱa Ë%Î<Ù ëVÝl6wJcã�ëä'�­�³øQªëaûV´1YÉ eL'«É9Y·¸§BõãBC–ý;0ºIŠé�/ðÿ þ�ïСM4Äü‹Ã¦-pN뮞|òòp8‚+I™Ø÷ª.Þ†ðo8s$ÅcE»Ñ±�”¼§jÕg5äˆE'XyÑ*ªâbñ”‚bºF¨û¬äþz?eІÞ|/·Q…‡øþ@ÕŒa_%† ùåû'зàM½¿9zÉ÷¥hü­¼<ÂûÍL¦œÍ-�­8¨|——ãš‘�ÖÉrq<€ùÄÚ§Êj?ZO7�õÖKƒ¡ä=½üŸ‘#ñ1»ú~ù÷]ý\~R¾Ñ/uÂHHþuêb7=éÌ©ïÌûñüuˆÏÚ!Ó:¿~NhÃ3…åîØàG@BKë×É�¿]<þ+¬>-ë[Í÷'â/�\ØzÄ”5K0Gõ¿ØlAÇàóÏO™–]¾€ñã¯#Í÷nãú¾¿ gݰ” ,…_ò®-=óÔh!|5æ”ÚüôŽZýÌ€7ÿ.â�É¢š@ÕCSÔÝ2‰xÑ),:%bHGí›ðR3²+¦í¥Ë»Yz@HCЃLS!¾øqHâêÍïD.hv}5ÿ"+wüÀçy¤Ë„t�îõ,×é£W…´n–” ß|ó† %u±mCÞåp\”CM B‘Î6y& C{ືb´=Îi­2ÕkSk}$Gó­Ã}^˜GÍ#�—{?˜U¼8QÚ²/-5L ­pþ°}…#kΊ¬!ìT‹9¼Æ4öÀÄZ Ù�=Qqíö‡)«õuë‚4æ~fzC…I}`hh@ëù}fm_ŒZ­Öß¹þ*ø¤vÒ·@›ù,ŠýBhß’—¥?°%ÝL{cºGóB)Ñ¥•ßÞðz¼�¡Wú}oBXÚ™°Y‚HdjÅæ»f ïâ�‡Ù†]% •ø,ªÓ“Ì3]‹ÆÈeÚ¿Án z�:£WÝ…Š·×QÏÏlדoš•�íÛoå…V»¹z€HZˆ¨”ly™Öz‰�³ À<•÷dK°¹Z4h�Úþ½ä¤þþ3!Jv¶7„È%×ɱªò>Â6†zD“ˆŒ.°Ñ8Ý D>Ë`hàÈ–¤5‚²“¤­3ÌçÏ­Ê5›[š¸.ÌÞl(Ô{÷æíÛÞ½O’½Mãy–�"!�+Òx+_Ý[ æ}1ã\©ÎÂ…ÎñðĹ£è‚#ë¢�¿º,30káM\Œl—•ª›¹.VéjÖ2hÅ¢_™`<± §Qˆt¬<+ §’<Î"ÐN]à… ÖÄöDà<—sl'1±ëæ4•¦Ktˆ˜ >àøCÂD †6~gеáÏ«äØÌú$¡;¾búÛ>aC)å½#0PÓ•kxç@»¥îͺó;ˆ¼˜(05G€@p‘½‚ÐiLiEúbåâ°~= )öIM°[×HbHŒaßÒ7ñzœFÖ{ ˜K�Ú6�uߊ8ÁkÜŽRÑeÇrÀüNM;íÔO…qH}yÂb-VÀgSCœ…渢fÜЖawÖBÜŠŽê-IÞßVœÜ fØ&-µ ˜ÙSm ð9ÓÑŠ¿§ » !#y éé.Gáø=îx€UÅg�:\诡 ®…¡”j£o•‹rvÇ/½+ ³ãÆ~·Û#(ãbEûðǧr½g|[øšòü8ƒ(Ø�ÐÄmåMxÃ)áiø€C§¬±É›Úœl…Í{¥þÓA÷ÏŠ˜_ÊÈSkïÜÆÄ… Ð Š<…‘ÑQf¶‰O(ºÇ.Õ”;X/#°¶–‚»”ja‡‡Ä£J“ªøÝˆ9 XÚãZdúŠøãó'YOxÀ#tÐåí“ñQƒIãvDú×dÄ–s´86{=FÙ #,¹ÑЏ Eá¥øeG75** }pš;ŽÌ8¹sÈy³™tKæâ-˜¹!a›®5ç8kŠ…Ù� Ve›f¾L@¿Fø+/k(݉‚G3Ñ<“~ç>caúŒ†ûŒ·7ZXU’œÊKœÚªZÇR• {ÎDÓNRº8+pPg¿ò:°m^p:jk^Ÿd²7ï¨Äxñæ�¸f‚ÇcËÝ¿%®e‡…{À‚Y&L“Œ£ßœ¦IŒ¥f87v­Ã‰6 ˆ 4¼›>ÔagF¡ËW=È…\T•ÕüvÅž¿ ¢Æj�ðjqpÅq¼]°H®}ÈÔ†µÊÁC†ÅfÂJ˾2¡�ß™òÃ0½Ïo¡@ ²SoŒ¬ Yºßác¹ó²ù˜2§]uà@^̃ZÃè?÷ÃDäk$Ê®P¿<3ayR»ÉkPFÚ¬8"/†¹õc¶Úêi¸èAä`ü/D¢gòêÝFŽ+‡/.w°îµos>ß«‹ø“’ð=å4²z¯Ã•ÎE–‡ Ý9Âõä‘“ûÞª»•r••Ñ™‚u·ïÝP€{×™¶·#ÂÙç ÒoÙ7䃰±~” ½z¶]Mó6³ïÌÚ/‡³P¿'pE7: •¯Z¸¾Œ"‚ÞOÛÙЭàGOrˆaëF9#找ë÷0DüØ Šìÿ�pñòÂ.ÆC … ö~¬ Æ;ìݺÁ æë™Åß~,NÍÖ(!¶µz}Q*ì´§•»ë°Ê³±­¾¯PN³Rº¾çYDÞ1Ëò{ÞWö¹q™¸&]‡—¢FÒCd÷Y µžÉQÍT“QVJ¨¡î]qÊÞžF kq�…˜KÔëêFÎb¿Áÿ–± þc¾œÙþ†'Sy`¼]?³änÇù&Ãd�lâ�çà8圂€ïŽÿ�9D3©µÛ6@;3ŠzQüVп0µ›»è vb.ƒôhhdbÄ›rÉa‚sçúdbÇk-²~ ç¿tj@Ðuag(¼+c^G‹¾„ì"‹çô%Vf¨(.Ÿ È墯tËi–@.@å ‰þ ûxy(¾¤à)ÀSXw„&áPs˜Ì¨ô@]¤�ÎØ‚Ò��¡£�KÀ“ޏÛÙ¥¿Ó�e •j-Kè’�0Èá{‰^Z½(«Îù†¹`”µg„É¡ø÷" p(È÷XuDÜ®†ž�Òï$‚�zݰǤVóa‡ž5­{ÁÛ¸«ß£ gÅiŸ{®0 �ÚFlèÄ@ê�N(â‡R¯ñ�z£¦uèö°¿J Ç<Á¢,Îy­íjïy­|à–¶DUdKìüpÛq͸uÓcZÍhô�äùuüÞâZK¿²¾äâ´ÿdµW3TöŸ|ææòãÑõt×÷ô蟢”WÁ½Z�Žb®dÌ1hkX�ÛS4R|0�l¶þ5‡êV„ 99æŠ-½ î)•EÜ*�…å‚dÆ4š�ÂÎjS8SÐrJÂm'#xUxáGe¼aPãÒŒBeÁ 4‚Ã' mž3GoõȹÁ,µôÑ„õÁv»œÔðbãv°yÒÇ�N«bsªá4!+)KµXj\‘õÕü½]õ¼áWÛp|áÛ#r )p÷€Úðê¦ðàÏÀ=ù¯øÿc'@÷í»»GÞÐB(«(dêù¶î Ý«©}ßmÌ2øÉÓ¨0Ë£KtØLp“èÖÖ“””˜/äß®—¥{�§ö„ô‡ìjÇÇRMe¼Ú-zä 0?Ê:m8~òœ@Ü�ªÑ��Y½Æ7"'Ðߺûâ¤mŽCßGÊFþ‹ w3X„•\I¼~�¿¢ùÝËÓëd\SUÄnîâÏ"¯Â™ËÃ,?ä‚ãç8AþtÌþ‚‡I ì"m»•£Fí”4ç´ ?»‡´×XT¯Ÿ1èJ}úê.7ÓŽ=Þ±ƒÝ»Ì}Ù|1[É<‚i9!è)N¢iDüC¡eÚâëëÈ·Â<ÚíÁàÌŠAw–Àðd<Üe ë5”†0·ÈòÃ�л”�Úèq§K0î]…°r—Ɖ�WÖ–�h`Ö V°VøŒu–àMýôeÜ®xõw»tgÖø_kîC‘ƒÈ'ûqáyØ¢¾?�£³>éu®óZ,ö`•¿0v{y{‹ÃU¢jWØÉ¡îcàA¨ðÕÀ¨eŒã ‚­ó•€óY²­Ñƒ²˜ –ó*=~qèµÃê/ä�òÕOAv,?¿Ÿ�/±8)ß Â`ÆÈü_¤2)ŒÉ‹‡ 5…Düƒ1’ëëbÛgb²ÎA½OÀ.àb‹÷Íç`g^é[nn—\mç…{¶QìËæ80úΜž¤í´)§9·¤&`aóýŠc˜º4Z ÷_=¬ehµ³½¶T~ÇBþò.X;JAò”�¯GÒñÜ Ñ;�ÈF|S‹VL'µb›ÀÖùÚÃCpîò¤*·Ê¸ÒxÀ\[1l²‘..v°C¡~ä‹ç€µšEÏÄ1rÄ_®µ)}¹rÙÞ5­'±»u¾ÆØà‰æÄKÀˆˆNFÛãV{ùºkº§Jì¨Ì]“ƒwrð'ÆcO‹§Šl}ç‰bÖ<ókC élº¥)ZÈœŽG ²[Ϧ@n ánÇq—ÀñËï�ZÓÝ¿Wù Þtð½¾?ÌkÃîË,pޱþLä6¿õ`#l¶ ó8Úüp9�(a× ŒÎÏ#³�ÔÛ?ED�y�AýkùŠ ýïçÆê%7ªÁÅS#чøñ�6ÿ°œ³d0Ôà¿ÍöQ`·\ÞYÈ.0˜$Tü¶V÷ä¦Q¨Ö˜Z0f_‹ËƒGõóÿ�Ñ>¢‡DÛ~*#Ë>jF»ÅgmۼƒŠ(„h'ãìf&§9§€ˆ;®àÁÈäL]æÊ¼�9½\è…‹4z�AŒÔ@�°Ôxþ‘õ±¯ exϦ²ßç u*ß�H3Ž/À}öÿ(…ƒ³Ι8rZ_û„Ü[9”¡”êFæË]r©jæøßNi1¸Ïƒ<½� göØ ¡ÅïWl Þ6k –€©�*TyVœ&Šô@Á[BµÅwZó®{狊]ˆ˜&nhä6í›ôà¹X‰)sæ©èæsã–yÒýåwa4ûÒ ½ä܃q² ÛK±�6·B7½clñk¡ ¾ú1‹töÆÏç|�÷†GFxAsKゆ€º¿tf45g°.�OFÀ" à_Ûˆ}uTK¦Ý’DwÁÓq¸íʾ꫌ò1³§FÍ÷ïš›Œ�}ù5퇷žÐZú«­ Ý3¸H!�$“Ÿ4ª6ê¾n�P,Ž7è`Ñßq¾Å„?¨µè6Ö}ö½Ž êÈñ‘³�¢¼SôppMSÜ7À=òU©?\(!ß|Ý­ ´@y ÀF0¤:zJ%ż†«Á÷H2Š„¤÷²žµ}QøU³ÉF�DÝçÁ%ºÖl(ò[Õ)™™-iüœÂ_].�¢´ÐÆ0½Õ0E î’¨G˜f©ß? ê$kÝ#f–ý][…i2StØB"°°ÝÂZ6/|íÎk¡3�—ÂL{y䥴Šeü‹�Fz�òþVÃ{ ÓJyï¨.OIѵI™Ü8¼‚ì{ÒÂ2Xþ�ËwÌ +϶ßG 9îŸ[Çl57<8œ %ì3mtöBøéPwœ$ãtåõ,AŠº‡Š"fd;…3.ö3íüÀËÑ…¹WVà ¸g–ÏÜ÷åÑõ–}ƾ5=bÛWD}$×`ümÁW?”[Aåö~Ÿ¿Åt[ËðuDaý<2<¹ñ«[k²,îŠ�MfòJZ`AßÃÙ‘Ϲ,Öpì‘ñH ü‚Mé‹¡+ÿ»¿N³©�éùms+1žÙ ZÊ›o_m6e«$[wå�AË»¾xÍr”‘F(&q†•ÇM ºQšr?<³w:@.. ·“¼žÜ�<µ'7ææ´™ßvõÊ�gÞ ðW´ºÙÿò½}Âñ„êû¯í¼Ý… “,¾¹äÚ¯7µ>¬LXph‘�šÐ¿/ 0 Õ”î_,0Èwß«ørþÐãÜu1¡¨Í a¶«°Ú÷;¹� á3oõƒ…=`ȇC´­†‡xssáE&�Xlrèû>�`<èIŸ¼ŽN0bÂÙÑäè}±7b÷ö½ð8 ^ïï¤7š_vîã�˜ÂçÌ¿ÏÝ(b¯¯ŸÂÚûB8â‡~ RsZ›Œ»£q•ó¯`ÂCS3 ÞÍ#'œe–“” ·4Ò“:ô»ÈÂ^ë04ç2é�ùçÞlï¹àÜö½tܧ�Õå4_)ubõk÷5ã¾ÍŸ³i/uéaâ³â¯6Í­„N>=¾"úÐÐsÀ /ï�""üËxIBh¸!OVÕŠÀÙÇjÆí[k-g»åÈ L˜áé¢5uºÀ}2>¨ËöãÇòëËŽ�"°.lÛÎø¸|½ÙÊwÚ-H�+ ÷McÝkÎM°·7;ym[!·ùR¶V±W2N8.ò\~àqƒùÝk‘ \J®Ë¶L Æú£$EÐcGHcA')fÄÞëoP&4®W‹s`ÿ[åkÞÂéæ.ìÙ°÷¶aÈ´âK1vÐ{-Ÿ`ÓáÛÞsm¬7 @¨ZB­htîÝE†&ö�u–‚‹†|û—½ jÞì)~-÷æÅªÞR‰÷>³5� ¸|Œ8‚åTç�ÓW�q5OûvÓ^÷žÙò#ÿ¾9^?/l–¼‘²¿/±-I›ÂVe Ö ·æ—F’yl‚¨CÖñ Õ½â$*óµ�¼ä©Q ”æÇ…$C7óè¶EGš‹ÕõdÐÕüA¡$°ÞÞ1k¾ÑR‚�`í®uÈ!mUñ½mvôÔ«I1¨j„lÞÐæÒq âSÉÉŸ|ƒ¡[àzè·ó±¾¹£á˜¨GÖÍ÷«¯¨ 58VaNu(Ÿ?–+–ÄsD•þÛô[þ}ÏòÖ"´…¤õ}rú¼]_òô7„Ë8®ÿ¼;/‰«‰d3®=Ùeß­$…ÁzüMÝ}5¨\0Õ‚"™óƈñ_ÔÑÖOOØ C[Õ¶<æ6Åb¸`¤ì6 IG¼ÅîfK1¥¤À/¸ÛÜt8«gí ó±³±¡Z†^iE©á ]a`6³„î\i`k™ b™~rÔ˜Ñq †1çs»—V1ó šÎâ¼ÁSå¼ú–’·þ¡9 Ud5†8.RøËzA€ñ¡Eà;Ÿßû¸ô{õ5€Á¾SZüqˆ¿0Àf·ü H×¾å«ÌOj^u¯åÁw°×�úÊæ[矘k©n¶hûJiîq§á‘�$t?¡ÊÙ¯²’Q´5‚›Á0œ¥÷Äk¢oƒÜ[IÕÀ@n¢‹­�ï÷™Ùï±§æþqÏ4‚²Í÷݌§•’ ¹›ŠIä*ÿk:«ÛVq°¼T×Q«ØgƒšnZ~ïÖÁsº»©f|>±†ŒÀp.‰–; åF)ùIx‹›xŠ«B2„ÇhÅ{¼{Ü‹Îöü^uV›Ï65Å–ÖÈq÷Ϊ*ŸžIžÐéãïÐ�ìÒL}p†Èø^ÅŠúá}Ú�K‹•¡l•�Œ¼8£¥¯¼ÄŒ�Ûë.-'ÄOFaœÃèÇš'`»æèp¡wåΊîügÅñÔuþï‹™$uÖ¾%Cxâ3[Îh®.TõÑéQ&ò=<øê;¿twØÚ¡èŸ74[· _5VØn€s r?:yh °�¯�%ÑÒ¢Aˆ{±]!?=™ó‰"ÃÇÆÏ*‘éòô£O¬¡7w02™~—h(¥ì°å �Ú”"&â {*p3PÄSV¶Š7&Å¶È jcþ»uÈG—KòÔr µoqÕN {žX 92€ä1ZpöŒ0®?V{»ëæÖÊ$ìÂÄU:ªÑöTƒ™‚·�7ô �—¸<ðòóïm …òooþ2_zV…~¦ñoHÄl¶T©d¯›ÑŸ~ä']‚_÷â-v�xÖ‚ 7”÷­fWwÔø� Áo«-l¨…Šü§r¶jrŒeé8C¥½–ú8/Šo‡'J়¬ƒøñ`°ìS-f¡_Dp”'ÿ©‹X0álšÕâ,0…$Åeàdݬ¶{˜¹ºßBü»øåU¡Ñ�6o}ƒ]Š­ä }«zŽ6 *‰¸ÅHÕ¯ÇÂaþîL¤gv”BÞˆý€Ó€žÒF(•;=B‡ËVª��oíëƒÛñs³Ç¯ugYúo1ÓŠ2ÍðRø‰Íô-ˆÑVûj7½N;´-[Z0,„1¡«Ø9lÙ³ÄA³ ¯­4ëƒ|!� GZNUë)¸X+.…Ö¨9XM‹\O'‰Aþ×½.úw!¾¾z\žÞôGžz¢ËvAç(`ùa’Z…Ù©[žîò;s)�xÓØvµ¹ì2ßR!%ö=±�ÿ€5U’QôÒm•‡ü¹[­ÒsÀ£[í¸Å/¿zò¿¢½Db³œ‘^°)ZkyÌ—–…bqÒºF^¼‘‘Uüà;´_§r›>�.–u3‰ áPgvÈ'²,²©–Vô`x( Ÿ ­^pd†5~ºwÚÜ,®¹€‚É¥ÀrË8Ž ÷ZOèõ¸Å[f¹5îX�¾Ã�[òún^í#xºL¨vë‹L[jgCJ·l¡ÇüýèýŸ®³EÌ<� Ch?h“?Ìíüòù’ˆºò�K]:ž|}òµÿ×/gWž ™°i´ýF µo¢§o‰; !4ƒ§m Q§ýÇx¢ öæþîýºýÑ¥²+M]ê.kQBÐØØeÔ>~ §öžpéj�þ1áDÀ˜Õ{èÛdج Oo›^½èDxTÅkêtÐ0àDý~iïv¾'–œ¿3ü´Ûyw~ÿH#BKÃÞw”-¤ ý¸³™{*,T –NA¥êÐ5ë{–XçA8¿0\ó%HúÎq¨–�úœÿ™mqBö2×»ð›'ë" E�s×È‚?áœqsìöEj�O»å�~q‘à"$þWÝñTˆ¦ÃúÂÃРß™=!o÷¸íß"ÆDþ¢mP\[|ÓxW@ÝÊý^ Vï/ò‹y°ùa•“_.s[äwõá› ¡�»î£2“>Tbd9PÒó´¸Ó<<åp—ß<ŒE¢óRQ±³<#gWÖù¼XÁA=9KTT¥5õ… ŒknH–�;iŽ�ã;`¨…3ß”´ák#Ë�}Fð¦z7ããøiǾc6Æ4x b€,|Š\ M@�Ö,¢ê—ùâDì´5í/Jåª5]>ÎØÁÁj(.IÑ9rÈZ/žœy“Jèvñc>´«ç—Øõá̘\ó½ ‹‘ì¥"¯¹n"žæÌªGÎ{…lŽéuhp“ jpÂ÷ _�fråÙŠ©s–v!=È÷ÐI®©{áz´g\>�¾_l·ð�>Ï<áh¾}d½u¹üvEœý)`O´vR"Ç®mÿÑ FW ¡:8ËÝM]þúyDyÿïû-YY¥ÝÈêý¸åJ>Ñ›îËfA5#¾T‡³£Rö¸WºØ0ý„"·â?¨‰¸VO�{×ïÒú½!v¥?¤~Ø B�@‚š¶ÄtzöÇ‹Òò•¼9k•—s^½²¤ˆ”ìÜe¢´y†ÆÒÿƒÄ–y\ð¬Cðâ¯:¸ßÆÊ¡?x 1~ðKOV¾¬ÏÕC�ѽÝ_6�wÝý+®%�½Õx[ó^\Š÷íižF�AJðx�„ŠTX'1Ì0ž Y|¥Xî1hwAÏ<òêùΦúró(c#‰¯‰ëŠ¢kì«æL·nœ/^š7<âc™Ð½÷Nwîï+ÅË)•ÈBab×ÿ/Ö�FŠ·ã³+~., ‰TÒä±*LXÏîÚïó.”¦}CäG,ÿÍ㥱½{®?©äL,tiù¸ï³ŒØùò�M|�Û\¬iCù‘î<δ‹÷}ÔGÎ�Do^VŠ8OéL*h½è ¥M¢|%�)¤\$ëþéS宸ÐóìÁí³PæŒZn–ÎcÉôE!Æ#H@í9ÀXÇ M¥TQ@*Îd½ÿúÆ1A‚@è+¶h­]²irC‚À2_ÝŽ[ðHº±²�ÃP ðöÝîØ½ªK-ü¢GðòAŸPäÆC,õvp4Ch5ºDBµŽß€Œb -ËY‹›¯œõiœL’ ‰¾ïÌ×=Aï‚{Œûl«�å—#¸v=õ¤5°ò£&(®Ã!gË»ßQÁÂÜAéymòjú4ÀzœM¨� ˆ¤Zc•Þ 2¡0”"¸›I`km!�‘‹Ÿ°P>T(mÉéKÜüœiŒÜfZ�Ÿ:˜Ó¬¯C2käÑ[P ã÷Ž7Ðý¹ùv~Sœ´ø'q™ºäfÝ^™»úT\":ë.l1�;þ­èÖº�$Äσ۽=ÑD�Z†±Y�7ºuH¦fo%œ¯oºáö<}¨A�^¢‹Ð�° F�e=»ˆñÄŒusî¢äÒüÇ$Ÿcw^3�WS‘¡aÉ�•Õîóƒ]ó6dÚÒ"0z¤›¹ägA ”­¶¨ñýmzZÖ‹£¸1Å¢ñU©Ó¼ADcÖõt�e-*äÔˆ²À‚Ø‚ä˜Åà‡†1ÊÌ Ç¢Û‰OYK¼›žé ¦¡šoÝ»–;8ÔÛ{šHÉ?éýkMz=CJÆø¾í¼w*úD‘PÂ?ä@_5æä¬¢àÁBGQ¶$ó‹�p7÷ÆŠúv (‘eÕYFîYw�Uf5T÷¾g<Ar%5.§ƒ&í�Geœî׃¯Ô™!Åb[¸4×nˆUF/‡e~ƒ^S¿1ÛÕë(ŠõxàX� ƒ(sT¸¬®.pïGd9ªÄª™à^wÁ{ÌdÅì熻�5ß;t�*“4­[L—®k\‹6 ‘ö²êÎÆ—ÖVd�7òr&#™Äsú."ã ‘R3‡K¡£1Æ\ÙP�¯C f"æñ)1wWVI:3È4Î1CL�ºaTó’¹kÑ鮂8»ºaRø‚=T“bñx\QÓ¾ó,ç–º;’¤$ÓÞi6s,puŒÄ-$áÑé¶�n�¡ÝI·w˜ÃJ;&’c,.©,¦mœ [›ÞjR� hË<ý­kÖ²]éjºï§ïoƒã“Ô’ýL½]ª&J.�[×ì¬÷’ÓѦ¥¯¦éµ ±ƒ'ÏÚ¾¨{¨!˜ªÝÇÁãÿµÔ˜P"—GÊýo. ì=Z,š?~ÓAs]b>ch~¤þï ]Ç€¡çñÜö¿«eŽvð’@vçÒWAd�|£âÑʜϟyf(‰e5¥°Dü˜(Œ v_ã©÷ž…£à·ŸçOæ[­>;Ã*0†‰Š!?õ—þ3´¢«Ï�wÜÝPäëÐ$ ãÿçë­¢â’{ï¸Õü±eÝ™ì[¤¾=rÓ«xôÞÿ÷ö§�žäÂÊ  UfI8Üͨ¢½uœs¥ÁÛ~¹—µá¾ö?‡µ ï*é8çüÀÑoãŸQXÖωç»È¬’JäfQlF/ñÍB¼×ËXê&ÅËgCØ Bþk­å<;*ëq2v³ÅîZˆs$ ’Ù}ùµÑŸþµgó„ʸèÙÎäNŽçV}’ÞûÊÅë~o:O`e ¨04Ê‘_qïg*‰¦˜¤Ãƒ¿¡ƒ©þ›akϵ‘Su¸ÍY²RÍ�˜a ǬŒÝ¯ä:~lÆ{¾�ÀŸ¹á4²ˆ�¯xY$ëaÞU1,̃�EÃôrâ2GrõuãŒöâw� ÍëŠ.9Awå³nß“s� €ªs~°}8Ö:“Èz5é€V³.ͽ7¶Ù VÞo³êR°xç„’t_éÚðý>Ñ�÷bê(ƽ·*­ë3´÷8œô´óò†Ã” ŸÜMZ¥úaq°r\Sp¥žã6®–Vã¹¼k‹±Î‹–[ÂwE9Äëi°éü””�2Û³]üžþü÷i[Ÿyˆ•N´&Ú©+4‰Šµœzå"Xy¬N}‹îê‹Ï‹MŒ¨Oý%onjԥ§×~Þ|÷ˆíâþm‘R*4 L�àõvñ—î»Q�Õ¤ ��v·[3½Ÿ t  !…h¸r3ÍÞH¾�mÂ�ÞðŽ�ŽB.ãi–#LUoc\׬i»À±ÙÌ~H›‡Á�]þKU=ݧ9Q‚òÅ~q8×¹[CZD˜™×kÄ›°ÈÙ'_àiþ*·WYç.-¶…<ë˜�^"%""�¯¹>ÌóCÜ…�þnø&0>GšûìÕR;ø8(ì/ ýýÖ„}åílÝ$˘Rè'ag—ã]rÃ×sãëvÇDrO¾Î»+´øëf�ó¾÷ÚÅÏ(5t 'ƒ»ƒn‡Ð2N Æ Öðk|‚·ª°^Õ†ŠËåÓḺ1E'ŽBÅúöwœúÁy­ùZv6'j‰�Ñ7ã«SK¹î@‹ô1O«Ó¼½‡j-C½)Uë‚E¸@·Âæ¶5« ²šÈœÐFnпæ 6�7ºZ኷qDk}š”lvëaX}�ZéÊ,QäÀ5´w” õD˜„Emá._Ô¸ ¸v¯ ζa¿Ë ‡ØsøtðŒ»2RCóF0Uˆwj“-Ÿ LïUáÌ�.ÈäÔóS"³P– goÛ ˜ñ‡2Òùd�u÷úe–ÎSߣÙðûz›íK»hôÓ³ÙŽ\Q€þùÅ-åØ�À×[z2âï¹”õ.Æ%�–ö í°¯<<Ô÷ÈÙ_oÜæõÌÄÏ›9ìå8'w¼)];™j¶.uÛïuÑÖuó±ÓÆÎ.Œ^>),–Vä=ÖÇ x,‰·ÇÁ•ô.Õº{7Žbêh­ÀeäH��\µà’TÝ¡vDVÏ[txÄ�|Káó" îš!ÞköP÷­®øÛéƒÑÞûq’çWfXF"6Æ�J²éÁ<È>³É¯4¯Ñ•�ÜøwéÿâÞç!�CØzZÓ_§R«,o¯)Suæ³q)÷l“{¨øîGéãœéß„¡µçS}Ióï ÅBð¨º×ä÷—iDå¯Oc ‡ëx.Eök g¹F„ÝøìóVøu¬Ó^¡Ó߯î`΃[yòþÚBX˜×'+}PÂeöÿtvÑ3Z\ìçÕ5 ޱ½ñ8P¹caÀƒ�˜Œh¦WyeÚ´^v•³î¡9Ý'×8Ãø~Ï·ãl}ù†°–ü¸ìäÁd~oJ“!|ç¿êŸ^öééá3€Ò#ÑÏ~àÓñ¿LÏç3‚a–+“]Œ¤³´NîWøñ£ ~Ú•u¡(ßÞ]"Q…À‰ÉúÿnÜ!ŒŽ¾í ó®qƒ;õXÌÛ ›A×§‚ÊÚ~? ô ¡¨u¬9匹~�ŒýöÍ­–¿Á·x[[m©?“bë_qÛùlñá»ïë®g.jªC…Ÿ 7®·æ\óÀß—ÅÀ½ˆ@ÉäáÕ¦¢Ñeücó^qàXÌ_Ë Y¿Ãk«zþïlÒÛ—#^�5åy�æÑÊ^hûÕ‘GÄdk ²ZÔÁšÁ˜=™(EÃ8³§B¢‚ZÎÓ*ÐNßÂüæ5ëëc„4ýŽ!6ÖÀB˜½¸ÙŒzf7ÎT)ÊW"»„ZÓ²åtBæ8?ζ À‹4ËûŸÜ8¹Î/!Ã�æÍßÅå]âbPtºÎRXm¡n¯vä­ý« Ê“©>†óÌ¥\Ø¿Èͯ°fÆßG k¼£¶7Û­uÊØ-õ„©ß^®' É(a'V# Ô�R !¸pô·3ZÚ®frÌEl•mb„#4—: ˜¡P”t”‹1Ý7ƒï«Ý+<ÆŠý œµ»öý{fÑrNlÊk¯ÍÚx¹d[žñ1ËéÍñ±\»é™éÛNý»¬‘Q¦ÐK»;ÇG¶áäjsÈÈ'þz@ÔDröüyÖÙÙ«£–k6iœõÒé`=ûéoïsؽàë$W#ú \êSÒ~½(Iû´I±1ÎF—éªyÑù¿Kk?¦E+85öúû˜ëUÞ™k¿÷Kê£}`éCèô;5þótPDÚ&¯cÎõL±à9jT§ 2Ä¥nΈ`\kàédÚr`dRH›RÔµàhZy¾¨3Än³‚ˆj‘îgc_pC a TW”)˜ØŒŠ©@>=¾¿ÕöO9=1Àý'g?â}XK[„ÌÃB#`ó£’,Ùˆ}óÆgô£Í_õÐÿ‡;áé5Msc“ÉêiÕú†øÿKÂ\o¹¡ì¶5å:>dH-3î$4±Ë ¦õ·½#7`‚j¹$%¸¦Kʶ?ïâfËI&¥+~Ì)¼.ÒtK³TÞI;Ìœܯæ×O,#%:_ÀÜ3JNDò«·ÁOPÜé1»ÅçÂ�•~kdâd”ô\ÓßS/QXáÖöÑžùY¼�”†×#›“£‚,š½Í|g\“[¾°R„ ÓBn�ôºlìå°z%jqWT�gÈe u½+NI#u—Ó¯(^®øKù v2“RëUóN5›¤Pßüá0Ï™r˜¬–øZ©<`°¼%¹%~{è«D!só¯�%áBIy�ç¹ÌŽ™–Œ¶¦*SÙ²ÜÓÌNä%.³,éLeGj’lËðŽzY'VH8U¾YÅr‘¦ÔI x‚¬áöwÅ_<¼\T€f:mÞg±|.±œ$å_«­5ܴؕw÷9 (šKùå`Ö”’wJj­ÉªÍFiÍ!ïd[æúíU?4„ÃCA·�[lá+AN” wÂ]®£ØÄ|�0Øÿ{ïÐô¡:z é ^µURôB�¿�9-·u¿F0Q™ c30Š¡­3 â!ý} üáÞÏ\“é¡~ð˜@}³¶FÒ¡7øãgÔ[žÊÞ qÏÒ¿�9ÄL_5Ý!Wð鎞ϻ¯Ä~`›Í %ôïj¬m4×OOÏï=¾‘wnˇ�#+/Î9 ÀËÀSþ+„ލ‹÷¨=qYüX/6;øÁ^žö°Í®Zµ„�65Ë©_ó€2p�}ƒØ1ÏœcÃÔÑ‹­ÖÒ£´‚1ºà=øÌÎ)0"›yo9ÚßÊÝb±î÷DD Ÿ‰£þ§øhõ�Q™ðTcØl ;nÓ˜¾HÕñ¬,O|”Ñd»û¢"‘çF²m…D-’¡€[œ¸A–ØN9/`>œè(²Û@î&Ò¼—W‰!M£j3kHåFj*!¢8ÛŽ—&�ö©ªÇå©¶,'+¾½÷_Fîá¿?v"¦ŒÙiò«œ×¦/vÙÛ §P ‹]å·³_!äÓûWHa‹‹[(g¢µƒXîOóXÏ%0vå½ÊGÚ$½õu.þ6lº¬DUòe•ª_ØÜgƒÔ s;z¥®`ãð€ðf@uîÈü&| L‹›Ù$%ZÚº��ÕXígwÝE•Dƒ´Ø6�ÝlxC̆Lb‰Xì~ª"ɃÇh¢Nm•`™ÐÊ÷ ä˜IÚl“~¸½úv'z¥„4V¿5>ß èzÑ¿o-.n],Õóå6V¢Iµhˆ[ë­UÞQ!pº^Â7›ˆÖöµŽ2Ÿ™½3Ws�üÿ�{eÔSˆc@ñi’ Œò `á�Ãx8]­5l$¹UÉ;¡ÛDÍñÀªžÿg:¿ýì÷‡µ�ž–õþh³nÝ‹«ÀÜ•|sºÄibh‹^r¼Ùy[P˜nÊlÆ«d\¢M�`ð§Îõ«&@ÄÓï…7àÜë'D¾b‚—ívô£ìjuÞŒ<Í„„òºx>0½F¸WH8P™^�[½ ìŽÖ=½×~@ËWîýÎ@0»¿ů˼Õhè5¬ÛŠ‚k�ÿ�Jo_êuŽ­ã†“Å/ÏFôMFi(Á&«ÔX1Ð2³œb¾¾›.cT^í©—¡aI ˆåßJß²»T̒ѽ$+{ç¨w<^„ù’{[κO6<[ª¥Ðìw=T‘aöáK0c3š6A³©P@OºÀF KÙÆ¦ïmª­fblÖV€‘—$8Ðê8J×¶Ë] 97™7Gˆ=Q¬äõÁ‚MÍRíû%8*üT?,ÈÆ|kÍó^™XÁ­lQ BzUÄò†ŠXd¯]s9¦ÍÀγI áMà‚çc×BC^®ïNþ¦®ºWóÖ¿¼³tÔçÝj}?�eá½$ýLdÃëkóò?ù®}˜[6Ìs~CàßN|I__8Ö®,÷^ƒþ^= Öoâ¶|à Yžg8Òåî€ä}›Û#™÷ÜŸ�ù|`…“Æt6Œ›˹ܑû²ä SÃ,Œ‘¸»¢Âú˜Çµj]cÜâú…!›™y…Î"iowÚQûæœÏb ‰‰³>ëë²Nâ{ê!,ÆM4ûO<êÑN«F͆9)“uAyl•ºûýŸÖôÌg÷~ó—(bvÊ1±|B âôÃÜÞLIþó¼zôzõ/f%gv�Fˆ8!R¤(–³Ô¡VÙ¶V•·~(SœÅÎ�c^Ok�ê12H1%?H?bhß�ü¹AnÃS¡âª­ksí _b‡¿Uë¤ãÊ™ Bé2mÍ€‰Å3ˆÎðâË4ˆï¥Æ=¦…瞺ÈÐ!kk¨'o�J+pBß\gr¹”¼èàg%ŠI˜8;ˆyñ¯�Yx¹0=–A²¬O !p¹±�£þÍsÌ<��6‘ô¯Ð¥kÏ©•)é ®u’í±¸¶‰HHL¸¤ðÔ1ŽÝ̘ܤu‚ÛÇY‘ÞŶ)º¥ª"�>JÉ®(†²Ù��ŽT^-Õæ°vë�ilfÅ+äªîÄZìƒ8`™&ìj OrüÂHÖ¯Ïö1Îb0©u ÛÇÎ2ã~s¹ÍfáŸ¶ÝøßW©¦Ñ”ŽSZã�õ°«·½þíýÈ/Du[Ý­ðÛ ÷ûŽqùãÜo/%¤Ùz£ó…l·;�SùªgïL@Í“û syUZ׿.1ýûV{w¹]8wµœÇ�>vš—Ÿ}tpblˆI) ŠcCWÃ…xÈ¡iÉ«kX­3ù}FSü9÷¢­±JÙ_×&²]ð¤‡ã1Å÷xŸŸ’ZËu ¦X |W~ú®M’±Q6!’‹è8îÔÎ+Š9ö£‹RÙøHkuîü�%÷ÅNN¼RvT£%Ö6›àuòÆ"ó¥¶9ð MlwW]ˆùÂZùï½C½Æ©swäXbþ‡­4Ñ9°@},'6·Ôqq7…öáÈ;,„Œ Î®¦/BMå¿…¾°¡÷#_}|ëÆ™Så2™Ê)‹oŠÄ¶KÕ(‚œ º…Ï£)E|§¹Z…ŰÜYe†›*Wb+�VÄq}áÏmÔVýŒ,·p�°@bî1ƒ@ÀÄYŒ.sÊ?`@­lxÍZ!ŸX(-k�±ƒd>CbÞ°eþjÎŽ/JÔ ¼ÈÇ„3Ìíҗͼ\nã1âЀÖüýgðøpTÖ�;C:¿±ÔºmÇ×Í•�€í+÷«ró-Qfï‡ogH¹3);8fyé}•û"|+S­“¹¬{·�“†À >ØCV’cXC­âµŽ�®ÛCáÚ+Æ£{^5©Íé–Öæ/ iX»Ét``&Ð}ñØx·:—¾îZÀp’Gª`üÆ0"qÜûØÔíIîCâ+LâÏ051±î—1IÉ›o;ßsmœ€Üõók| ×%®‡Š<àÄc¯É1¯{ò n„Õ\*lÈ‹Ã3-¿fímZ"‚ýóoØRî°¶Õ¼¶ô�8¡"ˆ/÷Ÿ/aJfè¶áÍÜQzÕ;3çÝËGøl�9Ê»’·¨ç $XþüûšAöÓŠP˜ãÑš€R5ºmîyZ¾®xÅÿèýx2!›ïã_Ô‚^É{1‡Ÿ.|ØC¸¼qƒÒÌk÷š°ð„ÚapÁÜi®–æWìgm‚µÃ°L/.ƒ\�‰p<Ÿ]ˆAöË� d‡5ó„K¨¿-8QÝ`…)sÅ�_k{]íWГ€ÇóªÞ *@[õnH¥“Ì*Á<ÞøÙ"¢¶ÈG ÷ej…µŸ,펗Àã! ÉseQÄP%ã-ú�hSÂpsrCƒEœì•dˆwœqilüø-F­H€“h¤ˆSã“â€mèáUݘ(·bCÍ÷¼×úµz›ÈuóùüM¢=GFI�qã¼²1#Ǥ—w\ìÐM3g S÷éhĤ™\Òb0‡N¤–ÿ jn„wû>ñã²LQ…l“Ud$õ,W®¸×uö˜PuEb‡ó»˜p*»ˆ¼}Gov ôGçkŽÎÇáYd} hŽè?¶P5£¾0Åçþk¤Âþõ\˜8¨! am+¬Ó{ðþµ¬–°»àó¿{Øm£K|¦ý'~Ôzµ!´.zЯí^¥Â¤Óf§*ˆa�ð–¹%ÈÍIVgûó!ê+ G[íB¸ïW½DÓî¶AË9¶î]Šeç.øUî4ã¥�ÜÞ6ÆîiVp`²íÓqž åVæWÉ!"¢õnúIžæ¯:÷‰‚j7>âì�¹¥~ÅÙ%ô8¯Û¡>Eñ}1VÖ ç†XÚ:Q³QéSκ湘*c-zÂ:š°2Y5T7\ñ؆WI9Îãê­÷s0K™vVåó¢‚Â;&$³1*’«S2{Põµ(»¾î¿çc?a×ÌyuÇ|9w…„c®ªCɯ.Ò¸f4”VÞ &`Ô¡ Õ¡�ßÄËG¤�ƒ¼{�Œ±¦5‹Ž·Pó&îxh›©T_38 /‰R|f1zÑ-%S´!\Û¦½%ãµñ´Ïß>äëÊŒøšyœ©’ëfH“sÒUõ¬$_*y|1Ç%²óÝBê¹6o¹ÐÑð9d—ÕÑÈ7Öø§Á®bãˆ�»áî7QEØHÑžÁVª)¡ð‰uÓ/¿Ÿh|¾Í¤õ=�ŽÈh${ÃýVˆ§o8&ákZ�«6»ÿmt¿¦_V?™ ”†ÏŒ`10¡}`íï˦ºàú×M@ÖÓ(áfË6ËChdÜÓ2¢K ð#ßF8ÿ‡†­û7hUS<š;þòP‹ëç_®ÙV™Ÿ@HBúE1{#ì~3ÊsW–ØÚ$b1�Å�ÑT¨#×ê^h@àíÅÍR„ét•’hŸOn˜[á(S ˆ4g•]Ý»Fó€¼/)ÝÏ�QD8%,¢)¤Ï›§O8X—$› Q&5ÁbŒ=£Ód{è#Z<˜ ââñoÔ�ߘæÞ3¼I�Xõ›.:m=çxñãÉ0á–A‚B€Žn Ë6µ¬j�V¢)Ùü\v¤·ÁiDLƒä2šyOAÝK÷S»¾ëø}nþÿ‘6þÆ}çatÚ°ŽØ‚ 2´jýµl¶, «Íísæ•-¬±3@uäNF™-ž_ý^1Š}ñm6ôµhó�o[%ÙGÛo•Zþ± ãˆ+¨`¿L2_÷Ýn�¯jo’9î9O‰óF; Æ8Ú›¶T°^›–h v¼ý­–ý7¶½Ö¤wÑPÁíÍ›8l)òñR°C6/×¾•æˆ>ò÷DÚÕþQX‹6EZ¹'T‚/Ü…s;(KZI.ìÀ�Ö÷€ÉEÌþ_úísÙÉŠq}ýë’¸A±Aº)Û³½{EäE©4_.ªˆÖ|ò˜Ãï©np1Y95‡³T.3 ‰³E¢Vÿ¥RžÉæ D˜óñg"m_µ´[cïɺª˜é'£ôþc›Î1û8;~pÔ�Âûäï9�·µ…·—¿;nMl| æ‚ÛïñB! …PvÑd­«õ:.̸TïÃÉûû7^{dóàz¯r.ÅdfŸ dz•IðC\ ¢/¼6^ÎChãŠÙÙŒû?·‰D»OÞ<ùÃ3"Í^I×”+ÃØÛéÉ;¥\â#šlžør�e]ËAòd.ª®ÄºÊ>rÌç|R—‘Ìr ÀÌŠÎùIÑ‹ah{¸=Ý‹°6xA;ÐY„¢ uÇlô+Úg劾óÁFöPÚY -Çp7´/àLå[çú$´¤* Ö× �¬BÛrñ× 2»¨7ÿ†Ny�ûÒêù×ÉÚ`Ç„ ¾�c%h“ñ*âÂçÛæ>O)âŽÅNäl"ª†ë\-†½ì3áçHô hm~&‹öG�톻à¥óQ®:Ò[·fòïo ªŠDbF|¹À€¹‚êŒú»Þñx/"W^Ló…uêL �_8Ì›y75£ð�uzQêoVP“³÷p<]›ß“xÖçôÀÒxD^ªÙD ßÞ¼æ<Ä'6í™Æ¾mù!ÆÈa¼×˜}’+^y¸{n”„¿:¾£ÆÞMœt¹>‚ò:ºO9�‘„{‡’ini¦<ÁPŸû+<è‘^™ã•‹áZ ¼‘“}»òâcÍÍöâ_Ïž �åù�ùq#ǎװCÛtx2(Š6ñç(g—5mô¶ëƒ·5å™Ú5Å4}s>sÞ]Æ ÆDͳaä*óÏœÑÏ�yuWÿvK÷Ô—$V%ƒÌ–›Þñe�Rç}&)T±Å%êzÛœú%‹Ð@Wo¡³ ­Š RÉ|¤Aí4˜iÇ3 Ç�Œ^æƒÁÐÉên1�…`™ÃðBûto$ ΃¯¦ù„‰1.¡ JA[è‡aþ%½Y‚„§"ö~÷9¯•Á†QçÑéø�·Ý“óÊöûvO& �µýtbšZ¹“ó4V=ÈAÄ�¨Põ¢-g©ùG�¾_µwêÚšgº³t®9N6¦ ï›àl½i=,ÜÚLäÞNÈè#¥{ù=>ñk¡®ñÖ [vÉŵŠR‹óy—'‘ŒU¶9=­–IO/ÆH<´šr³-9" ‚wºÚÁLp‘B6ƒ‰Ôo‡Ù�0BóÎÕˆ }�k¿ÿ“º„miž–åíÂiýJ® ßxú"áŒ>WäÇs¶‹ÆZCtŸ ¿@q­FOnëœÁab;q=WXŒ]HÒVê½iëªÓ�£« ü¯Ó&{˜æS v¹9Èÿ [ľM1Œ‘6�ˆY�¬b‰ú÷²Y.ØííCšÈ' z¸€â)’êTÑïÕ"MhSä`loÕÆ~›Àî3�¦ñfmo S0²Ú¿¯uÝì”È�”-ú0~õßV÷Q‘¾kÅm‘™¤šNÕË\æ5ºËsÖv˜B§Åøv¬}ê8`ýNY4æe.¸ð€[xòñ6”s³ÁL £”E�ÀÞEÕû#y ¤ø¡‹ð÷q§¯!´6î7€`Ìt¶83)»È’ØÈ¢}d3Z…ø¹aÈŠÞ ‹`ÚÁ<îËD­†|<áÏ"ܹd«ÉØâ³Âx®ï®ó\¹$Ÿšl«‡¼!ÝäpsÅ£�aÓˆ 1ÕW¡µãËé*sCT!×̬èN®‡Õ'_¹KèáB[±Á®šèx+þ;_§¥ ¿qøŸúØ>´.†É�Ço£×ÒàMø 3Æ3ï7)œ +?çþ“eè¿-¢¸s=; b Jk�N5ù�ÿhcù¹œÜ¡ŽÜb÷ĈC}Ï�˘ás۽ؽ²Ýz€?>3OËßÌ‹´�ú0¬zn°ó9µ‡)>nŽl³qžEor=‹°åð×öþ"úWŽŽr<Ž�æüÞJ' ¾9ßÝøøÝµí5s µît½¸«ß2îD›ºQ\Õ~!m[¢à6¶4�ùïtƒIäùà̬*ëÆ…Î”Ý¹&¹2™3w⑟ÓÄŸ×$KŸîuñ¼`™uì÷9ÕfR7‡ÕF¢ïbüˆ‰|òM¹ºa«ç%|¼aðjilÇx‹«¥O1 ‹ðúí®” šˆ­/˜äÄìs^Æ5É ô†žïœRfæW!¯6¥pËN›Ö4ª5¼³†H%!ä§9.tº*ÂCùp<€{ÈV¯ WA¶WÍ—œ,3óµ�»²„o9�4¸ÞáèïøG§�pºš´·‡¸£¯?ÊmËýFSç·˜^Wí¯fT>¾¯‰ÿS(‡å!?èUôüïШïžµf˜ØÙ»œœÖ 2"Ýþ‡qAõUú€E’ÜÑÞdoÜ5À˜?ÐëÑñîl!üL” bq¢ÂºPAP*-áI kr=bH˳*5¹m¬X àUŒæhDY™ðì)ú¾±�àE{^]˜?šêP„€ô´w ùÜ¥Q/eWéØÉCÄ…ANàÛ«ÿP¢`Äj—~â b•l?ôéZ­ÍÐÿ;wŒEq©‡K<À.�aù�ëÿŸøa¼qî¶À¦qrèÈs–ލufLÎÆIóÕ?ö:-y°çŠÕÃUsHÆ\t¥ry“žñ[ÿŽœ$�VË«g˜Ôeè§`œãµï ö¤še=ªSx‰ O²½X[y^eÅ«‹(·Wàÿ}Ê[[â�–…~²‰mår^þvc/ºËwˆ? þ ýv®Žão>ûá�ÇQ£ØiÚúUh7 õÒþO#x÷ufåP<-`eƒV¿Œ‘]KÉîã!!%Jø-_xË$.‡s+À/³'¼ld <†•§@Ä9s¸Rx¢Ûp]G4 ;iÔu °¥ —¤:K^¶´Q™PvÊu…tS´�š›ëßo»S±Þ�lÑÍZ1©¹Þ¥Ï”ŽK$ÝcqÂX–EG÷o”k•©8@N8p†.U0˜‰©Ê½¬d½+‚1>z<€ö"Gù‘^�…Ääâ@ŠÕ9�·äJ¹±BL7–Ïé$—+ðTç·pN�œLé’ïZê7ý^ëb Q˜ƒZ`ŸèRH9`ña ±²ÍB‘‹œÀâ‹v\“R¡m¸ ZnÚÉpËhbƒËZÆ 7exŒæ< ´ï¿Lñ¦Ñ¹D$ EáÌ›O*�žâ©u£k³N½•-§¾"¼äZÞ\so+ãp`ž<u®¼X±œ­˜�÷Gr7.6Dg÷Ç6ü¡,67¨¹×ó#Wïß´6í%齈«ÊT½ÆÆ9Ok X [�š gƒ-†ræ<7l¯LPh%Š&Nò�)‘ P�%>CÖDÂS5Å�#sS†ƒÍÈ“3¹—–µuëÔˆ¦\üf>‹¢›.&ÃØìLâÃjm~'¥y+iµ#À,¢«#VÄ«3�– âÓ=Ùo³Õ™ìŽ(Љ’F#p¸’µšGB ´ÁÉJ¥Iµ ¯¼o$èFCz�šÖK7=o�†„£#ØF`�…×È‹ÉèÚ4§•ÞÀÔD+†¦‰yÐer?Ž(èÁS Ó<ÇnV3PÉØ¯.Î 3|“‘¶PÈ ÚÑ‘ÍY¦S?ÂrÝØA ÿE·xùc(tC]|ã·bh[-®N=™õ÷q÷(ÎÞä~ï¨Ü-g‡½˜A㘞®÷‘Ç—3½@ÖiàC 3‡PeåR�åÂã¢)L!!ÀÖ+% “âÉ8Sî7•ÌYÈ�>@�¨ñh£e•ƒ¯°"ËüvQĆvþ�…¬†Kæ¿F]þ<Äìý¢ÅLjŒåG†c|2Ƙ’ø†KŒ‚h7€a²ŸpËF=¢ÏݹšïF(Â�*ìüÖÇ#ÍGy›åoqŒV�?]1Òêç4›·²lnI —ÃQq,BBŸŸDÁzø®7— _/Oã�1ƒ Ùpô!zýë?Oµ’2#ªLBÔÿƒ[öÆ;žOwÐÖ^cÎë4p;Cý(f�KIaô¨KèÕ½[E‹À�¤©ÃgŒa}F7FÞAØ{wü¶«ÊÿŰɆ <*o.K …:d q©>¸®ˆ¶ÃJ K0õ­r.Z;#�´&-² Â0Û®UÚúÄÅôßZEºÅØf�ƒ$ö°lH_û{iÈóÞm?dŸµj9š\ÞøïºÏî�6{ìßv×ȼ¤ðB×áâÿ]ƒÖ›gòùbû‚%§žù#ŽºŽüù´�b$ðgϳ™i¯#Ü‚ö½Î}öØÔ0‰k[áÚŒùCº“¿È´þ[êÞ7˜¡oñ¢Ben~ÏÔG¶v^W· b³= v°ü†4V ¸]ܬVl-u>Û RóöØúJ,'„Ì~¥Q‚²c„ë·y{‘yT>˜Åœ ‡H&. °¥R”Aí——òséKê†;а¸ÿIìûl(,–¹ùÑ@–8vÊ4âÇl˜dЙ—ŠêA`…wdp!�Ü7�2À¿�âéQ|^†÷ïÒX•l9ä}^ýÅåœáø7¶¡ªÃ¨ÄŸ,ŠXA{šÇèÝ&ösYKiû:Á¸Ï‚oÞDž‹õ~.ú2�¡Üpy9C�vR ÞÈ[|{�:ö½$Ay=èéUp-· 6Yo&5ÓÔZÙ�$ŒgQQø¿"Ÿ#?—±#sôüßÕUñâíç‡ ÇkµGÁ-o�ÀÃ÷]Ë2Äö°Åg¼ïRYY³6H´ÇëxÒ½Åv%‡íUÈ‚am©37s*À‚XµÜû˜[ìö!83ˆÈoQzÈwlq>WGAé_÷#�©ïlÆ_êaõÝýØg'¾cMéêС ÿ/�tÂá´y;ÖâLäµXP�ðú¼-Ùk©#9é+£³×’q¶£¬¾wWuÇ‚Pk¯S­”µ×¿‰<^n‹«Z5ÌLA^/ߎoß—*˜ÿœÅ·‰€¢¿Ìñb•eÈÍ“GÏÆÇü÷'Õ‡ñUµKaå åè¾±¡8gÑ,–W¸k(’„�*(,Ö©ÿÓ•d÷ư¶Ž®<áß@ô™RGK–e»˜€]ºB£ ¸ìº+…ØÏýž%!Úè+Á›˜åõ�F$¤à(ŽŽ ë¾Â~OÍuß"ûÁðöèìðÿ å,Á‚¤¨@žgÖ‚r3. η}ø�b[Î[€Š„?%ÚŠ×�½f¼½×…[ñÂógn·¥ì’$m‚ón}©3~Ï¡¸k(<èÿÞ>°† /R|*vÈäó­’´›)�Ÿ[.E·ŒàôwûV#¢�ŸÞ+ˆý_Z�gb(Pÿ¶9<ü:ùR«ÏùèØþ‚ǰ³ò" Z ®MÎf<½×M,g1§*+…6hžÑ®14}Ô›GAðÃPŒ<$Ð"óþ æ³bh''ƒ£X­m‡æëGk&­q° 1 3º™K�p!_ë‚�ö1ŒR�!¦NìWÏQòØèà|jïýï—á•è—J Ûa×¾I/‚ùw$ØŠ´ô³X!égÉîÏ#]÷ÓÛ^Ö€C¸-L˜ZlÒ¾¥O‡ÎcËk_Ï 7ÍBŒü¿G7!]#Ìñ2{Çsw|Žëó·¹oܬ &/ œtzØq“²gêf§$]­}H\�–Ôgö‡ÒÑEŸØòCoQæv0®~ø6P<Õn΋Îñ"Aç]¾·þ·óæ/*ÌáÒ[y®�úÙY/uÝ›èî¶<¸wÚÅÏ–ù�ÿÉ{`îÆ¿p…ƒ#Û:ÅñécüiÒjÈLŒñîczŠ6F:ÇÃÑK<'Ÿð›*efë¶|^¹Y,¡B8·°ªÉt4˜sØÜ`¹³-µvØ:Ææ?eaˆ×º)v>êa—*�tŸ“*jà+r5EÜ8=XÐÀ|– v�^-c«Ã‰T¡  ¦7Ë |ž{'M× †¡‡Î�ºòŸš£ðêò)y�¦éo§Ó€JYóÔ�ÙÚ³þsÞÛ¼|·+‰&ú}ä¶³”›xìüœ±Q7ë¶”ÐÈ ¤ça&å8¨™ª)�Ép1!Æ7ž¡¼6÷1=áÙˆ´à›®7{'LæGH̯+ló6ÅH\Ú�ìj›>qÄCÁ^á*mm‡QœXïârØÿ}›Î]½Û¹Ø|=þ]jËBäáà½�I,f(¼‰X_-¦ØmÏx¹Í‚Vq‰Ì¹#ˆrÏv8›yÑÂ8 4Ýá#~bÅ+<0Ñ{“ÑrÝ#÷çË-d"-›a×,ËŠˆ�B«Sn^8‚á}A´PœÇ ¸C7AK6;ÉÎã‡Etµõ@¶�Ÿ6UEœ)P®\‘HÆTêÉIN,±‰Ý5‰Š yŒb± Ð/�ãø5&rGqŸˆÏ¥l‘rN¡çT§þ„®2zîp#6¤�®›@ü|]¹×ñNûÊ!ÜËã¿>´å÷Ķq½E^¦U×›o1bÕ“|½ë©|ôà‹ B7 ”_‹|ÜÒ?¬Ó7òK‹l„Ê+´a\JÊI( ÈF%:\דּluŒ éK^˜Y¹r×KË®Óxưq°¡0ãÒ¤À¾ÁÝæà¬Jdo­ðîàÐlòšsê—¡N< 2oG�±`_ÚÞöú¬r…²Hؾ±xɽ##ŠG\¨­šIuFï�ÇIÞ¹^yé–Taê¬V6°ôi…ë>ëu[ÃûX-— V{á÷'‹D”‹ªŒïŠñg‡)/è„Ĩ¼*®{æ6~Á�yðŽÛýÈ4™Ž¨/ß%þMá²6Ü"Ö§_9I0-ŠçµH¶žžfÐp¥ø§÷½xóhA<¹øé£B¼ŸÐAG”±ÉÖX<]惉õ5EÞ:ÿ±ð)] ƨ°Ælv¸oà]wÔxvOÈ.zÌA ~Ù~Š«É8Ê:»p Ô �}–Ù”"­¸È‹fhkœŒ²M]ï·õ'~ƇrÐbâ¼cº:j/ÍkƒÖýûöFôµß0=&÷ÌEíf±ïúÆ–ÖàµQ¢Å:W˜tsJU¡™a¨“”îJ ÚŠWnw™o u’馱{å3åÚ¡òÈPC[ßea\ �…9“« B0r9˵x_<§‚ßû‹3ˆ{%£ a†t·–bƒ%í¢PjŠGx‚µ¦À‹/BFIÝŠ<•ì1`ÆÏŒ­Gï;³-þ. §TÙ.¡ìø�jÎk«>f±ArÅ¥*J¬uî´žrýÛ‹¶0Й·ÝRs!²ÒfŒYP…� Ó¶-�Õ^0”paðYMx{z¶ ¯êØ;÷ÚQ•èØ‹Ö±;^lÆz¾HB²:½.²­±uë’{¢lÊ‘&vÿàó¤~z$Åò¸>¶ Ï qð~]ß²QÓH NÄ^áÂ7¹ÀÎ-µ÷}×sà\QpZËBùŒ¨éOMwCš¨LAh´S¿*·"N>õT�@­Óîò}çv)G9�µ¯1œfïg_4Û”'¹“ ²"[^Ä¡eŠàÖ<å¶ËUÇ®åéÏU¤ærwÁD�/Œ–„k…x0(;l @çˆjx.†Ö Î,7Ù“ÚÚ%�Eò[$ÍÌ-eå 9H/X£ 6ÓýŒU¡Dýà¼x+[¤ìî†9©é ½Üøõޱ¨Ï¿×R × Fáÿ˜°CÓÓPÝ :š/6u£ e0ALdÜa ͯêÁ?eµì%‰ˆ’>}­ æŽv]Yªù)ÊÑ‹39¢g’ֶͯÀó¨!RµfºÒQ�<Þ%8zÃvÑ+”ñ1‚‹ Èàí•tqEÆQ_7�é­jíªbU�Ñ-r¡v‚ É΄%€¦òýI¬[Se#tÅ3¥®zˆõÆ(qœY°ìur0š ZÇßêt9Z-N7eÆ#qK}ïß»aªÐŽƒVL‡_¢�,ùM&�7¦¯ÓÒÐ4sð!!rçóÔø‘aÁÖ,%›@�,£„’Iwb4½Ox]^ôï0\Š hò@h9óògIµ Ð>1*!|úûg¦Ñ‘62ô˜’BÚãV3÷ÇX—†¤~r›ÞÕÂHÉ1õDòÈúý¥QóU+Ò.$fÁ$£µ½é·+òò¾h;¦€WòoÙ­hV”4š:µ„�.„�uê@�’Aã—?¯jzë_Wèñˆ>ö^S•b²}ýý±J—âÝpbÍêaÔìb_Ž+9ÚJpm˜4FQ,Ù¡Œ~Çhh®$g"µ±~ô±—@Ri æ©£«˜ J åXàë±|g²7*é2®Úï‡;äeÝâ }>r{D N ¯t :º„о֯´\¸®tsþÑ+y¸×r‘‹ +T0,©V¶¾nJ+Ó;Ú3¼%áðjs%Â|úCCÚ–²˜åñj´:î‰Vj2Œ!wÆOsúÑýŒØû÷‚l!ò¡ê•âbøN_qÞÝË,ɹÇc Y¶ÙЮJwpÞ\j|¿àgøo×bèÏ©ŸgÕ ,Ÿ«Î¬hàdú &~ûñG¸óæ…à㤲`ìŽ5MÚm½}=8Xô±ÀÊ�¾æ�A0¥þ¸†±´9ô<ï(:qy‹QoqÕNâ"í>QBxc°vô–É`ƒ&ë¤ô¥2süH@o¦ ]<¶¾Öª´V+÷}`]LO¢ú‘Ȥ7q¸2€24v0X/HzAY”kb.a{L‹Ç5RªËt!mÌ­‹”tÑ�CÎÂçªS5LJøñœó<ÀÊ\Ÿõg0+T¦|ÎU_=~‹‹Z%ãŠÀ”`øLÅYÔ!±úgæ=9-‹vä8ææ>í+n3s±�ºãE𸄠iû¢Ús°µ–•a±êÍ[Yçq瓚k§>‹ßö 5©¹ÜÉ?wØ›sâ �cR‘|åWQšŠ÷zyA´ÒßÒúñGãçCËjFkçÙ6¯�—zï%)—(æÆ^ßiÈpÌ~_‰H&ëcÈ¢²d4ÚÚ¿„­Õë\|�|Œ’æ¶…r·^‹è¨¸•˜cK»ŠäÙrÅCg7ÄÔÚqŒã!`c§Ä:ÖÝr9UO0¦õ·ÂéÆé1NgrÞz¾Žä£ae¡û+©Ú9ΓÆP¹`‚×{Ķ ÇßÉé@ �„ÊÀý©�#Ú,þ¾ƒ+Ù½óYS`’ùkŒü=g5EôÏŸ+÷ï�jKï\�0RúöšþG“Ñ£=¤¯ëgÜÞÜ;‹÷¢JúÙa¿e‚¯í1p)ëû‰Zh%8EDñg>¥ JzC9Ñ›å2ætP€—ÇáòëˆÈ»Ê{¢Ä»â霱ìÊ… µ{ÊdŒŠÚÊE1»—WSg´3_¼ÍÙ}P¼èçÆdÃõ{ê™ç¢zÇò^ÁPö£k†¿â8zGP#:-»dó§  !OûÆk7�.°O=oäè}•ŽìÜÎG(éì:†•1KD;2¶A¦0±ˆ‚")œ”!h/·|ûæüõo]~nrÓ�±¬Iüô7×�=ì;�meæèÁïÕ uÒ¸ùž½+[âûk€L,ýRiS&#+©Šw1½èdk9‡'$Ÿ¿ª2ÀWÇ% ã7:xAá$Uù1­Íì7J;=´�ª\•³Þm] ÛƒŠ†Yk^ážkö®¸mÅ`ŸZÜ%SEº¾½×ÒxO6ðåcó#ÅÇéc<]±—KáèÖֳ͖ÝO˜û¼.µ“e©I SþI2yøó0ÙLË5{7ú‡•·rßt¼Ùµ‘Òü$G"¿ì<ÐïûV¶¼Õ ]ód»{ÚüÝýp’«èñEA`kÝ•tÕw„·8Yá糇ºª÷EÛ¾†Ä©lòËŽGNàÛðÍdŸy?>,< o¥¾\ã<±{Ì3JŒU9á�D+b³�»T퉮†=ŽÖüñon`†¢—þÙ”bñ>i\ $ÖËÊæÝlé�A’�2�p©ò¢xªBÁ´Ò¸ UC3[QwÁè‚M¸·;¶âåüå.³’ÁÖ{Ýë þS`ÚôM‚_Cö µCrîp@¢µÝ8Ë«ãHO�o–¥/qe[ÚÅsÊ @ÆírX …,ÖªÉR�öž˜O,Y·älñƒúy nÞp}5Îã#`ÏÆ:µÐUÞ‰?„ØWàQ~NxE¼e†B2Íi­AqLƒn’Î:ê¶ÑÁ=Ñ©°i~¢ÚmÊ&¿£™Öüˆ¬ÕæZ´…¥êè3ÙñŠ®í¦´s‹ù­Mb÷4Éð�c91¸K©ÈTQ¥cºž‰W;Ù/ 9'›ã†“1x£Ž EF”Ô`ï¼&CK3/ú¥s*AÓÞ£7³ÝVýÏÿÚ®uæœèqÊû3žO1¹Zö‘löÌ×–×V—1ˆYkßù‘ùsã½/&«9�µd$¨e"$„ó5:+œœ.Œ§)dˆÿ²?¯§Œg1GÉ¢Tʬ]úk½Ã\r;ÚÉèïY¦{ïz;‰$ÇõRdaß™äë «Ý÷Ž  t—=Ü��EHrQ™‰P•jW©¨TÆÖ·EMÚFêDæË;‚“ÚRZ•9—Ê¡>dÎ8§1U=Ž ú)ñÊæQ'k¼¿£@;Þ×A@búxnIa x Ô…4i�UÕH·Ø÷¡‹&È`“U-WA$f㓊‚Ïã°Y—ýü*ÞéíqÙߎ¾ðÔ8KÛAv½"CSþqm×¾+àÄnº$ò°°–÷Áš,–MNÇ3•v€Jú#ÁÓ,v ¤#:89mZù9¨g1²ë¨zq¦ù€ÉG¢(2aí±ñ�é(�¡‹ãß¼ôz=ÈÙ‹¥“øì“l7r}�HƒÂ ºÈ?¡¡ÐðP 7¿@{TZIäIfËÊ%!’flw,«Î¨û%•Êë—¨ ‚uG7ˉ'™Ô„SY•lìòÿ&êäX„!¢¬“à&¬¹¿O[cBKƪ­½{oxPržÂ_1ç¨Ïfj™ˆ‰#ì·´ÛÞ“Ao_@þãŠ`“_¾€ÐÓBÖ[|ß>£Ìºå·2Ҕ͕/œ¬ùžÂÓz^1×J(p)f(}ø–·µžŒ„r@~w¯×:½Qk •;®Ø¤˜*¦ ÆÏÂÞw¬¯’ÝIІ^£Ÿ£8óÌ<�zÃû¿=ÓðªÀñxƒÎâ¹Á²BåŒÞÖ‰2òkp‰íUY…Ä¿Üe† 䛃6›×“¾õâz[L©¹Ž¡(­ nOú{‡`ÞsQZo�à\OO•EÛ~|äëgµÅ¸4V±/‡ù+òÒÝ\CvGª9Žmƒ3Y>ïc£Ê 2…ËÍrm$+U–�/åEHDm•�›7EÞFŽª)3Kš/a®džíd÷¼þækÍL¬'C™‡þK6ŽJ�r©1üRâ¥\§q—É`¼E³Z þXÀZÕ!º4’,ÚÊU¦àÔq¯1\¬¹d.wÜÛ{›Ž…V\÷±Õ±Í´Òs%Ê ±¿‡Õßœî^²wßòè µ˜Ú� žÕ2¿‰J©žw²½‚µkBÁIZÿ²zîG{y"8çÙIþö5žg„ u{`*êd—�”sñÇg GøS°~� ©V½¡¯÷½l—GþmÑ<ð Õf3åýö¹:Wwt×$/oÂc=žÄ«’cSʃ|é`¡ÅŠÅûxPÅé.}@‡�þ:h˜&P)a¤ã¼N¼b˜=3Ê^höQ¶óí{sßÛ‘×dÇ%廹ú(x™Ûã[d½Càæg…"îÔ•¸× AuOeÍñäŽV°ñVþ°ø¶"áÛeñ˜b²©ú–޾e ~ª×!wÐx\ˆ¥ŽâÜ-bòc»qò^u·¶| D ~X†8�€ +ôšÿkY‚;šÍTä¬�¸b9¸ºÁ0qæ¡ôdæÐAp8N5W¼f…(ØAÇÂ.�×÷[!vCœn)[�zæÁÇ ÄK˜%odHK«^£`P¥X‹ ¸ñŸgïd ßÍ"%31Z\·¼íg±à¨}Lj_~ ÿŒpºbØÀr’‚Àòè<ñ’Ø%s¢3×… t¸RÏTƒ@„~ãöV:XÖo%Í�ý.!<É ý˜èð?‚8ÀƹξC+–”]Vn¶=hÁäUÉëeɲÃE¹˜ÿ/Âqž°"s1Ju€é�-í’PÃþ,]†äŒºkÓ¿ÜõÖýv·ÇÕ‡A‹Ô²ÂžÝ1ÔÅ[y…ŠQåN^À ”Œòú÷Ú[ÕX”•±”<8;Àï³ÁÇ<_†kd Ñô`µW•¦hdÂÔ‡<åŒäÍùl©JòfL9Ât+�]NuUÛø޵!ñ©Iév¥¶±iŠN·ŒkÛ'9û‰ff�WX³ÐåŽ6?-r´ZËÅö«‘/—íàL®ˆÆácóV± 네ãVBdV+l&px©3y,l~ŽøüÚ§ÖÛëÇ0H»ƒÅÇ¢’ ÒôXÎ;êù–1²€a¿Ñl±0Æ(¿6Ö£�m›·æ†þü_ÑxÞîŒfè± M Ž„#ÎêÝWRD®8ÌQ¹†\*±åk„´ xéËÇ\í›,í$ô:uë[­›fÄœ«@É“ŒµÛk3“Ó{Ê+–ÏàüÎÇv7àò7Æ ôEß”2RÞmÓ]aü¸¹Ì“3²ç1»¤÷™’-މÆOíØ&Iäß’ÙpŽ„³��öã0%7{ì&Ì$hYØAšmµªÜŽß†V¯H‚rTUnZ�3–Ϊí¬`v-­ ŸùY½L©Œã„/²µ€P†ë*ÖKµÀ˜=ç‚™ÕêU7:"9m¾Š:Ô Œ…¨~´.Ë"®°½=+~6;11êȼ;‚TøªÖR¶ÁôcLmUg¥…謠R¸ç¡f(qÁ²‘½'âëU÷uqæ-gGt'·R³�€-îµ"Àþ]å·÷Ê¿¯÷GÏt§çàùÏ'&(C:‚t7;7½Jº Žâ§‚ ™Â •±Â<_ûždbè;Ÿ×¬IY9¤8Žöí·kØä�tñX&�“fͦ¹¹Àäh+c H zÈ|Sv»œê³�tÒݬ¢+æY­b,@º7ðQøÚ8n\¿¬ø˜_m´ô‡[€†ˆt¯�è]èà‚`øW…¾Gn·)ΰ¡©ì®|õêkÖäYAcLC…’pÜû’²V¶°–ÅØl�wùœº¿%:['&/ òžzÒ>q&£^Dk`¾ÿV½…íkOš9miáÔ2…ûÒjý󸫏JÌXë;8×3š 9Yhž²Eè²E¯äy¸qž¸÷Î-v7g«|MþßêŠmãçt�Zõ?Aço:úiãž'OÙ¿¦†01_õMÇŸò€úýU¹8 î Œ¦®I@¸?d ±ú9 ќ孽jg¡@=´›Ï–ç”ûUœ°2óo¢½Ã»?ßd‘Ð�´UõSýö0D”ÂQ3�P/ûýñ|$V|,8�ô í�¿wÌ(ðù>çkPåàN¶Õ4K…ów,UöÙ¹4œ~ÕÐs+ÎNWl›\vw¾â£“nu¦ˆºÀœôd.™NWz1ëÅÃyä…÷§mS,´*¦5…©3pý‰VvjD›$ßJæ<«Fr8|Vß[Ú;Q—Ô ÑÛZbšÿÃÔ7¶`s7>?SSyðy„Å¥|Âãlþ›ª­¯‰Â¹�Ið 8Û™Ö33ºŒ‰ùŒ|o—[ûîý%ÐÔú¶¿|dr½«öÃBmÏ|ß’­Ý^C‹š‹µ’éëÛÈíXL Öº+ÈT^ë<�_gBmçC�fŸCŸPÐò‹Ök‚Âwˆï^ØñÍ“õýï#iWè¡§�õÛóÞ�Ïߘ7·qÝÍ\yâØ¯,öö>`<öÚ¥:úDY%RµÍóníÔ‘‡û¥¬|1Â5¹urªü)Æ7ær-^kaGžœ.“%käëµ2Qþ… khXç�»¡t­²·ïv€kÜup‘êÆåmmmy—Ç^À pY#a|‘ŸZb°=º¯P e1|¾ pQƒvo¶ìT[]ȹÎn–¬²¬ ? ÍÙ¦³¢ÀËêc¨²kö‰¸Ž3£ð…ƒð�Æ¢DQ f -Rêƒ`5¬R ô[-Lj°f˜8oh1þŽÉ‰ŠI0lµO?f"¯ú·m×™±_4Vû9·µâ«ÎEÃ�•[#‹ÖjéN‰�y2ÇC´Q*²ˆòça�müdnqì l.=ä™±@%<’«¤ZN$­W¸Aø0ˆ<›_{pÙœ±úb«c9Z]G{[ÁæœÛÖ‹^÷ÜÛÐvá?€Ÿ™Ä±O¾Gyоù¥|¯Ê/â M f·Þ:¹ò,§ °í¨çÞ/ß}Ó]ÀsOJ}%âÌ›ŸÚ§«B’¤,:˜™Y<îîiïÒ×;ž|Î7t_9„o1{ÅÐs¢xy± ã•!_OUÁd„¯Ä¹HgÞ�×—ƶºtVךš]fð&V¹âÉÖ^žu†ñé²MŽ+WsB!«†å¨Óß9J¹¾wtlVYo˜r'ëb1#EÝ÷†pð9ƒ¢ÛÖ»…"‹)­ùÃ#~ôàdž�“ô™zCðb“¤½õ®PȉHøßyKAxLf‹l%&<xbIò|ûY Òº7;’ÉW[4u/s¢Ø!fs̶ǔÚò÷.1Ńë“ñ¯»öV˜.gÕðÛ&/W‡€þb"Ž0Kd€"È]¸† Ÿ˜ðDfn·¯xÙ÷)™OõK~—¾‰ôÜ—F9DXe·—/z‰¢á/YxX W¼à a¢ŠææˆtìB5Hî€Æ$ ŽXë)¶\ï“a2Ïg!’„9)! ³—ì¼=ÁeT–UÏ.]¢C7µ­@ç(%�G„lkÅ'×Q Ç»àÏ ²fп³ O°š_òÉ,FÚÓñG�¿°Ýó×à�N‚Ù@Ò‘Δfa,=wµ­oüñ�Z;žù¡‹Ü=ÅûUˆÂyÒ ãÔXû)ÈUÂé[¸¹È,-ïze±2Ôä&âé[ΘRÌnOð¡ v·x‹¥gy¤“\¥dÇ äÔq�^-IÁPúG·À|ó†…îG –ÝèvŠxI¤ªÓ=Œ;è2±Þ^îòJ+ÔÉ�5 ¶X°aÌŸcv'+îí‰ih±,x¼à4-ˆ#ø�¡Î\Œ ëàkëžC¿3pëvš1ä_ЕÿºųÓû%±–Ó¡ d„¤„zv3÷¥��*/>”A1 Yñ–„ï’Ž$6ŽZ¾gÊ9@¨ÍÛßް1‡cÏŽ ÷�g:¦&Ã|\¬[—Êo ‘Y�¹Ù'Ký×5@±Þ/Q ³__šäŒ[¢ŽÝ^ÅzÖJñ:7ö¾� B}KéüÓÌŠÉú‡ÇBÅîB=Mg ¼ÀíXË,]M—eög ûYóRïB¦o>8¾®qÆy}¦ÅÍÌx2ï–[•Õ&o %ÄPŒ5ÎËà= ¼Ñ>k=ÿ[ ‡ \¾t>«¢¨,ätÛI î—[§—ÆÎsòqÆ£ŽfBÖÌj }­:‚xÿ�G2¹|AãZœŽRöðìîkoW�›98¡‚·F�U×y²Ý.¿ÞùçA˜àÂ~½7H¨Nî§÷©êd“Ó00KzÄY5#Æ� �Ÿ]Ñ®­ŠC ìÇNÖ€ãÓ?|Ù䣣\[üºÙ;\÷™t£ku·û�€ØàÒÑ,VtÚß³ŽŽòk[k‘P 6ûz v®ÛŸµœ]@<å�ƒ‹Ý¥äÌd¡ü‘½Ã/™õ›�êÂJ]×}©• aB9Äï Ć"é¶I”‚ãI·»O&ÙFÅ £õ¬îÂ3œš¥y#~Fý£¼¿œRð¥ isN÷ð‰1èOP{ØKœ¯i‡}�î?íPu"þJý³+óF½ÍÏbS6%= >ý4ðx^+¹•µ€ØâÍ~|§œÆ;‰:ÞŒÞ k‹2Jøñy§K·¡å̶ÈÉgYÆE·&üÉ«’é•Ü—zºÓàõÝ1oЇ}XdÅqmƒ7Á®œ�,¯ˆIÑ*ƨ³b³vÿ3÷qû_{³¹UEÍÆñÊ݃˜ï¦æßºÿO¼e©ÌÉ/ï°Töu›ùkËŸÑLácȨtsâÆ5°§K—þi^üDÇXƒÀ£ˆ³ÿš ž|ÐÏÿ]ý‡b(e)[Û%ÖÞA¸³Z{rß®°Ûò-aÀfdö¥Gãî\:K!–_¬íçgA·ÚÊ¥"�ëæB _·å:5zi†iÃz€ÑùŠíÂq`æ áª'ÖõËåÉCH"¶öØ#¿Sô{ï¡pŽÝüƾ¿”­)GB| Ë!˜>óKã<õ_3퉉£°+XÎ98ó‰oóÏs�š;ù~ ÄÛrŸêKüàŽm‰%J2{ãð�ļ—¿¿-²7%ê~ÙÍ¥öŸ)—€Mãž?ó�þ'j‚(²Ö*ZWZH9½¸îƹ¢Rê,­4õGPV´!´iô;È} h²G!Z¸�ðAˆOa]¹LI™ºÊõý Â)ÿ–;ŒOGÈòÛñ`¢$м½…ä8ú_´þ_½vÅ�ÏM?êѸö?¥¸Ö†_ÌÙç�ÿ>‘´œÚûW÷5ÉH«,j'}WzæöÒÐ1k¼AµÚ[I_’©P>�¢rÍõ�:Ø3˜ i2¢û+–Õe_%£qI…åßdri¼b�³U¥Õµ™Ñ~ÙÞ …ï ÏdÈP|RÞ›¤*‘0ÿOcÑk�è÷SË[àTùñc5hݼxÌD§=yÖ¹M›^Kgªfð9ñ§#É”¥ÖïÂÍ€ÐÙyÅâ �ø^‡;òØ:É×O¸ÉÔÙZØØ=€ ñ{žËó�ØÙÙ¹8³ƒü-ã“§Ûõ–WT¤‚5oX”†E3ƒ°‹Ü>j×*…Éiˆs¶«ù\jw¾zC c�æL\;Xõ âé’Îá>õ/i@lÏ|°*ñ5‡�l4€0S³(³¤W8Þ–eÂg9çYÑ©üøP€Ñ#Vñí2ù÷èí­ûW ÒÝLò±6…vî !,ÈÔC;Ö\Q¤ EB€Ëð庮a8–RïãS�U ùˆŽšLIÀ1ó�é§æÍÙN‹÷žœwØçΡUô“ŒÚƒ“@j�´U×Tæe ±3�¹jS@ÃþúöÐ #î~ηt~P¸clo¬ ®„þ#�&¬Ò»ƒšDêu=»U!Û°h[YtêøùÕVN²[ˆ×ÉP‘œÎ‘`¯"¯’]oÈÙÑr_[Óþ@j$Ýü`ÌÞO�†¨¼xƒg‡*#�2CÇq�kÃXò¶�Ïï¡£�ŸÖ1¼í½íõóWó7)æ5–NCyœ¹_ºéõƒÜ©Câ3SŸÊ`g2]K}Iaed"h@¨aê­f1'„\ä"Ø~+/ C܆ʴÛÌ?nE°i:ߌ¹²Öís @Ö¿p ó­ƒ°��“;Ÿí{âsÁŠÇ«ªÓ"�ú6Ê'ÉA¶�ýÎ(&zEHFDaKÃÂÚ#✕‘Ä[¾ÉËMtܾÁ®1ys5»oÅáhÒ¹~ŸTÔsûtµ¨mÑEêŠSר€¹]C¤þ3x’WE3h^¢âüƒÆ b¦]HÜðAæçÊ×K|ç9ñ},â‰Ëa t<˳=å´J˜ÓÜùצå'½l™·K³Öâæižd{iü•³ù·¶ÍÑH[ šTî úb²Ý|UÏ.¦UO¤þ’ç2i7Y³áaf‘ ‘<‹©#pgX‰ò¯âGh„{d”6 -&õ/i°É î0n …ý¬Sv‡嘟«+}@̃&<sâ›X ®¬Y²t¡ÌE·‡ XáPF™[S^hÐÅt`‚àE¼¥ �<�PÒÜX]÷Èv„;7f Ú×%¹¦�·šÀQÃÅ×?/p™�ìPÈ€øÞ®0]%lž}µß$j˜8=gØ¨Ï g×öØ"ɾíŸ9éÖ2"´6IååBµ=ÛJ d®3¬†©ùñ89à52�µk˜=m8Ñá×9q7ðröÕ\«cR|M-Ì>RÞ)½ø2XšX]Ïž8ð†Êð¾�LËÞè˜ï¤4ð¶ðK‹ÑLɦ¡ûìíá ]ðÍ-Ï<×—ŽÝ¼¾÷ã©x Î ê]Åšw¾cÏ K\øÖPwhAÎ…Pá]Îô;*�x3¸n}F#µZ¥Ù.Ü­¿,R'EDùÀé¨}¢}£im&Ð3:PãÖ/ÏåNkîš0}Wt Îõ¿ùåµ¼g'©‚Ò(+›êÀ»£{fàAø\oØ �`2¬Uê¢D²ÝŽúÞ†Îr#”C¾xo„Y%ô7Þ’rrC³y¢róYâäAyŠØpV,�áÝ@L\”oá54ì&º ö\r¤µñ1–[kMe+Œ÷Ô ‚3%cÄV©<Áìu¼”uLyîå—“‘œÀÍ–=s98ßQîö]ù€�Vôlnw¾ŸEû¯n¦vÖÆלI°""n/ÃÜ”¥Th]®ãGæ M›˜Äûd«Åˆw2o˜Ì^íÙȺåúB_ÙÕÈ=áÑ€WA•Í©©÷ðÿa<Ä&O82Þ£ð}yÉ2O ÉPŽˆ­ˆyÂI|e1»°Ó©6†­ú6÷ÂkénRŽcAñ\Á–qbJylöº£éAzyý>–¥šäµ´My&°ë1ÂÁ!›÷Ñœ_™Š©ðÈ‚ÌsÔîEÚ›=/|Ï1Èl¿øNÑ šÅÈ]LÚá‹›iÃ`˜@_û9‹±ÍÞµê¼hdzвÈ8Bìrñ#Üïêm7Ó�Ù�Ÿ¹^á�Ç^]Áž“—N—ãR§kôtXe›a™=¤q)rµÈyËáÝ+àõqÒéÀ̰ªÎÄ>Ò×—AñEF39šI(=æ¼P}Ûƒ -x Ü-òF¹ØŽ¼,^÷!ú›�˜�s¨M®X¹ènàà&ð¶.þEô?™\u5wÇ´f'_øýmÁùÍ}…h[·„ݼèÍÈn“ MÐchăQœQµþ³©?ØÿLvÂéÔ—)Y< Ôw$7H‡!úmm™)Ò¨yÇ9>P°Am…Ì7b‘jq�Fvtôæ¥!‚ ͼXµ):5ÅÆÚÁY#ÑÓ^Ò§Gü˽FSÉròNJäö£ 8 ¹e¨�Ú4à Ñߟ,r?‚Ú¸2_z×\'ض"ÏÒ‹ø§ÀÔ47~ŽßžoȽ‡ã�z`ö�B¿2ã8#Å· CÐ�÷™dÃÓ+sÊxUËüµÇá7›a3â[Ý\KâH)Î¸Ó f’þ(~œº‘Ó¢Œ³—“ž�D½û`xU€†KZœtÕÄë�hUãyÔ/ï¦^æô­û•Çüt»»2÷7Åâ.ùÜiêošÑot’LZÞ1œîü¨¡¿ó8êjiq€[Ç7måZ�v–j÷¹®ño‡¡sZðƒi»]�Ãð• sY‰ ß¿¢ÂÜìŽ:Pb3ñøx÷ˆzxÑñG¥"µMV6› ˹b»Ã?øk{Gÿ–¸W  ãäMh2²CoеÞ*>ó  ]¿Ýë Ý^Ú²çßùsýóÙ{E›DËDÃ7VJøßÙœÇÐ÷ÿã÷‚Óf‹@F„¤pÞÿ¾¿ïÄy:ˈtµçÉsÿ5æ?¯sš=Á¥÷­=§h™³·¥{y³pµrŒè)^h„ª4h(4%f‘T:›(}4¿¬pL!/•�¡Et” ŽNÊC2%¥ò:!5#[*6dò2„¬k„GýöòÛ fjëó“ÂUn{ø[Ýøœ¶ $¹".)åŒyÔÚŽ ¹Öƒ¿)tÝÓÿŠº.'»Þ =D$¾� Éåù†Ãís«ø¤y ÏcW½ë¬¤ùŒ„Vš–0¶UÂ>¦:sÒÒ›5*¤ó˜ÙLÉ–�¥!eÆaÐê ŠKnw�N^øp¼¶*Ç¢ý 5#1ÝçO|$U"¼á+ ¹Dèfx)),º¢Cßo¹mãÌʺJ B¿ýÕî3„©G4%1F1¤6ÒQ¬ É~q¥«W;ñr²÷-[4ŒÐ®|œÍ0êÇ 3&H3;1\š7áb†Ï�}qžâ”u;IéLð­Vó‘mšê5bm=ïq«áéÏ‘w-J“Tæu2ï[u3Q…«#Á-ÔàîÙнjlå +·E6¿ªÂTÙUá�††GÒ�A î­ßË·Y¿G*ÚìAŸz°åŸ7Ô•™4GO¤Œ®8›\L1Ÿ3Ô�äÉ.RW!8•W�¦ŒÑ¯+] …Ùœ•¿'²TùóƒYh›2ï68"/zm]²õïОâ8Ì_ ~:‘Š_(33”dú[Í\ŽŽø:Ç(?"�HÈ™ò¨.¡�¿Š%ïß‹R>]Ã’hG–u9&O9<{�=¬KYÒÄ„=Ì:ˆæwÁ",‚Ølaš“‚0´î;�@IHü 6‡Zqàí/+íHGw1¥Æ ; ÿâuŒè©¿ú Öj;VRWo2©D'“q{ûåì–WA Ø@êÇÿ†¬5:L÷[ó‘És®¨.ü–ðs~wp¥ÜµuÆ%E’ ¤ìëÃÖ­•�Hg…=†÷ãºm9=4ñ}aærqQp“ÃlZ7H |ÝòÖxÆÜ`Å’05ä Òå6ÍP®’ëâXÙ«4�©>û�’Þe“‡w‹ç–vÖ1 ´ËæÇÉIáV›*…rÇžüœ?žö‚} ?ÑÙš…n’Ŭ.NT�C&ç7[5(  xÕ•ºô j’?ëZ5'-ÅÂTPZ·Ÿ©¬‘¦"»ÆŸ”¦ Q‹Øõ5À²ñl,$ýè¯ïçá[ϰÅkëÐ~1…ê@0…hð4·þ΢ߢ§ ?Ú ÏÞ–¥@sàÈm& ümˆ§ÏGåì�ÆÓÿ�Ë_�øv×U'i*šHÒ’VÜÒŽé qUˆ£â—…AÎÚö½ÿ¢,ç)3´Ò‰gâyÊ‚íЂ¥,¢Ai´–ÆMˆ`àµâß±É_ñƼ2�g™ÈdòåX/=Ú6Hm[K¥ÉôH¾B•õ›]h“”â¥é—î³=¾™. �4³ŒØü4’ªÆÅxC�•x†.¡˜ól’–6 /6¸ñk›»Y, ­Þø·7Š ³‰oÔÈ­¥÷Ýÿãge!B\Å.Þ�.°¨yDD¤JÆ–¡ÀŸ)6G´‰-7À‹T9’æb…ÄáNjájµ2]ãû‚aXuãæ¿ÃP¥åöºÀžãþï+I¢vÊwAÂS†)Ý«­ØgB‰¯ý¤§ÄÔí.-¥7t¹G]Ÿl=‰Ø8ÎPk‘N2G^&‰+b‚´ï~î†m¿Ž÷]_Ácµ×}™·2~xýÕg\Å‚1© ú= #h™&5¼Dç\Ÿ ¬KÌÃT�ß?ž…7ä¶ Íˆ‰mãs®ø/Ká) ôØû°�ðú÷7«íK1Ÿ¶í`8t1p¨e´ùù—1;Øî¬£—+#q³å›¹Ñ ‡bàíä÷7,Ûü/~ëžW=CLúKß]Ù¼õvh¥m ë¡y”*ùövBÄpž¶ÍÃøºäÈ_VåÞ_mýŒnáQ¯=�ÑÁ˜„É«÷Úlï×*Ou‰c´ ‘¯3B綇pÑYrèÏ}Áñ +¢hDCÍ…•5©î²ð«ÆO±ÒnÁ@�•sà¸{îåÌ6ò´&`IË¡Ù$í$N°åðÍœ{Ìê¶CÒÇØ\Ï·÷uУÏH�v�¦Z¤«§/«ìf˜†Ø(–÷V¿L9kÎdq±Ý.¹ „8ÓT5—ÁSÎ:�ä¸<ò;#αp›¥ß ްÌ�¼ó˜^JjÑp¨ë ã#…Ëâj»)ÆÜ(Á)oS 5‰ÿ¸/røþÝoÙ_3ßè6ýñ﫜1¹�i>k^þe ðp«:è×€¯2[–­¶êxE_ÛÆuû»Øç«<® 6 _�;b_ôÈB„»ýù97HBßFÓqáµòŽWA,{œcœ¡Ÿtª8~2¢d�Kqsó`±ï”�d CÔ\==ø ¯ Vë׆ÒncÅl&qG»‘E>{*ºÅxØ–½§[ÍoCBe�F9ëEcCiÎöwY÷þ*JË~A|¸¾6¶þc!&=R Ý ¸0ztǶü‰›ï:›éqÖ`Žš»¹^oËŹÖíJÔ‹se#äfŸØð^‘¡^pw,‡X(ºú·ËƯ¨¦çë�b.í# ¥¥Àó+çu{ç+xÅ÷•�3�{ºôRnºZ¹¦a0z{ûã)äüíÏçø2XàáÞX¾b0H%Û€ËEèÄÚ}0�99 #VVÙ¬�sÊž/¾½n⯔µÈ6b9½êç9@׉ Õ2ÛÝW0ã¢4˜e-h×�HÈàÆšxJ¬42ApKl•Іñ|<=·+qeÉ©H€O%¢L€�øÑ$Úà¤Êá5;郵ï0òàrB£'º%Ëk±95rÚéM䮃´·¸J47 ÞQÉsÂ;� @”ë�_'Ýu‘³”v SÄÎöe±0Ú‹Ol¢R“¶�~½¬¬ÚÛ+ïïèÇ?»Q¨ ÷Nôæä ö*IN9X‚ºe;a¬Ü§Ãëáý…¯í¸Ò�Œ3*i¼þ²ä¬}”�…÷éw„ý(Pdtc„”Ÿ(ØúÇ#kíý¬–— >6óÐJFn7œOQ4¹]ŵ�°¸i½Cd–2]û¹÷Ëø5„ qÖàÒ„D˜–!À^k…Íc' Ytʱî}ÛO”3¯ýo öÞè|iC²�Êš¨ã‰Ku›ÁO&ÍSO$¨›�{,¸þ1y¦0Vü 4‚=ó7ærTa9gMÛüÉÎ2x�ò„îO•Brš<]ÿζEM{±†ÀÃî®” «$©Î…€hJ3 ]¤‹=Pàæ‹ª—UõÜÎ#ª†¬×˜WÖ‡™¹éj?ÝŒ€µo—ÉZ‘%äÀAÒÎnŸ~ô_·³Œù¢ñ›÷ ÙIûB âüúàö z¸°Úä ¥M®!G!/=N'…ãvøÞ _6M þˆ”Í ä@Øç^±ÂO.9ÆðÅÎK°Æ·}¨·j ÒýÅöžaÓ™2f1wßsX¤v5¶Í“(I}_V]Ï”ƒºÓo;«Êâ©íãq½¼j ËY:—¿ðlâ®WÉ쪯Ïï.›ׇö.D!ÖÅžEþ�¬$‹ò¥ž·œ$l±×u»¦ð áŒce™—Ú\åµcŒtÝž�<ïs}ÙðP ŸuÛ?ß×ÕQè÷ÊdVÄ_6]^ ¾sèRˆ8½ŠSº\@!%ý_sëVUgÂòî)W ’‘o,ª1œ‹+Zâöþ®®wH~ÕäcÈØAäMï“íÑÉ9¼mg3c{ 7ˆƒ¥È]LZÊG`tSÒ�4ÝDÞ‡íçíˆ÷àÙÍó}&p™ïGŠWŒóX‚ÙHп.û€`µ—(Ø.®œˆ�ÔŸdyuŠÿ¬ÛÍPÓúj€R ¬/@Úï3.²›ž—�á ÈÍ~zøöé @?‘|Æ��rfQñ÷m/®H[7Dñ$äqPÉJÌsÙWrÕYÕô \ëˆÒ7¬hw"aî-†Qà­páµñ2¿ u‹Lù#NëE6îó‰ûmÔJr÷´ã¾´¬nG^qŠžiüã²ý"ÛŸ¸ÐP¶žêÎGg• ´n³#1²T{kßj³IŽºÀGAÎÉðŒ`Üe š0�f‚Žå"g ·<.q¼Ö¸Ð6§² þKOûLljÌNhô=IXįûΘ‰"Ù>l*¹£lA©pÈNŽX�Ì•£z^¬cÙºˆ/~ëñNÂZ„¬-ÜÆ‹)…Þ¯“‰K‘YsüJfr~‰q¶"xsÁ^uÛjÝŽýÖÈÏ�<à^7mkotß/+É Q�V×P=†ê>>k‰í‚Œ!mo¤4¬NÚmv48wi*ÇIñ‰°¤‚¢F¶-ÊÔ<ô¡7>c}©Î˜ Ó~N9éó }ÇÉ¡3x¨ÁtÈÖ-­2 ŸB¢¨ÿB�n;ëú'…WÉ)c©†Sh�ä Þ^ne-:ºý�çm ¤ƒ»&Ç^©f ÜD—<ÿñü šñ½Ä8 ¶�6³”x…ÙµØÎÇ„mÍÊÐÛÝ­¶óïjî&Ãm2œ:Ôçbì츺èÈஈ–3êyç¨yÎ:CˆñmØV› �Ø�IàGG zÃTñ# àÃ;"²›Ô÷|ô{Ùnnî¯Å­TeUC#b³”‰²ç9|¡ƒû)¢ÕíCw¨É¢mT¨ê uñß$ÂA.—[ÖKþê(e³Õf04Øf ½ÞðX…=Ó­þ�Ι!L‹Í‡vv¼‹F÷lt`è�EóÑØàÎ΢L½¢ë»#vй¤qfò^"Å>©n3¼-Ê£nòõÏ&òûZ8£Y¼«�—I˜"DÇÙ}1yî[&lÊK2UÖFÂ"kÜdX³fã|v`þnP3ƒUÛ�ˆSƒ?"¯Ë]?Œ�xåâÊ ÇûëØþxŠß¡iþÐs I ½Í�ˆ©@ˆü�(�&QwQÿÊ4²y£¢ê”ò´LrŒD@ÌÝüAþMÉ÷ܾs$4�šxqó¿£yÁYœºÒŠöDf…‡ ý¸ggÍt„z î§Ç¿;¢dp`zT@RاëÛ'éL‚]ÿ¢‘TCÔOdw�žûf2k ó÷•¾OÙõ‹òæm›]2Ë„Œbä (»i–�†Ì‹9mNØxà2÷-ííïXŽÄ­AiÄuÅbj*x-·â"xmR;Y¬¾lRß ÷­Ì ] t‹P1�è#c~z8HI¶™–>¿?IuVòftw±C8Ê éõ‚!§C±X‹B퇻ócÑt�ùO‚öÏ}ãËOùŽ>�JNÉó£›V±cg§·udIVèåM %#Yç®Þ6ÏD¼ºåkUz+ÀG+öš ‰�46i¡¤†B²$"´ÓËW}j\A�.[3ŠïrEÚ &H H0 ÎDHk¿šÔ¨h½@�ñ”–ÀˆKó?¯R´êT°¹úþÙÒO¢__ÊYÁW÷,ÅšG�öiR��yyUåõ1ƒã0Ò@Öæ{éÈHÒÃÊðâ¥Þ+ÌÌ{&‡„llÊR*Û,½—£} õoìÊ(×ç¼ñº6)Á§Ãïøß/mOòKÇírí;Gsøêâ¹{súžLÊLëä×`pd}e(Rc33¥rhU T‘à¢^mYçfY5PŒ‘…1JÁJ�ŽÅ‘’µÓ¨b�Ø©)Q7wõÄ/=É/êÈ�Ùē܌&�p…•¥¡xßnI¶¼"[;r&cÏ0š×czh8mg éB†?ÖNð¬ñØzÔ=åÓHɲduGú˜œu ®ôiÞjï½Äqº�Ê<ç;TkÖðýï]A·QO1Àët]·"ã|ŸUÍ+º6 ‰šª.±¢Š¯Û‹ßëßx’'„£DO¢tT/úÔÒœM_°£x@˜îL± ¥±RÈÁf?Ÿ›.š¥I+æ)ÖødkúÆë&ü½óC}<<ù;m@½ËC={ƒÓ>«…zme}+ÝdŽ¢ÉµÒªËÏ›8%‰–§;»¼3øÙq¾Ε3’Äšm]øÊ¿‰Ë“¡Âg,™ß7·œxÁ=åÉ:yn� ŠªZÓõ¶IYš=]ÊI3“ckŒøí� ··D¿5¸Áí+¡INo²r½1•KF™t¾&õ9/n—K”Òq5qx$/|Ö$3p Eó‘.A;WíÍ×t�¶Þ�K2êeW|u’å‘úÆZŽNììLâ©i¨îó¥=Et#S-ãn4µöþƆg›�uãz~´¤¡.6¥¨Xwó_ý©�»d:�' €Œ&„{žC]äsæE¯ÉsÐé'•EQ&€ÿy\…›ŽÅ€²ÀMˆÿ�D(€lòc�ìy««ôdvþ¿jt5HÛrèB‘� p2€‚]ºµŸ:ðëó§ü­±%XÊjaRËCB€á§Mµ †€�¤AÇÚyõ‚:õ¡ït†lÃ@I±YBP„Ãá–ô…í¶I6Ë ÑŸ9F»?\’1¥e´†ŸqÑÿâÇävÆ 4áêñø3$„¨÷tˆ–ÅÄŒ6‡r[ÕÿÁ{ ±bO~&îÑ‚¶å.úrÄÆ%tœê©ñü8š=­E£lqsÀ‹.‘Ìÿklwõço𓎞à×m¯4|ïòûhùÉí½Õ[üäV?TiO‰côÂ�ë%U]‡4pFÃÑAofÓ8îIàýS¢¡›*ûŒ7+Q&’j!L¡éêmŠ.‘˜*�§×l©ò�ɉ)âÓ_Ix£È«Ø{þ‡y_PãE´¦àî �k‹” ä1Œ·iÁ)SrWdë�–޳,¥ÆŸTM:c˜Ì®­Á–)�o¢,�nßOŠåƒ[š7 aŒÙNÕ[àà›kÎmC£Ê,k BýU CÁá 2=1–­Š,}*Ø©ä¤×J­4ÇÌ+ =˜·µl’®{¾X…¶X… ßÉ}úq„Ýݨ"gœ0åz†¸Í¶ƒÍºÇ.Áé­JWüÕ\µÖæì5U¼lòÌÀ�h(T€äÆèeJ�¥›S-÷¤láL,„$‘͆œ­ÞûÝ»/Ê”€»Âj[ Ú#r×Þ¥£¥âƒ¦¦‚¿øþy�us‚]gÖ±š>!hÉ©.¡Ýî+\v¨œÜï|Ä’äûŒ…½úK+º÷õkbVs'¢‹FïÁ¼ˆ�)Ø3ƒAf]¶5)066ÆÆØ6–‘´•Ã,ùóÞ¶Ó¦WÇâ,˜Wòo%°]³BÆVvL/žaÉmrêÂZï›,Et›®¶!t©�m,’—ï¹.Œñ}E´s,Mõ›Ë€¨¶àþ!ÛYÍCÙò�ŒÎߨEN Y[ÿ,âBítFö((ìWçß“Dûšè�ßûù~Óx²|*èxÕr§¹IðåHÅ÷ÜZ·ª^ªJ¥;ÀÂ�‰ m%]CXf&Þq¶>“KTY2€òTAi˜œ…#K�–º%‚± –hqE2m¯ôiêûÆÑg½ôÛVÂÍë© òm£i[·ÝY¿ºÆ²QEûßÿcŒ7îŒI³ŒF‚°fà/·Ï5í}YáwÈš±8M®^ßZoÈœoCX¶8w*ÆÄlÍ´Î`q„0¡§žHÈì$›ØÛ7ò4J×OísUð-»–o�m¨±�I Ï6ƒÒ²´w‚0ÍÏÙp!{�ØrBJ’�Ö€R/#öyó×Dùœ1šÉZJëÄÿ„ÙŸ+æ²ZJ Ö6×ý²CïÔpõ»“tÑW/ÍF=«^²°VVKyO¡.OÌRqpœbˉ½hdcQ¬ÈYÙ÷6Ør3WL†µZ±F€Y'’³ ó8¿Hݲ”"jg0±0ô)ímÎ$NYQb›ˆÉ"TŒ¥f! ‰’k61ñz5Cà|´,¨�1ó‡ËÚ‹×ó+åŸrÝÑ—nZS”œÁ¶44†ÓeôŽ'¯'=ŒPc… Qn~ûï9ßfÿÁô4RŽW‡&Bæ§BZ“•òK¦�Y°û=KØ! #0aû°¼MN r[ž³�mä³Ê›¨?F”ªÕ§¨ 7,y\ö†xLL�0Ú'رéó;¬v×ù>ÖÁœ—uq¶¨‹óÅDå$»ê·&Š„!zÍZ+iô?ö;Q7õh­tÚWƾǔ9äeêC;?O_ƒÒá�&˜Ïá_…�CêO8˜&´­¥ Ðëb•Äiž‰¤½¹s�þy/�¸­# Ç›4~s{¸—lÌ’óTýóêús¹Äî4{� õõ:‘í Ó(n E]¤û„Ðæ‡©Jïà‡ö|úîkcýf#Ç=”91·áCÍ™D½¸,ÃÚȨ{ž®šc2™Êb¡RƒõB¥òSw˜éiµÃ# WPŸñ‹L÷ÎÁ!CmUX¿eÿùŠ É2šÈøMˆ ƒRðò‚³ÿ�ÿÿÿƒ àùðJûà À` IA(¨R'Ñ´ÅlÐÖJAJU%"ŠUH¢RŠ$€>Ú¥TT“Ó䛀fÐxŽ€>€ ‡×Û_f ݺ¦€hu 8¾�P*€hàê”Ú( €õG'™€iÉÀA_Z*‡÷y²ƒ£@åÛpç€h€ݪµÐÐ�À|¨ W(ôd ATÐh…Án�£@Ò”4 hwpZeUJ¢¨NÖ (U×4€ª (²X¥ÌF¨(HvÁwÝ5¨£ÉÁG@hqÎ4 ( (Nh,@R€(3Œé@:Õm”vÜ¥@*€ºë"…�Hô2 8zÚM f @h( 5Zu2ªÒÁ×(¸M"ºÕÙ¥Ø1T.±� î¡l[”U'“P¥a¨ ¸…Fؾ½'XT)DŠ–Æðf­UHÖÛ *ºè(Âä:níÀèW¸F‚ 5Ð;»€�ªh :m€4iŽŠëªé”j1@:좀)Ê 9ìbØñãÀµ€€4Ô ‘AA@ "¤ŽiŒ¡"΀ܦjí¥È]Ž—`ìdªW L@€’R€h LI%(Ôõ<%42 5OÉ�RHÓJ=3H�dSÄB’OQ꟦‘2€$õJJ =O(411=Fž  @’”'>M±ŒüN?ù<éJÿ‹êÇÿé…HTm£(,ZB•c´9löV£­ú D~ã)¥Ø½tdZO»®É[$”Í 2ˆËr´mr,j�)J�£™jîÝYMEj5Ýv£3X�F²Ô&H£—D)Yisn›&MS-wu¹Ú`‰I5¤k"˜ª5ʨâXÊTÚ’–ŒšÉ“]Ý£dÚi¶¹£nmFØÒ[E�™h­e¢*̆±tÜ0%‚Y� I·6Õĵ—BJ€ÜªäI¶JÜÝ‘�’ÝÕÚL‘6ÜÕÊ-‹snk;«¥FÓ5&ƒR˜ÛšíK»Š £$m¹µ«�hia–›ºÜ•-�D“m¹mËb´njèÝÒwuÛ+Fi†Es’X�d´¥¨Ú•›Y5)šm´XÚc)5sWi“UÎI“–.nFÒYJ,e–”Úf�©dšÊ4ÕlJ”%ËnÐÙ&RmF3A5&´!9º»®µ3*lØ´i*-dÖîíµÓWHÉ‘+�!-4¦2·-ÍEIdÖJ�[”[‘’»«šuÓ»WMW.šÜ«®UÖÅR-.mÈ’ �´”k)PE±´¹Ði†ˆ“X´”•±QlÙ¶ç)›.ë\̱´)fZ“E™R‘ZˆÉLÖåºPFM¶ ³-A¦‘¦¶åk¦£I$‰µ¹kt¢C&3-®ë¶¨Á©K ˆ ELÛci+nëG2ÊH¶”Â$ÍI£1†ØDÑÌ‘C0,Cd�h�cZfË6ÆÕͺRŒ´, M0‘¶¸k\¢Ó`Äjåjå4bœ¹¶M²e ²RT[&Û–º•Ë„�Û¶´”ÔÓdÛXŒ™•¢aS%´�%SkKs¡*e�‹%IbSl&Ù¥¶æÛpÐiM&´‘ RZîëPERE´[d©r�®š4$VÆJ´Z“U3k•›F´ËS1&�Yf¦i–’M24ÐM´•hɳ5SL•²V ¢Å¤²–¤‰ ¢*‰�dÒdÚMde¢¬Š ”e0BÐ"’æ×* ™±¤"Ô¨•dÆ –¹nZו™‰-Í·S©Îˆ¤‘!N»\$²lUs‹”Õ[»tÍ•f·.fZÑDc³liJ‚ÐfI$33 %$cFÉW9µb$5)Œnkrض5p®�,˜Û#)�ÁšÓ4Úa©#]Õуj $ ‘4’É¥6‹¥B‘©“Q¤Ñ“F±´Ëcl¦5“cRjÄV’ÊAb´¦.nU›EЦA3!jå·!–³LÑwU͌˙LÖš‘)E¢A¡«%dÔh²“%ƒ$”›HdÛ2a&µ)@¢ZŒ™4îºUA33s\Êl…¢#Y5fU$Xª2m²Ui nWJfÕ3lA¬HIªå­ÓI% ³6Mi"Æ¢�)¥Jc,Í2²DmÄ!dÛƒ$l¦É©¡²i¥+º¹f”š£XªFj$BJ̵‹;µ¹I¤´”ZC‹RZ(Ñc Õ„©*eTA“3Mµ#›¶ŒHÑFšXÜ®ÍDj‹dÔkã÷jÚÕjõmZÔ•�„’@ê$@“$$˜�!T…t’@ö! e­­·ñ­«Z¶kVµlÛmUI B¾$$¨!!!&!!%Í! ccͯïÇ[çÚ¡ý[Z¼½(±YªÎ­DŽæõà{»%X—ZCU7[çp­Ñ¼1«{]wtövŠ«ÙZ¾Üb�=­)(uM1^8vß6,,X›Z;%Ü¡Ùc_ƒÃNL„]ØÚç'ÔL߯uy´–òQU(°oaÜÊ¥•mÊêb¯Ê.“ól󩈱Nûn lñŒp e-7–ãz3:YUT µù™UÓk)^š.Ž/4¼ª‹‰Æ·Ä Ò¯/elyl ݨ`«"Tž1H,â¬ßNã&¢uK¢Ú°d<ÆF· ÒºßßnÚt¤žØs�S†�W¨ôs¥y¤!ÌgwJáƒzže–\ ÖAºÅŒY¹W[9¥u[ñ+³3VßE™Ë–ÊØf+Û¹N åâ§‹rž�†»|ÚÎíy²¬6Æ£y �w·s�š]ÆÉÃËpñ}(Ÿ4],¨Öëª#O/ ì8epA`á35VÍ먶A9”N!íÃæw§Ö²\Z8êõæT”ÁV†Kö:xo¦�½ãrh�FåS Ê‹¨ß-Þ±~o2K£³ÉÇloiy34èw´Þò�3o*ô«C “ˆåG/”T–ÙÛÞžVnL€Ë’›³ãÝë=|^RwæÓެ’Czz©‹u=ÖY�Q¥ž!Þ¤º¹iª+"{%±�Sê6±V^TÕEÏ›•¹Ê—+wMÆè ª;V$Þµ-!¢—2[�Uð"Ø©—6ɰ“g^Ã'd†Qw­åæRx†µb\�EWU›2´ä«æ *QÛé7GTO7<[ý'¹†‚ïFÊ6´ícõŽ;†3ž‰Ì&•xÕç›\3£�ܾuïÂ�œß=ȤsFéªÊÄs1•“ƒÓ8RاX/´±L¬Äpœ™b©gwrvuŽ¢¸2ü¨²é V]îMGgZ%«¡ÌÄ;VörÊÚXŠ‚< Kw˜`±·b:Ü«³ØÛ}C¸mÞÍé)�éyÉu­ÚË× ÚÛ ÜÓ|]meÆMÀé$·/R¼¶ï4!|Øž9/œÓ¥ênÕQÝÊß Àåh[YÏæG ½� ;Õž]^øÂí¾äž]¬°líæ+¥†â îz"Ó½¹wžgDèé9Û»Eðc°³’e8 Ê{äµ —¤éÊ,Û5�C{V9ëï+·ljÓ�r¹61iC .±¶tÌãY’ˆK+º‰Ø.{ƒ– ÈfkÔ ¥UVr÷++;¶žsL6ŠÃ|å�”0%лÈ6�.G£¥�¾o£"î¡ ì'%»[¾5¹{}Hh§Úot5yÌ-¾ÆŒZvgi»ÐTÊ®v°†aª³dâvÄå±Þh'D˜«elˆqÌð·Ì‡Ó6s$E[±U!1)ƒSP[cj=�H‰ÊÈÇ3k¥ºÞM¼±yfL7 Höü›ƒ7ŠÂjˆ¼¬”,_ ëÛŽ�JwÞv©Ïn,ëÔ¸X¶;8+îªÐ–,ìŠåeŒèü¬:«Wxœ­r´škk�àÌk32ªÚ°Á[‚dks´ãc)ÙH7<í`ådjLÍòRò]ꤵ֋-×jcÅ\ÐìÈ÷zò��×›Fž´2Ͻf^ñ£ãvífU7Ö(ä¾ÝV7+.¦^ÌØ–ê¶yofRë»Y›v êÅÆ‰5‘”I·ÚöE³»©OgIˆwpís§Å[¬F+sz× b¶*Z®Ä#ãˆv”FÝd›�9 ¡±‚×0ƒÃ°×b¢.¤Ýágž“º,ø™b scIW<;×»Öo;Èp ÎéjUÑËé›ZI^`7·‹§XÅXd :ñ õ#Dk–�—Ý�]sðšÜè#ÓOÉ:énæéÞ”Ú ¥$VåF�„ì[®¼êÁ.®§-Ùu‚F�“q›ÖÔî6¹ž|LÞ¡Ý íÎÞÓ[@î-£ÀŸ ƒ¥FA²˜9M'Ò÷{iNÐ"3z§&í�*Gœ&6Ðåyk5ñë™we$¥ÞðLÕµZ)ո뾪0´Ì•BqQï!£s•vZ¡·�—›©`y•ϲî�RÑÄÂá„Õ„ ìÝ êšò†…¹1ß:[è;=xb†tÎ>\¹Í3§eCâ»8Ôɽ]¼®KŽ4¶&,Œ‰æã+…ïtìÛ±S�ÉÙÑZ8ïbW³¢à:¼8‰àç)’½ƒ¨Ê†Æ>¢(kR«zÊÛ²—0²ù¡|Qk·©unšëAÓ³¡êÓh5"Ü=s1­èçÜi^ŠèM‚E7Ëk”æ{wÕ�>>IWI›Nån烞•}V0ùyNGŒÌÇ�åW[íT3œQUÙ×yœšò–XÛ„õö¯21Ù™b±241Ä="äƒEŽè(¸ìU£z-ƒ†‹ ^•d4EÿÏþ¿É»ÿ�ÿÓÿ�È1lŠJt¿øÐâɽN@IÒ?�Yjël?š�¤ 3ÿjþ» Ò$: ‚M”P7�ë{3²ÊÙYŽ]Ù>*±ñËõÑ$Cö×qDç&AD”·¢J=tŠ^:K̦_ðW«Ï®¯}ø¹¸,1%”ˆÂéãAf©êÞæ¡wAëãþ;eƶ©T�$"Y+=Ö/B²Õ*ðe8¡:Õxûaˆ�å%æ. ²f 4/ÿ<¹±³/ŒyóÔv�7- #C° ïúÊ—Ê‚'C/kN’DË ö} *L­—p‰”�E£òç­@ýQñ‡P“â·b…aöqK‹Žè*›µ�Y6¾ÿZÛKçó:ð®tzÖ§=EB›âÏ[OfÔAÖª}N�í}Nõ­zLLsq‹q�BK)n“‚!6EÜ~q¹VŠÿ3›“½i Þ9íSB„WJ¯Å.D¾µ†0ºñþì‚ã>Œ2=ǬÃ<&œŒõc{Þo|B÷eº¥—ù(nèse¼J“³ñ²¥nz÷moÖ(Û@Í($Á‰Í ±_ÒG(�-ÊTvß*êh•Ž#3Sò´YUVK+¾TATÔ°õÅ[3+|ª6$jëQ:ò”ÙkeFË<”5Tµš·ï9ðì\¾mJ╹yšRRß7–D §¥dlÁ1-õuÄ®JrçL,˜|¿F ùèæ¶½_)Hl�Y|Jí Ô|St®˜µÒ‚±E'P޾鹦ŽOÁN¤*MUG’�1§&dñšŽ)8%ž©“‰Æ6’R�5“[Ùúk¦ü;ë5åR¥u ÷íQ‚öV+UÏ‹AÍcW·uùOð³á_[ÓØH² _ç›^ÐgNÏ™×<6¾¸Â¾ôáHrÂ7ïPñ«c�nå[ENî�I”Ä*kÛn*–Å^¡f߈(]8=©¦*¼­ÝÊÏÁÙ·<ãS Q¤x«#åˆÑ½/Í-jsr·pÔ)C¤Ëìðn^q´Ÿªšä3«î㣒š2¿Në« –¶ò )çJAq(±_EΛ kj7kõY¯¾S³ô÷½©õSftTPÔ#9Ç_1ª¨aÚ“U Ç3UjŸâ®|»õT¤>¸‡³$‹‡iY°Û\õ®]ù«ýj£��.?t¿Ú·]ÌBvÖœ<ûÍÁ�Pºë¦*­n“÷XiU=ÑívaUvl wvµÆ;r¸×[òy¸ýs¸Ã¨PZ $v¬±íõO¼÷ßêíd¼ŒU‰Ÿ·ýv¾Þ"Ë CŒÙG¾�Íöè]°V¹#õS·©m+q !�Û‰Û[á¬ß†�6½j·³\]äSA‘ç»fv̦ÚhiÃÿ(ÉSr•Ý ®jËeÓaz¥&J“�ò]ˆ_%ñeHìúíRª:/Z–äûº$ç&Åa-IƆTküª§.Y3YÁ´IÜÎu»½ß.Œb¡UxÙUón2Š!·P«ôî ‹º3Æ ÁA].H—J]¨‰”�„1ñ¿ JÅô°8Ð@„R:o?›üϱ ÞP¹,f!¶ŸImF¥žäVæ�»uÜíê׉RHIT^Â}S¶‰±ss~Ýf(H§£”) wtELÂ0ßÔ†;ŽnÞU‘¦½‘Ç¡¥7˜ï4wÒ{HçRÆW|0ëˆÌ4¦Òô·@¿;ž;yE |KþG ¦ 8BdÎ'j…B±í%PÁU2§ŠU=‘ ³$TȲ$‰j¨Y¢Ø4Z²‹ji§ üÝyƉ8ëñÒ‹{eÝ÷fMUîSe(ŠVrÝþ,fO)U·•Žþ¾æuÆž|�“°KÃú)ÇqÔ—‰&eÃKäà¿R‚Ùƒ"Èù *Oõ7<† d&Í$¨¢MÛO� �9eˆ=R‘%HHR.®Om>­d”Á�HÛÛ°¢€A±-Ú�'L¥·„BÊñMÚʻɈª 8åHR6^ Tò¿—Ì·×Ü(qÂ2òØe]JžO>ÊõÑ:wž’øºu�0–6bbbÇú�bçÑò7še/$ªb�µ3Ü¥ ˜ ´(V¡±ž\‹ £ë2sWLWT†ª ;Û¶£Ò©ŒÚ²©\SJ±bóeƒ ݦ|&’7•`‚eбªyH EQ«~UFš�i.*©mV!uV–|¹²òxÖJE-tßL(0áÀ;>n\Þ\É(ÉQJO×7SÄ0~£,‡áº~Ò=0Ukð²îYl?eâ9Hj‚ÏiÃàV¬±w}.”"S(Ó´(j^EÚ \,#_Î3]vˆ|¶¼Úª"PS» Ôú¤ÌXÄ ç¶d:8}XòdågQ’ý-Ü…-DÊ\…ÈR—%² ²±}ÍÁ�š.¡O¸cÞ¨wHäÓ)y”`®Rk˜ls9bSbnS�WR$}K¦=�yëº.­S•\摪6‘4¢�PD$d£}©pÚfx÷6âÌ ´îå“i˜¢èÁ…úÅB§šPe�š—Ð#‰MÒd!–�Ísd—ʈÃëB¥x*àQªÄ¢Û!h„ô”‚›Šõ1*zåÀ ×Í&ˆ6D¥‚( ˆ0àØRzUÊm :pŠd,—¥ÒLÓ~TH´L'ªÚ´½Uù? C46øÚÙB§¯íX[�ˆKP‚h ¾úƒx¼Æ� ,hþËÄÍEÑk 5—ê¶„ŽQPqä…G‡-m ÖfÌá‘:lg-ÖLLɦÅ/R-õ6�òÉ^æa$¬üÍË87Úë²nER* ßÝÉó)ÚÃEš¥JÃé5 J˜§^ô¨Y#yÖ_UWZ6ZsÈ|›tìÕ”ò›$$Q“tUa¶ÓrÄ:BA›¥šÞZšÖr(±KòâT"OGsg²;¥|ò÷ª¹KŽ©É�… W¿–ÌY˺®ßLyeŠ[˜§ÛRiݱMÝÛÓGU;ƒ�‰¶ '!éöШ—R¾¥Ê*¥=C©hšL“ÙÍLS³‚<å¾§)X%¥B‰�Xú)•€ýŠr‰C�`†áºu]\dHá¡. £$ „[¢èK!ŒO~Op¬.j24èB¥0Ó}Rh[X"—Dyä¹!,šˆ*6X9–�‰žWÃwŽŠaQÚ~ŒÖ&¢f�‚§´Ø©Qù—v…¡rRI‰¦ý¨ƒ7ð¨õÕµ½d}�J>aºdeQ£1Pàí&�¥ìŠëŠÈÊáu)ùx”Ù)OmÄÛϧ9²R _’Ë=Rÿ_è#ùþ—ø5<Ÿéÿ:§þ¾t_úövÞ ›YÝƹ&‡d]�‡3�Ñ”VPYÕß/3A¾ìç!EÞ-=lmÑØùæ]�0ƒÝU{¡®ª¡†«ETº7:ß[u( "~“0kÑ| Xlì ÷Èæ “k#æñ,¶CFÈ]*¯5Ö==-yÕ8[Òó(�nÐÉw´6mƒGobæ*gkŽ�4lvÙ3Fíg­(d0ËvÃOvݺ…]Â6…U�=v÷n©µÖ¯“0våïcWc¶ìañ\IJS]ù} •å%¢ÐänÒ«ërÝE©×-™¦1tx™ÓráZ:¬L•ô8-VYè9Vc¹]ŽA.„,¿Ã¬åè÷Þwf™÷ܼůB}[]y9Ü=V²í<ÊB,ÌÑT…ŠÍ™ÚÛ§;Î=šÛP·×r„Ø3™<+»½Î39ɯßj÷Ãl¶T”[[�i4®mŒÞ;/+ÎO[̰«’¼CfŸ-,Ò«¬oA£¡Þ 6�X�¹‚uAR ¬&™‚|³…›ŒÊ fF‘Cö”yþZͺRg÷Öõ›Ž×Oý3 U‹äõsG;  Lj\_—Ï]ߪƒÀ”¸=6IÌþd<é«^–v¡¦ž£®ó~-êñ£¡! ÌÄaÁYkîSC7r?´óòY£&̚딳>�yîsD.Œ‡ewræw ˜xâc„™¯quü]ë§B!Ô/D¨˜>¡0PÓ°ÄYfbáÍ×—:ßæ&ÍÖíÇhž§U÷Wü,ýl¥ÒƒÑøföý:˜¶y¼Íú¡ýBå!ªäÛêS­ÐŒ8$kâ~?ëUÊ•y©Ú…è.`�_¶<:mëQ…Ÿö¨È›¦¡ñµ¯.*ÏZN4“JyuU;/Ê7@í,H}DȬl¿¾»,_^ºçï ÏH�‚2[>²v]Á/ ¹PâaŸ™Ü.%‘�•â?¹êC •Ù°ÏÚpø?{·­”é~«r2”¸p©1ÅûhÚŽ‹N€ù9²Ã·Œzî K*¥c‡n…”Ê¢EäAzXs¥÷»pp² ¶<�|ŒÁÝŽ¢0u2²o¥¾f�²2E*Ò A½ ¢+ªÄ¨x‹Êf�¡D�­F _˜²+—ZžeÖúéÀ…ûë­¾#× ¾§EW6G*,Ÿ„ÒPˆ$¤¢Š$Ķ~Ú �•�©(–ÑÂ$Ò¿ÖÜÍ>ž³ ΂$ÚFH¼õìóÑu뼯ƒ×�é;™xÝ$‰4Ó ºK.%` A\ „Q �zê1h„H0¼9úBD‘w0?kŽÌ£maiN¡µ o–F ’9d5Ò"Õ!ëI\Y äÍ™)±´6Û·¤š ó AÉèŠû!\”Âãf’à’`®CàˆiÊ †rWT°J8Øsq€å AE‘ƒ˜d4BK OL!+p€F „î\îÛ8‰œ0ŽJ ìÄ p�Äb¡ˆ2V ÃCÑe$ �Ð}CÀQ”±Ä¸tD“]qàqñ®�5Zaé$q¦¬¾”Q%å bÕ@€§ßÝítžÕíööñd¯[×�xËM³ÍÈe�‰8à›÷{Ü×QÊŒr¸dÉžé�³Y$†Eí0lôvFs.„¬[8p@YB…g£££qf}Ï�/™ô¤Ï·¹ï_‹]Þ®÷vÝJ*òEæâÆsy:‚ݺÒ®�8àÝâG–�ƒ^ÊL|E ÞU×Õ+£æÐi‹V�#£Þ޶pæà­¢ÏmQ5™Öc{ .…ò³L>¼©Ì‰žß  â ©{®«1õéñXq¥¨IQM¿2®ÞªÍÍδ5;2ùuV»ó¶üÌ©§TžšÑ–h{»/±ÑêÑF©Ùlcg*± Ý>íÍ<°MëÞÊ|SyOoFÉÌæk×4ïB²±½`¶ë×È·dW)2ë]çeWq­€ËO%jÝx²ÍT¡ ÚÒ/i�lQf¶4IKĪPÖ(mXr›á½wDbr÷Ì·—xÛ}صŒÏ2ã gŽ)‹°9�Í ã®ÓY±¨jW9öXLíP ¸ Î�ÔTÞ2¢Dš˜e½j¨Çñø?DãÚÙ¨vŽ‘AÝÓ³&{A—xó¡õ¦Ø¿­áá· eè:KfžþÔ¶±ghÊnå½ëœA†vðxŽýüßöÿ%?µ¶­¨,Þ^Éiÿji_(ë™ �m¡z˜M” §PV.0Å0³7V‘…L�Ê-ƒ½ŽK[EcRÛËcª’ñë>Ëñð8IJÃC†uVæô°oºµ]¤zÅeÔU¸J8'b �Íî¡Ì;ŵ—ãVÝnŠºéÖzÍ.ÎÎÜ�ÄF ¡Ba–5âÕÒÅàE_§ ³n°Ô�öó¤¨)ßÜì±�Þ‰îd~Ž¡ˆ> <³Mcõæúg—‚­û}®Y«À]Çš‰Òég�'+ácBx¬Òî¯"¡`áäRKçÑX¢¶U„zgZ¦eꪂ«G”9�š++Yƺ¬¦ÙàM”wrÃKž“V`顼Ræ«+¦àëc¨N«Plw»€Ø*à¨W¤o�¯ ›ÀÂ}/ti´ì~_µ Þ(y9^h×ÃAòêVß)]a•5ªÓ—yRô‹ufF{^—Ë:bžŽèh¯YT¶ûsf’Æ}ݶH“¡áôÅA[éµ<ÇW×Qgœ2æcš%ù`ÕmVä(öU渵ÄÊ®¾®£°‹ÌÐ{ePIfßJœÝiµMå%¶x_°ë5‹©mïSÉᨪ…‘ ¥YÌC…Mƒ.¼ÙKªŽîíXé{Ðo»Rðó²·�¯yû¼×/EÙ\bù?eàc:«] 0Žg(ÞâÛœ†ØÇfnaŠßl§Õfñòä+m{"ì'9»º´ø¤Å‘hª§•ÑB�T-äp# ·Í¡.ÛÜÃJóÞñµç÷x:ãÞ£g�Ô 1b©‡ÝÂÈjº’Ö˜YåZ‚d’³lÎêÇ=�"­Èé“uˆÀí[ã`BBKTBBGþ4 I àHIP K>†_úË;7ÿío67Ã:ÂñznßýsP–®+Fdæð]tÍiz_ÿâ†óGÿF›.ƒ,¿Eüž¸k#X×�ÿ ¨o ¯�Ê›º­ÏŒõ‰£áüwl’È^WÑb…çækGg� –Íœl¡é𽙉cŸ,éšç³Wª¾>·á˜ðxgQg¡ôbÁø=Âl¿rªÀyè½W¹R ê‰ág ¿¦ØÈí1à]¼Ì'OP‹a)aüË˧NŸß;3uZåQJµ7»3ÿà PPP·.É\ÿ˳,?ðÜ|w<ß2‡�›Ï—ûÃÛ)‘plDûégº³÷•Ë¡£ó³„vƆ'Þ�û¹+¤œØÿïa�[Aàè÷e8¸š]�Ÿ ¶‹ãŨ@4 û¢Ü¹ Ø!Dz—ÆD¤RÑõ`â‘ô5ö·ÓÀ|iNÓÆÃ1.ôˆzNß#Ø?³æÈF—ë•·EïÉ¿IÖßm�ûäíæØ±/nX² :Ñ„Q×|vVuž�|Q™oÓÆ~ns8rùÂÂÈøúí}7ìÌy2Ὸ x“�«o#ð°}¹Ò\ö.ÜþáöÉÏÏSÛíÕ–ÌÍ�aP\ úc87x¦ì&9bw G­+ïnÎy䥩ù—†ÇßPõøýÝ&³ )"Ö¦ÊûájEË×Èö~<ßµ¹ž±{“|{–æ“í¶÷Ýògk™·žöõ¤ì|­£ça–ù”àÈB–f}Åæ~ÐîïrPùGÅoäÝ?%HCB$X²‰>u•é;†Å—c½ø)cóE–zï¸ô÷[ž¿¾iÙ?IN ¼÷ŸÇÛ´ˆ˜2q S™¤á2•‹ûÒÔ-zÞ b˪ÿbà0ppf‘0›m¥ *wŠ!•™™“M¸HÓW´/… §1ÿ°H@Y|g¶{~Z’sœ©_âº�¡þ35¹ÿ_À‡~F¤šLð†OœÍÿüÝ�¶6ê$·6Ú”a<‰ÂTXEKBaˆFA{†ÝÎ`%õ!”EHŽóD¹Š·£G_8)Sa—öy[LˆšFâ€bƒd‰‚þQ·CÑ/»õ.–ŠëTpÁ)ЉMiàGþ�€Hs�€A¸·Ú £G6Œ9΀´Ð&Ñ,5‚²'™µª©Šâ©2¤"êÆâ7 K^ZZ1Ò”¦–ÿR…mIÕŠ‡@¬(teœ¹i³ßŠ9Ô <ô‡*¡ˆe`9„«Xçª ¶œ*¨VDØ‚@¾X8ðÎ=`«*³ÅïU¶Ð]Ò'ãMR9ðÖZ�Ój (*X(†„Âtm¦8$æP|ª>©U,xu"9ãÙ:Ž3K!QFÇÝá¿ô» ©ÌJÆJ°„¹Ê‹›’°c(¼Ö¨ÞàˆÚÅ¥¸Å²EÐÑj¥‰ó³Ú9J9佦Æü½ç.KS¥#f¦5‡ŽUå™ÆÝ­ÛÈ[Ȭ @kK#š!^é¢ù™2„XM¥¤$‚±¡žÓ¿ d«³ýk›R2çǵÊ9mÊz0°¨H–­&ÑÈ¡"‡;kv6Ûjʣʃn Qh]�/rš•|Üqõ�gÞjæÖûú´SÕÖΙM°FS¥K�'$n¨•EÉ¢. QZQb€”#’MQ 讄@–@„„•P Ã*ņzY9VÇPB” ‡­‘°•î|áÐ(\M… Bl’Ì)Ä“ª0¬+šT�EØÍöÜm ŒL`ÒK! À˜ <*÷Žyf¤"Ù³C`¢9šPFa„90BY m¤�¤%ü©ê  Ë�»|ñô£·§ûýŸy==²ØŒ¢…×¾kÕ� [ñ>l�O{zuà~ø+>Í^%u÷°fúuY7¡‹p¥äýEâTè¿;o¯³â¿ =w? ù¿¹dp…Íï¹Ñ¿©ÿ‡¯’"£¨/8%szÎ‡Ž ùC϶}oΞ~µÎ·f ‰­žYÓ�°ÍŒÊ³Ó+>Ö”d¾.N§Ÿ¤<»÷Nä3å£Yóû…§I­¥~Üϱˆô5ŸT‹úæXëÇzà@ª¬®]g­Ÿé~žçRS�˜MƒÅ5ÿÀP(´1ßîGô#Žý:c£4ÞÍ5øæ .í“c«ÿ–g6oæÊ{Ÿ©^ÿçw\:ÁüºàNåj/°ì=ÁÍÿîF^«Šü¥I?Þ]¦·ÏÞ“&žúErn= „»¶Ž'w]\ÿÏ¥ÕæÏ¾úÿ¿x¡8ód*·Û8¥û‡8¯Ä_LÅÕ—œ‘+¹êûçì¬çs±_û Ðï.rtÜ’©jC‹Ïõ× Žëtóls7ºz á�Ç;qÒŽ�Oɺàºò2c‡ÕÎîx–dþyç®|t¿ªöùƒã¿¾PvSswüºvߌFgÒq煸Πƒ³«¸gÇ4v§o1ÅcÂYt~Xw›/Û«wþ»$ÖÖ¸ âW/«”¿¹Ÿ—ô¯Á?s´â?AÌí�¹•[bºíüüxkýjS=ß 64Ì«uÎüýφêËÆ¡Vºý{c´™ÅO§¨.CNŒaëïYÓ»+v7|¯løá}(0i%ŸF©JPVŒÚ'±è{Íü¿½³9Z½`2ÏžE;e¦ª†vEÔdë‹q“b8ÎDÀ\[_¶`QËL’6ýcЃ˜0UCRs!"F_Î`¥”4î  4¬�Ñ #v­çœ.8>6›õkˆ³Hö´!-Ží6¡fš(ukj Èž�’$¡FåXE¡K²·+x®Ñ³^íݬުõµ{Û…((š˜ØÆ1´/öØxýˆ®T–mìGúG“H» quœCþ=®÷žŒÂ.‡Ÿ ò¾½Úåš³|wW­|•z·“Y³e‹SX„1DAE²*¥!¡‰ 6Ûrƒl‰c%$e*ThiÐó„W!%DÕVÄ¢è Kjÿ8*ûúø©Ã½©1Êýý­¥¼;g£³9_«[“Ë ™§Èß°�Ò.—$R¸Bp$zQ ]1+áÁ™X8Ϩ"kÐþ¾I»ÈF�ÝÎmÅÎs,¶©šd»ï @zo‘š~ÐhP-µÍ¬�p¿í¿áK ÿ•#sÓ<ºõ?×Ôm®—v«xÚã>€ÞO´ŠÞƒ¤6@Ô1Éc wê.£>³�Oø�ýÜ.{›¾³FS?¸c±�×xt@–hæE$‚YMGJ hHIw7kÞ^‚áyQR¢ ÑÛÐÿ ÷ð@¨9PzqŒÛé•$^¡©C*ZAõê†÷WÙy'«dp,d¡§¸;QÃ(…UƒÌ„¾}Ç5ñåcûÏþ¿C�“!Ézx§wl7)ɤLóKå?îíû¬‘l$ŸTIýñ_ø_‡s/î<£©Is‹#äéJ~ççËx¬ôIâU�È­#J»³O¾¸p=3¾>_¿íuã’×#ˆ�ª#SÎ�ÈjiýÛç³ç×Í>w_)ÇhåÝú-Å^ZûŸíÁÔÞl–+‘¨ûŸœ† ÂgýÌ‘õ¾]©CÊKë“üIÛÈkóÛŸQí®ëûÄDšå}bïí¾åê¾»�«Ï�ï?{ÊBöü ¢ëåÕnBNLóXúrt5µßgÕ³Â\¥ŸSGü¿ÇDmŸá°>ì[½´÷~µß÷(z_N�ÇKš}h¯œ¾r|_øà÷ço¼—Ù9hŒOù›CÏkß|$ý¿®Í²ç>Ý5¹þ´sÆ:wÆ.×ÿ|—k¿í²P ßí}>?(qƒ¿lyªžÎ§¾uòÙ—D™hÿ{ÎN¨]ðÄ÷©n{:CHÛùrvFLÖUrc>æåSOàÿ£Ì;-¿¹ý'4Ãiýoé?¿^ÕÓç˜û_²�æ!Ø4_÷Ÿ#¥1Â3ÄýJü�“úœÅƒ}Ýü[ï�5ùŸÃ9ë»|gkcݧ߉©2Ƥå׊wn)Øb[Í!YÝyq§Ú×âçµt/VÜáH7‚ëä¡js»Oägò´œäÍ¢Æ.~ÅåözÕR‘¾MÝFô�³ïÕ'×<ñ/&Ð…Ç‹Íö·¥çÜ¥çUê^ºÒ,ZJ´í�-L@ñ¿«¦ZË,±Heª*6wl¤˜Ö;·¡Õè‰ �QÛ4ÚgG>“]ޣǦu®vƒ8†:ÌýD)zu¥�Õs:ø¡‘U�ë–\Øy Ñõgˆn!Ç7à/*ÜܪT Å j6Ûc�|†1ÇÍÉIÜ[{ò†ÌÙ¡+åÉN‘Á”-4"†(Vhˆ¬ùíª¨És¢Jˆ'�*ò†9—-¸‡-²A¨TE�•2B J…(’ ; 4ªÏG ÀŠ"•þ3íIRõ¶¶¬W—ÆóBijuÀSªp¡KÞé Ãiƒœ‰t#³Q¸\ÌœT•†°š@ÚQPyÀ îf¶Ð!Iõ°:óÏ‚õoªW쿊Chä¢2”kh­Iƃ˜Ù ’IEM¢„5á› ¸²4(µCJ’—’á­¸:D,Ÿ‰Ue�¥É0œ¥8¹Ðl.e2,mjz”AZèB»,GE�y^ŠŒC (hm2P� Sç�¾ÚGjˆ`ÔqkÚÏoc—Îq}æJ�ð8„½òΦ‘‹ÉLñ[Ð,0ÐD4ƒ$”ŠR|T$³ßCÎ`Vë"e q4Ttˆ)"­à0/(H‹Å¢N98`OZ¨As&’«XtÌtÉ™�ÆÛW²Ü*³ó,¨m�ƒ ÂI¡šP LCEÛcchcUr‚¬çÔ|/eˆé[¼þM Œk:\±¥Ýk¥«œ]lÊCŒ‘!¶C (³N¨d-Uû%p„j&‹¦"Ê’±SÚ±\X·ÉR�/jW�~³0V˜q�#JS!¬ æŒe‘ª8 („2ÆR€E[oܺx«L€§+J¥îò!^B¨@$)ÈðΣg_.N¶6 1n­õ‡tU6ÚXUOrIÓ¦t£-�ošbæ<ÃÜô3Ve\Õ²(w @åm¬w7¦ ¹ªÃk>˜I6…Ñ_Ü¢HH¯AlÚË–{"�tP –¯´„ÜÖè­ ˆ ëIH)*ìp  €¦Ï�»|ï·Žç ÞâIO?ßÏs&÷|A >Þ’ýß¿Q–p)]/ñÓñbü/™+¬.KCdáA/³71Ý�%0>ËwsYú]9`åöÒÙ‹?P™vc 3Ò1{ÍîÅM‡íaaI¾åÞìø�õú¢Z…ׂe‰óc‚z¦ ÿÖGrØaÙýnÑ6ëP­š½³c•¥«5ì~}—9ǹ/쯣ëÖ²¾�þ¿î,Ÿœ!ýç§Ÿ¯Ç�Å�&Y·iqp|s׫µÓ±ÿ£ôÝ‚Èn±G\@øñù~IÃ4Ÿé}¼àSz¯>�:¾1óë0¡T(·g³HʸoGd¸£Z1Ýܵ†:Sê�ÕA*ºI¾ ëñ'¹ƒ¸éXŽVÑý¨­sŸ>¦%fºä3ç>ª¸“¡Ó“ úyh™²ï_ïÜ}ëövlj½Üx8vÒa6å§Úúåžú„tÑÎéÏÑÒ£4á5¥æÿ‘uàªÙö±#«ðºL¬>2Ýݹ…Å¿ T/†h&uÅR„ŒÏ+èÓIyv*'u�@T,»%üwÔý|¿h §¬bTooM&úluÛäVÒñåÜtë­t÷¿+éB\£Ä®çö#IÀ‡‘Ä©Ä,P]µ¹DONj-ϸôHbgœ"&ì9¿�.ÏV¾IÜ_œJ¢GG9 · ÃÍͦ€n Í“š> A}âÎ/_´ð8kZLèóÔ»9g×g4ws¡èã×®ü=ü—o ñ¨–¹I–%×;­`ÁVq«�B…æ)Ö¹;Šxèÿ°ëÌ'ï|ÓÈÜPj¬ª­eœüÃì4÷Åé‹Ì±vtͱ /àbÇ‹_/ÜoÆ�õ]2»´?ÜÚ³è.êBå¯r§,`o¾%á=�oгƒ«—o/9#`^û¥R¤ù\ZäÉÉ”³#ˆþÎØ_{x@‚ �SŠÝ…T�»Hã0¾Ä s ¯ÂA! ñƒ‰5d’À¥‚UòFȯÝ$,Æ„‡ÏDËQ%Òº^bæz!v KóËn;V'ý�#Êç•ÿ6?ÕýÙ¹­S 3d•‹ÏÈ2qüzàM¥kö·ŒÒ^ý­F:5ã&�ñ ëÃãÉCðÌšÕÇDÄj;¼6*ŒÚü0ծ㩰ÙjòÝr—ê¿Éû¢ÒØåÝ~^Ý®ÞÒ:Oކ]#ªýŸi³ù­XÌ>BŸ9§ óÇÂÎ ÿ¬}I­±hÓßEÙ‚1üîÒŸ*Â#dSÛâNl¨¯/—F�í}éŽEÛêsTH¾klm¢4 “ä/hNlå}µòÍñÑÜÊO¯Ñ‹y>.Ùyñ%#?½ÞÙ>òw×io_bé뎯| Äß(öþt®>:)Ù~ãv¬%ÎŽñK·Nôí¾1_Ôëçû� Ytü©¬qþ»gX&ç7ìmœ´Ïy¬ƒ»\TKM ×ó:ñ¤Ã½ ?ì‚ 2¼1 ˜÷=v§§Çì" Ÿ?põ·ÛÞŽ ~÷Fœ^:áºâÐ0²)ñ_Rµ ¥iü™ôˆ4ÓφˎmL°b¾åÇ–Â8ô‡w¤u ×Ý•Ñ]\>øõhóV 'õê~ÒÎè�üÛ󲄟=ýé·�òEØxçš´|'§Vq‰nŸ#�ãÄÛ>c±¸x®î0]|ö/²w7½¹]<õýC–ýy³úŽüu‚jZ›ýÞ¹ûÌxêVǦž}÷ãÜ=|N`e™zîÖþ�±m_§HÕð”izäÃ`¹{‚Ù®?wë™vû‘Û³id"ú~Pœ_Ý›oSì�ïO}yÁ¼5XcŽ�ßTKõ»iFµÏœ Í#§ÊÇ­_Ì_#_P^;YYÃ8j�ˆŠ·›¤ƒb¸ PŠjý ìeX¾&³¼^|ïlV±×(”zµØK3!Õ�ÓÝ�ç^g;ÓN¾_T£ž¯Wìæ»Wè!!%•2¸ìyrŠkZ[涯Û�€h3ä0†ª²�&ÀáÄPªQÈ’Ô‚—§í|©nLÛ‘Üî/×ÙYc8šò ÊØ€~´�+ hx9�ª”ƒ�+B øB*¥¸ !`ðgg‚–Z‚GÖÄ8#ïú„ô@b©4@ðZÔ-aµY:8¥ Ä’h,“L؈ˆ5TëžU‡¸fÔbDÕ¸A ‰šÊM <ÌŒ¾+õŠÒ¦õ$¥+JQ�ÏFR‘Q m kV©’ZòuRÛwB±³7À”šÁùð°Ââ,¥ò-O¼TÞN8©a”µb'굟™&1It"9åŠñÓJTMQϼr¾#úGÉI…ûwþr£Ë”?—ÕÐâCúÎX 쨋)àfåœ" ˆõj™ŒyBTC„ÀD§Yz_X^Ï„z–-çuÍÐê ë ÑýïS\ šP™�™—––=áŽö!äa¡È nG*Bˆ‚÷3ò''WÚ8Åì~ò™ ðÞ·{Læšklë½`ÖÁgU…`©Q°ÆB“MF†Ò‚�[-ï2&=Ç–óë÷¯G©¶ ~aà{Š�òé·­)_B ᣵòý´I¸Yºn©.PBó·\«LêÎ*Üãô>aŒƒV'Nw¶”{º0 ¬äã[!ÜÞgÉJ-Zÿ§™ýü·gµÓ´±n ££ÇÎòÝÈ�Õ"9{µ—ÝXm|bÈ&1ö½(#Ÿ Ôü~ëë?³¯ë.Û|xáþj5Þµ8§ŽM´~O‹‚ƒ Ï_{Ï™™Ä¯8CÖyóç~½è�…áA@(()äc&m)Ùcˆxµ™Ú ¶:ǿ׺õ�˜w�Ïo¬f_Ðù;A±ôW¿‚kz_81ïÁèîzþ[†À× ïj;´!p¶G£GEä}s ®Û;ë×HæBX>C ìi˪ʼnOÒ?®¿,1‚SŠvû®ýÓûß>O­^ïç=‹Ë‘¶Ã}>�5ïxmº3´ýeØ¥ŠXûŠ�u èà (P>žÈ1•òÚ {ïãÕŸbãâ§ó�VN­Ì§× XBÖÝA~ëÚmz7Žwì±¢õ0^‘.MÝ‚–Ó3¿fõùOëÒ+ëYÕýL³Ijp“=V»óç›×¯æ/-^} ‘Én �AÒµöfÒŸNØŸÍù],œÎ$ï²ázÑö>Ét»õ}=ÌÄ+ŽÏïÐu~[7÷͵Ž¾È…žúnßiQùŸ¤�üš†ËãZóé›å¾zQŽaHp^½ Z�Z¡!θñ/ªÝ ¯EžÈ}¸|ž¶ÄúOAÖ¾#NÎÔ«qßá…«®ü}véïl�öë–rߟ䅟շ¿F±}݃yH¦ ‡¿ {û4y�À)õXüÕ‹Û˜IþÌunøÜ÷ïéìf˃�}>qÕV6wc9òó�æ1w¯zbáãÜ=K¶^ò¼ëJC¤+Ç~í‰ à/²´ê“;Á7‘�ñÝà÷¾}÷Ÿ ‡ÞìJÜu.œ£;u úΛéÞÔóÓ ’üž«˜v½¼]Âs[ÚcðŸݘí÷û£3•Ì'?Ž–aN ±­çå\÷µþGç&;+Ô(ÓYUå/xqÓwuáû÷Â…’*ýQ^‘vzà;úÑ þùjóaýטŠSê”ò¤”¯ ¡Ó3,søs¶˜â³ÛÕ¸ ¥"ݘ#àh(šå4ÐÄ-ج±°cY"D�{ nñï5üN9ÆíÅ÷t«NÑ{ªO9Q”YÄM·,XblØ4RÃzŽD‰^-ª 2a‚Q&™5Êm±ÊXLJEl$¡«AK0+ñôZ<ß­k„6dÓ Zè( $¨ŠëVŒ"Ö ´ŠX´ ª$&zÒ›Á8¥/A•-ë¾|ô›Á’•íxóx笚½4Åè×p­®ËÌâµ»Í-BõÐácžpLe•&"ï鸵èU²ß6�iª½��]áv®ÐÚ8¢ (OhˆŠ(€5ÊXÛ>vý£ŸIÒw½ZvŒ±«¾›r)¦‰G�šT3RUplDp…�Ç4d�Jó‘R‘›%×ÉÂL«öš�Í ñT«zeNñIŒb˜ÀŠð$ä,QXhB ò–† ò¼ÑüÚY_¢2Åólƒƒ“³·úÈoÈ‚O×€-4¾ä#RØ¡b*²˜pÛ”HenyypоµRßÍ%SWYÕ£�!46 ¸kZFÕ¨N  ° _á Bº!U·P×—ó’±Kô¼ÓBTòô+‡¥l[2i�x:ßÄ“¦yPÏ/NZS%e+ö� ιNT9��‘¯n)SLð"Qu 2È:*íKs” ôi ‘TJ+(,¤…ÙÊ¡µR„1�#º¥|îë^Í-Òy«×’L·“W{¹`K7þ„§Î Šc#àRE£WÙ•«Ò¤Òcl©^ÍßÃÝå¿®CGÀ&–g úȘÓb¬†‚(áhÂ̪i9!"ÁîÀ™ ¥0!,@‹;!Ðp­@THp�TSA€ªH ®ìãGâœw7ߤ]§:ÎÒÁÛþðÞ�Ñ?¤ÑM&\kÇ`±Õ‘ß.EâqfßçWPÿÍ®¹‚¨;ÑËGÃŒz�Çæ«ïßî:4Qn§[ N_§uã}ÇyÂŽQ¶óáWËã®gC{kZ,k—6�m)Ùy²Ùùü6¯ýî_Ô¦]Ÿ§‰bbÔñÓæÊc˜Ñç.ßˈý5òì6cïM@ñ17Ú>üû&BÌ) ƒ÷åN€7ÝÞî¯êïL¬ÿz‡´`ezÅM r±z“>F¿]ß“>1 †ªßs�ÿtõ?S›-ö­LÛÆ6–Œ ·!kõÿGÛ†^oHqò7è{“ÿ¥>½c¡ëÕáh÷wŸNá,èŒ?Ï-Ç·÷ƒ}@3ÕÍýËç ê%.žQïç×§Î]¸§‰”ŽiO™û_®Ú�#ç-cÏc„³œ³×E›8ÑfË¢·GoSõûºtþ?–„eÆ3OÌ=GY§áN¾Ü®‘ïg²S?Åžñp°»8äwòa^lŸÓ³'è43Û”»—rÈý^©9qÛ#ûxéqq{?Ë_Ñ'û1Ö¦?¼©É2>]2áÚ,ñÓú •÷Fx³¿„ŸÏ3òâúíoâÃ{׬™\¼¡Ó�Ò’?dç‘õ“p!Äë׆/›bV÷ñ‘�.Þ1â=[²ðMíŽp\Öæœì'%µ©"ï9–eÛÔ[kÌ’ÔïcÕë/ÕˆõÔýZRŒZ¼åGˆƒ'àó†ÕY_=/l`ËX§uEŒ•Õˆ³TQêˆnå)­Ý ®xÌ«'´)?(eI¾yÿjž­ÅÆ´ëQzÖEÔÅK} ÐÞ(ÁA¾Æ+ÐsóÍL­WŸ¾„}ç9FƒuýÔÅ6=¤Æ$ƒC ˆRÄ€çœ.ü¿ë|Tž0ó‘)�8£‡^™‹àj… ƒ,26N ±‚8Áß6 b¹VõÝâ1ww” j:7±¸`ÉRÓ ²\�¥†¦2Ð}bß�@µ füHyÁ$Iƒ6’½˜@�o³¥ œPŽ‘v©…p~í*Ö­è‡K+,–ŽÓábn€b„Pªi¡¶™zà:_â³;9û´[.ž.)AÒ(³–‰aºd:¯Ëóê(¦;ɵn#~ĵ•á?“âU¿~ÌkÍä?ÙïØc~q÷´áLJ¶£±&z3a“ߤߋû&þ�—zø´p~,c�³taû—½Á³èÞGg{J­¬Ål½âÎs¯¹ºý�¹7~ß6`훲‹²l‡¸ÛûÄùsòa9߼Ϲ‹‘¼J|5¤7ѸýÛà YÒûàëätG÷¦»Jøã_Üò\ÇóRŸÙ¼×¯tyï†Q|8š ñ›G,d»”KœÉcp¿ÓŒ[X·šte[S•¼ñÛ�6*÷Ño_™{‰k>ýíä?]¡1dI¾XÌU Ú-n�ÀžîïŠâ¼2p8wõpM}â¥q†»§hÎRñ=³¹;Æ[Ä"�ëçö;6ìMº°u¸j–�ª]‚%úï7[˜j_ÕMÃÇŒcˆðå÷î&½ûÇôu‡s^:LŒøånu5ê5mÃ%–¹¤d£\�‰¨~™ãÙ®&ìLo3n,Œ¡Çž);FZS2|1Îp“@׋•‡hsäf>òràÞ*º§1dKHù”]õXÊÖ™¼Ÿ(z؈!Ùh7A0•—Š�Ô“•¤)£Ó(hšmÎ8»–Œ?:B=:+žcaª¨Ÿ$2Ãá�-E"Ô„.U!\ÂÝó‰*ÓxuaB“*”TÄCŸ;˵ÿ"–-i)9š±´Y+@DTµ�ÍXŽãíÄH#øeŽ\E¯rÎÆ:Þ(hm m=áCqpÑUË…¥† ¶cð1YíM––oÊ©üŽ ˆÔ0¿úXh­÷ˆqÉy±ƒÍ¸`f(lANó#’7¥8Ÿ͆‡÷;h䇯óþÎ÷›£t?% �yw]wQ>PVákÁĨ³’¬j'á¶7ê€Y$Âú¶]BŒL9�›þV‘W¤R‘“élÖƒØSV_~D!YwÖ”Ò}9ÑWÑ›•�‹p©ÄDRÃËRãi*KÕ�epD�À1¹Õ7@²¨c¤F³y8cë�°úz¼eHyþÿ°»»P†zÒ‹�Ó•ª]ê½y_S tb_¼×x)¶Œ{‹˜¡B €„H�!^œÎäQ\U1ÐÕ! Â^ëjÁ úKÙ#ë2* B«¸ð*€EÃb…~À !‰$X `©Ô‘‚5ü Õ¼ºÇ¯3Û¼ß�ý;4pœ=ŸxïŠyTl?R^…�Çóóß øâÞû=¹÷QñÖsƒº&(c>³÷¯Îpüû÷¢W§~9¾ý8}ÝÃx»?^÷?&l¦~ê®âŸÞŸð]¥Ïcý×ÄDÛ}_o°Oï_¸5¥Ó«ÚÝ¡îÙÈDQà¯ý=4¿¾^2ýýñ#>�FóTÑ|)h×îÖéÀóÞ¦¼�Ï÷ÇŠÙÓíc– 7ôo# ßE™MõEþ“r´�Îì”dðއñûÇî#ž"þ™ÐÍÚœv,jR ÿÂWŒ‹Ó~».\?w· ƒ&Ã{=ÛÄ:õÛß-ò¼û¡;·�g�“ùm‚´*È>ó2êÀ甼w{"�³:Ú¨æoˆ­lÕ‚O-¶W„óUØw—FG4»9îÀhü“øÃµ�õ§VEÑW¯çJQsŠ &t›–Œn×=1Ó ›zXŸÆgxñ_¾~±ò}ù~³â´Ã�úe[ðCÓ›ÛaÊt@Ÿ8ð’_�wQÛ½£Ûâç>¿[^½ ï®+ñe®Õú‹¯N>JgÚ7Žþq¿_L±Ïù Ïégå.ÔzhèúÊ´M½òN=ÂPJ>±¿•saöŽçpZíÛ�}“UèâÓ§<ñÜ=——6ýÐg·¼L�ÙÝpjä1ÿ  ¾Üc‡Ô;•ò©dž9WDÊ„c1ëŒ1ÍÑÄSP_3Xù@ÐÕß >“=ZœóhˆƒáØR Ê^‘AQÀs˜M¢–¬E6QŸ‚ÖÊ~<­“œƒlÃÏRžÌ�.ëüݜŽ^­âß b»8 ôI0F1¼@¡ú /D�šægŠâ‰J-�½ßúÏm£ãtú|}@å‘‘Ùß�‘Ø0C(Á�»É0ØÐ�°bI¦"%8@°¤±@ 1§\ ™GËT¹•ç©Y¤§¿»5ºÜºOÙ”¦“zKšÓJÒú%b·Wi"â5ª�¡1·ø ©ÐŠlzÀFšÏÌÎczVö /¨g8pÑ´3æ®áTZÅñ)~¤~ª¸JÍIr�NÚšýëï´ç=²é|^œnãdj1A´%f‘#M4�šXF�…A‰ŒV PH5m;оYåÅÒSÿ¿øŸþvÛ¼&¯& ÔïÖ{æfFŒ]z;j`À:…�D ‘€=`lcGš‚RhIÍKÔ'•w³ä{5ìW¶1‘¥é1œNvUQZu¬F)§5¢cL²p™â!Œ3X�ž HóÇÍ?¿Îýä|…rû°±âþ´Æ¬Œ ò¨—ÉŸgˆ8I4GR­RÄ>éUŒÙ! WÍôÓç¼þ¼¿{^Ù£ÝÙör:eÙ™gÀ ¹­Ò5HåévÚà6j½DáÀ†ÑEvæRJ ÑPj“mqÉ”qÄTUDHBüÈj3ÕAa "ÛVÍÏ�ÐW^`BA£H@X÷Hüiuhsa‚Js6Žg‡�”\ LM B%ù‚“�¢ ¤$–” ‹WP.4 L`%@к:W¸!!%Ñ�&�…à�’€BBKÈB��!^@„„—q B˜�!^ H�+‰%èƒü$�uéðßñø­#Ò-ÇÚ¬¸`ÏØ£ý÷åþ7øƒOõ‹Ïµ§õ[(ö²jý®ÍùQ¶u«‘áÔ-mvïù]hØPhßNë(ñ§ºTFA¦û'UÏô5O1™t%jÅZ«’7~¿«ù×…šE_~q{ø®ï§,ø8â}â·™œL4°y]ÞzM:r†)Ñ¿½ª\ÑZâVõým¸'žy—>]¯]xhÕñÊ*¼�×ñ_=íÍž½4¥¬õ«Çø†³~Çñª!»l6Ô+@�9:½4–T@’IÎGŸÄ)ˆƒÖ<¦²^¢h—þÁ ‰ hÁ$†˜¿}‹ðíµh®04�9*ÚIþŠþ®ÎØüÉ1ÂY€ø±!""¸~6ùqVËH¿—Ù®Q»tgÜǴņCút©_jaJzÖ© jÑûŸW´™>ÔñíH {뉼ÌXÉ©X…âršµF¤z‹¦1ãü2žfkÞ�0tY¡‹p‰ßë·á÷ �üoúµ× EzñÁ!Õ�ƸᱤüÚòAŒa/k—ˆxÚ€bнò×z³§¼øÍÆ41žk¾>œ{_—-#®¶cPlÒŽàÑà`ñÌ£÷>+Ð>Ê—7¡­0ÅŒ´¬Üš³œƒ€‰$_dHFAP ƒ¯?>ÐIĨ{eGíßLwro· ^ÅN@Ò¶r?š(`^ÂŒƒçZòZŒF°+ëé[[׈p_½4RÁéÊ: ‰>«>¢o¥ßr0%¸¸Áã3f$ ï€H=W¥*b¾ÚoÿË×s}ö†Ë�]P…z|¸ÁÙ˰c-%„ª¥µ(æÑí]T*Åâ«SiñØÁS�¨­Ë™1Ó�wHM?þüÆ-Š,Ùa¯Œë퀉aŒ…N-îŒ)LaÜ®™éþ¾|ã"`«í%éÎ}(?w�²xÀ¸-‡Oû|«ëöŸRñÓ~`žû˜õˆ pC¥7µé|Æ‘«mB7‘!„‚ÁFpø»×ªiQ÷ÇÌËRŸ©�t¨ï’D؇v®ìÖ4wóé Ýb ÁúìCÒÅ{§Ÿy?,ïôgÇzRt]òkèùÕº»Ó|^àzÛq Ó—«÷;γ£'O_úÛ–©Ò‹¶ùŒbF¦-!þÝѯU»š³I$q(ê÷ÚÞtÁŽ®ÝµÁ‚¿–Æ-ÖØ ƒ0Ö9ãT�Ÿ¦7¢0¹â Û}²Ž•î ôï˜CÿqzG›…oµnàsô`Œ|•õºË`ƒÜKŸ±ömtFÈ�hKtÏ ÈÍ…|�pÒkR/®…wré.lÝÉôãð!˜»�BYKÅóö•wëö ùïCX=ý{‚È\_s¶0d˜î.÷}‘ÅPúöéö«—?à6ÚaQ�ò5̺{¶‚�zv{ÅÛ5l}Kl `ëìlVn 2�MVúÇÞR}•êPÁ‚ âXâöÁÔXǼ`+ÁO|–É ÁªãûÞ~rB1�_›`ß¹¬ZŽñ¿NÖF=Rš% .¦7˰Kœ%… »ØÀA!~ïwíÁ<­ûS¯bõæ?ýk{V×”t~�Rþ~l/T�‡®½í¥8?8ÚÈ�Ô‚qäø|a·Â>ôŠáøZÆ5̨"î§�Kk.ed»\£)Änû½.i.¶0=qiÌ»´¯ßh^á:w&½ÅvÕ‡�†j‡wœà2X¢2L’ ¢#b:ŽfP>IÎ�@gÖL63ëÉüñð7Äï¥>QDÀ¥uâ£öœBýJ’F)ŒÙ¨ÓK93»ò¶Œ.gyÑjNMléYD)¹äb\ì´§N¸ûi ¿Fލ�ÓÖí§Û¿‘êv܃‚P2½â€Ýã_†SŒb® ó~q{¦èÂ$k#�Z�%q*¥p’äÜeæ 2¸yUռȌ¥›˜U"· Ç È8ZfJJcößÑÁuìeý²ƒý�¡¶wõ-V$�þø%µûhkÌÒ4�í¢Î,¯ÖMq¨­ÒôŸº}ÁåO°ÿUzþ%ÇëågY.Ë&†vÕª�M¦Ž`»õøó¡‰?•Õ¿åLtª[œf*ËF5·®^ã$»§ß“>DÇt{x�å'$×7k†Óɼ^‚g%Ny‹¯¥S„¸æ®c °¬QƒÕÉã7âÎJó�´m‰¹[Ñ¥_Joƒv/æÔ_Šë›IïŽTZ›:L�zÖå7]£«1©oïó É?UàùäÏœ¹¹Ã�Ab³ò»xÖoŒQþÁoûÍŒ³EOòIv�羆Ä5þS HaN~—Zï8ጛN÷½à¸žùëɼñÄ!ca9²Úûúµ©É ¢»ÐtD)ÕFòà­#bÈqH��D@òºfQùç<2:=2—5û.@ñãŠ;IB;µQ7…§3p˜èVÙ�¯fѦ½¿ÚÀk½ñ¤+ëÕÌV•›OEæxC�‹w•¦75}+ÉCÿb�’ü"ù8R‹öQæÓ>ù(ƒþâ‚é¢È(H%ƒ‹éQcsÒö²t; 9Ý#Ì·êPœþ ãÏ(z“\¼c±£;?ü&ýýqµ9Ïë…o vXëX­§µ%N¼Uƒç¿&v`ø£ïÀ’ùÑ#Š×Á“6p¸ýõ¹ EâGb1ÕÈ7�„»cH6@®0jD»BG�Ÿ‚‡GН? óPEl‘õ¨}ï>¤°¦Ê;þU Í©L”üzK‚ü{´œ¸«I{ßs6ó™b½ÍgxoŠ-@7£ÓsêêÖÇœ^lfCdkÜ\/GÍõÁäÕPw­N¹“È®á²V…dµ´ZɯEŒ-%‰\ƒ>i—Q þYÃÐ ÙÐQ7àÓ¦®ág#]*¸7¢pD‘y‘xÝl�à=«ÒåbìXôJÙ®£íŠb×…)4C» #7àô¥Ïßt—ÊÊ@°ssKXkaèÖê1úF6Vè0V”únXzË5âߨÔ¸Ùþ.V¯±¦Öp5û_µV‚·8¡Õ‚Y–ÊÞ)/ºzc¸Ùqò áôoˆP[2›½£X、7¿®ÛÌt�sÎé… mpà±Ý\˜}à}š!�µ·b$"Lü´LÇcÓJ—>êþ÷±‡[Wz;Ó�™ù< ŸÁWHœkñæúÌ^÷Ç 1)WîÍ«›q« ”nÿlb2JY¾Nx-NH—ôn,M…ßêòY°ýíýÚ~Ÿ'Z…稱m¶Ãw£ß÷´ŒöÔŸÈ„šC¶ïðîþ½=ß‚úüœÉ™] žT?Ý÷aÝ™ï=QêYéýÃ+kÍú8¦aúnPÅiIôìfdí:o^-6ÎqŠk]-(p78\”ó®Ù¸xË雾;þ»#ž½�×½,\àÖ6º�´Ào\�ÿJ–rfçö™~�z·3Ë‚Úpx&§7i¯�8Ó»á·ÃYýÓT¶L$Ø4³ÑÁéËĶw¡0?N]™Ó—¢B| ù,d`gl[²Åöhú± tò'v¥ ŒPy ªdý-fµåƒh¸Õñ�ÙlšcP;ªÌÆ5ø¯“~`­˜õ¤’�Ù4¢I�¨<Ù%¢’ Z‚ï2¬î– »6€À7Çdƒ½J$M—;E불œr†žÜ¤K[P1•HJ;F!ÂÑ~¸ÌÉw÷È­‹ß0NvENÖßÇW0h ÃÐí–äÅÖ,¸Tž”¹1[ŸmÃl}h4ø”¬¤ �ßÉL´‹o»á†F»ÚŒ—¶–<Ô‰ñ‚9¶Lâ  {€_„øðfÏ_¶¶µaÓ˜=22Ý !QFéÎ݃»ŸŸw»µ™.+©Òº±ðe SG9ëvõî´û¼ßõ6E÷�ðþ<¥ÚPcè@Duå`UßÐ!�ªIvÛ1üùBÇÛËÆ 6’_ÃOwýtpg|…+6ºØ~LÊç¡�†ÃMm42jÿ±6¶ˆZ‰Çî'ïKË”¥bƒB+X¶AÈs·X§éäacó1` —³ïïæû–+ôÚÅf> ìC �82%+Ô>%f_PëFa/?¥A%¥ö´ðNö&Э&Íg ø(»œ}ed›ˆ†ki_—>ÙlJY ‰¿[9ŽõE¶Å›•Å�ª�\„5ÿf¯mÒo[²¢üC2þpD¤Fõ «¿ú³¿s ieCÝÐ8i: òKÎ7dj7 3ƒ+ä__°¥v(¹i^¨‡Ê¨uZË«#¶�áF$Mú¶š … 'ÖáO) ÀƒþÂÜrA7d40º{¹L!ôÐ×A‘EŠDŠ›ôZFÒû'u¡Ž ¿†¶†m°ÃÃ}� q´5jqß[>ßä„$ ÛçïÈÿ½Ž>­{ À@~{ÿ¬áÜgÊ„2>4 ™÷‡§ºÏ÷”mföôùæqwßÞ–´ÙòyÀa ýg¼—ý_mÚ¶?h /qgìï·ä?ûÄCŸË×ò»}j$s⯻ëÓã¯Og4£C6©K{TÔkß“2òõãk†Ù??­m+ZºY,°-åi hŸ[’¤ÖÜ¡en¾æ ÒÒÌ‘ ÙÀ2ã*1%ê¸ê@”‚x-'lš—Õ|{<½{­ÛŠ67¿¯’ò›2•4™¯=ž5åÊdк¼âFÓc€ÅÍà”¬4#üÐh5öM,˲º‰¯v½�kÆgëÝÝÛ¯ÆÖ’Së—¿8þóµ¾ù7êàajº‘<:LR"¦(l€Po.̈¬Ã—›‡Î—Jã¦M¶4Ç>½çåºi4¬G˜�õã•9�ðh,w|†—Ã4z [E%¶Ý½$u/¤Ñ\ĉ|‚CKŽÇŽ4Ù1/«úñÍþ1Ö#òÝfœ§Ϫ\ÄV:� ýO?6Îaͨ2ý÷Ô«éÆ•‡¤/_Ô GéêœG\-NÄÑ98øPD`ø8`¦4&ù‹%è#T©Çþ¬^Õp>ѧ8Ÿ>ßú¢xU_êé\§ªECqlHö&KB³ÿ)'[ Ù׫@åšeƒåÔö…ОÓ�¯.0¯ÃðÏ�~Û>Äž hÌþ%jÚþa£ÿu[<š0ÐÕ�ê_.—¿Å¢ôÆ�Ô ¬ü†�ü‰t&“?X¯ËUûG©°{Ç ÖðYp§¹3#o”Ò%?ïpÑ/Ž}žYx£%R‰.¸î�Ê@tÙ/|�üw‰Áþþq­?e EVuùUýoòÒª7D2}� ù¼Ÿ%Ë_Ú?'èI¦2]æËl®oäÛOa3ð�õ¤ú)$Ç F·|Cè�¹œÌÞ§ö)©Ñµ®žl¬È½YÎw@Mœc"A¸ ÿ5\DŒ[^Ó÷N¡=—:ÀÅÌôp¯ËÇÿ260ñß8ÇÓmá&‚q)cÛC# ®â‹`�ã ,g½ ÝŸ9ÏçÅ�¢Ï#ûù:¬jær¢‰ÔʶÛ+Úà> د¬õ­c<Ö,½]lrAª•À;ƒïѶìçd8ê>¬ó‰Hˆ5"³ÚÁƺU@þP|¡{byqLùúÜ 9 qU� Y•´‡9›kÍ‘üU'²šXþþ1Ø�V}À†‹p¡üæÌg_„ùc„5¥„Ø¿6ds;•C’/p¹˜ãi´v%³��Úäl Ñâ()R¼ cMp9´ÚB#1lU§ëqt@ȽÒÊM—1m.ìx¤z�âÍP7ãTÍ‹n?\ùªÏüdnà$#2Ê¢·º‚&æ?a¶jȾ¾†hÄ-f[öÿ×EÔ]?ä �¯�Ù˜£{ÿˆ›xq]¹ÉšÇ6^S#à‰4]p‡?’^^õ÷äÞ'ü3|\±ä±Òîo탎:%®þ.`×K=OC¨M¦æ?ò'AÈ VŠ¥yå8-‚U‰÷ÑoI»DÓ5À…²0m¶$jBR Clä­’©È¼½Z jÙ%·Üû®ÐÇòðµoI‹ 9|é3‚/�Í(Ñ·ÙߥtdÇ+Œ¯1>ÅÒ߆ï›Ü±5Kä~R‡MŠoÎ8æà`š¬er@0qVIÇ¢Úô"î ™DR‚ÄS!u‘¸µ‰M4rÂÔ3³Ã”™zo dÕQ&°¨É*5ÁGB…‘ÃS•Åë’ExQ˜€6¡¹«‘…ÖŽ œ•,-ßK‘0áoÖßß9ÔH¾µ€öwX:+òé ›¯äå”.³IØÛ§*á]ÀÓZ³€]“a³†Ô-¶ þïè!*våÅq<1Íç£sê„"Œ‚˜ó^kQp‘Ñmï„Bvâu »pMÃ� a*ޤ'Õm¾öå0ZwpÍc)ƒo½ØW‘î« plVkóÿ^ßd—%bˆ³¤u‚ܶ5Ó;F8^J 9ÈÜ!æ~< hòÇ .Ó�boävz5 ³fug•ˆ ùwÞNô÷¡Ö¤°}¨ü86zBûq…ëûñ¯m‘gžÔ¥1í¦†]|º|~•–ëˆTòŠÐ’zRö¡úíÆÐ©+ ÓcºH?-¯÷ÇŠþzV¾…tíó9éÈíì µ�^H?¸ø÷œºSáòõ*ßJž�Ö•2©­„ MËë×eùÓú„À½zûîfù1ÇHÁÑ)SMXÿ€‘Z“jЇüA³ÐˆB@o2ŒY y ÉzbýÊš�`�Éñ'‰Þ,6,|»ù—ßñŸ"û†n5åçf T|w¸-ÄiÂZq&Ø(¼:B²?…ÓOVo=]]}- õ¥¯W®•)¾]I#ÞŒñÓÛ{‰ï9{î »<)’륮£ü�5¬keÊ,2zô])kA7ŸœÞø ¾•­…1Öëbð½Ù„[ RZÙàÖ÷‡»oóF‘GÛ¾–n�k)PÿÒï‡Òñt_]”•‘¤O‰DŸCù8½àÿôT ØXëˆÃÈ<Ò™I h>4un——Jâ¨plL@¤¦l4ô?T¤(Ñ [Ië„Ï¡à¨M¶i�ìh±\¾Q.ÑPÉ}=ï ƒ¶ɦCðÇÓœœ—Â,1%{´‹Æ58/^Ii!ÁYGÿ6×븸 Cd9�1nûówÏÍ¿¾¶>£èŠ>ô€² �%lÑûñq˜ºõþàeíg>Àº÷µ‡6XúpÜ{‚Òõ¿£ðf&ˆ0Þc@б´‚[î Ñ’GoK#¤ëüã{ŒH¯“½Ìü»ò“f=Œ�„”(Ùy¾@±´LÀâ�©3~[;Ûjtã…rûˆ{½{¬ÿÇ•ž÷d„ ËL]À_·¾„AÇL軦½ÃºßÛþí sÆ‘•7|=DVaNnÞî¶ŒÎé¥^Ù³ _0ÊäfBµÐ…Ž3†X˜ÓkXüm×�ém> o”¡f± «ç+íôg¨D<´+1ÃíÆ�¸]m ¹¿Ý9&L¶«ÐÌ[ÖÔ«°;2{)9´<Ø [GMy ðR¨5·Ak¦Í‘ögkðÁa¿%åÎ'L1wKë°¿ÑoèHš«È£Ã®õ‡¸Sñ;^I¡aôµÑ‚7uµ¢“fK1±Æ2Ç�ͽæ¥âi`ÁκÐnMYGÜ!Yïîíà®~k§Ìü8¯âO�±dûÇÍÀµT¹ûÐVÄ} î<…’bÈèO ž3µb,�ý·‘w{î"¦×ÂßÔÏÍ7rÎùä2} VŒ¸ø{æò×8Úa#š¬¯(Ix7ÜN—y÷¾�îüZ‚Ù‰øDa–F<#¿“ÈÑôRøÂ8f}u˜÷ŠR„øä†Èt…ß–�|AqÙ¶7÷?oè � ©ì�d1.5ú€ç|â“öµ§¸@@ìG•B/}„Ïãµ>ÑF¯ÅTîú°#¬ó��ÑIœ3“nÞ:LVš°“€e ¨Òmm toKpès à›‡ï!_òy¡Ž½ãLþN„Þ…ÇÙûâÛ›iö­bž>'øP'^Xª£E@½1­4I•’í3]+A!F»´ Ø®jîm¹˜–Ö¤¿*|÷ÕÄ%¢ýÂ�“”9~”šnàC#[|Qs^\d¶¶�:–7ÉR “µB!î¥û‡™_W$Ö‰5ç™%“ @P�:æP-†°£Lï†ø°¼þÿˆ PýÓš]’|¥³• vCísåÿ³r'"Äÿ¥/gRl…“¼§öYò‘õ~»;ü½óOê,LÆü•Ò&ü†yë ÿ?—™Æö™ûŠîMèìsêïX¤¶KæŸP°‹¥Iœ˜äG 8D0›$­]!ÄÝꋉa¸tC Û`gPQÔßIwT^$vöø¤G‹¸â x´8×é[v¿®—ÄsÍgóù¬a¥ÔôÆÇ€²TŒ‹ŠúÆÑO±0Ìâè1/ÛÈXoP•‹ëŸ ¿³ˆñzײ¨^óqÅN�äçØÅî?±õÆg8¾^a–A®›7nÝ÷g& ÊVÓ­\[ùƬE ¶†‰!ÿßíbF^µ®¸Øò§'K†î-9/c` M”I'&"0 “Œw½o7<ò*¦¥ˆõëî'—‘/PÞâEc} 4ZdB6Ä™13z ä}#Éšo&¸¾2¹ëàJ�ˤ²n³(¹”ÝëtétO~_œ´FWz¸ÍK®Z­mζÕeÌä½õ9ÜŽ˜Óç¤gž³ŠÛK¸Ñï¸!!%À÷OduN|ŠéSË䷨¢ Ž\Ö˜B0b�1#vÔ@´’Ü”£\åÕ­£º6·g�ÌçäKŠS`ºf8ÞGéú§Å7l>àý©ÿCo|™Aø0æp�Z*ëàzÎEø[÷�ç!ƒ¸$üù¼´h%… „þ$;È{mz%™ñ]ýŒOÌN7‚ô]y ¬ÖÖÌöÄ:±aÈ…*|Z� pÐ3s ¬‰ÕBÎÌÊݰ¤ihóÈÎ.&‡¼V,94í�§ž1…ÿ>ñS·zñÓIÕé´ª liq\—ß- ÞULó蘚 AÊ&ÀÉ)¡PàÀAl %†§IÁ»p`Å�X®7AE’]:TD@ÐJ³Šææp™p̬Oœ%ŠÍ7‰}YFq´œ’u¶Ùצ-}¯Wør†‡mkA8@ÜóhkÜöhý°­ð»výìੵ£ÑÔÔÈU-R¼ßwt&áik¥á8̈ÚKtŒÔ¿ƒòÉ þÞ…ꃚiû¶ÈjG¶BZƒÝ½m;P»Y$m˜7‡C9 $Zþ¨9JªŠ¼¹²J¹ÂÞÖEå˜gظþ€A3ý²:mm¾¬å8Žù¡.#æ´­/ºÀd¥gÐÄ�… ³š†Hó‘Wæl1þ²·¬{çUˆkä dÓýý¥² Óke…É�8(üö-„ÍBj�(”¶Z÷å2�œF+]gÀ}×i´ö‚rÒ²ǰn‰­Å¸`�e1&qUAX“F°°â¾�ì÷¨xsniÇÝ�ÈÉÚÿ_œJžöLä°?1bå{‰�à)B½¥6Ëzˆ¸hU‰d+¦STØp*^!·”Þk?„Ü4íím¼Åûê¾"IÛJé_ªH¡ƒ�ÊôÛØ..« E•:ธ’¯2;œ½¶$¤VbÂ`±àݩ晓Ï9†–±DÂß'¾ËteUæô:Lè—Úåx Ýd!�CÍíHÔP * gI<ñ_àꪨ©¾/�Êéª9:°Ðþíð–=å|¡ý—�»¾þ´Zfü³µ;Œ�›‰ñ�©(…› Üâ%ä½èBC (!ž{óž^\ÿQÞæä,ËKcü¦áé2¤XîöFÃI‘ì¼`ÏSú;&YX£½éfÅó—óbÃý1)ƒføc§ûÓÜQ ðíz;±HòП`=k9 kð$ÑgyýtÙÇ3w~Z/‹®åψ¨ÿ 9‚ ?�-Ú8Ë$üÐnK†!Åópû›²ImN‚ñ ¶'F½Zû/�dQn@¸ø?I™Ë BÂHIA9ä¦Üþþ•÷èøé-Z‹ç±�gq\W9 üÒ£JÞE/c¶ŠÖÑ![@sD+_+¶dþðo¤O‹¤È Ñ�_Fq¤`Ä…â?²”AǨÅÖÎÜ)ïnZÙR–-UÅbZîã_‹uD_�²~ñä+©Œx~â¯íëýœØ4çÓú™Éû2¾ói®Vsaeá`±saFI€ªþþÜŸh>M\1�Z?"ÿš<þcˆŒœò� éˆCÈwÍË’îµìʱ™ Œ�$“ # kS½h‚ ü�@-"Aq©ã†K‡Y¦ÔE‹:væðsÝ]qJ2nZç{¥ ŸŠE{Š|«S?ËÁ‚ÆQñp.{Ì!a?â>¹¼:?|hW/l²¯;È;Ì_‹nŸöÑß&¡óðdšDHç~öˆá‡t>Ng�äÁÔ€žéÀ³}Ñ”xG™­nk²ìšV™´Ê¬¨lÍ0̯Ïr þ1TÉ}5ú+/×ëKõ¡©ôä–¦hKP¿Fs�NâÿÕ?×+Äa÷.„Y¨¡FØ1v:yŽL6ÏH.�TJ :Ò=Û$eØÛ;#»:¸¹=°ìB[«ËžtTô:¥Ô|lбÝ-¸W1~ʾ¸p¹�ÇKèËKþŒ@ÿ�ËŠkà(M{‹ö›å¾ ÉçÙ6�È[½\ôÔX…š*Ö½vlµg(0N g[.6Óp xVÏ7�öx…LcÌó’§>tõî—K•Ùqȸ½ÍézDxlÓ Ó+sTøÜ•ðŠ R3”šŒRà‘‰«|,á±R]<.4>FKì!hïž)gF*ú#µÒö Óªf„u¾bgÖš‘îK ÍÅKóÏ/\IjçÊÑÑ9ù¡ ±ÎøË*5^î³K9’ªDoeRË$ˆøN¹]„/“¥Å](��°³ù™•’3™�HZ9šmêQ\ ôFŠõ}?²øs6”Éaý�±åÍò“£=g/“#ÿÑmYö‚ó•÷>À)7û·Ö"kFsÅù"äX-`¹\‰º%·½ùu«håÞ{§ç>½vôµ”¢9[FÏNâmõw›1«¹ÉF&FG¹¿ û:Þ.±½°jºëªÂì\‡åy^ƒžu7äO´¼yïɾG~Ž0N0�wb“—9^^ôöž§õ²_K?õøzŸßûóÄÇuÚÌüѪBáÉìô?Þ=²Šz�¯‘kQKà¯ýüû§Î?Ò©¥~v¾1œd| óîìv@…ök×ÖeÏGþL45Õæ!jyÁÚb]Ë#9ÐÔŒ„’_ÜøCûñ$ÞÒ€ˆ2ÿ¿®jÿŠ¥üÑ£þÿ»6ˆaæ³úL‡õ­v�¿÷þÿøUx¥/¥Àe­ìXj¬6n$ÉI� \Ãi8QßJ,°óJ—Vàä¬E ë3pù¢úð ¹ à+ ðÿ€¿å´µ‹Ô^͇ý«ÑÊ¡ûo€Ócü[ ÷ä‚¢u©|~i»ß6NZ�Q €¹#¬T5hN+•‚A¯™°6Ö[.FŸJƒÙŸŸ+C£VÛ1ï(÷¿0¼bÔ6 ¤l‚]¸.QO¥V'ðl_ÿñ/hÉð¼ßxqéѯx{°â׿­«s¹+�7«~îYÊ®ïÜï±�-n•›KÀþÉ#Xî´1Œ Iõ÷¬în;OÝÐeaŒg6×bêQO‰¨Á ¼`„‰|¿CFþOÚ¶¹¸�yo]¨%ø‡1ìb- =ñãg¬Ïáó]µAùò%¤)ˆb èõŒ®ú)"]κ2/^ã]Uø€Ù>A¿…�-(Û/Â>çÓ…û½‘³»—N™À5—gÜ3 Rª¶ÒƒŽh´jÍËaE‡:®XílZà•ŒZI!“Ų­¸¥½Ñ=÷?‘nÜ[ôŠ[mõèûU"ËÁUðxÇ\Ûˆ›¡Œ�D¸¡ÜxÑXä“$§ÔRÑ»àáñ°/m­o™\áÿ#­û‰i7W;Œú g �4‘^lŒET#Ú¢¥eR= s&ºÎæÃ1Àm"¸²"‡´J·\.ÁÅ�9ÝÊûw±éNtÊ¿ì¿Öaý¿¥hòmÊFENw3¬�y¶BB’A†Éš,ŒH´üÖŠ!CMï¨^\ŠNå’,8NGÒ¶Ñëó¥û8ÿâ9&4ŸÑ~W.µú¬ïÍ�äw36µ�À6$øìß(ð¬sþo�«|ÐSvs.ù8‘t¢x?ƒÚX'ÖQfäV;tšgÛk‡§ÍÀã É»|î5‡QF@œ†.«V¹l!$ãª4p99Š1¹á"ÿǦb ‚©‰�<^å‹Îuó›!)°æ`F·+¹ÚHF¡4žžKì ?–¡†^ºªEL‡vÿ·mw—¿5)ouv4å7Óóà캸N%1¾êõÞUžbv·K—ÜTà+8œÿ¾ ?¾åì5q ¸Q.D“\ê÷B!ÏGX6ı(f3–�(¿Þ°«<ÞBzXL(Œñûf~Â|·ƒ­—F²¹” P¿ec¿Ã!=ÁêæwWÇ@„XïS]cðn¾%õ…õ{ÖùZ­›ÇÀÁÐ÷©oSå³ý˜td×ñ ”ÿšPøÆ¼•ƒ&1™;gPlA€bj¿š>×õ¿e—…EŸ ÷·~_v3žÉã8=2Í=³‰ÑWI1-uOÛ’m‡f«ßÛþt‘®—⺕ÉÍÎ òó Åßê¾‡Æ¾Ý ÐjøÄþ¾¤~„Ïí½ù¢ƒª‡aX«?¦ûœpâJ±‹�*\>Ñ=�1} Dý·kÁ$�±¡®m�ùsá WsÏQy?øöV{~‘ø³—ûÎ]^§ïJFm-̾ù•?E_í-»¤uEưg:ZŠJ[ë�(÷5¶”*›‰8 ÊxÛTUØy'g>­io|†�e¸l.\ç:†ÛœÜÏ¥vèB:Û …£–GÝluÖpÄ«6Þcéá·gù=a€4UsÚ©é½´xqȺ-òñv®N Ï€B2À¾ØÜ°;Gª£ÝéVûæs­ Ac;ìŒ<<8í Ôq ]dÞz\—¸é�Ù7£—æŸX²Ý0‚;}éRó›�ªXð ùQ+Þ¹") -„åŒ^XÖäÄW[þNêr–:˜",–¾=:¬^Ú ¶Æ{a{κg:ëtä#ù! ]1¼Îúó9[{ìíÎ ñ}jfú‰UЂð�„…fÃryOw_þX½ËßëõÏ£%�þBǹ«â~�ßÀØîòç�zpáþR€R¾bDg­8sëKž"._0†§ƒ¡Ïxò*«§õ øWµ[?ççÞ"Ÿ•ãû‹‡Eª:�½—ŠóÛ‘Yq~É|äÏ=#æH™ÉTx÷åÜâ´^yõ0Kƒ"~^¨�òÉ«xü%-±O,Qãz»æõÿËÿ÷y¸w ³¯½ó0b£·Çq˜œÝõë,_¾è-†Ð¹üf—m~ƒ¯Ew> hØ? ~-‡G{ æba,ve €ìòT÷ mBy ÉQh[°j“,2Úô (‹þ›p,ÅaŠVŽ>Û�2²¦$‚ Ý?S+k7Ö[Ýt¨Su›ýxûÜ[{˜b<¡HÒlþhÀl ‘Üþâ‚À¯ÿlf‚ x“øJ-ÏÔq‚Vi«?FÜ´IjtWñaH‘_5_>Å.+À'æ%–f:ž>åv(~jrE~#dõNäÌ}Í�ÖØÖ¾¬ âÚ>• cþ_£ŒyŽó$$WtÝäxPÖ´†6 hÒÚé{Ñå¢í  ñ3™TáQѳ‡)r¢ï J¨ä¶Xáœu4j8xp«�}µ™ÙÀA‚¢^ñ9ºÏ²ºhA` Óêö?H|“jZ yK*¿Ôò; 4ر^@ýŽÄVàª×;}¢73;ø®½›´ÕeûcäXôŽe7Îd¨_Mðçƒòåö�Å„xЬ*>ÈÌüƒçî�Ï}‘uPá�È4·PsŽ–œs…Pº;Q뽘}‹\ ¶”`¨+õ KtŸå l½è_z{Sk;Oœ6{Œy¶efcü_kœ0ÿ¾�ćËq >l�Ä+˜8 �"�0ˆ˜þždk6–ûa $Cvv“öËP1×€Ùð o¼.Š .%—éÐá7‰•Ó­œšÛwzöóцP(�c!j×é b¤¤,dF!Оîµ#“ÈÖÞ{¦G�ì 6ý|;õB´zŽ—ì÷¦g˜E+ÐQŒ3j¯w¦¹®µCÍ�ÀßÒmþÿÆÝfÒ€‚¬JÔ°ÜI°@¥Ä(£•æm€tÂlëxTMg–ÇÛáp`¿ä8.]a#›ÆifDÜ9ƒ0m#ì>3L_0<<;:rïpÌ'uëª| O– ñ]P=Á”6}?Øêì <¶$œXøW¼õ:‘ÄùÎP—]Ä|÷z¹§ü÷›§Þ‹=}.¼á>*uãä’dÐвøþæ÷~¡&Øîüis÷ˆ œiy^:5Sdœê�ûýàh¦„v_húH,æÖ¶�í=1kã‚£¼ñœom{î„[+ñm¿¤Ö dûïb¶Ѓ­ßæ öC”Å.;£{;èíúñJpzF=…³ÍA­,uî9õ¸~Iµ\Äxòç¿ãQá¹"Y†ÎÎã‘úšÿ@CçšCöè¶St>ÌüV¼R†eqZØÖ#¥„tEmF$Œt}së¾ôWÜ¡ùÕõRÝ듹ûâ+,ÖÛª<•~Ò*›:x˜hÑ›7|é˜òŽ+|±ís²†üìÇåGÉ¢PCÚM´ ¥öfÖÁþ@WŸ0þðž±î†Zåˆo­G‰ƒ‰jb.¢3àÄè'¨ì°c?p…Ð: Ã{>zF_¦gƒVêÞ7@J-L×뾓7 *ž·J§.+Ï Í³D:OƒR£ê`Vg@ŠÞÇϘ dõeÐi‡k2ÔÒ(¼0õ§XU¢:�v…xnÿ®¡†ÖÓZõ®|-w¿ÿ"7®ÄXEõÖé.xGyLÿÝÕçëàÇQ‚=½ºûÚ·Ê.7�gc/�…A¤ôÑñE«H‡„på““dy:®ÜܬD”sWŒ†t¸ÌM“rORbõ:6b®´h��bÜÛÌ|Ž?ÝC‚p˜°’°_Ó÷†9ø‘—ü<82E$õÔ{A_a\1ÇDZõ‘yö¤àVøéÊx׿¿¶ÝØ|( øEÞ ƒÈxK*s�ÇÉ£ˆþ�7Úñ‰U'Asn ã²¶dÆ/Õsÿ=?EÒ„2›�%žcK’…¹oÂ\ÀPŸ­/Áº** }±hrËñ[øƒs eèB™É6–Å´B#¼†’·ñͳ~D Ç/üY1¯¦mUF²¨@l\î<þ!žÂHœfíbø²7¡*¸¯®-q&% ¼ ¼T ù¨³µñæ2Øò™VJ ÕBºéVõ}ÌÜÕx]UžÐqèŽí:c.PV_Ýå¦ÞCÔh’àÐ…l* eY>þ 9—èóåÍ�è2 ãç;™C˜sBô®}�=Ç¥¹¥��óÕ†3¼ØGãïÆ©ÔÔ‹ˆÖ²Ÿ;‘à¹c꽦ð³˜|–&xB¯zÏvÇ{õ¯Á€�èÃîxÎm±æU=H’î[|™'ÂÂùv€öõ,ÆÉÇ7ª)׈J÷*­UFÝ}t¸¼[¯A·] øÇOÙÅì¾@>ÝeJ’@0”Õz¶#¹ÂŽà¾ªÆ;| {™~›ùÂÆ¤›�r'³þÆ‘ëûWOpø÷Èõ¢*ŠÜ»Sž å”Ó±™l�åž.¨0ˆ*2CŽ�CTd)ñ-®54{ž¨¾¡t ~†kI�ˆç¯'~»ªfr[hâãÜ~)£d^fób$ó-¸C3Ž%hæ°[7 køÍìWoÄ­‚¿ÃØ-“ÜùͰ- ´h‹üVÐû4$F¾Îð/€¢‘Úù(bnÀ³¾Ò„ç1¯ ïos¸.-Ý/â°Ø“­r¹úþ�CQ¥Ù*of¿ˆ&—â Eñ)¾ñ`’g'—Ùÿó` <&Gàåv1ðÅ¢æõÊÖèggCc"ü¶;å»7Ú,Í*ÈI·¯up* ߺ¥6uŸ 8-°y`šËéÓ‚Z†ÉR0!$†ÿí/l6¿ï~»}ñ_ÓÜ—C\ævØqæà­•Q›9 ªeÿ�Ì97A½ÞiÆÒž¾÷ìß�(flCÚ±ò<6üÍœyV ûÞüd|þM °“=-¼£ßðWèd¾â—ï»WôÉcô§«÷^MÞÓ”Ñò5Æy�Ê3Ùƒ Ê „`CÀÁsº²œDÚƒükõWMkSE˜y±BlLc]:�xˆB,€Ëwåû¤Ö+¾p…)â m³Çâå½ìc#=HæsT-I÷óR«ªkÞä  !µÕäýçƒÌÅnwBI1@žÙ~²NˆãÂâú`…¹a·ŽU¤Öy=¸d“˜Æ.2~]9œL† ã÷û—îLËÞËü‚Ûâ+ÿ"5w�ûÎDºªpOKóoJ¶ÖËKocgh¿Gÿ™~èkÚ³#0�iEå��m*ÜIhù5¤÷ ¤×ZsŒÛÅòVêÉ‹°÷WÁÁëeíCn"ÛœÉÓq4…dš¢P ÇÖlsSnTwê«X ¼6ÐÓßXݵð�ÁàƒÉŒÉ€$¸Lf:[ (€Å ëäÎgFgn15ˆ]òv¶ùeXb³Ýç¬l:�a¢Šc¹¬pÚ.:Ó�•²WéØXL|þ¿ÝüúMh²üÅ?ê+Ý�™'ŠòŠfz‘‹ìq«ìëÇ^v’JÔƒ&ÿµªKÇ~¬Àà†„ú”™ZÍ/ ˦8%�yV”ßbª‘kqí½«�•‹ÅoxK¾ûeÀk׿¾ßi’™/„[(Š˜gÑéwj&“!Ž’4d�mÄÄØsí¢·´”ŠD—ªÃ*|£î�ì¥q�K ÍÍÝWµys¼Ì/pºK¨ï_´ý_×=H¶OMì‰'¼¨W^w¥pg ÷™æ’H?û$$š!LBI $‚w'«|#!õ8EúKïIÞü³M£ïï?¤ºIþiŠær‡;n’ôÄ�saÅŽžÀʪÇTu"׿u×[£©?iÑ ÓWݾöó€GîÛ�ÒKƒUŸ^Âë÷Xrïñ£kÑùºî½ò¾°½¹ÀHø_ür¹hú›Nfo¯ {7¿m™l’“ç/�茆‡1´£Ò&×Âê2².ºýœ?Ó‹�þl…GÃȲ„ÆmÛU_eù¯O¡ŸÅö=OTF9öYºÃ“|•³Ã·“�Z¿yKÒòQl€ÅçJ;×ö¤YªK‘�ùØúí`Û< r<8Ú1^óBO…)íE ŒaEúü6µgWað=I?œbyw}G)÷I‰Ú ïÕr÷Œ—Píæû÷Ÿ~ý?¶êf䲄¾. 9³P)˜ƒ tý¶ œÿW'{¹'7Ý”Zoi¹RK£)5ÚzzæjÀ2k ±ø¶YGÄkB,us ÞÏ™2‚3³ g8 ¤ÜA@?È__ æ9Òíé/ø12W×»x Ädõœ¯½›yÙÄÜ{2§ykßÑyzƒÛL3|^!‰äæpJ÷÷%{ÝJãqýxÓ”uŒ>éþ¿´þ§“¸ÃÈA?'Õ4�¢’»rID˜­?×Pí¼8}l]_:bÊÜ«R¸KÞ;¶?ÏG�Í·~q‹�ìt �`øµÑ*¬¦ÜQáŽéIûUâ_åª]ï÷Ídƒ8HN1ë¨; a ö¦S+4.tØE99f ¢ š.`{û«Ö/=|Ï{ë|‡ÒÇ×\ ø´î-?žnä|!š"ÌžÎ7c7g¨P§1L¹ôÃM%cf2 "y…€â«¦ž„+ß%IvÌi‹Ƴï! ¹™ò¸|�sóg29tÈ`2FAP_VÕåKàµh¨L,¥z¹Bá„Mb®¦, �‹ýoPô‘�ZÌ ÙZ@@H2®²ü&Ĺž´ç’ЯØÓ¥a³Âñ‘BÀ×÷»r*ûñiŸ“}‹„ÝñõúHTŸ�è‰ÝhŽú8HN _%ÑÞè-ã_B�èô!ç¾™;¡käË?îk�Ç¢�yÝ•"UðníHlŸƒþIÁ�ÛŠÁ�†mÏ.þ&²o Ü×=6½Æ“jø‹£]Ü,Õ ˆ ÈÆE;àòŸ‡äšÑ†‰Ìœ×KRœ0M)åÙÓïL9FÕßxŠÄ~¯ÞyÛ4j5}!±þ΋h³‰·7Ø­Œ:´É "�ÚJÒrÑ[š¼nöÆ78¹åÁÆÔïú%$ÎqzUIª½Ú½>r³$pÜöx$+®°J¨ÉFµƒæöÕ¡§bL‰UÿÓáãX�E'Ç>i®žé¹„¾º©B¢W OŒÁ] 8ý ñ=ÈÏâÙÊ O8­¢»&Ù4ªEQÌZ2ïÞm=ÜtÓ¨ºåñ_!“ݵÝ÷ÕÎ+¥àþæ?eÇhÿéþ½ïEΟ÷ýïÿŸïH‰tœSø_+ÖÙÿ©”ÌÍ;ó jÜùéÈäÊ ã[ ¿¦Uc‡ê‚ê>�R|gšþgzÁÓßʇ:Öo%_Š/uåå@  ¦xéÖ�Œz¨ ÷þ�’2Ó_]�Ç«ÖqT£ö”úßì}ŒXÞª÷¼� ˆ‡kƒ¨cTƧÄáÞû¯üxK=LívþŠ|1®Ð‡È˜ÉõºÚÞ"ÿ_šo±ögÆá.}W¯´`…juê Sé{Ì ã·Zôƒ‡ÿ�Ž3ä.�ˆpBA¤ÆMâ¹}ó=¸ÇÜýCõÁäw[åɶO…`±_ë7XƒöþGâ§ŸŽâ �€‰^˜å3Ô&sÝ?s= .ž^ŒÆ„QO䨿�b÷u¬éßÔË¡§‰š­žßÜ2Tì¢Ûæ‚ͨx=¢´¿à†qkOh4+ áMXb‰¹)±ôºÞöâÁ¿ôØûÚÈé­‰`ãtžü­v üÿÁ\¨ìÇõõ>ž?czÒÚYhg*þ[‰øï_+y¸{:^3|íbÝ'A‘&†CŠER$áÐó#ƒ2Ûç ;ÿuQ´w�‡�šÙױɴšóå®4Ä®ìh‹¼à“ cA�JjœÆkEz/L+bÿ¿~ûޫ닆ýäû˜‘ð[ãBH+=³Ú·À‰C©5îø£Ÿ·7¡Ò Nx0fR|nÁ…"ªýycŠR/E÷••ö/Œü”�Á«�dÐSïÓ}âÁÀš¬ø{Lù�!èì‡ÜdûªcgÀP馶sÿÕ½Ÿ(nÄÿÁs¯Ü»‡glIÙz$Ävi7}~ãÙ¹Z«Å÷œÛ?Ûê^3Œ{¡µÐÛ�gí*sâN¡ŸUàÑ9¨=²Ž×Ù»¨�\½ xŸ>(U­_-`Â7Íæ9õ ª–ë_šLñ»£‹¶Õs®Ž l ¥UÞ‰ó†nïd5"3Þ—œã‹.øØÌl0t á/bF¥È<£ctzôJ™ ¼“±sLщë–üRYÍ`Ä¿Ì 8\,�Kõ ¿!É??]ÔÆÿfH—�¶Âp‰Ÿgš,(¥9{7þ!}��Ê_…ÊeAŒ™t{ÐÁÔ²vÓu”C�Loºÿ¼å×i9.—Vs8mi‰¾#kÓ¼¤CÝ—/q€6§ñÙ ÌjŽê@Ú ðúÆ6Ó²j+æüV—å{) §GÐ<Õ¼  £³ÐƒEó^zl>�>2@ß�ÊÿW*óÓÐç>îùÑña/䯇Sbj"ÏÑ÷Ïíü*÷;ß0I|Ÿm“b™ª«Ë„…Ño>Èü‹éÊç)Õý‹(^Úá rYý÷ÎAð—¬�ô2BžÌRïD=Rpd…ù9wÅÒ¥×_²ûO×Éëk÷õ»o °ãŒcƒF$)e"¸û]£®kð+è®ø·ÈÄspÛØÏ¾Ég"†P`ò‡A06³���n[»‡ÛåˆK$ 6Â;8¿áÖ Lè†f5cÀ�©6`Š®­Œ÷U(®— -c·Þ[ô™™ûrB½‰I–ýµÙºé{k¡7’Ü=j)©á\—–­/1<2æ1 ÉvÐ/ìÕ Î;²m5Èj³›ÜBE®v8ãú?w.6(=óu¶€ydGi ^Nb"uœ�f£Èÿ˜B�y·þ¼¥Æè¿ZM¸CBñ¹ûvp2N˜NüÜ?¬.(R“‚lV$‰6_k–ÊZŠ\ «¾‡»1¶Z“�2òQêˆ:¾-‘œhýQGN+‘´XJ|ÚÏ]º£Ù�Õ@tÑãšÅyNÛø]2_öÖ²p}Á_×~ôpdkŸ†£¼�µ¹'+ƒ$7Pò™Ñ…üy.HüœMë„�g a:K�ÍšÍÝ‘3 ŒFì×M&U«C^(³� CxXÆŸ¾?ÓÊ÷·ç ½†¾Fšc2K®/£` p�E|5î�DÌ[qVÝ A¦Knô³˜†üIvÆqÁöbp(°"ä͈~>Ïðž‹ëFgm)2âô·tÕÛó‰žv>¶ óÜÑg€ñ“îuiIè-az4@‡©Ãî1aÄ 4ã(oð,âã\#úËáûyòŽ(¾rJBìÏr¤¿…•ó=BzQ¯úô·œU%]##¨´',õŽ�¢K2 êxkŸìoQ …z>fPàŽüí•7G 0üóóãnšg–Óí�ý³�%ÈO’^H\'Ýã[Ò‘.käÅ›º÷»—ÒBjKøIãÛ¡ÐöDÜü:B»’Ë“q{×ÓäÖ›�4##ï”ÒËŸ­p_/å¡°ô¤;)CÌ“áëÃ)‹¥š'¤:ŽO‡WQ©˜DßÂe|¿{H»C]Ecˆ@Ú?{ŽA23¤jÔ¦O�biE_‚?ïÏmxm1÷d°WëÀ¥[ëþׇ®':»•ñp} ÙK·±.ý̤=Q„yÉk™Q7µƒ]ݺ�_Ï«éŠúÐó)çœÖ1ýMÁø_c]°Xw.W{è?ºº£…þÛ.ÄÚu¯c«šPÝæV¿ì«—=ú*Óâ㧺·9Š›êÝ<—Ŭ„åae‘ÆrÎÛ�ûùÇdRø:êi>µÎÚvgÀã‰eÓîÇ57p˜Ç^ß’”#=¢xðû·„�×$N{›ç{X@á{Vˆîú•Ë�U6è~ñÛ÷Õø¯Œ¸ÈÆïû9έ¸“&}A}Å_‹�»H;^øâ9ôð­…ç´Ä2¸âà”V¦ÛHaø5-dßÄ®儸,u~ú‹à{æ‹ÊÈX�˜fà[ÿ�@¼.M`Âì[ø~CgUö*Ô¤C?S{•úwßê¯ûêùÁ¸ÁZÜþ¤6v��ý–hÆðF ñõvoÕ3£›sÆvKc0X%Ò†ÖE¾[M\óøM¢oùwžîg´ï~ƒµÝn¬h&?¤Wó^#Å[ 0>NcW£é=îƒ4ØìZÔ2í`é(›¨*°È²¥Œ$(Øb†º ÆT¤xÅr_A›7”„¢U¨PÙ…Áš}®&¢¦Ú6.GsäŒÚ·M`¥¬,2— ”6‚š!œû,±HÐWÄó$¸6<Ži ·|„H&„NÇgà*áoMõÚ�AîGqÑr×ü²›„1]i^Ý›6l¢Ñ®þgÓ�D8Ö»¯¨åç½?Ô³ãÊ…’>?¹çí‘bš[–<½œ62?�€cI Jïï÷Rï³a±¨”úòk‚™±†FÌ�pWý8uߘy¯<ýúñ3ó“¥Ðmìß—¿©S¿á _àÄz5-oHÞåp¤ç’V\*mÀ8”j”¨fš·�eJ.ÄÀ~ TŠ€é*¤¢¬{³+Bî}"o�‘«“H ˜.´Ó±‹¨b±h�š"IfzŠTÕAT’F6Ž•FŽb,…(–ALõÜݪqÕŸ¼:âì÷û±‚iU Kå–âj¿øêP­š¾Ys2]}Üû çKµš¼÷{|6 ör¯RoþPè}v†Ûh¯ŒëÉœ7[êjú$zÑ>$јj1 ªøIg¾¤Û;³¢ÕNuW’Zí_fšYÆ`Ì¡LI¹T¢¥ëвfo0—Z3tJIL³¶ßCE›ÅúQ­j[5y|oO­n‘{(0~G}–—Œ¼²£90K:šJw¾F˵®ÈÞÚ¹fŠˆ’´åY£gàÆ–·×±ÆxãmTò+¸ò×ufÏt½uãíxhç’‘1Âɱ�m|„TÕd�‘¯7>.°s“âJr5s]">Xìc:é›n¤[TN™›§s_ý­lIŒ\ï,ú³7BõÚÑC=xã¼·:—-¾IžÞOp#DöEÞ¹@“‚/|€ë“‘««Oÿ/Ìd&‡Áœ$l{©ˆ�{rx¢Ówd¢Ž-\ù8iCaÿß�…¶˜ÖÍzÊ�íÜêY¹”IÉ;þÏ·5ýÇùõ†LäƒÓ§2yEz¹WÇoy,iòÊùˆ¯£i»ÆÄ&H97Ò+Õy?~½`ê/‚$œ‰1âèIÈÒ¤ÌFHúI2ÄÆY€†O_¿pañ'{Í˲™üŠþ¹o|Ø|g¼Æp‘&Ðͧ%â>_w8¾®‡­Ú’9oj+kè¨ëqpë;uÙ®¯}V™ÚgRm+TU»²O• ãqÚ&­ÍÛ¯S@‡Ö& èsÿÓïáÆ•g:èH?j¹˜¢åx±œ²|±Þw ¥¬_r#u0¢éMéƒèþ{ÌûÓœh²Z;ÿ#íÉ‹û&hmm¡Ò¤þ8U:Ú”Õ‰*°]5kÉݯHX˜§�ƒš­a±ÉÞ é¢—º“á#eŠÃâê.ÒäFÇ›¶¦¿T¢ÒÆÐÅÃ1ºG™Ö÷œÃlÿ´å”9ÕkIuhDøÒwQRÅ\w©l7ÅÏy¾‹Ù9E¦ »äpÇ|ë&à£8J>™2Ë£ Ë…2_1Ÿû‰b^B_Z7RÞù8­Ç£w)ë¤Všžƒ.g�OUÍËón5t„åSD’I�WѸï]»ÉÞ\"º5¦2n¡ª #îi-^wWˆ #a¤-í(QHnI—ëRŒL÷ñº™ìüšBÀ1÷`ñ”mã¡#ì8¿Ž¹ ðÝM :™‚˜tÖ*UaXÍ/Oôå9Ûñâ`Õ”I1šqS•Qs^qõK\-}L³K–”!‹ÜqÞžül450pW(ál‹@XZÂÊW•ÿö?jÅ¥÷û øOPÄÌ ÙhZíþQßÝĉ��©Ö¶´Cï\\¿dÏð�Á“É)á4ÖÌG*ð?ûüV§x…v8m®?µõÓÖ“Üý;H÷JÞt!Íl¾�pNÎ’Â]S:Ö�Ä}wíèwä{úMŸÞ˜xí�§›Éý:q¥ó꿌ö¦Gü¯·ž†4ù½eáGSÕøYPò?kX½\Ã>p¯ ¥ÜoˆŽGWРg—µŠÖ7^\a£“}Æ¿ú¾ð7¦\Ù¶¿sÂPͶ.Wy â>÷¼ëi9’ K�¹^Û2ßBšøÇþî w>p–œ_çÝژϜP:˜øøŽ]Àˆ,}sÊ̓Ç/ú°?|]Á ¡„+k&Ë=È÷®3~ê›áçÑw}Vc¿ïÏl—×Õ=ÁDet~Ûp@†ËP?ò™¹"ø*»¶y¬)éùâî–r'LÚ‘K�*rÓÁx/ʳ�›hÅÈðÃ?·9ó(}S"Б‚Ñ/ØpIÓ»ÜsxI”ØÞ,Öû ÇŒËs¾KkJ3µcÉg5væÃk³Ù{­á±Ž k¿M¶ÝY1ÝÏÓkoAø“›—$I@)3úµ%4 ºY¢‰k_›n !2 ü8Áøú3RMêùtŸ“ä«õøM‰!~˜Ñ)WO%ûG”: ñ ˆL3ÐÜæÐs[æX”~Ÿ‡TñÛŸ­´É •�GïÃuprr�«ÜÓ5®cyé_9,/ì—+߈5Õ-À×ç@ìÀݨÏðÔ}ÜR2Ü�‘{¢3–/ò ‹ë6˜¿j4s(_G}9×è,×/°&è-·5|oß Ü-×&4!¢Eû`{eègòU ¹ˆå=ät>�Ü„�G&- DüÀ-²ïÂõ£^þwâßGÔR æ|ÛÍPAn–ö»…ÞV-¾ß 2Xr�D*ch¿ŸïÞXZ¿è›=/Ø2Ã}ºvûûô;¸ˆ$­]ýмU[3TLª©Aärsæ¯ü¿^ؽuÁò¥‡å`ÒWÔ ¿ÔÔåÂê¡{:íÃÌn·òáȺ§ó¹+[Hc¤)ž”¥”%ØÈ–!yûF²Ø+Qt¾c¢’Çþ+o/Ò/EÓn1ôö5tu.(½Éà†Á*ñ@1\ëôoWC›}œì.Ä7 ØŠ; dæRÒÚº‰Îv%­,kt@ ‹ðs–³¸iÉ'‹D�n.Jº� \»§Ú¾ü5lÓ=çXÙ‚VÍÁòæH�KcK¹Š’šIšóÒÙVDî×Ô83ÏK7>��¡1Ý¢™x5Ó¨¤Ÿunß––ŸUšGËã?\ð½-µë®ÝåÆwrÛ’G~Œæ*ÝÑÿ¬ÅRü£“ìáƒÇ"s�ý�ßLkïÚó ê�œÉµ”qõI$Zh¶“®·Zç w \O ç`†,S+žŽ�ý›¨ƒÚŸLõ—CÑ ,ÁÇÃõ³‡ �Ì= øÖ §k×Ù¼»��7oœ'æ®1 V¶®ˆ ÿµ¿2T„´Ð3!å”{„×^äw�$‚;U<ór÷óPqܵžë"îa@UŠaº6 2äYûqE.‚æùdr¯y|¾»Aóðu�BäåjÙ‰0qñj:ÛßYL«t>Q„s@d7Ç^5ÀŠRy9ÉõêA… ê"°m„P“t®ÕÚ%ª›_,­3¶—K_Áœç³íŠ�4¼å[ù7 èü�€¾ÖAЊ8Ê‚ÔQV&ÏÚ͈” INkYC'ˆ Sñ'¬(@±ÛÕûú)Û\FžÁSn× ãŽh”{§0Uæ£jDÅC](äÎ--Õ®®¸•%E=Ëá0·1•Q¾Ž:Þ‰� Ÿä†y\ôÎû¿Ór’²?a|w¡”ÚSÖ’ËÆ…)²Z²¤š�Øáw IÝ\›M«\ÿä\í²ßâºüFHûS�»âX9_”JÀ<Çei«Š[V¢#YÈ­)T;hßÙy;æçäß0™˜ÓØ«ä÷tÎ^çJ¯sùcÑÿ•~`?´ÿ‡ÐI||JPLµw¸^¹%CŒ)8í]�„¹¹ÐþuUn›D"RÈ-¿¥#oÅ~d6˜5�‰[ë¥D )ÙƒC'}/”éo}ÌjfR& ®²˜0qàR‹gZF1Ryþ8%ŒsM•v¼4Ëœ~éuY[,m�¼ã%˜Œž+*fAŒÆ>ʧúû)¼_DERÜÂ4V&ì(§ §Œ+0ðHY¹QÀ»’Ýi…g4¹rºÄ›û_´:ŠÞ_UÔšS,*)ÊðT '¾üq¯™ÍÙŠO(G("êfÞf-$˜u}—I=ÆPÏ1~ rj×\­�M�ìîh®ôâÍRˆµ¿S—ªw««yµ¿í­8£Ò‹†÷ò®WF³Üó•K¶-ˆ)èòƒ ×’{'¾^C•ü§œš$V]Ü;‚W3\6CLÞiº¡A5]×83$!uØß¡Ò2ØENû9ÃNfôk¢=ë Œ¦‹„K§ÎüæÖ¹Uö­Ö2WÑõG{–I7ãggc2ÆKNzˆ�ÿRtùƒ4Á.ðKÔ©£.í%]¢þϺùÃ'©µrÈ7M?$Ä®O„F8ðÛ\`�armžt�M9:mÞ)H—œ%åÍï³{¤-]’ÆÝ�%ˆ„D$G¦e»+qOåÅJQQ‘ùú…‹¥÷ö>ÉÆg<�w#~T•w’QXø×èÎOÖ­­iÔô×qz,¡eH¥røº)bƒ¤ŠÄ¤ÌáŸõg w#m®bó=†•ý±“Ë{ŽEâˆÏ˜¿–ʸHuõå”·¬2Œ'ÂÙç“`½i�f1¨ÝÊŽ¨o7hZjí2·ä¥Î"¯µKñ‡0É­ìÕŸiƒ¦ÞÎI �ôªAy³h áN¥utMuUP5ÍT&·ÿê騺”ßÄmŽq¼[U÷ƒHÛA"ö�9ÁÇ.�3øñÁÛ¹L7 Äã tïþöÜeâér iý4ðáþwF==•“,ŒGœ�‚©tôì²Ø™©võò€û›ã¸ƒÏq„&"o.8ï¥5Ã1S“´˜Îq‚ªjJclãØ…w‘vé-{µÕ]·ò]Øö#$œD;ÃBíþÉÞ_ä?ÒŽ5q<27:æ?+e¾ñêøÌëÓ‹7×…ë'ƒ¹Í"ªîhñ¤Z‡[¼í¶OX8’ó~K¼µÊƒ¨TDPl.öYÒõÞgG�lÌ[n0i‰Êé :ÊÈ©”}ÌîTï—˜qç;¼z«æ·¼¾Z7 +©óɽeIž/5»ïp�pøýÌä/¶^N.X;¢h�sem¬aÙ!û<À¸ªIüä\ž2ÈÝu9dœ—[·},&ñ%—˜1ŒL³­BÌt ö=�Ex…ÃSÓ_´ð/5ÂÇûMíà°D]uÃ!]å &Ñ$àˆÍJÉ8>ò¢çßTžqiï© o+n@2iXc~* ¸HxkìÚ³”£Š1­JºçÕÇúïu¾�ƒg]ìW»FôKš;øyeßL¦¡ËÎH×'žø]ñSÕaF¡cG|™¸­ë4sY®<¼$bRí7Îi0ëz½ðT7ebðèTç ‰v��vÃb¡:n{ÄgSÆegVsLÂgÌ(®sŠ&¢“ÚÞÌÍȾ겄Ë:L¶6çù<ÙctR‡b"×L.ŒÖ��­£ÖÇÕß±kýÙ zœžòB«“qô‚Æ]õ~ï<Õ¥,˜žMjsëÏ6Æ·ÞW_wiƒÃ…Í(©ØLƒÁb 1¦ÓîL�Y2µ†K¨$�xRÆâ”ôYCɹ{U¡êiƒdÅîÎj[æd¨ÇËÍY‘�%|›Ì¾°²Yì×ϯÅiç‹ÓººÇ?YeÔþ—Ê’Œ�ÒQ«6eþƒ£ŠEuX’P<ùþ&VÖHôÿ•Y"‘F¹ÁUSá€Ô‹xí·ZøS_ÉÔ]P¾ñÉU=² ä:-úiÏ�pÅÞœˆÜŸ¿ûÜ„gÁ,ƒ*�;Ç%Aü¯œD� Zúš{øg0¼ð¸r sýÞ È),¼fy‡M~™ÒTŽŒHvM®~¶xN Ç;Ðr±ÔÕ¥7Œ ®`Û2ölªùJ’¸¦]À¼œà%<§ë…r@Z÷ÊhìÉž !µB,ö˜à§2Y¸sú›EÔëeJÉIhR­X£^a¢Îå|^¨D¹Æ{su’;Žzø2‘¤ŠÑŒcÜ´µ«vY,HfÚØbÑó:p˜zÉ‚ºc섆NûìtÒ¾ zö¶vn%¸S®õ¶6â6XÖ9ç"p¢ŠÜôz‰ùÿ çìûNA@¢o„ikgó #ýÇ[…P¯ïÝ�(†µ§ÆÖð˜<ýÞ‚“>¢Û�8Ö»øE'õÕbzr2Ý "[X[hLé*j"Œ*ÑôŽÄÜÂrPUà ÞÞ, Sâ‚Á’~òýƒaµºX{íº=ˆ€Aû‘lß²ÜüQ4C=Ä/¹Ö/{Þã^!ý¿c�êkžèá ©�èLsFÞð:™ª.®`ƇÅôm�B~"l,2µ÷šFÌ,Æ";²L'“!�Ë�ˆTN¶s�ëÌ4û 8å±ù„‚ùdºùèoîìG¯m É� lXxJ ‘AûÅ[fŸ»ø¼Ù Ù«·—åj†ç¼®-XDÁs4Ø·3ñˆåd}œd{ï�0'¹£E{ê±�ˆðø�ñY¸I®)TZH�щ^ú+‡4Êí�—£› A€êtÓ@ýÛÛâé.ßvéýl2B;{NN/œè§!µ+îãÅuô3¾ 6ŸüS©¤?5û,zÄêÿÅpÃÅ1{ñ„hö5v(¹cÿÑÄû±G=–4u¶ô‰i¾Ù£ˆÝ?§_�vä©¶²;1d¸Üñ^éxÖM7Li…°2£§!â„6mØ�Å.å�)Ã{É4äLÜçºEWOæ?å6¾"Âß+Wƒ'FNþ�Kï;þÃÊéq“÷�x„.ä|Wç�þIGú™QLná°Ý¥Aaµ YýŽ%”|¡ÅøCò•q2y1¢µõ‚`Ó|º–Kó”><ð»GÆNÞô—-“{˜øˆG‹oDì°Æuï¢Xœ¥èærL(…âó¼å®u|7õàˉ%°œÆX¾�}t4kÍw»¾ó¦º 5°ê>L‘ž6}ÉýÁ7OÉsÜu¯{…,]˜½a¤7'#WÆo¸¼£x@𢲚ÊÚ.hD’ªã bS�¤µG­xÿ”)ã¯á´çNg.÷$sXgÕ;ØäÕæzÍ(3›\æ´¯_bGìõ3×6z·d¡V¸+}çšÞw9 gãȌԇy—Mqöìùiÿ—ÃDRínHðýH†ÿÆ_]E½Í Õ¿C!]†FŸ��Ô÷³pQìu>盤ˆÆÝ�¿áŽòô#K!h~�Ý4õsT 8BùqûLô�–|Ö‹ÿÚ¿ó+b ÓT·ƒ¬“ßšÿ.œ•¸WÉ;ù<2¯j-¬þþ)aáNê HS\gƾ|Mkƒ>„»×Š.ì_Š=Õ¯(3×…jÇùXÓ·Ÿ#ío¿ÍÏkŸ4 æÞ÷yx¹ÆYFêásìZ©JÞ©NQW™ý�ˆ×Ú\–ïχOÞÚû˜ª©Hè×–~õnÕ#wDkç‘ÉàÇéáFHpgAµ6MªbÚ¯PQ}x;mº ³‰'Õ3~¿ÉÑ‹Y·°�\Þw¨¼/6Ϥ©…¾ß~Ô†,èÍ|I§i¿§õUé>ÁØñâQæù8ÛíB©òe‰�Ȩ�”×]s)iU°òã?dß}HÓ軣8]Àþ°kܰ_Ü“±’69g\þ©zÌcƒ¤±ŸÓ9âõW­X ‡Ó÷Ú÷B¨æ¡ú<�îâèˆúÈY�êÁˆØ_v±û…Râ1»¬m¸3ískO»õ_=¿†^†£Ú›•L‡�é{êsQ1‹›èM'%U×kÍN½} ÜGyÉÍ­}�û|^ײÈV�_–è\D!ùÏÛ,H˜|?V ³©Tmi¼îÂq¬°ñ“ð,ŽÛÃv_'yý/ß>ˆªæ39¯OÈÅ�ÇÎJaS½Þ®¥öQø5~�¦ñ¢gs4”{'.XÕ÷�œ¾áKw’Ûï<ŸxèêJfIr 1¢E9 ƒ’B&¢µBë(ÇT�®Æ�re¹f³ãõ f!Χï.~=Üë‚‚~hQ–!{ÒÅHŒ÷ÜØJ¸Ýxo÷¾ùJ>à_¹‹%�m½7Ìd¼½íMkq¤½ ,¾ñE}ðÛ•ÜùË]¸£g�É’ í[w#w|‰½¤g›ÑËõT„¾÷�7¹ÍmÆ›†uŒî@ÄÌ� ™§�“]ËïS)f (�Ù0K"eÜj+’D1¯9U-ànÀá·ÊµdÔsH²C¹cña1«£‘u}},ï D¾F5V‹ð¸ºÓJóÉÉþú]nI'Ãúéç G…Ùϲ])?|#iÿqò‹ã}Ú* @±¶?7P(Ð;x“ìLO¶�ý’¿áè¸,9ví*ñYÖE¾ Š9[ 9½X®=Œ@²áâ ¶ }®©e±ì©kìÆ¹rÃ_ ä�àŽí»p_AŽ�G#tÅ¢ j ޱKy¿´-õã¨$ëlc\øÔ¶Ì .O~ö?ì]™õx¨‡¶¿¥ü¢ŸsyGºÜ%:åutÔÕfVf•‚mn\¶‚šó$»T Óþî÷‚œ˜ýßç‡Sáun ˆEÄǾflmޭըϔ!ٯˣr|9M•2 Pù‹ê¬R`í8÷š®^˜ÎKl’Î’Þ|YãÌF_.æsG;À$ÖÆøªë‚àý_\W¯$K‹¬ŠN•tkõN¾OG¯Üb®ûùjù�dYWÑâ�|4t¾¾¾¢ùRNòü�QÈî�ž Aùp1-âú^5Œ{\Ä,ócLÃ�-ÐÅEÀžÂI¯‘‡mbàÍóc³Ü?e7ÙœƒÛí÷ r®Cy¹‘±á…û†¥ægUùÜ—#í/‰rÐ_YHû û�fÁHåK’Ðû³AÔK< •ø6ØïS_Òwý΂oXvKp"#€ä¡1m—§�¡P¢²nA©?ãçÊùÀìcX%ÜL]SÏßxSÇ,£Y6fÃ¥{¤O#ÉæÞyœ„vÁHÉ�®+¹š<þùÕƒÀÈ˾ƒ –Ô–µ}¸ êÈ�¼×4ß9� àÜ´}3¬‘9~i™x™m_NX)Ú'îj¡‡wÞyê¡·²MöAiˆ±ÄË“P'=ï hÿÐw/ü‚wÚ äøïvùDøpÊÀ‹½4… ÷ñoS€äa“_{ØBg±6É7�<¿¥`ù;þ «…dôä{üÅý|�ÒªåûzÁ))©AÙý׿¹XŒp$Õ�·D·»"JÛûö)³sžØÔö9è-f†<Ø&Ê@�Æ/Íšô¾àˆúâ{A½�h1iœšG®·À|‡M¼ŽDÀÌæ(y¢éÂ.X6T1†÷„]…U(:ŒyZrøp�ø¶œvøƒbKm ý»1‹æ¬/ Kl�6ÁóÉ‹q›¬NF7 ÉÆ$Z½Z$ Õ<úã›·¹î¹ë×êbslNÿÍ6rë .­Ð“7ß®a Š‘^WƳ¥ÃÒ<·™ñÖ1É×½˜{3 >­¶Ø^·ì5­Óéyq�õC7Žn+DU6»¨ÖMe¨Ë—D/™N¡S_ÍšŒ$ç¦ÇÐ�Ê@8]-Pç$ÈQ,¨†À€ÿð{IãÚwíßì¢IßfG�šI9°Zhâ‘,]M:šÉM©Ž„~ª‘þLÊÕbðp)•ÔàÛ�Úû¹F7RNy“Ê÷Ü·§ÿS¤Ú� £¥_ÚYÿG ·�ÎóOŸ5¦`~(^~ïx]Ì!=Â_jjYea·Ç&øŸÜ%wï‘®ãP¹¾ ®ß�¨lAGÌx]ÛÔCw7½•A;ªK†ƒ~‘ÅFÇÕòe ¾âã:qXÒ®Ä/‹š’%ÓF<¬'~E[‘Ò�Q+í¯ ª›¨‹æp¸¸­#‰\NÕ_+XqÍn‘銮"—ØÂmd5\ýØGxF\QßlÚÓͧ«º¹iš¡UE/«ª½Ï^f£Úv/zÆY[^żö“çÅq�βñ{Åoå…þ…‰qú ñóÇ¥­íELé8ƒßµþ)v›ÿ3H€�ÔB–E_黩Ń ˜ÄLÁšûKž¸EÄ^¤CÂwÿ;•lÖþ‡¿÷M²’’SHäë[×οÆxùæ?µ„©Cæ=¼`²"Ú?Å ¿Ð $ïÃïŠ_G8¼n›¢ÛÈÑËù˜Êël·…IMð‰X:ç7 ¶£|5ïóAŒ…¿¿yÏŒ‘¬¶_IÎ�þ™�|�|Ý›,£uúÕQ± GDÙ”y¯È/ù?[­°‚1[ßõô$,ÉÅÝM5Øyø¨á‡mRð›�‡÷AJµ™—£¤]Jû‰“îÇ3<2º!¿¯ÞQ çü�ä‘ã–¶‘M‹TM·EƒI�]Ôk%lΙ¡Š åš²Øù³ãúpfçí‹Û0ö¾{1}&ï xÕÿ.¯ |:5È�,£™ÆKÖ¥š<Þ¤±8NÚîiPqÊMø>Ó~œ8Õ¼¦–U wår™t@„ uÒµ•/=µRy 9ÌÂÅÃA-cD(IsY‹Í³ óÙ\«Á…šûM|ïJ-bØEÁ· é%:fr‡C[HÌ­ ž–›x Ób0Z ñ#4gsKθo ´×¿·giL>µš¥Ëã ÿó«|hª+Œf�I´c4lÛª0 Y–œ0=«®™9¦¶Øt¶aÉ·�¦Óciÿa=†!×�ëy¹ù�Æ“‚0¥¢t\"âÚ‘y½ü]Sæók‘Y¯r¿Û]q�üG$Îâ1ìä~K‹Û tûwaö�öˆ`†=É* ÄO¶_Ól¾�÷cÁ¥� ,Ûa‡¿‚ Õ#>½uH„ûHÑÅ>mƒéõä‚çtÕÈQfŶ>D”!e�þ,I†x0úÒ±½ÁÓ‘(ê&Ç9é&·û54¥}ɲu…f7JèNj“j(ÄÃ…ÜÍ"· ÀùÀÑ DÃ.øß´§Ç®ÿ’ÛpÄM”�8>˃DÕÉé»Ä÷J ³ @ cøPˆ�TIßèªV„±DvŠÒj ‚�¦½f ;BÏâù²å²¡‚›«×CÊ’c], jå¶-0ÉñuÛªˆ *.³ÆÜò5šŒÉtÎĬȸhAJ2ëHfw ǬâQÑ©A´&cÁ)Ea—`u3ÊÐe¯ÂÔk¹ fÚCŒ�±IDLjA*øÚ5œò¬ô$¤cTAjªÂˆ c£j|…»d†Œ“CŠ ÌÂi6Y*Ôõ{Yµ¸Œqˆ*¤°­(_ ’š¦{¢ó8 .œŽLÛVJB8=ÜsÏó\¿hð_âÂé JI_î§ú¸ëFsw‡šƒ!¾Šƒi'£*ÇQl±ÜPª¨ÂLƒåWºÏmݘþ/“µ�#º< ²úë^ÚË ˜Ž¼/r‰­2úgÏËstëIü¥f À>?{\Á眜øõçŒ7GCŸ™ ÌisŠÊÈKSiÓŽ¶Eçv›ž°lÊ”Ââ^`«ÇÛ€ÂXÆn’¹Ç|â‚õb;b¡|†ÚóšÄܯÿ¼þ�!¥%Ë—Îx'½ä_WwýKûýÞI?4e²³žÐ«’›^[µš+WYá#*›Ò”|ŠӓŦ×EžG-/dGB~Þ†g–³‹ˆ°ÙÄ%­TÉp=Mb¬bÃ�¬ V¨h`ŠHxœøoÆk9ÌYšÜÖL±ØšŸü »Âû‘åŒõÏÍ�:§g!U³™m0œúùÔeO:k»›Õó¸ý˺îÐpùôÖÀ¬Î†(ö—£ÆÉPQ–‘Ü¡�kˆ^æ×Þ_=rvX0?Ì3ûëIiqÁö·«lhx˜ÃÒ?â\èE8EÑ �Æ£\œ¦Ú›¸ÏÛK;Z'ü¿ü)!à@Gðö†5o›O««ÛÁÍ “M(èÁïïoºÇ(ªÁ†Wœ]œ—ÂPëÿOe&ÔW}žØŽùJFXGyæ*�ܤkþ-åú‹Võÿ–éÓ0›þBÈÀú÷¡¬Ž|¸À„·SˆG²¥æ·ïøóÒ"Äô€ ÷æyÉôºU§`$ËŸÀšZ}ðfãñ;ý��Þ•/Õóó_¤L__¼ÞèåÙî8D#ïìLÆFEذmÎCÁ)6/q)E´RÌ][ Ò å›¶Bë à×®c·Égª©]¿,}íζ6ˈüN,=�ï'½½œpÌ„4æYÛóž-mX| ÂÌ¡Çï4!õÊÓ‰Ðù–ÿqðî¦4YI‹]š´¯ø —ñÜ7>Ê1 T¾Seæ²guH^NÙþÞþìcö»® dç%ž`«5o˜rÃ÷Ѹè>`U£¿ÑâÓ"¹qÊd2®Å!qqGn2mŠÎ´MÎè‹sÇ.ÉEaNd·Ž`–ˆÒåN\fâO'å˜EªîÅbl¦v88¶õÔ·Êlˆc�§«]óˆqU²¦ª%*B¢¶ŽxT3F†BqU00›�X]5A¬£R¨ <Ë`grˆnçMO…Yr‡ P¬Ê¥§ctÃÏšSœÕæë6„ÓˆQ´Y…+þÿ޲.š1 ûù "HaDþCc2GŸfS&fÈ>!ëAªj¬�Jä†�gMØ„²yqš\¿¿.þ}~ÕêjìHWú�mÛbÅtÕ¿Z)RùÖ$r¿˜¥…c¿vaú€õW"¶*Ô�kYÁ/ æ�›k”O9Ý)o°eÛ踂ëÁØXgÓŸØvÇçÍ7ûkœß>ÐW‚¬øÔMôóÁÌ\>·9 F0ÚÁ8Ý—aC& †°Õ%e‡‚ÙQ«;A|ºÉ—M×z.] ³¿˜'(`RÚå·\®[Z7‰ ÁŽaÄY4%8“ÐLÌT_ *Çaóøþ<‹Š]xívæGI„Ó¥Å/{ý Ùªî(ajü½Ì6én¯y¹ˆÃü`\°°ÿü ZÖÿ kZͪœ¦W>T÷›€6‹à0XCY? ÷¬M&$¤sH=Ã~ªØ8 IÕ óE£K–âàÍk̸#€À·`’¨ÄÄŒ¤cñÇÒ}ÇÉY‰y� =í[n•¤´ªõ¦M+eõߟæúSë9< H„ŒØ…Ó.þ"ø«Éå8CiÙ¬Æ! BhñùûIGZ~ÖÈ£0!4$p XÛp�q£Mô)Êÿ™cƒBTw8zûG~ôjf?f9õÈÍq=~}5ëXÿ3Ýôò¯,Z•<í×d’ïñøÕœÞ¢9šúôቤæ5U‚ßh9}¹�¢S þH'¸†—T¹ [¿é°Aˆ"N[Ñ¢ þŸtùݬ]-j|”—ÿr¡UÞ¯ŒÎm$�£o3 £‰ˆ¿œfÇ5m?$ÕîûSHv• h›ÿâÜYãášW±úž²78¿Aãö•öjnåZHÄ}j´± qTÙþC“ s$þ |$?F(‰úéV«Ù‘bÞ#æ�D½íR¹;µ(Š\í¡®ŠÃd8×µ‹­ñ!=ÒÞÂøÑ‹|L·Ì�^†qRå’h„ ¥‰` �?]TêHa¥Q€Ö6sã¶ÄíÔÔ¦·Âë•Ç— ºb)yF}�:ÿ CZ[ðÁ½Ç ìc|$mŒs”IÊä|ù©ŒgÚˆ½“G(@zĬ@iœíó¹Äì�rï~üš«}¡Îgïµ–a©™mˆÆ)¿åÿêæ5ÁƒaNÛÁÅX;ØgFBiö§.:4çßÇ�6á#Ჯ:EçT¸‹Œä§®Tɉ Á_ðñèSRêŽGg¨/¶ÀqhÚŸ¹äK–z—Ëæó{L¾“½í³ÿCÛàí=> õÒªGy¬_>Ëpòûl„¥= g€ñÌL>Ta�ËÁyë¸È+buI³:ª›cÁR 6#”åâœvÚøp/»Ÿ¬ÿÃãNëÚÓçÉ€zØú\zbgØ?w3i�¤.ž�ÕØfÇÜgYý½·£Â19…�ÙÀœX@»0‰³=J~Û÷Co°WÂ4–ÐW$©n4Ý�G …ܘëì¹ÆÚPÀTÈ‘úÍüì?o©”ý~_-åð`¥N0‚p¸b2ç·è¸ò*H‡1Ü*)«IÏþ ,ÇÔ ØÇ j¸IdO vÀ –‰wÔõÔH楷&}G, Ñ›¨ Ø ®^ÌSÞ?_Bу·¡r'koâçŠ÷®NW(TVa«3vî/ðÐdµ‚û zW¢A¸!ÍbTg´lÿN/‡ÁÓÒÊÊꆮä/9”öš « ÀF‡3‡/˜h9l˜ßú%›��æ`Wþö‡ÐðZÏ;Üü(— Ò�Ö5Ör�+ZAk”^rÈf×ä/+œµ[ƒ\,Ñ‘§BˆÂÈüZø.>uoÒ:¢è£}\õ,+B»ŒîÒÑù¬Å�c·qZÎF®·õŸKiÇ‘_ Ùó}üuI1@AB9Êj˜¡R]*Ês^bE•Ù+»Ø™7Ì•,-Á¤¸Ê‚R`(ÔJDCü¾yÌõ[ó§iãîp ?Wó&Ló·ú>~ƒ,‘&Mtƒ8`Ññu¯Öš`Ær†÷O×§·ù™”ôÔëªsð¿¿€å'Rĕfð6×àH²² ÂѳâL¤ÔöIC£8°hgbôœ iJ¸i“ZÙó• …Jp´DŠÚòt ƒšòÈÝ“ÊàÞG¶7ÿµr+šô†¹hüœÊûF¢Ó…ºç,3Œ&=j­Õƒp¬Á¨Ÿí"EÅ(¥ûúÀ6xqŒ�q»jçf´»gÁ^a·da5>íH8-†Êà´“Wj×Í‹4ˆš~÷û £ÕT4©þü?Šžà¶~|)š“ÈîP)jy„Ô*×mì¦æøOò ç'Z!DLg§E%£dòo® p»õÓ¤‰3‹Œ®dÏx¡]¼8XKÛÄÈF›Tn¡ÉÛ­UhE¥VNl|÷<•çJ)=ï— _¡­)ô8!‡àz#Hç%÷éâ‘�ën¸ÄØ '�g+æà7â¸_•‹�×ïùþð \ÚÖ/â~›æÈ] /ˆuì§r—»*`À!XX kyõË.¿š5Ÿöž� þ�ÍòÙ>ÌÃsQf»+XôD)€ÈEP\UøÜÈj¡$õ?~¶ðû{sr_ „ïû�Âùåp4ÃúÃ:¨rù*jÊĈq­ý/÷† -#LÆ®9ÞÙ›a"°0•»fçVDafjy&\·æŽ:Öxº£aTF!e°ÁØœcn¥] èö®B�^ƒnåâ¬É‘Ù:X!íaÓj8ˆšÚ ê[Qûà¶IÅÆº1Õ°`„i)²µÊÝ}¶?'¤÷8Äà�tø;/†C¦´¼wŽÌ�ÿ�C‡òã×µ­o†1úÿ–¿ˆ¯äÑ Æ­tÍ©¿Ú$ (ÄåÊ—òðkš¼“�sC!D²Ï¡‡÷úÍDá³[à羌yµ$Á]”!e1&ú^­Øêú�鯰™Ha@ÄEªdÕ¦¬Êä´†@䔿ž÷Iòé,©Âö[È+¶¥“G.Ûv'Nn“ÎPñAäW[ùÕ6 Un¬Â%Hˆ³bq’RTn¥6‡¦”)§‘K[xZâN§+ ݳÒÒfÊ;UódÅYX±ÂnXã'X+ûÞÎ/_6MÞ/q_Ë�ÑÝnØ×ج>¿¾Í2&ö+$OôG¯ŸÃ–ÿX %¾0Ã�£°]â‡ï›ÃÖÌ…ÿ\IÞrÚkÿ @þ»vÄøpR‰b\c›À‰ð¶}7_fÕS€^Pï†ÈL€ýLiéuýÅòRœ^DCäzÂy8yÒï¶eƒăz­û‚m÷…ñÃûª¿éCñüžL©pѳ¥ô7Dk¨ìÇ÷tñI>ÎÇù„ûíÊ�Òôk}êÁ‚!\iIÜeݱkÊY7z4ÊÚ6€`E#,*ôÏ귶Ѿã)–-#¥5_>Å®HŸX˜ƒ {'L=°Bçe¨Æ[Ö| ‹} �«˜?œï¤¥hü¹E?‹ÿylR6G.—ôëU;önŽŒôY–æô®¯Š¿1‘YŸïåo˜¶ãÔúqŠ#ëççuß4½ ˆ[»��×ÅA£Œf”Ü™·e`v/0ÿ6K8ÝÈñs6e�l+ˆ¬ã{Òæ<}ÀuÆ’î[=ª³d¹ŽmÒ{Ÿ63odj�‹t³É @ý_¹¦í^G´Gæíò —>ìæ=xî“ì1˜ûHþµÌ»�åÏ›¡·$Ê·5ïEH² ²aË d� †KKÐ ûZÛÓ…\Vl•ˆ)kXnDÁÓ‘e„a¹ôq—–µ`Ô<‰°L“ß °W0Üò5F�SÛí? Äp×’ø¡rÐ^ýŸ‡¹= ß[ÅIŽÛŸ÷¶JÈáá1îõ4|Ã�üf㺼s`FŒQY236Œç�Fó ®|¼!š‹ö™ëؽuÏ#¾ât^+W" ò{F_ lc¥ÕØää(Ò—ÙÔ‰ d×ÙíÇ«G›°ã´›e\ÛFàô�‘hó•·NzÍ7µkêx\ ç¬þÙòž­„!ÿ<®éœ¡ñr<:-;G8šÅn3WUœœ‰×$Š`Oa¡B–cŸL%±jÙ¼§‹Õç–#á£{[MpóqNß÷—ç¢ëýYÒÖý�½~ÿß:º8Ê=\°ƒ¸ÐÄÐ oßÒpy¾ýí¯ÌU»ù¡gÌ}âOÉ͘"K¡»ñåçÚ1¼W×ýLjÏu¢ò׃Ÿ9+j„ <ϦƠ ²ùgÚ~ãûºùc‡%�KéY¦¸ $E õ^ËÔµA:À€Wõ·¦L†g×Ô]P€^¼Ù-pïŸh]›(Ly¹h¶8Eha—Ù6hBKûÙéò¿í°;ÄÏÁá”'5…êÔ¾¥jÕ’¡YP�ç—™ÛÄo�µÆë­ªÛ†ÍØáFXÚàøV!»i7G˜Lá4W7nr1Œp¤Eñ (2§»ÞøN42,UÐN?øeï±ëûÐ9~…(>>9ý¯%œ^'ëƒðщëକã›]Å u^ëöú––1ÿÑ8%ì±}HD2ôÃÖˆŒ3=ˆ ˆœ;VÀiYÒ�óðýÜ^~}(ÿ>Íï÷ÚKWûúd�èæ¦ÊAw1ovõ‚³®Ò‚7%ö3;V9Ôcdkϱ}úøËc@}ûjË÷þî9ª@Æy;}Bö¶2aþz\’êUÙżµ•`¸Ó¨çŸ_FqË…«Ãã™ÑpÐø}½µîÖ2=k7|™äðM=Ÿ|,Àú~zïžêÓ ‚r ©îãý¨txxzüŒ÷¬ ~©˜h‡£å2L¿ÌVoôÁÛÄ¿™¹LÏ{Z|/CÃWÅtÆ62¤ƒŽQr JØÖF[BãA²Ë-'¦Æ¤#mm’ÅóËô³ùFßõÏ|7YÃq¬`Šnµu“[+jçKlL´·»Í\”t¬ú×/ …>û¡Ÿ¸Æv3ßzç€cñaAí¦Ræn›VÔ+¿êj»' "›4´ïö5ûc¤i-bLH!8;WE¥ö˜k¨�~* ¶‘T|Tûø…wü6sªçÒ¿³ãw o‡-90ž^}Ÿ‡æwÈÇs×V¥hÈB™Okn×À‚ÚðW5=Ъ üÈuÕù~Û‘i´a&mGg½¬3‹þjauÐzŸ¥‡ëŽ]0ó\…ÿ\óžõß/ÁÍÍ­¾' É`«!vŠÚ7ÜÞ49e‰ÖÅîƒY[Îx&Vðµ�EmW"g Žz*ŒÔkBÚ¸ÿÈb"ÿ­ûüœ)‚(ýeÝp�F˜ÐËûäuƒ!�˜ogXeή#û ¹Î²H¼Îóûn|�ÒÚ‘ü³ÖÈ(P‹íð3ÖqdácýÙDÌxí‡{ÁrŽÆ'JYÿ¤Zöÿ»ÉeÚ}÷T%°úª}€þ¢„»ä\ŽÝýþ›êóM˜% -}uÒçúäâ%IÁr‹ÓŽ,óê1ªÂ$ä?þ±´Ë{jMŸëø>‡‡„¶™(¸~J Ü=q?÷æ†Ûñ_¼°ºknx[¾¨Ü Øð}+ÌdÖ¾‚­]¥¨1kÊy°k�(NY¼†3KjäÒ½íBí7éÄi�7—_šÞ(!"çk‹w_¹’ûˆñH ›Ü-6‡«bM^Ír¢J�p LÞìà)5žÏô´vw“nÜ`Púü}Ü©¬DsËággl’jw™ÿ@dŠ£:¹+Õ‹>ü]E· äüY |}æ•gAPAkÀñ<®KìnUïãBË{êà›ožN.ýÎXJhxpX8ÿñêK\sM~ F “²ž¦ ªFê?˜h‹™j•“4KibÀ­XRæÆ®&·œ„þÕîyŒÀíáËí?ÕŸ_øõÑ�× 46']/Ã_¼ÀË5ß Ʊ°�z|ìïhÌôB�|ô”RçšN캋WÍH À(["a¸Ñâ`ŠÊÙç(|‰òiF±ÐxÖµ¤/¯_Ñ_ù¨Þq†þ‚C3':üú!ÙymZ×¥ö§d~N]î]ÐÃkG°i·eCÿ_^xÎC8w_±ÿ-\¥øxïü/Œ…•[ (€â†4öfUÛÒFĺßx­¼hŽCØ¡¸œ7ÄÛŠØ#ØÃ¢OŠ’{ŠÔÞ%\ Nç)½#A‰@f§ðªÌÿ­¦6”-¯±F,‰mæˆt¤ð÷ó|\Ø»åI#éÞ9�p?Å…°ö2È=Ñ¡¸aË”7¬ÏÌk¢úðxkþ�/œ/#ñ"[É_¶b¯¡½QØdÛPDˆv6bAï{h-XÓØÛÝ”mítª); ™×ú;͸Blÿ»“Èç“ÃȤ¥þÇuµuñ™ÕЛìVÌo]x—²)=Áß(#jäÑ*!]O�Í|”´s&É{*ŽQ«‘>’ oƒw2ŽmÒnCjHøõbM +>¶—#Á†½UÞü�;¯tÉûÙ¬Ý+û·yþО¢~¶Ê• ��yCëÚFŠÕ±ÜÇ[µ;?,æë‡mH‚½ú¥â�~l&[/kI›iü B” •‘¥F¾5ñUpivJJsdé_ê}¤»Œ³$Û*à62ì.»¸•Ó™38(?ÆàM‹—øFp/ËxI\hï:­Ÿ_Uj8ò�€0%0üÑ ‘”ŸƒÓ€{dx‰™;ZÓQV¤>Š×:…ÂjøFÚõœ¢í¤`‘v ¢2™~Å*ÝdóLDºÏu·Ä)Ø<·ÆB£«7±žt½w»ûÍ5-°¯¿¼dãùùqŸƒ¼e°&^›£Ã‘„Xk [h¥5î,}�¥¶@™•<œ.Ì cJ©Yï@>²1gœÅ\Ä€^­Ö–^æ»ÔeÛ+‘Õ‹0£0 \X€ôG˜±æ2LÜ‹_·ª¿õëõÏ_iÚ³ÿ1ÈÛžšåNS•ã.J j“ktÞ6˜¾`¨þÅãäZ¾ô½T½süiŠâTlïÒË£J¡&ß”�EëÍË|Æ1WÙd\Êõ†­e‰ œNå{ô)>ä}�b‹sú+Ö8�$7r<£{GE�µ­4?›U¤÷zhI&ÊÉÜ,�ï.™!tÓbî6W'«ïÅ^î"elVó7û6ÐÆ©¡N¡\:Ü_4ÝÖ~aª½Pñ�]ûŠS“wíÄïu¹Ë÷•: šËñûબ›oy:GH¬½Ø@½$v§2´ŠËD1[ÝsÆs|Vòl€�7¦ô6Qô~Q›”Æ{Òx¸ù<&>û®t 0#�|¢(O´ƒJ»e%|V\F] lì™Èl4j|íçÆu¦ý>nì�ï»ÎùÞœ3mŒ«�ÖÜ8$JF{ÎÑë©m°¿ãðöƒµx³¢9œµéѧÏ9q3H>•½{v=_®ŸÔ¢òúŽf=4ˆ‚3âkÓÜæ$$7‘ÿšÅP* ÈÀW�¾y&Ud¿»{𦝢Ÿ¿¿ÞŽJßãÁ)ïKu«Ý»ì'&L9ê�ŽX&ŽTÄL#Ck;Ëšù§‡�™¸B@>—ìuIÎíwõ8L,PXÁ¹�°±•eA47…Öb_ã[ÎL¨b¨ú¾>àÇüõÅþå·à®XÈQŒOêk•ÃBÿ X;à� …›9uÙ­|1+±"¸�œÞúÏwHc›ìÃ5€Ã|c^ ™RµÔ쟃 þº§ëÞwmœ¯xªÎî.®§Ñ.Ö¢Õk–^¬óÞŽ¸¾ÿ2 òíîù>oÖìÁ˜Ëˆî®"/ªfJV•üŠœ‹L„Ζ;+ÐÌMÁ”É4˜’ú›ñÿ< ¶hd5È\ -ŒF|Ä…®B¨Æ^Ÿ-ö0ïNÄ„ÃwKÿ9ìʾ ÁO. €ØŽK*î‡Aªq¥;‹¹ âòòK ¬¥e¹…ñ\�•e¢‘ƒ�ùzêÓ°¿6DÞŠZÈF]Ÿ>Xã㺕~_Ç`ÒüšC� "ø¤|mí÷*LÐzÏW,êfL_itñSL\¼º›ìŽóÛ8¨tÀS!%ù¶ïSÍø•FÑ}à­ï®J�2@Pp÷Þƒî|Âh¾ 0Ú”Ä_òt·…ÑdŸæ/¬ÿf‡ú²¤ùßþ²‹ŸôÝ�{[àœHîíŸ~oac¡i»6&Ö|l+fflŸx»ø‚óq>QÖ¤¶ÔS(ÆR£vg °^ÑÎë�ÕÅ<$dꛡ'+m¦ÿÖ½ÉBJþŦŽp�5-¥n¦y ‰ðò¹óõˆh ˜ˆ×§IªŽ´‹¡À„\% óá«£¤*3+ƒ¤”~çÔýÉ�eéŒÍ㘷q9a·à´D&ȸÊ8©Éñ¶.m¹œœ…|hg| ZÔ9­Øú ¶0µš,ÙL_„HÒ‚ˆ,\* šä@Ni’zén‡.aÉÈ]¨B¹ÂT7%´[§w.�î Šþ‹.ÎÂX{••¿m`Õz¹oÞ%Œ†U×»Úa—]‡J´l\¸�ˆ—»Æ�éâc†xQ”Ÿ› »dlFbiŽJ¹CÑ]C¢ï1¹ÿ0þHa)D§óöGÄËÿ?ÔÛT¿)OŽ,4AX[�&(ü…,%ED3w@!c³â¦º Ý›(VʘÛIã:IG¿(–íÛ¦}(ßB ΃wøÎ.|â­`lÑ¡ 6Lo) ´ÇƒÙ’?G×ÒÀ÷µ‘÷(#£ì±Ø\' k•:ÖúŒZ´!–×.NrG|u „ƒµ“ö“d°—&½´¾#r:X�_êûŠ˜Ç¼ÛV'Ó¼R¨4A…Íë|&•Ê1�Á}І|*QgJ^HÑ:<%+t¿&Ï{&R= æ6g½ñl¥¡Ì{²î÷¦!<þçëÃ7´£5¤x‚øÌ'>†ã â×VHô$��qkYwCþßã ÿ½�Kæº ÑÖ‹É g:[©�ÒüP�ŸM÷¬Tó¹YXcÅO4{+5¾Ÿ�j¾Gמ³ÀÈÅã²°.U±,Jìl(ÊQ=0Q¦e÷ËÄßw6¤ÊÂåàÚdLH®²7v-"3Q즸 ïÜ:ÀÑ/™×þ"dzès¸ó¸öNšî`)c(;�Uè÷\�—!–5ºl¿ Á‰‘ ‹�PõPë±úÂÿOÎ,XÂ�“�A06–rB;o2s5á�s8BµËн+°%ˆsè>|váŒßç�—e2�éN�Ëmªí ß$m�h†Á(ðlÉ9O¦ùŽ`sEäA›ý0£‰ØÏ°Ø[äÅöÎgCi•Šäø ŒFïX� 4¢Pž‚ÚÎŒ&ßN¢ê&O]ß$d]¡´HW˜›¥;ÎÃk…{…>Ä€éªÑÛ÷Ë�Ä/4tÛ!,v‚!¬_@ÝJ ™Ó¶¶æYŒK³ƒÜïm´ßŒ�!Yg—C€VüõÖù3kW~>ÒIŸï¶I¹§O8¤ZŠÎ ù!Qõ¼çÍ�’…Ö¹AVÊj�à‡l&»v‰þcsúvò�­&UaP£Ì䛸˜Iµ@ox£Er¶Î2+4ÈföÏ ©eLT(6p6�ï�EȽñ§-ë{IÆõÒ§ øž`•‘-sxe_^>‹s*HÈÙ±žÍ¿xÏé¿UçIŸxÂì»O2wm?æ›Ü›�z#ïzˆ 5íjÛÄ~5›öð:£Ñ)‚?ÖçF,ÖþÈ»’¹"Ò8`W²� ̱µ¤î*(S³fp6IÃT„,gŠŒAèggÏ cͬ]§�ê(nVJÐê¥n0–ö(nJUøvC#…�Ž6N!b:Û$Šo–è�´R ¡pA‚‡´:0ôâ§\­@'ÿ N$t®Ö39 Eb˜þâØê?ñÂgY„DD €MUjqùªb ±ðkÁ,Iè„°¾óºBøOÃ~¼�Wòü:§]� 6ŠzåÕÆêg (ùs÷B üùÿ.‹ë´­Êëë ”™^M�Ì܆§£æk™Î«h»Ì P0XŒÒz, …±�ûo’ÙÃŒŒêÔÊÆºAÒ·Ý>\àÎ.á)rÀ» x?€ —‹viÆ4`G�'9“äS�s™,‹+-ØEç,óçU9pãšg!&hÎ’qÉ:>©91l$yUÕƒ CÃØ¼S&½M·¤þÑÚ˳ÿþçÌéGp“Ûy¬Âûÿ<ŽtŸ4D&ÄX;0YG›]gó:¡�È@�£XÈýÀ˽Më^ª~ágòTæP fÞx.zÒöÃe$ذ£É°%Í¢üÙHK݉Kmò¦lT$avÎÄT} ÉÃM¢ráS•£³6c$ œu´<�R;#„QðàhÏN{�Hdë 3§¥±�³2ÆOâbÉŽ]ù…®�K³Òk…›d��R´´Y3�bôz`ñÜá´gk\Ÿf.C:ɦˆ}ãavªS¥Û0g€V´“’° VR±H;_R(¬öQM× _7ŠÄҵힵ‚{%®<°÷fiWãˆ+G„n§ik›#®J¡©lÍG:÷Åb)÷o8¸¾à­mxé§úøE1ŽIÄû‰çvzõGFX6à¯ï�ôc6ÇÉÎ!š\h�O×­âó‹ÙŠjBÿgO'�¬¸ã£dÄy&¾Î}”Æ=ü7³Íå6mb `ä°/”œpc©¹¡r_�Â+¶Ã¢±}&š&,¸Â+½¬ßó�yÝöÃõP|F]/hI¬öߟF³@àT�£,ÓéÜ@ªLfŸý1e*T%4±€Û;uŪ—ù᪶ÈÑ›_? b+Å´yîÐWyè©ÿÞ þ�-�üÄù‚¯zÀõ¼I’ ŸïGlœ~¡<]’E>�/ߌà;ŸµcÝ}ÇǾ(bB�¨»îiCdb¹Ç–pΠz“‘Ô¡‹–] Šš¼ÛΓ áßíi9ÞOêËw�f·´·º‡? ÆjÖ±™!˜Óñ‚=@v[i9ýóÕÚWèôÎqä0ÛwtP¹ Mï`ItdÑœ`”§¿ƒ}Áõ°˜æxëÀPˆÃ^òUª�ÁÑn¡Z#]­}›…`¢¶$@¢ÇïÀí�¦(¼Ôë÷ä\W9Ç—ìißùÿl\ñý.£"Äë y¯Ï�·½— ½îl�i½Â>ÃZ‚#ö (Vˆ=¯ùsbߘxhüP7ZQÅ6ùÏÌ>�¸1ÈÆ:@ØCE¸SœÃg04±± ›yE „þKÍëµ�Æ„ì–+4çË+‚#éSzî¿qz}_±S,åª'1 c÷„¾G¹W‚"u(Àc–k~TÈQõæŽÆÜ:S¸HD�ùC[,sÜ�>òg,Ýe¯Z7uñv�Mò‰¨åµ!"Œh^¦ø+jk3üK›UOm>k]ÕŠæ$˜‡èB�=AÙçNÓvYKe­ËAv5ˆ´ŒqZð’lqxÁçço†Mà¾6Z©1­[YÔØà0½ ~1•‹ÙKd-DÞêϳà·[š><ŒM‡Tëúp˜75ø¿\ å¤ýu±w�·ºx®òkŒ#ç½;ïÊu¬ÈO"çn�È}]ÿ îì¥*˜%çñkÑîd·®÷¸á"ö[ûK)ƒˆô£xÛOô®{}ÇRÔïýåã&hÐ ÎÛUE.Ãm÷};w(F §õ3ƒÁ2%„c •°ïm”ÄÎå†A,º�K«Ù1yìa>)Öi8جR\ØÏËU¬(m¢Uðñ#,ç¬Â#¤N.¬¡‰¥)啳5ˆ&x—y¼Mj¯í=Ôû¦ãçfɳåù:ãÿßø¯ÿ-rŽ"{¨ºþ£Kññ ùN ÈCƒ&U ¾Puúô¯Ó@¾êQçòQâ2 6H—!‚<ïÚþzå ~»-‚¾.U‰û³E§@@þÂ4á3#ŽjCPõÎ`õ`�ÞâZ¾¿ÉBÞôëɯ®fBIˆã*†¬FYÓQZ1jÜ… 2b§�|©ïŽÛ-[½E.£ëk)«B¾Ø ìcØ8ò›Ac¦l‘N¼²0Õ{v¹êª$7V³„Ÿª°¹2‰á8êä_`÷ûá¡l‚Òlßél¤¹ñx/n8F\�å#cL“Í1Ö媻«ùìMnñÙÍ«ØOÀ<¯9DFr›—¹¡ïÏqzDp~—/›ß˜³Œm'&Aö»LúŸÓ”3¹ýË„ÝÒßá¥Þ~Y•Ó‘R}ñçmåÁ:¨+x_×Ê*WÄÍ`_�Ñœ\~(!?b!i“œ ÉÓ_ï…âWÎû½i2‹5`w㘾ħ)¸Ü4/£Žc6ù2G¾Ok2EÅoáPúAûí‰#Îîçð¨wÙ^‡�Ä,‚ŸÁÚ¦H/Œuùm×õ=õJ›k‘< :h«É&NïÑ9rÚ÷ÉØ‡[O¬‰@�+áë¨f¬"¾óÞ¸¼w…cƒÏ£nø%üL÷+4›ÅٛɪJ²°¹5k¥¯ `XÕ^Ð;�¼ÿ´ª0›{¾õÃhï{sûô(+zç`wÁј+ =ªªûô&,Ä{Í�„ý”ãàŠ]p¿-kqÚ¼+oÇMÎÙùIóø ¤Á”`X!”» ~œ)«}›Œn²‚uû;xLH‚e±�‚´]”îig¤_� Øò}43ø¾ý�Âó_³E[t¶ ñ` PûœµgêÆÞ³o_ýö5ªu$E¡+ÉápËŸƒGquüÞàR.•õÛÊlj†{Øð®ç @ÎiÐ_CöüMBƒrT€àŽi&� ÑVÑò,ü7ª”K§/ê +æg=­c™ä}¢æ±j)O^­[‹Ü�;ÁáµûJšÞ$¶@¯c¿Ýs}åÊ¿ï߆©¼UÚå— )ÌO~`½m1FÈO”g :¸!˃Wü0uê\‘¢ÿ²Æ2õ~þT¿Ã;°BeÙŽ LçR†Ãûè\[Ÿ,>l弿ã�˜=µ·’ïÆ§~–�)\m²N£¿­`-¦QN‹ßzÖæÈ>ݶS…Ç:P¢Â¦²PÐ’Úøõ|Éi}F†±ûŠ1ÀL9=Ørá�m= Ñ&…�`àlƒj÷Õç¨^#T ão£;Ðlo–fÛ…£<ž|­!RÖ“kÕ’‹˜„EÇà �ز}$ÒD6}~Ôªâ oäÚoÛ쒨ȿQï ò‰Y±^ÊI¡i¨¹;0¸ÉT‚Ái0¸‡†€ú™sÄ Xk�¸²PøÞÉØØcè4vN Τygê&î0d6–,4i•KPóE?צlÏQÙÏw¹qö³°~¼òŸ�¹k}@ ¨^ JQŠ[¹‡!ÆÆ‰²»@^üFUÛPžFcŸg¿p)&Ù³Þ'¶´¦žiÚî9nÊPP)HäÞépFœá@À\ò0êãN1±[a1¾ ¼Ìñ/ ˜ˆŠƒI´ƒê€rWŸuþa§êÏ‚ñä#5¥;†Ö‘$´ ¢÷Ó‘ }ó­…ë�D/î¹oR6ê·"gÏÝ�gè'âëÛ.>ÜlþñÛ/°‡7ÿ tm-! •L¯]­Âæ €Z䎼EôÁBšÂà‘Œ�Cu�Ѿe«[â¹ Æ>Y#›C®yQc$²\% œ*.¿’דèÂÝ’°iïýº¹ ú³[톆ÚPíz2²é¿`¢Þ~K  “Ñó1Ýêùä`躦ÊN«ƒ¤ â69ll"/àÊq�z=ª¬’ÝDyT3Ÿ¦2¹x�{ä>¯ËÇ©½ôŒ\Æ…Ô˜øÍ‡;Ïm€ž7b’» &w<1fVÈsÜj ë˜ØãMÍf´†ãW3†‹/“ÖsðÛ.ßBoêÜJ«[„Ï“×}n¢úZf²¯s¼Çò¼á”ÖüN9±?6ybMÉÄîUèÛ+«©ýn—èñÒÜ€j02æøì½-Þ@Q®T^ãœÊ^ö"klnVEŠÂHرÆÃâûÍsæEì&YçpFÇ$�ܰ$ƈ1>tÐXÝhE)\‰Í¯·…¥ëMËÖ(Ø9¾õãu¿G]–�èÿðKË™mP`]Yïx–Ñ›|kâ‘ò¶ÚÃ7+þE½Öm«•†“ýX�±ða: ù7Ò_Ë÷‚ð»i”Óòƒ¦ƒ«˜"¬}!+ìDô5~-²ÎF÷«×û6£Ö~£¼8 G5­ &�FÈ+@ÇùEÿ¼k/ˆ_ŸÅ¹žò¦ =‡€\”VSo=ÈU�ë-}Ì"},Ý&Ö´œ«ep/hÔmZPỘ-¬Ùû¶Æ �?3pÎÀQCŒhž?¶R!í«@Âä‘–k¢–w_hµYž¿îåÙbh‹ô·e¸ƒ|iH©�™þ�À^°d€¦a2&¿ÊPPW�~y¸®œ"è°ç0‡Áðe£Ûصƒ‡–Fœp<è>¾ÅéÇŽœµ‚+¾Ê•ÀäºYë  ô&‡MÙò²Ãäê½D…¡¢ÚùÄ}¢ÅÌ3DZ\Aü2ùì×4Þþ ª9žÜÇY‘?®ÿn6xÑ;+ÌNNG6p”HG9#•Ì’K–àvÐoìÁÒ|R‘Ý™3X”wWþþ›œ„4,å3g¡¡pÿ6(Ao~Te¤µùT­XH®.eIÜ”ŸM”N\pÕíŒ8OÝ«¹�ÎW{Á?á�¥FÞߺ²kxKûÜlÄ œ\X¦Ç(ë�S½^N o*˜i½ÈBÐy¸7¬c¼L2^9Õxá¹™§lÔÏŽ»ŠÅc�ÁšœÚu@¥jÕ—o4X­Å˜kéq•-³KI4ù/[}’ô=&PžÊ\^TH 8ÍÜ_:³m(˜+Ý ~^cìÓ? >ë»ÏªòÚ˜ÿLI¿w„ÁÕŠR{Ï„Þî{ÿØ\‡Èýèu¤iþu¶¦HûVØr@ƒÐô"-|19ÕbêèX& T9Ê÷áÄêG¦.¿ºÀ¤täøiæD+9ç vô_´ cdDP ðË/�‹ÛÅBÉòÕ0ÝEo/ëwš$ @säkq‡Ä?L[¸© 2))$Yì–9Æ~;ß ½'êÃû9‚tߟöâ>_ÅÀÖ×s‘ð³�ƽæÇ Iðî:„ÚÛ…¸ý¬8ÿö-Ñ ”Ä�zÿ“IUÿ,÷ø¬wø`ˆÃGœ"œ>@àc.Nœ?tvëóùáu�I$˜ÝÇPO‘ ¼PÍ|°æ¬D(“+Þ«f˜�š>¯a1 ‰¹_ð›—§â²âÅ»J͹Ԛ¼úEµq”l™nS–\äé³(2C‚„¬Y×|ø5¥¥eÅM;G‚0�ªQ¼�‚`ç×v…‘n\\ÇÅ™öÓb‹ƒCqˆpC)M‘ç&-T¹d„Ãñnq’Gev±ÖoÃ�–rÒO�£×¨Ì4§Ð4ª´Æ7$+Qbµ`Óõ+�‰2ïÊ œ–²,l’áæðo›æèZ,í6–¨Uê¶´˜ú]ùÇêwKO€×Ìcâ€ŽŽ…eê\î6MÂ_P§ùnY«¾¬.â±Å;;(ç'O(s�pCanW=9–ož\Â\'¡‰¹C¡i€ý÷.þáN÷KW²Œu%P¯(&˜³QrVÄõ™1®ƒÎ|Z.Î&T#o &¿·µÛ¿÷5�é¢à�¢ê¬ç—ƒz(†1u½*ÿ¥4´YÂ]žèi!—]×ðÿWëÝN¯ [%¸wE°w„˜­ÈÙX»q0Âä þV,m4“o'ïXA\cx´ï<^l6œû‹¿ªi5Ö¿+©YµÎ¸™“ùg<~âLÆ�HñM9N}W_ŒÀxXéù* 0Žeó¿cpv q‘]ÙzxÛ–cD�°ç‚&Qƒ¯F í2^«á�6³û\9j¾ ìþDCÁŠ-‘úí�á'F[p¬¸oõà‚›¸v ô¯ž•Ë…$çtÔ¥Ú•tȦ…´ÌT¯»Ü3ÆäG1Õ&ÏîN¹†Ðöa2‰u¹g¬ÄðwÊæJå°ZÌÞ7ž7.Y¹@ÝÞØ2x‡×¥:ó¨ÞöÄ‚[ÜÆåc<¦îU^ï´íM^]+Y–‹]j[yÕoüþOÂG÷��c²ÑÂü¹Pœ§`LԆću»¥Ó‡ø†nf-UE¤LC�F~*g¶ ÷´©ÔØþלèÈ#°·HNÉÇFø0jd4‚Nð¸a[=•"‘6NÛ�CsþcSöV;Ïa]�«Ö ï‹'xܺÀpÇSbÉWï°‰÷¢ˆP‚ň˜^úýº뺌[ea z´näõJôí¨ú£‚äþn†ó91nGY²>gº4¿Ûà0I?lžýá…Æ…üLÝûîs¼ÏBÁ…‡»Ùlê „�‡Î>öDú£UÐãŽw�µððØ{ý¶«sÃd±²Rgq526¶–X¢,Í*åÏüö„kŠñ<[eÀ¤=(Ka—OÏ]Ë…cî¤Øò41¡×_C"žYÕ CÛl’ØÃ”úîp‹C…íüÀ¿íi‰ÿîi1IµO)�Eþh/vË,+“áÆ§þ„·,0zß0æ+ïl;3íÁ×¼x8ácÎʼY+ Nö¿Ò ¯rÊÉîÚ÷p©¢K®—Ÿòû.ü9�r�Ýns¶©‰rF›±Þ8{aµ“R=XŸý¼•ï~µ×wbæŽe~„úð_5gäûV¶µ”¿²œ»Z/\ê·ÅDS YUð#¨ƒÞ÷b.¾ ÏÞäf¿ËÛù£ìC˜.O¡Än~ê®›&º­A›ñ¼¸iEEg}�ñ}@ÀÊ_ZBÎ�mŽtyì¼Ù_›tsϨSF-˜Õ_:˜¡¿“åÃßm�“;Çv±VI7–ñjg±€CÐLÃ/Å-"Ñ_MIf6GÆþxL…¶dmè]ÖþßÂGnÂ~öG«ë’ïåýÅ×ÇØ¥ö1¥K—á=Ç†Ž†–Önë=ïã£]SS¶Geô\¾÷àdDE¬g;Ûo Üú–A/¾kü1Oöz1”È20(¾ ,eük‹ïly ¦µ¹÷÷�Õã €S±@Oðª?å, r  Ê íô¬™Ü;ȉ7%=V7’œ]âè{‘-&}×Ú1Ír—h…ŸÂë¼~~ç‹»ézáyœ áæ\°‰€Þh¦¶É&áŒÂ¬`|±¨ÅQ@#¨ƒ®zÆÞç @W•³m\Æ”0mû¶Ç¼ky”¬!‰ÏÿVþ�äwÎ{ý½¶U~Ö‰ù©f»¹P›úƒ7åz^ÔNwîâ_R›¹éeÝ#¤EMä×;š‹k–Áõ“ß×+ þÒÆû´i—K(öÏåòÜcã™qZ™Ä¥FNûÒŒ�ûq±WKÌêHÈ!ƒ‚çy6á‚®Žo5Ž d )£;RkimûÄ�ÿš`«æY«�*©v’�»åæÑÂ0‘}|ª”È‹uC÷8Róå@6ÿ«ÄBXrÀº6Æÿ^ãï¼JBs_‹»Ã:c_"ÖÎA½=Œ[ ý{È(6©<Ó]\–Œ9bšäQª�¹˜Æ¨Iû©Ëã›Þâ.ÒZò}ÞѲ}ÖÙ#tø_Á;’õï }ÞC€ÀÀÊï=Áéî›®K´ýt6–ö?4Öçi|2^ÚrÏw}|5÷é§ *õ¶fàˆÙ(õ‰M<�Eƽ´©Õ«ŽPáàåGBŽk ’› ”{ñ“žYÔq2 Æøy#ë¹.›Eš:.tÝžà½5HÙ—N"�2»"´ ­z0�ä£[½8¼bÛµ¥õ—6ƒw Yå¬9ëxs¡€Ñ¤AZS­ˆéjã¿ÅtPÈüh°FXõì�˜øHõP,ÇÛ}Ç‚X^˜hÔX§¾I/s�GüXÜØ?.®¿É$zͱë>,CpZyiZ¶y pZÔš¹^#cg\+tÇBÿ²»¿†ÜjjþÆ|òœ ÁM_ð§)¤IŸ¡óÈ„ÅÌ»2xb"œ\+}—2?¯&¼Ç3õÆ=N&Ùr%´i$w‡9?éRsSSt„`Òñõb B R9¼Ž1G”B ê‘r�xfEn"(Râe±/RÍ(™Ëg†™|ËK3±-"cB„Ådž Aš #’*Ð:Òγ=¥ý¢²¬ÇYå-(EöÛL…•°æ%kfÄ=‘«®ùÖk™+‘,s¬Ä;‡.›•¢aøÜÓo—ß®‘ãŒ�©ýÙÛdå@½Å†ÊaS°ÒN+%Íâ@‚A pºï°ìW¨ùn‘Etõ}\Ïã 6ÇD©0n·¹”ê­ãè¦ySt3C¤ÍÙË9O}ª½ÑãטÔ,K™MK P ×9}ßW·¾ÎN}K¾QÒÏ�^&TêÏ—Á_!jͯ¬üÍÈ=.ú·ÈŽ+ì°v§y·›Š+ååÛäT³ÍÿÚn&íÂÏ•¯¯¯3Ms®iÌt×ÇÈ›¨(ı }OZ„ÑWãÖ𙥀Z  ôªòªóñ޳3ãlê{&Õ{¬œfóìÃscp�rÆý_¡• ¸±Ú‡-%o.£££5›ëq7GU¤æ2Ì ÏMg{æs»Ý"ytFÇ9YûœêT�DÂ�YGºÉ‹ûw1ƒ9ÈÇéþÿXÏØ^§Óø…ý?îþø3ˆAÎ+Ul`¹ôñýÉ¿Ÿ8µÎ1y5izøýöޝAYy/(»ôkÕ÷×Ê„Q—»S@}bÍ|̨sðñ�io’Á£Á~%a~‡�ϽýwÁ¬J0Ë¢ŠÙ«d‰FGAÐvÆÀðg†Š‘p-ßõYìÏÓ–´E½s ]Ö"Þï ÿ÷â¡ÀæU0Áb`P×€ò8¹˜k¤ ý-¿@æm?î¸mû”·K˜¹yh™Í3ÀùÍÐãõ’†K²X‹­ïö*ÛG¸ofý6€eþ›C·ä”ùôaymþKõ«…ì`ήÓ[†—Îo£Ì&¾©Y‘°Lù*€mdL»!}ƒý!×׺2pÉb ,îP‡6iÜvgë¬:~$¹×ÉguÂqqr"Äž r¬MžÔ'q#YšvpÒó x,.§DN�Žïueo¼*B·™£§»ÈfêuÐFâm Xv͘˜µ jöàuÏkvz9<Í·á¼Vv'•–;Ç/¤z9¿)Žâo÷/bæ«EÚcPfd޵ôºÒƇMV e²â� UÁ.4ÓŒº,YâuwÉTß«.BqbA7Y½$‘áêxe|Á/¾¾ "—Ü@òñ|ÃÆëÒ¦‘�bõgWñî.Áæ´D—ú_Åæ/æ �=q³Kβ c‚ŽÂg@Ím�}¦ ÓË¿Oì?Ú:O™\™êÝ¡ çóŸÞ”â eíré´4î´¡6ÃeÜ_èÂ(Æ{®´óž Ï=[¡÷ÙwO*5%ɲ‹›Š¬Â�ܨ‹Or""Ù3/‹–ÿç^u8dóþ”yÊñ%GŒ› dꉘÏãó,ýL‡E͞Ʊ�N�¡ü?à½k»Œ~déyi‘„�àH –ôªa�HJr"‹ôñµNÄí…Yº0=6IÌ·®’Þ“}.wù’pC̉4}�‹[ăB°ówCÝ@Š�›úó1&ÈÞ2 �m�Í—ý’[å¾€(÷ï„ê5¯¾f­ç»ª�- fÆ ÃY¡§Æ¾|Â6µ\µCì°Øê¡�ëÖ¾3¶ÊÝ¡þ">zçÍòŸë`˜"|Yzà_f:1�ß¡¬ y7PJ寳"¼6F˜ØÃÒ}伪»FÃùˆ—á—¬û‡Mâ®g0ã&˜pº*çŸ~>÷¿Ö&Áââãšà,w»Þs—òq‚‘ÑaDy5ÇRIéIŒŠL¬ÔZ2 £š÷1Š8^(¢Kšc©:;[ORïù�¿»‚ ’¼m�rãŸß*Âå:3ºØÉXo—Å‚jÍV' Ch¦á)hDnZ�,‚„‚<à(‹Bá�¸ZR×—+¹{ùåøuX„Þ“€3gÔ?ä“Ñã€�Çø­QÞí'tÂá6%¤’u8PÎW@ABl�A›ðµƒ{m±}Oÿzß/É? BGÜNþ‡(gº¡¯³?[ç p•™!«ŸY[‰x™¥L©£è#þưomB;@Xnß(ç]�°j¢Öàs³‘gW1§¡È‹·–ÍeÁÞKn!]OÏ^�®]õ7ôÉ–þć”r|ú*wvÝ$nS#oZL§ÌeL¹tV(Î=`?ÀyF$¤�K×f—çq‰ÐõQz8°�Tì‹ÎìÀEËéÜj�xæL/ã8Œ7™Ú±¹AËà‡QwªÓäüOŠÍW�ðS'ñg±Öf|Я@ž¦ŽûÈA_EØ´¦úá©· �ç·Uâpª‚lÙêà÷–¥d 5»ÞQo%‡·¢–Ò½Šì•ün‚ æá¨“¿e»}j6¾ò^ôfß/Tþ;«{1÷ØÌw[^rq—nNáE2/7ÑN~-]ÕÕ�ÏmDl«EFŒ£ò3ëŽcx-]%C¼-ðð£O'rˆ›Ž`÷x=\î¹EÆtN x½EWÖ}Ëφ~$Þ4¾Uðàœ?Üs‡¯Vxû' lÅ4{?H~;0¨ßçÆ'©à³"¹Ñ~R&¼D†º2e„\Ãõ[\,é÷çÚñ”ɶ{êI&îK­îð>Õ«{Ï*n ÁŸÜÚöŒ7]DÒ�:+\ÆÚ œ„ãZßMá³Vñ嬸ï à÷C¼¼g±Š!{´¦ê”ž—òâJöq€‹Æ*Á´Ø±,�ié§3ó½- 8|/5În»ÎŠ´%Òãžüò¹¬6Žã_µ{�w„u-ñëwؾ°_��S@è¶�]�»E¼göÌÎvGA¢ÊŒ}uŒ‘j<œhvÿŇt:|3Òhö»"ixš{®Èn×iAp¤l�sËâÒ®µa÷ójåÞ}B‘Óõ\qž7ù‰øÃæû±¦.Û×»oŸ #¯²élq«�¸ÚˆHÆb½Ÿ«vpAཻèN_ðg¢§¶i¹s Vc-ºëaB[¥üQ ün)v^!Œ Sø μ~Õ@lª êçãG­8Vš+ ²}žêHjU#6m*•„x‘Ð×Ä’îzï,eEˆLîk‹ ÌÙ^JÁ]¢(£þ_)†å¾NßU@“=Œ76jööÊv 0,%F\w¹{+íáàF Zar. {MÌŸ8w¹jIªË‚ïÿ1åAB±Ä(±”…cÅ Ì";ÕÆ.dç\ ®éP.ÏVÛ^ÿÊáï„ Td�t±–6nLRРͱCzh´PÐd,n﹫fŒk‡scÍ0½<9V°³û²«Ö;…�ø÷·ÂBs½í‰Kâ‡.;�É~,4±|y _R,“B°šLDÎìÝ*(7)LbYzê¹fåA;îbñº÷[OrÒž¢!Q¬Z™y1x˜[žXš …R^ò§¬‹L¼Í_¸á¼gg+⳺®ç TŸ'G†—¸¾Lâ¯í`©Ì´bRç@ùUØC3“­‘ãˆEdÒø³w§Ü§ M ç}º©Ô=Ãkí‚ÔÒ±�ÿ'7Ñ|äÁÁ‚#Áý­'Í<+d¹$þÆö>²üO²´æKWröKlÄ­GÊ n®ïýëŒ ‘H­BJ"k-Þ¥�;:T£¸£q±º­möXûŸzïdû\‡Îv·ÑÎí[›à”)í=�ế;¹©"ž/¾ús³«‹+n%Çú§]‘ yD“í"žxy`ñ@Ñ[Ûo}î®­‹uÐt�j©Ì?µÈ[Ø<"—´Ú[©ü_"*˜B‘ÖfTzk׋üŸb ü2 ¼¥TR_�zaxÈø²�Þfýå!ÌRî÷#£:6�λ››)©çD:e™Õš¬Šò›y:Ãj«²¿ø+xP0'F=—ƒ(å]ææík„9+}¼äÔ‡Š+øoÐÍøŸ¿Š�ÞRÔû%ÔFt!1š8k‡ÐÅt°p82º½Þ}ïß×ú§Œ—� ·=¿  ªåÏ×ÊØoâWdÏÄßÿ]M'ªÿf‘ÉÊ"-œ\ÛYù$¹Y¾rì÷ÕØBð6ÛXK T�Ö¯Oݱô™ §úžÔC~Èëa”¼û­ýüñÓ÷ÄyÓuÉgñ™M€ùÿ¯S/ÞΞX�ñМ/ÜFP§Îöýý‡¦ÁøDÈp®õéïÉ“6¹•Áê AG¹…s�FGn³ "Rå. �º5¦•¡àI’lá&�\få„zÕy9EWk‹ˆNd×°sáÑ-ÌD¢ªÌ×Òðã™ÆîÎ3œ_?¹$‡ú>­åV‹&R©ª.—Tû@Ë—9�-!eß æÖÛäšÕ�È;ÉhXÐjÉ¢‹er\d“eV\ß�*œC²çŒ»ªÁ¢ß?øP¶)Î'È:&îXÁ/AV/OùRFÈx˜¬R“o†;°FÔÞÛT€y?C‘Û>YòÊ*K\!µ™Ï �y¨/d©C·3„êHs¶:±ïvéS­Ø¯8t{‘k’»#ÿ¿¯œk¤Nrê·9FX¬žÈK‡R×uè/ÁBêér‚•ŠVB„ Š#Á­j·ÀÿÎæq?²Ò$`è?ýq,7€øŸL]Êñkø{þÛxÿç¶<ê黬†”Û~øxq¯‡¯¯j¾xå ””b¹ˆ®Vèº6œÃbဒÎYk«vS JŸ-8ã[_· �žêòG�’àk3GnA«=°A—ÿ/]ÛœÁ^æ”q /FX&Û<Ô³aìgÍÌêSYv¾šKÿ9ÚŸû8¦Éºúõ†%Akæ“;›®z¬µ¥´� +Ã6²ÙfÍôðfõw‰Søv<þàï~ê×}zwsÕæ5ܳêWÜ”�Y>¯óCGTtíYü±íý=¾‚P€ÛAÛÇèÐ�j¾ôr§xÒ+§ºÔÉÌC "B.UWÿsµ’*ìa/ï ~3û~ð±íjß�\§É× ¯”.åzyxPôÁÙçl’æ�ûïÕ²>¡Äž~g«WÖW5dþuÿ¥É€� ‹ºuù·ùŸï‹°BØ5¡àÂoG«0LU®˜§ýuq ¢a®Æ?��’5*p+íëºO˜‰#�vv$߈Õ¼#L¬\e9hõ;ß,—4«±Ó-ˆzú*â4á«êø (‰ÊlÌl¥ƒUx1Ð~@M„# ‹µ–Q áPÓpu�W‹ßŽ+ qÆ–É,kUø˜gG ß·ÿ©‰ÈüîšW‘uË WüªY^p´å «‚¬Å£Áb«8›˜¤æ»do\×wfLÉ8OðÕV$åÌá«àF¸GËwIL²�a<­ÈP0àå¦ÜöÑÓ�/c’‰iÑ ¥‰4ïŒ^†ŒŽÁ‚Tö\Ñ9‡w' j÷3ï¯Xå/LøÎF¬«)ä‡lnŠªŒ`1�ŒB½áH0ëË’$mõf ó!·K ‰qÃÒ<4/�Æy¨‰RF0m¦ÁŒ^[‡R‚TIotÏ™gĸU f¼ø=7#­’Í“AÇËÆÑ¥þ%óçT#(ý¿Æ~;Ó¯ìþþù~½sËOL£¯Trð4ŸÇÓ~} �¦³Ö·G5•¿aÐp«Ò‘Y¤¿V°Öð÷ø‹=P y³È-†Yl@ÃE¬îž»³Ïf9Á óɋ춹®[«ÉEË쇫õ[‚ÈÚy/ø)]G93ûüºÒ}Òö|�³=^_uá-GESäô><G¤¿<þ O¤—-ÖÜAÁ”L,"=aY›o`±B(ˆ½Ih�á ÓÑ�ng–ÿÛïà©”õ½q‹ FEîÓÜK”¢Ñ—Þ&®sŠ J} ÈÓ¯EˆËÚvü-ñ-9#îàÒdÖQvÉv*©]µãI8H–B½õŒµù&IYb%2@˜]®j'—�­øw̲u¨¹^è®�Õw=èæà’4ü©™Ýo†¦�7Û™j,£"e|S´5\ãˆ2 J\,Š Ìâ¸W¥ÝÒµ‘zÙÝÓµtL¨É)!*¢{ÙcŒ\ÄŠ¿Ã>‹;¥Ý `Hj¤“EÂ.ê/tUK•׌!Žy9¡¦» ʽ:ðÄ9í™nËæê½VœrêÿÊ´Qƒ.M6µ’¾ÛkœSc-Q0êwZ“"Ïpèã¹désæÖÑqêáHÆ9Ü,Iå¹—j-¡½^K‚Ùæ5FÿpQð\ñ<j¥Œ·Ì$Þ�¹ZÛŒvâ婌@âEÍØ���bËAHÝ4qRŸILÌíP–û"6®“vµµ§w®‚¹·o‚zªÞÞêy™C3ÚàÑ•«ÈCлR>̯-™ß&¹\_zE[E|ݸW!^i’ZõGPÔù‰Ï‹|\§Xt*od‹r�Z»_H— �ÂI‹œ4vþÕ Á ëÍžë"Ví¢Œ«Òâ·#0ù©}Ë¢æ WLD“wÇ1DÙ,˜½Ý"äÀ©}›¥hoE™S›ªÿ[{òTƒû ÝÚ;²å¶�kÃ;/‘üÝíôµs…Ƶ–#!Á1¥1ZXR]C7ß3.ìšÔžoÌÍDêL³‘riËð“¯+¨ÃP"Ò8qyÄo=ÐÊøï½x–‹S%Ï È†³3;â$ÞâZ3ï�Q9¾+9~ž8’¶ªS§„k¡Æ+<ªÔ¯¥øº2¨ÖÊ1Œ÷7ÕdÂ×ow}a2]ÖÁÎzQ¾c¦šcI~´ £Ý«g\ÀD¾"ö@Ú·½¶]æøº]‹ŸÌõÛýœ:cÚ=Bbä‹FȦ$wy­¯ ë—³«>½¿ßç]ÿœ›;#ûñQùüçj˜& ‰“ÕÎÀ)‚‘È44Ä{ý>�,œ3nŽ e,™ ç%@ �˜ÑÃ?®<[7sBÌ!ÅÒÃ�Œ@6‘Í¥š`ÛC÷Ÿ//º}LÒÐDžFH ¡1nq`K$ÒB( P¡4á L[CÅÏÒJL”çY“·‚™ÔT%T¢KF´2‰A „4ÙY¯ï’çǵ+Hú¦‘æ  ‰E ÇÄw/öôó¾s™¶ßH ð[ÁDq¨Cù;àðìê¤åŠ•¹ø¯ïå–Êÿ�]áA­qK�ŒpYXyyÎ_ 6;,_h�›ÜÔ(+óœGD…“b>;ù­ØE M¯–·á‹iC5у`±çzìtâvK €Ø}•κØåòåÖ˜í®xÄòiÑëzMœ@X^Ìh„Ø&&¾0%®Eñ:\³PœEF°–»”�]')«Uh AaQ *.ÓôH%´|:JÙhDŸáñ,°‘kƒ©ÉùêtÊ×„Õ jÍÞ¡ÿµ|É2�^wiŠäQ+j½å åÃnF�&6 ˆÇ„õí't™PiW+Üb–0mbª$!Šœ~�ëœòsC¡­‘¦`?Ĭ Þ/õ(Þ¸IªwÏ~bóãþÿàÒ�ú/“r"jD8NuWŒ˜G&ãgæü2ƒb}õºrf�¯øÊ%àF¹PßÑ‘uVòo¥ ÛYI*j(L©=1,gÕÒ$G�PµðÌ…Î \OP~ôV¥ð]!níÚ\2„¸Íå£/®k÷öq ÒÓüœÖioßëäû}¾0ùÄðµìshq9PÝp8 ¾‹IÍò“Ð%‡©ÝH$ )ýùÃ8½þkcis#Ü¢(3þÓº|F¨Æ4ƒ—]«ò‘¯—ÿŠÍËIÔƒ2l\:ô‚}²MÁ� žK¨ák»43R^1â †&,Ø~š”iÏÿK ßŸWÖÕÎ3[7qRžTFÛ�È&}ö~ZéĺëMç“èçó¸ faùýñ² +žê³ÅW÷ð˜ɯrµ¼mŽÈÊ)/lMãÖ2÷q^¿c®4&#v¬3?ÿ$Ê´eÃIKs¤ö<šb7×­ù£µ:FK‰Âè)3Ó�‚ ›¶Jj"×}Ú1n¤¨ Žõ ²0�ΦaÓ{7-ÿÎMî]Å6\ž{<ìå–ý�s>ùn¼å?®¼×Ÿα#÷¢K爨[N¯} ~Œ°¤aŠøXøäð3ìá"‡ºÕ#Ž—z8‡àW±Neµq¾mŽÃx\¬ÊA à–B¸#Ý;I`·¼Ì£X‚�l¨žÚ+6vóøµ.¼E&Oþ ŽÖïßxž•ŽDwç`õâÓY[gó鯿$�Ê×ÓÂÄÓˆšÖˆ6#é¡ô¨Å%† U7V‡QLãœÁ^Ä9Úªá7Ô¸— nQDTyŒêm=½l79k),2.2§%¨ÞC/ ]é¸-ÏÀ„"q#Ž2Ñy¬EancMA{\¡ÿíýÃõ¼ì6Ï›#ïÛ+#8ä]ß·ÊôT²q`>œs•e$£ÿÈü7«�Ȫâ !2Ý_`·àÁáaob†Új->’[²çÙe6õDÕ¬èÙÙս넌 D‰Ê)ªD÷Ú¢–´YX@–Üú÷\‡²p>±ªî5µ¿ >õ}®÷ÎÁ›ËˆæýlnF "JU4Ídè/Un÷X¬Lßåy‹£�ˆüK‚ÜlõIÑÛ=Tá$vÇ-S»„'SD ?™8×Ðo��úÄ[)C…Ç¡ß{R[8–&è]P¦ÆØ'Hc†Iöi>Ìb§–ˆ2K~»Ã~œÛ½�p,m{ »msD€¶=ÇöÈ‘`qíÚ.­åÀÔ?ÇDBBùçÓÈ3_.&ÃwðÒTšlAÇ€Hz£×;ÌšTšº[€²4hNOÐ8üÁ,ëH>*GV3ÇìC«YTÍh Œb>óëÑÕ¹ñX ùôóÉ,“ËQìý~r••KL�ÌKH;|úÿ«Cö,Ç¥.ß¶½Íî4Šuk¸Ãº‡¡ÔëŠÁ·Ê ›—ÛMcÎŒ¦½·ó üè¾LA…æ,ÔÀàŽŸOÈ�ñ™õ]Òõ¯7–Ρ`v3•˜ýl½Ñ‚‰ÇÅÇ–¥^‡Ú Rª”˜B+DzPÑt W�Ð{©Àÿ1AY&SY©ô—‘{§^@ð?ÿÿðaúëÀD¸S t P‘@B[[dmÏ»¸ÂÙšd¨P¡¬�R+,%°¦Hl¶±�Ø(t(@päR�NÚŽ™À ›j�ëéÛ®ÙZ+ÉCé©!H&Jz2ìéöÃèø×£Û´Ô€d”»2“³SJÙÓ@i­¬£€]jµí„©G£À_y÷Jž«¦ØÀ ÛVšQ+ìß}ƒõ”ðqf’DÖf2 JVš…5 P”HJ¤* QA¥«(‘N讟A®P±ç0`Ùlmj*µUa#¡e…-Ý™9v¢ši£AJTª*�“FÍ Ö³l¶A¬5´ÒÐÖc6em�«´£©¦"i€Š� ¦QZųn]u²5ˆ�ªt3–ªmµ�QTØb•*•%ZU#2Ö p9¢.lÀ%±Î5+` ’¥NÚÀ&¶ ˆj�[èhè””…-Ó)*m©jØó‰¬à€F;NZaJel U*€B†”Û ­ej´­¶Öe XÏ@3¼f¸UmZ¦ÆÛ@­h f"D€P£f) †�¨PZÖµ@(R…E ¬#£»@„5Ä.èfí¤•1³%±fS¶ÑTÍ5]ÍQÛ¢;�5¡UP+ch5*-f­f%´Í4FÕT+@Í©À®Í[RRU ”·¶s"%cm4…[ mZM²ŒÉ€ñ)«†L Ö6¶“e† R¤Ñª#I†Ù©,°+gqÜC­èz(ækFIi¢TK[`)€kBF“¤3j[eSE“O)kºwM†HÍ[d‘«ZÓ4mµ@UDE^Ãi%½n½4 ¡¶*‚�hÅ£ªz PíZ­…kEi­*i˜–°ó•;®�°íf · o@ß ëfÃYj•¤A[0ÌÛfÄ�¡4…%4 LI%)¢DÑúi5 §á¡E&SÄăF�4OU)©OÔ††ž“CF€2 D�€€@h$Ò¡¡§¨%4@I‰ hê÷ÿ¨ù=á"T(¸ûŒOþÿô[ÿFеcü2ªãõÿ·?—°ç$ž9åxˆ#Á©�i+�”mz1z}ψ `Ài’H„´•H„ˆmJš4kd¥34TkI´¥cSI6“iFl�‰D³)idM”Ú&–Ù+¤ƒ ”š"µ&i[M–’eL± ª-‹lkRZ)+if¢Éi6’RjÓS4if¦ŒÀ ±¶J#ljdÊ©LYJ�&ŠÆ*¦k&Â’jfi"’i%R±*%"©bkˆÁf S$É´l¥M£0¶IMŒM–�4™Fe©£"Š�¤lËI)Q¦DÙFƒM,m2©“a¨¶,Å34j�!RU"VM&$L‚ŠL5³KT•cm’Æ¢Øii3(Ò•RÉPJTÑ¡ŠR¨)-2XC$£0�¤µ…J‰2X²QTÍŒÍdÒQ£IfŠ6£l3D[4¨šIa5²Ê’BBLQm%RYL–™MKfÙ*–mˆ¥¥ ©†¡,–¢Ô£i5)I‚0TQŒ¶Q¬FÒl+-0¤Õ�KM’’Å%6lI¬RhÚ,¥Q¢¶Ñ&ÉšT“i$šR�ÆÚRÅ%E$ËTEƒ&ÄjR‰¥¤ÙiM�šl¦# "m$IBE”£$Pl‰6e4M±h¤¤@Œ"¢[J2ÊTÊÄYšR fÔa¥A‰°fKfÆEE’-Ff�Ò‹*1Y¡”Ñ´–™!RZf”ÑHÂ6Ù²šV�,•%L¢[4�Z6Š�¦Rm™«IFÆf± Æ±¬jdEвQ´mfX±)¥5&ÆÙ¤˜Ø )¬j$±m4¬Ê%*ŠÌR¥šÑDiKFŠf„Åf665M2Hi%+%´VÊmlÌd†ZSPDU™dÚ“ 4› ‰1a’$�j�„Èm™RR5iMa(Ši[¡-Di ‚¤‹©¥b´•±¶¡…@ØLÅ™•4„Z“FÑfcRm’1­”Œ’-“ b"ÑQ%–m%Rl™”–”ÙMc@3ZkM31²“LÕ&"’‹ªdV¢4L²jT&kMM©•´b1cBm2Û²¦´Í¢ÊY›Ji™4Ò IALŠ��X²˜ÔŠ4e5dÚ¥HÆ(R¢‚‘´ 25™±¦m€¨¢Ô”¥Š�E[#2F™­)*jË#&2cU’±£!¶KS4b6ÓMm`BI6²–a†E£Å–6 j“3JbÁI­JhÆ"”Ó,#(Ö$ÆÉ)3mRl›F™BdÕ¥ˆ¡F(LA��L˜l¥©)±©+&ɨÛ)fk)$¦’³K3653 ¤µQK"Ú)¬`Ų`)Ì­4™´U�£h«`£cTZLS5&±[&‹&ÉZ6©I)d“f(Õ6ÌÊÆÆ’Æ“Q¶-e²YK56)"MmJidj2ÉHŠe³3$Ú5fj™%Q&’É’Ú�¶J™RE´›DS)ÌBeŠ4Ê”¦¦˜cfÙ0[a5%,ÙM2Ø6M¤¤¶i³JQLÕ6M6ÈDk3IÈÊd¥ŠSJÍ 6 š™Zdk¥--‹ZM’`ÊL`¨)––Y2mJVaQ¤ ²³f²–i´¤†Ì�#,š À�YiTiLHkI`PÙ¦ÆH2m‹&Œ(Ñ¥1IbÆ™ Q³HÅA±"L³&%Fh”¦aM–3&©S �Ê0™J(Õ%°ÌØ›$[*$lZZFeAI™FÆ�RÍXÓ,¦‰H¶M4ÛK6‰©MQE¤Æ1e$Õ$M‰J‰ *�I1(‚ÌÉEI)RY$Ã4²ÔÍ2Œl´›J“FƒLÁ”šleM’I”¤2�fLi’lÅ53A4‰¥¤ÖI‘Y*4i2Ém„Ø3 ‰˜’5¤Ñc&2I¥†ŠM™ )¤M5–IKEEE%™ZiRk 2T#f%KeI–±Dˆ04IF‹£lV54�“ ›”–l‰2“XYoV©D€¢ AiD€¢Òª� ŠýE¨ Òˆ0EÐPCÃm¶ÚºåŠ4´²6Y‘‰"e$Ê)­+ Æ„6 ST²TE–b�Q²d$’ÅI¨ M”€ƒ2TS RDÄZV2e54…6J43LRSda‰¤2f’E�˜²” IM44„²F¢Š“H–F $¤™3D²C4 f-K&$£6jI²l�˜¨Ð‹@¦FlÔ0DÀ˜c%%f–`ŒÌR‰„Äa2D”,˜FÓfec ¦ÉIŠDl&Æ)J…¤Ø¡‰i‘KCYD¢ÊQIBd�À©I%” ÀÙ±(ˆ‚hˆ)²Á)„™–d€Ð¨ˆ$¨˜@ˆR"b l(HÅ0YI@¦Z(SÚ˜š¤¬…&i1©‚&D³0i‚ X"!Œ1d&‘DB$dØl6É“2“) ËF1‰�eJa3&�ͱ ²e †¡ È$ˆÙCR‚f–¥$†Ù& š¡‚dÊ *$”,X˜’™Œ†e†HšŠFĉIA Y&ŠL‰a,)#(ÆH€„£2É(€Í†`%•S$`Y˜d0j ‚™2(Ù&fH6Ø–eM²ŠcH˜L…$�ÌŠ’&lfÑd¥QJ1&¶R"XLL’B€Vdf&ÊZ#$̤2E™„� R„ †‰†6¦ÀÒj)RdÑFTÃ$‘›1‘˜@€(d�±d"2JS�0Є€™ˆŠ,ʼn1lk4°%• ¶D&’i Ñ F“‘Ôf̦�‘MZR-‹%2‘I¥ 4LP‚P,Š4€Dd�AC)C3,Éh&b (ÄÒ„RÁŠYH‘“$M�0%6Liš&1¤³d¨I)¡¢ˆbÌ„l"Œ�4�I)4ÈH¦)FDÍ0faËVÖÛœ„‚š%QŠ!±£ ˜PIH„€‰�@hD¢d¦`ÈD¤‘!P1€”�ЈŒÁÁ �˜ˆ0H ) „�„¤`�™ $ R‰-4ˆˆ˜šM,H¤0$hD"$bad‘4d‘ HB„ˆ‚Pc!–DÌ™ 1�(¤f�Â%(Dˆ�bc ‘1��ÀƒLI%��%4f Œ�HŠ(ƒA€Å( aD$0"lˆBa‘CDd‚JR&�‚b¤H�–¦BD„Ð�’%$‘4$‘‚f"‘ da &I"PƒH˜!0B �ŒR D˜™À@DŒB(@ €L�A($Èi 0I 1ƒDB¤& ˜‚H€#D$LF HŠM 0�‚PÌd(E&10 ˆÄ€`�d  „D$�³$ b)€€!‚’ 2$�ƒbHˆD ` d€#2#ˆ$`hÆ BBÌ� ˆD‚’!2 ¡H„€J1ÊDˆĈLD6Á1$ P ¤Dc‚&aH€ˆ¤€B#!&BH@Á BXDAA&@HЈ$’ 1„F0"A @�˜€H“AB6 € €ÃFd $A“Á† BAB$ ! B �ˆ ‰�Pƒ0‰Æ"� ˆ0Š$ 2‚&‘CJ "A‚1h‰€D‘ FbD ÂP€„�$`LÆH †!„BD"@¤LÀA!çúG¿ï?Ò³:&”–¾§œö]í*ÃÅÞw$ääÞ•4ŒÊéÏ«Ê Mç)XØ”OžG~vqu‰l<¾ÕâP=QðLhpØð‘ „4Rʵmv�òŸ`•<·ªÌ �çVù\@{Œlfž‡fƒZE`°QڻꕈÐÀ­CA D :ÆŠpÂÆ8gç;·<´Æ �~n@Œ<–ðУ¢YÚ�ñ d!V]÷péçXsw¼búïÊ @!»Ë  UN|ùÃEPÆ…Šª¤αS¼³¡ Õ�4,3| ¤´ùFè‡k©êŒ˜r«w*U‚ÁHPlrJÇU^êça+ÎåOHê×vmvn8;œó;m¯7Œ»tnuŽá°v»»6¤»+vhíÛåƒbò!ù ¢^_u-ÛÓáóƒSqŒÆA|ÜÊ~êMÝ1eÜæ÷d­Á”¬2ˆRJ4³.å¼ÁêFÇYÅ‹Xán{ƒíviR- OÊ®· ȶ©ok‘�À‡ ¡*Áòó]÷x‹>V¼Ö{–¬5¢!fŽög‹/ м/'xØH-T¨UŒ7#¹[RÆ*ï7ξ5›Ô*#‚ûÓÄ©,Ř:ïÌÊâ¹Rg6�£ v†ã64^„´`»½Üá¸p«{˜0(ð5XÇY !ÔGP7¤Yœ\ÇBÛ¡šª¯Ë·ã�·nߌY}±vƨÜòñ[›ÏÌ×Ýå„m‘‚Ç�Œ.æ¤  Í¾¢¼áÈSLæ÷Œ•43‚S7 ÅÛÎÁ}�¼º­s¼# ~J4·VðW|‹³ ™ÅZGÍíŽÕ&nÅ5™±ÕÕÝ]PQ&¹B?,¨Î“¢¡‚ÎÐ1mÑZ/¬�)!¼+Î…íÁba^>/¼Æê5h5çQ!˜È“Ƽœ4hÛÄj íg�ÎóV=ƒP‚Ń C¼Êó“¢7Å †Ä,h‹±‚‡;¢††lp¯;E„;Þ ½µæ©{uÖs^`Ák¸ÐO.ÉdMHƒO+^-J»:!ІLºÛÜ“�v¢/2›À„=UWÊ5a±}Ä@¼¬›Eà·nÅõ‡ÒYà¼áAØ;ç�¬G¡šßºUV¬BÇy¹aˆp\ÞsFž˜.vj}NKÝ-ÍféƒËE"ÏÏ&:ÐìlW伉‡‹ëÜáÔ`�šp1£r¶ÂYhÜtgQ YÝÍ0pÝãz¯©‚ðë4hð7ƒˆî¼½¥ÆÆrõæè0€ñ®Ë¹wg¯�s˜Å¶ÖˆžáœŠ±2îV¥(h7Wzi ¬.èmæ£A �VѶÖeò"â9»í‹'�h4§�]S FóËО`�l!a 69·çPÛ¶1ðÖµ]ÕÒP¬Ëf`#uØÐ2 Úe‚™åë*]÷pײ¶åŠnnÆHÒ²ÒÚ}Ƹ×V__fÖмÕasuJöóIJ«fߎ³m'•viéƒ�P^�³B�›l!–3‚~cEºQ ªx`[ãáÈ!ƒ Ùá³GeèY(r鳫õ2êã¸÷·²AÈpš ÐÅMÝáM¹UL_�xV_Z(LSyÙHpcEù|®uÝšÜÞoj}â½�ž Íãb=æ4�†4EÀ“O­VVP×{ΨPfUÎ*üCËæ0+ÃòÕwÖϘ… M+¹æ—Y ]hØîï‹4!:¬_^[bèéJ¬�EŒ±Ýb¯0ÐìJðögްVžè!©jg+½µáVsr…1ˆ4@8ùæð³Úó;C§Ûš¼«2­äǺÅÝ1KH–VöpA]$�G‡oœZâ3Ýnµ²^Y9Ê¡jÙdF]ï�•µÂÂ×á᢫,yA£¤ÝÔøéŸíG½”BŒ¬ÇÕ=³äó•'Å]¸²øs²;<5�««éiyLæÍ²&׊eæ�ñ;)¤jy�ÑØ5Ü)`Ò³6†Ö, :Œ|¨ù †°v[/ˆ£zZ‡È÷À6k–3‰8ÆQèŽZ)"�9ÌüMV¼ç‹Ú¢bBœX°°-h±Õ}¹âÀ <©æ¡¢f8#}l‡( a"Ç�µS-î‹=áªjéõ�´XÅäׄ’‘$S,&˜ I2FKÍ‹EQE’›H‘HÆ"E’&a,11`Òc%ƒ *T ()�!²K$Ó ¢+&ÉRQ¡ F 4D‘)$`"…3I K2™‘’’¦(‰0–‹˜Èa)�$’VbŒ¤2dŠfÌ�ÉcCMQh¤ÀC,b“l ÐØ$Ť1H#LT„`a (Š"…4F“!ŠBÒRb“0’ÄFS$AŠ* #…�ÊP�A �™£eÑ$L¢Bš(šF$ÊbeŒ…$4S’L“b„Á1¢&dL˜ÙQbÍ"Q¢E À1D6a),’i) (F2˜© 4É),±(šÅ a4M4hD ¤%2b”@b ’¢‰©2l%&¢dI�"%±˜ ŠReR±"Å „„S4Ù2d¤ Rc&ˆ@¥)‰�‚‚ÊZ”`Ä! ²ÍS’$©"Й–2H± Äf&dš" $¤�@d L¨�4–�cD££R&eˆŒÙŠ0LɱPLI)IDŒ LÔ3E1 lˆ Q""b!)’i"Éš@ŒÆÐÒ ÒF6DŒÆ1AرÒQ0 ¢LCB˜m& HT€�2Œ�‹&ˆÆHÄŒ’ر±#ŒÊ`”‚™%,†3L¦J$‰¦Ì”M!H’‚Ñ„3¦$¦4LªM&KE“¦�š)‚b‰hɦI¬Ø¤Æ��¢RŠD¤!*)6ˆÆ,$4CH!12J0ÌIfE ™E#¥#%I,j ‹fa„#F,U$“e,Á ša0™i6&„0¤Q”¦’L¢I„¦P 11™ É¡%ÒaÅI´Q�„˜bÉ%’ba,Ö)1 $dfLTX¬Ri%4‚“04‰T™)Hb"’Q)¦˜“±Hd¨!™#™L`™1š1†lȦPHF S `„´šb�"ÅFHl‰`Qd*&4Z�†"4‘(šL„³Re†Å"PL”m6%F˜‹%‰6B)²Í‘4 "I˜Ã32ÈÓ “M"iLÒ4ˆPÒRb‚Ñ’b ‰©1l¬XE6¦™Dƒ$FØ� Á¨&Mk$Í”¨ŠÆ�£DdˆÅ””µ‚,¤˜$” 31PHPÓaRˆI4–Œ› %1™$Q†dJ,dJ2E$HÓ`DÆ,bI5%4Ԕɖ2L©‘&$“&$…!$dd”Bf¤‰" Å�$…¥‰$¢„Ô�TÊdT“2i¤²M#JI2B ¢SLÌ(›1ŒÄ”´L¢L¤’b%"RlŒ–˜L‰¤”(© 2044ØØŠCH…2CJ"™˜¨… #`ÌŠš&fYR2F�&Â2bÒÊ4›I¦Ô“S$fŠÉ0«h’ÁS(£#B5’d’)JJ£Y*–TdȆ3C$h”JB´¤Ì¦P™M„– “I³"M%EE‘™R†RSH�¦M11$”fQiJ”²2i›(š$ÔB"�¤°JÅ&”“Pʤԅ” 4¢’l24É™%)4IZR’I¡IBjŠLLÊ2‰“b™¤‘,ÒmI´Âe$”’ Si,&”É‘™1i)‘™”³M˜›JZ))&IJ2–i(™ÑPH’ŒÙX¨ÂD”%†šT•2Ù6bK$Í�ÉR”’‘’ÊE’¥$L¦²+Ŭ4°²CJe±´�5d�(¥dÈ•*Ph$-"XÙ&’I’SQ(PÉFHRY’a4™¥%lI³,›”$�5”Á‘%%%I¡*RA¤Á")‹Í’JELɆ&jÒSe)2Í-,bM$’Jd¤¦Ä`)–b‚-2i³6Š*’ÄjbhR”$’LicË&$Ë&@d¦Å2d“DÆÅBšRɋ͈”Œj1BCDFe2S!dH¶Y¤¢‰™ �šIMH¡CA) If̉¦‚ l36 YšFLf––V"[ 0Æ™±”jbLRš‰I²I6Y&Y f²`ÓJK2Í3IDÅ*RÓDTÐ*F˜a¤Ì–”†™2* e‰0Íi£L‚†m†)’�‘Œ²1™I(ŒLÅ”‰1ˆÍ" “Ii4’+)¤#JX˜b%%43šILY™)#2(5$S%4Š!‘)©# Ec4¤Ð �R’ff™”“BL -Å"d$i“%‘�Ù1J@cCL’Ie*I34DP™dif¤”ÒheŠ‘1DD¢Q1#A”Ô&(³Lh‰4°f³4¦Ðb’I&6AMJH@M0bD©4 Æ&+&I£2Š,JJJ$ÒebH’c! J0ÄÂJH¦a²XÓI2jLÑI¤É€Æ“Q $(É¢� ‚I ´X(eUABŸ^kòß\�:{<¬4hË=��ü˜ Íá«… ‹r�èñx�5oÀõF�Ã]©Š�`ÀG(¨a8;3W+@Êä/¢ læ¾(\ƒöî$’…J¼¼E!XjÚD^j¸vTÚ7uš#Ö;˜•ñáJåÚÌ�yµ£‹Êðpc/D#4yå‚wz3µ/’`ÏA…êbz<ù:¹â·D\»Ð…±žSÐÛ¯,e‡¸Æ ºJ–¼Õžf<•öfeîK A }R¦ 6*µ*­ Ã0KWÚÓ«º *‘ƒAã]´/ŽŒ™Ùîï ¡w�)\{ 抛n1¬J­Õ7½ÆXáUw¯ ®)y¼™–¶Æ��ë묫¾ð·GËÝó!±-VET<0Zi%S"…†à´² —ánÜ;¡~›móƒ-T°•ŽÛyS `²"ãRÎQ±¾3;ˆ„d´ƒz—´"„½ÔK]Í„½ÚQ¯j³Ê ­EŠÛÖM@ ‘P´óZë³KÞÞUµ»z0\Í�rðž~^©j¢‚îÅŠ«f£\yäªLÍòÖhãv6·ƒÁcw�q‚¯bKµR�À6²Äϲ„[´#ƒ+F4ÃxÞw”ï(:(ö.Røkx¡†ږΛ‹´æçkX8Á&VK�fó¹ í X /XÁ«¼± »œ º¼í“|¶¨?{—W`Rð`[I`Ý'z»3]m½»vº�ÖüØ|Ê«2Æ Ù×´¼[{ ‹†Ô;ÇŽt{bœ! åj³ÀÂn+±T-Ї¶ú¹è¥UÌUuQ*‚ÃBÈp—`ß™ÓDð‹Ñ5M"n7£•YU­î¤‹ÓF‘Ípvn a8œóŠæÞŠ,tñëòí žióÏ:È\ÅÍé�'æ* [u°i.�³Õ‘SûÊ# Ô=±I侺’,‚ÅxvUŒu­¥š‚ÚëÕèˆðé À‚µ‡âFzG©V»q‘µ¾gå”A¤b–ºc`îÌ [\ÁBñ h™4�нòhfçÌsBO¯bÊҩЩäTt¼{\+rÁ Ϋì²f�`À {’¯s¸wŠºÑ˜¹ezÅQŒ‹‚´U´kL]lpã@=TA|¨`ÛCg¥¢¹¼Á”GváÎùëN’)ηPî8-;µIyC´`�¾�e H£‚ ,v¼›8†X¡€ùĤëB”�QÐÇ|a!´GyY¶EÖ›ìΘ3t0„Í�ÑcK½Íܯ€¸;‹ÑÝçš|˹–óFŒàÎ~tÌé”+¬AT¯œ 6îð^ðÜ=W~:ª'vîlè;C°»½­b9§´Þ™æ‹«G›…XµÇIT×q´ÐYœöô7³EZž‰Ü*õOT3*“ÍÂÍ�&ð1΃Üñ ï0¾GaQâæê q½=â^hº¾0uð€˜#ƼŠMÑB‚±Â–½Ž:^+#·ÐUJvÆwUGÁOS‰.ùP±w~°yÍW]¯´J‡”0H™Å†»»Ç\¹y,;äi Ê5Û! ¢,fãç Xø]‹D-½X¨š\öõc…m£,ž”�¾Ì¶—€›<Åufõ%îLì%¾­R¶èv‘´zÃ#;�Ë^4*„4g%]–ókŽÜÞN�ׇ§WTò "UÔ¢+`£0VYG¯5åld&„ôr�Š­&§mŒÚqš:oèL®¾™ È £BÂÍK™æxÎõ> /6ÞP”pAÚ-hÚ,>à4J†ˆ¬],ÆÃ—#Å3ºš:o ‹ph’©6´9Ui4ùÚ¥å'&k!ƒ‚¿æŽxƒÐσC®×–4;^V.¸.iÜcˆiÙ&K V‚êá’)Gšc³ ÓAí�†¢lê¸×st3ho {°½ÍT42 ró³|8Š8òZt �ùæF¦nÔ–îQeÄ6Ú%ÐZbº­!½Yˆd[–«±aBà#¨^+gÊM$¸¼™lòxVæàTf¸eÓÉ(J8t…îs+ áGƒÝòw�”/×gh–رx8fŽm Xí8 ÂÞ<ÛšêóVn„ïtâóÔ]mà­›³:¥y@ƒV¶Æn÷°Ý½"û> Æ–Aah$q«tý]U¤'¡Ú>U �2»Öó0ç¦ç)±"aªõž›ŒžAxn$°!ü¼³åkF84ò†j1dz¨3Ë5¼8H- ÁÄß”èoMs|¼Û�¶æîÌìsºª´m÷œròÕáìÀ¨nò0ŽúÚ”Þ·Ó[wfW§~”x1�z/F‰76��üí!±ÂžVÖ±sÍkÓ<]]·»�(ã„ó™U–.ÎÎíNôJª#D>0ntNÐÓ@;v¶Æ¦0 Þi±žwmê´î1MçÄ‚6¯…ò!¾UU|ùN¼ªGÊ]}�‹ÌrŽ÷„�qŒ²&ԹϫÎò*@lLŠ5ÖÝF[âŠw”Ýîl··¯^eÀEh{¢ Ô`:èÏ'ie¡*Ç-Ñ |k5�¸ET„ÖaÃ}sÎU^Tï0#Ôx¤˜9aÁ¯w��í- ÞàƒâNbº5^m›\àÅÎ4ΉX’à*ôg�[HàÌYE¯6òµ÷nÁ®£1V�Ö!—åk‚ø=¹ä'kªî3Î=Ï/p�Xå+³´k-x éyn"íU`Pn¨É·r%ÂH”¼k©SvïÌ{§ŒÁ^kbžw[|lË#´-×Â+C,¸.»î•¡‰—y¡—‡:ÆåXpÁ¶<ìË–‹ã~9ÏŽÏ:µÌ<`Ï+. 漎Yp¢€^rÁ³3‡vÜh×-~qrîf!°<ªÍŠûœpË Í­‚%¼5Ì—ÜP`ëéçAÞK"�;„)×1œøêè— 6³�†àÚë �ÎÐl•À ¬ðA[Ž çL§\º±KÅ臒ùÆgµwT UKU<•PËJª³ô¬Ã�íBqôv(Ön�¦4­0¨µãj…P² –_¯¿ž ÏEî· îa¬§.„$eq ¥¯iÏKoש~¹ôär«PDX“ 1@ŸÔü¤/ˆîÖþz¢Îfÿ¼ª²9{õt”ˆÆ³¯3ÒÂbþ�¨J›é©H�M� Ùûpˆ)1e1uýÕçUÒÐÈ6ƒ1BjO¤ê¾ ,_ÍÏåMP´/­”=Uú>-ûzwS’V!Ú}Fx•ó1”½œ†%õûAĨ=ú-ºO,MCb6jŠúu EcÞ,—ý×õw™ü^ñK~ÚgÖˆ|¦Š}âw•;»³n-©É%T VS’F*ê༼™K †™mŸYþ½wÉ_ÒõKN §¯–�}~ï=f %Ri#¦Rú>õP#4纊#©Y‡½]�ˆ}g£*½Éþóù'ŽÎ¤Lïí r¾è|¦Tí�µRªÙpÖÖJ mÌ­ù?*æ‘�!‰"RŸN.ç�›‹…Æ ‚›‡ÖépV‰½bæâO†ˆgòuê•Ñ´ÂS:äi_G=m°š¥ ïÆ ‹ÙøoWðà¥G#ûù®« þ%uLm#Ž7ý0,¾Ýê¡/6^!ô«é?ÞuhÌu¬tÓýÇ'åD3J� f¦ 4vý&ÿMÛ b�…7Ùmš†—‰z‘¥ -�ÓŸOáÆ†û4z°Žº½Ãmo5û¿¹Ì©,í ¿ž· #ëvODl‚¼Œh>JõæWßã~³Ú.WJº'Œ)^ò¾¬c…oí÷S´c‡'^)æœt5üj©“ûP|S¡,¿iˆ}P£êÑíIãÓã^Ä2£¦‰¦@l×Û—=¿Xìz‘PÙ6>�³Óõ Ö¤Å�÷¿Y÷líôgJWL‹C٢ЃYqiµ7çøg–n˵ô„_+ö¶•vc­HC„:ˆ¶J-„~ÊqÑŸµ^íŒ:@¥ed5mÃ8pÇy<4]yïôàŠ–úÑ)ù¤GiOå,ª �Æ™%ñaêÿŸ²!Š�ŠD®“ !'y”pèòA˜¨?ó†6Si×I YçUB?ˆý]îï“t‘-¸¦ü¡UŠ×ÕJ@„»ª$ )"‘�Ï Ÿ²¢ü¹ýÆj|Õ…~äM—a‚X›l‡îlòv�í²~¾Ú#¢£é§óñ1>ž²Pt¦Eµ¢umP+¥¡pf…s‚ °Y+}¨¹ “.X^4“E¢á“!øóJÃÐêS'åq(V$û¦Kìå~é‡ü?eƒ÷]yBÊUCˆ™"éÚÖrê‰&Dñ†O ™9„iEЙ4ôM{Ì^ÿtŒ„�Ç~³«ƒ#§E  ÕÍ?ÇR/dqðú>�Í�¥~Nu÷^6!#,"è±"Èy'uE‚VŠÌ¨·Š|‘;‰IsG"—ÕGÞ``}¾—é kOÑ“m�ãŒ(WöüÓ!¶ýþ)jÉú>Í�¢QðØl—í&W%æFÇâ@Ÿ CèÓ�êx�„Ð_«ý|Ãxïó"}¯ül³öA°—Ÿ‘‡i‘Y™ûaúû`dŒ=Pß¾–ÛÙyƒX_«§‡ÊkÙ¬959V±CÔ]kîbÉçæ§UßãÛ)öž®?ňë쪑Äþ¢’“¿�Fg,Ö²¢tï×tö–p_û4è©§s=Â85D&AÒcÿ"?6¿˜ØV–‘x@ÔÉÈÊPl’å´Î–J�¥uñI|fŠÝ+L˜F“4a k0À¤ª†ÃàØzBS@‹ BM£øBæ´Ö}±ø|–qøµx ?jÌ$BAñ.¯,©¢n¦š_�=JKAj —‰æ»ùJÊÐAs0D8V–\©—å¾$|¿Cjˆ ÄI j0HHMÓ=˜T-ìÕkhªg£Fæ&͈g“¶´[þ{Z“S€„\«ÆŽaÑ_ûŠ„ÒáE�f/OË?†J¹–ÿ¶¯ïú¿'Ãd°§uBh¤BAìé=*=¯Œ^ŸŒO×Û„CG¢€â�O?e�¯16pã!%í AðÅôé›~'ÎÜŸªû¤I¤RûkŒ:ø¿£@�ÎÏ¡U†±åФ*ÝÓšpƒ sú?�ѹs$–²C)Ö,ê.‰É’¯sþ«8IÝmQ ]M¤tŒiýýwE¾sükú ¤mvç˱„—^Bb{ûOÛµû•3c´¼HSh3ïí¿ ‰_• “š¯ÄÐÈ‚!˜D"ʱt¿æ!�,ãÝV®ºý#1¢ÛŒ {1™é�(1ã—;’ìØ¤Œ"’ªê ®%îíµ¥;VÊ[JPî@—2âQ‚qæ™É¨†> Ml…Od_åó(Î.ƒnJtDHFc…oéÍÁÝ#EêÓ™©Q eD¯Í)ò§–A"»ü}j럕j® ´MqCàJò؇q©*KLÏßϽŸ6¶ÈuéãàÇ׺—ÚÈ# ѦPµ*áÉÏNìÈ‹”_/è Óh5¨•¦TU6¹õEP¥›Í×ggšÃÔš’ðè&©nÙüB}!ð“á4•®WwL£e·— ðü¶1�<⾆¹‡»˜½Á31Ã2bÉ ¬�†Èn‚ŠmºGGÄÁ»}3È8ý�T=+¯m3å{1�}“5ù=fd˜ü†Rt“¢®ýbÊ&ưÕkÂ/k¶Å˜Çɽlª=¤D†zÚ£ô½;÷õø|õÞÛG‚Ñ I¦a•u¿¿�ÄdY‹·Ì Gäe0e�'ôø0� hwpJd¸ìÐ-6y<ý‘Z¿u2«ÔˆÁbÌ”¯Ò¯Åv":8ü¥�ê\J£ù—hò¬‹¥»Élf|¡‡ÄB²µVO> ^nùdR PI„Nâ~ä¿U† %/iÿJm²3ärµ~Dó‡%sK6—(rSùÍV‘\¨œ¬‹ûö±@óÕ&VþÞk׿úË$QuY,}¬½~!„«bÚ¢W…*ª¬Þä‚…ZÒj RË ¨Ù±I(�†É,UsÜþ‹^eWÑ–}ÊñR™�Çíú•Õ($ºõ¯Cz#Ä£'‚ {iÊi(F"JIi“éæråéÿ3Šâ}"®: Ø?‘º6·Áñ¼¯«lO†áþßÝÑåÅAA”3X„8}iÄݳLÇäÊŸä<ãàˆ$ÄÓ3ƒn' à­—ÜNT9AR•t†ÿi“Þ¬´Oªx/ôÚ± +–¯¹d×Ç—ý/’ÁËáöL”Ÿ4t}÷¸##ëÔõN„³¢FE`ýWʛݴ£ uGÑn¢ø¥þÛt pÇ!„?ÖWêaÉ‹£-=Ü利~LñœÖ—©$44W“­ù`Þ1Ÿ²7aíS2¤)( õi’,ù^å(:*1&PºšêÅ@#FM†eRbÚ©#¸ß•�Ò/Ó]]*UØ¢U Ì=h3ý,6•uŠd)]•Ã8¯®ŒY¿hR"uÖ½“J#…<�®‹:þ¥ÂÏÈb——UkìÈUtºYr7ì³TOrý•:èþº³´‹w+`E¯:ÖUT!Ï’íq_»ÈN¼–ã¡P/å!C_A£/R™P6š�|N"MT ³¯;ÒòÝöLzü>ÊÁk“w'ßù_AëàAÃîAî«íD׫%?«Fãjö9â*úMÒó~ʇ5®ô‡R¢-#‹®}/äÌž•…FKë¿(„!Y3ªñÐkåܶQyêæíÅ•öÅïîÄ%ç¶÷ÌlUÒ§± 6où÷Õ|¡Ãòùù8/í}q§`§kñº/(KѸ¢‘f�z÷ë�W”’lBç4 ´ëJ®øÝZÒ)Þ½~¯Øô;`×½èQ‰MeÏÖL¿ŽÛgw=ÏÙñîRþq_ÑÉI²²[ñ)�¶¢ðŽªlþíA;ÿ~㨣È�&ùûæ'¢>rÊZ¸’šÕO÷tj Mµ:¹‡z"ª&ñX";ÐC¥ÒÙ÷lîóº¢r™‹¨\ß<…î"wOTs¬ÄM÷X/%/=}ÕÁßkõ­­!}=Æ,D~�O~׿;í�)\J~'¥B.™ÙnwU±fdt}UB3|rê�†ävUÂ'㲦R•HCÑàHJïÄÝ!?1ÞÌ®Õ�ÿ>ÒÈÂ>~ŠÑE ŸÄÁð‡ú(›#½)`!ö�hE÷Sð®>~3ýwªzºÒ>e¯ ·P"E¿Ûú RúÍu»QH?‚¾4@€�g¿¾T…ydí¶ó å,2Š;iÈH‰À™s~¥ÔëÚó|çžK<5a»w!ÄåJ?Ÿ_Æ!òâ ’Çâeóü0D?³ Œ’=rýÒ$W®UïÖ ü+Âh$ òb�y² s'ýrýz…¤CJBQ²¯¸pLÉÒY×êf& )ñã«â˜úè»Ñ܈ƒÒÁÏtz%±x‘ÛJ �»ƒ±X&FR$³‘8_´˜ª4„}×ä›L-ŸÏ«õgÔØ,ù�¿r~”Ô(ŒààÂ=šeRìi’}ôÍ[@ÝSe:DÉ­ˆ‚""�B|C®^‘[hbK¯Ô[ï Ž¢&Dï(›Íï:,I�ÉÒ„ 0ȆŒFC{@j`—ò f £0§ÓB3ÚØç;™Ü¢ eàé:iyw%—š Ò!u7ùiÍ¿g¬ï]}—š~Iý%ä ò‚fèóÊ/Z¡ô~Ò„KYËæÛÅx‡~®K~ß÷Ê×ñÙô™ÑùA³ô�’7Χ�*«@’Vy“�èù—„¥XÄU¿(6ë,"ƒÌ(tCÉy7ü£ Jbùt V¯Ôó)B‘D’öQêŸÚ^Žïz'(<Ù£�ñ!UÿKZMSñ\†hs'vÅ I�$ï“︔„»�).åE•X&’‡8Q÷>ÜÇ©ú”jYPéÅXr¦å¸t!k«JAmYá)IÏÒ…}{[΋|ÉÈZ^*«SpÓYOgS8lÔãÿ‡-wÓ`pV*‚pÍéŽ ÙcŸ—æ}[•æx• Ìl Ñ¯+­ ±ÿAÂñiÐ�ç¤5àŠ«­ËßC ‹ÃAáˆ"jø¹Ì2tB†µˆ€Ø[ø3å:ó¿ëC�¯Šã]7ú ?ãÖ‘5T Ó³ë…ùVUš©”èTƒ’ÿÅáÿ#+[¸çθTñëlÚ÷Jå¼¼’ÊwçùꔾXíX©`ÃÔ-¨HuôiªÒ¨ª Æ! ÿ� *ø3ëtË$²ª{÷4ŸZ?×)Žï”Óª¢4؆ƒ¨‡² V‘¿~òi K Åçúº$þK2|ä}R¯¶¾Zß 6�k'‹Þ,B; øn8ÕF2˜»éI§—2~ž‘wMß±\žÅ‹@ÅGýZ„¬«lþ•ømz8"ÛÄ€~“ÕvJ•~Ïe¯wóY%êÜKñ~»/0]VŸ,ˆé õJÌuágž�5VžÓgã°XŸ‘tmCtœHáõn‰�ÖMÚÌÑò•Kµîã=ÂIê¥]0H5)m0Uæã§­–L¯g-+ÕÏ•òA™LÈúIô¿—TŽ?¤>u öè<¦“-¦×4Ü�S~[#óF–r‹*~R�NVÔ'¶éz¶è¦â�™³ôrîÓü4“q„J´Ó¸‚vŸÉ4Ì¿0ÌmSi,ˆ�óñL ˆ´á%•TŽS}̳EµY5åŸö9ç¤RÂøñ¯¯XÑó<û‚ 衊|hð­–cˆ#ú¤.1Q’>'©mOžöÈÏÒ×MVÖ¸ýg¯ør3ëïDŸ. XüXÒOÞW£\­¶“dœ4|´ UÁjdŸÕ/íYâê’«H¤ŠoÛb”I[&•ýæmÓ~�5¨^z¯'Wd¥”“QWý.¥éýmóN¬|´IÄü-¢R)IšH@‘Œ»/êÜž'é²HվȌ‚ &ÁI¢G+!|tÐ.�öÀš€�Æ� ¦¼i¥eBÁ@¿ú&NqöŸhJ‰J!sÛñ3PÝ(H«¨ˆÊ�zí®ªËö[Ô¯ÉDa M¯Òd‘Ÿ93 ™ä‘ÓŒøA>FÃ�éù´‰£àËŒj#Š*A¢Tc¥PB¨Y£î�©`¥‚ü^Gä$µºË©^&BðÃOÚCú K·…ÂH_¤Ã nm* 㨠gÆO„SmkrS„4ݵ(m�Œk@ùDŲ0çº  M´}mÑ@ªOŒºö“º; õ—~D&ÙüQ”m6¨ ‰"ÿ¶äoè«^˜»ž0þŸãPükëí&ˆ¯AñêTHû^Ú•DD„B×�Uål±éÉú¤\gÑöE} Ï¢=X–¶(«¡ª "ÕßæØ`ÄJ¦¾ˆ~©×ºqNžo¨Å’z©êêÁ$‚A¯ÑLØHR@øX<ÃàÍ÷2mÊu‡réV JPºqÂUxXPP@~�LB÷ú¨‡¬”!"Bý& &}*ð�Š?»~éü,Ëlæ/Ê@ÀJÃò ,PH‚R##BGí�{x£NéÈ£û�º¦$ýüÔ!•çãü±� ļž/XÐ`Ö+°ÝͰ‰$€H&‚^ÒuúŒ²#!µãd2Ê[yOòqAð´¼ ’²Œ „„h2úH5cáþœa$¼H$eÁóP¯ˆXa1€7úLD*½HLð“Éõd¢‰H‰_„?¬§ø›@ø\AÄ ¡^ö‡ÛDP šj—óÞÖJ ,¤G÷êîv È!©†H´0ÕS'í7Eþ~ŸdvC9û2é�IVˆòq Ðb‡kÅ-Þ$ŒÞõd¶¦’JI ÝÄu/“¤:53D�‰âXФ’+éª$ˆ•›2€Ž1ì²G`l1ïíÐ4R ÁÄþ’|©¢L$–‡£%'ê/„™GÈY^žÚ²A´ÏÃeÐH”é°FýÓ3øpÁ8C8sòÙ¯W®hí8@ý'J$p„Œ‚CÆ þ«ìÕ 7! $© ixm¡žëæ¹ZLª¥«ÚÆV´v¾Ÿ‡ÉðCï脵Xúóþíþêy� ¢ƒÄ1ÿÄÚd`àØ~L©á%9±(L±\ðø1*o9íÊÃ7Ü1ÚBwŒ€ÅøÀ–Š`èê¼hõ.ß<ó„ Ø¾Ëã’¼gm‘à»w匙aï^VÐîÛÁ×ÀP¡ö»=æ34DâÞÈûBTx@ë²Ò/mŽô€VIã7Ö;9|ùØÎÆ‹Â9EÅ^ ¶Ô†�„ÉóâóÌó˜‚y�‡{©ö,Ë÷º:6(kðÕ »Àî•„lBI¹ænÒÑžÂüËXŒ.ÎÎc‚W+OY»¤¬ò «ÚUc¨ùT(’X¼Êæ5Á¦á�ÁÁž;Ï,Áà»Íˆ¬Bp´èè¼6 ŽŽ<#6ŽèbVsÝZqIèúÄ.§ B=éצ¦ŒŒ²š×ku¡»é+ëS40�ëºÌ±]Bíox†í1/0ڌվ”ULáhen_x¢Ž\@µ68VQhMÍ*Æp±oz›µÈV\Ž…ê!&ŒèD>g+9K£Æ‚§+¹ð±JùW·óÝrCyËÝ*òðÛÑ›¹Œ` „Ãó�:Ò¼ÑtTæám)H.³»™™MÓêì­óc5眈‚ ”,“At]º!°ë‹ð±+®ï¢�È÷]S‹V31ÖµƒOz6LϳIZ{·a()m-ñ sÊáuµ`‘œCn¸÷Ž À$a` Ðœü |° ~VUkÙbú÷°UZ×£@U¶l�&#ÕØ)ßHYooÅ~v¤heµêP`íî·E,Ý<±m!S8_ 7vÕåtÇ|3ž…Žuæe°cµÂ#1Ž@³tt»ƒY­Vb64q L!ž5t¶hC·íÛç$2 ݱB ´Mc U±uË­>‚ï Ñ@†:†Ü v…„0ÎPb)Þ2é-®�”•’ö¼b�ñÌ6z¯B˜áµÞë¢�n>çEuÜ�¤Íß'EÛ¢&‹7Ü/ám½ …�BýhÖÈë�—iï,0˜Ò7Í ðhaPWÞº¨O;õu},x”õ†§­¡L<ÓÔPÛÊÝâ©ÝŽdŠ(ÐWgžF³,É¥Wªˆ<„U±ãóÃ�¸p¥YMp§®ìœ™¦ hÈ¥7�ää€wLÈæê7Ö‡ÿr¿ßÿ¹ùôk‹µQ|ìæn*”6' ¾ø†ÇëY(ê@Ñ™ÀÆE×kÿýN5¯hu]yå¡xz÷Æû¥¤ðó áâws.íeGçÁÀ~~;cøŸ¿=°úlØzoäüœh‡'çìçQùͳ×�™|j†™çÞXÇ��¼ü¿ýATýÛ#ÔüïÎÞŒ5ˆ‘Ïlî‚+Ú×Sˆ*Êöë*lMÚÖµßßõ áÖOŠ/ÆkÎ'Í®ÕÛ˜ Ú ]�ªèµæ^”/¡Í¿VcëÅÇpÑ>ßMÀþqâè åØ8eÃh›Õ#Öéý4üÈÊ‹þJª<Å@oŒËÒ4Ç3 k•hüVŽíƒm÷hµù¯8Ø|ž�.uç˜qgë Ûøãfº¡ý p˜~9ú±èh7=…$î©x�þ(žl}of•¤¤n¶nZ�‹*i¡ƒ<ƒh™ÆI–‰—þ(‚"¿+sûÜ—·¡Uܦ"óØë3²t¨Ië›­¦ªC�N_£q’×r�,ÊJ-LsÓ3$Þs?!œ¾›yva‘>îBö7àZ�†A@[€9ߤ’b犊¸åƒ"»—µ¬ZÑÖ’Ç•±z$ŒÖh”˜–}¬xãädKbqÓ/Ç€C†bLzî±@Ð’››ü‡!r>¼u<ëUÏ!10-.1ß/ÚO.êèûA|ÄnÊNe>óI#šÖ¨“¢²›Á„¥R¯'#Ïm+ò}íÀì!:¦dR¦éÁ„p”ì¨\ÃÈ¡©!12L‚ öB܈3ÕlF[k;•íÂ_)ý¢‰ižTã @�$oU*4ûÕ‹èaõÃPáK•©�WíYçÐï(C¨ 8µ�寪e�$¢Šç“V­7X®e¦ÃcZñ…®q"hŸþþÔE''¨/Ò²ÓCPa5G …B‚ŠKY ©`âot.!s ÅT®ax�0${ËgÌË6åî‚* mËàúðz\Ç=Ùý¦O,‡ŸQáðªóYý¦„ÿe×À015+¼b·5äZþ\r*aá¡�œ-@Ã&H’vTè|Ý„.b®mÛ§ŠCM¸†»p=â²�»C‚:õ¦]ÚìuG9DÄïñ�½ÇòðÇ×Ð�Ùý x ONNýy¨_΀Ä2ÎÞ| ëö=Ç´•a}îØe¶Ë9vWõ<Ó•ä¹÷ù\û©õW¢|tR€äžÙõ‰‘¨A(?ׂhi“”CŽ=ˆeŒgÍ:æUÌ�_Üp#F'½•#bFUH„î…׿hRj!þ (ƒµÎ¥$Ý»ZÈ hz”‡=]_´cz‰ÄÙñ‚ P–XTÃOƒü©Ÿ$l” Ø#ÀM�àÐË’`ê•@`¸[k¹¥™à¶Èh Ô2ž§ÕËî™SûAûA*J¢?ˆL”3…$:sû<�(¯% †NäêuôP}Ä¡/² ÃÁ/ö<þþ§¢ÊÚeX±öuM%bÉ¢>9„EæÄBùwl$çýå§“j‰¼AO©Jí2*Ö¼ã-cXå àÐ@}­|‹°štWŠÂ eâJÕH+uñ)GuR+àb�|`БL¡éšQ`ˆÀefF°*oå :¾ƒ¹‡öºÃÖ±µeñWËŸÅò.Ê„¯ù›d*º�”A" ‰Æc@×±çŸç²>Pxt‹BöK0HÂ.Ásk}W²¹j^zïÞºS«*Æ ;ñ¦× ) ‰ bP– ô5�A„E¶1 A‹WåÜκ¾ÞU‚nkVºk~šO :S“µÕûƒ>Û (~µçÝv{7køñ›™¨Öl´¦´É0›ÇWjÃV(4() ´½^´·ˆBB ™û¹¢ÚZ¨–¡´´ ¸@„ÁˆI%€@Ø6…ãˆUœÜɤަ z*YŽ0 o¬Á®pº°b˜@„¸$�ÿPAúççÓ¯÷>\ Ï=aÀ÷žLž¼«òýj)HÝì`�ZHGº6hû~M±Ü­Rñ•cª=L\’Z‹¡Ù_øyˆ\.¢¾Ö@ „ÌU“Îâ£O÷lj`Úù—õì#Ö »¶±sÞ¦€Ì*1b$ðÙÄ‚y11W³×«›nÊ*UâR€¥y(Dæ �0e*ùMƒ�„ÿ5ã yËf^Ò®ò#t mÄ~«äOѰÙ#2c'O!F4{hÜnçS˃” X¿�m�Hp¯ HHVø‡aIÓÈ„äCªÿžyjcã&.pÌ}`‘,X.£@gåzŒ„†g ãk&ƒÍ*&avȯåå>Q?ˆ6ï|°&W}‚çxôöÒm›Œ¾ò¹.”P|Å8#póÉ#ú¤©ŽR<ÿ0\¹×á±3 m1)åP0:hú¨ €>ðåÖ¼½Œvþßþ7ü᤾۟Ûí¡æ¾n~×øQ2îÞ¦ü··y�ȉx[«#€{[^=×Ü]5|ª“FR� >ºÂ%Ap»ü®Ö�¨ì;~ÄT_#£Ö8¶üS[æÜ·¶˜ñÇw¬„ŶØwAóÏóFMþÓ«þ×ëDl—v{�rï ™Û™øF0ßêÝEÿ\?·üv[ù:�ƒÁ ¶S·ÍÞ¤†6ÅÁ»ìÓ‡ôÝ­ßù‚–õÐBaŒ\g˘")ðyßùÞ ]yekÅÇ®º yñ 7åÿ®´üŠOx0:ÁÎY½üúr>þ¥óÅù°DïªR" OŽ�ÿKZ = '¯x-P”?ÁÓÚ”}[*êíêÑ �ÿVçÅl<˜Ú²¬Bäëô p§–ÈJ��Söä|·tæšÕº|>S´þò/R\zôº3æÐú<ûYíÄöž(�Ý86zÁ¼{ì™0ñ©þk›¡ÛOùAý¼ù vl)ˆ7(û»>wŽøìîuîÿR¸—ÕOU–aë\r5ä8ZWòžoËõaãÓƒ77ÐÂ4zô=}÷ÝÅð'¡5wGŠ6^ÔuÌÙÉÒc×q‘—Ba7p³91Ÿ¾ø§×ìyáï–m³µøÝ ¡;¿ïpàÚ°wŸ�óoG[³~„ñO~á-ëµn�“ƒ�ã7p wÄfZ‚U£¶œgË5 ‹åªáóßÖwÙò)"'î½ãl1ýâb>Ê�…y�8x^öút—îÃË3ð¸°ÜÆ*ÁÚS¦uæ¸G‡†þrÁ{9™‹Eä�â7‹¿+yðLíÙŒPÓúMšHxSÂc²TÅKèóØ{íôA»yÆ9³f‚Ø^$ä0}s}xºqû¢¸õúÈÂý•ìX0äÊ*±(ÊÊP… ùÁì°VÃßyi)$Ôû´HJûÙŒ¦„Ú:Àj!D,¼ž”|uí(ªx™®ƒ2XknÇÎ4�ÑÂ�æ±Hy�&“~ ‘TQåÜÅd¢Àÿ‹R’‘ZËûLRe*ÒÈHêRPOR1Œe´1´ÚŦ ±Ó�&“‚½ Ö„Å�ª{|9÷lÁ±ʽ%ßÛÑS¥¯gùUo´‡ÿs‚ÑÃçW £™½LˆBtd¿ bÀçhHx† CŠ’�,]Æö4aéªs¶~UˆzL¶±b¥¥^¬O9}1~Åý-7Ñ»9@9ð'4p+Ív$cLX ®¼ù•d\i åcL‹J&¦Ò�y]¬?òO„°×´EÝj9|A¨oûÂX®Ù¾"^Ù—ÖKïwr^oyǃ�Üá gMZTd„k'€À0&swÀÁNZ;ÿPAü0!îoꇆ‡?³<ÿÜŽ9,Oíy:f°ˆ,âb‹ ²å"ù°36¯®áK‚BPh¸Ó!§ñþ�öâ|'LÝÉárô!ó(ýîùO\Ζ€]í*™ù¹:±|à»0tÈLp20 ÅlLæç ’àL‡dçl”Ò e)ÖŒê˜^°G±2›É’w‡Y$¶œšz̨ñìÊñÚ‹Ú®¢IŸ‡»ŸÝT“PY½åž8„�Í9 0EØï5žmòŒÀ@Å @«$΂ÇnÜ_7/ï³^Úz³Á{»yô*- ðÒ�ÇD¿Ý‰3i54"V§YÛFã˜û¸ãmF–ÄÆc+5J1BXMT³ŒVœxxlxCøšiDò)Hº!0:¡aˆÒáõFƒ¨†Æœq©¨æØJ‹Õ‘ñ°èY)¡n˜ñ ÄP@`ýžGó°\@èq>þ3¯”�Ç�æ´þê^¨ºe†Um•.Üÿ |œŽç›ðùSòýe”mÓÂãqó²9Ù2kÔÐÏ‘LdC¸ò8¦4ÌÖ áµÌ")©•îøñà\ŠVl À Ø¸\24²di‹=‡kRõæ (€Xõ÷Ï� $&ÿî¶ëC„ò8ûø<}ò%l¿I¾|pϱñ-·ì,3Ð�e]þ{œ&4"W2Q¼®Ï�‚_«�øüñ†xˆg Ðg²o¾Ý ±dg7‡¸õÐpíN;‹žâØ8µXv8†Gxµ§²ÿx/®Œ¤$$®¡ŠV^1A¸ÃæÊ –º�$ãõoÆêô°Fö?¬‹÷ƒfñV7w2Z:9éü—åÝReWÇŠ+æÆÖÉŒ¨ŽWö5k�IÚé¾ÿEªUÓÇw5–åDÀA¾q<Êï ¯êoîþÇïyÄ,¼³#ßö>=Òÿ†ƒxÍ`SŸ7Øxh£›éMS÷ûÜüœ…=†C= `Î$Q;Dp›�‚/çˆK6|Î%ûÛn:§žžÁ®òàt<èR‚ó—ã )3ì€Ø°f÷<ˆR«äúÌÙÕ`{íw§l[Ÿ³«÷÷[�>5þïÊ$ÙÙÊÚÁ&´0ij›*÷±Àx9Iý~MÝdBÚPî.¹e„Õú‡Wk‚`ÿo2iÀÄnÔ`»I¢j÷Ò ýÃÁ�¤¸:Z­�E”¿Î}âÃhˆHyò<õQOÅc®$¬ >ùùÛÇw™þj— õŽë__gç~võÏS«ã¶k{h>eî«V…yûž›`vÓb=™�PO`ì8w‡|„ÍØ~÷ˆ¨õr†Þ>qï\~Ì®&Dg^üHsÒòGïŸÞV]Ý?·°qd^vôña„›ÏÕ_žØ„šÜ.h¾*Pª?Á$R“œÊÆ[œ@•1–±_a&ö�ª®‘Úi¹?Á~SÛ¼ã.[ã�c°¶c­è{ ÇÓü¼5ÐéÁÁ§QA¬TË€v ü¬_¢ÖëÙzp“…Ãr'õݘ��1¾PD4{ò/ï^‘8ÌG/Õƒ^’þgg‡ê"Råœ(YÁ%¯Áà™pÑŠ” CÎ&2è8Vã°<D†Ã¦XÁ;¯ÚÎ�†äÀ 2$Àõ¸ì®#èÄùÁ EÝšþýGY+¸~¾WÈ�÷°¹nïÜUç]ãm¹_?zñœZ³¥ÿ_üì¼mèÇ�áó—üŒa¶Â¹Ö`¯Ü÷ú½à~êâêÉDSÁšƒ_4«Uçß™¥Ì­·ŸzŃ_Á;óÆQ¶-ktî8Oi�XüBï#'�ò@â0J&BŠvñ¨I"`dds¾0Qj‚oÿšÊ•jRH‰Ÿäœ¦ï5 L"­IÀ�¢T®kú±J9üäta«s eº{ÑI$"ÂB Á>� "Ó&…Â`) àY29+wRëÚD3W6%6aÙ¾–Ý3ÛÚ²&IÓÒŸµO^¬"ÐúhfÀÐ Ü,];ÂÚ©‘Y,ffŠ,+`¿!Í<ÎâLîsÔ¤¼Ÿ[õ¾é¨eÞúyäWC·{·máHÑÝÛñg]<¤š”•â^Ê.y�Ž9–ŽWs²Ñ}v¼?9Ú³=¬››éwB6¶~åþ±¶æAª„ ›ZQc�ä$�ªÆœMI”a2‹þÝÄÕ͓§¯kÏX¶%FHÿr)ò‘[æTª5*‹O´W?Ëí~µ“`m°äØ ¢C¢Ø�`^HÀJ<­Ê‰Õ˜ •hhCú€¢¶�µTÎÖ$Û®<®k#ÎùZ‰sKh[9y¤§�bÕåX·'STÅd%˜ÐD¤J„…"æ¶é¡!êf`0JK¹œÔE¤4¢O;oÛ½X]JE,ÅŠ|µ€Æò¸\îʨ?Òtå×À‹À%‘š7�ND ì|`™h'[\ˆ·Îð!r‰ Ù¼LÐÌ–"Q$H0—@äqó¡Èœ0ÂÆQеÄ)I؇6Ap¬àæoH(ÒHä®î`8©‘HKÉWN `y™†Pº×-£¥ˆÈžÐeŠþȘ58¾|µ+gxX¹½Û_{þÙ«l??xþcmn,ÿ ƒ,e&|@�‹ºÑ%Oóx‚ÉX†g‘G¹ã�˜Ë±ÕRd¢\«ÞÐ…U¨®u‘[ÂD-”CBYnÄ_tUADË纈ío=‘@ør?;å%�r™£51Í ÆØZÎ/°z©ê¢?}2jß‹˜`K�¶â¯Õ²ˆå®U´³*ü­v‚'nìlsMFÖ»Ðä\'þs Xõ‡c�øŒ:¸Í.ß—ÐmE!x ÑëÂÂèhjA¨Sªð£ WkÔST«¿„“Ù…²+:Å€Ãýõ¼¤)H-ª#·pî: ¢™¸è}„·ïß< 8gɈ¼óeúQ‡® CC\ˆŽõ°¤&c¼òÍr"ãjXUýŽðš8ëÝ?·ã:éýüÚM2ì"4Ñ·\ÑoÏf Ö�°ƒ l�ˆñ·‰øp¤ñ“a‰ýçûqÄŽâþ™ø(e80מܽÑÚeêÖùfùh«ož~[àë2Q Â÷ùá¹#uo¶�ixÇl~ûÞ£~9xûÅ�UÃË=e=sõxOA¹õÛ�º½;ÎÚÃÙøýe~…ôáÏ~º`ŸM_ßçd™ÜýoöÌåøj�½¨á\‡ØÄ†~·ûÇa§ÑœNt&Þ^UUß©¿ÀFÏÏâY[1#=ÏÃû4@>Â$ë¿Ë³°m“Sè0Lîuu¼UCÝ7c°A/á‹í´Å¿n4 ¶ù®Æï»jb™7»Rí;˲¤].Ý¢ “äÞX ï7bC� ã/ËlL3凬 ÅÃê fÂVüñn¨"bÖ÷$µªf$¿¿Þ5nÝ_C¿C¸ÇC»DVÿÊO;Stý³CýK¦­{éß9þØ<;Æo«{ˆ{ýNâ}¯Îþ ö5xh h§�ð¯�_Ce§­þséõ¹¯šy ´3h©¥Ì&±cs»¨ü,È~‹É÷ÆíÃa@nªußÞ7xÞ+ÔBÓÃÏÈr�LÖ–®@ÔŠ®…±‹çËKhaÊù{Þ�gîm­üŠá,ƲNñµó×…¯Á–k'ªëÇ~­xÖ‘2}fƒ’4ÜØ£àÊåZ­ZTÚÿËbÄ<1kåýݵÛsßw³æÒœòë�š!œT5¯óÁž6@É� ´3˜Î bÀÔòä[í™fàÊt¬÷¬‰œç2ʳŠá§Ïð9@à58…C#˜0,bqRù)Ih:•–7::Ѿ´§cûâ§5[˜W D�Ïó2²�²ôÿî °D9~¤ $/a{`kboûtظ—À6HÄoIРµ�…4Ë!²[]Âð« ¢d§Å¢¶S@ÀeÁh»"Z--¨B~›t´”û^‹LC^5io3êæ®5—ØÏ–ØmFÐÐö äG`=6hÐ�".Â4²^á™!Ùõ�ÞòIÂgα[N~H¡Ùü"Ž•H ®Í‰²šÐñ L…Y@�� -¼»yíPg _Ó~ƒù~ÏŸ7αèK5™‰€‹ùS¤`XÈ*hQ•´2¾9fɤ¦q¸I±æ–‹heâRÐ�õK£IJØÆm¼?ä;ooáþ¤bU»´éIò‰;L¸“+Éæ¤‡W1Û:w� ¡˜qi«%¨¸ÒØãDz-!ßõøNuGßí9î¶+Cû^z¿ŽU¾ÇêV„DÜ5ùq뢅R:”†ƒi‡bc Ù�sÎ�ˆŒ8ä­fL°fhK“6]ÍØéû•ÎqçH¾°ÃÓ+É(ܰ!b}š¨!ÀM%„92µ9–¥ƒ$ƒy¡s9Jh� ÝD�Äâ>Lînp0B1²a±Î|)�BBÁ÷�cuì`ßž—¹�_ÊÍØ$kGQ¢\ÞeÓH÷/­ƒm�³ ~Èdhã‰ìîÝÎ%vX.ùMZ©O%à ?f…Ñþ¹¯ixpØcç]îñŸ—†º†È΂»±vôÝøè'õD(ƒµ:õwøüùRá•¿LÇ-í©÷Û¿ÏšÆ<÷wže‚§Cå&8Þ¢ÿ�ÞyùÏžÆ} ý\Wçš·®Àÿ=Ëœ>z§ÏŠýèNsôƒ¶hè´vë_Ò{Ý8}?˜�ÒNÁº2Õ‡¨ã… ¬ˆPCðÍj5õ%Þ1/uêk͆Ëú3øðs(ñz>>¯xçi ï!ÜHQË49Ž6›ßrt¢#¯.¸»zËûo/ìýxò·ç°ðJá³ÓÅö¿oVÐÅ©VÕ=Ѹ·| 3Ìne_®Ftwðb Û^Ü?ö íÙ;n>O¨Ö¹jônlÇž?Tqzý÷äkh#SêÓómr s¸} �aÝeÛËÿ(ƒŸ¿ƒû�ÐÆZöØCÁûϯÏ�àqž¶ZmŸÃö'œþ{ó» tøÍ¶¾<ùd:ñi·TÕ|˜Ú~~ýï±ñç?fzù­‡ Äí.‡õeõCýhûâýÛ{B Ù+¨óôÆÞ8l·�Ý?�48>Þïû#ö#ÏœõãŸ×ÓTlvùìm½§¿Ö‰y�‹¯æïÚïæxýg]ê4Ý�GÆö¹R™®þãüÑw{öÎÙÒZ]¼^ûD½ÃBî¿Ø™þŸŽ·“çkXÿÓû_Ê;;¡�>�Ú9á|ŽÁºAý'žõ—¡ZhŽâµùèOšuPî¸Õy‰õ·qžZ;ç²Q76lSÌ;ÙϱŠ{›�ûÛ¨À¸õg_z½!j˜K d`0ÑÃ_á?öÆ'ß4gô•ñ¦‚�àÌÔr;ûæ=ÏìZ] ƦÍÇk{°ð!ýë1èz–qç÷¡½Sð¼÷ì»ënDµ¸‹27äqó‰Ëì-)ÕÕËi,á’ÛΓÐíî#×ë#Îò#áû‡gçäŸs¸+f] sø�~IÄ\‹z¼’ŸâcȤ~‰Vu½®9;YaZL‡ò�¡‚üž>,¦Œ0$Ø=‚žÆÍÎw#Ua!´ÅMÉ™(ס¯¹BãT°H H˜Âa{oò¿±.¡O¨ÙËfõcmªÑJ²yÊŠz¡^!ÄÕ·÷X‰ä•ÈÀåoÎ�Ín6_ªàX +±BKÈÖb÷ M‹ð©He`.O8ܵÖe*mTwi3ÝÚI€òv™ÏnDÃǤ×u¨ ^د :Á²áubâ¾zîžMnlt;]¾’îéü0}7gæµ¾�G�÷tms1j³Ðvý�c4Œ¾î?_­´*(¯T̵ãä§!é"3aù¿¾Ù§Ì}‹G£ƒT:we{s¥Øvj!niAý°ÝÈ?�Ù�ú ÞÂ-´Übº)‰oÃZLäV{œé©qÈpããe­Ææù]ê�Kq~v-Å·sòØÒ<1߯Á?&SÏ€®›†Êó»Æí¨£œg‰Ž7¥†<�Qi~7ë…m÷ÙåÅaÄöwG+Nm'Ñ?áµF\8”¶uê)ô8¿„=Oïž.ËÛ�²wÏëqhüþw Àç ·_—~¡ö"ÝòÞÍ{�ßÖý�—¡¾3)Q¿mk¾»vîÃùÎ*4!ñ�gTDåø'ãñ}qù1e?5õûȘ¼4_Þ÷¢ï·ÎõÎüýúqYø÷oŽûëÎú—ýñsh?Ûˆ˜—³‡ËiÝqüm'Hg^Ø3J ýFƒãoß²^vþê;:ñÕ„)ZÍöI’üþô"ý…Çqô#†Ãa�i¤¹ÞÁ·A�÷eèjkjµQBŽ÷óŸŽ l-Z5HλÇ-µ#ì¿úV·@ÿÑd‹Ò3ý6�¾bÙãÆÕCUgÜùÙ§ã´zƒ7‘– -¥hàÙ77ßo ´›ÂŒS­ºVäq¦ÚµœÀìxß<÷‡¤ "=5�ßü+Q‰—ðxøî�Éc�zà»F¼�g€(OÇvq¿>áíˆäfM£~v/X>bvz÷©{—ûLø«ª1Ü'ª4n£‹Æ�fó Ç–öZuîâƒRAÍ”¼4CÁ‰î1êÿ·ˆg—2²ï%%ç¼;mv¿âöÝ�sÆÿ`ǯ{Ä[¸îc^#UxëûSÐ+°“PùûýJÝÐ1â!¥¸Ç}�ãïâã{ma³Hù`+™ Ô7LK�èR¬�ïùßµâbï¸�¦ã¨C;îþòl„pÖ©ªx8Q$»*?úR?ß8‘bê�âj©a»fèM«¨Ö `ÿ‰°E]¹Ð�€a ›etÕl‰Kb>Úí¼1™�dì�îpÇ8ëð¿Âí…ä�‚Á©LŠ$Aq›laø>åk'�¶x*\n»Û¤«�w«oj‚ÊeÌDÒ”4{$sª±{°-±›M‚“ò{EþÚb&O©°8¶h²ÜÚfƨXŒ„‹€, 8HÌ …rH€PiHeÊ …' DõZi��‘ pÉÖų„á-½¯#oZ KÑÓÚö ß*…V%¦¹kÀ¹¸¤8'#LáïMd›  (ú¡¡xNuP'½s#Äᕱ©ŒÞ«yé ?=«Àô&¢=�!ÅȆEíbÒA–Ž]ysyKÄ–q®áÿ8˜‡{q¢Ü«ûüË¥_ ò4þ^Y/0W«]­wÎÁ'8º¯ÁåFP¼<$k²`Ø<†fdNé™Ûòyë¶÷ȹˆx ¬H+›š„D²k�˜Ñ_-VÀÊ%%lC\ÑàiFŠhl±9m¤�"¤�€·YÌ}²+’¥W×1‡Ï'ñ¿ÒhŠ" ¬¿¼�‰i0qõß:62±Éø½ÛVØ»UÕQÁ¥Þ�<ˆ”ÐZô/DG³,âr•µÛ!*¨˜¬°aƒÅ:6jý2ýI�Ý»^ÜÜ2ìx@y¹Ê8_`“ÏBZMó(ávQÞÖ�ÄX'40àèKÀ1HÏõfœ?ýmëx-C.ú!â.ÍB£ Xš¼”êâ@Ù §í™)¼˜L<î%"T’ÙÔQD�ši‘‡„’— *[sºuÈz^LÊEà¤DˆÌ¿„;”5dŒ�,X ­ý¹‘¼n S36—ÄbE~­UÑbifѰi2d„Å6Ü)±O¹a¢7á0Á-ˆ}° § p^áp¥B5ÊÖÁŒ ‰†›X#ƒôŸÔ=Õ$2ͶMtªå*—Å+–ší)‚Äo $ ‚‘ô�"sX 2Ï]B“Rä€0�‘(%‹¶ ± ‚bí–$=ÞÜôán»oÓß§Ÿb�­YCv›ÛÑ‹G±G„�—»‘o4o1þ³¤ÌÍÙE¢Ÿë?ɈÍyÇ-½P;†r,ÌPfœPÏ'º¨ÈÝ?¼ùÚ<ºÛµ�áuÇ,çvÇ|ëËÔdw°ýßdÕèhÞçë¿ÖŽ C|�—ÖóhI!Ÿ‰mâoÀ|Åë¶qì\J¹Ä÷» §iÏÎ8ÛœY¾¶öñŽ5MòÆ|Ï.\]N~iç-·ÛÓ¥Bðz’…%Œ›wØgÒz‚¯Cz�HöïAa‘1 ¦ÑUüRõý¬ª£·ŸÖÿ{cÌn`{ˆ‘÷MÃèøÀÅüó&äØ+|6Žñs_cʹ¸)t<9¾ ;+ü)oÚ´Ü£Ù3plriú჋Ga«å�þSðéãŸ"sÅüsËc•sÎqét!Ùëãvxƒ9ëï€ÛèøØvX�×äz<4§ÙÜcﻓì-Üã^Çx¥ÛÁíg‰…Ú*Ö3Ö×íÈ–M¨/ö\ßÏC3^ÉýTé;sFù_ð#X0‡ñKzŒF4ËþZ,Xl4ZÐË­®;OC‹ Ür,O^¾Çºº=t»Õ8üÛï’Ù½nï�ðÞîìéµ0ÕÂqã¼ýw‘yw";¸éϺ\¿.*Ôrá#ý›ˆIr#)hIp4'æýÕõðöԯŰÆõÚìŸkð1ßÚÖùûùâöñOBÊ÷Kž·©ûE”FÞ^¸wÐøØ~w‰º±Ô5÷dŸpØŒÂc_~xç6 àtº»X&}‰¹¡–dÛÜL[œ-n+ÍJ�Éi¼TàšÐE )çpìÈwìW‘PçÞzRóŠÓ¤æ.ÖÆ\¬½ H4ŠìÏ!ö¾øVdà¢;öµ#�ü(#$ îy%Ò ð±pÜe=kï3óçxDhc O¦ÎÁ+dž<ðŠÞ>¯àhìÇÍ}#ÓŸ öþ}ûê?µâ™;X]Û—§! 1ÀD˜�ýŠÈ]ñ/”*Zš­,ï,|•�if6µÎ¾õNñ¨m “º,œC�nEÉ-(’¡Vd�„R‡­ê‡�$&²PVÀØ3Dú•8åù -D¿Y½•¶àN?·y½‰5 )�f×Á�8‘ԄЇ9µ|R´�·¨•ηW¤ð¨XÃC ¡{TÎ5lN Ï�PÕˆy0Ë.’aTá2XD¦R}Ûnôåƒ@Êÿ¼¨ÄpßöÖ÷…3�¡Nänxîb„ȘÚP.P;H½™M±"…ÙKÊ«]Æ›¢5¹C]Zlù™›Î…æ%óÁ®=ñ¤r7‹M± !ÚÈß(#3¾ ÇÆ~¼ò2C «L–i…Ž0YM%Çõ‡þ¢Úåobüµ¬ªõÖæyäq™g÷“–²ú¡§½"ÝH=B+QrÜ”¬±ÚXS�† Š)WT}Öß¹Ñé3ÞégÒ18Ku‡y™{ê_\ªÆYKüÑFtS“­­ž{ó9‹Í<ØöB‘þ Ò6Cµ!ˆÙÂÓ2HB-þ+æRÍÿ—+ª˜“VuiKW&JÞÌ¡6D´-¡øM\ØÄ2˜6ÎÁ÷Ü Ä &„¢uÎÅäéÓ¼¯xg*Ö�ƒ@3�t„…0hi`Œ¦=7Ø# ¹4"QAˆHhQ¦WK‘ ‡rÄ›OØh_:÷¾ pÅí“ü”{ŽÍÉþˆŒcê"S*å’ù»«äLžE·¾s)×ñáfRjµ‘‘cj{í¡ S`ÁPIÇ—P<�4Š)èDG¨–ôlw¥òá 0$bQ£L­RÆ#&cH°ƒIÍÏË6ûI²eÒÏØ+‡-yð<‡QútC¸Ðê˜Ür,†Îd‘†#@d€‘_ï.gyç½ýmòñ7KÙÅÒ{8ø‡¯1d—1Q0à?ÜÚÙÿ:„� Û­¯_»tÛü�m�³Å‚Äv `gí)žoŒô�Þ1.ÿ¾{“h+ÝÔåúÞ·ïDév€ö=W±äWÀJêƒü=\0{†"?2“_=õ6x�_çÆ{�ê$�ô°À’]'øÈ7ï~2ŒÜÇèõ›]ûøƒSÍ{@zÍ>É,+÷ö_ÁÅT¯i/ôëz1ù°ë6gÑQìsëÐü®ß�©%½Mü§Î;RbYÓ=±ùæý‚ÇÛ¨ÏÏìZÓ}|åRC£�´¿žW)Õ ë¼ÃŽL‚ù–3æ½û!›w×GÑ‘cáŽç¦‡çëÏé¾»Ý{7_Œ1â>ç�CœóBÜX8ãqáݸALb3On>MË=·|—A¿�Í_Ïϰó°Ä3|uߪ)¬Aâ’ÄüMD";M‚ÎpgqÛ,‹IxuÞP{|±Þ¶Ê‡ççšþxÞôšzçTüM—Tþ�"ã^þwö±Ú»ÏÏö>~nðUä}¿mýB OàÄ»Áß81†oÇ5ûXGó|ú©9k ÛyÛ‰|dÀ÷ùOuávAýü† ±;î·ò|ùß7«¢û²PUîy%…€ÖþÚßΙP�.8;±äîóDZ–p¹Tomüøp„ù?ÙÆ�s ZZ†pr‚Í ¿¶ÇxÏÓåÓ„¸>;l£éà ÍÿmñÀ~tOÔ±Wü¼õã•pÛ²ÿWnäG�¸µÊ¼7p£a÷¾y}Ì#õÛ°çŽÿ[aÄ‚{ï�qùÏ“+dn)ýû÷å—>|ñÇ]:Bö ‡ñ©[“5}€¶ÂùÀxÇÑÀ¿‰OWG¿;¿ykV(×!'°ÃDa~2º~MáãÓƒ˜�h�pdÕps¤&]#²ò@+Ð#|Ã)vÆÝìhHBúzÖž;aaMÿ�(:P¥•Í® _Qq,e_†µ:-»‰ÌÏq½þ¯¬^†YÎn 8 Ài� “,„Š»…$Ì9ÚšH§«0pà�‹?¬ {:=6Í…% #üׯƒå®S[ÿ•Ž_ëI®úbµ£\pÎ —0.Á]”�ò`Ôà("4Ò¸ý±0ÐÁNïÂqYóüD‹•ƒx^a±ýƒµ °X§éh¡`ùüD›ó$„ÙÁhÙŽh2šFèh¹ŸÖy÷ƒ?Ú TÔ8üþ4ö>”Ÿv½œA^Òµ:ñÅ ®PFŠ™·�(ÍDÔmlB¡ª•Ñ)æÐhé+džæºÉUrÚœ >žûçY¨Ð‚S¿*¦5‡ZÒ`�Av04lµK|@ÅA»àó/÷ —�‰•ŽF@Q¡‚ãcWyå:E¬.ºU1õ¿†.hö†z÷s ¬,A‚¢fÃJ´±$niX[Ú’Ÿ4ÑHãëßùì«AÂ爉Ф†÷t£¤‹RW»ßE7…VO 1j{€p´ ÏhTœ*�héb‰½¬~g{¤ð¼¶´OÉ…ðêx•ÓÓîª|†ŸgÔ+Ø*"ô =z“%ø6Í‘”N�Bø¬Š½Xœ‡¥w!NHp4ç ÐÎË”@�ÎiÝõü,êÐåÝU@Æs(vlZ‹AELj%ƒCïÉÉEî@T<'.›i�(}�ÐĈX4rõ@S/‚/DD2wÁÔw.ï€gŸ»~úÃ�£Ì�‰œ½áÎN¾‘ôPyº.EFZ[èõz�«>½{ìhŽN�í‰NHaærA¬I•—žûö›4bÊÖw7vóÖØ ¹ƒÏðW”�ýЃBe¡03Hxåì†a3þ�&ðÒpç€×ÌM‰öH7ûÃ=2}é²í·�>¶ªçqƒìïfƒº 5? f»Øxüµ+š³~»>^7ù×^#ý.#v»åE�÷Ã=ˆ ]ý•; iï™3i¤€‘²õýfÑz˜v‡Žz:Žá­p®+‰í°¤ t€øÆßµä¾ãÅñÏ ÿ{{ô‚ÿ½–°ñ³µÛì¼ÐwÈóEU‚_CEöÛ¾\6E�4…®1ÞÁ²AL®¹ËÅ;w®±ÒLóø±úpójÙÌL»ÐD�˜‘²¤¬g2ß× dIì�Â2~ãð8XÄÇxŸ¿)Pëeƒï)7î1•5¯„òü1?ðà}žá™Î箸äq7òU}Л·‚5bg×v6£ÔWá÷�L Ëm6ø�OÊ>8pbžbœŠ… VTÃÇŠG´‘ÿ0*=wüû1²òŸ=;÷ïÒ�aßm¹Á†°|æ?�£àäïïQ÷Ï6éï¼m,‡óCE“¶Q„­éb6Ûò–3‹ZL¤ù«,Q¦|Xš-XÃé‰R`~¹ uë\¼ßñÌ{P}v°‹òªxˆ£6ò•ØGy—{tÇ�¾ËS'ò ö¨òû~Ïßkï5…ž£ßŠçG?ØNO#®2~?NѬך_¿8�ÛS¯��ä~yĤ5vvÖº—ã±—66íf©9öhíÈ×!ìý°—’ áŒï¼ž'á bAk†`:x¥|�ñµÜ]N0ò}˜[#-Çè7âöÇ¢Ð3`¿°Û=pê^@+›�š·ñÿƒÃô¼rÀÚ†¦‡?wyŽðtnÙAú …'–Šê»zl7¨�¿ ÝÆÑóäVa~DµæÜ´Ñ埊72 5“6jœ;¯°Ð9€Ò‹´MÏhs¨È‰@n¾ ¢C¸ƒXæ‡Ù*<†6ßÒ‹C<ÙëWz}ïÞgéP—_›C4‰µY&$)„ s5äRý^‘ßÿw°¨•DèàNÉ£í ‘þ§c6£€åàWftÓÑ2Qî®ïcS¼„+-ß 8&rI�œt‰ .î[hn…ªâ)FÄÊ߯Ž×àÚ´_l¤·¶2÷Û�y‡ˆ®†gÊ ÛWÃù†‡üR|N¡äÙ‚‹›Í¿Š9:Î fä¯y1 “ ›Iºå•ª@øÈ¨Ò©KK¸¼²Þ!‹\’Ë~æBnéÎ*V £H{/ñhþ¿zPï[ì¹:½£:ݱ›¤¾åqHp9à6c7"›â@~Xøh}"B4 C?Þ›>“sIV8ve�‹ÈÇ <9‚\å#錴(Bí¹Zëcp¢`¹ âa4j7ª« ˆ4€fèú¬Œ)ö=%$\éþª„¤GøÕØ“m‚Ü>#CfQÐ’ik¤O)Ó"…9™P0Y#ÕbÅ/‘ ­À.q;xŽYª÷P(òœ ‚üO&q;ž®2ÌÚòyi`äHÚàØµJR4+E ØÊŽh(àH(_åúc-ÿ¸þËÌ4³3üפ¾4å§¡Œ.3ªl9�šÆ£ë–У)/àÕƒ0�I$„†fr%Ì5‰1n_&+)Rñ§Äá§QE4©Þ¬Æ¯¹ º(6ò7Œ+XÛºVN´ÍŸ•í²pK‹U~�ET ¿á~ñs[›Ñ?„Hícüâòtʹ"’e'¾ÆÎw<·99ÈK›râÆæëiÝEäO 4`ƒÍ  Û‚K#· @ÁBè�šª�üÂÏ}žN$ó5VÁÕå±m¦Øâ�Ëá𛂫漀û‚àB§ÐÁ��·çœ1 *4ÈS€8޶B� žà&‡ª[ª‚ܹ³°X.ØÈÉB›©£ÁìP@h ûЍh ú ø Ѝ@Qøÿˆ"+é^g‡^Þ?_ÚËÚÜzšéŒ}ûâ¸ç–±À–þízaª¶i×Ôaïýãý}zêÉYCŽ™I�»‚FìFfÑyâœ5ò«“Â"ÌËg LÈh}âlœ ãöÌhÃIGC¬‘¨ç X|JYµ“g?Ÿ—,WO>祗XI~Ž?ª·OÄiÒU iµêëÕV!3k)]Þ¦d¯‡jêÏÒûõ§Üù ò{G}°Rÿ¦YôÜÃ>½0‰”?¯OÕ â'½JŽKúZE ¯çU–¨]–׸ÏÚTºÈrOiý­ÿÛkÜ)Ó&(=þ(½}_³è¨ýš³d¨† {qY)EJ?‰±î­*¡:èÈ�—gú¯r=Jˆ-b™ˆÚs�^<ÁA¥m!f!ç_–+I&�>£¢ºqÉmÞ0¥rBJåf-�»_„ŠÖ~–x IH˜ÛòÚ?©î¿ŸµòU¡`^�˜6¹6b…CFIK(ÚQÉ0÷7K“ů[©wA |.`I‡Ô†™˜eG–Grlè Üæñ†j Â,¹ˆ�—8ÛŒÐ}⨔Ä=ÑH�3òªœM ¥Ê*:+Êýyš3 n²ÅN½Fº±ÐAZÞ¢rk7jµÞƽ@ÊAS ý Œ€'×6–v^+ãX¥rGÓM͉ßJhDjÒtܨF„•‰U ã'tÑ<>‘4B3H2þœÛµ0üý}·yë�÷~ŒÏyÊE“¥³{q½ê·ÃáMÕ¦¡ÇF ¿U¢£<ÒxIÍeQ àµU^zúÛʯ T¾‹ð²Nzz ÄMaAˆf"X)<:¾&A]ÀbGM¾玳º�¦ÅPùwv±ëòO]ÁT‡K–‚r&:M¥åúõTiß­¬"÷ʯD:Y:Qä¡YæÖŠE%f¦T®"æä¯8EcÙeÎ=ÄÄ#‰š¿å $÷xÜ?Å25�¨Nòˆy¿Uà�'† (W2€4@ºÁ`®{U´‰›²Sº½˜²‚ÿ%æ—àFÒº”ãJ 5ÞxÄh‹z©þd‚–‘¯© ­’ÚÒ›°º±ôç ò$x®Jè!hï(SϽÜ�Þù¾yœ]æß4q‰’·5³ádXkZÊ)¯ß·íyï•®A~ÂÒ?dÿÚ¢,¢(AA�ë‰Ïð,ÕïÔ¸`±ï×@Õ¨¾œS(Ìq±ãöSˆT?Ó¥9Ñ�h‡óu!ÀT�(QH¢‚…ëç_ÞÝŽVªü•Ù3DÞÌ6FÓSûØÿÍk-{”xDj8BÙÏkô‡$%ŠAÆ‚â¤@}Õ É§´´ú½Z{É "È4¼Üœ·@^y YçÁ™Na �¬þÌLA"�ûûò¦zË��{‡¬ñ]üÿÙû“IU[j±�ü®‹Nêžj kT”¿ßòsÿg÷ÿŽHJPüwxªQ–åõojvœR3|žr³°ê&<¼¦Yã¼qƒ7Þо\âœ-5„RO5ÊÓÝgeØç9�#g•ÿŒ$~DÍ+ICéÙ%Xb†{ˆ"/¥ëù÷ Ï`)e’ï~!VßQÚÅr¡;+OvÂÞ‘}QƒµHZ;=¬X¥:í‡`åUÓW/�ün€­#Õ�ù!æ‰(‡~?ú’J·r�É 9iYU‘ËxÕÖg•g«Å¥Iúó®_B‚ù ›KVŠÃÒ­„/Q- Ö‚?ør¯_k7»mz–}ãž@é�ËC¦7×X2<Áñ]ÎØ ½‹1v¾ ‰—'@ny�jEéªZ4àæ)cS…E³±M2e¶×êú9 ¶ræÀ*LØž‰¶œcã’;„f*5/j:\8Ù€A `9ÐÆÿ—8ª Xhƒ=,cÂ|›«Ý`q8îí‚Ræ¬:›ß}�ã�Ù‘wC”lÙúOb-¥)™$oj”*Zµr°Í Í+P+9½fúO›Ð<Ú.ÄK¦bÃ�ÊÄ02ïk…ßÍdØ¡€Òk�§:Ì%C R9®­�OwÛ!(/§`ñÆ«…»Ú-ÞT.˜•Ni||úº¶]w;×PzvMXc0 Òþ-~¹Äã¬{:ÿ#à¾Oùsô"_5è·uDÛUg ,2“†-ÇÃIK#ªRPp+ó{6ŒZÜiÛi„UßòóÇGÕëÛ#AlÔ&AÓ‚\Á\øfî2_00lõߣª÷¸(E€z‹¤Ë–ã¿bË# Z³òõ�¶qŒ©%1:Æ�„ËźBKçJ¤ÛtbG$C¨®�±½K�ä†vg@@’+åÃ`Ø+­x)•ÆÁÏÎŽ%¥�ÙÛhq3HL¹—)‡¨^ùù¢ƒ]dE}KžõR¦l·Ù2¨¹cDK¬C ÍCCsc‡®mZeÞ*ç $…�è`‘e¢·A…˜6½ô�äÆÉÄYÐ8X °Ðlì¬ú#¡¬Rã>ÅåÝœõƒS<ˆµ:ûƒ>¶Ä7rÉ¿(SwÁÌðl~‰8È­�&Æ(ƒ…ÕÌJLB¨�x/Š°Ô˜"Xæ“Ár^p;a]¬ež`…ûî#3/¹£ã¶�îý>Ê"ŽÓÐ#åÌW ò¶´” Kbî@¤dÕÞÁ›ùT¨ÚVq¬m7¿Ì eÙWEÿcWøÿ—3û«ŒS†¦G[¦Õù¯R“·šoΫ¼bÞ÷I™¿ŠZH€ûCû"üÝÙÆÜ³ÍŒÖc†sÈ#5dÛÅ•‰Ro:`1}J¦1mï£KŒwâ‘–kßéº�Ÿš]Ÿ· 0_x]x"áÁAwOY<¤ÿ¸ŠÌN‰7'.<ã«ò¥§Îîç²ÛJME‹l.¸³ÀdYº4^Šþ±?Î#ã(ˆ¶¸øJ0ޅب^š,ÖMnÉž61r�\qy­1ac™Òøj±lM?%6Ô”E b\›:LÔl~­ šã–ôUóDH6cm†ØM½‚uë±Û+Ù ¤Òo1dþ·éöº)×7d³b^lßÇm5ͧçun‰¿m™L$dé-3 †W˜¨x¡Ð¿Ø\ãYÄ£u�`i™†Õ0w.Ûf¾ð®›8Þº‘ÅI‡”¬G‹øµ>–8~ ûÔ½ÕY¨QÎg"ý9Þ¨7”&2müàs£šáþGy_sû\Æ•GqҥϜÁO È£Ýf§�Qᮇàs²Ü¥¼}DÎóÉã-Rt¨Aegÿ¬–ËödJx�X1ÉàÇ.þ,ôj㘬 çð{$žlbý·Yõt� k/³ÏÐ^‘2ô¸, dgVÚ Œ%÷àù´lI™1zâsÝÈÖ-–0½Õĵ[ª:ŽÖÎíu²˜¨W3Ñ£wÁšB4ÉGŠÉ7Èäx|>å·ͯÕt6'àÛKñ@MW±û'TU펠•äâÿ -|1ñ‚Ží:@ð¾c7=œL¦ÚÄh©¥há“tFêeIí©ôèÅÈ�r®šÒ¯ØM]«‰Ì©6Ý|lù<»  —K7V# Ì>bÇL¬©d™µ�߆=®¿a¾ÏÞ¡à9wnEQc&ll¶EÉÓƒïUË­H o ï<În�'­2›hJˆvþµ‹Ý~•Ÿ%wëfêN?Žô²öcè]h|`ÌüËaüA<*Ü>æÅ�0? Îô¹l�øþ¸¦«¢Ö(ŸÝÙî±`zÉyp@'½vý# _¯"Po‚Ì)§åàl77ðÚ„‚ß³÷Ù=’5•}??WzÇïª×$÷Š-J­× /ËÇ*##0uä�²PÅ*¢S4W—&{æè§³ìS�Öì)ò4Dˆš-š ¨Ub‘±m"ýJ„¶± )T£tÁþäj˜¤ù›Õ0‡fEE‚¿‰\gê�é"t}úêj{>=Þ#öd8 ^~ˆˆ²†·žt)ùßeÂÇr9™‹òâÐóL~ŒÔÏX”»öÃùÙ’AmøAìrÛ×JUúØ´Ê…C³áB?ˆò@ÂC¡ #‡1?x7 –|� �“ï-¼šj¡-`‚ĵN·�MÙwL�JåOŸ½6íwàÇ �™k_w¢b�#•bŒš`Jåö„¸ß³$èL¬nDV-„Þ�„:;åN%uk�=06¬iñ‚‡O‰ß\ðâÁ<¿ À¾‚€?¦­¡-Ѿ…ðqª"œ‚W¡Øs�O9i×Û¿ДX£ v²Ô@ÈSƒµìÄ6âàj0U¬'Äñ(=wµE;ùIìÚÐ8øK£Ž!¸iÞR��† ž Ä �žf½ÁØ@é_׊Õüžç†¿7­n8B�¯)íôBúK3—>n; Mvä •ID3™“Oå(1±å5¬ZA*rϤ«V’âÖ h®Xl÷ŒÄŠÊÎn@Íqp>ɶE–. 5³ëˆ\�"ó}Ð êZ=uý ÜF÷…ÖÍTÕY#â× Ô2.z†8¯q‰ËŽBÚ’¢ 'äéc˜Ö§Wó»L²êü<@p”fÏ�p@­9G°Ä‡«d(7�…ly´²öž6V¿�­~èIû×1±�G„Ñ.@kaÎÒZ?£MJËBäÂt7иÔÊf‡Þm QˆÖh.ò¾Ž��ÚG‡€ AÜÈCâçš‹ çàûL'ˆŒ¤®«gê=‹a=x)"˜Û½Z �œ` Qš1¡‰Æ'“HJ†Àe"ýÚN¹IÈñE;nx†ÌãŽ!§»¼ÿš¹èߘ®è.v¾{§oÐÔmS¼)•a¸£„7œ?oxÖ•Ó©Æ/º±bè9J]˜•ðÜÌá~e”[¸Ø-Ɖ?†CȽZƾŸµÎ낊ÕCͫ؀ӳNp”\̓z�[C£ô‘p%¸ ‡>Ùòµ"LšÑ�¯áj‘ñ=º¦âŒ†ì®ðÍ%Àývx^ù?öw¾xÏðØ6©ÿ9ÕOXzzBæ^zïGÇ‚>¼?kö4DÛðò-r@žÜ-¹t¿�÷̾¹QñWþy·¡ÿ¯1ƶëבhe�h*ú¦JÖ"!÷ÿ‡ü�0h– -rư‘ˆ�?O«Á^^Dx{áw9:·Ÿ‚Uw c þù .R½¦vÓ|c%8™ÅéIJèèEÌ5il͈Ê(«\#É2I!nбgQ¥(�UÅhX VT’Y¡WÙ©.isSe±‚ }±<Ò0ƒ 2 ¸4`3ƒHцÕ@‚H Oè("+ÐPC†R«Ë­Zõ\ùßêzåÿ&½»~“i^½ž½x¥ìRF«½5 I¦||íçÃŒ:‰ª]žöó?$þxÖD­221o/çòûñä3˜ædL]C77GpïPB?Ê’1V¨˜úÑQR ÏüʧÕì…ã&,�âP¼3;ÆQÈ\,Fß�9ѽÞ3nÿ>Çû´6€hcA�èÚ=€"ý¾¿§ŽG·ç£©|²õ¾ýL›?óÆBI§ÙñéÉðþN,øs-ã4^Gè¡üØÎ6|-ƒÆjà-Äó¸£6Á) ç`¼ƒËq¤p�â œ6=S µ�°Ôaß™¬õÃþÀ ók\Ll>w°¤3Úá;jcµÃ1ðS�Û1èbSçQêyä¦]ˆtÂÈ;n'�ür5mÈ$Ä”±ÖQü=êþÓ“Ê‚, vV+XІ$qkZè?…ƒR‚£bÉæpé§öKÂärM3ÊÀˆÁOÂ…ä7Þ¸—]Ái�ƯtðÏ ‘¦þï“Ù–LÕ�7oð�ý %Û÷¤’öšfÅþoc|/AÐÞÅ_î¥Ã}†~µU¡¡†?é’ z[±Žçîÿ¦‚0Da] €*8jDü‘Ï?–�Áoñ9]=‡âà^¸ù'}>ÃHÿ�kôÄJ6,Ö@}b³6 ;p ZÈ>N>U�W£¾¶°¿A1…þÂFfi÷ùÐã”4CT±*à  ‡—=*~fsþ6A¡´"T:ŽÔûÓrH¡«dÿ¥%Ó`)1ó#Ësr“+“›`Bž)üþuÑh?Ô\¯dœxóv»ÏØóž|À‘�]àr9 ó¯1yäè#pY›ö+¥#ç�b;{‹ ¸ ÖªÃb»^ít(mñ'²Aøc�†-(y|Šâ=O´:5 O¿Ñj¬ZU®)Qƒ"3 ê>Å6É‚Û †Pª¹C˜˜®f6ãT À»h.ü/!ÂÇ-k+w²ä+–hü¾5L?\k°ÃPä®–_P•ç¸/aîÖùâ^ðe¼(ÖââØsƒžÌn¾öÊ”o 𮸝,*Êšøß õxøË™‚bç S]ôÌ”|•Ä ¹Áê#ÕߊšœS“=A`ïç¤íN ¶ é.�·µ0Íò”/^XG¼I¨÷ñŸÌe)qKŘ;�M­ýC£‹p¾‡ ?ƒX.;”…0>b3Ý[ðÕ£…A$¸¸ �u+ba#,Š-”Ì8�ƒÕÖ2áßø0ͱ—ùW¸8Æêy댇´†ÁBh—ç¶-£vYV(QǶßòȉ¤>Ç(>¥ÕElÀøË‹çcƒÝ¢…¨‰í|iBÕÔ±�ÚYyÐ]\c®¤"Á0ÂϦ,܃�‘ܯ”8šù!�LL׳•ê.dÖˆ‘Á5æ„� à±™àPóå-‘¯Ž˜Üfê&$ë�ÆF!EE'‰ òÌn0Ào{�IØÛBÉ?‡\Ä­ÃlKcßéðÕP00>Šý™øh»Ÿ|Éì"œ›ÎÀÇ>&¡yrÔL»{4ñsšp\¦×ÌòÚá§í„qEß¿Ö~µK|1ü.(²”ÑlÎGüŠÿr•Îá=°“ˆÃa”ÂnŒ—wç{< Íê” ¶ÊùŸÖ‘îÿjVæ»Ð”RõLåtU�“o Õú78deL£¾GÔñJáN¦[E&wvEŸ’" ˆµÜ…)º£ÏRë… ¸Ø0m>tØëQ¼� nn<>Ï ê`µôÏðÒ{\Ò(BïvLG÷¿‰x¢�HñßÏk$�š°*ñqÈ_‚ ‘·–È•;ÛÆóŠWŽ ÕóŒÅ˜ØKa¯xôP �6�o_:xAÛ ̂܌ª•‡Ä«TdH± Íû•Ù[í2¢iôì˜FÙo ¢‚Þ†�ÒÆ?¨6@3»é•'l]­›˜úCHØ-!hÜuÂÍ#‚Y «KGaP{1ƒ+ ç-çÖVÞ{ðnvƵ¡Že%7ÚäCàSÑ�“ ¯ŽC^ÏÉ¿‚t:ŽÍÌb½Ö§(Q ¦ Ájê%]<Ü@½î9«‹èV+Á~ KA×\d[ê4܉ڕéÅR:]�è:‚�7‘u²‚ƒ²õ[þsó ~›ÐÙ™¿Š‹–�®#ÿ›nɹÒë§5c2¡0â™íÌÞŠhïf!p¬h9µQ÷ï¿w|è …Z“yׯα¬ÄX¾­ÙcR­Î•ó½p¡€84gÀîÐfúæB�…Âh:Jºç ¿”Y§~[%�ñwñ²8³8òª™RwˆªnY5ùŒ|¿§ŽÞ¹Ï9ÞC¤Aèú¦wŒPõsã�páú¥¤Ý7'Yñ—­�1¡yIPÙÄ &M%•¢lÜï¾ÚÝîÖ콞z(à}0í±B6™ l¾­ ¬bí² "¯Z+¥f ífC Aª�Û‹gÔ�︉jN´,¿})•ÓmP]Amå‡~»qÜ&Ú/¾]û]x`�Jlv� Êµ5þÙ«bòÁ÷|ÕŽÐrd)'°áoA‡;imŬüíW¦Å—Šq¿Ü64âyÈ´ú“ÖìàÃÊa`Š0[ –ðÆô˜³Û½ZPA¶u­Hž©=ÛŠ@ÍÅ‘¢ÀÑÌ´p¥rŸ%e¢†È=Ä[‰ƒ=œá ¸ÔNÏà¾9™åê¯6³óájYÎO‚ï,pHÁ ÏNÍ÷lo™øyS› g£r¦B¬Yf…XŒ8âüÚÚ ÛK£-ìÃßA €7ä´èÅÖi¢±¦Óô¢{fùÐ=3˜o¼D*j5RpAÞ‘éÔ�€lÄB8L“èc­õ5­ÈE–œÿÃOk‰ßæž~ÂZ20£ÌUBeÄø—#K!Ôq¯ŒF›\p°sœôu$»¶*~ê~6 Qb†´.àÉ»tSÌP6?pW3Ñv�÷¹’÷ÞZNe˜Œ@ÿü,�õ¿‡bÂ*tç\ñ�tKEÅ9müµŸŠÛ1ÆøT z9Ì—&sÿî:ìCÓȲMïÛÖéØm21–Åÿíã¶E 0ýG‚TÉQö²nçÒ²5‘q‹ÃOñ³óiÉó½Ó>,-ž�ª{Ï´ïÛiLúH²öÌÕngqß®Ef"ÆÙä›^9¿Ç},!miÊoJs×É)$±®fóq›÷F"Jö›Ý½ŸX=‡( œ¨ž<ÿ™=Ge4ñÿ?ßd�ù#Wy?´í|¶û±Eº_ö½ñ›vÛzsÿÑúy•_ÉÃׇ±RÉXšoýŸ¯"Ò!ûþ¸ÇŽ®Æ<1އÿæ*|!Q/ü¥Øt`xc˜}šÆ^j¨fo6`kX­kIí®{ƒSïóOD ÷σ<Šô5´î}üÿ-_ÃŒ¬Hý{rQ¹o?IéV±ÛÔ¨bö¨{fM³qcض-c*._�ò§QHT=¦é)ìο=5#E~3¡õ•NqDʆ€ñr'úÕ§ LÊ^ʆ!k.‹C„'a%˜»^hqË­‚ŒcʶG{£©š¼¤› vP]#wRì{fâqKAALaX1¶Ðbx¬£;7”~ÿ÷ZØC¡ÍõÃÏÝÆSã/¤6 ÅôE¬�$>6àjJy5ï}—ɧín›wȤÝ"†ßcYu%²“Ū…&3�»aMŠÃÀB½ç 6² \©dÔ„0@0”ts=…o–a}!ÚQIà'l¤-‚¼“«JEx¶Ÿ›ïìž®f'æ�Ú-eÍ„պ&äî·¶Š€YÂ45�q·$))ì2MÓÊ®“§g}Ú"ó$¼¾'î†â¢¬‹·YóÁìRòs=† Îù>ïH@3šoð+'®f9¶[`a|²]!ùùÌa-¾BÚM�dá.7“ø`8¡Éà Ñu¦bÏS!Þò‰“!QmCà?ˆøbë(ÞØùâ'Þë_7Ä0¦]!öç�\=­PÐ{w{Kš~ü81ô�l+H Ó»z9¯°:jxçJ¨ncõáP'˜xÉ7 ¿žÔDD@ÙËÜ£JÒ.³¿Ðñ<ìÏ µßÉŠ+óphxÞ"¨‘6g&f0ÇÆKæ‘…yÇ? 7�º�!:¢<$üðj]Š×/’S^xL•G`€�q†Þ5‹Ä¥³µ —rEkì;l4f{g­Üߎ£m�&?<ôE×AŸ–ý›°Ù!’!¹=ìy¾|8¹dòrý‹1væ°ow5ÎLè¥ú¦1ù_Í4m¸¡÷ã &Àèø`¾îùQ¡á髨‡ïà 'Øà«VŒ÷"ÞAÙ¦z‡VëÝûç ¦‹“gîQVÉ_2pÑßg¬«¬Žø!J‡­ÐŠC¸¨×DhÅÃ0çáúSZš¶&¾d‹†úuÄšG™¢I¿3•G9™Zšø{jãèòXkÁ ­[°vΙ„î°¾î2¶ô6›¡ÝÎBÒ;áú“·^Ž6‘DÍÚéH*§—TÙšÙ îvƒpí ¢ñ1¾ NdtâÈþK½‡�1GLÒAïžÃ3ùL>쇠m,ö àÁ¼f@tdBpK�úÓ«!¨�bóæ|j܈á\EO]›hÖ]›Rv3î²D†ÜZõ~« Ê4"è%†l¸�LàÌXµŸ¢ƒÒ´ŽH&¼›DëK!í©ÿ³pYü9k’Ú™íß4tWáÇÂ×éu1Qrc¸eáékÙ-Øð(~=Ã�¶#-Ì-ñ9Ùà}U8!¡ lAµ·ýÈ÷ÙÔ«·Á�ú�­l[aqª@ŠﱈaâV`¢º<6èÇYuþ¸Èq�R¬ý´¹ëÏ�õ`„ Š<]Pø©êKDØÆü e¯É×K[LSaŸP–C4†™_:å»åôÜžX7åÑ.Íûž7·ƒx&bµÏ%6ò´º‰_M¬ÃòNoŠcÃæŸ.e(t”fŸÉï%îU€Ë7æ/;buÖâ&�C\ ˆŒã‚|Œ :qä!ûÀ·?àŸp9†Xý€þ‘æ;;øt›æ*þ;ZÚiÌØ“.z£®¦÷W>ÓÅ÷Mÿ‹º«¤öÐóžG/ñŭ中¹½Û�ó¤Ža¯Î^Tý"WݦLe±ª»±ê]íÒ¿³=ãÝñI™·ìçM°5Wbñðùz:�›2DŠ •n0Ò–•�2fë ºOǶ;òÛ«¶økÞ@Ç™«gÒþƽ¥‘¼Ê‰�Ø9Tæ""¬eïc©#ü¹ °b¢œæ­š­�6F…§kÑàÆ�.MÉqüG rRcßI&lmá³<áI3ãÍðŠ S°�ç,�Â~½î5˜Ö¿r^‹8«Áñ…*kuµ‘ÝRƶ—ÌwÇ"Ù—ln奿¸9ÌåúýÈŽk=<äŒâ^2“êëWoIúëÎW5:ó“â6ówÕ9Ô'È%Ö�²Š6ŒÉ˜‘îܘ’tÁ3ÃÂô0‹X¿‹ Í÷,³€sÖr‹Ÿõô6gÉ"’mA†ò%lد 2™Â7ó"ú‡Ü2@ÃØ“FRÄò`¬8â‚^üJÁ”*æÀ¸Ô±N_OyXŽLÿ•CgZ´”²ç ða—ó}pá�œã ²¦LEŒþ¬.Õ¯ìÙ/‡{Å::‡õhûë¿&®+�ã×´‚xEì^‘�ç8‰!—·,²zo´ƒz«(;8J €€‡cŒ†×À§G…FNªÜíÑ]ý£XçÊ ô;¨5TÐ8ÕÂÀA ÁàY.*þTcôøoæÐ*›çCæ™Î•ƒÎ ùEy9ê× oWÁ—&è°6V $mȬ ÿÈnB•ºf¬h‘QÂèÆ£ Ü b"ù]ƒ-Ø L\]..q`ÐcÅD$Ñ8G«›¿ 9-íŒv÷)-�Âü%«-ÎP�¨†nCœã‹"5ŠðýH4ʱ, ¶îˆ¦žçë¼±ò¶ž`5 ,v¶OŽkäç©ý�|g!Y�ÔA« –�vo$]ªFnœ»`�Ïì˜ólͼU8÷¡;ïáš|Éæ+á|sÀSÎ>fdrúÛÖ.ª}ˆ<¾ËÜ[!‹ÔØÙ¢îá�ÝæXÃû–©ÞÇFä_Zv—oµõ›áþ_áÑÓµÐDÖyý"‡¤àY¢0K�·0ô‰r×!�Ë?)ðP§))â¡jñô™Á,Öô-¦ó†©9Þ0Le‡qˆ${ö…û'œæ}g0Ô1ÛO�^¶p(ÞvGÀ\Ëz¨ÌưÛ˜ƒFblžæ4¶€v yÇ­,40ÁF­± ãyþ}ˆø]½óEðë‡[Ïœ‚>p-ÙéÅ\½â Ý޶&DvŽ;ÙX ángR8”ÆßÌj^ÓÒ®�C£ ‡>°ð'Ê\†žŠŒfÙ‘/ôÕXdvJ4‰“îŒß?XÇ…˜dxÄ� }´Ÿ�1ò>›sÕ2:šçeyûk¬Q VØ#^¨= !Þƒ¿l¿M(í�1Y®·�p40.R!gøRBÙ¨²6!­jøQΨ1%ˆù± úe ì-Úˆ¬jà�1ù¿~Š˜Ü"<±¨XMBŽ Òíƒ�í’³üøÿ›GðüÀëûÁg©èeϦ_ 4†v“C·Gæ»,wÙÕÎÑ’G™èŠQªÕrQÚ^xLõ͉vi¥ÍÍYÌIØ÷„Š(}¹È¬ÒA"o%÷Ê+uZQ©ëQaòæ8ýÉ áËø9Ÿgá&”{éÕ89âÝ÷œLóá¸Ý+Ú;”Å3¢„¦P²¥€¼\R d³ Ã¶š—°Ù9¹Ð‰6ò Aj�ÍŽoœRòT!3S€Q‡+ þþùå½T¼fvó [!ª›„Á><~ÑŸÑÜlò[™º¤ðëEt—Ý©„u}æ§¡aE÷ýÚÏsqüb²ý¿ì‚–æÕw4?º<ô„ñd †?,Ï‚k9¼üÈñå{÷aù:CJX‘Rí¤q^¶;äϯ¦¸ãð©Û*3ôÍc³¿“I)ß;-½��>EêôM¦Ÿ~ŠírÛT® ûèo›áµØÅ'gØXÛ?[cà$Ôƒ_5xUls=õÆ cZcmƒÔ¾K}Ðù=�ÇTŠë‚x��êÙ�q±�ª1‘!¢f°ÇÏk\,fÊ�Q´ÖX©Ñ2­¿+ =륬Vž¥Ïï.V2Ã…Ôò æ\r� ðd¼1_1²ð.ðR ˆèŽ=wÖ¨HÌ} û¬\HñDþ`í1D6óHöÏ“¼)SÉŠ(Ìšó'…Mjí¤Û ¡Â°Þ\‘Ùž¶Ù' vPß&µVUœ”z{„Cûö–Âßœl¨J`„’Wð7“ÊЭŸœIvX¹(ñì§Á7;šM®|[J âZtmh=î’˜¶´!³ Åâû«DG$ ¬pr!ðªÍï?ͪÆï\®r¸F•\Åð9.*$t þe0õïòŒ<B{ä5ì/dê,5oàÁñ 1,‚– ðJ3.³Q> üm]y�ÁdØTç'F^´ižDMozâKÚ´Ó�Xùc/i²¦<›r‡‡%'œwäÄð! Sz�¸Ú3 ˆ¼5kÚ°‚<{å³OÙ±rußwüÀ¤t`)ä(pTR c*E¯ó6vúÐ`¾G Cù.Oü\ ±í×â+[žI‹Mú€®Î³A‹;‡�iže>P~;3(•˜\üÄâÔ™ŽÊi2/w>t>nb:RX-Œ(;{ãÜymȧ¶®Èžp`úÄ—]·õ§TÈ��ÚLgÆ·æÉü9¹ÄÎËÕ¬H,E¤öcÁÎXJO–Ð~ìËdsäçTã* �k³­«†ßfzcOegû¯8ô±¾k,Yó ø1:[àg…æÌú´îeèë6®·ø~‘ø“ëô¯ÚøyšP¶Î¯y;<û §‚àÆã?cjßzëc¦˜’¤ 1È’"±pÛë0ðÞ²ðœn½c³ÿ»qÇ × ÿ|ØXNþßÈ ] ˜‹é¢ß“ÀçïÐnWÊ")}–ýÙ* ”xSÖ�øLG:B%îö­².Þ«-Ý×NëI ly8&#[¡‚TŽ/Õ1¢Íd»Wm+L�H¨gtt"u55v¬i¦H]Á;2;àç×��%b4„kÒkÿËÈÜ£_k¡Û…il'±¦Ùä´±IQ7‰ÿäœC7S÷4q�Žh� v~aؙ𵽠f—‡ƒKÐÆÊ”ˆcÐÒ�­¸Û»ÒV][…8Þa«ø˜ï›ó šƒÅæ%‘Ñ pTò)²ñqÄ2ñà˜JcQšl�Žž•ngàÖT“U¿£˜¢ êijBrh£y›çŠQx#Ê´ŸGåüfÇQ�´µ'_/ËÇ©2s|wõG}FPCê’çñI²¦¹+ãCqëYm!Ò:A)f�ÑTè áîŃ[�É.²kép�ÔÖñ³É)]ãó®guŒô» í&™‚XZ’Ž®5Ƚ›¿7ªƒw�’ç ÐeI"°h…9/§îdNªOì#ž=뫃f�œ4ìGM§ÛUW;‘N5šDŸ+ìèvK,UïÇáé�T¸”V�]o½} |cäÉ �2êË�ä ØÂLIÓ˹Û%%•ùfæ¢ê¶çÀr”mU6ø’kêRî ò’¦ø<1É÷+bÔ„�C¢J5Ú4 ½Xz˜ßÍhÃÉb3S/r“ë;µñÊ6O3“Qcs�Cd¯XÁÕ‹ Ù´$µ5�ð‡Ç�ÿy´sµ¿°ÊHi O˜p 6×xÂþ‰ýO¿÷�^Åûá—bŸ#ø_€¦@°öÏìµzk$Ñ�ÜŇdd3O�m'“­é¶Åª×Nþ œþDz¨Ÿï¡ëûI*^ ³ +!~:öß:)}#ù£þKÓl UrŸ7‡à«"Hfý¨-_ŒMÚ?ø »)µ;�Ÿ÷÷"+Ó#ûG¿ÑíêÝ[GH5¶ŸáÒoðã™:}õÛtæË”+§n‘ü¿ɳƒ'!8-Ñ0"fçXù&n&Â@à,Ts§‰2B2ý�ìP =º:ºëA/Ÿ NçÛ}ƒëv/g—ɺ¾­’'ð¹y–¿Õ+™\3ŽPÕO$Av”Do ÁÁÄr9$B`§RÖ§Á™™$´w7¥æV’¸ÞŠ1Û7Á1ÐOxcɵ[þ „¬c�lXÁ¹ Gº0já±ûkŽ{ "°JØ/c÷`9÷y7L�{Î;}(«ƒ=cÅæˆ?(%OŽÛv€@]œˆ 89‚‘¥‡]‹ ìUïçGk¦B²Æ¦ !5®=l'my³@pK³³žÙÌÏZæE‹c»$å¦A |°C_+aF»8ûXG¶N’¿+CNR™3`H™ªvÁØŽ¦ã|«ñ-E²­ LÅÛÛ"�ÈÒˆq­zFÔƒX„t0F€1$0x¡0ÄväŠ?ûf\Þúp-AL)ÈLQ!#$KpsKoò„Éâ°ÞZ|øfó®SÜ‹Lû¼ËkŸKȾUOÙù”ÛLwÐá8ü!�sh؇ۙó£syW·—¾ðDÕO.lA%"²Ù‹‡©®\˜s—'l�ÉŒ¡2í1À¾µ=à�çÏàZšÑ=—ucŠ9x’OWæ&Ž/;E(eg[%‰œOªSMvªddIXe—»vI¦PFŠIº�ÙÑ„ÉSuà¬ë±m4îþåÙiºà— RwT ˜žeI\@ì8q-Á•$ü=«B Þ÷Ð, õHô«BDŠ@ærÇóà`|“ì�e¾o¨´ó|Ö¾3!VÊ· '¼3ð æ£·n ?¾Òˆ!îúb>çîèqœ–\©g'æ×$þå¾ýȳ³xËæ‚éè,½ 2H¡¿wtú¼¸#�Ãh¡Ös _FÔææ 1š�s"ÒrŜ։ø#{­Ô°%yÙˆU!)5¢–BÍ|J.4ÚȪ¬ EV*9½kï�Ä�hõ�òçmCt*dÁ Ÿ¯YkîW$ s,ö‰–;éŠ8¯)¬yŽ�zÉ[LäçŸ]8òÒÅÙ›úà# kоT'Þc×4<|lbƒ…æ¥Å‡Œ3ÅeÈ 0ç©Ëd[AçŒbªE¢Ô³MóF¡OÇÐÑiðˆ]'Kµ¾ç>ÇÞÌ?„`ìà*ÔŽ©�œl o¸�¶ŸãQ84~­YEü~?ãè$J4îÃëU !�ïÞ÷@î§¿Ï`ÙƒÞ¶-G(3ÙÖpÚ�"ißóWô ßB~«Œ˜î7K’–)#l)dŠºà”üò©3†\�ß:÷�ñÿ/'+-ôbYá�æƒønÙ (`g€å‡ëoõOQ ¨¶E4f?àç‚Q«ž‹&¡@ªI¡ò‚/ôÞ…;vVÁ 6€á_&ÒðÁâ­ œÇ_� Ó\Ô™ÛµO�²V…J§.‹CKä·¼WrJä¦pn„Ô4‡”n]Gó=.cjû ‚cX 8#�áë¿„ÙCuCÊtø[ãþRò:@­þ¡÷ðþ¦þ¿šŠíRàzñ¬Éc�Ÿ©´…˜1‘iÚV ¤,§ËqÄ�\±�2ÓPÉ@9 Ԗ1éä7[9&ù0L¿]@D¯\ûº´¹`?öÀÃ33-­ûî;“{ÅqÄûšS¢w'ñc6‹ÏT©‡ãîTðšE»'´üÐŽn5…W6‚.FãL–èãlQU;‰0eújÁ¿úÕgPgcióÊÙ¨mà†æ<Ó—Ä?çîv�Îoìó„<·--�»–Á|àžÇÉD~Ÿ[™@ø?³œ•G­³4ç—öõøæ|B½µæ?¿ö Î4BÏê“Á¾zN [â1Àð…¿ý†áÕý¥*�™’ ›gèÑÿ¬{ÄWs›ÄùºF(‡6Ý-õ¿�<µžÿ¦æ�áøšœ¦µ85‰eÿTFÑ{b°tÖ§0úV�XTŒ>ttØs¾hCO p‡þ?ût^Íúeƒ3 Öþ @‡N¡у# ” ˜VÜ�–±æìy¬£šá£D‡j§l1¡Ú…²‘G!ÎßÜÛ1 )vĻ٬Ù59·Gœl6Þ‹Ò�EÆX`L¸Óîò~´‡ÝÆ\3M´h¶¶«`眉T«p–:0®d«ÊŽï'F Ómn¼p+�qõ}Ë=Xä¨ñeÁRxj¬fíMr}@â1tÔí39 ”õ¹¿.B·OÀ‚oÁõýWpÛ%q€¶£ð®�]P•¬aƒ«‚M�5…̲ÙÞ,àO6‹t_‘’.Óá0lÔ8èU·°‹Û†«É]å ��åƒ\sQ‚Ï 3 ĽðpIôøqGÍáðDÑX™ ¸›€ ;`A,E`C’Ù¶�¤€�JÛ_ Ú†n® a#ÐLr(ÿb>E‘Ǹ#¥Å´!£2oc¼ZÄ«fÍèR ©V°ŠG9'‡)fg/¨ž!ŠG†Ú'ìò6[3XvÒƒFñ.è°ñoMq-PÔó$:‘·P7DzmGÿ=)Øsq-Weú0RÙä+y¡q„mõ?åÿh8šü»�IüÚ·µoÙ$Hë[0mlµ-³DqÑCÆ:�ñ¯l[8ÑÛuÉŽBÆ›O*–ã%½˜Ø:7VÛU§ÎVC‰yŒó¼}Ä„ZÅ AŽo6ƒË¶Ê°¡-CÃBç-¼—B¸Š±�Z0ÈîÇS{ÜŒuç[mø£4ø«í†ìê°È‹M€ºn ckcÝ)VÈâV´L¯tT »m1�ƒ$Ìw…™òE8Ä_'‚†RM¿˜ …·ÀiÈPó[ ¼¾…ܰûæà½W ìæZmv¢EµÓ]¹m�ŒôÙHL�_Ð{m ÅîUÓŽú£Ë©ðs=H¢64&g ‰Á‡TÅÑrs75åËZšÍó*4iÍÖ¤%ª·c\ØÄ\éÏDâe9rƺk“º×ƒÛ˜’èòc¬�³Ýdíšh)q2k÷I´;Zs£GùPV‰>Ó{r{“­Ø| Vù‚¬¼ïçH™˜tùGR6ÞÌ¡2eÑKÏ2«¬sðàgð~7ð^ãŒ{ýº¤`K™æ'ôÛáœ�”†8”ò³”âê/ñVêNë:4_¯µQ¦Ó  Nìw2\¨I2§þÿƒƒïÝñÓuÊ𱯜çΛÌ}BW’G¥KJÓÖU¬m|GÉbwã=Ñèâ}Â+H©²üg©fFY»D”6‚ùÚÂrHq é/}™a!A"‹M¢ GÚ¨‚ Y$Q#rD�.¦ ,¼bÝH½j×;) ·ýëÿ~¼lÃ0¨‹rp£¼nŠÜ—‰o­�”§-èØÚS`E�”Dɹµ"$$ÚíöZa$Ö3IáE%Ðâ’b]q‹]8+™ Y—†«4]Ķœ.øÆ¦¾eó­åj4w½É¡Q¯WG¥§¥ ¿÷Ù×18Y' Ç<$ãyñ¬A†Ê·˜%. å~8{TÎe (@Þ&§º4s¢:ª.{ÌÎIæÝŽG䯂zÝ%yêÍ�zï¥TÉ\hnf¼:íñÍ–`w)˜F)\Ú‚×*r–ÉQB©bNΓìÅÍ`<‰âmÙÈ„‡2Ð,šb¥‡2Òˆ+¨yq®±AHã=UÆäe€ÿ]u`¡¯pÄŒ‡«)à›–ôήP‹çS“Dzbø¨yÅrV˜ƒö}+JŠ¡Êg”Õ+­ ,ñ;´‚Y9øaŒ˜l·¦ý–ΉS™£“²v/8nÂ*ÊR`¡— >b ®úpØ–°ÏEWï ð¤_‘êøvŒùcQÁj†piÑKZ—£“ýf¡ŽæZýàâ_26tEðå•4ÏŸ1j¯‚4?û‡ü7VY ì® .Úÿ>&æ»’K‘’V7^Îø+Ó8y«ËŸ‡Mr²~Úܵ~ws:{ z¶›�e½©öø –{ª�ú�àñˆb'fot±G¯éÞb„pvìÖAÈüƒÝõjéþ¶è!œàï8:¼'"ç'Y×jöŽt„xO––5¼[‰²ÇF)Óz;çÛ-÷ ÆÇ:ï[&K¯GVOƒÒ9M�‡.pŽP‚/‚3·QÅ+tAŠ×¤Þ´ÉYžÇñŒ93&Ð®ŠœËŠÚy°®sÒL…ÝJœ9˳ð®¼Ó�_ ½³ÑÉ-v(-ì_ZÁ‹€«ÖÊ#{"ì7“àW�xpuV°x‘n¦×ì”ËYÇfEתmȆðÚò»žN%Ô ¡¡ãÆJoɄӎ1ÑôÕX¼ uEˆŽn×Î;@ ‡Ô¨[!늤6¡ݲŠÇV5¸üUŠwˆ äàÁ^;‘s›:d&ô8µ#o1¼1îîº.!öÕÜ¿»BdTí¾û\ŸhÃ&&ìä8m´u&e�ßn³ŠÑºÞ¸[Ì„Ú%zéù9$!Pb-°ƒÄ£�¢îmV¸1FeE‹•X’`Í}où.;\nq‘Hì8U†ÉÌ[t…dÜ’“}¤àË�÷…â^æÝ9B "«’Õ�•±Ê+„ˆA%‡!1@"Á¿X­1‘gÀ‰—V£–K…Œ—‰kÀÆrç�.MÉï1r®å‰H>ŸY�¸)•†Ï½z{RÁ÷¿Õ€€`G­Lçì¾èG«‰{ìvuúä*Hì;ü_rÇþs¿8óØ�Gø��Ä�¾ @í6‡4›""/(½\Æ„?÷oo³h>¬;RZ"Æ?à¤Éÿ¿ä2ÉÏ#í÷�b¬·‰ _ß]áñà~pÿ¿]¿?Ý·Ë o$âõ�ÌŠÄó÷�?ÞØòÇèx™k±¶¾ˆ X£=ê|ùÝ ÀX°òï”ö~çý¹þLFÁ§óëÓtn�NU§ç¡Úç;Ø™š>ö)7�í nÐ�ƒäCË>$|ª¼bllç¬Ô Y1ðg>gN+Ÿ†òUØBÖÒÿ�8}ÏõÍÊ û;�ŽÐÎcúÆ—Õü¡ÉÎSܧáùq[þžéÂêSs#ÊÄ Dúvø#5í0éÚ‹cǦ}t ÄqEØH>,�y6‚‰‡öåüïŸ<ë|«ÓÆqG±1ò ¡R‰Ú&·�Öæ§†fdYG=Ãahd‰þÃÊɳ®ú÷g®ÕÚäñÂßèv¹C¸ñ`Ã=Ì{_'Àª7è7æOë Á5À � J<ä4èí¡†à†ò`G˸›ÇOè]ù '†«�–ÏÀq6AÃ’PÁÛ]ƒ[C�¾J¥—«¢*'0âÌ‘-q²´Tá¡Òâ�<~ŸÞù#ÒÐc[1¶²9'Á2Žbœ…�òñ‰³‚…�R¶=ög¢_CCޱD¡­··sëÈà+)•¤dÃŽo­žièÿµ§ù©µ—AÄò…à¤96žõ“îûc%ë8LŽš]c ð>?Ä*;÷G5¤@÷‹¶¾A�ê¸\.ß ß#‡ÑM?ßbüE––N“(Çf„[eo[àW m Š9æÌ8á°š¢C´Óš"C•ä™åÉÖMF‘sCñ‹¬Î§ƒÄP\áƒÀSƒb(U˜©ÖI³X©�”7žÈðìô®§ç§ ábcÄÈaÌôÝÈ´‡3Ù½žÉuX{¶MÏM]3Ë|fr*å4/ I›ˆB‰g ”ÑHl$¤âÚì,ëdÁ"ïôß›~ðPH"9 ù‘ð1à _Ì'mø'CüBây~ŒH0>YŽÃåì ç–nÖûlÏÏ[~BHDºŠÝ–ɽxsËÏ<£O{âW³iu|@ªé°‹›ìG6:=%æ«Îk6m¤LFÛ§‰nÜÒl&l â iCÆ¥=÷ÑŠ�r®l‡�$â„!l©2ŇiÐí8s’oÉ·§h{ѶÔô&žÓ';AÙèî›8zˆ=E¥aC¡ö‰_É*ö¨†Ï:—žÏÈÇì$ÓÇBnt‰Ô³¤uÜí3â±6Éþ§r™0dÑ–t’s’…ξ�¿Y÷ü ;�-9Ÿì¡�^½þÞ4ÞŒŒ(‹øpf@ì|*áÕá€ãBPÁÿy{ÂL|¢—£öq±0,\¹ºçNÚ�Í{Üé¨]ž½õÀû,ï àÚ£ Aœ^Þ-ƒ2L†Êàâ¹°W:á�GÀ%™ŒÉýK›€ú}cQÌDL'ð¸æœ9K8O‘ÐCÙUÙ‰$6­Ï@:2./yfï¯üÃ1sLn{’G@UÉI-ÌCÑÌG‹“s"馺qÏ•[r¹ÍtævAñDt€ª(ºÜá©Ûkð`ŽqÜéO_?'CÃ��ù0´KÛKTè¾C£Çù#Åǃ›°9nLгgD¢è™3“(¡’�œ¢­�0PÕ™A{=®,"5»ó\ ¼e8÷‚aÕ Á,rAr—=ïìî.ÿ… 5÷<ª/·±‰×ÏhÀ*Åhþ$^AeeÂk2(t²J‰#�“rQb¶‘i–ÔŠØÜÄí×ÃÁ05å×ŽÈ `ÂÊÍæws ã7ÈÕø–Ø- ?Úðu·FþØAÅðƒƒ¡LX•z±èäÛÔA+gWìæ-¿Cª“%ÅÇý¾F»€ÎW?Ù3PßW$FÿìþÄqÓës{ñàc�öŒß‘ε¥ÔÒVý[: (ƒ>˜»™EQs�ù6á@¸âd6Lt@ljêì7¢iò¸ (#„ʈËà‘çyDùÞLH|®Sá)üW³Š'nYN» žÁÚôj {áráÀýÜûÛÖÄægØ<[ñÍ«ëXír)�zh糬tiºõd¨ø�j:i+ÿJžI�ó†ü‘Ö3?’j»™›…ò”tó³0ç«�ˆCƒÎÖ”wƒMÌPÊ+ü4XX7�ƒ÷Y Ø(ÈCP — q¹3)ߤ.ËÃ_ðpP!¡Þ‡ïAÙçœÔ†¡(æ…rnçu ‘<y›Ì–L˜#ôž( €sµàü“ÎSüJ|SòéQÇ_êë’Í7™M¥b‰DÂ?Œ_Æ%Eø¼†fËo{ˆ|!#&¢2 2x‡üúïr“HEßÎÈÇ\Ís¥˜+ТJƼŸöÝ#è…Ò‰¥:W(*F0Kffƒæ=Nå´„ÁˆczŒ/Äâ‡Zåb)+ï èÊ¡Íã„PO§YK—ƒQã°MœÑ­a2;2[�Äч|œÝ¶’X¿×hø®üÒÞMHm¹™ÁK;ÉɆ&BÖšý�&ˆ�ð/ «ÉrO!ƒacf`ªG¯ò æÌ É.f�Œ�*šÉè•’¡˜'4Å%‘™ýôht’‰[’zðè)šE­$ÿ=ÁáÅ gü/à¶oþºövÆõ­úr³Ôƒ–éëÇ=|ðÌöñc¿Ó`m‡ý" J$5†K ìÅà :P}%öü™r¯"¸ò´ À<˜ªˆH¨ÆräG9ÊÀp2¸ø\·1ÝqÛó©2!@ÀÂãïÁÍ0…Gíöòîú½E;µN*�ÓråÌzÅ/8õkÊV’ÔA¨×9Þ&(3üªÍc †bãy«>‚ÊXþZ½äöÙÀÒå–¸è³RiÍ‚]YkÔãJâä„E›¦è[éžå8œµ®Í¶V×ÿ»²È=Ž¡�’q—±;÷4)¬¨:ƒ92qCY³ó$ÄŒMa3üȬh´…ŠUÑeΨ‡ÝŸ›ëà\O  Ÿš S™Å;è —½ ‰­àÔl4Ñæ�âêðFÊ[DòCÌ 5:nÕ… ƌǬj®U«[“ýw26b(cÌ#í,Ú™IT6_‚8©Kì�¢f’´fß>’U5ÉG^ÁNªFwÜ8?0Ž¢Õs‹¹h8OÖu›×&LÈ\šÛc:&]ñv|-JÆêhœÎ´\¶6wÖkèKOfHèO8rîu‘úd’¯I_ÿ=~*�e¨ÿgó›º÷ðî—$úäÚ$¤……Ãÿ`>¡/üY½°ï¬{×èãë'}B7­²ÿUH£ÈÓ†5¬W°Š[§`:ÖH´6óYïB‹Â§|(QŠÓO¼uƒâ•鈞ãTMÃ='n¤Åƒ��!�&*Þx‡²M™-M¬âiÿ%3œ«‡—£˜Þ$uX-ŒE·�=ìCÖNg7¼àtO)¥zªY :v.Íó33ÚßmO�¹aÂ…†¬`\HáÁò.7-}¾5ùu«ôP’Ãk`Ëe”e%à, È_ÔÀÛ�áfÜ_{ç •P“ÐxR7³õ¸¦EÜ‘�5íx«³h ìØB:•Åè§Ø‡F$¶ÕA¢"—­‚úÕSŸ‹ÐáÅ< ‰Î}•ÖÙ�BV¤}jÀìðÁA6ˆ ‹8g –Ugh¡Œdˆ]1ÁæF Kå£&ÇN.ûØ¢a„à>æàÃîÙÙ–•_�ð‚¯x¡þ!°$ñ3ïÙ?`H�¥­ ,3[B£u�w¨ÆˆTÞƒ;!9O#„'&1.x9àŠ:vî|³÷brÞ8‘3!;çlŒä…úÐOºÄ’z "�®>”ÐlÈP#9¹c?¯95Ñ2ºmÀ8ƒ·U;-Ï’ç2ÎÍ9s,¹“HózdƒöPÏCÉeÔ¸¨9ëQÊ&²ó5çÊ*ŸV¾³âÙ\ñÜ€U±´Tq�_P'¿h[8&°§‰i1 È>¨s·çœwvòìrcÌ_³c¥ͺ܈áè*ºêÅíÒÄ8]è7¼fD&}U/‡í[ \¼‹�Ð/‡Gi·l�¯èÁù1Ûï†Þ=3ø°€óksY0Òxr>kÀÅd®WSÝc6¥ K­ŽõÂÎ~QsÇ�_V^¸@¿ò>.«“êoïÕeÝ1¤ž2|’^`¬ôL`^ã„FüæhH5µ²ƒ·ÒŒ»~m\¬Øüy+P†Òwñ?ÇîƒÃk'Ê�ê?(OM¸˜Ä�AcºvøgÔB Dþƒ.Ÿ{j9ŽüE!Âô5‘šÈ söOXZ— ÌéæL´b%‚;/¾è QÙ¥çcaQf ¢… Ôeë’$”ô„æ›Ê[Öò“¾2>„…ϤˆPyž ):„h-\|A„½Å·o�¹S—Ýu•N =]/­0§ã)‰7ºZgmÆúú8çt‚äEö›,„u{7ë�€~ å" ÷#sªéêxŽ9g[Ë?‰#Á2䜺–Ô„jfoy Ú e ���? äOx�D2{ðt_Ý…�ÝT‘•Zâ'lQÃ-´(·=Œ#Ž�r÷Û¶\`‘ãÐ&¨qXÒsc²‚�&ä|2Ò"$š*añ¾á4Ù”±›¼‚V¾Uk Eá½´ª§�vƒîã­ì nmXÔ`s5-PUuBƒäs‰ûÓbfµŒNKëIßdg ûO™+ð{¿Ít�n~”æûœþ<¿5ºf÷�àŸ6°a£ )¶Éãþû1Pd®êFmFËT—\9³s“Ý�¨+u2š¥IÒý´ø"ÑÈì«�ËÐ�zÐxcÞ¦sÆ ®ûöιçÊ�ë‹ {]º–úb[õ˜fØ/ø?¿r€ÅlQIhæO>-£éqÙkì; îˆ%ÇôicIó) ÛSE«¸F)}/¨*ioîÆ¸Ä_Óðůxõä_Mïƒ×t?YîíØ�þý)1²|‰¸"üÂ…�z§úòƒö™ÌŒÆBeÒ?/Δsºà#9œ Æ’�1ôÙKà;ÿMîôæJxç[9ü?ˆÁýE:¤dÏ—÷õ€Ád€µÓ­9¯Ž/÷\waÀ÷òÊsNvÞ=.,öm£lß/ÎæqcÃl¨­˜“˜à¸‰3†5Õ‰OÃápóC­«7Æ~hÂJ•ñ_\Óå±>§ð™®ºï àŠ7òYUHÄo‚»Ø°!�x±MÜFz7Áß’K98}³/µÏ>а¹U©†º=9�dG¡(×ü`XÛ™1Í,wôG*§Peu‘(ÕPû°�<Ü®¤Xfõ÷÷ÅôÔ›Ûˆ/ø ˆªÚUº°MXÆ ¥H¬wV*å·S7mŒêÖ¢|]UW!ÙÃWƒr5©¾ñ'Ñ+ˆæ‹¦E,¨þºôCP.ß%+tÐÃm·ˆ¢Õ iî|MjÄM»> µ;ŽéK¼‡ß¶©y¥Âƒ—¢ÀÝ^½f%ÄŒÛ òÚw¯¾¤ž¯�G!ž‚ãEÆ´…�*S�±çû#|!Žï»çÊСTû·XÙ^Í ‰êdLÛ½tîÿ·>‚;¡ D(a9¨øŒƒ15¦åg…=ô΄R"e,X¬˜/Õ*Ÿ%ìr¢´PNž»Ü©ªówãÞϦD[¹ÜlWžÂ†À’Jñ°ƒ´WV %â*¿ùaõ‘2fj‰ªÉì¹FcdiÓÛgB,šÑI³l•á_˜vš� ]�Ÿã;xÅν³Zº{;©:Æ*'”ŠÏÉóŸsßKû!ú=e�:I†?òG#È¡þ»Rãý”ƒwˆ)-j³ ^‘ûúKaëý�Ù4ŸW¶>!Á'J²@ùçí^ä=!o«–^²ùó­à¶f �œ« wÁÞæžæ}Á;ÁÆ6˜…x7äS>×Å )»Á Û¼£kQ~W±E«¾hÌiÎ÷íx%9-CÞ;ªá¥O5•.iT�‹j ÿôïögKÛ½j8íÄ–äuª áë·k´ÔÛêh-Lm�˜îZî�)‚ÊÊÊ$¥7·òo´RÓË×!ð´4E¬*É`>pYäE‹©\Ò1󣩵çoT°”J¤Ã¥JØ ÷�ý}”¸ìä“ëÅÑ×?7#{£Ñã®ÅÜú[.×ÒÌI”µ¦[¦ uå8“Ê ëN‹u¹ÓæûAR Ã<Ýv’ïm”`Æô›5ÞÏHŠÙ[ºqgeÌFè©Ì ·,xºVô/ë‹Ç³xÎFŠ‚ÐJpôU1T´‰QÓ}7,�ãÛÎõÀª1é±ÍNd°Ç­k—mnƒ×�4aäŠ ËaXÅàÄt÷{¶Ë²è—£ÑMCJW¢×ҨŤ§EdQC–¥•,zž¯¦fç#eSQ\Íï7#ù>Ëg„ߨ¸NÈMÁ1m{/wƘ÷]ÇpÚRÊ,¶"1”ŽÊмÃdÞLGO´Dˆ[š‚Z8Xæ.Õ2Üy(d»GPèX†E�Ûî P¯vEiÊ�°z¶þ—Lá3µZ1 y‹¬Yàl„éYLœ=ô›ùE•­ï%¨‰ö›[½ÛYÂG1Û¶ž3Í©ÜÉnÚê[mx-ÌætðMµ9mîd8v¾Í”[m?ǵ�$—oNl—¼h9ò#7íéfÞ!A„Æ’{;¾o°0apD9£ÖgJû.Ý+ U\¡dòù|Øý� ¿™g`3ß� ¬w3ú~û°›Ç°žæø´¼~wÞ Ûuÿús\9gc^Èxtƒ[ÿY½”Ï ~X€¾QÁGƆ:?ç™Y�ì8#ÿuMka“9è¿à?såózÿœìOO-½ç£ ßR¸Wͽ¦G*„*Œñb÷ª&ïÙá· m¯|½K0Œ‡Š ÛÊwÓÊXó…ï(™•ñö¾…°|žnä=Œyù|˜ý¯£nüI%4J*_åß\dj‡yÑ•éa–þTrr㘸aÞ�¦sm�kdfiDRª‹ÈëwË�†]}á¼>Ä2;èZºÿÎ𡊉ñä¶æE¨nÃOõÔ7‹ö‚¥¹ ‚¶•­uu†ÃêrF\E…£+¢ò÷Ó{«1� “2B2·šš�™ŸŠgÓÈŠVä&¯Oæ²Øxs;‰V¾¾›¬›ô€•¼r�~ÍК±“çšêØXï3~Îï½b{“œÓ˜ž£"£Ž%ÓB6«vÎTŽ×auü­ÚÚk©˜}á Ûr»R†Wý§ìtÙ"q6 ´!­tòTxÞò˜ÁNañˆ�3mahíÀ§Âã;æÄð¦;ûÄŒœ‚oàÜogí 6¶ÞƒåÊÃ=ûU‘"(ïPÆÄ1^CqVN5dˆyì/ËaùÂG%ß;ã/å)á­xõÈ+¦¯ô8õ ô÷˜[¦aÕ²Ü@oÑYAº* :/þ¾,ðÖÓÿƒ�’‡Aî[�Í—+®-Žx)ü3N»Ì£UÐdCFqWÈ…PW væ$Œ›S,#s ú¸ýà{Úé_6ôÝusteß×6{ { ‚±ƒmƒ§Q²î㬠žã3R÷Å¿úÉŒëùÉ™ÉxVw}i“º‹Ã¡GëÐ¥RŽ�?Øh.ƒ|fçó›ÆG`ùÿ’¨‰àÍ�Æ$ަw¤ß]ôµ-’¥îidñô‚ûlz Ôîᢹ kçû(0ª WcµH ±ù4³ÓšÞ�†°[_á+Àš¨íhr%2ZÙŒ6ª\—êÌä½—F:®bÔçWÚfL貂p&ÊW‘šlÕ¢êT{I�Ò÷°øÙ6ó- ²:d#DÙ°«l¿$6š?‡Ð}Ë[Oûßvñ�l+IîäG½Ëáƒ>ËWü¦ºÍ žrÒ©­9Q:´•É9™}b¹pI[mb½^†µ mÄgêÁÏ⼌â×r½X`Õ­D;<í“ô㠽ΠØÙM¾¿/Žž8R.w*OƒH´p€Œ–SÛ¸P½^›çEjfWQ c—L KlWsq £C(Rg"S\Ц[’Áƒ_Ï]RÊZÙ‹ÇôåmHü E|d$àûË{qêœ:½hI™È&8 ™Ž0@^¼Ä�ÁóÁ{8ü¬T¾ä°ˆ ‚&P¡y�z1>Ê`•4sù>\ðÛ5˜ÕT|¢e›UŸf‚zxX¦Àæý`u²9 ¿ET`uÚžH<ëÝ}gŸAáŸØšúöÉçúíÎ:k9ÎsòÃhyÈœbé üX}D6Ñaî|$Ó±K5*¸…$DLJƒµ¯jÖoÐú•Ðò)”VãÙ´™ÓXSZd1Œ;P´èfg§®¼v9k¹Êô˜î‰~]{XwvS™Ð°#;ŽÎŽZÒ/ ?¦Í¤:=½ˆA¼µ¢�îh-ºÎÔFr£��I‡Ø‹0JÍ2NScÖî[Þ`’ íD5pö® ÍB×>÷C Åb«\¹a.hW‰±l5 Bƒ‚¦Íkžº%ÊßÌVS0ý&�Ž÷‚¶0jG&P=…‡â„M-Ïih¬ÑQ$Ü"˜[s§u©�Ú(‡AÎËl,U§³b£u­.�çÈ_$o¤mõ•©¸ŠAK8~>¿Ò¯ÁØûþ\¸z!ØoÄY‘c›òÒ%èÇ”q/ÇtC žÌeÿUí3°«f†±˜�`Ø ”cKÄ@&á2Òk[—Z°Ž p׎ú)ú+ìçÆ­ãˆÉ¨? Y’^wîÚböðu�·ç¹ûBæPÁ:ŸJ”ðöïõ½"ôs¯ïkbÝlÀ»Ár‹…þÂ~ÎÛ_ À×–³` 0;å¤ ˆÃ²™§²óxB @tT™¦Û#bÆN~k°<h¼‘ŠëÖº cç< ôšêÍ>6§÷�1½µµLœË¹—ÕèÞË¡o#™2¢yyÖÁ½Z„¹›Jk8/”Lë0RþyŽLíÌ8�‘ìÛYËÄ\ý—“$aŒ™ß3ÇfåIÝ÷vb­,¦#Ñ!1#ï€I%ßñ��®|ÍÄÎðß�ñ…H /Ej™ä4„ ôhÁ«B©ëK„³-6Bó_‚æ­„ïÜLlsý…LnC»Tk̘ ]VÚïÀ =|çV™;í)¼øã ´ê‡YVùXÓSP `ÆFÆü~,s~úÛ }‰ šëåyä®bä4< Ëî�ÿñs¹f¸,?‡çžëûm„ÑÏtmÂk„ ¯MU~,'¢E8(!©%Y}å,�îdâû8Øë“bZlŽåu-Ü{ƒBA÷�B¤*ß/¯Ì"Api¾±[Öõ«±b‰Z'"¬ÐþÍŸ¼þáaÃé_¯2'êÃA�¸\Ghò¯ÛÈ—â×=ç7ý>K&`î}‚i-ôzÖç8ǪÓsŽÛÉw1�*m�µ¿`üBÀH¹ í¶‘ûûå^HàÏfÂZù²½}4}Ý»Ñ,§’‘[t^£·¼cÉ+ŠÊÐL*IûØZ±Ù#v‹4få%¶EÕ,±F´5³ ªFÎJ³jA5y:ºã$÷¾WÇë:2齌¨KÆ¢gM±àTž®³< Ho‹sZ1+1˜¤)Ó˜™NrfýËöokbX±”VÄ}ëá=YË×,ì@vΤ[du|r@�A�š—�ò~=‡g’q‹›aU~à¹ÙWÙ]©f�"Ãwy˜öw/÷Í¢h¥¯ÊóÞ³YÈÓ;`A�Gž��œ�ȃ¢óŸßúAïêl°D² hÖ^ÍTôÙÃJÑW¬ÝÔB®j)ãsiaIlÉŽ•*¢`=¡ùK\â¼bUPì!jåÛ‘]ý厠³t”Žpù¼@b)?X„…°ªü.íá~ð)u¦Š‚¦8±¦ä:íkxªô!¥1L2ä[I�<ˆ£�IÐÙ÷f" Ò6–S݈€ÖñëmĹ}å?â¯ÇÿßÅy|ê$ªÿðé›;â ò™¡.ÔºªÔèoÌ¥Ìô\0Íï�4Ÿ•E Ó‚ˆ{]f´ñoù ~¼¤ BN|àÒ*TŒ­CíOs¾~ζJžUšˆi"Ô£å¤Ód�|Á’ZŸ²tŽDLù“•Ô¸¦ö\‚xW(¾“ÜœÇD­¹Ýë 1l˜¼h?@ �ã 5nY^.½´ƒ`Øs[Mç#EÂAÏ{‚yÌŒ¬á«h-ÀõG B¤ÂzÖ1 ‰%l›ÀÿC6­‘ƒ®âªIµ‹‘ bì3¦›†¼ Ž”èºB‰Þ®¢t<áVZÛ#B.0BÚ¥€¨+Ä…Ç׎ÿbÀý+n5O9 QÛ˜trbRE„C ]¨µL¿;e½…ν¢,’‹ì0¦áƒÀÐûþ¾S™„uÒk»—k1û6&,̱@mIÆÆ9Š¿ÙU˜.äÒ~tPÄx",©ÓÊnY‚°s…Dÿg4¶”wâÊpÍbm“‘of6hÓ 5Íom›y=÷à‡5²NµwwâBMÁ.Fx49Xjz=¯*“± ûí,½<)رå 8àÙŒv¤°ãœ ®:9-<¶N 0‚éÚ�@ìœÀG¶~2ßõ™…°Ø…ýPì»]˜%ڦݔi¹—u™Iu»ÈIrcto‘_Ä¿Ê7ü{+è¹*É”‰V˜R%f ÊÒÖªzüœ~ç¢`]ŽÆ}æŸT–´ýýE%äé V¡z÷¨OD»ˆ'ñùÖëÀ¤\ äYÄ£|,ïgs<ñÿV 3ÒT=ðó„ÒžŽ½…UÃ1ê�%E ¬<ú�\¯+=ÂF6Œ]Vl_¾Úæ)艈kØ…f5ÍѺwGAˆÎõ Ü$¦CL�shmåw¼•æuˆ˜j*õÔÂ`ïØ]ÍCæä—\DW’TðU|ž*nnØ-§cQÿøÓ³Wº8<ão%0zd†cäÅëWy…õõK�`”�Lb™9˜�ɦë£ríXleái_`ÉÑS[årÕáÑEÂë_iÜeRÿm_E̲ôÏ™ j©Œ­Ö*0š"Á%6Zò2–2Ï|µâ˜¯· Lú%MãË<…òò;¥+ÈbÜ*é§œtÊÍ@øç·¼óKÖÓÞ_I˜ž"ï�­ž>ÙJ„Î.¾Ôæ"šøóî Ž§‹XÄacPÚºÞ:÷’~¦x�ah3,Á wÊ3©‘šNR»añöéâsòkíŒiZûÁž9Oö«Ô5÷Üß©q–Ãs¨†¹,ù|bòu/}Nj\„pŽ»¢ç„LJ® LΛa[Fðo쯱½d¥e®›( †ÒTÊ¡únšw":&å]×HÐÚ2yríCG&•�¤„qC.̰s½†+®õ[éR ! ¯edXå µç´+YÀº(&2¿M ±•³à¶QZ=ö)#¬–¤ŠI–™™UJ'ØÚÇ!q0x"‰½¶èމéŠ]�õ‚±5Q²»É à®r(ýÇ™–†dÄÉV³е½¦ †�&àî¼hÉž ¤¶õHå¥G~•h�|Tœ\ë³ �;öÇfI‰Ø¥¼t`ÄgZNÕ²PO³ïµÇ¦^rQ…Ùàð£ãåâø ª´ÌŽ×zsRËͦZè{Cî‹SœôÞî#XƒhÙ¾fâ¹y~m©f©Û<ïoÍc²w2}ÏȼË�è9žÅ )f,îv±Á®0žŠhG­SV_Ì ÝãYë§4%D”Ô�rb²XƒÍsÍèåÂd—¼ –BK%gÓ¹’J«S!ðÑ j],üM7ÉN²�0¨<Ä>–¹˜'¾åØõ­¥>NtÙÑýš¢Ãü˜$Å8Ýäé$M�Jyef,+ù«_:É<«4�ñ³=¡[D‡|pÉâ °J�Ë.f;NýEª|üº«Áe ]œò°6†q Ò ,’@Ÿ•¶Ç�j—ÇL‘’4›pÝ~Œ³±®ëz¾&.°9°ù¹™“/| ùuõwzÚõ§Ë¼ÖÐ(,äÏ0HlÊzÈCžSr�É•ù3�|RÙŠ1ÝÔÕ‘ô™s^«pqæ¤àÝyÙGt¡z8ÚRÂb®–Cî%Cäå˜è妃µiHðn†ÒÁB�½«¹C‘rù¸ÚÏb±Ì£±æüÔ·ê_C%E^rÓ,LJ†»â�X¯¥œ�:ƒ·­oN[Nq#.³}¢~/)»Z`Ó¥„pѵB2mAËÏ K:ô¹-QÁ–™Ø««ÌÈhÜñŒ‡âÆ[[³ø-`×û­ úYí{Å¥—¾I}9T Ô ÄR2Ò›³¤’i—¸¼â«…�'͜ől†©éV¡–°ˆ€Ê.‰4kãÓ#š!r·Œm̈+æ†6ëRôÉ£çsÞJ3Œ¤)¯yQ,!µŒµäϺ£Fcw„`~'ÿ!h�öõ67å£+ú†¨ãdr¦Èçœú_n,öÜóÆÌÎë ÿç/9£}§Ÿ‘V<ÃöÞôN"ÇÁñÿYê‚ÚD#¿Í�ÌX@;&ý.á…â¢"â—¦¡Tdö2#ÙÏÐÒ&?Mö­É)“§?ÃŒ´¨ªsw8B5Š‘er6r™ äiïXšâêÅê+Ö$áÞ¤X�·.¥ë(<}bg’0ÈŒ¹-û;™£W^Ïçp$?^t(Ö4žˆ¡úD®Ÿ¥Àĸ!Ð27«à:ÄQp削V*ç…§ÞXð¬Å\ì‚0HYŸRDu˜l8¦®˜m­HÌÈèï¶1B÷ÙX–ѱ¹ˆÜŒ�|nùç¦Yï Ÿ[ñ�S.Ö|¿™ß¨NäwOYѳžE‚Â0Ü9½Œ“‰?½ZBQpQpýhNƒA«µJ�XÃâ$êÜNÉf5ôPœ®–÷ôbí­.tZÒe£ ¬iûž»»ˆ$-uÁj[ªÚ-�Á¤åŽ HÛëdUmþÿz— ¿ 63ª ‹éÌÈ‹ÆÁã´Bú¼” �…c³ÌÈ5ÞÚJÅö’P¤ò³uÁ�–qfî[Á("�²‹8ñ†lu1K„Pˆ£TA�³â7Ý£5Û­ÈéF¿_¶¦ ^"�éû¢äJ¦YOÞã+ž?yžò탽å|>P¥¦ŠR·±¬ë/!˜ &j”ÓNH8‚„Á´}çþp„EkýBŸ]¸Ž(n›š)H.ÇÃf¡C{Ȳ?ɾl\ òp -ìSŒDžn}K‰ÈÈø|:¡o ºP20¾ÉûALÑLßµ­R¡†²z‹äé÷O½Ø�õËà_º¥º&Mþ}kN4N—¼v±…$ÏYû~¶Cxï46å™ÎÏšC†Â8.$ …²•¤­HÇf`¡¢šfœèjpsÁ~MSF”à¥Å«92gC (ðKØ n.o«‡®Ô‰è˜p©¿¼1Q�hJ ˜YVow¾PË×@cC4 3(Ñ*†v ðiÑzmöQE6¿áúB._Mk¡c— ¶0dƈÅÝÞ­fÆ[PRöiñB¤‚¼,‰a¤gqáýÌ⽄€ò7“Q}¹�"³lŸþàkï8¥U–àþâ†ÈÉ��oEøWï„j-±öÚæ£ ¬ á^„¹�¸üà’c! +†»X Ò�@ØÀ,Ü5 ·Úû×®& Äh\Þ�ùžcO£ ‘‘N ¨�&ø[@ÿÇÙ¹è}sÏ…¡ÇìŽÝ2*³CÕý»HuìX ('ÑoM4{´|Õ—bå�Ÿq©úFK9¶¿¸z†óž¨`èO"û¹6 ]ô2,.§‚ÆIg¢¸²1™4Uˆ„,!H BÖQuÇô\ ‹ÒÕ2:é�8h½³ƒð®‘öÆ~¨‹/ÒäXãZŽÏð0?‡Ìh‡i‡9ªkdÜz¿Âo�­öÌ 6Øïmd½ðüEÌ7 «�þ—Á¢Vî’›vŒ]¯ã“3ðG¤ËÍÒŠg�b˜¸¯‰,hæ2”ºÙ£Ÿ‡gG†¥\SÊñît=�.æJ”ìºèè[3ÂuNçùÁ¹6å%K59û†”Q”gvq R_¡¿ã B;mº„4¦721Ðù¸N|>�g6Ÿ†­Í…Л‰´ µVï¼�°ÞÁwL4>ÓæÊ×:¡›–NËœ1—¡ çEI™°„tK圦sc2ÅŽœw'Gîú‡0YúÔð›qß�}á·¿wâ=Ÿ‚� lõÞŠ&Dgì 0p‘;6©�õt¶32®0âàoà ñ_°Dg¾WP/ö‡ M®3ítpÈwç[-q!MGÏörèÔe'pͽhèR�ÏE•1㑚Êe8öªÜ³ùRžU 'Ž4‘äê,>¼íqŽjVíÞH*oXj Ëx5°9lûAx4/Fû8ëlOf`ëò{ãÍËF)ö+7wVËxŒN*Q�¶©ø±�Fjƺw]ÆÅ\þ=’”ÍäîoÝè¤÷ÙÂ�úù5:ÂÁ”"á¨PAÒmNûÅ)z¹)?iöÔJ‚5¼�“Ó.¥‡:å¨U< Øcœ%&è�EV(GŽó€¨9ލï$T[È, mÝüc7´0l#M ²ìtgÚ°Œc†4‚0×L/x ½Ç^J³¸1™¾€Ù�ýŸUÂÎr™Ç[eu8¼•ž©.––}W–<™�aÓ¾¥ÃV�âÔ`~ÛuÐûÏ~¬l8ËŒDä\j|׸ïf°=ßU½Ëf¯žá[*/ž<÷oôóÒÐ3�ET{°8=°ý=˜´@%ºO±ˆM Œ ˆrÿ çˆI8„ãâÅ�@H¦;<}ÔÓ¢5á[œ%ºå×�awÀçéNF ¶txëåBÔ4PÆt�4ÆÊ< ÿJèØŸ ×í×úá u^ܹëS (èyÐ<0‡öÍÊŠf}ù´Y#¹Ú´¤áà.È`Ôf2U£\ƒßcÉö'pCGÖmŽŽªœÃMîE’ÎxÂ]PÅiŒ�{¾£– pÔ³ iò@çŽx˜×U©"׳·Iå10êkX8œ‰eÞôZð.Šxd™m¸Tà®x¨Q4A²þVøâÁbƒ,NÜÂÀxÉðñk÷,OÀW1k”îÌO�,�/5âuè¡ À�$0n[ëà‰%Öü µp`?Æ ­i‰É½hO>ö�¿ø.m3î!ßéèöJtDï&ž -ÙR•ÙF)¾£¿‡êØYúv+@I#Ñyþù'ÞÌ®{7¯*ÄÍ� ‹åàõ圃�GbË“ø?×.„JLJb1Ólt„Œ®xæTíå#ˆ½àì媀šïÉ…lYw›ÃUDPSv½ «Òtއ‰=Z–¿)ŸR£9È�cÉùí<‘B¤ßž'¼,9ÖË”'€£ABLõñÍLö àį,[&cJ/û÷‘õøg¡~Ô�\)óÕ¿ ᮸ôŽ7½Dã@µ~Å]ÞD!]±¹Ã­ÞG�]›$Ð óÎÏ7@D@G ×¶ØA”h$ à…² �¯c(=,|‘Ä¡|@Û¸ô�îFDÍdÑŒÎa� ¥{L˜Ð¡Ñ<± �7Ø ÞJ$íÆOæ“–´µ×ˆGjY�—vG“26Êì:\ ¶ºɰ�_(ÄM Ùqv >¬zH]׳¬|mP"Ì äGÉŒ$ÏÁÜ œ:¨Ø¨HrCñÜ{�ä}‰©Èk=°+©ÄDÅ×Cª¹°Éæ‡?¢ý €aj‘Zø·“aÍ.�® ´›UÍ|”ØÈÍ=@EÙãBy±‘ß±!„¢;@È@3|^ë °AYX}'“#ˆ ' våë°eP;Q|ÿ…KÄh(ÛÁ …཯ž '”qbA6œÅ�yÜ^„`™$ò ßl†h\̰� ¾Hl¯íúè+Ñ]Eëu1Úyõ—‘+zÆSö''éD\X\�ëÏÂquì2'É–“i6[\‘:ù‚C“~±ÔhS/ìΣg'§ÂEÙÝE©p‚Уâæ,óT³Üìz–gØ‹)&’º%hRÜÊúq^½£B‰N73¥P4 ÔKo’:v•fäž!Ä /}š¾3�0åZ|^dªšäÚD6Wd;QNGo’õ4OC”iaÂ)hé ‘PÆ¡¸Îã Ë—›R¼q“‡Ö‚JhͧCœa+Žð6Ù,. Ë+µ#eØ}s…¥Ùoݼ93O~Q\nd›Ã£ÂµaÎJîñ¤¹ó$ÚÚR8sÌf„8©ÂPCPü»lœQøƒ\ˆÌ'�{&4S�7XL$Ë) ¹Èd@;ËY‡*+eòdz{vÑ¿N4f CÚn6'¤q,>}0ü'âÔ¬xƒ¯5’½é;q“Û‡’.&:‘‚ÄW¸io;äÉ©'’øXŒW2ÆGwÊÔÜ;ø#‚jØÎwîúË/M�Õ›f¶Bl.•¹_`³Š–Œ±rH„ßoÄ"OÎ÷ŠGh9ÿ·õƆ¯?Kêww-ÙÊûó¼WU£çBcÜqã£-H‡+É“–ÙÁÍ×êÌb®ÀÎÙ"!Ô4líQ²rk„øæÒ�H¯Ã0ÊB˜æ °ò#¨¶óž¸eã5ºƒ­w>lB¹ªÔ§ño°¡D†‘¡ºÃ뮥àAõ/¨Ž½ÿ•µ®ùŒÜ¥³ëÖß¼FÞvÑŒr;žOë�蓨6ù¼× ÉûZrŒ-µ%SÝw|Ëuø_¥…÷ÐJ6BQG€�`)…;|üžæ×€Aí=a½‹êbä$ŠÑÌ -ƒÖ†’YxƒÁô?A‚¶ú6Ð/lˆa „÷‚Ùž‘:oÚ=ýq.]Þœõzúû{‰®W)"Ô�V>ÖY>·¢õ>ãÃõðYî� yް[Ü9,“Ž�LÇ  ¥î$e¬MH•@BaÌ¡o‹Üï�K”Ì_X²Ìr{Ä:‡ùwÆ'„<)º®Tœ½kMÿ ¥ ýC#\ûðÌ—„Äü1¨_Ð6;î’jàâ?-2öüYÆR U[Å×v±T¯ íÈ‹‡Šm3ßÂÕ®¯rƒû;i˜FÛRµÐïr‰) ÿ‰½ê•íóŽÜŠY�æ¤ÐÀ.÷>ÉØ¡wö�¢cð1‘ø@Ä�,ÀÛÃ2•E ©^êá)˜À†©wÚ ø‘YáyDz|cÞŒË76®J‰äƒ\�‚s$)φ“tL}N†^Ǧ¼—›�?~ž–ãQ¤3bdVýûß±ã‚=æØÒnå²ïrpÜc=^v¦x,±5`¼ë˜Ó—[¤…iläu¸#$zQ�[:vÝþaŒ˜†[|Œãk÷À8A©�¡""&‡Rž¦G5o ݈Æ<·I$ŒSLé°g<(QÜ‚¶óãcšÄ•-‹ Aߺ@Uè,]+Œ û7FÓ¢œ‚4¸!Ð{!x>§ sšL•É�µ%vµþÎ6j€Á•Þßö!Æ+iF¡•Þ.2TüϱÑ^tj6qž²ÒJJ~Gø™¸&åǘŒ-«"ÎG"É43 ,0t?Ã]<ÄG0 ƈ¸”HÂnä÷Öóøõ˜? dcï‚�lÆŒý3™‘wÒ¤%ïó¨«ôØf ™ÕxVeScÅ ãu†²nrá�Ìs[‚€j½ÿÎüw?°Ûد`b,k°Wî† o¦—·)††_î’ø'lˆÑ D[Íììd~n/p ú˜×°|~eQߎ̰˞Vßžá’%Ķ…[%­AT#b›«œÿöÎ pGrøÕÎêgñ·üëi™ÍJj*¯2Aèñ¢1B†-Ù8iý”%eh @‡ð›cß‹ñ£ú!Þ-óIž¶æÙ5æñƒuç³Í”Çá§é´¶µŸ�x`hZ”®;R—s‘FÂê ü9¨Nkë£÷ qAìh(Q@€¸âòÊXðœs;j‘‘ë\ž¶%V8:“-eѸ懞E(rŸÉ Å)w*g—ñ5›‡ëXI&N`8è‚õäÇEþøddO- ¿é#2¸Éà=Æ;ßË5†q²”j¾+±CÕ±�ôÞ}㈉ 9qr i dD$l0À�6ð håî­ø Î=j¶.ìzcH§- ¡™§x(\H(ч ]°óІ…Qc�î`ÜŠí¬+§Dÿ潨�ÅÅ�ÆDÞü *…Û2¤!ÕKdŽ¢ÿ-aýäÌ…N.J@î?º˜â2æû²Ô¢,ÁŽ4Ã,Û·`ô®ÍK­¶/žë[½ï{®—c‹×MbH”±Ñ/sÉÙ »Æ&QÞ^‘^ó”UÁà·½²Æ¶£bYmlZæâ»ž(ÿl  œ €ñ ±m¡ÄàMítóqþÐH xk>íÈ�kê¶ky €Ü#SSøû®^ ¹+„5@·Ò;p¡–´b¸÷4B}qãdÖ4b˜“ê0H3õüCd=}Û·TŪ{Þì:)-Üå�pŸØ5QàˆfçìKx÷¯"Üc£:¬iQTÙHÙ<¬ÔðØJh…Me²L˜ ±}3|—�ïÜf–øUבnèÌtl®Ü‹W½ ÞºõxˆlŒRŒJ¡"‰ú+c½ÕâBe%tFœß+tg- LLµ¼aáˆMU#¹06SÃ=Aâ r{û/–ë©rSp™ÆÈ!q ‘§[–]PB%#%»d(ç‡àâçµð`9E°x<€uçÿ„@‰¥ý~¨ÿßjñô+hôWXå&HÆ …Uþ¼Ä¸ÿ‡£™1 G�ü_€x÷Üúxkˆ Ù¢ÿÜýé<ÿ19Søhó­=ŽXÁ&'7v¿îg\«Ï™8›íßÌ…¬Ÿ7ÐÇ–� ݹ¿m?îvûF8 Ÿ0ñÇ?ÍhuZù?~Â: @þV|EVþ ì€ÃÅ$óx!P°YÿŒ-#^@ 1ü^ᯯHÓØÂä76 •ÜäÃÍÔQ¦è¿ä�0Äýç‚ɼVSE6’¹¹Þ\b– ‹wïÜ+ë‘!€ŽB$r`ò�ã$MÄX^ÑQ ˜ð·¹:E*æ»( ͔Чúb]m/n“BÔìè6+!À˜‡fù’€tŠÛ8Ô"+HN¥5~[}"@¬7 »Ê³@D]ëp¶qLŸv-&V(,MîG1¬€~0„Äl–5 Tµ»�`Ĉg@&ÃÉ€¦ Ž·»à�‚±¨o’a¨ãÅÉaõcO=‚Q8[ˆ¬ "þXã[ÖÑS�ÈÄ¿õZó\î»Z›ÿËÆqGcL”¥­ÒHV¾IOMìè¤\Ä”L•i›S¬Tdò³59ûw:Ž¥®l:´J£ºü}� ~‡ÁÁ�†äôƒ•Sãjo 6=Êdôùéæ[–¡~�ÄÈ¿â4©4Ì9Éú¶îî{•éooÛòËÓû7á�/©ïþå]¾w±$­ìg ´£ùéºRÒ÷ý1>¾ª÷ï{ÜçLñ�hp߸n�âF}C½W„7�ì(åM1Ƶ·:g¥v©?á¢,¿‘VhÑ ïy¸ÿ�íí&Sw9Œ3I±ŒÿòeSl óWtL_MªÉçñø×ŒéÕ0-Ä—£ƒ—‚̱Þ�TÁygù­®tO<�ž{�mÂ_ q̫ߪ.= Û²ÄêË Hmÿ¬TŠ�z¿E¹é�::E «%°xYêl*†7Bbºížn9ìןçŸâ¥Dä·'êzü‘ÉúxÖâè9 ~O²†@—V†,RTÈhÐq•l)B*JbEJ#¥X©÷ˆèm ¹s€½:àU‡I•Í$­kRØ3´ïXu’#˜*v&ôŸ*ÊKi&êxbpDu£ÔGÞ>LRÙ9è­iò_iƒQIqµæ„DKHS[*†Š8èÆËFÆj¤þqg�´TgcÌHaÁõœŸ¸ß(øµÕh„ìÛó~$Ìl·OµÎ>"ÎäøÌlÌGqIû{K’41£�½*i¦Õ­Ó*êÁ­¨¯ýe)ÀµdÝOÌÊÿ‚õŠ|k|= ¯‡ZÏ*‰·‰™�pQ¾r÷ÛìLD÷ðR¿†í®&?Á~OŸ&Q­~,ã–Öu)ô^gV$Ú¼ögÓ˰³=ºcƒþ#efÌ‘,;oW£š\q%¶³ÈÞm?/V•óäáô|}cŸÈõ„GpÔbÅ Ôü ôM÷ âz®¼ù97/Üøgþ%£¿Éœ´†ù—å7TiÙ ¨Å± È8ù´à%©ñ°°00öàRí'+^qý(V®f¦‚ïlh~9r.Ý‚f¬ãý܉/ïœ[Ýþùp�·’ „GK&8Ùn+'Ñ4&*qN)Qg££ç:gÊÙ9�¨ù-®s;ʇ7œŠ¶ ØJóªÔ“x_âDø| sùapJh�•N>n#¿‰4ÆŽ‚ø-å?æ%h†‰ ±G81Œ_X} ƒ…¾gùtK–Yú÷ýd¿¦øGÛãT¡®N›*í9ò§÷©¶ —§‘ÙEYT½Ñ¦s™¨pÀm*rj —PWIÈ' ÷Pm³[‹d6×7ÄÿÙ­„¬jX‹å ðæ…Iè(Q| ìhƒÀÿƒ€Pê�a{cp”|-9g¾mù/5ôÊý­}É)…£ÍÓ—<Ñù8¦c(™Ç�]˜.,†!œS7“’ôH ‘@;} Ü7uC2q;tLJ³œ™qÙ3ÖLJ*büeCöøÏ=N¼:Qî=<†ÏÈ�ÚážG#¶ó÷‰¿�ÔÇ“¯h¯…ÅÜ@)Z-^ªà=ßK©PPöpÝýÝ¥®+]1¿ Š×Ì]¾È1q>Áù…žÖ_³dƳx½eP–‚3ºûª�¨Ê â¦V ’�·š´ˆvA; `b‚þ�O�‡ON�Mmþ¿†ç‚;Ö]w�è :·Ï͇zEQòfF§8×ÿ³eP´<^wT} 4 ö²£_qÀеF$z¹IÜMÙ)8ešàUÄjÈ†Š‚:8dTId¤0ÊÌZî¦Í˜¼â®¨˜ Q È ÿé!7z;êÿ ðuIú¾Z„�‡®wØó þ"|x¥×Ò¬ÕmM޲+È¿®‰–;;´(Yßñ;⎩nFH“*. ‘‘_u[•MÖKÁ ûqïø¨xQ1rM²ÖŽ›–Q(‚-Ò `fÅ15¨#¸•ÖïL7¾ºØc˜ÏüËÜÆƒ8ýØ Ö ¦_Ó—ÆÎi„qèõ*k:b—�󗨹÷G�Ý|¼Šƒ§Nغ9®ÎDŽÄÃr[Ãù…o­‰œÙc¦ÕZ*U§´"Ü\™`qÚYÄrY¶rV»-v:4S¢S´¸t` ñ²w£?®–Zrü;lc”üGµÚ§gIXk×*•å�úwÃðȰ.™3ÃÕ0¢ûA‡R+÷†Ø 0ž6Îÿnþè†i#ž\Ò }ùÈ&0ƒ¿iͦk¬“ªÐÓ'Šñ¢ÉVÐx´¸“ÛÉ ‡DìP• ÷¥“%â &nÑ„‡=¬Û3Ŭ�žåqÊJ`üûèµÑÀôå¢Ãï<>¶sR“Ï{åÝý›GÎdÌ­­'ße÷Ö¾.�°¤ÈÈPB”wôçÕhËò¦þOV9êðc!믺›ÔÞ\­í|Ù¯‹ówþ|¥3d9ŒÄcxÜ5TÓt˜˜�:Q2Š �OWÞMVÐ~“«¸}Þ‡·-úœzlË� §íEnX´�°Ž8´¬6[ÿ¦PŽIöT\´»]Õ±ooUpЗkdÅâ8kD¡"¥n®›Ú*,ìƒÜHžyѹø­»\ØÐJb™íbèD› ÂëŸÕ´¬øŽ ¥*MˆìDàJ Îj€-Ì®DÀ8N;´5I�„ƒ5”ÐSrÐã@ÊDnä@ÒaPø¿úusMYÃ~8~ÚÞ|/„ Ô•ݽZ÷ 8©¸€�OÖÅM7f1fÑSl+.‰®(év¹-x2Þ Æ.‡Ø 6 ¶ú½6û¬Ðߊ‹Xæ"jîƒÛ§\Š'q‰ ¬ýDPiå8oÏŽ17·‹úÚ"2K#¼­:+WçUž³ 7l4Ý;ø¾e(`èjùr… ÍnxÔËMÎ&OoFã3 åEMggyÊowr†Æ2ïÕHdFf ·`‘N|?ÚŸÝýç÷�Í Lf|Ú™¡<•:EoÌ€(‘=äåÇ…ûWÕª¦8Ü»bú �Š"yÁNA7€,IûÎU4qabÐ0 `çJ€! F <.DÅÔ„°R(ÇüŸÔ¬!£B A8ÄS3¯Ié§+ýó›Kãoý8v Q$'~gùäK_±‚Ö�kâÇK|ݽ³¢µA5€ƒÖ)B |–Úϵ“$;Êî}úý\½õQTÞ©4þx=3èýO ÖF++~£À|“à y"¼Ë¾¤qê_þßóU>Ø WÉýüÄ5µø÷ÏÜó±–µºn¡àqÒSåìÜztþ<7j61G&ç9¹D£%’›DÒ�¦z9.rŒ6jJ! �§“Ä<¤ÍiÔˆgä´íaË¿w¶H¹5ÞcÊw Ø››þ h§Œ.­¬ aÖ ®oÿ•‹„w±µ¬»Ã1Tí#ØâÀƇ—vz®öC‘Á ut>MžJS´Ïû¦¯?ü îSõï/^þ«ìçŒ+€yˆ:榞nÙ±-·rÈ®��R´J/dìK8ؤTV ež[ M(›¶¸Nfâ™2öÉrÕ&Y�o%k� ŒÝ–©b¬Ãy¯ |ºYiÙ«bƒyN¦÷ªˆ?ôœCíû·"m‰Öò�¿k£Ý¹¯É£dü•ë’åÒòE­×´:c±Qþÿ»`ºÏ'Z©ÕØÝúÖ$Ìk¢¾P°w®×GñnÖ9ÁÖ‘Pêe�Ѝø_ ù™ŠEfÞ͸`Ù–Ç%~ßí5ÜM?´ò¸1üxP… ê�»¹?¨µ¯Ú\vÙ1Û¾î{švNäͲ È›3sƒÆáéÏ4öxe³�hÞVüÁnìI)LÍøW¹wo'0£.¨x�ý†>›:€Ç_}™ AC– cC“—Ε»uõa• YŠ­WøïÀ·µÃ€ØÍÆã"q2òF¹$Ž'"Cæs7ƒK4ÝbÙô:ëjÜþ¤Ê!wð¿ôïAÉ3tû¼„VóSY>ñ§±p4y’Úho“5nrãåÿÎ@¦A’·[ÍW{ä×&¶±jÿ»]ößDý”Œ� þM¸oÜßâ%h‘.‘õVÑ8y¢¾G„.-CÍ–"RD­lÍÇ"Ëso‘$ĶÆSšÊéÏFûjqtç&‚ýxâì]/§Y·†d`œ(Ì©'ܶbÅVGêð�?Ûpm,è[n÷Óõež ¥è^ë>¿F›o†N_@ €¸µ/!Jˆ†ŒŒ¹ñ= ¨ª8œ7H_b¦Š³d«™½/+�;‹žØŽØ$‡ãæM/9Rr�¨j@ÓÀŽd{ �¥lq›ñ‹•ÙRb½qv%[XÏó¨ü[s°K¤Oº´H¹X+šgì™Ë0Àœ7û追 –¿ÿ££üáÐb >¹ˆš÷ÃU*F¨}Ù�FÄZ0Qv¸›A mX,ÞØT•Á™ø'ê;'�ýY�{éx?��(”¹W*äy 6Ĺ»“„ÉùÏôçøs…kw/Œ÷ï¿/#p‡ÃçøW$_�Ò[shÖ�];•[^zýØü]*Æ~GwÐKêèIîÖüAîöØÛ^�`˜a9ø»0ú ¯!2<K%ÆÏÜïp̾2Åo×â¤Sóú>ÄÌ®ç(¥W[ö-Ï WL-ü(_ßËò [öØâXI³]n£ú-”†–þúKúÕÛ“{'ÙŒéŠ̼È}$`�ŠØä|žž�zNÈ�¿�-rtAjÏMø§Ùͺæ~z°ÿ vݸóŒdJU±¥umýÎN†. ±Ôl¸ã˜#%¿uŽîh[ÅùÁ*ËávLMõ ™qħÿh]Q£NÎÑÍm1u%Nÿ+@þ4ø›wezUm‹ŒC¯ÝÒ$CíÎ98Šý´Üž7Ϭáa=, ð>×�bv6êO~Xýh ã–pc¸1‘É„ 1ñk¤2©áVb¼1Ý+Í�8ª¾R†lfö%JŒh… ÂƒÞëÖ�Eà_w)ÐOD5%H1Î?OëXt~ýA¿ ¡íy›�CVT³H³úŸ>37m ¥«á #IÞAÍœ“DÇÀpBÅ¢*ð#ˆJêHŠ~}íÅREätO³9N*ãú´ûO�N#Ζ´wª�¸»�¬Œ¸dLHd™¹32x¥ô;KB-o~ÉîqÏe…ï}‘ÃTùÒùJdW— $¥=ä57.Ûa4e@oÜæoK$HÚƒr8•0ÅÀ“`¶?´1ï†2!¢7ó‡ëÐŃ”Z>ÞŒÒY�!V‡è83lÆ%P²t³ÁŸ %,P?XÜI€‡�Ñ\s»Uo�M`{ìæ¸oXëÝTs Ûb”YˆâÐJUA‘3¢VŽÅ‚4YµºEzq|îªÛ|]kÌr×3†q¡ß|÷‡äsÒVll¾î/òt\΄oº`&.ÿw ac®ˆÿYÇ÷èN….m½¢¶ãàÓ¶�Ï¿–‡ÈC…¤©Ð /c³s¢bÇl™F�?‘šLC:&8<ž�®|­»½f."ÔÍEѪ"Í.Ф€j/~žkô°7`h:Ü7î< N6-‰Q"¶Wûö*ÎSN|(�Û1Z_If‚È÷ÂÛ(­èÂjHCP׺.HÈV¶*† >¥'I…äI±ZΤwÙú ÞªRfQªÃ @öCY;3÷‚U�Žä'Ù‡Û�PäÑQh“œ9Ƶígˆožc@üË5êÄ7¨ß¦™bló™É¢3õ ãöÉ|‰7ƒÚ‰š¶Â(«ÀAtØ#+…Áò�.ÿ�†ÇÚî&|3Š=ý;¡J3Êèè˜æFí™ Ü…{üzò’:iG^�‰ ¤BÀpO’ÊN HÁ•Ê8"ß`÷�ê�ál¨‡´‰ãˆ:W"GA…õÌÈÍ!ðªüµê„dû{!Äs¬Ñ¨†¾Ÿ€j9ê \ˆãL£9%ÞËå Rýü¤-žqñÉÆûÝX韖«åW�á«ã˜ôšEG ò†ØB³ÉÀX›¸…òº&¦‰¼GPÄl ù™Â7�È:;ï…hÞFÌ Sg4Ýò$s½ÙË0WØ^H›2ÑN$öVFÃ"›QŪ«©|wŸÃ÷·õ‹Î¿ØÃëçÝ4`×*‚TšžXsrHv[…Ï®Ëà˜Ê〬Z–‡¶Ã‡âPÛÿM&šooßÀM‹ò)³ÖßH�ûÆ 9Œ Õü3Mñyq2ón·"WÛÜWò1ÒÀ3ö? ÷@Î':uD�»êÙP¢È‘Êà­v·ûPQb<'Áëâ'¸ËŠ|;4¯<§6™ 9ŸëD�øÇE\šQ,IVŒwKk?MY·œzÖ¡?M•L0¢ZãeèÍyfÓkšAè©;ðˆ aŠêsª0‡êe®˜Ü™§“Æå¾]Ý®ÏÛyK!~Û¸ýæMBþšý{^ÞŸà•ø–8a²ñ( DQo[D¶Õ—D4Îaÿ„Ø3¡'�(¶ß-dÞmþÍìx~Ãã`¬KÁ›i¬õáí Œ¤j ý|ŒøÞ0ãIÍÛ;úy[|P—µÏ³tSǮ߻û›ÆrHÓÌß:aÈö…œ€™Ëm ~»“dc"kíÌE ÊÛÊØ(úöìLÜE L‡Ø!±ÀÆÆDŽ@jÕœH¹ØÆØ Ðf=3Õóiå´óVæsV·n–²îÁ¹9 8íÑÜa((™’iqs ¶@×î…�UKv™úÒz‘¢Q™î‚t`a#x)¾ûÙgź;ö›cö7è±CQ„A÷;8S¯’ë ±&‹`Ñ6òÞ“ò£Ô“•ë�ë¨òd‹™0§É{À².uGº¨õñFІ±9Ãh³vÇ)ùó½C讂åû7~èâ`ðBL�’/N¥UF ³Ç/™c‹Aá†|µ~„ø4·Á­Ã|E d $T8ëŠUœ\SÅöpA�*fµ<:<Žz8f+È.âfK­À1a–0\á<ŒŒ…‰tr S¾©0Á=Ÿ®‡W†,ÄãnÅsæ²0Ó Æ2Çs¶v±Y^ï# 9 Þ»ÔW§‹S�tK“tÄ<؈AtN¥¿Ñ°£>« bY‹öÞ ÒÆ�ò†<~£%­éŒôcy.p¿Z™WÄ2¹éΪqO”…a�¾ÝºIÀI#_ê!Ñø>«Š/öF6”)\Ð9õVqÒŠAèÇÜE«Î! ?†/Ž!–ïðþ¡éеÅW~ñ[ñ|ãCõÿ‹»°È7�¥·“Ë;‚2èÀ!P=¬8ÎGë‹§A`m<ƒºeLÙF!…%¹}>¿Rlnφ!±/E5ö›Ã$oÐV_¡ ƒ6cßwüÅ8�ºæí‹b–ÀÌÍ­PÛ›eà f:ÂæŽÎjÃxÏ�¸tu cz$Æ“�´.¼ö{Ã8´á(DN,Ó¤cæv”|;cÞ8ml¬³Âœú¤»®fA¼ž+Üxë4c6ÖËQœ±îï6}„¤½ Æ,[Yž9À5÷ŠV¤ÔröŽuµŒhÒm?0ë5E i�58õ,$“>éâLÞ4ITõf¥ Pèå>s£lûy‹âé6fùgÝ C»;2áñ�3­ø­Ã~|| ±Þþ·;8‡Ò(ÐU}Ø}ô=Ï‚ªÚþ÷傼-kík±å«[¡Ò &£˜AN1+ž>ùý˜†2•;ôȹžz¢}‘N�ö9d{^¹ùfTDòž�M˜GŸÿ¥¥BxÞ¨<'Šf®ŸáçÇï‰óødåiÎú›­ëŒDîûÚ»Us*dž#Ïê±*e¥j*v‚"ø'”Ç¡MŒ�{9 î@=ycÛÖü„Å[˜xC¦È ð‡F”EvÖå|í[b¤,`ù�¤�ŒžÓ½ƒh4~Ú± »ÄܼE ·Óê-ÙŒgNî�sCÛ/® 6�¤°´Y¼û#„R”2ºÎµx¢jZ8ŸÿiûÀ¸m¶›w‚M›Ê»C¶‡”ÁÝ@Pt>f­Ek[Kù¥hÐÜ$GULB„*uοÕT•u¿qµ%µË<Ñ@9ˆh�{!l dÜ@Oº–�Ä.’¶ÞÑ…¹¡[Äbã#zdmãcºõÚ ×2;½ÈWÙf‡²Ø±’“T]ÂJ`hìá`&‰ÕRÙPŠ+}0Û¾\&d|/X¿Ý½¨µB¢CáÑ>ÉL‹é+cpQÛ:ö̓˜:çº'„ ó=¢€XSgŸ1#'Ï�&Õû-@…SZl`&©?uNwÝsd¾~s»èmþ=�Ä+ÉúÎ#D’/XÇüØŒ°oÏÚ8½8ƒ[ 3à�Ö¸›øw6ÙvlýkjzãxÉ›9°¾CÜ„ï“þ"pXÎé?VÛú{éèÕçÊ_£ÍnùŽ€±ˆ‚D14|‘#5¡BŠh²å�GS¬T�·kò^žÍ»fºcL8€m´¢¹×N”ÞÝc�=0ã!FÔÈC# ™dóˆãX­†°;U0[’·âɺ=ï\Ì.³Ëápªø™3‘^*Ð’êóÔø7.Šx\Ú15UœBU¶ü’0Ô�TÒéúsÙо åÝ=ZJ'æ‹LpE÷i>g~é¯XFŽÏI†’‰W ­,Õ÷É’€{\¢ÚÁ‘ZØ7C¢D«Ï&øÍ\§A-72Ü] „Õ>à!Ó$P—èÍì Å�ÈfâMá¡-„�â´…³‡/økd4Ÿm–± ½ýöÃéŽÉd‹»�}Ä>MÈŸÕ}Þ®õDùK—§=ÿ©2¦Í¹/¬ 3Ó¢òÁ¾Tùó¢lûÐíœßx?ôãôs³C­Í˘#"C/–øt] iíì 5<ÂÜB÷f!\-µ¶6 ~ÿ™Äùn†ÂŸáËÚ1‡U9-Ïf‡“‹"´Á¦‘ŽÇ-“#ÉÌÍ͈úZÆ´håd$ʸâº%ͼI%–5vd¿B™¿d"ý䢨5–iZgõ�ïZ>²5É_|>ÖÝÞ¢z;å[x¤åûñþ™«CÄðæ+,>‚'™övRj3S¨˜Iøx`x)U²Ö‹‘îïtPfw[ˆ•÷ í�Ò˜À�]Wˆ´º™L7µ¨¨„¿ 6É�½d8È.ë¦ßæ `U·§øÒF9v«SŒØ1uÑu5V¸0½ˆÏ5Nú3Ç'|óÑÁíŽØ(�j¶FÙÅ,lº ôOž¸ÓSÜÁd$=Îèmq pîE=Š*6ݰÚñÿat}iî<ýƒæÛÿdï�3Éu<ó°{ûéš?!›¦+=¥J®‚ê_¯ÂÜ^󢘻‘!ÃÒ˜WVù‚dñ$�&©ûw×IºHέÞ3nêû™èûübîï ´‰eàì¹0ÑçH�š‰²¾A-òLJÒ~?17¥!¾=)äB6>¯Ñ3ž„”ÛGe M¹9¤“C;‘áœÿ}#ÇG Òo=ù*d±4–1ç ¢øv¡¯ 8àa©Ø jê?ÂÛ™âT�¶¹ÊÈæªUŒ-ô›¯w»©ÊÆi*ÄNË^ÜÝϯmŽ¿gZ Z±ÿ!†Ö¼YónZ‡ļp�'é1øÕ�d!GqIj÷dÙFÁðÙ Ç+¼`yx�»†ò¿–ƒÉöP¬˜AûS/¾TP)Àlaµ‘µ—0¯öÅôëÈá×S�hÈ!R¯æ¼C|='9føcåôZ\`¶&|881ƒåu2\�¤XGÔº¯s¼�ѹt‘\õ¸V¶,¡�ü埮i¼:pV¡VY#!¡:’)ëØ#sêÙ‡Þm$'†×X2+„G.ÙØ$ÇRÚý¹„#®¾äe× ¬Hf¬cÃàáá;xþØ[´‚Y‘  ¨Õñm‡@ÄE{ïåÞß´³_qجǣ©òGKÖW¥O ä-[&3øyý€ŸsøOm˜dAüQ–Ñ:`ð¡GH)Y<â”KŽŸò™|燷°Õ�bCL ‰†¼ˆh̹ꃋ lb�õϙסI7‘òú*öá�¶p)†Ÿ®Ošźš«Ã‘MÊçý3i #üBùnWÚmßGŸ¸°H7~LT¯Õ³žQ\Δ.uLpæpóèâØÃeãá¡7ÉK~ì ’„©èù>®ÿ�ÛÖo@Øæò'�©r/~æã�¨OÅ�OóXö�\¨…:yâñ:ôð,qƒ.OQÜ̸½ÞeT^ À]Ž•Ñê ?2!Ä�ÕÚYäÝ bK«AÊõ ÙtxDn“ÈO»ÞÈo è%ç44¦À ê#.ÞÏÝ ¹ŠVÕäliLЀ­à&�ñöZ´¨4‘a{'ÄÚÔ/×ùoN ’3ùWàÀÔ“Œïº3Þ½ÞåWø\¯{éè«7ûÄVO�ô{{›¿ y“‘!Æ:Rý ÆKLBqL¸í(;ìö^ÊVüÓÞ0ä­_>»¯°K$„\^f]õq¨” � k499Í{�I·™þoÁå±vatÁ€lírxÙL‚A¶çâ¬ch)ºïpö¶D†YñSØv‚üG–üßÙI5§ý«/ò¤‹òÔnÕ"W‡�q+¤,ùá �›Wˆ5×X¹–«¸Q³ýùÃ| x?DR²fG0C賈QŽh+i|Üp? §‡GÃƒŽŠ“Ž¥·B>^�>¡ŠØÏ òY‡%½s7`j¦EcH×oŸÐü5K‰%3>é$m P@íbùÆupfŠšÚøUbîÖ<÷ëähtN{¢.Çìz¨ ÿgŒhxÂBÞÄÃ'2{N¿Ú¾D_„�­ª®�8ø´ÉãÇ:*zÏÁÓvÚS®0ô80¬Gr!7:îɹ+Ÿ‡GBÀõŒx=Ž‹¤Yš$®ïLÈD¾Ã ;wf-ÝJï=eª ƒH8±ž‚œ»/˜«Û´ùW‹‘Pá­ŸÿA¹ÿqOñxþ é¾yZþ>¦ý(ç„Ýþ~=¥$ª°+[*ÛÅ;F%V�£·³-‰ZNc•V6JÈhÑr;€¥Q CÊ d6§jJN?¬`ûõ‰¸6$qÝÚâë�wqò|ð_nþf‘Ë.Å÷ܯÏL�œg–ćqÁÑžî|£4^6é®t=­%k vG5DZ�cf.¾ËÖû½N|ë_ õ�_�›œ0s܃<%“96hïñך–ïËŽ+`eÆm�s… 2Ž>ÃÌv¶9�V¢O .h‹]ðºÍ Ö�`¬†=9~ç¦&…£××w@ñYQt*¶È§QÜtduþáÜ:—ð·(øùiÒËšÀäT»˜k†PÅ]'ð’6žFê‚Ò– ØÍUdØâk9ïDzÅ�á—=¦÷ïL·|ãÒí6vH#ééä�ÍIS>³kÍ|Í�o­SM û¾nH-2m£©)RærÕM·xQÞ7¢> M¬-èPžD…u "-ÄðÜâ„?DH³³Ü3,QŒZ]íhe]®v~ÓVà ÜÊí{£ ,ÛV÷¼æq©á¦iz=«Ác'zâogþñà‹žˆ»ªô!ßoïI·U9Ãm¼(Öy¡›äw2¸ÉŽ7e�ٽʶzƒ§2¹3á›äÏtÏ/œTý ŒÚ•wª¸Äf3†4ê(l1›¶jœï ÅÁƒRuÒí3&õ4Îfªi±²¹ eêø�tºšW{9JíΗì"æ7^~Õ{7d£ {¡1`:ßYàbsPÿ5ùW]&‰Ëìa1JfY]¶Ò2|É)–5~¾ ¦Û’*Íê ˜ D“ôc¬OœÜ>8wF¾LÊòh‘ÅU;ù¹h%ÐËæ¤WOF‘Ó>Úçë€pjˆgr6ñ˜ùN�P‹QÒ—j27;ãHØ‚÷7–ÏÌn|—¹žòˆ…û =6�Ü{tw¿±Ã„æq›ªÃ²ˆ©Ý2s .ÿ_u}Ñ5eõƒ•ˆvÔ¾!Žz•ÃæÂ³R;ÝUÁ“)ŽÝ'õþû1ñê9�§= Æ´fÉ:±šŒñL3±Œ3®æ‰ùáˆ>QŒ­ù{Nþd¨¡ìzr†ö6�CŸzÿyë¹:¹Kç'øJÊ�oÂÌ�'í|=�€·†þ²W˜BB-Ï\³?”ÚBuÇ/Ÿª±Ænf¿à®øøÛý$ÒTQí?ã�¬kxŒ_cÀØÿ刷±Ú¢[5£�ås¾‹ƒÒ¹f�õáf×£ Ç4� ÷]˶ÌIÉ>†;ç2‹ËMÃÌÞÇÊŸéõÃŒ3½ Ò‘?¾¦�ØÏ_"Á(ƒášÖûÇô=Â3YVpU8¢Î§SœÑÍW~,$ƒÛsCi£ €È§iO ÈU¶r¹æõ{ßÐÿ‚8¯Ä�Á~Hàûƒ�¸< ­±“ ¥k ©Â’*fÌ‹áЀÆTúú\u'fÂÞ b¯g°)ÿgNFnQMehí ,½ŸhÈøˆàï M-§»dƒL›w{ ç×vü’‡?’rÞ(“ƒd•‰ü¦h—þLâì—#Šæö‹G泟vÜ>sÙz‘cáæ@àÔ(RG'„à“Ø÷ ‡?£ˆ¼™ÁÈ?¸kç�Íìɪ“¦uô| až7RÞ,&d™¬yôÍ8>j²ÙÀá}ÂÆ./“,>1'<=ê˜ä·gaœÔž^†%ëOŸz­7MÝßc܇òcœ™Äî#Þbòº'v‚�[ôEH-UÁzØØ­á½Ë69ó�lúZÙ9-ìgöAÖ8¹”Úþ~µ0V‰^DppÃuÀÔBQo!>J°Ó Höób–8Ü Ô_b¸µF–”ÕôÆeâRß È˃Àya"¥^Ú‘ÆSÛW¡ü ÈÍΊ~­Ò1CòyšÈà‹m7�O é7ý!p#'™g*šÊ˜Šio@Å‚vþŒæ<¼Œ×'«ÐßS#7]­�­‰Âº ±èöµÊÂCv }ë½àPÌs�(`�w`¶êâÉ“n‹þ7Tvry®xú)ûðÜ3¨ùÏÃ��’ °}$”²­ÙCŽ=ñÊÆå§‘‹Ý.�+ÄØì ôUèïÙ Øõ›éÄ7U_//&‹·Î Pó4=ä�»ÑÁáDOÀÛKy~¹½ÏߊõV~פ‡xø?Âêt[aÃÉäðÄóQÂ|?ÜÕ{ÌÛPõH_×TöLÒ'ö÷½h8ͤ¢ë‰CÈÚøK¾Ïï@×,Íõðó@N,ŒÜðÐOÏis†ÜùÞp®Ví÷)öëcäæ„)ÏT%‰H�4+–¯[}÷›á5Ut†Ù�Zÿ=d(% ,V´Íÿ·Ó¥#T.åÖX‹ú?®ì{E7Ä6äØèÚå7 ÎA6à·hqÏö`0ÿkÓ°Øà Xaœ[RܶÀ¤2ŽCª3Œ³$'6‰# Ï£ù*£y¾§AŽËyЭ±{Î  ²ö•ÈøŸžbuáuZ ³ ú6jAÝÕõtLORø+ªË U4 –ÅØ)À¸ycÌC.EVË‘¸Ñ›ÛîÓõ‹Ãð¿í“Mé aY`0ZþÆ#wÀ(½' ÊÜ£èQEÜÊFv}WÍá‘[önÈ­üx"× gŸŽÉÌÁá ÓÝLo³î©öS^8{ª„�{ÐäɹÄÌ%e;ŠÒÄæ© Ç }ñŽH?ëP%ËçæÅò„1ÌŸÍ;yƒ˜.!¤Mýô«çN¤GB ’÷É�—˜Œß'ÌèÆû'Þ¹8o.:)Î ywÖÕl#³©pæ·f��¶†0,Fh‚é>KJ±×e&> ä”ÕG\�Xï�Ì‚ÙW�Üõ¸§‘gŠ™œFSà¹q¤ƒmXÀs ä8/oó.x7·Lš:޶_�ö´M¤5ñ2�×aiÓ-'¨´#ÄG�Pë…W�¦ W1ïó_‡µau7�˜•W‚; y3R:<.‚óÒµ †Å:Zãã]:ËY¹ò [øAoºí¾¿¬‚©!/¸6ýÈÍõiÛÂ×�qŠÊˆiõ#Ë$ñRØ—d©1,åÍ9sçxå¼mÂGXØÈØ‹ mö—.3;+¾Ks›Zˆ_væÿD¡Å‘ÊÚ›aÃz£™Ý:á‘Ãq¬UòÕÑ�’J!8�Õœ­ƒ–RÖ�ZyÑKcH}(lÄxnûš¶èdé,¢mèV†Çð¿NÄZ½O"ŒÆOèz» Æ‘ wÎû#Såò‚’: 7î‡4禊NÆ7åû¼áºvŽNJ†$\åt�S,j|¨ÂQVà:¸³%fÕe¸’8TDdÈZzi€ŽàÅ�/ íÇ Ky,guj[TìCõ®¯¢dŽ'×Y‚OÇeý=¨�r°u²žÔôÓO…~s1â")J£>3Á\˜xÂ�{j;ùnsH*˜’©eÙ!¡–“©²LŒçN:Ò;¡¨\Œ›çëÞ‚ûëàw—ö¿]TÖy³3¬l¯!hÊ\eæ#XwŽÓŌ´7iKp mP»ÜŽ$Kü!sÀp9ò!·=ÍŽÁrt9Be�¼RaБȎG¡9ä·-ÖM`,‰U ¾@攡è†çf -Óð¯¶&G"nVÍôGnHÉ>…Wy€“i­måÝí¡€f?tTAžìÈÌHØc�˜ÕFÂ?v!'2 ¿=bÒ,f0¢ G-À}dž=„¤�ÑÅÁ˜áï¿òÖ »c g!ÝÃ¥²x˜4½…´#PÅ6#i…– !âw@ÌíŒ „ÚJ@KW¿v!„ŽŒ¡“$EÁVÄ(æW‚ÞÈ ö©Î{Î|ku¬¼=”¦¹¸€co ª0ð�Ùd#»-(½øÞlaˆÈñ3e2Ê3aÁû¹Á�-ÉëÆ3+ × åEÉfîZd.A´@¹ÌÔVt„U70ŽI}CG í>£ubgÄqËñ^®YœÄ7øg3ÉÄÏ7Õ7ÙÁ»CÑ4êÎКÈ?"ÐÛvpªcGPä5ôì ^üÜ~…i¨åÿ.ñÚO;¾áò^´ Á™ŠQVÇ`t�[J�{Ñëþð*µËCK·¿ö¬Ü*/Ê–edº0Vz²Ð:J�¤ÌˆZôŒ+`ïFÛ Ìe\®LjQÜ»ì»7sfI†3wHÔ©?NòoG<̱š”«xL,$@Î [Ù�cÕ_KgéX¶"×�;<|A.è]¯ËdBåÒÖr¶7³U«±PŽBó¦‡ñêtQ�½íΑ/Gë©{Èøp}‘~[¸ îö‘øAó÷ã Ú;ln“·›(tŒÀ �ïFº~Œ`´æ’ØÖ¥ºEr&pZ¥ç¾yiA¡¸“ A”mºð{“ÿÚ†”É;’¿ŠMÊ'-A>ÉÑ.L›=“õƒ8+�ð¥u³ÖR ^�«TÅCóŠåu€šC �ÑÌÙÍ›}XŒ|ÞJF±Eúnmj=ÞZé`RåÇÙqüÅ•ÝTÈï—ɉœ¿ç!¬tlrüåAÆQ. ÌÈ$¨a&r2ÆØ+æJ¬hµöV‰ë/¤D<�1ýg[íýÐKâ øÄ'e[*•ÖY°Yéçÿ”¦6ç–5¥×æeâi“œ`m¿¡™su2ÇRôÂîY(K´¡kÞ4k }¥�ïZ’Ôq³ÂÕßbª†ˆu¬ÛEŒá�dc:A#80FL¹·ü61úCÃÆ¼÷ ÿ>]%Ïù £E[ �ÀäÝ£¥ éþ—o]„¦¢#šmó²pñG¬"q4ÀîÝÌÕËi@Ò/Þ¿uàÖ± }ÿÑ ‡HÆA€(1ƒ°ÛpsG¬+ýãcÇËsîó•%êž9/I%�²üN¾¾F@âx0Ÿú30 `1ò6óùÔ .ƒÝ AÑ~¾%<'ÿ®2Ë~ âWPÁ7¢®x^:]¡õuƒ»¡‘"Ûþ8Ô娸·ßÏòpÝ5ô`¯Œ‘~­'Ë-ï7åØ'þúñ(øMᎷ;m4|¼GWôÍœŒ ��Z:Û—EȈSÍÚ“w{‚(<Ì4Æ�9X9÷�g&cØºŠ—nâñêl5~£R2[<í‹F)©X+J¿¿MÞíÇÞ†ˆóû,—¾Ñ]ÝÊÆCÿ…õÈF^þÈä“™[ÂM3 ;‚’ÖILâe:Å…ÅÔn?†+_…®¥=BÀÿmc—^§ë �F_L!"9Ä©gJŒØ“Ëæ°*!x´,ÀNUäïü�þˆÞ*ó­Ì\ÿ�òýærîØPÝèíÏ=ÙºdñºÐH5&ÐøYÅa%µ¬=ôrôA«-[¾­vßË„<ÖÉHˆ€+_cXÓb�Ûc¹éAöçšÂd¹V;àW§©”W\��§³÷¹Ûgƒ4N‹�ÂÖü¡ˆ'; ‰hÆO >ß ÆLŠnÁ~~‚Ú“’n²$Ø;zñöÄÐà fNÐ;h,ÉËçnT@D&¸�ʬ ªS;:Á…Ó[*˜(™�š »žmÓÇmœZ^˜×O�åˆÐfí~·½�zÕÝÛ¼Ûiªçòêµ×ì{™KYÕéslY)‡ÉCž Ãꌂ=Ž7†œ˜âOÖ‹ˆÞ¥nüõQÊÊÑ"<Ö|Â0•¤CB²WS /F[]Ua’ƒbŠj/U0wš„�ÈÃ!ÙÙÕ åÂ�=ÄMHøòFf(V¾Zžü¬4ôM´(I¥¹£¡=W¤®Ed aÁ¬›ífÍJÉ‚Q4 ²‰V“~bšË¡SM”f7z'ø‘�t¤`HögœoLW»ärؘž1©Àb’ÉÂÝ$8÷RC±ì×<çu D>Æì#I•¸ÿ7ê°]Ð;OÜðý|ŵDÎáF$3jÐj”9%Ì5Q´pxÅ œR†¡ê¢µ˜î¦8î?Ó�ð‘°šý! 1„4²y|�œNâ Œì+¿I¾þã‚N\^ìuû›ÈÌMÎm‰ÈD9?\â DÔ6;ynBª÷ëÓþúú~aqiÒpŸŠ¬J~^9Çkã0S ±|ôp})¦ÀzŒ +çušž˜æ0šF[«ËÞõÔý8åL«KžÝ‡ Iw·R3¸ K¡ 60�ðÈò×=~þù$ŽVsß~&Ÿ¾Èj·À§oЄN�o:B àÞ\†íŽýù\®¹¹f=5K´�÷%Ëí'ÁÅŽ(»éŶžQ�…D,»8ÍÄé8L” â Ø;‚z×\¾Ìð?d»¹¦D€å®Xâc¦I'VàÌØ˜…’AïÄ™žÌ«ãlïÀûQ‚Ë8™;dbõÖw¾ÍŸü=¸áÜ=äVœGœVñ4H’¡6êÇ`üËG–lAyä©“+‘x/ ,ó F%=AÈHe^<ƉæØ¼‘±ÃŠÑ¯ÜÈ›)¡%S£Êù§9=|äÎ=ðΩTTkšäÇ£µœ?_$¿§Ý¨MWv7…1D–èL|Ë�é¦Ë®g_¹‹Öx6:ÃÀÞBŒ-²e±ÓÎ>®Iµì=ð[V3áY4yî‡kz…¦zóÌ@æ��1¼ª¯Ý�­æ¢°r„¿¹'%z8ªjRa¦(d›”p@åøŽ\¾ˆÒÙÇ …QßZ: øÂ÷�œ3ã·7ÔàlЬËV�½³0æéˆ:iµ¬DŒõ“;§ ¸QW]Øý6’¯V;†O(�¶Ø^_~8ˆtÎoL0‹Éú‡esWªjfÏçº=\t_ˆ,¬€]fS¤Ð>:As{ O€M§G|.p}«k} î„ÐÃ'yÊåÜ—eß×däÐ[@À†ºŒ/Ü$­†áðÞÙ¢ æ‹ j 'c-Î"[|L|IĹÅÊš£õ2…Ú²á\¯‚Ü\¹A^Vå�÷zjºÍó 2ÕIn‰�ÈÜÜ処2þÑ•†­C‘pö1¼øT‰ @[Ø-ˆÃlk c×K½1¸¦ì ÇqÆHO¼¯LÉ7iëC ð«mM+8ÎeTŸ‹*1–K‰ÂY›ôI„6Ev°q,|_wivºÊ\ÏïM»àÚHT €Í±xEöÆ9@¯f›êlzëà“.Hx҆블o‹¹Ý'è�ƒ\$kÄ"°;lÓâD6¯(3¢�ÙêÃÙÐÞšàëš››y?ƒ[¢oóÐùÇÈ:ñ ¹2eôë¾Å§×²ÔW01MÍ›ypWØÊ‰£Ý¿oÉ Áºîn4Ù)'ü�‹xw—BdLikw~óxù_§ã«GÓH ·síØ]:¦TH�–ºæixÆ0vÎ øðǼ¿!7õΨË&ü;Æ´¬9»‡kuR.O—÷Sôëp¥¤£¯£Ÿ½EîƒM[3‹Æ²i´²±h\>Rœ¶†Ð$¶wã¹¥/Žvѳ¦yàäAR4"Ê“«>^uìHÞPáJž Û5šBfŒµÛ§û–ÆMÊüL‚5ˆ¢hÕ&â’ZM‡¾sz~Pn�Ç*8p†}»Yõ.&Ù¨8ÔqÊ|8¼†å y;¡pÉPã¹jo.ô0‰O’Þë=cg"4‹ˆ²c ¦(¸ìÝrIŬˆ¡§n{†¹$:ÌñMP�È�‘Â-ße k…Ýgê�|ÚŽûpʺ¨ýÔºórË“/[-{cŸ5(ïŒêl€ Ç:h¢M¨•\Õkìz¡ÑÊ¡.¥<Ñ›"”�笖wÑŽ{åù0x¤£KŽªO�ˆ�{³HäqæW�,!,^ÆŒµ*êLQòUÎòöñÌg=§Ñ‹.Æ7JÛ^[Êe‡%b]lu>¸�Xm2èX^¾(Ã`@ÍÃ×È<.9€\9F›ÄjnZå@tÝL|ÜR†Bä]R¸êî¶ö:uH§jËõS~-pqŒl¥�9¤k¾ôc­pkNï3 vá3Kɺí˜! °`ÑÐW˼+D6Ó•.rUZðA±(r Š‹«Š¥’†È·N×ÂR¡ÎÊRŸnr_EJÏᜃ¢½Pö ô3Ó?†qˆÂ�ù�‡¶Ÿ Ë gê|+…Ã:_�ßœ.CÜòò8O Üí…AûûÛ͈oíwXé’ *É…_‰ö�?fÀNjâã¾+/»mähF·’SÌâKtþ¢¬Aìa„Þ׿\HVK7�:4�V:0p *‚9~ƒQ{'1÷ŽÃå4§ ŠÛì´àП™h\Ó{VghèbÈUBKNÛ;wŽL&ŒW5‹VÓœqfêo؉Â$ÑÌâÅIºg)ªlRöµ1#.‰vìa73€²Pç?:ò/ð‰W—{&ÎA/Ã{´Y¬VˆX�-µD‚ø®¹M”`ÇnU»©ˆo¬>ÈÛìÄÐDT�KÒâH�M‡DV‚ÙÄ2ù`dGñóªÃBÿ>‡¡Ð4®ÈtŸ„‹F©uÿŸœ‰ˆr¦#Ž¢{=”N�‰óh>óó¿Lb5£ÄáMÈ~k£aDÓû2 Û¡c“£NU‹6æÿu²’ÜÇûØhqáB†.$F¿Ç�¦KFH¸}tc9Ž¿ÊÀžö"RUÕV&ÔtÅ ŽYñš^cl v{?SðgÐ�*ã4Š6ûŽz¸½a¢Þ‘4õ'O Äj¡ÖoþÛVÈЋrÊ…¸ydâ`°gy× T|]7¾Æ>¢�Ís#êÎçɨd›Nl×:Û÷z/é ½PƒPlcùùs�œŸmYÓx&n15ܨy#Œ3-ã€Ñ(´m£�Pã•X°³R’6Ä bK,2RØp1•:�O`WÄØm;‘!BÅ¡HŸLîO lü^Ü‚(‰Ì“AÙëòµNa¦îsaÂj¸7Ç�ïe0YŠ"©©„;T3ƒçLuW/š"Eù^ŒÌT–ùdÎPË<‡a�$�›ã©ÁÁG¹!Ç`K‡(m`¸Qe¦…†¤ÔVD×y´12¨ áUJ®,Öæ¹ÉßMãÁ=nÒ*°'3÷2‚gF‹Õ[ŠúMÄ™¤ÀÔç“ÚÝÿøù€µ$¥jÚIžž—|ƒ­ù™™CÃáèg䔵–d¨‹Z²rŠSÊnŽ|ZXp�mòvrKOªC“˜äâ'“tnG¦ ‹Ë¾ãb°í»�F›²È탌ï"Ê Ÿ1 ž *„½ýÇÉTDà a·q€;fè,W¤L 2Oö´1ëý«î;�œ\¬ÞÏ>•Ü?Í;m,Îð…?1¯H ;–¥€Ýµpsq"�ï¢"¢wvwúœcBï²+”2 ÿ(9ZÄVR kµÁp7źÄjLøB;€‹l]¼;Ö°Ýqá¹±)qR„ü¾åo wm ëf`³môYÍð ’øy‚®˜×ÆÀq0 VZ:ëMÛÐTj#8O‡ÃèÆtýoŃ%iBY"2ƆhXØKPSÀ01\ÙP–]Ùôb³ª§k—ÿܨçn€Ëa—ˆšEãØpÐ81¨lû.’~ߘ٭ÇnH…Àœb·då¸s‚à3f0`]ÙQû„y3!vvóä¨89ä­AI(–l²,1e熔حڸ8Hï�cެy¾d*2¸îÄ;‹%áê:Eä/»@î2\[{Àd­}‚ÚèÇ{­Z5<È2S['ØS¦Ã³ï€„Ýö¤-#epe5¼;†a}Ö†˜èQ‹Ø¸Ö¤Ý1ö�<¬�³•†#L¡ÒÓl´†a8ñŸÙ凊Β3.H¡RÄ$f+jþY¤ \�õ³<ájç °Cž¯ ñ½ÒHû’6 Þøa±båm%ù¥5 AvȨ_ý êR9œRòiv6p!Ëh¥S ãr}qj™æ¯mº‚Ñ1„WHM$¬IæãzHs'-%ß›gr2)4ÓHêjð[›–�˜Mf²�ÒÀ´€òVÚÎÃ|´Œ�R[¾Æ ä°$G~û´RÙñɪS!gVr¾‘»ßžò…¨½ È¢¤º”…{ÝЮI$mys™�ì¦&SY»l„H0¦c&¯ŸìÀÑòo±ÞOÃwâ�‹ZåãäÜ[d“+ãêÚ•/¿"ÿüI£]ùÂz̤w8,t”‹áÎá…-’ÌI¢ã< Z¦ˆÔ˜0\/7HI£aª¢#)ЗI�ìf™±X�‡�¥æO`re.sܬy»ü&ãÛ*:0Í: ©Ár[IWCÚ”(Ø~s–î´m¨í(i™ÝXÔ7çñްˆ›Ã¾h8 '‹£ ¥Nü)R�blÆKöT‰:ÑÎ[)»{‹+ü"äø¨wPÌÁc çØÎÎ�«S¶•ݸB÷~Û í­“)zÁ}íÿü7ìe¢¸l_»8àÆN„"Fj>~æòÇU•VOosˉÌ$Ál¦qÕI¢Ò¾ú¯²Z?–a4ƒ«ZŸÍÏP±ˆ·�ë¯ÆÖ¾™›Zß;îlz鬘çÝyƒÃÊÒl ®Ý;…Ðþ˜‚è[ø»ÄÂ=s>½æÅG:eíÒ£Ì05Ú!®qÉ,mûRÆ œqpá¨J¤pPLá2-}æ&ÞØ‚içËfD&æ0G~-¼éDâ§ú‚gìŽmS"Ïe–¦ œMÙ†,oc¡IÊbí9=½ÌŸžÜ$ži¡ÄŠ¢ã„P­â;�8 ´´Ç#ÄìBCB^÷ùó`‡SÒ;¦WÌñz eK;‘즦A P¦4u�!¸`4!¥‘Uí;º1d™ © ú[ýƒ'%s(¬GF>¿Xã`õnQ¾Üï§n­vQu'ƒk´KšŽæäFŠøÒG™7§+Ãé¡©¬èîò3Y"ªey»!0ÐCóÚæïÌ2tR1Ö�nÆ’G>4ãÇg^Ã~_®8“»¬’¸=f4v)&‡!·ÞkÄq�>7”üu‡Ê’«ÄgÕx4Cï„6Ë�ÛÍQÔ»¥JïZ¿'ÊÐòÇȤ嘪a!&Bws]K¢þFÌá øuߦ¦Kˆ¥ñpEÅI0Ä0#_[`Ðg ‹ÉÒ�ƒÚÜå1]ps Œ¯¶^Ø´ènè£8B(ou\ƒi1=Vé–VRø&äcÚÖÞÊÙ_Ä¡¨‘6yýB9äõ4K"ݯ×ÐÇ6þe¤Rîª)Íȸb3šDùŸ+Â"JP—ŽwKQäGiûkTɨ¹!¡�.¹ºxm’CMᘣ=§uŽ©A<˜¸ëlg l•eFÄ·¬èëJUýÆ�€Y„ie~“ÐÀ9ÃVV@ÿÇn*°ä„±lrý¾SL:ØÈDZß÷!Ç�0‚ž§ë’ôf“•à¡2Óôî]—É«m¾ÕÊ$ÞjWìtœÜå €öÕÙe<ÍŽ7™·UËÓ’“,P³Žý¬‘�kiØ &#¹ã8J±Z�arä1ØË ¢·'(Ùl !¬XÁcÄÈÌ•F'‚—eWU({bpÌò0.ëîgh0 ”[Óõ{.žaå€dñÈy�öx­“1Б=Í|é¨E�$³¢y wä,FßB+í,&”›nO“¢ž“‘Ù,s!»Ñ+-_uöÞ|÷#¼Àý¡”™ïƒ,Àïý ¶�#§¤fCbF•·á#óYquû¦ÖЭ\÷ó4?wgæý¶kƒ4ë�Ñ?gpË!ÈÚ48W0Å,À{níi@ZÉ›b‹¨dÅA?Üçƒe¼àioÿÃWí43v:TÆ;“rï³mG5~4Zõ“,4bþ²I–±ŽPNÙV}º³‹Ž'Õ° Ÿ·ñLkwŸÀœ Æ/¢GD§‚R<º™àƒgG¨>sŒÉœß5=žwé Ìçè$ÇG˜°þ(íZ!O¿„¥N—XN!(”dÛ(©Þdòã¢Mó¢PYe�R¯¬�/FFlA¿T§Žjõ†Ôn@�ù{î`�»ºn;JäêÞˆ³ÔëL»í\r~©áxÅ">ùìF±óóš§3”Ú·ï –e³ø w“¯ œ©LÒonRÔÏŽ„ªq 7-ß&¸ø ýç\.ô6,%eÐ?Ê“ÜcšKì„ÚÃØós<¨QC®ž!µÙç0ÍP„ØŒä' \fÅØ9ZÜK�ìÃÖ.°LªIÐH !»pø.&}Ð4a DÀ’{æe»qÒÙÄŠU‰c1©9$êHynB™ƒàæømtä„êŠèçrŽÜs‹,FÕÎjNZÓÜ{ çOö¸Í ª­ Ž4–pÝŠ­ì°©žHŽÜ;@ç¶h²Y9{D ÎIžÆ>^¢�Ki^æÚ Òý³^¸¹{ˆ–÷‹Oe�IÈUýVkältió¢‘CÑjÀø!#¸=ÕÌËÛMš÷•ùSIJöŸI š®»Q¦†=à”yf“Z°æaH†FüôÜ ;íwòüdríöpý”Ý_¢ ¸%9¼ço\Gà@wÏZ«ŒyÅ6æºKîAýûþc±cúƒZ%åÓ(ŒW…A_s÷M^sÿ _Û}O¤ž“øÉܘ<ä@ƒîÛ9f¾´N[U'½ea˜azÆ»¢dÃMðµzŠºKƒFÎßËJ´›;‡cĉýotÅÆáÂÛ „…°1µùÇÃÎ'+�ÿZâxDM9ËÕ{:ä¢+«�,ø,J‰K¾¶q"ü=b±•rö»W‚ªµd&]=sg&[–â×®'\ÅS}ÚÌNûö”÷}ç¤R5„_ÃD?tÀ<°lqWÐMÂ6€G`äÕá%-ˆ²Â]m—eÊë,I›ª&õ·3/HŽ­³½c8Â2o«Žòõ ðCA¶ƒñ6f Ï5Õ JUÛ°¼h$Æ%x=4uÎ\ÝŽW�Ãå9Î_¦+ão¼Õ…2–“Çoï'¤üé&øÃŒîÔnƒFøî ÈÙçdì€ 8`£c^‹îÒ—]~Š+ÿ<ÖFRõ÷%döaj �输Û�6vx»©ÝOgŽm¢¸”W#o߸�³+®ûææ8žÆùãªÕîcl®"î”Í×ì-aˆ2Ž º¢–DyÚvj÷°Ü²)ÆK|G°U¡>jl©^sĉŠß’ôÉŠ&U›�Ò¹d-g{ÍêJ"ÐR&œÀü%‰Az¾~l ï¨2[­¬¤Ð„f»Á„b48P1â—]5§ô«ù’#¡¦Ý�žÄ.#ûƒ§ h PD×wN·`é¿�q›ŒÍaØ»óøÇõóüó ü–³~ßQ4¡ns‡”!ØV§¥ 0ä!ÇØ9 ‰pV¢<}î=ùÓ6ì¨ä †'“h0åC‚J%É~•âô„„!‡¨‹²>(�?çài5 \ÏaˆÙx9÷¨­~¹fy]àáúí¼þRäz]¾ Hö†^ÿ}tÏ/s±Á$d0#–~Ã…»“p°È›1Á„ e@£"óœÔ508"g.—)¢*!�":¯�–œ|+Bç ›&ÎÅÄb1èÁDƒ”ôॖmìWÅâîðí˜ ©úÇ!Ò¿Ù¶gí#'£ÁNöX_=¢öË|Ò mIÍ%¸GÊÏc‡To–…êvl&h*×6pöæ÷ÿ©Û’.ðÿ]}ðìsv€GØ›„ø‚T™Cœó÷ädfñ(1Üûóò±õ9j1¨…ps‚«Èww–¦Œ„@zQAý¬··7ÂþÓÍ =#áû .ÒÍ÷—oÁ:å䌜3ÉÈv�Ù7o=UÛdvYϰÐF¯Èd>ÝàC°ÊŸgúÁg3ž¯ˆä×F$KçÿB8,uÎH(½âÝÛ„+\ŽàŒ�»ö{”®k„çª+ŽÛ©À^ÙÏü!…Dê.ú|Åøàø6:Ýèä›$³±Z‰ùÄÎóƒ8/—I{E+Ë;=Ž)8Õ`› �gË—|œ§Û>hAj“¾Œž*õsÐ~ «g àrB‚ £Âí½›*�8² âÊHŠ›nÊ8¹Ð°/>™\ (aöö¹Ô”€TÃy 8üSötC¬6Èù³za®pà‰è÷­X$¹ì&bñu¥ëÇS/¤^I¢µåE8”¯_{-ìÅím)µ…pÈ#¸†9jBRP·×MBõ= œß€«!„¼øq–'Ë–½ÿÝ;Í­_�Á±W°·çrmâÈáažk¾ã˜™«˜?xÈ¥…GQqÄM �Ù¹â.Œ•$f¢ozÀ\Ãjñø½SUXhNEù+š£!Ÿ k§—�ŠÍ³KNÚ1µ)ÞDÅLJŠÔ9*[’±lôŽÎhe¿_r;ÍðV WøE³lPu»I‘ÐÍê^…›„`åj#AÀÞ¬ìÎó33ò îDs'—¡û¼›"—oñ|¨—SâMöŸ{#Ÿ;]S#·×E@K(€‡«ˆ^4†–ÇÏ  ýÆmÕÛ2ÔŠ5&?ÈRO€¡ÄÍÚ0T›Cö‚ª“­[ö+öò1•Ÿ¬=àO|ûxïËfDùÞBq\˜_> wgAJK| gö^ÑW‡”–a®Ñ]Á2Í.¨1Zù³fÑ—k&4f"+�qîÌ;ŠíZÓP¥öÓ«ÀK #l—_wD½Žoޝ;¸¡°b'›?ØZ總åÁç™.þÙ+:AÜ4^<:�f0­�Sß™I]ýOЈ0Ü¿Ðɶ Ž-ŠÇS¹Ô/ÙRYEn&�nV/Í•$"R4@g€+Kc¿r-B~NFsP#ÁDìíW† ßyïa¿^—°AÏuCÏ `kî ñyY ¥;&ÂÑ%¬I ’ÿx$3lãŽ8.~ÜÕv=pž’¼‡Â5r±=¤5( tL<ücÅãö,¹ÍydŸy€ë­N$}à ×°íúsj<*Ù\9�•Ï$J UCðzâlŽÀoÕÁ–8èñ·nHsÔ9Â,<tP瓃Š{3ìHñF6Bˆ ÌØ8~píÞj"Ì/1C£Šá»â<ȸÙÌ›.Ê,Í]BîÅ´bÓó½Íˆ�¿CìI¸‡dÚq~ºŽt?Ò›ÜZNÕXAšIÙ0<:'j6V²�»�fÓ»î„pÅÅåûj­ÙÃ" ‹H¡ËÙî–ã`U&†ûXî>úß`IŒ‚M×à‘á«e\Emº´#å-Q‡ 1Y±À)¦øßÈ`Å>]„w{Þk àhß´™×¼�‹±Ìù츖Vó{¦ÍÈ0t¼âm#s(ö«» Fyµ<ø\ï–q® 0÷œd\8Ho¶ ÑVaµuëxɦchjÅÑSùkëÝn’Iº7Š­¼ÙxWãé¬> *x@=,ÃÒvvúL%º=�§«E6¸‘ªrt9×Q 2‹cGZ†u²,Ç;§Pzë[ &n‘[òM‚\[åÚ*]×ü˜]ÞùArð¡áD�ŒIÄè@×±CÎ.C&Ž €A‘ö4ÃSÛfÓDÛO Á²�¤ˆe¼Sáà•¦ óÁÁÞ¿ÊH.^‡X1†º0s̲fbJ÷qVw²€ÆEÙ\Î(ƶæ Õâci+E�ôJ=ƒ*3¤‰î˜t–hEÍÅòÓ|C÷‹S©Då—qÑœ½”É'Í`ßGÖ1ùÔ1�äÂõÌçZñœS›Êá;¢�?�øš{ŸçJ~«˜sïUùNSèÅIóñâk…ç<2"³åŒ3‡Ï8«|èZë.EPõícçDŸž,Úd9×Ù{;ÈÁ>‹’¢l–™�˜ ÐßíþöŸ!kë¯;¸Lä_ï•Üe…¿mÈh,EÏ�„¶lIã˜BØ€ µª>p_ûº†ægáÀ'Wy|Ð~jàÊê»ÔÈ644v« 'Ò ¢…1„ùù_zÿ}µŸ¾¥Žóá´`—<ßǘ=}ò†‹#ç½ûNóÓNdeƧ/¹¢¡Ô¶!ž¶¼©�Ñ'yšÅÏ-„.`�ñ¶¾; ¥*6§$„“šf�×bh5Ó?:ju©ÁiÞRCÓÈw¤ÓM�¡ò.´ÕÚ1y Ã=±±_�Úº’a’. ìy¯CÀ´w©H <,AAg„Èh&4ä*Ì1¸O”µÑ¼äçP$p*቎^ÈI~pl–T£›2bR L¤  ZŠÈûÂkÃã÷�³ZÒ˜ªó¬,Þæzë͸A·�>1Übû:¢öa£êtŠãªženø•æó„ÇÈEl1Lâà˜`$—­a·Åúv[-1@•¥ˆÐ'v‚–ƒ'¢þtÀTUfB %"tK£¼ôÅ[Bç£$ÎÆƒ †qJ%bÀŠÙ-èryõFp†ÐpóåZ™TäNK–þ›áù‚Tù£Àb2ø'û;"vò–�7Ák,ÕÏGÈ¿§{À«ÿm* T97ñþÞB’îÇ\$9t–BH2v„fevG£/å¥Ñ¯[Íìå�?=@^6¸r¡ìÛ‡+ì0:û>Ê}ºå�óýDB/eØÎyl64Éh/)–�m”ø•,%,#‚Cc$_šk­Äì2w÷Á¾ÃôíjžÎCbå½Àð÷W}#&äx y  È;T<Úxwº?Š¡4ßÈ ŸðZ¤T½ÊALh‘öă в¯Y1ŒVçÙX>áeùôÖüú}�‡ãû÷E«âWªQ¿¹ øglcÅx´JaüÜ9À‰UûØHTóm-G0©2² ÉdD÷1UfeL’)‹^YÆŽeÈK5Ç©‘¡ä™‚êý6€&ØÇÊ6OôEÍ«™u+1RcB®¸‰èòbõj¥Q‰J3ÁK�Ý‚b¬ª°0f �ÒºP?0æn Ç›œOÛê1Ú+`Ýg<Ò©rï;fXR܉ê¾äòr¦¢BC�íB+TåFðÍî8rÜÙS Ü\jç0¡šÈÚËo"öqázœ‹ð­²ÿ~æEÐZ!ÇEµ¡ÒøeÆô06ŠMµÍ±*®ÏeÙ%º ¢÷ ð/c^Ù.ß0ºŽo;ÊAÈÀû/�žš!Á! ÀòqZ-�2‹1fŒH´Å¤uÅ B¥A7.Ðó¢y¢-[%�)­ÊÒ›èM†g¡¼ju«ÙAå¿5÷))Jý œ“\SîŒ#àï Îxª+/û÷òܬé·iºDþŠG‡™æ—9=j´ÅIÎÅ7$³þØaFñ¢P€†Ð½L¯ƒ7°%7‹ˆ6>�ò’óP‘¨h60Y˜ž!½øiÌ!îÍ™³rÊ\&¦åp�´u¿0ÌëÔè^E\ÿt÷€/}ä¹Ò§ƒj ÑÑ�4û‚•®c®G0°oh/ý"µrÓ�êoTÿ«âE�|[eà žàÌRZâù¾?˜Ä½²Zÿ»(Z Æô†¨�Øåjd@Ú±�ƒ¥ìA­TpA¿åÎÌŽA‡ìçúib� *ÿIîÊ8�‘®&Oó‡BƒS‹=Ôå‡Û³É(ö“#�3•ï�áÂ�Éï¿ÓÑ ` ‡mÿÉÈ�Ü‹R¼í ã &Ct+ÜgÁ�‹›‘%"h þI±9¹áìØ{¿°ùy��Z‹ˆŠK7þ˜“K™øSŽ2 É�5+ùÂÖzèİ”ÛØŒürRj5Ìò¢Ç�?ÃkCóß„6ž¢„”¸Ü©ÍÇ2Vt¾=é£\R6ÔVxµžÌÚ Aµö³emû äΊá¿ÎÎ’¿"‰Ixàêƒ}.cÉÆ€H+žú†œ².¸ââþµÀ†IõÞç �YUa¢2ùÿ[¢Äƒ{ïs)\?BJ¼LÇh0mpÁúróY]”Û>KM¾»ÌÛ^+yÀ®n�}u×>õåxÏ£cÛØçÞ±û`À‘°à@wüÑ.­[AËE.µ§8ö´îÀ¦,uÔ‹4YÌf± AfUôœoI‰ü€Ë˜å‹'øŒ¥yÆŒ`Ê.výÔð (pA~Î2»Þ†YGa¬a†Ïer¬Ø[!‘,úÎN±+­S¶ŽOA*Èø]¸yØÐîËX:<ÙeÁ¨ µ—Êh‘._Ü ÙV&’X¬ FO¸ËÄÍf7Â,ãKv8阻µC`ží©É_|Üt!vÊnýÜk£0÷¨šÇ™£ƒ\sˆ¦"#�—^ó—¼cR™)Î�׆=ù“ÑÑ.fÙÛ‰Ö`ÍTOl/)/;¸° W6Ì0`<ú½è´ %•@ÐÖëIv!'.�OpÓ'F¥\xMƒô,�âèŒ?å�? ¶} 8 ~-â8R…mç–Ôp8•:_üf¼4Ü^¹!µ5çQZUɽ8æE‡tASsŽ&Se¿E'g|#Sv·Ã ËÈ2Ï7í�”Û—66Hž§vL^é¬ ›Ö^ºD)Mè¨ðñl?›ë*\àÒÏæÈ�VK­ñŒ%m±íб«à”›IŠ&O*ðó\ó‘ÈŠX 4ºR(:tS½È› s/• q:†Ìh’ç¤�ùW�dç�—Ûó.Š—F„ßòuûöÕ~¾[mù½)*¸}éAÉ•è„5û´ŒÒ¸»AfW‹ÿ¸pÅÿþœ¼¥ç\ýÞMdÏáEþ¿h8ñ-G²÷œ|jÜ–ö:çj i{gçò}'ôyù’æ)È÷ÇWHcÄÒ30aG°È0ièö<5àÁ~Žâ= OýÌÿÖ”`Ðî?@hV x Ûqÿ|}Ðn¿†ôx{ÿ­Xù¶—…{ܾù9ü·æl�ó³çÿ:–¼#;Ü߃û8xIø%z÷å%ˆ±Á¼: ­H�äyÁ÷èv5`(ÿY»â›Ž]²Ö¾ò·òÿœ[™Ÿ�'€¹cüþQøùûù�|�¦ˆ™Åûg²@âLöçâyt<‹òø;z=¹/ûÒò ˆ¿ãˆ>Æ$#FŽ ëò;•…ó#ŽÉ, þc+WXu”~l�¾»ÛàùòÐã™™àñçÙT=o€ý 9@C^Ý¢ó&|ýüìÚ JUay�ÿûø÷�ø>EÁ~¡�vôÀíáM�F$΃?MÄ®à0d0Ã~ C,0)¨TÐ]5˜ç ´XïÁø3#6"Ø*�ÙúÈ£kÒ°èA�Ôøkû°SÃwòDxõ®Ãͼ†mÿ Ÿ[‘žÞEÇ]ö9ÜXp~î†a�pÜð1¼¶}±Î�ð[ýó\òjô~‰À±c'©b´vË•˜P�äÙœC�RƒqbS¯AØxºÃ‰@UEúp¿R?ó?¶™íߊ«Ïòµ´Ÿol†ê¡)7® ± ZD/óËSàÜý¼¼ÖêüÓåu³ZÂKngÛ©L^³§n–\õœÆ2u4'GÅÂ탖õ+2ûE‹µhj`,ê9 äÜ/anû}5Òo‹›íÛQÛëÍ=Çw‘ŠxB�£Öo[ËǎZ.÷æøÛŸ“u�3ëÎDlN·}Úõ �È™ 55å›2pE %&Óò¥î¨zÓâS84Gp£‹%Ft½âøOVÙÊ9þIºÈÒ.‹ƒgïNb’·çUF47vŽ\ÚV¨Ôʽ}®œ‹2ÙK²¼&! áLò¤Ky_4 ÌžHò›Î˜aŠ™S8%�]’O5l(­ࡵ´d~p÷¡èiQØ�“z {“—ãg%ÉÒ+;#²÷rÏ8ÍUGí­\hÈ&™tf¯ƒ–èž\•P�}ìö^cDº ï}N«'ØÓÞò1�M¶m뱉�rÎæ=¤í¶÷ßÐñÇØ:f|Åü“«ÕMp¥Áh²KYña冮mUÜ­îX…]$µ Þ[ê’kÔOÕ‰,kGyÒãåożÞÑŽwÇœ\O·•NQ£Œ¾nFU)„‰…|jbä ùŸ‰*)bÊ—ÍIK¦ ¢5*·™»í=…¦(Ÿ°9ŽdQz‘s»Î;‚9ÚUɲt��jÖ‚Õ#ºéæW~Lã—B†â]„+¼W¦õÛ…©vøß=ÁíZäc5ìŽ}Uí2‡Ï•FdòXá?‚ŸÈi1óJ±£'â¬�‚ºÄžMˆÛ×\³�ݧö}Íú^ÛYÀõ­»oò?7Y¯åY­çš§ª]SQW¯ÄÍÚ¹F ·sTW\çw‹Ê­Û773C8”ÖÛY27"Ê®ž¼) ÍÌîÕŒO4JL®‡Ôláp¦KRf̸ôšŸ2WU•Žó úObá ®E0r¸4EfÊ⑊AðæîÀµ8U_<°ÔÖœ»*ß7 į’âl‹ØŽIž4x~%0‚„“üõÒIZÏÃÞ½¤íù¯ŽÉGV¨ƒo+Z4å͜Ҧ˜ã’äW+îúÌÚ©'ͧ¥®c,È€øEòT·™D’Ëb&Y!e‘‰jªàtŸß?.7$ïÇKì›'§ Bä `äfX[Do‚D¤)¢0• �ÌôÖ¾Ž?…ŽüËÖ/ðQôXÈʬÇ`\O[P!Ðù��ýúXí˜u`i·‰fÌ"E K�ðu³¸9m;0 &*`Ï[ðÃŒÿäAéµü`ÃÅ9;R0ƒe�š frÎ\Nâú,È1ÃÈ"k„Šì`þæä¥8w …¾‘IËÎÀ.À±X'œ6�®m@3ÅÙãê?I½Zò ^Ù�§eÙ…±Œ±ÚØLœ.Ò`°p)Yöª­Ú•³ o6î)ÉÍ«MÙuJ§ÃÒ2i“z6¼]œê¶öf±ÃµQÀ^in:Ãx‚Âðkdø;Š·Ø‘ô�Ñ7·éÛˆÌÐ�:¶k°>øHå¥x.//Ñ€ Zú°à:ŠLé8Ñ‘£ *z:9rÝ?1C¦Ð¥¦ÉîYÏ“B2›?ÃÆuÙHy1Á¦™#«ýfê_2;Ę�[»Tä£û:E÷o~`{V›ÛbZ· $ßxÙú&ô×\;ê#=6�™ÌôÃ�ÊŽ¿Š÷ñ«±>Åïì8ÿö*Wð¹àobKæ÷=šåÇÕJ3fÜyË·bÙïJy“)-øß?È<¤¼,çúÿ^PÅÜŒÊ0c2ƦĄ4ún<§üJ¨[ñͽîVéýcµò_ ¾^ oX„Ù«²ZP½GÇ®˜> _ÎŒ.wƒšøa› 2` _8‚õHääµ�ü ƒ‘î<2œšCÃ8åæ×GÌ EdJiÖ\.*"ÊΘ2â%Ÿmç“§µ,´¹GÃQ[™çrÅÀkÓsQàà×™�ì±5`áo{ð‹M^LJÜ3*‘H˜RãBá®=°™·Ä�Ø3�’·€¦ãÁrÆn[¸(Êܘ#R[(ÓŽ à H‰ZÒa&&~QS¿´ÄÊ®0HľLúC²qAPÑ©˜ s¤p"R©Œ‰Ri¿!1ÉÎ MÓÍ‹ÓPÁß4Ê»<¢Â~š;¾ûrPJE9Sú›Ò+Ä<¦³îLUΧ|¬õ,9‚v¶ö`Pÿ›úœlÿB/´ù- wz¨å©ò=Bብþ#�òÖWö®+í}3àggdl,cjLJw8¹ÊàÕkÊU…¬òT(Du¸®è�Œ²dã0“Ø÷Új¹fpð•›Om¬)µ¬³±$R¦È‰—,†³~tù:xÚ¹”Œ¬îÎŽËD-øs„Í\h\¹dö¿$A°èÇdšÐ8]?�/†¥^€y£ÎÎ4bem]JÁûœœ†ŒÒ§%ÜOí?Ì»¡2CtNž)64[‡8½—ÐÉ|d~�´"Íhú°Lr¶Äö³ÇàNÕ"£õÌÌ)C›+óÎA\kT XH|pnlá€ÖÜA�ëW·žÖѬrðÈ £T$¾ÜÆñZ6ž ÞËÇ×—Û¹„ª"äãxÅ‘u�Ú½¾òK¦L­­W«�rΦ_5U—wºµõ9XgZöãÌÆ Á]Ã:� u^ȬWa7u4Õî^’‚«¼ã«o-Üë�;—Hç_IXºØuR® ™š' ¼¡uè «B…WCX²«JáÝÒÞáÙæ)/iÉv…Þ]…UVcK7½tPdƒÅ Ì]՞̫.fV¾Ã“Ó·¹nÛ¸m¸6îRLÌ8žé¼·£·CÏÙ74§7xÇ‚hì§ÖëPmè]žÉ�¼užÑ|&wE»WI §Õ^‰S7n1]ÏÙ*îÚ^È)£xÙC™Íx(6ÁÎÆ\©ÛìˆV_îÚ:ïa´»±µt’„„rIk U${báÔNY1ÉAh‹pÈ<*…ÊðèVFº +i|‰—v–çdV]z:ÞÙÕFªûˆàïggZÜÍœ+­öÖ^C¦«"¾Þ7´ÝùÎáÜ¢Þ¾×ÜD¹ÑP·8q]�zºÃ‘‰-hê÷ÖHÞYw²¢X(×hËÜD×H1;¾@ªÉµÍõ¤ºöÆÒ¦Å;®ª>-…ËÃyÐé†dŠPtE1°‰Ó.m×%Þ±Cjglm¼uvÆÊÀû9åu ”òî�l¡\ìARü”§¹}z4Õ%k³ÓhºÅ]ƒ5J}ºî£LJœ;º°º¾Å á}Z˜‰žÕËEnA¥˜pÿñm©Ã~_Ï“�¬ÀÄØLÉUº%iƒVÔÌŽ’n¬NT]‚õ[\5nëîGh3ì)îBÈ×|wk[¥Õ½VöI÷�SÚÈï_k·€0píç VÅàYh¾ÝÅ”ÍíD�^ÎsV,¾Û^ôJd¤W!ŽÓÝ®µ±êY+Ûm±ÑÒkfãîÅŠêùÞÔ–sF ™¸ok•xÆôè=,q·�O`Óc ®w/DËaÓ^ÕvU¼—ƒŽ›¨5×\i ï¥%šÌ¬©\ ÊéWc³›c±é˜v±»ÁÈaK/^¢îbη¹µÕ\*ó´isDW7<Ë]Ï)s·6–Rðð•$I”Z0SHi$V6d’ˆbi" Á0ÉX’Œed0‹(ÙLL˜“2˜RD0H´�ÌPlm#aii&0Y©$Ñ€I(‘bÀLP"¤1 0�š2‚ÉÃ!I2�30E †‰AM‹ÌÒ“2+2J%€ÃÄJDØ�ÈLÀÙIŒÐR ˜ÈŠJ,Q0C$ÊôdÄ¡RI„QŒÌ©À&L„’"b4#K)JbfÆÊ‚(Ä (H¤$ “ 2I1¡…¤Rš3,(Èeš`"†4Ä!$Q`‰0I‚’cÒdQDÒ$¢$ѱ2I BˆŒ ‘I5‚͘ÌY%ŠSIƒdÆÒLÒ¤aJŒ€BŠ4 ’‚LTb”€±h¢,Q%“$™¢€”£ I"¤,dŒ`L)"#(�£˜F$”-( b” 2dÃI¦J†Rˆ#(Äb™Œb˜ÊI €Ê2 f”’ÌY¢2$C1‚bHL& "e ,²F3&¡4ÂM@!±°ƒ&Q²DËd€’TÆ¢ÅÉ H…I!€4j cDÈR1#c˜¢@�)‘£YEFRiBCBLbL1BbË1 XÓ,cÊ,H�CX¤�% 3ˆÄ3Œ”!$¤É¨È$i”¨ eŠ[!flˆ‚! M’XÉŒ CDI`ÆP̲D¢¤ÈÓ “DH�$, ¤I¦Š¡0f� F2ˆhD�‘’&™JE2!@±"�#Db "lfšEdÌÉDd† L˜’d¡¤6-SÌ4 ˜fb’B �ciÆMDŒQ¦L2†"”È"$ 1¨Ñ±�#!1$™°)ƒšbE”D`E„‘�©¥A¢f I�€$3(�’c%“ID£)Fi0Å!I$2‚¤3$B$Ådf!%"01°ÌÅ ÂIE#@‚”Fb ±$É¡�$’ƈ’É2‘Ihƒ"IÆ!”lF,"1€Ô¤I0À¨É4e#€±…4@ddŠ 2 LL"M3&I²!±”"…2 €Œ ƒH”e$4‰™I™ŠF””‘H…™ŒØ„‹$Ù‰RHa CB€A LË%##cfÁŒ€Š 6””Š4%˜D (Á€�bŒ@¡,XÆ¡„�³&I$ÈdŒhL˜¨²"�hˆƒ‰°ÒI�!“ �¦Ê�ÌL ¤L”Ñ ) c,TÊQM& Œ chÂH˜D¦Õµ¯WLصC3r†Šµ™Ó:×W1ÔÖœ2²zºà/«Eb¨;‚Ø*ö!=ÝKBB�V‡G•-Ó]´ñ_ <³…acFo”5UsÇ0h=œúõ›K[±0âé\!Y»Ûy9To…ãbf¼öC ü6“{1×*‹¾“‡. –ä×Ï3¶d®¹Qšš ÚÎ¥£œ3U¸hq8�qÈÑqbˆkŠeåL{›’ÅS·Óª^Õ Ò-]ЭwÄšê9»•åÝ!<:Ô¶V«½°Íq¡Æ £b†]»Ðj‡xîuÊÉT´[*úª×6©P3ŠÓ½wYF³zq«´…±°‡½G’ñÉG‡ ë«åƒ93ÈU5ºøÊÝê”ìíÜ]@ËÄñC3váÚK³j¶,¹‰î$½›ZÙX³ÚûgEMÑ1fm;kºÖ—€ÎíÜ«¬¬Î¼u×qáYwLl5k}^ë3nÈccW΄mS�jºV]]öÕ¾amKܧ[c]ß–P¬cz+ ÉÖ}nuÊ9Ú`>§uÜÉiÒ#E�Ç5œ H®z¯FpAeоC¾§ÄSõÕÔ5¨§‹sU ·“5,‰àZ b™w/H3•sO¼ëeQÇ×Þ庽ѳ»ŸŽ³˜v©ã‘ËY|–Ä!ÞŠèáŽÞf 6#æ°¥ŠÏdôG‚šP9›ºÅFW��2åehði>nèXu'6©�¦ÈÞÅÕS„Ñv-ªHm�ªÁÌ�±2ãßw9Ö×ZÎgÙj‘¬Wƒ(çn ¶»‡'(-–Ïd$A¬Æ`>ÛéÁ3Bº§¬ï ÌÁ�_3%¥kê¬DÊÞ¡æšÙ–(Vb˵íîæŸa¢Öq“5KÈ\ŽrbÑ^Ò2®U@wmE•�)pîšÌÌÇJå8ä·-f Têɹ-Þ®Ûò;m8sǺ¯¢«XÝ‹h[¥‚´?µ™U|&`±“-3¶:™\žñº›¦è`­…r]E Ñ h_]ºY£½Ç3Ý ¢ÑÛåÓÝœš»|lŒx«¥õ‘µYo³MXfõåìèöÎhµÕ€æ0ñÆl¸£Ì­ÑÖê ¼n¹…÷>6y^mõŒ£”�öÚ™^¬¦Žùú‰º”3¶¼}Ò´C‘ðîN¬„h¢:«uC«‰åt±•Ô¯3fÊv/0á¾G­Ù9¶ÅXÅlÖ8ÇSD›0u7¥›¨uïg–+$Pd©8\2Å^Uµ—–fºBl7éžw¯)_eY7z2°VvÖ>t*ð™ �®•ÚÄñg»`¡OÖƒ¡§•Í»•j�6½�³ ˜m`Öùs²uÔA ›U»nÎÔº«eÙ¶4s0žC¦¤8Õ¥’¦{œi¼ÎáxtãMËæ›�IºJ7¯,Ò¹¤hÙ{×]Ëö^^]mhž—ÃŒ0èâ�ÒªxV]u%�ߥã¬ãòáf¼Æøw fŒèê…¶YÙèëëhâ^yWPÂUJZ7´u�«'_–D˃$§,ÂdÊ­„såÔ´Œá¼©“1°sš¾ˆv^�«=VÃÃÊÞë*V]÷cëÂ͘Zœ�ÃÇz´^Mepª•…®ìíÁ˜%}BuW/w-Ng]òÜ�ʶ¡ªµTË ee9¾^´ªÖälquÒ]N4x=]”ÖWŒÎé´t´iÌÓ[‘KYƒ±›Š ÎÃ×¶OD*¹wJ›Û\y×s¬bņ (WèŒ:2û+VdRQÅv£;ÄWi‡6Á›�tX/6•Í‹®—L¶Sä;*¬îAMƒÉjó±„\àõ•šZ šq˜X÷�îœlXܽwfšísnªÓÙÜ68$VHÜ}92Šn+Ú©"¹2¡©Ý6^P¿_j2óiî´ŠU»\W)¼·r¶Å]rª7[‰…°X›8-ÛÞ¬3,£F†-µ)Psìªä/×’tÒÍöî0”Hà˜óU•3¸X<éŠÏB#å•NR§WÍÎw~‚T²fW¼ÖºÁÁG\-ÕáßU‘¢["È~L:šÃÌ´tÕ;yHÜ¥Wæ ¾+.Ê0Ö�z© ©´3´Ué§8Qê’ëŠ}YG/…Ñpv^_fÙ×U—Œ«n“°š/]UÖÙÕ£†ÁÈUL–›Üµ½]Êm…\h>®ck,Èy|@Ž#Xöj2˜ÞÒÞ»Ïs3ªjÑÕ¯²‚\žwÔ–ö…|9‹·Ï¨ÒsÊ/^9“«Øxbª�=î»ë{Û–xÒÈ)·s°u]Ú{»3�õßXQâÉ«ö‹Ýk‡,¨\LTؼ—°6¨{yz˺꡺Uºér11¨3›'o2»³ ²,æN4´ŠTö¸RÎ�ÝÎÛHRKÑv6©u˜¾ÝѾmƒsO.S:RÀª]nÄŸ>¬<Ò�B˜íË�»6…ƒOÍ�쪣B ­Íô”s§n’*v]¿sât,•Ïm,«®y˜¬àíÎW/^½U[¹¢e×7aê9ܱI…¤U¢m \ù_k/ºdÉlæ‰]hð¾î…Ñ{uWÉÝÛ5�Û˺@%Ž_a½Ê¦ùNÕÕföÓîfÞIÝr”èŽMã“nÃâ¡y·ëz"”¤8Tí½¼ë¢Þ>îtÄ‚×q\ã»Zí•×7¥V*×f£C#T>qÖŽ2zz†mð´B®颲¯`±qޱŽó�ïI&hãagJÜ0Ê­9z»4¾W×8—Ü °ðw3�§7y‰îÛžoTç/;Vf:ÁWkÔy‹l®ÇãÚN¶¼÷tbÓ]„Œ¶Û?_"ªòõ2‘�eíð®&ë&çMÝìA¾›y—=º·c¾w·ÛÜmfZËÔ183±Œ‡aá8BP¼BíjËK+zýrSBî1òÉ9q)d¤,Ê[«çmÈëÚy—5¬œIÒ0ëzmÛC1êÊÁÐbTÉÌÛ,ÝB†Ëªç4o:Ò{zD†»P`]YÉÜÁ%�cÍR¶³\ÎØj±ÓíU:˜À÷³);/®€€›ºíÜVù<ŒÝ"‰­¬š¶Òî':×Y3Ø  ó?‡ïÿ3þëþ_þ¤¿ša#ø‘g KËRËÊLRÏîSm³úä妜»S¬^ª©J„s•X€•«R þfúU×e@Mâ¸V‰þÏ]ÿ ޱýEÌSþ·ÜE˜³aÁ1Ù2Ý–6^dî¡é:Ÿ¦2n�ý@‰¾!T'㜩óIÕZñ‘4…Lԩѳ@„2›R|IÚlfœ©†!6‡Ý³9£Æ‹á]1ˆö‘ g¿+h¤"Ï9šd!ÁVPUG�ÅI‘TBŒ¡ÿ3ɬ¡8fÏeku˜G£Éë�îÞnã‚mTÝÄ‚M"Ô1Ù�Qr�ö.DSD&ËÃ!¹0KU-àÆ¸—õ)ȵ² EÎàI6.ˆ$"O‹¦PˆõžÉÅ%˜Ø�¦„ÕŒæöéÛ¡²«­m[ªªB#ãÑÇA�Û¯”®•2ˤT¡Cò2Æí]Ÿ·ìöø?T§ÅjÜÅOšÿ3ú8¨ °î+$Sd*€[¸ÍÊ Tßõ.ë˜Î-œÍËØüÿ^}õþˆüˆjÚ�ÙC‚Ä‘øÿ‚m(Ï÷´n%ŠDGÕyEî¡ñ/,Š�DˆRcWýS±#6ÃÍ8Ée™a¤Èi�¸p?Éd‹n˜áÂU;” ÅZ°ÝiS"´k6ÓÍ—wV?ŠÑ„!òTׯý,³F…Ý4“áîÈšã,š©½Fi7‚E¥ALrb[ø°ê–†\Ó $µÒɱ›¿ŸÚÖV 5Xêì _d¿¹[˜Q¼Æ´Ì˜gµBö3j~–ˆ/@1ž›TI¾º—�°GàÓZM “Zõ•Û«¯‘Y¢J ~¤Yje²á¶ÉˆqÔL^•Mµ¶.0¸î¦’¦ó_Ìu{¼�g4–(Ç H³ä!‹Kkš�y‘ÅónÌÉnÊ-ÐѪBjæ,Ìï0N*|¼æ]ªN³DËiÀTß$DË–ªh¾Ô»ûí¾üóõÁ„=×å_$!7’7fhŒ2âr+£uB][b?q}% ÏÌU⢵¹†ìÚÌÚœk-��‚-šÉ[ˆZºpÚÚª=RAX4ò…Uö7[t?T®µeAR|h\¿Eþ?ûð…_u©X¾ÖY¥L8У±_uTxy7ÙÐi( û»"$$&¢0ËÛ—Jh�‘š éÍ•¢ÝÑ—¸U?øY9;fŒZã5wUï1sLhDCà‡%f‚žêê› 6³Mîaˆ²jø‚Ð|C9ÄÜE å§S6(–÷»¡6�$?S³Uŧk{™™Ž˜É¤k]ÄŒþ.J8×áA‰’¥ù•ôŽ]šë�TÂ,´ƒŠÍQeR) >êíÏÜh“`­YªIšËŽ[g]æuJ¹j7ùQh"µu ›f"åk!·9ëÔf�æš©4 yhL 1?SÛHŒ4í4�Ê‚¦Do÷O^U‡»F¥q5t4‹˜–yt�,zŠƒ/v³«¡RÝ¥F 9ŠDÛ˜õh‚+ÑU»½Æ˜hŒÏ·W_‡i *TÈ#£,×â`¯¿Î*ƒ¤xa‚puÎÌEŒ•‘ Ú�p‡ ØnÊh$Fã�MPI’#©è×==kCiæØ$&ê,€k4#f½íºYZo• âŒü\ÆXá·i2 mzê0i²Ó ´h®�‡,lîÍšMKM·s&rb ̇IÉ<™›Èb©_;Þóʽ¥‘4´FA�ua°o²ø�B©cO`&r}˜�N­¦™Ç„AÄÇ%ÉåC@@Uuú˜üOÛÃ>vðªH„ôÌ”Q,ÀÆ>ˆKSQÌ– 4 `½mA“ ޶¶µBù{77›²¢¢;ƒ€Š8ܲä“÷lÄ&ðJ¥†Ò jÇq¥æÃ‰+×q“ºZå/Wºž–žK¨ZÒ’§ñTt«51‚D¡$ô]çÇòGã¢ö‚M ;ÕKqÒ´IÌüZú¼Px,Ów?ŒOðòÏÕT—Ô*§RQö�¿i“žþÐdS•S|ÃàŒ²jÔ ¢%$–?é 3�ì]«o rÌ_Tc†"ñí#ôlçk³w=Dú›‰3¸d…éÆôÝ îëT´¬á˜âÝý ytŸ]gï¨HÃV’_zúˆH¬=Cõ‘B2ç¤$¹´·iq=óOñ7‰Ú–Äñ�üÍ×9ư”XSF$zº…�O,Ó¾VÈ™èdT>I´5J‚‰ÄÏ΢ͿèÑ @K· Ä%WŠË¯=VBF«‡ËÜÒÒî Å(’Œ,¾R¥;†áî(áeиT�3KÒ)¿ÄžMÓV&¡�Ãu|G:èÂÊË,$¦OÊˈ‰)^@]$UAp$H8-Á1lçE„ƒQO¿—ßjïq!×јñgª„‹bâ$¿Ñ â¹½ÐÃê]9å tZÎ}梽Û���›…µT`ÁPAQE´�;Ó“QÌÆ$² > á’A(�©CS,‹d&ÁMç• †T¾"S3—/-BuAŠÂl‹ @@ %mx~±»Ùf-Ù™û<-‘ÙS 4c�<0S¤�÷®¢º¤ÕÁÙÉÆ3fУ ôÜz98I‚`à=(Z6†‹¥Š!“ ÓËåy3 0Âòª�©‘KíI,‚þ–“Bª? {… ù¬ùý¯VÓézèú˜|äLâ4P…E4¥1­£ŠíLœd!ZM»õ(úòÕáˆì¢ÊÄÛ 70A¦É­TU0¢*!wl žCáqÛª� >Š +4Ñö¤5+(Y¥áô)B1!d2�¢�kEƒ€´´�²!Fx F¹Gm�`I4(D #¶Ý@¸ŸÄTpÈE–U/"¢  ~¦]-¯Bé{öÚ‚¨$¡øÑâ…”QõŸ9~7�@i] Ž.»¯ W„ ü¦'ư¯\@á¡I åÜ{x N½¦_*˜L¾ÔžHY–Iã,’BNL6�$²:" ®TÙ–@K¨‡%çzo3’=ÖYç9K 4ÿ1]7d] 8ŠJ½M´eÃ$’i…‰ Å“nf " ¶�€d$tdˆä,I¢ †@Fe™"LlöC/îመחkð`Ñ$"H®…¨ƒ2I!ŒKaƒ‚ �2Þ÷WåÍX¨„pÎ QÃÒEª„‚¤J¹àkT(°ycŽ 6Óøq.\¬ H¢Á8)Ë/*HDÌ| ,05,Ám#”Ú%tøv=FâÚ0ô¤ƒÁäRYL‚A’‰„ZE!ô“(Gí¨AÕ'¼�­HKepJX!”ÍBÄZM ¯&Ü Åвšði†E$Uê‘ÔRJ|P¬pB•‚‚ÇÕq–ˆhIvÞá� 8~Ф¶g Óì±"ŠÂºcP‘œËbp�% ùéÀ�©Û n03Ý;£j^! �K$:l� |h))X€ØkìÌt6}µdŸY\Ì’Ú?LÉX¢  Qä² Ü<VH|•õN—20 qÿÕ~�È["_i2O(u1' %AÂÒ�BW ¢Q†°Ö )Ëb<4ZfŠÁÁÌeBH8xÑâôCf-À‹> mÉ^,(ÁÚlÒX%”ËL{AjQò”t”˜v††F“ô¦rÂ0B_?&0JŠxM6:€¡+8 ¢g¨b)«Vð¥‹!¾g´ÉÊ ó!³ø]¬K_I›0þJ‰‘Z±‹¦L $¯5J3"!AA†ðˆÑDdËE·1&ÁƒÉ E¤ °Ï†Ò-‚M£Ã�äqZÝ\ „ ¡/‚ ´…#!³¢ÚD0Ðäá�-AæÀ' £ ’É!A¶™g ¬½–!B$’«|ZÔU8Lá–KKaL³éª‚$«¦.º ”ì N!›MËe I(¬tÙrúp;*ІA ‚Xm4±”ƒ©>ÀE�R¶ˆá!ƒƒeD2CA"O)Ì4Úoj " 0X@­!ñ„†J ‘ÉM̈ˆ„ÊøÂÔPÁ0!†Ê@ I„œ;óS^ÕXCa•CK�a"QÂ(‰ÂAš8{RB�áü29¦­Î2 /µ®©Š%“ûK“(ˆ“,rZB’‘!aa ‘' ~À’Hœ¦ÊC%–JX0“Ù ÂÇ$6 á4�ÑÀC)Á^‚=sÎâIÁ,åAl'¸ôEMÒYlä„bÒ 7.0ÂI+(<<*Ÿ)B ¥á1MFN£UÔÕ ,�I"9)œ�‰ÙI†ÂvØŠiám3…‚°H*šd„QL³€ÎÎ4ÀÎa’üøMüM/¤ÿÄÓh[ÖO{ÉPG´k øcÏlÃmÍ%û°õXJJ�¡•˜�?l¬Ww,²Š•-{^w¥fç »¥™¶wYºxŠpž­9íß;q�PŠÚu´ˆÏ^Òxthd«ôÝ©u¡Î¦ü,Öûm¸4G¢)ËpŠ]œŒfˆžZ³îç^Úîëxƒt÷Ÿ9p;aqµØ=bæºÊ•+zë §´7XgXãMÝæØ,‹¡ÜöšÛ¾¾XÆœ·�M»*ÜÌß>Þçl‚ùå• Xgt•€—d#]LPÌí뉫̵[¥xlrQèVEm<oFw{O-Uh—Ø4‚råj‘˜òÞ‹j]qÉÈV’ר+U¶qîé鿬ƒu�ÊZn¹¼Ø>¾¡È.Ù˜ñsÑcr›³œ%X–îÚ ”ªàÜmfXÚ7Æ®îªmuòw\ˆÀ—*ê1N—ÙÆ˜Ú �,öhHSává Êv¤º{{±t‡F™)W4;Fî[;qªÊt2ż¨}¾[½ÛÇ%fè— NºÅ@Eã=ºëj·ÛånÅ[œÝ_s _@ZÊPAmv´éa‚ÒÞÙËÓ|²…‘@š”çz×\‘Î/xUjx2¯Ýí"^<–#öÖ¦K92úh©¬f‹=„;§w,¢—G–êï!ºÞNôç|iÕ¹�«%>»8!ÃCV¶Ø] V…Ö ÊÓ‰»íS¨uQf³vGGxi”0ðÕzê!†: ¿üÅýûNõ蘞Ö\Zšßÿ÷_5jÏ.Œ¹lÛÿŠ×έKõÐÁFIþ3hb?9wŸ´2›k¡‘[·0Ó“ußšóš YÿÌ}c/=åã,gêÙ¼i^—ÞÛ Nÿÿ“RŒ»“ÙÊÝ.ºY/1®Ós‘='<ä!Ç|ÈxÁv9¾´qô_¾õ~/?“Mê5Û]�o®±y»íißXt{ø(ãû˾Sþ…!$üÿ©NЋÛ"={Ÿ÷�Åé°[÷ç…†ÏgéóÏÿØ AJR¸ëo‘¥bÏCÝ.UêC^Rjs½yßüÖ% }?U?vm¡û_7?Ú•ú—ŽŸÔ2(Œ‡¬=6öØwc}¬/ú¤î8cmc~³hÅ… ÷£ÄrVúV¦£ën�Ca“{· ¿æaŒx­ #Ï÷“)þ�yæ�ïNwñÆ/ºwök“Ølårœ`ìÊ/°ßË?é9Ý»#™Wõë�9Uðý kŸl£ é“'žÿD%‘îúùkyíòX�­$£ÝýÆùeÞC}èÔ™úØfQõ~æÎЩob€ Ö“ÇTc^ÿZù1°ê_“Ë Œ÷I/Æ7];mU�F|žÄnùÒÜgÐp§!; ì^!Wo*R§t²Ö‹[1ßz˱dÛ õG-=ôã»wäã#Ñ6‡+F”_Î Rs¡Ïë3œÇÿtµÓ3¾Ü=ÚK[‰.´uÖ—7WãE™Î{¬cmݨ^'2¤á¿íýbÝJtç¹ÊØ<|¬B;nÃW�ԃǥ›é…v4xÀsMa�› dm[rny2ý1JÏ>Êmc+G9®z|ƒbÿýWMIB¿wzW+i³n#VA†šÌ@4Œe" õ@„�i©Ÿ¿9›×Þý´~¼âý«5âv¤fê<ñÜ‘ŠÑÚ™2ÃNÆé*]ÇDÊ­Š]hðÅ,‰'7Ÿ’“€z4:U HbB `¿ÿ¤„Gt’IÉ—fÜqçÒ”ëjëó3jÉ�ë3ÌdÇ-öpØØÛ_£1ñ\rr‹Q9ƒ 7?b6¸~FjaÁ¨œUx®Œ*+ÅA¢þBH„$’I)©¾?×çbÕøŠž# §^#ù5©§•)®¥º�Nb�h††‡ßž4@P-™ißf›Y†Ì›3ÙœÐ0–¼•Ðî$ ÷Ò].yNò}I¡kTÑËO"®-[á³DÃ_Ÿp0øù#ë?Iý.Zh̪¼¨E ¬¢ (5Ùë]kškG¹+Œo%õ?µ�k¯ÎÕ)kü`à9e×â(†#*Ò¤’x¼JD‰¶ôî¡Q�Tâ€Ê6˜Ùà@$�*�mÖ6=zÉJêê`þVC#õœÄöQÓÃÈXª§þ•ì ±9†GA�¶45Ë:©áX™¢žõVQd·TÏSM Œ÷Ê� czÚ ÛW¯O¹râŸfkjYÒh\uÿµœÞµ)�#­Om³«ÿ>{ð…ÙuH½£¢éاV›�¿ßx6¶ª™ÇfÚË5Ý%> µ ÜÊd¡2=’B#>4Ïýžô�ÇgЦØ)ǼõÙŸ<±Ïwåå-7R€’oÖ7® ¶%`„)[€ST¤æô!lX]‚ž@Z)F'ÓøZ‚-qöàÁMjt©ãPÙýƒÍ�š¢ý†zÐ�7éÔv¤Ñ2 ©HRºw ¶Ó;Ñ%¢ ÅÒBÙùå~ßu@Z«»‘$˜XF‡iÝå†.WǽC²2Y$cd�4Džë~oΖp=¢Æ ¨ºV÷¸é`,·AE ó›Sª¡ÿ%ÃÐÓiŽ íÂ70AŠG€ !ëth Œ˜²}Ô�æQF 1 ! ¡ù$€/„�! I È’ÿÔ�! ’@«Þž'óýOïâ<~ë¿·öú˜ã¸{{¿¿žäîòÞ8â;mªœ,îìÿ™³ÞùÉ?ßlÍü3×ú.G†ß×þóä‹–£‚‰wºŒO}šL‹/¼7�˜ç“óž/ÛÔfpÙ?ƒÝ�ãF|V·ßsLj�hN"wÄh¶Lüå¶âŠ"ÛÜäŸâså2wg{ Ãîì8g4ø”Ùf”ôoxwæI¢¬ÇŽ—Á> wŠUµÚ®ùí©ÚöþŽ:È2û? úQãmcbTíŽã|¿Îóê²¿ÇøÏ ù³°þ”QÚHN?¿üPJR‡œw¼GkN»Ú?ŒóÞß&\íô¤;\›û5KöÆ;ëÛ×àw³a=šî¡ûýó��ðkÎ6§œ�Mìï'öÙ{u݃mî¾é¹z§D¥›µ×ëÇŒ‚ƒßÑ�G)¨ùìùóÔÛ…Ï‚ó�Ý»sþì¾{°‡ÃûëžÛóN:ç^|/•À7û¨x/_y}üˆ^{ëó^¬þÒ…1wï?¥‹Î ¿^5|–ß9ö‘�œ%"”éµñx÷)üó_zçë«¢>|CÒßn¬­ÞPÓÝÝ®_«úË*V'7¶V¿¸ùò1“^á�0ñËg&ü,—W¿ûmf›u=ÇÂî͉:Ý„’ã~ÿ��‰ï·œÞÛÝ-,ÖÍﻼ›ÛÌù¬üBNŽº'·£_ô‡·¢«µüÁÇöß=ü8ð×ïH0ßœó/ÇäµYÓî^FlÅÎ�ñ·¯Øºþ\¶âcrÓÖÜqÚ^¾q¿>Wß=é§e’¹{Ú’\´í„ ±»‚¬íÚ½½®¼ož=»iWeþ%ã¹=#½z®ŽÑwˆll d¤ïä¦ò±t‘¤„O?IÈ1ñ¢×æ5†2q�‰ežx+?`Oóã½n5^ÿÕ¿Üí[çÛ‡g-Øvž +÷ÇS¿sšãñì�~Éå~ ~Ùr[ìu‡~‘oã}°ÄLÇE ~,Ñ…–#?x[Üow :-ÂVF´I¨Ö­Î`Ùÿ2ž„ (3ÖíÁª>’QDBŽî’¿þ$ }+¿Ý7Ø!Ûizút¥F­µÛ*æÕˆÓ½¬yq¾ñM”�\ÓjoÓζU*Å–z1(R¨ªwˆÕ2§Õ<°•TüÉ{>ÏOÝ'¦ûV�V¿–��bz8°-�%óѦÒvnÀ¡îœ ¥D4!T/sê¿@—(H‘ˆÿÄ��òÖñwL`LJ"?{AÉX*ÿxq;q÷ë£DÌ\£®šRSe& Ú³FA”�Ú6PÅA¥A¡¥Ì!¹dI4Q‡æ Å ûÌMbLI¦Ží% ˆbFDš [?›þž•3%[ÜPD»¿Ë ÀÑ5ßë)<>Á�ï#\î©/¥]mñUo¥6øÎ›ŸÜÞíqm%½|Òz«ËΣn’•½]µÓ-3^Þ~óä—½{$¢ØÞµxÚóHÃØ5ì’! WñÜíúÛmþ,tz=&ìüÖå­‹�yÐá±�‚ccbLd¹5nŠðkb÷óµÛÃLE›î�këí#Í|-íìRÙa£×]GzêÞ�ð{Š ŠÌ®!òC± °Õ¦Q¡ –ì!‚‚¸Iÿí,¹Ã¿æôì©íBV)·ªÏóh&òÓ‰ E‡'¡ºGbupÔÞÍÒQq§2¥¨>½bÒ_ �Pê²D„ /G¤Ò”¬ƒ~J4˜ß›š¢ãôµ­a¯4XÆë|ò=‘ò"'`T}߃éµTV£jKÑy®BP±[²ƒQãHNaý‘÷Ô/®´àܵ/IŠ öwŒâߌ‹fñ¨ûÏ=jøQ£ß~6ä,¸l0ÎìºE~I÷#óâ*t¹ZoÒ<zÍ}+×1VϯŸ‰±1ƸŸæo/”r9ïä‰ !¬¶¯úøôš%dX=¡"ñr—q @ÊÁVŒ$„GdTüBé Øûûµˆ=>Ãö½Ñê*ÜúÌK>ž?hÞ]¡y&ÇùÐÐᢠCNçA¡u ÍYº_Q¨Tâ¢î€I#¿Ÿ‘ÛÏÿ/ûÇ•×ç÷z}÷GîýÚý~ü?O{pÃgÏX>7ûüÚ“�›Ï¯g`ñ¡ûhÊÜuÌIÇ•¯‚¢5‹òþ?JpùöN³ü¶…ÎÜC?]œ_žÞW{º#×ì˜Û5ûº¹Û­w ó??Zÿ.“|½�fØræi–±ž;y__#N®“›¤?;ÁQçf–öp_�‡žÌæ ùÄ6ìü|óºû· w]e¬žØî¶P~—±)Üí+ˆ~ßâ[Ì¿�ŸŸÍßÄÇüm…XnîÓðÖ_ù{»F'HïÜ‘ž¿U_ybïë¿é›—¾ÒÃ)÷G6gø“¾;0hmvIÚùÊÝðüÓ½i龪µ³úVÏ×¶0+R2ówëg=dVÞìŠíÄš)ãöão]mÝÆüp±ßŒ3®¢ÏiÕÓó§ltÏÎíâE}[½9oßÞ‰óäaß3üÚGíc^=pvwœo4aúòŸYÙ‘÷à|í¼á²Í\¿½éëò»æl»ŠûíЮ�¿ÝrÄ÷R…iËôþÍýkPs¶5íÈÀtŠÝGÿ2ò™&×]çè;Ì=ý¬? Ÿ¨x¥Aì»%¬ýßAýö?{5´ç°þ¯oGÚÚË¿yÕ¼¿t‡ïîÜýòÑ ·íÃ'ýß]ú¨óöô}ù�+.÷–Üóßó3óÆ-zÖýbA>xGò?=8÷ÒöîÏü¹+oT…<·¿†{ãÃ¥®ÓŸŽ±ßæ¾9uéÎþ^_Åqê~`ÎMµlº�/ÛeÇå%‰š¦¡ë?V½_ŸÍÏ–Ó²vñ'þ®áÛÔýdü 9#%½$ËvʘEÛåéçÈ’ô*|âé[ü¿O<™[ž6´“·ù\Ë‚R»“I7v@À…܃õb+ä:0˜iÝú\¢Ö(«U·iôÅ?‘Ö¤6èZõ|3ÏÏœæj — m%ÕÒ–÷§݌гƒ4¦bkSïóãÓ=Â_Ž— ’’X¸jטxZ±¹Ø˜Ðf;yRYåν9Œ;é¼cÎ;¿N±ÿ¦SyÎ5BLñ:ñ-àÛH5ðÀü9Nö?…@"miÂa°£³�/©ë«ßãìªß‰Ýr<À.eÃé21o�­a\+1PE%$ ÆA”Œ'wbɈ„4@ FF�Œ¸,½½eT£®ŸÔ��§ÎMv}'% æ>¤)_é»öä�ëqµê¸k[ƒÐÉ$9°^Ò8ÄÑ\»ˆ  ÷ÚšÕ¸Ù`d^ÉB*#zm8fŽüwÅ4ÛI+¼Î™‡7[�©ÁTHQh}8AfƒJ£ jFàÂÓ Tc;Á*h”%xYSâUTgúM¢Ú×¢s6N[`å{�#Œü‚G]÷tè’b;\‹¢ ¨4ì¤u÷‚]JÔjé©ÔªtÜòZ BY¹¼ï�Ö—%ÚÝæ�­<ò¢ŸhC¶«Û–à'‡œ@拓 ê”Æ)LrÐo$øm3zc=âŒ=îhtjù Õ!a¦2€D!:²d(°Þ]¥°å¦y¾ålÄcÙ�rgn¼±‹�1<vÐb' ïVÙj²¦ÆüÀW ]ˆ‹¦PÓMâÜ�ý ˼�”¯p6¨«KÔÇ$̽­zÃ�3ýéèk$v>xŸSÖÄ t(‚Or#*DôCa¡Zܹ"¸øv/íF1cÏKìdŠ-¹A²Åq’BHB#±çÝ .o½h ¥Uü{©.Å„ßoÇÉ4KàMŽ¥Å#!Biut^ö�£} ÙX»©-¯”‘€¨Úü»sWHÇ…D0ÃVø,¨ý á@xEyçø€\›tVö¾ú!CÔó1–�„¹NT� +‰P©a”-®L«Òhض®J]!Pbè±ì„’I$ÒB#/«óëÕ×¼<im¬|¨ÿ4ßõúä~¼ª‡nÿÕ§3³ûnÞí‚äE>ú_ËbÅ‘LS™fì_÷g1 ^«“J9g¢zLÿ‹�½íÝèÙûÄò>]þ¢·Î^d‘è>ÌÝ«¹E~¢‡­¼Eo3w¤ùéùþþÒþN~«ã×Ôã\éŽ{Öë×C¾ØÇ ð&‹xΰ^_oî>ý»tŠÍ'}õf6°O¥HÏÚÿÓ=u¶ë±Uìþ^}�ÖôJÞÅ÷o¥˜ãÕuï›÷õï·—¸[¢ô®K†uÛ#û9ŽŠ_L[ÓåqCÓqÌ!H¿Ïsk²d�¢¿ïZRUˆnƒ/�ОîkÊ߯á±Öpܺ€d"ô0=Î(Óã˯V›™ÚÓKx_<ƹMå|4•§„/ úb_,Ðb÷¯ÎÑÜÝ·Ÿ_$ ÙiUÔ·KûêBÌ<m6´<{‡¾Í˜*”øf¶Ü%H¹vù—þoRÛ„=òâט»Û‚6ú@7†Â6þ‹‰Oë½Y�ßv£œ»CŸ÷çä¿L%W›ô€‹ŸA|×®až{Kϲ�ži¹oÛŽë7µWnÉ,±Öëû²�a­Ÿ[7óüç¼8^Yå+C¯çögªŠ3yuÌV1æJæŽ�h³†÷ÝûÑc¸­ZƒV©×»ìawêJßbõEüM½ôß�ß9Ùý–»Ìz�VÝ{©vÏŒ;7%go/ÛºÚ8„;Î<úeú#ç°«=ñž±}JÑœØmôùc]à/ǨBý¥)9,â¿´{ÛÛgMÓïÚ¾|³Ô „4éIî>¼|Eÿ~ x¯ã¨³ù$³¾ÜnÅ.þèÆ{—lRï̾×4,ÙjÙ`�–†ŸXs=½)AùÒ+—ŠÃ(â±íàé¢�ö˜y'³UåÖ&P4 †=[ÖUt‚Ïh M¢MÀ¡!|~=ý³Edcì`µÏ›7h5¤àO#Gµq¥'K¨ŸÊ AІºcÁV‚€ø˜¢ö쑌¢Å¦ëÛ ™°XºÐm¹ª�Š…ç;L�1<ó‹·]añÍ¡—ë»ÖK´Ç©‘`‘…÷ù«êh~Å}­ô®í<"®ñ+* -ⵈ?ÔÄÎùxÜÀ¬@ÄxˆJÈ€‡–&µÚ‹  …@£  Ý�¾ºmçÒ3ð3Ó3�"ïJcöýD¡õ«®ä£,`N@8½±þ님ŒïÒnö—qGײ¨ÿ‹ó}ÏO8³Îuˆµ¬r=„ò�ÑZ°&![GE6B--(Z-Y “U?©B;ÏG3{$kJ³åÇÙ1¿å�Ç£d@öÙ8ˆ„癪›RÚ2ί4åUÀ†Ûú0™)Q6&Ôð: lEš•H%½%çH ô@@Æi3ryªN �þ“�[µ9ÈßvÒC&Еy ¤*#Œ¶}Åd]ƒÉ ¢›vlCrpà%œ¨*XÖÍRÀ{ßUúÅvggFmh᧘žhg»ŒÆÒ�³€¡+q–€ I!OT>�”YGK6ƒfîÑßÜ@$�+jÛxŽí¯µ)Ú(äË.ñÂ5¡½– +rüÉ ‚ËÉ+ÆÒR¤$Û÷b¨ Ä1@{Û•–…æ,¤„ED�!î�=Áò žèI.N­òñïM#á `¯ab®6BÌ]4-p´3ø‹µ¢¡¤à„¿%šC®ùvxÜÚ‹Il™¯½$lšõÁÀƒ](RÞÞâé²HV/xçÒÁ²ØÓYÃEø9z|,ŒÃ�9_Ò˜TgM¼1JE x×áëù¦]7?¾±>ð#Ç£W÷ŸÛ~ýZâ?´ªïpï ßö¶‘lŒ·í²yÛÍŸ·û@ó'Û™V$´ÞqÜn$ϧq*EÅ oìüù<¥��›Î>ˆ%ò]oµµÙx¿·Í˲JiÌ|ò‚d÷·Õ'ï½t�gmDvÕ×X—xöì}û¸XÆË]·}fÅï„¥ -ruû/†ü6mížóýTó.~i;lS‘sÃWßJÁDšÞc@‹)Ö•ê_¹û÷îð¬lUmú«ü=‹Ç¿sß9êvóú¢¯”ãOºñÞƒ>óéÌÓYêKY8¶W¨%º©ðï 7}À]9.þN-Ù"}Ÿ·’ÛÀï|7Ö1i-q&Dž¾C½w‡6«úªüÜûý—‚á5ËÒÙä¡ëœÏÓdAíÛPgQ›-}â�+Œu³Ø~q2ù(·s-¡á fö7Çix—ß;Û„†ážv¶¨ºm¶úÏ Ï� :}±Ç‰øX6w¦=¯ô t5³ˆ?^b9]ýõÝ{$�ûù»¦üì"pú�S�Bí>Îz*SûÌøû¯Þüýo{{ïÇnúåÕïÛ¤ó,xï�žáz»ù;çæût*ÏÞù¯6#õ¿]mÔu7ÿyf$Ä8”P°tuˆU®ìoòô¥xŽ÷…q£§œ*m‰ÑèÑ-íkÕ©|%Ë|œ±;á�è�Ð6P+P$% •x@~ÒAB©ÛoBÊÌFа ` 4�%¡™A�P’!HÆÉ-GXõ¤€ñ¢H%y²ž 4ýª ‰ i‰úÄ…,µÓG ù?‹ê°e{GbS«�I]’øáÎ-M ä($+©:âºòc÷¾6ϓ]…Ñ¿Äh%^Ývïàò=úg+gö·‡ß•©z¢Ïó<]ÁÎã‰'7ñWj<|ûµ¢À�ÔëÝN¨þEÝ÷òç}¾Ú– ¯x�ö[gº,‹ˆF�ùo�ô¹|™ñù$�Ù¶èÛ}}_âmå­;^×ÊÞ¶vû]�}ß#¦2wíZøíþØxæ­-‹ï4„ ¬)Ó(ß#6À_Ž}ÏÃ|/k0ß+ú³HMß½nä\Yëûzùá²§ÝigÒwïÕa×:ûëãÝvÏN`ÀìÒg¤ìÌÖ}›»›ˆ�4ºÏÛ7ÁÓ%ïjq�­ñ±Î½y©3ˆ²Äýê^;^vàU’“àÄ|¦·ºKJèE¯´Ë^Ö=èàU¡vÚtëm‡ú¸5µ¾~W»f'øÙuÚcãYdë×wÞgQ9$†Æ%?ï?׆jš8ú&5£–�ä¸öÿvjå—nš�ܾ·¿.é‡(‡÷Ø v¾gÇÚcˆùé§O»Ÿ‚e÷µ.aÞ òTë+¨œ>='ŒãÏ5ÁÖûù‹ûCaü}�†R¿>¦Jv´# ÚìïÖ2¿\u ¦éoߦPÚ¹ý‰°/mÕ9ds ÜdÇ;ÿδïRüïwãî™Ãí�£Y{鎴ûet»g/­÷ÛpìÅo€ýçç«=4~èëaš�Xñk�k�s>ö®µ=¿kG`{îæ�œlþ#•å¹ 2ýç‰Í¯îsþ~Ñ0÷wâ¾·ÿwÖÎ ¹âƒ»Z~ù™/îoé”ïá3¬ücú÷¶ƒïV—b2t(UÓ{äN-±ìþÿZ¾±>ÛîØ*íýÏ\ÊÍÓËPÎVIÀ�E Y_øÊ†FÇKºÄŒ¥ fËsü9ÉÂ×CÚG�P–¥`>¾*’‘!ú •(ÆL]´�WDªŠÐa©¶Œ%@>&¿.[:"ÅÒb…ì,>Ï,†ªª`Õ€²)HP%ˆÚ_ä s¾5£¥]¢–Ì*¿' ÌÕI€È¥° ¤+_ÛÃÈRwú²!ºÀ�ºÞ¯H˜ %‰PÒ!¨R£`räo4EFÕy$Žžé±úÄyD§ç~–û¿…}-›K–˜ý­Žc“™îüs ‚‡Ž+!)Œn¥¦í–KP:*%n&lC¤«¬©# ȹ—‘"b¾3¬ |Ïóh~­¼ ó½ŸÄ«Šÿ(úq:4tšD’ç1žB¤Ž¸¾Ò‘T©@Ù&ÇÙ_I²,W®FÆ<а°Ö`ÊËe38Ü þÈ,š¯¿:‚Ô[½¦ðI©ƒ‡Ê ËÙ¯eÂjœ ƒ&M;…ì+�%–³llCm#\¥r5h†ŒDY1™‹QÒøz*Ô4û’‹§Æ§¥0Ì»âÐV F-Pt9ceÑXŽ 6‡7äΤ(ÂXU1*šŠ:ŸWU¦¨ ÀtIÉþ¿¨Ýª|[ÖŸøþ>{˜œïÍíp)ã{¡æsyu5ºòÂÔÌuÍ^â+ª´C,­DÅu\çB²Vj*´o ìq‰Øq‹èô ÚѪg´ßÓ\ûK=&v¶-ýìܸÓ�!�¥A¦ZÝîs ³EŽI%gUJЧ%u $ „`B!kªó0’„uІ_ÇQEU?“Jó1 `‹¿OI( ¦£õ$’}oYJ‰�XÖ¿I%PbEˆBM4؄ƀUË„¬´„�«ÜfZ^Lã稴1žÿ?Ž}–ü{篯öÿ7N¹ ®¼`Uþ–¸c%š¬a—%Æ»†� ·,±øæÐ›¼®øÛ¼?´hÝ™CsïøW¼o;Eã¸ï÷ìg»ZkÙ’�­û/ý½¤>@^¿ ÃÛ –ÿñzfì¢K©èê;Z~í]±³üsåš÷¹ÚýbûFb£FxÝ}gz~áŽå‰W™oþ]D<âÉÅríåÄÍÏíÒÆÝûAÿŸÁ÷Éu)»^®¯»ûœ*7ù¿küCuÿ“·ñ�[ùÞ¾#׽غ?x»ä5ðUßý'¦.M^x�?œß�§ÝžNn_ß=™·«Û¿‘Žïï}æWüƒ™ŽÜ?¾ívýb³Þo–ÎûúÜ3öœüÅîŽDr�J÷IÇññ}ÚWïê�ØxýÓ|õ¶…K­‡gd¢ÏËÌGûÒéÂyßûÓènx»%ÆØ§W,÷Ä1¦SÚÃ*QHš _'êxŽÏŠ„H-éí¸\yk»öe'æ‰â©YS‹óH‰í�tlFÆlþ íÇãíŽûd=Û`úæ?¸Æú©Û�ð@g|ù„hòëËŸv¿{÷èU)�‡€¿uèË{§ê›;ÌSïó"1]—êÖÚ\ˆaóÌÄ;ÛÒj´\ÿ9<îöÊÂ8>¦_ïóSçNÔόѬ—©'žò„û.?妴c…#Y‰ É’ì¿¢@ÁW §÷·[·X¯“øïõ¿³Úÿ¶ûãº3Çp’ïéÆÕÁþI¬ñ*ùÈ¢�9«ÒØ+—yßâ[�í†çÕÕtœŒ¹2_k¹¸vÁ=î÷åíÎ'Îâ÷說…íᯚ×iîBðã$Çk2”ei´ "˜´�_Å>··cI¦9©Îæöò¤#Ë•–»Iy͈‚®âƒ+þt© �F© F,„ÞâHôxûöÆ,` P¦—äj£AæÀYAQ!aÀÈRˆ„Ò!!…R` hwöEPs¯y‚G© ×Úõ:gâJþ»o+]к±»t<ßkÄ’áG*–)”@ÚpÊÔ»‡hJŠ˜›ª$0³q( Hœº~b ?¹Ì”í ³­rÊãR…£÷¥A‚€²!2Å—A¹Ä+ôwF=pïD•8pT>ë×c©¶ÕŠEöý¸¸—PáäžU pü’d¡º� µÈàõìg%À�TpþÊ)Aîœ89vbu¶¬lKx-å]‰‰õš6 •ÂãüsýfÞ”÷Ìpe ËcLo‘µS‡m=K¦È%p9¼EIb°Çˆ%”h©¬°ÃUö ]jÒÄÆÓM^͸dëåHrpÌó§åã/¦r=rW©xCu“?ÇóÅüúWƇcüú«Jœ1$Af«eçýœWA»Äñ¤VÐWK|SµÃ ¤udS’%ÿ~¨u[®/B'èΈz‚¸1Ðþc35ÊÜ»MƒejD4Ê+:Ѐ²0Û1¶8µ°AMQÍö¼|'.Fá"a°!½Ì•[á‘d¹ùÿ¥Í"ùÖ(f5óIq¥NIÃÒ±Í*�BŒ%É3n·ú´DT XÍm¥^ÇÌš™eŒì_„ï=:OM¥t²�°aN¡0è? zyß•“‰xF§æ-æÙh=rìu*ÆPs^¸eˆ°röayd�Éç˱ƒr¬ôd¶¶„²¬2GêŒrB† Ô­ee *&&ÿ¤Ä0DP�K>�Î lè@¥€Oåä“âîÀûC»êÖÙ¤joRQ¿S Jm´TfY4•  <" T"»�°À•uûiXe´8•³jר¹d½s%}û²Õz¼Ý|�66M³5›oK|³xUû.•óû~µ¹¤Ú”µ{6»uÛ\åÇY¥k£\4†•ÓÙ¤`N PBaP…P¬XT0�°�ÀG v5‹(­¢àâJ( !7! ÙËH€PÛÍüí°ó×�¹™ãˇ¾%ãÖ©µm�÷þuê.556ð?­à{”púñá€N…Ø_w銤ÚÂg}uçU綆?‰Ñ˳ÊX5ž=xÝËv8Ÿé±£3çHÕÑì_Ï<6}7Âoîn–(ÿ>ûyï_…hǺѳ§É~!†¿ï1¤õMN›iyà×û~Ë&íÞ›[yU;Šò_Ðëù¯¿Ÿyýú[s�eþ‹šrÒÅ ¶»ËüÁ�ð›ñXô-.$:ê¸"põ/l�-û²n×ùçu¯25ÃÒ§ ÏNo;™W¼?—ÜCÖÌÄJ—ðœvÅ|@U1Á$¼0/ƽaý¦sÛ-¨ãÄc×jµr<8F¦ï�àýöÞü{=ïýy"æ[e¾÷ˆÝc¦ûý/~}ù…i÷ïžÍß�øAÛûúÛ.³Ü÷ÈmYÚÝbßgÙý -ÞWÂB0ñÉøïƒí¿ãY9¿2­uÜ~€¨ ówÞ8ßû·]S±$gû¶é�f»R¡Ô¾Ojø‡›øñ¸À¬ª ídËø? gßãÍ6ón6Ož÷Ý�Ûµ—+|¬Ó1Êàœ&÷Îþ×î£Ãà“ëâ, µë�>ðÎç„êý,…kQç³%f}ÚZ|ùü½~ã%/VÌvnÈÒvû™Ñkôêqnƒëc=ýnÈÿ£¦ÃŸcêõ×lçç¹xxÓË_¿íçìo½i¤xö¥»Ò¹|âûƒïV"èÑ”g_—Qe |ªŽl’ÕRÈd ÀtñëY¼Dw§«Ðu>}-jåãŠhcM–飣J#4äˆÐ”«U¢äEñMVŽwÈ,Zï(uíåü9^î_W2w«ç€Ãd�¡5J´3ÚgdTÓI#x£Óøêpþm`þ¹µipBÂÃÍùŠ8h+eh»c×C®fk°jƒºR0•í«Nª¥åƒmš%›§¢²H@„CO®ûY Š4MPÿiì†ØÒ�),¤ØfM ŠÉŠl 3+2µºñ¿o}¿‡~Ûo †˜ˆªÐŠ?�šX?‚ºÙSÏæèª@/À•®‰T6Ä›Xdm$Ø& OŸO\.ÝPŒìîK®Íööíù“™iåß§+ p|¿¶ÏúR§Kô6ld¾=ßïG26§Ê[#ÖþvÚ6òÜG¼\²ñ¿¶màxãqo0>9äWãföY&Þ~E-†eå‡YÀO´¿s¦þqOŠœ4ù¯¶ô�áŽópJ(¸0ÿ“‘æ~üiµ]=Ã|dݳ´á·hZŸ3�ø‹ç¯+÷/Ri[¼F¼Uu¿ªyÏ5µ6÷hU™°Ã qÜûöð%¡ã²ìâéµ·,l¨ÜaÐz+gÒÃ|¿kñ6±çÜÓØ«{Ø5ò½{¿ßÛÒøù<øç}ùáwÇ=gú/‰ù•:a‚#d_%±ª=7ÏÈ»ºuÌ| Þß«×÷ßÛF¹{i«¯³àÅ“]^ô}¡­¶”ßÎ×ßÀJøxLIè{‡cKn úX|X·8gÏt§rëÒBðhæFvËO†{m;ñËa›¯‹ú�°Ûw;ó”íómâöËéw‹iË¿�ý.{pøÂ¶ê=Б±[”¢§]/�¼ÉÜOûЗzûåp÷ÇÏ\õ»ð®…³Ì‹ä¹ˆ]ð[‹Õ‘5|G¿¿yæÃ³½Ò_‹4ØM?>¡M£võX³Ï]³ãûsÅBûøâþ8ªÆdèxˆv|óÓNÞgh÷&>¢]ÉWø’�2ºÏ·>§ç¶Ò¼Ž¸?ß¾ùß¾çî±Ù+�v^‚ñýWÏoí?ïvSÏâíž™Ì7ÇÑûÌý¬ioû',õ³}ãëÅÐñïtë¿0c�…ç¨Wø·ã× JZòç�m•…÷ÖiéÀ:×Œä³žï¤øYº„¥ûîÔ—MþðÔÖÙIÇ.ÇråðÚÜÿ%WNÅ*À‰AÓ•ö6~¾®œÒí¨@¬jÕ�ƒíC³³fÓQåí@Òy" xmàÉ D±öˆ ,ô¯­–(AH—ù/Šõ¿îØeÍ É˜ÚwÐ÷Å�~c¾5M¶ PèwÌ’ØÇÖ-c›*¥‚ÒZ;½Vú§ä�ß9�MKÏã½át¤Ôó¤ùâÝ\i$¯q�Ê@بºÌA¾µ£ a‹¯ës«Rhd²_Ù}ýéÒ?á — ÉŽÀxÈy²$,DBò’ˆUhºJÍ7(û~V§óï{~q¢) °¿’¢zô(۔ʄ1E6+©°¼Ãº,ˆ¼sÊÆ%8Pø‹…¬Ô"Œ�E‹Rùz‚‰«`Å”„ߣ"Dz6¼Dš~LLvïG—.“8‚{öû‹ºíW’ãNœB�…éX=‹´ÊÑ%Zõ^hì ô߬EnW‰—ÉXŽmùkÓ5t=s:uýq½�õaY‚D]¶‚X«OÛŒ9åÁ¢¿¶“c$×jCïæµs¬™?L‹­h9mg´o4®ÆÝ4Ë ª<Çr¶åa©e}Úè‹§„4F9Î9ü’ªysâ¯ÝWQ?ºýêYigµÄ§ã}‹Bæ<ºÃDI�’@¨ª–}gÏD½}JÏ Ô,?;(M³wÈù­YÜ�€JŒèÐg“¤V0º%µÄgï{|!Ø ÈÐ%t„y +¨hH« Rƒ¼+ÀSåËä� îýÖK0¾ïl|¯¾:gzö®ôãÛ{ï”òIßmÿ»¯~ü”ù(;)µGÆ#õ4û¹í7 WÏahüÚ_¯›¢ùŠ|ŸÄøÆîÔËǹ3ÃöÜVŒ�ÅZ¿ïœí.y÷ïéöĽåÜ~ÕŒ»ö.ÿ2³¯·Ú;§tô~�f}zd;›÷ƒ æÐw½®ßBöÁ÷ÜçÏŽwÙIãá}ßå·á®*Òl>ˆþï�ÊzóÑ7§}úæuTÓ¿¼nR^ú½Yܤ;LLž”ö·>®ïÇÏÐ$ ÷ö—øšJg¤HsåOûA€¯BçÓ‚Þ"Ï·¬¢Î³ÅÛ0¤†ðZHQ!)j#Å ‹+�‚ÎåÀݬæÉhƒˆ�‡%²5}‘ªŒ-—kIž-4Ï8zT£ÁÆdº�µØª dT +„3?í‡Ø£âƒÓ5þÊÈ•ç2.µ¢\5A–x+ŒÖjTËI(‘ÁË€ƒ¡@c€{G·Écz¦þÊ •®Ë:V’ìÈÁ‘&h ÉCÛZênJRXq ϼK/ûÌØÓø«:?(9×MÃl‘5~JÂQ(¢þ„–p€)H*’ ú·¬ë4®õ>·­éí0>�Ó1­í‹\ªÏ×Ý·+~‡D´Æ%ËB¼@—4PÚô€èÛB¡˜UÂXÓÄÛ�ë)¥�Vs\[˜'y˜ô¼v¢Eèñ±öÈY†çŸñó<“Bþ¤^ 1kØ0µ¨Q„1špIp†D—äõl¬‡�$�ÒA@eÿÑH{µ—Ã�…½ lÿ4ÖÃ|VkŠInai¨ÊÁÉ Ž †Û.‘_&H”Ÿ«†n>ï¡êñúËF¯Ûa  LLN&̓üééë’Õ÷¦g8ôb3ÄDÃ.¢ˆÚa;¾Á,”€ °©suˆJ©z‹|Làío{YE¥Ü:Ë&³4t)Ãm¾z4aVŒ‹d¢¬«Ùô¬ âwb+ÚÍRÍU«–ŠÌ €%@V{+v”ŽÿŸ0…µiŒm±‡œš Øõ7At°~Ä�-Æ�•ê@ f�HÒ@²ƒV�$;6Y©1oYó¢À„°l�.éÐBbüY€çÚfæÉè�f“©¯¹Mþr $KˆM$*º]÷<ÄIô $ Ý$ B@��d��b$�{ˆ’D«kKU¶Õ›kVµøm­Z××m`B@�ЉB*’!Hýð„ ×ÉõÛóçîmü÷�wm%Þø¡WOËÆ˯�ÛwÒGŠ–§ïã¿á£ëmƒ­Ëš‚²¦75´ï:®'˜�ÄXYñ¾ù·Ìÿ¿íN(Šþ·?']Ý]©Ë¦ ò7^\Xñò¡ÓF8Ùƒ1"óhÝþ“m ¯í(Mâ¢O½§ Mƒ¾�?hH ¼¾þ¼¡þ{S…ë~×Ú3">“Ir?öªµ*­5[Y¤ÕZiU!´�bþ?sß� WKúÏ“e©=M@*v„�n4�½>NOFEñ4Ï}¿¾Ö±úJwô¯@ŽyH &BBb"¡{ççç£_ßš¿¦R�¬ á>û Ø’Ûyùt�˜„æ+¼/ˆÓ«'ùûuµ"Ði¼¨fPü>KQ”yš²¿Î„Ež ’a_÷v'ްDDZ¸€è�ýºè~zi'¯ûXÓæ�ë”·)ÎßÇî>ë7™—;µ×.;…Í\sþ“ÍmÙ¿îa…¬šk‹dÓ5òÈ{æ:ær0gÿ‘ÖP:[I�Hg—^=⨊é®Ñ8ﺳ(㢾÷4èNmÏþ[²ÏK&ù©�ñ {s0õOZÎðX½a¹Ê{ncz]âàé0œ£�»œʆ!wlå�؇xl@çkà•ˆ0¿QàÛB—s�ÉÓ<Óèc[¾�´TJWˆÑªtøç…òg>|ôþ6Hwm(Ðb _ÌqÃCû^…^,T"§½Q$,ã>S*]àK‡G}]ÉN–ÃgØ bY ‹®îgÅËz¢€fkYšE÷¥€„)´-n7*•!öe<´Ä‰¤ùkò°@>iRÛ¼¤[‚•óù‡¹ —›°-jôü6M°œBÃÓNb@ÝT£Ñ)mš;zÍR> K€š¶³a%e%/óØO Ìh­c}(õ7ðÐtër4ÞnÜ�3zdÏuÓæ¤ÂäR)&ðÉuÛéYŽ÷…\s±\½d›NH·ë€,wÚŽo,pXÂÇnj:¦×j°¿¼xóå+„¯Àl½oˆ˜µç ©"u[Çчï)S´ ~K û‡ ’ÇÊs 0l߯ø,\²!|È@é,çaÂÁ;î^±Éº1Æeÿ¯V¹6kx¶®WOÁœÀLjsÍÆœ¨¾Û�yÌŒê:ÖGØà) Û‹NGïrÛË¥ÁùÁ‰3Aæ(, ÷¤= êGv¶O_˜zˆL)ë‰�¡ÆF[qìêà’“K[�Í„­’lâ,xƒvý_þ?t¶X§²x¸?uëºÊרÍL¨I ˆKòAŠ#ò¼'MsÖj¸ÅÿëÆó_N¼�Î}ÝýtLû=ª&x´%ÏÇZ0ˆÃë°ÇöÁ�¤ÝªZt­�Õ#J&RèÌxª˜™(G8˜,5¬òÑ*9U‹–# 0oÁƒm'µ�™ÜbÈfdq ¨é|ßÏþ¿ãš„‹ïƺr`LÕì‰<Ò0z\m�¼H’® B(jÑ:Û{nùÐÙ‡L»ŽuÇek¦R†¥™¼ÃG@æs0AXµ‡Ë9�z1Ê1E»á:[Æ,匤Úç¡^rÙ7µÙ›tŸ÷åytÎ}H懤~Kb�É^˜ïù‘>A8¸ôþàÆ®1+tb*ûGÆæ!÷p–ð®5V6ÊEì‚«(ßay*Ëhó”�4EH�/š³j i¹wÅ[Co¸Ú@¾¸ò2eÓð˃9›ç›cÙƒ³éøÆx‡¾U‚äÜÀ€¨m‚~¶Ÿ âgC¥ï5††f2±NX¼Äa>‡1I•«,"Ê› ¢Á¦7¸ë‰#iOÄŽ,ظUf´I™y¬:~WmûJ¤„A±ù”>6iSÜM�&®MµN?Ö}+^ÆÀ¿&K–#ÈÆOWË i«vHV,—ŽÊP‡ÍbS1õï@�nz¹/|xŠNøZüÛó•œø¸‘Ñe,Ac�%ð¾¿å}ñ†$Œ�_·bú9Œï¦ê4ÓI]Ó2|-r Õ½•þŠû Œ¦Ÿ™ÖÝ~ᇿ,¤“‚ííé{8I¶þ4!—ƒ½_<{^''Íq9‘ÌŽä=õÊ,ö5(B²â 1‹ÊÑáÁã4‚¬—HD­6“¹?üµ×7Ì*[šÆZʾ¥Ð3Ôòžªd犦"°N;úsF2d»¹ûâ{±œ�¶ëoFå­þ–Ô]e¸Ç�Žò°�ýÏ7§NþàÊÂ\sOo|*oDR«tÂJÚ^0k“V’3“EÝ= 9ÑÝT %ßÐ<(ÿ¶Y[iÛ2á`éÉeL BÊŠ(+®½»dŒ+Ô̼­±³k^÷?$¼éc4Ãh#æ°³¾8(:`�QÐTù]õË YýÈb]ÚUõ‰K#Y'bjÀ¶^t¡i¹d§x‰QÞó˜ÓqÔ·½×¨q΃E«-eˆik0’ °Ú“—RaáMíø”p¼ák‚:-åD‘(æ×~Œï¨R7ä*·�‡‘bl<Žu%þÎ ÎÜÚåXV1ÉÂgt– À“gn eÔuD£²ÛÈ;ݤü9ap 8Pxqv¿ohÀ?m†÷�µpûY’}ª Ö(¿�K:»H$$€Œ‰Ò*­cm!Õq»^‹¶ïjûÑCVz?Ӭ߯{ŒýnFѲÑPÖRJD˜{¯Ð/²ù‡ë±oZûîmà^8 ë_ëÙ?>ÿ}žtÏPh8n ›×Íë7b'Ð,YÇôÿ@Y¸hMÏxùü ƒèR„´¢„󵥫^÷áL^Ów¾ã8íY¤¼¬b‰„.A;z7ÛÖì>ǃþq†z'Átã3!  ra«Æ ŠÄ"L´õ8¬ÖK<›8ÔbkÖ};Ö×d5õ‹áHwЋ<ßò:­.V«‚!¹zäÝ ‘þyvv©{‘¤ƒº™pîú”££Pá7�h„Ê]¯óò@À”þ<\ÂÒua™ÕSîžä„5Ó/€n�/ˆOˆy¶µ nƒ©bzÓµï•1‹íhξA@Qi«»%¢ûWPÿm…ù `ñàŸï=ð·øZÈðV®¿:�&¹x9ð¯]*€˜c*@‚¤Dîfÿ¤ÿ/#4Hé¡ÿ¿sùP¼Gî�uà°A 8…TïRêЀ /{=ÅügÊ"ò+ñy\\�_{Í÷��Ë•"Y3_dºã“x¦ÃÉøpD¹A@†RG¡A±ÊHg»ºà6\áà[S½a]÷Ê;!Á‘?Ìú¨*¤wF¶'‡Ç„cêºé‚×¢·Y뼤í;ŸX¦¡žõµ°.X?�®åóÊ{yÓ?.³¬Ú¸Ü}9¨=ºÏßèöø€b�.sD‡iÆ›–%@dußpó·ûw}úyÝ‘õý\dH"a%b)�q¨´õ›•*¼ÈIcUáæŒ¬· $¨ÖiåŸ1²‰þ}½½¿‚}ixó’[C%mï|{uK„qKo®cú…‹†néÁî)ù„«Ûý‹O-ψò\ËâÆÆnX»Œ¼‘Ž+h½‘ôØIóÂðf {¶L(8½`Ãè:ûh´_ön ®/]Ic}ðÕzCB�ÈáäðþÙÐ�ïl|f!ùhœkÙPv � VòûŽZÝ2«ŽŽç^¶âä·ÁX!>ݹ^ÛL¾^ü^—¹Kdjˆ_Ð~kßvQtr"\¤¹Ñ`ãQî³o(îUå ³ ˆÑ"€;ŠU)Õês¬-Øë¢òW“ܹM ÞoH"ö®%Êm9ºx­çx-NmäªчƄ¦LaÉ´¾9‡7tÕÞ /³¡ƒfй¶4€÷ì æ+‡À‘B÷Á@i,gl~o6Ö§ñ7åLiGòëÓo«ý•pi °·ø-àŸUà 9Óæ«Õô÷".;šÃˆ+ümƒò¿¿F„|kÙ ŸÞ¿E Œ¼Ë^(k�ÓÐÍ@Åg%V¾¡¬«]§D¶nÓÛ*è[XŽuŸuBÛ�Ã{{EäÑ79m;Î � T"át�}#Ë[;È3½¶§»ÅÆd�Fc¡ã�$²fÅ ù®%ÊÚk؈ÑÄÅÒöþNÇ øý�nµç¹ËóÖót¬âUD°ç!¥‹—Zæ’díeã ":ËZ!ðë�I‹!{v"¬šÞ¾]4' ›8¤4£-±þÆ­Ó⇰uSéãN��99Ú~“ηq0Óãïar1ï×eÉùõ>�û‚p(�&2q²¸­�½hAêPíO›Ï¾¾4]kF˜ài*ö\c#c'™+€œ¥Œ4Ê7ÿZ@\*²–»ASïŸlˤ±«ÞªcFQz|šÕM(Ño­RÖ,“V'm˜X³X§T“Ç=Ö!�‘M‹X2Nä÷&®XÇß3xûêö)nfðX–"Ô}V}¼ZÈ— ºúJ°«™Ä.ÿÁq^XîtÞla˜|3ÄØßÚº˜÷T�¯|º»‚�¢ÉkG}g’žíµ¹-Ÿµ ౌ‘�öp8úÇ“O’D`=9ndïÃâ»”³Ðtæx„o³!q É¥Šë8‘,�Ü9—Ù±�RÆ�G—Zƒç&æóÇ|péðÜ“O浜¹TØ·ã§Þl× ¥S²bõ‰±² <¹a žWXÆÞŒïxhkùм�Dd�ÑÛÀ]¤½% Ø‘UÂÞˆÈû`†ye€!ôÆTÙ`ÑB›b°#Ä!$Ï„œ?AÍ@¯]<1¬æ°œµê† ¡;¯T§ÚÒo½5ë>úB�¸oõõÏöcæ¿ߤ�4�uø©ûø¸ý?â2ß1[þæÏú¿¡…W·÷oÿ)“bI°�·½¹á;§ëŽëôË€  ×ÿ–òóÿûÇþxYF(¥T�w$±_–/œ7þW¯Í€£˜³yÙ­h{B&+6�º‡Øµˆnôe/¥&'®É:¨iU{.ÂíÇ_3áù·´ñó® �â0t7Zôô^Ñ2A¯ÔǬQá†Aå>òáÿ‚‡Ÿ«ª{–<ÿOäÃ4+s9Ø /³Ý%å÷M�éÓKÁ«óm¾Ç f«Ùzùùñ’ŒLʽ÷òOD˵‚Ð 1D^‘DÁ´ÒcT‹�Ì)4#©ÕË¥·¶øK½ý]«âÛðYŒ÷fŒ1xAUi¦�ÑV L>+$­S8˜Ð¶(Š4 ¤Á¥ˆc"‚BR€ Àñ?2ýè�~‘;:È?ó™²õà�RzÒO&Ê™×KÎ&)§Ÿ«ÿ?ȶ߫ú_ÛÔ=Wºˆ=šp(i7 4@ÐÓmp…Ý Ã_íæNvë!ÍC:g¡ ’JB!6ÓcF�gÇž—H–ƒÌÒœÏz•ݭ䣧‡ÇòiQЩGhØ)ú7ÙX޵ýQ2©!] ˆ�ü?ÞCa¦Jcç¼¹c’ÿ~`_¡î~¶¢™9¯ ñ÷Â4 ”—bÿ²Ý—cñ§f³²ý@–ÜvÐ/ MŸ¶ÿõÒ8œÉI¦ϸÈP<¼DÆœ‹Q­ +Û€†òŽ›ðŒÎ¥79¦|òdÄ”=ÐäÕ÷=>€>�‡¶æ¾9MˆŸchYñ ë@Bí6]?�úKÐmúXŸé_O\ªç�)7c¿ÂEøm?Ì@Þ ­ŽCâðÛLé`'IÜv$O2ZγO~Ο^�½Ÿis3Ï— �oÛçvÛj­{ܲ,­˜s[À¼„p��±z�ׂãV×Üîð3Œðœ…(^¨RÞè6Å<ð,×÷º¤,3¯Tw˜âN¡�9ÜvÅà1»l¼íHCD&/VÝúL�tücU÷q¤²ULrß×nÌh{òfë÷7^·OóŽ¶øŽœ½÷W­�r,§6�æ»kLlqy*œ%Ad¹3çžl~nZÙ­}]ÀgŽ9A³ƒ!ìÓwÒ|“XèJi$�s^=çKoGŒ?2û„ ÏÑÑèäü[En¸gZ–ý{ÁS‚@¨ƒw@Óì`ªè¤9þè·m±³Ê¨èŽKÙ åŸÜTrr‚院²ØºøE!øŸ9«v/oœ¹§e®K"I1ÅZ_›pE.ÏCê•^¼ÌÏqPÇ^„@€n€‰É`:0Áí G„yd ØU»²=Ûk9¹ês‘ÏœÞrŒÈª„ue†•.8Ã�˜£�:V]N}gx¹Ë 9´û–…·o.¥Á›ñBî­pAvŠ’¬Í�F”äð)€—ŸZ??‹]�^4\ÝL€ÏL=sñ=Ï–ÖÄu5²Ø1?5ÍKh=x=‡µØ‚‘¥±ta,°dRþ³ìùõ€€Ív€4þ»ÿÊ�!à,Ùß qÚî6kͤ¹ ÆÚ%îz3S|_Ìï;³g›²à\5Î�âý«Îáxe)?æ@x<æxò·´�.ÛÏåíëÚM(ü¾X–©­6 UŸ|K¡íhÍë¦ Á(‡.7ºí¼�…˜—Ÿˆóˆ<ÆŽñ[é[í 5zµR‚Mµû~Ë}¡ÆD?Â+ œì@ûB3žÑö⠗ůŒµÅ9x> 9††'?¼"ÿòìÚb´{� Ú–fä5²‹œÌ •jJ©Ö”¨1�ª“7–o'Û4�zt©Þ¨ ù9ö’³÷å¿ù»w&½‡ì#5ª_wwjŠ‘c_SOÐ6c;,¹ýlÂó3ž_ïp«p�8·�³¹ê7üxö§ÙG­¿årüé9ß«$Ž 1^Ç…ýÆáˆðcRXºùËݯßC|+ ìa‹ \ß» K­ow‡ÚJ%¢í·A�ƒ›33žvx‹Bc0~†å‘Ax“'%ì9¶×2˜ú¸]¶tVMÒNstÏ;qW¸#­Þ©Þ�MX±ƒ•Ú[Tê°×¯óù¹wá Ý Î9Ã)HD¼ò•&aNïQhK1\ÞÆ ¿ú®î{!}ÏL—ýñx´V?•mI]vûú_ì `‰>Äq‹¨mÌÍ×ßéø}õ^ê�;ayF1½eŸú|/ߪÖÉ­†Ÿè�†õT—r�þ^Ó.�9‘üWà õ¼ým½åI�¨#¯“y, ˜ÚXg„|/ÂàÍö¬ ‚‚o<ࣨpÓl2|K6,þÕÿb1í—š×¢^ùÝÍôYãížéõìÒ¹õ4Â6µé zòÎæ3�‘ìnvOp»ÉŠw_ùßâr’ÆËÓËGžGžþZU6�÷½_2šüøÎ?jéAÍ7:»L†ñ$'—µüŽnÐg”}c s÷@BQZç˜UWÕÞ€<¹þ_“×ÇjsG*…Š#ÃÙh q> ‡(q¹àš@µ4�|²…^B«/s]ͯ�6¸ õ±"±êµÉô†1ðoìÃ@±&þ}&ž65ŒtDOú`ZèÆ„9œ æ ä÷’àËî Ô‡ÔžL9’EûmGظ¾½p˜Ü¾ßhŠ8û^ØÞÕÞi1äìÐÕ°,ˆÙfj=¶G­;ª¶eǬ®ðø¥ÁŽËµÁ˜ÁÈ”1w »e8¸†-¨7@°yjðÕ/l¦³�{°i�?›±é[_h#rW<öõß7“ýXͦ¥&±�õ¼Y{ªTŒWû´Ôküw}Fýô£}É}«/g>ý©´ü—d€·SEð/ý|¹¬ZMNGß“QH˜áWÀËÖbIJQ•#~ÑŽ*þv†ç&kE„SQc7}Áÿ™lëÍXÆùÌ÷•¹ÊXÜ 9ñn?Åî‰×š¼c;ÒÉ| O wä�\ÅÕ©NÉmòO¶Ÿa)ùœ%fЩÙflªžs’–E],f!ïIÉ)pÓ–6ÚöÁ†7zú\"Ð[áTG½~ìçÏX»€qa„À!bÍÇYøXfa@–¾“õšAý8õXÉ ½­ÈøtfüÙü¾�ÇÂý´EJ=û‚ߨÀµÅÅô3Ý`S héýŸ·J›ómáe:–ÙÜnÍO9 å�²ë_èñ/›!^*º#ƒ^zÜK`†98½ÔZ„ï2#ÌàTÈŒøî�äd ”¾,H É5OM�X,ØÒß#&Ay²(û»sÓÃy|æ¾Àqè†/„“U‘ˆµ1&H§1j oaP®YfÕŸ"J%//ºÃØS4ü`å/½€;~]ï …[ÖÇù£+ý “γ}$ë�d§ !ª ǶèŒ7U$“Îò5¬™Éµó�dwYx}H‹O,/sı,«ôD çù½<ðˆ¿¯·T«0à9á(&,[=q^õ°ñ[Nmñzä¶ç|TæGž3õ1þ…-ñO) Æ&‰ L´Óx¶Í:ŒÜ¬ÅèV(MÙ±�ñ¸R¶¢ßÇÏlÇ<¬–5� èÿò/˜Ó�"̲¯ž-ìáÞ½%{%ixj6Mœ9­òÛ^c>[|«¯5°ù&.~ê㋎þÞÖÙêó¹F…6¸íµ¨y;rø[òûQEfˬí»à-Lju÷øöéâ¹b T­U5ÓÅmH¤ÍFâÕ›ÿÕ³tc‹Ÿ_¿?õÈ^þz�HïÿÌ/UF(ÈšùA»(к¯\(((Ä¿Î)~§÷òè¼þ=ý?ŒÄ‹)7L‡’£}}6)ÝÁíC…(óà§þ0ÅÃÊ˽¾ÁlÓ EðÖƒ¿ÙÍpCbß›ûÌ$’IÐzWõñíÍz¬Sßù¬?N)�s�q†»j T†ÓðÚNV« ¿Öa¡,ódFxF“äÄq@>åN”áh¨jÓÚtzú…ÿã8€|¨D9*aàœpµR'¨+Â@€‚f]ä6T¦˜)Ñ{ÌçÅ eÜÛ<ñ†—‹á™úZ„NØãy¢¨“ðbÖa‚­’-›áM<¾ ]oÐî²d¢ãA�ŸMýå‹êÅ|Ú’!ÒG'SžÚ!³\ÙÝõÄ0÷Ê¢,2S/=F§!î²£›ÎTrî÷<õ#«ÁTþ—H ˆQgíM–ûÕ6¹ºß—0 Rò É‡™¶�b,ô6übc`GyWNVÏX½»9¸îÓW[&6óбFâRs˸÷‘KWñ˜<�…kÒú|Æ›-g�3Ž£¥W4°\n7ž–wôùjlÙ3€Vìb{ Ç7‚ÐBq1ÜyúCÐâ_=*ÙÞ†9Éñl�Ùˆ)pàvn æýÜbâN1ªÃëÙ¼§kHži`G07=àµûõ³;;�¶Òf1à¥@ø‹Ã°â�EZKÐ}¡²ûu§>�S UóQÇ £±5¢ÆL�üOÌ?׸ÝñžÞ¿¼ÞO¥¶#Š€D¾OÁñfrûlŸì_Qås ó‰[ã9òß¶íuГo‘PžÌ¿5:\CûÞJ热¾B ¾ßÃ3ñ Jý㠹・Çs·ð£â,",‘u^?Ô¢H‘™ažyôÄ‹XÝÞ„ ê´g…ë�ªâ}oa-—ÉÛÿ1½“?¾çÛ¼Ò=&Íþy$|y1ù½ ßS2¹v1žPe`ó:ù'#_ЬvýãöT{áJÙŒeÒ@x[wÙ¹†5½ý€˜ÆöÙ T˜ÒA’»g»V%{ãójK†Ÿe<�gZë�üž‹=ÌM½âð?œ×·NoËŠÔÅhÝuW€ªo’¯=Þ±» 'L‚ÎÞZ½„R® HÒä¼õ0;zÍ«?ŠÏ{ƒÕoÖ\�Cý„GáÛz«oÉÁùž[êï, ,/ÊãBW{eµû9{q`ŬLs–Óõà¯z™sÄRÜ…¯†wÜVòhþœÞ×€„wrÙ×ÿ™Dîñíïþ»owÊÖv¿˜?’Eå*x.‰dmù‹ùX ò›iO¬/—8¥§+¦­l<\eH,Í£‹x79žOår‹ÕSÍú‹¼Å¾L `ð06"Ào{ÿσW³Þ &­�Á˜ï… õ,F5ò�î*Ìyo‚Ï©ü¶l#9�ƒñ‡oòîs¥ÇÀ •ð0Eœª\)=¯çúçîþq C´[Fž¿Øg}tàÅ�bÊÈCšÕ“Ì aå­%"×6×ËtÇ•ALÖ€ªßbU= éÙ‘Œp綈FâélÞŸq¬Æì,WÁ=ú¾ƒF_KÀe¤Yå†,ô8ƒ«Ih€òÎ|Ñ€†` àòZîi8Ì@|ÉÎfˆ€™?,IÛ Á*»êX̆teO<´œgÞ@õ�›�ï)ŽÈüÊHˆ^1ëÔ­óoÄù à#ç¥áƒfab'Äþ1ïÏ~—vÉ ô}Ì ð¤üô†àƸ·° NCÞ¸@¦c…^à õ=±¯’^ "¢1ºtÑl€‰õu˯öçdÎì—±��A™…;Yö‘»¿•ëòUµ`¾`*óuïy÷W<´°±P¿Ð´úJ|XôY\ñß“÷x홎ɳy³4÷VÐÝ ¼Æ?(¯E9ƒÎ¾3 Üj|ß“êå=°-ú1œyQòwPïð¤øŸ—OÉA¡}AÆF…}´ÙØðS{|׊5 �íâ0X„É�¨…Yƒ»”ðªòø'Î>éõ*Ù¬ S…ÈÀ1«³«@°}\Àµ(˜æ»â~ÎRy¤æ“#ÕóÃðwœ>íà†�Ap´¼+«!!6ä½Rb¼®.%.æL÷yq‚·F*ã¹ßCkà¿b1��øóßKÔnÜ´âÉQùG;W%N6sa/8ýjc¤7œq¦v�•ÏVèÖø®©´'‘ØÐ•-ó£ãg|›Üį"ÄNÖäÖ:S l”[Tù¸/�.uŠ¿šŒîpšR ËwÎ ~ÎçéYoQz‰Kh¡ ó�B•œ1dõ×Ü™snžm�­¼ŒÄżô’­ÿ;ß½9'O<ý敊ï÷,ÞÜÁewú IJ•¾™Âý¦šýp¸êf4�¢ �Ê‹k–)å�U`Wñ¯k†+bë¦ô¿«ÝöP_2ÏÏ-5ˆ’Áp™)±ÙÌ¥r©ŸÆóÄMï~·¬‹××Çgî7EÊü¸Ó>q ·¾� É Û\ò¯}Iq¯b&‹9»Ví·b+ÂDX§‚´!›*Ë€¯�^Ìú·æ:-ˆ}-.Wœ*¹Ü®I͉¿f5›¼>TÅô®ÌyÙ¨ôÇcнï‚mhƒU0¹­ðµê•q_5yùj( ’O\K/‡’Yíâa‹kÍ„òyB‹®#6[.[7xôJQéÍÞ·šÁ“Ls3‚‡.«Åª± RP›ìm²Ut'îÇ3Yi]–åŽh¤bùƒ¶2šÿ*ú{�šîãw;èMSÄ7XÖˆj?v&F_)†8æöIµDŽ·{Ù²HôMÔDåa»#ʯ!WÝu¸÷ ÍÂ'«Ñd¥äß-—×øw~R•×»�ý,«e ´0Þ°V$bÍ Yn©Ûå”D)›_,ÚÂÅõW�œ&-‘J·1£»èMðSá.`Ž-™[c>�„ÖVÄ*RË熧ÛeÇÁ[9Ïa5�Âê#õÙò™ô˜ÿw¸� èÅ·õj¿{PõëaKÃun’‡ž)�`h‰D ^«ZË6˜< Û'UÊYPŒ]u„ÇØ¨„ãCß¾»×1ÏGC YŠßϲ´Â~*Àï2@�‹IrcÏ.Óá²05©éο�fyÈnÉŸ‹û¶åÁ/á³\õNêa ¿Ûm¶Úãôþ÷c> ²õuÁäp3[òëÞ£}f”ÄêÆ?^Ó˜ó÷ ÁúÄ3MƒVª% Sî[�â÷Ì·ªHX[U÷탶íaœoÄ}hLUPhýò¯îá}·ÁqέVZÿÉ4½ò‘u¯¬ß˜-ëò=Ož¹)~ô"4 “Òq3­ß ¶•À ¾Çv]7mŠVäf‚¬@—ˆ÷±þw‡ý¬&ùýþÕµºuf Cñ¢†+®Zÿ—-Ûx÷_A ‹0ærEoL¿†3�1¿{¨û»B½ê¶¶Š¥6‡©%œó>$5q"òj�‘± Éð™T`M¿ß²èaD®¯óKM†¿0lÃxÑ_ØBÖk^{mZÕ_|™ÏëäZÿ¯LL_—Áê¦×ÉC㙣Q”>†&b°ç¿­ö~á_ÐÝÌñ7ËŠPI]íf§­S…‡M1…U‚ðˆ¶Tc9ËÈX”ÅVñ@ddÜž�³ `�Fßôìj?Úíoê¶�¿Ñù—ú0,™ôc«ymÿ]?•²™ñm�ÞÜ6n ˜·ö¬š�S ’œZØ7ì“ ~& …æ&üoÖôã‰[󤄱„C$æ¡Ñ„Ú°%6s´Å¸×°›UúBîfäÚ“ëzlçrvænt²DåÒØ{{T©q…Þrlô¹©2»RvâË_sÅn* ³|cS¬[¬m2…—’ÍÁD£ ë­�ûCû_¿­yÝ]?È÷m¿ˆlšû,\Àì+‡’ÊùŸÉ�w«3–,õY®ê™Î�Ft·[q9o4¤öÉß—µª—àëkã£PÉÊ�î&\Ý“|”î ‚Y繘I¤a5iéâ7Ñ•7%Âfy]ìô,Z{”JO�b‚nM¶=m…¨6‹TÃQƒü2µ¿Úê^Ô÷Kº¾5º -ʵåóòÏdcÙ{ó˜Ëk9¡3æ¾6×Uid’×±Ò1-°…b‘ëÄ[¡Û¶F ÁĆÿ&óqŸ¦ØýŸÞCöþ­o¶Ï\T÷p“Bä+Qòa…õŒ)jX_VµÄ¥D½¾ xÇb²ÿýYÕKÍ—IBð†BLëoëküí�7Ÿ´aßY»,«ÿïí‹éðæW9¶¶›#E €�û ŽÅøf/oÄ» ¼ãÑH§on—CÝ��~]}b]7»ãÛâÎC°tq ~ÿ‘TW{[@~ÞÖr— pÞÄ׿|—ŒTéÖÜ;1()7j¢ã‘á|@¾miw!ï8ÌEÎòÞË®ù›5é`Ü\¬Ø)D“ðå}á‹Øñ¯BKª~òyëVã*~>ÕqFAÜ|�û¥�ÂìKøV«`’ ]VÎ03Ó+¥XÈžúà™3%Ö‹A²ÀïŸk$¹‘ñ×Å\Yø\wܹΣ<Ü?«áß ªÿ¯=ðyzhÊq¿]}/u²r2ÕÎ�ij„¹XŸù!�æýŽQ*rƒêþ%y¡*[8:9Z™©¹wQ‘²I“(\qþ/!=ß„Æz6Ÿwn­�—<V�¯Ì51FiªÓygO,u´Ñ�¦k³›«wéÆ=\”׉D¿ã{ê¾#K;l”o{ZQŽ&!g¬Íë^´gs.ª6q7Æ­Ê>jÑ� g"2z°¨¤²ý™×·íÅñŽ*Ÿ¿Í…¹:-Äæ‘lWX·Ìac»ÄÝã(ö±ýsõÄÁÕBJ‹ Š=sŒL³„ý°4x<�[úÔI›g¤ÜS2[²ôë‹ûÞ#è¶'“h÷[ ­öÛsŠ@’5ËžÁD •{ [QÃ÷ÔÒ¬Ø à÷£aì¿Ì%z^–ÁØžÿXŒ´dÚ4Bç&ìm5gx*xÏØãô ·íÎim¨IÓi Ý`[qe›÷'5ŠkK’ª8#$ ¸3•hø´ÅUv0J¸ø¦–“ïáí”òr_æ™ß[üËöz˜ môk?†ZEß4TÖ<Ôtàp"€bKËl÷øà¼Ùf¸0þöS¼¼^ˆº”vf¶/�}¸¬ÐIw"çm[�R+®Õ´[SÒÑݰõf3¶K|—WÎ�I•ȈÚêdÒ·g,´Zé¸fzØ?*÷n^Ï÷m[nö„åHNŠSzÓaÌÃ΂æwé#Vsê÷žø”MÚÝ"£”øâ*ú�”Ø’£j¾®n~I*®#½Õö�†nmÖÃó¾˜çˆ{4(%1&Õ½Ö`FOaÒød•R´DMœ`òÎgÂÌfó|œË9–ÊâžaÙRž%±b/ŒSž‘'¥"yl*Ñe¢m#‹;h,‘Ù³LDêÉ;c�7õ«[:Û­+ò-™§3+ëZÖ2‚o…3»•BÚmXJ¬X¨®�‡)ª@Í"7ìG–k$o6Òéu½^ýÙûH ¢Š;ÔÁfÈ—¶ÎfžmDŽ;ìu…ôp¢ñaë®î$މÎð�¢4 ,ÄwÕØèàP*F4ÅJn™“Kªoe’ܶ1©É�„)­ÿ†˜I³ÜàE�±£³–'ŸI:M®HžÌ>(Ùwcž©Ô¹b:|['4Y<4¦¹¼TÃx¼5™Ó“” ¥<´P–ÄaVˆ�Ƈh7ë7/7lX®E' õ•rºrÇr’ç)ªéŒQ݃™(Éj0—½“Qšt`·¦Q![1�ËúÕâ&äç/Ò�MF?Ü�dh‘2à”ÉH–t®M”ÇR´ ±cŠO£L<©zjŬFHÙm›Ø<6šo§6ºÞÒÒUó�=f®(’‰j4š‰d]Bž}–w¼v`Ŷ¨V0†iššÁ³ÀCKÓ­/ÛËT�ÅoÝÅãºl4{(VeÛ-Šd¦}YÙfæ¾5KI;Û�u¬–ɾn�ú™hůIyi[í!¦DÔ…•,èñœ¢ùZ�& µnhñ-ý®ÝÔü"U9C0ÍL8eoÎÛ­e–‘P½êª^_]*�[ç+n¤DfSò\á›ÓγEQB Þ”gM›�I3¨�wÜ -¤5REZrØîl(¬x€º;‡_îšË«’3¢|º¦aÁS{[±ÞÆSÆ[Uªx†ù‹À˜ ¥w:mb�KD° Ž‰Ê.÷>ªÞ3ˆÍ×ÿñó¬�±¿^]"gLîðupÔWõ%ÆÓ/ìÃÿÏýþè:�póŸè£¾?óùà‡¿§®õ·4_†è[ˆ†ÿë_Ò¢_þ â/þ0Ðã Ь ý¬¸µ žtß#ÌØiãæiXÿÞ_¿­ epŸa/üê$€Õ/¦·!™˜ÊÁ“<½‘�� »‘qÑ÷@¾�ªl%<#;쳨Pë÷ß”_Mé?ï�½e�{ó¿ËYÞ�8Ú`:­û:ñ´ý†0‘ ?#ä~PžíÜ,æykhqKŸé–w_þq¯þƒòñmk\k¬·|²¢Á :�¢oþ¹ëeE׸س”Vb›[™aÍ‹U�Ê-ù†¿ÜNqhz=Í& ΄-µÜX‚~óö¿Íî–xïä^Bõ' ¼2ˆ2ôt¬V³®âræó²¤Bq¾9ZöC �ùq¡÷msT;{xóûS•ŸËt¾˜3`Ž-ŠŽÑ1hÁ®™=¶øWd™¼›óa[FZ1rñ±u�Çv8×BË(Ï[X¶¦÷¾µO6Ýí›ÛÚ‡ÕôÀºÛ$·èšÉ¾�´›ø®m •E¨èO³y ƒ%šC0¾}©‡¬Æ¢à»ßЯŸ¼™ýÿSÕòŸ´±“!iðn~Gå6½ ›ÿþ�X~Lû'Í?½ëÓUm99а:^«Ûh ˆ/((òÏ*âJ‡*a3dx·4™„3|ÈÄð>¾ùR ¿Ô¬ †‚Íõ� ¤t´�¾Q¾)@Þ÷â›Òž¨Á¸è¾×q«î3/i½µMe<yon ž™æ hüRéé6è1›Î¢Àü¤+akŽV)…•«ÉfÇbq¢¢±a�R翜YÉq[È`Çb�îÞ¸ê½÷z®5Ì:[œt:‚K僵 ãAîsX—”‘1ÐÚc‡³º±ä Þ�2Ëò·W¸Ç�Ë4½wIç*®ð!,N•¹öß2MÊŒ¼¢KI‘Zü>ÚÍ“¢¯÷·Kæ·=ú'*5œ�™ïµ[Û:˜bñcS5ŸE——¸SºÇȱœ6ÿ~ÓÈÙgy^!Øiy¶îÜ1áÎm´› Gtc)ûPÂm퉒Wü�ÒúO=òú$ˆ®œê¢FžŠ Í;áJà1W·”~¾ ËŠùnèj~z³]É}VÅX�| ÖÇ€³ë=RÑd/$a\„ˆÞo±0ŽKuL©°Ë€–h<�–+S°]#—–B…‹œ;½1¬Éê½ùIM¤)µÀdˆ¬“uƸªl/üf1Œûü�KŒÄ\ň#ùxÉëÂ�Üî4í»œ6�qqú@ú\nÃÜZx_=–l,Ú[}Ïu–ùßÁôm��5åñEs¾Ž+ó%Ï< Š|µ›µ/¤”¹Ôß+«Yí¾¸�ÛyCÔrÍëühÑ~4˜ò»ˆÝþ™ÔŠ%0�ƒ[ÕXaF>\èj±5lvöÈDJ/]Õ€Àr&¼¥+9o¤«Y´_Ëùãø“»¡Û~ëâ!:Œ XÆ£~;ÁàB=Þ0¯CôGÖý¹±ŠþC"BzB¢Rý|ú^Il¤ðÊûÝJP[|ý?…ÆÁw/V10oi/êIx÷ñÛÜ•õ‘Å· `ì˜3%PÜîfhh‹‹¶ÅþPÚ±°ÿÖÄ0B€³ýÿ}T¶}ûÓžÃØGp¥S¿âTr³Šçûãüþ¡ï,þ¦É€»í;^1æãëã´é\¯éѶÿŸ$k”èšîs K5ˉN ûM€9Ë­µ—‡] œ‰:zÆ,”¶¶Ý:¦5X*‘”& CüüvIWŒN3Z�,Q>dtv„˜¶”@ˆ8¬[`´]›¦¶"ä«‘aï+ûOõ×ËdYIËÆ;ae{c÷Ž à^©E1 ß]æ·¬Š!‡ÍÅs ±›ò»þOü‹j­hÆ2¡X0~䬣£�R¬¥bF a=y¨1,-F›ŽWœÇ* Ý!<ò/z×p¦p¼}.îb¨k¹Š"1‹´N„x–!1YŒn.ÌL_# ƒ’ý?Eî9 W—hVÖaþ ûsëW-j"u¶�Íó�q ŒØÁjRéÑp©°D�Ê[;}ô¼ÑgYlU^�n‹fÃxöX‰h�­�¾!d>îš láï¡£ó…†Â瘽Üý 'rÚTÖå7r= e‚äFH‰3xÌÔîë=}uƒ>]b>pª(Ç.-¢FǸ’lÔæÏi$õ7çCö6ª®zâð½Ú½°Wî¡ç¿æ0ô&Ç„U[´?Ÿ·DPnYÔUìåxúf{ÚðUž*-T"°¨U¸ë€¢å1WDà% aÜC§¢›É*òÕ™¸ø1+�ÞO‰»’en·4«�eóuMùÊò4w}Ÿ:-ÞhžŠþŒÒ,b½|`5ËÂ{y“&®ZØó{£÷Bí‹ØB¶Û+f×1[¾¸?wÏ[Mr¹ŒŽ÷‘ßF¸*ï¡Ë‡-Wmé]‡;îü�V¿šÌ0lbGUZ&B‘bJŒÊQ2í(Lv«¯[G| âEŸDœ…8í©³²ju�XäÀ÷Ìz~ybš~õE>‡MxPQ£îžëŸgާuVÎ�´Ûg:7èÚKd5%Î ïÿç yÂòþò £úˉÚqŽÆ£Eq‰. h¬“€~}î=樣(äÖó X¨3aIñ¯v½µ0}eoUù.7JàŸh¹¾ib­A±¹í.Bk7æ§öõÌÏì ?�Þª—{3�A<5?}5òTä¡–ûGÙ�"¡A¿ÛrJ*¬óEeXÀáHÍâÑCwõ>ëb‘B %>Z¼YvÊ SŠ m ‘1�a8P“£*ǾbÐRݺ`�þ›âG ËݳŸtø¡qrµœ&\#õ>Þ,¥¢âzC±-Q“„<Ïw­KÂünÞ0hô;Ë "sìÝ�ª¥®1†(üx~G'šÙô{k‰‡M=°!èŽîù=ë{KQ/ñ¿¥¤Ë¶E9 Ѓ!c¢å<Ò`ß"”*‡›?¿…ÍV}všŠwø&ˆ/ŠGi|ýΊ·ëM}³¿¿¨´(\î~ÙÂÀ�^20Ç0n0fÜL…]“X%í) ç°GËØ´1j‰wPX 7Lá¸�äÍHJ­(‘Š…ñÉ é‡à3ºÚ×AŠ…‚ÅäH‚×’òÒˆsptÞr眚ÞgAuxøÃq"³«Ö±­Ï¤é\쳨ã KHÐ7AmÿÞõþ�ªŠÙåÁ‚i?_5��–)´£lL�³-Xú:ŠN[ö­rñžk. {SSÆ—ìéŨúñ5±Ž8s 1¢�þ »Òsv¦m£;«Ù¿ÿ¬;Yþ ouÍÔÏülg²¿ÆÉ'ã{e-™·b‹$ÿÚ¶^Eó‹S·]¥ó¿ÄF]óI„8� Hy!JdW?å45[µ¼ä ¡2ö$• ÍäMDãbLx¯˜AÉ“t&gÌræs>œÆH½îÛ\:…+àü�p‡†ÙD—¦€¶yµüç›;j/ÓŒ»áeB€ì`$ÒM‘ë›åˆDÑAÖœÚá�BwsW:8׊Aäׯ›�ŽË<ƒm²>¥òYy YZ¬ õ¶;�BpÁ³ÑÚ<�`�Ÿû(z,Bù1‚^QX€‹mN�·¿ ÅpØ,©|15ÃN±«Jì7êÊ÷'9É­ûº3š_¬RSm p\ùÆßÄ�Ž,ìZZdP·¸ù;¨î.ú^Bíüuî¼;�‹¿xÝZð�£¦ž ¥åñÝ#�ÚGäË ÈÓ Ql³úÿ÷ëKÞ~÷x‘jRÒ6Æ$åe5¯(Ò—�V´ óhÜ‘B®l&‘D93Dù;Žºç]3¿oÊ]ö¨‘RîËLFõkY:ž)ù îܶ탫q¶†ª¼±Úå‡ó‹™�¯ tìöt>§¸Ý6#¯Í–Y›+ó»x=Zâ± †DU¯õ3§ø“5„ {4gÊù’HÐAxI=íY¹×�ç82š’¥|sy$�Zø(Ï!-H›ˆ¶‹[¾3Z½ñ B&ñ&zÖž“#œ*ÊÉ(nV%“òg–ì1Ä‘úb 3ãwnî2ß§¿cOZ¤n¶´ÃS§LGݵØ1o!+º&GÃQœs�¾Wu_Tµ� ¸áV`¾FÏs�ÓÎæä¾/ Ì3²Yôݤ„·}ŸÏ7�éû`µjû¡fm¶)&ºf�9­‚±�h•‚V«–On‡œ_=\ôpý³w~à{.ùÉ mþóÙ®’-©3ÑÃñºÚª ì¿#¿–K‰WNhO•Æ¢.ÿƒŠÿ¼½S¾[Û¶]�ÇÝŸ²fø"óè““U[a¾J(¾ÂvQ ¨4@¬ø,›Á¦ÍÃÎp„d @g¾c[bÕamx(Î=¡€ù$†ç„w�v�~è8owöèï)£×}»Éæ® ·÷ÚÖçd€¶žŠ´lTG=è½X¬hÀH=§Ž�'ÄpÆEÖ­™¸„=•ä­–ÕR² â¦ß ɼ"æI`UÜסKËÓ¬ÈÓ+våÈ ÕíLnÄ!rVÎØ¨É³½‹„"&Lóÿ%®]€qbn]{C°'\̈Ûv©uÆ8)2ŽÌ‚ àêÿ6nv“Ö÷Ë6ÿžÊ¸Þ+ :%Gûÿï< K— ‹Ô�¨Ý-q5Y�iÒÁº¬j½T¤€\:åm¾ÕbØÁÀa´Ck#u~2NÔD û-yòÜ[âÂÿ¼!ÙÀÑÇ8¾»}GX{tz¾¬MܼǺù¤«++ë×êMz¾†V#³Æ–˜ƒ¿ò"þ¿£hßê…-HÜ  CÔŒ†×‡Ïûû‡òPPý¹ ‰J×ïû ýÇ•‡$’Ëa£¿«ìy0ý! ,ˆm~söæ:t¡Bà 6˜Ãå맯Ÿ�:gò݉¾Qî�V›…ÙsÚÎ9DÑt®ú¹úèM­y}~rdÉóòða‘¿é13CÕëÿZL©°t·þô�Z- ƒ�ﵦ„W·þØß#‚òVݬÙs ¥‹bï5|W|OÅ;ðìZ�‘Õ'0a§|˜˜qÓ~¯´Ä‡$ÅzÞ¾óYÄRÄš›$aåMä¹]p¥²y!âÿkÅ\�qUNŒ>/¬zà¤]ã?ó.Áw>Þ×'�&Yâx¥ ¤òRØQ½•!–ÓzÌ­ä ,L‰LÊ»tTmu åáÿ–ÉU\/E_ÜpNu!ŽÏ{ÆËå@1Ìù­ëWJÆ.ÞHÀFb`@i÷r ˜ðï#YÉ¥*(ëÃ5¾vQ-°ãú¼ZÏ=�Z(-œÎèÕf'‹ Ýʦ>xMÛ�Ìfò½û :ÝÚ¤ö5ÁFÐàü­kxÞ±eñ4ç¡I¢&[mLR†Š$ƒMggfêkŽ7¹Á¶Zà~f»¹!ÉŒðJȇ¿ž�:ên%}™+“mlŽº�zÚ¾y륃/7¸Ž™ùìþZôþõ@éYå„Ñ™"çà¼$*BC³!$À<[ƒU"ð¸ �¸±\œ¥Ö(ŒS³» �éo­Æç——7KÜ&5³½Õ8C©ªnQ¬-ýCzÿ-.0«¬:ÌÈ�(Ö˜ö¹«�5œdz<ƒTõÃJ=Ä+FI—¦f¼à­émGqÈÃÜY±L½¢ÚöÕÏu� ¶SÎÞzÙEçh œx*wK SýB‚ž«¬±¬Å;A‘æM}›úwºqÈ•S£Bö®b�ÛmGW„öÃõnk]G½a°·ž//ÜHõ'«|U³|{íJxç¯g™€ˆ.AN꓇STƒ Z-ØÁ¨AŠŒ[›æÆºšpk¼�o�ã fÚ­lk'mDøûZ¸v²Rcvv©KõÜ×^2‚²Å§8*wÕ·Ûçeìkq�9{âoÕÉA³ÎÝ1—òn1Eå‹ÇÍ=žªä—i‹)ÛÆ:<à‹8 ï”�dø¨òFB$¿n›èâ«£(Ã"8…Ú±ÃÜÀßWYŒ1uhxåD.�¤�ß}�êÉÅß^uD+AEàÍîdÀrÕ„}¡á÷¾Å¡ì¿m‰Šë¸ÇÃo"ϳßÄ=!uH#‚G<,Yˆç¸a¯ÎH4'wà~²:‡-¯“![÷3³±cölîbÑËæ75ú¶½µ(’ý!! 纤q 0þaÌŒQ[+V zªóØÄ֪˿�{¡Ôã/=Pˆ -åÒ—!óÛ©gÊß·U ícCváŽÄOÆ3®†2ÿïF÷kÊa6s—ÒìµQ}tðy=L~#cè¶y#DŠÕˆ—)}ßyқⓅÔê,Æ¡x­ZOªÕb¸¹NOêéB–ÖzO.;Eµ�uÍ|� H@’þˆIJR€PP©�á]ðL±Iofú€Ë•œª(¸Ð,RffËpü¬Eþ©?1¹+gZŠïkXBøÃ2r·§’™þ§â£H¾ÍaÈIyD2ð‹C{…üPÐÁEÅjqÚ|åE,á"ôD«�…ñªúMydíS3~”aÌFU—Dð-Æû%×*ÆT=�DÒÏ“³fl`‡T\…ÈB“ry(ýâA+—±ÈYÅsÙ÷$N–¶ímÜã&4¼ÀW]�»@É"À-î£~D”_ÝZ–'sƒ’FÁå†ïÒ_"ÎàFïïÙNºTòÔ¶É[.L2ZE¬"“×È“3ߺVª ¼[9  ÂI&¦Dál-°– /÷×j‡]q6ŒóÁà$å½]Œ%†u—´˜±*Ð[´òuÊ?´Ï}g¾äÁ= .wx’pDÅAŠ-ï»'Æ)é†-s°£±×³³ÓUµ—-k2°:’æuuêMà`Ÿ9Lj*9Þ™Eà, "n š% •MYL˼F^Ä|�‡|¯²dD>Ö³cÎ öH.=Âgæ´ù¡W³ñà· '�`™ªX4Ì„Ï 8½0V°�ÚzÝ�v3HÚeÞÌúŸYÊLLùubU¾b:F *©„åz ]ÞÛ—ÎYV¼c¸Ûªá8¹kF^=•úqXO_ ™lZîíP}ÏE˜˜ï ôµ°ËƒÌ® ‡>þÅÿ@žÈ’@l”tØ~ì5×B¼^Úä'“ÚËDµÔú½ßêí�K<ÖBóP˜¸Só¿þ^nƒÝ[£�¾�vbÕcüe_ºŒÌ И?u1¶2ç¿ö2•’(niÙ߄ǢtˆDééY ÑÒ�~ygÿ4Ù,ßì=�Œ–~}±�bÒKŽ1ÙÁX �>}[^ø÷zêyÖÂñZk±¤³c‰)ýf8�”àíE!Zµ‘¡öœˆ»}�'j �él…«èWÆ”é^§U{#•$*à³RGdZŒ¿Ï}à‡t+¯Ì“³+ Øù¶àRµ™†:^Íê¢DoÏœ•Ñp÷ZA‹…±P‡ƒxÊ.}ð¯NšÉ6&òº�S«ŠÕ}’9lû‹û“mÎKÙàµ÷˜åýT=f´Ÿ]§8ÚÖ˜&¨'Ù¶·qUeðHÈ�ud\DGyµøømÛíXh·µüFÜÙ:!¼Ì„Šã…Q‰¾ÍˆFqSM }¤%’c™ã}Ï-½¶©’]:Íp„žÉóÛlû@ÊË í�8Û“XÆð1Æ{[þi{´=VˆÇØ�lêÍ î¾G†Ž‰ë¬ô[Ž´kkŒág“¦­Þ^v ¯“©å´Ñ{±–V8Ÿš·¤ò--Ûˆ†qP}5!ÂÒŒ”Š¿ !ˆ{0`דó¨7 fëN#,D•nùž(ôÝŠ³È¯š%ÞõtIhø†¹õÞY?–‹x{…L XµFþ‰E&��¾òžÑè×yAbÓ ¬‹@Y˜¦æ4¬6±¥öKiåð¸¬lu7°M{¤Ù¬J£hð¬cw,(+u“© x܃"Æ{ —…%ßS[žEÄèX., “&ü‘£G±ÂÄ€ïüTîáO G¡P«óÈûO‡²¿üñêýJ©l¦›ú«Á¹lö}<Ìþþ÷X§Cçµ&w— Mý¥4�¶÷þØ[>½h„ü¿&.ÉUjkJXú=ïsH4¸­˜C -—ñ ÁD±Äâ7Ñ©R!»*A{óV…ŽM4™súYB€ß-þ_¦êeâ�GbDõÑÙ[&é:޾Òýé´¯‹`�Ý„IúÀ¾ˆfýk„¦}´2Å^ÑNv¾)ªBxNKvcåN­ãÖy‹V¬R[5Gú¼0âîß�à¯4\™�—4­u­3Ê~W&ɹ{ϺÆo|õL­A)ÌC™N_=Â×rö¶µ‘f·Wodr†ý¿Z¬AâT\ó|òï•wsÆ[ ‘}|ßÉ7W«Qƒ*Ö:m¤¬©µ:c4utm“ܦÏdã^rT%|¹ªØåôFLhî£%Ñ*xD‹I8†Œ!HŠ{®$sre‚º:±ÈgQŒ<߉Äïgµ»òv3Ï;jièêóÓwËp¿{]nꎼ+%ïy®U‰ÜeÓV{ž:eK5˜ÃTJU©ß”HJ©¨´=�éºá,ùúÉûЬè#ÊeO�8tåqr1K¦˜¹]B^Æ-DÙ§%52˜/QÕô°Ñ2þv#"ѸÏ1×7ž�9ãýóûþð�¼’ææ!þjÂÉf†Ž[¯§ºåÿ”²&’'K�ÌŸ¸¿öic?µÚÿךxò½¿ß>¶Åòòe½ŸT„t0Y#ÉÛËoþ·'.Ùî�‘°õ¿^¿¶-~ù‚à=‰"ƒ�þ2_N-ö:4“ö%œÒž}¢ د½x�E À©QQù¼¸i;€‰6)§§ø¼±l]fî÷i–káü±<½Èøl`ò£Wç7¤_[VõøÚ-¦-pËÞuX½È×/ÿ‰›y\Eç ÅsÐ�å ®›ðPDzayÀã0P8ÇÏ^nÕ,½"fÍasF&h›3ØòJp\ªÆa 62¹É<%µåîáé¿ý/ìˆØÖ5]]uQåµ€Yf1S]½µsbÝ;>D7¤-]•­^Ť8Ÿû)#´_ë•híCôè†Zºx|Õh\_?-á4ƒû~h=äÞÄßÑôVùÎw»Ó¦.Yß-q4µã™Èå¦qÜù€0~W†2å³)ß8µÈ|£—è±\o™Lß·ÜžÉ3¤ûŠ÷eÍ{,yZÚë;ØõÐê:£·u9¹Ýw!ð6A¯HK¨B9a ̸qe�d›0¯HňõlA®ØZ¾s´ÉM¡È&�XÈ�y¿0³ LöÞåÑX{êŒΫ{žlZ¶ÊoxÒ$Æ…Ÿ�¯–Ô„†ñ:®£Q}Pͱš¡]LrFmg ‡^gÚ×›Û#éó­“î,ؽÒÔ §yE#ql ÊùUJ®¯0Í×V.Vƒ’4³ÙJ�´%†¯lÚ{BˆH[ ¤ëî5ñöèƒï ß’¯"üeò™ÕUŰ‹¦§Öõ«˜¨5b—7‰ÇC8,Eå åyïªïUk|Ê©2SØÚ6�=’r¬öžÎÞ ó8^E�ÎBX¬&B¸Ö�F}ë¶Šö›A¡åþêËÖ³iÂT«j�ojížËÓ±V—Ç™¨ñlf†ò �Ãî"¸_ òüumŽZ¼ŒéÈ:d͸ÒÁ†Ž­üÂ:çmv©ËÚ/fò­”cðÈsp’Seæ<[¿w§]lÒ�LX�!Ë«÷mx<Ä{ÛÅËÝ("‹u”F$ ž_;@¾ybà÷½O-nz˜;eän'a�m´Ÿ³zlÝÉkÙåI/w0XôD­ó‹Ì¤ÖMÊ[Ð,´Dšj!'YT©Kßó)§šAl•‰Ÿ&)xþy… ]î¿lóRî2ZÌÏþϬ¸?í�KL@ºÃÑËä°Çkýéµì½™÷G«pÁïö�eÆ“ÓW�#1“XoŽ,b¥¼9³–B•Ñ\¡X[\Iìf¿¿Ú›æÿƒù_1 OFPÿLY|Pê ƒ¼ßÇþ†û„º½á1?Cÿ .ÉÍ”eGÖj©ž é¡4‡ã¸ïæ´-˜Akºç‡~µû|-õufç„ì[ìÖ¯2“FfvoˆÜiHÝ · —· •’!ùÏ`-\u 1±¬»Î3›M TªÑlÕ2†Ê2qés2gÎEn_»MðÚYâ´[s8NÙï8¯YÖ”×§lu¬kÌ‘¨€I ]@„o>f;…åìn ª¡.Wsó"æˆS‡åê<|È�¼!Ëc«Lq`åó©Z7ìî¹×U—h?�7’1Ÿ‹:>î¾ÛÏÐÀ¼ûsbšô ±™S„éVd~O–n{ü­ß6ÝC†ùy©¸ ®B¯ŒdþµÈ#Xàš›òøÕÜû{³vtè3Eá÷vE¢ 㑪•O³:guÛF}`sæ¶¹Í=�˜ÂÖ`œì¦:;˜åN0®Å#;ª�(ë;ݬïs%àʺߺÚó [²Ðÿ1E„nV»Î%®-ÐOì³8/}c«AhåäKb�ô¶÷ (ï÷Ä¥—Å<ãO6ÁbÅnøž&É;¬ñ<ÅÛN¿®5��¢phï¢Ùk9µ�ŽX,ù™;Èâsy×_{ËÛ:ç;—-œÉǪ^QuŸ+9ÕÂïÛœ[‹±Û¡g¿TÁìQ&^šÉœöæ:={éóÛjš}90Û§|¼ í7šó.hdEÈ8Ù1 ]¯cÚíBЇ,M\]�wa„¿�~úMw¤éq¸œÁO¦]$"bQöœˆuÐ@_‹åÏíãüŠ.œ²Õ9ðë—‰‹‚æø­-ý¢>@&,\ä?·J­eqS¬¸Ü,ò]lg.Ëš3yO«<ÛI£à ëÑi›‡ 7 XWÁÍi ¢Î°åÜëÅÆÈ=b½/t;ìúU»l¶°•ŒÅuêú@ŒÑ’^>|cöµåÞåèͳÿ£a,¹Œç,�Trp7VöâÙæ…?E÷Š õa¦´Æ‚m Œ�hTýÍÃa�$0/6̉'&èÁ¤ñaa³½ù¨S›é_L8ò÷‹!`þ-¤«=ÈYmíÕ–g¾òã9"'ºÕ‹bÜî"õŠå£{ægÅÖ›·áÊ„� ]ïB##Šb�ÇH£Fk¦ gYp¢ÝZ‚ œíÎvU'} ×—oquÙErÎ(ÑÛÙáª&ƒAÛJ7“>ŽæðAo>Ÿ·z÷˜!˜,g«•¥Iâ_åt·ÄæðÜ{t#‘ýÝàÊë÷³ÅŒxK«Ù�µ—¨¯”´c™–N±3¬Ìظ‹Y¯ÅÒŽÊDk!µkÙ ¿É¬cû~c ô|wõˆäkq´¥O(ãÝKQÓ-ü­7«3’œÇÍÞØ�Õ³ŸŸ¾ö²èÐxä{�L0ð=ǧjvj�Jaƒ‚Éø&Ñ{qà­ÔÊÌ!emÝ_¦^PÛ}kÊLçd/ã®G yNÚçMé¼·›Ý’~=Óº5Àد.þÈ}hÅâ çÖT¨1‹yšõ†w–{ûm j_ÖÄ)`yÛQé88‹Î¬R^�å(9>§ceSçwo­‹¾ù¡†iƒ›ZVZê5«:´³4€¼Æh�Š#‡:ÿòŒ •Z §e¯5Á$N %Õ±2§6X•¥ßiÂHU#{}p1aÏwdß[»óŒ†@­êÍþå#A8˜%¾ž…ÑÉzÚžÑF[»ËxÔSíô&·X÷XL 3ö'bc˜àO&#Ìò.÷²A0æNãGK½ijïâ„«©°ÊçýhqaÏFUnk¹�œY‚É*¤asàp¹�ÙPR­¸„H.Ä+¹±¦ƒÉAA˜oW$�j/‰Rñ¡;Pctv'ÕÐ,\ ˆ(ø¡®&y` ,i§Œrˆ¸<�ƒ,åYŠChmPÒ�Žõæ/ØwóÒi{ÇÃ…Öæé¯`¤?l7s°/îÏxïñh¹�aSÈ D?åÏÒñ¨üý?«ÖhƸ”zm�ƒ¼LŽwÚ{ñX3çJ*4›Bùõ·ºÚ's_}ò‡`\¿ÎF¼îÅœGhh°§bŸ{y Y¯†/ŸŸœÆ^?ò“€t)¨Lqó÷•MhÏñ%? ‰(is·bpýý+G·ZÛ­1§où!zgçO—ùoÖ†"á¿¡0¡»õñubßo»äfU¥sØmþùØøFû‚¼�ïÛ÷}Q{J5"¡Ì.;’1FòIÀr›‹<ëB}7ý{y^?‘uMÔ)7M/‚è[ÔÞYXis„"iE†^¾$» Œ+[”¡Sê-Ü Eë_:„H`bo(¨Ðs¹Á, ˆÀA|~ÂEä–Äp4Ó&°º0£MªÆ E ÛâælŠØ´ –60h€ L¿Œ‚ÉVãÖŠi°Yy¾<¯É¥Ù—\kÌ åëò/‰ã�ïUß[¥"ç=A#• ÛªÿsvO]¼úª,;ÈÅE°\ Ö—tå¿û\Z/+sQTÝ3ƒÔ¸g›bÂè97üŸ¬pbï„¥Æo•±‘O[³Å¨ÓYŸ• öÿýl*¬¤áº ðBí£uÏØìCÂ?Vú]*›RhÜËÄ!nŒHr|U‚ájÎB z)ôºîøLknL ìÒÏ#Zy`ŸÊC_Ö÷Uvv¿uªï‰'¥ÈºnéUŽ&¶®&ï‘N • ÉòY�ã2¹ÌÙÓif‹•îz¥Îš5¨@¥cÆu«\´×6¹5*EI¿Æœ(Ì’VȰe¤çQ4ÇabÏÒál„=U[VÍQðIva%XŸAí$§cs}¹˜¹¥&”Ë/xCKñ<[%àðçZ;PÅ!ã0%nëu¶t¯Ì¤ß9„Ec³•£Ú¶§—ª±wkÉ“NñiÚ٬׺ €È«j ­µªƒ#pIh-j‹–êW”WB[½y+]°þÓÁ vn]1œ2¿È<Á�4Æt¯ZÐ?nºÂ8‚Û�@›,ú~½œaìzàÝGßrZ¼Jý�òt{1d¢ ¡ÿEñøO_´;0ÆÂ h…Hâ¾åõœ åýšª*î‘y G1FÃR�ex‹öóÍLþ¹md¿ë7ds×àÞ‚„˜�ÎÑÓÛÞ½¬�*Y"Cùf¢5MçX—òõ¡´}Y�O(êI(ÈÈÈÁU„‚ÁÁžXξÓäñäbα|Í �ñ‘Ù¾ÖàFq›ÏxF‚IF†2“ƒ �fn$Y~AGzq*#�•‚~8Ÿ7çBö|{ï&p„ÖýÚ9¥˜öu”ŸÊ=[3p–¤SöìSu–ø‘×d;¡¤Qj¼™C€iQEPD@oÂÛ(Æjhò}îk‰é%�‘Ý�t:h0ç¾Æ™?¥Ò`‹ñ�oÚv# ®m¬+_[ó÷šÅ«š‘o]|['QzˆD=ô×w›O Ò={G`Û�z5^áÞ÷êÍóâ�íÔäo|o‡{€ð³´DØ+…Ž'2ýGÃò gç�ˆœx9÷ö+œøäc¸ýò�%´KÖä²Jñ‹‚?Ë1ú.h~düJ ìVoœóÈù¶‡Ýð·Æ¼½k��Uî&rBËÇÔUÕ½µ„Žƒ—¸$ †OŽA;àybù91ä;Wy|y°þ_S]×iø;v2á!œí]Š7 ? TÑ ³œXnv²×õÆHÇYmöVnk^oHmµžgI^v¤¬Ø4D+uzÌ\v n^r'×4Ës•ù4™É9-œÈê£ßzBŽÒAÉ:uòáæs=òI¡$Ù\"ÕEEÇË5Ø!6ip¾S´çDwT ÁõôÚß>×…Ïþ;p„'´Gtý¼°Ô3òñæ]®” ñ)ûéço8*¶jéÌÚzp�5^"²Èôº\a@â�µr¶KmÓ‡ªrð]Ì/ä.�#B—:@HÂ1u>ÞJÅ�2òѬŽÎ„é˜U Ò¢�Õ?ü¿ûæänÄ]ÿk¸ýØX¨Nál^]ÿ3øÑ1r´ÁÛ1fÉ>a¥ÿpx2<¹iïkTX±Îæ=£¾?"áD�)2rÁ•e†²°¢ç¯Ã, ? �Fm%Çê%5…ÅÂA…ÏãV.9¬—HN΋ģ]FMŒ‚yçý˜í¨ˆþõ îK³äOoìX5›9§¶|ïØþY·®K_ŠêpDzð`€õm�È`þ[ÞñBåb6uƒì÷•†lèáv‡åíÊ '“{Æã"œPl„*óÏÔk.?!†1ß´:…‰Ÿ�Fš#×¢W¢5¶Fœ0Ö9î8ùwðçqïh}rí, ”Gtûí<ûÛˆëŽÀŸœ+‘]?âG8ÇR\OÇçÛýí×ñ[¡ú“À|7]ò•Šgïôp»ÀF ǜϸîc=¡üóËÒÇñÄzHCßLWn— ôb²}°¯Ü62O>ØÝ‚”�ïd,n F’iâ$ø³ã Rhi: É®)�K:[#6½ØÉ(÷XªÍðEÅß:Ør@ŠÞñClæê A|¶JTj}Aw„½EÃ9h2@ÃdšÐo«Ìí/m¹’,úº½éï# )ëé?­ö]€Õ´âÙíÎ|ø„lW¤ L`%Þ8Ѿ'Æ¢qdµÀG9R`‘_.¦aR1ëj4�¿Æ%íæì]�—.-ì+G5LvÒ4¶ 0K»¤"òt8M¥YÒ•6J+%ÎØÌ¯Y¨%@âD2]Ø@û=ïƒl8úÓ¬…ð|H ‚{ ²Æ�k5v�ì™^�ü ŸæµàËun–K&‰—m4ÆáÎùñù¸õ±�Ø�=�†¬Çb¤ÈŽ#;|Ö¨-·±Î]Aò ¡�D1.×¹ö@‹LŒÁ´¸Óº² ,¸¿´æ$Š8B ~´t®�*^åÙÌÁˆ2 sËsTÑz¥1sHqíFf‰dÁ _Úe""xΘg r(�nN@ÕÉòÖ½.ÂÓÉIâYf(eÕˆ-èç§ŽbÍOî²(ý8Ë»à}Š3ÝF¬¤b“$q¼çâ[¿lð6¢=�9âPBŸ³íB‘±åR}Âw öªu‹‘gKqZ³x‹‰GÙf´ÕJÖ;ÞUµ6Rhs$e# K˜‚I²¤i2¯×R­wb�ñ¼¥» ng'¡s†WM¾ø¹5ô™(‚•ˆìZ6mâ/’"{Xk{ìÚ³m‚eMbå“6ŽbtÒ&okÜfˆh¡lûs+]àÊÕFf("aHAÔ: ÚϺ@�7”µ–8H9Â„†q;¢R2DÕNÁ"͇t©ÄÎjl�Ç„xÁ-Ÿ×j«:ªòë¬tÓ7Á Š3„jß/’Ísˆ,Û `¬yýËiÚ[•µÒ�=›/V�³]6–¼˜œYE¦ã+›V˜RPÀ Ò÷tM êŒÌ©ÙåóÔ»ÙYüçpö=àZkh:—GC@´o«•Ì¥œ5©Éw(£×¹ˆ„IŽ�ÊÆ¾Ó¶µ›tqŠ[´ï?ø¬þV~†,ôc ºO«Ø4µeC …ÁžO” _woNy˜³ÌBLäUÄ·"ŸÏ¦Ö°¬kµTÀ<>Ѿ´¯þ>\¿nÚÆ›ã§�¢´‚šÆeü | ‚™FS?ü›V=¼|‰ÿF%V2ƒfT)µPbsöœï£qÃl�•Ü,ÌW›QË–¿ÝÞ°ÏkˆÀ¾Dcªòc¥~h¿îZïS=ÝÆ,"ån)ž·‡é¢QDV¶[ä/´yâd¹»V¹ Å…Þ Dw8Óì÷*,¤m·ÐúĉЀcglõ`Û"8 D¯mª &·G›g »Þñ<^!Dq¢ÜƒØõ+xÙˆ–ðŠqÒVêà+^r÷»'-9ŧ…/†½%�<ï¸\¥D{#i£—•†=œŠòʨpž�Ñ˼QZÜ®’¡6�×öÑyB�ñà±k6¿~Œï\ÿÎX7}Rã\ü�ûîùÚó#7tµz9{=øŽøMÄ´ÿ#}¿}¤{Øî5ÓTc2•ãnË´1ƒ½µl‚a7ÖÆ<º›w·B|ÖXì0òÖµÂâ�MæÆÖdõ*ídÂ+íXìt ÃY¼yx;`2mó—:a™DÍ ’EA¡ZÜϽêñ=†“1”£S`�(fw†A¾[>!¼�oêÌùVÍ¿wË�=ÿöÙÍz°�æHæ:¡_í�Ð,’Iý(>\�ÿÄ^=}ÏB•½î©È†“%p`�pŠA׳ÿê¡VI½ÖI¤„÷†iid:ðÁãÖÖĉqü’vú}ƒ¢l A´3¡ûùq²ÕÄXc P Üä\r½ƹå@ A Üç²[K7E–°z›aêzéãNä‘1Î=‘oáÚ¥KË–¹°LÁ†¹£*Î߃•�óÕ½G9 .…núNó QäÛ'šÂ>3ÞYpºŠ¥öÇeëØ ê F»êIS@�+Õ;ó8“Æï¦$NÄM«àƒ:y„pÒX]#«Ïü0�Žå�Ù«©ë0mƒw�± ½Ý**Ù[‚Vêêö,7þÚ–3hŽ‘|_|�tÀì9Gv�(-±°ÞFפ zWÎ�#Õž|éšäÀù€ÚjéhFué›Fð¹©.:©7/¤ •›{##YâÁÎY\4rÎÁÌgk]”ØÆ’òqÁ¶^Kv››õkú°¤ÿ.] K%BfÈ}ùœ²®tw.á9œ³g:ˆãbÊàÏ�EˆZ.«ž˜Sà~NŒhbx:äç)¸ÖÚsÙ1Åå%O¡ù”­  îåƒåhÖ%N ³�_ýX ©ÿ€Ï|ànv3KÒé˜,lFCâð2EIÞý·1á= ÕNÝõs‚Ò}˜á<[lW›R�#sG>bÃpX3÷:ãrñd%Ý2¯æ»Ò~âë_ï¾pE°Z�&ÁWf´Ôœÿmeå)NÅÏD1cëÆŸ´—7½ók!¥�Š!l_i¦ÇDÅ�Ø\ ß0ª �bEçÙ~ë•þÛ,-ÑÈ�›%3ºá°Ëç=t0õÁ·]Xè[G‚RM`”vÐI6ÁÓÂÀª¾4¶*ÌÛ ¢fÁŠv�étÊk$Ö¯_}rËŒqE]Âfk"-Ž”—´P-ä;ÊË“Äñ2¦¦öEÆr$¡��Lcvò&~A@x,x÷' VùG#ßWÜ|?ð=ù¿÷Ñm±ÁÙôœ=ãmCÙ]’)ºSëgn©iñÔîS²gq6Ù͈¬š¨ÝHe8°wRèвêþ�Øå�K�‰zÿzÞK™øüN+yF¥cRGý=`xD áúŒðÞ\1©Ðt¥'k{l¾¸�1q¨Ó».Ov—ÄÆ%[E½>§&W ú‘‘5ª"š;%­f Ÿ\Xv¨Öi™¬>L W*°�sçqo™Îý\çÜ¢ï>®®UezEû§—%ióž°½ ‡õOEhu �od:ÖͪÄ-ÓÏbYÈ7—î;¶Ñ‘Œ6§¦Ä^>£hêÅœf¦žŒQ¥;êä¦ Éç—µ`«2¹�A-ÚÄÎÿð’Ø‹{ŽšvÞp¶€¬+Û¢¢Ù ·; t€�ç]r\´Q_‹Ù®µÛz=MBBog¤CÌ5^Þ¤iÝp&/|Kæ¥îa¯‹Á [ÏÚ-f"b,Ysœª•1Ù)H5¤AŽ*&ž|™Á‘K²�HJ@µôŠ ‹$Wá>óW›‹ÿ{Øüy[ÏŒ'á•Bõx¦ýü�wÒÒ¸j£*©¢dְש‡ƒ¸l�afòÂ5+^ž-C\ñ¤pÄ”~IªÅb®�Ý¿ P<òêÖƒ6AŠŒatj\|k·äh=¿ú]²`ø=¯iŽ3E<ÏdìW¤KYQm3)�è¹*¿—pT(�:ç8óÔ,F=‘dæ‡èF}j-´œ$b=y†èbï…7„Á½²´·Å¼Ì/í8»«á‹•HÌtÍ‘QÑÆ®LŠ,›Übk›FÕþÈ$ׇË;ÜúÖjÿïÑÕlãK‹ñ²:ñÂ�ñ�¹O^×­ Fuþg¡HAhF ì 0ï;Ó©oˆŠÖ·0tãØóWöÛ)�Í’Ðcw¥�ø·ðòÁÜ_'¡ >ÜjçoÆéE2õï),¶q?±ÒÏ—ÁóXÒå…Õwº†mbö°÷ƒT¯ñ5î›*0EÎ-÷äzýéò,±&õ{fóÆÜ&öÖHÅ#ð—áèÀ…"Íá’üZ ,ö+îy‡Ô˜ö3zß­æ6†§,e¸1ú4B¼ø¾ZÛ²è¾!ª€N£¾H’Ï ¾ |1¬åûîÃnò—Øt0Iû=k¤kEÕÔit˜Z«5|°n uÞŽ´çK¢É¤xä0è4KÃZc˜õïïo±q¿ ÂtÀîNªûî)yÇ¥vøJÂEõ ã—™ÏþI z?_¥ÿñÉàÙžü_lSœCI÷©H¿£Xùmw*"‹ú-[D‚—_Õ™ËýÔ>Û4y¡“žØ¢.#C–�Ûìâ3tÖEï#´vU»²ÿmH\nö»ß"ÂZüí=Ïq¹Œ‘u®' ŽŸ»½ªÛtÓ g›â9Üà»­Û-ezù<ÁCc ¸XXæå¼½Ë¯Ü¸ÏM†wÓÆWc¥½¿j^ÅÃåé®®u°dY-s!DÊø¼pDX6C7_•…+äó¢ÖDo[Ç–<_5ÙÎs•jÆ¢äcZrfšÈËæ´4a+…qš´è‹G,A„ó3Fá«ÁÈ T›Ž+ ,™ô·�Ï¥3¢¦�­ãäv¢âÁ7׆oÙ\,ò�;(®VXó)ö1…Ç/|£Uµc¹¦l¾§zd £ö‹ «Îx;QímŠÁ/CM¥|®ºÖhâΩ%’Ä…ª¯ iâH/fân¿uýÌ�äí- EÆÑiýáÚ*Ê6^£Û$UI�β=»(» “ûdá/6Õ&ÜD'‘´dÑÖ®f Lk nS­äñœÆØ—ž…ôÛ‘¸a,ó¬ÔdÖÛž’‹*†c¬c²ïýÀ…,Õ÷{éÏ+²!µmHO¡SÁéü±s¯ J/ÐK>Ú7n•ìí3¶ÞðšÏVD¿g‡;�ž�5®jÃ}ü½ê®Ñ&l["‘„ž{Û‚ìÄ%˜Rž/¦?}SÀ&Àtî5J+°tÖŠû¿±¶ÂÅ’øÖÚ� Õé98*½$gvI6ÔO2¶•ïOz‚Ñ^qgÚöäA—m w1gÕï|â0Kð„Ae¬X]v‡eæ)[£ikéö jO¬’x—{ŠÛGEáûe¹¼ÝVdžô¹—7u(5Ý¢oÕµ¬õ^ÌYŽ å¤ŒŠ|óñûÛÓÏÝlä/ž–ÿzËõ[‹R¡ÒÞã*.—$ßÙ(òÅ™ÆfãNÐCÆ+ŽG?³Î�ÿvîZÑëÑãÒ,pÄfzRö)¹šxö ‹iN©�ô²JfEg¶á®7»»m-}{ì&žq� ¹ŒÕ'—Ó¬ê†æÂ�Qfv HÂϤ—Ûï̵W·ˆ÷6Dínm9ïv~‡œ..‘êÂYŒ#b¤õ›&“³4íqÿ„›EV©Tñ3ƒu�ëß÷¹A?X}î+ô?&¡™>èù; €Ð—–MùæbÒèT/BY71/¬ìëJw Œ¡|Ø‘¼’èg\`60ŠPauzøùO⼑�ébÅŽU'*¡í1£àþ¬šc2E~#Bt1îé%®ãTvƒ¹:Œ@qï*í‹b[U{õsº6cb±¶ZÏBMÃ4Á–0‹;¤ +â’$P<‹Uùkf¶²j)´]FZš¥3zÕ6$Ø%r'?1,UJÁ¥¢k³šþY?èUÒ'‹gAÃkg ¦ÿ•ôã%£"ÍîÁX‘b±ÎÙZ_ZtæÕ ðeúhÿv…cé‹_/g¹žRN€ªX߆^�¤©¡ª™$µÑW¤WÿÌŒýl2Ìc³�™Âyx„Þ¹tþÇ7KÏ ‹–5Ná§ߨK0¿UàÃä´bŽd8‹¨ i“zT/µ(—¹ûk&a¬;�µÄ©Öðk|:°YB} ûzo{eSÆÏû¸-æçÆ•*¥ÍN;z’×ÔìP¦9³£œ3 �îuc|ÒBZð‡.G†ÉáŸK¡Ùƒ^�H„¯1ýÔu9Žß·‚LZ<±ëëY-»4ÙŠì—ÓYÙSµ²©‘qcJ†yk,jËlf¯.A&«*˜õ%fôЦ1C�ë I΢'wç‘]¥»‘ <ÔŸ$£šWIJàºE±Á¬MK6�0A÷lXÅ¢!��L_þO¼ß랰Пñöÿâ¹-võŽi>zûZ�¿£z[h¶¬�Ø ÷øÖþ ›X&@éЊÙOøTßmW2$|ûóÖóùËáÿÚ¿gæ<í2ÍYÌÁ²øç35d�ðÁ:@ÒÞmε ½4ýÿJ§—úÔãVˆÍ³xjö— aJ=Úrƒ]% 6)oàî¡ÌÞN7°pB9qÿí¨U¨H¹ûêô‹¢]r.»þמ}‚¼:£ª ªG^Ù½­>~vóïƒ$U÷ÄxÖ~q»Ž=ÿª,ÒæUHI7Þ¬TÒ†óü¬ VÀfþiÑ`ß1müÇu­—*<òÝÚô·‚:ÿ) wÃϳS”ôˆZöÅe,õ*B…Âåð§�tnÆÈ6—�bD«8W6b2Ex]°ö}Öæ°sýö®Õ¼¤•j>.«ß£ÔEÅ%Ω:¦ô›Þ «o…¸9Þb±rð¶·%Œíá'Ó-^jzëUÚá¤ÒPV'DVˆ)äÒ`%=Ũef3£Œ“S=”¤‹[3¤fH±­æ•\cËkMÈ*:p¦ÐÀ/5^N÷ˆuoç¶Õ�ö4ð?Ìý{e,57AÌimlBøÎ~1tQÞkäŸÙ·‡.·iŠÌÂ¥e §=Ì7EnR7f•´�ÄÆoÍj¦äjÛ†RVز‘ر§»Ý:ºq¢Ç–.… µºü‚î9G�V�pi•�–µ•)=ùzšåaWv±ñ˜­ŒÑŽ8q>rw+UN‹¸¯¢ z`Ýcµ'[ˆ›ð—€m%Wf&°#%UZt«xV8[¸âJc˜� •ÜöL”ÑR U„y³†Kå˜lÄÎYÑ›`;oR¼xÓ4Ûÿ|(NÃ¥ìÂDx² �é�Q{……õÅ‹e)�_?l>Q“™1õS\_9V$zM–ƒF6”r äDÌÁŠ@>�âR\΄.o½‘ ›`Ýõ;=.-íß2]CÐì‰Ð G›±ÝÞº€Jk烀ƒ ‡Åäǽ5O­î‰Xõ ¢ä˜~p·H¤ ý@Ð ‚–ÊÑt�¾ê.ïò˜�WÏ:­ƒ7íƒ?´žl=~üxÍ·AõÙ7_æÞmWë'›÷¿~R6ÒÁŒ \”1I7Oò޲¬•áøP™êNŸž6Ÿ•5bÃã6P25•ü:_/1ó]‡©¦·Óÿœª¶£&ï§Û¨³ÈÈðÐø¶Qqô5ŒñWË"æÓÙbX¯ð0w¦B”.@WS!¼…^Ã� ³n­1¹+i¿jµÏ”G=—»kKJ‹q£„ª•'\Õ-W Ì—NqVl¥�*·$µûÔënjÅÆª½q HôÍlÂ\ ·)&Ûí-2Q�3‚ó&Vo†äÛãeJâéŸÊÎ/TS «Š¯ŠKWól‘ŠÀÔ"äcq2";iôrd±^ר©PÕ#³*ÄYˆ[ã’§ŠTê×,4a×Ýö׎–UhSžÖúõ×;_Äõh7aÙ͋✳&ñFjüÞ®·•nNei° ìb�£Ï»·-7³½ðü÷ûÕë�/$¶=…ß/â_aetqPŽûÈаÑ`‘Ó%agK¨d«‘\â ~¡g2(ØJÂ�ó0bË�í¬2_™Ô[ÿCÆë´â Y%,F:¹­ ÌíFögÍ�’ÐS·Œë ¶©Ñ§ûÞÌœQs­¡1H2 G„…-&4[à)üŽciÐïF%Ù`• ÙOó¸Ãÿ;ZX£ sûÛäüÝÿ´Ùà[Ñ�¬"%kCÉÇzÂ^ïç÷xñSG*Ÿ×�k�ûçšýCq-²œ{Ë‚ýmy&ïêjÂyr3�DS�…ÙçÜb:4/æ<\ù‰BBÍõK�ó5«—ò-øNžë·XjÍÂêØa8éãmûü˜R/èl•ù ªYÍ£dŒ³‹ê*zïTÊoÜ¢ý`nüÓ��ñÇÉÕ‰±ÅVг°Þ[M’5á ÎhØ.ó˜PN¯Ž> [¦ÃßßÅI—ädfí�aË=z¦ÏN¤›_ï_G&þµ¿‡�¿œ-R¦9yaï9î~”]άnÂ}PwVÖM"ækψVö#ê¶naž17 YDµ&fÑU9™™±º;�0T L`3’¦,ONÈÖç±¾Zz–Q¯“£)œýáÞ?’²_ÚÕ>ÅëNTfþ£ÿ—y%Må×þ5\Ȣز°R˜ø¥Ÿ8ÑOë syöß¿¹!Šü'�ɼ–,Ãÿ�}©Gã–ÿX`˜† ,±W’ç¹@/UƒæÞ:bÊIzcÞ1ËN³Ü�oÎÿZmîþ锸+G(EHžå„ž=ÿ Í#7¹œ�ÊëášýA¼£×»ûûÖþ+µc:º%‡:n#¦¾¯‹äo=à!;ºm|™¶‹;™V4ŸCu)Ùâö\wïu�ÎMÆÂ ² n«¿#xźZÈä¦{Æ—ø™Ë]ä÷:=¦îÉlÎp ˆ´k«§¾6'9¼8VïÂéfMÞﮂ“ãVÙZpá”'<(Ú¦< oóš0†D_ákq�én›KËÑ£@ô…Íqµ®ZÌyèž:=è¼rv^ñÿcänoÃûËӶу(¾‘Si´yKm€¹ZŽlP©z7�»Û4ö÷JÕÃ’fÖ¼ð0Ù"ñÀîNSÉJͲn†5U±Â�ŒjR§�„T”¶£ÊŒŒÚ4Jd™ÂÚNc(™kP÷9­vQ4aå7vàM—béUvúвê×·„‡ïþzEu‘$–ÿj¢}ÛCÂ.*„Øozð³€&êF�ÕÕÅô/\ÈÎî×Íž 2ØAâ°Óe)ÊÞ¦½“6£ÆúDš÷7#Žý��Yûx¼B¿íý÷›ŠÃ°AòÓ6G¨Ã(>~é� ²w�Ûh𠧦:ç‡÷íÕÆv™D†^À©J€ïY”÷-Ú{˜zî Õ�Û7Ú�‹ '„éSü…‡ª!À‘¸Çä€xPûŠƒ¹•‡- ö¨Sòyv±ïv,5ÕTþÃìÇÍ’¯Q:N¸�¬<0òi°#%^¼úëiÞ'“Õ¯:g‹ó¾áÔå �hFÏÝÜ([lã¶Dê9,Œœàô¿0h—¢Xïá‘fßÂØ7åR¨‚ÒÒðrn'Úô”‹>Nl3³ã8ÍÒ�Uµ}ûBÀvà˜Uó�?©Ùm÷Ûnî~�M‘‚íE�£©t9+cľ�3å3˜“ ‡YðèM�ØÀ1‚Q“QDD.Ù †Æ6jã[¿âx»=’€îz²€vL�>뜞GN&3 þ²?ûÆ·î‡dé,¥¡qü�y˜ó€‹É¿á�OúsO�nÜ�Â8n}z©Ÿa·Œ§kÁ½b¯}8íÚ•Ë8l3Ó¹½£[¬¯`ð B <_mIæ•vzM¤-[º:¸ñÐ@�‹g¿óÌ7êãÙÒóY¡Gï_T»0KÚ!!"€ÒZD‚ñ߯¿ªRµù-Çòؽ®vã}Ò³e‰._,HKãßý?«}uïâÿ57Ù$·êµÝ­®ZÉm”ªüómuµöÓ$4%§·¿Þ¬pÓc‹è„,&…Ý¡i `ÀZñåµ9ò8ݯŒè$�¦—Qþ†’F€IŸéÊýÌSùOªvk÷ˆAÝ€"bË_ê÷:Ì/�®õt™î-%V�ƒë~÷ùéÿ0Ì.9 ©yŒâ¸hNÏ+ÒÔ­Â)ä¬ôÇ•K¶ 2;§iJ’…À"Rã¡ùï Þ´ô7.ëÚ á÷¹‰‹ e|=a–bì¥Öm\Ç·±]예™hnkþ1Ù[u3~hñLÏMÿ©ìˆs ‡™Êå˜mXÌ.õÄ ôQæ¬u=¯(Ôr S* ©CYë Ù°LoŒÞðÉ6 $Ižùµ#¡eè8"¶@¶í Ö|û­^ T7ÅrµŽQí‡qÐ8TnœcÞ;Rèl٢ƨo"¸ÛÌ÷”\ bŽöyWJÊo7ƒ±=¥rlºá… Z’­fçI°ûÅç\œŒ³g/®fŃåóL”79³êd˜íÓøXG›:0¥ö©F™“¡—ôñ~ˆÀü‡‚à¤3ÿ}âhc\lí…ª~€ß=��æ°ÖpZ÷ZLݸŒÆŸ=n²v”ÍJÔ¬ÆùYß•9Ü6Í‹4îâmN¨8ùGÏt5æXôée‚Uyñs¡+ľÃÊ#ÝΠqQáêS•ã(Îhñ¯(U7YM¼®Rö¡ôƒHÈ ÕÀJ¶®J8•≖3—•ï-¡{¥êø�6Îhù´w1´sxÞ³¤Ú“ÿX²syoîGFIÂY}øªÚààÚ£sWt_œ?˜|­e4ÂêÙŒ¤B×+|AÞ)vq°·†Á´TꜷÙ#åwåòáf¸ÔM»sޤÊ�®4^¯±êuþT¶ïëø-|ªeVR53žoX©ŽÌ}àvb`¸ ’«z–~÷‰†À ô/uÞOñà°h Ìcƒzí·Àïž0äpøàxˆ÷ÉŒÐäó³2o¹ÎÚè[:™®zÛ…|:ëÍ~‹'Ó�Zà×ñ~ôcyR)úÄ•¾CG\yBÔóø¿à¥¶ÛòïHao`þa�ÒGÁïøõÉìÿ‰u¤��»il=-á¸_Õá˜â�^¡)�ë"—ÝÅ µ¤ï§„ëBó²:óü¸t4¾Ö¨Y`ûi™óW.ðՆ{…¾tÍ!¨ŽfºÛs®˜ÐÅi à­Ÿ–�ô2+õ0P\ƒ±+?¬¤¬ycð¦s•h ä1;0OÌ™¼¹TúV@¡‡.Î�æ_8ïžðØÍkš¤ݯñ�ýo;Òô,ŽnµÞ‹²ÐßQÝg-AóiˆñHc ÷(æ¥í7jáì�l´�R²r"ñ–bÀÅ-ÎŽ.×ðàk«¢æ' 7JgY®-¬Mó:Î,�jæhÀ< ·šZ Þ²¸öïE¤_t%(rLô¤¯”›ŒyoÀ§p…5𷹌*¸?ÍPúR(jòL¾ŠßÚß9³ÿkL1”ÚRTŠXêã`@û")C[aünÃqN䀱¹»gqªº™_Ñ?]¼ªÏïäðž1êºT‹ys? ÀEC07BÄ8A7QÚg3`ŽÌ…ÚG×� :¨:�”Œ1¯ÍFØ7Ñè­ÊKãHê7µN‚fÚ[‡ÛQN1ZRY`p¡`wÖb˶å^Çb"=¼Û×À¥¥—¤®8£øˆ¨ÜM”hËõƒiê¬�f–ÑÚZ10øR‹wŠà?c”·‚†ÅðËs"ý–qW ¼ð£½t6‰¹±MaðdzÓÔݸ.¯wÐÊ‹kê�ÊAܳ} FaÅš5£ó‘¦o„ U !‹ñ÷ëßVë&ÂÅjK»ÏV_þ‡ð‹?È9õ½‡N'Ø„°Wkªè+†‹ß¶pj¨_:šÞR\ƒš»�¹ÁúmŸ&�šŠE.¬g-™M£‚“NKJºÏ•Ð�Q\›5ÞÚX·�£ Œá1v,Ýìï.Õawº{zÎcXÊ‘×íáïbqì[ÁÆ…« ‚MzŠyÁI•²‚Þ…çy³^ö9´¾¶ˆ8*ïï:޲òCÐß +¤ ÷Ɇý“—Zqš¬¦Eã d"  „¨LìQ-í4TŒÝÄpœ3‡>í.7µh×Àl6%L¤ÎIk:jƳĭ½Ëõ %íÞv„V¼û'‘îõqk·cO`>–ç =û‚PÐPœn¾FÙGÔ\µµ„/Èd©/½\Ë �)¤ÑËkèKV 8`’ì0I6ÿ¾~/%©ö¤La 1!Ë!wÇÄV`öÏèÁ_rãÏÚšˆÐÏÈÿ{AíÁOõ.º4�€§¦+=èÛÿ{Å.ƒ†�½ûû®hFð’!¥f/F@~ûÚI%K)æÔP¤ÏI0�4€Õ4ˆCHB*Ð#~hÈgKmŠ]¯užh O÷—ŸQéÖuò*ýÜvˆþØúµ»õäB ;6B@ 0Y ‡»Pü¿ €Æ�fuºI -’I§i¿ßë¯ÌFn9qs-ôiìO3)Yó×ìá@õ¥)6€Ê{pØÄåZ©x¬‰Ñ ŸþBÜcØõ ßka‘*Ì0v(âW¸°zfN÷„~'¨°Àûyßu´ëÝ›Ö8R°3éXSém!g(L˜48ŸRÕã\ožÝÔa—%N©Zn÷Á iá›o| pªnÓY&0íZ¼‹Âèsþ }W,*Œ÷-6ŠÛÞý)’[A*ÛR-.÷Íu “ª.™´Ike+hŠÆL•®àòŽP¹;^k«zn7ØÆ–bu~µ—2w§ñ_m¡{a˜±ÝE}Ì�.‹Ó9 uZ¸Æ7mv|´Nu¹¸Æu£¯¿ð‡ì‘äl‹|ón•e²ùô›2½è¬RVAVÖ§aÏ4åIƱm¯mž¯Ñ7$ÕéNÌ–êÉï2v­ø<9– :¼ëÌG¨iB)c´Â0O h€ ²¨Ç¬Ï`d¿¸cv5q êøÁ‘·ïßQ䬯ä)ò„™S\|žB>/§d°ÿ/g€W7 OgCÏnYü¶é«üÅ@ÿDo¨?Äyì=yoMüÉ ñdÛ[ÝÎÑ—5÷ÛËt¾BÝß)wœôïzÖÓ »:Êc_'ƒš‘Ç3Ö1âÛ³z^Õõ´.ÂùJ†÷¤C ´Âd¥-ïTÛ×ÂØ¡,Íb�Ç6jë {™²17ªå„ê2e©k–³leji¼ßd—•7Êq×A½Æá=ÕÙJèlY.r].’ ¿™Ñâ¸Ù�ð_Ùç¹wå|]âdÇMò¼MS.Þðjeúï+>Û¯)¤é~žr§}‚²>ZÙÒ>v²µÊýéµ´”·^)2Ê\ýÍs<0oœ4yç™@žU�YÒð¡@‡¯¡KâbUE$1– ¶¤¼{7÷sœãÌ<¨dpÔGcû åáßð÷½0<E‡={ò¶¡6ƒ§-ãÐÆ!¬�ÏsdrûB¸ÑY噃“VôsÌûዉäé£|��Á÷y§ªK*¶ó9°Â6x7»Ô É {½ò£wòœb,—¥�ßÅå²ÉijÏ�¬½ uA ÎA¨ ÏÌv.|¿}ËžÚ5ë Ö‚úïéjšM¥V’Õ”j�[`e¡P`C9ëûEÚ%�˜®Ö8}!߇µ=lQ£–lìøcæ4´.Õ”ç$­Ã´ßx;SkëXçXí¡«³Tw�eZìïƒ2.œ½d#½u·iO[‰`rÎs‹b«†°Â›t¾7.\Fì*û2ZÄB2Ò½úÓ˜µª‡˜/ËÄ—ÝîâÁmŒ¾ùJoÝèËÝܰx²¥°÷€J~ÃÍñºŠÍ2š÷p¿ðz #?=iåñ"Ïߪ,å±Ä ÙÔ.ÍKPËk Dd†9^ EƒÌßÌ&ëNªZ Lh;†¨L©{"@¹OW |SÝh;‚9m¯Ùñ|V é»ËP艹ñ�RørpŠX½Í÷!¡c1X‹Š/V¼ð3 o†�–?_uEu�âýÑ&óüAÇÛ�Å ‹‚U”A1íÅV�åáì[ ´u Ѓk¸f ¨,6†8**ç5ÙàþÓ7°ö5µªïÉ�‰þ½_MêR„¢Ó ˜ôü‚À5‹v[[qU•Óz†ÿt—;�cÅ`”›%„ö¨¤)ñ<¾uéÇý=^ÙY(õ/£5 Щ=û‰½‚¿k;ÁqÚÁÚn?®�ƒ*éÒ:Ôòzs&Ü ,XEægj·ÒÌÏw ZJ­•k/­ô»ÈÙ˜žü‹|eÇY+ÅßVŸ#Wœf,x<|ÃÜŠ¥ß§sk)?8öO‰T÷D‘>œ'®l±6mfÎÚ|¤K­Zíö™½:½;�Qh‘$#– Ypú*2OKW·’Y¾{æ/³tz‡$†'/ôÞ9hŸb8ó�ñvL²{á³D"Ž>·­}3œ•ý•®]V®_.óƒÞ׎C0r¸”¾ß>fI0…•ñ±Êhµ»›­'¹�|°�®7÷¢qT.j¾Œ\Z·ÞqµºKb@0éÂ)g’t6ÄÆÄ/Ÿ?’°N¬x¬MMäœÙ‡_ÌŠó_Æ3[üöònrLlçåL«ç�ä®twB­9ñl·§m6["öÆ®þOZ0Пs¸2ŒŒŒVŠîÀlœËðä³i ?±2 ÌáRìƒG‘¹âÍ„G�‘ðK§Tüw)LèÕ_y…1¬=ÿkY¢€]­ó*©¹àHn¶€!~=¯à+¢ÝTí»¨g úbüè¸×¾÷ÆÂÚÀý³Ã“�d=­�>Aø• &Æð·Ì¥(”^'0L•ê…jáË ŠÅW’ETÙ uw ¹}R”há¯-‰’Aä…Â#´%»tŸ�TŸ¹5ò­�…Nã}F'œ5¿•c9äÿ,Âx�ÞÇÀÔÒ‘ ã~ÖÁ£{“ ¶Ïi_,EÂ^×”9i�öY¾O:yM²y›“r MSøY<þq!0+1̦ÆÿXx ·Ûî‘ÙÂçÁÂók½,œt?2?Ùç÷3Ø%-ž0§œ#±ËªÜ°”¯èý䯓ñNO#`®©ƒ Ûd]¥{Ð÷³~ J¢ýOž~/Óõ�…Ëó¦Ü᤽ÔÛÝu²;H,l®„í„ ‚e#ŸûŸ9^ú7Š‚;dËua‡ÌyÅ*´VƒŠ¦ËF ¶Na†TQ¡kˆÀÞ˜~u÷G1º­Ãö­¢X¶$‹l�!±,|¿ï­`D|ó·õjüäÀ}X9|˪êKø�—ߣZÊz´Äl�óÏ{e�[+"cS¾,0ɹè~%¼ïW‰oc¨bóY¡ðY‹¹:ê«@^÷îl1ÖÎZóóè5·®h`$¥$oÞ OÉèÖ øƒUým'�€Ï•òý$¾ÈÖWž§ß¯ñô1} ·×³W€™Å8í“-ø½'Àÿ—b=]~.¾îèf:†¿¦¼isñßîo¡Û,u8ý=ÔwûúùèÍñ¥Jè»TwÔ‡>!,GÙH§!9F]sÔJ{Ùx«•ßô0ÓîF_¿Ÿ±+ÊभßÜÔíoe¼‘’⨡#:¹ö&=í'ñû`“BrÉ¥n’œ¤tø™ ißäYiFÄÄo5�Ckdtí\:Þ&?W›Ü‘ùŽc^xö&±AtPø·™‡Ç·OlôËügÝ£†öð‡Þ[E`¹û4âíý†îõ?ž38º{Z’Ä–°1ý®È˜ë�ÔèåÊžCý›Ö��¶3¾ñ‹1;û+Z\†Ît@òT\‚¹æôíÁúø´îuê{vÒÁX˜÷™µßLg‰¢±ÂûO-‘•mô´(ËVÖ)n¶£\”Ñ ˜\=. 5¥×[-g"·~�­ß»P~>SE÷¶\Í�‘`�Tc‚ 1€VðíaÛðIw Ò÷‚s39"x°æ½�[IÏ9 ¶Ãhò |A(žO,œ¥Žïm¼ÚÛ.d°SlhñÈæ-ʳ[öãܱ΂keÌ_®í*²×�å—µñÃo «­ÈØhR %ù5Ÿ@…Ø-Ù0wf†Æ¯¸Žb+Ïîn†%üm³™–è‹Î]‡³}J@t&šIŒäþ)Òß/6ýÂ�FÖVºÑ¤á]0UòìÔ–»uÚªé’u”š4‹- H%ÑÐÑSThì du¬Õ‚#;Z�©±bÖo�;£L×&¨Î¯t™x±ëw´I=¡lš½Ì%Ï�;]TJ䬒æOxáL.î.Z­læ :™ÉßP�m¸l6C¤S7µæL[Ò07uÜ£ÝÝåÈÿ”¹ûWE  ÈU P/BX÷WCã !äù��( UÁޏ"óÐåz&�GWöÍ{9ô7;·­kÅxAÜâ) œÿÒÌ�…�v%ž<Ñ"Ê>+×û×Þ�jz[êo&‘Òú¿è#èÛ_û_YØÚï§®’€~‘a~X›ðp“ä9VÛñ_?ññÝ©r@~!äªW% èf¢Woã^Ô}3,m%rlyg…¬‰¹{^Û=éWU�G¥((*?*@,º"ôo�lÕ)Q­±ÙößÖ?‡UÔ_€°=Ê7|¦÷ÿŠgåOjký, cô[š0Õ÷•”fù ÿ†sòê~oˆ÷BÖÈS˜"Ò)`Ÿ[à_³Õ`ö±»Ò’W¹Õ­ûý,õxÝ�±‚ùôýƒ+rk*:æZÎk1«iA¿ûÿMgoK)íw×ìþ¯ˆO¦øÊ¯›À\œ¦%çv,{ŒÙª’/ÉÀ{^wšåqGù° =EP…z lÈÃÔ¡ `™ø1`·Å40�JÃy=×T9…„â°çýˆ^> uoW+¤HÓ–ðäH´/á Ûª(1²j�ÔÇ5€çy\† jt…@t–){ðc‹·‹¿2«‚îuüäÆü5#PƒE’¯>Þõ~þ‡-g¦?yéÊâúíÑN%ü<•·êWµl�“À?ÉóþÛÀ{rÆ=þîc91 ¨N×€ª:Ä{`¼Õ£XHï•yýqü½ÍäYùÜiÎEKîo\ô¤…Ôæ,‚ ‡÷Çñ§²¼,CE‹Íèz`µ¡¨�å}³ãÊN${žj=ñÁÆü¶¥�¢'d6[Šz¶«h/rÕX±çUøÎû5Öe„‡ ‚Åtí83UØ›B­wÃŒ$áÛ~àñ†’B+�ö™º†½;÷¥5†ô*QAí¥[‰M}šnÚÚ¨¸m`—ey-)Â&µŠc+"�ßVÝ·�å¦×…­/7¶å5÷.iý08ýkÖŽ€å'lºÙ„2äÚ¹8éºNªCJ± ”„ØÝ™ä*«p-nP+ú=Ø!(�Laá:ñ%Ù‘£C«ñ0ÄTN]ð\l{­”§ñô]‹[‹ï‡z«ë¾–‹ÁFꕦ  VÔoÖÏN_'8Ë_N.φ�ö€O:gýÐãØ±[“nÄ8‚}lö0ÇÍì×òüç�~S1t¼LÇн!Â3róòïÒq}|èxó"rB'x:•ž8Õ« ~:s $’µ ³Š{QÞ »HD§â^ nZ ’…#í/úþp—ΑL%/ïŒX†³²ƒâ jü±��ó*í¥¯üÁñc<µLÜâ¾5¦?ì[ml‘ÁÐ4ì5zÉlU‘©´]÷{v"†ë7/fo¶ì ÚR\çQgëÁç;Ô ÒZ0F?R±ðWTஊôp9"Žnå�¢†L/¾ª‹æ1,DE¿/p�¨LMÌM²ÊßâDU�l´lþl… -—ñG aWj"VêAº, ’Ò]ÚåñoÖÞ['æ–�6^9kž ?М¦(ŠZôÇ\¦H–|òÄrâÕºBâÁ“þ~tûÈ®HòÚu`�?Å X Gý!œfíS?ägçð_úc”לF_娆„$…¬[:͆õ‰¶¬’c4NÐÆqO/¾#^„w³øÛ. ùîBçÅŸ«ÏrýžZɃõ‘°á=3±¦N*«´„˜X¥Geuºbý�3¬_ÓËÅ©öøÂM샄u1{ßý±’YöŒ‹{ÅN´ŠÌ¨™”"ÎÙi¥_\UÑËߦÑg9½í…4´t\›†ÈÛ|?AEoÝ-óä†G»"ÈûbÞýÌóz¸ìãoHÐÊãʼc¨Ë£à?NH ^‚} ¡3“®ž*Çô(gýr¹þ¶“û7ã<õƒG>ü’�³1>˜]jŠEz¾ìÀ9WÚ±Ùõñ¿64Ó½!@ÇÖÏÑËQƲwk$WªAÙ' X*þxùÒÀeub¾“ëÝg³× ¼Fþ!ƒ3ÜzüÚ±^öCÏÓ1ö ·Ç’KYÝp÷q™lã`€øÆÈ,™ÁÛŽ#á'÷4U¼.1„W8!ÄÙs×¹ ª‡ñÌ´f^tà ¿©¸?|çm•vÈu}-Ð`¾[aË(˪±v‹ï…½bµž4Œ öG³„¸ˆèŽˆK±aëY޹Í�·‹'tô]C*\~eîìÀ¬¨O€dc=“1½uEô¹ó #û­õ˜X†}]‘ë:øëÜ(&'ÐðLe1ˆ–\ SÙO¾"V%¥Á6fCrCg†i‡�5¬z¸ëœÑNû™+Å‚?kzv7°ŸÍþxÍ%ò5_*M]ó{ò1€wôÿç¬}þTþ·7°}eé7Só˜åµþDŸ¯íÓ°‡¯¢Ó„�–TÊâ[’(‡NSœÃ2ÙgË¡ÿk7x‰÷B�O… )¬³ò‚}DÆ~U…?oáí(Ëhç(©«eâ¹`V¥–äZ¾n¶ÊNÕìé:ªPIÀ�Äi›ÝØ0Sþa�¼Ðì ’Œ[«ïÈ�´FPEM"y̘¢(ŸWñ³ r#‘ì/ìJyÂ%óò½O‡¢ö§¬ü-úœÀøç�"eÇw™ ?˱œÊU·aôú?ú|ú æ0—ÀLzÌ9˜ãœ/©åbèlÂ4b„Ë�àwR£'—9ÑÚ‰£]™ÁîNYE8ÖÂ\´kÕÚwÍ1£2\…ž—œc%-ùœ×´ïgD)À¤O $X¶ò|ZÒTIU•‘]C™®$,ÃÐÝ:Vy“‘’P¤#«å×CPù¬ìÌÞÞ‰¥ÉI§='q¥ÁÐu å�KY¥á/$÷»A®uçd/c¥#ºuòˆl�‚›RR>ð�Š¥Éß�ãXÆ­¶šÁ÷›’QA�D6rOô.Zêv²‰rû„µm¹ :?±K00–}�ÐжçI¹ èä�=Ú4�€c7µ¶9¯ÞqÿôP„�Ö{û¤c÷'C©L×Þui/µO›á5Ç#^Û+¿æfCáš.Ÿ½ýIj?=+$XÍîý‡JÙ˜¾*Ó®HY:tc˜L|ý°~!Ø€ÿo @œ�{h÷÷—2D@üD¯œ³P¯(…‰Š ?"¹�% ÛDc:÷¢ÕˆÃ2úR1lrZ¡Ú™™z�“ŽÈê¡“‰ãuä×'óí9ý‘ŒZ·ñyÓŽêÄ6¹™ÌlN,¹aÎbPæBKöR02á¢hóíúüþ®íŠK+5žr¶±ãž81Cæ”=8ˆø=[kps0åkž’.Æ–ÈDÀà®if kÀ¬ƒM±¥+ÝÜLœ½Ùî¶ÍßHêâ { ÓDBƒ-6qPAœ +p†22à4«fòœí�Tþt“vÕ®´X–«Þ AÕC!¹ùx}‚œÁ¥0µÇËu( UÉÒÞ›â�ù¯5%×òÊ-Œ”Æ–Òô@¹3¿m“0ãæ1½Tí4_Þi¸.tÿ¼Ÿ ê`ÈÿðU¤3~'‹-0˜uð‚0^bè‘*ë0öm…Èa´ ëÛä:™¤þ·UØ�ÙA0#bTî´ÊÁ/ û»U”:궯.' ݺ ¾è–ø›¾ ³¢Ýèk¸>Åý~dùC[�’š2~a4£DP]@.`”¸¥SÇÒëV¯rMf±Ô……¾JÎ÷¾µé'‰êm:#/¦ñ¹f�•Ç7ÍU౦�õ¨62@î1í>Û )¶x�µÚfذ•G·óñ8·ä½kð øÏÍžW(:tÆ¥»3o×¥ô#)F!X J'Òp êÃwèµ9¨¼óGÙ±7n£±øQ:Ã7ÂÒS�£¶µHwò�p‡�AÑW ¬Zƒâ�=jèoÉE•môì¸àçh�Ä$hù4&Ù ïN‡ÙÐn.lâJ5÷s(ÓÇmZGy²¾¾Â”²ðøQßmG{Fxv×nfevçD%…R�0¶ÒœŸïdï‘Ê›/Û­bÒÄT8‡µbEô¯i—õ»1¤³X°ÙÓÙÖª)=ïß.gIâQd{Õ!bÇl©Whˆñ7â‰Äý«¾ swǾ®¿êù¯ZŒûsÎïËßYy)ª´¢®íúÄjÒ‘Ûár‡W%°ëù¾,— X…Ì HÞéPãt3¡²|iƒ|f81»7ô»†ºaàÜXÎ `4f£…×TÈ·ÓcÁ¢íTŸYÛ¿ÀÂ�ý¨¶}Ï•úÍþ1¬`ŽÐa~NymÐÈÝ{�‚¶Ï`=Ç7qC§ñf,'?™q¹�~?zgËPsæþÇÍó¾Z‹ÀZ¨ìh½ÓOÉl‘=­yÅN!‹"’b2žpÄ�ê+´):¸ÔøÑnþ›*1¤ú·Èo×K~6ð¶P‰�=¼íVÇíÞ ­÷à ÞÙ×ÏÅF®£þYàʘF­]2þÍ~‹%‹âÆòMÅ ?m�üÓ�“ñsË)&ÚÜÚ¦ñøw‹æ TfNûîïzSâ½a.Öb¶Y0׊ƒÝKu…QLõøuÆÕ‡dlÕ¦êUîr�ƒÍSò‰£¶TÓ™ÀƒXÜ@†d»ŠäéGwÓUS¾Ë'ÄðÜÒšLÒ’(»!`[U¥Âž!ÛlÆW9ÂÖ_?¤{ëòAo~eaôßÄ�Fé©KŽ˜¸�Î-ÂKFÞ]ð ž·µòÊúÖ‰µ½ ƒÇš uÀ±5_$xS8 щC7,–jÕ}äY€Põ£xÐ-hÓC+‘U†Ìׇ—uk„¼Yä¤ñKŒ>rŽÅXF†+8½¶Â—%X‰L3UTOé]ÕIé•#38ö—¼³ˆÉ‘ ,I7Ј¬X͈Ÿ©9ç|Ÿ7ýöµrñqRz¾¤~£Å:�qA–É…¡ÉC¶É^ÙÝì/…ÙRYx¢ÁùöÙ ±Äk?ÉomÛc<"ƒu™É¼ê�KžÛùéž“ÒöÒAAûˆ;÷xͲ0‹Uy‰É9<jÝÒ9)B¬,Ð47zFÑ¢y„.¾˜°çºâê¤w&÷í»@\xË.ôÈSšÞ?ÉЋL_ìÆn@¶]¾³Îe½Ô©ÃÁß�Ìá0žãΆÑKiÔTb›· s,°]rÀÏOš^ÉÞl¦—(©^•_I“÷v·­[*ϧÆ\näÜ.$¥âs-þu£Ó¢Ê„rMiŒ”ûÔÏI–­wÇ!§,œžïDS¼_e)«e¨§1S3‰Äéì,�lí9ƒkÍl�k ˆ6lÍfmáMÂUíWlÕ©÷|Ù&”¬V¿·æJé+e¾ælé%OUQœœÅÛ*Z´X¨#±¢7WNÑ‚V½GJ¥ñ,¹3¢´nÏ y­ÖÅ×U’¦6sr0hIc¬H[m^hÒŽÈ’æÐ¡ªIƦ…ßh5ø/ ·æ Yd¼\ΰ¢¼5>ÃØäùßî†ókóQgä �nÃÌ%Ø)‰Ù1}zÒÖL é2J^—RåtÌ›ò% ÄO�”9†CÎ5Z¨UƒYkƒ+ß6cð2–9‘!|*ѧ´b~kø6>]ªâ{ß4ECÜ\ìw,Úcª”È8уp^{‡ ÏÂ/wAڃΠA™]âÃfEo,”E€™« Ë-Ê&uX¹±>ÚSšR› K¥‡Ë–#:?, «ŠÃm­Ú²É»ç¼œ\yÿ×iËÌÇŠ„ûl<@ŽÉ 65~=ô—‘ýƒ÷ƒÜ§ÕØ"�ùàý'=ÔWóú¿ÀÝyÑ­¿�ÆÛÂWŽ~Qd½”´Ä¿ª°ÝFýkq9x‘Íå#±ö÷ò¬÷\Î^Ó©×lèƒÒZH~j§u sºÓ¼r;4Zdס•:”„9û›ogo™Áe}Êý-íé�*ÞLse)´©’RžU­bÀP“™‡d˜ýÕÙUéWkwPä�œqÈö"ýÒÞ#k,m�XÍ!ÃöÜ�‡÷Ä9ïòîWgŠ6p’8.òC¿Æ—õ^\"غÍr´/÷²¶©?e(‡›(ƒxbõ¶0¿œvkf´Ð…†s‹Î›íÁЪ–Ýíãµî{¨X.µ^á�œ±G{ØÏÁ+›ƒTÿ‡�坿Ãk|}ê9>^½Oƶ:Tš§c+F»'cG ²ˆ$ ;(à88÷ò˜ÉÁÍ·±ùSu—í�}ŸéGoŽ¥0q�l¼b×<)v 1Ée€ÎÄìH×c¸9$ER/Uâk>Ô.RGh°wˆh(3$¾ s ‡-7jØþ¬krhì| ¯x�?T›Žàà[-¼-(n4 H²Õ9BDÝ ‘ñ)Và•!j6Pñ/ÖrìŽÈ)\á û…’/ Í×YóË™öW&Àáž ºXÄž­°íƒS—`ËѰ£]j±p¹5äæ’"%" ‹�®jz:«ƒÊT”lwÛ3ƒ¹‘ÈŸqŒÇ!t[z‰ ­�ðzü1Š¿¹;ùÉÔ9 Zøù¹aÍȇÚöâ7™Ö±sÝä:‰?p.‚5}OùLŠ-–¯‹Hú7 ú9!€D.Sö³ŒÝ¨Å›ìXYwc#.ÿSmà~Ÿï?‚{èßNëÖ 4Ĥ *y«mU˜{ jﳫ`¬löNZ›<ÕìϦu,±æ›Wýz�rˆY:µˆµ“¶MW:¾c5qŸÂ?nÿ¶+< Ò D ?åPrð8ö}’áCÂc<.˜v÷ÅKå„˳ÂÞnXæ“ËVÓ°ó[€ÃmŒr€Vz*·Äm"éeóϧxÿ�ï6NWÙ_w€>‚böä�.­N²±ea÷„„(gUô(¾B&#ˆ „�‰¦T¯Žóèrqío[çÓ�_ŒÝ#ƒÝÞmPé!4C úɈÎZ4ù\[Ì6±&ŠY½39”Ï„ ¦/)×4_™‘ˆµjßÚEæ/«ÖpZµ)ˆÐ ?™sñ��»zÎá¦:1Âñ.J �£ªÖ97¹†™yÕãŽ×Q$wª¿n‘÷/{ [2l#ÚñäÍkĹP»»¢Ÿ„uBϘ²Ía§rcC¶tØO"*³ÔtǘíoSŠÎZû| Œèk0Ø4;-.öyóR.¾O˜!¬až,¦¤^1<`q–µ]°ñ ÛLöÚéõ{©Y›Š5\¨rÉæ|,¥ˆ]E^Ç¢nR%ü6 3¸ï”Cb"r¹u#€ù­Ë¶ËVFƒòÔI¯ûªb’F‹Ô�B¡ä[3‚v8š_€á°µû*³HÁt 6mEM¸‹åš B&æ½YA$V`3€ŒÀ!%2WC÷ v…/n®Í&¾TÍŽ•Ž€b?Yws5±Ô ÀÛO”ˆ^™m¦>“ ÆXºas“”½ä?Qí»^æÜ±òF'LØ´dÑ&”‚G 3¦‰¨ÈÌâÊcñX@ÕY½Öðþ8Ì0Ö ÞÛÄÀ’é(\^H×ZEOËm”·|Ÿ UÐc7ÁÅýÅÞæŠœf•Œ&ñï2ÅÌ`ܺ�c†Qœ Ú#ŠN¯ß/'éETc£Nã\E6;-êû5lÑÞ×Î+Jhž ý}Â¥úw³ãƒ|¸¼Äq‡/e�ž&éȬceŒ•ð<ÿ˜úWê¤ÉG QÍTŠ âe垬ƒfÄM·¾Çf¬°7kù†Ñ¨µY^J”˜»<ñÈ„òUZ2T|'|‚BE0¢dÖqòVvñ7í/4‹ã�ôÏÍö7ÕֹͲñ I·(‡zP/1æën~; ;Ÿ—¹ž}Â)ßÎPÄø{gK<ÒàkwË­Dç<-93Â-­§ó �¢ *<›x/W]‹Ùç-8Þý©ŒJ8¬k•1 …áîs@õj3”<ÄUíö¥“[)ò¯æY|¼û.X=©wäÜK[Ñô³È±H›÷¯9߈c`%e-³ª Ùd\0‚� ÿáì͈Tʼ ŠFdukàóBjÌ­!Fæ-”ʼnðWÔ¢QJ”Ü;åл…èkJàîh•öE5ˆœÎ WÊâ¢õ;5š”Ï]•q §†ê»9Éè�c’Ÿ5±«utÄšH0qN›\ΟïøeËä6Ó3ÚÍio±¦ÓS°DÜé.°ÒPá �Ê܆Odg|+ᾋ³ÜŸ(g«û«$tôuüÿ,9^‰¾\¡5ÔáIOübÅæ_ö/ µˆ5Q‰’K ¸ãCõŸb¤©&?ÀPÌQ(T†³þÊPûGÛΊ&Þ¤ÿw7…‚ù�±m6Û=sûg³?±IwÃÅ�+S,é¨<‘O4㊾Ϯ‡oWÈ–/PëöGý½¦†L CÕ ÏÅ)¢¡¯ʯ¿¿ÁçøÞ�Ù¼èÐßó ?Þ»PÛíËL ÏW¶|¿I\]#Ì�t?H±ZìʤøÀInŸ9�þì0?±eÿH`ƒxÞçeàf%ÓcÔÙPnØ&‡Hû¨5�ÀåƒMj¾¡¦ý]ü†œûëøz-ôÄ Åo „³bé¸TͦÜÑ(y%^¹�QJR¯™ÇZHí*´^5¯[T¾Ö‘(xÖ{³2ýçxíÇ~ õí„´Rpj8\¸fMŽb Æ$ø ƺéy-ð-éFŤҕ³8ˆ5ÔSYÔ™êS§sKnëCW`g?B»�nµºP=˦R¬1dÀý"“{)ùžu}õMŸBp#�Bil¸‹3:¾a! …¾àˆIü¬Q‚4Dcp,½öP‹+i¤#vÀé>€œ_ÂmAjj7£i#†oƒtBô‡7)¡Ô+³¡i5�‰OyD0¡`™¶ñ|2‚|ó=#œ¥¬0v$ô�W?ìŠ@ðœ"ò娌\ŒŽ)�ôüYÛ?-wÕü=|ëêí-Û¯¾òäd¥wÕni(­~·"Õ6Ïݨ”7‚Â>|ÖmÉ× Pùy÷õû‹ëÏ7T­¬ŽÖó¦Ù�×�! ¢øëÖp]'`þÒ¶W›ñê´½ »6+꘺"]ˆþ�hgÃ-cÙ‡º²oý¼^1a"þÒ=)¹d䚪�¶n3sivˆL7zëVQºÛ+VÎOpL·¹YØ£_ŠUrVFÑ5í;[á^µ¤t¿ãW‹ßwT¯Õ=Ï9º3²U›VeºÏâžûwKÛQî¼ÔOw`‰íé›Þ®/X³;æúb-@ɰVÝ‹�¤ŠðIq�V¦ë;ÝkßrÌxÞ2kCÑü ˆ"¼†XN"üÖ¢•ˆZÄ9¹®Qs«&¿NBq¥Í46‚¿î¿å¡¤ôfäs1mnù1Xþ½æ?é½¢ßÑ /†±b³IJø¦ÂÞ„7tÍ„¿tw€yÉdbòô©a>V%ðØF¿«þO†ù¸µ®GšØÕüÚþ16Cè-Â�ÏÝJ³ûÜŸ…ò¥�ǸhÖ½˜Ö:7�e8¼;ÛWÍ3‚U�è›VMvèexîÔœŽÅ¡¨B2ÎilQÑ‹ªﶈ¶nï¶x­5ÃÒ!ùéÍ´’4¡JÛÇ—è÷[«4�Z&pû1#VŽìG-#«2Ò#´åxaRҜ¸֭vÎ"Róp3ÃÃÜR´ Þp—€¼ìy+R× ¸�« ƒ[ùÀŽö�™Ë$#¶ýïFoЉ]šß·IG\[h˜¢ÄS¼i´˜b/®d�abWP{S†`élÚ©jZìͩӌíÊZGÒ5rT›F�l(—6÷gM�ûCK‚Û˜�]û$ȶe½j”ˆ)ÚWPípeÛa�œÞ³fUñƒ65"“ïë£GÉ øÉæÃä]&=4\Þ|µžÝhãLõw×x“~²m4ÖáØ·n BIƒ¬u -…†7ƒÑCÞ»Üê —ÞpJAÌò•EÏ/¤ÒMß8°Â³êû›Û·Ã\7—ñž—mŸAž!¸èZæ<î_ËØóRw›ÜDÞõ…¡•¼ûÊ5ßmH¯ ˆÈ˜%M6Íö8ÁŒ¢,°á…¬�¶Úøuz„ˆÆwl=¾¾š!¸A¢óæÒ1Ï8�î'R¼oŒn–ã£Ouœùë:ì’×y­\{{Xmüß,49ä{œhñtÞ[H v,Jäðýl°öêÙovÆ zÀôó:jMmX˜+ÑŠƒ/ŒY Òä‹Ã›†è ô6Ð÷‹Ð²Ù£Q&½Þ­¤Ýû¬Övªúg»gz�îÑJsuköÍÒ%¼ƒy„.\~›·s„‹Š,hmÂìêYŽM’:é¶7Š_NgkµYräŸÛ[å²8owšèn£ÿŰ%¦Aò§¯·Ò?Û9âÖi9EõÚ Šâ©Ü«Ü Š2Ô´¥žJ§Ó]bO‘{lêÎRJ4Zíœ-bJ5b'�Ù‡³9„ÁÏ8û͈â"Å#m³WvzË^ê¾i«g`Þñãž¼~Ñ…eñ{ØB ¼\;‡È|õ×;S{T'RMvüî2 Vg'H@uÐA5Â�F.‚œš¼,1ð…ÌÆL¢ô•ÈLÞÜAð:Þ6XßÍhîd„W<#ùS~‚3'° Ž"ô¹çm]åUX€K¤p¬@�¨ILîû³s˜>ÌJôhN k"³AËyFj‡1¥sáéÒmõæ?èÇ,\à �nßÉy4Ÿ Â+.ÍÞÔø·¿GõH›ûT£¼ùî~ÙDWѨÅx˜³];èÜ¡-@ÕI²¶oøQ†POP_Xay¸¢kë¨*ð$ÏqÐGLÞrSJ"ÎËËigÝ¡Ìê‰Áº'ÖiìËp8'Ö®sL\âÖ‡$�\X–·Ìk•iÁ¥ƒhÒóIµò—ÒSÜGÍW ¨2^` ¬#Aô??÷"!�EðQíW‡ÔðA…��Ï~§9÷Ç9=‹‚K³½ËN×Ë8Þ¥‚%mAp¼| ÀSE0ˆy!²·)6¼qb+àÍ!× £²ú±D "×4AüÜ-×*~!xeáÑWWº1#À^i Id·®ûž=æÖ ¼!¢}ÿoa§¸Þ¯Ÿ$²X(ŸObA9#I2c¤Yœ ¼ùP•ˆ†Ë3•íé–9¤Æ 5ʯŸ0Ø 'årébðSÕ(ÑrnÏ£Úh¢€&›oÛ¶Ï¥†°ÃÈÙõÜžK)¡ÂòÝÐ+\{‰…ó»û÷¶:àíëuz{³¤gá/€‚81àó;Ë\j\ÞŒÇÄHy {¹÷Ú—ï,—�,GeLLŽÇF´J‰ˆ‘òýé»þ“bH0^v¨I<^FQ´;®0‚gǾ‚¶ÄÐÿsÒyÀ{wº%“È™È?åÂn·Åˆº G6سaÕòÑ8[[Xêd©6šßWL6ñ˜R ÝõÏ—ö‘9³~iµ„Š=ú¾Ø2F�P]t,㖔̛ôÆÓ7óéxùˆ…ö3‘ß”±'ÚY{(®–3o CbŽ c޳ù1 9Mþ̓þùbæ¶òšú ÔL…û<Õ�…ÉuŽã:÷Ëø¾G‡w¦<Õqë—}&�‘{ïí³°c«¨!yõÀEò8¶1Ôö¯l\)íX‚[› =4ÙV­Œê¬õ²¨#;#ZÅ�)Zê«Lm²¸á¢/”ä(Í5×¼àÔ2Ó@²&M\Š TŽ9­kĘ�áÆ£›£IGvQ·:þ™AÜ—šÞ¨]¥/]ÿ,|¡ËFm¢uIç¤Y*pzSµî'·•îKá_Ö±á"±½æÍ · |DóÜ)Yó{ã#%…¾§[å/�Xñ±–ÒÆ/ôiR´†üÁPwÓøžŽ]}vqEŸOOzYA‚øs^ÀŠ/f�e¦6Ó«Gl2p}"í‹SRZ]hðMZn\nvØã„àá:±˜Zl÷á�i�ÒÙu(™·Î- Wͦö°³3´G·,н“:ŸÚA ”€´Æ<âÂiœ_ n`AlŠüJåŠÕ(¸4 ›¿°žœd­”ÊŠRUR’Læ,We5œÇ üžgó9Vî³rqit`bààýœù³*§ÃxO'hÒ´fÖÀ"‚™â \³ˆK JŒ†ñå®z@¾ç‘†C~襻ÌP0Z‚�M ÷‰dJäv82aQ£aƒ‘%²ÐCh\Jò›"¶‘M#Þê$Â�œ"7Ë´Z½vŸ("#¡MÌ[š›ê²/ŽfºÍMuo¼¿ Ÿ¹ÿ¢×ì|$Kyf‹›ó¼YÅ“Þâ ­´u’lñ$Ù‡tO˜Í†)Á­¶ 3d+JanO «E¤Rw“•ÊËµÒ :*Cø)C7#ä*·EgìŽ ¡ 6$_{ÿÎd u$Oî×£@­VøÅ T|.¹9Ãü“ÛæDçuÇ=VÕJ½Ðã·¬Ž ˆëPµ?ß‘Ò3_ý/à¶ -µá|óœe=rï1PKšæWˆ½—±l§Qj±î×O¢ .iî ñœÛv,L+Ö…BÔv[{¬írk¬UîzuÓ¯˜]ûß|…´ÎªOnd,“pϰ”÷×®Œ^lÎt†û)±ÐœaSu‹ÞAc¶ÝÅîV¼»+éÃ’íi­Ãb/ ø–Ù("8 Û5—ز—}Y Ñ™z¾0µã£Œåʸ‡•®•;,¬I,‹²M‘7Aéñ†|—2ÝäV ;f¨œrÎT® Jo1œÈâÄq‡>MzbœIR‘ÝÄy�W.Ri³|Ùo‚Kâ ‚±æš5²f�²×9ÒL¢v­›ö¼úÙ}ÁcX ¹ƒ,Oÿ|1åþœ ¿0Þøz&(˜®aè)Ît+ÿ–óß|¾×‹gcxÂ5ãþv¹§+xG.�1Þ×BnR{Û¼G¼—R¬t‹=·¢—mocwËsÓÿr«c^´Å‹k+ÜQÐ_Ø™¼Gvܵ�ü¼}œf-ô›—Ým.]ÑíœèÓŸ5¤=ðü¦µg±O̪Wg¶1~¶TŸ‰!-\±¬´kÛï�°äc~Àž7ßq{Âð«ud?n~7#˜;Èôñæ‹ÙóÈù z·Ûí?¾tv{I3¨öIFáÞý.^ä{c%ÚW4¥N7µnÆå.)ÍôÌ·tR0r{»Ý‹©¹‡‰4V_Û©àêgüþøçþ‡ƒó{ïÎÁ›öý1×3£æE[,A©V><ëV¡‡4Sd:yñYuŸÎÑ{€dHj¢Ìÿ²úëÅìbõžÍœ-ØAg¶e þ UBüÞ$Œlõ³óô³ÕëèD_6 ›ÈÅ î Z”zp¬íš*ï8iâ©ar{¬w£>샾Æñ%ÏIÈ =æÔ ƒü‹9ŠoM¾úkh§S;�§9!'™EÆ}tlgª±qCÖÆ±é�âÇ^ár'­Ž_€ë}öùˆï¶°Æß=-&ÄRz­ŒãÈŗΓ—Š^.^VŽ�úTÖŒ�!Sj¤GØB+®åØ -½[MªHk¹ÕEåÊtÉ7}Mó»ûµZó;IÍ› ãGjþ㈠’�<ºãÛŒçÔókë.IØø^)y“µ‘Àe�Þ›IÅûÜÙȼ|e·äžÏÃæ§[ý°¶X ”òH¯,j¨Ö�·¹DòãCdç^�¿1.oiìY©xÊÖÆ^,ŠÒý¶Â–T²©qnÚ€;õxNÛx¶I¥Í-“µ-#@]‰­ Åç~[»O¥v ¶ mJ 1G°œh�²ä`†í즒€ðÞð•_>*~iø¶oò‡Þ·½š,t·’l€DòNpåþVHƒµ5ˆv…*¸¥+:sáÝ[Q¶pL•Ybñˆ{âȯ^½ë†¹½ºáRõð}&Êâ}<%–üÔ¹Á »´ðé¢[Ä‘&±|­’Û/‰„KåéEå/W+ç$€jF³§Å“æÁ—Yû±•ð[#•¬äßžûlÊ|è7ÃŒ¦7 ¢0D¯Î`™šalþ¹£û¾|„Ä..‰¤=Ÿu-­îÍ›Óë7¾Ø¼Ý :n±Šr½%TQsªµuoz"é3Zœì½ÅÐóN-Oeµ$݃‘fººAtÎŽÖ¹aôHgjÙ!1NšdÄŽaÌÕÈ 7\ß6¬Ï÷ùÿ8R_U&ùüƒrñC7`—´M±,®œ .U„U±fj%Î1 ì)}Õ~º¬SµêØ]E¨V$Ȧô­zÙÝVm�¶|ZØ™¤•ƒ+Ež®ïÆ2Å�oiY@¸,˜³Ñ+³_(‡õ¯ÐÇa‡A–íö›F|3E$9ñ™Ž&�š´-/䟇ƥÁêâGêââ5î«4»'ÛçÂî›MÒó\°ï »mB!^Þ´‹þÐ]Jq=êÊÃýŒ I|ɸ[γWµA7�ð Qš¦È&‰^ÆO±"È 6l–NFcc×1¾‹•ÄÈë@ÈСAÉ¢�¯¡Pq•˵ð:´öâüb޳¬Ľ½á±ÞèÉ-šb´&õ¢7Ókü˱Åq‰ìçùœ;þ"Fký•XÌ?žã‚Z|*Ç1ÞpQHé¨#”øóðt¹w¾Ìã=où7Pfbö…»w¤÷=f…‚‚;v[Ó¢úú´eO841Ä¢ï¨Aªªñyœ‚äfz½¤ëÀFøßa ­›È²J¾MUC€×¤°±ÒH�«Ù¶k¦FMŠl÷ï¤mL¨‚µ1Ä�¤,Ü„á¢8AD@pÙ–ÝרHƒ§sÓS_ ^³?¿_žm‹dr<½ŒÈ÷åð{uÈaÒ1! “½s?(–`0Œ”žx±ºbÒ&,9Îte]0•æë*Î%qJ0è ×L̸ëŽ[Ôo $jëPÉO`¢eÁ«çPžrìiÒ†¬sá¸X³Ø�T ’˜ÖFY)¤zÍŒK6”ß.20T…ÒW­Ù÷Y"MïÝßx®<Ú6}WÇB2ésÑúÉ\¾´‡ï»]õÂãPØa§¹f1êÐa¢” m6Ç· zš�(>̬–_h1_ñÆœ·úEù†ûξêÜ¢ýy£Þü:8� °ã9:K3^|p jȬ1‹q6?:“Ù*¸‰¸)d-YÁ裴l,-¹€K Ðö e$~ä\Hâóζµot7ÏG!ç×àndùl 'ùðãÀ†gzÅ2˜�ÆoŠcy× ÒAzvk´$!¦žã¿¯Üœ4ÊÎM6%»:r #ôˆØ"ÊÜ{&±Ÿá›Ÿ®Ó¶íF$^ß݉W�Þ5ãr1Îv~ç>,Ô7¹ªLŸ†5l_é½Ãß6Œc>HU%¶v€£&¼ûKìÈ=²!d�¿ˆk&^ïë+áä™0pê\Ù(W¾¼N{ú“˜ 㱉Ý÷|B™\­„cKkR÷!é ¾‘¤æ¬/«ºb‚zçÜ¢c�¶ºñy%lºt&Á'ÿ,–NšOæ·ÄÒ'ÆžÇ�ØAàÒfY_ÎÇ_õ«ô›Q&4¾þ »}")+›€d[ž’½†¤ÜCæWš«5Þìw6+««!ùìcÏgBñ›Ó¶tÑ)7›àÚÃù;.Òiè7E»R¼«ÛVŠÄŸˆ¶ ‹Ü;‹ -W|¢ì îa{RÏ NÝ* eW Äcñö ܲ~Ø}k±Vÿ“òa Ý7åÀ&q�Îd_¡V.ëÂó¨Ÿçš{‰�º]ÚCŸyjm»þ+¯˜½š�ï‚7'µâí\¦¸î,{1œÎ¢)]õò¡7©uä� äÒÁ”�î|}Aëµ’ZDl—*Ùþ,ùýïs®&P}y›-¥¹ {í‚`ñÃ+Y|5¼;¦-„Vë–Ž‹?™¾´yîEIÅç7£ê9o9xô”Ÿu ¢|œ+7­ómâ¬E4E×V¡@-šqzâ÷~Y2+díQ¡/xx)s·+:T�Í&Ó]lè°/eUÁÅ=Ï2BëKßï§Ê·âž“½Î"þ°Q‘º»ÿšÏÔy5ƒirÂc‹ 9·úÍAnÙaÒÓ€‰ûÆsg�nyý~Á� m7wÞ—·_uùa÷cY‹¥=ñ ÍÇ¢I#Êý>Xýب瘴06&Ýý6?Peõ sãu¨‰ÍëË/·á�zøº¢.”¾ùX“¢Ò<„üKÊf 9|’øðå>â¨d£YïPmTƒôXCI¶… ÙsÔ/x¿Éçíb{~—çø2[BW�Ì9Æ8ãˆÐ„èué6GAønÖ]ÍÜE¯„#ÞÌùHFå¬dÛ þ~Õ]•¶ª67Á¡Ð§)ñ¹’ýò¢•¸AÖ§‰û‹°°(Æ  NqùRaCŸ¬uñ3~gÖÌð#…Ž¥Oæ‹8ØÐ5>§Åá"|©w m`õòŠcÎ{˜fó�Ëó¥ŸcœóäÌxDù䀾\€k²òá¸jåf‡Çp~uò^h5Û—Ï<¹µ+ÏŠj牻›Bÿößåîž¾Oñ%”ãRÿá�³©5m™ÚÏK~›î%¼â%¯Å&wåCÚy-h˜�£ ‚ü>,Þpì»%ÆÝÛN"Aù:XÙ™YÐ-æË©è§PŸØ¯X­ª�^¨£iæÏ‹À;š1N‘TÈÈZLsÙ‹ÇßhüÙz3사¤yWÞð" °þN‹ÿ>^ƒœ´\(ùÍB•Wý£þ]¶?Ý<#PÁµ®ÿç¹ ÿÁl —jzøóÔàÿþéU+5^8÷cô“>Ñ[àz—¼«ÿ ´/æ™3Ýý1»u^µŽß#\Ò­Ž¥J-orPc|‘õë4òªþ´ýL˜‚}d®R¯”µa 6å¿Ý·`䉟ä*aúá*Y |_zÄ`ˆ\�âÉ®_o׺©ííèDÌ[îßÛÚþ3¬ó´)ˆÚ!d>¼ûòrÒY·‰‰ŒFýê¨""€—$SDé#7|KLæÿ,…ë™îB—y™hÁ©$ÅŠ-MæBÃ{·��KO˜°° %eÜ”§{�Œ©ïâö°ší‡äƒ¤»Ž¹â”žì³î›I�iVGleP|jr Þ Ç–ù¹@ã!7`Ðmåk‡j [âÆ¢ ^ÄLàJ蕽†Õ°*lruæ(Ä• ­ð÷±C0‹ÚsY<ß@Îø„(EH¢)€ÓI”«¶Ð+à]A4*dÕŒäÅÆ\ÉšÚÔ§ãÝV1ûpB£ ˜˜1¶˜Æ1€¬ÅÁZ3Ö‰O¥9ÁÖES‘££ éŒùµmÇû”EU°mv7‚W§³i±À‰\Œ„“cl¿¥AEí2Ô„ÀhëÒcÚÑ^;H�lþ<:×I¥äiýž^ùÿÞ¸GÔ/õ˜;ÛÖüø üðÞ;é>0²Íï ±w��•µk¿#5�%¿äMþ:/bíyÆòOÊÖvO½!£ ï°:÷6û¶èˆ_ó^O£Ð¡cékDLØFHÐï§ä)Jù^űìsëþgJ&põ*m °“mÍ|læ §Ü§úz’b�Ð,«‘C°÷•Võ³ôl Š&ŠRŒ‚}õÑQÑ«,¼Llµh:–]~�^·HÒqy Ttƒ¤³ô¼åZYT1!šÎ] «ØZËû9~eþÙc‡£ö¿³§"ÊOŠâe Ò®�¤tÅâ6”Zêj-;ÙëýÔ»yV£n,ÊÂ5Ë¢VÊJÛ»bþUM›%Ë4SÒ‘Úµ©Î±’Õf؃lñK;³±p±2i€¸$¹ÝŒÕ©-É]À¦*¾-rµ¤VÍW’zi7Â"›ÿUIRJ§YVr‹È‘ã«])gÌ¥ko’˜ÁIw-Æñÿ)O<ˆá÷®H³—eǦzŸmu1îºR¼Å³k;ìÐ"Âj�áBèཥæ£Vz-‰²cR[î]Êöã¨|ßwRlÿøWM]ÃoŽ›ôãÌï6�ú�œÃ¦rH1lz빜­Œ®œ¥ÉAb²X\Ü‚ÔY,4¥¤s»^ 2”š_<Î&ÖÂÂØ´0T±r²¢ª�$<žE�Íšv•'5ª Ok#ØË•Ìݵ{ˆÓkæ�n] ãÞ²ú�MœÊÍ„îð¡HóQK<â†ø¶ø˜»Ûò¹ž]Æöš]”g@Á¦0“»Â_݃yEa»ÆU1t”×%"‘ÜÖ0û³¥*xn#¸ºM¡©œ=� m¥J›kͦݽŸ-ˆjg{áà@áj©#/§¾¥µ�™ß—ÿìá.%#N‰6~}ƒ{/#:gsEpÈMu{[–`q-ï¸ñ4)ê÷l^=sXA=ÍhYÆnˆUb´Ÿ—tUy§×eY2ò8o~c%Ü6ZŒO�k¤1[&$±u³,Hr¼Šk£Ý>SFŒ B®3™Su›ºÞÇÝ%J.QjYGeñ9À–ݺrPølJBà´Áœí×b&Š?Ò¥æ)²q(±mõ»yr9RarÑ}æÊŒ@ç¨~ægkIÌØu¥À‹D.•D<{Þmfò°ÙÃé]þÛÞ>lU¨Û¨Ýâs(ûƒÓI¦ÔZxÛÕÍÑí9ºd,9í’ûc™iç`º©’*<8ˆ^ÎH•È_㚥§ÚoÕò>mÄ×*ÇF6ĺ[GkÙ€'K*`›¨±£bƒåjßãI zöy'skµ¥s5&}1Þ ‚À^³_Ì%_ÜÉm4wkaÕ¹ŒZÆÃ¦…%WÀ뮢ÔÚˆ@´OÝ¥93µúæ�yÆÒÙ“cÂê„ZS,æ±$™whj•zŽn¾±IjZ5ÓØ²bkZ –Ϧ[—…GgQ®MFrÕ¸yq—DKÜ%ËœœWW¶e¾ÐD[l‹WðzŠÕ1�^÷/÷å�ý0É—çëÿ@êÊÝ(M$øi'êsïO×ñý„]¯šÅ¾!Cèó~{QãQkÓU»êU©DšBÿYôñ遼¸³ >#IÒ4ˆbb†�¸qìïöþWúÛÄM{L>ëD-¨Ài{QM0ÈRcpA ¶ mõæ3Ü>:Ó4UsäfˆÒ�¼’FîTLl›Hh`™ç–ºùwôïÓý=8é²o³úê‘Á´@ÀöUûä¬TrZä¤`Ó¼±t-‰Ì›$8ÌX€˜k[¬-«F„$üªIœB®s·NÎe |-·wfe褋£R†ÙÀ# gå±UŽ?£½ëÁïš.-çC�õ“]W Ôìö2Ê–-ŸìkØ®è¨h¸pR˜å0'Ͳ"-³Èq’Îy±¦7~ƒ=-»†ƒvøP-—Ö6Á …ÜâBîφÁ:ééŽ/µÐØYŒuÖiE‚BêÑä|ÈýãÝcΩ#‹´AQâß­Ñp<½'©˜:f[<ÅxjÑ­CsËbÚ&Íe\€Y,ž)SCÌI`€žÀäŽßÊÒ–Ò…Qq«65”.o5UÄk{É^x÷—Y¢° ÑÓUÕ÷¬h�ùOv#}n†°xÅÒ²D€In<|k6¬á|h Ôòì¨EÛ‹&'§]¸¼Dô—;Ï8¯Wc6m@v¢'g#èk«^”PIÖ:¸Ä‹ÀVŽš· ;w®6PIá�àH:\ÜÂQÎ;1�›m8í‰=çFbDyÍgK�RéŽÕmHÐÄ%»{6Ss�„š¨Ñ?}&éÊéCDzûS„Åð½cR7\�€7þøxü#ð"þ-^É�ÀåFçä1¹dÎB:Xy!ù«ùQd¢ÑøäSñM2¥X�~Þ1²Ëù"˜c´Ov‡ëA2¯^‡/“ícS�IÈ×ë~« ™�Ã|yå’Oˆz�blÚ´Ù?”bÓqDÆ‚—@€¨·ž�ŠG/R �Ç[­´žã¥šÂJ‰ÑГ)7«�‘Í×YR+ë@qcÒ‰J«Äq�²»¯Y�Ý6¬1¹LQî± RO˜µ˜±%Œ¥Y:–× 9 ¡¢�æ¶£#ÅIuQ_ Õòè„A'OuÉíd  ÝѼåÉÅ„‚ͦÞ$È8ô܌ʻ“ 5«¼_ÿyÒïÛø5(WžmôÀD%ºè…wXÜ4ßÌZ±ÌÄÒ1Û˜=¼¹ýÖQœ"x.j‡¬µkÉ–Š¢ûнº®FuƒÑ|o.æ~Ñ(Û/< Ó£~Æa‡ýyöý÷“fü”[MÞÍÜ[F5cnK–òÃè›ÂÔ²Ìa´œ�BþoÍ3 ÝýA°¾.GS"�+Å]nÿÏîg¼[&XpÄÓf.3™—nQø¨²‰”�AÏ,mI¦{[Ë=¨¨Í®'‹UiLž«ûÄA¿äE=à&¼›‘æ>q$1庇Zû"³ñ6G^óB—ÔC§ •ñ¾OnIº¿)¢Hp#ˆþ&] åÁ>é‡Í%|PÈÕñ ƒGki ½Í§{|~lÇpÍh>Üf)7ÉX¹ÛϰF2êËÒS�q)Íbðcz¤j5PØ”NmRmUÑPãZ˜q;Ð8«c çpŠ»X1¸ÕÙWÖ˜”Ñ&¹¶´ó³ë* âg»Dd©@Å@íd¹ÈƒÜˆÖ°!îÙáµøa‹bËþÓð�‰rFÓ;Þ>gº)ÁïïÉ­ë¾_·¯lxÚý=E|Œçi]|e”m¶ÙœÓZìc™?çûßÖXÉ(rP—1„.Ûøl~5¬¼¥t5Y-P5+Qôfµ9ÃÐ=Û¥ã4ÙæŒÅ_¤ÚðàUøÀ¨kލX륢”¹ìn�±GáÐ lúDÂþBuÏÆÄZ�K<ÞcìIOZí‹EKæÔ—íüJÝ•[¥dûÜßûû•{Q‡óí›Gß-^qÒ:�z„ªØ™>Íáfg�·gMUÛÒsîfä�ì„F_Ã�œHG«îï|Á»•“�3#'½¼6W—6ƒ^-~–@¿®¦Ÿ×÷6ó lrÊ•¼](QÔ k" X´ÞkIe²Þ´?ÿß!ö'ôvÊ!ƒ6PÀ/³æò·�„ èÉY»Rf4F-ç×ô±ëþî£Ù�â�‘M…Ø0*ѶA!Fhz$ðÊQv¥%ø·¶DßÕ¨Ïi�ñì� 'ž²ü£Í�w�ZWÖÕvÒ—ºµöbàØayÀnïÓØõ¾ñƒ¥õFPfŶµXEYè…4Rö(ƒ¨À<”J¥z2®˜0Os×vÁõ÷n‡_{€«jUljˆ¬5J�87»)ª¢j’l¡¢�À&U³"k/lµàÍût×s/“àµ>ÇN$0;šÐr¥*ï€w(ãr�R ¢µ ­²�ŒföÕ9°ÛÛb4Û5Eµ/+£èhpö¹¦)¦i4ˆØ*³ mµa�¥†ÖTºúÕw¡µbCDjf 0Ø¥²’ ¶ÌTÚÖk-´¶*#c¦¶ Ça.V‹b¤ÐÂdT[ •Ý]0¤i•M�¡"Ë[RÍ"�¦±©C[�mª”F�† i𻆆•’š¥BUF–ÚÛªB�¨©#š î ɨ£€µ”•  E딪¡ÓdmaVÃ)¤@=7•ç sZšUm¨*‚­…hh ‘FÙA{t¹¥ªš °I /@ÇL�]iɱ¸¬îI¦0¦° ›JVŒi¤6·]ºE:Ò†Tj*e³ab«[[ijÁ†[3%kTà¸ÕƒH�^µ@HQÖÛml¡mCEU—NjV� °ÆPŨJÌ0ÛYµKl&èeìC&ÆÙf)i€(Ð UU Ö¤#lJÊZÜu©Ñl:W4&ÛØä䀪ˆ(J�²K2Ú«A·¢/x€{¨4 ¢M€Û+Fª„Ø4¶4¥°Q@UkVØT.“° �ÒàmŽì6LÚÒÁSi¬´i›¨Ù†‚„ Ta¦@„”E"O#Òh@©á¤"“L¦Ú¡�Iꤣ)”ƒ  €D��  QH =A)¡bJh@Ñ5F‘„nó¹IÈò‰éE¿õÿ�ŸóòÿùþÈÚ_ÿtÛ+î�™©RI2ÏRQ?ûÔ¬Žd£ºZê™P8£MËÐÝ}vß`´ÓYLÍi‰Z–DjŠ1¢Á¢Ùed¨ØÔ&i«(m˜É¬„#fÈdÑŠ!,…&³K4¨¦Ñ•¤¬e¦�21 ˜mE¶edl¦5–miC`D¦2‰JÅjfe%M²Ú4ÍdÚiŠPÙM™ mŠf-DI4Ö�$‘³l3dm›IŠƒB„@ÊX ‰Ù‰¶f”Êm24Ó)El©Z3MIF"*‹!HY+3A&(¦Ze²2�¤5YL´š4¢Ä˜cB+�4ÔÔÒ“PÕ$(´ªl-›eE�¢�iHÖ¥*MRš-06ɤ˜ÃTš¤+’K-*jl™50Ûfb‰³-šM�!!™¥–1©¦R@i£DÊ�¶4 jš–Ó$ÄZIÓfe±T“+2‚ÑE�b±SM±RU™FÄÍ �H“ i-�¦‹1Rl²È™XYA³F’*¦Œ±fXÉ”¢YlSM”š™³LÚeQ¨¬6�–”±PZb¥F2X) ´ÖM$ÓQIŠɪMcY ‰²šXÆRªM¬Ì›B›M62XÌÍ,–™&Ô!,CE"F™³3*#ËKH¦±bƒch²–ÆÆˆTi%J´ZM¥Š ZCf”˜ÒDÉc­&ÌÚ$›5›KMdd&¦m1¥K4(ŒTÑH0„m£JÊÒT ÈZ–&DŒLÚ¥(ÖJR’Ù%5d’¢´šÖË5*Å“Vl0¤Œ–²¦VX¥4¡¤fŲ jKX£m6›*d˜ ÓlÖ‹2M³Sl¤šÃi�Õ¤¬,J–Tj2k5¦ÔÄÌÔËe¦´Ô©¨TL•4Ë#l´Í%Š4€�™k ¶(""EMVjQª&iJÊFŠ4h�M!’ÊÀR“)²’be©¦ÍK4Ò2‹D̦ˆ±ŒÉd%3i™ˆÒ"„± I$ɆIQA›6Jidªl3j"›%R̳I´JD©¶–Ê“mjf°d¦BZ‹f†¡cI†¤¨Â11³eI¬ÃAT¤Ù’$Ó2–MLѦÒQ˜ÙMFÒlÓiR! C&Ò–VË%�Œ²FhÚ™3JRl-6£KM%6Zf¨¦cI&L‘ e)k)�¥¦¬e”¬¶, ’›¤”b�EAJb’”Á’J-¦²Y²Y–"Æ´š ’–›F(•–Lk6TZ‰RDLÊh›F‰•›MMˆE™´–ˆ¤¶¦•ŠKi²Æšm™,É”©bY%&ÒÒJT̚ưjTˆ±”¤´¶I6Vlkb"ÑD™J1�dŒ‰j‘”R–6)!bV–RRi2ce(“$ÔÑfɢę²6i&(�e–4c’Ë*(¢*M�™�24fTš@ÑR›LÆÆc4ÓY™$µ›f²ÌȦ¥fY5K&j+)h2c)fILÑRÚTj�MM)$�™E±±DSK@JH™ih¦DÌÌ“,¦RFM™”m”ÆÍ(•4‰EiISAcDR˜Ê›EQ±Œ�¦l³L5ŠK2‚Rc*DÔ´¤Š��”ưhÆL)2ËK2ÔmFÊ¥Æ4LÉ,Ú%&�+I¢!¦fBM&šÍ”LU,©)ši´Ù˜Ã&Í)›L!2k(ÈÐ$Ê›(Je”ÚS34ÚSbŠ‹E(š²F™²S)4É“%²±’dI’„¦¥’Ò¥[ IJ‚�ÄÂL¤Ð›¶e&�¦›CH�‰KI�SRÉ´ÉFÀ©3 L4h-ª¶Öm¶ÖÖZ­°@@*¨£ðª¢��POá_åU`ª¢ŒUQF•TQ‚¿€ˆQ5Vðæ¦‰”Z�c#PXÈ%´[M†•Œ£$Á4Ù¬l•Q‘ІÁ&š”HÉHÉI“R ,ÚL¤Le¢I³P‰),¤!CLi %D„¦lÌc"$,š,˜%’¥£°bÒM$Òj ¦)²‹)¦š™cJ(ŒL…±*i› `2ŒØÆIbb ¥$ƉPÚ,²hÚE›,5šÂ)L1¨¤iŠ„,X)¤$ÄÄ…&0ÅIHÀˆ¡¦2IaaY4�3Db¦&” ™°31Y™c’Ä‹(¤´Ëa–bˆ1"B%1¤%•)©€%1¢Á SÄa¬¥š2M&ÓP ˆÑ!#J"ƒ#M2XÙ¨F̪˜¦f#PÍ™RFÊDš#… ”l´–Æ3HIJ6Èš’&kƒQ– Â&ÉŒ(% ˆÒ3lŒÌÈÐd¦Ze´Æ–m(#I&™™‘d¥D ¢©ƒŒ� ¦²Ø”"JZ4šÈ„a¨–ÈÄCXئJf�QŠi$š2±“if‚Æ1%ˆm4™ ÒɦZˆ@i©$f)›&0J(”š‹ 22%‹ÆÅB(¤514AŒ¡i0SÉI ÈÀÑ�™¨M©™6‘±,Di$ÍSDÃJ‰ˆ2"XdI@Ì ˜1 Q’°j5)b%Ͷ÷+[k®„‘I‚Œ&1F0’›¤�!$‰¤’1!€Ä&HÐjfB�Å)HŒA HÀRA!D€)KHH ˆ‚d`ƒ @Xˆ¥�RI!$10Ȇ$ ¢"d3H@d’L „Ñ 1D(FH’ É�ÀÄ$‘dÄ�M šB@DI‚’ˆLlhX ÌŠ ™ˆd‹S“’aAAI“˜ Œ C2bɃH„‰h±‰ Â4™“™@Ê Èh"e€¥4Š&A `ɆL"@É ¢ (0€¢&€fÆ,$`Ðda3LÄ!…ÀÀÀ@1¤‚,$ÈÀ˜FM �bÉF‘Œ‘(˜# Œ 2!…1°HÀBQ�¤ÀAÁB€„€ Èa@(Ábd‚D"H‘ÂÀAb 0Db!1£Fˆ" ’H‰¢„ cI  ¤`1†€Òb "6„€Ñ ÀH FÀ$¤2% „ €‘ �X ˆL¤ 4F0`ˆ@ˆ€` ÈDb(ŒA„C$Æ “`1HR b‘Ä& ÐA¢#`B ŒÃ1�@�b£� !a ˆ2$�€Q“a1„ÔIA&ÂaF$¢ �“0�!�€ˆ 4dÀ1�¤Ä‘Š"’H_‡ã§ô¾†ÿ_õŸ™c2�]ЩbˆèrZ|Q·^ˆ-`m¹J�z†«ÜâtÒ8»žöz©1N`¼ƒz\]~ÜZ†´"Óög˜P5p_«Czo -‘ƒOžŒ«�IÁæàá¼§·X©ÑŽ£ˆë"˜sVž&auu¨ï—— ³hg Kº.Ù¹ì–7pXùpªñéTl  4k¡Ú…ƒ9ím;¢YÊÙާ—×ÚÙÅí× Þ!S POSš.â V²7óäë ÖÝÍhh,æ±N6ósU펕ÞîfVˆ3 Áƒ•ÐÁ‚RüDõÛ«›K¸ÀٱDžyê °4+iœÁ¢ 4­Ä¶“±‚=ܧ…t�w<³,÷1«tŒÓWcC`Ä`ÙoC>�DAÜÚš™I…¼ºÌ#´8[·ÁKØðv+„<Ú©ZïÛÕ~éz2•ujYy•íÊuL+ž*¶ØÒá}Ç4¿nóm 'ÈóQ)«¼ÁÙu… @LÅ¥ÍЉ]AïµBÐƇo=BétÐ¥q€U ÷nä½ÛÑ…”j¼­PLBd=¾~¨1 ¥Lß� ¯ÓD¨|A¥×bƒ��ÅÞ^.+¯¯ÇEuä´kµà´¸Am¸�0ß=5.nåªàs‡wLS‡v´3�ûØœ;¬X®;šïw{— (*ÓOT¡Y\'…áEÖèá�ó<øwCëâ!¡ÎÏ]öÜиe¡¯é –Uî)¥*—¹ê�Ú«$±rKµ¹`�ùØÌàÁ•7†WÃÉŽ¿‡»µC¢è]7GÖÐV°…è$[ŠVö݇²v�zmXÞ³„:É®ÂÒ3E[–*Ŭ¾<†åá Ö_«jXLV„8PŒÂ)ö±CI«5:ý§r�(êò|7 8åúIl;×MM¡§´Qàže†²´-¡y¤ ´+v ®õ¦ ªÙÜ BˆB¨0üôÖRî*P Ân÷l[ì¯!Á€¶§‘w¹õ¡.ü¯,ìƒDØ(SŠ«#‡ ‚MiioEN0²P8ŠË¹âߟz�A|B£ÏwtA»aì›ëŒë2;*ë"º¯Ûš= ÁêYJ@NsºÙ§¦w!Ód×KÒЇfÁ™g0Ö`73w†i‚öíl\$1Ø n'‰%‹!Y[œïx^­¿.^# áz+‡Wû*˜žXltaXOã” �ÏŸ#WX%[ÃÞ3H�:¦¢8wvN×e¡EºÒåû.š´ŠºLS÷ ½“¸fP§8 ÊÍ9�o¾«1ù€|cBùò�icÜWÜpL¥q윫E]œš:ñ“ƒ´º¬õÒóÎ}Ö&3æ;MpŠvÁv»�Š”±dWƒEY•E³9á—‘p,k$­¤&éFÉ�m =V†S|²j‘ YÞÁ3Ÿf¯zÄ]W¤-͡ާÓfˆ!¦¬FïNÕKO´<™Ä;êA5™a3lws�„“R«nW$½I"*ó‡EÂË�ƒãÕæôÛá0åR´n0ÈžºÎѝTµcœ‡@ܶE檱YÑ 3Ú6°¼ÊºµVÇ7l�2–Á˽ΰ½Ü6eX´wt§yÙ$[+§.çtõmõ>ß1y�ùõ ƒvë˜çB£ÐDS ®Í[ೈ¡wÊîøM1’£¶6Å�{ ªßš­T6!‚JîÃ@ëѾÕ5­·¤Œå•ÙD­i`tŽ °óUj܇«0]Ú§o–íPáW6-ïH7¡ÛÃìZm]ïw¯.pÞó®nehÁO „ÄPN Dh6[¬ERÆÓì �Ý– ÇUc@Õì›Pa±—�j¦Mª¡¡ ¸kwÝo\bfùƒÕx¯ÕlöÖK—]^W\íÝô®წUŒ è‰@ š@Í XuðE2†)ã‹•[Ń0ˆ12ùˆ¾g]k³cU�µÔÆÚÑkÑDXŠ´hÅlj(µ%�QU`ÑmÅUÕ±¢µFÒkXÖ+RQªB"�“X¨�„Æ�’رcFÑc�¨°�`±±´VÉ£4bÑb*Åc*1hµ&ŠÕ¢*à E“l†ƒZ(Å&ŒcQhض’£m µ�F¢‚ÒdÑXÚf«b£j �XµŠÒ%“FÛME‹E5FÔ™-dÚÁRlj JÅbѵ&ÆÆÖa¢ ѤÛQµ2 ²XÙ £1¦–Cb±&JJK‘FÒm0A¨ÔIQ¨Ú¢,kZ‹61a5¢‹i‰i šÅ!!±£а’BQF4Ö)–6Æ6ÄdPh)4bI5E˜Y– ŒclZ�Š�ØÑmE’ÁQ­hÑ&Ù"(Ò™L’d¤$¨¤É’ÑÁ $l¶†˜d–2M"l²I¥ÓBŒHÙÒ°D¦ Q˜‘³•4fÒcD"VTØÔ"±f&„“4„´e ”ÛB’hÄ&1h¢‹&ÒLidKM(32Q˜,‘¢šˆ,T$YŠ+K+E‰P”¤È21"‚IŒeŠDˆÀJ3 aX2!´ØÆÆÆÌ³"̱’ÆÑÓE�3Jh”D$RÅH�$ÉB"Ä¢�É› (ƒ2@%„Ñ H…"cIHŒS(ŠC6 Äcbˆ²5ÄÑ(̈ÖL™ÂYšÅ²šf‚Iiƒ22B F`ŒÓLˆRLlQDÐd˜¢Ñ0B!„ ‰i#eˆ�-,¦™˜h’�Ôe€¥(,„…F‹Q$Š‘2“£$ÊI“lØÒD2M’”%‰�4F)bSQ±€Ö$e(RLšbB¤$QˆÉ4°“e2&&I$ ¦’f2"™$‘2Ši’Šd”2lÒ„Ó4¦’©)4Æ`˜¥)’‹ Å †D$´“S&¡Œ–D)fL&AQ©°š4IM4•"–1±™I¦LRÊE&“&Édɳ(“RfE)JH¥%dÒ¨ÌLÒf2“cQŒ˜(Ã-"l%DdÉb¤Ôa± Qµ,TF(”ÉšM4E‘)I Ë&H“&bÉA¢¦4¨%EFÒ ¡2#H3D¨¢Ù4l›"IHÀJLË% I%&FRfÉ 1ŒH¥,Ô’4Lˆ–Q´cD3 ’”d”•0Ó3%%™$HÊÌ)¨ Í“ɨ٢DI l‰„“X¤¢Ñk ©AED�Ó°³2DdTÍf�“$“#!¥(©C)4e–•%¶™&±# Â2!dÖI0Ш„iŒÓ L ’Y6a¢E%JIR1LÒI#$…‰Jl²*IŠÆÅ“4�fJ3JBJ#£[Ì’A"¥‰•hÆ#Ò0Q,I™Š†’R,š1&`HJ’Y%D…2Ñ‚ ¶ˆ¬šRŠ&3‰¢ƒ#R64bRÌšI M™¦12)�e˜T‰&)f“Ó!SP i‰(Í RhÖL³%%1›M±)©I2FdŒÑdŠ�)Q&¦RL@1b�‘%†‘˜¤‘"±™L Q2”¨ Fa™$L¢Œ”"S% d¢i›4@e2D0Œi²‰i6f™©)&Cl’A�F˜Q©I‘3I3´¦eŒ%ˆ‰”ȱ3$‘"™IL‰�#ɉ6”%$Ò�F˜)ŒjLÉM%$�a$R„P$�¤Ù$d´’Q%2f i‘"M%$‰"M¤ÒŠK3)-$ib’$S4P±1±’)FÌ�Ë)2Nw¹ßÇË�ŽÞÊYIÏr̳µn÷<4xûÃÂý�&Â,Oa ÏlT N>�ÕA?LQâƒ]`Ø5aBÆÕ »W×bêã—´ZBë¶z¢Ñ¡ÌZ½ÃyOv§ 3FˆæÒÆlX,<©r�bùy Z²Ì/-Ë+4^eg›‰‡oÛ)}M;jï&r£Ã°lÛºsŽ©áêÞ €^/Gí´EÅÖçP‹m“j웋½ÍAT×w`ÀC�µì¹cµ%¤àš›Úê|´XÉÕ* ¸ï,°ßÏLÏjö�a¶¾o²Ûë BE ÅQøjz�j]U+&Ö׊ÙC^Ú^lh¥Gh6¯l:¦*€»½ K­$¬WPhÔÕJÖ˜ àö½—xC†ïD±‚Ó>š8cË;ägr¸EKb¡ÆÄ3z4oŒ@¤ �z…ÌV àÅCBجyˆN aÐÅÌrlnÕ0ïu‡ò÷8nü°š#’s*¾/b{xïåR3`áÝê}¶i­¹—‰1ßvÝl’Ææ±„Á‚m¾’ÁAV Ôôo…„: ×qÑV5\r†o³ˆaÜ[Bº*›J êhqwc]@Ï�]Z“¾ ðt”òÊųh_OPál¡åÅd΀pGx(`Ìáš[]äƒAåŽ;nêÈA >ðÂ+¸e<Í÷nQÙç}ÂñÜ)\”ÁÊv`3ÊT¨Þg Ú.²Wu‰*Üo¬ Ec׃uíd”E»ºø‡Ï= |zűÛðø #¶ ¿™– OGš52Æ™™Wz)ǹx�—7Ü#Xv—:ŽÐài‘/ÙQÅyƒ¼ƒ­[ñ7¿>•*²]ij~�(©Ÿ•C~",f/`wåZñ˜õ_tEätjÛËÇÔ!ë€`»SÚk¼KA¸2xo±}Øè‹®K/U ëf ¯Y�@ÅŒì«Y¯\ŠÉêÞ•Áy„Ó±¢óõ½¦ ÉÑ8^¤ÊÁcAÚ0Š ÍSÍá6ég ½7ײˆÓÃjAVîÆ6r`¤ôÕ˘¼½¿0t1^ä(,{ì>,R�Ó VuŠÊx™Ëë*®ûr‚šÕ`ÛݬڮA¤6ô*\ÍV+ÞA† Üon¡¯�«å¶ Ê­ÐøfÝÞjù›-ÝŠšAÁ2²îá¿!/EdÄðaÞ‹:vÝeÉ–u[°ôãìʆ’�ºïE„°"-U\�X£Á‚0tÍÒ;yT #�möí N‚rÊx8U�§âðöøà’ÄÀFØ7Ážëêé 퓇�Ž+ ¸o žX÷�YÊìn†PZd=«Ù~ë1]bˆVëprêLi ѻјÒ:&WªR”…À̘؞ƒ�Ë ¡¶“«¯4²p±ÄP¼�8Vàš,fѽípÚ¬a•mQ¶ ,¡BôcË QÛÆÝ ‚ƒE!f@mO6ŸR×z7EðoC§º§œÌ6{^§<‚®6Þ–��½ò$Xâ¶Š°Q¡§çpê®À­u;¥óní^ÒpP«ÜÐô^Ô[î½]U‚–>(nŽÈfÃ+© ¨*Ä{)&WÂ�)Tˆ¾îÎ4Ri©»kB�Ìç¨,¾éƒ¡œX`Õ-Ôzj¸.Éõ¼†Z÷µp˜/\§B÷,ê꺂–öÐ9îÝý×uÜ*r ÒJð–NZ4}Uí'+™š8N¼73/·¦rr@wÝÞÜãxh^Ô¶?#bê+³ÄX®‹oXHvÝ)dÖ}²ÀÎ A$‚*×`¼fËù>næÌ_ÃáÞwÂÍ‹ì`ŒX"™Âº÷ ÍèF1¤Ý�,›^¾9ÊUûö{½Ãic9Õz²ÅPFlÕ‘¦;bü®¼0(n‹ƒDYlI±è7Y=;H›Mø6'¬¡Ä,¾|¹ò²±×vÀu±yógfKmgM÷!| j |°0ôéÇ~ŒìV#Í�w´º*Å �»iîª ÆØÇpC—`ÉÛÜ´hmB‘¥°eyB°¶*'‹TÉÎzlóà °�A.z¾u‚2’'¦ Ûù×$ð¡ŽÊÅ­æ_DÀ0Ó=ºúl%„)¤xÍ~§Úåq{È_`(f/vhé™»@dY€ $ëæ}/¨T°½•£Mà mí>ÙØSîºDìƒqð£ìo¯rë%‹±]¹�ÈJÔÔ61;y²¸_3nõÒ·3+(™ª¬¡bòºõUºפ`<à 0`"z©Ò•éŒa²éAI×J#—¬XÚw|¨3š£‚r¤ã,&k]+odž5Ûë$ué\QQ�=§ÂïJÞኙ3dÞEîpÛ—b¨X¿gºÊ„Š …›pUpÉ+­-¡ÒI•†ÆuS}Ú$�éxÇZ.!'Ho(<mUgžÎá.sÑ¡Ä'dYÌšmy`]Ðz¼.g Ðì�z�z'Ù2-­ÄÆ2p]¦5¡ö¡N8K±øÞ†1sÚ¼q ~o‚ñŠÝË�7Ó#ëî·—Û`›³Jö»°h€è@ŠnÇýÿöÿ_ùŸ÷aÿT6E¯þgÿ—ÿxB]W $�ë Dmй¿$ÚE£¿ø0ÂÒÆ�ú¦#çJ•ô‹_³¬(ØlUt«J?—‡£Å$Ó¶~<2/øß¯­Á£,¦Îùb“¢²p¢(ËC!纾Pæ§ÒêF‘¤Œïó%s¥7�K¢*Qª@›–“ª—ç¡w6eÛ¯‚²Ùº²ÏÝšâΟ -ëƒSH¤!ê Fj‘6è3äÛùß'orŽ xÔÀ¿/õmê�ÄR8K¢¶§]Õþ`Ãg‹®êhŠCîWè©NÑôoò?Üÿ©‡âæ·8¸l3 —H~ˆÇûº8~g‚àŠ¢¤�Ä^£$Ä¢u9…�wvdûS÷ÃñŽ�R¤«©#˜eîÇéQø§Z¾�Ó•ÿÕu×f1VµÂaP5qøÂg•¸OÙqþó Ï",¶r( Ï·!Hö£ƒ3Jdèø�§YÍ%Ýe”‚[Á Dʨ®Å¤Q®K°0ð’¦$ˆ壘XÈ`å2Ñg:ˆi|SÇiÇ5hÄbÍ,lBá�¿Úψ]ßH~AŸIçÇaI˜åع·õñ}öíRœœ×÷Ná߃j‡ýéGËð9Œ�“•KCFþ]Ц«fˆrŽ)¿¥éºÏ4ãow›ý§E""÷i)$$�ÙŠeÊÿÜQ&åÕL�?ÄŒYYA¡üMϦ‡oáÞ¿�Mˆ6¸Ü×>çìá7yÝnöÑ'ßXú]#½FJrˆ¯¥=bì/ãú¹ÙÈ>šZè%èlœÌº¼íÁXÞd”ÝÕ n½V:f*r’_Ïæ]X:k,(ÖÈë-œ-cMaŸ7(WšÇé#¿ÕTóÌžPðX/ ´GÕÊš\Þk¨ûñUÒÒV )�Ò a…Èÿ_KGîŸàÝ.tóQ’Ò_›O›ëg6²jvÕתÈü=u“4J´.슶é)æ­EüÀõgÑÚàA†ÿ�‰ŠBƒ J8Ä"}|^Ïæ¿Z+L÷ èS"ãëNÝhP4CjLUþkÊ+þe•ˆ‹¢˜NŠŠÉïÛ¼Vþ6b­?¿µ¹f'ö~¶¡Ûú‚·¿SËGÙ¸GZ¯ì·w¦ˆ‘úMÂÿ·Òsë’©]ªåDÖ1D}¤H©¹ôU[ܵb2›ÌDÕ¼Q¡™Ä0æU²3 ¦p1Gù ˆ¬¸Å´pü]³D¶öÝŸ¬“¥ù*êäŽ@*%•5ª’p¡ACÊCêÝ‹=ä®{ö~«jùU±a¼¨LQóQ¼|U¸)µ C›,�7/ú§ ½_ÂWAjÄš ßÄt¹¶|´µ9åG‹yyse3”²4&„á¬ÂiLwñSàERóú>ù«èÀs˜ÇñÄÑMŸäˆOÖUþëßÁË Öm!‡ÔKÊŸªø�…ŠT¦ºaÚÛÚF–”-QEÈÓŽZ•O¶°Øža-%Ü9;Ô;“¡q¦æFi‹Å`‰\…Ï*°wôžPX?:TŸXŠ#9�ˆ]\˜¨áxíP•õðÖV´‡ÑÅoËÏ£–’=+å-7³èø©ü@˜¦)Ÿ™ÔÝÖKy˜Få ³ ¦ÆŸu:XBþK—«ïë„,Ñ *„�~ÔvTQÔâœ9 ¶…-Ö „ýE°çSø®"b ôžú[×úàÝ Ì“éc²ù7 �¥òQ+—£† ´Ì×¶´« Œ7?§Qb´Ž?ÉüÑVoÔtQ2-IT¿ŒVÛ£ïÒBºÛŸÊ�_Ñþ¹¿‹áÀÈ�í}]Ô ×ÝΙ7(ȯægæÛ«êqx(×Ïæ:$ýüYÊ[aÊø61ùlé×ðáëìfæÜ£Ÿ—=ËHíÈ4ÑÑq$i ÃûJ£¦î¿pwáæ÷$o š‹¦Óx­“«ú¶ë¿ÑÛP0ž/â¾o–éQZyKîаˆ‚�ãtÑ·"þ~´=¥öÖRB˜NçKþP+ù�¦¿Š£ CfUÒ¹J“ãâ ¤—Ù©q6 $”FÇ×?C )¿²BF “ˆ}7„¤ ­I…äîœw[Û”—˽D„œI(FQªI⪠ò6 6¼ÏÒ‚ºýT”ý¦Àoõ‘ü>V‘C¥â! % ©"åæ]ZB˜Ã ýX$iÀ�QÖ‹^ ‚• õ ?¹Lå„KI„K)µ=¥ )2ˆ®B4D RUGª�¿'÷ì|üCüDSQ†Rä0Š"«ñЫ!̬‚²‚@ðÕlA Ö ßI• › õ�AÖ=í+ÛÑYc¥Ü«±cš­ª“4]g ò€îXõ› MØ@UP!%îåÔ(-b ïC)ŠPµ³+0wÔ±æŽ1ã�sÌ qÁ0\A´M»>Á<0é¦2¯ >0-Ê@kJ¯ÞjZ!^,êrÃÞ9C³H>•¶ý‰w¨îE\pÛ» ×€ÞYB°Y��ˆ`M…ê*¯t` àÌÁ ÿŠ‚‡ÇPÞ6ïæ ïÆ 1¿õýþ³ÖÉéì{•LÚÄj£Ì3•F5®ìŽìŽW©¢!ö2yÿoöNˆøÂ!áZ›÷ä^¯÷/ï’¯Ò~™Kíä\8mÛ¢?Ïýh]†Ë�2?:¹Z«ú¼–E¢}ÿ¯þ‰%z3ÕÏôĬ|[HJkêk̵XkÒ—Ì{ñgõY´GÇ?’¦¶(o«*ªE’~Ö}!�”žäEAÆo|Í(¯X®Êúù[Šˆ@„Ot÷2F�YŸ¯â­Ÿ£d†Ÿ; k0¦•gN¨fy(½Ò `ºF3šj:CáŸ)ˆ–œ |yREi” É͘ŽR;Šëú–%"8 ŠU,6g5*¬‡ùöª’"¾²�Ô£m?§!b›qUÕ•qÚdwÞfêGM!Mw7_Zç”òAŽcžsäãð�ÕÃóë¾gáeïlÓÝüT¹´Ï¾ØŒ’ 3áY×�#ì�„AEåJîßÓò¹‹æÜ¡aÓ2“²I^·ò² ðˆO·þ)�ï…]yaJáу÷*ªX`CÓ0™HFå‹p¡í�H$üb丹â›@ÅSùJå9ð¿æ“jàÔÙ¯NS.µ F€«å1$嫲jd(— Bêü«»²‘�ÍW<+Ô‚x·í7Û‚b{*!wÊÄ¡;¨‡+t òCÎÁê_ULÁ*òA#î˜iº,Àj›µ˜?ÞÅPÖêùøš=˜ÄTÁ]jëD³÷Ý^¿¯�ˆÞ ¥B{fâ°©69£ ê‹Ó\µ“±”‘¾PþÏQI4utÆæ¦[ÊxOÒ‚F™mçJuÃQ$L€Iç䫦þœÉ¨.ÛÜÖ0 ¸,ÿ_w�hç~F“–>:ÉõfÃM1a“ö�`‚IÄL(áß٭車wBøyÿy2éÕy‡e©�ÒøD4h¢IECó"ÿ Úë÷-ú [ZS¤ 8d �LþØnñ 5ÃUTf%meÝñÈ?óeq{ŒÜBTï—�ˆÑž"Áõši�»TcÛ0i¤@ÆNyÙ…­¦3(.Ò›“çÆ©–`*Z?I°i´‘¯Ôò¿J³ Pl§I?°¾¢²þ s®Ãôs 6Þﺬ*ÉŽQÇÒ¿›¿–!àþ˜¯¹êi¿3Á! Ae>QY£¢Éií/íz ¥©Y-2Ïß/Š‹­\dˆüùN± ð¿ŸÃÈ;`E²ôKN"2Ÿ¾Õ‘«n�ƒž™üº¤£ØO÷J"‚  ~:{ñzÈÒÞvè÷Ô­2TI‹1+�ƒ“2çøi$`�ê!«çVÀEÙø¿«¿¹õ»[>SßÐnÖ¶…fƒ ?]U‚¯ôDµm Ùp–Wï¯äûÑŽË*6áŒ7–=<Í9®¯KLòaŸ)‘&f lÕÔÌ�¥ãÕCS=&XÀƒD‰rÚ?«µÜOÑü\“>£*68¥JFèéá(FV§õ˜G<ä ³¯4̸bsT<$Ójéñ#ã÷ÌþŒûNÊ"ý¾‹×IFØ=ñ=xëû|ͺìÐ+Ðj‡Ý¥Žìe»u'Û¡uÆwêt¼G …ƒã©TB}×6.~àæ…³÷ .þ}$«á„ÕèùüæN@Ù(m2“Uç�öêÐŒ$Ió#ïf÷x7õŸ�ñÕÿh8¿´cjš……ùξKvGݶŽibÐã¶²¯ê‡V|º²ûŸZÅž“á÷2aúÕ"¦ÑhËHÃõ[v6ò|2…l¯§)w@¤¢Ä(¦ÿÁï¸>¾Þ-¯¢/�_ÕQxmóyõk~ïD8¹6‘ýj2ÿOójÌ>ó1ÉND€ŸbþùW0<dKŸŽ Ãö?[Où‰e–¨"â3ühOiˆ ¦5hPXÒ©•&Á‡ÊÕŠ¼¯:*LgÉýÍi˜àúËÏä‚?Ôþ‰a°k)¢s0laKŠ2f™dñÒ†0ñ�Ú¡ iT›gâ˜R÷‹�Ã0–n"h=“ÁQA9$lG I0ÃD6•/ðv©á šZPVØÑK±;I£yn �˜übþê¢^x`£ê¯QfE*›^øÇVb̪VYÊFé› 6…*4©:¯ÙÒ*f‰¿´ Ç·÷üüï}êp…&üË)mÓî›É™¢D†MR¢’&UD–�Ô̳åg ýs¯™yòáðVˆªµð»µp² TC4±‹jë§«òÕZ¢XÄŸÏ)kèÝF|¶&aúª�  ð¹wÌ¢1Gƒa­ªõ™<˜�b(2; ˜Èƒrb$6ð„hÚ¾´|¦@}ZOöKëíÁÁý­›µ ü§Jƒƒö!½ rQ&ÆL„JJá äªúg‚M¢ÿ“j4þ1S¥)!ô�+I¨×¦µÓ|ø–_á‰-ýö`=Zl·mÈxÖ ˆ1SúŽ» &eÙÊŠŠÑëÓȽÒ)8<ѧæX”æûõÝ!n÷ké)”ž;?–ðùce&@h@¼z3!yÚ•È(R1ÃÈbÊ"®T8n;¦˜!Â&¶@Ä„%yzBWѼcè1}-’’�™Ó…2ÆKiZÉ·¥�kaÔÐîŒËT¨]¤b‰1J&¹•Sñ$‡ �qzq*º�eá.Lö�Ç]}â®x\¤§ÜúHªXbé#1Yª©ÙªÍž�Ú �È14úÑAUv†ýÕKµ3A SÅÆQ Ûl¬ ä"xΓÒ$«H!($�‘óæPÃõcò'Ý?‘fsS^}ÒðԨ‰J´FkIcd="pá­TrÎŽÐDÃ]”?¹šµ´ Y§ÅZ·1¼ÙRaÌsx ÷ß!o²¶Çd è�! #2O¥’TÉÎ2æ‹d¸*¦`U“8Ž¥0rdÿŠ)5*ö ·Î|£ÑpI;S#$C2dê±îeýYP�‰Š>¢Z(>·PI!ºÀ`*Ö´ÁÁ.¹î\<æúÀ6 [d�ƒ§ž™îOT\uaá#&�]cóþœÁ±r؆Ý�ÃÂf`,Û¡¬Í�S¼OŠŒ�_¬d\+Á‹ãÕm ~bf+QÑÝßõ_º†”|­-ª-,áú3M5l0“#RÊ¿œ@µŽÄñ �€7•ó�#ܧ`Ê©‘Hܪö� Cí�GÓTÿ”ÿhæ5誋ü¬k¿‚9„uëê¦QòuG˜,Ü¡Ö#vZ ‘¡Y/lp2Ö¡šä ië"ìuõTØ s}c|Å�»Õ™ˆY|SÙ@û½Ûhø*V5‘¯µsáZªñ^×e •Ãä1/f놞˜â3*uÐŧ"v€½ºF›6†W“‹g¯(¸F*¸ ÌEØ¡NâDÐÜÛÚjBƒ¶QS„ïi¹ÙÃùŽ[ìŒm[‘õÓÊØuö"DVzC\jƒá¼CIŒÇ7„ë~ìCkйÂç+¹vÁ“c¶uÝöty˜£µlö·t�¸7{Z õéJÏ DBë¬lo¬v8re ôPBÞk{ÑvÏM mÊè ˆ4 Ð^‹”*çmtЬõ-ew¦Æ#ÊHU}êu‚t£‡c#j†Aƒ`.joP`bpÙ–ÄLA!¹ébå,Uv¾V ¬Õ]Æ ’ÛÑC*¿ṉ̃¸ýÌvØËçÂ÷ É`�Éu�Y<% T;Eò¤9æt”]+XÎR.°é6ôk‹"`ÎQYÿØ€€/�¨ –“ýiƒã˜ïÿ$£�vÎ|‹kÈ@Û�sÊKãÇ"¸o˜s;-CØøƒ‘…*AGÖÁø¹øåñoœÿÿ—üÞ¾ÓÔÀìÑHÿÿß:NÁÔè_EXt�GâŽóí×ÁàG½ß;´,ŸÓýôîøœ€<ø‹fÇ3Y³ZžJ—ò?Û°2è(p‘�ÕYúíøõëÿƒó÷Ï}ß9ªüã?]ÿÀç:=ýã �¡x�~þ…Ø8?ÃQøÏ='5î¢ÿs»ÙéNúû£ ¼tæz{Þ†>qô"? ´¯ÿÀˆ€ oúz�ÌõÜz;×RÎx�æÉ'í›õeyñJCróö‚7z,wçø¡× ñ/�ŶúÿVYP ΄àþ}¼5ñ­>=ƒÇËØËôÓìÂé²õþeEkOÞª¿äbt»g#*Ôf‰Ç‘ˆ2.ú�…´±ÕâL܈øXG|w iùØNœÜ_Càð("z¬�”»•Øöƒ ø™DÔc„CBp©ç�Ñ"z˜�HûÇûâE·ì;—]†Û;^ô•/1caÕ v«VñÛë=§õ öeÓZÿ%éÞ—«Yz½¼+©F\0rïªÎ½Xwgܺ¦MLé½ úËUm?Q„ŒS¹ø¨iÞqíîü‡vñüþ¸d7ZߨÏM—×=6îüûî;,³î F~ƒûÊÉ,Ô�›/]?÷bÊâ_Œ.¾‚žÃ™.Ïâ Yãq}M›O—ÃG?MyžëÌÄr6¿z€©†/*ÝŒ½È&ÆI©ò³Å\o»6-F•»å�’ $¤¦!Ç›¾•À—ÜXÞo2S>=g�»ÉµÍhÎú�:ž˜úz³ÿxÅSÁb`Ý!.Ë· V¹‘‚¬ÂBè7  ¬�Êéø€€9šÏ¯,̧é=þ3Ò`ýÑýÔMþêR>z[ê¡gïâ.fJ¶¦éPoC°fäíxØL„}Cf¥ÌI‘e'µ G ÁåÜS ÿjª(ôTx›ƒ×œ°Hp±mh¢î+å¡BD$Å]©”ÕÆ€EÅ‚@:À«30¥ÛBFFœ†rÈ8Û�¸°n ôcdÁ‡hk”]²Ì9òUQGƒ™<6ù+œµðÀ¹4ûág¶zì5çù�ßþ @""㟮sòŒ¯CŽ1³Q¹óßücgç¯1ÀŽm—¼ °`ÑÎú¡Ì ?ÇÎÜ‘ƒ(zÔl¸�Î¥:á(ɘó¯Ð G×?8ŽO{¯}M69é—*ÿ'o®D^¿bY<{v§ŠᆓyŠ[Ä8“c÷Ý@�V ÿn;&cÎwuô?ÕdàgbÓèiô¢ˆA¶uÈò5ÇÔ,ìxé"Ð-ýç�š>EÏVŽ”O„Ï€aÏQŠÜ źtr)Î3Œ«ùù(a̽ ãÜ£ˆ38o¿YÝ¿<ÚPõßίû Tî4ýÞb@õí7Ì5«¨Ó“Aÿ>¿~Ûü Í½ªî“Îq˜ `izú#„¾¶ß1rËwëÌE7Òè:cÏCDZÓ;ü°xýv¨~ó‹Y£–ìþw²<ïM!T&X�TêâÔxª$C ôö¶Œ9ïož|}w{›¾-ïvä‰ãàp~Ĉ§gvgç„pD½cû´ì3ó©ûÇ"™:eGšt°wÞåõÆsÏxÂs5‰wãµ Êgiôp‹ÏXá _Ž7@ùú÷ £Ì”ÉLŒÉ-j7�}ÉÚêƒ<²ÚíìQ{ÕæþS¸Èø‡P ÕЇ’Ÿ%Ó3ÄКo<ëˆúoÆžünó?¼�…Š÷UA¥vÿè½Qjľ™oÜtH’U$ y¹Ä°ì¸+¸„Æ]ʈAQœpÞáFšß-¦ +.%ŒòùÔÕ’û‚gi#ÀjpÀ‡áHdC±ÊT(’J&HŽx,i¶. €„Lãé(7ïlVI¨†ÃkesPÒßò+ž"È&ÛFU?LÎ1g�˜j\n4§Þm›ò5šÂï#Û\þëOÁÈV$'ã¤lÐåìpE:“¹lå˜:«±Í™KÄ3AÑÙdÌåëptÞ!&¿NoÓ‘íñðßë›èïË�TûÒ¡�r¡Üï^#’æ‡6-’ÁTgsŒ%�7ŒšÄñ] L‡Há2"fª¢�O9Byž2FD$¯±z¨?¿˜3Œn,<ÿ~Ôr!üQèãQ,\ǯô¼¿'é÷O3‰ž ü��íÇ|l»Œ¬kâ"¨ûHx{{Zý¯óÝÈú騮Gñôqàv9|}wuÊ|8û6ŸôD{Oø}(sª–QÀSÕ;ô>§ç¹F¹çÞÆf>q È¥!……‡Ý×Lå-ýõò»-}çï³G²¦{Ÿ3¾Zï>:AÚnà8¼}µõ@ýoQÇçhd~ì5Ýëæ*õØ‘œzCŽ¿--w†}þcoßÞ?>&;··Å Ö{ ZþPx]ÅÔdÿª ÒµûS ¿2˜æƒÔ0<89ó5f�‡+û^úaùAØ[4£y íïgPñÖú¸âøü¡c븄.ç¿¡ÇZpðîè78}~ç÷Æ+ãÌÏ·®ÃÓïúÚGᣳþ¾g?>uRão©Çàèu±zÚúϬ}Ù‚{êS16õÛíóíåû àpP_`³zŠÍ÷¿‘ܽø€æÆß8dkV1þÌ}M-´§ØC·³BŸ8ù†˜°ù¨ (~Ñ¥±ì\Ì'Õ<„Ãeç«FG.d OÐ¥~½›»OuLð<¸}K^¼#†_†É3ÁøÂMóò;ÓÄÇwãæûw·ì~ÅçÛ›á´^ H¦;x½Œò•¤Ìf|>‹æ2iN^þb5óàj–¡÷—¿Mû O!�cd.™ÐA¶�¾üò8Ê ð9˜àwO³uE¨”;eŠÎ‡ä7Šx“h ›Î�¦ýox¬{dåØ}[ÑvB™¾ÇÕ#bçÜ#àó†ößëd^(Ùø]…Q>(îþbë}PHlŸûÎ>¶Â,+*ÖKÀöÒÏÓGYD8´¸ü¯+y÷õ ßjâO¸óîÜAâô†´°är=bñt²lÐÄ0tÿ†x¤á¯>¼ý~ŽÂ? }SLSYnmCœX†0i|e—<¯ƒCžï{$ùF¾–Ñr‚¥_$œ‹Ç‰äPT2 Dß3Bá¯ÎAõ¥üÒ¿7…àAÂÁü 1¾Aøt�V¾É&¡„F6}œWoM‡?2�67Ea¬S!�!«Ê[½¹àðe`!ˆãÁÊ�k Aˆ0w¼B‰4{à \�— Fæ7,}gjsà ³r!3|f"Þu}#+%Œ¤*Äs[•äBÂkãM0ñnñGv¤&†‰Gùî“K¨¯ü±Ⱥ¡ØŽØ"¦ˆÎRQ^1)l�ò/šâ©VFÊ~ª¨£ÖükVÇ-O–¤½ƒ®1jZ=_þf ”(‡wºgºVIí[Ô*™¬rÆÆ¹Á!h!ã€s}C$Û1yð>=¹Àݺ֫ñë–œFDJ’˜‹•m50e@ze“qbr&v!¶3••ÎH‚E÷œé)G}ê&±õz†Aç, ÐŪÁôæ…9tßÖ|�y ¬ñ^ªÄY¨Ý³2ëCµÀdaPª¬T- Pš1f£j%Ð�+KãºM?`ýêíu(*¦šåˆ†GdßþOú£í1Ên“»”ïkÓRNÐȲjqošæ1Å „X36g�fj·ù=v]70O¯YæÖ‡"a:x¢`?жÚÁÁLËC0±f¡ ^L– ['ÞÚç—h- ’]h!†‡æ%¿å/QTw‡Ö1ýñÝd«h(ÅÂæc# 1{ ™5‚£&¼�Í_;7,à­0púeR–j°P`²ªŠ=Ê{éa |ú%l'ÆGî,÷ ˆºdU�Ö[cÃôß…ÌšL¬ú”}ƒj¾–;ކúo<ª?}…Âûi��nŽ3ô;.3 bç»`‘ÀC@< à?²Áªó™æª¢ŒQFoñ­&þ^añ§SgÈ í¼û‡ë¾¥únǑͦc÷]ÇŽöë_ûìKÔ,ûu°Àö·àË=U?þpÏÓ¡Lo@ä>¯ oßXó&3|öhñA g]„Æ¿Nï �¤�ëÐkËÄSµúl8\÷”u.2(ñ͢Ƕ؊äßò=‚q1shisÏ¿ºÆOw°æ7}WÏ]ØÅzý}7´š¿|È5[ß¡À–Vסé-Trú¼T;Bë»c̆¾Óæ¼w&}¬<4Q¬ü÷^Ž�ï÷¾?eÓøM=»•aGŸe› ¢9„±nÊVóO&£Å�FÛÙ‘ ùð6Ûõ¢´úî˦™Ö7„›! {‘‹�â £« 7ÔCF, �??8vÎù$"Íî1ìÛ¯Ô�‰e£�æ;â™}·–Äx Ba¦) ýfPØ÷ù7}ˆxèfq{¡Ûæ…w°co“PKÄý÷`û x“ùGŠq¸?ì~ùþ% °”?oÓ½yO‚»·Ž{¼{ÁVé»CÊøgS†–J-ñi–Е‘ðã §lX'$<Îì!aB1r#mOŠ&rFbZ¨�Æc'и³üÖéjÏñ¯ÑR×ɇ93xqÞ µF°Þ;‰ hjìgH¨�Ð�ÔAË2k ¯qúf°ØŸ,Ÿš.œ_Cd¶?ú;á—„«”FÂê.�t pyÿwTl›GMº°¨h†�dÉh›z˜bƒš�eàxÄþØÌá0¥éѨ¢G‹ü!¡aê¡ ©¸4M„Jàðe‚½åBÒÐ4gÙC±%¥0GÏFg«fa¶ªž,Ki¦ÒQ†br2JÐÞ%9¼ / ¡ `a;‰�Q¡õ™ÆŸ”jÏd@zÿ3ügC·+•ý)M÷%°7Œ�7 ëã3˜f–cÆÓ Ë¥Å9œ‘l…à½Æ uFe{ÎílTû0Ô�ÿkýub¢9¦ÖLÄźTlãe‹ñ5š¹U†­vÇÊÏë_=yž½‹ìb©ÛÎUOÔž£>þ®ÈŽ]ÝY+zÕ}¯óQaIΦsv81@w|Tk³xdñ=ý=ºú¼ Cû°ä,–íoÅ—ç­ü;O²öı‹ïÛÀÀ–ùg}ò7¾îà¬&%αÏ-ãB~M‰|ïšÎbóŒ›éN ÁÞiôë‘{ HwPþîAíÛ °àŒo] _^£Ï»…°µ¹  Zya 1š:awsÃ’=�ïÏî¢>†Óßþ vwOƒéœ_GQÅÇ ¾‡¤QX_Þ>’±Ï¶3k<$“!Çõ%ü¦•øm˜Ÿìf²4ÀˆûŠ g�ÛÃå1߉Ò�¼ÃÏ ïÆ~þ ¯{)‹‰7@Æ'û÷Šx€ÝY±÷Çp}âOÃQ;?¿·Èkcí…&ôn{GÈžn>éË]Så9_^ûØNê £ÀxÆIìÞ5�R¯™ÑDä%/Gçîþ;§áŒƒ·æmÜ ç(û¥g]�óÔäHmN*Ëüøæ8 p3ølÝ?;«!H ,£Ï‘_ÚŽŠƒðú(‡�FS9[ô<~–˰…B¶#å0^«C©>Â-£ +xÓ¬cv†¨÷GõT>#ìZPgS¾@‡ÜÇÂ2ël†qRÎ Ø êEK»XÄ´ÃaÉh¾@CóŽKá÷áF¼sär6zhu¨!W™vøcƒÊý&´}ˆü™”¨¹à¢æx>\éÿa°Š2Â$ù³‹|�´W®Zð råkάÝè–J(ÐÐÞa)òŸ”Ú۪ι˜µêÞ`ÚæŠRg ÿÔHÔf°á”ÃŽ5„É2ÐÃ;Íigt8šñÀï Vbººµêe÷ƒQ@Ô[°CfóJ¢GðÕ ¬‹ ˜8øÊg\&{8pœR#ô¨›4ɦՆ¶�­\^}áÃ%�ú̆ì” ,Ì�$Å-¬6«‘Y ›˜‰Úɲ@Wb��Cw‡–ó[×´;¥š£Mo}ÑhRéð3)C5 T6ìšýòUQ„þÝý0Ëk”C”О÷+)ˆZd³µ‡âÈqM¸QA1šGÆ¥/—Å)¸/ÅLÚªšáßyW„ÖU±OŸ¾xÃU—i¤1I§IT£^¶)XŠCæ±ñÞÅ]ÕGðÜ,³7üa –åØdRÍpƒ`餿ReÝðaåU¿ë»–z x#ýý(·!L~Æ¡QW¢¬m=®Óz–‚Í›„ ÐÎäÄëz¬øÅ+—†¤¿\8¯ òòÓ'†k ©£5G€¬)A³ÅÈ]°¡Ñ†žœ¥�·‰»X€ì«³ßåó#Ñ%Þ/;²G ‡ áqH›«;J.¡1d]BþÞAÉþÀ.p%·†a9¶HB Q®87Ôõ¸Ø(Û[ÜcNyÂBíàÄ‚ .– e4C ª(ä ¢ìC¢ƒªXJ!BHè!�B¨‘¼Ã!.&òþÆô«?€çÊ>óŽ»Mæ ¾¥vâx{¬‰—)\ö9/'ÂXR§ôȘu1ÀŸÄ$_ä©O¯–ùÈgŠ{�OÐý{�Þú/ÉÏ6 òñOÖ΃ãåö*1¢a¡�_Öøhw,ö%ãóÐðV‡Þ_Q­Sδ‚AycöÏ^Þñ‘Â|ë̘^³‹·2ÚŠ�“ÈùÅ"˜ž 3êžDzí=g³¾ÿš}_ýÏiÞ¿_¸ ºÇ‘ÅvmÀ;‚ª6#ߪ¨j÷­Q¾Ú÷{û¯_Ít·âÖ‡¢ð€GR•ªØcŠSå^tò>ëü½‡÷Õ¾³ˆñ£Ì¯ïµ¾vÇIú¿�šu×Ýg!äíT�î‡ßyåŸc·�]\~z?ä¨ä\ÃNˆukÃXXÂ…6ŸJå„­6µËZþ%6£Ú€¦Øž^éê]ØX±É=K·!“HÔB‹JpªfX—h>ËÅûÑæš>û¯F“,�$‡�*E{Kj#Fü»`í~ì˜ÐƒACqúaÆñˆh1‚éfžä…K²^­Ú2Ĝ܆•QC;zÛÿŒ¹˜c‹ÁEæ7%Jªáÿ¨Ž¨Ù€yÎ$ãOU‘ÏBÁ% 4Ä<¤þœvL,jË7L9!Œ’ FÄŒÑÖmaÀѤԪªhÍÀPô8ÿ8¯SÙHŠ&“Ôd µ:åÄ1»¿M)!#†'£Ä$Ù  #wB0Öe,4&I�Ð3 âYœ0’(8ê–µªEèû¶’Ø}ë[ë‘—ÆSu%ÓqÉÏl“"dãg¯AÀ«~Œ8•»òg©¦Š*:ÿèI”&yx}�¤ @r&ßèp–é¨$hq, ¡Û…“Õy<æÂ»*¨£Ý¦çe€fIîA±ñà�€°vªÇ¸!Q5%K�ˆièG® ä§-­øÃ¬ÑÒè~)b#u¡@æAT£„‘Žóqpø ¤©ðHL€RØ® ÛÇÏ#œ¿Ü§ ìøŽž ={}JŸJ? <èeÑÿIŸ}›9×öÈj÷V³ýQÐû•¦=¹œ}@}[ˆ×QìÀ%ãÜŸ�§ç¼ÌÃ,múœ>ûìmw»ˆ3cö Æ¿=þ0[ØüäK–¬ãŽ'ÇÜt51À€?Ý꾸‡"˜uÇkû~­>‡Ä§ˆ·ò·¯˜ {åZ¼wÇwtù+Õ­‹u_ ÂÕ²eùà ‡9!ë›'Ÿp“%z_ÆëI:h”2= {õûä;î/dÔ‡êw÷OÉ0c´q�‡OÎ8hœÙÞRìRp£�¼á)&N#—_UC ðÁ ~ô$<ãê_*#Ç÷еÉ8ý‰‰¶Zû{‡ç˜T7ðS¡/±«3Ž&;»ïÚk‡~M±ú#®9siv¶]ƒ=q×[£¯ýõäëÒDS�ÃàQÀ^×÷Ï:ÁЛóðäÚx�ï|uq7 ¨õ÷Ýïæ‚Y£}³«ó'õÉKù'—¨‹y®ûx”1®—Ì…ƒ²Ê�%tµÒΰêHÞgy¬?wÐ|Æ®Q8™Òwu2¥ÔÒ(¹Ju–])!B€pAÙ0¡˜,2©ß ÕÓQ¾ƒh/^3Õ !ª<ùÍ!D¹OÐìe€ªªp: ’—²Š’ôQpd´jíø+<Á…ÉÏ0T‘.®lPdDdY€0p8¸.f�Û{o:÷ûÓ§C⹞k?=ççv±þ8å(ñÚþ=XKµ| |¾ÁãÆ¥€ìÓ¯`ù®¢þE¯þÑñ2õš:Ã�¢…ºíó¼>™¥ëb´)˜>øhàÆü3·WuõóCÞü�¾GùõõRüç@ÇØï±ÜAŸÞ™Ÿ_³’'èyù÷õÜC ªþÁŒñ0qzC]åF¡ŽDG¾}~ÍЃ-µ­ðàuÝxØ\!#}ƒ¾øE˜˜ˆZùÔçžs?OܺûîÔ�¥×~PƳ¾yß9Cçöy™w¯A3­|úõ~¸bˆpn£p9­P;.¹ó^Ýá@a†8´‡Á�xÓ ;}i4TŸ4ìsñ’â"³Õ‚íˆ)ñ›îÙ&ÈÃ.ým‚ÿ¶y8Z(9ï%¯Æ¤X1N§øÑ³¬ôjYÁòÏgë¿Bƒ÷ÔPe{~ñà_XðÑÌi>N*ðœT=ú¯qò{—Ý¡?}¢"£^KßUꟙ“ÆËí3ö23¯Z›Y¸·Ì‘“9ŠÔ}W]ýê(?(*?~¹ê?ÚÌ`Ÿ‹á}d ô¦Ÿ?ÞíÓaêH27 {–»ÛîÍ>ŸÚ—è]CüO×\5ñ_Ý|><¢<Ð9=,=0võµ�šåCæZoËlÚv ¯ôTEÏoCýË€ú¬ks_ ÍíÏy.]C°±išWîýwþütDÓ ¿ ·š(sƒcgÂ2ÝåQ¡õî#ŸÉOÄú┘…­#�»ŒTS׸;›�üëõù» u›ÃóØpòÝ­­3ßÄÄAë§ì*^>4¸MžÍ&ôø˜ÎÔ›VÒ ræ£ù¡ý~õöM³ôú[}ëéâAÅæý¹ÕOƒúÀÇvÜ2S¡o§9±(xÊ ^+vɉi‚³Êï+Ó½�'�½!£r067.¼ ³ä]SR<Üɰ9øHþãÔè„"!ŸÓSÏ̼Mr¬í%2ÊLmØwzZ«L+U5F£ríL0Q Y¬ØÏÁÍûÚ)…Bé5LµL™|ám¼:uGaC‰áÈ ±k½«ŠŸR–t">Å¿_9Hè“™LÌ D5´‘CÌU¡áòš>_q¾kýx~0|‘ì>†È3f’€a?ñþ~^ß…'Êrm V´÷™ 2`ÀšQd!F×®ô•¿ŸŠ£·l2?ÉÐÇë_õ+Ù�­oLßjY¿xøæ Lzú‘¯SüpGús Ó¨|îÿT1�[¯6A\ÓŠýÑŸ�åQ•CƾµËÙèK–�Gµ¢-ˆ’{™yw† VF‰‰2 öŒ>).|äľ¯gv%‡wnìdT^ÃУ…GCO¬ýVæ0Ðç~Fý¢Õò®ûõsçWEï§Ô]ß^yo{vì8�ÓÀ™Aÿ¶„÷âqe9kùc¸ f>ƒЂ³·že¶Ž§÷(vÏÏóÄ€ë¨ê"i릮Óßô½çÞ�isð0OÚv·‡oîÖÐwŸÜ)yO~zÑ7ܦRoÅôÀlCœÇƒ`ó2 Õ³À‹bM×.F–çÄn‹›¥ùlŽ4�Þ�~Ã=�®Wèþÿ<,{ò»A è)·:äiíEùæwœÝ8¨s|†' þ‡¯úŽïM‡ˆ#´´?Q“§Ñ±rmŒ9‡Tõî ûóëÄMþ“£Ïߟ¿Þ_ŒP’L�ð~$9„ºï(ߢ}º¡Ž¦ñÃsærû‹FFý5Õ0Ï””‘ H›sõR�Ù~5¯þ ÷Ýëï|a;CØõÌqÛ�ÐÝ*aƒË�÷»�ï±Õ ¾§óËH¨(<ô;a>ó .üΑÿÒÙð;3.´‚¨:‹÷WqõÅ¥·º{—¼ÿ "nóvì}JO·ªK(Û g{òÏ–¤ÞñÞ4ªg(‚À @eÛj£R3¹ÿAv�žü&›½Ø€OBt÷¿gý¿Y�AiÖŠö…㧹ŔÂL$î¨4ù “á1FKNÔ‚�Žgçò¹û²¾f1Hâ” ï&Åï°„Ø9àDë$xSJùeÎ I%âWm Ìfq®›À%ÎZìäXf²X¸2ý¢Sð ˆ~TÓ qP§jCêú˜X¼V%:‡ Ã$ ËÀ9 †c‡dã"B‚šfà?€MA>ôí‹”Kj×)¢Ð±^‰�SW0q"=)Â(óœÐqRõ €Ä§Pf¿A ¡�Ž‚Q‹°H˜O³²eO±»~©ûÁTj™h–ÃÛçîò�TBRçÄ�o\h?—Le˜f— ó+3ø.0 ŠZ �€xæzø›jíûÓ=ðÁ÷TM3òýà§õüÞQm9xx|,Ýþ‚!x3L!7©š ‡LÒX "LxlT”—K„AÂpA¦LÎZy*>ßÓÙþö>XtH°š¢”äœH�ž@Èe�Œ\´]2�W(Z¨•M.bƒg>9µ¥² 9 GY_<~”v¦QÄO+ŠAä�|{* $sÙîÌñÓ¼3Xÿƒ¤$=™ÆÚ4¤±ÃÉIkn3~†ºï¾³ø“ôÚÉe¤(1HH»& ‚ŸàûåoWç§~¸AÝ("Óí8«èá Ö5|5‰$…^Q6œðj; s)–Õ%ÄmÎ�XY‹�Ài€g˜På�œ×6Ï�—u³D}�<õ£ÔÞ&ê €ê�¢ _$wPÜ@¸Þ]<ʺÝ34ÊÐ7( h¶ï¥þ”À~ÐŽãUP ÜìVºÚëy0 �ÀFÖ7 þb½UTQꪢ�![*¨£âª¢�šªŠ0@@ʪ(ü£ü"¨ôãþvÎýµ‰ÝAŒÿQ!ÓbúBú} Õ„c¬˜iF?†ÛiG$“s@ª—8|—þbJêáGþórÞf‡©·t=TJ<íÈÜÔèµzB%£“ªp…9Úlï&bË2Ig~FŠÆ_OUÆÊíʨžÕ“Íì*Æ �h›†Ï5£óš(�y¢•"2™šŽ®¼¾GZö×d{¬¿r@Ðù4”IÚWÕ£fRe,´ŽºðÜéflŽ =Ø„…½© Ò“»±,½^¯5Er¤°h%C37„SšÓ!–âñµ­©¬”‹$YŸhñ¤1n”ÄÉ;N4Vß›”vÆoÄò«7FÛ/~ÿ¿P™†`cû”î‡Mšµ«ä_•‹ñ80_ûU@"ˆÁ$Š�õÈž<´½Én¥®Ko¬fˆøv` &‚ÐhõÈ æ9T‘ýw‚ÿO7TÙõ) !CçÒ{ú»údm CQ)~þ�gꊳL…*ˆQx§ Ðé©ÝJ!± æ ú�ó�Pq½úƒÊZ0Ò^ÛÄÁn�ýÀ‰ù41>GÁ"²Bñ®<ÃH:^¿ƒ¥" ïì3íhÐÖ’öjöz"¨1Ûá¼wõL~S1G|’¯-³ýþ‚:Sô¾N^Môb°øPÌJÉG=ì‚FyƒøL5©ÙŽ;ö®ôâ ÿÕ;¨Q凸qAÕjÃó ZÆ$qH ƒä|¹Vš0)Ô±¥Þ¢0m÷}dúœF5ý�Šðüüˆ´6<ÙZ3wñ…ZI^iï§K#ÓãTŽ >§²†Ö&!¬h'äT(Ƽq°ü«K‹loŠJAÈq¡‡f°Ùó(Ë®¦‚hXÐU½Ç .J8¤ØÑpZ€Eºuœå»ä³ œ?k§¸Z.éO`4|aw–Ý aJÂÔЭ i° ›8`ÞuÄ�á·J;ìHs¯ÐÀ…#R‚Öc9¯ÍxL´õÿE¯³ºØÓ°ëHs�ÐÚŠ`Û‹óÔ�aÁg!?¤&éî(�e‹@½1‘h$þöºÇÚ‡Yo~ <_Žý‡Lb�f–¡¼Øø  AÀð÷³ý~±n@ƒ) x¶'Lô"/øZ@Ó…×ã=¨ýVÛÈ d?‹!Ó¯ç°+«ö!•ího…>;h-ñ\\�çWn‹4˜ps�O|!ðã·c™ÒÂÿ/õo· 5d{ÃÛ©#ÀsK]ãöc¡·‘‰*ÜkñÙÒ°Ïœ^#Xx&˜þ�£!¢šoÆfûƒLÚM~$ÈKzVÖ“†—h,Î&M´:n þC"ŽÞÄU´â‡Õ¬¥6‡ˆ s,Ä µq3!Ö ”A,ì] t6f ëÅSíGüBf8|¡bç}5;G"¿"0ª&.†¾´%£‚;î74Îö[©æ:5z*¥˜ESRdÌëq9ü§–¥kŽy¢µ:Ý=£ã1�°Ú\åÍ ²XMGk$BëœÔ£‚­ðWtTvl£ÂD;ª MjÃsa─é�3-ŽJ«@ä#"©ŠJ"(E­Á¯EJŽ6 v, §jœM�yÂéÁâÇv°Æ»¬[ñÏ4×"½u&ë–Å­ÿÆ·&TUâà|a9ØÝ?<˜o‰ópMÇN¯É¶©f0M ¦¡…œýúœYAIRþh±îˆGùúÄ¿§L ?Þ‚ðd1‹d—ÌA›mºÙÚHþnîÍà þ°[)�äÍq1³«ñ‡Ÿã(Aª-Òû‹Iä³QñA¨¬ RgÉwÈ@ ußÜ^2 ™Ê" Z¡D!Òä»èã–4ssóWc|›²ŠsE€žÎów̾L @\éhhÎ=æ`‰!u¨¼2aÎ}Œç ¡-jD5Q¡{èöŸ‘å s@B`=Žn°wÌ6¥p2|÷ã ÃÜÔ¨pë^y'g·©-<ñÑë��/Ó”ƒ%pô °­”χüx0B&«Uê�®',ñe€±åyw‹˜"7OD¡p„óõá…zò‚í(qÉÍfèÈü4AçÌkAÁ³p„¨Ì¯ø4;c÷|8¿ò‘i´Vì²~WŠ·wí®e!�ᯠüvøŸN71aj2Éab?±ÁïGðÜï-ªü�Ë£fdÆ!²f æõ7ª)hþn>ô�‡&¬…¿ƒ9À›´=,"t}èàIí)¬?oÍ *tp��j=ÊåQ¬Š¢!ÇÒ^n¦5¦xêFøorH‡“룟;Æ#Û0é~÷9,dr‡…%Qþa¦7ª×|PJ½àÊnˇg‡å³¬{ù<�­�ÓP¾üN ØÊ©U¼¯èÔÒf¿•ÑÜwÇâǹ­²ä8´Ú¨™^U¡ÑÝÄ0ë�Qǹêšs¾â¶ü�6Y‹_]ôÞî®T|GØ©lçø'ÌyAõLg=0;ìjŸ99Õ‚ +/ÒÀaiF_*5ÿ7Ÿ´T%IZ ŽÄ)!FDŽÐ=VøAH=vã0ÃaÁ '?!ñÉbŸj>´Ö×@²§„ùx¾!KÏ@ÏXF½Û¦ ¢¨Øt¨³ºÖó&gm¢¤û�©ÿ‘½‚ó¼@Ð ¾‹ 6è÷A<àÌ?ÿ¿ù’n8­‰,Ë.xééÎC%žþª ÅŠöa²UKf"ù¬“š­µHYËí� Ê2ÖÅ(œ "ÑQЈm_\Íî;A¦ó²ŒóHµ�22^a%0Ë�˜E)YÚ&×€dŠ'ä>œ³ P?œ8ë1‡¸Ž¨s/"z®Ð„3­6 mÎÓ é¤vlOl«ÕœÊáÍYŒ ¥“!1–Nš�‚㺙HkaÌUÕйߖGk5 z½¼Úïú�ùc‘ñSQÝMSSV¿fÂfÙ“Ly#ñ}N7Þ} .Ì2gØŠ)F3Å· \¦?¯­þÖ8=9çÞ^œ§Û„�š�noG@’Ø ×-—°§iŒž»³”;:”–NLs]ÆðsƒEóY È÷8£Ãœl™jô@všçÕ¨Í(„ö f&%(ÐM‘tªÔE/Àh�L©Þ:˜”V ‹Ãä©cX)�˜êî ÖY£âSÉZ0� ð« œÈöUˆÖ+œ±â£ (£VÞflD¯<(ÛÅ´`Ÿ‰’,zu_qˆp{“‰Ž&lV5¾ÛÛ4Ö"Ø!F`Í  ß+!�8}§w×:× b;çTæÌÜ.Á®j΃ {Òq¡�ðÃR ¿¾sÞ}9ü‰õ±pKû7ÜAÏ 9,êÀ9£ÁÔþÃøDxõðn'½T\‹3Á#™Å†!Ÿ¢°Àl|ñxÐô§¢åúc6 oñ�^®`–›#ÖÒÞ°Ôí ™¥ÅïÁ¸^­¹ …§„så"…kÆæ¡Ò›jà$€–|<-[R!”Æ0£\‚:×N8L“XÑ\SŠ�¨[\ñâ’¼¨(†«ÍUùƒÕ•žNs ûp�¯#yƒÕ$Æ™Flq辶e4Î0S‹ŒjcéÉí\îå}F™©DÈ(ÙX40ºì€t,…¶Žx^à#¹Aç`ÂͰ…éGIÄßOEÞÊÆ?ìñÓ*ÉT”.‘€ÄðÛ°"©ÞvÝhµBd(CósJ Qó>E–ÊÐËUãLQ teP½õ >ä…PÜÄÚŸàoÎ Õ±‘É ä V�3ÃdäaGô‡ ®$q+D®Z£ð£×%Þƒž�…bÁX¬frûŠßDê"{çC+pÔcIa[.7x�88®ç» G/D�¼Ã®½^#CÜVO#ºÒ‘n\XC¢Â´ÁÀ_ÅMÿhj¤øÉã³p׎¤g(“¶EÉ×9áOM0%òô}ØT0Ø>W‘{EáŠVã�@PN#—�àbú ƒ™z÷ÂLð“ús¦´~s]ÔÅä‚¢ PàAB)ƒ)}˜<¡c*>@º5Q²uíbç'¥vG}PF½l?$Af`ŽÅl”ë\A(=;&vŒk6f­â�VåaªN̯4m+Žp‰Ý$¥,˒ú`À\x¸Ï£¥ðA¹Äåÿ¯ËÆa-‡ÅÀbþq¥pú� Ý™0 &aG�GÆÃ þáãß=BÛyÝ{†ÂþãdŒ°á)ÕÂ.àñGƒ8¨G×a0ÑˆÊÆÕ1T,ð)°ä.5@±ÕªLø§>@,ìÉñò% ͵# “0LXòÁuóû{‰ÑŠPhï¨ÇÝ×õ„Ç Œ¸õMAÆ„ZKñnYžÊ±›|ÝÎÞ©ÑB¨8 i%� ƒ±H XÊM6ŒÌÚÌ?hÕQ¤T’Ê9K›‘fìXìÏl©½æ¿.´!ˆÊи«›õg"ÖÎ{[ëŽÙß8ÛK �ùé‚Ù–ÂÇâzOWµÞ¼Ô‘HŒËõP¥LVó“,‚{¹’Ä�? ¾†fÐó¹j1P€ùÒ%t5uÞòQèóÖ2KÞfsÿp=ƒêi·ZÔHyœõeÃÚ{`çfêó~DÍ®;™SoD¹Ü¢Œx]Ó®ägùõgÂ2Ï„H|übwßç\NF%ýu ܽIl#È�2'œ �cìëcŽ+LÚ)pÓÂ]æuÅ$8Ÿü"¨øÛÄûê À@ÿ1×ÛØúõÌ^ÿ‘9ð|8 ªü•ÎØm^Õûr»¿5@wƒÿ/þJðŸÏxok'ߨc2ÉÕþ‰ŸþRb¾êküå0Îú;Ê܆ʄ>ºÐpðþݘ†ééù ,|üL5 þn]‚&~3·Æ€èb�vð=°Ö9Ne³3à»k^f]àk›@T6€”´€`nÎBY¼ Æ>!­ÅpÈ$hK’å¬[$#)HP †ôð¤õ!4³O:ç H6óß.ª1foT AûTz‚ rîú×Þ8Ú±É-xiûW�»‡ã w±M¤…$HÇžoHÈ"×ÕQ/ ¼µ£Æ‚ù‚€B­/¼¢cÒæøöáÕì~WC<Ëc‘p;EûóI¬&!6PGâ&¢d�¸­"‚!!5jÚP÷Sð‡QB„ÁËʲê\Ø�©Š3Ëà]…>µ?ÓoC¶:ß·‡lú^­åëÞ¶ž‚þoí×§KOs±órö%V)¯[–xMÖ†Ũ+ÐøÝñç»}X¿� Ìq;B&ý=Á@Â[­xìW�`­ ¯Àþ«ïÃ51oú�èTJ¢X‚Àw¼¼À.C„6?ç 6qm­è *)Ä)ä|pšEe–«V•D�ˆ×m„ûÈ|+Â:Jï€N¶ $8•˜ÆÄ‚�߈v¬¤") eàj X¢%dÇ*˜û\«4Q.î²|(ì|ÏbAùmTá,’zœOˆGþåÿ°º14cÓØCßЦ¼ï¿ "1z7þC?C¢€ì�Ýkºàà2Cìƒø|©£Šp-š�b—Áþš~–¹yš´ƒ|(zÿ¿wðŠ–�€óõ …½ŸˆŒµF+9¾¼Ògöx“ƒÔ7¹T _ƒëøþÆLw GL˜ä@}5ÅsÆ*±&¢j?Ã?’s��Š+²?à"ú·•`š_yÇ‹¿ß®Þ#¾Tÿ�i?ö àS>[(`‡9"n.Å ‰±HºIŒýAÚÔ L¡ ÉO@cF4½,]Æ�pçéÏØOÞ”9Fß܉…A �FŠvi%2$úß­nQÁ‰Pq*²nWösÈçç„_³“'Gœ¦NØóý6Š—º\®É»ƒ¢N»ÿÁþØÈ倨X�@mÜ¥‡ 0ÈÊWµX6s¦ëË i¢a ôÒD¨æÁqÔ5 =MT߇¯qìA[{ð½ 4ÑæI(›ÃŸ»©R¢a�ñÇGb-%ºÖ¡Ó"ÅBA}ðmYãx¯„·As uø<"%-K( ljþÈ6,×¹Ùë�ޏ]eÔ#ŠÜN~!ñ.Œåÿå8ßÙÞµ¿©íàá{^§ƒG`Ì3��1X¿†&­~ �OÃ4Uä¹Ùl$o±ð•1¿Ò(g3\ò=Vý]‡ñ€,FCø•ºØŒ äÄ|ßAáÆå5ïÝ›®D\©ÊjPMû;7H;2vh³  µèB×~n9YŠóÀÛš ,ÐÇY’Æ…Òn !‰‰£NfNJKŽ”m �âoq m&äÖ2PBOðëŒ�î^#±–×§«“MÐôZqìäkôF"œ@„ÂÝìkFÃÂðQ! ÌáõϽ�!n€çw âÌù1ÎæÜ;¦‰Dún Ú¬Úƒýy‹aòãüówš3Ã{.xy ½i=½„ÕàåþÑ�ÖÜ�g®7Ú±-ÙˆnÙJ öšÑÖ7[<è]�Î â£ãz!òõ¹~®‹ñJ¿hŽGƒ 7æôoc,9lËd«³„¨0¢óŒM€ObG£n“ጠ!%oàtS…÷ Á`W�4Ó©IW6b«QåD`Ë6qÚB�uŠ.Q£¨iÞŽý`ÁÕzèŠySƒ'’Õü·–ò£¨ôæî0�´¡08�=x eòæÔd78^�`* F;å‚  ׇ|]‡ÃF/ Ž9ó8ëá KVŠ]Ö!ΞmãÛ? ÝUü„G¸?Í$'y ßà p/÷™<5¡k@Z�¿9ë§|q^�è®ü�ŽÇirQûé÷Ü2ùþÞ»ä3@׿ɿÅJóµù®ïe‘7 èX\s¶ù'S6I…®<©Mž÷ɬfE.;#óÎ�EbwÆŽvéÐñ`y\Ûêe›7Éáç˜eÝÞźƠΗLÓ²E˜֦žJ ´ô,@‡[’MˆëQ�:,Pñ{çØ?v#¢Q+…A&^ËJ Ž‚‘T½ A&%1g�k¸¨Œ›] †ÙT7¢és¾°ŠƒÈmEàØ#†å Wð·%1øvÆëøüÎnlàè¢7ðxü ‘ï¿­Öþ 3êÇŸcí½MÊÈ-x�‹•ÔÙ‚ýî)vº®ü'“Ѭ„æúožž ìd3Çm†0EM8¤Â9pî,sü.[tƒGÎX°ž9kÒÓ}h•ìÄŸW ›(Ž#-4„†¥×ÈìÑïº';ŸF†xzØü±Cü¯Užê>—�o³8GÂç%Ñh¡øKdÎx,XáÙ·áò(£C–†E¸&©)ìˬò†¡5 ºòd{ß-Pl&¢8 �­ˆ19_›yPã ½]ÒZ–SåèpÚ�u“ åÜDµDÎÆÜndrYñÐ@ˆ|†¬†–ÓåF®°þï@ЦóIã\òJË¿QùïJÙ˜§™ø_�ÌqÃJ€ÖÔ0cð #΃+€iìI§ª@æµê&0XËE†ˆ™ÛF¸rX t(,軂±É‡Ë†ôâÜóó2� £PxÁÞÈLh”W å´^�ùqD»…mº *hšº�…ÂU)YL7«”àb�2®ÝJ�Dƒ¤ãEåDÙUAç¼[ŒHHõ,w™ånÄbºJ°NÇÏÌP�H)Ì/xXrq#bÈXÔmÂã#ù~·Èœxp(ôzcX±Kß:·ÏJEU­ÿ€°`¼€Ãó™ÉˆãoùÈŸPht42,MΪ,4ç1D‚ÄÔ*ÐÔ†4vØ"‡¿xi³èÞ}ít'[G¡£÷Îø¡|@¶>>ÁGa%deŸœÐ ÷Ÿ{ÜwM¯ F©êó�¾åǵ¯Ø �å>u±Ìš ÷«Qå˜*ö¥±Ñ�Üô3t"Á~AÌlÑÎóqÊD^Zš\Wþ®ptYy�ºLD¯Á³òR@¼XÚÚ�d8irS{ùÔËtÇí’ÑLe‘”_éä Ž2UÄÁ,89ŒñL¦Ú(–(�­Ã¢šEÛÌ&tÖçò÷_µ©ÛÞ�ºAEà#hgEäs(ºR㢣Ô�åÃ/'D· ª ÀÐç?·íø8»�Þ´É„] „2±Lús >\IâðjÜ"ʆW¡<#@Øz)´l&ØÛe¸; ¾w€°…�T‘!vîG®Ç—˜ìZÁL‰çÇv(¸k†ƒBc)pãl@a¶ Ò8:q’j¢”váX*ÎVY“�'8ÏÛw4ÝÈåÉk$#TgI¥¦&ÀöLa QR†§‡³WÝtêFz Û=–eÔà@©¦\}=ãD¾7x‚ÞôS°s¨ö±>(F¤sâ ÌÃg¤�Û ñIIjPÍ Ÿ…sß/I±Ó´tæ“ò‘B®]Ƀ,5ãŽzòÁVéTͨúh‡û÷ÿá2æë]<¦~3"Ç)dü2e|Ÿ½â2/ÄÐpÁáY•ÍÙê ^qðAñKÙú85‘üïåce«ÏŒ�̼bóó9­P— ÀÅ"P“ˆ€i©.ÂÏNÛ·"HŠ\.XyL àN/@ïöË››ÈÈúfSÒ"¬`(ül‡dx>P¹5—Û ¹E¢ëÄg#[ ‹ÎNp]Ãj¨0¼`c1€àT�]ùjîdØD•°í�qÆ›žꕱ'nù‘5‹—5Ó=�âd)otÁq²dz†³¢�/ìG'¬Ñ\äìà¹)ROLÀ†Á £l[™ ‘±;œ{<=Êühñ|pÏÜâø,ÙA¾o•!s[ë}Ÿ…ÝácåQC€ý�ÖT¹cáçÝcT];;ð�Œ}›øý5ó�°‹Âhz ֱٜæ9ϸ¦ð¿L3�¨Ð樂káAzºB4 ïÞú6¿½ãÁÁÉ$ì[CTdÆ�‚f´<ÚÛ�TH6³ˆ h­mC$$‹i�§v®ì[Eý 3î«×•ÃqmÑ’¶ñiÌòê]Û nþ=7¦ŒgÛz5½¸AÜX‘ÀÁø£ÕÇÓm åC¨Ô Vx鎅Y.A\¦¡„$1Z•¤1É+šÔ¶np^Îp¨§oÿŒøÍ\[Poæ\’JðÔú˜¬¯±mXƒÛ°–ÖϹ(˜£ö zq¹DÝ5Ûæã*äãÛT(§B˜ œ¯9 ÒÑ¥4¥jâ»c‚…}�¡ü`â{é” ð+u$¼V"Á�štÙêŒñò†ÜI…!žò„3X:LcпS©� ü Ú&é!† ²ãD�£ À/röP4‘ndöº—š¸Iå�Œdnûµ]Z2YV2ÕòQ`Ü~?ß«×RW€�ÚsrJ –šÜ�F�IìÃI$Ï2ª—eT±,4ÄÒN§€<]ù�¾f`±¡ÃÇNCމ7tß18í¡o»WðøvC˜Ð\Ã=Çã‘qÊÝ ä -LÀúñ‰¸-d†õ“ )üèëtÀ¨slû4)ü:Ž×LC­‹(5ø B \é†Îô\Æ»ïGSü5Ñ+ª{bHÕ€Œú»gx1²ó̦ù<]ÞHöPó(ž�($7æ~¬"ãè|‘C*¨{‘ßÍBuûßÞŒ{xÈ‘i}‘Œ8ƹŠ�$!iû`ÌÛ~Ùɇ=¹ãƱŽ,17½~Qì—%=EÎ+õ#÷btã‚Ð}µÏ+ ™ª”{±‘Æró4c^N,AŽpfn:òæ‹©ÙÈ!í€X�¬Ž@ްØÜ B›�½övÙH¼>ÅcRã£ó`¡èoE*¢mçPØô?Þj³ŸvéCÖ£lUL]¶Ž©íØ-W³E¸dŠ1FI™¨h"$Hj¡-òM l$â�Öè#(a’‰£o5êæÝÕ}ý©OÎæV¨u2d†¨ÎܗƒåâôÝk¤«DÜ”D¢ÓÄ ¦0:䫘ºY³?óï–sðð®¸\ª}¢¾Ìÿ¨(!ü&,è~õ,nðÃÓ/Eß1’¥ÄÕ)j©`shp½è_çî!©L!›Êlîî‰<ºÀý=E‹§¼ñ±,Q„ÂP79þ“Á#¬€ñQEcŠnk® ÆvWEú�p�ËÉy˜¼Æ9K‡›„­fÞÍ.tB!A@žñ ˜ÀÜéagrÁŸ8¯">Ôæ¦ú€ïãe<]¤$øˆ’2²½¥p·.,ˆ8ˆ›s ÙÙyÀVC2ˆA å®²ì•›à™¿I¬‰3O�ý“' F¼¡4ˆ`åŽR{å»Ä”(aœŒåða9ÉßÏ”üò ·ç k3þ ¬ZÄߎ¾˜N-Hp(¨‹ðÿ/›t5ÅÆÆÃÄFÝ…Ñ8JO€Á¸%€¬˜?ü{܆Aÿ\Žƒ ú9ì|Ý�bBærƒ@{öÄr.kžIÔÉ» qâ»ô¯ÊŒÉ‹�”‚¹ÿ6 eL ô|”(ØøÀoQm¨n¦˜ÍÕQHQ!òòµ¹ZÖÏc+“¡¡�DäV£ê!£ t4ÍTêÀªªÇ´5 ­�×@œ=ì MÅZÈÙ›ÑKS:Ç-åÚ˜”h¬}ÉïãšÑ–‚²"ö(+ñ)dBì˜�äLr²ç#`ÊOEMHPTdI±rÀ½µ“Òp`)5®ŽÑÈ,* •"—Gék²vä[†‘ àÿÀdð.Gü£jBÂl¿ ù䨠g'Š2fÀ"2 !!+rÊñQ9¶*J÷åkš¶qé™gNx\ù_Àã}F}¦ÑÖ3 ÁÍüV¯Õèâ "A±àó{îCŽ€bÔW+øi„5í‚îÔ·‰DÃ( ÃfB®nÆ5¸py‡>âuˆ>|¼9ÚPk!<3P©‚.l0oï™Ùú"»DÏAûÒI ßµ•°¢½öúÒY× ¼ �]âà>c±¹#‡È™»¼ßš„p š ÚqÛÊÂN"˜d �ŸxæÛ±ZSÎmâ;/˽pÁ‡lžŽ~E; ŸÜ³ÁÄ‡á¿øñ`œ˜0l Î0Fûñ’Ìü÷–®9ÒI@„xççªBò`:ì¼ ت‘/‹G#Ù‡.¡èIbÑÇkVÈE'Fbˆy2¹ûÒ�œeêËCÇ8í\F§‡÷Ã:æåö Mr-§Ò<§Æ†!ºÇ|Xý‚aªäï=Dpƒ¾" xíÚ%¸ë»Æ·kê¬ìJjTøYú�ü1ñ‹Þ7 ŽGŸ‡%”¥‹] FgŸN¢kâ.6ƒ'Eàf±Ù^Ö)A=¹ÄvY¸s^Øh(Æ ÛY¬ú^³ùý_¹IÌpYp¼š ‰ñªMJD ø%:öæþ²“5µæ‡üŒcmømÐÌѹüñ™èâ—¯þD]z¹JÑJKk[vÒJÏ&ÕJ2œò¬¼±ØÒnËÕîjã­:𠊤ox{¦h›Ž0ôçÃüýÚ�úc"t~)MôYŸ’zndýT¬7G)‚­V"e­âú`Í=¥Õœؖ_5ËqyW´…8§Å,LJ„x®‰Ó[Öo¹µ¬ƒ’ý�Ãß;Î’7‘Æ bËIE<6Åxcd�hGA‡8u@ÚN�¶¸ŸÛ=bºŽˆú,)`Áhtá2:<1æÃpÜÞ ·7àÐréŽ5.*Pã-Ü3‰$Ù5ž¿´V6çÓ«{ßPõ©gï Ì·‚&†ÀT´¥)«m-/¦�Ì0h5€ƒ(¿íkéÌ>Â.Jn�Ç÷HšÙ‚‡mWì’,…pÒ•†.-<Êñ}aɸbóŠ�N™&ñ ¢q1«Ì‡//ö†€1ô绹òÈÅYÊs©,Ë_V£QY£h«ŽßîzÌÕÛIrÙË™š5å‹E›Frš¤Usܼ„­8æn 3}žîûlYûŠEƒ_|ðÙøuw-ÔJÙ™ÓœôGÜÞs� 'Áh«õ“¹"1Ñ1!ÿõÃ)y2=êþ;…ïÕò>W"=ð3ƒÎcBjàÐÉ"’‚zîô?ZS&yþåÉ6ˆ“–¯”û™*¢Lë¡r°äk€’ÁÈ1k,|{o+×Vzõ„Nç:€Üw6—' fH†+ºlÁe�‹kVy¶�N|„«õ$Ù&lÒoˆ�Sær|Ë:íR2ÚámC/H‘hö7¨J�‰~Ä5^úúÚ¿Æt¨É®Â·K*1ßÿ³�8Èç}T@.��—ñý8ìÜS{ªŸN(… ô• 渊VŽz"ëxÁg1i¥Û6aŠO6eÿtwLDeMUë,•yïoúbOMó4°²ô™X’{ê—Fy19 ÞnþX ¡²»F´f'-ÕÕEÙ –£"â±êJ.õJ‘[ÊUÕ›æ�žhà«+u4pRФʴٓ&*RÒ¼YÙÌû¾žXòF¼ÊI, ·åñ8Y•*].¾Ì1dÃ!ÙRõ_y�œÒ4¬õÑ �xò³�“dž4‹)¥9—§µßb3 vH©:ðΉ&8ádzr%R²i@»E¶»6ÓoYy·¡H/'–Ù0òx墵áÙ¢mH‰Š-µ4�Æ–IYS¸Kå¯Å%dçjtͽ�ÓÖ혵î²P®™œ�oQ=j»ÉÈ^EHÊ£+§%ç\º/r”YÓ“:&™£©¸áÍêÎ(uÔç–¿{«gÊÑ©Øbsáø†2Þš-%f6A¯m�'°YâœØú&G_Éþûš¼È‡Àd ý,Ô?Ó÷ýÓ¥øý|<¹u=L¨a¥QÖ‡ã‘äé¹wßЛ�ìÂÜ…á{¼yòäin%Uë>z¿ÔN}x[ý¶™ÏÞ¼¡¬¼Q>µ'÷˸ÖGÞvm#ÄwÄâµ&±s,0u“‘üx„B’x$Ÿ_˜ªÛ]ºÀ ³Ûc ôÔs ¹sÇ^(_ëíaþ¸vBùøç‡4›ûš’xkÁÔîôøx¹µÅ‰¨µæ2±7ÿ¹ÃfyƒÌjvR ¯×)›h ð·FÀ ÝÏ’AðÈõQät!iHèg�ª'¤»/ˆ°C!êf•—ðÊjç-ùƒ:¦xB±ÏÍ1UÉô‹ùtãPŠ¢‡¬×m&ɇ �ÐKқ䥫’(0)z° ÄÐaS`V·W”Þ(÷É �á3¢!pBãoGè�Þ$ŽøGïX àŠ™BÐÝ`ùºµuÕ®ÆÑ¶2 gæ0àÁùuHeÒÙG‡Ì �060ôR�AÜ^Œ4Äá¡è{ó»}þ"++ÅÞR°�ñ‘(>lûŒÊ¡B§iŠÚÝ–ftÉ næ<ï�”eÐïˆLiE $fDã�cæ…‘]dò0çø0n^>08$>Å „x€QŸ›T’<†¿_ÂÖ�wA�Oc½l £pXQ³â´‚TYÑ|–„+ÕœJ:Í·©3ÖšWkpõÅ›ocbI,ŽV�e4�Qy3eL,Æ” ‹[ØÅ ŸI:G×Ê+ç\‹Q=Ð a‡Ä˜—Í/ÛQŠŽôg5¶ ·õøûpŠßg À‹;áx@†úPCï< ©-ʹÙ‘•ƒððâ»§^H"  æ" �›Œ`!RÊö#/ó§Ô#¥Yuv�Uj¥üg�P- !ä\,îdƒâÀ†_CkB�ªÄô®`ÿŸË…š"n¸0²U7 \�sƒ„Žn†Ä–'ŒÎ£¦<å”{ÅÍ­N«ÅCJ©2<¾±¡9(G×Fµ³H8DïŽh qt_à}k_oŒÓ³Bˆ`ÚDbÚšùÄözÞ(Ôi#9ÖUæóç_ûOÁ­g0þKŒ?ãŒr� ÃC'ø«Z•îú_}x¢,(Ù�~ñ´Ž8°£a�Á>ÚÏD„½cD€ˆ6ã÷Žd4׿LJ˜ÍƒxÍ6 H'HÔŸÊm箞[qD½&s¸QÄ6Ö °Å (r]õ{/„,0$ˆ·ë Üðx´.«1�9J¡¤ã\¦AÙX<^�‚Cqk‘‘F¹Áž‚`êøÐ²ï80ÐX!ÖU=5¹Û^%†LdV†À'%l_&á°&—¤54ÈÀ‹Ø(iÁ twÒ·y¡øIêÍUš (N3¨Ðä"iÜÐø``©Î¬P÷!âw¯àc²eÚ*‘Ïð÷bcŒHÞSß”KpQèä I>%Ð-0>Ì+��Y‰!HgLÙ­¤¶�Ê ]ôdŒÉœŽY6<ý±<+Úÿ³tRXMŠTß2ºPš›£]}¸ùƒ˜èÆ`ózð?°6?¼;Ûƒ"ãøž­H56Þ}à�([вwˆbò|w­ø)]Ïòó\ÜçÁœ7š#sÆ>ÚwÉ÷Iޝ„ŒIàN!iv4Dü*�_™ž€3ÜP±ËŸ †t-z†8êPbñóvZFBÿwÙõHÏŽ*¬7W©ƒ ŽÞÓ]Ó¡; ô'ÝærÀ û žx!Ÿmì)øšO8›a—ýÏy"8ÙÌÃë�1�«€È‰#–�b˼±Çógàæ£Íˆ÷£¢X"NݘÚ7õoZcUèàòúQüܹÚŽ}ÓË$wõ1Ï=q¸!xØ‘Òs1c•Ü�‡žä,g˜ÛÌ ëØ÷NüñùÓD,õ¾®�…b§ç�ü�Ò£‘`Ë—ñª3¦1ž�ŸJØX׬ˆ›Ê Š‹„SЛ‚õË·fëù2®¨ìyÐÖ¶« ô0@Q烆_6ÉqgNAFØ8Óu€„Þ¹g›¥Ù’cð¢¾:„N±‹±ñ¼õV¥G S+u—fÊ`Ž ã’`�PžG‚ Ì B«¶€H�‹ Ý |ýç 7" >ûaÔŠ“‡ßÆ™Ñ!Ï{;‘wL)|øIÍg1ÀkŠˆ,«Ž„1ˆÿ8¿•dz~áÏàÖ¿ o&Æ'™Ù÷½šó:t/gí†Þö—ÎIîwEê¹™)Ä¢Ízi.H�,j,ôo#Ýë9�ø2Eÿ©›çÏþ­�vT keó0ï¶“ÁÄ.1ÿ¿�vrŽΠrï¿ìÿ|k©ü*ÙóÞ>ü÷ŸÕ]Ó>&Èû†›<]ÖâŸû—{©ÒZzSR'qUé·$Ùú„ö_ã T%�¼LâÜ5ôtm¿~ˆÝ áûµ¦nØ•UWï“…/^]ÜuâTÀ†»A¿ ·Õ­ùþšð=K|xÞ.›÷Û.Jµ"„ 6m¯ S�"Îj\èDL9z÷¸Y 60n�Âj$° }¯pÙÉ… †‚hccM©eR�Š·ª øc’}¹á¢Fö‚ Ã ®ƒãeH+ÚŽëƒïŒmLpš ¹—`!hƒ ÚIÊÑtpnF+"@`�ŸÑå'ZÙ·n{üQøx$~Œ ¬lÇX…†`¿ß±v¬ ïöŸÀ›³IÝʌΠJÀ÷÷Tã¹¥)ã~væ¸æ±Ì™Hãx³Q�ÇECB8Y7ÑÝ â‡”+=1—“U0tÎêÜÃà¹Ì·'Ì–.<ê øÎ{ÏNœì}MM`½Í¡+•õ1¥×4hdÉ ‡ ÐùP¢ûÐÓ`UdgÉÅ(„ãÃTÞ²!çìø·è#F; d �¡†ÜhÝ{Â÷®XŒní¢Æ²Wcv$,èØ¥ç¶†JDÏCRèæ¹;-»6ðfN†Ñ1‚ ™ÁÎJÔž½9&ðX!âŠÖ“ÐI‚ð-¤ <1Ú0BÔ ñà HC¥™~ÛtÊ�¸ÏŠåš¾5xþ’î…�(²lc ¯Tê ¶øh?¾\‹¦Ú11Pj"÷¾ 8#±[^¢á·`Öeq©WU‘É“ ÈûXç�ð¢çÎU ±·{ /7áeCý&$‹Ãòò1$ص#ƒ´÷ð®~�âO—±Ï>c!Cÿ{Ÿvrs›Ôã•÷7o¹.1 c+ˆ2S1‡$øyåY‰]�pÖ.<â§}–åŠR€‡õ³¿ ¾?ÂF q±ê¨ ú¼l8!|OTŸÉî7èš:9ð±3bâ@’BM¹c™)^—ïCDw8r§âŒôRåZÁ4A÷xÀ�àw (»6Ó9¿‰ºê:Λ'Že“|CNøð~!“3Z24\µš†É`Èql«±±Þó”çÏ¼ìæ¦‹­m¢ãÃd.6$‚T Ø0tbš ˆ“ `|#§@I�‹åèþˆnÙ}c�‡�Dbòš,ºƒ¢´"'üú!Ø£uQàÆyb/²/ÞiL¨YUO6£'û@Â…Œ ºO�Ι¹„¡¬HÞ>°±�a#E„?ÁÆËËs‚P¹ÕøÞbX;ï_¼©ãm±?�=·€Æ¾C:Á(/‹Ñ´0àBmÖ^@ú?û¯s`FBoàÂÔOPŸS€V¸=Á SˆÍÔâ:ü+Õ··dœ\áÝr¼‹¨Û�’’bJý—&‡<±¯Å�J�öé©Óu¨§/–?Û´Xµ=†<ΨÏ.Ô% É/ñ0´øó%aŒ¬[Uzý¼�|õCDŠÕ¦á0ÑF.å/ó¦(=Ƙ±½°Ë'•Š@ßxš‘˪ÀÐIèBÏEë[µ‘i0'ÊâI¼ÁÁÛ…¿ýxSÒ§¹Ú]ºó·}P=sœó¼ß�Ïp—É£WU†Ò>‰EŽ kÑXþ½¯{Ü;Ö405°ÒÔÙ"ªÐs@ .ò HŒÈÏï=ªÔå~¯QßY �mÃnGÈ~³f_;†d÷Èh,”hئÏS˹Ôž¿÷ÇìtQŒJb:s³N$~©‡2ž0Èö] â<†sÕ(È¡ÛýC!½{‹¶£�;¦zÅðøâ�2=(rEI»Aݪ\¹ClXrú4ÏΩɹK;£uk¢hÍé}ç¡…Âmv ÕNª*Ïê‹y©DMoAG åÊ àGÂõÂ䪢Æê±±¾ó¾}�¶¾Ó'ÃdŠ ¼¤4¡O ¬ò7 =ù¶«;g£í›¶;W:|‘ùQŠ *MGnéhWÚ4ð˜Þ ¢‰Ý �0ÊJ�`š –·rÕ¥�³¼P¯ vȺ:s–àÀç*<ôÎ×w+>u7xb!¾\�i •#Ë™(]nOK£ZÃñDBì1äGaö<ÖœN‚F#i’Š°âºÆø²�û�ŸP6ð^za¤Å°ÄºÀ"ïÈÏÝÖçXð:÷>< �A�³Ë®³ÂÁ·x¥žka$k볈êm"ÙN°sšÈŽ,'ûëCyÙJ·yh^ñ`€ÀRGÁð¿iÌY„õn§»û㫞FUT5BT™O¤áçEâz™þ3 ndˆ°×FdÔ¡È¢±â©J_¶|z;Š1 1ãf.\>]‹�G|ØÇ$¯Z¸Èí›ýæNÔ£ég¡Fw;¦Û­Iõ4vý_!©á9ÃrÝ<8·¸? —ʨ"#”…´qÆ ¬f—˜ ±¢Èy¨aw‰¤{ŸdÑË›#‹¤›#ÈŠ¯áù(WF-&lÒD8rï–Ã÷Q· {Jß,ºã-ÚÚ[?¬�ÛNC!'s¡=#¼Ç"™T»FÉj³·‹ª¡]™9«:0e˜¤Z.wY *d¾6bÉ�š�T€¼”r –$EJPÉ~ᙄü†xŒIÐ}—nIïÍó+¢+sêÙ¢VÛÛ4Ä(qùÒgá>‡Lk¢Ìr²8@ý�†Î~0¢¼C^iƒƱ ³z§ž"ø±¿3j±Òßàø.:^†:>>gçBzy(æùAËȽâú5¿HÕ½p£�‚¦Ór64e`ÄX`‹V2Ã^È–pÓ±q4Ÿ9 y*ÚyÃ��¥3yÁ6 îå_ Ý–©$Ãuqtèè¶9ïE(3Ë­f§w2Pb§¸Ò.^håuͬG­Ã¡—º*þ9‹O…cdîh&j±´à}×—‡`^!®›£8ΙÜÿÅ!×!дx朙ˆ‡D�ãQw‚�˜y#ð$tˆ¨«a2Ñ<ͰÂ'Z˜úP'†8±$[ç–"øÅ�xv$Seþ:*1&r®dFdZœè¼ïG.‰¨ÁbŽTsZìÅñ6Æ‘—‘·ý¸ŸúSW-ì³Ä#ɶ/üÍ®âi9‹1ÿEU»ß’pÝfв˜ˆ‰ê~p8•âNéàû®ÈllOÎÁ#÷úTô£�»¨ø,ZîÚÑ4µ@!þ½kC©'Õxex[ÃEæ¨�G§Œ•±2—&'À¥íC.rz²ÊÌô<óЀzGn r™µ°fzâÙF¦øyÕ8�¡é׿9§þ³ú.^q»ÓÑDÜÄÜ�I.;Š!=+¿àNŽ©Ûe¨ï9e_ö¶˜+/j/ wØîJ Á;_Iø M—ñ~“á®ÓM?ýwíÁýÉMv½áDvãLŽ�î0ÈAz˜ÂŠžþêÏÄ*—›°Wð%bùÑðq ïa¬Æ¹ï[4°d‹Cï+]ÇÀo1¢�4­ùqJ#ïU«;Œæ‡0fâsÁÍŠ¯ H)wý(Ƶ¡‘lÊM‘—j¯[¥à#!¼{h2’“9Ù¹ A¾d&ö–áÐV6KJhfWº{R²Íu;_.¹SgrŽgQZƯ#F¦3 È]é ‚x¾F€¦uŠLVÈEþnÎÄí&·û‡kY�Êíå%–ÃØübÖš%xh‡#A÷â ´¡ßz\ï0¾)+ø6-Ë‘Í}Ö"={Åâ|A� ”®‹‘@ GÔB5‰q_á.Æó†Ïœ¾o°M±¹!¿_üÓã Ž¢jîû)‘SKNsNï ¥“žfùð™qáFù¶7UN�Ȩ'üUUXr,h0,†8¦8 ™ý ßlÑ$:‡üÊÏH¸URü= ø°Bë!ÓxPOâ½Û‹´ �1ý®oùŠì°5QQ!5èg³SÝ• ž-c­ø{ÑíqÉÇSã&�ØAC}¹�‚úR(„'�€ØÍî@æ�šàwàʺúø˜É}ÝúÁ›Ià• ì�1ÀìHSbdT dûC+Ñ¢^@Ï}ߧѯL&(ŠKYešé¸ jæÐ²Š�"‡в‡¿Ö; ß­}ñƒmQú¡C¶Ân-ê”AÕøÛQ‹ u,ŒCùc0.9T{¿,R†zs‰1yc˜z˜Ûĺèž#´\]K{“U-&)P{´�âñÏ(øÜ:Ú âBW†Mx±o8)ï ¤#·•âäÔxæÛRG›ÏqܨlgìÑ _ˆëû�"¶nÒžl|�'a内ô©Àãø69o*YÆwŒTèåv¤t(¾Žœ}Ä%”m Bï%Hô^!ïÏ>æËâÍ¿(ôs Ò<á(.íH-_i‘³'Ãé„Q”¡²™RA < çËÖB{ êƒ×„¼ò|n2' ¨:z‚Ùs‘û†+ò¤Í¡rˆ¼ÐðDÉ…ƒ÷íiäÁûIàÊiÇÞ��}Q\šPß™DÞs<ŽeÄYññn8«âªÖ7~â‚”àðpØSŠœlï€$ï(ÑÚ>a¹ü9JÁÜŠà·„?&ä«O~w(Š­’lsîÉ‚)ó\*!!ºymTU¨â˜FÞðäuÆ4ÐüJY°C~‚ÄmQP)mz¾Û·L‚Ô“¡¨€ìV!_ÂÈ›G€M<² IêŸ3�Vìd%·<ëu# | êÑ‹ˆdp°ò•­�|(m¹U ¾xL„¦Íú´T=¨}EU�ô#ËTdqÁ9 A ˦¦*CŽŒt%�o¥iZìAVœ”v:˜à6§2³éWÑ�ò<-­C2Ìðäóã-¬¤Üº˜ÖEÜŸ“m!J­Ê¡3TÕd¨þsôÆ™²Þ¡­iåXÝ]÷QÇw^�ˆ|öópŽ7Ж¥¶Û ­™KQ‰(ðûf|Ó—F]H´E.ÇÈrä=ñÁw¬»-m&tÛM„Îyi(†ù¯·«ÛÖQ7^os“ËT&dÊW;�y[Üè‚ÙÌkxs¡:W† N´Dd­Õ¶«›‰‡C7ÜÔk9XÐä9·HòÈEfzzG³æo‘’2)ÍEKœÄ¸['“YYöŽ!Å•5½î®§UìÞ»£L¦u¢aÝðÐ�Îg” &^Õž T³Æ{%•x@ŠíbiÊ–µÿ§þKÿB³*BÖ·í¾|;¬{Ïßíª~@ÿª£Vz×ý}_9Í÷{'©÷þ^Åt£òT¬ZÆ24+¹xZyÐVÝ)ž‡Ç°l>ÂMì{š:‹A¡‚gŸ�ýú]7(&Ç@?ç‚ßw*Íb5<Ì»}zpKL[�¯óõon<þýºË*,åEP×ø3;9 'Ý£Gw“•¦¨ 4wxL~�!c1lÖ§wnèŽDÔð‚…š�žŠ '>˜b‘°BB[}äfê¹ÅehL2w`ÇrG®i³‘â÷°ðËR¢ðo…ÈóaxZ¤}A°3Ʊ¡& Bõ²¬«ÒášU�¬ Q*A€Ö8G�ð!Æ þ·½àž¨¯=”©¤gÎïc¾5½e2þk¹ OË#‹@6Áƒ"H#@Žˆ¡Ì§r–]؇SñP!ÛòG+õˆyù�ú‚q¤ ƒ„d`ÃôµÍo$m£‚>2è(5–«8Ûƒ§~‰•–\Ù2R¾à¶C£óg•AœÄ™( ^¤5ÀÙ-HbÐ<üg÷p®íÃf§Eü¡”ÆùF%ûàßjÕ–Õ}�Ù‘• ‘è±°¨BOcÁã}fÏ”‡°„í½²ôÀ jžØÎfÅAcoî¤<|G}='ß;‹ˆÇØÜjëÁJƒÁ'a±Ú�"&0°k¼í{ ä1á¯m(w/ I¢V{À‚C‘ÏZŽ^"4ø]¶{óuçÀ87žã¡.%lVbUx?”Š4"AeI<µ‡Ã¤ð�ÿ~T Q~åžYɧÊÖ©8‹¤ÝÖ9ŠZHI2¸K2Þµ ‰Ý×.�•¤F5b3â+kùô"¶0h p�Vy΋Æ?\zøœ€ÇÛ¸™a!ùËÖ¶f…>:{d|á\‡­*e41ûäMÉ’ÌzM­á`qÌ(­?wóàæ¶h•–ÈHù]:çÈ·•ßíbnÔ¹jáÞÞ ÌÌ3 íàyÒßd·h!“ <åÆì_=p½/ÙŠ7§•™ß[ö§c}Èot¬ )a1ÎH%¾îFÀAÂ&;¾g½ûBéŽÑ“ƒ¨2‰×Cn(•'Cñ´œ/¿{”éxyÞñ—QÆ>, ¿ ×XïŽd”"~KEi¨3¹a¹G.y�^3øcšÁÄ*c"4BszÄ�°7�‚ø³¯œo'àt›Þ²ïW¬èd”cÒ~Häæ+ ⊛Ï@ãÕü‹ÃON²4Fâ9vvÑ7�ªwiP�U/J…íCn¤RÚ°{ Ñ|J •¨¯m¼z’ÁP>qÐf7%˜Ö;þÖ¿´2^k#nAõ«z�®egù\Ûßù@ ¯ÀÓ÷†0RÌÙ#ÉaöuÄÜû†5LÊD¢ÂÑn%c9q�Ž1R�’}bíBÂ1ãzèäv¥;§›:ឤR}Ýø9Ã2|Þ³Íz=ðpçÂ,g”“Ò+uíÍtñ±é&Ôî •´kKî2{gÀožå'éÖYÈ4=–“hÆÀZµ¸ßõaœY+ çð)ÜwE\„µ,?2õÈ}£4g¿3–ªÁ¦¾âQC8Âõ$wœ¶F”bz‘ÈBç‡ì�n€ŒF1eŠv=kƒ³Ãö=÷ù¨Î ’Ì´?¸B=þF¹çÁø„<2Ü_ñº�Â½à…£Ãß=1kêûD&Õ ùq´7Yà±pTÌWà·¢VŠˆf¹›,0McØöA½Ê—Ê ªd´' ý4ðîú‚í\&UÐR Ýê`Ì´ÞC5‡ø.Šóï@î˜Ø�[š­„߃˜²%|ä[êƒ"åk¨·–¦cRÓB¬jz+êOshÒA†?™nb¢¶QòS�ŒX±ÿÚñ±vâÈoz$p7ø¹LY‚ÖpÌzv‹urª•$ãEV5qp[Ë"3z@%a‘ˆ^dÍÑ‚ûþ PŸ®tvd $–j8Ø€­€Þ}1 Ñ~4êÐÉö¥k •U4�$¬Ñ…Æ^d;¯Œ¥$'sçTãRØ©–¯z]ì«Ã�¼ª Ø×ñ8ÌgÙ´oz;ÅßA~3ÚªF®nÇPlV“ð xiÆw÷ jò9´Ð)Nôƒ¶¬È}"Ê3¸Ö=|N(eß÷äó[°’/#ÒO8kTwëQÿ¶ùUœµvðoÍÎÀòz?P|øáGôûîøƒ[Ëk*»L!.˜|u1¤ f�¶©� í&Pí%òàþ°/Zpcù<�·Ý$Ê©ìy÷¡$ÿ»ÕdN�9<¾�æÑpC«Pg0r|ösó‹–AEÂ`øj®–ÚÀ‰x(ÞPHž ó}Ã>l|/·�JYçù�ï>ÑŽNµ ýÞ x_š^ªÙ¦êц? C ët}÷yåæÚLÙ;öÖÙS:"¤ O¤½þ<Ù¦Îʨø‚…¤Ggv¦9·5ù:Ïf„zF[^x> ‚o¥�XwƧåï3õtj²ntì·hI2åpþX£@Æî'já쩈˜ès!ÑS²W×a¬|²ŠÝmàM$ä÷�±*Ew$$¼ÅŠ>/Ý�Y°æ µ ·GÉP(Í >½�лž¼~ã讓÷‚çu³5„Ía lß^å*õ(ó«Ý%JTÎ*ÔÆ† …ÇÃÆ¹ÇLZ`ãì:œGi¿˜ã øm¯ý @0iþBÝ öô¢i rµãÿaмDüÜô€|¨aÜc»TƒíÊØ5±ÐØT.ÓÐ{ôµÌðoÁI~Ý©Ç4ͳ…B>x.u;8ÉÎVxçþ!àø»ìX$�VB}}O›zßKö0½=¼£Ÿoé”UÛ^Ù:�oµï<‰÷_ðû¨�Mla'=âÿqÜËÀçö&{»ÐD#ü{mY÷Ÿy0üùï?8>��]Kz–á�|œ¿„·uaRxã¡?ýòhdÙÛŸÛùó?©T?Ïúx†çHþÚk~êÇyålBÊ©9Ó•Žê¯]Å àÒ�íT¤É³Ñh£Âã‘*TûhYìPÐzÌ»�iȘ3£Ló>.㋉“a3óJÄ‘dš™y…‹„faE,Àª1k0-9H… Fˆ0í±Š}^ßÝóÃƳôÓ1ô²”þÑVB‹L=%ÊE‰$|#'(£•ËšQ†Í«£Ð hºžUó‘’Ü&¤ÚÚòVŸÆ¡Ý¢62s9ž‡¥m„Û9²qs”Î1?öu'VÒ�RÒ{¹Ö•(ÈK9Er~}rÛ¿ËG· ή½¿Â,×>Éñ†L{{àîõMØ'1æHkL¹G~èô#kÿμµ-O 9§NõfHèkÄNÕìߤïæb- œÖ‰NPðPYMĿǵžè�dù(Ù¾Ç�*“P:OÙäåNFÈâ�ÈË\.ü|þ.o-ܶÿÞª³,)pÉ|ßÓ¿ÒñžFW‰øËö1ôÇ뛺œ4T>½½ ÚØ¨t&Ö¾kÛ&bò6â]Bq²T´YSe8Cí¸B§ª0®ÑŸß$–³©v3òc—˜–Ã?”9ÞôÉ'*­ê™Cj ,Ò:l¾ÀÛÉ߬DÊ{éûéóî]¢smÞ&a·˜cõ…ÅoפzFƒMâk†¨A ”.vjfè9 h¸”æà„æ‹4fˆdÌOruR¾eÑ$è¥N‡.F‘4PÙðë(º™›BÝ&Ígš6iÖrœS‡ntæÌVœÒìØ¨|ïQåÏ8�Òl÷üzáñ¼D³G§"?z‘Ÿ#½WJêêÛįîL¾2]£›"š¡’m‚’{&‹Fþ»kóVÞ£±ÊÊ3³ZS^UAON)Ù5qy×í o(v~ç,Á›ÛÌW»ËêÁ%w¾Uç5Þß"“ISPˆ”Ÿr6¬\‰¥Ì‚*ê|¹Õ‘wZê;îÈÊàÅhr¢kcKJ]¨ÝDU÷#c±áÞü^ÛŒùL•e4Á";dªELýk.–O@ŠFΦM$ü&îf ŽÖ›=v�9H\ûr€¾MÊØR¢ê!.žŽæ�¶ñ¸B÷H–×.¢B›Äñ›ÇÃ@‚iî|ï·gÒ† _¤ 7!ÿŸïØó�Õ`Shkÿ�k©´�¶‘ˆœ·)pw¼nt~²(ó;x~¢~�2£ë­>dÇ\«+V�Ǭ'IcJ–±*«•L¾ûÎB#»×òC…UÄY±ØÀ)"ã!T{ò”D8�ƒüUè'�÷Å ÖÁ¯Ñs'yF¾g&GÉñ$‹¿ë($˜Èc Éf× íGÿ<¿ã´¨+1Uš ÜäɨŊÁôøY*T%K¼D®ÎÌÁ¾R ´èt+al4Ñ9`™¨A2#�ÈBø0G ><}•lÌå§(Æ<סi3BÓ˜XZ*1#F�,O²7Ÿ7†f;× B‡€kÈ�kƒ „:' MïG’›:äÚ�„B1Rˆ¾©pÝÙDÐ?8•ÚMÍß·d˜ƒ 9 Gà}úN¹ïÚT-ì 'ÌòKÌë<êà8†ìÖW~Äìt�ØãŽýê„[cø‚#Óòä±É|�5PHf sÊ¿ùjTù_“éÔVYŽŽt_åê�]Àúäý6ÍgÄÁ~4×rÒ|Ücb‘+±¾¨Ú!˜[kžB[G†ŠtxŠ�‹CÇCðëÜææ~—mùÂS¤}qd±Û:Gœ—ln'«—2Œnö|§À¨1]œ£š�2n¶©<WûΕ;ÃîG9]4ñL¿5å1–L³-)Ç(÷IøVŽÊRb5ÞôH´‘ðÈä­îÉâ…{‘“°æ–¨;Ã�µžÙ¾Çzá°�|;í¢Övî¯jßÂ`Ž–òå†îà<Àåj&8/sßJëÛZâö� Dcf8-®ßíËõ‡CW)ºƒ]H2›|ø +}ê™Zw:¯kÃBp/$3@ð«!A0aa€‚vžÖ$(o}–|p:h\­wÏ('³¤Üßé„,n3•÷¬îMk3õ—ö ˜b\Rù¾xf(Ù”³Æ}É”Í7×2úoÓN~tGyøã­éŽc½�:_Üî;;wÑ™ýmþdzE‘l(¹àý¸e('òÎzX|¾'€·yÀ÷j#]zÄÁFΉÚ¢^1rÂæ¥ ,Ü©}áIåãB5ŒX &óÎñ+Rï.ûŸS¼W&CƒÚ vPcÍa° y¬í±ÒÆZ"ÿ¬M±Ê‡%õ&E›OšÖl;l0ËeGÔ…½u¦•m�/Mâ–þ”�î—â“Ìç9î¡ÇŸ Rx­�Dº�±¦ ö¸…Áéj1–>Éã+ ¦·u•Í˺, 4_b˜3£ò´Êô€_†{ƒ'Ѳ‚c ~��8ãºÎïÞ O‰ÖQã!°µ%ÁX–v%æ�qD@†G±Ì4óáX錄±V8]Øï¼•F?5†(ßMhÓKÆ‹f½§ÞSå÷1ô“…ùæ ^�b�²EçÖQy:¢fLµ É!ûÖÒ²œ�Þvä�ˆ�8RVm_€~À”7 ¨:ôå÷Œù=$�¢\å´á1ð Þ"ScT¬Q_ªÍ‚š+Ž>&?gKÑ�ˆ‘.‡šh¦lªƒ”ª\2(ŕʆãC™Ší$jˆ‹WÑE"ñ¢~ØdbwCŠVã&¹,±™»tÓl*¹ááíæÓDÌ”G…«…#} Áò):xé�ögÀ ˆtÅiX‰µâk“ÔæÄ…€Öô7K".¸ŒuXéÔOšÿ®;&%#J›g.dL†&ÜÅ+S g{]%»'�—ÿNWôxÙ’òã_< ÙÁJ…(RwfÒéÂ÷s›FL¼‘"ßòJ…,Ðá“È¥G]k^½�rU£ùÃQlÌn¿•Q“x ¼]VÎÄÊ>—P§2Œ�?¡%Fòq*Œ‹ožmòA ú`øYéËùûüÖt‚R1Ï[’Ðý&¥(ÍDJ M�ÑÀ½©ã8WІ#ÜcB.U2âááŠ$Œ\G:­8£`»Ÿ(!A·rËm¼ÁE¯’Žž�F¢k,"4íÙ„ZDa¥�Ž‘!ªªj»�šÂÍ)6LÚMV+ŽÞµw¤MF¯""Ø•Ô6”b¥‚,píªü™Â"Ù� ² Žãæß¥tÄs²,ɧD}“eížéwöãVÏd‹Æõè›ÔÆ-¸l%Í.º£ž?'æˆOlšæÃÑÊeä~3 ØG—g7Œœ6J0HŠ‹gF Š£Œg.mž‚ˆ•a›¹kÍÆ³ÿb¨ö…ÎÌæ?!‡[ý¼3…S:ðf¼O‚0‡—ø‡3 ؇XÉÁ¸Â(œF©ð¬¦ëºÃ?Øvèíýa3YÂk³¤×ÐÇðY¿„Á6ÏêøùÐúAÖ“è6oO÷Õ¯RvT.A¿^NÇûÃ,¶÷(ûOåV‘–g^»^=ô¥?ǯ/�û}úTx<€˜:3Õ±YkÕ¯ Öçï“¥)ƞȧƒ±’v¾h`Äv2"7¡5~ °¢ ¥GC‹¢&#S4Âa½PbúÉ' ÕăØ:< ó žgs«¦¡ê Åx‡TÛîµò¸äï³½<÷SLâ$~v/þˆy= úǸÇ€a‘÷V=1ö3¢áÇŒvV÷>Ã�*Jå‘ ¶Aã5Ž�R�“ßÏCw-ïK§�p{}ÀlñÅzø›Èh¯Ê=‚Xÿ" %‹bÍðá›ß�—ÅŽàÊëãB„Wt„’I½!¬ dñ@€_ìm ¾æI a*P@nàwoS„CIÂí¹A‚*„EÉÐ�ÀdjE¦%ÉR‚PsS¡H ½I×ãP¾zfH5£N=²;ÀްØ!LÄxO_Æ›ùñFã_¥Ä¯w�ÐxQ® ³ˆ‘ÔEõ�é ž½@Uó¨9[ ïêÜs§üjiC$Dʆß祻Xå›3ù®­»Q ÇFâÓ9rP~ÿÃÆà{dÂÁÕoŒ¡þwbF‘“ŠŠÄg`HŸÆïvé]† (à²ù^ã†\ÁÙÆe³T‡¡@¶ª}óé¬q¡ðláþ«Ê{•O6sgwY¥dg“ÌPÙ}|©AdNÑY5ͺ‡ ó*ýä²:ÈõØŸÂ_à\Ï}ñrþðÔ#É�„R¶ôpKáÈy@øãñÔÓ³Ó(wÍAåXbcJÌ78v+" Oº2¸ÝàÇ=Œm,r�WÜ…-¨yqMžÝé¦çTxš*!W ^øÒ?|hðl/á3p˜fíо[;�ìuÀ}pûÃìtÙ¹~Êð_˜cëuö4Ë7î,ƒzçŠ‘Žˆ¦o�ðTî(››ª�}æ-p{C‚ä{`¤p›•q†R@çs�ê¸�`%2®áÒnV9­wüG£€£‰à¡‚‘Þd…#*5D›J‘C»Ðíæœi™òèFÕ#•ƒÍt¼&À19cq�Ôžß§GÒº]Aܾ9ƒpÉ΢N³›Í+.™ÊŒ6E¼× mÓ³51œ«œcŒf–Çüÿ�|á~€H²Òc£]~‹Ó�z‰ýŽ X+WËÙÙryVò8äE,]礵ê!lEÏÂù²7â|5šÇ=]ª=îs�K¾÷R£¿Û—+ÝpœR²jš ìrŠíå8K¤�nD`5ƒî#ÀÈ1˜º× rÐVQkQïüUs È6 ÀRŠoh¨š:¨�îòŠMÏ´Œ8_ö:¾Ô~Ìm½Ê£hŒ*מä?HqO—ÄrG‚˜.o@öfk 6�«Å™Û(3ðLç7éáXÝ�;-®ø†µ÷¸ª0G5˜GN9nE!9†³#L]îa@©ŒˆU€ÐB*)Zµü†)h]ΩÔsŸø$™Þ1«³Al÷ÇwCÌÛI¹%5T_|ú{3Å.h=ç´)T:Ž·jÚ™¦Ò ^vYyNíR‚¡¥–ÑéˆÒCG7lKÄ̮Ҽ‡ðÏšÏJ²¦iâ?—ƒþšfòš'Y®«f®…ù§fD*åû“! e"#âí�„‡`�oJ5&£¥2TάBqaAžý.ËozMUê÷ ×íȇð�S*õo»$¤m‹GŸú^å«R¹ÊÊý©ù;"„Êv/T£×l7“¡Ø)ž�ÕÏÖùP†è&ú�óuP]ÐJŠ›ù‘HÌèƒ0ç…ÈYäBÑ\)ɧTóÄ®¼A;Äop†l[NFRÄèÉ=óž<>ÐáìÝ­muº5ùÕCîŽ3‚¦zm38Êo*µø¹/7ÄÙ~q4ü)Ñ�œ�k·Ü#±Â]•_?«zʇ’Ñé3¯Yá Ó„YKz!oŠAdài™‚M£·ˆë_5Š™d�—y)|¶$¤Ð¤”»-‹PE×a>èçw mžšn!y9Ay*Wçí?Ö~°Föú5òHrø)b;l¨Fdü¾¼Ž)dâA»þMï\Ÿ ôLÞ%³&Ú’4” ýy”ÞN d½^wjÀ ]]Ao(TÿårXz°‰PÛˆ‘ 9b>¨X|Ÿ%ƒs1 úÚhÞÓ•ê»):,³2%˜PÅ£/-ŠŽ¨ìôÑËÌ™“TøpÊÜâæ‰ö2¦Î{>0×úÎïhËþ>JªŸ?ˆË–×Õ>+ô¯zsëæ1™~-ÎQÊÄ›(ÍTð›®%å¡J“ Uâ[ZY.ß$~m™¡fõ ên¼x-9‰<Ü™•Ô*Ÿu0~}Ȩ<ªœž2VVÏJ°fCÄBäg[©eÊK­Õ8ä[žùz¸”Í Œ;¹î“7´£*ñêB\´zh b8•)_c·¢Ï­RÚ?a�úÎ0/·¤N~[¢Î÷J¬Ówð�Ÿ(n~)Õƒ©Ý,˜(Ý&W�ÇI¼ê˜áFq‚�[·’ò]ÞMºÕ/°ðãTnl~tÉP‚ ã4%£{ƒ•º­Ý¸ÕC¬î¦ ¤‰�~´õu’ÔßÙ·»nm EËi,ô·©Ù•š‰…„ùçíÙg§büâ¤v3tÙzó+==CbHºiRmº>ù3ÕÊ'Ësp (7l+4(¬›E¨)²{3{Ì)”@µãkSôbVPÌUfœ`Ó.,6% '{ô²DÑŠWÇè%Nœè­Ð¶ôîVVj““IqÈt{õ¢_DóÄÙM¬d³éqRU˽6�{-["JÛ2Š¢_¤ë%k[€pB.a|V¤–Rî�.óÍúÎzNnøÐj½ #i³µR-·QsY'#¥;T(a‚ƒÌÒÐÚ<9Ýèï?Å ¸—SeÍ6Zsa²°u 3‘ ̲ Zž}6BKÊ¥�"¼B‚µÓm Ñ¯Ž×ó.ä^a.Ü鉸ˆL öÖè—�ç0Ó¨DIá†g\Ä'I„Ž>ŠŠˆ K˜Cõ ßõí'n>'³²±á„¤K¯X ü˜J3(!Ä5V5v†cJWÏ�O#’6vîÏܤr]U“%D™ÓÞ"Tå¶–ÎpArž»©rçNg´/lbÓ·!Òç‘Óòt¶Ýá�37}^ »ðò á]W2"|l¿Œ*žï-;cÞÂh†}Vù÷pòÛ`Fût53o&$}†šñ/Ëd5Ô­32BÜyª—RœooÖ~1 ›Ù ÉVˆ%i�²lwIm\$/M©™^¬'6zY‡ =MbHrû¾³?PîmQ•.ï´íÅŒ…¬Î�d³+Yû^1BygŸ Mæ5–NW "rÅRÏÜœx„WE}õF]HƒÄå™c›i1¯rßúà1—ÿ`�ÿ™i„ÿ><ü9îÆ…‚[ÿ?ìw °•ià*¢�ë¬ç4Àùýö='¬-*ßî>,Ž~AWÄñëÄ’p+‡ZÆ*BÕ´m'SR¬ð_çâ¾Ï•a³ý ö>‘ O�÷úª&æÌ4¸÷ØZ�ŠtÔÅW¥ªK>ࢂyç©€÷ÿ3>›yùèÜ­ö-b�Q'êψb™*`vv¶;©Pï¶ÖqšÛ‡C›œ”ÉD.øÉÍÍ3Z¸g+C£d›É¹áÿâ�>‘®ª˜I]ß< dBÀ×B-NÎk¬áãÚ�?0<ô+‚xßAsJ^‹õÄãú¤€LŒ°é�,t�È€CC”<”vâ^µ¡d:X<0YlŒò·;,ûÎgP%¢{“Â6*´´`Fg‚^ïÇåx.vv ÷Ø»"íYàxl×cÛïÄ$‚XïÔ> �¡8˜~‹  »ñßÜáòCh%h—*³xÿÍ*÷Å!Š^¸¨¼Gu,hW¹{×àßÓÜé h,*e1xÈý¸ŽdHO9CóÄd„YŽß¨Äft† þÊz hÉg Ý:"•â±ßga†-ÞûÙµÂ�s„pÛùyn&(W&ñ‘øh^–Â|àû˶u÷÷à_áEV¢s¦Y öuÝ=Å9Z(‰¹løù6›"æyÅ’}?Ň-0-~ÇÓ¯7¬ÖS²Ö/@e&ißV�E¢¿ñ#J¡ã‹K2xàá6_zu5f91Á]šùÆ/b¥Ì#™ÈÄ&dz˜µJU³=tå“uOAÔ˜«xÌ3ÏÉ P>ïƒÐ¡ÅòÔxzdÇ*|smiU¦O)аJ~V ö’xS\4¸ý¬Ç�!S¡«Œ�–ê¼uD}ˆX8;�OHç©Éñ¤>vgïKÎkkç ¸M©f²ØŸé‡…MQ¶‹¥Ú»�Î¥ŠIŠˆ±�þoôŠeê�§éØÈë¹ã¢ø>cÇÇüIú½í8tÁc×ʶ¨‹Õ˜k•ùCÈQh¨8}ÃY÷[ÃÀŸâG­)jÁWä,p$Ðå;ì�ÅÕb0¢Ñ`{s£<^jü|ö†±é~Qý#Å!1¤xÜ ´‚Ù&}ËVÇ>Wf»ê­�´¸:1Ûåvå9œî3'<ñ‡ð< Èà0€º\†Š<Òч�šýÑ#H°ã—ÁcÑEèÖNÔcÕq I ­üzã¨QÐ’8#<ô?ZõsCÝò.I;Á"$ƒ’Úð¹Ï�ˆÅ1Ë ÐCdä8ïïšÐà Zþ,t{ºmÇ“ŽãðkûYÌý=6\ÑèxÅ�iÃݬ‘¥�vXàûwµ±X Ãmc„6¼ÂÎMh8Þ<{(>q¨�¡÷wáÅkL›äºf¯†vƒyÉ´Áؤ'H�0ÜÐóÅp÷ÍÝžEÁÔ’Û4þþŒ'ì�.]úºô�O-…ðî\˜*—ùMö­¿²+_röqOMÓ^·Å:îý-¬?¨úâ(Çy§î]›‰GÍ�=–£¿z�|Tm3“2ð§}”˜ÙCYzpÞAH4(Ñ^XE„ŸòóÕ þÓ„D d¡|ÈÎô"2n(Yšú¢ý^ú=ƇpÖ@±"ñWèR-*{‘Ðùòp´ãGà>ÈÛdh¼�¬tiE—— OívÁ÷¾omÊàP¯°zG­“vÉÇ´©³9|cÂÉÙÙ,?eápzØ¿ˆ^{Àoµ�^Ho0;`ìö}ª£û9õvĉ ÕœkíUPë0QÃ[ W‰dôÃô\�w=^Äø'x”ÊòD�1AÅNÒ„ _Kú¾Ê÷Ù×7ÂíéQ�%¢mÏð"êʹBú¬í¯Üp¡©¾ÞYçyŸ²~1 üî¹ÉÚ™îÖ«¡0ðè8Èš.¤­&[qÚ¸M^„o§NI—Ñg¦›óíQj:»V ½ç×ÝyT'|iv(Ü¢3T‰³¯=ɲ"öºšžy¬Æ kƒŽ÷N¡ øq âšÏ—þ1º~UŸð>ˆ>¡§·)¤t”4 ƒ³Óçh½>!¦-𒉧‡0ˉÓÎ°Õ &&ÐK:Ò9„›²™ãz#Bt&ñÂðuC”.Lˆ¦c@††àZݤ¡ÚC…ÇÀä0 ö÷¯qœ‹&, ?»»¡­Waõ¶: ¸8†ˆ=ò@¹I‚ -Ï<ܱ(rÕ!´I‰{_O¢yM…®rWWâwž8RËM|ƒÕb[º²5-øCÂøä;¨÷F@ù u]AN:+;ó^Œ ²B?†VˆÐ’Uå�‹)ä+BÃ7€c…šÄŠ!™D ƒ‡œp„'!Îô6#ÞEF˜#‚:å´‰EÍ…ô÷ˆ(×ƒ×øuV±ƒe‘m˜>éɧ¶v2u„Äc�/Ñ|m±f7~z!‡¥:O�Â�ÁFš˜dʽÉç! !RàdÂÖ&R·¯óÙ…~°9ÓùŒØÎŽhX¯XÑi”9@£�”-v�‡C¨®ÐZ4£?‚ Ú ÷°„=ýÑC£?o9Þô§A¬›²ûñM^.;Ñ¡{1òû¿'0‰ƒÅ$¹Ø5^)Ï}<Þ(€‚Cƒ‚ëÃÒC¶í pr83–7aQ½èaïè4´,ôqË­€LÕ‹ëô¾ä�ƒ@M~�èÒ°Ï?gØÈ àPÃÏKÑÕW,|¡åv©ÑÛTë]‘wƒ'´2b\©Å„ÈgüÛZ,cu€Œ+ϵü/S«ùv#ßx3ý€N.\ÈX­j04Xz3U&&z¨‹—""•¬ +Z„ÅGÄ)°ŒÒ¢Jã !¶ G�ä0…ŠGÍeèûJ­Pë‚Q°€ñãÊëÔIÐÈ+ž×.BÊÿŒ³‚#YT¯�~‘î:¹žèiÄ% ¶ákˆ¶Bñpe¯M^ ¹Ä^�¤¶$%Ãߎ�’XtÜ¢Ç}Ì’eºçh¤Ñþ9˜çDsî^MMÒ=Ï}eh¤ˆ¸¾ãŽh¸ñYa!‚3= Å'—º¡¾º4o9Ø#Ú"k…Vl7Ÿi{Øë¡Ï(s©!—…N±Z2*/\¹¨ƒ«G¦Îa20ÏŒëM�žÕñ|î:w÷ʺ£kÏ sg$ࡆ“8â ñî‘Äb7­†‹iÎvŒÏG¡lÄh;Ewë"¹‰c»¢€A”áoÉU'tLO}vµÜç#:Å_3é|FDÁN6UUÏH°Ðb¢5^&Ü1´Êbµ`kó@ÕÀkp8׫ &Ê }ÐMYx`ž†Átì=OR½&¶3øÓà·ç‚ Ë|ðeBô‰T±É¬#o­dã åMT囃›ù#æñ?™¯m ‘è:EeE?žíçQWœ¾¯ÅÙÂ?ýø xc͇!jÎD¢ 6@ƒŒ ãyÑwˆªoScÀ^x5Ç$økzØÈûÛ(àî#™ï®@2©rˆþƒÊòxj~"¨šÑhùÊš]q¶¿žãð�P�´ ¶^E·3¶Q’é�‡9“•̱tHÎB€4ƒß“�¨½ÈHÇûØh°#ä’ªQBýÂ}¸ ³2ûÆ£Zã°¾ó.T�Y ê ­÷×*Újðf+$<¾‚;…ë5 Éu~Ð=ßÑ¿$ûí¿p¸ÊãèÛ§,ËUÆýÖ}^Ðg*=õu‘æÔ"˜<‡n¤|ßì&FbdˆF% ÜuÃR.©Lp¶–V-ÞEtjó24¾DÅ”NvžB¡˜vPJÔN-†¸-ðo´òû£4DÜ� Q‘A7-�”cõápÖŒ{°¸}ùœA3‡óÖ²ùÇózðÖ®o'Íu~¢ß¹ÚÀ1´!°Âdà!;á6q!ùy £æòšA‰÷M,2#Hn T°ÐwgBïÆ}L£˜‚Ï„âlkŠÑfè¨vO¶lìkWGb`Œ|ÞÎý ÀΠ’x-q`øVŒN ‚´øçe5Á|ð8FZƒ—a]o­ÔŸŒ“ÕùkŽ„‘šôU�Zýkpz")nãÇÖ·¢ä}äYJe"u<±ÄSÿ6d 8É�Mв†DŸÄÅbŸô¹W€NBCçïSá9_dkÝD–¨jY› ˆ)3yB|_D–…3ÚW`Eµ|`J ìcCÞ™Ïßi„zF ³I¢èæÇ¾‰ 8,˜ýu¼É; Ñè|6¦‡ÒŸ#¹azàcЊOm#\æ8.Ô9ð>LCð¨y$^˜°Mð^Lh¶Ý+Ì�ÞAB23��çñ,¿–<|пÚÿš‚ÃÇ—æLý�|÷È^—#ñN©9 FjOHg_ú jì*ò4Ðùåê*ކPM…#$o4“¸!˜ÈÐ�0OÜÃ|:Å¢3ÎÀó÷ [ÙÆÛ‚æÛ>�™ °¸.QHöI˜ôÅ�²�CÎ脇l¨"-yî}^{æ²Ü A6+ÞÉÐ4;,'AóÊç‰êë#þ €£…c2-t@¼X! Ú±Ázµþ“3€çwšïœ9lwæÆ1|ßš0ü7‡M^Ûà…¦H" 9ô|Jå8¯>àXÛAÁƒ.Ḿöùl9àluŽ{½yò^A¬Œ�`]n=»Zíä F%ÏšNø¯Qÿæl-.}z\X‚d¡�…Ò¹á·ÝOK¹Š·öY~ÝŽ†“k:8*�ã± ˜>Èçf-�‚ö—�8(fÏ-i}eL— „VTìÆEh„Šd¦eìjOc¬ú¿Òå›ßo”~mÑq÷¸÷7�wdk„!@ÅÐCÙRŒØa'?% ƒO�ýœ00`6¤v$%Ø€W¡Ç �s`¦ø5ÒHàð>Hõ;¬hó¾&Zð(ƒŽC E¥që+´N�¹ n˜y4I¡“b?{f=%9â_sžÌÔkYÈõ�ûcAwÑ´P3Ñ«½T&ÝÉàÏŒ ½Q2;2p?Ûâfú<¡Ì¤/7€ª^ØÃKyEžFí³XΙ�ÎBš"WLÒ?½V_õŒ Êm3cQ Æ�9tÆS&åÚ†çs-'ÓæEKÚÄ™ëô½ç½U<Ÿkûw[Ùc©Ê‘} ”=^ùbÁaIIï7Nm¸“=xØ´eàwõQî產v++\µ·üîÏ3ö¡¦‡”� çýTZ{3^Á|˜Cwr‡Øèxÿhãýýc –€óý~sé¡z ` :>Tq:ÇôûÊš1\dž�j00Nï�õOðù30ž�8üžÀà!©ÝJÜ|áp–¨¦þya~¿$áÐÿ~ÈÂÔ{O?Â�è‡S½=¬…(G�öà9ˆã#t�š¶C€s$ܯ¿CÎ<�pdñöxÀtà6àÆŒŠ£ø`øI6« °2®W?Ë�åí#1;åù-â¦òkBÆç�xã¨?ã¨`c·ëlHÿ‘°€Ã E#DsîQ$sleÐakèÊô†2Z¦çBCr ÝÌšð¥;®™õkûî¶!¾6�Ž óºx˜&7‡­‘–ˆ©½OÙDÚy�´öÿb\Q˜ç„šôt+g4°Aõµ }vf#Ô ŒÙ)dœðÜ*”óiÎ3Á)aì<¦hU­jxÅ (̱‚f#väBÝ16Ãé¢E[Aä�™,Í8a±³Q,§Cº‘8pÐ7ТÖ�É ðx\NÐ6œo5^fè€A�„—94týûýäÿ<=y�¸ß“ ’¤:8fgÜ� iYj3¾[¤-3óÚh@y7!¶s�8l¤,8CA\.‘†Ê±Sº4Uí’ô¼)k5Yzï’…ç»ãžá41ä¾AòÛËš^§þ6<´5dEî&ð )»PE_“²��džkå/+ÁY—}ÊÊl€éàwõ>Ò¹é~¡÷Dáa€„‰"�Ú”q Î[;.÷l&ÒÆ>wÝÚ(Ç4rÍ,O5ÅMÍ*}=­)¸ß’³ŠµhŒ!‚QB0^ÜHZd9¿<°½÷Y ¨§;&^yJÜöb…ž†ºTâ“‹®�NRîèNv»t7W‚"�2�ƃé8õG|3[?2×ü©½.ƒ�zYçb? q›Òçåž¾µôo¡Í'ä¹ú4Løÿ²HBï,Ñ|øG˜þýapB¿¦XL…G ¢W%áçÝ(¤à�Âiв‰Ëeãv"a™â×€ÐVkà „83uX�a®ïó›v \QÁU°¿ óï…´f×ÏqÍæÞ#5¤ `î�ŽŸsç�+…ªÎèºzµqŒ­Áeoä䇇@å�4Ÿ?·H_é¿€©ëÇæÝ ÔyÂûRvàQªžÐ~÷|n§oQ¢Œd�2ú–ý)Ò7† mÆS·íýq×¥Ï= >+8fÿš˜˜¶™÷;ÇÖþ�kiÒ@µª@É?“™o–þ^þc ’þEÒŽÞ³$$CXŒ¢ƒm1î~–Ÿ3ê­µµÔÕ~¡ÊÉãSØëö¥ˆ§Ö”PW°ü ºc]�¶‚óúŸøBÕ{;�ö’ák: wú#ƒ í3|2ñÞÒ�,ˆHk½œÞp~Ž4 Ðd°(p½^“ƒô/Ö̺â}â-�¤ŸÏíL uŒYè/Ïm}7ŽËiãX7l5»ªšûÑþ?ToÁž•ƒœ–ü:Îø(02`¿>TÄ1þçõW0~Àâ9Mv#À/ð2eØ[�-÷÷Ö<,ùô«œcãNЗoë¶7×ìÅ–z4`$>¡Ñe¸Çµ]+¡ý4~×ó?2pG÷ú[³±X¶aØö¾@!µ±.šO2x1(»l»ÜÁÒô‘Þ@âHÁC¼�=÷úÙ¹ùGé §áR�¸gëíd©;*Ò�…ïNvž~ÒxX©b¹< ù@wÑÇy;Á�Iùy À1ßÓy&�­½Öܽf'©…ì²øÌʇsjþ›ƒ-o¸>÷wÆúHðÜ P¶/ð=h^67’Ù…Sïó~ÌOÛñkÍš¨Øþ[µ(ág‹â—x‹]DAŒ l3¶ÅF僀Ø@¡*$GgÔ0?ÝÅ®= 3™ò(߽ˋÇÔhNƆšÈר FÅr·G7¿ Ã�ƒ0{†‰ƒ®“™ Qí>P¶ËBi̹W=컉×l •�”"ÞÊÕ1ˆ’ÐÏ!�Jû¼¨/6ð…z\�ÕW¦MÓwÙ`¡ˆŠtAZZnÇ!ó=œæ2¥*kÒ>:”¢û¾f{8Å3‹!ÇàÎ<”žŒl@`±°�yÛëĉŽX! ùV}–r{ïM?Á=ðôKçî©*!¹§96�§çD où‘\}L¶ÿ‹Q †Š…©= ”›víg"T«'1GŸ¡+†³_À6¼à8ôUâx�œ›ä�`«h%k¿;߇¡8Ôá xºõÍPÕ<óÂ!Û,U�§~fxxXØ!v-^A0±þ�…úK£,¸f-%ɱޠ.2k€à«eØ2ÁD’|‹¬›“¸>-lõ�˜é.ü�îaÛ½M½ÇÌIÅC#ÈÕ#ë”)òàcñ“xh6ËljØ�”¸­(w¬� ÁV–¡Ûðb>Tðâ´x¦þP …(8!«8Ðà3Ù@Ù7q'¹MŠ<ù½äl ïÖi¨a@Þpc™{ô+ Ä”�ɦÕ÷¾’OºÍã÷ë-åq¦Î¦IºÛ˜àʹ¶C@Èø¹#šÎoD€˜…DµyÀVÂ&P& Ç`[�±ôHÀVr~g@鬘a#DÏ ç“86ãXÐÓsYí£"G( 2ú„ôçÊÚñ5ÈY°ì#Zð´pÐç¢l ËŽÍœ�yWŽ ßí‡÷Š4TñìÖf9;ÐM‡l2œR’˜6Î^Yú<¦aõnï ð²…Q²y L]Y‚â#œâ3LÂiZèÜV �dôaYsçd5‡Õ–=‡o�&‘®ø ªþߵѢß4 ¿­\ ‚Šÿsjüò8©F‡6<ÉùËhèÛ”4§›‰RùJM†×:à³y‡¤ÇÙ­X£ýÓáÿy¶-°ˆ=nÆŒ(�–M–<p¡±ÚO·åÈÓ¶uý Ù°øÆôçãW?€Nù¯ñP[áše¡)�®2/¦AQJVb±C. CV‘iH1@ïÐ^Z¦zªæ¨‰¯ænAý"Gñ`Ê_cfä�§§^Ö3œüÚ“&ñ÷˜3Œ•Ñ›¤§Ã>I)©GáîªL¼û\ ÒLÔ)HÈ•éÀè!ÂÓPæÁ’º‹C¤ 7£P.?�…{2¿Þ‡¸þ Åé› ,Õþfè>ú¬ ÑTÞÁCÑ€£Q0Ú7¡Ð)�kÍ(RÛ;B‘ƒG< F¬®œnUÑ·*0ÜGNyÓ„Œ�qÇ#V å¶G$í1…T!³”¶7 J—)š´Jl½�A×ìN‡(™Än9´³n~Fxi©ï­§»ˆã›}ƒ™F¬ç!Ë3Ó™ÁÛäDgV¼…"á}�–Á”žÜò£‹oläßé0šb%çèõ´< -H LfSÆÞvÊ<`‡¥ðjÝc˜´Ql`„•õÔZÁ8 öÍER£*X0õÙ\8øûá::¿¹ªËãñú_iÆñsü®9àç¡@æRòrÈ4aÁè?eXבàj1)6ít¤¤Èæêfô€b`:oã1©�È ¶!!÷¬yæ24ì£íD hÿyö‚0P×Íy­ú³çÔž ò°¾¶Ý€\RŽ#ƒBaïûp+V�Ç÷}ÂŽ=„Û9ÏÃòRd½Üt´ô‹Ï#˜&\€Q£yù÷>}›} �-è¶3 —ß AVŸšèO*+W,„ÝǼpÕä¡’˜€�4iБï-þ2]pn‚˜ ¦ËùŸœ±‡Ù_¬¦yCûü*Ç›�†Á±À5Ja_@#Kã�ÜÀuÉ_gñ:þ ¯Ý´wÌÜÐeÊäTALÙŸòådú:$[�-߃G‚/^vÞ‡;."HÞÁŒ@ó�cyaÞdt9I6Màý.ú£Êðs¿ÞgÆqaq€Ø=÷’:爞Xσ±0Ä�™‘ýÜÊ_�åE2ÆRÙIfn)ÃCOSvZ¹fÜú-H¦Ì�ÝOhdHØË/8•ã°²ùi:¯;¬-lîLÐñ†ìÕ²P¡L‡F¶Ç=Î}žð½Úôyá›m×û©€X ˕�ÐÖ‚Jø0N¢P&Ný3ŠŒÄB kr´�ȹÆ#)äH1(dE-˜Ñ$�˜^2„Ú+Í[œ EÆb·a™ÅJAF–ŽJ9‘¡K‡ ƦÁF¬²S_ï‰ÂƒŒä÷Ž@m¯ž-!S��{4KUª›Ë禆ðÝ2�?ë¯z±Ï<3äŸq 5µ¥ö‹^Åu=]ßuÖ•ØHÄW‚¯ªAļÉt—elzñïµUÙF�kqã:aªò•€6c¶s£<¬uÏ�û4ÙZ„VßM�ušî-¤gwžÊpÍ%?°Ä|LÚùƒþ!0Ãûø~À7ÆUˆŒ/V|a¼ÃbëÈi×y2"…�F-d;m5¾G0üŒ¸þÝbo#LÛR�¾Î“0Öx;c*ÇŸ`N ÿ¡r�û²<>îý›§'Xt[þ¹˜kŒÄ—m¦\Ð8h±W\P%(Œ1Øbú*ÌW<Ç51Q/ʺ„›ôD3~ÎÎY©Í!˜ìÁt–zÅ:j_<èäX = ¢„ àœzuçÚ„ô/L.Ôæº–‡tÑ&±Ó].Xí ³ ǹ�õ¸p¬ÙŒGAëðbvÈËF*%[_>oÞê ˜¨~m ·nd¯Mö±zZð&ý&:lܨvS±Ì pl2FÑÛJÍTÃË]8¥^S°,fUsôZ-WåÂŽ×k½‘ý�êï÷",šÐYÖl ‘N´šÑ‡õ!E­À¹‘I¥±²„Cƒ]¨ã8á’¯\sXrŒBá/ @ü&‡š¹ðL˜a€ãŸÇzÿ7úz[-ø¡/ÆÊ�f[kQˆ ¶6éŠ~†ü9äÙ™q]eØîUÀnõÎ{áž•h`"áÓà1‰ZpËÓa�F£øó_­˜0ôÖLqÙŒBB+ÏãE~\n{r<©Ccœˆ~MÐ4.‹k†A¨#Pµ¹È•ã.{€e ¦‘D¶i6ÐHò̶¶ðp°}T+7"X10BC‹+ïE%‘r«\÷�LHÒÒËÒ48"±Ä<ŸD"‘ Uf8®+€Õžš1P0¯es d÷Q ;Eg«&:ƒ.0[¼GH#BêB8ˆ1€�µ[#5øc' � dSÜ– ¾Nti »R4<‹£Æ>ßâÖïñ2)+¤ãgPm‰'^ª 20÷j›�Fz~ î’OÞ†]e_Ð0ÿÁS^]Ie2ýÄ÷øA¶,…N}Ë7Þð·î¤)Häu§d;rFc¼/7Ñf9xÇàFCúŒ;2èzã„X0£5µ ô°?q8¡øG­ly>˵dZ°e6½i;ÆIr÷FŽ»Ø YµéÔ ^å«<&ò8z±Ÿ÷ð´bÑšyrtó?¸kiŸ=}½Éñ?‰s#U§Œ›2Uë6öR”Z FtiLý•�j§ÿOýñDª‚Û剽[*æ“à÷0gÁÛ‹Y6ËqJ”5·ö\eÆætèíɹ ­ÐíÂ,&o›… {3µàº+4b[ürÀŸCr(]ñžý»‹Â}öš(ð¢uÓ-pä3ûÜ“ä?\N8AŸ»‚ߎˆyNªªëÅkòI6v·V­ ïÍáîò¿ö•8L6а¦Fqu u!-Æ8b!6ƃÔÃ�=CÁP%ÑN®ØóðóEÞn_q~”(Ápè)fqåûŒòv|�ò½_yxåÀ˜ †B*�wƈ2x3Nh(¯‘˜ñ{ˆÂäHÒq™´Ùñìx‚| %ò9â?o?tsÜ9{ïq÷ÑÀþ¨à¯3J!÷Œ€_„ÞW"SØ  €ý7Ô6û^ZÕÙ´SÌ5XÞê’Ê<ñøSðaˆp¢ððÇOC–LÚ{Å Eá~û×�‡K c�÷ŽT'À©Lƒ¤˜Ý8ÙB`d‹ _V‹kñ©õÕdØ¡90‹Ýµ¶ïnà0aúoA;Ü�ö2.Á™|òhCC”»ÚúØÐÙ`®óQ"Lz¶ „Èâ†ò…¨’lhhDŒŒ¯ ð-nT=Qb>jÆŒñ§~ТJ,b�ƯRÂúž0ÐU“-¢ÇC³<˜ÊÜ–hòPÖ$D~ù}×k;÷ÒÂK¶øWÓò™]”qûì¯â@GÉy•ôÌ(/©®É�b0�Êäí‹ÇEv4"(Ò&.´ìÆD„À‡üPÜ8u#ÞI¥QºÆ-à 6°_«šÁÔ£\áP§ØbÃO˜Á h˵¡Ìn£o:ÌãÐâjd^?¯ô솣Âw†vÁC)d"‚ Ƈ|b‡â½iI„Ó3Ó£€x{tL8·°¿û ØëN—ýM +�á`lVË ÇEMƾÏfê3¿Á~èÑcÞ¶«q�XgB/À ›ËT0Þà\aßÏ5Nßðñ¢úã§¶@ƒV<øãf ©O [Ñ™—èÔé9³D&QN–º_kÆ5›/Ê{DK³õâ3MWä>IÜßË<¬@1䢴h»o®eUõj‰g¦Næï£h‰ûݦœº^e ÖúÚEd—ò«•þ÷N<éë\'¬écD;4«ÕûâÇÐçÏÀH´8íÆJëU,‡A®'œÑ�–…¥÷½‘D¿´ã�1-ψúqa­ßÜÓÐÅÏE”W„„àËHX?Fþ…eeÈ로àY`+TpB ðyŽÐB0 öÕƒxÁa}~{=`JšdðP¢i”rˆ%Ê$@ã�rÐuÉIƃ¸-ïQëb�)a¨vCC•™…]kˆ7æƒ×ºáv Á+<» Ïšn¸b[š5ëÚjÔ¦\7çÌì°›tèwXqŸþú½_³·'cx&Q_åÙ±ø¼Ö‡NÅ# 1äàq÷ð¬è ðÄÞHžòKV ñ/@aÅ 'ÕÆ›~…ÜÑØOs‚-m¼Å8¨²ÈÉŠãÆ+¼Ú;üxØ™:ˆ¥‹AZÍ'„s)ZзIû½?õøØ0`¿n{Þ§ÓŒ… 6¶Z‰BbˆAûv0ÇËt^ÇÎøê·â;ÍZ‡�9�I` ”œÜiÆB ë�$4\ B;–à7¤`yå´¸ƒp{ F" XXLaßáßbG2WN>ë—|‡Ùjˆ Ï> *ŽMZ¶¨¹»*²Ér š›Ÿ!e@íŠ S—�º¯ P³‰�Ë>cøT±dòCÊφW ]Xò®‘ 4Øì·x42†/²Q²�+Ø•Dd– Þlì0JZ èZx]^±Å-5nzä£dò òfß:%‰/Ýv®Úâ¥ý,#Çoº£‡Äµ4?}ØøXʃÄt�h�CÚä_v¦�0j«êÛ:J9QeÌú�–Aµküz‘”š*c͈½X]ý º¥—(w$$�ˆ„‹£BÁ&Ö©‘óW=êŒp3øá£`ÓèÖqJ¥Ø<lL¡$C„;.Vmè lµž­x@¡UÂu=/�9+8¾Aû²k›?fM¼²¥Y×&p»Œ°IÁç�Y�˜Øµ bÇÉ Á’X®Ðw03掸ÓÊ„JšíÅ}ÔäÌÊ {µ" ìa2 B²"m†0>_ÕV+ …}7�…xm@KÿÜ©ÍH‰íeÚ©P‚µhr‚ç샘õ–šN`Øî!=A=-ì+y}Qþ¨åûîò¯…ðË-üÙŸáÔ¿ß“ûRAüáÊðßÁ›øp¦‰ðÑœäΜN³:…rØÏYh/©;Q°ÕÄÕ»€@òÚ&”.ÅìåøÖ3ÉŠ­yÐ}$à6¬K.¾¤/†,˜�}ál÷œÇó¶Ã»•ætÚOG¹<ß‘xù¦9ðGBWå“3TH£zö¥»²»?¼ZUo{åË.ùâcXÝËà!BcÇ꟣o;èèr‘Ða‹€,7ŒYM�‚Á‰YÑŒ’Ùm–]“³É¦}”Õ?ø~λ ¼´jܸÆoa«ùV©ƒ5°|§í®lüú—LNŠˆéki–jÖcd†‡re‡X&è�7 ½¡²dÆ St™Ñ‰°bUÎLSY¶sÏ‘ã]Ú�HØG�«e©<ΆT`1``ÀPM™è{ÕŸ=%¾¶èà1‡Ç-"¸¹š�LÐ0£�;YðÚhsE�¢X':Õ ûyðEE‘–)N© )fP1L0jvÄÃ^��*r3hqÙ}Á9‘Ï­[ûÁ1à?êÞZgRÅ‚Ý+FP Ø ¤FR9ÓgŽ?ˆJ®®©:†¬Ñ4¡ç®XÃcާÚú¾Irm,RÞ¥úÉÈ{ G»ù«2Ðç1žè2p•h§V-6BÈ”˜(Wr#ý «„‘± ‘/Ù†,“�üן`Kÿ]h \œrãû2ϲUþËÅ{5à<Œs,`‹‰ÂôýVgÇ~ëÊÌŸ.sh ²µVtw˜ÉÓÄêÑ ²Bó1þè7>ÐÙV¦ó<�·²M‹sêõ{yÂN7­(•£Qa ÅcQ�¢ÖÂ#¹/J7þÜípNql”ã+ã;9&ÎñÒÓfÎIö›FÞ´ÿ•èüÞ{�sšK“R†ñÓžq¼e:¸i¥ ÔÑo3,X‰D�j7OYÞ›iÎ=’%oÞ÷Ýsmàæ“‹·Ë?§èñ|-ë)£T¯W®Ãké~]x~Fj`!8 ¾Þî;òKúÓ�tcÓí#ÇÅu…xÃÿ×34~îÓCH_ûòsÝGnxp^—°ÕÂ3–#Z{켞e7¢Vf„GÛgu£}o­áÝ�‡áj±ÞÛ ê˜¹;EH/á«–KËžù¦›Y¨ê×M[YàÓñ}ÍJ¤œ�dÒDÁÑϧÏFyã?9ç#tÞˆ-ÓóFµ–B2×;\<½Ïžæ}5µÏ“葉©ûgYZcÃ�3Q±�oŠmÌäO…šQÝ ù5E¾'Q‰—„^Tfõ¾Vìy+\¬ž²›ëµ:iïÖ´^¦œëH„ �‚‰ï/úӣ$CS!M ðD;v†=�^ãÒ3S»僉1zŸô}žD$Ó£!®z–-×ïê\¢0Cìò­qº ø,·Ÿû_ãnéèÑè镸bÜ¥Y=} Ñá5E!Ù�.aÆüsx ½W°3¹åÁ#�ÊÔÿ4“åhðäg³'ïýô 0cÕÎ*=•"A{_ìä#_ÍœßîøEð{­Kúëvª0˜ÆHX3ü´û®w 3Lª^7mù¯?”#åkœ6ý2L_÷÷PEê­ªÛÁ̳h�èö4@‘¶7(£Þl„s'¡ãq¡òä§‘´Qµ‡ÐFL�ÃtgmÙ˜øs+‡ijwUCJX®äf´GDÓðsáÀü7Èw×$òU_°Pžféºß 85.p$�‘ÜÅH¤GÍA4Ö@UÍ· •ë6;r°žƒý›¦á|�c¨f1�´9(Õ|¯'™}üV+Å,¾`±/c�¶éeéFj�c�v±NÌQ§–¦oœÃz2Eyð6ÉÓ#ì|ºÊ¸A2&~<ÅÎçwPF€‘!&iiÊYaëäÑÔ]®œ@Ö—â1/@ŒhCüdë£Ä£Àü –ÎZ¤@NÙyŒ×ïb6�ûs`=Š5/5X^äŽæ(€ø˜{ùBÓh(¡yx­sÕã×l±ËLEÀàð?F�¯À®FüYQÝטãŽ*„+28²©¨lÐyVÂ![\†lÄ�Âe_�ÆÁ2¤Š½c'?'„,¿àSÅÁh‘ô&5çãcbÆŠñÒõÿ¿ñ컯Ù�ÇÜÝÌž2»Ì ®õ6¤õ«†´åî d‡"¤¢ÕJ55¤ŸUèxÀž¡ÔÙÜtNI”½Ç]d4FMÓå7ÌH”B Ï‘Á`Y×ñ ö¾�êÈJÒþ bú®5d娞ð®\ô#ˆb³ˆ¢¶ÔFÑ8Ò�‹äí* ³`C€Ñ`ã<&ÎCèÚ ô !cúúé‡Û5ï,Æ^¡ŒpÄEÐç@Yïà,ñI  áô)�^€MÊ1L“F*‚º Ž[éŒtàÚda”9¸EÏÃ4Fñx‡=ႆ|äú¨7nC›…FøpkhŒÂUר·‰>®Uc—´eÁÇž#W† yI� ³aY¡ Çs`&Ò Á€kÊ“Ÿe°­QZ�yn£·Tά“�CI~\�‘~ð0ý…éüÜc³’È&ͬx4Ñlæ9:Tk™æVpöº- 5ËÂѺa8€ëƒQV ò #"&«“*Q㋇”hEN„E&ééWä)’#ÝäœGx˜V÷Þ /º�ÙWÅÅ láÚ^ÖbâhóÛVç$øÿÜ0@ÃLL1%«!qÓ‘‘‚VŸU¯9•Ø©ËVŠ2}E$ÔÚê.r8K&î™ ºú»C�ªLD²3±(/&Öd)8*¥Pæ&+P�¡˜ˆfx:i¢\Õƒ²©9ŸJ»àF¡õù½ù®(Tœ ùøyý]ü§ê Mìkn¶.ÎmX;fÍé·I±O1Bk”á-ƃaófÚ0GG`@(Ø–æÁpÀ™:èØ<#�{$Lˆ¯NÄE±cB´F ÀKq·çÎ5•e³Æ†™ENV¢OŠÀž…eP‘�sÝ2¤ž³ðc¦É_ÙMÇuT¿›<36üwêðкRå³6 Y¦UiÅ9­@œ¡µò3yÚ ÉÁ¾gš?6~D?àâ=ïáDaÓ›ÖMׯ0ä9+|Úio‘ÄX½KTÎøk&ûÀQ3yFq(G×b~=)¸�:ªÜSì$…6<í>"u?sÌý{dïÅó—†`ƒ‰Âåˆ ïÅâ‰f.´™¶ÅÛPÔçÕÌHxÏd0Ž&þ–oŒUýVŽdG†;Ý�(|{B¿"Ì t?X ‰© §˜–ä÷².Р¬±­ùµ7S±– ‚Ä‚‚ó'¥E�$î²S#˜øeÏ1Þ‹C"õX’â|%ªjuÏz1på1ÉñÕ•ÒchÀ"ª¤FvGõ¯„7“ßQ† Çùq¯k�ôÃôä«6�9,0 ëÁlLÌΉôLš«ç7Ãyéà’[÷Ês±õ„È[74€€…›v>õµ“!³}Cûƒ@ø¶øÛ¬~WCQß¡‚”¥�t=¿ 6½çZƒ¶AÍàÜ‹h®Î(Éý’CH—-gñŸ]ÑìÈIƒ"-Ñj'i”>†Iz½iÁGÜņ&J `‹F:NÁç ƒÉºD Î'"yâa«ƒœxïÏXû3ÎCãXaâñ]]˜÷x%êŽ"Àΰ ‹$J¬Êlm�ŽL†TŤ”3 Û3Xv>b’Ëœ® H�%z‡ �c%ñ üÇn¡ëÄpñÿáO¤ü-´�v³Õ5Ïšìé�ºá1Ë>oý¹MU·dApaÂéH‡LYU$™#+«ÓsøS!úGw}â5�S4x¥%WÃMÝjåB�de——×TÙ£mp¯e¸ûNÌüK‚H.\)GúCœšwÕˆ>1×ϼìOJÖ³a›Õÿ£\àíëÌ?éŽlRŽøv÷¥S5šç‘ô m‘§H)Ø ÈÁ‡nHm€&$>ÿއ6EùO— @Ž‚�p�2�B2ž_)8Œ‰Q�8pœ‰ðoÂ`p¸XñѦŧ½Ýº½cÜ{ƒË~¡Æ$yÀ¡ÛrÏø7ÃDô¸ú¼epaìÆ+ˆµµy㑸Qáà (*ð\ ¢ C'°b}F%ã�ÞPäãœÖ'Y¬$èô�ÝGœ¦×ÀËg±jgQŒgö“tÎ6[ øÞ7êÇJøöŸ¸æí³w˜be‚�Ûœ� oa�ýD�ŽÍºG˜À�H4!1Ã"ºáïÖërÀ²êé`šP† ·¤Ö.` ’é¿o´Ž¨„hò Fš®HKoÁéÛ5à:ovþYÿS}×ûGM™¶#­©¼´E·&{ÿ·À…•žüŽD4{ÛÝ1ÅÅP?`Â/q|-6F~F/ã †Þ‰T„Ð1�¡ YŸæ ãL÷vÕû[»|¢AH¹ Yh]ÞQáÛÍ4¸FQ8OÇRXbá�A0áÑŽ"o¨-þ1kö©Ï»ƒl E±™g6"Z‚��Žèñ¹œìÅíÔÐÃNrô5…X­6¸<3ûƒá¶è¯Fˆ–ŽÜGf3Šƒ!Ž/‘\¤˜«¤s ˆÇ˜ÔP?�ZÐD–_åÊ+šÌgÓËÆJuÌèÛÃC,^²˜”jN[& ^Ë)Œ*Ìãç'ÑçÙ/S$•ê‡Ú\ެ&a!:×2ÍÏ5.g}ðÜ=ØòÝœ¿hí$™2e3Ä#˜twJj‘ÕÎ.øTë¾ 2éœÎ1&{Ñ��ïJŒ?Ÿ;»7wµ1ĤåNÕÞV>)Ó9º»(Ù´ñ#Ü–¢õ«Óö—'¹%RŸú�ž¾µ�n]éºÒKø¶§#«¸ñ³‘².ùomê´¼òÖÒž…þÅ |Žóïêh’ÍÔ1ï/僋¸ØÔ÷úëòbÝ,Vè€~ù÷Ûuykû[âU¨½[ô¼�V&`Cÿ.T”õ L!˜óñæuoaÞž‹v42\\œ!Ðð�½“T N�wWärþ¾‡þ:¡ã%ö;Þ?gÜ€�úï „Åþ9tˆÐÏñ`Ï®„$׈º%)±Gà`€þSàÄÚ€ÇF”Â<É­Ê,¸¦?ÛÆQÍU^(Øð˜") ("­PPÆá|Ø�ÀMáõÀÞk`› 4)—©ÁAlpÿõLл£Ä?!š#­TTòSœ K% V¸àò2(%jGJƒ 0¤Btÿ³^O&¡€î˜Ý> B9È çf8å‚" W¡·ÖÆäjw“þõÑo™åž˜pç׈Ñܰݢ‰Ørfj¬°T…ý|ìP_¤dÅ©T,M¡^Ö¸¢Ó)H$1+e¡¹ïþnYá7Ä@Ã&ý ;Bfø(ÿK‚w]iJ5壾ŸŠ6#‘Á�¼òÿ‡pqÌxö#�ü ÄJaÆ›cn$1Bhá;¾ÛŽ¥³Ù±Œ5Ñײì¬D[EœÇVg¡œÄó"¸»�öíJA²AU‘u³³L8ÖÈ-ŒÊµºnrG“4 ɸT Ñjæ̬҅ì6û¿6ÁJï±¢ºäá)‘ i”ÈBÃ(Váj€ö…{Ñ…Qt!®ÙXeâ)—îÒE»Ìe;µD]:aCƒéÛÄÞˆ“cŸÍNx!ŠW,=5L•4|› ub�T´^í(ÅÕ`s)"¨0‰wtp¦p8[XœaT±�Ä[ãüC�ðoöýÙ|gwµ%W~ªÂþ[£R,¯Á™ú3-å°HZüߘ҉á“7O²ÆÓ÷“ÎÆ›zœ”Üœƒ?'óKJvw×KàP(øÝeœ•è^xÕmK¿ÖÈ™ƒð‡ç¼ü4±yì„"\1hñTÃÎ$A‰`°‹sb<î· ŽêøÕWwÂø;Åð±õ”†/…ÄK‹?xcÖÐË{â^i q¦¶89à÷‚¾BîHà{g#„±¶x„6B¼˜…x»­ð'“u¤6ÈÈh„®#ƒ�Œø@OÏšÒðË}óÞÌÀܰ}ò€~}¦hñ–fó(§Ê—®*ubç—��±²5B+v£|'ˆ 7�íÄäÛ‚ˆ8—RqF€ûµÆ×7ê-d!ÌpgÐp/ ,\³ŠŒ·Ë!²^Ow„ èøE‚ž*˜écšÃ›ÉãX'Í  ƒ£­nþ¡ w4ˆìÒAD�sVªnú –#Çñ,cL=Œð%il¥tDkð�Ü�2\ØQ=‘Ü×Îà O–ù<ƒÆ$Œdh A¿EáôV*‡jm²ò]W¸!÷¬tŸ§>pœrÈušÚ'Ó.6„²áŒë2mŠBVF<%D¡Aøh 8 .Å.«.K­¤ÏŠÄv>‹}:’§ÖÍ<‹ 4¾Ö¢ã¼EßH¢É·”ŒSâØ»á!#¶Ä Š8%’ç«çõ±e�ûz—¿½A§k^Ù£ÊoRâ¨f``˜‘ÁÀºBƽػÙ3ÅQ© Š?d(|ó:=“Û l#‰¼c,0[×$ dY}ƒ0À¨è ÓaÁTÑ (Põƒ�Y'o@Õ ¯C/Œ¸!‘f5õ÷£Z àlèoúa­‚#0X\+>IlE,lší øƒñxß�‘oÁcÃ|3>¹†³2ïüÀ–1‚ûìI£íƒôþ‹…ƒã¢×Ô"?‘òlå’’ò-_fQWZôŸí5ˆÑoÈ< È^Hξ¼°-Ã…Iô±®zˆX‚+…÷ʨ¬ùBˆ7‚¬,¬›–ô­òd$…”2;黇6âpXNú¨R³æ(26°nTÍñr¼bcÃÃ@¼ŽøÇs‰Ç¹¨ŽV=Iã꺯Zô#铬»<›ySÔ•ª „WÒp^ÂùiÈHHd‚y¤ C.[(ïíkÍó9àÔÃï�»öÃËêz}�Ïúo’ì"»Ÿ‘³}:Ï;=9©÷:�F¨ìI?ÚõÁ(ó½'ÖPjË… ß8§B¼±¦~ñô¬®Ï \ð>£íì„6|ãåˆÓH&Ç�KÏø~p£™�ksä†Mž|œóÍOìŽ_ᯘç%è]K&“Ê7à½ê�2¤%<ª™d4Æ…ûÔó�î—«²Ö¼-GâÊOJ;©½¼ÖÚ<›©‹õ¾cØ<ðzXÁŽ& y@Ä!Š·,öM·É!·Gf=ᣱä%¤&=Ú£üßUçf«ï>™m²i™0'ÓAÂnþØ�ž×¢ø¬ˆA†•šHÐÈ]8è2&xÄ94Á¹�ö¬Y$ÜYˆ¼Ã¥]5½àçƒÕd[IœFÓ ´Bfžv”“Ti¹gôègèLañ=-6Èa‚Q÷6˜ãˆÑ/‚>\A$D5Ýø01·>¶È.TƒL×!ÔF6P8  q(ºÍf®ÇY솔Çc×®G „ÍÊÖíMšŠ·ªá¶ 1ÁÅ$l%ð/�’T5Ô{@ˆ0›xKUžä~Ðc¦ë´ì$4 �žÖdkÒЫ·ôï“«m' 6Oœc…dùß³ã, x!\äH›¹úAñ&]'C+àL|ñÁ‹ ú ¨ýéƒzA��PÿÈÍ´îÆM‹‚2>`F7ÁéCœRi¬ªA–·»#8Á6LœÃ²Ëò¨añ它0ÐDA)üIÀî<¾‹îGê7Æñ}ö�(ó²ØÁÜ6;5‹þLž°í¤üÁ÷f0VorÏ*7o¬}ÅS›uS >Uë9’a« ˜â²ÂÒñùòJû®ô1gçÓ e%^çß  ² ¯„(·" Å�<ž2Îa´ü¡ôæs²Px~9Jº(F q‡bZA@†ÏÀQm“ B?™ÇˆüÎÙi¬ÇXHÙ·'S1OÜG£©|xÅS"E —4ca™ÕmÑAN}�cŽ¥¡Cr䤾/(kSÙqà �¸^Jœ’–;n wNØΈ~¼î­Ò)û†Ÿ94Â�S§MǼŠã€äô#NÄŽ¶só=ƒ�Œ?÷,Û]È3bqÜÒe¬ÂÁÅi sÀÚ1|J„øÂ‰F:¶üÛdÂ"ö’ƳoÖz�¥^xt$åîÎCvzÚµnÙåÁT?1HÊFmÙ«ºÕ!›Ù·ÑÎögH—B ì}_ÛjÒ¯£cËÎéÕ"6²l}àñž%s+J®È¶É�sW`AÜ ˆù¡�ÑŸ0o~Ts¯÷‚œÇ£E¼(9ѾÍ\H¼`8„ßMûÁ¼“è šX†þôx¿ˆ²µˆ�ê­ò¬>­5 ³€¬GŤå|Sçt.WÌšçðÏ2S°KOh³w’ª‚`=)»T؂陡÷aåúÏ>y¦Y°øVã5)b££(Ä^õAô¦7û]ö@Œ–[Л8NV‰—aXôÖ«u¡`m¤§ºâYÞÞSþý. Óvpi°¸Úó›{ð§ŠÍWÝeùë?%“ðw#{·Z½àº©]ääûi‹ÝÖ‚ ð˜–üî?[å‚+ÝàÚ6©‡=öJ}fˆ0¤˜¶‚ðo)È?¸Yoóĺ?Ó ¢]Šòx•âxÀ¿Ò.¢¬EoŸÌE¥é ‘#ýþÃF¥^ˆ—¢1cûžèœTb§Ý¶Æc™w�ƒúoËr"Ñ+§�vÐ-MÌh]êDí¥v`Œ±�iyÉ÷•ÂüC b1q¡ŸYGÜ�òBnð±ŽVYQe~ã‰ÏŒz®Gi›ß‰ÑÛà–<'î.¸oÔ#¡°ÔÜÛÖN1»²Y ‰»N)Á4l3¡àïJƒ„®øU·î �½ ‰%2RÑ^ €@fîfXLF„Ùe-¬jóe0…ޤˆÚUŸù^EŽ‚EûzîGÒ£¢)8m¿QÛØÏ¹åÿŽ9šødJk$QœŸÈ¦FzØA‚;_.Ĩþå<A¾&6[jà¶ý&|ZÜyKr·nåX¤0ËqúçdCY Ï]C÷H=7 NSyo;z(áñQ¤EdÇ [„e©±[WRÈD ÇôÝëèjáž”’¨�Ñôü¿ôæuù‚£´µò9ç%+�M™(%¦"ë=—ös&&ìè*�²mœŒ°‰”ªâF±Ô}$Ì9P�‡ýŸ2-çünXhøßÝ7Œ- ä¹âxÚƒX”Fâ!såóÖ¾7 :¤è+ù ê‹Ò–�«Ð•@ä°Ä0T¼"£ �uÄñPÞ-^ùç`…±Ö.åÈU¢°oBŠƒ‚À>e‡¡{$cd¾_(ï¾:ãÒ>߉º¹z¡8îѶ‰9=qqç—¯xö6ÂNšEÒG©½âJΔÉÁZ·ŒdêC «`LcØò Ð}^9À=ØãÀt Ò™9Ù»_Œ3ÙKÙ¿Ø×@±¥–�;ÞàTãž²|&¥\ÇS“«ÉÉ „GFz‚¹Þ ”0�IòY‹Æßá |aöŠÂUG¦7´ÒoVõ\…F*WXÍ\´©‘,YÐg5Ò ª2 UeR—róÎãK¢Q¦qJF8ž*Ö{Ï–ÄRf<çg²‰v€³¬ù>tÞ+®š Ä^Šw͔씙$ÇØÌ†þÇèao¸Œ:¡æ¼íýl÷ÚAy$è óÒ™ÍÚ˼33cåW\òÇå6 �#Ÿú«ó`FùxhYma'¼F¤gq¿ÞÒ[•ÌËsû·¢HܱåùÏÕÚö°³Ýãϯ9Ÿ=ßIÜÑ4rï9þì$f­åÃ’7ì æøùXÜø¹‡I¹É±ÆÈ$ß[«Ú&È:U½~|ÊÁ•^ß`Ç#ÖÇb-±™‚�«Ôë{•pò½¼C£xywxÉùÎB@�ZUáÐèK¹¢)ƒ2ìc�Œx”œ#ü ¸ ìðge„¥Ú•u"`8í*gÌÃ׸ígb™©=£"Wx`a’»ëK<�å Xñ–öNCœ~î ´Eí 8Ð3‹¹6]·Ôßg£Q¬` åG,3ÄptP�ÑÃ8ä”#„顱@ňb+³Àhh…—���2ÛU÷ ȶ0Ù '*‰�yi�IRø•vø•lPßBíX9kµM[šÐí¤äYa‘÷üçËö‘µ ¤¾ˆùŸK7„?Q 0AÄ’< 8;q•!š!ÅŽ-î:õIÌs:È<@^È|4†îcÑDZ¯xý¢ï2ˆ�Ò ^.Y³îª‘‹ÀÒÿÂÉÁÿÕÓÚõÁ‹žþ’ò„X¨ºB¢¦Ãg-=ämA…6i-n*Ù»£V£™«�C­ÇMŒÐ=l‚‘3Qžî⸂…¼Âæâo’sOAÉK€àÅ™Ò2y�˜*• „Ùʊׅ؃ßÉ÷¥Y²W9¢Ï¦½§ÖfãLŒ­ œB쿘}%Ϙ^ŒìpU³¿ùäå¤,Á„$Ì�É1¿Tá¥ÞlPæb‚±ˆ0Fƒ.¸“ ÒŸ­Óz‘ ¥C¢@à€ÀÅiƘ:i‡?Êo3†!TfÎv¹�¾œ/x>#˜±ÜòTK`ã/‰ãøéÈÏ�Õ¾ü-XÅÄ ïˆ ç^AÍöä¿èø›}d3f¥ï¼Ñk¬Ò½’E™'âHc‹×݉‡�µiQÂK-¬,*lªT“¶·?/kóD~SKÇwÄ-äÿz=?sUÇ^)r‡Ômp|ö-Ѳ…<¹&Ù¨�I„&B¤ØR¹=Á€Nõ=fî¶%vWQá6iä;ùg#þœ™Ñ°®Ûº9îZÇ1UÝÝíy²…,2Š÷ÆÖÏ×õÀLpÜ*��ãL­Äábü¨àlà&žá®#‚…2aXƒÿØidÖï)¿ÏÃÈï!ù ¶Ö½Ë¾Í÷’‹¶4Ì5–r6ƒãÎXã4ñ ²~t–:‹†½"Þ�PæadΨdä£]§ã‰Œ¾šÊYâ·[šÉs.Tm·Ú¸¶‡Éíþ÷$×�.{žÊ:î<)Ò„Öö¤IYrÉï[­¸rmäxJQ ‹5íy©+0ä@…‘>�\E<Êñ¼e_+/{ØGÆd�£¯{¬ÑëìbàÒ9GYæ !‡ÒÁÉàÆE ]Ÿ¹oŠP)½ø'Å5ïv/&+-‘c&È·<´ Ã@UuFâ®.�œ ÊPlíŽÁG)‘çºdHˆéÔ÷fXÓZ‰ë2»6‘Ô³XM+ý¤r‚(!ìt×(¥ß¼ËzÂaŸ®ipÕXä°ë‚†Sp=æâN) OÏsÕ§€ekh‚hçj»;Zƒ�zÇê‘@À¡V åâ–ÍLk&'Â[¯¹``œ ÂA€Áu—òç¿ÌÌÄqþÞr¬å$ßhv?ÂV�dl)Þ‚‘–\ÍäWŸ´»ý‘å¶Ð}›qÛ`@Þˆðhø�À´š2±ï¹så{ÂBÏà`½81Ï~`õÌíÀG€ûó~®½Í<¿–�¬7K‚=ùAäË„±Š$ž KÖ‰ú³ò{E~¯©¬¡ä€ÉÚ ô MÜzÁ‚hT¯ÐÎ8#÷8!´ØÓ‡�C³™ ·?�4Þ”ü3Ç£7†#À&²1ç|µÇðO‚Ý8Ä™÷ßq�‡ÙÀNÄoûÆq+¡¬°¿FÆ@ ÃCJ¸D}0~Ø‘9#ÁHVô Œò�]öįFŽ9!ˆ��Ræ.…ñˆ£'ùÔØ¸®"�dc£ð2ÈuÐâÇ<1ÛÜE]0‘Xî}$xÐÌFž>T¿LÕô“:ážÇ[©¾È 0jÛÍö †z€W›„3ÏcK(™iÔ àöx¬e4 9¿Ã¼¸,ï8q Ÿ&ÌyfB†™$qÿϯd!¾KÞ×éÝð³î‘?œHçœG ¶à\W ÉKèC!üNÆ1{OiºEâ±Fd™&B‘‹s¶¡%KÝùuÇf›ÖFDÓÙëÃW�dÛÉDÅ;Õöº‚ÁaõF$¢H#~lÓi'cÍŒñǃ·‰¶À1\ÚŒÜ5Ö›5Õqg«Ó zŸ-‚»ñá:ôìçË¿�zh7ÚÏ“Ú)·¹¸/CO®/ÁàR�d¨Öñ¡�}Ð΄h.èØ µcñ"èpv0G€ä1¾h�,bïàκîÊH%äh8pL3+’ÞFÙ*0h ‰–²òyÉ’®™2ݯˆ¤LΠÍÅ©IÍXÂÐõ¦M›¨¶é5ùIùC7®Ý»,eȤ˿EËNV±ä™ïò)²ÀĦ½í¢bodÈýVcæ!‘ï5C„…€D ×¥‘9rCŽMYTG1õm `—¸ ]Ì÷¢ÓgðÍ©Úéž9gäø{Š�×;Sf¶ˆ!´ÆÇrÛj‘3ØvÜ�ƒï‚ì ¤÷šðgH�2XÇ�#ÆÑ+�k-!5\¯(ûOèô®Ç3ç›~(ÆìcÀ̓Äb‡º-íD�Gˆ±ßZ}×3o 5™š hqE„B”ÈÀš*¦+”v­»é¼@Ì ”Æ´±O ]Ï´.»Þ¸{xcÎÎkL´jhç,ÑÉ Ú1‡ºdψ‡¥¾¯o]É'»Òoþê›0É=ë-СñSs—Šf@iá;yRE7r¬Ðê¦EÒsUG§ Õ!3׈­y²Y¨N�ÈÃ"bÀÄt‰´f‘àL7d"¥uŠý'�ˆÂHI1Ûãœ(ç.¬.IÊ–v‚|qXV_!DjAüwaô2PDQ!Á—j·Z|–fæ¿u»¦]i˘FZšµŒááðñW%ûíí¹¸Ù!mŠ]'Ica| FÐP^W!s¦r×kÛ¬±Ä…y6j”žðWM“”¬�½“RaÈôöKç·ë±U}ÖXcÊ ºF4ù›œ4¶Ûv&Òˆ ™1“p«®3}dS‡hJ&ò|w7ÛÍúiS‚1a¸`…h~ ßÇÑ©`¸Ò¡ÄøŽhߣ×>ˆtrw}=~\ªGçêóÉþ�ÑAûÞŸª|eñhؾÛaý“MfÛÆ›>¹Mˆ†âO‡kšãï>82lóæ �@áÊ™Á™ `ò*Êb݆d g²Ä 3ž=®º¿=�q«.[63a¬¸Øì{\¥9@!‹ ©?›}‚oÇÒcÊ Äx.`ºŒýÏ«íÒzs7¢½Î' hü*dq,pà©ËÛëÿ~ŽFÈÑžŒ@ªhJ×/ÀxðÄücÿ‡ê(prtÏ„ÔaŽìq¢uׯ�è‡Qþ˜ON£º�à¡4�hŸ÷ܺžZ¾ø¨2TÌ¢`Âa�ßž¢ Î9‰ÜE @Ђf•H(Å!IîB—Øg|L F¾ê¾iðX@°À‰Á±½.i™¢QT,ÐøÌà‡$q@EúP#ûëàDk5þ*3î_WEZ¬j¼?üÓÝ×®ħNëò_ÙúßòGÀçÏêÇ×ëéÄ;Œ K“Kœ)šgùô¡®ªÿïû«±í²*a¡}9‰ƒS’éi•½%˜73Š‚ë²5JCÔv. ‚4_ ʇN±y¬ñÂPSÊʰ©c."£¸�¹­°ÓÆ*nâ_Šâtm {E`T‰B)Tjgw1) kI¹ $‹6QµsJÍÒíåÊ{~ÂòéWKeÊèå7T‘Q &U“ãI5ÙC²Ùm‘ׄºZey—wsr=ÛØk�Ò£)ÝG15�Jñ¢öòvËuÂÑNÏ»�Ʀ]‘Kl�…±5^¬@òDéBj’vŠÃ]ñ½ðF’jò�È䄼\'Q5>ˆ“óéÿ 'ã_=ú€ý}Ô¬‰8j9 kÑ© �½fá ª2yC̽)âD¦�~ˆká4Á¶ãE¡=j¡åUõEí÷mú^Ѽ(øó;è…yÕXù½Ú­!ÏU΃‰5íÊçÁ�x,{�Ó÷ö½Ê�+˜ ß”�¡´g Œ÷ì;›tª�—v4&eŸFF†B)ýÈ*’-( ¼fæ‡æ�L©ø ¥ÀacÕ$€>Õ›ÝP¼äs–~­¶×£ö¯œ¨‰f$8M ÀRU`��0 Z˜Ýhp%G—ÐHŸ}&$¶ ŠkéîDV9×ι½�sC=ǹ]ìൕÛ�À9êÛÁ“�à| 7惌ìyÙ¸Æq³aã ‰*4'“ð )$h:Ow :ÔžKœ tÛ!°oag�wš2òcƒ”‡!Ø9Á¥²+èÎ�Ž o±ÐÅÌlLGg–ÅÅ_˜_à Îÿ+­yèa®f¬sl¾,Ø ?f°˜ÎËoÊhŒêYÍ&u ¤Å�S‡•ùoTW‹È”ZhØ¿‚?èÜðUŽ`ÿ]‰÷+Qý™÷?ÑØ�qµ;³aÊ?¼ð!ál€É°A¬8|úÌ_›Û¨Þ^12ýݾ£TÞØ»õ,Í¡Ò}d¾z3ò|Bo§îSØüŒãÒx?v>_ž6ù|·Ÿ¾X—ƳkXo$¿`§Òº€œæ�PȰ…Dˆx2pÅ‘¶�Î`³¥pÇʬP!,Ê�×�½–Fí7%zë3Ï™ï-náöyo�5žÐö'Hé^¹Wj\z24xa�e ׯÞè�'…Û"USšò}yFçñƒô]p$B‘rl”L CÌtì| ÑòdÕ®�ˆ�7~ǽ[P9¨ý©P.×!8†‚á×}5b›rT'�¨º¼EéÃþ�²<©J7ž,C†l(lobCN<Ê•‰‚zÔÈÌÞ/A| eÃà œp/å€@h}ÉæFl ص©Ôm‡:< ý �ô÷»ûé®øåºª]\™LÐ6RǤ›ðy2|I9I^œxVQ”úPFÌø»UôÝŸü§�9gBô]q×V8ç÷_•+³(Ë�Ö}�níjùœKàlÀ‘c8Ë»œ& ‡@;+ÏÖpsy±Çóh %ó™0!43ŠÙ�cfµ˜ÕåPlPbN Ä×Ù&“ëž0–Ç…ÖtV\%/¾Óy‡ÄÖ½iYÙ�ŒPê�µéoc}¸¼8Ô‹6•2œÁ&é)†àRÚH+…*œ�Þ¾PO£l7O;ç ¯r+DŒ±óò0=Á–Æ—¼äz³×®Åy â(G8wEäÆïKPï�39=iXÇT{UŠºm¦u¼øø |\È™+0U�*·Í'V—¯Õ7]ëï‰D�ìѺ½œD6þ1É©¹ ›°™Røº1ç3žŒºà±Zæ `7{%`tõàUoÒÐ û�w & zÍúQï(»´$Áþ—KkÞèhâ !™ë¹—Í”dëž/ ¸‚Â]2×ÊÁujƒÙøù‘Ò¸�L#( EL&cPwOˆ!:Ö1J�õÅœ$…gD1`Bºš�½Îw­|4WBx!®RõÕ äµéÁKy$äÜm-ƾÞ^úù˜ìÀ´¹íÍõˆ–hÆþï]³™qÿÏ\¼�D5§J¯>g¸AäÕ(5þeLöåh;tæ ²ùÔVR°~ý~Yäæi*8m�Bg¤Ã*=TBÌÒD)ö[ÄæY JÉ� .*<œsÀlj¬ÿ¢\º,íRW·Ó”ís´ãËÙ±&þ/õ[jÜJ¤~�…ð1¹�¥Ã§6‚cÍ�ûPö—ƵJu¢Åí„6TYôŒ¼zÂ